ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDZlY2ViMzkuLjU4M2E0ODUgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjgsNiArMjgsMTAgQEAKIGJ1aWxkCiBidWlsZDMyCiBkYnVpbGQKK3JidWlsZAordmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vY29kZWdlbl92a3RyYWNlX3V0aWxzCit2a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS9jb2RlZ2VuCit2a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92dWxrYW4vY29kZWdlbl91dGlscwogZXh0ZXJuYWwKICouY29uZmlnCiAqLmNyZWF0b3IKZGlmZiAtLWdpdCBhL0JVSUxELm1kIGIvQlVJTEQubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOThhYTkuLjAwMDAwMDAKLS0tIGEvQlVJTEQubWQKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotIyBCdWlsZCBJbnN0cnVjdGlvbnMKLVRoaXMgZG9jdW1lbnQgY29udGFpbnMgdGhlIGluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgdGhpcyByZXBvc2l0b3J5IG9uIExpbnV4IGFuZCBXaW5kb3dzLgotCi1UaGlzIHJlcG9zaXRvcnkgZG9lcyBub3QgY29udGFpbiBhIFZ1bGthbi1jYXBhYmxlIGRyaXZlci4KLUJlZm9yZSBwcm9jZWVkaW5nLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBvYnRhaW4gYSBWdWxrYW4gZHJpdmVyIGZyb20geW91ciBncmFwaGljcyBoYXJkd2FyZSB2ZW5kb3IKLWFuZCBpbnN0YWxsIGl0LgotCi1Ob3RlOiBUaGUgc2FtcGxlIFZ1bGthbiBJbnRlbCBkcml2ZXIgZm9yIExpbnV4IChJQ0QpIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygb3RoZXIgZHJpdmVyIG9wdGlvbnMgZnJvbSBJbnRlbC4KLVRoaXMgZHJpdmVyIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBbVnVsa2FuVG9vbHMgcmVwb10oaHR0cHM6Ly9naXRodWIuY29tL0x1bmFyRy9WdWxrYW5Ub29scykuCi1GdXJ0aGVyIGluc3RydWN0aW9ucyByZWdhcmRpbmcgdGhpcyBJQ0QgYXJlIGF2YWlsYWJsZSB0aGVyZS4KLQotIyMgQ29udHJpYnV0aW5nCi0KLUlmIHlvdSBpbnRlbmQgdG8gY29udHJpYnV0ZSwgdGhlIHByZWZlcnJlZCB3b3JrIGZsb3cgaXMgZm9yIHlvdSB0byBkZXZlbG9wIHlvdXIgY29udHJpYnV0aW9uCi1pbiBhIGZvcmsgb2YgdGhpcyByZXBvIGluIHlvdXIgR2l0SHViIGFjY291bnQgYW5kIHRoZW4gc3VibWl0IGEgcHVsbCByZXF1ZXN0LgotUGxlYXNlIHNlZSB0aGUgW0NPTlRSSUJVVElOR10oQ09OVFJJQlVUSU5HLm1kKSBmaWxlIGluIHRoaXMgcmVzcG9zaXRvcnkgZm9yIG1vcmUgZGV0YWlscy4KLQotIyMgR2l0IHRoZSBCaXRzCi0KLVRvIGNyZWF0ZSB5b3VyIGxvY2FsIGdpdCByZXBvc2l0b3J5OgotYGBgCi1naXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycyAKLWBgYAotCi0jIyBMaW51eCBCdWlsZAotCi1UaGUgYnVpbGQgcHJvY2VzcyB1c2VzIENNYWtlIHRvIGdlbmVyYXRlIG1ha2VmaWxlcyBmb3IgdGhpcyBwcm9qZWN0LgotVGhlIGJ1aWxkIGdlbmVyYXRlcyB0aGUgbG9hZGVyLCBsYXllcnMsIGFuZCB0ZXN0cy4KLQotVGhpcyByZXBvIGhhcyBiZWVuIGJ1aWx0IGFuZCB0ZXN0ZWQgb24gVWJ1bnR1IDE0LjA0LjMgTFRTLCAxNC4xMCwgMTUuMDQsIDE1LjEwLCBhbmQgMTYuMDQgTFRTLgotSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCB0byB1c2UgaXQgb24gb3RoZXIgTGludXggZGlzdHJvcy4KLQotVGhlc2UgcGFja2FnZXMgYXJlIG5lZWRlZCB0byBidWlsZCB0aGlzIHJlcG9zaXRvcnk6IAotYGBgCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCBnaXQgY21ha2UgYnVpbGQtZXNzZW50aWFsIGJpc29uIGxpYngxMS1kZXYgbGlieGNiMS1kZXYgbGlieGtiY29tbW9uLWRldgotYGBgCi0KLUV4YW1wbGUgZGVidWcgYnVpbGQgKE5vdGUgdGhhdCB0aGUgdXBkYXRlXF9leHRlcm5hbFxfc291cmNlcyBzY3JpcHQgdXNlZCBiZWxvdyBidWlsZHMgZXh0ZXJuYWwgdG9vbHMgaW50byBwcmVkZWZpbmVkIGxvY2F0aW9ucy4gU2VlICoqTG9hZGVyIGFuZCBWYWxpZGF0aW9uIExheWVyIERlcGVuZGVuY2llcyoqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBvdGhlciBvcHRpb25zKToKLWBgYAotY2QgVnVsa2FuLUxvYWRlckFuZFZhbGlkYXRpb25MYXllcnMgICMgY2QgdG8gdGhlIHJvb3Qgb2YgdGhlIGNsb25lZCBnaXQgcmVwb3NpdG9yeQotLi91cGRhdGVfZXh0ZXJuYWxfc291cmNlcy5zaAotY21ha2UgLUguIC1CZGJ1aWxkIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZwotY2QgZGJ1aWxkCi1tYWtlCi1gYGAKLQotSWYgeW91IGhhdmUgaW5zdGFsbGVkIGEgVnVsa2FuIGRyaXZlciBvYnRhaW5lZCBmcm9tIHlvdXIgZ3JhcGhpY3MgaGFyZHdhcmUgdmVuZG9yLCB0aGUgaW5zdGFsbCBwcm9jZXNzIHNob3VsZAotaGF2ZSBjb25maWd1cmVkIHRoZSBkcml2ZXIgc28gdGhhdCB0aGUgVnVsa2FuIGxvYWRlciBjYW4gZmluZCBhbmQgbG9hZCBpdC4KLQotSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsb2FkZXIgYW5kIGxheWVycyB0aGF0IHlvdSBoYXZlIGp1c3QgYnVpbHQ6Ci1gYGAKLWV4cG9ydCBMRF9MSUJSQVJZX1BBVEg9PHBhdGggdG8geW91ciByZXBvc2l0b3J5IHJvb3Q+L2RidWlsZC9sb2FkZXIKLWV4cG9ydCBWS19MQVlFUl9QQVRIPTxwYXRoIHRvIHlvdXIgcmVwb3NpdG9yeSByb290Pi9kYnVpbGQvbGF5ZXJzCi1gYGAKLVlvdSBjYW4gcnVuIHRoZSBgdnVsa2FuaW5mb2AgYXBwbGljYXRpb24gdG8gc2VlIHdoaWNoIGRyaXZlciwgbG9hZGVyIGFuZCBsYXllcnMgYXJlIGJlaW5nIHVzZWQuCi0KLVRoZSBgTG9hZGVyQW5kTGF5ZXJJbnRlcmZhY2VgIGRvY3VtZW50IGluIHRoZSBgbG9hZGVyYCBmb2xkZXIgaW4gdGhpcyByZXBvc2l0b3J5IGlzIGEgc3BlY2lmaWNhdGlvbiB0aGF0Ci1kZXNjcmliZXMgYm90aCBob3cgSUNEcyBhbmQgbGF5ZXJzIHNob3VsZCBiZSBwcm9wZXJseQotcGFja2FnZWQsIGFuZCBob3cgZGV2ZWxvcGVycyBjYW4gcG9pbnQgdG8gSUNEcyBhbmQgbGF5ZXJzIHdpdGhpbiB0aGVpciBidWlsZHMuCi0KLSMjIyBMaW51eCBJbnN0YWxsIHRvIFN5c3RlbSBEaXJlY3RvcmllcwotCi1JbnN0YWxsaW5nIHRoZSBmaWxlcyByZXN1bHRpbmcgZnJvbSB5b3VyIGJ1aWxkIHRvIHRoZSBzeXN0ZW1zIGRpcmVjdG9yaWVzIGlzIG9wdGlvbmFsIHNpbmNlCi1lbnZpcm9ubWVudCB2YXJpYWJsZXMgY2FuIHVzdWFsbHkgYmUgdXNlZCBpbnN0ZWFkIHRvIGxvY2F0ZSB0aGUgYmluYXJpZXMuCi1UaGVyZSBhcmUgYWxzbyByaXNrcyB3aXRoIGludGVyZmVyaW5nIHdpdGggYmluYXJpZXMgaW5zdGFsbGVkIGJ5IHBhY2thZ2VzLgotSWYgeW91IGFyZSBjZXJ0YWluIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gaW5zdGFsbCB5b3VyIGJpbmFyaWVzIHRvIHN5c3RlbSBkaXJlY3RvcmllcywKLXlvdSBjYW4gcHJvY2VlZCB3aXRoIHRoZXNlIGluc3RydWN0aW9ucy4KLQotQXNzdW1pbmcgdGhhdCB5b3UndmUgYnVpbHQgdGhlIGNvZGUgYXMgZGVzY3JpYmVkIGFib3ZlIGFuZCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc3RpbGwgYGRidWlsZGAsCi15b3UgY2FuIGV4ZWN1dGU6Ci0KLWBgYAotc3VkbyBtYWtlIGluc3RhbGwKLWBgYAotCi1UaGlzIGNvbW1hbmQgaW5zdGFsbHMgZmlsZXMgdG86Ci0KLSogYC91c3IvbG9jYWwvaW5jbHVkZS92dWxrYW5gOiAgVnVsa2FuIGluY2x1ZGUgZmlsZXMKLSogYC91c3IvbG9jYWwvbGliYDogIFZ1bGthbiBsb2FkZXIgYW5kIGxheWVycyBzaGFyZWQgb2JqZWN0cwotKiBgL3Vzci9sb2NhbC9iaW5gOiAgdnVsa2FuaW5mbyBhcHBsaWNhdGlvbgotKiBgL3Vzci9sb2NhbC9ldGMvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmRgOiAgTGF5ZXIgSlNPTiBmaWxlcwotCi1Zb3UgbWF5IG5lZWQgdG8gcnVuIGBsZGNvbmZpZ2AgaW4gb3JkZXIgdG8gcmVmcmVzaCB0aGUgc3lzdGVtIGxvYWRlciBzZWFyY2ggY2FjaGUgb24gc29tZSBMaW51eCBzeXN0ZW1zLgotCi1UaGUgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgYXBwZWFycyBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5IGluIGEgZmlsZSBuYW1lZCBgaW5zdGFsbF9tYW5pZmVzdC50eHRgLgotWW91IGNhbiBlYXNpbHkgcmVtb3ZlIHRoZSBpbnN0YWxsZWQgZmlsZXMgd2l0aDoKLQotYGBgCi1jYXQgaW5zdGFsbF9tYW5pZmVzdC50eHQgfCBzdWRvIHhhcmdzIHJtCi1gYGAKLQotWW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZSB0aGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIGJ5IHNldHRpbmcgYWRkaXRpb25hbCBDTWFrZSB2YXJpYWJsZXMKLXRvIG92ZXJyaWRlIHRoZWlyIGRlZmF1bHRzLgotRm9yIGV4YW1wbGUsIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGluc3RhbGwgdG8gYC90bXAvYnVpbGRgIGluc3RlYWQgb2YgYC91c3IvbG9jYWxgLCBzcGVjaWZ5OgotCi1gYGAKLS1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9L3RtcC9idWlsZAotLURERVNUX0RJUj0vdG1wL2J1aWxkCi1gYGAKLQotb24geW91ciBDTWFrZSBjb21tYW5kIGxpbmUgYW5kIHJ1biBgbWFrZSBpbnN0YWxsYCBhcyBiZWZvcmUuCi1UaGUgaW5zdGFsbCBzdGVwIHBsYWNlcyB0aGUgZmlsZXMgaW4gYC90bXAvYnVpbGRgLgotCi1Vc2luZyB0aGUgYENNQUtFX0lOU1RBTExfUFJFRklYYCB0byBjdXN0b21pemUgdGhlIGluc3RhbGwgbG9jYXRpb24gYWxzbyBtb2RpZmllcyB0aGUKLWxvYWRlciBzZWFyY2ggcGF0aHMgdG8gaW5jbHVkZSBzZWFyY2hpbmcgZm9yIGxheWVycyBpbiB0aGUgc3BlY2lmaWVkIGluc3RhbGwgbG9jYXRpb24uCi1JbiB0aGlzIGV4YW1wbGUsIHNldHRpbmcgYENNQUtFX0lOU1RBTExfUFJFRklYYCB0byBgL3RtcC9idWlsZGAgY2F1c2VzIHRoZSBsb2FkZXIgdG8KLXNlYXJjaCBgL3RtcC9idWlsZC9ldGMvdnVsa2FuL2V4cGxpY2l0X2xheWVyLmRgIGFuZCBgL3RtcC9idWlsZC9zaGFyZS92dWxrYW4vZXhwbGljaXRfbGF5ZXIuZGAKLWZvciB0aGUgbGF5ZXIgSlNPTiBmaWxlcy4KLVRoZSBsb2FkZXIgYWxzbyBzZWFyY2hlcyB0aGUgInN0YW5kYXJkIiBzeXN0ZW0gbG9jYXRpb25zIG9mIGAvZXRjL3Z1bGthbi9leHBsaWNpdF9sYXllci5kYAotYW5kIGAvdXNyL3NoYXJlL3Z1bGthbi9leHBsaWNpdF9sYXllci5kYCBhZnRlciBzZWFyY2hpbmcgdGhlIHR3byBsb2NhdGlvbnMgdW5kZXIgYC90bXAvYnVpbGRgLgotCi1Zb3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgYnkgdXNpbmcgdGhlIENNYWtlIHZhcmlhYmxlcwotYENNQUtFX0lOU1RBTExfU1lTQ09ORkRJUmAgdG8gcmVuYW1lIHRoZSBgZXRjYCBkaXJlY3RvcnkgYW5kIGBDTUFLRV9JTlNUQUxMX0RBVEFESVJgCi10byByZW5hbWUgdGhlIGBzaGFyZWAgZGlyZWN0b3J5LgotCi1TZWUgdGhlIENNYWtlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyB0aGVzZSB2YXJpYWJsZXMKLXRvIGZ1cnRoZXIgY3VzdG9taXplIHlvdXIgaW5zdGFsbGF0aW9uLgotCi1BbHNvIHNlZSB0aGUgYExvYWRlckFuZExheWVySW50ZXJmYWNlYCBkb2N1bWVudCBpbiB0aGUgYGxvYWRlcmAgZm9sZGVyIGluIHRoaXMgcmVwb3NpdG9yeSBmb3IgbW9yZQotaW5mb3JtYXRpb24gYWJvdXQgbG9hZGVyIG9wZXJhdGlvbi4KLQotTm90ZSB0aGF0IHNvbWUgZXhlY3V0YWJsZXMgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuLCBgY3ViZWApIHVzZSB0aGUgInJwYXRoIiBsaW5rZXIgZGlyZWN0aXZlCi10byBsb2FkIHRoZSBWdWxrYW4gbG9hZGVyIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgYGRidWlsZGAgaW4gdGhpcyBleGFtcGxlLgotVGhpcyBtZWFucyB0aGF0IGV2ZW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgbG9hZGVyIHRvIHRoZSBzeXN0ZW0gZGlyZWN0b3JpZXMsIHRoZXNlIGV4ZWN1dGFibGVzCi1zdGlsbCB1c2UgdGhlIGxvYWRlciBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0KLSMjIFZhbGlkYXRpb24gVGVzdAotCi1UaGUgdGVzdCBleGVjdXRhYmxlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGRidWlsZC90ZXN0cyBkaXJlY3RvcnkuCi1Tb21lIG9mIHRoZSB0ZXN0cyB0aGF0IGFyZSBhdmFpbGFibGU6Ci0tIHZrXF9sYXllclxfdmFsaWRhdGlvblxfdGVzdHM6IFRlc3QgVnVsa2FuIGxheWVycy4KLQotVGhlcmUgYXJlIGFsc28gYSBmZXcgc2hlbGwgYW5kIFB5dGhvbiBzY3JpcHRzIHRoYXQgcnVuIHRlc3QgY29sbGVjdGlvbnMgKGVnLAotYHJ1bl9hbGxfdGVzdHMuc2hgKS4KLQotIyMgTGludXggRGVtb3MKLQotU29tZSBkZW1vcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgZGJ1aWxkL2RlbW9zIGRpcmVjdG9yeSBhcmU6Ci0tIHZ1bGthbmluZm86IHJlcG9ydCBHUFUgcHJvcGVydGllcwotLSBjdWJlOiBhIHRleHR1cmVkIHNwaW5uaW5nIGN1YmUKLS0gc21va2Uvc21va2U6IEEgInNtb2tlIiB0ZXN0IHVzaW5nIGEgbW9yZSBjb21wbGV4IFZ1bGthbiBkZW1vCi0KLSMjIFdpbmRvd3MgU3lzdGVtIFJlcXVpcmVtZW50cwotCi1XaW5kb3dzIDcrIHdpdGggYWRkaXRpb25hbCByZXF1aXJlZCBzb2Z0d2FyZSBwYWNrYWdlczoKLQotLSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDEzIFByb2Zlc3Npb25hbC4gIE5vdGU6IGl0IGlzIHBvc3NpYmxlIHRoYXQgbGVzc2VyL29sZGVyIHZlcnNpb25zIG1heSB3b3JrLCBidXQgdGhhdCBoYXMgbm90IGJlZW4gdGVzdGVkLgotLSBbQ01ha2VdKGh0dHA6Ly93d3cuY21ha2Uub3JnL2Rvd25sb2FkLykuICBOb3RlczoKLSAgLSBUZWxsIHRoZSBpbnN0YWxsZXIgdG8gIkFkZCBDTWFrZSB0byB0aGUgc3lzdGVtIFBBVEgiIGVudmlyb25tZW50IHZhcmlhYmxlLgotLSBbUHl0aG9uIDNdKGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWRzKS4gIE5vdGVzOgotICAtIFNlbGVjdCB0byBpbnN0YWxsIHRoZSBvcHRpb25hbCBzdWItcGFja2FnZSB0byBhZGQgUHl0aG9uIHRvIHRoZSBzeXN0ZW0gUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSAgLSBFbnN1cmUgdGhlIHBpcCBtb2R1bGUgaXMgaW5zdGFsbGVkIChpdCBzaG91bGQgYmUgYnkgZGVmYXVsdCkKLSAgLSBOZWVkIHB5dGhvbjMuMyBvciBsYXRlciB0byBnZXQgdGhlIFdpbmRvd3MgcHkuZXhlIGxhdW5jaGVyIHRoYXQgaXMgdXNlZCB0byBnZXQgcHl0aG9uMyByYXRoZXIgdGhhbiBweXRob24yIGlmIGJvdGggYXJlIGluc3RhbGxlZCBvbiBXaW5kb3dzCi0gIC0gMzIgYml0IHB5dGhvbiB3b3JrcwotLSBbR2l0XShodHRwOi8vZ2l0LXNjbS5jb20vZG93bmxvYWQvd2luKS4KLSAgLSBOb3RlOiBJZiB5b3UgdXNlIEN5Z3dpbiwgeW91IGNhbiBub3JtYWxseSB1c2UgQ3lnd2luJ3MgImdpdC5leGUiLiAgSG93ZXZlciwgaW4gb3JkZXIgdG8gdXNlIHRoZSAidXBkYXRlXF9leHRlcm5hbFxfc291cmNlcy5iYXQiIHNjcmlwdCwgeW91IG11c3QgaGF2ZSB0aGlzIHZlcnNpb24uCi0gIC0gVGVsbCB0aGUgaW5zdGFsbGVyIHRvIGFsbG93IGl0IHRvIGJlIHVzZWQgZm9yICJEZXZlbG9wZXIgUHJvbXB0IiBhcyB3ZWxsIGFzICJHaXQgQmFzaCIuCi0gIC0gVGVsbCB0aGUgaW5zdGFsbGVyIHRvIHRyZWF0IGxpbmUgZW5kaW5ncyAiYXMgaXMiIChpLmUuIGJvdGggRE9TIGFuZCBVbml4LXN0eWxlIGxpbmUgZW5kaW5ncykuCi0gIC0gSW5zdGFsbCBlYWNoIGEgMzItYml0IGFuZCBhIDY0LWJpdCB2ZXJzaW9uLCBhcyB0aGUgNjQtYml0IGluc3RhbGxlciBkb2VzIG5vdCBpbnN0YWxsIHRoZSAzMi1iaXQgbGlicmFyaWVzIGFuZCB0b29scy4KLS0gZ2xzbGFuZyBpcyByZXF1aXJlZCBmb3IgZGVtb3MgYW5kIHRlc3RzLgotICAtIFtZb3UgY2FuIGRvd25sb2FkIGFuZCBjb25maWd1cmUgaXQgKGluIGEgcGVlciBkaXJlY3RvcnkpIGhlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xzbGFuZy9ibG9iL21hc3Rlci9SRUFETUUubWQpCi0gIC0gQSB3aW5kb3dzIGJhdGNoIGZpbGUgaGFzIGJlZW4gaW5jbHVkZWQgdGhhdCB3aWxsIHB1bGwgYW5kIGJ1aWxkIHRoZSBjb3JyZWN0IHZlcnNpb24uICBSdW4gaXQgZnJvbSBEZXZlbG9wZXIgQ29tbWFuZCBQcm9tcHQgZm9yIFZTMjAxMyBsaWtlIHNvOgotICAgIC0gdXBkYXRlXF9leHRlcm5hbFxfc291cmNlcy5iYXQgLS1idWlsZC1nbHNsYW5nIChOb3RlOiBzZWUgKipMb2FkZXIgYW5kIFZhbGlkYXRpb24gTGF5ZXIgRGVwZW5kZW5jaWVzKiogYmVsb3cgZm9yIG90aGVyIG9wdGlvbnMpCi0KLSMjIFdpbmRvd3MgQnVpbGQgLSBNU1ZDCi0KLUJlZm9yZSBidWlsZGluZyBvbiBXaW5kb3dzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHRoZSBjdXN0b21pemUgc2VjdGlvbiBpbiBsb2FkZXIvbG9hZGVyLnJjIHRvIHNvIGFzIHRvCi1zZXQgdGhlIHZlcnNpb24gbnVtYmVycyBhbmQgYnVpbGQgZGVzY3JpcHRpb24gZm9yIHlvdXIgYnVpbGQuIERvaW5nIHNvIHdpbGwgc2V0IHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQKLWZvciB0aGUgUHJvcGVyaXRlcy0+RGV0YWlscyB0YWIgb2YgdGhlIGxvYWRlciB2dWxrYW4tMS5kbGwgZmlsZSB0aGF0IGlzIGJ1aWx0LgotCi1CdWlsZCBhbGwgV2luZG93cyB0YXJnZXRzIGFmdGVyIGluc3RhbGxpbmcgcmVxdWlyZWQgc29mdHdhcmUgYW5kIGNsb25pbmcgdGhlIExvYWRlciBhbmQgVmFsaWRhdGlvbiBMYXllciByZXBvIGFzIGRlc2NyaWJlZCBhYm92ZSBieSBjb21wbGV0aW5nIHRoZSBmb2xsb3dpbmcgc3RlcHMgaW4gYSAiRGV2ZWxvcGVyIENvbW1hbmQgUHJvbXB0IGZvciBWUzIwMTMiIHdpbmRvdyAoTm90ZSB0aGF0IHRoZSB1cGRhdGVcX2V4dGVybmFsXF9zb3VyY2VzIHNjcmlwdCB1c2VkIGJlbG93IGJ1aWxkcyBleHRlcm5hbCB0b29scyBpbnRvIHByZWRlZmluZWQgbG9jYXRpb25zLiBTZWUgKipMb2FkZXIgYW5kIFZhbGlkYXRpb24gTGF5ZXIgRGVwZW5kZW5jaWVzKiogZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIG90aGVyIG9wdGlvbnMpOgotYGBgCi1jZCBWdWxrYW4tTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycyAgIyBjZCB0byB0aGUgcm9vdCBvZiB0aGUgY2xvbmVkIGdpdCByZXBvc2l0b3J5Ci11cGRhdGVfZXh0ZXJuYWxfc291cmNlcy5iYXQgLS1hbGwKLWJ1aWxkX3dpbmRvd3NfdGFyZ2V0cy5iYXQgCi1gYGAKLQotQXQgdGhpcyBwb2ludCwgeW91IGNhbiB1c2UgV2luZG93cyBFeHBsb3JlciB0byBsYXVuY2ggVmlzdWFsIFN0dWRpbyBieSBkb3VibGUtY2xpY2tpbmcgb24gdGhlICJWVUxLQU4uc2xuIiBmaWxlIGluIHRoZSBcYnVpbGQgZm9sZGVyLiAgT25jZSBWaXN1YWwgU3R1ZGlvIGNvbWVzIHVwLCB5b3UgY2FuIHNlbGVjdCAiRGVidWciIG9yICJSZWxlYXNlIiBmcm9tIGEgZHJvcC1kb3duIGxpc3QuICBZb3UgY2FuIHN0YXJ0IGEgYnVpbGQgd2l0aCBlaXRoZXIgdGhlIG1lbnUgKEJ1aWxkLT5CdWlsZCBTb2x1dGlvbiksIG9yIGEga2V5Ym9hcmQgc2hvcnRjdXQgKEN0cmwrU2hpZnQrQikuICBBcyBwYXJ0IG9mIHRoZSBidWlsZCBwcm9jZXNzLCBQeXRob24gc2NyaXB0cyB3aWxsIGNyZWF0ZSBhZGRpdGlvbmFsIFZpc3VhbCBTdHVkaW8gZmlsZXMgYW5kIHByb2plY3RzLCBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgc291cmNlIGZpbGVzLiAgQWxsIG9mIHRoZXNlIGF1dG8tZ2VuZXJhdGVkIGZpbGVzIGFyZSB1bmRlciB0aGUgImJ1aWxkIiBmb2xkZXIuCi0KLVZ1bGthbiBwcm9ncmFtcyBtdXN0IGJlIGFibGUgdG8gZmluZCBhbmQgdXNlIHRoZSB2dWxrYW4tMS5kbGwgbGlicmFyeS4gTWFrZSBzdXJlIGl0IGlzIGVpdGhlciBpbnN0YWxsZWQgaW4gdGhlIEM6XFdpbmRvd3NcU3lzdGVtMzIgZm9sZGVyLCBvciB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbmNsdWRlcyB0aGUgZm9sZGVyIHRoYXQgaXQgaXMgbG9jYXRlZCBpbi4KLQotVG8gcnVuIFZ1bGthbiBwcm9ncmFtcyB5b3UgbXVzdCB0ZWxsIHRoZSBpY2QgbG9hZGVyIHdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcmllcy4KLVRoaXMgaXMgZGVzY3JpYmVkIGluIGEgYExvYWRlckFuZExheWVySW50ZXJmYWNlYCBkb2N1bWVudCBpbiB0aGUgYGxvYWRlcmAgZm9sZGVyIGluIHRoaXMgcmVwb3NpdG9yeS4KLVRoaXMgc3BlY2lmaWNhdGlvbiBkZXNjcmliZXMgYm90aCBob3cgSUNEcyBhbmQgbGF5ZXJzIHNob3VsZCBiZSBwcm9wZXJseQotcGFja2FnZWQsIGFuZCBob3cgZGV2ZWxvcGVycyBjYW4gcG9pbnQgdG8gSUNEcyBhbmQgbGF5ZXJzIHdpdGhpbiB0aGVpciBidWlsZHMuCi0KLSMjIEFuZHJvaWQgQnVpbGQKLUluc3RhbGwgdGhlIHJlcXVpcmVkIHRvb2xzIGZvciBMaW51eCBhbmQgV2luZG93cyBjb3ZlcmVkIGFib3ZlLCB0aGVuIGFkZCB0aGUKLWZvbGxvd2luZy4KLSMjIyBBbmRyb2lkIFN0dWRpbwotLSBJbnN0YWxsIFtBbmRyb2lkIFN0dWRpbyAyLjFdKGh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9kb3dubG9hZC9zdHVkaW8vY2FuYXJ5KSwgbGF0ZXN0IFByZXZpZXcgKHRlc3RlZCB3aXRoIDQpOgotLSBGcm9tIHRoZSAiV2VsY29tZSB0byBBbmRyb2lkIFN0dWRpbyIgc3BsYXNoIHNjcmVlbiwgYWRkIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyB1c2luZyBDb25maWd1cmUgPiBTREsgTWFuYWdlcjoKLSAgLSBTREsgUGxhdGZvcm1zID4gQW5kcm9pZCBOIFByZXZpZXcKLSAgLSBTREsgVG9vbHMgPiBBbmRyb2lkIE5ESwotCi0jIyMjIEFkZCBOREsgdG8gcGF0aAotCi1PbiBMaW51eDoKLWBgYAotZXhwb3J0IFBBVEg9JEhPTUUvQW5kcm9pZC9zZGsvbmRrLWJ1bmRsZTokUEFUSAotYGBgCi1PbiBXaW5kb3dzOgotYGBgCi1zZXQgUEFUSD0lTE9DQUxBUFBEQVRBJVxBbmRyb2lkXHNka1xuZGstYnVuZGxlOyVQQVRIJQotYGBgCi1PbiBPU1g6Ci1gYGAKLWV4cG9ydCBQQVRIPSRIT01FL0xpYnJhcnkvQW5kcm9pZC9zZGsvbmRrLWJ1bmRsZTokUEFUSAotYGBgCi0jIyMgQWRkaXRpb25hbCBPU1ggU3lzdGVtIFJlcXVpcmVtZW50cwotVGVzdGVkIG9uIE9TWCB2ZXJzaW9uIDEwLjExLjQKLQotIFNldHVwIEhvbWVicmV3IGFuZCBjb21wb25lbnRzCi0tIEZvbGxvdyBpbnN0cnVjdGlvbnMgb24gW2JyZXcuc2hdKGh0dHA6Ly9icmV3LnNoKSB0byBnZXQgaG9tZWJyZXcgaW5zdGFsbGVkLgotYGBgCi0vdXNyL2Jpbi9ydWJ5IC1lICIkKGN1cmwgLWZzU0wgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0hvbWVicmV3L2luc3RhbGwvbWFzdGVyL2luc3RhbGwpIgotYGBgCi0tIEVuc3VyZSBIb21lYnJldyBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgUEFUSDoKLWBgYAotZXhwb3J0IFBBVEg9L3Vzci9sb2NhbC9iaW46JFBBVEgKLWBgYAotLSBBZGQgcGFja2FnZXMgd2l0aCB0aGUgZm9sbG93aW5nIChtYXkgbmVlZCByZWZpbmVtZW50KQotYGBgCi1icmV3IGluc3RhbGwgY21ha2UgcHl0aG9uIHB5dGhvbjMgZ2l0Ci1gYGAKLSMjIyBCdWlsZCBzdGVwcyBmb3IgQW5kcm9pZAotVXNlIHRoZSBmb2xsb3dpbmcgdG8gZW5zdXJlIHRoZSBBbmRyb2lkIGJ1aWxkIHdvcmtzLgotIyMjIyBMaW51eCBhbmQgT1NYCi1Gb2xsb3cgdGhlIHNldHVwIHN0ZXBzIGZvciBMaW51eCBvciBPU1ggYWJvdmUsIHRoZW4gZnJvbSB5b3VyIHRlcm1pbmFsOgotYGBgCi1jZCBidWlsZC1hbmRyb2lkCi0uL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2gKLS4vYW5kcm9pZC1nZW5lcmF0ZS5zaAotbmRrLWJ1aWxkIC1qICQoc3lzY3RsIC1uIGh3Lm5jcHUpCi1gYGAKLSMjIyMgV2luZG93cwotRm9sbG93IHRoZSBzZXR1cCBzdGVwcyBmb3IgV2luZG93cyBhYm92ZSwgdGhlbiBmcm9tIERldmVsb3BlciBDb21tYW5kIFByb21wdCBmb3IgVlMyMDEzOgotYGBgCi1jZCBidWlsZC1hbmRyb2lkCi11cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLmJhdAotYW5kcm9pZC1nZW5lcmF0ZS5iYXQKLW5kay1idWlsZAotYGBgCi0jIyMjIEFuZHJvaWQgZGVtb3MKLVVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkLCBpbnN0YWxsLCBhbmQgcnVuIEN1YmUgYW5kIFRyaSBmb3IgQW5kcm9pZDoKLWBgYAotY2QgZGVtb3MvYW5kcm9pZAotYW5kcm9pZCB1cGRhdGUgcHJvamVjdCAtcyAtcCAuIC10ICJhbmRyb2lkLTIzIgotbmRrLWJ1aWxkCi1hbnQgLWJ1aWxkZmlsZSBjdWJlIGRlYnVnCi1hZGIgaW5zdGFsbCAuL2N1YmUvYmluL05hdGl2ZUFjdGl2aXR5LWRlYnVnLmFwawotYWRiIHNoZWxsIGFtIHN0YXJ0IGNvbS5leGFtcGxlLkN1YmUvYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkKLWBgYAotVG8gYnVpbGQsIGluc3RhbGwsIGFuZCBydW4gQ3ViZSB3aXRoIHZhbGlkYXRpb24gbGF5ZXJzLCBmaXJzdCBidWlsZCBsYXllcnMgdXNpbmcgc3RlcHMgYWJvdmUsIHRoZW4gcnVuOgotYGBgCi1jZCBkZW1vcy9hbmRyb2lkCi1hbmRyb2lkIHVwZGF0ZSBwcm9qZWN0IC1zIC1wIC4gLXQgImFuZHJvaWQtMjMiCi1uZGstYnVpbGQgLWoKLWFudCAtYnVpbGRmaWxlIGN1YmUtd2l0aC1sYXllcnMgZGVidWcKLWFkYiBpbnN0YWxsIC4vY3ViZS13aXRoLWxheWVycy9iaW4vTmF0aXZlQWN0aXZpdHktZGVidWcuYXBrCi1hZGIgc2hlbGwgYW0gc3RhcnQgLWEgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gLWMgYW5kcm9pZC1pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIIC1uIGNvbS5leGFtcGxlLkN1YmVXaXRoTGF5ZXJzL2FuZHJvaWQuYXBwLk5hdGl2ZUFjdGl2aXR5IC0tZXMgYXJncyAiLS12YWxpZGF0ZSIKLWBgYAotCi1UbyBidWlsZCwgaW5zdGFsbCwgYW5kIHJ1biB0aGUgU21va2UgZGVtbyBmb3IgQW5kcm9pZCwgcnVuIHRoZSBmb2xsb3dpbmcsIGFuZCBhbnkKLXByb21wdHMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgc2NyaXB0OgotYGBgCi0uL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLnNoIC0tZ2xzbGFuZwotY2QgZGVtb3Mvc21va2UvYW5kcm9pZAotZXhwb3J0IEFORFJPSURfU0RLX0hPTUU9PHBhdGggdG8gQW5kcm9pZC9TZGs+Ci1leHBvcnQgQU5EUk9JRF9OREtfSE9NRT08cGF0aCB0byBBbmRyb2lkL1Nkay9uZGstYnVuZGxlPgotLi9idWlsZC1hbmQtaW5zdGFsbAotYWRiIHNoZWxsIGFtIHN0YXJ0IGNvbS5leGFtcGxlLlNtb2tlL2FuZHJvaWQuYXBwLk5hdGl2ZUFjdGl2aXR5Ci1gYGAKLQotIyMgTmluamEgQnVpbGRzIC0gQWxsIFBsYXRmb3JtcwotVGhlIFtRdCBDcmVhdG9yIElERV0oaHR0cHM6Ly9xdC5pby9kb3dubG9hZC1vcGVuLXNvdXJjZS8jc2VjdGlvbi0yKSBjYW4gb3BlbiBhIHJvb3QgQ01ha2VMaXN0LnR4dCBhcyBhIHByb2plY3QgZGlyZWN0bHksIGFuZCBpdCBwcm92aWRlcyB0b29scyB3aXRoaW4gQ3JlYXRvciB0byBjb25maWd1cmUgYW5kIGdlbmVyYXRlIFZ1bGthbiBTREsgYnVpbGQgZmlsZXMgZm9yIG9uZSB0byBtYW55IHRhcmdldHMgY29uY3VycmVudGx5LCByZXNvbHZpbmcgY29uZmlndXJhdGlvbiBpc3N1ZXMgYXMgbmVlZGVkLiBBbHRlcm5hdGl2ZWx5LCB3aGVuIGludm9raW5nIENNYWtlIHVzZSB0aGUgLUcgQ29kZWJsb2NrcyBOaW5qYSBvcHRpb24gdG8gZ2VuZXJhdGUgTmluamEgYnVpbGQgZmlsZXMgdG8gYmUgdXNlZCBhcyBwcm9qZWN0IGZpbGVzIGZvciBRdENyZWF0b3IKLQotLSBGb2xsb3cgdGhlIHN0ZXBzIGRlZmluZWQgZWxzZXdoZXJlIGZvciB0aGUgT1MgdXNpbmcgdGhlIHVwZGF0ZVxfZXh0ZXJuYWxcX3NvdXJjZXMgc2NyaXB0IG9yIGFzIHNob3duIGluICoqTG9hZGVyIGFuZCBWYWxpZGF0aW9uIExheWVyIERlcGVuZGVuY2llcyoqIGJlbG93Ci0tIE9wZW4sIGNvbmZpZ3VyZSwgYW5kIGJ1aWxkIHRoZSBnc2xhbmcgYW5kIHNwaXJ2LXRvb2xzIENNYWtlTGlzdC50eHQgZmlsZXMKLS0gVGhlbiBkbyB0aGUgc2FtZSB3aXRoIHRoZSBWdWxrYW4tTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycyBDTWFrZUxpc3QudHh0IGZpbGUuCi0tIEluIG9yZGVyIHRvIGRlYnVnIHdpdGggUXRDcmVhdG9yLCBhIFtNaWNyb3NvZnQgV0RLOiBlZyBXREsgMTBdKGh0dHA6Ly9nby5taWNyb3NvZnQuY29tL2Z3bGluay9wLz9MaW5rSWQ9NTI2NzMzKSBpcyByZXF1aXJlZC4gTm90ZSB0aGF0IGluc3RhbGxpbmcgdGhlIFdESyBicmVha3MgdGhlIE1TVkMgdmN2YXJzYWxsLmJhdCBidWlsZCBzY3JpcHRzIHByb3ZpZGVkIGJ5IE1TVkMsIHJlcXVpcmluZyB0aGF0IHRoZSBMSUIsIElOQ0xVREUsIGFuZCBQQVRIIGVudiB2YXJpYWJsZXMgYmUgc2V0IHRvIHRoZSBXREsgcGF0aHMgYnkgc29tZSBvdGhlciBtZWFucwotCi0jIyBMb2FkZXIgYW5kIFZhbGlkYXRpb24gTGF5ZXIgRGVwZW5kZW5jaWVzIAotZ3NsYW5nIGFuZCBTUElSVi1Ub29scyByZXBvcyBhcmUgcmVxdWlyZWQgdG8gYnVpbGQgYW5kIHJ1biBMb2FkZXIgYW5kIFZhbGlkYXRpb24gTGF5ZXIgY29tcG9uZW50cy4gVGhleSBhcmUgbm90IGdpdCBzdWItbW9kdWxlcyBvZiBWdWxrYW4tTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycyBidXQgVnVsa2FuLUxvYWRlckFuZFZhbGlkYXRpb25MYXllcnMgaXMgbGlua2VkIHRvIHNwZWNpZmljIHJldmlzaW9ucyBvZiBnc2xhbmcgYW5kIHNwaXJ2LXRvb2xzLiBUaGVzZSBjYW4gYmUgYXV0b21hdGljYWxseSBjbG9uZWQgYW5kIGJ1aWx0IHRvIHByZWRlZmluZWQgbG9jYXRpb25zIHdpdGggdGhlIHVwZGF0ZVxfZXh0ZXJuYWxcX3NvdXJjZXMgc2NyaXB0cy4gSWYgYSBjdXN0b20gY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCwgZG8gdGhlIGZvbGxvd2luZyBzdGVwczoKLQotMSkgY2xvbmUgdGhlIHJlcG9zOgotCi0gICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xzbGFuZy5naXQKLSAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9TUElSVi1Ub29scy5naXQKLQotCi0yKSBjaGVja291dCB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIGVhY2ggdHJlZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGdsc2xhbmdcX3JldmlzaW9uIGFuZCBzcGlydi10b29sc1xfcmV2aXNpb24gZmlsZXMgYXQgdGhlIHJvb3Qgb2YgdGhlIFZ1bGthbi1Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzIHRyZWUgKGRvIHRoZSBzYW1lIGFueXRpbWUgdGhhdCBWdWxrYW4tTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycyBpcyB1cGRhdGVkIGZyb20gcmVtb3RlKQotCi1fb24gd2luZG93c18KLQotICAgIGdpdCBjaGVja291dCA8IFtwYXRoIHRvIFZ1bGthbi1Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzXVxnbHNsYW5nX3JldmlzaW9uIFtpbiBnbHNsYW5nIHJlcG9dCi0JZ2l0IGNoZWNrb3V0IDwgW3BhdGggdG8gVnVsa2FuLUxvYWRlckFuZFZhbGlkYXRpb25MYXllcnNdXHNwaXJ2LXRvb2xzX3JldmlzaW9uW2luIHNwcml2LXRvb2xzIHJlcG9dCi0KLSpub24gd2luZG93cyoKLQotICAgIGdpdCBjaGVja291dCBgY2F0IFtwYXRoIHRvIFZ1bGthbi1Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzXVxnbHNsYW5nX3JldmlzaW9uYCBbaW4gZ2xzbGFuZyByZXBvXQotCWdpdCBjaGVja291dCBgY2F0IFtwYXRoIHRvIFZ1bGthbi1Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzXVxzcGlydi10b29sc19yZXZpc2lvbmAgW2luIHNwcml2LXRvb2xzIHJlcG9dCi0KLTMpIENvbmZpZ3VyZSB0aGUgZ3NsYW5nIGFuZCBzcGlydi10b29scyBzb3VyY2UgdHJlZXMgd2l0aCBjbWFrZSBhbmQgYnVpbGQgdGhlbSB3aXRoIHlvdXIgSURFIG9mIGNob2ljZQotCi00KSBFbmFibGUgdGhlIENVU1RPTVxfR1NMQU5HXF9CSU5cX1BBVEggYW5kIENVU1RPTVxfU1BJUlZcX1RPT0xTXF9CSU5cX1BBVEggb3B0aW9ucyBpbiB0aGUgVnVsa2FuLUxvYWRlckFuZFZhbGlkYXRpb25MYXllcnMgY21ha2UgY29uZmlndXJhdGlvbiBhbmQgcG9pbnQgdGhlIEdTTEFOR1xfQklOQVJZXF9QQVRIIGFuZCBTUElSVlxfVE9PTFNcX0JJTkFSWVxfUEFUSCB2YXJpYWJsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24KLQotNSkgSWYgYnVpbGRpbmcgb24gV2luZG93cyB3aXRoIE1TVkMsIHNldCBESVNBQkxFXF9CVUlMRFRHVFxfRElSXF9ERUNPUkFUSU9OIHRvIF9Pbl8uIElmIGJ1aWxkaW5nIG9uIFdpbmRvd3MsIGJ1dCB3aXRob3V0IE1TVkMgc2V0IERJU0FCTEVcX0JVSUxEXF9QQVRIXF9ERUNPUkFUSU9OIHRvIF9Pbl8KLQotIyMgT3B0aW9uYWwgc29mdHdhcmUgcGFja2FnZXM6Ci0KLS0gW0N5Z3dpbiBmb3Igd2luZG93c10oaHR0cHM6Ly93d3cuY3lnd2luLmNvbS8pLiAgTm90ZXM6Ci0gIC0gQ3lnd2luIHByb3ZpZGVzIHNvbWUgTGludXgtbGlrZSB0b29scywgd2hpY2ggYXJlIHZhbHVhYmxlIGZvciBvYnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLCBhbmQgcnVubmluZyBDTWFrZS4KLSAgICBFc3BlY2lhbGx5IHZhbHVhYmxlIGFyZSB0aGUgQkFTSCBzaGVsbCBhbmQgZ2l0IHBhY2thZ2VzLgotICAtIElmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBDeWd3aW4sIHRoZXJlIGFyZSBvdGhlciBzaGVsbHMgYW5kIGVudmlyb25tZW50cyB0aGF0IGNhbiBiZSB1c2VkLgotICAgIFlvdSBjYW4gYWxzbyB1c2UgYSBHaXQgcGFja2FnZSB0aGF0IGRvZXNuJ3QgY29tZSBmcm9tIEN5Z3dpbi4KLQkKLS0gW05pbmphIG9uIGFsbCBwbGF0Zm9ybXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9uaW5qYS1idWlsZC9uaW5qYS9yZWxlYXNlcykuIFtUaGUgTmluamEtYnVpbGQgcHJvamVjdF0obmluamEtYnVpbGQub3JnKS4gW05pbmphIFVzZXJzIE1hbnVhbF0obmluamEtYnVpbGQub3JnL21hbnVhbC5odG1sKSAKLQotLSBbUXRDcmVhdG9yIGFzIElERSBmb3IgQ01ha2UgYnVpbGRzIG9uIGFsbCBwbGF0Zm9ybXNdKGh0dHBzOi8vcXQuaW8vZG93bmxvYWQtb3Blbi1zb3VyY2UvI3NlY3Rpb24tMikKZGlmZiAtLWdpdCBhL0JVSUxEVlQubWQgYi9CVUlMRFZULm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzkzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9CVUlMRFZULm1kCkBAIC0wLDAgKzEsMjkzIEBACisjIEJ1aWxkIEluc3RydWN0aW9ucworVGhpcyBkb2N1bWVudCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyB0aGlzIHJlcG9zaXRvcnkgb24gTGludXggYW5kIFdpbmRvd3MuCisKK1RoaXMgcmVwb3NpdG9yeSBjb250YWlucyBhZGRpdGlvbmFsIGxheWVycyBhbmQgdGhlIFZrVHJhY2UgdHJhY2UvcmVwbGF5IHRvb2xzLCBzdXBwbGVtZW50aW5nIHRoZQorbG9hZGVyIGFuZCB2YWxpZGF0aW9uIGxheWVyIGNvcmUgY29tcG9uZW50cyBmb3VuZCBhdCBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwLgorCitGb3IgTGludXgsIHRoaXMgcmVwb3NpdG9yeSBhbHNvIGNvbnRhaW5zIGEgc2FtcGxlIEludGVsIFZ1bGthbiBkcml2ZXIgdGhhdCBpcyBiZWluZyBkZXByZWNhdGVkLgorSW5zdGVhZCBvZiB1c2luZyB0aGlzIGRyaXZlciwgaXQgaXMgc3VnZ2VzdGVkIHRoYXQgeW91IGNvbnRhY3QgeW91ciBncmFwaGljcyBkZXZpY2UgbWFudWZhY3R1cmVyCit0byBvYnRhaW4gYSBWdWxrYW4gZHJpdmVyIGZvciB5b3VyIEdQVSBoYXJkd2FyZS4KKworIyMgR2l0IHRoZSBCaXRzCisKK1RoZSBwdWJsaWMgcmVwb3NpdG9yeSBmb3IgdGhlIHRoZSBMdW5hckcgVnVsa2FuVG9vbHMgaXMgaG9zdGVkIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9MdW5hckcuCisKK0lmIHlvdSBpbnRlbmQgdG8gY29udHJpYnV0ZSwgdGhlIHByZWZlcnJlZCB3b3JrIGZsb3cgaXMgdG8gZm9yayB0aGUgcmVwbywKK2NyZWF0ZSBhIGJyYW5jaCBpbiB5b3VyIGZvcmtlZCByZXBvLCBkbyB0aGUgd29yaywKK2FuZCBjcmVhdGUgYSBwdWxsIHJlcXVlc3Qgb24gR2l0SHViIHRvIGludGVncmF0ZSB0aGF0IHdvcmsgYmFjayBpbnRvIHRoZSByZXBvLgorCisjIyBMaW51eCBTeXN0ZW0gUmVxdWlyZW1lbnRzCitVYnVudHUgMTQuMDQuMyBMVFMsIDE0LjEwLCAxNS4wNCwxNS4xMCwgYW5kIDE2LjA0IExUUyBoYXZlIGJlZW4gdGVzdGVkIHdpdGggdGhpcyByZXBvLgorCitUaGVzZSBhZGRpdGlvbmFsIHBhY2thZ2VzIGFyZSBuZWVkZWQgZm9yIGJ1aWxkaW5nIHRoZSBjb21wb25lbnRzIGluIHRoaXMgcmVwby4KK2BgYAorIyBEZXBlbmRlbmNpZXMgZnJvbSB0aGUgTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycyByZXBvOgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgZ2l0IGNtYWtlIGJ1aWxkLWVzc2VudGlhbCBiaXNvbiBsaWJ4MTEtZGV2IGxpYnhjYjEtZGV2CisjIEFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGZvciB0aGlzIHJlcG86CitzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJ1ZGV2LWRldiBsaWJwY2lhY2Nlc3MtZGV2IGxpYnhjYi1kcmkzLWRldiBsaWJ4Y2ItcHJlc2VudC1kZXYgbGliZ2wxLW1lc2EtZGV2IHdnZXQgYXV0b3Rvb2xzLWRldgorYGBgCisKK0lmIHlvdSBhcmUgdXNpbmcgdGhlIHNhbXBsZSBJbnRlbCBWdWxrYW4gZHJpdmVyIGluIHRoaXMgcmVwbywgeW91IHdpbGwgaGF2ZSB0byBlbnN1cmUgdGhhdAordGhlIERSSTMgZXh0ZW5zaW9uIGlzIGFjdGl2ZSBpbiB5b3VyIFggU2VydmVyLgorRm9sbG93IHRoZQorW0RSSTMgSW5zdHJ1Y3Rpb25zXShkcmkzLm1kKQordG8gcHJlcGFyZSB5b3VyIFggU2VydmVyLgorCisjIyBDbG9uZSB0aGUgUmVwb3NpdG9yeQorCitOb3RlIHRoYXQgdGhlIFZ1bGthbi1Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzIHJlcG8gY29udGVudCBpcyBpbmNsdWRlZCB3aXRoaW4gdGhlIFZ1bGthblRvb2xzIHJlcG8uCisKK1RvIGNyZWF0ZSB5b3VyIGxvY2FsIGdpdCByZXBvc2l0b3J5IG9mIFZ1bGthblRvb2xzOgorYGBgCitjZCBZT1VSX0RFVl9ESVJFQ1RPUlkKK2dpdCBjbG9uZSBnaXRAZ2l0aHViLmNvbTpMdW5hckcvVnVsa2FuVG9vbHMuZ2l0CitjZCBWdWxrYW5Ub29scworIyBUaGlzIHdpbGwgZmV0Y2ggYW5kIGJ1aWxkIGdsc2xhbmcgYW5kIHNwcml2LXRvb2xzCisjIE9uIExpbnV4LCBpdCB3aWxsIGFsc28gZmV0Y2ggYW5kIGJ1aWxkIEx1bmFyR0xBU1MKKy4vdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuc2ggICAgICAgICAjIGxpbnV4CisuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLmJhdCAtLWFsbCAgIyB3aW5kb3dzCitgYGAKKworIyMgTGludXggQnVpbGQKKworVGhpcyBidWlsZCBwcm9jZXNzIGJ1aWxkcyB0aGUgaWNkLCB2a3RyYWNlIGFuZCB0aGUgTFZMIHRlc3RzLgorCitFeGFtcGxlIGRlYnVnIGJ1aWxkOgorYGBgCitjZCBZT1VSX0RFVl9ESVJFQ1RPUlkvVnVsa2FuVG9vbHMgICMgY2QgdG8gdGhlIHJvb3Qgb2YgdGhlIFZ1bGthblRvb2xzIGdpdCByZXBvc2l0b3J5CitjbWFrZSAtSC4gLUJkYnVpbGQgLURDTUFLRV9CVUlMRF9UWVBFPURlYnVnCitjZCBkYnVpbGQKK21ha2UKK2BgYAorCisjIyBXaW5kb3dzIFN5c3RlbSBSZXF1aXJlbWVudHMKKworV2luZG93cyA3KyB3aXRoIGFkZGl0aW9uYWwgcmVxdWlyZWQgc29mdHdhcmUgcGFja2FnZXM6CisKKy0gTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxMyBQcm9mZXNzaW9uYWwuICBOb3RlOiBpdCBpcyBwb3NzaWJsZSB0aGF0IGxlc3Nlci9vbGRlciB2ZXJzaW9ucyBtYXkgd29yaywgYnV0IHRoYXQgaGFzIG5vdCBiZWVuIHRlc3RlZC4KKy0gQ01ha2UgKGZyb20gaHR0cDovL3d3dy5jbWFrZS5vcmcvZG93bmxvYWQvKS4gIE5vdGVzOgorICAtIEluIG9yZGVyIHRvIGJ1aWxkIHRoZSBWa1RyYWNlIHRvb2xzLCB5b3UgbmVlZCBhdCBsZWFzdCB2ZXJzaW9uIDMuMC4KKyAgLSBUZWxsIHRoZSBpbnN0YWxsZXIgdG8gIkFkZCBDTWFrZSB0byB0aGUgc3lzdGVtIFBBVEgiIGVudmlyb25tZW50IHZhcmlhYmxlLgorLSBQeXRob24gMyAoZnJvbSBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkcykuICBOb3RlczoKKyAgLSBTZWxlY3QgdG8gaW5zdGFsbCB0aGUgb3B0aW9uYWwgc3ViLXBhY2thZ2UgdG8gYWRkIFB5dGhvbiB0byB0aGUgc3lzdGVtIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCisgIC0gTmVlZCBweXRob24zLjMgb3IgbGF0ZXIgdG8gZ2V0IHRoZSBXaW5kb3dzIHB5LmV4ZSBsYXVuY2hlciB0aGF0IGlzIHVzZWQgdG8gZ2V0IHB5dGhvbjMgcmF0aGVyIHRoYW4gcHl0aG9uMiBpZiBib3RoIGFyZSBpbnN0YWxsZWQgb24gV2luZG93cworLSBHaXQgKGZyb20gaHR0cDovL2dpdC1zY20uY29tL2Rvd25sb2FkL3dpbikuCisgIC0gTm90ZTogSWYgeW91IHVzZSBDeWd3aW4sIHlvdSBjYW4gbm9ybWFsbHkgdXNlIEN5Z3dpbidzICJnaXQuZXhlIi4gIEhvd2V2ZXIsIGluIG9yZGVyIHRvIHVzZSB0aGUgInVwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLmJhdCIgc2NyaXB0LCB5b3UgbXVzdCBoYXZlIHRoaXMgdmVyc2lvbi4KKyAgLSBUZWxsIHRoZSBpbnN0YWxsZXIgdG8gYWxsb3cgaXQgdG8gYmUgdXNlZCBmb3IgIkRldmVsb3BlciBQcm9tcHQiIGFzIHdlbGwgYXMgIkdpdCBCYXNoIi4KKyAgLSBUZWxsIHRoZSBpbnN0YWxsZXIgdG8gdHJlYXQgbGluZSBlbmRpbmdzICJhcyBpcyIgKGkuZS4gYm90aCBET1MgYW5kIFVuaXgtc3R5bGUgbGluZSBlbmRpbmdzKS4KKy0gZ2xzbGFuZyBpcyByZXF1aXJlZCBmb3IgdGVzdHMuCisgIC0gWW91IGNhbiBkb3dubG9hZCBhbmQgY29uZmlndXJlIGl0IChpbiBhIHBlZXIgZGlyZWN0b3J5KSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsc2xhbmcvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kCisgIC0gQSB3aW5kb3dzIGJhdGNoIGZpbGUgaGFzIGJlZW4gaW5jbHVkZWQgdGhhdCB3aWxsIHB1bGwgYW5kIGJ1aWxkIHRoZSBjb3JyZWN0IHZlcnNpb24uICBSdW4gaXQgZnJvbSBEZXZlbG9wZXIgQ29tbWFuZCBQcm9tcHQgZm9yIFZTMjAxMyBsaWtlIHNvOgorICAgIC0gdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuYmF0IC0tYnVpbGQtZ2xzbGFuZworCitPcHRpb25hbCBzb2Z0d2FyZSBwYWNrYWdlczoKKworLSBDeWd3aW4gKGZyb20gaHR0cHM6Ly93d3cuY3lnd2luLmNvbS8pLiAgTm90ZXM6CisgIC0gQ3lnd2luIHByb3ZpZGVzIHNvbWUgTGludXgtbGlrZSB0b29scywgd2hpY2ggYXJlIHZhbHVhYmxlIGZvciBvYnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLCBhbmQgcnVubmluZyBDTWFrZS4KKyAgICBFc3BlY2lhbGx5IHZhbHVhYmxlIGFyZSB0aGUgQkFTSCBzaGVsbCBhbmQgZ2l0IHBhY2thZ2VzLgorICAtIElmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBDeWd3aW4sIHRoZXJlIGFyZSBvdGhlciBzaGVsbHMgYW5kIGVudmlyb25tZW50cyB0aGF0IGNhbiBiZSB1c2VkLgorICAgIFlvdSBjYW4gYWxzbyB1c2UgYSBHaXQgcGFja2FnZSB0aGF0IGRvZXNuJ3QgY29tZSBmcm9tIEN5Z3dpbi4KKworIyMgV2luZG93cyBCdWlsZAorCitDeWd3aW4gaXMgdXNlZCBpbiBvcmRlciB0byBvYnRhaW4gYSBsb2NhbCBjb3B5IG9mIHRoZSBHaXQgcmVwb3NpdG9yeSwgYW5kIHRvIHJ1biB0aGUgQ01ha2UgY29tbWFuZCB0aGF0IGNyZWF0ZXMgVmlzdWFsIFN0dWRpbyBmaWxlcy4gIFZpc3VhbCBTdHVkaW8gaXMgdXNlZCB0byBidWlsZCB0aGUgc29mdHdhcmUsIGFuZCB3aWxsIHJlLXJ1biBDTWFrZSBhcyBhcHByb3ByaWF0ZS4KKworVG8gYnVpbGQgYWxsIFdpbmRvd3MgdGFyZ2V0cyAoZS5nLiBpbiBhICJEZXZlbG9wZXIgQ29tbWFuZCBQcm9tcHQgZm9yIFZTMjAxMyIgd2luZG93KToKK2BgYAorY2QgVnVsa2FuVG9vbHMgICMgY2QgdG8gdGhlIHJvb3Qgb2YgdGhlIFZ1bGthblRvb2xzIGdpdCByZXBvc2l0b3J5Citta2RpciBidWlsZAorY2QgYnVpbGQKK2NtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDEyIFdpbjY0IiAuLgorYGBgCisKK0F0IHRoaXMgcG9pbnQsIHlvdSBjYW4gdXNlIFdpbmRvd3MgRXhwbG9yZXIgdG8gbGF1bmNoIFZpc3VhbCBTdHVkaW8gYnkgZG91YmxlLWNsaWNraW5nIG9uIHRoZSAiVlVMS0FOLnNsbiIgZmlsZSBpbiB0aGUgXGJ1aWxkIGZvbGRlci4gIAorT25jZSBWaXN1YWwgU3R1ZGlvIGNvbWVzIHVwLCB5b3UgY2FuIHNlbGVjdCAiRGVidWciIG9yICJSZWxlYXNlIiBmcm9tIGEgZHJvcC1kb3duIGxpc3QuICAKK1lvdSBjYW4gc3RhcnQgYSBidWlsZCB3aXRoIGVpdGhlciB0aGUgbWVudSAoQnVpbGQtPkJ1aWxkIFNvbHV0aW9uKSwgb3IgYSBrZXlib2FyZCBzaG9ydGN1dCAoQ3RybCtTaGlmdCtCKS4KK0FzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIFB5dGhvbiBzY3JpcHRzIHdpbGwgY3JlYXRlIGFkZGl0aW9uYWwgVmlzdWFsIFN0dWRpbyBmaWxlcyBhbmQgcHJvamVjdHMsCithbG9uZyB3aXRoIGFkZGl0aW9uYWwgc291cmNlIGZpbGVzLiAgCitBbGwgb2YgdGhlc2UgYXV0by1nZW5lcmF0ZWQgZmlsZXMgYXJlIHVuZGVyIHRoZSAiYnVpbGQiIGZvbGRlci4KKworVnVsa2FuIHByb2dyYW1zIG11c3QgYmUgYWJsZSB0byBmaW5kIGFuZCB1c2UgdGhlIFZ1bGthbi0xLmRsbCBsaWJyYXJ5LgorTWFrZSBzdXJlIGl0IGlzIGVpdGhlciBpbnN0YWxsZWQgaW4gdGhlIEM6XFdpbmRvd3NcU3lzdGVtMzIgZm9sZGVyLAorb3IgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaW5jbHVkZXMgdGhlIGZvbGRlciB0aGF0IGl0IGlzIGxvY2F0ZWQgaW4uCisKKyMjIyBXaW5kb3dzIDY0LWJpdCBJbnN0YWxsYXRpb24gTm90ZXMKK0lmIHlvdSBwbGFuIG9uIGNyZWF0aW5nIGEgV2luZG93cyBJbnN0YWxsIGZpbGUgKGRvbmUgaW4gdGhlIHdpbmRvd3NSdW50aW1lSW5zdGFsbGVyIHN1Yi1kaXJlY3RvcnkpIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgZm9yIGJvdGggMzItYml0IGFuZCA2NC1iaXQgV2luZG93cyBzaW5jZSBib3RoIHZlcnNpb25zIG9mIEVYRXMgYW5kIERMTHMgZXhpc3Qgc2ltdWx0YW5lb3VzbHkgb24gV2luZG93cyA2NC4KKworVG8gZG8gdGhpcywgc2ltcGx5IGNyZWF0ZSBhbmQgYnVpbGQgdGhlIHJlbGVhc2UgdmVyc2lvbnMgb2YgZWFjaCB0YXJnZXQ6CitgYGAKK2NkIFZ1bGthblRvb2xzICAjIGNkIHRvIHRoZSByb290IG9mIHRoZSBWdWxrYW4gZ2l0IHJlcG9zaXRvcnkKK21rZGlyIGJ1aWxkCitjZCBidWlsZAorY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIgV2luNjQiIC4uCittc2J1aWxkIEFMTF9CVUlMRC52Y3hwcm9qIC9wOlBsYXRmb3JtPXg2NCAvcDpDb25maWd1cmF0aW9uPVJlbGVhc2UKK21rZGlyIGJ1aWxkMzIKK2NkIGJ1aWxkMzIKK2NtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDEyIiAuLgorbXNidWlsZCBBTExfQlVJTEQudmN4cHJvaiAvcDpQbGF0Zm9ybT14ODYgL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlCitgYGAKKyMjIEFuZHJvaWQgQnVpbGQKK0luc3RhbGwgdGhlIHJlcXVpcmVkIHRvb2xzIGZvciBMaW51eCBhbmQgV2luZG93cyBjb3ZlcmVkIGFib3ZlLCB0aGVuIGFkZCB0aGUKK2ZvbGxvd2luZy4KKyMjIyBBbmRyb2lkIFN0dWRpbworLSBJbnN0YWxsIDIuMSBvciBsYXRlciB2ZXJpb24gb2YgW0FuZHJvaWQgU3R1ZGlvXShodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vZG93bmxvYWQvc3R1ZGlvL3N0YWJsZSkKKy0gRnJvbSB0aGUgIldlbGNvbWUgdG8gQW5kcm9pZCBTdHVkaW8iIHNwbGFzaCBzY3JlZW4sIGFkZCB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMgdXNpbmcgQ29uZmlndXJlID4gU0RLIE1hbmFnZXI6CisgIC0gU0RLIFRvb2xzID4gQW5kcm9pZCBOREsKKworIyMjIyBBZGQgTkRLIHRvIHBhdGgKKworT24gTGludXg6CitgYGAKK2V4cG9ydCBQQVRIPSRIT01FL0FuZHJvaWQvc2RrL25kay1idW5kbGU6JFBBVEgKK2BgYAorT24gV2luZG93czoKK2BgYAorc2V0IFBBVEg9JUxPQ0FMQVBQREFUQSVcQW5kcm9pZFxzZGtcbmRrLWJ1bmRsZTslUEFUSCUKK2BgYAorT24gT1NYOgorYGBgCitleHBvcnQgUEFUSD0kSE9NRS9MaWJyYXJ5L0FuZHJvaWQvc2RrL25kay1idW5kbGU6JFBBVEgKK2BgYAorIyMjIEFkZGl0aW9uYWwgT1NYIFN5c3RlbSBSZXF1aXJlbWVudHMKK1Rlc3RlZCBvbiBPU1ggdmVyc2lvbiAxMC4xMS40CisKKyBTZXR1cCBIb21lYnJldyBhbmQgY29tcG9uZW50cworLSBGb2xsb3cgaW5zdHJ1Y3Rpb25zIG9uIFticmV3LnNoXShodHRwOi8vYnJldy5zaCkgdG8gZ2V0IGhvbWVicmV3IGluc3RhbGxlZC4KK2BgYAorL3Vzci9iaW4vcnVieSAtZSAiJChjdXJsIC1mc1NMIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Ib21lYnJldy9pbnN0YWxsL21hc3Rlci9pbnN0YWxsKSIKK2BgYAorLSBFbnN1cmUgSG9tZWJyZXcgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIFBBVEg6CitgYGAKK2V4cG9ydCBQQVRIPS91c3IvbG9jYWwvYmluOiRQQVRICitgYGAKKy0gQWRkIHBhY2thZ2VzIHdpdGggdGhlIGZvbGxvd2luZyAobWF5IG5lZWQgcmVmaW5lbWVudCkKK2BgYAorYnJldyBpbnN0YWxsIGNtYWtlIHB5dGhvbiBweXRob24zIGdpdAorYGBgCisjIyMgQnVpbGQgc3RlcHMgZm9yIEFuZHJvaWQKK1VzZSB0aGUgZm9sbG93aW5nIHRvIGVuc3VyZSB0aGUgQW5kcm9pZCBidWlsZCB3b3Jrcy4KKyMjIyMgTGludXgKK0ZvbGxvdyB0aGUgc2V0dXAgc3RlcHMgZm9yIExpbnV4LCB0aGVuIGZyb20geW91ciB0ZXJtaW5hbDoKK2BgYAorY2QgYnVpbGQtYW5kcm9pZAorLi91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLnNoCisuL2FuZHJvaWQtZ2VuZXJhdGUuc2gKK25kay1idWlsZCAtaiAkKG5wcm9jKQorYGBgCisjIyMjIE9TWAorRm9sbG93IHRoZSBzZXR1cCBzdGVwcyBmb3IgT1NYIGFib3ZlLCB0aGVuIGZyb20geW91ciB0ZXJtaW5hbDoKK2BgYAorY2QgYnVpbGQtYW5kcm9pZAorLi91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLnNoCisuL2FuZHJvaWQtZ2VuZXJhdGUuc2gKK25kay1idWlsZCAtaiAkKHN5c2N0bCAtbiBody5uY3B1KQorYGBgCisjIyMjIFdpbmRvd3MKK0ZvbGxvdyB0aGUgc2V0dXAgc3RlcHMgZm9yIFdpbmRvd3MgYWJvdmUsIHRoZW4gZnJvbSBEZXZlbG9wZXIgQ29tbWFuZCBQcm9tcHQgZm9yIFZTMjAxMzoKK2BgYAorY2QgYnVpbGQtYW5kcm9pZAordXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5iYXQKK2FuZHJvaWQtZ2VuZXJhdGUuYmF0CituZGstYnVpbGQKK2BgYAorCisjIyBBbmRyb2lkIHVzYWdlCitUaGlzIGRvY3VtZW50YXRpb24gaXMgcHJlbGltaW5hcnkgYW5kIG5lZWRzIHRvIGJlIGJlZWZlZCB1cC4KKworU2VlIHRoZSBbdmt0cmFjZXJlcGxheS5zaF0oaHR0cHM6Ly9naXRodWIuY29tL0x1bmFyRy9WdWxrYW5Ub29scy9ibG9iL21hc3Rlci9idWlsZC1hbmRyb2lkL3ZrdHJhY2VyZXBsYXkuc2gpIGZpbGUgZm9yIGEgd29ya2luZyBleGFtcGxlIG9mIGhvdyB0byB1c2Ugdmt0cmFjZS92a3JlcGxheSBhbmQgc2NyZWVuc2hvdCBsYXllcnMuCisKK1R3byBhZGRpdGlvbmFsIHNjcmlwdHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGZhY2lsaXRhdGUgdHJhY2luZyBhbmQgcmVwbGF5aW5nIGFueSBBUEsuICBOb3RlIHRoYXQgdGhlc2UgdHdvIHNjcmlwdHMgZG8gbm90IGluc3RhbGwgYW55dGhpbmcgZm9yIHlvdSwgc28gbWFrZSBzdXJlIHlvdXIgdGFyZ2V0IEFQSywgdmt0cmFjZSwgdmt0cmFjZV9sYXllciwgYW5kIHZrcmVwbGF5IGFsbCB1c2UgdGhlIHNhbWUgQUJJLgorYGBgCisuL2NyZWF0ZV90cmFjZS5zaCAtLXNlcmlhbCAwMTIzNDU2Nzg5IC0tYWJpIGFybWVhYmktdjdhIC0tcGFja2FnZSBjb20uZXhhbXBsZS5DdWJlV2l0aExheWVycyAgLS1hY3Rpdml0eSBhbmRyb2lkLmFwcC5OYXRpdmVBY3Rpdml0eQorYWRiIGluc3RhbGwgLS1hYmkgYXJtZWFiaS12N2EKKy4vcmVwbGF5X3RyYWNlLnNoIC0tc2VyaWFsIDAxMjM0NTY3ODkgLS10cmFjZWZpbGUgY29tLmV4YW1wbGUuQ3ViZVdpdGhMYXllcnMwLnZrdHJhY2UKK2BgYAorQW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgc2NyaXB0cyBvbiBMaW51eCBhbmQgbWFjT1M6CitgYGAKKy4vYnVpbGRfdmt0cmFjZXJlcGxheS5zaAorLi92a3RyYWNlcmVwbGF5LnNoIFwKKyAtLXNlcmlhbCAxMjM0NTY3OCBcCisgLS1hYmkgYXJtZWFiaS12N2EgXAorIC0tYXBrIC4uL2RlbW9zL2FuZHJvaWQvY3ViZS13aXRoLWxheWVycy9iaW4vTmF0aXZlQWN0aXZpdHktZGVidWcuYXBrIFwKKyAtLXBhY2thZ2UgY29tLmV4YW1wbGUuQ3ViZVdpdGhMYXllcnMgXAorIC0tZnJhbWUgNTAKK2BgYAorQW5kIG9uIFdpbmRvd3M6CitgYGAKK2J1aWxkX3ZrdHJhY2VyZXBsYXkuYmF0IF4KK3ZrdHJhY2VyZXBsYXkuYmF0IF4KKyAtLXNlcmlhbCAxMjM0NTY3OCBeCisgLS1hYmkgYXJtZWFiaS12N2EgXgorIC0tYXBrIC4uXGRlbW9zXGFuZHJvaWRcY3ViZS13aXRoLWxheWVyc1xiaW5cTmF0aXZlQWN0aXZpdHktZGVidWcuYXBrIF4KKyAtLXBhY2thZ2UgY29tLmV4YW1wbGUuQ3ViZVdpdGhMYXllcnMgXgorIC0tZnJhbWUgNTAKK2BgYAorIyMjIGFwaV9kdW1wCitUbyBlbmFibGUsIG1ha2UgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIHRvIHZrX2xheWVyX3NldHRpbmdzLnR4dAorYGBgCistbHVuYXJnX2FwaV9kdW1wLmZpbGUgPSBGQUxTRQorK2x1bmFyZ19hcGlfZHVtcC5maWxlID0gVFJVRQorCistbHVuYXJnX2FwaV9kdW1wLmxvZ19maWxlbmFtZSA9IHN0ZG91dAorK2x1bmFyZ19hcGlfZHVtcC5sb2dfZmlsZW5hbWUgPSAvc2RjYXJkL0FuZHJvaWQvdmtfYXBpZHVtcC50eHQKK2BgYAorVGhlbjoKK2BgYAorYWRiIHB1c2ggdmtfbGF5ZXJfc2V0dGluZ3MudHh0IC9zZGNhcmQvQW5kcm9pZAorYGBgCitBbmQgcnVuIHlvdXIgYXBwbGljYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGxheWVyIGVuYWJsZWQ6CitgYGAKK1ZLX0xBWUVSX0xVTkFSR19hcGlfZHVtcAorYGBgCisjIyMgc2NyZWVuc2hvdAorVG8gZW5hYmxlLCBzZXQgYSBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIHRhcmdldCBmcmFtZToKK2BgYAorYWRiIHNoZWxsIHNldHByb3AgZGVidWcudnVsa2FuLnNjcmVlbnNob3QgPGZyYW1lbnVtYmVyPgorYGBgCitGb3IgcHJvZHVjdGlvbiBidWlsZHMsIGJlIHN1cmUgeW91ciBhcHBsaWNhdGlvbiBoYXMgYWNjZXNzIHRvIHJlYWQgYW5kIHdyaXRlIHRvIGV4dGVybmFsIHN0b3JhZ2UgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgdG8gQW5kcm9pZE1hbmlmZXN0LnhtbDoKK2BgYAorPCEtLSBUaGlzIGFsbG93cyB3cml0aW5nIGxvZyBmaWxlcyB0byBzZGNhcmQgLS0+Cis8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSIvPgorPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIi8+CitgYGAKK1lvdSBtYXkgYWxzbyBuZWVkIHRvIGdyYW50IGl0IGFjY2VzcyB3aXRoIHBhY2thZ2UgbWFuYWdlcjoKK2BgYAorYWRiIHNoZWxsIHBtIGdyYW50IGNvbS5leGFtcGxlLkN1YmUgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRQorYWRiIHNoZWxsIHBtIGdyYW50IGNvbS5leGFtcGxlLkN1YmUgYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UKK2BgYAorUnVuIHlvdXIgYXBwbGljYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGxheWVyIGVuYWJsZWQ6CitgYGAKK1ZLX0xBWUVSX0xVTkFSR19zY3JlZW5zaG90CitgYGAKK1Jlc3VsdCBzY3JlZW5zaG90IHdpbGwgYmUgaW46CitgYGAKKy9zZGNhcmQvQW5kcm9pZC88ZnJhbWVudW1iZXI+LnBwbQorYGBgCisjIyMgdmt0cmFjZQorVG8gcmVjb3JkIGEgdHJhY2Ugb24gQW5kcm9pZCwgZW5hYmxlIHBvcnQgZm9yd2FyZGluZyBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGhvc3Q6CitgYGAKK2FkYiByZXZlcnNlIGxvY2FsYWJzdHJhY3Q6dmt0cmFjZSB0Y3A6MzQyMDEKK2BgYAorU3RhcnQgdXAgdmt0cmFjZSBvbiB0aGUgaG9zdCBpbiBzZXJ2ZXIgbW9kZToKK2BgYAordmt0cmFjZSAtdiBmdWxsIC1vIGN1YmUudmt0cmFjZQorYGBgCitSdW4geW91ciBhcHBsaWNhdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmcgbGF5ZXIgZW5hYmxlZDoKK2BgYAorVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2UKK2BgYAorVGhlIHRyYWNlIHdpbGwgYmUgcmVjb3JkZWQgb24gdGhlIGhvc3QuCisjIyMgdmtyZXBsYXkKK1RvIHJlcGxheSBhIHRyYWNlLCBwdXNoIHRoZSB0cmFjZSB0byB5b3VyIGRldmljZQorYGBgCithZGIgcHVzaCBjdWJlLnZrdHJhY2UgL3NkY2FyZC9jdWJlLnZrdHJhY2UKK2BgYAorR3JhbnQgdmtyZXBsYXkgdGhlIGFiaWxpdHkgdG8gcmVhZCBpdAorYGBgCithZGIgc2hlbGwgcG0gZ3JhbnQgY29tLmV4YW1wbGUudmtyZXBsYXkgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRQorYWRiIHNoZWxsIHBtIGdyYW50IGNvbS5leGFtcGxlLnZrcmVwbGF5IGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFCitgYGAKK0FuZCBzdGFydCB0aGUgbmF0aXZlIGFjdGl2aXR5CitgYGAKK2FkYiBzaGVsbCBhbSBzdGFydCAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiAtYyBhbmRyb2lkLWludGVudC5jYXRlZ29yeS5MQVVOQ0ggLW4gY29tLmV4YW1wbGUudmtyZXBsYXkvYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkgLS1lcyBhcmdzICItdlwgZnVsbFwgLXRcIC9zZGNhcmQvY3ViZS52a3RyYWNlIgorYGBgCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0CmluZGV4IDgxNzYxMTYuLmQ0YjM3MzggMTAwNjQ0Ci0tLSBhL0NNYWtlTGlzdHMudHh0CisrKyBiL0NNYWtlTGlzdHMudHh0CkBAIC0yLDcgKzIsNyBAQAogIyByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGFzICR7VlVMS0FOX1NPVVJDRV9ESVJ9IGFuZAogIyB0byB0aGUgcm9vdCBiaW5hcnkgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGFzICR7VlVMS0FOX0JJTkFSWV9ESVJ9LgogY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMSkKLXByb2plY3QgKFZVTEtBTikKK3Byb2plY3QgKFZVTEtBTl9UT09MUykKICMgc2V0IChDTUFLRV9WRVJCT1NFX01BS0VGSUxFIDEpCiAKICMgVGhlIEFQSV9OQU1FIGFsbG93cyByZW5hbWluZyBidWlsZHMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggaW5zdGFsbGVkIFNES3MKQEAgLTUxLDYgKzUxLDggQEAKICAgICBpZiAoTk9UIEJVSUxEX1dTSV9YQ0JfU1VQUE9SVCBBTkQgTk9UIEJVSUxEX1dTSV9YTElCX1NVUFBPUlQgQU5EIE5PVCBCVUlMRF9XU0lfV0FZTEFORF9TVVBQT1JUIEFORCBOT1QgQlVJTERfV1NJX01JUl9TVVBQT1JUKQogICAgICAgICBzZXQoRGlzcGxheVNlcnZlciBEaXNwbGF5KQogICAgIGVuZGlmKCkKK2Vsc2VpZihDTUFLRV9TWVNURU1fTkFNRSBTVFJFUVVBTCAiRGFyd2luIikKKyAgICAjIE9ubHkgdmt0cmFjZSBpcyBzdXBwb3J0ZWQgb24gbWFjT1MKIGVsc2UoKQogICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuc3VwcG9ydGVkIFBsYXRmb3JtISIpCiBlbmRpZigpCkBAIC05MCw3ICs5Miw2IEBACiBlbHNlKCkKICAgICBvcHRpb24oRElTQUJMRV9CVUlMRF9QQVRIX0RFQ09SQVRJT04gIkRpc2FibGUgdGhlIGRlY29yYXRpb24gb2YgdGhlIGdzbGFuZyBhbmQgU1BJUlYtVG9vbHMgYnVpbGQgcGF0aCB3aXRoIE1TVkMgYnVpbGQgdHlwZSBpbmZvIiBPRkYpCiAgICAgb3B0aW9uKERJU0FCTEVfQlVJTERUR1RfRElSX0RFQ09SQVRJT04gIkRpc2FibGUgdGhlIGRlY29yYXRpb24gb2YgdGhlIGdzbGFuZyBhbmQgU1BJUlYtVG9vbHMgYnVpbGQgcGF0aCB3aXRoIHRhcmdldCBpbmZvIiBPRkYpCi0KICAgICAjIEZvciBXaW5kb3dzLCBzaW5jZSAzMi1iaXQgYW5kIDY0LWJpdCBpdGVtcyBjYW4gY28tZXhpc3QsIHdlIGJ1aWxkIGVhY2ggaW4gaXRzIG93biBidWlsZCBkaXJlY3RvcnkuCiAgICAgIyAzMi1iaXQgdGFyZ2V0IGRhdGEgZ29lcyBpbiBidWlsZDMyLCBhbmQgNjQtYml0IHRhcmdldCBkYXRhIGdvZXMgaW50byBidWlsZC4gIFNvLCBpbmNsdWRlL2xpbmsgdGhlCiAgICAgIyBhcHByb3ByaWF0ZSBkYXRhIGF0IGJ1aWxkIHRpbWUuCkBAIC0xMDksMTMgKzExMCw0MyBAQAogICAgIGVuZGlmKCkKIGVuZGlmKCkKIAotb3B0aW9uKEJVSUxEX0xPQURFUiAiQnVpbGQgbG9hZGVyIiBPTikKLW9wdGlvbihCVUlMRF9URVNUUyAiQnVpbGQgdGVzdHMiIE9OKQotb3B0aW9uKEJVSUxEX0xBWUVSUyAiQnVpbGQgbGF5ZXJzIiBPTikKLW9wdGlvbihCVUlMRF9ERU1PUyAiQnVpbGQgZGVtb3MiIE9OKQotb3B0aW9uKEJVSUxEX1ZLSlNPTiAiQnVpbGQgdmtqc29uIiBPTikKLW9wdGlvbihDVVNUT01fR0xTTEFOR19CSU5fUk9PVCAiVXNlIHRoZSB1c2VyIGRlZmluZWQgR0xTTEFOR19CSU5BUllfUk9PVCIgT0ZGKQotb3B0aW9uKENVU1RPTV9TUElSVl9UT09MU19CSU5fUk9PVCAiVXNlIHRoZSB1c2VyIGRlZmluZWQgU1BJUlZfVE9PTFNfQklOQVJZX1JPT1QiIE9GRikKK2lmIChDTUFLRV9TWVNURU1fTkFNRSBTVFJFUVVBTCAiV2luZG93cyIgT1IKKyAgICBDTUFLRV9TWVNURU1fTkFNRSBTVFJFUVVBTCAiTGludXgiKQorCisgICAgIyBUaGVzZSBhcmUgdW5jaGFuZ2VkIGZyb20gdXBzdHJlYW0gZmlsZQorICAgIG9wdGlvbihCVUlMRF9MT0FERVIgIkJ1aWxkIGxvYWRlciIgT04pCisgICAgaWYoV0lOMzIpCisgICAgICAgIG9wdGlvbihCVUlMRF9JQ0QgIkJ1aWxkIEx1bmFyRyBpbnRlbCBpY2QiIE9GRikKKyAgICBlbHNlKCkKKyAgICAgICAgb3B0aW9uKEJVSUxEX0lDRCAiQnVpbGQgTHVuYXJHIGludGVsIGljZCIgT04pCisgICAgZW5kaWYoKQorICAgIG9wdGlvbihCVUlMRF9URVNUUyAiQnVpbGQgdGVzdHMiIE9OKQorICAgIG9wdGlvbihCVUlMRF9MQVlFUlMgIkJ1aWxkIGxheWVycyIgT04pCisgICAgb3B0aW9uKEJVSUxEX0xBWUVSU1ZUICJCdWlsZCBsYXllcnN2dCIgT04pCisgICAgb3B0aW9uKEJVSUxEX0RFTU9TICJCdWlsZCBkZW1vcyIgT04pCisgICAgb3B0aW9uKEJVSUxEX1ZLVFJBQ0UgIkJ1aWxkIFZrVHJhY2UiIE9OKQorICAgIG9wdGlvbihCVUlMRF9WS0pTT04gIkJ1aWxkIHZranNvbiIgT04pCisgICAgb3B0aW9uKEJVSUxEX1ZJQSAiQnVpbGQgdmlhIiBPTikKKyAgICBvcHRpb24oQ1VTVE9NX0dMU0xBTkdfQklOX1JPT1QgIlVzZSB0aGUgdXNlciBkZWZpbmVkIEdMU0xBTkdfQklOQVJZX1JPT1QiIE9GRikKKyAgICBvcHRpb24oQ1VTVE9NX1NQSVJWX1RPT0xTX0JJTl9ST09UICJVc2UgdGhlIHVzZXIgZGVmaW5lZCBTUElSVl9UT09MU19CSU5BUllfUk9PVCIgT0ZGKQorCitlbHNlaWYgKENNQUtFX1NZU1RFTV9OQU1FIFNUUkVRVUFMICJEYXJ3aW4iKQorCisgICAgIyBPbmx5IHZrdHJhY2UgZW5hYmxlIGZvciBtYWNPUworICAgIG9wdGlvbihCVUlMRF9WS1RSQUNFIE9OKQorICAgIG9wdGlvbihCVUlMRF9MT0FERVIgT0ZGKQorICAgIG9wdGlvbihCVUlMRF9JQ0QgT0ZGKQorICAgIG9wdGlvbihCVUlMRF9URVNUUyBPRkYpCisgICAgb3B0aW9uKEJVSUxEX0xBWUVSUyBPRkYpCisgICAgb3B0aW9uKEJVSUxEX0xBWUVSU1ZUIE9GRikKKyAgICBvcHRpb24oQlVJTERfVktUUkFDRVZJRVdFUiBPRkYpCisgICAgb3B0aW9uKEJVSUxEX0RFTU9TIE9GRikKKyAgICBvcHRpb24oQlVJTERfVktKU09OIE9GRikKKyAgICBvcHRpb24oQlVJTERfVklBIE9GRikKKyAgICBvcHRpb24oQlVJTERfVktUUkFDRV9MQVlFUiBPRkYpCisgICAgb3B0aW9uKEJVSUxEX1ZLVFJBQ0VfUkVQTEFZIE9GRikKKworZW5kaWYoKQogCiAjQ2hvb3NlIG5hdHVyYWwgZGVmYXVsdCBwYXRocyBmb3IgZ2xzbGFuZyBhbmQgU1BJUlYtVG9vbHMgYmluYXJpZXMgdG8gc3VwcG9ydCBjdXN0b20gZGVmaW5pdGlvbiBieSB0aGUgdXNlciBvbiB0aGUgQ01ha2UgY29tbWFuZCBsaW5lIG9yIGluIHRoZSBHVUkKIHNldChHTFNMQU5HX0JJTkFSWV9ST09UICIke0NNQUtFX0JJTkFSWV9ESVJ9Ly4uL2dsc2xhbmciIENBQ0hFIFNUUklORyAiVXNlciBkZWZpbmVkIHBhdGggdG8gdGhlIGdsc2xhbmcgYmluYXJpZXMgZm9yIHRoaXMgcHJvamVjdCIpCkBAIC0xOTcsMjcgKzIyOCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RVhURVJOQUxfU09VUkNFX1JPT1R9L3NvdXJjZS9zcGlydi10b29scy9leHRlcm5hbC9pbmNsdWRlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9DICJQYXRoIHRvIHNwaXJ2LXRvb2xzL2xpYnNwaXJ2LmgiKQogCi1maW5kX2xpYnJhcnkoR0xTTEFOR19MSUIgTkFNRVMgZ2xzbGFuZworZmluZF9wYXRoKEpTT05DUFBfSU5DTFVERV9ESVIganNvbi9qc29uLmggSElOVFMgIiR7RVhURVJOQUxfU09VUkNFX1JPT1R9L2pzb25jcHAvZGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke0VYVEVSTkFMX1NPVVJDRV9ST09UfS9Kc29uQ3BwL2Rpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFWFRFUk5BTF9TT1VSQ0VfUk9PVH0vSnNvbkNQUC9kaXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RVhURVJOQUxfU09VUkNFX1JPT1R9L0pTT05DUFAvZGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2pzb25jcHAvZGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPQyAiUGF0aCB0byBqc29uY3BwL2Rpc3QvanNvbi9qc29uLmgiKQorCitmaW5kX3BhdGgoSlNPTkNQUF9TT1VSQ0VfRElSIGpzb25jcHAuY3BwIEhJTlRTICIke0VYVEVSTkFMX1NPVVJDRV9ST09UfS9qc29uY3BwL2Rpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFWFRFUk5BTF9TT1VSQ0VfUk9PVH0vSnNvbkNwcC9kaXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RVhURVJOQUxfU09VUkNFX1JPT1R9L0pzb25DUFAvZGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke0VYVEVSTkFMX1NPVVJDRV9ST09UfS9KU09OQ1BQL2Rpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9qc29uY3BwL2Rpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET0MgIlBhdGggdG8ganNvbmNwcC9kaXN0L2pzb24uY3BwIikKKworICAgIGZpbmRfbGlicmFyeShHTFNMQU5HX0xJQiBOQU1FUyBnbHNsYW5nCisgICAgICAgIEhJTlRTICR7R0xTTEFOR19TRUFSQ0hfUEFUSH0gKQorCisgICAgZmluZF9saWJyYXJ5KE9HTENvbXBpbGVyX0xJQiBOQU1FUyBPR0xDb21waWxlcgorICAgICAgICBISU5UUyAke0dMU0xBTkdfU0VBUkNIX1BBVEh9ICkKKworICAgIGZpbmRfbGlicmFyeShPU0RlcGVuZGVudF9MSUIgTkFNRVMgT1NEZXBlbmRlbnQKKyAgICAgICAgSElOVFMgJHtHTFNMQU5HX1NFQVJDSF9QQVRIfSApCisKKyAgICBmaW5kX2xpYnJhcnkoSExTTF9MSUIgTkFNRVMgSExTTAorICAgICAgICBISU5UUyAke0dMU0xBTkdfU0VBUkNIX1BBVEh9ICkKKworICAgIGZpbmRfbGlicmFyeShTUElSVl9MSUIgTkFNRVMgU1BJUlYKKyAgICAgICAgSElOVFMgJHtHTFNMQU5HX1NFQVJDSF9QQVRIfSApCisKKyAgICBmaW5kX2xpYnJhcnkoU1BJUlZfUkVNQVBQRVJfTElCIE5BTUVTIFNQVlJlbWFwcGVyCiAgICAgICAgICAgICAgSElOVFMgJHtHTFNMQU5HX1NFQVJDSF9QQVRIfSApCiAKLWZpbmRfbGlicmFyeShPR0xDb21waWxlcl9MSUIgTkFNRVMgT0dMQ29tcGlsZXIKLSAgICAgICAgICAgICBISU5UUyAke0dMU0xBTkdfU0VBUkNIX1BBVEh9ICkKLQotZmluZF9saWJyYXJ5KE9TRGVwZW5kZW50X0xJQiBOQU1FUyBPU0RlcGVuZGVudAotICAgICAgICAgICAgIEhJTlRTICR7R0xTTEFOR19TRUFSQ0hfUEFUSH0gKQotCi1maW5kX2xpYnJhcnkoSExTTF9MSUIgTkFNRVMgSExTTAotICAgICAgICAgICAgIEhJTlRTICR7R0xTTEFOR19TRUFSQ0hfUEFUSH0gKQotCi1maW5kX2xpYnJhcnkoU1BJUlZfTElCIE5BTUVTIFNQSVJWCi0gICAgICAgICAgICAgSElOVFMgJHtHTFNMQU5HX1NFQVJDSF9QQVRIfSApCi0KLWZpbmRfbGlicmFyeShTUElSVl9SRU1BUFBFUl9MSUIgTkFNRVMgU1BWUmVtYXBwZXIKLSAgICAgICAgICAgICBISU5UUyAke0dMU0xBTkdfU0VBUkNIX1BBVEh9ICkKLQotZmluZF9saWJyYXJ5KFNQSVJWX1RPT0xTX0xJQiBOQU1FUyBTUElSVi1Ub29scworICAgIGZpbmRfbGlicmFyeShTUElSVl9UT09MU19MSUIgTkFNRVMgU1BJUlYtVG9vbHMKICAgICAgICAgICAgICBISU5UUyAke1NQSVJWX1RPT0xTX1NFQVJDSF9QQVRIfSApCiAKKyAgICBmaW5kX2xpYnJhcnkoSlNPTkNQUF9MSUIgTkFNRVMganNvbmNwcAorICAgICAgICAgICAgIEhJTlRTICR7SlNPTkNQUF9TRUFSQ0hfUEFUSH0gKQorCiBpZiAoV0lOMzIpCiAgICAgYWRkX2xpYnJhcnkoZ2xzbGFuZyAgICAgU1RBVElDIElNUE9SVEVEKQogICAgIGFkZF9saWJyYXJ5KE9HTENvbXBpbGVyIFNUQVRJQyBJTVBPUlRFRCkKQEAgLTIyNyw2ICsyNzUsNyBAQAogICAgIGFkZF9saWJyYXJ5KFNQVlJlbWFwcGVyICAgICAgIFNUQVRJQyBJTVBPUlRFRCkKICAgICBhZGRfbGlicmFyeShMb2FkZXIgICAgICBTVEFUSUMgSU1QT1JURUQpCiAgICAgYWRkX2xpYnJhcnkoU1BJUlYtVG9vbHMgU1RBVElDIElNUE9SVEVEKQorICAgIGFkZF9saWJyYXJ5KGpzb25jcHAgICAgIFNUQVRJQyBJTVBPUlRFRCkKIAogICAgIGZpbmRfbGlicmFyeShHTFNMQU5HX0RMSUIgTkFNRVMgZ2xzbGFuZ2QKICAgICAgICAgICAgICAgICAgSElOVFMgJHtHTFNMQU5HX0RFQlVHX1NFQVJDSF9QQVRIfSApCkBAIC0yNDIsMTkgKzI5MSwyMSBAQAogICAgICAgICAgICAgICAgICBISU5UUyAke0dMU0xBTkdfREVCVUdfU0VBUkNIX1BBVEh9ICkKICAgICBmaW5kX2xpYnJhcnkoU1BJUlZfVE9PTFNfRExJQiBOQU1FUyBTUElSVi1Ub29scwogICAgICAgICAgICAgICAgICBISU5UUyAke1NQSVJWX1RPT0xTX0RFQlVHX1NFQVJDSF9QQVRIfSApCisgICAgZmluZF9saWJyYXJ5KEpTT05DUFBfRExJQiBOQU1FUyBqc29uY3BwCisgICAgICAgICAgICAgICAgIEhJTlRTICR7SlNPTkNQUF9ERUJVR19TRUFSQ0hfUEFUSH0gKQogCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGdsc2xhbmcgUFJPUEVSVElFUwotICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OICAgICAgICIke0dMU0xBTkdfTElCfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRyAiJHtHTFNMQU5HX0RMSUJ9IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JURURfTE9DQVRJT04gICAgICAgIiR7R0xTTEFOR19MSUJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRyAiJHtHTFNMQU5HX0RMSUJ9IikKICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoT0dMQ29tcGlsZXIgUFJPUEVSVElFUwotICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OICAgICAgICIke09HTENvbXBpbGVyX0xJQn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JURURfTE9DQVRJT05fREVCVUcgIiR7T0dMQ29tcGlsZXJfRExJQn0iKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTiAgICAgICAiJHtPR0xDb21waWxlcl9MSUJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRyAiJHtPR0xDb21waWxlcl9ETElCfSIpCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKE9TRGVwZW5kZW50IFBST1BFUlRJRVMKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTiAgICAgICAiJHtPU0RlcGVuZGVudF9MSUJ9IgotICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHICIke09TRGVwZW5kZW50X0RMSUJ9IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JURURfTE9DQVRJT04gICAgICAgIiR7T1NEZXBlbmRlbnRfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JURURfTE9DQVRJT05fREVCVUcgIiR7T1NEZXBlbmRlbnRfRExJQn0iKQogICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhITFNMIFBST1BFUlRJRVMKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTiAgICAgICAiJHtITFNMX0xJQn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JURURfTE9DQVRJT05fREVCVUcgIiR7SExTTF9ETElCfSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OICAgICAgICIke0hMU0xfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JURURfTE9DQVRJT05fREVCVUcgIiR7SExTTF9ETElCfSIpCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFNQSVJWIFBST1BFUlRJRVMKICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTiAgICAgICAiJHtTUElSVl9MSUJ9IgogICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHICIke1NQSVJWX0RMSUJ9IikKQEAgLTI2Miw4ICszMTMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTiAgICAgICAiJHtTUElSVl9SRU1BUFBFUl9MSUJ9IgogICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OX0RFQlVHICIke1NQSVJWX1JFTUFQUEVSX0RMSUJ9IikKICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoU1BJUlYtVG9vbHMgUFJPUEVSVElFUwotICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OICAgICAgICIke1NQSVJWX1RPT0xTX0xJQn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JURURfTE9DQVRJT05fREVCVUcgIiR7U1BJUlZfVE9PTFNfRExJQn0iKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTiAgICAgICAiJHtTUElSVl9UT09MU19MSUJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRyAiJHtTUElSVl9UT09MU19ETElCfSIpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGpzb25jcHAgUFJPUEVSVElFUworICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEVEX0xPQ0FUSU9OICAgICAgICIke0pTT05DUFBfTElCfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRFRF9MT0NBVElPTl9ERUJVRyAiJHtKU09OQ1BQX0RMSUJ9IikKIAogICAgIHNldCAoR0xTTEFOR19MSUJSQVJJRVMgZ2xzbGFuZyBPR0xDb21waWxlciBPU0RlcGVuZGVudCBITFNMIFNQSVJWIFNQVlJlbWFwcGVyKQogICAgIHNldCAoU1BJUlZfVE9PTFNfTElCUkFSSUVTIFNQSVJWLVRvb2xzKQpAQCAtMjcyLDYgKzMyNiwxNSBAQAogICAgIHNldCAoU1BJUlZfVE9PTFNfTElCUkFSSUVTICR7U1BJUlZfVE9PTFNfTElCfSkKIGVuZGlmKCkKIAoraWYgKEJVSUxEX0lDRCkKKyAgICAjIEhhcmQgY29kZSBvdXIgTHVuYXJHTEFTUyBwYXRoIGZvciBub3cKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KExVTkFSR0xBU1NfUFJFRklYIGV4dGVybmFsL0x1bmFyR0xBU1MgQUJTT0xVVEUpCisKKyAgICBpZihOT1QgRVhJU1RTICR7TFVOQVJHTEFTU19QUkVGSVh9KQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJOZWNlc3NhcnkgTHVuYXJHTEFTUyBjb21wb25lbnRzIGRvIG5vdCBleGlzdDogIiAke0xVTkFSR0xBU1NfUFJFRklYfSkKKyAgICBlbmRpZigpCitlbmRpZigpCisKIHNldCAoUFlUSE9OX0NNRCAke1BZVEhPTl9FWEVDVVRBQkxFfSkKIAogaWYoTk9UIFdJTjMyKQpAQCAtMjk2LDExICszNTksMTYgQEAKIGVuZGlmKCkKIAogIyBsb2FkZXI6IEdlbmVyaWMgVlVMS0FOIElDRCBsb2FkZXIKKyMgaWNkOiBEZXZpY2UgZGVwZW5kZW50IChERCkgVlVMS0FOIGNvbXBvbmVudHMKICMgdGVzdHM6IFZVTEtBTiB0ZXN0cwogaWYoQlVJTERfTE9BREVSKQogICAgIGFkZF9zdWJkaXJlY3RvcnkobG9hZGVyKQogZW5kaWYoKQogCitpZihCVUlMRF9JQ0QpCisgICAgYWRkX3N1YmRpcmVjdG9yeShpY2QpCitlbmRpZigpCisKIGlmKEJVSUxEX1RFU1RTKQogICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdHMpCiBlbmRpZigpCkBAIC0zMDksMTAgKzM3NywyMiBAQAogICAgIGFkZF9zdWJkaXJlY3RvcnkobGF5ZXJzKQogZW5kaWYoKQogCitpZihCVUlMRF9MQVlFUlNWVCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KGxheWVyc3Z0KQorZW5kaWYoKQorCiBpZihCVUlMRF9ERU1PUykKICAgICBhZGRfc3ViZGlyZWN0b3J5KGRlbW9zKQogZW5kaWYoKQogCitpZihCVUlMRF9WS1RSQUNFKQorICAgIGFkZF9zdWJkaXJlY3Rvcnkodmt0cmFjZSkKK2VuZGlmKCkKKwogaWYoQlVJTERfVktKU09OKQogICAgIGFkZF9zdWJkaXJlY3RvcnkobGlicy92a2pzb24pCiBlbmRpZigpCisKK2lmKEJVSUxEX1ZJQSkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHZpYSkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL0NPUFlSSUdIVC50eHQgYi9DT1BZUklHSFQudHh0CmluZGV4IGEzMGVlOWUuLjBjOTQ4NGYgMTAwNjQ0Ci0tLSBhL0NPUFlSSUdIVC50eHQKKysrIGIvQ09QWVJJR0hULnR4dApAQCAtMSw0ICsxLDQgQEAKLVRoaXMgZmlsZSBjb250YWlucyBvdGhlciBsaWNlbnNlcyBhbmQgdGhlaXIgY29weXJpZ2h0cyB0aGF0IGFwcGVhciBpbiB0aGlzDQor77u/VGhpcyBmaWxlIGNvbnRhaW5zIG90aGVyIGxpY2Vuc2VzIGFuZCB0aGVpciBjb3B5cmlnaHRzIHRoYXQgYXBwZWFyIGluIHRoaXMNCiByZXBvc2l0b3J5IGJlc2lkZXMgQXBhY2hlIDIuMCBsaWNlbnNlLg0KIA0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KQEAgLTEyOSwzICsxMjksNjIgQEAKIC8vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQogLy8vIFRIRSBTT0ZUV0FSRS4NCiAvLy8NCisNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCitUaGUgSnNvbkNwcCBsaWJyYXJ5J3Mgc291cmNlIGNvZGUsIGluY2x1ZGluZyBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiwgDQordGVzdHMgYW5kIGRlbW9uc3RyYXRpb24gYXBwbGljYXRpb25zLCBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZw0KK2NvbmRpdGlvbnMuLi4NCisNCitUaGUgYXV0aG9yIChCYXB0aXN0ZSBMZXBpbGxldXIpIGV4cGxpY2l0bHkgZGlzY2xhaW1zIGNvcHlyaWdodCBpbiBhbGwgDQoranVyaXNkaWN0aW9ucyB3aGljaCByZWNvZ25pemUgc3VjaCBhIGRpc2NsYWltZXIuIEluIHN1Y2gganVyaXNkaWN0aW9ucywgDQordGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLg0KKw0KK0luIGp1cmlzZGljdGlvbnMgd2hpY2ggZG8gbm90IHJlY29nbml6ZSBQdWJsaWMgRG9tYWluIHByb3BlcnR5IChlLmcuIEdlcm1hbnkgYXMgb2YNCisyMDEwKSwgdGhpcyBzb2Z0d2FyZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBieSBCYXB0aXN0ZSBMZXBpbGxldXIsIGFuZCBpcw0KK3JlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIExpY2Vuc2UgKHNlZSBiZWxvdykuDQorDQorSW4ganVyaXNkaWN0aW9ucyB3aGljaCByZWNvZ25pemUgUHVibGljIERvbWFpbiBwcm9wZXJ0eSwgdGhlIHVzZXIgb2YgdGhpcyANCitzb2Z0d2FyZSBtYXkgY2hvb3NlIHRvIGFjY2VwdCBpdCBlaXRoZXIgYXMgMSkgUHVibGljIERvbWFpbiwgMikgdW5kZXIgdGhlIA0KK2NvbmRpdGlvbnMgb2YgdGhlIE1JVCBMaWNlbnNlIChzZWUgYmVsb3cpLCBvciAzKSB1bmRlciB0aGUgdGVybXMgb2YgZHVhbCANCitQdWJsaWMgRG9tYWluL01JVCBMaWNlbnNlIGNvbmRpdGlvbnMgZGVzY3JpYmVkIGhlcmUsIGFzIHRoZXkgY2hvb3NlLg0KKw0KK1RoZSBNSVQgTGljZW5zZSBpcyBhYm91dCBhcyBjbG9zZSB0byBQdWJsaWMgRG9tYWluIGFzIGEgbGljZW5zZSBjYW4gZ2V0LCBhbmQgaXMNCitkZXNjcmliZWQgaW4gY2xlYXIsIGNvbmNpc2UgdGVybXMgYXQ6DQorDQorICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZQ0KKyAgIA0KK1RoZSBmdWxsIHRleHQgb2YgdGhlIE1JVCBMaWNlbnNlIGZvbGxvd3M6DQorDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgQmFwdGlzdGUgTGVwaWxsZXVyDQorDQorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCitvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbg0KK2ZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQNCityZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwNCittb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMNCitvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQorDQorVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUNCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCisNCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YNCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMNCitCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4NCitBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTg0KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUNCitTT0ZUV0FSRS4NCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisoRU5EIExJQ0VOU0UgVEVYVCkNCisNCitUaGUgTUlUIGxpY2Vuc2UgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGggdGhlIEdQTCBhbmQgY29tbWVyY2lhbA0KK3NvZnR3YXJlLCBhZmZvcmRpbmcgb25lIGFsbCBvZiB0aGUgcmlnaHRzIG9mIFB1YmxpYyBEb21haW4gd2l0aCB0aGUNCittaW5vciBudWlzYW5jZSBvZiBiZWluZyByZXF1aXJlZCB0byBrZWVwIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlDQorYW5kIGxpY2Vuc2UgdGV4dCBpbiB0aGUgc291cmNlIGNvZGUuIE5vdGUgYWxzbyB0aGF0IGJ5IGFjY2VwdGluZyB0aGUNCitQdWJsaWMgRG9tYWluICJsaWNlbnNlIiB5b3UgY2FuIHJlLWxpY2Vuc2UgeW91ciBjb3B5IHVzaW5nIHdoYXRldmVyDQorbGljZW5zZSB5b3UgbGlrZS4NCisNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmRpZmYgLS1naXQgYS9MdW5hckdMQVNTL0NvcmUvVG9wVG9Cb3R0b20uY3BwIGIvTHVuYXJHTEFTUy9Db3JlL1RvcFRvQm90dG9tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzhhMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvTHVuYXJHTEFTUy9Db3JlL1RvcFRvQm90dG9tLmNwcApAQCAtMCwwICsxLDM1MiBAQAorLy89PT0tIFRvcFRvQm90dG9tLmNwcCAtIFRyYW5zbGF0ZSBUb3AgSVIgdG8gQm90dG9tIElSIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMdW5hckdMQVNTOiBBbiBPcGVuIE1vZHVsYXIgU2hhZGVyIENvbXBpbGVyIEFyY2hpdGVjdHVyZQorLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgTHVuYXJHLCBJbmMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAKKy8vICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworLy8gICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorLy8gICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTHVuYXJHIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKy8vICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKy8vIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKy8vIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKy8vIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKy8vIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLy8gTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKy8vIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBdXRob3I6IEpvaG4gS2Vzc2VuaWNoLCBMdW5hckcKKy8vCisvLyBUcmFuc2xhdGUgVG9wIElSIHRvIEJvdHRvbSBJUgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIExMVk0gaW5jbHVkZXMKKyNwcmFnbWEgd2FybmluZyhwdXNoLCAxKQorI2luY2x1ZGUgImxsdm0vQXNzZW1ibHkvUHJpbnRNb2R1bGVQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVmVyaWZpZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisKKy8vIEx1bmFyR0xBU1MgaW5jbHVkZXMKKyNpbmNsdWRlICJFeGNlcHRpb25zLmgiCisjaW5jbHVkZSAiQmFja2VuZC5oIgorI2luY2x1ZGUgIlByaXZhdGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiT3B0aW9ucy5oIgorCisvLyBMdW5hckdMQVNTIFBhc3NlcworI2luY2x1ZGUgIlBhc3Nlcy9QYXNzZXMuaCIKKworCit2b2lkIGdsYTo6UHJpdmF0ZU1hbmFnZXI6OnRyYW5zbGF0ZVRvcFRvQm90dG9tKCkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgICB1bnNpZ25lZCBpbnQgb2xkRm9ybWF0ID0gX3NldF9vdXRwdXRfZm9ybWF0KF9UV09fRElHSVRfRVhQT05FTlQpOworI2VuZGlmCisKKyAgICBydW5MTFZNT3B0aW1pemF0aW9uczEoKTsKKworI2lmZGVmIF9XSU4zMgorICAgIF9zZXRfb3V0cHV0X2Zvcm1hdChvbGRGb3JtYXQpOworI2VuZGlmCisKKyAgICBpbnQgaW5uZXJBb1MsIG91dGVyU29BOworICAgIGJhY2tFbmQtPmdldFJlZ2lzdGVyRm9ybShvdXRlclNvQSwgaW5uZXJBb1MpOworICAgIGlmIChvdXRlclNvQSAhPSAxKQorICAgICAgICBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIlNvQSBpbiBtaWRkbGUgZW5kOiAiLCBvdXRlclNvQSk7CisgICAgaWYgKGlubmVyQW9TICE9IDQgJiYgaW5uZXJBb1MgIT0gMSkKKyAgICAgICAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJBb1Mgb3RoZXIgdGhhbiBzaXplIDQgb3IgMSBpbiBtaWRkbGUgZW5kOiAiLCBpbm5lckFvUyk7Cit9CisKK3ZvaWQgZ2xhOjpQcml2YXRlTWFuYWdlcjo6ZHVtcChjb25zdCBjaGFyICpoZWFkaW5nKQoreworICAgIGxsdm06OmVycnMoKSA8PCBoZWFkaW5nOworICAgIG1vZHVsZS0+ZHVtcCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUnVuT25Nb2R1bGUobGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlciYgcG0sIGxsdm06Ok1vZHVsZSogbSkKK3sKKyAgICBwbS5kb0luaXRpYWxpemF0aW9uKCk7CisgICAgZm9yIChsbHZtOjpNb2R1bGU6Oml0ZXJhdG9yIGYgPSBtLT5iZWdpbigpLCBlID0gbS0+ZW5kKCk7IGYgIT0gZTsgKytmKQorICAgICAgICBwbS5ydW4oKmYpOworICAgIHBtLmRvRmluYWxpemF0aW9uKCk7Cit9CisKK3N0YXRpYyBib29sIEhhc0NvbnRyb2xGbG93KGxsdm06Ok1vZHVsZSogbSkKK3sKKyAgICBmb3IgKGxsdm06Ok1vZHVsZTo6aXRlcmF0b3IgZiA9IG0tPmJlZ2luKCksIGUgPSBtLT5lbmQoKTsgZiAhPSBlOyArK2YpIHsKKyAgICAgICAgZm9yIChsbHZtOjpGdW5jdGlvbjo6aXRlcmF0b3IgYiA9IGYtPmJlZ2luKCksIGJlID0gZi0+ZW5kKCk7IGIgIT0gYmU7ICsrYikgeworICAgICAgICAgICAgaWYgKGItPmdldFRlcm1pbmF0b3IoKS0+Z2V0TnVtU3VjY2Vzc29ycygpID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gVmVyaWZ5IGVhY2ggZnVuY3Rpb24KK3N0YXRpYyBpbmxpbmUgdm9pZCBWZXJpZnlNb2R1bGUobGx2bTo6TW9kdWxlKiBtb2R1bGUpCit7CisjaWZuZGVmIE5ERUJVRworCisgICAgbGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlciB2ZXJpZmllcihtb2R1bGUpOworICAgIHZlcmlmaWVyLmFkZChsbHZtOjpjcmVhdGVWZXJpZmllclBhc3MoKSk7CisgICAgUnVuT25Nb2R1bGUodmVyaWZpZXIsIG1vZHVsZSk7CisKKyNlbmRpZiAvLyBOREVCVUcKK30KKwordm9pZCBnbGE6OlByaXZhdGVNYW5hZ2VyOjpydW5MTFZNT3B0aW1pemF0aW9uczEoKQoreworICAgIFZlcmlmeU1vZHVsZShtb2R1bGUpOworCisgICAgLy8gVE9ETzogZ2VuZXJhdGUgY29kZSBwZXJmb3JtYW5jZTogV2hlbiB3ZSBoYXZlIGJhY2tlbmQgc3VwcG9ydCBmb3Igc2h1ZmZsZXMsIG9yIHdlIGNhbm9uaWNhbGl6ZQorICAgIC8vIHNodWZmbGVzIGludG8gbXVsdGlpbnNlcnRzLCB3ZSBjYW4gcmVwbGFjZSB0aGUgSW5zdFNpbXBsaWZ5IHBhc3NlcyB3aXRoCisgICAgLy8gSW5zdENvbWJpbmUgcGFzc2VzLgorCisgICAgLy8gRmlyc3QsIGRvIHNvbWUgZ2xvYmFsIChtb2R1bGUtbGV2ZWwpIG9wdGltaXphdGlvbnMsIHdoaWNoIGNhbiBmcmVlIHVwCisgICAgLy8gZnVuY3Rpb24gcGFzc2VzIHRvIGRvIG1vcmUuCisgICAgbGx2bTo6UGFzc01hbmFnZXIgZ2xvYmFsUE07CisgICAgZ2xvYmFsUE0uYWRkKGxsdm06OmNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MoKSk7CisgICAgZ2xvYmFsUE0uYWRkKGxsdm06OmNyZWF0ZUlQU0NDUFBhc3MoKSk7CisgICAgZ2xvYmFsUE0uYWRkKGxsdm06OmNyZWF0ZUNvbnN0YW50TWVyZ2VQYXNzKCkpOworICAgIGdsb2JhbFBNLmFkZChsbHZtOjpjcmVhdGVJbnN0cnVjdGlvblNpbXBsaWZpZXJQYXNzKCkpOworICAgIGlmIChvcHRpb25zLm9wdGltaXphdGlvbnMuaW5saW5lVGhyZXNob2xkKQorICAgICAgICBnbG9iYWxQTS5hZGQobGx2bTo6Y3JlYXRlQWx3YXlzSW5saW5lclBhc3MoKSk7CisgICAgZ2xvYmFsUE0uYWRkKGxsdm06OmNyZWF0ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcygpKTsKKyAgICBnbG9iYWxQTS5ydW4oKm1vZHVsZSk7CisKKyAgICAvLyBOZXh0LCBkbyBpbnRlcnByb2NlZHVyYWwgcGFzc2VzCisgICAgLy8gVE9ETzogZ2VuZXJhdGVkIGNvZGUgcGVyZm9ybWFuY2U6IElmIHdlIGV2ZXIgaGF2ZSBub24taW5saW5lZCBmdW5jdGlvbnMsIHdlJ2xsIHdhbnQgdG8gYWRkIHNvbWUgaW50ZXJwcm9jZWR1cmFsIHBhc3NlcworCisgICAgVmVyaWZ5TW9kdWxlKG1vZHVsZSk7CisKKyAgICAvLyBTZXQgdXAgdGhlIGZ1bmN0aW9uLWxldmVsIG9wdGltaXphdGlvbnMgd2Ugd2FudAorICAgIC8vIFRPRE86IGdlbmVyYXRlZCBjb2RlIHBlcmZvcm1hbmNlOiBleHBsb3JlIG9yZGVyaW5nIG9mIHBhc3NlcyBtb3JlCisgICAgbGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlciBwYXNzTWFuYWdlcihtb2R1bGUpOworCisKKyAgICAvLyBBZGQgdGFyZ2V0IGRhdGEgdG8gdW5ibG9jayBvcHRpbWl6YXRpb25zIHRoYXQgcmVxdWlyZSBpdAorICAgIC8vIFRoaXMgbWF0Y2hlcyBkZWZhdWx0IGV4Y2VwdCBmb3IgZW5kaWFubmVzcyAobGl0dGxlKSBhbmQgcG9pbnRlciBzaXplL2FsaWdubWVudCAoMzIpCisgICAgbGx2bTo6RGF0YUxheW91dCogREwgPSBuZXcgbGx2bTo6RGF0YUxheW91dCgiZS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi1pNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LWEwOjA6NjQiKTsKKyAgICBwYXNzTWFuYWdlci5hZGQoREwpOworCisgICAgLy8gQ3JlYXRlIGltbXV0YWJsZSBwYXNzZXMgb25jZQorICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVCYXNpY0FsaWFzQW5hbHlzaXNQYXNzKCkpOworICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVUeXBlQmFzZWRBbGlhc0FuYWx5c2lzUGFzcygpKTsKKworICAgIC8vIFByb3ZpZGUgdGhlIGJhY2tlbmQgcXVlcmllcworICAgIHBhc3NNYW5hZ2VyLmFkZChnbGFfbGx2bTo6Y3JlYXRlQmFja0VuZFBvaW50ZXJQYXNzKGJhY2tFbmQpKTsKKworICAgIC8vIFRPRE86IGV4cGxvcmUgU2ltcGxpZnlMaWJDYWxscworICAgIC8vIFRPRE86IGNvbXBpbGUtdGltZSBwZXJmb3JtYW5jZTogc2VlIGlmIHdlIGNhbiBhdm9pZCBydW5uaW5nIGd2bi9zY2NwIG11bHRpcGxlIHRpbWVzCisKKyAgICAvLyBFYXJseSwgc2ltcGxlIG9wdGltaXphdGlvbnMgdG8gZW5hYmxlIG90aGVycy9tYWtlIG90aGVycyBtb3JlIGVmZmljaWVudAorICAgIC8vcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZVNjYWxhclJlcGxBZ2dyZWdhdGVzUGFzcygpKTsKKyAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOworICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVFYXJseUNTRVBhc3MoKSk7CisgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUNvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcygpKTsKKworICAgIGJvb2wgaGFzQ2YgPSBIYXNDb250cm9sRmxvdyhtb2R1bGUpOworCisgICAgaWYgKGhhc0NmKSB7CisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSk7CisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVMb29wU2ltcGxpZnlQYXNzKCkpOworICAgICAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZUNhbm9uaWNhbGl6ZUNGR1Bhc3MoKSk7CisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChnbGFfbGx2bTo6Y3JlYXRlRGVjb21wb3NlSW5zdHNQYXNzKCkpOworICAgICAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZUNhbm9uaWNhbGl6ZUNGR1Bhc3MoKSk7CisKKyAgICAgICAgLy8gVE9ETzogQ29tcGlsZS10aW1lIHBlcmZvcm1hbmNlOiBzb21ldGhpbmcgZ29lcyBzdGFsZSBpbiBGbGF0dGVuQ29uZGl0aW9uYWxBc3NpZ25tZW50cyAoZG9tIHRyZWVzPykuCisgICAgICAgIC8vICAgICAgIFJ1bm5pbmcgaXQgbXVsdGlwbGUgdGltZXMgaGVyZSBjYXRjaGVzIG1vcmUsIHdoZXJlYXMgcnVubmluZyBpdCBtdWx0aXBsZSB0aW1lcyBpbnRlcm5hbGx5IGRvZXMgbm90IGhlbHAuCisgICAgICAgIC8vICAgICAgIE9uY2UgdGhhdCdzIGZpeGVkLCBtb3N0IGF0IHRoaXMgbGV2ZWwgY2FuIGJlIGVsaW1pbmF0ZWQuCisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChnbGFfbGx2bTo6Y3JlYXRlRmxhdHRlbkNvbmRpdGlvbmFsQXNzaWdubWVudHNQYXNzKG9wdGlvbnMub3B0aW1pemF0aW9ucy5mbGF0dGVuSG9pc3RUaHJlc2hvbGQpKTsKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGdsYV9sbHZtOjpjcmVhdGVGbGF0dGVuQ29uZGl0aW9uYWxBc3NpZ25tZW50c1Bhc3Mob3B0aW9ucy5vcHRpbWl6YXRpb25zLmZsYXR0ZW5Ib2lzdFRocmVzaG9sZCkpOworICAgICAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZUZsYXR0ZW5Db25kaXRpb25hbEFzc2lnbm1lbnRzUGFzcyhvcHRpb25zLm9wdGltaXphdGlvbnMuZmxhdHRlbkhvaXN0VGhyZXNob2xkKSk7CisKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGdsYV9sbHZtOjpjcmVhdGVDYW5vbmljYWxpemVDRkdQYXNzKCkpOworICAgIH0gZWxzZSAgICAgICAgCisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChnbGFfbGx2bTo6Y3JlYXRlRGVjb21wb3NlSW5zdHNQYXNzKCkpOworCisgICAgaW50IGlubmVyQW9TLCBvdXRlclNvQTsKKyAgICBiYWNrRW5kLT5nZXRSZWdpc3RlckZvcm0ob3V0ZXJTb0EsIGlubmVyQW9TKTsKKyAgICBpZiAoaW5uZXJBb1MgPT0gMSkgeworICAgICAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZVNjYWxhcml6ZVBhc3MoKSk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMub3B0aW1pemF0aW9ucy5yZWFzc29jaWF0ZSkKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZVJlYXNzb2NpYXRlUGFzcygpKTsKKyAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOworCisgICAgLy9pZiAob3B0aW9ucy5vcHRpbWl6YXRpb25zLmd2bikKKyAgICAvLyAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlR1ZOUGFzcygpKTsKKyAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlU0NDUFBhc3MoKSk7CisKKyAgICBpZiAoaGFzQ2YpIHsKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUxvb3BTaW1wbGlmeVBhc3MoKSk7CisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChnbGFfbGx2bTo6Y3JlYXRlQ2Fub25pY2FsaXplQ0ZHUGFzcygpKTsKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGdsYV9sbHZtOjpjcmVhdGVGbGF0dGVuQ29uZGl0aW9uYWxBc3NpZ25tZW50c1Bhc3Mob3B0aW9ucy5vcHRpbWl6YXRpb25zLmZsYXR0ZW5Ib2lzdFRocmVzaG9sZCkpOworICAgICAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZUZsYXR0ZW5Db25kaXRpb25hbEFzc2lnbm1lbnRzUGFzcyhvcHRpb25zLm9wdGltaXphdGlvbnMuZmxhdHRlbkhvaXN0VGhyZXNob2xkKSk7CisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChnbGFfbGx2bTo6Y3JlYXRlQ2Fub25pY2FsaXplQ0ZHUGFzcygpKTsKKyAgICB9CisKKyAgICAvLyBNYWtlIG11bHRpaW5zZXJ0IGludHJpbnNpY3MsIGFuZCBjbGVhbiB1cCBhZnRlcndhcmRzCisgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsKKyAgICBpZiAob3B0aW9ucy5vcHRpbWl6YXRpb25zLmNvYWxlc2NlKQorICAgICAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZUNvYWxlc2NlSW5zZXJ0c1Bhc3MoKSk7CisgICAgaWYgKG9wdGlvbnMub3B0aW1pemF0aW9ucy5hZGNlKQorICAgICAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlQWdncmVzc2l2ZURDRVBhc3MoKSk7CisgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsKKworICAgIGlmIChoYXNDZikgeworICAgICAgICAvLyBMb29wIG9wdGltaXphdGlvbnMsIGFuZCBjbGVhbiB1cCBhZnRlcndhcmRzCisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVMSUNNUGFzcygpKTsKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUluZFZhclNpbXBsaWZ5UGFzcygpKTsKKyAgICAgICAgaWYgKG9wdGlvbnMub3B0aW1pemF0aW9ucy5sb29wVW5yb2xsVGhyZXNob2xkKSB7CisgICAgICAgICAgICAvLyBMb29wIHJvdGF0aW9uIGNyZWF0ZXMgYSBsZXNzIGRlc2lyYWJsZSBsb29wIGZvcm0gZm9yIGxvb3BzIHRoYXQgZG8gbm90IGdldCB1bnJvbGxlZCwKKyAgICAgICAgICAgIC8vIGJ1dCBpcyBuZWVkZWQgaWYgYSBsb29wIHdpbGwgYmUgdW5yb2xsZWQuCisgICAgICAgICAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlTG9vcFJvdGF0ZVBhc3Mob3B0aW9ucy5vcHRpbWl6YXRpb25zLmxvb3BVbnJvbGxUaHJlc2hvbGQpKTsKKyAgICAgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVJbmRWYXJTaW1wbGlmeVBhc3MoKSk7CisgICAgICAgICAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlTG9vcFVucm9sbFBhc3Mob3B0aW9ucy5vcHRpbWl6YXRpb25zLmxvb3BVbnJvbGxUaHJlc2hvbGQpKTsKKyAgICAgICAgfQorICAgICAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlTG9vcFN0cmVuZ3RoUmVkdWNlUGFzcygpKTsKKyAgICAgICAgaWYgKG9wdGlvbnMub3B0aW1pemF0aW9ucy5hZGNlKQorICAgICAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzKCkpOworCisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7CisgICAgICAgIC8vaWYgKG9wdGlvbnMub3B0aW1pemF0aW9ucy5ndm4pCisgICAgICAgIC8vICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVHVk5QYXNzKCkpOworICAgICAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlU0NDUFBhc3MoKSk7CisgICAgfQorCisgICAgLy8gUnVuIGludHJpbmlzaWMgY29tYmluaW5nCisgICAgcGFzc01hbmFnZXIuYWRkKGdsYV9sbHZtOjpjcmVhdGVDYW5vbmljYWxpemVDRkdQYXNzKCkpOworICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7CisgICAgcGFzc01hbmFnZXIuYWRkKGdsYV9sbHZtOjpjcmVhdGVJbnRyaW5zaWNDb21iaW5lUGFzcygpKTsKKyAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZUNhbm9uaWNhbGl6ZUNGR1Bhc3MoKSk7CisKKyAgICAvL2lmIChvcHRpb25zLm9wdGltaXphdGlvbnMuZ3ZuKQorICAgIC8vICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVHVk5QYXNzKCkpOworICAgIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVTQ0NQUGFzcygpKTsKKworICAgIC8vIFRPRE86IGdlbmVyYXRlZCBjb2RlOiBDb25zaWRlciBpZiB3ZSByZWFsbHkgd2FudCBpdC4gRm9yIHNvbWUgcmVhc29uIFN0YW5kYXJkUGFzc2VzLmgKKyAgICAvLyBkb2Vzbid0IGhhdmUgaXQgbGlzdGVkLgorICAgIC8vIHBhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVTaW5raW5nUGFzcygpKTsKKworICAgIC8vIFJ1biBzb21lIHBvc3QtcmVkdW5kYW5jeS1lbGltaW5hdGlvbiBwYXNzZXMKKyAgICAvL3Bhc3NNYW5hZ2VyLmFkZChsbHZtOjpjcmVhdGVTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3MoKSk7CisgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsKKyAgICBwYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlQ29ycmVsYXRlZFZhbHVlUHJvcGFnYXRpb25QYXNzKCkpOworICAgIGlmIChvcHRpb25zLm9wdGltaXphdGlvbnMuYWRjZSkKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzKCkpOworCisgICAgaWYgKGhhc0NmKSB7CisgICAgICAgIC8vIEx1bmFyR0xBU1MgQ0ZHIG9wdGltaXphdGlvbnMKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUxvb3BTaW1wbGlmeVBhc3MoKSk7CisgICAgICAgIHBhc3NNYW5hZ2VyLmFkZChnbGFfbGx2bTo6Y3JlYXRlQ2Fub25pY2FsaXplQ0ZHUGFzcygpKTsKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGdsYV9sbHZtOjpjcmVhdGVGbGF0dGVuQ29uZGl0aW9uYWxBc3NpZ25tZW50c1Bhc3Mob3B0aW9ucy5vcHRpbWl6YXRpb25zLmZsYXR0ZW5Ib2lzdFRocmVzaG9sZCkpOworICAgICAgICBwYXNzTWFuYWdlci5hZGQoZ2xhX2xsdm06OmNyZWF0ZUNhbm9uaWNhbGl6ZUNGR1Bhc3MoKSk7CisKKyAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsKKyAgICAgICAgaWYgKG9wdGlvbnMub3B0aW1pemF0aW9ucy5hZGNlKQorICAgICAgICAgICAgcGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzKCkpOworICAgIH0KKworICAgIFJ1bk9uTW9kdWxlKHBhc3NNYW5hZ2VyLCBtb2R1bGUpOworCisgICAgVmVyaWZ5TW9kdWxlKG1vZHVsZSk7CisKKyAgICAvLyBQb3N0IEZ1bmN0aW9uIHBhc3NlcyBjbGVhbnVwCisgICAgbGx2bTo6UGFzc01hbmFnZXIgcG07CisgICAgcG0uYWRkKGxsdm06OmNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsKKyAgICBwbS5hZGQobGx2bTo6Y3JlYXRlRGVhZFN0b3JlRWxpbWluYXRpb25QYXNzKCkpOworICAgIGlmIChvcHRpb25zLm9wdGltaXphdGlvbnMuYWRjZSkKKyAgICAgICAgcG0uYWRkKGxsdm06OmNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzKCkpOworICAgIHBtLmFkZChsbHZtOjpjcmVhdGVTdHJpcERlYWRQcm90b3R5cGVzUGFzcygpKTsKKyAgICAKKyAgICAvLyBUT0RPOiBmdW5jdGlvbi1jYWxsIGZ1bmN0aW9uYWxpdHk6IENvbnNpZGVyIHVzaW5nIHRoZSBiZWxvdyBpbiB0aGUgcHJlc2Vuc2Ugb2YgZnVuY3Rpb25zCisgICAgLy8gcG0uYWRkKGxsdm06OmNyZWF0ZUdsb2JhbERDRVBhc3MoKSk7CisKKyAgICBwbS5ydW4oKm1vZHVsZSk7CisKKyAgICBWZXJpZnlNb2R1bGUobW9kdWxlKTsKKworICAgIC8vIFRPRE86IFJlZmFjdG9yIHRoZSBiZWxvdyB1c2Ugb2YgR2xvYmFsT3B0LiBQZXJoYXBzIHdlIHdhbnQgdG8gcmVwZWF0IG91cgorICAgIC8vIHNvbWUgZnVuY3Rpb24gcGFzc2VzPworCisgICAgbGx2bTo6UGFzc01hbmFnZXIgbW9kdWxlUGFzc01hbmFnZXI7CisgICAgbW9kdWxlUGFzc01hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZUdsb2JhbE9wdGltaXplclBhc3MoKSk7CisKKyAgICAvLyBPcHRpbWl6ZSB0aGUgd2hvbGUgbW9kdWxlCisgICAgYm9vbCBjaGFuZ2VkID0gbW9kdWxlUGFzc01hbmFnZXIucnVuKCptb2R1bGUpOworCisgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgLy8gcmVtb3ZpbmcgZ2xvYmFscyBjcmVhdGVkIHN0YWNrIGFsbG9jYXRpb25zIHdlIHdhbnQgdG8gZWxpbWluYXRlCisgICAgICAgIGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXIgcG9zdEdsb2JhbE1hbmFnZXIobW9kdWxlKTsKKyAgICAgICAgcG9zdEdsb2JhbE1hbmFnZXIuYWRkKGxsdm06OmNyZWF0ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcygpKTsKKworICAgICAgICAvLyBydW4gYWNyb3NzIGFsbCBmdW5jdGlvbnMKKyAgICAgICAgcG9zdEdsb2JhbE1hbmFnZXIuZG9Jbml0aWFsaXphdGlvbigpOworICAgICAgICBmb3IgKGxsdm06Ok1vZHVsZTo6aXRlcmF0b3IgZnVuY3Rpb24gPSBtb2R1bGUtPmJlZ2luKCksIGxhc3RGdW5jdGlvbiA9IG1vZHVsZS0+ZW5kKCk7IGZ1bmN0aW9uICE9IGxhc3RGdW5jdGlvbjsgKytmdW5jdGlvbikgeworICAgICAgICAgICAgcG9zdEdsb2JhbE1hbmFnZXIucnVuKCpmdW5jdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcG9zdEdsb2JhbE1hbmFnZXIuZG9GaW5hbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBpZiAoISBiYWNrRW5kLT5wcmVmZXJSZWdpc3RlcnNPdmVyTWVtb3J5KCkpIHsKKyAgICAgICAgbGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlciBtZW1vcnlQYXNzTWFuYWdlcihtb2R1bGUpOworICAgICAgICBtZW1vcnlQYXNzTWFuYWdlci5hZGQobGx2bTo6Y3JlYXRlRGVtb3RlUmVnaXN0ZXJUb01lbW9yeVBhc3MoKSk7CisKKyAgICAgICAgbWVtb3J5UGFzc01hbmFnZXIuZG9Jbml0aWFsaXphdGlvbigpOworICAgICAgICBmb3IgKGxsdm06Ok1vZHVsZTo6aXRlcmF0b3IgZnVuY3Rpb24gPSBtb2R1bGUtPmJlZ2luKCksIGxhc3RGdW5jdGlvbiA9IG1vZHVsZS0+ZW5kKCk7IGZ1bmN0aW9uICE9IGxhc3RGdW5jdGlvbjsgKytmdW5jdGlvbikgeworICAgICAgICAgICAgbWVtb3J5UGFzc01hbmFnZXIucnVuKCpmdW5jdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgbWVtb3J5UGFzc01hbmFnZXIuZG9GaW5hbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBWZXJpZnlNb2R1bGUobW9kdWxlKTsKKworICAgIC8vIFB1dCB0aGUgSVIgaW50byBhIGNhbm9uaWNhbCBmb3JtIGZvciBCb3R0b21UcmFuc2xhdG9yLgorICAgIGxsdm06OlBhc3NNYW5hZ2VyIGNhbm9uaWNhbGl6ZTsKKworICAgIGNhbm9uaWNhbGl6ZS5hZGQobGx2bTo6Y3JlYXRlSW5kVmFyU2ltcGxpZnlQYXNzKCkpOworICAgIGNhbm9uaWNhbGl6ZS5hZGQoZ2xhX2xsdm06OmNyZWF0ZUNhbm9uaWNhbGl6ZUNGR1Bhc3MoKSk7CisgICAgY2Fub25pY2FsaXplLmFkZChnbGFfbGx2bTo6Y3JlYXRlQmFja0VuZFBvaW50ZXJQYXNzKGJhY2tFbmQpKTsKKyAgICBjYW5vbmljYWxpemUuYWRkKGdsYV9sbHZtOjpjcmVhdGVHYXRoZXJJbnN0c1Bhc3MoKSk7CisgICAgY2Fub25pY2FsaXplLmFkZChnbGFfbGx2bTo6Y3JlYXRlQ2Fub25pY2FsaXplSW5zdHNQYXNzKCkpOworICAgIGNhbm9uaWNhbGl6ZS5hZGQobGx2bTo6Y3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MoKSk7CisgICAgY2Fub25pY2FsaXplLnJ1bigqbW9kdWxlKTsKKworICAgIFZlcmlmeU1vZHVsZShtb2R1bGUpOworfQpkaWZmIC0tZ2l0IGEvTHVuYXJHTEFTUy9Db3JlL21ldGFkYXRhLmggYi9MdW5hckdMQVNTL0NvcmUvbWV0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIyMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvTHVuYXJHTEFTUy9Db3JlL21ldGFkYXRhLmgKQEAgLTAsMCArMSw5NjYgQEAKKy8vPT09LSBtZXRhZGF0YS5oIC0gTExWTSBNZXRhZGF0YSBmb3IgTHVuYXJHTEFTUyAtPT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLworLy8gTHVuYXJHTEFTUzogQW4gT3BlbiBNb2R1bGFyIFNoYWRlciBDb21waWxlciBBcmNoaXRlY3R1cmUKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IEx1bmFyRywgSW5jLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8KKy8vICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisvLyAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisvLyAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIEx1bmFyRyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisvLyAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKy8vIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKy8vIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKy8vIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKy8vIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLy8gTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKy8vIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBdXRob3I6IEpvaG4gS2Vzc2VuaWNoLCBMdW5hckcKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgbWV0YWRhdGFfSAorI2RlZmluZSBtZXRhZGF0YV9ICisKKy8vIEx1bmFyR0xBU1MgaW5jbHVkZXMKKyNpbmNsdWRlICJMdW5hckdMQVNTVG9wSVIuaCIKKworLy8gTExWTSBpbmNsdWRlcworI3ByYWdtYSB3YXJuaW5nKHB1c2gsIDEpCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjcHJhZ21hIHdhcm5pbmcocG9wKQorCituYW1lc3BhY2UgZ2xhIHsKKworLy8gRm9ybXMgb2YgbWV0YWRhdGEgbm9kZXMsIHBvaW50ZWQgdG8gYnkgaW5zdHJ1Y3Rpb25zLCBieSBuYW1lZCBtZXRhZGF0YSwgb3IgYnkgb3RoZXIgbWV0YWRhdGEuCisvLworLy8gT25seSB0aGUgbmFtZXMgc3RhcnRpbmcgd2l0aCAiIWdsYS4iIGFjdHVhbGx5IGFwcGVhciBpbiB0aGUgSVIsIHRoZSBvdGhlciBuYW1lcyBoZXJlIGFyZQorLy8gZm9yIGVhc2Ugb2YgdW5kZXJzdGFuZGluZyB0aGUgbGlua2FnZSBiZXR3ZWVuIHRoZSBub2Rlcy4KKy8vCisvLyBOT1RFOiBUaGVyZSBhcmUgKnR3byogZm9ybXMgdGhlIHJlY3Vyc2l2ZSB0eXBlLXdhbGtpbmcgbWV0YWRhdGEgY2FuIGFwcGVhciBpbjoKKy8vIC0gU2luZ2xlLVdhbGsgZm9ybTogQSBzaW5nbGUgc2VsZi1yZWN1cnNpdmUgbm9kZSwgdGhlIHNhbWUgb25lIHVzZWQgdG8gcm9vdAorLy8gICAhZ2xhLmlucHV0L291dHB1dC91bmlmb3JtIG5vZGVzLiAgVGhpcyBlbmFibGVzIGEgc2luZ2xlIHR5cGUgdHJlZSB3YWxrZXIKKy8vICAgdGhyb3VnaCB0aGUgbWV0YWRhdGEgbm9kZXMuCisvLyAtIER1YWwtV2FsayBmb3JtOiBUaGUgdHlwZSBpcyByb290ZWQgYnkgYSAhZ2xhLmlucHV0L291dHB1dC91bmlmb3JtIG5vZGUsIHdoaWNoCisvLyAgIHBvaW50cyB0byBhIHJlY3Vyc2l2ZSAhYWdncmVnYXRlIG5vZGUuICBUaGlzIHJlcXVpcmVzIHdhbGtpbmcgdGhlIExMVk0gdHlwZQorLy8gICBpbiBwYXJhbGxlbCB3aXRoIHdhbGtpbmcgdGhlIG1ldGFkYXRhIG5vZGVzLgorLy8gT25seSBvbmUgb2YgdGhlc2UgZm9ybXMgc2hvdWxkIGJlIHVzZWQgaW4gYSBnaXZlbiBtb2R1bGUuCisvLworLy8gTm9kZSBmb3JtczoKKy8vCisvLyAgICAgIWdsYS5lbnRyeXBvaW50IC0+IHsgbmFtZSwgRU1Jb0VudHJ5cG9pbnQgfQorLy8gICAgIE5vdGVzOgorLy8gICAgICAgICAtIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIHNvdXJjZSBlbnRyeSBwb2ludCBpbnRvIHRoZSBzaGFkZXI7IGUuZy4sICJtYWluIgorLy8KKy8vICAgICAhZ2xhLnByZWNpc2lvbiAtPiB7IEVNZFByZWNpc2lvbiB9CisvLworLy8gICAgICFnbGEuaW8gaXMgc2hvcnRoYW5kIGZvciBvbmUgb2YgIWdsYS5pbnB1dCwgIWdsYS5vdXRwdXQsICFnbGEudW5pZm9ybQorLy8KKy8vICAgICAhZ2xhLmlvIC0+IHsgbmFtZSwgRU1kSW5wdXRPdXRwdXQsIFZhbHVlKiwgIXR5cGVMYXlvdXQsICFhZ2dyZWdhdGUgfQorLy8gICAgIFRoaXMgaXMgRHVhbC1XYWxrIGZvcm06CisvLyAgICAgICAgIC0gdGhlIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCAoaW5zdGFuY2UtbmFtZSBmb3IgYSBibG9jaykKKy8vICAgICAgICAgICAgICAqIGZvciBhIGJsb2NrIHdpdGggbm8gaW5zdGFuY2UgbmFtZSwgdGhlIG5hbWUgaGVyZSB3aWxsIGJlIGVtcHR5ICgiIikKKy8vICAgICAgICAgLSBWYWx1ZSogaXMgYSBwcm94eSBmb3IgZ2V0dGluZyB0aGUgTExWTSB0eXBlIG9mIHRoZSByb290IG9mIHRoZSB0eXBlCisvLyAgICAgICAgIC0gIWFnZ3JlZ2F0ZSBpcyBmb3IgYmxvY2tzIGFuZCBzdHJ1Y3R1cmVzCisvLyAgICAgICAgICAgICAgKiBpdCdzIGEgYmxvY2sgd2hlbiBFTWRJbnB1dE91dHB1dCBpcyBFTWlvKkJsb2NrKiwgIXR5cGVMYXlvdXQgd2lsbCBzYXkgaG93IHRoZSBibG9jayBpcyBsYWlkIG91dAorLy8gICAgICAgICAgICAgICogaXQncyBhIHN0cnVjdHVyZSB3aGVuIHRoZSBFTWRUeXBlTGF5b3V0IGlzIEVNdGxBZ2dyZWdhdGUKKy8vICAgICAgICAgLSBmb3IgYmxvY2tzLCB0aGUgaW5zdGFuY2UgbmFtZSBpcyB0aGUgbmFtZSBhYm92ZSwgd2hpbGUgdGhlIGludGVyZmFjZSBuYW1lIGlzIHRoZSBuYW1lIGluIHRoZSAhYWdncmVnYXRlCisvLworLy8gICAgICFnbGEuaW86IHsgaW5zdGFuY2VOYW1lLCBFTWRJbnB1dE91dHB1dCwgVmFsdWUqLCAhdHlwZUxheW91dCwgdHlwZU5hbWUsICFnbGEuaW8sICFnbGEuaW8sICFnbGEuaW8sIC4uLiB9CisvLyAgICAgVGhpcyBpcyBTaW5nbGUtV2FsayBmb3JtCisvLyAgICAgICAgIC0gdGhlIGluc3RhbmNlTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGluc3RhbmNlIChpbnN0YW5jZS1uYW1lIGZvciBhIGJsb2NrKQorLy8gICAgICAgICAgICAgICogZm9yIGEgYmxvY2sgd2l0aCBubyBpbnN0YW5jZSBuYW1lLCB0aGUgbmFtZSBoZXJlIHdpbGwgYmUgZW1wdHkgKCIiKQorLy8gICAgICAgICAtIFZhbHVlKiBpcyBhIHByb3h5IGZvciBnZXR0aW5nIHRoZSBMTFZNIHR5cGUgb2YgdGhpcyByb290IG9yIGludGVybWVkaWF0ZSB0eXBlIGluIHRoZSB0cmVlCisvLyAgICAgICAgICAgICAgKiB0aGlzIG11c3QgYmUgbG9va2VkIGF0IHRvIGdldCB0aGUgY3VycmVudCBsZXZlbCdzIGFycmF5bmVzcyBpbmZvcm1hdGlvbgorLy8gICAgICAgICAtIHR5cGVOYW1lIGlzIGZvciBibG9jayBpbnRlcmZhY2UgbmFtZSBvciBzdHJ1Y3QgdHlwZSBuYW1lCisvLyAgICAgICAgICAgICAgKiB3aWxsIGJlIGVtcHR5ICgiIikgaWYgdGhpcyBsZXZlbCBpcyBub3QgYSBzdHJ1Y3Qgb3IgYmxvY2sKKy8vICAgICAgICAgICAgICAqIGl0J3MgYSBibG9jayB3aGVuIEVNZElucHV0T3V0cHV0IGlzIEVNaW8qQmxvY2sqLCAhdHlwZUxheW91dCB3aWxsIHNheSBob3cgdGhlIGJsb2NrIGlzIGxhaWQgb3V0CisvLyAgICAgICAgICAgICAgKiBpdCdzIGEgc3RydWN0dXJlIHdoZW4gdGhlIEVNZFR5cGVMYXlvdXQgaXMgRU10bEFnZ3JlZ2F0ZQorLy8gICAgICAgICAgICAgICogdGhlICFnbGEuaW8gb3BlcmFuZHMgYXJlIHRoZSBjaGlsZCBtZW1iZXJzLCBpbiBvcmRlciwgb2YgdGhlIHR5cGUKKy8vICAgICAgICAgLSBmb3IgYmxvY2tzLCB0aGUgaW50ZXJmYWNlIG5hbWUgaXMgdHlwZU5hbWUKKy8vCisvLyAgICAgIXNhbXBsZXIgLT4geyBFTWRTYW1wbGVyLCBWYWx1ZSosIEVNZFNhbXBsZXJEaW0sIGFycmF5LCBzaGFkb3csIEVNZFNhbXBsZXJCYXNlVHlwZSB9CisvLyAgICAgTm90ZXM6CisvLyAgICAgICAgIC0gRU1kU2FtcGxlciBzYXlzIHdoZXRoZXIgaXQgaXMgYW4gaW1hZ2Ugb3IgdGV4dHVyZSwgYW5kIGlmIGFuIGltYWdlIHdoYXQgaXRzIGZvcm1hdCBpcworLy8gICAgICAgICAtIHRleGVsIHJldHVybiB2YWx1ZSBoYXMgdGhlIHNhbWUgdHlwZSBhcyBWYWx1ZSosIG1vZGlmaWVkIGJ5IEVNZFNhbXBsZXJCYXNlVHlwZSAoZS5nLiwgdW5zaWduZWQgaW50KQorLy8gICAgICAgICAtIGFycmF5IGlzIGJvb2wsIHRydWUgaWYgaXQgaXMgYSBzYW1wbGVyQXJyYXkKKy8vICAgICAgICAgLSBzaGFkb3cgaXMgYm9vbCwgdHJ1ZSBpZiBpdCBpcyBhIHNhbXBsZXJTaGFkb3cKKy8vCisvLyAgICAgIXR5cGVMYXlvdXQgLT4geyBFTWRUeXBlTGF5b3V0LCBFTWRQcmVjaXNpb24sIGxvY2F0aW9uLCAhc2FtcGxlciwgaW50ZXJwTW9kZSwgRU1kQnVpbHRJbiwgYmluZGluZywgRU1kUXVhbGlmaWVyU2hpZnQgbWFzaywgb2Zmc2V0IH0KKy8vICAgICBOb3RlczoKKy8vICAgICAgICAgLSB0aGUgRU1kVHlwZUxheW91dCBpcyBob3cgaXQgaXMga25vd24gaWYgc29tZXRoaW5nIGlzIGEgbWF0cml4IG9yIHVuc2lnbmVkIGludGVnZXIsCisvLyAgICAgICAgICAgYmVjYXVzZSB0aGlzIGlzIG5vdCBpbiB0aGUgTExWTSB0eXBlCisvLyAgICAgICAgIC0gJ2xvY2F0aW9uJworLy8gICAgICAgICAgIC0gdGhlICpmaXJzdCogbG9jYXRpb24gb2YgdGhlIHZhcmlhYmxlLCB3aGljaCBjYW4gc3BhbiBtYW55IHNsb3RzL2xvY2F0aW9ucworLy8gICAgICAgICAgIC0gaXMgPj0gTWF4VXNlckxheW91dExvY2F0aW9uIGZvciBub24tdXNlciBzcGVjaWZpZWQgbG9jYXRpb25zLCB0byBiZSBwYXRjaGVkIGxhdGVyIGJ5IGEgbGlua2VyCisvLyAgICAgICAgICAgLSBpcyA8IE1heFVzZXJMYXlvdXRMb2NhdGlvbiBmb3IgdXNlci1hc3NpZ25lZCBsb2NhdGlvbnMKKy8vICAgICAgICAgLSB0aGUgaW50cmluc2ljJ3Mgc2xvdCBjYW4gYmUgZGlmZmVyZW50IHdoZW4gcmVhZGluZyBhIHNpbmdsZSBzbG90IG91dCBvZiB0aGUgbWlkZGxlIG9mIGEgbGFyZ2UgaW5wdXQvb3V0cHV0CisvLyAgICAgICAgIC0gaW50ZXJwTW9kZSBpcyBwcmVzZW50IGFzIGFuIGludGVnZXIgZW5jb2RlZCBmb3IgTWFrZUludGVycG9sYXRpb25Nb2RlKCkgYW5kIENyYWNrSW50ZXJwb2xhdGlvbk1vZGUoKQorLy8gICAgICAgICAgIGl0IGNhbiBhbHNvIGJlIHByZXNlbnQgaWYgdGhlcmUgaXMgYW4gRU1kQnVpbHRJbiwgYW5kIHdpbGwgYmUgLTEgaWYgdGhlcmUgaXMgbm8gaW50ZXJwTW9kZQorLy8gICAgICAgICAtIEVNZEJ1aWx0SW4sIGlmIHByZXNlbnQsIHNheXMgd2hhdCBidWlsdC1pbiB2YXJpYWJsZSBpcyBiZWluZyByZXByZXNlbnRlZC4gIEl0IGlzIG9wdGlvbmFsLgorLy8gICAgICAgICAtIGJpbmRpbmcsIGlmIHByZXNlbnQsIGlzIHRoZSBiaW5kaW5nCisvLyAgICAgICAgICAgICAtIGEgYmluZGluZyBvZiAtMSBtZWFucyB0aGUgc291cmNlIHNwZWNpZmllZCBubyBiaW5kaW5nCisvLyAgICAgICAgIC0gRU1kUXVhbGlmaWVyU2hpZnQsIGlmIHByZXNlbnQsIG1hc2sgaXMgYSBjb2xsZWN0aW9uIG9mIGFkZGl0aW9uYWwgcXVhbGlmaWVycworLy8gICAgICAgICAgICAgLSBhIHZhbHVlIG9mIDAgbWVhbnMgbm8gcXVhbGlmaWVycyB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgc291cmNlCisvLyAgICAgICAgIC0gb2Zmc2V0LCBpZiBwcmVzZW50LCBpcyBhbiBpbnRlZ2VyIG9mZnNldCBmb3IgdGhlIG9iamVjdCAoYXMgcGVyIEdMU0wpCisvLyAgICAgICAgICAgICAtIGFuIG9mZnNldCBvZiAtMSBtZWFucyB0aGUgc291cmNlIHNwZWNpZmllZCBubyBvZmZzZXQKKy8vCisvLyAgICAgIWFnZ3JlZ2F0ZSAtPiB7IG5hbWUsICF0eXBlTGF5b3V0LCBsaXN0IG9mIG1lbWJlcnM6IG5hbWUxLCAhYWdncmVnYXRlMSwgbmFtZTIsICFhZ2dyZWdhdGUyLCAuLi4gfQorLy8gICAgIE5vdGVzOgorLy8gICAgICAgICAtIHRoaXMgcmVjdXJzaXZlbHkgcmVwcmVzZW50cyBuZXN0ZWQgdHlwZXMsIHBhcmFsbGVsaW5nIHRoZSBMTFZNIHR5cGUsIGJ1dCBjb21wbGVtZW50aW5nIGl0CisvLyAgICAgICAgICAgKGUuZy4sIGFuIGxsdm0gYXJyYXkgb2YgYXJyYXkgbWlnaHQgaGF2ZSBFTWRUeXBlTGF5b3V0IG9mIEVNdGxSb3dNYWpvck1hdHJpeCkKKy8vICAgICAgICAgLSB0aGUgbmFtZSBpbiBvcGVyYW5kIDAgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgKGludGVyZmFjZSBuYW1lIGZvciBhIGJsb2NrKQorLy8gICAgICAgICAtIGVhY2ggY29udGFpbmVkIG1lbWJlciBoYXMgYSBwYWlyIG9mIG9wZXJhbmRzLCBvbmUgZm9yIHRoZSBtZW1iZXIncyBuYW1lLCBvbmUgZm9yIHRoZSBtZW1iZXIncyB0eXBlCisvLworLy8gICAgIFdoZW4gYWdncmVnYXRlcyBhcmUgdXNlZCwgdGhlIHN0YXJ0aW5nIHBvaW50IGlzIGFsd2F5cyBhICFnbGEudW5pZm9ybSwgIWdsYS5vdXRwdXQsIG9yICFnbGEuaW5wdXQgbm9kZSwgd2hpY2ggd2lsbAorLy8gICAgIHN1cHBseSBvdmVyYWxsIGluZm9ybWF0aW9uIGFuZCB0aGVuIHBvaW50IHRvIGEgIWFnZ3JlZ2F0ZSBmb3IgdGhlIGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4KKy8vCisvLyAgICAgQmxvY2tzIGNhbiBoYXZlIHR3byBuYW1lczoKKy8vICAgICAgICAxKSB0aGUgaW5zdGFuY2UgbmFtZSB1c2VkIGluIGEgcmVmZXJlbmNlLCB3aGljaCBjb3VsZCBiZSBtaXNzaW5nCisvLyAgICAgICAgMikgdGhlIGludGVyZmFjZSBuYW1lIHVzZWQgb25seSBpbiB0aGUgZGVjbGFyYXRpb24sIHdoaWNoIG11c3QgYmUgcHJlc2VudAorLy8gICAgIFRoZSBpbnN0YW5jZSBuYW1lIHdpbGwgYmUgaW4gdGhlICFnbGEudW5pZm9ybS9pbnB1dC9vdXRwdXQgbm9kZSwgd2hpbGUgdGhlIGludGVyZmFjZSBuYW1lIHdpbGwgYmUgaW4gdGhlCisvLyAgICAgIWFnZ3JlZ2F0ZSBub2RlIHBvaW50ZWQgdG8uCisvLworLy8gRm9ybXMgb2YgbmFtZWQgbWV0YWRhdGEKKy8vCisvLyAgICAgIWdsYS5pbnB1dHMgPSAheyBsaXN0IG9mIGFsbCBwaXBlbGluZSAhaW5wdXQgfQorLy8gICAgICFnbGEub3V0cHV0cyA9ICF7IGxpc3Qgb2YgYWxsIHBpcGVsaW5lICFvdXRwdXQgfQorLy8gICAgICFnbGEudW5pZm9ybXMgPSAheyBsaXN0IG9mIGFsbCAhdW5pZm9ybSB9CisvLyAgICAgIWdsYS5pbnZhcmlhbnQgPSAheyBzdWJzZXQgbGlzdCBvZiBvdXRwdXQgdGhhdCB3ZXJlIGRlY2xhcmVkIGFzIGludmFyaWFudCB9CisvLyAgICAgIWdsYS5lbnRyeXBvaW50ID0gIXsgbGlzdCBvZiBhbGwgZW50cnkgcG9pbnRzIH0KKy8vICAgICAhZ2xhLm5vU3RhdGljVXNlID0gIXsgc3Vic2V0IG9mIGlucHV0L291dHB1dC91bmlmb3JtIHRoYXQgd2VyZSBub3Qgc3RhdGljYWxseSByZWZlcmVuY2VkIGluIHRoZSBzb3VyY2Ugc2hhZGVyIH0KKy8vICAgICAhZ2xhLnNoYXJlZCA9ICF7IGxpc3Qgb2YgYWxsIHdvcmtncm91cC1zaGFyZWQgZ2xvYmFscyAodGhlIFZhbHVlKiBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBzdG9yYWdlLXF1YWxpZmllZCBzaGFyZWQpIH0KKy8vCisvLyAgICAgIWdsYS5pbnB1dFByaW1pdGl2ZSAgICAgPSAheyAhTSB9IHdoZXJlICFNID0gIXsgaTMyIEVNZExheW91dEdlb21ldHJ5IH0KKy8vICAgICAhZ2xhLm91dHB1dFByaW1pdGl2ZSAgICA9ICF7ICFNIH0gd2hlcmUgIU0gPSAheyBpMzIgRU1kTGF5b3V0R2VvbWV0cnkgfQorLy8gICAgICFnbGEueGZiTW9kZSAgICAgICAgICAgID0gIXsgIU0gfSB3aGVyZSAhTSA9ICF7IGkzMiBib29sIH0KKy8vICAgICAhZ2xhLm51bVZlcnRpY2VzICAgICAgICA9ICF7ICFNIH0gd2hlcmUgIU0gPSAheyBpMzIgaW50IH0KKy8vICAgICAhZ2xhLnZlcnRleFNwYWNpbmcgICAgICA9ICF7ICFNIH0gd2hlcmUgIU0gPSAheyBpMzIgRU1kVmVydGV4U3BhY2luZyB9CisvLyAgICAgIWdsYS52ZXJ0ZXhPcmRlciAgICAgICAgPSAheyAhTSB9IHdoZXJlICFNID0gIXsgaTMyIEVNZFZlcnRleE9yZGVyIH0KKy8vICAgICAhZ2xhLnBvaW50TW9kZSAgICAgICAgICA9ICF7ICFNIH0gd2hlcmUgIU0gPSAheyBpMzIgYm9vbCB9CisvLyAgICAgIWdsYS5pbnZvY2F0aW9ucyAgICAgICAgPSAheyAhTSB9IHdoZXJlICFNID0gIXsgaTMyIGludCB9CisvLyAgICAgIWdsYS5waXhlbENlbnRlckludGVnZXIgPSAheyAhTSB9IHdoZXJlICFNID0gIXsgaTMyIGJvb2wgfQorLy8gICAgICFnbGEub3JpZ2luVXBwZXJMZWZ0ICAgID0gIXsgIU0gfSB3aGVyZSAhTSA9ICF7IGkzMiBib29sIH0KKy8vICAgICAhZ2xhLmJsZW5kRXF1YXRpb25zICAgICA9ICF7ICFNIH0gd2hlcmUgIU0gPSAheyBpMzIgbWFzayBvZiBiaXRzIHNoaWZ0ZWQgYnkgRU1kQmxlbmRFcXVhdGlvblNoaWZ0IGFtb3VudHMgfQorLy8gICAgICFnbGEubG9jYWxTaXplICAgICAgICAgID0gIXsgIU0gfSB3aGVyZSAhTSA9ICF7IGkzMiB4LXNpemUsIGludCB5LXNpemUsIGludCB6LXNpemUgfQorLy8KKworLy8gT3BlcmFuZCBuYW1lcworY29uc3QgY2hhciogY29uc3QgSW5wdXRNZE5hbWUgICAgID0gImdsYS5pbnB1dCI7Citjb25zdCBjaGFyKiBjb25zdCBPdXRwdXRNZE5hbWUgICAgPSAiZ2xhLm91dHB1dCI7Citjb25zdCBjaGFyKiBjb25zdCBVbmlmb3JtTWROYW1lICAgPSAiZ2xhLnVuaWZvcm0iOworY29uc3QgY2hhciogY29uc3QgUHJlY2lzaW9uTWROYW1lID0gImdsYS5wcmVjaXNpb24iOworCisvLyBOYW1lZCBub2RlcworY29uc3QgY2hhciogY29uc3QgSW5wdXRMaXN0TWROYW1lICAgICAgICAgID0gImdsYS5pbnB1dHMiOworY29uc3QgY2hhciogY29uc3QgT3V0cHV0TGlzdE1kTmFtZSAgICAgICAgID0gImdsYS5vdXRwdXRzIjsKK2NvbnN0IGNoYXIqIGNvbnN0IFVuaWZvcm1MaXN0TWROYW1lICAgICAgICA9ICJnbGEudW5pZm9ybXMiOworY29uc3QgY2hhciogY29uc3QgSW52YXJpYW50TGlzdE1kTmFtZSAgICAgID0gImdsYS5pbnZhcmlhbnQiOworY29uc3QgY2hhciogY29uc3QgRW50cnlwb2ludExpc3RNZE5hbWUgICAgID0gImdsYS5lbnRyeXBvaW50IjsKK2NvbnN0IGNoYXIqIGNvbnN0IE5vU3RhdGljVXNlTWROYW1lICAgICAgICA9ICJnbGEubm9TdGF0aWNVc2UiOworY29uc3QgY2hhciogY29uc3QgV29ya2dyb3VwU2hhcmVkTWROYW1lICAgID0gImdsYS5zaGFyZWQiOyAgICAgICAgICAgICAgLy8gc3RvcmFnZSBxdWFsaWZpZXIgJ3NoYXJlZCcKKworY29uc3QgY2hhciogY29uc3QgSW5wdXRQcmltaXRpdmVNZE5hbWUgICAgID0gImdsYS5pbnB1dFByaW1pdGl2ZSI7Citjb25zdCBjaGFyKiBjb25zdCBPdXRwdXRQcmltaXRpdmVNZE5hbWUgICAgPSAiZ2xhLm91dHB1dFByaW1pdGl2ZSI7Citjb25zdCBjaGFyKiBjb25zdCBYZmJNb2RlTWROYW1lICAgICAgICAgICAgPSAiZ2xhLnhmYk1vZGUiOworY29uc3QgY2hhciogY29uc3QgTnVtVmVydGljZXNNZE5hbWUgICAgICAgID0gImdsYS5udW1WZXJ0aWNlcyI7Citjb25zdCBjaGFyKiBjb25zdCBWZXJ0ZXhTcGFjaW5nTWROYW1lICAgICAgPSAiZ2xhLnZlcnRleFNwYWNpbmciOworY29uc3QgY2hhciogY29uc3QgVmVydGV4T3JkZXJNZE5hbWUgICAgICAgID0gImdsYS52ZXJ0ZXhPcmRlciI7Citjb25zdCBjaGFyKiBjb25zdCBQb2ludE1vZGVNZE5hbWUgICAgICAgICAgPSAiZ2xhLnBvaW50TW9kZSI7Citjb25zdCBjaGFyKiBjb25zdCBJbnZvY2F0aW9uc01kTmFtZSAgICAgICAgPSAiZ2xhLmludm9jYXRpb25zIjsKK2NvbnN0IGNoYXIqIGNvbnN0IFBpeGVsQ2VudGVySW50ZWdlck1kTmFtZSA9ICJnbGEucGl4ZWxDZW50ZXJJbnRlZ2VyIjsKK2NvbnN0IGNoYXIqIGNvbnN0IE9yaWdpblVwcGVyTGVmdE1kTmFtZSAgICA9ICJnbGEub3JpZ2luVXBwZXJMZWZ0IjsKK2NvbnN0IGNoYXIqIGNvbnN0IEJsZW5kRXF1YXRpb25NZE5hbWUgICAgICA9ICJnbGEuYmxlbmRFcXVhdGlvbnMiOworY29uc3QgY2hhciogY29uc3QgTG9jYWxTaXplTWROYW1lICAgICAgICAgID0gImdsYS5sb2NhbFNpemUiOworCisvLyB3aGF0IGtpbmQgb2YgSS9POgorZW51bSBFTWRJbnB1dE91dHB1dCB7CisgICAgRU1pb05vbmUsICAgICAgICAgICAgICAgLy8gZm9yIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBJL08sIG9yIGFscmVhZHkgaGFkIGl0cyBFbWRJbnB1dE91dHB1dCBpbiBtZCBwb2ludGluZyBoZXJlCisKKyAgICAvLyBpbnB1dHMKKyAgICBFTWlvUGlwZUluLCAgICAgICAgICAgICAvLyBub3JtYWwgdXNlci1zdHJlYW1lZCBpbnB1dCBkYXRhOiBhdHRyaWJ1dGVzLCB2YXJ5aW5ncywgZXRjLgorICAgIEVNaW9WZXJ0ZXhJZCwKKyAgICBFTWlvSW5zdGFuY2VJZCwKKyAgICBFTWlvVmVydGV4SW5kZXgsCisgICAgRU1pb0luc3RhbmNlSW5kZXgsCisgICAgRU1pb0ZyYWdtZW50RmFjZSwKKyAgICBFTWlvRnJhZ21lbnRDb29yZCwKKyAgICBFTWlvUG9pbnRDb29yZCwKKworICAgIC8vIG91dHB1dHMKKyAgICBFTWlvUGlwZU91dCwgICAgICAgICAgICAvLyBub3JtYWwgdXNlci1zdHJlYW1lZCBvdXRwdXQgZGF0YSwgaW5jbHVkaW5nIGZyYWdtZW50IGNvbG9yCisgICAgRU1pb1ZlcnRleFBvc2l0aW9uLAorICAgIEVNaW9Qb2ludFNpemUsCisgICAgRU1pb0NsaXBWZXJ0ZXgsCisgICAgRU1pb0ZyYWdtZW50RGVwdGgsCisKKyAgICAvLyB1bmlmb3JtcworICAgIEVNaW9EZWZhdWx0VW5pZm9ybSwgICAgICAvLyBhIHVuaWZvcm0gdmFyaWFibGUgbm90IGluIGEgYmxvY2sKKyAgICBFTWlvVW5pZm9ybUJsb2NrTWVtYmVyLCAgLy8gdW5pZm9ybSBidWZmZXIgKHVuaWZvcm0gYmxvY2spCisgICAgRU1pb0J1ZmZlckJsb2NrTWVtYmVyLCAgIC8vIHNoYWRlciBzdG9yYWdlIGJ1ZmZlciBvYmplY3QgKGJ1ZmZlciBibG9jayksIHdpdGggbm8gcnVuLXRpbWUgc2l6ZWQgYXJyYXksIHNlZSBhbHNvIEVNaW9CdWZmZXJCbG9ja01lbWJlckFycmF5ZWQKKworICAgIC8vIEVudHJ5IHBvaW50IGludG8gc2hhZGVyCisgICAgRU1pb0VudHJ5cG9pbnQsCisKKyAgICAvLyBpbiAmIG91dCBibG9ja3MKKyAgICBFTWlvUGlwZU91dEJsb2NrLCAgICAgICAgIC8vIG91dHB1dCBibG9jaworICAgIEVNaW9QaXBlSW5CbG9jaywgICAgICAgICAgLy8gaW5wdXQgYmxvY2sKKworICAgIC8vIHVuaWZvcm1zCisgICAgRU1pb0J1ZmZlckJsb2NrTWVtYmVyQXJyYXllZCwgLy8gRU1pb0J1ZmZlckJsb2NrTWVtYmVyIGJ1dCB3aXRoIHJ1bi10aW1lIHNpemVkIGFycmF5IGFzIHRoZSBsYXN0IG1lbWJlcgorCisgICAgRU1pb0NvdW50LAorfTsKKworLy8gSG93IHRoZSAqaW50ZXJpb3IqIG9mIGEgc2luZ2xlLCBub24tYWdncmVnYXRlIGVudGl0eSBpcyBsYWlkIG91dCwgc3VwcGxlbWVudGFsIHRvIHRoZSAiVmFsdWUqIGZvciB0eXBlIgorLy8gQWxzbywgaG93IGEgYmxvY2sgb3Igc3RydWN0dXJlIGlzIGxhaWQgb3V0LCBpZiBhcHBsaWVkIHRvIGEgYmxvY2sgb3Igc3RydWN0dXJlCitlbnVtIEVNZFR5cGVMYXlvdXQgeworICAgIEVNdGxOb25lLAorCisgICAgLy8gc2luZ2xlLWVudGl0eSBsYXlvdXRzCisgICAgRU10bFVuc2lnbmVkLCAgICAgICAgICAgLy8gdW5zaWduZWQgaW50ZWdlciB0eXBlLCBvdGhlciB0eXBlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIExMVk0gdmFsdWUtPnR5cGUKKyAgICBFTXRsUm93TWFqb3JNYXRyaXgsCisgICAgRU10bENvbE1ham9yTWF0cml4LAorICAgIEVNdGxBZ2dyZWdhdGUsCisgICAgRU10bFNhbXBsZXIsCisKKyAgICAvLyBhZ2dyZWdhdGUgbGF5b3V0cworICAgIEVNdGxTaGFyZWQsICAgICAgICAgICAgIC8vIGxheW91dC1xdWFsaWZpZXIgaWRlbnRpZmllciAnc2hhcmVkJworICAgIEVNdGxTdGQxNDAsCisgICAgRU10bFN0ZDQzMCwKKyAgICBFTXRsUGFja2VkLAorCisgICAgLy8gQXRvbWljIGNvdW50ZXIKKyAgICBFTXRsQXRvbWljVWludCwKKworICAgIEVNdGxDb3VudCwKK307CisKKy8vIFdoYXQga2luZCBvZiBzYW1wbGVyCitlbnVtIEVNZFNhbXBsZXIgeworICAgIEVNc1RleHR1cmUsCisKKyAgICAvLyBJbWFnZSB3aXRoIG5vIGZvcm1hdAorICAgIEVNc0ltYWdlLAorCisgICAgLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0IGltYWdlCisgICAgRU1zUmdiYTMyZiwKKyAgICBFTXNSZ2JhMTZmLAorICAgIEVNc1IzMmYsCisgICAgRU1zUmdiYTgsCisgICAgRU1zUmdiYThTbm9ybSwKKyAgICBFTXNSZzMyZiwKKyAgICBFTXNSZzE2ZiwKKyAgICBFTXNSMTFmRzExZkIxMGYsCisgICAgRU1zUjE2ZiwKKyAgICBFTXNSZ2JhMTYsCisgICAgRU1zUmdiMTBBMiwKKyAgICBFTXNSZzE2LAorICAgIEVNc1JnOCwKKyAgICBFTXNSMTYsCisgICAgRU1zUjgsCisgICAgRU1zUmdiYTE2U25vcm0sCisgICAgRU1zUmcxNlNub3JtLAorICAgIEVNc1JnOFNub3JtLAorICAgIEVNc1IxNlNub3JtLAorICAgIEVNc1I4U25vcm0sCisKKyAgICAvLyBzaWduZWQtaW50IGZvcm1hdCBpbWFnZQorICAgIEVNc1JnYmEzMmksCisgICAgRU1zUmdiYTE2aSwKKyAgICBFTXNSZ2JhOGksCisgICAgRU1zUjMyaSwKKyAgICBFTXNSZzMyaSwKKyAgICBFTXNSZzE2aSwKKyAgICBFTXNSZzhpLAorICAgIEVNc1IxNmksCisgICAgRU1zUjhpLAorCisgICAgLy8gdW5zaWduZWQtaW50IGZvcm1hdCBpbWFnZQorICAgIEVNc1JnYmEzMnVpLAorICAgIEVNc1JnYmExNnVpLAorICAgIEVNc1JnYmE4dWksCisgICAgRU1zUjMydWksCisgICAgRU1zUmczMnVpLAorICAgIEVNc1JnMTZ1aSwKKyAgICBFTXNSZzh1aSwKKyAgICBFTXNSMTZ1aSwKKyAgICBFTXNSOHVpLAorCisgICAgRU1zQ291bnQsCit9OworCisvLyBEaW1lbnNpb25hbGl0eSBvZiBzYW1wbGVyCitlbnVtIEVNZFNhbXBsZXJEaW0geworICAgIEVNc2QxRCwKKyAgICBFTXNkMkQsCisgICAgRU1zZDNELAorICAgIEVNc2RDdWJlLAorICAgIEVNc2RSZWN0LAorICAgIEVNc2RCdWZmZXIsCisgICAgRU1zZDJETVMsCisgICAgRU1zZENvdW50LAorfTsKKworLy8gUmV0dXJuIHR5cGUgb2Ygc2FtcGxlcgorZW51bSBFTWRTYW1wbGVyQmFzZVR5cGUgeworICAgIEVNc2JGbG9hdCwKKyAgICBFTXNiSW50LAorICAgIEVNc2JVaW50LAorICAgIEVNc2JDb3VudCwKK307CisKKy8vIEVTU0wgcHJlY2lzaW9uIHF1YWxpZmllcgorZW51bSBFTWRQcmVjaXNpb24geworICAgIEVNcE5vbmUsCisgICAgRU1wTG93LAorICAgIEVNcE1lZGl1bSwKKyAgICBFTXBIaWdoLAorICAgIEVNcENvdW50LAorfTsKKworLy8gRm9yIGlucHV0L291dHB1dCBwcmltaXRpdmVzCitlbnVtIEVNZExheW91dEdlb21ldHJ5IHsKKyAgICBFTWxnTm9uZSwKKyAgICBFTWxnUG9pbnRzLAorICAgIEVNbGdMaW5lcywKKyAgICBFTWxnTGluZXNBZGphY2VuY3ksCisgICAgRU1sZ0xpbmVTdHJpcCwKKyAgICBFTWxnVHJpYW5nbGVzLAorICAgIEVNbGdUcmlhbmdsZXNBZGphY2VuY3ksCisgICAgRU1sZ1RyaWFuZ2xlU3RyaXAsCisgICAgRU1sZ1F1YWRzLAorICAgIEVNbGdJc29saW5lcywKKyAgICBFTWxnQ291bnQsCit9OworCitlbnVtIEVNZFZlcnRleFNwYWNpbmcgeworICAgIEVNdnNOb25lLAorICAgIEVNdnNFcXVhbCwKKyAgICBFTXZzRnJhY3Rpb25hbEV2ZW4sCisgICAgRU12c0ZyYWN0aW9uYWxPZGQsCisgICAgRU12c0NvdW50LAorfTsKKworZW51bSBFTWRWZXJ0ZXhPcmRlciB7CisgICAgRU12b05vbmUsCisgICAgRU12b0N3LAorICAgIEVNdm9DY3csCisgICAgRU12b0NvdW50LAorfTsKKworZW51bSBFTWRCdWlsdEluIHsKKyAgICBFbWJOb25lLAorICAgIEVtYk51bVdvcmtHcm91cHMsCisgICAgRW1iV29ya0dyb3VwU2l6ZSwKKyAgICBFbWJXb3JrR3JvdXBJZCwKKyAgICBFbWJMb2NhbEludm9jYXRpb25JZCwKKyAgICBFbWJHbG9iYWxJbnZvY2F0aW9uSWQsCisgICAgRW1iTG9jYWxJbnZvY2F0aW9uSW5kZXgsCisgICAgRW1iVmVydGV4SWQsCisgICAgRW1iSW5zdGFuY2VJZCwKKyAgICBFbWJQb3NpdGlvbiwKKyAgICBFbWJQb2ludFNpemUsCisgICAgRW1iQ2xpcFZlcnRleCwKKyAgICBFbWJDbGlwRGlzdGFuY2UsCisgICAgRW1iQ3VsbERpc3RhbmNlLAorICAgIEVtYk5vcm1hbCwKKyAgICBFbWJWZXJ0ZXgsCisgICAgRW1iTXVsdGlUZXhDb29yZDAsCisgICAgRW1iTXVsdGlUZXhDb29yZDEsCisgICAgRW1iTXVsdGlUZXhDb29yZDIsCisgICAgRW1iTXVsdGlUZXhDb29yZDMsCisgICAgRW1iTXVsdGlUZXhDb29yZDQsCisgICAgRW1iTXVsdGlUZXhDb29yZDUsCisgICAgRW1iTXVsdGlUZXhDb29yZDYsCisgICAgRW1iTXVsdGlUZXhDb29yZDcsCisgICAgRW1iRnJvbnRDb2xvciwKKyAgICBFbWJCYWNrQ29sb3IsCisgICAgRW1iRnJvbnRTZWNvbmRhcnlDb2xvciwKKyAgICBFbWJCYWNrU2Vjb25kYXJ5Q29sb3IsCisgICAgRW1iVGV4Q29vcmQsCisgICAgRW1iRm9nRnJhZ0Nvb3JkLAorICAgIEVtYkludm9jYXRpb25JZCwKKyAgICBFbWJQcmltaXRpdmVJZCwKKyAgICBFbWJMYXllciwKKyAgICBFbWJWaWV3cG9ydEluZGV4LAorICAgIEVtYlBhdGNoVmVydGljZXMsCisgICAgRW1iVGVzc0xldmVsT3V0ZXIsCisgICAgRW1iVGVzc0xldmVsSW5uZXIsCisgICAgRW1iVGVzc0Nvb3JkLAorICAgIEVtYkNvbG9yLAorICAgIEVtYlNlY29uZGFyeUNvbG9yLAorICAgIEVtYkZhY2UsCisgICAgRW1iRnJhZ0Nvb3JkLAorICAgIEVtYlBvaW50Q29vcmQsCisgICAgRW1iRnJhZ0NvbG9yLAorICAgIEVtYkZyYWdEYXRhLAorICAgIEVtYkZyYWdEZXB0aCwKKyAgICBFbWJTYW1wbGVJZCwKKyAgICBFbWJTYW1wbGVQb3NpdGlvbiwKKyAgICBFbWJTYW1wbGVNYXNrLAorICAgIEVtYkhlbHBlckludm9jYXRpb24sCisgICAgRW1iQm91bmRpbmdCb3gsCisgICAgRW1iVmVydGV4SW5kZXgsCisgICAgRW1iSW5zdGFuY2VJbmRleCwKKyAgICBFbWJDb3VudAorfTsKKworLy8gVGhlc2UgYXJlIGJpdC1zaGlmdCBhbW91bnRzIGZvciB2YXJpb3VzIGFkZGl0aW9uYWwgcXVhbGlmaWVycy4KK2VudW0gRU1kUXVhbGlmaWVyU2hpZnQgeworICAgIEVtcU5vbnJlYWRhYmxlLAorICAgIEVtcU5vbndyaXRhYmxlLAorICAgIEVtcVZvbGF0aWxlLAorICAgIEVtcVJlc3RyaWN0LAorICAgIEVtcUNvaGVyZW50LAorCisgICAgRW1xQ291bnQKK307CisKK2VudW0gRU1kQmxlbmRFcXVhdGlvblNoaWZ0IHsKKyAgICAvLyBObyAnRU1lTm9uZSc6CisgICAgLy8gVGhlc2UgYXJlIHVzZWQgYXMgYml0LXNoaWZ0IGFtb3VudHMuICBBIG1hc2sgb2Ygc3VjaCBzaGlmdHMgd2lsbCBoYXZlIHR5cGUgJ2ludCcsCisgICAgLy8gYW5kIGluIHRoYXQgc3BhY2UsIDAgbWVhbnMgbm8gYml0cyBzZXQsIG9yIG5vbmUuICBJbiB0aGlzIGVudW0sIDAgbWVhbnMgKDEgPDwgMCksIGEgYml0IGlzIHNldC4KKyAgICBFbWVNdWx0aXBseSwKKyAgICBFbWVTY3JlZW4sCisgICAgRW1lT3ZlcmxheSwKKyAgICBFbWVEYXJrZW4sCisgICAgRW1lTGlnaHRlbiwKKyAgICBFbWVDb2xvcmRvZGdlLAorICAgIEVtZUNvbG9yYnVybiwKKyAgICBFbWVIYXJkbGlnaHQsCisgICAgRW1lU29mdGxpZ2h0LAorICAgIEVtZURpZmZlcmVuY2UsCisgICAgRW1lRXhjbHVzaW9uLAorICAgIEVtZUhzbEh1ZSwKKyAgICBFbWVIc2xTYXR1cmF0aW9uLAorICAgIEVtZUhzbENvbG9yLAorICAgIEVtZUhzbEx1bWlub3NpdHksCisgICAgRW1lQWxsRXF1YXRpb25zLAorCisgICAgRW1lQ291bnQKK307CisKKy8vCisvLyBDcmFja2VycyBhcmUgZm9yIHRoZSBjb25zdW1lciBvZiB0aGUgSVIuCisvLyBUaGV5IHRha2UgYW4gTUQgbm9kZSwgb3IgaW5zdHJ1Y3Rpb24gdGhhdCBtaWdodCBwb2ludCB0byBvbmUsIGFuZCBkZWNvZGUgaXQsIGFzIHBlciB0aGUgZW51bXMgYWJvdmUuCisvLworCitpbmxpbmUgYm9vbCBDcmFja1R5cGVMYXlvdXQoY29uc3QgbGx2bTo6TUROb2RlKiBtZCwgRU1kVHlwZUxheW91dCYgbGF5b3V0LCBFTWRQcmVjaXNpb24mIHByZWNpc2lvbiwgaW50JiBsb2NhdGlvbiwgY29uc3QgbGx2bTo6TUROb2RlKiYgc2FtcGxlciwgaW50JiBpbnRlcnBNb2RlLCBFTWRCdWlsdEluJiBidWlsdEluKQoreworICAgIGNvbnN0IGxsdm06OkNvbnN0YW50SW50KiBjb25zdEludCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihtZC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgaWYgKCEgY29uc3RJbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBsYXlvdXQgPSAoRU1kVHlwZUxheW91dCljb25zdEludC0+Z2V0U0V4dFZhbHVlKCk7CisKKyAgICBjb25zdEludCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihtZC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKCEgY29uc3RJbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwcmVjaXNpb24gPSAoRU1kUHJlY2lzaW9uKWNvbnN0SW50LT5nZXRTRXh0VmFsdWUoKTsKKworICAgIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDIpKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGxvY2F0aW9uID0gKGludCljb25zdEludC0+Z2V0U0V4dFZhbHVlKCk7CisKKyAgICBsbHZtOjpWYWx1ZSogc3BlY3VsYXRpdmVTYW1wbGVyID0gbWQtPmdldE9wZXJhbmQoMyk7CisgICAgaWYgKHNwZWN1bGF0aXZlU2FtcGxlcikKKyAgICAgICAgc2FtcGxlciA9IGxsdm06OmR5bl9jYXN0PGxsdm06Ok1ETm9kZT4oc3BlY3VsYXRpdmVTYW1wbGVyKTsKKyAgICBlbHNlCisgICAgICAgIHNhbXBsZXIgPSAwOworCisgICAgaWYgKG1kLT5nZXROdW1PcGVyYW5kcygpID49IDUpIHsKKyAgICAgICAgY29uc3QgbGx2bTo6Q29uc3RhbnRJbnQqIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDQpKTsKKyAgICAgICAgaWYgKGNvbnN0SW50KQorICAgICAgICAgICAgaW50ZXJwTW9kZSA9IChpbnQpY29uc3RJbnQtPmdldFpFeHRWYWx1ZSgpOworICAgIH0gZWxzZQorICAgICAgICBpbnRlcnBNb2RlID0gMDsKKworICAgIGlmIChtZC0+Z2V0TnVtT3BlcmFuZHMoKSA+PSA2KSB7CisgICAgICAgIGNvbnN0IGxsdm06OkNvbnN0YW50SW50KiBjb25zdEludCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihtZC0+Z2V0T3BlcmFuZCg1KSk7CisgICAgICAgIGlmIChjb25zdEludCkKKyAgICAgICAgICAgIGJ1aWx0SW4gPSAoRU1kQnVpbHRJbiljb25zdEludC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgfSBlbHNlCisgICAgICAgIGJ1aWx0SW4gPSBFbWJOb25lOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIENyYWNrVHlwZUxheW91dChjb25zdCBsbHZtOjpNRE5vZGUqIG1kLCBFTWRUeXBlTGF5b3V0JiBsYXlvdXQsIEVNZFByZWNpc2lvbiYgcHJlY2lzaW9uLCBpbnQmIGxvY2F0aW9uLCBjb25zdCBsbHZtOjpNRE5vZGUqJiBzYW1wbGVyLCBpbnQmIGludGVycE1vZGUsIEVNZEJ1aWx0SW4mIGJ1aWx0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBiaW5kaW5nLCB1bnNpZ25lZCBpbnQmIHF1YWxpZmllcnMsIGludCYgb2Zmc2V0KQoreworICAgIENyYWNrVHlwZUxheW91dChtZCwgbGF5b3V0LCBwcmVjaXNpb24sIGxvY2F0aW9uLCBzYW1wbGVyLCBpbnRlcnBNb2RlLCBidWlsdEluKTsKKyAgICBpZiAobWQtPmdldE51bU9wZXJhbmRzKCkgPj0gNykgeworICAgICAgICBjb25zdCBsbHZtOjpDb25zdGFudEludCogY29uc3RJbnQgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpDb25zdGFudEludD4obWQtPmdldE9wZXJhbmQoNikpOworICAgICAgICBpZiAoY29uc3RJbnQpCisgICAgICAgICAgICBiaW5kaW5nID0gKGludCljb25zdEludC0+Z2V0U0V4dFZhbHVlKCk7CisgICAgfSBlbHNlCisgICAgICAgIGJpbmRpbmcgPSAtMTsKKworICAgIGlmIChtZC0+Z2V0TnVtT3BlcmFuZHMoKSA+PSA4KSB7CisgICAgICAgIGNvbnN0IGxsdm06OkNvbnN0YW50SW50KiBjb25zdEludCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihtZC0+Z2V0T3BlcmFuZCg3KSk7CisgICAgICAgIGlmIChjb25zdEludCkKKyAgICAgICAgICAgIHF1YWxpZmllcnMgPSAodW5zaWduZWQgaW50KWNvbnN0SW50LT5nZXRaRXh0VmFsdWUoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcXVhbGlmaWVycyA9IDA7CisKKyAgICBpZiAobWQtPmdldE51bU9wZXJhbmRzKCkgPj0gOSkgeworICAgICAgICBjb25zdCBsbHZtOjpDb25zdGFudEludCogY29uc3RJbnQgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpDb25zdGFudEludD4obWQtPmdldE9wZXJhbmQoOCkpOworICAgICAgICBpZiAoY29uc3RJbnQpCisgICAgICAgICAgICBvZmZzZXQgPSAoaW50KWNvbnN0SW50LT5nZXRTRXh0VmFsdWUoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBDcmFja0lPTWRUeXBlKGNvbnN0IGxsdm06Ok1ETm9kZSogbWQsIGxsdm06OlR5cGUqJiB0eXBlKQoreworICAgIGlmICghIG1kLT5nZXRPcGVyYW5kKDIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdHlwZSA9IG1kLT5nZXRPcGVyYW5kKDIpLT5nZXRUeXBlKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgQ3JhY2tJT01kKGNvbnN0IGxsdm06Ok1ETm9kZSogbWQsIHN0ZDo6c3RyaW5nJiBzeW1ib2xOYW1lLCBFTWRJbnB1dE91dHB1dCYgcXVhbGlmaWVyLCBsbHZtOjpUeXBlKiYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBFTWRUeXBlTGF5b3V0JiBsYXlvdXQsIEVNZFByZWNpc2lvbiYgcHJlY2lzaW9uLCBpbnQmIGxvY2F0aW9uLCBjb25zdCBsbHZtOjpNRE5vZGUqJiBzYW1wbGVyLCBjb25zdCBsbHZtOjpNRE5vZGUqJiBhZ2dyZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50JiBpbnRlcnBNb2RlLCBFTWRCdWlsdEluJiBidWlsdEluKQoreworICAgIHN5bWJvbE5hbWUgPSBtZC0+Z2V0T3BlcmFuZCgwKS0+Z2V0TmFtZSgpOworCisgICAgY29uc3QgbGx2bTo6Q29uc3RhbnRJbnQqIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHF1YWxpZmllciA9IChFTWRJbnB1dE91dHB1dCljb25zdEludC0+Z2V0U0V4dFZhbHVlKCk7CisKKyAgICBpZiAoISBtZC0+Z2V0T3BlcmFuZCgyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHR5cGUgPSBtZC0+Z2V0T3BlcmFuZCgyKS0+Z2V0VHlwZSgpOworCisgICAgbGx2bTo6TUROb2RlKiBsYXlvdXRNZCA9IGxsdm06OmR5bl9jYXN0PGxsdm06Ok1ETm9kZT4obWQtPmdldE9wZXJhbmQoMykpOworICAgIGlmICghIGxheW91dE1kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCEgQ3JhY2tUeXBlTGF5b3V0KGxheW91dE1kLCBsYXlvdXQsIHByZWNpc2lvbiwgbG9jYXRpb24sIHNhbXBsZXIsIGludGVycE1vZGUsIGJ1aWx0SW4pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobWQtPmdldE51bU9wZXJhbmRzKCkgPj0gNSkKKyAgICAgICAgYWdncmVnYXRlID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6TUROb2RlPihtZC0+Z2V0T3BlcmFuZCg0KSk7CisgICAgZWxzZQorICAgICAgICBhZ2dyZWdhdGUgPSAwOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIENyYWNrSU9NZChjb25zdCBsbHZtOjpNRE5vZGUqIG1kLCBzdGQ6OnN0cmluZyYgc3ltYm9sTmFtZSwgRU1kSW5wdXRPdXRwdXQmIHF1YWxpZmllciwgbGx2bTo6VHlwZSomIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgRU1kVHlwZUxheW91dCYgbGF5b3V0LCBFTWRQcmVjaXNpb24mIHByZWNpc2lvbiwgaW50JiBsb2NhdGlvbiwgY29uc3QgbGx2bTo6TUROb2RlKiYgc2FtcGxlciwgY29uc3QgbGx2bTo6TUROb2RlKiYgYWdncmVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCYgaW50ZXJwTW9kZSwgRU1kQnVpbHRJbiYgYnVpbHRJbiwgaW50JiBiaW5kaW5nLCB1bnNpZ25lZCBpbnQmIHF1YWxpZmllcnMsIGludCYgb2Zmc2V0KQoreworICAgIHN5bWJvbE5hbWUgPSBtZC0+Z2V0T3BlcmFuZCgwKS0+Z2V0TmFtZSgpOworCisgICAgY29uc3QgbGx2bTo6Q29uc3RhbnRJbnQqIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHF1YWxpZmllciA9IChFTWRJbnB1dE91dHB1dCljb25zdEludC0+Z2V0U0V4dFZhbHVlKCk7CisKKyAgICBpZiAoISBtZC0+Z2V0T3BlcmFuZCgyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHR5cGUgPSBtZC0+Z2V0T3BlcmFuZCgyKS0+Z2V0VHlwZSgpOworCisgICAgbGx2bTo6TUROb2RlKiBsYXlvdXRNZCA9IGxsdm06OmR5bl9jYXN0PGxsdm06Ok1ETm9kZT4obWQtPmdldE9wZXJhbmQoMykpOworICAgIGlmICghIGxheW91dE1kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCEgQ3JhY2tUeXBlTGF5b3V0KGxheW91dE1kLCBsYXlvdXQsIHByZWNpc2lvbiwgbG9jYXRpb24sIHNhbXBsZXIsIGludGVycE1vZGUsIGJ1aWx0SW4sIGJpbmRpbmcsIHF1YWxpZmllcnMsIG9mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtZC0+Z2V0TnVtT3BlcmFuZHMoKSA+PSA1KQorICAgICAgICBhZ2dyZWdhdGUgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpNRE5vZGU+KG1kLT5nZXRPcGVyYW5kKDQpKTsKKyAgICBlbHNlCisgICAgICAgIGFnZ3JlZ2F0ZSA9IDA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgQ3JhY2tBZ2dyZWdhdGVNZChjb25zdCBsbHZtOjpNRE5vZGUqIG1kLCBzdGQ6OnN0cmluZyYgc3ltYm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1kVHlwZUxheW91dCYgbGF5b3V0LCBFTWRQcmVjaXNpb24mIHByZWNpc2lvbiwgaW50JiBsb2NhdGlvbiwgY29uc3QgbGx2bTo6TUROb2RlKiYgc2FtcGxlciwgRU1kQnVpbHRJbiYgYnVpbHRJbikKK3sKKyAgICBzeW1ib2xOYW1lID0gbWQtPmdldE9wZXJhbmQoMCktPmdldE5hbWUoKTsKKyAgICBpbnQgZHVtbXlJbnRlcnBNb2RlOworCisgICAgbGx2bTo6TUROb2RlKiBsYXlvdXRNZCA9IGxsdm06OmR5bl9jYXN0PGxsdm06Ok1ETm9kZT4obWQtPmdldE9wZXJhbmQoMSkpOworICAgIGlmICghIGxheW91dE1kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCEgQ3JhY2tUeXBlTGF5b3V0KGxheW91dE1kLCBsYXlvdXQsIHByZWNpc2lvbiwgbG9jYXRpb24sIHNhbXBsZXIsIGR1bW15SW50ZXJwTW9kZSwgYnVpbHRJbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBDcmFja0FnZ3JlZ2F0ZU1kKGNvbnN0IGxsdm06Ok1ETm9kZSogbWQsIHN0ZDo6c3RyaW5nJiBzeW1ib2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTWRUeXBlTGF5b3V0JiBsYXlvdXQsIEVNZFByZWNpc2lvbiYgcHJlY2lzaW9uLCBpbnQmIGxvY2F0aW9uLCBjb25zdCBsbHZtOjpNRE5vZGUqJiBzYW1wbGVyLCBFTWRCdWlsdEluJiBidWlsdEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGJpbmRpbmcsIHVuc2lnbmVkIGludCYgcXVhbGlmaWVycywgaW50JiBvZmZzZXQpCit7CisgICAgc3ltYm9sTmFtZSA9IG1kLT5nZXRPcGVyYW5kKDApLT5nZXROYW1lKCk7CisgICAgaW50IGR1bW15SW50ZXJwTW9kZTsKKworICAgIGxsdm06Ok1ETm9kZSogbGF5b3V0TWQgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpNRE5vZGU+KG1kLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoISBsYXlvdXRNZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghIENyYWNrVHlwZUxheW91dChsYXlvdXRNZCwgbGF5b3V0LCBwcmVjaXNpb24sIGxvY2F0aW9uLCBzYW1wbGVyLCBkdW1teUludGVycE1vZGUsIGJ1aWx0SW4sIGJpbmRpbmcsIHF1YWxpZmllcnMsIG9mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBDcmFja0lPTWQoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCBsbHZtOjpTdHJpbmdSZWYga2luZCwgc3RkOjpzdHJpbmcmIHN5bWJvbE5hbWUsIEVNZElucHV0T3V0cHV0JiBxdWFsaWZpZXIsIGxsdm06OlR5cGUqJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIEVNZFR5cGVMYXlvdXQmIGxheW91dCwgRU1kUHJlY2lzaW9uJiBwcmVjaXNpb24sIGludCYgbG9jYXRpb24sIGNvbnN0IGxsdm06Ok1ETm9kZSomIHNhbXBsZXIsIGNvbnN0IGxsdm06Ok1ETm9kZSomIGFnZ3JlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIGludGVycE1vZGUsIEVNZEJ1aWx0SW4mIGJ1aWx0SW4pCit7CisgICAgY29uc3QgbGx2bTo6TUROb2RlKiBtZCA9IGluc3RydWN0aW9uLT5nZXRNZXRhZGF0YShraW5kKTsKKyAgICBpZiAoISBtZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIENyYWNrSU9NZChtZCwgc3ltYm9sTmFtZSwgcXVhbGlmaWVyLCB0eXBlLCBsYXlvdXQsIHByZWNpc2lvbiwgbG9jYXRpb24sIHNhbXBsZXIsIGFnZ3JlZ2F0ZSwgaW50ZXJwTW9kZSwgYnVpbHRJbik7Cit9CisKK2lubGluZSBib29sIENyYWNrSU9NZChjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIGxsdm06OlN0cmluZ1JlZiBraW5kLCBzdGQ6OnN0cmluZyYgc3ltYm9sTmFtZSwgRU1kSW5wdXRPdXRwdXQmIHF1YWxpZmllciwgbGx2bTo6VHlwZSomIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgRU1kVHlwZUxheW91dCYgbGF5b3V0LCBFTWRQcmVjaXNpb24mIHByZWNpc2lvbiwgaW50JiBsb2NhdGlvbiwgY29uc3QgbGx2bTo6TUROb2RlKiYgc2FtcGxlciwgY29uc3QgbGx2bTo6TUROb2RlKiYgYWdncmVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCYgaW50ZXJwTW9kZSwgRU1kQnVpbHRJbiYgYnVpbHRJbiwgaW50JiBiaW5kaW5nLCB1bnNpZ25lZCBpbnQmIHF1YWxpZmllcnMsIGludCYgb2Zmc2V0KQoreworICAgIGNvbnN0IGxsdm06Ok1ETm9kZSogbWQgPSBpbnN0cnVjdGlvbi0+Z2V0TWV0YWRhdGEoa2luZCk7CisgICAgaWYgKCEgbWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBDcmFja0lPTWQobWQsIHN5bWJvbE5hbWUsIHF1YWxpZmllciwgdHlwZSwgbGF5b3V0LCBwcmVjaXNpb24sIGxvY2F0aW9uLCBzYW1wbGVyLCBhZ2dyZWdhdGUsIGludGVycE1vZGUsIGJ1aWx0SW4sIGJpbmRpbmcsIHF1YWxpZmllcnMsIG9mZnNldCk7Cit9CisKK2lubGluZSBib29sIENyYWNrU2FtcGxlck1kKGNvbnN0IGxsdm06Ok1ETm9kZSogbWQsIEVNZFNhbXBsZXImIHNhbXBsZXIsIGxsdm06OlR5cGUqJiB0eXBlLCBFTWRTYW1wbGVyRGltJiBkaW0sIGJvb2wmIGlzQXJyYXksIGJvb2wmIGlzU2hhZG93LCBFTWRTYW1wbGVyQmFzZVR5cGUmIGJhc2VUeXBlKQoreworICAgIGNvbnN0IGxsdm06OkNvbnN0YW50SW50KiBjb25zdEludCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihtZC0+Z2V0T3BlcmFuZCgwKSk7CisgICAgaWYgKCEgY29uc3RJbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzYW1wbGVyID0gKEVNZFNhbXBsZXIpY29uc3RJbnQtPmdldFNFeHRWYWx1ZSgpOworCisgICAgaWYgKCEgbWQtPmdldE9wZXJhbmQoMSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB0eXBlID0gbWQtPmdldE9wZXJhbmQoMSktPmdldFR5cGUoKTsKKworICAgIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDIpKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRpbSA9IChFTWRTYW1wbGVyRGltKWNvbnN0SW50LT5nZXRTRXh0VmFsdWUoKTsKKworICAgIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDMpKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlzQXJyYXkgPSBjb25zdEludC0+Z2V0U0V4dFZhbHVlKCkgIT0gMDsKKworICAgIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDQpKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlzU2hhZG93ID0gY29uc3RJbnQtPmdldFNFeHRWYWx1ZSgpICE9IDA7CisKKyAgICBjb25zdEludCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihtZC0+Z2V0T3BlcmFuZCg1KSk7CisgICAgaWYgKCEgY29uc3RJbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBiYXNlVHlwZSA9IChFTWRTYW1wbGVyQmFzZVR5cGUpY29uc3RJbnQtPmdldFNFeHRWYWx1ZSgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIENyYWNrUHJlY2lzaW9uTWQoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCBFTWRQcmVjaXNpb24mIHByZWNpc2lvbikKK3sKKyAgICBwcmVjaXNpb24gPSBFTXBOb25lOworCisgICAgY29uc3QgbGx2bTo6TUROb2RlKiBtZCA9IGluc3RydWN0aW9uLT5nZXRNZXRhZGF0YShQcmVjaXNpb25NZE5hbWUpOworICAgIGlmICghIG1kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBsbHZtOjpDb25zdGFudEludCogY29uc3RJbnQgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpDb25zdGFudEludD4obWQtPmdldE9wZXJhbmQoMCkpOworICAgIGlmICghIGNvbnN0SW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHJlY2lzaW9uID0gKEVNZFByZWNpc2lvbiljb25zdEludC0+Z2V0U0V4dFZhbHVlKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gdHJhbnNsYXRlIGZyb20gMC1iYXNlZCBjb3VudGluZyB0byBhZ2dyZWdhdGUgb3BlcmFuZCBudW1iZXIKK2lubGluZSBpbnQgR2V0QWdncmVnYXRlTWROYW1lT3AoaW50IGluZGV4KQoreworICAgIHJldHVybiAyICsgMiAqIGluZGV4OworfQorCitpbmxpbmUgaW50IEdldEFnZ3JlZ2F0ZU1kU3ViQWdncmVnYXRlT3AoaW50IGluZGV4KQoreworICAgIHJldHVybiAyICsgMiAqIGluZGV4ICsgMTsKK30KKworLy8gSnVzdCBhIHNob3J0IGN1dCBmb3Igd2hlbiBvbmx5IHRoZSB0eXBlIGlzIGNhcmVkIGFib3V0LCByYXRoZXIgdGhhbiBjcmFja2luZyBhbGwgdGhlIG9wZXJhbmRzLgorLy8gSXQgbG9va3MgZm9yIGJvdGggZm9ybXMgb2Ygd2hldGhlciB0aGlzIGlzIGEgZGVmZXJlbmNlZCBhZ2dyZWdhdGUgb3IgYSB0b3AtbGV2ZWwgaW50ZXJmYWNlIG1kLgoraW5saW5lIEVNZFR5cGVMYXlvdXQgR2V0TWRUeXBlTGF5b3V0KGNvbnN0IGxsdm06Ok1ETm9kZSAqbWQpCit7CisgICAgaWYgKCEgbWQpCisgICAgICAgIHJldHVybiBFTXRsTm9uZTsKKworICAgIC8vIGNoZWNrIGZvciBhZ2dyZWdhdGUgbWVtYmVyIGZvcm0gZmlyc3QKKyAgICBsbHZtOjpNRE5vZGUqIGxheW91dE1kID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6TUROb2RlPihtZC0+Z2V0T3BlcmFuZCgxKSk7CisgICAgaWYgKCEgbGF5b3V0TWQpIHsKKyAgICAgICAgLy8gY2hlY2sgZm9yIHRvcC1sZXZlbCBpbnRlcmZhY2UKKyAgICAgICAgbGF5b3V0TWQgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpNRE5vZGU+KG1kLT5nZXRPcGVyYW5kKDMpKTsKKyAgICAgICAgaWYgKCEgbGF5b3V0TWQpCisgICAgICAgICAgICByZXR1cm4gRU10bE5vbmU7CisgICAgfQorCisgICAgY29uc3QgbGx2bTo6Q29uc3RhbnRJbnQqIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KGxheW91dE1kLT5nZXRPcGVyYW5kKDApKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIEVNdGxOb25lOworCisgICAgcmV0dXJuIChFTWRUeXBlTGF5b3V0KWNvbnN0SW50LT5nZXRTRXh0VmFsdWUoKTsKK30KKworLy8gQSBzaG9ydGN1dCBmb3IganVzdCBnZXR0aW5nIHRoZSB0eXBlIG9mIGEgc2FtcGxlciAoaW50LCB1aW50LCBmbG9hdCkgZnJvbSBhbgorLy8gaW5zdHJ1Y3Rpb24ncyBtZXRhZGF0YQoraW5saW5lIEVNZFNhbXBsZXJCYXNlVHlwZSBHZXRNZFNhbXBsZXJCYXNlVHlwZShjb25zdCBsbHZtOjpNRE5vZGUqIG1kKQoreworICAgIGlmICghIG1kIHx8IG1kLT5nZXROdW1PcGVyYW5kcygpIDwgNCkKKyAgICAgICAgcmV0dXJuIEVNc2JGbG9hdDsKKworICAgIG1kID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6TUROb2RlPihtZC0+Z2V0T3BlcmFuZCgzKSk7CisgICAgaWYgKCEgbWQgfHwgbWQtPmdldE51bU9wZXJhbmRzKCkgPCA0IHx8IG1kLT5nZXRPcGVyYW5kKDMpID09IDApCisgICAgICAgIHJldHVybiBFTXNiRmxvYXQ7CisKKyAgICBtZCA9IGxsdm06OmR5bl9jYXN0PGxsdm06Ok1ETm9kZT4obWQtPmdldE9wZXJhbmQoMykpOworICAgIGlmICghIG1kIHx8IG1kLT5nZXROdW1PcGVyYW5kcygpIDwgNiB8fCBtZC0+Z2V0T3BlcmFuZCg1KSA9PSAwKQorICAgICAgICByZXR1cm4gRU1zYkZsb2F0OworCisgICAgY29uc3QgbGx2bTo6Q29uc3RhbnRJbnQqIGNvbnN0SW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRJbnQ+KG1kLT5nZXRPcGVyYW5kKDUpKTsKKyAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgcmV0dXJuIEVNc2JGbG9hdDsKKworICAgIHJldHVybiAoRU1kU2FtcGxlckJhc2VUeXBlKWNvbnN0SW50LT5nZXRTRXh0VmFsdWUoKTsKK30KKworLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgaW50ZWdlciBtZXRhZGF0YSBvcGVyYW5kIHRvIHRoZSBuYW1lZCBtZXRhZGF0YSBub2RlLgorLy8gUmV0dXJuIDAgaWYgdGhlIG5hbWVkIG5vZGUgaXMgbWlzc2luZywgb3Igd2FzIHRoZXJlIGFuZCBpdCdzIG1ldGFkYXRhIG5vZGUgd2FzIDAgb3IgZmFsc2UuCitpbmxpbmUgaW50IEdldE1kTmFtZWRJbnQobGx2bTo6TW9kdWxlJiBtb2R1bGUsIGNvbnN0IGNoYXIqIG5hbWUpCit7CisgICAgbGx2bTo6TmFtZWRNRE5vZGUqIG5hbWVkTm9kZSA9IG1vZHVsZS5nZXROYW1lZE1ldGFkYXRhKG5hbWUpOworICAgIGlmIChuYW1lZE5vZGUgPT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY29uc3QgbGx2bTo6TUROb2RlKiBtZCA9IG5hbWVkTm9kZS0+Z2V0T3BlcmFuZCgwKTsKKyAgICBjb25zdCBsbHZtOjpDb25zdGFudEludCogY29uc3RJbnQgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpDb25zdGFudEludD4obWQtPmdldE9wZXJhbmQoMCkpOworICAgIGlmICghIGNvbnN0SW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAoaW50KWNvbnN0SW50LT5nZXRTRXh0VmFsdWUoKTsKK30KKworLy8gQnVpbGQgdGhlIHNldCBvZiB2YWx1ZXMgb2YgdGhlIGludGVnZXIgbWV0YWRhdGEgb3BlcmFuZCB0byB0aGUgbmFtZWQgbWV0YWRhdGEgbm9kZS4KKy8vIFJldHVybiBmYWxzZSBpZiB0aGUgbmFtZWQgbm9kZSBpcyBtaXNzaW5nLCBvciB3YXMgdGhlcmUgYW5kIGl0J3MgbWV0YWRhdGEgbm9kZSB3YXMgMCBvciBmYWxzZS4KK2lubGluZSBib29sIEdldE1kTmFtZWRJbnRzKGxsdm06Ok1vZHVsZSYgbW9kdWxlLCBjb25zdCBjaGFyKiBuYW1lLCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbnRzKQoreworICAgIGxsdm06Ok5hbWVkTUROb2RlKiBuYW1lZE5vZGUgPSBtb2R1bGUuZ2V0TmFtZWRNZXRhZGF0YShuYW1lKTsKKyAgICBpZiAobmFtZWROb2RlID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBsbHZtOjpNRE5vZGUqIG1kID0gbmFtZWROb2RlLT5nZXRPcGVyYW5kKDApOworICAgIGlmIChtZCA9PSBudWxscHRyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgb3AgPSAwOyBvcCA8IG1kLT5nZXROdW1PcGVyYW5kcygpOyArK29wKSB7CisgICAgICAgIGNvbnN0IGxsdm06OkNvbnN0YW50SW50KiBjb25zdEludCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihtZC0+Z2V0T3BlcmFuZChvcCkpOworICAgICAgICBpZiAoISBjb25zdEludCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50cy5wdXNoX2JhY2soKGludCljb25zdEludC0+Z2V0U0V4dFZhbHVlKCkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLworLy8gTWV0YWRhdGEgY2xhc3MgaXMganVzdCBmb3IgYWRhcHRlciB3aGlsZSBidWlsZGluZyB0aGUgSVIuCisvLworY2xhc3MgTWV0YWRhdGEgeworcHVibGljOgorICAgIE1ldGFkYXRhKGxsdm06OkxMVk1Db250ZXh0JiBjLCBsbHZtOjpNb2R1bGUqIG0pIDogY29udGV4dChjKSwgbW9kdWxlKG0pCisgICAgeworICAgICAgICAvLyBjYWNoZSB0aGUgcHJlY2lzaW9uIHF1YWxpZmllciBub2RlcywgdGhlcmUgYXJlIG9ubHkgNCB0byByZXVzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVNcENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGxsdm06OlZhbHVlKiBhcmdzW10gPSB7CisgICAgICAgICAgICAgICAgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgaSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgcHJlY2lzaW9uTWRbaV0gPSBsbHZtOjpNRE5vZGU6OmdldChjb250ZXh0LCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vICIhZ2xhLmlucHV0L291dHB1dC91bmlmb3JtIC0+IiBhcyBwZXIgY29tbWVudCBhdCB0b3Agb2YgZmlsZQorICAgIGxsdm06Ok1ETm9kZSogbWFrZU1kSW5wdXRPdXRwdXQobGx2bTo6U3RyaW5nUmVmIHN5bWJvbE5hbWUsIGxsdm06OlN0cmluZ1JlZiBzZWN0aW9uTmFtZSwgRU1kSW5wdXRPdXRwdXQgcXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUqIHR5cGVQcm94eSwgRU1kVHlwZUxheW91dCBsYXlvdXQsIEVNZFByZWNpc2lvbiBwcmVjaXNpb24sIGludCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Ok1ETm9kZSogc2FtcGxlciA9IDAsIGxsdm06Ok1ETm9kZSogYWdncmVnYXRlID0gMCwgaW50IGludGVycE1vZGUgPSAtMSwgRU1kQnVpbHRJbiBidWlsdEluID0gRW1iTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaW5kaW5nID0gLTEsIGludCBxdWFsaWZpZXJzID0gMCwgaW50IG9mZnNldCA9IC0xKQorICAgIHsKKyAgICAgICAgbGx2bTo6TUROb2RlKiBsYXlvdXRNZCA9IG1ha2VNZFR5cGVMYXlvdXQobGF5b3V0LCBwcmVjaXNpb24sIGxvY2F0aW9uLCBzYW1wbGVyLCBpbnRlcnBNb2RlLCBidWlsdEluLCBiaW5kaW5nLCBxdWFsaWZpZXJzLCBvZmZzZXQpOworCisgICAgICAgIGxsdm06Ok1ETm9kZSogbWQ7CisgICAgICAgIGlmIChhZ2dyZWdhdGUpIHsKKyAgICAgICAgICAgIGxsdm06OlZhbHVlKiBhcmdzW10gPSB7CisgICAgICAgICAgICAgICAgbGx2bTo6TURTdHJpbmc6OmdldChjb250ZXh0LCBzeW1ib2xOYW1lKSwKKyAgICAgICAgICAgICAgICBnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBxdWFsaWZpZXIpLAorICAgICAgICAgICAgICAgIHR5cGVQcm94eSwKKyAgICAgICAgICAgICAgICBsYXlvdXRNZCwKKyAgICAgICAgICAgICAgICBhZ2dyZWdhdGUKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtZCA9IGxsdm06Ok1ETm9kZTo6Z2V0KGNvbnRleHQsIGFyZ3MpOworICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgIGxsdm06OlZhbHVlKiBhcmdzW10gPSB7CisgICAgICAgICAgICAgICAgbGx2bTo6TURTdHJpbmc6OmdldChjb250ZXh0LCBzeW1ib2xOYW1lKSwKKyAgICAgICAgICAgICAgICBnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBxdWFsaWZpZXIpLAorICAgICAgICAgICAgICAgIHR5cGVQcm94eSwKKyAgICAgICAgICAgICAgICBsYXlvdXRNZAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1kID0gbGx2bTo6TUROb2RlOjpnZXQoY29udGV4dCwgYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBsbHZtOjpOYW1lZE1ETm9kZSogbmFtZWROb2RlID0gbW9kdWxlLT5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoc2VjdGlvbk5hbWUpOworICAgICAgICBuYW1lZE5vZGUtPmFkZE9wZXJhbmQobWQpOworCisgICAgICAgIHJldHVybiBtZDsKKyAgICB9CisKKyAgICAvLyAiIWdsYS5pbnB1dC9vdXRwdXQvdW5pZm9ybSAtPiIgYXMgcGVyIGNvbW1lbnQgYXQgdG9wIG9mIGZpbGUsIGZvciBTaW5nbGUtV2FsayBmb3JtCisgICAgbGx2bTo6TUROb2RlKiBtYWtlTWRTaW5nbGVUeXBlSW8obGx2bTo6U3RyaW5nUmVmIHN5bWJvbE5hbWUsIGNvbnN0IGNoYXIqIHR5cGVOYW1lLCBFTWRJbnB1dE91dHB1dCBxdWFsaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUqIHR5cGVQcm94eSwgbGx2bTo6TUROb2RlKiBsYXlvdXRNZCwgbGx2bTo6QXJyYXlSZWY8bGx2bTo6TUROb2RlKj4gbWVtYmVycykKKyAgICB7CisgICAgICAgIGxsdm06Ok1ETm9kZSogbWQ7CisgICAgICAgIGxsdm06OlNtYWxsVmVjdG9yPGxsdm06OlZhbHVlKiwgMTA+IGFyZ3M7CisgICAgICAgIGFyZ3MucHVzaF9iYWNrKGxsdm06Ok1EU3RyaW5nOjpnZXQoY29udGV4dCwgc3ltYm9sTmFtZSkpOworICAgICAgICBhcmdzLnB1c2hfYmFjayhnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBxdWFsaWZpZXIpKTsKKyAgICAgICAgYXJncy5wdXNoX2JhY2sodHlwZVByb3h5KTsKKyAgICAgICAgYXJncy5wdXNoX2JhY2sobGF5b3V0TWQpOworICAgICAgICBhcmdzLnB1c2hfYmFjayhsbHZtOjpNRFN0cmluZzo6Z2V0KGNvbnRleHQsIHR5cGVOYW1lKSk7CisgICAgICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKG1lbWJlcnMuYmVnaW4oKSwgbWVtYmVycy5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbWQgPSBsbHZtOjpNRE5vZGU6OmdldChjb250ZXh0LCBhcmdzKTsKKworICAgICAgICByZXR1cm4gbWQ7CisgICAgfQorCisgICAgLy8gIiFzYW1wbGVyIC0+IiBhcyBwZXIgY29tbWVudCBhdCB0b3Agb2YgZmlsZQorICAgIGxsdm06Ok1ETm9kZSogbWFrZU1kU2FtcGxlcihFTWRTYW1wbGVyIHNhbXBsZXIsIGxsdm06OlZhbHVlKiB0eXBlUHJveHksIEVNZFNhbXBsZXJEaW0gZGltLCBib29sIGlzQXJyYXksIGJvb2wgaXNTaGFkb3csIEVNZFNhbXBsZXJCYXNlVHlwZSBiYXNlVHlwZSkKKyAgICB7CisgICAgICAgIGxsdm06OlZhbHVlKiBhcmdzW10gPSB7CisgICAgICAgICAgICBnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBzYW1wbGVyKSwKKyAgICAgICAgICAgIHR5cGVQcm94eSwKKyAgICAgICAgICAgIGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIGRpbSksCisgICAgICAgICAgICBnbGE6Ok1ha2VCb29sQ29uc3RhbnQoY29udGV4dCwgaXNBcnJheSksCisgICAgICAgICAgICBnbGE6Ok1ha2VCb29sQ29uc3RhbnQoY29udGV4dCwgaXNTaGFkb3cpLAorICAgICAgICAgICAgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgYmFzZVR5cGUpLAorICAgICAgICB9OworICAgICAgICBsbHZtOjpNRE5vZGUqIG1kID0gbGx2bTo6TUROb2RlOjpnZXQoY29udGV4dCwgYXJncyk7CisKKyAgICAgICAgcmV0dXJuIG1kOworICAgIH0KKworICAgIGxsdm06Ok1ETm9kZSogbWFrZU1kUHJlY2lzaW9uKEVNZFByZWNpc2lvbiBwcmVjaXNpb24pCisgICAgeworICAgICAgICAvLyBqdXN0IHVzZSBvdXIgcHJlY2lzaW9uIGNhY2hlCisKKyAgICAgICAgcmV0dXJuIHByZWNpc2lvbk1kW3ByZWNpc2lvbl07CisgICAgfQorCisgICAgbGx2bTo6TUROb2RlKiBtYWtlTWRUeXBlTGF5b3V0KEVNZFR5cGVMYXlvdXQgbGF5b3V0LCBFTWRQcmVjaXNpb24gcHJlY2lzaW9uLCBpbnQgbG9jYXRpb24sIGxsdm06Ok1ETm9kZSogc2FtcGxlciwgaW50IGludGVycE1vZGUgPSAtMSwgRU1kQnVpbHRJbiBidWlsdEluID0gRW1iTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpbmRpbmcgPSAtMSwgdW5zaWduZWQgaW50IHF1YWxpZmllcnMgPSAwLCBpbnQgb2Zmc2V0ID0gLTEpCisgICAgeworICAgICAgICBsbHZtOjpWYWx1ZSogYXJnc1tdID0geworICAgICAgICAgICAgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgbGF5b3V0KSwKKyAgICAgICAgICAgIGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIHByZWNpc2lvbiksCisgICAgICAgICAgICBnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBsb2NhdGlvbiksCisgICAgICAgICAgICBzYW1wbGVyLAorICAgICAgICAgICAgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgaW50ZXJwTW9kZSksCisgICAgICAgICAgICBnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBidWlsdEluKSwKKyAgICAgICAgICAgIGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIGJpbmRpbmcpLAorICAgICAgICAgICAgZ2xhOjpNYWtlVW5zaWduZWRDb25zdGFudChjb250ZXh0LCBxdWFsaWZpZXJzKSwKKyAgICAgICAgICAgIGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIG9mZnNldCksCisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIGxsdm06Ok1ETm9kZTo6Z2V0KGNvbnRleHQsIGFyZ3MpOworICAgIH0KKworICAgIHZvaWQgYWRkTWRFbnRyeXBvaW50KGNvbnN0IGNoYXIqIG5hbWUpCisgICAgeworICAgICAgICBsbHZtOjpNRE5vZGUqIG1kOworICAgICAgICBsbHZtOjpWYWx1ZSogYXJnc1tdID0geworICAgICAgICAgICAgbGx2bTo6TURTdHJpbmc6OmdldChjb250ZXh0LCBuYW1lKSwKKyAgICAgICAgICAgIGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIEVNaW9FbnRyeXBvaW50KSwKKyAgICAgICAgfTsKKyAgICAgICAgbWQgPSBsbHZtOjpNRE5vZGU6OmdldChjb250ZXh0LCBhcmdzKTsKKworICAgICAgICBsbHZtOjpOYW1lZE1ETm9kZSogbmFtZWROb2RlID0gbW9kdWxlLT5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoRW50cnlwb2ludExpc3RNZE5hbWUpOworICAgICAgICBuYW1lZE5vZGUtPmFkZE9wZXJhbmQobWQpOworICAgIH0KKworICAgIHZvaWQgYWRkTm9TdGF0aWNVc2UobGx2bTo6TUROb2RlKiBtZCkKKyAgICB7CisgICAgICAgIGxsdm06Ok5hbWVkTUROb2RlKiBuYW1lZE5vZGUgPSBtb2R1bGUtPmdldE9ySW5zZXJ0TmFtZWRNZXRhZGF0YShOb1N0YXRpY1VzZU1kTmFtZSk7CisgICAgICAgIG5hbWVkTm9kZS0+YWRkT3BlcmFuZChtZCk7CisgICAgfQorCisgICAgdm9pZCBhZGRTaGFyZWQobGx2bTo6VmFsdWUqIHNoYXJlZCkKKyAgICB7CisgICAgICAgIGxsdm06OlZhbHVlKiBhcmdzW10gPSB7CisgICAgICAgICAgICBzaGFyZWQKKyAgICAgICAgfTsKKyAgICAgICAgbGx2bTo6TUROb2RlKiBtZCA9IGxsdm06Ok1ETm9kZTo6Z2V0KGNvbnRleHQsIGFyZ3MpOworICAgICAgICBsbHZtOjpOYW1lZE1ETm9kZSogbmFtZWROb2RlID0gbW9kdWxlLT5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoV29ya2dyb3VwU2hhcmVkTWROYW1lKTsKKyAgICAgICAgbmFtZWROb2RlLT5hZGRPcGVyYW5kKG1kKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYSBuYW1lZCBtZXRhZGF0YSBub2RlIG9mIHRoZSBmb3JtOgorICAgIC8vICAgICAhZ2xhLm5hbWUgICAgICAgID0gIXsgaW50IH0KKyAgICAvLyBXaGVyZSAnaW50JyBjb3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQgYSBib29sIG9yIGVudW0uICBTZWUgY29tbWVudCBhdCB0b3AgZm9yIGxvbmcgbGlzdAorICAgIC8vIG9mIGV4YW1wbGVzIHdoZXJlIHRoaXMgY2FuIGJlIHVzZWQuCisgICAgdm9pZCBtYWtlTWROYW1lZEludChjb25zdCBjaGFyKiBuYW1lLCBpbnQgaSkKKyAgICB7CisgICAgICAgIGxsdm06Ok5hbWVkTUROb2RlKiBuYW1lZE5vZGUgPSBtb2R1bGUtPmdldE9ySW5zZXJ0TmFtZWRNZXRhZGF0YShuYW1lKTsKKyAgICAgICAgbGx2bTo6VmFsdWUqIGxheW91dEFyZ3NbXSA9IHsgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgaSkgfTsKKyAgICAgICAgbmFtZWROb2RlLT5hZGRPcGVyYW5kKGxsdm06Ok1ETm9kZTo6Z2V0KGNvbnRleHQsIGxheW91dEFyZ3MpKTsKKyAgICB9CisKKyAgICB2b2lkIG1ha2VNZE5hbWVkSW50KGNvbnN0IGNoYXIqIG5hbWUsIGludCBpMSwgaW50IGkyLCBpbnQgaTMpCisgICAgeworICAgICAgICBsbHZtOjpOYW1lZE1ETm9kZSogbmFtZWROb2RlID0gbW9kdWxlLT5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEobmFtZSk7CisgICAgICAgIGxsdm06OlZhbHVlKiBsYXlvdXRBcmdzW10gPSB7IGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIGkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgaTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBpMyksIH07CisgICAgICAgIG5hbWVkTm9kZS0+YWRkT3BlcmFuZChsbHZtOjpNRE5vZGU6OmdldChjb250ZXh0LCBsYXlvdXRBcmdzKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgbGx2bTo6TExWTUNvbnRleHQmIGNvbnRleHQ7CisgICAgbGx2bTo6TW9kdWxlKiBtb2R1bGU7CisgICAgbGx2bTo6TUROb2RlKiBwcmVjaXNpb25NZFtFTXBDb3VudF07Cit9OworCit9OworCisjZW5kaWYgLy8gbWV0YWRhdGFfSApkaWZmIC0tZ2l0IGEvTHVuYXJHTEFTUy9Gcm9udGVuZHMvU1BJUlYvU3B2VG9Ub3AuY3BwIGIvTHVuYXJHTEFTUy9Gcm9udGVuZHMvU1BJUlYvU3B2VG9Ub3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTllOGQKLS0tIC9kZXYvbnVsbAorKysgYi9MdW5hckdMQVNTL0Zyb250ZW5kcy9TUElSVi9TcHZUb1RvcC5jcHAKQEAgLTAsMCArMSwyOTEzIEBACisvLworLy9Db3B5cmlnaHQgKEMpIDIwMTQgTHVuYXJHLCBJbmMuCisvLworLy9BbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvL21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy9hcmUgbWV0OgorLy8KKy8vICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKy8vICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorLy8gICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgM0RsYWJzIEluYy4gTHRkLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisvLyAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy9USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvL0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisvL0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisvL0NPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy9JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorLy9CVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisvL0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKy8vQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisvL0xJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisvL0FOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy9QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8KKy8vIEF1dGhvcjogSm9obiBLZXNzZW5pY2gsIEx1bmFyRworLy8KKworLy8KKy8vIFRyYW5zbGF0ZSBTUElSLVYgdG8gVG9wIElSLgorLy8KKworI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisvLyBMTFZNIGluY2x1ZGVzCisjcHJhZ21hIHdhcm5pbmcocHVzaCwgMSkKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPGxpc3Q+CisKKy8vIEdsc2xhbmcgaW5jbHVkZXMKKyNpbmNsdWRlICJTUElSVi9zcGlydi5ocHAiCituYW1lc3BhY2Ugc3B2IHsKKyAgICAjaW5jbHVkZSAiU1BJUlYvR0xTTC5zdGQuNDUwLmgiCit9CisKKy8vIEx1bmFyR0xBU1MgaW5jbHVkZXMKKyNpbmNsdWRlICJMdW5hckdMQVNTVG9wSVIuaCIKKyNpbmNsdWRlICJMdW5hckdMQVNTTWFuYWdlci5oIgorI2luY2x1ZGUgIkV4Y2VwdGlvbnMuaCIKKyNpbmNsdWRlICJUb3BCdWlsZGVyLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJVdGlsLmgiCisKKy8vIEFkYXB0ZXIgaW5jbHVkZXMKKyNpbmNsdWRlICJTcHZUb1RvcC5oIgorCisvLyBHbHNsYW5nIGluY2x1ZGVzLCBqdXN0IGJlY2F1c2UgdGhlIEdMU0wgYmFja2VuZCByZXVzZXMgc29tZSBlbnVtcyBmb3Igc3RhZ2UgYW5kIHZlcnNpb24KKyNpbmNsdWRlICJnbHNsYW5nL1B1YmxpYy9TaGFkZXJMYW5nLmgiCisjaW5jbHVkZSAiZ2xzbGFuZy9NYWNoaW5lSW5kZXBlbmRlbnQvVmVyc2lvbnMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgdW5zaWduZWQgaW50IEJhZFZhbHVlID0gMHhGRkZGRkZGRjsKKworc3B2OjpPcCBHZXRPcENvZGUodW5zaWduZWQgaW50IHdvcmQpCit7CisgICAgcmV0dXJuIChzcHY6Ok9wKSh3b3JkICYgc3B2OjpPcENvZGVNYXNrKTsKK30KKworaW50IEdldFdvcmRDb3VudCh1bnNpZ25lZCBpbnQgd29yZCkKK3sKKyAgICByZXR1cm4gKGludCkod29yZCA+PiBzcHY6OldvcmRDb3VudFNoaWZ0KTsKK30KKworZ2xhOjpFTWRCdWlsdEluIEdldE1kQnVpbHRJbihzcHY6OkJ1aWx0SW4gYnVpbHRJbikKK3sKKyAgICBzd2l0Y2ggKGJ1aWx0SW4pIHsKKyAgICBjYXNlIHNwdjo6QnVpbHRJbk51bVdvcmtncm91cHM6ICAgICAgICByZXR1cm4gZ2xhOjpFbWJOdW1Xb3JrR3JvdXBzOworICAgIGNhc2Ugc3B2OjpCdWlsdEluV29ya2dyb3VwU2l6ZTogICAgICAgIHJldHVybiBnbGE6OkVtYldvcmtHcm91cFNpemU7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5Xb3JrZ3JvdXBJZDogICAgICAgICAgcmV0dXJuIGdsYTo6RW1iV29ya0dyb3VwSWQ7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5Mb2NhbEludm9jYXRpb25JZDogICAgcmV0dXJuIGdsYTo6RW1iTG9jYWxJbnZvY2F0aW9uSWQ7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5HbG9iYWxJbnZvY2F0aW9uSWQ6ICAgcmV0dXJuIGdsYTo6RW1iR2xvYmFsSW52b2NhdGlvbklkOworICAgIGNhc2Ugc3B2OjpCdWlsdEluTG9jYWxJbnZvY2F0aW9uSW5kZXg6IHJldHVybiBnbGE6OkVtYkxvY2FsSW52b2NhdGlvbkluZGV4OworICAgIGNhc2Ugc3B2OjpCdWlsdEluVmVydGV4SWQ6ICAgICAgICAgICAgIHJldHVybiBnbGE6OkVtYlZlcnRleElkOworICAgIGNhc2Ugc3B2OjpCdWlsdEluVmVydGV4SW5kZXg6ICAgICAgICAgIHJldHVybiBnbGE6OkVtYlZlcnRleEluZGV4OworICAgIGNhc2Ugc3B2OjpCdWlsdEluSW5zdGFuY2VJZDogICAgICAgICAgIHJldHVybiBnbGE6OkVtYkluc3RhbmNlSWQ7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5JbnN0YW5jZUluZGV4OiAgICAgICAgcmV0dXJuIGdsYTo6RW1iSW5zdGFuY2VJbmRleDsKKyAgICBjYXNlIHNwdjo6QnVpbHRJblBvc2l0aW9uOiAgICAgICAgICAgICByZXR1cm4gZ2xhOjpFbWJQb3NpdGlvbjsKKyAgICBjYXNlIHNwdjo6QnVpbHRJblBvaW50U2l6ZTogICAgICAgICAgICByZXR1cm4gZ2xhOjpFbWJQb2ludFNpemU7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5DbGlwRGlzdGFuY2U6ICAgICAgICAgcmV0dXJuIGdsYTo6RW1iQ2xpcERpc3RhbmNlOworICAgIGNhc2Ugc3B2OjpCdWlsdEluQ3VsbERpc3RhbmNlOiAgICAgICAgIHJldHVybiBnbGE6OkVtYkN1bGxEaXN0YW5jZTsKKyAgICBjYXNlIHNwdjo6QnVpbHRJbkludm9jYXRpb25JZDogICAgICAgICByZXR1cm4gZ2xhOjpFbWJJbnZvY2F0aW9uSWQ7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5QcmltaXRpdmVJZDogICAgICAgICAgcmV0dXJuIGdsYTo6RW1iUHJpbWl0aXZlSWQ7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5MYXllcjogICAgICAgICAgICAgICAgcmV0dXJuIGdsYTo6RW1iTGF5ZXI7CisgICAgY2FzZSBzcHY6OkJ1aWx0SW5WaWV3cG9ydEluZGV4OiAgICAgICAgcmV0dXJuIGdsYTo6RW1iVmlld3BvcnRJbmRleDsKKyAgICBjYXNlIHNwdjo6QnVpbHRJblBhdGNoVmVydGljZXM6ICAgICAgICByZXR1cm4gZ2xhOjpFbWJQYXRjaFZlcnRpY2VzOworICAgIGNhc2Ugc3B2OjpCdWlsdEluVGVzc0xldmVsT3V0ZXI6ICAgICAgIHJldHVybiBnbGE6OkVtYlRlc3NMZXZlbE91dGVyOworICAgIGNhc2Ugc3B2OjpCdWlsdEluVGVzc0xldmVsSW5uZXI6ICAgICAgIHJldHVybiBnbGE6OkVtYlRlc3NMZXZlbElubmVyOworICAgIGNhc2Ugc3B2OjpCdWlsdEluVGVzc0Nvb3JkOiAgICAgICAgICAgIHJldHVybiBnbGE6OkVtYlRlc3NDb29yZDsKKyAgICBjYXNlIHNwdjo6QnVpbHRJbkZyb250RmFjaW5nOiAgICAgICAgICByZXR1cm4gZ2xhOjpFbWJGYWNlOworICAgIGNhc2Ugc3B2OjpCdWlsdEluRnJhZ0Nvb3JkOiAgICAgICAgICAgIHJldHVybiBnbGE6OkVtYkZyYWdDb29yZDsKKyAgICBjYXNlIHNwdjo6QnVpbHRJblBvaW50Q29vcmQ6ICAgICAgICAgICByZXR1cm4gZ2xhOjpFbWJQb2ludENvb3JkOworICAgIGNhc2Ugc3B2OjpCdWlsdEluRnJhZ0RlcHRoOiAgICAgICAgICAgIHJldHVybiBnbGE6OkVtYkZyYWdEZXB0aDsKKyAgICBjYXNlIHNwdjo6QnVpbHRJblNhbXBsZUlkOiAgICAgICAgICAgICByZXR1cm4gZ2xhOjpFbWJTYW1wbGVJZDsKKyAgICBjYXNlIHNwdjo6QnVpbHRJblNhbXBsZVBvc2l0aW9uOiAgICAgICByZXR1cm4gZ2xhOjpFbWJTYW1wbGVQb3NpdGlvbjsKKyAgICBjYXNlIHNwdjo6QnVpbHRJblNhbXBsZU1hc2s6ICAgICAgICAgICByZXR1cm4gZ2xhOjpFbWJTYW1wbGVNYXNrOworICAgIGNhc2Ugc3B2OjpCdWlsdEluSGVscGVySW52b2NhdGlvbjogICAgIHJldHVybiBnbGE6OkVtYkhlbHBlckludm9jYXRpb247CisgICAgZGVmYXVsdDoKKyAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoImJ1aWx0IGluIHZhcmlhYmxlIiwgZ2xhOjpFQVRDb250aW51ZSk7CisgICAgICAgIHJldHVybiBnbGE6OkVtYk5vbmU7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBOb25OdWxsTmFtZShjb25zdCBjaGFyKiBuYW1lKQoreworICAgIHJldHVybiBuYW1lID8gbmFtZSA6ICIiOworfQorCisvLworLy8gVHJhbnNsYXRvciBpbnN0YW5jZSBmb3IgdHJhbnNsYXRpbmcgYSBTUElSLVYgc3RyZWFtIHRvIEx1bmFyR0xBU1MncyBMTFZNLWJhc2VkIFRvcCBJUi4KKy8vCitjbGFzcyBTcHZUb1RvcFRyYW5zbGF0b3IgeworcHVibGljOgorICAgIFNwdlRvVG9wVHJhbnNsYXRvcihjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+JiBzcGlydiwgZ2xhOjpNYW5hZ2VyJiBtYW5hZ2VyKTsKKyAgICB2aXJ0dWFsIH5TcHZUb1RvcFRyYW5zbGF0b3IoKTsKKworICAgIHZvaWQgbWFrZVRvcCgpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gYSBiYWcgdG8gaG9sZCB0eXBlIGluZm9ybWF0aW9uIHRoYXQncyBsb3N0IGdvaW5nIHRvIExMVk0gKHdpdGhvdXQgbWV0YWRhdGEpCisgICAgc3RydWN0IE1ldGFUeXBlIHsKKyAgICAgICAgTWV0YVR5cGUoKSA6IGxheW91dChnbGE6OkVNdGxOb25lKSwgY29tYmluZWRJbWFnZVNhbXBsZXIoZmFsc2UpLCBwcmVjaXNpb24oZ2xhOjpFTXBOb25lKSwgYnVpbHRJbihnbGE6OkVtYk5vbmUpLCBzZXQoLTEpLCBiaW5kaW5nKC0xKSwgbG9jYXRpb24oZ2xhOjpNYXhVc2VyTGF5b3V0TG9jYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbk1ldGhvZCgoc3B2OjpEZWNvcmF0aW9uKUJhZFZhbHVlKSwgaW50ZXJwb2xhdGVUbygoc3B2OjpEZWNvcmF0aW9uKUJhZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgIGludmFyaWFudChmYWxzZSksIG5hbWUoMCkgeyB9CisKKyAgICAgICAgLy8gc2V0IG9mIHRoaW5ncyBuZWVkZWQgZm9yICF0eXBlTGF5b3V0IG1ldGFkYXRhIG5vZGUKKyAgICAgICAgZ2xhOjpFTWRUeXBlTGF5b3V0IGxheW91dDsgICAgICAgICAgICAgIC8vIGluY2x1ZGVzIG1hdHJpeCBpbmZvcm1hdGlvbgorICAgICAgICBib29sIGNvbWJpbmVkSW1hZ2VTYW1wbGVyOworICAgICAgICBnbGE6OkVNZFByZWNpc2lvbiBwcmVjaXNpb247CisgICAgICAgIGdsYTo6RU1kQnVpbHRJbiBidWlsdEluOworICAgICAgICBzaG9ydCBzZXQ7CisgICAgICAgIHNob3J0IG1hdHJpeFN0cmlkZTsKKyAgICAgICAgaW50IGFycmF5U3RyaWRlOworICAgICAgICBpbnQgYmluZGluZzsKKyAgICAgICAgaW50IGxvY2F0aW9uOworICAgICAgICBzcHY6OkRlY29yYXRpb24gaW50ZXJwb2xhdGlvbk1ldGhvZDsKKyAgICAgICAgc3B2OjpEZWNvcmF0aW9uIGludGVycG9sYXRlVG87CisKKyAgICAgICAgLy8gbWV0YWRhdGEgaW5kaWNhdGVkIGluIHNvbWUgb3RoZXIgd2F5CisgICAgICAgIGJvb2wgaW52YXJpYW50OworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGJ1ZlNpemUgPSAxMjsKKyAgICAgICAgY2hhciBidWZbYnVmU2l6ZV07CisgICAgfTsKKyAgICB2b2lkIGJ1bXBNZW1iZXJNZXRhRGF0YShzdGQ6OnZlY3RvcjxNZXRhVHlwZT4qJiBtZW1iZXJNZXRhRGF0YSwgaW50IG1lbWJlcik7CisKKyAgICAvLyBTUElSLVYgaW5zdHJ1Y3Rpb24gcHJvY2Vzc29ycworICAgIHZvaWQgc2V0RW50cnlQb2ludChzcHY6OkV4ZWN1dGlvbk1vZGVsLCBzcHY6OklkIGVudHJ5SWQpOworICAgIHZvaWQgc2V0RXhlY3V0aW9uTW9kZShzcHY6OklkIGVudHJ5UG9pbnQsIHNwdjo6RXhlY3V0aW9uTW9kZSk7CisgICAgdm9pZCBhZGREZWNvcmF0aW9uKHNwdjo6SWQsIHNwdjo6RGVjb3JhdGlvbik7CisgICAgdm9pZCBhZGRNZW1iZXJEZWNvcmF0aW9uKHNwdjo6SWQsIHVuc2lnbmVkIGludCBtZW1iZXIsIHNwdjo6RGVjb3JhdGlvbik7CisgICAgdm9pZCBhZGRNZXRhVHlwZURlY29yYXRpb24oc3B2OjpEZWNvcmF0aW9uIGRlY29yYXRpb24sIE1ldGFUeXBlJiBtZXRhVHlwZSk7CisgICAgdm9pZCBhZGRUeXBlKHNwdjo6T3AsIHNwdjo6SWQsIGludCBudW1PcGVyYW5kcyk7CisgICAgdm9pZCBhZGRWYXJpYWJsZShzcHY6OklkIHJlc3VsdElkLCBzcHY6OklkIHR5cGVJZCwgc3B2OjpTdG9yYWdlQ2xhc3MpOworICAgIGdsYTo6QnVpbGRlcjo6RVN0b3JhZ2VRdWFsaWZpZXIgbWFwU3RvcmFnZUNsYXNzKHNwdjo6U3RvcmFnZUNsYXNzLCBib29sIGlzQnVmZmVyKTsKKyAgICB2b2lkIGFkZENvbnN0YW50KHNwdjo6T3AsIHNwdjo6SWQgcmVzdWx0SWQsIHNwdjo6SWQgdHlwZUlkLCBpbnQgbnVtT3BlcmFuZHMpOworICAgIHZvaWQgYWRkQ29uc3RhbnRBZ2dyZWdhdGUoc3B2OjpJZCByZXN1bHRJZCwgc3B2OjpJZCB0eXBlSWQsIGludCBudW1PcGVyYW5kcyk7CisgICAgaW50IGFzc2lnblNsb3Qoc3B2OjpJZCByZXN1bHRJZCwgaW50JiBudW1TbG90cyk7CisgICAgdm9pZCBkZWNvZGVSZXN1bHQoYm9vbCB0eXBlLCBzcHY6OklkJiB0eXBlSWQsIHNwdjo6SWQmIHJlc3VsdElkKTsKKyAgICBjb25zdCBjaGFyKiBmaW5kQU5hbWUoc3B2OjpJZCBjaG9pY2UxLCBzcHY6OklkIGNob2ljZTIgPSAwKTsKKyAgICB2b2lkIHRyYW5zbGF0ZUluc3RydWN0aW9uKHNwdjo6T3Agb3BDb2RlLCBpbnQgbnVtT3BlcmFuZHMpOworICAgIGxsdm06OlZhbHVlKiBjcmVhdGVVbmFyeU9wZXJhdGlvbihzcHY6Ok9wLCBnbGE6OkVNZFByZWNpc2lvbiwgbGx2bTo6VHlwZSogcmVzdWx0VHlwZSwgbGx2bTo6VmFsdWUqIG9wZXJhbmQsIGJvb2wgaGFzU2lnbiwgYm9vbCByZWR1Y2VDb21wYXJpc29uKTsKKyAgICBsbHZtOjpWYWx1ZSogY3JlYXRlQmluYXJ5T3BlcmF0aW9uKHNwdjo6T3AsIGdsYTo6RU1kUHJlY2lzaW9uLCBsbHZtOjpWYWx1ZSogbGVmdCwgbGx2bTo6VmFsdWUqIHJpZ2h0LCBib29sIGhhc1NpZ24sIGJvb2wgcmVkdWNlQ29tcGFyaXNvbiwgY29uc3QgY2hhciogbmFtZSA9IDApOworICAgIGdsYTo6RVNhbXBsZXJUeXBlIGNvbnZlcnRJbWFnZVR5cGUoc3B2OjpJZCBpbWFnZVR5cGVJZCk7CisgICAgbGx2bTo6VmFsdWUqIGNyZWF0ZVNhbXBsaW5nQ2FsbChzcHY6Ok9wLCBzcHY6OklkIHR5cGUsIHNwdjo6SWQgcmVzdWx0LCBpbnQgbnVtT3BlcmFuZHMpOworICAgIGxsdm06OlZhbHVlKiBjcmVhdGVUZXh0dXJlUXVlcnlDYWxsKHNwdjo6T3AsIHNwdjo6SWQgdHlwZSwgc3B2OjpJZCByZXN1bHQsIGludCBudW1PcGVyYW5kcyk7CisgICAgbGx2bTo6VmFsdWUqIGNyZWF0ZUNvbnN0cnVjdG9yKHNwdjo6SWQgcmVzdWx0SWQsIHNwdjo6SWQgdHlwZUlkLCBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+IGNvbnN0aXR1ZW50cyk7CisgICAgdm9pZCBoYW5kbGVPcEZ1bmN0aW9uKHNwdjo6SWQmIHR5cGVJZCwgc3B2OjpJZCYgcmVzdWx0SWQpOworICAgIGxsdm06OkZ1bmN0aW9uKiBtYWtlRnVuY3Rpb24oc3B2OjpJZCBmdW5jdGlvbklkLCBzcHY6OklkIHJldHVyblR5cGVJZCwgc3RkOjp2ZWN0b3I8c3B2OjpJZD4mIGFyZ1R5cGVJZHMpOworICAgIHNwdjo6SWQgZ2V0TmV4dExhYmVsSWQoKTsKKyAgICBsbHZtOjpWYWx1ZSogY3JlYXRlRnVuY3Rpb25DYWxsKGdsYTo6RU1kUHJlY2lzaW9uIHByZWNpc2lvbiwgc3B2OjpJZCB0eXBlSWQsIHNwdjo6SWQgcmVzdWx0SWQsIGludCBudW1PcGVyYW5kcyk7CisgICAgbGx2bTo6VmFsdWUqIGNyZWF0ZUV4dGVybmFsSW5zdHJ1Y3Rpb24oZ2xhOjpFTWRQcmVjaXNpb24gcHJlY2lzaW9uLCBzcHY6OklkIHR5cGVJZCwgc3B2OjpJZCByZXN1bHRJZCwgaW50IG51bU9wZXJhbmRzLCBjb25zdCBjaGFyKiBuYW1lKTsKKyAgICBzcHY6Ok9wIGdldE9wQ29kZShzcHY6OklkKSBjb25zdDsKKyAgICBzcHY6OklkIGRlcmVmZXJlbmNlVHlwZUlkKHNwdjo6SWQgdHlwZUlkKSBjb25zdDsKKyAgICBzcHY6OklkIGdldEFycmF5RWxlbWVudFR5cGVJZChzcHY6OklkIHR5cGVJZCkgY29uc3Q7CisgICAgc3B2OjpJZCBnZXRTdHJ1Y3RNZW1iZXJUeXBlSWQoc3B2OjpJZCB0eXBlSWQsIGludCBtZW1iZXIpIGNvbnN0OworICAgIHNwdjo6SWQgZ2V0SW1hZ2VUeXBlSWQoc3B2OjpJZCBzYW1wbGVkSW1hZ2VUeXBlSWQpIGNvbnN0OworICAgIHNwdjo6SWQgZ2V0SW1hZ2VTYW1wbGVkVHlwZShzcHY6OklkIHR5cGVJZCkgY29uc3Q7CisgICAgc3B2OjpEaW0gZ2V0SW1hZ2VEaW0oc3B2OjpJZCB0eXBlSWQpIGNvbnN0OworICAgIGJvb2wgaXNJbWFnZUFycmF5ZWQoc3B2OjpJZCB0eXBlSWQpIGNvbnN0OworICAgIGJvb2wgaXNJbWFnZURlcHRoKHNwdjo6SWQgdHlwZUlkKSBjb25zdDsKKyAgICBib29sIGlzSW1hZ2VNUyhzcHY6OklkIHR5cGVJZCkgY29uc3Q7CisKKyAgICBib29sIGluRW50cnlQb2ludCgpOworICAgIGJvb2wgaXNNYXRyaXgoc3B2OjpJZCB0eXBlSWQpIHsgcmV0dXJuIGNvbW1vbk1hcFt0eXBlSWRdLm1ldGFUeXBlLmxheW91dCA9PSBnbGE6OkVNdGxDb2xNYWpvck1hdHJpeCB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25NYXBbdHlwZUlkXS5tZXRhVHlwZS5sYXlvdXQgPT0gZ2xhOjpFTXRsUm93TWFqb3JNYXRyaXg7IH0KKyAgICB2b2lkIG1ha2VMYWJlbEJsb2NrKHNwdjo6SWQgbGFiZWxJZCk7CisgICAgdm9pZCBjcmVhdGVTd2l0Y2goaW50IG51bU9wZXJhbmRzKTsKKworICAgIC8vIG1ldGFkYXRhIHBhcmFtZXRlciB0cmFuc2xhdG9ycworICAgIGdsYTo6RU1kSW5wdXRPdXRwdXQgICAgIGdldE1kUXVhbGlmaWVyICAgICAgKHNwdjo6SWQgcmVzdWx0SWQpIGNvbnN0OworICAgIGdsYTo6RU1kU2FtcGxlciAgICAgICAgIGdldE1kU2FtcGxlciAgICAgICAgKHNwdjo6SWQgdHlwZUlkKSAgIGNvbnN0OworICAgIGdsYTo6RU1kU2FtcGxlckRpbSAgICAgIGdldE1kU2FtcGxlckRpbSAgICAgKHNwdjo6SWQgdHlwZUlkKSAgIGNvbnN0OworICAgIGdsYTo6RU1kU2FtcGxlckJhc2VUeXBlIGdldE1kU2FtcGxlckJhc2VUeXBlKHNwdjo6SWQgdHlwZUlkKSAgIGNvbnN0OworICAgIHZvaWQgZ2V0SW50ZXJwb2xhdGlvbkxvY2F0aW9uTWV0aG9kKHNwdjo6SWQgaWQsIGdsYTo6RUludGVycG9sYXRpb25NZXRob2QmIG1ldGhvZCwgZ2xhOjpFSW50ZXJwb2xhdGlvbkxvY2F0aW9uJiBsb2NhdGlvbik7CisKKyAgICAvLyBtZXRhZGF0YSBjcmVhdG9ycworCisgICAgLy8gYmlhcyBzZXQgYnkgMSwgc28gdGhhdCB3ZSBjYW4gc2ltdWx0YW5lb3VzbHkKKyAgICAvLyAgLSB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gInNldD0wIiBhbmQgbm90aGluZyBoYXZpbmcgYmVlbiBzYWlkLCBhbmQKKyAgICAvLyAgLSBub3QgYmUgdXNpbmcgdGhlIHVwcGVyIGJpdHMgYXQgYWxsIGZvciBhbGwgdGhlIGNvbW1vbiBjYXNlcyB3aGVyZSB0aGVyZSBpcyBubyBzZXQKKyAgICBpbnQgcGFja1NldEJpbmRpbmcoTWV0YVR5cGUmIG1ldGFUeXBlKSB7IHJldHVybiAoKG1ldGFUeXBlLnNldCArIDEpIDw8IDE2KSB8IG1ldGFUeXBlLmJpbmRpbmc7IH0KKworICAgIGxsdm06OlZhbHVlKiBtYWtlUGVybWFuZW50VHlwZVByb3h5KGxsdm06OlZhbHVlKik7CisgICAgbGx2bTo6TUROb2RlKiBkZWNsYXJlVW5pZm9ybU1ldGFkYXRhKHNwdjo6SWQgcmVzdWx0SWQpOworICAgIGxsdm06Ok1ETm9kZSogZGVjbGFyZU1kRGVmYXVsdFVuaWZvcm0oc3B2OjpJZCByZXN1bHRJZCk7CisgICAgbGx2bTo6TUROb2RlKiBtYWtlTWRTYW1wbGVyKHNwdjo6SWQgdHlwZUlkLCBsbHZtOjpWYWx1ZSopOworICAgIGxsdm06Ok1ETm9kZSogZGVjbGFyZU1kVW5pZm9ybUJsb2NrKGdsYTo6RU1kSW5wdXRPdXRwdXQsIHNwdjo6SWQgcmVzdWx0SWQpOworICAgIGxsdm06Ok1ETm9kZSogZGVjbGFyZU1kVHlwZShzcHY6OklkIHR5cGVJZCwgTWV0YVR5cGUmKTsKKyAgICBsbHZtOjpNRE5vZGUqIG1ha2VJbnB1dE91dHB1dE1ldGFkYXRhKHNwdjo6SWQgcmVzdWx0SWQsIGludCBzbG90LCBjb25zdCBjaGFyKiBraW5kKTsKKyAgICB2b2lkIG1ha2VPdXRwdXRNZXRhZGF0YShzcHY6OklkIHJlc3VsdElkLCBpbnQgc2xvdCwgaW50IG51bVNsb3RzKTsKKyAgICBsbHZtOjpNRE5vZGUqIG1ha2VJbnB1dE1ldGFkYXRhKHNwdjo6SWQgcmVzdWx0SWQsIGludCBzbG90KTsKKworICAgIC8vIGNsYXNzIGRhdGEKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+JiBzcGlydjsgLy8gdGhlIFNQSVItViBzdHJlYW0gb2Ygd29yZHMKKyAgICBpbnQgd29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCB3b3JkIHRvIHJlYWQgZnJvbSBzcGlydgorICAgIGludCBuZXh0SW5zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24KKyAgICBnbGE6Ok1hbmFnZXImIG1hbmFnZXI7ICAgICAgICAgICAgICAgICAgLy8gTHVuYXJHTEFTUyBtYW5hZ2VyCisgICAgbGx2bTo6TExWTUNvbnRleHQgJmNvbnRleHQ7CisgICAgbGx2bTo6QmFzaWNCbG9jayogc2hhZGVyRW50cnk7CisgICAgbGx2bTo6SVJCdWlsZGVyPD4gbGx2bUJ1aWxkZXI7CisgICAgbGx2bTo6TW9kdWxlKiBtb2R1bGU7CisgICAgZ2xhOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBnbGE6OkJ1aWxkZXIqIGdsYUJ1aWxkZXI7CisgICAgaW50IHZlcnNpb247CisgICAgaW50IGdlbmVyYXRvcjsKKyAgICBzcHY6OkV4ZWN1dGlvbk1vZGVsIGN1cnJlbnRNb2RlbDsgICAgICAgIC8vIC4uLnRoaXMgaXMgdGhlICdvbmUnIGN1cnJlbnRseSBiZWluZyBvcGVyYXRlZCBvbgorICAgIHNwdjo6SWQgY3VycmVudEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgb2YKKyAgICBsbHZtOjpGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGN1cnJlbnRBcmc7ICAgLy8gdGhlIGN1cnJlbnQgYXJndW1lbnQgZm9yIHByb2Nlc3NpbmcgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCisgICAgaW50IG5leHRTbG90OworCisgICAgLy8gbWFwIGVhY2ggPGlkPiB0byB0aGUgc2V0IG9mIHRoaW5ncyBjb21tb25seSBuZWVkZWQKKyAgICAvLyBUT0RPOiBvcHRpbWl6ZSBzcGFjZSBkb3duIHRvIHdoYXQgcmVhbGx5IGlzIGNvbW1vbmx5IG5lZWRlZAorICAgIHVuc2lnbmVkIGludCBudW1JZHM7CisgICAgc3RydWN0IENvbW1vbkFubm90YXRpb25zIHsKKyAgICAgICAgQ29tbW9uQW5ub3RhdGlvbnMoKSA6IGluc3RydWN0aW9uSW5kZXgoMCksIHR5cGVJZCgwKSwgdmFsdWUoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Jsb2NrKGZhbHNlKSwgaXNCdWZmZXIoZmFsc2UpLCBzdG9yYWdlQ2xhc3MoKHNwdjo6U3RvcmFnZUNsYXNzKUJhZFZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQoKHNwdjo6RXhlY3V0aW9uTW9kZWwpQmFkVmFsdWUpLCBtZW1iZXJNZXRhRGF0YSgwKSB7IH0KKyAgICAgICAgaW50IGluc3RydWN0aW9uSW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2NhdGlvbiBpbiB0aGUgc3BpcnYgb2YgdGhpcyBpbnN0cnVjdGlvbgorICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBzcHY6OklkIHR5cGVJZDsgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlSWQgaXMgdmFsaWQgaWYgaW5kZXhlZCB3aXRoIGEgcmVzdWx0SWQKKyAgICAgICAgICAgIGxsdm06OlR5cGUqIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaXMgdmFsaWQgaWYgaW5kZXhlZCB3aXRoIGEgdHlwZUlkCisgICAgICAgIH07CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIGxsdm06OlZhbHVlKiB2YWx1ZTsgICAgICAgICAgICAgICAgIC8vIGZvciB0aGluZ3MgdXNpbmcgYSB2YWx1ZQorICAgICAgICAgICAgbGx2bTo6RnVuY3Rpb24qIGZ1bmN0aW9uOyAgICAgICAgICAgLy8gZm9yIGZ1bmN0aW9uIGlkCisgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrKiBibG9jazsgICAgICAgICAgICAvLyBmb3IgbGFiZWwgaWQKKyAgICAgICAgfTsKKyAgICAgICAgTWV0YVR5cGUgbWV0YVR5cGU7CisgICAgICAgIGJvb2wgaXNCbG9jazsKKyAgICAgICAgYm9vbCBpc0J1ZmZlcjsgICAgICAgIC8vIFNTQk8KKyAgICAgICAgc3B2OjpTdG9yYWdlQ2xhc3Mgc3RvcmFnZUNsYXNzOworICAgICAgICBzcHY6OkV4ZWN1dGlvbk1vZGVsIGVudHJ5UG9pbnQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1ldGFUeXBlPiAqbWVtYmVyTWV0YURhdGE7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxDb21tb25Bbm5vdGF0aW9ucz4gY29tbW9uTWFwOworfTsKKworU3B2VG9Ub3BUcmFuc2xhdG9yOjpTcHZUb1RvcFRyYW5zbGF0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiYgc3BpcnYsIGdsYTo6TWFuYWdlciYgbWFuYWdlcikKKyAgICA6IHNwaXJ2KHNwaXJ2KSwgd29yZCgwKSwKKyAgICAgIG1hbmFnZXIobWFuYWdlciksIGNvbnRleHQobWFuYWdlci5nZXRNb2R1bGUoKS0+Z2V0Q29udGV4dCgpKSwKKyAgICAgIHNoYWRlckVudHJ5KDApLCBsbHZtQnVpbGRlcihjb250ZXh0KSwKKyAgICAgIG1vZHVsZShtYW5hZ2VyLmdldE1vZHVsZSgpKSwgbWV0YWRhdGEoY29udGV4dCwgbW9kdWxlKSwKKyAgICAgIHZlcnNpb24oMCksIGdlbmVyYXRvcigwKSwgY3VycmVudE1vZGVsKChzcHY6OkV4ZWN1dGlvbk1vZGVsKUJhZFZhbHVlKSwgY3VycmVudEZ1bmN0aW9uKDApLAorICAgICAgbmV4dFNsb3QoZ2xhOjpNYXhVc2VyTGF5b3V0TG9jYXRpb24pCit7CisgICAgZ2xhQnVpbGRlciA9IG5ldyBnbGE6OkJ1aWxkZXIobGx2bUJ1aWxkZXIsICZtYW5hZ2VyLCBtZXRhZGF0YSk7CisgICAgZ2xhQnVpbGRlci0+c2V0Tm9QcmVkZWNlc3NvckJsb2NrcyhmYWxzZSk7CisgICAgZ2xhQnVpbGRlci0+Y2xlYXJBY2Nlc3NDaGFpbigpOworICAgIGdsYUJ1aWxkZXItPnNldEFjY2Vzc0NoYWluRGlyZWN0aW9uUmlnaHRUb0xlZnQoZmFsc2UpOworfQorCitTcHZUb1RvcFRyYW5zbGF0b3I6On5TcHZUb1RvcFRyYW5zbGF0b3IoKQoreworfQorCisvLyBNYWtlIHN1cmUgdGhlIG1lbWJlck1ldGFEYXRhIGlzIGJpZyBlbm91Z2ggdG8gaG9sZCAwLWJhc2VkICdtZW1iZXInCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6YnVtcE1lbWJlck1ldGFEYXRhKHN0ZDo6dmVjdG9yPE1ldGFUeXBlPiomIG1lbWJlck1ldGFEYXRhLCBpbnQgbWVtYmVyKQoreworICAgIC8vIFNwZWNpZmljYXRpb24gaXNzdWU6IGl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIHRvIGtub3cgdXAgZnJvbnQgdGhlIG51bWJlciBvZiBtZW1iZXJzIHRvIGRlY29yYXRlCisgICAgaWYgKG1lbWJlck1ldGFEYXRhID09IDApCisgICAgICAgIG1lbWJlck1ldGFEYXRhID0gbmV3IHN0ZDo6dmVjdG9yPE1ldGFUeXBlPjsKKyAgICBpZiAoKGludCltZW1iZXJNZXRhRGF0YS0+c2l6ZSgpIDwgbWVtYmVyICsgMSkKKyAgICAgICAgbWVtYmVyTWV0YURhdGEtPnJlc2l6ZShtZW1iZXIgKyAxKTsKK30KKworLy8KKy8vIFRoZSB0b3AtbGV2ZWwgYWxnb3JpdGhtIGZvciB0cmFuc2xhdGluZyBTUElSLVYgdG8gdGhlIExMVk0tYmFzZWQgVG9wIElSLgorLy8KKy8vIEdvZXMgc2VxdWVudGlhbGx5IHRocm91Z2ggdGhlIGVudGlyZSBTUElSLVYgbW9kdWxlLCBvbmUgaW5zdHJ1Y3Rpb24gYXQgYSB0aW1lLAorLy8gaGFuZGluZyBvdXQgdGhlIHdvcmsgdG8gaGVscGVyIG1ldGhvZHMuCisvLworLy8gVGhlIHJlc3VsdCA8aWQ+IGFuZCB0eXBlIDxpZD4gb2YgZWFjaCBpbnN0cnVjdGlvbiBhcmUgZGVjb2RlZCBoZXJlLCBhcyB3ZWxsCisvLyBhcyB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzLiAgQnV0IHRoZSBvcGVyYW5kcyB0aGVtc2VsdmVzIGFyZSBkZWNvZGVkIGJ5IHRoZQorLy8gY2FsbGVkIG1ldGhvZHMuCisvLwordm9pZCBTcHZUb1RvcFRyYW5zbGF0b3I6Om1ha2VUb3AoKQoreworICAgIGludCBzaXplID0gKGludClzcGlydi5zaXplKCk7CisKKyAgICAvLyBTYW5pdHkgY2hlY2sgc2l6ZQorICAgIGlmIChzaXplIDwgNSkKKyAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIlNQSVItViBpcyB0b28gc2hvcnQiKTsKKworICAgIC8vIE1hZ2ljIG51bWJlcgorICAgIGlmIChzcGlydlt3b3JkKytdICE9IHNwdjo6TWFnaWNOdW1iZXIpCisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJCYWQgbWFnaWMgbnVtYmVyIGZvciBTUElSLVYiKTsKKworICAgIHZlcnNpb24gPSBzcGlydlt3b3JkKytdOworICAgIGdlbmVyYXRvciA9IHNwaXJ2W3dvcmQrK107CisKKyAgICBudW1JZHMgPSBzcGlydlt3b3JkKytdOworICAgIGNvbW1vbk1hcC5yZXNpemUobnVtSWRzKTsKKworICAgIGlmIChzcGlydlt3b3JkKytdICE9IDApCisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJOb24tMCBzY2hlbWEiKTsKKworICAgIC8vIFdhbGsgdGhlIGluc3RydWN0aW9ucworICAgIHdoaWxlICh3b3JkIDwgc2l6ZSkgeworICAgICAgICAvLyBGaXJzdCB3b3JkCisgICAgICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvblN0YXJ0ID0gd29yZDsKKyAgICAgICAgdW5zaWduZWQgaW50IGZpcnN0V29yZCA9IHNwaXJ2W3dvcmRdOworCisgICAgICAgIC8vIE9wQ29kZQorICAgICAgICBzcHY6Ok9wIG9wQ29kZSA9IEdldE9wQ29kZShmaXJzdFdvcmQpOworCisgICAgICAgIC8vIEluc3RydWN0aW9uIHNpemUKKyAgICAgICAgaW50IGluc3RyU2l6ZSA9IChpbnQpKGZpcnN0V29yZCA+PiAxNik7CisgICAgICAgIG5leHRJbnN0ID0gd29yZCArIGluc3RyU2l6ZTsKKworICAgICAgICB3b3JkKys7CisgICAgICAgIGlmIChuZXh0SW5zdCA+IHNpemUpCisgICAgICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiU1BJUi1WIGluc3RydWN0aW9uIHRlcm1pbmF0ZWQgdG9vIGVhcmx5Iik7CisKKyAgICAgICAgLy8gSGFuZCBvZmYgZWFjaCBpbnN0cnVjdGlvbgorICAgICAgICB0cmFuc2xhdGVJbnN0cnVjdGlvbihvcENvZGUsIGluc3RyU2l6ZSAtIDEpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBpbiBhIHdheSBzdGFibGUgV1JUIGluY29ycmVjdCBvcGVyYW5kIHBhcnNpbmcKKyAgICAgICAgd29yZCA9IG5leHRJbnN0OworICAgIH0KK30KKworLy8gU2V0IGFuIGVudHJ5IHBvaW50IGZvciBhIG1vZGVsLgorLy8gTm90ZTogIGN1cnJlbnRseSBvbmx5IG9uZSBlbnRyeSBwb2ludCBpcyBzdXBwb3J0ZWQuCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6c2V0RW50cnlQb2ludChzcHY6OkV4ZWN1dGlvbk1vZGVsIG1vZGVsLCBzcHY6OklkIGVudHJ5SWQpCit7CisgICAgY29tbW9uTWFwW2VudHJ5SWRdLmVudHJ5UG9pbnQgPSBtb2RlbDsKKyAgICBpZiAoY3VycmVudE1vZGVsICE9IEJhZFZhbHVlKQorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiTXVsdGlwbGUgZXhlY3V0aW9uIG1vZGVscyBpbiB0aGUgc2FtZSBTUElSLVYgbW9kdWxlIChzZXR0aW5nIGVudHJ5IHBvaW50KSIpOworICAgIGN1cnJlbnRNb2RlbCA9IG1vZGVsOworCisgICAgLy8gTG9jayBvdXJzZWx2ZXMgaW50byBhIHNpbmdsZSBtb2RlbCBmb3Igbm93Li4uCisgICAgc3dpdGNoIChjdXJyZW50TW9kZWwpIHsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxWZXJ0ZXg6ICAgICAgICAgICAgICAgICAgbWFuYWdlci5zZXRTdGFnZShFU2hMYW5nVmVydGV4KTsgICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxUZXNzZWxsYXRpb25Db250cm9sOiAgICAgbWFuYWdlci5zZXRTdGFnZShFU2hMYW5nVGVzc0NvbnRyb2wpOyAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxUZXNzZWxsYXRpb25FdmFsdWF0aW9uOiAgbWFuYWdlci5zZXRTdGFnZShFU2hMYW5nVGVzc0V2YWx1YXRpb24pOyBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxHZW9tZXRyeTogICAgICAgICAgICAgICAgbWFuYWdlci5zZXRTdGFnZShFU2hMYW5nR2VvbWV0cnkpOyAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxGcmFnbWVudDogICAgICAgICAgICAgICAgbWFuYWdlci5zZXRTdGFnZShFU2hMYW5nRnJhZ21lbnQpOyAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZWxHTENvbXB1dGU6ICAgICAgICAgICAgICAgbWFuYWdlci5zZXRTdGFnZShFU2hMYW5nQ29tcHV0ZSk7ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiU1BJUi1WIGV4ZWN1dGlvbiBtb2RlbCIsIG1vZGVsLCBnbGE6OkVBVEFib3J0KTsKKyAgICB9Cit9CisKKy8vIFByb2Nlc3MgYW4gT3BFeGVjdXRpb25Nb2RlIGluc3RydWN0aW9uLgorLy8gT24gZW50cnksICd3b3JkJyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9wZXJhbmQuCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6c2V0RXhlY3V0aW9uTW9kZShzcHY6OklkIGVudHJ5UG9pbnQsIHNwdjo6RXhlY3V0aW9uTW9kZSBtb2RlKQoreworICAgIHNwdjo6RXhlY3V0aW9uTW9kZWwgbW9kZWwgPSBjb21tb25NYXBbZW50cnlQb2ludF0uZW50cnlQb2ludDsKKyAgICBhc3NlcnQobW9kZWwgIT0gQmFkVmFsdWUpOworCisgICAgaWYgKGN1cnJlbnRNb2RlbCAhPSBtb2RlbCkKKyAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIk11bHRpcGxlIGV4ZWN1dGlvbiBtb2RlbHMgaW4gdGhlIHNhbWUgU1BJUi1WIG1vZHVsZSAoc2V0dGluZyBpbnB1dCBtb2RlKSIsIGdsYTo6RUFUQ29udGludWUpOworCisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVJbnZvY2F0aW9uczoKKyAgICAgICAgbWV0YWRhdGEubWFrZU1kTmFtZWRJbnQoZ2xhOjpJbnZvY2F0aW9uc01kTmFtZSwgc3BpcnZbd29yZCsrXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlU3BhY2luZ0VxdWFsOgorICAgICAgICBtZXRhZGF0YS5tYWtlTWROYW1lZEludChnbGE6OlZlcnRleFNwYWNpbmdNZE5hbWUsIGdsYTo6RU12c0VxdWFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVTcGFjaW5nRnJhY3Rpb25hbEV2ZW46CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6VmVydGV4U3BhY2luZ01kTmFtZSwgZ2xhOjpFTXZzRnJhY3Rpb25hbEV2ZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZVNwYWNpbmdGcmFjdGlvbmFsT2RkOgorICAgICAgICBtZXRhZGF0YS5tYWtlTWROYW1lZEludChnbGE6OlZlcnRleFNwYWNpbmdNZE5hbWUsIGdsYTo6RU12c0ZyYWN0aW9uYWxPZGQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZVZlcnRleE9yZGVyQ3c6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6VmVydGV4T3JkZXJNZE5hbWUsIGdsYTo6RU12b0N3KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVWZXJ0ZXhPcmRlckNjdzoKKyAgICAgICAgbWV0YWRhdGEubWFrZU1kTmFtZWRJbnQoZ2xhOjpWZXJ0ZXhPcmRlck1kTmFtZSwgZ2xhOjpFTXZvQ2N3KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVQaXhlbENlbnRlckludGVnZXI6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6UGl4ZWxDZW50ZXJJbnRlZ2VyTWROYW1lLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVPcmlnaW5VcHBlckxlZnQ6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6T3JpZ2luVXBwZXJMZWZ0TWROYW1lLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVPcmlnaW5Mb3dlckxlZnQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlUG9pbnRNb2RlOgorICAgICAgICBtZXRhZGF0YS5tYWtlTWROYW1lZEludChnbGE6OlBvaW50TW9kZU1kTmFtZSwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlSW5wdXRQb2ludHM6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6SW5wdXRQcmltaXRpdmVNZE5hbWUsIGdsYTo6RU1sZ1BvaW50cyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlSW5wdXRMaW5lczoKKyAgICAgICAgbWV0YWRhdGEubWFrZU1kTmFtZWRJbnQoZ2xhOjpJbnB1dFByaW1pdGl2ZU1kTmFtZSwgZ2xhOjpFTWxnTGluZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZUlucHV0TGluZXNBZGphY2VuY3k6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6SW5wdXRQcmltaXRpdmVNZE5hbWUsIGdsYTo6RU1sZ0xpbmVzQWRqYWNlbmN5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVUcmlhbmdsZXM6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6SW5wdXRQcmltaXRpdmVNZE5hbWUsIGdsYTo6RU1sZ1RyaWFuZ2xlcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlSW5wdXRUcmlhbmdsZXNBZGphY2VuY3k6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6SW5wdXRQcmltaXRpdmVNZE5hbWUsIGdsYTo6RU1sZ1RyaWFuZ2xlc0FkamFjZW5jeSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlUXVhZHM6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6SW5wdXRQcmltaXRpdmVNZE5hbWUsIGdsYTo6RU1sZ1F1YWRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVJc29saW5lczoKKyAgICAgICAgbWV0YWRhdGEubWFrZU1kTmFtZWRJbnQoZ2xhOjpJbnB1dFByaW1pdGl2ZU1kTmFtZSwgZ2xhOjpFTWxnSXNvbGluZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZVhmYjoKKyAgICAgICAgbWV0YWRhdGEubWFrZU1kTmFtZWRJbnQoZ2xhOjpYZmJNb2RlTWROYW1lLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVPdXRwdXRWZXJ0aWNlczoKKyAgICAgICAgbWV0YWRhdGEubWFrZU1kTmFtZWRJbnQoZ2xhOjpOdW1WZXJ0aWNlc01kTmFtZSwgc3BpcnZbd29yZCsrXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlT3V0cHV0UG9pbnRzOgorICAgICAgICBtZXRhZGF0YS5tYWtlTWROYW1lZEludChnbGE6Ok91dHB1dFByaW1pdGl2ZU1kTmFtZSwgZ2xhOjpFTWxnUG9pbnRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkV4ZWN1dGlvbk1vZGVPdXRwdXRMaW5lU3RyaXA6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6T3V0cHV0UHJpbWl0aXZlTWROYW1lLCBnbGE6OkVNbGdMaW5lU3RyaXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZU91dHB1dFRyaWFuZ2xlU3RyaXA6CisgICAgICAgIG1ldGFkYXRhLm1ha2VNZE5hbWVkSW50KGdsYTo6T3V0cHV0UHJpbWl0aXZlTWROYW1lLCBnbGE6OkVNbGdUcmlhbmdsZVN0cmlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZUxvY2FsU2l6ZToKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZUVhcmx5RnJhZ21lbnRUZXN0czoKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZURlcHRoR3JlYXRlcjoKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZURlcHRoTGVzczoKKyAgICBjYXNlIHNwdjo6RXhlY3V0aW9uTW9kZURlcHRoVW5jaGFuZ2VkOgorICAgIGNhc2Ugc3B2OjpFeGVjdXRpb25Nb2RlRGVwdGhSZXBsYWNpbmc6CisKKyAgICBkZWZhdWx0OgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiZXhlY3V0aW9uIG1vZGUiLCBnbGE6OkVBVENvbnRpbnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvLyBQcm9jZXNzIGFuIE9wRGVjb3JhdGUgaW5zdHJ1Y3Rpb24uCisvLyBJdCdzIGJlZW4gZGVjb2RlZCB1cCB0byBidXQgbm90IGluY2x1ZGluZyBvcHRpb25hbCBvcGVyYW5kcy4KK3ZvaWQgU3B2VG9Ub3BUcmFuc2xhdG9yOjphZGREZWNvcmF0aW9uKHNwdjo6SWQgaWQsIHNwdjo6RGVjb3JhdGlvbiBkZWNvcmF0aW9uKQoreworICAgIHN3aXRjaCAoZGVjb3JhdGlvbikgeworICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uQmxvY2s6CisgICAgICAgIGNvbW1vbk1hcFtpZF0uaXNCbG9jayA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uQnVmZmVyQmxvY2s6CisgICAgICAgIGNvbW1vbk1hcFtpZF0uaXNCbG9jayA9IHRydWU7CisgICAgICAgIGNvbW1vbk1hcFtpZF0uaXNCdWZmZXIgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhZGRNZXRhVHlwZURlY29yYXRpb24oZGVjb3JhdGlvbiwgY29tbW9uTWFwW2lkXS5tZXRhVHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gUHJvY2VzcyBhbiBPcE1lbWJlckRlY29yYXRlIGluc3RydWN0aW9uLgorLy8gSXQncyBiZWVuIGRlY29kZWQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgb3B0aW9uYWwgb3BlcmFuZHMuCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6YWRkTWVtYmVyRGVjb3JhdGlvbihzcHY6OklkIHN0cnVjdFR5cGVJZCwgdW5zaWduZWQgaW50IG1lbWJlciwgc3B2OjpEZWNvcmF0aW9uIGRlY29yYXRpb24pCit7CisgICAgYnVtcE1lbWJlck1ldGFEYXRhKGNvbW1vbk1hcFtzdHJ1Y3RUeXBlSWRdLm1lbWJlck1ldGFEYXRhLCBtZW1iZXIpOworICAgIGFkZE1ldGFUeXBlRGVjb3JhdGlvbihkZWNvcmF0aW9uLCAoKmNvbW1vbk1hcFtzdHJ1Y3RUeXBlSWRdLm1lbWJlck1ldGFEYXRhKVttZW1iZXJdKTsKK30KKworLy8gUHJvY2VzcyBhbiBPcERlY29yYXRlIGluc3RydWN0aW9uLgorLy8gSXQncyBiZWVuIGRlY29kZWQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgb3B0aW9uYWwgb3BlcmFuZHMuCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6YWRkTWV0YVR5cGVEZWNvcmF0aW9uKHNwdjo6RGVjb3JhdGlvbiBkZWNvcmF0aW9uLCBNZXRhVHlwZSYgbWV0YVR5cGUpCit7CisgICAgdW5zaWduZWQgaW50IG51bTsKKworICAgIHN3aXRjaCAoZGVjb3JhdGlvbikgeworICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uUmVsYXhlZFByZWNpc2lvbjoKKyAgICAgICAgbWV0YVR5cGUucHJlY2lzaW9uID0gZ2xhOjpFTXBNZWRpdW07CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25Ob1BlcnNwZWN0aXZlOgorICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uRmxhdDoKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvblBhdGNoOgorICAgICAgICBtZXRhVHlwZS5pbnRlcnBvbGF0aW9uTWV0aG9kID0gZGVjb3JhdGlvbjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkdMU0xTaGFyZWQ6CisgICAgICAgIG1ldGFUeXBlLmxheW91dCA9IGdsYTo6RU10bFNoYXJlZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25HTFNMUGFja2VkOgorICAgICAgICBtZXRhVHlwZS5sYXlvdXQgPSBnbGE6OkVNdGxQYWNrZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uUm93TWFqb3I6CisgICAgICAgIG1ldGFUeXBlLmxheW91dCA9IGdsYTo6RU10bFJvd01ham9yTWF0cml4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkNvbE1ham9yOgorICAgICAgICBtZXRhVHlwZS5sYXlvdXQgPSBnbGE6OkVNdGxDb2xNYWpvck1hdHJpeDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25NYXRyaXhTdHJpZGU6CisgICAgICAgIG51bSA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIG1ldGFUeXBlLm1hdHJpeFN0cmlkZSA9IChzaG9ydCludW07CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uQXJyYXlTdHJpZGU6CisgICAgICAgIG51bSA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIG1ldGFUeXBlLmFycmF5U3RyaWRlID0gKHNob3J0KW51bTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkludmFyaWFudDoKKyAgICAgICAgbWV0YVR5cGUuaW52YXJpYW50ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkRlc2NyaXB0b3JTZXQ6CisgICAgICAgIG51bSA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIG1ldGFUeXBlLnNldCA9IG51bTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25CaW5kaW5nOgorICAgICAgICBudW0gPSBzcGlydlt3b3JkKytdOworICAgICAgICBtZXRhVHlwZS5iaW5kaW5nID0gbnVtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkxvY2F0aW9uOgorICAgICAgICBudW0gPSBzcGlydlt3b3JkKytdOworICAgICAgICBtZXRhVHlwZS5sb2NhdGlvbiA9IG51bTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25CdWlsdEluOgorICAgICAgICBudW0gPSBzcGlydlt3b3JkKytdOworICAgICAgICBtZXRhVHlwZS5idWlsdEluID0gR2V0TWRCdWlsdEluKChzcHY6OkJ1aWx0SW4pbnVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25PZmZzZXQ6CisgICAgeworICAgICAgICBzdGF0aWMgYm9vbCBvbmNlID0gZmFsc2U7CisgICAgICAgIGlmICghIG9uY2UpIHsKKyAgICAgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJtZW1iZXIgb2Zmc2V0IiwgZ2xhOjpFQVRDb250aW51ZSk7CisgICAgICAgICAgICBvbmNlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvblN0cmVhbToKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkNvbXBvbmVudDoKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbkluZGV4OgorICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uWGZiQnVmZmVyOgorCisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25DZW50cm9pZDoKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvblNhbXBsZToKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvblVuaWZvcm06CisgICAgZGVmYXVsdDoKKyAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIm1ldGFUeXBlIGRlY29yYXRpb24gIiwgZGVjb3JhdGlvbiwgZ2xhOjpFQVRDb250aW51ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gUHJvY2VzcyBhbiBPcFR5cGUgaW5zdHJ1Y3Rpb24uCisvLyBPbiBlbnRyeSwgJ3dvcmQnIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4KK3ZvaWQgU3B2VG9Ub3BUcmFuc2xhdG9yOjphZGRUeXBlKHNwdjo6T3AgdHlwZUNsYXNzLCBzcHY6OklkIHJlc3VsdElkLCBpbnQgbnVtT3BlcmFuZHMpCit7CisgICAgdW5zaWduZWQgaW50IHdpZHRoOworICAgIHN3aXRjaCAodHlwZUNsYXNzKSB7CisKKyAgICAvLyB2b2lkCisgICAgY2FzZSBzcHY6Ok9wVHlwZVZvaWQ6CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZSA9IGdsYTo6R2V0Vm9pZFR5cGUoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gYm9vbAorICAgIGNhc2Ugc3B2OjpPcFR5cGVCb29sOiAgICAgICAgCisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZSA9IGdsYTo6R2V0Qm9vbFR5cGUoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gZmxvYXQKKyAgICBjYXNlIHNwdjo6T3BUeXBlRmxvYXQ6CisgICAgICAgIHdpZHRoID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgaWYgKHdpZHRoICE9IDMyKQorICAgICAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIm5vbi0zMi1iaXQgd2lkdGggT3BUeXBlIik7CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZSA9IGdsYTo6R2V0RmxvYXRUeXBlKGNvbnRleHQpOworICAgICAgICBicmVhazsKKworICAgIC8vIGludAorICAgIGNhc2Ugc3B2OjpPcFR5cGVJbnQ6CisgICAgICAgIHdpZHRoID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgaWYgKHdpZHRoID09IDMyKSB7CisgICAgICAgICAgICBpZiAoc3BpcnZbd29yZCsrXSA9PSAwdSkgeworICAgICAgICAgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUubGF5b3V0ID0gZ2xhOjpFTXRsVW5zaWduZWQ7CisgICAgICAgICAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS50eXBlID0gZ2xhOjpHZXRVaW50VHlwZShjb250ZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZSA9IGdsYTo6R2V0SW50VHlwZShjb250ZXh0KTsgICAgICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIm5vbi0zMi1iaXQgaW50IGZvciBPcFR5cGUiKTsKKworICAgICAgICBicmVhazsKKworICAgIC8vIHZlY3RvcgorICAgIGNhc2Ugc3B2OjpPcFR5cGVWZWN0b3I6CisgICAgeworICAgICAgICBsbHZtOjpUeXBlKiBjb21wb25lbnRUeXBlID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnR5cGU7CisgICAgICAgIHVuc2lnbmVkIGludCB2ZWN0b3JTaXplID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS50eXBlID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGNvbXBvbmVudFR5cGUsIHZlY3RvclNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBhcnJheQorICAgIGNhc2Ugc3B2OjpPcFR5cGVBcnJheToKKyAgICB7CisgICAgICAgIGxsdm06OlR5cGUqIGVsZW1lbnRUeXBlID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnR5cGU7CisgICAgICAgIHVuc2lnbmVkIGludCBhcnJheVNpemVJZCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZSA9IGxsdm06OkFycmF5VHlwZTo6Z2V0KGVsZW1lbnRUeXBlLCBnbGE6OkdldENvbnN0YW50SW50KGNvbW1vbk1hcFthcnJheVNpemVJZF0udmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWF0cml4CisgICAgY2FzZSBzcHY6Ok9wVHlwZU1hdHJpeDoKKyAgICB7CisgICAgICAgIGxsdm06OlR5cGUqIGNvbHVtblR5cGUgPSBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udHlwZTsKKyAgICAgICAgaW50IGNvbHMgPSBzcGlydlt3b3JkKytdOworICAgICAgICBpbnQgcm93cyA9IGdsYTo6R2V0Q29tcG9uZW50Q291bnQoY29sdW1uVHlwZSk7CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZSA9IGdsYUJ1aWxkZXItPmdldE1hdHJpeFR5cGUoY29sdW1uVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSwgY29scywgcm93cyk7CisgICAgICAgIGlmIChjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmxheW91dCA9PSBnbGE6OkVNdGxOb25lKQorICAgICAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5sYXlvdXQgPSBnbGE6OkVNdGxDb2xNYWpvck1hdHJpeDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gaW1hZ2VzCisgICAgY2FzZSBzcHY6Ok9wVHlwZUltYWdlOgorICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnR5cGUgPSBnbGE6OkdldEludFR5cGUoY29udGV4dCk7CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUubGF5b3V0ID0gZ2xhOjpFTXRsU2FtcGxlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wVHlwZVNhbXBsZWRJbWFnZToKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS50eXBlID0gZ2xhOjpHZXRJbnRUeXBlKGNvbnRleHQpOworICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmxheW91dCA9IGdsYTo6RU10bFNhbXBsZXI7CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUuY29tYmluZWRJbWFnZVNhbXBsZXIgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BUeXBlU2FtcGxlcjoKKyAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIk9wVHlwZVNhbXBsZXIiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvLyBydW4tdGltZSBhcnJheQorICAgIGNhc2Ugc3B2OjpPcFR5cGVSdW50aW1lQXJyYXk6CisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJydW4gdGltZSBhcnJheSBPcFR5cGUiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvLyBzdHJ1Y3R1cmUKKyAgICBjYXNlIHNwdjo6T3BUeXBlU3RydWN0OgorICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8bGx2bTo6VHlwZSo+IG1lbWJlclR5cGVzOworICAgICAgICBtZW1iZXJUeXBlcy5yZXNpemUobnVtT3BlcmFuZHMpOworICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IG51bU9wZXJhbmRzOyArK20pCisgICAgICAgICAgICBtZW1iZXJUeXBlc1ttXSA9IGNvbW1vbk1hcFtzcGlydlt3b3JkKytdXS50eXBlOworICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnR5cGUgPSBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLm5hbWUgPyBsbHZtOjpTdHJ1Y3RUeXBlOjpjcmVhdGUoY29udGV4dCwgbWVtYmVyVHlwZXMsIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGx2bTo6U3RydWN0VHlwZTo6Y3JlYXRlKGNvbnRleHQsIG1lbWJlclR5cGVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gcG9pbnRlcgorICAgIGNhc2Ugc3B2OjpPcFR5cGVQb2ludGVyOgorICAgIHsKKyAgICAgICAgc3B2OjpTdG9yYWdlQ2xhc3Mgc3RvcmFnZUNsYXNzID0gKHNwdjo6U3RvcmFnZUNsYXNzKXNwaXJ2W3dvcmQrK107CisgICAgICAgIHNwdjo6SWQgcG9pbnRlZSA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZSA9IGdsYUJ1aWxkZXItPmdldFBvaW50ZXJUeXBlKGNvbW1vbk1hcFtwb2ludGVlXS50eXBlLCBtYXBTdG9yYWdlQ2xhc3Moc3RvcmFnZUNsYXNzLCBjb21tb25NYXBbcG9pbnRlZV0uaXNCdWZmZXIpLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gZnVuY3Rpb24KKyAgICBjYXNlIHNwdjo6T3BUeXBlRnVuY3Rpb246CisgICAgICAgIC8vIERvbid0IG1ha2UgYW4gTExWTSB0eXBlIGZvciBhIGZ1bmN0aW9uIHR5cGUsIGp1c3QgdXNlIGl0IGZvciAKKyAgICAgICAgLy8gcmVmZXJlbmNlIHdoZW4gYSBmdW5jdGlvbiB1c2VzIGl0LiAgTWF5YmUgdGhpcyB3aWxsIGNoYW5nZSB3aGVuCisgICAgICAgIC8vIGZ1bmN0aW9uIHBvaW50ZXJzIG5lZWQgdG8gYmUgc3VwcG9ydGVkLgorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJPcFR5cGUgdHlwZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gUHJvY2VzcyBhbiBPcFZhcmlhYmxlIGluc3RydWN0aW9uLgorLy8gSXQgaGFzIGFscmVhZHkgYmVlbiBmdWxseSBkZWNvZGVkLgordm9pZCBTcHZUb1RvcFRyYW5zbGF0b3I6OmFkZFZhcmlhYmxlKHNwdjo6SWQgcmVzdWx0SWQsIHNwdjo6SWQgdHlwZUlkLCBzcHY6OlN0b3JhZ2VDbGFzcyBzdG9yYWdlQ2xhc3MpCit7CisgICAgLy8gdHlwZUlkIHNob3VsZCBiZSB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBPcFZhcmlhYmxlIGluc3RydWN0aW9uLgorICAgIC8vIFRoYXQgaXMsIGEgcG9pbnRlciwgbWVhbmluZyB0aGUgdHlwZSBvZiB2YXJpYWJsZSB0byBjcmVhdGUgaXMgYSAKKyAgICAvLyBkZXJlZmVyZW5jZSBvZiB0eXBlSWQuCisgICAgYXNzZXJ0KGxsdm06OmlzYTxsbHZtOjpQb2ludGVyVHlwZT4oY29tbW9uTWFwW3R5cGVJZF0udHlwZSkpOworICAgIGxsdm06OlR5cGUqIHZhcmlhYmxlVHlwZSA9IGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7CisKKyAgICBjb21tb25NYXBbcmVzdWx0SWRdLnN0b3JhZ2VDbGFzcyA9IHN0b3JhZ2VDbGFzczsKKworICAgIGxsdm06OkNvbnN0YW50KiBpbml0aWFsaXplciA9IDA7CisgICAgaW50IGNvbnN0YW50QnVmZmVyID0gMDsKKyAgICBnbGE6OkJ1aWxkZXI6OkVTdG9yYWdlUXVhbGlmaWVyIGdsYVF1YWxpZmllciA9IG1hcFN0b3JhZ2VDbGFzcyhzdG9yYWdlQ2xhc3MsIGNvbW1vbk1hcFtyZXN1bHRJZF0uaXNCdWZmZXIpOworCisgICAgY29uc3QgY2hhciogbmFtZSA9IGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUubmFtZTsKKyAgICBpZiAobmFtZSkgeworICAgICAgICBpZiAobmFtZVswXSA9PSAwKQorICAgICAgICAgICAgbmFtZSA9ICJhbm9uQCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUuYnVpbHRJbiAhPSBnbGE6OkVtYk5vbmUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKCZjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmJ1ZlswXSwgTWV0YVR5cGU6OmJ1ZlNpemUsICJfX2dsYWIlZF8iLCBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmJ1aWx0SW4pOworICAgICAgICAgICAgbmFtZSA9ICZjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmJ1ZlswXTsKKyAgICAgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUubmFtZSA9IG5hbWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RvcmFnZUNsYXNzICE9IHNwdjo6U3RvcmFnZUNsYXNzRnVuY3Rpb24pCisgICAgICAgICAgICBuYW1lID0gIm5uIjsgICAvLyBubyBuYW1lLCBidXQgTExWTSB0cmVhdHMgSS9PIGFzIGRlYWQgd2hlbiB0aGVyZSBpcyBubyBuYW1lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5hbWUgPSAiIjsKKyAgICB9CisKKyAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gZ2xhQnVpbGRlci0+Y3JlYXRlVmFyaWFibGUoZ2xhUXVhbGlmaWVyLCBjb25zdGFudEJ1ZmZlciwgdmFyaWFibGVUeXBlLCBpbml0aWFsaXplciwgMCwgbmFtZSk7CisKKyAgICAvLyBTZXQgdXAgYW55IElPIG1ldGFkYXRhCisgICAgaW50IG51bVNsb3RzOworICAgIGludCBzbG90OworICAgIHN3aXRjaCAoc3RvcmFnZUNsYXNzKSB7CisgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc091dHB1dDoKKyAgICAgICAgc2xvdCA9IGFzc2lnblNsb3QocmVzdWx0SWQsIG51bVNsb3RzKTsKKyAgICAgICAgbWFrZU91dHB1dE1ldGFkYXRhKHJlc3VsdElkLCBzbG90LCBudW1TbG90cyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NJbnB1dDoKKyAgICAgICAgc2xvdCA9IGFzc2lnblNsb3QocmVzdWx0SWQsIG51bVNsb3RzKTsKKyAgICAgICAgbWFrZUlucHV0TWV0YWRhdGEocmVzdWx0SWQsIHNsb3QpOworICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NVbmlmb3JtQ29uc3RhbnQ6CisgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc1VuaWZvcm06CisgICAgICAgIGRlY2xhcmVVbmlmb3JtTWV0YWRhdGEocmVzdWx0SWQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2dsYTo6QnVpbGRlcjo6RVN0b3JhZ2VRdWFsaWZpZXIgU3B2VG9Ub3BUcmFuc2xhdG9yOjptYXBTdG9yYWdlQ2xhc3Moc3B2OjpTdG9yYWdlQ2xhc3Mgc3RvcmFnZUNsYXNzLCBib29sIGlzQnVmZmVyKQoreworICAgIHN3aXRjaCAoc3RvcmFnZUNsYXNzKSB7CisgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc0Z1bmN0aW9uOgorICAgICAgICByZXR1cm4gZ2xhOjpCdWlsZGVyOjpFU1FMb2NhbDsKKyAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzVW5pZm9ybUNvbnN0YW50OgorICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NVbmlmb3JtOgorICAgICAgICByZXR1cm4gaXNCdWZmZXIgPyBnbGE6OkJ1aWxkZXI6OkVTUUJ1ZmZlciA6IGdsYTo6QnVpbGRlcjo6RVNRVW5pZm9ybTsKKyAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzSW5wdXQ6CisgICAgICAgIHJldHVybiBnbGE6OkJ1aWxkZXI6OkVTUUlucHV0OworICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NPdXRwdXQ6CisgICAgICAgIHJldHVybiBnbGE6OkJ1aWxkZXI6OkVTUU91dHB1dDsKKyAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzUHJpdmF0ZToKKyAgICAgICAgcmV0dXJuIGdsYTo6QnVpbGRlcjo6RVNRR2xvYmFsOworICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NXb3JrZ3JvdXA6CisgICAgICAgIHJldHVybiBnbGE6OkJ1aWxkZXI6OkVTUVNoYXJlZDsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJzdG9yYWdlIGNsYXNzIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgZXhlY3V0ZWQ6CisgICAgcmV0dXJuIGdsYTo6QnVpbGRlcjo6RVNRR2xvYmFsOworfQorCisvLyBCdWlsZCBhIGxpdGVyYWwgY29uc3RhbnQuCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6YWRkQ29uc3RhbnQoc3B2OjpPcCBvcENvZGUsIHNwdjo6SWQgcmVzdWx0SWQsIHNwdjo6SWQgdHlwZUlkLCBpbnQgbnVtT3BlcmFuZHMpCit7CisgICAgLy8gdmVjdG9yIG9mIGNvbnN0YW50cyBmb3IgTExWTQorICAgIHN0ZDo6dmVjdG9yPGxsdm06OkNvbnN0YW50Kj4gbGx2bUNvbnN0czsKKworICAgIHN3aXRjaCAob3BDb2RlKSB7CisgICAgY2FzZSBzcHY6Ok9wQ29uc3RhbnRUcnVlOgorICAgICAgICBsbHZtQ29uc3RzLnB1c2hfYmFjayhnbGE6Ok1ha2VCb29sQ29uc3RhbnQoY29udGV4dCwgMSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BDb25zdGFudEZhbHNlOgorICAgICAgICBsbHZtQ29uc3RzLnB1c2hfYmFjayhnbGE6Ok1ha2VCb29sQ29uc3RhbnQoY29udGV4dCwgMCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BDb25zdGFudDoKKyAgICAgICAgc3dpdGNoIChnZXRPcENvZGUodHlwZUlkKSkgeworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlRmxvYXQ6CisgICAgICAgICAgICBpZiAobnVtT3BlcmFuZHMgPiAxKQorICAgICAgICAgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJub24tc2luZ2xlLXByZWNpc2lvbiBjb25zdGFudCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxsdm1Db25zdHMucHVzaF9iYWNrKGdsYTo6TWFrZUZsb2F0Q29uc3RhbnQoY29udGV4dCwgKihjb25zdCBmbG9hdCopKCZzcGlydlt3b3JkXSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6T3BUeXBlSW50OgorICAgICAgICAgICAgaWYgKGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUgPT0gY29tbW9uTWFwW3R5cGVJZF0udHlwZS0+Z2V0SW50MVR5KGNvbnRleHQpKQorICAgICAgICAgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCIxLWJpdCBpbnRlZ2VyIik7CisgICAgICAgICAgICBlbHNlIGlmIChjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmxheW91dCA9PSBnbGE6OkVNdGxVbnNpZ25lZCkKKyAgICAgICAgICAgICAgICBsbHZtQ29uc3RzLnB1c2hfYmFjayhnbGE6Ok1ha2VVbnNpZ25lZENvbnN0YW50KGNvbnRleHQsIHNwaXJ2W3dvcmRdKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGx2bUNvbnN0cy5wdXNoX2JhY2soZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgKGludClzcGlydlt3b3JkXSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgibGl0ZXJhbCBjb25zdGFudCB0eXBlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUgPSBnbGFCdWlsZGVyLT5nZXRDb25zdGFudChsbHZtQ29uc3RzLCBjb21tb25NYXBbdHlwZUlkXS50eXBlKTsKK30KKworLy8gQnVpbGQgdXAgYSBoaWVyYXJjaGljYWwgY29uc3RhbnQuCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6YWRkQ29uc3RhbnRBZ2dyZWdhdGUoc3B2OjpJZCByZXN1bHRJZCwgc3B2OjpJZCB0eXBlSWQsIGludCBudW1PcGVyYW5kcykKK3sKKyAgICAvLyB2ZWN0b3Igb2YgY29uc3RhbnRzIGZvciBMTFZNCisgICAgc3RkOjp2ZWN0b3I8bGx2bTo6Q29uc3RhbnQqPiBsbHZtQ29uc3RzOworICAgIGZvciAoaW50IG9wID0gMDsgb3AgPCBudW1PcGVyYW5kczsgKytvcCkKKyAgICAgICAgbGx2bUNvbnN0cy5wdXNoX2JhY2sobGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnQ+KGNvbW1vbk1hcFtzcGlydlt3b3JkKytdXS52YWx1ZSkpOworCisgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGdsYUJ1aWxkZXItPmdldENvbnN0YW50KGxsdm1Db25zdHMsIGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUpOworfQorCisvLworLy8gRmluZCBhbmQgdXNlIHRoZSB1c2VyLXNwZWNpZmllZCBsb2NhdGlvbiBhcyBhIHNsb3QsIG9yIGlmIGEgbG9jYXRpb24gd2FzIG5vdAorLy8gc3BlY2lmaWVkLCBwaWNrIHRoZSBuZXh0IG5vbi11c2VyIGF2YWlsYWJsZSBzbG90LiBVc2VyLXNwZWNpZmllZCBsb2NhdGlvbnMKKy8vIGRpcmVjdGx5IHVzZSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLCB3aGlsZSBub24tdXNlci1zcGVjaWZpZWQgd2lsbCB1c2UgbG9jYXRpb25zCisvLyBzdGFydGluZyBhZnRlciBNYXhVc2VyTGF5b3V0TG9jYXRpb24gdG8gYXZvaWQgY29sbGlzaW9ucy4KKy8vCisvLyBFbnN1cmUgZW5vdWdoIHNsb3RzIGFyZSBjb25zdW1lZCB0byBjb3ZlciB0aGUgc2l6ZSBvZiB0aGUgZGF0YSByZXByZXNlbnRlZCBieSB0aGUgbm9kZSBzeW1ib2wuCisvLworLy8gJ251bVNsb3RzJyBtZWFucyBudW1iZXIgb2YgR0xTTCBsb2NhdGlvbnMgd2hlbiB1c2luZyBsb2dpY2FsIElPLgorLy8KK2ludCBTcHZUb1RvcFRyYW5zbGF0b3I6OmFzc2lnblNsb3Qoc3B2OjpJZCByZXN1bHRJZCwgaW50JiBudW1TbG90cykKK3sKKyAgICAvLyBCYXNlIHRoZSBudW1iZXJzIG9mIHNsb3RzIG9uIHRoZSBmcm9udC1lbmQncyBjb21wdXRhdGlvbiwgaWYgcG9zc2libGUsIG90aGVyd2lzZSBlc3RpbWF0ZSBpdC4KKyAgICBudW1TbG90cyA9IDE7CisKKyAgICAvLz8/CisgICAgLy9pZiAodHlwZS5pc0FycmF5KCkgJiYgISB0eXBlLmdldFF1YWxpZmllcigpLmlzQXJyYXllZElvKGdsc2xhbmdJbnRlcm1lZGlhdGUtPmdldFN0YWdlKCkpKQorICAgIC8vICAgIG51bVNsb3RzID0gdHlwZS5nZXRBcnJheVNpemUoKTsKKyAgICAvL2lmICh0eXBlLmlzU3RydWN0KCkgfHwgdHlwZS5pc01hdHJpeCgpIHx8IHR5cGUuZ2V0QmFzaWNUeXBlKCkgPT0gc3B2OjpFYnREb3VibGUpCisgICAgLy8gICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoImNvbXBsZXggSS9PIHR5cGU7IHVzZSBuZXcgZ2xzbGFuZyBDKysgaW50ZXJmYWNlIiwgZ2xhOjpFQVRDb250aW51ZSk7CisgICAgLy99CisKKyAgICBpbnQgc2xvdCA9IGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUubG9jYXRpb247CisgICAgaWYgKHNsb3QgPT0gZ2xhOjpNYXhVc2VyTGF5b3V0TG9jYXRpb24pIHsKKyAgICAgICAgc2xvdCA9IG5leHRTbG90OworICAgICAgICBuZXh0U2xvdCArPSBudW1TbG90czsKKyAgICB9CisKKyAgICByZXR1cm4gc2xvdDsKK30KKworLy8KKy8vIFRoZSBmb2xsb3dpbmcgaXMgYSBzZXQgb2YgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdHJhbnNsYXRpbmcgU1BJUi1WIHRvIG1ldGFkYXRhLCAKKy8vIHNvIHRoYXQgaW5mb3JtYXRpb24gbm90IHJlcHJlc2VudGFibGUgaW4gTExWTSBkb2VzIG5vdCBnZXQgbG9zdC4KKy8vCisKKy8vIFRyYW5zbGF0ZSBhIFNQSVItViB2YXJpYWJsZSB0byB0aGUga2luZCBvZiBpbnB1dC9vdXRwdXQgcXVhbGlmaWVyIG5lZWRlZCBmb3IgaXQgaW4gbWV0YWRhdGEuCitnbGE6OkVNZElucHV0T3V0cHV0IFNwdlRvVG9wVHJhbnNsYXRvcjo6Z2V0TWRRdWFsaWZpZXIoc3B2OjpJZCByZXN1bHRJZCkgY29uc3QKK3sKKyAgICBnbGE6OkVNZElucHV0T3V0cHV0IG1kUXVhbGlmaWVyID0gZ2xhOjpFTWlvTm9uZTsKKworICAgIHNwdjo6SWQgdHlwZUlkID0gZGVyZWZlcmVuY2VUeXBlSWQoY29tbW9uTWFwW3Jlc3VsdElkXS50eXBlSWQpOworICAgIHR5cGVJZCA9IGdldEFycmF5RWxlbWVudFR5cGVJZCh0eXBlSWQpOworICAgIGlmIChjb21tb25NYXBbdHlwZUlkXS5pc0Jsb2NrKSB7CisgICAgICAgIC8vIHN0b3JhZ2UgY2xhc3MgY29tZXMgZnJvbSB0aGUgdmFyaWFibGUKKyAgICAgICAgc3dpdGNoIChjb21tb25NYXBbcmVzdWx0SWRdLnN0b3JhZ2VDbGFzcykgeworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzSW5wdXQ6ICAgbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9QaXBlSW5CbG9jazsgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzT3V0cHV0OiAgbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9QaXBlT3V0QmxvY2s7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzVW5pZm9ybTogbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9Vbmlmb3JtQmxvY2tNZW1iZXI7IGJyZWFrOworICAgICAgICAvL2Nhc2Ugc3B2OjpTdG9yYWdlICBtZFF1YWxpZmllciA9IGdsYTo6RU1pb0J1ZmZlckJsb2NrTWVtYmVyOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZFF1YWxpZmllcjsKKyAgICB9CisKKyAgICAvLyBub24tYmxvY2tzLi4uCisKKyAgICBzd2l0Y2ggKGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUuYnVpbHRJbikgeworICAgIGNhc2UgZ2xhOjpFbWJQb3NpdGlvbjogICAgbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9WZXJ0ZXhQb3NpdGlvbjsgYnJlYWs7CisgICAgY2FzZSBnbGE6OkVtYlBvaW50U2l6ZTogICBtZFF1YWxpZmllciA9IGdsYTo6RU1pb1BvaW50U2l6ZTsgICAgICBicmVhazsKKyAgICBjYXNlIGdsYTo6RW1iQ2xpcFZlcnRleDogIG1kUXVhbGlmaWVyID0gZ2xhOjpFTWlvQ2xpcFZlcnRleDsgICAgIGJyZWFrOworICAgIGNhc2UgZ2xhOjpFbWJJbnN0YW5jZUlkOiAgbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9JbnN0YW5jZUlkOyAgICAgYnJlYWs7CisgICAgY2FzZSBnbGE6OkVtYlZlcnRleElkOiAgICBtZFF1YWxpZmllciA9IGdsYTo6RU1pb1ZlcnRleElkOyAgICAgICBicmVhazsKKyAgICBjYXNlIGdsYTo6RW1iVmVydGV4SW5kZXg6IG1kUXVhbGlmaWVyID0gZ2xhOjpFTWlvVmVydGV4SW5kZXg7ICAgIGJyZWFrOworICAgIGNhc2UgZ2xhOjpFbWJGcmFnQ29vcmQ6ICAgbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9GcmFnbWVudENvb3JkOyAgYnJlYWs7CisgICAgY2FzZSBnbGE6OkVtYlBvaW50Q29vcmQ6ICBtZFF1YWxpZmllciA9IGdsYTo6RU1pb1BvaW50Q29vcmQ7ICAgICBicmVhazsKKyAgICBjYXNlIGdsYTo6RW1iRmFjZTogICAgICAgIG1kUXVhbGlmaWVyID0gZ2xhOjpFTWlvRnJhZ21lbnRGYWNlOyAgIGJyZWFrOworICAgIGNhc2UgZ2xhOjpFbWJGcmFnQ29sb3I6ICAgbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9QaXBlT3V0OyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBnbGE6OkVtYkZyYWdEZXB0aDogICBtZFF1YWxpZmllciA9IGdsYTo6RU1pb0ZyYWdtZW50RGVwdGg7ICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHN3aXRjaCAoY29tbW9uTWFwW3Jlc3VsdElkXS5zdG9yYWdlQ2xhc3MpIHsKKyAgICAgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc1VuaWZvcm1Db25zdGFudDogbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9EZWZhdWx0VW5pZm9ybTsgICAgIGJyZWFrOworICAgICAgICBjYXNlIHNwdjo6U3RvcmFnZUNsYXNzSW5wdXQ6ICAgICAgICAgICBtZFF1YWxpZmllciA9IGdsYTo6RU1pb1BpcGVJbjsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpTdG9yYWdlQ2xhc3NVbmlmb3JtOiAgICAgICAgIG1kUXVhbGlmaWVyID0gZ2xhOjpFTWlvVW5pZm9ybUJsb2NrTWVtYmVyOyBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OlN0b3JhZ2VDbGFzc091dHB1dDogICAgICAgICAgbWRRdWFsaWZpZXIgPSBnbGE6OkVNaW9QaXBlT3V0OyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIm1ldGFkYXRhIHN0b3JhZ2UgY2xhc3MiLCBjb21tb25NYXBbcmVzdWx0SWRdLnN0b3JhZ2VDbGFzcywgZ2xhOjpFQVRDb250aW51ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtZFF1YWxpZmllcjsKK30KKworLy8gVHJhbnNsYXRlIGEgU1BJUi1WIHNhbXBsZXIgdHlwZSB0byB0aGUga2luZCBvZiBpbWFnZS90ZXh0dXJlIG5lZWRlZCBmb3IgaXQgaW4gbWV0YWRhdGEuCitnbGE6OkVNZFNhbXBsZXIgU3B2VG9Ub3BUcmFuc2xhdG9yOjpnZXRNZFNhbXBsZXIoc3B2OjpJZCB0eXBlSWQpIGNvbnN0Cit7CisgICAgaWYgKGNvbW1vbk1hcFt0eXBlSWRdLm1ldGFUeXBlLmNvbWJpbmVkSW1hZ2VTYW1wbGVyKQorICAgICAgICByZXR1cm4gZ2xhOjpFTXNUZXh0dXJlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGdsYTo6RU1zSW1hZ2U7Cit9CisKKy8vIFRyYW5zbGF0ZSBhIFNQSVItViBzYW1wbGVyIHR5cGUgdG8gdGhlIG1ldGFkYXRhJ3MgZGltZW5zaW9uYWxpdHkuCitnbGE6OkVNZFNhbXBsZXJEaW0gU3B2VG9Ub3BUcmFuc2xhdG9yOjpnZXRNZFNhbXBsZXJEaW0oc3B2OjpJZCB0eXBlSWQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChnZXRJbWFnZURpbSh0eXBlSWQpKSB7CisgICAgY2FzZSBzcHY6OkRpbTFEOiAgICAgcmV0dXJuIGdsYTo6RU1zZDFEOworICAgIGNhc2Ugc3B2OjpEaW0yRDogICAgIHJldHVybiBpc0ltYWdlTVModHlwZUlkKSA/IGdsYTo6RU1zZDJETVMgOiBnbGE6OkVNc2QyRDsKKyAgICBjYXNlIHNwdjo6RGltM0Q6ICAgICByZXR1cm4gZ2xhOjpFTXNkM0Q7CisgICAgY2FzZSBzcHY6OkRpbUN1YmU6ICAgcmV0dXJuIGdsYTo6RU1zZEN1YmU7CisgICAgY2FzZSBzcHY6OkRpbVJlY3Q6ICAgcmV0dXJuIGdsYTo6RU1zZFJlY3Q7CisgICAgY2FzZSBzcHY6OkRpbUJ1ZmZlcjogcmV0dXJuIGdsYTo6RU1zZEJ1ZmZlcjsKKyAgICBkZWZhdWx0OgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgidW5rbm93biBzYW1wbGVyIGRpbWVuc2lvbiIsIGdsYTo6RUFUQ29udGludWUpOworICAgICAgICByZXR1cm4gZ2xhOjpFTXNkMkQ7CisgICAgfQorfQorCisvLyBUcmFuc2xhdGUgYSBTUElSLVYgc2FtcGxlciB0eXBlIHRvIHJldHVybiAoc2FtcGxlZCkgdHlwZSBuZWVkZWQgZm9yIGl0IGluIG1ldGFkYXRhLgorZ2xhOjpFTWRTYW1wbGVyQmFzZVR5cGUgU3B2VG9Ub3BUcmFuc2xhdG9yOjpnZXRNZFNhbXBsZXJCYXNlVHlwZShzcHY6OklkIHR5cGVJZCkgY29uc3QKK3sKKyAgICBzcHY6OklkIHNhbXBsZWRUeXBlID0gZ2V0SW1hZ2VTYW1wbGVkVHlwZSh0eXBlSWQpOworICAgIGlmIChjb21tb25NYXBbc2FtcGxlZFR5cGVdLnR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OkZsb2F0VHlJRCkKKyAgICAgICAgcmV0dXJuIGdsYTo6RU1zYkZsb2F0OworICAgIGVsc2UgaWYgKGNvbW1vbk1hcFtzYW1wbGVkVHlwZV0ubWV0YVR5cGUubGF5b3V0ID09IGdsYTo6RU10bFVuc2lnbmVkKQorICAgICAgICByZXR1cm4gZ2xhOjpFTXNiVWludDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBnbGE6OkVNc2JJbnQ7Cit9CisKKy8vIFRyYW5zbGF0ZSBTUElSLVYgZGVzY3JpcHRpb25zIGZvciB0eXBlIG9mIHZhcnlpbmcvaW50ZXJwb2xhdGlvbiBpbnRvIFRvcCBJUidzIGRlc2NyaXB0aW9uLgordm9pZCBTcHZUb1RvcFRyYW5zbGF0b3I6OmdldEludGVycG9sYXRpb25Mb2NhdGlvbk1ldGhvZChzcHY6OklkIGlkLCBnbGE6OkVJbnRlcnBvbGF0aW9uTWV0aG9kJiBtZXRob2QsIGdsYTo6RUludGVycG9sYXRpb25Mb2NhdGlvbiYgbG9jYXRpb24pCit7CisgICAgc3dpdGNoIChjb21tb25NYXBbaWRdLm1ldGFUeXBlLmludGVycG9sYXRpb25NZXRob2QpIHsKKyAgICBjYXNlIHNwdjo6RGVjb3JhdGlvbk5vUGVyc3BlY3RpdmU6IG1ldGhvZCA9IGdsYTo6RUlNTm9wZXJzcGVjdGl2ZTsgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uUGF0Y2g6ICAgICAgICAgbWV0aG9kID0gZ2xhOjpFSU1QYXRjaDsgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBnbGE6OkVJTU5vbmU7ICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvbW1vbk1hcFtpZF0ubWV0YVR5cGUuaW50ZXJwb2xhdGVUbykgeworICAgIGNhc2Ugc3B2OjpEZWNvcmF0aW9uU2FtcGxlOiAgICAgICAgbG9jYXRpb24gPSBnbGE6OkVJTFNhbXBsZTsgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkRlY29yYXRpb25DZW50cm9pZDogICAgICBsb2NhdGlvbiA9IGdsYTo6RUlMQ2VudHJvaWQ7ICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gZ2xhOjpFSUxGcmFnbWVudDsgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gRm9yIG1ha2luZyBhIGdsb2JhbCB0aGF0IHdvbid0IGJlIG9wdGltaXplZCBhd2F5LCBzbyB0aGF0IG1ldGFkYXRhIGNhbiBoYXZlIGEgdHlwZQorLy8gdGhhdCdzIG5vdCBzdGF0aWNhbGx5IGNvbnN1bWVkLgorbGx2bTo6VmFsdWUqIFNwdlRvVG9wVHJhbnNsYXRvcjo6bWFrZVBlcm1hbmVudFR5cGVQcm94eShsbHZtOjpWYWx1ZSogdmFsdWUpCit7CisgICAgLy8gTWFrZSBhIHR5cGUgcHJveHkgdGhhdCB3b24ndCBiZSBvcHRpbWl6ZWQgYXdheSAod2Ugc3RpbGwgd2FudCB0aGUgcmVhbCBsbHZtOjpWYWx1ZSB0byBnZXQgb3B0aW1pemVkIGF3YXkgd2hlbiBpdCBjYW4pCisgICAgbGx2bTo6VHlwZSogdHlwZSA9IHZhbHVlLT5nZXRUeXBlKCk7CisgICAgd2hpbGUgKHR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OlBvaW50ZXJUeUlEKQorICAgICAgICB0eXBlID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6UG9pbnRlclR5cGU+KHR5cGUpLT5nZXRDb250YWluZWRUeXBlKDApOworCisgICAgLy8gRG9uJ3QgaG9vayB0aGlzIGdsb2JhbCBpbnRvIHRoZSBtb2R1bGUsIHRoYXQgd2lsbCBjYXVzZSBMTFZNIHRvIG9wdGltaXplIGl0IGF3YXkuCisgICAgbGx2bTo6VmFsdWUqIHR5cGVQcm94eSA9IG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZSh0eXBlLCB0cnVlLCBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6RXh0ZXJuYWxMaW5rYWdlLCAwLCB2YWx1ZS0+Z2V0TmFtZSgpICsgIl90eXBlUHJveHkiKTsKKyAgICBtYW5hZ2VyLmFkZFRvRnJlZUxpc3QodHlwZVByb3h5KTsKKworICAgIHJldHVybiB0eXBlUHJveHk7Cit9CisKKy8vIENyZWF0ZSBhbGwgdGhlIG1ldGFkYXRhIG5lZWRlZCB0byBiYWNrIHVwIGEgdW5pZm9ybSBvciBibG9jay4KK2xsdm06Ok1ETm9kZSogU3B2VG9Ub3BUcmFuc2xhdG9yOjpkZWNsYXJlVW5pZm9ybU1ldGFkYXRhKHNwdjo6SWQgcmVzdWx0SWQpCit7CisgICAgbGx2bTo6TUROb2RlKiBtZDsKKworICAgIGdsYTo6RU1kSW5wdXRPdXRwdXQgaW9UeXBlID0gZ2V0TWRRdWFsaWZpZXIocmVzdWx0SWQpOworICAgIHN3aXRjaCAoaW9UeXBlKSB7CisgICAgY2FzZSBnbGE6OkVNaW9EZWZhdWx0VW5pZm9ybToKKyAgICAgICAgbWQgPSBkZWNsYXJlTWREZWZhdWx0VW5pZm9ybShyZXN1bHRJZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZ2xhOjpFTWlvVW5pZm9ybUJsb2NrTWVtYmVyOgorICAgIGNhc2UgZ2xhOjpFTWlvQnVmZmVyQmxvY2tNZW1iZXI6CisgICAgY2FzZSBnbGE6OkVNaW9CdWZmZXJCbG9ja01lbWJlckFycmF5ZWQ6CisgICAgICAgIG1kID0gZGVjbGFyZU1kVW5pZm9ybUJsb2NrKGlvVHlwZSwgcmVzdWx0SWQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbWQ7Cit9CisKKy8vIE1ha2UgYSAhZ2xhLnVuaWZvcm0gbm9kZSwgYXMgcGVyIG1ldGFkYXRhLmgsIGZvciBhIGRlZmF1bHQgdW5pZm9ybQorLy8gQXNzdW1lcyB0aGUgcmVzdWx0SWQgaXMgZm9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24sIG1lYW5pbmcgdGhlIHR5cGVJZAorLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgdHlwZS4KK2xsdm06Ok1ETm9kZSogU3B2VG9Ub3BUcmFuc2xhdG9yOjpkZWNsYXJlTWREZWZhdWx0VW5pZm9ybShzcHY6OklkIHJlc3VsdElkKQoreworICAgIC8vIERlZmVyZW5jZSB0aGUgdHlwZQorICAgIHNwdjo6SWQgdHlwZUlkID0gZGVyZWZlcmVuY2VUeXBlSWQoY29tbW9uTWFwW3Jlc3VsdElkXS50eXBlSWQpOworICAgIHR5cGVJZCA9IGdldEFycmF5RWxlbWVudFR5cGVJZCh0eXBlSWQpOworICAgIGxsdm06Ok1ETm9kZSogc2FtcGxlck1kID0gbWFrZU1kU2FtcGxlcih0eXBlSWQsIGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUpOworCisgICAgLy8gQ3JlYXRlIGhpZXJhcmNoaWNhbCB0eXBlIGluZm9ybWF0aW9uIGlmIGl0J3MgYW4gYWdncmVnYXRlCisgICAgZ2xhOjpFTWRUeXBlTGF5b3V0IGxheW91dCA9IGNvbW1vbk1hcFt0eXBlSWRdLm1ldGFUeXBlLmxheW91dDsKKyAgICBsbHZtOjpNRE5vZGUqIHN0cnVjdHVyZSA9IDA7CisgICAgaWYgKGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OlN0cnVjdFR5SUQpCisgICAgICAgIHN0cnVjdHVyZSA9IGRlY2xhcmVNZFR5cGUodHlwZUlkLCBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlKTsKKworICAgIC8vIE1ha2UgdGhlIG1haW4gbm9kZQorICAgIHJldHVybiBtZXRhZGF0YS5tYWtlTWRJbnB1dE91dHB1dChOb25OdWxsTmFtZShjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLm5hbWUpLCBnbGE6OlVuaWZvcm1MaXN0TWROYW1lLCBnbGE6OkVNaW9EZWZhdWx0VW5pZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVBlcm1hbmVudFR5cGVQcm94eShjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LCBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLnByZWNpc2lvbiwgY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5sb2NhdGlvbiwgc2FtcGxlck1kLCBzdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmJ1aWx0SW4sIHBhY2tTZXRCaW5kaW5nKGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUpKTsKK30KKworLy8gTWFrZSBhIG1ldGFkYXRhIGRlc2NyaXB0aW9uIG9mIGEgc2FtcGxlcidzIHR5cGUuCitsbHZtOjpNRE5vZGUqIFNwdlRvVG9wVHJhbnNsYXRvcjo6bWFrZU1kU2FtcGxlcihzcHY6OklkIHR5cGVJZCwgbGx2bTo6VmFsdWUqIHZhbHVlKQoreworICAgIC8vIEZpZ3VyZSBvdXQgc2FtcGxlciBpbmZvcm1hdGlvbiwgaWYgaXQncyBhIHNhbXBsZXIKKyAgICBpZiAoY29tbW9uTWFwW3R5cGVJZF0ubWV0YVR5cGUubGF5b3V0ICE9IGdsYTo6RU10bFNhbXBsZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgbGx2bTo6VmFsdWUqIHR5cGVQcm94eSA9IDA7CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgLy8gRG9uJ3QgaG9vayB0aGlzIGdsb2JhbCBpbnRvIHRoZSBtb2R1bGUsIHRoYXQgd2lsbCBjYXVzZSBMTFZNIHRvIG9wdGltaXplIGl0IGF3YXkuCisgICAgICAgIHR5cGVQcm94eSA9IG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShjb21tb25NYXBbdHlwZUlkXS50eXBlLCB0cnVlLCBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6RXh0ZXJuYWxMaW5rYWdlLCAwLCAic2FtcGxlcl90eXBlUHJveHkiKTsKKyAgICAgICAgbWFuYWdlci5hZGRUb0ZyZWVMaXN0KHR5cGVQcm94eSk7CisgICAgfSBlbHNlCisgICAgICAgIHR5cGVQcm94eSA9IG1ha2VQZXJtYW5lbnRUeXBlUHJveHkodmFsdWUpOworCisgICAgcmV0dXJuIG1ldGFkYXRhLm1ha2VNZFNhbXBsZXIoZ2V0TWRTYW1wbGVyKHR5cGVJZCksIHR5cGVQcm94eSwgZ2V0TWRTYW1wbGVyRGltKHR5cGVJZCksIGlzSW1hZ2VBcnJheWVkKHR5cGVJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbWFnZURlcHRoKHR5cGVJZCksIGdldE1kU2FtcGxlckJhc2VUeXBlKHR5cGVJZCkpOworfQorCisvLyBNYWtlIGEgIWdsYS51bmlmb3JtIG5vZGUsIGFzIHBlciBtZXRhZGF0YS5oLCBmb3IgYSB1bmlmb3JtIGJsb2NrIG9yIGJ1ZmZlciBibG9jaworLy8gKGRlcGVuZGluZyBvbiBpb1R5cGUpLgorLy8gQXNzdW1lcyB0aGUgcmVzdWx0SWQgaXMgZm9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24sIG1lYW5pbmcgdGhlIHR5cGVJZAorLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgdHlwZS4KK2xsdm06Ok1ETm9kZSogU3B2VG9Ub3BUcmFuc2xhdG9yOjpkZWNsYXJlTWRVbmlmb3JtQmxvY2soZ2xhOjpFTWRJbnB1dE91dHB1dCBpb1R5cGUsIHNwdjo6SWQgcmVzdWx0SWQpCit7CisgICAgLy8gRGVmZXJlbmNlIHRoZSB0eXBlCisgICAgc3B2OjpJZCB0eXBlSWQgPSBkZXJlZmVyZW5jZVR5cGVJZChjb21tb25NYXBbcmVzdWx0SWRdLnR5cGVJZCk7CisKKyAgICAvLyBNYWtlIGhpZXJhY2hpY2FsIHR5cGUgaW5mb3JtYXRpb24KKyAgICBsbHZtOjpNRE5vZGUqIGJsb2NrID0gZGVjbGFyZU1kVHlwZSh0eXBlSWQsIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUpOworCisgICAgLy8gTWFrZSB0aGUgbWFpbiBub2RlCisgICAgcmV0dXJuIG1ldGFkYXRhLm1ha2VNZElucHV0T3V0cHV0KE5vbk51bGxOYW1lKGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUubmFtZSksIGdsYTo6VW5pZm9ybUxpc3RNZE5hbWUsIGlvVHlwZSwgbWFrZVBlcm1hbmVudFR5cGVQcm94eShjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uTWFwW3R5cGVJZF0ubWV0YVR5cGUubGF5b3V0LCBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLnByZWNpc2lvbiwgY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5sb2NhdGlvbiwgMCwgYmxvY2ssIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbGE6OkVtYk5vbmUsIHBhY2tTZXRCaW5kaW5nKGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUpKTsKK30KKworLy8gTWFrZSBhICFhZ2dyZWdhdGUgbm9kZSBmb3IgdGhlIG9iamVjdCwgYXMgcGVyIG1ldGFkYXRhLmgsIGNhbGxpbmcgZGVjbGFyZU1kVHlwZSB3aXRoIHRoZSB0eXBlCisvLyB0byByZWN1cnNpdmVseSBmaW5pc2ggZm9yIGhpZXJhcmNoaWNhbCB0eXBlcy4KK2xsdm06Ok1ETm9kZSogU3B2VG9Ub3BUcmFuc2xhdG9yOjpkZWNsYXJlTWRUeXBlKHNwdjo6SWQgdHlwZUlkLCBNZXRhVHlwZSYgbWV0YVR5cGUpCit7CisgICAgLy8gaWYgY29udGFpbmVkIHR5cGUgaXMgYW4gYXJyYXksIHdlIGFjdHVhbGx5IG5lZWQgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzCisgICAgLy8gKHdlIG5lZWQgbWV0YWRhdGEgZm9yIHRoZSBlbGVtZW50IHR5cGUsIG5vdCB0aGUgYXJyYXkgaXRzZWxmKQorICAgIHR5cGVJZCA9IGdldEFycmF5RWxlbWVudFR5cGVJZCh0eXBlSWQpOworCisgICAgLy8gRmlndXJlIG91dCBzYW1wbGVyIGluZm9ybWF0aW9uIGlmIGl0J3MgYSBzYW1wbGVyCisgICAgbGx2bTo6TUROb2RlKiBzYW1wbGVyTWQgPSBtYWtlTWRTYW1wbGVyKHR5cGVJZCwgMCk7CisgICAgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiBtZEFyZ3M7CisKKyAgICAvLyBuYW1lIG9mIGFnZ3JlZ2F0ZSwgaWYgYW4gYWdncmVnYXRlIChzdHJ1Y3Qgb3IgYmxvY2spCisgICAgZ2xhOjpFTWRUeXBlTGF5b3V0IHR5cGVMYXlvdXQ7CisgICAgaWYgKGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OlN0cnVjdFR5SUQpIHsKKyAgICAgICAgbWRBcmdzLnB1c2hfYmFjayhsbHZtOjpNRFN0cmluZzo6Z2V0KGNvbnRleHQsIE5vbk51bGxOYW1lKGNvbW1vbk1hcFt0eXBlSWRdLm1ldGFUeXBlLm5hbWUpKSk7CisgICAgICAgIHR5cGVMYXlvdXQgPSBjb21tb25NYXBbdHlwZUlkXS5tZXRhVHlwZS5sYXlvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWRBcmdzLnB1c2hfYmFjayhsbHZtOjpNRFN0cmluZzo6Z2V0KGNvbnRleHQsICIiKSk7CisgICAgICAgIHR5cGVMYXlvdXQgPSBtZXRhVHlwZS5sYXlvdXQ7CisgICAgfQorCisgICAgLy8gIXR5cGVMYXlvdXQKKyAgICBtZEFyZ3MucHVzaF9iYWNrKG1ldGFkYXRhLm1ha2VNZFR5cGVMYXlvdXQodHlwZUxheW91dCwgbWV0YVR5cGUucHJlY2lzaW9uLCBtZXRhVHlwZS5sb2NhdGlvbiwgc2FtcGxlck1kLCAtMSwgbWV0YVR5cGUuYnVpbHRJbiwgcGFja1NldEJpbmRpbmcobWV0YVR5cGUpKSk7CisKKyAgICBpZiAoY29tbW9uTWFwW3R5cGVJZF0udHlwZS0+Z2V0VHlwZUlEKCkgPT0gbGx2bTo6VHlwZTo6U3RydWN0VHlJRCkgeworICAgICAgICBpbnQgbnVtTWVtYmVycyA9IChpbnQpY29tbW9uTWFwW3R5cGVJZF0udHlwZS0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggbWV0YWRhdGEsIGlmIG5vdCBlbm91Z2ggbmFtZS9kZWNvcmF0aW9ucyBjcmVhdGVkIGl0CisgICAgICAgIGJ1bXBNZW1iZXJNZXRhRGF0YShjb21tb25NYXBbdHlwZUlkXS5tZW1iZXJNZXRhRGF0YSwgbnVtTWVtYmVycyAtIDEpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPE1ldGFUeXBlPiYgbWVtYmVyTWV0YURhdGEgPSAqY29tbW9uTWFwW3R5cGVJZF0ubWVtYmVyTWV0YURhdGE7CisgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgbnVtTWVtYmVyczsgKyt0KSB7CisgICAgICAgICAgICBzcHY6OklkIGNvbnRhaW5lZFR5cGVJZCA9IGdldFN0cnVjdE1lbWJlclR5cGVJZCh0eXBlSWQsIHQpOworCisgICAgICAgICAgICAvLyBuYW1lIG9mIG1lbWJlcgorICAgICAgICAgICAgbWRBcmdzLnB1c2hfYmFjayhsbHZtOjpNRFN0cmluZzo6Z2V0KGNvbnRleHQsIG1lbWJlck1ldGFEYXRhW3RdLm5hbWUpKTsKKworICAgICAgICAgICAgLy8gdHlwZSBvZiBtZW1iZXIKKyAgICAgICAgICAgIGxsdm06Ok1ETm9kZSogbWRUeXBlID0gZGVjbGFyZU1kVHlwZShjb250YWluZWRUeXBlSWQsIG1lbWJlck1ldGFEYXRhW3RdKTsKKyAgICAgICAgICAgIG1kQXJncy5wdXNoX2JhY2sobWRUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsbHZtOjpNRE5vZGU6OmdldChjb250ZXh0LCBtZEFyZ3MpOworfQorCisvLyBNYWtlIG1ldGFkYXRhIG5vZGUgZm9yIGVpdGhlciBhbiAnaW4nIG9yIGFuICdvdXQnIHZhcmlhYmxlL2Jsb2NrLgorLy8gQXNzdW1lcyB0aGUgcmVzdWx0SWQgaXMgZm9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24sIG1lYW5pbmcgdGhlIHR5cGVJZAorLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgdHlwZS4KK2xsdm06Ok1ETm9kZSogU3B2VG9Ub3BUcmFuc2xhdG9yOjptYWtlSW5wdXRPdXRwdXRNZXRhZGF0YShzcHY6OklkIHJlc3VsdElkLCBpbnQgc2xvdCwgY29uc3QgY2hhcioga2luZCkKK3sKKyAgICAvLyBEZWZlcmVuY2UgdGhlIHR5cGUKKyAgICBzcHY6OklkIHR5cGVJZCA9IGRlcmVmZXJlbmNlVHlwZUlkKGNvbW1vbk1hcFtyZXN1bHRJZF0udHlwZUlkKTsKKyAgICB0eXBlSWQgPSBnZXRBcnJheUVsZW1lbnRUeXBlSWQodHlwZUlkKTsKKworICAgIGxsdm06Ok1ETm9kZSogYWdncmVnYXRlID0gMDsKKyAgICBpZiAoY29tbW9uTWFwW3R5cGVJZF0udHlwZS0+Z2V0VHlwZUlEKCkgPT0gbGx2bTo6VHlwZTo6U3RydWN0VHlJRCkgeworICAgICAgICAvLyBNYWtlIGhpZXJhcmNoaWNhbCB0eXBlIGluZm9ybWF0aW9uLCBmb3IgdGhlIGRlcmVmZXJlbmNlZCB0eXBlCisgICAgICAgIGFnZ3JlZ2F0ZSA9IGRlY2xhcmVNZFR5cGUodHlwZUlkLCBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlKTsKKyAgICB9CisKKyAgICBnbGE6OkVJbnRlcnBvbGF0aW9uTWV0aG9kIGludGVycE1ldGhvZCA9IGdsYTo6RUlNTm9uZTsKKyAgICBnbGE6OkVJbnRlcnBvbGF0aW9uTG9jYXRpb24gaW50ZXJwTG9jYXRpb24gPSBnbGE6OkVJTEZyYWdtZW50OworICAgIGdldEludGVycG9sYXRpb25Mb2NhdGlvbk1ldGhvZChyZXN1bHRJZCwgaW50ZXJwTWV0aG9kLCBpbnRlcnBMb2NhdGlvbik7CisKKyAgICByZXR1cm4gbWV0YWRhdGEubWFrZU1kSW5wdXRPdXRwdXQoTm9uTnVsbE5hbWUoY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5uYW1lKSwga2luZCwgZ2V0TWRRdWFsaWZpZXIocmVzdWx0SWQpLCBtYWtlUGVybWFuZW50VHlwZVByb3h5KGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25NYXBbdHlwZUlkXS5tZXRhVHlwZS5sYXlvdXQsIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUucHJlY2lzaW9uLCBzbG90LCAwLCBhZ2dyZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsYTo6TWFrZUludGVycG9sYXRpb25Nb2RlKGludGVycE1ldGhvZCwgaW50ZXJwTG9jYXRpb24pLCBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmJ1aWx0SW4pOworfQorCisvLyBNYWtlIG1ldGFkYXRhIG5vZGUgZm9yIGFuICdvdXQnIHZhcmlhYmxlL2Jsb2NrIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgCisvLyBvdXRwdXQtdmFyaWFibGUgY2FjaGUgaW4gdGhlIGdsYSBidWlsZGVyLgordm9pZCBTcHZUb1RvcFRyYW5zbGF0b3I6Om1ha2VPdXRwdXRNZXRhZGF0YShzcHY6OklkIHJlc3VsdElkLCBpbnQgc2xvdCwgaW50IG51bVNsb3RzKQoreworICAgIGxsdm06Ok1ETm9kZSogbWQgPSBtYWtlSW5wdXRPdXRwdXRNZXRhZGF0YShyZXN1bHRJZCwgc2xvdCwgZ2xhOjpPdXRwdXRMaXN0TWROYW1lKTsKKworICAgIGlmIChjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLmludmFyaWFudCkKKyAgICAgICAgbW9kdWxlLT5nZXRPckluc2VydE5hbWVkTWV0YWRhdGEoZ2xhOjpJbnZhcmlhbnRMaXN0TWROYW1lKS0+YWRkT3BlcmFuZChtZCk7Cit9CisKK2xsdm06Ok1ETm9kZSogU3B2VG9Ub3BUcmFuc2xhdG9yOjptYWtlSW5wdXRNZXRhZGF0YShzcHY6OklkIHJlc3VsdElkLCBpbnQgc2xvdCkKK3sKKyAgICBsbHZtOjpNRE5vZGUqIG1kTm9kZSA9IG1ha2VJbnB1dE91dHB1dE1ldGFkYXRhKHJlc3VsdElkLCBzbG90LCBnbGE6OklucHV0TGlzdE1kTmFtZSk7CisKKyAgICByZXR1cm4gbWROb2RlOworfQorCit2b2lkIFNwdlRvVG9wVHJhbnNsYXRvcjo6ZGVjb2RlUmVzdWx0KGJvb2wgdHlwZSwgc3B2OjpJZCYgdHlwZUlkLCBzcHY6OklkJiByZXN1bHRJZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25TdGFydCA9IHdvcmQgLSAxOworCisgICAgaWYgKHR5cGUpCisgICAgICAgIHR5cGVJZCA9IHNwaXJ2W3dvcmQrK107CisgICAgCisgICAgcmVzdWx0SWQgPSBzcGlydlt3b3JkKytdOworCisgICAgaWYgKHR5cGUgJiYgY29tbW9uTWFwW3Jlc3VsdElkXS50eXBlSWQgPT0gMCkKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS50eXBlSWQgPSB0eXBlSWQ7CisKKyAgICAvLyBtYXAgaW5zdHJ1Y3Rpb24gZm9yIGZ1dHVyZSByZWZlcmVuY2UKKyAgICBjb21tb25NYXBbcmVzdWx0SWRdLmluc3RydWN0aW9uSW5kZXggPSBpbnN0cnVjdGlvblN0YXJ0OworfQorCitjb25zdCBjaGFyKiBTcHZUb1RvcFRyYW5zbGF0b3I6OmZpbmRBTmFtZShzcHY6OklkIGNob2ljZTEsIHNwdjo6SWQgY2hvaWNlMikKK3sKKyAgICBpZiAoY29tbW9uTWFwW2Nob2ljZTFdLm1ldGFUeXBlLm5hbWUpCisgICAgICAgIHJldHVybiBjb21tb25NYXBbY2hvaWNlMV0ubWV0YVR5cGUubmFtZTsKKyAgICBlbHNlIGlmIChjaG9pY2UyICE9IDAgJiYgY29tbW9uTWFwW2Nob2ljZTJdLm1ldGFUeXBlLm5hbWUpCisgICAgICAgIHJldHVybiBjb21tb25NYXBbY2hvaWNlMV0ubWV0YVR5cGUubmFtZTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gTG9vayBhaGVhZCB0byBzZWUgaWYgd2UncmUgaW4gYSBwb3RlbnRpYWwgY2hhaW4gb2YgaW5zdHJ1Y3Rpb25zIGxlYWRpbmcgCisgICAgICAgIC8vIHRvIGEgc3RvcmUgdGhhdCBoYXMgdGhlIHJlc3VsdCBuYW1lZC4gIFRoaXMgaXMganVzdCBhbiBhcHByb3hpbWF0aW9uLgorICAgICAgICBzcHY6OklkIGNoYWluID0gY2hvaWNlMTsKKyAgICAgICAgaW50IHRyaWFsSW5zdCA9IG5leHRJbnN0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodHJpYWxJbnN0ICsgNSA+PSAoaW50KXNwaXJ2LnNpemUoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNwdjo6T3Agb3Bjb2RlID0gR2V0T3BDb2RlKHNwaXJ2W3RyaWFsSW5zdF0pOworICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFN0b3JlOgorICAgICAgICAgICAgICAgIGlmIChzcGlydlt0cmlhbEluc3QgKyAyXSA9PSBjaGFpbiB8fAorICAgICAgICAgICAgICAgICAgICAoY2hhaW4gPT0gMCAmJiBjb21tb25NYXBbc3BpcnZbdHJpYWxJbnN0ICsgMV1dLm1ldGFUeXBlLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICBjaGFpbiA9IHNwaXJ2W3RyaWFsSW5zdCArIDFdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyB1cCBhZ2FpbnN0IHNvbWV0aGluZyBub3Qgd29ydGggY3Jvc3Npbmc/CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BGdW5jdGlvbkVuZDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFN3aXRjaDoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFJldHVybjoKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFJldHVyblZhbHVlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wVW5yZWFjaGFibGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3b3J0aCBpZ25vcmluZz8KKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcExvb3BNZXJnZToKKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcFNlbGVjdGlvbk1lcmdlOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQnJhbmNoOgorICAgICAgICAgICAgY2FzZSBzcHY6Ok9wTGFiZWw6CisgICAgICAgICAgICBjYXNlIHNwdjo6T3BLaWxsOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBwcm9wYWdhdGUgYWNjZXNzLWNoYWluIGJhc2UgbmFtZSBpbnRvIHBvaW50ZXIgbmFtZT8KKyAgICAgICAgICAgIGNhc2Ugc3B2OjpPcEFjY2Vzc0NoYWluOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwdjo6SWQgYmFzZUlkID0gc3BpcnZbdHJpYWxJbnN0ICsgM107CisgICAgICAgICAgICAgICAgc3B2OjpJZCByZXN1bHRJZCA9IHNwaXJ2W3RyaWFsSW5zdCArIDJdOworICAgICAgICAgICAgICAgIGlmIChjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLm5hbWUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5uYW1lID0gY29tbW9uTWFwW2Jhc2VJZF0ubWV0YVR5cGUubmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRG9lcyB0aGlzIGluc3RydWN0aW9uIGNvbnN1bWUgaXQgYnV0IG5vdCBoYXZlIGEgcmVzdWx0PworICAgICAgICAgICAgY2FzZSBzcHY6Ok9wQnJhbmNoQ29uZGl0aW9uYWw6ICAvLyBwcm9iYWJseSAiPzoiCisgICAgICAgICAgICAgICAgaWYgKHNwaXJ2W3RyaWFsSW5zdCArIDFdID09IGNoYWluKQorICAgICAgICAgICAgICAgICAgICBjaGFpbiA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gaG9wZWZ1bGx5IGEgbm9ybWFsIGRhdGEtZmxvdyBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCB3aGVyZSB0aGUgaW5zdHJ1Y3Rpb24gaGFzIHJlc3VsdAorICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIHNwaXJ2W3RyaWFsSW5zdCArIDJdIDwgbnVtSWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG9wID0gMzsgb3AgPCBHZXRXb3JkQ291bnQoc3BpcnZbdHJpYWxJbnN0XSk7ICsrb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGlydlt0cmlhbEluc3QgKyBvcF0gPT0gY2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbiA9IHNwaXJ2W3RyaWFsSW5zdCArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGNvbW1vbk1hcFtjaGFpbl0ubWV0YVR5cGUubmFtZTsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICB0cmlhbEluc3QgKz0gR2V0V29yZENvdW50KHNwaXJ2W3RyaWFsSW5zdF0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3B2VG9Ub3BUcmFuc2xhdG9yOjp0cmFuc2xhdGVJbnN0cnVjdGlvbihzcHY6Ok9wIG9wQ29kZSwgaW50IG51bU9wZXJhbmRzKQoreworICAgIHNwdjo6SWQgcmVzdWx0SWQ7CisgICAgc3B2OjpJZCB0eXBlSWQ7CisKKyAgICBzd2l0Y2ggKG9wQ29kZSkgeworICAgIGNhc2Ugc3B2OjpPcFNvdXJjZToKKyAgICB7CisgICAgICAgIHNwdjo6U291cmNlTGFuZ3VhZ2Ugc291cmNlID0gKHNwdjo6U291cmNlTGFuZ3VhZ2Upc3BpcnZbd29yZCsrXTsKKyAgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZVZlcnNpb24gPSBzcGlydlt3b3JkKytdOworICAgICAgICBtYW5hZ2VyLnNldFZlcnNpb24oc291cmNlVmVyc2lvbik7CisgICAgICAgIHN3aXRjaCAoc291cmNlKSB7CisgICAgICAgIGNhc2Ugc3B2OjpTb3VyY2VMYW5ndWFnZUVTU0w6CisgICAgICAgICAgICBtYW5hZ2VyLnNldFByb2ZpbGUoRUVzUHJvZmlsZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzcHY6OlNvdXJjZUxhbmd1YWdlR0xTTDoKKyAgICAgICAgICAgIG1hbmFnZXIuc2V0UHJvZmlsZShFQ29yZVByb2ZpbGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpTb3VyY2VMYW5ndWFnZU9wZW5DTF9DOgorICAgICAgICBjYXNlIHNwdjo6U291cmNlTGFuZ3VhZ2VPcGVuQ0xfQ1BQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIm5vbi1HTCBwcm9maWxlIiwgZ2xhOjpFQVRDb250aW51ZSk7CisgICAgICAgICAgICBtYW5hZ2VyLnNldFByb2ZpbGUoRUNvcmVQcm9maWxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIHNwdjo6T3BTb3VyY2VFeHRlbnNpb246CisgICAgICAgIG1hbmFnZXIuYWRkRXh0ZW5zaW9uKChjb25zdCBjaGFyKikmc3BpcnZbd29yZF0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BFeHRJbnN0SW1wb3J0OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BNZW1vcnlNb2RlbDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wRW50cnlQb2ludDoKKyAgICB7CisgICAgICAgIHNwdjo6RXhlY3V0aW9uTW9kZWwgbW9kZWwgPSAoc3B2OjpFeGVjdXRpb25Nb2RlbClzcGlydlt3b3JkKytdOworICAgICAgICBzcHY6OklkIGVudHJ5ID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgc2V0RW50cnlQb2ludChtb2RlbCwgZW50cnkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wRXhlY3V0aW9uTW9kZToKKyAgICB7CisgICAgICAgIHNwdjo6SWQgZW50cnlQb2ludCA9IChzcHY6OkV4ZWN1dGlvbk1vZGVsKXNwaXJ2W3dvcmQrK107CisgICAgICAgIHNwdjo6RXhlY3V0aW9uTW9kZSBtb2RlID0gKHNwdjo6RXhlY3V0aW9uTW9kZSlzcGlydlt3b3JkKytdOworICAgICAgICBzZXRFeGVjdXRpb25Nb2RlKGVudHJ5UG9pbnQsIG1vZGUpOworICAgICAgICBpZiAobnVtT3BlcmFuZHMgPiAyKQorICAgICAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIk9wRXhlY3V0aW9uTW9kZSB3aXRoIG1vcmUgdGhhbiB0d28gb3BlcmFuZHMiLCBnbGE6OkVBVENvbnRpbnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Ugc3B2OjpPcENhcGFiaWxpdHk6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFR5cGVWb2lkOgorICAgIGNhc2Ugc3B2OjpPcFR5cGVCb29sOgorICAgIGNhc2Ugc3B2OjpPcFR5cGVJbnQ6CisgICAgY2FzZSBzcHY6Ok9wVHlwZUZsb2F0OgorICAgIGNhc2Ugc3B2OjpPcFR5cGVWZWN0b3I6CisgICAgY2FzZSBzcHY6Ok9wVHlwZU1hdHJpeDoKKyAgICBjYXNlIHNwdjo6T3BUeXBlSW1hZ2U6CisgICAgY2FzZSBzcHY6Ok9wVHlwZVNhbXBsZXI6CisgICAgY2FzZSBzcHY6Ok9wVHlwZVNhbXBsZWRJbWFnZToKKyAgICBjYXNlIHNwdjo6T3BUeXBlQXJyYXk6CisgICAgY2FzZSBzcHY6Ok9wVHlwZVJ1bnRpbWVBcnJheToKKyAgICBjYXNlIHNwdjo6T3BUeXBlU3RydWN0OgorICAgIGNhc2Ugc3B2OjpPcFR5cGVQb2ludGVyOgorICAgIGNhc2Ugc3B2OjpPcFR5cGVGdW5jdGlvbjoKKyAgICAgICAgZGVjb2RlUmVzdWx0KGZhbHNlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgbnVtT3BlcmFuZHMgLT0gMTsKKyAgICAgICAgYWRkVHlwZShvcENvZGUsIHJlc3VsdElkLCBudW1PcGVyYW5kcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcENvbnN0YW50VHJ1ZToKKyAgICBjYXNlIHNwdjo6T3BDb25zdGFudEZhbHNlOgorICAgIGNhc2Ugc3B2OjpPcENvbnN0YW50OgorICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIG51bU9wZXJhbmRzIC09IDI7CisgICAgICAgIGFkZENvbnN0YW50KG9wQ29kZSwgcmVzdWx0SWQsIHR5cGVJZCwgbnVtT3BlcmFuZHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BDb25zdGFudENvbXBvc2l0ZToKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBudW1PcGVyYW5kcyAtPSAyOworICAgICAgICBhZGRDb25zdGFudEFnZ3JlZ2F0ZShyZXN1bHRJZCwgdHlwZUlkLCBudW1PcGVyYW5kcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFZhcmlhYmxlOgorICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIG51bU9wZXJhbmRzIC09IDI7CisgICAgICAgIGFkZFZhcmlhYmxlKHJlc3VsdElkLCB0eXBlSWQsIChzcHY6OlN0b3JhZ2VDbGFzcylzcGlydlt3b3JkKytdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wRGVjb3JhdGU6CisgICAgeworICAgICAgICBzcHY6OklkIGlkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgc3B2OjpEZWNvcmF0aW9uIGRlY29yYXRpb24gPSAoc3B2OjpEZWNvcmF0aW9uKXNwaXJ2W3dvcmQrK107CisgICAgICAgIGFkZERlY29yYXRpb24oaWQsIGRlY29yYXRpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wTWVtYmVyRGVjb3JhdGU6CisgICAgeworICAgICAgICBzcHY6OklkIHN0cnVjdFR5cGVJZCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIHVuc2lnbmVkIGludCBtZW1iZXIgPSBzcGlydlt3b3JkKytdOworICAgICAgICBzcHY6OkRlY29yYXRpb24gZGVjb3JhdGlvbiA9IChzcHY6OkRlY29yYXRpb24pc3BpcnZbd29yZCsrXTsKKyAgICAgICAgYWRkTWVtYmVyRGVjb3JhdGlvbihzdHJ1Y3RUeXBlSWQsIG1lbWJlciwgZGVjb3JhdGlvbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIHNwdjo6T3BOYW1lOgorICAgIHsKKyAgICAgICAgc3B2OjpJZCBpZCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIGNvbW1vbk1hcFtpZF0ubWV0YVR5cGUubmFtZSA9IChjb25zdCBjaGFyICopJnNwaXJ2W3dvcmRdOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wTWVtYmVyTmFtZToKKyAgICB7CisgICAgICAgIHNwdjo6SWQgaWQgPSBzcGlydlt3b3JkKytdOworICAgICAgICB1bnNpZ25lZCBpbnQgbWVtYmVyTnVtYmVyID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IChjb25zdCBjaGFyICopJnNwaXJ2W3dvcmRdOworICAgICAgICBidW1wTWVtYmVyTWV0YURhdGEoY29tbW9uTWFwW2lkXS5tZW1iZXJNZXRhRGF0YSwgbWVtYmVyTnVtYmVyKTsKKyAgICAgICAgKCpjb21tb25NYXBbaWRdLm1lbWJlck1ldGFEYXRhKVttZW1iZXJOdW1iZXJdLm5hbWUgPSBuYW1lOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIHNwdjo6T3BTdHJpbmc6CisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJPcFN0cmluZyIsIGdsYTo6RUFUQ29udGludWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BMaW5lOgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiT3BMaW5lIiwgZ2xhOjpFQVRDb250aW51ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6Ok9wTG9hZDoKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gZ2xhQnVpbGRlci0+Y3JlYXRlTG9hZChjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BTdG9yZToKKyAgICB7CisgICAgICAgIGxsdm06OlZhbHVlKiBsdmFsdWUgPSBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWU7CisgICAgICAgIGxsdm06OlZhbHVlKiBydmFsdWUgPSBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWU7CisgICAgICAgIGdsYUJ1aWxkZXItPmNyZWF0ZVN0b3JlKHJ2YWx1ZSwgbHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBzcHY6Ok9wRnVuY3Rpb246CisgICAgICAgIGRlY29kZVJlc3VsdCh0cnVlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgaGFuZGxlT3BGdW5jdGlvbih0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgY3VycmVudEFyZyA9IGNvbW1vbk1hcFtjdXJyZW50RnVuY3Rpb25dLmZ1bmN0aW9uLT5hcmdfYmVnaW4oKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wRnVuY3Rpb25QYXJhbWV0ZXI6CisgICAgICAgIGRlY29kZVJlc3VsdCh0cnVlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9ICYoKmN1cnJlbnRBcmcpOworICAgICAgICArK2N1cnJlbnRBcmc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEZ1bmN0aW9uRW5kOgorICAgICAgICBnbGFCdWlsZGVyLT5sZWF2ZUZ1bmN0aW9uKGluRW50cnlQb2ludCgpKTsKKyAgICAgICAgY3VycmVudEZ1bmN0aW9uID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6T3BJQWRkOgorICAgIGNhc2Ugc3B2OjpPcEZBZGQ6CisgICAgY2FzZSBzcHY6Ok9wSVN1YjoKKyAgICBjYXNlIHNwdjo6T3BGU3ViOgorICAgIGNhc2Ugc3B2OjpPcElNdWw6CisgICAgY2FzZSBzcHY6Ok9wRk11bDoKKyAgICBjYXNlIHNwdjo6T3BVRGl2OgorICAgIGNhc2Ugc3B2OjpPcFNEaXY6CisgICAgY2FzZSBzcHY6Ok9wRkRpdjoKKyAgICBjYXNlIHNwdjo6T3BVTW9kOgorICAgIGNhc2Ugc3B2OjpPcFNSZW06CisgICAgY2FzZSBzcHY6Ok9wU01vZDoKKyAgICBjYXNlIHNwdjo6T3BGUmVtOgorICAgIGNhc2Ugc3B2OjpPcEZNb2Q6CisgICAgY2FzZSBzcHY6Ok9wVmVjdG9yVGltZXNTY2FsYXI6CisgICAgY2FzZSBzcHY6Ok9wTWF0cml4VGltZXNTY2FsYXI6CisgICAgY2FzZSBzcHY6Ok9wVmVjdG9yVGltZXNNYXRyaXg6CisgICAgY2FzZSBzcHY6Ok9wTWF0cml4VGltZXNWZWN0b3I6CisgICAgY2FzZSBzcHY6Ok9wTWF0cml4VGltZXNNYXRyaXg6CisgICAgY2FzZSBzcHY6Ok9wT3V0ZXJQcm9kdWN0OgorICAgIGNhc2Ugc3B2OjpPcFNoaWZ0UmlnaHRMb2dpY2FsOgorICAgIGNhc2Ugc3B2OjpPcFNoaWZ0UmlnaHRBcml0aG1ldGljOgorICAgIGNhc2Ugc3B2OjpPcFNoaWZ0TGVmdExvZ2ljYWw6CisgICAgY2FzZSBzcHY6Ok9wTG9naWNhbE9yOgorICAgIGNhc2Ugc3B2OjpPcExvZ2ljYWxOb3RFcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BMb2dpY2FsQW5kOgorICAgIGNhc2Ugc3B2OjpPcEJpdHdpc2VPcjoKKyAgICBjYXNlIHNwdjo6T3BCaXR3aXNlWG9yOgorICAgIGNhc2Ugc3B2OjpPcEJpdHdpc2VBbmQ6CisgICAgY2FzZSBzcHY6Ok9wSUVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZPcmRFcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BGVW5vcmRFcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BJTm90RXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRk9yZE5vdEVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZE5vdEVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcFVMZXNzVGhhbjoKKyAgICBjYXNlIHNwdjo6T3BTTGVzc1RoYW46CisgICAgY2FzZSBzcHY6Ok9wRk9yZExlc3NUaGFuOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZExlc3NUaGFuOgorICAgIGNhc2Ugc3B2OjpPcFVHcmVhdGVyVGhhbjoKKyAgICBjYXNlIHNwdjo6T3BTR3JlYXRlclRoYW46CisgICAgY2FzZSBzcHY6Ok9wRk9yZEdyZWF0ZXJUaGFuOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZEdyZWF0ZXJUaGFuOgorICAgIGNhc2Ugc3B2OjpPcFVMZXNzVGhhbkVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcFNMZXNzVGhhbkVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZPcmRMZXNzVGhhbkVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZExlc3NUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wVUdyZWF0ZXJUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wU0dyZWF0ZXJUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRk9yZEdyZWF0ZXJUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRlVub3JkR3JlYXRlclRoYW5FcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BEb3Q6CisgICAgeworICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIHVuc2lnbmVkIGludCBsZWZ0ID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgdW5zaWduZWQgaW50IHJpZ2h0ID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGNyZWF0ZUJpbmFyeU9wZXJhdGlvbihvcENvZGUsIGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUucHJlY2lzaW9uLCBjb21tb25NYXBbbGVmdF0udmFsdWUsIGNvbW1vbk1hcFtyaWdodF0udmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbk1hcFtsZWZ0XS5tZXRhVHlwZS5sYXlvdXQgPT0gZ2xhOjpFTXRsTm9uZSwgZmFsc2UsIGZpbmRBTmFtZShyZXN1bHRJZCkpOworICAgICAgICBpZiAoY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9PSAwKQorICAgICAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoImJpbmFyeSBvcGVyYXRpb24iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Ugc3B2OjpPcFNlbGVjdDoKKyAgICB7CisgICAgICAgIGRlY29kZVJlc3VsdCh0cnVlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgbnVtT3BlcmFuZHMgLT0gMjsKKyAgICAgICAgc3B2OjpJZCBjb25kaXRpb25JZCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIHNwdjo6SWQgdHJ1ZUlkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgc3B2OjpJZCBmYWxzZUlkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGxsdm1CdWlsZGVyLkNyZWF0ZVNlbGVjdChjb21tb25NYXBbY29uZGl0aW9uSWRdLnZhbHVlLCBjb21tb25NYXBbdHJ1ZUlkXS52YWx1ZSwgY29tbW9uTWFwW2ZhbHNlSWRdLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Ugc3B2OjpPcEFjY2Vzc0NoYWluOgorICAgIHsKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBudW1PcGVyYW5kcyAtPSAyOworICAgICAgICBzcHY6OklkIGJhc2VJZCA9IHNwaXJ2W3dvcmQrK107CisKKyAgICAgICAgbGx2bTo6U21hbGxWZWN0b3I8bGx2bTo6VmFsdWUqLCA1PiBjaGFpbjsKKyAgICAgICAgY2hhaW4ucHVzaF9iYWNrKGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIDApKTsKKyAgICAgICAgbGx2bTo6VmFsdWUqIGJhc2UgPSBjb21tb25NYXBbYmFzZUlkXS52YWx1ZTsKKyAgICAgICAgZm9yIChpbnQgb3AgPSAxOyBvcCA8IG51bU9wZXJhbmRzOyArK29wKQorICAgICAgICAgICAgY2hhaW4ucHVzaF9iYWNrKGNvbW1vbk1hcFtzcGlydlt3b3JkKytdXS52YWx1ZSk7CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUgPSBsbHZtQnVpbGRlci5DcmVhdGVHRVAoYmFzZSwgY2hhaW4pOworICAgICAgICBpZiAoY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5uYW1lID09IDApCisgICAgICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLm5hbWUgPSBjb21tb25NYXBbYmFzZUlkXS5tZXRhVHlwZS5uYW1lOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wVmVjdG9yU2h1ZmZsZToKKyAgICB7CisgICAgICAgIGRlY29kZVJlc3VsdCh0cnVlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgbnVtT3BlcmFuZHMgLT0gMjsKKyAgICAgICAgbGx2bTo6VmFsdWUqIHZlY3RvcjEgPSBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWU7CisgICAgICAgIGxsdm06OlZhbHVlKiB2ZWN0b3IyID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnZhbHVlOworICAgICAgICBudW1PcGVyYW5kcyAtPSAyOworICAgICAgICB1bnNpZ25lZCBudW1UYXJnZXRDb21wb25lbnRzID0gZ2xhOjpHZXRDb21wb25lbnRDb3VudChjb21tb25NYXBbdHlwZUlkXS50eXBlKTsKKyAgICAgICAgYXNzZXJ0KG51bU9wZXJhbmRzID09IG51bVRhcmdldENvbXBvbmVudHMpOworCisgICAgICAgIGlmICh2ZWN0b3IxID09IHZlY3RvcjIpIHsKKyAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9yPGludCwgND4gY2hhbm5lbHM7CisgICAgICAgICAgICBmb3IgKGludCBvcCA9IDA7IG9wIDwgbnVtT3BlcmFuZHM7ICsrb3ApCisgICAgICAgICAgICAgICAgY2hhbm5lbHMucHVzaF9iYWNrKHNwaXJ2W3dvcmQrK10pOworICAgICAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGdsYUJ1aWxkZXItPmNyZWF0ZVN3aXp6bGUoY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5wcmVjaXNpb24sIHZlY3RvcjEsIGNoYW5uZWxzLCBjb21tb25NYXBbdHlwZUlkXS50eXBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChnbGE6OkdldENvbXBvbmVudENvdW50KHZlY3RvcjEpID09IG51bVRhcmdldENvbXBvbmVudHMpIHsKKyAgICAgICAgICAgIC8vIFNlZSBpZiB0aGlzIGlzIGp1c3QgdXBkYXRpbmcgdmVjdG9yMSB3aXRoIHBhcnRzIG9mIHZlY3RvcjIKKyAgICAgICAgICAgIGJvb2wganVzdFVwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9wZXJhbmRzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3BpcnZbd29yZCArIGldIDwgbnVtVGFyZ2V0Q29tcG9uZW50cyAmJiBzcGlydlt3b3JkICsgaV0gIT0gaSkKKyAgICAgICAgICAgICAgICAgICAganVzdFVwZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEganVzdFVwZGF0ZSkKKyAgICAgICAgICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiZ2VuZXJhbGl6ZWQgc2h1ZmZsZSB3aXRoIG1hdGNoaW5nIHNpemVzIik7CisKKyAgICAgICAgICAgIC8vIE5vdywgd2Uga25vdyBhbnl0aGluZyBmcm9tIHZlY3RvcjEgaXMgYW4gaWRlbnRpdHkgc2h1ZmZsZSwKKyAgICAgICAgICAgIC8vIHNvLCBqdXN0IGNvbGxlY3QgZnJvbSB2ZWN0b3IyIGFuZCBwdXQgaW50byB0aGUgZmlyc3Qgb25lLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PcGVyYW5kczsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNwaXJ2W3dvcmQgKyBpXSA+PSBudW1UYXJnZXRDb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlKiBjb21wID0gbGx2bUJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQodmVjdG9yMiwgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgc3BpcnZbd29yZCArIGldIC0gbnVtVGFyZ2V0Q29tcG9uZW50cykpOworICAgICAgICAgICAgICAgICAgICB2ZWN0b3IxID0gbGx2bUJ1aWxkZXIuQ3JlYXRlSW5zZXJ0RWxlbWVudCh2ZWN0b3IxLCBjb21wLCBnbGE6Ok1ha2VJbnRDb25zdGFudChjb250ZXh0LCBpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IHZlY3RvcjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVkICVkICVkICVkIFxuIiwgZ2xhOjpHZXRDb21wb25lbnRDb3VudChjb21tb25NYXBbdHlwZUlkXS50eXBlKSwgZ2xhOjpHZXRDb21wb25lbnRDb3VudCh2ZWN0b3IxKSwgZ2xhOjpHZXRDb21wb25lbnRDb3VudCh2ZWN0b3IyKSwgbnVtT3BlcmFuZHMpOworICAgICAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoImdlbmVyYWxpemVkIHNodWZmbGUgd2l0aCB1bm1hdGNoaW5nIHNpemVzIik7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wQ29tcG9zaXRlQ29uc3RydWN0OgorICAgIHsKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBudW1PcGVyYW5kcyAtPSAyOworICAgICAgICBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+IGNvbnN0aXR1ZW50czsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PcGVyYW5kczsgKytpKQorICAgICAgICAgICAgY29uc3RpdHVlbnRzLnB1c2hfYmFjayhjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWUpOworICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gY3JlYXRlQ29uc3RydWN0b3IocmVzdWx0SWQsIHR5cGVJZCwgY29uc3RpdHVlbnRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Ugc3B2OjpPcENvbXBvc2l0ZUV4dHJhY3Q6CisgICAgeworICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIGxsdm06OlZhbHVlKiBjb21wb3NpdGUgPSBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWU7CisgICAgICAgIG51bU9wZXJhbmRzIC09IDM7CisKKyAgICAgICAgLy8gQnVpbGQgdGhlIGluZGV4ZXMuLi4KKyAgICAgICAgLy8gU1BJUi1WIGNhbiBnbyB0byBkb3duIHRvIGNvbXBvbmVudHMsIGJ1dCBMTFZNIHN0b3BzIGF0IHZlY3RvcnMsIHNvIHRyYWNrIHR5cGUKKyAgICAgICAgLy8gdG8gYnJlYWsgb3V0IGVhcmx5LgorICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiBjdXJyZW50VHlwZSA9IGNvbXBvc2l0ZS0+Z2V0VHlwZSgpOworICAgICAgICBsbHZtOjpTbWFsbFZlY3Rvcjx1bnNpZ25lZCBpbnQsIDQ+IGluZGV4ZXM7CisgICAgICAgIGludCB2ZWN0b3JJbmRleCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9wZXJhbmRzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VHlwZS0+Z2V0VHlwZUlEKCkgPT0gbGx2bTo6VHlwZTo6VmVjdG9yVHlJRCkgeworICAgICAgICAgICAgICAgIHZlY3RvckluZGV4ID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ZXMucHVzaF9iYWNrKHNwaXJ2W3dvcmQrK10pOworICAgICAgICAgICAgY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS0+Z2V0Q29udGFpbmVkVHlwZShzdGQ6Om1pbihpbmRleGVzLmJhY2soKSwgY3VycmVudFR5cGUtPmdldE51bUNvbnRhaW5lZFR5cGVzKCkgLSAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEbyB0aGUgb3BlcmF0aW9uCisgICAgICAgIGlmICh2ZWN0b3JJbmRleCA9PSAtMSkKKyAgICAgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUgPSBsbHZtQnVpbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoY29tcG9zaXRlLCBpbmRleGVzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgZmluYWwgaW5kZXggd2FzIGludG8gYSB2ZWN0b3IuCisgICAgICAgICAgICAvLyBJZiB0aGUgdmVjdG9yIGlzIGEgc3VicGFydCBvZiB0aGUgY29tcG9zaXRlOyBmaXJzdCBleHRyYWN0IHRoZSB2ZWN0b3IKKyAgICAgICAgICAgIGxsdm06OlZhbHVlKiB2ZWN0b3I7CisgICAgICAgICAgICBpZiAoaW5kZXhlcy5zaXplKCkgPiAwKQorICAgICAgICAgICAgICAgIHZlY3RvciA9IGxsdm1CdWlsZGVyLkNyZWF0ZUV4dHJhY3RWYWx1ZShjb21wb3NpdGUsIGluZGV4ZXMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZlY3RvciA9IGNvbXBvc2l0ZTsKKyAgICAgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUgPSBsbHZtQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudCh2ZWN0b3IsIGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIHZlY3RvckluZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wQ29tcG9zaXRlSW5zZXJ0OgorICAgIHsKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBsbHZtOjpWYWx1ZSogb2JqZWN0ID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnZhbHVlOworICAgICAgICBsbHZtOjpWYWx1ZSogY29tcG9zaXRlID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnZhbHVlOworICAgICAgICBudW1PcGVyYW5kcyAtPSA0OworCisgICAgICAgIC8vIEJ1aWxkIHRoZSBpbmRleGVzLi4uCisgICAgICAgIC8vIFNQSVItViBjYW4gZ28gdG8gZG93biB0byBjb21wb25lbnRzLCBidXQgTExWTSBzdG9wcyBhdCB2ZWN0b3JzLCBzbyB0cmFjayB0eXBlCisgICAgICAgIC8vIHRvIGJyZWFrIG91dCBlYXJseS4KKyAgICAgICAgY29uc3QgbGx2bTo6VHlwZSogY3VycmVudFR5cGUgPSBjb21wb3NpdGUtPmdldFR5cGUoKTsKKyAgICAgICAgbGx2bTo6U21hbGxWZWN0b3I8dW5zaWduZWQgaW50LCA0PiBpbmRleGVzOworICAgICAgICBpbnQgdmVjdG9ySW5kZXggPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PcGVyYW5kczsgKytpKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudFR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OlZlY3RvclR5SUQpIHsKKyAgICAgICAgICAgICAgICB2ZWN0b3JJbmRleCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleGVzLnB1c2hfYmFjayhzcGlydlt3b3JkKytdKTsKKyAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUtPmdldENvbnRhaW5lZFR5cGUoc3RkOjptaW4oaW5kZXhlcy5iYWNrKCksIGN1cnJlbnRUeXBlLT5nZXROdW1Db250YWluZWRUeXBlcygpIC0gMSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gdGhlIG9wZXJhdGlvbgorICAgICAgICBpZiAodmVjdG9ySW5kZXggPT0gLTEpCisgICAgICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gbGx2bUJ1aWxkZXIuQ3JlYXRlSW5zZXJ0VmFsdWUoY29tcG9zaXRlLCBvYmplY3QsIGluZGV4ZXMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZSBmaW5hbCBpbmRleCB3YXMgaW50byBhIHZlY3Rvci4KKyAgICAgICAgICAgIC8vIElmIHRoZSB2ZWN0b3IgaXMgYSBzdWJwYXJ0IG9mIHRoZSBjb21wb3NpdGU7IGV4dHJhY3QgdGhlIHZlY3RvciwgZG8gdGhlIGluc2VydCwgdGhlbiBwdXQgdGhlIHZlY3RvciBiYWNrLgorICAgICAgICAgICAgLy8gSWYgdGhlIHZlY3RvciBpcyB0aGUgY29tcG9zaXRlLCBkZWFsIHdpdGggaXQgbW9yZSBkaXJlY3RseS4KKyAgICAgICAgICAgIGlmIChpbmRleGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSogdmVjdG9yID0gbGx2bUJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKGNvbXBvc2l0ZSwgaW5kZXhlcyk7CisgICAgICAgICAgICAgICAgdmVjdG9yID0gbGx2bUJ1aWxkZXIuQ3JlYXRlSW5zZXJ0RWxlbWVudCh2ZWN0b3IsIG9iamVjdCwgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgdmVjdG9ySW5kZXgpKTsKKyAgICAgICAgICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gbGx2bUJ1aWxkZXIuQ3JlYXRlSW5zZXJ0VmFsdWUoY29tcG9zaXRlLCB2ZWN0b3IsIGluZGV4ZXMpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGxsdm1CdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoY29tcG9zaXRlLCBvYmplY3QsIGdsYTo6TWFrZUludENvbnN0YW50KGNvbnRleHQsIHZlY3RvckluZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wVmVjdG9yRXh0cmFjdER5bmFtaWM6CisgICAgeworICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIGxsdm06OlZhbHVlKiBzb3VyY2UgPSBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWU7CisgICAgICAgIGxsdm06OlZhbHVlKiBjb21wb25lbnQgPSBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWU7CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUgPSBsbHZtQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChzb3VyY2UsIGNvbXBvbmVudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIHNwdjo6T3BWZWN0b3JJbnNlcnREeW5hbWljOgorICAgIHsKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBsbHZtOjpWYWx1ZSogdGFyZ2V0ID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnZhbHVlOworICAgICAgICBsbHZtOjpWYWx1ZSogc291cmNlID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnZhbHVlOworICAgICAgICBsbHZtOjpWYWx1ZSogY29tcG9uZW50ID0gY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnZhbHVlOworICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gbGx2bUJ1aWxkZXIuQ3JlYXRlSW5zZXJ0RWxlbWVudCh0YXJnZXQsIHNvdXJjZSwgY29tcG9uZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Ugc3B2OjpPcFVuZGVmOgorICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUgPSBsbHZtOjpVbmRlZlZhbHVlOjpnZXQoY29tbW9uTWFwW3R5cGVJZF0udHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFBoaToKKyAgICB7CisgICAgICAgIGRlY29kZVJlc3VsdCh0cnVlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgbnVtT3BlcmFuZHMgLT0gMjsKKyAgICAgICAgbGx2bTo6UEhJTm9kZSogcGhpID0gbGx2bUJ1aWxkZXIuQ3JlYXRlUEhJKGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUsIG51bU9wZXJhbmRzKTsKKyAgICAgICAgd2hpbGUgKG51bU9wZXJhbmRzID49IDIpIHsKKyAgICAgICAgICAgIHNwdjo6SWQgdmFyaWFibGUgPSBzcGlydlt3b3JkKytdOworICAgICAgICAgICAgc3B2OjpJZCBwYXJlbnQgPSBzcGlydlt3b3JkKytdOworICAgICAgICAgICAgbWFrZUxhYmVsQmxvY2socGFyZW50KTsKKyAgICAgICAgICAgIG51bU9wZXJhbmRzIC09IDI7CisgICAgICAgICAgICBwaGktPmFkZEluY29taW5nKGNvbW1vbk1hcFt2YXJpYWJsZV0udmFsdWUsIGNvbW1vbk1hcFtwYXJlbnRdLmJsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gcGhpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wU2FtcGxlZEltYWdlOgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiT3BTYW1wbGVyIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6Ok9wSW1hZ2U6CisgICAgeworICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIG51bU9wZXJhbmRzIC09IDI7CisgICAgICAgIHVuc2lnbmVkIGludCBvcGVyYW5kID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGNvbW1vbk1hcFtvcGVyYW5kXS52YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTYW1wbGVJbXBsaWNpdExvZDoKKyAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZUV4cGxpY2l0TG9kOgorICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlRHJlZkltcGxpY2l0TG9kOgorICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlRHJlZkV4cGxpY2l0TG9kOgorICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlUHJvakltcGxpY2l0TG9kOgorICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlUHJvakV4cGxpY2l0TG9kOgorICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlUHJvakRyZWZJbXBsaWNpdExvZDoKKyAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZVByb2pEcmVmRXhwbGljaXRMb2Q6CisgICAgICAgIGRlY29kZVJlc3VsdCh0cnVlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgbnVtT3BlcmFuZHMgLT0gMjsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGNyZWF0ZVNhbXBsaW5nQ2FsbChvcENvZGUsIHR5cGVJZCwgcmVzdWx0SWQsIG51bU9wZXJhbmRzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6T3BJbWFnZUZldGNoOgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiT3BUZXh0dXJlRmV0Y2ggaW5zdHJ1Y3Rpb24iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6T3BJbWFnZUdhdGhlcjoKKyAgICBjYXNlIHNwdjo6T3BJbWFnZURyZWZHYXRoZXI6CisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJPcFRleHR1cmVHYXRoZXIgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6T3BJbWFnZVF1ZXJ5U2l6ZUxvZDoKKyAgICBjYXNlIHNwdjo6T3BJbWFnZVF1ZXJ5U2l6ZToKKyAgICBjYXNlIHNwdjo6T3BJbWFnZVF1ZXJ5TG9kOgorICAgIGNhc2Ugc3B2OjpPcEltYWdlUXVlcnlMZXZlbHM6CisgICAgY2FzZSBzcHY6Ok9wSW1hZ2VRdWVyeVNhbXBsZXM6CisgICAgICAgIGRlY29kZVJlc3VsdCh0cnVlLCB0eXBlSWQsIHJlc3VsdElkKTsKKyAgICAgICAgbnVtT3BlcmFuZHMgLT0gMjsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGNyZWF0ZVRleHR1cmVRdWVyeUNhbGwob3BDb2RlLCB0eXBlSWQsIHJlc3VsdElkLCBudW1PcGVyYW5kcyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6Ok9wU05lZ2F0ZToKKyAgICBjYXNlIHNwdjo6T3BGTmVnYXRlOgorICAgIGNhc2Ugc3B2OjpPcE5vdDoKKyAgICBjYXNlIHNwdjo6T3BMb2dpY2FsTm90OgorICAgIGNhc2Ugc3B2OjpPcEFueToKKyAgICBjYXNlIHNwdjo6T3BBbGw6CisgICAgY2FzZSBzcHY6Ok9wQ29udmVydEZUb1U6CisgICAgY2FzZSBzcHY6Ok9wQ29udmVydEZUb1M6CisgICAgY2FzZSBzcHY6Ok9wQ29udmVydFNUb0Y6CisgICAgY2FzZSBzcHY6Ok9wQ29udmVydFVUb0Y6CisgICAgY2FzZSBzcHY6Ok9wVUNvbnZlcnQ6CisgICAgY2FzZSBzcHY6Ok9wU0NvbnZlcnQ6CisgICAgY2FzZSBzcHY6Ok9wRkNvbnZlcnQ6CisgICAgY2FzZSBzcHY6Ok9wQml0Y2FzdDoKKyAgICBjYXNlIHNwdjo6T3BUcmFuc3Bvc2U6CisgICAgY2FzZSBzcHY6Ok9wSXNOYW46CisgICAgY2FzZSBzcHY6Ok9wSXNJbmY6CisgICAgY2FzZSBzcHY6Ok9wQXJyYXlMZW5ndGg6CisgICAgY2FzZSBzcHY6Ok9wRFBkeDoKKyAgICBjYXNlIHNwdjo6T3BEUGR5OgorICAgIGNhc2Ugc3B2OjpPcEZ3aWR0aDoKKyAgICBjYXNlIHNwdjo6T3BEUGR4RmluZToKKyAgICBjYXNlIHNwdjo6T3BEUGR5RmluZToKKyAgICBjYXNlIHNwdjo6T3BGd2lkdGhGaW5lOgorICAgIGNhc2Ugc3B2OjpPcERQZHhDb2Fyc2U6CisgICAgY2FzZSBzcHY6Ok9wRFBkeUNvYXJzZToKKyAgICBjYXNlIHNwdjo6T3BGd2lkdGhDb2Fyc2U6CisgICAgeworICAgICAgICBkZWNvZGVSZXN1bHQodHJ1ZSwgdHlwZUlkLCByZXN1bHRJZCk7CisgICAgICAgIHVuc2lnbmVkIGludCBvcGVyYW5kID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgY29tbW9uTWFwW3Jlc3VsdElkXS52YWx1ZSA9IGNyZWF0ZVVuYXJ5T3BlcmF0aW9uKG9wQ29kZSwgY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5wcmVjaXNpb24sIGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUsIGNvbW1vbk1hcFtvcGVyYW5kXS52YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25NYXBbb3BlcmFuZF0ubWV0YVR5cGUubGF5b3V0ID09IGdsYTo6RU10bE5vbmUsIGZhbHNlKTsKKyAgICAgICAgaWYgKGNvbW1vbk1hcFtyZXN1bHRJZF0udmFsdWUgPT0gMCkKKyAgICAgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJ1bmFyeSBvcGVyYXRpb24gIiwgb3BDb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBzcHY6Ok9wRW1pdFN0cmVhbVZlcnRleDoKKyAgICAgICAgZ2xhQnVpbGRlci0+Y3JlYXRlSW50cmluc2ljQ2FsbChnbGE6OkVNcE5vbmUsIGxsdm06OkludHJpbnNpYzo6Z2xhX2VtaXRTdHJlYW1WZXJ0ZXgsIGNvbW1vbk1hcFtzcGlydlt3b3JkKytdXS52YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEVuZFN0cmVhbVByaW1pdGl2ZToKKyAgICAgICAgZ2xhQnVpbGRlci0+Y3JlYXRlSW50cmluc2ljQ2FsbChnbGE6OkVNcE5vbmUsIGxsdm06OkludHJpbnNpYzo6Z2xhX2VuZFN0cmVhbVByaW1pdGl2ZSwgY29tbW9uTWFwW3NwaXJ2W3dvcmQrK11dLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwdjo6T3BFbWl0VmVydGV4OgorICAgICAgICBnbGFCdWlsZGVyLT5jcmVhdGVJbnRyaW5zaWNDYWxsKGxsdm06OkludHJpbnNpYzo6Z2xhX2VtaXRWZXJ0ZXgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BFbmRQcmltaXRpdmU6CisgICAgICAgIGdsYUJ1aWxkZXItPmNyZWF0ZUludHJpbnNpY0NhbGwobGx2bTo6SW50cmluc2ljOjpnbGFfZW5kUHJpbWl0aXZlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wQ29udHJvbEJhcnJpZXI6CisgICAgICAgIGdsYUJ1aWxkZXItPmNyZWF0ZUludHJpbnNpY0NhbGwobGx2bTo6SW50cmluc2ljOjpnbGFfYmFycmllcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcE1lbW9yeUJhcnJpZXI6CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBhbGwgdGhlIGRpZmZlcmVudCBraW5kcworICAgICAgICBnbGFCdWlsZGVyLT5jcmVhdGVJbnRyaW5zaWNDYWxsKGxsdm06OkludHJpbnNpYzo6Z2xhX21lbW9yeUJhcnJpZXIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2Ugc3B2OjpPcEZ1bmN0aW9uQ2FsbDoKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBudW1PcGVyYW5kcyAtPSAyOworICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gY3JlYXRlRnVuY3Rpb25DYWxsKGNvbW1vbk1hcFtyZXN1bHRJZF0ubWV0YVR5cGUucHJlY2lzaW9uLCB0eXBlSWQsIHJlc3VsdElkLCBudW1PcGVyYW5kcyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6Ok9wRXh0SW5zdDoKKyAgICAgICAgZGVjb2RlUmVzdWx0KHRydWUsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBudW1PcGVyYW5kcyAtPSAyOworICAgICAgICBjb21tb25NYXBbcmVzdWx0SWRdLnZhbHVlID0gY3JlYXRlRXh0ZXJuYWxJbnN0cnVjdGlvbihjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLnByZWNpc2lvbiwgdHlwZUlkLCByZXN1bHRJZCwgbnVtT3BlcmFuZHMsIGZpbmRBTmFtZShyZXN1bHRJZCkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2Ugc3B2OjpPcExhYmVsOgorICAgICAgICBkZWNvZGVSZXN1bHQoZmFsc2UsIHR5cGVJZCwgcmVzdWx0SWQpOworICAgICAgICBtYWtlTGFiZWxCbG9jayhyZXN1bHRJZCk7CisgICAgICAgIGxsdm1CdWlsZGVyLlNldEluc2VydFBvaW50KGNvbW1vbk1hcFtyZXN1bHRJZF0uYmxvY2spOworICAgICAgICBicmVhazsKKworICAgIGNhc2Ugc3B2OjpPcExvb3BNZXJnZToKKyAgICAgICAgLy8gZ29pbmcgdG8gTHVuYXJHTEFTUyBkb2VzIG5vdCByZXF1aXJlIHByZXNlcnZpbmcgc3RydWN0dXJlZCBmbG93IGNvbnRyb2wKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wU2VsZWN0aW9uTWVyZ2U6CisgICAgICAgIC8vIGdvaW5nIHRvIEx1bmFyR0xBU1MgZG9lcyBub3QgcmVxdWlyZSBwcmVzZXJ2aW5nIHN0cnVjdHVyZWQgZmxvdyBjb250cm9sCisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEJyYW5jaDoKKyAgICB7CisgICAgICAgIHNwdjo6SWQgbGFiZWxJZCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIG1ha2VMYWJlbEJsb2NrKGxhYmVsSWQpOworICAgICAgICBsbHZtQnVpbGRlci5DcmVhdGVCcihjb21tb25NYXBbbGFiZWxJZF0uYmxvY2spOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wQnJhbmNoQ29uZGl0aW9uYWw6CisgICAgeworICAgICAgICBzcHY6OklkIGNvbmRpdGlvbklkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgc3B2OjpJZCB0cnVlTGFiZWxJZCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIHNwdjo6SWQgZmFsc2VMYWJlbElkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgbWFrZUxhYmVsQmxvY2sodHJ1ZUxhYmVsSWQpOworICAgICAgICBtYWtlTGFiZWxCbG9jayhmYWxzZUxhYmVsSWQpOworICAgICAgICBsbHZtQnVpbGRlci5DcmVhdGVDb25kQnIoY29tbW9uTWFwW2NvbmRpdGlvbklkXS52YWx1ZSwgY29tbW9uTWFwW3RydWVMYWJlbElkXS5ibG9jaywgY29tbW9uTWFwW2ZhbHNlTGFiZWxJZF0uYmxvY2spOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBzcHY6Ok9wU3dpdGNoOgorICAgICAgICBjcmVhdGVTd2l0Y2gobnVtT3BlcmFuZHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BLaWxsOgorICAgICAgICBnbGFCdWlsZGVyLT5tYWtlRGlzY2FyZChpbkVudHJ5UG9pbnQoKSk7CisgICAgICAgIC8vIHdlIG1pZ2h0IGJlIG1pc3NpbmcgYSB0ZXJtaW5hdGlvbiBpbnN0cnVjdGlvbiBpbiB0aGUgbm93IGN1cnJlbnQgYmxvY2sKKyAgICAgICAgaWYgKGxsdm1CdWlsZGVyLkdldEluc2VydEJsb2NrKCktPmdldFRlcm1pbmF0b3IoKSA9PSAwICYmIEdldE9wQ29kZShzcGlydlt3b3JkXSkgPT0gc3B2OjpPcExhYmVsKSB7CisgICAgICAgICAgICBzcHY6OklkIGxhYmVsSWQgPSBzcGlydlt3b3JkICsgMV07CisgICAgICAgICAgICBtYWtlTGFiZWxCbG9jayhsYWJlbElkKTsKKyAgICAgICAgICAgIGxsdm1CdWlsZGVyLkNyZWF0ZUJyKGNvbW1vbk1hcFtsYWJlbElkXS5ibG9jayk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wUmV0dXJuOgorICAgICAgICBpZiAoaW5FbnRyeVBvaW50KCkpCisgICAgICAgICAgICBnbGFCdWlsZGVyLT5tYWtlTWFpblJldHVybigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnbGFCdWlsZGVyLT5tYWtlUmV0dXJuKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFJldHVyblZhbHVlOgorICAgICAgICBnbGFCdWlsZGVyLT5tYWtlUmV0dXJuKGZhbHNlLCBjb21tb25NYXBbc3BpcnZbd29yZCsrXV0udmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiT3BDb2RlICIsIG9wQ29kZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gSGFuZGxlIGFuIE9wRnVuY3Rpb24sIGdldHRpbmcgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBtYWtlIHRoZSBnbGEgZnVuY3Rpb24KKy8vIGZyb20gdGhlIE9wVHlwZUZ1bmN0aW9uLCBzbyBub3QgeWV0IHZpc2l0aW5nIHRoZSBPcEZ1bmN0aW9uUGFyYW1ldGVycyB0aGF0IGZvbGxvdyBpdAordm9pZCBTcHZUb1RvcFRyYW5zbGF0b3I6OmhhbmRsZU9wRnVuY3Rpb24oc3B2OjpJZCYgdHlwZUlkLCBzcHY6OklkJiByZXN1bHRJZCkKK3sKKyAgICBjdXJyZW50RnVuY3Rpb24gPSByZXN1bHRJZDsKKworICAgIHNwdjo6RnVuY3Rpb25Db250cm9sTWFzayBjb250cm9sTWFzayA9IChzcHY6OkZ1bmN0aW9uQ29udHJvbE1hc2spc3BpcnZbd29yZCsrXTsKKyAgICBzcHY6OklkIGZ1bmN0aW9uVHlwZUlkID0gc3BpcnZbd29yZCsrXTsKKworICAgIC8vIHBlZWsgYWhlYWQgYXQgdGhlIGZpcnN0IGxhYmVsLCBhcyB3ZSdyZSBtYWtpbmcgdGhlIGVudHJ5IGJsb2NrIGVhcmx5CisgICAgc3B2OjpJZCBmaXJzdExhYmVsSWQgPSBnZXROZXh0TGFiZWxJZCgpOworCisgICAgaWYgKGluRW50cnlQb2ludCgpKSB7CisgICAgICAgIC8vIE1ha2UgdGhlIGVudHJ5IHBvaW50IGZ1bmN0aW9uIGluIExMVk0uCisgICAgICAgIHNoYWRlckVudHJ5ID0gZ2xhQnVpbGRlci0+bWFrZU1haW4oKTsKKyAgICAgICAgY29uc3QgY2hhciogZW50cnlOYW1lID0gY29tbW9uTWFwW3Jlc3VsdElkXS5tZXRhVHlwZS5uYW1lOworICAgICAgICBpZiAoZW50cnlOYW1lID09IDApCisgICAgICAgICAgICBlbnRyeU5hbWUgPSAibWFpbiI7CisgICAgICAgIG1ldGFkYXRhLmFkZE1kRW50cnlwb2ludChlbnRyeU5hbWUpOworICAgICAgICBjb21tb25NYXBbY3VycmVudEZ1bmN0aW9uXS5mdW5jdGlvbiA9IHNoYWRlckVudHJ5LT5nZXRQYXJlbnQoKTsKKyAgICAgICAgY29tbW9uTWFwW2ZpcnN0TGFiZWxJZF0uYmxvY2sgPSBzaGFkZXJFbnRyeTsKKyAgICAgICAgbGx2bUJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoc2hhZGVyRW50cnkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBmdW5jdGlvbiBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZCBieSBhIGZvcndhcmQgY2FsbC4KKyAgICAgICAgLy8gSWYgbm90LCBtYWtlIGl0IG5vdy4KKyAgICAgICAgbGx2bTo6RnVuY3Rpb24qIGZ1bmN0aW9uOworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdHlwZUluc3RySW5kZXggPSBjb21tb25NYXBbZnVuY3Rpb25UeXBlSWRdLmluc3RydWN0aW9uSW5kZXg7CisgICAgICAgIGNvbnN0IGludCBudW1QYXJhbXMgPSBHZXRXb3JkQ291bnQoc3BpcnZbdHlwZUluc3RySW5kZXhdKSAtIDM7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCByZXR1cm5UeXBlSW5kZXggPSB0eXBlSW5zdHJJbmRleCArIDI7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBwYXJhbTBUeXBlSW5kZXggPSB0eXBlSW5zdHJJbmRleCArIDM7CisgICAgICAgIGlmIChjb21tb25NYXBbY3VycmVudEZ1bmN0aW9uXS5mdW5jdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAvLyBCdWlsZCB1cCB0aGUgZm9ybWFsIHBhcmFtZXRlciB0eXBlIGxpc3QKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwdjo6SWQ+IHBhcmFtVHlwZUlkczsKKyAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbnVtUGFyYW1zOyArK3ApCisgICAgICAgICAgICAgICAgcGFyYW1UeXBlSWRzLnB1c2hfYmFjayhzcGlydltwYXJhbTBUeXBlSW5kZXggKyBwXSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZnVuY3Rpb24gPSBtYWtlRnVuY3Rpb24oY3VycmVudEZ1bmN0aW9uLCB0eXBlSWQsIHBhcmFtVHlwZUlkcyk7CisgICAgICAgICAgICBjb21tb25NYXBbY3VycmVudEZ1bmN0aW9uXS5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGZ1bmN0aW9uID0gY29tbW9uTWFwW2N1cnJlbnRGdW5jdGlvbl0uZnVuY3Rpb247CisgICAgICAgIGNvbW1vbk1hcFtmaXJzdExhYmVsSWRdLmJsb2NrID0gJmZ1bmN0aW9uLT5nZXRFbnRyeUJsb2NrKCk7CisKKyAgICAgICAgbGx2bUJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoJmZ1bmN0aW9uLT5nZXRCYXNpY0Jsb2NrTGlzdCgpLmZyb250KCkpOworICAgIH0KK30KKworbGx2bTo6RnVuY3Rpb24qIFNwdlRvVG9wVHJhbnNsYXRvcjo6bWFrZUZ1bmN0aW9uKHNwdjo6SWQgZnVuY3Rpb25JZCwgc3B2OjpJZCByZXR1cm5UeXBlSWQsIHN0ZDo6dmVjdG9yPHNwdjo6SWQ+JiBhcmdUeXBlSWRzKQoreworICAgIGxsdm06OlR5cGUqIHJldFR5cGUgPSBjb21tb25NYXBbcmV0dXJuVHlwZUlkXS50eXBlOworICAgIHN0ZDo6dmVjdG9yPGxsdm06OlR5cGUqPiBwYXJhbVR5cGVzOworICAgIGZvciAoaW50IHAgPSAwOyBwIDwgKGludClhcmdUeXBlSWRzLnNpemUoKTsgKytwKQorICAgICAgICBwYXJhbVR5cGVzLnB1c2hfYmFjayhjb21tb25NYXBbYXJnVHlwZUlkc1twXV0udHlwZSk7CisKKyAgICAvLyBNYWtlIHRoZSBmdW5jdGlvbgorICAgIGxsdm06OkJhc2ljQmxvY2sqIGVudHJ5QmxvY2s7ICAvLyBzZWVtcyB0aGlzIGlzIGp1c3QgbmVlZGVkIGFzIGEgZmxhZyBub3cKKyAgICBsbHZtOjpGdW5jdGlvbiogZnVuY3Rpb24gPSBnbGFCdWlsZGVyLT5tYWtlRnVuY3Rpb25FbnRyeShyZXRUeXBlLCBjb21tb25NYXBbZnVuY3Rpb25JZF0ubWV0YVR5cGUubmFtZSwgcGFyYW1UeXBlcywgJmVudHJ5QmxvY2spOworICAgIGZ1bmN0aW9uLT5hZGRGbkF0dHIobGx2bTo6QXR0cmlidXRlOjpBbHdheXNJbmxpbmUpOworICAgIAorICAgIHJldHVybiBmdW5jdGlvbjsKK30KKworLy8gUGVlayBhaGVhZCBpbiB0aGUgc3BpcnYgdW50aWwgYW4gT3BMYWJlbCBpcyBmb3VuZCwgYW5kIHJldHVybiBpdHMgaWQuCitzcHY6OklkIFNwdlRvVG9wVHJhbnNsYXRvcjo6Z2V0TmV4dExhYmVsSWQoKQoreworICAgIHVuc2lnbmVkIHNlYXJjaFdvcmQgPSB3b3JkOworICAgIGRvIHsKKyAgICAgICAgaWYgKChzcGlydltzZWFyY2hXb3JkXSAmIHNwdjo6T3BDb2RlTWFzaykgPT0gc3B2OjpPcExhYmVsKQorICAgICAgICAgICAgcmV0dXJuIHNwaXJ2W3NlYXJjaFdvcmQgKyAxXTsKKyAgICAgICAgc2VhcmNoV29yZCArPSBzcGlydltzZWFyY2hXb3JkXSA+PiBzcHY6OldvcmRDb3VudFNoaWZ0OworICAgICAgICBhc3NlcnQoc2VhcmNoV29yZCA8IHNwaXJ2LnNpemUoKSk7CisgICAgfSB3aGlsZSAodHJ1ZSk7Cit9CisKKy8vIFRyYW5zbGF0ZSBhIFNQSVItViBPcEZ1bmN0aW9uQ2FsbCB0byBhIFRvcCBJUiBjYWxsLgorbGx2bTo6VmFsdWUqIFNwdlRvVG9wVHJhbnNsYXRvcjo6Y3JlYXRlRnVuY3Rpb25DYWxsKGdsYTo6RU1kUHJlY2lzaW9uIHByZWNpc2lvbiwgc3B2OjpJZCB0eXBlSWQsIHNwdjo6SWQgcmVzdWx0SWQsIGludCBudW1PcGVyYW5kcykKK3sKKyAgICAvLyBnZXQgdGhlIGZ1bmN0aW9uIG9wZXJhbmQKKyAgICBzcHY6OklkIGZ1bmN0aW9uSWQgPSBzcGlydlt3b3JkKytdOworICAgIG51bU9wZXJhbmRzIC09IDE7CisKKyAgICAvLyBJZiBpdCdzIGEgZm9yd2FyZCByZWZlcmVuY2UsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgCisgICAgLy8gc2lnbmF0dXJlIG9mIHRoZSBjYWxsLiAgSXQgaXMgc3VwcG9zZWQgdG8gYmUgdmFsaWRhdGVkIHRvIGFuIGV4YWN0IG1hdGNoCisgICAgLy8gb2YgdGhlIGZ1bmN0aW9uIHR5cGUuCisgICAgbGx2bTo6RnVuY3Rpb24qIGZ1bmN0aW9uOworICAgIGlmIChjb21tb25NYXBbZnVuY3Rpb25JZF0udmFsdWUgPT0gMCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzcHY6OklkPiBhcmdUeXBlSWRzOworICAgICAgICBmb3IgKGludCBhID0gMDsgYSA8IG51bU9wZXJhbmRzOyArK2EpCisgICAgICAgICAgICBhcmdUeXBlSWRzLnB1c2hfYmFjayhjb21tb25NYXBbc3BpcnZbd29yZCArIGFdXS50eXBlSWQpOworICAgICAgICBmdW5jdGlvbiA9IG1ha2VGdW5jdGlvbihmdW5jdGlvbklkLCB0eXBlSWQsIGFyZ1R5cGVJZHMpOworICAgICAgICBjb21tb25NYXBbZnVuY3Rpb25JZF0udmFsdWUgPSBmdW5jdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBHcmFiIHRoZSBmdW5jdGlvbidzIHBvaW50ZXIgZnJvbSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIGZ1bmN0aW9uCisgICAgICAgIGZ1bmN0aW9uID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6RnVuY3Rpb24+KGNvbW1vbk1hcFtmdW5jdGlvbklkXS52YWx1ZSk7CisgICAgfQorCisgICAgaWYgKCEgZnVuY3Rpb24pCisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJDYWxsIHRvIHVuZGVmaW5lZCBmdW5jdGlvbiIpOworCisgICAgLy8gTm90ZTogQWxsIHRoZSBkaWZmaWN1bHQgc2VtYW50aWNzIGZvciB2YXJpb3VzIGtpbmRzIG9mIGFyZ3VtZW50IHBhc3Npbmcgc2hvdWxkIGJlCisgICAgLy8gaGFuZGxlZCBnb2luZyB0byBTUElSLVYsIHNvIHRoYXQgbm93IHRoaW5ncyBzaG91bGQganVzdCBiZSBwYXNzIGJ5IGNvcHkuCisKKyAgICAvLyBnZXQgdGhlIGNhbGxpbmcgYXJndW1lbnQgb3BlcmFuZHMKKyAgICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpWYWx1ZSosIDQ+IGxsdm1BcmdzOworICAgIGZvciAoaW50IG9wID0gMDsgb3AgPCBudW1PcGVyYW5kczsgKytvcCkgeworICAgICAgICBzcHY6OklkIGFyZ0lkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgbGx2bUFyZ3MucHVzaF9iYWNrKGNvbW1vbk1hcFthcmdJZF0udmFsdWUpOworICAgIH0KKworICAgIC8vIE1ha2UgdGhlIGNhbGwKKyAgICByZXR1cm4gbGx2bUJ1aWxkZXIuSW5zZXJ0KGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoZnVuY3Rpb24sIGxsdm1BcmdzKSk7Cit9CisKKy8vIFRyYW5zbGF0ZSBhIFNQSVItViBPcEV4dEluc3QgdG8gYSBUb3AgSVIgY2FsbC4KK2xsdm06OlZhbHVlKiBTcHZUb1RvcFRyYW5zbGF0b3I6OmNyZWF0ZUV4dGVybmFsSW5zdHJ1Y3Rpb24oZ2xhOjpFTWRQcmVjaXNpb24gcHJlY2lzaW9uLCBzcHY6OklkIHR5cGVJZCwgc3B2OjpJZCByZXN1bHRJZCwgaW50IG51bU9wZXJhbmRzLCBjb25zdCBjaGFyKiBuYW1lKQoreworICAgIC8vIGdldCB0aGUgc2V0IGFuZCBpbnN0cnVjdGlvbiBudW1iZXIKKyAgICBzcHY6OklkIGV4dEluc3RTZXQgPSBzcGlydlt3b3JkKytdOworICAgIHVuc2lnbmVkIGludCBpbnN0RW51bSA9IHNwaXJ2W3dvcmQrK107CisgICAgbnVtT3BlcmFuZHMgLT0gMjsKKworICAgIC8vIGdldCB0aGUgY2FsbGluZyBhcmd1bWVudCBvcGVyYW5kcworICAgIGJvb2wgZmlyc3RIYXNTaWduID0gZmFsc2U7CisgICAgYm9vbCBmaXJzdElzRmxvYXQgPSBmYWxzZTsKKyAgICBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+IG9wZXJhbmRzOworICAgIGZvciAoaW50IG9wID0gMDsgb3AgPCBudW1PcGVyYW5kczsgKytvcCkgeworICAgICAgICBzcHY6OklkIGFyZ0lkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgb3BlcmFuZHMucHVzaF9iYWNrKGNvbW1vbk1hcFthcmdJZF0udmFsdWUpOworICAgICAgICBpZiAob3AgPT0gMCkgeworICAgICAgICAgICAgZmlyc3RJc0Zsb2F0ID0gZ2xhOjpHZXRCYXNpY1R5cGVJRChvcGVyYW5kcy5mcm9udCgpKSA9PSBsbHZtOjpUeXBlOjpGbG9hdFR5SUQ7CisgICAgICAgICAgICBpZiAoISBmaXJzdElzRmxvYXQpCisgICAgICAgICAgICAgICAgZmlyc3RIYXNTaWduID0gY29tbW9uTWFwW2FyZ0lkXS5tZXRhVHlwZS5sYXlvdXQgPT0gZ2xhOjpFTXRsTm9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxsdm06OkludHJpbnNpYzo6SUQgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OklEKDApOworICAgIGxsdm06OlZhbHVlKiByZXN1bHQgPSAwOworCisgICAgc3dpdGNoIChpbnN0RW51bSkgeworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwUm91bmQ6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZlJvdW5kRmFzdDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBSb3VuZEV2ZW46CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZlJvdW5kRXZlbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBUcnVuYzoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUm91bmRaZXJvOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MEZBYnM6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkFiczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBTQWJzOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2FiczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBGU2lnbjoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mU2lnbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBTU2lnbjoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9zaWduOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MEZsb29yOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGbG9vcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBDZWlsOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZDZWlsaW5nOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MEZyYWN0OgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGcmFjdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBSYWRpYW5zOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZSYWRpYW5zOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MERlZ3JlZXM6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkRlZ3JlZXM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwU2luOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZTaW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwQ29zOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZDb3M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwVGFuOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZUYW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwQXNpbjoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mQXNpbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBBY29zOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZBY29zOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MEF0YW46CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkF0YW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwU2luaDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mU2luaDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBDb3NoOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZDb3NoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFRhbmg6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZlRhbmg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwQXNpbmg6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkFzaW5oOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MEFjb3NoOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZBY29zaDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBBdGFuaDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mQXRhbmg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwQXRhbjI6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkF0YW4yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFBvdzoKKyAgICAgICAgaWYgKGZpcnN0SXNGbG9hdCkKKyAgICAgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZlBvdzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUG93aTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBFeHA6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkV4cDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBMb2c6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkxvZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBFeHAyOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZFeHAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MExvZzI6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkxvZzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwU3FydDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mU3FydDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBJbnZlcnNlU3FydDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mSW52ZXJzZVNxcnQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRGV0ZXJtaW5hbnQ6CisgICAgICAgIHJldHVybiBnbGFCdWlsZGVyLT5jcmVhdGVNYXRyaXhEZXRlcm1pbmFudChwcmVjaXNpb24sIG9wZXJhbmRzLmZyb250KCkpOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwTWF0cml4SW52ZXJzZToKKyAgICAgICAgcmV0dXJuIGdsYUJ1aWxkZXItPmNyZWF0ZU1hdHJpeEludmVyc2UocHJlY2lzaW9uLCBvcGVyYW5kcy5mcm9udCgpKTsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1ME1vZGY6CisgICAgeworICAgICAgICAvLyBtb2RmKCkncyBzZWNvbmQgb3BlcmFuZCBpcyBvbmx5IGFuIGwtdmFsdWUgdG8gc2V0IHRoZSAybmQgcmV0dXJuIHZhbHVlIHRvCisKKyAgICAgICAgLy8gdXNlIGEgdW5hcnkgaW50cmluc2ljIGZvcm0gdG8gbWFrZSB0aGUgY2FsbCBhbmQgZ2V0IGJhY2sgdGhlIHJldHVybmVkIHN0cnVjdAorICAgICAgICBsbHZtOjpWYWx1ZSogc3RydWN0dXJlID0gZ2xhQnVpbGRlci0+Y3JlYXRlSW50cmluc2ljQ2FsbChwcmVjaXNpb24sIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNb2RGLCBvcGVyYW5kcy5mcm9udCgpKTsKKworICAgICAgICAvLyBzdG9yZSBpbnRlZ2VyIHBhcnQgaW50byBzZWNvbmQgb3BlcmFuZAorICAgICAgICBsbHZtOjpWYWx1ZSogaW50UGFydCA9IGxsdm1CdWlsZGVyLkNyZWF0ZUV4dHJhY3RWYWx1ZShzdHJ1Y3R1cmUsIDEpOworICAgICAgICBsbHZtQnVpbGRlci5DcmVhdGVTdG9yZShpbnRQYXJ0LCBvcGVyYW5kc1sxXSk7CisKKyAgICAgICAgLy8gbGVhdmUgdGhlIGZpcnN0IHBhcnQgYXMgdGhlIGZ1bmN0aW9uLWNhbGwncyB2YWx1ZQorICAgICAgICByZXR1cm4gbGx2bUJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKHN0cnVjdHVyZSwgMCk7CisgICAgfQorICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRk1pbjoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWluOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFNNaW46CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfc01pbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBVTWluOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX3VNaW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRk1heDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWF4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFNNYXg6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfc01heDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBVTWF4OgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX3VNYXg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRkNsYW1wOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZDbGFtcDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBTQ2xhbXA6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfc0NsYW1wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFVDbGFtcDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV91Q2xhbXA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRk1peDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWl4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MElNaXg6CisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJpbnRlZ2VyIG1peCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFN0ZXA6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZlN0ZXA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwU21vb3RoU3RlcDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mU21vb3RoU3RlcDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBGbWE6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRnJleHA6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwTGRleHA6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwUGFja1Nub3JtNHg4OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFBhY2tVbm9ybTR4ODoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBQYWNrU25vcm0yeDE2OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFBhY2tVbm9ybTJ4MTY6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwUGFja0hhbGYyeDE2OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFBhY2tEb3VibGUyeDMyOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFVucGFja1Nub3JtMngxNjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBVbnBhY2tVbm9ybTJ4MTY6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwVW5wYWNrSGFsZjJ4MTY6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwVW5wYWNrU25vcm00eDg6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwVW5wYWNrVW5vcm00eDg6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwVW5wYWNrRG91YmxlMngzMjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBMZW5ndGg6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkxlbmd0aDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBEaXN0YW5jZToKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mRGlzdGFuY2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwQ3Jvc3M6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkNyb3NzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1ME5vcm1hbGl6ZToKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTm9ybWFsaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MEZhY2VGb3J3YXJkOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGYWNlRm9yd2FyZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6OkdMU0xzdGQ0NTBSZWZsZWN0OgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZSZWZsZWN0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MFJlZnJhY3Q6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZlJlZnJhY3Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRmluZElMc2I6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRmluZFNNc2I6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwRmluZFVNc2I6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwSW50ZXJwb2xhdGVBdENlbnRyb2lkOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6R0xTTHN0ZDQ1MEludGVycG9sYXRlQXRTYW1wbGU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpHTFNMc3RkNDUwSW50ZXJwb2xhdGVBdE9mZnNldDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gSWYgaW50cmluc2ljIHdhcyBhc3NpZ25lZCwgdGhlbiBjYWxsIHRoZSBpbnRyaW5zaWMgYW5kIHJldHVybgorICAgIGlmIChpbnRyaW5zaWNJRCAhPSBsbHZtOjpJbnRyaW5zaWM6OklEKDApKSB7CisgICAgICAgIHN3aXRjaCAob3BlcmFuZHMuc2l6ZSgpKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGdsYUJ1aWxkZXItPmNyZWF0ZUludHJpbnNpY0NhbGwocHJlY2lzaW9uLCBpbnRyaW5zaWNJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmVzdWx0ID0gZ2xhQnVpbGRlci0+Y3JlYXRlSW50cmluc2ljQ2FsbChwcmVjaXNpb24sIGludHJpbnNpY0lELCBvcGVyYW5kc1swXSwgbmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmVzdWx0ID0gZ2xhQnVpbGRlci0+Y3JlYXRlSW50cmluc2ljQ2FsbChwcmVjaXNpb24sIGludHJpbnNpY0lELCBvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0sIG5hbWUgPyBuYW1lIDogIm1pc2MyYSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHJlc3VsdCA9IGdsYUJ1aWxkZXItPmNyZWF0ZUludHJpbnNpY0NhbGwocHJlY2lzaW9uLCBpbnRyaW5zaWNJRCwgb3BlcmFuZHNbMF0sIG9wZXJhbmRzWzFdLCBvcGVyYW5kc1syXSwgbmFtZSA/IG5hbWUgOiAibWlzYzNhIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRoZXNlIGRvIG5vdCBleGlzdCB5ZXQKKyAgICAgICAgICAgIGFzc2VydCgwICYmICJpbnRyaW5zaWMgd2l0aCBtb3JlIHRoYW4gMyBvcGVyYW5kcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IDApCisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJidWlsdC1pbiBjYWxsIik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitsbHZtOjpWYWx1ZSogU3B2VG9Ub3BUcmFuc2xhdG9yOjpjcmVhdGVVbmFyeU9wZXJhdGlvbihzcHY6Ok9wIG9wLCBnbGE6OkVNZFByZWNpc2lvbiBwcmVjaXNpb24sIGxsdm06OlR5cGUqIHJlc3VsdFR5cGUsIGxsdm06OlZhbHVlKiBvcGVyYW5kLCBib29sIGhhc1NpZ24sIGJvb2wgcmVkdWNlQ29tcGFyaXNvbikKK3sKKyAgICBsbHZtOjpJbnN0cnVjdGlvbjo6Q2FzdE9wcyBjYXN0T3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6Q2FzdE9wcygwKTsKKyAgICBib29sIGlzRmxvYXQgPSBnbGE6OkdldEJhc2ljVHlwZUlEKG9wZXJhbmQpID09IGxsdm06OlR5cGU6OkZsb2F0VHlJRDsKKyAgICBib29sIGNvbXBhcmlzb24gPSBmYWxzZTsKKworICAgIGxsdm06OkludHJpbnNpYzo6SUQgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OklEKDApOworICAgIGxsdm06OlZhbHVlKiByZXN1bHQgPSAwOworCisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2Ugc3B2OjpPcFNOZWdhdGU6CisgICAgICAgIHJlc3VsdCA9IGxsdm1CdWlsZGVyLkNyZWF0ZU5lZyhvcGVyYW5kKTsKKyAgICAgICAgZ2xhQnVpbGRlci0+c2V0SW5zdHJ1Y3Rpb25QcmVjaXNpb24ocmVzdWx0LCBwcmVjaXNpb24pOworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgY2FzZSBzcHY6Ok9wRk5lZ2F0ZToKKyAgICAgICAgaWYgKGdsYTo6SXNBZ2dyZWdhdGUob3BlcmFuZCkpIHsKKyAgICAgICAgICAgIC8vIGVtdWxhdGUgYnkgc3VidHJhY3RpbmcgZnJvbSAwLjAKKyAgICAgICAgICAgIGxsdm06OlZhbHVlKiB6ZXJvID0gZ2xhOjpNYWtlRmxvYXRDb25zdGFudChjb250ZXh0LCAwLjApOworCisgICAgICAgICAgICByZXR1cm4gZ2xhQnVpbGRlci0+Y3JlYXRlTWF0cml4T3AocHJlY2lzaW9uLCBsbHZtOjpJbnN0cnVjdGlvbjo6RlN1YiwgemVybywgb3BlcmFuZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2xhOjpHZXRCYXNpY1R5cGVJRChvcGVyYW5kKSA9PSBsbHZtOjpUeXBlOjpGbG9hdFR5SUQpCisgICAgICAgICAgICByZXN1bHQgPSBsbHZtQnVpbGRlci5DcmVhdGVGTmVnKG9wZXJhbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBsbHZtQnVpbGRlci5DcmVhdGVOZWcgKG9wZXJhbmQpOworICAgICAgICBnbGFCdWlsZGVyLT5zZXRJbnN0cnVjdGlvblByZWNpc2lvbihyZXN1bHQsIHByZWNpc2lvbik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBjYXNlIHNwdjo6T3BOb3Q6CisgICAgY2FzZSBzcHY6Ok9wTG9naWNhbE5vdDoKKyAgICAgICAgcmV0dXJuIGxsdm1CdWlsZGVyLkNyZWF0ZU5vdChvcGVyYW5kKTsKKyAgICBjYXNlIHNwdjo6T3BBbnk6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfYW55OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BBbGw6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfYWxsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BDb252ZXJ0RlRvVToKKyAgICAgICAgY2FzdE9wID0gbGx2bTo6SW5zdHJ1Y3Rpb246OkZQVG9VSTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wQ29udmVydEZUb1M6CisgICAgICAgIGNhc3RPcCA9IGxsdm06Okluc3RydWN0aW9uOjpGUFRvU0k7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcENvbnZlcnRTVG9GOgorICAgICAgICBjYXN0T3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6U0lUb0ZQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BDb252ZXJ0VVRvRjoKKyAgICAgICAgY2FzdE9wID0gbGx2bTo6SW5zdHJ1Y3Rpb246OlVJVG9GUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wVUNvbnZlcnQ6CisgICAgICAgIGNhc3RPcCA9IGxsdm06Okluc3RydWN0aW9uOjpVSVRvRlA7Ly8gVE9ETworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BTQ29udmVydDoKKyAgICAgICAgLy8gVE9ETworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGQ29udmVydDoKKyAgICAgICAgLy8gVE9ETworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BCaXRjYXN0OgorICAgICAgICByZXR1cm4gbGx2bUJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChvcGVyYW5kLCByZXN1bHRUeXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wVHJhbnNwb3NlOgorICAgICAgICByZXR1cm4gZ2xhQnVpbGRlci0+Y3JlYXRlTWF0cml4VHJhbnNwb3NlKHByZWNpc2lvbiwgb3BlcmFuZCk7CisgICAgY2FzZSBzcHY6Ok9wSXNOYW46CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZklzTmFuOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BJc0luZjoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mSXNJbmY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEFycmF5TGVuZ3RoOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BEUGR4OgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZERmR4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BEUGR5OgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZERmR5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGd2lkdGg6CisgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkZpbHRlcldpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BEUGR4RmluZToKKyAgICAgICAgLy8gVE9ETworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BEUGR5RmluZToKKyAgICAgICAgLy8gVE9ETworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGd2lkdGhGaW5lOgorICAgICAgICAvLyBUT0RPCisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcERQZHhDb2Fyc2U6CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wRFBkeUNvYXJzZToKKyAgICAgICAgLy8gVE9ETworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGd2lkdGhDb2Fyc2U6CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gSWYgaW50cmluc2ljIHdhcyBhc3NpZ25lZCwgdGhlbiBjYWxsIHRoZSBUb3AgSVIgaW50cmluc2ljIGFuZCByZXR1cm4uCisgICAgaWYgKGludHJpbnNpY0lEICE9IGxsdm06OkludHJpbnNpYzo6SUQoMCkpCisgICAgICAgIHJldHVybiBnbGFCdWlsZGVyLT5jcmVhdGVJbnRyaW5zaWNDYWxsKHByZWNpc2lvbiwgaW50cmluc2ljSUQsIG9wZXJhbmQpOworCisgICAgaWYgKGNhc3RPcCkgeworICAgICAgICByZXN1bHQgPSBsbHZtQnVpbGRlci5DcmVhdGVDYXN0KGNhc3RPcCwgb3BlcmFuZCwgcmVzdWx0VHlwZSk7CisgICAgICAgIGdsYUJ1aWxkZXItPnNldEluc3RydWN0aW9uUHJlY2lzaW9uKHJlc3VsdCwgcHJlY2lzaW9uKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworbGx2bTo6VmFsdWUqIFNwdlRvVG9wVHJhbnNsYXRvcjo6Y3JlYXRlQmluYXJ5T3BlcmF0aW9uKHNwdjo6T3Agb3AsIGdsYTo6RU1kUHJlY2lzaW9uIHByZWNpc2lvbiwgbGx2bTo6VmFsdWUqIGxlZnQsIGxsdm06OlZhbHVlKiByaWdodCwgYm9vbCBoYXNTaWduLCBib29sIHJlZHVjZUNvbXBhcmlzb24sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisgICAgbGx2bTo6SW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBiaW5PcCA9IGxsdm06Okluc3RydWN0aW9uOjpCaW5hcnlPcHMoMCk7CisgICAgYm9vbCBsZWZ0SXNGbG9hdCA9IChnbGE6OkdldEJhc2ljVHlwZUlEKGxlZnQpID09IGxsdm06OlR5cGU6OkZsb2F0VHlJRCk7CisgICAgYm9vbCBjb21wYXJpc29uID0gZmFsc2U7CisKKyAgICBsbHZtOjpJbnRyaW5zaWM6OklEIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpJRCgwKTsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIHNwdjo6T3BGQWRkOgorICAgICAgICBiaW5PcCA9IGxsdm06Okluc3RydWN0aW9uOjpGQWRkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BJQWRkOgorICAgICAgICBiaW5PcCA9IGxsdm06Okluc3RydWN0aW9uOjpBZGQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEZTdWI6CisgICAgICAgIGJpbk9wID0gbGx2bTo6SW5zdHJ1Y3Rpb246OkZTdWI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcElTdWI6CisgICAgICAgIGJpbk9wID0gbGx2bTo6SW5zdHJ1Y3Rpb246OlN1YjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wRk11bDoKKyAgICBjYXNlIHNwdjo6T3BWZWN0b3JUaW1lc1NjYWxhcjoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6Rk11bDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wSU11bDoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6TXVsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BNYXRyaXhUaW1lc1NjYWxhcjoKKyAgICBjYXNlIHNwdjo6T3BWZWN0b3JUaW1lc01hdHJpeDoKKyAgICBjYXNlIHNwdjo6T3BNYXRyaXhUaW1lc1ZlY3RvcjoKKyAgICBjYXNlIHNwdjo6T3BNYXRyaXhUaW1lc01hdHJpeDoKKyAgICAgICAgcmV0dXJuIGdsYUJ1aWxkZXItPmNyZWF0ZU1hdHJpeE11bHRpcGx5KHByZWNpc2lvbiwgbGVmdCwgcmlnaHQpOworCisgICAgY2FzZSBzcHY6Ok9wRG90OgorICAgICAgICBzd2l0Y2ggKGdsYTo6R2V0Q29tcG9uZW50Q291bnQobGVmdCkpIHsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mRG90MjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX2ZEb3QzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGludHJpbnNpY0lEID0gbGx2bTo6SW50cmluc2ljOjpnbGFfZkRvdDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCghICJiYWQgY29tcG9uZW50IGNvdW50IGZvciBkb3QiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6Ok9wVURpdjoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6VURpdjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wU0RpdjoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6U0RpdjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wRkRpdjoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6RkRpdjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wVU1vZDoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6VVJlbTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wU1JlbToKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6U1JlbTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wU01vZDoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6U1JlbTsgIC8vIFRPRE8gaXMgdGhpcyBjb3JyZWN0PworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGUmVtOgorICAgICAgICBiaW5PcCA9IGxsdm06Okluc3RydWN0aW9uOjpGUmVtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGTW9kOgorICAgICAgICBiaW5PcCA9IGxsdm06Okluc3RydWN0aW9uOjpGUmVtOyAgLy8gVE9ETyBpcyB0aGlzIGNvcnJlY3Q/CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFNoaWZ0UmlnaHRMb2dpY2FsOgorICAgICAgICBiaW5PcCA9IGxsdm06Okluc3RydWN0aW9uOjpMU2hyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BTaGlmdFJpZ2h0QXJpdGhtZXRpYzoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6QVNocjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wU2hpZnRMZWZ0TG9naWNhbDoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6U2hsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BMb2dpY2FsQW5kOgorICAgIGNhc2Ugc3B2OjpPcEJpdHdpc2VBbmQ6CisgICAgICAgIGJpbk9wID0gbGx2bTo6SW5zdHJ1Y3Rpb246OkFuZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wTG9naWNhbE9yOgorICAgIGNhc2Ugc3B2OjpPcEJpdHdpc2VPcjoKKyAgICAgICAgYmluT3AgPSBsbHZtOjpJbnN0cnVjdGlvbjo6T3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcExvZ2ljYWxOb3RFcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BCaXR3aXNlWG9yOgorICAgICAgICBiaW5PcCA9IGxsdm06Okluc3RydWN0aW9uOjpYb3I7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6Ok9wSUVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZPcmRFcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BGVW5vcmRFcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BJTm90RXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRk9yZE5vdEVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZE5vdEVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcFVMZXNzVGhhbjoKKyAgICBjYXNlIHNwdjo6T3BTTGVzc1RoYW46CisgICAgY2FzZSBzcHY6Ok9wRk9yZExlc3NUaGFuOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZExlc3NUaGFuOgorICAgIGNhc2Ugc3B2OjpPcFVHcmVhdGVyVGhhbjoKKyAgICBjYXNlIHNwdjo6T3BTR3JlYXRlclRoYW46CisgICAgY2FzZSBzcHY6Ok9wRk9yZEdyZWF0ZXJUaGFuOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZEdyZWF0ZXJUaGFuOgorICAgIGNhc2Ugc3B2OjpPcFVMZXNzVGhhbkVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcFNMZXNzVGhhbkVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZPcmRMZXNzVGhhbkVxdWFsOgorICAgIGNhc2Ugc3B2OjpPcEZVbm9yZExlc3NUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wVUdyZWF0ZXJUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wU0dyZWF0ZXJUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRk9yZEdyZWF0ZXJUaGFuRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRlVub3JkR3JlYXRlclRoYW5FcXVhbDoKKyAgICAgICAgY29tcGFyaXNvbiA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIElmIGludHJpbnNpYyB3YXMgYXNzaWduZWQsIHRoZW4gY2FsbCB0aGUgVG9wIElSIGludHJpbnNpYyBhbmQgcmV0dXJuLgorICAgIGlmIChpbnRyaW5zaWNJRCAhPSBsbHZtOjpJbnRyaW5zaWM6OklEKDApKQorICAgICAgICByZXR1cm4gZ2xhQnVpbGRlci0+Y3JlYXRlSW50cmluc2ljQ2FsbChwcmVjaXNpb24sIGludHJpbnNpY0lELCBsZWZ0LCByaWdodCwgbmFtZSA/IG5hbWUgOiAibWlzYzJhIik7CisKKyAgICAvLyBJZiBiaW5PcCB3YXMgYXNzaWduZWQsIHRoZW4gbWFrZSB0aGUgTExWTSBpbnN0cnVjdGlvbi4KKyAgICBpZiAoYmluT3AgIT0gMCkgeworICAgICAgICBpZiAoZ2xhOjpJc0FnZ3JlZ2F0ZShsZWZ0KSB8fCBnbGE6OklzQWdncmVnYXRlKHJpZ2h0KSkKKyAgICAgICAgICAgIHJldHVybiBnbGFCdWlsZGVyLT5jcmVhdGVNYXRyaXhPcChwcmVjaXNpb24sIGJpbk9wLCBsZWZ0LCByaWdodCk7CisKKyAgICAgICAgZ2xhQnVpbGRlci0+cHJvbW90ZVNjYWxhcihwcmVjaXNpb24sIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgbGx2bTo6VmFsdWUqIHZhbHVlID0gbGx2bUJ1aWxkZXIuQ3JlYXRlQmluT3AoYmluT3AsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgZ2xhQnVpbGRlci0+c2V0SW5zdHJ1Y3Rpb25QcmVjaXNpb24odmFsdWUsIHByZWNpc2lvbik7CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGlmICghIGNvbXBhcmlzb24pCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gQ29tcGFyaXNvbiBpbnN0cnVjdGlvbnMKKworICAgIGlmIChyZWR1Y2VDb21wYXJpc29uICYmIChnbGE6OklzVmVjdG9yKGxlZnQpIHx8IGdsYTo6SXNBZ2dyZWdhdGUobGVmdCkpKSB7CisgICAgICAgIGJvb2wgZXF1YWw7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBzcHY6Ok9wSUVxdWFsOgorICAgICAgICBjYXNlIHNwdjo6T3BGT3JkRXF1YWw6CisgICAgICAgIGNhc2Ugc3B2OjpPcEZVbm9yZEVxdWFsOgorICAgICAgICAgICAgZXF1YWwgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3B2OjpPcElOb3RFcXVhbDoKKyAgICAgICAgY2FzZSBzcHY6Ok9wRk9yZE5vdEVxdWFsOgorICAgICAgICBjYXNlIHNwdjo6T3BGVW5vcmROb3RFcXVhbDoKKyAgICAgICAgICAgIGVxdWFsID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJDb21wYXJpc29uIHJlZHVjdGlvbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2xhQnVpbGRlci0+Y3JlYXRlQ29tcGFyZShwcmVjaXNpb24sIGxlZnQsIHJpZ2h0LCBlcXVhbCk7CisgICAgfQorICAgICAgICAKKyAgICBsbHZtOjpGQ21wSW5zdDo6UHJlZGljYXRlIGZwcmVkID0gbGx2bTo6RkNtcEluc3Q6OlByZWRpY2F0ZSgwKTsKKyAgICBsbHZtOjpJQ21wSW5zdDo6UHJlZGljYXRlIGlwcmVkID0gbGx2bTo6SUNtcEluc3Q6OlByZWRpY2F0ZSgwKTsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBzcHY6Ok9wSUVxdWFsOgorICAgICAgICBpcHJlZCA9IGxsdm06OklDbXBJbnN0OjpJQ01QX0VROworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGT3JkRXF1YWw6CisgICAgICAgIGZwcmVkID0gbGx2bTo6RkNtcEluc3Q6OkZDTVBfT0VROworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BJTm90RXF1YWw6CisgICAgICAgIGlwcmVkID0gbGx2bTo6SUNtcEluc3Q6OklDTVBfTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEZPcmROb3RFcXVhbDoKKyAgICAgICAgZnByZWQgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFVMZXNzVGhhbjoKKyAgICAgICAgaXByZWQgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9VTFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFNMZXNzVGhhbjoKKyAgICAgICAgaXByZWQgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9TTFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEZPcmRMZXNzVGhhbjoKKyAgICAgICAgZnByZWQgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFVHcmVhdGVyVGhhbjoKKyAgICAgICAgaXByZWQgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9VR1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFNHcmVhdGVyVGhhbjoKKyAgICAgICAgaXByZWQgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9TR1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEZPcmRHcmVhdGVyVGhhbjoKKyAgICAgICAgZnByZWQgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PR1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFVMZXNzVGhhbkVxdWFsOgorICAgICAgICBpcHJlZCA9IGxsdm06OklDbXBJbnN0OjpJQ01QX1VMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wU0xlc3NUaGFuRXF1YWw6CisgICAgICAgIGlwcmVkID0gbGx2bTo6SUNtcEluc3Q6OklDTVBfU0xFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGT3JkTGVzc1RoYW5FcXVhbDoKKyAgICAgICAgZnByZWQgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcFVHcmVhdGVyVGhhbkVxdWFsOgorICAgICAgICBpcHJlZCA9IGxsdm06OklDbXBJbnN0OjpJQ01QX1VHRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wU0dyZWF0ZXJUaGFuRXF1YWw6CisgICAgICAgIGlwcmVkID0gbGx2bTo6SUNtcEluc3Q6OklDTVBfU0dFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BGT3JkR3JlYXRlclRoYW5FcXVhbDoKKyAgICAgICAgZnByZWQgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PR0U7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBzcHY6Ok9wRlVub3JkRXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRlVub3JkTm90RXF1YWw6CisgICAgY2FzZSBzcHY6Ok9wRlVub3JkTGVzc1RoYW46CisgICAgY2FzZSBzcHY6Ok9wRlVub3JkR3JlYXRlclRoYW46CisgICAgY2FzZSBzcHY6Ok9wRlVub3JkTGVzc1RoYW5FcXVhbDoKKyAgICBjYXNlIHNwdjo6T3BGVW5vcmRHcmVhdGVyVGhhbkVxdWFsOgorICAgICAgICBnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgiVW5vcmRlcmVkIGNvbXBhcmUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGZwcmVkKSB7CisgICAgICAgIGxsdm06OlZhbHVlKiByZXN1bHQgPSBsbHZtQnVpbGRlci5DcmVhdGVGQ21wKGZwcmVkLCBsZWZ0LCByaWdodCk7CisgICAgICAgIGdsYUJ1aWxkZXItPnNldEluc3RydWN0aW9uUHJlY2lzaW9uKHJlc3VsdCwgcHJlY2lzaW9uKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSBpZiAoaXByZWQgIT0gMCkgeworICAgICAgICBsbHZtOjpWYWx1ZSogcmVzdWx0ID0gbGx2bUJ1aWxkZXIuQ3JlYXRlSUNtcChpcHJlZCwgbGVmdCwgcmlnaHQpOworICAgICAgICBnbGFCdWlsZGVyLT5zZXRJbnN0cnVjdGlvblByZWNpc2lvbihyZXN1bHQsIHByZWNpc2lvbik7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gQ2hhbmdlIGZyb20gYSBTUElSLVYgc2FtcGxlciB0eXBlIHRvIGEgTHVuYXJHTEFTUyBzYW1wbGVyIHR5cGUKK2dsYTo6RVNhbXBsZXJUeXBlIFNwdlRvVG9wVHJhbnNsYXRvcjo6Y29udmVydEltYWdlVHlwZShzcHY6OklkIGltYWdlVHlwZUlkKQoreworICAgIHN3aXRjaCAoZ2V0SW1hZ2VEaW0oaW1hZ2VUeXBlSWQpKSB7CisgICAgY2FzZSBzcHY6OkRpbTFEOgorICAgICAgICByZXR1cm4gZ2xhOjpFU2FtcGxlcjFEOworICAgIGNhc2Ugc3B2OjpEaW0yRDoKKyAgICAgICAgaWYgKGlzSW1hZ2VNUyhpbWFnZVR5cGVJZCkpCisgICAgICAgICAgICByZXR1cm4gZ2xhOjpFU2FtcGxlcjJETVM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBnbGE6OkVTYW1wbGVyMkQ7CisgICAgY2FzZSBzcHY6OkRpbTNEOgorICAgICAgICByZXR1cm4gZ2xhOjpFU2FtcGxlcjNEOworICAgIGNhc2Ugc3B2OjpEaW1DdWJlOgorICAgICAgICByZXR1cm4gZ2xhOjpFU2FtcGxlckN1YmU7CisgICAgY2FzZSBzcHY6OkRpbVJlY3Q6CisgICAgICAgIHJldHVybiBnbGE6OkVTYW1wbGVyMkRSZWN0OworICAgIGNhc2Ugc3B2OjpEaW1CdWZmZXI6ICAgICAgICAKKyAgICAgICAgcmV0dXJuIGdsYTo6RVNhbXBsZXJCdWZmZXI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZ2xhOjpVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHkoIlNQSVItViBzYW1wbGVyIGRpbWVuc2lvbmFsaXR5Iik7CisgICAgICAgIHJldHVybiBnbGE6OkVTYW1wbGVyMkQ7CisgICAgfQorfQorCisvLyBUdXJuIGEgU1BJUi1WIE9wVGV4dHVyZVNhbXBsZSogaW5zdHJ1Y3Rpb24gaW50byBnbGEgdGV4dHVyaW5nIGludHJpbnNpYy4KK2xsdm06OlZhbHVlKiBTcHZUb1RvcFRyYW5zbGF0b3I6OmNyZWF0ZVNhbXBsaW5nQ2FsbChzcHY6Ok9wIG9wY29kZSwgc3B2OjpJZCB0eXBlSWQsIHNwdjo6SWQgcmVzdWx0SWQsIGludCBudW1PcGVyYW5kcykKK3sKKyAgICAvLyBGaXJzdCwgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbgorCisgICAgLy8gaW52YXJpYW50IGZpeGVkIG9wZXJhbmRzLCBzYW1wbGVkLWltYWdlIGFuZCBjb29yZAorICAgIHNwdjo6SWQgc2FtcGxlZEltYWdlSWQgPSBzcGlydlt3b3JkKytdOworICAgIHNwdjo6SWQgY29vcmQgPSBzcGlydlt3b3JkKytdOworICAgIG51bU9wZXJhbmRzIC09IDI7CisKKyAgICAvLyBEcmVmIGZpeGVkIG9wZXJhbmQKKyAgICBzcHY6OklkIGRyZWYgPSBCYWRWYWx1ZTsKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZURyZWZJbXBsaWNpdExvZDoKKyAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTYW1wbGVEcmVmRXhwbGljaXRMb2Q6CisgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlUHJvakRyZWZJbXBsaWNpdExvZDoKKyAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTYW1wbGVQcm9qRHJlZkV4cGxpY2l0TG9kOgorICAgICAgICAgICAgZHJlZiA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgICAgICAtLW51bU9wZXJhbmRzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBTUFYgaW1hZ2Ugb3BlcmFuZHMKKyAgICBzcHY6OklkIGJpYXMgPSBCYWRWYWx1ZTsKKyAgICBzcHY6OklkIGxvZCA9IEJhZFZhbHVlOworICAgIHNwdjo6SWQgZ3JhZHggPSBCYWRWYWx1ZTsKKyAgICBzcHY6OklkIGdyYWR5ID0gQmFkVmFsdWU7CisgICAgc3B2OjpJZCBvZmZzZXQgPSBCYWRWYWx1ZTsKKyAgICBzcHY6OklkIG9mZnNldHMgPSBCYWRWYWx1ZTsKKyAgICBzcHY6OklkIHNhbXBsZSA9IEJhZFZhbHVlOworICAgIGlmIChudW1PcGVyYW5kcyA+IDApIHsKKyAgICAgICAgc3B2OjpJbWFnZU9wZXJhbmRzTWFzayBpbWFnZU9wZXJhbmRzID0gKHNwdjo6SW1hZ2VPcGVyYW5kc01hc2spc3BpcnZbd29yZCsrXTsKKyAgICAgICAgaWYgKGltYWdlT3BlcmFuZHMgJiBzcHY6OkltYWdlT3BlcmFuZHNCaWFzTWFzaykKKyAgICAgICAgICAgIGJpYXMgPSBzcGlydlt3b3JkKytdOworICAgICAgICBpZiAoaW1hZ2VPcGVyYW5kcyAmIHNwdjo6SW1hZ2VPcGVyYW5kc0xvZE1hc2spCisgICAgICAgICAgICBsb2QgPSBzcGlydlt3b3JkKytdOworICAgICAgICBpZiAoaW1hZ2VPcGVyYW5kcyAmIHNwdjo6SW1hZ2VPcGVyYW5kc0dyYWRNYXNrKSB7CisgICAgICAgICAgICBncmFkeCA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgICAgICBncmFkeSA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltYWdlT3BlcmFuZHMgJiBzcHY6OkltYWdlT3BlcmFuZHNPZmZzZXRNYXNrIHx8CisgICAgICAgICAgICBpbWFnZU9wZXJhbmRzICYgc3B2OjpJbWFnZU9wZXJhbmRzQ29uc3RPZmZzZXRNYXNrKQorICAgICAgICAgICAgb2Zmc2V0ID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgaWYgKGltYWdlT3BlcmFuZHMgJiBzcHY6OkltYWdlT3BlcmFuZHNDb25zdE9mZnNldHNNYXNrKQorICAgICAgICAgICAgb2Zmc2V0cyA9IHNwaXJ2W3dvcmQrK107CisgICAgICAgIGlmIChpbWFnZU9wZXJhbmRzICYgc3B2OjpJbWFnZU9wZXJhbmRzU2FtcGxlTWFzaykKKyAgICAgICAgICAgIHNhbXBsZSA9IHNwaXJ2W3dvcmQrK107CisgICAgfQorCisgICAgLy8gU2Vjb25kLCBzZXQgdXAgaW5mb3JtYXRpb24gdG8gc2V0IHVwIHRvIHBhc3MgdG8gdGhlIGJ1aWxkZXI6CisKKyAgICAvLyBiaWFzCisgICAgaW50IGZsYWdzID0gMDsKKyAgICBnbGE6OkJ1aWxkZXI6OlRleHR1cmVQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSB7fTsKKyAgICBpZiAoYmlhcyAhPSBCYWRWYWx1ZSkgeworICAgICAgICBmbGFncyB8PSBnbGE6OkVURkJpYXM7CisgICAgICAgIHBhcmFtZXRlcnMuRVRQQmlhc0xvZCA9IGNvbW1vbk1hcFtiaWFzXS52YWx1ZTsKKyAgICB9CisKKyAgICAvLyBzYW1wbGVyIGFuZCBnbGEgZGltZW5zaW9uYWxpdHkKKyAgICBzcHY6OklkIHNhbXBsZWRJbWFnZVR5cGVJZCA9IGNvbW1vbk1hcFtzYW1wbGVkSW1hZ2VJZF0udHlwZUlkOworICAgIGdsYTo6RVNhbXBsZXJUeXBlIGdsYVNhbXBsZXJUeXBlID0gY29udmVydEltYWdlVHlwZShnZXRJbWFnZVR5cGVJZChjb21tb25NYXBbc2FtcGxlZEltYWdlSWRdLnR5cGVJZCkpOworICAgIHBhcmFtZXRlcnMuRVRQU2FtcGxlciA9IGNvbW1vbk1hcFtzYW1wbGVkSW1hZ2VJZF0udmFsdWU7CisKKyAgICAvLyBjb29yZAorICAgIHBhcmFtZXRlcnMuRVRQQ29vcmRzID0gY29tbW9uTWFwW2Nvb3JkXS52YWx1ZTsKKworICAgIC8vIGxvZAorICAgIGlmIChsb2QgIT0gQmFkVmFsdWUpIHsKKyAgICAgICAgZmxhZ3MgfD0gZ2xhOjpFVEZCaWFzTG9kQXJnOworICAgICAgICBmbGFncyB8PSBnbGE6OkVURkxvZDsKKyAgICAgICAgcGFyYW1ldGVycy5FVFBCaWFzTG9kID0gY29tbW9uTWFwW2xvZF0udmFsdWU7CisgICAgfQorCisgICAgLy8gb2Zmc2V0CisgICAgaWYgKG9mZnNldCAhPSBCYWRWYWx1ZSkgeworICAgICAgICBmbGFncyB8PSBnbGE6OkVURk9mZnNldEFyZzsKKyAgICAgICAgcGFyYW1ldGVycy5FVFBPZmZzZXQgPSBjb21tb25NYXBbb2Zmc2V0XS52YWx1ZTsKKyAgICB9CisKKyAgICAvLyBvZmZzZXRzCisgICAgaWYgKG9mZnNldHMgIT0gQmFkVmFsdWUpCisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJpbWFnZSBvZmZzZXRzIik7CisKKyAgICAvLyBncmFkaWVudAorICAgIGlmIChncmFkeCAhPSBCYWRWYWx1ZSkgeworICAgICAgICBwYXJhbWV0ZXJzLkVUUEdyYWRYID0gY29tbW9uTWFwW2dyYWR4XS52YWx1ZTsKKyAgICAgICAgcGFyYW1ldGVycy5FVFBHcmFkWSA9IGNvbW1vbk1hcFtncmFkeV0udmFsdWU7CisgICAgfQorCisgICAgLy8gcHJvagorICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgIGNhc2Ugc3B2OjpPcEltYWdlU2FtcGxlUHJvakltcGxpY2l0TG9kOgorICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZVByb2pFeHBsaWNpdExvZDoKKyAgICAgICAgY2FzZSBzcHY6Ok9wSW1hZ2VTYW1wbGVQcm9qRHJlZkltcGxpY2l0TG9kOgorICAgICAgICBjYXNlIHNwdjo6T3BJbWFnZVNhbXBsZVByb2pEcmVmRXhwbGljaXRMb2Q6CisgICAgICAgICAgICBmbGFncyB8PSBnbGE6OkVURlByb2plY3RlZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gRHJlZgorICAgIGlmIChkcmVmICE9IEJhZFZhbHVlKSB7CisgICAgICAgIC8vIE5vdGU6IGZvciBtb3N0IGNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHB1dCBiYWNrIHdpdGggdGhlIGNvb3JkaW5hdGUsCisgICAgICAgIC8vIHdoaWNoIGZvciB0aGUgZ2xzbGFuZyBmcm9udCBlbmQgYWxyZWFkeSBob2xkcyBpdC4KKyAgICAgICAgLy8gVE9ETzogZG8gdGhpcyBjb3JyZWN0bHksIGluIHRoZSBnZW5lcmFsIGNhc2UuCisgICAgICAgIAorICAgICAgICBpZiAoZmFsc2UgLyohIGN1YmUtYXJyYXllZCovKSB7CisgICAgICAgICAgICBmbGFncyB8PSBnbGE6OkVURlJlZlpBcmc7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLkVUUFNoYWRvd1JlZiA9IGNvbW1vbk1hcFtkcmVmXS52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBnbGFCdWlsZGVyLT5jcmVhdGVUZXh0dXJlQ2FsbChjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLnByZWNpc2lvbiwgY29tbW9uTWFwW3R5cGVJZF0udHlwZSwgZ2xhU2FtcGxlclR5cGUsIGZsYWdzLCBwYXJhbWV0ZXJzLCBmaW5kQU5hbWUocmVzdWx0SWQpKTsKK30KKworLy8gVHVybiBhIFNQSVItViBPcFRleHR1cmVRdWVyeSogaW5zdHJ1Y3Rpb24gaW50byBnbGEgdGV4dHVyaW5nIGludHJpbnNpYy4KK2xsdm06OlZhbHVlKiBTcHZUb1RvcFRyYW5zbGF0b3I6OmNyZWF0ZVRleHR1cmVRdWVyeUNhbGwoc3B2OjpPcCBvcGNvZGUsIHNwdjo6SWQgdHlwZUlkLCBzcHY6OklkIHJlc3VsdElkLCBpbnQgbnVtT3BlcmFuZHMpCit7CisgICAgLy8gZmlyc3Qgb3BlcmFuZCBpcyBhbHdheXMgdGhlIHNhbXBsZXIKKyAgICBzcHY6OklkIGltYWdlID0gc3BpcnZbd29yZCsrXTsKKworICAgIC8vIHNvbWV0aW1lcyB0aGVyZSBpcyBhbm90aGVyIG9wZXJhbmQsIGVpdGhlciBsb2Qgb3IgY29vcmRzCisgICAgc3B2OjpJZCBleHRyYUFyZyA9IDA7CisgICAgaWYgKG51bU9wZXJhbmRzID4gMSkKKyAgICAgICAgZXh0cmFBcmcgPSBzcGlydlt3b3JkKytdOworCisgICAgbGx2bTo6SW50cmluc2ljOjpJRCBpbnRyaW5zaWNJRDsKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGNhc2Ugc3B2OjpPcEltYWdlUXVlcnlTaXplTG9kOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX3F1ZXJ5VGV4dHVyZVNpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B2OjpPcEltYWdlUXVlcnlTaXplOgorICAgICAgICBpbnRyaW5zaWNJRCA9IGxsdm06OkludHJpbnNpYzo6Z2xhX3F1ZXJ5VGV4dHVyZVNpemVOb0xvZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHY6Ok9wSW1hZ2VRdWVyeUxvZDoKKyAgICAgICAgaW50cmluc2ljSUQgPSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUXVlcnlUZXh0dXJlTG9kOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNwdjo6T3BJbWFnZVF1ZXJ5TGV2ZWxzOgorICAgIGNhc2Ugc3B2OjpPcEltYWdlUXVlcnlTYW1wbGVzOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGdsYTo6VW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJTUElSLVYgdGV4dHVyZSBxdWVyeSBvcCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBnbGE6OkVTYW1wbGVyVHlwZSBnbGFTYW1wbGVyVHlwZSA9IGNvbnZlcnRJbWFnZVR5cGUoY29tbW9uTWFwW2ltYWdlXS50eXBlSWQpOworCisgICAgcmV0dXJuIGdsYUJ1aWxkZXItPmNyZWF0ZVRleHR1cmVRdWVyeUNhbGwoZ2xhOjpFTXBOb25lLCBpbnRyaW5zaWNJRCwgY29tbW9uTWFwW3R5cGVJZF0udHlwZSwgZ2xhOjpNYWtlSW50Q29uc3RhbnQoY29udGV4dCwgZ2xhU2FtcGxlclR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbk1hcFtpbWFnZV0udmFsdWUsIGNvbW1vbk1hcFtleHRyYUFyZ10udmFsdWUsIGZpbmRBTmFtZShyZXN1bHRJZCkpOworfQorCisvLyBPcENvbXBvc2l0ZUNvbnN0cnVjdAorbGx2bTo6VmFsdWUqIFNwdlRvVG9wVHJhbnNsYXRvcjo6Y3JlYXRlQ29uc3RydWN0b3Ioc3B2OjpJZCByZXN1bHRJZCwgc3B2OjpJZCB0eXBlSWQsIHN0ZDo6dmVjdG9yPGxsdm06OlZhbHVlKj4gY29uc3RpdHVlbnRzKQoreworICAgIGxsdm06OlZhbHVlKiByZXN1bHQ7CisKKyAgICBpZiAoZ2xhOjpJc1ZlY3Rvcihjb21tb25NYXBbdHlwZUlkXS50eXBlKSkgeworICAgICAgICAvLyBoYW5kbGUgdmVjdG9ycyBkaWZmZXJlbnRseSwgYXMgdGhleSBkb24ndCBoYXZlIGEgMToxIG1hcHBpbmcgYmV0d2VlbiBjb25zdGl0dWVudHMgYW5kIGNvbXBvbmVudHMKKyAgICAgICAgcmVzdWx0ID0gbGx2bTo6VW5kZWZWYWx1ZTo6Z2V0KGNvbW1vbk1hcFt0eXBlSWRdLnR5cGUpOworICAgICAgICByZXN1bHQgPSBnbGFCdWlsZGVyLT5jcmVhdGVDb25zdHJ1Y3Rvcihjb21tb25NYXBbcmVzdWx0SWRdLm1ldGFUeXBlLnByZWNpc2lvbiwgY29uc3RpdHVlbnRzLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSAobWF0cmljZXMsIGFycmF5cywgc3RydWN0cykgc2hvdWxkIGhhdmUgYSAxOjEgbWFwcGluZyBiZXR3ZWVuIGNvbnN0aXR1ZW50cyBhbmQgY29tcG9uZW50cworICAgICAgICByZXN1bHQgPSBsbHZtOjpVbmRlZlZhbHVlOjpnZXQoY29tbW9uTWFwW3R5cGVJZF0udHlwZSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb25zdGl0dWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICByZXN1bHQgPSBsbHZtQnVpbGRlci5DcmVhdGVJbnNlcnRWYWx1ZShyZXN1bHQsIGNvbnN0aXR1ZW50c1tpXSwgaSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3B2OjpPcCBTcHZUb1RvcFRyYW5zbGF0b3I6OmdldE9wQ29kZShzcHY6OklkIGlkKSBjb25zdAoreworICAgIHJldHVybiBHZXRPcENvZGUoc3BpcnZbY29tbW9uTWFwW2lkXS5pbnN0cnVjdGlvbkluZGV4XSk7Cit9CisKK3Nwdjo6SWQgU3B2VG9Ub3BUcmFuc2xhdG9yOjpkZXJlZmVyZW5jZVR5cGVJZChzcHY6OklkIHR5cGVJZCkgY29uc3QKK3sKKyAgICAvLyBMb29rIGJhY2sgYXQgdGhlIE9wVHlwZVBvaW50ZXIgaW5zdHJ1Y3Rpb24KKyAgICBjb25zdCBpbnQgT3BUeXBlUG9pbnRlcklkT2Zmc2V0ID0gMzsKKyAgICByZXR1cm4gc3BpcnZbY29tbW9uTWFwW3R5cGVJZF0uaW5zdHJ1Y3Rpb25JbmRleCArIE9wVHlwZVBvaW50ZXJJZE9mZnNldF07Cit9CisKK3Nwdjo6SWQgU3B2VG9Ub3BUcmFuc2xhdG9yOjpnZXRBcnJheUVsZW1lbnRUeXBlSWQoc3B2OjpJZCB0eXBlSWQpIGNvbnN0Cit7CisgICAgLy8gTG9vayBiYWNrIGF0IHRoZSBPcFR5cGUqIGluc3RydWN0aW9uCisgICAgY29uc3QgaW50IE9wVHlwZUFycmF5RWxlbWVudFR5cGVPZmZzZXQgPSAyOworICAgIHdoaWxlIChnZXRPcENvZGUodHlwZUlkKSA9PSBzcHY6Ok9wVHlwZUFycmF5KQorICAgICAgICB0eXBlSWQgPSBzcGlydltjb21tb25NYXBbdHlwZUlkXS5pbnN0cnVjdGlvbkluZGV4ICsgT3BUeXBlQXJyYXlFbGVtZW50VHlwZU9mZnNldF07CisKKyAgICByZXR1cm4gdHlwZUlkOworfQorCitzcHY6OklkIFNwdlRvVG9wVHJhbnNsYXRvcjo6Z2V0U3RydWN0TWVtYmVyVHlwZUlkKHNwdjo6SWQgdHlwZUlkLCBpbnQgbWVtYmVyKSBjb25zdAoreworICAgIC8vIExvb2sgYmFjayBhdCB0aGUgT3BUeXBlKiBpbnN0cnVjdGlvbgorICAgIGNvbnN0IGludCBPcFR5cGVTdHJ1Y3RNZW1iZXIwT2Zmc2V0ID0gMjsKKyAgICByZXR1cm4gc3BpcnZbY29tbW9uTWFwW3R5cGVJZF0uaW5zdHJ1Y3Rpb25JbmRleCArIE9wVHlwZVN0cnVjdE1lbWJlcjBPZmZzZXQgKyBtZW1iZXJdOworfQorCitzcHY6OklkIFNwdlRvVG9wVHJhbnNsYXRvcjo6Z2V0SW1hZ2VUeXBlSWQoc3B2OjpJZCBzYW1wbGVkSW1hZ2VUeXBlSWQpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNwaXJ2W2NvbW1vbk1hcFtzYW1wbGVkSW1hZ2VUeXBlSWRdLmluc3RydWN0aW9uSW5kZXggKyAyXTsKK30KKworLy8gTG9va3VwIHRoZSAnU2FtcGxlZCBUeXBlJyBvcGVyYW5kIGluIHRoZSBpbWFnZSB0eXBlCitzcHY6OklkIFNwdlRvVG9wVHJhbnNsYXRvcjo6Z2V0SW1hZ2VTYW1wbGVkVHlwZShzcHY6OklkIHR5cGVJZCkgY29uc3QKK3sKKyAgICBpZiAoY29tbW9uTWFwW3R5cGVJZF0ubWV0YVR5cGUuY29tYmluZWRJbWFnZVNhbXBsZXIpCisgICAgICAgIHR5cGVJZCA9IGdldEltYWdlVHlwZUlkKHR5cGVJZCk7CisKKyAgICByZXR1cm4gc3BpcnZbY29tbW9uTWFwW3R5cGVJZF0uaW5zdHJ1Y3Rpb25JbmRleCArIDJdOworfQorCisvLyBMb29rdXAgdGhlICdEaW0nIG9wZXJhbmQgaW4gdGhlIGltYWdlIHR5cGUKK3Nwdjo6RGltIFNwdlRvVG9wVHJhbnNsYXRvcjo6Z2V0SW1hZ2VEaW0oc3B2OjpJZCB0eXBlSWQpIGNvbnN0Cit7CisgICAgaWYgKGNvbW1vbk1hcFt0eXBlSWRdLm1ldGFUeXBlLmNvbWJpbmVkSW1hZ2VTYW1wbGVyKQorICAgICAgICB0eXBlSWQgPSBnZXRJbWFnZVR5cGVJZCh0eXBlSWQpOworCisgICAgcmV0dXJuIChzcHY6OkRpbSlzcGlydltjb21tb25NYXBbdHlwZUlkXS5pbnN0cnVjdGlvbkluZGV4ICsgM107Cit9CisKKy8vIExvb2t1cCB0aGUgJ2RlcHRoJyBvcGVyYW5kIGluIHRoZSBpbWFnZSB0eXBlCitib29sIFNwdlRvVG9wVHJhbnNsYXRvcjo6aXNJbWFnZURlcHRoKHNwdjo6SWQgdHlwZUlkKSBjb25zdAoreworICAgIGlmIChjb21tb25NYXBbdHlwZUlkXS5tZXRhVHlwZS5jb21iaW5lZEltYWdlU2FtcGxlcikKKyAgICAgICAgdHlwZUlkID0gZ2V0SW1hZ2VUeXBlSWQodHlwZUlkKTsKKworICAgIHJldHVybiBzcGlydltjb21tb25NYXBbdHlwZUlkXS5pbnN0cnVjdGlvbkluZGV4ICsgNF0gIT0gMDsKK30KKworLy8gTG9va3VwIHRoZSAnYXJyYXllZCcgb3BlcmFuZCBpbiB0aGUgaW1hZ2UgdHlwZQorYm9vbCBTcHZUb1RvcFRyYW5zbGF0b3I6OmlzSW1hZ2VBcnJheWVkKHNwdjo6SWQgdHlwZUlkKSBjb25zdAoreworICAgIGlmIChjb21tb25NYXBbdHlwZUlkXS5tZXRhVHlwZS5jb21iaW5lZEltYWdlU2FtcGxlcikKKyAgICAgICAgdHlwZUlkID0gZ2V0SW1hZ2VUeXBlSWQodHlwZUlkKTsKKworICAgIHJldHVybiBzcGlydltjb21tb25NYXBbdHlwZUlkXS5pbnN0cnVjdGlvbkluZGV4ICsgNV0gIT0gMDsKK30KKworLy8gTG9va3VwIHRoZSAnRGltJyBvcGVyYW5kIGluIHRoZSBpbWFnZSB0eXBlCitib29sIFNwdlRvVG9wVHJhbnNsYXRvcjo6aXNJbWFnZU1TKHNwdjo6SWQgdHlwZUlkKSBjb25zdAoreworICAgIGlmIChjb21tb25NYXBbdHlwZUlkXS5tZXRhVHlwZS5jb21iaW5lZEltYWdlU2FtcGxlcikKKyAgICAgICAgdHlwZUlkID0gZ2V0SW1hZ2VUeXBlSWQodHlwZUlkKTsKKworICAgIHJldHVybiAoc3B2OjpEaW0pKHNwaXJ2W2NvbW1vbk1hcFt0eXBlSWRdLmluc3RydWN0aW9uSW5kZXggKyA2XSAhPSAwKTsKK30KKworYm9vbCBTcHZUb1RvcFRyYW5zbGF0b3I6OmluRW50cnlQb2ludCgpCit7CisgICAgcmV0dXJuIGNvbW1vbk1hcFtjdXJyZW50RnVuY3Rpb25dLmVudHJ5UG9pbnQgIT0gQmFkVmFsdWU7Cit9CisKK3ZvaWQgU3B2VG9Ub3BUcmFuc2xhdG9yOjptYWtlTGFiZWxCbG9jayhzcHY6OklkIGxhYmVsSWQpCit7CisgICAgaWYgKGNvbW1vbk1hcFtsYWJlbElkXS5ibG9jayA9PSAwKQorICAgICAgICBjb21tb25NYXBbbGFiZWxJZF0uYmxvY2sgPSBsbHZtOjpCYXNpY0Jsb2NrOjpDcmVhdGUoY29udGV4dCwgIkwiLCBjb21tb25NYXBbY3VycmVudEZ1bmN0aW9uXS5mdW5jdGlvbik7Cit9CisKK3ZvaWQgU3B2VG9Ub3BUcmFuc2xhdG9yOjpjcmVhdGVTd2l0Y2goaW50IG51bU9wZXJhbmRzKQoreworICAgIHNwdjo6SWQgc2VsZWN0b3JJZCA9IHNwaXJ2W3dvcmQrK107CisgICAgc3B2OjpJZCBkZWZhdWx0SWQgPSBzcGlydlt3b3JkKytdOworICAgIG51bU9wZXJhbmRzIC09IDI7CisKKyAgICBhc3NlcnQoKG51bU9wZXJhbmRzICYgMSkgPT0gMCk7CisgICAgaW50IG51bVNlZ21lbnRzID0gbnVtT3BlcmFuZHMgLyAyOworCisgICAgbWFrZUxhYmVsQmxvY2soZGVmYXVsdElkKTsKKyAgICBsbHZtOjpTd2l0Y2hJbnN0KiBzd2l0Y2hJbnN0ID0gbGx2bUJ1aWxkZXIuQ3JlYXRlU3dpdGNoKGNvbW1vbk1hcFtzZWxlY3RvcklkXS52YWx1ZSwgY29tbW9uTWFwW2RlZmF1bHRJZF0uYmxvY2ssIG51bVNlZ21lbnRzKTsKKyAgICBmb3IgKGludCBjID0gMDsgYyA8IG51bVNlZ21lbnRzOyArK2MpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgc3B2OjpJZCBsYWJlbElkID0gc3BpcnZbd29yZCsrXTsKKyAgICAgICAgbWFrZUxhYmVsQmxvY2sobGFiZWxJZCk7CisgICAgICAgIHN3aXRjaEluc3QtPmFkZENhc2UobGx2bTo6Q29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGNvbnRleHQpLCB2YWx1ZSksIGNvbW1vbk1hcFtsYWJlbElkXS5ibG9jayk7CisgICAgfQorfQorCit9OyAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGdsYSB7CisKKy8vIFRyYW5zbGF0ZSBTUElSLVYgdG8gTHVuYXJHTEFTUyBUb3AgSVIKK3ZvaWQgU3B2VG9Ub3AoY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiYgc3BpcnYsIGdsYTo6TWFuYWdlciYgbWFuYWdlcikKK3sKKyAgICBtYW5hZ2VyLmNyZWF0ZUNvbnRleHQoKTsKKyAgICBsbHZtOjpNb2R1bGUqIHRvcE1vZHVsZSA9IG5ldyBsbHZtOjpNb2R1bGUoIlNQSVItViIsIG1hbmFnZXIuZ2V0Q29udGV4dCgpKTsKKyAgICBtYW5hZ2VyLnNldE1vZHVsZSh0b3BNb2R1bGUpOworCisgICAgU3B2VG9Ub3BUcmFuc2xhdG9yIHRyYW5zbGF0b3Ioc3BpcnYsIG1hbmFnZXIpOworICAgIHRyYW5zbGF0b3IubWFrZVRvcCgpOworfQorCit9OyAvLyBlbmQgZ2xhIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvTHVuYXJHTEFTU19yZXZpc2lvbiBiL0x1bmFyR0xBU1NfcmV2aXNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxOGQzYgotLS0gL2Rldi9udWxsCisrKyBiL0x1bmFyR0xBU1NfcmV2aXNpb24KQEAgLTAsMCArMSBAQAorMzFhMzUyOWNlNjExNTJhMzVkMjgzYjU1YWJjNWUwNjYxNGZkY2I1ZApkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCmluZGV4IGRlYWE0ZjEuLjg0NWQ3NjEgMTAwNjQ0Ci0tLSBhL1JFQURNRS5tZAorKysgYi9SRUFETUUubWQKQEAgLTEsMzYgKzEsMzEgQEAKICMgVnVsa2FuIEVjb3N5c3RlbSBDb21wb25lbnRzCiAKLVRoaXMgcHJvamVjdCBwcm92aWRlcyBLaHJvbm9zIG9mZmljaWFsIElDRCBsb2FkZXIgYW5kIHZhbGlkYXRpb24gbGF5ZXJzIGZvciBWdWxrYW4gZGV2ZWxvcGVycyBvbiBXaW5kb3dzIGFuZCBMaW51eC4KK1RoaXMgcHJvamVjdCBwcm92aWRlcyB2a3RyYWNlIGNhcHR1cmUvcmVwbGF5IHRvb2wsIEludGVsIElsbyBzYW1wbGUgZHJpdmVyIGFuZCBvdGhlciBsYXllciB0b29scyBhbmQgZHJpdmVyIHRlc3RzLgogCiAjIyBJbnRyb2R1Y3Rpb24KIAotVnVsa2FuIGlzIGFuIEV4cGxpY2l0IEFQSSwgZW5hYmxpbmcgZGlyZWN0IGNvbnRyb2wgb3ZlciBob3cgR1BVcyBhY3R1YWxseSB3b3JrLiBObyAob3IgdmVyeSBsaXR0bGUpIHZhbGlkYXRpb24KLW9yIGVycm9yIGNoZWNraW5nIGlzIGRvbmUgaW5zaWRlIGEgVnVsa2FuIGRyaXZlci4gQXBwbGljYXRpb25zIGhhdmUgZnVsbCBjb250cm9sIGFuZCByZXNwb25zaWJpbGl0eS4gQW55IGVycm9ycyBpbgotaG93IFZ1bGthbiBpcyB1c2VkIG9mdGVuIHJlc3VsdCBpbiBhIGNyYXNoLiBUaGlzIHByb2plY3QgcHJvdmlkZXMgc3RhbmRhcmQgdmFsaWRhdGlvbiBsYXllcnMgdGhhdCBjYW4gYmUgZW5hYmxlZAotdG8gZWFzZSBkZXZlbG9wbWVudCBieSBoZWxwaW5nIGRldmVsb3BlcnMgdmVyaWZ5IHRoZWlyIGFwcGxpY2F0aW9ucyBjb3JyZWN0bHkgdXNlIHRoZSBWdWxrYW4gQVBJLgorQnJhbmNoZXMgd2l0aGluIHRoaXMgcmVwb3NpdG9yeSBpbmNsdWRlIHRoZSBWdWxrYW4gbG9hZGVyLCB2YWxpZGF0aW9uIGxheWVycywgaGVhZGVyIGZpbGVzLCBhbmQgYXNzb2NpYXRlZCB0ZXN0cy4gIFRoZXNlIHBpZWNlcyBhcmUgbWlycm9yZWQgZnJvbSB0aGlzIEdpdGh1YiByZXBvc2l0b3J5OgoraHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9WdWxrYW4tTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycworVGhlc2UgcGllY2VzIGFyZSByZXF1aXJlZCB0byBlbmFibGUgdGhpcyByZXBvc2l0b3J5IHRvIGJlIGJ1aWx0IHN0YW5kYWxvbmU7IHRoYXQgaXMgd2l0aG91dCBoYXZpbmcgdG8gY2xvbmUgdGhlIFZ1bGthbi1Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzIHJlcG9zaXRvcnkuCiAKLVZ1bGthbiBzdXBwb3J0cyBtdWx0aXBsZSBHUFVzIGFuZCBtdWx0aXBsZSBnbG9iYWwgY29udGV4dHMgKFZrSW5zdGFuY2UpLiBUaGUgSUNEIGxvYWRlciBpcyBuZWNlc3NhcnkgdG8KLXN1cHBvcnQgbXVsdGlwbGUgR1BVcyAgYW5kIHRoZSBWa0luc3RhbmNlIGxldmVsIFZ1bGthbiBjb21tYW5kcy4gIEFkZGl0aW9uYWxseSwgdGhlIGxvYWRlciBtYW5hZ2VzIGluc2VydGluZwotVnVsa2FuIGxheWVyIGxpYnJhcmllcywgaW5jbHVkaW5nIHZhbGlkYXRpb24gbGF5ZXJzIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgSUNELgotCi1UaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIHJlcG9zaXRvcnk6Ci0tIFZ1bGthbiBoZWFkZXIgZmlsZXMKLS0gWypJQ0QgTG9hZGVyKl0obG9hZGVyLykKLS0gWypWYWxpZGF0aW9uIExheWVycypdKGxheWVycy8pCi0tIERlbW9zIGFuZCB0ZXN0cyBmb3IgdGhlIGxvYWRlciBhbmQgdmFsaWRhdGlvbiBsYXllcnMKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeSBvdmVyIGFuZCBhYm92ZSB3aGF0IGlzIG1pcnJvcmVkIGZyb20gVnVsa2FuLUxvYWRlckFuZFZhbGlkYXRpb25MYXllcnMgcmVwb3NpdG9yeQorLSBBcGlfZHVtcCwgc2NyZWVuc2hvdCBhbmQgZXhhbXBsZSBsYXllcnMgKGxheWVyc3Z0LykKKy0gSW50ZWwgc2FtcGxlIGRyaXZlciBhbmQgbnVsbCBkcml2ZXIgKGljZC8pCistIHRlc3RzIGZvciB0aGUgSW50ZWwgSWxvIHNhbXBsZSBkcml2ZXIgKHRlc3RzLykKKy0gdmt0cmFjZSBhbmQgdmtyZXBsYXksIEFQSSBjYXB0dXJlIGFuZCByZXBsYXkgICh2a3RyYWNlLykKIAogIyMgQ29udHJpYnV0aW5nCiAKIElmIHlvdSBpbnRlbmQgdG8gY29udHJpYnV0ZSwgdGhlIHByZWZlcnJlZCB3b3JrIGZsb3cgaXMgZm9yIHlvdSB0byBkZXZlbG9wIHlvdXIgY29udHJpYnV0aW9uCiBpbiBhIGZvcmsgb2YgdGhpcyByZXBvIGluIHlvdXIgR2l0SHViIGFjY291bnQgYW5kIHRoZW4gc3VibWl0IGEgcHVsbCByZXF1ZXN0LgotUGxlYXNlIHNlZSB0aGUgW0NPTlRSSUJVVElOR10oQ09OVFJJQlVUSU5HLm1kKSBmaWxlIGluIHRoaXMgcmVzcG9zaXRvcnkgZm9yIG1vcmUgZGV0YWlscworUGxlYXNlIHNlZSB0aGUgW0NPTlRSSUJVVElOR10oQ09OVFJJQlVUSU5HLm1kKSBmaWxlIGluIHRoaXMgcmVzcG9zaXRvcnkgZm9yIG1vcmUgZGV0YWlscy4KIAogIyMgSG93IHRvIEJ1aWxkIGFuZCBSdW4KIAotW0JVSUxELm1kXShCVUlMRC5tZCkKLWluY2x1ZGVzIGRpcmVjdGlvbnMgZm9yIGJ1aWxkaW5nIGFsbCB0aGUgY29tcG9uZW50cywgcnVubmluZyB0aGUgdmFsaWRhdGlvbiB0ZXN0cyBhbmQgcnVubmluZyB0aGUgZGVtbyBhcHBsaWNhdGlvbnMuCitbQlVJTERWVC5tZF0oQlVJTERWVC5tZCkKK2luY2x1ZGVzIGRpcmVjdGlvbnMgZm9yIGJ1aWxkaW5nIGFsbCB0aGUgY29tcG9uZW50cywgcnVubmluZyB0aGUgdGVzdHMgYW5kIHJ1bm5pbmcgdGhlIGRlbW8gYXBwbGljYXRpb25zLgogCi1JbmZvcm1hdGlvbiBvbiBob3cgdG8gZW5hYmxlIHRoZSB2YXJpb3VzIFZhbGlkYXRpb24gbGF5ZXJzIGlzIGluCitJbmZvcm1hdGlvbiBvbiBob3cgdG8gZW5hYmxlIHRoZSB2YXJpb3VzIGxheWVycyBpcyBpbgogW2xheWVycy9SRUFETUUubWRdKGxheWVycy9SRUFETUUubWQpLgogCiBBcmNoaXRlY3R1cmUgYW5kIGludGVyZmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGxvYWRlciBpcyBpbgpAQCAtNTUsNCArNTAsMyBAQAogcHJvamVjdCBkZXZlbG9wbWVudDsgR29vZ2xlIHByb3ZpZGluZyBzaWduaWZpY2FudCBjb250cmlidXRpb25zIHRvIHRoZSB2YWxpZGF0aW9uIGxheWVyczsKIEtocm9ub3MgcHJvdmlkaW5nIG92ZXJzaWdodCBhbmQgaG9zdGluZyBvZiB0aGUgcHJvamVjdC4KIAotCmRpZmYgLS1naXQgYS9hcGlfZHVtcF9nZW5lcmF0b3IucHkgYi9hcGlfZHVtcF9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMzgxZAotLS0gL2Rldi9udWxsCisrKyBiL2FwaV9kdW1wX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDEzNzAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMyAtaQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yOiBMZW5ueSBLb21vdyA8bGVubnlAbHVuYXJnLmNvbT4KKyMKKyMgVGhlIEFQSSBkdW1wIGxheWVyIHdvcmtzIGJ5IHBhc3NpbmcgY3VzdG9tIGZvcm1hdCBzdHJpbmdzIHRvIHRoZSBBcGlEdW1wR2VuZXJhdG9yLiBUaGVzZSBmb3JtYXQKKyMgc3RyaW5ncyBhcmUgQysrIGNvZGUsIHdpdGggMy1pc2ggZXhjZXB0aW9uczoKKyMgICAqIEFueXRoaW5nIGJlZ2lubmluZyB3aXRoIEAgd2lsbCBiZSBleHBhbmRlZCBieSB0aGUgQXBpRHVtcEdlbmVyYXRvci4gVGhlc2UgYXJlIHVzZWQgdG8gYWxsb3cKKyMgICAgICAgaXRlcmF0aW9uIG92ZXIgdmFyaW91cyBpdGVtcyB3aXRoaW4gdGhlIFZ1bGthbiBzcGVjLCB1c2NoIGFzIGZ1bmN0aW9ucywgZW51bXMsIGV0Yy4KKyMgICAqIEFueXRoaW5nIHN1cnJvdW5kZWQgYnkgeyBhbmQgfSB3aWxsIGJlIHN1YnN0aXR1dGVkIHdoZW4gdGhlIEFwaUR1bXBHZW5lcmF0b3IgZXhwYW5kcyB0aGUgQAorIyAgICAgICBkaXJlY3RpdmVzLiBUaGlzIGdpdmVzIGEgd2F5IHRvIGdldCB0aGluZ3MgbGlrZSBkYXRhIHR5cGVzIG9yIG5hbWVzIGZvciBhbnl0aGluZyB0aGF0IGNhbgorIyAgICAgICBiZSBpdGVyYXRlZCBvdmVyIGluIGFuIEAgZGlyZWN0aXZlLgorIyAgICogQ3VybHkgYnJhY2VzIG11c3QgYmUgZG91YmxlZCBsaWtlIHt7IGZvciBhIHNpbmdsZSBjdXJseSBicmFjZSB0byBhcHBlYXIgaW4gdGhlIG91dHB1dCBjb2RlLgorIworIyBUaGUgQVBJIGR1bXAgdXNlcyBzZXBhcmF0ZSBmb3JtYXQgc3RyaW5ncyBmb3IgZWFjaCBvdXRwdXQgZmlsZSwgYnV0IHBhc3NlcyB0aGVtIHRvIGEgY29tbW9uCisjIGdlbmVyYXRvci4gVGhpcyBhbGxvd3MgZ3JlYXRlciBmbGV4aWJpbGl0eSwgYXMgY2hhbmdpbmcgdGhlIG91dHB1dCBjb2RlZ2VuIG1lYW5zIGp1c3QgY2hhbmdpbmcKKyMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IHN0cmluZy4KKyMKKyMgQ3VycmVudGx5LCB0aGUgQVBJIGR1bXAgbGF5ZXIgZ2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgZmlsZXMgZnJvbSB0aGUgZm9sbG93aW5nIHN0cmluZ3M6CisjICAgKiBhcGlfZHVtcC5jcHA6IENPTU1PTl9DT0RFR0VOIC0gUHJvdmlkZXMgYWxsIGVudHJ5cG9pbnRzIGZvciBmdW5jdGlvbnMgYW5kIGRpc3BhdGNoZXMgdGhlIGNhbGxzCisjICAgICAgIHRvIHRoZSBwcm9wZXIgYmFjayBlbmQKKyMgICAqIGFwaV9kdW1wX3RleHQuaDogVEVYVF9DT0RFR0VOIC0gUHJvdmlkZXMgdGhlIGJhY2sgZW5kIGZvciBkdW1waW5nIHRvIGEgdGV4dCBmaWxlCisjCisKK2ltcG9ydCBnZW5lcmF0b3IgYXMgZ2VuCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB4bWwuZXRyZWU7CisKK0NPTU1PTl9DT0RFR0VOID0gIiIiCisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTGVubnkgS29tb3cgPGxlbm55QGx1bmFyZy5jb20+CisgKi8KKyAKKy8qCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuCisgKi8KKyAKKyNpbmNsdWRlICJhcGlfZHVtcF90ZXh0LmgiCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRHVtcCBGdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jUmV0dXJufScgIT0gJ3ZvaWQnKQoraW5saW5lIHZvaWQgZHVtcF97ZnVuY05hbWV9KEFwaUR1bXBJbnN0YW5jZSYgZHVtcF9pbnN0LCB7ZnVuY1JldHVybn0gcmVzdWx0LCB7ZnVuY1R5cGVkUGFyYW1zfSkKK3t7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KGR1bXBfaW5zdC5vdXRwdXRNdXRleCgpKTsKKyAgICBzd2l0Y2goZHVtcF9pbnN0LnNldHRpbmdzKCkuZm9ybWF0KCkpCisgICAge3sKKyAgICBjYXNlIEFwaUR1bXBGb3JtYXQ6OlRleHQ6CisgICAgICAgIGR1bXBfdGV4dF97ZnVuY05hbWV9KGR1bXBfaW5zdCwgcmVzdWx0LCB7ZnVuY05hbWVkUGFyYW1zfSk7CisgICAgICAgIGJyZWFrOworICAgIH19CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoZHVtcF9pbnN0Lm91dHB1dE11dGV4KCkpOworfX0KK0BlbmQgZnVuY3Rpb24KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jUmV0dXJufScgPT0gJ3ZvaWQnKQoraW5saW5lIHZvaWQgZHVtcF97ZnVuY05hbWV9KEFwaUR1bXBJbnN0YW5jZSYgZHVtcF9pbnN0LCB7ZnVuY1R5cGVkUGFyYW1zfSkKK3t7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KGR1bXBfaW5zdC5vdXRwdXRNdXRleCgpKTsKKyAgICBzd2l0Y2goZHVtcF9pbnN0LnNldHRpbmdzKCkuZm9ybWF0KCkpCisgICAge3sKKyAgICBjYXNlIEFwaUR1bXBGb3JtYXQ6OlRleHQ6CisgICAgICAgIGR1bXBfdGV4dF97ZnVuY05hbWV9KGR1bXBfaW5zdCwge2Z1bmNOYW1lZFBhcmFtc30pOworICAgICAgICBicmVhazsKKyAgICB9fQorICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KGR1bXBfaW5zdC5vdXRwdXRNdXRleCgpKTsKK319CitAZW5kIGZ1bmN0aW9uCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQVBJIEVudHJ5UG9pbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8gU3BlY2lmaWNhbGx5IGltcGxlbWVudGVkIGZ1bmN0aW9ucworCitAZm9yZWFjaCBmdW5jdGlvbiB3aGVyZSgne2Z1bmNOYW1lfScgPT0gJ3ZrQ3JlYXRlSW5zdGFuY2UnKQorVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIge2Z1bmNSZXR1cm59IFZLQVBJX0NBTEwge2Z1bmNOYW1lfSh7ZnVuY1R5cGVkUGFyYW1zfSkKK3t7CisgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyCisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyogY2hhaW5faW5mbyA9IGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pOworICAgIGFzc2VydChjaGFpbl9pbmZvLT51LnBMYXllckluZm8gIT0gMCk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdldEluc3RhbmNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIGFzc2VydChmcEdldEluc3RhbmNlUHJvY0FkZHIgIT0gMCk7CisgICAgUEZOX3ZrQ3JlYXRlSW5zdGFuY2UgZnBDcmVhdGVJbnN0YW5jZSA9IChQRk5fdmtDcmVhdGVJbnN0YW5jZSkgZnBHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZUluc3RhbmNlIik7CisgICAgaWYoZnBDcmVhdGVJbnN0YW5jZSA9PSBOVUxMKSB7eworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH19CisgICAgCisgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gYW5kIGNyZWF0ZSB0aGUgZGlzcGF0Y2ggdGFibGUKKyAgICBjaGFpbl9pbmZvLT51LnBMYXllckluZm8gPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBOZXh0OworICAgIHtmdW5jUmV0dXJufSByZXN1bHQgPSBmcENyZWF0ZUluc3RhbmNlKHtmdW5jTmFtZWRQYXJhbXN9KTsKKyAgICBpZihyZXN1bHQgPT0gVktfU1VDQ0VTUykge3sKKyAgICAgICAgaW5pdEluc3RhbmNlVGFibGUoKnBJbnN0YW5jZSwgZnBHZXRJbnN0YW5jZVByb2NBZGRyKTsKKyAgICB9fQorCisgICAgLy8gT3V0cHV0IHRoZSBBUEkgZHVtcAorICAgIGR1bXBfe2Z1bmNOYW1lfShBcGlEdW1wSW5zdGFuY2U6OmN1cnJlbnQoKSwgcmVzdWx0LCB7ZnVuY05hbWVkUGFyYW1zfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK319CitAZW5kIGZ1bmN0aW9uCisKK0Bmb3JlYWNoIGZ1bmN0aW9uIHdoZXJlKCd7ZnVuY05hbWV9JyA9PSAndmtEZXN0cm95SW5zdGFuY2UnKQorVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIge2Z1bmNSZXR1cm59IFZLQVBJX0NBTEwge2Z1bmNOYW1lfSh7ZnVuY1R5cGVkUGFyYW1zfSkKK3t7CisgICAgLy8gRGVzdHJveSB0aGUgZGlzcGF0Y2ggdGFibGUKKyAgICBkaXNwYXRjaF9rZXkga2V5ID0gZ2V0X2Rpc3BhdGNoX2tleSh7ZnVuY0Rpc3BhdGNoUGFyYW19KTsKKyAgICBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZSh7ZnVuY0Rpc3BhdGNoUGFyYW19KS0+RGVzdHJveUluc3RhbmNlKHtmdW5jTmFtZWRQYXJhbXN9KTsKKyAgICBkZXN0cm95X2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGtleSk7CisgICAgCisgICAgLy8gT3V0cHV0IHRoZSBBUEkgZHVtcAorICAgIGR1bXBfe2Z1bmNOYW1lfShBcGlEdW1wSW5zdGFuY2U6OmN1cnJlbnQoKSwge2Z1bmNOYW1lZFBhcmFtc30pOworfX0KK0BlbmQgZnVuY3Rpb24KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jTmFtZX0nID09ICd2a0NyZWF0ZURldmljZScpCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB7ZnVuY1JldHVybn0gVktBUElfQ0FMTCB7ZnVuY05hbWV9KHtmdW5jVHlwZWRQYXJhbXN9KQore3sKKyAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyogY2hhaW5faW5mbyA9IGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pOworICAgIGFzc2VydChjaGFpbl9pbmZvLT51LnBMYXllckluZm8gIT0gMCk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdldEluc3RhbmNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGZwR2V0RGV2aWNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXREZXZpY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgZnBDcmVhdGVEZXZpY2UgPSAoUEZOX3ZrQ3JlYXRlRGV2aWNlKSBmcEdldEluc3RhbmNlUHJvY0FkZHIoTlVMTCwgInZrQ3JlYXRlRGV2aWNlIik7CisgICAgaWYoZnBDcmVhdGVEZXZpY2UgPT0gTlVMTCkge3sKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9fQorICAgIAorICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIGFuZCBjcmVhdGUgdGhlIGRpc3BhdGNoIHRhYmxlCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKyAgICB7ZnVuY1JldHVybn0gcmVzdWx0ID0gZnBDcmVhdGVEZXZpY2Uoe2Z1bmNOYW1lZFBhcmFtc30pOworICAgIGlmKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7eworICAgICAgICBpbml0RGV2aWNlVGFibGUoKnBEZXZpY2UsIGZwR2V0RGV2aWNlUHJvY0FkZHIpOworICAgIH19CisgICAgCisgICAgLy8gT3V0cHV0IHRoZSBBUEkgZHVtcAorICAgIGR1bXBfe2Z1bmNOYW1lfShBcGlEdW1wSW5zdGFuY2U6OmN1cnJlbnQoKSwgcmVzdWx0LCB7ZnVuY05hbWVkUGFyYW1zfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK319CitAZW5kIGZ1bmN0aW9uCisKK0Bmb3JlYWNoIGZ1bmN0aW9uIHdoZXJlKCd7ZnVuY05hbWV9JyA9PSAndmtEZXN0cm95RGV2aWNlJykKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHtmdW5jUmV0dXJufSBWS0FQSV9DQUxMIHtmdW5jTmFtZX0oe2Z1bmNUeXBlZFBhcmFtc30pCit7eworICAgIC8vIERlc3Ryb3kgdGhlIGRpc3BhdGNoIHRhYmxlCisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoe2Z1bmNEaXNwYXRjaFBhcmFtfSk7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKHtmdW5jRGlzcGF0Y2hQYXJhbX0pLT5EZXN0cm95RGV2aWNlKHtmdW5jTmFtZWRQYXJhbXN9KTsKKyAgICBkZXN0cm95X2RldmljZV9kaXNwYXRjaF90YWJsZShrZXkpOworICAgIAorICAgIC8vIE91dHB1dCB0aGUgQVBJIGR1bXAKKyAgICBkdW1wX3tmdW5jTmFtZX0oQXBpRHVtcEluc3RhbmNlOjpjdXJyZW50KCksIHtmdW5jTmFtZWRQYXJhbXN9KTsKK319CitAZW5kIGZ1bmN0aW9uCisKK0Bmb3JlYWNoIGZ1bmN0aW9uIHdoZXJlKCd7ZnVuY05hbWV9JyA9PSAndmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMnKQorVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIge2Z1bmNSZXR1cm59IFZLQVBJX0NBTEwge2Z1bmNOYW1lfSh7ZnVuY1R5cGVkUGFyYW1zfSkKK3t7CisgICAgcmV0dXJuIHV0aWxfR2V0RXh0ZW5zaW9uUHJvcGVydGllcygwLCBOVUxMLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfX0KK0BlbmQgZnVuY3Rpb24KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jTmFtZX0nID09ICd2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJykKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHtmdW5jUmV0dXJufSBWS0FQSV9DQUxMIHtmdW5jTmFtZX0oe2Z1bmNUeXBlZFBhcmFtc30pCit7eworICAgIHN0YXRpYyBjb25zdCBWa0xheWVyUHJvcGVydGllcyBsYXllclByb3BlcnRpZXNbXSA9IHt7CisgICAgICAgIHt7CisgICAgICAgICAgICAiVktfTEFZRVJfTFVOQVJHX2FwaV9kdW1wIiwKKyAgICAgICAgICAgIFZLX01BS0VfVkVSU0lPTigxLCAwLCBWS19IRUFERVJfVkVSU0lPTiksIC8vIHNwZWNWZXJzaW9uCisgICAgICAgICAgICBWS19NQUtFX1ZFUlNJT04oMCwgMiwgMCksIC8vIGltcGxlbWVudGF0aW9uVmVyc2lvbgorICAgICAgICAgICAgImxheWVyOiBhcGlfZHVtcCIsCisgICAgICAgIH19CisgICAgfX07CisgICAgCisgICAgcmV0dXJuIHV0aWxfR2V0TGF5ZXJQcm9wZXJ0aWVzKEFSUkFZX1NJWkUobGF5ZXJQcm9wZXJ0aWVzKSwgbGF5ZXJQcm9wZXJ0aWVzLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfX0KK0BlbmQgZnVuY3Rpb24KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jTmFtZX0nID09ICd2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcycpCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB7ZnVuY1JldHVybn0gVktBUElfQ0FMTCB7ZnVuY05hbWV9KHtmdW5jVHlwZWRQYXJhbXN9KQore3sKKyAgICBzdGF0aWMgY29uc3QgVmtMYXllclByb3BlcnRpZXMgbGF5ZXJQcm9wZXJ0aWVzW10gPSB7eworICAgICAgICB7eworICAgICAgICAgICAgIlZLX0xBWUVSX0xVTkFSR19hcGlfZHVtcCIsCisgICAgICAgICAgICBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pLAorICAgICAgICAgICAgVktfTUFLRV9WRVJTSU9OKDAsIDIsIDApLAorICAgICAgICAgICAgImxheWVyOiBhcGlfZHVtcCIsCisgICAgICAgIH19CisgICAgfX07CisgICAgCisgICAgcmV0dXJuIHV0aWxfR2V0TGF5ZXJQcm9wZXJ0aWVzKEFSUkFZX1NJWkUobGF5ZXJQcm9wZXJ0aWVzKSwgbGF5ZXJQcm9wZXJ0aWVzLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfX0KK0BlbmQgZnVuY3Rpb24KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jTmFtZX0nID09ICd2a1F1ZXVlUHJlc2VudEtIUicpCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB7ZnVuY1JldHVybn0gVktBUElfQ0FMTCB7ZnVuY05hbWV9KHtmdW5jVHlwZWRQYXJhbXN9KQore3sKKyAgICB7ZnVuY1JldHVybn0gcmVzdWx0ID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKHtmdW5jRGlzcGF0Y2hQYXJhbX0pLT57ZnVuY1Nob3J0TmFtZX0oe2Z1bmNOYW1lZFBhcmFtc30pOworICAgIGR1bXBfe2Z1bmNOYW1lfShBcGlEdW1wSW5zdGFuY2U6OmN1cnJlbnQoKSwgcmVzdWx0LCB7ZnVuY05hbWVkUGFyYW1zfSk7CisgICAgQXBpRHVtcEluc3RhbmNlOjpjdXJyZW50KCkubmV4dEZyYW1lKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK319CitAZW5kIGZ1bmN0aW9uCisKKy8vIEF1dG9nZW4gaW5zdGFuY2UgZnVuY3Rpb25zCisKK0Bmb3JlYWNoIGZ1bmN0aW9uIHdoZXJlKCd7ZnVuY1R5cGV9JyA9PSAnaW5zdGFuY2UnIGFuZCAne2Z1bmNSZXR1cm59JyAhPSAndm9pZCcgYW5kICd7ZnVuY05hbWV9JyBub3QgaW4gWyd2a0NyZWF0ZUluc3RhbmNlJywgJ3ZrRGVzdHJveUluc3RhbmNlJywgJ3ZrQ3JlYXRlRGV2aWNlJywgJ3ZrR2V0SW5zdGFuY2VQcm9jQWRkcicsICd2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMnLCAndmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMnXSkKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHtmdW5jUmV0dXJufSBWS0FQSV9DQUxMIHtmdW5jTmFtZX0oe2Z1bmNUeXBlZFBhcmFtc30pCit7eworICAgIHtmdW5jUmV0dXJufSByZXN1bHQgPSBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZSh7ZnVuY0Rpc3BhdGNoUGFyYW19KS0+e2Z1bmNTaG9ydE5hbWV9KHtmdW5jTmFtZWRQYXJhbXN9KTsKKyAgICBkdW1wX3tmdW5jTmFtZX0oQXBpRHVtcEluc3RhbmNlOjpjdXJyZW50KCksIHJlc3VsdCwge2Z1bmNOYW1lZFBhcmFtc30pOworICAgIHJldHVybiByZXN1bHQ7Cit9fQorQGVuZCBmdW5jdGlvbgorCitAZm9yZWFjaCBmdW5jdGlvbiB3aGVyZSgne2Z1bmNUeXBlfScgPT0gJ2luc3RhbmNlJyBhbmQgJ3tmdW5jUmV0dXJufScgPT0gJ3ZvaWQnIGFuZCAne2Z1bmNOYW1lfScgbm90IGluIFsndmtDcmVhdGVJbnN0YW5jZScsICd2a0Rlc3Ryb3lJbnN0YW5jZScsICd2a0NyZWF0ZURldmljZScsICd2a0dldEluc3RhbmNlUHJvY0FkZHInLCAndmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywgJ3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzJ10pCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB7ZnVuY1JldHVybn0gVktBUElfQ0FMTCB7ZnVuY05hbWV9KHtmdW5jVHlwZWRQYXJhbXN9KQore3sKKyAgICBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZSh7ZnVuY0Rpc3BhdGNoUGFyYW19KS0+e2Z1bmNTaG9ydE5hbWV9KHtmdW5jTmFtZWRQYXJhbXN9KTsKKyAgICBkdW1wX3tmdW5jTmFtZX0oQXBpRHVtcEluc3RhbmNlOjpjdXJyZW50KCksIHtmdW5jTmFtZWRQYXJhbXN9KTsKK319CitAZW5kIGZ1bmN0aW9uCisKKy8vIEF1dG9nZW4gZGV2aWNlIGZ1bmN0aW9ucworCitAZm9yZWFjaCBmdW5jdGlvbiB3aGVyZSgne2Z1bmNUeXBlfScgPT0gJ2RldmljZScgYW5kICd7ZnVuY1JldHVybn0nICE9ICd2b2lkJyBhbmQgJ3tmdW5jTmFtZX0nIG5vdCBpbiBbJ3ZrRGVzdHJveURldmljZScsICd2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsICd2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJywgJ3ZrUXVldWVQcmVzZW50S0hSJywgJ3ZrR2V0RGV2aWNlUHJvY0FkZHInXSkKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHtmdW5jUmV0dXJufSBWS0FQSV9DQUxMIHtmdW5jTmFtZX0oe2Z1bmNUeXBlZFBhcmFtc30pCit7eworICAgIHtmdW5jUmV0dXJufSByZXN1bHQgPSBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoe2Z1bmNEaXNwYXRjaFBhcmFtfSktPntmdW5jU2hvcnROYW1lfSh7ZnVuY05hbWVkUGFyYW1zfSk7CisgICAgZHVtcF97ZnVuY05hbWV9KEFwaUR1bXBJbnN0YW5jZTo6Y3VycmVudCgpLCByZXN1bHQsIHtmdW5jTmFtZWRQYXJhbXN9KTsKKyAgICByZXR1cm4gcmVzdWx0OworfX0KK0BlbmQgZnVuY3Rpb24KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jVHlwZX0nID09ICdkZXZpY2UnIGFuZCAne2Z1bmNSZXR1cm59JyA9PSAndm9pZCcgYW5kICd7ZnVuY05hbWV9JyBub3QgaW4gWyd2a0Rlc3Ryb3lEZXZpY2UnLCAndmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMnLCAndmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcycsICd2a0dldERldmljZVByb2NBZGRyJ10pCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB7ZnVuY1JldHVybn0gVktBUElfQ0FMTCB7ZnVuY05hbWV9KHtmdW5jVHlwZWRQYXJhbXN9KQore3sKKyAgICBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoe2Z1bmNEaXNwYXRjaFBhcmFtfSktPntmdW5jU2hvcnROYW1lfSh7ZnVuY05hbWVkUGFyYW1zfSk7CisgICAgZHVtcF97ZnVuY05hbWV9KEFwaUR1bXBJbnN0YW5jZTo6Y3VycmVudCgpLCB7ZnVuY05hbWVkUGFyYW1zfSk7Cit9fQorQGVuZCBmdW5jdGlvbgorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciogcE5hbWUpCit7eworICAgIEBmb3JlYWNoIGZ1bmN0aW9uIHdoZXJlKCd7ZnVuY1R5cGV9JyA9PSAnaW5zdGFuY2UnICBhbmQgJ3tmdW5jTmFtZX0nIG5vdCBpbiBbICd2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMnIF0pCisgICAgaWYoc3RyY21wKHBOYW1lLCAie2Z1bmNOYW1lfSIpID09IDApCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4oe2Z1bmNOYW1lfSk7CisgICAgQGVuZCBmdW5jdGlvbgorICAgIAorICAgIGlmKGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlKS0+R2V0SW5zdGFuY2VQcm9jQWRkciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoaW5zdGFuY2UpLT5HZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCBwTmFtZSk7Cit9fQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgY2hhciogcE5hbWUpCit7eworICAgIEBmb3JlYWNoIGZ1bmN0aW9uIHdoZXJlKCd7ZnVuY1R5cGV9JyA9PSAnZGV2aWNlJykKKyAgICBpZihzdHJjbXAocE5hbWUsICJ7ZnVuY05hbWV9IikgPT0gMCkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih7ZnVuY05hbWV9KTsKKyAgICBAZW5kIGZ1bmN0aW9uCisgICAgCisgICAgaWYoZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkdldERldmljZVByb2NBZGRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBkZXZpY2VfZGlzcGF0Y2hfdGFibGUoZGV2aWNlKS0+R2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlLCBwTmFtZSk7Cit9fQorIiIiCisKK1RFWFRfQ09ERUdFTiA9ICIiIgorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IExlbm55IEtvbW93IDxsZW5ueUBsdW5hcmcuY29tPgorICovCisgCisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIFZ1bGthbiBYTUwgQVBJIFJlZ2lzdHJ5LgorICovCisgCisjcHJhZ21hIG9uY2UKKyAKKyNpbmNsdWRlICJhcGlfZHVtcC5oIgorCitAZm9yZWFjaCBzdHJ1Y3QKK3N0ZDo6b3N0cmVhbSYgZHVtcF90ZXh0X3tzY3ROYW1lfShjb25zdCB7c2N0TmFtZX0mIG9iamVjdCwgY29uc3QgQXBpRHVtcFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGluZGVudHMpOworQGVuZCBzdHJ1Y3QKK0Bmb3JlYWNoIHVuaW9uCitzdGQ6Om9zdHJlYW0mIGR1bXBfdGV4dF97dW5OYW1lfShjb25zdCB7dW5OYW1lfSYgb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MmIHNldHRpbmdzLCBpbnQgaW5kZW50cyk7CitAZW5kIHVuaW9uCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09IFR5cGUgSW1wbGVtZW50YXRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworQGZvcmVhY2ggdHlwZSB3aGVyZSgne2V0eU5hbWV9JyAhPSAndm9pZCcpCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBkdW1wX3RleHRfe2V0eU5hbWV9KHtldHlOYW1lfSBvYmplY3QsIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBpbmRlbnRzKQore3sKKyAgICBAaWYoJ3tldHlOYW1lfScgIT0gJ3VpbnQ4X3QnKQorICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKSA8PCBvYmplY3Q7CisgICAgQGVuZCBpZgorICAgIEBpZigne2V0eU5hbWV9JyA9PSAndWludDhfdCcpCisgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpIDw8ICh1aW50MzJfdCkgb2JqZWN0OworICAgIEBlbmQgaWYKK319CitAZW5kIHR5cGUKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09IEJhc2V0eXBlIEltcGxlbWVudGF0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT0vLworCitAZm9yZWFjaCBiYXNldHlwZQoraW5saW5lIHN0ZDo6b3N0cmVhbSYgZHVtcF90ZXh0X3tiYXNlTmFtZX0oe2Jhc2VOYW1lfSBvYmplY3QsIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBpbmRlbnRzKQore3sKKyAgICByZXR1cm4gc2V0dGluZ3Muc3RyZWFtKCkgPDwgb2JqZWN0OworfX0KK0BlbmQgYmFzZXR5cGUKKworLy89PT09PT09PT09PT09PT09PT09PT09PSBTeXN0ZW0gVHlwZSBJbXBsZW1lbnRhdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT0vLworCitAZm9yZWFjaCBzeXN0eXBlCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBkdW1wX3RleHRfe3N5c05hbWV9KGNvbnN0IHtzeXNUeXBlfSBvYmplY3QsIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBpbmRlbnRzKQore3sKKyAgICByZXR1cm4gc2V0dGluZ3Muc3RyZWFtKCkgPDwgb2JqZWN0OworfX0KK0BlbmQgc3lzdHlwZQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09IEhhbmRsZSBJbXBsZW1lbnRhdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKK0Bmb3JlYWNoIGhhbmRsZQoraW5saW5lIHN0ZDo6b3N0cmVhbSYgZHVtcF90ZXh0X3toZGxOYW1lfShjb25zdCB7aGRsTmFtZX0gb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MmIHNldHRpbmdzLCBpbnQgaW5kZW50cykKK3t7CisgICAgaWYoc2V0dGluZ3Muc2hvd0FkZHJlc3MoKSkKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpIDw8IG9iamVjdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiYWRkcmVzcyI7Cit9fQorQGVuZCBoYW5kbGUKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT0gRW51bSBJbXBsZW1lbnRhdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCitAZm9yZWFjaCBlbnVtCitzdGQ6Om9zdHJlYW0mIGR1bXBfdGV4dF97ZW51bU5hbWV9KHtlbnVtTmFtZX0gb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MmIHNldHRpbmdzLCBpbnQgaW5kZW50cykKK3t7CisgICAgc3dpdGNoKChpbnQ2NF90KSBvYmplY3QpCisgICAge3sKKyAgICBAZm9yZWFjaCBvcHRpb24KKyAgICBjYXNlIHtvcHRWYWx1ZX06CisgICAgICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8ICJ7b3B0TmFtZX0gKCI7CisgICAgICAgIGJyZWFrOworICAgIEBlbmQgb3B0aW9uCisgICAgZGVmYXVsdDoKKyAgICAgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgIlVOS05PV04gKCI7CisgICAgfX0KKyAgICByZXR1cm4gc2V0dGluZ3Muc3RyZWFtKCkgPDwgb2JqZWN0IDw8ICIpIjsKK319CitAZW5kIGVudW0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09IEJpdG1hc2sgSW1wbGVtZW50YXRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT0vLworCitAZm9yZWFjaCBiaXRtYXNrCitzdGQ6Om9zdHJlYW0mIGR1bXBfdGV4dF97Yml0TmFtZX0oe2JpdE5hbWV9IG9iamVjdCwgY29uc3QgQXBpRHVtcFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGluZGVudHMpCit7eworICAgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICAgIC8vc2V0dGluZ3MuZm9ybWF0TmFtZVR5cGUoc3RyZWFtLCBpbmRlbnRzLCBuYW1lLCB0eXBlX3N0cmluZykgPDwgb2JqZWN0OworICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8IG9iamVjdDsKKyAgICBAZm9yZWFjaCBvcHRpb24KKyAgICBpZihvYmplY3QgJiB7b3B0VmFsdWV9KQorICAgICAgICBpc19maXJzdCA9IGR1bXBfdGV4dF9iaXRtYXNrT3B0aW9uKCJ7b3B0TmFtZX0iLCBzZXR0aW5ncy5zdHJlYW0oKSwgaXNfZmlyc3QpOworICAgIEBlbmQgb3B0aW9uCisgICAgaWYoIWlzX2ZpcnN0KQorICAgICAgICBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiKSI7CisgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpOworfX0KK0BlbmQgYml0bWFzaworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PSBGbGFnIEltcGxlbWVudGF0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKK0Bmb3JlYWNoIGZsYWcgd2hlcmUoJ3tmbGFnRW51bX0nICE9ICdOb25lJykKK2lubGluZSBzdGQ6Om9zdHJlYW0mIGR1bXBfdGV4dF97ZmxhZ05hbWV9KHtmbGFnTmFtZX0gb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MmIHNldHRpbmdzLCBpbnQgaW5kZW50cykKK3t7CisgICAgcmV0dXJuIGR1bXBfdGV4dF97ZmxhZ0VudW19KCh7ZmxhZ0VudW19KSBvYmplY3QsIHNldHRpbmdzLCBpbmRlbnRzKTsKK319CitAZW5kIGZsYWcKK0Bmb3JlYWNoIGZsYWcgd2hlcmUoJ3tmbGFnRW51bX0nID09ICdOb25lJykKK2lubGluZSBzdGQ6Om9zdHJlYW0mIGR1bXBfdGV4dF97ZmxhZ05hbWV9KHtmbGFnTmFtZX0gb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MmIHNldHRpbmdzLCBpbnQgaW5kZW50cykKK3t7CisgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpIDw8IG9iamVjdDsKK319CitAZW5kIGZsYWcKKworLy89PT09PT09PT09PT09PT09PT09PT09PSBGdW5jIFBvaW50ZXIgSW1wbGVtZW50YXRpb25zID09PT09PT09PT09PT09PT09PT09PT0vLworCitAZm9yZWFjaCBmdW5jcG9pbnRlcgoraW5saW5lIHN0ZDo6b3N0cmVhbSYgZHVtcF90ZXh0X3twZm5OYW1lfSh7cGZuTmFtZX0gb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MmIHNldHRpbmdzLCBpbnQgaW5kZW50cykKK3t7CisgICAgaWYoc2V0dGluZ3Muc2hvd0FkZHJlc3MoKSkKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpIDw8IG9iamVjdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiYWRkcmVzcyI7Cit9fQorQGVuZCBmdW5jcG9pbnRlcgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09IFN0cnVjdCBJbXBsZW1lbnRhdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKK0Bmb3JlYWNoIHN0cnVjdCB3aGVyZSgne3NjdE5hbWV9JyAhPSAnVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvJykKK3N0ZDo6b3N0cmVhbSYgZHVtcF90ZXh0X3tzY3ROYW1lfShjb25zdCB7c2N0TmFtZX0mIG9iamVjdCwgY29uc3QgQXBpRHVtcFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGluZGVudHMpCit7eworICAgIGlmKHNldHRpbmdzLnNob3dBZGRyZXNzKCkpCisgICAgICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8ICZvYmplY3QgPDwgIjpcXG4iOworICAgIGVsc2UKKyAgICAgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgImFkZHJlc3M6XFxuIjsKKyAgICAKKyAgICBAZm9yZWFjaCBtZW1iZXIKKyAgICBAaWYoJ3ttZW1Db25kaXRpb259JyAhPSAnTm9uZScpCisgICAgaWYoe21lbUNvbmRpdGlvbn0pCisgICAgQGVuZCBpZgorICAgIAorICAgIEBpZih7bWVtUHRyTGV2ZWx9ID09IDApCisgICAgZHVtcF90ZXh0X3ZhbHVlPGNvbnN0IHttZW1CYXNlVHlwZX0+KG9iamVjdC57bWVtTmFtZX0sIHNldHRpbmdzLCAie21lbVR5cGV9IiwgInttZW1OYW1lfSIsIGluZGVudHMgKyAxLCBkdW1wX3RleHRfe21lbVR5cGVJRH0pOworICAgIEBlbmQgaWYKKyAgICBAaWYoe21lbVB0ckxldmVsfSA9PSAxIGFuZCAne21lbUxlbmd0aH0nID09ICdOb25lJykKKyAgICBkdW1wX3RleHRfcG9pbnRlcjxjb25zdCB7bWVtQmFzZVR5cGV9PihvYmplY3Que21lbU5hbWV9LCBzZXR0aW5ncywgInttZW1UeXBlfSIsICJ7bWVtTmFtZX0iLCBpbmRlbnRzICsgMSwgZHVtcF90ZXh0X3ttZW1UeXBlSUR9KTsKKyAgICBAZW5kIGlmCisgICAgQGlmKHttZW1QdHJMZXZlbH0gPT0gMSBhbmQgJ3ttZW1MZW5ndGh9JyAhPSAnTm9uZScgYW5kIG5vdCB7bWVtTGVuZ3RoSXNNZW1iZXJ9KQorICAgIGR1bXBfdGV4dF9hcnJheTxjb25zdCB7bWVtQmFzZVR5cGV9PihvYmplY3Que21lbU5hbWV9LCB7bWVtTGVuZ3RofSwgc2V0dGluZ3MsICJ7bWVtVHlwZX0iLCAie21lbUNoaWxkVHlwZX0iLCAie21lbU5hbWV9IiwgaW5kZW50cyArIDEsIGR1bXBfdGV4dF97bWVtVHlwZUlEfSk7CisgICAgQGVuZCBpZgorICAgIEBpZih7bWVtUHRyTGV2ZWx9ID09IDEgYW5kICd7bWVtTGVuZ3RofScgIT0gJ05vbmUnIGFuZCB7bWVtTGVuZ3RoSXNNZW1iZXJ9KQorICAgIGR1bXBfdGV4dF9hcnJheTxjb25zdCB7bWVtQmFzZVR5cGV9PihvYmplY3Que21lbU5hbWV9LCBvYmplY3Que21lbUxlbmd0aH0sIHNldHRpbmdzLCAie21lbVR5cGV9IiwgInttZW1DaGlsZFR5cGV9IiwgInttZW1OYW1lfSIsIGluZGVudHMgKyAxLCBkdW1wX3RleHRfe21lbVR5cGVJRH0pOworICAgIEBlbmQgaWYKKyAgICAKKyAgICBAaWYoJ3ttZW1Db25kaXRpb259JyAhPSAnTm9uZScpCisgICAgZWxzZQorICAgICAgICBkdW1wX3RleHRfc3BlY2lhbCgiVU5VU0VEIiwgc2V0dGluZ3MsICJ7bWVtVHlwZX0iLCAie21lbU5hbWV9IiwgaW5kZW50cyArIDEpOworICAgIEBlbmQgaWYKKyAgICBAZW5kIG1lbWJlcgorICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKTsKK319CitAZW5kIHN0cnVjdAorCitAZm9yZWFjaCBzdHJ1Y3Qgd2hlcmUoJ3tzY3ROYW1lfScgPT0gJ1ZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbycpCitzdGQ6Om9zdHJlYW0mIGR1bXBfdGV4dF97c2N0TmFtZX0oY29uc3Qge3NjdE5hbWV9JiBvYmplY3QsIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBpbmRlbnRzKQore3sKKyAgICBpZihzZXR0aW5ncy5zaG93QWRkcmVzcygpKQorICAgICAgICBzZXR0aW5ncy5zdHJlYW0oKSA8PCAmb2JqZWN0IDw8ICI6XFxuIjsKKyAgICBlbHNlCisgICAgICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8ICJhZGRyZXNzOlxcbiI7CisgICAgICAgIAorICAgIEBmb3JlYWNoIG1lbWJlcgorICAgIEBpZigne21lbUNvbmRpdGlvbn0nICE9ICdOb25lJykKKyAgICBpZih7bWVtQ29uZGl0aW9ufSkKKyAgICBAZW5kIGlmCisgICAgCisgICAgQGlmKHttZW1QdHJMZXZlbH0gPT0gMCkKKyAgICBkdW1wX3RleHRfdmFsdWU8Y29uc3Qge21lbUJhc2VUeXBlfT4ob2JqZWN0LnttZW1OYW1lfSwgc2V0dGluZ3MsICJ7bWVtVHlwZX0iLCAie21lbU5hbWV9IiwgaW5kZW50cyArIDEsIGR1bXBfdGV4dF97bWVtVHlwZUlEfSk7CisgICAgQGVuZCBpZgorICAgIEBpZih7bWVtUHRyTGV2ZWx9ID09IDEgYW5kICd7bWVtTGVuZ3RofScgPT0gJ05vbmUnKQorICAgIGR1bXBfdGV4dF9wb2ludGVyPGNvbnN0IHttZW1CYXNlVHlwZX0+KG9iamVjdC57bWVtTmFtZX0sIHNldHRpbmdzLCAie21lbVR5cGV9IiwgInttZW1OYW1lfSIsIGluZGVudHMgKyAxLCBkdW1wX3RleHRfe21lbVR5cGVJRH0pOworICAgIEBlbmQgaWYKKyAgICBAaWYoe21lbVB0ckxldmVsfSA9PSAxIGFuZCAne21lbUxlbmd0aH0nICE9ICdOb25lJyBhbmQgbm90IHttZW1MZW5ndGhJc01lbWJlcn0gYW5kICd7bWVtTmFtZX0nICE9ICdwQ29kZScpCisgICAgZHVtcF90ZXh0X2FycmF5PGNvbnN0IHttZW1CYXNlVHlwZX0+KG9iamVjdC57bWVtTmFtZX0sIHttZW1MZW5ndGh9LCBzZXR0aW5ncywgInttZW1UeXBlfSIsICJ7bWVtQ2hpbGRUeXBlfSIsICJ7bWVtTmFtZX0iLCBpbmRlbnRzICsgMSwgZHVtcF90ZXh0X3ttZW1UeXBlSUR9KTsKKyAgICBAZW5kIGlmCisgICAgQGlmKHttZW1QdHJMZXZlbH0gPT0gMSBhbmQgJ3ttZW1MZW5ndGh9JyAhPSAnTm9uZScgYW5kIHttZW1MZW5ndGhJc01lbWJlcn0gYW5kICd7bWVtTmFtZX0nICE9ICdwQ29kZScpCisgICAgZHVtcF90ZXh0X2FycmF5PGNvbnN0IHttZW1CYXNlVHlwZX0+KG9iamVjdC57bWVtTmFtZX0sIG9iamVjdC57bWVtTGVuZ3RofSwgc2V0dGluZ3MsICJ7bWVtVHlwZX0iLCAie21lbUNoaWxkVHlwZX0iLCAie21lbU5hbWV9IiwgaW5kZW50cyArIDEsIGR1bXBfdGV4dF97bWVtVHlwZUlEfSk7CisgICAgQGVuZCBpZgorICAgIEBpZigne21lbU5hbWV9JyA9PSAncENvZGUnKQorICAgIGlmKHNldHRpbmdzLnNob3dTaGFkZXIoKSkKKyAgICAgICAgZHVtcF90ZXh0X2FycmF5PGNvbnN0IHttZW1CYXNlVHlwZX0+KG9iamVjdC57bWVtTmFtZX0sIG9iamVjdC57bWVtTGVuZ3RofSwgc2V0dGluZ3MsICJ7bWVtVHlwZX0iLCAie21lbUNoaWxkVHlwZX0iLCAie21lbU5hbWV9IiwgaW5kZW50cyArIDEsIGR1bXBfdGV4dF97bWVtVHlwZUlEfSk7CisgICAgZWxzZQorICAgICAgICBkdW1wX3RleHRfc3BlY2lhbCgiU0hBREVSIERBVEEiLCBzZXR0aW5ncywgInttZW1UeXBlfSIsICJ7bWVtTmFtZX0iLCBpbmRlbnRzICsgMSk7CisgICAgQGVuZCBpZgorICAgIAorICAgIEBpZigne21lbUNvbmRpdGlvbn0nICE9ICdOb25lJykKKyAgICBlbHNlCisgICAgICAgIGR1bXBfdGV4dF9zcGVjaWFsKCJVTlVTRUQiLCBzZXR0aW5ncywgInttZW1UeXBlfSIsICJ7bWVtTmFtZX0iLCBpbmRlbnRzICsgMSk7CisgICAgQGVuZCBpZgorICAgIEBlbmQgbWVtYmVyCisgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpOworfX0KK0BlbmQgc3RydWN0CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT0gVW5pb24gSW1wbGVtZW50YXRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworQGZvcmVhY2ggdW5pb24KK3N0ZDo6b3N0cmVhbSYgZHVtcF90ZXh0X3t1bk5hbWV9KGNvbnN0IHt1bk5hbWV9JiBvYmplY3QsIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBpbmRlbnRzKQore3sKKyAgICBpZihzZXR0aW5ncy5zaG93QWRkcmVzcygpKQorICAgICAgICBzZXR0aW5ncy5zdHJlYW0oKSA8PCAmb2JqZWN0IDw8ICIgKFVuaW9uKTpcXG4iOworICAgIGVsc2UKKyAgICAgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgImFkZHJlc3MgKFVuaW9uKTpcXG4iOworICAgICAgICAKKyAgICBAZm9yZWFjaCBjaG9pY2UKKyAgICBAaWYoe2NoY1B0ckxldmVsfSA9PSAwKQorICAgIGR1bXBfdGV4dF92YWx1ZTxjb25zdCB7Y2hjQmFzZVR5cGV9PihvYmplY3Que2NoY05hbWV9LCBzZXR0aW5ncywgIntjaGNUeXBlfSIsICJ7Y2hjTmFtZX0iLCBpbmRlbnRzICsgMSwgZHVtcF90ZXh0X3tjaGNUeXBlSUR9KTsKKyAgICBAZW5kIGlmCisgICAgQGlmKHtjaGNQdHJMZXZlbH0gPT0gMSBhbmQgJ3tjaGNMZW5ndGh9JyA9PSAnTm9uZScpCisgICAgZHVtcF90ZXh0X3BvaW50ZXI8Y29uc3Qge2NoY0Jhc2VUeXBlfT4ob2JqZWN0LntjaGNOYW1lfSwgc2V0dGluZ3MsICJ7Y2hjVHlwZX0iLCAie2NoY05hbWV9IiwgaW5kZW50cyArIDEsIGR1bXBfdGV4dF97Y2hjVHlwZUlEfSk7CisgICAgQGVuZCBpZgorICAgIEBpZih7Y2hjUHRyTGV2ZWx9ID09IDEgYW5kICd7Y2hjTGVuZ3RofScgIT0gJ05vbmUnKQorICAgIGR1bXBfdGV4dF9hcnJheTxjb25zdCB7Y2hjQmFzZVR5cGV9PihvYmplY3Que2NoY05hbWV9LCB7Y2hjTGVuZ3RofSwgc2V0dGluZ3MsICJ7Y2hjVHlwZX0iLCAie2NoY0NoaWxkVHlwZX0iLCAie2NoY05hbWV9IiwgaW5kZW50cyArIDEsIGR1bXBfdGV4dF97Y2hjVHlwZUlEfSk7CisgICAgQGVuZCBpZgorICAgIEBlbmQgY2hvaWNlCisgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpOworfX0KK0BlbmQgdW5pb24KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09IEZ1bmN0aW9uIEltcGxlbWVudGF0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT0vLworCitAZm9yZWFjaCBmdW5jdGlvbiB3aGVyZSgne2Z1bmNSZXR1cm59JyAhPSAndm9pZCcpCitzdGQ6Om9zdHJlYW0mIGR1bXBfdGV4dF97ZnVuY05hbWV9KEFwaUR1bXBJbnN0YW5jZSYgZHVtcF9pbnN0LCB7ZnVuY1JldHVybn0gcmVzdWx0LCB7ZnVuY1R5cGVkUGFyYW1zfSkKK3t7CisgICAgY29uc3QgQXBpRHVtcFNldHRpbmdzJiBzZXR0aW5ncyhkdW1wX2luc3Quc2V0dGluZ3MoKSk7CisgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgIlRocmVhZCAiIDw8IGR1bXBfaW5zdC50aHJlYWRJRCgpIDw8ICIsIEZyYW1lICIgPDwgZHVtcF9pbnN0LmZyYW1lQ291bnQoKSA8PCAiOlxcbiI7CisgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgIntmdW5jTmFtZX0oe2Z1bmNOYW1lZFBhcmFtc30pIHJldHVybnMge2Z1bmNSZXR1cm59ICI7CisgICAgZHVtcF90ZXh0X3tmdW5jUmV0dXJufShyZXN1bHQsIHNldHRpbmdzLCAwKSA8PCAiOlxcbiI7CisgICAgCisgICAgaWYoc2V0dGluZ3Muc2hvd1BhcmFtcygpKQorICAgIHt7CisgICAgICAgIEBmb3JlYWNoIHBhcmFtZXRlcgorICAgICAgICBAaWYoe3BybVB0ckxldmVsfSA9PSAwKQorICAgICAgICBkdW1wX3RleHRfdmFsdWU8Y29uc3Qge3BybUJhc2VUeXBlfT4oe3BybU5hbWV9LCBzZXR0aW5ncywgIntwcm1UeXBlfSIsICJ7cHJtTmFtZX0iLCAxLCBkdW1wX3RleHRfe3BybVR5cGVJRH0pOworICAgICAgICBAZW5kIGlmCisgICAgICAgIEBpZih7cHJtUHRyTGV2ZWx9ID09IDEgYW5kICd7cHJtTGVuZ3RofScgPT0gJ05vbmUnKQorICAgICAgICBkdW1wX3RleHRfcG9pbnRlcjxjb25zdCB7cHJtQmFzZVR5cGV9Pih7cHJtTmFtZX0sIHNldHRpbmdzLCAie3BybVR5cGV9IiwgIntwcm1OYW1lfSIsIDEsIGR1bXBfdGV4dF97cHJtVHlwZUlEfSk7CisgICAgICAgIEBlbmQgaWYKKyAgICAgICAgQGlmKHtwcm1QdHJMZXZlbH0gPT0gMSBhbmQgJ3twcm1MZW5ndGh9JyAhPSAnTm9uZScpCisgICAgICAgIGR1bXBfdGV4dF9hcnJheTxjb25zdCB7cHJtQmFzZVR5cGV9Pih7cHJtTmFtZX0sIHtwcm1MZW5ndGh9LCBzZXR0aW5ncywgIntwcm1UeXBlfSIsICJ7cHJtQ2hpbGRUeXBlfSIsICJ7cHJtTmFtZX0iLCAxLCBkdW1wX3RleHRfe3BybVR5cGVJRH0pOworICAgICAgICBAZW5kIGlmCisgICAgICAgIEBlbmQgcGFyYW1ldGVyCisgICAgfX0KKyAgICBzZXR0aW5ncy5zaG91bGRGbHVzaCgpID8gc2V0dGluZ3Muc3RyZWFtKCkgPDwgc3RkOjplbmRsIDogc2V0dGluZ3Muc3RyZWFtKCkgPDwgIlxcbiI7CisgICAgCisgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpOworfX0KK0BlbmQgZnVuY3Rpb24KKworQGZvcmVhY2ggZnVuY3Rpb24gd2hlcmUoJ3tmdW5jUmV0dXJufScgPT0gJ3ZvaWQnKQorc3RkOjpvc3RyZWFtJiBkdW1wX3RleHRfe2Z1bmNOYW1lfShBcGlEdW1wSW5zdGFuY2UmIGR1bXBfaW5zdCwge2Z1bmNUeXBlZFBhcmFtc30pCit7eworICAgIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyYgc2V0dGluZ3MoZHVtcF9pbnN0LnNldHRpbmdzKCkpOworICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8ICJUaHJlYWQgIiA8PCBkdW1wX2luc3QudGhyZWFkSUQoKSA8PCAiLCBGcmFtZSAiIDw8IGR1bXBfaW5zdC5mcmFtZUNvdW50KCkgPDwgIjpcXG4iOworICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8ICJ7ZnVuY05hbWV9KHtmdW5jTmFtZWRQYXJhbXN9KSByZXR1cm5zIHtmdW5jUmV0dXJufTpcXG4iOworICAgIAorICAgIGlmKHNldHRpbmdzLnNob3dQYXJhbXMoKSkKKyAgICB7eworICAgICAgICBAZm9yZWFjaCBwYXJhbWV0ZXIKKyAgICAgICAgQGlmKHtwcm1QdHJMZXZlbH0gPT0gMCkKKyAgICAgICAgZHVtcF90ZXh0X3ZhbHVlPGNvbnN0IHtwcm1CYXNlVHlwZX0+KHtwcm1OYW1lfSwgc2V0dGluZ3MsICJ7cHJtVHlwZX0iLCAie3BybU5hbWV9IiwgMSwgZHVtcF90ZXh0X3twcm1UeXBlSUR9KTsKKyAgICAgICAgQGVuZCBpZgorICAgICAgICBAaWYoe3BybVB0ckxldmVsfSA9PSAxIGFuZCAne3BybUxlbmd0aH0nID09ICdOb25lJykKKyAgICAgICAgZHVtcF90ZXh0X3BvaW50ZXI8Y29uc3Qge3BybUJhc2VUeXBlfT4oe3BybU5hbWV9LCBzZXR0aW5ncywgIntwcm1UeXBlfSIsICJ7cHJtTmFtZX0iLCAxLCBkdW1wX3RleHRfe3BybVR5cGVJRH0pOworICAgICAgICBAZW5kIGlmCisgICAgICAgIEBpZih7cHJtUHRyTGV2ZWx9ID09IDEgYW5kICd7cHJtTGVuZ3RofScgIT0gJ05vbmUnKQorICAgICAgICBkdW1wX3RleHRfYXJyYXk8Y29uc3Qge3BybUJhc2VUeXBlfT4oe3BybU5hbWV9LCB7cHJtTGVuZ3RofSwgc2V0dGluZ3MsICJ7cHJtVHlwZX0iLCAie3BybUNoaWxkVHlwZX0iLCAie3BybU5hbWV9IiwgMSwgZHVtcF90ZXh0X3twcm1UeXBlSUR9KTsKKyAgICAgICAgQGVuZCBpZgorICAgICAgICBAZW5kIHBhcmFtZXRlcgorICAgIH19CisgICAgc2V0dGluZ3Muc2hvdWxkRmx1c2goKSA/IHNldHRpbmdzLnN0cmVhbSgpIDw8IHN0ZDo6ZW5kbCA6IHNldHRpbmdzLnN0cmVhbSgpIDw8ICJcXG4iOworICAgIAorICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKTsKK319CitAZW5kIGZ1bmN0aW9uCisiIiIKKworUE9JTlRFUl9UWVBFUyA9IFsndm9pZCcsICd4Y2JfY29ubmVjdGlvbl90JywgJ0Rpc3BsYXknLCAnU0VDVVJJVFlfQVRUUklCVVRFUycsICdBTmF0aXZlV2luZG93J10KK1ZBTElESVRZX0NIRUNLUyA9IHsKKyAgICAnVmtCdWZmZXJDcmVhdGVJbmZvJzogeworICAgICAgICAncFF1ZXVlRmFtaWx5SW5kaWNlcyc6ICdvYmplY3Quc2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQnLAorICAgIH0sCisgICAgJ1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyc6IHsKKyAgICAgICAgJ3BJbmhlcml0YW5jZUluZm8nOiAnZmFsc2UnLCAgICAjIE5vIGVhc3kgd2F5IHRvIHRlbGwgaWYgdGhpcyBpcyBhIHByaW1hcnkgY29tbWFuZCBidWZmZXIKKyAgICB9LAorICAgICdWa0Rlc2NyaXB0b3JTZXRMYXlvdXRCaW5kaW5nJzogeworICAgICAgICAncEltbXV0YWJsZVNhbXBsZXJzJzoKKyAgICAgICAgICAgICcob2JqZWN0LmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSKSB8fCAnICsKKyAgICAgICAgICAgICcob2JqZWN0LmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSKScsCisgICAgfSwKKyAgICAnVmtJbWFnZUNyZWF0ZUluZm8nOiB7CisgICAgICAgICdwUXVldWVGYW1pbHlJbmRpY2VzJzogJ29iamVjdC5zaGFyaW5nTW9kZSA9PSBWS19TSEFSSU5HX01PREVfQ09OQ1VSUkVOVCcsCisgICAgfSwKKyAgICAnVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvJzogeworICAgICAgICAncFZpZXdwb3J0cyc6ICdmYWxzZScsICAgICAgIyBObyBlYXN5IHdheSB0byBjaGVjayBpZiB2aWV3cG9ydCBzdGF0ZSBpcyBkeW5hbWljCisgICAgICAgICdwU2Npc3NvcnMnOiAnZmFsc2UnLCAgICAgICAjIE5vIGVhc3kgd2F5IHRvIGNoZWNrIGlmIHNjaXNzb3Igc3RhdGUgaXMgZHluYW1pYworICAgIH0sCisgICAgJ1ZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUic6IHsKKyAgICAgICAgJ3BRdWV1ZUZhbWlseUluZGljZXMnOiAnb2JqZWN0LmltYWdlU2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQnLAorICAgIH0sCisgICAgJ1ZrV3JpdGVEZXNjcmlwdG9yU2V0JzogeworICAgICAgICAncEltYWdlSW5mbyc6CisgICAgICAgICAgICAnKG9iamVjdC5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUikgfHwgJyArCisgICAgICAgICAgICAnKG9iamVjdC5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUikgfHwgJyArCisgICAgICAgICAgICAnKG9iamVjdC5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSkgfHwgJyArCisgICAgICAgICAgICAnKG9iamVjdC5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRSknLAorICAgICAgICAncEJ1ZmZlckluZm8nOgorICAgICAgICAgICAgJyhvYmplY3QuZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSKSB8fCAnICsKKyAgICAgICAgICAgICcob2JqZWN0LmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUikgfHwgJyArCisgICAgICAgICAgICAnKG9iamVjdC5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQykgfHwgJyArCisgICAgICAgICAgICAnKG9iamVjdC5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQyknLAorICAgICAgICAncFRleGVsQnVmZmVyVmlldyc6CisgICAgICAgICAgICAnKG9iamVjdC5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVIpIHx8ICcgKworICAgICAgICAgICAgJyhvYmplY3QuZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSKScsCisgICAgfSwKK30KKworY2xhc3MgQXBpRHVtcEdlbmVyYXRvck9wdGlvbnMoZ2VuLkdlbmVyYXRvck9wdGlvbnMpOgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBpbnB1dCA9IE5vbmUsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gJy4nLAorICAgICAgICAgICAgICAgICBhcGluYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZW1pdHZlcnNpb25zID0gJy4qJywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbnMgPSBOb25lLAorICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25zID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHNvcnRQcm9jZWR1cmUgPSBOb25lLAorICAgICAgICAgICAgICAgICBwcmVmaXhUZXh0ID0gIiIsCisgICAgICAgICAgICAgICAgIGdlbkZ1bmNQb2ludGVycyA9IFRydWUsCisgICAgICAgICAgICAgICAgIHByb3RlY3RGaWxlID0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdEZlYXR1cmUgPSBUcnVlLAorICAgICAgICAgICAgICAgICBwcm90ZWN0UHJvdG8gPSBOb25lLAorICAgICAgICAgICAgICAgICBwcm90ZWN0UHJvdG9TdHIgPSBOb25lLAorICAgICAgICAgICAgICAgICBhcGljYWxsID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5ID0gJycsCisgICAgICAgICAgICAgICAgIGFwaWVudHJ5cCA9ICcnLAorICAgICAgICAgICAgICAgICBpbmRlbnRGdW5jUHJvdG8gPSBUcnVlLAorICAgICAgICAgICAgICAgICBpbmRlbnRGdW5jUG9pbnRlciA9IEZhbHNlLAorICAgICAgICAgICAgICAgICBhbGlnbkZ1bmNQYXJhbSA9IDApOgorICAgICAgICBnZW4uR2VuZXJhdG9yT3B0aW9ucy5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgZGlyZWN0b3J5LCBhcGluYW1lLCBwcm9maWxlLAorICAgICAgICAgICAgdmVyc2lvbnMsIGVtaXR2ZXJzaW9ucywgZGVmYXVsdEV4dGVuc2lvbnMsCisgICAgICAgICAgICBhZGRFeHRlbnNpb25zLCByZW1vdmVFeHRlbnNpb25zLCBzb3J0UHJvY2VkdXJlKQorICAgICAgICBzZWxmLmlucHV0ICAgICAgICAgICA9IGlucHV0CisgICAgICAgIHNlbGYucHJlZml4VGV4dCAgICAgID0gcHJlZml4VGV4dAorICAgICAgICBzZWxmLmdlbkZ1bmNQb2ludGVycyA9IGdlbkZ1bmNQb2ludGVycworICAgICAgICBzZWxmLnByb3RlY3RGaWxlICAgICA9IHByb3RlY3RGaWxlCisgICAgICAgIHNlbGYucHJvdGVjdEZlYXR1cmUgID0gcHJvdGVjdEZlYXR1cmUKKyAgICAgICAgc2VsZi5wcm90ZWN0UHJvdG8gICAgPSBwcm90ZWN0UHJvdG8KKyAgICAgICAgc2VsZi5wcm90ZWN0UHJvdG9TdHIgPSBwcm90ZWN0UHJvdG9TdHIKKyAgICAgICAgc2VsZi5hcGljYWxsICAgICAgICAgPSBhcGljYWxsCisgICAgICAgIHNlbGYuYXBpZW50cnkgICAgICAgID0gYXBpZW50cnkKKyAgICAgICAgc2VsZi5hcGllbnRyeXAgICAgICAgPSBhcGllbnRyeXAKKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUHJvdG8gPSBpbmRlbnRGdW5jUHJvdG8KKyAgICAgICAgc2VsZi5pbmRlbnRGdW5jUG9pbnRlciA9IGluZGVudEZ1bmNQb2ludGVyCisgICAgICAgIHNlbGYuYWxpZ25GdW5jUGFyYW0gID0gYWxpZ25GdW5jUGFyYW0KKworCitjbGFzcyBBcGlEdW1wT3V0cHV0R2VuZXJhdG9yKGdlbi5PdXRwdXRHZW5lcmF0b3IpOgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJGaWxlID0gc3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgd2FybkZpbGUgPSBzeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICBkaWFnRmlsZSA9IHN5cy5zdGRvdXQsCisgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5RmlsZSA9IE5vbmUpOgorICAgICAgICBnZW4uT3V0cHV0R2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIGVyckZpbGUsIHdhcm5GaWxlLCBkaWFnRmlsZSkKKyAgICAgICAgc2VsZi5mb3JtYXQgPSBOb25lCisgICAgICAgIAorICAgICAgICBzZWxmLmNvbnN0YW50cyA9IHt9CisgICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IHNldCgpCisgICAgICAgIHNlbGYuZXh0RnVuY3MgPSB7fQorICAgICAgICBzZWxmLmV4dFR5cGVzID0ge30KKyAgICAgICAgc2VsZi5pbmNsdWRlcyA9IHt9CisgICAgICAgIAorICAgICAgICBzZWxmLmJhc2V0eXBlcyA9IHNldCgpCisgICAgICAgIHNlbGYuYml0bWFza3MgPSBzZXQoKQorICAgICAgICBzZWxmLmVudW1zID0gc2V0KCkKKyAgICAgICAgc2VsZi5leHRlcm5hbFR5cGVzID0gc2V0KCkKKyAgICAgICAgc2VsZi5mbGFncyA9IHNldCgpCisgICAgICAgIHNlbGYuZnVuY1BvaW50ZXJzID0gc2V0KCkKKyAgICAgICAgc2VsZi5mdW5jdGlvbnMgPSBzZXQoKQorICAgICAgICBzZWxmLmhhbmRsZXMgPSBzZXQoKQorICAgICAgICBzZWxmLnN0cnVjdHMgPSBzZXQoKQorICAgICAgICBzZWxmLnVuaW9ucyA9IHNldCgpCisgICAgICAgIAorICAgICAgICBzZWxmLnJlZ2lzdHJ5RmlsZSA9IHJlZ2lzdHJ5RmlsZQorICAgICAgICAKKyAgICBkZWYgYmVnaW5GaWxlKHNlbGYsIGdlbk9wdHMpOgorICAgICAgICBnZW4uT3V0cHV0R2VuZXJhdG9yLmJlZ2luRmlsZShzZWxmLCBnZW5PcHRzKQorICAgICAgICBzZWxmLmZvcm1hdCA9IGdlbk9wdHMuaW5wdXQKKworICAgICAgICBpZiBzZWxmLnJlZ2lzdHJ5RmlsZSAhPSBOb25lOgorICAgICAgICAgICAgcm9vdCA9IHhtbC5ldHJlZS5FbGVtZW50VHJlZS5wYXJzZShzZWxmLnJlZ2lzdHJ5RmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJvb3QgPSBzZWxmLnJlZ2lzdHJ5LnJlZworICAgICAgICAgICAgCisgICAgICAgIGZvciBub2RlIGluIHJvb3QuZmluZCgnZXh0ZW5zaW9ucycpLmZpbmRhbGwoJ2V4dGVuc2lvbicpOgorICAgICAgICAgICAgZXh0ID0gVnVsa2FuRXh0ZW5zaW9uKG5vZGUpCisgICAgICAgICAgICBzZWxmLmV4dGVuc2lvbnMuYWRkKGV4dCkKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGV4dC52a3R5cGVzOgorICAgICAgICAgICAgICAgIHNlbGYuZXh0VHlwZXNbaXRlbV0gPSBleHQKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGV4dC52a2Z1bmNzOgorICAgICAgICAgICAgICAgIHNlbGYuZXh0RnVuY3NbaXRlbV0gPSBleHQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5yZWdpc3RyeS5yZWcuZmluZGFsbCgnZW51bXMnKToKKyAgICAgICAgICAgIGlmIG5vZGUuZ2V0KCduYW1lJykgPT0gJ0FQSSBDb25zdGFudHMnOgorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5vZGUuZmluZGFsbCgnZW51bScpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnN0YW50c1tpdGVtLmdldCgnbmFtZScpXSA9IGl0ZW0uZ2V0KCd2YWx1ZScpCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnJlZ2lzdHJ5LnJlZy5maW5kKCd0eXBlcycpLmZpbmRhbGwoJ3R5cGUnKToKKyAgICAgICAgICAgIGlmIG5vZGUuZ2V0KCdjYXRlZ29yeScpID09ICdpbmNsdWRlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmluY2x1ZGVzW25vZGUuZ2V0KCduYW1lJyldID0gJycuam9pbihub2RlLml0ZXJ0ZXh0KCkpCisgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBlbmRGaWxlKHNlbGYpOgorICAgICAgICAjIEZpbmQgYWxsIG9mIHRoZSBleHRlbnNpb25zIHRoYXQgdXNlIHRoZSBzeXN0ZW0gdHlwZXMKKyAgICAgICAgc2VsZi5zeXNUeXBlcyA9IHNldCgpCisgICAgICAgIGZvciBub2RlIGluIHNlbGYucmVnaXN0cnkucmVnLmZpbmQoJ3R5cGVzJykuZmluZGFsbCgndHlwZScpOgorICAgICAgICAgICAgaWYgbm9kZS5nZXQoJ2NhdGVnb3J5JykgPT0gTm9uZSBhbmQgbm9kZS5nZXQoJ3JlcXVpcmVzJykgaW4gc2VsZi5pbmNsdWRlcyBhbmQgbm9kZS5nZXQoJ3JlcXVpcmVzJykgIT0gJ3ZrX3BsYXRmb3JtJzoKKyAgICAgICAgICAgICAgICBmb3IgZXh0ZW5zaW9uIGluIHNlbGYuZXh0VHlwZXM6CisgICAgICAgICAgICAgICAgICAgIGZvciBzdHJ1Y3ROYW1lIGluIHNlbGYuZXh0VHlwZXNbZXh0ZW5zaW9uXS52a3R5cGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHN0cnVjdCBpbiBzZWxmLnN0cnVjdHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RydWN0Lm5hbWUgPT0gc3RydWN0TmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBzdHJ1Y3QubWVtYmVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vZGUuZ2V0KCduYW1lJykgPT0gbWVtYmVyLmJhc2VUeXBlIG9yIG5vZGUuZ2V0KCduYW1lJykgKyAnKicgPT0gbWVtYmVyLmJhc2VUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1R5cGUgPSBWdWxrYW5TeXN0ZW1UeXBlKG5vZGUuZ2V0KCduYW1lJyksIHNlbGYuZXh0VHlwZXNbc3RydWN0TmFtZV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3lzVHlwZSBub3QgaW4gc2VsZi5zeXNUeXBlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zeXNUeXBlcy5hZGQoc3lzVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGZ1bmNOYW1lIGluIHNlbGYuZXh0VHlwZXNbZXh0ZW5zaW9uXS52a2Z1bmNzOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZ1bmMgaW4gc2VsZi5mdW5jdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZnVuYy5uYW1lID09IGZ1bmNOYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcGFyYW0gaW4gZnVuYy5wYXJhbWV0ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5nZXQoJ25hbWUnKSA9PSBwYXJhbS5iYXNlVHlwZSBvciBub2RlLmdldCgnbmFtZScpICsgJyonID09IHBhcmFtLmJhc2VUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1R5cGUgPSBWdWxrYW5TeXN0ZW1UeXBlKG5vZGUuZ2V0KCduYW1lJyksIHNlbGYuZXh0RnVuY3NbZnVuY05hbWVdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN5c1R5cGUgbm90IGluIHNlbGYuc3lzVHlwZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3lzVHlwZXMuYWRkKHN5c1R5cGUpCisgICAgICAgIAorICAgICAgICAjIEZpbmQgZXZlcnkgQGZvcmVhY2gsIEBpZiwgYW5kIEBlbmQKKyAgICAgICAgZm9ySXRlciA9IHJlLmZpbmRpdGVyKCcoXlxccypcXEBmb3JlYWNoXFxzK1thLXpdKyhcXHMrd2hlcmVcXCguKlxcKSk/XFxzKl4pfChcXEBmb3JlYWNoIFthLXpdKyhcXHMrd2hlcmVcXCguKlxcKSk/XFxiKScsIHNlbGYuZm9ybWF0LCBmbGFncz1yZS5NVUxUSUxJTkUpCisgICAgICAgIGlmSXRlciA9IHJlLmZpbmRpdGVyKCcoXlxccypcXEBpZlxcKC4qXFwpXFxzKl4pfChcXEBpZlxcKC4qXFwpKScsIHNlbGYuZm9ybWF0LCBmbGFncz1yZS5NVUxUSUxJTkUpCisgICAgICAgIGVuZEl0ZXIgPSByZS5maW5kaXRlcignKF5cXHMqXFxAZW5kXFxzK1thLXpdK1xccypeKXwoXFxAZW5kIFthLXpdK1xcYiknLCBzZWxmLmZvcm1hdCwgZmxhZ3M9cmUuTVVMVElMSU5FKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0Rm9yID0gbmV4dChmb3JJdGVyKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIG5leHRGb3IgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHRJZiA9IG5leHQoaWZJdGVyKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIG5leHRJZiA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dEVuZCA9IG5leHQoZW5kSXRlcikKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBuZXh0RW5kID0gTm9uZQorICAgICAgICAKKyAgICAgICAgIyBNYXRjaCB0aGUgYmVnaW5uaW5ncyB0byB0aGUgZW5kcworICAgICAgICBsb29wcyA9IFtdCisgICAgICAgIHVuYXNzaWduZWRDb250cm9scyA9IFtdCisgICAgICAgIGRlcHRoID0gMAorICAgICAgICB3aGlsZSBuZXh0Rm9yICE9IE5vbmUgb3IgbmV4dEZvciAhPSBOb25lIG9yIG5leHRFbmQgIT0gTm9uZToKKyAgICAgICAgICAgICMgSWYgdGhpcyBpcyBhIEBmb3JlYWNoCisgICAgICAgICAgICBpZiBuZXh0Rm9yICE9IE5vbmUgYW5kICgobmV4dElmID09IE5vbmUgb3IgbmV4dEZvci5zdGFydCgpIDwgbmV4dElmLnN0YXJ0KCkpIGFuZCBuZXh0Rm9yLnN0YXJ0KCkgPCBuZXh0RW5kLnN0YXJ0KCkpOgorICAgICAgICAgICAgICAgIGRlcHRoICs9IDEKKyAgICAgICAgICAgICAgICBmb3JUeXBlID0gcmUuc2VhcmNoKCcoPzw9XFxzKVthLXpdKycsIHNlbGYuZm9ybWF0W25leHRGb3Iuc3RhcnQoKTpuZXh0Rm9yLmVuZCgpXSkKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc2VsZi5mb3JtYXRbZm9yVHlwZS5zdGFydCgpK25leHRGb3Iuc3RhcnQoKTpmb3JUeXBlLmVuZCgpK25leHRGb3Iuc3RhcnQoKV0KKyAgICAgICAgICAgICAgICB3aGVyZU1hdGNoID0gcmUuc2VhcmNoKCcoPzw9d2hlcmVcXCgpLiooPz1cXCkpJywgc2VsZi5mb3JtYXRbbmV4dEZvci5zdGFydCgpOm5leHRGb3IuZW5kKCldKQorICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IE5vbmUgaWYgd2hlcmVNYXRjaCA9PSBOb25lIGVsc2Ugc2VsZi5mb3JtYXRbd2hlcmVNYXRjaC5zdGFydCgpK25leHRGb3Iuc3RhcnQoKTp3aGVyZU1hdGNoLmVuZCgpK25leHRGb3Iuc3RhcnQoKV0KKyAgICAgICAgICAgICAgICB1bmFzc2lnbmVkQ29udHJvbHMuYXBwZW5kKChuZXh0Rm9yLnN0YXJ0KCksIG5leHRGb3IuZW5kKCksIHRleHQsIGNvbmRpdGlvbikpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBuZXh0Rm9yID0gbmV4dChmb3JJdGVyKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBuZXh0Rm9yID0gTm9uZQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIElmIHRoaXMgaXMgYW4gQGlmICAgIAorICAgICAgICAgICAgZWxpZiBuZXh0SWYgIT0gTm9uZSBhbmQgbmV4dElmLnN0YXJ0KCkgPCBuZXh0RW5kLnN0YXJ0KCk6CisgICAgICAgICAgICAgICAgZGVwdGggKz0gMQorICAgICAgICAgICAgICAgIGNvbmRNYXRjaCA9IHJlLnNlYXJjaCgnKD88PWlmXFwoKS4qKD89XFwpKScsIHNlbGYuZm9ybWF0W25leHRJZi5zdGFydCgpOm5leHRJZi5lbmQoKV0pCisgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gTm9uZSBpZiBjb25kTWF0Y2ggPT0gTm9uZSBlbHNlIHNlbGYuZm9ybWF0W2NvbmRNYXRjaC5zdGFydCgpK25leHRJZi5zdGFydCgpOmNvbmRNYXRjaC5lbmQoKStuZXh0SWYuc3RhcnQoKV0KKyAgICAgICAgICAgICAgICB1bmFzc2lnbmVkQ29udHJvbHMuYXBwZW5kKChuZXh0SWYuc3RhcnQoKSwgbmV4dElmLmVuZCgpLCAnaWYnLCBjb25kaXRpb24pKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbmV4dElmID0gbmV4dChpZkl0ZXIpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIG5leHRJZiA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAjIEVsc2UgdGhpcyBpcyBhbiBAZW5kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlcHRoIC09IDEKKyAgICAgICAgICAgICAgICBlbmRUeXBlID0gcmUuc2VhcmNoKCcoPzw9XFxzKVthLXpdKycsIHNlbGYuZm9ybWF0W25leHRFbmQuc3RhcnQoKTpuZXh0RW5kLmVuZCgpXSkKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc2VsZi5mb3JtYXRbZW5kVHlwZS5zdGFydCgpK25leHRFbmQuc3RhcnQoKTplbmRUeXBlLmVuZCgpK25leHRFbmQuc3RhcnQoKV0KKworICAgICAgICAgICAgICAgIHN0YXJ0ID0gdW5hc3NpZ25lZENvbnRyb2xzLnBvcCgtMSkKKyAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRbMl0gPT0gdGV4dCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpdGVtID0gQ29udHJvbChzZWxmLmZvcm1hdCwgc3RhcnRbMDoyXSwgKG5leHRFbmQuc3RhcnQoKSwgbmV4dEVuZC5lbmQoKSksIHRleHQsIHN0YXJ0WzNdKQorICAgICAgICAgICAgICAgIGlmIGxlbihsb29wcykgPCAxIG9yIGRlcHRoIDwgbG9vcHNbLTFdWzBdOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBsZW4obG9vcHMpID4gMCBhbmQgZGVwdGggPCBsb29wc1stMV1bMF06CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuLmluc2VydCgwLCBsb29wcy5wb3AoLTEpWzFdKQorICAgICAgICAgICAgICAgICAgICBsb29wcy5hcHBlbmQoKGRlcHRoLCBpdGVtKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb29wcy5hcHBlbmQoKGRlcHRoLCBpdGVtKSkKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbmV4dEVuZCA9IG5leHQoZW5kSXRlcikKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbmV4dEVuZCA9IE5vbmUgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICAjIEV4cGFuZCBlYWNoIGxvb3AgaW50byBpdHMgZnVsbCBmb3JtCisgICAgICAgIGxhc3RJbmRleCA9IDAKKyAgICAgICAgZm9yIF8sIGxvb3AgaW4gbG9vcHM6CisgICAgICAgICAgICBnZW4ud3JpdGUoc2VsZi5mb3JtYXRbbGFzdEluZGV4Omxvb3Auc3RhcnRQb3NbMF1dLmZvcm1hdCgqKnt9KSwgZmlsZT1zZWxmLm91dEZpbGUpCisgICAgICAgICAgICBnZW4ud3JpdGUoc2VsZi5leHBhbmQobG9vcCksIGZpbGU9c2VsZi5vdXRGaWxlKQorICAgICAgICAgICAgbGFzdEluZGV4ID0gbG9vcC5lbmRQb3NbMV0KKyAgICAgICAgZ2VuLndyaXRlKHNlbGYuZm9ybWF0W2xhc3RJbmRleDotMV0uZm9ybWF0KCoqe30pLCBmaWxlPXNlbGYub3V0RmlsZSkKKyAgICAgICAgCisgICAgICAgIGdlbi5PdXRwdXRHZW5lcmF0b3IuZW5kRmlsZShzZWxmKQorICAgICAgICAKKyAgICBkZWYgZ2VuQ21kKHNlbGYsIGNtZCwgbmFtZSk6CisgICAgICAgIGdlbi5PdXRwdXRHZW5lcmF0b3IuZ2VuQ21kKHNlbGYsIGNtZCwgbmFtZSkKKyAgICAgICAgc2VsZi5mdW5jdGlvbnMuYWRkKFZ1bGthbkZ1bmN0aW9uKGNtZC5lbGVtLCBzZWxmLmNvbnN0YW50cykpCisgICAgICAgIAorICAgICMgVGhlc2UgYXJlIGFjdHVhbGx5IGNvbnN0YW50cworICAgIGRlZiBnZW5FbnVtKHNlbGYsIGVudW1pbmZvLCBuYW1lKToKKyAgICAgICAgZ2VuLk91dHB1dEdlbmVyYXRvci5nZW5FbnVtKHNlbGYsIGVudW1pbmZvLCBuYW1lKQorICAgIAorICAgICMgVGhlc2UgYXJlIGFjdHVhbGx5IGVudW1zCisgICAgZGVmIGdlbkdyb3VwKHNlbGYsIGdyb3VwaW5mbywgZ3JvdXBOYW1lKToKKyAgICAgICAgZ2VuLk91dHB1dEdlbmVyYXRvci5nZW5Hcm91cChzZWxmLCBncm91cGluZm8sIGdyb3VwTmFtZSkKKyAgICAgICAgCisgICAgICAgIGlmIGdyb3VwaW5mby5lbGVtLmdldCgndHlwZScpID09ICdiaXRtYXNrJzoKKyAgICAgICAgICAgIHNlbGYuYml0bWFza3MuYWRkKFZ1bGthbkJpdG1hc2soZ3JvdXBpbmZvLmVsZW0sIHNlbGYuZXh0ZW5zaW9ucykpCisgICAgICAgIGVsaWYgZ3JvdXBpbmZvLmVsZW0uZ2V0KCd0eXBlJykgPT0gJ2VudW0nOgorICAgICAgICAgICAgc2VsZi5lbnVtcy5hZGQoVnVsa2FuRW51bShncm91cGluZm8uZWxlbSwgc2VsZi5leHRlbnNpb25zKSkKKworICAgIGRlZiBnZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lKToKKyAgICAgICAgZ2VuLk91dHB1dEdlbmVyYXRvci5nZW5UeXBlKHNlbGYsIHR5cGVpbmZvLCBuYW1lKQorICAgICAgICAKKyAgICAgICAgaWYgdHlwZWluZm8uZWxlbS5nZXQoJ2NhdGVnb3J5JykgPT0gJ3N0cnVjdCc6CisgICAgICAgICAgICBzZWxmLnN0cnVjdHMuYWRkKFZ1bGthblN0cnVjdCh0eXBlaW5mby5lbGVtLCBzZWxmLmNvbnN0YW50cykpCisgICAgICAgIGVsaWYgdHlwZWluZm8uZWxlbS5nZXQoJ2NhdGVnb3J5JykgPT0gJ2Jhc2V0eXBlJzoKKyAgICAgICAgICAgIHNlbGYuYmFzZXR5cGVzLmFkZChWdWxrYW5CYXNldHlwZSh0eXBlaW5mby5lbGVtKSkKKyAgICAgICAgZWxpZiB0eXBlaW5mby5lbGVtLmdldCgnY2F0ZWdvcnknKSA9PSBOb25lIGFuZCB0eXBlaW5mby5lbGVtLmdldCgncmVxdWlyZXMnKSA9PSAndmtfcGxhdGZvcm0nOgorICAgICAgICAgICAgc2VsZi5leHRlcm5hbFR5cGVzLmFkZChWdWxrYW5FeHRlcm5hbFR5cGUodHlwZWluZm8uZWxlbSkpCisgICAgICAgIGVsaWYgdHlwZWluZm8uZWxlbS5nZXQoJ2NhdGVnb3J5JykgPT0gJ2hhbmRsZSc6CisgICAgICAgICAgICBzZWxmLmhhbmRsZXMuYWRkKFZ1bGthbkhhbmRsZSh0eXBlaW5mby5lbGVtKSkKKyAgICAgICAgZWxpZiB0eXBlaW5mby5lbGVtLmdldCgnY2F0ZWdvcnknKSA9PSAndW5pb24nOgorICAgICAgICAgICAgc2VsZi51bmlvbnMuYWRkKFZ1bGthblVuaW9uKHR5cGVpbmZvLmVsZW0sIHNlbGYuY29uc3RhbnRzKSkKKyAgICAgICAgZWxpZiB0eXBlaW5mby5lbGVtLmdldCgnY2F0ZWdvcnknKSA9PSAnYml0bWFzayc6CisgICAgICAgICAgICBzZWxmLmZsYWdzLmFkZChWdWxrYW5GbGFncyh0eXBlaW5mby5lbGVtKSkKKyAgICAgICAgZWxpZiB0eXBlaW5mby5lbGVtLmdldCgnY2F0ZWdvcnknKSA9PSAnZnVuY3BvaW50ZXInOgorICAgICAgICAgICAgc2VsZi5mdW5jUG9pbnRlcnMuYWRkKFZ1bGthbkZ1bmN0aW9uUG9pbnRlcih0eXBlaW5mby5lbGVtKSkKKyAgICAgICAgICAgIAorICAgIGRlZiBleHBhbmQoc2VsZiwgbG9vcCwgcGFyZW50cz1bXSk6CisgICAgICAgICMgRmlndXJlIG91dCB3aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aAorICAgICAgICBpZiBsb29wLnRleHQgPT0gJ2lmJzoKKyAgICAgICAgICAgIHN1YmplY3RzID0gWyBDb250cm9sLklmRHVtbXkoKSBdCisgICAgICAgIGVsaWYgbG9vcC50ZXh0ID09ICdiYXNldHlwZSc6CisgICAgICAgICAgICBzdWJqZWN0cyA9IHNlbGYuYmFzZXR5cGVzCisgICAgICAgIGVsaWYgbG9vcC50ZXh0ID09ICdiaXRtYXNrJzoKKyAgICAgICAgICAgIHN1YmplY3RzID0gc2VsZi5iaXRtYXNrcworICAgICAgICBlbGlmIGxvb3AudGV4dCA9PSAnY2hvaWNlJzoKKyAgICAgICAgICAgIHN1YmplY3RzID0gc2VsZi5maW5kQnlUeXBlKFtWdWxrYW5Vbmlvbl0sIHBhcmVudHMpLmNob2ljZXMKKyAgICAgICAgZWxpZiBsb29wLnRleHQgPT0gJ2VudW0nOgorICAgICAgICAgICAgc3ViamVjdHMgPSBzZWxmLmVudW1zCisgICAgICAgIGVsaWYgbG9vcC50ZXh0ID09ICdleHRlbnNpb24nOgorICAgICAgICAgICAgc3ViamVjdHMgPSBzZWxmLmV4dGVuc2lvbnMKKyAgICAgICAgZWxpZiBsb29wLnRleHQgPT0gJ2ZsYWcnOgorICAgICAgICAgICAgc3ViamVjdHMgPSBzZWxmLmZsYWdzCisgICAgICAgIGVsaWYgbG9vcC50ZXh0ID09ICdmdW5jcG9pbnRlcic6CisgICAgICAgICAgICBzdWJqZWN0cyA9IHNlbGYuZnVuY1BvaW50ZXJzCisgICAgICAgIGVsaWYgbG9vcC50ZXh0ID09ICdmdW5jdGlvbic6CisgICAgICAgICAgICBzdWJqZWN0cyA9IHNlbGYuZnVuY3Rpb25zCisgICAgICAgIGVsaWYgbG9vcC50ZXh0ID09ICdoYW5kbGUnOgorICAgICAgICAgICAgc3ViamVjdHMgPSBzZWxmLmhhbmRsZXMKKyAgICAgICAgZWxpZiBsb29wLnRleHQgPT0gJ29wdGlvbic6CisgICAgICAgICAgICBzdWJqZWN0cyA9IHNlbGYuZmluZEJ5VHlwZShbVnVsa2FuRW51bSwgVnVsa2FuQml0bWFza10sIHBhcmVudHMpLm9wdGlvbnMKKyAgICAgICAgZWxpZiBsb29wLnRleHQgPT0gJ21lbWJlcic6CisgICAgICAgICAgICBzdWJqZWN0cyA9IHNlbGYuZmluZEJ5VHlwZShbVnVsa2FuU3RydWN0XSwgcGFyZW50cykubWVtYmVycworICAgICAgICBlbGlmIGxvb3AudGV4dCA9PSAncGFyYW1ldGVyJzoKKyAgICAgICAgICAgIHN1YmplY3RzID0gc2VsZi5maW5kQnlUeXBlKFtWdWxrYW5GdW5jdGlvbl0sIHBhcmVudHMpLnBhcmFtZXRlcnMKKyAgICAgICAgZWxpZiBsb29wLnRleHQgPT0gJ3N0cnVjdCc6CisgICAgICAgICAgICBzdWJqZWN0cyA9IHNlbGYuc3RydWN0cworICAgICAgICBlbGlmIGxvb3AudGV4dCA9PSAnc3lzdHlwZSc6CisgICAgICAgICAgICBzdWJqZWN0cyA9IHNlbGYuc3lzVHlwZXMKKyAgICAgICAgZWxpZiBsb29wLnRleHQgPT0gJ3R5cGUnOgorICAgICAgICAgICAgc3ViamVjdHMgPSBzZWxmLmV4dGVybmFsVHlwZXMKKyAgICAgICAgZWxpZiBsb29wLnRleHQgPT0gJ3VuaW9uJzoKKyAgICAgICAgICAgIHN1YmplY3RzID0gc2VsZi51bmlvbnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydChGYWxzZSkKKyAgICAgICAgICAgIAorICAgICAgICAjIEdlbmVyYXRlIHRoZSBvdXRwdXQgc3RyaW5nCisgICAgICAgIG91dCA9ICcnCisgICAgICAgIGZvciBpdGVtIGluIHN1YmplY3RzOgorICAgICAgICAgICAgCisgICAgICAgICAgICAjIE1lcmdlIHRoZSB2YWx1ZXMgYW5kIHRoZSBwYXJlbnQgdmFsdWVzCisgICAgICAgICAgICB2YWx1ZXMgPSBpdGVtLnZhbHVlcygpLmNvcHkoKQorICAgICAgICAgICAgZm9yIHBhcmVudCBpbiBwYXJlbnRzOgorICAgICAgICAgICAgICAgIHZhbHVlcy51cGRhdGUocGFyZW50LnZhbHVlcygpKQorICAgICAgICAKKyAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIGNvbmRpdGlvbiBpcyBtZXQKKyAgICAgICAgICAgIGlmIGxvb3AuY29uZGl0aW9uICE9IE5vbmU6CisgICAgICAgICAgICAgICAgY29uZCA9IGV2YWwobG9vcC5jb25kaXRpb24uZm9ybWF0KCoqdmFsdWVzKSkKKyAgICAgICAgICAgICAgICBhc3NlcnQoY29uZCA9PSBUcnVlIG9yIGNvbmQgPT0gRmFsc2UpCisgICAgICAgICAgICAgICAgaWYgbm90IGNvbmQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIyBDaGVjayBpZiBhbiBpZmRlZiBpcyBuZWVkZWQKKyAgICAgICAgICAgIGlmIGl0ZW0ubmFtZSBpbiBzZWxmLmV4dEZ1bmNzOgorICAgICAgICAgICAgICAgIGV4dCA9IHNlbGYuZXh0RnVuY3NbaXRlbS5uYW1lXQorICAgICAgICAgICAgZWxpZiBpdGVtLm5hbWUgaW4gc2VsZi5leHRUeXBlczoKKyAgICAgICAgICAgICAgICBleHQgPSBzZWxmLmV4dFR5cGVzW2l0ZW0ubmFtZV0KKyAgICAgICAgICAgIGVsaWYgaXRlbSBpbiBzZWxmLnN5c1R5cGVzOgorICAgICAgICAgICAgICAgIGV4dCA9IGl0ZW0uZXh0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4dCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGV4dCAhPSBOb25lIGFuZCBleHQuZ3VhcmQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBvdXQgKz0gJyNpZiBkZWZpbmVkKHt9KVxuJy5mb3JtYXQoZXh0Lmd1YXJkKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICMgRm9ybWF0IHRoZSBzdHJpbmcKKyAgICAgICAgICAgIGxhc3RJbmRleCA9IGxvb3Auc3RhcnRQb3NbMV0KKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBsb29wLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIG91dCArPSBsb29wLmZ1bGxTdHJpbmdbbGFzdEluZGV4OmNoaWxkLnN0YXJ0UG9zWzBdXS5mb3JtYXQoKip2YWx1ZXMpCisgICAgICAgICAgICAgICAgb3V0ICs9IHNlbGYuZXhwYW5kKGNoaWxkLCBwYXJlbnRzPVtpdGVtXStwYXJlbnRzKQorICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IGNoaWxkLmVuZFBvc1sxXQorICAgICAgICAgICAgb3V0ICs9IGxvb3AuZnVsbFN0cmluZ1tsYXN0SW5kZXg6bG9vcC5lbmRQb3NbMF1dLmZvcm1hdCgqKnZhbHVlcykKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIyBDbG9zZSB0aGUgaWZkZWYKKyAgICAgICAgICAgIGlmIGV4dCAhPSBOb25lIGFuZCBleHQuZ3VhcmQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBvdXQgKz0gJyNlbmRpZiAvLyB7fVxuJy5mb3JtYXQoZXh0Lmd1YXJkKQorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBvdXQKKyAgICAgICAgCisgICAgZGVmIGZpbmRCeVR5cGUoc2VsZiwgdHlwZXMsIG9iamVjdHMpOgorICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgZm9yIGl0ZW0gaW4gb2JqZWN0czoKKyAgICAgICAgICAgIGZvciB0eSBpbiB0eXBlczoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHR5KToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpdGVtCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGFzc2VydCh2YWx1ZSAhPSBOb25lKQorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgIAorY2xhc3MgQ29udHJvbDoKKyAgICAKKyAgICBjbGFzcyBJZkR1bW15OgorICAgICAgICAKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gJ2lmZHVtbXknCisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHt9CisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bGxTdHJpbmcsIHN0YXJ0LCBlbmQsIHRleHQsIGNvbmRpdGlvbik6CisgICAgICAgIHNlbGYuZnVsbFN0cmluZyA9IGZ1bGxTdHJpbmcKKyAgICAgICAgc2VsZi5zdGFydFBvcyA9IHN0YXJ0CisgICAgICAgIHNlbGYuZW5kUG9zID0gZW5kCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAgICAgc2VsZi5jb25kaXRpb24gPSBjb25kaXRpb24KKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCisgICAgICAgIAorIyBCYXNlIGNsYXNzIGZvciBWdWxrYW5TdHJ1Y3QuTWVtYmVyIGFuZCBWdWxrYW5TdHJ1Y3QuUGFyYW1ldGVyCitjbGFzcyBWdWxrYW5WYXJpYWJsZToKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUsIGNvbnN0YW50cyk6CisgICAgICAgICMgU2V0IGJhc2ljIHByb3BlcnRpZXMKKyAgICAgICAgc2VsZi5uYW1lID0gcm9vdE5vZGUuZmluZCgnbmFtZScpLnRleHQgICAgICAjIFZhcmlhYmxlIG5hbWUKKyAgICAgICAgc2VsZi50eXBlSUQgPSByb290Tm9kZS5maW5kKCd0eXBlJykudGV4dCAgICAjIFR5cGVuYW1lLCBkZXJlZmVyZW5jZWQgYW5kIGNvbnZlcnRlZCB0byBhIHVzZWFibGUgQysrIHRva2VuCisgICAgICAgIHNlbGYuYmFzZVR5cGUgPSBzZWxmLnR5cGVJRCAgICAgICAgICAgICAgICAgICAgICMgVHlwZSwgZGVyZWZlcmVuY2VkIHRvIHRoZSBub24tcG9pbnRlciB0eXBlCisgICAgICAgIHNlbGYuY2hpbGRUeXBlID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgIyBUeXBlLCBkZXJlZmVyZW5jZWQgdG8gdGhlIG5vbi1wb2ludGVyIHR5cGUgKE5vbmUgaWYgaXQgaXNuJ3QgYSBwb2ludGVyKQorICAgICAgICBzZWxmLmFycmF5TGVuZ3RoID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICMgTGVuZ3RoIG9mIHRoZSBhcnJheSwgb3IgTm9uZSBpZiBpdCBpc24ndCBhbiBhcnJheQorICAgICAgICAKKyAgICAgICAgdHlwZU1hdGNoID0gcmUuc2VhcmNoKCcuKyg/PScgKyBzZWxmLm5hbWUgKyAnKScsICcnLmpvaW4ocm9vdE5vZGUuaXRlcnRleHQoKSkpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGVNYXRjaC5zdHJpbmdbdHlwZU1hdGNoLnN0YXJ0KCk6dHlwZU1hdGNoLmVuZCgpXQorICAgICAgICBzZWxmLnR5cGUgPSAnICcuam9pbihzZWxmLnR5cGUuc3BsaXQoKSkKKyAgICAgICAgYnJhY2tldE1hdGNoID0gcmUuc2VhcmNoKCcoPzw9XFxbKVthLXpBLVowLTlfXSsoPz1cXF0pJywgJycuam9pbihyb290Tm9kZS5pdGVydGV4dCgpKSkKKyAgICAgICAgaWYgYnJhY2tldE1hdGNoICE9IE5vbmU6CisgICAgICAgICAgICBtYXRjaFRleHQgPSBicmFja2V0TWF0Y2guc3RyaW5nW2JyYWNrZXRNYXRjaC5zdGFydCgpOmJyYWNrZXRNYXRjaC5lbmQoKV0KKyAgICAgICAgICAgIHNlbGYuY2hpbGRUeXBlID0gc2VsZi50eXBlCisgICAgICAgICAgICBzZWxmLnR5cGUgKz0gJ1snICsgbWF0Y2hUZXh0ICsgJ10nCisgICAgICAgICAgICBpZiBtYXRjaFRleHQgaW4gY29uc3RhbnRzOgorICAgICAgICAgICAgICAgIHNlbGYuYXJyYXlMZW5ndGggPSBjb25zdGFudHNbbWF0Y2hUZXh0XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFycmF5TGVuZ3RoID0gbWF0Y2hUZXh0CisgICAgICAgIAorICAgICAgICBzZWxmLmxlbmd0aE1lbWJlciA9IEZhbHNlCisgICAgICAgIGxlbmd0aFN0cmluZyA9IHJvb3ROb2RlLmdldCgnbGVuJykKKyAgICAgICAgbGVuZ3RocyA9IFtdCisgICAgICAgIGlmIGxlbmd0aFN0cmluZyAhPSBOb25lOgorICAgICAgICAgICAgbGVuZ3RocyA9IHJlLnNwbGl0KCcsJywgbGVuZ3RoU3RyaW5nKQorICAgICAgICAgICAgbGVuZ3RocyA9IGxpc3QoZmlsdGVyKCgnbnVsbC10ZXJtaW5hdGVkJykuX19uZV9fLCBsZW5ndGhzKSkKKyAgICAgICAgYXNzZXJ0KGxlbihsZW5ndGhzKSA8PSAxKQorICAgICAgICBpZiBzZWxmLmFycmF5TGVuZ3RoID09IE5vbmUgYW5kIGxlbihsZW5ndGhzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmNoaWxkVHlwZSA9ICcqJy5qb2luKHNlbGYudHlwZS5zcGxpdCgnKicpWzA6LTFdKQorICAgICAgICAgICAgc2VsZi5hcnJheUxlbmd0aCA9IGxlbmd0aHNbMF0KKyAgICAgICAgICAgIHNlbGYubGVuZ3RoTWVtYmVyID0gVHJ1ZQorICAgICAgICBpZiBzZWxmLmFycmF5TGVuZ3RoICE9IE5vbmUgYW5kIHNlbGYuYXJyYXlMZW5ndGguc3RhcnRzd2l0aCgnbGF0ZXhtYXRoJyk6CisgICAgICAgICAgICBjb2RlID0gc2VsZi5hcnJheUxlbmd0aFsxMDpsZW4oc2VsZi5hcnJheUxlbmd0aCldCisgICAgICAgICAgICBjb2RlID0gcmUuc3ViKCdcXFtcXCQnLCAnJywgY29kZSkKKyAgICAgICAgICAgIGNvZGUgPSByZS5zdWIoJ1xcJFxcXScsICcnLCBjb2RlKQorICAgICAgICAgICAgY29kZSA9IHJlLnN1YignXFxcXChsY2VpbHxyY2VpbCknLCAnJywgY29kZSkKKyAgICAgICAgICAgIGNvZGUgPSByZS5zdWIoJ3t8fScsICcnLCBjb2RlKQorICAgICAgICAgICAgY29kZSA9IHJlLnN1YignXFxcXG1hdGhpdCcsICcnLCBjb2RlKQorICAgICAgICAgICAgY29kZSA9IHJlLnN1YignXFxcXG92ZXInLCAnLycsIGNvZGUpCisgICAgICAgICAgICBzZWxmLmFycmF5TGVuZ3RoID0gY29kZQorICAgICAgICAgICAgCisgICAgICAgICMgRGVyZWZlcmVuY2UgaWYgbmVjZXNzYXJ5IGFuZCBoYW5kbGUgbWVtYmVycyBvZiB2YXJpYWJsZXMKKyAgICAgICAgaWYgc2VsZi5hcnJheUxlbmd0aCAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi5hcnJheUxlbmd0aCA9IHJlLnN1YignOjonLCAnLT4nLCBzZWxmLmFycmF5TGVuZ3RoKQorICAgICAgICAgICAgc2VjdGlvbnMgPSBzZWxmLmFycmF5TGVuZ3RoLnNwbGl0KCctPicpCisgICAgICAgICAgICBpZiBzZWN0aW9uc1stMV1bMF0gPT0gJ3AnIGFuZCBzZWN0aW9uc1swXVsxXS5pc3VwcGVyKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hcnJheUxlbmd0aCA9ICcqJyArIHNlbGYuYXJyYXlMZW5ndGgKKyAgICAgICAgCisgICAgICAgIHNlbGYucG9pbnRlckxldmVscyA9IGxlbihyZS5maW5kYWxsKCdcXCp8XFxbJywgJycuam9pbihyb290Tm9kZS5pdGVydGV4dCgpKSkpCisgICAgICAgIGlmIHNlbGYudHlwZUlEID09ICdjaGFyJyBhbmQgc2VsZi5wb2ludGVyTGV2ZWxzID4gMDoKKyAgICAgICAgICAgIHNlbGYuYmFzZVR5cGUgKz0gJyonCisgICAgICAgICAgICBzZWxmLnBvaW50ZXJMZXZlbHMgLT0gMQorICAgICAgICAgICAgc2VsZi50eXBlSUQgPSAnY3N0cmluZycKKyAgICAgICAgZWxpZiBzZWxmLnR5cGVJRCBpbiBQT0lOVEVSX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5iYXNlVHlwZSArPSAnKicKKyAgICAgICAgICAgIHNlbGYucG9pbnRlckxldmVscyAtPSAxCisgICAgICAgIGFzc2VydChzZWxmLnBvaW50ZXJMZXZlbHMgPj0gMCkKKyAgICAgICAgCitjbGFzcyBWdWxrYW5CYXNldHlwZToKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUpOgorICAgICAgICBzZWxmLm5hbWUgPSByb290Tm9kZS5nZXQoJ25hbWUnKQorICAgICAgICBzZWxmLnR5cGUgPSByb290Tm9kZS5nZXQoJ3R5cGUnKQorICAgICAgICAKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2Jhc2VOYW1lJzogc2VsZi5uYW1lLAorICAgICAgICAgICAgJ2Jhc2VUeXBlJzogc2VsZi50eXBlLAorICAgICAgICB9CisgICAgICAgIAorY2xhc3MgVnVsa2FuQml0bWFzazoKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUsIGV4dGVuc2lvbnMpOgorICAgICAgICBzZWxmLm5hbWUgPSByb290Tm9kZS5nZXQoJ25hbWUnKQorICAgICAgICBzZWxmLnR5cGUgPSByb290Tm9kZS5nZXQoJ3R5cGUnKQorICAgICAgICAKKyAgICAgICAgIyBSZWFkIGVhY2ggdmFsdWUgdGhhdCB0aGUgZW51bSBjb250YWlucworICAgICAgICBzZWxmLm9wdGlvbnMgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gcm9vdE5vZGU6CisgICAgICAgICAgICBjaGlsZE5hbWUgPSBjaGlsZC5nZXQoJ25hbWUnKQorICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkLmdldCgndmFsdWUnKQorICAgICAgICAgICAgY2hpbGRCaXRwb3MgPSBjaGlsZC5nZXQoJ2JpdHBvcycpCisgICAgICAgICAgICBjaGlsZENvbW1lbnQgPSBjaGlsZC5nZXQoJ2NvbW1lbnQnKQorICAgICAgICAgICAgaWYgY2hpbGROYW1lID09IE5vbmUgb3IgKGNoaWxkVmFsdWUgPT0gTm9uZSBhbmQgY2hpbGRCaXRwb3MgPT0gTm9uZSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hcHBlbmQoVnVsa2FuRW51bS5PcHRpb24oY2hpbGROYW1lLCBjaGlsZFZhbHVlLCBjaGlsZEJpdHBvcywgY2hpbGRDb21tZW50KSkKKyAgICAgICAgICAgIAorICAgICAgICBmb3IgZXh0IGluIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBpZiBzZWxmLm5hbWUgaW4gZXh0LmVudW1WYWx1ZXM6CisgICAgICAgICAgICAgICAgY2hpbGROYW1lLCBjaGlsZFZhbHVlID0gZXh0LmVudW1WYWx1ZXNbc2VsZi5uYW1lXQorICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hcHBlbmQoVnVsa2FuRW51bS5PcHRpb24oY2hpbGROYW1lLCBjaGlsZFZhbHVlLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIAorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnYml0TmFtZSc6IHNlbGYubmFtZSwKKyAgICAgICAgICAgICdiaXRUeXBlJzogc2VsZi50eXBlLAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKK2NsYXNzIFZ1bGthbkVudW06CisgICAgCisgICAgY2xhc3MgT3B0aW9uOgorICAgICAgICAKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHZhbHVlLCBiaXRwb3MsIGNvbW1lbnQpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICAgICAgc2VsZi5jb21tZW50ID0gY29tbWVudAorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiB2YWx1ZSA9PSAwIG9yIHZhbHVlID09IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAxIDw8IGludChiaXRwb3MpCisgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIAorICAgICAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAnb3B0TmFtZSc6IHNlbGYubmFtZSwKKyAgICAgICAgICAgICAgICAnb3B0VmFsdWUnOiBzZWxmLnZhbHVlLAorICAgICAgICAgICAgICAgICdvcHRDb21tZW50Jzogc2VsZi5jb21tZW50LAorICAgICAgICAgICAgfQorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSwgZXh0ZW5zaW9ucyk6CisgICAgICAgIHNlbGYubmFtZSA9IHJvb3ROb2RlLmdldCgnbmFtZScpCisgICAgICAgIHNlbGYudHlwZSA9IHJvb3ROb2RlLmdldCgndHlwZScpCisgICAgICAgIAorICAgICAgICAjIFJlYWQgZWFjaCB2YWx1ZSB0aGF0IHRoZSBlbnVtIGNvbnRhaW5zCisgICAgICAgIHNlbGYub3B0aW9ucyA9IFtdCisgICAgICAgIGZvciBjaGlsZCBpbiByb290Tm9kZToKKyAgICAgICAgICAgIGNoaWxkTmFtZSA9IGNoaWxkLmdldCgnbmFtZScpCisgICAgICAgICAgICBjaGlsZFZhbHVlID0gY2hpbGQuZ2V0KCd2YWx1ZScpCisgICAgICAgICAgICBjaGlsZEJpdHBvcyA9IGNoaWxkLmdldCgnYml0cG9zJykKKyAgICAgICAgICAgIGNoaWxkQ29tbWVudCA9IGNoaWxkLmdldCgnY29tbWVudCcpCisgICAgICAgICAgICBpZiBjaGlsZE5hbWUgPT0gTm9uZSBvciAoY2hpbGRWYWx1ZSA9PSBOb25lIGFuZCBjaGlsZEJpdHBvcyA9PSBOb25lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFwcGVuZChWdWxrYW5FbnVtLk9wdGlvbihjaGlsZE5hbWUsIGNoaWxkVmFsdWUsIGNoaWxkQml0cG9zLCBjaGlsZENvbW1lbnQpKQorICAgICAgICAgICAgCisgICAgICAgIGZvciBleHQgaW4gZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIGlmIHNlbGYubmFtZSBpbiBleHQuZW51bVZhbHVlczoKKyAgICAgICAgICAgICAgICBjaGlsZE5hbWUsIGNoaWxkVmFsdWUgPSBleHQuZW51bVZhbHVlc1tzZWxmLm5hbWVdCisgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFwcGVuZChWdWxrYW5FbnVtLk9wdGlvbihjaGlsZE5hbWUsIGNoaWxkVmFsdWUsIE5vbmUsIE5vbmUpKQorICAgICAgICAKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2VudW1OYW1lJzogc2VsZi5uYW1lLAorICAgICAgICAgICAgJ2VudW1UeXBlJzogc2VsZi50eXBlLAorICAgICAgICB9CisgICAgICAgICAgICAKK2NsYXNzIFZ1bGthbkV4dGVuc2lvbjoKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUpOgorICAgICAgICBzZWxmLm5hbWUgPSByb290Tm9kZS5nZXQoJ25hbWUnKQorICAgICAgICBzZWxmLm51bWJlciA9IGludChyb290Tm9kZS5nZXQoJ251bWJlcicpKQorICAgICAgICBzZWxmLnR5cGUgPSByb290Tm9kZS5nZXQoJ3R5cGUnKQorICAgICAgICBzZWxmLmRlcGVuZGVuY3kgPSByb290Tm9kZS5nZXQoJ3JlcXVpcmVzJykKKyAgICAgICAgc2VsZi5ndWFyZCA9IHJvb3ROb2RlLmdldCgncHJvdGVjdCcpCisgICAgICAgIHNlbGYuc3VwcG9ydGVkID0gcm9vdE5vZGUuZ2V0KCdzdXBwb3J0ZWQnKQorICAgICAgICAKKyAgICAgICAgc2VsZi52a3R5cGVzID0gW10KKyAgICAgICAgZm9yIHR5IGluIHJvb3ROb2RlLmZpbmQoJ3JlcXVpcmUnKS5maW5kYWxsKCd0eXBlJyk6CisgICAgICAgICAgICBzZWxmLnZrdHlwZXMuYXBwZW5kKHR5LmdldCgnbmFtZScpKQorICAgICAgICBzZWxmLnZrZnVuY3MgPSBbXQorICAgICAgICBmb3IgZnVuYyBpbiByb290Tm9kZS5maW5kKCdyZXF1aXJlJykuZmluZGFsbCgnY29tbWFuZCcpOgorICAgICAgICAgICAgc2VsZi52a2Z1bmNzLmFwcGVuZChmdW5jLmdldCgnbmFtZScpKQorICAgICAgICAgICAgCisgICAgICAgIHNlbGYuY29uc3RhbnRzID0ge30KKyAgICAgICAgc2VsZi5lbnVtVmFsdWVzID0ge30KKyAgICAgICAgZm9yIGVudW0gaW4gcm9vdE5vZGUuZmluZCgncmVxdWlyZScpLmZpbmRhbGwoJ2VudW0nKToKKyAgICAgICAgICAgIGJhc2UgPSBlbnVtLmdldCgnZXh0ZW5kcycpCisgICAgICAgICAgICBuYW1lID0gZW51bS5nZXQoJ25hbWUnKQorICAgICAgICAgICAgdmFsdWUgPSBlbnVtLmdldCgndmFsdWUnKQorICAgICAgICAgICAgYml0cG9zID0gZW51bS5nZXQoJ2JpdHBvcycpCisgICAgICAgICAgICBvZmZzZXQgPSBlbnVtLmdldCgnb2Zmc2V0JykKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgdmFsdWUgPT0gTm9uZSBhbmQgYml0cG9zICE9IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAxIDw8IGludChiaXRwb3MpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIG9mZnNldCAhPSBOb25lOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IGludChvZmZzZXQpCisgICAgICAgICAgICBpZiBiYXNlICE9IE5vbmUgYW5kIG9mZnNldCAhPSBOb25lOgorICAgICAgICAgICAgICAgIGVudW1WYWx1ZSA9IDEwMDAwMDAwMDAgKyAxMDAwKihzZWxmLm51bWJlciAtIDEpICsgb2Zmc2V0CisgICAgICAgICAgICAgICAgaWYgZW51bS5nZXQoJ2RpcicpID09ICctJzoKKyAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlID0gLWVudW1WYWx1ZTsKKyAgICAgICAgICAgICAgICBzZWxmLmVudW1WYWx1ZXNbYmFzZV0gPSAobmFtZSwgZW51bVZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnN0YW50c1tuYW1lXSA9IHZhbHVlCisgICAgICAgIAorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnZXh0TmFtZSc6IHNlbGYubmFtZSwKKyAgICAgICAgICAgICdleHROdW1iZXInOiBzZWxmLm51bWJlciwKKyAgICAgICAgICAgICdleHRUeXBlJzogc2VsZi50eXBlLAorICAgICAgICAgICAgJ2V4dERlcGVuZGVuY3knOiBzZWxmLmRlcGVuZGVuY3ksCisgICAgICAgICAgICAnZXh0R3VhcmQnOiBzZWxmLmd1YXJkLAorICAgICAgICAgICAgJ2V4dFN1cHBvcnRlZCc6IHNlbGYuc3VwcG9ydGVkLAorICAgICAgICB9CisgICAgICAgIAorY2xhc3MgVnVsa2FuRXh0ZXJuYWxUeXBlOgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSk6CisgICAgICAgIHNlbGYubmFtZSA9IHJvb3ROb2RlLmdldCgnbmFtZScpCisgICAgICAgIHNlbGYuZGVwZW5kZW5jeSA9IHJvb3ROb2RlLmdldCgncmVxdWlyZXMnKQorICAgICAgICAKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2V0eU5hbWUnOiBzZWxmLm5hbWUsCisgICAgICAgICAgICAnZXR5RGVwZW5kZW5jeSc6IHNlbGYuZGVwZW5kZW5jeSwKKyAgICAgICAgfQorICAgICAgICAKK2NsYXNzIFZ1bGthbkZsYWdzOgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSk6CisgICAgICAgIHNlbGYubmFtZSA9IHJvb3ROb2RlLmdldCgnbmFtZScpCisgICAgICAgIHNlbGYudHlwZSA9IHJvb3ROb2RlLmdldCgndHlwZScpCisgICAgICAgIHNlbGYuZW51bSA9IHJvb3ROb2RlLmdldCgncmVxdWlyZXMnKQorICAgICAgICAKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2ZsYWdOYW1lJzogc2VsZi5uYW1lLAorICAgICAgICAgICAgJ2ZsYWdUeXBlJzogc2VsZi50eXBlLAorICAgICAgICAgICAgJ2ZsYWdFbnVtJzogc2VsZi5lbnVtLAorICAgICAgICB9CisgICAgICAgIAorY2xhc3MgVnVsa2FuRnVuY3Rpb246CisgICAgCisgICAgY2xhc3MgUGFyYW1ldGVyKFZ1bGthblZhcmlhYmxlKToKKyAgICAgICAgCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSwgY29uc3RhbnRzKToKKyAgICAgICAgICAgIFZ1bGthblZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIHJvb3ROb2RlLCBjb25zdGFudHMpCisgICAgICAgICAgICBzZWxmLnRleHQgPSAnJy5qb2luKHJvb3ROb2RlLml0ZXJ0ZXh0KCkpCisKKyAgICAgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgJ3BybU5hbWUnOiBzZWxmLm5hbWUsCisgICAgICAgICAgICAgICAgJ3BybUJhc2VUeXBlJzogc2VsZi5iYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAncHJtVHlwZUlEJzogc2VsZi50eXBlSUQsCisgICAgICAgICAgICAgICAgJ3BybVR5cGUnOiBzZWxmLnR5cGUsCisgICAgICAgICAgICAgICAgJ3BybUNoaWxkVHlwZSc6IHNlbGYuY2hpbGRUeXBlLAorICAgICAgICAgICAgICAgICdwcm1QdHJMZXZlbCc6IHNlbGYucG9pbnRlckxldmVscywKKyAgICAgICAgICAgICAgICAncHJtTGVuZ3RoJzogc2VsZi5hcnJheUxlbmd0aCwKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUsIGNvbnN0YW50cyk6CisgICAgICAgIHNlbGYubmFtZSA9IHJvb3ROb2RlLmZpbmQoJ3Byb3RvJykuZmluZCgnbmFtZScpLnRleHQKKyAgICAgICAgc2VsZi5yZXR1cm5UeXBlID0gcm9vdE5vZGUuZmluZCgncHJvdG8nKS5maW5kKCd0eXBlJykudGV4dAorCisgICAgICAgIHNlbGYucGFyYW1ldGVycyA9IFtdCisgICAgICAgIHNlbGYubmFtZWRQYXJhbXMgPSAnJworICAgICAgICBzZWxmLnR5cGVkUGFyYW1zID0gJycKKyAgICAgICAgZm9yIG5vZGUgaW4gcm9vdE5vZGUuZmluZGFsbCgncGFyYW0nKToKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy5hcHBlbmQoVnVsa2FuRnVuY3Rpb24uUGFyYW1ldGVyKG5vZGUsIGNvbnN0YW50cykpCisgICAgICAgICAgICBzZWxmLm5hbWVkUGFyYW1zICs9IHNlbGYucGFyYW1ldGVyc1stMV0ubmFtZSArICcsICcKKyAgICAgICAgICAgIHNlbGYudHlwZWRQYXJhbXMgKz0gc2VsZi5wYXJhbWV0ZXJzWy0xXS50ZXh0ICsgJywgJworICAgICAgICBpZiBsZW4oc2VsZi5wYXJhbWV0ZXJzKSA+IDA6CisgICAgICAgICAgICBzZWxmLm5hbWVkUGFyYW1zID0gc2VsZi5uYW1lZFBhcmFtc1swOi0yXQorICAgICAgICAgICAgc2VsZi50eXBlZFBhcmFtcyA9IHNlbGYudHlwZWRQYXJhbXNbMDotMl0KKyAgICAgICAgICAgIAorICAgICAgICBpZiBzZWxmLnBhcmFtZXRlcnNbMF0udHlwZSBpbiBbJ1ZrSW5zdGFuY2UnLCAnVmtQaHlzaWNhbERldmljZSddIG9yIHNlbGYubmFtZSA9PSAndmtDcmVhdGVJbnN0YW5jZSc6CisgICAgICAgICAgICBzZWxmLnR5cGUgPSAnaW5zdGFuY2UnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnR5cGUgPSAnZGV2aWNlJyAKKyAgICAgICAgICAgIAorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnZnVuY05hbWUnOiBzZWxmLm5hbWUsCisgICAgICAgICAgICAnZnVuY1Nob3J0TmFtZSc6IHNlbGYubmFtZVsyOmxlbihzZWxmLm5hbWUpXSwKKyAgICAgICAgICAgICdmdW5jVHlwZSc6IHNlbGYudHlwZSwKKyAgICAgICAgICAgICdmdW5jUmV0dXJuJzogc2VsZi5yZXR1cm5UeXBlLAorICAgICAgICAgICAgJ2Z1bmNOYW1lZFBhcmFtcyc6IHNlbGYubmFtZWRQYXJhbXMsCisgICAgICAgICAgICAnZnVuY1R5cGVkUGFyYW1zJzogc2VsZi50eXBlZFBhcmFtcywKKyAgICAgICAgICAgICdmdW5jRGlzcGF0Y2hQYXJhbSc6IHNlbGYucGFyYW1ldGVyc1swXS5uYW1lCisgICAgICAgIH0KKyAgICAgICAgCitjbGFzcyBWdWxrYW5GdW5jdGlvblBvaW50ZXI6CisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3ROb2RlKToKKyAgICAgICAgc2VsZi5uYW1lID0gcm9vdE5vZGUuZ2V0KCduYW1lJykKKyAgICAgICAgCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICdwZm5OYW1lJzogc2VsZi5uYW1lLAorICAgICAgICB9CisgICAgICAgICAgICAKK2NsYXNzIFZ1bGthbkhhbmRsZToKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUpOgorICAgICAgICBzZWxmLm5hbWUgPSByb290Tm9kZS5nZXQoJ25hbWUnKQorICAgICAgICBzZWxmLnR5cGUgPSByb290Tm9kZS5nZXQoJ3R5cGUnKQorICAgICAgICBzZWxmLnBhcmVudCA9IHJvb3ROb2RlLmdldCgncGFyZW50JykKKyAgICAgICAgCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICdoZGxOYW1lJzogc2VsZi5uYW1lLAorICAgICAgICAgICAgJ2hkbFR5cGUnOiBzZWxmLnR5cGUsCisgICAgICAgICAgICAnaGRsUGFyZW50Jzogc2VsZi5wYXJlbnQsCisgICAgICAgIH0KKyAgICAgICAgICAgIAorY2xhc3MgVnVsa2FuU3RydWN0OgorICAgIAorICAgIGNsYXNzIE1lbWJlcihWdWxrYW5WYXJpYWJsZSk6CisgICAgICAgIAorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUsIGNvbnN0YW50cywgcGFyZW50TmFtZSk6CisgICAgICAgICAgICBWdWxrYW5WYXJpYWJsZS5fX2luaXRfXyhzZWxmLCByb290Tm9kZSwgY29uc3RhbnRzKQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIFNlYXJjaCBmb3IgYSBtZW1iZXIgY29uZGl0aW9uCisgICAgICAgICAgICBzZWxmLmNvbmRpdGlvbiA9IE5vbmUKKyAgICAgICAgICAgIGlmIHJvb3ROb2RlLmdldCgnbm9hdXRvdmFsaWRpdHknKSA9PSAndHJ1ZScgYW5kIHBhcmVudE5hbWUgaW4gVkFMSURJVFlfQ0hFQ0tTIGFuZCBzZWxmLm5hbWUgaW4gVkFMSURJVFlfQ0hFQ0tTW3BhcmVudE5hbWVdOgorICAgICAgICAgICAgICAgIHNlbGYuY29uZGl0aW9uID0gVkFMSURJVFlfQ0hFQ0tTW3BhcmVudE5hbWVdW3NlbGYubmFtZV0KKyAgICAgICAgICAgIAorICAgICAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAnbWVtTmFtZSc6IHNlbGYubmFtZSwKKyAgICAgICAgICAgICAgICAnbWVtQmFzZVR5cGUnOiBzZWxmLmJhc2VUeXBlLAorICAgICAgICAgICAgICAgICdtZW1UeXBlSUQnOiBzZWxmLnR5cGVJRCwKKyAgICAgICAgICAgICAgICAnbWVtVHlwZSc6IHNlbGYudHlwZSwKKyAgICAgICAgICAgICAgICAnbWVtQ2hpbGRUeXBlJzogc2VsZi5jaGlsZFR5cGUsCisgICAgICAgICAgICAgICAgJ21lbVB0ckxldmVsJzogc2VsZi5wb2ludGVyTGV2ZWxzLAorICAgICAgICAgICAgICAgICdtZW1MZW5ndGgnOiBzZWxmLmFycmF5TGVuZ3RoLAorICAgICAgICAgICAgICAgICdtZW1MZW5ndGhJc01lbWJlcic6IHNlbGYubGVuZ3RoTWVtYmVyLAorICAgICAgICAgICAgICAgICdtZW1Db25kaXRpb24nOiBzZWxmLmNvbmRpdGlvbiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSwgY29uc3RhbnRzKToKKyAgICAgICAgc2VsZi5uYW1lID0gcm9vdE5vZGUuZ2V0KCduYW1lJykKKyAgICAgICAgc2VsZi5tZW1iZXJzID0gW10KKyAgICAgICAgZm9yIG5vZGUgaW4gcm9vdE5vZGUuZmluZGFsbCgnbWVtYmVyJyk6CisgICAgICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKFZ1bGthblN0cnVjdC5NZW1iZXIobm9kZSwgY29uc3RhbnRzLCBzZWxmLm5hbWUpKQorICAgICAgICAgICAgCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICdzY3ROYW1lJzogc2VsZi5uYW1lLAorICAgICAgICB9CisgICAgICAgICAgICAKK2NsYXNzIFZ1bGthblN5c3RlbVR5cGU6CisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGV4dCk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi50eXBlID0gc2VsZi5uYW1lIGlmIG5hbWUgbm90IGluIFBPSU5URVJfVFlQRVMgZWxzZSBzZWxmLm5hbWUgKyAnKicKKyAgICAgICAgc2VsZi5leHQgPSBleHQKKyAgICAgICAgCisgICAgZGVmIF9fZXFfXyhzZWxmLCB0aGF0KToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSA9PSB0aGF0Lm5hbWUgYW5kIHNlbGYudHlwZSA9PSB0aGF0LnR5cGUKKyAgICAgICAgCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLm5hbWUpIHwgaGFzaChzZWxmLnR5cGUpCisgICAgICAgIAorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnc3lzTmFtZSc6IHNlbGYubmFtZSwKKyAgICAgICAgICAgICdzeXNUeXBlJzogc2VsZi50eXBlLAorICAgICAgICB9CisgICAgICAgICAgICAKK2NsYXNzIFZ1bGthblVuaW9uOgorICAgIAorICAgIGNsYXNzIENob2ljZShWdWxrYW5WYXJpYWJsZSk6CisgICAgICAgIAorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdE5vZGUsIGNvbnN0YW50cyk6CisgICAgICAgICAgICBWdWxrYW5WYXJpYWJsZS5fX2luaXRfXyhzZWxmLCByb290Tm9kZSwgY29uc3RhbnRzKQorICAgICAgICAgICAgCisgICAgICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICdjaGNOYW1lJzogc2VsZi5uYW1lLAorICAgICAgICAgICAgICAgICdjaGNCYXNlVHlwZSc6IHNlbGYuYmFzZVR5cGUsCisgICAgICAgICAgICAgICAgJ2NoY1R5cGVJRCc6IHNlbGYudHlwZUlELAorICAgICAgICAgICAgICAgICdjaGNUeXBlJzogc2VsZi50eXBlLAorICAgICAgICAgICAgICAgICdjaGNDaGlsZFR5cGUnOiBzZWxmLmNoaWxkVHlwZSwKKyAgICAgICAgICAgICAgICAnY2hjUHRyTGV2ZWwnOiBzZWxmLnBvaW50ZXJMZXZlbHMsCisgICAgICAgICAgICAgICAgJ2NoY0xlbmd0aCc6IHNlbGYuYXJyYXlMZW5ndGgsCisgICAgICAgICAgICAgICAgIydjaGNMZW5ndGhJc01lbWJlcic6IHNlbGYubGVuZ3RoTWVtYmVyLAorICAgICAgICAgICAgfQorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290Tm9kZSwgY29uc3RhbnRzKToKKyAgICAgICAgc2VsZi5uYW1lID0gcm9vdE5vZGUuZ2V0KCduYW1lJykKKyAgICAgICAgc2VsZi5jaG9pY2VzID0gW10KKyAgICAgICAgZm9yIG5vZGUgaW4gcm9vdE5vZGUuZmluZGFsbCgnbWVtYmVyJyk6CisgICAgICAgICAgICBzZWxmLmNob2ljZXMuYXBwZW5kKFZ1bGthblVuaW9uLkNob2ljZShub2RlLCBjb25zdGFudHMpKQorICAgICAgICAKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ3VuTmFtZSc6IHNlbGYubmFtZSwKKyAgICAgICAgfQorICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQtYW5kcm9pZC9hbmRyb2lkLWdlbmVyYXRlLmJhdCBiL2J1aWxkLWFuZHJvaWQvYW5kcm9pZC1nZW5lcmF0ZS5iYXQKaW5kZXggY2ZlMGVkMy4uYjU4MTU5YyAxMDA2NDQKLS0tIGEvYnVpbGQtYW5kcm9pZC9hbmRyb2lkLWdlbmVyYXRlLmJhdAorKysgYi9idWlsZC1hbmRyb2lkL2FuZHJvaWQtZ2VuZXJhdGUuYmF0CkBAIC0yOCw2ICsyOCwyMCBAQAogcHl0aG9uIC4uLy4uLy4uL2x2bF9nZW52ay5weSAtcmVnaXN0cnkgLi4vLi4vLi4vdmsueG1sIHRocmVhZF9jaGVjay5oDQogcHl0aG9uIC4uLy4uLy4uL2x2bF9nZW52ay5weSAtcmVnaXN0cnkgLi4vLi4vLi4vdmsueG1sIHBhcmFtZXRlcl92YWxpZGF0aW9uLmgNCiBweXRob24gLi4vLi4vLi4vbHZsX2dlbnZrLnB5IC1yZWdpc3RyeSAuLi8uLi8uLi92ay54bWwgdW5pcXVlX29iamVjdHNfd3JhcHBlcnMuaA0KK3B5dGhvbiAuLi8uLi8uLi92dF9nZW52ay5weSAtcmVnaXN0cnkgLi4vLi4vLi4vdmsueG1sIGFwaV9kdW1wLmNwcA0KK3B5dGhvbiAuLi8uLi8uLi92dF9nZW52ay5weSAtcmVnaXN0cnkgLi4vLi4vLi4vdmsueG1sIGFwaV9kdW1wX3RleHQuaA0KKw0KK1JFTSB2a3RyYWNlDQorcHl0aG9uIC4uLy4uLy4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS10cmFjZS1oIHZrX3ZlcnNpb25fMV8wID4gdmt0cmFjZV92a192ay5oDQorcHl0aG9uIC4uLy4uLy4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS10cmFjZS1jIHZrX3ZlcnNpb25fMV8wID4gdmt0cmFjZV92a192ay5jcHANCitweXRob24gLi4vLi4vLi4vdmt0cmFjZS92a3RyYWNlX2dlbmVyYXRlLnB5IEFsbFBsYXRmb3JtcyB2a3RyYWNlLWNvcmUtdHJhY2UtcGFja2V0cyB2a192ZXJzaW9uXzFfMCA+IHZrdHJhY2VfdmtfdmtfcGFja2V0cy5oDQorcHl0aG9uIC4uLy4uLy4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1wYWNrZXQtaWQgdmtfdmVyc2lvbl8xXzAgPiB2a3RyYWNlX3ZrX3BhY2tldF9pZC5oDQorDQorUkVNIHZrcmVwbGF5DQorcHl0aG9uIC4uLy4uLy4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1yZXBsYXktdmstZnVuY3MgdmtfdmVyc2lvbl8xXzAgPiB2a3JlcGxheV92a19mdW5jX3B0cnMuaA0KK3B5dGhvbiAuLi8uLi8uLi92a3RyYWNlL3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtcmVwbGF5LWMgdmtfdmVyc2lvbl8xXzAgPiB2a3JlcGxheV92a19yZXBsYXlfZ2VuLmNwcA0KK3B5dGhvbiAuLi8uLi8uLi92a3RyYWNlL3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtcmVwbGF5LW9iai1tYXBwZXItaCB2a192ZXJzaW9uXzFfMCA+IHZrcmVwbGF5X3ZrX29iam1hcHBlci5oDQorDQogY2QgLi4vLi4NCiANCiBjb3B5IC9ZIC4uXGxheWVyc1x2a19sYXllcl9jb25maWcuY3BwICAgZ2VuZXJhdGVkXGNvbW1vblwNCkBAIC0zOSwxOCArNTMsMjUgQEAKIFJFTSBjcmVhdGUgYnVpbGQtc2NyaXB0IHJvb3QgZGlyZWN0b3J5DQogbWtkaXIgZ2VuZXJhdGVkXGdyYWRsZS1idWlsZA0KIGNkIGdlbmVyYXRlZFxncmFkbGUtYnVpbGQNCi1ta2RpciAgY29yZV92YWxpZGF0aW9uIGltYWdlIG9iamVjdF90cmFja2VyIHBhcmFtZXRlcl92YWxpZGF0aW9uIHN3YXBjaGFpbiB0aHJlYWRpbmcgdW5pcXVlX29iamVjdHMNCitta2RpciAgY29yZV92YWxpZGF0aW9uIGltYWdlIG9iamVjdF90cmFja2VyIHBhcmFtZXRlcl92YWxpZGF0aW9uIHN3YXBjaGFpbiB0aHJlYWRpbmcgdW5pcXVlX29iamVjdHMgYXBpX2R1bXAgc2NyZWVuc2hvdA0KIGNkIC4uXC4uDQogbWtkaXIgZ2VuZXJhdGVkXGxheWVyLXNyYw0KIGNkIGdlbmVyYXRlZFxsYXllci1zcmMNCi1ta2RpciAgY29yZV92YWxpZGF0aW9uIGltYWdlIG9iamVjdF90cmFja2VyIHBhcmFtZXRlcl92YWxpZGF0aW9uIHN3YXBjaGFpbiB0aHJlYWRpbmcgdW5pcXVlX29iamVjdHMNCitta2RpciAgY29yZV92YWxpZGF0aW9uIGltYWdlIG9iamVjdF90cmFja2VyIHBhcmFtZXRlcl92YWxpZGF0aW9uIHN3YXBjaGFpbiB0aHJlYWRpbmcgdW5pcXVlX29iamVjdHMgYXBpX2R1bXAgc2NyZWVuc2hvdA0KIGNkIC4uXC4uDQogeGNvcHkgL3MgZ3JhZGxlLXRlbXBsYXRlc1wqICAgZ2VuZXJhdGVkXGdyYWRsZS1idWlsZFwNCiBmb3IgJSVHIGluIChjb3JlX3ZhbGlkYXRpb24gaW1hZ2Ugb2JqZWN0X3RyYWNrZXIgcGFyYW1ldGVyX3ZhbGlkYXRpb24gc3dhcGNoYWluIHRocmVhZGluZyB1bmlxdWVfb2JqZWN0cykgRG8gKA0KICAgICBjb3B5IC4uXGxheWVyc1wlJUcuY3BwICAgZ2VuZXJhdGVkXGxheWVyLXNyY1wlJUcNCiAgICAgZWNobyBhcHBseSBmcm9tOiAiLi4vY29tbW9uLmdyYWRsZSIgID4gZ2VuZXJhdGVkXGdyYWRsZS1idWlsZFwlJUdcYnVpbGQuZ3JhZGxlDQogKQ0KK2ZvciAlJUcgaW4gKHNjcmVlbnNob3QpIERvICgNCisgICAgY29weSAuLlxsYXllcnN2dFwlJUcuY3BwICAgZ2VuZXJhdGVkXGxheWVyLXNyY1wlJUcNCisgICAgZWNobyBhcHBseSBmcm9tOiAiLi4vY29tbW9uLmdyYWRsZSIgID4gZ2VuZXJhdGVkXGdyYWRsZS1idWlsZFwlJUdcYnVpbGQuZ3JhZGxlDQorKQ0KK2NvcHkgZ2VuZXJhdGVkXGluY2x1ZGVcYXBpX2R1bXAuY3BwICAgZ2VuZXJhdGVkXGxheWVyLXNyY1xhcGlfZHVtcA0KIGNvcHkgZ2VuZXJhdGVkXGNvbW1vblxkZXNjcmlwdG9yX3NldHMuY3BwIGdlbmVyYXRlZFxsYXllci1zcmNcY29yZV92YWxpZGF0aW9uXGRlc2NyaXB0b3Jfc2V0cy5jcHANCiBjb3B5IGdlbmVyYXRlZFxpbmNsdWRlXHZrX3NhZmVfc3RydWN0LmNwcCBnZW5lcmF0ZWRcbGF5ZXItc3JjXGNvcmVfdmFsaWRhdGlvblx2a19zYWZlX3N0cnVjdC5jcHANCiBtb3ZlIGdlbmVyYXRlZFxpbmNsdWRlXHZrX3NhZmVfc3RydWN0LmNwcCBnZW5lcmF0ZWRcbGF5ZXItc3JjXHVuaXF1ZV9vYmplY3RzXHZrX3NhZmVfc3RydWN0LmNwcA0KIGVjaG8gYXBwbHkgZnJvbTogIi4uL2NvbW1vbi5ncmFkbGUiICA+IGdlbmVyYXRlZFxncmFkbGUtYnVpbGRcdW5pcXVlX29iamVjdHNcYnVpbGQuZ3JhZGxlDQorDQorZGVsICAvZiAvcSBnZW5lcmF0ZWRcaW5jbHVkZVxhcGlfZHVtcC5jcHANCmRpZmYgLS1naXQgYS9idWlsZC1hbmRyb2lkL2FuZHJvaWQtZ2VuZXJhdGUuc2ggYi9idWlsZC1hbmRyb2lkL2FuZHJvaWQtZ2VuZXJhdGUuc2gKaW5kZXggMmZkNDMyZC4uMTRhOTZlZCAxMDA3NTUKLS0tIGEvYnVpbGQtYW5kcm9pZC9hbmRyb2lkLWdlbmVyYXRlLnNoCisrKyBiL2J1aWxkLWFuZHJvaWQvYW5kcm9pZC1nZW5lcmF0ZS5zaApAQCAtMzAsNiArMzAsMjAgQEAKICggY2QgZ2VuZXJhdGVkL2luY2x1ZGU7IHB5dGhvbiAuLi8uLi8uLi9sdmxfZ2VudmsucHkgLXJlZ2lzdHJ5IC4uLy4uLy4uL3ZrLnhtbCBwYXJhbWV0ZXJfdmFsaWRhdGlvbi5oICkKICggY2QgZ2VuZXJhdGVkL2luY2x1ZGU7IHB5dGhvbiAuLi8uLi8uLi9sdmxfZ2VudmsucHkgLXJlZ2lzdHJ5IC4uLy4uLy4uL3ZrLnhtbCB1bmlxdWVfb2JqZWN0c193cmFwcGVycy5oICkKIAorKCBjZCBnZW5lcmF0ZWQvaW5jbHVkZTsgcHl0aG9uIC4uLy4uLy4uL3Z0X2dlbnZrLnB5IC1yZWdpc3RyeSAuLi8uLi8uLi92ay54bWwgYXBpX2R1bXAuY3BwICkKKyggY2QgZ2VuZXJhdGVkL2luY2x1ZGU7IHB5dGhvbiAuLi8uLi8uLi92dF9nZW52ay5weSAtcmVnaXN0cnkgLi4vLi4vLi4vdmsueG1sIGFwaV9kdW1wX3RleHQuaCApCisKKyMgdmt0cmFjZQorcHl0aG9uIC4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS10cmFjZS1oIHZrX3ZlcnNpb25fMV8wID4gZ2VuZXJhdGVkL2luY2x1ZGUvdmt0cmFjZV92a192ay5oCitweXRob24gLi4vdmt0cmFjZS92a3RyYWNlX2dlbmVyYXRlLnB5IEFsbFBsYXRmb3JtcyB2a3RyYWNlLXRyYWNlLWMgdmtfdmVyc2lvbl8xXzAgPiBnZW5lcmF0ZWQvaW5jbHVkZS92a3RyYWNlX3ZrX3ZrLmNwcAorcHl0aG9uIC4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1jb3JlLXRyYWNlLXBhY2tldHMgdmtfdmVyc2lvbl8xXzAgPiBnZW5lcmF0ZWQvaW5jbHVkZS92a3RyYWNlX3ZrX3ZrX3BhY2tldHMuaAorcHl0aG9uIC4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1wYWNrZXQtaWQgdmtfdmVyc2lvbl8xXzAgPiBnZW5lcmF0ZWQvaW5jbHVkZS92a3RyYWNlX3ZrX3BhY2tldF9pZC5oCisKKyMgdmtyZXBsYXkKK3B5dGhvbiAuLi92a3RyYWNlL3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtcmVwbGF5LXZrLWZ1bmNzIHZrX3ZlcnNpb25fMV8wID4gZ2VuZXJhdGVkL2luY2x1ZGUvdmtyZXBsYXlfdmtfZnVuY19wdHJzLmgKK3B5dGhvbiAuLi92a3RyYWNlL3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtcmVwbGF5LWMgdmtfdmVyc2lvbl8xXzAgPiBnZW5lcmF0ZWQvaW5jbHVkZS92a3JlcGxheV92a19yZXBsYXlfZ2VuLmNwcAorcHl0aG9uIC4uL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1yZXBsYXktb2JqLW1hcHBlci1oIHZrX3ZlcnNpb25fMV8wID4gZ2VuZXJhdGVkL2luY2x1ZGUvdmtyZXBsYXlfdmtfb2JqbWFwcGVyLmgKKwogY3AgLWYgLi4vbGF5ZXJzL3ZrX2xheWVyX2NvbmZpZy5jcHAgICBnZW5lcmF0ZWQvY29tbW9uLwogY3AgLWYgLi4vbGF5ZXJzL3ZrX2xheWVyX2V4dGVuc2lvbl91dGlscy5jcHAgIGdlbmVyYXRlZC9jb21tb24vCiBjcCAtZiAuLi9sYXllcnMvdmtfbGF5ZXJfdXRpbHMuY3BwICAgIGdlbmVyYXRlZC9jb21tb24vCkBAIC0zOSw4ICs1Myw4IEBACiAjIGxheWVyIG5hbWVzIGFuZCB0aGVpciBvcmlnaW5hbCBzb3VyY2UgZmlsZXMgZGlyZWN0b3J5CiAjIDEgdG8gMSBjb3JyZXNwb25kZW5jZSAtLSBvbmUgbGF5ZXIgb25lIHNvdXJjZSBmaWxlOyBhZGRpdGlvbmFsIGZpbGVzIGFyZSBjb3BpZWQKICMgYXQgZml4dXAgc3RlcAotZGVjbGFyZSBsYXllcnM9KGNvcmVfdmFsaWRhdGlvbiBpbWFnZSBvYmplY3RfdHJhY2tlciBwYXJhbWV0ZXJfdmFsaWRhdGlvbiBzd2FwY2hhaW4gdGhyZWFkaW5nIHVuaXF1ZV9vYmplY3RzKQotZGVjbGFyZSBzcmNfZGlycz0oLi4vbGF5ZXJzIC4uL2xheWVycyAuLi9sYXllcnMgLi4vbGF5ZXJzIC4uL2xheWVycyAuLi9sYXllcnMgLi4vbGF5ZXJzKQorZGVjbGFyZSBsYXllcnM9KGNvcmVfdmFsaWRhdGlvbiBpbWFnZSBvYmplY3RfdHJhY2tlciBwYXJhbWV0ZXJfdmFsaWRhdGlvbiBzd2FwY2hhaW4gdGhyZWFkaW5nIHVuaXF1ZV9vYmplY3RzIGFwaV9kdW1wIHNjcmVlbnNob3QpCitkZWNsYXJlIHNyY19kaXJzPSguLi9sYXllcnMgLi4vbGF5ZXJzIC4uL2xheWVycyAuLi9sYXllcnMgLi4vbGF5ZXJzIC4uL2xheWVycyAuLi9sYXllcnMgZ2VuZXJhdGVkL2luY2x1ZGUgLi4vbGF5ZXJzdnQpCiAKIFNSQ19ST09UPWdlbmVyYXRlZC9sYXllci1zcmMKIEJVSUxEX1JPT1Q9Z2VuZXJhdGVkL2dyYWRsZS1idWlsZApAQCAtNjMsNCArNzcsNyBAQAogY3AgIGdlbmVyYXRlZC9pbmNsdWRlL3ZrX3NhZmVfc3RydWN0LmNwcCAke1NSQ19ST09UfS9jb3JlX3ZhbGlkYXRpb24vdmtfc2FmZV9zdHJ1Y3QuY3BwCiBtdiAgZ2VuZXJhdGVkL2luY2x1ZGUvdmtfc2FmZV9zdHJ1Y3QuY3BwICR7U1JDX1JPT1R9L3VuaXF1ZV9vYmplY3RzL3ZrX3NhZmVfc3RydWN0LmNwcAogCisjIGZpeHVwIC0gcmVtb3ZlIGNvcGllZCBmaWxlcyBmcm9tIGdlbmVyYXRlZC9pbmNsdWRlCitybSAgZ2VuZXJhdGVkL2luY2x1ZGUvYXBpX2R1bXAuY3BwCisKIGV4aXQgMApkaWZmIC0tZ2l0IGEvYnVpbGQtYW5kcm9pZC9idWlsZF92a3RyYWNlcmVwbGF5LmJhdCBiL2J1aWxkLWFuZHJvaWQvYnVpbGRfdmt0cmFjZXJlcGxheS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWFuZHJvaWQvYnVpbGRfdmt0cmFjZXJlcGxheS5iYXQKQEAgLTAsMCArMSw1NyBAQAorQGVjaG8gb2ZmCitSRU0gIyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitSRU0gIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KK1JFTQorUkVNICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitSRU0gIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitSRU0gIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK1JFTQorUkVNICMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1JFTQorUkVNICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorUkVNICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1JFTSAjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorUkVNICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorUkVNICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3NldCBudW1fY3B1cz0lTlVNQkVSX09GX1BST0NFU1NPUlMlCisKK1JFTQorUkVNIGJ1aWxkIGxheWVycworUkVNCitjYWxsIHVwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuYmF0CitjYWxsIGFuZHJvaWQtZ2VuZXJhdGUuYmF0CitjYWxsIG5kay1idWlsZCAtaiAlbnVtX2NwdXMlCisKK2lmICVlcnJvcmxldmVsJSBuZXEgMCBleGl0IC9iICVlcnJvcmxldmVsJQorCitSRU0KK1JFTSBjcmVhdGUgdmtyZXBsYXkgQVBLCitSRU0KK2NhbGwgYW5kcm9pZCB1cGRhdGUgcHJvamVjdCAtcyAtcCAuIC10ICJhbmRyb2lkLTIzIgorY2FsbCBhbnQgLWJ1aWxkZmlsZSB2a3JlcGxheSBkZWJ1ZworCitpZiAlZXJyb3JsZXZlbCUgbmVxIDAgZXhpdCAvYiAlZXJyb3JsZXZlbCUKKworUkVNCitSRU0gYnVpbGQgY3ViZS13aXRoLWxheWVycworUkVNCitwdXNoZCAuLlxkZW1vc1xhbmRyb2lkCitjYWxsIGFuZHJvaWQgdXBkYXRlIHByb2plY3QgLXMgLXAgLiAtdCAiYW5kcm9pZC0yMyIKK2NhbGwgbmRrLWJ1aWxkIC1qICAlbnVtX2NwdXMlCitjYWxsIGFudCAtYnVpbGRmaWxlIGN1YmUtd2l0aC1sYXllcnMgZGVidWcKK3BvcGQKKworaWYgJWVycm9ybGV2ZWwlIG5lcSAwIGV4aXQgL2IgJWVycm9ybGV2ZWwlCisKK1JFTQorUkVNIGJ1aWxkIHZrdHJhY2UKK1JFTQorcHVzaGQgLi4KK2NhbGwgdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuYmF0IC0tYWxsCitjYWxsIGJ1aWxkX3dpbmRvd3NfdGFyZ2V0cy5iYXQKK3BvcGQKKworaWYgJWVycm9ybGV2ZWwlIG5lcSAwIGV4aXQgL2IgJWVycm9ybGV2ZWwlCisKK2V4aXQgL2IgMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkLWFuZHJvaWQvYnVpbGRfdmt0cmFjZXJlcGxheS5zaCBiL2J1aWxkLWFuZHJvaWQvYnVpbGRfdmt0cmFjZXJlcGxheS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZWU1NzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQtYW5kcm9pZC9idWlsZF92a3RyYWNlcmVwbGF5LnNoCkBAIC0wLDAgKzEsNjAgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtZXYKKworaWYgW1sgJCh1bmFtZSkgPT0gIkxpbnV4IiBdXTsgdGhlbgorICAgIGNvcmVzPSQobmNwdXMpCitlbGlmIFtbICQodW5hbWUpID09ICJEYXJ3aW4iIF1dOyB0aGVuCisgICAgY29yZXM9JChzeXNjdGwgLW4gaHcubmNwdSkKK2ZpCisKKyMKKyMgYnVpbGQgbGF5ZXJzCisjCisuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzX2FuZHJvaWQuc2gKKy4vYW5kcm9pZC1nZW5lcmF0ZS5zaAorbmRrLWJ1aWxkIC1qICRjb3JlcworCisjCisjIGNyZWF0ZSB2a3JlcGxheSBBUEsKKyMKK2FuZHJvaWQgdXBkYXRlIHByb2plY3QgLXMgLXAgLiAtdCAiYW5kcm9pZC0yMyIKK2FudCAtYnVpbGRmaWxlIHZrcmVwbGF5IGRlYnVnCisKKyMKKyMgYnVpbGQgY3ViZS13aXRoLWxheWVycworIworKAorcHVzaGQgLi4vZGVtb3MvYW5kcm9pZAorYW5kcm9pZCB1cGRhdGUgcHJvamVjdCAtcyAtcCAuIC10ICJhbmRyb2lkLTIzIgorbmRrLWJ1aWxkIC1qICRjb3JlcworYW50IC1idWlsZGZpbGUgY3ViZS13aXRoLWxheWVycyBkZWJ1ZworcG9wZAorKQorCisjCisjIGJ1aWxkIHZrdHJhY2UKKyMKKygKK3B1c2hkIC4uCisuL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLnNoIC1nIC1zCitta2RpciAtcCBidWlsZAorY2QgYnVpbGQKK2NtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAtREJVSUxEX0xPQURFUj1PZmYgLURCVUlMRF9JQ0Q9T2ZmIC1EQlVJTERfVEVTVFM9T2ZmIC1EQlVJTERfTEFZRVJTPU9mZiAtREJVSUxEX1ZLVFJBQ0VWSUVXRVI9T2ZmIC1EQlVJTERfTEFZRVJTVlQ9T2ZmIC1EQlVJTERfREVNT1M9T2ZmIC1EQlVJTERfVktKU09OPU9mZiAtREJVSUxEX1ZJQT1PZmYgLURCVUlMRF9WS1RSQUNFX0xBWUVSPU9mZiAtREJVSUxEX1ZLVFJBQ0VfUkVQTEFZPU9mZiAtREJVSUxEX1ZLVFJBQ0U9T24gLi4KK21ha2UgLWogJGNvcmVzIHZrdHJhY2UKK3BvcGQKKykKKworIworIyBidWlsZCB2a3RyYWNlMzIKKyMKKygKK3B1c2hkIC4uCitta2RpciAtcCBidWlsZDMyCitjZCBidWlsZDMyCitjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLURCVUlMRF9MT0FERVI9T2ZmIC1EQlVJTERfSUNEPU9mZiAtREJVSUxEX1RFU1RTPU9mZiAtREJVSUxEX0xBWUVSUz1PZmYgLURCVUlMRF9WS1RSQUNFVklFV0VSPU9mZiAtREJVSUxEX0xBWUVSU1ZUPU9mZiAtREJVSUxEX0RFTU9TPU9mZiAtREJVSUxEX1ZLSlNPTj1PZmYgLURCVUlMRF9WSUE9T2ZmIC1EQlVJTERfVktUUkFDRV9MQVlFUj1PZmYgLURCVUlMRF9WS1RSQUNFX1JFUExBWT1PZmYgLURCVUlMRF9YNjQ9T2ZmIC1EQlVJTERfVktUUkFDRT1PbiAuLgorbWFrZSAtaiAkY29yZXMgdmt0cmFjZQorcG9wZAorKQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2J1aWxkLWFuZHJvaWQvY3JlYXRlX3RyYWNlLnNoIGIvYnVpbGQtYW5kcm9pZC9jcmVhdGVfdHJhY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTEyZWQwZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWFuZHJvaWQvY3JlYXRlX3RyYWNlLnNoCkBAIC0wLDAgKzEsMjU5IEBACisjIS9iaW4vYmFzaAorCisjc2V0IC12ZXgKKworc2NyaXB0X3N0YXJ0X3RpbWU9JChkYXRlICslcykKKworZGVmYXVsdF92a3RyYWNlX2V4ZT0uLi9idWlsZC92a3RyYWNlL3ZrdHJhY2UKK2RlZmF1bHRfdmt0cmFjZTMyX2V4ZT0uLi9idWlsZDMyL3ZrdHJhY2Uvdmt0cmFjZTMyCitkZWZhdWx0X3RhcmdldF9hYmk9JChhZGIgc2hlbGwgZ2V0cHJvcCByby5wcm9kdWN0LmNwdS5hYmkpCitkZWZhdWx0X2FjdGl2aXR5PWFuZHJvaWQuYXBwLk5hdGl2ZUFjdGl2aXR5CisKKyMKKyMgUGFyc2UgcGFyYW1ldGVycworIworCitmdW5jdGlvbiBwcmludFVzYWdlIHsKKyAgIGVjaG8gIlN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZToiCisgICBlY2hvICIgICAgLS1zZXJpYWwgPHRhcmdldCBkZXZpY2Ugc2VyaWFsIG51bWJlcj4iCisgICBlY2hvICIgICAgLS1hYmkgPGFiaSB0byBpbnN0YWxsPiIKKyAgIGVjaG8gIiAgICAtLXZrdHJhY2UgPGZ1bGwgcGF0aCB0byB2a3RyYWNlIG9uIGhvc3Q+IChvcHRpb25hbCkiCisgICBlY2hvICIgICAgLS1wYWNrYWdlIDxwYWNrYWdlIG5hbWU+IgorICAgZWNobyAiICAgIC0tYWN0dml0eSA8bGF1bmNoYWJsZS1hY3Rpdml0eSBuYW1lPiIKKyAgIGVjaG8gIiAgICAtLWZyYW1lIDxmcmFtZSBudW1iZXIgdG8gY2FwdHVyZT4gKG9wdGlvbmFsKSIKKyAgIGVjaG8KKyAgIGVjaG8gImkuZS4gJHswIyMqL30gLS1zZXJpYWwgMDEyMzQ1NjcgXFwiCisgICBlY2hvICIgICAgICAgICAgICAgIC0tYWJpIGFybTY0LXY4YSBcXCIKKyAgIGVjaG8gIiAgICAgICAgICAgICAgLS12a3RyYWNlIC4uL2J1aWxkL3ZrdHJhY2Uvdmt0cmFjZSBcXCIKKyAgIGVjaG8gIiAgICAgICAgICAgICAgLS1wYWNrYWdlIGNvbS5leGFtcGxlLmZvbyBcXCIKKyAgIGVjaG8gIiAgICAgICAgICAgICAgLS1hY3R2aXR5IGFuZHJvaWQuYXBwLk5hdGl2ZUFjdGl2aXR5IFxcIgorICAgZWNobyAiICAgICAgICAgICAgICAtLWZyYW1lIDEwMCIKKyAgIGV4aXQgMQorfQorCitpZiBbWyAkKCgkIyAlIDIpKSAtbmUgMCBdXQordGhlbgorICAgIGVjaG8gUGFyYW1ldGVycyBtdXN0IGJlIHByb3ZpZGVkIGluIHBhaXJzLgorICAgIGVjaG8gcGFyYW1ldGVyIGNvdW50ID0gJCMKKyAgICBlY2hvCisgICAgcHJpbnRVc2FnZQorICAgIGV4aXQgMQorZmkKKword2hpbGUgW1sgJCMgLWd0IDAgXV0KK2RvCisgICAgY2FzZSAkMSBpbgorICAgICAgICAtLXNlcmlhbCkKKyAgICAgICAgICAgICMgaW5jbHVkZSB0aGUgZmxhZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGxlYXZlIGl0IG9mZiBpZiBub3QgcHJvdmlkZWQKKyAgICAgICAgICAgIHNlcmlhbD0iJDIiCisgICAgICAgICAgICBzZXJpYWxGbGFnPSItcyAkc2VyaWFsIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1hYmkpCisgICAgICAgICAgICB0YXJnZXRfYWJpPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tdmt0cmFjZSkKKyAgICAgICAgICAgIHZrdHJhY2VfZXhlPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tcGFja2FnZSkKKyAgICAgICAgICAgIHBhY2thZ2U9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1hY3Rpdml0eSkKKyAgICAgICAgICAgIGFjdGl2aXR5PSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tZnJhbWUpCisgICAgICAgICAgICBmcmFtZT0iJDIiCisgICAgICAgICAgICBzaGlmdCAyCisgICAgICAgICAgICA7OworICAgICAgICAtKikKKyAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICAgICAgICAgIGVjaG8gVW5rbm93biBvcHRpb246ICQxCisgICAgICAgICAgICBlY2hvCisgICAgICAgICAgICBwcmludFVzYWdlCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitlY2hvIHNlcmlhbCA9ICRzZXJpYWwKKworaWYgW1sgLXogJHNlcmlhbCBdXQordGhlbgorICAgIGVjaG8gUGxlYXNlIHByb3ZpZGUgYSBzZXJpYWwgbnVtYmVyLgorICAgIGVjaG8KKyAgICBwcmludFVzYWdlCisgICAgZXhpdCAxCitmaQorCitpZiBbWyAkKGFkYiBkZXZpY2VzKSAhPSAqIiRzZXJpYWwiKiBdXTsKK3RoZW4KKyAgICBlY2hvIERldmljZSBub3QgZm91bmQ6ICRzZXJpYWwKKyAgICBlY2hvCisgICAgcHJpbnRVc2FnZQorICAgIGV4aXQgMQorZmkKKworaWYgW1sgLXogJHRhcmdldF9hYmkgXV07Cit0aGVuCisgICAgZWNobyBVc2luZyBkZWZhdWx0IHRhcmdldF9hYmkKKyAgICB0YXJnZXRfYWJpPSRkZWZhdWx0X3RhcmdldF9hYmkKK2ZpCitlY2hvIHRhcmdldF9hYmkgPSAkdGFyZ2V0X2FiaQorCitpZiBbWyAkdGFyZ2V0X2FiaSA9PSAiYXJtZWFiaS12N2EiIF1dIHx8CisgICBbWyAkdGFyZ2V0X2FiaSA9PSAibWlwcyIgXV0gfHwKKyAgIFtbICR0YXJnZXRfYWJpID09ICJ4ODYiIF1dOwordGhlbgorICAgIGVjaG8gVGFyZ2V0aW5nIDMyLWJpdCBhYmkgJHRhcmdldF9hYmkKKyAgICB0YXJnZXRfMzJiaXRfYWJpPTEKK2ZpCisKK2lmIFtbIC16ICR2a3RyYWNlX2V4ZSBdXTsKK3RoZW4KKyAgICBlY2hvIFVzaW5nIGRlZmF1bHQgdmt0cmFjZV9leGUKKyAgICB2a3RyYWNlX2V4ZT0kZGVmYXVsdF92a3RyYWNlX2V4ZQorICAgIGlmIFtbICR0YXJnZXRfMzJiaXRfYWJpIF1dCisgICAgdGhlbgorICAgICAgICB2a3RyYWNlX2V4ZT0kZGVmYXVsdF92a3RyYWNlMzJfZXhlCisgICAgZmkKK2Vsc2UKKyAgICBpZiBbWyAkdGFyZ2V0XzMyYml0X2FiaSBdXQorICAgIHRoZW4KKyAgICAgICBlY2hvIEVuc3VyZSB5b3VyIHZrdHJhY2UgaXMgMzItYml0LCBpLmUuIHZrdHJhY2UzMgorICAgIGZpCitmaQorZWNobyB2a3RyYWNlX2V4ZSA9ICR2a3RyYWNlX2V4ZQorCitpZiBbWyAteiAkcGFja2FnZSBdXTsKK3RoZW4KKyAgICBlY2hvIHRhcmdldCBwYWNrYWdlIG5hbWUgcmVxdWlyZWQKKyAgICBleGl0IDEKK2ZpCitlY2hvIHBhY2thZ2UgPSAkcGFja2FnZQorCitpZiBbWyAteiAkYWN0aXZpdHkgXV07Cit0aGVuCisgICAgZWNobyBVc2luZyBkZWZhdWx0IGFjdGl2aXR5CisgICAgYWN0aXZpdHk9JGRlZmF1bHRfYWN0aXZpdHkKK2ZpCitlY2hvIGFjdGl2aXR5ID0gJGFjdGl2aXR5CisKK2lmIFtbIC16ICRmcmFtZSBdXTsKK3RoZW4KKyAgICBlY2hvIE5vdCBhdHRlbXB0aW5nIHRvIHJlY29yZCBhbnkgc2NyZWVuc2hvdAorZWxzZQorICAgIGVjaG8gQXR0ZW1wdGluZyB0byByZWNvcmQgc2NyZWVuc2hvdCBvZiBmcmFtZSAkZnJhbWUKK2ZpCisKK2Z1bmN0aW9uIHByaW50TGF5ZXJCdWlsZCgpIHsKKyAgICBlY2hvICJUbyBidWlsZCBsYXllcnM6IgorICAgIGVjaG8gIi4vdXBkYXRlX2V4dGVybmFsX3NvdXJjZXNfYW5kcm9pZC5zaCIKKyAgICBlY2hvICIuL2FuZHJvaWQtZ2VuZXJhdGUuc2giCisgICAgZWNobyAibmRrLWJ1aWxkIC1qIgorfQorCitmdW5jdGlvbiBwcmludHZrdHJhY2VCdWlsZCgpIHsKKyAgICBlY2hvICJUbyBidWlsZCB2a3RyYWNlIgorICAgIGVjaG8gInB1c2hkIC4uIgorICAgIGVjaG8gIm1rZGlyIGJ1aWxkIgorICAgIGVjaG8gImNkIGJ1aWxkIgorICAgIGVjaG8gImNtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLiIKKyAgICBlY2hvICJtYWtlIC1qIgorfQorCisjCisjIElmIGFueSBwYXJhbWV0ZXIgbm90IGZvdW5kLCBwcmludCBob3cgdG8gYnVpbGQgaXQKKyMKKworaWYgWyAhIC1mICR2a3RyYWNlX2V4ZSBdOyB0aGVuCisgICAgZWNobyAiJHZrdHJhY2VfZXhlIG5vdCBmb3VuZCEiCisgICAgcHJpbnR2a3RyYWNlQnVpbGQKKyAgICBleGl0IDEKK2ZpCisKKyMKKyMgQ2hlY2sgZm9yIHJlcXVpcmVkIHRvb2xzCisjCisKK2FkYl9wYXRoPSQod2hpY2ggYWRiKQoraWYgW1sgJD8gPT0gMCBdXTsKK3RoZW4KKyAgICBlY2hvIHVzaW5nICRhZGJfcGF0aAorZWxzZQorICAgIGVjaG8gYWRiIG5vdCBmb3VuZCwgZXhpdGluZworICAgIGVjaG8gY2hlY2sgeW91ciBOREsgZm9yIGl0IGFuZCBhZGQgdG8gcGF0aAorICAgIGV4aXQgMQorZmkKK2FhcHRfcGF0aD0kKHdoaWNoIGFhcHQpCitpZiBbWyAkPyA9PSAwIF1dOwordGhlbgorICAgIGVjaG8gdXNpbmcgJGFhcHRfcGF0aAorZWxzZQorICAgIGVjaG8gYWFwdCBub3QgZm91bmQsIGV4aXRpbmcKKyAgICBlY2hvIGNoZWNrIHlvdXIgTkRLIGZvciBpdCBhbmQgYWRkIHRvIHBhdGgKKyAgICBleGl0IDEKK2ZpCitqYXJfcGF0aD0kKHdoaWNoIGphcikKK2lmIFtbICQ/ID09IDAgXV07Cit0aGVuCisgICAgZWNobyB1c2luZyAkamFyX3BhdGgKK2Vsc2UKKyAgICBlY2hvIGphciBub3QgZm91bmQsIGV4aXRpbmcKKyAgICBleGl0IDEKK2ZpCisKK2Fwa19jb250ZW50cz0kKGphciB0dmYgJGFwaykKK2lmIFtbICRhcGtfY29udGVudHMgIT0gKiJsaWJWa0xheWVyX3NjcmVlbnNob3Quc28iKiBdXSB8fAorICAgW1sgJGFwa19jb250ZW50cyAhPSAqImxpYlZrTGF5ZXJfdmt0cmFjZV9sYXllci5zbyIqIF1dOwordGhlbgorICAgIGVjaG8gWW91ciBBUEsgZG9lcyBub3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGxheWVyczoKKyAgICBlY2hvICAgICBsaWJWa0xheWVyX3NjcmVlbnNob3Quc28KKyAgICBlY2hvICAgICBsaWJWa0xheWVyX3ZrdHJhY2VfbGF5ZXIuc28KKyAgICBlY2hvIFlvdVwnbGwgbmVlZCB0byBwcm92aWRlIHRoZW0gYW5vdGhlciB3YXkuCisgICAgZWNobyBDb250aW51aW5nLi4uCitmaQorCisjCisjIFN0YXJ0IHVwCisjCisKKyMgV2Ugd2FudCB0byBoYWx0IG9uIGVycm9ycyBoZXJlCitzZXQgLWUKKworIyBXYWtlIHVwIHRoZSBkZXZpY2UKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBpbnB1dCBrZXlldmVudCAiS0VZQ09ERV9NRU5VIgorYWRiICRzZXJpYWxGbGFnIHNoZWxsIGlucHV0IGtleWV2ZW50ICJLRVlDT0RFX0hPTUUiCisKKyMgY2xlYW4gdXAgYW55dGhpbmcgbGluZ2VyaW5nIGZyb20gcHJldmlvdXMgcnVucworYWRiICRzZXJpYWxGbGFnIHNoZWxsIGFtIGZvcmNlLXN0b3AgJHBhY2thZ2UKKworIyBFbnN1cmUgdmt0cmFjZSB3YXNuJ3QgYWxyZWFkeSBydW5uaW5nCitsZXQgInNjcmlwdF9ydW5fdGltZT0kKGRhdGUgKyVzKS0kc2NyaXB0X3N0YXJ0X3RpbWUiCitraWxsYWxsIC0tb2xkZXItdGhhbiAiJHNjcmlwdF9ydW5fdGltZSJzIHZrdHJhY2UgfHwgZWNobyBjb250aW51aW5nLi4uCisKKyMgRW5hYmxlIHRyYWNlIGxheWVyCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgc2V0cHJvcCBkZWJ1Zy52dWxrYW4ubGF5ZXIuMSBWS19MQVlFUl9MVU5BUkdfdmt0cmFjZQorCisjIFN0YXJ0IHZrdHJhY2UKK2FkYiAkc2VyaWFsRmxhZyByZXZlcnNlIGxvY2FsYWJzdHJhY3Q6dmt0cmFjZSB0Y3A6MzQyMDEKK3NsZWVwIDEKKyR2a3RyYWNlX2V4ZSAtdiBmdWxsIC1vICRwYWNrYWdlLnZrdHJhY2UgJgorCisjIFN0YXJ0IHRoZSB0YXJnZXQgYWN0aXZpdHkKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBhbSBzdGFydCAkcGFja2FnZS8kYWN0aXZpdHkKKworIyB3YWl0IGZvciBhIGtleXN0cm9rZSwgaW5kaWNhdGluZyB3aGVuIHRyYWNpbmcgc2hvdWxkIHN0b3AKK3JlYWQgLXJzbjEKKworIyBzdG9wIG91ciBiYWNrZ3JvdW5kIHZrdHJhY2UKK2tpbGwgJCEKKworIyBjbGVhbiB1cAorYWRiICRzZXJpYWxGbGFnIHNoZWxsIGFtIGZvcmNlLXN0b3AgJHBhY2thZ2UKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBzZXRwcm9wIGRlYnVnLnZ1bGthbi5sYXllci4xICciIicKKworZXhpdCAwCmRpZmYgLS1naXQgYS9idWlsZC1hbmRyb2lkL2puaS9BbmRyb2lkLm1rIGIvYnVpbGQtYW5kcm9pZC9qbmkvQW5kcm9pZC5tawppbmRleCAwOWQwY2ViLi45ZTI3YzVmIDEwMDY0NAotLS0gYS9idWlsZC1hbmRyb2lkL2puaS9BbmRyb2lkLm1rCisrKyBiL2J1aWxkLWFuZHJvaWQvam5pL0FuZHJvaWQubWsKQEAgLTEzNyw2ICsxMzcsMzUgQEAKIExPQ0FMX0xERkxBR1MgICArPSAtV2wsLS1leGNsdWRlLWxpYnMsQUxMCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFZrTGF5ZXJfYXBpX2R1bXAKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKExBWUVSX0RJUikvbGF5ZXItc3JjL2FwaV9kdW1wL2FwaV9kdW1wLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoTEFZRVJfRElSKS9jb21tb24vdmtfbGF5ZXJfdGFibGUuY3BwCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoU1JDX0RJUikvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvbGF5ZXJzIFwKKyAgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS9sYXllcnN2dCBcCisgICAgICAgICAgICAgICAgICAgICQoTEFZRVJfRElSKS9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS9sb2FkZXIKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGF5ZXJfdXRpbHMKK0xPQ0FMX0NQUEZMQUdTICs9IC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitMT0NBTF9MRExJQlMgICAgOj0gLWxsb2cKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gVmtMYXllcl9zY3JlZW5zaG90CitMT0NBTF9TUkNfRklMRVMgKz0gJChMQVlFUl9ESVIpL2xheWVyLXNyYy9zY3JlZW5zaG90L3NjcmVlbnNob3QuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChMQVlFUl9ESVIpL2NvbW1vbi92a19sYXllcl90YWJsZS5jcHAKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChTUkNfRElSKS9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS9sYXllcnMgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2xheWVyc3Z0IFwKKyAgICAgICAgICAgICAgICAgICAgJChMQVlFUl9ESVIpL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2xvYWRlcgorTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsYXllcl91dGlscworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyArPSBsaWJjdXRpbHMKK0xPQ0FMX0NQUEZMQUdTICs9IC1EVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitMT0NBTF9MRExJQlMgICAgOj0gLWxsb2cKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwogIyBQdWxsIGluIHByZWJ1aWx0IHNoYWRlcmMKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IHNoYWRlcmMtcHJlYnVpbHQKQEAgLTIyNyw1ICsyNTYsNzEgQEAKIExPQ0FMX0xETElCUyA6PSAtbGxvZyAtbGFuZHJvaWQKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gVmtMYXllcl92a3RyYWNlX2xheWVyCitMT0NBTF9TUkNfRklMRVMgKz0gJChMQVlFUl9ESVIpL2luY2x1ZGUvdmt0cmFjZV92a192ay5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKExBWUVSX0RJUikvaW5jbHVkZS92a19zdHJ1Y3Rfc2l6ZV9oZWxwZXIuYworTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuYworTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9maWxlbGlrZS5jCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX2ludGVyY29ubmVjdC5jCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3BsYXRmb3JtLmMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcHJvY2Vzcy5jCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3NldHRpbmdzLmMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2Vsb2cuYworTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl90cmFjZS5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV92a19leHRzLmNwcAorTE9DQUxfQ19JTkNMVURFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2UvaW5jbHVkZSBcCisJCSAgICAkKFNSQ19ESVIpL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2xheWVycyBcCisgICAgICAgICAgICAgICAgICAgICQoTEFZRVJfRElSKS9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbiBcCisgICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllciBcCisgICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvbG9hZGVyCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxheWVyX3V0aWxzCitMT0NBTF9DUFBGTEFHUyArPSAtRFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorTE9DQUxfQ1BQRkxBR1MgKz0gLURQTEFURk9STV9MSU5VWD0xCitMT0NBTF9DRkxBR1MgKz0gLURQTEFURk9STV9MSU5VWD0xCitMT0NBTF9DRkxBR1MgKz0gLURQTEFURk9STV9QT1NJWD0xCitMT0NBTF9MRExJQlMgICAgOj0gLWxsb2cKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gdmtyZXBsYXkKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKExBWUVSX0RJUikvaW5jbHVkZS92a19zdHJ1Y3Rfc2l6ZV9oZWxwZXIuYworTE9DQUxfU1JDX0ZJTEVTICs9ICQoTEFZRVJfRElSKS9pbmNsdWRlL3ZrcmVwbGF5X3ZrX3JlcGxheV9nZW4uY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3RyYWNlX3BhY2tldF91dGlscy5jCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX2ZpbGVsaWtlLmMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfaW50ZXJjb25uZWN0LmMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcGxhdGZvcm0uYworTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wcm9jZXNzLmMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2Vfc2V0dGluZ3MuYworTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV90cmFjZWxvZy5jCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX3JlcGxheS92a3JlcGxheV9mYWN0b3J5LmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfbWFpbi5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X3NlcS5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5LmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9ICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXlfc2V0dGluZ3MuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheV92a2Rpc3BsYXkuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheV92a3JlcGxheS5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFNSQ19ESVIpL2NvbW1vbi92dWxrYW5fd3JhcHBlci5jcHAKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChTUkNfRElSKS92a3RyYWNlL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL2luY2x1ZGUvdnVsa2FuIFwKKyAgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS9sYXllcnMgXAorICAgICAgICAgICAgICAgICAgICAkKExBWUVSX0RJUikvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24gXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIgXAorICAgICAgICAgICAgICAgICAgICAkKFNSQ19ESVIpL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgJChTUkNfRElSKS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheSBcCisgICAgICAgICAgICAgICAgICAgICQoU1JDX0RJUikvbG9hZGVyCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxheWVyX3V0aWxzIGFuZHJvaWRfbmF0aXZlX2FwcF9nbHVlCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFZrTGF5ZXJfdmt0cmFjZV9sYXllcgorTE9DQUxfQ1BQRkxBR1MgKz0gLURWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIgLS1pbmNsdWRlPSQoU1JDX0RJUikvY29tbW9uL3Z1bGthbl93cmFwcGVyLmggLWZleGNlcHRpb25zCitMT0NBTF9DUFBGTEFHUyArPSAtRFBMQVRGT1JNX0xJTlVYPTEKK0xPQ0FMX0NGTEFHUyArPSAtRFBMQVRGT1JNX0xJTlVYPTEKK0xPQ0FMX0NGTEFHUyArPSAtRFBMQVRGT1JNX1BPU0lYPTEKK0xPQ0FMX0xETElCUyAgICA6PSAtbGxvZyAtbGFuZHJvaWQKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwogJChjYWxsIGltcG9ydC1tb2R1bGUsYW5kcm9pZC9uYXRpdmVfYXBwX2dsdWUpCiAkKGNhbGwgaW1wb3J0LW1vZHVsZSx0aGlyZF9wYXJ0eS9nb29nbGV0ZXN0KQpkaWZmIC0tZ2l0IGEvYnVpbGQtYW5kcm9pZC9qbmkvQXBwbGljYXRpb24ubWsgYi9idWlsZC1hbmRyb2lkL2puaS9BcHBsaWNhdGlvbi5tawppbmRleCA4YjRmYjA5Li5hN2YxOWRiIDEwMDY0NAotLS0gYS9idWlsZC1hbmRyb2lkL2puaS9BcHBsaWNhdGlvbi5taworKysgYi9idWlsZC1hbmRyb2lkL2puaS9BcHBsaWNhdGlvbi5tawpAQCAtMTYsNiArMTYsNiBAQAogQVBQX0FCSSA6PSBhcm1lYWJpLXY3YSBhcm02NC12OGEgeDg2IHg4Nl82NCBtaXBzIG1pcHM2NA0KIEFQUF9QTEFURk9STSA6PSBhbmRyb2lkLTIyDQogQVBQX1NUTCA6PSBnbnVzdGxfc3RhdGljDQotQVBQX01PRFVMRVMgOj0gbGF5ZXJfdXRpbHMgVmtMYXllcl9jb3JlX3ZhbGlkYXRpb24gVmtMYXllcl9pbWFnZSBWa0xheWVyX3BhcmFtZXRlcl92YWxpZGF0aW9uIFZrTGF5ZXJfb2JqZWN0X3RyYWNrZXIgVmtMYXllcl90aHJlYWRpbmcgVmtMYXllcl9zd2FwY2hhaW4gVmtMYXllcl91bmlxdWVfb2JqZWN0cyBWa0xheWVyVmFsaWRhdGlvblRlc3RzIFZ1bGthbkxheWVyVmFsaWRhdGlvblRlc3RzDQorQVBQX01PRFVMRVMgOj0gbGF5ZXJfdXRpbHMgVmtMYXllcl9jb3JlX3ZhbGlkYXRpb24gVmtMYXllcl9pbWFnZSBWa0xheWVyX3BhcmFtZXRlcl92YWxpZGF0aW9uIFZrTGF5ZXJfb2JqZWN0X3RyYWNrZXIgVmtMYXllcl90aHJlYWRpbmcgVmtMYXllcl9zd2FwY2hhaW4gVmtMYXllcl91bmlxdWVfb2JqZWN0cyBWa0xheWVyX2FwaV9kdW1wIFZrTGF5ZXJfc2NyZWVuc2hvdCBWa0xheWVyVmFsaWRhdGlvblRlc3RzIFZrTGF5ZXJfdmt0cmFjZV9sYXllciB2a3JlcGxheQ0KIEFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExIC1EVktfUFJPVE9UWVBFUyAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIC1Xbm8tdW51c2VkLWNvbnN0LXZhcmlhYmxlIC1teGdvdA0KIE5ES19UT09MQ0hBSU5fVkVSU0lPTiA6PSBjbGFuZw0KZGlmZiAtLWdpdCBhL2J1aWxkLWFuZHJvaWQvcmVwbGF5X3RyYWNlLnNoIGIvYnVpbGQtYW5kcm9pZC9yZXBsYXlfdHJhY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjdlMzBlMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWFuZHJvaWQvcmVwbGF5X3RyYWNlLnNoCkBAIC0wLDAgKzEsMTIyIEBACisjIS9iaW4vYmFzaAorCisjCisjIFBhcnNlIHBhcmFtZXRlcnMKKyMKKworZnVuY3Rpb24gcHJpbnRVc2FnZSB7CisgICBlY2hvICJTdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmU6IgorICAgZWNobyAiICAgIC0tc2VyaWFsIDx0YXJnZXQgZGV2aWNlIHNlcmlhbCBudW1iZXI+IgorICAgZWNobyAiICAgIC0tdHJhY2VmaWxlIDxwYXRoIHRvIHRyYWNlZmlsZT4iCisgICBlY2hvCisgICBlY2hvICJpLmUuICR7MCMjKi99IC0tc2VyaWFsIDAxMjM0NTY3IFxcIgorICAgZWNobyAiICAgICAgICAgICAgICAtLXRyYWNlZmlsZSBjdWJlLnZrdHJhY2UgXFwiCisgICBleGl0IDEKK30KKworaWYgW1sgJCgoJCMgJSAyKSkgLW5lIDAgXV0KK3RoZW4KKyAgICBlY2hvIFBhcmFtZXRlcnMgbXVzdCBiZSBwcm92aWRlZCBpbiBwYWlycy4KKyAgICBlY2hvIHBhcmFtZXRlciBjb3VudCA9ICQjCisgICAgZWNobworICAgIHByaW50VXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKK3doaWxlIFtbICQjIC1ndCAwIF1dCitkbworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgLS1zZXJpYWwpCisgICAgICAgICAgICAjIGluY2x1ZGUgdGhlIGZsYWcsIGJlY2F1c2Ugd2UgbmVlZCB0byBsZWF2ZSBpdCBvZmYgaWYgbm90IHByb3ZpZGVkCisgICAgICAgICAgICBzZXJpYWw9IiQyIgorICAgICAgICAgICAgc2VyaWFsRmxhZz0iLXMgJHNlcmlhbCIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tdHJhY2VmaWxlKQorICAgICAgICAgICAgdHJhY2VmaWxlPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0qKQorICAgICAgICAgICAgIyB1bmtub3duIG9wdGlvbgorICAgICAgICAgICAgZWNobyBVbmtub3duIG9wdGlvbjogJDEKKyAgICAgICAgICAgIGVjaG8KKyAgICAgICAgICAgIHByaW50VXNhZ2UKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKK2VjaG8gc2VyaWFsID0gJHNlcmlhbAorCitpZiBbWyAteiAkc2VyaWFsIF1dCit0aGVuCisgICAgZWNobyBQbGVhc2UgcHJvdmlkZSBhIHNlcmlhbCBudW1iZXIuCisgICAgZWNobworICAgIHByaW50VXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKK2lmIFtbICQoYWRiIGRldmljZXMpICE9ICoiJHNlcmlhbCIqIF1dOwordGhlbgorICAgIGVjaG8gRGV2aWNlIG5vdCBmb3VuZDogJHNlcmlhbAorICAgIGVjaG8KKyAgICBwcmludFVzYWdlCisgICAgZXhpdCAxCitmaQorCitmdW5jdGlvbiBwcmludHZrcmVwbGF5QnVpbGQoKSB7CisgICAgZWNobyAiVG8gYnVpbGQgdmtyZXBsYXkgYXBrIgorICAgIGVjaG8gImFuZHJvaWQgdXBkYXRlIHByb2plY3QgLXMgLXAgLiAtdCBcImFuZHJvaWQtMjNcIiIKKyAgICBlY2hvICJuZGstYnVpbGQgLWoiCisgICAgZWNobyAiYW50IC1idWlsZGZpbGUgdmtyZXBsYXkgZGVidWciCit9CisKKyMKKyMgSWYgYW55IHBhcmFtZXRlciBub3QgZm91bmQsIHByaW50IGhvdyB0byBidWlsZCBpdAorIworCitpZiBbICEgLWYgJHRyYWNlZmlsZSBdOyB0aGVuCisgICAgZWNobyAiJHRyYWNlZmlsZSBub3QgZm91bmQhIgorICAgIGV4aXQgMQorZmkKKworIworIyBDaGVjayBmb3IgcmVxdWlyZWQgdG9vbHMKKyMKKworYWRiX3BhdGg9JCh3aGljaCBhZGIpCitpZiBbWyAkPyA9PSAwIF1dOwordGhlbgorICAgIGVjaG8gdXNpbmcgJGFkYl9wYXRoCitlbHNlCisgICAgZWNobyBhZGIgbm90IGZvdW5kLCBleGl0aW5nCisgICAgZWNobyBjaGVjayB5b3VyIE5ESyBmb3IgaXQgYW5kIGFkZCB0byBwYXRoCisgICAgZXhpdCAxCitmaQorCisjCisjIFN0YXJ0IHVwCisjCisKKyMgV2Ugd2FudCB0byBoYWx0IG9uIGVycm9ycyBoZXJlCitzZXQgLWUKKworIyBjbGVhbiB1cCBhbnl0aGluZyBsaW5nZXJpbmcgZnJvbSBwcmV2aW91cyBydW5zCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgYW0gZm9yY2Utc3RvcCBjb20uZXhhbXBsZS52a3JlcGxheQorCisjIHB1c2ggdGhlIHRyYWNlIHRvIHRoZSBkZXZpY2UKK2FkYiAkc2VyaWFsRmxhZyBwdXNoICR0cmFjZWZpbGUgL3NkY2FyZC8kdHJhY2VmaWxlCisKKyMgcmVwbGF5IGFuZCBzY3JlZW5zaG90CithZGIgJHNlcmlhbEZsYWcgc2hlbGwgcG0gZ3JhbnQgY29tLmV4YW1wbGUudmtyZXBsYXkgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRQorYWRiICRzZXJpYWxGbGFnIHNoZWxsIHBtIGdyYW50IGNvbS5leGFtcGxlLnZrcmVwbGF5IGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFCitzbGVlcCAxICMgc21hbGwgcGF1c2UgdG8gYWxsb3cgcGVybWlzc2lvbiB0byB0YWtlCisKKyMgV2FrZSB1cCB0aGUgZGV2aWNlCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgaW5wdXQga2V5ZXZlbnQgIktFWUNPREVfTUVOVSIKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBpbnB1dCBrZXlldmVudCAiS0VZQ09ERV9IT01FIgorCisjIFN0YXJ0IHRoZSByZXBsYXkKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBhbSBzdGFydCAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiAtYyBhbmRyb2lkLWludGVudC5jYXRlZ29yeS5MQVVOQ0ggLW4gY29tLmV4YW1wbGUudmtyZXBsYXkvYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkgLS1lcyBhcmdzICItdlwgZnVsbFwgLXRcIC9zZGNhcmQvJHRyYWNlZmlsZSIKKworZXhpdCAwCmRpZmYgLS1naXQgYS9idWlsZC1hbmRyb2lkL3ZrcmVwbGF5L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9idWlsZC1hbmRyb2lkL3ZrcmVwbGF5L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkMzE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWFuZHJvaWQvdmtyZXBsYXkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJjb20uZXhhbXBsZS52a3JlcGxheSIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4NCisNCisgICAgPCEtLSBUaGlzIGlzIHRoZSBwbGF0Zm9ybSBBUEkgd2hlcmUgTmF0aXZlQWN0aXZpdHkgd2FzIGludHJvZHVjZWQuIC0tPg0KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyNCIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyMyIvPg0KKw0KKyAgICA8IS0tIFRoaXMgYWxsb3dzIHJlYWRpbmcgdHJhY2UgZmlsZSBmcm9tIHNkY2FyZCAtLT4NCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiLz4NCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIi8+DQorDQorICAgIDwhLS0gVGhpcyAuYXBrIGhhcyBubyBKYXZhIGNvZGUgaXRzZWxmLCBzbyBzZXQgaGFzQ29kZSB0byBmYWxzZS4gLS0+DQorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiBhbmRyb2lkOmRlYnVnZ2FibGU9J3RydWUnPg0KKw0KKyAgICAgICAgPCEtLSBPdXIgYWN0aXZpdHkgaXMgdGhlIGJ1aWx0LWluIE5hdGl2ZUFjdGl2aXR5IGZyYW1ld29yayBjbGFzcy4NCisgICAgICAgICAgICAgVGhpcyB3aWxsIHRha2UgY2FyZSBvZiBpbnRlZ3JhdGluZyB3aXRoIG91ciBOREsgY29kZS4gLS0+DQorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5OYXRpdmVBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+DQorICAgICAgICAgICAgPCEtLSBUZWxsIE5hdGl2ZUFjdGl2aXR5IHRoZSBuYW1lIG9mIG9yIC5zbyAtLT4NCisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAubGliX25hbWUiIGFuZHJvaWQ6dmFsdWU9InZrcmVwbGF5Ii8+DQorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+DQorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPg0KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPg0KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4NCisgICAgICAgIDwvYWN0aXZpdHk+DQorICAgIDwvYXBwbGljYXRpb24+DQorDQorPC9tYW5pZmVzdD4NCmRpZmYgLS1naXQgYS9idWlsZC1hbmRyb2lkL3ZrcmVwbGF5L2N1c3RvbV9ydWxlcy54bWwgYi9idWlsZC1hbmRyb2lkL3ZrcmVwbGF5L2N1c3RvbV9ydWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3Y2I4YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWFuZHJvaWQvdmtyZXBsYXkvY3VzdG9tX3J1bGVzLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJOYXRpdmVBY3Rpdml0eSIgZGVmYXVsdD0iaGVscCI+Cis8IS0tIFBvaW50IG5kay1idWlsZCBhdCB0aGUgbGlicyBjcmVhdGVkIGluIGJ1aWxkLWFuZHJvaWQgLS0+Cis8ZWNobz52a3JlcGxheTogT3ZlcnJpZGluZyBuYXRpdmUubGlicy5hYnNvbHV0ZS5kaXIgd2l0aCAuLi9saWJzPC9lY2hvPgorPHByb3BlcnR5IG5hbWU9Im5hdGl2ZS5saWJzLmFic29sdXRlLmRpciIgbG9jYXRpb249Ii4uL2xpYnMiIC8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idWlsZC1hbmRyb2lkL3ZrcmVwbGF5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9idWlsZC1hbmRyb2lkL3ZrcmVwbGF5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4OTdjMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWFuZHJvaWQvdmtyZXBsYXkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKKyAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPnZrcmVwbGF5PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYnVpbGQtYW5kcm9pZC92a3RyYWNlcmVwbGF5LmJhdCBiL2J1aWxkLWFuZHJvaWQvdmt0cmFjZXJlcGxheS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ODYxMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWFuZHJvaWQvdmt0cmFjZXJlcGxheS5iYXQKQEAgLTAsMCArMSwyMzQgQEAKK0BlY2hvIG9mZg0KK1JFTSAjIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCitSRU0gIyBDb3B5cmlnaHQgKEMpIDIwMTYgVmFsdmUgQ29ycG9yYXRpb24NCitSRU0NCitSRU0gIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitSRU0gIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorUkVNICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorUkVNDQorUkVNICMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitSRU0NCitSRU0gIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorUkVNICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitSRU0gIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitSRU0gIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorUkVNICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KKw0KK3NldCB2a3RyYWNlX2V4ZT0uLlxidWlsZFx2a3RyYWNlXERlYnVnXHZrdHJhY2UuZXhlDQorc2V0IHZrdHJhY2UzMl9leGU9Li5cYnVpbGRcdmt0cmFjZVxEZWJ1Z1x2a3RyYWNlMzIuZXhlDQorc2V0IHZrcmVwbGF5X2Fwaz0uXHZrcmVwbGF5XGJpblxOYXRpdmVBY3Rpdml0eS1kZWJ1Zy5hcGsNCitzZXQgYWN0aXZpdHk9YW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkNCitzZXQgZnJhbWU9MQ0KK2ZvciAvZiAiZGVsaW1zPSIgJSVpIGluICgnYWRiIHNoZWxsIGdldHByb3Agcm8ucHJvZHVjdC5jcHUuYWJpJykgZG8gc2V0IHRhcmdldF9hYmk9JSVpDQorDQorUkVNIC8vID09PT09PT09IFBhcmFtZXRlciBwYXJzaW5nID09PT09PT09IC8vDQorDQorICAgaWYgIiUxIiA9PSAiIiAoDQorICAgICAgIGVjaG8gU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOg0KKyAgICAgICBlY2hvICAgICAtLXNlcmlhbCBePHRhcmdldCBkZXZpY2Ugc2VyaWFsIG51bWJlcl4+DQorICAgICAgIGVjaG8gICAgIC0tYWJpIF48YWJpIHRvIGluc3RhbGxePg0KKyAgICAgICBlY2hvICAgICAtLXZrdHJhY2UgXjxmdWxsIHBhdGggdG8gdmt0cmFjZSBvbiBob3N0Xj4gXihvcHRpb25hbF4pDQorICAgICAgIGVjaG8gICAgIC0tdmtyZXBsYXkgXjxmdWxsIHBhdGggdG8gdmtyZXBsYXkgQVBLXj4gXihvcHRpb25hbF4pDQorICAgICAgIGVjaG8gICAgIC0tYXBrIF48ZnVsbCBwYXRoIHRvIEFQS14+DQorICAgICAgIGVjaG8gICAgIC0tcGFja2FnZSBePHBhY2thZ2UgbmFtZV4+DQorICAgICAgIGVjaG8gICAgIC0tYWN0dml0eSBePGxhdW5jaGFibGUtYWN0aXZpdHkgbmFtZV4+DQorICAgICAgIGVjaG8gICAgIC0tZnJhbWUgXjxmcmFtZSBudW1iZXIgdG8gY2FwdHVyZV4+DQorICAgICAgIGVjaG8uIA0KKyAgICAgICBlY2hvIGkuZS4gJX5ueDAgLS1zZXJpYWwgMDEyMzQ1NjcNCisgICAgICAgZWNobyAgICAgICAgICAgICAgICAgICAgICAgIC0tYWJpIGFybTY0LXY4YQ0KKyAgICAgICBlY2hvICAgICAgICAgICAgICAgICAgICAgICAgLS12a3RyYWNlIC4uL2J1aWxkL3ZrdHJhY2Uvdmt0cmFjZQ0KKyAgICAgICBlY2hvICAgICAgICAgICAgICAgICAgICAgICAgLS12a3JlcGxheSAuL3ZrcmVwbGF5L2Jpbi9OYXRpdmVBY3Rpdml0eS1kZWJ1Zy5hcGsNCisgICAgICAgZWNobyAgICAgICAgICAgICAgICAgICAgICAgIC0tYXBrIH4vRG93bmxvYWRzL2Zvby5hcGsuYXBrDQorICAgICAgIGVjaG8gICAgICAgICAgICAgICAgICAgICAgICAtLXBhY2thZ2UgY29tLmV4YW1wbGUuZm9vDQorICAgICAgIGVjaG8gICAgICAgICAgICAgICAgICAgICAgICAtLWFjdHZpdHkgYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkNCisgICAgICAgZWNobyAgICAgICAgICAgICAgICAgICAgICAgIC0tZnJhbWUgMQ0KKyAgICAgIGdvdG86ZmluaXNoDQorICAgKQ0KKw0KKyAgIFJFTSBDaGVjayBmb3IgZXZlbiBwYXJhbWV0ZXIgY291bnQNCisgICBzZXQgYXJnX2NvdW50PTANCisgICBmb3IgJSV4IGluICglKikgZG8gc2V0IC9BIGFyZ19jb3VudCs9MQ0KKyAgIHNldCAvQSBldmVuX2FyZ3M9YXJnX2NvdW50JTINCisgICBpZiAlZXZlbl9hcmdzJSBuZXEgMCAoDQorICAgICAgIGVjaG8gQXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWQgaW4gcGFpcnMuDQorICAgICAgIGdvdG86ZmluaXNoDQorICAgKQ0KKyAgIA0KKyAgIDpwYXJhbWV0ZXJMb29wDQorDQorICAgICAgaWYgIiUxIj09IiIgZ290bzpwYXJhbWV0ZXJDb250aW51ZQ0KKw0KKyAgICAgIGlmICIlMSIgPT0gIi0tc2VyaWFsIiAoDQorICAgICAgICAgc2V0IHNlcmlhbD0lMg0KKyAgICAgICAgIHNoaWZ0DQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBnb3RvOnBhcmFtZXRlckxvb3ANCisgICAgICApDQorDQorICAgICAgaWYgIiUxIiA9PSAiLS1hYmkiICgNCisgICAgICAgICBzZXQgdGFyZ2V0X2FiaT0lMg0KKyAgICAgICAgIHNoaWZ0DQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBnb3RvOnBhcmFtZXRlckxvb3ANCisgICAgICApDQorDQorICAgICAgaWYgIiUxIiA9PSAiLS12a3RyYWNlIiAoDQorICAgICAgICAgc2V0IHZrdHJhY2VfZXhlPSUyDQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBzaGlmdA0KKyAgICAgICAgIGdvdG86cGFyYW1ldGVyTG9vcA0KKyAgICAgICkNCisNCisgICAgICBpZiAiJTEiID09ICItLXZrcmVwbGF5IiAoDQorICAgICAgICAgc2V0IHZrcmVwbGF5X2Fwaz0lMg0KKyAgICAgICAgIHNoaWZ0DQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBnb3RvOnBhcmFtZXRlckxvb3ANCisgICAgICApDQorDQorICAgICAgaWYgIiUxIiA9PSAiLS1hcGsiICgNCisgICAgICAgICBzZXQgYXBrPSUyDQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBzaGlmdA0KKyAgICAgICAgIGdvdG86cGFyYW1ldGVyTG9vcA0KKyAgICAgICkNCisNCisgICAgICBpZiAiJTEiID09ICItLXBhY2thZ2UiICgNCisgICAgICAgICBzZXQgcGFja2FnZT0lMg0KKyAgICAgICAgIHNoaWZ0DQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBnb3RvOnBhcmFtZXRlckxvb3ANCisgICAgICApDQorDQorICAgICAgaWYgIiUxIiA9PSAiLS1hY3Rpdml0eSIgKA0KKyAgICAgICAgIHNldCBhY3Rpdml0eT0lMg0KKyAgICAgICAgIHNoaWZ0DQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBnb3RvOnBhcmFtZXRlckxvb3ANCisgICAgICApDQorDQorICAgICAgaWYgIiUxIiA9PSAiLS1mcmFtZSIgKA0KKyAgICAgICAgIHNldCBmcmFtZT0lMg0KKyAgICAgICAgIHNoaWZ0DQorICAgICAgICAgc2hpZnQNCisgICAgICAgICBnb3RvOnBhcmFtZXRlckxvb3ANCisgICAgICApDQorDQorICAgICAgZWNobyBVbnJlY29nbml6ZWQgb3B0aW9ucyAiJTEiDQorICAgICAgZ290bzplcnJvcg0KKw0KKyAgIDpwYXJhbWV0ZXJDb250aW51ZQ0KKw0KK1JFTSAvLyA9PT09PT09PSBlbmQgUGFyYW1ldGVyIHBhcnNpbmcgPT09PT09PT0gLy8NCisNCitlY2hvIHNlcmlhbCA9ICVzZXJpYWwlDQorZWNobyB0YXJnZXRfYWJpID0gJXRhcmdldF9hYmklDQorZWNobyB2a3RyYWNlX2V4ZSA9ICV2a3RyYWNlX2V4ZSUNCitlY2hvIHZrcmVwbGF5X2FwayA9ICV2a3JlcGxheV9hcGslDQorZWNobyBhcGsgPSAlYXBrJQ0KK2VjaG8gcGFja2FnZSA9ICVwYWNrYWdlJQ0KK2VjaG8gYWN0aXZpdHkgPSAlYWN0aXZpdHklDQorZWNobyBmcmFtZSA9ICVmcmFtZSUNCisNCisNCitSRU0gV2FrZSB1cCB0aGUgZGV2aWNlDQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIGlucHV0IGtleWV2ZW50ICJLRVlDT0RFX01FTlUiDQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIGlucHV0IGtleWV2ZW50ICJLRVlDT0RFX0hPTUUiDQorDQorUkVNIGNsZWFuIHVwIGFueXRoaW5nIGxpbmdlcmluZyBmcm9tIHByZXZpb3VzIHJ1bnMNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgYW0gZm9yY2Utc3RvcCAlcGFja2FnZSUNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgYW0gZm9yY2Utc3RvcCBjb20uZXhhbXBsZS52a3JlcGxheQ0KKw0KK2FkYiAtcyAlc2VyaWFsJSB1bmluc3RhbGwgJXBhY2thZ2UlICYmIGVjaG8gY29udGludWluZy4uLg0KK2FkYiAtcyAlc2VyaWFsJSB1bmluc3RhbGwgY29tLmV4YW1wbGUudmtyZXBsYXkgJiYgZWNobyBjb250aW51aW5nLi4uDQorDQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIHJtIC1mIC9zZGNhcmQvQW5kcm9pZC8lZnJhbWUlLnBwbQ0KK2FkYiAtcyAlc2VyaWFsJSBzaGVsbCBybSAtZiAvc2RjYXJkL0FuZHJvaWQvJXBhY2thZ2UlLiVmcmFtZSUudmt0cmFjZS5wcG0NCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgcm0gLWYgL3NkY2FyZC9BbmRyb2lkLyVwYWNrYWdlJS4lZnJhbWUlLnZrcmVwbGF5LnBwbQ0KK2RlbCAvUSAvRiAlcGFja2FnZSUuJWZyYW1lJS52a3RyYWNlLnBwbQ0KK2RlbCAvUSAvRiAlcGFja2FnZSUuJWZyYW1lJS52a3JlcGxheS5wcG0NCisNCitSRU0gaW5zdGFsbCB0aGUgbGF0ZXN0IEFQSywgcG9zc2libHkgcGFja2FnZWQgd2l0aCB2a3RyYWNlIGFuZCBzY3JlZW5zaG90DQorYWRiIC1zICVzZXJpYWwlIGluc3RhbGwgLS1hYmkgJXRhcmdldF9hYmklICVhcGslDQorDQorUkVNIGluc3RhbGwgdmtyZXBsYXkgQVBLDQorYWRiIC1zICVzZXJpYWwlIGluc3RhbGwgLS1hYmkgJXRhcmdldF9hYmklICV2a3JlcGxheV9hcGslDQorDQorUkVNIHRyYWNlIGFuZCBzY3JlZW5zaG90DQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIHNldHByb3AgZGVidWcudnVsa2FuLmxheWVyLjEgVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2UNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgc2V0cHJvcCBkZWJ1Zy52dWxrYW4ubGF5ZXIuMiBWS19MQVlFUl9MVU5BUkdfc2NyZWVuc2hvdA0KK2FkYiAtcyAlc2VyaWFsJSBzaGVsbCBwbSBncmFudCAlcGFja2FnZSUgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRQ0KK2FkYiAtcyAlc2VyaWFsJSBzaGVsbCBwbSBncmFudCAlcGFja2FnZSUgYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgc2V0cHJvcCBkZWJ1Zy52dWxrYW4uc2NyZWVuc2hvdCAlZnJhbWUlDQorDQorUkVNIHZrdHJhY2UNCithZGIgLXMgJXNlcmlhbCUgcmV2ZXJzZSB0Y3A6MzQyMDEgdGNwOjM0MjAxDQorc3RhcnQgL2IgJXZrdHJhY2VfZXhlJSAtdiBmdWxsIC1vICVwYWNrYWdlJS52a3RyYWNlDQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIGFtIHN0YXJ0ICVwYWNrYWdlJS8lYWN0aXZpdHklDQorDQorDQorUkVNIFdBSVQgSEVSRSBGT1IgU0NSRUVOU0hPVA0KK1JFTSBUT0RPIFRISVMgU0hPVUxEIEJFIEEgTE9PUA0KK3RpbWVvdXQgL3QgNQ0KKw0KK3Rhc2traWxsIC9mIC9pbSB2a3RyYWNlLmV4ZQ0KK3Rhc2traWxsIC9mIC9pbSB2a3RyYWNlMzIuZXhlDQorDQorUkVNIHNldCB1cCBmb3IgdmtyZXBsYXkNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgYW0gZm9yY2Utc3RvcCAlcGFja2FnZSUNCithZGIgLXMgJXNlcmlhbCUgcHVzaCAlcGFja2FnZSUwLnZrdHJhY2UgL3NkY2FyZC8lcGFja2FnZSUudmt0cmFjZQ0KKw0KK1JFTSBncmFiIHRoZSBzY3JlZW5zaG90DQorYWRiIC1zICVzZXJpYWwlIHB1bGwgL3NkY2FyZC9BbmRyb2lkLyVmcmFtZSUucHBtICVwYWNrYWdlJS4lZnJhbWUlLnZrdHJhY2UucHBtDQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIG12IC9zZGNhcmQvQW5kcm9pZC8lZnJhbWUlLnBwbSAvc2RjYXJkL0FuZHJvaWQvJXBhY2thZ2UlLiVmcmFtZSUudmt0cmFjZS5wcG0NCisNCitSRU0gcmVwbGF5IGFuZCBzY3JlZW5zaG90DQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIHNldHByb3AgZGVidWcudnVsa2FuLmxheWVyLjEgVktfTEFZRVJfTFVOQVJHX3NjcmVlbnNob3QNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgc2V0cHJvcCBkZWJ1Zy52dWxrYW4ubGF5ZXIuMiAnIiInDQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIHNldHByb3AgZGVidWcudnVsa2FuLnNjcmVlbnNob3QgJWZyYW1lJQ0KK2FkYiAtcyAlc2VyaWFsJSBzaGVsbCBwbSBncmFudCBjb20uZXhhbXBsZS52a3JlcGxheSBhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFDQorYWRiIC1zICVzZXJpYWwlIHNoZWxsIHBtIGdyYW50IGNvbS5leGFtcGxlLnZrcmVwbGF5IGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFDQorUkVNIHNtYWxsIHBhdXNlIHRvIGFsbG93IHBlcm1pc3Npb24gdG8gdGFrZQ0KK3RpbWVvdXQgL3QgNQ0KKw0KK1JFTSBXYWtlIHVwIHRoZSBkZXZpY2UNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgaW5wdXQga2V5ZXZlbnQgIktFWUNPREVfTUVOVSINCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgaW5wdXQga2V5ZXZlbnQgIktFWUNPREVfSE9NRSINCisNCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgYW0gc3RhcnQgLWEgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gLWMgYW5kcm9pZC1pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIIC1uIGNvbS5leGFtcGxlLnZrcmVwbGF5L2FuZHJvaWQuYXBwLk5hdGl2ZUFjdGl2aXR5IC0tZXMgYXJncyAiLXZcIGZ1bGxcIC10XCAvc2RjYXJkLyVwYWNrYWdlJS52a3RyYWNlIg0KKw0KK1JFTSBXQUlUIEhFUkUgRk9SIFNDUkVFTlNIT1QNCitSRU0gVE9ETyBUSElTIFNIT1VMRCBCRSBBIExPT1ANCit0aW1lb3V0IC90IDUNCisNCitSRU0gZ3JhYiB0aGUgc2NyZWVuc2hvdA0KK2FkYiAtcyAlc2VyaWFsJSBwdWxsIC9zZGNhcmQvQW5kcm9pZC8lZnJhbWUlLnBwbSAlcGFja2FnZSUuJWZyYW1lJS52a3JlcGxheS5wcG0NCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgbXYgL3NkY2FyZC9BbmRyb2lkLyVmcmFtZSUucHBtIC9zZGNhcmQvQW5kcm9pZC8lcGFja2FnZSUuJWZyYW1lJS52a3JlcGxheS5wcG0NCisNCitSRU0gY2xlYW4gdXANCithZGIgLXMgJXNlcmlhbCUgc2hlbGwgYW0gZm9yY2Utc3RvcCBjb20uZXhhbXBsZS52a3JlcGxheQ0KK2FkYiAtcyAlc2VyaWFsJSBzaGVsbCBzZXRwcm9wIGRlYnVnLnZ1bGthbi5sYXllci4xICciIicNCisNCitSRU0gY29tcGFyZSBzY3JlZW5zaG90cw0KK2ZjLmV4ZSAvYiAlcGFja2FnZSUuJWZyYW1lJS52a3RyYWNlLnBwbSAlcGFja2FnZSUuJWZyYW1lJS52a3JlcGxheS5wcG0NCisgDQoraWYgJWVycm9ybGV2ZWwlIG5lcSAwICgNCisgICAgZWNobyBJbWFnZXMgRE8gTk9UIG1hdGNoIC0gRmFpbGVkDQorICAgIGV4aXQgL2IgMQ0KKykNCisNCitpZiAlZXJyb3JsZXZlbCUgZXF1IDAgKA0KKyAgICBlY2hvIEltYWdlcyBtYXRjaCAtIFBBU1NFRA0KKyAgICBleGl0IC9iIDANCispDQorDQorOmVycm9yDQorZWNoby4NCitlY2hvIEhhbHRpbmcgZHVlIHRvIGVycm9yDQorZ290bzpmaW5pc2gNCisNCis6ZmluaXNoDQorZW5kbG9jYWwNCitnb3RvOmVvZg0KZGlmZiAtLWdpdCBhL2J1aWxkLWFuZHJvaWQvdmt0cmFjZXJlcGxheS5zaCBiL2J1aWxkLWFuZHJvaWQvdmt0cmFjZXJlcGxheS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjlhMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQtYW5kcm9pZC92a3RyYWNlcmVwbGF5LnNoCkBAIC0wLDAgKzEsNDQ2IEBACisjIS9iaW4vYmFzaAorCisjc2V0IC12ZXgKKworc2NyaXB0X3N0YXJ0X3RpbWU9JChkYXRlICslcykKKworZGVmYXVsdF92a3JlcGxheV9hcGs9Li92a3JlcGxheS9iaW4vTmF0aXZlQWN0aXZpdHktZGVidWcuYXBrCitkZWZhdWx0X3ZrdHJhY2VfZXhlPS4uL2J1aWxkL3ZrdHJhY2Uvdmt0cmFjZQorZGVmYXVsdF92a3RyYWNlMzJfZXhlPS4uL2J1aWxkMzIvdmt0cmFjZS92a3RyYWNlMzIKK2RlZmF1bHRfdGFyZ2V0X2FiaT0kKGFkYiBzaGVsbCBnZXRwcm9wIHJvLnByb2R1Y3QuY3B1LmFiaSkKK2RlZmF1bHRfYWN0aXZpdHk9YW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkKK2RlZmF1bHRfZnJhbWU9MQorCisjaWYgW1sgJChiYXNlbmFtZSAiJFBXRCIpICE9ICJidWlsZC1hbmRyb2lkIiBdXQorI3RoZW4KKyMgICAgZWNobyAiUGxlYXNlIHJ1biB0aGlzIHNjcmlwdCBmcm9tIHRoZSBidWlsZC1hbmRyb2lkIGRpcmVjdG9yeSIKKyMgICAgZXhpdCAxCisjZmkKKworIworIyBQYXJzZSBwYXJhbWV0ZXJzCisjCisKK2Z1bmN0aW9uIHByaW50VXNhZ2UgeworICAgZWNobyAiU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOiIKKyAgIGVjaG8gIiAgICAtLXNlcmlhbCA8dGFyZ2V0IGRldmljZSBzZXJpYWwgbnVtYmVyPiIKKyAgIGVjaG8gIiAgICAtLWFiaSA8YWJpIHRvIGluc3RhbGw+IgorICAgZWNobyAiICAgIC0tdmt0cmFjZSA8ZnVsbCBwYXRoIHRvIHZrdHJhY2Ugb24gaG9zdD4gKG9wdGlvbmFsKSIKKyAgIGVjaG8gIiAgICAtLXZrcmVwbGF5IDxmdWxsIHBhdGggdG8gdmtyZXBsYXkgQVBLPiAob3B0aW9uYWwpIgorICAgZWNobyAiICAgIC0tYXBrIDxmdWxsIHBhdGggdG8gQVBLPiIKKyAgIGVjaG8gIiAgICAtLXBhY2thZ2UgPHBhY2thZ2UgbmFtZT4iCisgICBlY2hvICIgICAgLS1hY3R2aXR5IDxsYXVuY2hhYmxlLWFjdGl2aXR5IG5hbWU+IgorICAgZWNobyAiICAgIC0tZnJhbWUgPGZyYW1lIG51bWJlciB0byBjYXB0dXJlPiIKKyAgIGVjaG8KKyAgIGVjaG8gImkuZS4gJHswIyMqL30gLS1zZXJpYWwgMDEyMzQ1NjcgXFwiCisgICBlY2hvICIgICAgICAgICAgICAgIC0tYWJpIGFybTY0LXY4YSBcXCIKKyAgIGVjaG8gIiAgICAgICAgICAgICAgLS12a3RyYWNlIC4uL2J1aWxkL3ZrdHJhY2Uvdmt0cmFjZSBcXCIKKyAgIGVjaG8gIiAgICAgICAgICAgICAgLS12a3JlcGxheSAuL3ZrcmVwbGF5L2Jpbi9OYXRpdmVBY3Rpdml0eS1kZWJ1Zy5hcGsgXFwiCisgICBlY2hvICIgICAgICAgICAgICAgIC0tYXBrIH4vRG93bmxvYWRzL2Zvby5hcGsuYXBrIFxcIgorICAgZWNobyAiICAgICAgICAgICAgICAtLXBhY2thZ2UgY29tLmV4YW1wbGUuZm9vIFxcIgorICAgZWNobyAiICAgICAgICAgICAgICAtLWFjdHZpdHkgYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkgXFwiCisgICBlY2hvICIgICAgICAgICAgICAgIC0tZnJhbWUgMSIKKyAgIGV4aXQgMQorfQorCitpZiBbWyAkKCgkIyAlIDIpKSAtbmUgMCBdXQordGhlbgorICAgIGVjaG8gUGFyYW1ldGVycyBtdXN0IGJlIHByb3ZpZGVkIGluIHBhaXJzLgorICAgIGVjaG8gcGFyYW1ldGVyIGNvdW50ID0gJCMKKyAgICBlY2hvCisgICAgcHJpbnRVc2FnZQorICAgIGV4aXQgMQorZmkKKword2hpbGUgW1sgJCMgLWd0IDAgXV0KK2RvCisgICAgY2FzZSAkMSBpbgorICAgICAgICAtLXNlcmlhbCkKKyAgICAgICAgICAgICMgaW5jbHVkZSB0aGUgZmxhZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGxlYXZlIGl0IG9mZiBpZiBub3QgcHJvdmlkZWQKKyAgICAgICAgICAgIHNlcmlhbD0iJDIiCisgICAgICAgICAgICBzZXJpYWxGbGFnPSItcyAkc2VyaWFsIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1hYmkpCisgICAgICAgICAgICB0YXJnZXRfYWJpPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tdmt0cmFjZSkKKyAgICAgICAgICAgIHZrdHJhY2VfZXhlPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tdmtyZXBsYXkpCisgICAgICAgICAgICB2a3JlcGxheV9hcGs9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1hcGspCisgICAgICAgICAgICBhcGs9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1wYWNrYWdlKQorICAgICAgICAgICAgcGFja2FnZT0iJDIiCisgICAgICAgICAgICBzaGlmdCAyCisgICAgICAgICAgICA7OworICAgICAgICAtLWFjdGl2aXR5KQorICAgICAgICAgICAgYWN0aXZpdHk9IiQyIgorICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1mcmFtZSkKKyAgICAgICAgICAgIGZyYW1lPSIkMiIKKyAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0qKQorICAgICAgICAgICAgIyB1bmtub3duIG9wdGlvbgorICAgICAgICAgICAgZWNobyBVbmtub3duIG9wdGlvbjogJDEKKyAgICAgICAgICAgIGVjaG8KKyAgICAgICAgICAgIHByaW50VXNhZ2UKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKK2VjaG8gc2VyaWFsID0gJHNlcmlhbAorCitpZiBbWyAteiAkc2VyaWFsIF1dCit0aGVuCisgICAgZWNobyBQbGVhc2UgcHJvdmlkZSBhIHNlcmlhbCBudW1iZXIuCisgICAgZWNobworICAgIHByaW50VXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKK2lmIFtbICQoYWRiIGRldmljZXMpICE9ICoiJHNlcmlhbCIqIF1dOwordGhlbgorICAgIGVjaG8gRGV2aWNlIG5vdCBmb3VuZDogJHNlcmlhbAorICAgIGVjaG8KKyAgICBwcmludFVzYWdlCisgICAgZXhpdCAxCitmaQorCitpZiBbWyAteiAkdGFyZ2V0X2FiaSBdXTsKK3RoZW4KKyAgICBlY2hvIFVzaW5nIGRlZmF1bHQgdGFyZ2V0X2FiaQorICAgIHRhcmdldF9hYmk9JGRlZmF1bHRfdGFyZ2V0X2FiaQorZmkKK2VjaG8gdGFyZ2V0X2FiaSA9ICR0YXJnZXRfYWJpCisKK2lmIFtbICR0YXJnZXRfYWJpID09ICJhcm1lYWJpLXY3YSIgXV0gfHwKKyAgIFtbICR0YXJnZXRfYWJpID09ICJtaXBzIiBdXSB8fAorICAgW1sgJHRhcmdldF9hYmkgPT0gIng4NiIgXV07Cit0aGVuCisgICAgZWNobyBUYXJnZXRpbmcgMzItYml0IGFiaSAkdGFyZ2V0X2FiaQorICAgIHRhcmdldF8zMmJpdF9hYmk9MQorZmkKKworaWYgW1sgLXogJHZrdHJhY2VfZXhlIF1dOwordGhlbgorICAgIGVjaG8gVXNpbmcgZGVmYXVsdCB2a3RyYWNlX2V4ZQorICAgIHZrdHJhY2VfZXhlPSRkZWZhdWx0X3ZrdHJhY2VfZXhlCisgICAgaWYgW1sgJHRhcmdldF8zMmJpdF9hYmkgXV0KKyAgICB0aGVuCisgICAgICAgIHZrdHJhY2VfZXhlPSRkZWZhdWx0X3ZrdHJhY2UzMl9leGUKKyAgICBmaQorZWxzZQorICAgIGlmIFtbICR0YXJnZXRfMzJiaXRfYWJpIF1dCisgICAgdGhlbgorICAgICAgIGVjaG8gRW5zdXJlIHlvdXIgdmt0cmFjZSBpcyAzMi1iaXQsIGkuZS4gdmt0cmFjZTMyCisgICAgZmkKK2ZpCitlY2hvIHZrdHJhY2VfZXhlID0gJHZrdHJhY2VfZXhlCisKK2lmIFtbIC16ICR2a3JlcGxheV9hcGsgXV07Cit0aGVuCisgICAgZWNobyBVc2luZyBkZWZhdWx0IHZrcmVwbGF5X2FwaworICAgIHZrcmVwbGF5X2Fwaz0kZGVmYXVsdF92a3JlcGxheV9hcGsKK2ZpCitlY2hvIHZrcmVwbGF5X2FwayA9ICR2a3JlcGxheV9hcGsKKworaWYgW1sgLXogJGFwayBdXTsKK3RoZW4KKyAgICBlY2hvIHRhcmdldCBBUEsgcmVxdWlyZWQKKyAgICBleGl0IDEKK2ZpCitlY2hvIGFwayA9ICRhcGsKKworaWYgW1sgLXogJHBhY2thZ2UgXV07Cit0aGVuCisgICAgZWNobyB0YXJnZXQgcGFja2FnZSBuYW1lIHJlcXVpcmVkCisgICAgZXhpdCAxCitmaQorZWNobyBwYWNrYWdlID0gJHBhY2thZ2UKKworaWYgW1sgLXogJGFjdGl2aXR5IF1dOwordGhlbgorICAgIGVjaG8gVXNpbmcgZGVmYXVsdCBhY3Rpdml0eQorICAgIGFjdGl2aXR5PSRkZWZhdWx0X2FjdGl2aXR5CitmaQorZWNobyBhY3Rpdml0eSA9ICRhY3Rpdml0eQorCitpZiBbWyAteiAkZnJhbWUgXV07Cit0aGVuCisgICAgZWNobyBVc2luZyBkZWZhdWx0IHNjcmVlbnNob3QgZnJhbWUKKyAgICBmcmFtZT0kZGVmYXVsdF9mcmFtZQorZmkKK2VjaG8gZnJhbWUgPSAkZnJhbWUKKworZnVuY3Rpb24gcHJpbnRMYXllckJ1aWxkKCkgeworICAgIGVjaG8gIlRvIGJ1aWxkIGxheWVyczoiCisgICAgZWNobyAiLi91cGRhdGVfZXh0ZXJuYWxfc291cmNlc19hbmRyb2lkLnNoIgorICAgIGVjaG8gIi4vYW5kcm9pZC1nZW5lcmF0ZS5zaCIKKyAgICBlY2hvICJuZGstYnVpbGQgLWoiCit9CisKK2Z1bmN0aW9uIHByaW50dmtyZXBsYXlCdWlsZCgpIHsKKyAgICBlY2hvICJUbyBidWlsZCB2a3JlcGxheSBhcGsiCisgICAgZWNobyAiYW5kcm9pZCB1cGRhdGUgcHJvamVjdCAtcyAtcCAuIC10IFwiYW5kcm9pZC0yM1wiIgorICAgIGVjaG8gIm5kay1idWlsZCAtaiIKKyAgICBlY2hvICJhbnQgLWJ1aWxkZmlsZSB2a3JlcGxheSBkZWJ1ZyIKK30KKworZnVuY3Rpb24gcHJpbnR2a3RyYWNlQnVpbGQoKSB7CisgICAgZWNobyAiVG8gYnVpbGQgdmt0cmFjZSIKKyAgICBlY2hvICJwdXNoZCAuLiIKKyAgICBlY2hvICJta2RpciBidWlsZCIKKyAgICBlY2hvICJjZCBidWlsZCIKKyAgICBlY2hvICJjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4iCisgICAgZWNobyAibWFrZSAtaiIKK30KKworIworIyBJZiBhbnkgcGFyYW1ldGVyIG5vdCBmb3VuZCwgcHJpbnQgaG93IHRvIGJ1aWxkIGl0CisjCisKK2lmIFsgISAtZiAkdmtyZXBsYXlfYXBrIF07IHRoZW4KKyAgICBlY2hvICIkdmtyZXBsYXlfYXBrIG5vdCBmb3VuZCEiCisgICAgcHJpbnR2a3JlcGxheUJ1aWxkCisgICAgZXhpdCAxCitmaQorCitpZiBbICEgLWYgJHZrdHJhY2VfZXhlIF07IHRoZW4KKyAgICBlY2hvICIkdmt0cmFjZV9leGUgbm90IGZvdW5kISIKKyAgICBwcmludHZrdHJhY2VCdWlsZAorICAgIGV4aXQgMQorZmkKKworIworIyBDaGVjayBmb3IgcmVxdWlyZWQgdG9vbHMKKyMKKworYWRiX3BhdGg9JCh3aGljaCBhZGIpCitpZiBbWyAkPyA9PSAwIF1dOwordGhlbgorICAgIGVjaG8gdXNpbmcgJGFkYl9wYXRoCitlbHNlCisgICAgZWNobyBhZGIgbm90IGZvdW5kLCBleGl0aW5nCisgICAgZWNobyBjaGVjayB5b3VyIE5ESyBmb3IgaXQgYW5kIGFkZCB0byBwYXRoCisgICAgZXhpdCAxCitmaQorYWFwdF9wYXRoPSQod2hpY2ggYWFwdCkKK2lmIFtbICQ/ID09IDAgXV07Cit0aGVuCisgICAgZWNobyB1c2luZyAkYWFwdF9wYXRoCitlbHNlCisgICAgZWNobyBhYXB0IG5vdCBmb3VuZCwgZXhpdGluZworICAgIGVjaG8gY2hlY2sgeW91ciBOREsgZm9yIGl0IGFuZCBhZGQgdG8gcGF0aAorICAgIGV4aXQgMQorZmkKK2phcl9wYXRoPSQod2hpY2ggamFyKQoraWYgW1sgJD8gPT0gMCBdXTsKK3RoZW4KKyAgICBlY2hvIHVzaW5nICRqYXJfcGF0aAorZWxzZQorICAgIGVjaG8gamFyIG5vdCBmb3VuZCwgZXhpdGluZworICAgIGV4aXQgMQorZmkKKworIworIyBFbnN1cmUgQVBLcyBjYW4gYmUgdHJhY2VkCisjCisKK2Fwa19iYWRnaW5nPSQoYWFwdCBkdW1wIGJhZGdpbmcgJGFwaykKK2lmIFtbICRhcGtfYmFkZ2luZyAhPSAqInVzZXMtcGVybWlzc2lvbjogbmFtZT0nYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSciKiBdXSB8fAorICAgW1sgJGFwa19iYWRnaW5nICE9ICoidXNlcy1wZXJtaXNzaW9uOiBuYW1lPSdhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSciKiBdXTsKK3RoZW4KKyAgICBlY2hvIFBsZWFzZSBwYWNrYWdlIEFQSyB3aXRoIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnM6CisgICAgZWNobyAgICAgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRQorICAgIGVjaG8gICAgIGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFCisgICAgZXhpdCAxCitmaQorYXBrX2NvbnRlbnRzPSQoamFyIHR2ZiAkYXBrKQoraWYgW1sgJGFwa19jb250ZW50cyAhPSAqImxpYlZrTGF5ZXJfc2NyZWVuc2hvdC5zbyIqIF1dIHx8CisgICBbWyAkYXBrX2NvbnRlbnRzICE9ICoibGliVmtMYXllcl92a3RyYWNlX2xheWVyLnNvIiogXV07Cit0aGVuCisgICAgZWNobyBZb3VyIEFQSyBkb2VzIG5vdCBjb250YWluIHRoZSBmb2xsb3dpbmcgbGF5ZXJzOgorICAgIGVjaG8gICAgIGxpYlZrTGF5ZXJfc2NyZWVuc2hvdC5zbworICAgIGVjaG8gICAgIGxpYlZrTGF5ZXJfdmt0cmFjZV9sYXllci5zbworICAgIGVjaG8gWW91XCdsbCBuZWVkIHRvIHByb3ZpZGUgdGhlbSBhbm90aGVyIHdheS4KKyAgICBlY2hvIENvbnRpbnVpbmcuLi4KK2ZpCisKKyMKKyMgU3RhcnQgdXAKKyMKKworIyBXZSB3YW50IHRvIGhhbHQgb24gZXJyb3JzIGhlcmUKK3NldCAtZQorCisjIFdha2UgdXAgdGhlIGRldmljZQorYWRiICRzZXJpYWxGbGFnIHNoZWxsIGlucHV0IGtleWV2ZW50ICJLRVlDT0RFX01FTlUiCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgaW5wdXQga2V5ZXZlbnQgIktFWUNPREVfSE9NRSIKKworIyBjbGVhbiB1cCBhbnl0aGluZyBsaW5nZXJpbmcgZnJvbSBwcmV2aW91cyBydW5zCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgYW0gZm9yY2Utc3RvcCAkcGFja2FnZQorYWRiICRzZXJpYWxGbGFnIHNoZWxsIGFtIGZvcmNlLXN0b3AgY29tLmV4YW1wbGUudmtyZXBsYXkKK2lmIFtbICQoYWRiICRzZXJpYWxGbGFnIHNoZWxsIHBtIGxpc3QgcGFja2FnZXMgJHBhY2thZ2UpID09ICJwYWNrYWdlOiRwYWNrYWdlIiBdXQordGhlbgorICAgIGFkYiAkc2VyaWFsRmxhZyB1bmluc3RhbGwgJHBhY2thZ2UgJiYgZWNobyBjb250aW51aW5nLi4uCitmaQoraWYgW1sgJChhZGIgJHNlcmlhbEZsYWcgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyBjb20uZXhhbXBsZS52a3JlcGxheSkgPT0gInBhY2thZ2U6Y29tLmV4YW1wbGUudmtyZXBsYXkiIF1dCit0aGVuCisgICAgYWRiICRzZXJpYWxGbGFnIHVuaW5zdGFsbCBjb20uZXhhbXBsZS52a3JlcGxheSAmJiBlY2hvIGNvbnRpbnVpbmcuLi4KK2ZpCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgcm0gLWYgL3NkY2FyZC9BbmRyb2lkLyRmcmFtZS5wcG0KK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBybSAtZiAvc2RjYXJkL0FuZHJvaWQvJHBhY2thZ2UuJGZyYW1lLnZrdHJhY2UucHBtCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgcm0gLWYgL3NkY2FyZC9BbmRyb2lkLyRwYWNrYWdlLiRmcmFtZS52a3JlcGxheS5wcG0KK3JtIC1mICRwYWNrYWdlLiRmcmFtZS52a3RyYWNlLnBwbQorcm0gLWYgJHBhY2thZ2UuJGZyYW1lLnZrcmVwbGF5LnBwbQorcm0gLWYgJHBhY2thZ2Uudmt0cmFjZQorcm0gLWYgJHBhY2thZ2VcMC52a3RyYWNlCisKKyMgRW5zdXJlIHZrdHJhY2Ugd2Fzbid0IGFscmVhZHkgcnVubmluZworbGV0ICJzY3JpcHRfcnVuX3RpbWU9JChkYXRlICslcyktJHNjcmlwdF9zdGFydF90aW1lIgora2lsbGFsbCAtLW9sZGVyLXRoYW4gIiRzY3JpcHRfcnVuX3RpbWUicyB2a3RyYWNlIHx8IGVjaG8gY29udGludWluZy4uLgorCisjIGluc3RhbGwgdGhlIGxhdGVzdCBBUEssIHBvc3NpYmx5IHBhY2thZ2VkIHdpdGggdmt0cmFjZSBhbmQgc2NyZWVuc2hvdAorYWRiICRzZXJpYWxGbGFnIGluc3RhbGwgLS1hYmkgJHRhcmdldF9hYmkgJGFwaworCisjIGluc3RhbGwgdmtyZXBsYXkgQVBLCithZGIgJHNlcmlhbEZsYWcgaW5zdGFsbCAtLWFiaSAkdGFyZ2V0X2FiaSAkdmtyZXBsYXlfYXBrCisKKyMgdHJhY2UgYW5kIHNjcmVlbnNob3QKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBzZXRwcm9wIGRlYnVnLnZ1bGthbi5sYXllci4xIFZLX0xBWUVSX0xVTkFSR192a3RyYWNlCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgc2V0cHJvcCBkZWJ1Zy52dWxrYW4ubGF5ZXIuMiBWS19MQVlFUl9MVU5BUkdfc2NyZWVuc2hvdAorYWRiICRzZXJpYWxGbGFnIHNoZWxsIHBtIGdyYW50ICRwYWNrYWdlIGFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBwbSBncmFudCAkcGFja2FnZSBhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRQorYWRiICRzZXJpYWxGbGFnIHNoZWxsIHNldHByb3AgZGVidWcudnVsa2FuLnNjcmVlbnNob3QgJGZyYW1lCisKKyMgdmt0cmFjZQorYWRiICRzZXJpYWxGbGFnIHJldmVyc2UgbG9jYWxhYnN0cmFjdDp2a3RyYWNlIHRjcDozNDIwMQorJHZrdHJhY2VfZXhlIC12IGZ1bGwgLW8gJHBhY2thZ2Uudmt0cmFjZSAmCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgYW0gc3RhcnQgJHBhY2thZ2UvJGFjdGl2aXR5CisKKyMgZG9uJ3QgaGFsdCBvbiBlcnJvciBmb3IgdGhpcyBsb29wCitzZXQgK2UKKworIyB3YWl0IHVudGlsIHRyYWNlIHNjcmVlbnNob3QgYXJyaXZlcywgb3IgYSB0aW1lb3V0Cit2a3RyYWNlX3NlY29uZHM9MzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEdXJhdGlvbiBpbiBzZWNvbmRzLgordmt0cmFjZV9lbmRfdGltZT0kKCggJChkYXRlICslcykgKyB2a3RyYWNlX3NlY29uZHMgKSkgICMgQ2FsY3VsYXRlIGVuZCB0aW1lLgorc2xlZXAgNSAjIHBhdXNlIHRvIGxldCB0aGUgc2NyZWVuc2hvdCB3cml0ZSBmaW5pc2gKK3VudGlsIGFkYiAkc2VyaWFsRmxhZyBzaGVsbCBscyAtbGEgL3NkY2FyZC9BbmRyb2lkLyRmcmFtZS5wcG0KK2RvCisgICAgZWNobyAiV2FpdGluZyBmb3IgJHBhY2thZ2Uudmt0cmFjZSBzY3JlZW5zaG90IG9uICRzZXJpYWwiCisKKyAgICBpZiBbICQoZGF0ZSArJXMpIC1ndCAkdmt0cmFjZV9lbmRfdGltZSBdCisgICAgdGhlbgorICAgICAgICBlY2hvICJ2a3RyYWNlIHRpbWVvdXQgcmVhY2hlZDogJHZrdHJhY2Vfc2Vjb25kcyBzZWNvbmRzIgorICAgICAgICBlY2hvICJObyB2a3RyYWNlIHNjcmVlbnNob3QsIGNsb3NpbmcgZG93biIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIHNsZWVwIDUKK2RvbmUKKworIyBzdG9wIG91ciBiYWNrZ3JvdW5kIHZrdHJhY2UKK2tpbGwgJCEKKworIyBwYXVzZSBmb3IgYSBtb21lbnQgdG8gbGV0IG91ciB0cmFjZSBmaWxlIGZpbmlzaCB3cml0aW5nCitzbGVlcCAxCisKKyMgaGFsdCBvbiBlcnJvcnMgaGVyZQorc2V0IC1lCisKKyMgc2V0IHVwIGZvciB2a3JlcGxheQorYWRiICRzZXJpYWxGbGFnIHNoZWxsIGFtIGZvcmNlLXN0b3AgJHBhY2thZ2UKK2lmIFsgLWYgJHBhY2thZ2Uudmt0cmFjZSBdOyB0aGVuCisgICAgYWRiICRzZXJpYWxGbGFnIHB1c2ggJHBhY2thZ2Uudmt0cmFjZSAvc2RjYXJkLyRwYWNrYWdlLnZrdHJhY2UKK2ZpCitpZiBbIC1mICRwYWNrYWdlXDAudmt0cmFjZSBdOyB0aGVuCisgICAgYWRiICRzZXJpYWxGbGFnIHB1c2ggJHBhY2thZ2VcMC52a3RyYWNlIC9zZGNhcmQvJHBhY2thZ2Uudmt0cmFjZQorZmkKKworIyBncmFiIHRoZSBzY3JlZW5zaG90CithZGIgJHNlcmlhbEZsYWcgcHVsbCAvc2RjYXJkL0FuZHJvaWQvJGZyYW1lLnBwbSAkcGFja2FnZS4kZnJhbWUudmt0cmFjZS5wcG0KK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBtdiAvc2RjYXJkL0FuZHJvaWQvJGZyYW1lLnBwbSAvc2RjYXJkL0FuZHJvaWQvJHBhY2thZ2UuJGZyYW1lLnZrdHJhY2UucHBtCisKKyMgcmVwbGF5IGFuZCBzY3JlZW5zaG90CithZGIgJHNlcmlhbEZsYWcgc2hlbGwgc2V0cHJvcCBkZWJ1Zy52dWxrYW4ubGF5ZXIuMSBWS19MQVlFUl9MVU5BUkdfc2NyZWVuc2hvdAorYWRiICRzZXJpYWxGbGFnIHNoZWxsIHNldHByb3AgZGVidWcudnVsa2FuLmxheWVyLjIgJyIiJworYWRiICRzZXJpYWxGbGFnIHNoZWxsIHNldHByb3AgZGVidWcudnVsa2FuLnNjcmVlbnNob3QgJGZyYW1lCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgcG0gZ3JhbnQgY29tLmV4YW1wbGUudmtyZXBsYXkgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRQorYWRiICRzZXJpYWxGbGFnIHNoZWxsIHBtIGdyYW50IGNvbS5leGFtcGxlLnZrcmVwbGF5IGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFCitzbGVlcCA1ICMgc21hbGwgcGF1c2UgdG8gYWxsb3cgcGVybWlzc2lvbiB0byB0YWtlCisKKyMgV2FrZSB1cCB0aGUgZGV2aWNlCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgaW5wdXQga2V5ZXZlbnQgIktFWUNPREVfTUVOVSIKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBpbnB1dCBrZXlldmVudCAiS0VZQ09ERV9IT01FIgorCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgYW0gc3RhcnQgLWEgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gLWMgYW5kcm9pZC1pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIIC1uIGNvbS5leGFtcGxlLnZrcmVwbGF5L2FuZHJvaWQuYXBwLk5hdGl2ZUFjdGl2aXR5IC0tZXMgYXJncyAiLXZcIGZ1bGxcIC10XCAvc2RjYXJkLyRwYWNrYWdlLnZrdHJhY2UiCisKKyMgZG9uJ3QgaGFsdCBvbiB0aGUgZXJyb3JzIGluIHRoaXMgbG9vcAorc2V0ICtlCisKKyMgd2FpdCB1bnRpbCB2a3JlcGxheSBzY3JlZW5zaG90IGFycml2ZXMsIG9yIGEgdGltZW91dAordmtyZXBsYXlfc2Vjb25kcz0zMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEdXJhdGlvbiBpbiBzZWNvbmRzLgordmtyZXBsYXlfZW5kX3RpbWU9JCgoICQoZGF0ZSArJXMpICsgdmtyZXBsYXlfc2Vjb25kcyApKSAgIyBDYWxjdWxhdGUgZW5kIHRpbWUuCitzbGVlcCA1ICMgcGF1c2UgdG8gbGV0IHRoZSBzY3JlZW5zaG90IHdyaXRlIGZpbmlzaAordW50aWwgYWRiICRzZXJpYWxGbGFnIHNoZWxsIGxzIC1sYSAvc2RjYXJkL0FuZHJvaWQvJGZyYW1lLnBwbQorZG8KKyAgICBlY2hvICJXYWl0aW5nIGZvciB2a3JlcGxheSBzY3JlZW5zaG90IG9uICRzZXJpYWwiCisKKyAgICBpZiBbICQoZGF0ZSArJXMpIC1ndCAkdmtyZXBsYXlfZW5kX3RpbWUgXQorICAgIHRoZW4KKyAgICAgICAgZWNobyAidmtyZXBsYXkgdGltZW91dCByZWFjaGVkOiAkdmtyZXBsYXlfc2Vjb25kcyBzZWNvbmRzIgorICAgICAgICBlY2hvICJObyB2a3JlcGxheSBzY3JlZW5zaG90LCBjbG9zaW5nIGRvd24iCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgc2xlZXAgNQorZG9uZQorCisjIGhhbHQgb24gYW55IGVycm9ycyBoZXJlCitzZXQgLWUKKworIyBncmFiIHRoZSBzY3JlZW5zaG90CithZGIgJHNlcmlhbEZsYWcgcHVsbCAvc2RjYXJkL0FuZHJvaWQvJGZyYW1lLnBwbSAkcGFja2FnZS4kZnJhbWUudmtyZXBsYXkucHBtCithZGIgJHNlcmlhbEZsYWcgc2hlbGwgbXYgL3NkY2FyZC9BbmRyb2lkLyRmcmFtZS5wcG0gL3NkY2FyZC9BbmRyb2lkLyRwYWNrYWdlLiRmcmFtZS52a3JlcGxheS5wcG0KKworIyBjbGVhbiB1cAorYWRiICRzZXJpYWxGbGFnIHNoZWxsIGFtIGZvcmNlLXN0b3AgY29tLmV4YW1wbGUudmtyZXBsYXkKK2FkYiAkc2VyaWFsRmxhZyBzaGVsbCBzZXRwcm9wIGRlYnVnLnZ1bGthbi5sYXllci4xICciIicKKworIyBkb24ndCBoYWx0IGluIHRoZSBleGl0IGNvZGUgYmVsb3cKK3NldCArZQorCisjIHRoZSByZXN0IGlzIGEgcXVpY2sgcG9ydCBmcm9tIHZrdHJhY2VyZXBsYXkuc2gKKworaWYgWyAtdCAxIF0gOyB0aGVuCisgICAgUkVEPSdcMDMzWzA7MzFtJworICAgIEdSRUVOPSdcMDMzWzA7MzJtJworICAgIE5DPSdcMDMzWzBtJyAjIE5vIENvbG9yCitlbHNlCisgICAgUkVEPScnCisgICAgR1JFRU49JycKKyAgICBOQz0nJworZmkKKworY21wIC1zICRwYWNrYWdlLiRmcmFtZS52a3RyYWNlLnBwbSAkcGFja2FnZS4kZnJhbWUudmtyZXBsYXkucHBtCisKK2lmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICBwcmludGYgIiRHUkVFTlsgIFBBU1NFRCAgXSROQyB7JGFway0kcGFja2FnZX1cbiIKK2Vsc2UKKyAgICBwcmludGYgIiRSRURbICBGQUlMRUQgIF0kTkMgc2NyZWVuc2hvdCBmaWxlIGNvbXBhcmUgZmFpbGVkXG4iCisgICAgcHJpbnRmICIkUkVEWyAgRkFJTEVEICBdJE5DIHskYXBrLSRwYWNrYWdlfVxuIgorICAgIHByaW50ZiAiVEVTVCBGQUlMRURcbiIKKyAgICBleGl0IDEKK2ZpCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvY21ha2UvRmluZFBDSUFjY2Vzcy5jbWFrZSBiL2NtYWtlL0ZpbmRQQ0lBY2Nlc3MuY21ha2UKaW5kZXggNjVmN2Q1Yy4uZDNjMjg4YyAxMDA2NDQKLS0tIGEvY21ha2UvRmluZFBDSUFjY2Vzcy5jbWFrZQorKysgYi9jbWFrZS9GaW5kUENJQWNjZXNzLmNtYWtlCkBAIC0xLDYgKzEsNyBAQAogIyAtIEZpbmRQQ0lBY2Nlc3MKICMKLSMgQ29weXJpZ2h0IDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCiAKIGZpbmRfcGFja2FnZShQa2dDb25maWcpCiAKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRQdGhyZWFkU3R1YnMuY21ha2UgYi9jbWFrZS9GaW5kUHRocmVhZFN0dWJzLmNtYWtlCmluZGV4IDA2M2JiZTUuLjlmYzMzZDUgMTAwNjQ0Ci0tLSBhL2NtYWtlL0ZpbmRQdGhyZWFkU3R1YnMuY21ha2UKKysrIGIvY21ha2UvRmluZFB0aHJlYWRTdHVicy5jbWFrZQpAQCAtMSw2ICsxLDcgQEAKICMgLSBGaW5kUHRocmVhZFN0dWJzCiAjCi0jIENvcHlyaWdodCAoQykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KIAogZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKIApkaWZmIC0tZ2l0IGEvY21ha2UvRmluZFVEZXYuY21ha2UgYi9jbWFrZS9GaW5kVURldi5jbWFrZQppbmRleCBlM2QxNjk5Li5kMjcyN2FkIDEwMDY0NAotLS0gYS9jbWFrZS9GaW5kVURldi5jbWFrZQorKysgYi9jbWFrZS9GaW5kVURldi5jbWFrZQpAQCAtMSw2ICsxLDcgQEAKICMgLSBGaW5kVURldgogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCiAKIGZpbmRfcGFja2FnZShQa2dDb25maWcpCiAKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRWYWxncmluZC5jbWFrZSBiL2NtYWtlL0ZpbmRWYWxncmluZC5jbWFrZQppbmRleCA1YzFmYjU2Li5mZGM0ZDdhIDEwMDY0NAotLS0gYS9jbWFrZS9GaW5kVmFsZ3JpbmQuY21ha2UKKysrIGIvY21ha2UvRmluZFZhbGdyaW5kLmNtYWtlCkBAIC0xLDYgKzEsNyBAQAogIyAtIEZpbmRWYWxncmluZAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCiAKIGZpbmRfcGFja2FnZShQa2dDb25maWcpCiAKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRYQ0IuY21ha2UgYi9jbWFrZS9GaW5kWENCLmNtYWtlCmluZGV4IDIzMTE1OTEuLjM2MGI4ZWUgMTAwNjQ0Ci0tLSBhL2NtYWtlL0ZpbmRYQ0IuY21ha2UKKysrIGIvY21ha2UvRmluZFhDQi5jbWFrZQpAQCAtMSw2ICsxLDcgQEAKICMgLSBGaW5kWENCCiAjCi0jIENvcHlyaWdodCAoQykgMjAxNSBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KIAogZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKIApkaWZmIC0tZ2l0IGEvZHJpMy5tZCBiL2RyaTMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkZTAwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaTMubWQKQEAgLTAsMCArMSwyNTAgQEAKKyMgQWRkaXRpb25hbCBMaW51eCBDb25maWd1cmF0aW9uIGZvciB0aGUgU2FtcGxlIEludGVsIFZ1bGthbiBEcml2ZXIKKworVGhlIHNhbXBsZSBpbnRlbCBWdWxrYW4gZHJpdmVyIGluIHRoaXMgcmVwbyB1c2VzIERSSTMgZm9yIGl0cyB3aW5kb3cgc3lzdGVtIGludGVyZmFjZS4KK1RoaXMgcmVxdWlyZXMgZXh0cmEgY29uZmlndXJhdGlvbiBvZiBVYnVudHUgc3lzdGVtcy4KKworWW91IG1heSBuZWVkIHRvIGluc3RhbGwgdGhlIGZvbGxvd2luZyBwYWNrYWdlczoKK2BgYAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgZ2l0IHN1YnZlcnNpb24gY21ha2UgbGliZ2wxLW1lc2EtZGV2IGZyZWVnbHV0My1kZXYgbGliZ2xtLWRldiBsaWJtYWdpY2t3YW5kLWRldiBxdDUtZGVmYXVsdCBsaWJwY2lhY2Nlc3MtZGV2IGxpYnB0aHJlYWQtc3R1YnMwLWRldiBsaWJ1ZGV2LWRldiBiaXNvbiBncmFwaHZpeiBsaWJwbmctZGV2IHB5dGhvbjMtbHhtbAorc3VkbyBhcHQtZ2V0IGJ1aWxkLWRlcCBtZXNhCitgYGAKKworIyMgTGludXggUmVuZGVyIE5vZGVzCisKK1RoZSByZW5kZXIgdGVzdHMgZGVwZW5kIG9uIGFjY2VzcyB0byBEUk0gcmVuZGVyIG5vZGVzLgorVG8gbWFrZSB0aGF0IGF2YWlsYWJsZSwgYSBjb3VwbGUgb2YgY29uZmlnIGZpbGVzIG5lZWQgdG8gYmUgY3JlYXRlZCB0byBzZXQgYSBtb2R1bGUgb3B0aW9uCithbmQgbWFrZSBhY2Nlc3NpYmxlIGRldmljZSBmaWxlcy4KK1RoZSBzeXN0ZW0gd2lsbCBuZWVkIHRvIGJlIHJlYm9vdGVkIHdpdGggdGhlc2UgZmlsZXMgaW4gcGxhY2UgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24uCitUaGVzZSBjb21tYW5kcyB3aWxsIGNyZWF0ZSB0aGUgY29uZmlnIGZpbGVzLgorCitgYGAKK3N1ZG8gdGVlIC9ldGMvbW9kcHJvYmUuZC9kcm0uY29uZiA8PCBFT0YKKyMgRW5hYmxlIHJlbmRlciBub2Rlcworb3B0aW9ucyBkcm0gcm5vZGVzPTEKK0VPRgorIyB0aGlzIHdpbGwgYWRkIHRoZSBybm9kZXM9MSBvcHRpb24gaW50byB0aGUgYm9vdCBlbnZpcm9ubWVudAorc3VkbyB1cGRhdGUtaW5pdHJhbWZzIC1rIGFsbCAtdQorYGBgCitgYGAKK3N1ZG8gdGVlIC9ldGMvdWRldi9ydWxlcy5kL2RybS5ydWxlcyA8PCBFT0YKKyMgQWRkIHBlcm1pc3Npb25zIHRvIHJlbmRlciBub2RlcworU1VCU1lTVEVNPT0iZHJtIiwgQUNUSU9OPT0iYWRkIiwgREVWUEFUSD09Ii9kZXZpY2VzLyovcmVuZGVyRCoiLCBNT0RFPSIwMjA2NjYiCitFT0YKK2BgYAorIyMgRFJJIDMKK0ZpbmQgeW91ciBVYnVudHUgcmVsZWFzZSBiZWxvdzoKKworIyMjIFVidW50dSAxNC4wNC4zIExUUyBzdXBwb3J0IG9mIERSSSAzCisKK1VidW50dSAxNC4wNC4zIExUUyBkb2VzIG5vdCBzaGlwIGEgeHNlcnZlci14b3JnLXZpZGVvLWludGVsIHBhY2thZ2Ugd2l0aCBzdXBwb3J0ZWQgRFJJIDMgb24gaW50ZWwgZ3JhcGhpY3MuCitUaGUgeHNlcnZlci14b3JnLXZpZGVvLWludGVsIHBhY2thZ2UgY2FuIGJlIGJ1aWx0IGZyb20gc291cmNlIHdpdGggRFJJIDMgZW5hYmxlZC4KK1VzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHRvIGVuYWJsZSBEUkkzIG9uIHVidW50dSAxNC4wNC4zIExUUy4KKworLSBJbnN0YWxsIHBhY2thZ2VzIHVzZWQgdG8gYnVpbGQ6CitgYGAKK3N1ZG8gYXB0LWdldCB1cGRhdGUKK3N1ZG8gYXB0LWdldCBkaXN0LXVwZ3JhZGUKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIGRldnNjcmlwdHMKK3N1ZG8gYXB0LWdldCBidWlsZC1kZXAgeHNlcnZlci14b3JnLXZpZGVvLWludGVsLWx0cy12aXZpZAorYGBgCisKKy0gR2V0IHRoZSBzb3VyY2UgY29kZSBmb3IgeHNlcnZlci14b3JnLXZpZGVvLWludGVsLWx0cy12aXZpZAorYGBgCitta2RpciB4c2VydmVyLXhvcmctdmlkZW8taW50ZWwtbHRzLXZpdmlkX3NvdXJjZQorY2QgeHNlcnZlci14b3JnLXZpZGVvLWludGVsLWx0cy12aXZpZF9zb3VyY2UKK2FwdC1nZXQgc291cmNlIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbC1sdHMtdml2aWQKK2NkIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbC1sdHMtdml2aWQtMi45OS45MTcKK2RlYmlhbi9ydWxlcyBwYXRjaAorcXVpbHQgbmV3ICdlbmFibGUtRFJJMycKK3F1aWx0IGVkaXQgY29uZmlndXJlLmFjCitgYGAKKworLSBVc2UgdGhlIGVkaXRvciB0byBtYWtlIHRoZXNlIGNoYW5nZXMuCitgYGAKKy0tLSBhL2NvbmZpZ3VyZS5hYworKysrIGIvY29uZmlndXJlLmFjCitAQCAtMzQwLDkgKzM0MCw5IEBACisgCSAgICAgIFtEUkkyPXllc10pCisgQUNfQVJHX0VOQUJMRShkcmkzLAorIAkgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZHJpM10sCistCQkJICAgICBbRW5hYmxlIERSSTMgc3VwcG9ydCBbW2RlZmF1bHQ9bm9dXV0pLAorKwkJCSAgICAgW0VuYWJsZSBEUkkzIHN1cHBvcnQgW1tkZWZhdWx0PXllc11dXSksCisgCSAgICAgIFtEUkkzPSRlbmFibGV2YWxdLAorLQkgICAgICBbRFJJMz1ub10pCisrCSAgICAgIFtEUkkzPXllc10pCisgQUNfQVJHX0VOQUJMRSh4dm1jLCBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXh2bWNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBYdk1DIHN1cHBvcnQgW1tkZWZhdWx0PXllc11dXSksCitgYGAKKy0gQnVpbGQgYW5kIGluc3RhbGwgeHNlcnZlci14b3JnLXZpZGVvLWludGVsLWx0cy12aXZpZAorYGBgCitxdWlsdCByZWZyZXNoCitkZWJpYW4vcnVsZXMgY2xlYW4KK2RlYnVpbGQgLXVzIC11Yworc3VkbyBkcGtnIC1pIC4uL3hzZXJ2ZXIteG9yZy12aWRlby1pbnRlbC1sdHMtdml2aWRfMi45OS45MTctMX5leHAxdWJ1bnR1Mi4yfnRydXN0eTFfYW1kNjQuZGViCitgYGAKKy0gUHJldmVudCB1cGRhdGVzIGZyb20gcmVwbGFjaW5nIHRoaXMgdmVyc2lvbiBvZiB0aGUgcGFja2FnZS4KK2BgYAorc3VkbyBiYXNoIC1jICdlY2hvIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbC1sdHMtdml2aWQgaG9sZCB8IGRwa2cgLS1zZXQtc2VsZWN0aW9ucycKK2BgYAorLSBzYXZlIHlvdXIgd29yayB0aGVuIHJlc3RhcnQgdGhlIFggc2VydmVyIHdpdGggdGhlIG5leHQgY29tbWFuZC4KK2BgYAorc3VkbyBzZXJ2aWNlIGxpZ2h0ZG0gcmVzdGFydAorYGBgCistIEFmdGVyIGxvZ2dpbmcgaW4gYWdhaW4sIGNoZWNrIGZvciBzdWNjZXNzIHdpdGggdGhpcyBjb21tYW5kIGFuZCBsb29rIGZvciBEUkkzLgorYGBgCit4ZHB5aW5mbyB8IGdyZXAgRFJJCitgYGAKKworIyMjIFVidW50dSAxNC4xMCBzdXBwb3J0IG9mIERSSSAzCisKK1dhcm5pbmc6IFJlY2VudCB2ZXJzaW9ucyBvZiAxNC4xMCBoYXZlICoqUkVNT1ZFRCoqIERSSSAzLgorVmVyc2lvbjogMjoyLjk5LjkxNC0xfmV4cDF1YnVudHU0LjEgaXMga25vd24gdG8gd29yay4KK1RvIHNlZSBzdGF0dXMgb2YgdGhpcyBwYWNrYWdlOgorYGBgCitkcGtnIC1zIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbAorYGBgCisKK05vdGU6CitWZXJzaW9uIDI6Mi45OS45MTQtMX5leHAxdWJ1bnR1NC4yIGRvZXMgbm90IHdvcmsgYW55bW9yZS4KK1RvIGluc3RhbGwgdGhlIHdvcmtpbmcgZHJpdmVyIGZyb20gbGF1bmNocGFkbGlicmFyaWFuLm5ldDoKKy0gUmVtb3ZlIHRoZSBjdXJyZW50IGRyaXZlcjoKK2BgYAorc3VkbyBhcHQtZ2V0IHB1cmdlIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbAorYGBgCistIERvd25sb2FkIHRoZSBvbGQgZHJpdmVyOgorYGBgCit3Z2V0IGh0dHA6Ly9sYXVuY2hwYWRsaWJyYXJpYW4ubmV0LzE4OTQxODMzOS94c2VydmVyLXhvcmctdmlkZW8taW50ZWxfMi45OS45MTQtMSU3RWV4cDF1YnVudHU0LjFfYW1kNjQuZGViCitgYGAKKy0gSW5zdGFsbCB0aGUgZHJpdmVyOgorYGBgCitzdWRvIGRwa2cgLWkgeHNlcnZlci14b3JnLXZpZGVvLWludGVsXzIuOTkuOTE0LTF+ZXhwMXVidW50dTQuMV9hbWQ2NC5kZWIKK2BgYAorLSBQaW4gdGhlIHBhY2thZ2UgdG8gcHJldmVudCB1cGRhdGVzCitgYGAKK3N1ZG8gYmFzaCAtYyAiZWNobyAkJ1BhY2thZ2U6IHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbFxuUGluOiB2ZXJzaW9uIDI6Mi45OS45MTQtMX5leHAxdWJ1bnR1NC4xXG5QaW4tUHJpb3JpdHk6IDEwMDEnID4gL2V0Yy9hcHQvcHJlZmVyZW5jZXMuZC94c2VydmVyLXhvcmctdmlkZW8taW50ZWwiCitgYGAKKworLSBFaXRoZXIgcmVzdGFydCBVYnVudHUgb3IganVzdCBYMTEuCisKKworIyMjIFVidW50dSAxNS4wNCBzdXBwb3J0IG9mIERSSSAzCisKK1VidW50dSAxNS4wNCBoYXMgbmV2ZXIgc2hpcHBlZCBhIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbCBwYWNrYWdlIHdpdGggc3VwcG9ydGVkIERSSSAzIG9uIGludGVsIGdyYXBoaWNzLgorVGhlIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbCBwYWNrYWdlIGNhbiBiZSBidWlsdCBmcm9tIHNvdXJjZSB3aXRoIERSSSAzIGVuYWJsZWQuCitVc2UgdGhlIGZvbGxvd2luZyBjb21tYW5kcyB0byBlbmFibGUgRFJJMyBvbiB1YnVudHUgMTUuMDQuCisKKy0gSW5zdGFsbCBwYWNrYWdlcyB1c2VkIHRvIGJ1aWxkOgorYGBgCitzdWRvIGFwdC1nZXQgdXBkYXRlCitzdWRvIGFwdC1nZXQgZGlzdC11cGdyYWRlCitzdWRvIGFwdC1nZXQgaW5zdGFsbCBkZXZzY3JpcHRzCitzdWRvIGFwdC1nZXQgYnVpbGQtZGVwIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbAorYGBgCisKKy0gR2V0IHRoZSBzb3VyY2UgY29kZSBmb3IgeHNlcnZlci14b3JnLXZpZGVvLWludGVsCitgYGAKK21rZGlyIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbF9zb3VyY2UKK2NkIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbF9zb3VyY2UKK2FwdC1nZXQgc291cmNlIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbAorY2QgeHNlcnZlci14b3JnLXZpZGVvLWludGVsLTIuOTkuOTE3CitkZWJpYW4vcnVsZXMgcGF0Y2gKK3F1aWx0IG5ldyAnZW5hYmxlLURSSTMnCitxdWlsdCBlZGl0IGNvbmZpZ3VyZS5hYworYGBgCisKKy0gVXNlIHRoZSBlZGl0b3IgdG8gbWFrZSB0aGVzZSBjaGFuZ2VzLgorYGBgCistLS0gYS9jb25maWd1cmUuYWMKKysrKyBiL2NvbmZpZ3VyZS5hYworQEAgLTM0MCw5ICszNDAsOSBAQAorIAkgICAgICBbRFJJMj15ZXNdKQorIEFDX0FSR19FTkFCTEUoZHJpMywKKyAJICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRyaTNdLAorLQkJCSAgICAgW0VuYWJsZSBEUkkzIHN1cHBvcnQgW1tkZWZhdWx0PW5vXV1dKSwKKysJCQkgICAgIFtFbmFibGUgRFJJMyBzdXBwb3J0IFtbZGVmYXVsdD15ZXNdXV0pLAorIAkgICAgICBbRFJJMz0kZW5hYmxldmFsXSwKKy0JICAgICAgW0RSSTM9bm9dKQorKwkgICAgICBbRFJJMz15ZXNdKQorIEFDX0FSR19FTkFCTEUoeHZtYywgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS14dm1jXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgWHZNQyBzdXBwb3J0IFtbZGVmYXVsdD15ZXNdXV0pLAorYGBgCistIEJ1aWxkIGFuZCBpbnN0YWxsIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbAorYGBgCitxdWlsdCByZWZyZXNoCitkZWJpYW4vcnVsZXMgY2xlYW4KK2RlYnVpbGQgLXVzIC11Yworc3VkbyBkcGtnIC1pIC4uL3hzZXJ2ZXIteG9yZy12aWRlby1pbnRlbF8yLjk5LjkxNy0xfmV4cDF1YnVudHUyLjJfYW1kNjQuZGViCitgYGAKKy0gUHJldmVudCB1cGRhdGVzIGZyb20gcmVwbGFjaW5nIHRoaXMgdmVyc2lvbiBvZiB0aGUgcGFja2FnZS4KK2BgYAorc3VkbyBiYXNoIC1jICdlY2hvIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbCBob2xkIHwgZHBrZyAtLXNldC1zZWxlY3Rpb25zJworYGBgCistIHNhdmUgeW91ciB3b3JrIHRoZW4gcmVzdGFydCB0aGUgWCBzZXJ2ZXIgd2l0aCB0aGUgbmV4dCBjb21tYW5kLgorYGBgCitzdWRvIHNlcnZpY2UgbGlnaHRkbSByZXN0YXJ0CitgYGAKKy0gQWZ0ZXIgbG9nZ2luZyBpbiBhZ2FpbiwgY2hlY2sgZm9yIHN1Y2Nlc3Mgd2l0aCB0aGlzIGNvbW1hbmQgYW5kIGxvb2sgZm9yIERSSTMuCitgYGAKK3hkcHlpbmZvIHwgZ3JlcCBEUkkKK2BgYAorIyMjIFVidW50dSAxNS4xMCBzdXBwb3J0IG9mIERSSSAzCisKK1VidW50dSAxNS4xMCBoYXMgbmV2ZXIgc2hpcHBlZCBhIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbCBwYWNrYWdlIHdpdGggc3VwcG9ydGVkIERSSSAzIG9uIGludGVsIGdyYXBoaWNzLgorVGhlIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbCBwYWNrYWdlIGNhbiBiZSBidWlsdCBmcm9tIHNvdXJjZSB3aXRoIERSSSAzIGVuYWJsZWQuCitVc2UgdGhlIGZvbGxvd2luZyBjb21tYW5kcyB0byBlbmFibGUgRFJJMyBvbiB1YnVudHUgMTUuMTAuCisKKy0gSW5zdGFsbCBwYWNrYWdlcyB1c2VkIHRvIGJ1aWxkOgorYGBgCitzdWRvIGFwdC1nZXQgdXBkYXRlCitzdWRvIGFwdC1nZXQgZGlzdC11cGdyYWRlCitzdWRvIGFwdC1nZXQgaW5zdGFsbCBkZXZzY3JpcHRzCitzdWRvIGFwdC1nZXQgYnVpbGQtZGVwIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbAorYGBgCisKKy0gR2V0IHRoZSBzb3VyY2UgY29kZSBmb3IgeHNlcnZlci14b3JnLXZpZGVvLWludGVsCitgYGAKK21rZGlyIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbF9zb3VyY2UKK2NkIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbF9zb3VyY2UKK2FwdC1nZXQgc291cmNlIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbAorY2QgeHNlcnZlci14b3JnLXZpZGVvLWludGVsLTIuOTkuOTE3K2dpdDIwMTUwODA4CitkZWJpYW4vcnVsZXMgcGF0Y2gKK3F1aWx0IG5ldyAnZW5hYmxlLURSSTMnCitxdWlsdCBlZGl0IGNvbmZpZ3VyZS5hYworYGBgCisKKy0gVXNlIHRoZSBlZGl0b3IgdG8gbWFrZSB0aGVzZSBjaGFuZ2VzLgorYGBgCitJbmRleDogeHNlcnZlci14b3JnLXZpZGVvLWludGVsLTIuOTkuOTE3K2dpdDIwMTUwODA4L2NvbmZpZ3VyZS5hYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbC0yLjk5LjkxNytnaXQyMDE1MDgwOC5vcmlnL2NvbmZpZ3VyZS5hYworKysrIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbC0yLjk5LjkxNytnaXQyMDE1MDgwOC9jb25maWd1cmUuYWMKK0BAIC0zNTYsNyArMzU2LDcgQEAgQUNfQVJHX1dJVEgoZGVmYXVsdC1kcmksCisgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLWRlZmF1bHQtZHJpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZWxlY3QgdGhlIGRlZmF1bHQgbWF4aW11bSBEUkkgbGV2ZWwgW2RlZmF1bHQgMl1dKSwKKyAgICAgICAgICAgICAgW0RSSV9ERUZBVUxUPSR3aXRodmFsXSwKKy0gICAgICAgICAgICAgW0RSSV9ERUZBVUxUPTJdKQorKyAgICAgICAgICAgICBbRFJJX0RFRkFVTFQ9M10pCisgaWYgdGVzdCAieCREUklfREVGQVVMVCIgPSAieDAiOyB0aGVuCisgICAgICAgIEFDX0RFRklORShERUZBVUxUX0RSSV9MRVZFTCwgMCxbRGVmYXVsdCBEUkkgbGV2ZWxdKQorIGVsc2UKK2BgYAorLSBCdWlsZCBhbmQgaW5zdGFsbCB4c2VydmVyLXhvcmctdmlkZW8taW50ZWwKK2BgYAorcXVpbHQgcmVmcmVzaAorZGViaWFuL3J1bGVzIGNsZWFuCitkZWJ1aWxkIC11cyAtdWMKK3N1ZG8gZHBrZyAtaSAuLi94c2VydmVyLXhvcmctdmlkZW8taW50ZWxfMi45OS45MTcrZ2l0MjAxNTA4MDgtMHVidW50dTRfYW1kNjQuZGViCitgYGAKKy0gUHJldmVudCB1cGRhdGVzIGZyb20gcmVwbGFjaW5nIHRoaXMgdmVyc2lvbiBvZiB0aGUgcGFja2FnZS4KK2BgYAorc3VkbyBiYXNoIC1jICdlY2hvIHhzZXJ2ZXIteG9yZy12aWRlby1pbnRlbCBob2xkIHwgZHBrZyAtLXNldC1zZWxlY3Rpb25zJworYGBgCistIHNhdmUgeW91ciB3b3JrIHRoZW4gcmVzdGFydCB0aGUgWCBzZXJ2ZXIgd2l0aCB0aGUgbmV4dCBjb21tYW5kLgorYGBgCitzdWRvIHNlcnZpY2UgbGlnaHRkbSByZXN0YXJ0CitgYGAKKy0gQWZ0ZXIgbG9nZ2luZyBpbiBhZ2FpbiwgY2hlY2sgZm9yIHN1Y2Nlc3Mgd2l0aCB0aGlzIGNvbW1hbmQgYW5kIGxvb2sgZm9yIERSSTMuCitgYGAKK3hkcHlpbmZvIHwgZ3JlcCBEUkkKK2BgYAorCmRpZmYgLS1naXQgYS9pY2QvQ01ha2VMaXN0cy50eHQgYi9pY2QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjMmJiNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE5IEBACitmdW5jdGlvbihhZGRfY29tcGlsZXJfZmxhZyBmbGFnKQorICAgIHNldChDTUFLRV9DX0ZMQUdTICAgICIke0NNQUtFX0NfRkxBR1N9ICAgJHtmbGFnfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgICIke0NNQUtFX0NYWF9GTEFHU30gJHtmbGFnfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCitpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTGludXgiKQorICAgIGFkZF9jb21waWxlcl9mbGFnKCItRFBMQVRGT1JNX0xJTlVYPTEiKQorICAgIGFkZF9jb21waWxlcl9mbGFnKCItRFBMQVRGT1JNX1BPU0lYPTEiKQorZWxzZWlmICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJXaW5kb3dzIikKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLURQTEFURk9STV9XSU5ET1dTPTEiKQorZWxzZSgpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiUGxhdGZvcm0gdW5zZXQsIGJ1aWxkIHdpbGwgZmFpbC0tc3RvcHBpbmcgYXQgQ01ha2UgdGltZS4iKQorZW5kaWYoKQorCithZGRfc3ViZGlyZWN0b3J5KGNvbW1vbikKK2FkZF9zdWJkaXJlY3RvcnkobnVsbGRydikKK2lmIChOT1QgV0lOMzIpCisgICAgYWRkX3N1YmRpcmVjdG9yeShpbnRlbCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2ljZC9SRUFETUUubWQgYi9pY2QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmY5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjYgQEAKK1RoaXMgc2FtcGxlIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBwcm92aWRlIG11bHRpcGxlIHN1YmNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYW5kIHRlc3QgYW4gSW5zdGFsbGFibGUgQ2xpZW50IERyaXZlciAoSUNEKToKKy0gW0NvbW1vbiBJbmZyYXN0cnVjdHVyZV0oY29tbW9uKQorLSBbSW1wbGVtZW50YXRpb24gZm9yIEludGVsIEdQVXNdKGludGVsKQorLSBbTnVsbCBkcml2ZXJdKG51bGxkcnYpCistIFsqU2FtcGxlIERyaXZlciBUZXN0cypdKC4uL3Rlc3RzKQorICAgIC0gTm93IGluY2x1ZGVzIEdvbGRlbiBpbWFnZXMgdG8gdmVyaWZ5IHZrX3JlbmRlcl90ZXN0cyByZW5kZXJpbmcuCisKK2NvbW1vbi8gcHJvdmlkZXMgaGVscGVyIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucywgYXMgd2VsbCBhcyBhbGwgVksgZW50cnkgcG9pbnRzCitleGNlcHQgdmtJbml0QW5kRW51bWVyYXRlR3B1cy4gIEhhcmR3YXJlIGRyaXZlcnMgYXJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhhdAorZnVuY3Rpb24sIGFuZCB0byBlbWJlZCBhICJWa0xheWVyRGlzcGF0Y2hUYWJsZSAqIiBhcyB0aGUgZmlyc3QgbWVtYmVyIG9mCitWa1BoeXNpY2FsRGV2aWNlIGFuZCBhbGwgVmtCYXNlT2JqZWN0LgorCitUaHJlYWQgc2FmZXR5CisKKyBXZSBoYXZlIHRoZXNlIHN0YXRpYyB2YXJpYWJsZXMKKworICAtIGNvbW1vbi9pY2QuYzpzdGF0aWMgc3RydWN0IGljZCBpY2Q7CisgIC0gaW50ZWwvZ3B1LmM6c3RhdGljIHN0cnVjdCBpbnRlbF9ncHUgKmludGVsX2dwdXM7CisKKyBUaGV5IHJlcXVpcmUgdGhhdCB0aGVyZSBpcyBubyBvdGhlciB0aHJlYWQgY2FsbGluZyB0aGUgSUNEIHdoZW4gdGhlc2UKKyBmdW5jdGlvbnMgYXJlIGNhbGxlZAorCisgIC0gdmtJbml0QW5kRW51bWVyYXRlR3B1cworICAtIHZrRGJnUmVnaXN0ZXJNc2dDYWxsYmFjaworICAtIHZrRGJnVW5yZWdpc3Rlck1zZ0NhbGxiYWNrCisgIC0gdmtEYmdTZXRHbG9iYWxPcHRpb24KZGlmZiAtLWdpdCBhL2ljZC9jb21tb24vQ01ha2VMaXN0cy50eHQgYi9pY2QvY29tbW9uL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWMxODYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvY29tbW9uL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjUgQEAKK2lmIChXSU4zMikKKyAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIikKK2VuZGlmKCkKKworc2V0KHNvdXJjZXMKKyAgICBpY2QtZm9ybWF0LmMKKyAgICBpY2QtaW5zdGFuY2UuYworICAgIGljZC11dGlscy5jKQorCitzZXQoaW5jbHVkZV9kaXJzICIiKQorc2V0KGxpYnJhcmllcyAiIikKKworaWYoVU5JWCkKKyAgICBmaW5kX3BhY2thZ2UoVURldiBSRVFVSVJFRCkKKyAgICBsaXN0KEFQUEVORCBpbmNsdWRlX2RpcnMgJHtVREVWX0lOQ0xVREVfRElSU30pCisgICAgbGlzdChBUFBFTkQgbGlicmFyaWVzICR7VURFVl9MSUJSQVJJRVN9KQorICAgIGxpc3QoQVBQRU5EIHNvdXJjZXMgaWNkLWVudW1lcmF0ZS1kcm0uYykKK2VuZGlmKCkKKworYWRkX2xpYnJhcnkoaWNkIFNUQVRJQyAke3NvdXJjZXN9KQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoaWNkCisgICAgUFJJVkFURSAke2luY2x1ZGVfZGlyc30KKyAgICBJTlRFUkZBQ0UgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGljZCAke2xpYnJhcmllc30pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoaWNkIFBST1BFUlRJRVMgUE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERSBPTikKZGlmZiAtLWdpdCBhL2ljZC9jb21tb24vaWNkLWVudW1lcmF0ZS1kcm0uYyBiL2ljZC9jb21tb24vaWNkLWVudW1lcmF0ZS1kcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRkMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2NvbW1vbi9pY2QtZW51bWVyYXRlLWRybS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKworI2luY2x1ZGUgImljZC1pbnN0YW5jZS5oIgorI2luY2x1ZGUgImljZC11dGlscy5oIgorI2luY2x1ZGUgImljZC1lbnVtZXJhdGUtZHJtLmgiCisKK3N0YXRpYyBlbnVtIGljZF9kcm1fbWlub3JfdHlwZSBnZXRfbWlub3JfdHlwZShzdHJ1Y3QgdWRldl9kZXZpY2UgKm1pbm9yX2RldikKK3sKKyAgICBjb25zdCBjaGFyICptaW5vcjsKKworICAgIG1pbm9yID0gdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5X3ZhbHVlKG1pbm9yX2RldiwgIk1JTk9SIik7CisgICAgaWYgKCFtaW5vcikKKyAgICAgICAgcmV0dXJuIElDRF9EUk1fTUlOT1JfSU5WQUxJRDsKKworICAgIHN3aXRjaCAoYXRvaShtaW5vcikgPj4gNikgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIElDRF9EUk1fTUlOT1JfTEVHQUNZOworICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuIElDRF9EUk1fTUlOT1JfUkVOREVSOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBJQ0RfRFJNX01JTk9SX0lOVkFMSUQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRfcGNpX2lkKHN0cnVjdCB1ZGV2X2RldmljZSAqcGNpX2RldiwgaW50ICp2ZW5kb3IsIGludCAqZGV2aWQpCit7CisgICAgY29uc3QgY2hhciAqcGNpX2lkOworCisgICAgcGNpX2lkID0gdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5X3ZhbHVlKHBjaV9kZXYsICJQQ0lfSUQiKTsKKyAgICBpZiAoc3NjYW5mKHBjaV9pZCwgIiV4OiV4IiwgdmVuZG9yLCBkZXZpZCkgIT0gMikgeworICAgICAgICAqdmVuZG9yID0gMDsKKyAgICAgICAgKmRldmlkID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWNkX2RybV9kZXZpY2UgKmZpbmRfZGV2KHN0cnVjdCBpY2RfZHJtX2RldmljZSAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9zeXNwYXRoKQoreworICAgIHN0cnVjdCBpY2RfZHJtX2RldmljZSAqZGV2ID0gZGV2aWNlczsKKworICAgIHdoaWxlIChkZXYpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoKGNvbnN0IGNoYXIgKikgZGV2LT5pZCwgcGFyZW50X3N5c3BhdGgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRldiA9IGRldi0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2OworfQorCitzdGF0aWMgc3RydWN0IGljZF9kcm1fZGV2aWNlICpwcm9iZV9zeXNwYXRoKGNvbnN0IHN0cnVjdCBpY2RfaW5zdGFuY2UgKmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWNkX2RybV9kZXZpY2UgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1ZGV2ICp1ZGV2LCBjb25zdCBjaGFyICpzeXNwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVuZG9yX2lkX21hdGNoKQoreworICAgIHN0cnVjdCB1ZGV2X2RldmljZSAqbWlub3IsICpwYXJlbnQ7CisgICAgZW51bSBpY2RfZHJtX21pbm9yX3R5cGUgdHlwZTsKKyAgICBjb25zdCBjaGFyICpwYXJlbnRfc3lzcGF0aDsKKyAgICBzdHJ1Y3QgaWNkX2RybV9kZXZpY2UgKmRldjsKKyAgICBpbnQgdmVuZG9yLCBkZXZpZDsKKworICAgIG1pbm9yID0gdWRldl9kZXZpY2VfbmV3X2Zyb21fc3lzcGF0aCh1ZGV2LCBzeXNwYXRoKTsKKyAgICBpZiAoIW1pbm9yKQorICAgICAgICByZXR1cm4gZGV2aWNlczsKKworICAgIHR5cGUgPSBnZXRfbWlub3JfdHlwZShtaW5vcik7CisgICAgaWYgKHR5cGUgPT0gSUNEX0RSTV9NSU5PUl9JTlZBTElEKSB7CisgICAgICAgIHVkZXZfZGV2aWNlX3VucmVmKG1pbm9yKTsKKyAgICAgICAgcmV0dXJuIGRldmljZXM7CisgICAgfQorCisgICAgcGFyZW50ID0gdWRldl9kZXZpY2VfZ2V0X3BhcmVudChtaW5vcik7CisgICAgaWYgKCFwYXJlbnQpIHsKKyAgICAgICAgdWRldl9kZXZpY2VfdW5yZWYobWlub3IpOworICAgICAgICByZXR1cm4gZGV2aWNlczsKKyAgICB9CisKKyAgICBnZXRfcGNpX2lkKHBhcmVudCwgJnZlbmRvciwgJmRldmlkKTsKKyAgICBpZiAodmVuZG9yX2lkX21hdGNoICYmIHZlbmRvciAhPSB2ZW5kb3JfaWRfbWF0Y2gpIHsKKyAgICAgICAgdWRldl9kZXZpY2VfdW5yZWYobWlub3IpOworICAgICAgICByZXR1cm4gZGV2aWNlczsKKyAgICB9CisKKyAgICBwYXJlbnRfc3lzcGF0aCA9IHVkZXZfZGV2aWNlX2dldF9zeXNwYXRoKHBhcmVudCk7CisKKyAgICBkZXYgPSBmaW5kX2RldihkZXZpY2VzLCBwYXJlbnRfc3lzcGF0aCk7CisgICAgaWYgKGRldikgeworICAgICAgICBhc3NlcnQoZGV2LT5kZXZpZCA9PSBkZXZpZCk7CisKKyAgICAgICAgYXNzZXJ0KCFkZXYtPm1pbm9yc1t0eXBlXSk7CisgICAgICAgIGlmIChkZXYtPm1pbm9yc1t0eXBlXSkKKyAgICAgICAgICAgIHVkZXZfZGV2aWNlX3VucmVmKChzdHJ1Y3QgdWRldl9kZXZpY2UgKikgZGV2LT5taW5vcnNbdHlwZV0pOworCisgICAgICAgIGRldi0+bWlub3JzW3R5cGVdID0gKHZvaWQgKikgbWlub3I7CisKKyAgICAgICAgcmV0dXJuIGRldmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2ID0gaWNkX2luc3RhbmNlX2FsbG9jKGluc3RhbmNlLCBzaXplb2YoKmRldiksIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0NPTU1BTkQpOworICAgICAgICBpZiAoIWRldikKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2VzOworCisgICAgICAgIG1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisKKyAgICAgICAgZGV2LT5pZCA9IChjb25zdCB2b2lkICopIHBhcmVudF9zeXNwYXRoOworICAgICAgICBkZXYtPmRldmlkID0gZGV2aWQ7CisgICAgICAgIGRldi0+bWlub3JzW3R5cGVdID0gKHZvaWQgKikgbWlub3I7CisKKyAgICAgICAgZGV2LT5uZXh0ID0gZGV2aWNlczsKKworICAgICAgICByZXR1cm4gZGV2OworICAgIH0KK30KKworc3RydWN0IGljZF9kcm1fZGV2aWNlICppY2RfZHJtX2VudW1lcmF0ZShjb25zdCBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlbmRvcl9pZCkKK3sKKyAgICBzdHJ1Y3QgaWNkX2RybV9kZXZpY2UgKmRldmljZXMgPSBOVUxMOworICAgIHN0cnVjdCB1ZGV2ICp1ZGV2OworICAgIHN0cnVjdCB1ZGV2X2VudW1lcmF0ZSAqZTsKKyAgICBzdHJ1Y3QgdWRldl9saXN0X2VudHJ5ICplbnRyeTsKKworICAgIHVkZXYgPSB1ZGV2X25ldygpOworICAgIGlmICh1ZGV2ID09IE5VTEwpIHsKKyAgICAgICAgaWNkX2luc3RhbmNlX2xvZyhpbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgVktfTlVMTF9IQU5ETEUsICAgICAvKiBvYmpfdHlwZSwgb2JqZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAvKiBsb2NhdGlvbiwgbXNnX2NvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGluaXRpYWxpemUgdWRldiBjb250ZXh0Iik7CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZSA9IHVkZXZfZW51bWVyYXRlX25ldyh1ZGV2KTsKKyAgICBpZiAoZSA9PSBOVUxMKSB7CisgICAgICAgIGljZF9pbnN0YW5jZV9sb2coaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFZLX05VTExfSEFORExFLCAgICAgLyogb2JqX3R5cGUsIG9iamVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgLyogbG9jYXRpb24sIG1zZ19jb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBpbml0aWFsaXplIHVkZXYgZW51bWVyYXRlIGNvbnRleHQiKTsKKyAgICAgICAgdWRldl91bnJlZih1ZGV2KTsKKworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBEUk0gbWlub3JzICovCisgICAgdWRldl9lbnVtZXJhdGVfYWRkX21hdGNoX3N1YnN5c3RlbShlLCAiZHJtIik7CisgICAgdWRldl9lbnVtZXJhdGVfYWRkX21hdGNoX3Byb3BlcnR5KGUsICJERVZUWVBFIiwgImRybV9taW5vciIpOworICAgIHVkZXZfZW51bWVyYXRlX3NjYW5fZGV2aWNlcyhlKTsKKworICAgIHVkZXZfbGlzdF9lbnRyeV9mb3JlYWNoKGVudHJ5LCB1ZGV2X2VudW1lcmF0ZV9nZXRfbGlzdF9lbnRyeShlKSkgeworICAgICAgICBkZXZpY2VzID0gcHJvYmVfc3lzcGF0aChpbnN0YW5jZSwgZGV2aWNlcywgdWRldiwKKyAgICAgICAgICAgICAgICB1ZGV2X2xpc3RfZW50cnlfZ2V0X25hbWUoZW50cnkpLCB2ZW5kb3JfaWQpOworICAgIH0KKworICAgIGZyZWUoZSk7CisgICAgZnJlZSh1ZGV2KTsKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKwordm9pZCBpY2RfZHJtX3JlbGVhc2UoY29uc3Qgc3RydWN0IGljZF9pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWNkX2RybV9kZXZpY2UgKmRldmljZXMpCit7CisgICAgc3RydWN0IGljZF9kcm1fZGV2aWNlICpkZXYgPSBkZXZpY2VzOworCisgICAgd2hpbGUgKGRldikgeworICAgICAgICBzdHJ1Y3QgaWNkX2RybV9kZXZpY2UgKm5leHQgPSBkZXYtPm5leHQ7CisgICAgICAgIHNpemVfdCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldi0+bWlub3JzKTsgaSsrKQorICAgICAgICAgICAgdWRldl9kZXZpY2VfdW5yZWYoKHN0cnVjdCB1ZGV2X2RldmljZSAqKSBkZXYtPm1pbm9yc1tpXSk7CisKKyAgICAgICAgaWNkX2luc3RhbmNlX2ZyZWUoaW5zdGFuY2UsIGRldik7CisgICAgICAgIGRldiA9IG5leHQ7CisgICAgfQorfQorCitjb25zdCBjaGFyICppY2RfZHJtX2dldF9kZXZub2RlKHN0cnVjdCBpY2RfZHJtX2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGljZF9kcm1fbWlub3JfdHlwZSBtaW5vcikKK3sKKyAgICByZXR1cm4gKGRldi0+bWlub3JzW21pbm9yXSkgPworICAgICAgICB1ZGV2X2RldmljZV9nZXRfZGV2bm9kZSgoc3RydWN0IHVkZXZfZGV2aWNlICopIGRldi0+bWlub3JzW21pbm9yXSkgOgorICAgICAgICBOVUxMOworfQpkaWZmIC0tZ2l0IGEvaWNkL2NvbW1vbi9pY2QtZW51bWVyYXRlLWRybS5oIGIvaWNkL2NvbW1vbi9pY2QtZW51bWVyYXRlLWRybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGVhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvY29tbW9uL2ljZC1lbnVtZXJhdGUtZHJtLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIElDRF9FTlVNRVJBVEVfRFJNX0gKKyNkZWZpbmUgSUNEX0VOVU1FUkFURV9EUk1fSAorCitlbnVtIGljZF9kcm1fbWlub3JfdHlwZSB7CisgICAgSUNEX0RSTV9NSU5PUl9MRUdBQ1ksCisgICAgSUNEX0RSTV9NSU5PUl9SRU5ERVIsCisKKyAgICBJQ0RfRFJNX01JTk9SX0NPVU5ULAorICAgIElDRF9EUk1fTUlOT1JfSU5WQUxJRCwKK307CisKK3N0cnVjdCBpY2RfZHJtX2RldmljZSB7CisgICAgY29uc3Qgdm9pZCAqaWQ7CisgICAgaW50IGRldmlkOworCisgICAgdm9pZCAqbWlub3JzW0lDRF9EUk1fTUlOT1JfQ09VTlRdOworCisgICAgc3RydWN0IGljZF9kcm1fZGV2aWNlICpuZXh0OworfTsKKworc3RydWN0IGljZF9pbnN0YW5jZTsKKworc3RydWN0IGljZF9kcm1fZGV2aWNlICppY2RfZHJtX2VudW1lcmF0ZShjb25zdCBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlbmRvcl9pZCk7Cit2b2lkIGljZF9kcm1fcmVsZWFzZShjb25zdCBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpY2RfZHJtX2RldmljZSAqZGV2aWNlcyk7CisKK2NvbnN0IGNoYXIgKmljZF9kcm1fZ2V0X2Rldm5vZGUoc3RydWN0IGljZF9kcm1fZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaWNkX2RybV9taW5vcl90eXBlIG1pbm9yKTsKKworI2VuZGlmIC8qIElDRF9FTlVNRVJBVEVfRFJNX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9jb21tb24vaWNkLWZvcm1hdC5jIGIvaWNkL2NvbW1vbi9pY2QtZm9ybWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmZWZjYQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9jb21tb24vaWNkLWZvcm1hdC5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEplcmVteSBIYXllcyA8amVyZW15QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBmb3IgbWVtY3B5ICovCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiCisjaW5jbHVkZSAiaWNkLWZvcm1hdC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGljZF9mb3JtYXRfaW5mbyB7CisgICAgc2l6ZV90IHNpemU7CisgICAgdWludDMyX3QgY2hhbm5lbF9jb3VudDsKK30gaWNkX2Zvcm1hdF90YWJsZVtWS19GT1JNQVRfUkFOR0VfU0laRV0gPSB7CisgICAgW1ZLX0ZPUk1BVF9VTkRFRklORURdICAgICAgICAgICAgPSB7IDAsICAwIH0sCisgICAgW1ZLX0ZPUk1BVF9SNEc0X1VOT1JNX1BBQ0s4XSAgICAgICAgICAgPSB7IDEsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTZdICAgICAgID0geyAyLCAgNCB9LAorICAgIFtWS19GT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2XSAgICAgICA9IHsgMiwgIDQgfSwKKyAgICBbVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTZdICAgICAgICAgPSB7IDIsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2XSAgICAgICAgID0geyAyLCAzIH0sCisgICAgW1ZLX0ZPUk1BVF9SNUc1QjVBMV9VTk9STV9QQUNLMTZdICAgICAgID0geyAyLCAgNCB9LAorICAgIFtWS19GT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2XSAgICAgICA9IHsgMiwgIDQgfSwKKyAgICBbVktfRk9STUFUX0ExUjVHNUI1X1VOT1JNX1BBQ0sxNl0gICAgICAgPSB7IDIsICA0IH0sCisgICAgW1ZLX0ZPUk1BVF9SOF9VTk9STV0gICAgICAgICAgICAgPSB7IDEsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9SOF9TTk9STV0gICAgICAgICAgICAgPSB7IDEsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9SOF9VU0NBTEVEXSAgICAgICAgICAgPSB7IDEsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9SOF9TU0NBTEVEXSAgICAgICAgICAgPSB7IDEsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9SOF9VSU5UXSAgICAgICAgICAgICAgPSB7IDEsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9SOF9TSU5UXSAgICAgICAgICAgICAgPSB7IDEsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9SOF9TUkdCXSAgICAgICAgICAgICAgPSB7IDEsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1VOT1JNXSAgICAgICAgICAgPSB7IDIsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1NOT1JNXSAgICAgICAgICAgPSB7IDIsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1VTQ0FMRURdICAgICAgICAgPSB7IDIsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1NTQ0FMRURdICAgICAgICAgPSB7IDIsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1VJTlRdICAgICAgICAgICAgPSB7IDIsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1NJTlRdICAgICAgICAgICAgPSB7IDIsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1NSR0JdICAgICAgICAgICAgPSB7IDIsICAyIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfVU5PUk1dICAgICAgICAgPSB7IDMsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfU05PUk1dICAgICAgICAgPSB7IDMsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfVVNDQUxFRF0gICAgICAgPSB7IDMsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfU1NDQUxFRF0gICAgICAgPSB7IDMsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfVUlOVF0gICAgICAgICAgPSB7IDMsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfU0lOVF0gICAgICAgICAgPSB7IDMsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfU1JHQl0gICAgICAgICAgPSB7IDMsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhfVU5PUk1dICAgICAgICAgPSB7IDMsIDMgfSwKKyAgICBbVktfRk9STUFUX0I4RzhSOF9TTk9STV0gICAgICAgICA9IHsgMywgMyB9LAorICAgIFtWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRURdICAgICAgID0geyAzLCAzIH0sCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhfU1NDQUxFRF0gICAgICAgPSB7IDMsIDMgfSwKKyAgICBbVktfRk9STUFUX0I4RzhSOF9VSU5UXSAgICAgICAgICA9IHsgMywgMyB9LAorICAgIFtWS19GT1JNQVRfQjhHOFI4X1NJTlRdICAgICAgICAgID0geyAzLCAzIH0sCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhfU1JHQl0gICAgICAgICAgPSB7IDMsIDMgfSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNXSAgICAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1NOT1JNXSAgICAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1VTQ0FMRURdICAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1NTQ0FMRURdICAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1VJTlRdICAgICAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1NJTlRdICAgICAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1NSR0JdICAgICAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNXSAgICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQjhHOFI4QThfU05PUk1dICAgICAgID0geyA0LCA0IH0sCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhBOF9VU0NBTEVEXSAgICAgPSB7IDQsIDQgfSwKKyAgICBbVktfRk9STUFUX0I4RzhSOEE4X1NTQ0FMRURdICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQjhHOFI4QThfVUlOVF0gICAgICAgID0geyA0LCA0IH0sCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhBOF9TSU5UXSAgICAgICAgPSB7IDQsIDQgfSwKKyAgICBbVktfRk9STUFUX0I4RzhSOEE4X1NSR0JdICAgICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfVU5PUk1fUEFDSzMyXSAgICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfU05PUk1fUEFDSzMyXSAgICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfVVNDQUxFRF9QQUNLMzJdICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfU1NDQUxFRF9QQUNLMzJdICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfVUlOVF9QQUNLMzJdICAgICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfU0lOVF9QQUNLMzJdICAgICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfU1JHQl9QQUNLMzJdICAgICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyXSAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQTJSMTBHMTBCMTBfU05PUk1fUEFDSzMyXSAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQTJSMTBHMTBCMTBfVVNDQUxFRF9QQUNLMzJdICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQTJSMTBHMTBCMTBfU1NDQUxFRF9QQUNLMzJdICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQTJSMTBHMTBCMTBfVUlOVF9QQUNLMzJdICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzJdICAgICA9IHsgNCwgNCB9LAorICAgIFtWS19GT1JNQVRfQTJCMTBHMTBSMTBfVU5PUk1fUEFDSzMyXSAgICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMl0gICAgPSB7IDQsICA0IH0sCisgICAgW1ZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMl0gID0geyA0LCAgNCB9LAorICAgIFtWS19GT1JNQVRfQTJCMTBHMTBSMTBfU1NDQUxFRF9QQUNLMzJdICA9IHsgNCwgIDQgfSwKKyAgICBbVktfRk9STUFUX0EyQjEwRzEwUjEwX1VJTlRfUEFDSzMyXSAgICAgPSB7IDQsICA0IH0sCisgICAgW1ZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMl0gICAgID0geyA0LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjE2X1VOT1JNXSAgICAgICAgICAgID0geyAyLCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjE2X1NOT1JNXSAgICAgICAgICAgID0geyAyLCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjE2X1VTQ0FMRURdICAgICAgICAgID0geyAyLCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjE2X1NTQ0FMRURdICAgICAgICAgID0geyAyLCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjE2X1VJTlRdICAgICAgICAgICAgID0geyAyLCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjE2X1NJTlRdICAgICAgICAgICAgID0geyAyLCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjE2X1NGTE9BVF0gICAgICAgICAgID0geyAyLCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1VOT1JNXSAgICAgICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1NOT1JNXSAgICAgICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1VTQ0FMRURdICAgICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1NTQ0FMRURdICAgICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1VJTlRdICAgICAgICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1NJTlRdICAgICAgICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1NGTE9BVF0gICAgICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1VOT1JNXSAgICAgID0geyA2LCAgMyB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNXSAgICAgID0geyA2LCAgMyB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRURdICAgID0geyA2LCAgMyB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1NTQ0FMRURdICAgID0geyA2LCAgMyB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1VJTlRdICAgICAgID0geyA2LCAgMyB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlRdICAgICAgID0geyA2LCAgMyB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVF0gICAgID0geyA2LCAgMyB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNXSAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNXSAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRURdID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NTQ0FMRURdID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlRdICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlRdICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NGTE9BVF0gID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfUjMyX1VJTlRdICAgICAgICAgICAgID0geyA0LCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjMyX1NJTlRdICAgICAgICAgICAgID0geyA0LCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjMyX1NGTE9BVF0gICAgICAgICAgID0geyA0LCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyX1VJTlRdICAgICAgICAgID0geyA4LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyX1NJTlRdICAgICAgICAgID0geyA4LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyX1NGTE9BVF0gICAgICAgID0geyA4LCAgMiB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyX1VJTlRdICAgICAgID0geyAxMiwgMyB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlRdICAgICAgID0geyAxMiwgMyB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVF0gICAgID0geyAxMiwgMyB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlRdICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlRdICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVF0gID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfUjY0X1VJTlRdICAgICAgICAgICAgID0geyA4LCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjY0X1NJTlRdICAgICAgICAgICAgID0geyA4LCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjY0X1NGTE9BVF0gICAgICAgICAgID0geyA4LCAgMSB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0X1VJTlRdICAgICAgICAgID0geyAxNiwgMiB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0X1NJTlRdICAgICAgICAgID0geyAxNiwgMiB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0X1NGTE9BVF0gICAgICAgID0geyAxNiwgMiB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlRdICAgICAgID0geyAyNCwgMyB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0X1NJTlRdICAgICAgID0geyAyNCwgMyB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0X1NGTE9BVF0gICAgID0geyAyNCwgMyB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1VJTlRdICAgID0geyAzMiwgNCB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NJTlRdICAgID0geyAzMiwgNCB9LAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVF0gID0geyAzMiwgNCB9LAorICAgIFtWS19GT1JNQVRfQjEwRzExUjExX1VGTE9BVF9QQUNLMzJdICAgICA9IHsgNCwgIDMgfSwKKyAgICBbVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzJdICAgICAgPSB7IDQsICAzIH0sCisgICAgW1ZLX0ZPUk1BVF9EMTZfVU5PUk1dICAgICAgICAgICAgPSB7IDIsICAxIH0sCisgICAgW1ZLX0ZPUk1BVF9YOF9EMjRfVU5PUk1fUEFDSzMyXSAgICAgICAgID0geyAzLCAgMSB9LAorICAgIFtWS19GT1JNQVRfRDMyX1NGTE9BVF0gICAgICAgICAgID0geyA0LCAgMSB9LAorICAgIFtWS19GT1JNQVRfUzhfVUlOVF0gICAgICAgICAgICAgID0geyAxLCAgMSB9LAorICAgIFtWS19GT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlRdICAgID0geyAzLCAgMiB9LAorICAgIFtWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlRdICAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UXSAgID0geyA0LCAgMiB9LAorICAgIFtWS19GT1JNQVRfQkMxX1JHQl9VTk9STV9CTE9DS10gICAgICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfQkMxX1JHQl9TUkdCX0JMT0NLXSAgICAgICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfQkMxX1JHQkFfVU5PUk1fQkxPQ0tdICAgICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfQkMxX1JHQkFfU1JHQl9CTE9DS10gICAgICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLXSAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0tdICAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkMzX1VOT1JNX0JMT0NLXSAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0tdICAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkM0X1VOT1JNX0JMT0NLXSAgICAgICAgICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfQkM0X1NOT1JNX0JMT0NLXSAgICAgICAgICAgID0geyA4LCAgNCB9LAorICAgIFtWS19GT1JNQVRfQkM1X1VOT1JNX0JMT0NLXSAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkM1X1NOT1JNX0JMT0NLXSAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0tdICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkM2SF9TRkxPQVRfQkxPQ0tdICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkM3X1VOT1JNX0JMT0NLXSAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIFtWS19GT1JNQVRfQkM3X1NSR0JfQkxPQ0tdICAgICAgICAgICAgID0geyAxNiwgNCB9LAorICAgIC8qIFRPRE86IEluaXRpYWxpemUgcmVtYWluaW5nIGNvbXByZXNzZWQgZm9ybWF0cy4gKi8KKyAgICBbVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLXSAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfRVRDMl9SOEc4QjhBMV9VTk9STV9CTE9DS10gID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLXSAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0tdICAgICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfRUFDX1IxMV9TTk9STV9CTE9DS10gICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9FQUNfUjExRzExX1VOT1JNX0JMT0NLXSAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0tdICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ180eDRfVU5PUk1fQkxPQ0tdICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzR4NF9TUkdCX0JMT0NLXSAgICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLXSAgICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DS10gICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzV4NV9VTk9STV9CTE9DS10gICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfNXg1X1NSR0JfQkxPQ0tdICAgICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ182eDVfVU5PUk1fQkxPQ0tdICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzZ4NV9TUkdCX0JMT0NLXSAgICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLXSAgICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DS10gICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzh4NV9VTk9STV9CTE9DS10gICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfOHg1X1NSR0JfQkxPQ0tdICAgICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ184eDZfVU5PUk1fQkxPQ0tdICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzh4Nl9TUkdCX0JMT0NLXSAgICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLXSAgICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DS10gICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEweDVfVU5PUk1fQkxPQ0tdICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLXSAgICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLXSAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEweDZfU1JHQl9CTE9DS10gICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DS10gICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ18xMHg4X1NSR0JfQkxPQ0tdICAgICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEweDEwX1VOT1JNX0JMT0NLXSAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DS10gICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DS10gICAgID0geyAwLCAwIH0sCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0tdICAgICAgPSB7IDAsIDAgfSwKKyAgICBbVktfRk9STUFUX0FTVENfMTJ4MTJfVU5PUk1fQkxPQ0tdICAgICA9IHsgMCwgMCB9LAorICAgIFtWS19GT1JNQVRfQVNUQ18xMngxMl9TUkdCX0JMT0NLXSAgICAgID0geyAwLCAwIH0sCit9OworCitib29sIGljZF9mb3JtYXRfaXNfZHMoVmtGb3JtYXQgZm9ybWF0KQoreworICAgIGJvb2wgaXNfZHMgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfRDE2X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9TOF9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVDoKKyAgICAgICAgaXNfZHMgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfZHM7Cit9CisKK2Jvb2wgaWNkX2Zvcm1hdF9pc19ub3JtKFZrRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBib29sIGlzX25vcm0gPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfUjRHNF9VTk9STV9QQUNLODoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTY6CisgICAgY2FzZSBWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SNUc1QjVBMV9VTk9STV9QQUNLMTY6CisgICAgY2FzZSBWS19GT1JNQVRfQTFSNUc1QjVfVU5PUk1fUEFDSzE2OgorICAgIGNhc2UgVktfRk9STUFUX1I4X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1I4X1NOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhfVU5PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOF9TTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1NOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1NOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX0E4QjhHOFI4X1VOT1JNX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9TTk9STV9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfVU5PUk1fUEFDSzMyOgorICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfVU5PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfU05PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9TTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDM19VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM0X1NOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDNV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM3X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9FQUNfUjExX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfRUFDX1IxMUcxMV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9FQUNfUjExRzExX1NOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg1X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg1X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg4X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4MTBfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMF9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0I1RzZSNV9VTk9STV9QQUNLMTY6CisgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOF9TTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9TTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VTk9STV9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfU05PUk1fUEFDSzMyOgorICAgICAgICBpc19ub3JtID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGlzX25vcm07Cit9OworCitib29sIGljZF9mb3JtYXRfaXNfaW50KFZrRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBib29sIGlzX2ludCA9IGZhbHNlOworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOF9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1I4X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOF9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhfU0lOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfVUlOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfU0lOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfVUlOVF9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfQThCOEc4UjhfU0lOVF9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfVUlOVF9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfU0lOVF9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfQjhHOFI4QThfVUlOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9TSU5UOgorICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1VJTlRfUEFDSzMyOgorICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NJTlRfUEFDSzMyOgorICAgICAgICBpc19pbnQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfaW50OworfQorCitib29sIGljZF9mb3JtYXRfaXNfZmxvYXQoVmtGb3JtYXQgZm9ybWF0KQoreworICAgIGJvb2wgaXNfZmxvYXQgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NGTE9BVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfU0ZMT0FUOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9TRkxPQVQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NGTE9BVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMzJfU0ZMT0FUOgorICAgIGNhc2UgVktfRk9STUFUX1IzMkczMl9TRkxPQVQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0ZMT0FUOgorICAgIGNhc2UgVktfRk9STUFUX1I2NF9TRkxPQVQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjY0RzY0X1NGTE9BVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0ZMT0FUOgorICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TRkxPQVQ6CisgICAgY2FzZSBWS19GT1JNQVRfQjEwRzExUjExX1VGTE9BVF9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzZIX1VGTE9BVF9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzZIX1NGTE9BVF9CTE9DSzoKKyAgICAgICAgaXNfZmxvYXQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfZmxvYXQ7Cit9CisKK2Jvb2wgaWNkX2Zvcm1hdF9pc19zcmdiKFZrRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBib29sIGlzX3NyZ2IgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfUjhfU1JHQjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1NSR0I6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1NSR0I6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfU1JHQjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BOEI4RzhSOF9TUkdCX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCX1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkMzX1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM3X1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NF9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNXg1X1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzZ4Nl9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg1X1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4OF9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4OF9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMngxMl9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOF9TUkdCOgorICAgIGNhc2UgVktfRk9STUFUX0I4RzhSOEE4X1NSR0I6CisgICAgICAgIGlzX3NyZ2IgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfc3JnYjsKK30KKworYm9vbCBpY2RfZm9ybWF0X2lzX2NvbXByZXNzZWQoVmtGb3JtYXQgZm9ybWF0KQoreworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfQkMxX1JHQl9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCX1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDMl9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDM19VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzNfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM0X1NOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDNV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM2SF9TRkxPQVRfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM3X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDN19TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9FQUNfUjExX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfRUFDX1IxMUcxMV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9FQUNfUjExRzExX1NOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNHg0X1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDRfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzV4NV9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfNng1X1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDZfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4NV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzh4NV9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfOHg2X1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDhfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDVfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg1X1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4Nl9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEweDEwX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTBfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworc2l6ZV90IGljZF9mb3JtYXRfZ2V0X3NpemUoVmtGb3JtYXQgZm9ybWF0KQoreworICAgIHJldHVybiBpY2RfZm9ybWF0X3RhYmxlW2Zvcm1hdF0uc2l6ZTsKK30KKwordW5zaWduZWQgaW50IGljZF9mb3JtYXRfZ2V0X2NoYW5uZWxfY291bnQoVmtGb3JtYXQgZm9ybWF0KQoreworICAgIHJldHVybiBpY2RfZm9ybWF0X3RhYmxlW2Zvcm1hdF0uY2hhbm5lbF9jb3VudDsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgcmF3IFJHQkEgY29sb3IgdG8gYSByYXcgdmFsdWUuICBccCB2YWx1ZSBtdXN0IGhhdmUgYXQgbGVhc3QKKyAqIGljZF9mb3JtYXRfZ2V0X3NpemUoZm9ybWF0KSBieXRlcy4KKyAqLwordm9pZCBpY2RfZm9ybWF0X2dldF9yYXdfdmFsdWUoVmtGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY29sb3JbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp2YWx1ZSkKK3sKKyAgICAvKiBhc3N1bWUgbGl0dGxlLWVuZGlhbiAqLworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfVU5ERUZJTkVEOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SNEc0X1VOT1JNX1BBQ0s4OgorICAgICAgICAoKHVpbnQ4X3QgKikgdmFsdWUpWzBdICA9IChjb2xvclswXSAmIDB4ZikgPDwgMCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbMV0gJiAweGYpIDw8IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1I0RzRCNEE0X1VOT1JNX1BBQ0sxNjoKKyAgICAgICAgKCh1aW50MTZfdCAqKSB2YWx1ZSlbMF0gPSAoY29sb3JbMF0gJiAweGYpIDw8IDAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yWzFdICYgMHhmKSA8PCA0ICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclsyXSAmIDB4ZikgPDwgOCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbM10gJiAweGYpIDw8IDEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SNUc2QjVfVU5PUk1fUEFDSzE2OgorICAgICAgICAoKHVpbnQxNl90ICopIHZhbHVlKVswXSA9IChjb2xvclswXSAmIDB4MWYpIDw8IDAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbMV0gJiAweDNmKSA8PCA1ICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yWzJdICYgMHgxZikgPDwgMTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX0I1RzZSNV9VTk9STV9QQUNLMTY6CisgICAgICAgICgodWludDE2X3QgKikgdmFsdWUpWzBdID0gKGNvbG9yWzJdICYgMHgxZikgPDwgMCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclsxXSAmIDB4M2YpIDw8IDUgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbMF0gJiAweDFmKSA8PCAxMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2OgorICAgICAgICAoKHVpbnQxNl90ICopIHZhbHVlKVswXSA9IChjb2xvclswXSAmIDB4MWYpIDw8IDAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbMV0gJiAweDFmKSA8PCA1ICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yWzJdICYgMHgxZikgPDwgMTAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclszXSAmIDB4MSkgIDw8IDE1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOF9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOF9TTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOF9VU0NBTEVEOgorICAgIGNhc2UgVktfRk9STUFUX1I4X1NTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhfVUlOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOF9TSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1I4X1NSR0I6CisgICAgICAgICgodWludDhfdCAqKSB2YWx1ZSlbMF0gID0gKHVpbnQ4X3QpIGNvbG9yWzBdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhfU05PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOF9VU0NBTEVEOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhfU1NDQUxFRDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOF9TSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhfU1JHQjoKKyAgICAgICAgKCh1aW50OF90ICopIHZhbHVlKVswXSAgPSAodWludDhfdCkgY29sb3JbMF07CisgICAgICAgICgodWludDhfdCAqKSB2YWx1ZSlbMV0gID0gKHVpbnQ4X3QpIGNvbG9yWzFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9TTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9VU0NBTEVEOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1NTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4QThfVUlOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhBOF9TSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOEE4X1NSR0I6CisgICAgICAgICgodWludDhfdCAqKSB2YWx1ZSlbMF0gID0gKHVpbnQ4X3QpIGNvbG9yWzBdOworICAgICAgICAoKHVpbnQ4X3QgKikgdmFsdWUpWzFdICA9ICh1aW50OF90KSBjb2xvclsxXTsKKyAgICAgICAgKCh1aW50OF90ICopIHZhbHVlKVsyXSAgPSAodWludDhfdCkgY29sb3JbMl07CisgICAgICAgICgodWludDhfdCAqKSB2YWx1ZSlbM10gID0gKHVpbnQ4X3QpIGNvbG9yWzNdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9COEc4UjhBOF9TUkdCOgorICAgICAgICAoKHVpbnQ4X3QgKikgdmFsdWUpWzBdICA9ICh1aW50OF90KSBjb2xvclsyXTsKKyAgICAgICAgKCh1aW50OF90ICopIHZhbHVlKVsxXSAgPSAodWludDhfdCkgY29sb3JbMV07CisgICAgICAgICgodWludDhfdCAqKSB2YWx1ZSlbMl0gID0gKHVpbnQ4X3QpIGNvbG9yWzBdOworICAgICAgICAoKHVpbnQ4X3QgKikgdmFsdWUpWzNdICA9ICh1aW50OF90KSBjb2xvclszXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfQjEwRzExUjExX1VGTE9BVF9QQUNLMzI6CisgICAgICAgICgodWludDMyX3QgKikgdmFsdWUpWzBdID0gKGNvbG9yWzBdICYgMHg3ZmYpIDw8IDAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbMV0gJiAweDdmZikgPDwgMTEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclsyXSAmIDB4M2ZmKSA8PCAyMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfQTJCMTBHMTBSMTBfVU5PUk1fUEFDSzMyOgorICAgIGNhc2UgVktfRk9STUFUX0EyQjEwRzEwUjEwX1NOT1JNX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TU0NBTEVEX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VSU5UX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMjoKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMF0gPSAoY29sb3JbMF0gJiAweDNmZikgPDwgMCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclsxXSAmIDB4M2ZmKSA8PCAxMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yWzJdICYgMHgzZmYpIDw8IDIwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbM10gJiAweDMpICAgPDwgMzA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1IxNl9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfU05PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1VTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2X1NGTE9BVDoKKyAgICAgICAgKCh1aW50MTZfdCAqKSB2YWx1ZSlbMF0gPSAodWludDE2X3QpIGNvbG9yWzBdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZfVU5PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2X1NOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9VU0NBTEVEOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9TU0NBTEVEOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9TSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNl9TRkxPQVQ6CisgICAgICAgICgodWludDE2X3QgKikgdmFsdWUpWzBdID0gKHVpbnQxNl90KSBjb2xvclswXTsKKyAgICAgICAgKCh1aW50MTZfdCAqKSB2YWx1ZSlbMV0gPSAodWludDE2X3QpIGNvbG9yWzFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNkExNl9VU0NBTEVEOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNkExNl9TU0NBTEVEOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UOgorICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNkExNl9TRkxPQVQ6CisgICAgICAgICgodWludDE2X3QgKikgdmFsdWUpWzBdID0gKHVpbnQxNl90KSBjb2xvclswXTsKKyAgICAgICAgKCh1aW50MTZfdCAqKSB2YWx1ZSlbMV0gPSAodWludDE2X3QpIGNvbG9yWzFdOworICAgICAgICAoKHVpbnQxNl90ICopIHZhbHVlKVsyXSA9ICh1aW50MTZfdCkgY29sb3JbMl07CisgICAgICAgICgodWludDE2X3QgKikgdmFsdWUpWzNdID0gKHVpbnQxNl90KSBjb2xvclszXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfUjMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyX1NGTE9BVDoKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMF0gPSBjb2xvclswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyX1NGTE9BVDoKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMF0gPSBjb2xvclswXTsKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMV0gPSBjb2xvclsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyX1NGTE9BVDoKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMF0gPSBjb2xvclswXTsKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMV0gPSBjb2xvclsxXTsKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMl0gPSBjb2xvclsyXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVDoKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMF0gPSBjb2xvclswXTsKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMV0gPSBjb2xvclsxXTsKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMl0gPSBjb2xvclsyXTsKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbM10gPSBjb2xvclszXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlQ6CisgICAgICAgICgodWludDE2X3QgKikgdmFsdWUpWzBdID0gKHVpbnQxNl90KSBjb2xvclswXTsKKyAgICAgICAgKChjaGFyICopIHZhbHVlKVsyXSA9ICh1aW50OF90KSBjb2xvclsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOgorICAgICAgICAoKHVpbnQzMl90ICopIHZhbHVlKVswXSA9ICh1aW50MzJfdCkgY29sb3JbMF07CisgICAgICAgICgoY2hhciAqKSB2YWx1ZSlbNF0gPSAodWludDhfdCkgY29sb3JbMV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX0U1QjlHOVI5X1VGTE9BVF9QQUNLMzI6CisgICAgICAgICgodWludDMyX3QgKikgdmFsdWUpWzBdID0gKGNvbG9yWzBdICYgMHgxZmYpIDw8IDAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbMV0gJiAweDFmZikgPDwgOSAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclsyXSAmIDB4MWZmKSA8PCAxOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yWzNdICYgMHgxZikgIDw8IDI3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDMV9SR0JfU1JHQl9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCQV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzFfUkdCQV9TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDNF9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzRfU05PUk1fQkxPQ0s6CisgICAgICAgIG1lbWNweSh2YWx1ZSwgY29sb3IsIDgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzJfVU5PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkMzX1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDM19TUkdCX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDNV9VTk9STV9CTE9DSzoKKyAgICBjYXNlIFZLX0ZPUk1BVF9CQzVfU05PUk1fQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM2SF9VRkxPQVRfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM2SF9TRkxPQVRfQkxPQ0s6CisgICAgY2FzZSBWS19GT1JNQVRfQkM3X1VOT1JNX0JMT0NLOgorICAgIGNhc2UgVktfRk9STUFUX0JDN19TUkdCX0JMT0NLOgorICAgICAgICBtZW1jcHkodmFsdWUsIGNvbG9yLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1I4RzhCOF9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SOEc4QjhfU05PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1VTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1NTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjhHOEI4X1NSR0I6CisgICAgICAgICgodWludDhfdCAqKSB2YWx1ZSlbMF0gID0gKHVpbnQ4X3QpIGNvbG9yWzBdOworICAgICAgICAoKHVpbnQ4X3QgKikgdmFsdWUpWzFdICA9ICh1aW50OF90KSBjb2xvclsxXTsKKyAgICAgICAgKCh1aW50OF90ICopIHZhbHVlKVsyXSAgPSAodWludDhfdCkgY29sb3JbMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1IxNkcxNkIxNl9VTk9STToKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZHMTZCMTZfU05PUk06CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1NTQ0FMRUQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1VJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlQ6CisgICAgY2FzZSBWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVDoKKyAgICAgICAgKCh1aW50MTZfdCAqKSB2YWx1ZSlbMF0gPSAodWludDE2X3QpIGNvbG9yWzBdOworICAgICAgICAoKHVpbnQxNl90ICopIHZhbHVlKVsxXSA9ICh1aW50MTZfdCkgY29sb3JbMV07CisgICAgICAgICgodWludDE2X3QgKikgdmFsdWUpWzJdID0gKHVpbnQxNl90KSBjb2xvclsyXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfQTJSMTBHMTBCMTBfVU5PUk1fUEFDSzMyOgorICAgIGNhc2UgVktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VU0NBTEVEX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TU0NBTEVEX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VSU5UX1BBQ0szMjoKKyAgICBjYXNlIFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9TSU5UX1BBQ0szMjoKKyAgICAgICAgKCh1aW50MzJfdCAqKSB2YWx1ZSlbMF0gPSAoY29sb3JbMl0gJiAweDNmZikgPDwgMCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclsxXSAmIDB4M2ZmKSA8PCAxMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yWzBdICYgMHgzZmYpIDw8IDIwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbM10gJiAweDMpICAgPDwgMzA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1I2NF9TRkxPQVQ6CisgICAgICAgIC8qIGhpZ2hlciAzMiBiaXRzIGFsd2F5cyAwICovCisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzBdID0gY29sb3JbMF07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NF9TRkxPQVQ6CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzBdID0gY29sb3JbMF07CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzFdID0gY29sb3JbMV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NEI2NF9TRkxPQVQ6CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzBdID0gY29sb3JbMF07CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzFdID0gY29sb3JbMV07CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzJdID0gY29sb3JbMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TRkxPQVQ6CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzBdID0gY29sb3JbMF07CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzFdID0gY29sb3JbMV07CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzJdID0gY29sb3JbMl07CisgICAgICAgICgodWludDY0X3QgKikgdmFsdWUpWzNdID0gY29sb3JbM107CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCghInVua25vd24gZm9ybWF0Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9jb21tb24vaWNkLWZvcm1hdC5oIGIvaWNkL2NvbW1vbi9pY2QtZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2ZGU2MAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9jb21tb24vaWNkLWZvcm1hdC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBJQ0RfRk9STUFUX0gKKyNkZWZpbmUgSUNEX0ZPUk1BVF9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSAiaWNkLmgiCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpY2RfZm9ybWF0X2lzX3VuZGVmKFZrRm9ybWF0IGZvcm1hdCkKK3sKKyAgICByZXR1cm4gKGZvcm1hdCA9PSBWS19GT1JNQVRfVU5ERUZJTkVEKTsKK30KKworYm9vbCBpY2RfZm9ybWF0X2lzX2RzKFZrRm9ybWF0IGZvcm1hdCk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpY2RfZm9ybWF0X2lzX2NvbG9yKFZrRm9ybWF0IGZvcm1hdCkKK3sKKyAgICByZXR1cm4gIShpY2RfZm9ybWF0X2lzX3VuZGVmKGZvcm1hdCkgfHwgaWNkX2Zvcm1hdF9pc19kcyhmb3JtYXQpKTsKK30KKworYm9vbCBpY2RfZm9ybWF0X2lzX25vcm0oVmtGb3JtYXQgZm9ybWF0KTsKKworYm9vbCBpY2RfZm9ybWF0X2lzX2ludChWa0Zvcm1hdCBmb3JtYXQpOworCitib29sIGljZF9mb3JtYXRfaXNfZmxvYXQoVmtGb3JtYXQgZm9ybWF0KTsKKworYm9vbCBpY2RfZm9ybWF0X2lzX3NyZ2IoVmtGb3JtYXQgZm9ybWF0KTsKKworYm9vbCBpY2RfZm9ybWF0X2lzX2NvbXByZXNzZWQoVmtGb3JtYXQgZm9ybWF0KTsKKworc3RhdGljIGlubGluZSBpbnQgaWNkX2Zvcm1hdF9nZXRfYmxvY2tfd2lkdGgoVmtGb3JtYXQgZm9ybWF0KQoreworICAgIC8qIGFsbCBjb21wcmVzc2VkIGZvcm1hdHMgdXNlIDR4NCBibG9ja3MgKi8KKyAgICByZXR1cm4gKGljZF9mb3JtYXRfaXNfY29tcHJlc3NlZChmb3JtYXQpKSA/IDQgOiAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaWNkX2JsZW5kX21vZGVfaXNfZHVhbF9zcmMoVmtCbGVuZEZhY3RvciBtb2RlKQoreworICAgIHJldHVybiAobW9kZSA9PSBWS19CTEVORF9GQUNUT1JfU1JDMV9DT0xPUikgfHwKKyAgICAgICAgICAgKG1vZGUgPT0gVktfQkxFTkRfRkFDVE9SX1NSQzFfQUxQSEEpIHx8CisgICAgICAgICAgIChtb2RlID09IFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9DT0xPUikgfHwKKyAgICAgICAgICAgKG1vZGUgPT0gVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0FMUEhBKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGljZF9waXBlbGluZV9jYl9hdHRfbmVlZHNfZHVhbF9zb3VyY2VfYmxlbmRpbmcoY29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgKmF0dCkKK3sKKyAgICBpZiAoaWNkX2JsZW5kX21vZGVfaXNfZHVhbF9zcmMoYXR0LT5zcmNDb2xvckJsZW5kRmFjdG9yKSB8fAorICAgICAgICBpY2RfYmxlbmRfbW9kZV9pc19kdWFsX3NyYyhhdHQtPnNyY0FscGhhQmxlbmRGYWN0b3IpIHx8CisgICAgICAgIGljZF9ibGVuZF9tb2RlX2lzX2R1YWxfc3JjKGF0dC0+ZHN0Q29sb3JCbGVuZEZhY3RvcikgfHwKKyAgICAgICAgaWNkX2JsZW5kX21vZGVfaXNfZHVhbF9zcmMoYXR0LT5kc3RBbHBoYUJsZW5kRmFjdG9yKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzaXplX3QgaWNkX2Zvcm1hdF9nZXRfc2l6ZShWa0Zvcm1hdCBmb3JtYXQpOworCit1bnNpZ25lZCBpbnQgaWNkX2Zvcm1hdF9nZXRfY2hhbm5lbF9jb3VudChWa0Zvcm1hdCBmb3JtYXQpOworCit2b2lkIGljZF9mb3JtYXRfZ2V0X3Jhd192YWx1ZShWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjb2xvcls0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKTsKKworI2VuZGlmIC8qIElDRF9GT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2NvbW1vbi9pY2QtaW5zdGFuY2UuYyBiL2ljZC9jb21tb24vaWNkLWluc3RhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzMDg4MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9jb21tb24vaWNkLWluc3RhbmNlLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2RlZmluZSBfSVNPQzExX1NPVVJDRSAvKiBmb3IgYWxpZ25lZF9hbGxvYygpICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJpY2QtaW5zdGFuY2UuaCIKKworc3RhdGljIFZLQVBJX0FUVFIgdm9pZCAqIFZLQVBJX0NBTEwgZGVmYXVsdF9hbGxvYyh2b2lkICp1c2VyX2RhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBhbGxvY2F0aW9uU2NvcGUpCit7CisgICAgaWYgKGFsaWdubWVudCA8PSAxKSB7CisgICAgICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7CisgICAgfSBlbHNlIGlmICh1X2lzX3BvdzIoKHVuc2lnbmVkIGludCkgYWxpZ25tZW50KSkgeworICAgICAgICBpZiAoYWxpZ25tZW50IDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgICAgIGFzc2VydCh1X2lzX3BvdzIoc2l6ZW9mKHZvaWQqKSkpOworICAgICAgICAgICAgYWxpZ25tZW50ID0gc2l6ZW9mKHZvaWQgKik7CisgICAgICAgIH0KKworICAgICAgICBzaXplID0gKHNpemUgKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSk7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAgICAgcmV0dXJuIF9hbGlnbmVkX21hbGxvYyhhbGlnbm1lbnQsIHNpemUpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIGFsaWduZWRfYWxsb2MoYWxpZ25tZW50LCBzaXplKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgZGVmYXVsdF9mcmVlKHZvaWQgKnVzZXJfZGF0YSwgdm9pZCAqcHRyKQoreworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgIF9hbGlnbmVkX2ZyZWUocHRyKTsKKyNlbHNlCisgICAgZnJlZShwdHIpOworI2VuZGlmCit9CisKK3N0cnVjdCBpY2RfaW5zdGFuY2UgKmljZF9pbnN0YW5jZV9jcmVhdGUoY29uc3QgVmtBcHBsaWNhdGlvbkluZm8gKmFwcF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKmFsbG9jX2NiKQoreworICAgIHN0YXRpYyBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgZGVmYXVsdF9hbGxvY19jYiA9IHsKKyAgICAgICAgLnBmbkFsbG9jYXRpb24gPSBkZWZhdWx0X2FsbG9jLAorICAgICAgICAucGZuRnJlZSA9IGRlZmF1bHRfZnJlZSwKKyAgICB9OworICAgIHN0cnVjdCBpY2RfaW5zdGFuY2UgKmluc3RhbmNlOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgc2l6ZV90IGxlbjsKKworICAgIGlmICghYWxsb2NfY2IpCisgICAgICAgIGFsbG9jX2NiID0gJmRlZmF1bHRfYWxsb2NfY2I7CisKKyAgICBpbnN0YW5jZSA9IGFsbG9jX2NiLT5wZm5BbGxvY2F0aW9uKGFsbG9jX2NiLT5wVXNlckRhdGEsIHNpemVvZigqaW5zdGFuY2UpLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICBpZiAoIWluc3RhbmNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1lbXNldChpbnN0YW5jZSwgMCwgc2l6ZW9mKCppbnN0YW5jZSkpOworCisgICAgbmFtZSA9IChhcHBfaW5mbyAmJiBhcHBfaW5mby0+cEFwcGxpY2F0aW9uTmFtZSkgPyBhcHBfaW5mby0+cEFwcGxpY2F0aW9uTmFtZSA6ICJ1bm5hbWVkIjsKKyAgICBsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgaW5zdGFuY2UtPm5hbWUgPSBhbGxvY19jYi0+cGZuQWxsb2NhdGlvbihhbGxvY19jYi0+cFVzZXJEYXRhLCBsZW4gKyAxLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0lOU1RBTkNFKTsKKyAgICBpZiAoIWluc3RhbmNlLT5uYW1lKSB7CisgICAgICAgIGFsbG9jX2NiLT5wZm5GcmVlKGFsbG9jX2NiLT5wVXNlckRhdGEsIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtY3B5KGluc3RhbmNlLT5uYW1lLCBuYW1lLCBsZW4pOworICAgIGluc3RhbmNlLT5uYW1lW2xlbl0gPSAnXDAnOworCisgICAgaW5zdGFuY2UtPmFsbG9jX2NiID0gKmFsbG9jX2NiOworCisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCit2b2lkIGljZF9pbnN0YW5jZV9kZXN0cm95KHN0cnVjdCBpY2RfaW5zdGFuY2UgKmluc3RhbmNlKQoreworICAgIHN0cnVjdCBpY2RfaW5zdGFuY2VfbG9nZ2VyICpsb2dnZXI7CisKKyAgICBmb3IgKGxvZ2dlciA9IGluc3RhbmNlLT5sb2dnZXJzOyBsb2dnZXI7ICkgeworICAgICAgICBzdHJ1Y3QgaWNkX2luc3RhbmNlX2xvZ2dlciAqbmV4dCA9IGxvZ2dlci0+bmV4dDsKKworICAgICAgICBpY2RfaW5zdGFuY2VfZnJlZShpbnN0YW5jZSwgbG9nZ2VyKTsKKyAgICAgICAgbG9nZ2VyID0gbmV4dDsKKyAgICB9CisKKyAgICBpY2RfaW5zdGFuY2VfZnJlZShpbnN0YW5jZSwgaW5zdGFuY2UtPm5hbWUpOworICAgIGljZF9pbnN0YW5jZV9mcmVlKGluc3RhbmNlLCBpbnN0YW5jZSk7Cit9CisKK1ZrUmVzdWx0IGljZF9pbnN0YW5jZV9jcmVhdGVfbG9nZ2VyKAorICAgICAgICBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCAqcENyZWF0ZUluZm8sCisgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwKKyAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUICptc2dfb2JqKQoreworICAgIHN0cnVjdCBpY2RfaW5zdGFuY2VfbG9nZ2VyICpsb2dnZXI7CisKKyAgICAvKiBUT0RPVlY6IE1vdmUgdGhpcyB0ZXN0IHRvIGEgdmFsaWRhdGlvbiBsYXllciAqLworLy8gICAgaWYgKG1zZ19vYmogPT0gTlVMTCkgeworLy8gICAgICAgIHJldHVybiBWS19FUlJPUl9JTlZBTElEX1BPSU5URVI7CisvLyAgICB9CisKKyAgICBsb2dnZXIgPSBpY2RfaW5zdGFuY2VfYWxsb2MoaW5zdGFuY2UsIHNpemVvZigqbG9nZ2VyKSwgc2l6ZW9mKGludCksCisgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghbG9nZ2VyKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgbG9nZ2VyLT5mdW5jID0gcENyZWF0ZUluZm8tPnBmbkNhbGxiYWNrOworICAgIGxvZ2dlci0+ZmxhZ3MgPSBwQ3JlYXRlSW5mby0+ZmxhZ3M7CisgICAgbG9nZ2VyLT5uZXh0ID0gaW5zdGFuY2UtPmxvZ2dlcnM7CisgICAgaW5zdGFuY2UtPmxvZ2dlcnMgPSBsb2dnZXI7CisKKyAgICBsb2dnZXItPnVzZXJfZGF0YSA9IHBDcmVhdGVJbmZvLT5wVXNlckRhdGE7CisKKyAgICAqKCBzdHJ1Y3QgaWNkX2luc3RhbmNlX2xvZ2dlciAqKiltc2dfb2JqID0gbG9nZ2VyOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaWNkX2luc3RhbmNlX2Rlc3Ryb3lfbG9nZ2VyKAorICAgICAgICBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIG1zZ19vYmosCisgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikKK3sKKyAgICBzdHJ1Y3QgaWNkX2luc3RhbmNlX2xvZ2dlciAqbG9nZ2VyLCAqcHJldjsKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgbG9jYWxfbXNnX29iaiA9IG1zZ19vYmo7CisKKyAgICBmb3IgKHByZXYgPSBOVUxMLCBsb2dnZXIgPSBpbnN0YW5jZS0+bG9nZ2VyczsgbG9nZ2VyOworICAgICAgICAgcHJldiA9IGxvZ2dlciwgbG9nZ2VyID0gbG9nZ2VyLT5uZXh0KSB7CisgICAgICAgIGlmIChsb2dnZXIgPT0gKihzdHJ1Y3QgaWNkX2luc3RhbmNlX2xvZ2dlciAqKikgJmxvY2FsX21zZ19vYmopCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBUT0RPVlY6IE1vdmUgdGhpcyB0byB2YWxpZGF0aW9uIGxheWVyICovCisvLyAgICBpZiAoIWxvZ2dlcikKKy8vICAgICAgICByZXR1cm4gVktfRVJST1JfSU5WQUxJRF9QT0lOVEVSOworCisgICAgaWYgKHByZXYpCisgICAgICAgIHByZXYtPm5leHQgPSBsb2dnZXItPm5leHQ7CisgICAgZWxzZQorICAgICAgICBpbnN0YW5jZS0+bG9nZ2VycyA9IGxvZ2dlci0+bmV4dDsKKworICAgIGljZF9pbnN0YW5jZV9mcmVlKGluc3RhbmNlLCBsb2dnZXIpOworfQorCit2b2lkIGljZF9pbnN0YW5jZV9sb2coY29uc3Qgc3RydWN0IGljZF9pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgVmtGbGFncyBtc2dfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc3JjX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptc2cpCit7CisgICAgY29uc3Qgc3RydWN0IGljZF9pbnN0YW5jZV9sb2dnZXIgKmxvZ2dlcjsKKworICAgIGlmICghaW5zdGFuY2UtPmxvZ2dlcnMpIHsKKyAgICAgICAgZnB1dHMobXNnLCBzdGRlcnIpOworICAgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChsb2dnZXIgPSBpbnN0YW5jZS0+bG9nZ2VyczsgbG9nZ2VyOyBsb2dnZXIgPSBsb2dnZXItPm5leHQpIHsKKyAgICAgICAgaWYgKG1zZ19mbGFncyAmIGxvZ2dlci0+ZmxhZ3MpIHsKKyAgICAgICAgICAgIGxvZ2dlci0+ZnVuYyhtc2dfZmxhZ3MsIG9ial90eXBlLCAodWludDY0X3Qpc3JjX29iamVjdCwgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX2NvZGUsIGluc3RhbmNlLT5uYW1lLCBtc2csIGxvZ2dlci0+dXNlcl9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9jb21tb24vaWNkLWluc3RhbmNlLmggYi9pY2QvY29tbW9uL2ljZC1pbnN0YW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWU5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvY29tbW9uL2ljZC1pbnN0YW5jZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBJQ0RfSU5TVEFOQ0VfSAorI2RlZmluZSBJQ0RfSU5TVEFOQ0VfSAorCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiCisjaW5jbHVkZSAiaWNkLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGljZF9pbnN0YW5jZV9sb2dnZXIgeworICAgIFBGTl92a0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgZnVuYzsKKyAgICB2b2lkICp1c2VyX2RhdGE7CisgICAgVmtGbGFncyBmbGFnczsKKworICAgIHN0cnVjdCBpY2RfaW5zdGFuY2VfbG9nZ2VyICpuZXh0OworfTsKKworc3RydWN0IGljZF9pbnN0YW5jZSB7CisgICAgY2hhciAqbmFtZTsKKworICAgIFZrQWxsb2NhdGlvbkNhbGxiYWNrcyBhbGxvY19jYjsKKworICAgIHN0cnVjdCBpY2RfaW5zdGFuY2VfbG9nZ2VyICpsb2dnZXJzOworfTsKKworc3RydWN0IGljZF9pbnN0YW5jZSAqaWNkX2luc3RhbmNlX2NyZWF0ZShjb25zdCBWa0FwcGxpY2F0aW9uSW5mbyAqYXBwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqYWxsb2NfY2IpOwordm9pZCBpY2RfaW5zdGFuY2VfZGVzdHJveShzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaWNkX2luc3RhbmNlX2FsbG9jKGNvbnN0IHN0cnVjdCBpY2RfaW5zdGFuY2UgKmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBzY29wZSkKK3sKKyAgICByZXR1cm4gaW5zdGFuY2UtPmFsbG9jX2NiLnBmbkFsbG9jYXRpb24oaW5zdGFuY2UtPmFsbG9jX2NiLnBVc2VyRGF0YSwKKyAgICAgICAgICAgIHNpemUsIGFsaWdubWVudCwgc2NvcGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWNkX2luc3RhbmNlX2ZyZWUoY29uc3Qgc3RydWN0IGljZF9pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyKQoreworICAgIGluc3RhbmNlLT5hbGxvY19jYi5wZm5GcmVlKGluc3RhbmNlLT5hbGxvY19jYi5wVXNlckRhdGEsIHB0cik7Cit9CisKK1ZrUmVzdWx0IGljZF9pbnN0YW5jZV9jcmVhdGVfbG9nZ2VyKHN0cnVjdCBpY2RfaW5zdGFuY2UgKmluc3RhbmNlLAorICAgICAgICBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUICpwQ3JlYXRlSW5mbywKKyAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yLAorICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgKm1zZ19vYmopOworCit2b2lkIGljZF9pbnN0YW5jZV9kZXN0cm95X2xvZ2dlcihzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgICAgY29uc3QgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIG1zZ19vYmosIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcik7CisKK3ZvaWQgaWNkX2luc3RhbmNlX2xvZyhjb25zdCBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBWa0ZsYWdzIG1zZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmpfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzcmNfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptc2cpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogSUNEX0lOU1RBTkNFX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9jb21tb24vaWNkLXNwdi5oIGIvaWNkL2NvbW1vbi9pY2Qtc3B2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2NTI4NAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9jb21tb24vaWNkLXNwdi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjb2R5QGx1bmFyZy5jb20+CisgKi8KKworI2lmbmRlZiBJQ0RfU1BWX0gKKyNkZWZpbmUgSUNEX1NQVl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBJQ0RfU1BWX01BR0lDICAgMHgwNzIzMDIwMworI2RlZmluZSBJQ0RfU1BWX1ZFUlNJT04gOTkKKworc3RydWN0IGljZF9zcHZfaGVhZGVyIHsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgIHVpbnQzMl90IGdlbl9tYWdpYzsgIC8vIEdlbmVyYXRvcidzIG1hZ2ljIG51bWJlcgorfTsKKworI2VuZGlmIC8qIElDRF9TUFZfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2NvbW1vbi9pY2QtdXRpbHMuYyBiL2ljZC9jb21tb24vaWNkLXV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0YjZiNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9jb21tb24vaWNkLXV0aWxzLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiCisKKy8qIHN0b2xlbiBmcm9tIE1lc2EgKi8KK3VpbnQxNl90IHVfZmxvYXRfdG9faGFsZihmbG9hdCBmKQoreworICAgIHVuaW9uIGZpIHsKKyAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgdWludDMyX3QgdWk7CisgICAgfTsKKworICAgdWludDMyX3Qgc2lnbl9tYXNrICA9IDB4ODAwMDAwMDA7CisgICB1aW50MzJfdCByb3VuZF9tYXNrID0gfjB4ZmZmOworICAgdWludDMyX3QgZjMyaW5mID0gMHhmZiA8PCAyMzsKKyAgIHVpbnQzMl90IGYxNmluZiA9IDB4MWYgPDwgMjM7CisgICB1aW50MzJfdCBzaWduOworICAgdW5pb24gZmkgbWFnaWM7CisgICB1bmlvbiBmaSBmMzI7CisgICB1aW50MTZfdCBmMTY7CisKKyAgIG1hZ2ljLnVpID0gMHhmIDw8IDIzOworCisgICBmMzIuZiA9IGY7CisKKyAgIC8qIFNpZ24gKi8KKyAgIHNpZ24gPSBmMzIudWkgJiBzaWduX21hc2s7CisgICBmMzIudWkgXj0gc2lnbjsKKworICAgaWYgKGYzMi51aSA9PSBmMzJpbmYpIHsKKyAgICAgIC8qIEluZiAqLworICAgICAgZjE2ID0gMHg3YzAwOworICAgfSBlbHNlIGlmIChmMzIudWkgPiBmMzJpbmYpIHsKKyAgICAgIC8qIE5hTiAqLworICAgICAgZjE2ID0gMHg3ZTAwOworICAgfSBlbHNlIHsKKyAgICAgIC8qIE51bWJlciAqLworICAgICAgZjMyLnVpICY9IHJvdW5kX21hc2s7CisgICAgICBmMzIuZiAgKj0gbWFnaWMuZjsKKyAgICAgIGYzMi51aSAtPSByb3VuZF9tYXNrOworCisgICAgICAvKgorICAgICAgICogQ2xhbXAgdG8gbWF4IGZpbml0ZSB2YWx1ZSBpZiBvdmVyZmxvd2VkLgorICAgICAgICogT3BlbkdMIGhhcyBjb21wbGV0ZWx5IHVuZGVmaW5lZCByb3VuZGluZyBiZWhhdmlvciBmb3IgZmxvYXQgdG8KKyAgICAgICAqIGhhbGYtZmxvYXQgY29udmVyc2lvbnMsIGFuZCB0aGlzIG1hdGNoZXMgd2hhdCBpcyBtYW5kYXRlZCBmb3IgZmxvYXQKKyAgICAgICAqIHRvIGZwMTEvZnAxMCwgd2hpY2ggcmVjb21tZW5kIHJvdW5kLXRvLW5lYXJlc3QtZmluaXRlIHRvby4KKyAgICAgICAqIChkM2QxMCBpcyBkZWVwbHkgdW5oYXBweSBhYm91dCBmbHVzaGluZyBzdWNoIHZhbHVlcyB0byBpbmZpbml0eSwgYW5kCisgICAgICAgKiB3aGlsZSBpdCBhbHNvIG1hbmRhdGVzIHJvdW5kLXRvLXplcm8gaXQgZG9lc24ndCBjYXJlIG5lYXJseSBhcyBtdWNoCisgICAgICAgKiBhYm91dCB0aGF0LikKKyAgICAgICAqLworICAgICAgaWYgKGYzMi51aSA+IGYxNmluZikKKyAgICAgICAgIGYzMi51aSA9IGYxNmluZiAtIDE7CisKKyAgICAgIGYxNiA9IGYzMi51aSA+PiAxMzsKKyAgIH0KKworICAgLyogU2lnbiAqLworICAgZjE2IHw9IHNpZ24gPj4gMTY7CisKKyAgIHJldHVybiBmMTY7Cit9CmRpZmYgLS1naXQgYS9pY2QvY29tbW9uL2ljZC11dGlscy5oIGIvaWNkL2NvbW1vbi9pY2QtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM5MjNhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2NvbW1vbi9pY2QtdXRpbHMuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBEYXZpZCBQaW5lZG8gPGRhdmlkQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpZm5kZWYgSUNEX1VUSUxTX0gKKyNkZWZpbmUgSUNEX1VUSUxTX0gKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorI2luY2x1ZGUgPHN0cmluZ3MuaD4gLyogZm9yIGZmcygpICovCisjZW5kaWYKKyNpbmNsdWRlICJpY2QuaCIKKworI2lmIGRlZmluZWQoTkRFQlVHKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBVX0FTU0VSVF9PTkxZIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBVX0FTU0VSVF9PTkxZCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIGxpa2VseSh4KSAgIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisjZGVmaW5lIHVubGlrZWx5KHgpIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApCisjZWxzZQorI2RlZmluZSBsaWtlbHkoeCkgICAoeCkKKyNkZWZpbmUgdW5saWtlbHkoeCkgKHgpCisjZW5kaWYKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisKKyNkZWZpbmUgdV9wb3Bjb3VudCh1KSBfX2J1aWx0aW5fcG9wY291bnQodSkKKyNkZWZpbmUgdV9wb3Bjb3VudGxsKHUpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKHUpCisKKyNkZWZpbmUgU1RBVElDX0FTU0VSVChleHByKSBkbyB7ICAgICAgICAgICAgXAorICAgICh2b2lkKSBzaXplb2YoY2hhclsxIC0gMiAqICEoZXhwcildKTsgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFVfQ0xBTVAodmFsLCBtaW4sIG1heCkgXAorICAgICgodmFsKSA8IChtaW4pID8gKG1pbikgOiAodmFsKSA+IChtYXgpPyAobWF4KSA6ICh2YWwpKQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIHZhbCBpcyBwb3dlciBvZiB0d28sIG9yIHplcm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCB1X2lzX3BvdzIodW5zaWduZWQgaW50IHZhbCkKK3sKKyAgICByZXR1cm4gKCh2YWwgJiAodmFsIC0gMSkpID09IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCB1X2ZmcyhpbnQgdmFsKQoreworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisJcmV0dXJuIGZmcyh2YWwpOworI2Vsc2UKKwlyZXR1cm4gX19semNudCh2YWwpICsgMTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1X2FsaWduKHVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGFsaWdubWVudCkKK3sKKyAgICBhc3NlcnQoYWxpZ25tZW50ICYmIHVfaXNfcG93MihhbGlnbm1lbnQpKTsKKyAgICByZXR1cm4gKHZhbCArIGFsaWdubWVudCAtIDEpICYgfihhbGlnbm1lbnQgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdV9taW5pZnkodW5zaWduZWQgaW50IHZhbCwgdW5zaWduZWQgbGV2ZWwpCit7CisgICAgcmV0dXJuICh2YWwgPj4gbGV2ZWwpID8gdmFsID4+IGxldmVsIDogMTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCB1X2Z1aShmbG9hdCBmKQoreworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgdWludDMyX3QgdWk7CisgICAgfSB1ID0geyAuZiA9IGYgfTsKKworICAgIHJldHVybiB1LnVpOworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0IHVfdWlmKHVpbnQzMl90IHVpKQoreworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgdWludDMyX3QgdWk7CisgICAgfSB1ID0geyAudWkgPSB1aSB9OworCisgICAgcmV0dXJuIHUuZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdV9pcm91bmQoZmxvYXQgZikKK3sKKyAgICBpZiAoZiA+PSAwLjBmKQorICAgICAgICByZXR1cm4gKGludCkgKGYgKyAwLjVmKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAoaW50KSAoZiAtIDAuNWYpOworfQorCit1aW50MTZfdCB1X2Zsb2F0X3RvX2hhbGYoZmxvYXQgZik7CisKKyNlbmRpZiAvKiBJQ0RfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2NvbW1vbi9pY2QuaCBiL2ljZC9jb21tb24vaWNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjYjY3YQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9jb21tb24vaWNkLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjb2R5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIElDRF9ICisjZGVmaW5lIElDRF9ICisKKyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+CisjaW5jbHVkZSA8dnVsa2FuL3ZrX3BsYXRmb3JtLmg+CisjaW5jbHVkZSAidnVsa2FuL3ZrX3Nka19wbGF0Zm9ybS5oIgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorIyAgZGVmaW5lIElDRF9FWFBPUlQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1OTApCisjICBkZWZpbmUgSUNEX0VYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2Vsc2UKKyMgIGRlZmluZSBJQ0RfRVhQT1JUCisjZW5kaWYKKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a19pY2RHZXRJbnN0YW5jZVByb2NBZGRyKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmFtZSk7CitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtfaWNkTmVnb3RpYXRlTG9hZGVySUNESW50ZXJmYWNlVmVyc2lvbigKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwVmVyc2lvbik7CisjZW5kaWYgLyogSUNEX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9DTWFrZUxpc3RzLnR4dCBiL2ljZC9pbnRlbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNiZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTAwIEBACisjIENyZWF0ZSB0aGUgaTk2NSBWdWxrYW4gRFJJIGxpYnJhcnkKKworc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLVduby1zaWduLWNvbXBhcmUiKQorc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1Xbm8tc2lnbi1jb21wYXJlIikKKworYWRkX3N1YmRpcmVjdG9yeShrbWQpCithZGRfc3ViZGlyZWN0b3J5KGNvbXBpbGVyKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdwYS5jCisgICAgQ09NTUFORCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdmstdnRnZW5lcmF0ZS5weSBYY2IgaWNkLWdldC1wcm9jLWFkZHIgPiBncGEuYworICAgIERFUEVORFMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3ZrLXZ0Z2VuZXJhdGUucHkgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Z1bGthbi5weSkKKworc2V0KHNvdXJjZXMKKyAgICBidWYuYworICAgIGNtZC5jCisgICAgY21kX2RlY29kZS5jCisgICAgY21kX21ldGEuYworICAgIGNtZF9taS5jCisgICAgY21kX2JhcnJpZXIuYworICAgIGNtZF9waXBlbGluZS5jCisgICAgZGVzYy5jCisgICAgZGV2LmMKKyAgICBpbnN0YW5jZS5jCisgICAgZXZlbnQuYworICAgIGV4dGVuc2lvbl91dGlscy5jCisgICAgZmIuYworICAgIGZlbmNlLmMKKyAgICBmb3JtYXQuYworICAgIGdwYS5jCisgICAgZ3B1LmMKKyAgICBpbWcuYworICAgIGxheW91dC5jCisgICAgbWVtLmMKKyAgICBvYmouYworICAgIHBpcGVsaW5lLmMKKyAgICBxdWVyeS5jCisgICAgcXVldWUuYworICAgIHNhbXBsZXIuYworICAgIHNoYWRlci5jCisgICAgc3RhdGUuYworICAgIHZpZXcuYworICAgICkKKworc2V0KGRlZmluaXRpb25zICIiKQorc2V0KGluY2x1ZGVfZGlycyAiIikKKworc2V0KGxpYnJhcmllcworICAgIG0KKyAgICBpY2QKKyAgICBpbnRlbGttZAorICAgIGludGVsY29tcGlsZXIpCisKK2ZpbmRfcGFja2FnZShYQ0IgQ09NUE9ORU5UUyB4Y2IgeGNiLWRyaTMgeGNiLXByZXNlbnQpCitpZihYQ0JfRk9VTkQpCisgICAgbGlzdChBUFBFTkQgaW5jbHVkZV9kaXJzICR7WENCX0lOQ0xVREVfRElSU30pCisgICAgbGlzdChBUFBFTkQgbGlicmFyaWVzICR7WENCX0xJQlJBUklFU30pCisKKyAgICBpZiAoRGlzcGxheVNlcnZlciBNQVRDSEVTICJYY2IiKQorICAgICAgICBmaW5kX3BhY2thZ2UoWENCIENPTVBPTkVOVFMgeGNiKQorICAgICAgICBpZihYQ0JfRk9VTkQpCisgICAgICAgICAgICAjIE5vIGluY2x1ZGUgZGlyZWN0b3JpZXMgYnkgcHVycG9zZS4KKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIGxpYnJhcmllcyAke1hDQl9MSUJSQVJJRVN9KQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorCisgICAgaWYgKERpc3BsYXlTZXJ2ZXIgTUFUQ0hFUyAiWGxpYiIpCisgICAgICAgIGZpbmRfcGFja2FnZShYMTFfWENCIENPTVBPTkVOVFMgWDExLXhjYikKKyAgICAgICAgaWYoWDExX1hDQl9GT1VORCkKKyAgICAgICAgICAgICMgTm8gaW5jbHVkZSBkaXJlY3RvcmllcyBieSBwdXJwb3NlLgorICAgICAgICAgICAgbGlzdChBUFBFTkQgbGlicmFyaWVzICR7WDExX1hDQl9MSUJSQVJJRVN9KQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorCisgICAgbGlzdChBUFBFTkQgc291cmNlcyB3c2lfeDExLmMpCisKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMod3NpX3gxMS5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkke1BST0pFQ1RfU09VUkNFX0RJUn0vaWNkL2ludGVsL2ttZC9saWJkcm0vaW5jbHVkZS9kcm0iKQorZWxzZSgpCisgICAgbGlzdChBUFBFTkQgc291cmNlcyB3c2lfbnVsbC5jKQorZW5kaWYoKQorCitpZiAoTk9UIFdJTjMyKQorICAgICMgZXh0cmEgc2V0dXAgZm9yIG91dC1vZi10cmVlIGJ1aWxkcworICAgICMgaW50ZWwgSUNEIG5vdCBidWlsdCBvbiBXaW5kb3dzCisgICAgaWYgKE5PVCAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUikpCisgICAgICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChpbnRlbF9pY2QtanNvbiBBTEwKKyAgICAgICAgICAgICAgICBDT01NQU5EIGxuIC1zZiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW50ZWxfaWNkLmpzb24KKyAgICAgICAgICAgICAgICBWRVJCQVRJTQorICAgICAgICAgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2FkZF9saWJyYXJ5KFZLX2k5NjUgU0hBUkVEICR7c291cmNlc30pCit0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyhWS19pOTY1IFBSSVZBVEUgJHtkZWZpbml0aW9uc30pCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhWS19pOTY1IFBSSVZBVEUgJHtpbmNsdWRlX2RpcnN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFZLX2k5NjUgJHtsaWJyYXJpZXN9KQorCisjIHNldCAtQnN5bWJvbGljIGZvciB2a0dldFByb2NBZGRyKCkKK3NldF90YXJnZXRfcHJvcGVydGllcyhWS19pOTY1IFBST1BFUlRJRVMKKyAgICBDT01QSUxFX0ZMQUdTICItV21pc3NpbmctZGVjbGFyYXRpb25zIgorICAgIExJTktfRkxBR1MgIi1XbCwtQnN5bWJvbGljIC1XbCwtbm8tdW5kZWZpbmVkIC1XbCwtLWV4Y2x1ZGUtbGlicyxBTEwiKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL1JFQURNRS5tZCBiL2ljZC9pbnRlbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1OWYyZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9SRUFETUUubWQKQEAgLTAsMCArMSw3IEBACisjIEludGVsIFNhbXBsZSBEcml2ZXIKKworVGhpcyBkaXJlY3RvcnkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIEludGVsIEhhc3dlbGwsIEl2eSBCcmlkZ2UgYW5kIFNhbmR5IEJyaWRnZSBHUFVzOgorLSBUb3AgbGV2ZWwgZGlyZWN0b3J5IGlzIHRoZSBPUy1pbmRlcGVuZGVudCBBUEkgc3VwcG9ydAorLSBbY29tcGlsZXJdKGNvbXBpbGVyKSBjb250YWlucyBCSUwtPkludGVsIElTQSBjb21waWxlcgorLSBba21kXShrbWQpIGNvbnRhaW5zIE9TIGtlcm5lbCBtb2RlIGRyaXZlciBhYnN0cmFjdGlvbgorLSBbZ2VuaHddKGdlbmh3KSBjb250YWlucyBhdXRvZ2VuZXJhdGVkIEhXIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2J1Zi5jIGIvaWNkL2ludGVsL2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZDQzODEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvYnVmLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAib2JqLmgiCisjaW5jbHVkZSAiYnVmLmgiCisKK3N0YXRpYyB2b2lkIGJ1Zl9kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYnVmICpidWYgPSBpbnRlbF9idWZfZnJvbV9vYmoob2JqKTsKKworICAgIGludGVsX2J1Zl9kZXN0cm95KGJ1Zik7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBidWZfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMoc3RydWN0IGludGVsX2Jhc2UgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgKnBSZXF1aXJlbWVudHMpCit7CisgICAgc3RydWN0IGludGVsX2J1ZiAqYnVmID0gaW50ZWxfYnVmX2Zyb21fYmFzZShiYXNlKTsKKworICAgIC8qCisgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDEgcGFydCAxLCBwYWdlIDExODoKKyAgICAgKgorICAgICAqICAgICAiRm9yIGJ1ZmZlcnMsIHdoaWNoIGhhdmUgbm8gaW5oZXJlbnQgImhlaWdodCwiIHBhZGRpbmcKKyAgICAgKiAgICAgIHJlcXVpcmVtZW50cyBhcmUgZGlmZmVyZW50LiBBIGJ1ZmZlciBtdXN0IGJlIHBhZGRlZCB0byB0aGUKKyAgICAgKiAgICAgIG5leHQgbXVsdGlwbGUgb2YgMjU2IGFycmF5IGVsZW1lbnRzLCB3aXRoIGFuIGFkZGl0aW9uYWwgMTYKKyAgICAgKiAgICAgIGJ5dGVzIGFkZGVkIGJleW9uZCB0aGF0IHRvIGFjY291bnQgZm9yIHRoZSBMMSBjYWNoZSBsaW5lLiIKKyAgICAqLworICAgIHBSZXF1aXJlbWVudHMtPnNpemUgPSBidWYtPnNpemU7CisgICAgaWYgKGJ1Zi0+dXNhZ2UgJiAoVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fVEVYRUxfQlVGRkVSX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgVktfQlVGRkVSX1VTQUdFX1VOSUZPUk1fQlVGRkVSX0JJVCkpIHsKKyAgICAgICAgcFJlcXVpcmVtZW50cy0+c2l6ZSA9IHVfYWxpZ24ocFJlcXVpcmVtZW50cy0+c2l6ZSwgMjU2KSArIDE2OworICAgIH0KKworICAgIHBSZXF1aXJlbWVudHMtPmFsaWdubWVudCAgICAgID0gNDA5NjsKKyAgICBwUmVxdWlyZW1lbnRzLT5tZW1vcnlUeXBlQml0cyA9ICgxIDw8IElOVEVMX01FTU9SWV9UWVBFX0NPVU5UKSAtIDE7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVmtSZXN1bHQgaW50ZWxfYnVmX2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9idWYgKipidWZfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9idWYgKmJ1ZjsKKworICAgIGJ1ZiA9IChzdHJ1Y3QgaW50ZWxfYnVmICopIGludGVsX2Jhc2VfY3JlYXRlKCZkZXYtPmJhc2UuaGFuZGxlLAorICAgICAgICAgICAgc2l6ZW9mKCpidWYpLCBkZXYtPmJhc2UuZGJnLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVCwgaW5mbywgMCk7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBidWYtPnNpemUgPSBpbmZvLT5zaXplOworICAgIGJ1Zi0+dXNhZ2UgPSBpbmZvLT51c2FnZTsKKworICAgIGJ1Zi0+b2JqLmRlc3Ryb3kgPSBidWZfZGVzdHJveTsKKyAgICBidWYtPm9iai5iYXNlLmdldF9tZW1vcnlfcmVxdWlyZW1lbnRzID0gYnVmX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzOworCisgICAgKmJ1Zl9yZXQgPSBidWY7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9idWZfZGVzdHJveShzdHJ1Y3QgaW50ZWxfYnVmICpidWYpCit7CisgICAgaW50ZWxfYmFzZV9kZXN0cm95KCZidWYtPm9iai5iYXNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYgPSBpbnRlbF9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBpbnRlbF9idWZfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sIChzdHJ1Y3QgaW50ZWxfYnVmICoqKSBwQnVmZmVyKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95QnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqICpvYmogPSBpbnRlbF9vYmooYnVmZmVyKTsKKworICAgIG9iai0+ZGVzdHJveShvYmopOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2J1Zi5oIGIvaWNkL2ludGVsL2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MGQxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvYnVmLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIEJVRl9ICisjZGVmaW5lIEJVRl9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorI2luY2x1ZGUgIm9iai5oIgorCitzdHJ1Y3QgaW50ZWxfYnVmIHsKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqIG9iajsKKworICAgIFZrRGV2aWNlU2l6ZSBzaXplOworICAgIFZrRmxhZ3MgdXNhZ2U7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9idWYgKmludGVsX2J1ZihWa0J1ZmZlciBidWYpCit7CisgICAgcmV0dXJuICooc3RydWN0IGludGVsX2J1ZiAqKikgJmJ1ZjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfYnVmICppbnRlbF9idWZfZnJvbV9iYXNlKHN0cnVjdCBpbnRlbF9iYXNlICpiYXNlKQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX2J1ZiAqKSBiYXNlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9idWYgKmludGVsX2J1Zl9mcm9tX29iaihzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgcmV0dXJuIGludGVsX2J1Zl9mcm9tX2Jhc2UoJm9iai0+YmFzZSk7Cit9CisKK1ZrUmVzdWx0IGludGVsX2J1Zl9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYnVmICoqYnVmX3JldCk7CisKK3ZvaWQgaW50ZWxfYnVmX2Rlc3Ryb3koc3RydWN0IGludGVsX2J1ZiAqYnVmKTsKKworI2VuZGlmIC8qIEJVRl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY21kLmMgYi9pY2QvaW50ZWwvY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhMGQzNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jbWQuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjb2R5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJnZW5ody9nZW5ody5oIgorI2luY2x1ZGUgImttZC93aW5zeXMuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJvYmouaCIKKyNpbmNsdWRlICJjbWRfcHJpdi5oIgorI2luY2x1ZGUgImZiLmgiCisKKy8qKgorICogRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgYSB3cml0ZXIuICBOb3RlIHRoYXQgdGhlIGluaXRpYWwgc2l6ZSBpcyBub3QKKyAqIHJlc2V0LgorICovCitzdGF0aWMgdm9pZCBjbWRfd3JpdGVyX3Jlc2V0KHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gpCit7CisgICAgc3RydWN0IGludGVsX2NtZF93cml0ZXIgKndyaXRlciA9ICZjbWQtPndyaXRlcnNbd2hpY2hdOworCisgICAgaWYgKHdyaXRlci0+cHRyKSB7CisgICAgICAgIGludGVsX2JvX3VubWFwKHdyaXRlci0+Ym8pOworICAgICAgICB3cml0ZXItPnB0ciA9IE5VTEw7CisgICAgfQorCisgICAgaW50ZWxfYm9fdW5yZWYod3JpdGVyLT5ibyk7CisgICAgd3JpdGVyLT5ibyA9IE5VTEw7CisKKyAgICB3cml0ZXItPnVzZWQgPSAwOworCisgICAgd3JpdGVyLT5zYmFfb2Zmc2V0ID0gMDsKKworICAgIGlmICh3cml0ZXItPml0ZW1zKSB7CisgICAgICAgIGludGVsX2ZyZWUoY21kLCB3cml0ZXItPml0ZW1zKTsKKyAgICAgICAgd3JpdGVyLT5pdGVtcyA9IE5VTEw7CisgICAgICAgIHdyaXRlci0+aXRlbV9hbGxvYyA9IDA7CisgICAgICAgIHdyaXRlci0+aXRlbV91c2VkID0gMDsKKyAgICB9Cit9CisKKy8qKgorICogRGlzY2FyZCBldmVyeXRoaW5nIHdyaXR0ZW4gc28gZmFyLgorICovCitzdGF0aWMgdm9pZCBjbWRfd3JpdGVyX2Rpc2NhcmQoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWRfd3JpdGVyICp3cml0ZXIgPSAmY21kLT53cml0ZXJzW3doaWNoXTsKKworICAgIGludGVsX2JvX3RydW5jYXRlX3JlbG9jcyh3cml0ZXItPmJvLCAwKTsKKyAgICB3cml0ZXItPnVzZWQgPSAwOworICAgIHdyaXRlci0+aXRlbV91c2VkID0gMDsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF9ibyAqYWxsb2Nfd3JpdGVyX2JvKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqd3JpdGVyX25hbWVzW0lOVEVMX0NNRF9XUklURVJfQ09VTlRdID0geworICAgICAgICBbSU5URUxfQ01EX1dSSVRFUl9CQVRDSF0gPSAiYmF0Y2giLAorICAgICAgICBbSU5URUxfQ01EX1dSSVRFUl9TVVJGQUNFXSA9ICJzdXJmYWNlIiwKKyAgICAgICAgW0lOVEVMX0NNRF9XUklURVJfU1RBVEVdID0gInN0YXRlIiwKKyAgICAgICAgW0lOVEVMX0NNRF9XUklURVJfSU5TVFJVQ1RJT05dID0gImluc3RydWN0aW9uIiwKKyAgICB9OworCisgICAgcmV0dXJuIGludGVsX3dpbnN5c19hbGxvY19ibyh3aW5zeXMsIHdyaXRlcl9uYW1lc1t3aGljaF0sIHNpemUsIHRydWUpOworfQorCisvKioKKyAqIEFsbG9jYXRlIGFuZCBtYXAgdGhlIGJ1ZmZlciBmb3Igd3JpdGluZy4KKyAqLworc3RhdGljIFZrUmVzdWx0IGNtZF93cml0ZXJfYWxsb2NfYW5kX21hcChzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gpCit7CisgICAgc3RydWN0IGludGVsX2NtZF93cml0ZXIgKndyaXRlciA9ICZjbWQtPndyaXRlcnNbd2hpY2hdOworICAgIHN0cnVjdCBpbnRlbF9ibyAqYm87CisKKyAgICBibyA9IGFsbG9jX3dyaXRlcl9ibyhjbWQtPmRldi0+d2luc3lzLCB3aGljaCwgd3JpdGVyLT5zaXplKTsKKyAgICBpZiAoYm8pIHsKKyAgICAgICAgaW50ZWxfYm9fdW5yZWYod3JpdGVyLT5ibyk7CisgICAgICAgIHdyaXRlci0+Ym8gPSBibzsKKyAgICB9IGVsc2UgaWYgKHdyaXRlci0+Ym8pIHsKKyAgICAgICAgLyogcmV1c2UgdGhlIG9sZCBibyAqLworICAgICAgICBjbWRfd3JpdGVyX2Rpc2NhcmQoY21kLCB3aGljaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworICAgIH0KKworICAgIHdyaXRlci0+dXNlZCA9IDA7CisgICAgd3JpdGVyLT5pdGVtX3VzZWQgPSAwOworCisgICAgd3JpdGVyLT5wdHIgPSBpbnRlbF9ib19tYXAod3JpdGVyLT5ibywgdHJ1ZSk7CisgICAgaWYgKCF3cml0ZXItPnB0cikgeworICAgICAgICByZXR1cm4gVktfRVJST1JfTUVNT1JZX01BUF9GQUlMRUQ7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKy8qKgorICogVW5tYXAgdGhlIGJ1ZmZlciBmb3Igc3VibWlzc2lvbi4KKyAqLworc3RhdGljIHZvaWQgY21kX3dyaXRlcl91bm1hcChzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWRfd3JpdGVyICp3cml0ZXIgPSAmY21kLT53cml0ZXJzW3doaWNoXTsKKworICAgIGludGVsX2JvX3VubWFwKHdyaXRlci0+Ym8pOworICAgIHdyaXRlci0+cHRyID0gTlVMTDsKK30KKworLyoqCisgKiBHcm93IGEgbWFwcGVkIHdyaXRlciB0byBhdCBsZWFzdCBccCBuZXdfc2l6ZS4gIEZhaWx1cmVzIGFyZSBoYW5kbGVkCisgKiBzaWxlbnRseS4KKyAqLwordm9pZCBjbWRfd3JpdGVyX2dyb3coc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmV3X3NpemUpCit7CisgICAgc3RydWN0IGludGVsX2NtZF93cml0ZXIgKndyaXRlciA9ICZjbWQtPndyaXRlcnNbd2hpY2hdOworICAgIHN0cnVjdCBpbnRlbF9ibyAqbmV3X2JvOworICAgIHZvaWQgKm5ld19wdHI7CisKKyAgICBpZiAobmV3X3NpemUgPCB3cml0ZXItPnNpemUgPDwgMSkKKyAgICAgICAgbmV3X3NpemUgPSB3cml0ZXItPnNpemUgPDwgMTsKKyAgICAvKiBTVEFURV9CQVNFX0FERFJFU1MgcmVxdWlyZXMgcGFnZS1hbGlnbmVkIGJ1ZmZlcnMgKi8KKyAgICBuZXdfc2l6ZSA9IHVfYWxpZ24obmV3X3NpemUsIDQwOTYpOworCisgICAgbmV3X2JvID0gYWxsb2Nfd3JpdGVyX2JvKGNtZC0+ZGV2LT53aW5zeXMsIHdoaWNoLCBuZXdfc2l6ZSk7CisgICAgaWYgKCFuZXdfYm8pIHsKKyAgICAgICAgY21kX3dyaXRlcl9kaXNjYXJkKGNtZCwgd2hpY2gpOworICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIG1hcCBhbmQgY29weSB0aGUgZGF0YSBvdmVyICovCisgICAgbmV3X3B0ciA9IGludGVsX2JvX21hcChuZXdfYm8sIHRydWUpOworICAgIGlmICghbmV3X3B0cikgeworICAgICAgICBpbnRlbF9ib191bnJlZihuZXdfYm8pOworICAgICAgICBjbWRfd3JpdGVyX2Rpc2NhcmQoY21kLCB3aGljaCk7CisgICAgICAgIGNtZF9mYWlsKGNtZCwgVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweShuZXdfcHRyLCB3cml0ZXItPnB0ciwgd3JpdGVyLT51c2VkKTsKKworICAgIGludGVsX2JvX3VubWFwKHdyaXRlci0+Ym8pOworICAgIGludGVsX2JvX3VucmVmKHdyaXRlci0+Ym8pOworCisgICAgd3JpdGVyLT5zaXplID0gbmV3X3NpemU7CisgICAgd3JpdGVyLT5ibyA9IG5ld19ibzsKKyAgICB3cml0ZXItPnB0ciA9IG5ld19wdHI7Cit9CisKKy8qKgorICogUmVjb3JkIGFuIGl0ZW0gZm9yIGxhdGVyIGRlY29kaW5nLgorICovCit2b2lkIGNtZF93cml0ZXJfcmVjb3JkKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX2l0ZW1fdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1t3aGljaF07CisgICAgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtOworCisgICAgaWYgKHdyaXRlci0+aXRlbV91c2VkID09IHdyaXRlci0+aXRlbV9hbGxvYykgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBuZXdfYWxsb2MgPSAod3JpdGVyLT5pdGVtX2FsbG9jKSA/CisgICAgICAgICAgICB3cml0ZXItPml0ZW1fYWxsb2MgPDwgMSA6IDI1NjsKKyAgICAgICAgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtczsKKworICAgICAgICBpdGVtcyA9IGludGVsX2FsbG9jKGNtZCwgc2l6ZW9mKHdyaXRlci0+aXRlbXNbMF0pICogbmV3X2FsbG9jLAorICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgICAgICBpZiAoIWl0ZW1zKSB7CisgICAgICAgICAgICB3cml0ZXItPml0ZW1fdXNlZCA9IDA7CisgICAgICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoaXRlbXMsIHdyaXRlci0+aXRlbXMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHdyaXRlci0+aXRlbXNbMF0pICogd3JpdGVyLT5pdGVtX2FsbG9jKTsKKworICAgICAgICBpbnRlbF9mcmVlKGNtZCwgd3JpdGVyLT5pdGVtcyk7CisKKyAgICAgICAgd3JpdGVyLT5pdGVtcyA9IGl0ZW1zOworICAgICAgICB3cml0ZXItPml0ZW1fYWxsb2MgPSBuZXdfYWxsb2M7CisgICAgfQorCisgICAgaXRlbSA9ICZ3cml0ZXItPml0ZW1zW3dyaXRlci0+aXRlbV91c2VkKytdOworICAgIGl0ZW0tPnR5cGUgPSB0eXBlOworICAgIGl0ZW0tPm9mZnNldCA9IG9mZnNldDsKKyAgICBpdGVtLT5zaXplID0gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgY21kX3dyaXRlcl9wYXRjaChzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCB1aW50MzJfdCB2YWwpCit7CisgICAgc3RydWN0IGludGVsX2NtZF93cml0ZXIgKndyaXRlciA9ICZjbWQtPndyaXRlcnNbd2hpY2hdOworCisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZih2YWwpIDw9IHdyaXRlci0+dXNlZCk7CisgICAgKigodWludDMyX3QgKikgKChjaGFyICopIHdyaXRlci0+cHRyICsgb2Zmc2V0KSkgPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9yZXNldChzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBJTlRFTF9DTURfV1JJVEVSX0NPVU5UOyBpKyspCisgICAgICAgIGNtZF93cml0ZXJfcmVzZXQoY21kLCBpKTsKKworICAgIGlmIChjbWQtPmJpbmQuc2hhZGVyX2NhY2hlLmVudHJpZXMpCisgICAgICAgIGludGVsX2ZyZWUoY21kLCBjbWQtPmJpbmQuc2hhZGVyX2NhY2hlLmVudHJpZXMpOworCisgICAgaWYgKGNtZC0+YmluZC5kc2V0LmdyYXBoaWNzX2RhdGEuc2V0X29mZnNldHMpCisgICAgICAgIGludGVsX2ZyZWUoY21kLCBjbWQtPmJpbmQuZHNldC5ncmFwaGljc19kYXRhLnNldF9vZmZzZXRzKTsKKyAgICBpZiAoY21kLT5iaW5kLmRzZXQuZ3JhcGhpY3NfZGF0YS5keW5hbWljX29mZnNldHMpCisgICAgICAgIGludGVsX2ZyZWUoY21kLCBjbWQtPmJpbmQuZHNldC5ncmFwaGljc19kYXRhLmR5bmFtaWNfb2Zmc2V0cyk7CisgICAgaWYgKGNtZC0+YmluZC5kc2V0LmNvbXB1dGVfZGF0YS5zZXRfb2Zmc2V0cykKKyAgICAgICAgaW50ZWxfZnJlZShjbWQsIGNtZC0+YmluZC5kc2V0LmNvbXB1dGVfZGF0YS5zZXRfb2Zmc2V0cyk7CisgICAgaWYgKGNtZC0+YmluZC5kc2V0LmNvbXB1dGVfZGF0YS5keW5hbWljX29mZnNldHMpCisgICAgICAgIGludGVsX2ZyZWUoY21kLCBjbWQtPmJpbmQuZHNldC5jb21wdXRlX2RhdGEuZHluYW1pY19vZmZzZXRzKTsKKworICAgIG1lbXNldCgmY21kLT5iaW5kLCAwLCBzaXplb2YoY21kLT5iaW5kKSk7CisKKyAgICBjbWQtPnJlbG9jX3VzZWQgPSAwOworICAgIGNtZC0+cmVzdWx0ID0gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgY21kX2Rlc3Ryb3koc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZF9mcm9tX29iaihvYmopOworCisgICAgaW50ZWxfY21kX2Rlc3Ryb3koY21kKTsKK30KKworVmtSZXN1bHQgaW50ZWxfY21kX2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWQgKipjbWRfcmV0KQoreworICAgIGludCBwaXBlbGluZV9zZWxlY3Q7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kOworICAgIHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqcG9vbCA9IGludGVsX2NtZF9wb29sKGluZm8tPmNvbW1hbmRQb29sKTsKKworICAgIHN3aXRjaCAocG9vbC0+cXVldWVfZmFtaWx5X2luZGV4KSB7CisgICAgY2FzZSBJTlRFTF9HUFVfRU5HSU5FXzNEOgorICAgICAgICBwaXBlbGluZV9zZWxlY3QgPSBHRU42X1BJUEVMSU5FX1NFTEVDVF9EVzBfU0VMRUNUXzNEOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBUT0RPVlY6IEFkZCB2YWxpZGF0aW9uIGNoZWNrIGZvciB0aGlzICovCisgICAgICAgIGFzc2VydCgwICYmICJpY2Q6IEludmFsaWQgcXVldWVfZmFtaWx5X2luZGV4Iik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNtZCA9IChzdHJ1Y3QgaW50ZWxfY21kICopIGludGVsX2Jhc2VfY3JlYXRlKCZkZXYtPmJhc2UuaGFuZGxlLAorICAgICAgICAgICAgc2l6ZW9mKCpjbWQpLCBkZXYtPmJhc2UuZGJnLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhULCBpbmZvLCAwKTsKKyAgICBpZiAoIWNtZCkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIGNtZC0+b2JqLmRlc3Ryb3kgPSBjbWRfZGVzdHJveTsKKworICAgIGNtZC0+ZGV2ID0gZGV2OworICAgIGNtZC0+c2NyYXRjaF9ibyA9IGRldi0+Y21kX3NjcmF0Y2hfYm87CisgICAgY21kLT5wcmltYXJ5ID0gKGluZm8tPmxldmVsID09IFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlkpOworICAgIGNtZC0+cGlwZWxpbmVfc2VsZWN0ID0gcGlwZWxpbmVfc2VsZWN0OworCisgICAgLyoKKyAgICAgKiBYWFggVGhpcyBpcyBub3QgcXVpdGUgcmlnaHQuICBpbnRlbF9ncHUgc2V0cyBtYXhNZW1SZWZlcmVuY2VzIHRvCisgICAgICogYmF0Y2hfYnVmZmVyX3JlbG9jX2NvdW50LCBidXQgd2UgbWF5IGVtaXQgdXAgdG8gdHdvIHJlbG9jcywgZm9yIHN0YXJ0CisgICAgICogYW5kIGVuZCBvZmZzZXRzLCBmb3IgZWFjaCByZWZlcmVuY2VkIG1lbW9yaWVzLgorICAgICAqLworICAgIGNtZC0+cmVsb2NfY291bnQgPSBkZXYtPmdwdS0+YmF0Y2hfYnVmZmVyX3JlbG9jX2NvdW50OworICAgIGNtZC0+cmVsb2NzID0gaW50ZWxfYWxsb2MoY21kLCBzaXplb2YoY21kLT5yZWxvY3NbMF0pICogY21kLT5yZWxvY19jb3VudCwKKyAgICAgICAgICAgIDQwOTYsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgaWYgKCFjbWQtPnJlbG9jcykgeworICAgICAgICBpbnRlbF9jbWRfZGVzdHJveShjbWQpOworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKworICAgICpjbWRfcmV0ID0gY21kOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaW50ZWxfY21kX2Rlc3Ryb3koc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNtZF9yZXNldChjbWQpOworCisgICAgaW50ZWxfZnJlZShjbWQsIGNtZC0+cmVsb2NzKTsKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJmNtZC0+b2JqLmJhc2UpOworfQorCitWa1Jlc3VsdCBpbnRlbF9jbWRfYmVnaW4oc3RydWN0IGludGVsX2NtZCAqY21kLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gKmluZm8pCit7CisgICAgVmtSZXN1bHQgcmV0OworICAgIHVpbnQzMl90IGk7CisKKyAgICBjbWRfcmVzZXQoY21kKTsKKworICAgIC8qIFRPRE9WVjogQ2hlY2sgdGhhdCByZW5kZXIgcGFzcyBpcyBkZWZpbmVkICovCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVySW5oZXJpdGFuY2VJbmZvICpoaW5mbyA9IGluZm8tPnBJbmhlcml0YW5jZUluZm87CisgICAgaWYgKCFjbWQtPnByaW1hcnkpIHsKKyAgICAgICAgY21kX2JlZ2luX3JlbmRlcl9wYXNzKGNtZCwKKyAgICAgICAgICAgICAgICBpbnRlbF9yZW5kZXJfcGFzcyhoaW5mby0+cmVuZGVyUGFzcyksCisgICAgICAgICAgICAgICAgaW50ZWxfZmIoaGluZm8tPmZyYW1lYnVmZmVyKSwKKyAgICAgICAgICAgICAgICBoaW5mby0+c3VicGFzcywKKyAgICAgICAgICAgICAgICBWS19TVUJQQVNTX0NPTlRFTlRTX0lOTElORSk7CisgICAgfQorCisgICAgaWYgKGNtZC0+ZmxhZ3MgIT0gaW5mby0+ZmxhZ3MpIHsKKyAgICAgICAgY21kLT5mbGFncyA9IGluZm8tPmZsYWdzOworICAgICAgICBjbWQtPndyaXRlcnNbSU5URUxfQ01EX1dSSVRFUl9CQVRDSF0uc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKCFjbWQtPndyaXRlcnNbSU5URUxfQ01EX1dSSVRFUl9CQVRDSF0uc2l6ZSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gY21kLT5kZXYtPmdwdS0+bWF4X2JhdGNoX2J1ZmZlcl9zaXplIC8gMjsKKworICAgICAgICBjbWQtPndyaXRlcnNbSU5URUxfQ01EX1dSSVRFUl9CQVRDSF0uc2l6ZSA9IHNpemU7CisgICAgICAgIGNtZC0+d3JpdGVyc1tJTlRFTF9DTURfV1JJVEVSX1NVUkZBQ0VdLnNpemUgPSBzaXplIC8gMjsKKyAgICAgICAgY21kLT53cml0ZXJzW0lOVEVMX0NNRF9XUklURVJfU1RBVEVdLnNpemUgPSBzaXplIC8gMjsKKyAgICAgICAgY21kLT53cml0ZXJzW0lOVEVMX0NNRF9XUklURVJfSU5TVFJVQ1RJT05dLnNpemUgPSAxNjM4NDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU5URUxfQ01EX1dSSVRFUl9DT1VOVDsgaSsrKSB7CisgICAgICAgIHJldCA9IGNtZF93cml0ZXJfYWxsb2NfYW5kX21hcChjbWQsIGkpOworICAgICAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGNtZF9yZXNldChjbWQpOworICAgICAgICAgICAgcmV0dXJuICByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbWRfYmF0Y2hfYmVnaW4oY21kKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWa1Jlc3VsdCBpbnRlbF9jbWRfZW5kKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfd2luc3lzICp3aW5zeXMgPSBjbWQtPmRldi0+d2luc3lzOworICAgIHVpbnQzMl90IGk7CisKKyAgICAvKiBkcmF3X3N0YXRlOiBubyBtYXRjaGluZyBpbnRlbF9jbWRfYmVnaW4oKSAqLworICAgIGFzc2VydChjbWQtPndyaXRlcnNbSU5URUxfQ01EX1dSSVRFUl9CQVRDSF0ucHRyICYmICJpY2Q6IG5vIG1hdGNoaW5nIGludGVsX2NtZF9iZWdpbiIpOworCisgICAgY21kX2JhdGNoX2VuZChjbWQpOworCisgICAgLyogVE9ETyB3ZSBuZWVkIGEgbW9yZSAiZXhwbGljaXQiIHdpbnN5cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjbWQtPnJlbG9jX3VzZWQ7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX3JlbG9jICpyZWxvYyA9ICZjbWQtPnJlbG9jc1tpXTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF93cml0ZXIgKndyaXRlciA9ICZjbWQtPndyaXRlcnNbcmVsb2MtPndoaWNoXTsKKyAgICAgICAgdWludDY0X3QgcHJlc3VtZWRfb2Zmc2V0OworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIC8qCisgICAgICAgICAqIE9uY2UgYSBibyBpcyB1c2VkIGFzIGEgcmVsb2MgdGFyZ2V0LCBsaWJkcm1faW50ZWwgZGlzYWxsb3dzIG1vcmUKKyAgICAgICAgICogcmVsb2NzIHRvIGJlIGFkZGVkIHRvIGl0LiAgVGhhdCBtYXkgaGFwcGVuIHdoZW4KKyAgICAgICAgICogSU5URUxfQ01EX1JFTE9DX1RBUkdFVF9JU19XUklURVIgaXMgc2V0LiAgV2UgaGF2ZSB0byBwcm9jZXNzIHRoZW0KKyAgICAgICAgICogaW4gYW5vdGhlciBwYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHJlbG9jLT5mbGFncyAmIElOVEVMX0NNRF9SRUxPQ19UQVJHRVRfSVNfV1JJVEVSKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZXJyID0gaW50ZWxfYm9fYWRkX3JlbG9jKHdyaXRlci0+Ym8sIHJlbG9jLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9ibyAqKSByZWxvYy0+dGFyZ2V0LCByZWxvYy0+dGFyZ2V0X29mZnNldCwKKyAgICAgICAgICAgICAgICByZWxvYy0+ZmxhZ3MsICZwcmVzdW1lZF9vZmZzZXQpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KHByZXN1bWVkX29mZnNldCA9PSAodWludDY0X3QpICh1aW50MzJfdCkgcHJlc3VtZWRfb2Zmc2V0KTsKKyAgICAgICAgY21kX3dyaXRlcl9wYXRjaChjbWQsIHJlbG9jLT53aGljaCwgcmVsb2MtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpIHByZXN1bWVkX29mZnNldCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBjbWQtPnJlbG9jX3VzZWQ7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX3JlbG9jICpyZWxvYyA9ICZjbWQtPnJlbG9jc1tpXTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF93cml0ZXIgKndyaXRlciA9ICZjbWQtPndyaXRlcnNbcmVsb2MtPndoaWNoXTsKKyAgICAgICAgdWludDY0X3QgcHJlc3VtZWRfb2Zmc2V0OworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmICghKHJlbG9jLT5mbGFncyAmIElOVEVMX0NNRF9SRUxPQ19UQVJHRVRfSVNfV1JJVEVSKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGVyciA9IGludGVsX2JvX2FkZF9yZWxvYyh3cml0ZXItPmJvLCByZWxvYy0+b2Zmc2V0LAorICAgICAgICAgICAgICAgIGNtZC0+d3JpdGVyc1tyZWxvYy0+dGFyZ2V0XS5ibywgcmVsb2MtPnRhcmdldF9vZmZzZXQsCisgICAgICAgICAgICAgICAgcmVsb2MtPmZsYWdzICYgfklOVEVMX0NNRF9SRUxPQ19UQVJHRVRfSVNfV1JJVEVSLAorICAgICAgICAgICAgICAgICZwcmVzdW1lZF9vZmZzZXQpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KHByZXN1bWVkX29mZnNldCA9PSAodWludDY0X3QpICh1aW50MzJfdCkgcHJlc3VtZWRfb2Zmc2V0KTsKKyAgICAgICAgY21kX3dyaXRlcl9wYXRjaChjbWQsIHJlbG9jLT53aGljaCwgcmVsb2MtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpIHByZXN1bWVkX29mZnNldCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IElOVEVMX0NNRF9XUklURVJfQ09VTlQ7IGkrKykKKyAgICAgICAgY21kX3dyaXRlcl91bm1hcChjbWQsIGkpOworCisgICAgaWYgKGNtZC0+cmVzdWx0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBjbWQtPnJlc3VsdDsKKworICAgIGlmIChpbnRlbF93aW5zeXNfY2FuX3N1Ym1pdF9ibyh3aW5zeXMsCisgICAgICAgICAgICAgICAgJmNtZC0+d3JpdGVyc1tJTlRFTF9DTURfV1JJVEVSX0JBVENIXS5ibywgMSkpCisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoMCAmJiAiaW50ZWxfd2luc3lzX2Nhbl9zdWJtaXRfYm8gZmFpbGVkIik7CisgICAgfQorICAgIHJldHVybiBWS19FUlJPUl9ERVZJQ0VfTE9TVDsKK30KKworc3RhdGljIHZvaWQgcG9vbF9kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgKmNtZF9wb29sID0gaW50ZWxfY21kX3Bvb2xfZnJvbV9vYmoob2JqKTsKKworICAgIGludGVsX2NtZF9wb29sX2Rlc3Ryb3koY21kX3Bvb2wpOworfQorCitWa1Jlc3VsdCBpbnRlbF9jbWRfcG9vbF9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqKmNtZF9wb29sX3JldCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgKmNtZF9wb29sOworCisgICAgY21kX3Bvb2wgPSAoc3RydWN0IGludGVsX2NtZF9wb29sICopIGludGVsX2Jhc2VfY3JlYXRlKCZkZXYtPmJhc2UuaGFuZGxlLAorICAgICAgICAgICAgc2l6ZW9mKCpjbWRfcG9vbCksIGRldi0+YmFzZS5kYmcsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhULCBpbmZvLCAwKTsKKyAgICBpZiAoIWNtZF9wb29sKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgY21kX3Bvb2wtPm9iai5kZXN0cm95ID0gcG9vbF9kZXN0cm95OworCisgICAgY21kX3Bvb2wtPmRldiA9IGRldjsKKyAgICBjbWRfcG9vbC0+cXVldWVfZmFtaWx5X2luZGV4ID0gaW5mby0+cXVldWVGYW1pbHlJbmRleDsKKyAgICBjbWRfcG9vbC0+Y3JlYXRlX2ZsYWdzID0gaW5mby0+ZmxhZ3M7CisKKyAgICAqY21kX3Bvb2xfcmV0ID0gY21kX3Bvb2w7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9jbWRfcG9vbF9kZXN0cm95KHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqY21kX3Bvb2wpCit7CisgICAgLy9jbWRfcmVzZXQoY21kKTsKKyAgICAvL2ludGVsX2ZyZWUoY21kLCBjbWQtPnJlbG9jcyk7CisgICAgLy9pbnRlbF9iYXNlX2Rlc3Ryb3koJmNtZC0+b2JqLmJhc2UpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kUG9vbCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYgPSBpbnRlbF9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBpbnRlbF9jbWRfcG9vbF9jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgKiopIHBDb21tYW5kUG9vbCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldENvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICAvLyBUT0RPCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaW50ZWxfZnJlZV9jbWRfYnVmZmVycygKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgICAgICAgICAgICAgICpjbWRfcG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAqY21kX2J1ZnMpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKGNtZF9idWZzW2ldKTsKKworICAgICAgICBvYmotPmRlc3Ryb3kob2JqKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqcG9vbCA9IGludGVsX2NtZF9wb29sKHBBbGxvY2F0ZUluZm8tPmNvbW1hbmRQb29sKTsKKyAgICB1aW50MzJfdCBudW1fYWxsb2NhdGVkID0gMDsKKyAgICBWa1Jlc3VsdCByZXM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFsbG9jYXRlSW5mby0+Y29tbWFuZEJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgcmVzID0gaW50ZWxfY21kX2NyZWF0ZShkZXYsIHBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IGludGVsX2NtZCAqKikgJnBDb21tYW5kQnVmZmVyc1tpXSk7CisgICAgICAgIGlmIChyZXMgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgaW50ZWxfZnJlZV9jbWRfYnVmZmVycyhwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBudW1fYWxsb2NhdGVkKys7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRnJlZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyQ291bnQsCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyKiAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykKK3sKKyAgICBpbnRlbF9mcmVlX2NtZF9idWZmZXJzKGludGVsX2NtZF9wb29sKGNvbW1hbmRQb29sKSwgY29tbWFuZEJ1ZmZlckNvdW50LCBwQ29tbWFuZEJ1ZmZlcnMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCZWdpbkNvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gICAgICAgICAgICAqaW5mbykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICByZXR1cm4gaW50ZWxfY21kX2JlZ2luKGNtZCwgaW5mbyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICByZXR1cm4gaW50ZWxfY21kX2VuZChjbWQpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzICAgICAgICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBjbWRfcmVzZXQoY21kKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NtZC5oIGIvaWNkL2ludGVsL2NtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTVlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY21kLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaWZuZGVmIENNRF9ICisjZGVmaW5lIENNRF9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorI2luY2x1ZGUgIm9iai5oIgorI2luY2x1ZGUgInZpZXcuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorCitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmU7CitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyOworc3RydWN0IGludGVsX3ZpZXdwb3J0X3N0YXRlOworc3RydWN0IGludGVsX3Jhc3Rlcl9zdGF0ZTsKK3N0cnVjdCBpbnRlbF9tc2FhX3N0YXRlOworc3RydWN0IGludGVsX2JsZW5kX3N0YXRlOworc3RydWN0IGludGVsX2RzX3N0YXRlOworc3RydWN0IGludGVsX2Rlc2Nfc2V0Oworc3RydWN0IGludGVsX3JlbmRlcl9wYXNzOworCitzdHJ1Y3QgaW50ZWxfY21kX2l0ZW07CitzdHJ1Y3QgaW50ZWxfY21kX3JlbG9jOworc3RydWN0IGludGVsX2NtZF9tZXRhOworCisvKgorICogV2Uga25vdyB3aGF0IHdvcmthcm91bmRzIGFyZSBuZWVkZWQgZm9yIGludGVsX3BpcGVsaW5lLiAgVGhlc2UgYXJlIG1vc3RseQorICogZm9yIHBpcGVsaW5lIGRlcml2YXRpdmVzLgorICovCitlbnVtIGludGVsX2NtZF93YV9mbGFncyB7CisgICAgLyoKKyAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgNjA6CisgICAgICoKKyAgICAgKiAgICAgIkJlZm9yZSBhbnkgZGVwdGggc3RhbGwgZmx1c2ggKGluY2x1ZGluZyB0aG9zZSBwcm9kdWNlZCBieQorICAgICAqICAgICAgbm9uLXBpcGVsaW5lZCBzdGF0ZSBjb21tYW5kcyksIHNvZnR3YXJlIG5lZWRzIHRvIGZpcnN0IHNlbmQgYQorICAgICAqICAgICAgUElQRV9DT05UUk9MIHdpdGggbm8gYml0cyBzZXQgZXhjZXB0IFBvc3QtU3luYyBPcGVyYXRpb24gIT0gMC4iCisgICAgICovCisgICAgSU5URUxfQ01EX1dBX0dFTjZfUFJFX0RFUFRIX1NUQUxMX1dSSVRFID0gMSA8PCAwLAorCisgICAgLyoKKyAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMjc0OgorICAgICAqCisgICAgICogICAgICJBIFBJUEVfQ09OVFJPTCBjb21tYW5kLCB3aXRoIG9ubHkgdGhlIFN0YWxsIEF0IFBpeGVsIFNjb3JlYm9hcmQKKyAgICAgKiAgICAgIGZpZWxkIHNldCAoRFcxIEJpdCAxKSwgbXVzdCBiZSBpc3N1ZWQgcHJpb3IgdG8gYW55IGNoYW5nZSB0byB0aGUKKyAgICAgKiAgICAgIHZhbHVlIGluIHRoaXMgZmllbGQgKE1heGltdW0gTnVtYmVyIG9mIFRocmVhZHMgaW4gM0RTVEFURV9XTSkiCisgICAgICoKKyAgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDI4NjoKKyAgICAgKgorICAgICAqICAgICAiSWYgdGhpcyBmaWVsZCAoTWF4aW11bSBOdW1iZXIgb2YgVGhyZWFkcyBpbiAzRFNUQVRFX1BTKSBpcyBjaGFuZ2VkCisgICAgICogICAgICBiZXR3ZWVuIDNEUFJJTUlUSVZFIGNvbW1hbmRzLCBhIFBJUEVfQ09OVFJPTCBjb21tYW5kIHdpdGggU3RhbGwgYXQKKyAgICAgKiAgICAgIFBpeGVsIFNjb3JlYm9hcmQgc2V0IGlzIHJlcXVpcmVkIHRvIGJlIGlzc3VlZC4iCisgICAgICovCisgICAgSU5URUxfQ01EX1dBX0dFTjZfUFJFX0NPTU1BTkRfU0NPUkVCT0FSRF9TVEFMTCA9IDEgPDwgMSwKKworICAgIC8qCisgICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSAxMDY6CisgICAgICoKKyAgICAgKiAgICAgIkEgUElQRV9DT05UUk9MIHdpdGggUG9zdC1TeW5jIE9wZXJhdGlvbiBzZXQgdG8gMWggYW5kIGEgZGVwdGgKKyAgICAgKiAgICAgIHN0YWxsIG5lZWRzIHRvIGJlIHNlbnQganVzdCBwcmlvciB0byBhbnkgM0RTVEFURV9WUywKKyAgICAgKiAgICAgIDNEU1RBVEVfVVJCX1ZTLCAzRFNUQVRFX0NPTlNUQU5UX1ZTLAorICAgICAqICAgICAgM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJfVlMsIDNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSX1ZTCisgICAgICogICAgICBjb21tYW5kLiAgT25seSBvbmUgUElQRV9DT05UUk9MIG5lZWRzIHRvIGJlIHNlbnQgYmVmb3JlIGFueQorICAgICAqICAgICAgY29tYmluYXRpb24gb2YgVlMgYXNzb2NpYXRlZCAzRFNUQVRFLiIKKyAgICAgKi8KKyAgICBJTlRFTF9DTURfV0FfR0VON19QUkVfVlNfREVQVEhfU1RBTExfV1JJVEUgPSAxIDw8IDIsCisKKyAgICAvKgorICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMjU4OgorICAgICAqCisgICAgICogICAgICJEdWUgdG8gYW4gSFcgaXNzdWUgZHJpdmVyIG5lZWRzIHRvIHNlbmQgYSBwaXBlIGNvbnRyb2wgd2l0aCBzdGFsbAorICAgICAqICAgICAgd2hlbiBldmVyIHRoZXJlIGlzIHN0YXRlIGNoYW5nZSBpbiBkZXB0aCBiaWFzIHJlbGF0ZWQgc3RhdGUiCisgICAgICovCisgICAgSU5URUxfQ01EX1dBX0dFTjdfUE9TVF9DT01NQU5EX0NTX1NUQUxMID0gMSA8PCAzLAorCisgICAgLyoKKyAgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDI3NjoKKyAgICAgKgorICAgICAqICAgICAiVGhlIGRyaXZlciBtdXN0IG1ha2Ugc3VyZSBhIFBJUEVfQ09OVFJPTCB3aXRoIHRoZSBEZXB0aCBTdGFsbAorICAgICAqICAgICAgRW5hYmxlIGJpdCBzZXQgYWZ0ZXIgYWxsIHRoZSBmb2xsb3dpbmcgc3RhdGVzIGFyZSBwcm9ncmFtbWVkOgorICAgICAqCisgICAgICogICAgICAgLSAzRFNUQVRFX1BTCisgICAgICogICAgICAgLSAzRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX0NDCisgICAgICogICAgICAgLSAzRFNUQVRFX0NPTlNUQU5UX1BTCisgICAgICogICAgICAgLSAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNfUFMKKyAgICAgKiAgICAgICAtIDNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19QUworICAgICAqICAgICAgIC0gM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUworICAgICAqICAgICAgIC0gM0RTVEFURV9CTEVORF9TVEFURV9QT0lOVEVSUworICAgICAqICAgICAgIC0gM0RTVEFURV9ERVBUSF9TVEVOQ0lMX1NUQVRFX1BPSU5URVJTIgorICAgICAqLworICAgIElOVEVMX0NNRF9XQV9HRU43X1BPU1RfQ09NTUFORF9ERVBUSF9TVEFMTCA9IDEgPDwgNCwKK307CisKK2VudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHsKKyAgICBJTlRFTF9DTURfV1JJVEVSX0JBVENILAorICAgIElOVEVMX0NNRF9XUklURVJfU1VSRkFDRSwKKyAgICBJTlRFTF9DTURfV1JJVEVSX1NUQVRFLAorICAgIElOVEVMX0NNRF9XUklURVJfSU5TVFJVQ1RJT04sCisKKyAgICBJTlRFTF9DTURfV1JJVEVSX0NPVU5ULAorfTsKKworZW51bSBpbnRlbF91c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSB7CisgICAgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfVklFV1BPUlQgICAgICAgICAgICAgICAgICA9ICgxIDw8IDApLAorICAgIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NDSVNTT1IgICAgICAgICAgICAgICAgICAgPSAoMSA8PCAxKSwKKyAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19MSU5FX1dJRFRIICAgICAgICAgICAgICAgID0gKDEgPDwgMiksCisgICAgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfREVQVEhfQklBUyAgICAgICAgICAgICAgICA9ICgxIDw8IDMpLAorICAgIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX0JMRU5EX0NPTlNUQU5UUyAgICAgICAgICAgPSAoMSA8PCA0KSwKKyAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19ERVBUSF9CT1VORFMgICAgICAgICAgICAgID0gKDEgPDwgNSksCisgICAgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfU1RFTkNJTF9DT01QQVJFX01BU0sgICAgICA9ICgxIDw8IDYpLAorICAgIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NURU5DSUxfV1JJVEVfTUFTSyAgICAgICAgPSAoMSA8PCA3KSwKKyAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX1JFRkVSRU5DRSAgICAgICAgID0gKDEgPDwgOCkKK307CisKK3N0cnVjdCBpbnRlbF9jbWRfc2hhZGVyX2NhY2hlIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCB2b2lkICpzaGFkZXI7CisgICAgICAgIHVpbnQzMl90IGtlcm5lbF9vZmZzZXQ7CisgICAgfSAqZW50cmllczsKKworICAgIHVpbnQzMl90IGNvdW50OworICAgIHVpbnQzMl90IHVzZWQ7Cit9OworCitzdHJ1Y3QgaW50ZWxfY21kX2RzZXRfZGF0YSB7CisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpzZXRfb2Zmc2V0czsKKyAgICB1aW50MzJfdCBzZXRfb2Zmc2V0X2NvdW50OworCisgICAgdWludDMyX3QgKmR5bmFtaWNfb2Zmc2V0czsKKyAgICB1aW50MzJfdCBkeW5hbWljX29mZnNldF9jb3VudDsKK307CisKKy8qCisgKiBTdGF0ZXMgYm91bmRlZCB0byB0aGUgY29tbWFuZCBidWZmZXIuICBXZSB3YW50IHRvIHdyaXRlIHN0YXRlcyBkaXJlY3RseSB0bworICogdGhlIGNvbW1hbmQgYnVmZmVyIHdoZW4gcG9zc2libGUsIGFuZCByZWR1Y2UgdGhpcyBzdHJ1Y3QuCisgKi8KK3N0cnVjdCBpbnRlbF9jbWRfYmluZCB7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9tZXRhICptZXRhOworCisgICAgc3RydWN0IGludGVsX2NtZF9zaGFkZXJfY2FjaGUgc2hhZGVyX2NhY2hlOworCisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpncmFwaGljczsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpjb21wdXRlOworCisgICAgICAgIHVpbnQzMl90IHZzX29mZnNldDsKKyAgICAgICAgdWludDMyX3QgdGNzX29mZnNldDsKKyAgICAgICAgdWludDMyX3QgdGVzX29mZnNldDsKKyAgICAgICAgdWludDMyX3QgZ3Nfb2Zmc2V0OworICAgICAgICB1aW50MzJfdCBmc19vZmZzZXQ7CisgICAgICAgIHVpbnQzMl90IGNzX29mZnNldDsKKyAgICB9IHBpcGVsaW5lOworCisgICAgc3RydWN0IHsKKyAgICAgICAgVmtGbGFncyB1c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZTsKKyAgICAgICAgc3RydWN0IGludGVsX2R5bmFtaWNfdmlld3BvcnQgdmlld3BvcnQ7CisgICAgICAgIHN0cnVjdCBpbnRlbF9keW5hbWljX2xpbmVfd2lkdGggbGluZV93aWR0aDsKKyAgICAgICAgc3RydWN0IGludGVsX2R5bmFtaWNfZGVwdGhfYmlhcyBkZXB0aF9iaWFzOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZHluYW1pY19ibGVuZCBibGVuZDsKKyAgICAgICAgc3RydWN0IGludGVsX2R5bmFtaWNfZGVwdGhfYm91bmRzIGRlcHRoX2JvdW5kczsKKyAgICAgICAgc3RydWN0IGludGVsX2R5bmFtaWNfc3RlbmNpbCBzdGVuY2lsOworICAgIH0gc3RhdGU7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kX2RzZXRfZGF0YSBncmFwaGljc19kYXRhOworICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kX2RzZXRfZGF0YSBjb21wdXRlX2RhdGE7CisgICAgfSBkc2V0OworCisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2J1ZiAqYnVmW0lOVEVMX01BWF9WRVJURVhfQklORElOR19DT1VOVF07CisgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXRbSU5URUxfTUFYX1ZFUlRFWF9CSU5ESU5HX0NPVU5UXTsKKyAgICB9IHZlcnRleDsKKworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9idWYgKmJ1ZjsKKyAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldDsKKyAgICAgICAgVmtJbmRleFR5cGUgdHlwZTsKKyAgICB9IGluZGV4OworCisKKyAgICBib29sIHJlbmRlcl9wYXNzX2NoYW5nZWQ7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICpyZW5kZXJfcGFzczsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3Nfc3VicGFzcyAqcmVuZGVyX3Bhc3Nfc3VicGFzczsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZmIgKmZiOworICAgIFZrU3VicGFzc0NvbnRlbnRzIHJlbmRlcl9wYXNzX2NvbnRlbnRzOworCisgICAgdWludDMyX3QgZHJhd19jb3VudDsKKyAgICB1aW50MzJfdCB3YV9mbGFnczsKK307CisKK3N0cnVjdCBpbnRlbF9jbWRfd3JpdGVyIHsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvOworICAgIHZvaWQgKnB0cjsKKworICAgIHNpemVfdCB1c2VkOworCisgICAgdWludDMyX3Qgc2JhX29mZnNldDsKKworICAgIC8qIGZvciBkZWNvZGluZyAqLworICAgIHN0cnVjdCBpbnRlbF9jbWRfaXRlbSAqaXRlbXM7CisgICAgdWludDMyX3QgaXRlbV9hbGxvYzsKKyAgICB1aW50MzJfdCBpdGVtX3VzZWQ7Cit9OworCitzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldjsKKworICAgIHVpbnQzMl90IHF1ZXVlX2ZhbWlseV9pbmRleDsKKyAgICB1aW50MzJfdCBjcmVhdGVfZmxhZ3M7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqaW50ZWxfY21kX3Bvb2woVmtDb21tYW5kUG9vbCBwb29sKQoreworICAgIHJldHVybiAqKHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqKikgJnBvb2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2NtZF9wb29sICppbnRlbF9jbWRfcG9vbF9mcm9tX2Jhc2Uoc3RydWN0IGludGVsX2Jhc2UgKmJhc2UpCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgKikgYmFzZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgKmludGVsX2NtZF9wb29sX2Zyb21fb2JqKHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqKSAmb2JqLT5iYXNlOworfQorCitWa1Jlc3VsdCBpbnRlbF9jbWRfcG9vbF9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWRfcG9vbCAqKmNtZF9wb29sX3JldCk7Cit2b2lkIGludGVsX2NtZF9wb29sX2Rlc3Ryb3koc3RydWN0IGludGVsX2NtZF9wb29sICpwb29sKTsKKwordm9pZCBpbnRlbF9mcmVlX2NtZF9idWZmZXJzKAorICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kX3Bvb2wgICAgICAgICAgICAgICpjbWRfcG9vbCwKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICpjbWRfYnVmcyk7CisKK3N0cnVjdCBpbnRlbF9jbWQgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgc3RydWN0IGludGVsX2RldiAqZGV2OworICAgIHN0cnVjdCBpbnRlbF9ibyAqc2NyYXRjaF9ibzsKKyAgICBib29sIHByaW1hcnk7CisgICAgaW50IHBpcGVsaW5lX3NlbGVjdDsKKworICAgIHN0cnVjdCBpbnRlbF9jbWRfcmVsb2MgKnJlbG9jczsKKyAgICB1aW50MzJfdCByZWxvY19jb3VudDsKKworICAgIFZrRmxhZ3MgZmxhZ3M7CisKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciB3cml0ZXJzW0lOVEVMX0NNRF9XUklURVJfQ09VTlRdOworCisgICAgdWludDMyX3QgcmVsb2NfdXNlZDsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX2JpbmQgYmluZDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2NtZCAqaW50ZWxfY21kKFZrQ29tbWFuZEJ1ZmZlciBjbWQpCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfY21kICopIGNtZDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfY21kICppbnRlbF9jbWRfZnJvbV9vYmooc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX2NtZCAqKSBvYmo7Cit9CisKK1ZrUmVzdWx0IGludGVsX2NtZF9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kICoqY21kX3JldCk7Cit2b2lkIGludGVsX2NtZF9kZXN0cm95KHN0cnVjdCBpbnRlbF9jbWQgKmNtZCk7CisKK1ZrUmVzdWx0IGludGVsX2NtZF9iZWdpbihzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEJlZ2luSW5mbyk7CitWa1Jlc3VsdCBpbnRlbF9jbWRfZW5kKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCk7CisKK3ZvaWQgaW50ZWxfY21kX2RlY29kZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIGJvb2wgZGVjb2RlX2luc3Rfd3JpdGVyKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfYm8gKmludGVsX2NtZF9nZXRfYmF0Y2goY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplICp1c2VkKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfd3JpdGVyICp3cml0ZXIgPQorICAgICAgICAmY21kLT53cml0ZXJzW0lOVEVMX0NNRF9XUklURVJfQkFUQ0hdOworCisgICAgaWYgKHVzZWQpCisgICAgICAgICp1c2VkID0gd3JpdGVyLT51c2VkOworCisgICAgcmV0dXJuIHdyaXRlci0+Ym87Cit9CisKKyNlbmRpZiAvKiBDTURfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NtZF9iYXJyaWVyLmMgYi9pY2QvaW50ZWwvY21kX2JhcnJpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmQzMjVhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NtZF9iYXJyaWVyLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImdlbmh3L2dlbmh3LmgiCisjaW5jbHVkZSAiaW1nLmgiCisjaW5jbHVkZSAiYnVmLmgiCisjaW5jbHVkZSAiY21kX3ByaXYuaCIKKworZW51bSB7CisgICAgUkVBRF9PUCAgICAgICAgICA9IDEgPDwgMCwKKyAgICBXUklURV9PUCAgICAgICAgID0gMSA8PCAxLAorICAgIEhJWl9PUCAgICAgICAgICAgPSAxIDw8IDIsCit9OworCitlbnVtIHsKKyAgICBNRU1fQ0FDSEUgICAgICAgID0gMSA8PCAwLAorICAgIERBVEFfUkVBRF9DQUNIRSAgPSAxIDw8IDEsCisgICAgREFUQV9XUklURV9DQUNIRSA9IDEgPDwgMiwKKyAgICBSRU5ERVJfQ0FDSEUgICAgID0gMSA8PCAzLAorICAgIFNBTVBMRVJfQ0FDSEUgICAgPSAxIDw8IDQsCit9OworCitzdGF0aWMgdWludDMyX3QgaW1nX2dldF9sYXlvdXRfb3BzKGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBsYXlvdXQpCit7CisgICAgdWludDMyX3Qgb3BzOworCisgICAgc3dpdGNoICgoaW50KSBsYXlvdXQpIHsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOgorICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUjoKKyAgICAgICAgb3BzID0gUkVBRF9PUCB8IFdSSVRFX09QOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgIG9wcyA9IFJFQURfT1AgfCBXUklURV9PUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgIG9wcyA9IFJFQURfT1AgfCBXUklURV9PUCB8IEhJWl9PUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDoKKyAgICAgICAgb3BzID0gUkVBRF9PUCB8IEhJWl9PUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMOgorICAgICAgICBvcHMgPSBSRUFEX09QOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTDoKKyAgICAgICAgb3BzID0gUkVBRF9PUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUw6CisgICAgICAgIG9wcyA9IFdSSVRFX09QOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgb3BzID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIG9wczsKK30KKworc3RhdGljIHVpbnQzMl90IGltZ19nZXRfbGF5b3V0X2NhY2hlcyhjb25zdCBzdHJ1Y3QgaW50ZWxfaW1nICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBsYXlvdXQpCit7CisgICAgdWludDMyX3QgY2FjaGVzOworCisgICAgc3dpdGNoICgoaW50KSBsYXlvdXQpIHsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMOgorICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1BSRVNFTlRfU1JDX0tIUjoKKyAgICAgICAgLy8gR2VuZXJhbCBsYXlvdXQgd2hlbiBpbWFnZSBjYW4gYmUgdXNlZCBmb3IgYW55IGtpbmQgb2YgYWNjZXNzCisgICAgICAgIGNhY2hlcyA9IE1FTV9DQUNIRSB8IERBVEFfUkVBRF9DQUNIRSB8IERBVEFfV1JJVEVfQ0FDSEUgfCBSRU5ERVJfQ0FDSEUgfCBTQU1QTEVSX0NBQ0hFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgIC8vIE9wdGltYWwgbGF5b3V0IHdoZW4gaW1hZ2UgaXMgb25seSB1c2VkIGZvciBjb2xvciBhdHRhY2htZW50IHJlYWQvd3JpdGUKKyAgICAgICAgY2FjaGVzID0gREFUQV9XUklURV9DQUNIRSB8IFJFTkRFUl9DQUNIRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX09QVElNQUw6CisgICAgICAgIC8vIE9wdGltYWwgbGF5b3V0IHdoZW4gaW1hZ2UgaXMgb25seSB1c2VkIGZvciBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgcmVhZC93cml0ZQorICAgICAgICBjYWNoZXMgPSBEQVRBX1dSSVRFX0NBQ0hFIHwgUkVOREVSX0NBQ0hFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOgorICAgICAgICAvLyBPcHRpbWFsIGxheW91dCB3aGVuIGltYWdlIGlzIHVzZWQgZm9yIHJlYWQgb25seSBkZXB0aC9zdGVuY2lsIGF0dGFjaG1lbnQgYW5kIHNoYWRlciBhY2Nlc3MKKyAgICAgICAgY2FjaGVzID0gUkVOREVSX0NBQ0hFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9TSEFERVJfUkVBRF9PTkxZX09QVElNQUw6CisgICAgICAgIC8vIE9wdGltYWwgbGF5b3V0IHdoZW4gaW1hZ2UgaXMgdXNlZCBmb3IgcmVhZCBvbmx5IHNoYWRlciBhY2Nlc3MKKyAgICAgICAgY2FjaGVzID0gREFUQV9SRUFEX0NBQ0hFIHwgU0FNUExFUl9DQUNIRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUw6CisgICAgICAgIC8vIE9wdGltYWwgbGF5b3V0IHdoZW4gaW1hZ2UgaXMgdXNlZCBvbmx5IGFzIHNvdXJjZSBvZiB0cmFuc2ZlciBvcGVyYXRpb25zCisgICAgICAgIGNhY2hlcyA9IE1FTV9DQUNIRSB8IERBVEFfUkVBRF9DQUNIRSB8IFJFTkRFUl9DQUNIRSB8IFNBTVBMRVJfQ0FDSEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMOgorICAgICAgICAvLyBPcHRpbWFsIGxheW91dCB3aGVuIGltYWdlIGlzIHVzZWQgb25seSBhcyBkZXN0aW5hdGlvbiBvZiB0cmFuc2ZlciBvcGVyYXRpb25zCisgICAgICAgIGNhY2hlcyA9IE1FTV9DQUNIRSB8IERBVEFfV1JJVEVfQ0FDSEUgfCBSRU5ERVJfQ0FDSEU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNhY2hlcyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjYWNoZXM7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9yZXNvbHZlX2RlcHRoKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgb2xkX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VMYXlvdXQgbmV3X2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpyYW5nZSkKK3sKKyAgICBjb25zdCB1aW50MzJfdCBvbGRfb3BzID0gaW1nX2dldF9sYXlvdXRfb3BzKGltZywgb2xkX2xheW91dCk7CisgICAgY29uc3QgdWludDMyX3QgbmV3X29wcyA9IGltZ19nZXRfbGF5b3V0X29wcyhpbWcsIG5ld19sYXlvdXQpOworCisgICAgaWYgKG9sZF9vcHMgJiBXUklURV9PUCkgeworICAgICAgICBpZiAoKG9sZF9vcHMgJiBISVpfT1ApICYmICEobmV3X29wcyAmIEhJWl9PUCkpCisgICAgICAgICAgICBjbWRfbWV0YV9kc19vcChjbWQsIElOVEVMX0NNRF9NRVRBX0RTX1JFU09MVkUsIGltZywgcmFuZ2UpOworICAgICAgICBlbHNlIGlmICghKG9sZF9vcHMgJiBISVpfT1ApICYmIChuZXdfb3BzICYgSElaX09QKSkKKyAgICAgICAgICAgIGNtZF9tZXRhX2RzX29wKGNtZCwgSU5URUxfQ01EX01FVEFfRFNfSElaX1JFU09MVkUsIGltZywgcmFuZ2UpOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IGNtZF9nZXRfZmx1c2hfZmxhZ3MoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2NhY2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5ld19jYWNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RzKQoreworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKworICAgIC8qIG5vdCBkaXJ0eSAqLworICAgIGlmICghKG9sZF9jYWNoZXMgJiAoTUVNX0NBQ0hFIHwgUkVOREVSX0NBQ0hFIHwgREFUQV9XUklURV9DQUNIRSkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICgob2xkX2NhY2hlcyAmIFJFTkRFUl9DQUNIRSkgJiYgKG5ld19jYWNoZXMgJiB+UkVOREVSX0NBQ0hFKSkgeworICAgICAgICBpZiAoaXNfZHMpCisgICAgICAgICAgICBmbGFncyB8PSBHRU42X1BJUEVfQ09OVFJPTF9ERVBUSF9DQUNIRV9GTFVTSDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZ3MgfD0gR0VONl9QSVBFX0NPTlRST0xfUkVOREVSX0NBQ0hFX0ZMVVNIOworICAgIH0KKworICAgIGlmICgob2xkX2NhY2hlcyAmIERBVEFfV1JJVEVfQ0FDSEUpICYmCisgICAgICAgIChuZXdfY2FjaGVzICYgfihEQVRBX1JFQURfQ0FDSEUgfCBEQVRBX1dSSVRFX0NBQ0hFKSkpIHsKKyAgICAgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpCisgICAgICAgICAgICBmbGFncyB8PSBHRU43X1BJUEVfQ09OVFJPTF9EQ19GTFVTSDsKKyAgICB9CisKKyAgICBpZiAobmV3X2NhY2hlcyAmIFNBTVBMRVJfQ0FDSEUpCisgICAgICAgIGZsYWdzIHw9IEdFTjZfUElQRV9DT05UUk9MX1RFWFRVUkVfQ0FDSEVfSU5WQUxJREFURTsKKworICAgIGlmICgobmV3X2NhY2hlcyAmIERBVEFfUkVBRF9DQUNIRSkgJiYgb2xkX2NhY2hlcyAhPSBEQVRBX1dSSVRFX0NBQ0hFKQorICAgICAgICBmbGFncyB8PSBHRU42X1BJUEVfQ09OVFJPTF9DT05TVEFOVF9DQUNIRV9JTlZBTElEQVRFOworCisgICAgaWYgKCFmbGFncykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmbGFncyB8PSBHRU42X1BJUEVfQ09OVFJPTF9DU19TVEFMTDsKKworICAgIHJldHVybiBmbGFnczsKK30KKworc3RhdGljIHZvaWQgY21kX21lbW9yeV9iYXJyaWVycyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsdXNoX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZW1fYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiBtZW1fYmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9tZW1fYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiBidWZfbWVtX2JhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWFnZV9tZW1fYmFycmllcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqIGltYWdlX21lbV9iYXJyaWVycykKK3sKKyAgICB1aW50MzJfdCBpOworICAgIFZrRmxhZ3MgaW5wdXRfbWFzayA9IDA7CisgICAgVmtGbGFncyBvdXRwdXRfbWFzayA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVtX2JhcnJpZXJfY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIgKmIgPSAmbWVtX2JhcnJpZXJzW2ldOworICAgICAgICBhc3NlcnQoYi0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0JBUlJJRVIpOworICAgICAgICBvdXRwdXRfbWFzayB8PSBiLT5zcmNBY2Nlc3NNYXNrOworICAgICAgICBpbnB1dF9tYXNrICB8PSBiLT5kc3RBY2Nlc3NNYXNrOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBidWZfbWVtX2JhcnJpZXJfY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKmIgPSAmYnVmX21lbV9iYXJyaWVyc1tpXTsKKyAgICAgICAgYXNzZXJ0KGItPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUik7CisgICAgICAgIG91dHB1dF9tYXNrIHw9IGItPnNyY0FjY2Vzc01hc2s7CisgICAgICAgIGlucHV0X21hc2sgIHw9IGItPmRzdEFjY2Vzc01hc2s7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGltYWdlX21lbV9iYXJyaWVyX2NvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKmIgPSAmaW1hZ2VfbWVtX2JhcnJpZXJzW2ldOworICAgICAgICBhc3NlcnQoYi0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfTUVNT1JZX0JBUlJJRVIpOworICAgICAgICBvdXRwdXRfbWFzayB8PSBiLT5zcmNBY2Nlc3NNYXNrOworICAgICAgICBpbnB1dF9tYXNrICB8PSBiLT5kc3RBY2Nlc3NNYXNrOworICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWcgPSBpbnRlbF9pbWcoYi0+aW1hZ2UpOworCisgICAgICAgICAgICBjbWRfcmVzb2x2ZV9kZXB0aChjbWQsIGltZywgYi0+b2xkTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgYi0+bmV3TGF5b3V0LCAmYi0+c3VicmVzb3VyY2VSYW5nZSk7CisKKyAgICAgICAgICAgIGZsdXNoX2ZsYWdzIHw9IGNtZF9nZXRfZmx1c2hfZmxhZ3MoY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ19nZXRfbGF5b3V0X2NhY2hlcyhpbWcsIGItPm9sZExheW91dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nX2dldF9sYXlvdXRfY2FjaGVzKGltZywgYi0+bmV3TGF5b3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2RfZm9ybWF0X2lzX2RzKGltZy0+bGF5b3V0LmZvcm1hdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dF9tYXNrICYgVktfQUNDRVNTX1NIQURFUl9XUklURV9CSVQpIHsKKyAgICAgICAgZmx1c2hfZmxhZ3MgfD0gR0VON19QSVBFX0NPTlRST0xfRENfRkxVU0g7CisgICAgfQorICAgIGlmIChvdXRwdXRfbWFzayAmIFZLX0FDQ0VTU19DT0xPUl9BVFRBQ0hNRU5UX1dSSVRFX0JJVCkgeworICAgICAgICBmbHVzaF9mbGFncyB8PSBHRU42X1BJUEVfQ09OVFJPTF9SRU5ERVJfQ0FDSEVfRkxVU0g7CisgICAgfQorICAgIGlmIChvdXRwdXRfbWFzayAmIFZLX0FDQ0VTU19ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfV1JJVEVfQklUKSB7CisgICAgICAgIGZsdXNoX2ZsYWdzIHw9IEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNIOworICAgIH0KKworICAgIC8qIENQVSB3cml0ZSBpcyBjYWNoZSBjb2hlcmVudCwgc28gVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUIG5lZWRzIG5vIGZsdXNoLiAqLworICAgIC8qIE1ldGEgaGFuZGxlcyBmbHVzaGVzLCBzbyBWS19BQ0NFU1NfVFJBTlNGRVJfV1JJVEVfQklUIG5lZWRzIG5vIGZsdXNoLiAqLworCisgICAgaWYgKGlucHV0X21hc2sgJiAoVktfQUNDRVNTX1NIQURFUl9SRUFEX0JJVCB8IFZLX0FDQ0VTU19VTklGT1JNX1JFQURfQklUKSkgeworICAgICAgICBmbHVzaF9mbGFncyB8PSBHRU42X1BJUEVfQ09OVFJPTF9URVhUVVJFX0NBQ0hFX0lOVkFMSURBVEU7CisgICAgfQorCisgICAgaWYgKGlucHV0X21hc2sgJiBWS19BQ0NFU1NfVU5JRk9STV9SRUFEX0JJVCkgeworICAgICAgICBmbHVzaF9mbGFncyB8PSBHRU42X1BJUEVfQ09OVFJPTF9DT05TVEFOVF9DQUNIRV9JTlZBTElEQVRFOworICAgIH0KKworICAgIGlmIChpbnB1dF9tYXNrICYgVktfQUNDRVNTX1ZFUlRFWF9BVFRSSUJVVEVfUkVBRF9CSVQpIHsKKyAgICAgICAgZmx1c2hfZmxhZ3MgfD0gR0VONl9QSVBFX0NPTlRST0xfVkZfQ0FDSEVfSU5WQUxJREFURTsKKyAgICB9CisKKyAgICAvKiBUaGVzZSBiaXRzIGhhdmUgbm8gY29ycmVzcG9uZGluZyBjYWNoZSBpbnZhbGlkYXRlIG9wZXJhdGlvbi4KKyAgICAgKiBWS19BQ0NFU1NfSE9TVF9SRUFEX0JJVAorICAgICAqIFZLX0FDQ0VTU19JTkRJUkVDVF9DT01NQU5EX1JFQURfQklUCisgICAgICogVktfQUNDRVNTX0lOREVYX1JFQURfQklUCisgICAgICogVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfUkVBRF9CSVQKKyAgICAgKiBWS19BQ0NFU1NfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX1JFQURfQklUCisgICAgICogVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklUCisgICAgICovCisKKyAgICBjbWRfYmF0Y2hfZmx1c2goY21kLCBmbHVzaF9mbGFncyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kV2FpdEV2ZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50LAorICAgIGNvbnN0IFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50cywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVN0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICAgLyogVGhpcyBoYXJkd2FyZSB3aWxsIGFsd2F5cyB3YWl0IGF0IFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFLgorICAgICAqIFBhc3NpbmcgYSBzdGFnZU1hc2sgc3BlY2lmeWluZyBvdGhlciBzdGFnZXMKKyAgICAgKiBkb2VzIG5vdCBjaGFuZ2UgdGhhdC4KKyAgICAgKi8KKworICAgIC8qIEJlY2F1c2UgdGhlIGNvbW1hbmQgYnVmZmVyIGlzIHNlcmlhbGl6ZWQsIHJlYWNoaW5nCisgICAgICogYSBwaXBlbGluZWQgd2FpdCBpcyBhbHdheXMgYWZ0ZXIgY29tcGxldGlvbiBvZiBwcmlvciBldmVudHMuCisgICAgICogcFdhaXRJbmZvLT5wRXZlbnRzIG5lZWQgbm90IGJlIGV4YW1pbmVkLgorICAgICAqIHZrQ21kV2FpdEV2ZW50cyBpcyBlcXVpdmFsZW50IHRvIG1lbW9yeSBiYXJyaWVyIHBhcnQgb2YgdmtDbWRQaXBlbGluZUJhcnJpZXIuCisgICAgICogY21kX21lbW9yeV9iYXJyaWVycyB3aWxsIHdhaXQgZm9yIEdFTjZfUElQRV9DT05UUk9MX0NTX1NUQUxMIGFuZCBwZXJmb3JtCisgICAgICogYXBwcm9wcmlhdGUgY2FjaGUgY29udHJvbC4KKyAgICAgKi8KKyAgICBjbWRfbWVtb3J5X2JhcnJpZXJzKGNtZCwgR0VONl9QSVBFX0NPTlRST0xfQ1NfU1RBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRQaXBlbGluZUJhcnJpZXIoCisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgICAgICBWa0RlcGVuZGVuY3lGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lGbGFncywKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHVpbnQzMl90IHBpcGVfY29udHJvbF9mbGFncyA9IDA7CisKKyAgICAvKiBUaGlzIGhhcmR3YXJlIHdpbGwgYWx3YXlzIHdhaXQgYXQgVktfV0FJVF9FVkVOVF9UT1BfT0ZfUElQRS4KKyAgICAgKiBQYXNzaW5nIGEgc3RhZ2VNYXNrIHNwZWNpZnlpbmcgb3RoZXIgc3RhZ2VzCisgICAgICogZG9lcyBub3QgY2hhbmdlIHRoYXQuCisgICAgICovCisKKyAgICAvKiBDYWNoZSBjb250cm9sIGlzIGRvbmUgd2l0aCBQSVBFX0NPTlRST0wgZmxhZ3MuCisgICAgICogV2l0aCBubyBHRU42X1BJUEVfQ09OVFJPTF9DU19TVEFMTCBmbGFnIHNldCwgaXQgYmVoYXZlcyBhcyBWS19QSVBFX0VWRU5UX1RPUF9PRl9QSVBFLgorICAgICAqIEFsbCBvdGhlciBwRXZlbnRzIHZhbHVlcyB3aWxsIGJlaGF2ZSBhcyBWS19QSVBFX0VWRU5UX0NPTU1BTkRTX0NPTVBMRVRFLgorICAgICAqLworCisgICAgaWYgKChzcmNTdGFnZU1hc2sgJiB+VktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQpIHx8CisgICAgICAgIChkc3RTdGFnZU1hc2sgJiB+VktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQpKXsKKyAgICAgICAgcGlwZV9jb250cm9sX2ZsYWdzID0gR0VONl9QSVBFX0NPTlRST0xfQ1NfU1RBTEw7CisgICAgfQorCisgICAgLyogY21kX21lbW9yeV9iYXJyaWVycyBjYW4gd2FpdCBmb3IgR0VONl9QSVBFX0NPTlRST0xfQ1NfU1RBTEwgYW5kIHBlcmZvcm0KKyAgICAgKiBhcHByb3ByaWF0ZSBjYWNoZSBjb250cm9sLgorICAgICAqLworICAgIGNtZF9tZW1vcnlfYmFycmllcnMoY21kLCBwaXBlX2NvbnRyb2xfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jbWRfZGVjb2RlLmMgYi9pY2QvaW50ZWwvY21kX2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjVjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY21kX2RlY29kZS5jCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImNvbXBpbGVyL3BpcGVsaW5lL3BpcGVsaW5lX2NvbXBpbGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImdlbmh3L2dlbmh3LmgiCisjaW5jbHVkZSAia21kL3dpbnN5cy5oIgorI2luY2x1ZGUgImNtZF9wcml2LmgiCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCAqCit3cml0ZXJfcG9pbnRlcihjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIG9mZnNldCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1t3aGljaF07CisgICAgcmV0dXJuIChjb25zdCB1aW50MzJfdCAqKSAoKGNvbnN0IGNoYXIgKikgd3JpdGVyLT5wdHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdWludDMyX3QKK3dyaXRlcl9kdyhjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBkd19pbmRleCwKKyAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICBjb25zdCB1aW50MzJfdCAqZHcgPSB3cml0ZXJfcG9pbnRlcihjbWQsIHdoaWNoLCBvZmZzZXQpOworICAgIHZhX2xpc3QgYXA7CisgICAgY2hhciBkZXNjWzE2XTsKKyAgICBpbnQgbGVuOworCisgICAgZnByaW50ZihzdGRlcnIsICIweCUwOHg6ICAgICAgMHglMDh4OiAiLAorICAgICAgICAgICAgb2Zmc2V0ICsgKGR3X2luZGV4IDw8IDIpLCBkd1tkd19pbmRleF0pOworCisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgbGVuID0gdnNucHJpbnRmKGRlc2MsIHNpemVvZihkZXNjKSwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKworICAgIGlmIChsZW4gPj0gc2l6ZW9mKGRlc2MpKSB7CisgICAgICAgIGxlbiA9IHNpemVvZihkZXNjKSAtIDE7CisgICAgICAgIGRlc2NbbGVuXSA9ICdcMCc7CisgICAgfQorCisgICAgaWYgKGRlc2NbbGVuIC0gMV0gPT0gJ1xuJykgeworICAgICAgICBkZXNjW2xlbiAtIDFdID0gJ1wwJzsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlOHM6IFxuIiwgZGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlOHM6ICIsIGRlc2MpOworICAgIH0KKworICAgIHJldHVybiBkd1tkd19pbmRleF07Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXJfZGVjb2RlX2Jsb2IoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfaXRlbSAqaXRlbSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBzdGF0ZV9zaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBjb25zdCB1bnNpZ25lZCBjb3VudCA9IGl0ZW0tPnNpemUgLyBzdGF0ZV9zaXplOworICAgIHVuc2lnbmVkIG9mZnNldCA9IGl0ZW0tPm9mZnNldDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgKmR3ID0gd3JpdGVyX3BvaW50ZXIoY21kLCB3aGljaCwgb2Zmc2V0KTsKKworICAgICAgICB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAwLCAiQkxPQiVkIiwgaSAvIDQpOworCisgICAgICAgIHN3aXRjaCAoY291bnQgLSBpKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKCUxMC40ZiwgJTEwYywgJTEwYywgJTEwYykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDh4LCAlMTBjLCAlMTBjLCAlMTBjKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X3VpZihkd1swXSksICdYJywgJ1gnLCAnWCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdbMF0sICAgICAgICAnWCcsICdYJywgJ1gnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiglMTAuNGYsICUxMC40ZiwgJTEwYywgJTEwYykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDh4LCAweCUwOHgsICUxMGMsICUxMGMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfdWlmKGR3WzBdKSwgdV91aWYoZHdbMV0pLCAnWCcsICdYJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1swXSwgICAgICAgIGR3WzFdLCAgJ1gnLCAnWCcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKCUxMC40ZiwgJTEwLjRmLCAlMTAuNGYsICUxMGMpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDB4JTA4eCwgMHglMDh4LCAweCUwOHgsICUxMGMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfdWlmKGR3WzBdKSwgdV91aWYoZHdbMV0pLCB1X3VpZihkd1syXSksICdYJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1swXSwgICAgICAgIGR3WzFdLCAgICAgICAgZHdbMl0sICAnWCcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiglMTAuNGYsICUxMC40ZiwgJTEwLjRmLCAlMTAuNGYpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDB4JTA4eCwgMHglMDh4LCAweCUwOHgsIDB4JTA4eClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV91aWYoZHdbMF0pLCB1X3VpZihkd1sxXSksIHVfdWlmKGR3WzJdKSwgdV91aWYoZHdbM10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3WzBdLCAgICAgICAgZHdbMV0sICAgICAgICBkd1syXSwgICAgICAgIGR3WzNdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IHN0YXRlX3NpemUgKiA0OworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfY2xpcF92aWV3cG9ydChjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIGNvbnN0IHVuc2lnbmVkIHN0YXRlX3NpemUgPSBzaXplb2YodWludDMyX3QpICogNDsKKyAgICBjb25zdCB1bnNpZ25lZCBjb3VudCA9IGl0ZW0tPnNpemUgLyBzdGF0ZV9zaXplOworICAgIHVuc2lnbmVkIG9mZnNldCA9IGl0ZW0tPm9mZnNldDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgZHc7CisKKyAgICAgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAwLCAiQ0xJUCBWUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAieG1pbiA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMSwgIkNMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInhtYXggPSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgICAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDIsICJDTElQIFZQJWQiLCBpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ5bWluID0gJWZcbiIsIHVfdWlmKGR3KSk7CisKKyAgICAgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAzLCAiQ0xJUCBWUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAieW1heCA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIG9mZnNldCArPSBzdGF0ZV9zaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfc2ZfY2xpcF92aWV3cG9ydF9nZW43KGNvbnN0IHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIGNvbnN0IHVuc2lnbmVkIHN0YXRlX3NpemUgPSBzaXplb2YodWludDMyX3QpICogMTY7CisgICAgY29uc3QgdW5zaWduZWQgY291bnQgPSBpdGVtLT5zaXplIC8gc3RhdGVfc2l6ZTsKKyAgICB1bnNpZ25lZCBvZmZzZXQgPSBpdGVtLT5vZmZzZXQ7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IGR3OworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMCwgIlNGX0NMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0wMCA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMSwgIlNGX0NMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0xMSA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMiwgIlNGX0NMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0yMiA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMywgIlNGX0NMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0zMCA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgNCwgIlNGX0NMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0zMSA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgNSwgIlNGX0NMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0zMiA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgOCwgIlNGX0NMSVAgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1YXJkYmFuZCB4bWluID0gJWZcbiIsIHVfdWlmKGR3KSk7CisKKyAgICAgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCA5LCAiU0ZfQ0xJUCBWUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VhcmRiYW5kIHhtYXggPSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgICAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDEwLCAiU0ZfQ0xJUCBWUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VhcmRiYW5kIHltaW4gPSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgICAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDExLCAiU0ZfQ0xJUCBWUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VhcmRiYW5kIHltYXggPSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgICAgICBvZmZzZXQgKz0gc3RhdGVfc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXJfZGVjb2RlX3NmX3ZpZXdwb3J0X2dlbjYoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfaXRlbSAqaXRlbSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBzdGF0ZV9zaXplID0gc2l6ZW9mKHVpbnQzMl90KSAqIDg7CisgICAgY29uc3QgdW5zaWduZWQgY291bnQgPSBpdGVtLT5zaXplIC8gc3RhdGVfc2l6ZTsKKyAgICB1bnNpZ25lZCBvZmZzZXQgPSBpdGVtLT5vZmZzZXQ7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IGR3OworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMCwgIlNGIFZQJWQiLCBpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtMDAgPSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgICAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDEsICJTRiBWUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibTExID0gJWZcbiIsIHVfdWlmKGR3KSk7CisKKyAgICAgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAyLCAiU0YgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0yMiA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMywgIlNGIFZQJWQiLCBpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtMzAgPSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgICAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDQsICJTRiBWUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibTMxID0gJWZcbiIsIHVfdWlmKGR3KSk7CisKKyAgICAgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCA1LCAiU0YgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm0zMiA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIG9mZnNldCArPSBzdGF0ZV9zaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfc2Zfdmlld3BvcnQoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcpKQorICAgICAgICB3cml0ZXJfZGVjb2RlX3NmX2NsaXBfdmlld3BvcnRfZ2VuNyhjbWQsIHdoaWNoLCBpdGVtKTsKKyAgICBlbHNlCisgICAgICAgIHdyaXRlcl9kZWNvZGVfc2Zfdmlld3BvcnRfZ2VuNihjbWQsIHdoaWNoLCBpdGVtKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfc2Npc3Nvcl9yZWN0KGNvbnN0IHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIGNvbnN0IHVuc2lnbmVkIHN0YXRlX3NpemUgPSBzaXplb2YodWludDMyX3QpICogMjsKKyAgICBjb25zdCB1bnNpZ25lZCBjb3VudCA9IGl0ZW0tPnNpemUgLyBzdGF0ZV9zaXplOworICAgIHVuc2lnbmVkIG9mZnNldCA9IGl0ZW0tPm9mZnNldDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgZHc7CisKKyAgICAgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAwLCAiU0NJU1NPUiVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAieG1pbiAlZCwgeW1pbiAlZFxuIiwKKyAgICAgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VONl9TQ0lTU09SX0RXMF9NSU5fWCksCisgICAgICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjZfU0NJU1NPUl9EVzBfTUlOX1kpKTsKKworICAgICAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDEsICJTQ0lTU09SJWQiLCBpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ4bWF4ICVkLCB5bWF4ICVkXG4iLAorICAgICAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1NDSVNTT1JfRFcxX01BWF9YKSwKKyAgICAgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VONl9TQ0lTU09SX0RXMV9NQVhfWSkpOworCisgICAgICAgIG9mZnNldCArPSBzdGF0ZV9zaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfY2Nfdmlld3BvcnQoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIGNvbnN0IHVuc2lnbmVkIHN0YXRlX3NpemUgPSBzaXplb2YodWludDMyX3QpICogMjsKKyAgICBjb25zdCB1bnNpZ25lZCBjb3VudCA9IGl0ZW0tPnNpemUgLyBzdGF0ZV9zaXplOworICAgIHVuc2lnbmVkIG9mZnNldCA9IGl0ZW0tPm9mZnNldDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgZHc7CisKKyAgICAgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAwLCAiQ0MgVlAlZCIsIGkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1pbl9kZXB0aCA9ICVmXG4iLCB1X3VpZihkdykpOworCisgICAgICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMSwgIkNDIFZQJWQiLCBpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYXhfZGVwdGggPSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgICAgICBvZmZzZXQgKz0gc3RhdGVfc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXJfZGVjb2RlX2NvbG9yX2NhbGMoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfaXRlbSAqaXRlbSkKK3sKKyAgICB1aW50MzJfdCBkdzsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgMCwgIkNDIik7CisgICAgZnByaW50ZihzdGRlcnIsICJhbHBoYSB0ZXN0IGZvcm1hdCAlcywgcm91bmQgZGlzYWJsZSAlZCwgIgorICAgICAgICAgICAgInN0ZW5jaWwgcmVmICVkLCBiZiBzdGVuY2lsIHJlZiAlZFxuIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X0NDX0RXMF9BTFBIQVRFU1QpID8gIkZMT0FUMzIiIDogIlVOT1JNOCIsCisgICAgICAgICAgICAoYm9vbCkgKGR3ICYgR0VONl9DQ19EVzBfUk9VTkRfRElTQUJMRV9ESVNBQkxFKSwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X0NDX0RXMF9TVEVOQ0lMMF9SRUYpLAorICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjZfQ0NfRFcwX1NURU5DSUwxX1JFRikpOworCisgICAgd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgMSwgIkNDXG4iKTsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgMiwgIkNDIik7CisgICAgZnByaW50ZihzdGRlcnIsICJjb25zdGFudCByZWQgJWZcbiIsIHVfdWlmKGR3KSk7CisKKyAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBpdGVtLT5vZmZzZXQsIDMsICJDQyIpOworICAgIGZwcmludGYoc3RkZXJyLCAiY29uc3RhbnQgZ3JlZW4gJWZcbiIsIHVfdWlmKGR3KSk7CisKKyAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBpdGVtLT5vZmZzZXQsIDQsICJDQyIpOworICAgIGZwcmludGYoc3RkZXJyLCAiY29uc3RhbnQgYmx1ZSAlZlxuIiwgdV91aWYoZHcpKTsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgNSwgIkNDIik7CisgICAgZnByaW50ZihzdGRlcnIsICJjb25zdGFudCBhbHBoYSAlZlxuIiwgdV91aWYoZHcpKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfZGVwdGhfc3RlbmNpbChjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIHVpbnQzMl90IGR3OworCisgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCAwLCAiRF9TIik7CisgICAgZnByaW50ZihzdGRlcnIsICJzdGVuY2lsICVzYWJsZSwgZnVuYyAlZCwgd3JpdGUgJXNhYmxlXG4iLAorICAgICAgICAgICAgKGR3ICYgR0VONl9aU19EVzBfU1RFTkNJTF9URVNUX0VOQUJMRSkgPyAiZW4iIDogImRpcyIsCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VONl9aU19EVzBfU1RFTkNJTDBfRlVOQyksCisgICAgICAgICAgICAoZHcgJiBHRU42X1pTX0RXMF9TVEVOQ0lMX1dSSVRFX0VOQUJMRSkgPyAiZW4iIDogImRpcyIpOworCisgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCAxLCAiRF9TIik7CisgICAgZnByaW50ZihzdGRlcnIsICJzdGVuY2lsIHRlc3QgbWFzayAweCV4LCB3cml0ZSBtYXNrIDB4JXhcbiIsCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VONl9aU19EVzFfU1RFTkNJTDBfVkFMVUVNQVNLKSwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1pTX0RXMV9TVEVOQ0lMMF9XUklURU1BU0spKTsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgMiwgIkRfUyIpOworICAgIGZwcmludGYoc3RkZXJyLCAiZGVwdGggdGVzdCAlc2FibGUsIGZ1bmMgJWQsIHdyaXRlICVzYWJsZVxuIiwKKyAgICAgICAgICAgIChkdyAmIEdFTjZfWlNfRFcyX0RFUFRIX1RFU1RfRU5BQkxFKSA/ICJlbiIgOiAiZGlzIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1pTX0RXMl9ERVBUSF9GVU5DKSwKKyAgICAgICAgICAgIChkdyAmIEdFTjZfWlNfRFcyX0RFUFRIX1dSSVRFX0VOQUJMRSkgPyAiZW4iIDogImRpcyIpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVyX2RlY29kZV9ibGVuZChjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX2l0ZW0gKml0ZW0pCit7CisgICAgY29uc3QgdW5zaWduZWQgc3RhdGVfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKiAyOworICAgIGNvbnN0IHVuc2lnbmVkIGNvdW50ID0gaXRlbS0+c2l6ZSAvIHN0YXRlX3NpemU7CisgICAgdW5zaWduZWQgb2Zmc2V0ID0gaXRlbS0+b2Zmc2V0OworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAwLCAiQkxFTkQlZFxuIiwgaSk7CisgICAgICAgIHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDEsICJCTEVORCVkXG4iLCBpKTsKKworICAgICAgICBvZmZzZXQgKz0gc3RhdGVfc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXJfZGVjb2RlX3NhbXBsZXIoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfaXRlbSAqaXRlbSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBzdGF0ZV9zaXplID0gc2l6ZW9mKHVpbnQzMl90KSAqIDQ7CisgICAgY29uc3QgdW5zaWduZWQgY291bnQgPSBpdGVtLT5zaXplIC8gc3RhdGVfc2l6ZTsKKyAgICB1bnNpZ25lZCBvZmZzZXQgPSBpdGVtLT5vZmZzZXQ7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDAsICJXTSBTQU1QJWQiLCBpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmaWx0ZXJpbmdcbiIpOworCisgICAgICAgIHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBvZmZzZXQsIDEsICJXTSBTQU1QJWQiLCBpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3cmFwcGluZywgbG9kXG4iKTsKKworICAgICAgICB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAyLCAiV00gU0FNUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmYXVsdCBjb2xvciBwb2ludGVyXG4iKTsKKworICAgICAgICB3cml0ZXJfZHcoY21kLCB3aGljaCwgb2Zmc2V0LCAzLCAiV00gU0FNUCVkIiwgaSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2hyb21hIGtleSwgYW5pc29cbiIpOworCisgICAgICAgIG9mZnNldCArPSBzdGF0ZV9zaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfc3VyZmFjZV9nZW43KGNvbnN0IHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIHVpbnQzMl90IGR3OworCisgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCAwLCAiU1VSRiIpOworICAgIGZwcmludGYoc3RkZXJyLCAidHlwZSAweCV4LCBmb3JtYXQgMHgleCwgdGlsaW5nICVkLCAlcyBhcnJheVxuIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU43X1NVUkZBQ0VfRFcwX1RZUEUpLAorICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjdfU1VSRkFDRV9EVzBfRk9STUFUKSwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU43X1NVUkZBQ0VfRFcwX1RJTElORyksCisgICAgICAgICAgICAoZHcgJiBHRU43X1NVUkZBQ0VfRFcwX0lTX0FSUkFZKSA/ICJpcyIgOiAibm90Iik7CisKKyAgICB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCAxLCAiU1VSRiIpOworICAgIGZwcmludGYoc3RkZXJyLCAib2Zmc2V0XG4iKTsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgMiwgIlNVUkYiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVkeCVkIHNpemVcbiIsCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VON19TVVJGQUNFX0RXMl9XSURUSCksCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VON19TVVJGQUNFX0RXMl9IRUlHSFQpKTsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgMywgIlNVUkYiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImRlcHRoICVkLCBwaXRjaCAlZFxuIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU43X1NVUkZBQ0VfRFczX0RFUFRIKSwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU43X1NVUkZBQ0VfRFczX1BJVENIKSk7CisKKyAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBpdGVtLT5vZmZzZXQsIDQsICJTVVJGIik7CisgICAgZnByaW50ZihzdGRlcnIsICJtaW4gYXJyYXkgZWxlbWVudCAlZCwgYXJyYXkgZXh0ZW50ICVkXG4iLAorICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjdfU1VSRkFDRV9EVzRfTUlOX0FSUkFZX0VMRU1FTlQpLAorICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjdfU1VSRkFDRV9EVzRfUlRfVklFV19FWFRFTlQpKTsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgNSwgIlNVUkYiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIm1pcCBiYXNlICVkLCBtaXBzICVkLCB4LHkgb2Zmc2V0OiAlZCwlZFxuIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU43X1NVUkZBQ0VfRFc1X01JTl9MT0QpLAorICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjdfU1VSRkFDRV9EVzVfTUlQX0NPVU5UX0xPRCksCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VON19TVVJGQUNFX0RXNV9YX09GRlNFVCksCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VON19TVVJGQUNFX0RXNV9ZX09GRlNFVCkpOworCisgICAgd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgNiwgIlNVUkZcbiIpOworICAgIHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBpdGVtLT5vZmZzZXQsIDcsICJTVVJGXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfc3VyZmFjZV9nZW42KGNvbnN0IHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIHVpbnQzMl90IGR3OworCisgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCAwLCAiU1VSRiIpOworICAgIGZwcmludGYoc3RkZXJyLCAidHlwZSAweCV4LCBmb3JtYXQgMHgleFxuIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1NVUkZBQ0VfRFcwX1RZUEUpLAorICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjZfU1VSRkFDRV9EVzBfRk9STUFUKSk7CisKKyAgICB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCAxLCAiU1VSRiIpOworICAgIGZwcmludGYoc3RkZXJyLCAib2Zmc2V0XG4iKTsKKworICAgIGR3ID0gd3JpdGVyX2R3KGNtZCwgd2hpY2gsIGl0ZW0tPm9mZnNldCwgMiwgIlNVUkYiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVkeCVkIHNpemUsICVkIG1pcHNcbiIsCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VONl9TVVJGQUNFX0RXMl9XSURUSCksCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VONl9TVVJGQUNFX0RXMl9IRUlHSFQpLAorICAgICAgICAgICAgR0VOX0VYVFJBQ1QoZHcsIEdFTjZfU1VSRkFDRV9EVzJfTUlQX0NPVU5UX0xPRCkpOworCisgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCAzLCAiU1VSRiIpOworICAgIGZwcmludGYoc3RkZXJyLCAicGl0Y2ggJWQsIHRpbGluZyAlZFxuIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1NVUkZBQ0VfRFczX1BJVENIKSwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1NVUkZBQ0VfRFczX1RJTElORykpOworCisgICAgZHcgPSB3cml0ZXJfZHcoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0LCA0LCAiU1VSRiIpOworICAgIGZwcmludGYoc3RkZXJyLCAibWlwIGJhc2UgJWRcbiIsCisgICAgICAgICAgICBHRU5fRVhUUkFDVChkdywgR0VONl9TVVJGQUNFX0RXNF9NSU5fTE9EKSk7CisKKyAgICBkdyA9IHdyaXRlcl9kdyhjbWQsIHdoaWNoLCBpdGVtLT5vZmZzZXQsIDUsICJTVVJGIik7CisgICAgZnByaW50ZihzdGRlcnIsICJ4LHkgb2Zmc2V0OiAlZCwlZFxuIiwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1NVUkZBQ0VfRFc1X1hfT0ZGU0VUKSwKKyAgICAgICAgICAgIEdFTl9FWFRSQUNUKGR3LCBHRU42X1NVUkZBQ0VfRFc1X1lfT0ZGU0VUKSk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXJfZGVjb2RlX3N1cmZhY2UoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfaXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkKKyAgICAgICAgd3JpdGVyX2RlY29kZV9zdXJmYWNlX2dlbjcoY21kLCB3aGljaCwgaXRlbSk7CisgICAgZWxzZQorICAgICAgICB3cml0ZXJfZGVjb2RlX3N1cmZhY2VfZ2VuNihjbWQsIHdoaWNoLCBpdGVtKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlcl9kZWNvZGVfYmluZGluZ190YWJsZShjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtKQoreworICAgIGNvbnN0IHVuc2lnbmVkIHN0YXRlX3NpemUgPSBzaXplb2YodWludDMyX3QpICogMTsKKyAgICBjb25zdCB1bnNpZ25lZCBjb3VudCA9IGl0ZW0tPnNpemUgLyBzdGF0ZV9zaXplOworICAgIHVuc2lnbmVkIG9mZnNldCA9IGl0ZW0tPm9mZnNldDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgd3JpdGVyX2R3KGNtZCwgd2hpY2gsIG9mZnNldCwgMCwgIkJJTkQiKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJCSU5ESU5HX1RBQkxFX1NUQVRFWyVkXVxuIiwgaSk7CisKKyAgICAgICAgb2Zmc2V0ICs9IHN0YXRlX3NpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVyX2RlY29kZV9rZXJuZWwoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX2l0ZW0gKml0ZW0pCit7CisgICAgY29uc3Qgdm9pZCAqa2VybmVsID0gKGNvbnN0IHZvaWQgKikKKyAgICAgICAgd3JpdGVyX3BvaW50ZXIoY21kLCB3aGljaCwgaXRlbS0+b2Zmc2V0KTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiMHglMDh6eDpcbiIsIGl0ZW0tPm9mZnNldCk7CisgICAgaW50ZWxfZGlzYXNzZW1ibGVfa2VybmVsKGNtZC0+ZGV2LT5ncHUsIGtlcm5lbCwgaXRlbS0+c2l6ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIHZvaWQgKCpmdW5jKShjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX2l0ZW0gKml0ZW0pOworfSB3cml0ZXJfZGVjb2RlX3RhYmxlW0lOVEVMX0NNRF9JVEVNX0NPVU5UXSA9IHsKKyAgICBbSU5URUxfQ01EX0lURU1fQkxPQl0gICAgICAgICAgICAgICAgPSB7IHdyaXRlcl9kZWNvZGVfYmxvYiB9LAorICAgIFtJTlRFTF9DTURfSVRFTV9DTElQX1ZJRVdQT1JUXSAgICAgICA9IHsgd3JpdGVyX2RlY29kZV9jbGlwX3ZpZXdwb3J0IH0sCisgICAgW0lOVEVMX0NNRF9JVEVNX1NGX1ZJRVdQT1JUXSAgICAgICAgID0geyB3cml0ZXJfZGVjb2RlX3NmX3ZpZXdwb3J0IH0sCisgICAgW0lOVEVMX0NNRF9JVEVNX1NDSVNTT1JfUkVDVF0gICAgICAgID0geyB3cml0ZXJfZGVjb2RlX3NjaXNzb3JfcmVjdCB9LAorICAgIFtJTlRFTF9DTURfSVRFTV9DQ19WSUVXUE9SVF0gICAgICAgICA9IHsgd3JpdGVyX2RlY29kZV9jY192aWV3cG9ydCB9LAorICAgIFtJTlRFTF9DTURfSVRFTV9DT0xPUl9DQUxDXSAgICAgICAgICA9IHsgd3JpdGVyX2RlY29kZV9jb2xvcl9jYWxjIH0sCisgICAgW0lOVEVMX0NNRF9JVEVNX0RFUFRIX1NURU5DSUxdICAgICAgID0geyB3cml0ZXJfZGVjb2RlX2RlcHRoX3N0ZW5jaWwgfSwKKyAgICBbSU5URUxfQ01EX0lURU1fQkxFTkRdICAgICAgICAgICAgICAgPSB7IHdyaXRlcl9kZWNvZGVfYmxlbmQgfSwKKyAgICBbSU5URUxfQ01EX0lURU1fU0FNUExFUl0gICAgICAgICAgICAgPSB7IHdyaXRlcl9kZWNvZGVfc2FtcGxlciB9LAorICAgIFtJTlRFTF9DTURfSVRFTV9TVVJGQUNFXSAgICAgICAgICAgICA9IHsgd3JpdGVyX2RlY29kZV9zdXJmYWNlIH0sCisgICAgW0lOVEVMX0NNRF9JVEVNX0JJTkRJTkdfVEFCTEVdICAgICAgID0geyB3cml0ZXJfZGVjb2RlX2JpbmRpbmdfdGFibGUgfSwKKyAgICBbSU5URUxfQ01EX0lURU1fS0VSTkVMXSAgICAgICAgICAgICAgPSB7IHdyaXRlcl9kZWNvZGVfa2VybmVsIH0sCit9OworCitzdGF0aWMgdm9pZCBjbWRfd3JpdGVyX2RlY29kZV9pdGVtcyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1t3aGljaF07CisgICAgaW50IGk7CisKKyAgICBpZiAoIXdyaXRlci0+aXRlbV91c2VkKQorICAgICAgICByZXR1cm47CisKKyAgICB3cml0ZXItPnB0ciA9IGludGVsX2JvX21hcCh3cml0ZXItPmJvLCBmYWxzZSk7CisgICAgaWYgKCF3cml0ZXItPnB0cikKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IHdyaXRlci0+aXRlbV91c2VkOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9pdGVtICppdGVtID0gJndyaXRlci0+aXRlbXNbaV07CisKKyAgICAgICAgd3JpdGVyX2RlY29kZV90YWJsZVtpdGVtLT50eXBlXS5mdW5jKGNtZCwgd2hpY2gsIGl0ZW0pOworICAgIH0KKworICAgIGludGVsX2JvX3VubWFwKHdyaXRlci0+Ym8pOworICAgIHdyaXRlci0+cHRyID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY21kX3dyaXRlcl9kZWNvZGUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY29kZV9pbnN0X3dyaXRlcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1t3aGljaF07CisKKyAgICBhc3NlcnQod3JpdGVyLT5ibyAmJiAhd3JpdGVyLT5wdHIpOworCisgICAgc3dpdGNoICh3aGljaCkgeworICAgIGNhc2UgSU5URUxfQ01EX1dSSVRFUl9CQVRDSDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWNvZGluZyBiYXRjaCBidWZmZXI6ICV6dSBieXRlc1xuIiwgd3JpdGVyLT51c2VkKTsKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlZCkgeworICAgICAgICAgICAgaW50ZWxfd2luc3lzX2RlY29kZV9ibyhjbWQtPmRldi0+d2luc3lzLAorICAgICAgICAgICAgICAgICAgICB3cml0ZXItPmJvLCB3cml0ZXItPnVzZWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfQ01EX1dSSVRFUl9TVVJGQUNFOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlY29kaW5nIHN1cmZhY2Ugc3RhdGUgYnVmZmVyOiAlZCBzdGF0ZXNcbiIsCisgICAgICAgICAgICAgICAgd3JpdGVyLT5pdGVtX3VzZWQpOworICAgICAgICBjbWRfd3JpdGVyX2RlY29kZV9pdGVtcyhjbWQsIHdoaWNoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9DTURfV1JJVEVSX1NUQVRFOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlY29kaW5nIGR5bmFtaWMgc3RhdGUgYnVmZmVyOiAlZCBzdGF0ZXNcbiIsCisgICAgICAgICAgICAgICAgd3JpdGVyLT5pdGVtX3VzZWQpOworICAgICAgICBjbWRfd3JpdGVyX2RlY29kZV9pdGVtcyhjbWQsIHdoaWNoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9DTURfV1JJVEVSX0lOU1RSVUNUSU9OOgorICAgICAgICBpZiAoZGVjb2RlX2luc3Rfd3JpdGVyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlY29kaW5nIGluc3RydWN0aW9uIGJ1ZmZlcjogJWQga2VybmVsc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5pdGVtX3VzZWQpOworCisgICAgICAgICAgICBjbWRfd3JpdGVyX2RlY29kZV9pdGVtcyhjbWQsIHdoaWNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcHBpbmcgaW5zdHJ1Y3Rpb24gYnVmZmVyOiAlZCBrZXJuZWxzXG4iLAorICAgICAgICAgICAgICAgICAgICB3cml0ZXItPml0ZW1fdXNlZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioKKyAqIERlY29kZSBhY2NvcmRpbmcgdG8gdGhlIHJlY29yZGVkIGl0ZW1zLiAgVGhpcyBjYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYQorICogc3VjY2Vzc2Z1bCBpbnRlbF9jbWRfZW5kKCkuCisgKi8KK3ZvaWQgaW50ZWxfY21kX2RlY29kZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIGJvb2wgZGVjb2RlX2luc3Rfd3JpdGVyKQoreworICAgIGludCBpOworCisgICAgYXNzZXJ0KGNtZC0+cmVzdWx0ID09IFZLX1NVQ0NFU1MpOworCisgICAgZm9yIChpID0gMDsgaSA8IElOVEVMX0NNRF9XUklURVJfQ09VTlQ7IGkrKykKKyAgICAgICAgY21kX3dyaXRlcl9kZWNvZGUoY21kLCBpLCBkZWNvZGVfaW5zdF93cml0ZXIpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NtZF9tZXRhLmMgYi9pY2QvaW50ZWwvY21kX21ldGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTA0NGY5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NtZF9tZXRhLmMKQEAgLTAsMCArMSwxMTIwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqCisgKi8KKworI2luY2x1ZGUgImJ1Zi5oIgorI2luY2x1ZGUgImltZy5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAiY21kX3ByaXYuaCIKKyNpbmNsdWRlICJmYi5oIgorCitzdGF0aWMgVmtSZXN1bHQgY21kX21ldGFfY3JlYXRlX2J1Zl92aWV3KHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0J1ZmZlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKip2aWV3KQoreworICAgIFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gaW5mbzsKKyAgICBWa0RldmljZVNpemUgc3RyaWRlOworCisgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpbmZvLmJ1ZmZlciA9IGJ1ZjsKKyAgICBpbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBpbmZvLnJhbmdlID0gcmFuZ2U7CisKKyAgICAvKgorICAgICAqIFdlIGRvIG5vdCByZWx5IG9uIHRoZSBoYXJkd2FyZSB0byBhdm9pZCBvdXQtb2YtYm91bmQgYWNjZXNzLiAgQnV0IHdlIGRvCisgICAgICogbm90IHdhbnQgdGhlIGhhcmR3YXJlIHRvIGlnbm9yZSB0aGUgbGFzdCBlbGVtZW50IGVpdGhlci4KKyAgICAgKi8KKyAgICBzdHJpZGUgPSBpY2RfZm9ybWF0X2dldF9zaXplKGZvcm1hdCk7CisgICAgaWYgKGluZm8ucmFuZ2UgJSBzdHJpZGUpCisgICAgICAgIGluZm8ucmFuZ2UgKz0gc3RyaWRlIC0gKGluZm8ucmFuZ2UgJSBzdHJpZGUpOworCisgICAgcmV0dXJuIGludGVsX2J1Zl92aWV3X2NyZWF0ZShjbWQtPmRldiwgJmluZm8sIHZpZXcpOworfQorCitzdGF0aWMgdm9pZCBjbWRfbWV0YV9zZXRfc3JjX2Zvcl9idWYoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9idWYgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2NtZF9tZXRhICptZXRhKQoreworICAgIHN0cnVjdCBpbnRlbF9idWZfdmlldyAqdmlldzsKKyAgICBWa1Jlc3VsdCByZXM7CisgICAgVmtCdWZmZXIgbG9jYWxidWYgPSAoVmtCdWZmZXIpIGJ1ZjsKKworICAgIHJlcyA9IGNtZF9tZXRhX2NyZWF0ZV9idWZfdmlldyhjbWQsIGxvY2FsYnVmLAorICAgICAgICAgICAgYnVmLT5zaXplLCBmb3JtYXQsICZ2aWV3KTsKKyAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgY21kX2ZhaWwoY21kLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWV0YS0+c3JjLnZhbGlkID0gdHJ1ZTsKKworICAgIG1lbWNweShtZXRhLT5zcmMuc3VyZmFjZSwgdmlldy0+Y21kLAorICAgICAgICAgICAgc2l6ZW9mKHZpZXctPmNtZFswXSkgKiB2aWV3LT5jbWRfbGVuKTsKKyAgICBtZXRhLT5zcmMuc3VyZmFjZV9sZW4gPSB2aWV3LT5jbWRfbGVuOworCisgICAgaW50ZWxfYnVmX3ZpZXdfZGVzdHJveSh2aWV3KTsKKworICAgIG1ldGEtPnNyYy5yZWxvY190YXJnZXQgPSAoaW50cHRyX3QpIGJ1Zi0+b2JqLm1lbS0+Ym87CisgICAgbWV0YS0+c3JjLnJlbG9jX29mZnNldCA9IDA7CisgICAgbWV0YS0+c3JjLnJlbG9jX2ZsYWdzID0gMDsKK30KKworc3RhdGljIHZvaWQgY21kX21ldGFfc2V0X2RzdF9mb3JfYnVmKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYnVmICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKnZpZXc7CisgICAgVmtSZXN1bHQgcmVzOworICAgIFZrQnVmZmVyIGxvY2FsYnVmID0gKFZrQnVmZmVyKSBidWY7CisKKyAgICByZXMgPSBjbWRfbWV0YV9jcmVhdGVfYnVmX3ZpZXcoY21kLCBsb2NhbGJ1ZiwKKyAgICAgICAgICAgIGJ1Zi0+c2l6ZSwgZm9ybWF0LCAmdmlldyk7CisgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIGNtZF9mYWlsKGNtZCwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1ldGEtPmRzdC52YWxpZCA9IHRydWU7CisKKyAgICBtZW1jcHkobWV0YS0+ZHN0LnN1cmZhY2UsIHZpZXctPmNtZCwKKyAgICAgICAgICAgIHNpemVvZih2aWV3LT5jbWRbMF0pICogdmlldy0+Y21kX2xlbik7CisgICAgbWV0YS0+ZHN0LnN1cmZhY2VfbGVuID0gdmlldy0+Y21kX2xlbjsKKworICAgIGludGVsX2J1Zl92aWV3X2Rlc3Ryb3kodmlldyk7CisKKyAgICBtZXRhLT5kc3QucmVsb2NfdGFyZ2V0ID0gKGludHB0cl90KSBidWYtPm9iai5tZW0tPmJvOworICAgIG1ldGEtPmRzdC5yZWxvY19vZmZzZXQgPSAwOworICAgIG1ldGEtPmRzdC5yZWxvY19mbGFncyA9IElOVEVMX1JFTE9DX1dSSVRFOworfQorCitzdGF0aWMgdm9pZCBjbWRfbWV0YV9zZXRfc3JjX2Zvcl9pbWcoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUFzcGVjdEZsYWdCaXRzIGFzcGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgKm1ldGEpCit7CisgICAgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGluZm87CisgICAgc3RydWN0IGludGVsX2ltZ192aWV3IHRtcF92aWV3OworICAgIHN0cnVjdCBpbnRlbF9pbWdfdmlldyAqdmlldyA9ICZ0bXBfdmlldzsKKworICAgIG1lbXNldCgmdG1wX3ZpZXcsIDAsIHNpemVvZih0bXBfdmlldykpOworCisgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGluZm8uaW1hZ2UgPSAoVmtJbWFnZSkgaW1nOworCisgICAgaWYgKGltZy0+YXJyYXlfc2l6ZSA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoaW1nLT50eXBlKSB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8xRDoKKyAgICAgICAgICAgIGluZm8udmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzJEOgorICAgICAgICAgICAgaW5mby52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGltZy0+dHlwZSkgeworICAgICAgICBjYXNlIFZLX0lNQUdFX1RZUEVfMUQ6CisgICAgICAgICAgICBpbmZvLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzFEX0FSUkFZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8yRDoKKyAgICAgICAgICAgIGluZm8udmlld1R5cGUgPSBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzNEOgorICAgICAgICAgICAgaW5mby52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8zRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBpbmZvLmNvbXBvbmVudHMuciA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX1I7CisgICAgaW5mby5jb21wb25lbnRzLmcgPSBWS19DT01QT05FTlRfU1dJWlpMRV9HOworICAgIGluZm8uY29tcG9uZW50cy5iID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQjsKKyAgICBpbmZvLmNvbXBvbmVudHMuYSA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0E7CisgICAgaW5mby5zdWJyZXNvdXJjZVJhbmdlLmFzcGVjdE1hc2sgPSBhc3BlY3Q7CisgICAgaW5mby5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCA9IDA7CisgICAgaW5mby5zdWJyZXNvdXJjZVJhbmdlLmxldmVsQ291bnQgPSBWS19SRU1BSU5JTkdfTUlQX0xFVkVMUzsKKyAgICBpbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSAwOworICAgIGluZm8uc3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50ID0gVktfUkVNQUlOSU5HX0FSUkFZX0xBWUVSUzsKKworICAgIGludGVsX2ltZ192aWV3X2luaXQoY21kLT5kZXYsICZpbmZvLCB2aWV3KTsKKworICAgIG1ldGEtPnNyYy52YWxpZCA9IHRydWU7CisKKyAgICBtZW1jcHkobWV0YS0+c3JjLnN1cmZhY2UsIHZpZXctPmNtZCwKKyAgICAgICAgICAgIHNpemVvZih2aWV3LT5jbWRbMF0pICogdmlldy0+Y21kX2xlbik7CisgICAgbWV0YS0+c3JjLnN1cmZhY2VfbGVuID0gdmlldy0+Y21kX2xlbjsKKworICAgIG1ldGEtPnNyYy5yZWxvY190YXJnZXQgPSAoaW50cHRyX3QpIGltZy0+b2JqLm1lbS0+Ym87CisgICAgbWV0YS0+c3JjLnJlbG9jX29mZnNldCA9IDA7CisgICAgbWV0YS0+c3JjLnJlbG9jX2ZsYWdzID0gMDsKKworICAgIC8qIERvbid0IG5lZWQgdG1wX3ZpZXcgYW55bW9yZSAqLworfQorCitzdGF0aWMgdm9pZCBjbWRfbWV0YV9hZGp1c3RfY29tcHJlc3NlZF9kc3Qoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgKm1ldGEpCit7CisgICAgaW50MzJfdCB3LCBoLCBsYXllcjsKKyAgICB1bnNpZ25lZCB4X29mZnNldCwgeV9vZmZzZXQ7CisKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgeworICAgICAgICB3ID0gR0VOX0VYVFJBQ1QobWV0YS0+ZHN0LnN1cmZhY2VbMl0sIEdFTjdfU1VSRkFDRV9EVzJfV0lEVEgpOworICAgICAgICBoID0gR0VOX0VYVFJBQ1QobWV0YS0+ZHN0LnN1cmZhY2VbMl0sIEdFTjdfU1VSRkFDRV9EVzJfSEVJR0hUKTsKKyAgICAgICAgbGF5ZXIgPSBHRU5fRVhUUkFDVChtZXRhLT5kc3Quc3VyZmFjZVs0XSwKKyAgICAgICAgICAgICAgICBHRU43X1NVUkZBQ0VfRFc0X01JTl9BUlJBWV9FTEVNRU5UKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3ID0gR0VOX0VYVFJBQ1QobWV0YS0+ZHN0LnN1cmZhY2VbMl0sIEdFTjZfU1VSRkFDRV9EVzJfV0lEVEgpOworICAgICAgICBoID0gR0VOX0VYVFJBQ1QobWV0YS0+ZHN0LnN1cmZhY2VbMl0sIEdFTjZfU1VSRkFDRV9EVzJfSEVJR0hUKTsKKyAgICAgICAgbGF5ZXIgPSBHRU5fRVhUUkFDVChtZXRhLT5kc3Quc3VyZmFjZVs0XSwKKyAgICAgICAgICAgICAgICBHRU42X1NVUkZBQ0VfRFc0X01JTl9BUlJBWV9FTEVNRU5UKTsKKyAgICB9CisKKyAgICAvKiBub3RlIHRoYXQgdGhlIHdpZHRoL2hlaWdodCBmaWVsZHMgaGF2ZSB0aGUgcmVhbCB2YWx1ZXMgbWludXMgMSAqLworICAgIHcgPSAodyArIGltZy0+bGF5b3V0LmJsb2NrX3dpZHRoKSAvIGltZy0+bGF5b3V0LmJsb2NrX3dpZHRoIC0gMTsKKyAgICBoID0gKGggKyBpbWctPmxheW91dC5ibG9ja19oZWlnaHQpIC8gaW1nLT5sYXlvdXQuYmxvY2tfaGVpZ2h0IC0gMTsKKworICAgIC8qIGFkanVzdCB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgbWV0YS0+ZHN0LnN1cmZhY2VbMl0gJj0gfihHRU43X1NVUkZBQ0VfRFcyX1dJRFRIX19NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU43X1NVUkZBQ0VfRFcyX0hFSUdIVF9fTUFTSyk7CisgICAgICAgIG1ldGEtPmRzdC5zdXJmYWNlWzJdIHw9IEdFTl9TSElGVDMyKHcsIEdFTjdfU1VSRkFDRV9EVzJfV0lEVEgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VOX1NISUZUMzIoaCwgR0VON19TVVJGQUNFX0RXMl9IRUlHSFQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1ldGEtPmRzdC5zdXJmYWNlWzJdICY9IH4oR0VONl9TVVJGQUNFX0RXMl9XSURUSF9fTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9TVVJGQUNFX0RXMl9IRUlHSFRfX01BU0spOworICAgICAgICBtZXRhLT5kc3Quc3VyZmFjZVsyXSB8PSBHRU5fU0hJRlQzMih3LCBHRU42X1NVUkZBQ0VfRFcyX1dJRFRIKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9TSElGVDMyKGgsIEdFTjZfU1VSRkFDRV9EVzJfSEVJR0hUKTsKKyAgICB9CisKKyAgICBpZiAoIWxheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBtZXRhLT5kc3QucmVsb2Nfb2Zmc2V0ID0gaW50ZWxfbGF5b3V0X2dldF9zbGljZV90aWxlX29mZnNldCgmaW1nLT5sYXlvdXQsCisgICAgICAgICAgICAwLCBsYXllciwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQpOworCisgICAgLyoKKyAgICAgKiBUaGUgbG93ZXIgMiBiaXRzIChvciAxIGJpdCBmb3IgWSkgYXJlIG1pc3NpbmcuICBUaGlzIG1heSBiZSBhIHByb2JsZW0KKyAgICAgKiBmb3Igc21hbGwgaW1hZ2VzICgxNngxNiBvciBzbWFsbGVyKS4gIFdlIHdpbGwgbmVlZCB0byBhZGp1c3QgdGhlCisgICAgICogZHJhd2luZyByZWN0YW5nbGUgaW5zdGVhZC4KKyAgICAgKi8KKyAgICB4X29mZnNldCA9ICh4X29mZnNldCAvIGltZy0+bGF5b3V0LmJsb2NrX3dpZHRoKSA+PiAyOworICAgIHlfb2Zmc2V0ID0gKHlfb2Zmc2V0IC8gaW1nLT5sYXlvdXQuYmxvY2tfaGVpZ2h0KSA+PiAxOworCisgICAgLyogYWRqdXN0IG1pbiBhcnJheSBlbGVtZW50IGFuZCBYL1kgb2Zmc2V0cyAqLworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICAgIG1ldGEtPmRzdC5zdXJmYWNlWzRdICY9IH5HRU43X1NVUkZBQ0VfRFc0X01JTl9BUlJBWV9FTEVNRU5UX19NQVNLOworICAgICAgICBtZXRhLT5kc3Quc3VyZmFjZVs1XSB8PSBHRU5fU0hJRlQzMih4X29mZnNldCwgR0VON19TVVJGQUNFX0RXNV9YX09GRlNFVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5fU0hJRlQzMih5X29mZnNldCwgR0VON19TVVJGQUNFX0RXNV9ZX09GRlNFVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0YS0+ZHN0LnN1cmZhY2VbNF0gJj0gfkdFTjZfU1VSRkFDRV9EVzRfTUlOX0FSUkFZX0VMRU1FTlRfX01BU0s7CisgICAgICAgIG1ldGEtPmRzdC5zdXJmYWNlWzVdIHw9IEdFTl9TSElGVDMyKHhfb2Zmc2V0LCBHRU42X1NVUkZBQ0VfRFc1X1hfT0ZGU0VUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9TSElGVDMyKHlfb2Zmc2V0LCBHRU42X1NVUkZBQ0VfRFc1X1lfT0ZGU0VUKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9tZXRhX3NldF9kc3RfZm9yX2ltZyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ltZyAqaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsb2QsIHVpbnQzMl90IGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYXR0X3ZpZXcgdG1wX3ZpZXc7CisgICAgc3RydWN0IGludGVsX2F0dF92aWV3ICp2aWV3ID0gJnRtcF92aWV3OworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbmZvOworCisgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgIGluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPOworICAgIGluZm8uaW1hZ2UgPSAoVmtJbWFnZSkgaW1nOworICAgIGluZm8uZm9ybWF0ID0gZm9ybWF0OworICAgIGluZm8uc3VicmVzb3VyY2VSYW5nZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICBpbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gbG9kOworICAgIGluZm8uc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSBsYXllcjsKKyAgICBpbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisKKyAgICBpbnRlbF9hdHRfdmlld19pbml0KGNtZC0+ZGV2LCAmaW5mbywgdmlldyk7CisKKyAgICBtZXRhLT5kc3QudmFsaWQgPSB0cnVlOworCisgICAgbWVtY3B5KG1ldGEtPmRzdC5zdXJmYWNlLCB2aWV3LT5hdHRfY21kLAorICAgICAgICAgICAgc2l6ZW9mKHZpZXctPmF0dF9jbWRbMF0pICogdmlldy0+Y21kX2xlbik7CisgICAgbWV0YS0+ZHN0LnN1cmZhY2VfbGVuID0gdmlldy0+Y21kX2xlbjsKKworICAgIG1ldGEtPmRzdC5yZWxvY190YXJnZXQgPSAoaW50cHRyX3QpIGltZy0+b2JqLm1lbS0+Ym87CisgICAgbWV0YS0+ZHN0LnJlbG9jX29mZnNldCA9IDA7CisgICAgbWV0YS0+ZHN0LnJlbG9jX2ZsYWdzID0gSU5URUxfUkVMT0NfV1JJVEU7CisKKyAgICBpZiAoaWNkX2Zvcm1hdF9pc19jb21wcmVzc2VkKGltZy0+bGF5b3V0LmZvcm1hdCkpCisgICAgICAgIGNtZF9tZXRhX2FkanVzdF9jb21wcmVzc2VkX2RzdChjbWQsIGltZywgbWV0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9tZXRhX3NldF9zcmNfZm9yX3dyaXRlcihzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgKm1ldGEpCit7CisgICAgc3RydWN0IGludGVsX2J1Zl92aWV3ICp2aWV3OworICAgIFZrUmVzdWx0IHJlczsKKyAgICBWa0J1ZmZlciBsb2NhbGJ1ZiA9IFZLX05VTExfSEFORExFOworCisgICAgcmVzID0gY21kX21ldGFfY3JlYXRlX2J1Zl92aWV3KGNtZCwgbG9jYWxidWYsCisgICAgICAgICAgICBzaXplLCBmb3JtYXQsICZ2aWV3KTsKKyAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgY21kX2ZhaWwoY21kLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWV0YS0+c3JjLnZhbGlkID0gdHJ1ZTsKKworICAgIG1lbWNweShtZXRhLT5zcmMuc3VyZmFjZSwgdmlldy0+Y21kLAorICAgICAgICAgICAgc2l6ZW9mKHZpZXctPmNtZFswXSkgKiB2aWV3LT5jbWRfbGVuKTsKKyAgICBtZXRhLT5zcmMuc3VyZmFjZV9sZW4gPSB2aWV3LT5jbWRfbGVuOworCisgICAgaW50ZWxfYnVmX3ZpZXdfZGVzdHJveSh2aWV3KTsKKworICAgIG1ldGEtPnNyYy5yZWxvY190YXJnZXQgPSAoaW50cHRyX3QpIHdyaXRlcjsKKyAgICBtZXRhLT5zcmMucmVsb2Nfb2Zmc2V0ID0gMDsKKyAgICBtZXRhLT5zcmMucmVsb2NfZmxhZ3MgPSBJTlRFTF9DTURfUkVMT0NfVEFSR0VUX0lTX1dSSVRFUjsKK30KKworc3RhdGljIHZvaWQgY21kX21ldGFfc2V0X2RzX3ZpZXcoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ltZyAqaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG9kLCB1aW50MzJfdCBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSkKK3sKKyAgICBWa0ltYWdlVmlld0NyZWF0ZUluZm8gaW5mbzsKKworICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKyAgICBpbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTzsKKyAgICBpbmZvLmltYWdlID0gKFZrSW1hZ2UpIGltZzsKKyAgICBpbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZU1pcExldmVsID0gbG9kOworICAgIGluZm8uc3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50ID0gMTsKKyAgICBpbmZvLnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIgPSBsYXllcjsKKyAgICBpbmZvLnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCA9IDE7CisKKyAgICBpbnRlbF9hdHRfdmlld19pbml0KGNtZC0+ZGV2LCAmaW5mbywgJm1ldGEtPmRzLnZpZXcpOworfQorCitzdGF0aWMgdm9pZCBjbWRfbWV0YV9zZXRfZHNfc3RhdGUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VBc3BlY3RGbGFnQml0cyBhc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RlbmNpbF9yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2NtZF9tZXRhICptZXRhKQoreworICAgIG1ldGEtPmRzLnN0ZW5jaWxfcmVmID0gc3RlbmNpbF9yZWY7CisgICAgbWV0YS0+ZHMuYXNwZWN0ID0gYXNwZWN0OworfQorCitzdGF0aWMgZW51bSBpbnRlbF9kZXZfbWV0YV9zaGFkZXIgZ2V0X3NoYWRlcl9pZChjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfaW1nICppbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvcHlfYXJyYXkpCit7CisgICAgZW51bSBpbnRlbF9kZXZfbWV0YV9zaGFkZXIgc2hhZGVyX2lkOworCisgICAgc3dpdGNoIChpbWctPnR5cGUpIHsKKyAgICBjYXNlIFZLX0lNQUdFX1RZUEVfMUQ6CisgICAgICAgIHNoYWRlcl9pZCA9IChjb3B5X2FycmF5KSA/CisgICAgICAgICAgICBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFEX0FSUkFZIDogSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTUFHRV9UWVBFXzJEOgorICAgICAgICBzaGFkZXJfaWQgPSAoaW1nLT5zYW1wbGVfY291bnQgPiAxKSA/IElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkRfTVMgOgorICAgICAgICAgICAgICAgICAgICAoY29weV9hcnJheSkgPyAgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9BUlJBWSA6CisgICAgICAgICAgICAgICAgICAgIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfSU1BR0VfVFlQRV8zRDoKKyAgICBkZWZhdWx0OgorICAgICAgICBzaGFkZXJfaWQgPSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX0FSUkFZOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhZGVyX2lkOworfQorCitzdGF0aWMgYm9vbCBjbWRfbWV0YV9tZW1fZHdvcmRfYWxpZ25lZChjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgc3JjX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHNpemUpCit7CisgICAgcmV0dXJuICEoKHNyY19vZmZzZXQgfCBkc3Rfb2Zmc2V0IHwgc2l6ZSkgJiAweDMpOworfQorCitzdGF0aWMgVmtGb3JtYXQgY21kX21ldGFfaW1nX3Jhd19mb3JtYXQoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZm9ybWF0KQoreworICAgIHN3aXRjaCAoaWNkX2Zvcm1hdF9nZXRfc2l6ZShmb3JtYXQpKSB7CisgICAgY2FzZSAxOgorICAgICAgICBmb3JtYXQgPSBWS19GT1JNQVRfUjhfVUlOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBmb3JtYXQgPSBWS19GT1JNQVRfUjE2X1VJTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZm9ybWF0ID0gVktfRk9STUFUX1IzMl9VSU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIGZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJfVUlOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgZm9ybWF0ID0gVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgZm9yIHJhdyBibGl0IG9wIik7CisgICAgICAgIGZvcm1hdCA9IFZLX0ZPUk1BVF9VTkRFRklORUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ29weUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0J1ZmZlckNvcHkqICAgICAgICAgcFJlZ2lvbnMpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9idWYgKnNyYyA9IGludGVsX2J1ZihzcmNCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9idWYgKmRzdCA9IGludGVsX2J1Zihkc3RCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSBtZXRhOworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICB1aW50MzJfdCBpOworCisgICAgbWVtc2V0KCZtZXRhLCAwLCBzaXplb2YobWV0YSkpOworICAgIG1ldGEubW9kZSA9IElOVEVMX0NNRF9NRVRBX1ZTX1BPSU5UUzsKKworICAgIG1ldGEuaGVpZ2h0ID0gMTsKKyAgICBtZXRhLnNhbXBsZV9jb3VudCA9IDE7CisKKyAgICBmb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworCisgICAgZm9yIChpID0gMDsgaSA8IHJlZ2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtCdWZmZXJDb3B5ICpyZWdpb24gPSAmcFJlZ2lvbnNbaV07CisgICAgICAgIFZrRm9ybWF0IGZtdDsKKworICAgICAgICBtZXRhLnNyYy54ID0gcmVnaW9uLT5zcmNPZmZzZXQ7CisgICAgICAgIG1ldGEuZHN0LnggPSByZWdpb24tPmRzdE9mZnNldDsKKyAgICAgICAgbWV0YS53aWR0aCA9IHJlZ2lvbi0+c2l6ZTsKKworICAgICAgICBpZiAoY21kX21ldGFfbWVtX2R3b3JkX2FsaWduZWQoY21kLCByZWdpb24tPnNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgcmVnaW9uLT5kc3RPZmZzZXQsIHJlZ2lvbi0+c2l6ZSkpIHsKKyAgICAgICAgICAgIG1ldGEuc2hhZGVyX2lkID0gSU5URUxfREVWX01FVEFfVlNfQ09QWV9NRU07CisgICAgICAgICAgICBtZXRhLnNyYy54IC89IDQ7CisgICAgICAgICAgICBtZXRhLmRzdC54IC89IDQ7CisgICAgICAgICAgICBtZXRhLndpZHRoIC89IDQ7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTSBpcyB1bnR5cGVkIGJ1dCBleHBlY3RzIHRoZSBzdHJpZGUgdG8KKyAgICAgICAgICAgICAqIGJlIDE2CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZtdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjbWRfZ2VuKGNtZCkgPT0gSU5URUxfR0VOKDYpKSB7CisgICAgICAgICAgICAgICAgaW50ZWxfZGV2X2xvZyhjbWQtPmRldiwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAmY21kLT5vYmouYmFzZSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFsaWduZWQgdmtDbWRDb3B5QnVmZmVyIHVuc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgY21kX2ZhaWwoY21kLCBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZXRhLnNoYWRlcl9pZCA9IElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfTUVNX1VOQUxJR05FRDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfTUVNX1VOQUxJR05FRCBpcyB1bnR5cGVkIGJ1dCBleHBlY3RzIHRoZQorICAgICAgICAgICAgICogc3RyaWRlIHRvIGJlIDQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm10ID0gVktfRk9STUFUX1I4RzhCOEE4X1VJTlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm9ybWF0ICE9IGZtdCkgeworICAgICAgICAgICAgZm9ybWF0ID0gZm10OworCisgICAgICAgICAgICBjbWRfbWV0YV9zZXRfc3JjX2Zvcl9idWYoY21kLCBzcmMsIGZvcm1hdCwgJm1ldGEpOworICAgICAgICAgICAgY21kX21ldGFfc2V0X2RzdF9mb3JfYnVmKGNtZCwgZHN0LCBmb3JtYXQsICZtZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGNtZF9kcmF3X21ldGEoY21kLCAmbWV0YSk7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENvcHlJbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VDb3B5KiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9pbWcgKnNyYyA9IGludGVsX2ltZyhzcmNJbWFnZSk7CisgICAgc3RydWN0IGludGVsX2ltZyAqZHN0ID0gaW50ZWxfaW1nKGRzdEltYWdlKTsKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgbWV0YTsKKyAgICBWa0Zvcm1hdCByYXdfZm9ybWF0OworICAgIGJvb2wgcmF3X2NvcHkgPSBmYWxzZTsKKyAgICB1aW50MzJfdCBpOworCisgICAgaWYgKHNyYy0+bGF5b3V0LmZvcm1hdCA9PSBkc3QtPmxheW91dC5mb3JtYXQpIHsKKyAgICAgICAgcmF3X2NvcHkgPSB0cnVlOworICAgICAgICByYXdfZm9ybWF0ID0gY21kX21ldGFfaW1nX3Jhd19mb3JtYXQoY21kLCBzcmMtPmxheW91dC5mb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydCghKGljZF9mb3JtYXRfaXNfY29tcHJlc3NlZChzcmMtPmxheW91dC5mb3JtYXQpIHx8CisgICAgICAgICAgICAgICBpY2RfZm9ybWF0X2lzX2NvbXByZXNzZWQoZHN0LT5sYXlvdXQuZm9ybWF0KSkgJiYgIkNvbXByZXNzZWQgZm9ybWF0cyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgbWVtc2V0KCZtZXRhLCAwLCBzaXplb2YobWV0YSkpOworICAgIG1ldGEubW9kZSA9IElOVEVMX0NNRF9NRVRBX0ZTX1JFQ1Q7CisKKyAgICBjbWRfbWV0YV9zZXRfc3JjX2Zvcl9pbWcoY21kLCBzcmMsCisgICAgICAgICAgICAocmF3X2NvcHkpID8gcmF3X2Zvcm1hdCA6IHNyYy0+bGF5b3V0LmZvcm1hdCwKKyAgICAgICAgICAgIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsICZtZXRhKTsKKworICAgIG1ldGEuc2FtcGxlX2NvdW50ID0gZHN0LT5zYW1wbGVfY291bnQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVnaW9uQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0ltYWdlQ29weSAqcmVnaW9uID0gJnBSZWdpb25zW2ldOworICAgICAgICB1aW50MzJfdCBqOworCisgICAgICAgIG1ldGEuc2hhZGVyX2lkID0gZ2V0X3NoYWRlcl9pZChjbWQtPmRldiwgc3JjLAorICAgICAgICAgICAgICAgIChyZWdpb24tPmV4dGVudC5kZXB0aCA+IDEpKTsKKworICAgICAgICBtZXRhLnNyYy5sb2QgPSByZWdpb24tPnNyY1N1YnJlc291cmNlLm1pcExldmVsOworICAgICAgICBtZXRhLnNyYy5sYXllciA9IHJlZ2lvbi0+c3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgKworICAgICAgICAgICAgcmVnaW9uLT5zcmNPZmZzZXQuejsKKyAgICAgICAgbWV0YS5zcmMueCA9IHJlZ2lvbi0+c3JjT2Zmc2V0Lng7CisgICAgICAgIG1ldGEuc3JjLnkgPSByZWdpb24tPnNyY09mZnNldC55OworCisgICAgICAgIG1ldGEuZHN0LmxvZCA9IHJlZ2lvbi0+ZHN0U3VicmVzb3VyY2UubWlwTGV2ZWw7CisgICAgICAgIG1ldGEuZHN0LmxheWVyID0gcmVnaW9uLT5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciArCisgICAgICAgICAgICAgICAgcmVnaW9uLT5kc3RPZmZzZXQuejsKKyAgICAgICAgbWV0YS5kc3QueCA9IHJlZ2lvbi0+ZHN0T2Zmc2V0Lng7CisgICAgICAgIG1ldGEuZHN0LnkgPSByZWdpb24tPmRzdE9mZnNldC55OworCisgICAgICAgIG1ldGEud2lkdGggPSByZWdpb24tPmV4dGVudC53aWR0aDsKKyAgICAgICAgbWV0YS5oZWlnaHQgPSByZWdpb24tPmV4dGVudC5oZWlnaHQ7CisKKyAgICAgICAgaWYgKHJhd19jb3B5KSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBibG9ja193aWR0aCA9CisgICAgICAgICAgICAgICAgaWNkX2Zvcm1hdF9nZXRfYmxvY2tfd2lkdGgocmF3X2Zvcm1hdCk7CisKKyAgICAgICAgICAgIG1ldGEuc3JjLnggLz0gYmxvY2tfd2lkdGg7CisgICAgICAgICAgICBtZXRhLnNyYy55IC89IGJsb2NrX3dpZHRoOworICAgICAgICAgICAgbWV0YS5kc3QueCAvPSBibG9ja193aWR0aDsKKyAgICAgICAgICAgIG1ldGEuZHN0LnkgLz0gYmxvY2tfd2lkdGg7CisgICAgICAgICAgICBtZXRhLndpZHRoIC89IGJsb2NrX3dpZHRoOworICAgICAgICAgICAgbWV0YS5oZWlnaHQgLz0gYmxvY2tfd2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVnaW9uLT5leHRlbnQuZGVwdGg7IGorKykgeworICAgICAgICAgICAgY21kX21ldGFfc2V0X2RzdF9mb3JfaW1nKGNtZCwgZHN0LAorICAgICAgICAgICAgICAgICAgICAocmF3X2NvcHkpID8gcmF3X2Zvcm1hdCA6IGRzdC0+bGF5b3V0LmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5kc3QubG9kLCBtZXRhLmRzdC5sYXllciwgJm1ldGEpOworCisgICAgICAgICAgICBjbWRfZHJhd19tZXRhKGNtZCwgJm1ldGEpOworCisgICAgICAgICAgICBtZXRhLnNyYy5sYXllcisrOworICAgICAgICAgICAgbWV0YS5kc3QubGF5ZXIrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCbGl0SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZUJsaXQqICAgICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucywKKyAgICBWa0ZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcikKK3sKKyAgICAvKgorICAgICAqIFRPRE86IEltcGxlbWVudCBhY3R1YWwgYmxpdCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBhc3NlcnQoMCAmJiAidmtDbWRCbGl0SW1hZ2Ugbm90IGltcGxlbWVudGVkIik7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICBwUmVnaW9ucykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgc3RydWN0IGludGVsX2J1ZiAqYnVmID0gaW50ZWxfYnVmKHNyY0J1ZmZlcik7CisgICAgc3RydWN0IGludGVsX2ltZyAqaW1nID0gaW50ZWxfaW1nKGRzdEltYWdlKTsKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgbWV0YTsKKyAgICBWa0Zvcm1hdCBmb3JtYXQ7CisgICAgdWludDMyX3QgYmxvY2tfd2lkdGgsIGk7CisKKyAgICBtZW1zZXQoJm1ldGEsIDAsIHNpemVvZihtZXRhKSk7CisgICAgbWV0YS5tb2RlID0gSU5URUxfQ01EX01FVEFfRlNfUkVDVDsKKworICAgIG1ldGEuc2hhZGVyX2lkID0gSU5URUxfREVWX01FVEFfRlNfQ09QWV9NRU1fVE9fSU1HOworICAgIG1ldGEuc2FtcGxlX2NvdW50ID0gaW1nLT5zYW1wbGVfY291bnQ7CisKKyAgICBmb3JtYXQgPSBjbWRfbWV0YV9pbWdfcmF3X2Zvcm1hdChjbWQsIGltZy0+bGF5b3V0LmZvcm1hdCk7CisgICAgYmxvY2tfd2lkdGggPSBpY2RfZm9ybWF0X2dldF9ibG9ja193aWR0aChpbWctPmxheW91dC5mb3JtYXQpOworICAgIGNtZF9tZXRhX3NldF9zcmNfZm9yX2J1ZihjbWQsIGJ1ZiwgZm9ybWF0LCAmbWV0YSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVnaW9uQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSAqcmVnaW9uID0gJnBSZWdpb25zW2ldOworICAgICAgICB1aW50MzJfdCBqOworCisgICAgICAgIG1ldGEuc3JjLnggPSByZWdpb24tPmJ1ZmZlck9mZnNldCAvIGljZF9mb3JtYXRfZ2V0X3NpemUoZm9ybWF0KTsKKworICAgICAgICBtZXRhLmRzdC5sb2QgPSByZWdpb24tPmltYWdlU3VicmVzb3VyY2UubWlwTGV2ZWw7CisgICAgICAgIG1ldGEuZHN0LmxheWVyID0gcmVnaW9uLT5pbWFnZVN1YnJlc291cmNlLmJhc2VBcnJheUxheWVyICsKKyAgICAgICAgICAgIHJlZ2lvbi0+aW1hZ2VPZmZzZXQuejsKKyAgICAgICAgbWV0YS5kc3QueCA9IHJlZ2lvbi0+aW1hZ2VPZmZzZXQueCAvIGJsb2NrX3dpZHRoOworICAgICAgICBtZXRhLmRzdC55ID0gcmVnaW9uLT5pbWFnZU9mZnNldC55IC8gYmxvY2tfd2lkdGg7CisKKyAgICAgICAgbWV0YS53aWR0aCA9IHJlZ2lvbi0+aW1hZ2VFeHRlbnQud2lkdGggLyBibG9ja193aWR0aDsKKyAgICAgICAgbWV0YS5oZWlnaHQgPSByZWdpb24tPmltYWdlRXh0ZW50LmhlaWdodCAvIGJsb2NrX3dpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCByZWdpb24tPmltYWdlRXh0ZW50LmRlcHRoOyBqKyspIHsKKyAgICAgICAgICAgIGNtZF9tZXRhX3NldF9kc3RfZm9yX2ltZyhjbWQsIGltZywgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBtZXRhLmRzdC5sb2QsIG1ldGEuZHN0LmxheWVyLCAmbWV0YSk7CisKKyAgICAgICAgICAgIGNtZF9kcmF3X21ldGEoY21kLCAmbWV0YSk7CisKKyAgICAgICAgICAgIG1ldGEuc3JjLnggKz0gbWV0YS53aWR0aCAqIG1ldGEuaGVpZ2h0OworICAgICAgICAgICAgbWV0YS5kc3QubGF5ZXIrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2VMYXlvdXQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgIHBSZWdpb25zKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWcgPSBpbnRlbF9pbWcoc3JjSW1hZ2UpOworICAgIHN0cnVjdCBpbnRlbF9idWYgKmJ1ZiA9IGludGVsX2J1Zihkc3RCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSBtZXRhOworICAgIFZrRm9ybWF0IGltZ19mb3JtYXQsIGJ1Zl9mb3JtYXQ7CisgICAgdWludDMyX3QgYmxvY2tfd2lkdGgsIGk7CisKKyAgICBtZW1zZXQoJm1ldGEsIDAsIHNpemVvZihtZXRhKSk7CisgICAgbWV0YS5tb2RlID0gSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTOworCisgICAgaW1nX2Zvcm1hdCA9IGNtZF9tZXRhX2ltZ19yYXdfZm9ybWF0KGNtZCwgaW1nLT5sYXlvdXQuZm9ybWF0KTsKKyAgICBibG9ja193aWR0aCA9IGljZF9mb3JtYXRfZ2V0X2Jsb2NrX3dpZHRoKGltZ19mb3JtYXQpOworCisgICAgLyogYnVmX2Zvcm1hdCBpcyBpZ25vcmVkIGJ5IGh3LCBidXQgd2UgZGVyaXZlIHN0cmlkZSBmcm9tIGl0ICovCisgICAgc3dpdGNoIChpbWdfZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfUjhfVUlOVDoKKyAgICAgICAgbWV0YS5zaGFkZXJfaWQgPSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1I4X1RPX01FTTsKKyAgICAgICAgYnVmX2Zvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VSU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMTZfVUlOVDoKKyAgICAgICAgbWV0YS5zaGFkZXJfaWQgPSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1IxNl9UT19NRU07CisgICAgICAgIGJ1Zl9mb3JtYXQgPSBWS19GT1JNQVRfUjhHOEI4QThfVUlOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfUjMyX1VJTlQ6CisgICAgICAgIG1ldGEuc2hhZGVyX2lkID0gSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMzJfVE9fTUVNOworICAgICAgICBidWZfZm9ybWF0ID0gVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9SMzJHMzJfVUlOVDoKKyAgICAgICAgbWV0YS5zaGFkZXJfaWQgPSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1IzMkczMl9UT19NRU07CisgICAgICAgIGJ1Zl9mb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UOgorICAgICAgICBtZXRhLnNoYWRlcl9pZCA9IElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyQjMyQTMyX1RPX01FTTsKKyAgICAgICAgYnVmX2Zvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaW1nX2Zvcm1hdCA9IFZLX0ZPUk1BVF9VTkRFRklORUQ7CisgICAgICAgIGJ1Zl9mb3JtYXQgPSBWS19GT1JNQVRfVU5ERUZJTkVEOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaW1nX2Zvcm1hdCA9PSBWS19GT1JNQVRfVU5ERUZJTkVEIHx8CisgICAgICAgIChjbWRfZ2VuKGNtZCkgPT0gSU5URUxfR0VOKDYpICYmCisgICAgICAgICBpY2RfZm9ybWF0X2dldF9zaXplKGltZ19mb3JtYXQpIDwgNCkpIHsKKyAgICAgICAgaW50ZWxfZGV2X2xvZyhjbWQtPmRldiwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgJmNtZC0+b2JqLmJhc2UsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgInZrQ21kQ29weUltYWdlVG9CdWZmZXIgd2l0aCBicHAgJWQgdW5zdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGljZF9mb3JtYXRfZ2V0X3NpemUoaW1nLT5sYXlvdXQuZm9ybWF0KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjbWRfbWV0YV9zZXRfc3JjX2Zvcl9pbWcoY21kLCBpbWcsIGltZ19mb3JtYXQsCisgICAgICAgICAgICBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAmbWV0YSk7CisgICAgY21kX21ldGFfc2V0X2RzdF9mb3JfYnVmKGNtZCwgYnVmLCBidWZfZm9ybWF0LCAmbWV0YSk7CisKKyAgICBtZXRhLnNhbXBsZV9jb3VudCA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVnaW9uQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0J1ZmZlckltYWdlQ29weSAqcmVnaW9uID0gJnBSZWdpb25zW2ldOworICAgICAgICB1aW50MzJfdCBqOworCisgICAgICAgIG1ldGEuc3JjLmxvZCA9IHJlZ2lvbi0+aW1hZ2VTdWJyZXNvdXJjZS5taXBMZXZlbDsKKyAgICAgICAgbWV0YS5zcmMubGF5ZXIgPSByZWdpb24tPmltYWdlU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgKworICAgICAgICAgICAgcmVnaW9uLT5pbWFnZU9mZnNldC56OworICAgICAgICBtZXRhLnNyYy54ID0gcmVnaW9uLT5pbWFnZU9mZnNldC54IC8gYmxvY2tfd2lkdGg7CisgICAgICAgIG1ldGEuc3JjLnkgPSByZWdpb24tPmltYWdlT2Zmc2V0LnkgLyBibG9ja193aWR0aDsKKworICAgICAgICBtZXRhLmRzdC54ID0gcmVnaW9uLT5idWZmZXJPZmZzZXQgLyBpY2RfZm9ybWF0X2dldF9zaXplKGltZ19mb3JtYXQpOworICAgICAgICBtZXRhLndpZHRoID0gcmVnaW9uLT5pbWFnZUV4dGVudC53aWR0aCAvIGJsb2NrX3dpZHRoOworICAgICAgICBtZXRhLmhlaWdodCA9IHJlZ2lvbi0+aW1hZ2VFeHRlbnQuaGVpZ2h0IC8gYmxvY2tfd2lkdGg7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHJlZ2lvbi0+aW1hZ2VFeHRlbnQuZGVwdGg7IGorKykgeworICAgICAgICAgICAgY21kX2RyYXdfbWV0YShjbWQsICZtZXRhKTsKKworICAgICAgICAgICAgbWV0YS5zcmMubGF5ZXIrKzsKKyAgICAgICAgICAgIG1ldGEuZHN0LnggKz0gbWV0YS53aWR0aCAqIG1ldGEuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9idWYgKmRzdCA9IGludGVsX2J1Zihkc3RCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSBtZXRhOworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICB1aW50MzJfdCAqcHRyOworICAgIHVpbnQzMl90IG9mZnNldDsKKworICAgIC8qIHdyaXRlIHRvIGR5bmFtaWMgc3RhdGUgd3JpdGVyIGZpcnN0ICovCisgICAgb2Zmc2V0ID0gY21kX3N0YXRlX3BvaW50ZXIoY21kLCBJTlRFTF9DTURfSVRFTV9CTE9CLCAzMiwKKyAgICAgICAgICAgIChkYXRhU2l6ZSArIDMpIC8gNCwgJnB0cik7CisgICAgbWVtY3B5KHB0ciwgcERhdGEsIGRhdGFTaXplKTsKKworICAgIG1lbXNldCgmbWV0YSwgMCwgc2l6ZW9mKG1ldGEpKTsKKyAgICBtZXRhLm1vZGUgPSBJTlRFTF9DTURfTUVUQV9WU19QT0lOVFM7CisKKyAgICBtZXRhLnNoYWRlcl9pZCA9IElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfTUVNOworCisgICAgbWV0YS5zcmMueCA9IG9mZnNldCAvIDQ7CisgICAgbWV0YS5kc3QueCA9IGRzdE9mZnNldCAvIDQ7CisgICAgbWV0YS53aWR0aCA9IGRhdGFTaXplIC8gNDsKKyAgICBtZXRhLmhlaWdodCA9IDE7CisgICAgbWV0YS5zYW1wbGVfY291bnQgPSAxOworCisgICAgLyoKKyAgICAgKiBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTSBpcyB1bnR5cGVkIGJ1dCBleHBlY3RzIHRoZSBzdHJpZGUgdG8gYmUgMTYKKyAgICAgKi8KKyAgICBmb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQ7CisKKyAgICBjbWRfbWV0YV9zZXRfc3JjX2Zvcl93cml0ZXIoY21kLCBJTlRFTF9DTURfV1JJVEVSX1NUQVRFLAorICAgICAgICAgICAgb2Zmc2V0ICsgZGF0YVNpemUsIGZvcm1hdCwgJm1ldGEpOworICAgIGNtZF9tZXRhX3NldF9kc3RfZm9yX2J1ZihjbWQsIGRzdCwgZm9ybWF0LCAmbWV0YSk7CisKKyAgICBjbWRfZHJhd19tZXRhKGNtZCwgJm1ldGEpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEZpbGxCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgc3RydWN0IGludGVsX2J1ZiAqZHN0ID0gaW50ZWxfYnVmKGRzdEJ1ZmZlcik7CisgICAgc3RydWN0IGludGVsX2NtZF9tZXRhIG1ldGE7CisgICAgVmtGb3JtYXQgZm9ybWF0OworCisgICAgbWVtc2V0KCZtZXRhLCAwLCBzaXplb2YobWV0YSkpOworICAgIG1ldGEubW9kZSA9IElOVEVMX0NNRF9NRVRBX1ZTX1BPSU5UUzsKKworICAgIG1ldGEuc2hhZGVyX2lkID0gSU5URUxfREVWX01FVEFfVlNfRklMTF9NRU07CisKKyAgICBtZXRhLmNsZWFyX3ZhbFswXSA9IGRhdGE7CisKKyAgICBtZXRhLmRzdC54ID0gZHN0T2Zmc2V0IC8gNDsKKyAgICBtZXRhLndpZHRoID0gc2l6ZSAvIDQ7CisgICAgbWV0YS5oZWlnaHQgPSAxOworICAgIG1ldGEuc2FtcGxlX2NvdW50ID0gMTsKKworICAgIC8qCisgICAgICogSU5URUxfREVWX01FVEFfVlNfRklMTF9NRU0gaXMgdW50eXBlZCBidXQgZXhwZWN0cyB0aGUgc3RyaWRlIHRvIGJlIDE2CisgICAgICovCisgICAgZm9ybWF0ID0gVktfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UOworCisgICAgY21kX21ldGFfc2V0X2RzdF9mb3JfYnVmKGNtZCwgZHN0LCBmb3JtYXQsICZtZXRhKTsKKworICAgIGNtZF9kcmF3X21ldGEoY21kLCAmbWV0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9tZXRhX2NsZWFyX2ltYWdlKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpyYW5nZSkKK3sKKyAgICB1aW50MzJfdCBtaXBfbGV2ZWxzLCBhcnJheV9zaXplOworICAgIHVpbnQzMl90IGksIGo7CisKKyAgICBpZiAocmFuZ2UtPmJhc2VNaXBMZXZlbCA+PSBpbWctPm1pcF9sZXZlbHMgfHwKKyAgICAgICAgcmFuZ2UtPmJhc2VBcnJheUxheWVyID49IGltZy0+YXJyYXlfc2l6ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWlwX2xldmVscyA9IGltZy0+bWlwX2xldmVscyAtIHJhbmdlLT5iYXNlTWlwTGV2ZWw7CisgICAgaWYgKG1pcF9sZXZlbHMgPiByYW5nZS0+bGV2ZWxDb3VudCkKKyAgICAgICAgbWlwX2xldmVscyA9IHJhbmdlLT5sZXZlbENvdW50OworCisgICAgYXJyYXlfc2l6ZSA9IGltZy0+YXJyYXlfc2l6ZSAtIHJhbmdlLT5iYXNlQXJyYXlMYXllcjsKKyAgICBpZiAoYXJyYXlfc2l6ZSA+IHJhbmdlLT5sYXllckNvdW50KQorICAgICAgICBhcnJheV9zaXplID0gcmFuZ2UtPmxheWVyQ291bnQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWlwX2xldmVsczsgaSsrKSB7CisgICAgICAgIG1ldGEtPmRzdC5sb2QgPSByYW5nZS0+YmFzZU1pcExldmVsICsgaTsKKyAgICAgICAgbWV0YS0+ZHN0LmxheWVyID0gcmFuZ2UtPmJhc2VBcnJheUxheWVyOworCisgICAgICAgIC8qIFRPRE8gSU5URUxfQ01EX01FVEFfRFNfSElaX0NMRUFSIHJlcXVpcmVzIDh4NCBhbGlnbmVkIHJlY3RhbmdsZSAqLworICAgICAgICBtZXRhLT53aWR0aCA9IHVfbWluaWZ5KGltZy0+bGF5b3V0LndpZHRoMCwgbWV0YS0+ZHN0LmxvZCk7CisgICAgICAgIG1ldGEtPmhlaWdodCA9IHVfbWluaWZ5KGltZy0+bGF5b3V0LmhlaWdodDAsIG1ldGEtPmRzdC5sb2QpOworCisgICAgICAgIGlmIChtZXRhLT5kcy5vcCAhPSBJTlRFTF9DTURfTUVUQV9EU19OT1AgJiYKKyAgICAgICAgICAgICFpbnRlbF9pbWdfY2FuX2VuYWJsZV9oaXooaW1nLCBtZXRhLT5kc3QubG9kKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBhcnJheV9zaXplOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChyYW5nZS0+YXNwZWN0TWFzayA9PSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUKSB7CisgICAgICAgICAgICAgICAgY21kX21ldGFfc2V0X2RzdF9mb3JfaW1nKGNtZCwgaW1nLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5kc3QubG9kLCBtZXRhLT5kc3QubGF5ZXIsIG1ldGEpOworCisgICAgICAgICAgICAgICAgY21kX2RyYXdfbWV0YShjbWQsIG1ldGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWRfbWV0YV9zZXRfZHNfdmlldyhjbWQsIGltZywgbWV0YS0+ZHN0LmxvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPmRzdC5sYXllciwgbWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKHJhbmdlLT5hc3BlY3RNYXNrICYgVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCkgeworICAgICAgICAgICAgICAgICAgICBjbWRfbWV0YV9zZXRfZHNfc3RhdGUoY21kLCBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPmNsZWFyX3ZhbFsxXSwgbWV0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgY21kX2RyYXdfbWV0YShjbWQsIG1ldGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmFuZ2UtPmFzcGVjdE1hc2sgJiBWS19JTUFHRV9BU1BFQ1RfU1RFTkNJTF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgY21kX21ldGFfc2V0X2RzX3N0YXRlKGNtZCwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPmNsZWFyX3ZhbFsxXSwgbWV0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgY21kX2RyYXdfbWV0YShjbWQsIG1ldGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0YS0+ZHN0LmxheWVyKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY21kX21ldGFfZHNfb3Aoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF9tZXRhX2RzX29wIG9wLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlICpyYW5nZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgbWV0YTsKKworICAgIGlmIChpbWctPmxheW91dC5hdXggIT0gSU5URUxfTEFZT1VUX0FVWF9ISVopCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIShyYW5nZS0+YXNwZWN0TWFzayAmIChWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUIHwgVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSkpCisgICAgICAgIHJldHVybjsKKworICAgIG1lbXNldCgmbWV0YSwgMCwgc2l6ZW9mKG1ldGEpKTsKKyAgICBtZXRhLm1vZGUgPSBJTlRFTF9DTURfTUVUQV9ERVBUSF9TVEVOQ0lMX1JFQ1Q7CisgICAgbWV0YS5zYW1wbGVfY291bnQgPSBpbWctPnNhbXBsZV9jb3VudDsKKworICAgIG1ldGEuZHMub3AgPSBvcDsKKyAgICBtZXRhLmRzLm9wdGltYWwgPSB0cnVlOworCisgICAgY21kX21ldGFfY2xlYXJfaW1hZ2UoY21kLCBpbWcsIGltZy0+bGF5b3V0LmZvcm1hdCwgJm1ldGEsIHJhbmdlKTsKK30KKwordm9pZCBjbWRfbWV0YV9jbGVhcl9jb2xvcl9pbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICAgICAgICAgICAgICAgICAgICppbWcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUgICAgICAgICAgICAqcENsZWFyQ29sb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAgICAgICpwUmFuZ2VzKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgbWV0YTsKKyAgICBWa0Zvcm1hdCBmb3JtYXQ7CisgICAgdWludDMyX3QgaTsKKworICAgIG1lbXNldCgmbWV0YSwgMCwgc2l6ZW9mKG1ldGEpKTsKKyAgICBtZXRhLm1vZGUgPSBJTlRFTF9DTURfTUVUQV9GU19SRUNUOworCisgICAgbWV0YS5zaGFkZXJfaWQgPSBJTlRFTF9ERVZfTUVUQV9GU19DTEVBUl9DT0xPUjsKKyAgICBtZXRhLnNhbXBsZV9jb3VudCA9IGltZy0+c2FtcGxlX2NvdW50OworCisgICAgbWV0YS5jbGVhcl92YWxbMF0gPSBwQ2xlYXJDb2xvci0+dWludDMyWzBdOworICAgIG1ldGEuY2xlYXJfdmFsWzFdID0gcENsZWFyQ29sb3ItPnVpbnQzMlsxXTsKKyAgICBtZXRhLmNsZWFyX3ZhbFsyXSA9IHBDbGVhckNvbG9yLT51aW50MzJbMl07CisgICAgbWV0YS5jbGVhcl92YWxbM10gPSBwQ2xlYXJDb2xvci0+dWludDMyWzNdOworICAgIGZvcm1hdCA9IGltZy0+bGF5b3V0LmZvcm1hdDsKKworICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZUNvdW50OyBpKyspIHsKKyAgICAgICAgY21kX21ldGFfY2xlYXJfaW1hZ2UoY21kLCBpbWcsIGZvcm1hdCwgJm1ldGEsICZwUmFuZ2VzW2ldKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ2xlYXJDb2xvckltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlICAgICAgICAgICAgKnBDbGVhckNvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgICAgICAqcFJhbmdlcykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWcgPSBpbnRlbF9pbWcoaW1hZ2UpOworICAgIGNtZF9tZXRhX2NsZWFyX2NvbG9yX2ltYWdlKGNvbW1hbmRCdWZmZXIsIGltZywgaW1hZ2VMYXlvdXQsIHBDbGVhckNvbG9yLCByYW5nZUNvdW50LCBwUmFuZ2VzKTsKK30KKwordm9pZCBjbWRfbWV0YV9jbGVhcl9kZXB0aF9zdGVuY2lsX2ltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgc3RydWN0IGludGVsX2ltZyogICAgICAgICAgICAgICAgICAgICAgICBpbWcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlbmNpbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgIHBSYW5nZXMpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSBtZXRhOworICAgIHVpbnQzMl90IGk7CisKKyAgICBtZW1zZXQoJm1ldGEsIDAsIHNpemVvZihtZXRhKSk7CisgICAgbWV0YS5tb2RlID0gSU5URUxfQ01EX01FVEFfREVQVEhfU1RFTkNJTF9SRUNUOworCisgICAgbWV0YS5zaGFkZXJfaWQgPSBJTlRFTF9ERVZfTUVUQV9GU19DTEVBUl9ERVBUSDsKKyAgICBtZXRhLnNhbXBsZV9jb3VudCA9IGltZy0+c2FtcGxlX2NvdW50OworCisgICAgbWV0YS5jbGVhcl92YWxbMF0gPSB1X2Z1aShkZXB0aCk7CisgICAgbWV0YS5jbGVhcl92YWxbMV0gPSBzdGVuY2lsOworCisgICAgaWYgKGltYWdlTGF5b3V0ID09IFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTCB8fAorICAgICAgICBpbWFnZUxheW91dCA9PSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTCkgeworICAgICAgICBtZXRhLmRzLm9wdGltYWwgPSB0cnVlOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZUNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgKnJhbmdlID0gJnBSYW5nZXNbaV07CisKKyAgICAgICAgY21kX21ldGFfY2xlYXJfaW1hZ2UoY21kLCBpbWcsIGltZy0+bGF5b3V0LmZvcm1hdCwKKyAgICAgICAgICAgICAgICAmbWV0YSwgcmFuZ2UpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSogICAgICAgICAgICAgcERlcHRoU3RlbmNpbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKQoreworICAgIHN0cnVjdCBpbnRlbF9pbWcgKmltZyA9IGludGVsX2ltZyhpbWFnZSk7CisgICAgY21kX21ldGFfY2xlYXJfZGVwdGhfc3RlbmNpbF9pbWFnZShjb21tYW5kQnVmZmVyLCBpbWcsIGltYWdlTGF5b3V0LCBwRGVwdGhTdGVuY2lsLT5kZXB0aCwgcERlcHRoU3RlbmNpbC0+c3RlbmNpbCwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9jbGVhcl9jb2xvcl9hdHRhY2htZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JBdHRhY2htZW50LAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBjb25zdCBWa0NsZWFyQ29sb3JWYWx1ZSAgICAgICAgICAgICAgICAqcENvbG9yLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Q291bnQsCisgICAgY29uc3QgVmtDbGVhclJlY3QgICAgICAgICAgICAgICAgICAgICAgKnBSZWN0cykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzX3N1YnBhc3MgKnN1YnBhc3MgPQorICAgICAgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3Nfc3VicGFzczsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZmIgKmZiID0gY21kLT5iaW5kLmZiOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqdmlldyA9CisgICAgICAgIGZiLT52aWV3c1tzdWJwYXNzLT5jb2xvcl9pbmRpY2VzW2NvbG9yQXR0YWNobWVudF1dOworCisgICAgLyogQ29udmVydCBlYWNoIHJlY3QzZCB0byBjbGVhciBpbnRvIGEgc3VicmVzb3VyY2UgY2xlYXIuCisgICAgICogVE9ETzogdGhpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBmdWxsIGxheWVyIGNsZWFycyAtLQorICAgICAqIGNtZF9tZXRhX2NsZWFyX2NvbG9yX2ltYWdlIGRvZXMgbm90IHByb3ZpZGUgYSBtZWFucyB0bworICAgICAqIHNwZWNpZnkgdGhlIHh5IGJvdW5kcy4KKyAgICAgKi8KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7CisgICAgICAgICAgICAgICBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULAorICAgICAgICAgICAgICAgdmlldy0+bWlwTGV2ZWwsCisgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgfTsKKworICAgICAgICAgICBjbWRfbWV0YV9jbGVhcl9jb2xvcl9pbWFnZShjb21tYW5kQnVmZmVyLCB2aWV3LT5pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjbWRfY2xlYXJfZGVwdGhfc3RlbmNpbF9hdHRhY2htZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlQXNwZWN0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0TWFzaywKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckRlcHRoU3RlbmNpbFZhbHVlKiAgICAgICAgIHBEZXB0aFN0ZW5jaWwsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RDb3VudCwKKyAgICBjb25zdCBWa0NsZWFyUmVjdCAgICAgICAgICAgICAgICAgICAgICAqcFJlY3RzKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3Nfc3VicGFzcyAqc3VicGFzcyA9CisgICAgICAgIGNtZC0+YmluZC5yZW5kZXJfcGFzc19zdWJwYXNzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9mYiAqZmIgPSBjbWQtPmJpbmQuZmI7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2F0dF92aWV3ICp2aWV3ID0gZmItPnZpZXdzW3N1YnBhc3MtPmRzX2luZGV4XTsKKworICAgIC8qIENvbnZlcnQgZWFjaCByZWN0M2QgdG8gY2xlYXIgaW50byBhIHN1YnJlc291cmNlIGNsZWFyLgorICAgICAqIFRPRE86IHRoaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgZnVsbCBsYXllciBjbGVhcnMgLS0KKyAgICAgKiBjbWRfbWV0YV9jbGVhcl9kZXB0aF9zdGVuY2lsX2ltYWdlIGRvZXMgbm90IHByb3ZpZGUgYSBtZWFucyB0bworICAgICAqIHNwZWNpZnkgdGhlIHh5IGJvdW5kcy4KKyAgICAgKi8KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspIHsKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2UgPSB7CisgICAgICAgICAgICBhc3BlY3RNYXNrLAorICAgICAgICAgICAgdmlldy0+bWlwTGV2ZWwsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEKKyAgICAgICAgfTsKKworICAgICAgICBjbWRfbWV0YV9jbGVhcl9kZXB0aF9zdGVuY2lsX2ltYWdlKGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgdmlldy0+aW1nLCBpbWFnZUxheW91dCwKKyAgICAgICAgICAgICAgICBwRGVwdGhTdGVuY2lsLT5kZXB0aCwgcERlcHRoU3RlbmNpbC0+c3RlbmNpbCwgMSwgJnJhbmdlKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ2xlYXJBdHRhY2htZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdHRhY2htZW50Q291bnQ7IGkrKykgeworICAgICAgICBpZiAocEF0dGFjaG1lbnRzW2ldLmFzcGVjdE1hc2sgPT0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCkgeworICAgICAgICAgICAgY21kX2NsZWFyX2NvbG9yX2F0dGFjaG1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldLmNvbG9yQXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+YmluZC5yZW5kZXJfcGFzcy0+YXR0YWNobWVudHNbaV0uZmluYWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBBdHRhY2htZW50c1tpXS5jbGVhclZhbHVlLmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZF9jbGVhcl9kZXB0aF9zdGVuY2lsX2F0dGFjaG1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzW2ldLmFzcGVjdE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3Nfc3VicGFzcy0+ZHNfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBBdHRhY2htZW50c1tpXS5jbGVhclZhbHVlLmRlcHRoU3RlbmNpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0cyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUmVzb2x2ZUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVJlc29sdmUqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgc3RydWN0IGludGVsX2ltZyAqc3JjID0gaW50ZWxfaW1nKHNyY0ltYWdlKTsKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICpkc3QgPSBpbnRlbF9pbWcoZHN0SW1hZ2UpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfbWV0YSBtZXRhOworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICB1aW50MzJfdCBpOworCisgICAgbWVtc2V0KCZtZXRhLCAwLCBzaXplb2YobWV0YSkpOworICAgIG1ldGEubW9kZSA9IElOVEVMX0NNRF9NRVRBX0ZTX1JFQ1Q7CisKKyAgICBzd2l0Y2ggKHNyYy0+c2FtcGxlX2NvdW50KSB7CisgICAgY2FzZSAyOgorICAgIGRlZmF1bHQ6CisgICAgICAgIG1ldGEuc2hhZGVyX2lkID0gSU5URUxfREVWX01FVEFfRlNfUkVTT0xWRV8yWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBtZXRhLnNoYWRlcl9pZCA9IElOVEVMX0RFVl9NRVRBX0ZTX1JFU09MVkVfNFg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgbWV0YS5zaGFkZXJfaWQgPSBJTlRFTF9ERVZfTUVUQV9GU19SRVNPTFZFXzhYOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgICBtZXRhLnNoYWRlcl9pZCA9IElOVEVMX0RFVl9NRVRBX0ZTX1JFU09MVkVfMTZYOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtZXRhLnNhbXBsZV9jb3VudCA9IDE7CisKKyAgICBmb3JtYXQgPSBjbWRfbWV0YV9pbWdfcmF3X2Zvcm1hdChjbWQsIHNyYy0+bGF5b3V0LmZvcm1hdCk7CisgICAgY21kX21ldGFfc2V0X3NyY19mb3JfaW1nKGNtZCwgc3JjLCBmb3JtYXQsIFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsICZtZXRhKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCByZWdpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrSW1hZ2VSZXNvbHZlICpyZWdpb24gPSAmcFJlZ2lvbnNbaV07CisgICAgICAgIGludCBhcnJheUxheWVyOworCisgICAgICAgIGZvcihhcnJheUxheWVyID0gMDsgYXJyYXlMYXllciA8IHJlZ2lvbi0+ZXh0ZW50LmRlcHRoOyBhcnJheUxheWVyKyspIHsKKyAgICAgICAgICAgIG1ldGEuc3JjLmxvZCA9IHJlZ2lvbi0+c3JjU3VicmVzb3VyY2UubWlwTGV2ZWw7CisgICAgICAgICAgICBtZXRhLnNyYy5sYXllciA9IHJlZ2lvbi0+c3JjU3VicmVzb3VyY2UuYmFzZUFycmF5TGF5ZXIgKyBhcnJheUxheWVyOworICAgICAgICAgICAgbWV0YS5zcmMueCA9IHJlZ2lvbi0+c3JjT2Zmc2V0Lng7CisgICAgICAgICAgICBtZXRhLnNyYy55ID0gcmVnaW9uLT5zcmNPZmZzZXQueTsKKworICAgICAgICAgICAgbWV0YS5kc3QubG9kID0gcmVnaW9uLT5kc3RTdWJyZXNvdXJjZS5taXBMZXZlbDsKKyAgICAgICAgICAgIG1ldGEuZHN0LmxheWVyID0gcmVnaW9uLT5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciArIGFycmF5TGF5ZXI7CisgICAgICAgICAgICBtZXRhLmRzdC54ID0gcmVnaW9uLT5kc3RPZmZzZXQueDsKKyAgICAgICAgICAgIG1ldGEuZHN0LnkgPSByZWdpb24tPmRzdE9mZnNldC55OworCisgICAgICAgICAgICBtZXRhLndpZHRoID0gcmVnaW9uLT5leHRlbnQud2lkdGg7CisgICAgICAgICAgICBtZXRhLmhlaWdodCA9IHJlZ2lvbi0+ZXh0ZW50LmhlaWdodDsKKworICAgICAgICAgICAgY21kX21ldGFfc2V0X2RzdF9mb3JfaW1nKGNtZCwgZHN0LCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIG1ldGEuZHN0LmxvZCwgbWV0YS5kc3QubGF5ZXIsICZtZXRhKTsKKworICAgICAgICAgICAgY21kX2RyYXdfbWV0YShjbWQsICZtZXRhKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jbWRfbWkuYyBiL2ljZC9pbnRlbC9jbWRfbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmExYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NtZF9taS5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAia21kL3dpbnN5cy5oIgorI2luY2x1ZGUgImJ1Zi5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAib2JqLmgiCisjaW5jbHVkZSAicXVlcnkuaCIKKyNpbmNsdWRlICJjbWRfcHJpdi5oIgorCitzdGF0aWMgdm9pZCBnZW42X01JX1NUT1JFX1JFR0lTVEVSX01FTShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnKQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDM7CisgICAgdWludDMyX3QgZHcwID0gR0VONl9NSV9DTUQoTUlfU1RPUkVfUkVHSVNURVJfTUVNKSB8CisgICAgICAgICAgICAgICAgICAgKGNtZF9sZW4gLSAyKTsKKyAgICB1aW50MzJfdCByZWxvY19mbGFncyA9IElOVEVMX1JFTE9DX1dSSVRFOworICAgIHVpbnQzMl90ICpkdzsKKyAgICB1aW50MzJfdCBwb3M7CisKKyAgICBpZiAoY21kX2dlbihjbWQpID09IElOVEVMX0dFTig2KSkgeworICAgICAgICBkdzAgfD0gR0VONl9NSV9TVE9SRV9SRUdJU1RFUl9NRU1fRFcwX1VTRV9HR1RUOworICAgICAgICByZWxvY19mbGFncyB8PSBJTlRFTF9SRUxPQ19HR1RUOworICAgIH0KKworICAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IHJlZzsKKworICAgIGNtZF9yZXNlcnZlX3JlbG9jKGNtZCwgMSk7CisgICAgY21kX2JhdGNoX3JlbG9jKGNtZCwgcG9zICsgMiwgYm8sIG9mZnNldCwgcmVsb2NfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBnZW42X01JX1NUT1JFX0RBVEFfSU1NKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWwpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gNTsKKyAgICB1aW50MzJfdCBkdzAgPSBHRU42X01JX0NNRChNSV9TVE9SRV9EQVRBX0lNTSkgfAorICAgICAgICAgICAgICAgICAgIChjbWRfbGVuIC0gMik7CisgICAgdWludDMyX3QgcmVsb2NfZmxhZ3MgPSBJTlRFTF9SRUxPQ19XUklURTsKKyAgICB1aW50MzJfdCAqZHc7CisgICAgdWludDMyX3QgcG9zOworCisgICAgaWYgKGNtZF9nZW4oY21kKSA9PSBJTlRFTF9HRU4oNikpIHsKKyAgICAgICAgZHcwIHw9IEdFTjZfTUlfU1RPUkVfREFUQV9JTU1fRFcwX1VTRV9HR1RUOworICAgICAgICByZWxvY19mbGFncyB8PSBJTlRFTF9SRUxPQ19HR1RUOworICAgIH0KKworICAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IDA7CisgICAgZHdbM10gPSAodWludDMyX3QpIHZhbDsKKyAgICBkd1s0XSA9ICh1aW50MzJfdCkgKHZhbCA+PiAzMik7CisKKyAgICBjbWRfcmVzZXJ2ZV9yZWxvYyhjbWQsIDEpOworICAgIGNtZF9iYXRjaF9yZWxvYyhjbWQsIHBvcyArIDIsIGJvLCBvZmZzZXQsIHJlbG9jX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY21kX3F1ZXJ5X3BpcGVsaW5lX3N0YXRpc3RpY3Moc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0KQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBjbWRfYmF0Y2hfZmx1c2goY21kLCBHRU42X1BJUEVfQ09OVFJPTF9DU19TVEFMTCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcXVlcnktPnJlZ19jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChxdWVyeS0+cmVnc1tpXSkgeworICAgICAgICAgICAgLyogc3RvcmUgbG93ZXIgMzIgYml0cyAqLworICAgICAgICAgICAgZ2VuNl9NSV9TVE9SRV9SRUdJU1RFUl9NRU0oY21kLCBibywgb2Zmc2V0LCBxdWVyeS0+cmVnc1tpXSk7CisgICAgICAgICAgICAvKiBzdG9yZSBoaWdoZXIgMzIgYml0cyAqLworICAgICAgICAgICAgZ2VuNl9NSV9TVE9SRV9SRUdJU1RFUl9NRU0oY21kLCBibywgb2Zmc2V0ICsgNCwgcXVlcnktPnJlZ3NbaV0gKyA0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbjZfTUlfU1RPUkVfREFUQV9JTU0oY21kLCBibywgb2Zmc2V0LCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSBzaXplb2YodWludDY0X3QpOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCZWdpblF1ZXJ5KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgIFZrUXVlcnlDb250cm9sRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9xdWVyeSAqcXVlcnkgPSBpbnRlbF9xdWVyeShxdWVyeVBvb2wpOworICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8gPSBxdWVyeS0+b2JqLm1lbS0+Ym87CisgICAgY29uc3QgVmtEZXZpY2VTaXplIG9mZnNldCA9IHF1ZXJ5LT5zbG90X3N0cmlkZSAqIHNsb3Q7CisKKyAgICBzd2l0Y2ggKHF1ZXJ5LT50eXBlKSB7CisgICAgY2FzZSBWS19RVUVSWV9UWVBFX09DQ0xVU0lPTjoKKyAgICAgICAgY21kX2JhdGNoX2RlcHRoX2NvdW50KGNtZCwgYm8sIG9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTOgorICAgICAgICBjbWRfcXVlcnlfcGlwZWxpbmVfc3RhdGlzdGljcyhjbWQsIHF1ZXJ5LCBibywgb2Zmc2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogVE9ET1ZWOiB2YWxpZGF0ZSAqLworICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRFbmRRdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSA9IGludGVsX3F1ZXJ5KHF1ZXJ5UG9vbCk7CisgICAgc3RydWN0IGludGVsX2JvICpibyA9IHF1ZXJ5LT5vYmoubWVtLT5ibzsKKyAgICBjb25zdCBWa0RldmljZVNpemUgb2Zmc2V0ID0gcXVlcnktPnNsb3Rfc3RyaWRlICogc2xvdDsKKworICAgIHN3aXRjaCAocXVlcnktPnR5cGUpIHsKKyAgICBjYXNlIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OOgorICAgICAgICBjbWRfYmF0Y2hfZGVwdGhfY291bnQoY21kLCBibywgb2Zmc2V0ICsgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTOgorICAgICAgICBjbWRfcXVlcnlfcGlwZWxpbmVfc3RhdGlzdGljcyhjbWQsIHF1ZXJ5LCBibywgb2Zmc2V0ICsgcXVlcnktPnNsb3Rfc3RyaWRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogVE9ET1ZWOiB2YWxpZGF0ZSAqLworICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNldFF1ZXJ5UG9vbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQpCit7CisgICAgLyogbm8tb3AgKi8KK30KKworc3RhdGljIHZvaWQgY21kX3dyaXRlX2V2ZW50X3ZhbHVlKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgc3RydWN0IGludGVsX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzdGFnZU1hc2ssIHVpbnQzMl90IHZhbHVlKQoreworICAgIHVpbnQzMl90IHBpcGVfY29udHJvbF9mbGFncyA9IDA7CisKKyAgICAvKiBFdmVudCBzZXR0aW5nIGlzIGRvbmUgd2l0aCBQSVBFX0NPTlRST0wgcG9zdC1zeW5jIHdyaXRlIGltbWVkaWF0ZS4KKyAgICAgKiBXaXRoIG5vIG90aGVyIFBJUEVfQ09OVFJPTCBmbGFncyBzZXQsIGl0IGJlaGF2ZXMgYXMgVktfUElQRV9FVkVOVF9UT1BfT0ZfUElQRS4KKyAgICAgKiBBbGwgb3RoZXIgcGlwZUV2ZW50IHZhbHVlcyB3aWxsIGJlaGF2ZSBhcyBWS19QSVBFX0VWRU5UX0NPTU1BTkRTX0NPTVBMRVRFLgorICAgICAqLworICAgIGlmIChzdGFnZU1hc2sgJiB+VktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQpIHsKKyAgICAgICAgcGlwZV9jb250cm9sX2ZsYWdzID0gR0VONl9QSVBFX0NPTlRST0xfQ1NfU1RBTEw7CisgICAgfQorCisgICAgY21kX2JhdGNoX2ltbWVkaWF0ZShjbWQsIHBpcGVfY29udHJvbF9mbGFncywgZXZlbnQtPm9iai5tZW0tPmJvLCAwLCB2YWx1ZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0RXZlbnQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50XywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgIHN0YWdlTWFzaykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgc3RydWN0IGludGVsX2V2ZW50ICpldmVudCA9IGludGVsX2V2ZW50KGV2ZW50Xyk7CisKKyAgICBjbWRfd3JpdGVfZXZlbnRfdmFsdWUoY21kLCBldmVudCwgc3RhZ2VNYXNrLCAxKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF8sCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9ldmVudCAqZXZlbnQgPSBpbnRlbF9ldmVudChldmVudF8pOworCisgICAgY21kX3dyaXRlX2V2ZW50X3ZhbHVlKGNtZCwgZXZlbnQsIHN0YWdlTWFzaywgMCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ29weVF1ZXJ5UG9vbFJlc3VsdHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisgICAgLyogVE9ETzogRmlsbCBpbiBmdW5jdGlvbmFsaXR5IGhlcmUgKi8KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRXcml0ZVRpbWVzdGFtcCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9xdWVyeSAqcXVlcnkgPSBpbnRlbF9xdWVyeShxdWVyeVBvb2wpOworICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8gPSBxdWVyeS0+b2JqLm1lbS0+Ym87CisgICAgY29uc3QgVmtEZXZpY2VTaXplIG9mZnNldCA9IHF1ZXJ5LT5zbG90X3N0cmlkZSAqIHNsb3Q7CisKKyAgICBpZiAoKHBpcGVsaW5lU3RhZ2UgJiB+VktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQpICYmCisgICAgICAgIHBpcGVsaW5lU3RhZ2UgIT0gVktfUElQRUxJTkVfU1RBR0VfVE9QX09GX1BJUEVfQklUKSB7CisgICAgICAgIGNtZF9iYXRjaF90aW1lc3RhbXAoY21kLCBibywgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBYWFggd2UgYXJlIG5vdCBzdXBwb3NlZCB0byB1c2UgdHdvIGNvbW1hbmRzLi4uICovCisgICAgICAgIGdlbjZfTUlfU1RPUkVfUkVHSVNURVJfTUVNKGNtZCwgYm8sIG9mZnNldCwgR0VONl9SRUdfVElNRVNUQU1QKTsKKyAgICAgICAgZ2VuNl9NSV9TVE9SRV9SRUdJU1RFUl9NRU0oY21kLCBibywgb2Zmc2V0ICsgNCwKKyAgICAgICAgICAgICAgICBHRU42X1JFR19USU1FU1RBTVAgKyA0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY21kX3BpcGVsaW5lLmMgYi9pY2QvaW50ZWwvY21kX3BpcGVsaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmZTY3NgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jbWRfcGlwZWxpbmUuYwpAQCAtMCwwICsxLDM5MTkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImdlbmh3L2dlbmh3LmgiCisjaW5jbHVkZSAiYnVmLmgiCisjaW5jbHVkZSAiZGVzYy5oIgorI2luY2x1ZGUgImltZy5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInBpcGVsaW5lLmgiCisjaW5jbHVkZSAic2FtcGxlci5oIgorI2luY2x1ZGUgInNoYWRlci5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAidmlldy5oIgorI2luY2x1ZGUgImNtZF9wcml2LmgiCisjaW5jbHVkZSAiZmIuaCIKKworc3RhdGljIHZvaWQgZ2VuNl8zRFBSSU1JVElWRShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmltX3R5cGUsIGJvb2wgaW5kZXhlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVydGV4X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJ0ZXhfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluc3RhbmNlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnN0YW5jZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVydGV4X2Jhc2UpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gNjsKKyAgICB1aW50MzJfdCBkdzAsICpkdzsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA2KTsKKworICAgIGR3MCA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RQUklNSVRJVkUpIHwKKyAgICAgICAgICBwcmltX3R5cGUgPDwgR0VONl8zRFBSSU1fRFcwX1RZUEVfX1NISUZUIHwKKyAgICAgICAgICAoY21kX2xlbiAtIDIpOworCisgICAgaWYgKGluZGV4ZWQpCisgICAgICAgIGR3MCB8PSBHRU42XzNEUFJJTV9EVzBfQUNDRVNTX1JBTkRPTTsKKworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IHZlcnRleF9jb3VudDsKKyAgICBkd1syXSA9IHZlcnRleF9zdGFydDsKKyAgICBkd1szXSA9IGluc3RhbmNlX2NvdW50OworICAgIGR3WzRdID0gaW5zdGFuY2Vfc3RhcnQ7CisgICAgZHdbNV0gPSB2ZXJ0ZXhfYmFzZTsKK30KKworc3RhdGljIHZvaWQgZ2VuN18zRFBSSU1JVElWRShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmltX3R5cGUsIGJvb2wgaW5kZXhlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVydGV4X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJ0ZXhfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluc3RhbmNlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnN0YW5jZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVydGV4X2Jhc2UpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gNzsKKyAgICB1aW50MzJfdCBkdzAsIGR3MSwgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDcsIDcuNSk7CisKKyAgICBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEUFJJTUlUSVZFKSB8IChjbWRfbGVuIC0gMik7CisgICAgZHcxID0gcHJpbV90eXBlIDw8IEdFTjdfM0RQUklNX0RXMV9UWVBFX19TSElGVDsKKworICAgIGlmIChpbmRleGVkKQorICAgICAgICBkdzEgfD0gR0VON18zRFBSSU1fRFcxX0FDQ0VTU19SQU5ET007CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBkdzA7CisgICAgZHdbMV0gPSBkdzE7CisgICAgZHdbMl0gPSB2ZXJ0ZXhfY291bnQ7CisgICAgZHdbM10gPSB2ZXJ0ZXhfc3RhcnQ7CisgICAgZHdbNF0gPSBpbnN0YW5jZV9jb3VudDsKKyAgICBkd1s1XSA9IGluc3RhbmNlX3N0YXJ0OworICAgIGR3WzZdID0gdmVydGV4X2Jhc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfUElQRV9DT05UUk9MKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgdWludDMyX3QgZHcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpibywgdWludDMyX3QgYm9fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaW1tKQoreworICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gNTsKKyAgIGNvbnN0IHVpbnQzMl90IGR3MCA9IEdFTjZfUkVOREVSX0NNRCgzRCwgUElQRV9DT05UUk9MKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoY21kX2xlbiAtIDIpOworICAgdWludDMyX3QgcmVsb2NfZmxhZ3MgPSBJTlRFTF9SRUxPQ19XUklURTsKKyAgIHVpbnQzMl90ICpkdzsKKyAgIHVpbnQzMl90IHBvczsKKworICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgIGFzc2VydChib19vZmZzZXQgJSA4ID09IDApOworCisgICBpZiAoZHcxICYgR0VONl9QSVBFX0NPTlRST0xfQ1NfU1RBTEwpIHsKKyAgICAgIC8qCisgICAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgNzM6CisgICAgICAgKgorICAgICAgICogICAgICIxIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBhbHNvIGJlIHNldCAod2hlbiBDUyBzdGFsbCBpcyBzZXQpOgorICAgICAgICoKKyAgICAgICAqICAgICAgICogRGVwdGggQ2FjaGUgRmx1c2ggRW5hYmxlIChbMF0gb2YgRFcxKQorICAgICAgICogICAgICAgKiBTdGFsbCBhdCBQaXhlbCBTY29yZWJvYXJkIChbMV0gb2YgRFcxKQorICAgICAgICogICAgICAgKiBEZXB0aCBTdGFsbCAoWzEzXSBvZiBEVzEpCisgICAgICAgKiAgICAgICAqIFBvc3QtU3luYyBPcGVyYXRpb24gKFsxM10gb2YgRFcxKQorICAgICAgICogICAgICAgKiBSZW5kZXIgVGFyZ2V0IENhY2hlIEZsdXNoIEVuYWJsZSAoWzEyXSBvZiBEVzEpCisgICAgICAgKiAgICAgICAqIE5vdGlmeSBFbmFibGUgKFs4XSBvZiBEVzEpIgorICAgICAgICoKKyAgICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgNjE6CisgICAgICAgKgorICAgICAgICogICAgICJPbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGFsc28gYmUgc2V0ICh3aGVuIENTIHN0YWxsIGlzIHNldCk6CisgICAgICAgKgorICAgICAgICogICAgICAgKiBSZW5kZXIgVGFyZ2V0IENhY2hlIEZsdXNoIEVuYWJsZSAoWzEyXSBvZiBEVzEpCisgICAgICAgKiAgICAgICAqIERlcHRoIENhY2hlIEZsdXNoIEVuYWJsZSAoWzBdIG9mIERXMSkKKyAgICAgICAqICAgICAgICogU3RhbGwgYXQgUGl4ZWwgU2NvcmVib2FyZCAoWzFdIG9mIERXMSkKKyAgICAgICAqICAgICAgICogRGVwdGggU3RhbGwgKFsxM10gb2YgRFcxKQorICAgICAgICogICAgICAgKiBQb3N0LVN5bmMgT3BlcmF0aW9uIChbMTNdIG9mIERXMSkiCisgICAgICAgKi8KKyAgICAgIHVpbnQzMl90IGJpdF90ZXN0ID0gR0VONl9QSVBFX0NPTlRST0xfUkVOREVSX0NBQ0hFX0ZMVVNIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9QSVBFX0NPTlRST0xfREVQVEhfQ0FDSEVfRkxVU0ggfAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9QSVhFTF9TQ09SRUJPQVJEX1NUQUxMIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9QSVBFX0NPTlRST0xfREVQVEhfU1RBTEw7CisKKyAgICAgIC8qIHBvc3Qtc3luYyBvcCAqLworICAgICAgYml0X3Rlc3QgfD0gR0VONl9QSVBFX0NPTlRST0xfV1JJVEVfSU1NIHwKKyAgICAgICAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX1dSSVRFX1BTX0RFUFRIX0NPVU5UIHwKKyAgICAgICAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX1dSSVRFX1RJTUVTVEFNUDsKKworICAgICAgaWYgKGNtZF9nZW4oY21kKSA9PSBJTlRFTF9HRU4oNikpCisgICAgICAgICBiaXRfdGVzdCB8PSBHRU42X1BJUEVfQ09OVFJPTF9OT1RJRllfRU5BQkxFOworCisgICAgICBhc3NlcnQoZHcxICYgYml0X3Rlc3QpOworICAgfQorCisgICBpZiAoZHcxICYgR0VONl9QSVBFX0NPTlRST0xfREVQVEhfU1RBTEwpIHsKKyAgICAgIC8qCisgICAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgNzM6CisgICAgICAgKgorICAgICAgICogICAgICJGb2xsb3dpbmcgYml0cyBtdXN0IGJlIGNsZWFyICh3aGVuIERlcHRoIFN0YWxsIGlzIHNldCk6CisgICAgICAgKgorICAgICAgICogICAgICAgKiBSZW5kZXIgVGFyZ2V0IENhY2hlIEZsdXNoIEVuYWJsZSAoWzEyXSBvZiBEVzEpCisgICAgICAgKiAgICAgICAqIERlcHRoIENhY2hlIEZsdXNoIEVuYWJsZSAoWzBdIG9mIERXMSkiCisgICAgICAgKi8KKyAgICAgIGFzc2VydCghKGR3MSAmIChHRU42X1BJUEVfQ09OVFJPTF9SRU5ERVJfQ0FDSEVfRkxVU0ggfAorICAgICAgICAgICAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNIKSkpOworICAgfQorCisgICAvKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDEgcGFydCAzLCBwYWdlIDE5OgorICAgICoKKyAgICAqICAgICAiW0RldlNOQl0gUFBHVFQgbWVtb3J5IHdyaXRlcyBieSBNSV8qIChzdWNoIGFzIE1JX1NUT1JFX0RBVEFfSU1NKQorICAgICogICAgICBhbmQgUElQRV9DT05UUk9MIGFyZSBub3Qgc3VwcG9ydGVkLiIKKyAgICAqCisgICAgKiBUaGUga2VybmVsIHdpbGwgYWRkIHRoZSBtYXBwaW5nIGF1dG9tYXRpY2FsbHkgKHdoZW4gd3JpdGUgZG9tYWluIGlzCisgICAgKiBJTlRFTF9ET01BSU5fSU5TVFJVQ1RJT04pLgorICAgICovCisgICBpZiAoY21kX2dlbihjbWQpID09IElOVEVMX0dFTig2KSAmJiBibykgeworICAgICAgYm9fb2Zmc2V0IHw9IEdFTjZfUElQRV9DT05UUk9MX0RXMl9VU0VfR0dUVDsKKyAgICAgIHJlbG9jX2ZsYWdzIHw9IElOVEVMX1JFTE9DX0dHVFQ7CisgICB9CisKKyAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgIGR3WzBdID0gZHcwOworICAgZHdbMV0gPSBkdzE7CisgICBkd1syXSA9IDA7CisgICBkd1szXSA9ICh1aW50MzJfdCkgaW1tOworICAgZHdbNF0gPSAodWludDMyX3QpIChpbW0gPj4gMzIpOworCisgICBpZiAoYm8pIHsKKyAgICAgICBjbWRfcmVzZXJ2ZV9yZWxvYyhjbWQsIDEpOworICAgICAgIGNtZF9iYXRjaF9yZWxvYyhjbWQsIHBvcyArIDIsIGJvLCBib19vZmZzZXQsIHJlbG9jX2ZsYWdzKTsKKyAgIH0KK30KKworc3RhdGljIGJvb2wgZ2VuNl9jYW5fcHJpbWl0aXZlX3Jlc3RhcnQoY29uc3Qgc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcCA9IGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljczsKKyAgICBib29sIHN1cHBvcnRlZDsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNy41KSkKKyAgICAgICAgcmV0dXJuIChwLT5wcmltX3R5cGUgIT0gR0VONl8zRFBSSU1fUkVDVExJU1QpOworCisgICAgc3dpdGNoIChwLT5wcmltX3R5cGUpIHsKKyAgICBjYXNlIEdFTjZfM0RQUklNX1BPSU5UTElTVDoKKyAgICBjYXNlIEdFTjZfM0RQUklNX0xJTkVMSVNUOgorICAgIGNhc2UgR0VONl8zRFBSSU1fTElORVNUUklQOgorICAgIGNhc2UgR0VONl8zRFBSSU1fVFJJTElTVDoKKyAgICBjYXNlIEdFTjZfM0RQUklNX1RSSVNUUklQOgorICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFzdXBwb3J0ZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAoY21kLT5iaW5kLmluZGV4LnR5cGUpIHsKKyAgICBjYXNlIFZLX0lOREVYX1RZUEVfVUlOVDE2OgorICAgICAgICBzdXBwb3J0ZWQgPSAocC0+cHJpbWl0aXZlX3Jlc3RhcnRfaW5kZXggIT0gMHhmZmZmdSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfSU5ERVhfVFlQRV9VSU5UMzI6CisgICAgICAgIHN1cHBvcnRlZCA9IChwLT5wcmltaXRpdmVfcmVzdGFydF9pbmRleCAhPSAweGZmZmZmZmZmdSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gc3VwcG9ydGVkOworfQorCitzdGF0aWMgdm9pZCBnZW42XzNEU1RBVEVfSU5ERVhfQlVGRkVSKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2J1ZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luZGV4VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV9jdXRfaW5kZXgpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMzsKKyAgICB1aW50MzJfdCBkdzAsIGVuZF9vZmZzZXQsICpkdzsKKyAgICB1bnNpZ25lZCBvZmZzZXRfYWxpZ247CisgICAgdWludDMyX3QgcG9zOworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfSU5ERVhfQlVGRkVSKSB8IChjbWRfbGVuIC0gMik7CisKKyAgICAvKiB0aGUgYml0IGlzIG1vdmVkIHRvIDNEU1RBVEVfVkYgKi8KKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3LjUpKQorICAgICAgICBhc3NlcnQoIWVuYWJsZV9jdXRfaW5kZXgpOworICAgIGlmIChlbmFibGVfY3V0X2luZGV4KQorICAgICAgICBkdzAgfD0gR0VONl9JQl9EVzBfQ1VUX0lOREVYX0VOQUJMRTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVktfSU5ERVhfVFlQRV9VSU5UMTY6CisgICAgICAgIGR3MCB8PSBHRU42X0lCX0RXMF9GT1JNQVRfV09SRDsKKyAgICAgICAgb2Zmc2V0X2FsaWduID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19JTkRFWF9UWVBFX1VJTlQzMjoKKyAgICAgICAgZHcwIHw9IEdFTjZfSUJfRFcwX0ZPUk1BVF9EV09SRDsKKyAgICAgICAgb2Zmc2V0X2FsaWduID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCEidW5zdXBwb3J0ZWQgaW5kZXggdHlwZSIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBhbGlnbmVkIGFuZCBpbmNsdXNpdmUgKi8KKyAgICBlbmRfb2Zmc2V0ID0gYnVmLT5zaXplIC0gKGJ1Zi0+c2l6ZSAlIG9mZnNldF9hbGlnbikgLSAxOworCisgICAgcG9zID0gY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworICAgIGR3WzBdID0gZHcwOworCisgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAyKTsKKyAgICBjbWRfYmF0Y2hfcmVsb2MoY21kLCBwb3MgKyAxLCBidWYtPm9iai5tZW0tPmJvLCBvZmZzZXQsIDApOworICAgIGNtZF9iYXRjaF9yZWxvYyhjbWQsIHBvcyArIDIsIGJ1Zi0+b2JqLm1lbS0+Ym8sIGVuZF9vZmZzZXQsIDApOworfQorCitzdGF0aWMgdm9pZCBnZW43NV8zRFNUQVRFX1ZGKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfY3V0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXRfaW5kZXgpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMjsKKyAgICB1aW50MzJfdCBkdzAsICpkdzsKKworICAgIENNRF9BU1NFUlQoY21kLCA3LjUsIDcuNSk7CisKKyAgICBkdzAgPSBHRU43NV9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1ZGKSB8IChjbWRfbGVuIC0gMik7CisgICAgaWYgKGVuYWJsZV9jdXRfaW5kZXgpCisgICAgICAgIGR3MCB8PSAgR0VONzVfVkZfRFcwX0NVVF9JTkRFWF9FTkFCTEU7CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBkdzA7CisgICAgZHdbMV0gPSBjdXRfaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfYWRkX3NjcmF0Y2hfc3BhY2Uoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXRjaF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnNoKQoreworICAgIGludCBzY3JhdGNoX3NwYWNlOworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBhc3NlcnQoc2gtPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplICYmCisgICAgICAgICAgIHNoLT5wZXJfdGhyZWFkX3NjcmF0Y2hfc2l6ZSAlIDEwMjQgPT0gMCAmJgorICAgICAgICAgICB1X2lzX3BvdzIoc2gtPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplKSAmJgorICAgICAgICAgICBzaC0+c2NyYXRjaF9vZmZzZXQgJSAxMDI0ID09IDApOworICAgIHNjcmF0Y2hfc3BhY2UgPSB1X2ZmcyhzaC0+cGVyX3RocmVhZF9zY3JhdGNoX3NpemUpIC0gMTE7CisKKyAgICBjbWRfcmVzZXJ2ZV9yZWxvYyhjbWQsIDEpOworICAgIGNtZF9iYXRjaF9yZWxvYyhjbWQsIGJhdGNoX3BvcywgcGlwZWxpbmUtPm9iai5tZW0tPmJvLAorICAgICAgICAgICAgc2gtPnNjcmF0Y2hfb2Zmc2V0IHwgc2NyYXRjaF9zcGFjZSwgSU5URUxfUkVMT0NfV1JJVEUpOworfQorCitzdGF0aWMgdm9pZCBnZW42XzNEU1RBVEVfR1Moc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUgPSBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3M7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqZ3MgPSAmcGlwZWxpbmUtPmdzOworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDc7CisgICAgdWludDMyX3QgZHcwLCBkdzIsIGR3NCwgZHc1LCBkdzYsICpkdzsKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNik7CisgICAgaW50IHZ1ZV9yZWFkX2xlbiA9IDA7CisgICAgaW50IHBvcyA9IDA7CisKKyAgICBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfR1MpIHwgKGNtZF9sZW4gLSAyKTsKKworICAgIGlmIChwaXBlbGluZS0+YWN0aXZlX3NoYWRlcnMgJiBTSEFERVJfR0VPTUVUUllfRkxBRykgeworCisgICAgICAgIC8vIGJhc2VkIG9uIGlsb19ncGVfaW5pdF9nc19jc29fZ2VuNgorICAgICAgICB2dWVfcmVhZF9sZW4gPSAoZ3MtPmluX2NvdW50ICsgMSkgLyAyOworICAgICAgICBpZiAoIXZ1ZV9yZWFkX2xlbikKKyAgICAgICAgICAgIHZ1ZV9yZWFkX2xlbiA9IDE7CisKKyAgICAgICAgZHcyID0gKGdzLT5zYW1wbGVyX2NvdW50ICsgMykgLyA0IDw8IEdFTjZfVEhSRUFERElTUF9TQU1QTEVSX0NPVU5UX19TSElGVCB8CisgICAgICAgICAgICAgIGdzLT5zdXJmYWNlX2NvdW50IDw8IEdFTjZfVEhSRUFERElTUF9CSU5ESU5HX1RBQkxFX1NJWkVfX1NISUZUIHwKKyAgICAgICAgICAgICAgR0VONl9USFJFQURESVNQX1NQRjsKKworICAgICAgICBkdzQgPSB2dWVfcmVhZF9sZW4gPDwgR0VONl9HU19EVzRfVVJCX1JFQURfTEVOX19TSElGVCB8CisgICAgICAgICAgICAgIDAgPDwgR0VONl9HU19EVzRfVVJCX1JFQURfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICAgIGdzLT51cmJfZ3JmX3N0YXJ0IDw8IEdFTjZfR1NfRFc0X1VSQl9HUkZfU1RBUlRfX1NISUZUOworCisgICAgICAgIGR3NSA9IChncy0+bWF4X3RocmVhZHMgLSAxKSA8PCBHRU42X0dTX0RXNV9NQVhfVEhSRUFEU19fU0hJRlQgfAorICAgICAgICAgICAgICBHRU42X0dTX0RXNV9TVEFUSVNUSUNTIHwKKyAgICAgICAgICAgICAgR0VONl9HU19EVzVfUkVOREVSX0VOQUJMRTsKKworICAgICAgICBkdzYgPSBHRU42X0dTX0RXNl9HU19FTkFCTEU7CisKKyAgICAgICAgaWYgKGdzLT5kaXNjYXJkX2FkaikKKyAgICAgICAgICAgIGR3NiB8PSBHRU42X0dTX0RXNl9ESVNDQVJEX0FESkFDRU5DWTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGR3MiA9IDA7CisgICAgICAgIGR3NCA9IDA7CisgICAgICAgIGR3NSA9IEdFTjZfR1NfRFc1X1NUQVRJU1RJQ1M7CisgICAgICAgIGR3NiA9IDA7CisgICAgfQorCisgICAgcG9zID0gY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworICAgIGR3WzBdID0gZHcwOworICAgIGR3WzFdID0gY21kLT5iaW5kLnBpcGVsaW5lLmdzX29mZnNldDsKKyAgICBkd1syXSA9IGR3MjsKKyAgICBkd1szXSA9IDA7CisgICAgZHdbNF0gPSBkdzQ7CisgICAgZHdbNV0gPSBkdzU7CisgICAgZHdbNl0gPSBkdzY7CisKKyAgICBpZiAoZ3MtPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplKQorICAgICAgICBnZW42X2FkZF9zY3JhdGNoX3NwYWNlKGNtZCwgcG9zICsgMywgcGlwZWxpbmUsIGdzKTsKK30KKworc3RhdGljIHZvaWQgZ2VuN18zRFNUQVRFX0dTKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lID0gY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKmdzID0gJnBpcGVsaW5lLT5nczsKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA3OworICAgIHVpbnQzMl90IGR3MCwgZHcyLCBkdzQsIGR3NSwgZHc2LCAqZHc7CisgICAgQ01EX0FTU0VSVChjbWQsIDcsIDcuNSk7CisgICAgaW50IHZ1ZV9yZWFkX2xlbiA9IDA7CisgICAgaW50IHBvcyA9IDA7CisKKyAgICBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfR1MpIHwgKGNtZF9sZW4gLSAyKTsKKworICAgIGlmIChwaXBlbGluZS0+YWN0aXZlX3NoYWRlcnMgJiBTSEFERVJfR0VPTUVUUllfRkxBRykgeworCisgICAgICAgIC8vIGJhc2VkIG9uIHVwbG9hZF9nc19zdGF0ZQorICAgICAgICBkdzIgPSAoZ3MtPnNhbXBsZXJfY291bnQgKyAzKSAvIDQgPDwgR0VONl9USFJFQURESVNQX1NBTVBMRVJfQ09VTlRfX1NISUZUIHwKKyAgICAgICAgICAgICAgZ3MtPnN1cmZhY2VfY291bnQgPDwgR0VONl9USFJFQURESVNQX0JJTkRJTkdfVEFCTEVfU0laRV9fU0hJRlQ7CisKKyAgICAgICAgdnVlX3JlYWRfbGVuID0gKGdzLT5pbl9jb3VudCArIDEpIC8gMjsKKyAgICAgICAgaWYgKCF2dWVfcmVhZF9sZW4pCisgICAgICAgICAgICB2dWVfcmVhZF9sZW4gPSAxOworCisgICAgICAgIGR3NCA9IChncy0+b3V0cHV0X3NpemVfaHdvcmRzICogMiAtIDEpIDw8IEdFTjdfR1NfRFc0X09VVFBVVF9TSVpFX19TSElGVCB8CisgICAgICAgICAgICAgICBncy0+b3V0cHV0X3RvcG9sb2d5IDw8IEdFTjdfR1NfRFc0X09VVFBVVF9UT1BPX19TSElGVCB8CisgICAgICAgICAgICAgICB2dWVfcmVhZF9sZW4gPDwgR0VON19HU19EVzRfVVJCX1JFQURfTEVOX19TSElGVCB8CisgICAgICAgICAgICAgICAwIDw8IEdFTjdfR1NfRFc0X1VSQl9SRUFEX09GRlNFVF9fU0hJRlQgfAorICAgICAgICAgICAgICAgZ3MtPnVyYl9ncmZfc3RhcnQgPDwgR0VON19HU19EVzRfVVJCX0dSRl9TVEFSVF9fU0hJRlQ7CisKKworICAgICAgICBkdzUgPSBncy0+Y29udHJvbF9kYXRhX2hlYWRlcl9zaXplX2h3b3JkcyA8PCBHRU43X0dTX0RXNV9DT05UUk9MX0RBVEFfSEVBREVSX1NJWkVfX1NISUZUIHwKKyAgICAgICAgICAgICAgKGdzLT5pbnZvY2F0aW9ucyAtIDEpIDw8IEdFTjdfR1NfRFc1X0lOU1RBTkNFX0NPTlRST0xfX1NISUZUIHwKKyAgICAgICAgICAgICAgR0VON19HU19EVzVfU1RBVElTVElDUyB8CisgICAgICAgICAgICAgIEdFTjdfR1NfRFc1X0dTX0VOQUJMRTsKKworICAgICAgICBkdzUgfD0gKGdzLT5kdWFsX2luc3RhbmNlZF9kaXNwYXRjaCkgPyBHRU43X0dTX0RXNV9ESVNQQVRDSF9NT0RFX0RVQUxfSU5TVEFOQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR0VON19HU19EVzVfRElTUEFUQ0hfTU9ERV9EVUFMX09CSkVDVDsKKworICAgICAgICBpZiAoZ3MtPmluY2x1ZGVfcHJpbWl0aXZlX2lkKQorICAgICAgICAgICAgZHc1IHw9IEdFTjdfR1NfRFc1X0lOQ0xVREVfUFJJTUlUSVZFX0lEOworCisgICAgICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcuNSkpIHsKKyAgICAgICAgICAgIGR3NSB8PSAoZ3MtPm1heF90aHJlYWRzIC0gMSkgPDwgR0VONzVfR1NfRFc1X01BWF9USFJFQURTX19TSElGVDsKKyAgICAgICAgICAgIGR3NSB8PSBHRU43NV9HU19EVzVfUkVPUkRFUl9UUkFJTElORzsKKyAgICAgICAgICAgIGR3NiAgPSBncy0+Y29udHJvbF9kYXRhX2Zvcm1hdCA8PCBHRU43NV9HU19EVzZfR1NDVFJMX19TSElGVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR3NSB8PSAoZ3MtPm1heF90aHJlYWRzIC0gMSkgPDwgR0VON19HU19EVzVfTUFYX1RIUkVBRFNfX1NISUZUOworICAgICAgICAgICAgZHc1IHw9IGdzLT5jb250cm9sX2RhdGFfZm9ybWF0IDw8IEdFTjdfR1NfRFc1X0dTQ1RSTF9fU0hJRlQ7CisgICAgICAgICAgICBkdzYgID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGR3MiA9IDA7CisgICAgICAgIGR3NCA9IDA7CisgICAgICAgIGR3NSA9IEdFTjdfR1NfRFc1X1NUQVRJU1RJQ1M7CisgICAgICAgIGR3NiA9IDA7CisgICAgfQorCisgICAgcG9zID0gY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworICAgIGR3WzBdID0gZHcwOworICAgIGR3WzFdID0gY21kLT5iaW5kLnBpcGVsaW5lLmdzX29mZnNldDsKKyAgICBkd1syXSA9IGR3MjsKKyAgICBkd1szXSA9IDA7CisgICAgZHdbNF0gPSBkdzQ7CisgICAgZHdbNV0gPSBkdzU7CisgICAgZHdbNl0gPSBkdzY7CisKKyAgICBpZiAoZ3MtPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplKQorICAgICAgICBnZW42X2FkZF9zY3JhdGNoX3NwYWNlKGNtZCwgcG9zICsgMywgcGlwZWxpbmUsIGdzKTsKK30KKworc3RhdGljIHZvaWQgZ2VuNl8zRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDQ7CisgICAgY29uc3QgdWludDMyX3QgZHcwID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9sZW4gLSAyKTsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKworICAgIGlmICh3aWR0aCAmJiBoZWlnaHQpIHsKKyAgICAgICAgZHdbMV0gPSAwOworICAgICAgICBkd1syXSA9IChoZWlnaHQgLSAxKSA8PCAxNiB8CisgICAgICAgICAgICAgICAgKHdpZHRoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHdbMV0gPSAxOworICAgICAgICBkd1syXSA9IDA7CisgICAgfQorCisgICAgZHdbM10gPSAwOworfQorCitzdGF0aWMgdm9pZCBnZW43X2ZpbGxfM0RTVEFURV9TRl9ib2R5KGNvbnN0IHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm9keVs2XSkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lID0gY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzcyAqcnAgPSBjbWQtPmJpbmQucmVuZGVyX3Bhc3M7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzX3N1YnBhc3MgKnN1YnBhc3MgPQorICAgICAgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3Nfc3VicGFzczsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZHluYW1pY19saW5lX3dpZHRoICpsaW5lX3dpZHRoID0gJmNtZC0+YmluZC5zdGF0ZS5saW5lX3dpZHRoOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9keW5hbWljX2RlcHRoX2JpYXMgKmRlcHRoX2JpYXMgPSAmY21kLT5iaW5kLnN0YXRlLmRlcHRoX2JpYXM7CisgICAgdWludDMyX3QgZHcxLCBkdzIsIGR3MywgZHc0LCBkdzUsIGR3NjsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgZHcxID0gR0VON19TRl9EVzFfU1RBVElTVElDUyB8CisgICAgICAgICAgR0VON19TRl9EVzFfREVQVEhfT0ZGU0VUX1NPTElEIHwKKyAgICAgICAgICBHRU43X1NGX0RXMV9ERVBUSF9PRkZTRVRfV0lSRUZSQU1FIHwKKyAgICAgICAgICBHRU43X1NGX0RXMV9ERVBUSF9PRkZTRVRfUE9JTlQgfAorICAgICAgICAgIEdFTjdfU0ZfRFcxX1ZJRVdQT1JUX0VOQUJMRSB8CisgICAgICAgICAgcGlwZWxpbmUtPmNtZF9zZl9maWxsOworCisgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgaW50IGZvcm1hdCA9IEdFTjZfWkZPUk1BVF9EMzJfRkxPQVQ7CisKKyAgICAgICAgaWYgKHN1YnBhc3MtPmRzX2luZGV4IDwgcnAtPmF0dGFjaG1lbnRfY291bnQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocnAtPmF0dGFjaG1lbnRzW3N1YnBhc3MtPmRzX2luZGV4XS5mb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgVktfRk9STUFUX0QxNl9VTk9STToKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBHRU42X1pGT1JNQVRfRDE2X1VOT1JNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVDoKKyAgICAgICAgICAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVDoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBHRU42X1pGT1JNQVRfRDMyX0ZMT0FUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoISJ1bnN1cHBvcnRlZCBkZXB0aC9zdGVuY2lsIGZvcm1hdCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHcxIHw9IGZvcm1hdCA8PCBHRU43X1NGX0RXMV9ERVBUSF9GT1JNQVRfX1NISUZUOworICAgIH0KKworICAgIGR3MiA9IHBpcGVsaW5lLT5jbWRfc2ZfY3VsbDsKKworICAgIC8qIFNjaXNzb3IgaXMgYWx3YXlzIGVuYWJsZWQgKi8KKyAgICBkdzIgfD0gR0VON19TRl9EVzJfU0NJU1NPUl9FTkFCTEU7CisKKyAgICAvLyBUT0RPOiBsaW5lIHdpZHRoIHN1cHBvcnQKKyAgICAodm9pZCkgbGluZV93aWR0aDsKKworICAgIGlmIChwaXBlbGluZS0+c2FtcGxlX2NvdW50ID4gMSkgeworICAgICAgICAgIGR3MiB8PSAxMjggPDwgR0VON19TRl9EVzJfTElORV9XSURUSF9fU0hJRlQgfAorICAgICAgICAgICAgICAgICBHRU43X1NGX0RXMl9NU1JBU1RNT0RFX09OX1BBVFRFUk47CisgICAgfSBlbHNlIHsKKyAgICAgICAgICBkdzIgfD0gMCA8PCBHRU43X1NGX0RXMl9MSU5FX1dJRFRIX19TSElGVCB8CisgICAgICAgICAgICAgICAgIEdFTjdfU0ZfRFcyX01TUkFTVE1PREVfT0ZGX1BJWEVMOworICAgIH0KKworICAgIGR3MyA9IDIgPDwgR0VON19TRl9EVzNfVFJJX1BST1ZPS0VfX1NISUZUIHwKKyAgICAgICAgICAxIDw8IEdFTjdfU0ZfRFczX0xJTkVfUFJPVk9LRV9fU0hJRlQgfAorICAgICAgICAgIDIgPDwgR0VON19TRl9EVzNfVFJJRkFOX1BST1ZPS0VfX1NISUZUIHwKKyAgICAgICAgICBHRU43X1NGX0RXM19TVUJQSVhFTF84QklUUzsKKworICAgIGlmIChwaXBlbGluZS0+ZGVwdGhCaWFzRW5hYmxlKSB7CisgICAgICAgIGR3NCA9IHVfZnVpKChmbG9hdCkgZGVwdGhfYmlhcy0+ZGVwdGhfYmlhcyAqIDIuMGYpOworICAgICAgICBkdzUgPSB1X2Z1aShkZXB0aF9iaWFzLT5zbG9wZV9zY2FsZWRfZGVwdGhfYmlhcyk7CisgICAgICAgIGR3NiA9IHVfZnVpKGRlcHRoX2JpYXMtPmRlcHRoX2JpYXNfY2xhbXApOworICAgIH0gZWxzZSB7CisgICAgICAgIGR3NCA9IDA7CisgICAgICAgIGR3NSA9IDA7CisgICAgICAgIGR3NiA9IDA7CisgICAgfQorCisgICAgYm9keVswXSA9IGR3MTsKKyAgICBib2R5WzFdID0gZHcyOworICAgIGJvZHlbMl0gPSBkdzM7CisgICAgYm9keVszXSA9IGR3NDsKKyAgICBib2R5WzRdID0gZHc1OworICAgIGJvZHlbNV0gPSBkdzY7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9TRihzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMjA7CisgICAgY29uc3QgdWludDMyX3QgZHcwID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1NGKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9sZW4gLSAyKTsKKyAgICBjb25zdCB1aW50MzJfdCAqc2JlID0gY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT5jbWRfM2RzdGF0ZV9zYmU7CisgICAgdWludDMyX3Qgc2ZbNl07CisgICAgdWludDMyX3QgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDYpOworCisgICAgZ2VuN19maWxsXzNEU1RBVEVfU0ZfYm9keShjbWQsIHNmKTsKKworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IHNiZVsxXTsKKyAgICBtZW1jcHkoJmR3WzJdLCBzZiwgc2l6ZW9mKHNmKSk7CisgICAgbWVtY3B5KCZkd1s4XSwgJnNiZVsyXSwgMTIpOworfQorCitzdGF0aWMgdm9pZCBnZW43XzNEU1RBVEVfU0Yoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDc7CisgICAgdWludDMyX3QgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDcsIDcuNSk7CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfU0YpIHwKKyAgICAgICAgICAgIChjbWRfbGVuIC0gMik7CisgICAgZ2VuN19maWxsXzNEU1RBVEVfU0ZfYm9keShjbWQsICZkd1sxXSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9DTElQKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGR3MCA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9DTElQKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9sZW4gLSAyKTsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lID0gY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnZzID0gJnBpcGVsaW5lLT52czsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpmcyA9ICZwaXBlbGluZS0+ZnM7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2R5bmFtaWNfdmlld3BvcnQgKnZpZXdwb3J0ID0gJmNtZC0+YmluZC5zdGF0ZS52aWV3cG9ydDsKKyAgICB1aW50MzJfdCBkdzEsIGR3MiwgZHczLCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIGR3MSA9IEdFTjZfQ0xJUF9EVzFfU1RBVElTVElDUzsKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgeworICAgICAgICBkdzEgfD0gR0VON19DTElQX0RXMV9TVUJQSVhFTF84QklUUyB8CisgICAgICAgICAgICAgICBHRU43X0NMSVBfRFcxX0VBUkxZX0NVTExfRU5BQkxFIHwKKyAgICAgICAgICAgICAgIHBpcGVsaW5lLT5jbWRfY2xpcF9jdWxsOworICAgIH0KKworICAgIGR3MiA9IEdFTjZfQ0xJUF9EVzJfQ0xJUF9FTkFCTEUgfAorICAgICAgICAgIEdFTjZfQ0xJUF9EVzJfQVBJTU9ERV9EM0QgfCAvKiBkZXB0aCByYW5nZSBbMCwgMV0gKi8KKyAgICAgICAgICBHRU42X0NMSVBfRFcyX1hZX1RFU1RfRU5BQkxFIHwKKyAgICAgICAgICAodnMtPmVuYWJsZV91c2VyX2NsaXAgPyAxIDogMCkgPDwgR0VONl9DTElQX0RXMl9VQ1BfQ0xJUF9FTkFCTEVTX19TSElGVCB8CisgICAgICAgICAgMiA8PCBHRU42X0NMSVBfRFcyX1RSSV9QUk9WT0tFX19TSElGVCB8CisgICAgICAgICAgMSA8PCBHRU42X0NMSVBfRFcyX0xJTkVfUFJPVk9LRV9fU0hJRlQgfAorICAgICAgICAgIDIgPDwgR0VONl9DTElQX0RXMl9UUklGQU5fUFJPVk9LRV9fU0hJRlQ7CisKKyAgICBpZiAocGlwZWxpbmUtPnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlKQorICAgICAgICBkdzIgfD0gR0VONl9DTElQX0RXMl9DTElQTU9ERV9SRUpFQ1RfQUxMOworICAgIGVsc2UKKyAgICAgICAgZHcyIHw9IEdFTjZfQ0xJUF9EVzJfQ0xJUE1PREVfTk9STUFMOworCisgICAgaWYgKHBpcGVsaW5lLT5kZXB0aENsaXBFbmFibGUpCisgICAgICAgIGR3MiB8PSBHRU42X0NMSVBfRFcyX1pfVEVTVF9FTkFCTEU7CisKKyAgICBpZiAoZnMtPmJhcnljZW50cmljX2ludGVycHMgJiAoR0VONl9JTlRFUlBfTk9OUEVSU1BFQ1RJVkVfUElYRUwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X0lOVEVSUF9OT05QRVJTUEVDVElWRV9DRU5UUk9JRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfSU5URVJQX05PTlBFUlNQRUNUSVZFX1NBTVBMRSkpCisgICAgICAgIGR3MiB8PSBHRU42X0NMSVBfRFcyX05PTlBFUlNQRUNUSVZFX0JBUllDRU5UUklDX0VOQUJMRTsKKworICAgIGR3MyA9IDB4MSA8PCBHRU42X0NMSVBfRFczX01JTl9QT0lOVF9XSURUSF9fU0hJRlQgfAorICAgICAgICAgIDB4N2ZmIDw8IEdFTjZfQ0xJUF9EVzNfTUFYX1BPSU5UX1dJRFRIX19TSElGVCB8CisgICAgICAgICAgKHZpZXdwb3J0LT52aWV3cG9ydF9jb3VudCAtIDEpOworCisgICAgLyogVE9ETzogZnJhbWVidWZmZXIgcmVxdWVzdHMgbGF5ZXJfY291bnQgPiAxICovCisgICAgaWYgKGNtZC0+YmluZC5mYi0+YXJyYXlfc2l6ZSA9PSAxKSB7CisgICAgICAgIGR3MyB8PSBHRU42X0NMSVBfRFczX1JUQUlOREVYX0ZPUkNFRF9aRVJPOworICAgIH0KKworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IGR3MTsKKyAgICBkd1syXSA9IGR3MjsKKyAgICBkd1szXSA9IGR3MzsKK30KKworc3RhdGljIHZvaWQgZ2VuNl8zRFNUQVRFX1dNKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lID0gY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKmZzID0gJnBpcGVsaW5lLT5mczsKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA5OworICAgIHVpbnQzMl90IHBvczsKKyAgICB1aW50MzJfdCBkdzAsIGR3MiwgZHc0LCBkdzUsIGR3NiwgZHc4LCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNik7CisKKyAgICBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfV00pIHwgKGNtZF9sZW4gLSAyKTsKKworICAgIGR3MiA9IChmcy0+c2FtcGxlcl9jb3VudCArIDMpIC8gNCA8PCBHRU42X1RIUkVBRERJU1BfU0FNUExFUl9DT1VOVF9fU0hJRlQgfAorICAgICAgICAgIGZzLT5zdXJmYWNlX2NvdW50IDw8IEdFTjZfVEhSRUFERElTUF9CSU5ESU5HX1RBQkxFX1NJWkVfX1NISUZUOworCisgICAgZHc0ID0gR0VONl9XTV9EVzRfU1RBVElTVElDUyB8CisgICAgICAgICAgZnMtPnVyYl9ncmZfc3RhcnQgPDwgR0VONl9XTV9EVzRfVVJCX0dSRl9TVEFSVDBfX1NISUZUIHwKKyAgICAgICAgICAwIDw8IEdFTjZfV01fRFc0X1VSQl9HUkZfU1RBUlQxX19TSElGVCB8CisgICAgICAgICAgZnMtPnVyYl9ncmZfc3RhcnRfMTYgPDwgR0VONl9XTV9EVzRfVVJCX0dSRl9TVEFSVDJfX1NISUZUOworCisgICAgZHc1ID0gKGZzLT5tYXhfdGhyZWFkcyAtIDEpIDw8IEdFTjZfV01fRFc1X01BWF9USFJFQURTX19TSElGVCB8CisgICAgICAgICAgR0VONl9XTV9EVzVfUFNfRElTUEFUQ0hfRU5BQkxFIHwKKyAgICAgICAgICBHRU42X1BTX0RJU1BBVENIXzggPDwgR0VONl9XTV9EVzVfUFNfRElTUEFUQ0hfTU9ERV9fU0hJRlQ7CisKKyAgICBpZiAoZnMtPm9mZnNldF8xNikKKyAgICAgICAgZHc1IHw9IEdFTjZfUFNfRElTUEFUQ0hfMTYgPDwgR0VONl9XTV9EVzVfUFNfRElTUEFUQ0hfTU9ERV9fU0hJRlQ7CisKKyAgICBpZiAoZnMtPnVzZXMgJiBJTlRFTF9TSEFERVJfVVNFX0tJTEwgfHwKKyAgICAgICAgcGlwZWxpbmUtPmFscGhhVG9Db3ZlcmFnZUVuYWJsZSkKKyAgICAgICAgZHc1IHw9IEdFTjZfV01fRFc1X1BTX0tJTExfUElYRUw7CisKKyAgICBpZiAoZnMtPmNvbXB1dGVkX2RlcHRoX21vZGUpCisgICAgICAgIGR3NSB8PSBHRU42X1dNX0RXNV9QU19DT01QVVRFX0RFUFRIOworICAgIGlmIChmcy0+dXNlcyAmIElOVEVMX1NIQURFUl9VU0VfREVQVEgpCisgICAgICAgIGR3NSB8PSBHRU42X1dNX0RXNV9QU19VU0VfREVQVEg7CisgICAgaWYgKGZzLT51c2VzICYgSU5URUxfU0hBREVSX1VTRV9XKQorICAgICAgICBkdzUgfD0gR0VONl9XTV9EVzVfUFNfVVNFX1c7CisKKyAgICBpZiAocGlwZWxpbmUtPmR1YWxfc291cmNlX2JsZW5kX2VuYWJsZSkKKyAgICAgICAgZHc1IHw9IEdFTjZfV01fRFc1X1BTX0RVQUxfU09VUkNFX0JMRU5EOworCisgICAgZHc2ID0gZnMtPmluX2NvdW50IDw8IEdFTjZfV01fRFc2X1NGX0FUVFJfQ09VTlRfX1NISUZUIHwKKyAgICAgICAgICBHRU42X1dNX0RXNl9QU19QT1NPRkZTRVRfTk9ORSB8CisgICAgICAgICAgR0VONl9XTV9EVzZfWldfSU5URVJQX1BJWEVMIHwKKyAgICAgICAgICBmcy0+YmFyeWNlbnRyaWNfaW50ZXJwcyA8PCBHRU42X1dNX0RXNl9CQVJZQ0VOVFJJQ19JTlRFUlBfX1NISUZUIHwKKyAgICAgICAgICBHRU42X1dNX0RXNl9QT0lOVF9SQVNUUlVMRV9VUFBFUl9SSUdIVDsKKworICAgIGlmIChwaXBlbGluZS0+c2FtcGxlX2NvdW50ID4gMSkgeworICAgICAgICBkdzYgfD0gR0VONl9XTV9EVzZfTVNSQVNUTU9ERV9PTl9QQVRURVJOIHwKKyAgICAgICAgICAgICAgIEdFTjZfV01fRFc2X01TRElTUE1PREVfUEVSUElYRUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHc2IHw9IEdFTjZfV01fRFc2X01TUkFTVE1PREVfT0ZGX1BJWEVMIHwKKyAgICAgICAgICAgICAgIEdFTjZfV01fRFc2X01TRElTUE1PREVfUEVSU0FNUExFOworICAgIH0KKworICAgIGR3OCA9IChmcy0+b2Zmc2V0XzE2KSA/IGNtZC0+YmluZC5waXBlbGluZS5mc19vZmZzZXQgKyBmcy0+b2Zmc2V0XzE2IDogMDsKKworICAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IGNtZC0+YmluZC5waXBlbGluZS5mc19vZmZzZXQ7CisgICAgZHdbMl0gPSBkdzI7CisgICAgZHdbM10gPSAwOyAvKiBzY3JhdGNoICovCisgICAgZHdbNF0gPSBkdzQ7CisgICAgZHdbNV0gPSBkdzU7CisgICAgZHdbNl0gPSBkdzY7CisgICAgZHdbN10gPSAwOyAvKiBrZXJuZWwgMSAqLworICAgIGR3WzhdID0gZHc4OyAvKiBrZXJuZWwgMiAqLworCisgICAgaWYgKGZzLT5wZXJfdGhyZWFkX3NjcmF0Y2hfc2l6ZSkKKyAgICAgICAgZ2VuNl9hZGRfc2NyYXRjaF9zcGFjZShjbWQsIHBvcyArIDMsIHBpcGVsaW5lLCBmcyk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjdfM0RTVEFURV9XTShzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSA9IGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljczsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpmcyA9ICZwaXBlbGluZS0+ZnM7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMzsKKyAgICB1aW50MzJfdCBkdzAsIGR3MSwgZHcyLCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNywgNy41KTsKKworICAgIGR3MCA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9XTSkgfCAoY21kX2xlbiAtIDIpOworCisgICAgZHcxID0gR0VON19XTV9EVzFfU1RBVElTVElDUyB8CisgICAgICAgICAgR0VON19XTV9EVzFfUFNfRElTUEFUQ0hfRU5BQkxFIHwKKyAgICAgICAgICBHRU43X1dNX0RXMV9aV19JTlRFUlBfUElYRUwgfAorICAgICAgICAgIGZzLT5iYXJ5Y2VudHJpY19pbnRlcnBzIDw8IEdFTjdfV01fRFcxX0JBUllDRU5UUklDX0lOVEVSUF9fU0hJRlQgfAorICAgICAgICAgIEdFTjdfV01fRFcxX1BPSU5UX1JBU1RSVUxFX1VQUEVSX1JJR0hUOworCisgICAgaWYgKGZzLT51c2VzICYgSU5URUxfU0hBREVSX1VTRV9LSUxMIHx8CisgICAgICAgIHBpcGVsaW5lLT5hbHBoYVRvQ292ZXJhZ2VFbmFibGUpCisgICAgICAgIGR3MSB8PSBHRU43X1dNX0RXMV9QU19LSUxMX1BJWEVMOworCisgICAgZHcxIHw9IGZzLT5jb21wdXRlZF9kZXB0aF9tb2RlIDw8IEdFTjdfV01fRFcxX1BTQ0RFUFRIX19TSElGVDsKKworICAgIGlmIChmcy0+dXNlcyAmIElOVEVMX1NIQURFUl9VU0VfREVQVEgpCisgICAgICAgIGR3MSB8PSBHRU43X1dNX0RXMV9QU19VU0VfREVQVEg7CisgICAgaWYgKGZzLT51c2VzICYgSU5URUxfU0hBREVSX1VTRV9XKQorICAgICAgICBkdzEgfD0gR0VON19XTV9EVzFfUFNfVVNFX1c7CisKKyAgICBkdzIgPSAwOworCisgICAgaWYgKHBpcGVsaW5lLT5zYW1wbGVfY291bnQgPiAxKSB7CisgICAgICAgIGR3MSB8PSBHRU43X1dNX0RXMV9NU1JBU1RNT0RFX09OX1BBVFRFUk47CisgICAgICAgIGR3MiB8PSBHRU43X1dNX0RXMl9NU0RJU1BNT0RFX1BFUlBJWEVMOworICAgIH0gZWxzZSB7CisgICAgICAgIGR3MSB8PSBHRU43X1dNX0RXMV9NU1JBU1RNT0RFX09GRl9QSVhFTDsKKyAgICAgICAgZHcyIHw9IEdFTjdfV01fRFcyX01TRElTUE1PREVfUEVSU0FNUExFOworICAgIH0KKworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IGR3MTsKKyAgICBkd1syXSA9IGR3MjsKK30KKworc3RhdGljIHZvaWQgZ2VuN18zRFNUQVRFX1BTKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lID0gY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKmZzID0gJnBpcGVsaW5lLT5mczsKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA4OworICAgIHVpbnQzMl90IGR3MCwgZHcyLCBkdzQsIGR3NSwgZHc3LCAqZHc7CisgICAgdWludDMyX3QgcG9zOworCisgICAgQ01EX0FTU0VSVChjbWQsIDcsIDcuNSk7CisKKyAgICBkdzAgPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfUFMpIHwgKGNtZF9sZW4gLSAyKTsKKworICAgIGR3MiA9IChmcy0+c2FtcGxlcl9jb3VudCArIDMpIC8gNCA8PCBHRU42X1RIUkVBRERJU1BfU0FNUExFUl9DT1VOVF9fU0hJRlQgfAorICAgICAgICAgIGZzLT5zdXJmYWNlX2NvdW50IDw8IEdFTjZfVEhSRUFERElTUF9CSU5ESU5HX1RBQkxFX1NJWkVfX1NISUZUOworCisgICAgZHc0ID0gR0VON19QU19EVzRfUE9TT0ZGU0VUX05PTkUgfAorICAgICAgICAgIEdFTjZfUFNfRElTUEFUQ0hfOCA8PCBHRU43X1BTX0RXNF9ESVNQQVRDSF9NT0RFX19TSElGVDsKKworICAgIGlmIChmcy0+b2Zmc2V0XzE2KQorICAgICAgICBkdzQgfD0gR0VONl9QU19ESVNQQVRDSF8xNiA8PCBHRU43X1BTX0RXNF9ESVNQQVRDSF9NT0RFX19TSElGVDsKKworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcuNSkpIHsKKyAgICAgICAgZHc0IHw9IChmcy0+bWF4X3RocmVhZHMgLSAxKSA8PCBHRU43NV9QU19EVzRfTUFYX1RIUkVBRFNfX1NISUZUOworICAgICAgICBkdzQgfD0gcGlwZWxpbmUtPmNtZF9zYW1wbGVfbWFzayA8PCBHRU43NV9QU19EVzRfU0FNUExFX01BU0tfX1NISUZUOworICAgIH0gZWxzZSB7CisgICAgICAgIGR3NCB8PSAoZnMtPm1heF90aHJlYWRzIC0gMSkgPDwgR0VON19QU19EVzRfTUFYX1RIUkVBRFNfX1NISUZUOworICAgIH0KKworICAgIGlmIChmcy0+aW5fY291bnQpCisgICAgICAgIGR3NCB8PSBHRU43X1BTX0RXNF9BVFRSX0VOQUJMRTsKKworICAgIGlmIChwaXBlbGluZS0+ZHVhbF9zb3VyY2VfYmxlbmRfZW5hYmxlKQorICAgICAgICBkdzQgfD0gR0VON19QU19EVzRfRFVBTF9TT1VSQ0VfQkxFTkQ7CisKKyAgICBkdzUgPSBmcy0+dXJiX2dyZl9zdGFydCA8PCBHRU43X1BTX0RXNV9VUkJfR1JGX1NUQVJUMF9fU0hJRlQgfAorICAgICAgICAgIDAgPDwgR0VON19QU19EVzVfVVJCX0dSRl9TVEFSVDFfX1NISUZUIHwKKyAgICAgICAgICBmcy0+dXJiX2dyZl9zdGFydF8xNiA8PCBHRU43X1BTX0RXNV9VUkJfR1JGX1NUQVJUMl9fU0hJRlQ7CisKKyAgICBkdzcgPSAoZnMtPm9mZnNldF8xNikgPyBjbWQtPmJpbmQucGlwZWxpbmUuZnNfb2Zmc2V0ICsgZnMtPm9mZnNldF8xNiA6IDA7CisKKyAgICBwb3MgPSBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBkdzA7CisgICAgZHdbMV0gPSBjbWQtPmJpbmQucGlwZWxpbmUuZnNfb2Zmc2V0OworICAgIGR3WzJdID0gZHcyOworICAgIGR3WzNdID0gMDsgLyogc2NyYXRjaCAqLworICAgIGR3WzRdID0gZHc0OworICAgIGR3WzVdID0gZHc1OworICAgIGR3WzZdID0gMDsgLyoga2VybmVsIDEgKi8KKyAgICBkd1s3XSA9IGR3NzsgLyoga2VybmVsIDIgKi8KKworICAgIGlmIChmcy0+cGVyX3RocmVhZF9zY3JhdGNoX3NpemUpCisgICAgICAgIGdlbjZfYWRkX3NjcmF0Y2hfc3BhY2UoY21kLCBwb3MgKyAzLCBwaXBlbGluZSwgZnMpOworfQorCitzdGF0aWMgdm9pZCBnZW42XzNEU1RBVEVfTVVMVElTQU1QTEUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9jb3VudCkKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgPyA0IDogMzsKKyAgICB1aW50MzJfdCBkdzEsIGR3MiwgZHczLCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIHN3aXRjaCAoc2FtcGxlX2NvdW50KSB7CisgICAgY2FzZSA0OgorICAgICAgICBkdzEgPSBHRU42X01VTFRJU0FNUExFX0RXMV9OVU1TQU1QTEVTXzQ7CisgICAgICAgIGR3MiA9IGNtZC0+ZGV2LT5zYW1wbGVfcGF0dGVybl80eDsKKyAgICAgICAgZHczID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBhc3NlcnQoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSk7CisgICAgICAgIGR3MSA9IEdFTjdfTVVMVElTQU1QTEVfRFcxX05VTVNBTVBMRVNfODsKKyAgICAgICAgZHcyID0gY21kLT5kZXYtPnNhbXBsZV9wYXR0ZXJuXzh4WzBdOworICAgICAgICBkdzMgPSBjbWQtPmRldi0+c2FtcGxlX3BhdHRlcm5fOHhbMV07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydChzYW1wbGVfY291bnQgPD0gMSk7CisgICAgICAgIGR3MSA9IEdFTjZfTVVMVElTQU1QTEVfRFcxX05VTVNBTVBMRVNfMTsKKyAgICAgICAgZHcyID0gMDsKKyAgICAgICAgZHczID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworCisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfTVVMVElTQU1QTEUpIHwgKGNtZF9sZW4gLSAyKTsKKyAgICBkd1sxXSA9IGR3MTsKKyAgICBkd1syXSA9IGR3MjsKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkKKyAgICAgICAgZHdbM10gPSBkdzM7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9ERVBUSF9CVUZGRVIoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYXR0X3ZpZXcgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW1hbF9kcykKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA3OworICAgIHVpbnQzMl90IGR3MCwgKmR3OworICAgIHVpbnQzMl90IHBvczsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgZHcwID0gKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpID8KKyAgICAgICAgR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0RFUFRIX0JVRkZFUikgOgorICAgICAgICBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfREVQVEhfQlVGRkVSKTsKKyAgICBkdzAgfD0gKGNtZF9sZW4gLSAyKTsKKworICAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKworICAgIGR3WzFdID0gdmlldy0+YXR0X2NtZFswXTsKKyAgICAvKiBub3RlIHRoYXQgd2Ugb25seSBlbmFibGUgSGlaIG9uIEdlbjcrICovCisgICAgaWYgKCFvcHRpbWFsX2RzKQorICAgICAgICBkd1sxXSAmPSB+R0VON19ERVBUSF9EVzFfSElaX0VOQUJMRTsKKworICAgIGR3WzJdID0gMDsKKyAgICBkd1szXSA9IHZpZXctPmF0dF9jbWRbMl07CisgICAgZHdbNF0gPSB2aWV3LT5hdHRfY21kWzNdOworICAgIGR3WzVdID0gdmlldy0+YXR0X2NtZFs0XTsKKyAgICBkd1s2XSA9IHZpZXctPmF0dF9jbWRbNV07CisKKyAgICBpZiAodmlldy0+aW1nKSB7CisgICAgICAgIGNtZF9yZXNlcnZlX3JlbG9jKGNtZCwgMSk7CisgICAgICAgIGNtZF9iYXRjaF9yZWxvYyhjbWQsIHBvcyArIDIsIHZpZXctPmltZy0+b2JqLm1lbS0+Ym8sCisgICAgICAgICAgICAgICAgdmlldy0+YXR0X2NtZFsxXSwgSU5URUxfUkVMT0NfV1JJVEUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuNl8zRFNUQVRFX1NURU5DSUxfQlVGRkVSKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYXR0X3ZpZXcgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpbWFsX2RzKQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDM7CisgICAgdWludDMyX3QgZHcwLCAqZHc7CisgICAgdWludDMyX3QgcG9zOworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBkdzAgPSAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgPworICAgICAgICBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfU1RFTkNJTF9CVUZGRVIpIDoKKyAgICAgICAgR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1NURU5DSUxfQlVGRkVSKTsKKyAgICBkdzAgfD0gKGNtZF9sZW4gLSAyKTsKKworICAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKworICAgIGlmICh2aWV3LT5oYXNfc3RlbmNpbCkgeworICAgICAgICBkd1sxXSA9IHZpZXctPmF0dF9jbWRbNl07CisKKyAgICAgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAxKTsKKyAgICAgICAgY21kX2JhdGNoX3JlbG9jKGNtZCwgcG9zICsgMiwgdmlldy0+aW1nLT5vYmoubWVtLT5ibywKKyAgICAgICAgICAgICAgICB2aWV3LT5hdHRfY21kWzddLCBJTlRFTF9SRUxPQ19XUklURSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHdbMV0gPSAwOworICAgICAgICBkd1syXSA9IDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW42XzNEU1RBVEVfSElFUl9ERVBUSF9CVUZGRVIoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGltYWxfZHMpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMzsKKyAgICB1aW50MzJfdCBkdzAsICpkdzsKKyAgICB1aW50MzJfdCBwb3M7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIGR3MCA9IChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcpKSA/CisgICAgICAgIEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUikgOgorICAgICAgICBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfSElFUl9ERVBUSF9CVUZGRVIpOworICAgIGR3MCB8PSAoY21kX2xlbiAtIDIpOworCisgICAgcG9zID0gY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworICAgIGR3WzBdID0gZHcwOworCisgICAgaWYgKHZpZXctPmhhc19oaXogJiYgb3B0aW1hbF9kcykgeworICAgICAgICBkd1sxXSA9IHZpZXctPmF0dF9jbWRbOF07CisKKyAgICAgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAxKTsKKyAgICAgICAgY21kX2JhdGNoX3JlbG9jKGNtZCwgcG9zICsgMiwgdmlldy0+aW1nLT5vYmoubWVtLT5ibywKKyAgICAgICAgICAgICAgICB2aWV3LT5hdHRfY21kWzldLCBJTlRFTF9SRUxPQ19XUklURSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHdbMV0gPSAwOworICAgICAgICBkd1syXSA9IDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW42XzNEU1RBVEVfQ0xFQVJfUEFSQU1TKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2xlYXJfdmFsKQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDI7CisgICAgY29uc3QgdWludDMyX3QgZHcwID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0NMRUFSX1BBUkFNUykgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfQ0xFQVJfUEFSQU1TX0RXMF9WQUxJRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9sZW4gLSAyKTsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNik7CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBkdzA7CisgICAgZHdbMV0gPSBjbGVhcl92YWw7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjdfM0RTVEFURV9DTEVBUl9QQVJBTVMoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbGVhcl92YWwpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMzsKKyAgICBjb25zdCB1aW50MzJfdCBkdzAgPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQ0xFQVJfUEFSQU1TKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9sZW4gLSAyKTsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNywgNy41KTsKKworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IGNsZWFyX3ZhbDsKKyAgICBkd1syXSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmxlbmRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjY19vZmZzZXQpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gNDsKKyAgICB1aW50MzJfdCBkdzAsICpkdzsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA2KTsKKworICAgIGR3MCA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUykgfAorICAgICAgICAgIChjbWRfbGVuIC0gMik7CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBkdzA7CisgICAgZHdbMV0gPSBibGVuZF9vZmZzZXQgfCAxOworICAgIGR3WzJdID0gZHNfb2Zmc2V0IHwgMTsKKyAgICBkd1szXSA9IGNjX29mZnNldCB8IDE7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSUyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2xpcF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Zfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNjX29mZnNldCkKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA0OworICAgIHVpbnQzMl90IGR3MCwgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDYpOworCisgICAgZHcwID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTKSB8CisgICAgICAgICAgR0VONl9WUF9QVFJfRFcwX0NMSVBfQ0hBTkdFRCB8CisgICAgICAgICAgR0VONl9WUF9QVFJfRFcwX1NGX0NIQU5HRUQgfAorICAgICAgICAgIEdFTjZfVlBfUFRSX0RXMF9DQ19DSEFOR0VEIHwKKyAgICAgICAgICAoY21kX2xlbiAtIDIpOworCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworICAgIGR3WzBdID0gZHcwOworICAgIGR3WzFdID0gY2xpcF9vZmZzZXQ7CisgICAgZHdbMl0gPSBzZl9vZmZzZXQ7CisgICAgZHdbM10gPSBjY19vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9TQ0lTU09SX1NUQVRFX1BPSU5URVJTKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjaXNzb3Jfb2Zmc2V0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDI7CisgICAgdWludDMyX3QgZHcwLCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNik7CisKKyAgICBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfU0NJU1NPUl9TVEFURV9QT0lOVEVSUykgfAorICAgICAgICAgIChjbWRfbGVuIC0gMik7CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBkdzA7CisgICAgZHdbMV0gPSBzY2lzc29yX29mZnNldDsKK30KKworc3RhdGljIHZvaWQgZ2VuNl8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdnNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ3Nfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHNfb2Zmc2V0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDQ7CisgICAgdWludDMyX3QgZHcwLCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNik7CisKKyAgICBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUykgfAorICAgICAgICAgIEdFTjZfQklORElOR19UQUJMRV9QVFJfRFcwX1ZTX0NIQU5HRUQgfAorICAgICAgICAgIEdFTjZfQklORElOR19UQUJMRV9QVFJfRFcwX0dTX0NIQU5HRUQgfAorICAgICAgICAgIEdFTjZfQklORElOR19UQUJMRV9QVFJfRFcwX1BTX0NIQU5HRUQgfAorICAgICAgICAgIChjbWRfbGVuIC0gMik7CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBkdzA7CisgICAgZHdbMV0gPSB2c19vZmZzZXQ7CisgICAgZHdbMl0gPSBnc19vZmZzZXQ7CisgICAgZHdbM10gPSBwc19vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBzX29mZnNldCkKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA0OworICAgIHVpbnQzMl90IGR3MCwgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDYpOworCisgICAgZHcwID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1NBTVBMRVJfU1RBVEVfUE9JTlRFUlMpIHwKKyAgICAgICAgICBHRU42X1NBTVBMRVJfUFRSX0RXMF9WU19DSEFOR0VEIHwKKyAgICAgICAgICBHRU42X1NBTVBMRVJfUFRSX0RXMF9HU19DSEFOR0VEIHwKKyAgICAgICAgICBHRU42X1NBTVBMRVJfUFRSX0RXMF9QU19DSEFOR0VEIHwKKyAgICAgICAgICAoY21kX2xlbiAtIDIpOworCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworICAgIGR3WzBdID0gZHcwOworICAgIGR3WzFdID0gdnNfb2Zmc2V0OworICAgIGR3WzJdID0gZ3Nfb2Zmc2V0OworICAgIGR3WzNdID0gcHNfb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCBnZW43XzNkc3RhdGVfcG9pbnRlcihzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Vib3AsIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSAyOworICAgIGNvbnN0IHVpbnQzMl90IGR3MCA9IEdFTjZfUkVOREVSX1RZUEVfUkVOREVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X1JFTkRFUl9TVUJUWVBFXzNEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJvcCB8IChjbWRfbGVuIC0gMik7CisgICAgdWludDMyX3QgKmR3OworCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworICAgIGR3WzBdID0gZHcwOworICAgIGR3WzFdID0gb2Zmc2V0OworfQorCitzdGF0aWMgdWludDMyX3QgZ2VuNl9CTEVORF9TVEFURShzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfYWxpZ24gPSBHRU42X0FMSUdOTUVOVF9CTEVORF9TVEFURTsKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSBJTlRFTF9NQVhfUkVOREVSX1RBUkdFVFMgKiAyOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUgPSBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3M7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKyAgICBTVEFUSUNfQVNTRVJUKEFSUkFZX1NJWkUocGlwZWxpbmUtPmNtZF9jYikgPj0gSU5URUxfTUFYX1JFTkRFUl9UQVJHRVRTKTsKKworICAgIHJldHVybiBjbWRfc3RhdGVfd3JpdGUoY21kLCBJTlRFTF9DTURfSVRFTV9CTEVORCwgY21kX2FsaWduLCBjbWRfbGVuLCBwaXBlbGluZS0+Y21kX2NiKTsKK30KKworc3RhdGljIHVpbnQzMl90IGdlbjZfREVQVEhfU1RFTkNJTF9TVEFURShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9keW5hbWljX3N0ZW5jaWwgKnN0ZW5jaWxfc3RhdGUpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSA9IGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljczsKKyAgICBjb25zdCB1aW50OF90IGNtZF9hbGlnbiA9IEdFTjZfQUxJR05NRU5UX0RFUFRIX1NURU5DSUxfU1RBVEU7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMzsKKyAgICB1aW50MzJfdCBkd1szXTsKKworICAgIGR3WzBdID0gcGlwZWxpbmUtPmNtZF9kZXB0aF9zdGVuY2lsOworCisgICAgLyogVE9ETzogZW5hYmxlIGJhY2sgZmFjaW5nIHN0ZW5jaWwgc3RhdGUgKi8KKyAgICAvKiBzYW1lIHJlYWQgYW5kIHdyaXRlIG1hc2tzIGZvciBib3RoIGZyb250IGFuZCBiYWNrIGZhY2VzICovCisgICAgZHdbMV0gPSAoc3RlbmNpbF9zdGF0ZS0+ZnJvbnQuc3RlbmNpbF9jb21wYXJlX21hc2sgJiAweGZmKSA8PCAyNCB8CisgICAgICAgICAgICAoc3RlbmNpbF9zdGF0ZS0+ZnJvbnQuc3RlbmNpbF93cml0ZV9tYXNrICYgMHhmZikgPDwgMTYgfAorICAgICAgICAgICAgKHN0ZW5jaWxfc3RhdGUtPmZyb250LnN0ZW5jaWxfY29tcGFyZV9tYXNrICYgMHhmZikgPDwgOCB8CisgICAgICAgICAgICAoc3RlbmNpbF9zdGF0ZS0+ZnJvbnQuc3RlbmNpbF93cml0ZV9tYXNrICYgMHhmZik7CisgICAgZHdbMl0gPSBwaXBlbGluZS0+Y21kX2RlcHRoX3Rlc3Q7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIGlmIChzdGVuY2lsX3N0YXRlLT5mcm9udC5zdGVuY2lsX3dyaXRlX21hc2sgJiYgcGlwZWxpbmUtPnN0ZW5jaWxUZXN0RW5hYmxlKQorICAgICAgIGR3WzBdIHw9IDEgPDwgMTg7CisKKyAgICByZXR1cm4gY21kX3N0YXRlX3dyaXRlKGNtZCwgSU5URUxfQ01EX0lURU1fREVQVEhfU1RFTkNJTCwKKyAgICAgICAgICAgIGNtZF9hbGlnbiwgY21kX2xlbiwgZHcpOworfQorCitzdGF0aWMgdWludDMyX3QgZ2VuNl9DT0xPUl9DQUxDX1NUQVRFKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RlbmNpbF9yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJsZW5kX2NvbG9yWzRdKQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2FsaWduID0gR0VONl9BTElHTk1FTlRfQ09MT1JfQ0FMQ19TVEFURTsKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA2OworICAgIHVpbnQzMl90IG9mZnNldCwgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBvZmZzZXQgPSBjbWRfc3RhdGVfcG9pbnRlcihjbWQsIElOVEVMX0NNRF9JVEVNX0NPTE9SX0NBTEMsCisgICAgICAgICAgICBjbWRfYWxpZ24sIGNtZF9sZW4sICZkdyk7CisgICAgZHdbMF0gPSBzdGVuY2lsX3JlZjsKKyAgICBkd1sxXSA9IDA7CisgICAgZHdbMl0gPSBibGVuZF9jb2xvclswXTsKKyAgICBkd1szXSA9IGJsZW5kX2NvbG9yWzFdOworICAgIGR3WzRdID0gYmxlbmRfY29sb3JbMl07CisgICAgZHdbNV0gPSBibGVuZF9jb2xvclszXTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF93YV9nZW42X3ByZV9kZXB0aF9zdGFsbF93cml0ZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBpZiAoIWNtZC0+YmluZC5kcmF3X2NvdW50KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY21kLT5iaW5kLndhX2ZsYWdzICYgSU5URUxfQ01EX1dBX0dFTjZfUFJFX0RFUFRIX1NUQUxMX1dSSVRFKQorICAgICAgICByZXR1cm47CisKKyAgICBjbWQtPmJpbmQud2FfZmxhZ3MgfD0gSU5URUxfQ01EX1dBX0dFTjZfUFJFX0RFUFRIX1NUQUxMX1dSSVRFOworCisgICAvKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDYwOgorICAgICoKKyAgICAqICAgICAiUGlwZS1jb250cm9sIHdpdGggQ1Mtc3RhbGwgYml0IHNldCBtdXN0IGJlIHNlbnQgQkVGT1JFIHRoZQorICAgICogICAgICBwaXBlLWNvbnRyb2wgd2l0aCBhIHBvc3Qtc3luYyBvcCBhbmQgbm8gd3JpdGUtY2FjaGUgZmx1c2hlcy4iCisgICAgKgorICAgICogVGhlIHdvcmthcm91bmQgYmVsb3cgbmVjZXNzaXRhdGVzIHRoaXMgd29ya2Fyb3VuZC4KKyAgICAqLworICAgIGdlbjZfUElQRV9DT05UUk9MKGNtZCwKKyAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX0NTX1NUQUxMIHwKKyAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX1BJWEVMX1NDT1JFQk9BUkRfU1RBTEwsCisgICAgICAgICAgICBOVUxMLCAwLCAwKTsKKworICAgIGdlbjZfUElQRV9DT05UUk9MKGNtZCwgR0VONl9QSVBFX0NPTlRST0xfV1JJVEVfSU1NLAorICAgICAgICAgICAgY21kLT5zY3JhdGNoX2JvLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgY21kX3dhX2dlbjZfcHJlX2NvbW1hbmRfc2NvcmVib2FyZF9zdGFsbChzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBpZiAoIWNtZC0+YmluZC5kcmF3X2NvdW50KQorICAgICAgICByZXR1cm47CisKKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsIEdFTjZfUElQRV9DT05UUk9MX1BJWEVMX1NDT1JFQk9BUkRfU1RBTEwsCisgICAgICAgICAgICBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgY21kX3dhX2dlbjdfcHJlX3ZzX2RlcHRoX3N0YWxsX3dyaXRlKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBDTURfQVNTRVJUKGNtZCwgNywgNy41KTsKKworICAgIGlmICghY21kLT5iaW5kLmRyYXdfY291bnQpCisgICAgICAgIHJldHVybjsKKworICAgIGNtZF93YV9nZW42X3ByZV9kZXB0aF9zdGFsbF93cml0ZShjbWQpOworCisgICAgZ2VuNl9QSVBFX0NPTlRST0woY21kLAorICAgICAgICAgICAgR0VONl9QSVBFX0NPTlRST0xfREVQVEhfU1RBTEwgfCBHRU42X1BJUEVfQ09OVFJPTF9XUklURV9JTU0sCisgICAgICAgICAgICBjbWQtPnNjcmF0Y2hfYm8sIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBjbWRfd2FfZ2VuN19wb3N0X2NvbW1hbmRfY3Nfc3RhbGwoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIENNRF9BU1NFUlQoY21kLCA3LCA3LjUpOworCisgICAgLyoKKyAgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDYxOgorICAgICAqCisgICAgICogICAgICJPbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGFsc28gYmUgc2V0ICh3aGVuIENTIHN0YWxsIGlzIHNldCk6CisgICAgICoKKyAgICAgKiAgICAgICAqIFJlbmRlciBUYXJnZXQgQ2FjaGUgRmx1c2ggRW5hYmxlIChbMTJdIG9mIERXMSkKKyAgICAgKiAgICAgICAqIERlcHRoIENhY2hlIEZsdXNoIEVuYWJsZSAoWzBdIG9mIERXMSkKKyAgICAgKiAgICAgICAqIFN0YWxsIGF0IFBpeGVsIFNjb3JlYm9hcmQgKFsxXSBvZiBEVzEpCisgICAgICogICAgICAgKiBEZXB0aCBTdGFsbCAoWzEzXSBvZiBEVzEpCisgICAgICogICAgICAgKiBQb3N0LVN5bmMgT3BlcmF0aW9uIChbMTNdIG9mIERXMSkiCisgICAgICovCisgICAgZ2VuNl9QSVBFX0NPTlRST0woY21kLAorICAgICAgICAgICAgR0VONl9QSVBFX0NPTlRST0xfQ1NfU1RBTEwgfAorICAgICAgICAgICAgR0VONl9QSVBFX0NPTlRST0xfUElYRUxfU0NPUkVCT0FSRF9TVEFMTCwKKyAgICAgICAgICAgIE5VTEwsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBjbWRfd2FfZ2VuN19wb3N0X2NvbW1hbmRfZGVwdGhfc3RhbGwoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIENNRF9BU1NFUlQoY21kLCA3LCA3LjUpOworCisgICAgY21kX3dhX2dlbjZfcHJlX2RlcHRoX3N0YWxsX3dyaXRlKGNtZCk7CisKKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX1NUQUxMLCBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgY21kX3dhX2dlbjZfcHJlX211bHRpc2FtcGxlX2RlcHRoX2ZsdXNoKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIGlmICghY21kLT5iaW5kLmRyYXdfY291bnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8qCisgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDMwNToKKyAgICAgKgorICAgICAqICAgICAiRHJpdmVyIG11c3QgZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSBjYWNoZXMgaW4gdGhlIGRlcHRoIHBpcGUgYXJlCisgICAgICogICAgICBmbHVzaGVkIGJlZm9yZSB0aGlzIGNvbW1hbmQgKDNEU1RBVEVfTVVMVElTQU1QTEUpIGlzIHBhcnNlZC4gVGhpcworICAgICAqICAgICAgcmVxdWlyZXMgZHJpdmVyIHRvIHNlbmQgYSBQSVBFX0NPTlRST0wgd2l0aCBhIENTIHN0YWxsIGFsb25nIHdpdGgKKyAgICAgKiAgICAgIGEgRGVwdGggRmx1c2ggcHJpb3IgdG8gdGhpcyBjb21tYW5kLiIKKyAgICAgKgorICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzA0OgorICAgICAqCisgICAgICogICAgICJEcml2ZXIgbXVzdCBpZXJhcmNoaSB0aGF0IGFsbCB0aGUgY2FjaGVzIGluIHRoZSBkZXB0aCBwaXBlIGFyZQorICAgICAqICAgICAgZmx1c2hlZCBiZWZvcmUgdGhpcyBjb21tYW5kICgzRFNUQVRFX01VTFRJU0FNUExFKSBpcyBwYXJzZWQuIFRoaXMKKyAgICAgKiAgICAgIHJlcXVpcmVzIGRyaXZlciB0byBzZW5kIGEgUElQRV9DT05UUk9MIHdpdGggYSBDUyBzdGFsbCBhbG9uZyB3aXRoCisgICAgICogICAgICBhIERlcHRoIEZsdXNoIHByaW9yIHRvIHRoaXMgY29tbWFuZC4KKyAgICAgKi8KKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsCisgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9ERVBUSF9DQUNIRV9GTFVTSCB8CisgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9DU19TVEFMTCwKKyAgICAgICAgICAgIE5VTEwsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBjbWRfd2FfZ2VuNl9wcmVfZHNfZmx1c2goc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgaWYgKCFjbWQtPmJpbmQuZHJhd19jb3VudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDMxNToKKyAgICAgKgorICAgICAqICAgICAiRHJpdmVyIG11c3Qgc2VuZCBhIGxlYXN0IG9uZSBQSVBFX0NPTlRST0wgY29tbWFuZCB3aXRoIENTIFN0YWxsCisgICAgICogICAgICBhbmQgYSBwb3N0IHN5bmMgb3BlcmF0aW9uIHByaW9yIHRvIHRoZSBncm91cCBvZiBkZXB0aAorICAgICAqICAgICAgY29tbWFuZHMoM0RTVEFURV9ERVBUSF9CVUZGRVIsIDNEU1RBVEVfQ0xFQVJfUEFSQU1TLAorICAgICAqICAgICAgM0RTVEFURV9TVEVOQ0lMX0JVRkZFUiwgYW5kIDNEU1RBVEVfSElFUl9ERVBUSF9CVUZGRVIpLiIKKyAgICAgKgorICAgICAqIFRoaXMgd29ya2Fyb3VuZCBzYXRpZmllcyBhbGwgdGhlIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgY21kX3dhX2dlbjZfcHJlX2RlcHRoX3N0YWxsX3dyaXRlKGNtZCk7CisKKyAgICAvKgorICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzE1OgorICAgICAqCisgICAgICogICAgICJSZXN0cmljdGlvbjogUHJpb3IgdG8gY2hhbmdpbmcgRGVwdGgvU3RlbmNpbCBCdWZmZXIgc3RhdGUgKGkuZS4sCisgICAgICogICAgICBhbnkgY29tYmluYXRpb24gb2YgM0RTVEFURV9ERVBUSF9CVUZGRVIsIDNEU1RBVEVfQ0xFQVJfUEFSQU1TLAorICAgICAqICAgICAgM0RTVEFURV9TVEVOQ0lMX0JVRkZFUiwgM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUikgU1cgbXVzdCBmaXJzdAorICAgICAqICAgICAgaXNzdWUgYSBwaXBlbGluZWQgZGVwdGggc3RhbGwgKFBJUEVfQ09OVFJPTCB3aXRoIERlcHRoIFN0YWxsIGJpdAorICAgICAqICAgICAgc2V0KSwgZm9sbG93ZWQgYnkgYSBwaXBlbGluZWQgZGVwdGggY2FjaGUgZmx1c2ggKFBJUEVfQ09OVFJPTCB3aXRoCisgICAgICogICAgICBEZXB0aCBGbHVzaCBCaXQgc2V0LCBmb2xsb3dlZCBieSBhbm90aGVyIHBpcGVsaW5lZCBkZXB0aCBzdGFsbAorICAgICAqICAgICAgKFBJUEVfQ09OVFJPTCB3aXRoIERlcHRoIFN0YWxsIEJpdCBzZXQpLCB1bmxlc3MgU1cgY2FuIG90aGVyd2lzZQorICAgICAqICAgICAgZ3VhcmFudGVlIHRoYXQgdGhlIHBpcGVsaW5lIGZyb20gV00gb253YXJkcyBpcyBhbHJlYWR5IGZsdXNoZWQKKyAgICAgKiAgICAgIChlLmcuLCB2aWEgYSBwcmVjZWRpbmcgTUlfRkxVU0gpLiIKKyAgICAgKi8KKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX1NUQUxMLCBOVUxMLCAwLCAwKTsKKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNILCBOVUxMLCAwLCAwKTsKKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX1NUQUxMLCBOVUxMLCAwLCAwKTsKK30KKwordm9pZCBjbWRfYmF0Y2hfc3RhdGVfYmFzZV9hZGRyZXNzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSAxMDsKKyAgICBjb25zdCB1aW50MzJfdCBkdzAgPSBHRU42X1JFTkRFUl9DTUQoQ09NTU9OLCBTVEFURV9CQVNFX0FERFJFU1MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY21kX2xlbiAtIDIpOworICAgIGNvbnN0IHVpbnQzMl90IG1vY3MgPSAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgPworICAgICAgICAoR0VON19NT0NTX0wzX1dCIDw8IDggfCBHRU43X01PQ1NfTDNfV0IgPDwgNCkgOiAwOworICAgIHVpbnQzMl90IHBvczsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKworICAgIGR3WzBdID0gZHcwOworICAgIC8qIHN0YXJ0IG9mZnNldHMgKi8KKyAgICBkd1sxXSA9IG1vY3MgfCAxOworICAgIGR3WzJdID0gMTsKKyAgICBkd1szXSA9IDE7CisgICAgZHdbNF0gPSAxOworICAgIGR3WzVdID0gMTsKKyAgICAvKiBlbmQgb2Zmc2V0cyAqLworICAgIGR3WzZdID0gMTsKKyAgICBkd1s3XSA9IDEgKyAweGZmZmZmMDAwOworICAgIGR3WzhdID0gMSArIDB4ZmZmZmYwMDA7CisgICAgZHdbOV0gPSAxOworCisgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAzKTsKKyAgICBjbWRfYmF0Y2hfcmVsb2Nfd3JpdGVyKGNtZCwgcG9zICsgMiwgSU5URUxfQ01EX1dSSVRFUl9TVVJGQUNFLAorICAgICAgICAgICAgY21kLT53cml0ZXJzW0lOVEVMX0NNRF9XUklURVJfU1VSRkFDRV0uc2JhX29mZnNldCArIDEpOworICAgIGNtZF9iYXRjaF9yZWxvY193cml0ZXIoY21kLCBwb3MgKyAzLCBJTlRFTF9DTURfV1JJVEVSX1NUQVRFLAorICAgICAgICAgICAgY21kLT53cml0ZXJzW0lOVEVMX0NNRF9XUklURVJfU1RBVEVdLnNiYV9vZmZzZXQgKyAxKTsKKyAgICBjbWRfYmF0Y2hfcmVsb2Nfd3JpdGVyKGNtZCwgcG9zICsgNSwgSU5URUxfQ01EX1dSSVRFUl9JTlNUUlVDVElPTiwKKyAgICAgICAgICAgIGNtZC0+d3JpdGVyc1tJTlRFTF9DTURfV1JJVEVSX0lOU1RSVUNUSU9OXS5zYmFfb2Zmc2V0ICsgMSk7Cit9CisKK3ZvaWQgY21kX2JhdGNoX3B1c2hfY29uc3RfYWxsb2Moc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSAoY21kLT5kZXYtPmdwdS0+Z3QgPT0gMykgPyAxNiA6IDg7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMjsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIHVpbnQzMl90ICpkdzsKKworICAgIGlmIChjbWRfZ2VuKGNtZCkgPD0gSU5URUxfR0VOKDYpKQorICAgICAgICByZXR1cm47CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNywgNy41KTsKKworICAgIC8qIDNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ194ICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuICogNSwgJmR3KTsKKyAgICBkd1swXSA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9QVVNIX0NPTlNUQU5UX0FMTE9DX1ZTKSB8IChjbWRfbGVuIC0gMik7CisgICAgZHdbMV0gPSBvZmZzZXQgPDwgR0VON19QQ0JfQUxMT0NfRFcxX09GRlNFVF9fU0hJRlQgfAorICAgICAgICAgICAgc2l6ZSA8PCBHRU43X1BDQl9BTExPQ19EVzFfU0laRV9fU0hJRlQ7CisgICAgb2Zmc2V0ICs9IHNpemU7CisKKyAgICBkdyArPSAyOworICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1BVU0hfQ09OU1RBTlRfQUxMT0NfUFMpIHwgKGNtZF9sZW4gLSAyKTsKKyAgICBkd1sxXSA9IG9mZnNldCA8PCBHRU43X1BDQl9BTExPQ19EVzFfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICBzaXplIDw8IEdFTjdfUENCX0FMTE9DX0RXMV9TSVpFX19TSElGVDsKKworICAgIGR3ICs9IDI7CisgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19IUykgfCAoY21kX2xlbiAtIDIpOworICAgIGR3WzFdID0gMCA8PCBHRU43X1BDQl9BTExPQ19EVzFfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICAwIDw8IEdFTjdfUENCX0FMTE9DX0RXMV9TSVpFX19TSElGVDsKKworICAgIGR3ICs9IDI7CisgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19EUykgfCAoY21kX2xlbiAtIDIpOworICAgIGR3WzFdID0gMCA8PCBHRU43X1BDQl9BTExPQ19EVzFfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICAwIDw8IEdFTjdfUENCX0FMTE9DX0RXMV9TSVpFX19TSElGVDsKKworICAgIGR3ICs9IDI7CisgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19HUykgfCAoY21kX2xlbiAtIDIpOworICAgIGR3WzFdID0gMCA8PCBHRU43X1BDQl9BTExPQ19EVzFfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICAwIDw8IEdFTjdfUENCX0FMTE9DX0RXMV9TSVpFX19TSElGVDsKKworICAgIC8qCisgICAgICoKKyAgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDI5MjoKKyAgICAgKgorICAgICAqICAgICAiQSBQSVBFX0NPTlRPTCBjb21tYW5kIHdpdGggdGhlIENTIFN0YWxsIGJpdCBzZXQgbXVzdCBiZSBwcm9ncmFtbWVkCisgICAgICogICAgICBpbiB0aGUgcmluZyBhZnRlciB0aGlzIGluc3RydWN0aW9uCisgICAgICogICAgICAoM0RTVEFURV9QVVNIX0NPTlNUQU5UX0FMTE9DX1BTKS4iCisgICAgICovCisgICAgY21kX3dhX2dlbjdfcG9zdF9jb21tYW5kX2NzX3N0YWxsKGNtZCk7Cit9CisKK3ZvaWQgY21kX2JhdGNoX2ZsdXNoKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgdWludDMyX3QgcGlwZV9jb250cm9sX2R3MCkKK3sKKyAgICBpZiAocGlwZV9jb250cm9sX2R3MCA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWNtZC0+YmluZC5kcmF3X2NvdW50KQorICAgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQoIShwaXBlX2NvbnRyb2xfZHcwICYgR0VONl9QSVBFX0NPTlRST0xfV1JJVEVfX01BU0spKTsKKworICAgIC8qCisgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDYwOgorICAgICAqCisgICAgICogICAgICJCZWZvcmUgYSBQSVBFX0NPTlRST0wgd2l0aCBXcml0ZSBDYWNoZSBGbHVzaCBFbmFibGUgPTEsIGEKKyAgICAgKiAgICAgIFBJUEVfQ09OVFJPTCB3aXRoIGFueSBub24temVybyBwb3N0LXN5bmMtb3AgaXMgcmVxdWlyZWQuIgorICAgICAqLworICAgIGlmIChwaXBlX2NvbnRyb2xfZHcwICYgR0VONl9QSVBFX0NPTlRST0xfUkVOREVSX0NBQ0hFX0ZMVVNIKQorICAgICAgICBjbWRfd2FfZ2VuNl9wcmVfZGVwdGhfc3RhbGxfd3JpdGUoY21kKTsKKworICAgIC8qCisgICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSA2MToKKyAgICAgKgorICAgICAqICAgICAiT25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBhbHNvIGJlIHNldCAod2hlbiBDUyBzdGFsbCBpcyBzZXQpOgorICAgICAqCisgICAgICogICAgICAgKiBSZW5kZXIgVGFyZ2V0IENhY2hlIEZsdXNoIEVuYWJsZSAoWzEyXSBvZiBEVzEpCisgICAgICogICAgICAgKiBEZXB0aCBDYWNoZSBGbHVzaCBFbmFibGUgKFswXSBvZiBEVzEpCisgICAgICogICAgICAgKiBTdGFsbCBhdCBQaXhlbCBTY29yZWJvYXJkIChbMV0gb2YgRFcxKQorICAgICAqICAgICAgICogRGVwdGggU3RhbGwgKFsxM10gb2YgRFcxKQorICAgICAqICAgICAgICogUG9zdC1TeW5jIE9wZXJhdGlvbiAoWzEzXSBvZiBEVzEpIgorICAgICAqLworICAgIGlmICgocGlwZV9jb250cm9sX2R3MCAmIEdFTjZfUElQRV9DT05UUk9MX0NTX1NUQUxMKSAmJgorICAgICAgICAhKHBpcGVfY29udHJvbF9kdzAgJiAoR0VONl9QSVBFX0NPTlRST0xfUkVOREVSX0NBQ0hFX0ZMVVNIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX1BJWEVMX1NDT1JFQk9BUkRfU1RBTEwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9QSVBFX0NPTlRST0xfREVQVEhfU1RBTEwpKSkKKyAgICAgICAgcGlwZV9jb250cm9sX2R3MCB8PSBHRU42X1BJUEVfQ09OVFJPTF9QSVhFTF9TQ09SRUJPQVJEX1NUQUxMOworCisgICAgZ2VuNl9QSVBFX0NPTlRST0woY21kLCBwaXBlX2NvbnRyb2xfZHcwLCBOVUxMLCAwLCAwKTsKK30KKwordm9pZCBjbWRfYmF0Y2hfZmx1c2hfYWxsKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjbWRfYmF0Y2hfZmx1c2goY21kLCBHRU42X1BJUEVfQ09OVFJPTF9JTlNUUlVDVElPTl9DQUNIRV9JTlZBTElEQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9SRU5ERVJfQ0FDSEVfRkxVU0ggfAorICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9WRl9DQUNIRV9JTlZBTElEQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9URVhUVVJFX0NBQ0hFX0lOVkFMSURBVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfUElQRV9DT05UUk9MX0NTX1NUQUxMKTsKK30KKwordm9pZCBjbWRfYmF0Y2hfZGVwdGhfY291bnQoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQpCit7CisgICAgY21kX3dhX2dlbjZfcHJlX2RlcHRoX3N0YWxsX3dyaXRlKGNtZCk7CisKKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsCisgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9ERVBUSF9TVEFMTCB8CisgICAgICAgICAgICBHRU42X1BJUEVfQ09OVFJPTF9XUklURV9QU19ERVBUSF9DT1VOVCwKKyAgICAgICAgICAgIGJvLCBvZmZzZXQsIDApOworfQorCit2b2lkIGNtZF9iYXRjaF90aW1lc3RhbXAoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCkKK3sKKyAgICAvKiBuZWVkIGFueSBXQSBvciBzdGFsbD8gKi8KKyAgICBnZW42X1BJUEVfQ09OVFJPTChjbWQsIEdFTjZfUElQRV9DT05UUk9MX1dSSVRFX1RJTUVTVEFNUCwgYm8sIG9mZnNldCwgMCk7Cit9CisKK3ZvaWQgY21kX2JhdGNoX2ltbWVkaWF0ZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGlwZV9jb250cm9sX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWwpCit7CisgICAgLyogbmVlZCBhbnkgV0Egb3Igc3RhbGw/ICovCisgICAgZ2VuNl9QSVBFX0NPTlRST0woY21kLAorICAgICAgICAgICAgR0VONl9QSVBFX0NPTlRST0xfV1JJVEVfSU1NIHwgcGlwZV9jb250cm9sX2ZsYWdzLAorICAgICAgICAgICAgYm8sIG9mZnNldCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgZ2VuNl9jY19zdGF0ZXMoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9keW5hbWljX2JsZW5kICpibGVuZCA9ICZjbWQtPmJpbmQuc3RhdGUuYmxlbmQ7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2R5bmFtaWNfc3RlbmNpbCAqc3MgPSAmY21kLT5iaW5kLnN0YXRlLnN0ZW5jaWw7CisgICAgdWludDMyX3QgYmxlbmRfb2Zmc2V0LCBkc19vZmZzZXQsIGNjX29mZnNldDsKKyAgICB1aW50MzJfdCBzdGVuY2lsX3JlZjsKKyAgICB1aW50MzJfdCBibGVuZF9jb2xvcls0XTsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA2KTsKKworICAgIGJsZW5kX29mZnNldCA9IGdlbjZfQkxFTkRfU1RBVEUoY21kKTsKKworICAgIGlmIChibGVuZCkKKyAgICAgICAgbWVtY3B5KGJsZW5kX2NvbG9yLCBibGVuZC0+YmxlbmRfY29uc3QsIHNpemVvZihibGVuZF9jb2xvcikpOworICAgIGVsc2UKKyAgICAgICAgbWVtc2V0KGJsZW5kX2NvbG9yLCAwLCBzaXplb2YoYmxlbmRfY29sb3IpKTsKKworICAgIGlmIChzcykgeworICAgICAgICBkc19vZmZzZXQgPSBnZW42X0RFUFRIX1NURU5DSUxfU1RBVEUoY21kLCBzcyk7CisgICAgICAgIC8qIFRPRE86IGVuYWJsZSBiYWNrIGZhY2luZyBzdGVuY2lsIHN0YXRlICovCisgICAgICAgIC8qIHNhbWUgcmVmZXJlbmNlIGZvciBib3RoIGZyb250IGFuZCBiYWNrIGZhY2VzICovCisgICAgICAgIHN0ZW5jaWxfcmVmID0gKHNzLT5mcm9udC5zdGVuY2lsX3JlZmVyZW5jZSAmIDB4ZmYpIDw8IDI0IHwKKyAgICAgICAgICAgICAgICAgICAgICAoc3MtPmZyb250LnN0ZW5jaWxfcmVmZXJlbmNlICYgMHhmZikgPDwgMTY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHNfb2Zmc2V0ID0gMDsKKyAgICAgICAgc3RlbmNpbF9yZWYgPSAwOworICAgIH0KKworICAgIGNjX29mZnNldCA9IGdlbjZfQ09MT1JfQ0FMQ19TVEFURShjbWQsIHN0ZW5jaWxfcmVmLCBibGVuZF9jb2xvcik7CisKKyAgICBnZW42XzNEU1RBVEVfQ0NfU1RBVEVfUE9JTlRFUlMoY21kLCBibGVuZF9vZmZzZXQsIGRzX29mZnNldCwgY2Nfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgZ2VuNl92aWV3cG9ydF9zdGF0ZXMoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9keW5hbWljX3ZpZXdwb3J0ICp2aWV3cG9ydCA9ICZjbWQtPmJpbmQuc3RhdGUudmlld3BvcnQ7CisgICAgdWludDMyX3Qgc2Zfb2Zmc2V0LCBjbGlwX29mZnNldCwgY2Nfb2Zmc2V0LCBzY2lzc29yX29mZnNldDsKKworICAgIGlmICghdmlld3BvcnQpCisgICAgICAgIHJldHVybjsKKworICAgIGFzc2VydCh2aWV3cG9ydC0+Y21kX2xlbiA9PSAoOCArIDQgKyAyKSAqCisgICAgICAgICAgICAvKiB2aWV3cG9ydHMgKi8gdmlld3BvcnQtPnZpZXdwb3J0X2NvdW50ICsgKC8qIHNjaXNzb3IgKi8gdmlld3BvcnQtPnZpZXdwb3J0X2NvdW50ICogMikpOworCisgICAgc2Zfb2Zmc2V0ID0gY21kX3N0YXRlX3dyaXRlKGNtZCwgSU5URUxfQ01EX0lURU1fU0ZfVklFV1BPUlQsCisgICAgICAgICAgICBHRU42X0FMSUdOTUVOVF9TRl9WSUVXUE9SVCwgOCAqIHZpZXdwb3J0LT52aWV3cG9ydF9jb3VudCwKKyAgICAgICAgICAgIHZpZXdwb3J0LT5jbWQpOworCisgICAgY2xpcF9vZmZzZXQgPSBjbWRfc3RhdGVfd3JpdGUoY21kLCBJTlRFTF9DTURfSVRFTV9DTElQX1ZJRVdQT1JULAorICAgICAgICAgICAgR0VONl9BTElHTk1FTlRfQ0xJUF9WSUVXUE9SVCwgNCAqIHZpZXdwb3J0LT52aWV3cG9ydF9jb3VudCwKKyAgICAgICAgICAgICZ2aWV3cG9ydC0+Y21kW3ZpZXdwb3J0LT5jbWRfY2xpcF9wb3NdKTsKKworICAgIGNjX29mZnNldCA9IGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX0NDX1ZJRVdQT1JULAorICAgICAgICAgICAgR0VONl9BTElHTk1FTlRfU0ZfVklFV1BPUlQsIDIgKiB2aWV3cG9ydC0+dmlld3BvcnRfY291bnQsCisgICAgICAgICAgICAmdmlld3BvcnQtPmNtZFt2aWV3cG9ydC0+Y21kX2NjX3Bvc10pOworCisgICAgc2Npc3Nvcl9vZmZzZXQgPSBjbWRfc3RhdGVfd3JpdGUoY21kLCBJTlRFTF9DTURfSVRFTV9TQ0lTU09SX1JFQ1QsCisgICAgICAgICAgICBHRU42X0FMSUdOTUVOVF9TQ0lTU09SX1JFQ1QsIDIgKiB2aWV3cG9ydC0+dmlld3BvcnRfY291bnQsCisgICAgICAgICAgICAmdmlld3BvcnQtPmNtZFt2aWV3cG9ydC0+Y21kX3NjaXNzb3JfcmVjdF9wb3NdKTsKKworICAgIGdlbjZfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSUyhjbWQsCisgICAgICAgICAgICBjbGlwX29mZnNldCwgc2Zfb2Zmc2V0LCBjY19vZmZzZXQpOworCisgICAgZ2VuNl8zRFNUQVRFX1NDSVNTT1JfU1RBVEVfUE9JTlRFUlMoY21kLCBzY2lzc29yX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjdfY2Nfc3RhdGVzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZHluYW1pY19ibGVuZCAqYmxlbmQgPSAmY21kLT5iaW5kLnN0YXRlLmJsZW5kOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9keW5hbWljX2RlcHRoX2JvdW5kcyAqZHMgPSAmY21kLT5iaW5kLnN0YXRlLmRlcHRoX2JvdW5kczsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZHluYW1pY19zdGVuY2lsICpzcyA9ICZjbWQtPmJpbmQuc3RhdGUuc3RlbmNpbDsKKyAgICB1aW50MzJfdCBzdGVuY2lsX3JlZjsKKyAgICB1aW50MzJfdCBibGVuZF9jb2xvcls0XTsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNywgNy41KTsKKworICAgIGlmICghYmxlbmQgJiYgIWRzKQorICAgICAgICByZXR1cm47CisKKyAgICBvZmZzZXQgPSBnZW42X0JMRU5EX1NUQVRFKGNtZCk7CisgICAgZ2VuN18zZHN0YXRlX3BvaW50ZXIoY21kLAorICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQkxFTkRfU1RBVEVfUE9JTlRFUlMsIG9mZnNldCk7CisKKyAgICBpZiAoYmxlbmQpCisgICAgICAgIG1lbWNweShibGVuZF9jb2xvciwgYmxlbmQtPmJsZW5kX2NvbnN0LCBzaXplb2YoYmxlbmRfY29sb3IpKTsKKyAgICBlbHNlCisgICAgICAgIG1lbXNldChibGVuZF9jb2xvciwgMCwgc2l6ZW9mKGJsZW5kX2NvbG9yKSk7CisKKyAgICBpZiAoc3MpIHsKKyAgICAgICAgb2Zmc2V0ID0gZ2VuNl9ERVBUSF9TVEVOQ0lMX1NUQVRFKGNtZCwgc3MpOworICAgICAgICAvKiBUT0RPOiBlbmFibGUgYmFjayBmYWNpbmcgc3RlbmNpbCBzdGF0ZSAqLworICAgICAgICAvKiBzYW1lIHJlZmVyZW5jZSBmb3IgYm90aCBmcm9udCBhbmQgYmFjayBmYWNlcyAqLworICAgICAgICBzdGVuY2lsX3JlZiA9IChzcy0+ZnJvbnQuc3RlbmNpbF9yZWZlcmVuY2UgJiAweGZmKSA8PCAyNCB8CisgICAgICAgICAgICAgICAgICAgICAgKHNzLT5mcm9udC5zdGVuY2lsX3JlZmVyZW5jZSAmIDB4ZmYpIDw8IDE2OworICAgICAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfREVQVEhfU1RFTkNJTF9TVEFURV9QT0lOVEVSUywKKyAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZW5jaWxfcmVmID0gMDsKKyAgICB9CisKKyAgICBvZmZzZXQgPSBnZW42X0NPTE9SX0NBTENfU1RBVEUoY21kLCBzdGVuY2lsX3JlZiwgYmxlbmRfY29sb3IpOworICAgIGdlbjdfM2RzdGF0ZV9wb2ludGVyKGNtZCwKKyAgICAgICAgICAgIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTLCBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBnZW43X3ZpZXdwb3J0X3N0YXRlcyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2R5bmFtaWNfdmlld3BvcnQgKnZpZXdwb3J0ID0gJmNtZC0+YmluZC5zdGF0ZS52aWV3cG9ydDsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgICBpZiAoIXZpZXdwb3J0KQorICAgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQodmlld3BvcnQtPmNtZF9sZW4gPT0gKDE2ICsgMiArIDIpICogdmlld3BvcnQtPnZpZXdwb3J0X2NvdW50KTsKKworICAgIG9mZnNldCA9IGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX1NGX1ZJRVdQT1JULAorICAgICAgICAgICAgR0VON19BTElHTk1FTlRfU0ZfQ0xJUF9WSUVXUE9SVCwgMTYgKiB2aWV3cG9ydC0+dmlld3BvcnRfY291bnQsCisgICAgICAgICAgICB2aWV3cG9ydC0+Y21kKTsKKyAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19TRl9DTElQLAorICAgICAgICAgICAgb2Zmc2V0KTsKKworICAgIG9mZnNldCA9IGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX0NDX1ZJRVdQT1JULAorICAgICAgICAgICAgR0VONl9BTElHTk1FTlRfQ0NfVklFV1BPUlQsIDIgKiB2aWV3cG9ydC0+dmlld3BvcnRfY291bnQsCisgICAgICAgICAgICAmdmlld3BvcnQtPmNtZFt2aWV3cG9ydC0+Y21kX2NjX3Bvc10pOworICAgIGdlbjdfM2RzdGF0ZV9wb2ludGVyKGNtZCwKKyAgICAgICAgICAgIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX0NDLAorICAgICAgICAgICAgb2Zmc2V0KTsKKworICAgIG9mZnNldCA9IGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX1NDSVNTT1JfUkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9BTElHTk1FTlRfU0NJU1NPUl9SRUNULCAyICogdmlld3BvcnQtPnZpZXdwb3J0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlld3BvcnQtPmNtZFt2aWV3cG9ydC0+Y21kX3NjaXNzb3JfcmVjdF9wb3NdKTsKKyAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfU0NJU1NPUl9TVEFURV9QT0lOVEVSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBnZW42X3BjYihzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIGludCBzdWJvcCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnNoKQoreworICAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDU7CisgICAgdWludDMyX3QgKmR3OworCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworCisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9UWVBFX1JFTkRFUiB8CisgICAgICAgICAgICBHRU42X1JFTkRFUl9TVUJUWVBFXzNEIHwKKyAgICAgICAgICAgIHN1Ym9wIHwgKGNtZF9sZW4gLSAyKTsKKyAgICBkd1sxXSA9IDA7CisgICAgZHdbMl0gPSAwOworICAgIGR3WzNdID0gMDsKKyAgICBkd1s0XSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjdfcGNiKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgaW50IHN1Ym9wLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqc2gpCit7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gNzsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX1RZUEVfUkVOREVSIHwKKyAgICAgICAgICAgIEdFTjZfUkVOREVSX1NVQlRZUEVfM0QgfAorICAgICAgICAgICAgc3Vib3AgfCAoY21kX2xlbiAtIDIpOworICAgIGR3WzFdID0gMDsKKyAgICBkd1syXSA9IDA7CisgICAgZHdbM10gPSAwOworICAgIGR3WzRdID0gMDsKKyAgICBkd1s1XSA9IDA7CisgICAgZHdbNl0gPSAwOworfQorCitzdGF0aWMgdWludDMyX3QgZW1pdF9zYW1wbGVycyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcCAqcm1hcCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiA9IGNtZC0+ZGV2LT5kZXNjX3JlZ2lvbjsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX2RzZXRfZGF0YSAqZGF0YSA9ICZjbWQtPmJpbmQuZHNldC5ncmFwaGljc19kYXRhOworICAgIGNvbnN0IHVpbnQzMl90IGJvcmRlcl9sZW4gPSAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgPyA0IDogMTI7CisgICAgY29uc3QgdWludDMyX3QgYm9yZGVyX3N0cmlkZSA9CisgICAgICAgIHVfYWxpZ24oYm9yZGVyX2xlbiwgR0VONl9BTElHTk1FTlRfU0FNUExFUl9CT1JERVJfQ09MT1JfU1RBVEUgLyA0KTsKKyAgICB1aW50MzJfdCBib3JkZXJfb2Zmc2V0LCAqYm9yZGVyX2R3LCBzYW1wbGVyX29mZnNldCwgKnNhbXBsZXJfZHc7CisgICAgdWludDMyX3Qgc3VyZmFjZV9jb3VudDsKKyAgICB1aW50MzJfdCBpOworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBpZiAoIXJtYXAgfHwgIXJtYXAtPnNhbXBsZXJfY291bnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3VyZmFjZV9jb3VudCA9IHJtYXAtPnJ0X2NvdW50ICsgcm1hcC0+dGV4dHVyZV9yZXNvdXJjZV9jb3VudCArIHJtYXAtPnJlc291cmNlX2NvdW50ICsgcm1hcC0+dWF2X2NvdW50OworCisgICAgLyoKKyAgICAgKiBub3RlIHRoYXQgd2UgY2Fubm90IGNhbGwgY21kX3N0YXRlX3BvaW50ZXIoKSBoZXJlIGFzIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBjbWRfc3RhdGVfcG9pbnRlcigpIHdvdWxkIGludmFsaWRhdGUgdGhlIHBvaW50ZXIKKyAgICAgKi8KKyAgICBib3JkZXJfb2Zmc2V0ID0gY21kX3N0YXRlX3Jlc2VydmUoY21kLCBJTlRFTF9DTURfSVRFTV9CTE9CLAorICAgICAgICAgICAgR0VONl9BTElHTk1FTlRfU0FNUExFUl9CT1JERVJfQ09MT1JfU1RBVEUsCisgICAgICAgICAgICBib3JkZXJfc3RyaWRlICogcm1hcC0+c2FtcGxlcl9jb3VudCk7CisKKyAgICBzYW1wbGVyX29mZnNldCA9IGNtZF9zdGF0ZV9wb2ludGVyKGNtZCwgSU5URUxfQ01EX0lURU1fU0FNUExFUiwKKyAgICAgICAgICAgIEdFTjZfQUxJR05NRU5UX1NBTVBMRVJfU1RBVEUsCisgICAgICAgICAgICA0ICogcm1hcC0+c2FtcGxlcl9jb3VudCwgJnNhbXBsZXJfZHcpOworCisgICAgY21kX3N0YXRlX3VwZGF0ZShjbWQsIGJvcmRlcl9vZmZzZXQsCisgICAgICAgICAgICBib3JkZXJfc3RyaWRlICogcm1hcC0+c2FtcGxlcl9jb3VudCwgJmJvcmRlcl9kdyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcm1hcC0+c2FtcGxlcl9jb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9ybWFwX3Nsb3QgKnNsb3QgPQorICAgICAgICAgICAgJnJtYXAtPnNsb3RzW3N1cmZhY2VfY291bnQgKyBpXTsKKyAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IGRlc2Nfb2Zmc2V0OworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqc2FtcGxlcjsKKworICAgICAgICBzd2l0Y2ggKHNsb3QtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBJTlRFTF9QSVBFTElORV9STUFQX1NBTVBMRVI6CisgICAgICAgICAgICBpbnRlbF9kZXNjX29mZnNldF9hZGQoJmRlc2Nfb2Zmc2V0LCAmc2xvdC0+dS5zYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAmZGF0YS0+c2V0X29mZnNldHNbc2xvdC0+aW5kZXhdKTsKKyAgICAgICAgICAgIGludGVsX2Rlc2NfcmVnaW9uX3JlYWRfc2FtcGxlcihyZWdpb24sICZkZXNjX29mZnNldCwgJnNhbXBsZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URUxfUElQRUxJTkVfUk1BUF9VTlVTRUQ6CisgICAgICAgICAgICBzYW1wbGVyID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KCEidW5leHBlY3RlZCBybWFwIHR5cGUiKTsKKyAgICAgICAgICAgIHNhbXBsZXIgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2FtcGxlcikgeworICAgICAgICAgICAgbWVtY3B5KGJvcmRlcl9kdywgJnNhbXBsZXItPmNtZFszXSwgYm9yZGVyX2xlbiAqIDQpOworCisgICAgICAgICAgICBzYW1wbGVyX2R3WzBdID0gc2FtcGxlci0+Y21kWzBdOworICAgICAgICAgICAgc2FtcGxlcl9kd1sxXSA9IHNhbXBsZXItPmNtZFsxXTsKKyAgICAgICAgICAgIHNhbXBsZXJfZHdbMl0gPSBib3JkZXJfb2Zmc2V0OworICAgICAgICAgICAgc2FtcGxlcl9kd1szXSA9IHNhbXBsZXItPmNtZFsyXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNhbXBsZXJfZHdbMF0gPSBHRU42X1NBTVBMRVJfRFcwX0RJU0FCTEU7CisgICAgICAgICAgICBzYW1wbGVyX2R3WzFdID0gMDsKKyAgICAgICAgICAgIHNhbXBsZXJfZHdbMl0gPSAwOworICAgICAgICAgICAgc2FtcGxlcl9kd1szXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBib3JkZXJfb2Zmc2V0ICs9IGJvcmRlcl9zdHJpZGUgKiA0OworICAgICAgICBib3JkZXJfZHcgKz0gYm9yZGVyX3N0cmlkZTsKKyAgICAgICAgc2FtcGxlcl9kdyArPSA0OworICAgIH0KKworICAgIHJldHVybiBzYW1wbGVyX29mZnNldDsKK30KKworc3RhdGljIHVpbnQzMl90IGVtaXRfYmluZGluZ190YWJsZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9ybWFwICpybWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb24gPSBjbWQtPmRldi0+ZGVzY19yZWdpb247CisgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9kc2V0X2RhdGEgKmRhdGEgPSAmY21kLT5iaW5kLmRzZXQuZ3JhcGhpY3NfZGF0YTsKKyAgICBjb25zdCB1aW50MzJfdCBzYmFfb2Zmc2V0ID0KKyAgICAgICAgY21kLT53cml0ZXJzW0lOVEVMX0NNRF9XUklURVJfU1VSRkFDRV0uc2JhX29mZnNldDsKKyAgICB1aW50MzJfdCBiaW5kaW5nX3RhYmxlWzI1Nl0sIG9mZnNldDsKKyAgICB1aW50MzJfdCBzdXJmYWNlX2NvdW50LCBpOworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBzdXJmYWNlX2NvdW50ID0gKHJtYXApID8KKyAgICAgICAgcm1hcC0+cnRfY291bnQgKyBybWFwLT50ZXh0dXJlX3Jlc291cmNlX2NvdW50ICsgcm1hcC0+cmVzb3VyY2VfY291bnQgKyBybWFwLT51YXZfY291bnQgOiAwOworICAgIGlmICghc3VyZmFjZV9jb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhc3NlcnQoc3VyZmFjZV9jb3VudCA8PSBBUlJBWV9TSVpFKGJpbmRpbmdfdGFibGUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzdXJmYWNlX2NvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3JtYXBfc2xvdCAqc2xvdCA9ICZybWFwLT5zbG90c1tpXTsKKyAgICAgICAgc3RydWN0IGludGVsX251bGxfdmlldyBudWxsX3ZpZXc7CisgICAgICAgIGJvb2wgbmVlZF9udWxsX3ZpZXcgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKHNsb3QtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBJTlRFTF9QSVBFTElORV9STUFQX1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzc19zdWJwYXNzICpzdWJwYXNzID0KKyAgICAgICAgICAgICAgICAgICAgY21kLT5iaW5kLnJlbmRlcl9wYXNzX3N1YnBhc3M7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ZiICpmYiA9IGNtZC0+YmluZC5mYjsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYXR0X3ZpZXcgKnZpZXcgPQorICAgICAgICAgICAgICAgICAgICAoc2xvdC0+aW5kZXggPCBzdWJwYXNzLT5jb2xvcl9jb3VudCAmJgorICAgICAgICAgICAgICAgICAgICAgc3VicGFzcy0+Y29sb3JfaW5kaWNlc1tzbG90LT5pbmRleF0gPCBmYi0+dmlld19jb3VudCkgPworICAgICAgICAgICAgICAgICAgICBmYi0+dmlld3Nbc3VicGFzcy0+Y29sb3JfaW5kaWNlc1tzbG90LT5pbmRleF1dIDogTlVMTDsKKworICAgICAgICAgICAgICAgIGlmICh2aWV3KSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGNtZF9zdXJmYWNlX3dyaXRlKGNtZCwgSU5URUxfQ01EX0lURU1fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X0FMSUdOTUVOVF9TVVJGQUNFX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXctPmNtZF9sZW4sIHZpZXctPmF0dF9jbWQpOworCisgICAgICAgICAgICAgICAgICAgIGNtZF9yZXNlcnZlX3JlbG9jKGNtZCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGNtZF9zdXJmYWNlX3JlbG9jKGNtZCwgb2Zmc2V0LCAxLCB2aWV3LT5pbWctPm9iai5tZW0tPmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXctPmF0dF9jbWRbMV0sIElOVEVMX1JFTE9DX1dSSVRFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZWVkX251bGxfdmlldyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URUxfUElQRUxJTkVfUk1BUF9TVVJGQUNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgVV9BU1NFUlRfT05MWSAqcGlwZWxpbmVfbGF5b3V0ID0KKyAgICAgICAgICAgICAgICAgICAgY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT5waXBlbGluZV9sYXlvdXQ7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkeW5faWR4ID0gc2xvdC0+dS5zdXJmYWNlLmR5bmFtaWNfb2Zmc2V0X2luZGV4OworICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBkZXNjX29mZnNldDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfbWVtICptZW07CisgICAgICAgICAgICAgICAgYm9vbCByZWFkX29ubHk7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKmNtZF9kYXRhOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZF9sZW47CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoZHluX2lkeCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR5bl9pZHggPCBwaXBlbGluZV9sYXlvdXQtPnRvdGFsX2R5bmFtaWNfZGVzY19jb3VudCk7CisKKyAgICAgICAgICAgICAgICBpbnRlbF9kZXNjX29mZnNldF9hZGQoJmRlc2Nfb2Zmc2V0LCAmc2xvdC0+dS5zdXJmYWNlLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5zZXRfb2Zmc2V0c1tzbG90LT5pbmRleF0pOworCisgICAgICAgICAgICAgICAgaW50ZWxfZGVzY19yZWdpb25fcmVhZF9zdXJmYWNlKHJlZ2lvbiwgJmRlc2Nfb2Zmc2V0LCBzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtZW0sICZyZWFkX29ubHksICZjbWRfZGF0YSwgJmNtZF9sZW4pOworICAgICAgICAgICAgICAgIGlmIChtZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZHluYW1pY19vZmZzZXQgPSAoZHluX2lkeCA+PSAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5keW5hbWljX29mZnNldHNbZHluX2lkeF0gOiAwOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByZWxvY19mbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICAocmVhZF9vbmx5KSA/IDAgOiBJTlRFTF9SRUxPQ19XUklURTsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBjbWRfc3VyZmFjZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9BTElHTk1FTlRfU1VSRkFDRV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRfbGVuLCBjbWRfZGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY21kX3N1cmZhY2VfcmVsb2MoY21kLCBvZmZzZXQsIDEsIG1lbS0+Ym8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX2RhdGFbMV0gKyBkeW5hbWljX29mZnNldCwgcmVsb2NfZmxhZ3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5lZWRfbnVsbF92aWV3ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTF9QSVBFTElORV9STUFQX1VOVVNFRDoKKyAgICAgICAgICAgIG5lZWRfbnVsbF92aWV3ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KCEidW5leHBlY3RlZCBybWFwIHR5cGUiKTsKKyAgICAgICAgICAgIG5lZWRfbnVsbF92aWV3ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRfbnVsbF92aWV3KSB7CisgICAgICAgICAgICBpbnRlbF9udWxsX3ZpZXdfaW5pdCgmbnVsbF92aWV3LCBjbWQtPmRldik7CisgICAgICAgICAgICBvZmZzZXQgPSBjbWRfc3VyZmFjZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgIEdFTjZfQUxJR05NRU5UX1NVUkZBQ0VfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIG51bGxfdmlldy5jbWRfbGVuLCBudWxsX3ZpZXcuY21kKTsKKyAgICAgICAgfQorCisgICAgICAgIGJpbmRpbmdfdGFibGVbaV0gPSBvZmZzZXQgLSBzYmFfb2Zmc2V0OworICAgIH0KKworICAgIG9mZnNldCA9IGNtZF9zdXJmYWNlX3dyaXRlKGNtZCwgSU5URUxfQ01EX0lURU1fQklORElOR19UQUJMRSwKKyAgICAgICAgICAgIEdFTjZfQUxJR05NRU5UX0JJTkRJTkdfVEFCTEVfU1RBVEUsCisgICAgICAgICAgICBzdXJmYWNlX2NvdW50LCBiaW5kaW5nX3RhYmxlKSAtIHNiYV9vZmZzZXQ7CisKKyAgICAvKiB0aGVyZSBpcyBhIDY0S0IgbGltaXQgb24gQklOSUROR19UQUJMRV9TVEFURXMgKi8KKyAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSAqIHN1cmZhY2VfY291bnQgPD0gNjQgKiAxMDI0KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9WRVJURVhfQlVGRkVSUyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSA9IGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljczsKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSAxICsgNCAqIHBpcGVsaW5lLT52Yl9jb3VudDsKKyAgICB1aW50MzJfdCAqZHc7CisgICAgdWludDMyX3QgcG9zLCBpOworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBpZiAoIXBpcGVsaW5lLT52Yl9jb3VudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcG9zID0gY21kX2JhdGNoX3BvaW50ZXIoY21kLCBjbWRfbGVuLCAmZHcpOworCisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMpIHwgKGNtZF9sZW4gLSAyKTsKKyAgICBkdysrOworICAgIHBvcysrOworCisgICAgZm9yIChpID0gMDsgaSA8IHBpcGVsaW5lLT52Yl9jb3VudDsgaSsrKSB7CisgICAgICAgIGFzc2VydChwaXBlbGluZS0+dmJbaV0uc3RyaWRlIDw9IDIwNDgpOworCisgICAgICAgIGR3WzBdID0gaSA8PCBHRU42X1ZCX0RXMF9JTkRFWF9fU0hJRlQgfAorICAgICAgICAgICAgICAgIHBpcGVsaW5lLT52YltpXS5zdHJpZGU7CisKKyAgICAgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgICAgIGR3WzBdIHw9IEdFTjdfTU9DU19MM19XQiA8PCBHRU42X1ZCX0RXMF9NT0NTX19TSElGVCB8CisgICAgICAgICAgICAgICAgICAgICBHRU43X1ZCX0RXMF9BRERSX01PRElGSUVEOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChwaXBlbGluZS0+dmJbaV0uaW5wdXRSYXRlKSB7CisgICAgICAgIGNhc2UgVktfVkVSVEVYX0lOUFVUX1JBVEVfVkVSVEVYOgorICAgICAgICAgICAgZHdbMF0gfD0gR0VONl9WQl9EVzBfQUNDRVNTX1ZFUlRFWERBVEE7CisgICAgICAgICAgICBkd1szXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19WRVJURVhfSU5QVVRfUkFURV9JTlNUQU5DRToKKyAgICAgICAgICAgIGR3WzBdIHw9IEdFTjZfVkJfRFcwX0FDQ0VTU19JTlNUQU5DRURBVEE7CisgICAgICAgICAgICBkd1szXSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCghInVua25vd24gc3RlcCByYXRlIik7CisgICAgICAgICAgICBkd1swXSB8PSBHRU42X1ZCX0RXMF9BQ0NFU1NfVkVSVEVYREFUQTsKKyAgICAgICAgICAgIGR3WzNdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNtZC0+YmluZC52ZXJ0ZXguYnVmW2ldKSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYnVmICpidWYgPSBjbWQtPmJpbmQudmVydGV4LmJ1ZltpXTsKKyAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSBvZmZzZXQgPSBjbWQtPmJpbmQudmVydGV4Lm9mZnNldFtpXTsKKworICAgICAgICAgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAyKTsKKyAgICAgICAgICAgIGNtZF9iYXRjaF9yZWxvYyhjbWQsIHBvcyArIDEsIGJ1Zi0+b2JqLm1lbS0+Ym8sIG9mZnNldCwgMCk7CisgICAgICAgICAgICBjbWRfYmF0Y2hfcmVsb2MoY21kLCBwb3MgKyAyLCBidWYtPm9iai5tZW0tPmJvLCBidWYtPnNpemUgLSAxLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR3WzBdIHw9IEdFTjZfVkJfRFcwX0lTX05VTEw7CisgICAgICAgICAgICBkd1sxXSA9IDA7CisgICAgICAgICAgICBkd1syXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBkdyArPSA0OworICAgICAgICBwb3MgKz0gNDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfM0RTVEFURV9WUyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSA9IGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljczsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICp2cyA9ICZwaXBlbGluZS0+dnM7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gNjsKKyAgICBjb25zdCB1aW50MzJfdCBkdzAgPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfVlMpIHwgKGNtZF9sZW4gLSAyKTsKKyAgICB1aW50MzJfdCBkdzIsIGR3NCwgZHc1LCAqZHc7CisgICAgdWludDMyX3QgcG9zOworICAgIGludCB2dWVfcmVhZF9sZW47CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIC8qCisgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDEzNToKKyAgICAgKgorICAgICAqICAgICAiKFZlcnRleCBVUkIgRW50cnkgUmVhZCBMZW5ndGgpIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBhaXJzIG9mCisgICAgICogICAgICAxMjgtYml0IHZlcnRleCBlbGVtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgcGF5bG9hZCBmb3IgZWFjaAorICAgICAqICAgICAgdmVydGV4LiIKKyAgICAgKgorICAgICAqICAgICAiSXQgaXMgVU5ERUZJTkVEIHRvIHNldCB0aGlzIGZpZWxkIHRvIDAgaW5kaWNhdGluZyBubyBWZXJ0ZXggVVJCCisgICAgICogICAgICBkYXRhIHRvIGJlIHJlYWQgYW5kIHBhc3NlZCB0byB0aGUgdGhyZWFkLiIKKyAgICAgKi8KKyAgICB2dWVfcmVhZF9sZW4gPSAodnMtPmluX2NvdW50ICsgMSkgLyAyOworICAgIGlmICghdnVlX3JlYWRfbGVuKQorICAgICAgICB2dWVfcmVhZF9sZW4gPSAxOworCisgICAgZHcyID0gKHZzLT5zYW1wbGVyX2NvdW50ICsgMykgLyA0IDw8IEdFTjZfVEhSRUFERElTUF9TQU1QTEVSX0NPVU5UX19TSElGVCB8CisgICAgICAgICAgdnMtPnN1cmZhY2VfY291bnQgPDwgR0VONl9USFJFQURESVNQX0JJTkRJTkdfVEFCTEVfU0laRV9fU0hJRlQ7CisKKyAgICBkdzQgPSB2cy0+dXJiX2dyZl9zdGFydCA8PCBHRU42X1ZTX0RXNF9VUkJfR1JGX1NUQVJUX19TSElGVCB8CisgICAgICAgICAgdnVlX3JlYWRfbGVuIDw8IEdFTjZfVlNfRFc0X1VSQl9SRUFEX0xFTl9fU0hJRlQgfAorICAgICAgICAgIDAgPDwgR0VONl9WU19EVzRfVVJCX1JFQURfT0ZGU0VUX19TSElGVDsKKworICAgIGR3NSA9IEdFTjZfVlNfRFc1X1NUQVRJU1RJQ1MgfAorICAgICAgICAgIEdFTjZfVlNfRFc1X1ZTX0VOQUJMRTsKKworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcuNSkpCisgICAgICAgIGR3NSB8PSAodnMtPm1heF90aHJlYWRzIC0gMSkgPDwgR0VONzVfVlNfRFc1X01BWF9USFJFQURTX19TSElGVDsKKyAgICBlbHNlCisgICAgICAgIGR3NSB8PSAodnMtPm1heF90aHJlYWRzIC0gMSkgPDwgR0VONl9WU19EVzVfTUFYX1RIUkVBRFNfX1NISUZUOworCisgICAgaWYgKHBpcGVsaW5lLT5kaXNhYmxlX3ZzX2NhY2hlKQorICAgICAgICBkdzUgfD0gR0VONl9WU19EVzVfQ0FDSEVfRElTQUJMRTsKKworICAgIHBvcyA9IGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IGNtZC0+YmluZC5waXBlbGluZS52c19vZmZzZXQ7CisgICAgZHdbMl0gPSBkdzI7CisgICAgZHdbM10gPSAwOyAvKiBzY3JhdGNoICovCisgICAgZHdbNF0gPSBkdzQ7CisgICAgZHdbNV0gPSBkdzU7CisKKyAgICBpZiAodnMtPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplKQorICAgICAgICBnZW42X2FkZF9zY3JhdGNoX3NwYWNlKGNtZCwgcG9zICsgMywgcGlwZWxpbmUsIHZzKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9zaGFkZXJfcmVzb3VyY2VzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICAvKiBmaXZlIEhXIHNoYWRlciBzdGFnZXMgKi8KKyAgICB1aW50MzJfdCBiaW5kaW5nX3RhYmxlc1s1XSwgc2FtcGxlcnNbNV07CisKKyAgICBiaW5kaW5nX3RhYmxlc1swXSA9IGVtaXRfYmluZGluZ190YWJsZShjbWQsCisgICAgICAgICAgICBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3MtPnZzLnJtYXAsCisgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVCk7CisgICAgYmluZGluZ190YWJsZXNbMV0gPSBlbWl0X2JpbmRpbmdfdGFibGUoY21kLAorICAgICAgICAgICAgY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT50Y3Mucm1hcCwKKyAgICAgICAgICAgIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQpOworICAgIGJpbmRpbmdfdGFibGVzWzJdID0gZW1pdF9iaW5kaW5nX3RhYmxlKGNtZCwKKyAgICAgICAgICAgIGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljcy0+dGVzLnJtYXAsCisgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUKTsKKyAgICBiaW5kaW5nX3RhYmxlc1szXSA9IGVtaXRfYmluZGluZ190YWJsZShjbWQsCisgICAgICAgICAgICBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3MtPmdzLnJtYXAsCisgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUKTsKKyAgICBiaW5kaW5nX3RhYmxlc1s0XSA9IGVtaXRfYmluZGluZ190YWJsZShjbWQsCisgICAgICAgICAgICBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3MtPmZzLnJtYXAsCisgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUKTsKKworICAgIHNhbXBsZXJzWzBdID0gZW1pdF9zYW1wbGVycyhjbWQsIGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljcy0+dnMucm1hcCk7CisgICAgc2FtcGxlcnNbMV0gPSBlbWl0X3NhbXBsZXJzKGNtZCwgY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT50Y3Mucm1hcCk7CisgICAgc2FtcGxlcnNbMl0gPSBlbWl0X3NhbXBsZXJzKGNtZCwgY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT50ZXMucm1hcCk7CisgICAgc2FtcGxlcnNbM10gPSBlbWl0X3NhbXBsZXJzKGNtZCwgY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT5ncy5ybWFwKTsKKyAgICBzYW1wbGVyc1s0XSA9IGVtaXRfc2FtcGxlcnMoY21kLCBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3MtPmZzLnJtYXApOworCisgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgZ2VuN18zZHN0YXRlX3BvaW50ZXIoY21kLAorICAgICAgICAgICAgICAgIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNfVlMsCisgICAgICAgICAgICAgICAgYmluZGluZ190YWJsZXNbMF0pOworICAgICAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19IUywKKyAgICAgICAgICAgICAgICBiaW5kaW5nX3RhYmxlc1sxXSk7CisgICAgICAgIGdlbjdfM2RzdGF0ZV9wb2ludGVyKGNtZCwKKyAgICAgICAgICAgICAgICBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0RTLAorICAgICAgICAgICAgICAgIGJpbmRpbmdfdGFibGVzWzJdKTsKKyAgICAgICAgZ2VuN18zZHN0YXRlX3BvaW50ZXIoY21kLAorICAgICAgICAgICAgICAgIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNfR1MsCisgICAgICAgICAgICAgICAgYmluZGluZ190YWJsZXNbM10pOworICAgICAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19QUywKKyAgICAgICAgICAgICAgICBiaW5kaW5nX3RhYmxlc1s0XSk7CisKKyAgICAgICAgZ2VuN18zZHN0YXRlX3BvaW50ZXIoY21kLAorICAgICAgICAgICAgICAgIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NBTVBMRVJfU1RBVEVfUE9JTlRFUlNfVlMsCisgICAgICAgICAgICAgICAgc2FtcGxlcnNbMF0pOworICAgICAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19IUywKKyAgICAgICAgICAgICAgICBzYW1wbGVyc1sxXSk7CisgICAgICAgIGdlbjdfM2RzdGF0ZV9wb2ludGVyKGNtZCwKKyAgICAgICAgICAgICAgICBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX0RTLAorICAgICAgICAgICAgICAgIHNhbXBsZXJzWzJdKTsKKyAgICAgICAgZ2VuN18zZHN0YXRlX3BvaW50ZXIoY21kLAorICAgICAgICAgICAgICAgIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NBTVBMRVJfU1RBVEVfUE9JTlRFUlNfR1MsCisgICAgICAgICAgICAgICAgc2FtcGxlcnNbM10pOworICAgICAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19QUywKKyAgICAgICAgICAgICAgICBzYW1wbGVyc1s0XSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KCFiaW5kaW5nX3RhYmxlc1sxXSAmJiAhYmluZGluZ190YWJsZXNbMl0pOworICAgICAgICBnZW42XzNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUyhjbWQsCisgICAgICAgICAgICAgICAgYmluZGluZ190YWJsZXNbMF0sIGJpbmRpbmdfdGFibGVzWzNdLCBiaW5kaW5nX3RhYmxlc1s0XSk7CisKKyAgICAgICAgYXNzZXJ0KCFzYW1wbGVyc1sxXSAmJiAhc2FtcGxlcnNbMl0pOworICAgICAgICBnZW42XzNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSUyhjbWQsCisgICAgICAgICAgICAgICAgc2FtcGxlcnNbMF0sIHNhbXBsZXJzWzNdLCBzYW1wbGVyc1s0XSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlbWl0X21zYWEoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUgPSBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3M7CisKKyAgICBpZiAoIWNtZC0+YmluZC5yZW5kZXJfcGFzc19jaGFuZ2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBjbWRfd2FfZ2VuNl9wcmVfbXVsdGlzYW1wbGVfZGVwdGhfZmx1c2goY21kKTsKKyAgICBnZW42XzNEU1RBVEVfTVVMVElTQU1QTEUoY21kLCBwaXBlbGluZS0+c2FtcGxlX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9ydChzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2ZiICpmYiA9IGNtZC0+YmluZC5mYjsKKworICAgIGlmICghY21kLT5iaW5kLnJlbmRlcl9wYXNzX2NoYW5nZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGNtZF93YV9nZW42X3ByZV9kZXB0aF9zdGFsbF93cml0ZShjbWQpOworICAgIGdlbjZfM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRShjbWQsIGZiLT53aWR0aCwKKyAgICAgICAgICAgIGZiLT5oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2RzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3MgKnJwID0gY21kLT5iaW5kLnJlbmRlcl9wYXNzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzc19zdWJwYXNzICpzdWJwYXNzID0KKyAgICAgICAgY21kLT5iaW5kLnJlbmRlcl9wYXNzX3N1YnBhc3M7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2ZiICpmYiA9IGNtZC0+YmluZC5mYjsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYXR0X3ZpZXcgKnZpZXcgPQorICAgICAgICAoc3VicGFzcy0+ZHNfaW5kZXggPCBycC0+YXR0YWNobWVudF9jb3VudCkgPworICAgICAgICBmYi0+dmlld3Nbc3VicGFzcy0+ZHNfaW5kZXhdIDogTlVMTDsKKworICAgIGlmICghY21kLT5iaW5kLnJlbmRlcl9wYXNzX2NoYW5nZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghdmlldykgeworICAgICAgICAvKiBhbGwgemVyb3MgKi8KKyAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9hdHRfdmlldyBudWxsX3ZpZXc7CisgICAgICAgIHZpZXcgPSAmbnVsbF92aWV3OworICAgIH0KKworICAgIGNtZF93YV9nZW42X3ByZV9kc19mbHVzaChjbWQpOworICAgIGdlbjZfM0RTVEFURV9ERVBUSF9CVUZGRVIoY21kLCB2aWV3LCBzdWJwYXNzLT5kc19vcHRpbWFsKTsKKyAgICBnZW42XzNEU1RBVEVfU1RFTkNJTF9CVUZGRVIoY21kLCB2aWV3LCBzdWJwYXNzLT5kc19vcHRpbWFsKTsKKyAgICBnZW42XzNEU1RBVEVfSElFUl9ERVBUSF9CVUZGRVIoY21kLCB2aWV3LCBzdWJwYXNzLT5kc19vcHRpbWFsKTsKKworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcpKQorICAgICAgICBnZW43XzNEU1RBVEVfQ0xFQVJfUEFSQU1TKGNtZCwgMCk7CisgICAgZWxzZQorICAgICAgICBnZW42XzNEU1RBVEVfQ0xFQVJfUEFSQU1TKGNtZCwgMCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBlbWl0X3NoYWRlcihzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqc2hhZGVyKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWRfc2hhZGVyX2NhY2hlICpjYWNoZSA9ICZjbWQtPmJpbmQuc2hhZGVyX2NhY2hlOworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICB1aW50MzJfdCBpOworCisgICAgLyogc2VlIGlmIHRoZSBzaGFkZXIgaXMgYWxyZWFkeSBpbiB0aGUgY2FjaGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2FjaGUtPnVzZWQ7IGkrKykgeworICAgICAgICBpZiAoY2FjaGUtPmVudHJpZXNbaV0uc2hhZGVyID09IChjb25zdCB2b2lkICopIHNoYWRlcikKKyAgICAgICAgICAgIHJldHVybiBjYWNoZS0+ZW50cmllc1tpXS5rZXJuZWxfb2Zmc2V0OworICAgIH0KKworICAgIG9mZnNldCA9IGNtZF9pbnN0cnVjdGlvbl93cml0ZShjbWQsIHNoYWRlci0+Y29kZVNpemUsIHNoYWRlci0+cENvZGUpOworCisgICAgLyogZ3JvdyB0aGUgY2FjaGUgaWYgZnVsbCAqLworICAgIGlmIChjYWNoZS0+dXNlZCA+PSBjYWNoZS0+Y291bnQpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgY291bnQgPSBjYWNoZS0+Y291bnQgKyAxNjsKKyAgICAgICAgdm9pZCAqZW50cmllczsKKworICAgICAgICBlbnRyaWVzID0gaW50ZWxfYWxsb2MoY21kLCBzaXplb2YoY2FjaGUtPmVudHJpZXNbMF0pICogY291bnQsIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgICAgIGlmIChlbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoY2FjaGUtPmVudHJpZXMpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZW50cmllcywgY2FjaGUtPmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FjaGUtPmVudHJpZXNbMF0pICogY2FjaGUtPnVzZWQpOworICAgICAgICAgICAgICAgIGludGVsX2ZyZWUoY21kLCBjYWNoZS0+ZW50cmllcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhY2hlLT5lbnRyaWVzID0gZW50cmllczsKKyAgICAgICAgICAgIGNhY2hlLT5jb3VudCA9IGNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgLyogYWRkIHRoZSBzaGFkZXIgdG8gdGhlIGNhY2hlICovCisgICAgaWYgKGNhY2hlLT51c2VkIDwgY2FjaGUtPmNvdW50KSB7CisgICAgICAgIGNhY2hlLT5lbnRyaWVzW2NhY2hlLT51c2VkXS5zaGFkZXIgPSAoY29uc3Qgdm9pZCAqKSBzaGFkZXI7CisgICAgICAgIGNhY2hlLT5lbnRyaWVzW2NhY2hlLT51c2VkXS5rZXJuZWxfb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBjYWNoZS0+dXNlZCsrOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfZ3JhcGhpY3NfcGlwZWxpbmUoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUgPSBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3M7CisKKyAgICBpZiAocGlwZWxpbmUtPndhX2ZsYWdzICYgSU5URUxfQ01EX1dBX0dFTjZfUFJFX0RFUFRIX1NUQUxMX1dSSVRFKQorICAgICAgICBjbWRfd2FfZ2VuNl9wcmVfZGVwdGhfc3RhbGxfd3JpdGUoY21kKTsKKyAgICBpZiAocGlwZWxpbmUtPndhX2ZsYWdzICYgSU5URUxfQ01EX1dBX0dFTjZfUFJFX0NPTU1BTkRfU0NPUkVCT0FSRF9TVEFMTCkKKyAgICAgICAgY21kX3dhX2dlbjZfcHJlX2NvbW1hbmRfc2NvcmVib2FyZF9zdGFsbChjbWQpOworICAgIGlmIChwaXBlbGluZS0+d2FfZmxhZ3MgJiBJTlRFTF9DTURfV0FfR0VON19QUkVfVlNfREVQVEhfU1RBTExfV1JJVEUpCisgICAgICAgIGNtZF93YV9nZW43X3ByZV92c19kZXB0aF9zdGFsbF93cml0ZShjbWQpOworCisgICAgLyogM0RTVEFURV9VUkJfVlMgYW5kIGV0Yy4gKi8KKyAgICBhc3NlcnQocGlwZWxpbmUtPmNtZF9sZW4pOworICAgIGNtZF9iYXRjaF93cml0ZShjbWQsIHBpcGVsaW5lLT5jbWRfbGVuLCBwaXBlbGluZS0+Y21kcyk7CisKKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX1ZFUlRFWF9GTEFHKSB7CisgICAgICAgIGNtZC0+YmluZC5waXBlbGluZS52c19vZmZzZXQgPSBlbWl0X3NoYWRlcihjbWQsICZwaXBlbGluZS0+dnMpOworICAgIH0KKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX1RFU1NfQ09OVFJPTF9GTEFHKSB7CisgICAgICAgIGNtZC0+YmluZC5waXBlbGluZS50Y3Nfb2Zmc2V0ID0gZW1pdF9zaGFkZXIoY21kLCAmcGlwZWxpbmUtPnRjcyk7CisgICAgfQorICAgIGlmIChwaXBlbGluZS0+YWN0aXZlX3NoYWRlcnMgJiBTSEFERVJfVEVTU19FVkFMX0ZMQUcpIHsKKyAgICAgICAgY21kLT5iaW5kLnBpcGVsaW5lLnRlc19vZmZzZXQgPSBlbWl0X3NoYWRlcihjbWQsICZwaXBlbGluZS0+dGVzKTsKKyAgICB9CisgICAgaWYgKHBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmIFNIQURFUl9HRU9NRVRSWV9GTEFHKSB7CisgICAgICAgIGNtZC0+YmluZC5waXBlbGluZS5nc19vZmZzZXQgPSBlbWl0X3NoYWRlcihjbWQsICZwaXBlbGluZS0+Z3MpOworICAgIH0KKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX0ZSQUdNRU5UX0ZMQUcpIHsKKyAgICAgICAgY21kLT5iaW5kLnBpcGVsaW5lLmZzX29mZnNldCA9IGVtaXRfc2hhZGVyKGNtZCwgJnBpcGVsaW5lLT5mcyk7CisgICAgfQorCisgICAgaWYgKHBpcGVsaW5lLT53YV9mbGFncyAmIElOVEVMX0NNRF9XQV9HRU43X1BPU1RfQ09NTUFORF9DU19TVEFMTCkKKyAgICAgICAgY21kX3dhX2dlbjdfcG9zdF9jb21tYW5kX2NzX3N0YWxsKGNtZCk7CisgICAgaWYgKHBpcGVsaW5lLT53YV9mbGFncyAmIElOVEVMX0NNRF9XQV9HRU43X1BPU1RfQ09NTUFORF9ERVBUSF9TVEFMTCkKKyAgICAgICAgY21kX3dhX2dlbjdfcG9zdF9jb21tYW5kX2RlcHRoX3N0YWxsKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkCit2aWV3cG9ydF9nZXRfZ3VhcmRiYW5kKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNlbnRlcl94LCBpbnQgY2VudGVyX3ksCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWluX2dieCwgaW50ICptYXhfZ2J4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1pbl9nYnksIGludCAqbWF4X2dieSkKK3sKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMjM0OgorICAgICoKKyAgICAqICAgICAiUGVyLURldmljZSBHdWFyZGJhbmQgRXh0ZW50cworICAgICoKKyAgICAqICAgICAgIC0gU3VwcG9ydGVkIFgsWSBTY3JlZW5TcGFjZSAiR3VhcmRiYW5kIiBFeHRlbnQ6IFstMTZLLDE2Sy0xXQorICAgICogICAgICAgLSBNYXhpbXVtIFBvc3QtQ2xhbXAgRGVsdGEgKFggb3IgWSk6IDE2SyIKKyAgICAqCisgICAgKiAgICAgIkluIGFkZGl0aW9uLCBpbiBvcmRlciB0byBiZSBjb3JyZWN0bHkgcmVuZGVyZWQsIG9iamVjdHMgbXVzdCBoYXZlIGEKKyAgICAqICAgICAgc2NyZWVuc3BhY2UgYm91bmRpbmcgYm94IG5vdCBleGNlZWRpbmcgOEsgaW4gdGhlIFggb3IgWSBkaXJlY3Rpb24uCisgICAgKiAgICAgIFRoaXMgYWRkaXRpb25hbCByZXN0cmljdGlvbiBtdXN0IGFsc28gYmUgY29tcHJlaGVuZGVkIGJ5IHNvZnR3YXJlLAorICAgICogICAgICBpLmUuLCBlbmZvcmNlZCBieSB1c2Ugb2YgY2xpcHBpbmcuIgorICAgICoKKyAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMjQ4OgorICAgICoKKyAgICAqICAgICAiUGVyLURldmljZSBHdWFyZGJhbmQgRXh0ZW50cworICAgICoKKyAgICAqICAgICAgIC0gU3VwcG9ydGVkIFgsWSBTY3JlZW5TcGFjZSAiR3VhcmRiYW5kIiBFeHRlbnQ6IFstMzJLLDMySy0xXQorICAgICogICAgICAgLSBNYXhpbXVtIFBvc3QtQ2xhbXAgRGVsdGEgKFggb3IgWSk6IE4vQSIKKyAgICAqCisgICAgKiAgICAgIkluIGFkZGl0aW9uLCBpbiBvcmRlciB0byBiZSBjb3JyZWN0bHkgcmVuZGVyZWQsIG9iamVjdHMgbXVzdCBoYXZlIGEKKyAgICAqICAgICAgc2NyZWVuc3BhY2UgYm91bmRpbmcgYm94IG5vdCBleGNlZWRpbmcgOEsgaW4gdGhlIFggb3IgWSBkaXJlY3Rpb24uCisgICAgKiAgICAgIFRoaXMgYWRkaXRpb25hbCByZXN0cmljdGlvbiBtdXN0IGFsc28gYmUgY29tcHJlaGVuZGVkIGJ5IHNvZnR3YXJlLAorICAgICogICAgICBpLmUuLCBlbmZvcmNlZCBieSB1c2Ugb2YgY2xpcHBpbmcuIgorICAgICoKKyAgICAqIENvbWJpbmVkLCB0aGUgYm91bmRpbmcgYm94IG9mIGFueSBvYmplY3QgY2FuIG5vdCBleGNlZWQgOEsgaW4gYm90aAorICAgICogd2lkdGggYW5kIGhlaWdodC4KKyAgICAqCisgICAgKiBCZWxvdyB3ZSBzZXQgdGhlIGd1YXJkYmFuZCBhcyBhIHNxdXJlIG9mIGxlbmd0aCA4SywgY2VudGVyZWQgYXQgd2hlcmUKKyAgICAqIHRoZSB2aWV3cG9ydCBpcy4gIFRoaXMgbWFrZXMgc3VyZSBhbGwgb2JqZWN0cyBwYXNzaW5nIHRoZSBHQiB0ZXN0IGFyZQorICAgICogdmFsaWQgdG8gdGhlIHJlbmRlcmVyLCBhbmQgdGhvc2UgZmFpbGluZyB0aGUgWFkgY2xpcHBpbmcgaGF2ZSBhCisgICAgKiBiZXR0ZXIgY2hhbmNlIG9mIHBhc3NpbmcgdGhlIEdCIHRlc3QuCisgICAgKi8KKyAgIGNvbnN0IGludCBtYXhfZXh0ZW50ID0gKGludGVsX2dwdV9nZW4oZ3B1KSA+PSBJTlRFTF9HRU4oNykpID8gMzI3NjggOiAxNjM4NDsKKyAgIGNvbnN0IGludCBoYWxmX2xlbiA9IDgxOTIgLyAyOworCisgICAvKiBtYWtlIHN1cmUgdGhlIGd1YXJkYmFuZCBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlICovCisgICBpZiAoY2VudGVyX3ggLSBoYWxmX2xlbiA8IC1tYXhfZXh0ZW50KQorICAgICAgY2VudGVyX3ggPSAtbWF4X2V4dGVudCArIGhhbGZfbGVuOworICAgZWxzZSBpZiAoY2VudGVyX3ggKyBoYWxmX2xlbiA+IG1heF9leHRlbnQgLSAxKQorICAgICAgY2VudGVyX3ggPSBtYXhfZXh0ZW50IC0gaGFsZl9sZW47CisKKyAgIGlmIChjZW50ZXJfeSAtIGhhbGZfbGVuIDwgLW1heF9leHRlbnQpCisgICAgICBjZW50ZXJfeSA9IC1tYXhfZXh0ZW50ICsgaGFsZl9sZW47CisgICBlbHNlIGlmIChjZW50ZXJfeSArIGhhbGZfbGVuID4gbWF4X2V4dGVudCAtIDEpCisgICAgICBjZW50ZXJfeSA9IG1heF9leHRlbnQgLSBoYWxmX2xlbjsKKworICAgKm1pbl9nYnggPSAoZmxvYXQpIChjZW50ZXJfeCAtIGhhbGZfbGVuKTsKKyAgICptYXhfZ2J4ID0gKGZsb2F0KSAoY2VudGVyX3ggKyBoYWxmX2xlbik7CisgICAqbWluX2dieSA9IChmbG9hdCkgKGNlbnRlcl95IC0gaGFsZl9sZW4pOworICAgKm1heF9nYnkgPSAoZmxvYXQpIChjZW50ZXJfeSArIGhhbGZfbGVuKTsKK30KKworc3RhdGljIHZvaWQKK3ZpZXdwb3J0X3N0YXRlX2NtZChzdHJ1Y3QgaW50ZWxfZHluYW1pY192aWV3cG9ydCAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50KQoreworICAgIElOVEVMX0dQVV9BU1NFUlQoZ3B1LCA2LCA3LjUpOworCisgICAgc3RhdGUtPnZpZXdwb3J0X2NvdW50ID0gY291bnQ7CisKKyAgICBhc3NlcnQoY291bnQgPD0gSU5URUxfTUFYX1ZJRVdQT1JUUyk7CisKKyAgICBpZiAoaW50ZWxfZ3B1X2dlbihncHUpID49IElOVEVMX0dFTig3KSkgeworICAgICAgICBzdGF0ZS0+Y21kX2xlbiA9IDE2ICogY291bnQ7CisKKyAgICAgICAgc3RhdGUtPmNtZF9jbGlwX3BvcyA9IDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGUtPmNtZF9sZW4gPSA4ICogY291bnQ7CisKKyAgICAgICAgc3RhdGUtPmNtZF9jbGlwX3BvcyA9IHN0YXRlLT5jbWRfbGVuOworICAgICAgICBzdGF0ZS0+Y21kX2xlbiArPSA0ICogY291bnQ7CisgICAgfQorCisgICAgc3RhdGUtPmNtZF9jY19wb3MgPSBzdGF0ZS0+Y21kX2xlbjsKKyAgICBzdGF0ZS0+Y21kX2xlbiArPSAyICogY291bnQ7CisKKyAgICBzdGF0ZS0+Y21kX3NjaXNzb3JfcmVjdF9wb3MgPSBzdGF0ZS0+Y21kX2xlbjsKKyAgICBzdGF0ZS0+Y21kX2xlbiArPSAyICogY291bnQ7CisKKyAgICBhc3NlcnQoc2l6ZW9mKHVpbnQzMl90KSAqIHN0YXRlLT5jbWRfbGVuIDw9IHNpemVvZihzdGF0ZS0+Y21kKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdmlld3BvcnRfc3RhdGUoCisgICAgICAgIHN0cnVjdCBpbnRlbF9jbWQqICAgICAgICAgICAgICAgY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSA9IGNtZC0+ZGV2LT5ncHU7CisgICAgc3RydWN0IGludGVsX2R5bmFtaWNfdmlld3BvcnQgKnN0YXRlID0gJmNtZC0+YmluZC5zdGF0ZS52aWV3cG9ydDsKKyAgICBjb25zdCB1aW50MzJfdCBzZl9zdHJpZGUgPSAoaW50ZWxfZ3B1X2dlbihncHUpID49IElOVEVMX0dFTig3KSkgPyAxNiA6IDg7CisgICAgY29uc3QgdWludDMyX3QgY2xpcF9zdHJpZGUgPSAoaW50ZWxfZ3B1X2dlbihncHUpID49IElOVEVMX0dFTig3KSkgPyAxNiA6IDQ7CisgICAgdWludDMyX3QgKnNmX3ZpZXdwb3J0LCAqY2xpcF92aWV3cG9ydCwgKmNjX3ZpZXdwb3J0LCAqc2Npc3Nvcl9yZWN0OworICAgIHVpbnQzMl90IGk7CisKKyAgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNiwgNy41KTsKKworICAgIHZpZXdwb3J0X3N0YXRlX2NtZChzdGF0ZSwgZ3B1LCBjbWQtPmJpbmQuc3RhdGUudmlld3BvcnQudmlld3BvcnRfY291bnQpOworCisgICAgc2Zfdmlld3BvcnQgPSBzdGF0ZS0+Y21kOworICAgIGNsaXBfdmlld3BvcnQgPSBzdGF0ZS0+Y21kICsgc3RhdGUtPmNtZF9jbGlwX3BvczsKKyAgICBjY192aWV3cG9ydCA9IHN0YXRlLT5jbWQgKyBzdGF0ZS0+Y21kX2NjX3BvczsKKyAgICBzY2lzc29yX3JlY3QgPSBzdGF0ZS0+Y21kICsgc3RhdGUtPmNtZF9zY2lzc29yX3JlY3RfcG9zOworCisgICAgZm9yIChpID0gMDsgaSA8IGNtZC0+YmluZC5zdGF0ZS52aWV3cG9ydC52aWV3cG9ydF9jb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrVmlld3BvcnQgKnZpZXdwb3J0ID0gJmNtZC0+YmluZC5zdGF0ZS52aWV3cG9ydC52aWV3cG9ydHNbaV07CisgICAgICAgIHVpbnQzMl90ICpkdyA9IE5VTEw7CisgICAgICAgIGZsb2F0IHRyYW5zbGF0ZVszXSwgc2NhbGVbM107CisgICAgICAgIGludCBtaW5fZ2J4LCBtYXhfZ2J4LCBtaW5fZ2J5LCBtYXhfZ2J5OworCisgICAgICAgIHNjYWxlWzBdID0gdmlld3BvcnQtPndpZHRoIC8gMi4wZjsKKyAgICAgICAgc2NhbGVbMV0gPSB2aWV3cG9ydC0+aGVpZ2h0IC8gMi4wZjsKKyAgICAgICAgc2NhbGVbMl0gPSB2aWV3cG9ydC0+bWF4RGVwdGggLSB2aWV3cG9ydC0+bWluRGVwdGg7CisgICAgICAgIHRyYW5zbGF0ZVswXSA9IHZpZXdwb3J0LT54ICsgc2NhbGVbMF07CisgICAgICAgIHRyYW5zbGF0ZVsxXSA9IHZpZXdwb3J0LT55ICsgc2NhbGVbMV07CisgICAgICAgIHRyYW5zbGF0ZVsyXSA9IHZpZXdwb3J0LT5taW5EZXB0aDsKKworICAgICAgICB2aWV3cG9ydF9nZXRfZ3VhcmRiYW5kKGdwdSwgKGludCkgdHJhbnNsYXRlWzBdLCAoaW50KSB0cmFuc2xhdGVbMV0sCisgICAgICAgICAgICAgICAgJm1pbl9nYngsICZtYXhfZ2J4LCAmbWluX2dieSwgJm1heF9nYnkpOworCisgICAgICAgIC8qIFNGX1ZJRVdQT1JUICovCisgICAgICAgIGR3ID0gc2Zfdmlld3BvcnQ7CisgICAgICAgIGR3WzBdID0gdV9mdWkoc2NhbGVbMF0pOworICAgICAgICBkd1sxXSA9IHVfZnVpKHNjYWxlWzFdKTsKKyAgICAgICAgZHdbMl0gPSB1X2Z1aShzY2FsZVsyXSk7CisgICAgICAgIGR3WzNdID0gdV9mdWkodHJhbnNsYXRlWzBdKTsKKyAgICAgICAgZHdbNF0gPSB1X2Z1aSh0cmFuc2xhdGVbMV0pOworICAgICAgICBkd1s1XSA9IHVfZnVpKHRyYW5zbGF0ZVsyXSk7CisgICAgICAgIGR3WzZdID0gMDsKKyAgICAgICAgZHdbN10gPSAwOworICAgICAgICBzZl92aWV3cG9ydCArPSBzZl9zdHJpZGU7CisKKyAgICAgICAgLyogQ0xJUF9WSUVXUE9SVCAqLworICAgICAgICBkdyA9IGNsaXBfdmlld3BvcnQ7CisgICAgICAgIGR3WzBdID0gdV9mdWkoKChmbG9hdCkgbWluX2dieCAtIHRyYW5zbGF0ZVswXSkgLyBmYWJzZihzY2FsZVswXSkpOworICAgICAgICBkd1sxXSA9IHVfZnVpKCgoZmxvYXQpIG1heF9nYnggLSB0cmFuc2xhdGVbMF0pIC8gZmFic2Yoc2NhbGVbMF0pKTsKKyAgICAgICAgZHdbMl0gPSB1X2Z1aSgoKGZsb2F0KSBtaW5fZ2J5IC0gdHJhbnNsYXRlWzFdKSAvIGZhYnNmKHNjYWxlWzFdKSk7CisgICAgICAgIGR3WzNdID0gdV9mdWkoKChmbG9hdCkgbWF4X2dieSAtIHRyYW5zbGF0ZVsxXSkgLyBmYWJzZihzY2FsZVsxXSkpOworICAgICAgICBjbGlwX3ZpZXdwb3J0ICs9IGNsaXBfc3RyaWRlOworCisgICAgICAgIC8qIENDX1ZJRVdQT1JUICovCisgICAgICAgIGR3ID0gY2Nfdmlld3BvcnQ7CisgICAgICAgIGR3WzBdID0gdV9mdWkodmlld3BvcnQtPm1pbkRlcHRoKTsKKyAgICAgICAgZHdbMV0gPSB1X2Z1aSh2aWV3cG9ydC0+bWF4RGVwdGgpOworICAgICAgICBjY192aWV3cG9ydCArPSAyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjbWQtPmJpbmQuc3RhdGUudmlld3BvcnQudmlld3BvcnRfY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa1JlY3QyRCAqc2Npc3NvciA9ICZjbWQtPmJpbmQuc3RhdGUudmlld3BvcnQuc2Npc3NvcnNbaV07CisgICAgICAgIC8qIFNDSVNTT1JfUkVDVCAqLworICAgICAgICBpbnQxNl90IG1heF94LCBtYXhfeTsKKyAgICAgICAgdWludDMyX3QgKmR3ID0gTlVMTDsKKworICAgICAgICBtYXhfeCA9IChzY2lzc29yLT5vZmZzZXQueCArIHNjaXNzb3ItPmV4dGVudC53aWR0aCAtIDEpICYgMHhmZmZmOworICAgICAgICBtYXhfeSA9IChzY2lzc29yLT5vZmZzZXQueSArIHNjaXNzb3ItPmV4dGVudC5oZWlnaHQgLSAxKSAmIDB4ZmZmZjsKKworICAgICAgICBkdyA9IHNjaXNzb3JfcmVjdDsKKyAgICAgICAgaWYgKHNjaXNzb3ItPmV4dGVudC53aWR0aCAmJiBzY2lzc29yLT5leHRlbnQuaGVpZ2h0KSB7CisgICAgICAgICAgICBkd1swXSA9IChzY2lzc29yLT5vZmZzZXQueSAmIDB4ZmZmZikgPDwgMTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2lzc29yLT5vZmZzZXQueCAmIDB4ZmZmZik7CisgICAgICAgICAgICBkd1sxXSA9IG1heF95IDw8IDE2IHwgbWF4X3g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkd1swXSA9IDEgPDwgMTYgfCAxOworICAgICAgICAgICAgZHdbMV0gPSAwOworICAgICAgICB9CisgICAgICAgIHNjaXNzb3JfcmVjdCArPSAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9ib3VuZGVkX3N0YXRlcyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgc2V0X3ZpZXdwb3J0X3N0YXRlKGNtZCk7CisKKyAgICBlbWl0X21zYWEoY21kKTsKKworICAgIGVtaXRfZ3JhcGhpY3NfcGlwZWxpbmUoY21kKTsKKworICAgIGVtaXRfcnQoY21kKTsKKyAgICBlbWl0X2RzKGNtZCk7CisKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgeworICAgICAgICBnZW43X2NjX3N0YXRlcyhjbWQpOworICAgICAgICBnZW43X3ZpZXdwb3J0X3N0YXRlcyhjbWQpOworCisgICAgICAgIGdlbjdfcGNiKGNtZCwgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQ09OU1RBTlRfVlMsCisgICAgICAgICAgICAgICAgJmNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljcy0+dnMpOworICAgICAgICBnZW43X3BjYihjbWQsIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NPTlNUQU5UX0dTLAorICAgICAgICAgICAgICAgICZjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3MtPmdzKTsKKyAgICAgICAgZ2VuN19wY2IoY21kLCBHRU42X1JFTkRFUl9PUENPREVfM0RTVEFURV9DT05TVEFOVF9QUywKKyAgICAgICAgICAgICAgICAmY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT5mcyk7CisKKyAgICAgICAgZ2VuN18zRFNUQVRFX0dTKGNtZCk7CisgICAgICAgIGdlbjZfM0RTVEFURV9DTElQKGNtZCk7CisgICAgICAgIGdlbjdfM0RTVEFURV9TRihjbWQpOworICAgICAgICBnZW43XzNEU1RBVEVfV00oY21kKTsKKyAgICAgICAgZ2VuN18zRFNUQVRFX1BTKGNtZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuNl9jY19zdGF0ZXMoY21kKTsKKyAgICAgICAgZ2VuNl92aWV3cG9ydF9zdGF0ZXMoY21kKTsKKworICAgICAgICBnZW42X3BjYihjbWQsIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NPTlNUQU5UX1ZTLAorICAgICAgICAgICAgICAgICZjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3MtPnZzKTsKKyAgICAgICAgZ2VuNl9wY2IoY21kLCBHRU42X1JFTkRFUl9PUENPREVfM0RTVEFURV9DT05TVEFOVF9HUywKKyAgICAgICAgICAgICAgICAmY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzLT5ncyk7CisgICAgICAgIGdlbjZfcGNiKGNtZCwgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQ09OU1RBTlRfUFMsCisgICAgICAgICAgICAgICAgJmNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljcy0+ZnMpOworCisgICAgICAgIGdlbjZfM0RTVEFURV9HUyhjbWQpOworICAgICAgICBnZW42XzNEU1RBVEVfQ0xJUChjbWQpOworICAgICAgICBnZW42XzNEU1RBVEVfU0YoY21kKTsKKyAgICAgICAgZ2VuNl8zRFNUQVRFX1dNKGNtZCk7CisgICAgfQorCisgICAgZW1pdF9zaGFkZXJfcmVzb3VyY2VzKGNtZCk7CisKKyAgICBjbWRfd2FfZ2VuNl9wcmVfZGVwdGhfc3RhbGxfd3JpdGUoY21kKTsKKworICAgIGdlbjZfM0RTVEFURV9WRVJURVhfQlVGRkVSUyhjbWQpOworICAgIGdlbjZfM0RTVEFURV9WUyhjbWQpOworfQorCitzdGF0aWMgdWludDMyX3QgZ2VuNl9tZXRhX0RFUFRIX1NURU5DSUxfU1RBVEUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSkKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9hbGlnbiA9IEdFTjZfQUxJR05NRU5UX0RFUFRIX1NURU5DSUxfU1RBVEU7CisgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMzsKKyAgICB1aW50MzJfdCBkd1szXTsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgLyogVE9ETzogYXNwZWN0IGlzIG5vdyBhIG1hc2ssIGNhbiB5b3UgZG8gYm90aD8gKi8KKyAgICBpZiAobWV0YS0+ZHMuYXNwZWN0ID09IFZLX0lNQUdFX0FTUEVDVF9ERVBUSF9CSVQpIHsKKyAgICAgICAgZHdbMF0gPSAwOworICAgICAgICBkd1sxXSA9IDA7CisKKyAgICAgICAgaWYgKG1ldGEtPmRzLm9wID09IElOVEVMX0NNRF9NRVRBX0RTX1JFU09MVkUpIHsKKyAgICAgICAgICAgIGR3WzJdID0gR0VONl9aU19EVzJfREVQVEhfVEVTVF9FTkFCTEUgfAorICAgICAgICAgICAgICAgICAgICBHRU42X0NPTVBBUkVGVU5DVElPTl9ORVZFUiA8PCAyNyB8CisgICAgICAgICAgICAgICAgICAgIEdFTjZfWlNfRFcyX0RFUFRIX1dSSVRFX0VOQUJMRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR3WzJdID0gR0VONl9DT01QQVJFRlVOQ1RJT05fQUxXQVlTIDw8IDI3IHwKKyAgICAgICAgICAgICAgICAgICAgR0VONl9aU19EVzJfREVQVEhfV1JJVEVfRU5BQkxFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtZXRhLT5kcy5hc3BlY3QgPT0gVktfSU1BR0VfQVNQRUNUX1NURU5DSUxfQklUKSB7CisgICAgICAgIGR3WzBdID0gR0VONl9aU19EVzBfU1RFTkNJTF9URVNUX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgKEdFTjZfQ09NUEFSRUZVTkNUSU9OX0FMV0FZUykgPDwgMjggfAorICAgICAgICAgICAgICAgIChHRU42X1NURU5DSUxPUF9LRUVQKSA8PCAyNSB8CisgICAgICAgICAgICAgICAgKEdFTjZfU1RFTkNJTE9QX0tFRVApIDw8IDIyIHwKKyAgICAgICAgICAgICAgICAoR0VONl9TVEVOQ0lMT1BfUkVQTEFDRSkgPDwgMTkgfAorICAgICAgICAgICAgICAgIEdFTjZfWlNfRFcwX1NURU5DSUxfV1JJVEVfRU5BQkxFIHwKKyAgICAgICAgICAgICAgICBHRU42X1pTX0RXMF9TVEVOQ0lMMV9FTkFCTEUgfAorICAgICAgICAgICAgICAgIChHRU42X0NPTVBBUkVGVU5DVElPTl9BTFdBWVMpIDw8IDEyIHwKKyAgICAgICAgICAgICAgICAoR0VONl9TVEVOQ0lMT1BfS0VFUCkgPDwgOSB8CisgICAgICAgICAgICAgICAgKEdFTjZfU1RFTkNJTE9QX0tFRVApIDw8IDYgfAorICAgICAgICAgICAgICAgIChHRU42X1NURU5DSUxPUF9SRVBMQUNFKSA8PCAzOworCisgICAgICAgIGR3WzFdID0gMHhmZiA8PCBHRU42X1pTX0RXMV9TVEVOQ0lMMF9WQUxVRU1BU0tfX1NISUZUIHwKKyAgICAgICAgICAgICAgICAweGZmIDw8IEdFTjZfWlNfRFcxX1NURU5DSUwwX1dSSVRFTUFTS19fU0hJRlQgfAorICAgICAgICAgICAgICAgIDB4ZmYgPDwgR0VONl9aU19EVzFfU1RFTkNJTDFfVkFMVUVNQVNLX19TSElGVCB8CisgICAgICAgICAgICAgICAgMHhmZiA8PCBHRU42X1pTX0RXMV9TVEVOQ0lMMV9XUklURU1BU0tfX1NISUZUOworICAgICAgICBkd1syXSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX0RFUFRIX1NURU5DSUwsCisgICAgICAgICAgICBjbWRfYWxpZ24sIGNtZF9sZW4sIGR3KTsKK30KKworc3RhdGljIHZvaWQgZ2VuNl9tZXRhX2R5bmFtaWNfc3RhdGVzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgKm1ldGEgPSBjbWQtPmJpbmQubWV0YTsKKyAgICB1aW50MzJfdCBibGVuZF9vZmZzZXQsIGRzX29mZnNldCwgY2Nfb2Zmc2V0LCBjY192cF9vZmZzZXQsICpkdzsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgYmxlbmRfb2Zmc2V0ID0gMDsKKyAgICBkc19vZmZzZXQgPSAwOworICAgIGNjX29mZnNldCA9IDA7CisgICAgY2NfdnBfb2Zmc2V0ID0gMDsKKworICAgIGlmIChtZXRhLT5tb2RlID09IElOVEVMX0NNRF9NRVRBX0ZTX1JFQ1QpIHsKKyAgICAgICAgLyogQkxFTkRfU1RBVEUgKi8KKyAgICAgICAgYmxlbmRfb2Zmc2V0ID0gY21kX3N0YXRlX3BvaW50ZXIoY21kLCBJTlRFTF9DTURfSVRFTV9CTEVORCwKKyAgICAgICAgICAgICAgICBHRU42X0FMSUdOTUVOVF9CTEVORF9TVEFURSwgMiwgJmR3KTsKKyAgICAgICAgZHdbMF0gPSAwOworICAgICAgICBkd1sxXSA9IEdFTjZfUlRfRFcxX0NPTE9SQ0xBTVBfUlRGT1JNQVQgfCAweDM7CisgICAgfQorCisgICAgaWYgKG1ldGEtPm1vZGUgIT0gSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTKSB7CisgICAgICAgIGlmIChtZXRhLT5kcy5hc3BlY3QgPT0gVktfSU1BR0VfQVNQRUNUX0RFUFRIX0JJVCB8fAorICAgICAgICAgICAgbWV0YS0+ZHMuYXNwZWN0ID09IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVCkgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYmxlbmRfY29sb3JbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0ZW5jaWxfcmVmID0gKG1ldGEtPmRzLnN0ZW5jaWxfcmVmICYgMHhmZikgPDwgMjQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWV0YS0+ZHMuc3RlbmNpbF9yZWYgJiAweGZmKSA8PCAxNjsKKworICAgICAgICAgICAgLyogREVQVEhfU1RFTkNJTF9TVEFURSAqLworICAgICAgICAgICAgZHNfb2Zmc2V0ID0gZ2VuNl9tZXRhX0RFUFRIX1NURU5DSUxfU1RBVEUoY21kLCBtZXRhKTsKKworICAgICAgICAgICAgLyogQ09MT1JfQ0FMQ19TVEFURSAqLworICAgICAgICAgICAgY2Nfb2Zmc2V0ID0gZ2VuNl9DT0xPUl9DQUxDX1NUQVRFKGNtZCwKKyAgICAgICAgICAgICAgICAgICAgc3RlbmNpbF9yZWYsIGJsZW5kX2NvbG9yKTsKKworICAgICAgICAgICAgLyogQ0NfVklFV1BPUlQgKi8KKyAgICAgICAgICAgIGNjX3ZwX29mZnNldCA9IGNtZF9zdGF0ZV9wb2ludGVyKGNtZCwgSU5URUxfQ01EX0lURU1fQ0NfVklFV1BPUlQsCisgICAgICAgICAgICAgICAgICAgIEdFTjZfQUxJR05NRU5UX0NDX1ZJRVdQT1JULCAyLCAmZHcpOworICAgICAgICAgICAgZHdbMF0gPSB1X2Z1aSgwLjBmKTsKKyAgICAgICAgICAgIGR3WzFdID0gdV9mdWkoMS4wZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBERVBUSF9TVEVOQ0lMX1NUQVRFICovCisgICAgICAgICAgICBkc19vZmZzZXQgPSBjbWRfc3RhdGVfcG9pbnRlcihjbWQsIElOVEVMX0NNRF9JVEVNX0RFUFRIX1NURU5DSUwsCisgICAgICAgICAgICAgICAgICAgIEdFTjZfQUxJR05NRU5UX0RFUFRIX1NURU5DSUxfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIEdFTjZfREVQVEhfU1RFTkNJTF9TVEFURV9fU0laRSwgJmR3KTsKKyAgICAgICAgICAgIG1lbXNldChkdywgMCwgc2l6ZW9mKCpkdykgKiBHRU42X0RFUFRIX1NURU5DSUxfU1RBVEVfX1NJWkUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgZ2VuN18zZHN0YXRlX3BvaW50ZXIoY21kLAorICAgICAgICAgICAgICAgIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX0JMRU5EX1NUQVRFX1BPSU5URVJTLAorICAgICAgICAgICAgICAgIGJsZW5kX29mZnNldCk7CisgICAgICAgIGdlbjdfM2RzdGF0ZV9wb2ludGVyKGNtZCwKKyAgICAgICAgICAgICAgICBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9ERVBUSF9TVEVOQ0lMX1NUQVRFX1BPSU5URVJTLAorICAgICAgICAgICAgICAgIGRzX29mZnNldCk7CisgICAgICAgIGdlbjdfM2RzdGF0ZV9wb2ludGVyKGNtZCwKKyAgICAgICAgICAgICAgICBHRU42X1JFTkRFUl9PUENPREVfM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUywgY2Nfb2Zmc2V0KTsKKworICAgICAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsCisgICAgICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlNfQ0MsCisgICAgICAgICAgICAgICAgY2NfdnBfb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiAzRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTICovCisgICAgICAgIGdlbjZfM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUyhjbWQsIGJsZW5kX29mZnNldCwgZHNfb2Zmc2V0LCBjY19vZmZzZXQpOworCisgICAgICAgIC8qIDNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlMgKi8KKyAgICAgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA0LCAmZHcpOworICAgICAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSUykgfCAoNCAtIDIpIHwKKyAgICAgICAgICAgICAgICBHRU42X1ZQX1BUUl9EVzBfQ0NfQ0hBTkdFRDsKKyAgICAgICAgZHdbMV0gPSAwOworICAgICAgICBkd1syXSA9IDA7CisgICAgICAgIGR3WzNdID0gY2NfdnBfb2Zmc2V0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuNl9tZXRhX3N1cmZhY2Vfc3RhdGVzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgKm1ldGEgPSBjbWQtPmJpbmQubWV0YTsKKyAgICB1aW50MzJfdCBiaW5kaW5nX3RhYmxlWzJdID0geyAwLCAwIH07CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIGNvbnN0IHVpbnQzMl90IHNiYV9vZmZzZXQgPQorICAgICAgICBjbWQtPndyaXRlcnNbSU5URUxfQ01EX1dSSVRFUl9TVVJGQUNFXS5zYmFfb2Zmc2V0OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBpZiAobWV0YS0+bW9kZSA9PSBJTlRFTF9DTURfTUVUQV9ERVBUSF9TVEVOQ0lMX1JFQ1QpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFNVUkZBQ0VfU1RBVEVzICovCisgICAgaWYgKG1ldGEtPnNyYy52YWxpZCkgeworICAgICAgICBvZmZzZXQgPSBjbWRfc3VyZmFjZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgR0VONl9BTElHTk1FTlRfU1VSRkFDRV9TVEFURSwKKyAgICAgICAgICAgICAgICBtZXRhLT5zcmMuc3VyZmFjZV9sZW4sIG1ldGEtPnNyYy5zdXJmYWNlKTsKKworICAgICAgICBjbWRfcmVzZXJ2ZV9yZWxvYyhjbWQsIDEpOworICAgICAgICBpZiAobWV0YS0+c3JjLnJlbG9jX2ZsYWdzICYgSU5URUxfQ01EX1JFTE9DX1RBUkdFVF9JU19XUklURVIpIHsKKyAgICAgICAgICAgIGNtZF9zdXJmYWNlX3JlbG9jX3dyaXRlcihjbWQsIG9mZnNldCwgMSwKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c3JjLnJlbG9jX3RhcmdldCwgbWV0YS0+c3JjLnJlbG9jX29mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWRfc3VyZmFjZV9yZWxvYyhjbWQsIG9mZnNldCwgMSwKKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9ibyAqKSBtZXRhLT5zcmMucmVsb2NfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBtZXRhLT5zcmMucmVsb2Nfb2Zmc2V0LCBtZXRhLT5zcmMucmVsb2NfZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgYmluZGluZ190YWJsZVswXSA9IG9mZnNldCAtIHNiYV9vZmZzZXQ7CisgICAgfQorICAgIGlmIChtZXRhLT5kc3QudmFsaWQpIHsKKyAgICAgICAgb2Zmc2V0ID0gY21kX3N1cmZhY2Vfd3JpdGUoY21kLCBJTlRFTF9DTURfSVRFTV9TVVJGQUNFLAorICAgICAgICAgICAgICAgIEdFTjZfQUxJR05NRU5UX1NVUkZBQ0VfU1RBVEUsCisgICAgICAgICAgICAgICAgbWV0YS0+ZHN0LnN1cmZhY2VfbGVuLCBtZXRhLT5kc3Quc3VyZmFjZSk7CisKKyAgICAgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAxKTsKKyAgICAgICAgY21kX3N1cmZhY2VfcmVsb2MoY21kLCBvZmZzZXQsIDEsCisgICAgICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9ibyAqKSBtZXRhLT5kc3QucmVsb2NfdGFyZ2V0LAorICAgICAgICAgICAgICAgIG1ldGEtPmRzdC5yZWxvY19vZmZzZXQsIG1ldGEtPmRzdC5yZWxvY19mbGFncyk7CisKKyAgICAgICAgYmluZGluZ190YWJsZVsxXSA9IG9mZnNldCAtIHNiYV9vZmZzZXQ7CisgICAgfQorCisgICAgLyogQklORElOR19UQUJMRSAqLworICAgIG9mZnNldCA9IGNtZF9zdXJmYWNlX3dyaXRlKGNtZCwgSU5URUxfQ01EX0lURU1fQklORElOR19UQUJMRSwKKyAgICAgICAgICAgIEdFTjZfQUxJR05NRU5UX0JJTkRJTkdfVEFCTEVfU1RBVEUsCisgICAgICAgICAgICAyLCBiaW5kaW5nX3RhYmxlKTsKKworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICAgIGNvbnN0IGludCBzdWJvcCA9IChtZXRhLT5tb2RlID09IElOVEVMX0NNRF9NRVRBX1ZTX1BPSU5UUykgPworICAgICAgICAgICAgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19WUyA6CisgICAgICAgICAgICBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX1BTOworICAgICAgICBnZW43XzNkc3RhdGVfcG9pbnRlcihjbWQsIHN1Ym9wLCBvZmZzZXQgLSBzYmFfb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMgKi8KKyAgICAgICAgaWYgKG1ldGEtPm1vZGUgPT0gSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTKQorICAgICAgICAgICAgZ2VuNl8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMoY21kLCBvZmZzZXQgLSBzYmFfb2Zmc2V0LCAwLCAwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2VuNl8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMoY21kLCAwLCAwLCBvZmZzZXQgLSBzYmFfb2Zmc2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfbWV0YV91cmIoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IGludCB2c19lbnRyeV9jb3VudCA9IChjbWQtPmRldi0+Z3B1LT5ndCA9PSAyKSA/IDI1NiA6IDEyODsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNik7CisKKyAgICAvKiAzRFNUQVRFX1VSQiAqLworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgMywgJmR3KTsKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9VUkIpIHwgKDMgLSAyKTsKKyAgICBkd1sxXSA9IHZzX2VudHJ5X2NvdW50IDw8IEdFTjZfVVJCX0RXMV9WU19FTlRSWV9DT1VOVF9fU0hJRlQ7CisgICAgZHdbMl0gPSAwOworfQorCitzdGF0aWMgdm9pZCBnZW43X21ldGFfdXJiKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBpbnQgcGNiX2FsbG9jID0gKGNtZC0+ZGV2LT5ncHUtPmd0ID09IDMpID8gMTYgOiA4OworICAgIGNvbnN0IGludCB1cmJfb2Zmc2V0ID0gcGNiX2FsbG9jIC8gODsKKyAgICBpbnQgdnNfZW50cnlfY291bnQ7CisgICAgdWludDMyX3QgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDcsIDcuNSk7CisKKyAgICBjbWRfd2FfZ2VuN19wcmVfdnNfZGVwdGhfc3RhbGxfd3JpdGUoY21kKTsKKworICAgIHN3aXRjaCAoY21kX2dlbihjbWQpKSB7CisgICAgY2FzZSBJTlRFTF9HRU4oNy41KToKKyAgICAgICAgdnNfZW50cnlfY291bnQgPSAoY21kLT5kZXYtPmdwdS0+Z3QgPj0gMikgPyAxNjY0IDogNjQwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0dFTig3KToKKyAgICBkZWZhdWx0OgorICAgICAgICB2c19lbnRyeV9jb3VudCA9IChjbWQtPmRldi0+Z3B1LT5ndCA9PSAyKSA/IDcwNCA6IDUxMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogM0RTVEFURV9VUkJfeCAqLworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgOCwgJmR3KTsKKworICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1VSQl9WUykgfCAoMiAtIDIpOworICAgIGR3WzFdID0gdXJiX29mZnNldCA8PCBHRU43X1VSQl9EVzFfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICB2c19lbnRyeV9jb3VudDsKKyAgICBkdyArPSAyOworCisgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfVVJCX0hTKSB8ICgyIC0gMik7CisgICAgZHdbMV0gPSB1cmJfb2Zmc2V0IDw8IEdFTjdfVVJCX0RXMV9PRkZTRVRfX1NISUZUOworICAgIGR3ICs9IDI7CisKKyAgICBkd1swXSA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9VUkJfRFMpIHwgKDIgLSAyKTsKKyAgICBkd1sxXSA9IHVyYl9vZmZzZXQgPDwgR0VON19VUkJfRFcxX09GRlNFVF9fU0hJRlQ7CisgICAgZHcgKz0gMjsKKworICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1VSQl9HUykgfCAoMiAtIDIpOworICAgIGR3WzFdID0gdXJiX29mZnNldCA8PCBHRU43X1VSQl9EVzFfT0ZGU0VUX19TSElGVDsKKyAgICBkdyArPSAyOworfQorCitzdGF0aWMgdm9pZCBnZW42X21ldGFfdmYoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSA9IGNtZC0+YmluZC5tZXRhOworICAgIHVpbnQzMl90IHZiX3N0YXJ0LCB2Yl9lbmQsIHZiX3N0cmlkZTsKKyAgICBpbnQgdmVfZm9ybWF0LCB2ZV96X3NvdXJjZTsKKyAgICB1aW50MzJfdCAqZHc7CisgICAgdWludDMyX3QgcG9zOworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBzd2l0Y2ggKG1ldGEtPm1vZGUpIHsKKyAgICBjYXNlIElOVEVMX0NNRF9NRVRBX1ZTX1BPSU5UUzoKKyAgICAgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCAzLCAmZHcpOworICAgICAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9WRVJURVhfRUxFTUVOVFMpIHwgKDMgLSAyKTsKKyAgICAgICAgZHdbMV0gPSBHRU42X1ZFX0RXMF9WQUxJRDsKKyAgICAgICAgZHdbMl0gPSBHRU42X1ZGQ09NUF9TVE9SRV9WSUQgPDwgR0VONl9WRV9EVzFfQ09NUDBfX1NISUZUIHwKKyAgICAgICAgICAgICAgICBHRU42X1ZGQ09NUF9OT1NUT1JFIDw8IEdFTjZfVkVfRFcxX0NPTVAxX19TSElGVCB8CisgICAgICAgICAgICAgICAgR0VONl9WRkNPTVBfTk9TVE9SRSA8PCBHRU42X1ZFX0RXMV9DT01QMl9fU0hJRlQgfAorICAgICAgICAgICAgICAgIEdFTjZfVkZDT01QX05PU1RPUkUgPDwgR0VONl9WRV9EVzFfQ09NUDNfX1NISUZUOworICAgICAgICByZXR1cm47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfQ01EX01FVEFfRlNfUkVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmVydGljZXNbM11bMl07CisKKyAgICAgICAgICAgIHZlcnRpY2VzWzBdWzBdID0gbWV0YS0+ZHN0LnggKyBtZXRhLT53aWR0aDsKKyAgICAgICAgICAgIHZlcnRpY2VzWzBdWzFdID0gbWV0YS0+ZHN0LnkgKyBtZXRhLT5oZWlnaHQ7CisgICAgICAgICAgICB2ZXJ0aWNlc1sxXVswXSA9IG1ldGEtPmRzdC54OworICAgICAgICAgICAgdmVydGljZXNbMV1bMV0gPSBtZXRhLT5kc3QueSArIG1ldGEtPmhlaWdodDsKKyAgICAgICAgICAgIHZlcnRpY2VzWzJdWzBdID0gbWV0YS0+ZHN0Lng7CisgICAgICAgICAgICB2ZXJ0aWNlc1syXVsxXSA9IG1ldGEtPmRzdC55OworCisgICAgICAgICAgICB2Yl9zdGFydCA9IGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX0JMT0IsIDMyLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YodmVydGljZXMpIC8gNCwgKGNvbnN0IHVpbnQzMl90ICopIHZlcnRpY2VzKTsKKworICAgICAgICAgICAgdmJfZW5kID0gdmJfc3RhcnQgKyBzaXplb2YodmVydGljZXMpIC0gMTsKKyAgICAgICAgICAgIHZiX3N0cmlkZSA9IHNpemVvZih2ZXJ0aWNlc1swXSk7CisgICAgICAgICAgICB2ZV96X3NvdXJjZSA9IEdFTjZfVkZDT01QX1NUT1JFXzA7CisgICAgICAgICAgICB2ZV9mb3JtYXQgPSBHRU42X0ZPUk1BVF9SMzJHMzJfVVNDQUxFRDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0NNRF9NRVRBX0RFUFRIX1NURU5DSUxfUkVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgdmVydGljZXNbM11bM107CisKKyAgICAgICAgICAgIHZlcnRpY2VzWzBdWzBdID0gKGZsb2F0KSAobWV0YS0+ZHN0LnggKyBtZXRhLT53aWR0aCk7CisgICAgICAgICAgICB2ZXJ0aWNlc1swXVsxXSA9IChmbG9hdCkgKG1ldGEtPmRzdC55ICsgbWV0YS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHZlcnRpY2VzWzBdWzJdID0gdV91aWYobWV0YS0+Y2xlYXJfdmFsWzBdKTsKKyAgICAgICAgICAgIHZlcnRpY2VzWzFdWzBdID0gKGZsb2F0KSBtZXRhLT5kc3QueDsKKyAgICAgICAgICAgIHZlcnRpY2VzWzFdWzFdID0gKGZsb2F0KSAobWV0YS0+ZHN0LnkgKyBtZXRhLT5oZWlnaHQpOworICAgICAgICAgICAgdmVydGljZXNbMV1bMl0gPSB1X3VpZihtZXRhLT5jbGVhcl92YWxbMF0pOworICAgICAgICAgICAgdmVydGljZXNbMl1bMF0gPSAoZmxvYXQpIG1ldGEtPmRzdC54OworICAgICAgICAgICAgdmVydGljZXNbMl1bMV0gPSAoZmxvYXQpIG1ldGEtPmRzdC55OworICAgICAgICAgICAgdmVydGljZXNbMl1bMl0gPSB1X3VpZihtZXRhLT5jbGVhcl92YWxbMF0pOworCisgICAgICAgICAgICB2Yl9zdGFydCA9IGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX0JMT0IsIDMyLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YodmVydGljZXMpIC8gNCwgKGNvbnN0IHVpbnQzMl90ICopIHZlcnRpY2VzKTsKKworICAgICAgICAgICAgdmJfZW5kID0gdmJfc3RhcnQgKyBzaXplb2YodmVydGljZXMpIC0gMTsKKyAgICAgICAgICAgIHZiX3N0cmlkZSA9IHNpemVvZih2ZXJ0aWNlc1swXSk7CisgICAgICAgICAgICB2ZV96X3NvdXJjZSA9IEdFTjZfVkZDT01QX1NUT1JFX1NSQzsKKyAgICAgICAgICAgIHZlX2Zvcm1hdCA9IEdFTjZfRk9STUFUX1IzMkczMkIzMl9GTE9BVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bmtub3duIG1ldGEgbW9kZSIpOworICAgICAgICByZXR1cm47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMgKi8KKyAgICBwb3MgPSBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDUsICZkdyk7CisKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9WRVJURVhfQlVGRkVSUykgfCAoNSAtIDIpOworICAgIGR3WzFdID0gdmJfc3RyaWRlOworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcpKQorICAgICAgICBkd1sxXSB8PSBHRU43X1ZCX0RXMF9BRERSX01PRElGSUVEOworCisgICAgY21kX3Jlc2VydmVfcmVsb2MoY21kLCAyKTsKKyAgICBjbWRfYmF0Y2hfcmVsb2Nfd3JpdGVyKGNtZCwgcG9zICsgMiwgSU5URUxfQ01EX1dSSVRFUl9TVEFURSwgdmJfc3RhcnQpOworICAgIGNtZF9iYXRjaF9yZWxvY193cml0ZXIoY21kLCBwb3MgKyAzLCBJTlRFTF9DTURfV1JJVEVSX1NUQVRFLCB2Yl9lbmQpOworCisgICAgZHdbNF0gPSAwOworCisgICAgLyogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMgKi8KKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDUsICZkdyk7CisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTKSB8ICg1IC0gMik7CisgICAgZHdbMV0gPSBHRU42X1ZFX0RXMF9WQUxJRDsKKyAgICBkd1syXSA9IEdFTjZfVkZDT01QX1NUT1JFXzAgPDwgR0VONl9WRV9EVzFfQ09NUDBfX1NISUZUIHwgLyogUmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgIEdFTjZfVkZDT01QX1NUT1JFXzAgPDwgR0VONl9WRV9EVzFfQ09NUDFfX1NISUZUIHwgLyogUmVuZGVyIFRhcmdldCBBcnJheSBJbmRleCAqLworICAgICAgICAgICAgR0VONl9WRkNPTVBfU1RPUkVfMCA8PCBHRU42X1ZFX0RXMV9DT01QMl9fU0hJRlQgfCAvKiBWaWV3cG9ydCBJbmRleCAqLworICAgICAgICAgICAgR0VONl9WRkNPTVBfU1RPUkVfMCA8PCBHRU42X1ZFX0RXMV9DT01QM19fU0hJRlQ7ICAvKiBQb2ludCBXaWR0aCAqLworICAgIGR3WzNdID0gR0VONl9WRV9EVzBfVkFMSUQgfAorICAgICAgICAgICAgdmVfZm9ybWF0IDw8IEdFTjZfVkVfRFcwX0ZPUk1BVF9fU0hJRlQ7CisgICAgZHdbNF0gPSBHRU42X1ZGQ09NUF9TVE9SRV9TUkMgIDw8IEdFTjZfVkVfRFcxX0NPTVAwX19TSElGVCB8CisgICAgICAgICAgICBHRU42X1ZGQ09NUF9TVE9SRV9TUkMgIDw8IEdFTjZfVkVfRFcxX0NPTVAxX19TSElGVCB8CisgICAgICAgICAgICB2ZV96X3NvdXJjZSAgICAgICAgICAgIDw8IEdFTjZfVkVfRFcxX0NPTVAyX19TSElGVCB8CisgICAgICAgICAgICBHRU42X1ZGQ09NUF9TVE9SRV8xX0ZQIDw8IEdFTjZfVkVfRFcxX0NPTVAzX19TSElGVDsKK30KKworc3RhdGljIHVpbnQzMl90IGdlbjZfbWV0YV92c19jb25zdGFudHMoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSA9IGNtZC0+YmluZC5tZXRhOworICAgIC8qIG9uZSBHUFIgKi8KKyAgICB1aW50MzJfdCBjb25zdHNbOF07CisgICAgdWludDMyX3QgY29uc3RfY291bnQ7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNy41KTsKKworICAgIHN3aXRjaCAobWV0YS0+c2hhZGVyX2lkKSB7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19GSUxMX01FTToKKyAgICAgICAgY29uc3RzWzBdID0gbWV0YS0+ZHN0Lng7CisgICAgICAgIGNvbnN0c1sxXSA9IG1ldGEtPmNsZWFyX3ZhbFswXTsKKyAgICAgICAgY29uc3RfY291bnQgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9NRU1fVU5BTElHTkVEOgorICAgICAgICBjb25zdHNbMF0gPSBtZXRhLT5kc3QueDsKKyAgICAgICAgY29uc3RzWzFdID0gbWV0YS0+c3JjLng7CisgICAgICAgIGNvbnN0X2NvdW50ID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1I4X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjE2X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyQjMyQTMyX1RPX01FTToKKyAgICAgICAgY29uc3RzWzBdID0gbWV0YS0+c3JjLng7CisgICAgICAgIGNvbnN0c1sxXSA9IG1ldGEtPnNyYy55OworICAgICAgICBjb25zdHNbMl0gPSBtZXRhLT53aWR0aDsKKyAgICAgICAgY29uc3RzWzNdID0gbWV0YS0+ZHN0Lng7CisgICAgICAgIGNvbnN0X2NvdW50ID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCEidW5rbm93biBtZXRhIHNoYWRlciBpZCIpOworICAgICAgICBjb25zdF9jb3VudCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHRoaXMgY2FuIGJlIHNraXBwZWQgYnV0IGl0IG1ha2VzIHN0YXRlIGR1bXBpbmcgcHJldHRpZXIgKi8KKyAgICBtZW1zZXQoJmNvbnN0c1tjb25zdF9jb3VudF0sIDAsIHNpemVvZihjb25zdHNbMF0pICogKDggLSBjb25zdF9jb3VudCkpOworCisgICAgcmV0dXJuIGNtZF9zdGF0ZV93cml0ZShjbWQsIElOVEVMX0NNRF9JVEVNX0JMT0IsIDMyLCA4LCBjb25zdHMpOworfQorCitzdGF0aWMgdm9pZCBnZW42X21ldGFfdnMoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSA9IGNtZC0+YmluZC5tZXRhOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnNoID0KKyAgICAgICAgaW50ZWxfZGV2X2dldF9tZXRhX3NoYWRlcihjbWQtPmRldiwgbWV0YS0+c2hhZGVyX2lkKTsKKyAgICB1aW50MzJfdCBvZmZzZXQsICpkdzsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgaWYgKG1ldGEtPm1vZGUgIT0gSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTKSB7CisgICAgICAgIHVpbnQzMl90IGNtZF9sZW47CisKKyAgICAgICAgLyogM0RTVEFURV9DT05TVEFOVF9WUyAqLworICAgICAgICBjbWRfbGVuID0gKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpID8gNyA6IDU7CisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgY21kX2xlbiwgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQ09OU1RBTlRfVlMpIHwgKGNtZF9sZW4gLSAyKTsKKyAgICAgICAgbWVtc2V0KCZkd1sxXSwgMCwgc2l6ZW9mKCpkdykgKiAoY21kX2xlbiAtIDEpKTsKKworICAgICAgICAvKiAzRFNUQVRFX1ZTICovCisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNiwgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfVlMpIHwgKDYgLSAyKTsKKyAgICAgICAgbWVtc2V0KCZkd1sxXSwgMCwgc2l6ZW9mKCpkdykgKiAoNiAtIDEpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNzZXJ0KG1ldGEtPmRzdC52YWxpZCAmJiBzaC0+dXNlcyA9PSBJTlRFTF9TSEFERVJfVVNFX1ZJRCk7CisKKyAgICAvKiAzRFNUQVRFX0NPTlNUQU5UX1ZTICovCisgICAgb2Zmc2V0ID0gZ2VuNl9tZXRhX3ZzX2NvbnN0YW50cyhjbWQpOworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNywgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQ09OU1RBTlRfVlMpIHwgKDcgLSAyKTsKKyAgICAgICAgZHdbMV0gPSAxIDw8IEdFTjdfQ09OU1RBTlRfRFcxX0JVRkZFUjBfUkVBRF9MRU5fX1NISUZUOworICAgICAgICBkd1syXSA9IDA7CisgICAgICAgIGR3WzNdID0gb2Zmc2V0IHwgR0VON19NT0NTX0wzX1dCOworICAgICAgICBkd1s0XSA9IDA7CisgICAgICAgIGR3WzVdID0gMDsKKyAgICAgICAgZHdbNl0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNSwgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQ09OU1RBTlRfVlMpIHwgKDUgLSAyKSB8CisgICAgICAgICAgICAgICAgMSA8PCBHRU42X0NPTlNUQU5UX0RXMF9CVUZGRVJfRU5BQkxFU19fU0hJRlQ7CisgICAgICAgIGR3WzFdID0gb2Zmc2V0OworICAgICAgICBkd1syXSA9IDA7CisgICAgICAgIGR3WzNdID0gMDsKKyAgICAgICAgZHdbNF0gPSAwOworICAgIH0KKworICAgIC8qIDNEU1RBVEVfVlMgKi8KKyAgICBvZmZzZXQgPSBlbWl0X3NoYWRlcihjbWQsIHNoKTsKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDYsICZkdyk7CisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfVlMpIHwgKDYgLSAyKTsKKyAgICBkd1sxXSA9IG9mZnNldDsKKyAgICBkd1syXSA9IEdFTjZfVEhSRUFERElTUF9TUEYgfAorICAgICAgICAgICAgKHNoLT5zYW1wbGVyX2NvdW50ICsgMykgLyA0IDw8IEdFTjZfVEhSRUFERElTUF9TQU1QTEVSX0NPVU5UX19TSElGVCB8CisgICAgICAgICAgICAgc2gtPnN1cmZhY2VfY291bnQgPDwgR0VONl9USFJFQURESVNQX0JJTkRJTkdfVEFCTEVfU0laRV9fU0hJRlQ7CisgICAgZHdbM10gPSAwOyAvKiBzY3JhdGNoICovCisgICAgZHdbNF0gPSBzaC0+dXJiX2dyZl9zdGFydCA8PCBHRU42X1ZTX0RXNF9VUkJfR1JGX1NUQVJUX19TSElGVCB8CisgICAgICAgICAgICAxIDw8IEdFTjZfVlNfRFc0X1VSQl9SRUFEX0xFTl9fU0hJRlQ7CisKKyAgICBkd1s1XSA9IEdFTjZfVlNfRFc1X0NBQ0hFX0RJU0FCTEUgfAorICAgICAgICAgICAgR0VONl9WU19EVzVfVlNfRU5BQkxFOworICAgIGlmIChjbWRfZ2VuKGNtZCkgPj0gSU5URUxfR0VOKDcuNSkpCisgICAgICAgIGR3WzVdIHw9IChzaC0+bWF4X3RocmVhZHMgLSAxKSA8PCBHRU43NV9WU19EVzVfTUFYX1RIUkVBRFNfX1NISUZUOworICAgIGVsc2UKKyAgICAgICAgZHdbNV0gfD0gKHNoLT5tYXhfdGhyZWFkcyAtIDEpIDw8IEdFTjZfVlNfRFc1X01BWF9USFJFQURTX19TSElGVDsKKworICAgIGFzc2VydCghc2gtPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgZ2VuNl9tZXRhX2Rpc2FibGVkKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNiwgNik7CisKKyAgICAvKiAzRFNUQVRFX0NPTlNUQU5UX0dTICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA1LCAmZHcpOworICAgIGR3WzBdID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0NPTlNUQU5UX0dTKSB8ICg1IC0gMik7CisgICAgZHdbMV0gPSAwOworICAgIGR3WzJdID0gMDsKKyAgICBkd1szXSA9IDA7CisgICAgZHdbNF0gPSAwOworCisgICAgLyogM0RTVEFURV9HUyAqLworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNywgJmR3KTsKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9HUykgfCAoNyAtIDIpOworICAgIGR3WzFdID0gMDsKKyAgICBkd1syXSA9IDA7CisgICAgZHdbM10gPSAwOworICAgIGR3WzRdID0gMSA8PCBHRU42X0dTX0RXNF9VUkJfUkVBRF9MRU5fX1NISUZUOworICAgIGR3WzVdID0gR0VONl9HU19EVzVfU1RBVElTVElDUzsKKyAgICBkd1s2XSA9IDA7CisKKyAgICAvKiAzRFNUQVRFX1NGICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCAyMCwgJmR3KTsKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9TRikgfCAoMjAgLSAyKTsKKyAgICBkd1sxXSA9IDEgPDwgR0VON19TQkVfRFcxX1VSQl9SRUFEX0xFTl9fU0hJRlQ7CisgICAgbWVtc2V0KCZkd1syXSwgMCwgMTggKiBzaXplb2YoKmR3KSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjdfbWV0YV9kaXNhYmxlZChzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgdWludDMyX3QgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDcsIDcuNSk7CisKKyAgICAvKiAzRFNUQVRFX0NPTlNUQU5UX0hTICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA3LCAmZHcpOworICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0NPTlNUQU5UX0hTKSB8ICg3IC0gMik7CisgICAgbWVtc2V0KCZkd1sxXSwgMCwgc2l6ZW9mKCpkdykgKiAoNyAtIDEpKTsKKworICAgIC8qIDNEU1RBVEVfSFMgKi8KKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDcsICZkdyk7CisgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfSFMpIHwgKDcgLSAyKTsKKyAgICBtZW1zZXQoJmR3WzFdLCAwLCBzaXplb2YoKmR3KSAqICg3IC0gMSkpOworCisgICAgLyogM0RTVEFURV9URSAqLworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNCwgJmR3KTsKKyAgICBkd1swXSA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9URSkgfCAoNCAtIDIpOworICAgIG1lbXNldCgmZHdbMV0sIDAsIHNpemVvZigqZHcpICogKDQgLSAxKSk7CisKKyAgICAvKiAzRFNUQVRFX0NPTlNUQU5UX0RTICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA3LCAmZHcpOworICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0NPTlNUQU5UX0RTKSB8ICg3IC0gMik7CisgICAgbWVtc2V0KCZkd1sxXSwgMCwgc2l6ZW9mKCpkdykgKiAoNyAtIDEpKTsKKworICAgIC8qIDNEU1RBVEVfRFMgKi8KKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDYsICZkdyk7CisgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfRFMpIHwgKDYgLSAyKTsKKyAgICBtZW1zZXQoJmR3WzFdLCAwLCBzaXplb2YoKmR3KSAqICg2IC0gMSkpOworCisgICAgLyogM0RTVEFURV9DT05TVEFOVF9HUyAqLworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNywgJmR3KTsKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9DT05TVEFOVF9HUykgfCAoNyAtIDIpOworICAgIG1lbXNldCgmZHdbMV0sIDAsIHNpemVvZigqZHcpICogKDcgLSAxKSk7CisKKyAgICAvKiAzRFNUQVRFX0dTICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA3LCAmZHcpOworICAgIGR3WzBdID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0dTKSB8ICg3IC0gMik7CisgICAgbWVtc2V0KCZkd1sxXSwgMCwgc2l6ZW9mKCpkdykgKiAoNyAtIDEpKTsKKworICAgIC8qIDNEU1RBVEVfU1RSRUFNT1VUICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCAzLCAmZHcpOworICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1NUUkVBTU9VVCkgfCAoMyAtIDIpOworICAgIG1lbXNldCgmZHdbMV0sIDAsIHNpemVvZigqZHcpICogKDMgLSAxKSk7CisKKyAgICAvKiAzRFNUQVRFX1NGICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA3LCAmZHcpOworICAgIGR3WzBdID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1NGKSB8ICg3IC0gMik7CisgICAgbWVtc2V0KCZkd1sxXSwgMCwgc2l6ZW9mKCpkdykgKiAoNyAtIDEpKTsKKworICAgIC8qIDNEU1RBVEVfU0JFICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCAxNCwgJmR3KTsKKyAgICBkd1swXSA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9TQkUpIHwgKDE0IC0gMik7CisgICAgZHdbMV0gPSAxIDw8IEdFTjdfU0JFX0RXMV9VUkJfUkVBRF9MRU5fX1NISUZUOworICAgIG1lbXNldCgmZHdbMl0sIDAsIHNpemVvZigqZHcpICogKDE0IC0gMikpOworfQorCitzdGF0aWMgdm9pZCBnZW42X21ldGFfY2xpcChzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9tZXRhICptZXRhID0gY21kLT5iaW5kLm1ldGE7CisgICAgdWludDMyX3QgKmR3OworCisgICAgLyogM0RTVEFURV9DTElQICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA0LCAmZHcpOworICAgIGR3WzBdID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0NMSVApIHwgKDQgLSAyKTsKKyAgICBkd1sxXSA9IDA7CisgICAgaWYgKG1ldGEtPm1vZGUgPT0gSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTKSB7CisgICAgICAgIGR3WzJdID0gR0VONl9DTElQX0RXMl9DTElQX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgR0VONl9DTElQX0RXMl9DTElQTU9ERV9SRUpFQ1RfQUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGR3WzJdID0gMDsKKyAgICB9CisgICAgZHdbM10gPSAwOworfQorCitzdGF0aWMgdm9pZCBnZW42X21ldGFfd20oc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSA9IGNtZC0+YmluZC5tZXRhOworICAgIHVpbnQzMl90ICpkdzsKKworICAgIENNRF9BU1NFUlQoY21kLCA2LCA3LjUpOworCisgICAgY21kX3dhX2dlbjZfcHJlX211bHRpc2FtcGxlX2RlcHRoX2ZsdXNoKGNtZCk7CisKKyAgICAvKiAzRFNUQVRFX01VTFRJU0FNUExFICovCisgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA0LCAmZHcpOworICAgICAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9NVUxUSVNBTVBMRSkgfCAoNCAtIDIpOworICAgICAgICBkd1sxXSA9CisgICAgICAgICAgICAobWV0YS0+c2FtcGxlX2NvdW50IDw9IDEpID8gR0VONl9NVUxUSVNBTVBMRV9EVzFfTlVNU0FNUExFU18xIDoKKyAgICAgICAgICAgIChtZXRhLT5zYW1wbGVfY291bnQgPD0gNCkgPyBHRU42X01VTFRJU0FNUExFX0RXMV9OVU1TQU1QTEVTXzQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjdfTVVMVElTQU1QTEVfRFcxX05VTVNBTVBMRVNfODsKKyAgICAgICAgZHdbMl0gPSAwOworICAgICAgICBkd1szXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCAzLCAmZHcpOworICAgICAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9NVUxUSVNBTVBMRSkgfCAoMyAtIDIpOworICAgICAgICBkd1sxXSA9IChtZXRhLT5zYW1wbGVfY291bnQgPD0gMSkgPyBHRU42X01VTFRJU0FNUExFX0RXMV9OVU1TQU1QTEVTXzEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONl9NVUxUSVNBTVBMRV9EVzFfTlVNU0FNUExFU180OworICAgICAgICBkd1syXSA9IDA7CisgICAgfQorCisgICAgLyogM0RTVEFURV9TQU1QTEVfTUFTSyAqLworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgMiwgJmR3KTsKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9TQU1QTEVfTUFTSykgfCAoMiAtIDIpOworICAgIGR3WzFdID0gKDEgPDwgbWV0YS0+c2FtcGxlX2NvdW50KSAtIDE7CisKKyAgICAvKiAzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFICovCisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA0LCAmZHcpOworICAgIGR3WzBdID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFKSB8ICg0IC0gMik7CisgICAgaWYgKG1ldGEtPm1vZGUgPT0gSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTKSB7CisgICAgICAgIC8qIHVudXNlZCAqLworICAgICAgICBkd1sxXSA9IDA7CisgICAgICAgIGR3WzJdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBkd1sxXSA9IG1ldGEtPmRzdC55IDw8IDE2IHwgbWV0YS0+ZHN0Lng7CisgICAgICAgIGR3WzJdID0gKG1ldGEtPmRzdC55ICsgbWV0YS0+aGVpZ2h0IC0gMSkgPDwgMTYgfAorICAgICAgICAgICAgICAgIChtZXRhLT5kc3QueCArIG1ldGEtPndpZHRoIC0gMSk7CisgICAgfQorICAgIGR3WzNdID0gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGdlbjZfbWV0YV9wc19jb25zdGFudHMoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSA9IGNtZC0+YmluZC5tZXRhOworICAgIHVpbnQzMl90IG9mZnNldF94LCBvZmZzZXRfeTsKKyAgICAvKiBvbmUgR1BSICovCisgICAgdWludDMyX3QgY29uc3RzWzhdOworICAgIHVpbnQzMl90IGNvbnN0X2NvdW50OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICAvKiB1bmRlcmZsb3cgaXMgZmluZSBoZXJlICovCisgICAgb2Zmc2V0X3ggPSBtZXRhLT5zcmMueCAtIG1ldGEtPmRzdC54OworICAgIG9mZnNldF95ID0gbWV0YS0+c3JjLnkgLSBtZXRhLT5kc3QueTsKKworICAgIHN3aXRjaCAobWV0YS0+c2hhZGVyX2lkKSB7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMUQ6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFEX0FSUkFZOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRDoKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkRfQVJSQVk6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX01TOgorICAgICAgICBjb25zdHNbMF0gPSBvZmZzZXRfeDsKKyAgICAgICAgY29uc3RzWzFdID0gb2Zmc2V0X3k7CisgICAgICAgIGNvbnN0c1syXSA9IG1ldGEtPnNyYy5sYXllcjsKKyAgICAgICAgY29uc3RzWzNdID0gbWV0YS0+c3JjLmxvZDsKKyAgICAgICAgY29uc3RfY291bnQgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMURfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRF9BUlJBWV9UT19NRU06CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkRfQVJSQVlfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9NU19UT19NRU06CisgICAgICAgIGNvbnN0c1swXSA9IG9mZnNldF94OworICAgICAgICBjb25zdHNbMV0gPSBvZmZzZXRfeTsKKyAgICAgICAgY29uc3RzWzJdID0gbWV0YS0+c3JjLmxheWVyOworICAgICAgICBjb25zdHNbM10gPSBtZXRhLT5zcmMubG9kOworICAgICAgICBjb25zdHNbNF0gPSBtZXRhLT5zcmMueDsKKyAgICAgICAgY29uc3RzWzVdID0gbWV0YS0+d2lkdGg7CisgICAgICAgIGNvbnN0X2NvdW50ID0gNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZX01FTV9UT19JTUc6CisgICAgICAgIGNvbnN0c1swXSA9IG9mZnNldF94OworICAgICAgICBjb25zdHNbMV0gPSBvZmZzZXRfeTsKKyAgICAgICAgY29uc3RzWzJdID0gbWV0YS0+d2lkdGg7CisgICAgICAgIGNvbnN0X2NvdW50ID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DTEVBUl9DT0xPUjoKKyAgICAgICAgY29uc3RzWzBdID0gbWV0YS0+Y2xlYXJfdmFsWzBdOworICAgICAgICBjb25zdHNbMV0gPSBtZXRhLT5jbGVhcl92YWxbMV07CisgICAgICAgIGNvbnN0c1syXSA9IG1ldGEtPmNsZWFyX3ZhbFsyXTsKKyAgICAgICAgY29uc3RzWzNdID0gbWV0YS0+Y2xlYXJfdmFsWzNdOworICAgICAgICBjb25zdF9jb3VudCA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ0xFQVJfREVQVEg6CisgICAgICAgIGNvbnN0c1swXSA9IG1ldGEtPmNsZWFyX3ZhbFswXTsKKyAgICAgICAgY29uc3RzWzFdID0gbWV0YS0+Y2xlYXJfdmFsWzFdOworICAgICAgICBjb25zdF9jb3VudCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfUkVTT0xWRV8yWDoKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX1JFU09MVkVfNFg6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19SRVNPTFZFXzhYOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfUkVTT0xWRV8xNlg6CisgICAgICAgIGNvbnN0c1swXSA9IG9mZnNldF94OworICAgICAgICBjb25zdHNbMV0gPSBvZmZzZXRfeTsKKyAgICAgICAgY29uc3RfY291bnQgPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bmtub3duIG1ldGEgc2hhZGVyIGlkIik7CisgICAgICAgIGNvbnN0X2NvdW50ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogdGhpcyBjYW4gYmUgc2tpcHBlZCBidXQgaXQgbWFrZXMgc3RhdGUgZHVtcGluZyBwcmV0dGllciAqLworICAgIG1lbXNldCgmY29uc3RzW2NvbnN0X2NvdW50XSwgMCwgc2l6ZW9mKGNvbnN0c1swXSkgKiAoOCAtIGNvbnN0X2NvdW50KSk7CisKKyAgICByZXR1cm4gY21kX3N0YXRlX3dyaXRlKGNtZCwgSU5URUxfQ01EX0lURU1fQkxPQiwgMzIsIDgsIGNvbnN0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfbWV0YV9wcyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2NtZF9tZXRhICptZXRhID0gY21kLT5iaW5kLm1ldGE7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqc2ggPQorICAgICAgICBpbnRlbF9kZXZfZ2V0X21ldGFfc2hhZGVyKGNtZC0+ZGV2LCBtZXRhLT5zaGFkZXJfaWQpOworICAgIHVpbnQzMl90IG9mZnNldCwgKmR3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDYpOworCisgICAgaWYgKG1ldGEtPm1vZGUgIT0gSU5URUxfQ01EX01FVEFfRlNfUkVDVCkgeworICAgICAgICAvKiAzRFNUQVRFX0NPTlNUQU5UX1BTICovCisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNSwgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQ09OU1RBTlRfUFMpIHwgKDUgLSAyKTsKKyAgICAgICAgZHdbMV0gPSAwOworICAgICAgICBkd1syXSA9IDA7CisgICAgICAgIGR3WzNdID0gMDsKKyAgICAgICAgZHdbNF0gPSAwOworCisgICAgICAgIC8qIDNEU1RBVEVfV00gKi8KKyAgICAgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA5LCAmZHcpOworICAgICAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9XTSkgfCAoOSAtIDIpOworICAgICAgICBkd1sxXSA9IDA7CisgICAgICAgIGR3WzJdID0gMDsKKyAgICAgICAgZHdbM10gPSAwOworCisgICAgICAgIHN3aXRjaCAobWV0YS0+ZHMub3ApIHsKKyAgICAgICAgY2FzZSBJTlRFTF9DTURfTUVUQV9EU19ISVpfQ0xFQVI6CisgICAgICAgICAgICBkd1s0XSA9IEdFTjZfV01fRFc0X0RFUFRIX0NMRUFSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URUxfQ01EX01FVEFfRFNfSElaX1JFU09MVkU6CisgICAgICAgICAgICBkd1s0XSA9IEdFTjZfV01fRFc0X0hJWl9SRVNPTFZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URUxfQ01EX01FVEFfRFNfUkVTT0xWRToKKyAgICAgICAgICAgIGR3WzRdID0gR0VONl9XTV9EVzRfREVQVEhfUkVTT0xWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZHdbNF0gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkd1s1XSA9IChzaC0+bWF4X3RocmVhZHMgLSAxKSA8PCBHRU42X1dNX0RXNV9NQVhfVEhSRUFEU19fU0hJRlQ7CisgICAgICAgIGR3WzZdID0gMDsKKyAgICAgICAgZHdbN10gPSAwOworICAgICAgICBkd1s4XSA9IDA7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGEgbm9ybWFsIGNvbG9yIHdyaXRlICovCisgICAgYXNzZXJ0KG1ldGEtPmRzdC52YWxpZCAmJiAhc2gtPnVzZXMpOworCisgICAgLyogM0RTVEFURV9DT05TVEFOVF9QUyAqLworICAgIG9mZnNldCA9IGdlbjZfbWV0YV9wc19jb25zdGFudHMoY21kKTsKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDUsICZkdyk7CisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQ09OU1RBTlRfUFMpIHwgKDUgLSAyKSB8CisgICAgICAgICAgICAxIDw8IEdFTjZfQ09OU1RBTlRfRFcwX0JVRkZFUl9FTkFCTEVTX19TSElGVDsKKyAgICBkd1sxXSA9IG9mZnNldDsKKyAgICBkd1syXSA9IDA7CisgICAgZHdbM10gPSAwOworICAgIGR3WzRdID0gMDsKKworICAgIC8qIDNEU1RBVEVfV00gKi8KKyAgICBvZmZzZXQgPSBlbWl0X3NoYWRlcihjbWQsIHNoKTsKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDksICZkdyk7CisgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfV00pIHwgKDkgLSAyKTsKKyAgICBkd1sxXSA9IG9mZnNldDsKKyAgICBkd1syXSA9IChzaC0+c2FtcGxlcl9jb3VudCArIDMpIC8gNCA8PCBHRU42X1RIUkVBRERJU1BfU0FNUExFUl9DT1VOVF9fU0hJRlQgfAorICAgICAgICAgICAgIHNoLT5zdXJmYWNlX2NvdW50IDw8IEdFTjZfVEhSRUFERElTUF9CSU5ESU5HX1RBQkxFX1NJWkVfX1NISUZUOworICAgIGR3WzNdID0gMDsgLyogc2NyYXRjaCAqLworICAgIGR3WzRdID0gc2gtPnVyYl9ncmZfc3RhcnQgPDwgR0VONl9XTV9EVzRfVVJCX0dSRl9TVEFSVDBfX1NISUZUOworICAgIGR3WzVdID0gKHNoLT5tYXhfdGhyZWFkcyAtIDEpIDw8IEdFTjZfV01fRFc1X01BWF9USFJFQURTX19TSElGVCB8CisgICAgICAgICAgICBHRU42X1dNX0RXNV9QU19ESVNQQVRDSF9FTkFCTEUgfAorICAgICAgICAgICAgR0VONl9QU19ESVNQQVRDSF8xNiA8PCBHRU42X1dNX0RXNV9QU19ESVNQQVRDSF9NT0RFX19TSElGVDsKKworICAgIGR3WzZdID0gc2gtPmluX2NvdW50IDw8IEdFTjZfV01fRFc2X1NGX0FUVFJfQ09VTlRfX1NISUZUIHwKKyAgICAgICAgICAgIEdFTjZfV01fRFc2X1BTX1BPU09GRlNFVF9OT05FIHwKKyAgICAgICAgICAgIEdFTjZfV01fRFc2X1pXX0lOVEVSUF9QSVhFTCB8CisgICAgICAgICAgICBzaC0+YmFyeWNlbnRyaWNfaW50ZXJwcyA8PCBHRU42X1dNX0RXNl9CQVJZQ0VOVFJJQ19JTlRFUlBfX1NISUZUIHwKKyAgICAgICAgICAgIEdFTjZfV01fRFc2X1BPSU5UX1JBU1RSVUxFX1VQUEVSX1JJR0hUOworICAgIGlmIChtZXRhLT5zYW1wbGVfY291bnQgPiAxKSB7CisgICAgICAgIGR3WzZdIHw9IEdFTjZfV01fRFc2X01TUkFTVE1PREVfT05fUEFUVEVSTiB8CisgICAgICAgICAgICAgICAgIEdFTjZfV01fRFc2X01TRElTUE1PREVfUEVSUElYRUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHdbNl0gfD0gR0VONl9XTV9EVzZfTVNSQVNUTU9ERV9PRkZfUElYRUwgfAorICAgICAgICAgICAgICAgICBHRU42X1dNX0RXNl9NU0RJU1BNT0RFX1BFUlNBTVBMRTsKKyAgICB9CisgICAgZHdbN10gPSAwOworICAgIGR3WzhdID0gMDsKKworICAgIGFzc2VydCghc2gtPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgZ2VuN19tZXRhX3BzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kX21ldGEgKm1ldGEgPSBjbWQtPmJpbmQubWV0YTsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpzaCA9CisgICAgICAgIGludGVsX2Rldl9nZXRfbWV0YV9zaGFkZXIoY21kLT5kZXYsIG1ldGEtPnNoYWRlcl9pZCk7CisgICAgdWludDMyX3Qgb2Zmc2V0LCAqZHc7CisKKyAgICBDTURfQVNTRVJUKGNtZCwgNywgNy41KTsKKworICAgIGlmIChtZXRhLT5tb2RlICE9IElOVEVMX0NNRF9NRVRBX0ZTX1JFQ1QpIHsKKyAgICAgICAgLyogM0RTVEFURV9XTSAqLworICAgICAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDMsICZkdyk7CisgICAgICAgIGR3WzBdID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1dNKSB8ICgzIC0gMik7CisKKyAgICAgICAgc3dpdGNoIChtZXRhLT5kcy5vcCkgeworICAgICAgICBjYXNlIElOVEVMX0NNRF9NRVRBX0RTX0hJWl9DTEVBUjoKKyAgICAgICAgICAgIGR3WzFdID0gR0VON19XTV9EVzFfREVQVEhfQ0xFQVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTF9DTURfTUVUQV9EU19ISVpfUkVTT0xWRToKKyAgICAgICAgICAgIGR3WzFdID0gR0VON19XTV9EVzFfSElaX1JFU09MVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTF9DTURfTUVUQV9EU19SRVNPTFZFOgorICAgICAgICAgICAgZHdbMV0gPSBHRU43X1dNX0RXMV9ERVBUSF9SRVNPTFZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkd1sxXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGR3WzJdID0gMDsKKworICAgICAgICAvKiAzRFNUQVRFX0NPTlNUQU5UX0dTICovCisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgNywgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU42X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfQ09OU1RBTlRfUFMpIHwgKDcgLSAyKTsKKyAgICAgICAgbWVtc2V0KCZkd1sxXSwgMCwgc2l6ZW9mKCpkdykgKiAoNyAtIDEpKTsKKworICAgICAgICAvKiAzRFNUQVRFX1BTICovCisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgOCwgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfUFMpIHwgKDggLSAyKTsKKyAgICAgICAgZHdbMV0gPSAwOworICAgICAgICBkd1syXSA9IDA7CisgICAgICAgIGR3WzNdID0gMDsKKyAgICAgICAgLyogcmVxdWlyZWQgdG8gYXZvaWQgaGFuZ3MgKi8KKyAgICAgICAgZHdbNF0gPSBHRU42X1BTX0RJU1BBVENIXzggPDwgR0VON19QU19EVzRfRElTUEFUQ0hfTU9ERV9fU0hJRlQgfAorICAgICAgICAgICAgICAgIChzaC0+bWF4X3RocmVhZHMgLSAxKSA8PCBHRU43X1BTX0RXNF9NQVhfVEhSRUFEU19fU0hJRlQ7CisgICAgICAgIGR3WzVdID0gMDsKKyAgICAgICAgZHdbNl0gPSAwOworICAgICAgICBkd1s3XSA9IDA7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGEgbm9ybWFsIGNvbG9yIHdyaXRlICovCisgICAgYXNzZXJ0KG1ldGEtPmRzdC52YWxpZCAmJiAhc2gtPnVzZXMpOworCisgICAgLyogM0RTVEFURV9XTSAqLworICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgMywgJmR3KTsKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9XTSkgfCAoMyAtIDIpOworICAgIGR3WzFdID0gR0VON19XTV9EVzFfUFNfRElTUEFUQ0hfRU5BQkxFIHwKKyAgICAgICAgICAgIEdFTjdfV01fRFcxX1pXX0lOVEVSUF9QSVhFTCB8CisgICAgICAgICAgICBzaC0+YmFyeWNlbnRyaWNfaW50ZXJwcyA8PCBHRU43X1dNX0RXMV9CQVJZQ0VOVFJJQ19JTlRFUlBfX1NISUZUIHwKKyAgICAgICAgICAgIEdFTjdfV01fRFcxX1BPSU5UX1JBU1RSVUxFX1VQUEVSX1JJR0hUOworICAgIGR3WzJdID0gMDsKKworICAgIC8qIDNEU1RBVEVfQ09OU1RBTlRfUFMgKi8KKyAgICBvZmZzZXQgPSBnZW42X21ldGFfcHNfY29uc3RhbnRzKGNtZCk7CisgICAgY21kX2JhdGNoX3BvaW50ZXIoY21kLCA3LCAmZHcpOworICAgIGR3WzBdID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX0NPTlNUQU5UX1BTKSB8ICg3IC0gMik7CisgICAgZHdbMV0gPSAxIDw8IEdFTjdfQ09OU1RBTlRfRFcxX0JVRkZFUjBfUkVBRF9MRU5fX1NISUZUOworICAgIGR3WzJdID0gMDsKKyAgICBkd1szXSA9IG9mZnNldCB8IEdFTjdfTU9DU19MM19XQjsKKyAgICBkd1s0XSA9IDA7CisgICAgZHdbNV0gPSAwOworICAgIGR3WzZdID0gMDsKKworICAgIC8qIDNEU1RBVEVfUFMgKi8KKyAgICBvZmZzZXQgPSBlbWl0X3NoYWRlcihjbWQsIHNoKTsKKyAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDgsICZkdyk7CisgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfUFMpIHwgKDggLSAyKTsKKyAgICBkd1sxXSA9IG9mZnNldDsKKyAgICBkd1syXSA9IChzaC0+c2FtcGxlcl9jb3VudCArIDMpIC8gNCA8PCBHRU42X1RIUkVBRERJU1BfU0FNUExFUl9DT1VOVF9fU0hJRlQgfAorICAgICAgICAgICAgIHNoLT5zdXJmYWNlX2NvdW50IDw8IEdFTjZfVEhSRUFERElTUF9CSU5ESU5HX1RBQkxFX1NJWkVfX1NISUZUOworICAgIGR3WzNdID0gMDsgLyogc2NyYXRjaCAqLworCisgICAgZHdbNF0gPSBHRU43X1BTX0RXNF9QVVNIX0NPTlNUQU5UX0VOQUJMRSB8CisgICAgICAgICAgICBHRU43X1BTX0RXNF9QT1NPRkZTRVRfTk9ORSB8CisgICAgICAgICAgICBHRU42X1BTX0RJU1BBVENIXzE2IDw8IEdFTjdfUFNfRFc0X0RJU1BBVENIX01PREVfX1NISUZUOworCisgICAgaWYgKGNtZF9nZW4oY21kKSA+PSBJTlRFTF9HRU4oNy41KSkgeworICAgICAgICBkd1s0XSB8PSAoc2gtPm1heF90aHJlYWRzIC0gMSkgPDwgR0VONzVfUFNfRFc0X01BWF9USFJFQURTX19TSElGVDsKKyAgICAgICAgZHdbNF0gfD0gKCgxIDw8IG1ldGEtPnNhbXBsZV9jb3VudCkgLSAxKSA8PAorICAgICAgICAgICAgR0VONzVfUFNfRFc0X1NBTVBMRV9NQVNLX19TSElGVDsKKyAgICB9IGVsc2UgeworICAgICAgICBkd1s0XSB8PSAoc2gtPm1heF90aHJlYWRzIC0gMSkgPDwgR0VON19QU19EVzRfTUFYX1RIUkVBRFNfX1NISUZUOworICAgIH0KKworICAgIGR3WzVdID0gc2gtPnVyYl9ncmZfc3RhcnQgPDwgR0VON19QU19EVzVfVVJCX0dSRl9TVEFSVDBfX1NISUZUOworICAgIGR3WzZdID0gMDsKKyAgICBkd1s3XSA9IDA7CisKKyAgICBhc3NlcnQoIXNoLT5wZXJfdGhyZWFkX3NjcmF0Y2hfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjZfbWV0YV9kZXB0aF9idWZmZXIoc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSA9IGNtZC0+YmluZC5tZXRhOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqdmlldyA9ICZtZXRhLT5kcy52aWV3OworCisgICAgQ01EX0FTU0VSVChjbWQsIDYsIDcuNSk7CisKKyAgICBpZiAoIXZpZXcpIHsKKyAgICAgICAgLyogYWxsIHplcm9zICovCisgICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYXR0X3ZpZXcgbnVsbF92aWV3OworICAgICAgICB2aWV3ID0gJm51bGxfdmlldzsKKyAgICB9CisKKyAgICBjbWRfd2FfZ2VuNl9wcmVfZHNfZmx1c2goY21kKTsKKyAgICBnZW42XzNEU1RBVEVfREVQVEhfQlVGRkVSKGNtZCwgdmlldywgbWV0YS0+ZHMub3B0aW1hbCk7CisgICAgZ2VuNl8zRFNUQVRFX1NURU5DSUxfQlVGRkVSKGNtZCwgdmlldywgbWV0YS0+ZHMub3B0aW1hbCk7CisgICAgZ2VuNl8zRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSKGNtZCwgdmlldywgbWV0YS0+ZHMub3B0aW1hbCk7CisKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkKKyAgICAgICAgZ2VuN18zRFNUQVRFX0NMRUFSX1BBUkFNUyhjbWQsIDApOworICAgIGVsc2UKKyAgICAgICAgZ2VuNl8zRFNUQVRFX0NMRUFSX1BBUkFNUyhjbWQsIDApOworfQorCitzdGF0aWMgYm9vbCBjbWRfYWxsb2NfZHNldF9kYXRhKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2NtZF9kc2V0X2RhdGEgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKnBpcGVsaW5lX2xheW91dCkKK3sKKyAgICBpZiAoZGF0YS0+c2V0X29mZnNldF9jb3VudCA8IHBpcGVsaW5lX2xheW91dC0+bGF5b3V0X2NvdW50KSB7CisgICAgICAgIGlmIChkYXRhLT5zZXRfb2Zmc2V0cykKKyAgICAgICAgICAgIGludGVsX2ZyZWUoY21kLCBkYXRhLT5zZXRfb2Zmc2V0cyk7CisKKyAgICAgICAgZGF0YS0+c2V0X29mZnNldHMgPSBpbnRlbF9hbGxvYyhjbWQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGRhdGEtPnNldF9vZmZzZXRzWzBdKSAqIHBpcGVsaW5lX2xheW91dC0+bGF5b3V0X2NvdW50LAorICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgICAgICBpZiAoIWRhdGEtPnNldF9vZmZzZXRzKSB7CisgICAgICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSk7CisgICAgICAgICAgICBkYXRhLT5zZXRfb2Zmc2V0X2NvdW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEtPnNldF9vZmZzZXRfY291bnQgPSBwaXBlbGluZV9sYXlvdXQtPmxheW91dF9jb3VudDsKKyAgICB9CisKKyAgICBpZiAoZGF0YS0+ZHluYW1pY19vZmZzZXRfY291bnQgPCBwaXBlbGluZV9sYXlvdXQtPnRvdGFsX2R5bmFtaWNfZGVzY19jb3VudCkgeworICAgICAgICBpZiAoZGF0YS0+ZHluYW1pY19vZmZzZXRzKQorICAgICAgICAgICAgaW50ZWxfZnJlZShjbWQsIGRhdGEtPmR5bmFtaWNfb2Zmc2V0cyk7CisKKyAgICAgICAgZGF0YS0+ZHluYW1pY19vZmZzZXRzID0gaW50ZWxfYWxsb2MoY21kLAorICAgICAgICAgICAgICAgIHNpemVvZihkYXRhLT5keW5hbWljX29mZnNldHNbMF0pICogcGlwZWxpbmVfbGF5b3V0LT50b3RhbF9keW5hbWljX2Rlc2NfY291bnQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgICAgIGlmICghZGF0YS0+ZHluYW1pY19vZmZzZXRzKSB7CisgICAgICAgICAgICBjbWRfZmFpbChjbWQsIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSk7CisgICAgICAgICAgICBkYXRhLT5keW5hbWljX29mZnNldF9jb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBkYXRhLT5keW5hbWljX29mZnNldF9jb3VudCA9IHBpcGVsaW5lX2xheW91dC0+dG90YWxfZHluYW1pY19kZXNjX2NvdW50OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBjbWRfYmluZF9keW5hbWljX3N0YXRlKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSkKKworeworICAgIFZrRmxhZ3MgdXNlX2ZsYWdzID0gcGlwZWxpbmUtPnN0YXRlLnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlOworICAgIGlmICghdXNlX2ZsYWdzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY21kLT5iaW5kLnN0YXRlLnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlID0gdXNlX2ZsYWdzOworICAgIGlmICh1c2VfZmxhZ3MgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19WSUVXUE9SVCkgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZHluYW1pY192aWV3cG9ydCAqdmlld3BvcnQgPSAmcGlwZWxpbmUtPnN0YXRlLnZpZXdwb3J0OworICAgICAgICBpbnRlbF9zZXRfdmlld3BvcnQoY21kLCB2aWV3cG9ydC0+Zmlyc3Rfdmlld3BvcnQsIHZpZXdwb3J0LT52aWV3cG9ydF9jb3VudCwgdmlld3BvcnQtPnZpZXdwb3J0cyk7CisgICAgfQorICAgIGlmICh1c2VfZmxhZ3MgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TQ0lTU09SKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9keW5hbWljX3ZpZXdwb3J0ICp2aWV3cG9ydCA9ICZwaXBlbGluZS0+c3RhdGUudmlld3BvcnQ7CisgICAgICAgIGludGVsX3NldF9zY2lzc29yKGNtZCwgdmlld3BvcnQtPmZpcnN0X3NjaXNzb3IsIHZpZXdwb3J0LT5zY2lzc29yX2NvdW50LCB2aWV3cG9ydC0+c2Npc3NvcnMpOworICAgIH0KKyAgICBpZiAodXNlX2ZsYWdzICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfTElORV9XSURUSCkgeworICAgICAgICBpbnRlbF9zZXRfbGluZV93aWR0aChjbWQsIHBpcGVsaW5lLT5zdGF0ZS5saW5lX3dpZHRoLmxpbmVfd2lkdGgpOworICAgIH0KKyAgICBpZiAodXNlX2ZsYWdzICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfREVQVEhfQklBUykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZHluYW1pY19kZXB0aF9iaWFzICpzID0gJnBpcGVsaW5lLT5zdGF0ZS5kZXB0aF9iaWFzOworICAgICAgICBpbnRlbF9zZXRfZGVwdGhfYmlhcyhjbWQsIHMtPmRlcHRoX2JpYXMsIHMtPmRlcHRoX2JpYXNfY2xhbXAsIHMtPnNsb3BlX3NjYWxlZF9kZXB0aF9iaWFzKTsKKyAgICB9CisgICAgaWYgKHVzZV9mbGFncyAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX0JMRU5EX0NPTlNUQU5UUykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZHluYW1pY19ibGVuZCAqcyA9ICZwaXBlbGluZS0+c3RhdGUuYmxlbmQ7CisgICAgICAgIGludGVsX3NldF9ibGVuZF9jb25zdGFudHMoY21kLCBzLT5ibGVuZF9jb25zdCk7CisgICAgfQorICAgIGlmICh1c2VfZmxhZ3MgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19ERVBUSF9CT1VORFMpIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2R5bmFtaWNfZGVwdGhfYm91bmRzICpzID0gJnBpcGVsaW5lLT5zdGF0ZS5kZXB0aF9ib3VuZHM7CisgICAgICAgIGludGVsX3NldF9kZXB0aF9ib3VuZHMoY21kLCBzLT5taW5fZGVwdGhfYm91bmRzLCBzLT5tYXhfZGVwdGhfYm91bmRzKTsKKyAgICB9CisgICAgaWYgKHVzZV9mbGFncyAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NURU5DSUxfQ09NUEFSRV9NQVNLKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9keW5hbWljX3N0ZW5jaWwgKnMgPSAmcGlwZWxpbmUtPnN0YXRlLnN0ZW5jaWw7CisgICAgICAgIGludGVsX3NldF9zdGVuY2lsX2NvbXBhcmVfbWFzayhjbWQsIFZLX1NURU5DSUxfRkFDRV9GUk9OVF9CSVQsIHMtPmZyb250LnN0ZW5jaWxfY29tcGFyZV9tYXNrKTsKKyAgICAgICAgaW50ZWxfc2V0X3N0ZW5jaWxfY29tcGFyZV9tYXNrKGNtZCwgVktfU1RFTkNJTF9GQUNFX0JBQ0tfQklULCBzLT5iYWNrLnN0ZW5jaWxfY29tcGFyZV9tYXNrKTsKKyAgICB9CisgICAgaWYgKHVzZV9mbGFncyAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NURU5DSUxfV1JJVEVfTUFTSykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZHluYW1pY19zdGVuY2lsICpzID0gJnBpcGVsaW5lLT5zdGF0ZS5zdGVuY2lsOworICAgICAgICBpbnRlbF9zZXRfc3RlbmNpbF93cml0ZV9tYXNrKGNtZCwgVktfU1RFTkNJTF9GQUNFX0ZST05UX0JJVCwgcy0+ZnJvbnQuc3RlbmNpbF93cml0ZV9tYXNrKTsKKyAgICAgICAgaW50ZWxfc2V0X3N0ZW5jaWxfd3JpdGVfbWFzayhjbWQsIFZLX1NURU5DSUxfRkFDRV9CQUNLX0JJVCwgcy0+YmFjay5zdGVuY2lsX3dyaXRlX21hc2spOworICAgIH0KKyAgICBpZiAodXNlX2ZsYWdzICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfU1RFTkNJTF9SRUZFUkVOQ0UpIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2R5bmFtaWNfc3RlbmNpbCAqcyA9ICZwaXBlbGluZS0+c3RhdGUuc3RlbmNpbDsKKyAgICAgICAgaW50ZWxfc2V0X3N0ZW5jaWxfcmVmZXJlbmNlKGNtZCwgVktfU1RFTkNJTF9GQUNFX0ZST05UX0JJVCwgcy0+ZnJvbnQuc3RlbmNpbF9yZWZlcmVuY2UpOworICAgICAgICBpbnRlbF9zZXRfc3RlbmNpbF9yZWZlcmVuY2UoY21kLCBWS19TVEVOQ0lMX0ZBQ0VfQkFDS19CSVQsIHMtPmJhY2suc3RlbmNpbF9yZWZlcmVuY2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY21kX2JpbmRfZ3JhcGhpY3NfcGlwZWxpbmUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSkKK3sKKyAgICBjbWQtPmJpbmQucGlwZWxpbmUuZ3JhcGhpY3MgPSBwaXBlbGluZTsKKworICAgIGNtZF9iaW5kX2R5bmFtaWNfc3RhdGUoY21kLCBwaXBlbGluZSk7CisKKyAgICBjbWRfYWxsb2NfZHNldF9kYXRhKGNtZCwgJmNtZC0+YmluZC5kc2V0LmdyYXBoaWNzX2RhdGEsCisgICAgICAgICAgICBwaXBlbGluZS0+cGlwZWxpbmVfbGF5b3V0KTsKK30KKworc3RhdGljIHZvaWQgY21kX2JpbmRfY29tcHV0ZV9waXBlbGluZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUpCit7CisgICAgY21kLT5iaW5kLnBpcGVsaW5lLmNvbXB1dGUgPSBwaXBlbGluZTsKKworICAgIGNtZF9hbGxvY19kc2V0X2RhdGEoY21kLCAmY21kLT5iaW5kLmRzZXQuY29tcHV0ZV9kYXRhLAorICAgICAgICAgICAgcGlwZWxpbmUtPnBpcGVsaW5lX2xheW91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9jb3B5X2RzZXRfZGF0YShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2NtZF9kc2V0X2RhdGEgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2xheW91dCAqcGlwZWxpbmVfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3NldCAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpkeW5hbWljX29mZnNldHMpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICpsYXlvdXQgPSBwaXBlbGluZV9sYXlvdXQtPmxheW91dHNbaW5kZXhdOworCisgICAgYXNzZXJ0KGluZGV4IDwgZGF0YS0+c2V0X29mZnNldF9jb3VudCk7CisgICAgZGF0YS0+c2V0X29mZnNldHNbaW5kZXhdID0gc2V0LT5yZWdpb25fYmVnaW47CisKKyAgICBpZiAobGF5b3V0LT5keW5hbWljX2Rlc2NfY291bnQpIHsKKyAgICAgICAgYXNzZXJ0KHBpcGVsaW5lX2xheW91dC0+ZHluYW1pY19kZXNjX2luZGljZXNbaW5kZXhdICsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPmR5bmFtaWNfZGVzY19jb3VudCAtIDEgPCBkYXRhLT5keW5hbWljX29mZnNldF9jb3VudCk7CisKKyAgICAgICAgbWVtY3B5KCZkYXRhLT5keW5hbWljX29mZnNldHNbcGlwZWxpbmVfbGF5b3V0LT5keW5hbWljX2Rlc2NfaW5kaWNlc1tpbmRleF1dLAorICAgICAgICAgICAgICAgIGR5bmFtaWNfb2Zmc2V0cywKKyAgICAgICAgICAgICAgICBzaXplb2YoZHluYW1pY19vZmZzZXRzWzBdKSAqIGxheW91dC0+ZHluYW1pY19kZXNjX2NvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9iaW5kX3ZlcnRleF9kYXRhKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9idWYgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGJpbmRpbmcpCit7CisgICAgLyogVE9ET1ZWOiB2ZXJpZnkgKi8KKyAgICBhc3NlcnQoIShiaW5kaW5nID49IEFSUkFZX1NJWkUoY21kLT5iaW5kLnZlcnRleC5idWYpKSAmJiAiYmluZGluZyBleGNlZWRzIGJ1ZiBzaXplIik7CisKKyAgICBjbWQtPmJpbmQudmVydGV4LmJ1ZltiaW5kaW5nXSA9IGJ1ZjsKKyAgICBjbWQtPmJpbmQudmVydGV4Lm9mZnNldFtiaW5kaW5nXSA9IG9mZnNldDsKK30KKworc3RhdGljIHZvaWQgY21kX2JpbmRfaW5kZXhfZGF0YShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9idWYgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCwgVmtJbmRleFR5cGUgdHlwZSkKK3sKKyAgICBjbWQtPmJpbmQuaW5kZXguYnVmID0gYnVmOworICAgIGNtZC0+YmluZC5pbmRleC5vZmZzZXQgPSBvZmZzZXQ7CisgICAgY21kLT5iaW5kLmluZGV4LnR5cGUgPSB0eXBlOworfQorCitzdGF0aWMgdWludDMyX3QgY21kX2dldF9tYXhfc3VyZmFjZV93cml0ZShjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSA9IGNtZC0+YmluZC5waXBlbGluZS5ncmFwaGljczsKKyAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcCAqcm1hcHNbNV0gPSB7CisgICAgICAgIHBpcGVsaW5lLT52cy5ybWFwLAorICAgICAgICBwaXBlbGluZS0+dGNzLnJtYXAsCisgICAgICAgIHBpcGVsaW5lLT50ZXMucm1hcCwKKyAgICAgICAgcGlwZWxpbmUtPmdzLnJtYXAsCisgICAgICAgIHBpcGVsaW5lLT5mcy5ybWFwLAorICAgIH07CisgICAgdWludDMyX3QgbWF4X3dyaXRlOworICAgIGludCBpOworCisgICAgU1RBVElDX0FTU0VSVChHRU42X0FMSUdOTUVOVF9TVVJGQUNFX1NUQVRFID49IEdFTjZfU1VSRkFDRV9TVEFURV9fU0laRSk7CisgICAgU1RBVElDX0FTU0VSVChHRU42X0FMSUdOTUVOVF9TVVJGQUNFX1NUQVRFID49CisgICAgICAgICAgICBHRU42X0FMSUdOTUVOVF9CSU5ESU5HX1RBQkxFX1NUQVRFKTsKKworICAgIC8qIHBhZCBmaXJzdCAqLworICAgIG1heF93cml0ZSA9IEdFTjZfQUxJR05NRU5UX1NVUkZBQ0VfU1RBVEU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShybWFwcyk7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcCAqcm1hcCA9IHJtYXBzW2ldOworICAgICAgICBjb25zdCB1aW50MzJfdCBzdXJmYWNlX2NvdW50ID0gKHJtYXApID8KKyAgICAgICAgICAgIHJtYXAtPnJ0X2NvdW50ICsgcm1hcC0+dGV4dHVyZV9yZXNvdXJjZV9jb3VudCArCisgICAgICAgICAgICBybWFwLT5yZXNvdXJjZV9jb3VudCArIHJtYXAtPnVhdl9jb3VudCA6IDA7CisKKyAgICAgICAgaWYgKHN1cmZhY2VfY291bnQpIHsKKyAgICAgICAgICAgIC8qIFNVUkZBQ0VfU1RBVEVzICovCisgICAgICAgICAgICBtYXhfd3JpdGUgKz0gR0VONl9BTElHTk1FTlRfU1VSRkFDRV9TVEFURSAqIHN1cmZhY2VfY291bnQ7CisKKyAgICAgICAgICAgIC8qIEJJTkRJTkdfVEFCTEVfU1RBVEUgKi8KKyAgICAgICAgICAgIG1heF93cml0ZSArPSB1X2FsaWduKHNpemVvZih1aW50MzJfdCkgKiBzdXJmYWNlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBHRU42X0FMSUdOTUVOVF9TVVJGQUNFX1NUQVRFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXhfd3JpdGU7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9hZGp1c3Rfc3RhdGVfYmFzZV9hZGRyZXNzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1tJTlRFTF9DTURfV1JJVEVSX1NVUkZBQ0VdOworICAgIGNvbnN0IHVpbnQzMl90IGN1cl9zdXJmYWNlX29mZnNldCA9IHdyaXRlci0+dXNlZCAtIHdyaXRlci0+c2JhX29mZnNldDsKKyAgICB1aW50MzJfdCBtYXhfc3VyZmFjZV93cml0ZTsKKworICAgIC8qIGVub3VnaCBmb3Igc3JjIGFuZCBkc3QgU1VSRkFDRV9TVEFURXMgcGx1cyBCSU5ESU5HX1RBQkxFX1NUQVRFICovCisgICAgaWYgKGNtZC0+YmluZC5tZXRhKQorICAgICAgICBtYXhfc3VyZmFjZV93cml0ZSA9IDY0ICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBlbHNlCisgICAgICAgIG1heF9zdXJmYWNlX3dyaXRlID0gY21kX2dldF9tYXhfc3VyZmFjZV93cml0ZShjbWQpOworCisgICAgLyogdGhlcmUgaXMgYSA2NEtCIGxpbWl0IG9uIEJJTkRJTkdfVEFCTEVfU1RBVEVzICovCisgICAgaWYgKGN1cl9zdXJmYWNlX29mZnNldCArIG1heF9zdXJmYWNlX3dyaXRlID4gNjQgKiAxMDI0KSB7CisgICAgICAgIC8qIFNCQSBleHBlY3RzIHBhZ2UtYWxpZ25lZCBhZGRyZXNzZXMgKi8KKyAgICAgICAgd3JpdGVyLT5zYmFfb2Zmc2V0ID0gd3JpdGVyLT51c2VkICYgfjB4ZmZmOworCisgICAgICAgIGFzc2VydCgod3JpdGVyLT51c2VkICYgMHhmZmYpICsgbWF4X3N1cmZhY2Vfd3JpdGUgPD0gNjQgKiAxMDI0KTsKKworICAgICAgICBjbWRfYmF0Y2hfc3RhdGVfYmFzZV9hZGRyZXNzKGNtZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjbWRfZHJhdyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJ0ZXhfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJ0ZXhfY291bnQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnN0YW5jZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluc3RhbmNlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmRleGVkLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVydGV4X2Jhc2UpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lICpwID0gY21kLT5iaW5kLnBpcGVsaW5lLmdyYXBoaWNzOworICAgIGNvbnN0IHVpbnQzMl90IHN1cmZhY2Vfd3JpdGVyX3VzZWQgVV9BU1NFUlRfT05MWSA9CisgICAgICAgIGNtZC0+d3JpdGVyc1tJTlRFTF9DTURfV1JJVEVSX1NVUkZBQ0VdLnVzZWQ7CisKKyAgICBjbWRfYWRqdXN0X3N0YXRlX2Jhc2VfYWRkcmVzcyhjbWQpOworCisgICAgZW1pdF9ib3VuZGVkX3N0YXRlcyhjbWQpOworCisgICAgLyogc2FuaXR5IGNoZWNrIG9uIGNtZF9nZXRfbWF4X3N1cmZhY2Vfd3JpdGUoKSAqLworICAgIGFzc2VydChjbWQtPndyaXRlcnNbSU5URUxfQ01EX1dSSVRFUl9TVVJGQUNFXS51c2VkIC0KKyAgICAgICAgICAgIHN1cmZhY2Vfd3JpdGVyX3VzZWQgPD0gY21kX2dldF9tYXhfc3VyZmFjZV93cml0ZShjbWQpKTsKKworICAgIGlmIChpbmRleGVkKSB7CisgICAgICAgIGFzc2VydCghKHAtPnByaW1pdGl2ZV9yZXN0YXJ0ICYmICFnZW42X2Nhbl9wcmltaXRpdmVfcmVzdGFydChjbWQpKSAmJiAiUHJpbWl0aXZlIHJlc3RhcnQgdW5zdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UiKTsKKworICAgICAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3LjUpKSB7CisgICAgICAgICAgICBnZW43NV8zRFNUQVRFX1ZGKGNtZCwgcC0+cHJpbWl0aXZlX3Jlc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIHAtPnByaW1pdGl2ZV9yZXN0YXJ0X2luZGV4KTsKKyAgICAgICAgICAgIGdlbjZfM0RTVEFURV9JTkRFWF9CVUZGRVIoY21kLCBjbWQtPmJpbmQuaW5kZXguYnVmLAorICAgICAgICAgICAgICAgICAgICBjbWQtPmJpbmQuaW5kZXgub2Zmc2V0LCBjbWQtPmJpbmQuaW5kZXgudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuNl8zRFNUQVRFX0lOREVYX0JVRkZFUihjbWQsIGNtZC0+YmluZC5pbmRleC5idWYsCisgICAgICAgICAgICAgICAgICAgIGNtZC0+YmluZC5pbmRleC5vZmZzZXQsIGNtZC0+YmluZC5pbmRleC50eXBlLAorICAgICAgICAgICAgICAgICAgICBwLT5wcmltaXRpdmVfcmVzdGFydCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoIXZlcnRleF9iYXNlKTsKKyAgICB9CisKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgeworICAgICAgICBnZW43XzNEUFJJTUlUSVZFKGNtZCwgcC0+cHJpbV90eXBlLCBpbmRleGVkLCB2ZXJ0ZXhfY291bnQsCisgICAgICAgICAgICAgICAgdmVydGV4X3N0YXJ0LCBpbnN0YW5jZV9jb3VudCwgaW5zdGFuY2Vfc3RhcnQsIHZlcnRleF9iYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW42XzNEUFJJTUlUSVZFKGNtZCwgcC0+cHJpbV90eXBlLCBpbmRleGVkLCB2ZXJ0ZXhfY291bnQsCisgICAgICAgICAgICAgICAgdmVydGV4X3N0YXJ0LCBpbnN0YW5jZV9jb3VudCwgaW5zdGFuY2Vfc3RhcnQsIHZlcnRleF9iYXNlKTsKKyAgICB9CisKKyAgICBjbWQtPmJpbmQuZHJhd19jb3VudCsrOworICAgIGNtZC0+YmluZC5yZW5kZXJfcGFzc19jaGFuZ2VkID0gZmFsc2U7CisgICAgLyogbmVlZCB0byByZS1lbWl0IGFsbCB3b3JrYXJvdW5kcyAqLworICAgIGNtZC0+YmluZC53YV9mbGFncyA9IDA7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiBJTlRFTF9ERUJVR19OT0NBQ0hFKQorICAgICAgICBjbWRfYmF0Y2hfZmx1c2hfYWxsKGNtZCk7Cit9CisKK3ZvaWQgY21kX2RyYXdfbWV0YShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIGNvbnN0IHN0cnVjdCBpbnRlbF9jbWRfbWV0YSAqbWV0YSkKK3sKKyAgICBjbWQtPmJpbmQubWV0YSA9IG1ldGE7CisKKyAgICBjbWRfYWRqdXN0X3N0YXRlX2Jhc2VfYWRkcmVzcyhjbWQpOworCisgICAgY21kX3dhX2dlbjZfcHJlX2RlcHRoX3N0YWxsX3dyaXRlKGNtZCk7CisgICAgY21kX3dhX2dlbjZfcHJlX2NvbW1hbmRfc2NvcmVib2FyZF9zdGFsbChjbWQpOworCisgICAgZ2VuNl9tZXRhX2R5bmFtaWNfc3RhdGVzKGNtZCk7CisgICAgZ2VuNl9tZXRhX3N1cmZhY2Vfc3RhdGVzKGNtZCk7CisKKyAgICBpZiAoY21kX2dlbihjbWQpID49IElOVEVMX0dFTig3KSkgeworICAgICAgICBnZW43X21ldGFfdXJiKGNtZCk7CisgICAgICAgIGdlbjZfbWV0YV92ZihjbWQpOworICAgICAgICBnZW42X21ldGFfdnMoY21kKTsKKyAgICAgICAgZ2VuN19tZXRhX2Rpc2FibGVkKGNtZCk7CisgICAgICAgIGdlbjZfbWV0YV9jbGlwKGNtZCk7CisgICAgICAgIGdlbjZfbWV0YV93bShjbWQpOworICAgICAgICBnZW43X21ldGFfcHMoY21kKTsKKyAgICAgICAgZ2VuNl9tZXRhX2RlcHRoX2J1ZmZlcihjbWQpOworCisgICAgICAgIGNtZF93YV9nZW43X3Bvc3RfY29tbWFuZF9jc19zdGFsbChjbWQpOworICAgICAgICBjbWRfd2FfZ2VuN19wb3N0X2NvbW1hbmRfZGVwdGhfc3RhbGwoY21kKTsKKworICAgICAgICBpZiAobWV0YS0+bW9kZSA9PSBJTlRFTF9DTURfTUVUQV9WU19QT0lOVFMpIHsKKyAgICAgICAgICAgIGdlbjdfM0RQUklNSVRJVkUoY21kLCBHRU42XzNEUFJJTV9QT0lOVExJU1QsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBtZXRhLT53aWR0aCAqIG1ldGEtPmhlaWdodCwgMCwgMSwgMCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW43XzNEUFJJTUlUSVZFKGNtZCwgR0VONl8zRFBSSU1fUkVDVExJU1QsIGZhbHNlLCAzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGdlbjZfbWV0YV91cmIoY21kKTsKKyAgICAgICAgZ2VuNl9tZXRhX3ZmKGNtZCk7CisgICAgICAgIGdlbjZfbWV0YV92cyhjbWQpOworICAgICAgICBnZW42X21ldGFfZGlzYWJsZWQoY21kKTsKKyAgICAgICAgZ2VuNl9tZXRhX2NsaXAoY21kKTsKKyAgICAgICAgZ2VuNl9tZXRhX3dtKGNtZCk7CisgICAgICAgIGdlbjZfbWV0YV9wcyhjbWQpOworICAgICAgICBnZW42X21ldGFfZGVwdGhfYnVmZmVyKGNtZCk7CisKKyAgICAgICAgaWYgKG1ldGEtPm1vZGUgPT0gSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTKSB7CisgICAgICAgICAgICBnZW42XzNEUFJJTUlUSVZFKGNtZCwgR0VONl8zRFBSSU1fUE9JTlRMSVNULCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+d2lkdGggKiBtZXRhLT5oZWlnaHQsIDAsIDEsIDAsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuNl8zRFBSSU1JVElWRShjbWQsIEdFTjZfM0RQUklNX1JFQ1RMSVNULCBmYWxzZSwgMywgMCwgMSwgMCwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbWQtPmJpbmQuZHJhd19jb3VudCsrOworICAgIC8qIG5lZWQgdG8gcmUtZW1pdCBhbGwgd29ya2Fyb3VuZHMgKi8KKyAgICBjbWQtPmJpbmQud2FfZmxhZ3MgPSAwOworCisgICAgY21kLT5iaW5kLm1ldGEgPSBOVUxMOworCisgICAgLyogbWFrZSB0aGUgbm9ybWFsIHBhdGggYmVsaWV2ZSB0aGUgcmVuZGVyIHBhc3MgaGFzIGNoYW5nZWQgKi8KKyAgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3NfY2hhbmdlZCA9IHRydWU7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiBJTlRFTF9ERUJVR19OT0NBQ0hFKQorICAgICAgICBjbWRfYmF0Y2hfZmx1c2hfYWxsKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9leGVjKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgc3RydWN0IGludGVsX2JvICpibykKK3sKKyAgIGNvbnN0IHVpbnQ4X3QgY21kX2xlbiA9IDI7CisgICB1aW50MzJfdCAqZHc7CisgICB1aW50MzJfdCBwb3M7CisKKyAgIGFzc2VydCghKGNtZF9nZW4oY21kKSA8IElOVEVMX0dFTig3LjUpKSAmJiAiSW52YWxpZCBHUFUgdmVyc2lvbiIpOworCisgICBwb3MgPSBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGNtZF9sZW4sICZkdyk7CisgICBkd1swXSA9IEdFTjZfTUlfQ01EKE1JX0JBVENIX0JVRkZFUl9TVEFSVCkgfCAoY21kX2xlbiAtIDIpIHwKKyAgICAgICAgICAgR0VONzVfTUlfQkFUQ0hfQlVGRkVSX1NUQVJUX0RXMF9TRUNPTkRfTEVWRUwgfAorICAgICAgICAgICBHRU43NV9NSV9CQVRDSF9CVUZGRVJfU1RBUlRfRFcwX05PTl9QUklWSUxFR0VEIHwKKyAgICAgICAgICAgR0VONl9NSV9CQVRDSF9CVUZGRVJfU1RBUlRfRFcwX1VTRV9QUEdUVDsKKworICAgY21kX2JhdGNoX3JlbG9jKGNtZCwgcG9zICsgMSwgYm8sIDAsIDApOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRQaXBlbGluZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBzd2l0Y2ggKHBpcGVsaW5lQmluZFBvaW50KSB7CisgICAgY2FzZSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0NPTVBVVEU6CisgICAgICAgIGNtZF9iaW5kX2NvbXB1dGVfcGlwZWxpbmUoY21kLCBpbnRlbF9waXBlbGluZShwaXBlbGluZSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1M6CisgICAgICAgIGNtZF9iaW5kX2dyYXBoaWNzX3BpcGVsaW5lKGNtZCwgaW50ZWxfcGlwZWxpbmUocGlwZWxpbmUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCEidW5zdXBwb3J0ZWQgcGlwZWxpbmVCaW5kUG9pbnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVCaW5kUG9pbnQsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JTZXRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljT2Zmc2V0Q291bnQsCisgICAgY29uc3QgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgIHBEeW5hbWljT2Zmc2V0cykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2xheW91dCAqcGlwZWxpbmVfbGF5b3V0OworICAgIHN0cnVjdCBpbnRlbF9jbWRfZHNldF9kYXRhICpkYXRhID0gTlVMTDsKKyAgICB1aW50MzJfdCBvZmZzZXRfY291bnQgPSAwOworICAgIHVpbnQzMl90IGk7CisKKyAgICBwaXBlbGluZV9sYXlvdXQgPSBpbnRlbF9waXBlbGluZV9sYXlvdXQobGF5b3V0KTsKKworICAgIHN3aXRjaCAocGlwZWxpbmVCaW5kUG9pbnQpIHsKKyAgICBjYXNlIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfQ09NUFVURToKKyAgICAgICAgZGF0YSA9ICZjbWQtPmJpbmQuZHNldC5jb21wdXRlX2RhdGE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUElQRUxJTkVfQklORF9QT0lOVF9HUkFQSElDUzoKKyAgICAgICAgZGF0YSA9ICZjbWQtPmJpbmQuZHNldC5ncmFwaGljc19kYXRhOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bnN1cHBvcnRlZCBwaXBlbGluZUJpbmRQb2ludCIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjbWRfYWxsb2NfZHNldF9kYXRhKGNtZCwgZGF0YSwgcGlwZWxpbmVfbGF5b3V0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjcmlwdG9yU2V0Q291bnQ7IGkrKykgeworICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKmRzZXQgPSBpbnRlbF9kZXNjX3NldChwRGVzY3JpcHRvclNldHNbaV0pOworCisgICAgICAgIG9mZnNldF9jb3VudCArPSBwaXBlbGluZV9sYXlvdXQtPmxheW91dHNbZmlyc3RTZXQgKyBpXS0+ZHluYW1pY19kZXNjX2NvdW50OworICAgICAgICBpZiAob2Zmc2V0X2NvdW50IDw9IGR5bmFtaWNPZmZzZXRDb3VudCkgeworICAgICAgICAgICAgY21kX2NvcHlfZHNldF9kYXRhKGNtZCwgZGF0YSwgcGlwZWxpbmVfbGF5b3V0LCBmaXJzdFNldCArIGksCisgICAgICAgICAgICAgICAgICAgIGRzZXQsIHBEeW5hbWljT2Zmc2V0cyk7CisgICAgICAgICAgICBwRHluYW1pY09mZnNldHMgKz0gcGlwZWxpbmVfbGF5b3V0LT5sYXlvdXRzW2ZpcnN0U2V0ICsgaV0tPmR5bmFtaWNfZGVzY19jb3VudDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYmluZGluZ0NvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGludGVsX2J1ZiAqYnVmID0gaW50ZWxfYnVmKHBCdWZmZXJzW2ldKTsKKyAgICAgICAgY21kX2JpbmRfdmVydGV4X2RhdGEoY21kLCBidWYsIHBPZmZzZXRzW2ldLCBmaXJzdEJpbmRpbmcgKyBpKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrSW5kZXhUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUeXBlKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKyAgICBzdHJ1Y3QgaW50ZWxfYnVmICpidWYgPSBpbnRlbF9idWYoYnVmZmVyKTsKKworICAgIGNtZF9iaW5kX2luZGV4X2RhdGEoY21kLCBidWYsIG9mZnNldCwgaW5kZXhUeXBlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhDb3VudCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZlcnRleCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICAgY21kX2RyYXcoY21kLCBmaXJzdFZlcnRleCwgdmVydGV4Q291bnQsCisgICAgICAgICAgICBmaXJzdEluc3RhbmNlLCBpbnN0YW5jZUNvdW50LCBmYWxzZSwgMCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRHJhd0luZGV4ZWQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICAgY21kX2RyYXcoY21kLCBmaXJzdEluZGV4LCBpbmRleENvdW50LAorICAgICAgICAgICAgZmlyc3RJbnN0YW5jZSwgaW5zdGFuY2VDb3VudCwgdHJ1ZSwgdmVydGV4T2Zmc2V0KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisgICAgYXNzZXJ0KDAgJiYgInZrQ21kRHJhd0luZGlyZWN0IG5vdCBpbXBsZW1lbnRlZCIpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXdJbmRleGVkSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisgICAgYXNzZXJ0KDAgJiYgInZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdCBub3QgaW1wbGVtZW50ZWQiKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREaXNwYXRjaCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KQoreworICAgIGFzc2VydCgwICYmICJ2a0NtZERpc3BhdGNoIG5vdCBpbXBsZW1lbnRlZCIpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERpc3BhdGNoSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpCit7CisgICAgYXNzZXJ0KDAgJiYgInZrQ21kRGlzYXRjaEluZGlyZWN0IG5vdCBpbXBsZW1lbnRlZCIpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFB1c2hDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcykKK3sKKyAgICAvKiBUT0RPOiBJbXBsZW1lbnQgKi8KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KQoreworICAgIHBHcmFudWxhcml0eS0+aGVpZ2h0ID0gMTsKKyAgICBwR3JhbnVsYXJpdHktPndpZHRoID0gMTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCZWdpblJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICpycCA9CisgICAgICAgIGludGVsX3JlbmRlcl9wYXNzKHBSZW5kZXJQYXNzQmVnaW4tPnJlbmRlclBhc3MpOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9mYiAqZmIgPSBpbnRlbF9mYihwUmVuZGVyUGFzc0JlZ2luLT5mcmFtZWJ1ZmZlcik7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2F0dF92aWV3ICp2aWV3OworICAgIHVpbnQzMl90IGk7CisKKyAgICAvKiBUT0RPVlY6ICovCisgICAgYXNzZXJ0KCEoIWNtZC0+cHJpbWFyeSB8fCBycC0+YXR0YWNobWVudF9jb3VudCAhPSBmYi0+dmlld19jb3VudCkgJiYgIkludmFsaWQgUmVuZGVyUGFzcyIpOworCisgICAgY21kX2JlZ2luX3JlbmRlcl9wYXNzKGNtZCwgcnAsIGZiLCAwLCBjb250ZW50cyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnAtPmF0dGFjaG1lbnRfY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3NfYXR0YWNobWVudCAqYXR0ID0gJnJwLT5hdHRhY2htZW50c1tpXTsKKyAgICAgICAgY29uc3QgVmtDbGVhclZhbHVlICpjbGVhcl92YWwgPQorICAgICAgICAgICAgJnBSZW5kZXJQYXNzQmVnaW4tPnBDbGVhclZhbHVlc1tpXTsKKyAgICAgICAgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgcmFuZ2U7CisKKyAgICAgICAgdmlldyA9IGZiLT52aWV3c1tpXTsKKyAgICAgICAgcmFuZ2UuYmFzZU1pcExldmVsID0gdmlldy0+bWlwTGV2ZWw7CisgICAgICAgIHJhbmdlLmxldmVsQ291bnQgPSAxOworICAgICAgICByYW5nZS5iYXNlQXJyYXlMYXllciA9IHZpZXctPmJhc2VBcnJheUxheWVyOworICAgICAgICByYW5nZS5sYXllckNvdW50ID0gdmlldy0+YXJyYXlfc2l6ZTsKKyAgICAgICAgcmFuZ2UuYXNwZWN0TWFzayA9IDA7CisKKyAgICAgICAgaWYgKHZpZXctPmlzX3J0KSB7CisgICAgICAgICAgICAvKiBjb2xvciAqLworICAgICAgICAgICAgaWYgKGF0dC0+Y2xlYXJfb25fbG9hZCkgeworICAgICAgICAgICAgICAgIHJhbmdlLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklUOworCisgICAgICAgICAgICAgICAgY21kX21ldGFfY2xlYXJfY29sb3JfaW1hZ2UoY29tbWFuZEJ1ZmZlciwgdmlldy0+aW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0LT5pbml0aWFsX2xheW91dCwgJmNsZWFyX3ZhbC0+Y29sb3IsIDEsICZyYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBkZXB0aC9zdGVuY2lsICovCisgICAgICAgICAgICBpZiAoYXR0LT5jbGVhcl9vbl9sb2FkKSB7CisgICAgICAgICAgICAgICAgcmFuZ2UuYXNwZWN0TWFzayB8PSBWS19JTUFHRV9BU1BFQ1RfREVQVEhfQklUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXR0LT5zdGVuY2lsX2NsZWFyX29uX2xvYWQpIHsKKyAgICAgICAgICAgICAgICByYW5nZS5hc3BlY3RNYXNrIHw9IFZLX0lNQUdFX0FTUEVDVF9TVEVOQ0lMX0JJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJhbmdlLmFzcGVjdE1hc2spIHsKKyAgICAgICAgICAgICAgICBjbWRfbWV0YV9jbGVhcl9kZXB0aF9zdGVuY2lsX2ltYWdlKGNvbW1hbmRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LT5pbWcsIGF0dC0+aW5pdGlhbF9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl92YWwtPmRlcHRoU3RlbmNpbC5kZXB0aCwgY2xlYXJfdmFsLT5kZXB0aFN0ZW5jaWwuc3RlbmNpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsICZyYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kTmV4dFN1YnBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1N1YnBhc3NDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3MgVV9BU1NFUlRfT05MWSAqcnAgPSBjbWQtPmJpbmQucmVuZGVyX3Bhc3M7CisKKyAgICAvKiBUT0RPVlYgKi8KKyAgIGFzc2VydCghKGNtZC0+YmluZC5yZW5kZXJfcGFzc19zdWJwYXNzID49IHJwLT5zdWJwYXNzZXMgKworICAgICAgICAgICBycC0+c3VicGFzc19jb3VudCAtIDEpICYmICJJbnZhbGlkIFJlbmRlclBhc3NDb250ZW50cyIpOworCisgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3NfY2hhbmdlZCA9IHRydWU7CisgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3Nfc3VicGFzcysrOworICAgY21kLT5iaW5kLnJlbmRlcl9wYXNzX2NvbnRlbnRzID0gY29udGVudHM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRW5kUmVuZGVyUGFzcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyKQoreworICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICBjbWRfZW5kX3JlbmRlcl9wYXNzKGNtZCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRXhlY3V0ZUNvbW1hbmRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyc0NvdW50LAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kQnVmZmVycykKK3sKKyAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKyAgIHVpbnQzMl90IGk7CisKKyAgIC8qIFRPRE9WViAqLworICAgYXNzZXJ0KCEoIWNtZC0+YmluZC5yZW5kZXJfcGFzcyB8fCBjbWQtPmJpbmQucmVuZGVyX3Bhc3NfY29udGVudHMgIT0KKyAgICAgICAgICAgVktfU1VCUEFTU19DT05URU5UU19TRUNPTkRBUllfQ09NTUFORF9CVUZGRVJTKSAmJiAiSW52YWxpZCBSZW5kZXJQYXNzIik7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBjb21tYW5kQnVmZmVyc0NvdW50OyBpKyspIHsKKyAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpzZWNvbmRhcnkgPSBpbnRlbF9jbWQocENvbW1hbmRCdWZmZXJzW2ldKTsKKworICAgICAgIC8qIFRPRE9WVjogTW92ZSB0ZXN0IHRvIHZhbGlkYXRpb24gbGF5ZXIgKi8KKyAgICAgICBhc3NlcnQoIShzZWNvbmRhcnktPnByaW1hcnkpICYmICJDYW5ub3QgYmUgcHJpbWFyeSBjb21tYW5kIGJ1ZmZlciIpOworCisgICAgICAgY21kX2V4ZWMoY21kLCBpbnRlbF9jbWRfZ2V0X2JhdGNoKHNlY29uZGFyeSwgTlVMTCkpOworICAgfQorCisgICBpZiAoaSkKKyAgICAgICBjbWRfYmF0Y2hfc3RhdGVfYmFzZV9hZGRyZXNzKGNtZCk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY21kX3ByaXYuaCBiL2ljZC9pbnRlbC9jbWRfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTdjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY21kX3ByaXYuaApAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZkBpancuY28ubno+CisgKgorICovCisKKyNpZm5kZWYgQ01EX1BSSVZfSAorI2RlZmluZSBDTURfUFJJVl9ICisKKyNpbmNsdWRlICJnZW5ody9nZW5ody5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImZiLmgiCisjaW5jbHVkZSAiZ3B1LmgiCisjaW5jbHVkZSAiY21kLmgiCisKKyNkZWZpbmUgQ01EX0FTU0VSVChjbWQsIG1pbl9nZW4sIG1heF9nZW4pIFwKKyAgICBJTlRFTF9HUFVfQVNTRVJUKChjbWQpLT5kZXYtPmdwdSwgKG1pbl9nZW4pLCAobWF4X2dlbikpCisKK2VudW0gaW50ZWxfY21kX2l0ZW1fdHlwZSB7CisgICAgLyogZm9yIHN0YXRlIGJ1ZmZlciAqLworICAgIElOVEVMX0NNRF9JVEVNX0JMT0IsCisgICAgSU5URUxfQ01EX0lURU1fQ0xJUF9WSUVXUE9SVCwKKyAgICBJTlRFTF9DTURfSVRFTV9TRl9WSUVXUE9SVCwKKyAgICBJTlRFTF9DTURfSVRFTV9TQ0lTU09SX1JFQ1QsCisgICAgSU5URUxfQ01EX0lURU1fQ0NfVklFV1BPUlQsCisgICAgSU5URUxfQ01EX0lURU1fQ09MT1JfQ0FMQywKKyAgICBJTlRFTF9DTURfSVRFTV9ERVBUSF9TVEVOQ0lMLAorICAgIElOVEVMX0NNRF9JVEVNX0JMRU5ELAorICAgIElOVEVMX0NNRF9JVEVNX1NBTVBMRVIsCisKKyAgICAvKiBmb3Igc3VyZmFjZSBidWZmZXIgKi8KKyAgICBJTlRFTF9DTURfSVRFTV9TVVJGQUNFLAorICAgIElOVEVMX0NNRF9JVEVNX0JJTkRJTkdfVEFCTEUsCisKKyAgICAvKiBmb3IgaW5zdHJ1Y3Rpb24gYnVmZmVyICovCisgICAgSU5URUxfQ01EX0lURU1fS0VSTkVMLAorCisgICAgSU5URUxfQ01EX0lURU1fQ09VTlQsCit9OworCitzdHJ1Y3QgaW50ZWxfY21kX2l0ZW0geworICAgIGVudW0gaW50ZWxfY21kX2l0ZW1fdHlwZSB0eXBlOworICAgIHNpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7Cit9OworCisjZGVmaW5lIElOVEVMX0NNRF9SRUxPQ19UQVJHRVRfSVNfV1JJVEVSICgxdSA8PCAzMSkKK3N0cnVjdCBpbnRlbF9jbWRfcmVsb2MgeworICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoOworICAgIHNpemVfdCBvZmZzZXQ7CisKKyAgICBpbnRwdHJfdCB0YXJnZXQ7CisgICAgdWludDMyX3QgdGFyZ2V0X29mZnNldDsKKworICAgIHVpbnQzMl90IGZsYWdzOworfTsKKworc3RydWN0IGludGVsX2F0dF92aWV3OworCitlbnVtIGludGVsX2NtZF9tZXRhX21vZGUgeworICAgIC8qCisgICAgICogRHJhdyBQT0lOVExJU1Qgb2YgKHdpZHRoICogaGVpZ2h0KSB2ZXJ0aWNlcyB3aXRoIG9ubHkgVlMgZW5hYmxlZC4gIFRoZQorICAgICAqIHZlcnRleCBpZCBpcyBmcm9tIDAgdG8gKHdpZHRoICogaGVpZ2h0IC0gMSkuCisgICAgICovCisgICAgSU5URUxfQ01EX01FVEFfVlNfUE9JTlRTLAorCisgICAgLyoKKyAgICAgKiBEcmF3IGEgUkVDVExJU1QgZnJvbSAoZHN0LngsIGRzdC55KSB0byAoZHN0LnggKyB3aWR0aCwgZHN0LnkgKyBoZWlnaHQpCisgICAgICogd2l0aCBvbmx5IEZTIGVuYWJsZWQuCisgICAgICovCisgICAgSU5URUxfQ01EX01FVEFfRlNfUkVDVCwKKworICAgIC8qCisgICAgICogRHJhdyBhIFJFQ1RMSVNUIGZyb20gKGRzdC54LCBkc3QueSkgdG8gKGRzdC54ICsgd2lkdGgsIGRzdC55ICsgaGVpZ2h0KQorICAgICAqIHdpdGggb25seSBkZXB0aC9zdGVuY2lsIGVuYWJsZWQuCisgICAgICovCisgICAgSU5URUxfQ01EX01FVEFfREVQVEhfU1RFTkNJTF9SRUNULAorfTsKKworZW51bSBpbnRlbF9jbWRfbWV0YV9kc19vcCB7CisgICAgSU5URUxfQ01EX01FVEFfRFNfTk9QLAorICAgIElOVEVMX0NNRF9NRVRBX0RTX0hJWl9DTEVBUiwKKyAgICBJTlRFTF9DTURfTUVUQV9EU19ISVpfUkVTT0xWRSwKKyAgICBJTlRFTF9DTURfTUVUQV9EU19SRVNPTFZFLAorfTsKKworc3RydWN0IGludGVsX2NtZF9tZXRhIHsKKyAgICBlbnVtIGludGVsX2NtZF9tZXRhX21vZGUgbW9kZTsKKyAgICBlbnVtIGludGVsX2Rldl9tZXRhX3NoYWRlciBzaGFkZXJfaWQ7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBib29sIHZhbGlkOworCisgICAgICAgIHVpbnQzMl90IHN1cmZhY2VbOF07CisgICAgICAgIHVpbnQzMl90IHN1cmZhY2VfbGVuOworCisgICAgICAgIGludHB0cl90IHJlbG9jX3RhcmdldDsKKyAgICAgICAgdWludDMyX3QgcmVsb2Nfb2Zmc2V0OworICAgICAgICB1aW50MzJfdCByZWxvY19mbGFnczsKKworICAgICAgICB1aW50MzJfdCBsb2QsIGxheWVyOworICAgICAgICB1aW50MzJfdCB4LCB5OworICAgIH0gc3JjLCBkc3Q7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdHJ1Y3QgaW50ZWxfYXR0X3ZpZXcgdmlldzsKKyAgICAgICAgdWludDMyX3Qgc3RlbmNpbF9yZWY7CisgICAgICAgIC8qIFVzaW5nIFZrSW1hZ2VBc3BlY3RGbGFnQml0cyBhcyB0aGF0IG1lYW5zIHdlCisgICAgICAgICAqIGFyZSBleHBlY3Rpbmcgb25seSBvbmUgYml0IHRvIGJlIHNldCBhdCBhIHRpbWUgKi8KKyAgICAgICAgVmtJbWFnZUFzcGVjdEZsYWdCaXRzIGFzcGVjdDsKKworICAgICAgICBlbnVtIGludGVsX2NtZF9tZXRhX2RzX29wIG9wOworICAgICAgICBib29sIG9wdGltYWw7CisgICAgfSBkczsKKworICAgIHVpbnQzMl90IGNsZWFyX3ZhbFs0XTsKKworICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgdWludDMyX3Qgc2FtcGxlX2NvdW50OworfTsKKworc3RhdGljIGlubGluZSBpbnQgY21kX2dlbihjb25zdCBzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgcmV0dXJuIGludGVsX2dwdV9nZW4oY21kLT5kZXYtPmdwdSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbWRfZmFpbChzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIFZrUmVzdWx0IHJlc3VsdCkKK3sKKyAgICBpbnRlbF9kZXZfbG9nKGNtZC0+ZGV2LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICZjbWQtPm9iai5iYXNlLCAwLCAwLAorICAgICAgICAgICAgICAgICAgImNvbW1hbmQgYnVpbGRpbmcgZXJyb3IiKTsKKworICAgIGNtZC0+cmVzdWx0ID0gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY21kX3Jlc2VydmVfcmVsb2Moc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlbG9jX2xlbikKK3sKKyAgICAvKiBmYWlsIHNpbGVudGx5ICovCisgICAgaWYgKGNtZC0+cmVsb2NfdXNlZCArIHJlbG9jX2xlbiA+IGNtZC0+cmVsb2NfY291bnQpIHsKKyAgICAgICAgY21kLT5yZWxvY191c2VkID0gMDsKKyAgICAgICAgY21kX2ZhaWwoY21kLCBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQpOworICAgIH0KKyAgICBhc3NlcnQoY21kLT5yZWxvY191c2VkICsgcmVsb2NfbGVuIDw9IGNtZC0+cmVsb2NfY291bnQpOworfQorCit2b2lkIGNtZF93cml0ZXJfZ3JvdyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZXdfc2l6ZSk7CisKK3ZvaWQgY21kX3dyaXRlcl9yZWNvcmQoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfaXRlbV90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBSZXR1cm4gYW4gb2Zmc2V0IHRvIGEgcmVnaW9uIHRoYXQgaXMgYWxpZ25lZCB0byBccCBhbGlnbm1lbnQgYW5kIGhhcyBhdAorICogbGVhc3QgXHAgc2l6ZSBieXRlcy4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgY21kX3dyaXRlcl9yZXNlcnZlKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1t3aGljaF07CisgICAgc2l6ZV90IG9mZnNldDsKKworICAgIGFzc2VydChhbGlnbm1lbnQgJiYgdV9pc19wb3cyKGFsaWdubWVudCkpOworICAgIG9mZnNldCA9IHVfYWxpZ24od3JpdGVyLT51c2VkLCBhbGlnbm1lbnQpOworCisgICAgaWYgKG9mZnNldCArIHNpemUgPiB3cml0ZXItPnNpemUpIHsKKyAgICAgICAgY21kX3dyaXRlcl9ncm93KGNtZCwgd2hpY2gsIG9mZnNldCArIHNpemUpOworICAgICAgICAvKiBhbGlnbiBhZ2FpbiBpbiBjYXNlIG9mIGVycm9ycyAqLworICAgICAgICBvZmZzZXQgPSB1X2FsaWduKHdyaXRlci0+dXNlZCwgYWxpZ25tZW50KTsKKworICAgICAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZSA8PSB3cml0ZXItPnNpemUpOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKgorICogQWRkIGEgcmVsb2MgYXQgXHAgcG9zLiAgTm8gZXJyb3IgY2hlY2tpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbWRfd3JpdGVyX3JlbG9jKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgaW50cHRyX3QgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFyZ2V0X29mZnNldCwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3RydWN0IGludGVsX2NtZF9yZWxvYyAqcmVsb2MgPSAmY21kLT5yZWxvY3NbY21kLT5yZWxvY191c2VkXTsKKworICAgIGFzc2VydChjbWQtPnJlbG9jX3VzZWQgPCBjbWQtPnJlbG9jX2NvdW50KTsKKworICAgIHJlbG9jLT53aGljaCA9IHdoaWNoOworICAgIHJlbG9jLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgcmVsb2MtPnRhcmdldCA9IHRhcmdldDsKKyAgICByZWxvYy0+dGFyZ2V0X29mZnNldCA9IHRhcmdldF9vZmZzZXQ7CisgICAgcmVsb2MtPmZsYWdzID0gZmxhZ3M7CisKKyAgICBjbWQtPnJlbG9jX3VzZWQrKzsKK30KKworLyoqCisgKiBSZXNlcnZlIGEgcmVnaW9uIGZyb20gdGhlIHN0YXRlIGJ1ZmZlci4gIFRoZSBvZmZzZXQsIGluIGJ5dGVzLCB0byB0aGUKKyAqIHJlc2VydmVkIHJlZ2lvbiBpcyByZXR1cm5lZC4KKyAqCisgKiBOb3RlIHRoYXQgXHAgYWxpZ25tZW50IGlzIGluIGJ5dGVzIGFuZCBccCBsZW4gaXMgaW4gRFdvcmRzLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNtZF9zdGF0ZV9yZXNlcnZlKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfaXRlbV90eXBlIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGlnbm1lbnQsIHVpbnQzMl90IGxlbikKK3sKKyAgICBjb25zdCBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCA9IElOVEVMX0NNRF9XUklURVJfU1RBVEU7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBsZW4gPDwgMjsKKyAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gY21kX3dyaXRlcl9yZXNlcnZlKGNtZCwgd2hpY2gsIGFsaWdubWVudCwgc2l6ZSk7CisgICAgc3RydWN0IGludGVsX2NtZF93cml0ZXIgKndyaXRlciA9ICZjbWQtPndyaXRlcnNbd2hpY2hdOworCisgICAgLyogYWxsIHN0YXRlcyBhcmUgYXQgbGVhc3QgYWxpZ25lZCB0byAzMi1ieXRlcyAqLworICAgIGFzc2VydChhbGlnbm1lbnQgJSAzMiA9PSAwKTsKKworICAgIHdyaXRlci0+dXNlZCA9IG9mZnNldCArIHNpemU7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiAoSU5URUxfREVCVUdfQkFUQ0ggfCBJTlRFTF9ERUJVR19IQU5HKSkKKyAgICAgICAgY21kX3dyaXRlcl9yZWNvcmQoY21kLCB3aGljaCwgaXRlbSwgb2Zmc2V0LCBzaXplKTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBwb2ludGVyIHRvIGEgcmVzZXJ2ZWQgcmVnaW9uIGZvciB1cGRhdGluZy4gIFRoZSBwb2ludGVyIGlzIG9ubHkKKyAqIHZhbGlkIHVudGlsIHRoZSBuZXh0IHJlc2VydmUgY2FsbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNtZF9zdGF0ZV91cGRhdGUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqKmR3KQoreworICAgIGNvbnN0IGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoID0gSU5URUxfQ01EX1dSSVRFUl9TVEFURTsKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1t3aGljaF07CisKKyAgICBhc3NlcnQob2Zmc2V0ICsgKGxlbiA8PCAyKSA8PSB3cml0ZXItPnVzZWQpOworCisgICAgKmR3ID0gKHVpbnQzMl90ICopICgoY2hhciAqKSB3cml0ZXItPnB0ciArIG9mZnNldCk7Cit9CisKKy8qKgorICogUmVzZXJ2ZSBhIHJlZ2lvbiBmcm9tIHRoZSBzdGF0ZSBidWZmZXIuICBCb3RoIHRoZSBvZmZzZXQsIGluIGJ5dGVzLCBhbmQgdGhlCisgKiBwb2ludGVyIHRvIHRoZSByZXNlcnZlZCByZWdpb24gYXJlIHJldHVybmVkLiAgVGhlIHBvaW50ZXIgaXMgb25seSB2YWxpZAorICogdW50aWwgdGhlIG5leHQgcmVzZXJ2ZSBjYWxsLgorICoKKyAqIE5vdGUgdGhhdCBccCBhbGlnbm1lbnQgaXMgaW4gYnl0ZXMgYW5kIFxwIGxlbiBpcyBpbiBEV29yZHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY21kX3N0YXRlX3BvaW50ZXIoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF9pdGVtX3R5cGUgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWdubWVudCwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqKmR3KQoreworICAgIGNvbnN0IHVpbnQzMl90IG9mZnNldCA9IGNtZF9zdGF0ZV9yZXNlcnZlKGNtZCwgaXRlbSwgYWxpZ25tZW50LCBsZW4pOworCisgICAgY21kX3N0YXRlX3VwZGF0ZShjbWQsIG9mZnNldCwgbGVuLCBkdyk7CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisvKioKKyAqIFdyaXRlIGEgZHluYW1pYyBzdGF0ZSB0byB0aGUgc3RhdGUgYnVmZmVyLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNtZF9zdGF0ZV93cml0ZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2NtZF9pdGVtX3R5cGUgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGlnbm1lbnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpkdykKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQsICpkc3Q7CisKKyAgICBvZmZzZXQgPSBjbWRfc3RhdGVfcG9pbnRlcihjbWQsIGl0ZW0sIGFsaWdubWVudCwgbGVuLCAmZHN0KTsKKyAgICBtZW1jcHkoZHN0LCBkdywgbGVuIDw8IDIpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqCisgKiBXcml0ZSBhIHN1cmZhY2Ugc3RhdGUgdG8gdGhlIHN1cmZhY2UgYnVmZmVyLiAgVGhlIG9mZnNldCwgaW4gYnl0ZXMsIG9mIHRoZQorICogc3RhdGUgaXMgcmV0dXJuZWQuCisgKgorICogTm90ZSB0aGF0IFxwIGFsaWdubWVudCBpcyBpbiBieXRlcyBhbmQgXHAgbGVuIGlzIGluIERXb3Jkcy4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjbWRfc3VyZmFjZV93cml0ZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX2l0ZW1fdHlwZSBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpkdykKK3sKKyAgICBjb25zdCBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCA9IElOVEVMX0NNRF9XUklURVJfU1VSRkFDRTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGxlbiA8PCAyOworICAgIGNvbnN0IHVpbnQzMl90IG9mZnNldCA9IGNtZF93cml0ZXJfcmVzZXJ2ZShjbWQsIHdoaWNoLCBhbGlnbm1lbnQsIHNpemUpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfd3JpdGVyICp3cml0ZXIgPSAmY21kLT53cml0ZXJzW3doaWNoXTsKKyAgICB1aW50MzJfdCAqZHN0OworCisgICAgYXNzZXJ0KGl0ZW0gPT0gSU5URUxfQ01EX0lURU1fU1VSRkFDRSB8fAorICAgICAgICAgICBpdGVtID09IElOVEVMX0NNRF9JVEVNX0JJTkRJTkdfVEFCTEUpOworCisgICAgLyogYWxsIHN0YXRlcyBhcmUgYXQgbGVhc3QgYWxpZ25lZCB0byAzMi1ieXRlcyAqLworICAgIGFzc2VydChhbGlnbm1lbnQgJSAzMiA9PSAwKTsKKworICAgIHdyaXRlci0+dXNlZCA9IG9mZnNldCArIHNpemU7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiBJTlRFTF9ERUJVR19CQVRDSCkKKyAgICAgICAgY21kX3dyaXRlcl9yZWNvcmQoY21kLCB3aGljaCwgaXRlbSwgb2Zmc2V0LCBzaXplKTsKKworICAgIGRzdCA9ICh1aW50MzJfdCAqKSAoKGNoYXIgKikgd3JpdGVyLT5wdHIgKyBvZmZzZXQpOworICAgIG1lbWNweShkc3QsIGR3LCBzaXplKTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKgorICogQWRkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgYSBEV29yZCBvZiBhIHN1cmZhY2Ugc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbWRfc3VyZmFjZV9yZWxvYyhzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBkd19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJvX29mZnNldCwgdWludDMyX3QgcmVsb2NfZmxhZ3MpCit7CisgICAgY29uc3QgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2ggPSBJTlRFTF9DTURfV1JJVEVSX1NVUkZBQ0U7CisKKyAgICBjbWRfd3JpdGVyX3JlbG9jKGNtZCwgd2hpY2gsIG9mZnNldCArIChkd19pbmRleCA8PCAyKSwKKyAgICAgICAgICAgIChpbnRwdHJfdCkgYm8sIGJvX29mZnNldCwgcmVsb2NfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY21kX3N1cmZhY2VfcmVsb2Nfd3JpdGVyKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBkd19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZXJfb2Zmc2V0KQoreworICAgIGNvbnN0IGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoID0gSU5URUxfQ01EX1dSSVRFUl9TVVJGQUNFOworCisgICAgY21kX3dyaXRlcl9yZWxvYyhjbWQsIHdoaWNoLCBvZmZzZXQgKyAoZHdfaW5kZXggPDwgMiksCisgICAgICAgICAgICAoaW50cHRyX3QpIHdyaXRlciwgd3JpdGVyX29mZnNldCwKKyAgICAgICAgICAgIElOVEVMX0NNRF9SRUxPQ19UQVJHRVRfSVNfV1JJVEVSKTsKK30KKworLyoqCisgKiBXcml0ZSBhIGtlcm5lbCB0byB0aGUgaW5zdHJ1Y3Rpb24gYnVmZmVyLiAgVGhlIG9mZnNldCwgaW4gYnl0ZXMsIG9mIHRoZQorICoga2VybmVsIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNtZF9pbnN0cnVjdGlvbl93cml0ZShzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtlcm5lbCkKK3sKKyAgICBjb25zdCBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCA9IElOVEVMX0NNRF9XUklURVJfSU5TVFJVQ1RJT047CisgICAgLyoKKyAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDIsIHBhZ2UgMTEyOgorICAgICAqCisgICAgICogICAgICJEdWUgdG8gcHJlZmV0Y2ggb2YgdGhlIGluc3RydWN0aW9uIHN0cmVhbSwgdGhlIEVVcyBtYXkgYXR0ZW1wdCB0bworICAgICAqICAgICAgYWNjZXNzIHVwIHRvIDggaW5zdHJ1Y3Rpb25zICgxMjggYnl0ZXMpIGJleW9uZCB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAga2VybmVsIHByb2dyYW0gLSBwb3NzaWJseSBpbnRvIHRoZSBuZXh0IG1lbW9yeSBwYWdlLiAgQWx0aG91Z2gKKyAgICAgKiAgICAgIHRoZXNlIGluc3RydWN0aW9ucyB3aWxsIG5vdCBiZSBleGVjdXRlZCwgc29mdHdhcmUgbXVzdCBhY2NvdW50IGZvcgorICAgICAqICAgICAgdGhlIHByZWZldGNoIGluIG9yZGVyIHRvIGF2b2lkIGludmFsaWQgcGFnZSBhY2Nlc3MgZmF1bHRzLiIKKyAgICAgKi8KKyAgICBjb25zdCBzaXplX3QgcmVzZXJ2ZWRfc2l6ZSA9IHNpemUgKyAxMjg7CisgICAgLyoga2VybmVscyBhcmUgYWxpZ25lZCB0byA2NCBieXRlcyAqLworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSA2NDsKKyAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gY21kX3dyaXRlcl9yZXNlcnZlKGNtZCwKKyAgICAgICAgICAgIHdoaWNoLCBhbGlnbm1lbnQsIHJlc2VydmVkX3NpemUpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfd3JpdGVyICp3cml0ZXIgPSAmY21kLT53cml0ZXJzW3doaWNoXTsKKworICAgIG1lbWNweSgoY2hhciAqKSB3cml0ZXItPnB0ciArIG9mZnNldCwga2VybmVsLCBzaXplKTsKKworICAgIHdyaXRlci0+dXNlZCA9IG9mZnNldCArIHNpemU7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiAoSU5URUxfREVCVUdfQkFUQ0ggfCBJTlRFTF9ERUJVR19IQU5HKSkKKyAgICAgICAgY21kX3dyaXRlcl9yZWNvcmQoY21kLCB3aGljaCwgSU5URUxfQ01EX0lURU1fS0VSTkVMLCBvZmZzZXQsIHNpemUpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqCisgKiBSZXNlcnZlIGEgcmVnaW9uIGZyb20gdGhlIGJhdGNoIGJ1ZmZlci4gIEJvdGggdGhlIG9mZnNldCwgaW4gRFdvcmRzLCBhbmQKKyAqIHRoZSBwb2ludGVyIHRvIHRoZSByZXNlcnZlZCByZWdpb24gYXJlIHJldHVybmVkLiAgVGhlIHBvaW50ZXIgaXMgb25seSB2YWxpZAorICogdW50aWwgdGhlIG5leHQgcmVzZXJ2ZSBjYWxsLgorICoKKyAqIE5vdGUgdGhhdCBccCBsZW4gaXMgaW4gRFdvcmRzLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNtZF9iYXRjaF9wb2ludGVyKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuLCB1aW50MzJfdCAqKmR3KQoreworICAgIGNvbnN0IGVudW0gaW50ZWxfY21kX3dyaXRlcl90eXBlIHdoaWNoID0gSU5URUxfQ01EX1dSSVRFUl9CQVRDSDsKKyAgICAvKgorICAgICAqIFdlIGtub3cgdGhlIGJhdGNoIGJvIGlzIGFsd2F5cyBhbGlnbmVkLiAgVXNpbmcgMSBoZXJlIHNob3VsZCBhbGxvdyB0aGUKKyAgICAgKiBjb21waWxlciB0byBvcHRpbWl6ZSBhd2F5IGFsaWduaW5nLgorICAgICAqLworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSAxOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gbGVuIDw8IDI7CisgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IGNtZF93cml0ZXJfcmVzZXJ2ZShjbWQsIHdoaWNoLCBhbGlnbm1lbnQsIHNpemUpOworICAgIHN0cnVjdCBpbnRlbF9jbWRfd3JpdGVyICp3cml0ZXIgPSAmY21kLT53cml0ZXJzW3doaWNoXTsKKworICAgIGFzc2VydChvZmZzZXQgJSA0ID09IDApOworICAgICpkdyA9ICh1aW50MzJfdCAqKSAoKGNoYXIgKikgd3JpdGVyLT5wdHIgKyBvZmZzZXQpOworCisgICAgd3JpdGVyLT51c2VkID0gb2Zmc2V0ICsgc2l6ZTsKKworICAgIHJldHVybiBvZmZzZXQgPj4gMjsKK30KKworLyoqCisgKiBXcml0ZSBhIGNvbW1hbmQgdG8gdGhlIGJhdGNoIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjbWRfYmF0Y2hfd3JpdGUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuLCBjb25zdCB1aW50MzJfdCAqZHcpCit7CisgICAgdWludDMyX3QgcG9zOworICAgIHVpbnQzMl90ICpkc3Q7CisKKyAgICBwb3MgPSBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIGxlbiwgJmRzdCk7CisgICAgbWVtY3B5KGRzdCwgZHcsIGxlbiA8PCAyKTsKKworICAgIHJldHVybiBwb3M7Cit9CisKKy8qKgorICogQWRkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgYSBEV29yZCBvZiBhIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbWRfYmF0Y2hfcmVsb2Moc3RydWN0IGludGVsX2NtZCAqY21kLCB1aW50MzJfdCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJvX29mZnNldCwgdWludDMyX3QgcmVsb2NfZmxhZ3MpCit7CisgICAgY29uc3QgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd2hpY2ggPSBJTlRFTF9DTURfV1JJVEVSX0JBVENIOworCisgICAgY21kX3dyaXRlcl9yZWxvYyhjbWQsIHdoaWNoLCBwb3MgPDwgMiwgKGludHB0cl90KSBibywgYm9fb2Zmc2V0LCByZWxvY19mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbWRfYmF0Y2hfcmVsb2Nfd3JpdGVyKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgdWludDMyX3QgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9jbWRfd3JpdGVyX3R5cGUgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVyX29mZnNldCkKK3sKKyAgICBjb25zdCBlbnVtIGludGVsX2NtZF93cml0ZXJfdHlwZSB3aGljaCA9IElOVEVMX0NNRF9XUklURVJfQkFUQ0g7CisKKyAgICBjbWRfd3JpdGVyX3JlbG9jKGNtZCwgd2hpY2gsIHBvcyA8PCAyLCAoaW50cHRyX3QpIHdyaXRlciwgd3JpdGVyX29mZnNldCwKKyAgICAgICAgICAgIElOVEVMX0NNRF9SRUxPQ19UQVJHRVRfSVNfV1JJVEVSKTsKK30KKwordm9pZCBjbWRfYmF0Y2hfc3RhdGVfYmFzZV9hZGRyZXNzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCk7Cit2b2lkIGNtZF9iYXRjaF9wdXNoX2NvbnN0X2FsbG9jKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCk7CisKKy8qKgorICogQmVnaW4gdGhlIGJhdGNoIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNtZF9iYXRjaF9iZWdpbihzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgY21kX2JhdGNoX3N0YXRlX2Jhc2VfYWRkcmVzcyhjbWQpOworICAgIGNtZF9iYXRjaF9wdXNoX2NvbnN0X2FsbG9jKGNtZCk7Cit9CisKKy8qKgorICogRW5kIHRoZSBiYXRjaCBidWZmZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbWRfYmF0Y2hfZW5kKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kX3dyaXRlciAqd3JpdGVyID0gJmNtZC0+d3JpdGVyc1tJTlRFTF9DTURfV1JJVEVSX0JBVENIXTsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBpZiAod3JpdGVyLT51c2VkICYgMHg3KSB7CisgICAgICAgIGNtZF9iYXRjaF9wb2ludGVyKGNtZCwgMSwgJmR3KTsKKyAgICAgICAgZHdbMF0gPSBHRU42X01JX0NNRChNSV9CQVRDSF9CVUZGRVJfRU5EKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbWRfYmF0Y2hfcG9pbnRlcihjbWQsIDIsICZkdyk7CisgICAgICAgIGR3WzBdID0gR0VONl9NSV9DTUQoTUlfQkFUQ0hfQlVGRkVSX0VORCk7CisgICAgICAgIGR3WzFdID0gR0VONl9NSV9DTUQoTUlfTk9PUCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY21kX2JlZ2luX3JlbmRlcl9wYXNzKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICpycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ZiICpmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3VicGFzc0NvbnRlbnRzIGNvbnRlbnRzKQoreworICAgIGFzc2VydChzcCA8IHJwLT5zdWJwYXNzX2NvdW50KTsKKworICAgIGNtZC0+YmluZC5yZW5kZXJfcGFzc19jaGFuZ2VkID0gdHJ1ZTsKKyAgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3MgPSBycDsKKyAgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3Nfc3VicGFzcyA9ICZycC0+c3VicGFzc2VzW3NwXTsKKyAgICBjbWQtPmJpbmQuZmIgPSBmYjsKKyAgICBjbWQtPmJpbmQucmVuZGVyX3Bhc3NfY29udGVudHMgPSBjb250ZW50czsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNtZF9lbmRfcmVuZGVyX3Bhc3Moc3RydWN0IGludGVsX2NtZCAqY21kKQoreworICAgIC8vbm90ZSB3aGF0IHRvIGRvIGlmIHJwICE9IGJvdW5kIHJwCisgICAgY21kLT5iaW5kLnJlbmRlcl9wYXNzID0gMDsKKyAgICBjbWQtPmJpbmQuZmIgPSAwOworfQorCit2b2lkIGNtZF9iYXRjaF9mbHVzaChzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIHVpbnQzMl90IHBpcGVfY29udHJvbF9kdzApOwordm9pZCBjbWRfYmF0Y2hfZmx1c2hfYWxsKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCk7CisKK3ZvaWQgY21kX2JhdGNoX2RlcHRoX2NvdW50KHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZVNpemUgb2Zmc2V0KTsKKwordm9pZCBjbWRfYmF0Y2hfdGltZXN0YW1wKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQpOworCit2b2lkIGNtZF9iYXRjaF9pbW1lZGlhdGUoc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpcGVfY29udHJvbF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsKTsKKwordm9pZCBjbWRfZHJhd19tZXRhKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgY29uc3Qgc3RydWN0IGludGVsX2NtZF9tZXRhICptZXRhKTsKKwordm9pZCBjbWRfbWV0YV9kc19vcChzdHJ1Y3QgaW50ZWxfY21kICpjbWQsCisgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfY21kX21ldGFfZHNfb3Agb3AsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UgKnJhbmdlKTsKKwordm9pZCBjbWRfbWV0YV9jbGVhcl9jb2xvcl9pbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICAgICAgICAgICAgICAgICAgICppbWcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgY29uc3QgVmtDbGVhckNvbG9yVmFsdWUgICAgICAgICAgICAqcENsZWFyQ29sb3IsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSAgICAgICpwUmFuZ2VzKTsKKwordm9pZCBjbWRfbWV0YV9jbGVhcl9kZXB0aF9zdGVuY2lsX2ltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgc3RydWN0IGludGVsX2ltZyogICAgICAgICAgICAgICAgICAgICAgICBpbWcsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUxheW91dCwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlbmNpbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgIHBSYW5nZXMpOworCisjZW5kaWYgLyogQ01EX1BSSVZfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL0NNYWtlTGlzdHMudHh0IGIvaWNkL2ludGVsL2NvbXBpbGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OGI1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzOTggQEAKKyMgQ3JlYXRlIHRoZSBpOTY1IGNvbXBpbGVyIGxpYnJhcnkKKworIyBNZXNhIHJlcXVpcmVkIGRlZmluZXMKK2FkZF9kZWZpbml0aW9ucygtRF9HTlVfU09VUkNFIC1ESEFWRV9QVEhSRUFEIC1EX19OT1RfSEFWRV9EUk1fSCkKKyMgTExWTSByZXF1aXJlZCBkZWZpbmVzCithZGRfZGVmaW5pdGlvbnMoLURfX1NURENfTElNSVRfTUFDUk9TIC1EX19TVERDX0NPTlNUQU5UX01BQ1JPUykKKworIyBERUJVRyBhbmQgTkRFQlVHIGZsYWdzIGFyZSBpbXBvcnRhbnQgZm9yIHByb3BlciBtZXNhIGJlaGF2aW9yCitzZXQoQ01BS0VfQ19GTEFHU19ERUJVRyAiJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAtRERFQlVHIikKK3NldChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSAtRE5ERUJVRyIpCitzZXQoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHICIke0NNQUtFX0NYWF9GTEFHU19ERUJVR30gLURERUJVRyAtc3RkPWMrKzExIikKK3NldChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRX0gLUROREVCVUcgLXN0ZD1jKysxMSIpCisKK2lmIChXSU4zMikKKyAgICAjIEZvciBXaW5kb3dzLCBzaW5jZSAzMi1iaXQgYW5kIDY0LWJpdCBpdGVtcyBjYW4gY28tZXhpc3QsIHdlIGJ1aWxkIGVhY2ggaW4gaXRzIG93biBidWlsZCBkaXJlY3RvcnkuCisgICAgIyAzMi1iaXQgdGFyZ2V0IGRhdGEgZ29lcyBpbiBidWlsZDMyLCBhbmQgNjQtYml0IHRhcmdldCBkYXRhIGdvZXMgaW50byBidWlsZC4gIFNvLCBpbmNsdWRlL2xpbmsgdGhlCisgICAgIyBhcHByb3ByaWF0ZSBkYXRhIGF0IGJ1aWxkIHRpbWUuCisgICAgaWYgKENNQUtFX0NMXzY0KQorICAgICAgICBzZXQgKEJVSUxEVEdUX0RJUiBidWlsZCkKKyAgICBlbHNlICgpCisgICAgICAgIHNldCAoQlVJTERUR1RfRElSIGJ1aWxkMzIpCisgICAgZW5kaWYoKQorZWxzZSgpCisgICAgc2V0IChCVUlMRFRHVF9ESVIgYnVpbGQpCitlbmRpZigpCisKKyMgTHVuYXJHIFRPRE86ICBHZXQgdGhlIGxsdm0tY29uZmlnIGZsYWdzIGhvb2tlZCB1cCBjb3JyZWN0bHkgYW5kIHJlbW92ZSBleHRyYSBkZWZpbml0aW9ucyBmcm9tIGFib3ZlCisKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7TFVOQVJHTEFTU19QUkVGSVh9L0NvcmUvTExWTS9sbHZtLTMuNC8ke0JVSUxEVEdUX0RJUn0vaW5zdGFsbC91c3IvbG9jYWwvYmluL2xsdm0tY29uZmlnIC0tbGlicyBlbmdpbmUgYml0d3JpdGVyCisgIE9VVFBVVF9WQVJJQUJMRSBMTFZNX0xJQlNfQUxMXzEKKyAgUkVTVUxUX1ZBUklBQkxFIExMVk1fTElCU19SRVNVTFQpCisKK3N0cmluZyhSRVBMQUNFICJcbiIgIiIgTExWTV9MSUJTX0FMTCAke0xMVk1fTElCU19BTExfMX0pCittZXNzYWdlKFNUQVRVUyAibGx2bS1jb25maWcgbGliIHJlc3VsdHMiKQorbWVzc2FnZShTVEFUVVMgJHtMTFZNX0xJQlNfQUxMfSkKKworaWYoTk9UICIke0xMVk1fTElCU19SRVNVTFR9IiBFUVVBTCAiMCIpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgImxsdm0tY29uZmlnIGZhaWxlZDogIiAke0xMVk1fTElCU19SRVNVTFR9KQorZW5kaWYoKQorCisjIEV4cGVjdCBsaWJyYXJpZXMgdG8gYmUgaW4gZWl0aGVyIHRoZSBidWlsZCAocmVsZWFzZSBidWlsZCkgb3IgZGJ1aWxkIChkZWJ1ZykgZGlyZWN0b3JpZXMKK2lmKEVYSVNUUyAke0xVTkFSR0xBU1NfUFJFRklYfS8ke0JVSUxEVEdUX0RJUn0vaW5zdGFsbC9saWIpCisgICAgc2V0KExVTkFSR0xBU1NfQlVJTEQgJHtMVU5BUkdMQVNTX1BSRUZJWH0vJHtCVUlMRFRHVF9ESVJ9KQorZWxzZWlmKEVYSVNUUyAke0xVTkFSR0xBU1NfUFJFRklYfS9kYnVpbGQvaW5zdGFsbC9saWIpCisgICAgc2V0KExVTkFSR0xBU1NfQlVJTEQgJHtMVU5BUkdMQVNTX1BSRUZJWH0vZGJ1aWxkKQorZWxzZSgpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiTmVjZXNzYXJ5IEx1bmFyR0xBU1MgbGlicmFyaWVzIGNhbm5vdCBiZSBmb3VuZDogIiAke0xVTkFSR0xBU1NfUFJFRklYfSkKK2VuZGlmKCkKKworZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtMVU5BUkdMQVNTX1BSRUZJWH0vQ29yZS9MTFZNL2xsdm0tMy40LyR7QlVJTERUR1RfRElSfS9pbnN0YWxsL3Vzci9sb2NhbC9iaW4vbGx2bS1jb25maWcgLS1jeHhmbGFncworICBPVVRQVVRfVkFSSUFCTEUgTExWTV9DWFhfQ09ORklHX0FMTF8xCisgIFJFU1VMVF9WQVJJQUJMRSBMTFZNX0NYWF9DT05GSUdfUkVTVUxUKQorCitzdHJpbmcoUkVQTEFDRSAiXG4iICIiIExMVk1fQ1hYX0NPTkZJR19BTEwgJHtMTFZNX0NYWF9DT05GSUdfQUxMXzF9KQorc3RyaW5nKFJFUExBQ0UgIi1Xb3ZlcmxvYWRlZC12aXJ0dWFsIiAiIiBMTFZNX0NYWF9DT05GSUdfMSAke0xMVk1fQ1hYX0NPTkZJR19BTEx9KQorc3RyaW5nKFJFUExBQ0UgIi1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbiIgIiIgTExWTV9DWFhfQ09ORklHICR7TExWTV9DWFhfQ09ORklHXzF9KQorbWVzc2FnZShTVEFUVVMgImxsdm0tY29uZmlnIGN4eGZsYWdzIHJlc3VsdHMiKQorbWVzc2FnZShTVEFUVVMgJHtMTFZNX0NYWF9DT05GSUd9KQorCisjIGlmKE5PVCAiJHtMTFZNX0NYWF9DT05GSUdfUkVTVUxUfSIgRVFVQUwgIjAiKQorIyAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgImxsdm0tY29uZmlnIGZhaWxlZDogIiAke0xMVk1fQ1hYX0NPTkZJR19SRVNVTFR9KQorIyBlbmRpZigpCisKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGljZAorICAgICAgUFJPUEVSVElFUworICAgICAgQ09NUElMRV9GTEFHUyAiJHtMTFZNX0NYWF9DT05GSUd9IikKKworU0VUKENPTVBJTEVSX0xJTktfRElSUworICAgIC1MJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2V4dGVybmFsL2dsc2xhbmcvYnVpbGQvaW5zdGFsbC9saWIKKyAgICAtTCR7TFVOQVJHTEFTU19QUkVGSVh9L0NvcmUvTExWTS9sbHZtLTMuNC8ke0JVSUxEVEdUX0RJUn0vaW5zdGFsbC91c3IvbG9jYWwvbGliCisgICAgLUwke0xVTkFSR0xBU1NfUFJFRklYfS8ke0JVSUxEVEdUX0RJUn0vQ29yZQorICAgIC1MJHtMVU5BUkdMQVNTX1BSRUZJWH0vJHtCVUlMRFRHVF9ESVJ9L0Zyb250ZW5kcy9nbHNsYW5nCisgICAgLUwke0xVTkFSR0xBU1NfUFJFRklYfS8ke0JVSUxEVEdUX0RJUn0vRnJvbnRlbmRzL1NQSVJWCisgICAgLUwke0xVTkFSR0xBU1NfUFJFRklYfS8ke0JVSUxEVEdUX0RJUn0vQ29yZS9QYXNzZXMvVHJhbnNmb3JtcworICAgIC1MJHtMVU5BUkdMQVNTX1BSRUZJWH0vJHtCVUlMRFRHVF9ESVJ9L0NvcmUvUGFzc2VzL0ltbXV0YWJsZQorICAgIC1MJHtMVU5BUkdMQVNTX1BSRUZJWH0vJHtCVUlMRFRHVF9ESVJ9L0NvcmUvUGFzc2VzL0FuYWx5c2lzCisgICAgLUwke0xVTkFSR0xBU1NfUFJFRklYfS8ke0JVSUxEVEdUX0RJUn0vQ29yZS9QYXNzZXMvVXRpbAorKQorCitTRVQoQ09NUElMRVJfTElCUworICAgZ2xzbGFuZ0Zyb250ZW5kCisgICBTcHZGcm9udGVuZAorICAgY29yZQorICAgTExWTWlwbworICAgZ2xzbGFuZworICAgU1BJUlYKKyAgIFNQVlJlbWFwcGVyCisgICBITFNMCisgICBPR0xDb21waWxlcgorICAgJHtMTFZNX0xJQlNfQUxMfQorKQorCisjIEVuc3VyZSB3ZSByZS1saW5rIGlmIG91ciBleHRlcm5hbCBsaWJyYXJpZXMgY2hhbmdlCisjIEV2ZXJ5IGVudHJ5IG9mIENPTVBJTEVSX0xJQlMgc2hvdWxkIGJlIGluY2x1ZGVkIGhlcmUKK3N0cmluZyhSRVBMQUNFICItbCIgIiIgTExWTV9MSUJTICR7TExWTV9MSUJTX0FMTH0pCitzZXBhcmF0ZV9hcmd1bWVudHMoTExWTV9MSUJTKQorZm9yZWFjaChMSUIgJHtMTFZNX0xJQlN9KQorICAgICNtZXNzYWdlKFNUQVRVUyAiYWRkaW5nIHRoZSBmb2xsb3dpbmcgbGliIikKKyAgICAjbWVzc2FnZShTVEFUVVMgJHtMSUJ9KQorICAgIGFkZF9saWJyYXJ5KCR7TElCfSBTVEFUSUMgSU1QT1JURUQpCisgICAgI21lc3NhZ2UoU1RBVFVTICJhZGRpbmcgdGhlIGZvbGxvd2luZyBwYXRoIikKKyAgICAjbWVzc2FnZShTVEFUVVMgJHtMVU5BUkdMQVNTX1BSRUZJWH0vQ29yZS9MTFZNL2xsdm0tMy40LyR7QlVJTERUR1RfRElSfS9pbnN0YWxsL3Vzci9sb2NhbC9saWIvbGliJHtMSUJ9LmEpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7TElCfSBQUk9QRVJUSUVTIElNUE9SVEVEX0xPQ0FUSU9OICR7TFVOQVJHTEFTU19QUkVGSVh9L0NvcmUvTExWTS9sbHZtLTMuNC8ke0JVSUxEVEdUX0RJUn0vaW5zdGFsbC91c3IvbG9jYWwvbGliL2xpYiR7TElCfS5hKQorZW5kZm9yZWFjaChMSUIpCithZGRfbGlicmFyeShnbHNsYW5nRnJvbnRlbmQgU1RBVElDIElNUE9SVEVEKQorYWRkX2xpYnJhcnkoU3B2RnJvbnRlbmQgICAgIFNUQVRJQyBJTVBPUlRFRCkKK2FkZF9saWJyYXJ5KGNvcmUgICAgICAgICAgICBTVEFUSUMgSU1QT1JURUQpCithZGRfbGlicmFyeShMTFZNaXBvICAgICAgICAgU1RBVElDIElNUE9SVEVEKQorYWRkX2xpYnJhcnkoZ2xzbGFuZyAgICAgICAgIFNUQVRJQyBJTVBPUlRFRCkKK2FkZF9saWJyYXJ5KFNQSVJWICAgICAgICAgICBTVEFUSUMgSU1QT1JURUQpCithZGRfbGlicmFyeShTUFZSZW1hcHBlciAgICAgU1RBVElDIElNUE9SVEVEKQorYWRkX2xpYnJhcnkoSExTTCAgICAgICAgICAgIFNUQVRJQyBJTVBPUlRFRCkKK2FkZF9saWJyYXJ5KE9HTENvbXBpbGVyICAgICBTVEFUSUMgSU1QT1JURUQpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyhnbHNsYW5nRnJvbnRlbmQgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTiAke0xVTkFSR0xBU1NfUFJFRklYfS8ke0JVSUxEVEdUX0RJUn0vRnJvbnRlbmRzL2dsc2xhbmcvbGliZ2xzbGFuZ0Zyb250ZW5kLmEpCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoU3B2RnJvbnRlbmQgICAgIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04gJHtMVU5BUkdMQVNTX1BSRUZJWH0vJHtCVUlMRFRHVF9ESVJ9L0Zyb250ZW5kcy9TUElSVi9saWJTcHZGcm9udGVuZC5hKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGNvcmUgICAgICAgICAgICBQUk9QRVJUSUVTIElNUE9SVEVEX0xPQ0FUSU9OICR7TFVOQVJHTEFTU19QUkVGSVh9LyR7QlVJTERUR1RfRElSfS9Db3JlL2xpYmNvcmUuYSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhMTFZNaXBvICAgICAgICAgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTiAke0xVTkFSR0xBU1NfUFJFRklYfS9Db3JlL0xMVk0vbGx2bS0zLjQvJHtCVUlMRFRHVF9ESVJ9L2luc3RhbGwvdXNyL2xvY2FsL2xpYi9saWJMTFZNaXBvLmEpCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ2xzbGFuZyAgICAgICAgIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04gJHtHTFNMQU5HX0xJQn0pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoU1BJUlYgICAgICAgICAgIFBST1BFUlRJRVMgSU1QT1JURURfTE9DQVRJT04gJHtTUElSVl9MSUJ9KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFNQVlJlbWFwcGVyICAgICBQUk9QRVJUSUVTIElNUE9SVEVEX0xPQ0FUSU9OICR7U1BJUlZfUkVNQVBQRVJfTElCfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhITFNMICAgICAgICAgICAgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTiAke0hMU0xfTElCfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhPR0xDb21waWxlciAgICAgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTiAke09HTENvbXBpbGVyX0xJQn0pCisKK1NFVChDT01QSUxFUl9JTkNMVURFX0RJUlMKKyAgICAke0dMU0xBTkdfU1BJUlZfSU5DTFVERV9ESVJ9CisgICAgJHtMVU5BUkdMQVNTX1BSRUZJWH0vQ29yZS9MTFZNL2xsdm0tMy40LyR7QlVJTERUR1RfRElSfS9pbnN0YWxsL3Vzci9sb2NhbC9pbmNsdWRlCisgICAgJHtMVU5BUkdMQVNTX1BSRUZJWH0KKyAgICBzaGFkZXIKKyAgICBwaXBlbGluZQorICAgIG1lc2EtdXRpbHMvaW5jbHVkZQorICAgIG1lc2EtdXRpbHMvc3JjCisgICAgbWVzYS11dGlscy9zcmMvZ2xzbAorICAgIG1lc2EtdXRpbHMvc3JjL21lc2EKKyAgICBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0KKyAgICBtZXNhLXV0aWxzL3NyYy9tYXBpCispCisKK1NFVChDUkVBVEVfU0hBREVSX1NPVVJDRVMKKyAgICBzaGFkZXIvYXN0X2FycmF5X2luZGV4LmNwcAorICAgIHNoYWRlci9hc3RfZXhwci5jcHAKKyAgICBzaGFkZXIvYXN0X2Z1bmN0aW9uLmNwcAorICAgIHNoYWRlci9hc3RfdG9faGlyLmNwcAorICAgIHNoYWRlci9hc3RfdHlwZS5jcHAKKyAgICBzaGFkZXIvYnVpbHRpbl9mdW5jdGlvbnMuY3BwCisgICAgc2hhZGVyL2J1aWx0aW5fdHlwZXMuY3BwCisgICAgc2hhZGVyL2J1aWx0aW5fdmFyaWFibGVzLmNwcAorICAgIHNoYWRlci9pci5jcHAKKyAgICBzaGFkZXIvaXJfYmFzaWNfYmxvY2suY3BwCisgICAgc2hhZGVyL2lyX2J1aWxkZXIuY3BwCisgICAgc2hhZGVyL2lyX2Nsb25lLmNwcAorICAgIHNoYWRlci9pcl9jb25zdGFudF9leHByZXNzaW9uLmNwcAorICAgIHNoYWRlci9pcl9kZXNlcmlhbGl6ZXIuY3BwCisgICAgc2hhZGVyL2lyX2VxdWFscy5jcHAKKyAgICBzaGFkZXIvaXJfZXhwcmVzc2lvbl9mbGF0dGVuaW5nLmNwcAorICAgIHNoYWRlci9pcl9mdW5jdGlvbl9jYW5faW5saW5lLmNwcAorICAgIHNoYWRlci9pcl9mdW5jdGlvbi5jcHAKKyAgICBzaGFkZXIvaXJfZnVuY3Rpb25fZGV0ZWN0X3JlY3Vyc2lvbi5jcHAKKyAgICBzaGFkZXIvaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IuY3BwCisgICAgc2hhZGVyL2lyX2h2X2FjY2VwdC5jcHAKKyAgICBzaGFkZXIvaXJfaW1wb3J0X3Byb3RvdHlwZXMuY3BwCisgICAgc2hhZGVyL2lyX3ByaW50X3Zpc2l0b3IuY3BwCisgICAgc2hhZGVyL2lyX3JlYWRlci5jcHAKKyAgICBzaGFkZXIvaXJfcnZhbHVlX3Zpc2l0b3IuY3BwCisgICAgc2hhZGVyL2lyX3NlcmlhbGl6ZS5jcHAKKyAgICBzaGFkZXIvaXJfc2V0X3Byb2dyYW1faW5vdXRzLmNwcAorICAgIHNoYWRlci9pcl92YWxpZGF0ZS5jcHAKKyAgICBzaGFkZXIvaXJfdmFyaWFibGVfcmVmY291bnQuY3BwCisgICAgc2hhZGVyL2xpbmtfYXRvbWljcy5jcHAKKyAgICBzaGFkZXIvbGlua2VyLmNwcAorICAgIHNoYWRlci9saW5rX2Z1bmN0aW9ucy5jcHAKKyAgICBzaGFkZXIvbGlua19pbnRlcmZhY2VfYmxvY2tzLmNwcAorICAgIHNoYWRlci9saW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlX3Zpc2l0b3IuY3BwCisgICAgc2hhZGVyL2xpbmtfdW5pZm9ybV9ibG9ja3MuY3BwCisgICAgc2hhZGVyL2xpbmtfdW5pZm9ybV9pbml0aWFsaXplcnMuY3BwCisgICAgc2hhZGVyL2xpbmtfdW5pZm9ybXMuY3BwCisgICAgc2hhZGVyL2xpbmtfdmFyeWluZ3MuY3BwCisgICAgc2hhZGVyL2xvb3BfYW5hbHlzaXMuY3BwCisgICAgc2hhZGVyL2xvb3BfY29udHJvbHMuY3BwCisgICAgc2hhZGVyL2xvb3BfdW5yb2xsLmNwcAorICAgIHNoYWRlci9sb3dlcl9jbGlwX2Rpc3RhbmNlLmNwcAorICAgIHNoYWRlci9sb3dlcl9kaXNjYXJkLmNwcAorICAgIHNoYWRlci9sb3dlcl9kaXNjYXJkX2Zsb3cuY3BwCisgICAgc2hhZGVyL2xvd2VyX2lmX3RvX2NvbmRfYXNzaWduLmNwcAorICAgIHNoYWRlci9sb3dlcl9pbnN0cnVjdGlvbnMuY3BwCisgICAgc2hhZGVyL2xvd2VyX2p1bXBzLmNwcAorICAgIHNoYWRlci9sb3dlcl9tYXRfb3BfdG9fdmVjLmNwcAorICAgIHNoYWRlci9sb3dlcl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzLmNwcAorICAgIHNoYWRlci9sb3dlcl9ub2lzZS5jcHAKKyAgICBzaGFkZXIvbG93ZXJfb2Zmc2V0X2FycmF5LmNwcAorICAgIHNoYWRlci9sb3dlcl9vdXRwdXRfcmVhZHMuY3BwCisgICAgc2hhZGVyL2xvd2VyX3BhY2tlZF92YXJ5aW5ncy5jcHAKKyAgICBzaGFkZXIvbG93ZXJfcGFja2luZ19idWlsdGlucy5jcHAKKyAgICBzaGFkZXIvbG93ZXJfdGV4dHVyZV9wcm9qZWN0aW9uLmNwcAorICAgIHNoYWRlci9sb3dlcl91Ym9fcmVmZXJlbmNlLmNwcAorICAgIHNoYWRlci9sb3dlcl92YXJpYWJsZV9pbmRleF90b19jb25kX2Fzc2lnbi5jcHAKKyAgICBzaGFkZXIvbG93ZXJfdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduLmNwcAorICAgIHNoYWRlci9sb3dlcl92ZWNfaW5kZXhfdG9fc3dpenpsZS5jcHAKKyAgICBzaGFkZXIvbG93ZXJfdmVjdG9yLmNwcAorICAgIHNoYWRlci9sb3dlcl92ZWN0b3JfaW5zZXJ0LmNwcAorICAgIHNoYWRlci9vcHRfYWxnZWJyYWljLmNwcAorICAgIHNoYWRlci9vcHRfYXJyYXlfc3BsaXR0aW5nLmNwcAorICAgIHNoYWRlci9vcHRfY29uc3RhbnRfZm9sZGluZy5jcHAKKyAgICBzaGFkZXIvb3B0X2NvbnN0YW50X3Byb3BhZ2F0aW9uLmNwcAorICAgIHNoYWRlci9vcHRfY29uc3RhbnRfdmFyaWFibGUuY3BwCisgICAgc2hhZGVyL29wdF9jb3B5X3Byb3BhZ2F0aW9uLmNwcAorICAgIHNoYWRlci9vcHRfY29weV9wcm9wYWdhdGlvbl9lbGVtZW50cy5jcHAKKyAgICBzaGFkZXIvb3B0X2NzZS5jcHAKKyAgICBzaGFkZXIvb3B0X2RlYWRfYnVpbHRpbl92YXJ5aW5ncy5jcHAKKyAgICBzaGFkZXIvb3B0X2RlYWRfY29kZS5jcHAKKyAgICBzaGFkZXIvb3B0X2RlYWRfY29kZV9sb2NhbC5jcHAKKyAgICBzaGFkZXIvb3B0X2RlYWRfZnVuY3Rpb25zLmNwcAorICAgIHNoYWRlci9vcHRfZmxhdHRlbl9uZXN0ZWRfaWZfYmxvY2tzLmNwcAorICAgIHNoYWRlci9vcHRfZmxpcF9tYXRyaWNlcy5jcHAKKyAgICBzaGFkZXIvb3B0X2Z1bmN0aW9uX2lubGluaW5nLmNwcAorICAgIHNoYWRlci9vcHRfaWZfc2ltcGxpZmljYXRpb24uY3BwCisgICAgc2hhZGVyL29wdF9ub29wX3N3aXp6bGUuY3BwCisgICAgc2hhZGVyL29wdF9yZWR1bmRhbnRfanVtcHMuY3BwCisgICAgc2hhZGVyL29wdF9zdHJ1Y3R1cmVfc3BsaXR0aW5nLmNwcAorICAgIHNoYWRlci9vcHRfc3dpenpsZV9zd2l6emxlLmNwcAorICAgIHNoYWRlci9vcHRfdHJlZV9ncmFmdGluZy5jcHAKKyAgICBzaGFkZXIvb3B0X3ZlY3Rvcml6ZS5jcHAKKyAgICBzaGFkZXIvc19leHByZXNzaW9uLmNwcAorIyAgICBzaGFkZXIvc2hhZGVyX2Rlc2VyaWFsaXplLmNwcAorIyAgICBzaGFkZXIvc2hhZGVyX3NlcmlhbGl6ZS5jcHAKKyMgICAgc2hhZGVyL3N0YW5kYWxvbmVfc2NhZmZvbGRpbmcuY3BwCisgICAgc2hhZGVyL3N0cnRvZC5jcHAKKworICAgIG1lc2EtdXRpbHMvc3JjL2dsc2wvcmFsbG9jLmMKKyAgICBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbS5jCisjICAgIG1lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2V4ZWN1dGUuYworICAgICMgbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfbm9pc2UuYworICAgIG1lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX3N0YXRldmFycy5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19vcHRfY29uc3RhbnRfZm9sZC5jCisgICAgbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3N5bWJvbF90YWJsZS5jCisjICAgIG1lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2NhY2hlLmMKKyAgICBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19vcHRpbWl6ZS5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vYXJicHJvZ3BhcnNlLmMKKyAgICBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19oYXNoX3RhYmxlLmMKKyAgICBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXIuYworICAgICMgbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfZGlza2NhY2hlLmMKKyAgICAjIG1lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnRhYi5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbW9wdC5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wcmludC5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZV9leHRyYS5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXJfbGF5b3V0LmMKKyAgICAgbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3JlZ2lzdGVyX2FsbG9jYXRlLmMKKyAgICAjIG1lc2EtdXRpbHMvc3JjL21lc2EvbWF0aC9tX21hdHJpeC5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZW51bXMuYworICAgICMgbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2ltcG9ydHMuYworICAgIG1lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9oYXNoLmMKKyAgICBtZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vaGFzaF90YWJsZS5jCisgICAgIyBtZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZXJyb3JzLmMKKyAgICAjIG1lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9mb3JtYXRzLmMKKworICAgIG1lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lcnJvcnMuYworICAgICMgbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2NvbnRleHQuYworICAgIG1lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lbnVtcy5jCisgICAgbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2ltcG9ydHMuYworICAgIG1lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmMKKyAgICBtZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vdW5pZm9ybXMuYworCisgICAgI21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9zaGFkZXJvYmouYworCisgICAgbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3NhbXBsZXIuY3BwCisKKyAgICBzaGFkZXIvZ2xzbF9nbGFzc19tYW5hZ2VyLmNwcAorICAgIHNoYWRlci9nbHNsX2dsYXNzX2JhY2tlbmRfdHJhbnNsYXRvci5jcHAKKyAgICBzaGFkZXIvZ2xzbF9nbGFzc19iYWNrZW5kLmNwcAorCisgICAgc2hhZGVyL2dsc2xfcGFyc2VyX2V4dHJhcy5jcHAKKyAgICBzaGFkZXIvc3RhbmRhbG9uZV9zY2FmZm9sZGluZy5jcHAKKyAgICBzaGFkZXIvZ2xzbF90eXBlcy5jcHAKKyAgICBzaGFkZXIvZ2xzbF9zeW1ib2xfdGFibGUuY3BwCisgICAgc2hhZGVyL2hpcl9maWVsZF9zZWxlY3Rpb24uY3BwCisKKykKKworCitTRVQoQ1JFQVRFX1BJUEVMSU5FX1NPVVJDRVMKKyAgICAjIEZpbGUgcmVxdWlyZWQgZm9yIGJhY2tlbmQgY29tcGlsZXIKKyAgICBwaXBlbGluZS9icndfYmxvcnBfYmxpdF9ldS5jcHAKKyAgICBwaXBlbGluZS9icndfc2hhZGVyLmNwcAorICAgIHBpcGVsaW5lL2Jyd19mcy5jcHAKKyAgICBwaXBlbGluZS9icndfZnNfdmlzaXRvci5jcHAKKyAgICBwaXBlbGluZS9icndfZnNfbGl2ZV92YXJpYWJsZXMuY3BwCisgICAgcGlwZWxpbmUvYnJ3X2NmZy5jcHAKKyAgICBwaXBlbGluZS9icndfZnNfY3NlLmNwcAorICAgIHBpcGVsaW5lL2Jyd19mc19jb3B5X3Byb3BhZ2F0aW9uLmNwcAorICAgIHBpcGVsaW5lL2Jyd19mc19wZWVwaG9sZV9wcmVkaWNhdGVkX2JyZWFrLmNwcAorICAgIHBpcGVsaW5lL2Jyd19mc19kZWFkX2NvZGVfZWxpbWluYXRlLmNwcAorICAgIHBpcGVsaW5lL2Jyd19mc19zZWxfcGVlcGhvbGUuY3BwCisgICAgcGlwZWxpbmUvYnJ3X2RlYWRfY29udHJvbF9mbG93LmNwcAorICAgIHBpcGVsaW5lL2Jyd19mc19zYXR1cmF0ZV9wcm9wYWdhdGlvbi5jcHAKKyAgICBwaXBlbGluZS9icndfZnNfcmVnaXN0ZXJfY29hbGVzY2UuY3BwCisgICAgcGlwZWxpbmUvYnJ3X3NjaGVkdWxlX2luc3RydWN0aW9ucy5jcHAKKyAgICBwaXBlbGluZS9icndfZnNfcmVnX2FsbG9jYXRlLmNwcAorICAgIHBpcGVsaW5lL2Jyd19mc19nZW5lcmF0b3IuY3BwCisgICAgcGlwZWxpbmUvYnJ3X2xvd2VyX3RleHR1cmVfZ3JhZGllbnRzLmNwcAorICAgIHBpcGVsaW5lL2Jyd19jdWJlbWFwX25vcm1hbGl6ZS5jcHAKKyAgICBwaXBlbGluZS9icndfbG93ZXJfdW5ub3JtYWxpemVkX29mZnNldC5jcHAKKyAgICBwaXBlbGluZS9icndfZnNfY2hhbm5lbF9leHByZXNzaW9ucy5jcHAKKyAgICBwaXBlbGluZS9icndfZnNfdmVjdG9yX3NwbGl0dGluZy5jcHAKKworICAgIHBpcGVsaW5lL2Jyd19kaXNhc20uYworICAgIHBpcGVsaW5lL2Jyd19kZXZpY2VfaW5mby5jCisgICAgcGlwZWxpbmUvYnJ3X2V1LmMKKyAgICBwaXBlbGluZS9icndfcHJvZ3JhbS5jCisgICAgcGlwZWxpbmUvYnJ3X3dtLmMKKyAgICBwaXBlbGluZS9icndfZXVfZW1pdC5jCisgICAgcGlwZWxpbmUvYnJ3X2V1X2NvbXBhY3QuYworICAgIHBpcGVsaW5lL2ludGVsX2RlYnVnLmMKKworICAgIHBpcGVsaW5lL2Jyd192cy5jCisgICAgcGlwZWxpbmUvYnJ3X3ZlYzQuY3BwCisgICAgcGlwZWxpbmUvYnJ3X3ZlYzRfdmlzaXRvci5jcHAKKyAgICBwaXBlbGluZS9icndfdmVjNF92c192aXNpdG9yLmNwcAorICAgIHBpcGVsaW5lL2Jyd192ZWM0X2xpdmVfdmFyaWFibGVzLmNwcAorICAgIHBpcGVsaW5lL2Jyd192ZWM0X2NvcHlfcHJvcGFnYXRpb24uY3BwCisgICAgcGlwZWxpbmUvYnJ3X3ZlYzRfcmVnX2FsbG9jYXRlLmNwcAorICAgIHBpcGVsaW5lL2Jyd192ZWM0X2dlbmVyYXRvci5jcHAKKworICAgIHBpcGVsaW5lL2Jyd192ZWM0X2dzLmMKKyAgICBwaXBlbGluZS9icndfdmVjNF9nc192aXNpdG9yLmNwcAorCisgICAgIyBwaXBlbGluZS9nZW44X3ZlYzRfZ2VuZXJhdG9yLmNwcAorICAgICkKKworc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKAorCXNoYWRlci9nbHNsX2dsYXNzX21hbmFnZXIuY3BwCisJc2hhZGVyL2dsc2xfZ2xhc3NfYmFja2VuZF90cmFuc2xhdG9yLmNwcAorCXNoYWRlci9nbHNsX2dsYXNzX2JhY2tlbmQuY3BwCisJc2hhZGVyL2dsc2xfcGFyc2VyX2V4dHJhcy5jcHAKKwlQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1Xbm8tdW5rbm93bi1wcmFnbWFzIC1Xbm8taWdub3JlZC1xdWFsaWZpZXJzIikKKworIyBuZWVkZWQgYnkgbGliZ2xzbGFuZy5hCithZGRfbGlicmFyeShpbnRlbGNvbXBpbGVyLW9zIFNUQVRJQyBzaGFkZXIvb3Nzb3VyY2UuY3BwKQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoaW50ZWxjb21waWxlci1vcyBQUklWQVRFICR7Q09NUElMRVJfSU5DTFVERV9ESVJTfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhpbnRlbGNvbXBpbGVyLW9zIFBST1BFUlRJRVMgUE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERSBPTikKKworYWRkX2xpYnJhcnkoaW50ZWxjb21waWxlciBTVEFUSUMKKyAgICAgICAgICAgIHNoYWRlci9jb21waWxlcl9pbnRlcmZhY2UuY3BwCisgICAgICAgICAgICBwaXBlbGluZS9waXBlbGluZV9jb21waWxlcl9pbnRlcmZhY2UuY3BwCisgICAgICAgICAgICBwaXBlbGluZS9waXBlbGluZV9jb21waWxlcl9pbnRlcmZhY2VfbWV0YS5jcHAKKyAgICAgICAgICAgICR7Q1JFQVRFX1NIQURFUl9TT1VSQ0VTfQorICAgICAgICAgICAgJHtDUkVBVEVfUElQRUxJTkVfU09VUkNFU30KKykKKwordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoaW50ZWxjb21waWxlcgorICAgIFBSSVZBVEUgJHtDT01QSUxFUl9JTkNMVURFX0RJUlN9CisgICAgUFVCTElDICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLikKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGludGVsY29tcGlsZXIKKyAgICBpY2QKKyAgICAke0NPTVBJTEVSX0xJTktfRElSU30KKyAgICAke0NPTVBJTEVSX0xJQlN9CisgICAgaW50ZWxjb21waWxlci1vcworICAgIG0KKyAgICBwdGhyZWFkCisgICAgZGwKKykKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGludGVsY29tcGlsZXIgUFJPUEVSVElFUyBQT1NJVElPTl9JTkRFUEVOREVOVF9DT0RFIE9OKQorCisjIFRoZSBmb2xsb3dpbmcgZ2VuZXJhdGVzIHN0YW5kYWxvbmVfY29tcGlsZXIgZXhlY3V0YWJsZQorCitTRVQoU1RBTkRBTE9ORV9DT01QSUxFUl9TT1VSQ0VTCisgICAgc2hhZGVyL21haW4uY3BwCisgICAgc2hhZGVyL3N0YW5kYWxvbmVfdXRpbHMuYworICAgIHNoYWRlci9jb21waWxlcl9pbnRlcmZhY2UuY3BwCisgICAgcGlwZWxpbmUvcGlwZWxpbmVfY29tcGlsZXJfaW50ZXJmYWNlLmNwcAorICAgICR7Q1JFQVRFX1NIQURFUl9TT1VSQ0VTfQorICAgICR7Q1JFQVRFX1BJUEVMSU5FX1NPVVJDRVN9CispCisKK2FkZF9leGVjdXRhYmxlKHN0YW5kYWxvbmVfY29tcGlsZXIKKyAgICR7U1RBTkRBTE9ORV9DT01QSUxFUl9TT1VSQ0VTfQorKQorCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhzdGFuZGFsb25lX2NvbXBpbGVyCisgICAgUFJJVkFURSAke0NPTVBJTEVSX0lOQ0xVREVfRElSU30KKyAgICBQVUJMSUMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uCispCisKKyMgVGhpcyBkZWZpbmUgaXMgdXNlZCB0byB0dXJuIG9mZiBkcml2ZXIgcG9ydGlvbnMgb2YgdGhlIGNvbXBpbGVyL3BpcGVsaW5lIGludGVyZmFjZQordGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMoc3RhbmRhbG9uZV9jb21waWxlciBQUklWQVRFICItRFNUQU5EQUxPTkVfU0hBREVSX0NPTVBJTEVSIikKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHN0YW5kYWxvbmVfY29tcGlsZXIKKyAgICBpY2QKKyAgICAke0NPTVBJTEVSX0xJTktfRElSU30KKyAgICAke0NPTVBJTEVSX0xJQlN9CisgICAgaW50ZWxjb21waWxlci1vcworICAgIG0KKyAgICBwdGhyZWFkCisgICAgZGwKKykKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9SRUFETUUubWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2Q5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzIgQEAKKyMgU2FtcGxlIEJJTCB0byBJbnRlbCBJU0EgQ29tcGlsZXIKKworVGhpcyBjb21waWxlciBzdGFjayB3YXMgYnJvdWdodCBvdmVyIGZyb20gdGhlIEdsYXNzeU1lc2EgZHJpdmVyIEx1bmFyRyBjcmVhdGVkIGZvciBWYWx2ZS4KK0l0IHVzZXMgdGhlIGZvbGxvd2luZyB0b29sczoKKy0gQklMIHN1cHBvcnQgYW5kIEx1bmFyR0xBU1MgbWlkZGxlIGVuZCBvcHRpbWl6ZXIgKHB1bGxlZCBpbiB2aWEgCitbdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuc2hdKC4uLy4uLy4uL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLnNoKSBzY3JpcHQpCisobWVzYS11dGlscy9zcmMvZ2xzbCkKKy0gW0dsYXNzeU1lc2EncyBHTFNMSVIgYW5kIHN1cHBvcnRpbmcgaW5mcmFzdHJ1Y3R1cmVdKHNoYWRlcikKKy0gW0dsYXNzeU1lc2EncyBEUkkgaTk2NSBiYWNrZW5kXShwaXBlbGluZSkKKworRm9yIHZrQ3JlYXRlU2hhZGVyLCB3ZSBwcmltYXJpbHkgdXNlZCB0aGUgZXhpc3Rpbmcgc3RhbmRhbG9uZSBkZXZpY2UgaW5kZXBlbmRlbnQgZnJvbnQgZW5kIHdoaWNoIGNhbiBjb25zdW1lIEdMU0wgb3IgQklMLCBhbmQgcmVzdWx0cyBpbiBhIHNlcGFyYXRlbHkgbGlua2VkIHNoYWRlciBvYmplY3QuCisKK0ZvciB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmUsIHdlIHB1bGxlZCBvdmVyIG9ubHkgdGhlIGZpbGVzIG5lZWRlZCB0byBsb3dlciB0aGUgc2hhZGVyIG9iamVjdCB0byBJU0EgYW5kIHN1cHBvcnRpbmcgbWV0YWRhdGEuICBNdWNoIG9mIHRoZSBpOTY1IERSSSBkcml2ZXIgd2FzIHJlbW92ZWQgb3IgY29tbWVudGVkIG91dCBmb3IgZnV0dXJlIHVzZSwgYW5kIGlzIHN0aWxsIGJlaW5nIGFjdGl2ZWx5IGJvb3RzdHJhcHBlZC4KKworQ3VycmVudGx5IG9ubHkgVmVydGV4IGFuZCBGcmFnbWVudCBzaGFkZXJzIGFyZSBzdXBwb3J0ZWQuICBBbnkgc2hhZGVyIHRoYXQgZml0cyB3aXRoaW4gdGhlIElPIHBhcmFtZXRlcnMgeW91IHNlZSB0ZXN0ZWQgaW4gY29tcGlsZXJfcmVuZGVyX3Rlc3RzLmNwcCBzaG91bGQgd29yay4gIEJ1ZmZlcnMgd2l0aCBiaW5kaW5ncywgc2FtcGxlcnMgd2l0aCBiaW5kaW5ncywgaW50ZXJzdGFnZSBJTyB3aXRoIGxvY2F0aW9ucywgYXJlIGFsbCB3b3JraW5nLiAgVmVydGV4IGlucHV0IGxvY2F0aW9ucyB3b3JrIGlmIHRoZXkgYXJlIHNlcXVlbnRpYWwgYW5kIHN0YXJ0IGZyb20gMC4gIEZyYWdtZW50IG91dHB1dCBsb2NhdGlvbnMgb25seSB3b3JrIGZvciBsb2NhdGlvbiAwLgorCitXZSByZWNvbW1lbmQgdXNpbmcgb25seSBidWZmZXJzIHdpdGggYmluZGluZ3MgZm9yIHVuaWZvcm1zLCBubyBnbG9iYWwsIG5vbi1ibG9jayB1bmlmb3Jtcy4KKworRGVzaWduIGRlY2lzaW9ucyB3ZSBtYWRlIHRvIGdldCB0aGlzIHN0YWNrIHdvcmtpbmcgd2l0aCBjdXJyZW50IHNwZWNpZmllZCBWSyBhbmQgQklMLiAgV2Uga25vdyB0aGVzZSBhcmUgYWN0aXZlIGFyZWFzIG9mIGRpc2N1c3Npb24sIGFuZCB3ZSdsbCB1cGRhdGUgd2hlbiBkZWNpc2lvbnMgYXJlIG1hZGU6CistIFNhbXBsZXJzOgorICAtIEdMU0wgc2FtcGxlciBiaW5kaW5ncyBlcXVhdGUgdG8gYSBzYW1wbGVyL3RleHR1cmUgcGFpciBvZiB0aGUgc2FtZSBudW1iZXIsIGFzIHNldCB1cCBieSB0aGUgVksgYXBwbGljYXRpb24uICBpLmUuIHRoZSBmb2xsb3dpbmcgc2FtcGxlcjoKK2BgYAorICAgIGxheW91dCAoYmluZGluZyA9IDIpIHVuaWZvcm0gc2FtcGxlcjJEIHN1cmZhY2U7CitgYGAKK3dpbGwgcmVhZCBmcm9tIFZLX1NMT1RfU0hBREVSX1NBTVBMRVIgZW50aXR5IDIgYW5kIFZLX1NMT1RfU0hBREVSX1JFU09VUkNFIGVudGl0eSAyLgorCistIEJ1ZmZlcnM6CisgIC0gR0xTTCBidWZmZXIgYmluZGluZ3MgZXF1YXRlIHRvIHRoZSBidWZmZXIgYm91bmQgYXQgdGhlIHNhbWUgc2xvdC4gaS5lLiB0aGUgZm9sbG93aW5nIHVuaWZvcm0gYnVmZmVyOgorYGBgCisgICAgbGF5b3V0IChzdGQxNDAsIGJpbmRpbmcgPSAyKSB1bmlmb3JtIGZvbyB7IHZlYzQgYmFyOyB9IG15QnVmZmVyOworYGBgCit3aWxsIGJlIHJlYWQgZnJvbSBWS19TSEFERVJfUkVTT1VSQ0UgZW50aXR5IDIuCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9pbmNsdWRlL2MxMS90aHJlYWRzLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9pbmNsdWRlL2MxMS90aHJlYWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4MjNkZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL2luY2x1ZGUvYzExL3RocmVhZHMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQzExIDx0aHJlYWRzLmg+IGVtdWxhdGlvbiBsaWJyYXJ5CisgKgorICogKEMpIENvcHlyaWdodCB5b2hob3kgMjAxMi4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmVkIGJ5CisgKiB0aGlzIGxpY2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwKKyAqIGV4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIFtbZGVyaXZhdGl2ZSB3b3JrXV1zIG9mIHRoZQorICogU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8KKyAqIGRvIHNvLCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgorICoKKyAqIFRoZSBjb3B5cmlnaHQgbm90aWNlcyBpbiB0aGUgU29mdHdhcmUgYW5kIHRoaXMgZW50aXJlIHN0YXRlbWVudCwgaW5jbHVkaW5nCisgKiB0aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kCisgKiBhbGwgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU29mdHdhcmUsIHVubGVzcyBzdWNoIGNvcGllcyBvciBkZXJpdmF0aXZlCisgKiB3b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUtZXhlY3V0YWJsZSBvYmplY3QgY29kZSBnZW5lcmF0ZWQgYnkKKyAqIGEgc291cmNlIGxhbmd1YWdlIHByb2Nlc3Nvci4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIEVNVUxBVEVEX1RIUkVBRFNfSF9JTkNMVURFRF8KKyNkZWZpbmUgRU1VTEFURURfVEhSRUFEU19IX0lOQ0xVREVEXworCisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZuZGVmIFRJTUVfVVRDCisjZGVmaW5lIFRJTUVfVVRDIDEKKyNlbmRpZgorCisjaW5jbHVkZSAiYzk5X2NvbXBhdC5oIiAvKiBmb3IgYGlubGluZWAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICgqdHNzX2R0b3JfdCkodm9pZCopOwordHlwZWRlZiBpbnQgKCp0aHJkX3N0YXJ0X3QpKHZvaWQqKTsKKworc3RydWN0IHh0aW1lIHsKKyAgICB0aW1lX3Qgc2VjOworICAgIGxvbmcgbnNlYzsKK307Cit0eXBlZGVmIHN0cnVjdCB4dGltZSB4dGltZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tIGVudW1lcmF0aW9uIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlbnVtIHsKKyAgICBtdHhfcGxhaW4gICAgID0gMCwKKyAgICBtdHhfdHJ5ICAgICAgID0gMSwKKyAgICBtdHhfdGltZWQgICAgID0gMiwKKyAgICBtdHhfcmVjdXJzaXZlID0gNAorfTsKKworZW51bSB7CisgICAgdGhyZF9zdWNjZXNzID0gMCwgLy8gc3VjY2VlZGVkCisgICAgdGhyZF90aW1lb3V0LCAgICAgLy8gdGltZW91dAorICAgIHRocmRfZXJyb3IsICAgICAgIC8vIGZhaWxlZAorICAgIHRocmRfYnVzeSwgICAgICAgIC8vIHJlc291cmNlIGJ1c3kKKyAgICB0aHJkX25vbWVtICAgICAgICAvLyBvdXQgb2YgbWVtb3J5Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyNpbmNsdWRlICJ0aHJlYWRzX3dpbjMyLmgiCisjZWxpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRCkKKyNpbmNsdWRlICJ0aHJlYWRzX3Bvc2l4LmgiCisjZWxzZQorI2Vycm9yIE5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4KKyNlbmRpZgorCisKKworI2VuZGlmIC8qIEVNVUxBVEVEX1RIUkVBRFNfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL2luY2x1ZGUvYzExL3RocmVhZHNfcG9zaXguaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL2luY2x1ZGUvYzExL3RocmVhZHNfcG9zaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWMxNjVkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvaW5jbHVkZS9jMTEvdGhyZWFkc19wb3NpeC5oCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQzExIDx0aHJlYWRzLmg+IGVtdWxhdGlvbiBsaWJyYXJ5CisgKgorICogKEMpIENvcHlyaWdodCB5b2hob3kgMjAxMi4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmVkIGJ5CisgKiB0aGlzIGxpY2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwKKyAqIGV4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIFtbZGVyaXZhdGl2ZSB3b3JrXV1zIG9mIHRoZQorICogU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8KKyAqIGRvIHNvLCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgorICoKKyAqIFRoZSBjb3B5cmlnaHQgbm90aWNlcyBpbiB0aGUgU29mdHdhcmUgYW5kIHRoaXMgZW50aXJlIHN0YXRlbWVudCwgaW5jbHVkaW5nCisgKiB0aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kCisgKiBhbGwgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU29mdHdhcmUsIHVubGVzcyBzdWNoIGNvcGllcyBvciBkZXJpdmF0aXZlCisgKiB3b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUtZXhlY3V0YWJsZSBvYmplY3QgY29kZSBnZW5lcmF0ZWQgYnkKKyAqIGEgc291cmNlIGxhbmd1YWdlIHByb2Nlc3Nvci4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZuZGVmIGFzc2VydAorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPiAvKiBmb3IgaW50cHRyX3QgKi8KKworLyoKK0NvbmZpZ3VyYXRpb24gbWFjcm86CisKKyAgRU1VTEFURURfVEhSRUFEU19VU0VfTkFUSVZFX1RJTUVETE9DSworICAgIFVzZSBwdGhyZWFkX211dGV4X3RpbWVkbG9jaygpIGZvciBgbXR4X3RpbWVkbG9jaygpJworICAgIE90aGVyd2lzZSB1c2UgbXR4X3RyeWxvY2soKSArICpidXN5IGxvb3AqIGVtdWxhdGlvbi4KKyovCisjaWYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQorI2RlZmluZSBFTVVMQVRFRF9USFJFQURTX1VTRV9OQVRJVkVfVElNRURMT0NLCisjZW5kaWYKKworCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBPTkNFX0ZMQUdfSU5JVCBQVEhSRUFEX09OQ0VfSU5JVAorI2lmZGVmIElOSVRfT05DRV9TVEFUSUNfSU5JVAorI2RlZmluZSBUU1NfRFRPUl9JVEVSQVRJT05TIFBUSFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TCisjZWxzZQorI2RlZmluZSBUU1NfRFRPUl9JVEVSQVRJT05TIDEgIC8vIGFzc3VtZSBUU1MgZHRvciBNQVkgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCisjZW5kaWYKKworLy8gRklYTUU6IHRlbXBvcmFyeSBub24tc3RhbmRhcmQgaGFjayB0byBlYXNlIHRyYW5zaXRpb24KKyNkZWZpbmUgX01UWF9JTklUSUFMSVpFUl9OUCBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgIGNuZF90OwordHlwZWRlZiBwdGhyZWFkX3QgICAgICAgdGhyZF90OwordHlwZWRlZiBwdGhyZWFkX2tleV90ICAgdHNzX3Q7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBtdHhfdDsKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgIG9uY2VfZmxhZzsKKworCisvKgorSW1wbGVtZW50YXRpb24gbGltaXRzOgorICAtIENvbmRpdGlvbmFsbHkgZW11bGF0aW9uIGZvciAibXV0ZXggd2l0aCB0aW1lb3V0IgorICAgIChzZWUgRU1VTEFURURfVEhSRUFEU19VU0VfTkFUSVZFX1RJTUVETE9DSyBtYWNybykKKyovCitzdHJ1Y3QgaW1wbF90aHJkX3BhcmFtIHsKKyAgICB0aHJkX3N0YXJ0X3QgZnVuYzsKKyAgICB2b2lkICphcmc7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgKgoraW1wbF90aHJkX3JvdXRpbmUodm9pZCAqcCkKK3sKKyAgICBzdHJ1Y3QgaW1wbF90aHJkX3BhcmFtIHBhY2sgPSAqKChzdHJ1Y3QgaW1wbF90aHJkX3BhcmFtICopcCk7CisgICAgZnJlZShwKTsKKyAgICByZXR1cm4gKHZvaWQqKShpbnRwdHJfdClwYWNrLmZ1bmMocGFjay5hcmcpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tIDcuMjUuMiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi8KKy8vIDcuMjUuMi4xCitzdGF0aWMgaW5saW5lIHZvaWQKK2NhbGxfb25jZShvbmNlX2ZsYWcgKmZsYWcsIHZvaWQgKCpmdW5jKSh2b2lkKSkKK3sKKyAgICBwdGhyZWFkX29uY2UoZmxhZywgZnVuYyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tIDcuMjUuMyBDb25kaXRpb24gdmFyaWFibGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0qLworLy8gNy4yNS4zLjEKK3N0YXRpYyBpbmxpbmUgaW50CitjbmRfYnJvYWRjYXN0KGNuZF90ICpjb25kKQoreworICAgIGlmICghY29uZCkgcmV0dXJuIHRocmRfZXJyb3I7CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdChjb25kKTsKKyAgICByZXR1cm4gdGhyZF9zdWNjZXNzOworfQorCisvLyA3LjI1LjMuMgorc3RhdGljIGlubGluZSB2b2lkCitjbmRfZGVzdHJveShjbmRfdCAqY29uZCkKK3sKKyAgICBhc3NlcnQoY29uZCk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koY29uZCk7Cit9CisKKy8vIDcuMjUuMy4zCitzdGF0aWMgaW5saW5lIGludAorY25kX2luaXQoY25kX3QgKmNvbmQpCit7CisgICAgaWYgKCFjb25kKSByZXR1cm4gdGhyZF9lcnJvcjsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdChjb25kLCBOVUxMKTsKKyAgICByZXR1cm4gdGhyZF9zdWNjZXNzOworfQorCisvLyA3LjI1LjMuNAorc3RhdGljIGlubGluZSBpbnQKK2NuZF9zaWduYWwoY25kX3QgKmNvbmQpCit7CisgICAgaWYgKCFjb25kKSByZXR1cm4gdGhyZF9lcnJvcjsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKGNvbmQpOworICAgIHJldHVybiB0aHJkX3N1Y2Nlc3M7Cit9CisKKy8vIDcuMjUuMy41CitzdGF0aWMgaW5saW5lIGludAorY25kX3RpbWVkd2FpdChjbmRfdCAqY29uZCwgbXR4X3QgKm10eCwgY29uc3QgeHRpbWUgKnh0KQoreworICAgIHN0cnVjdCB0aW1lc3BlYyBhYnNfdGltZTsKKyAgICBpbnQgcnQ7CisgICAgaWYgKCFjb25kIHx8ICFtdHggfHwgIXh0KSByZXR1cm4gdGhyZF9lcnJvcjsKKyAgICBydCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoY29uZCwgbXR4LCAmYWJzX3RpbWUpOworICAgIGlmIChydCA9PSBFVElNRURPVVQpCisgICAgICAgIHJldHVybiB0aHJkX2J1c3k7CisgICAgcmV0dXJuIChydCA9PSAwKSA/IHRocmRfc3VjY2VzcyA6IHRocmRfZXJyb3I7Cit9CisKKy8vIDcuMjUuMy42CitzdGF0aWMgaW5saW5lIGludAorY25kX3dhaXQoY25kX3QgKmNvbmQsIG10eF90ICptdHgpCit7CisgICAgaWYgKCFjb25kIHx8ICFtdHgpIHJldHVybiB0aHJkX2Vycm9yOworICAgIHB0aHJlYWRfY29uZF93YWl0KGNvbmQsIG10eCk7CisgICAgcmV0dXJuIHRocmRfc3VjY2VzczsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tIDcuMjUuNCBNdXRleCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gNy4yNS40LjEKK3N0YXRpYyBpbmxpbmUgdm9pZAorbXR4X2Rlc3Ryb3kobXR4X3QgKm10eCkKK3sKKyAgICBhc3NlcnQobXR4KTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3kobXR4KTsKK30KKworLy8gNy4yNS40LjIKK3N0YXRpYyBpbmxpbmUgaW50CittdHhfaW5pdChtdHhfdCAqbXR4LCBpbnQgdHlwZSkKK3sKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7CisgICAgaWYgKCFtdHgpIHJldHVybiB0aHJkX2Vycm9yOworICAgIGlmICh0eXBlICE9IG10eF9wbGFpbiAmJiB0eXBlICE9IG10eF90aW1lZCAmJiB0eXBlICE9IG10eF90cnkKKyAgICAgICYmIHR5cGUgIT0gKG10eF9wbGFpbnxtdHhfcmVjdXJzaXZlKQorICAgICAgJiYgdHlwZSAhPSAobXR4X3RpbWVkfG10eF9yZWN1cnNpdmUpCisgICAgICAmJiB0eXBlICE9IChtdHhfdHJ5fG10eF9yZWN1cnNpdmUpKQorICAgICAgICByZXR1cm4gdGhyZF9lcnJvcjsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKKyAgICBpZiAoKHR5cGUgJiBtdHhfcmVjdXJzaXZlKSAhPSAwKSB7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19saW51eCkKKyAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOworI2Vsc2UKKyAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworI2VuZGlmCisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfaW5pdChtdHgsICZhdHRyKTsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICByZXR1cm4gdGhyZF9zdWNjZXNzOworfQorCisvLyA3LjI1LjQuMworc3RhdGljIGlubGluZSBpbnQKK210eF9sb2NrKG10eF90ICptdHgpCit7CisgICAgaWYgKCFtdHgpIHJldHVybiB0aHJkX2Vycm9yOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdHgpOworICAgIHJldHVybiB0aHJkX3N1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittdHhfdHJ5bG9jayhtdHhfdCAqbXR4KTsKKworc3RhdGljIGlubGluZSB2b2lkCit0aHJkX3lpZWxkKHZvaWQpOworCisvLyA3LjI1LjQuNAorc3RhdGljIGlubGluZSBpbnQKK210eF90aW1lZGxvY2sobXR4X3QgKm10eCwgY29uc3QgeHRpbWUgKnh0KQoreworICAgIGlmICghbXR4IHx8ICF4dCkgcmV0dXJuIHRocmRfZXJyb3I7CisgICAgeworI2lmZGVmIEVNVUxBVEVEX1RIUkVBRFNfVVNFX05BVElWRV9USU1FRExPQ0sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgaW50IHJ0OworICAgIHRzLnR2X3NlYyA9IHh0LT5zZWM7CisgICAgdHMudHZfbnNlYyA9IHh0LT5uc2VjOworICAgIHJ0ID0gcHRocmVhZF9tdXRleF90aW1lZGxvY2sobXR4LCAmdHMpOworICAgIGlmIChydCA9PSAwKQorICAgICAgICByZXR1cm4gdGhyZF9zdWNjZXNzOworICAgIHJldHVybiAocnQgPT0gRVRJTUVET1VUKSA/IHRocmRfYnVzeSA6IHRocmRfZXJyb3I7CisjZWxzZQorICAgIHRpbWVfdCBleHBpcmUgPSB0aW1lKE5VTEwpOworICAgIGV4cGlyZSArPSB4dC0+c2VjOworICAgIHdoaWxlIChtdHhfdHJ5bG9jayhtdHgpICE9IHRocmRfc3VjY2VzcykgeworICAgICAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgICAgICAgaWYgKGV4cGlyZSA8IG5vdykKKyAgICAgICAgICAgIHJldHVybiB0aHJkX2J1c3k7CisgICAgICAgIC8vIGJ1c3kgbG9vcCEKKyAgICAgICAgdGhyZF95aWVsZCgpOworICAgIH0KKyAgICByZXR1cm4gdGhyZF9zdWNjZXNzOworI2VuZGlmCisgICAgfQorfQorCisvLyA3LjI1LjQuNQorc3RhdGljIGlubGluZSBpbnQKK210eF90cnlsb2NrKG10eF90ICptdHgpCit7CisgICAgaWYgKCFtdHgpIHJldHVybiB0aHJkX2Vycm9yOworICAgIHJldHVybiAocHRocmVhZF9tdXRleF90cnlsb2NrKG10eCkgPT0gMCkgPyB0aHJkX3N1Y2Nlc3MgOiB0aHJkX2J1c3k7Cit9CisKKy8vIDcuMjUuNC42CitzdGF0aWMgaW5saW5lIGludAorbXR4X3VubG9jayhtdHhfdCAqbXR4KQoreworICAgIGlmICghbXR4KSByZXR1cm4gdGhyZF9lcnJvcjsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jayhtdHgpOworICAgIHJldHVybiB0aHJkX3N1Y2Nlc3M7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tIDcuMjUuNSBUaHJlYWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gNy4yNS41LjEKK3N0YXRpYyBpbmxpbmUgaW50Cit0aHJkX2NyZWF0ZSh0aHJkX3QgKnRociwgdGhyZF9zdGFydF90IGZ1bmMsIHZvaWQgKmFyZykKK3sKKyAgICBzdHJ1Y3QgaW1wbF90aHJkX3BhcmFtICpwYWNrOworICAgIGlmICghdGhyKSByZXR1cm4gdGhyZF9lcnJvcjsKKyAgICBwYWNrID0gKHN0cnVjdCBpbXBsX3RocmRfcGFyYW0gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbXBsX3RocmRfcGFyYW0pKTsKKyAgICBpZiAoIXBhY2spIHJldHVybiB0aHJkX25vbWVtOworICAgIHBhY2stPmZ1bmMgPSBmdW5jOworICAgIHBhY2stPmFyZyA9IGFyZzsKKyAgICBpZiAocHRocmVhZF9jcmVhdGUodGhyLCBOVUxMLCBpbXBsX3RocmRfcm91dGluZSwgcGFjaykgIT0gMCkgeworICAgICAgICBmcmVlKHBhY2spOworICAgICAgICByZXR1cm4gdGhyZF9lcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIHRocmRfc3VjY2VzczsKK30KKworLy8gNy4yNS41LjIKK3N0YXRpYyBpbmxpbmUgdGhyZF90Cit0aHJkX2N1cnJlbnQodm9pZCkKK3sKKyAgICByZXR1cm4gcHRocmVhZF9zZWxmKCk7Cit9CisKKy8vIDcuMjUuNS4zCitzdGF0aWMgaW5saW5lIGludAordGhyZF9kZXRhY2godGhyZF90IHRocikKK3sKKyAgICByZXR1cm4gKHB0aHJlYWRfZGV0YWNoKHRocikgPT0gMCkgPyB0aHJkX3N1Y2Nlc3MgOiB0aHJkX2Vycm9yOworfQorCisvLyA3LjI1LjUuNAorc3RhdGljIGlubGluZSBpbnQKK3RocmRfZXF1YWwodGhyZF90IHRocjAsIHRocmRfdCB0aHIxKQoreworICAgIHJldHVybiBwdGhyZWFkX2VxdWFsKHRocjAsIHRocjEpOworfQorCisvLyA3LjI1LjUuNQorc3RhdGljIGlubGluZSB2b2lkCit0aHJkX2V4aXQoaW50IHJlcykKK3sKKyAgICBwdGhyZWFkX2V4aXQoKHZvaWQqKShpbnRwdHJfdClyZXMpOworfQorCisvLyA3LjI1LjUuNgorc3RhdGljIGlubGluZSBpbnQKK3RocmRfam9pbih0aHJkX3QgdGhyLCBpbnQgKnJlcykKK3sKKyAgICB2b2lkICpjb2RlOworICAgIGlmIChwdGhyZWFkX2pvaW4odGhyLCAmY29kZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIHRocmRfZXJyb3I7CisgICAgaWYgKHJlcykKKyAgICAgICAgKnJlcyA9IChpbnQpKGludHB0cl90KWNvZGU7CisgICAgcmV0dXJuIHRocmRfc3VjY2VzczsKK30KKworLy8gNy4yNS41LjcKK3N0YXRpYyBpbmxpbmUgdm9pZAordGhyZF9zbGVlcChjb25zdCB4dGltZSAqeHQpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHJlcTsKKyAgICBhc3NlcnQoeHQpOworICAgIHJlcS50dl9zZWMgPSB4dC0+c2VjOworICAgIHJlcS50dl9uc2VjID0geHQtPm5zZWM7CisgICAgbmFub3NsZWVwKCZyZXEsIE5VTEwpOworfQorCisvLyA3LjI1LjUuOAorc3RhdGljIGlubGluZSB2b2lkCit0aHJkX3lpZWxkKHZvaWQpCit7CisgICAgc2NoZWRfeWllbGQoKTsKK30KKworCisvKi0tLS0tLS0tLS0tIDcuMjUuNiBUaHJlYWQtc3BlY2lmaWMgc3RvcmFnZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0qLworLy8gNy4yNS42LjEKK3N0YXRpYyBpbmxpbmUgaW50Cit0c3NfY3JlYXRlKHRzc190ICprZXksIHRzc19kdG9yX3QgZHRvcikKK3sKKyAgICBpZiAoIWtleSkgcmV0dXJuIHRocmRfZXJyb3I7CisgICAgcmV0dXJuIChwdGhyZWFkX2tleV9jcmVhdGUoa2V5LCBkdG9yKSA9PSAwKSA/IHRocmRfc3VjY2VzcyA6IHRocmRfZXJyb3I7Cit9CisKKy8vIDcuMjUuNi4yCitzdGF0aWMgaW5saW5lIHZvaWQKK3Rzc19kZWxldGUodHNzX3Qga2V5KQoreworICAgIHB0aHJlYWRfa2V5X2RlbGV0ZShrZXkpOworfQorCisvLyA3LjI1LjYuMworc3RhdGljIGlubGluZSB2b2lkICoKK3Rzc19nZXQodHNzX3Qga2V5KQoreworICAgIHJldHVybiBwdGhyZWFkX2dldHNwZWNpZmljKGtleSk7Cit9CisKKy8vIDcuMjUuNi40CitzdGF0aWMgaW5saW5lIGludAordHNzX3NldCh0c3NfdCBrZXksIHZvaWQgKnZhbCkKK3sKKyAgICByZXR1cm4gKHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCB2YWwpID09IDApID8gdGhyZF9zdWNjZXNzIDogdGhyZF9lcnJvcjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tIDcuMjUuNyBUaW1lIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyA3LjI1LjYuMQorc3RhdGljIGlubGluZSBpbnQKK3h0aW1lX2dldCh4dGltZSAqeHQsIGludCBiYXNlKQoreworICAgIGlmICgheHQpIHJldHVybiAwOworICAgIGlmIChiYXNlID09IFRJTUVfVVRDKSB7CisgICAgICAgIHh0LT5zZWMgPSB0aW1lKE5VTEwpOworICAgICAgICB4dC0+bnNlYyA9IDA7CisgICAgICAgIHJldHVybiBiYXNlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL2luY2x1ZGUvYzk5X2NvbXBhdC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvaW5jbHVkZS9jOTlfY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5YzYwMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL2luY2x1ZGUvYzk5X2NvbXBhdC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEzIFZNd2FyZSwgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBWTVdBUkUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DOTlfQ09NUEFUX0hfCisjZGVmaW5lIF9DOTlfQ09NUEFUX0hfCisKKworLyoKKyAqIE1TVkMgaGFja3MuCisgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgLyoKKyAgICAqIFZpc3VhbCBTdHVkaW8gMjAxMiB3aWxsIGNvbXBsYWluIGlmIHdlIGRlZmluZSB0aGUgYGlubGluZWAga2V5d29yZCwgYnV0CisgICAgKiBhY3R1YWxseSBpdCBvbmx5IHN1cHBvcnRzIHRoZSBrZXl3b3JkIG9uIEMrKy4KKyAgICAqCisgICAgKiBUbyBhdm9pZCB0aGlzIHRoZSBfQUxMT1dfS0VZV09SRF9NQUNST1MgbXVzdCBiZSBzZXQuCisgICAgKi8KKyMgIGlmIChfTVNDX1ZFUiA+PSAxNzAwKSAmJiAhZGVmaW5lZChfQUxMT1dfS0VZV09SRF9NQUNST1MpCisjICAgIGRlZmluZSBfQUxMT1dfS0VZV09SRF9NQUNST1MKKyMgIGVuZGlmCisKKyAgIC8qCisgICAgKiBYWFg6IE1TVkMgaGFzIGEgYF9fcmVzdHJpY3RgIGtleXdvcmQsIGJ1dCBpdCBhbHNvIGhhcyBhCisgICAgKiBgX19kZWNsc3BlYyhyZXN0cmljdClgIG1vZGlmaWVyLCBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRlZmluZSBhCisgICAgKiBgcmVzdHJpY3RgIG1hY3JvIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCB0aGUgbGF0dGVyLiAgRnVydGhlcm1vcmUgdGhlCisgICAgKiBNU1ZDIHN0YW5kYXJkIGxpYnJhcnkgdXNlcyBfX2RlY2xzcGVjKHJlc3RyaWN0KSB1bmRlciB0aGUgX0NSVFJFU1RSSUNUCisgICAgKiBtYWNyby4gIEZvciBub3cgcmVzb2x2ZSB0aGlzIGlzc3VlIGJ5IHJlZGVmaW5pbmcgX0NSVFJFU1RSSUNULCBidXQgZ29pbmcKKyAgICAqIGZvcndhcmQgd2Ugc2hvdWxkIHByb2JhYmx5IHNob3VsZCBzdG9wIHVzaW5nIHJlc3RyaWN0LCBlc3BlY2lhbGx5CisgICAgKiBjb25zaWRlcmluZyB0aGF0IG91ciBjb2RlIGRvZXMgbm90IG9iYmV5IHN0cmljdCBhbGlhc2luZyBydWxlcyBhbnkgd2F5LgorICAgICovCisjICBpbmNsdWRlIDxjcnRkZWZzLmg+CisjICB1bmRlZiBfQ1JUUkVTVFJJQ1QKKyMgIGRlZmluZSBfQ1JUUkVTVFJJQ1QKKyNlbmRpZgorCisKKy8qCisgKiBDOTkgaW5saW5lIGtleXdvcmQKKyAqLworI2lmbmRlZiBpbmxpbmUKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgIC8qIEMrKyBzdXBwb3J0cyBpbmxpbmUga2V5d29yZCAqLworIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgICBkZWZpbmUgaW5saW5lIF9faW5saW5lX18KKyMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgICAgZGVmaW5lIGlubGluZSBfX2lubGluZQorIyAgZWxpZiBkZWZpbmVkKF9fSUNMKQorIyAgICBkZWZpbmUgaW5saW5lIF9faW5saW5lCisjICBlbGlmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyAgICAgLyogSW50ZWwgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lIGtleXdvcmQgKi8KKyMgIGVsaWYgZGVmaW5lZChfX1dBVENPTUNfXykgJiYgKF9fV0FUQ09NQ19fID49IDExMDApCisjICAgIGRlZmluZSBpbmxpbmUgX19pbmxpbmUKKyMgIGVsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiBkZWZpbmVkKF9fQzk5RkVBVFVSRVNfXykKKyAgICAgLyogQzk5IHN1cHBvcnRzIGlubGluZSBrZXl3b3JkICovCisjICBlbGlmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisgICAgIC8qIEM5OSBzdXBwb3J0cyBpbmxpbmUga2V5d29yZCAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgaW5saW5lCisjICBlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIEM5OSByZXN0cmljdCBrZXl3b3JkCisgKgorICogU2VlIGFsc286CisgKiAtIGh0dHA6Ly9jZWxscGVyZm9ybWFuY2UuYmV5b25kM2QuY29tL2FydGljbGVzLzIwMDYvMDUvZGVteXN0aWZ5aW5nLXRoZS1yZXN0cmljdC1rZXl3b3JkLmh0bWwKKyAqLworI2lmbmRlZiByZXN0cmljdAorIyAgaWYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyAgICAgLyogQzk5ICovCisjICBlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgZGVmaW5lZChfX0M5OUZFQVRVUkVTX18pCisgICAgIC8qIEM5OSAqLworIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgICBkZWZpbmUgcmVzdHJpY3QgX19yZXN0cmljdF9fCisjICBlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjICAgIGRlZmluZSByZXN0cmljdCBfX3Jlc3RyaWN0CisjICBlbHNlCisjICAgIGRlZmluZSByZXN0cmljdCAvKiAqLworIyAgZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBDOTkgX19mdW5jX18gbWFjcm8KKyAqLworI2lmbmRlZiBfX2Z1bmNfXworIyAgaWYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyAgICAgLyogQzk5ICovCisjICBlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgZGVmaW5lZChfX0M5OUZFQVRVUkVTX18pCisgICAgIC8qIEM5OSAqLworIyAgZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgICBpZiBfX0dOVUNfXyA+PSAyCisjICAgICAgZGVmaW5lIF9fZnVuY19fIF9fRlVOQ1RJT05fXworIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9fZnVuY19fICI8dW5rbm93bj4iCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjICAgIGlmIF9NU0NfVkVSID49IDEzMDAKKyMgICAgICBkZWZpbmUgX19mdW5jX18gX19GVU5DVElPTl9fCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgX19mdW5jX18gIjx1bmtub3duPiIKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fZnVuY19fICI8dW5rbm93bj4iCisjICBlbmRpZgorI2VuZGlmCisKKworLyogU2ltcGxlIHRlc3QgY2FzZSBmb3IgZGVidWdnaW5nICovCisjaWYgMAorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK3Rlc3RfYzk5X2NvbXBhdF9oKGNvbnN0IHZvaWQgKiByZXN0cmljdCBhLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IGIpCit7CisgICByZXR1cm4gX19mdW5jX187Cit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX0M5OV9DT01QQVRfSF8gKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL2luY2x1ZGUvcGNpX2lkcy9pOTY1X3BjaV9pZHMuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL2luY2x1ZGUvcGNpX2lkcy9pOTY1X3BjaV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA0MzAxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvaW5jbHVkZS9wY2lfaWRzL2k5NjVfcGNpX2lkcy5oCkBAIC0wLDAgKzEsMTE1IEBACitDSElQU0VUKDB4MjlBMiwgaTk2NSwgICAgIkludGVsKFIpIDk2NUciKQorQ0hJUFNFVCgweDI5OTIsIGk5NjUsICAgICJJbnRlbChSKSA5NjVRIikKK0NISVBTRVQoMHgyOTgyLCBpOTY1LCAgICAiSW50ZWwoUikgOTY1RyIpCitDSElQU0VUKDB4Mjk3MiwgaTk2NSwgICAgIkludGVsKFIpIDk0NkdaIikKK0NISVBTRVQoMHgyQTAyLCBpOTY1LCAgICAiSW50ZWwoUikgOTY1R00iKQorQ0hJUFNFVCgweDJBMTIsIGk5NjUsICAgICJJbnRlbChSKSA5NjVHTUUvR0xFIikKK0NISVBTRVQoMHgyQTQyLCBnNHgsICAgICAiTW9iaWxlIEludGVswq4gR000NSBFeHByZXNzIENoaXBzZXQiKQorQ0hJUFNFVCgweDJFMDIsIGc0eCwgICAgICJJbnRlbChSKSBJbnRlZ3JhdGVkIEdyYXBoaWNzIERldmljZSIpCitDSElQU0VUKDB4MkUxMiwgZzR4LCAgICAgIkludGVsKFIpIFE0NS9RNDMiKQorQ0hJUFNFVCgweDJFMjIsIGc0eCwgICAgICJJbnRlbChSKSBHNDUvRzQzIikKK0NISVBTRVQoMHgyRTMyLCBnNHgsICAgICAiSW50ZWwoUikgRzQxIikKK0NISVBTRVQoMHgyRTQyLCBnNHgsICAgICAiSW50ZWwoUikgQjQzIikKK0NISVBTRVQoMHgyRTkyLCBnNHgsICAgICAiSW50ZWwoUikgQjQzIikKK0NISVBTRVQoMHgwMDQyLCBpbGssICAgICAiSW50ZWwoUikgSXJvbmxha2UgRGVza3RvcCIpCitDSElQU0VUKDB4MDA0NiwgaWxrLCAgICAgIkludGVsKFIpIElyb25sYWtlIE1vYmlsZSIpCitDSElQU0VUKDB4MDEwMiwgc25iX2d0MSwgIkludGVsKFIpIFNhbmR5YnJpZGdlIERlc2t0b3AiKQorQ0hJUFNFVCgweDAxMTIsIHNuYl9ndDIsICJJbnRlbChSKSBTYW5keWJyaWRnZSBEZXNrdG9wIikKK0NISVBTRVQoMHgwMTIyLCBzbmJfZ3QyLCAiSW50ZWwoUikgU2FuZHlicmlkZ2UgRGVza3RvcCIpCitDSElQU0VUKDB4MDEwNiwgc25iX2d0MSwgIkludGVsKFIpIFNhbmR5YnJpZGdlIE1vYmlsZSIpCitDSElQU0VUKDB4MDExNiwgc25iX2d0MiwgIkludGVsKFIpIFNhbmR5YnJpZGdlIE1vYmlsZSIpCitDSElQU0VUKDB4MDEyNiwgc25iX2d0MiwgIkludGVsKFIpIFNhbmR5YnJpZGdlIE1vYmlsZSIpCitDSElQU0VUKDB4MDEwQSwgc25iX2d0MSwgIkludGVsKFIpIFNhbmR5YnJpZGdlIFNlcnZlciIpCitDSElQU0VUKDB4MDE1MiwgaXZiX2d0MSwgIkludGVsKFIpIEl2eWJyaWRnZSBEZXNrdG9wIikKK0NISVBTRVQoMHgwMTYyLCBpdmJfZ3QyLCAiSW50ZWwoUikgSXZ5YnJpZGdlIERlc2t0b3AiKQorQ0hJUFNFVCgweDAxNTYsIGl2Yl9ndDEsICJJbnRlbChSKSBJdnlicmlkZ2UgTW9iaWxlIikKK0NISVBTRVQoMHgwMTY2LCBpdmJfZ3QyLCAiSW50ZWwoUikgSXZ5YnJpZGdlIE1vYmlsZSIpCitDSElQU0VUKDB4MDE1YSwgaXZiX2d0MSwgIkludGVsKFIpIEl2eWJyaWRnZSBTZXJ2ZXIiKQorQ0hJUFNFVCgweDAxNmEsIGl2Yl9ndDIsICJJbnRlbChSKSBJdnlicmlkZ2UgU2VydmVyIikKK0NISVBTRVQoMHgwNDAyLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwNDEyLCBoc3dfZ3QyLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwNDIyLCBoc3dfZ3QzLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwNDA2LCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBNb2JpbGUiKQorQ0hJUFNFVCgweDA0MTYsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIE1vYmlsZSIpCitDSElQU0VUKDB4MDQyNiwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwgTW9iaWxlIikKK0NISVBTRVQoMHgwNDBBLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBTZXJ2ZXIiKQorQ0hJUFNFVCgweDA0MUEsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIFNlcnZlciIpCitDSElQU0VUKDB4MDQyQSwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwgU2VydmVyIikKK0NISVBTRVQoMHgwNDBCLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MDQxQiwgaHN3X2d0MiwgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDA0MkIsIGhzd19ndDMsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwNDBFLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MDQxRSwgaHN3X2d0MiwgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDA0MkUsIGhzd19ndDMsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwQzAyLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwQzEyLCBoc3dfZ3QyLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwQzIyLCBoc3dfZ3QzLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwQzA2LCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBNb2JpbGUiKQorQ0hJUFNFVCgweDBDMTYsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIE1vYmlsZSIpCitDSElQU0VUKDB4MEMyNiwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwgTW9iaWxlIikKK0NISVBTRVQoMHgwQzBBLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBTZXJ2ZXIiKQorQ0hJUFNFVCgweDBDMUEsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIFNlcnZlciIpCitDSElQU0VUKDB4MEMyQSwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwgU2VydmVyIikKK0NISVBTRVQoMHgwQzBCLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MEMxQiwgaHN3X2d0MiwgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDBDMkIsIGhzd19ndDMsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwQzBFLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MEMxRSwgaHN3X2d0MiwgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDBDMkUsIGhzd19ndDMsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwQTAyLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwQTEyLCBoc3dfZ3QyLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwQTIyLCBoc3dfZ3QzLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwQTA2LCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBNb2JpbGUiKQorQ0hJUFNFVCgweDBBMTYsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIE1vYmlsZSIpCitDSElQU0VUKDB4MEEyNiwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwgTW9iaWxlIikKK0NISVBTRVQoMHgwQTBBLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBTZXJ2ZXIiKQorQ0hJUFNFVCgweDBBMUEsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIFNlcnZlciIpCitDSElQU0VUKDB4MEEyQSwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwgU2VydmVyIikKK0NISVBTRVQoMHgwQTBCLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MEExQiwgaHN3X2d0MiwgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDBBMkIsIGhzd19ndDMsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwQTBFLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MEExRSwgaHN3X2d0MiwgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDBBMkUsIGhzd19ndDMsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwRDAyLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwRDEyLCBoc3dfZ3QyLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwRDIyLCBoc3dfZ3QzLCAiSW50ZWwoUikgSGFzd2VsbCBEZXNrdG9wIikKK0NISVBTRVQoMHgwRDA2LCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBNb2JpbGUiKQorQ0hJUFNFVCgweDBEMTYsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIE1vYmlsZSIpCitDSElQU0VUKDB4MEQyNiwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwgTW9iaWxlIikKK0NISVBTRVQoMHgwRDBBLCBoc3dfZ3QxLCAiSW50ZWwoUikgSGFzd2VsbCBTZXJ2ZXIiKQorQ0hJUFNFVCgweDBEMUEsIGhzd19ndDIsICJJbnRlbChSKSBIYXN3ZWxsIFNlcnZlciIpCitDSElQU0VUKDB4MEQyQSwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDBEMEIsIGhzd19ndDEsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwRDFCLCBoc3dfZ3QyLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MEQyQiwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDBEMEUsIGhzd19ndDEsICJJbnRlbChSKSBIYXN3ZWxsIikKK0NISVBTRVQoMHgwRDFFLCBoc3dfZ3QyLCAiSW50ZWwoUikgSGFzd2VsbCIpCitDSElQU0VUKDB4MEQyRSwgaHN3X2d0MywgIkludGVsKFIpIEhhc3dlbGwiKQorQ0hJUFNFVCgweDBGMzEsIGJ5dCwgICAgICJJbnRlbChSKSBCYXkgVHJhaWwiKQorQ0hJUFNFVCgweDBGMzIsIGJ5dCwgICAgICJJbnRlbChSKSBCYXkgVHJhaWwiKQorQ0hJUFNFVCgweDBGMzMsIGJ5dCwgICAgICJJbnRlbChSKSBCYXkgVHJhaWwiKQorQ0hJUFNFVCgweDAxNTcsIGJ5dCwgICAgICJJbnRlbChSKSBCYXkgVHJhaWwiKQorQ0hJUFNFVCgweDAxNTUsIGJ5dCwgICAgICJJbnRlbChSKSBCYXkgVHJhaWwiKQorQ0hJUFNFVCgweDE2MDIsIGJkd19ndDEsICJJbnRlbChSKSBCcm9hZHdlbGwgR1QxIikKK0NISVBTRVQoMHgxNjA2LCBiZHdfZ3QxLCAiSW50ZWwoUikgQnJvYWR3ZWxsIEdUMSIpCitDSElQU0VUKDB4MTYwQSwgYmR3X2d0MSwgIkludGVsKFIpIEJyb2Fkd2VsbCBHVDEiKQorQ0hJUFNFVCgweDE2MEIsIGJkd19ndDEsICJJbnRlbChSKSBCcm9hZHdlbGwgR1QxIikKK0NISVBTRVQoMHgxNjBELCBiZHdfZ3QxLCAiSW50ZWwoUikgQnJvYWR3ZWxsIEdUMSIpCitDSElQU0VUKDB4MTYwRSwgYmR3X2d0MSwgIkludGVsKFIpIEJyb2Fkd2VsbCBHVDEiKQorQ0hJUFNFVCgweDE2MTIsIGJkd19ndDIsICJJbnRlbChSKSBIRCBHcmFwaGljcyA1NjAwIChCcm9hZHdlbGwgR1QyKSIpCitDSElQU0VUKDB4MTYxNiwgYmR3X2d0MiwgIkludGVsKFIpIEhEIEdyYXBoaWNzIDU1MDAgKEJyb2Fkd2VsbCBHVDIpIikKK0NISVBTRVQoMHgxNjFBLCBiZHdfZ3QyLCAiSW50ZWwoUikgQnJvYWR3ZWxsIEdUMiIpCitDSElQU0VUKDB4MTYxQiwgYmR3X2d0MiwgIkludGVsKFIpIEJyb2Fkd2VsbCBHVDIiKQorQ0hJUFNFVCgweDE2MUQsIGJkd19ndDIsICJJbnRlbChSKSBCcm9hZHdlbGwgR1QyIikKK0NISVBTRVQoMHgxNjFFLCBiZHdfZ3QyLCAiSW50ZWwoUikgSEQgR3JhcGhpY3MgNTMwMCAoQnJvYWR3ZWxsIEdUMikiKQorQ0hJUFNFVCgweDE2MjIsIGJkd19ndDMsICJJbnRlbChSKSBJcmlzIFBybyA2MjAwIChCcm9hZHdlbGwgR1QzZSkiKQorQ0hJUFNFVCgweDE2MjYsIGJkd19ndDMsICJJbnRlbChSKSBIRCBHcmFwaGljcyA2MDAwIChCcm9hZHdlbGwgR1QzKSIpCitDSElQU0VUKDB4MTYyQSwgYmR3X2d0MywgIkludGVsKFIpIElyaXMgUHJvIFA2MzAwIChCcm9hZHdlbGwgR1QzZSkiKQorQ0hJUFNFVCgweDE2MkIsIGJkd19ndDMsICJJbnRlbChSKSBJcmlzIDYxMDAgKEJyb2Fkd2VsbCBHVDMpIikKK0NISVBTRVQoMHgxNjJELCBiZHdfZ3QzLCAiSW50ZWwoUikgQnJvYWR3ZWxsIEdUMyIpCitDSElQU0VUKDB4MTYyRSwgYmR3X2d0MywgIkludGVsKFIpIEJyb2Fkd2VsbCBHVDMiKQorQ0hJUFNFVCgweDIyQjAsIGNodiwgICAgICJJbnRlbChSKSBDaGVycnl2aWV3IikKK0NISVBTRVQoMHgyMkIxLCBjaHYsICAgICAiSW50ZWwoUikgQ2hlcnJ5dmlldyIpCitDSElQU0VUKDB4MjJCMiwgY2h2LCAgICAgIkludGVsKFIpIENoZXJyeXZpZXciKQorQ0hJUFNFVCgweDIyQjMsIGNodiwgICAgICJJbnRlbChSKSBDaGVycnl2aWV3IikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2J1aWx0aW5fdHlwZV9tYWNyb3MuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2J1aWx0aW5fdHlwZV9tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZlMWNlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvYnVpbHRpbl90eXBlX21hY3Jvcy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBidWlsdGluX3R5cGVfbWFjcm9zLmgKKyAqCisgKiBUaGlzIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBhbGwgR0xTTCBidWlsdC1pbiB0eXBlcywgcmVnYXJkbGVzcyBvZiB3aGF0CisgKiBsYW5ndWFnZSB2ZXJzaW9uIG9yIGV4dGVuc2lvbiBtaWdodCBwcm92aWRlIHRoZW0uCisgKi8KKworI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworREVDTF9UWVBFKGVycm9yLCAgR0xfSU5WQUxJRF9FTlVNLCBHTFNMX1RZUEVfRVJST1IsIDAsIDApCitERUNMX1RZUEUodm9pZCwgICBHTF9JTlZBTElEX0VOVU0sIEdMU0xfVFlQRV9WT0lELCAgMCwgMCkKKworREVDTF9UWVBFKGJvb2wsICAgR0xfQk9PTCwgICAgICAgICBHTFNMX1RZUEVfQk9PTCwgIDEsIDEpCitERUNMX1RZUEUoYnZlYzIsICBHTF9CT09MX1ZFQzIsICAgIEdMU0xfVFlQRV9CT09MLCAgMiwgMSkKK0RFQ0xfVFlQRShidmVjMywgIEdMX0JPT0xfVkVDMywgICAgR0xTTF9UWVBFX0JPT0wsICAzLCAxKQorREVDTF9UWVBFKGJ2ZWM0LCAgR0xfQk9PTF9WRUM0LCAgICBHTFNMX1RZUEVfQk9PTCwgIDQsIDEpCisKK0RFQ0xfVFlQRShpbnQsICAgIEdMX0lOVCwgICAgICAgICAgR0xTTF9UWVBFX0lOVCwgICAxLCAxKQorREVDTF9UWVBFKGl2ZWMyLCAgR0xfSU5UX1ZFQzIsICAgICBHTFNMX1RZUEVfSU5ULCAgIDIsIDEpCitERUNMX1RZUEUoaXZlYzMsICBHTF9JTlRfVkVDMywgICAgIEdMU0xfVFlQRV9JTlQsICAgMywgMSkKK0RFQ0xfVFlQRShpdmVjNCwgIEdMX0lOVF9WRUM0LCAgICAgR0xTTF9UWVBFX0lOVCwgICA0LCAxKQorCitERUNMX1RZUEUodWludCwgICBHTF9VTlNJR05FRF9JTlQsICAgICAgR0xTTF9UWVBFX1VJTlQsIDEsIDEpCitERUNMX1RZUEUodXZlYzIsICBHTF9VTlNJR05FRF9JTlRfVkVDMiwgR0xTTF9UWVBFX1VJTlQsIDIsIDEpCitERUNMX1RZUEUodXZlYzMsICBHTF9VTlNJR05FRF9JTlRfVkVDMywgR0xTTF9UWVBFX1VJTlQsIDMsIDEpCitERUNMX1RZUEUodXZlYzQsICBHTF9VTlNJR05FRF9JTlRfVkVDNCwgR0xTTF9UWVBFX1VJTlQsIDQsIDEpCisKK0RFQ0xfVFlQRShmbG9hdCwgIEdMX0ZMT0FULCAgICAgICAgR0xTTF9UWVBFX0ZMT0FULCAxLCAxKQorREVDTF9UWVBFKHZlYzIsICAgR0xfRkxPQVRfVkVDMiwgICBHTFNMX1RZUEVfRkxPQVQsIDIsIDEpCitERUNMX1RZUEUodmVjMywgICBHTF9GTE9BVF9WRUMzLCAgIEdMU0xfVFlQRV9GTE9BVCwgMywgMSkKK0RFQ0xfVFlQRSh2ZWM0LCAgIEdMX0ZMT0FUX1ZFQzQsICAgR0xTTF9UWVBFX0ZMT0FULCA0LCAxKQorCitERUNMX1RZUEUobWF0MiwgICBHTF9GTE9BVF9NQVQyLCAgIEdMU0xfVFlQRV9GTE9BVCwgMiwgMikKK0RFQ0xfVFlQRShtYXQzLCAgIEdMX0ZMT0FUX01BVDMsICAgR0xTTF9UWVBFX0ZMT0FULCAzLCAzKQorREVDTF9UWVBFKG1hdDQsICAgR0xfRkxPQVRfTUFUNCwgICBHTFNMX1RZUEVfRkxPQVQsIDQsIDQpCisKK0RFQ0xfVFlQRShtYXQyeDMsIEdMX0ZMT0FUX01BVDJ4MywgR0xTTF9UWVBFX0ZMT0FULCAzLCAyKQorREVDTF9UWVBFKG1hdDJ4NCwgR0xfRkxPQVRfTUFUMng0LCBHTFNMX1RZUEVfRkxPQVQsIDQsIDIpCitERUNMX1RZUEUobWF0M3gyLCBHTF9GTE9BVF9NQVQzeDIsIEdMU0xfVFlQRV9GTE9BVCwgMiwgMykKK0RFQ0xfVFlQRShtYXQzeDQsIEdMX0ZMT0FUX01BVDN4NCwgR0xTTF9UWVBFX0ZMT0FULCA0LCAzKQorREVDTF9UWVBFKG1hdDR4MiwgR0xfRkxPQVRfTUFUNHgyLCBHTFNMX1RZUEVfRkxPQVQsIDIsIDQpCitERUNMX1RZUEUobWF0NHgzLCBHTF9GTE9BVF9NQVQ0eDMsIEdMU0xfVFlQRV9GTE9BVCwgMywgNCkKKworREVDTF9UWVBFKHNhbXBsZXIxRCwgICAgICAgICBHTF9TQU1QTEVSXzFELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAwLCAwLCBHTFNMX1RZUEVfRkxPQVQpCitERUNMX1RZUEUoc2FtcGxlcjJELCAgICAgICAgIEdMX1NBTVBMRVJfMkQsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzJELCAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyM0QsICAgICAgICAgR0xfU0FNUExFUl8zRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fM0QsICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXJDdWJlLCAgICAgICBHTF9TQU1QTEVSX0NVQkUsICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAwLCAwLCBHTFNMX1RZUEVfRkxPQVQpCitERUNMX1RZUEUoc2FtcGxlcjFEQXJyYXksICAgIEdMX1NBTVBMRVJfMURfQVJSQVksICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgIDAsIDEsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMkRBcnJheSwgICAgR0xfU0FNUExFUl8yRF9BUlJBWSwgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgMCwgMSwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXJDdWJlQXJyYXksICBHTF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZLCAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAwLCAxLCBHTFNMX1RZUEVfRkxPQVQpCitERUNMX1RZUEUoc2FtcGxlcjJEUmVjdCwgICAgIEdMX1NBTVBMRVJfMkRfUkVDVCwgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX1JFQ1QsIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyQnVmZmVyLCAgICAgR0xfU0FNUExFUl9CVUZGRVIsICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fQlVGLCAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXIyRE1TLCAgICAgICBHTF9TQU1QTEVSXzJEX01VTFRJU0FNUExFLCAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAwLCAwLCBHTFNMX1RZUEVfRkxPQVQpCitERUNMX1RZUEUoc2FtcGxlcjJETVNBcnJheSwgIEdMX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVksIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgIDAsIDEsIEdMU0xfVFlQRV9GTE9BVCkKKworREVDTF9UWVBFKGlzYW1wbGVyMUQsICAgICAgICBHTF9JTlRfU0FNUExFUl8xRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgMCwgMCwgR0xTTF9UWVBFX0lOVCkKK0RFQ0xfVFlQRShpc2FtcGxlcjJELCAgICAgICAgR0xfSU5UX1NBTVBMRVJfMkQsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzJELCAgIDAsIDAsIEdMU0xfVFlQRV9JTlQpCitERUNMX1RZUEUoaXNhbXBsZXIzRCwgICAgICAgIEdMX0lOVF9TQU1QTEVSXzNELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8zRCwgICAwLCAwLCBHTFNMX1RZUEVfSU5UKQorREVDTF9UWVBFKGlzYW1wbGVyQ3ViZSwgICAgICBHTF9JTlRfU0FNUExFUl9DVUJFLCAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgMCwgMCwgR0xTTF9UWVBFX0lOVCkKK0RFQ0xfVFlQRShpc2FtcGxlcjFEQXJyYXksICAgR0xfSU5UX1NBTVBMRVJfMURfQVJSQVksICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgIDAsIDEsIEdMU0xfVFlQRV9JTlQpCitERUNMX1RZUEUoaXNhbXBsZXIyREFycmF5LCAgIEdMX0lOVF9TQU1QTEVSXzJEX0FSUkFZLCAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAwLCAxLCBHTFNMX1RZUEVfSU5UKQorREVDTF9UWVBFKGlzYW1wbGVyQ3ViZUFycmF5LCBHTF9JTlRfU0FNUExFUl9DVUJFX01BUF9BUlJBWSwgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgMCwgMSwgR0xTTF9UWVBFX0lOVCkKK0RFQ0xfVFlQRShpc2FtcGxlcjJEUmVjdCwgICAgR0xfSU5UX1NBTVBMRVJfMkRfUkVDVCwgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX1JFQ1QsIDAsIDAsIEdMU0xfVFlQRV9JTlQpCitERUNMX1RZUEUoaXNhbXBsZXJCdWZmZXIsICAgIEdMX0lOVF9TQU1QTEVSX0JVRkZFUiwgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9CVUYsICAwLCAwLCBHTFNMX1RZUEVfSU5UKQorREVDTF9UWVBFKGlzYW1wbGVyMkRNUywgICAgICBHTF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSwgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgMCwgMCwgR0xTTF9UWVBFX0lOVCkKK0RFQ0xfVFlQRShpc2FtcGxlcjJETVNBcnJheSwgR0xfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVksIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgIDAsIDEsIEdMU0xfVFlQRV9JTlQpCisKK0RFQ0xfVFlQRSh1c2FtcGxlcjFELCAgICAgICAgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMUQsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKQorREVDTF9UWVBFKHVzYW1wbGVyMkQsICAgICAgICBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpCitERUNMX1RZUEUodXNhbXBsZXIzRCwgICAgICAgIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzNELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8zRCwgICAwLCAwLCBHTFNMX1RZUEVfVUlOVCkKK0RFQ0xfVFlQRSh1c2FtcGxlckN1YmUsICAgICAgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRSwgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIDAsIDAsIEdMU0xfVFlQRV9VSU5UKQorREVDTF9UWVBFKHVzYW1wbGVyMURBcnJheSwgICBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8xRF9BUlJBWSwgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgMCwgMSwgR0xTTF9UWVBFX1VJTlQpCitERUNMX1RZUEUodXNhbXBsZXIyREFycmF5LCAgIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZLCAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAwLCAxLCBHTFNMX1RZUEVfVUlOVCkKK0RFQ0xfVFlQRSh1c2FtcGxlckN1YmVBcnJheSwgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVksICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIDAsIDEsIEdMU0xfVFlQRV9VSU5UKQorREVDTF9UWVBFKHVzYW1wbGVyMkRSZWN0LCAgICBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9SRUNULCAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwgMCwgMCwgR0xTTF9UWVBFX1VJTlQpCitERUNMX1RZUEUodXNhbXBsZXJCdWZmZXIsICAgIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0JVRkZFUiwgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9CVUYsICAwLCAwLCBHTFNMX1RZUEVfVUlOVCkKK0RFQ0xfVFlQRSh1c2FtcGxlcjJETVMsICAgICAgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEUsICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKQorREVDTF9UWVBFKHVzYW1wbGVyMkRNU0FycmF5LCBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWSwgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgMCwgMSwgR0xTTF9UWVBFX1VJTlQpCisKK0RFQ0xfVFlQRShzYW1wbGVyMURTaGFkb3csICAgICAgICBHTF9TQU1QTEVSXzFEX1NIQURPVywgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgICAgIDEsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMkRTaGFkb3csICAgICAgICBHTF9TQU1QTEVSXzJEX1NIQURPVywgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgICAgIDEsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyQ3ViZVNoYWRvdywgICAgICBHTF9TQU1QTEVSX0NVQkVfU0hBRE9XLCAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgICAgIDEsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMURBcnJheVNoYWRvdywgICBHTF9TQU1QTEVSXzFEX0FSUkFZX1NIQURPVywgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgICAgIDEsIDEsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMkRBcnJheVNoYWRvdywgICBHTF9TQU1QTEVSXzJEX0FSUkFZX1NIQURPVywgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgICAgIDEsIDEsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyQ3ViZUFycmF5U2hhZG93LCBHTF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX1NIQURPVywgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgICAgIDEsIDEsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMkRSZWN0U2hhZG93LCAgICBHTF9TQU1QTEVSXzJEX1JFQ1RfU0hBRE9XLCAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwgICAgIDEsIDAsIEdMU0xfVFlQRV9GTE9BVCkKKworREVDTF9UWVBFKHNhbXBsZXJFeHRlcm5hbE9FUywgICAgIEdMX1NBTVBMRVJfRVhURVJOQUxfT0VTLCAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9FWFRFUk5BTCwgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorCitERUNMX1RZUEUoaW1hZ2UxRCwgICAgICAgICBHTF9JTUFHRV8xRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2UyRCwgICAgICAgICBHTF9JTUFHRV8yRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2UzRCwgICAgICAgICBHTF9JTUFHRV8zRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8zRCwgICAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2UyRFJlY3QsICAgICBHTF9JTUFHRV8yRF9SRUNULCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9SRUNULCAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2VDdWJlLCAgICAgICBHTF9JTUFHRV9DVUJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2VCdWZmZXIsICAgICBHTF9JTUFHRV9CVUZGRVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9CVUYsICAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2UxREFycmF5LCAgICBHTF9JTUFHRV8xRF9BUlJBWSwgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAgIDAsIDEsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2UyREFycmF5LCAgICBHTF9JTUFHRV8yRF9BUlJBWSwgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgIDAsIDEsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2VDdWJlQXJyYXksICBHTF9JTUFHRV9DVUJFX01BUF9BUlJBWSwgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAgIDAsIDEsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2UyRE1TLCAgICAgICBHTF9JTUFHRV8yRF9NVUxUSVNBTVBMRSwgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaW1hZ2UyRE1TQXJyYXksICBHTF9JTUFHRV8yRF9NVUxUSVNBTVBMRV9BUlJBWSwgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAgIDAsIDEsIEdMU0xfVFlQRV9GTE9BVCk7CitERUNMX1RZUEUoaWltYWdlMUQsICAgICAgICBHTF9JTlRfSU1BR0VfMUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAgIDAsIDAsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKGlpbWFnZTJELCAgICAgICAgR0xfSU5UX0lNQUdFXzJELCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgICAwLCAwLCBHTFNMX1RZUEVfSU5UKTsKK0RFQ0xfVFlQRShpaW1hZ2UzRCwgICAgICAgIEdMX0lOVF9JTUFHRV8zRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzNELCAgICAgMCwgMCwgR0xTTF9UWVBFX0lOVCk7CitERUNMX1RZUEUoaWltYWdlMkRSZWN0LCAgICBHTF9JTlRfSU1BR0VfMkRfUkVDVCwgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9SRUNULCAgIDAsIDAsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKGlpbWFnZUN1YmUsICAgICAgR0xfSU5UX0lNQUdFX0NVQkUsICAgICAgICAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgICAwLCAwLCBHTFNMX1RZUEVfSU5UKTsKK0RFQ0xfVFlQRShpaW1hZ2VCdWZmZXIsICAgIEdMX0lOVF9JTUFHRV9CVUZGRVIsICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX0JVRiwgICAgMCwgMCwgR0xTTF9UWVBFX0lOVCk7CitERUNMX1RZUEUoaWltYWdlMURBcnJheSwgICBHTF9JTlRfSU1BR0VfMURfQVJSQVksICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAgIDAsIDEsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKGlpbWFnZTJEQXJyYXksICAgR0xfSU5UX0lNQUdFXzJEX0FSUkFZLCAgICAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgICAwLCAxLCBHTFNMX1RZUEVfSU5UKTsKK0RFQ0xfVFlQRShpaW1hZ2VDdWJlQXJyYXksIEdMX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWSwgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsICAgMCwgMSwgR0xTTF9UWVBFX0lOVCk7CitERUNMX1RZUEUoaWltYWdlMkRNUywgICAgICBHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEUsICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAgIDAsIDAsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKGlpbWFnZTJETVNBcnJheSwgR0xfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZLCAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgICAwLCAxLCBHTFNMX1RZUEVfSU5UKTsKK0RFQ0xfVFlQRSh1aW1hZ2UxRCwgICAgICAgIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpOworREVDTF9UWVBFKHVpbWFnZTJELCAgICAgICAgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgICAwLCAwLCBHTFNMX1RZUEVfVUlOVCk7CitERUNMX1RZUEUodWltYWdlM0QsICAgICAgICBHTF9VTlNJR05FRF9JTlRfSU1BR0VfM0QsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8zRCwgICAgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKTsKK0RFQ0xfVFlQRSh1aW1hZ2UyRFJlY3QsICAgIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9SRUNULCAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX1JFQ1QsICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpOworREVDTF9UWVBFKHVpbWFnZUN1YmUsICAgICAgR0xfVU5TSUdORURfSU5UX0lNQUdFX0NVQkUsICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgICAwLCAwLCBHTFNMX1RZUEVfVUlOVCk7CitERUNMX1RZUEUodWltYWdlQnVmZmVyLCAgICBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQlVGRkVSLCAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9CVUYsICAgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKTsKK0RFQ0xfVFlQRSh1aW1hZ2UxREFycmF5LCAgIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRF9BUlJBWSwgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgICAgMCwgMSwgR0xTTF9UWVBFX1VJTlQpOworREVDTF9UWVBFKHVpbWFnZTJEQXJyYXksICAgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX0FSUkFZLCAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgICAwLCAxLCBHTFNMX1RZUEVfVUlOVCk7CitERUNMX1RZUEUodWltYWdlQ3ViZUFycmF5LCBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVksICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAgIDAsIDEsIEdMU0xfVFlQRV9VSU5UKTsKK0RFQ0xfVFlQRSh1aW1hZ2UyRE1TLCAgICAgIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRSwgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpOworREVDTF9UWVBFKHVpbWFnZTJETVNBcnJheSwgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZLCBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgICAwLCAxLCBHTFNMX1RZUEVfVUlOVCk7CisKK0RFQ0xfVFlQRShhdG9taWNfdWludCwgR0xfVU5TSUdORURfSU5UX0FUT01JQ19DT1VOVEVSLCBHTFNMX1RZUEVfQVRPTUlDX1VJTlQsIDEsIDEpCisKK1NUUlVDVF9UWVBFKGdsX0RlcHRoUmFuZ2VQYXJhbWV0ZXJzKQorU1RSVUNUX1RZUEUoZ2xfUG9pbnRQYXJhbWV0ZXJzKQorU1RSVUNUX1RZUEUoZ2xfTWF0ZXJpYWxQYXJhbWV0ZXJzKQorU1RSVUNUX1RZUEUoZ2xfTGlnaHRTb3VyY2VQYXJhbWV0ZXJzKQorU1RSVUNUX1RZUEUoZ2xfTGlnaHRNb2RlbFBhcmFtZXRlcnMpCitTVFJVQ1RfVFlQRShnbF9MaWdodE1vZGVsUHJvZHVjdHMpCitTVFJVQ1RfVFlQRShnbF9MaWdodFByb2R1Y3RzKQorU1RSVUNUX1RZUEUoZ2xfRm9nUGFyYW1ldGVycykKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2dsc2xfcGFyc2VyX2V4dHJhcy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvZ2xzbF9wYXJzZXJfZXh0cmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMDNmOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2dsc2xfcGFyc2VyX2V4dHJhcy5oCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIEdMU0xfUEFSU0VSX0VYVFJBU19ICisjZGVmaW5lIEdMU0xfUEFSU0VSX0VYVFJBU19ICisKKy8qCisgKiBNb3N0IG9mIHRoZSBkZWZpbml0aW9ucyBoZXJlIG9ubHkgYXBwbHkgdG8gQysrCisgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorCitzdHJ1Y3QgZ2xfY29udGV4dDsKKworc3RydWN0IGdsc2xfc3dpdGNoX3N0YXRlIHsKKyAgIC8qKiBUZW1wb3JhcnkgdmFyaWFibGVzIG5lZWRlZCBmb3Igc3dpdGNoIHN0YXRlbWVudC4gKi8KKyAgIGlyX3ZhcmlhYmxlICp0ZXN0X3ZhcjsKKyAgIGlyX3ZhcmlhYmxlICppc19mYWxsdGhydV92YXI7CisgICBpcl92YXJpYWJsZSAqaXNfYnJlYWtfdmFyOworICAgY2xhc3MgYXN0X3N3aXRjaF9zdGF0ZW1lbnQgKnN3aXRjaF9uZXN0aW5nX2FzdDsKKworICAgLyoqIFRhYmxlIG9mIGNvbnN0YW50IHZhbHVlcyBhbHJlYWR5IHVzZWQgaW4gY2FzZSBsYWJlbHMgKi8KKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpsYWJlbHNfaHQ7CisgICBjbGFzcyBhc3RfY2FzZV9sYWJlbCAqcHJldmlvdXNfZGVmYXVsdDsKKworICAgYm9vbCBpc19zd2l0Y2hfaW5uZXJtb3N0OyAvLyBpZiBzd2l0Y2ggc3RtdCBpcyBjbG9zZXN0IHRvIGJyZWFrLCAuLi4KK307CisKK2NvbnN0IGNoYXIgKgorZ2xzbF9jb21wdXRlX3ZlcnNpb25fc3RyaW5nKHZvaWQgKm1lbV9jdHgsIGJvb2wgaXNfZXMsIHVuc2lnbmVkIHZlcnNpb24pOworCit0eXBlZGVmIHN0cnVjdCBZWUxUWVBFIHsKKyAgIGludCBmaXJzdF9saW5lOworICAgaW50IGZpcnN0X2NvbHVtbjsKKyAgIGludCBsYXN0X2xpbmU7CisgICBpbnQgbGFzdF9jb2x1bW47CisgICB1bnNpZ25lZCBzb3VyY2U7Cit9IFlZTFRZUEU7CisjIGRlZmluZSBZWUxUWVBFX0lTX0RFQ0xBUkVEIDEKKyMgZGVmaW5lIFlZTFRZUEVfSVNfVFJJVklBTCAxCisKK2V4dGVybiB2b2lkIF9tZXNhX2dsc2xfZXJyb3IoWVlMVFlQRSAqbG9jcCwgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworCitzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSB7CisgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlKHN0cnVjdCBnbF9jb250ZXh0ICpfY3R4LCBnbF9zaGFkZXJfc3RhZ2Ugc3RhZ2UsCisJCQkgIHZvaWQgKm1lbV9jdHgpOworCisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUpOworCisgICAvKioKKyAgICAqIEdlbmVyYXRlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgR0xTTCB2ZXJzaW9uIGN1cnJlbnRseSBiZWluZyBjb21waWxlZAorICAgICogKHVzZWZ1bCBmb3IgZXJyb3IgbWVzc2FnZXMpLgorICAgICovCisgICBjb25zdCBjaGFyICpnZXRfdmVyc2lvbl9zdHJpbmcoKQorICAgeworICAgICAgcmV0dXJuIGdsc2xfY29tcHV0ZV92ZXJzaW9uX3N0cmluZyh0aGlzLCB0aGlzLT5lc19zaGFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmxhbmd1YWdlX3ZlcnNpb24pOworICAgfQorCisgICAvKioKKyAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IEdMU0wgdmVyc2lvbiBpcyBzdWZmaWNpZW50bHkgaGlnaCB0bworICAgICogc3VwcG9ydCBhIGNlcnRhaW4gZmVhdHVyZS4KKyAgICAqCisgICAgKiBccGFyYW0gcmVxdWlyZWRfZ2xzbF92ZXJzaW9uIGlzIHRoZSBkZXNrdG9wIEdMU0wgdmVyc2lvbiB0aGF0IGlzCisgICAgKiByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSBmZWF0dXJlLCBvciAwIGlmIG5vIHZlcnNpb24gb2YgZGVza3RvcCBHTFNMCisgICAgKiBzdXBwb3J0cyB0aGUgZmVhdHVyZS4KKyAgICAqCisgICAgKiBccGFyYW0gcmVxdWlyZWRfZ2xzbF9lc192ZXJzaW9uIGlzIHRoZSBHTFNMIEVTIHZlcnNpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICogdG8gc3VwcG9ydCB0aGUgZmVhdHVyZSwgb3IgMCBpZiBubyB2ZXJzaW9uIG9mIEdMU0wgRVMgc3Vwb3J0cyB0aGUKKyAgICAqIGZlYXR1cmUuCisgICAgKi8KKyAgIGJvb2wgaXNfdmVyc2lvbih1bnNpZ25lZCByZXF1aXJlZF9nbHNsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVxdWlyZWRfZ2xzbF9lc192ZXJzaW9uKSBjb25zdAorICAgeworICAgICAgdW5zaWduZWQgcmVxdWlyZWRfdmVyc2lvbiA9IHRoaXMtPmVzX3NoYWRlciA/CisgICAgICAgICByZXF1aXJlZF9nbHNsX2VzX3ZlcnNpb24gOiByZXF1aXJlZF9nbHNsX3ZlcnNpb247CisgICAgICByZXR1cm4gcmVxdWlyZWRfdmVyc2lvbiAhPSAwCisgICAgICAgICAmJiB0aGlzLT5sYW5ndWFnZV92ZXJzaW9uID49IHJlcXVpcmVkX3ZlcnNpb247CisgICB9CisKKyAgIGJvb2wgY2hlY2tfdmVyc2lvbih1bnNpZ25lZCByZXF1aXJlZF9nbHNsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVxdWlyZWRfZ2xzbF9lc192ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIFlZTFRZUEUgKmxvY3AsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZMSUtFKDUsIDYpOworCisgICBib29sIGNoZWNrX3ByZWNpc2lvbl9xdWFsaWZpZXJzX2FsbG93ZWQoWVlMVFlQRSAqbG9jcCkKKyAgIHsKKyAgICAgIHJldHVybiBjaGVja192ZXJzaW9uKDEzMCwgMTAwLCBsb2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpc2lvbiBxdWFsaWZpZXJzIGFyZSBmb3JiaWRkZW4iKTsKKyAgIH0KKworICAgYm9vbCBjaGVja19iaXR3aXNlX29wZXJhdGlvbnNfYWxsb3dlZChZWUxUWVBFICpsb2NwKQorICAgeworICAgICAgcmV0dXJuIGNoZWNrX3ZlcnNpb24oMTMwLCAzMDAsIGxvY3AsICJiaXQtd2lzZSBvcGVyYXRpb25zIGFyZSBmb3JiaWRkZW4iKTsKKyAgIH0KKworICAgYm9vbCBjaGVja19leHBsaWNpdF9hdHRyaWJfbG9jYXRpb25fYWxsb3dlZChZWUxUWVBFICpsb2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpcl92YXJpYWJsZSAqdmFyKQorICAgeworICAgICAgaWYgKCF0aGlzLT5oYXNfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uKCkpIHsKKyAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHJlcXVpcmVtZW50ID0gdGhpcy0+ZXNfc2hhZGVyCisgICAgICAgICAgICA/ICJHTFNMIEVTIDMwMCIKKyAgICAgICAgICAgIDogIkdMX0FSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24gZXh0ZW5zaW9uIG9yIEdMU0wgMzMwIjsKKworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2NwLCB0aGlzLCAiJXMgZXhwbGljaXQgbG9jYXRpb24gcmVxdWlyZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX3N0cmluZyh2YXIpLCByZXF1aXJlbWVudCk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBib29sIGNoZWNrX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzX2FsbG93ZWQoWVlMVFlQRSAqbG9jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpcl92YXJpYWJsZSAqdmFyKQorICAgeworICAgICAgaWYgKCF0aGlzLT5oYXNfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMoKSkgeworICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgcmVxdWlyZW1lbnQgPSB0aGlzLT5lc19zaGFkZXIKKyAgICAgICAgICAgID8gIkdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyBleHRlbnNpb24iCisgICAgICAgICAgICA6ICJHTF9BUkJfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMgZXh0ZW5zaW9uIG9yIEdMU0wgNDIwIjsKKworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2NwLCB0aGlzLCAiJXMgZXhwbGljaXQgbG9jYXRpb24gcmVxdWlyZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX3N0cmluZyh2YXIpLCByZXF1aXJlbWVudCk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBib29sIGhhc19leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24oKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIEFSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb25fZW5hYmxlIHx8IGlzX3ZlcnNpb24oMzMwLCAzMDApOworICAgfQorCisgICBib29sIGhhc191bmlmb3JtX2J1ZmZlcl9vYmplY3RzKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBBUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0X2VuYWJsZSB8fCBpc192ZXJzaW9uKDE0MCwgMzAwKTsKKyAgIH0KKworICAgYm9vbCBoYXNfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIEFSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0c19lbmFibGUgfHwgaXNfdmVyc2lvbig0MTAsIDApCisgICAgICAgICB8fCBFWFRfc2VwYXJhdGVfc2hhZGVyX29iamVjdHNfZW5hYmxlOworICAgfQorCisgICB2b2lkIHByb2Nlc3NfdmVyc2lvbl9kaXJlY3RpdmUoWVlMVFlQRSAqbG9jcCwgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnQpOworCisgICBzdHJ1Y3QgZ2xfY29udGV4dCAqY29uc3QgY3R4OworICAgdm9pZCAqc2Nhbm5lcjsKKyAgIGV4ZWNfbGlzdCB0cmFuc2xhdGlvbl91bml0OworICAgZ2xzbF9zeW1ib2xfdGFibGUgKnN5bWJvbHM7CisKKyAgIHVuc2lnbmVkIG51bV9zdXBwb3J0ZWRfdmVyc2lvbnM7CisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgdmVyOworICAgICAgYm9vbCBlczsKKyAgIH0gc3VwcG9ydGVkX3ZlcnNpb25zWzEyXTsKKworICAgYm9vbCBlc19zaGFkZXI7CisgICB1bnNpZ25lZCBsYW5ndWFnZV92ZXJzaW9uOworICAgZ2xfc2hhZGVyX3N0YWdlIHN0YWdlOworCisgICAvKioKKyAgICAqIE51bWJlciBvZiBuZXN0ZWQgc3RydWN0X3NwZWNpZmllciBsZXZlbHMKKyAgICAqCisgICAgKiBPdXRzaWRlIGEgc3RydWN0X3NwZWNpZmVyLCB0aGlzIGlzIHplcm8uCisgICAgKi8KKyAgIHVuc2lnbmVkIHN0cnVjdF9zcGVjaWZpZXJfZGVwdGg7CisKKyAgIC8qKgorICAgICogRGVmYXVsdCB1bmlmb3JtIGxheW91dCBxdWFsaWZpZXJzIHRyYWNrZWQgZHVyaW5nIHBhcnNpbmcuCisgICAgKiBDdXJyZW50bHkgYWZmZWN0cyB1bmlmb3JtIGJsb2NrcyBhbmQgdW5pZm9ybSBidWZmZXIgdmFyaWFibGVzIGluCisgICAgKiB0aG9zZSBibG9ja3MuCisgICAgKi8KKyAgIHN0cnVjdCBhc3RfdHlwZV9xdWFsaWZpZXIgKmRlZmF1bHRfdW5pZm9ybV9xdWFsaWZpZXI7CisKKyAgIC8qKgorICAgICogVmFyaWFibGVzIHRvIHRyYWNrIGRpZmZlcmVudCBjYXNlcyBpZiBhIGZyYWdtZW50IHNoYWRlciByZWRlY2xhcmVzCisgICAgKiBidWlsdC1pbiB2YXJpYWJsZSBnbF9GcmFnQ29vcmQuCisgICAgKgorICAgICogTm90ZTogVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBhdCBhc3RfdG9faGlyIHRpbWUgcmF0aGVyIHRoYW4gYXQgcGFyc2UKKyAgICAqIHRpbWUuCisgICAgKi8KKyAgIGJvb2wgZnNfcmVkZWNsYXJlc19nbF9mcmFnY29vcmQ7CisgICBib29sIGZzX29yaWdpbl91cHBlcl9sZWZ0OworICAgYm9vbCBmc19waXhlbF9jZW50ZXJfaW50ZWdlcjsKKyAgIGJvb2wgZnNfcmVkZWNsYXJlc19nbF9mcmFnY29vcmRfd2l0aF9ub19sYXlvdXRfcXVhbGlmaWVyczsKKworICAgLyoqCisgICAgKiBUcnVlIGlmIGEgZ2VvbWV0cnkgc2hhZGVyIGlucHV0IHByaW1pdGl2ZSB0eXBlIHdhcyBzcGVjaWZpZWQgdXNpbmcgYQorICAgICogbGF5b3V0IGRpcmVjdGl2ZS4KKyAgICAqCisgICAgKiBOb3RlOiB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGF0IGFzdF90b19oaXIgdGltZSByYXRoZXIgdGhhbiBhdCBwYXJzZQorICAgICogdGltZS4KKyAgICAqLworICAgYm9vbCBnc19pbnB1dF9wcmltX3R5cGVfc3BlY2lmaWVkOworCisgICAvKiogSW5wdXQgbGF5b3V0IHF1YWxpZmllcnMgZnJvbSBHTFNMIDEuNTAuIChnZW9tZXRyeSBzaGFkZXIgY29udHJvbHMpKi8KKyAgIHN0cnVjdCBhc3RfdHlwZV9xdWFsaWZpZXIgKmluX3F1YWxpZmllcjsKKworICAgLyoqCisgICAgKiBUcnVlIGlmIGEgY29tcHV0ZSBzaGFkZXIgaW5wdXQgbG9jYWwgc2l6ZSB3YXMgc3BlY2lmaWVkIHVzaW5nIGEgbGF5b3V0CisgICAgKiBkaXJlY3RpdmUuCisgICAgKgorICAgICogTm90ZTogdGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBhdCBhc3RfdG9faGlyIHRpbWUgcmF0aGVyIHRoYW4gYXQgcGFyc2UKKyAgICAqIHRpbWUuCisgICAgKi8KKyAgIGJvb2wgY3NfaW5wdXRfbG9jYWxfc2l6ZV9zcGVjaWZpZWQ7CisKKyAgIC8qKgorICAgICogSWYgY3NfaW5wdXRfbG9jYWxfc2l6ZV9zcGVjaWZpZWQgaXMgdHJ1ZSwgdGhlIGxvY2FsIHNpemUgdGhhdCB3YXMKKyAgICAqIHNwZWNpZmllZC4gIE90aGVyd2lzZSBpZ25vcmVkLgorICAgICovCisgICB1bnNpZ25lZCBjc19pbnB1dF9sb2NhbF9zaXplWzNdOworCisgICAvKiogT3V0cHV0IGxheW91dCBxdWFsaWZpZXJzIGZyb20gR0xTTCAxLjUwLiAoZ2VvbWV0cnkgc2hhZGVyIGNvbnRyb2xzKSovCisgICBzdHJ1Y3QgYXN0X3R5cGVfcXVhbGlmaWVyICpvdXRfcXVhbGlmaWVyOworCisgICAvKioKKyAgICAqIFByaW50YWJsZSBsaXN0IG9mIEdMU0wgdmVyc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAqCisgICAgKiBcbm90ZQorICAgICogVGhpcyBzdHJpbmcgc2hvdWxkIHByb2JhYmx5IGJlIGdlbmVyYXRlZCBwZXItY29udGV4dCBpbnN0ZWFkIG9mIHBlcgorICAgICogaW52b2thdGlvbiBvZiB0aGUgY29tcGlsZXIuICBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4gdGhlIG1ldGhvZCBvZgorICAgICogdHJhY2tpbmcgc3VwcG9ydGVkIEdMU0wgdmVyc2lvbnMgY2hhbmdlcy4KKyAgICAqLworICAgY29uc3QgY2hhciAqc3VwcG9ydGVkX3ZlcnNpb25fc3RyaW5nOworCisgICAvKioKKyAgICAqIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbGltaXRzIHRoYXQgYWZmZWN0IGJ1aWx0LWluIHZhcmlhYmxlcywgZXRjLgorICAgICoKKyAgICAqIFxzYSBzdHJ1Y3QgZ2xfY29uc3RhbnRzIChpbiBtdHlwZXMuaCkKKyAgICAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIDEuMTAgKi8KKyAgICAgIHVuc2lnbmVkIE1heExpZ2h0czsKKyAgICAgIHVuc2lnbmVkIE1heENsaXBQbGFuZXM7CisgICAgICB1bnNpZ25lZCBNYXhUZXh0dXJlVW5pdHM7CisgICAgICB1bnNpZ25lZCBNYXhUZXh0dXJlQ29vcmRzOworICAgICAgdW5zaWduZWQgTWF4VmVydGV4QXR0cmliczsKKyAgICAgIHVuc2lnbmVkIE1heFZlcnRleFVuaWZvcm1Db21wb25lbnRzOworICAgICAgdW5zaWduZWQgTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHM7CisgICAgICB1bnNpZ25lZCBNYXhDb21iaW5lZFRleHR1cmVJbWFnZVVuaXRzOworICAgICAgdW5zaWduZWQgTWF4VGV4dHVyZUltYWdlVW5pdHM7CisgICAgICB1bnNpZ25lZCBNYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzOworCisgICAgICAvKiBBUkJfZHJhd19idWZmZXJzICovCisgICAgICB1bnNpZ25lZCBNYXhEcmF3QnVmZmVyczsKKworICAgICAgLyogMy4wMCBFUyAqLworICAgICAgaW50IE1pblByb2dyYW1UZXhlbE9mZnNldDsKKyAgICAgIGludCBNYXhQcm9ncmFtVGV4ZWxPZmZzZXQ7CisKKyAgICAgIC8qIDEuNTAgKi8KKyAgICAgIHVuc2lnbmVkIE1heFZlcnRleE91dHB1dENvbXBvbmVudHM7CisgICAgICB1bnNpZ25lZCBNYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50czsKKyAgICAgIHVuc2lnbmVkIE1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50czsKKyAgICAgIHVuc2lnbmVkIE1heEZyYWdtZW50SW5wdXRDb21wb25lbnRzOworICAgICAgdW5zaWduZWQgTWF4R2VvbWV0cnlUZXh0dXJlSW1hZ2VVbml0czsKKyAgICAgIHVuc2lnbmVkIE1heEdlb21ldHJ5T3V0cHV0VmVydGljZXM7CisgICAgICB1bnNpZ25lZCBNYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50czsKKyAgICAgIHVuc2lnbmVkIE1heEdlb21ldHJ5VW5pZm9ybUNvbXBvbmVudHM7CisKKyAgICAgIC8qIEFSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzICovCisgICAgICB1bnNpZ25lZCBNYXhWZXJ0ZXhBdG9taWNDb3VudGVyczsKKyAgICAgIHVuc2lnbmVkIE1heEdlb21ldHJ5QXRvbWljQ291bnRlcnM7CisgICAgICB1bnNpZ25lZCBNYXhGcmFnbWVudEF0b21pY0NvdW50ZXJzOworICAgICAgdW5zaWduZWQgTWF4Q29tYmluZWRBdG9taWNDb3VudGVyczsKKyAgICAgIHVuc2lnbmVkIE1heEF0b21pY0J1ZmZlckJpbmRpbmdzOworCisgICAgICAvKiBBUkJfY29tcHV0ZV9zaGFkZXIgKi8KKyAgICAgIHVuc2lnbmVkIE1heENvbXB1dGVXb3JrR3JvdXBDb3VudFszXTsKKyAgICAgIHVuc2lnbmVkIE1heENvbXB1dGVXb3JrR3JvdXBTaXplWzNdOworCisgICAgICAvKiBBUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUgKi8KKyAgICAgIHVuc2lnbmVkIE1heEltYWdlVW5pdHM7CisgICAgICB1bnNpZ25lZCBNYXhDb21iaW5lZEltYWdlVW5pdHNBbmRGcmFnbWVudE91dHB1dHM7CisgICAgICB1bnNpZ25lZCBNYXhJbWFnZVNhbXBsZXM7CisgICAgICB1bnNpZ25lZCBNYXhWZXJ0ZXhJbWFnZVVuaWZvcm1zOworICAgICAgdW5zaWduZWQgTWF4R2VvbWV0cnlJbWFnZVVuaWZvcm1zOworICAgICAgdW5zaWduZWQgTWF4RnJhZ21lbnRJbWFnZVVuaWZvcm1zOworICAgICAgdW5zaWduZWQgTWF4Q29tYmluZWRJbWFnZVVuaWZvcm1zOworICAgfSBDb25zdDsKKworICAgLyoqCisgICAgKiBEdXJpbmcgQVNUIHRvIElSIGNvbnZlcnNpb24sIHBvaW50ZXIgdG8gY3VycmVudCBJUiBmdW5jdGlvbgorICAgICoKKyAgICAqIFdpbGwgYmUgXGMgTlVMTCB3aGVuZXZlciB0aGUgQVNUIHRvIElSIGNvbnZlcnNpb24gaXMgbm90IGluc2lkZSBhCisgICAgKiBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgICovCisgICBjbGFzcyBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmN1cnJlbnRfZnVuY3Rpb247CisKKyAgIC8qKgorICAgICogRHVyaW5nIEFTVCB0byBJUiBjb252ZXJzaW9uLCBwb2ludGVyIHRvIHRoZSB0b3BsZXZlbCBJUgorICAgICogaW5zdHJ1Y3Rpb24gbGlzdCBiZWluZyBnZW5lcmF0ZWQuCisgICAgKi8KKyAgIGV4ZWNfbGlzdCAqdG9wbGV2ZWxfaXI7CisKKyAgIC8qKiBIYXZlIHdlIGZvdW5kIGEgcmV0dXJuIHN0YXRlbWVudCBpbiB0aGlzIGZ1bmN0aW9uPyAqLworICAgYm9vbCBmb3VuZF9yZXR1cm47CisKKyAgIC8qKiBXYXMgdGhlcmUgYW4gZXJyb3IgZHVyaW5nIGNvbXBpbGF0aW9uPyAqLworICAgYm9vbCBlcnJvcjsKKworICAgLyoqCisgICAgKiBBcmUgYWxsIHNoYWRlciBpbnB1dHMgLyBvdXRwdXRzIGludmFyaWFudD8KKyAgICAqCisgICAgKiBUaGlzIGlzIHNldCB3aGVuIHRoZSAnU1RER0wgaW52YXJpYW50KGFsbCknIHByYWdtYSBpcyB1c2VkLgorICAgICovCisgICBib29sIGFsbF9pbnZhcmlhbnQ7CisKKyAgIC8qKiBMb29wIG9yIHN3aXRjaCBzdGF0ZW1lbnQgY29udGFpbmluZyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbnMuICovCisgICBjbGFzcyBhc3RfaXRlcmF0aW9uX3N0YXRlbWVudCAqbG9vcF9uZXN0aW5nX2FzdDsKKworICAgc3RydWN0IGdsc2xfc3dpdGNoX3N0YXRlIHN3aXRjaF9zdGF0ZTsKKworICAgLyoqIExpc3Qgb2Ygc3RydWN0dXJlcyBkZWZpbmVkIGluIHVzZXIgY29kZS4gKi8KKyAgIGNvbnN0IGdsc2xfdHlwZSAqKnVzZXJfc3RydWN0dXJlczsKKyAgIHVuc2lnbmVkIG51bV91c2VyX3N0cnVjdHVyZXM7CisKKyAgIGNoYXIgKmluZm9fbG9nOworCisgICAvKioKKyAgICAqIFxuYW1lIEVuYWJsZSBiaXRzIGZvciBHTFNMIGV4dGVuc2lvbnMKKyAgICAqLworICAgLypAeyovCisgICAvKiBBUkIgZXh0ZW5zaW9ucyBnbyBoZXJlLCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCisgICAgKi8KKyAgIGJvb2wgQVJCX2FycmF5c19vZl9hcnJheXNfZW5hYmxlOworICAgYm9vbCBBUkJfYXJyYXlzX29mX2FycmF5c193YXJuOworICAgYm9vbCBBUkJfY29tcHV0ZV9zaGFkZXJfZW5hYmxlOworICAgYm9vbCBBUkJfY29tcHV0ZV9zaGFkZXJfd2FybjsKKyAgIGJvb2wgQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aF9lbmFibGU7CisgICBib29sIEFSQl9jb25zZXJ2YXRpdmVfZGVwdGhfd2FybjsKKyAgIGJvb2wgQVJCX2RyYXdfYnVmZmVyc19lbmFibGU7CisgICBib29sIEFSQl9kcmF3X2J1ZmZlcnNfd2FybjsKKyAgIGJvb2wgQVJCX2RyYXdfaW5zdGFuY2VkX2VuYWJsZTsKKyAgIGJvb2wgQVJCX2RyYXdfaW5zdGFuY2VkX3dhcm47CisgICBib29sIEFSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb25fZW5hYmxlOworICAgYm9vbCBBUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uX3dhcm47CisgICBib29sIEFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uc19lbmFibGU7CisgICBib29sIEFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uc193YXJuOworICAgYm9vbCBBUkJfZ3B1X3NoYWRlcjVfZW5hYmxlOworICAgYm9vbCBBUkJfZ3B1X3NoYWRlcjVfd2FybjsKKyAgIGJvb2wgQVJCX3NhbXBsZV9zaGFkaW5nX2VuYWJsZTsKKyAgIGJvb2wgQVJCX3NhbXBsZV9zaGFkaW5nX3dhcm47CisgICBib29sIEFSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0c19lbmFibGU7CisgICBib29sIEFSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0c193YXJuOworICAgYm9vbCBBUkJfc2hhZGVyX2F0b21pY19jb3VudGVyc19lbmFibGU7CisgICBib29sIEFSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzX3dhcm47CisgICBib29sIEFSQl9zaGFkZXJfYml0X2VuY29kaW5nX2VuYWJsZTsKKyAgIGJvb2wgQVJCX3NoYWRlcl9iaXRfZW5jb2Rpbmdfd2FybjsKKyAgIGJvb2wgQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZTsKKyAgIGJvb2wgQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX3dhcm47CisgICBib29sIEFSQl9zaGFkZXJfc3RlbmNpbF9leHBvcnRfZW5hYmxlOworICAgYm9vbCBBUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0X3dhcm47CisgICBib29sIEFSQl9zaGFkZXJfdGV4dHVyZV9sb2RfZW5hYmxlOworICAgYm9vbCBBUkJfc2hhZGVyX3RleHR1cmVfbG9kX3dhcm47CisgICBib29sIEFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2tfZW5hYmxlOworICAgYm9vbCBBUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrX3dhcm47CisgICBib29sIEFSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmdfZW5hYmxlOworICAgYm9vbCBBUkJfc2hhZGluZ19sYW5ndWFnZV9wYWNraW5nX3dhcm47CisgICBib29sIEFSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5X2VuYWJsZTsKKyAgIGJvb2wgQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXlfd2FybjsKKyAgIGJvb2wgQVJCX3RleHR1cmVfZ2F0aGVyX2VuYWJsZTsKKyAgIGJvb2wgQVJCX3RleHR1cmVfZ2F0aGVyX3dhcm47CisgICBib29sIEFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZTsKKyAgIGJvb2wgQVJCX3RleHR1cmVfbXVsdGlzYW1wbGVfd2FybjsKKyAgIGJvb2wgQVJCX3RleHR1cmVfcXVlcnlfbGV2ZWxzX2VuYWJsZTsKKyAgIGJvb2wgQVJCX3RleHR1cmVfcXVlcnlfbGV2ZWxzX3dhcm47CisgICBib29sIEFSQl90ZXh0dXJlX3F1ZXJ5X2xvZF9lbmFibGU7CisgICBib29sIEFSQl90ZXh0dXJlX3F1ZXJ5X2xvZF93YXJuOworICAgYm9vbCBBUkJfdGV4dHVyZV9yZWN0YW5nbGVfZW5hYmxlOworICAgYm9vbCBBUkJfdGV4dHVyZV9yZWN0YW5nbGVfd2FybjsKKyAgIGJvb2wgQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdF9lbmFibGU7CisgICBib29sIEFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3Rfd2FybjsKKyAgIGJvb2wgQVJCX3ZpZXdwb3J0X2FycmF5X2VuYWJsZTsKKyAgIGJvb2wgQVJCX3ZpZXdwb3J0X2FycmF5X3dhcm47CisKKyAgIC8qIEtIUiBleHRlbnNpb25zIGdvIGhlcmUsIHNvcnRlZCBhbHBoYWJldGljYWxseS4KKyAgICAqLworCisgICAvKiBPRVMgZXh0ZW5zaW9ucyBnbyBoZXJlLCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCisgICAgKi8KKyAgIGJvb2wgT0VTX0VHTF9pbWFnZV9leHRlcm5hbF9lbmFibGU7CisgICBib29sIE9FU19FR0xfaW1hZ2VfZXh0ZXJuYWxfd2FybjsKKyAgIGJvb2wgT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzX2VuYWJsZTsKKyAgIGJvb2wgT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzX3dhcm47CisgICBib29sIE9FU190ZXh0dXJlXzNEX2VuYWJsZTsKKyAgIGJvb2wgT0VTX3RleHR1cmVfM0Rfd2FybjsKKworICAgLyogQWxsIG90aGVyIGV4dGVuc2lvbnMgZ28gaGVyZSwgc29ydGVkIGFscGhhYmV0aWNhbGx5LgorICAgICovCisgICBib29sIEFNRF9jb25zZXJ2YXRpdmVfZGVwdGhfZW5hYmxlOworICAgYm9vbCBBTURfY29uc2VydmF0aXZlX2RlcHRoX3dhcm47CisgICBib29sIEFNRF9zaGFkZXJfc3RlbmNpbF9leHBvcnRfZW5hYmxlOworICAgYm9vbCBBTURfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0X3dhcm47CisgICBib29sIEFNRF9zaGFkZXJfdHJpbmFyeV9taW5tYXhfZW5hYmxlOworICAgYm9vbCBBTURfc2hhZGVyX3RyaW5hcnlfbWlubWF4X3dhcm47CisgICBib29sIEFNRF92ZXJ0ZXhfc2hhZGVyX2xheWVyX2VuYWJsZTsKKyAgIGJvb2wgQU1EX3ZlcnRleF9zaGFkZXJfbGF5ZXJfd2FybjsKKyAgIGJvb2wgRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzX2VuYWJsZTsKKyAgIGJvb2wgRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzX3dhcm47CisgICBib29sIEVYVF9zaGFkZXJfaW50ZWdlcl9taXhfZW5hYmxlOworICAgYm9vbCBFWFRfc2hhZGVyX2ludGVnZXJfbWl4X3dhcm47CisgICBib29sIEVYVF90ZXh0dXJlX2FycmF5X2VuYWJsZTsKKyAgIGJvb2wgRVhUX3RleHR1cmVfYXJyYXlfd2FybjsKKyAgIC8qQH0qLworCisgICAvKiogRXh0ZW5zaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIE9wZW5HTCBpbXBsZW1lbnRhdGlvbi4gKi8KKyAgIGNvbnN0IHN0cnVjdCBnbF9leHRlbnNpb25zICpleHRlbnNpb25zOworCisgICBib29sIHVzZXNfYnVpbHRpbl9mdW5jdGlvbnM7CisgICBib29sIGZzX3VzZXNfZ2xfZnJhZ2Nvb3JkOworCisgICAvKioKKyAgICAqIEZvciBnZW9tZXRyeSBzaGFkZXJzLCBzaXplIG9mIHRoZSBtb3N0IHJlY2VudGx5IHNlZW4gaW5wdXQgZGVjbGFyYXRpb24KKyAgICAqIHRoYXQgd2FzIGEgc2l6ZWQgYXJyYXksIG9yIDAgaWYgbm8gc2l6ZWQgaW5wdXQgYXJyYXkgZGVjbGFyYXRpb25zIGhhdmUKKyAgICAqIGJlZW4gc2Vlbi4KKyAgICAqCisgICAgKiBVbnVzZWQgZm9yIG90aGVyIHNoYWRlciB0eXBlcy4KKyAgICAqLworICAgdW5zaWduZWQgZ3NfaW5wdXRfc2l6ZTsKKworICAgYm9vbCBlYXJseV9mcmFnbWVudF90ZXN0czsKKworICAgLyoqIEF0b21pYyBjb3VudGVyIG9mZnNldHMgYnkgYmluZGluZyAqLworICAgdW5zaWduZWQgYXRvbWljX2NvdW50ZXJfb2Zmc2V0c1tNQVhfQ09NQklORURfQVRPTUlDX0JVRkZFUlNdOworfTsKKworIyBkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgIGlmIChOKQkJCQkJCQlcCisgICB7CQkJCQkJCQlcCisgICAgICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gWVlSSFNMT0MoUmhzLCAxKS5maXJzdF9saW5lOwlcCisgICAgICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKKyAgICAgIChDdXJyZW50KS5sYXN0X2xpbmUgICAgPSBZWVJIU0xPQyhSaHMsIE4pLmxhc3RfbGluZTsJXAorICAgICAgKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DKFJocywgTikubGFzdF9jb2x1bW47CVwKKyAgIH0JCQkJCQkJCVwKKyAgIGVsc2UJCQkJCQkJCVwKKyAgIHsJCQkJCQkJCVwKKyAgICAgIChDdXJyZW50KS5maXJzdF9saW5lICAgPSAoQ3VycmVudCkubGFzdF9saW5lID0JCVwKKwkgWVlSSFNMT0MoUmhzLCAwKS5sYXN0X2xpbmU7CQkJCVwKKyAgICAgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSAoQ3VycmVudCkubGFzdF9jb2x1bW4gPQkJXAorCSBZWVJIU0xPQyhSaHMsIDApLmxhc3RfY29sdW1uOwkJCQlcCisgICB9CQkJCQkJCQlcCisgICAoQ3VycmVudCkuc291cmNlID0gMDsJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qKgorICogRW1pdCBhIHdhcm5pbmcgdG8gdGhlIHNoYWRlciBsb2cKKyAqCisgKiBcc2EgX21lc2FfZ2xzbF9lcnJvcgorICovCitleHRlcm4gdm9pZCBfbWVzYV9nbHNsX3dhcm5pbmcoY29uc3QgWVlMVFlQRSAqbG9jcCwKKwkJCSAgICAgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK2V4dGVybiB2b2lkIF9tZXNhX2dsc2xfbGV4ZXJfY3RvcihzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisJCQkJICBjb25zdCBjaGFyICpzdHJpbmcpOworCitleHRlcm4gdm9pZCBfbWVzYV9nbHNsX2xleGVyX2R0b3Ioc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKwordW5pb24gWVlTVFlQRTsKK2V4dGVybiBpbnQgX21lc2FfZ2xzbF9sZXhlcl9sZXgodW5pb24gWVlTVFlQRSAqeXlsdmFsLCBZWUxUWVBFICp5eWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNjYW5uZXIpOworCitleHRlcm4gaW50IF9tZXNhX2dsc2xfcGFyc2Uoc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKik7CisKKy8qKgorICogUHJvY2VzcyBlbGVtZW50cyBvZiB0aGUgI2V4dGVuc2lvbiBkaXJlY3RpdmUKKyAqCisgKiBccmV0dXJuCisgKiBJZiBcYyBuYW1lIGFuZCBcYyBiZWhhdmlvciBhcmUgdmFsaWQsIFxjIHRydWUgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UKKyAqIFxjIGZhbHNlIGlzIHJldHVybmVkLgorICovCitleHRlcm4gYm9vbCBfbWVzYV9nbHNsX3Byb2Nlc3NfZXh0ZW5zaW9uKGNvbnN0IGNoYXIgKm5hbWUsIFlZTFRZUEUgKm5hbWVfbG9jcCwKKwkJCQkJIGNvbnN0IGNoYXIgKmJlaGF2aW9yLAorCQkJCQkgWVlMVFlQRSAqYmVoYXZpb3JfbG9jcCwKKwkJCQkJIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUaGVzZSBkZWZpbml0aW9ucyBhcHBseSB0byBDIGFuZCBDKysKKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEdldCB0aGUgdGV4dHVhbCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgc2hhZGVyIHN0YWdlICh3aGljaCBpcyBhCisgKiBnbF9zaGFkZXJfc3RhZ2UpLgorICovCitleHRlcm4gY29uc3QgY2hhciAqCitfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKHVuc2lnbmVkIHN0YWdlKTsKKworZXh0ZXJuIGludCBnbGNwcF9wcmVwcm9jZXNzKHZvaWQgKmN0eCwgY29uc3QgY2hhciAqKnNoYWRlciwgY2hhciAqKmluZm9fbG9nLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9leHRlbnNpb25zICpleHRlbnNpb25zLCBzdHJ1Y3QgZ2xfY29udGV4dCAqZ2xfY3R4KTsKKworZXh0ZXJuIHZvaWQgX21lc2FfY3JlYXRlX3NoYWRlcl9jb21waWxlcih2b2lkKTsKK2V4dGVybiB2b2lkIF9tZXNhX2Rlc3Ryb3lfc2hhZGVyX2NvbXBpbGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgX21lc2FfZGVzdHJveV9zaGFkZXJfY29tcGlsZXJfY2FjaGVzKHZvaWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIEdMU0xfUEFSU0VSX0VYVFJBU19IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9nbHNsX3R5cGVzLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9nbHNsX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhY2U1OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2dsc2xfdHlwZXMuaApAQCAtMCwwICsxLDcxMSBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgR0xTTF9UWVBFU19ICisjZGVmaW5lIEdMU0xfVFlQRVNfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIgLyogZm9yIGdsX3RleHR1cmVfaW5kZXgsIEMrKydzIGVudW0gcnVsZXMgYXJlIGJyb2tlbiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlOworc3RydWN0IGdsc2xfc3ltYm9sX3RhYmxlOworCitleHRlcm4gdm9pZAorX21lc2FfZ2xzbF9pbml0aWFsaXplX3R5cGVzKHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9nbHNsX3JlbGVhc2VfdHlwZXModm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2VudW0gZ2xzbF9iYXNlX3R5cGUgeworICAgR0xTTF9UWVBFX1VJTlQgPSAwLAorICAgR0xTTF9UWVBFX0lOVCwKKyAgIEdMU0xfVFlQRV9GTE9BVCwKKyAgIEdMU0xfVFlQRV9CT09MLAorICAgR0xTTF9UWVBFX1NBTVBMRVIsCisgICBHTFNMX1RZUEVfSU1BR0UsCisgICBHTFNMX1RZUEVfQVRPTUlDX1VJTlQsCisgICBHTFNMX1RZUEVfU1RSVUNULAorICAgR0xTTF9UWVBFX0lOVEVSRkFDRSwKKyAgIEdMU0xfVFlQRV9BUlJBWSwKKyAgIEdMU0xfVFlQRV9WT0lELAorICAgR0xTTF9UWVBFX0VSUk9SCit9OworCitlbnVtIGdsc2xfc2FtcGxlcl9kaW0geworICAgR0xTTF9TQU1QTEVSX0RJTV8xRCA9IDAsCisgICBHTFNMX1NBTVBMRVJfRElNXzJELAorICAgR0xTTF9TQU1QTEVSX0RJTV8zRCwKKyAgIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwKKyAgIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwKKyAgIEdMU0xfU0FNUExFUl9ESU1fQlVGLAorICAgR0xTTF9TQU1QTEVSX0RJTV9FWFRFUk5BTCwKKyAgIEdMU0xfU0FNUExFUl9ESU1fTVMKK307CisKK2VudW0gZ2xzbF9pbnRlcmZhY2VfcGFja2luZyB7CisgICBHTFNMX0lOVEVSRkFDRV9QQUNLSU5HX1NURDE0MCwKKyAgIEdMU0xfSU5URVJGQUNFX1BBQ0tJTkdfU0hBUkVELAorICAgR0xTTF9JTlRFUkZBQ0VfUEFDS0lOR19QQUNLRUQKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgIkdML2dsLmgiCisjaW5jbHVkZSAicmFsbG9jLmgiCisjaW5jbHVkZSAibWVtb3J5X3dyaXRlci5oIgorI2luY2x1ZGUgIm1lbW9yeV9tYXAuaCIKKworc3RydWN0IGdsc2xfdHlwZSB7CisgICBHTGVudW0gZ2xfdHlwZTsKKyAgIGdsc2xfYmFzZV90eXBlIGJhc2VfdHlwZTsKKworICAgdW5zaWduZWQgc2FtcGxlcl9kaW1lbnNpb25hbGl0eTozOyAvKio8IFxzZWUgZ2xzbF9zYW1wbGVyX2RpbSAqLworICAgdW5zaWduZWQgc2FtcGxlcl9zaGFkb3c6MTsKKyAgIHVuc2lnbmVkIHNhbXBsZXJfYXJyYXk6MTsKKyAgIHVuc2lnbmVkIHNhbXBsZXJfdHlwZToyOyAgICAvKio8IFR5cGUgb2YgZGF0YSByZXR1cm5lZCB1c2luZyB0aGlzCisJCQkJKiBzYW1wbGVyIG9yIGltYWdlLiAgT25seSBcYworCQkJCSogR0xTTF9UWVBFX0ZMT0FULCBcYyBHTFNMX1RZUEVfSU5ULAorCQkJCSogYW5kIFxjIEdMU0xfVFlQRV9VSU5UIGFyZSB2YWxpZC4KKwkJCQkqLworICAgdW5zaWduZWQgaW50ZXJmYWNlX3BhY2tpbmc6MjsKKworICAgLyogQ2FsbGVycyBvZiB0aGlzIHJhbGxvYy1iYXNlZCBuZXcgbmVlZCBub3QgY2FsbCBkZWxldGUuIEl0J3MKKyAgICAqIGVhc2llciB0byBqdXN0IHJhbGxvY19mcmVlICdtZW1fY3R4JyAob3IgYW55IG9mIGl0cyBhbmNlc3RvcnMpLiAqLworICAgc3RhdGljIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSkKKyAgIHsKKyAgICAgIG10eF9sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKKworICAgICAgLyogbWVtX2N0eCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIHN0YXRpYyBtZW1iZXJzICovCisgICAgICBhc3NlcnQoZ2xzbF90eXBlOjptZW1fY3R4ICE9IE5VTEwpOworCisgICAgICB2b2lkICp0eXBlOworCisgICAgICB0eXBlID0gcmFsbG9jX3NpemUoZ2xzbF90eXBlOjptZW1fY3R4LCBzaXplKTsKKyAgICAgIGFzc2VydCh0eXBlICE9IE5VTEwpOworCisgICAgICBtdHhfdW5sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKKworICAgICAgcmV0dXJuIHR5cGU7CisgICB9CisKKyAgIC8qIElmIHRoZSB1c2VyICpkb2VzKiBjYWxsIGRlbGV0ZSwgdGhhdCdzIE9LLCB3ZSB3aWxsIGp1c3QKKyAgICAqIHJhbGxvY19mcmVlIGluIHRoYXQgY2FzZS4gKi8KKyAgIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICp0eXBlKQorICAgeworICAgICAgbXR4X2xvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworICAgICAgcmFsbG9jX2ZyZWUodHlwZSk7CisgICAgICBtdHhfdW5sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKKyAgIH0KKworICAgLyoqCisgICAgKiBTZXJpYWxpemF0aW9uIGZ1bmN0aW9uYWxpdHkgdXNlZCBieSBiaW5hcnkgc2hhZGVycy4KKyAgICAqLworICAgdm9pZCBzZXJpYWxpemUobWVtb3J5X3dyaXRlciAmbWVtKSBjb25zdDsKKworICAgLyoqCisgICAgKiBEZXNlcmlhbGl6YXRpb24gZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IGJpbmFyeSBzaGFkZXJzLAorICAgICogc3RhdGUgYW5kIHR5cGVfaGFzaCBhcmUgaGVscGVyIHN0cnVjdHVyZXMgbWFuYWdlZCBieSB0aGUKKyAgICAqIGlyX2Rlc2VyaWFsaXplciBjbGFzcy4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICpkZXNlcmlhbGl6ZShtZW1vcnlfbWFwICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhhc2hfdGFibGUgKnR5cGVfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzaF92YWx1ZSk7CisKKyAgIC8qKgorICAgICogXG5hbWUgVmVjdG9yIGFuZCBtYXRyaXggZWxlbWVudCBjb3VudHMKKyAgICAqCisgICAgKiBGb3Igc2NhbGFycywgZWFjaCBvZiB0aGVzZSB2YWx1ZXMgd2lsbCBiZSAxLiAgRm9yIG5vbi1udW1lcmljIHR5cGVzCisgICAgKiB0aGVzZSB3aWxsIGJlIDAuCisgICAgKi8KKyAgIC8qQHsqLworICAgdW5zaWduZWQgdmVjdG9yX2VsZW1lbnRzOjM7IC8qKjwgMSwgMiwgMywgb3IgNCB2ZWN0b3IgZWxlbWVudHMuICovCisgICB1bnNpZ25lZCBtYXRyaXhfY29sdW1uczozOyAgLyoqPCAxLCAyLCAzLCBvciA0IG1hdHJpeCBjb2x1bW5zLiAqLworICAgLypAfSovCisKKyAgIC8qKgorICAgICogTmFtZSBvZiB0aGUgZGF0YSB0eXBlCisgICAgKgorICAgICogV2lsbCBuZXZlciBiZSBcYyBOVUxMLgorICAgICovCisgICBjb25zdCBjaGFyICpuYW1lOworCisgICAvKioKKyAgICAqIEZvciBcYyBHTFNMX1RZUEVfQVJSQVksIHRoaXMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuICBGb3IKKyAgICAqIFxjIEdMU0xfVFlQRV9TVFJVQ1Qgb3IgXGMgR0xTTF9UWVBFX0lOVEVSRkFDRSwgaXQgaXMgdGhlIG51bWJlciBvZgorICAgICogZWxlbWVudHMgaW4gdGhlIHN0cnVjdHVyZSBhbmQgdGhlIG51bWJlciBvZiB2YWx1ZXMgcG9pbnRlZCB0byBieQorICAgICogXGMgZmllbGRzLnN0cnVjdHVyZSAoYmVsb3cpLgorICAgICovCisgICB1bnNpZ25lZCBsZW5ndGg7CisKKyAgIC8qKgorICAgICogU3VidHlwZSBvZiBjb21wb3NpdGUgZGF0YSB0eXBlcy4KKyAgICAqLworICAgdW5pb24geworICAgICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqYXJyYXk7ICAgICAgICAgICAgLyoqPCBUeXBlIG9mIGFycmF5IGVsZW1lbnRzLiAqLworICAgICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqcGFyYW1ldGVyczsgICAgICAgLyoqPCBQYXJhbWV0ZXJzIHRvIGZ1bmN0aW9uLiAqLworICAgICAgc3RydWN0IGdsc2xfc3RydWN0X2ZpZWxkICpzdHJ1Y3R1cmU7ICAgICAgLyoqPCBMaXN0IG9mIHN0cnVjdCBmaWVsZHMuICovCisgICB9IGZpZWxkczsKKworICAgLyoqCisgICAgKiBcbmFtZSBQb2ludGVycyB0byB2YXJpb3VzIHB1YmxpYyB0eXBlIHNpbmdsZXRvbnMKKyAgICAqLworICAgLypAeyovCisjdW5kZWYgIERFQ0xfVFlQRQorI2RlZmluZSBERUNMX1RZUEUoTkFNRSwgLi4uKSBcCisgICBzdGF0aWMgY29uc3QgZ2xzbF90eXBlICpjb25zdCBOQU1FIyNfdHlwZTsKKyN1bmRlZiAgU1RSVUNUX1RZUEUKKyNkZWZpbmUgU1RSVUNUX1RZUEUoTkFNRSkgXAorICAgc3RhdGljIGNvbnN0IGdsc2xfdHlwZSAqY29uc3Qgc3RydWN0XyMjTkFNRSMjX3R5cGU7CisjaW5jbHVkZSAiYnVpbHRpbl90eXBlX21hY3Jvcy5oIgorICAgLypAfSovCisKKyAgIC8qKgorICAgICogQ29udmVuaWVuY2UgYWNjZXNzb3JzIGZvciB2ZWN0b3IgdHlwZXMgKHNob3J0ZXIgdGhhbiBnZXRfaW5zdGFuY2UoKSkuCisgICAgKiBAeworICAgICovCisgICBzdGF0aWMgY29uc3QgZ2xzbF90eXBlICp2ZWModW5zaWduZWQgY29tcG9uZW50cyk7CisgICBzdGF0aWMgY29uc3QgZ2xzbF90eXBlICppdmVjKHVuc2lnbmVkIGNvbXBvbmVudHMpOworICAgc3RhdGljIGNvbnN0IGdsc2xfdHlwZSAqdXZlYyh1bnNpZ25lZCBjb21wb25lbnRzKTsKKyAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgKmJ2ZWModW5zaWduZWQgY29tcG9uZW50cyk7CisgICAvKipAfSovCisKKyAgIC8qKgorICAgICogRm9yIG51bWVyaWMgYW5kIGJvb2xlYW4gZGVyaXZlZCB0eXBlcyByZXR1cm5zIHRoZSBiYXNpYyBzY2FsYXIgdHlwZQorICAgICoKKyAgICAqIElmIHRoZSB0eXBlIGlzIGEgbnVtZXJpYyBvciBib29sZWFuIHNjYWxhciwgdmVjdG9yLCBvciBtYXRyaXggdHlwZSwKKyAgICAqIHRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cy4gIEZvcgorICAgICogYWxsIG90aGVyIHR5cGVzLCBpbmNsdWRpbmcgYXJyYXlzIG9mIG51bWVyaWMgb3IgYm9vbGVhbiB0eXBlcywgdGhlCisgICAgKiBlcnJvciB0eXBlIGlzIHJldHVybmVkLgorICAgICovCisgICBjb25zdCBnbHNsX3R5cGUgKmdldF9iYXNlX3R5cGUoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBHZXQgdGhlIGJhc2ljIHNjYWxhciB0eXBlIHdoaWNoIHRoaXMgdHlwZSBhZ2dyZWdhdGVzLgorICAgICoKKyAgICAqIElmIHRoZSB0eXBlIGlzIGEgbnVtZXJpYyBvciBib29sZWFuIHNjYWxhciwgdmVjdG9yLCBvciBtYXRyaXgsIG9yIGFuCisgICAgKiBhcnJheSBvZiBhbnkgb2YgdGhvc2UsIHRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlCisgICAgKiBpbmRpdmlkdWFsIGNvbXBvbmVudHMuICBGb3Igc3RydWN0cyBhbmQgYXJyYXlzIG9mIHN0cnVjdHMsIHRoaXMgZnVuY3Rpb24KKyAgICAqIHJldHVybnMgdGhlIHN0cnVjdCB0eXBlLiAgRm9yIHNhbXBsZXJzIGFuZCBhcnJheXMgb2Ygc2FtcGxlcnMsIHRoaXMKKyAgICAqIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbXBsZXIgdHlwZS4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICpnZXRfc2NhbGFyX3R5cGUoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBRdWVyeSB0aGUgdHlwZSBvZiBlbGVtZW50cyBpbiBhbiBhcnJheQorICAgICoKKyAgICAqIFxyZXR1cm4KKyAgICAqIFBvaW50ZXIgdG8gdGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IGZvciBhcnJheSB0eXBlcywgb3IgXGMgTlVMTAorICAgICogZm9yIG5vbi1hcnJheSB0eXBlcy4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICplbGVtZW50X3R5cGUoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIGlzX2FycmF5KCkgPyBmaWVsZHMuYXJyYXkgOiBOVUxMOworICAgfQorCisgICAvKioKKyAgICAqIEdldCB0aGUgaW5zdGFuY2Ugb2YgYSBidWlsdC1pbiBzY2FsYXIsIHZlY3Rvciwgb3IgbWF0cml4IHR5cGUKKyAgICAqLworICAgc3RhdGljIGNvbnN0IGdsc2xfdHlwZSAqZ2V0X2luc3RhbmNlKHVuc2lnbmVkIGJhc2VfdHlwZSwgdW5zaWduZWQgcm93cywKKwkJCQkJdW5zaWduZWQgY29sdW1ucyk7CisKKyAgIC8qKgorICAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiBhbiBhcnJheSB0eXBlCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgKmdldF9hcnJheV9pbnN0YW5jZShjb25zdCBnbHNsX3R5cGUgKmJhc2UsCisJCQkJCSAgICAgIHVuc2lnbmVkIGVsZW1lbnRzKTsKKworICAgLyoqCisgICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIGEgcmVjb3JkIHR5cGUKKyAgICAqLworICAgc3RhdGljIGNvbnN0IGdsc2xfdHlwZSAqZ2V0X3JlY29yZF9pbnN0YW5jZShjb25zdCBnbHNsX3N0cnVjdF9maWVsZCAqZmllbGRzLAorCQkJCQkgICAgICAgdW5zaWduZWQgbnVtX2ZpZWxkcywKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAvKioKKyAgICAqIEdldCB0aGUgaW5zdGFuY2Ugb2YgYW4gaW50ZXJmYWNlIGJsb2NrIHR5cGUKKyAgICAqLworICAgc3RhdGljIGNvbnN0IGdsc2xfdHlwZSAqZ2V0X2ludGVyZmFjZV9pbnN0YW5jZShjb25zdCBnbHNsX3N0cnVjdF9maWVsZCAqZmllbGRzLAorCQkJCQkJICB1bnNpZ25lZCBudW1fZmllbGRzLAorCQkJCQkJICBlbnVtIGdsc2xfaW50ZXJmYWNlX3BhY2tpbmcgcGFja2luZywKKwkJCQkJCSAgY29uc3QgY2hhciAqYmxvY2tfbmFtZSk7CisKKyAgIC8qKgorICAgICogUXVlcnkgdGhlIHRvdGFsIG51bWJlciBvZiBzY2FsYXJzIHRoYXQgbWFrZSB1cCBhIHNjYWxhciwgdmVjdG9yIG9yIG1hdHJpeAorICAgICovCisgICB1bnNpZ25lZCBjb21wb25lbnRzKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiB2ZWN0b3JfZWxlbWVudHMgKiBtYXRyaXhfY29sdW1uczsKKyAgIH0KKworICAgLyoqCisgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHNsb3RzIHJlcXVpcmVkIHRvIGhvbGQgdGhpcyB0eXBlCisgICAgKgorICAgICogVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgbWFueSB1bmlmb3JtIG9yIHZhcnlpbmcgbG9jYXRpb25zIGEgdHlwZQorICAgICogbWlnaHQgb2NjdXB5LgorICAgICovCisgICB1bnNpZ25lZCBjb21wb25lbnRfc2xvdHMoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgc2xvdHMgcmVxdWlyZWQgdG8gaG9sZCB0aGlzIHR5cGUKKyAgICAqCisgICAgKiBUaGlzIGltcGxlbWVudHMgdGhlIGxhbmd1YWdlIHJ1bGVzIG9mIEdMU0wgMS41MCBmb3IgY291bnRpbmcgdGhlIG51bWJlcgorICAgICogb2Ygc2xvdHMgdXNlZCBieSBhIHZlcnRleCBhdHRyaWJ1dGUuICBJdCBhbHNvIGRldGVybWluZXMgdGhlIG51bWJlciBvZgorICAgICogdmFyeWluZyBzbG90cyB0aGUgdHlwZSB3aWxsIHVzZSB1cCBpbiB0aGUgYWJzZW5jZSBvZiB2YXJ5aW5nIHBhY2tpbmcKKyAgICAqIChhbmQgdGh1cywgaXQgY2FuIGJlIHVzZWQgdG8gbWVhc3VyZSB0aGUgbnVtYmVyIG9mIHZhcnlpbmcgc2xvdHMgdXNlZCBieQorICAgICogdGhlIHZhcnlpbmdzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBsb3dlcl9wYWNrZWRfdmFyeWluZ3MpLgorICAgICovCisgICB1bnNpZ25lZCBjb3VudF9hdHRyaWJ1dGVfc2xvdHMoKSBjb25zdDsKKworCisgICAvKioKKyAgICAqIEFsaWdubWVudCBpbiBieXRlcyBvZiB0aGUgc3RhcnQgb2YgdGhpcyB0eXBlIGluIGEgc3RkMTQwIHVuaWZvcm0KKyAgICAqIGJsb2NrLgorICAgICovCisgICB1bnNpZ25lZCBzdGQxNDBfYmFzZV9hbGlnbm1lbnQoYm9vbCByb3dfbWFqb3IpIGNvbnN0OworCisgICAvKiogU2l6ZSBpbiBieXRlcyBvZiB0aGlzIHR5cGUgaW4gYSBzdGQxNDAgdW5pZm9ybSBibG9jay4KKyAgICAqCisgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgR0xfVU5JRk9STV9TSVpFICh3aGljaCBpcyB0aGUgbnVtYmVyIG9mCisgICAgKiBlbGVtZW50cyBpbiB0aGUgYXJyYXkpCisgICAgKi8KKyAgIHVuc2lnbmVkIHN0ZDE0MF9zaXplKGJvb2wgcm93X21ham9yKSBjb25zdDsKKworICAgLyoqCisgICAgKiBcYnJpZWYgQ2FuIHRoaXMgdHlwZSBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhbm90aGVyPworICAgICoKKyAgICAqIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgdHlwZXMgYXJlIGlkZW50aWNhbCBvciBpZiB0aGlzIHR5cGUgY2FuIGJlIGNvbnZlcnRlZAorICAgICogICAgICAgICB0byBcYyBkZXNpcmVkIGFjY29yZGluZyB0byBTZWN0aW9uIDQuMS4xMCBvZiB0aGUgR0xTTCBzcGVjLgorICAgICoKKyAgICAqIFx2ZXJiYXRpbQorICAgICogRnJvbSBwYWdlIDI1ICgzMSBvZiB0aGUgcGRmKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWMsIFNlY3Rpb24gNC4xLjEwCisgICAgKiBJbXBsaWNpdCBDb252ZXJzaW9uczoKKyAgICAqCisgICAgKiAgICAgSW4gc29tZSBzaXR1YXRpb25zLCBhbiBleHByZXNzaW9uIGFuZCBpdHMgdHlwZSB3aWxsIGJlIGltcGxpY2l0bHkKKyAgICAqICAgICBjb252ZXJ0ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZS4gVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyBhbGwgYWxsb3dlZAorICAgICogICAgIGltcGxpY2l0IGNvbnZlcnNpb25zOgorICAgICoKKyAgICAqICAgICBUeXBlIG9mIGV4cHJlc3Npb24gfCBDYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8KKyAgICAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICogICAgIGludCAgICAgICAgICAgICAgICAgIGZsb2F0CisgICAgKiAgICAgdWludAorICAgICoKKyAgICAqICAgICBpdmVjMiAgICAgICAgICAgICAgICB2ZWMyCisgICAgKiAgICAgdXZlYzIKKyAgICAqCisgICAgKiAgICAgaXZlYzMgICAgICAgICAgICAgICAgdmVjMworICAgICogICAgIHV2ZWMzCisgICAgKgorICAgICogICAgIGl2ZWM0ICAgICAgICAgICAgICAgIHZlYzQKKyAgICAqICAgICB1dmVjNAorICAgICoKKyAgICAqICAgICBUaGVyZSBhcmUgbm8gaW1wbGljaXQgYXJyYXkgb3Igc3RydWN0dXJlIGNvbnZlcnNpb25zLiBGb3IgZXhhbXBsZSwKKyAgICAqICAgICBhbiBhcnJheSBvZiBpbnQgY2Fubm90IGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGFuIGFycmF5IG9mIGZsb2F0LgorICAgICogICAgIFRoZXJlIGFyZSBubyBpbXBsaWNpdCBjb252ZXJzaW9ucyBiZXR3ZWVuIHNpZ25lZCBhbmQgdW5zaWduZWQKKyAgICAqICAgICBpbnRlZ2Vycy4KKyAgICAqIFxlbmR2ZXJiYXRpbQorICAgICovCisgICBib29sIGNhbl9pbXBsaWNpdGx5X2NvbnZlcnRfdG8oY29uc3QgZ2xzbF90eXBlICpkZXNpcmVkKSBjb25zdDsKKworICAgLyoqCisgICAgKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCBhIHR5cGUgaXMgYSBzY2FsYXIgKG5vbi12ZWN0b3IgYW5kIG5vbi1tYXRyaXgpLgorICAgICovCisgICBib29sIGlzX3NjYWxhcigpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gKHZlY3Rvcl9lbGVtZW50cyA9PSAxKQorCSAmJiAoYmFzZV90eXBlID49IEdMU0xfVFlQRV9VSU5UKQorCSAmJiAoYmFzZV90eXBlIDw9IEdMU0xfVFlQRV9CT09MKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCBhIHR5cGUgaXMgYSB2ZWN0b3IKKyAgICAqLworICAgYm9vbCBpc192ZWN0b3IoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuICh2ZWN0b3JfZWxlbWVudHMgPiAxKQorCSAmJiAobWF0cml4X2NvbHVtbnMgPT0gMSkKKwkgJiYgKGJhc2VfdHlwZSA+PSBHTFNMX1RZUEVfVUlOVCkKKwkgJiYgKGJhc2VfdHlwZSA8PSBHTFNMX1RZUEVfQk9PTCk7CisgICB9CisKKyAgIC8qKgorICAgICogUXVlcnkgd2hldGhlciBvciBub3QgYSB0eXBlIGlzIGEgbWF0cml4CisgICAgKi8KKyAgIGJvb2wgaXNfbWF0cml4KCkgY29uc3QKKyAgIHsKKyAgICAgIC8qIEdMU0wgb25seSBoYXMgZmxvYXQgbWF0cmljZXMuICovCisgICAgICByZXR1cm4gKG1hdHJpeF9jb2x1bW5zID4gMSkgJiYgKGJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgfQorCisgICAvKioKKyAgICAqIFF1ZXJ5IHdoZXRoZXIgb3Igbm90IGEgdHlwZSBpcyBhIG5vbi1hcnJheSBudW1lcmljIHR5cGUKKyAgICAqLworICAgYm9vbCBpc19udW1lcmljKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiAoYmFzZV90eXBlID49IEdMU0xfVFlQRV9VSU5UKSAmJiAoYmFzZV90eXBlIDw9IEdMU0xfVFlQRV9GTE9BVCk7CisgICB9CisKKyAgIC8qKgorICAgICogUXVlcnkgd2hldGhlciBvciBub3QgYSB0eXBlIGlzIGFuIGludGVncmFsIHR5cGUKKyAgICAqLworICAgYm9vbCBpc19pbnRlZ2VyKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiAoYmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKSB8fCAoYmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpOworICAgfQorCisgICAvKioKKyAgICAqIFF1ZXJ5IHdoZXRoZXIgb3Igbm90IHR5cGUgaXMgYW4gaW50ZWdyYWwgdHlwZSwgb3IgZm9yIHN0cnVjdCBhbmQgYXJyYXkKKyAgICAqIHR5cGVzLCBjb250YWlucyBhbiBpbnRlZ3JhbCB0eXBlLgorICAgICovCisgICBib29sIGNvbnRhaW5zX2ludGVnZXIoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCBhIHR5cGUgaXMgYSBmbG9hdCB0eXBlCisgICAgKi8KKyAgIGJvb2wgaXNfZmxvYXQoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIGJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQ7CisgICB9CisKKyAgIC8qKgorICAgICogUXVlcnkgd2hldGhlciBvciBub3QgYSB0eXBlIGlzIGEgbm9uLWFycmF5IGJvb2xlYW4gdHlwZQorICAgICovCisgICBib29sIGlzX2Jvb2xlYW4oKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIGJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQk9PTDsKKyAgIH0KKworICAgLyoqCisgICAgKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCBhIHR5cGUgaXMgYSBzYW1wbGVyCisgICAgKi8KKyAgIGJvb2wgaXNfc2FtcGxlcigpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gYmFzZV90eXBlID09IEdMU0xfVFlQRV9TQU1QTEVSOworICAgfQorCisgICAvKioKKyAgICAqIFF1ZXJ5IHdoZXRoZXIgb3Igbm90IHR5cGUgaXMgYSBzYW1wbGVyLCBvciBmb3Igc3RydWN0IGFuZCBhcnJheQorICAgICogdHlwZXMsIGNvbnRhaW5zIGEgc2FtcGxlci4KKyAgICAqLworICAgYm9vbCBjb250YWluc19zYW1wbGVyKCkgY29uc3Q7CisKKyAgIC8qKgorICAgICogR2V0IHRoZSBNZXNhIHRleHR1cmUgdGFyZ2V0IGluZGV4IGZvciBhIHNhbXBsZXIgdHlwZS4KKyAgICAqLworICAgZ2xfdGV4dHVyZV9pbmRleCBzYW1wbGVyX2luZGV4KCkgY29uc3Q7CisKKyAgIC8qKgorICAgICogUXVlcnkgd2hldGhlciBvciBub3QgdHlwZSBpcyBhbiBpbWFnZSwgb3IgZm9yIHN0cnVjdCBhbmQgYXJyYXkKKyAgICAqIHR5cGVzLCBjb250YWlucyBhbiBpbWFnZS4KKyAgICAqLworICAgYm9vbCBjb250YWluc19pbWFnZSgpIGNvbnN0OworCisgICAvKioKKyAgICAqIFF1ZXJ5IHdoZXRoZXIgb3Igbm90IGEgdHlwZSBpcyBhbiBpbWFnZQorICAgICovCisgICBib29sIGlzX2ltYWdlKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lNQUdFOworICAgfQorCisgICAvKioKKyAgICAqIFF1ZXJ5IHdoZXRoZXIgb3Igbm90IGEgdHlwZSBpcyBhbiBhcnJheQorICAgICovCisgICBib29sIGlzX2FycmF5KCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0FSUkFZOworICAgfQorCisgICAvKioKKyAgICAqIFF1ZXJ5IHdoZXRoZXIgb3Igbm90IGEgdHlwZSBpcyBhIHJlY29yZAorICAgICovCisgICBib29sIGlzX3JlY29yZCgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gYmFzZV90eXBlID09IEdMU0xfVFlQRV9TVFJVQ1Q7CisgICB9CisKKyAgIC8qKgorICAgICogUXVlcnkgd2hldGhlciBvciBub3QgYSB0eXBlIGlzIGFuIGludGVyZmFjZQorICAgICovCisgICBib29sIGlzX2ludGVyZmFjZSgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gYmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlRFUkZBQ0U7CisgICB9CisKKyAgIC8qKgorICAgICogUXVlcnkgd2hldGhlciBvciBub3QgYSB0eXBlIGlzIHRoZSB2b2lkIHR5cGUgc2luZ2xldG9uLgorICAgICovCisgICBib29sIGlzX3ZvaWQoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIGJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVk9JRDsKKyAgIH0KKworICAgLyoqCisgICAgKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCBhIHR5cGUgaXMgdGhlIGVycm9yIHR5cGUgc2luZ2xldG9uLgorICAgICovCisgICBib29sIGlzX2Vycm9yKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0VSUk9SOworICAgfQorCisgICAvKioKKyAgICAqIFJldHVybiB0aGUgYW1vdW50IG9mIGF0b21pYyBjb3VudGVyIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIGEgdHlwZS4KKyAgICAqLworICAgdW5zaWduZWQgYXRvbWljX3NpemUoKSBjb25zdAorICAgeworICAgICAgaWYgKGJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQVRPTUlDX1VJTlQpCisgICAgICAgICByZXR1cm4gQVRPTUlDX0NPVU5URVJfU0laRTsKKyAgICAgIGVsc2UgaWYgKGlzX2FycmF5KCkpCisgICAgICAgICByZXR1cm4gbGVuZ3RoICogZWxlbWVudF90eXBlKCktPmF0b21pY19zaXplKCk7CisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXR1cm4gd2hldGhlciBhIHR5cGUgY29udGFpbnMgYW55IGF0b21pYyBjb3VudGVycy4KKyAgICAqLworICAgYm9vbCBjb250YWluc19hdG9taWMoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIGF0b21pY19zaXplKCkgPiAwOworICAgfQorCisgICAvKioKKyAgICAqIFJldHVybiB3aGV0aGVyIGEgdHlwZSBjb250YWlucyBhbnkgb3BhcXVlIHR5cGVzLgorICAgICovCisgICBib29sIGNvbnRhaW5zX29wYXF1ZSgpIGNvbnN0OworCisgICAvKioKKyAgICAqIFF1ZXJ5IHRoZSBmdWxsIHR5cGUgb2YgYSBtYXRyaXggcm93CisgICAgKgorICAgICogXHJldHVybgorICAgICogSWYgdGhlIHR5cGUgaXMgbm90IGEgbWF0cml4LCBcYyBnbHNsX3R5cGU6OmVycm9yX3R5cGUgaXMgcmV0dXJuZWQuCisgICAgKiBPdGhlcndpc2UgYSB0eXBlIG1hdGNoaW5nIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggaXMgcmV0dXJuZWQuCisgICAgKi8KKyAgIGNvbnN0IGdsc2xfdHlwZSAqcm93X3R5cGUoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIGlzX21hdHJpeCgpCisJID8gZ2V0X2luc3RhbmNlKGJhc2VfdHlwZSwgbWF0cml4X2NvbHVtbnMsIDEpCisJIDogZXJyb3JfdHlwZTsKKyAgIH0KKworICAgLyoqCisgICAgKiBRdWVyeSB0aGUgZnVsbCB0eXBlIG9mIGEgbWF0cml4IGNvbHVtbgorICAgICoKKyAgICAqIFxyZXR1cm4KKyAgICAqIElmIHRoZSB0eXBlIGlzIG5vdCBhIG1hdHJpeCwgXGMgZ2xzbF90eXBlOjplcnJvcl90eXBlIGlzIHJldHVybmVkLgorICAgICogT3RoZXJ3aXNlIGEgdHlwZSBtYXRjaGluZyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4IGlzIHJldHVybmVkLgorICAgICovCisgICBjb25zdCBnbHNsX3R5cGUgKmNvbHVtbl90eXBlKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBpc19tYXRyaXgoKQorCSA/IGdldF9pbnN0YW5jZShiYXNlX3R5cGUsIHZlY3Rvcl9lbGVtZW50cywgMSkKKwkgOiBlcnJvcl90eXBlOworICAgfQorCisgICAvKioKKyAgICAqIEdldCB0aGUgdHlwZSBvZiBhIHN0cnVjdHVyZSBmaWVsZAorICAgICoKKyAgICAqIFxyZXR1cm4KKyAgICAqIFBvaW50ZXIgdG8gdGhlIHR5cGUgb2YgdGhlIG5hbWVkIGZpZWxkLiAgSWYgdGhlIHR5cGUgaXMgbm90IGEgc3RydWN0dXJlCisgICAgKiBvciB0aGUgbmFtZWQgZmllbGQgZG9lcyBub3QgZXhpc3QsIFxjIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZSBpcyByZXR1cm5lZC4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICpmaWVsZF90eXBlKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworCisgICAvKioKKyAgICAqIEdldCB0aGUgbG9jYXRpb24gb2YgYSBmaWxlZCB3aXRoaW4gYSByZWNvcmQgdHlwZQorICAgICovCisgICBpbnQgZmllbGRfaW5kZXgoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisKKyAgIC8qKgorICAgICogUXVlcnkgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSB0eXBlCisgICAgKgorICAgICogXHJldHVybgorICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgZm9yIGFycmF5IHR5cGVzIG9yIC0xIGZvciBub24tYXJyYXkKKyAgICAqIHR5cGVzLiAgSWYgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgaGFzIG5vdCB5ZXQgYmVlbiBkZWNsYXJlZCwKKyAgICAqIHplcm8gaXMgcmV0dXJuZWQuCisgICAgKi8KKyAgIGludCBhcnJheV9zaXplKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBpc19hcnJheSgpID8gbGVuZ3RoIDogLTE7CisgICB9CisKKyAgIC8qKgorICAgICogUXVlcnkgd2hldGhlciB0aGUgYXJyYXkgc2l6ZSBmb3IgYWxsIGRpbWVuc2lvbnMgaGFzIGJlZW4gZGVjbGFyZWQuCisgICAgKi8KKyAgIGJvb2wgaXNfdW5zaXplZF9hcnJheSgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gaXNfYXJyYXkoKSAmJiBsZW5ndGggPT0gMDsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb29yZGluYXRlIGNvbXBvbmVudHMgbmVlZGVkIGZvciB0aGlzCisgICAgKiBzYW1wbGVyIG9yIGltYWdlIHR5cGUuCisgICAgKgorICAgICogVGhpcyBpcyBiYXNlZCBwdXJlbHkgb24gdGhlIHNhbXBsZXIncyBkaW1lbnNpb25hbGl0eS4gIEZvciBleGFtcGxlLCB0aGlzCisgICAgKiByZXR1cm5zIDEgZm9yIHNhbXBsZXIxRCwgYW5kIDMgZm9yIHNhbXBsZXIyREFycmF5LgorICAgICoKKyAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9mdGVuIGRpZmZlcmVudCB0aGFuIGFjdHVhbCBjb29yZGluYXRlIHR5cGUgdXNlZCBpbgorICAgICogYSB0ZXh0dXJpbmcgYnVpbHQtaW4gZnVuY3Rpb24sIHNpbmNlIHRob3NlIHBhY2sgYWRkaXRpb25hbCB2YWx1ZXMgKHN1Y2gKKyAgICAqIGFzIHRoZSBzaGFkb3cgY29tcGFyaXRvciBvciBwcm9qZWN0b3IpIGludG8gdGhlIGNvb3JkaW5hdGUgdHlwZS4KKyAgICAqLworICAgaW50IGNvb3JkaW5hdGVfY29tcG9uZW50cygpIGNvbnN0OworCisgICAvKioKKyAgICAqIENvbXBhcmUgYSByZWNvcmQgdHlwZSBhZ2FpbnN0IGFub3RoZXIgcmVjb3JkIHR5cGUuCisgICAgKgorICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIG1hdGNoaW5nIHJlY29yZCB0eXBlcyBkZWNsYXJlZCBhY3Jvc3Mgc2hhZGVyIHN0YWdlcy4KKyAgICAqLworICAgYm9vbCByZWNvcmRfY29tcGFyZShjb25zdCBnbHNsX3R5cGUgKmIpIGNvbnN0OworCitwcml2YXRlOgorCisgICBzdGF0aWMgbXR4X3QgbXV0ZXg7CisKKyAgIC8qKgorICAgICogcmFsbG9jIGNvbnRleHQgZm9yIGFsbCBnbHNsX3R5cGUgYWxsb2NhdGlvbnMKKyAgICAqCisgICAgKiBTZXQgb24gdGhlIGZpcnN0IGNhbGwgdG8gXGMgZ2xzbF90eXBlOjpuZXcuCisgICAgKi8KKyAgIHN0YXRpYyB2b2lkICptZW1fY3R4OworCisgICB2b2lkIGluaXRfcmFsbG9jX3R5cGVfY3R4KHZvaWQpOworCisgICAvKiogQ29uc3RydWN0b3IgZm9yIHZlY3RvciBhbmQgbWF0cml4IHR5cGVzICovCisgICBnbHNsX3R5cGUoR0xlbnVtIGdsX3R5cGUsCisJICAgICBnbHNsX2Jhc2VfdHlwZSBiYXNlX3R5cGUsIHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50cywKKwkgICAgIHVuc2lnbmVkIG1hdHJpeF9jb2x1bW5zLCBjb25zdCBjaGFyICpuYW1lKTsKKworICAgLyoqIENvbnN0cnVjdG9yIGZvciBzYW1wbGVyIG9yIGltYWdlIHR5cGVzICovCisgICBnbHNsX3R5cGUoR0xlbnVtIGdsX3R5cGUsIGdsc2xfYmFzZV90eXBlIGJhc2VfdHlwZSwKKwkgICAgIGVudW0gZ2xzbF9zYW1wbGVyX2RpbSBkaW0sIGJvb2wgc2hhZG93LCBib29sIGFycmF5LAorCSAgICAgdW5zaWduZWQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgcmVjb3JkIHR5cGVzICovCisgICBnbHNsX3R5cGUoY29uc3QgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkcywgdW5zaWduZWQgbnVtX2ZpZWxkcywKKwkgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAvKiogQ29uc3RydWN0b3IgZm9yIGludGVyZmFjZSB0eXBlcyAqLworICAgZ2xzbF90eXBlKGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZHMsIHVuc2lnbmVkIG51bV9maWVsZHMsCisJICAgICBlbnVtIGdsc2xfaW50ZXJmYWNlX3BhY2tpbmcgcGFja2luZywgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgYXJyYXkgdHlwZXMgKi8KKyAgIGdsc2xfdHlwZShjb25zdCBnbHNsX3R5cGUgKmFycmF5LCB1bnNpZ25lZCBsZW5ndGgpOworCisgICAvKiogSGFzaCB0YWJsZSBjb250YWluaW5nIHRoZSBrbm93biBhcnJheSB0eXBlcy4gKi8KKyAgIHN0YXRpYyBzdHJ1Y3QgaGFzaF90YWJsZSAqYXJyYXlfdHlwZXM7CisKKyAgIC8qKiBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGtub3duIHJlY29yZCB0eXBlcy4gKi8KKyAgIHN0YXRpYyBzdHJ1Y3QgaGFzaF90YWJsZSAqcmVjb3JkX3R5cGVzOworCisgICAvKiogSGFzaCB0YWJsZSBjb250YWluaW5nIHRoZSBrbm93biBpbnRlcmZhY2UgdHlwZXMuICovCisgICBzdGF0aWMgc3RydWN0IGhhc2hfdGFibGUgKmludGVyZmFjZV90eXBlczsKKworICAgc3RhdGljIGludCByZWNvcmRfa2V5X2NvbXBhcmUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CisgICBzdGF0aWMgdW5zaWduZWQgcmVjb3JkX2tleV9oYXNoKGNvbnN0IHZvaWQgKmtleSk7CisKKyAgIC8qKgorICAgICogXG5hbWUgQnVpbHQtaW4gdHlwZSBmbHl3ZWlnaHRzCisgICAgKi8KKyAgIC8qQHsqLworI3VuZGVmICBERUNMX1RZUEUKKyNkZWZpbmUgREVDTF9UWVBFKE5BTUUsIC4uLikgc3RhdGljIGNvbnN0IGdsc2xfdHlwZSBfIyNOQU1FIyNfdHlwZTsKKyN1bmRlZiAgU1RSVUNUX1RZUEUKKyNkZWZpbmUgU1RSVUNUX1RZUEUoTkFNRSkgICAgICAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgX3N0cnVjdF8jI05BTUUjI190eXBlOworI2luY2x1ZGUgImJ1aWx0aW5fdHlwZV9tYWNyb3MuaCIKKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIFxuYW1lIEZyaWVuZCBmdW5jdGlvbnMuCisgICAgKgorICAgICogVGhlc2UgZnVuY3Rpb25zIGFyZSBmcmllbmRzIGJlY2F1c2UgdGhleSBtdXN0IGhhdmUgQyBsaW5rYWdlIGFuZCB0aGUKKyAgICAqIG5lZWQgdG8gY2FsbCB2YXJpb3VzIHByaXZhdGUgbWV0aG9kcyBvciBhY2Nlc3MgdmFyaW91cyBwcml2YXRlIHN0YXRpYworICAgICogZGF0YS4KKyAgICAqLworICAgLypAeyovCisgICBmcmllbmQgdm9pZCBfbWVzYV9nbHNsX2luaXRpYWxpemVfdHlwZXMoc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKik7CisgICBmcmllbmQgdm9pZCBfbWVzYV9nbHNsX3JlbGVhc2VfdHlwZXModm9pZCk7CisgICAvKkB9Ki8KK307CisKK3N0cnVjdCBnbHNsX3N0cnVjdF9maWVsZCB7CisgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlOworICAgY29uc3QgY2hhciAqbmFtZTsKKyAgIGJvb2wgcm93X21ham9yOworCisgICAvKioKKyAgICAqIEZvciBpbnRlcmZhY2UgYmxvY2tzLCBnbF92YXJ5aW5nX3Nsb3QgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQvb3V0cHV0CisgICAgKiBpZiB0aGlzIGlzIGEgYnVpbHQtaW4gaW5wdXQvb3V0cHV0IChpLmUuIGEgbWVtYmVyIG9mIHRoZSBidWlsdC1pbgorICAgICogZ2xfUGVyVmVydGV4IGludGVyZmFjZSBibG9jayk7IC0xIG90aGVyd2lzZS4KKyAgICAqCisgICAgKiBJZ25vcmVkIGZvciBzdHJ1Y3RzLgorICAgICovCisgICBpbnQgbG9jYXRpb247CisKKyAgIC8qKgorICAgICogRm9yIGludGVyZmFjZSBibG9ja3MsIHRoZSBpbnRlcnBvbGF0aW9uIG1vZGUgKGFzIGluCisgICAgKiBpcl92YXJpYWJsZTo6aW50ZXJwb2xhdGlvbikuICAwIG90aGVyd2lzZS4KKyAgICAqLworICAgdW5zaWduZWQgaW50ZXJwb2xhdGlvbjoyOworCisgICAvKioKKyAgICAqIEZvciBpbnRlcmZhY2UgYmxvY2tzLCAxIGlmIHRoaXMgdmFyaWFibGUgdXNlcyBjZW50cm9pZCBpbnRlcnBvbGF0aW9uIChhcworICAgICogaW4gaXJfdmFyaWFibGU6OmNlbnRyb2lkKS4gIDAgb3RoZXJ3aXNlLgorICAgICovCisgICB1bnNpZ25lZCBjZW50cm9pZDoxOworCisgICAvKioKKyAgICAqIEZvciBpbnRlcmZhY2UgYmxvY2tzLCAxIGlmIHRoaXMgdmFyaWFibGUgdXNlcyBzYW1wbGUgaW50ZXJwb2xhdGlvbiAoYXMKKyAgICAqIGluIGlyX3ZhcmlhYmxlOjpzYW1wbGUpLiAwIG90aGVyd2lzZS4KKyAgICAqLworICAgdW5zaWduZWQgc2FtcGxlOjE7Cit9OworCisvKioKKyAqIERlc2VyaWFsaXphdGlvbiB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGJpbmFyeSBzaGFkZXJzLCBzdGF0ZSBhbmQKKyAqIHR5cGVfaGFzaCBhcmUgbWFuZGF0b3J5IGhlbHBlciBzdHJ1Y3R1cmVzIG1hbmFnZWQgYnkgdGhlIGNhbGxlci4KKyAqLworY29uc3QgZ2xzbF90eXBlICoKK2Rlc2VyaWFsaXplX2dsc2xfdHlwZShtZW1vcnlfbWFwICptYXAsIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGFzaF90YWJsZSAqdHlwZV9oYXNoKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2dsc2xfYWxpZ24odW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBhbGlnbikKK3sKKyAgIHJldHVybiAoYSArIGFsaWduIC0gMSkgLyBhbGlnbiAqIGFsaWduOworfQorCisjdW5kZWYgREVDTF9UWVBFCisjdW5kZWYgU1RSVUNUX1RZUEUKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogR0xTTF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9pci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDViNDFiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvaXIuaApAQCAtMCwwICsxLDI0MDMgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIElSX0gKKyNkZWZpbmUgSVJfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInJhbGxvYy5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX2hpZXJhcmNoaWNhbF92aXNpdG9yLmgiCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJtZW1vcnlfd3JpdGVyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisvKioKKyAqIFxkZWZncm91cCBJUiBJbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gbm9kZXMKKyAqCisgKiBAeworICovCisKKy8qKgorICogQ2xhc3MgdGFncworICoKKyAqIEVhY2ggY29uY3JldGUgY2xhc3MgZGVyaXZlZCBmcm9tIFxjIGlyX2luc3RydWN0aW9uIGhhcyBhIHZhbHVlIGluIHRoaXMKKyAqIGVudW1lcmFudC4gIFRoZSB2YWx1ZSBmb3IgdGhlIHR5cGUgaXMgc3RvcmVkIGluIFxjIGlyX2luc3RydWN0aW9uOjppcl90eXBlCisgKiBieSB0aGUgY29uc3RydWN0b3IuICBXaGlsZSB1c2luZyB0eXBlIHRhZ3MgaXMgbm90IHZlcnkgQysrLCBpdCBpcyBleHRyZW1lbHkKKyAqIGNvbnZlbmllbnQuICBGb3IgZXhhbXBsZSwgZHVyaW5nIGRlYnVnZ2luZyB5b3UgY2FuIHNpbXBseSBpbnNwZWN0CisgKiBcYyBpcl9pbnN0cnVjdGlvbjo6aXJfdHlwZSB0byBmaW5kIG91dCB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIG9iamVjdC4KKyAqCisgKiBJbiBhZGRpdGlvbiwgaXQgaXMgcG9zc2libGUgdG8gdXNlIGEgc3dpdGNoLXN0YXRlbWVudCBiYXNlZCBvbiBcYworICogXGMgaXJfaW5zdHJ1Y3Rpb246OmlyX3R5cGUgdG8gc2VsZWN0IGRpZmZlcmVudCBiZWhhdmlvciBmb3IgZGlmZmVyZW50IG9iamVjdAorICogdHlwZXMuICBGb3IgZnVuY3Rpb25zIHRoYXQgaGF2ZSBvbmx5IHNsaWdodCBkaWZmZXJlbmNlcyBmb3Igc2V2ZXJhbCBvYmplY3QKKyAqIHR5cGVzLCB0aGlzIGFsbG93cyB3cml0aW5nIHZlcnkgc3RyYWlnaHRmb3J3YXJkLCByZWFkYWJsZSBjb2RlLgorICovCitlbnVtIGlyX25vZGVfdHlwZSB7CisgICAvKioKKyAgICAqIFplcm8gaXMgdW51c2VkIHNvIHRoYXQgdGhlIElSIHZhbGlkYXRvciBjYW4gZGV0ZWN0IGNhc2VzIHdoZXJlCisgICAgKiBcYyBpcl9pbnN0cnVjdGlvbjo6aXJfdHlwZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgKi8KKyAgIGlyX3R5cGVfdW5zZXQsCisgICBpcl90eXBlX3ZhcmlhYmxlLAorICAgaXJfdHlwZV9hc3NpZ25tZW50LAorICAgaXJfdHlwZV9jYWxsLAorICAgaXJfdHlwZV9jb25zdGFudCwKKyAgIGlyX3R5cGVfZGVyZWZlcmVuY2VfYXJyYXksCisgICBpcl90eXBlX2RlcmVmZXJlbmNlX3JlY29yZCwKKyAgIGlyX3R5cGVfZGVyZWZlcmVuY2VfdmFyaWFibGUsCisgICBpcl90eXBlX2Rpc2NhcmQsCisgICBpcl90eXBlX2V4cHJlc3Npb24sCisgICBpcl90eXBlX2Z1bmN0aW9uLAorICAgaXJfdHlwZV9mdW5jdGlvbl9zaWduYXR1cmUsCisgICBpcl90eXBlX2lmLAorICAgaXJfdHlwZV9sb29wLAorICAgaXJfdHlwZV9sb29wX2p1bXAsCisgICBpcl90eXBlX3JldHVybiwKKyAgIGlyX3R5cGVfc3dpenpsZSwKKyAgIGlyX3R5cGVfdGV4dHVyZSwKKyAgIGlyX3R5cGVfZW1pdF92ZXJ0ZXgsCisgICBpcl90eXBlX2VuZF9wcmltaXRpdmUsCisgICBpcl90eXBlX21heCAvKio8IG1heGltdW0gaXJfdHlwZSBlbnVtIG51bWJlciwgZm9yIHZhbGlkYXRpb24gKi8KK307CisKKworLyoqCisgKiBCYXNlIGNsYXNzIG9mIGFsbCBJUiBpbnN0cnVjdGlvbnMKKyAqLworY2xhc3MgaXJfaW5zdHJ1Y3Rpb24gOiBwdWJsaWMgZXhlY19ub2RlIHsKK3B1YmxpYzoKKyAgIGVudW0gaXJfbm9kZV90eXBlIGlyX3R5cGU7CisKKyAgIC8qKgorICAgICogR0NDIDQuNysgYW5kIGNsYW5nIHdhcm4gd2hlbiBkZWxldGluZyBhbiBpcl9pbnN0cnVjdGlvbiB1bmxlc3MKKyAgICAqIHRoZXJlJ3MgYSB2aXJ0dWFsIGRlc3RydWN0b3IgcHJlc2VudC4gIEJlY2F1c2Ugd2UgYWxtb3N0CisgICAgKiB1bml2ZXJzYWxseSB1c2UgcmFsbG9jIGZvciBvdXIgbWVtb3J5IG1hbmFnZW1lbnQgb2YKKyAgICAqIGlyX2luc3RydWN0aW9ucywgdGhlIGRlc3RydWN0b3IgZG9lc24ndCBuZWVkIHRvIGRvIGFueSB3b3JrLgorICAgICovCisgICB2aXJ0dWFsIH5pcl9pbnN0cnVjdGlvbigpCisgICB7CisgICB9CisKKyAgIC8qKiBpcl9wcmludF92aXNpdG9yIGhlbHBlciBmb3IgZGVidWdnaW5nLiAqLworICAgdm9pZCBwcmludCh2b2lkKSBjb25zdDsKKyAgIHZvaWQgZnByaW50KEZJTEUgKmYpIGNvbnN0OworCisgICAvKiBzZXJpYWxpemF0aW9uICovCisgICB2b2lkIHNlcmlhbGl6ZShtZW1vcnlfd3JpdGVyICZtZW0pOworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkgPSAwOworCisgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KGlyX3Zpc2l0b3IgKikgPSAwOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyBhY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKikgPSAwOworICAgdmlydHVhbCBpcl9pbnN0cnVjdGlvbiAqY2xvbmUodm9pZCAqbWVtX2N0eCwKKwkJCQkgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdCA9IDA7CisKKyAgIC8qKgorICAgICogXG5hbWUgSVIgaW5zdHJ1Y3Rpb24gZG93bmNhc3QgZnVuY3Rpb25zCisgICAgKgorICAgICogVGhlc2UgZnVuY3Rpb25zIGVpdGhlciBjYXN0IHRoZSBvYmplY3QgdG8gYSBkZXJpdmVkIGNsYXNzIG9yIHJldHVybgorICAgICogXGMgTlVMTCBpZiB0aGUgb2JqZWN0J3MgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgc3BlY2lmaWVkIGRlcml2ZWQgY2xhc3MuCisgICAgKiBBZGRpdGlvbmFsIGRvd25jYXN0IGZ1bmN0aW9ucyB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KKyAgICAqLworICAgLypAeyovCisgICB2aXJ0dWFsIGNsYXNzIGlyX3ZhcmlhYmxlICogICAgICAgICAgYXNfdmFyaWFibGUoKSAgICAgICAgIHsgcmV0dXJuIE5VTEw7IH0KKyAgIHZpcnR1YWwgY2xhc3MgaXJfZnVuY3Rpb24gKiAgICAgICAgICBhc19mdW5jdGlvbigpICAgICAgICAgeyByZXR1cm4gTlVMTDsgfQorICAgdmlydHVhbCBjbGFzcyBpcl9kZXJlZmVyZW5jZSAqICAgICAgIGFzX2RlcmVmZXJlbmNlKCkgICAgICB7IHJldHVybiBOVUxMOyB9CisgICB2aXJ0dWFsIGNsYXNzIGlyX2RlcmVmZXJlbmNlX2FycmF5ICoJYXNfZGVyZWZlcmVuY2VfYXJyYXkoKSB7IHJldHVybiBOVUxMOyB9CisgICB2aXJ0dWFsIGNsYXNzIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICphc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpIHsgcmV0dXJuIE5VTEw7IH0KKyAgIHZpcnR1YWwgY2xhc3MgaXJfZGVyZWZlcmVuY2VfcmVjb3JkICphc19kZXJlZmVyZW5jZV9yZWNvcmQoKSB7IHJldHVybiBOVUxMOyB9CisgICB2aXJ0dWFsIGNsYXNzIGlyX2V4cHJlc3Npb24gKiAgICAgICAgYXNfZXhwcmVzc2lvbigpICAgICAgIHsgcmV0dXJuIE5VTEw7IH0KKyAgIHZpcnR1YWwgY2xhc3MgaXJfcnZhbHVlICogICAgICAgICAgICBhc19ydmFsdWUoKSAgICAgICAgICAgeyByZXR1cm4gTlVMTDsgfQorICAgdmlydHVhbCBjbGFzcyBpcl9sb29wICogICAgICAgICAgICAgIGFzX2xvb3AoKSAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9CisgICB2aXJ0dWFsIGNsYXNzIGlyX2Fzc2lnbm1lbnQgKiAgICAgICAgYXNfYXNzaWdubWVudCgpICAgICAgIHsgcmV0dXJuIE5VTEw7IH0KKyAgIHZpcnR1YWwgY2xhc3MgaXJfY2FsbCAqICAgICAgICAgICAgICBhc19jYWxsKCkgICAgICAgICAgICAgeyByZXR1cm4gTlVMTDsgfQorICAgdmlydHVhbCBjbGFzcyBpcl9yZXR1cm4gKiAgICAgICAgICAgIGFzX3JldHVybigpICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9CisgICB2aXJ0dWFsIGNsYXNzIGlyX2lmICogICAgICAgICAgICAgICAgYXNfaWYoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIE5VTEw7IH0KKyAgIHZpcnR1YWwgY2xhc3MgaXJfc3dpenpsZSAqICAgICAgICAgICBhc19zd2l6emxlKCkgICAgICAgICAgeyByZXR1cm4gTlVMTDsgfQorICAgdmlydHVhbCBjbGFzcyBpcl90ZXh0dXJlICogICAgICAgICAgIGFzX3RleHR1cmUoKSAgICAgICAgICB7IHJldHVybiBOVUxMOyB9CisgICB2aXJ0dWFsIGNsYXNzIGlyX2NvbnN0YW50ICogICAgICAgICAgYXNfY29uc3RhbnQoKSAgICAgICAgIHsgcmV0dXJuIE5VTEw7IH0KKyAgIHZpcnR1YWwgY2xhc3MgaXJfZGlzY2FyZCAqICAgICAgICAgICBhc19kaXNjYXJkKCkgICAgICAgICAgeyByZXR1cm4gTlVMTDsgfQorICAgdmlydHVhbCBjbGFzcyBpcl9qdW1wICogICAgICAgICAgICAgIGFzX2p1bXAoKSAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9CisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBJUiBlcXVhbGl0eSBtZXRob2Q6IFJldHVybiB0cnVlIGlmIHRoZSByZWZlcmVuY2VkIGluc3RydWN0aW9uIHdvdWxkCisgICAgKiByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhpcyBvbmUuCisgICAgKgorICAgICogVGhpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBDU0UgYW5kIGFsZ2VicmFpYyBvcHRpbWl6YXRpb25zLCBvbiBydmFsdWVzCisgICAgKiBpbiBwYXJ0aWN1bGFyLiAgTm8gc3VwcG9ydCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb24gdHlwZXMgKGFzc2lnbm1lbnRzLAorICAgICoganVtcHMsIGNhbGxzLCBldGMuKSBpcyBwbGFubmVkLgorICAgICovCisgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGlyX2luc3RydWN0aW9uICppciwgZW51bSBpcl9ub2RlX3R5cGUgaWdub3JlID0gaXJfdHlwZV91bnNldCk7CisKK3Byb3RlY3RlZDoKKyAgIGlyX2luc3RydWN0aW9uKCkKKyAgIHsKKyAgICAgIGlyX3R5cGUgPSBpcl90eXBlX3Vuc2V0OworICAgfQorfTsKKworCisvKioKKyAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgInZhbHVlcyIvZXhwcmVzc2lvbiB0cmVlcy4KKyAqLworY2xhc3MgaXJfcnZhbHVlIDogcHVibGljIGlyX2luc3RydWN0aW9uIHsKK3B1YmxpYzoKKyAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGU7CisKKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqKSBjb25zdDsKKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIHZpcnR1YWwgdm9pZCBhY2NlcHQoaXJfdmlzaXRvciAqdikKKyAgIHsKKyAgICAgIHYtPnZpc2l0KHRoaXMpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIGFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqKTsKKworICAgdmlydHVhbCBpcl9jb25zdGFudCAqY29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZShzdHJ1Y3QgaGFzaF90YWJsZSAqdmFyaWFibGVfY29udGV4dCA9IE5VTEwpOworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqIGFzX3J2YWx1ZSgpCisgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgIH0KKworICAgaXJfcnZhbHVlICphc19ydmFsdWVfdG9fc2F0dXJhdGUoKTsKKworICAgdmlydHVhbCBib29sIGlzX2x2YWx1ZSgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIC8qKgorICAgICogR2V0IHRoZSB2YXJpYWJsZSB0aGF0IGlzIHVsdGltYXRlbHkgcmVmZXJlbmNlZCBieSBhbiByLXZhbHVlCisgICAgKi8KKyAgIHZpcnR1YWwgaXJfdmFyaWFibGUgKnZhcmlhYmxlX3JlZmVyZW5jZWQoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKworICAgLyoqCisgICAgKiBJZiBhbiByLXZhbHVlIGlzIGEgcmVmZXJlbmNlIHRvIGEgd2hvbGUgdmFyaWFibGUsIGdldCB0aGF0IHZhcmlhYmxlCisgICAgKgorICAgICogXHJldHVybgorICAgICogUG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgaXMgY29tcGxldGVseSBkZXJlZmVyZW5jZWQgYnkgdGhlIHItdmFsdWUuICBJZgorICAgICogdGhlIHItdmFsdWUgaXMgbm90IGEgZGVyZWZlcmVuY2Ugb3IgdGhlIGRlcmVmZXJlbmNlIGRvZXMgbm90IGFjY2VzcyB0aGUKKyAgICAqIGVudGlyZSB2YXJpYWJsZSAoaS5lLiwgaXQncyBqdXN0IG9uZSBhcnJheSBlbGVtZW50LCBzdHJ1Y3QgZmllbGQpLCBcYyBOVUxMCisgICAgKiBpcyByZXR1cm5lZC4KKyAgICAqLworICAgdmlydHVhbCBpcl92YXJpYWJsZSAqd2hvbGVfdmFyaWFibGVfcmVmZXJlbmNlZCgpCisgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLyoqCisgICAgKiBEZXRlcm1pbmUgaWYgYW4gci12YWx1ZSBoYXMgdGhlIHZhbHVlIHplcm8KKyAgICAqCisgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIFxjIGZhbHNlLiAgVGhlCisgICAgKiBcYyBpcl9jb25zdGFudCBjbGFzcyBvdmVyLXJpZGVzIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIFxjIHRydWUgXGIgb25seQorICAgICogZm9yIHZlY3RvciBhbmQgc2NhbGFyIHR5cGVzIHRoYXQgaGF2ZSBhbGwgZWxlbWVudHMgc2V0IHRvIHRoZSB2YWx1ZQorICAgICogemVybyAob3IgXGMgZmFsc2UgZm9yIGJvb2xlYW5zKS4KKyAgICAqCisgICAgKiBcc2EgaXJfY29uc3RhbnQ6Omhhc192YWx1ZSwgaXJfcnZhbHVlOjppc19vbmUsIGlyX3J2YWx1ZTo6aXNfbmVnYXRpdmVfb25lLAorICAgICogICAgIGlyX2NvbnN0YW50Ojppc19iYXNpcworICAgICovCisgICB2aXJ0dWFsIGJvb2wgaXNfemVybygpIGNvbnN0OworCisgICAvKioKKyAgICAqIERldGVybWluZSBpZiBhbiByLXZhbHVlIGhhcyB0aGUgdmFsdWUgb25lCisgICAgKgorICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBcYyBmYWxzZS4gIFRoZQorICAgICogXGMgaXJfY29uc3RhbnQgY2xhc3Mgb3Zlci1yaWRlcyB0aGlzIGZ1bmN0aW9uIHRvIHJldHVybiBcYyB0cnVlIFxiIG9ubHkKKyAgICAqIGZvciB2ZWN0b3IgYW5kIHNjYWxhciB0eXBlcyB0aGF0IGhhdmUgYWxsIGVsZW1lbnRzIHNldCB0byB0aGUgdmFsdWUKKyAgICAqIG9uZSAob3IgXGMgdHJ1ZSBmb3IgYm9vbGVhbnMpLgorICAgICoKKyAgICAqIFxzYSBpcl9jb25zdGFudDo6aGFzX3ZhbHVlLCBpcl9ydmFsdWU6OmlzX3plcm8sIGlyX3J2YWx1ZTo6aXNfbmVnYXRpdmVfb25lLAorICAgICogICAgIGlyX2NvbnN0YW50Ojppc19iYXNpcworICAgICovCisgICB2aXJ0dWFsIGJvb2wgaXNfb25lKCkgY29uc3Q7CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lIGlmIGFuIHItdmFsdWUgaGFzIHRoZSB2YWx1ZSBuZWdhdGl2ZSBvbmUKKyAgICAqCisgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIFxjIGZhbHNlLiAgVGhlCisgICAgKiBcYyBpcl9jb25zdGFudCBjbGFzcyBvdmVyLXJpZGVzIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIFxjIHRydWUgXGIgb25seQorICAgICogZm9yIHZlY3RvciBhbmQgc2NhbGFyIHR5cGVzIHRoYXQgaGF2ZSBhbGwgZWxlbWVudHMgc2V0IHRvIHRoZSB2YWx1ZQorICAgICogbmVnYXRpdmUgb25lLiAgRm9yIGJvb2xlYW4gdHlwZXMsIHRoZSByZXN1bHQgaXMgYWx3YXlzIFxjIGZhbHNlLgorICAgICoKKyAgICAqIFxzYSBpcl9jb25zdGFudDo6aGFzX3ZhbHVlLCBpcl9ydmFsdWU6OmlzX3plcm8sIGlyX3J2YWx1ZTo6aXNfb25lCisgICAgKiAgICAgaXJfY29uc3RhbnQ6OmlzX2Jhc2lzCisgICAgKi8KKyAgIHZpcnR1YWwgYm9vbCBpc19uZWdhdGl2ZV9vbmUoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBEZXRlcm1pbmUgaWYgYW4gci12YWx1ZSBpcyBhIGJhc2lzIHZlY3RvcgorICAgICoKKyAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgXGMgZmFsc2UuICBUaGUKKyAgICAqIFxjIGlyX2NvbnN0YW50IGNsYXNzIG92ZXItcmlkZXMgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gXGMgdHJ1ZSBcYiBvbmx5CisgICAgKiBmb3IgdmVjdG9yIGFuZCBzY2FsYXIgdHlwZXMgdGhhdCBoYXZlIG9uZSBlbGVtZW50IHNldCB0byB0aGUgdmFsdWUgb25lLAorICAgICogYW5kIHRoZSBvdGhlciBlbGVtZW50cyBzZXQgdG8gdGhlIHZhbHVlIHplcm8uICBGb3IgYm9vbGVhbiB0eXBlcywgdGhlCisgICAgKiByZXN1bHQgaXMgYWx3YXlzIFxjIGZhbHNlLgorICAgICoKKyAgICAqIFxzYSBpcl9jb25zdGFudDo6aGFzX3ZhbHVlLCBpcl9ydmFsdWU6OmlzX3plcm8sIGlyX3J2YWx1ZTo6aXNfb25lLAorICAgICogICAgIGlzX2NvbnN0YW50Ojppc19uZWdhdGl2ZV9vbmUKKyAgICAqLworICAgdmlydHVhbCBib29sIGlzX2Jhc2lzKCkgY29uc3Q7CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lIGlmIGFuIHItdmFsdWUgaXMgYW4gdW5zaWduZWQgaW50ZWdlciBjb25zdGFudCB3aGljaCBjYW4gYmUKKyAgICAqIHN0b3JlZCBpbiAxNiBiaXRzLgorICAgICoKKyAgICAqIFxzYSBpcl9jb25zdGFudDo6aXNfdWludDE2X2NvbnN0YW50LgorICAgICovCisgICB2aXJ0dWFsIGJvb2wgaXNfdWludDE2X2NvbnN0YW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgLyoqCisgICAgKiBSZXR1cm4gYSBnZW5lcmljIHZhbHVlIG9mIGVycm9yX3R5cGUuCisgICAgKgorICAgICogQWxsb2NhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCB3aXRoICdtZW1fY3R4JyBhcyByYWxsb2Mgb3duZXIuCisgICAgKi8KKyAgIHN0YXRpYyBpcl9ydmFsdWUgKmVycm9yX3ZhbHVlKHZvaWQgKm1lbV9jdHgpOworCitwcm90ZWN0ZWQ6CisgICBpcl9ydmFsdWUoKTsKK307CisKKworLyoqCisgKiBWYXJpYWJsZSBzdG9yYWdlIGNsYXNzZXMKKyAqLworZW51bSBpcl92YXJpYWJsZV9tb2RlIHsKKyAgIGlyX3Zhcl9hdXRvID0gMCwgICAgIC8qKjwgRnVuY3Rpb24gbG9jYWwgdmFyaWFibGVzIGFuZCBnbG9iYWxzLiAqLworICAgaXJfdmFyX3VuaWZvcm0sICAgICAgLyoqPCBWYXJpYWJsZSBkZWNsYXJlZCBhcyBhIHVuaWZvcm0uICovCisgICBpcl92YXJfc2hhZGVyX2luLAorICAgaXJfdmFyX3NoYWRlcl9vdXQsCisgICBpcl92YXJfZnVuY3Rpb25faW4sCisgICBpcl92YXJfZnVuY3Rpb25fb3V0LAorICAgaXJfdmFyX2Z1bmN0aW9uX2lub3V0LAorICAgaXJfdmFyX2NvbnN0X2luLAkvKio8ICJpbiIgcGFyYW0gdGhhdCBtdXN0IGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworICAgaXJfdmFyX3N5c3RlbV92YWx1ZSwgLyoqPCBFeDogZnJvbnQtZmFjZSwgaW5zdGFuY2UtaWQsIGV0Yy4gKi8KKyAgIGlyX3Zhcl90ZW1wb3JhcnksCS8qKjwgVGVtcG9yYXJ5IHZhcmlhYmxlIGdlbmVyYXRlZCBkdXJpbmcgY29tcGlsYXRpb24uICovCisgICBpcl92YXJfbW9kZV9jb3VudAkvKio8IE51bWJlciBvZiB2YXJpYWJsZSBtb2RlcyAqLworfTsKKworLyoqCisgKiBFbnVtIGtlZXBpbmcgdHJhY2sgb2YgaG93IGEgdmFyaWFibGUgd2FzIGRlY2xhcmVkLiAgRm9yIGVycm9yIGNoZWNraW5nIG9mCisgKiB0aGUgZ2xfUGVyVmVydGV4IHJlZGVjbGFyYXRpb24gcnVsZXMuCisgKi8KK2VudW0gaXJfdmFyX2RlY2xhcmF0aW9uX3R5cGUgeworICAgLyoqCisgICAgKiBOb3JtYWwgZGVjbGFyYXRpb24gKGZvciBtb3N0IHZhcmlhYmxlcywgdGhpcyBtZWFucyBhbiBleHBsaWNpdAorICAgICogZGVjbGFyYXRpb24uICBFeGNlcHRpb246IHRlbXBvcmFyaWVzIGFyZSBhbHdheXMgaW1wbGljaXRseSBkZWNsYXJlZCwgYnV0CisgICAgKiB0aGV5IHN0aWxsIHVzZSBpcl92YXJfZGVjbGFyZWRfbm9ybWFsbHkpLgorICAgICoKKyAgICAqIE5vdGU6IGFuIGlyX3ZhcmlhYmxlIHRoYXQgcmVwcmVzZW50cyBhIG5hbWVkIGludGVyZmFjZSBibG9jayB1c2VzCisgICAgKiBpcl92YXJfZGVjbGFyZWRfbm9ybWFsbHkuCisgICAgKi8KKyAgIGlyX3Zhcl9kZWNsYXJlZF9ub3JtYWxseSA9IDAsCisKKyAgIC8qKgorICAgICogVmFyaWFibGUgd2FzIGV4cGxpY2l0bHkgZGVjbGFyZWQgKG9yIHJlLWRlY2xhcmVkKSBpbiBhbiB1bm5hbWVkCisgICAgKiBpbnRlcmZhY2UgYmxvY2suCisgICAgKi8KKyAgIGlyX3Zhcl9kZWNsYXJlZF9pbl9ibG9jaywKKworICAgLyoqCisgICAgKiBWYXJpYWJsZSBpcyBhbiBpbXBsaWNpdGx5IGRlY2xhcmVkIGJ1aWx0LWluIHRoYXQgaGFzIG5vdCBiZWVuIGV4cGxpY2l0bHkKKyAgICAqIHJlLWRlY2xhcmVkIGJ5IHRoZSBzaGFkZXIuCisgICAgKi8KKyAgIGlyX3Zhcl9kZWNsYXJlZF9pbXBsaWNpdGx5LAorfTsKKworLyoqCisgKiBcYnJpZWYgTGF5b3V0IHF1YWxpZmllcnMgZm9yIGdsX0ZyYWdEZXB0aC4KKyAqCisgKiBUaGUgQU1EL0FSQl9jb25zZXJ2YXRpdmVfZGVwdGggZXh0ZW5zaW9ucyBhbGxvdyBnbF9GcmFnRGVwdGggdG8gYmUgcmVkZWNsYXJlZAorICogd2l0aCBhIGxheW91dCBxdWFsaWZpZXIuCisgKi8KK2VudW0gaXJfZGVwdGhfbGF5b3V0IHsKKyAgICBpcl9kZXB0aF9sYXlvdXRfbm9uZSwgLyoqPCBObyBkZXB0aCBsYXlvdXQgaXMgc3BlY2lmaWVkLiAqLworICAgIGlyX2RlcHRoX2xheW91dF9hbnksCisgICAgaXJfZGVwdGhfbGF5b3V0X2dyZWF0ZXIsCisgICAgaXJfZGVwdGhfbGF5b3V0X2xlc3MsCisgICAgaXJfZGVwdGhfbGF5b3V0X3VuY2hhbmdlZAorfTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBkZXB0aCBsYXlvdXQgcXVhbGlmaWVyIHRvIHN0cmluZy4KKyAqLworY29uc3QgY2hhcioKK2RlcHRoX2xheW91dF9zdHJpbmcoaXJfZGVwdGhfbGF5b3V0IGxheW91dCk7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYnVpbHQtaW4gc3RhdGUgYXNzb2NpYXRlZCB3aXRoIGEgdW5pZm9ybQorICoKKyAqIFxzYSBpcl92YXJpYWJsZTo6c3RhdGVfc2xvdHMKKyAqLworc3RydWN0IGlyX3N0YXRlX3Nsb3QgeworICAgaW50IHRva2Vuc1s1XTsKKyAgIGludCBzd2l6emxlOworfTsKKworCisvKioKKyAqIEdldCB0aGUgc3RyaW5nIHZhbHVlIGZvciBhbiBpbnRlcnBvbGF0aW9uIHF1YWxpZmllcgorICoKKyAqIFxyZXR1cm4gVGhlIHN0cmluZyB0aGF0IHdvdWxkIGJlIHVzZWQgaW4gYSBzaGFkZXIgdG8gc3BlY2lmeSBcYworICogbW9kZSB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZW5lcmF0ZSBlcnJvciBtZXNzYWdlcyBvZiB0aGUgZm9ybSAic2hhZGVyCisgKiB1c2VzICVzIGludGVycG9sYXRpb24gcXVhbGlmaWVyIiwgc28gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8KKyAqIGludGVycG9sYXRpb24gcXVhbGlmaWVyLCBpdCByZXR1cm5zICJubyIuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIG9uIGEgc2hhZGVyIGlucHV0IG9yIG91dHB1dCB2YXJpYWJsZS4KKyAqLworY29uc3QgY2hhciAqaW50ZXJwb2xhdGlvbl9zdHJpbmcodW5zaWduZWQgaW50ZXJwb2xhdGlvbik7CisKKworY2xhc3MgaXJfdmFyaWFibGUgOiBwdWJsaWMgaXJfaW5zdHJ1Y3Rpb24geworcHVibGljOgorICAgaXJfdmFyaWFibGUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqLCBjb25zdCBjaGFyICosIGlyX3ZhcmlhYmxlX21vZGUpOworCisgICB2aXJ0dWFsIGlyX3ZhcmlhYmxlICpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3ZhcmlhYmxlICphc192YXJpYWJsZSgpCisgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pOworCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIGFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqKTsKKworCisgICAvKioKKyAgICAqIERldGVybWluZSBob3cgdGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgaW50ZXJwb2xhdGVkIGJhc2VkIG9uIGl0cworICAgICogaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXIgKGlmIHByZXNlbnQpLCB3aGV0aGVyIGl0IGlzIGdsX0NvbG9yIG9yCisgICAgKiBnbF9TZWNvbmRhcnlDb2xvciwgYW5kIHdoZXRoZXIgZmxhdHNoYWRpbmcgaXMgZW5hYmxlZCBpbiB0aGUgY3VycmVudCBHTAorICAgICogc3RhdGUuCisgICAgKgorICAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBlaXRoZXIgSU5URVJQX1FVQUxJRklFUl9TTU9PVEgsCisgICAgKiBJTlRFUlBfUVVBTElGSUVSX05PUEVSU1BFQ1RJVkUsIG9yIElOVEVSUF9RVUFMSUZJRVJfRkxBVC4KKyAgICAqLworICAgZ2xzbF9pbnRlcnBfcXVhbGlmaWVyIGRldGVybWluZV9pbnRlcnBvbGF0aW9uX21vZGUoYm9vbCBmbGF0X3NoYWRlKTsKKworICAgLyoqCisgICAgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSB2YXJpYWJsZSBpcyBwYXJ0IG9mIGEgdW5pZm9ybSBibG9jay4KKyAgICAqLworICAgaW5saW5lIGJvb2wgaXNfaW5fdW5pZm9ybV9ibG9jaygpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gdGhpcy0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtICYmIHRoaXMtPmludGVyZmFjZV90eXBlICE9IE5VTEw7CisgICB9CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgdmFyaWFibGUgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGludGVyZmFjZQorICAgICogYmxvY2sKKyAgICAqCisgICAgKiBGb3IgdGhlIGZpcnN0IGRlY2xhcmF0aW9uIGJlbG93LCB0aGVyZSB3aWxsIGJlIGFuIFxjIGlyX3ZhcmlhYmxlIG5hbWVkCisgICAgKiAiaW5zdGFuY2UiIHdob3NlIHR5cGUgYW5kIHdob3NlIGluc3RhbmNlX3R5cGUgd2lsbCBiZSB0aGUgc2FtZQorICAgICogIFxjZ2xzbF90eXBlLiAgRm9yIHRoZSBzZWNvbmQgZGVjbGFyYXRpb24sIHRoZXJlIHdpbGwgYmUgYW4gXGMgaXJfdmFyaWFibGUKKyAgICAqIG5hbWVkICJmIiB3aG9zZSB0eXBlIGlzIGZsb2F0IGFuZCB3aG9zZSBpbnN0YW5jZV90eXBlIGlzIEIyLgorICAgICoKKyAgICAqICJpbnN0YW5jZSIgaXMgYW4gaW50ZXJmYWNlIGluc3RhbmNlIHZhcmlhYmxlLCBidXQgImYiIGlzIG5vdC4KKyAgICAqCisgICAgKiB1bmlmb3JtIEIxIHsKKyAgICAqICAgICBmbG9hdCBmOworICAgICogfSBpbnN0YW5jZTsKKyAgICAqCisgICAgKiB1bmlmb3JtIEIyIHsKKyAgICAqICAgICBmbG9hdCBmOworICAgICogfTsKKyAgICAqLworICAgaW5saW5lIGJvb2wgaXNfaW50ZXJmYWNlX2luc3RhbmNlKCkgY29uc3QKKyAgIHsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgdCA9IHRoaXMtPnR5cGU7CisKKyAgICAgIHJldHVybiAodCA9PSB0aGlzLT5pbnRlcmZhY2VfdHlwZSkKKyAgICAgICAgIHx8ICh0LT5pc19hcnJheSgpICYmIHQtPmZpZWxkcy5hcnJheSA9PSB0aGlzLT5pbnRlcmZhY2VfdHlwZSk7CisgICAgfQorCisgICAvKioKKyAgICAqIFNldCB0aGlzLT5pbnRlcmZhY2VfdHlwZSBvbiBhIG5ld2x5IGNyZWF0ZWQgdmFyaWFibGUuCisgICAgKi8KKyAgIHZvaWQgaW5pdF9pbnRlcmZhY2VfdHlwZShjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlKQorICAgeworICAgICAgYXNzZXJ0KHRoaXMtPmludGVyZmFjZV90eXBlID09IE5VTEwpOworICAgICAgdGhpcy0+aW50ZXJmYWNlX3R5cGUgPSB0eXBlOworICAgICAgaWYgKHRoaXMtPmlzX2ludGVyZmFjZV9pbnN0YW5jZSgpKSB7CisgICAgICAgICB0aGlzLT5tYXhfaWZjX2FycmF5X2FjY2VzcyA9CisgICAgICAgICAgICByemFsbG9jX2FycmF5KHRoaXMsIHVuc2lnbmVkLCB0eXBlLT5sZW5ndGgpOworICAgICAgfQorICAgfQorCisgICAvKioKKyAgICAqIENoYW5nZSB0aGlzLT5pbnRlcmZhY2VfdHlwZSBvbiBhIHZhcmlhYmxlIHRoYXQgcHJldmlvdXNseSBoYWQgYQorICAgICogZGlmZmVyZW50LCBidXQgY29tcGF0aWJsZSwgaW50ZXJmYWNlX3R5cGUuICBUaGlzIGlzIHVzZWQgZHVyaW5nIGxpbmtpbmcKKyAgICAqIHRvIHNldCB0aGUgc2l6ZSBvZiBhcnJheXMgaW4gaW50ZXJmYWNlIGJsb2Nrcy4KKyAgICAqLworICAgdm9pZCBjaGFuZ2VfaW50ZXJmYWNlX3R5cGUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSkKKyAgIHsKKyAgICAgIGlmICh0aGlzLT5tYXhfaWZjX2FycmF5X2FjY2VzcyAhPSBOVUxMKSB7CisgICAgICAgICAvKiBtYXhfaWZjX2FycmF5X2FjY2VzcyBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgc28gbWFrZSBzdXJlIHRoZQorICAgICAgICAgICogbmV3IGludGVyZmFjZSBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGZpZWxkcyBhcyB0aGUgb2xkIG9uZS4KKyAgICAgICAgICAqLworICAgICAgICAgYXNzZXJ0KHRoaXMtPmludGVyZmFjZV90eXBlLT5sZW5ndGggPT0gdHlwZS0+bGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMtPmludGVyZmFjZV90eXBlID0gdHlwZTsKKyAgIH0KKworICAgLyoqCisgICAgKiBDaGFuZ2UgdGhpcy0+aW50ZXJmYWNlX3R5cGUgb24gYSB2YXJpYWJsZSB0aGF0IHByZXZpb3VzbHkgaGFkIGEKKyAgICAqIGRpZmZlcmVudCwgYW5kIGluY29tcGF0aWJsZSwgaW50ZXJmYWNlX3R5cGUuIFRoaXMgaXMgdXNlZCBkdXJpbmcKKyAgICAqIGNvbXBpbGF0aW9uIHRvIGhhbmRsZSByZWRlY2xhcmF0aW9uIG9mIHRoZSBidWlsdC1pbiBnbF9QZXJWZXJ0ZXgKKyAgICAqIGludGVyZmFjZSBibG9jay4KKyAgICAqLworICAgdm9pZCByZWluaXRfaW50ZXJmYWNlX3R5cGUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSkKKyAgIHsKKyAgICAgIGlmICh0aGlzLT5tYXhfaWZjX2FycmF5X2FjY2VzcyAhPSBOVUxMKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgLyogUmVkZWNsYXJpbmcgZ2xfUGVyVmVydGV4IGlzIG9ubHkgYWxsb3dlZCBpZiBub25lIG9mIHRoZSBidWlsdC1pbnMKKyAgICAgICAgICAqIGl0IGRlZmluZXMgaGF2ZSBiZWVuIGFjY2Vzc2VkIHlldDsgc28gaXQncyBzYWZlIHRvIHRocm93IGF3YXkgdGhlCisgICAgICAgICAgKiBvbGQgbWF4X2lmY19hcnJheV9hY2Nlc3MgcG9pbnRlciwgc2luY2UgYWxsIG9mIGl0cyB2YWx1ZXMgYXJlCisgICAgICAgICAgKiB6ZXJvLgorICAgICAgICAgICovCisgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdGhpcy0+aW50ZXJmYWNlX3R5cGUtPmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0KHRoaXMtPm1heF9pZmNfYXJyYXlfYWNjZXNzW2ldID09IDApOworI2VuZGlmCisgICAgICAgICByYWxsb2NfZnJlZSh0aGlzLT5tYXhfaWZjX2FycmF5X2FjY2Vzcyk7CisgICAgICAgICB0aGlzLT5tYXhfaWZjX2FycmF5X2FjY2VzcyA9IE5VTEw7CisgICAgICB9CisgICAgICB0aGlzLT5pbnRlcmZhY2VfdHlwZSA9IE5VTEw7CisgICAgICBpbml0X2ludGVyZmFjZV90eXBlKHR5cGUpOworICAgfQorCisgICBjb25zdCBnbHNsX3R5cGUgKmdldF9pbnRlcmZhY2VfdHlwZSgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gdGhpcy0+aW50ZXJmYWNlX3R5cGU7CisgICB9CisKKyAgIC8qKgorICAgICogRGVjbGFyZWQgdHlwZSBvZiB0aGUgdmFyaWFibGUKKyAgICAqLworICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZTsKKworICAgLyoqCisgICAgKiBEZWNsYXJlZCBuYW1lIG9mIHRoZSB2YXJpYWJsZQorICAgICovCisgICBjb25zdCBjaGFyICpuYW1lOworCisgICAvKioKKyAgICAqIEZvciB2YXJpYWJsZXMgd2hpY2ggc2F0aXNmeSB0aGUgaXNfaW50ZXJmYWNlX2luc3RhbmNlKCkgcHJlZGljYXRlLCB0aGlzCisgICAgKiBwb2ludHMgdG8gYW4gYXJyYXkgb2YgaW50ZWdlcnMgc3VjaCB0aGF0IGlmIHRoZSBpdGggbWVtYmVyIG9mIHRoZQorICAgICogaW50ZXJmYWNlIGJsb2NrIGlzIGFuIGFycmF5LCBtYXhfaWZjX2FycmF5X2FjY2Vzc1tpXSBpcyB0aGUgbWF4aW11bQorICAgICogYXJyYXkgZWxlbWVudCBvZiB0aGF0IG1lbWJlciB0aGF0IGhhcyBiZWVuIGFjY2Vzc2VkLiAgSWYgdGhlIGl0aCBtZW1iZXIKKyAgICAqIG9mIHRoZSBpbnRlcmZhY2UgYmxvY2sgaXMgbm90IGFuIGFycmF5LCBtYXhfaWZjX2FycmF5X2FjY2Vzc1tpXSBpcworICAgICogdW51c2VkLgorICAgICoKKyAgICAqIEZvciB2YXJpYWJsZXMgd2hvc2UgdHlwZSBpcyBub3QgYW4gaW50ZXJmYWNlIGJsb2NrLCB0aGlzIHBvaW50ZXIgaXMKKyAgICAqIE5VTEwuCisgICAgKi8KKyAgIHVuc2lnbmVkICptYXhfaWZjX2FycmF5X2FjY2VzczsKKworICAgc3RydWN0IGlyX3ZhcmlhYmxlX2RhdGEgeworCisgICAgICAvKioKKyAgICAgICAqIElzIHRoZSB2YXJpYWJsZSByZWFkLW9ubHk/CisgICAgICAgKgorICAgICAgICogVGhpcyBpcyBzZXQgZm9yIHZhcmlhYmxlcyBkZWNsYXJlZCBhcyBcYyBjb25zdCwgc2hhZGVyIGlucHV0cywKKyAgICAgICAqIGFuZCB1bmlmb3Jtcy4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgcmVhZF9vbmx5OjE7CisgICAgICB1bnNpZ25lZCBjZW50cm9pZDoxOworICAgICAgdW5zaWduZWQgc2FtcGxlOjE7CisgICAgICB1bnNpZ25lZCBpbnZhcmlhbnQ6MTsKKworICAgICAgLyoqCisgICAgICAgKiBIYXMgdGhpcyB2YXJpYWJsZSBiZWVuIHVzZWQgZm9yIHJlYWRpbmcgb3Igd3JpdGluZz8KKyAgICAgICAqCisgICAgICAgKiBTZXZlcmFsIEdMU0wgc2VtYW50aWMgY2hlY2tzIHJlcXVpcmUga25vd2xlZGdlIG9mIHdoZXRoZXIgb3Igbm90IGEKKyAgICAgICAqIHZhcmlhYmxlIGhhcyBiZWVuIHVzZWQuICBGb3IgZXhhbXBsZSwgaXQgaXMgYW4gZXJyb3IgdG8gcmVkZWNsYXJlIGEKKyAgICAgICAqIHZhcmlhYmxlIGFzIGludmFyaWFudCBhZnRlciBpdCBoYXMgYmVlbiB1c2VkLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgaXMgb25seSBtYWludGFpbmVkIGluIHRoZSBhc3RfdG9faGlyLmNwcCBwYXRoLCBub3QgaW4KKyAgICAgICAqIE1lc2EncyBmaXhlZCBmdW5jdGlvbiBvciBBUkIgcHJvZ3JhbSBwYXRocy4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgdXNlZDoxOworCisgICAgICAvKioKKyAgICAgICAqIEhhcyB0aGlzIHZhcmlhYmxlIGJlZW4gc3RhdGljYWxseSBhc3NpZ25lZD8KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGFuc3dlcnMgd2hldGhlciB0aGUgdmFyaWFibGUgd2FzIGFzc2lnbmVkIGluIGFueSBwYXRoIG9mCisgICAgICAgKiB0aGUgc2hhZGVyIGR1cmluZyBhc3RfdG9faGlyLiAgVGhpcyBkb2Vzbid0IGFuc3dlciB3aGV0aGVyIGl0IGlzCisgICAgICAgKiBzdGlsbCB3cml0dGVuIGFmdGVyIGRlYWQgY29kZSByZW1vdmFsLCBub3IgaXMgaXQgbWFpbnRhaW5lZCBpbgorICAgICAgICogbm9uLWFzdF90b19oaXIuY3BwIChHTFNMIHBhcnNpbmcpIHBhdGhzLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBhc3NpZ25lZDoxOworCisgICAgICAvKioKKyAgICAgICAqIEVudW0gaW5kaWNhdGluZyBob3cgdGhlIHZhcmlhYmxlIHdhcyBkZWNsYXJlZC4gIFNlZQorICAgICAgICogaXJfdmFyX2RlY2xhcmF0aW9uX3R5cGUuCisgICAgICAgKgorICAgICAgICogVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBjZXJ0YWluIGtpbmRzIG9mIGlsbGVnYWwgdmFyaWFibGUgcmVkZWNsYXJhdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGhvd19kZWNsYXJlZDoyOworCisgICAgICAvKioKKyAgICAgICAqIFN0b3JhZ2UgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgorICAgICAgICoKKyAgICAgICAqIFxzYSBpcl92YXJpYWJsZV9tb2RlCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIG1vZGU6NDsKKworICAgICAgLyoqCisgICAgICAgKiBJbnRlcnBvbGF0aW9uIG1vZGUgZm9yIHNoYWRlciBpbnB1dHMgLyBvdXRwdXRzCisgICAgICAgKgorICAgICAgICogXHNhIGlyX3ZhcmlhYmxlX2ludGVycG9sYXRpb24KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgaW50ZXJwb2xhdGlvbjoyOworCisgICAgICAvKioKKyAgICAgICAqIFxuYW1lIEFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucworICAgICAgICogQHsKKyAgICAgICAqLworICAgICAgdW5zaWduZWQgb3JpZ2luX3VwcGVyX2xlZnQ6MTsKKyAgICAgIHVuc2lnbmVkIHBpeGVsX2NlbnRlcl9pbnRlZ2VyOjE7CisgICAgICAvKkB9Ki8KKworICAgICAgLyoqCisgICAgICAgKiBXYXMgdGhlIGxvY2F0aW9uIGV4cGxpY2l0bHkgc2V0IGluIHRoZSBzaGFkZXI/CisgICAgICAgKgorICAgICAgICogSWYgdGhlIGxvY2F0aW9uIGlzIGV4cGxpY2l0bHkgc2V0IGluIHRoZSBzaGFkZXIsIGl0IFxiIGNhbm5vdCBiZSBjaGFuZ2VkCisgICAgICAgKiBieSB0aGUgbGlua2VyIG9yIGJ5IHRoZSBBUEkgKGUuZy4sIGNhbGxzIHRvIFxjIGdsQmluZEF0dHJpYkxvY2F0aW9uIGhhdmUKKyAgICAgICAqIG5vIGVmZmVjdCkuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGV4cGxpY2l0X2xvY2F0aW9uOjE7CisgICAgICB1bnNpZ25lZCBleHBsaWNpdF9pbmRleDoxOworCisgICAgICAvKioKKyAgICAgICAqIFdhcyBhbiBpbml0aWFsIGJpbmRpbmcgZXhwbGljaXRseSBzZXQgaW4gdGhlIHNoYWRlcj8KKyAgICAgICAqCisgICAgICAgKiBJZiBzbywgY29uc3RhbnRfdmFsdWUgY29udGFpbnMgYW4gaW50ZWdlciBpcl9jb25zdGFudCByZXByZXNlbnRpbmcgdGhlCisgICAgICAgKiBpbml0aWFsIGJpbmRpbmcgcG9pbnQuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGV4cGxpY2l0X2JpbmRpbmc6MTsKKworICAgICAgLyoqCisgICAgICAgKiBEb2VzIHRoaXMgdmFyaWFibGUgaGF2ZSBhbiBpbml0aWFsaXplcj8KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBjcm9zcy12YWxpZGlhdGUgaW5pdGlhbGl6ZXJzIG9mIGdsb2JhbAorICAgICAgICogdmFyaWFibGVzLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBoYXNfaW5pdGlhbGl6ZXI6MTsKKworICAgICAgLyoqCisgICAgICAgKiBJcyB0aGlzIHZhcmlhYmxlIGEgZ2VuZXJpYyBvdXRwdXQgb3IgaW5wdXQgdGhhdCBoYXMgbm90IHlldCBiZWVuIG1hdGNoZWQKKyAgICAgICAqIHVwIHRvIGEgdmFyaWFibGUgaW4gYW5vdGhlciBzdGFnZSBvZiB0aGUgcGlwZWxpbmU/CisgICAgICAgKgorICAgICAgICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgYXMgc2NyYXRjaCBzdG9yYWdlIHdoaWxlIGFzc2lnbmluZyBsb2NhdGlvbnMKKyAgICAgICAqIHRvIGdlbmVyaWMgaW5wdXRzIGFuZCBvdXRwdXRzLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBpc191bm1hdGNoZWRfZ2VuZXJpY19pbm91dDoxOworCisgICAgICAvKioKKyAgICAgICAqIElmIG5vbi16ZXJvLCB0aGVuIHRoaXMgdmFyaWFibGUgbWF5IGJlIHBhY2tlZCBhbG9uZyB3aXRoIG90aGVyIHZhcmlhYmxlcworICAgICAgICogaW50byBhIHNpbmdsZSB2YXJ5aW5nIHNsb3QsIHNvIHRoaXMgb2Zmc2V0IHNob3VsZCBiZSBhcHBsaWVkIHdoZW4KKyAgICAgICAqIGFjY2Vzc2luZyBjb21wb25lbnRzLiAgRm9yIGV4YW1wbGUsIGFuIG9mZnNldCBvZiAxIG1lYW5zIHRoYXQgdGhlIHgKKyAgICAgICAqIGNvbXBvbmVudCBvZiB0aGlzIHZhcmlhYmxlIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiBjb21wb25lbnQgeSBvZiB0aGUKKyAgICAgICAqIGxvY2F0aW9uIHNwZWNpZmllZCBieSBcYyBsb2NhdGlvbi4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgbG9jYXRpb25fZnJhYzoyOworCisgICAgICAvKioKKyAgICAgICAqIE5vbi16ZXJvIGlmIHRoaXMgdmFyaWFibGUgd2FzIGNyZWF0ZWQgYnkgbG93ZXJpbmcgYSBuYW1lZCBpbnRlcmZhY2UKKyAgICAgICAqIGJsb2NrIHdoaWNoIHdhcyBub3QgYW4gYXJyYXkuCisgICAgICAgKgorICAgICAgICogTm90ZSB0aGF0IHRoaXMgdmFyaWFibGUgYW5kIFxjIGZyb21fbmFtZWRfaWZjX2Jsb2NrX2FycmF5IHdpbGwgbmV2ZXIKKyAgICAgICAqIGJvdGggYmUgbm9uLXplcm8uCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGZyb21fbmFtZWRfaWZjX2Jsb2NrX25vbmFycmF5OjE7CisKKyAgICAgIC8qKgorICAgICAgICogTm9uLXplcm8gaWYgdGhpcyB2YXJpYWJsZSB3YXMgY3JlYXRlZCBieSBsb3dlcmluZyBhIG5hbWVkIGludGVyZmFjZQorICAgICAgICogYmxvY2sgd2hpY2ggd2FzIGFuIGFycmF5LgorICAgICAgICoKKyAgICAgICAqIE5vdGUgdGhhdCB0aGlzIHZhcmlhYmxlIGFuZCBcYyBmcm9tX25hbWVkX2lmY19ibG9ja19ub25hcnJheSB3aWxsIG5ldmVyCisgICAgICAgKiBib3RoIGJlIG5vbi16ZXJvLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBmcm9tX25hbWVkX2lmY19ibG9ja19hcnJheToxOworCisgICAgICAvKioKKyAgICAgICAqIFxicmllZiBMYXlvdXQgcXVhbGlmaWVyIGZvciBnbF9GcmFnRGVwdGguCisgICAgICAgKgorICAgICAgICogVGhpcyBpcyBub3QgZXF1YWwgdG8gXGMgaXJfZGVwdGhfbGF5b3V0X25vbmUgaWYgYW5kIG9ubHkgaWYgdGhpcworICAgICAgICogdmFyaWFibGUgaXMgXGMgZ2xfRnJhZ0RlcHRoIGFuZCBhIGxheW91dCBxdWFsaWZpZXIgaXMgc3BlY2lmaWVkLgorICAgICAgICovCisgICAgICBpcl9kZXB0aF9sYXlvdXQgZGVwdGhfbGF5b3V0OworCisgICAgICAvKioKKyAgICAgICAqIFN0b3JhZ2UgbG9jYXRpb24gb2YgdGhlIGJhc2Ugb2YgdGhpcyB2YXJpYWJsZQorICAgICAgICoKKyAgICAgICAqIFRoZSBwcmVjaXNlIG1lYW5pbmcgb2YgdGhpcyBmaWVsZCBkZXBlbmRzIG9uIHRoZSBuYXR1cmUgb2YgdGhlIHZhcmlhYmxlLgorICAgICAgICoKKyAgICAgICAqICAgLSBWZXJ0ZXggc2hhZGVyIGlucHV0OiBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIFxjIGdsX3ZlcnRfYXR0cmliLgorICAgICAgICogICAtIFZlcnRleCBzaGFkZXIgb3V0cHV0OiBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIFxjIGdsX3Zhcnlpbmdfc2xvdC4KKyAgICAgICAqICAgLSBHZW9tZXRyeSBzaGFkZXIgaW5wdXQ6IG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gXGMgZ2xfdmFyeWluZ19zbG90LgorICAgICAgICogICAtIEdlb21ldHJ5IHNoYWRlciBvdXRwdXQ6IG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gXGMgZ2xfdmFyeWluZ19zbG90LgorICAgICAgICogICAtIEZyYWdtZW50IHNoYWRlciBpbnB1dDogb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBcYyBnbF92YXJ5aW5nX3Nsb3QuCisgICAgICAgKiAgIC0gRnJhZ21lbnQgc2hhZGVyIG91dHB1dDogb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBcYyBnbF9mcmFnX3Jlc3VsdC4KKyAgICAgICAqICAgLSBVbmlmb3JtczogUGVyLXN0YWdlIHVuaWZvcm0gc2xvdCBudW1iZXIgZm9yIGRlZmF1bHQgdW5pZm9ybSBibG9jay4KKyAgICAgICAqICAgLSBVbmlmb3JtczogSW5kZXggd2l0aGluIHRoZSB1bmlmb3JtIGJsb2NrIGRlZmluaXRpb24gZm9yIFVCTyBtZW1iZXJzLgorICAgICAgICogICAtIE90aGVyOiBUaGlzIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4KKyAgICAgICAqCisgICAgICAgKiBJZiB0aGUgdmFyaWFibGUgaXMgYSB1bmlmb3JtLCBzaGFkZXIgaW5wdXQsIG9yIHNoYWRlciBvdXRwdXQsIGFuZCB0aGUKKyAgICAgICAqIHNsb3QgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLCB0aGUgdmFsdWUgd2lsbCBiZSAtMS4KKyAgICAgICAqLworICAgICAgaW50IGxvY2F0aW9uOworCisgICAgICAvKioKKyAgICAgICAqIG91dHB1dCBpbmRleCBmb3IgZHVhbCBzb3VyY2UgYmxlbmRpbmcuCisgICAgICAgKi8KKyAgICAgIGludCBpbmRleDsKKworICAgICAgLyoqCisgICAgICAgKiBJbml0aWFsIGJpbmRpbmcgcG9pbnQgZm9yIGEgc2FtcGxlciBvciBVQk8uCisgICAgICAgKgorICAgICAgICogRm9yIGFycmF5IHR5cGVzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgcG9pbnQgZm9yIHRoZSBmaXJzdCBlbGVtZW50LgorICAgICAgICovCisgICAgICBpbnQgYmluZGluZzsKKworICAgICAgLyoqCisgICAgICAgKiBMb2NhdGlvbiBhbiBhdG9taWMgY291bnRlciBpcyBzdG9yZWQgYXQuCisgICAgICAgKi8KKyAgICAgIHN0cnVjdCB7CisgICAgICAgICB1bnNpZ25lZCBidWZmZXJfaW5kZXg7CisgICAgICAgICB1bnNpZ25lZCBvZmZzZXQ7CisgICAgICB9IGF0b21pYzsKKworICAgICAgLyoqCisgICAgICAgKiBBUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUgcXVhbGlmaWVycy4KKyAgICAgICAqLworICAgICAgc3RydWN0IHsKKyAgICAgICAgIGJvb2wgcmVhZF9vbmx5OyAvKio8ICJyZWFkb25seSIgcXVhbGlmaWVyLiAqLworICAgICAgICAgYm9vbCB3cml0ZV9vbmx5OyAvKio8ICJ3cml0ZW9ubHkiIHF1YWxpZmllci4gKi8KKyAgICAgICAgIGJvb2wgY29oZXJlbnQ7CisgICAgICAgICBib29sIF92b2xhdGlsZTsKKyAgICAgICAgIGJvb2wgcmVzdHJpY3RfZmxhZzsKKworICAgICAgICAgLyoqIEltYWdlIGludGVybmFsIGZvcm1hdCBpZiBzcGVjaWZpZWQgZXhwbGljaXRseSwgb3RoZXJ3aXNlIEdMX05PTkUuICovCisgICAgICAgICBHTGVudW0gZm9ybWF0OworICAgICAgfSBpbWFnZTsKKworICAgICAgLyoqCisgICAgICAgKiBIaWdoZXN0IGVsZW1lbnQgYWNjZXNzZWQgd2l0aCBhIGNvbnN0YW50IGV4cHJlc3Npb24gYXJyYXkgaW5kZXgKKyAgICAgICAqCisgICAgICAgKiBOb3QgdXNlZCBmb3Igbm9uLWFycmF5IHZhcmlhYmxlcy4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgbWF4X2FycmF5X2FjY2VzczsKKworICAgfSBkYXRhOworCisgICAvKioKKyAgICAqIEJ1aWx0LWluIHN0YXRlIHRoYXQgYmFja3MgdGhpcyB1bmlmb3JtCisgICAgKgorICAgICogT25jZSBzZXQgYXQgdmFyaWFibGUgY3JlYXRpb24sIFxjIHN0YXRlX3Nsb3RzIG11c3QgcmVtYWluIGludmFyaWFudC4KKyAgICAqIFRoaXMgaXMgYmVjYXVzZSwgaWRlYWxseSwgdGhpcyBhcnJheSB3b3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsb25lcyBvZgorICAgICogdGhpcyB2YXJpYWJsZSBpbiB0aGUgSVIgdHJlZS4gIEluIG90aGVyIHdvcmRzLCB3ZSdkIHJlYWxseSBsaWtlIGZvciBpdAorICAgICogdG8gYmUgYSBmbHktd2VpZ2h0LgorICAgICoKKyAgICAqIElmIHRoZSB2YXJpYWJsZSBpcyBub3QgYSB1bmlmb3JtLCBcYyBudW1fc3RhdGVfc2xvdHMgd2lsbCBiZSB6ZXJvIGFuZAorICAgICogXGMgc3RhdGVfc2xvdHMgd2lsbCBiZSBcYyBOVUxMLgorICAgICovCisgICAvKkB7Ki8KKyAgIHVuc2lnbmVkIG51bV9zdGF0ZV9zbG90czsgICAgLyoqPCBOdW1iZXIgb2Ygc3RhdGUgc2xvdHMgdXNlZCAqLworICAgaXJfc3RhdGVfc2xvdCAqc3RhdGVfc2xvdHM7ICAvKio8IFN0YXRlIGRlc2NyaXB0b3JzLiAqLworICAgLypAfSovCisKKyAgIC8qKgorICAgICogRW1pdCBhIHdhcm5pbmcgaWYgdGhpcyB2YXJpYWJsZSBpcyBhY2Nlc3NlZC4KKyAgICAqLworICAgY29uc3QgY2hhciAqd2Fybl9leHRlbnNpb247CisKKyAgIC8qKgorICAgICogVmFsdWUgYXNzaWduZWQgaW4gdGhlIGluaXRpYWxpemVyIG9mIGEgdmFyaWFibGUgZGVjbGFyZWQgImNvbnN0IgorICAgICovCisgICBpcl9jb25zdGFudCAqY29uc3RhbnRfdmFsdWU7CisKKyAgIC8qKgorICAgICogQ29uc3RhbnQgZXhwcmVzc2lvbiBhc3NpZ25lZCBpbiB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhlIHZhcmlhYmxlCisgICAgKgorICAgICogXHdhcm5pbmcKKyAgICAqIFRoaXMgZmllbGQgYW5kIFxjIDo6Y29uc3RhbnRfdmFsdWUgYXJlIGRpc3RpbmN0LiAgRXZlbiBpZiB0aGUgdHdvIGZpZWxkcworICAgICogcmVmZXIgdG8gY29uc3RhbnRzIHdpdGggdGhlIHNhbWUgdmFsdWUsIHRoZXkgbXVzdCBwb2ludCB0byBzZXBhcmF0ZQorICAgICogb2JqZWN0cy4KKyAgICAqLworICAgaXJfY29uc3RhbnQgKmNvbnN0YW50X2luaXRpYWxpemVyOworCitwcml2YXRlOgorICAgLyoqCisgICAgKiBGb3IgdmFyaWFibGVzIHRoYXQgYXJlIGluIGFuIGludGVyZmFjZSBibG9jayBvciBhcmUgYW4gaW5zdGFuY2Ugb2YgYW4KKyAgICAqIGludGVyZmFjZSBibG9jaywgdGhpcyBpcyB0aGUgXGMgR0xTTF9UWVBFX0lOVEVSRkFDRSB0eXBlIGZvciB0aGF0IGJsb2NrLgorICAgICoKKyAgICAqIFxzYSBpcl92YXJpYWJsZTo6bG9jYXRpb24KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICppbnRlcmZhY2VfdHlwZTsKK307CisKKy8qKgorICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgd2hldGhlciBhIGJ1aWx0LWluIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUKKyAqIGN1cnJlbnQgc2hhZGluZyBsYW5ndWFnZSAoYmFzZWQgb24gdmVyc2lvbiwgRVMgb3IgZGVza3RvcCwgYW5kIGV4dGVuc2lvbnMpLgorICovCit0eXBlZGVmIGJvb2wgKCpidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUpKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKik7CisKKy8qQHsqLworLyoqCisgKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgYSBmdW5jdGlvbiBpbnN0YW5jZTsgbWF5IGJlIHRoZSBmdWxsIGRlZmluaXRpb24gb3IKKyAqIHNpbXBseSBhIHByb3RvdHlwZS4KKyAqLworY2xhc3MgaXJfZnVuY3Rpb25fc2lnbmF0dXJlIDogcHVibGljIGlyX2luc3RydWN0aW9uIHsKKyAgIC8qIEFuIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSB3aWxsIGJlIHBhcnQgb2YgdGhlIGxpc3Qgb2Ygc2lnbmF0dXJlcyBpbgorICAgICogYW4gaXJfZnVuY3Rpb24uCisgICAgKi8KK3B1YmxpYzoKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZShjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBidWlsdGluX2F2YWlsID0gTlVMTCk7CisKKyAgIHZpcnR1YWwgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpjbG9uZSh2b2lkICptZW1fY3R4LAorCQkJCQlzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpIGNvbnN0OworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpjbG9uZV9wcm90b3R5cGUodm9pZCAqbWVtX2N0eCwKKwkJCQkJICBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpIGNvbnN0OworCisgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKTsKKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworCisgICAvKioKKyAgICAqIEF0dGVtcHQgdG8gZXZhbHVhdGUgdGhpcyBmdW5jdGlvbiBhcyBhIGNvbnN0YW50IGV4cHJlc3Npb24sCisgICAgKiBnaXZlbiBhIGxpc3Qgb2YgdGhlIGFjdHVhbCBwYXJhbWV0ZXJzIGFuZCB0aGUgdmFyaWFibGUgY29udGV4dC4KKyAgICAqIFJldHVybnMgTlVMTCBmb3Igbm9uLWJ1aWx0LWlucy4KKyAgICAqLworICAgaXJfY29uc3RhbnQgKmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoZXhlY19saXN0ICphY3R1YWxfcGFyYW1ldGVycywgc3RydWN0IGhhc2hfdGFibGUgKnZhcmlhYmxlX2NvbnRleHQpOworCisgICAvKioKKyAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gZm9yIHdoaWNoIHRoaXMgaXMgYSBzaWduYXR1cmUKKyAgICAqLworICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSgpIGNvbnN0OworCisgICAvKioKKyAgICAqIEdldCBhIGhhbmRsZSB0byB0aGUgZnVuY3Rpb24gZm9yIHdoaWNoIHRoaXMgaXMgYSBzaWduYXR1cmUKKyAgICAqCisgICAgKiBUaGVyZSBpcyBubyBzZXR0ZXIgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIFxjIGNvbnN0IHBvaW50ZXIsCisgICAgKiBhbmQgXGMgaXJfZnVuY3Rpb25fc2lnbmF0dXJlOjpfZnVuY3Rpb24gaXMgcHJpdmF0ZSBmb3IgYSByZWFzb24uICBUaGUKKyAgICAqIG9ubHkgd2F5IHRvIG1ha2UgYSBjb25uZWN0aW9uIGJldHdlZW4gYSBmdW5jdGlvbiBhbmQgZnVuY3Rpb24gc2lnbmF0dXJlCisgICAgKiBpcyB2aWEgXGMgaXJfZnVuY3Rpb246OmFkZF9zaWduYXR1cmUuICBUaGlzIGhlbHBzIGVuc3VyZSB0aGF0IGNlcnRhaW4KKyAgICAqIGludmFyaWFudHMgKGkuZS4sIGEgZnVuY3Rpb24gc2lnbmF0dXJlIGlzIGluIHRoZSBsaXN0IG9mIHNpZ25hdHVyZXMgZm9yCisgICAgKiBpdHMgXGMgX2Z1bmN0aW9uKSBhcmUgbWV0LgorICAgICoKKyAgICAqIFxzYSBpcl9mdW5jdGlvbjo6YWRkX3NpZ25hdHVyZQorICAgICovCisgICBpbmxpbmUgY29uc3QgY2xhc3MgaXJfZnVuY3Rpb24gKmZ1bmN0aW9uKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzLT5fZnVuY3Rpb247CisgICB9CisKKyAgIC8qKgorICAgICogQ2hlY2sgd2hldGhlciB0aGUgcXVhbGlmaWVycyBtYXRjaCBiZXR3ZWVuIHRoaXMgc2lnbmF0dXJlJ3MgcGFyYW1ldGVycworICAgICogYW5kIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgbGlzdC4gIElmIG5vdCwgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QKKyAgICAqIHBhcmFtZXRlciB3aXRoIG1pc21hdGNoZWQgcXVhbGlmaWVycyAoZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcykuCisgICAgKi8KKyAgIGNvbnN0IGNoYXIgKnF1YWxpZmllcnNfbWF0Y2goZXhlY19saXN0ICpwYXJhbXMpOworCisgICAvKioKKyAgICAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gb25lLiAgVGhpcyBpcyB1c2VmdWwKKyAgICAqIGlmIHRoZSBjdXJyZW50IGluZm9ybWF0aW9uIGNhbWUgZnJvbSBhIHByb3RvdHlwZSwgYW5kIGVpdGhlciBoYXMgaW52YWxpZAorICAgICogb3IgbWlzc2luZyBwYXJhbWV0ZXIgbmFtZXMuCisgICAgKi8KKyAgIHZvaWQgcmVwbGFjZV9wYXJhbWV0ZXJzKGV4ZWNfbGlzdCAqbmV3X3BhcmFtcyk7CisKKyAgIC8qKgorICAgICogRnVuY3Rpb24gcmV0dXJuIHR5cGUuCisgICAgKgorICAgICogXG5vdGUgVGhpcyBkaXNjYXJkcyB0aGUgb3B0aW9uYWwgcHJlY2lzaW9uIHF1YWxpZmllci4KKyAgICAqLworICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqcmV0dXJuX3R5cGU7CisKKyAgIC8qKgorICAgICogTGlzdCBvZiBpcl92YXJpYWJsZSBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorICAgICoKKyAgICAqIFRoaXMgcmVwcmVzZW50cyB0aGUgc3RvcmFnZS4gIFRoZSBwYXJhbWF0ZXJzIHBhc3NlZCBpbiBhIHBhcnRpY3VsYXIKKyAgICAqIGNhbGwgd2lsbCBiZSBpbiBpcl9jYWxsOjphY3R1YWxfcGFyYW1hdGVycy4KKyAgICAqLworICAgc3RydWN0IGV4ZWNfbGlzdCBwYXJhbWV0ZXJzOworCisgICAvKiogV2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiBoYXMgYSBib2R5ICh3aGljaCBtYXkgYmUgZW1wdHkpLiAqLworICAgdW5zaWduZWQgaXNfZGVmaW5lZDoxOworCisgICAvKiogV2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiBzaWduYXR1cmUgaXMgYSBidWlsdC1pbi4gKi8KKyAgIGJvb2wgaXNfYnVpbHRpbigpIGNvbnN0OworCisgICAvKioKKyAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgZnVuY3Rpb24gaXMgYW4gaW50cmluc2ljIHRvIGJlIGltcGxlbWVudGVkCisgICAgKiBieSB0aGUgZHJpdmVyLgorICAgICovCisgICBib29sIGlzX2ludHJpbnNpYzsKKworICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgYnVpbHQtaW4gaXMgYXZhaWxhYmxlIGZvciB0aGlzIHNoYWRlci4gKi8KKyAgIGJvb2wgaXNfYnVpbHRpbl9hdmFpbGFibGUoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpIGNvbnN0OworCisgICAvKiogQm9keSBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIGZ1bmN0aW9uLiAqLworICAgc3RydWN0IGV4ZWNfbGlzdCBib2R5OworCitwcml2YXRlOgorICAgLyoqCisgICAgKiBBIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYSBwcmVkaWNhdGUgdGhhdCBhbnN3ZXJzIHdoZXRoZXIgYSBidWlsdC1pbgorICAgICogZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHNoYWRlci4gIE5VTEwgaWYgbm90IGEgYnVpbHQtaW4uCisgICAgKi8KKyAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBidWlsdGluX2F2YWlsOworCisgICAvKiogRnVuY3Rpb24gb2Ygd2hpY2ggdGhpcyBzaWduYXR1cmUgaXMgb25lIG92ZXJsb2FkLiAqLworICAgY2xhc3MgaXJfZnVuY3Rpb24gKl9mdW5jdGlvbjsKKworICAgLyoqIEZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB3aGljaCB0aGlzIG9uZSBpcyBhIHByb3RvdHlwZSBjbG9uZSAqLworICAgY29uc3QgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpvcmlnaW47CisKKyAgIGZyaWVuZCBjbGFzcyBpcl9mdW5jdGlvbjsKKworICAgLyoqCisgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcnVuIGEgbGlzdCBvZiBpbnN0cnVjdGlvbnMgZm9yIGNvbnN0YW50CisgICAgKiBleHByZXNzaW9uIGV2YWx1YXRpb24uCisgICAgKgorICAgICogVGhlIGhhc2ggdGFibGUgcmVwcmVzZW50cyB0aGUgdmFsdWVzIG9mIHRoZSB2aXNpYmxlIHZhcmlhYmxlcy4KKyAgICAqIFRoZXJlIGFyZSBubyBzY29waW5nIGlzc3VlcyBiZWNhdXNlIHRoZSB0YWJsZSBpcyBpbmRleGVkIG9uCisgICAgKiBpcl92YXJpYWJsZSBwb2ludGVycywgbm90IHZhcmlhYmxlIG5hbWVzLgorICAgICoKKyAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50LCB0cnVlIG90aGVyd2lzZSwKKyAgICAqIGFuZCB0aGUgdmFsdWUgaW4gKnJlc3VsdCBpZiByZXN1bHQgaXMgbm9uLU5VTEwuCisgICAgKi8KKyAgIGJvb2wgY29uc3RhbnRfZXhwcmVzc2lvbl9ldmFsdWF0ZV9leHByZXNzaW9uX2xpc3QoY29uc3Qgc3RydWN0IGV4ZWNfbGlzdCAmYm9keSwKKwkJCQkJCSAgICAgc3RydWN0IGhhc2hfdGFibGUgKnZhcmlhYmxlX2NvbnRleHQsCisJCQkJCQkgICAgIGlyX2NvbnN0YW50ICoqcmVzdWx0KTsKK307CisKKworLyoqCisgKiBIZWFkZXIgZm9yIHRyYWNraW5nIG11bHRpcGxlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAqIENvbnRhaW5zIGEgbGlzdCBvZiBpcl9mdW5jdGlvbl9zaWduYXR1cmVzIHJlcHJlc2VudGluZyBlYWNoIG9mIHRoZQorICogYWN0dWFsIGZ1bmN0aW9ucy4KKyAqLworY2xhc3MgaXJfZnVuY3Rpb24gOiBwdWJsaWMgaXJfaW5zdHJ1Y3Rpb24geworcHVibGljOgorICAgaXJfZnVuY3Rpb24oY29uc3QgY2hhciAqbmFtZSk7CisKKyAgIHZpcnR1YWwgaXJfZnVuY3Rpb24gKmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3Q7CisKKyAgIHZpcnR1YWwgaXJfZnVuY3Rpb24gKmFzX2Z1bmN0aW9uKCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKTsKKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworCisgICB2b2lkIGFkZF9zaWduYXR1cmUoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcpCisgICB7CisgICAgICBzaWctPl9mdW5jdGlvbiA9IHRoaXM7CisgICAgICB0aGlzLT5zaWduYXR1cmVzLnB1c2hfdGFpbChzaWcpOworICAgfQorCisgICAvKioKKyAgICAqIEZpbmQgYSBzaWduYXR1cmUgdGhhdCBtYXRjaGVzIGEgc2V0IG9mIGFjdHVhbCBwYXJhbWV0ZXJzLCB0YWtpbmcgaW1wbGljaXQKKyAgICAqIGNvbnZlcnNpb25zIGludG8gYWNjb3VudC4gIEFsc28gZmxhZ3Mgd2hldGhlciB0aGUgbWF0Y2ggd2FzIGV4YWN0LgorICAgICovCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKm1hdGNoaW5nX3NpZ25hdHVyZShfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWNfbGlzdCAqYWN0dWFsX3BhcmFtLAorCQkJCQkgICAgIGJvb2wgKm1hdGNoX2lzX2V4YWN0KTsKKworICAgLyoqCisgICAgKiBGaW5kIGEgc2lnbmF0dXJlIHRoYXQgbWF0Y2hlcyBhIHNldCBvZiBhY3R1YWwgcGFyYW1ldGVycywgdGFraW5nIGltcGxpY2l0CisgICAgKiBjb252ZXJzaW9ucyBpbnRvIGFjY291bnQuCisgICAgKi8KKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqbWF0Y2hpbmdfc2lnbmF0dXJlKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY19saXN0ICphY3R1YWxfcGFyYW0pOworCisgICAvKioKKyAgICAqIEZpbmQgYSBzaWduYXR1cmUgdGhhdCBleGFjdGx5IG1hdGNoZXMgYSBzZXQgb2YgYWN0dWFsIHBhcmFtZXRlcnMgd2l0aG91dAorICAgICogYW55IGltcGxpY2l0IHR5cGUgY29udmVyc2lvbnMuCisgICAgKi8KKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqZXhhY3RfbWF0Y2hpbmdfc2lnbmF0dXJlKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY19saXN0ICphY3R1YWxfcHMpOworCisgICAvKioKKyAgICAqIE5hbWUgb2YgdGhlIGZ1bmN0aW9uLgorICAgICovCisgICBjb25zdCBjaGFyICpuYW1lOworCisgICAvKiogV2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiBoYXMgYSBzaWduYXR1cmUgdGhhdCBpc24ndCBhIGJ1aWx0LWluLiAqLworICAgYm9vbCBoYXNfdXNlcl9zaWduYXR1cmUoKTsKKworICAgLyoqCisgICAgKiBMaXN0IG9mIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSBmb3IgZWFjaCBvdmVybG9hZGVkIGZ1bmN0aW9uIHdpdGggdGhpcyBuYW1lLgorICAgICovCisgICBzdHJ1Y3QgZXhlY19saXN0IHNpZ25hdHVyZXM7Cit9OworCitpbmxpbmUgY29uc3QgY2hhciAqaXJfZnVuY3Rpb25fc2lnbmF0dXJlOjpmdW5jdGlvbl9uYW1lKCkgY29uc3QKK3sKKyAgIHJldHVybiB0aGlzLT5fZnVuY3Rpb24tPm5hbWU7Cit9CisvKkB9Ki8KKworCisvKioKKyAqIElSIGluc3RydWN0aW9uIHJlcHJlc2VudGluZyBoaWdoLWxldmVsIGlmLXN0YXRlbWVudHMKKyAqLworY2xhc3MgaXJfaWYgOiBwdWJsaWMgaXJfaW5zdHJ1Y3Rpb24geworcHVibGljOgorICAgaXJfaWYoaXJfcnZhbHVlICpjb25kaXRpb24pCisgICAgICA6IGNvbmRpdGlvbihjb25kaXRpb24pCisgICB7CisgICAgICBpcl90eXBlID0gaXJfdHlwZV9pZjsKKyAgIH0KKworICAgdmlydHVhbCBpcl9pZiAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdDsKKworICAgdmlydHVhbCBpcl9pZiAqYXNfaWYoKQorICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICB9CisKKyAgIHZpcnR1YWwgdm9pZCBhY2NlcHQoaXJfdmlzaXRvciAqdikKKyAgIHsKKyAgICAgIHYtPnZpc2l0KHRoaXMpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIGFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqKTsKKyAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pOworCisKKyAgIGlyX3J2YWx1ZSAqY29uZGl0aW9uOworICAgLyoqIExpc3Qgb2YgaXJfaW5zdHJ1Y3Rpb24gZm9yIHRoZSBib2R5IG9mIHRoZSB0aGVuIGJyYW5jaCAqLworICAgZXhlY19saXN0ICB0aGVuX2luc3RydWN0aW9uczsKKyAgIC8qKiBMaXN0IG9mIGlyX2luc3RydWN0aW9uIGZvciB0aGUgYm9keSBvZiB0aGUgZWxzZSBicmFuY2ggKi8KKyAgIGV4ZWNfbGlzdCAgZWxzZV9pbnN0cnVjdGlvbnM7Cit9OworCisKKy8qKgorICogSVIgaW5zdHJ1Y3Rpb24gcmVwcmVzZW50aW5nIGEgaGlnaC1sZXZlbCBsb29wIHN0cnVjdHVyZS4KKyAqLworY2xhc3MgaXJfbG9vcCA6IHB1YmxpYyBpcl9pbnN0cnVjdGlvbiB7CitwdWJsaWM6CisgICBpcl9sb29wKCk7CisKKyAgIHZpcnR1YWwgaXJfbG9vcCAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdDsKKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIHZpcnR1YWwgdm9pZCBhY2NlcHQoaXJfdmlzaXRvciAqdikKKyAgIHsKKyAgICAgIHYtPnZpc2l0KHRoaXMpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIGFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqKTsKKworICAgdmlydHVhbCBpcl9sb29wICphc19sb29wKCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICAvKiogTGlzdCBvZiBpcl9pbnN0cnVjdGlvbiB0aGF0IG1ha2UgdXAgdGhlIGJvZHkgb2YgdGhlIGxvb3AuICovCisgICBleGVjX2xpc3QgYm9keV9pbnN0cnVjdGlvbnM7Cit9OworCisKK2NsYXNzIGlyX2Fzc2lnbm1lbnQgOiBwdWJsaWMgaXJfaW5zdHJ1Y3Rpb24geworcHVibGljOgorICAgaXJfYXNzaWdubWVudChpcl9ydmFsdWUgKmxocywgaXJfcnZhbHVlICpyaHMsIGlyX3J2YWx1ZSAqY29uZGl0aW9uID0gTlVMTCk7CisKKyAgIC8qKgorICAgICogQ29uc3RydWN0IGFuIGFzc2lnbm1lbnQgd2l0aCBhbiBleHBsaWNpdCB3cml0ZSBtYXNrCisgICAgKgorICAgICogXG5vdGUKKyAgICAqIFNpbmNlIGEgd3JpdGUgbWFzayBpcyBzdXBwbGllZCwgdGhlIExIUyBtdXN0IGFscmVhZHkgYmUgYSBiYXJlCisgICAgKiBcYyBpcl9kZXJlZmVyZW5jZS4gIFRoZSBjYW5ub3QgYmUgYW55IHN3aXp6bGVzIGluIHRoZSBMSFMuCisgICAgKi8KKyAgIGlyX2Fzc2lnbm1lbnQoaXJfZGVyZWZlcmVuY2UgKmxocywgaXJfcnZhbHVlICpyaHMsIGlyX3J2YWx1ZSAqY29uZGl0aW9uLAorCQkgdW5zaWduZWQgd3JpdGVfbWFzayk7CisKKyAgIHZpcnR1YWwgaXJfYXNzaWdubWVudCAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdDsKKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIHZpcnR1YWwgaXJfY29uc3RhbnQgKmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoc3RydWN0IGhhc2hfdGFibGUgKnZhcmlhYmxlX2NvbnRleHQgPSBOVUxMKTsKKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworCisgICB2aXJ0dWFsIGlyX2Fzc2lnbm1lbnQgKiBhc19hc3NpZ25tZW50KCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICAvKioKKyAgICAqIEdldCBhIHdob2xlIHZhcmlhYmxlIHdyaXR0ZW4gYnkgYW4gYXNzaWdubWVudAorICAgICoKKyAgICAqIElmIHRoZSBMSFMgb2YgdGhlIGFzc2lnbm1lbnQgd3JpdGVzIGEgd2hvbGUgdmFyaWFibGUsIHRoZSB2YXJpYWJsZSBpcworICAgICogcmV0dXJuZWQuICBPdGhlcndpc2UgXGMgTlVMTCBpcyByZXR1cm5lZC4gIEV4YW1wbGVzIG9mIHdob2xlLXZhcmlhYmxlCisgICAgKiBhc3NpZ25tZW50IGFyZToKKyAgICAqCisgICAgKiAgLSBBc3NpZ25pbmcgdG8gYSBzY2FsYXIKKyAgICAqICAtIEFzc2lnbmluZyB0byBhbGwgY29tcG9uZW50cyBvZiBhIHZlY3RvcgorICAgICogIC0gV2hvbGUgYXJyYXkgKG9yIG1hdHJpeCkgYXNzaWdubWVudAorICAgICogIC0gV2hvbGUgc3RydWN0dXJlIGFzc2lnbm1lbnQKKyAgICAqLworICAgaXJfdmFyaWFibGUgKndob2xlX3ZhcmlhYmxlX3dyaXR0ZW4oKTsKKworICAgLyoqCisgICAgKiBTZXQgdGhlIExIUyBvZiBhbiBhc3NpZ25tZW50CisgICAgKi8KKyAgIHZvaWQgc2V0X2xocyhpcl9ydmFsdWUgKmxocyk7CisKKyAgIC8qKgorICAgICogTGVmdC1oYW5kIHNpZGUgb2YgdGhlIGFzc2lnbm1lbnQuCisgICAgKgorICAgICogVGhpcyBzaG91bGQgYmUgdHJlYXRlZCBhcyByZWFkIG9ubHkuICBJZiB5b3UgbmVlZCB0byBzZXQgdGhlIExIUyBvZiBhbgorICAgICogYXNzaWdubWVudCwgdXNlIFxjIGlyX2Fzc2lnbm1lbnQ6OnNldF9saHMuCisgICAgKi8KKyAgIGlyX2RlcmVmZXJlbmNlICpsaHM7CisKKyAgIC8qKgorICAgICogVmFsdWUgYmVpbmcgYXNzaWduZWQKKyAgICAqLworICAgaXJfcnZhbHVlICpyaHM7CisKKyAgIC8qKgorICAgICogT3B0aW9uYWwgY29uZGl0aW9uIGZvciB0aGUgYXNzaWdubWVudC4KKyAgICAqLworICAgaXJfcnZhbHVlICpjb25kaXRpb247CisKKworICAgLyoqCisgICAgKiBDb21wb25lbnQgbWFzayB3cml0dGVuCisgICAgKgorICAgICogRm9yIG5vbi12ZWN0b3IgdHlwZXMgaW4gdGhlIExIUywgdGhpcyBmaWVsZCB3aWxsIGJlIHplcm8uICBGb3IgdmVjdG9yCisgICAgKiB0eXBlcywgYSBiaXQgd2lsbCBiZSBzZXQgZm9yIGVhY2ggY29tcG9uZW50IHRoYXQgaXMgd3JpdHRlbi4gIE5vdGUgdGhhdAorICAgICogZm9yIFxjIHZlYzIgYW5kIFxjIHZlYzMgdHlwZXMgb25seSB0aGUgbG93ZXIgYml0cyB3aWxsIGV2ZXIgYmUgc2V0LgorICAgICoKKyAgICAqIEEgcGFydGlhbGx5LXNldCB3cml0ZSBtYXNrIG1lYW5zIHRoYXQgZWFjaCBlbmFibGVkIGNoYW5uZWwgZ2V0cworICAgICogdGhlIHZhbHVlIGZyb20gYSBjb25zZWN1dGl2ZSBjaGFubmVsIG9mIHRoZSByaHMuICBGb3IgZXhhbXBsZSwKKyAgICAqIHRvIHdyaXRlIGp1c3QgLnh5dyBvZiBnbF9Gcm9udENvbG9yIHdpdGggY29sb3I6CisgICAgKgorICAgICogKGFzc2lnbiAoY29uc3RhbnQgYm9vbCAoMSkpICh4eXcpCisgICAgKiAgICAgKHZhcl9yZWYgZ2xfRnJhZ0NvbG9yKQorICAgICogICAgIChzd2l6IHh5dyAodmFyX3JlZiBjb2xvcikpKQorICAgICovCisgICB1bnNpZ25lZCB3cml0ZV9tYXNrOjQ7Cit9OworCisvKiBVcGRhdGUgaXJfZXhwcmVzc2lvbjo6Z2V0X251bV9vcGVyYW5kcygpIGFuZCBvcGVyYXRvcl9zdHJzIHdoZW4KKyAqIHVwZGF0aW5nIHRoaXMgbGlzdC4KKyAqLworZW51bSBpcl9leHByZXNzaW9uX29wZXJhdGlvbiB7CisgICBpcl91bm9wX2JpdF9ub3QsCisgICBpcl91bm9wX2xvZ2ljX25vdCwKKyAgIGlyX3Vub3BfbmVnLAorICAgaXJfdW5vcF9hYnMsCisgICBpcl91bm9wX3NpZ24sCisgICBpcl91bm9wX3JjcCwKKyAgIGlyX3Vub3BfcnNxLAorICAgaXJfdW5vcF9zcXJ0LAorICAgaXJfdW5vcF9leHAsICAgICAgICAgLyoqPCBMb2cgYmFzZSBlIG9uIGdlbnR5cGUgKi8KKyAgIGlyX3Vub3BfbG9nLAkgICAgICAgIC8qKjwgTmF0dXJhbCBsb2cgb24gZ2VudHlwZSAqLworICAgaXJfdW5vcF9leHAyLAorICAgaXJfdW5vcF9sb2cyLAorICAgaXJfdW5vcF9mMmksICAgICAgICAgLyoqPCBGbG9hdC10by1pbnRlZ2VyIGNvbnZlcnNpb24uICovCisgICBpcl91bm9wX2YydSwgICAgICAgICAvKio8IEZsb2F0LXRvLXVuc2lnbmVkIGNvbnZlcnNpb24uICovCisgICBpcl91bm9wX2kyZiwgICAgICAgICAvKio8IEludGVnZXItdG8tZmxvYXQgY29udmVyc2lvbi4gKi8KKyAgIGlyX3Vub3BfZjJiLCAgICAgICAgIC8qKjwgRmxvYXQtdG8tYm9vbGVhbiBjb252ZXJzaW9uICovCisgICBpcl91bm9wX2IyZiwgICAgICAgICAvKio8IEJvb2xlYW4tdG8tZmxvYXQgY29udmVyc2lvbiAqLworICAgaXJfdW5vcF9pMmIsICAgICAgICAgLyoqPCBpbnQtdG8tYm9vbGVhbiBjb252ZXJzaW9uICovCisgICBpcl91bm9wX2IyaSwgICAgICAgICAvKio8IEJvb2xlYW4tdG8taW50IGNvbnZlcnNpb24gKi8KKyAgIGlyX3Vub3BfdTJmLCAgICAgICAgIC8qKjwgVW5zaWduZWQtdG8tZmxvYXQgY29udmVyc2lvbi4gKi8KKyAgIGlyX3Vub3BfaTJ1LCAgICAgICAgIC8qKjwgSW50ZWdlci10by11bnNpZ25lZCBjb252ZXJzaW9uLiAqLworICAgaXJfdW5vcF91MmksICAgICAgICAgLyoqPCBVbnNpZ25lZC10by1pbnRlZ2VyIGNvbnZlcnNpb24uICovCisgICBpcl91bm9wX2JpdGNhc3RfaTJmLCAvKio8IEJpdC1pZGVudGljYWwgaW50LXRvLWZsb2F0ICJjb252ZXJzaW9uIiAqLworICAgaXJfdW5vcF9iaXRjYXN0X2YyaSwgLyoqPCBCaXQtaWRlbnRpY2FsIGZsb2F0LXRvLWludCAiY29udmVyc2lvbiIgKi8KKyAgIGlyX3Vub3BfYml0Y2FzdF91MmYsIC8qKjwgQml0LWlkZW50aWNhbCB1aW50LXRvLWZsb2F0ICJjb252ZXJzaW9uIiAqLworICAgaXJfdW5vcF9iaXRjYXN0X2YydSwgLyoqPCBCaXQtaWRlbnRpY2FsIGZsb2F0LXRvLXVpbnQgImNvbnZlcnNpb24iICovCisgICBpcl91bm9wX2FueSwKKworICAgLyoqCisgICAgKiBcbmFtZSBVbmFyeSBmbG9hdGluZy1wb2ludCByb3VuZGluZyBvcGVyYXRpb25zLgorICAgICovCisgICAvKkB7Ki8KKyAgIGlyX3Vub3BfdHJ1bmMsCisgICBpcl91bm9wX2NlaWwsCisgICBpcl91bm9wX2Zsb29yLAorICAgaXJfdW5vcF9mcmFjdCwKKyAgIGlyX3Vub3Bfcm91bmRfZXZlbiwKKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIFxuYW1lIFRyaWdvbm9tZXRyaWMgb3BlcmF0aW9ucy4KKyAgICAqLworICAgLypAeyovCisgICBpcl91bm9wX3NpbiwKKyAgIGlyX3Vub3BfY29zLAorICAgaXJfdW5vcF9zaW5fcmVkdWNlZCwgICAgLyoqPCBSZWR1Y2VkIHJhbmdlIHNpbi4gWy1waSwgcGldICovCisgICBpcl91bm9wX2Nvc19yZWR1Y2VkLCAgICAvKio8IFJlZHVjZWQgcmFuZ2UgY29zLiBbLXBpLCBwaV0gKi8KKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIFxuYW1lIFBhcnRpYWwgZGVyaXZhdGl2ZXMuCisgICAgKi8KKyAgIC8qQHsqLworICAgaXJfdW5vcF9kRmR4LAorICAgaXJfdW5vcF9kRmR5LAorICAgLypAfSovCisKKyAgIC8qKgorICAgICogXG5hbWUgRmxvYXRpbmcgcG9pbnQgcGFjayBhbmQgdW5wYWNrIG9wZXJhdGlvbnMuCisgICAgKi8KKyAgIC8qQHsqLworICAgaXJfdW5vcF9wYWNrX3Nub3JtXzJ4MTYsCisgICBpcl91bm9wX3BhY2tfc25vcm1fNHg4LAorICAgaXJfdW5vcF9wYWNrX3Vub3JtXzJ4MTYsCisgICBpcl91bm9wX3BhY2tfdW5vcm1fNHg4LAorICAgaXJfdW5vcF9wYWNrX2hhbGZfMngxNiwKKyAgIGlyX3Vub3BfdW5wYWNrX3Nub3JtXzJ4MTYsCisgICBpcl91bm9wX3VucGFja19zbm9ybV80eDgsCisgICBpcl91bm9wX3VucGFja191bm9ybV8yeDE2LAorICAgaXJfdW5vcF91bnBhY2tfdW5vcm1fNHg4LAorICAgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2LAorICAgLypAfSovCisKKyAgIC8qKgorICAgICogXG5hbWUgTG93ZXJlZCBmbG9hdGluZyBwb2ludCB1bnBhY2tpbmcgb3BlcmF0aW9ucy4KKyAgICAqCisgICAgKiBcc2VlIGxvd2VyX3BhY2tpbmdfYnVpbHRpbnNfdmlzaXRvcjo6c3BsaXRfdW5wYWNrX2hhbGZfMngxNgorICAgICovCisgICAvKkB7Ki8KKyAgIGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNl9zcGxpdF94LAorICAgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3ksCisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBcbmFtZSBCaXQgb3BlcmF0aW9ucywgcGFydCBvZiBBUkJfZ3B1X3NoYWRlcjUuCisgICAgKi8KKyAgIC8qQHsqLworICAgaXJfdW5vcF9iaXRmaWVsZF9yZXZlcnNlLAorICAgaXJfdW5vcF9iaXRfY291bnQsCisgICBpcl91bm9wX2ZpbmRfbXNiLAorICAgaXJfdW5vcF9maW5kX2xzYiwKKyAgIC8qQH0qLworCisgICBpcl91bm9wX25vaXNlLAorCisgICAvKioKKyAgICAqIEEgc2VudGluZWwgbWFya2luZyB0aGUgbGFzdCBvZiB0aGUgdW5hcnkgb3BlcmF0aW9ucy4KKyAgICAqLworICAgaXJfbGFzdF91bm9wID0gaXJfdW5vcF9ub2lzZSwKKworICAgaXJfYmlub3BfYWRkLAorICAgaXJfYmlub3Bfc3ViLAorICAgaXJfYmlub3BfbXVsLCAgICAgICAvKio8IEZsb2F0aW5nLXBvaW50IG9yIGxvdyAzMi1iaXQgaW50ZWdlciBtdWx0aXBseS4gKi8KKyAgIGlyX2Jpbm9wX2ltdWxfaGlnaCwgLyoqPCBDYWxjdWxhdGVzIHRoZSBoaWdoIDMyLWJpdHMgb2YgYSA2NC1iaXQgbXVsdGlwbHkuICovCisgICBpcl9iaW5vcF9kaXYsCisKKyAgIC8qKgorICAgICogUmV0dXJucyB0aGUgY2FycnkgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGl0aW9uIG9mIHRoZSB0d28gYXJndW1lbnRzLgorICAgICovCisgICAvKkB7Ki8KKyAgIGlyX2Jpbm9wX2NhcnJ5LAorICAgLypAfSovCisKKyAgIC8qKgorICAgICogUmV0dXJucyB0aGUgYm9ycm93IHJlc3VsdGluZyBmcm9tIHRoZSBzdWJ0cmFjdGlvbiBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50CisgICAgKiBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICAqLworICAgLypAeyovCisgICBpcl9iaW5vcF9ib3Jyb3csCisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBUYWtlcyBvbmUgb2YgdHdvIGNvbWJpbmF0aW9ucyBvZiBhcmd1bWVudHM6CisgICAgKgorICAgICogLSBtb2QodmVjTiwgdmVjTikKKyAgICAqIC0gbW9kKHZlY04sIGZsb2F0KQorICAgICoKKyAgICAqIERvZXMgbm90IHRha2UgaW50ZWdlciB0eXBlcy4KKyAgICAqLworICAgaXJfYmlub3BfbW9kLAorCisgICAvKioKKyAgICAqIFxuYW1lIEJpbmFyeSBjb21wYXJpc29uIG9wZXJhdG9ycyB3aGljaCByZXR1cm4gYSBib29sZWFuIHZlY3Rvci4KKyAgICAqIFRoZSB0eXBlIG9mIGJvdGggb3BlcmFuZHMgbXVzdCBiZSBlcXVhbC4KKyAgICAqLworICAgLypAeyovCisgICBpcl9iaW5vcF9sZXNzLAorICAgaXJfYmlub3BfZ3JlYXRlciwKKyAgIGlyX2Jpbm9wX2xlcXVhbCwKKyAgIGlyX2Jpbm9wX2dlcXVhbCwKKyAgIGlyX2Jpbm9wX2VxdWFsLAorICAgaXJfYmlub3BfbmVxdWFsLAorICAgLyoqCisgICAgKiBSZXR1cm5zIHNpbmdsZSBib29sZWFuIGZvciB3aGV0aGVyIGFsbCBjb21wb25lbnRzIG9mIG9wZXJhbmRzWzBdCisgICAgKiBlcXVhbCB0aGUgY29tcG9uZW50cyBvZiBvcGVyYW5kc1sxXS4KKyAgICAqLworICAgaXJfYmlub3BfYWxsX2VxdWFsLAorICAgLyoqCisgICAgKiBSZXR1cm5zIHNpbmdsZSBib29sZWFuIGZvciB3aGV0aGVyIGFueSBjb21wb25lbnQgb2Ygb3BlcmFuZHNbMF0KKyAgICAqIGlzIG5vdCBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgb2Ygb3BlcmFuZHNbMV0uCisgICAgKi8KKyAgIGlyX2Jpbm9wX2FueV9uZXF1YWwsCisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBcbmFtZSBCaXQtd2lzZSBiaW5hcnkgb3BlcmF0aW9ucy4KKyAgICAqLworICAgLypAeyovCisgICBpcl9iaW5vcF9sc2hpZnQsCisgICBpcl9iaW5vcF9yc2hpZnQsCisgICBpcl9iaW5vcF9iaXRfYW5kLAorICAgaXJfYmlub3BfYml0X3hvciwKKyAgIGlyX2Jpbm9wX2JpdF9vciwKKyAgIC8qQH0qLworCisgICBpcl9iaW5vcF9sb2dpY19hbmQsCisgICBpcl9iaW5vcF9sb2dpY194b3IsCisgICBpcl9iaW5vcF9sb2dpY19vciwKKworICAgaXJfYmlub3BfZG90LAorICAgaXJfYmlub3BfbWluLAorICAgaXJfYmlub3BfbWF4LAorCisgICBpcl9iaW5vcF9wb3csCisKKyAgIC8qKgorICAgICogXG5hbWUgTG93ZXJlZCBmbG9hdGluZyBwb2ludCBwYWNraW5nIG9wZXJhdGlvbnMuCisgICAgKgorICAgICogXHNlZSBsb3dlcl9wYWNraW5nX2J1aWx0aW5zX3Zpc2l0b3I6OnNwbGl0X3BhY2tfaGFsZl8yeDE2CisgICAgKi8KKyAgIC8qQHsqLworICAgaXJfYmlub3BfcGFja19oYWxmXzJ4MTZfc3BsaXQsCisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBcbmFtZSBGaXJzdCBoYWxmIG9mIGEgbG93ZXJlZCBiaXRmaWVsZEluc2VydCgpIG9wZXJhdGlvbi4KKyAgICAqCisgICAgKiBcc2VlIGxvd2VyX2luc3RydWN0aW9uczo6Yml0ZmllbGRfaW5zZXJ0X3RvX2JmbV9iZmkKKyAgICAqLworICAgLypAeyovCisgICBpcl9iaW5vcF9iZm0sCisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBMb2FkIGEgdmFsdWUgdGhlIHNpemUgb2YgYSBnaXZlbiBHTFNMIHR5cGUgZnJvbSBhIHVuaWZvcm0gYmxvY2suCisgICAgKgorICAgICogb3BlcmFuZDAgaXMgdGhlIGlyX2NvbnN0YW50IHVuaWZvcm0gYmxvY2sgaW5kZXggaW4gdGhlIGxpbmtlZCBzaGFkZXIuCisgICAgKiBvcGVyYW5kMSBpcyBhIGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgdW5pZm9ybSBibG9jay4KKyAgICAqLworICAgaXJfYmlub3BfdWJvX2xvYWQsCisKKyAgIC8qKgorICAgICogXG5hbWUgTXVsdGlwbGllcyBhIG51bWJlciBieSB0d28gdG8gYSBwb3dlciwgcGFydCBvZiBBUkJfZ3B1X3NoYWRlcjUuCisgICAgKi8KKyAgIC8qQHsqLworICAgaXJfYmlub3BfbGRleHAsCisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBFeHRyYWN0IGEgc2NhbGFyIGZyb20gYSB2ZWN0b3IKKyAgICAqCisgICAgKiBvcGVyYW5kMCBpcyB0aGUgdmVjdG9yCisgICAgKiBvcGVyYW5kMSBpcyB0aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIHJlYWQgZnJvbSBvcGVyYW5kMAorICAgICovCisgICBpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdCwKKworICAgLyoqCisgICAgKiBBIHNlbnRpbmVsIG1hcmtpbmcgdGhlIGxhc3Qgb2YgdGhlIGJpbmFyeSBvcGVyYXRpb25zLgorICAgICovCisgICBpcl9sYXN0X2Jpbm9wID0gaXJfYmlub3BfdmVjdG9yX2V4dHJhY3QsCisKKyAgIC8qKgorICAgICogXG5hbWUgRnVzZWQgZmxvYXRpbmctcG9pbnQgbXVsdGlwbHktYWRkLCBwYXJ0IG9mIEFSQl9ncHVfc2hhZGVyNS4KKyAgICAqLworICAgLypAeyovCisgICBpcl90cmlvcF9mbWEsCisgICAvKkB9Ki8KKworICAgaXJfdHJpb3BfbHJwLAorCisgICAvKioKKyAgICAqIFxuYW1lIENvbmRpdGlvbmFsIFNlbGVjdAorICAgICoKKyAgICAqIEEgdmVjdG9yIGNvbmRpdGlvbmFsIHNlbGVjdCBpbnN0cnVjdGlvbiAobGlrZSA/OiwgYnV0IG9wZXJhdGluZyBwZXItCisgICAgKiBjb21wb25lbnQgb24gdmVjdG9ycykuCisgICAgKgorICAgICogXHNlZSBsb3dlcl9pbnN0cnVjdGlvbnNfdmlzaXRvcjo6bGRleHBfdG9fYXJpdGgKKyAgICAqLworICAgLypAeyovCisgICBpcl90cmlvcF9jc2VsLAorICAgLypAfSovCisKKyAgIC8qKgorICAgICogXG5hbWUgU2Vjb25kIGhhbGYgb2YgYSBsb3dlcmVkIGJpdGZpZWxkSW5zZXJ0KCkgb3BlcmF0aW9uLgorICAgICoKKyAgICAqIFxzZWUgbG93ZXJfaW5zdHJ1Y3Rpb25zOjpiaXRmaWVsZF9pbnNlcnRfdG9fYmZtX2JmaQorICAgICovCisgICAvKkB7Ki8KKyAgIGlyX3RyaW9wX2JmaSwKKyAgIC8qQH0qLworCisgICBpcl90cmlvcF9iaXRmaWVsZF9leHRyYWN0LAorCisgICAvKioKKyAgICAqIEdlbmVyYXRlIGEgdmFsdWUgd2l0aCBvbmUgZmllbGQgb2YgYSB2ZWN0b3IgY2hhbmdlZAorICAgICoKKyAgICAqIG9wZXJhbmQwIGlzIHRoZSB2ZWN0b3IKKyAgICAqIG9wZXJhbmQxIGlzIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSB2ZWN0b3IgcmVzdWx0CisgICAgKiBvcGVyYW5kMiBpcyB0aGUgaW5kZXggaW4gb3BlcmFuZDAgdG8gYmUgbW9kaWZpZWQKKyAgICAqLworICAgaXJfdHJpb3BfdmVjdG9yX2luc2VydCwKKworICAgLyoqCisgICAgKiBBIHNlbnRpbmVsIG1hcmtpbmcgdGhlIGxhc3Qgb2YgdGhlIHRlcm5hcnkgb3BlcmF0aW9ucy4KKyAgICAqLworICAgaXJfbGFzdF90cmlvcCA9IGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQsCisKKyAgIGlyX3F1YWRvcF9iaXRmaWVsZF9pbnNlcnQsCisKKyAgIGlyX3F1YWRvcF92ZWN0b3IsCisKKyAgIC8qKgorICAgICogQSBzZW50aW5lbCBtYXJraW5nIHRoZSBsYXN0IG9mIHRoZSB0ZXJuYXJ5IG9wZXJhdGlvbnMuCisgICAgKi8KKyAgIGlyX2xhc3RfcXVhZG9wID0gaXJfcXVhZG9wX3ZlY3RvciwKKworICAgLyoqCisgICAgKiBBIHNlbnRpbmVsIG1hcmtpbmcgdGhlIGxhc3Qgb2YgYWxsIG9wZXJhdGlvbnMuCisgICAgKi8KKyAgIGlyX2xhc3Rfb3Bjb2RlID0gaXJfcXVhZG9wX3ZlY3RvcgorfTsKKworY2xhc3MgaXJfZXhwcmVzc2lvbiA6IHB1YmxpYyBpcl9ydmFsdWUgeworcHVibGljOgorICAgaXJfZXhwcmVzc2lvbihpbnQgb3AsIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUsCisgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqb3AwLCBpcl9ydmFsdWUgKm9wMSA9IE5VTEwsCisgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqb3AyID0gTlVMTCwgaXJfcnZhbHVlICpvcDMgPSBOVUxMKTsKKworICAgLyoqCisgICAgKiBDb25zdHJ1Y3RvciBmb3IgdW5hcnkgb3BlcmF0aW9uIGV4cHJlc3Npb25zCisgICAgKi8KKyAgIGlyX2V4cHJlc3Npb24oaW50IG9wLCBpcl9ydmFsdWUgKik7CisKKyAgIC8qKgorICAgICogQ29uc3RydWN0b3IgZm9yIGJpbmFyeSBvcGVyYXRpb24gZXhwcmVzc2lvbnMKKyAgICAqLworICAgaXJfZXhwcmVzc2lvbihpbnQgb3AsIGlyX3J2YWx1ZSAqb3AwLCBpcl9ydmFsdWUgKm9wMSk7CisKKyAgIC8qKgorICAgICogQ29uc3RydWN0b3IgZm9yIHRlcm5hcnkgb3BlcmF0aW9uIGV4cHJlc3Npb25zCisgICAgKi8KKyAgIGlyX2V4cHJlc3Npb24oaW50IG9wLCBpcl9ydmFsdWUgKm9wMCwgaXJfcnZhbHVlICpvcDEsIGlyX3J2YWx1ZSAqb3AyKTsKKworICAgdmlydHVhbCBpcl9leHByZXNzaW9uICphc19leHByZXNzaW9uKCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGlyX2luc3RydWN0aW9uICppciwgZW51bSBpcl9ub2RlX3R5cGUgaWdub3JlID0gaXJfdHlwZV91bnNldCk7CisKKyAgIHZpcnR1YWwgaXJfZXhwcmVzc2lvbiAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdDsKKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIC8qKgorICAgICogQXR0ZW1wdCB0byBjb25zdGFudC1mb2xkIHRoZSBleHByZXNzaW9uCisgICAgKgorICAgICogVGhlICJ2YXJpYWJsZV9jb250ZXh0IiBoYXNoIHRhYmxlIGxpbmtzIGlyX3ZhcmlhYmxlICogdG8gaXJfY29uc3RhbnQgKgorICAgICogdGhhdCByZXByZXNlbnQgdGhlIHZhcmlhYmxlcycgdmFsdWVzLiAgXGMgTlVMTCByZXByZXNlbnRzIGFuIGVtcHR5CisgICAgKiBjb250ZXh0LgorICAgICoKKyAgICAqIElmIHRoZSBleHByZXNzaW9uIGNhbm5vdCBiZSBjb25zdGFudCBmb2xkZWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuCisgICAgKiBcYyBOVUxMLgorICAgICovCisgICB2aXJ0dWFsIGlyX2NvbnN0YW50ICpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0ID0gTlVMTCk7CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgdXNlZCBieSBhbiBleHByZXNzaW9uCisgICAgKi8KKyAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X251bV9vcGVyYW5kcyhpcl9leHByZXNzaW9uX29wZXJhdGlvbik7CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgdXNlZCBieSBhbiBleHByZXNzaW9uCisgICAgKi8KKyAgIHVuc2lnbmVkIGludCBnZXRfbnVtX29wZXJhbmRzKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiAodGhpcy0+b3BlcmF0aW9uID09IGlyX3F1YWRvcF92ZWN0b3IpCisJID8gdGhpcy0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzIDogZ2V0X251bV9vcGVyYW5kcyhvcGVyYXRpb24pOworICAgfQorCisgICAvKioKKyAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBleHByZXNzaW9uIG9wZXJhdGVzIG9uIHZlY3RvcnMgaG9yaXpvbnRhbGx5LgorICAgICovCisgICBib29sIGlzX2hvcml6b250YWwoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIG9wZXJhdGlvbiA9PSBpcl9iaW5vcF9hbGxfZXF1YWwgfHwKKyAgICAgICAgICAgICBvcGVyYXRpb24gPT0gaXJfYmlub3BfYW55X25lcXVhbCB8fAorICAgICAgICAgICAgIG9wZXJhdGlvbiA9PSBpcl91bm9wX2FueSB8fAorICAgICAgICAgICAgIG9wZXJhdGlvbiA9PSBpcl9iaW5vcF9kb3QgfHwKKyAgICAgICAgICAgICBvcGVyYXRpb24gPT0gaXJfcXVhZG9wX3ZlY3RvcjsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZXhwcmVzc2lvbidzIG9wZXJhdG9yLgorICAgICovCisgICBjb25zdCBjaGFyICpvcGVyYXRvcl9zdHJpbmcoKTsKKworICAgLyoqCisgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZXhwcmVzc2lvbidzIG9wZXJhdG9yLgorICAgICovCisgICBzdGF0aWMgY29uc3QgY2hhciAqb3BlcmF0b3Jfc3RyaW5nKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uKTsKKworCisgICAvKioKKyAgICAqIERvIGEgcmV2ZXJzZS1sb29rdXAgdG8gdHJhbnNsYXRlIHRoZSBnaXZlbiBzdHJpbmcgaW50byBhbiBvcGVyYXRvci4KKyAgICAqLworICAgc3RhdGljIGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIGdldF9vcGVyYXRvcihjb25zdCBjaGFyICopOworCisgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KGlyX3Zpc2l0b3IgKnYpCisgICB7CisgICAgICB2LT52aXNpdCh0aGlzKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyBhY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKik7CisKKyAgIGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wZXJhdGlvbjsKKyAgIGlyX3J2YWx1ZSAqb3BlcmFuZHNbNF07Cit9OworCisKKy8qKgorICogSElSIGluc3RydWN0aW9uIHJlcHJlc2VudGluZyBhIGhpZ2gtbGV2ZWwgZnVuY3Rpb24gY2FsbCwgY29udGFpbmluZyBhIGxpc3QKKyAqIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybmluZyBhIHZhbHVlIGluIHRoZSBzdXBwbGllZCB0ZW1wb3JhcnkuCisgKi8KK2NsYXNzIGlyX2NhbGwgOiBwdWJsaWMgaXJfaW5zdHJ1Y3Rpb24geworcHVibGljOgorICAgaXJfY2FsbChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmNhbGxlZSwKKwkgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqcmV0dXJuX2RlcmVmLAorCSAgIGV4ZWNfbGlzdCAqYWN0dWFsX3BhcmFtZXRlcnMpCisgICAgICA6IHJldHVybl9kZXJlZihyZXR1cm5fZGVyZWYpLCBjYWxsZWUoY2FsbGVlKQorICAgeworICAgICAgaXJfdHlwZSA9IGlyX3R5cGVfY2FsbDsKKyAgICAgIGFzc2VydChjYWxsZWUtPnJldHVybl90eXBlICE9IE5VTEwpOworICAgICAgYWN0dWFsX3BhcmFtZXRlcnMtPm1vdmVfbm9kZXNfdG8oJiB0aGlzLT5hY3R1YWxfcGFyYW1ldGVycyk7CisgICAgICB0aGlzLT51c2VfYnVpbHRpbiA9IGNhbGxlZS0+aXNfYnVpbHRpbigpOworICAgfQorCisgICB2aXJ0dWFsIGlyX2NhbGwgKmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3Q7CisKKyAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pOworCisgICB2aXJ0dWFsIGlyX2NvbnN0YW50ICpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0ID0gTlVMTCk7CisKKyAgIHZpcnR1YWwgaXJfY2FsbCAqYXNfY2FsbCgpCisgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworCisgICAvKioKKyAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLgorICAgICovCisgICBjb25zdCBjaGFyICpjYWxsZWVfbmFtZSgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gY2FsbGVlLT5mdW5jdGlvbl9uYW1lKCk7CisgICB9CisKKyAgIC8qKgorICAgICogR2VuZXJhdGVzIGFuIGlubGluZSB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBiZWZvcmUgQGlyLAorICAgICogc3RvcmluZyB0aGUgcmV0dXJuIHZhbHVlIGluIHJldHVybl9kZXJlZi4KKyAgICAqLworICAgdm9pZCBnZW5lcmF0ZV9pbmxpbmUoaXJfaW5zdHJ1Y3Rpb24gKmlyKTsKKworICAgLyoqCisgICAgKiBTdG9yYWdlIGZvciB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuCisgICAgKiBUaGlzIG11c3QgYmUgTlVMTCBpZiB0aGUgcmV0dXJuIHR5cGUgaXMgdm9pZC4KKyAgICAqLworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnJldHVybl9kZXJlZjsKKworICAgLyoqCisgICAgKiBUaGUgc3BlY2lmaWMgZnVuY3Rpb24gc2lnbmF0dXJlIGJlaW5nIGNhbGxlZC4KKyAgICAqLworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpjYWxsZWU7CisKKyAgIC8qIExpc3Qgb2YgaXJfcnZhbHVlIG9mIHBhcmFtYXRlcnMgcGFzc2VkIGluIHRoaXMgY2FsbC4gKi8KKyAgIGV4ZWNfbGlzdCBhY3R1YWxfcGFyYW1ldGVyczsKKworICAgLyoqIFNob3VsZCB0aGlzIGNhbGwgb25seSBiaW5kIHRvIGEgYnVpbHQtaW4gZnVuY3Rpb24/ICovCisgICBib29sIHVzZV9idWlsdGluOworfTsKKworCisvKioKKyAqIFxuYW1lIEp1bXAtbGlrZSBJUiBpbnN0cnVjdGlvbnMuCisgKgorICogVGhlc2UgaW5jbHVkZSBcYyBicmVhaywgXGMgY29udGludWUsIFxjIHJldHVybiwgYW5kIFxjIGRpc2NhcmQuCisgKi8KKy8qQHsqLworY2xhc3MgaXJfanVtcCA6IHB1YmxpYyBpcl9pbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgICBpcl9qdW1wKCkKKyAgIHsKKyAgICAgIGlyX3R5cGUgPSBpcl90eXBlX3Vuc2V0OworICAgfQorCitwdWJsaWM6CisgICB2aXJ0dWFsIGlyX2p1bXAgKmFzX2p1bXAoKQorICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICB9Cit9OworCitjbGFzcyBpcl9yZXR1cm4gOiBwdWJsaWMgaXJfanVtcCB7CitwdWJsaWM6CisgICBpcl9yZXR1cm4oKQorICAgICAgOiB2YWx1ZShOVUxMKQorICAgeworICAgICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfcmV0dXJuOworICAgfQorCisgICBpcl9yZXR1cm4oaXJfcnZhbHVlICp2YWx1ZSkKKyAgICAgIDogdmFsdWUodmFsdWUpCisgICB7CisgICAgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9yZXR1cm47CisgICB9CisKKyAgIHZpcnR1YWwgaXJfcmV0dXJuICpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqKSBjb25zdDsKKworICAgdmlydHVhbCBpcl9yZXR1cm4gKmFzX3JldHVybigpCisgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgIH0KKworICAgaXJfcnZhbHVlICpnZXRfdmFsdWUoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KGlyX3Zpc2l0b3IgKnYpCisgICB7CisgICAgICB2LT52aXNpdCh0aGlzKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyBhY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKik7CisKKyAgIGlyX3J2YWx1ZSAqdmFsdWU7CisgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKTsKKworfTsKKworCisvKioKKyAqIEp1bXAgaW5zdHJ1Y3Rpb25zIHVzZWQgaW5zaWRlIGxvb3BzCisgKgorICogVGhlc2UgaW5jbHVkZSBcYyBicmVhayBhbmQgXGMgY29udGludWUuICBUaGUgXGMgYnJlYWsgd2l0aGluIGEgbG9vcCBpcworICogZGlmZmVyZW50IGZyb20gdGhlIFxjIGJyZWFrIHdpdGhpbiBhIHN3aXRjaC1zdGF0ZW1lbnQuCisgKgorICogXHNhIGlyX3N3aXRjaF9qdW1wCisgKi8KK2NsYXNzIGlyX2xvb3BfanVtcCA6IHB1YmxpYyBpcl9qdW1wIHsKK3B1YmxpYzoKKyAgIGVudW0ganVtcF9tb2RlIHsKKyAgICAgIGp1bXBfYnJlYWssCisgICAgICBqdW1wX2NvbnRpbnVlCisgICB9OworCisgICBpcl9sb29wX2p1bXAoanVtcF9tb2RlIG1vZGUpCisgICB7CisgICAgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9sb29wX2p1bXA7CisgICAgICB0aGlzLT5tb2RlID0gbW9kZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl9sb29wX2p1bXAgKmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICopIGNvbnN0OworCisgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKTsKKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworCisgICBib29sIGlzX2JyZWFrKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBtb2RlID09IGp1bXBfYnJlYWs7CisgICB9CisKKyAgIGJvb2wgaXNfY29udGludWUoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIG1vZGUgPT0ganVtcF9jb250aW51ZTsKKyAgIH0KKworICAgLyoqIE1vZGUgc2VsZWN0b3IgZm9yIHRoZSBqdW1wIGluc3RydWN0aW9uLiAqLworICAgZW51bSBqdW1wX21vZGUgbW9kZTsKK307CisKKy8qKgorICogSVIgaW5zdHJ1Y3Rpb24gcmVwcmVzZW50aW5nIGRpc2NhcmQgc3RhdGVtZW50cy4KKyAqLworY2xhc3MgaXJfZGlzY2FyZCA6IHB1YmxpYyBpcl9qdW1wIHsKK3B1YmxpYzoKKyAgIGlyX2Rpc2NhcmQoKQorICAgeworICAgICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfZGlzY2FyZDsKKyAgICAgIHRoaXMtPmNvbmRpdGlvbiA9IE5VTEw7CisgICB9CisKKyAgIGlyX2Rpc2NhcmQoaXJfcnZhbHVlICpjb25kKQorICAgeworICAgICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfZGlzY2FyZDsKKyAgICAgIHRoaXMtPmNvbmRpdGlvbiA9IGNvbmQ7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfZGlzY2FyZCAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdDsKKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIHZpcnR1YWwgdm9pZCBhY2NlcHQoaXJfdmlzaXRvciAqdikKKyAgIHsKKyAgICAgIHYtPnZpc2l0KHRoaXMpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIGFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqKTsKKworICAgdmlydHVhbCBpcl9kaXNjYXJkICphc19kaXNjYXJkKCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICBpcl9ydmFsdWUgKmNvbmRpdGlvbjsKK307CisvKkB9Ki8KKworCisvKioKKyAqIFRleHR1cmUgc2FtcGxpbmcgb3Bjb2RlcyB1c2VkIGluIGlyX3RleHR1cmUKKyAqLworZW51bSBpcl90ZXh0dXJlX29wY29kZSB7CisgICBpcl90ZXgsCQkvKio8IFJlZ3VsYXIgdGV4dHVyZSBsb29rLXVwICovCisgICBpcl90eGIsCQkvKio8IFRleHR1cmUgbG9vay11cCB3aXRoIExPRCBiaWFzICovCisgICBpcl90eGwsCQkvKio8IFRleHR1cmUgbG9vay11cCB3aXRoIGV4cGxpY2l0IExPRCAqLworICAgaXJfdHhkLAkJLyoqPCBUZXh0dXJlIGxvb2stdXAgd2l0aCBwYXJ0aWFsIGRlcml2YXR2aWVzICovCisgICBpcl90eGYsCQkvKio8IFRleGVsIGZldGNoIHdpdGggZXhwbGljaXQgTE9EICovCisgICBpcl90eGZfbXMsICAgICAgICAgICAvKio8IE11bHRpc2FtcGxlIHRleHR1cmUgZmV0Y2ggKi8KKyAgIGlyX3R4cywJCS8qKjwgVGV4dHVyZSBzaXplICovCisgICBpcl9sb2QsCQkvKio8IFRleHR1cmUgbG9kIHF1ZXJ5ICovCisgICBpcl90ZzQsCQkvKio8IFRleHR1cmUgZ2F0aGVyICovCisgICBpcl9xdWVyeV9sZXZlbHMgICAgICAvKio8IFRleHR1cmUgbGV2ZWxzIHF1ZXJ5ICovCit9OworCisKKy8qKgorICogSVIgaW5zdHJ1Y3Rpb24gdG8gc2FtcGxlIGEgdGV4dHVyZQorICoKKyAqIFRoZSBzcGVjaWZpYyBmb3JtIG9mIHRoZSBJUiBpbnN0cnVjdGlvbiBkZXBlbmRzIG9uIHRoZSBcYyBtb2RlIHZhbHVlCisgKiBzZWxlY3RlZCBmcm9tIFxjIGlyX3RleHR1cmVfb3Bjb2Rlcy4gIEluIHRoZSBwcmludGVkIElSLCB0aGVzZSB3aWxsCisgKiBhcHBlYXIgYXM6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXhlbCBvZmZzZXQgKDAgb3IgYW4gZXhwcmVzc2lvbikKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQcm9qZWN0aW9uIGRpdmlzb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICBTaGFkb3cgY29tcGFyaXRvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiB2ICB2CisgKiAodGV4IDx0eXBlPiA8c2FtcGxlcj4gPGNvb3JkaW5hdGU+IDAgMSAoICkpCisgKiAodHhiIDx0eXBlPiA8c2FtcGxlcj4gPGNvb3JkaW5hdGU+IDAgMSAoICkgPGJpYXM+KQorICogKHR4bCA8dHlwZT4gPHNhbXBsZXI+IDxjb29yZGluYXRlPiAwIDEgKCApIDxsb2Q+KQorICogKHR4ZCA8dHlwZT4gPHNhbXBsZXI+IDxjb29yZGluYXRlPiAwIDEgKCApIChkUGR4IGRQZHkpKQorICogKHR4ZiA8dHlwZT4gPHNhbXBsZXI+IDxjb29yZGluYXRlPiAwICAgICAgIDxsb2Q+KQorICogKHR4Zl9tcworICogICAgICA8dHlwZT4gPHNhbXBsZXI+IDxjb29yZGluYXRlPiAgICAgICAgIDxzYW1wbGVfaW5kZXg+KQorICogKHR4cyA8dHlwZT4gPHNhbXBsZXI+IDxsb2Q+KQorICogKGxvZCA8dHlwZT4gPHNhbXBsZXI+IDxjb29yZGluYXRlPikKKyAqICh0ZzQgPHR5cGU+IDxzYW1wbGVyPiA8Y29vcmRpbmF0ZT4gPG9mZnNldD4gPGNvbXBvbmVudD4pCisgKiAocXVlcnlfbGV2ZWxzIDx0eXBlPiA8c2FtcGxlcj4pCisgKi8KK2NsYXNzIGlyX3RleHR1cmUgOiBwdWJsaWMgaXJfcnZhbHVlIHsKK3B1YmxpYzoKKyAgIGlyX3RleHR1cmUoZW51bSBpcl90ZXh0dXJlX29wY29kZSBvcCkKKyAgICAgIDogb3Aob3ApLCBzYW1wbGVyKE5VTEwpLCBjb29yZGluYXRlKE5VTEwpLCBwcm9qZWN0b3IoTlVMTCksCisgICAgICAgIHNoYWRvd19jb21wYXJpdG9yKE5VTEwpLCBvZmZzZXQoTlVMTCkKKyAgIHsKKyAgICAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX3RleHR1cmU7CisgICAgICBtZW1zZXQoJmxvZF9pbmZvLCAwLCBzaXplb2YobG9kX2luZm8pKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl90ZXh0dXJlICpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqKSBjb25zdDsKKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIHZpcnR1YWwgaXJfY29uc3RhbnQgKmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoc3RydWN0IGhhc2hfdGFibGUgKnZhcmlhYmxlX2NvbnRleHQgPSBOVUxMKTsKKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdGV4dHVyZSAqYXNfdGV4dHVyZSgpCisgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyBhY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKik7CisKKyAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBlbnVtIGlyX25vZGVfdHlwZSBpZ25vcmUgPSBpcl90eXBlX3Vuc2V0KTsKKworICAgLyoqCisgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBpcl90ZXh0dXJlX29wY29kZS4KKyAgICAqLworICAgY29uc3QgY2hhciAqb3Bjb2RlX3N0cmluZygpOworCisgICAvKiogU2V0IHRoZSBzYW1wbGVyIGFuZCB0eXBlLiAqLworICAgdm9pZCBzZXRfc2FtcGxlcihpcl9kZXJlZmVyZW5jZSAqc2FtcGxlciwgY29uc3QgZ2xzbF90eXBlICp0eXBlKTsKKworICAgLyoqCisgICAgKiBEbyBhIHJldmVyc2UtbG9va3VwIHRvIHRyYW5zbGF0ZSBhIHN0cmluZyBpbnRvIGFuIGlyX3RleHR1cmVfb3Bjb2RlLgorICAgICovCisgICBzdGF0aWMgaXJfdGV4dHVyZV9vcGNvZGUgZ2V0X29wY29kZShjb25zdCBjaGFyICopOworCisgICBlbnVtIGlyX3RleHR1cmVfb3Bjb2RlIG9wOworCisgICAvKiogU2FtcGxlciB0byB1c2UgZm9yIHRoZSB0ZXh0dXJlIGFjY2Vzcy4gKi8KKyAgIGlyX2RlcmVmZXJlbmNlICpzYW1wbGVyOworCisgICAvKiogVGV4dHVyZSBjb29yZGluYXRlIHRvIHNhbXBsZSAqLworICAgaXJfcnZhbHVlICpjb29yZGluYXRlOworCisgICAvKioKKyAgICAqIFZhbHVlIHVzZWQgZm9yIHByb2plY3RpdmUgZGl2aWRlLgorICAgICoKKyAgICAqIElmIHRoZXJlIGlzIG5vIHByb2plY3RpdmUgZGl2aWRlICh0aGUgY29tbW9uIGNhc2UpLCB0aGlzIHdpbGwgYmUKKyAgICAqIFxjIE5VTEwuICBPcHRpbWl6YXRpb24gcGFzc2VzIHNob3VsZCBjaGVjayBmb3IgdGhpcyB0byBwb2ludCB0byBhIGNvbnN0YW50CisgICAgKiBvZiAxLjAgYW5kIHJlcGxhY2UgdGhhdCB3aXRoIFxjIE5VTEwuCisgICAgKi8KKyAgIGlyX3J2YWx1ZSAqcHJvamVjdG9yOworCisgICAvKioKKyAgICAqIENvb3JkaW5hdGUgdXNlZCBmb3IgY29tcGFyaXNvbiBvbiBzaGFkb3cgbG9vay11cHMuCisgICAgKgorICAgICogSWYgdGhlcmUgaXMgbm8gc2hhZG93IGNvbXBhcmlzb24sIHRoaXMgd2lsbCBiZSBcYyBOVUxMLiAgRm9yIHRoZQorICAgICogXGMgaXJfdHhmIG9wY29kZSwgdGhpcyAqbXVzdCogYmUgXGMgTlVMTC4KKyAgICAqLworICAgaXJfcnZhbHVlICpzaGFkb3dfY29tcGFyaXRvcjsKKworICAgLyoqIFRleGVsIG9mZnNldC4gKi8KKyAgIGlyX3J2YWx1ZSAqb2Zmc2V0OworCisgICB1bmlvbiB7CisgICAgICBpcl9ydmFsdWUgKmxvZDsJCS8qKjwgRmxvYXRpbmcgcG9pbnQgTE9EICovCisgICAgICBpcl9ydmFsdWUgKmJpYXM7CQkvKio8IEZsb2F0aW5nIHBvaW50IExPRCBiaWFzICovCisgICAgICBpcl9ydmFsdWUgKnNhbXBsZV9pbmRleDsgIC8qKjwgTVNBQSBzYW1wbGUgaW5kZXggKi8KKyAgICAgIGlyX3J2YWx1ZSAqY29tcG9uZW50OyAgICAgLyoqPCBHYXRoZXIgY29tcG9uZW50IHNlbGVjdG9yICovCisgICAgICBzdHJ1Y3QgeworCSBpcl9ydmFsdWUgKmRQZHg7CS8qKjwgUGFydGlhbCBkZXJpdmF0aXZlIG9mIGNvb3JkaW5hdGUgd3J0IFggKi8KKwkgaXJfcnZhbHVlICpkUGR5OwkvKio8IFBhcnRpYWwgZGVyaXZhdGl2ZSBvZiBjb29yZGluYXRlIHdydCBZICovCisgICAgICB9IGdyYWQ7CisgICB9IGxvZF9pbmZvOworfTsKKworCitzdHJ1Y3QgaXJfc3dpenpsZV9tYXNrIHsKKyAgIHVuc2lnbmVkIHg6MjsKKyAgIHVuc2lnbmVkIHk6MjsKKyAgIHVuc2lnbmVkIHo6MjsKKyAgIHVuc2lnbmVkIHc6MjsKKworICAgLyoqCisgICAgKiBOdW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgc3dpenpsZS4KKyAgICAqLworICAgdW5zaWduZWQgbnVtX2NvbXBvbmVudHM6MzsKKworICAgLyoqCisgICAgKiBEb2VzIHRoZSBzd2l6emxlIGNvbnRhaW4gZHVwbGljYXRlIGNvbXBvbmVudHM/CisgICAgKgorICAgICogTC12YWx1ZSBzd2l6emxlcyBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgY29tcG9uZW50cy4KKyAgICAqLworICAgdW5zaWduZWQgaGFzX2R1cGxpY2F0ZXM6MTsKK307CisKKworY2xhc3MgaXJfc3dpenpsZSA6IHB1YmxpYyBpcl9ydmFsdWUgeworcHVibGljOgorICAgaXJfc3dpenpsZShpcl9ydmFsdWUgKiwgdW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgeiwgdW5zaWduZWQgdywKKyAgICAgICAgICAgICAgdW5zaWduZWQgY291bnQpOworCisgICBpcl9zd2l6emxlKGlyX3J2YWx1ZSAqdmFsLCBjb25zdCB1bnNpZ25lZCAqY29tcG9uZW50cywgdW5zaWduZWQgY291bnQpOworCisgICBpcl9zd2l6emxlKGlyX3J2YWx1ZSAqdmFsLCBpcl9zd2l6emxlX21hc2sgbWFzayk7CisKKyAgIHZpcnR1YWwgaXJfc3dpenpsZSAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKikgY29uc3Q7CisKKyAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pOworCisgICB2aXJ0dWFsIGlyX2NvbnN0YW50ICpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0ID0gTlVMTCk7CisKKyAgIHZpcnR1YWwgaXJfc3dpenpsZSAqYXNfc3dpenpsZSgpCisgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgIH0KKworICAgLyoqCisgICAgKiBDb25zdHJ1Y3QgYW4gaXJfc3dpenpsZSBmcm9tIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLiAgQ2FuIGZhaWwuCisgICAgKi8KKyAgIHN0YXRpYyBpcl9zd2l6emxlICpjcmVhdGUoaXJfcnZhbHVlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgdmVjdG9yX2xlbmd0aCk7CisKKyAgIHZpcnR1YWwgdm9pZCBhY2NlcHQoaXJfdmlzaXRvciAqdikKKyAgIHsKKyAgICAgIHYtPnZpc2l0KHRoaXMpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIGFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqKTsKKworICAgdmlydHVhbCBib29sIGVxdWFscyhpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gaXJfbm9kZV90eXBlIGlnbm9yZSA9IGlyX3R5cGVfdW5zZXQpOworCisgICBib29sIGlzX2x2YWx1ZSgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gdmFsLT5pc19sdmFsdWUoKSAmJiAhbWFzay5oYXNfZHVwbGljYXRlczsKKyAgIH0KKworICAgLyoqCisgICAgKiBHZXQgdGhlIHZhcmlhYmxlIHRoYXQgaXMgdWx0aW1hdGVseSByZWZlcmVuY2VkIGJ5IGFuIHItdmFsdWUKKyAgICAqLworICAgdmlydHVhbCBpcl92YXJpYWJsZSAqdmFyaWFibGVfcmVmZXJlbmNlZCgpIGNvbnN0OworCisgICBpcl9ydmFsdWUgKnZhbDsKKyAgIGlyX3N3aXp6bGVfbWFzayBtYXNrOworCitwcml2YXRlOgorICAgLyoqCisgICAgKiBJbml0aWFsaXplIHRoZSBtYXNrIGNvbXBvbmVudCBvZiBhIHN3aXp6bGUKKyAgICAqCisgICAgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIFxjIGlyX3N3aXp6bGUgY29uc3RydWN0b3JzLgorICAgICovCisgICB2b2lkIGluaXRfbWFzayhjb25zdCB1bnNpZ25lZCAqY29tcG9uZW50cywgdW5zaWduZWQgY291bnQpOworfTsKKworCitjbGFzcyBpcl9kZXJlZmVyZW5jZSA6IHB1YmxpYyBpcl9ydmFsdWUgeworcHVibGljOgorICAgdmlydHVhbCBpcl9kZXJlZmVyZW5jZSAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKikgY29uc3QgPSAwOworCisgICB2aXJ0dWFsIGlyX2RlcmVmZXJlbmNlICphc19kZXJlZmVyZW5jZSgpCisgICB7CisgICAgICByZXR1cm4gdGhpczsKKyAgIH0KKworICAgYm9vbCBpc19sdmFsdWUoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBHZXQgdGhlIHZhcmlhYmxlIHRoYXQgaXMgdWx0aW1hdGVseSByZWZlcmVuY2VkIGJ5IGFuIHItdmFsdWUKKyAgICAqLworICAgdmlydHVhbCBpcl92YXJpYWJsZSAqdmFyaWFibGVfcmVmZXJlbmNlZCgpIGNvbnN0ID0gMDsKK307CisKKworY2xhc3MgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgOiBwdWJsaWMgaXJfZGVyZWZlcmVuY2UgeworcHVibGljOgorICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoaXJfdmFyaWFibGUgKnZhcik7CisKKyAgIHZpcnR1YWwgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmNsb25lKHZvaWQgKm1lbV9jdHgsCisJCQkJCSAgc3RydWN0IGhhc2hfdGFibGUgKikgY29uc3Q7CisKKyAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pOworCisgICB2aXJ0dWFsIGlyX2NvbnN0YW50ICpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0ID0gTlVMTCk7CisKKyAgIHZpcnR1YWwgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGlyX2luc3RydWN0aW9uICppciwgZW51bSBpcl9ub2RlX3R5cGUgaWdub3JlID0gaXJfdHlwZV91bnNldCk7CisKKyAgIC8qKgorICAgICogR2V0IHRoZSB2YXJpYWJsZSB0aGF0IGlzIHVsdGltYXRlbHkgcmVmZXJlbmNlZCBieSBhbiByLXZhbHVlCisgICAgKi8KKyAgIHZpcnR1YWwgaXJfdmFyaWFibGUgKnZhcmlhYmxlX3JlZmVyZW5jZWQoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIHRoaXMtPnZhcjsKKyAgIH0KKworICAgdmlydHVhbCBpcl92YXJpYWJsZSAqd2hvbGVfdmFyaWFibGVfcmVmZXJlbmNlZCgpCisgICB7CisgICAgICAvKiBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSBvYmplY3RzIGFsd2F5cyBkZXJlZmVyZW5jZSB0aGUgZW50aXJlCisgICAgICAgKiB2YXJpYWJsZS4gIEhvd2V2ZXIsIGlmIHRoaXMgZGVyZWZlcmVuY2UgaXMgZGVyZWZlcmVuY2VkIGJ5IGFueXRoaW5nCisgICAgICAgKiBlbHNlLCB0aGUgY29tcGxldGUgZGVmZXJlZmVybmNlIGNoYWluIGlzIG5vdCBhIHdob2xlLXZhcmlhYmxlCisgICAgICAgKiBkZXJlZmVyZW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgdG9wIG1vc3QKKyAgICAgICAqIGlyX3J2YWx1ZSBpbiBhIGRlcmVmZXJlbmNlIGNoYWluLgorICAgICAgICovCisgICAgICByZXR1cm4gdGhpcy0+dmFyOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KGlyX3Zpc2l0b3IgKnYpCisgICB7CisgICAgICB2LT52aXNpdCh0aGlzKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyBhY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKik7CisKKyAgIC8qKgorICAgICogT2JqZWN0IGJlaW5nIGRlcmVmZXJlbmNlZC4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKnZhcjsKK307CisKKworY2xhc3MgaXJfZGVyZWZlcmVuY2VfYXJyYXkgOiBwdWJsaWMgaXJfZGVyZWZlcmVuY2UgeworcHVibGljOgorICAgaXJfZGVyZWZlcmVuY2VfYXJyYXkoaXJfcnZhbHVlICp2YWx1ZSwgaXJfcnZhbHVlICphcnJheV9pbmRleCk7CisKKyAgIGlyX2RlcmVmZXJlbmNlX2FycmF5KGlyX3ZhcmlhYmxlICp2YXIsIGlyX3J2YWx1ZSAqYXJyYXlfaW5kZXgpOworCisgICB2aXJ0dWFsIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpjbG9uZSh2b2lkICptZW1fY3R4LAorCQkJCSAgICAgICBzdHJ1Y3QgaGFzaF90YWJsZSAqKSBjb25zdDsKKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIHZpcnR1YWwgaXJfY29uc3RhbnQgKmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoc3RydWN0IGhhc2hfdGFibGUgKnZhcmlhYmxlX2NvbnRleHQgPSBOVUxMKTsKKworICAgdmlydHVhbCBpcl9kZXJlZmVyZW5jZV9hcnJheSAqYXNfZGVyZWZlcmVuY2VfYXJyYXkoKQorICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICB9CisKKyAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBlbnVtIGlyX25vZGVfdHlwZSBpZ25vcmUgPSBpcl90eXBlX3Vuc2V0KTsKKworICAgLyoqCisgICAgKiBHZXQgdGhlIHZhcmlhYmxlIHRoYXQgaXMgdWx0aW1hdGVseSByZWZlcmVuY2VkIGJ5IGFuIHItdmFsdWUKKyAgICAqLworICAgdmlydHVhbCBpcl92YXJpYWJsZSAqdmFyaWFibGVfcmVmZXJlbmNlZCgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gdGhpcy0+YXJyYXktPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworCisgICBpcl9ydmFsdWUgKmFycmF5OworICAgaXJfcnZhbHVlICphcnJheV9pbmRleDsKKworcHJpdmF0ZToKKyAgIHZvaWQgc2V0X2FycmF5KGlyX3J2YWx1ZSAqdmFsdWUpOworfTsKKworCitjbGFzcyBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgOiBwdWJsaWMgaXJfZGVyZWZlcmVuY2UgeworcHVibGljOgorICAgaXJfZGVyZWZlcmVuY2VfcmVjb3JkKGlyX3J2YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKmZpZWxkKTsKKworICAgaXJfZGVyZWZlcmVuY2VfcmVjb3JkKGlyX3ZhcmlhYmxlICp2YXIsIGNvbnN0IGNoYXIgKmZpZWxkKTsKKworICAgdmlydHVhbCBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmNsb25lKHZvaWQgKm1lbV9jdHgsCisJCQkJCXN0cnVjdCBoYXNoX3RhYmxlICopIGNvbnN0OworCisgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKTsKKworICAgdmlydHVhbCBpcl9jb25zdGFudCAqY29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZShzdHJ1Y3QgaGFzaF90YWJsZSAqdmFyaWFibGVfY29udGV4dCA9IE5VTEwpOworCisgICB2aXJ0dWFsIGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqYXNfZGVyZWZlcmVuY2VfcmVjb3JkKCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICAvKioKKyAgICAqIEdldCB0aGUgdmFyaWFibGUgdGhhdCBpcyB1bHRpbWF0ZWx5IHJlZmVyZW5jZWQgYnkgYW4gci12YWx1ZQorICAgICovCisgICB2aXJ0dWFsIGlyX3ZhcmlhYmxlICp2YXJpYWJsZV9yZWZlcmVuY2VkKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzLT5yZWNvcmQtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIGFjY2VwdChpcl92aXNpdG9yICp2KQorICAgeworICAgICAgdi0+dmlzaXQodGhpcyk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworCisgICBpcl9ydmFsdWUgKnJlY29yZDsKKyAgIGNvbnN0IGNoYXIgKmZpZWxkOworfTsKKworCisvKioKKyAqIERhdGEgc3RvcmVkIGluIGFuIGlyX2NvbnN0YW50CisgKi8KK3VuaW9uIGlyX2NvbnN0YW50X2RhdGEgeworICAgICAgdW5zaWduZWQgdVsxNl07CisgICAgICBpbnQgaVsxNl07CisgICAgICBmbG9hdCBmWzE2XTsKKyAgICAgIGJvb2wgYlsxNl07Cit9OworCisKK2NsYXNzIGlyX2NvbnN0YW50IDogcHVibGljIGlyX3J2YWx1ZSB7CitwdWJsaWM6CisgICBpcl9jb25zdGFudChjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBpcl9jb25zdGFudF9kYXRhICpkYXRhKTsKKyAgIGlyX2NvbnN0YW50KGJvb2wgYiwgdW5zaWduZWQgdmVjdG9yX2VsZW1lbnRzPTEpOworICAgaXJfY29uc3RhbnQodW5zaWduZWQgaW50IHUsIHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50cz0xKTsKKyAgIGlyX2NvbnN0YW50KGludCBpLCB1bnNpZ25lZCB2ZWN0b3JfZWxlbWVudHM9MSk7CisgICBpcl9jb25zdGFudChmbG9hdCBmLCB1bnNpZ25lZCB2ZWN0b3JfZWxlbWVudHM9MSk7CisKKyAgIC8qKgorICAgICogQ29uc3RydWN0IGFuIGlyX2NvbnN0YW50IGZyb20gYSBsaXN0IG9mIGlyX2NvbnN0YW50IHZhbHVlcworICAgICovCisgICBpcl9jb25zdGFudChjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlLCBleGVjX2xpc3QgKnZhbHVlcyk7CisKKyAgIC8qKgorICAgICogQ29uc3RydWN0IGFuIGlyX2NvbnN0YW50IGZyb20gYSBzY2FsYXIgY29tcG9uZW50IG9mIGFub3RoZXIgaXJfY29uc3RhbnQKKyAgICAqCisgICAgKiBUaGUgbmV3IFxjIGlyX2NvbnN0YW50IGluaGVyaXRzIHRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQgZnJvbSB0aGUKKyAgICAqIHNvdXJjZSBjb25zdGFudC4KKyAgICAqCisgICAgKiBcbm90ZQorICAgICogSW4gdGhlIGNhc2Ugb2YgYSBtYXRyaXggY29uc3RhbnQsIHRoZSBuZXcgY29uc3RhbnQgaXMgYSBzY2FsYXIsIFxiIG5vdAorICAgICogYSB2ZWN0b3IuCisgICAgKi8KKyAgIGlyX2NvbnN0YW50KGNvbnN0IGlyX2NvbnN0YW50ICpjLCB1bnNpZ25lZCBpKTsKKworICAgLyoqCisgICAgKiBSZXR1cm4gYSBuZXcgaXJfY29uc3RhbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGNvbnRhaW5pbmcgYWxsIHplcm9zLgorICAgICovCisgICBzdGF0aWMgaXJfY29uc3RhbnQgKnplcm8odm9pZCAqbWVtX2N0eCwgY29uc3QgZ2xzbF90eXBlICp0eXBlKTsKKworICAgdmlydHVhbCBpcl9jb25zdGFudCAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKikgY29uc3Q7CisKKyAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pOworCisgICB2aXJ0dWFsIGlyX2NvbnN0YW50ICpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0ID0gTlVMTCk7CisKKyAgIHZpcnR1YWwgaXJfY29uc3RhbnQgKmFzX2NvbnN0YW50KCkKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KGlyX3Zpc2l0b3IgKnYpCisgICB7CisgICAgICB2LT52aXNpdCh0aGlzKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyBhY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKik7CisKKyAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBlbnVtIGlyX25vZGVfdHlwZSBpZ25vcmUgPSBpcl90eXBlX3Vuc2V0KTsKKworICAgLyoqCisgICAgKiBHZXQgYSBwYXJ0aWN1bGFyIGNvbXBvbmVudCBvZiBhIGNvbnN0YW50IGFzIGEgc3BlY2lmaWMgdHlwZQorICAgICoKKyAgICAqIFRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gZ2V0IGEgdmFsdWUgZnJvbSBhbiBpbnRlZ2VyIGNvbnN0YW50CisgICAgKiBhcyBhIGZsb2F0IG9yIGJvb2wuICBUaGlzIGFwcGVhcnMgZnJlcXVlbnRseSB3aGVuIGNvbnN0cnVjdG9ycyBhcmUKKyAgICAqIGNhbGxlZCB3aXRoIGFsbCBjb25zdGFudCBwYXJhbWV0ZXJzLgorICAgICovCisgICAvKkB7Ki8KKyAgIGJvb2wgZ2V0X2Jvb2xfY29tcG9uZW50KHVuc2lnbmVkIGkpIGNvbnN0OworICAgZmxvYXQgZ2V0X2Zsb2F0X2NvbXBvbmVudCh1bnNpZ25lZCBpKSBjb25zdDsKKyAgIGludCBnZXRfaW50X2NvbXBvbmVudCh1bnNpZ25lZCBpKSBjb25zdDsKKyAgIHVuc2lnbmVkIGdldF91aW50X2NvbXBvbmVudCh1bnNpZ25lZCBpKSBjb25zdDsKKyAgIC8qQH0qLworCisgICBpcl9jb25zdGFudCAqZ2V0X2FycmF5X2VsZW1lbnQodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgIGlyX2NvbnN0YW50ICpnZXRfcmVjb3JkX2ZpZWxkKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAvKioKKyAgICAqIENvcHkgdGhlIHZhbHVlcyBvbiBhbm90aGVyIGNvbnN0YW50IGF0IGEgZ2l2ZW4gb2Zmc2V0LgorICAgICoKKyAgICAqIFRoZSBvZmZzZXQgaXMgaWdub3JlZCBmb3IgYXJyYXkgb3Igc3RydWN0IGNvcGllcywgaXQncyBvbmx5IGZvcgorICAgICogc2NhbGFycyBvciB2ZWN0b3JzIGludG8gdmVjdG9ycyBvciBtYXRyaWNlcy4KKyAgICAqCisgICAgKiBXaXRoIGlkZW50aWNhbCB0eXBlcyBvbiBib3RoIHNpZGVzIGFuZCB6ZXJvIG9mZnNldCBpdCdzIGNsb25lKCkKKyAgICAqIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgb2JqZWN0LgorICAgICovCisKKyAgIHZvaWQgY29weV9vZmZzZXQoaXJfY29uc3RhbnQgKnNyYywgaW50IG9mZnNldCk7CisKKyAgIC8qKgorICAgICogQ29weSB0aGUgdmFsdWVzIG9uIGFub3RoZXIgY29uc3RhbnQgYXQgYSBnaXZlbiBvZmZzZXQgYW5kCisgICAgKiBmb2xsb3dpbmcgYW4gYXNzaWduLWxpa2UgbWFzay4KKyAgICAqCisgICAgKiBUaGUgbWFzayBpcyBpZ25vcmVkIGZvciBzY2FsYXJzLgorICAgICoKKyAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgaGFuZGxlcyB3aGF0IGFzc2lnbiBjYW4gaGFuZGxlLAorICAgICogaS5lLiBhdCBtb3N0IGEgdmVjdG9yIGFzIHNvdXJjZSBhbmQgYSBjb2x1bW4gb2YgYSBtYXRyaXggYXMKKyAgICAqIGRlc3RpbmF0aW9uLgorICAgICovCisKKyAgIHZvaWQgY29weV9tYXNrZWRfb2Zmc2V0KGlyX2NvbnN0YW50ICpzcmMsIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtYXNrKTsKKworICAgLyoqCisgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNvbnN0YW50IGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyBhbm90aGVyIGNvbnN0YW50CisgICAgKgorICAgICogXHNhIGlyX2NvbnN0YW50Ojppc196ZXJvLCBpcl9jb25zdGFudDo6aXNfb25lLAorICAgICogaXJfY29uc3RhbnQ6OmlzX25lZ2F0aXZlX29uZSwgaXJfY29uc3RhbnQ6OmlzX2Jhc2lzCisgICAgKi8KKyAgIGJvb2wgaGFzX3ZhbHVlKGNvbnN0IGlyX2NvbnN0YW50ICopIGNvbnN0OworCisgICAvKioKKyAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgaXJfY29uc3RhbnQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgKgorICAgICogRm9yIHZlY3RvcnMsIHRoaXMgY2hlY2tzIHRoYXQgZWFjaCBjb21wb25lbnQgaXMgdGhlIGdpdmVuIHZhbHVlLgorICAgICovCisgICB2aXJ0dWFsIGJvb2wgaXNfdmFsdWUoZmxvYXQgZiwgaW50IGkpIGNvbnN0OworICAgdmlydHVhbCBib29sIGlzX3plcm8oKSBjb25zdDsKKyAgIHZpcnR1YWwgYm9vbCBpc19vbmUoKSBjb25zdDsKKyAgIHZpcnR1YWwgYm9vbCBpc19uZWdhdGl2ZV9vbmUoKSBjb25zdDsKKyAgIHZpcnR1YWwgYm9vbCBpc19iYXNpcygpIGNvbnN0OworCisgICAvKioKKyAgICAqIFJldHVybiB0cnVlIGZvciBjb25zdGFudHMgdGhhdCBjb3VsZCBiZSBzdG9yZWQgYXMgMTYtYml0IHVuc2lnbmVkIHZhbHVlcy4KKyAgICAqCisgICAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiB0cnVlIGV2ZW4gZm9yIHNpZ25lZCBpbnRlZ2VyIGlyX2NvbnN0YW50cywgYXMKKyAgICAqIGxvbmcgYXMgdGhlIHZhbHVlIGlzIG5vbi1uZWdhdGl2ZSBhbmQgZml0cyBpbiAxNi1iaXRzLgorICAgICovCisgICB2aXJ0dWFsIGJvb2wgaXNfdWludDE2X2NvbnN0YW50KCkgY29uc3Q7CisKKyAgIC8qKgorICAgICogVmFsdWUgb2YgdGhlIGNvbnN0YW50LgorICAgICoKKyAgICAqIFRoZSBmaWVsZCB1c2VkIHRvIGJhY2sgdGhlIHZhbHVlcyBzdXBwbGllZCBieSB0aGUgY29uc3RhbnQgaXMgZGV0ZXJtaW5lZAorICAgICogYnkgdGhlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBcYyBpcl9pbnN0cnVjdGlvbi4gIENvbnN0YW50cyBtYXkgYmUKKyAgICAqIHNjYWxhcnMsIHZlY3RvcnMsIG9yIG1hdHJpY2VzLgorICAgICovCisgICB1bmlvbiBpcl9jb25zdGFudF9kYXRhIHZhbHVlOworCisgICAvKiBBcnJheSBlbGVtZW50cyAqLworICAgaXJfY29uc3RhbnQgKiphcnJheV9lbGVtZW50czsKKworICAgLyogU3RydWN0dXJlIGZpZWxkcyAqLworICAgZXhlY19saXN0IGNvbXBvbmVudHM7CisKK3ByaXZhdGU6CisgICAvKioKKyAgICAqIFBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3Igb25seSB1c2VkIGJ5IHRoZSBjbG9uZSBtZXRob2QKKyAgICAqLworICAgaXJfY29uc3RhbnQodm9pZCk7Cit9OworCisvKioKKyAqIElSIGluc3RydWN0aW9uIHRvIGVtaXQgYSB2ZXJ0ZXggaW4gYSBnZW9tZXRyeSBzaGFkZXIuCisgKi8KK2NsYXNzIGlyX2VtaXRfdmVydGV4IDogcHVibGljIGlyX2luc3RydWN0aW9uIHsKK3B1YmxpYzoKKyAgIGlyX2VtaXRfdmVydGV4KCkKKyAgIHsKKyAgICAgIGlyX3R5cGUgPSBpcl90eXBlX2VtaXRfdmVydGV4OworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KGlyX3Zpc2l0b3IgKnYpCisgICB7CisgICAgICB2LT52aXNpdCh0aGlzKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl9lbWl0X3ZlcnRleCAqY2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKikgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZW1pdF92ZXJ0ZXgoKTsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSk7CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgYWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICopOworfTsKKworLyoqCisgKiBJUiBpbnN0cnVjdGlvbiB0byBjb21wbGV0ZSB0aGUgY3VycmVudCBwcmltaXRpdmUgYW5kIHN0YXJ0IGEgbmV3IG9uZSBpbiBhCisgKiBnZW9tZXRyeSBzaGFkZXIuCisgKi8KK2NsYXNzIGlyX2VuZF9wcmltaXRpdmUgOiBwdWJsaWMgaXJfaW5zdHJ1Y3Rpb24geworcHVibGljOgorICAgaXJfZW5kX3ByaW1pdGl2ZSgpCisgICB7CisgICAgICBpcl90eXBlID0gaXJfdHlwZV9lbmRfcHJpbWl0aXZlOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KGlyX3Zpc2l0b3IgKnYpCisgICB7CisgICAgICB2LT52aXNpdCh0aGlzKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl9lbmRfcHJpbWl0aXZlICpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9lbmRfcHJpbWl0aXZlKCk7CisgICB9CisKKyAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pOworCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIGFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqKTsKK307CisKKy8qQH0qLworCisvKioKKyAqIEFwcGx5IGEgdmlzaXRvciB0byBlYWNoIElSIG5vZGUgaW4gYSBsaXN0CisgKi8KK3ZvaWQKK3Zpc2l0X2V4ZWNfbGlzdChleGVjX2xpc3QgKmxpc3QsIGlyX3Zpc2l0b3IgKnZpc2l0b3IpOworCisvKioKKyAqIFZhbGlkYXRlIGludmFyaWFudHMgb24gZWFjaCBJUiBub2RlIGluIGEgbGlzdAorICovCit2b2lkIHZhbGlkYXRlX2lyX3RyZWUoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCitzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTsKK3N0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbTsKKworLyoqCisgKiBEZXRlY3Qgd2hldGhlciBhbiB1bmxpbmtlZCBzaGFkZXIgY29udGFpbnMgc3RhdGljIHJlY3Vyc2lvbgorICoKKyAqIElmIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucyBpcyBkZXRlcm1pbmVkIHRvIGNvbnRhaW4gc3RhdGljIHJlY3Vyc2lvbiwKKyAqIFxjIF9tZXNhX2dsc2xfZXJyb3Igd2lsbCBiZSBjYWxsZWQgdG8gZW1pdCBlcnJvciBtZXNzYWdlcyBmb3IgZWFjaCBmdW5jdGlvbgorICogdGhhdCBpcyBpbiB0aGUgcmVjdXJzaW9uIGN5Y2xlLgorICovCit2b2lkCitkZXRlY3RfcmVjdXJzaW9uX3VubGlua2VkKHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJCSAgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCisvKioKKyAqIERldGVjdCB3aGV0aGVyIGEgbGlua2VkIHNoYWRlciBjb250YWlucyBzdGF0aWMgcmVjdXJzaW9uCisgKgorICogSWYgdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIGlzIGRldGVybWluZWQgdG8gY29udGFpbiBzdGF0aWMgcmVjdXJzaW9uLAorICogXGMgbGlua19lcnJvcl9wcmludGYgd2lsbCBiZSBjYWxsZWQgdG8gZW1pdCBlcnJvciBtZXNzYWdlcyBmb3IgZWFjaCBmdW5jdGlvbgorICogdGhhdCBpcyBpbiB0aGUgcmVjdXJzaW9uIGN5Y2xlLiAgSW4gYWRkaXRpb24sCisgKiBcYyBnbF9zaGFkZXJfcHJvZ3JhbTo6TGlua1N0YXR1cyB3aWxsIGJlIHNldCB0byBmYWxzZS4KKyAqLwordm9pZAorZGV0ZWN0X3JlY3Vyc2lvbl9saW5rZWQoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorCQkJZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCisvKioKKyAqIE1ha2UgYSBjbG9uZSBvZiBlYWNoIElSIGluc3RydWN0aW9uIGluIGEgbGlzdAorICoKKyAqIFxwYXJhbSBpbiAgIExpc3Qgb2YgSVIgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHRvIGJlIGNsb25lZAorICogXHBhcmFtIG91dCAgTGlzdCB0byBob2xkIHRoZSBjbG9uZWQgaW5zdHJ1Y3Rpb25zCisgKi8KK3ZvaWQKK2Nsb25lX2lyX2xpc3Qodm9pZCAqbWVtX2N0eCwgZXhlY19saXN0ICpvdXQsIGNvbnN0IGV4ZWNfbGlzdCAqaW4pOworCitleHRlcm4gdm9pZAorX21lc2FfZ2xzbF9pbml0aWFsaXplX3ZhcmlhYmxlcyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCQlzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCitleHRlcm4gdm9pZAorX21lc2FfZ2xzbF9pbml0aWFsaXplX2Z1bmN0aW9ucyhfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9nbHNsX2luaXRpYWxpemVfYnVpbHRpbl9mdW5jdGlvbnMoKTsKKworZXh0ZXJuIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitfbWVzYV9nbHNsX2ZpbmRfYnVpbHRpbl9mdW5jdGlvbihfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGV4ZWNfbGlzdCAqYWN0dWFsX3BhcmFtZXRlcnMpOworCitleHRlcm4gZ2xfc2hhZGVyICoKK19tZXNhX2dsc2xfZ2V0X2J1aWx0aW5fZnVuY3Rpb25fc2hhZGVyKHZvaWQpOworCitleHRlcm4gdm9pZAorX21lc2FfZ2xzbF9yZWxlYXNlX2Z1bmN0aW9ucyh2b2lkKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2dsc2xfcmVsZWFzZV9idWlsdGluX2Z1bmN0aW9ucyh2b2lkKTsKKworZXh0ZXJuIHZvaWQKK3JlcGFyZW50X2lyKGV4ZWNfbGlzdCAqbGlzdCwgdm9pZCAqbWVtX2N0eCk7CisKK3N0cnVjdCBnbHNsX3N5bWJvbF90YWJsZTsKKworZXh0ZXJuIHZvaWQKK2ltcG9ydF9wcm90b3R5cGVzKGNvbnN0IGV4ZWNfbGlzdCAqc291cmNlLCBleGVjX2xpc3QgKmRlc3QsCisJCSAgc3RydWN0IGdsc2xfc3ltYm9sX3RhYmxlICpzeW1ib2xzLCB2b2lkICptZW1fY3R4KTsKKworZXh0ZXJuIGJvb2wKK2lyX2hhc19jYWxsKGlyX2luc3RydWN0aW9uICppcik7CisKK2V4dGVybiB2b2lkCitkb19zZXRfcHJvZ3JhbV9pbm91dHMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlcl9zdGFnZSBzaGFkZXJfc3RhZ2UpOworCitleHRlcm4gY2hhciAqCitwcm90b3R5cGVfc3RyaW5nKGNvbnN0IGdsc2xfdHlwZSAqcmV0dXJuX3R5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSBleGVjX2xpc3QgKnBhcmFtZXRlcnMpOworCitjb25zdCBjaGFyICoKK21vZGVfc3RyaW5nKGNvbnN0IGlyX3ZhcmlhYmxlICp2YXIpOworCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCitleHRlcm4gdm9pZCBfbWVzYV9wcmludF9pcihGSUxFICpmLCBzdHJ1Y3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKK3Vuc2lnbmVkCit2ZXJ0aWNlc19wZXJfcHJpbShHTGVudW0gcHJpbSk7CisKKyNlbmRpZiAvKiBJUl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9pcl9idWlsZGVyLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9pcl9idWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4YjUzYQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX2J1aWxkZXIuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpci5oIgorCituYW1lc3BhY2UgaXJfYnVpbGRlciB7CisKKyNpZm5kZWYgV1JJVEVNQVNLX1gKK2VudW0gd3JpdGVtYXNrIHsKKyAgIFdSSVRFTUFTS19YID0gMHgxLAorICAgV1JJVEVNQVNLX1kgPSAweDIsCisgICBXUklURU1BU0tfWiA9IDB4NCwKKyAgIFdSSVRFTUFTS19XID0gMHg4LAorfTsKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgbGl0dGxlIGNsYXNzIGV4aXN0cyB0byBsZXQgdGhlIGhlbHBlciBleHByZXNzaW9uIGdlbmVyYXRvcnMKKyAqIHRha2UgZWl0aGVyIGFuIGlyX3J2YWx1ZSAqIG9yIGFuIGlyX3ZhcmlhYmxlICogdG8gYmUgYXV0b21hdGljYWxseQorICogZGVyZWZlcmVuY2VkLCB3aGlsZSBzdGlsbCBwcm92aWRpbmcgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcuCisgKgorICogWW91IGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBjYWxsIHRoZSBjb25zdHJ1Y3RvciAtLSBDKysgd2lsbCBzZWUKKyAqIHRoYXQgeW91IHBhc3NlZCBhbiBpcl92YXJpYWJsZSwgYW5kIHNpbGVudGx5IGNhbGwgdGhlCisgKiBvcGVyYW5kKGlyX3ZhcmlhYmxlICp2YXIpIGNvbnN0cnVjdG9yIGJlaGluZCB5b3VyIGJhY2suCisgKi8KK2NsYXNzIG9wZXJhbmQgeworcHVibGljOgorICAgb3BlcmFuZChpcl9ydmFsdWUgKnZhbCkKKyAgICAgIDogdmFsKHZhbCkKKyAgIHsKKyAgIH0KKworICAgb3BlcmFuZChpcl92YXJpYWJsZSAqdmFyKQorICAgeworICAgICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQodmFyKTsKKyAgICAgIHZhbCA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgfQorCisgICBpcl9ydmFsdWUgKnZhbDsKK307CisKKy8qKiBBdXRvbWF0aWMgZ2VuZXJhdG9yIGZvciBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSBvbiBhc3NpZ25tZW50IExIUy4KKyAqCisgKiBcc2Egb3BlcmFuZAorICovCitjbGFzcyBkZXJlZiB7CitwdWJsaWM6CisgICBkZXJlZihpcl9kZXJlZmVyZW5jZSAqdmFsKQorICAgICAgOiB2YWwodmFsKQorICAgeworICAgfQorCisgICBkZXJlZihpcl92YXJpYWJsZSAqdmFyKQorICAgeworICAgICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQodmFyKTsKKyAgICAgIHZhbCA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgfQorCisKKyAgIGlyX2RlcmVmZXJlbmNlICp2YWw7Cit9OworCitjbGFzcyBpcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgIGlyX2ZhY3RvcnkoZXhlY19saXN0ICppbnN0cnVjdGlvbnMgPSBOVUxMLCB2b2lkICptZW1fY3R4ID0gTlVMTCkKKyAgICAgIDogaW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyksCisgICAgICAgIG1lbV9jdHgobWVtX2N0eCkKKyAgIHsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgdm9pZCBlbWl0KGlyX2luc3RydWN0aW9uICppcik7CisgICBpcl92YXJpYWJsZSAqbWFrZV90ZW1wKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgIGlyX2NvbnN0YW50KgorICAgY29uc3RhbnQoZmxvYXQgZikKKyAgIHsKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoZik7CisgICB9CisKKyAgIGlyX2NvbnN0YW50KgorICAgY29uc3RhbnQoaW50IGkpCisgICB7CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGkpOworICAgfQorCisgICBpcl9jb25zdGFudCoKKyAgIGNvbnN0YW50KHVuc2lnbmVkIHUpCisgICB7CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KHUpOworICAgfQorCisgICBpcl9jb25zdGFudCoKKyAgIGNvbnN0YW50KGJvb2wgYikKKyAgIHsKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoYik7CisgICB9CisKKyAgIGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zOworICAgdm9pZCAqbWVtX2N0eDsKK307CisKK2lyX2Fzc2lnbm1lbnQgKmFzc2lnbihkZXJlZiBsaHMsIG9wZXJhbmQgcmhzKTsKK2lyX2Fzc2lnbm1lbnQgKmFzc2lnbihkZXJlZiBsaHMsIG9wZXJhbmQgcmhzLCBpbnQgd3JpdGVtYXNrKTsKK2lyX2Fzc2lnbm1lbnQgKmFzc2lnbihkZXJlZiBsaHMsIG9wZXJhbmQgcmhzLCBvcGVyYW5kIGNvbmRpdGlvbik7Citpcl9hc3NpZ25tZW50ICphc3NpZ24oZGVyZWYgbGhzLCBvcGVyYW5kIHJocywgb3BlcmFuZCBjb25kaXRpb24sIGludCB3cml0ZW1hc2spOworCitpcl9yZXR1cm4gKnJldChvcGVyYW5kIHJldHZhbCk7CisKK2lyX2V4cHJlc3Npb24gKmV4cHIoaXJfZXhwcmVzc2lvbl9vcGVyYXRpb24gb3AsIG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpleHByKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wLCBvcGVyYW5kIGEsIG9wZXJhbmQgYik7Citpcl9leHByZXNzaW9uICpleHByKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wLCBvcGVyYW5kIGEsIG9wZXJhbmQgYiwgb3BlcmFuZCBjKTsKK2lyX2V4cHJlc3Npb24gKmFkZChvcGVyYW5kIGEsIG9wZXJhbmQgYik7Citpcl9leHByZXNzaW9uICpzdWIob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqbXVsKG9wZXJhbmQgYSwgb3BlcmFuZCBiKTsKK2lyX2V4cHJlc3Npb24gKmltdWxfaGlnaChvcGVyYW5kIGEsIG9wZXJhbmQgYik7Citpcl9leHByZXNzaW9uICpkaXYob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqY2Fycnkob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqYm9ycm93KG9wZXJhbmQgYSwgb3BlcmFuZCBiKTsKK2lyX2V4cHJlc3Npb24gKnJvdW5kX2V2ZW4ob3BlcmFuZCBhKTsKK2lyX2V4cHJlc3Npb24gKmRvdChvcGVyYW5kIGEsIG9wZXJhbmQgYik7Citpcl9leHByZXNzaW9uICpjbGFtcChvcGVyYW5kIGEsIG9wZXJhbmQgYiwgb3BlcmFuZCBjKTsKK2lyX2V4cHJlc3Npb24gKnNhdHVyYXRlKG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICphYnMob3BlcmFuZCBhKTsKK2lyX2V4cHJlc3Npb24gKm5lZyhvcGVyYW5kIGEpOworaXJfZXhwcmVzc2lvbiAqc2luKG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpjb3Mob3BlcmFuZCBhKTsKK2lyX2V4cHJlc3Npb24gKmV4cChvcGVyYW5kIGEpOworaXJfZXhwcmVzc2lvbiAqcnNxKG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpzcXJ0KG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpsb2cob3BlcmFuZCBhKTsKK2lyX2V4cHJlc3Npb24gKnNpZ24ob3BlcmFuZCBhKTsKKworaXJfZXhwcmVzc2lvbiAqZXF1YWwob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqbmVxdWFsKG9wZXJhbmQgYSwgb3BlcmFuZCBiKTsKK2lyX2V4cHJlc3Npb24gKmxlc3Mob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqZ3JlYXRlcihvcGVyYW5kIGEsIG9wZXJhbmQgYik7Citpcl9leHByZXNzaW9uICpsZXF1YWwob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqZ2VxdWFsKG9wZXJhbmQgYSwgb3BlcmFuZCBiKTsKKworaXJfZXhwcmVzc2lvbiAqbG9naWNfbm90KG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpsb2dpY19hbmQob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqbG9naWNfb3Iob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworCitpcl9leHByZXNzaW9uICpiaXRfbm90KG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpiaXRfb3Iob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqYml0X2FuZChvcGVyYW5kIGEsIG9wZXJhbmQgYik7Citpcl9leHByZXNzaW9uICpsc2hpZnQob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworaXJfZXhwcmVzc2lvbiAqcnNoaWZ0KG9wZXJhbmQgYSwgb3BlcmFuZCBiKTsKKworaXJfZXhwcmVzc2lvbiAqZjJpKG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpiaXRjYXN0X2YyaShvcGVyYW5kIGEpOworaXJfZXhwcmVzc2lvbiAqaTJmKG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpiaXRjYXN0X2kyZihvcGVyYW5kIGEpOworaXJfZXhwcmVzc2lvbiAqZjJ1KG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpiaXRjYXN0X2YydShvcGVyYW5kIGEpOworaXJfZXhwcmVzc2lvbiAqdTJmKG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpiaXRjYXN0X3UyZihvcGVyYW5kIGEpOworaXJfZXhwcmVzc2lvbiAqaTJ1KG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICp1Mmkob3BlcmFuZCBhKTsKK2lyX2V4cHJlc3Npb24gKmIyaShvcGVyYW5kIGEpOworaXJfZXhwcmVzc2lvbiAqaTJiKG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpmMmIob3BlcmFuZCBhKTsKK2lyX2V4cHJlc3Npb24gKmIyZihvcGVyYW5kIGEpOworCitpcl9leHByZXNzaW9uICptaW4yKG9wZXJhbmQgYSwgb3BlcmFuZCBiKTsKK2lyX2V4cHJlc3Npb24gKm1heDIob3BlcmFuZCBhLCBvcGVyYW5kIGIpOworCitpcl9leHByZXNzaW9uICpmbWEob3BlcmFuZCBhLCBvcGVyYW5kIGIsIG9wZXJhbmQgYyk7Citpcl9leHByZXNzaW9uICpscnAob3BlcmFuZCB4LCBvcGVyYW5kIHksIG9wZXJhbmQgYSk7Citpcl9leHByZXNzaW9uICpjc2VsKG9wZXJhbmQgYSwgb3BlcmFuZCBiLCBvcGVyYW5kIGMpOworaXJfZXhwcmVzc2lvbiAqYml0ZmllbGRfaW5zZXJ0KG9wZXJhbmQgYSwgb3BlcmFuZCBiLCBvcGVyYW5kIGMsIG9wZXJhbmQgZCk7CisKK2lyX3N3aXp6bGUgKnN3aXp6bGUob3BlcmFuZCBhLCBpbnQgc3dpenpsZSwgaW50IGNvbXBvbmVudHMpOworLyoqCisgKiBTd2l6emxlIGF3YXkgbGF0ZXIgY29tcG9uZW50cywgYnV0IHByZXNlcnZlIHRoZSBvcmRlcmluZy4KKyAqLworaXJfc3dpenpsZSAqc3dpenpsZV9mb3Jfc2l6ZShvcGVyYW5kIGEsIHVuc2lnbmVkIGNvbXBvbmVudHMpOworCitpcl9zd2l6emxlICpzd2l6emxlX3h4eHgob3BlcmFuZCBhKTsKK2lyX3N3aXp6bGUgKnN3aXp6bGVfeXl5eShvcGVyYW5kIGEpOworaXJfc3dpenpsZSAqc3dpenpsZV96enp6KG9wZXJhbmQgYSk7Citpcl9zd2l6emxlICpzd2l6emxlX3d3d3cob3BlcmFuZCBhKTsKK2lyX3N3aXp6bGUgKnN3aXp6bGVfeChvcGVyYW5kIGEpOworaXJfc3dpenpsZSAqc3dpenpsZV95KG9wZXJhbmQgYSk7Citpcl9zd2l6emxlICpzd2l6emxlX3oob3BlcmFuZCBhKTsKK2lyX3N3aXp6bGUgKnN3aXp6bGVfdyhvcGVyYW5kIGEpOworaXJfc3dpenpsZSAqc3dpenpsZV94eShvcGVyYW5kIGEpOworaXJfc3dpenpsZSAqc3dpenpsZV94eXoob3BlcmFuZCBhKTsKK2lyX3N3aXp6bGUgKnN3aXp6bGVfeHl6dyhvcGVyYW5kIGEpOworCitpcl9pZiAqaWZfdHJlZShvcGVyYW5kIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgIGlyX2luc3RydWN0aW9uICp0aGVuX2JyYW5jaCk7Citpcl9pZiAqaWZfdHJlZShvcGVyYW5kIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgIGlyX2luc3RydWN0aW9uICp0aGVuX2JyYW5jaCwKKyAgICAgICAgICAgICAgIGlyX2luc3RydWN0aW9uICplbHNlX2JyYW5jaCk7CisKK30gLyogbmFtZXNwYWNlIGlyX2J1aWxkZXIgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX2V4cHJlc3Npb25fZmxhdHRlbmluZy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvaXJfZXhwcmVzc2lvbl9mbGF0dGVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkYTE1OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX2V4cHJlc3Npb25fZmxhdHRlbmluZy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKy8qKgorICogXGZpbGUgaXJfZXhwcmVzc2lvbl9mbGF0dGVuaW5nLmgKKyAqCisgKiBUYWtlcyB0aGUgbGVhdmVzIG9mIGV4cHJlc3Npb24gdHJlZXMgYW5kIG1ha2VzIHRoZW0gZGVyZWZlcmVuY2VzIG9mCisgKiBhc3NpZ25tZW50cyBvZiB0aGUgbGVhdmVzIHRvIHRlbXBvcmFyaWVzLCBhY2NvcmRpbmcgdG8gYSBwcmVkaWNhdGUuCisgKgorICogVGhpcyBpcyB1c2VkIGZvciBhdXRvbWF0aWMgZnVuY3Rpb24gaW5saW5pbmcsIHdoZXJlIHdlIHdhbnQgdG8gdGFrZQorICogYW4gZXhwcmVzc2lvbiBjb250YWluaW5nIGEgY2FsbCBhbmQgbW92ZSB0aGUgY2FsbCBvdXQgdG8gaXRzIG93bgorICogYXNzaWdubWVudCBzbyB0aGF0IHdlIGNhbiBpbmxpbmUgaXQgYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlIGluIHRoZQorICogaW5zdHJ1Y3Rpb24gc3RyZWFtLgorICovCisKK3ZvaWQgZG9fZXhwcmVzc2lvbl9mbGF0dGVuaW5nKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICAgICAgYm9vbCAoKnByZWRpY2F0ZSkoaXJfaW5zdHJ1Y3Rpb24gKmlyKSk7CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9pcl9vcHRpbWl6YXRpb24uaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX29wdGltaXphdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzkyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9pcl9vcHRpbWl6YXRpb24uaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworLyoqCisgKiBcZmlsZSBpcl9vcHRpbWl6YXRpb24uaAorICoKKyAqIFByb3RvdHlwZXMgZm9yIG9wdGltaXphdGlvbiBwYXNzZXMgdG8gYmUgY2FsbGVkIGJ5IHRoZSBjb21waWxlciBhbmQgZHJpdmVycy4KKyAqLworCisvKiBPcGVyYXRpb25zIGZvciBsb3dlcl9pbnN0cnVjdGlvbnMoKSAqLworI2RlZmluZSBTVUJfVE9fQUREX05FRyAgICAgMHgwMQorI2RlZmluZSBESVZfVE9fTVVMX1JDUCAgICAgMHgwMgorI2RlZmluZSBFWFBfVE9fRVhQMiAgICAgICAgMHgwNAorI2RlZmluZSBQT1dfVE9fRVhQMiAgICAgICAgMHgwOAorI2RlZmluZSBMT0dfVE9fTE9HMiAgICAgICAgMHgxMAorI2RlZmluZSBNT0RfVE9fRlJBQ1QgICAgICAgMHgyMAorI2RlZmluZSBJTlRfRElWX1RPX01VTF9SQ1AgMHg0MAorI2RlZmluZSBCSVRGSUVMRF9JTlNFUlRfVE9fQkZNX0JGSSAweDgwCisjZGVmaW5lIExERVhQX1RPX0FSSVRIICAgICAweDEwMAorI2RlZmluZSBDQVJSWV9UT19BUklUSCAgICAgMHgyMDAKKyNkZWZpbmUgQk9SUk9XX1RPX0FSSVRIICAgIDB4NDAwCisKKy8qKgorICogXHNlZSBjbGFzcyBsb3dlcl9wYWNraW5nX2J1aWx0aW5zX3Zpc2l0b3IKKyAqLworZW51bSBsb3dlcl9wYWNraW5nX2J1aWx0aW5zX29wIHsKKyAgIExPV0VSX1BBQ0tfVU5QQUNLX05PTkUgICAgICAgICAgICAgICA9IDB4MDAwMCwKKworICAgTE9XRVJfUEFDS19TTk9STV8yeDE2ICAgICAgICAgICAgICAgID0gMHgwMDAxLAorICAgTE9XRVJfVU5QQUNLX1NOT1JNXzJ4MTYgICAgICAgICAgICAgID0gMHgwMDAyLAorCisgICBMT1dFUl9QQUNLX1VOT1JNXzJ4MTYgICAgICAgICAgICAgICAgPSAweDAwMDQsCisgICBMT1dFUl9VTlBBQ0tfVU5PUk1fMngxNiAgICAgICAgICAgICAgPSAweDAwMDgsCisKKyAgIExPV0VSX1BBQ0tfSEFMRl8yeDE2ICAgICAgICAgICAgICAgICA9IDB4MDAxMCwKKyAgIExPV0VSX1VOUEFDS19IQUxGXzJ4MTYgICAgICAgICAgICAgICA9IDB4MDAyMCwKKworICAgTE9XRVJfUEFDS19IQUxGXzJ4MTZfVE9fU1BMSVQgICAgICAgID0gMHgwMDQwLAorICAgTE9XRVJfVU5QQUNLX0hBTEZfMngxNl9UT19TUExJVCAgICAgID0gMHgwMDgwLAorCisgICBMT1dFUl9QQUNLX1NOT1JNXzR4OCAgICAgICAgICAgICAgICAgPSAweDAxMDAsCisgICBMT1dFUl9VTlBBQ0tfU05PUk1fNHg4ICAgICAgICAgICAgICAgPSAweDAyMDAsCisKKyAgIExPV0VSX1BBQ0tfVU5PUk1fNHg4ICAgICAgICAgICAgICAgICA9IDB4MDQwMCwKKyAgIExPV0VSX1VOUEFDS19VTk9STV80eDggICAgICAgICAgICAgICA9IDB4MDgwMAorfTsKKworYm9vbCBkb19jb21tb25fb3B0aW1pemF0aW9uKGV4ZWNfbGlzdCAqaXIsIGJvb2wgbGlua2VkLAorCQkJICAgIGJvb2wgdW5pZm9ybV9sb2NhdGlvbnNfYXNzaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3NoYWRlcl9jb21waWxlcl9vcHRpb25zICpvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmF0aXZlX2ludGVnZXJzKTsKKworYm9vbCBkb19hbGdlYnJhaWMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGJvb2wgbmF0aXZlX2ludGVnZXJzKTsKK2Jvb2wgZG9fY29uc3RhbnRfZm9sZGluZyhleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGRvX2NvbnN0YW50X3ZhcmlhYmxlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgZG9fY29uc3RhbnRfdmFyaWFibGVfdW5saW5rZWQoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb19jb3B5X3Byb3BhZ2F0aW9uKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgZG9fY29weV9wcm9wYWdhdGlvbl9lbGVtZW50cyhleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGRvX2NvbnN0YW50X3Byb3BhZ2F0aW9uKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgZG9fY3NlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK3ZvaWQgZG9fZGVhZF9idWlsdGluX3ZhcnlpbmdzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXIgKnByb2R1Y2VyLCBnbF9zaGFkZXIgKmNvbnN1bWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3RmZWVkYmFja19kZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRmZWVkYmFja19kZWNsICp0ZmVlZGJhY2tfZGVjbHMpOworYm9vbCBkb19kZWFkX2NvZGUoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGJvb2wgdW5pZm9ybV9sb2NhdGlvbnNfYXNzaWduZWQpOworYm9vbCBkb19kZWFkX2NvZGVfbG9jYWwoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb19kZWFkX2NvZGVfdW5saW5rZWQoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb19kZWFkX2Z1bmN0aW9ucyhleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIG9wdF9mbGlwX21hdHJpY2VzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgZG9fZnVuY3Rpb25faW5saW5pbmcoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb19sb3dlcl9qdW1wcyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywgYm9vbCBwdWxsX291dF9qdW1wcyA9IHRydWUsIGJvb2wgbG93ZXJfc3ViX3JldHVybiA9IHRydWUsIGJvb2wgbG93ZXJfbWFpbl9yZXR1cm4gPSBmYWxzZSwgYm9vbCBsb3dlcl9jb250aW51ZSA9IGZhbHNlLCBib29sIGxvd2VyX2JyZWFrID0gZmFsc2UpOworYm9vbCBkb19sb3dlcl90ZXh0dXJlX3Byb2plY3Rpb24oZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb19pZl9zaW1wbGlmaWNhdGlvbihleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIG9wdF9mbGF0dGVuX25lc3RlZF9pZl9ibG9ja3MoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb19kaXNjYXJkX3NpbXBsaWZpY2F0aW9uKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgbG93ZXJfaWZfdG9fY29uZF9hc3NpZ24oZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHVuc2lnbmVkIG1heF9kZXB0aCA9IDApOworYm9vbCBkb19tYXRfb3BfdG9fdmVjKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgZG9fbm9vcF9zd2l6emxlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgZG9fc3RydWN0dXJlX3NwbGl0dGluZyhleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGRvX3N3aXp6bGVfc3dpenpsZShleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGRvX3ZlY3Rvcml6ZShleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGRvX3RyZWVfZ3JhZnRpbmcoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb192ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ24oZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBkb192ZWNfaW5kZXhfdG9fc3dpenpsZShleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGxvd2VyX2Rpc2NhcmQoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOwordm9pZCBsb3dlcl9kaXNjYXJkX2Zsb3coZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBsb3dlcl9pbnN0cnVjdGlvbnMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHVuc2lnbmVkIHdoYXRfdG9fbG93ZXIpOworYm9vbCBsb3dlcl9ub2lzZShleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGxvd2VyX3ZhcmlhYmxlX2luZGV4X3RvX2NvbmRfYXNzaWduKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgIGJvb2wgbG93ZXJfaW5wdXQsIGJvb2wgbG93ZXJfb3V0cHV0LCBib29sIGxvd2VyX3RlbXAsIGJvb2wgbG93ZXJfdW5pZm9ybSk7Citib29sIGxvd2VyX3F1YWRvcF92ZWN0b3IoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGJvb2wgZG9udF9sb3dlcl9zd3opOworYm9vbCBsb3dlcl9jbGlwX2Rpc3RhbmNlKGdsX3NoYWRlciAqc2hhZGVyKTsKK3ZvaWQgbG93ZXJfb3V0cHV0X3JlYWRzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKK2Jvb2wgbG93ZXJfcGFja2luZ19idWlsdGlucyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywgaW50IG9wX21hc2spOwordm9pZCBsb3dlcl91Ym9fcmVmZXJlbmNlKHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOwordm9pZCBsb3dlcl9wYWNrZWRfdmFyeWluZ3Modm9pZCAqbWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvY2F0aW9uc191c2VkLCBpcl92YXJpYWJsZV9tb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBnc19pbnB1dF92ZXJ0aWNlcywgZ2xfc2hhZGVyICpzaGFkZXIpOworYm9vbCBsb3dlcl92ZWN0b3JfaW5zZXJ0KGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBib29sIGxvd2VyX25vbmNvbnN0YW50X2luZGV4KTsKK3ZvaWQgbG93ZXJfbmFtZWRfaW50ZXJmYWNlX2Jsb2Nrcyh2b2lkICptZW1fY3R4LCBnbF9zaGFkZXIgKnNoYWRlcik7Citib29sIG9wdGltaXplX3JlZHVuZGFudF9qdW1wcyhleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIG9wdGltaXplX3NwbGl0X2FycmF5cyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywgYm9vbCBsaW5rZWQpOworYm9vbCBsb3dlcl9vZmZzZXRfYXJyYXlzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKKworaXJfcnZhbHVlICoKK2NvbXBhcmVfaW5kZXhfYmxvY2soZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGlyX3ZhcmlhYmxlICppbmRleCwKKwkJICAgIHVuc2lnbmVkIGJhc2UsIHVuc2lnbmVkIGNvbXBvbmVudHMsIHZvaWQgKm1lbV9jdHgpOwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvaXJfcnZhbHVlX3Zpc2l0b3IuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX3J2YWx1ZV92aXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3OWZhNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX3J2YWx1ZV92aXNpdG9yLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaXJfcnZhbHVlX3Zpc2l0b3IuaAorICoKKyAqIEdlbmVyaWMgY2xhc3MgdG8gaW1wbGVtZW50IHRoZSBjb21tb24gcGF0dGVybiB3ZSBoYXZlIG9mIHdhbnRpbmcgdG8KKyAqIHZpc2l0IGVhY2ggaXJfcnZhbHVlICogYW5kIHBvc3NpYmx5IGNoYW5nZSB0aGF0IG5vZGUgdG8gYSBkaWZmZXJlbnQKKyAqIGNsYXNzLiAgSnVzdCBpbXBsZW1lbnQgaGFuZGxlX3J2YWx1ZSgpIGFuZCB5b3Ugd2lsbCBiZSBjYWxsZWQgd2l0aAorICogYSBwb2ludGVyIHRvIGVhY2ggcnZhbHVlIGluIHRoZSB0cmVlLgorICovCisKK2NsYXNzIGlyX3J2YWx1ZV9iYXNlX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfdmlzaXRvcl9zdGF0dXMgcnZhbHVlX3Zpc2l0KGlyX2Fzc2lnbm1lbnQgKik7CisgICBpcl92aXNpdG9yX3N0YXR1cyBydmFsdWVfdmlzaXQoaXJfY2FsbCAqKTsKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHJ2YWx1ZV92aXNpdChpcl9kZXJlZmVyZW5jZV9hcnJheSAqKTsKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHJ2YWx1ZV92aXNpdChpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKik7CisgICBpcl92aXNpdG9yX3N0YXR1cyBydmFsdWVfdmlzaXQoaXJfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHJ2YWx1ZV92aXNpdChpcl9pZiAqKTsKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHJ2YWx1ZV92aXNpdChpcl9yZXR1cm4gKik7CisgICBpcl92aXNpdG9yX3N0YXR1cyBydmFsdWVfdmlzaXQoaXJfc3dpenpsZSAqKTsKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHJ2YWx1ZV92aXNpdChpcl90ZXh0dXJlICopOworCisgICB2aXJ0dWFsIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpID0gMDsKK307CisKK2NsYXNzIGlyX3J2YWx1ZV92aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV9iYXNlX3Zpc2l0b3IgeworcHVibGljOgorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2NhbGwgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2RlcmVmZXJlbmNlX2FycmF5ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2V4cHJlc3Npb24gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2lmICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9yZXR1cm4gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX3N3aXp6bGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX3RleHR1cmUgKik7Cit9OworCitjbGFzcyBpcl9ydmFsdWVfZW50ZXJfdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfYmFzZV92aXNpdG9yIHsKK3B1YmxpYzoKKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9jYWxsICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9hcnJheSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9leHByZXNzaW9uICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9pZiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfcmV0dXJuICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9zd2l6emxlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl90ZXh0dXJlICopOworfTsKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX3VuaWZvcm0uaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL2lyX3VuaWZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA4NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvaXJfdW5pZm9ybS5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIElSX1VOSUZPUk1fSAorI2RlZmluZSBJUl9VTklGT1JNX0gKKworCisvKiBzdGRib29sLmggaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGluIGJvdGggQyBhbmQgQysrIGNvZGUuCisgKi8KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiICAvKiBGb3IgdW5pb24gZ2xfY29uc3RhbnRfdmFsdWUuICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitlbnVtIGdsX3VuaWZvcm1fZHJpdmVyX2Zvcm1hdCB7CisgICB1bmlmb3JtX25hdGl2ZSA9IDAsICAgICAgICAgIC8qKjwgU3RvcmUgZGF0YSBpbiB0aGUgbmF0aXZlIGZvcm1hdC4gKi8KKyAgIHVuaWZvcm1faW50X2Zsb2F0LCAgICAgICAgICAgLyoqPCBTdG9yZSBpbnRlZ2VyIGRhdGEgYXMgZmxvYXRzLiAqLworICAgdW5pZm9ybV9ib29sX2Zsb2F0LCAgICAgICAgICAvKio8IFN0b3JlIGJvb2xlYW4gZGF0YSBhcyBmbG9hdHMuICovCisKKyAgIC8qKgorICAgICogU3RvcmUgYm9vbGVhbiBkYXRhIGFzIGludGVnZXIgdXNpbmcgMSBmb3IgXGMgdHJ1ZS4KKyAgICAqLworICAgdW5pZm9ybV9ib29sX2ludF8wXzEsCisKKyAgIC8qKgorICAgICogU3RvcmUgYm9vbGVhbiBkYXRhIGFzIGludGVnZXIgdXNpbmcgfjAgZm9yIFxjIHRydWUuCisgICAgKi8KKyAgIHVuaWZvcm1fYm9vbF9pbnRfMF9ub3QwCit9OworCitzdHJ1Y3QgZ2xfdW5pZm9ybV9kcml2ZXJfc3RvcmFnZSB7CisgICAvKioKKyAgICAqIE51bWJlciBvZiBieXRlcyBmcm9tIG9uZSBhcnJheSBlbGVtZW50IHRvIHRoZSBuZXh0LgorICAgICovCisgICB1aW50OF90IGVsZW1lbnRfc3RyaWRlOworCisgICAvKioKKyAgICAqIE51bWJlciBvZiBieXRlcyBmcm9tIG9uZSB2ZWN0b3IgaW4gYSBtYXRyaXggdG8gdGhlIG5leHQuCisgICAgKi8KKyAgIHVpbnQ4X3QgdmVjdG9yX3N0cmlkZTsKKworICAgLyoqCisgICAgKiBCYXNlIGZvcm1hdCBvZiB0aGUgc3RvcmVkIGRhdGEuCisgICAgKgorICAgICogVGhpcyBmaWVsZCBtdXN0IGhhdmUgYSB2YWx1ZSBmcm9tIFxjIEdMU0xfVFlQRV9VSU5UIHRocm91Z2ggXGMKKyAgICAqIEdMU0xfVFlQRV9TQU1QTEVSLgorICAgICovCisgICB1aW50OF90IGZvcm1hdDsKKworICAgLyoqCisgICAgKiBQb2ludGVyIHRvIHRoZSBiYXNlIG9mIHRoZSBkYXRhLgorICAgICovCisgICB2b2lkICpkYXRhOworfTsKKworc3RydWN0IGdsX29wYXF1ZV91bmlmb3JtX2luZGV4IHsKKyAgIC8qKgorICAgICogQmFzZSBvcGFxdWUgdW5pZm9ybSBpbmRleAorICAgICoKKyAgICAqIElmIFxjIGdsX3VuaWZvcm1fc3RvcmFnZTo6YmFzZV90eXBlIGlzIGFuIG9wYXF1ZSB0eXBlLCB0aGlzCisgICAgKiByZXByZXNlbnRzIGl0cyB1bmlmb3JtIGluZGV4LiAgSWYgXGMKKyAgICAqIGdsX3VuaWZvcm1fc3RvcmFnZTo6YXJyYXlfZWxlbWVudHMgaXMgbm90IHplcm8sIHRoZSBhcnJheSB3aWxsCisgICAgKiB1c2Ugb3BhcXVlIHVuaWZvcm0gaW5kaWNlcyBcYyBpbmRleCB0aHJvdWdoIFxjIGluZGV4ICsgXGMKKyAgICAqIGdsX3VuaWZvcm1fc3RvcmFnZTo6YXJyYXlfZWxlbWVudHMgLSAxLCBpbmNsdXNpdmUuCisgICAgKgorICAgICogTm90ZSB0aGF0IHRoZSBpbmRleCBtYXkgYmUgZGlmZmVyZW50IGluIGVhY2ggc2hhZGVyIHN0YWdlLgorICAgICovCisgICB1aW50OF90IGluZGV4OworCisgICAvKioKKyAgICAqIFdoZXRoZXIgdGhpcyBvcGFxdWUgdW5pZm9ybSBpcyB1c2VkIGluIHRoaXMgc2hhZGVyIHN0YWdlLgorICAgICovCisgICBib29sIGFjdGl2ZTsKK307CisKK3N0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgeworICAgY2hhciAqbmFtZTsKKyAgIC8qKiBUeXBlIG9mIHRoaXMgdW5pZm9ybSBkYXRhIHN0b3JlZC4KKyAgICAqCisgICAgKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgaXQncyB0aGUgdHlwZSBvZiBhIHNpbmdsZSBhcnJheSBlbGVtZW50LgorICAgICovCisgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlOworCisgICAvKioKKyAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyB1bmlmb3JtLgorICAgICoKKyAgICAqIEZvciBub24tYXJyYXlzLCB0aGlzIGlzIGFsd2F5cyAwLiAgRm9yIGFycmF5cywgdGhlIHZhbHVlIGlzIHRoZSBzaXplIG9mCisgICAgKiB0aGUgYXJyYXkuCisgICAgKi8KKyAgIHVuc2lnbmVkIGFycmF5X2VsZW1lbnRzOworCisgICAvKioKKyAgICAqIEhhcyB0aGlzIHVuaWZvcm0gZXZlciBiZWVuIHNldD8KKyAgICAqLworICAgYm9vbCBpbml0aWFsaXplZDsKKworICAgc3RydWN0IGdsX29wYXF1ZV91bmlmb3JtX2luZGV4IHNhbXBsZXJbTUVTQV9TSEFERVJfU1RBR0VTXTsKKworICAgc3RydWN0IGdsX29wYXF1ZV91bmlmb3JtX2luZGV4IGltYWdlW01FU0FfU0hBREVSX1NUQUdFU107CisKKyAgIC8qKgorICAgICogU3RvcmFnZSB1c2VkIGJ5IHRoZSBkcml2ZXIgZm9yIHRoZSB1bmlmb3JtCisgICAgKi8KKyAgIHVuc2lnbmVkIG51bV9kcml2ZXJfc3RvcmFnZTsKKyAgIHN0cnVjdCBnbF91bmlmb3JtX2RyaXZlcl9zdG9yYWdlICpkcml2ZXJfc3RvcmFnZTsKKworICAgLyoqCisgICAgKiBTdG9yYWdlIHVzZWQgYnkgTWVzYSBmb3IgdGhlIHVuaWZvcm0KKyAgICAqCisgICAgKiBUaGlzIGZvcm0gb2YgdGhlIHVuaWZvcm0gaXMgdXNlZCBieSBNZXNhJ3MgaW1wbGVtZW50YXRpb24gb2YgXGMKKyAgICAqIGdsR2V0VW5pZm9ybS4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZHJpdmVycyB0byBvYnRhaW4gdGhlIHZhbHVlIG9mIHRoZQorICAgICogdW5pZm9ybSBpZiB0aGUgXGMgOjpkcml2ZXJfc3RvcmFnZSBpbnRlcmZhY2UgaXMgbm90IHVzZWQuCisgICAgKi8KKyAgIHVuaW9uIGdsX2NvbnN0YW50X3ZhbHVlICpzdG9yYWdlOworCisgICAvKiogRmllbGRzIGZvciBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0CisgICAgKiBAeworICAgICovCisKKyAgIC8qKgorICAgICogR0xfVU5JRk9STV9CTE9DS19JTkRFWDogaW5kZXggb2YgdGhlIHVuaWZvcm0gYmxvY2sgY29udGFpbmluZworICAgICogdGhlIHVuaWZvcm0sIG9yIC0xIGZvciB0aGUgZGVmYXVsdCB1bmlmb3JtIGJsb2NrLiAgTm90ZSB0aGF0IHRoZQorICAgICogaW5kZXggaXMgaW50byB0aGUgbGlua2VkIHByb2dyYW0ncyBVbmlmb3JtQmxvY2tzW10gYXJyYXksIG5vdAorICAgICogdGhlIGxpbmtlZCBzaGFkZXIncy4KKyAgICAqLworICAgaW50IGJsb2NrX2luZGV4OworCisgICAvKiogR0xfVU5JRk9STV9PRkZTRVQ6IGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgdW5pZm9ybSBibG9jaywgb3IgLTEuICovCisgICBpbnQgb2Zmc2V0OworCisgICAvKioKKyAgICAqIEdMX1VOSUZPUk1fTUFUUklYX1NUUklERTogYnl0ZSBzdHJpZGUgYmV0d2VlbiBjb2x1bW5zIG9yIHJvd3Mgb2YKKyAgICAqIGEgbWF0cml4LiAgU2V0IHRvIDAgZm9yIG5vbi1tYXRyaWNlcyBpbiBVQk9zLCBvciAtMSBmb3IgdW5pZm9ybXMKKyAgICAqIGluIHRoZSBkZWZhdWx0IHVuaWZvcm0gYmxvY2suCisgICAgKi8KKyAgIGludCBtYXRyaXhfc3RyaWRlOworCisgICAvKioKKyAgICAqIEdMX1VOSUZPUk1fQVJSQVlfU1RSSURFOiBieXRlIHN0cmlkZSBiZXR3ZWVuIGVsZW1lbnRzIG9mIHRoZQorICAgICogYXJyYXkuICBTZXQgdG8gemVybyBmb3Igbm9uLWFycmF5cyBpbiBVQk9zLCBvciAtMSBmb3IgdW5pZm9ybXMKKyAgICAqIGluIHRoZSBkZWZhdWx0IHVuaWZvcm0gYmxvY2suCisgICAgKi8KKyAgIGludCBhcnJheV9zdHJpZGU7CisKKyAgIC8qKiBHTF9VTklGT1JNX1JPV19NQUpPUjogdHJ1ZSBpZmYgaXQncyBhIHJvdy1tYWpvciBtYXRyaXggaW4gYSBVQk8gKi8KKyAgIGJvb2wgcm93X21ham9yOworCisgICAvKiogQH0gKi8KKworICAgLyoqCisgICAgKiBJbmRleCB3aXRoaW4gZ2xfc2hhZGVyX3Byb2dyYW06OkF0b21pY0J1ZmZlcnNbXSBvZiB0aGUgYXRvbWljCisgICAgKiBjb3VudGVyIGJ1ZmZlciB0aGlzIHVuaWZvcm0gaXMgc3RvcmVkIGluLCBvciAtMSBpZiB0aGlzIGlzIG5vdAorICAgICogYW4gYXRvbWljIGNvdW50ZXIuCisgICAgKi8KKyAgIGludCBhdG9taWNfYnVmZmVyX2luZGV4OworCisgICAvKioKKyAgICAqIFRoZSAnYmFzZSBsb2NhdGlvbicgZm9yIHRoaXMgdW5pZm9ybSBpbiB0aGUgdW5pZm9ybSByZW1hcCB0YWJsZS4gRm9yCisgICAgKiBhcnJheXMgdGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgICAgKi8KKyAgIHVuc2lnbmVkIHJlbWFwX2xvY2F0aW9uOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIElSX1VOSUZPUk1fSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvaXJfdmlzaXRvci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvaXJfdmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjk2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9pcl92aXNpdG9yLmgKQEAgLTAsMCArMSw5MSBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgSVJfVklTSVRPUl9ICisjZGVmaW5lIElSX1ZJU0lUT1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB2aXNpdG9ycyBvZiBJUiBpbnN0cnVjdGlvbiB0cmVlcworICovCitjbGFzcyBpcl92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIHZpcnR1YWwgfmlyX3Zpc2l0b3IoKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgLyoqCisgICAgKiBcbmFtZSBWaXNpdCBtZXRob2RzCisgICAgKgorICAgICogQXMgdHlwaWNhbCBmb3IgdGhlIHZpc2l0b3IgcGF0dGVybiwgdGhlcmUgbXVzdCBiZSBvbmUgXGMgdmlzaXQgbWV0aG9kIGZvcgorICAgICogZWFjaCBjb25jcmV0ZSBzdWJjbGFzcyBvZiBcYyBpcl9pbnN0cnVjdGlvbi4gIFZpcnR1YWwgYmFzZSBjbGFzc2VzIHdpdGhpbgorICAgICogdGhlIGhpZXJhcmNoeSBzaG91bGQgbm90IGhhdmUgXGMgdmlzaXQgbWV0aG9kcy4KKyAgICAqLworICAgLypAeyovCisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfcnZhbHVlICopIHsgYXNzZXJ0KCEidW5oYW5kbGVkIGVycm9yX3R5cGUiKTsgfQorICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX3ZhcmlhYmxlICopID0gMDsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKikgPSAwOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2Z1bmN0aW9uICopID0gMDsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9leHByZXNzaW9uICopID0gMDsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl90ZXh0dXJlICopID0gMDsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9zd2l6emxlICopID0gMDsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfZGVyZWZlcmVuY2VfYXJyYXkgKikgPSAwOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfYXNzaWdubWVudCAqKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfY29uc3RhbnQgKikgPSAwOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2NhbGwgKikgPSAwOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX3JldHVybiAqKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfZGlzY2FyZCAqKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfaWYgKikgPSAwOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2xvb3AgKikgPSAwOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2xvb3BfanVtcCAqKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfZW1pdF92ZXJ0ZXggKikgPSAwOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2VuZF9wcmltaXRpdmUgKikgPSAwOworICAgLypAfSovCit9OworCisvKiBOT1RFOiBmdW5jdGlvbiBjYWxscyBtYXkgbmV2ZXIgcmV0dXJuIGR1ZSB0byBkaXNjYXJkcyBpbnNpZGUgdGhlbQorICogVGhpcyBpcyB1c3VhbGx5IG5vdCBhbiBpc3N1ZSwgYnV0IGlmIGl0IGlzLCBrZWVwIGl0IGluIG1pbmQKKyAqLworY2xhc3MgaXJfY29udHJvbF9mbG93X3Zpc2l0b3IgOiBwdWJsaWMgaXJfdmlzaXRvciB7CitwdWJsaWM6CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfdmFyaWFibGUgKikge30KKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9leHByZXNzaW9uICopIHt9CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfdGV4dHVyZSAqKSB7fQorICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX3N3aXp6bGUgKikge30KKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqKSB7fQorICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2RlcmVmZXJlbmNlX2FycmF5ICopIHt9CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfZGVyZWZlcmVuY2VfcmVjb3JkICopIHt9CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfYXNzaWdubWVudCAqKSB7fQorICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2NvbnN0YW50ICopIHt9CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfY2FsbCAqKSB7fQorICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2VtaXRfdmVydGV4ICopIHt9CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfZW5kX3ByaW1pdGl2ZSAqKSB7fQorfTsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogSVJfVklTSVRPUl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9tZW1vcnlfbWFwLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9tZW1vcnlfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxMzEzNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL21lbW9yeV9tYXAuaApAQCAtMCwwICsxLDIzNyBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgTUVNT1JZX01BUF9ICisjZGVmaW5lIE1FTU9SWV9NQVBfSAorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9QT1NJWF9NQVBQRURfRklMRVMKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInJhbGxvYy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gcmVhZCBkYXRhCisgKgorICogQ2xhc3MgY2FuIHJlYWQgZWl0aGVyIGZyb20gdXNlciBnaXZlbiBtZW1vcnkgb3IgZnJvbSBhIGZpbGUuIE9uIExpbnV4CisgKiBmaWxlIHJlYWRpbmcgd3JhcHMgYXJvdW5kIHRoZSBQb3NpeCBmdW5jdGlvbnMgZm9yIG1hcHBpbmcgYSBmaWxlIGludG8KKyAqIHRoZSBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZS4gT3RoZXIgT1MgbWF5IG5lZWQgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBtZW1vcnlfbWFwCit7CitwdWJsaWM6CisgICBtZW1vcnlfbWFwKCkgOgorICAgICAgZXJyb3IoZmFsc2UpLAorICAgICAgbW9kZShtZW1vcnlfbWFwOjpSRUFEX01FTSksCisgICAgICBjYWNoZV9zaXplKDApLAorICAgICAgY2FjaGVfbW1hcChOVUxMKSwKKyAgICAgIGNhY2hlX21tYXBfcChOVUxMKQorICAgeworICAgICAgbWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworICAgfQorCisgICAvKiByZWFkIGZyb20gZGlzayAqLworICAgaW50IG1hcChjb25zdCBjaGFyICpwYXRoKQorICAgeworI2lmZGVmIF9QT1NJWF9NQVBQRURfRklMRVMKKyAgICAgIHN0cnVjdCBzdGF0IHN0YXRfaW5mbzsKKyAgICAgIGlmIChzdGF0KHBhdGgsICZzdGF0X2luZm8pICE9IDApCisgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIG1vZGUgPSBtZW1vcnlfbWFwOjpSRUFEX01BUDsKKyAgICAgIGNhY2hlX3NpemUgPSBzdGF0X2luZm8uc3Rfc2l6ZTsKKworICAgICAgaW50IGZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisgICAgICBpZiAoZmQpIHsKKyAgICAgICAgIGNhY2hlX21tYXBfcCA9IGNhY2hlX21tYXAgPSAoY2hhciAqKQorICAgICAgICAgICAgbW1hcChOVUxMLCBjYWNoZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICByZXR1cm4gKGNhY2hlX21tYXAgPT0gTUFQX0ZBSUxFRCkgPyAtMSA6IDA7CisgICAgICB9CisjZWxzZQorICAgICAgLyogSW1wbGVtZW50YXRpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBtbWFwKCkuICovCisgICAgICBGSUxFICppbiA9IGZvcGVuKHBhdGgsICJyIik7CisgICAgICBpZiAoaW4pIHsKKyAgICAgICAgIGZzZWVrKGluLCAwLCBTRUVLX0VORCk7CisgICAgICAgICBjYWNoZV9zaXplID0gZnRlbGwoaW4pOworICAgICAgICAgcmV3aW5kKGluKTsKKworICAgICAgICAgY2FjaGVfbW1hcCA9IHJhbGxvY19hcnJheShtZW1fY3R4LCBjaGFyLCBjYWNoZV9zaXplKTsKKworICAgICAgICAgaWYgKCFjYWNoZV9tbWFwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICBpZiAoZnJlYWQoY2FjaGVfbW1hcCwgY2FjaGVfc2l6ZSwgMSwgaW4pICE9IDEpIHsKKyAgICAgICAgICAgIHJhbGxvY19mcmVlKGNhY2hlX21tYXApOworICAgICAgICAgICAgY2FjaGVfbW1hcCA9IE5VTEw7CisgICAgICAgICB9CisgICAgICAgICBjYWNoZV9tbWFwX3AgPSBjYWNoZV9tbWFwOworICAgICAgICAgZmNsb3NlKGluKTsKKworICAgICAgICAgcmV0dXJuIChjYWNoZV9tbWFwID09IE5VTEwpID8gLTEgOiAwOworICAgICAgfQorI2VuZGlmCisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIC8qIHJlYWQgZnJvbSBtZW1vcnkgKi8KKyAgIHZvaWQgbWFwKGNvbnN0IHZvaWQgKm1lbW9yeSwgc2l6ZV90IHNpemUpCisgICB7CisgICAgICBjYWNoZV9tbWFwX3AgPSBjYWNoZV9tbWFwID0gKGNoYXIgKikgbWVtb3J5OworICAgICAgY2FjaGVfc2l6ZSA9IHNpemU7CisgICB9CisKKyAgIH5tZW1vcnlfbWFwKCkgeworI2lmZGVmIF9QT1NJWF9NQVBQRURfRklMRVMKKyAgICAgIGlmIChjYWNoZV9tbWFwICYmIG1vZGUgPT0gUkVBRF9NQVApIHsKKyAgICAgICAgIG11bm1hcChjYWNoZV9tbWFwLCBjYWNoZV9zaXplKTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7CisgICB9CisKKyAgIC8qIG1vdmUgcmVhZCBwb2ludGVyIGZvcndhcmQgKi8KKyAgIGlubGluZSB2b2lkIGZmd2QoaW50IGxlbikKKyAgIHsKKyAgICAgIGNhY2hlX21tYXBfcCArPSBsZW47CisgICB9CisKKyAgIGlubGluZSB2b2lkIGp1bXAodW5zaWduZWQgcG9zKQorICAgeworICAgICAgY2FjaGVfbW1hcF9wID0gY2FjaGVfbW1hcCArIHBvczsKKyAgIH0KKworICAgLyoqCisgICAgKiBzYWZldHkgY2hlY2sgdG8gYXZvaWQgcmVhZGluZyBvdmVyIGNhY2hlX3NpemUsCisgICAgKiByZXR1cm5zIGJvb2wgaWYgaXQgaXMgc2FmZSB0byBjb250aW51ZSByZWFkaW5nCisgICAgKi8KKyAgIGJvb2wgc2FmZV9yZWFkKHVuc2lnbmVkIHNpemUpCisgICB7CisgICAgICBpZiAocG9zaXRpb24oKSArIHNpemUgPiBjYWNoZV9zaXplKQorICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuICFlcnJvcjsKKyAgIH0KKworICAgLyogcG9zaXRpb24gb2YgcmVhZCBwb2ludGVyICovCisgICBpbmxpbmUgdWludDMyX3QgcG9zaXRpb24oKQorICAgeworICAgICAgcmV0dXJuIGNhY2hlX21tYXBfcCAtIGNhY2hlX21tYXA7CisgICB9CisKKyAgIGlubGluZSBjaGFyICpyZWFkX3N0cmluZygpCisgICB7CisgICAgICB1aW50MzJfdCBsZW4gPSByZWFkX3VpbnQzMl90KCk7CisKKyAgICAgIC8qIE5VTEwgcG9pbnRlciBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAvKiBkb24ndCByZWFkIG9mZiB0aGUgZW5kIG9mIGNhY2hlICovCisgICAgICAvKiBUT0RPOiBVbmRlcnN0YW5kIGhvdyB0aGlzIGNhbiBoYXBwZW4gYW5kIGZpeCAqLworICAgICAgaWYgKGxlbiArIHBvc2l0aW9uKCkgPiBjYWNoZV9zaXplKSB7CisgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgLyogdmVyaWZ5IHRoYXQgbGFzdCBjaGFyYWN0ZXIgaXMgdGVybWluYXRvciAqLworICAgICAgaWYgKCooY2FjaGVfbW1hcF9wICsgbGVuIC0gMSkgIT0gJ1wwJykgeworICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIGNoYXIgKnN0ciA9IHJhbGxvY19hcnJheShtZW1fY3R4LCBjaGFyLCBsZW4pOworICAgICAgbWVtY3B5KHN0ciwgY2FjaGVfbW1hcF9wLCBsZW4pOworICAgICAgZmZ3ZChsZW4pOworICAgICAgcmV0dXJuIHN0cjsKKyAgIH0KKworLyoqCisgKiByZWFkIGZ1bmN0aW9ucyBwZXIgdHlwZQorICovCisjZGVmaW5lIERFQ0xfUkVBREVSKHR5cGUpIHR5cGUgcmVhZF8gIyN0eXBlICgpIHtcCisgICBpZiAoIXNhZmVfcmVhZChzaXplb2YodHlwZSkpKVwKKyAgICAgIHJldHVybiAwO1wKKyAgIGZmd2Qoc2l6ZW9mKHR5cGUpKTtcCisgICByZXR1cm4gKih0eXBlICopIChjYWNoZV9tbWFwX3AgLSBzaXplb2YodHlwZSkpO1wKK30KKworICAgREVDTF9SRUFERVIoaW50MzJfdCk7CisgICBERUNMX1JFQURFUihpbnQ2NF90KTsKKyAgIERFQ0xfUkVBREVSKHVpbnQ4X3QpOworICAgREVDTF9SRUFERVIodWludDMyX3QpOworCisgICBpbmxpbmUgdWludDhfdCByZWFkX2Jvb2woKQorICAgeworICAgICAgcmV0dXJuIHJlYWRfdWludDhfdCgpOworICAgfQorCisgICBpbmxpbmUgdm9pZCByZWFkKHZvaWQgKmRzdCwgc2l6ZV90IHNpemUpCisgICB7CisgICAgICBpZiAoIXNhZmVfcmVhZChzaXplKSkKKyAgICAgICAgIHJldHVybjsKKyAgICAgIG1lbWNweShkc3QsIGNhY2hlX21tYXBfcCwgc2l6ZSk7CisgICAgICBmZndkKHNpemUpOworICAgfQorCisgICAvKiB0b3RhbCBzaXplIG9mIG1hcHBlZCBtZW1vcnkgKi8KKyAgIGlubGluZSBpbnQzMl90IHNpemUoKQorICAgeworICAgICAgcmV0dXJuIGNhY2hlX3NpemU7CisgICB9CisKKyAgIGlubGluZSBib29sIGVycm9ycygpCisgICB7CisgICAgICByZXR1cm4gZXJyb3I7CisgICB9CisKK3ByaXZhdGU6CisKKyAgIHZvaWQgKm1lbV9jdHg7CisKKyAgIC8qIGlmIGVycm9ycyBoYXZlIG9jY3VycmVkIGR1cmluZyByZWFkaW5nICovCisgICBib29sIGVycm9yOworCisgICAvKiBzcGVjaWZpZXMgaWYgd2UgYXJlIHJlYWRpbmcgbWFwcGVkIG1lbW9yeSBvciB1c2VyIHBhc3NlZCBtZW0gKi8KKyAgIGVudW0gcmVhZF9tb2RlIHsKKyAgICAgIFJFQURfTUVNID0gMCwKKyAgICAgIFJFQURfTUFQCisgICB9OworCisgICBpbnQzMl90IG1vZGU7CisgICB1bnNpZ25lZCBjYWNoZV9zaXplOworICAgY2hhciAqY2FjaGVfbW1hcDsKKyAgIGNoYXIgKmNhY2hlX21tYXBfcDsKK307CisjZW5kaWYgLyogaWZkZWYgX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIE1FTU9SWV9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvbWVtb3J5X3dyaXRlci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvbWVtb3J5X3dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OGQxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9tZW1vcnlfd3JpdGVyLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIE1FTU9SWV9XUklURVJfSAorI2RlZmluZSBNRU1PUllfV1JJVEVSX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibWFpbi9oYXNoX3RhYmxlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworLyoqCisgKiBIZWxwZXIgY2xhc3MgZm9yIHdyaXRpbmcgZGF0YSB0byBtZW1vcnkKKyAqCisgKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIGR5bmFtaWNhbGx5LXNpemVkIG1lbW9yeSBidWZmZXIgYW5kIGFsbG93cworICogZm9yIGRhdGEgdG8gYmUgZWZmaWNpZW50bHkgYXBwZW5kZWQgdG8gaXQgd2l0aCBhdXRvbWF0aWMgcmVzaXppbmcuCisgKi8KK2NsYXNzIG1lbW9yeV93cml0ZXIKK3sKK3B1YmxpYzoKKyAgIG1lbW9yeV93cml0ZXIoKSA6CisgICAgICBtZW1vcnkoTlVMTCksCisgICAgICBjdXJyX3NpemUoMCksCisgICAgICBwb3MoMCksCisgICAgICB1bmlxdWVfaWRfY291bnRlcigwKQorICAgeworICAgICAgZGF0YV9oYXNoID0gX21lc2FfaGFzaF90YWJsZV9jcmVhdGUoMCwgaW50X2VxdWFsKTsKKyAgICAgIGhhc2hfdmFsdWUgPSBfbWVzYV9oYXNoX2RhdGEodGhpcywgc2l6ZW9mKG1lbW9yeV93cml0ZXIpKTsKKyAgIH0KKworICAgfm1lbW9yeV93cml0ZXIoKQorICAgeworICAgICAgZnJlZShtZW1vcnkpOworICAgICAgX21lc2FfaGFzaF90YWJsZV9kZXN0cm95KGRhdGFfaGFzaCwgTlVMTCk7CisgICB9CisKKyAgIC8qIHVzZXIgd2FudHMgdG8gY2xhaW0gdGhlIG1lbW9yeSAqLworICAgY2hhciAqcmVsZWFzZV9tZW1vcnkoc2l6ZV90ICpzaXplKQorICAgeworICAgICAgLyogZmluYWwgcmVhbGxvYyB0byBmcmVlIGFsbG9jYXRlZCBidXQgdW51c2VkIG1lbW9yeSAqLworICAgICAgY2hhciAqcmVzdWx0ID0gKGNoYXIgKikgcmVhbGxvYyhtZW1vcnksIHBvcyk7CisgICAgICAqc2l6ZSA9IHBvczsKKyAgICAgIG1lbW9yeSA9IE5VTEw7CisgICAgICBjdXJyX3NpemUgPSAwOworICAgICAgcG9zID0gMDsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisKKy8qKgorICogd3JpdGUgZnVuY3Rpb25zIHBlciB0eXBlCisgKi8KKyNkZWZpbmUgREVDTF9XUklURVIodHlwZSkgdm9pZCB3cml0ZV8gIyN0eXBlIChjb25zdCB0eXBlIGRhdGEpIHtcCisgICB3cml0ZSgmZGF0YSwgc2l6ZW9mKHR5cGUpKTtcCit9CisKKyAgIERFQ0xfV1JJVEVSKGludDMyX3QpOworICAgREVDTF9XUklURVIoaW50NjRfdCk7CisgICBERUNMX1dSSVRFUih1aW50OF90KTsKKyAgIERFQ0xfV1JJVEVSKHVpbnQzMl90KTsKKworICAgdm9pZCB3cml0ZV9ib29sKGJvb2wgZGF0YSkKKyAgIHsKKyAgICAgIHVpbnQ4X3QgdmFsID0gZGF0YTsKKyAgICAgIHdyaXRlX3VpbnQ4X3QodmFsKTsKKyAgIH0KKworICAgLyogd3JpdGUgZnVuY3Rpb24gdGhhdCByZWFsbG9jYXRlcyBtb3JlIG1lbW9yeSBpZiByZXF1aXJlZCAqLworICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpkYXRhLCBpbnQgc2l6ZSkKKyAgIHsKKyAgICAgIGlmICghbWVtb3J5IHx8IHBvcyA+IChjdXJyX3NpemUgLSBzaXplKSkKKyAgICAgICAgIGlmICghZ3JvdyhzaXplKSkgeworICAgICAgICAgICAgYXNzZXJ0KCEiT3V0IG9mIG1lbW9yeSB3aGlsZSBzZXJpYWxpemluZyBhIHNoYWRlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorCisgICAgICBtZW1jcHkobWVtb3J5ICsgcG9zLCBkYXRhLCBzaXplKTsKKworICAgICAgcG9zICs9IHNpemU7CisgICB9CisKKyAgIHZvaWQgb3ZlcndyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplLCBpbnQgb2Zmc2V0KQorICAgeworICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgc2l6ZSA+IHBvcykgeworICAgICAgICAgYXNzZXJ0KCEiQXR0ZW1wdCB0byB3cml0ZSBvdXQgb2YgYm91bmRzIHdoaWxlIHNlcmlhbGl6aW5nIGEgc2hhZGVyIik7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIG1lbWNweShtZW1vcnkgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgfQorCisgICAvKiBsZW5ndGggaXMgd3JpdHRlbiB0byBtYWtlIHJlYWRpbmcgc2FmZSwgd2Ugd3JpdGUgbGVuICsgMSB0byBiZQorICAgICogYWJsZSB0byBtYWtlIGRpc3RpbmN0aW9uIGJldHdlZW4gIiIgYW5kIE5VTEwKKyAgICAqLworICAgdm9pZCB3cml0ZV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQorICAgeworICAgICAgdWludDMyX3QgbGVuID0gc3RyID8gc3RybGVuKHN0cikgKyAxIDogMDsKKyAgICAgIHdyaXRlX3VpbnQzMl90KGxlbik7CisKKyAgICAgIC8qIHNlcmlhbGl6ZSBzdHJpbmcgKyB0ZXJtaW5hdG9yIGZvciBtb3JlIGNvbnZpbmllbnQgcGFyc2luZy4gKi8KKyAgICAgIGlmIChzdHIpCisgICAgICAgICB3cml0ZShzdHIsIGxlbik7CisgICB9CisKKyAgIHVuc2lnbmVkIHBvc2l0aW9uKCkKKyAgIHsKKyAgICAgIHJldHVybiBwb3M7CisgICB9CisKKyAgIC8qKgorICAgICogQ29udmVydCB0aGUgZ2l2ZW4gcG9pbnRlciBpbnRvIGEgc21hbGwgaW50ZWdlciB1bmlxdWUgSUQuICBJbiBvdGhlcgorICAgICogd29yZHMsIGlmIG1ha2VfdW5pcXVlX2lkKCkgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQgd2l0aCB0aGlzIHBvaW50ZXIsCisgICAgKiByZXR1cm4gdGhlIHNhbWUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgbGFzdCB0aW1lLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QKKyAgICAqIGNhbGwgdG8gbWFrZV91bmlxdWVfaWQoKSB3aXRoIHRoaXMgcG9pbnRlciwgcmV0dXJuIGEgZnJlc2ggSUQuCisgICAgKgorICAgICogUmV0dXJuIHZhbHVlIGlzIHRydWUgaWYgdGhlIHBvaW50ZXIgaGFzIGJlZW4gc2VlbiBiZWZvcmUsIGZhbHNlCisgICAgKiBvdGhlcndpc2UuCisgICAgKi8KKyAgIGJvb2wgbWFrZV91bmlxdWVfaWQoY29uc3Qgdm9pZCAqcHRyLCB1aW50MzJfdCAqaWRfb3V0KQorICAgeworICAgICAgaGFzaF9lbnRyeSAqZW50cnkgPQorICAgICAgICAgX21lc2FfaGFzaF90YWJsZV9zZWFyY2goZGF0YV9oYXNoLCBfbWVzYV9oYXNoX3BvaW50ZXIocHRyKSwgcHRyKTsKKyAgICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7CisgICAgICAgICAqaWRfb3V0ID0gKHVpbnQzMl90KSAoaW50cHRyX3QpIGVudHJ5LT5kYXRhOworICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAgLyogTm90ZTogaGFzaHRhYmxlIHVzZXMgMCB0byByZXByZXNlbnQgImVudHJ5IG5vdCBmb3VuZCIgc28gb3VyCisgICAgICAgICAgKiB1bmlxdWUgSUQncyBuZWVkIHRvIHN0YXJ0IGF0IDEuICBIZW5jZSwgcHJlaW5jcmVtZW50CisgICAgICAgICAgKiB1bmlxdWVfaWRfY291bnRlci4KKyAgICAgICAgICAqLworICAgICAgICAgKmlkX291dCA9ICsrdGhpcy0+dW5pcXVlX2lkX2NvdW50ZXI7CisgICAgICAgICBfbWVzYV9oYXNoX3RhYmxlX2luc2VydChkYXRhX2hhc2gsIF9tZXNhX2hhc2hfcG9pbnRlcihwdHIpLCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAoaW50cHRyX3QpICppZF9vdXQpOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCitwcml2YXRlOgorCisgICAvKiByZWFsbG9jYXRlIG1vcmUgbWVtb3J5ICovCisgICBib29sIGdyb3coaW50IHNpemUpCisgICB7CisgICAgICB1bnNpZ25lZCBuZXdfc2l6ZSA9IDIgKiAoY3Vycl9zaXplICsgc2l6ZSk7CisgICAgICBjaGFyICptb3JlX21lbSA9IChjaGFyICopIHJlYWxsb2MobWVtb3J5LCBuZXdfc2l6ZSk7CisgICAgICBpZiAobW9yZV9tZW0gPT0gTlVMTCkgeworICAgICAgICAgZnJlZShtZW1vcnkpOworICAgICAgICAgbWVtb3J5ID0gTlVMTDsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBtZW1vcnkgPSBtb3JlX21lbTsKKyAgICAgICAgIGN1cnJfc2l6ZSA9IG5ld19zaXplOworICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICB9CisKKyAgIC8qIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgIGNoYXIgKm1lbW9yeTsKKworICAgLyogY3VycmVudCBzaXplIG9mIHRoZSB3aG9sZSBhbGxvY2F0aW9uICovCisgICBpbnQgY3Vycl9zaXplOworCisgICAvKiB3cml0ZSBwb3NpdGlvbiAvIHNpemUgb2YgdGhlIGRhdGEgd3JpdHRlbiAqLworICAgaW50IHBvczsKKworICAgLyogdGhpcyBoYXNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGRhdGEgYWxyZWFkeSB3cml0dGVuCisgICAgKiB0byBza2lwIHNlcXVlbnRpYWwgd3JpdGVzIG9mIHRoZSBzYW1lIGRhdGEKKyAgICAqLworICAgc3RydWN0IGhhc2hfdGFibGUgKmRhdGFfaGFzaDsKKyAgIHVpbnQzMl90IGhhc2hfdmFsdWU7CisgICB1bnNpZ25lZCB1bmlxdWVfaWRfY291bnRlcjsKKworICAgc3RhdGljIGJvb2wgaW50X2VxdWFsKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisgICB7CisgICAgICByZXR1cm4gYSA9PSBiOworICAgfQorCit9OworCisjZW5kaWYgLyogaWZkZWYgX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIE1FTU9SWV9XUklURVJfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvcmFsbG9jLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9yYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmJjNjFmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvcmFsbG9jLmMKQEAgLTAsMCArMSw0OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogQW5kcm9pZCBkZWZpbmVzIFNJWkVfTUFYIGluIGxpbWl0cy5oLCBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBzdGRpbnQuaCAqLworI2lmZGVmIEFORFJPSUQKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorCisvKiBTb21lIHZlcnNpb25zIG9mIE1pbkdXIGFyZSBtaXNzaW5nIF92c2NwcmludGYncyBkZWNsYXJhdGlvbiwgYWx0aG91Z2ggdGhleQorICogc3RpbGwgcHJvdmlkZSB0aGUgc3ltYm9sIGluIHRoZSBpbXBvcnQgbGlicmFyeS4gKi8KKyNpZmRlZiBfX01JTkdXMzJfXworX0NSVElNUCBpbnQgX3ZzY3ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncHRyKTsKKyNlbmRpZgorCisjaW5jbHVkZSAicmFsbG9jLmgiCisKKyNpZm5kZWYgdmFfY29weQorI2lmZGVmIF9fdmFfY29weQorI2RlZmluZSB2YV9jb3B5KGRlc3QsIHNyYykgX192YV9jb3B5KChkZXN0KSwgKHNyYykpCisjZWxzZQorI2RlZmluZSB2YV9jb3B5KGRlc3QsIHNyYykgKGRlc3QpID0gKHNyYykKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQ0FOQVJZIDB4NUExMTA2CisKK3N0cnVjdCByYWxsb2NfaGVhZGVyCit7CisjaWZkZWYgREVCVUcKKyAgIC8qIEEgY2FuYXJ5IHZhbHVlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwb2ludGVyIGlzIHJhbGxvYydkLiAqLworICAgdW5zaWduZWQgY2FuYXJ5OworI2VuZGlmCisKKyAgIHN0cnVjdCByYWxsb2NfaGVhZGVyICpwYXJlbnQ7CisKKyAgIC8qIFRoZSBmaXJzdCBjaGlsZCAoaGVhZCBvZiBhIGxpbmtlZCBsaXN0KSAqLworICAgc3RydWN0IHJhbGxvY19oZWFkZXIgKmNoaWxkOworCisgICAvKiBMaW5rZWQgbGlzdCBvZiBzaWJsaW5ncyAqLworICAgc3RydWN0IHJhbGxvY19oZWFkZXIgKnByZXY7CisgICBzdHJ1Y3QgcmFsbG9jX2hlYWRlciAqbmV4dDsKKworICAgdm9pZCAoKmRlc3RydWN0b3IpKHZvaWQgKik7Cit9OworCit0eXBlZGVmIHN0cnVjdCByYWxsb2NfaGVhZGVyIHJhbGxvY19oZWFkZXI7CisKK3N0YXRpYyB2b2lkIHVubGlua19ibG9jayhyYWxsb2NfaGVhZGVyICppbmZvKTsKK3N0YXRpYyB2b2lkIHVuc2FmZV9mcmVlKHJhbGxvY19oZWFkZXIgKmluZm8pOworCitzdGF0aWMgcmFsbG9jX2hlYWRlciAqCitnZXRfaGVhZGVyKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgIHJhbGxvY19oZWFkZXIgKmluZm8gPSAocmFsbG9jX2hlYWRlciAqKSAoKChjaGFyICopIHB0cikgLQorCQkJCQkgICAgc2l6ZW9mKHJhbGxvY19oZWFkZXIpKTsKKyNpZmRlZiBERUJVRworICAgYXNzZXJ0KGluZm8tPmNhbmFyeSA9PSBDQU5BUlkpOworI2VuZGlmCisgICByZXR1cm4gaW5mbzsKK30KKworI2RlZmluZSBQVFJfRlJPTV9IRUFERVIoaW5mbykgKCgoY2hhciAqKSBpbmZvKSArIHNpemVvZihyYWxsb2NfaGVhZGVyKSkKKworc3RhdGljIHZvaWQKK2FkZF9jaGlsZChyYWxsb2NfaGVhZGVyICpwYXJlbnQsIHJhbGxvY19oZWFkZXIgKmluZm8pCit7CisgICBpZiAocGFyZW50ICE9IE5VTEwpIHsKKyAgICAgIGluZm8tPnBhcmVudCA9IHBhcmVudDsKKyAgICAgIGluZm8tPm5leHQgPSBwYXJlbnQtPmNoaWxkOworICAgICAgcGFyZW50LT5jaGlsZCA9IGluZm87CisKKyAgICAgIGlmIChpbmZvLT5uZXh0ICE9IE5VTEwpCisJIGluZm8tPm5leHQtPnByZXYgPSBpbmZvOworICAgfQorfQorCit2b2lkICoKK3JhbGxvY19jb250ZXh0KGNvbnN0IHZvaWQgKmN0eCkKK3sKKyAgIHJldHVybiByYWxsb2Nfc2l6ZShjdHgsIDApOworfQorCit2b2lkICoKK3JhbGxvY19zaXplKGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IHNpemUpCit7CisgICB2b2lkICpibG9jayA9IGNhbGxvYygxLCBzaXplICsgc2l6ZW9mKHJhbGxvY19oZWFkZXIpKTsKKyAgIHJhbGxvY19oZWFkZXIgKmluZm87CisgICByYWxsb2NfaGVhZGVyICpwYXJlbnQ7CisKKyAgIGlmICh1bmxpa2VseShibG9jayA9PSBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgaW5mbyA9IChyYWxsb2NfaGVhZGVyICopIGJsb2NrOworICAgcGFyZW50ID0gY3R4ICE9IE5VTEwgPyBnZXRfaGVhZGVyKGN0eCkgOiBOVUxMOworCisgICBhZGRfY2hpbGQocGFyZW50LCBpbmZvKTsKKworI2lmZGVmIERFQlVHCisgICBpbmZvLT5jYW5hcnkgPSBDQU5BUlk7CisjZW5kaWYKKworICAgcmV0dXJuIFBUUl9GUk9NX0hFQURFUihpbmZvKTsKK30KKwordm9pZCAqCityemFsbG9jX3NpemUoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSkKK3sKKyAgIHZvaWQgKnB0ciA9IHJhbGxvY19zaXplKGN0eCwgc2l6ZSk7CisgICBpZiAobGlrZWx5KHB0ciAhPSBOVUxMKSkKKyAgICAgIG1lbXNldChwdHIsIDAsIHNpemUpOworICAgcmV0dXJuIHB0cjsKK30KKworLyogaGVscGVyIGZ1bmN0aW9uIC0gYXNzdW1lcyBwdHIgIT0gTlVMTCAqLworc3RhdGljIHZvaWQgKgorcmVzaXplKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgICByYWxsb2NfaGVhZGVyICpjaGlsZCwgKm9sZCwgKmluZm87CisKKyAgIG9sZCA9IGdldF9oZWFkZXIocHRyKTsKKyAgIGluZm8gPSByZWFsbG9jKG9sZCwgc2l6ZSArIHNpemVvZihyYWxsb2NfaGVhZGVyKSk7CisKKyAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgLyogVXBkYXRlIHBhcmVudCBhbmQgc2libGluZydzIGxpbmtzIHRvIHRoZSByZWFsbG9jYXRlZCBub2RlLiAqLworICAgaWYgKGluZm8gIT0gb2xkICYmIGluZm8tPnBhcmVudCAhPSBOVUxMKSB7CisgICAgICBpZiAoaW5mby0+cGFyZW50LT5jaGlsZCA9PSBvbGQpCisJIGluZm8tPnBhcmVudC0+Y2hpbGQgPSBpbmZvOworCisgICAgICBpZiAoaW5mby0+cHJldiAhPSBOVUxMKQorCSBpbmZvLT5wcmV2LT5uZXh0ID0gaW5mbzsKKworICAgICAgaWYgKGluZm8tPm5leHQgIT0gTlVMTCkKKwkgaW5mby0+bmV4dC0+cHJldiA9IGluZm87CisgICB9CisKKyAgIC8qIFVwZGF0ZSBjaGlsZC0+cGFyZW50IGxpbmtzIGZvciBhbGwgY2hpbGRyZW4gKi8KKyAgIGZvciAoY2hpbGQgPSBpbmZvLT5jaGlsZDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKyAgICAgIGNoaWxkLT5wYXJlbnQgPSBpbmZvOworCisgICByZXR1cm4gUFRSX0ZST01fSEVBREVSKGluZm8pOworfQorCit2b2lkICoKK3JlcmFsbG9jX3NpemUoY29uc3Qgdm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworICAgaWYgKHVubGlrZWx5KHB0ciA9PSBOVUxMKSkKKyAgICAgIHJldHVybiByYWxsb2Nfc2l6ZShjdHgsIHNpemUpOworCisgICBhc3NlcnQocmFsbG9jX3BhcmVudChwdHIpID09IGN0eCk7CisgICByZXR1cm4gcmVzaXplKHB0ciwgc2l6ZSk7Cit9CisKK3ZvaWQgKgorcmFsbG9jX2FycmF5X3NpemUoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgY291bnQpCit7CisgICBpZiAoY291bnQgPiBTSVpFX01BWC9zaXplKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiByYWxsb2Nfc2l6ZShjdHgsIHNpemUgKiBjb3VudCk7Cit9CisKK3ZvaWQgKgorcnphbGxvY19hcnJheV9zaXplKGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGNvdW50KQoreworICAgaWYgKGNvdW50ID4gU0laRV9NQVgvc2l6ZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICByZXR1cm4gcnphbGxvY19zaXplKGN0eCwgc2l6ZSAqIGNvdW50KTsKK30KKwordm9pZCAqCityZXJhbGxvY19hcnJheV9zaXplKGNvbnN0IHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgY291bnQpCit7CisgICBpZiAoY291bnQgPiBTSVpFX01BWC9zaXplKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiByZXJhbGxvY19zaXplKGN0eCwgcHRyLCBzaXplICogY291bnQpOworfQorCit2b2lkCityYWxsb2NfZnJlZSh2b2lkICpwdHIpCit7CisgICByYWxsb2NfaGVhZGVyICppbmZvOworCisgICBpZiAocHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIGluZm8gPSBnZXRfaGVhZGVyKHB0cik7CisgICB1bmxpbmtfYmxvY2soaW5mbyk7CisgICB1bnNhZmVfZnJlZShpbmZvKTsKK30KKworc3RhdGljIHZvaWQKK3VubGlua19ibG9jayhyYWxsb2NfaGVhZGVyICppbmZvKQoreworICAgLyogVW5saW5rIGZyb20gcGFyZW50ICYgc2libGluZ3MgKi8KKyAgIGlmIChpbmZvLT5wYXJlbnQgIT0gTlVMTCkgeworICAgICAgaWYgKGluZm8tPnBhcmVudC0+Y2hpbGQgPT0gaW5mbykKKwkgaW5mby0+cGFyZW50LT5jaGlsZCA9IGluZm8tPm5leHQ7CisKKyAgICAgIGlmIChpbmZvLT5wcmV2ICE9IE5VTEwpCisJIGluZm8tPnByZXYtPm5leHQgPSBpbmZvLT5uZXh0OworCisgICAgICBpZiAoaW5mby0+bmV4dCAhPSBOVUxMKQorCSBpbmZvLT5uZXh0LT5wcmV2ID0gaW5mby0+cHJldjsKKyAgIH0KKyAgIGluZm8tPnBhcmVudCA9IE5VTEw7CisgICBpbmZvLT5wcmV2ID0gTlVMTDsKKyAgIGluZm8tPm5leHQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordW5zYWZlX2ZyZWUocmFsbG9jX2hlYWRlciAqaW5mbykKK3sKKyAgIC8qIFJlY3Vyc2l2ZWx5IGZyZWUgYW55IGNoaWxkcmVuLi4uZG9uJ3Qgd2FzdGUgdGltZSB1bmxpbmtpbmcgdGhlbS4gKi8KKyAgIHJhbGxvY19oZWFkZXIgKnRlbXA7CisgICB3aGlsZSAoaW5mby0+Y2hpbGQgIT0gTlVMTCkgeworICAgICAgdGVtcCA9IGluZm8tPmNoaWxkOworICAgICAgaW5mby0+Y2hpbGQgPSB0ZW1wLT5uZXh0OworICAgICAgdW5zYWZlX2ZyZWUodGVtcCk7CisgICB9CisKKyAgIC8qIEZyZWUgdGhlIGJsb2NrIGl0c2VsZi4gIENhbGwgdGhlIGRlc3RydWN0b3IgZmlyc3QsIGlmIGFueS4gKi8KKyAgIGlmIChpbmZvLT5kZXN0cnVjdG9yICE9IE5VTEwpCisgICAgICBpbmZvLT5kZXN0cnVjdG9yKFBUUl9GUk9NX0hFQURFUihpbmZvKSk7CisKKyAgIGZyZWUoaW5mbyk7Cit9CisKK3ZvaWQKK3JhbGxvY19zdGVhbChjb25zdCB2b2lkICpuZXdfY3R4LCB2b2lkICpwdHIpCit7CisgICByYWxsb2NfaGVhZGVyICppbmZvLCAqcGFyZW50OworCisgICBpZiAodW5saWtlbHkocHRyID09IE5VTEwpKQorICAgICAgcmV0dXJuOworCisgICBpbmZvID0gZ2V0X2hlYWRlcihwdHIpOworICAgcGFyZW50ID0gZ2V0X2hlYWRlcihuZXdfY3R4KTsKKworICAgdW5saW5rX2Jsb2NrKGluZm8pOworCisgICBhZGRfY2hpbGQocGFyZW50LCBpbmZvKTsKK30KKwordm9pZCAqCityYWxsb2NfcGFyZW50KGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgIHJhbGxvY19oZWFkZXIgKmluZm87CisKKyAgIGlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaW5mbyA9IGdldF9oZWFkZXIocHRyKTsKKyAgIHJldHVybiBpbmZvLT5wYXJlbnQgPyBQVFJfRlJPTV9IRUFERVIoaW5mby0+cGFyZW50KSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICphdXRvZnJlZV9jb250ZXh0ID0gTlVMTDsKKworc3RhdGljIHZvaWQKK2F1dG9mcmVlKHZvaWQpCit7CisgICByYWxsb2NfZnJlZShhdXRvZnJlZV9jb250ZXh0KTsKK30KKwordm9pZCAqCityYWxsb2NfYXV0b2ZyZWVfY29udGV4dCh2b2lkKQoreworICAgaWYgKHVubGlrZWx5KGF1dG9mcmVlX2NvbnRleHQgPT0gTlVMTCkpIHsKKyAgICAgIGF1dG9mcmVlX2NvbnRleHQgPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgICAgIGF0ZXhpdChhdXRvZnJlZSk7CisgICB9CisgICByZXR1cm4gYXV0b2ZyZWVfY29udGV4dDsKK30KKwordm9pZAorcmFsbG9jX3NldF9kZXN0cnVjdG9yKGNvbnN0IHZvaWQgKnB0ciwgdm9pZCgqZGVzdHJ1Y3Rvcikodm9pZCAqKSkKK3sKKyAgIHJhbGxvY19oZWFkZXIgKmluZm8gPSBnZXRfaGVhZGVyKHB0cik7CisgICBpbmZvLT5kZXN0cnVjdG9yID0gZGVzdHJ1Y3RvcjsKK30KKworY2hhciAqCityYWxsb2Nfc3RyZHVwKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqc3RyKQoreworICAgc2l6ZV90IG47CisgICBjaGFyICpwdHI7CisKKyAgIGlmICh1bmxpa2VseShzdHIgPT0gTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgbiA9IHN0cmxlbihzdHIpOworICAgcHRyID0gcmFsbG9jX2FycmF5KGN0eCwgY2hhciwgbiArIDEpOworICAgbWVtY3B5KHB0ciwgc3RyLCBuKTsKKyAgIHB0cltuXSA9ICdcMCc7CisgICByZXR1cm4gcHRyOworfQorCitjaGFyICoKK3JhbGxvY19zdHJuZHVwKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbWF4KQoreworICAgc2l6ZV90IG47CisgICBjaGFyICpwdHI7CisKKyAgIGlmICh1bmxpa2VseShzdHIgPT0gTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgbiA9IHN0cmxlbihzdHIpOworICAgaWYgKG4gPiBtYXgpCisgICAgICBuID0gbWF4OworCisgICBwdHIgPSByYWxsb2NfYXJyYXkoY3R4LCBjaGFyLCBuICsgMSk7CisgICBtZW1jcHkocHRyLCBzdHIsIG4pOworICAgcHRyW25dID0gJ1wwJzsKKyAgIHJldHVybiBwdHI7Cit9CisKKy8qIGhlbHBlciByb3V0aW5lIGZvciBzdHJjYXQvc3RybmNhdCAtIG4gaXMgdGhlIGV4YWN0IGFtb3VudCB0byBjb3B5ICovCitzdGF0aWMgYm9vbAorY2F0KGNoYXIgKipkZXN0LCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBuKQoreworICAgY2hhciAqYm90aDsKKyAgIHNpemVfdCBleGlzdGluZ19sZW5ndGg7CisgICBhc3NlcnQoZGVzdCAhPSBOVUxMICYmICpkZXN0ICE9IE5VTEwpOworCisgICBleGlzdGluZ19sZW5ndGggPSBzdHJsZW4oKmRlc3QpOworICAgYm90aCA9IHJlc2l6ZSgqZGVzdCwgZXhpc3RpbmdfbGVuZ3RoICsgbiArIDEpOworICAgaWYgKHVubGlrZWx5KGJvdGggPT0gTlVMTCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIG1lbWNweShib3RoICsgZXhpc3RpbmdfbGVuZ3RoLCBzdHIsIG4pOworICAgYm90aFtleGlzdGluZ19sZW5ndGggKyBuXSA9ICdcMCc7CisKKyAgICpkZXN0ID0gYm90aDsKKyAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wKK3JhbGxvY19zdHJjYXQoY2hhciAqKmRlc3QsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgIHJldHVybiBjYXQoZGVzdCwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK2Jvb2wKK3JhbGxvY19zdHJuY2F0KGNoYXIgKipkZXN0LCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBuKQoreworICAgLyogQ2xhbXAgbiB0byB0aGUgc3RyaW5nIGxlbmd0aCAqLworICAgc2l6ZV90IHN0cl9sZW5ndGggPSBzdHJsZW4oc3RyKTsKKyAgIGlmIChzdHJfbGVuZ3RoIDwgbikKKyAgICAgIG4gPSBzdHJfbGVuZ3RoOworCisgICByZXR1cm4gY2F0KGRlc3QsIHN0ciwgbik7Cit9CisKK2NoYXIgKgorcmFsbG9jX2FzcHJpbnRmKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICBjaGFyICpwdHI7CisgICB2YV9saXN0IGFyZ3M7CisgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgcHRyID0gcmFsbG9jX3Zhc3ByaW50ZihjdHgsIGZtdCwgYXJncyk7CisgICB2YV9lbmQoYXJncyk7CisgICByZXR1cm4gcHRyOworfQorCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGJ5IGEgcHJpbnRmLXN0eWxlCisgKiBmb3JtYXQgYW5kIGFyZ3VtZW50IGxpc3QsIG5vdCBpbmNsdWRpbmcgdGhlIFwwIGJ5dGUuCisgKi8KK3N0YXRpYyBzaXplX3QKK3ByaW50Zl9sZW5ndGgoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHVudG91Y2hlZF9hcmdzKQoreworICAgaW50IHNpemU7CisgICBjaGFyIGp1bms7CisKKyAgIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSB2YV9saXN0IHNvIHRoZSBvcmlnaW5hbCBjYWxsZXIgY2FuIHN0aWxsIHVzZSBpdCAqLworICAgdmFfbGlzdCBhcmdzOworICAgdmFfY29weShhcmdzLCB1bnRvdWNoZWRfYXJncyk7CisKKyNpZmRlZiBfV0lOMzIKKyAgIC8qIFdlIG5lZWQgdG8gdXNlIF92Y3NwcmludGYgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFzIHZzbnByaW50ZiByZXR1cm5zIC0xCisgICAgKiBpZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUgaXMgZ3JlYXRlciB0aGFuIGNvdW50LgorICAgICovCisgICBzaXplID0gX3ZzY3ByaW50ZihmbXQsIGFyZ3MpOworICAgKHZvaWQpanVuazsKKyNlbHNlCisgICBzaXplID0gdnNucHJpbnRmKCZqdW5rLCAxLCBmbXQsIGFyZ3MpOworI2VuZGlmCisgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgdmFfZW5kKGFyZ3MpOworCisgICByZXR1cm4gc2l6ZTsKK30KKworY2hhciAqCityYWxsb2NfdmFzcHJpbnRmKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisgICBzaXplX3Qgc2l6ZSA9IHByaW50Zl9sZW5ndGgoZm10LCBhcmdzKSArIDE7CisKKyAgIGNoYXIgKnB0ciA9IHJhbGxvY19zaXplKGN0eCwgc2l6ZSk7CisgICBpZiAocHRyICE9IE5VTEwpCisgICAgICB2c25wcmludGYocHRyLCBzaXplLCBmbXQsIGFyZ3MpOworCisgICByZXR1cm4gcHRyOworfQorCitib29sCityYWxsb2NfYXNwcmludGZfYXBwZW5kKGNoYXIgKipzdHIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgYm9vbCBzdWNjZXNzOworICAgdmFfbGlzdCBhcmdzOworICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgIHN1Y2Nlc3MgPSByYWxsb2NfdmFzcHJpbnRmX2FwcGVuZChzdHIsIGZtdCwgYXJncyk7CisgICB2YV9lbmQoYXJncyk7CisgICByZXR1cm4gc3VjY2VzczsKK30KKworYm9vbAorcmFsbG9jX3Zhc3ByaW50Zl9hcHBlbmQoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisgICBzaXplX3QgZXhpc3RpbmdfbGVuZ3RoOworICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgIGV4aXN0aW5nX2xlbmd0aCA9ICpzdHIgPyBzdHJsZW4oKnN0cikgOiAwOworICAgcmV0dXJuIHJhbGxvY192YXNwcmludGZfcmV3cml0ZV90YWlsKHN0ciwgJmV4aXN0aW5nX2xlbmd0aCwgZm10LCBhcmdzKTsKK30KKworYm9vbAorcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbChjaGFyICoqc3RyLCBzaXplX3QgKnN0YXJ0LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgIGJvb2wgc3VjY2VzczsKKyAgIHZhX2xpc3QgYXJnczsKKyAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICBzdWNjZXNzID0gcmFsbG9jX3Zhc3ByaW50Zl9yZXdyaXRlX3RhaWwoc3RyLCBzdGFydCwgZm10LCBhcmdzKTsKKyAgIHZhX2VuZChhcmdzKTsKKyAgIHJldHVybiBzdWNjZXNzOworfQorCitib29sCityYWxsb2NfdmFzcHJpbnRmX3Jld3JpdGVfdGFpbChjaGFyICoqc3RyLCBzaXplX3QgKnN0YXJ0LCBjb25zdCBjaGFyICpmbXQsCisJCQkgICAgICB2YV9saXN0IGFyZ3MpCit7CisgICBzaXplX3QgbmV3X2xlbmd0aDsKKyAgIGNoYXIgKnB0cjsKKworICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKworICAgaWYgKHVubGlrZWx5KCpzdHIgPT0gTlVMTCkpIHsKKyAgICAgIC8vIEFzc3VtaW5nIGEgTlVMTCBjb250ZXh0IGlzIHByb2JhYmx5IGJhZCwgYnV0IGl0J3MgZXhwZWN0ZWQgYmVoYXZpb3IuCisgICAgICAqc3RyID0gcmFsbG9jX3Zhc3ByaW50ZihOVUxMLCBmbXQsIGFyZ3MpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIG5ld19sZW5ndGggPSBwcmludGZfbGVuZ3RoKGZtdCwgYXJncyk7CisKKyAgIHB0ciA9IHJlc2l6ZSgqc3RyLCAqc3RhcnQgKyBuZXdfbGVuZ3RoICsgMSk7CisgICBpZiAodW5saWtlbHkocHRyID09IE5VTEwpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICB2c25wcmludGYocHRyICsgKnN0YXJ0LCBuZXdfbGVuZ3RoICsgMSwgZm10LCBhcmdzKTsKKyAgICpzdHIgPSBwdHI7CisgICAqc3RhcnQgKz0gbmV3X2xlbmd0aDsKKyAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvcmFsbG9jLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9yYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTgxYTdhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvcmFsbG9jLmgKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHJhbGxvYy5oCisgKgorICogcmFsbG9jOiBhIHJlY3Vyc2l2ZSBtZW1vcnkgYWxsb2NhdG9yCisgKgorICogVGhlIHJhbGxvYyBtZW1vcnkgYWxsb2NhdG9yIGNyZWF0ZXMgYSBoaWVyYXJjaHkgb2YgYWxsb2NhdGVkCisgKiBvYmplY3RzLiBFdmVyeSBhbGxvY2F0aW9uIGlzIGluIHJlZmVyZW5jZSB0byBzb21lIHBhcmVudCwgYW5kCisgKiBldmVyeSBhbGxvY2F0ZWQgb2JqZWN0IGNhbiBpbiB0dXJuIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBvZiBhCisgKiBzdWJzZXF1ZW50IGFsbG9jYXRpb24uIFRoaXMgYWxsb3dzIGZvciBleHRyZW1lbHkgY29udmVuaWVudAorICogZGlzY2FyZGluZyBvZiBhbiBlbnRpcmUgdHJlZS9zdWItdHJlZSBvZiBhbGxvY2F0aW9ucyBieSBjYWxsaW5nCisgKiByYWxsb2NfZnJlZSBvbiBhbnkgcGFydGljdWxhciBvYmplY3QgdG8gZnJlZSBpdCBhbmQgYWxsIG9mIGl0cworICogY2hpbGRyZW4uCisgKgorICogVGhlIGNvbmNlcHR1YWwgd29ya2luZyBvZiByYWxsb2Mgd2FzIGRpcmVjdGx5IGluc3BpcmVkIGJ5IEFuZHJldworICogVHJpZGdlbGwncyB0YWxsb2MsIGJ1dCByYWxsb2MgaXMgYW4gaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24KKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBhbmQgdHVuZWQgZm9yIE1lc2EuCisgKgorICogVGhlIHRhbGxvYyBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBMZXNzZXIKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdOVSBMR1BMKSwgdmVyc2lvbiAzIG9yIGxhdGVyLiBJdCBpcworICogbW9yZSBzb3BoaXN0aWNhdGVkIHRoYW4gcmFsbG9jIGluIHRoYXQgaXQgaW5jbHVkZXMgcmVmZXJlbmNlCisgKiBjb3VudGluZyBhbmQgZGVidWdnaW5nIGZlYXR1cmVzLiBTZWU6IGh0dHA6Ly90YWxsb2Muc2FtYmEub3JnLworICovCisKKyNpZm5kZWYgUkFMTE9DX0gKKyNkZWZpbmUgUkFMTE9DX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgIm1haW4vY29tcGlsZXIuaCIKKworLyoqCisgKiBcZGVmIHJhbGxvYyhjdHgsIHR5cGUpCisgKiBBbGxvY2F0ZSBhIG5ldyBvYmplY3QgY2hhaW5lZCBvZmYgb2YgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvOgorICogXGNvZGUKKyAqICgodHlwZSAqKSByYWxsb2Nfc2l6ZShjdHgsIHNpemVvZih0eXBlKSkKKyAqIFxlbmRjb2RlCisgKi8KKyNkZWZpbmUgcmFsbG9jKGN0eCwgdHlwZSkgICgodHlwZSAqKSByYWxsb2Nfc2l6ZShjdHgsIHNpemVvZih0eXBlKSkpCisKKy8qKgorICogXGRlZiByemFsbG9jKGN0eCwgdHlwZSkKKyAqIEFsbG9jYXRlIGEgbmV3IG9iamVjdCBvdXQgb2YgdGhlIGdpdmVuIGNvbnRleHQgYW5kIGluaXRpYWxpemUgaXQgdG8gemVyby4KKyAqCisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG86CisgKiBcY29kZQorICogKCh0eXBlICopIHJ6YWxsb2Nfc2l6ZShjdHgsIHNpemVvZih0eXBlKSkKKyAqIFxlbmRjb2RlCisgKi8KKyNkZWZpbmUgcnphbGxvYyhjdHgsIHR5cGUpICgodHlwZSAqKSByemFsbG9jX3NpemUoY3R4LCBzaXplb2YodHlwZSkpKQorCisvKioKKyAqIEFsbG9jYXRlIGEgbmV3IHJhbGxvYyBjb250ZXh0LgorICoKKyAqIFdoaWxlIGFueSByYWxsb2MnZCBwb2ludGVyIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCwgc29tZXRpbWVzIGl0IGlzIHVzZWZ1bAorICogdG8gc2ltcGx5IGFsbG9jYXRlIGEgY29udGV4dCB3aXRoIG5vIGFzc29jaWF0ZWQgbWVtb3J5LgorICoKKyAqIEl0IGlzIGVxdWl2YWxlbnQgdG86CisgKiBcY29kZQorICogKCh0eXBlICopIHJhbGxvY19zaXplKGN0eCwgMCkKKyAqIFxlbmRjb2RlCisgKi8KK3ZvaWQgKnJhbGxvY19jb250ZXh0KGNvbnN0IHZvaWQgKmN0eCk7CisKKy8qKgorICogQWxsb2NhdGUgbWVtb3J5IGNoYWluZWQgb2ZmIG9mIHRoZSBnaXZlbiBjb250ZXh0LgorICoKKyAqIFRoaXMgaXMgdGhlIGNvcmUgYWxsb2NhdGlvbiByb3V0aW5lIHdoaWNoIGlzIHVzZWQgYnkgYWxsIG90aGVycy4gIEl0CisgKiBzaW1wbHkgYWxsb2NhdGVzIHN0b3JhZ2UgZm9yIFxwIHNpemUgYnl0ZXMgYW5kIHJldHVybnMgdGhlIHBvaW50ZXIsCisgKiBzaW1pbGFyIHRvIFxjIG1hbGxvYy4KKyAqLwordm9pZCAqcmFsbG9jX3NpemUoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogQWxsb2NhdGUgemVyby1pbml0aWFsaXplZCBtZW1vcnkgY2hhaW5lZCBvZmYgb2YgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIFxjIGNhbGxvYyB3aXRoIGEgc2l6ZSBvZiAxLgorICovCit2b2lkICpyemFsbG9jX3NpemUoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogUmVzaXplIGEgcGllY2Ugb2YgcmFsbG9jLW1hbmFnZWQgbWVtb3J5LCBwcmVzZXJ2aW5nIGRhdGEuCisgKgorICogU2ltaWxhciB0byBcYyByZWFsbG9jLiAgVW5saWtlIEM4OSwgcGFzc2luZyAwIGZvciBccCBzaXplIGRvZXMgbm90IGZyZWUgdGhlCisgKiBtZW1vcnkuICBJbnN0ZWFkLCBpdCByZXNpemVzIGl0IHRvIGEgMC1ieXRlIHJhbGxvYyBjb250ZXh0LCBqdXN0IGxpa2UKKyAqIGNhbGxpbmcgcmFsbG9jX3NpemUoY3R4LCAwKS4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGFsbG9jLgorICoKKyAqIFxwYXJhbSBjdHggIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmV3IGFsbG9jYXRpb24uICBJZiBccCBwdHIgIT0gTlVMTCwKKyAqICAgICAgICAgICAgIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgcmFsbG9jX3BhcmVudChccCBwdHIpLgorICogXHBhcmFtIHB0ciAgUG9pbnRlciB0byB0aGUgbWVtb3J5IHRvIGJlIHJlc2l6ZWQuICBNYXkgYmUgTlVMTC4KKyAqIFxwYXJhbSBzaXplIFRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLCBpbiBieXRlcy4KKyAqLwordm9pZCAqcmVyYWxsb2Nfc2l6ZShjb25zdCB2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworCisvLy8gXGRlZmdyb3VwIGFycmF5IEFycmF5IEFsbG9jYXRvcnMgQHsKKworLyoqCisgKiBcZGVmIHJhbGxvY19hcnJheShjdHgsIHR5cGUsIGNvdW50KQorICogQWxsb2NhdGUgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjaGFpbmVkIG9mZiB0aGUgZ2l2ZW4gY29udGV4dC4KKyAqCisgKiBTaW1pbGFyIHRvIFxjIGNhbGxvYywgYnV0IGRvZXMgbm90IGluaXRpYWxpemUgdGhlIG1lbW9yeSB0byB6ZXJvLgorICoKKyAqIE1vcmUgdGhhbiBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCB0aGlzIGFsc28gY2hlY2tzIGZvciBpbnRlZ2VyIG92ZXJmbG93IHdoZW4KKyAqIG11bHRpcGx5aW5nIFxjIHNpemVvZih0eXBlKSBhbmQgXHAgY291bnQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2VjdXJpdHkuCisgKgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvOgorICogXGNvZGUKKyAqICgodHlwZSAqKSByYWxsb2NfYXJyYXlfc2l6ZShjdHgsIHNpemVvZih0eXBlKSwgY291bnQpCisgKiBcZW5kY29kZQorICovCisjZGVmaW5lIHJhbGxvY19hcnJheShjdHgsIHR5cGUsIGNvdW50KSBcCisgICAoKHR5cGUgKikgcmFsbG9jX2FycmF5X3NpemUoY3R4LCBzaXplb2YodHlwZSksIGNvdW50KSkKKworLyoqCisgKiBcZGVmIHJ6YWxsb2NfYXJyYXkoY3R4LCB0eXBlLCBjb3VudCkKKyAqIEFsbG9jYXRlIGEgemVyby1pbml0aWFsaXplZCBhcnJheSBjaGFpbmVkIG9mZiB0aGUgZ2l2ZW4gY29udGV4dC4KKyAqCisgKiBTaW1pbGFyIHRvIFxjIGNhbGxvYy4KKyAqCisgKiBNb3JlIHRoYW4gYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgdGhpcyBhbHNvIGNoZWNrcyBmb3IgaW50ZWdlciBvdmVyZmxvdyB3aGVuCisgKiBtdWx0aXBseWluZyBcYyBzaXplb2YodHlwZSkgYW5kIFxwIGNvdW50LiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHNlY3VyaXR5LgorICoKKyAqIFRoaXMgaXMgZXF1aXZhbGVudCB0bzoKKyAqIFxjb2RlCisgKiAoKHR5cGUgKikgcnphbGxvY19hcnJheV9zaXplKGN0eCwgc2l6ZW9mKHR5cGUpLCBjb3VudCkKKyAqIFxlbmRjb2RlCisgKi8KKyNkZWZpbmUgcnphbGxvY19hcnJheShjdHgsIHR5cGUsIGNvdW50KSBcCisgICAoKHR5cGUgKikgcnphbGxvY19hcnJheV9zaXplKGN0eCwgc2l6ZW9mKHR5cGUpLCBjb3VudCkpCisKKy8qKgorICogXGRlZiByZXJhbGxvYyhjdHgsIHB0ciwgdHlwZSwgY291bnQpCisgKiBSZXNpemUgYSByYWxsb2MtbWFuYWdlZCBhcnJheSwgcHJlc2VydmluZyBkYXRhLgorICoKKyAqIFNpbWlsYXIgdG8gXGMgcmVhbGxvYy4gIFVubGlrZSBDODksIHBhc3NpbmcgMCBmb3IgXHAgc2l6ZSBkb2VzIG5vdCBmcmVlIHRoZQorICogbWVtb3J5LiAgSW5zdGVhZCwgaXQgcmVzaXplcyBpdCB0byBhIDAtYnl0ZSByYWxsb2MgY29udGV4dCwganVzdCBsaWtlCisgKiBjYWxsaW5nIHJhbGxvY19zaXplKGN0eCwgMCkuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRhbGxvYy4KKyAqCisgKiBNb3JlIHRoYW4gYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgdGhpcyBhbHNvIGNoZWNrcyBmb3IgaW50ZWdlciBvdmVyZmxvdyB3aGVuCisgKiBtdWx0aXBseWluZyBcYyBzaXplb2YodHlwZSkgYW5kIFxwIGNvdW50LiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHNlY3VyaXR5LgorICoKKyAqIFxwYXJhbSBjdHggICBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5ldyBhbGxvY2F0aW9uLiAgSWYgXHAgcHRyICE9IE5VTEwsCisgKiAgICAgICAgICAgICAgaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyByYWxsb2NfcGFyZW50KFxwIHB0cikuCisgKiBccGFyYW0gcHRyICAgUG9pbnRlciB0byB0aGUgYXJyYXkgdG8gYmUgcmVzaXplZC4gIE1heSBiZSBOVUxMLgorICogXHBhcmFtIHR5cGUgIFRoZSBlbGVtZW50IHR5cGUuCisgKiBccGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhbGxvY2F0ZS4KKyAqLworI2RlZmluZSByZXJhbGxvYyhjdHgsIHB0ciwgdHlwZSwgY291bnQpIFwKKyAgICgodHlwZSAqKSByZXJhbGxvY19hcnJheV9zaXplKGN0eCwgcHRyLCBzaXplb2YodHlwZSksIGNvdW50KSkKKworLyoqCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5IGNoYWluZWQgb2ZmIHRoZSBnaXZlbiBjb250ZXh0LgorICoKKyAqIFNpbWlsYXIgdG8gXGMgY2FsbG9jLCBidXQgZG9lcyBub3QgaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IHRvIHplcm8uCisgKgorICogTW9yZSB0aGFuIGEgY29udmVuaWVuY2UgZnVuY3Rpb24sIHRoaXMgYWxzbyBjaGVja3MgZm9yIGludGVnZXIgb3ZlcmZsb3cgd2hlbgorICogbXVsdGlwbHlpbmcgXHAgc2l6ZSBhbmQgXHAgY291bnQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2VjdXJpdHkuCisgKi8KK3ZvaWQgKnJhbGxvY19hcnJheV9zaXplKGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGNvdW50KTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIHplcm8taW5pdGlhbGl6ZWQgYXJyYXkgY2hhaW5lZCBvZmYgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogU2ltaWxhciB0byBcYyBjYWxsb2MuCisgKgorICogTW9yZSB0aGFuIGEgY29udmVuaWVuY2UgZnVuY3Rpb24sIHRoaXMgYWxzbyBjaGVja3MgZm9yIGludGVnZXIgb3ZlcmZsb3cgd2hlbgorICogbXVsdGlwbHlpbmcgXHAgc2l6ZSBhbmQgXHAgY291bnQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2VjdXJpdHkuCisgKi8KK3ZvaWQgKnJ6YWxsb2NfYXJyYXlfc2l6ZShjb25zdCB2b2lkICpjdHgsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBjb3VudCk7CisKKy8qKgorICogUmVzaXplIGEgcmFsbG9jLW1hbmFnZWQgYXJyYXksIHByZXNlcnZpbmcgZGF0YS4KKyAqCisgKiBTaW1pbGFyIHRvIFxjIHJlYWxsb2MuICBVbmxpa2UgQzg5LCBwYXNzaW5nIDAgZm9yIFxwIHNpemUgZG9lcyBub3QgZnJlZSB0aGUKKyAqIG1lbW9yeS4gIEluc3RlYWQsIGl0IHJlc2l6ZXMgaXQgdG8gYSAwLWJ5dGUgcmFsbG9jIGNvbnRleHQsIGp1c3QgbGlrZQorICogY2FsbGluZyByYWxsb2Nfc2l6ZShjdHgsIDApLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0YWxsb2MuCisgKgorICogTW9yZSB0aGFuIGEgY29udmVuaWVuY2UgZnVuY3Rpb24sIHRoaXMgYWxzbyBjaGVja3MgZm9yIGludGVnZXIgb3ZlcmZsb3cgd2hlbgorICogbXVsdGlwbHlpbmcgXGMgc2l6ZW9mKHR5cGUpIGFuZCBccCBjb3VudC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzZWN1cml0eS4KKyAqCisgKiBccGFyYW0gY3R4ICAgVGhlIGNvbnRleHQgdG8gdXNlIGZvciBuZXcgYWxsb2NhdGlvbi4gIElmIFxwIHB0ciAhPSBOVUxMLAorICogICAgICAgICAgICAgIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgcmFsbG9jX3BhcmVudChccCBwdHIpLgorICogXHBhcmFtIHB0ciAgIFBvaW50ZXIgdG8gdGhlIGFycmF5IHRvIGJlIHJlc2l6ZWQuICBNYXkgYmUgTlVMTC4KKyAqIFxwYXJhbSBzaXplICBUaGUgc2l6ZSBvZiBhbiBpbmRpdmlkdWFsIGVsZW1lbnQuCisgKiBccGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhbGxvY2F0ZS4KKyAqCisgKiBccmV0dXJuIFRydWUgdW5sZXNzIGFsbG9jYXRpb24gZmFpbGVkLgorICovCit2b2lkICpyZXJhbGxvY19hcnJheV9zaXplKGNvbnN0IHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgdW5zaWduZWQgY291bnQpOworLy8vIEB9CisKKy8qKgorICogRnJlZSBhIHBpZWNlIG9mIHJhbGxvYy1tYW5hZ2VkIG1lbW9yeS4KKyAqCisgKiBUaGlzIHdpbGwgYWxzbyBmcmVlIHRoZSBtZW1vcnkgb2YgYW55IGNoaWxkcmVuIGFsbG9jYXRlZCB0aGlzIGNvbnRleHQuCisgKi8KK3ZvaWQgcmFsbG9jX2ZyZWUodm9pZCAqcHRyKTsKKworLyoqCisgKiAiU3RlYWwiIG1lbW9yeSBmcm9tIG9uZSBjb250ZXh0LCBjaGFuZ2luZyBpdCB0byBhbm90aGVyLgorICoKKyAqIFRoaXMgY2hhbmdlcyBccCBwdHIncyBjb250ZXh0IHRvIFxwIG5ld19jdHguICBUaGlzIGlzIHF1aXRlIHVzZWZ1bCBpZgorICogbWVtb3J5IGlzIGFsbG9jYXRlZCBvdXQgb2YgYSB0ZW1wb3JhcnkgY29udGV4dC4KKyAqLwordm9pZCByYWxsb2Nfc3RlYWwoY29uc3Qgdm9pZCAqbmV3X2N0eCwgdm9pZCAqcHRyKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGdpdmVuIHBvaW50ZXIncyByYWxsb2MgY29udGV4dC4KKyAqLwordm9pZCAqcmFsbG9jX3BhcmVudChjb25zdCB2b2lkICpwdHIpOworCisvKioKKyAqIFJldHVybiBhIGNvbnRleHQgd2hvc2UgbWVtb3J5IHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCBhdCBwcm9ncmFtIGV4aXQuCisgKgorICogVGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgY29udGV4dCBhbmQgcmVnaXN0ZXJzIGEgaGFuZGxlcgorICogdG8gZnJlZSBpdCB1c2luZyBcYyBhdGV4aXQuICBUaGlzIG1heSBjYXVzZSB0cm91YmxlIGlmIHVzZWQgaW4gYSBsaWJyYXJ5CisgKiBsb2FkZWQgd2l0aCBcYyBkbG9wZW4uCisgKi8KK3ZvaWQgKnJhbGxvY19hdXRvZnJlZV9jb250ZXh0KHZvaWQpOworCisvKioKKyAqIFNldCBhIGNhbGxiYWNrIHRvIG9jY3VyIGp1c3QgYmVmb3JlIGFuIG9iamVjdCBpcyBmcmVlZC4KKyAqLwordm9pZCByYWxsb2Nfc2V0X2Rlc3RydWN0b3IoY29uc3Qgdm9pZCAqcHRyLCB2b2lkKCpkZXN0cnVjdG9yKSh2b2lkICopKTsKKworLy8vIFxkZWZncm91cCBhcnJheSBTdHJpbmcgRnVuY3Rpb25zIEB7CisvKioKKyAqIER1cGxpY2F0ZSBhIHN0cmluZywgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGZyb20gdGhlIGdpdmVuIGNvbnRleHQuCisgKi8KK2NoYXIgKnJhbGxvY19zdHJkdXAoY29uc3Qgdm9pZCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOworCisvKioKKyAqIER1cGxpY2F0ZSBhIHN0cmluZywgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGZyb20gdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogTGlrZSBcYyBzdHJuZHVwLCBhdCBtb3N0IFxwIG4gY2hhcmFjdGVycyBhcmUgY29waWVkLiAgSWYgXHAgc3RyIGlzIGxvbmdlcgorICogdGhhbiBccCBuIGNoYXJhY3RlcnMsIFxwIG4gYXJlIGNvcGllZCwgYW5kIGEgdGVybWluaW5nIFxjICdcMCcgYnl0ZSBpcyBhZGRlZC4KKyAqLworY2hhciAqcmFsbG9jX3N0cm5kdXAoY29uc3Qgdm9pZCAqY3R4LCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBuKTsKKworLyoqCisgKiBDb25jYXRlbmF0ZSB0d28gc3RyaW5ncywgYWxsb2NhdGluZyB0aGUgbmVjZXNzYXJ5IHNwYWNlLgorICoKKyAqIFRoaXMgYXBwZW5kcyBccCBzdHIgdG8gXHAgKmRlc3QsIHNpbWlsYXIgdG8gXGMgc3RyY2F0LCB1c2luZyByYWxsb2NfcmVzaXplCisgKiB0byBleHBhbmQgXHAgKmRlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIHNpemUuICBccCBkZXN0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUKKyAqIG5ldyBwb2ludGVyIHVubGVzcyBhbGxvY2F0aW9uIGZhaWxzLgorICoKKyAqIFRoZSByZXN1bHQgd2lsbCBhbHdheXMgYmUgbnVsbC10ZXJtaW5hdGVkLgorICoKKyAqIFxyZXR1cm4gVHJ1ZSB1bmxlc3MgYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK2Jvb2wgcmFsbG9jX3N0cmNhdChjaGFyICoqZGVzdCwgY29uc3QgY2hhciAqc3RyKTsKKworLyoqCisgKiBDb25jYXRlbmF0ZSB0d28gc3RyaW5ncywgYWxsb2NhdGluZyB0aGUgbmVjZXNzYXJ5IHNwYWNlLgorICoKKyAqIFRoaXMgYXBwZW5kcyBhdCBtb3N0IFxwIG4gYnl0ZXMgb2YgXHAgc3RyIHRvIFxwICpkZXN0LCB1c2luZyByYWxsb2NfcmVzaXplCisgKiB0byBleHBhbmQgXHAgKmRlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIHNpemUuICBccCBkZXN0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUKKyAqIG5ldyBwb2ludGVyIHVubGVzcyBhbGxvY2F0aW9uIGZhaWxzLgorICoKKyAqIFRoZSByZXN1bHQgd2lsbCBhbHdheXMgYmUgbnVsbC10ZXJtaW5hdGVkOyBccCBzdHIgZG9lcyBub3QgbmVlZCB0byBiZSBudWxsCisgKiB0ZXJtaW5hdGVkIGlmIGl0IGlzIGxvbmdlciB0aGFuIFxwIG4uCisgKgorICogXHJldHVybiBUcnVlIHVubGVzcyBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqLworYm9vbCByYWxsb2Nfc3RybmNhdChjaGFyICoqZGVzdCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3Qgbik7CisKKy8qKgorICogUHJpbnQgdG8gYSBzdHJpbmcuCisgKgorICogVGhpcyBpcyBhbmFsb2dvdXMgdG8gXGMgc3ByaW50ZiwgYnV0IGFsbG9jYXRlcyBlbm91Z2ggc3BhY2UgKHVzaW5nIFxwIGN0eAorICogYXMgdGhlIGNvbnRleHQpIGZvciB0aGUgcmVzdWx0aW5nIHN0cmluZy4KKyAqCisgKiBccmV0dXJuIFRoZSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nLgorICovCitjaGFyICpyYWxsb2NfYXNwcmludGYgKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URkxJS0UoMiwgMyk7CisKKy8qKgorICogUHJpbnQgdG8gYSBzdHJpbmcsIGdpdmVuIGEgdmFfbGlzdC4KKyAqCisgKiBUaGlzIGlzIGFuYWxvZ291cyB0byBcYyB2c3ByaW50ZiwgYnV0IGFsbG9jYXRlcyBlbm91Z2ggc3BhY2UgKHVzaW5nIFxwIGN0eAorICogYXMgdGhlIGNvbnRleHQpIGZvciB0aGUgcmVzdWx0aW5nIHN0cmluZy4KKyAqCisgKiBccmV0dXJuIFRoZSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nLgorICovCitjaGFyICpyYWxsb2NfdmFzcHJpbnRmKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOworCisvKioKKyAqIFJld3JpdGUgdGhlIHRhaWwgb2YgYW4gZXhpc3Rpbmcgc3RyaW5nLCBzdGFydGluZyBhdCBhIGdpdmVuIGluZGV4LgorICoKKyAqIE92ZXJ3cml0ZXMgdGhlIGNvbnRlbnRzIG9mICpzdHIgc3RhcnRpbmcgYXQgXHAgc3RhcnQgd2l0aCBuZXdseSBmb3JtYXR0ZWQKKyAqIHRleHQsIGluY2x1ZGluZyBhIG5ldyBudWxsLXRlcm1pbmF0b3IuICBBbGxvY2F0ZXMgbW9yZSBtZW1vcnkgYXMgbmVjZXNzYXJ5LgorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXBwZW5kIGZvcm1hdHRlZCB0ZXh0IHdoZW4gdGhlIGxlbmd0aCBvZiB0aGUgZXhpc3RpbmcKKyAqIHN0cmluZyBpcyBhbHJlYWR5IGtub3duLCBzYXZpbmcgYSBzdHJsZW4oKSBjYWxsLgorICoKKyAqIFxzYSByYWxsb2NfYXNwcmludGZfYXBwZW5kCisgKgorICogXHBhcmFtIHN0ciAgIFRoZSBzdHJpbmcgdG8gYmUgdXBkYXRlZC4KKyAqIFxwYXJhbSBzdGFydCBUaGUgaW5kZXggdG8gc3RhcnQgYXBwZW5kaW5nIG5ldyBkYXRhIGF0LgorICogXHBhcmFtIGZtdCAgIEEgcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgc3RyaW5nCisgKgorICogXHAgc3RyIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgbmV3IHBvaW50ZXIgdW5sZXNzIGFsbG9jYXRpb24gZmFpbHMuCisgKiBccCBzdGFydCB3aWxsIGJlIGluY3JlYXNlZCBieSB0aGUgbGVuZ3RoIG9mIHRoZSBuZXdseSBmb3JtYXR0ZWQgdGV4dC4KKyAqCisgKiBccmV0dXJuIFRydWUgdW5sZXNzIGFsbG9jYXRpb24gZmFpbGVkLgorICovCitib29sIHJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwoY2hhciAqKnN0ciwgc2l6ZV90ICpzdGFydCwKKwkJCQkgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCQkJCSAgUFJJTlRGTElLRSgzLCA0KTsKKworLyoqCisgKiBSZXdyaXRlIHRoZSB0YWlsIG9mIGFuIGV4aXN0aW5nIHN0cmluZywgc3RhcnRpbmcgYXQgYSBnaXZlbiBpbmRleC4KKyAqCisgKiBPdmVyd3JpdGVzIHRoZSBjb250ZW50cyBvZiAqc3RyIHN0YXJ0aW5nIGF0IFxwIHN0YXJ0IHdpdGggbmV3bHkgZm9ybWF0dGVkCisgKiB0ZXh0LCBpbmNsdWRpbmcgYSBuZXcgbnVsbC10ZXJtaW5hdG9yLiAgQWxsb2NhdGVzIG1vcmUgbWVtb3J5IGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFwcGVuZCBmb3JtYXR0ZWQgdGV4dCB3aGVuIHRoZSBsZW5ndGggb2YgdGhlIGV4aXN0aW5nCisgKiBzdHJpbmcgaXMgYWxyZWFkeSBrbm93biwgc2F2aW5nIGEgc3RybGVuKCkgY2FsbC4KKyAqCisgKiBcc2EgcmFsbG9jX3Zhc3ByaW50Zl9hcHBlbmQKKyAqCisgKiBccGFyYW0gc3RyICAgVGhlIHN0cmluZyB0byBiZSB1cGRhdGVkLgorICogXHBhcmFtIHN0YXJ0IFRoZSBpbmRleCB0byBzdGFydCBhcHBlbmRpbmcgbmV3IGRhdGEgYXQuCisgKiBccGFyYW0gZm10ICAgQSBwcmludGYtc3R5bGUgZm9ybWF0dGluZyBzdHJpbmcKKyAqIFxwYXJhbSBhcmdzICBBIHZhX2xpc3QgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBmb3JtYXR0ZWQKKyAqCisgKiBccCBzdHIgd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBuZXcgcG9pbnRlciB1bmxlc3MgYWxsb2NhdGlvbiBmYWlscy4KKyAqIFxwIHN0YXJ0IHdpbGwgYmUgaW5jcmVhc2VkIGJ5IHRoZSBsZW5ndGggb2YgdGhlIG5ld2x5IGZvcm1hdHRlZCB0ZXh0LgorICoKKyAqIFxyZXR1cm4gVHJ1ZSB1bmxlc3MgYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK2Jvb2wgcmFsbG9jX3Zhc3ByaW50Zl9yZXdyaXRlX3RhaWwoY2hhciAqKnN0ciwgc2l6ZV90ICpzdGFydCwgY29uc3QgY2hhciAqZm10LAorCQkJCSAgIHZhX2xpc3QgYXJncyk7CisKKy8qKgorICogQXBwZW5kIGZvcm1hdHRlZCB0ZXh0IHRvIHRoZSBzdXBwbGllZCBzdHJpbmcuCisgKgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgKiBcY29kZQorICogcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbChzdHIsIHN0cmxlbigqc3RyKSwgZm10LCAuLi4pCisgKiBcZW5kY29kZQorICoKKyAqIFxzYSByYWxsb2NfYXNwcmludGYKKyAqIFxzYSByYWxsb2NfYXNwcmludGZfcmV3cml0ZV90YWlsCisgKiBcc2EgcmFsbG9jX3N0cmNhdAorICoKKyAqIFxwIHN0ciB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIG5ldyBwb2ludGVyIHVubGVzcyBhbGxvY2F0aW9uIGZhaWxzLgorICoKKyAqIFxyZXR1cm4gVHJ1ZSB1bmxlc3MgYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK2Jvb2wgcmFsbG9jX2FzcHJpbnRmX2FwcGVuZCAoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJCQkgICAgIFBSSU5URkxJS0UoMiwgMyk7CisKKy8qKgorICogQXBwZW5kIGZvcm1hdHRlZCB0ZXh0IHRvIHRoZSBzdXBwbGllZCBzdHJpbmcsIGdpdmVuIGEgdmFfbGlzdC4KKyAqCisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAqIFxjb2RlCisgKiByYWxsb2NfdmFzcHJpbnRmX3Jld3JpdGVfdGFpbChzdHIsIHN0cmxlbigqc3RyKSwgZm10LCBhcmdzKQorICogXGVuZGNvZGUKKyAqCisgKiBcc2EgcmFsbG9jX3Zhc3ByaW50ZgorICogXHNhIHJhbGxvY192YXNwcmludGZfcmV3cml0ZV90YWlsCisgKiBcc2EgcmFsbG9jX3N0cmNhdAorICoKKyAqIFxwIHN0ciB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIG5ldyBwb2ludGVyIHVubGVzcyBhbGxvY2F0aW9uIGZhaWxzLgorICoKKyAqIFxyZXR1cm4gVHJ1ZSB1bmxlc3MgYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK2Jvb2wgcmFsbG9jX3Zhc3ByaW50Zl9hcHBlbmQoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOworLy8vIEB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgb2YgZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKy8qKgorICogRGVjbGFyZSBDKysgbmV3IGFuZCBkZWxldGUgb3BlcmF0b3JzIHdoaWNoIHVzZSByYWxsb2MuCisgKgorICogUGxhY2luZyB0aGlzIG1hY3JvIGluIHRoZSBib2R5IG9mIGEgY2xhc3MgbWFrZXMgaXQgcG9zc2libGUgdG8gZG86CisgKgorICogVFlQRSAqdmFyID0gbmV3KG1lbV9jdHgpIFRZUEUoLi4uKTsKKyAqIGRlbGV0ZSB2YXI7CisgKgorICogd2hpY2ggaXMgbW9yZSBpZGlvbWF0aWMgaW4gQysrIHRoYW4gY2FsbGluZyByYWxsb2MuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9SQUxMT0NfQ1hYX09QRVJBVE9SUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgc3RhdGljIHZvaWQgX3JhbGxvY19kZXN0cnVjdG9yKHZvaWQgKnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZWludGVycHJldF9jYXN0PFRZUEUgKj4ocCktPn5UWVBFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBzdGF0aWMgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCB2b2lkICptZW1fY3R4KSAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHZvaWQgKnAgPSByYWxsb2Nfc2l6ZShtZW1fY3R4LCBzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhc3NlcnQocCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKCFIQVNfVFJJVklBTF9ERVNUUlVDVE9SKFRZUEUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHJhbGxvY19zZXRfZGVzdHJ1Y3RvcihwLCBfcmFsbG9jX2Rlc3RydWN0b3IpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC8qIFRoZSBvYmplY3QncyBkZXN0cnVjdG9yIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gICAgICBcCisgICAgICAgKiBjYWxsZWQgYnkgdGhlIGRlbGV0ZSBvcGVyYXRvciBhdCB0aGlzIHBvaW50IC0tIE1ha2Ugc3VyZSBpdCdzICAgXAorICAgICAgICogbm90IGNhbGxlZCBhZ2Fpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoIUhBU19UUklWSUFMX0RFU1RSVUNUT1IoVFlQRSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgcmFsbG9jX3NldF9kZXN0cnVjdG9yKHAsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJhbGxvY19mcmVlKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC90aHJlYWRwb29sLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC90aHJlYWRwb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhOGVhOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL3RocmVhZHBvb2wuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgTHVuYXJHLCBJbmMuICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBUSFJFQURQT09MX0gKKyNkZWZpbmUgVEhSRUFEUE9PTF9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IF9tZXNhX3RocmVhZHBvb2w7CitzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrOworCitzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqCitfbWVzYV90aHJlYWRwb29sX2NyZWF0ZShpbnQgbWF4X3RocmVhZHMpOworCitzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqCitfbWVzYV90aHJlYWRwb29sX3JlZihzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCk7CisKK3ZvaWQKK19tZXNhX3RocmVhZHBvb2xfdW5yZWYoc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wpOworCit2b2lkCitfbWVzYV90aHJlYWRwb29sX2pvaW4oc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wsIGJvb2wgZ3JhY2VmdWwpOworCitzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICoKK19tZXNhX3RocmVhZHBvb2xfcXVldWVfdGFzayhzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSk7CisKK2Jvb2wKK19tZXNhX3RocmVhZHBvb2xfY29tcGxldGVfdGFza3Moc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2sgKip0YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV90YXNrcyk7CisKK2Jvb2wKK19tZXNhX3RocmVhZHBvb2xfY29tcGxldGVfdGFzayhzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICp0YXNrKTsKKworc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKgorX21lc2FfZ2xzbF9nZXRfdGhyZWFkcG9vbChpbnQgbWF4X3RocmVhZHMpOworCit2b2lkCitfbWVzYV9nbHNsX3dhaXRfdGhyZWFkcG9vbCh2b2lkKTsKKwordm9pZAorX21lc2FfZ2xzbF9kZXN0cm95X3RocmVhZHBvb2wodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBUSFJFQURQT09MX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tYXBpL2dsYXBpL2dsYXBpLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWFwaS9nbGFwaS9nbGFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZmE5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWFwaS9nbGFwaS9nbGFwaS5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworLyoqCisgKiBcbWFpbnBhZ2UgTWVzYSBHTCBBUEkgTW9kdWxlCisgKgorICogXHNlY3Rpb24gR0xBUElJbnRyb2R1Y3Rpb24gSW50cm9kdWN0aW9uCisgKgorICogVGhlIE1lc2EgR0wgQVBJIG1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IgZGlzcGF0Y2hpbmcgYWxsIHRoZQorICogZ2wqKCkgZnVuY3Rpb25zLiAgQWxsIEdMIGZ1bmN0aW9ucyBhcmUgZGlzcGF0Y2hlZCBieSBqdW1waW5nIHRocm91Z2gKKyAqIHRoZSBjdXJyZW50IGRpc3BhdGNoIHRhYmxlIChiYXNpY2FsbHkgYSBzdHJ1Y3QgZnVsbCBvZiBmdW5jdGlvbgorICogcG9pbnRlcnMuKQorICoKKyAqIEEgcGVyLXRocmVhZCBjdXJyZW50IGRpc3BhdGNoIHRhYmxlIGFuZCBwZXItdGhyZWFkIGN1cnJlbnQgY29udGV4dAorICogcG9pbnRlciBhcmUgbWFuYWdlZCBieSB0aGlzIG1vZHVsZSB0b28uCisgKgorICogVGhpcyBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gYmUgbm9uLU1lc2Etc3BlY2lmaWMgc28gaXQgY2FuIGJlIHVzZWQKKyAqIHdpdGggdGhlIFgvRFJJIGxpYkdMIGFsc28uCisgKi8KKworCisjaWZuZGVmIF9HTEFQSV9ICisjZGVmaW5lIF9HTEFQSV9ICisKKyNpbmNsdWRlICJ1X3RocmVhZC5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjaWZkZWYgX0dMQVBJX05PX0VYUE9SVFMKKyMgIGRlZmluZSBfR0xBUElfRVhQT1JUCisjZWxzZSAvKiBfR0xBUElfTk9fRVhQT1JUUyAqLworIyAgaWZkZWYgX1dJTjMyCisjICAgIGlmZGVmIF9HTEFQSV9ETExfRVhQT1JUUworIyAgICAgIGRlZmluZSBfR0xBUElfRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIF9HTEFQSV9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbGlmIGRlZmluZWQoX19HTlVDX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKSkKKyMgICAgZGVmaW5lIF9HTEFQSV9FWFBPUlQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9HTEFQSV9FWFBPUlQKKyMgIGVuZGlmCisjZW5kaWYgLyogX0dMQVBJX05PX0VYUE9SVFMgKi8KKworCisvKiBJcyB0aGlzIG5lZWRlZD8gIEl0IGlzIGluY29tcGxldGUgYW55d2F5LiAqLworI2lmZGVmIFVTRV9NR0xfTkFNRVNQQUNFCisjZGVmaW5lIF9nbGFwaV9zZXRfZGlzcGF0Y2ggX21nbGFwaV9zZXRfZGlzcGF0Y2gKKyNkZWZpbmUgX2dsYXBpX2dldF9kaXNwYXRjaCBfbWdsYXBpX2dldF9kaXNwYXRjaAorI2RlZmluZSBfZ2xhcGlfc2V0X2NvbnRleHQgX21nbGFwaV9zZXRfY29udGV4dAorI2RlZmluZSBfZ2xhcGlfZ2V0X2NvbnRleHQgX21nbGFwaV9nZXRfY29udGV4dAorI2RlZmluZSBfZ2xhcGlfRGlzcGF0Y2ggX21nbGFwaV9EaXNwYXRjaAorI2RlZmluZSBfZ2xhcGlfQ29udGV4dCBfbWdsYXBpX0NvbnRleHQKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKCpfZ2xhcGlfcHJvYykodm9pZCk7CitzdHJ1Y3QgX2dsYXBpX3RhYmxlOworCisKKyNpZiBkZWZpbmVkIChHTFhfVVNFX1RMUykKKworX0dMQVBJX0VYUE9SVCBleHRlcm4gX190aHJlYWQgc3RydWN0IF9nbGFwaV90YWJsZSAqIF9nbGFwaV90bHNfRGlzcGF0Y2gKKyAgICBfX2F0dHJpYnV0ZV9fKCh0bHNfbW9kZWwoImluaXRpYWwtZXhlYyIpKSk7CisKK19HTEFQSV9FWFBPUlQgZXh0ZXJuIF9fdGhyZWFkIHZvaWQgKiBfZ2xhcGlfdGxzX0NvbnRleHQKKyAgICBfX2F0dHJpYnV0ZV9fKCh0bHNfbW9kZWwoImluaXRpYWwtZXhlYyIpKSk7CisKK19HTEFQSV9FWFBPUlQgZXh0ZXJuIGNvbnN0IHN0cnVjdCBfZ2xhcGlfdGFibGUgKl9nbGFwaV9EaXNwYXRjaDsKK19HTEFQSV9FWFBPUlQgZXh0ZXJuIGNvbnN0IHZvaWQgKl9nbGFwaV9Db250ZXh0OworCisjIGRlZmluZSBHRVRfRElTUEFUQ0goKSBfZ2xhcGlfdGxzX0Rpc3BhdGNoCisjIGRlZmluZSBHRVRfQ1VSUkVOVF9DT05URVhUKEMpICBzdHJ1Y3QgZ2xfY29udGV4dCAqQyA9IChzdHJ1Y3QgZ2xfY29udGV4dCAqKSBfZ2xhcGlfdGxzX0NvbnRleHQKKworI2Vsc2UKKworX0dMQVBJX0VYUE9SVCBleHRlcm4gc3RydWN0IF9nbGFwaV90YWJsZSAqX2dsYXBpX0Rpc3BhdGNoOworX0dMQVBJX0VYUE9SVCBleHRlcm4gdm9pZCAqX2dsYXBpX0NvbnRleHQ7CisKKyMgaWZkZWYgVEhSRUFEUworCisjICBkZWZpbmUgR0VUX0RJU1BBVENIKCkgXAorICAgICAobGlrZWx5KF9nbGFwaV9EaXNwYXRjaCkgPyBfZ2xhcGlfRGlzcGF0Y2ggOiBfZ2xhcGlfZ2V0X2Rpc3BhdGNoKCkpCisKKyMgIGRlZmluZSBHRVRfQ1VSUkVOVF9DT05URVhUKEMpICBzdHJ1Y3QgZ2xfY29udGV4dCAqQyA9IChzdHJ1Y3QgZ2xfY29udGV4dCAqKSBcCisgICAgIChsaWtlbHkoX2dsYXBpX0NvbnRleHQpID8gX2dsYXBpX0NvbnRleHQgOiBfZ2xhcGlfZ2V0X2NvbnRleHQoKSkKKworIyBlbHNlCisKKyMgIGRlZmluZSBHRVRfRElTUEFUQ0goKSBfZ2xhcGlfRGlzcGF0Y2gKKyMgIGRlZmluZSBHRVRfQ1VSUkVOVF9DT05URVhUKEMpICBzdHJ1Y3QgZ2xfY29udGV4dCAqQyA9IChzdHJ1Y3QgZ2xfY29udGV4dCAqKSBfZ2xhcGlfQ29udGV4dAorCisjIGVuZGlmCisKKyNlbmRpZiAvKiBkZWZpbmVkIChHTFhfVVNFX1RMUykgKi8KKworCit2b2lkCitfZ2xhcGlfZGVzdHJveV9tdWx0aXRocmVhZCh2b2lkKTsKKworCitfR0xBUElfRVhQT1JUIHZvaWQKK19nbGFwaV9jaGVja19tdWx0aXRocmVhZCh2b2lkKTsKKworCitfR0xBUElfRVhQT1JUIHZvaWQKK19nbGFwaV9zZXRfY29udGV4dCh2b2lkICpjb250ZXh0KTsKKworCitfR0xBUElfRVhQT1JUIHZvaWQgKgorX2dsYXBpX2dldF9jb250ZXh0KHZvaWQpOworCisKK19HTEFQSV9FWFBPUlQgdm9pZAorX2dsYXBpX3NldF9kaXNwYXRjaChzdHJ1Y3QgX2dsYXBpX3RhYmxlICpkaXNwYXRjaCk7CisKKworX0dMQVBJX0VYUE9SVCBzdHJ1Y3QgX2dsYXBpX3RhYmxlICoKK19nbGFwaV9nZXRfZGlzcGF0Y2godm9pZCk7CisKKworX0dMQVBJX0VYUE9SVCB1bnNpZ25lZCBpbnQKK19nbGFwaV9nZXRfZGlzcGF0Y2hfdGFibGVfc2l6ZSh2b2lkKTsKKworCitfR0xBUElfRVhQT1JUIGludAorX2dsYXBpX2FkZF9kaXNwYXRjaCggY29uc3QgY2hhciAqIGNvbnN0ICogZnVuY3Rpb25fbmFtZXMsCisJCSAgICAgY29uc3QgY2hhciAqIHBhcmFtZXRlcl9zaWduYXR1cmUgKTsKKworX0dMQVBJX0VYUE9SVCBpbnQKK19nbGFwaV9nZXRfcHJvY19vZmZzZXQoY29uc3QgY2hhciAqZnVuY05hbWUpOworCisKK19HTEFQSV9FWFBPUlQgX2dsYXBpX3Byb2MKK19nbGFwaV9nZXRfcHJvY19hZGRyZXNzKGNvbnN0IGNoYXIgKmZ1bmNOYW1lKTsKKworCitfR0xBUElfRVhQT1JUIGNvbnN0IGNoYXIgKgorX2dsYXBpX2dldF9wcm9jX25hbWUodW5zaWduZWQgaW50IG9mZnNldCk7CisKKworX0dMQVBJX0VYUE9SVCBzdHJ1Y3QgX2dsYXBpX3RhYmxlICoKK19nbGFwaV9jcmVhdGVfdGFibGVfZnJvbV9oYW5kbGUodm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpzeW1ib2xfcHJlZml4KTsKKworCisvKiogRGVwcmVjYXRlZCBmdW5jdGlvbiAqLworX0dMQVBJX0VYUE9SVCB1bnNpZ25lZCBsb25nCitfZ2x0aHJlYWRfR2V0SUQodm9pZCk7CisKKworLyoKKyAqIFRoZXNlIHN0dWJzIGFyZSBrZXB0IHNvIHRoYXQgdGhlIG9sZCBEUkkgZHJpdmVycyBzdGlsbCBsb2FkLgorICovCitfR0xBUElfRVhQT1JUIHZvaWQKK19nbGFwaV9ub29wX2VuYWJsZV93YXJuaW5ncyh1bnNpZ25lZCBjaGFyIGVuYWJsZSk7CisKKworX0dMQVBJX0VYUE9SVCB2b2lkCitfZ2xhcGlfc2V0X3dhcm5pbmdfZnVuYyhfZ2xhcGlfcHJvYyBmdW5jKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tYXBpL3VfY29tcGlsZXIuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tYXBpL3VfY29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzc2ZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21hcGkvdV9jb21waWxlci5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX1VfQ09NUElMRVJfSF8KKyNkZWZpbmUgX1VfQ09NUElMRVJfSF8KKworI2luY2x1ZGUgImM5OV9jb21wYXQuaCIgLyogaW5saW5lLCBfX2Z1bmNfXywgZXRjLiAqLworCisKKy8qIFhYWDogVXNlIHN0YW5kYXJkIGBpbmxpbmVgIGtleXdvcmQgaW5zdGVhZCAqLworI2lmbmRlZiBJTkxJTkUKKyMgIGRlZmluZSBJTkxJTkUgaW5saW5lCisjZW5kaWYKKworLyogRnVuY3Rpb24gdmlzaWJpbGl0eSAqLworI2lmbmRlZiBQVUJMSUMKKyMgIGlmIGRlZmluZWQoX19HTlVDX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKSkKKyMgICAgZGVmaW5lIFBVQkxJQyBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgICBkZWZpbmUgUFVCTElDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgZWxzZQorIyAgICBkZWZpbmUgUFVCTElDCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbGlrZWx5CisjICBpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgICBkZWZpbmUgbGlrZWx5KHgpICAgX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkKKyMgICAgZGVmaW5lIHVubGlrZWx5KHgpIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApCisjICBlbHNlCisjICAgIGRlZmluZSBsaWtlbHkoeCkgICAoeCkKKyMgICAgZGVmaW5lIHVubGlrZWx5KHgpICh4KQorIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1VfQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tYXBpL3VfdGhyZWFkLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWFwaS91X3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzNiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWFwaS91X3RocmVhZC5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworLyoKKyAqIFRocmVhZCBzdXBwb3J0IGZvciBnbCBkaXNwYXRjaC4KKyAqCisgKiBJbml0aWFsIHZlcnNpb24gYnkgSm9obiBTdG9uZSAoai5zdG9uZUBhY20ub3JnKSAoam9obnNAY3MudW1yLmVkdSkKKyAqICAgICAgICAgICAgICAgIGFuZCBDaHJpc3RvcGggUG9saXdvZGEgKHBvbGl3b2RhQHZvbHVtZWdyYXBoaWNzLmNvbSkKKyAqIFJldmlzZWQgYnkgS2VpdGggV2hpdHdlbGwKKyAqIEFkYXB0ZWQgZm9yIG5ldyBnbCBkaXNwYXRjaGVyIGJ5IEJyaWFuIFBhdWwKKyAqIE1vZGlmaWVkIGZvciB1c2UgaW4gbWFwaSBieSBDaGlhLUkgV3UKKyAqLworCisvKgorICogSWYgdGhpcyBmaWxlIGlzIGFjY2lkZW50YWxseSBpbmNsdWRlZCBieSBhIG5vbi10aHJlYWRlZCBidWlsZCwKKyAqIGl0IHNob3VsZCBub3QgY2F1c2UgdGhlIGJ1aWxkIHRvIGZhaWwsIG9yIG90aGVyd2lzZSBjYXVzZSBwcm9ibGVtcy4KKyAqIEluIGdlbmVyYWwsIGl0IHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIHdoZW4gbmVlZGVkIGhvd2V2ZXIuCisgKi8KKworI2lmbmRlZiBfVV9USFJFQURfSF8KKyNkZWZpbmUgX1VfVEhSRUFEX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInVfY29tcGlsZXIuaCIKKworI2luY2x1ZGUgImMxMS90aHJlYWRzLmgiCisKKyNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRCkgfHwgZGVmaW5lZChfV0lOMzIpCisjaWZuZGVmIFRIUkVBRFMKKyNkZWZpbmUgVEhSRUFEUworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIEVycm9yIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgSU5JVF9UU0RfRVJST1IgIk1lc2E6IGZhaWxlZCB0byBhbGxvY2F0ZSBrZXkgZm9yIHRocmVhZCBzcGVjaWZpYyBkYXRhIgorI2RlZmluZSBHRVRfVFNEX0VSUk9SICJNZXNhOiBmYWlsZWQgdG8gZ2V0IHRocmVhZCBzcGVjaWZpYyBkYXRhIgorI2RlZmluZSBTRVRfVFNEX0VSUk9SICJNZXNhOiB0aHJlYWQgZmFpbGVkIHRvIHNldCB0aHJlYWQgc3BlY2lmaWMgZGF0YSIKKworCisvKgorICogTWFnaWMgbnVtYmVyIHRvIGRldGVybWluZSBpZiBhIFRTRCBvYmplY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgKiBLaW5kIG9mIGEgaGFjayBidXQgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBiZXR0ZXIgY3Jvc3MtcGxhdGZvcm0KKyAqIHNvbHV0aW9uLgorICovCisjZGVmaW5lIElOSVRfTUFHSUMgMHhmZjhhZGM5OAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworc3RydWN0IHVfdHNkIHsKKyAgIHRzc190IGtleTsKKyAgIHVuc2lnbmVkIGluaXRNYWdpYzsKK307CisKKworc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCit1X3RocmVhZF9zZWxmKHZvaWQpCit7CisgICAvKgorICAgICogWFhYOiBDYWxsZXJzIG9mIHVfdGhyZWFkX3NlbGYgYXNzdW1lIGl0IGlzIGEgbGlnaHR3ZWlnaHQgZnVuY3Rpb24sCisgICAgKiByZXR1cm5pbmcgYSBudW1lcmljIHZhbHVlLiAgQnV0IHVuZm9ydHVuYXRlbHkgQzExJ3MgdGhyZF9jdXJyZW50KCkgZ2l2ZXMKKyAgICAqIG5vIHN1Y2ggZ3VhcmFudGVlcy4gIEluIGZhY3QsIGl0J3MgcHJldHR5IGhhcmQgdG8gaGF2ZSBhIGNvbXBsaWFudAorICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhyZF9jdXJyZW50KCkgb24gV2luZG93cyB3aXRoIHN1Y2ggY2hhcmFjdGVyaXN0aWNzLgorICAgICogU28gZm9yIG5vdywgd2Ugc2lkZS1zdGVwIHRoaXMgbWVzcyBhbmQgdXNlIFdpbmRvd3MgdGhyZWFkIHByaW1pdGl2ZXMKKyAgICAqIGRpcmVjdGx5IGhlcmUuCisgICAgKgorICAgICogRklYTUU6IE9uIHRoZSBvdGhlciBoYW5kLCB1X3RocmVhZF9zZWxmKCkgaXMgYSBiYWQKKyAgICAqIGFic3RyYWN0aW9uLiAgRXZlbiB3aXRoIHB0aHJlYWRzLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICAgICogcHRocmVhZF9zZWxmKCkgd2lsbCByZXR1cm4gbnVtZXJpYyBJRHMgLS0gd2Ugc2hvdWxkIGJlIHVzaW5nCisgICAgKiBwdGhyZWFkX2VxdWFsKCkgaW5zdGVhZCBvZiBhc3N1bWluZyB3ZSBjYW4gY29tcGFyZSB0aHJlYWQgaWRzLi4uCisgICAgKi8KKyNpZmRlZiBfV0lOMzIKKyAgIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyNlbHNlCisgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpICh1aW50cHRyX3QpIHRocmRfY3VycmVudCgpOworI2VuZGlmCit9CisKKworc3RhdGljIElOTElORSB2b2lkCit1X3RzZF9pbml0KHN0cnVjdCB1X3RzZCAqdHNkKQoreworICAgaWYgKHRzc19jcmVhdGUoJnRzZC0+a2V5LCBOVUxMLypmcmVlKi8pICE9IDApIHsKKyAgICAgIHBlcnJvcihJTklUX1RTRF9FUlJPUik7CisgICAgICBleGl0KC0xKTsKKyAgIH0KKyAgIHRzZC0+aW5pdE1hZ2ljID0gSU5JVF9NQUdJQzsKK30KKworCitzdGF0aWMgSU5MSU5FIHZvaWQgKgordV90c2RfZ2V0KHN0cnVjdCB1X3RzZCAqdHNkKQoreworICAgaWYgKHRzZC0+aW5pdE1hZ2ljICE9IElOSVRfTUFHSUMpIHsKKyAgICAgIHVfdHNkX2luaXQodHNkKTsKKyAgIH0KKyAgIHJldHVybiB0c3NfZ2V0KHRzZC0+a2V5KTsKK30KKworCitzdGF0aWMgSU5MSU5FIHZvaWQKK3VfdHNkX3NldChzdHJ1Y3QgdV90c2QgKnRzZCwgdm9pZCAqcHRyKQoreworICAgaWYgKHRzZC0+aW5pdE1hZ2ljICE9IElOSVRfTUFHSUMpIHsKKyAgICAgIHVfdHNkX2luaXQodHNkKTsKKyAgIH0KKyAgIGlmICh0c3Nfc2V0KHRzZC0+a2V5LCBwdHIpICE9IDApIHsKKyAgICAgIHBlcnJvcihTRVRfVFNEX0VSUk9SKTsKKyAgICAgIGV4aXQoLTEpOworICAgfQorfQorCisKK3N0YXRpYyBJTkxJTkUgdm9pZAordV90c2RfZGVzdHJveShzdHJ1Y3QgdV90c2QgKnRzZCkKK3sKKyAgIGlmICh0c2QtPmluaXRNYWdpYyAhPSBJTklUX01BR0lDKSB7CisgICAgICByZXR1cm47CisgICB9CisgICB0c3NfZGVsZXRlKHRzZC0+a2V5KTsKKyAgIHRzZC0+aW5pdE1hZ2ljID0gMHgwOworfQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVV9USFJFQURfSF8gKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vYWNjdW0uYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vYWNjdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjc0NDY4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9hY2N1bS5jCkBAIC0wLDAgKzEsNDkxIEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJnbGhlYWRlci5oIgorI2luY2x1ZGUgImFjY3VtLmgiCisjaW5jbHVkZSAiY29uZHJlbmRlci5oIgorI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJmb3JtYXRfdW5wYWNrLmgiCisjaW5jbHVkZSAiZm9ybWF0X3BhY2suaCIKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSAic3RhdGUuaCIKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJtYWluL2Rpc3BhdGNoLmgiCisKKwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9DbGVhckFjY3VtKCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhICkKK3sKKyAgIEdMZmxvYXQgdG1wWzRdOworICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOworCisgICB0bXBbMF0gPSBDTEFNUCggcmVkLCAgIC0xLjBGLCAxLjBGICk7CisgICB0bXBbMV0gPSBDTEFNUCggZ3JlZW4sIC0xLjBGLCAxLjBGICk7CisgICB0bXBbMl0gPSBDTEFNUCggYmx1ZSwgIC0xLjBGLCAxLjBGICk7CisgICB0bXBbM10gPSBDTEFNUCggYWxwaGEsIC0xLjBGLCAxLjBGICk7CisKKyAgIGlmIChURVNUX0VRXzRWKHRtcCwgY3R4LT5BY2N1bS5DbGVhckNvbG9yKSkKKyAgICAgIHJldHVybjsKKworICAgQ09QWV80RlYoIGN0eC0+QWNjdW0uQ2xlYXJDb2xvciwgdG1wICk7Cit9CisKKwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9BY2N1bSggR0xlbnVtIG9wLCBHTGZsb2F0IHZhbHVlICkKK3sKKyAgIEdFVF9DVVJSRU5UX0NPTlRFWFQoY3R4KTsKKyAgIEZMVVNIX1ZFUlRJQ0VTKGN0eCwgMCk7CisKKyAgIHN3aXRjaCAob3ApIHsKKyAgIGNhc2UgR0xfQUREOgorICAgY2FzZSBHTF9NVUxUOgorICAgY2FzZSBHTF9BQ0NVTToKKyAgIGNhc2UgR0xfTE9BRDoKKyAgIGNhc2UgR0xfUkVUVVJOOgorICAgICAgLyogT0sgKi8KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9FTlVNLCAiZ2xBY2N1bShvcCkiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+VmlzdWFsLmhhdmVBY2N1bUJ1ZmZlciA9PSAwKSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiZ2xBY2N1bShubyBhY2N1bSBidWZmZXIpIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXIgIT0gY3R4LT5SZWFkQnVmZmVyKSB7CisgICAgICAvKiBTZWUgR0xYX1NHSV9tYWtlX2N1cnJlbnRfcmVhZCBvciBXR0xfQVJCX21ha2VfY3VycmVudF9yZWFkLAorICAgICAgICogb3IgR0xfRVhUX2ZyYW1lYnVmZmVyX2JsaXQuCisgICAgICAgKi8KKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAiZ2xBY2N1bShkaWZmZXJlbnQgcmVhZC9kcmF3IGJ1ZmZlcnMpIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChjdHgtPk5ld1N0YXRlKQorICAgICAgX21lc2FfdXBkYXRlX3N0YXRlKGN0eCk7CisKKyAgIGlmIChjdHgtPkRyYXdCdWZmZXItPl9TdGF0dXMgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCwKKyAgICAgICAgICAgICAgICAgICJnbEFjY3VtKGluY29tcGxldGUgZnJhbWVidWZmZXIpIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChjdHgtPlJhc3RlckRpc2NhcmQpCisgICAgICByZXR1cm47CisKKyAgIGlmIChjdHgtPlJlbmRlck1vZGUgPT0gR0xfUkVOREVSKSB7CisgICAgICBfbWVzYV9hY2N1bShjdHgsIG9wLCB2YWx1ZSk7CisgICB9Cit9CisKKworLyoqCisgKiBDbGVhciB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlciBieSBtYXBwaW5nIHRoZSByZW5kZXJidWZmZXIgYW5kCisgKiB3cml0aW5nIHRoZSBjbGVhciBjb2xvciB0byBpdC4gIENhbGxlZCBieSB0aGUgZHJpdmVyJ3MgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBnbENsZWFyIGZ1bmN0aW9uLgorICovCit2b2lkCitfbWVzYV9jbGVhcl9hY2N1bV9idWZmZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIEdMdWludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworICAgR0x1Ynl0ZSAqYWNjTWFwOworICAgR0xpbnQgYWNjUm93U3RyaWRlOworICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqYWNjUmI7CisKKyAgIGlmICghY3R4LT5EcmF3QnVmZmVyKQorICAgICAgcmV0dXJuOworCisgICBhY2NSYiA9IGN0eC0+RHJhd0J1ZmZlci0+QXR0YWNobWVudFtCVUZGRVJfQUNDVU1dLlJlbmRlcmJ1ZmZlcjsKKyAgIGlmICghYWNjUmIpCisgICAgICByZXR1cm47ICAgLyogbWlzc2luZyBhY2N1bSBidWZmZXIsIG5vdCBhbiBlcnJvciAqLworCisgICAvKiBib3VuZHMsIHdpdGggc2Npc3NvciAqLworICAgeCA9IGN0eC0+RHJhd0J1ZmZlci0+X1htaW47CisgICB5ID0gY3R4LT5EcmF3QnVmZmVyLT5fWW1pbjsKKyAgIHdpZHRoID0gY3R4LT5EcmF3QnVmZmVyLT5fWG1heCAtIGN0eC0+RHJhd0J1ZmZlci0+X1htaW47CisgICBoZWlnaHQgPSBjdHgtPkRyYXdCdWZmZXItPl9ZbWF4IC0gY3R4LT5EcmF3QnVmZmVyLT5fWW1pbjsKKworICAgY3R4LT5Ecml2ZXIuTWFwUmVuZGVyYnVmZmVyKGN0eCwgYWNjUmIsIHgsIHksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfTUFQX1dSSVRFX0JJVCwgJmFjY01hcCwgJmFjY1Jvd1N0cmlkZSk7CisKKyAgIGlmICghYWNjTWFwKSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJnbEFjY3VtIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChhY2NSYi0+Rm9ybWF0ID09IE1FU0FfRk9STUFUX1JHQkFfU05PUk0xNikgeworICAgICAgY29uc3QgR0xzaG9ydCBjbGVhclIgPSBGTE9BVF9UT19TSE9SVChjdHgtPkFjY3VtLkNsZWFyQ29sb3JbMF0pOworICAgICAgY29uc3QgR0xzaG9ydCBjbGVhckcgPSBGTE9BVF9UT19TSE9SVChjdHgtPkFjY3VtLkNsZWFyQ29sb3JbMV0pOworICAgICAgY29uc3QgR0xzaG9ydCBjbGVhckIgPSBGTE9BVF9UT19TSE9SVChjdHgtPkFjY3VtLkNsZWFyQ29sb3JbMl0pOworICAgICAgY29uc3QgR0xzaG9ydCBjbGVhckEgPSBGTE9BVF9UT19TSE9SVChjdHgtPkFjY3VtLkNsZWFyQ29sb3JbM10pOworICAgICAgR0x1aW50IGksIGo7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICAgR0xzaG9ydCAqcm93ID0gKEdMc2hvcnQgKikgYWNjTWFwOworICAgICAgICAgCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgcm93W2kgKiA0ICsgMF0gPSBjbGVhclI7CisgICAgICAgICAgICByb3dbaSAqIDQgKyAxXSA9IGNsZWFyRzsKKyAgICAgICAgICAgIHJvd1tpICogNCArIDJdID0gY2xlYXJCOworICAgICAgICAgICAgcm93W2kgKiA0ICsgM10gPSBjbGVhckE7CisgICAgICAgICB9CisgICAgICAgICBhY2NNYXAgKz0gYWNjUm93U3RyaWRlOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBvdGhlciB0eXBlcyBzb21lZGF5PyAqLworICAgICAgX21lc2Ffd2FybmluZyhjdHgsICJ1bmV4cGVjdGVkIGFjY3VtIGJ1ZmZlciB0eXBlIik7CisgICB9CisKKyAgIGN0eC0+RHJpdmVyLlVubWFwUmVuZGVyYnVmZmVyKGN0eCwgYWNjUmIpOworfQorCisKKy8qKgorICogaWYgKGJpYXMpCisgKiAgICBBY2N1bSArPSB2YWx1ZQorICogZWxzZQorICogICAgQWNjdW0gKj0gdmFsdWUKKyAqLworc3RhdGljIHZvaWQKK2FjY3VtX3NjYWxlX29yX2JpYXMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgR0xpbnQgeHBvcywgR0xpbnQgeXBvcywgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIGJpYXMpCit7CisgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICphY2NSYiA9CisgICAgICBjdHgtPkRyYXdCdWZmZXItPkF0dGFjaG1lbnRbQlVGRkVSX0FDQ1VNXS5SZW5kZXJidWZmZXI7CisgICBHTHVieXRlICphY2NNYXA7CisgICBHTGludCBhY2NSb3dTdHJpZGU7CisKKyAgIGFzc2VydChhY2NSYik7CisKKyAgIGN0eC0+RHJpdmVyLk1hcFJlbmRlcmJ1ZmZlcihjdHgsIGFjY1JiLCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX01BUF9SRUFEX0JJVCB8IEdMX01BUF9XUklURV9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY01hcCwgJmFjY1Jvd1N0cmlkZSk7CisKKyAgIGlmICghYWNjTWFwKSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJnbEFjY3VtIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChhY2NSYi0+Rm9ybWF0ID09IE1FU0FfRk9STUFUX1JHQkFfU05PUk0xNikgeworICAgICAgY29uc3QgR0xzaG9ydCBpbmNyID0gKEdMc2hvcnQpICh2YWx1ZSAqIDMyNzY3LjBmKTsKKyAgICAgIEdMaW50IGksIGo7CisgICAgICBpZiAoYmlhcykgeworICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgICAgICBHTHNob3J0ICphY2MgPSAoR0xzaG9ydCAqKSBhY2NNYXA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAqIHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgIGFjY1tpXSArPSBpbmNyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjTWFwICs9IGFjY1Jvd1N0cmlkZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgLyogc2NhbGUgKi8KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICAgICAgR0xzaG9ydCAqYWNjID0gKEdMc2hvcnQgKikgYWNjTWFwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgKiB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgICAgICBhY2NbaV0gPSAoR0xzaG9ydCkgKGFjY1tpXSAqIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjY01hcCArPSBhY2NSb3dTdHJpZGU7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIG90aGVyIHR5cGVzIHNvbWVkYXk/ICovCisgICB9CisKKyAgIGN0eC0+RHJpdmVyLlVubWFwUmVuZGVyYnVmZmVyKGN0eCwgYWNjUmIpOworfQorCisKKy8qKgorICogaWYgKGxvYWQpCisgKiAgICBBY2N1bSA9IENvbG9yQnVmICogdmFsdWUKKyAqIGVsc2UKKyAqICAgIEFjY3VtICs9IENvbG9yQnVmICogdmFsdWUKKyAqLworc3RhdGljIHZvaWQKK2FjY3VtX29yX2xvYWQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgR0xpbnQgeHBvcywgR0xpbnQgeXBvcywgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgR0xib29sZWFuIGxvYWQpCit7CisgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICphY2NSYiA9CisgICAgICBjdHgtPkRyYXdCdWZmZXItPkF0dGFjaG1lbnRbQlVGRkVSX0FDQ1VNXS5SZW5kZXJidWZmZXI7CisgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpjb2xvclJiID0gY3R4LT5SZWFkQnVmZmVyLT5fQ29sb3JSZWFkQnVmZmVyOworICAgR0x1Ynl0ZSAqYWNjTWFwLCAqY29sb3JNYXA7CisgICBHTGludCBhY2NSb3dTdHJpZGUsIGNvbG9yUm93U3RyaWRlOworICAgR0xiaXRmaWVsZCBtYXBwaW5nRmxhZ3M7CisKKyAgIGlmICghY29sb3JSYikgeworICAgICAgLyogbm8gcmVhZCBidWZmZXIgLSBPSyAqLworICAgICAgcmV0dXJuOworICAgfQorCisgICBhc3NlcnQoYWNjUmIpOworCisgICBtYXBwaW5nRmxhZ3MgPSBHTF9NQVBfV1JJVEVfQklUOworICAgaWYgKCFsb2FkKSAvKiBpZiB3ZSdyZSBhY2N1bXVsYXRpbmcgKi8KKyAgICAgIG1hcHBpbmdGbGFncyB8PSBHTF9NQVBfUkVBRF9CSVQ7CisKKyAgIC8qIE1hcCBhY2N1bSBidWZmZXIgKi8KKyAgIGN0eC0+RHJpdmVyLk1hcFJlbmRlcmJ1ZmZlcihjdHgsIGFjY1JiLCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdGbGFncywgJmFjY01hcCwgJmFjY1Jvd1N0cmlkZSk7CisgICBpZiAoIWFjY01hcCkgeworICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLCAiZ2xBY2N1bSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBNYXAgY29sb3IgYnVmZmVyICovCisgICBjdHgtPkRyaXZlci5NYXBSZW5kZXJidWZmZXIoY3R4LCBjb2xvclJiLCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX01BUF9SRUFEX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JNYXAsICZjb2xvclJvd1N0cmlkZSk7CisgICBpZiAoIWNvbG9yTWFwKSB7CisgICAgICBjdHgtPkRyaXZlci5Vbm1hcFJlbmRlcmJ1ZmZlcihjdHgsIGFjY1JiKTsKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImdsQWNjdW0iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGFjY1JiLT5Gb3JtYXQgPT0gTUVTQV9GT1JNQVRfUkdCQV9TTk9STTE2KSB7CisgICAgICBjb25zdCBHTGZsb2F0IHNjYWxlID0gdmFsdWUgKiAzMjc2Ny4wZjsKKyAgICAgIEdMaW50IGksIGo7CisgICAgICBHTGZsb2F0ICgqcmdiYSlbNF07CisKKyAgICAgIHJnYmEgPSBtYWxsb2Mod2lkdGggKiA0ICogc2l6ZW9mKEdMZmxvYXQpKTsKKyAgICAgIGlmIChyZ2JhKSB7CisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIEdMc2hvcnQgKmFjYyA9IChHTHNob3J0ICopIGFjY01hcDsKKworICAgICAgICAgICAgLyogcmVhZCBjb2xvcnMgZnJvbSBzb3VyY2UgY29sb3IgYnVmZmVyICovCisgICAgICAgICAgICBfbWVzYV91bnBhY2tfcmdiYV9yb3coY29sb3JSYi0+Rm9ybWF0LCB3aWR0aCwgY29sb3JNYXAsIHJnYmEpOworCisgICAgICAgICAgICBpZiAobG9hZCkgeworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIGFjY1tpICogNCArIDBdID0gKEdMc2hvcnQpIChyZ2JhW2ldW1JDT01QXSAqIHNjYWxlKTsKKyAgICAgICAgICAgICAgICAgIGFjY1tpICogNCArIDFdID0gKEdMc2hvcnQpIChyZ2JhW2ldW0dDT01QXSAqIHNjYWxlKTsKKyAgICAgICAgICAgICAgICAgIGFjY1tpICogNCArIDJdID0gKEdMc2hvcnQpIChyZ2JhW2ldW0JDT01QXSAqIHNjYWxlKTsKKyAgICAgICAgICAgICAgICAgIGFjY1tpICogNCArIDNdID0gKEdMc2hvcnQpIChyZ2JhW2ldW0FDT01QXSAqIHNjYWxlKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgLyogYWNjdW11bGF0ZSAqLworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIGFjY1tpICogNCArIDBdICs9IChHTHNob3J0KSAocmdiYVtpXVtSQ09NUF0gKiBzY2FsZSk7CisgICAgICAgICAgICAgICAgICBhY2NbaSAqIDQgKyAxXSArPSAoR0xzaG9ydCkgKHJnYmFbaV1bR0NPTVBdICogc2NhbGUpOworICAgICAgICAgICAgICAgICAgYWNjW2kgKiA0ICsgMl0gKz0gKEdMc2hvcnQpIChyZ2JhW2ldW0JDT01QXSAqIHNjYWxlKTsKKyAgICAgICAgICAgICAgICAgIGFjY1tpICogNCArIDNdICs9IChHTHNob3J0KSAocmdiYVtpXVtBQ09NUF0gKiBzY2FsZSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbG9yTWFwICs9IGNvbG9yUm93U3RyaWRlOworICAgICAgICAgICAgYWNjTWFwICs9IGFjY1Jvd1N0cmlkZTsKKyAgICAgICAgIH0KKworICAgICAgICAgZnJlZShyZ2JhKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLCAiZ2xBY2N1bSIpOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBvdGhlciB0eXBlcyBzb21lZGF5PyAqLworICAgfQorCisgICBjdHgtPkRyaXZlci5Vbm1hcFJlbmRlcmJ1ZmZlcihjdHgsIGFjY1JiKTsKKyAgIGN0eC0+RHJpdmVyLlVubWFwUmVuZGVyYnVmZmVyKGN0eCwgY29sb3JSYik7Cit9CisKKworLyoqCisgKiBDb2xvckJ1ZmZlciA9IEFjY3VtICogdmFsdWUKKyAqLworc3RhdGljIHZvaWQKK2FjY3VtX3JldHVybihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGZsb2F0IHZhbHVlLAorICAgICAgICAgICAgIEdMaW50IHhwb3MsIEdMaW50IHlwb3MsIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpCit7CisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOworICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqYWNjUmIgPSBmYi0+QXR0YWNobWVudFtCVUZGRVJfQUNDVU1dLlJlbmRlcmJ1ZmZlcjsKKyAgIEdMdWJ5dGUgKmFjY01hcCwgKmNvbG9yTWFwOworICAgR0xpbnQgYWNjUm93U3RyaWRlLCBjb2xvclJvd1N0cmlkZTsKKyAgIEdMdWludCBidWZmZXI7CisKKyAgIC8qIE1hcCBhY2N1bSBidWZmZXIgKi8KKyAgIGN0eC0+RHJpdmVyLk1hcFJlbmRlcmJ1ZmZlcihjdHgsIGFjY1JiLCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX01BUF9SRUFEX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjTWFwLCAmYWNjUm93U3RyaWRlKTsKKyAgIGlmICghYWNjTWFwKSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJnbEFjY3VtIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIExvb3Agb3ZlciBkZXN0aW5hdGlvbiBidWZmZXJzICovCisgICBmb3IgKGJ1ZmZlciA9IDA7IGJ1ZmZlciA8IGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsgYnVmZmVyKyspIHsKKyAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKmNvbG9yUmIgPSBmYi0+X0NvbG9yRHJhd0J1ZmZlcnNbYnVmZmVyXTsKKyAgICAgIGNvbnN0IEdMYm9vbGVhbiBtYXNraW5nID0gKCFjdHgtPkNvbG9yLkNvbG9yTWFza1tidWZmZXJdW1JDT01QXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWN0eC0+Q29sb3IuQ29sb3JNYXNrW2J1ZmZlcl1bR0NPTVBdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY3R4LT5Db2xvci5Db2xvck1hc2tbYnVmZmVyXVtCQ09NUF0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjdHgtPkNvbG9yLkNvbG9yTWFza1tidWZmZXJdW0FDT01QXSk7CisgICAgICBHTGJpdGZpZWxkIG1hcHBpbmdGbGFncyA9IEdMX01BUF9XUklURV9CSVQ7CisKKyAgICAgIGlmIChtYXNraW5nKQorICAgICAgICAgbWFwcGluZ0ZsYWdzIHw9IEdMX01BUF9SRUFEX0JJVDsKKworICAgICAgLyogTWFwIGNvbG9yIGJ1ZmZlciAqLworICAgICAgY3R4LT5Ecml2ZXIuTWFwUmVuZGVyYnVmZmVyKGN0eCwgY29sb3JSYiwgeHBvcywgeXBvcywgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nRmxhZ3MsICZjb2xvck1hcCwgJmNvbG9yUm93U3RyaWRlKTsKKyAgICAgIGlmICghY29sb3JNYXApIHsKKyAgICAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImdsQWNjdW0iKTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYWNjUmItPkZvcm1hdCA9PSBNRVNBX0ZPUk1BVF9SR0JBX1NOT1JNMTYpIHsKKyAgICAgICAgIGNvbnN0IEdMZmxvYXQgc2NhbGUgPSB2YWx1ZSAvIDMyNzY3LjBmOworICAgICAgICAgR0xpbnQgaSwgajsKKyAgICAgICAgIEdMZmxvYXQgKCpyZ2JhKVs0XSwgKCpkZXN0KVs0XTsKKworICAgICAgICAgcmdiYSA9IG1hbGxvYyh3aWR0aCAqIDQgKiBzaXplb2YoR0xmbG9hdCkpOworICAgICAgICAgZGVzdCA9IG1hbGxvYyh3aWR0aCAqIDQgKiBzaXplb2YoR0xmbG9hdCkpOworCisgICAgICAgICBpZiAocmdiYSAmJiBkZXN0KSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgICAgIEdMc2hvcnQgKmFjYyA9IChHTHNob3J0ICopIGFjY01hcDsKKworICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIHJnYmFbaV1bMF0gPSBhY2NbaSAqIDQgKyAwXSAqIHNjYWxlOworICAgICAgICAgICAgICAgICAgcmdiYVtpXVsxXSA9IGFjY1tpICogNCArIDFdICogc2NhbGU7CisgICAgICAgICAgICAgICAgICByZ2JhW2ldWzJdID0gYWNjW2kgKiA0ICsgMl0gKiBzY2FsZTsKKyAgICAgICAgICAgICAgICAgIHJnYmFbaV1bM10gPSBhY2NbaSAqIDQgKyAzXSAqIHNjYWxlOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBpZiAobWFza2luZykgeworCisgICAgICAgICAgICAgICAgICAvKiBnZXQgZXhpc3RpbmcgY29sb3JzIGZyb20gZGVzdCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgIF9tZXNhX3VucGFja19yZ2JhX3Jvdyhjb2xvclJiLT5Gb3JtYXQsIHdpZHRoLCBjb2xvck1hcCwgZGVzdCk7CisKKyAgICAgICAgICAgICAgICAgIC8qIHVzZSB0aGUgZGVzdCBjb2xvcnMgd2hlcmUgbWFza1tjaGFubmVsXSA9IDAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChjdHgtPkNvbG9yLkNvbG9yTWFza1tidWZmZXJdW1JDT01QXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJnYmFbaV1bUkNPTVBdID0gZGVzdFtpXVtSQ09NUF07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5Db2xvci5Db2xvck1hc2tbYnVmZmVyXVtHQ09NUF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICByZ2JhW2ldW0dDT01QXSA9IGRlc3RbaV1bR0NPTVBdOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+Q29sb3IuQ29sb3JNYXNrW2J1ZmZlcl1bQkNPTVBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcmdiYVtpXVtCQ09NUF0gPSBkZXN0W2ldW0JDT01QXTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChjdHgtPkNvbG9yLkNvbG9yTWFza1tidWZmZXJdW0FDT01QXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJnYmFbaV1bQUNPTVBdID0gZGVzdFtpXVtBQ09NUF07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIF9tZXNhX3BhY2tfZmxvYXRfcmdiYV9yb3coY29sb3JSYi0+Rm9ybWF0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEdMZmxvYXQgKCopWzRdKSByZ2JhLCBjb2xvck1hcCk7CisKKyAgICAgICAgICAgICAgIGFjY01hcCArPSBhY2NSb3dTdHJpZGU7CisgICAgICAgICAgICAgICBjb2xvck1hcCArPSBjb2xvclJvd1N0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLCAiZ2xBY2N1bSIpOworICAgICAgICAgfQorICAgICAgICAgZnJlZShyZ2JhKTsKKyAgICAgICAgIGZyZWUoZGVzdCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIC8qIG90aGVyIHR5cGVzIHNvbWVkYXk/ICovCisgICAgICB9CisKKyAgICAgIGN0eC0+RHJpdmVyLlVubWFwUmVuZGVyYnVmZmVyKGN0eCwgY29sb3JSYik7CisgICB9CisKKyAgIGN0eC0+RHJpdmVyLlVubWFwUmVuZGVyYnVmZmVyKGN0eCwgYWNjUmIpOworfQorCisKKworLyoqCisgKiBTb2Z0d2FyZSBmYWxsYmFjayBmb3IgZ2xBY2N1bS4gIEEgaGFyZHdhcmUgZHJpdmVyIHRoYXQgc3VwcG9ydHMKKyAqIHNpZ25lZCAxNi1iaXQgY29sb3IgY2hhbm5lbHMgY291bGQgaW1wbGVtZW50IGhhcmR3YXJlIGFjY3VtdWxhdGlvbgorICogb3BlcmF0aW9ucywgYnV0IG5vIGRyaXZlciBkb2VzIHNvIGF0IHRoaXMgdGltZS4KKyAqLwordm9pZAorX21lc2FfYWNjdW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIG9wLCBHTGZsb2F0IHZhbHVlKQoreworICAgR0xpbnQgeHBvcywgeXBvcywgd2lkdGgsIGhlaWdodDsKKworICAgaWYgKCFjdHgtPkRyYXdCdWZmZXItPkF0dGFjaG1lbnRbQlVGRkVSX0FDQ1VNXS5SZW5kZXJidWZmZXIpIHsKKyAgICAgIF9tZXNhX3dhcm5pbmcoY3R4LCAiQ2FsbGluZyBnbEFjY3VtKCkgd2l0aG91dCBhbiBhY2N1bXVsYXRpb24gYnVmZmVyIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICghX21lc2FfY2hlY2tfY29uZGl0aW9uYWxfcmVuZGVyKGN0eCkpCisgICAgICByZXR1cm47CisKKyAgIHhwb3MgPSBjdHgtPkRyYXdCdWZmZXItPl9YbWluOworICAgeXBvcyA9IGN0eC0+RHJhd0J1ZmZlci0+X1ltaW47CisgICB3aWR0aCA9ICBjdHgtPkRyYXdCdWZmZXItPl9YbWF4IC0gY3R4LT5EcmF3QnVmZmVyLT5fWG1pbjsKKyAgIGhlaWdodCA9IGN0eC0+RHJhd0J1ZmZlci0+X1ltYXggLSBjdHgtPkRyYXdCdWZmZXItPl9ZbWluOworCisgICBzd2l0Y2ggKG9wKSB7CisgICBjYXNlIEdMX0FERDoKKyAgICAgIGlmICh2YWx1ZSAhPSAwLjBGKSB7CisgICAgICAgICBhY2N1bV9zY2FsZV9vcl9iaWFzKGN0eCwgdmFsdWUsIHhwb3MsIHlwb3MsIHdpZHRoLCBoZWlnaHQsIEdMX1RSVUUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMX01VTFQ6CisgICAgICBpZiAodmFsdWUgIT0gMS4wRikgeworICAgICAgICAgYWNjdW1fc2NhbGVfb3JfYmlhcyhjdHgsIHZhbHVlLCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LCBHTF9GQUxTRSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfQUNDVU06CisgICAgICBpZiAodmFsdWUgIT0gMC4wRikgeworICAgICAgICAgYWNjdW1fb3JfbG9hZChjdHgsIHZhbHVlLCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LCBHTF9GQUxTRSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfTE9BRDoKKyAgICAgIGFjY3VtX29yX2xvYWQoY3R4LCB2YWx1ZSwgeHBvcywgeXBvcywgd2lkdGgsIGhlaWdodCwgR0xfVFJVRSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfUkVUVVJOOgorICAgICAgYWNjdW1fcmV0dXJuKGN0eCwgdmFsdWUsIHhwb3MsIHlwb3MsIHdpZHRoLCBoZWlnaHQpOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShjdHgsICJpbnZhbGlkIG1vZGUgaW4gX21lc2FfYWNjdW0oKSIpOworICAgICAgYnJlYWs7CisgICB9Cit9CisKKwordm9pZCAKK19tZXNhX2luaXRfYWNjdW0oIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggKQoreworICAgLyogQWNjdW11bGF0ZSBidWZmZXIgZ3JvdXAgKi8KKyAgIEFTU0lHTl80ViggY3R4LT5BY2N1bS5DbGVhckNvbG9yLCAwLjAsIDAuMCwgMC4wLCAwLjAgKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vYWNjdW0uaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vYWNjdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTY2NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9hY2N1bS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogXGZpbGUgYWNjdW0uaAorICogQWNjdW11bGF0aW9uIGJ1ZmZlciBvcGVyYXRpb25zLgorICogCisgKiBcaWYgc3Vic2V0CisgKiAoTm8tb3ApCisgKgorICogXGVuZGlmCisgKi8KKworLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKworI2lmbmRlZiBBQ0NVTV9ICisjZGVmaW5lIEFDQ1VNX0gKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKworc3RydWN0IF9nbGFwaV90YWJsZTsKK3N0cnVjdCBnbF9jb250ZXh0Oworc3RydWN0IGdsX3JlbmRlcmJ1ZmZlcjsKKworZXh0ZXJuIHZvaWQgR0xBUElFTlRSWQorX21lc2FfQ2xlYXJBY2N1bSggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9BY2N1bSggR0xlbnVtIG9wLCBHTGZsb2F0IHZhbHVlICk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9hY2N1bShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gb3AsIEdMZmxvYXQgdmFsdWUpOworCitleHRlcm4gdm9pZAorX21lc2FfY2xlYXJfYWNjdW1fYnVmZmVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCitleHRlcm4gdm9pZAorX21lc2FfaW5pdF9hY2N1bSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCApOworCisjZW5kaWYgLyogQUNDVU1fSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9iaXRzZXQuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vYml0c2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxZmQwZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vYml0c2V0LmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBiaXRzZXQuaAorICogXGJyaWVmIEJpdHNldCBvZiBhcmJpdHJhcnkgc2l6ZSBkZWZpbml0aW9ucy4KKyAqIFxhdXRob3IgTWljaGFsIEtyb2wKKyAqLworCisjaWZuZGVmIEJJVFNFVF9ICisjZGVmaW5lIEJJVFNFVF9ICisKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZW5lcmljIGJpdHNldCBpbXBsZW1lbnRhdGlvbgorICovCisKKyNkZWZpbmUgQklUU0VUX1dPUkQgR0x1aW50CisjZGVmaW5lIEJJVFNFVF9XT1JEQklUUyAoc2l6ZW9mIChCSVRTRVRfV09SRCkgKiA4KQorCisvKiBiaXRzZXQgZGVjbGFyYXRpb25zCisgKi8KKyNkZWZpbmUgQklUU0VUX1dPUkRTKGJpdHMpIChBTElHTihiaXRzLCBCSVRTRVRfV09SREJJVFMpIC8gQklUU0VUX1dPUkRCSVRTKQorI2RlZmluZSBCSVRTRVRfREVDTEFSRShuYW1lLCBiaXRzKSBCSVRTRVRfV09SRCBuYW1lW0JJVFNFVF9XT1JEUyhiaXRzKV0KKworLyogYml0c2V0IG9wZXJhdGlvbnMKKyAqLworI2RlZmluZSBCSVRTRVRfQ09QWSh4LCB5KSBtZW1jcHkoICh4KSwgKHkpLCBzaXplb2YgKHgpICkKKyNkZWZpbmUgQklUU0VUX0VRVUFMKHgsIHkpIChtZW1jbXAoICh4KSwgKHkpLCBzaXplb2YgKHgpICkgPT0gMCkKKyNkZWZpbmUgQklUU0VUX1pFUk8oeCkgbWVtc2V0KCAoeCksIDAsIHNpemVvZiAoeCkgKQorI2RlZmluZSBCSVRTRVRfT05FUyh4KSBtZW1zZXQoICh4KSwgMHhmZiwgc2l6ZW9mICh4KSApCisKKyNkZWZpbmUgQklUU0VUX0JJVFdPUkQoYikgKChiKSAvIEJJVFNFVF9XT1JEQklUUykKKyNkZWZpbmUgQklUU0VUX0JJVChiKSAoMSA8PCAoKGIpICUgQklUU0VUX1dPUkRCSVRTKSkKKworLyogc2luZ2xlIGJpdCBvcGVyYXRpb25zCisgKi8KKyNkZWZpbmUgQklUU0VUX1RFU1QoeCwgYikgKCh4KVtCSVRTRVRfQklUV09SRChiKV0gJiBCSVRTRVRfQklUKGIpKQorI2RlZmluZSBCSVRTRVRfU0VUKHgsIGIpICgoeClbQklUU0VUX0JJVFdPUkQoYildIHw9IEJJVFNFVF9CSVQoYikpCisjZGVmaW5lIEJJVFNFVF9DTEVBUih4LCBiKSAoKHgpW0JJVFNFVF9CSVRXT1JEKGIpXSAmPSB+QklUU0VUX0JJVChiKSkKKworI2RlZmluZSBCSVRTRVRfTUFTSyhiKSAoKGIpID09IEJJVFNFVF9XT1JEQklUUyA/IH4wIDogQklUU0VUX0JJVChiKSAtIDEpCisjZGVmaW5lIEJJVFNFVF9SQU5HRShiLCBlKSAoQklUU0VUX01BU0soKGUpICsgMSkgJiB+QklUU0VUX01BU0soYikpCisKKy8qIGJpdCByYW5nZSBvcGVyYXRpb25zCisgKi8KKyNkZWZpbmUgQklUU0VUX1RFU1RfUkFOR0UoeCwgYiwgZSkgXAorICAgKEJJVFNFVF9CSVRXT1JEKGIpID09IEJJVFNFVF9CSVRXT1JEKGUpID8gXAorICAgKCh4KVtCSVRTRVRfQklUV09SRChiKV0gJiBCSVRTRVRfUkFOR0UoYiwgZSkpIDogXAorICAgKGFzc2VydCAoISJCSVRTRVRfVEVTVF9SQU5HRTogYml0IHJhbmdlIGNyb3NzZXMgd29yZCBib3VuZGFyeSIpLCAwKSkKKyNkZWZpbmUgQklUU0VUX1NFVF9SQU5HRSh4LCBiLCBlKSBcCisgICAoQklUU0VUX0JJVFdPUkQoYikgPT0gQklUU0VUX0JJVFdPUkQoZSkgPyBcCisgICAoKHgpW0JJVFNFVF9CSVRXT1JEKGIpXSB8PSBCSVRTRVRfUkFOR0UoYiwgZSkpIDogXAorICAgKGFzc2VydCAoISJCSVRTRVRfU0VUX1JBTkdFOiBiaXQgcmFuZ2UgY3Jvc3NlcyB3b3JkIGJvdW5kYXJ5IiksIDApKQorI2RlZmluZSBCSVRTRVRfQ0xFQVJfUkFOR0UoeCwgYiwgZSkgXAorICAgKEJJVFNFVF9CSVRXT1JEKGIpID09IEJJVFNFVF9CSVRXT1JEKGUpID8gXAorICAgKCh4KVtCSVRTRVRfQklUV09SRChiKV0gJj0gfkJJVFNFVF9SQU5HRShiLCBlKSkgOiBcCisgICAoYXNzZXJ0ICghIkJJVFNFVF9DTEVBUl9SQU5HRTogYml0IHJhbmdlIGNyb3NzZXMgd29yZCBib3VuZGFyeSIpLCAwKSkKKworLyogR2V0IGZpcnN0IGJpdCBzZXQgaW4gYSBiaXRzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2JpdHNldF9mZnMoY29uc3QgQklUU0VUX1dPUkQgKngsIGludCBuKQoreworICAgaW50IGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGlmICh4W2ldKQorCSByZXR1cm4gZmZzKHhbaV0pICsgQklUU0VUX1dPUkRCSVRTICogaTsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQklUU0VUX0ZGUyh4KSBfX2JpdHNldF9mZnMoeCwgRWxlbWVudHMoeCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9jb21waWxlci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzJkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2NvbXBpbGVyLmgKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDggIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBWTXdhcmUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKy8qKgorICogXGZpbGUgY29tcGlsZXIuaAorICogQ29tcGlsZXItcmVsYXRlZCBzdHVmZi4KKyAqLworCisKKyNpZm5kZWYgQ09NUElMRVJfSAorI2RlZmluZSBDT01QSUxFUl9ICisKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImM5OV9jb21wYXQuaCIgLyogaW5saW5lLCBfX2Z1bmNfXywgZXRjLiAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioKKyAqIEdldCBzdGFuZGFyZCBpbnRlZ2VyIHR5cGVzCisgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisvKioKKyAgKiBTdW4gY29tcGlsZXJzIGRlZmluZSBfX2kzODYgaW5zdGVhZCBvZiB0aGUgZ2NjLXN0eWxlIF9faTM4Nl9fCisgKi8KKyNpZmRlZiBfX1NVTlBST19DCisjIGlmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKF9faTM4NikKKyMgIGRlZmluZSBfX2kzODZfXworIyBlbGlmICFkZWZpbmVkKF9fYW1kNjRfXykgJiYgZGVmaW5lZChfX2FtZDY0KQorIyAgZGVmaW5lIF9fYW1kNjRfXworIyBlbGlmICFkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX3NwYXJjKQorIyAgZGVmaW5lIF9fc3BhcmNfXworIyBlbmRpZgorIyBpZiAhZGVmaW5lZChfX3ZvbGF0aWxlKQorIyAgZGVmaW5lIF9fdm9sYXRpbGUgdm9sYXRpbGUKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qKgorICogZmluaXRlIG1hY3JvLgorICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgIGRlZmluZSBmaW5pdGUgX2Zpbml0ZQorI2VuZGlmCisKKworLyoqCisgKiBEaXNhYmxlIGFzc29ydGVkIHdhcm5pbmdzCisgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAvKiBtaW5ndyBlbnZpcm9ubWVudCAqLworIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQwNjggKSAvKiB1bmtub3duIHByYWdtYSAqLworIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3MTAgKSAvKiBmdW5jdGlvbiAnZm9vJyBub3QgaW5saW5lZCAqLworIyAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3MTEgKSAvKiBmdW5jdGlvbiAnZm9vJyBzZWxlY3RlZCBmb3IgYXV0b21hdGljIGlubGluZSBleHBhbnNpb24gKi8KKyMgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTI3ICkgLyogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCAqLworIyAgICBpZiBkZWZpbmVkKE1FU0FfTUlOV0FSTikKKyMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNDQgKSAvKiAnPScgOiBjb252ZXJzaW9uIGZyb20gJ2NvbnN0IGRvdWJsZSAnIHRvICdmbG9hdCAnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEgKi8KKyMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQwMTggKSAvKiAnPCcgOiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2ggKi8KKyMgICAgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQzMDUgKSAvKiAnPScgOiB0cnVuY2F0aW9uIGZyb20gJ2NvbnN0IGRvdWJsZSAnIHRvICdmbG9hdCAnICovCisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTUwICkgLyogJ2Z1bmN0aW9uJyB1bmRlZmluZWQ7IGFzc3VtaW5nIGV4dGVybiByZXR1cm5pbmcgaW50ICovCisjICAgICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NzYxICkgLyogaW50ZWdyYWwgc2l6ZSBtaXNtYXRjaCBpbiBhcmd1bWVudDsgY29udmVyc2lvbiBzdXBwbGllZCAqLworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisKKworLyogWFhYOiBVc2Ugc3RhbmRhcmQgYGlubGluZWAga2V5d29yZCBpbnN0ZWFkICovCisjaWZuZGVmIElOTElORQorIyAgZGVmaW5lIElOTElORSBpbmxpbmUKKyNlbmRpZgorCisKKy8qKgorICogUFVCTElDL1VTRUQgbWFjcm9zCisgKgorICogSWYgd2UgYnVpbGQgdGhlIGxpYnJhcnkgd2l0aCBnY2MncyAtZnZpc2liaWxpdHk9aGlkZGVuIGZsYWcsIHdlJ2xsCisgKiB1c2UgdGhlIFBVQkxJQyBtYWNybyB0byBtYXJrIGZ1bmN0aW9ucyB0aGF0IGFyZSB0byBiZSBleHBvcnRlZC4KKyAqCisgKiBXZSBhbHNvIG5lZWQgdG8gZGVmaW5lIGEgVVNFRCBhdHRyaWJ1dGUsIHNvIHRoZSBvcHRpbWl6ZXIgZG9lc24ndCAKKyAqIGlubGluZSBhIHN0YXRpYyBmdW5jdGlvbiB0aGF0IHdlIGxhdGVyIHVzZSBpbiBhbiBhbGlhcy4gLSBhamF4CisgKi8KKyNpZm5kZWYgUFVCTElDCisjICBpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNCkgfHwgKGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1OTApKQorIyAgICBkZWZpbmUgUFVCTElDIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjICAgIGRlZmluZSBVU0VEIF9fYXR0cmlidXRlX18oKHVzZWQpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgUFVCTElDCisjICAgIGRlZmluZSBVU0VECisjICBlbmRpZgorI2VuZGlmCisKKworLyoqCisgKiBfX2J1aWx0aW5fZXhwZWN0IG1hY3JvcworICovCisjaWYgIWRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgX19idWlsdGluX2V4cGVjdCh4LCB5KSAoeCkKKyNlbmRpZgorCisjaWZuZGVmIGxpa2VseQorIyAgaWZkZWYgX19HTlVDX18KKyMgICAgZGVmaW5lIGxpa2VseSh4KSAgIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisjICAgIGRlZmluZSB1bmxpa2VseSh4KSBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAwKQorIyAgZWxzZQorIyAgICBkZWZpbmUgbGlrZWx5KHgpICAgKHgpCisjICAgIGRlZmluZSB1bmxpa2VseSh4KSAoeCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogWFhYOiBVc2Ugc3RhbmRhcmQgYF9fZnVuY19fYCBpbnN0ZWFkICovCisjaWZuZGVmIF9fRlVOQ1RJT05fXworIyAgZGVmaW5lIF9fRlVOQ1RJT05fXyBfX2Z1bmNfXworI2VuZGlmCisKKy8qKgorICogRWl0aGVyIGRlZmluZSBNRVNBX0JJR19FTkRJQU4gb3IgTUVTQV9MSVRUTEVfRU5ESUFOLCBhbmQgQ1BVX1RPX0xFMzIuCisgKiBEbyBub3QgdXNlIHRoZXNlIHVubGVzcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSEKKyAqIFRyeSB0byB1c2UgYSBydW50aW1lIHRlc3QgaW5zdGVhZC4KKyAqIEZvciBub3csIG9ubHkgdXNlZCBieSBzb21lIERSSSBoYXJkd2FyZSBkcml2ZXJzIGZvciBjb2xvci90ZXhlbCBwYWNraW5nLgorICovCisjaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKEJJR19FTkRJQU4pICYmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZGVmaW5lIENQVV9UT19MRTMyKCB4ICkJYnN3YXBfMzIoIHggKQorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZCeXRlT3JkZXIuaD4KKyNkZWZpbmUgQ1BVX1RPX0xFMzIoIHggKQlDRlN3YXBJbnQzMkhvc3RUb0xpdHRsZSggeCApCisjZWxpZiAoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fYmxydHMpKQorc3RhdGljIElOTElORSBHTHVpbnQgQ1BVX1RPX0xFMzIoR0x1aW50IHgpCit7CisgICByZXR1cm4gKCgoeCAmIDB4MDAwMDAwZmYpIDw8IDI0KSB8CisgICAgICAgICAgICgoeCAmIDB4MDAwMGZmMDApIDw8ICA4KSB8CisgICAgICAgICAgICgoeCAmIDB4MDBmZjAwMDApID4+ICA4KSB8CisgICAgICAgICAgICgoeCAmIDB4ZmYwMDAwMDApID4+IDI0KSk7Cit9CisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2RlZmluZSBDUFVfVE9fTEUzMiggeCApCWh0b2xlMzIoIHggKQorI2Vsc2UgLypfX2xpbnV4X18gKi8KKyNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisjZGVmaW5lIENQVV9UT19MRTMyKCB4ICkJYnN3YXAzMiggeCApCisjZW5kaWYgLypfX2xpbnV4X18qLworI2RlZmluZSBNRVNBX0JJR19FTkRJQU4gMQorI2Vsc2UKKyNkZWZpbmUgQ1BVX1RPX0xFMzIoIHggKQkoIHggKQorI2RlZmluZSBNRVNBX0xJVFRMRV9FTkRJQU4gMQorI2VuZGlmCisjZGVmaW5lIExFMzJfVE9fQ1BVKCB4ICkJQ1BVX1RPX0xFMzIoIHggKQorCisKKworI2lmICFkZWZpbmVkKENBUEkpICYmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBDQVBJIF9jZGVjbAorI2VuZGlmCisKKworLyoqCisgKiBDcmVhdGUgYSBtYWNybyBzbyB0aGF0IGFzbSBmdW5jdGlvbnMgY2FuIGJlIGxpbmtlZCBpbnRvIGNvbXBpbGVycyBvdGhlcgorICogdGhhbiBHTlUgQworICovCisjaWZuZGVmIF9BU01BUEkKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNkZWZpbmUgX0FTTUFQSSBfX2NkZWNsCisjZWxzZQorI2RlZmluZSBfQVNNQVBJCisjZW5kaWYKKyNpZmRlZglQVFJfREVDTF9JTl9GUk9OVAorI2RlZmluZQlfQVNNQVBJUCAqIF9BU01BUEkKKyNlbHNlCisjZGVmaW5lCV9BU01BUElQIF9BU01BUEkgKgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFVTRV9YODZfQVNNCisjZGVmaW5lIF9OT1JNQVBJIF9BU01BUEkKKyNkZWZpbmUgX05PUk1BUElQIF9BU01BUElQCisjZWxzZQorI2RlZmluZSBfTk9STUFQSQorI2RlZmluZSBfTk9STUFQSVAgKgorI2VuZGlmCisKKworLyogVHVybiBvZmYgbWFjcm8gY2hlY2tpbmcgc3lzdGVtcyB1c2VkIGJ5IG90aGVyIGxpYnJhcmllcyAqLworI2lmZGVmIENIRUNLCisjdW5kZWYgQ0hFQ0sKKyNlbmRpZgorCisKKy8qKgorICogQVNTRVJUIG1hY3JvCisgKi8KKyNpZiAhZGVmaW5lZChfV0lOMzJfV0NFKQorI2lmIGRlZmluZWQoREVCVUcpCisjICBkZWZpbmUgQVNTRVJUKFgpICAgYXNzZXJ0KFgpCisjZWxzZQorIyAgZGVmaW5lIEFTU0VSVChYKQorI2VuZGlmCisjZW5kaWYKKworCisvKioKKyAqIFN0YXRpYyAoY29tcGlsZS10aW1lKSBhc3NlcnRpb24uCisgKiBCYXNpY2FsbHksIHVzZSBDT05EIHRvIGRpbWVuc2lvbiBhbiBhcnJheS4gIElmIENPTkQgaXMgZmFsc2UvemVybyB0aGUKKyAqIGFycmF5IHNpemUgd2lsbCBiZSAtMSBhbmQgd2UnbGwgZ2V0IGEgY29tcGlsYXRpb24gZXJyb3IuCisgKi8KKworLyoqCisgKiBVbnJlYWNoYWJsZSBtYWNyby4gVXNlZnVsIGZvciBzdXBwcmVzc2luZyAiY29udHJvbCByZWFjaGVzIGVuZCBvZiBub24tdm9pZAorICogZnVuY3Rpb24iIHdhcm5pbmdzLgorICovCisjaWYgX19HTlVDX18gPj0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA1CisjZGVmaW5lIHVucmVhY2hhYmxlKCkgX19idWlsdGluX3VucmVhY2hhYmxlKCkKKyNlbGlmIChkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfX2hhc19idWlsdGluKSkKKyMgaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fdW5yZWFjaGFibGUpCisjICBkZWZpbmUgdW5yZWFjaGFibGUoKSBfX2J1aWx0aW5fdW5yZWFjaGFibGUoKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgdW5yZWFjaGFibGUKKyNkZWZpbmUgdW5yZWFjaGFibGUoKQorI2VuZGlmCisKKyNpZiAoX19HTlVDX18gPj0gMykKKyNkZWZpbmUgUFJJTlRGTElLRShmLCBhKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KF9fcHJpbnRmX18sIGYsIGEpKSkKKyNlbHNlCisjZGVmaW5lIFBSSU5URkxJS0UoZiwgYSkKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworLyogVXNlZCB0byBvcHRpb25hbGx5IG1hcmsgc3RydWN0dXJlcyB3aXRoIG1pc2FsaWduZWQgZWxlbWVudHMgb3Igc2l6ZSBhcworICogcGFja2VkLCB0byB0cmFkZSBvZmYgcGVyZm9ybWFuY2UgZm9yIHNwYWNlLgorICovCisjaWYgKF9fR05VQ19fID49IDMpCisjZGVmaW5lIFBBQ0tFRCBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkKKyNlbHNlCisjZGVmaW5lIFBBQ0tFRAorI2VuZGlmCisKKworLyoqCisgKiBMT05HU1RSSU5HIG1hY3JvCisgKiBnY2MgLXBlZGFudGljIHdhcm5zIGFib3V0IGxvbmcgc3RyaW5nIGxpdGVyYWxzLCBMT05HU1RSSU5HIHNpbGVuY2VzIHRoYXQuCisgKi8KKyNpZiAhZGVmaW5lZChfX0dOVUNfXykKKyMgZGVmaW5lIExPTkdTVFJJTkcKKyNlbHNlCisjIGRlZmluZSBMT05HU1RSSU5HIF9fZXh0ZW5zaW9uX18KKyNlbmRpZgorCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2KQorI2VuZGlmCisKKyNpZm5kZWYgTV9FCisjZGVmaW5lIE1fRSAoMi43MTgyODE4Mjg0NTkwNDUyMzU0KQorI2VuZGlmCisKKyNpZm5kZWYgTV9MT0cyRQorI2RlZmluZSBNX0xPRzJFICAgICAoMS40NDI2OTUwNDA4ODg5NjM0MDc0KQorI2VuZGlmCisKKyNpZm5kZWYgT05FX0RJVl9TUVJUX0xOMgorI2RlZmluZSBPTkVfRElWX1NRUlRfTE4yICgxLjIwMTEyMjQwODc4NjQ0OTgxNSkKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9NQVhfRVhQCisjZGVmaW5lIEZMVF9NQVhfRVhQIDEyOAorI2VuZGlmCisKKworLyoqCisgKiBVU0VfSUVFRTogRGV0ZXJtaW5lIGlmIHdlJ3JlIHVzaW5nIElFRUUgZmxvYXRpbmcgcG9pbnQKKyAqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX18zODZfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9fczM5MHhfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgXAorICAgIGRlZmluZWQoX194ODZfNjRfXykgfHwgXAorICAgIGRlZmluZWQoX19tNjhrX18pIHx8IFwKKyAgICBkZWZpbmVkKGlhNjQpIHx8IGRlZmluZWQoX19pYTY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9faHBwYV9fKSB8fCBkZWZpbmVkKGhwdXgpIHx8IFwKKyAgICBkZWZpbmVkKF9fbWlwcykgfHwgZGVmaW5lZChfTUlQU19BUkNIKSB8fCBcCisgICAgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBcCisgICAgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX19tMzJyX18pIHx8IFwKKyAgICAoZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfSUVFRV83NTQpKSB8fCBcCisgICAgZGVmaW5lZChfX2FscGhhX18pCisjZGVmaW5lIFVTRV9JRUVFCisjZGVmaW5lIElFRUVfT05FIDB4M2Y4MDAwMDAKKyNlbmRpZgorCisKKy8qKgorICogU1RBUlQvRU5EX0ZBU1RfTUFUSCBtYWNyb3M6CisgKgorICogU1RBUlRfRkFTVF9NQVRIOiBTZXQgeDg2IEZQVSB0byBmYXN0ZXIsIDMyLWJpdCBwcmVjaXNpb24gbW9kZSAoYW5kIHNhdmUKKyAqICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgbW9kZSB0byBhIHRlbXBvcmFyeSkuCisgKiBFTkRfRkFTVF9NQVRIOiBSZXN0b3JlIHg4NiBGUFUgdG8gb3JpZ2luYWwgbW9kZS4KKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pCisvKgorICogU2V0IHRoZSB4ODYgRlBVIGNvbnRyb2wgd29yZCB0byBndWFyYW50ZWUgb25seSAzMiBiaXRzIG9mIHByZWNpc2lvbgorICogYXJlIHN0b3JlZCBpbiByZWdpc3RlcnMuICBBbGxvd2luZyB0aGUgRlBVIHRvIHN0b3JlIG1vcmUgaW50cm9kdWNlcworICogZGlmZmVyZW5jZXMgYmV0d2VlbiBzaXR1YXRpb25zIHdoZXJlIG51bWJlcnMgYXJlIHB1bGxlZCBvdXQgb2YgbWVtb3J5CisgKiB2cy4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgY29tcGlsZXIgaXMgYWJsZSB0byBvcHRpbWl6ZSByZWdpc3RlciB1c2FnZS4KKyAqCisgKiBJbiB0aGUgd29yc3QgY2FzZSwgd2UgZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHVzZSBhIG1lbW9yeSBhY2Nlc3MgdG8KKyAqIHRydW5jYXRlIHRoZSBmbG9hdCwgYnkgc3BlY2lmeWluZyB0aGUgJ3ZvbGF0aWxlJyBrZXl3b3JkLgorICovCisvKiBIYXJkd2FyZSBkZWZhdWx0OiBBbGwgZXhjZXB0aW9ucyBtYXNrZWQsIGV4dGVuZGVkIGRvdWJsZSBwcmVjaXNpb24sCisgKiByb3VuZCB0byBuZWFyZXN0IChJRUVFIGNvbXBsaWFudCk6CisgKi8KKyNkZWZpbmUgREVGQVVMVF9YODZfRlBVCQkweDAzN2YKKy8qIEFsbCBleGNlcHRpb25zIG1hc2tlZCwgc2luZ2xlIHByZWNpc2lvbiwgcm91bmQgdG8gbmVhcmVzdDoKKyAqLworI2RlZmluZSBGQVNUX1g4Nl9GUFUJCTB4MDAzZgorLyogVGhlIGZsZGN3IGluc3RydWN0aW9uIHdpbGwgY2F1c2UgYW55IHBlbmRpbmcgRlAgZXhjZXB0aW9ucyB0byBiZQorICogcmFpc2VkIHByaW9yIHRvIGVudGVyaW5nIHRoZSBibG9jaywgYW5kIHdlIGNsZWFyIGFueSBwZW5kaW5nCisgKiBleGNlcHRpb25zIGJlZm9yZSBleGl0aW5nIHRoZSBibG9jay4gIEhlbmNlLCBhc20gY29kZSBoYXMgZnJlZQorICogcmVpZ24gb3ZlciB0aGUgRlBVIHdoaWxlIGluIHRoZSBmYXN0IG1hdGggYmxvY2suCisgKi8KKyNpZiBkZWZpbmVkKE5PX0ZBU1RfTUFUSCkKKyNkZWZpbmUgU1RBUlRfRkFTVF9NQVRIKHgpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgIHN0YXRpYyBHTHVpbnQgbWFzayA9IERFRkFVTFRfWDg2X0ZQVTsJCQkJXAorICAgX19hc21fXyAoICJmbnN0Y3cgJTAiIDogIj1tIiAoKiYoeCkpICk7CQkJCVwKKyAgIF9fYXNtX18gKCAiZmxkY3cgJTAiIDogOiAibSIgKG1hc2spICk7CQkJCVwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBTVEFSVF9GQVNUX01BVEgoeCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICAgc3RhdGljIEdMdWludCBtYXNrID0gRkFTVF9YODZfRlBVOwkJCQkJXAorICAgX19hc21fXyAoICJmbnN0Y3cgJTAiIDogIj1tIiAoKiYoeCkpICk7CQkJCVwKKyAgIF9fYXNtX18gKCAiZmxkY3cgJTAiIDogOiAibSIgKG1hc2spICk7CQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKy8qIFJlc3RvcmUgb3JpZ2luYWwgRlBVIG1vZGUsIGFuZCBjbGVhciBhbnkgZXhjZXB0aW9ucyB0aGF0IG1heSBoYXZlCisgKiBvY2N1cnJlZCBpbiB0aGUgRkFTVF9NQVRIIGJsb2NrLgorICovCisjZGVmaW5lIEVORF9GQVNUX01BVEgoeCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICAgX19hc21fXyAoICJmbmNsZXggOyBmbGRjdyAlMCIgOiA6ICJtIiAoKiYoeCkpICk7CQkJXAorfSB3aGlsZSAoMCkKKworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KQorI2RlZmluZSBERUZBVUxUX1g4Nl9GUFUJCTB4MDM3ZiAvKiBTZWUgR0NDIGNvbW1lbnRzIGFib3ZlICovCisjZGVmaW5lIEZBU1RfWDg2X0ZQVQkJMHgwMDNmIC8qIFNlZSBHQ0MgY29tbWVudHMgYWJvdmUgKi8KKyNpZiBkZWZpbmVkKE5PX0ZBU1RfTUFUSCkKKyNkZWZpbmUgU1RBUlRfRkFTVF9NQVRIKHgpIGRvIHtcCisJc3RhdGljIEdMdWludCBtYXNrID0gREVGQVVMVF9YODZfRlBVO1wKKwlfX2FzbSBmbnN0Y3cgd29yZCBwdHIgW3hdXAorCV9fYXNtIGZsZGN3IHdvcmQgcHRyIFttYXNrXVwKK30gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIFNUQVJUX0ZBU1RfTUFUSCh4KSBkbyB7XAorCXN0YXRpYyBHTHVpbnQgbWFzayA9IEZBU1RfWDg2X0ZQVTtcCisJX19hc20gZm5zdGN3IHdvcmQgcHRyIFt4XVwKKwlfX2FzbSBmbGRjdyB3b3JkIHB0ciBbbWFza11cCit9IHdoaWxlKDApCisjZW5kaWYKKyNkZWZpbmUgRU5EX0ZBU1RfTUFUSCh4KSBkbyB7XAorCV9fYXNtIGZuY2xleFwKKwlfX2FzbSBmbGRjdyB3b3JkIHB0ciBbeF1cCit9IHdoaWxlKDApCisKKyNlbHNlCisjZGVmaW5lIFNUQVJUX0ZBU1RfTUFUSCh4KSAgeCA9IDAKKyNkZWZpbmUgRU5EX0ZBU1RfTUFUSCh4KSAgKHZvaWQpKHgpCisjZW5kaWYKKworCisjaWZuZGVmIEVsZW1lbnRzCisjZGVmaW5lIEVsZW1lbnRzKHgpIChzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworLyoqCisgKiBNYWNybyBmdW5jdGlvbiB0aGF0IGV2YWx1YXRlcyB0byB0cnVlIGlmIFQgaXMgYSB0cml2aWFsbHkKKyAqIGRlc3RydWN0aWJsZSB0eXBlIC0tIHRoYXQgaXMsIGlmIGl0cyAobm9uLXZpcnR1YWwpIGRlc3RydWN0b3IKKyAqIHBlcmZvcm1zIG5vIGFjdGlvbiBhbmQgYWxsIG1lbWJlciB2YXJpYWJsZXMgYW5kIGJhc2UgY2xhc3NlcyBhcmUKKyAqIHRyaXZpYWxseSBkZXN0cnVjdGlibGUgdGhlbXNlbHZlcy4KKyAqLworIyAgIGlmIGRlZmluZWQoX19HTlVDX18pCisjICAgICAgaWYgKChfX0dOVUNfXyA+IDQpIHx8ICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSkKKyMgICAgICAgICBkZWZpbmUgSEFTX1RSSVZJQUxfREVTVFJVQ1RPUihUKSBfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoVCkKKyMgICAgICBlbmRpZgorIyAgIGVsaWYgKGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9faGFzX2ZlYXR1cmUpKQorIyAgICAgIGlmIF9faGFzX2ZlYXR1cmUoaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcikKKyMgICAgICAgICBkZWZpbmUgSEFTX1RSSVZJQUxfREVTVFJVQ1RPUihUKSBfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoVCkKKyMgICAgICBlbmRpZgorIyAgIGVuZGlmCisjICAgaWZuZGVmIEhBU19UUklWSUFMX0RFU1RSVUNUT1IKKyAgICAgICAvKiBJdCdzIGFsd2F5cyBzYWZlIChpZiBpbmVmZmljaWVudCkgdG8gYXNzdW1lIHRoYXQgYQorICAgICAgICAqIGRlc3RydWN0b3IgaXMgbm9uLXRyaXZpYWwuCisgICAgICAgICovCisjICAgICAgZGVmaW5lIEhBU19UUklWSUFMX0RFU1RSVUNUT1IoVCkgKGZhbHNlKQorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogQ09NUElMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9jb25maWcuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiMGFmYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vY29uZmlnLmgKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBWTXdhcmUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGNvbmZpZy5oCisgKiBUdW5hYmxlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAqLworCisjaWZuZGVmIE1FU0FfQ09ORklHX0hfSU5DTFVERUQKKyNkZWZpbmUgTUVTQV9DT05GSUdfSF9JTkNMVURFRAorCisKKy8qKgorICogXG5hbWUgT3BlbkdMIGltcGxlbWVudGF0aW9uIGxpbWl0cworICovCisvKkB7Ki8KKworLyoqIE1heGltdW0gbW9kZWx2aWV3IG1hdHJpeCBzdGFjayBkZXB0aCAqLworI2RlZmluZSBNQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIIDMyCisKKy8qKiBNYXhpbXVtIHByb2plY3Rpb24gbWF0cml4IHN0YWNrIGRlcHRoICovCisjZGVmaW5lIE1BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIIDMyCisKKy8qKiBNYXhpbXVtIHRleHR1cmUgbWF0cml4IHN0YWNrIGRlcHRoICovCisjZGVmaW5lIE1BWF9URVhUVVJFX1NUQUNLX0RFUFRIIDEwCisKKy8qKiBNYXhpbXVtIGF0dHJpYnV0ZSBzdGFjayBkZXB0aCAqLworI2RlZmluZSBNQVhfQVRUUklCX1NUQUNLX0RFUFRIIDE2CisKKy8qKiBNYXhpbXVtIGNsaWVudCBhdHRyaWJ1dGUgc3RhY2sgZGVwdGggKi8KKyNkZWZpbmUgTUFYX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEggMTYKKworLyoqIE1heGltdW0gcmVjdXJzaW9uIGRlcHRoIG9mIGRpc3BsYXkgbGlzdCBjYWxscyAqLworI2RlZmluZSBNQVhfTElTVF9ORVNUSU5HIDY0CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBsaWdodHMgKi8KKyNkZWZpbmUgTUFYX0xJR0hUUyA4CisKKy8qKgorICogTWF4aW11bSBudW1iZXIgb2YgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcyBzdXBwb3J0ZWQgYnkgYW55IGRyaXZlciBpbgorICogTWVzYS4gIFRoaXMgaXMgdXNlZCB0byBzaXplIGFycmF5cy4KKyAqLworI2RlZmluZSBNQVhfQ0xJUF9QTEFORVMgOAorCisvKiogTWF4aW11bSBwaXhlbCBtYXAgbG9va3VwIHRhYmxlIHNpemUgKi8KKyNkZWZpbmUgTUFYX1BJWEVMX01BUF9UQUJMRSAyNTYKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGF1eGlsaWFyeSBjb2xvciBidWZmZXJzICovCisjZGVmaW5lIE1BWF9BVVhfQlVGRkVSUyAxCisKKy8qKiBNYXhpbXVtIG9yZGVyIChkZWdyZWUpIG9mIGN1cnZlcyAqLworI2RlZmluZSBNQVhfRVZBTF9PUkRFUiAzMAorCisvKiogTWF4aW11bSBOYW1lIHN0YWNrIGRlcHRoICovCisjZGVmaW5lIE1BWF9OQU1FX1NUQUNLX0RFUFRIIDY0CisKKy8qKiBNaW5pbXVtIHBvaW50IHNpemUgKi8KKyNkZWZpbmUgTUlOX1BPSU5UX1NJWkUgMS4wCisvKiogTWF4aW11bSBwb2ludCBzaXplICovCisjZGVmaW5lIE1BWF9QT0lOVF9TSVpFIDYwLjAKKy8qKiBQb2ludCBzaXplIGdyYW51bGFyaXR5ICovCisjZGVmaW5lIFBPSU5UX1NJWkVfR1JBTlVMQVJJVFkgMC4xCisKKy8qKiBNaW5pbXVtIGxpbmUgd2lkdGggKi8KKyNkZWZpbmUgTUlOX0xJTkVfV0lEVEggMS4wCisvKiogTWF4aW11bSBsaW5lIHdpZHRoICovCisjZGVmaW5lIE1BWF9MSU5FX1dJRFRIIDEwLjAKKy8qKiBMaW5lIHdpZHRoIGdyYW51bGFyaXR5ICovCisjZGVmaW5lIExJTkVfV0lEVEhfR1JBTlVMQVJJVFkgMC4xCisKKy8qKiBNYXggbWVtb3J5IHRvIGFsbG93IGZvciBhIHNpbmdsZSB0ZXh0dXJlIGltYWdlIChpbiBtZWdhYnl0ZXMpICovCisjZGVmaW5lIE1BWF9URVhUVVJFX01CWVRFUyAxMDI0CisKKy8qKiBOdW1iZXIgb2YgMUQvMkQgdGV4dHVyZSBtaXBtYXAgbGV2ZWxzICovCisjZGVmaW5lIE1BWF9URVhUVVJFX0xFVkVMUyAxNQorCisvKiogTnVtYmVyIG9mIDNEIHRleHR1cmUgbWlwbWFwIGxldmVscyAqLworI2RlZmluZSBNQVhfM0RfVEVYVFVSRV9MRVZFTFMgMTUKKworLyoqIE51bWJlciBvZiBjdWJlIHRleHR1cmUgbWlwbWFwIGxldmVscyAtIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwICovCisjZGVmaW5lIE1BWF9DVUJFX1RFWFRVUkVfTEVWRUxTIDE1CisKKy8qKiBNYXhpbXVtIHJlY3Rhbmd1bGFyIHRleHR1cmUgc2l6ZSAtIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlICovCisjZGVmaW5lIE1BWF9URVhUVVJFX1JFQ1RfU0laRSAxNjM4NAorCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIGxheWVycyBpbiBhIDFEIG9yIDJEIGFycmF5IHRleHR1cmUgLSBHTF9NRVNBX3RleHR1cmVfYXJyYXkKKyAqLworI2RlZmluZSBNQVhfQVJSQVlfVEVYVFVSRV9MQVlFUlMgNjQKKworLyoqCisgKiBNYXggbnVtYmVyIG9mIHRleHR1cmUgY29vcmRpbmF0ZSB1bml0cy4gIFRoaXMgbWFpbmx5IGp1c3QgYXBwbGllcyB0bworICogdGhlIGZpeGVkLWZ1bmN0aW9uIHZlcnRleCBjb2RlLiAgVGhpcyB3aWxsIGJlIGRpZmZpY3VsdCB0byByYWlzZSBhYm92ZQorICogZWlnaHQgYmVjYXVzZSBvZiB2YXJpb3VzIHZlcnRleCBhdHRyaWJ1dGUgYml0dmVjdG9ycy4KKyAqLworI2RlZmluZSBNQVhfVEVYVFVSRV9DT09SRF9VTklUUyA4CisKKy8qKgorICogTWF4IG51bWJlciBvZiB0ZXh0dXJlIGltYWdlIHVuaXRzLiAgQWxzbyBkZXRlcm1pbmVzIG51bWJlciBvZiB0ZXh0dXJlCisgKiBzYW1wbGVycyBpbiBzaGFkZXJzLgorICovCisjZGVmaW5lIE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIDMyCisKKy8qKgorICogTGFyZ2VyIG9mIE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTIGFuZCBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUy4KKyAqIFRoaXMgdmFsdWUgaXMgb25seSB1c2VkIGZvciBkaW1lbnNpb25pbmcgYXJyYXlzLgorICogRWl0aGVyIE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTIG9yIE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIChvciB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgY3R4LT5Db25zdC5NYXhUZXh0dXJlQ29vcmQvSW1hZ2VVbml0cyBmaWVsZHMpIHNob3VsZCBiZQorICogdXNlZCBhbG1vc3QgZXZlcnl3aGVyZSBlbHNlLgorICovCisjZGVmaW5lIE1BWF9URVhUVVJFX1VOSVRTICgoTUFYX1RFWFRVUkVfQ09PUkRfVU5JVFMgPiBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUykgPyBNQVhfVEVYVFVSRV9DT09SRF9VTklUUyA6IE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKQorCisKKy8qKiBNYXhpbXVtIHZpZXdwb3J0IHNpemUgKi8KKyNkZWZpbmUgTUFYX1ZJRVdQT1JUX1dJRFRIIDE2Mzg0CisjZGVmaW5lIE1BWF9WSUVXUE9SVF9IRUlHSFQgMTYzODQKKworLyoqIE1heGltdW4gbnVtYmVyIG9mIHZpZXdwb3J0cyBzdXBwb3J0ZWQgd2l0aCBBUkJfdmlld3BvcnRfYXJyYXkgKi8KKyNkZWZpbmUgTUFYX1ZJRVdQT1JUUyAxNgorCisvKiogTWF4bWltdW0gc2l6ZSBmb3IgQ1ZBLiAgTWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGRyaXZlcnMuICAqLworI2RlZmluZSBNQVhfQVJSQVlfTE9DS19TSVpFIDMwMDAKKworLyoqIFN1YnBpeGVsIHByZWNpc2lvbiBmb3IgYW50aWFsaWFzaW5nLCB3aW5kb3cgY29vcmRpbmF0ZSBzbmFwcGluZyAqLworI2RlZmluZSBTVUJfUElYRUxfQklUUyA0CisKKy8qKiBGb3IgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgTUFYX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDI1CisKKy8qKiBGb3IgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCisjZGVmaW5lIE1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZIDE2LjAKKworLyoqIEZvciBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAodHlwaWNhbGx5IE1BWF9URVhUVVJFX0xFVkVMUyAtIDEpICovCisjZGVmaW5lIE1BWF9URVhUVVJFX0xPRF9CSUFTIDE0LjAKKworLyoqIEZvciBhbnkgcHJvZ3JhbSB0YXJnZXQvZXh0ZW5zaW9uICovCisvKkB7Ki8KKyNkZWZpbmUgTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TICAgICAgICgxNiAqIDEwMjQpCisKKy8qKgorICogUGVyLXByb2dyYW0gY29uc3RhbnRzIChwb3dlciBvZiB0d28pCisgKgorICogXGMgTUFYX1BST0dSQU1fTE9DQUxfUEFSQU1TIGFuZCBcYyBNQVhfVU5JRk9STVMgYXJlIGp1c3QgdGhlIGFzc2VtYmx5IHNoYWRlcgorICogYW5kIEdMU0wgc2hhZGVyIG5hbWVzIGZvciB0aGUgc2FtZSB0aGluZy4gIFRoZXkgc2hvdWxkIFxiIGFsd2F5cyBoYXZlIHRoZQorICogc2FtZSB2YWx1ZS4gIEVhY2ggcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgdmVjNCB2YWx1ZXMgc3VwcGxpZWQgYXMKKyAqIHBlci1wcm9ncmFtIHBhcmFtZXRlcnMuCisgKi8KKy8qQHsqLworI2RlZmluZSBNQVhfUFJPR1JBTV9MT0NBTF9QQVJBTVMgICAgICAgNDA5NgorI2RlZmluZSBNQVhfVU5JRk9STVMgICAgICAgICAgICAgICAgICAgNDA5NgorI2RlZmluZSBNQVhfVU5JRk9STV9CVUZGRVJTICAgICAgICAgICAgMTUgLyogKyAxIGRlZmF1bHQgdW5pZm9ybSBidWZmZXIgKi8KKy8qIDYgaXMgZm9yIHZlcnRleCwgaHVsbCwgZG9tYWluLCBnZW9tZXRyeSwgZnJhZ21lbnQsIGFuZCBjb21wdXRlIHNoYWRlci4gKi8KKyNkZWZpbmUgTUFYX0NPTUJJTkVEX1VOSUZPUk1fQlVGRkVSUyAgIChNQVhfVU5JRk9STV9CVUZGRVJTICogNikKKyNkZWZpbmUgTUFYX0FUT01JQ19DT1VOVEVSUyAgICAgICAgICAgIDQwOTYKKy8qIDYgaXMgZm9yIHZlcnRleCwgaHVsbCwgZG9tYWluLCBnZW9tZXRyeSwgZnJhZ21lbnQsIGFuZCBjb21wdXRlIHNoYWRlci4gKi8KKyNkZWZpbmUgTUFYX0NPTUJJTkVEX0FUT01JQ19CVUZGRVJTICAgIChNQVhfVU5JRk9STV9CVUZGRVJTICogNikKKy8qIFNpemUgb2YgYW4gYXRvbWljIGNvdW50ZXIgaW4gYnl0ZXMgYWNjb3JkaW5nIHRvIEFSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzICovCisjZGVmaW5lIEFUT01JQ19DT1VOVEVSX1NJWkUgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9JTUFHRV9VTklGT1JNUyAgICAgICAgICAgICAxNgorLyogNiBpcyBmb3IgdmVydGV4LCBodWxsLCBkb21haW4sIGdlb21ldHJ5LCBmcmFnbWVudCwgYW5kIGNvbXB1dGUgc2hhZGVyLiAqLworI2RlZmluZSBNQVhfSU1BR0VfVU5JVFMgICAgICAgICAgICAgICAgKE1BWF9JTUFHRV9VTklGT1JNUyAqIDYpCisvKkB9Ki8KKworLyoqCisgKiBQZXItY29udGV4dCBjb25zdGFudHMgKHBvd2VyIG9mIHR3bykKKyAqCisgKiBcbm90ZQorICogVGhpcyB2YWx1ZSBzaG91bGQgYWx3YXlzIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBcYyBNQVhfUFJPR1JBTV9MT0NBTF9QQVJBTVMKKyAqIGFuZCBcYyBNQVhfVkVSVEVYX1BST0dSQU1fUEFSQU1TLiAgT3RoZXJ3aXNlIHNvbWUgYXBwbGljYXRpb25zIHdpbGwgbWFrZQorICogaW5jb3JyZWN0IGFzc3VtcHRpb25zLgorICovCisjZGVmaW5lIE1BWF9QUk9HUkFNX0VOVl9QQVJBTVMgICAgICAgICAyNTYKKworI2RlZmluZSBNQVhfUFJPR1JBTV9NQVRSSUNFUyAgICAgICAgICAgOAorI2RlZmluZSBNQVhfUFJPR1JBTV9NQVRSSVhfU1RBQ0tfREVQVEggNAorI2RlZmluZSBNQVhfUFJPR1JBTV9DQUxMX0RFUFRIICAgICAgICAgOAorI2RlZmluZSBNQVhfUFJPR1JBTV9URU1QUyAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9QUk9HUkFNX0FERFJFU1NfUkVHUyAgICAgICAxCisjZGVmaW5lIE1BWF9WQVJZSU5HICAgICAgICAgICAgICAgICAgICAzMiAgICAvKio8IG51bWJlciBvZiBmbG9hdFs0XSB2ZWN0b3JzICovCisjZGVmaW5lIE1BWF9TQU1QTEVSUyAgICAgICAgICAgICAgICAgICBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUworI2RlZmluZSBNQVhfUFJPR1JBTV9JTlBVVFMgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTUFYX1BST0dSQU1fT1VUUFVUUyAgICAgICAgICAgIDY0CisvKkB9Ki8KKworLyoqIEZvciBHTF9BUkJfdmVydGV4X3Byb2dyYW0gKi8KKy8qQHsqLworI2RlZmluZSBNQVhfVkVSVEVYX1BST0dSQU1fQUREUkVTU19SRUdTIDEKKyNkZWZpbmUgTUFYX1ZFUlRFWF9QUk9HUkFNX1BBUkFNUyAgICAgICBNQVhfVU5JRk9STVMKKy8qQH0qLworCisvKiogRm9yIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtICovCisvKkB7Ki8KKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX1BST0dSQU1fQUREUkVTU19SRUdTIDAKKy8qQH0qLworCisvKiogRm9yIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0gKi8KKy8qQHsqLworI2RlZmluZSBNQVhfTlZfRlJBR01FTlRfUFJPR1JBTV9JTlNUUlVDVElPTlMgMTAyNCAvKiA3MiBmb3IgR0xfQVJCX2ZfcCAqLworI2RlZmluZSBNQVhfTlZfRlJBR01FTlRfUFJPR1JBTV9URU1QUyAgICAgICAgIDk2CisjZGVmaW5lIE1BWF9OVl9GUkFHTUVOVF9QUk9HUkFNX1BBUkFNUyAgICAgICAgNjQKKyNkZWZpbmUgTUFYX05WX0ZSQUdNRU5UX1BST0dSQU1fSU5QVVRTICAgICAgICAxMgorI2RlZmluZSBNQVhfTlZfRlJBR01FTlRfUFJPR1JBTV9PVVRQVVRTICAgICAgICAzCisjZGVmaW5lIE1BWF9OVl9GUkFHTUVOVF9QUk9HUkFNX1dSSVRFX09OTFlTICAgIDIKKy8qQH0qLworCisKKy8qKiBGb3IgR0xfQVJCX3ZlcnRleF9zaGFkZXIgKi8KKy8qQHsqLworI2RlZmluZSBNQVhfVkVSVEVYX0dFTkVSSUNfQVRUUklCUyAxNgorLyogNiBpcyBmb3IgdmVydGV4LCBodWxsLCBkb21haW4sIGdlb21ldHJ5LCBmcmFnbWVudCwgYW5kIGNvbXB1dGUgc2hhZGVyLiAqLworI2RlZmluZSBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAoTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKiA2KQorLypAfSovCisKKworLyoqIEZvciBHTF9BUkJfZHJhd19idWZmZXJzICovCisvKkB7Ki8KKyNkZWZpbmUgTUFYX0RSQVdfQlVGRkVSUyA4CisvKkB9Ki8KKworCisvKiogRm9yIEdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKy8qQHsqLworI2RlZmluZSBNQVhfQ09MT1JfQVRUQUNITUVOVFMgOAorI2RlZmluZSBNQVhfUkVOREVSQlVGRkVSX1NJWkUgMTYzODQKKy8qQH0qLworCisvKiogRm9yIEdMX0FUSV9lbnZtYXBfYnVtcCAtIHN1cHBvcnQgYnVtcCBtYXBwaW5nIG9uIGZpcnN0IDggdW5pdHMgKi8KKyNkZWZpbmUgU1VQUE9SVEVEX0FUSV9CVU1QX1VOSVRTIDB4ZmYKKworLyoqIEZvciBHTF9FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrICovCisjZGVmaW5lIE1BWF9GRUVEQkFDS19CVUZGRVJTIDQKKyNkZWZpbmUgTUFYX0ZFRURCQUNLX0FUVFJJQlMgMzIKKworLyoqIEZvciBHTF9BUkJfZ2VvbWV0cnlfc2hhZGVyNCAqLworLypAeyovCisjZGVmaW5lIE1BWF9HRU9NRVRSWV9VTklGT1JNX0NPTVBPTkVOVFMgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBNQVhfR0VPTUVUUllfT1VUUFVUX1ZFUlRJQ0VTICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgTUFYX0dFT01FVFJZX1RPVEFMX09VVFBVVF9DT01QT05FTlRTICAgICAgICAgMTAyNAorLypAfSovCisKKy8qKiBGb3IgR0xfQVJCX2RlYnVnX291dHB1dCBhbmQgR0xfS0hSX2RlYnVnICovCisvKkB7Ki8KKyNkZWZpbmUgTUFYX0RFQlVHX0xPR0dFRF9NRVNTQUdFUyAgIDEwCisjZGVmaW5lIE1BWF9ERUJVR19NRVNTQUdFX0xFTkdUSCAgICA0MDk2CisvKkB9Ki8KKworLyoqIEZvciBHTF9LSFJfZGVidWcgKi8KKy8qQHsqLworI2RlZmluZSBNQVhfTEFCRUxfTEVOR1RIIDI1NgorI2RlZmluZSBNQVhfREVCVUdfR1JPVVBfU1RBQ0tfREVQVEggNjQKKy8qQH0qLworCisvKiogRm9yIEdMX0FSQl9ncHVfc2hhZGVyNSAqLworLypAeyovCisjZGVmaW5lIE1BWF9HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlMgICAgIDMyCisjZGVmaW5lIE1JTl9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVCAgIC0wLjUKKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUICAgMC41CisjZGVmaW5lIEZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUX0JJVFMgIDQKKyNkZWZpbmUgTUFYX1ZFUlRFWF9TVFJFQU1TICAgICAgICAgICAgICAgICAgNAorLypAfSovCisKKy8qKiBGb3IgR0xfSU5URUxfcGVyZm9ybWFuY2VfcXVlcnkgKi8KKy8qQHsqLworI2RlZmluZSBNQVhfUEVSRlFVRVJZX1FVRVJZX05BTUVfTEVOR1RIICAgICAyNTYKKyNkZWZpbmUgTUFYX1BFUkZRVUVSWV9DT1VOVEVSX05BTUVfTEVOR1RIICAgMjU2CisjZGVmaW5lIE1BWF9QRVJGUVVFUllfQ09VTlRFUl9ERVNDX0xFTkdUSCAgIDEwMjQKKyNkZWZpbmUgUEVSRlFVRVJZX0hBVkVfR1BBX0VYVEVOREVEX0NPVU5URVJTIDAKKy8qQH0qLworCisvKgorICogQ29sb3IgY2hhbm5lbCBjb21wb25lbnQgb3JkZXIKKyAqIAorICogXG5vdGUgQ2hhbmdlcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgY2F1c2UgcHJvYmxlbXMgYXQgdGhpcyB0aW1lLgorICovCisjZGVmaW5lIFJDT01QIDAKKyNkZWZpbmUgR0NPTVAgMQorI2RlZmluZSBCQ09NUCAyCisjZGVmaW5lIEFDT01QIDMKKworCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIHRlbXBvcmFyeSB2ZXJ0aWNlcyByZXF1aXJlZCBmb3IgY2xpcHBpbmcuICAKKyAqCisgKiBVc2VkIGluIGFycmF5X2NhY2hlIGFuZCB0bmwgbW9kdWxlcy4KKyAqLworI2RlZmluZSBNQVhfQ0xJUFBFRF9WRVJUSUNFUyAoKDIgKiAoNiArIE1BWF9DTElQX1BMQU5FUykpKzEpCisKKy8qKgorICogTWF4aW11bSBudW1iZXIgb2YgYnVpbHRpbiBzdGF0ZSBiYWNraW5nIHVwIGEgdW5pZm9ybSB2YXJpYWJsZS4KKyAqLworI2RlZmluZSBNQVhfTlVNX1NUQVRFX1NMT1RTIDk2CisKKyNlbmRpZiAvKiBNRVNBX0NPTkZJR19IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2NvbnRleHQuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MGVkODYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2NvbnRleHQuYwpAQCAtMCwwICsxLDE5ODggQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBWTXdhcmUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGNvbnRleHQuYworICogTWVzYSBjb250ZXh0L3Zpc3VhbC9mcmFtZWJ1ZmZlciBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KKyAqIFxhdXRob3IgQnJpYW4gUGF1bAorICovCisKKy8qKgorICogXG1haW5wYWdlIE1lc2EgTWFpbiBNb2R1bGUKKyAqCisgKiBcc2VjdGlvbiBNYWluSW50cm9kdWN0aW9uIEludHJvZHVjdGlvbgorICoKKyAqIFRoZSBNZXNhIE1haW4gbW9kdWxlIGNvbnNpc3RzIG9mIGFsbCB0aGUgZmlsZXMgaW4gdGhlIG1haW4vIGRpcmVjdG9yeS4KKyAqIEFtb25nIHRoZSBmZWF0dXJlcyBvZiB0aGlzIG1vZHVsZSBhcmU6CisgKiA8VUw+CisgKiA8TEk+IFN0cnVjdHVyZXMgdG8gcmVwcmVzZW50IG1vc3QgR0wgc3RhdGUgPC9MST4KKyAqIDxMST4gU3RhdGUgc2V0L2dldCBmdW5jdGlvbnMgPC9MST4KKyAqIDxMST4gRGlzcGxheSBsaXN0cyA8L0xJPgorICogPExJPiBUZXh0dXJlIHVuaXQsIG9iamVjdCBhbmQgaW1hZ2UgaGFuZGxpbmcgPC9MST4KKyAqIDxMST4gTWF0cml4IGFuZCBhdHRyaWJ1dGUgc3RhY2tzIDwvTEk+CisgKiA8L1VMPgorICoKKyAqIE90aGVyIG1vZHVsZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBBUEkgZGlzcGF0Y2gsIHZlcnRleCB0cmFuc2Zvcm1hdGlvbiwKKyAqIHBvaW50L2xpbmUvdHJpYW5nbGUgc2V0dXAsIHJhc3Rlcml6YXRpb24sIHZlcnRleCBhcnJheSBjYWNoaW5nLAorICogdmVydGV4L2ZyYWdtZW50IHByb2dyYW1zL3NoYWRlcnMsIGV0Yy4KKyAqCisgKgorICogXHNlY3Rpb24gQWJvdXREb3h5Z2VuIEFib3V0IERveHlnZW4KKyAqCisgKiBJZiB5b3UncmUgdmlld2luZyB0aGlzIGluZm9ybWF0aW9uIGFzIERveHlnZW4tZ2VuZXJhdGVkIEhUTUwgeW91J2xsCisgKiBzZWUgdGhlIGRvY3VtZW50YXRpb24gaW5kZXggYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UuCisgKgorICogVGhlIGZpcnN0IGxpbmUgbGlzdHMgdGhlIE1lc2Egc291cmNlIGNvZGUgbW9kdWxlcy4KKyAqIFRoZSBzZWNvbmQgbGluZSBsaXN0cyB0aGUgaW5kZXhlcyBhdmFpbGFibGUgZm9yIHZpZXdpbmcgdGhlIGRvY3VtZW50YXRpb24KKyAqIGZvciBlYWNoIG1vZHVsZS4KKyAqCisgKiBTZWxlY3RpbmcgdGhlIDxiPk1haW4gcGFnZTwvYj4gbGluayB3aWxsIGRpc3BsYXkgYSBzdW1tYXJ5IG9mIHRoZSBtb2R1bGUKKyAqICh0aGlzIHBhZ2UpLgorICoKKyAqIFNlbGVjdGluZyA8Yj5EYXRhIFN0cnVjdHVyZXM8L2I+IHdpbGwgbGlzdCBhbGwgQyBzdHJ1Y3R1cmVzLgorICoKKyAqIFNlbGVjdGluZyB0aGUgPGI+RmlsZSBMaXN0PC9iPiBsaW5rIHdpbGwgbGlzdCBhbGwgdGhlIHNvdXJjZSBmaWxlcyBpbgorICogdGhlIG1vZHVsZS4KKyAqIFNlbGVjdGluZyBhIGZpbGVuYW1lIHdpbGwgc2hvdyBhIGxpc3Qgb2YgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoYXQgZmlsZS4KKyAqCisgKiBTZWxlY3RpbmcgdGhlIDxiPkRhdGEgRmllbGRzPC9iPiBsaW5rIHdpbGwgZGlzcGxheSBhIGxpc3Qgb2YgYWxsCisgKiBkb2N1bWVudGVkIHN0cnVjdHVyZSBtZW1iZXJzLgorICoKKyAqIFNlbGVjdGluZyB0aGUgPGI+R2xvYmFsczwvYj4gbGluayB3aWxsIGRpc3BsYXkgYSBsaXN0CisgKiBvZiBhbGwgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzLCBnbG9iYWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgaW4gdGhlIG1vZHVsZS4KKyAqCisgKi8KKworCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAiYWNjdW0uaCIKKyNpbmNsdWRlICJhcGlfZXhlYy5oIgorI2luY2x1ZGUgImFwaV9sb29wYmFjay5oIgorI2luY2x1ZGUgImFycmF5b2JqLmgiCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiYmxlbmQuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisjaW5jbHVkZSAiYnVmZmVyb2JqLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgImNwdWluZm8uaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImRlcHRoLmgiCisjaW5jbHVkZSAiZGxpc3QuaCIKKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAiZXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgImZib2JqZWN0LmgiCisjaW5jbHVkZSAiZmVlZGJhY2suaCIKKyNpbmNsdWRlICJmb2cuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJoaW50LmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgImxpZ2h0LmgiCisjaW5jbHVkZSAibGluZXMuaCIKKyNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlICJtYXRyaXguaCIKKyNpbmNsdWRlICJtdWx0aXNhbXBsZS5oIgorI2luY2x1ZGUgInBlcmZvcm1hbmNlX21vbml0b3IuaCIKKyNpbmNsdWRlICJwaXBlbGluZW9iai5oIgorI2luY2x1ZGUgInBpeGVsLmgiCisjaW5jbHVkZSAicGl4ZWxzdG9yZS5oIgorI2luY2x1ZGUgInBvaW50cy5oIgorI2luY2x1ZGUgInBvbHlnb24uaCIKKyNpbmNsdWRlICJxdWVyeW9iai5oIgorI2luY2x1ZGUgInNoYWRlcmFwaS5oIgorI2luY2x1ZGUgInN5bmNvYmouaCIKKyNpbmNsdWRlICJyYXN0cG9zLmgiCisjaW5jbHVkZSAicmVtYXAuaCIKKyNpbmNsdWRlICJzY2lzc29yLmgiCisjaW5jbHVkZSAic2hhcmVkLmgiCisjaW5jbHVkZSAic2hhZGVyb2JqLmgiCisjaW5jbHVkZSAic2ltcGxlX2xpc3QuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgInN0ZW5jaWwuaCIKKyNpbmNsdWRlICJ0ZXhjb21wcmVzc19zM3RjLmgiCisjaW5jbHVkZSAidGV4c3RhdGUuaCIKKyNpbmNsdWRlICJ0cmFuc2Zvcm1mZWVkYmFjay5oIgorI2luY2x1ZGUgIm10eXBlcy5oIgorI2luY2x1ZGUgInZhcnJheS5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJ2aWV3cG9ydC5oIgorI2luY2x1ZGUgInZ0eGZtdC5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ3JhbS5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wcmludC5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19kaXNrY2FjaGUuaCIKKyNpbmNsdWRlICJtYXRoL21fbWF0cml4LmgiCisjaW5jbHVkZSAibWFpbi9kaXNwYXRjaC5oIiAvKiBmb3IgX2dsb2Zmc2V0X0NPVU5UICovCisKKyNpZmRlZiBVU0VfU1BBUkNfQVNNCisjaW5jbHVkZSAic3BhcmMvc3BhcmMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAidGhyZWFkcG9vbC5oIgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworCisjaWZuZGVmIE1FU0FfVkVSQk9TRQoraW50IE1FU0FfVkVSQk9TRSA9IDA7CisjZW5kaWYKKworI2lmbmRlZiBNRVNBX0RFQlVHX0ZMQUdTCitpbnQgTUVTQV9ERUJVR19GTEFHUyA9IDA7CisjZW5kaWYKKworCisvKiB1Ynl0ZSAtPiBmbG9hdCBjb252ZXJzaW9uICovCitHTGZsb2F0IF9tZXNhX3VieXRlX3RvX2Zsb2F0X2NvbG9yX3RhYlsyNTZdOworCisKKworLyoqCisgKiBTd2FwIGJ1ZmZlcnMgbm90aWZpY2F0aW9uIGNhbGxiYWNrLgorICogCisgKiBccGFyYW0gY3R4IEdMIGNvbnRleHQuCisgKgorICogQ2FsbGVkIGJ5IHdpbmRvdyBzeXN0ZW0ganVzdCBiZWZvcmUgc3dhcHBpbmcgYnVmZmVycy4KKyAqIFdlIGhhdmUgdG8gZmluaXNoIGFueSBwZW5kaW5nIHJlbmRlcmluZy4KKyAqLwordm9pZAorX21lc2Ffbm90aWZ5U3dhcEJ1ZmZlcnMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIGlmIChNRVNBX1ZFUkJPU0UgJiBWRVJCT1NFX1NXQVBCVUZGRVJTKQorICAgICAgX21lc2FfZGVidWcoY3R4LCAiU3dhcEJ1ZmZlcnNcbiIpOworICAgRkxVU0hfQ1VSUkVOVCggY3R4LCAwICk7CisgICBpZiAoY3R4LT5Ecml2ZXIuRmx1c2gpIHsKKyAgICAgIGN0eC0+RHJpdmVyLkZsdXNoKGN0eCk7CisgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgR0wgVmlzdWFsIGFsbG9jYXRpb24vZGVzdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypAeyovCisKKy8qKgorICogQWxsb2NhdGVzIGEgc3RydWN0IGdsX2NvbmZpZyBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpemVzIGl0IHZpYQorICogX21lc2FfaW5pdGlhbGl6ZV92aXN1YWwoKS4KKyAqIAorICogXHBhcmFtIGRiRmxhZyBkb3VibGUgYnVmZmVyaW5nCisgKiBccGFyYW0gc3RlcmVvRmxhZyBzdGVyZW8gYnVmZmVyCisgKiBccGFyYW0gZGVwdGhCaXRzIHJlcXVlc3RlZCBiaXRzIHBlciBkZXB0aCBidWZmZXIgdmFsdWUuIEFueSB2YWx1ZSBpbiBbMCwgMzJdCisgKiBpcyBhY2NlcHRhYmxlIGJ1dCB0aGUgYWN0dWFsIGRlcHRoIHR5cGUgd2lsbCBiZSBHTHVzaG9ydCBvciBHTHVpbnQgYXMKKyAqIG5lZWRlZC4KKyAqIFxwYXJhbSBzdGVuY2lsQml0cyByZXF1ZXN0ZWQgbWluaW11bSBiaXRzIHBlciBzdGVuY2lsIGJ1ZmZlciB2YWx1ZQorICogXHBhcmFtIGFjY3VtUmVkQml0cywgYWNjdW1HcmVlbkJpdHMsIGFjY3VtQmx1ZUJpdHMsIGFjY3VtQWxwaGFCaXRzIG51bWJlcgorICogb2YgYml0cyBwZXIgY29sb3IgY29tcG9uZW50IGluIGFjY3VtIGJ1ZmZlci4KKyAqIFxwYXJhbSBpbmRleEJpdHMgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIGlmIFxwIHJnYkZsYWcgaXMgR0xfRkFMU0UKKyAqIFxwYXJhbSByZWRCaXRzIG51bWJlciBvZiBiaXRzIHBlciBjb2xvciBjb21wb25lbnQgaW4gZnJhbWUgYnVmZmVyIGZvciBSR0IoQSkKKyAqIG1vZGUuICBXZSBhbHdheXMgdXNlIDggaW4gY29yZSBNZXNhIHRob3VnaC4KKyAqIFxwYXJhbSBncmVlbkJpdHMgc2FtZSBhcyBhYm92ZS4KKyAqIFxwYXJhbSBibHVlQml0cyBzYW1lIGFzIGFib3ZlLgorICogXHBhcmFtIGFscGhhQml0cyBzYW1lIGFzIGFib3ZlLgorICogXHBhcmFtIG51bVNhbXBsZXMgbm90IHJlYWxseSB1c2VkLgorICogCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gbmV3IHN0cnVjdCBnbF9jb25maWcgb3IgTlVMTCBpZiByZXF1ZXN0ZWQgcGFyYW1ldGVycworICogY2FuJ3QgYmUgbWV0LgorICoKKyAqIFxub3RlIE5lZWQgdG8gYWRkIHBhcmFtcyBmb3IgbGV2ZWwgYW5kIG51bUF1eEJ1ZmZlcnMgKGF0IGxlYXN0KQorICovCitzdHJ1Y3QgZ2xfY29uZmlnICoKK19tZXNhX2NyZWF0ZV92aXN1YWwoIEdMYm9vbGVhbiBkYkZsYWcsCisgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gc3RlcmVvRmxhZywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IHJlZEJpdHMsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBncmVlbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBibHVlQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGFscGhhQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGRlcHRoQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IHN0ZW5jaWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYWNjdW1SZWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYWNjdW1HcmVlbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBhY2N1bUJsdWVCaXRzLAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYWNjdW1BbHBoYUJpdHMsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBudW1TYW1wbGVzICkKK3sKKyAgIHN0cnVjdCBnbF9jb25maWcgKnZpcyA9IENBTExPQ19TVFJVQ1QoZ2xfY29uZmlnKTsKKyAgIGlmICh2aXMpIHsKKyAgICAgIGlmICghX21lc2FfaW5pdGlhbGl6ZV92aXN1YWwodmlzLCBkYkZsYWcsIHN0ZXJlb0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZEJpdHMsIGdyZWVuQml0cywgYmx1ZUJpdHMsIGFscGhhQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaXRzLCBzdGVuY2lsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW1SZWRCaXRzLCBhY2N1bUdyZWVuQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW1CbHVlQml0cywgYWNjdW1BbHBoYUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpKSB7CisgICAgICAgICBmcmVlKHZpcyk7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiB2aXM7Cit9CisKKworLyoqCisgKiBNYWtlcyBzb21lIHNhbml0eSBjaGVja3MgYW5kIGZpbGxzIGluIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICogZ2xfY29uZmlnIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiAgSWYgdGhlIGNhbGxlciBuZWVkcyB0bworICogc2V0IGFkZGl0aW9uYWwgZmllbGRzLCBoZSBzaG91bGQganVzdCBwcm9iYWJseSBpbml0IHRoZSB3aG9sZQorICogZ2xfY29uZmlnIG9iamVjdCBoaW1zZWxmLgorICoKKyAqIFxyZXR1cm4gR0xfVFJVRSBvbiBzdWNjZXNzLCBvciBHTF9GQUxTRSBvbiBmYWlsdXJlLgorICoKKyAqIFxzYSBfbWVzYV9jcmVhdGVfdmlzdWFsKCkgYWJvdmUgZm9yIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24uCisgKi8KK0dMYm9vbGVhbgorX21lc2FfaW5pdGlhbGl6ZV92aXN1YWwoIHN0cnVjdCBnbF9jb25maWcgKnZpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gZGJGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBzdGVyZW9GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHJlZEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgZ3JlZW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJsdWVCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGFscGhhQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBkZXB0aEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc3RlbmNpbEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYWNjdW1SZWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGFjY3VtR3JlZW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGFjY3VtQmx1ZUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYWNjdW1BbHBoYUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgbnVtU2FtcGxlcyApCit7CisgICBhc3NlcnQodmlzKTsKKworICAgaWYgKGRlcHRoQml0cyA8IDAgfHwgZGVwdGhCaXRzID4gMzIpIHsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKyAgIGlmIChzdGVuY2lsQml0cyA8IDAgfHwgc3RlbmNpbEJpdHMgPiA4KSB7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisgICBhc3NlcnQoYWNjdW1SZWRCaXRzID49IDApOworICAgYXNzZXJ0KGFjY3VtR3JlZW5CaXRzID49IDApOworICAgYXNzZXJ0KGFjY3VtQmx1ZUJpdHMgPj0gMCk7CisgICBhc3NlcnQoYWNjdW1BbHBoYUJpdHMgPj0gMCk7CisKKyAgIHZpcy0+cmdiTW9kZSAgICAgICAgICA9IEdMX1RSVUU7CisgICB2aXMtPmRvdWJsZUJ1ZmZlck1vZGUgPSBkYkZsYWc7CisgICB2aXMtPnN0ZXJlb01vZGUgICAgICAgPSBzdGVyZW9GbGFnOworCisgICB2aXMtPnJlZEJpdHMgICAgICAgICAgPSByZWRCaXRzOworICAgdmlzLT5ncmVlbkJpdHMgICAgICAgID0gZ3JlZW5CaXRzOworICAgdmlzLT5ibHVlQml0cyAgICAgICAgID0gYmx1ZUJpdHM7CisgICB2aXMtPmFscGhhQml0cyAgICAgICAgPSBhbHBoYUJpdHM7CisgICB2aXMtPnJnYkJpdHMgICAgICAgICAgPSByZWRCaXRzICsgZ3JlZW5CaXRzICsgYmx1ZUJpdHM7CisKKyAgIHZpcy0+aW5kZXhCaXRzICAgICAgPSAwOworICAgdmlzLT5kZXB0aEJpdHMgICAgICA9IGRlcHRoQml0czsKKyAgIHZpcy0+c3RlbmNpbEJpdHMgICAgPSBzdGVuY2lsQml0czsKKworICAgdmlzLT5hY2N1bVJlZEJpdHMgICA9IGFjY3VtUmVkQml0czsKKyAgIHZpcy0+YWNjdW1HcmVlbkJpdHMgPSBhY2N1bUdyZWVuQml0czsKKyAgIHZpcy0+YWNjdW1CbHVlQml0cyAgPSBhY2N1bUJsdWVCaXRzOworICAgdmlzLT5hY2N1bUFscGhhQml0cyA9IGFjY3VtQWxwaGFCaXRzOworCisgICB2aXMtPmhhdmVBY2N1bUJ1ZmZlciAgID0gYWNjdW1SZWRCaXRzID4gMDsKKyAgIHZpcy0+aGF2ZURlcHRoQnVmZmVyICAgPSBkZXB0aEJpdHMgPiAwOworICAgdmlzLT5oYXZlU3RlbmNpbEJ1ZmZlciA9IHN0ZW5jaWxCaXRzID4gMDsKKworICAgdmlzLT5udW1BdXhCdWZmZXJzID0gMDsKKyAgIHZpcy0+bGV2ZWwgPSAwOworICAgdmlzLT5zYW1wbGVCdWZmZXJzID0gbnVtU2FtcGxlcyA+IDAgPyAxIDogMDsKKyAgIHZpcy0+c2FtcGxlcyA9IG51bVNhbXBsZXM7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKKy8qKgorICogRGVzdHJveSBhIHZpc3VhbCBhbmQgZnJlZSBpdHMgbWVtb3J5LgorICoKKyAqIFxwYXJhbSB2aXMgdmlzdWFsLgorICogCisgKiBGcmVlcyB0aGUgdmlzdWFsIHN0cnVjdHVyZS4KKyAqLwordm9pZAorX21lc2FfZGVzdHJveV92aXN1YWwoIHN0cnVjdCBnbF9jb25maWcgKnZpcyApCit7CisgICBmcmVlKHZpcyk7Cit9CisKKy8qQH0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIENvbnRleHQgYWxsb2NhdGlvbiwgaW5pdGlhbGl6YXRpb24sIGRlc3Ryb3lpbmcKKyAqCisgKiBUaGUgcHVycG9zZSBvZiB0aGUgbW9zdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgaGVyZSBpcyB0byBwcm92aWRlIHRoZQorICogZGVmYXVsdCBzdGF0ZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBPcGVuR0wgc3BlY2lmaWNhdGlvbi4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKkB7Ki8KKworCisvKioKKyAqIFRoaXMgaXMgbGFtZS4gIGdkYiBvbmx5IHNlZW1zIHRvIHJlY29nbml6ZSBlbnVtIHR5cGVzIHRoYXQgYXJlCisgKiBhY3R1YWxseSB1c2VkIHNvbWV3aGVyZS4gIFdlIHdhbnQgdG8gYmUgYWJsZSB0byBwcmludC91c2UgZW51bQorICogdmFsdWVzIHN1Y2ggYXMgVEVYVFVSRV8yRF9JTkRFWCBpbiBnZGIuICBCdXQgd2UgZG9uJ3QgYWN0dWFsbHkgdXNlCisgKiB0aGUgZ2xfdGV4dHVyZV9pbmRleCB0eXBlIGFueXdoZXJlLiAgVGh1cywgdGhpcyBsYW1lIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZAorZHVtbXlfZW51bV9mdW5jKHZvaWQpCit7CisgICBnbF9idWZmZXJfaW5kZXggYmkgPSBCVUZGRVJfRlJPTlRfTEVGVDsKKyAgIGdsX2ZhY2VfaW5kZXggZmkgPSBGQUNFX1BPU19YOworICAgZ2xfZnJhZ19yZXN1bHQgZnIgPSBGUkFHX1JFU1VMVF9ERVBUSDsKKyAgIGdsX3RleHR1cmVfaW5kZXggdGkgPSBURVhUVVJFXzJEX0FSUkFZX0lOREVYOworICAgZ2xfdmVydF9hdHRyaWIgdmEgPSBWRVJUX0FUVFJJQl9QT1M7CisgICBnbF92YXJ5aW5nX3Nsb3QgdnMgPSBWQVJZSU5HX1NMT1RfUE9TOworCisgICAodm9pZCkgYmk7CisgICAodm9pZCkgZmk7CisgICAodm9pZCkgZnI7CisgICAodm9pZCkgdGk7CisgICAodm9pZCkgdmE7CisgICAodm9pZCkgdnM7Cit9CisKKworLyoqCisgKiBPbmUtdGltZSBpbml0aWFsaXphdGlvbiBtdXRleCBsb2NrLgorICoKKyAqIFxzYSBVc2VkIGJ5IG9uZV90aW1lX2luaXQoKS4KKyAqLworbXR4X3QgT25lVGltZUxvY2sgPSBfTVRYX0lOSVRJQUxJWkVSX05QOworCisKKworLyoqCisgKiBDYWxscyBhbGwgdGhlIHZhcmlvdXMgb25lLXRpbWUtaW5pdCBmdW5jdGlvbnMgaW4gTWVzYS4KKyAqCisgKiBXaGlsZSBob2xkaW5nIGEgZ2xvYmFsIG11dGV4IGxvY2ssIGNhbGxzIHNldmVyYWwgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLAorICogYW5kIHNldHMgdGhlIGdsYXBpIGNhbGxiYWNrcyBpZiB0aGUgXGMgTUVTQV9ERUJVRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcworICogZGVmaW5lZC4KKyAqCisgKiBcc2EgX21hdGhfaW5pdCgpLgorICovCitzdGF0aWMgdm9pZAorb25lX3RpbWVfaW5pdCggc3RydWN0IGdsX2NvbnRleHQgKmN0eCApCit7CisgICBzdGF0aWMgR0xiaXRmaWVsZCBhcGlfaW5pdF9tYXNrID0gMHgwOworCisgICBtdHhfbG9jaygmT25lVGltZUxvY2spOworCisgICAvKiB0cnVseSBvbmUtdGltZSBpbml0ICovCisgICBpZiAoIWFwaV9pbml0X21hc2spIHsKKyAgICAgIEdMdWludCBpOworCisgICAgICAvKiBkbyBzb21lIGltcGxlbWVudGF0aW9uIHRlc3RzICovCisgICAgICBhc3NlcnQoIHNpemVvZihHTGJ5dGUpID09IDEgKTsKKyAgICAgIGFzc2VydCggc2l6ZW9mKEdMdWJ5dGUpID09IDEgKTsKKyAgICAgIGFzc2VydCggc2l6ZW9mKEdMc2hvcnQpID09IDIgKTsKKyAgICAgIGFzc2VydCggc2l6ZW9mKEdMdXNob3J0KSA9PSAyICk7CisgICAgICBhc3NlcnQoIHNpemVvZihHTGludCkgPT0gNCApOworICAgICAgYXNzZXJ0KCBzaXplb2YoR0x1aW50KSA9PSA0ICk7CisKKyAgICAgIF9tZXNhX2dldF9jcHVfZmVhdHVyZXMoKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICBfbWVzYV91Ynl0ZV90b19mbG9hdF9jb2xvcl90YWJbaV0gPSAoZmxvYXQpIGkgLyAyNTUuMEY7CisgICAgICB9CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKF9fREFURV9fKSAmJiBkZWZpbmVkKF9fVElNRV9fKQorICAgICAgaWYgKE1FU0FfVkVSQk9TRSAhPSAwKSB7CisJIF9tZXNhX2RlYnVnKGN0eCwgIk1lc2EgJXMgREVCVUcgYnVpbGQgJXMgJXNcbiIsCisJCSAgICAgUEFDS0FHRV9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18pOworICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworICAgICAgX21lc2FfdGVzdF9mb3JtYXRzKCk7CisjZW5kaWYKKworICAgICAgX21lc2FfY3JlYXRlX3NoYWRlcl9jb21waWxlcigpOworICAgfQorCisgICAvKiBwZXItQVBJIG9uZS10aW1lIGluaXQgKi8KKyAgIGlmICghKGFwaV9pbml0X21hc2sgJiAoMSA8PCBjdHgtPkFQSSkpKSB7CisgICAgICBfbWVzYV9pbml0X2dldF9oYXNoKGN0eCk7CisKKyAgICAgIF9tZXNhX2luaXRfcmVtYXBfdGFibGUoKTsKKyAgIH0KKworICAgYXBpX2luaXRfbWFzayB8PSAxIDw8IGN0eC0+QVBJOworCisgICBtdHhfdW5sb2NrKCZPbmVUaW1lTG9jayk7CisKKyAgIC8qIEhvcGVmdWxseSBhdGV4aXQoKSBpcyB3aWRlbHkgYXZhaWxhYmxlLiAgSWYgbm90LCB3ZSBtYXkgbmVlZCBzb21lCisgICAgKiAjaWZkZWYgdGVzdHMgaGVyZS4KKyAgICAqLworICAgYXRleGl0KF9tZXNhX2Rlc3Ryb3lfc2hhZGVyX2NvbXBpbGVyKTsKKworICAgZHVtbXlfZW51bV9mdW5jKCk7Cit9CisKKworLyoqCisgKiBJbml0aWFsaXplIGZpZWxkcyBvZiBnbF9jdXJyZW50X2F0dHJpYiAoYWthIGN0eC0+Q3VycmVudC4qKQorICovCitzdGF0aWMgdm9pZAorX21lc2FfaW5pdF9jdXJyZW50KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBHTHVpbnQgaTsKKworICAgLyogSW5pdCBhbGwgdG8gKDAsMCwwLDEpICovCisgICBmb3IgKGkgPSAwOyBpIDwgRWxlbWVudHMoY3R4LT5DdXJyZW50LkF0dHJpYik7IGkrKykgeworICAgICAgQVNTSUdOXzRWKCBjdHgtPkN1cnJlbnQuQXR0cmliW2ldLCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsKKyAgIH0KKworICAgLyogcmVkbyBzcGVjaWFsIGNhc2VzOiAqLworICAgQVNTSUdOXzRWKCBjdHgtPkN1cnJlbnQuQXR0cmliW1ZFUlRfQVRUUklCX1dFSUdIVF0sIDEuMCwgMC4wLCAwLjAsIDAuMCApOworICAgQVNTSUdOXzRWKCBjdHgtPkN1cnJlbnQuQXR0cmliW1ZFUlRfQVRUUklCX05PUk1BTF0sIDAuMCwgMC4wLCAxLjAsIDEuMCApOworICAgQVNTSUdOXzRWKCBjdHgtPkN1cnJlbnQuQXR0cmliW1ZFUlRfQVRUUklCX0NPTE9SMF0sIDEuMCwgMS4wLCAxLjAsIDEuMCApOworICAgQVNTSUdOXzRWKCBjdHgtPkN1cnJlbnQuQXR0cmliW1ZFUlRfQVRUUklCX0NPTE9SMV0sIDAuMCwgMC4wLCAwLjAsIDEuMCApOworICAgQVNTSUdOXzRWKCBjdHgtPkN1cnJlbnQuQXR0cmliW1ZFUlRfQVRUUklCX0NPTE9SX0lOREVYXSwgMS4wLCAwLjAsIDAuMCwgMS4wICk7CisgICBBU1NJR05fNFYoIGN0eC0+Q3VycmVudC5BdHRyaWJbVkVSVF9BVFRSSUJfRURHRUZMQUddLCAxLjAsIDAuMCwgMC4wLCAxLjAgKTsKK30KKworCisvKioKKyAqIEluaXQgdmVydGV4L2ZyYWdtZW50L2dlb21ldHJ5IHByb2dyYW0gbGltaXRzLgorICogSW1wb3J0YW50OiBkcml2ZXJzIHNob3VsZCBvdmVycmlkZSB0aGVzZSB3aXRoIGFjdHVhbCBsaW1pdHMuCisgKi8KK3N0YXRpYyB2b2lkCitpbml0X3Byb2dyYW1fbGltaXRzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIGdsX3NoYWRlcl9zdGFnZSBzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW1fY29uc3RhbnRzICpwcm9nKQoreworICAgcHJvZy0+TWF4SW5zdHJ1Y3Rpb25zID0gTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TOworICAgcHJvZy0+TWF4QWx1SW5zdHJ1Y3Rpb25zID0gTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TOworICAgcHJvZy0+TWF4VGV4SW5zdHJ1Y3Rpb25zID0gTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TOworICAgcHJvZy0+TWF4VGV4SW5kaXJlY3Rpb25zID0gTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TOworICAgcHJvZy0+TWF4VGVtcHMgPSBNQVhfUFJPR1JBTV9URU1QUzsKKyAgIHByb2ctPk1heEVudlBhcmFtcyA9IE1BWF9QUk9HUkFNX0VOVl9QQVJBTVM7CisgICBwcm9nLT5NYXhMb2NhbFBhcmFtcyA9IE1BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNUzsKKyAgIHByb2ctPk1heEFkZHJlc3NPZmZzZXQgPSBNQVhfUFJPR1JBTV9MT0NBTF9QQVJBTVM7CisKKyAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgcHJvZy0+TWF4UGFyYW1ldGVycyA9IE1BWF9WRVJURVhfUFJPR1JBTV9QQVJBTVM7CisgICAgICBwcm9nLT5NYXhBdHRyaWJzID0gTUFYX1ZFUlRFWF9HRU5FUklDX0FUVFJJQlM7CisgICAgICBwcm9nLT5NYXhBZGRyZXNzUmVncyA9IE1BWF9WRVJURVhfUFJPR1JBTV9BRERSRVNTX1JFR1M7CisgICAgICBwcm9nLT5NYXhVbmlmb3JtQ29tcG9uZW50cyA9IDQgKiBNQVhfVU5JRk9STVM7CisgICAgICBwcm9nLT5NYXhJbnB1dENvbXBvbmVudHMgPSAwOyAvKiB2YWx1ZSBub3QgdXNlZCAqLworICAgICAgcHJvZy0+TWF4T3V0cHV0Q29tcG9uZW50cyA9IDE2ICogNDsgLyogb2xkIGxpbWl0IG5vdCB0byBicmVhayB0bmwgYW5kIHN3cmFzdCAqLworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0ZSQUdNRU5UOgorICAgICAgcHJvZy0+TWF4UGFyYW1ldGVycyA9IE1BWF9OVl9GUkFHTUVOVF9QUk9HUkFNX1BBUkFNUzsKKyAgICAgIHByb2ctPk1heEF0dHJpYnMgPSBNQVhfTlZfRlJBR01FTlRfUFJPR1JBTV9JTlBVVFM7CisgICAgICBwcm9nLT5NYXhBZGRyZXNzUmVncyA9IE1BWF9GUkFHTUVOVF9QUk9HUkFNX0FERFJFU1NfUkVHUzsKKyAgICAgIHByb2ctPk1heFVuaWZvcm1Db21wb25lbnRzID0gNCAqIE1BWF9VTklGT1JNUzsKKyAgICAgIHByb2ctPk1heElucHV0Q29tcG9uZW50cyA9IDE2ICogNDsgLyogb2xkIGxpbWl0IG5vdCB0byBicmVhayB0bmwgYW5kIHN3cmFzdCAqLworICAgICAgcHJvZy0+TWF4T3V0cHV0Q29tcG9uZW50cyA9IDA7IC8qIHZhbHVlIG5vdCB1c2VkICovCisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9TSEFERVJfR0VPTUVUUlk6CisgICAgICBwcm9nLT5NYXhQYXJhbWV0ZXJzID0gTUFYX1ZFUlRFWF9QUk9HUkFNX1BBUkFNUzsKKyAgICAgIHByb2ctPk1heEF0dHJpYnMgPSBNQVhfVkVSVEVYX0dFTkVSSUNfQVRUUklCUzsKKyAgICAgIHByb2ctPk1heEFkZHJlc3NSZWdzID0gTUFYX1ZFUlRFWF9QUk9HUkFNX0FERFJFU1NfUkVHUzsKKyAgICAgIHByb2ctPk1heFVuaWZvcm1Db21wb25lbnRzID0gNCAqIE1BWF9VTklGT1JNUzsKKyAgICAgIHByb2ctPk1heElucHV0Q29tcG9uZW50cyA9IDE2ICogNDsgLyogb2xkIGxpbWl0IG5vdCB0byBicmVhayB0bmwgYW5kIHN3cmFzdCAqLworICAgICAgcHJvZy0+TWF4T3V0cHV0Q29tcG9uZW50cyA9IDE2ICogNDsgLyogb2xkIGxpbWl0IG5vdCB0byBicmVhayB0bmwgYW5kIHN3cmFzdCAqLworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0NPTVBVVEU6CisgICAgICBwcm9nLT5NYXhQYXJhbWV0ZXJzID0gMDsgLyogbm90IG1lYW5pbmdmdWwgZm9yIGNvbXB1dGUgc2hhZGVycyAqLworICAgICAgcHJvZy0+TWF4QXR0cmlicyA9IDA7IC8qIG5vdCBtZWFuaW5nZnVsIGZvciBjb21wdXRlIHNoYWRlcnMgKi8KKyAgICAgIHByb2ctPk1heEFkZHJlc3NSZWdzID0gMDsgLyogbm90IG1lYW5pbmdmdWwgZm9yIGNvbXB1dGUgc2hhZGVycyAqLworICAgICAgcHJvZy0+TWF4VW5pZm9ybUNvbXBvbmVudHMgPSA0ICogTUFYX1VOSUZPUk1TOworICAgICAgcHJvZy0+TWF4SW5wdXRDb21wb25lbnRzID0gMDsgLyogbm90IG1lYW5pbmdmdWwgZm9yIGNvbXB1dGUgc2hhZGVycyAqLworICAgICAgcHJvZy0+TWF4T3V0cHV0Q29tcG9uZW50cyA9IDA7IC8qIG5vdCBtZWFuaW5nZnVsIGZvciBjb21wdXRlIHNoYWRlcnMgKi8KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwICYmICJCYWQgc2hhZGVyIHN0YWdlIGluIGluaXRfcHJvZ3JhbV9saW1pdHMoKSIpOworICAgfQorCisgICAvKiBTZXQgdGhlIG5hdGl2ZSBsaW1pdHMgdG8gemVyby4gIFRoaXMgaW1wbGllcyB0aGF0IHRoZXJlIGlzIG5vIG5hdGl2ZQorICAgICogc3VwcG9ydCBmb3Igc2hhZGVycy4gIExldCB0aGUgZHJpdmVycyBmaWxsIGluIHRoZSBhY3R1YWwgdmFsdWVzLgorICAgICovCisgICBwcm9nLT5NYXhOYXRpdmVJbnN0cnVjdGlvbnMgPSAwOworICAgcHJvZy0+TWF4TmF0aXZlQWx1SW5zdHJ1Y3Rpb25zID0gMDsKKyAgIHByb2ctPk1heE5hdGl2ZVRleEluc3RydWN0aW9ucyA9IDA7CisgICBwcm9nLT5NYXhOYXRpdmVUZXhJbmRpcmVjdGlvbnMgPSAwOworICAgcHJvZy0+TWF4TmF0aXZlQXR0cmlicyA9IDA7CisgICBwcm9nLT5NYXhOYXRpdmVUZW1wcyA9IDA7CisgICBwcm9nLT5NYXhOYXRpdmVBZGRyZXNzUmVncyA9IDA7CisgICBwcm9nLT5NYXhOYXRpdmVQYXJhbWV0ZXJzID0gMDsKKworICAgLyogU2V0IEdMU0wgZGF0YXR5cGUgcmFuZ2UvcHJlY2lzaW9uIGluZm8gYXNzdW1pbmcgSUVFRSBmbG9hdCB2YWx1ZXMuCisgICAgKiBEcml2ZXJzIHNob3VsZCBvdmVycmlkZSB0aGVzZSBkZWZhdWx0cyBhcyBuZWVkZWQuCisgICAgKi8KKyAgIHByb2ctPk1lZGl1bUZsb2F0LlJhbmdlTWluID0gMTI3OworICAgcHJvZy0+TWVkaXVtRmxvYXQuUmFuZ2VNYXggPSAxMjc7CisgICBwcm9nLT5NZWRpdW1GbG9hdC5QcmVjaXNpb24gPSAyMzsKKyAgIHByb2ctPkxvd0Zsb2F0ID0gcHJvZy0+SGlnaEZsb2F0ID0gcHJvZy0+TWVkaXVtRmxvYXQ7CisKKyAgIC8qIEFzc3VtZSBpbnRzIGFyZSBzdG9yZWQgYXMgZmxvYXRzIGZvciBub3csIHNpbmNlIHRoaXMgaXMgdGhlIGxlYXN0LWNvbW1vbgorICAgICogZGVub21pbmF0b3IuICBUaGUgT3BlbkdMIEVTIHNwZWMgaW1wbGllcyAocGFnZSAxMzIpIHRoYXQgdGhlIHByZWNpc2lvbgorICAgICogb2YgaW50ZWdlciB0eXBlcyBzaG91bGQgYmUgMC4gIFByYWN0aWNhbGx5IHNwZWFraW5nLCBJRUVFCisgICAgKiBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBjYW4gb25seSBzdG9yZSBpbnRlZ2VycyBpbiB0aGUKKyAgICAqIHJhbmdlIFstMHgwMTAwMDAwMCwgMHgwMTAwMDAwMF0gd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi4KKyAgICAqLworICAgcHJvZy0+TWVkaXVtSW50LlJhbmdlTWluID0gMjQ7CisgICBwcm9nLT5NZWRpdW1JbnQuUmFuZ2VNYXggPSAyNDsKKyAgIHByb2ctPk1lZGl1bUludC5QcmVjaXNpb24gPSAwOworICAgcHJvZy0+TG93SW50ID0gcHJvZy0+SGlnaEludCA9IHByb2ctPk1lZGl1bUludDsKKworICAgcHJvZy0+TWF4VW5pZm9ybUJsb2NrcyA9IDEyOworICAgcHJvZy0+TWF4Q29tYmluZWRVbmlmb3JtQ29tcG9uZW50cyA9IChwcm9nLT5NYXhVbmlmb3JtQ29tcG9uZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Q29uc3QuTWF4VW5pZm9ybUJsb2NrU2l6ZSAvIDQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nLT5NYXhVbmlmb3JtQmxvY2tzKTsKKworICAgcHJvZy0+TWF4QXRvbWljQnVmZmVycyA9IDA7CisgICBwcm9nLT5NYXhBdG9taWNDb3VudGVycyA9IDA7Cit9CisKKworLyoqCisgKiBJbml0aWFsaXplIGZpZWxkcyBvZiBnbF9jb25zdGFudHMgKGFrYSBjdHgtPkNvbnN0LiopLgorICogVXNlIGRlZmF1bHRzIGZyb20gY29uZmlnLmguICBUaGUgZGV2aWNlIGRyaXZlcnMgd2lsbCBvZnRlbiBvdmVycmlkZQorICogc29tZSBvZiB0aGVzZSB2YWx1ZXMgKHN1Y2ggYXMgbnVtYmVyIG9mIHRleHR1cmUgdW5pdHMpLgorICovCitzdGF0aWMgdm9pZCAKK19tZXNhX2luaXRfY29uc3RhbnRzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBpbnQgaTsKKyAgIGFzc2VydChjdHgpOworCisgICAvKiBDb25zdGFudHMsIG1heSBiZSBvdmVycmlkZW4gKHVzdWFsbHkgb25seSByZWR1Y2VkKSBieSBkZXZpY2UgZHJpdmVycyAqLworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlTWJ5dGVzID0gTUFYX1RFWFRVUkVfTUJZVEVTOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlTGV2ZWxzID0gTUFYX1RFWFRVUkVfTEVWRUxTOworICAgY3R4LT5Db25zdC5NYXgzRFRleHR1cmVMZXZlbHMgPSBNQVhfM0RfVEVYVFVSRV9MRVZFTFM7CisgICBjdHgtPkNvbnN0Lk1heEN1YmVUZXh0dXJlTGV2ZWxzID0gTUFYX0NVQkVfVEVYVFVSRV9MRVZFTFM7CisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVSZWN0U2l6ZSA9IE1BWF9URVhUVVJFX1JFQ1RfU0laRTsKKyAgIGN0eC0+Q29uc3QuTWF4QXJyYXlUZXh0dXJlTGF5ZXJzID0gTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlQ29vcmRVbml0cyA9IE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhUZXh0dXJlSW1hZ2VVbml0cyA9IE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHMgPSBNSU4yKGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhUZXh0dXJlSW1hZ2VVbml0cyk7CisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVNYXhBbmlzb3Ryb3B5ID0gTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFk7CisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVMb2RCaWFzID0gTUFYX1RFWFRVUkVfTE9EX0JJQVM7CisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVCdWZmZXJTaXplID0gNjU1MzY7CisgICBjdHgtPkNvbnN0LlRleHR1cmVCdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSAxOworICAgY3R4LT5Db25zdC5NYXhBcnJheUxvY2tTaXplID0gTUFYX0FSUkFZX0xPQ0tfU0laRTsKKyAgIGN0eC0+Q29uc3QuU3ViUGl4ZWxCaXRzID0gU1VCX1BJWEVMX0JJVFM7CisgICBjdHgtPkNvbnN0Lk1pblBvaW50U2l6ZSA9IE1JTl9QT0lOVF9TSVpFOworICAgY3R4LT5Db25zdC5NYXhQb2ludFNpemUgPSBNQVhfUE9JTlRfU0laRTsKKyAgIGN0eC0+Q29uc3QuTWluUG9pbnRTaXplQUEgPSBNSU5fUE9JTlRfU0laRTsKKyAgIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplQUEgPSBNQVhfUE9JTlRfU0laRTsKKyAgIGN0eC0+Q29uc3QuUG9pbnRTaXplR3JhbnVsYXJpdHkgPSAoR0xmbG9hdCkgUE9JTlRfU0laRV9HUkFOVUxBUklUWTsKKyAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoID0gTUlOX0xJTkVfV0lEVEg7CisgICBjdHgtPkNvbnN0Lk1heExpbmVXaWR0aCA9IE1BWF9MSU5FX1dJRFRIOworICAgY3R4LT5Db25zdC5NaW5MaW5lV2lkdGhBQSA9IE1JTl9MSU5FX1dJRFRIOworICAgY3R4LT5Db25zdC5NYXhMaW5lV2lkdGhBQSA9IE1BWF9MSU5FX1dJRFRIOworICAgY3R4LT5Db25zdC5MaW5lV2lkdGhHcmFudWxhcml0eSA9IChHTGZsb2F0KSBMSU5FX1dJRFRIX0dSQU5VTEFSSVRZOworICAgY3R4LT5Db25zdC5NYXhDbGlwUGxhbmVzID0gNjsKKyAgIGN0eC0+Q29uc3QuTWF4TGlnaHRzID0gTUFYX0xJR0hUUzsKKyAgIGN0eC0+Q29uc3QuTWF4U2hpbmluZXNzID0gMTI4LjA7CisgICBjdHgtPkNvbnN0Lk1heFNwb3RFeHBvbmVudCA9IDEyOC4wOworICAgY3R4LT5Db25zdC5NYXhWaWV3cG9ydFdpZHRoID0gTUFYX1ZJRVdQT1JUX1dJRFRIOworICAgY3R4LT5Db25zdC5NYXhWaWV3cG9ydEhlaWdodCA9IE1BWF9WSUVXUE9SVF9IRUlHSFQ7CisgICBjdHgtPkNvbnN0Lk1pbk1hcEJ1ZmZlckFsaWdubWVudCA9IDY0OworCisgICAvKiBEcml2ZXIgbXVzdCBvdmVycmlkZSB0aGVzZSB2YWx1ZXMgaWYgQVJCX3ZpZXdwb3J0X2FycmF5IGlzIHN1cHBvcnRlZC4gKi8KKyAgIGN0eC0+Q29uc3QuTWF4Vmlld3BvcnRzID0gMTsKKyAgIGN0eC0+Q29uc3QuVmlld3BvcnRTdWJwaXhlbEJpdHMgPSAwOworICAgY3R4LT5Db25zdC5WaWV3cG9ydEJvdW5kcy5NaW4gPSAwOworICAgY3R4LT5Db25zdC5WaWV3cG9ydEJvdW5kcy5NYXggPSAwOworCisgICAvKiogR0xfQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdCAqLworICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZFVuaWZvcm1CbG9ja3MgPSAzNjsKKyAgIGN0eC0+Q29uc3QuTWF4VW5pZm9ybUJ1ZmZlckJpbmRpbmdzID0gMzY7CisgICBjdHgtPkNvbnN0Lk1heFVuaWZvcm1CbG9ja1NpemUgPSAxNjM4NDsKKyAgIGN0eC0+Q29uc3QuVW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykKKyAgICAgIGluaXRfcHJvZ3JhbV9saW1pdHMoY3R4LCBpLCAmY3R4LT5Db25zdC5Qcm9ncmFtW2ldKTsKKworICAgY3R4LT5Db25zdC5NYXhQcm9ncmFtTWF0cmljZXMgPSBNQVhfUFJPR1JBTV9NQVRSSUNFUzsKKyAgIGN0eC0+Q29uc3QuTWF4UHJvZ3JhbU1hdHJpeFN0YWNrRGVwdGggPSBNQVhfUFJPR1JBTV9NQVRSSVhfU1RBQ0tfREVQVEg7CisKKyAgIC8qIENoZWNrQXJyYXlCb3VuZHMgaXMgb3ZlcnJpZGVuIGJ5IGRyaXZlcnMveDExIGZvciBYIHNlcnZlciAqLworICAgY3R4LT5Db25zdC5DaGVja0FycmF5Qm91bmRzID0gR0xfRkFMU0U7CisKKyAgIC8qIEdMX0FSQl9kcmF3X2J1ZmZlcnMgKi8KKyAgIGN0eC0+Q29uc3QuTWF4RHJhd0J1ZmZlcnMgPSBNQVhfRFJBV19CVUZGRVJTOworCisgICBjdHgtPkNvbnN0Lk1heENvbG9yQXR0YWNobWVudHMgPSBNQVhfQ09MT1JfQVRUQUNITUVOVFM7CisgICBjdHgtPkNvbnN0Lk1heFJlbmRlcmJ1ZmZlclNpemUgPSBNQVhfUkVOREVSQlVGRkVSX1NJWkU7CisKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heFRleHR1cmVJbWFnZVVuaXRzID0gTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM7CisgICBjdHgtPkNvbnN0Lk1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzsKKyAgIGN0eC0+Q29uc3QuTWF4VmFyeWluZyA9IDE2OyAvKiBvbGQgbGltaXQgbm90IHRvIGJyZWFrIHRubCBhbmQgc3dyYXN0ICovCisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfR0VPTUVUUlldLk1heFRleHR1cmVJbWFnZVVuaXRzID0gTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM7CisgICBjdHgtPkNvbnN0Lk1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMgPSBNQVhfR0VPTUVUUllfT1VUUFVUX1ZFUlRJQ0VTOworICAgY3R4LT5Db25zdC5NYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyA9IE1BWF9HRU9NRVRSWV9UT1RBTF9PVVRQVVRfQ09NUE9ORU5UUzsKKworICAgLyogU2hhZGluZyBsYW5ndWFnZSB2ZXJzaW9uICovCisgICBpZiAoX21lc2FfaXNfZGVza3RvcF9nbChjdHgpKSB7CisgICAgICBjdHgtPkNvbnN0LkdMU0xWZXJzaW9uID0gMTIwOworICAgICAgX21lc2Ffb3ZlcnJpZGVfZ2xzbF92ZXJzaW9uKGN0eCk7CisgICB9CisgICBlbHNlIGlmIChjdHgtPkFQSSA9PSBBUElfT1BFTkdMRVMyKSB7CisgICAgICBjdHgtPkNvbnN0LkdMU0xWZXJzaW9uID0gMTAwOworICAgfQorICAgZWxzZSBpZiAoY3R4LT5BUEkgPT0gQVBJX09QRU5HTEVTKSB7CisgICAgICBjdHgtPkNvbnN0LkdMU0xWZXJzaW9uID0gMDsgLyogR0xTTCBub3Qgc3VwcG9ydGVkICovCisgICB9CisKKyAgIC8qIEdMX0FSQl9mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKyAgIGN0eC0+Q29uc3QuTWF4U2FtcGxlcyA9IDA7CisKKyAgIC8qIEdMX0FSQl9zeW5jICovCisgICBjdHgtPkNvbnN0Lk1heFNlcnZlcldhaXRUaW1lb3V0ID0gMHgxZmZmN2ZmZmZmZmZVTEw7CisKKyAgIC8qIEdMX0FUSV9lbnZtYXBfYnVtcG1hcCAqLworICAgY3R4LT5Db25zdC5TdXBwb3J0ZWRCdW1wVW5pdHMgPSBTVVBQT1JURURfQVRJX0JVTVBfVU5JVFM7CisKKyAgIC8qIEdMX0VYVF9wcm92b2tpbmdfdmVydGV4ICovCisgICBjdHgtPkNvbnN0LlF1YWRzRm9sbG93UHJvdm9raW5nVmVydGV4Q29udmVudGlvbiA9IEdMX1RSVUU7CisKKyAgIC8qIEdMX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sgKi8KKyAgIGN0eC0+Q29uc3QuTWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzID0gTUFYX0ZFRURCQUNLX0JVRkZFUlM7CisgICBjdHgtPkNvbnN0Lk1heFRyYW5zZm9ybUZlZWRiYWNrU2VwYXJhdGVDb21wb25lbnRzID0gNCAqIE1BWF9GRUVEQkFDS19BVFRSSUJTOworICAgY3R4LT5Db25zdC5NYXhUcmFuc2Zvcm1GZWVkYmFja0ludGVybGVhdmVkQ29tcG9uZW50cyA9IDQgKiBNQVhfRkVFREJBQ0tfQVRUUklCUzsKKyAgIGN0eC0+Q29uc3QuTWF4VmVydGV4U3RyZWFtcyA9IDE7CisKKyAgIC8qIEdMIDMuMiAgKi8KKyAgIGN0eC0+Q29uc3QuUHJvZmlsZU1hc2sgPSBjdHgtPkFQSSA9PSBBUElfT1BFTkdMX0NPUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHTF9DT05URVhUX0NPUkVfUFJPRklMRV9CSVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHTF9DT05URVhUX0NPTVBBVElCSUxJVFlfUFJPRklMRV9CSVQ7CisKKyAgIC8qKiBHTF9FWFRfZ3B1X3NoYWRlcjQgKi8KKyAgIGN0eC0+Q29uc3QuTWluUHJvZ3JhbVRleGVsT2Zmc2V0ID0gLTg7CisgICBjdHgtPkNvbnN0Lk1heFByb2dyYW1UZXhlbE9mZnNldCA9IDc7CisKKyAgIC8qIEdMX0FSQl90ZXh0dXJlX2dhdGhlciAqLworICAgY3R4LT5Db25zdC5NaW5Qcm9ncmFtVGV4dHVyZUdhdGhlck9mZnNldCA9IC04OworICAgY3R4LT5Db25zdC5NYXhQcm9ncmFtVGV4dHVyZUdhdGhlck9mZnNldCA9IDc7CisKKyAgIC8qIEdMX0FSQl9yb2J1c3RuZXNzICovCisgICBjdHgtPkNvbnN0LlJlc2V0U3RyYXRlZ3kgPSBHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fQVJCOworCisgICAvKiBQcmltaXRpdmVSZXN0YXJ0ICovCisgICBjdHgtPkNvbnN0LlByaW1pdGl2ZVJlc3RhcnRJblNvZnR3YXJlID0gR0xfRkFMU0U7CisKKyAgIC8qIEVTIDMuMCBvciBBUkJfRVMzX2NvbXBhdGliaWxpdHkgKi8KKyAgIGN0eC0+Q29uc3QuTWF4RWxlbWVudEluZGV4ID0gMHhmZmZmZmZmZnU7CisKKyAgIC8qIEdMX0FSQl90ZXh0dXJlX211bHRpc2FtcGxlICovCisgICBjdHgtPkNvbnN0Lk1heENvbG9yVGV4dHVyZVNhbXBsZXMgPSAxOworICAgY3R4LT5Db25zdC5NYXhEZXB0aFRleHR1cmVTYW1wbGVzID0gMTsKKyAgIGN0eC0+Q29uc3QuTWF4SW50ZWdlclNhbXBsZXMgPSAxOworCisgICAvKiBHTF9BUkJfc2hhZGVyX2F0b21pY19jb3VudGVycyAqLworICAgY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5ncyA9IE1BWF9DT01CSU5FRF9BVE9NSUNfQlVGRkVSUzsKKyAgIGN0eC0+Q29uc3QuTWF4QXRvbWljQnVmZmVyU2l6ZSA9IE1BWF9BVE9NSUNfQ09VTlRFUlMgKiBBVE9NSUNfQ09VTlRFUl9TSVpFOworICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZEF0b21pY0J1ZmZlcnMgPSBNQVhfQ09NQklORURfQVRPTUlDX0JVRkZFUlM7CisgICBjdHgtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQ291bnRlcnMgPSBNQVhfQVRPTUlDX0NPVU5URVJTOworCisgICAvKiBHTF9BUkJfdmVydGV4X2F0dHJpYl9iaW5kaW5nICovCisgICBjdHgtPkNvbnN0Lk1heFZlcnRleEF0dHJpYlJlbGF0aXZlT2Zmc2V0ID0gMjA0NzsKKyAgIGN0eC0+Q29uc3QuTWF4VmVydGV4QXR0cmliQmluZGluZ3MgPSBNQVhfVkVSVEVYX0dFTkVSSUNfQVRUUklCUzsKKworICAgLyogR0xfQVJCX2NvbXB1dGVfc2hhZGVyICovCisgICBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSA9IDY1NTM1OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gPSA2NTUzNTsKKyAgIGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdID0gNjU1MzU7CisgICBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV0gPSAxMDI0OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSA9IDY0OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMgPSAxMDI0OworCisgICAvKiogR0xfQVJCX2dwdV9zaGFkZXI1ICovCisgICBjdHgtPkNvbnN0Lk1pbkZyYWdtZW50SW50ZXJwb2xhdGlvbk9mZnNldCA9IE1JTl9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVDsKKyAgIGN0eC0+Q29uc3QuTWF4RnJhZ21lbnRJbnRlcnBvbGF0aW9uT2Zmc2V0ID0gTUFYX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUOworCisgICBjdHgtPkNvbnN0LkdsYXNzTW9kZSA9IDA7Cit9CisKKworLyoqCisgKiBEbyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIGxpbWl0cy9jb25zdGFudHMgZm9yIHRoZSBnaXZlbiBjb250ZXh0LgorICogT25seSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgYSBjb250ZXh0IGlzIGJvdW5kLgorICovCitzdGF0aWMgdm9pZAorY2hlY2tfY29udGV4dF9saW1pdHMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIC8qIGNoZWNrIHRoYXQgd2UgZG9uJ3QgZXhjZWVkIHRoZSBzaXplIG9mIHZhcmlvdXMgYml0ZmllbGRzICovCisgICBhc3NlcnQoVkFSWUlOR19TTE9UX01BWCA8PQorCSAgKDggKiBzaXplb2YoY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50LT5CYXNlLk91dHB1dHNXcml0dGVuKSkpOworICAgYXNzZXJ0KFZBUllJTkdfU0xPVF9NQVggPD0KKwkgICg4ICogc2l6ZW9mKGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9DdXJyZW50LT5CYXNlLklucHV0c1JlYWQpKSk7CisKKyAgIC8qIHNoYWRlci1yZWxhdGVkIGNoZWNrcyAqLworICAgYXNzZXJ0KGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TG9jYWxQYXJhbXMgPD0gTUFYX1BST0dSQU1fTE9DQUxfUEFSQU1TKTsKKyAgIGFzc2VydChjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhMb2NhbFBhcmFtcyA8PSBNQVhfUFJPR1JBTV9MT0NBTF9QQVJBTVMpOworCisgICAvKiBUZXh0dXJlIHVuaXQgY2hlY2tzICovCisgICBhc3NlcnQoY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhUZXh0dXJlSW1hZ2VVbml0cyA+IDApOworICAgYXNzZXJ0KGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPD0gTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpOworICAgYXNzZXJ0KGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHMgPiAwKTsKKyAgIGFzc2VydChjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzIDw9IE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTKTsKKyAgIGFzc2VydChjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA+IDApOworICAgYXNzZXJ0KGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzIDw9IE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTsKKyAgIGFzc2VydChjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA8PSBNQVhfVEVYVFVSRV9DT09SRF9VTklUUyk7CisgICBhc3NlcnQoY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHMgPT0gTUlOMihjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heFRleHR1cmVJbWFnZVVuaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlQ29vcmRVbml0cykpOworICAgYXNzZXJ0KGN0eC0+Q29uc3QuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA+IDApOworICAgYXNzZXJ0KGN0eC0+Q29uc3QuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA8PSBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyk7CisgICBhc3NlcnQoY3R4LT5Db25zdC5NYXhUZXh0dXJlQ29vcmRVbml0cyA8PSBNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyk7CisgICAvKiBudW1iZXIgb2YgY29vcmQgdW5pdHMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBudW1iZXIgb2YgaW1hZ2UgdW5pdHMgKi8KKyAgIGFzc2VydChjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzIDw9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHMpOworCisKKyAgIC8qIFRleHR1cmUgc2l6ZSBjaGVja3MgKi8KKyAgIGFzc2VydChjdHgtPkNvbnN0Lk1heFRleHR1cmVMZXZlbHMgPD0gTUFYX1RFWFRVUkVfTEVWRUxTKTsKKyAgIGFzc2VydChjdHgtPkNvbnN0Lk1heDNEVGV4dHVyZUxldmVscyA8PSBNQVhfM0RfVEVYVFVSRV9MRVZFTFMpOworICAgYXNzZXJ0KGN0eC0+Q29uc3QuTWF4Q3ViZVRleHR1cmVMZXZlbHMgPD0gTUFYX0NVQkVfVEVYVFVSRV9MRVZFTFMpOworICAgYXNzZXJ0KGN0eC0+Q29uc3QuTWF4VGV4dHVyZVJlY3RTaXplIDw9IE1BWF9URVhUVVJFX1JFQ1RfU0laRSk7CisKKyAgIC8qIFRleHR1cmUgbGV2ZWwgY2hlY2tzICovCisgICBhc3NlcnQoTUFYX1RFWFRVUkVfTEVWRUxTID49IE1BWF8zRF9URVhUVVJFX0xFVkVMUyk7CisgICBhc3NlcnQoTUFYX1RFWFRVUkVfTEVWRUxTID49IE1BWF9DVUJFX1RFWFRVUkVfTEVWRUxTKTsKKworICAgLyogTWF4IHRleHR1cmUgc2l6ZSBzaG91bGQgYmUgPD0gbWF4IHZpZXdwb3J0IHNpemUgKHJlbmRlciB0byB0ZXh0dXJlKSAqLworICAgYXNzZXJ0KCgxVSA8PCAoY3R4LT5Db25zdC5NYXhUZXh0dXJlTGV2ZWxzIC0gMSkpCisgICAgICAgICAgPD0gY3R4LT5Db25zdC5NYXhWaWV3cG9ydFdpZHRoKTsKKyAgIGFzc2VydCgoMVUgPDwgKGN0eC0+Q29uc3QuTWF4VGV4dHVyZUxldmVscyAtIDEpKQorICAgICAgICAgIDw9IGN0eC0+Q29uc3QuTWF4Vmlld3BvcnRIZWlnaHQpOworCisgICBhc3NlcnQoY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycyA8PSBNQVhfRFJBV19CVUZGRVJTKTsKKworICAgLyogaWYgdGhpcyBmYWlscywgYWRkIG1vcmUgZW51bSB2YWx1ZXMgdG8gZ2xfYnVmZmVyX2luZGV4ICovCisgICBhc3NlcnQoQlVGRkVSX0NPTE9SMCArIE1BWF9EUkFXX0JVRkZFUlMgPD0gQlVGRkVSX0NPVU5UKTsKKworICAgLyogWFhYIHByb2JhYmx5IGFkZCBtb3JlIHRlc3RzICovCit9CisKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGUgZ3JvdXBzIGluIGEgR0wgY29udGV4dC4KKyAqCisgKiBccGFyYW0gY3R4IEdMIGNvbnRleHQuCisgKgorICogSW5pdGlhbGl6ZXMgYWxsIHRoZSBhdHRyaWJ1dGVzLCBjYWxsaW5nIHRoZSByZXNwZWN0aXZlIDx0dD5pbml0KjwvdHQ+CisgKiBmdW5jdGlvbnMgZm9yIHRoZSBtb3JlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgR0xib29sZWFuCitpbml0X2F0dHJpYl9ncm91cHMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIGFzc2VydChjdHgpOworCisgICAvKiBDb25zdGFudHMgKi8KKyAgIF9tZXNhX2luaXRfY29uc3RhbnRzKCBjdHggKTsKKworICAgLyogRXh0ZW5zaW9ucyAqLworICAgX21lc2FfaW5pdF9leHRlbnNpb25zKCBjdHggKTsKKworICAgLyogQXR0cmlidXRlIEdyb3VwcyAqLworICAgX21lc2FfaW5pdF9hY2N1bSggY3R4ICk7CisgICBfbWVzYV9pbml0X2F0dHJpYiggY3R4ICk7CisgICBfbWVzYV9pbml0X2J1ZmZlcl9vYmplY3RzKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfY29sb3IoIGN0eCApOworICAgX21lc2FfaW5pdF9jdXJyZW50KCBjdHggKTsKKyAgIF9tZXNhX2luaXRfZGVwdGgoIGN0eCApOworICAgX21lc2FfaW5pdF9kZWJ1ZyggY3R4ICk7CisgICBfbWVzYV9pbml0X2Rpc3BsYXlfbGlzdCggY3R4ICk7CisgICBfbWVzYV9pbml0X2Vycm9ycyggY3R4ICk7CisgICBfbWVzYV9pbml0X2V2YWwoIGN0eCApOworICAgX21lc2FfaW5pdF9mYm9iamVjdHMoIGN0eCApOworICAgX21lc2FfaW5pdF9mZWVkYmFjayggY3R4ICk7CisgICBfbWVzYV9pbml0X2ZvZyggY3R4ICk7CisgICBfbWVzYV9pbml0X2hpbnQoIGN0eCApOworICAgX21lc2FfaW5pdF9saW5lKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfbGlnaHRpbmcoIGN0eCApOworICAgX21lc2FfaW5pdF9tYXRyaXgoIGN0eCApOworICAgX21lc2FfaW5pdF9tdWx0aXNhbXBsZSggY3R4ICk7CisgICBfbWVzYV9pbml0X3BlcmZvcm1hbmNlX21vbml0b3JzKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfcGlwZWxpbmUoIGN0eCApOworICAgX21lc2FfaW5pdF9waXhlbCggY3R4ICk7CisgICBfbWVzYV9pbml0X3BpeGVsc3RvcmUoIGN0eCApOworICAgX21lc2FfaW5pdF9wb2ludCggY3R4ICk7CisgICBfbWVzYV9pbml0X3BvbHlnb24oIGN0eCApOworICAgX21lc2FfaW5pdF9wcm9ncmFtKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfcXVlcnlvYmooIGN0eCApOworICAgX21lc2FfaW5pdF9zeW5jKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfcmFzdHBvcyggY3R4ICk7CisgICBfbWVzYV9pbml0X3NjaXNzb3IoIGN0eCApOworICAgX21lc2FfaW5pdF9zaGFkZXJfc3RhdGUoIGN0eCApOworICAgX21lc2FfaW5pdF9zdGVuY2lsKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfdHJhbnNmb3JtKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfdHJhbnNmb3JtX2ZlZWRiYWNrKCBjdHggKTsKKyAgIF9tZXNhX2luaXRfdmFycmF5KCBjdHggKTsKKyAgIF9tZXNhX2luaXRfdmlld3BvcnQoIGN0eCApOworCisgICBpZiAoIV9tZXNhX2luaXRfdGV4dHVyZSggY3R4ICkpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIF9tZXNhX2luaXRfdGV4dHVyZV9zM3RjKCBjdHggKTsKKworICAgLyogTWlzY2VsbGFuZW91cyAqLworICAgY3R4LT5OZXdTdGF0ZSA9IF9ORVdfQUxMOworICAgY3R4LT5OZXdEcml2ZXJTdGF0ZSA9IH4wOworICAgY3R4LT5FcnJvclZhbHVlID0gR0xfTk9fRVJST1I7CisgICBjdHgtPlNoYXJlR3JvdXBSZXNldCA9IGZhbHNlOworICAgY3R4LT52YXJ5aW5nX3ZwX2lucHV0cyA9IFZFUlRfQklUX0FMTDsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKworLyoqCisgKiBVcGRhdGUgZGVmYXVsdCBvYmplY3RzIGluIGEgR0wgY29udGV4dCB3aXRoIHJlc3BlY3QgdG8gc2hhcmVkIHN0YXRlLgorICoKKyAqIFxwYXJhbSBjdHggR0wgY29udGV4dC4KKyAqCisgKiBSZW1vdmVzIHJlZmVyZW5jZXMgdG8gb2xkIGRlZmF1bHQgb2JqZWN0cywgKHRleHR1cmUgb2JqZWN0cywgcHJvZ3JhbQorICogb2JqZWN0cywgZXRjLikgYW5kIGNoYW5nZXMgdG8gcmVmZXJlbmNlIHRob3NlIGZyb20gdGhlIGN1cnJlbnQgc2hhcmVkCisgKiBzdGF0ZS4KKyAqLworc3RhdGljIEdMYm9vbGVhbgordXBkYXRlX2RlZmF1bHRfb2JqZWN0cyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgYXNzZXJ0KGN0eCk7CisKKyAgIF9tZXNhX3VwZGF0ZV9kZWZhdWx0X29iamVjdHNfcHJvZ3JhbShjdHgpOworICAgX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c190ZXh0dXJlKGN0eCk7CisgICBfbWVzYV91cGRhdGVfZGVmYXVsdF9vYmplY3RzX2J1ZmZlcl9vYmplY3RzKGN0eCk7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKKy8qKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmdW5jdGlvbiB3ZSBwbHVnIGludG8gYWxsIGRpc3BhdGNoIHRhYmxlIHNsb3RzCisgKiBUaGlzIGhlbHBzIHByZXZlbnRzIGEgc2VnZmF1bHQgd2hlbiBzb21lb25lIGNhbGxzIGEgR0wgZnVuY3Rpb24gd2l0aG91dAorICogZmlyc3QgY2hlY2tpbmcgaWYgdGhlIGV4dGVuc2lvbidzIHN1cHBvcnRlZC4KKyAqLworaW50CitfbWVzYV9nZW5lcmljX25vcCh2b2lkKQoreworICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOworICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmdW5jdGlvbiBjYWxsZWQgIgorICAgICAgICAgICAgICAgIih1bnN1cHBvcnRlZCBleHRlbnNpb24gb3IgZGVwcmVjYXRlZCBmdW5jdGlvbj8pIik7CisgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGRpc3BhdGNoIHRhYmxlLgorICovCitzdHJ1Y3QgX2dsYXBpX3RhYmxlICoKK19tZXNhX2FsbG9jX2Rpc3BhdGNoX3RhYmxlKCkKK3sKKyAgIC8qIEZpbmQgdGhlIGxhcmdlciBvZiBNZXNhJ3MgZGlzcGF0Y2ggdGFibGUgYW5kIGxpYkdMJ3MgZGlzcGF0Y2ggdGFibGUuCisgICAgKiBJbiBwcmFjdGljZSwgdGhpcydsbCBiZSB0aGUgc2FtZSBmb3Igc3RhbmQtYWxvbmUgTWVzYS4gIEJ1dCBmb3IgRFJJCisgICAgKiBNZXNhIHdlIGRvIHRoaXMgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IHZlcnNpb25zIG9mIGxpYkdMIGFuZCB2YXJpb3VzCisgICAgKiBEUkkgZHJpdmVycy4KKyAgICAqLworICAgR0xpbnQgbnVtRW50cmllcyA9IE1BWDIoX2dsYXBpX2dldF9kaXNwYXRjaF90YWJsZV9zaXplKCksIF9nbG9mZnNldF9DT1VOVCk7CisgICBzdHJ1Y3QgX2dsYXBpX3RhYmxlICp0YWJsZTsKKworICAgdGFibGUgPSBtYWxsb2MobnVtRW50cmllcyAqIHNpemVvZihfZ2xhcGlfcHJvYykpOworICAgaWYgKHRhYmxlKSB7CisgICAgICBfZ2xhcGlfcHJvYyAqZW50cnkgPSAoX2dsYXBpX3Byb2MgKikgdGFibGU7CisgICAgICBHTGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgeworICAgICAgICAgZW50cnlbaV0gPSAoX2dsYXBpX3Byb2MpIF9tZXNhX2dlbmVyaWNfbm9wOworICAgICAgfQorICAgfQorICAgcmV0dXJuIHRhYmxlOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBtaW5pbWFsIGRpc3BhdGNoIHRhYmxlIGZvciB1c2Ugd2l0aGluIGdsQmVnaW4oKS9nbEVuZCgpLgorICoKKyAqIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGdlbmVyYXRlIEdMX0lOVkFMSURfT1BFUkFUSU9OIGVycm9ycyBmcm9tIG1vc3QKKyAqIGZ1bmN0aW9ucywgc2luY2UgdGhlIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBhcmUgdmFsaWQgd2l0aGluIEJlZ2luL0VuZCBpcworICogdmVyeSBzbWFsbC4KKyAqCisgKiBGcm9tIHRoZSBHTCAxLjAgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDIuNi4zLCAiR0wgQ29tbWFuZHMgd2l0aGluCisgKiBCZWdpbi9FbmQiCisgKgorICogICAgICJUaGUgb25seSBHTCBjb21tYW5kcyB0aGF0IGFyZSBhbGxvd2VkIHdpdGhpbiBhbnkgQmVnaW4vRW5kIHBhaXJzIGFyZQorICogICAgICB0aGUgY29tbWFuZHMgZm9yIHNwZWNpZnlpbmcgdmVydGV4IGNvb3JkaW5hdGVzLCB2ZXJ0ZXggY29sb3IsIG5vcm1hbAorICogICAgICBjb29yZGluYXRlcywgYW5kIHRleHR1cmUgY29vcmRpbmF0ZXMgKFZlcnRleCwgQ29sb3IsIEluZGV4LCBOb3JtYWwsCisgKiAgICAgIFRleENvb3JkKSwgRXZhbENvb3JkIGFuZCBFdmFsUG9pbnQgY29tbWFuZHMgKHNlZSBzZWN0aW9uIDUuMSksCisgKiAgICAgIGNvbW1hbmRzIGZvciBzcGVjaWZ5aW5nIGxpZ2h0aW5nIG1hdGVyaWFsIHBhcmFtZXRlcnMgKE1hdGVyaWFsCisgKiAgICAgIGNvbW1hbmRzIHNlZSBzZWN0aW9uIDIuMTIuMiksIGRpc3BsYXkgbGlzdCBpbnZvY2F0aW9uIGNvbW1hbmRzCisgKiAgICAgIChDYWxsTGlzdCBhbmQgQ2FsbExpc3RzIHNlZSBzZWN0aW9uIDUuNCksIGFuZCB0aGUgRWRnZUZsYWcKKyAqICAgICAgY29tbWFuZC4gRXhlY3V0aW5nIEJlZ2luIGFmdGVyIEJlZ2luIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgYnV0CisgKiAgICAgIGJlZm9yZSBhbiBFbmQgaXMgaXNzdWVkIGdlbmVyYXRlcyB0aGUgSU5WQUxJRCBPUEVSQVRJT04gZXJyb3IsIGFzIGRvZXMKKyAqICAgICAgZXhlY3V0aW5nIEVuZCB3aXRob3V0IGEgcHJldmlvdXMgY29ycmVzcG9uZGluZyBCZWdpbi4gRXhlY3V0aW5nIGFueQorICogICAgICBvdGhlciBHTCBjb21tYW5kIHdpdGhpbiBCZWdpbi9FbmQgcmVzdWx0cyBpbiB0aGUgZXJyb3IgSU5WQUxJRAorICogICAgICBPUEVSQVRJT04uIgorICoKKyAqIFRoZSB0YWJsZSBlbnRyaWVzIGZvciBzcGVjaWZ5aW5nIHZlcnRleCBhdHRyaWJ1dGVzIGFyZSBzZXQgdXAgYnkKKyAqIGluc3RhbGxfdnR4Zm10KCkgYW5kIF9tZXNhX2xvb3BiYWNrX2luaXRfYXBpX3RhYmxlKCksIGFuZCBFbmQoKSBhbmQgZGxpc3RzCisgKiBhcmUgc2V0IGJ5IGluc3RhbGxfdnR4Zm10KCkgYXMgd2VsbC4KKyAqLworc3RhdGljIHN0cnVjdCBfZ2xhcGlfdGFibGUgKgorY3JlYXRlX2JlZ2luZW5kX3RhYmxlKGNvbnN0IHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBzdHJ1Y3QgX2dsYXBpX3RhYmxlICp0YWJsZTsKKworICAgdGFibGUgPSBfbWVzYV9hbGxvY19kaXNwYXRjaF90YWJsZSgpOworICAgaWYgKCF0YWJsZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBGaWxsIGluIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSB2YWx1ZSwgc2luY2UgdGhleSBzaG91bGQgcmV0dXJuIHNvbWUKKyAgICAqIHNwZWNpZmljIHZhbHVlIGV2ZW4gaWYgdGhleSBlbWl0IGEgR0xfSU5WQUxJRF9PUEVSQVRJT04gZXJyb3IgZnJvbSB0aGVtCisgICAgKiBiZWluZyBjYWxsZWQgd2l0aGluIGdsQmVnaW4oKS9nbEVuZCgpLgorICAgICovCisjZGVmaW5lIENPUFlfRElTUEFUQ0goZnVuYykgU0VUXyMjZnVuYyh0YWJsZSwgR0VUXyMjZnVuYyhjdHgtPkV4ZWMpKQorCisgICBDT1BZX0RJU1BBVENIKEdlbkxpc3RzKTsKKyAgIENPUFlfRElTUEFUQ0goSXNQcm9ncmFtKTsKKyAgIENPUFlfRElTUEFUQ0goSXNWZXJ0ZXhBcnJheSk7CisgICBDT1BZX0RJU1BBVENIKElzQnVmZmVyKTsKKyAgIENPUFlfRElTUEFUQ0goSXNFbmFibGVkKTsKKyAgIENPUFlfRElTUEFUQ0goSXNFbmFibGVkaSk7CisgICBDT1BZX0RJU1BBVENIKElzUmVuZGVyYnVmZmVyKTsKKyAgIENPUFlfRElTUEFUQ0goSXNGcmFtZWJ1ZmZlcik7CisgICBDT1BZX0RJU1BBVENIKENoZWNrRnJhbWVidWZmZXJTdGF0dXMpOworICAgQ09QWV9ESVNQQVRDSChSZW5kZXJNb2RlKTsKKyAgIENPUFlfRElTUEFUQ0goR2V0U3RyaW5nKTsKKyAgIENPUFlfRElTUEFUQ0goR2V0U3RyaW5naSk7CisgICBDT1BZX0RJU1BBVENIKEdldFBvaW50ZXJ2KTsKKyAgIENPUFlfRElTUEFUQ0goSXNRdWVyeSk7CisgICBDT1BZX0RJU1BBVENIKElzU2FtcGxlcik7CisgICBDT1BZX0RJU1BBVENIKElzU3luYyk7CisgICBDT1BZX0RJU1BBVENIKElzVGV4dHVyZSk7CisgICBDT1BZX0RJU1BBVENIKElzVHJhbnNmb3JtRmVlZGJhY2spOworICAgQ09QWV9ESVNQQVRDSChEZWxldGVRdWVyaWVzKTsKKyAgIENPUFlfRElTUEFUQ0goQXJlVGV4dHVyZXNSZXNpZGVudCk7CisgICBDT1BZX0RJU1BBVENIKEZlbmNlU3luYyk7CisgICBDT1BZX0RJU1BBVENIKENsaWVudFdhaXRTeW5jKTsKKyAgIENPUFlfRElTUEFUQ0goTWFwQnVmZmVyKTsKKyAgIENPUFlfRElTUEFUQ0goVW5tYXBCdWZmZXIpOworICAgQ09QWV9ESVNQQVRDSChNYXBCdWZmZXJSYW5nZSk7CisgICBDT1BZX0RJU1BBVENIKE9iamVjdFB1cmdlYWJsZUFQUExFKTsKKyAgIENPUFlfRElTUEFUQ0goT2JqZWN0VW5wdXJnZWFibGVBUFBMRSk7CisKKyAgIF9tZXNhX2xvb3BiYWNrX2luaXRfYXBpX3RhYmxlKGN0eCwgdGFibGUpOworCisgICByZXR1cm4gdGFibGU7Cit9CisKK3ZvaWQKK19tZXNhX2luaXRpYWxpemVfZGlzcGF0Y2hfdGFibGVzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICAvKiBEbyB0aGUgY29kZS1nZW5lcmF0ZWQgc2V0dXAgb2YgdGhlIGV4ZWMgdGFibGUgaW4gYXBpX2V4ZWMuYy4gKi8KKyAgIF9tZXNhX2luaXRpYWxpemVfZXhlY190YWJsZShjdHgpOworCisgICBpZiAoY3R4LT5TYXZlKQorICAgICAgX21lc2FfaW5pdGlhbGl6ZV9zYXZlX3RhYmxlKGN0eCk7Cit9CisKKworLyoqCisgKiBJbml0aWFsaXplIGEgc3RydWN0IGdsX2NvbnRleHQgc3RydWN0IChyZW5kZXJpbmcgY29udGV4dCkuCisgKgorICogVGhpcyBpbmNsdWRlcyBhbGxvY2F0aW5nIGFsbCB0aGUgb3RoZXIgc3RydWN0cyBhbmQgYXJyYXlzIHdoaWNoIGhhbmcgb2ZmIG9mCisgKiB0aGUgY29udGV4dCBieSBwb2ludGVycy4KKyAqIE5vdGUgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIHBhc3MgaW4gaXRzIGRkX2Z1bmN0aW9uX3RhYmxlIGhlcmUgc2luY2UKKyAqIHdlIG5lZWQgdG8gYXQgbGVhc3QgY2FsbCBkcml2ZXJGdW5jdGlvbnMtPk5ld1RleHR1cmVPYmplY3QgdG8gY3JlYXRlIHRoZQorICogZGVmYXVsdCB0ZXh0dXJlIG9iamVjdHMuCisgKiAKKyAqIENhbGxlZCBieSBfbWVzYV9jcmVhdGVfY29udGV4dCgpLgorICoKKyAqIFBlcmZvcm1zIHRoZSBpbXBvcnRzIGFuZCBleHBvcnRzIGNhbGxiYWNrIHRhYmxlcyBpbml0aWFsaXphdGlvbiwgYW5kCisgKiBtaXNjZWxsYW5lb3VzIG9uZS10aW1lIGluaXRpYWxpemF0aW9ucy4gSWYgbm8gc2hhcmVkIGNvbnRleHQgaXMgc3VwcGxpZWQgb25lCisgKiBpcyBhbGxvY2F0ZWQsIGFuZCBpbmNyZWFzZSBpdHMgcmVmZXJlbmNlIGNvdW50LiAgU2V0dXBzIHRoZSBHTCBBUEkgZGlzcGF0Y2gKKyAqIHRhYmxlcy4gIEluaXRpYWxpemUgdGhlIFROTCBtb2R1bGUuIFNldHMgdGhlIG1heGltdW0gWiBidWZmZXIgZGVwdGguCisgKiBGaW5hbGx5IHF1ZXJpZXMgdGhlIFxjIE1FU0FfREVCVUcgYW5kIFxjIE1FU0FfVkVSQk9TRSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAqIGZvciBkZWJ1ZyBmbGFncy4KKyAqCisgKiBccGFyYW0gY3R4IHRoZSBjb250ZXh0IHRvIGluaXRpYWxpemUKKyAqIFxwYXJhbSBhcGkgdGhlIEdMIEFQSSB0eXBlIHRvIGNyZWF0ZSB0aGUgY29udGV4dCBmb3IKKyAqIFxwYXJhbSB2aXN1YWwgZGVzY3JpYmVzIHRoZSB2aXN1YWwgYXR0cmlidXRlcyBmb3IgdGhpcyBjb250ZXh0IG9yIE5VTEwgdG8KKyAqICAgICAgICAgICAgICAgY3JlYXRlIGEgY29uZmlnbGVzcyBjb250ZXh0CisgKiBccGFyYW0gc2hhcmVfbGlzdCBwb2ludHMgdG8gY29udGV4dCB0byBzaGFyZSB0ZXh0dXJlcywgZGlzcGxheSBsaXN0cywKKyAqICAgICAgICBldGMgd2l0aCwgb3IgTlVMTAorICogXHBhcmFtIGRyaXZlckZ1bmN0aW9ucyB0YWJsZSBvZiBkZXZpY2UgZHJpdmVyIGZ1bmN0aW9ucyBmb3IgdGhpcyBjb250ZXh0CisgKiAgICAgICAgdG8gdXNlCisgKi8KK0dMYm9vbGVhbgorX21lc2FfaW5pdGlhbGl6ZV9jb250ZXh0KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfYXBpIGFwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfY29uZmlnICp2aXN1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2NvbnRleHQgKnNoYXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpkcml2ZXJGdW5jdGlvbnMpCit7CisgICBzdHJ1Y3QgZ2xfc2hhcmVkX3N0YXRlICpzaGFyZWQ7CisgICBpbnQgaTsKKworICAgYXNzZXJ0KGRyaXZlckZ1bmN0aW9ucy0+TmV3VGV4dHVyZU9iamVjdCk7CisgICBhc3NlcnQoZHJpdmVyRnVuY3Rpb25zLT5GcmVlVGV4dHVyZUltYWdlQnVmZmVyKTsKKworICAgY3R4LT5BUEkgPSBhcGk7CisgICBjdHgtPkRyYXdCdWZmZXIgPSBOVUxMOworICAgY3R4LT5SZWFkQnVmZmVyID0gTlVMTDsKKyAgIGN0eC0+V2luU3lzRHJhd0J1ZmZlciA9IE5VTEw7CisgICBjdHgtPldpblN5c1JlYWRCdWZmZXIgPSBOVUxMOworCisgICBpZiAodmlzdWFsKSB7CisgICAgICBjdHgtPlZpc3VhbCA9ICp2aXN1YWw7CisgICAgICBjdHgtPkhhc0NvbmZpZyA9IEdMX1RSVUU7CisgICB9CisgICBlbHNlIHsKKyAgICAgIG1lbXNldCgmY3R4LT5WaXN1YWwsIDAsIHNpemVvZiBjdHgtPlZpc3VhbCk7CisgICAgICBjdHgtPkhhc0NvbmZpZyA9IEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoX21lc2FfaXNfZGVza3RvcF9nbChjdHgpKSB7CisgICAgICBfbWVzYV9vdmVycmlkZV9nbF92ZXJzaW9uKGN0eCk7CisgICB9CisKKyAgIC8qIG1pc2Mgb25lLXRpbWUgaW5pdGlhbGl6YXRpb25zICovCisgICBvbmVfdGltZV9pbml0KGN0eCk7CisKKyAgIC8qIFBsdWcgaW4gZHJpdmVyIGZ1bmN0aW9ucyBhbmQgY29udGV4dCBwb2ludGVyIGhlcmUuCisgICAgKiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHdoZW4gd2UgY2FsbCBhbGxvY19zaGFyZWRfc3RhdGUoKSBiZWxvdworICAgICogd2UnbGwgY2FsbCBjdHgtPkRyaXZlci5OZXdUZXh0dXJlT2JqZWN0KCkgdG8gY3JlYXRlIHRoZSBkZWZhdWx0CisgICAgKiB0ZXh0dXJlcy4KKyAgICAqLworICAgY3R4LT5Ecml2ZXIgPSAqZHJpdmVyRnVuY3Rpb25zOworCisgICBpZiAoc2hhcmVfbGlzdCkgeworICAgICAgLyogc2hhcmUgc3RhdGUgd2l0aCBhbm90aGVyIGNvbnRleHQgKi8KKyAgICAgIHNoYXJlZCA9IHNoYXJlX2xpc3QtPlNoYXJlZDsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogYWxsb2NhdGUgbmV3LCB1bnNoYXJlZCBzdGF0ZSAqLworICAgICAgc2hhcmVkID0gX21lc2FfYWxsb2Nfc2hhcmVkX3N0YXRlKGN0eCk7CisgICAgICBpZiAoIXNoYXJlZCkKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgX21lc2FfcmVmZXJlbmNlX3NoYXJlZF9zdGF0ZShjdHgsICZjdHgtPlNoYXJlZCwgc2hhcmVkKTsKKworICAgaWYgKCFpbml0X2F0dHJpYl9ncm91cHMoIGN0eCApKQorICAgICAgZ290byBmYWlsOworCisgICAvKiBzZXR1cCB0aGUgQVBJIGRpc3BhdGNoIHRhYmxlcyB3aXRoIGFsbCBub3AgZnVuY3Rpb25zICovCisgICBjdHgtPk91dHNpZGVCZWdpbkVuZCA9IF9tZXNhX2FsbG9jX2Rpc3BhdGNoX3RhYmxlKCk7CisgICBpZiAoIWN0eC0+T3V0c2lkZUJlZ2luRW5kKQorICAgICAgZ290byBmYWlsOworICAgY3R4LT5FeGVjID0gY3R4LT5PdXRzaWRlQmVnaW5FbmQ7CisgICBjdHgtPkN1cnJlbnREaXNwYXRjaCA9IGN0eC0+T3V0c2lkZUJlZ2luRW5kOworCisgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fTWFpbnRhaW5UZXhFbnZQcm9ncmFtCisgICAgICA9IChfbWVzYV9nZXRlbnYoIk1FU0FfVEVYX1BST0ciKSAhPSBOVUxMKTsKKworICAgY3R4LT5WZXJ0ZXhQcm9ncmFtLl9NYWludGFpblRubFByb2dyYW0KKyAgICAgID0gKF9tZXNhX2dldGVudigiTUVTQV9UTkxfUFJPRyIpICE9IE5VTEwpOworICAgaWYgKGN0eC0+VmVydGV4UHJvZ3JhbS5fTWFpbnRhaW5UbmxQcm9ncmFtKSB7CisgICAgICAvKiB0aGlzIGlzIHJlcXVpcmVkLi4uICovCisgICAgICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5fTWFpbnRhaW5UZXhFbnZQcm9ncmFtID0gR0xfVFJVRTsKKyAgIH0KKworICAgLyogTWVzYSBjb3JlIGhhbmRsZXMgYWxsIHRoZSBmb3JtYXRzIHRoYXQgbWVzYSBjb3JlIGtub3dzIGFib3V0LgorICAgICogRHJpdmVycyB3aWxsIHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyBsaXN0IHdpdGgganVzdCB0aGUgZm9ybWF0cworICAgICogdGhleSBjYW4gaGFuZGxlLCBhbmQgY29uZmlybSB0aGF0IGFwcHJvcHJpYXRlIGZhbGxiYWNrcyBleGlzdCBpbgorICAgICogX21lc2FfY2hvb3NlX3RleF9mb3JtYXQoKS4KKyAgICAqLworICAgbWVtc2V0KCZjdHgtPlRleHR1cmVGb3JtYXRTdXBwb3J0ZWQsIEdMX1RSVUUsCisJICBzaXplb2YoY3R4LT5UZXh0dXJlRm9ybWF0U3VwcG9ydGVkKSk7CisKKyAgIHN3aXRjaCAoY3R4LT5BUEkpIHsKKyAgIGNhc2UgQVBJX09QRU5HTF9DT01QQVQ6CisgICAgICBjdHgtPkJlZ2luRW5kID0gY3JlYXRlX2JlZ2luZW5kX3RhYmxlKGN0eCk7CisgICAgICBjdHgtPlNhdmUgPSBfbWVzYV9hbGxvY19kaXNwYXRjaF90YWJsZSgpOworICAgICAgaWYgKCFjdHgtPkJlZ2luRW5kIHx8ICFjdHgtPlNhdmUpCisgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgY2FzZSBBUElfT1BFTkdMX0NPUkU6CisgICAgICBicmVhazsKKyAgIGNhc2UgQVBJX09QRU5HTEVTOgorICAgICAgLyoqCisgICAgICAgKiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCBzYXlzCisgICAgICAgKiAiSW5pdGlhbGx5IGFsbCB0ZXh0dXJlIGdlbmVyYXRpb24gbW9kZXMgYXJlIHNldCB0byBSRUZMRUNUSU9OX01BUF9PRVMiCisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVEVYVFVSRV9VTklUUzsgaSsrKSB7CisJIHN0cnVjdCBnbF90ZXh0dXJlX3VuaXQgKnRleFVuaXQgPSAmY3R4LT5UZXh0dXJlLlVuaXRbaV07CisJIHRleFVuaXQtPkdlblMuTW9kZSA9IEdMX1JFRkxFQ1RJT05fTUFQX05WOworCSB0ZXhVbml0LT5HZW5ULk1vZGUgPSBHTF9SRUZMRUNUSU9OX01BUF9OVjsKKwkgdGV4VW5pdC0+R2VuUi5Nb2RlID0gR0xfUkVGTEVDVElPTl9NQVBfTlY7CisJIHRleFVuaXQtPkdlblMuX01vZGVCaXQgPSBURVhHRU5fUkVGTEVDVElPTl9NQVBfTlY7CisJIHRleFVuaXQtPkdlblQuX01vZGVCaXQgPSBURVhHRU5fUkVGTEVDVElPTl9NQVBfTlY7CisJIHRleFVuaXQtPkdlblIuX01vZGVCaXQgPSBURVhHRU5fUkVGTEVDVElPTl9NQVBfTlY7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgQVBJX09QRU5HTEVTMjoKKyAgICAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9NYWludGFpblRleEVudlByb2dyYW0gPSBHTF9UUlVFOworICAgICAgY3R4LT5WZXJ0ZXhQcm9ncmFtLl9NYWludGFpblRubFByb2dyYW0gPSBHTF9UUlVFOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGN0eC0+Rmlyc3RUaW1lQ3VycmVudCA9IEdMX1RSVUU7CisKKyAgIGN0eC0+R2xzbEZsYWdzID1fbWVzYV9nZXRfc2hhZGVyX2ZsYWdzKCk7CisKKyAgIHJldHVybiBHTF9UUlVFOworCitmYWlsOgorICAgX21lc2FfcmVmZXJlbmNlX3NoYXJlZF9zdGF0ZShjdHgsICZjdHgtPlNoYXJlZCwgTlVMTCk7CisgICBmcmVlKGN0eC0+QmVnaW5FbmQpOworICAgZnJlZShjdHgtPk91dHNpZGVCZWdpbkVuZCk7CisgICBmcmVlKGN0eC0+U2F2ZSk7CisgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHN0cnVjdCBnbF9jb250ZXh0IHN0cnVjdHVyZS4KKyAqIE5vdGUgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIHBhc3MgaW4gaXRzIGRkX2Z1bmN0aW9uX3RhYmxlIGhlcmUgc2luY2UKKyAqIHdlIG5lZWQgdG8gYXQgbGVhc3QgY2FsbCBkcml2ZXJGdW5jdGlvbnMtPk5ld1RleHR1cmVPYmplY3QgdG8gaW5pdGlhbGl6ZQorICogdGhlIHJlbmRlcmluZyBjb250ZXh0LgorICoKKyAqIFxwYXJhbSBhcGkgdGhlIEdMIEFQSSB0eXBlIHRvIGNyZWF0ZSB0aGUgY29udGV4dCBmb3IKKyAqIFxwYXJhbSB2aXN1YWwgYSBzdHJ1Y3QgZ2xfY29uZmlnIHBvaW50ZXIgKHdlIGNvcHkgdGhlIHN0cnVjdCBjb250ZW50cykgb3IKKyAqICAgICAgICAgICAgICAgTlVMTCB0byBjcmVhdGUgYSBjb25maWdsZXNzIGNvbnRleHQKKyAqIFxwYXJhbSBzaGFyZV9saXN0IGFub3RoZXIgY29udGV4dCB0byBzaGFyZSBkaXNwbGF5IGxpc3RzIHdpdGggb3IgTlVMTAorICogXHBhcmFtIGRyaXZlckZ1bmN0aW9ucyBwb2ludHMgdG8gdGhlIGRkX2Z1bmN0aW9uX3RhYmxlIGludG8gd2hpY2ggdGhlCisgKiAgICAgICAgZHJpdmVyIGhhcyBwbHVnZ2VkIGluIGFsbCBpdHMgc3BlY2lhbCBmdW5jdGlvbnMuCisgKiAKKyAqIFxyZXR1cm4gcG9pbnRlciB0byBhIG5ldyBfX3N0cnVjdCBnbF9jb250ZXh0UmVjIG9yIE5VTEwgaWYgZXJyb3IuCisgKi8KK3N0cnVjdCBnbF9jb250ZXh0ICoKK19tZXNhX2NyZWF0ZV9jb250ZXh0KGdsX2FwaSBhcGksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfY29uZmlnICp2aXN1YWwsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfY29udGV4dCAqc2hhcmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZHJpdmVyRnVuY3Rpb25zKQoreworICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eDsKKworICAgY3R4ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZ2xfY29udGV4dCkpOworICAgaWYgKCFjdHgpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaWYgKF9tZXNhX2luaXRpYWxpemVfY29udGV4dChjdHgsIGFwaSwgdmlzdWFsLCBzaGFyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJGdW5jdGlvbnMpKSB7CisgICAgICByZXR1cm4gY3R4OworICAgfQorICAgZWxzZSB7CisgICAgICBmcmVlKGN0eCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KK30KKwordm9pZAorX21lc2FfZW5hYmxlX2dsc2xfdGhyZWFkcG9vbChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBpbnQgbWF4X3RocmVhZHMpCit7CisgICBpZiAoIWN0eC0+VGhyZWFkUG9vbCkKKyAgICAgIGN0eC0+VGhyZWFkUG9vbCA9IF9tZXNhX2dsc2xfZ2V0X3RocmVhZHBvb2wobWF4X3RocmVhZHMpOworfQorCitzdGF0aWMgdm9pZAord2FpdF9zaGFkZXJfb2JqZWN0X2NiKEdMdWludCBpZCwgdm9pZCAqZGF0YSwgdm9pZCAqdXNlckRhdGEpCit7CisgICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gKHN0cnVjdCBnbF9jb250ZXh0ICopIHVzZXJEYXRhOworICAgc3RydWN0IGdsX3NoYWRlciAqc2ggPSAoc3RydWN0IGdsX3NoYWRlciAqKSBkYXRhOworCisgICBpZiAoX21lc2FfdmFsaWRhdGVfc2hhZGVyX3RhcmdldChjdHgsIHNoLT5UeXBlKSkgeworICAgICAgX21lc2Ffd2FpdF9zaGFkZXJzKGN0eCwgJnNoLCAxKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2cgPSAoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICopIGRhdGE7CisgICAgICBfbWVzYV93YWl0X3NoYWRlcl9wcm9ncmFtKGN0eCwgc2hQcm9nKTsKKyAgIH0KK30KKworLyoqCisgKiBGcmVlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dC4KKyAqIAorICogQnV0IGRvZXNuJ3QgZnJlZSB0aGUgc3RydWN0IGdsX2NvbnRleHQgc3RydWN0IGl0c2VsZi4KKyAqCisgKiBcc2EgX21lc2FfaW5pdGlhbGl6ZV9jb250ZXh0KCkgYW5kIGluaXRfYXR0cmliX2dyb3VwcygpLgorICovCit2b2lkCitfbWVzYV9mcmVlX2NvbnRleHRfZGF0YSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCApCit7CisgICBpZiAoIV9tZXNhX2dldF9jdXJyZW50X2NvbnRleHQoKSl7CisgICAgICAvKiBObyBjdXJyZW50IGNvbnRleHQsIGJ1dCB3ZSBtYXkgbmVlZCBvbmUgaW4gb3JkZXIgdG8gZGVsZXRlCisgICAgICAgKiB0ZXh0dXJlIG9ianMsIGV0Yy4gIFNvIHRlbXBvcmFyaWx5IGJpbmQgdGhlIGNvbnRleHQgbm93LgorICAgICAgICovCisgICAgICBfbWVzYV9tYWtlX2N1cnJlbnQoY3R4LCBOVUxMLCBOVUxMKTsKKyAgIH0KKworICAgaWYgKGN0eC0+VGhyZWFkUG9vbCkgeworICAgICAgX21lc2FfSGFzaFdhbGsoY3R4LT5TaGFyZWQtPlNoYWRlck9iamVjdHMsIHdhaXRfc2hhZGVyX29iamVjdF9jYiwgY3R4KTsKKyAgICAgIF9tZXNhX3RocmVhZHBvb2xfdW5yZWYoY3R4LT5UaHJlYWRQb29sKTsKKyAgICAgIGN0eC0+VGhyZWFkUG9vbCA9IE5VTEw7CisgICB9CisKKyAgIC8qIHVucmVmZXJlbmNlIFdpblN5c0RyYXcvUmVhZCBidWZmZXJzICovCisgICBfbWVzYV9yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+V2luU3lzRHJhd0J1ZmZlciwgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+V2luU3lzUmVhZEJ1ZmZlciwgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+RHJhd0J1ZmZlciwgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfZnJhbWVidWZmZXIoJmN0eC0+UmVhZEJ1ZmZlciwgTlVMTCk7CisKKyAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudCwgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfdmVydHByb2coY3R4LCAmY3R4LT5WZXJ0ZXhQcm9ncmFtLl9DdXJyZW50LCBOVUxMKTsKKyAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uX1RubFByb2dyYW0sIE5VTEwpOworCisgICBfbWVzYV9yZWZlcmVuY2VfZ2VvbXByb2coY3R4LCAmY3R4LT5HZW9tZXRyeVByb2dyYW0uQ3VycmVudCwgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfZ2VvbXByb2coY3R4LCAmY3R4LT5HZW9tZXRyeVByb2dyYW0uX0N1cnJlbnQsIE5VTEwpOworCisgICBfbWVzYV9yZWZlcmVuY2VfZnJhZ3Byb2coY3R4LCAmY3R4LT5GcmFnbWVudFByb2dyYW0uQ3VycmVudCwgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfZnJhZ3Byb2coY3R4LCAmY3R4LT5GcmFnbWVudFByb2dyYW0uX0N1cnJlbnQsIE5VTEwpOworICAgX21lc2FfcmVmZXJlbmNlX2ZyYWdwcm9nKGN0eCwgJmN0eC0+RnJhZ21lbnRQcm9ncmFtLl9UZXhFbnZQcm9ncmFtLCBOVUxMKTsKKworICAgX21lc2FfcmVmZXJlbmNlX3ZhbyhjdHgsICZjdHgtPkFycmF5LlZBTywgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfdmFvKGN0eCwgJmN0eC0+QXJyYXkuRGVmYXVsdFZBTywgTlVMTCk7CisKKyAgIF9tZXNhX2ZyZWVfYXR0cmliX2RhdGEoY3R4KTsKKyAgIF9tZXNhX2ZyZWVfYnVmZmVyX29iamVjdHMoY3R4KTsKKyAgIF9tZXNhX2ZyZWVfbGlnaHRpbmdfZGF0YSggY3R4ICk7CisgICBfbWVzYV9mcmVlX2V2YWxfZGF0YSggY3R4ICk7CisgICBfbWVzYV9mcmVlX3RleHR1cmVfZGF0YSggY3R4ICk7CisgICBfbWVzYV9mcmVlX21hdHJpeF9kYXRhKCBjdHggKTsKKyAgIF9tZXNhX2ZyZWVfdmlld3BvcnRfZGF0YSggY3R4ICk7CisgICBfbWVzYV9mcmVlX3BpcGVsaW5lX2RhdGEoY3R4KTsKKyAgIF9tZXNhX2ZyZWVfcHJvZ3JhbV9kYXRhKGN0eCk7CisgICBfbWVzYV9mcmVlX3NoYWRlcl9zdGF0ZShjdHgpOworICAgX21lc2FfZnJlZV9xdWVyeW9ial9kYXRhKGN0eCk7CisgICBfbWVzYV9mcmVlX3N5bmNfZGF0YShjdHgpOworICAgX21lc2FfZnJlZV92YXJyYXlfZGF0YShjdHgpOworICAgX21lc2FfZnJlZV90cmFuc2Zvcm1fZmVlZGJhY2soY3R4KTsKKyAgIF9tZXNhX2ZyZWVfcGVyZm9ybWFuY2VfbW9uaXRvcnMoY3R4KTsKKworICAgX21lc2FfcmVmZXJlbmNlX2J1ZmZlcl9vYmplY3QoY3R4LCAmY3R4LT5QYWNrLkJ1ZmZlck9iaiwgTlVMTCk7CisgICBfbWVzYV9yZWZlcmVuY2VfYnVmZmVyX29iamVjdChjdHgsICZjdHgtPlVucGFjay5CdWZmZXJPYmosIE5VTEwpOworICAgX21lc2FfcmVmZXJlbmNlX2J1ZmZlcl9vYmplY3QoY3R4LCAmY3R4LT5EZWZhdWx0UGFja2luZy5CdWZmZXJPYmosIE5VTEwpOworICAgX21lc2FfcmVmZXJlbmNlX2J1ZmZlcl9vYmplY3QoY3R4LCAmY3R4LT5BcnJheS5BcnJheUJ1ZmZlck9iaiwgTlVMTCk7CisKKyAgIC8qIGZyZWUgZGlzcGF0Y2ggdGFibGVzICovCisgICBmcmVlKGN0eC0+QmVnaW5FbmQpOworICAgZnJlZShjdHgtPk91dHNpZGVCZWdpbkVuZCk7CisgICBmcmVlKGN0eC0+U2F2ZSk7CisKKyAgIC8qIFNoYXJlZCBjb250ZXh0IHN0YXRlIChkaXNwbGF5IGxpc3RzLCB0ZXh0dXJlcywgZXRjKSAqLworICAgX21lc2FfcmVmZXJlbmNlX3NoYXJlZF9zdGF0ZShjdHgsICZjdHgtPlNoYXJlZCwgTlVMTCk7CisKKyAgIC8qIG5lZWRzIHRvIGJlIGFmdGVyIGZyZWVpbmcgc2hhcmVkIHN0YXRlICovCisgICBfbWVzYV9mcmVlX2Rpc3BsYXlfbGlzdF9kYXRhKGN0eCk7CisKKyAgIF9tZXNhX2ZyZWVfZXJyb3JzX2RhdGEoY3R4KTsKKworICAgZnJlZSgodm9pZCAqKWN0eC0+RXh0ZW5zaW9ucy5TdHJpbmcpOworCisgICBmcmVlKGN0eC0+VmVyc2lvblN0cmluZyk7CisKKyAgIC8qIHVuYmluZCB0aGUgY29udGV4dCBpZiBpdCdzIGN1cnJlbnRseSBib3VuZCAqLworICAgaWYgKGN0eCA9PSBfbWVzYV9nZXRfY3VycmVudF9jb250ZXh0KCkpIHsKKyAgICAgIF9tZXNhX21ha2VfY3VycmVudChOVUxMLCBOVUxMLCBOVUxMKTsKKyAgIH0KK30KKworCisvKioKKyAqIERlc3Ryb3kgYSBzdHJ1Y3QgZ2xfY29udGV4dCBzdHJ1Y3R1cmUuCisgKgorICogXHBhcmFtIGN0eCBHTCBjb250ZXh0LgorICogCisgKiBDYWxscyBfbWVzYV9mcmVlX2NvbnRleHRfZGF0YSgpIGFuZCBmcmVlcyB0aGUgZ2xfY29udGV4dCBvYmplY3QgaXRzZWxmLgorICovCit2b2lkCitfbWVzYV9kZXN0cm95X2NvbnRleHQoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggKQoreworICAgaWYgKGN0eCkgeworICAgICAgX21lc2FfZnJlZV9jb250ZXh0X2RhdGEoY3R4KTsKKyAgICAgIGZyZWUoICh2b2lkICopIGN0eCApOworICAgfQorfQorCisKKy8qKgorICogQ29weSBhdHRyaWJ1dGUgZ3JvdXBzIGZyb20gb25lIGNvbnRleHQgdG8gYW5vdGhlci4KKyAqIAorICogXHBhcmFtIHNyYyBzb3VyY2UgY29udGV4dAorICogXHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBjb250ZXh0CisgKiBccGFyYW0gbWFzayBiaXR3aXNlIE9SIG9mIEdMXypfQklUIGZsYWdzCisgKgorICogQWNjb3JkaW5nIHRvIHRoZSBiaXRzIHNwZWNpZmllZCBpbiBccCBtYXNrLCBjb3BpZXMgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGF0dHJpYnV0ZXMgZnJvbSBccCBzcmMgaW50byBccCBkc3QuICBGb3IgbWFueSBvZiB0aGUgYXR0cmlidXRlcyBhIHNpbXBsZSBcYworICogbWVtY3B5IGlzIG5vdCBlbm91Z2ggZHVlIHRvIHRoZSBleGlzdGVuY2Ugb2YgaW50ZXJuYWwgcG9pbnRlcnMgaW4gdGhlaXIgZGF0YQorICogc3RydWN0dXJlcy4KKyAqLwordm9pZAorX21lc2FfY29weV9jb250ZXh0KCBjb25zdCBzdHJ1Y3QgZ2xfY29udGV4dCAqc3JjLCBzdHJ1Y3QgZ2xfY29udGV4dCAqZHN0LAorICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbWFzayApCit7CisgICBpZiAobWFzayAmIEdMX0FDQ1VNX0JVRkZFUl9CSVQpIHsKKyAgICAgIC8qIE9LIHRvIG1lbWNweSAqLworICAgICAgZHN0LT5BY2N1bSA9IHNyYy0+QWNjdW07CisgICB9CisgICBpZiAobWFzayAmIEdMX0NPTE9SX0JVRkZFUl9CSVQpIHsKKyAgICAgIC8qIE9LIHRvIG1lbWNweSAqLworICAgICAgZHN0LT5Db2xvciA9IHNyYy0+Q29sb3I7CisgICB9CisgICBpZiAobWFzayAmIEdMX0NVUlJFTlRfQklUKSB7CisgICAgICAvKiBPSyB0byBtZW1jcHkgKi8KKyAgICAgIGRzdC0+Q3VycmVudCA9IHNyYy0+Q3VycmVudDsKKyAgIH0KKyAgIGlmIChtYXNrICYgR0xfREVQVEhfQlVGRkVSX0JJVCkgeworICAgICAgLyogT0sgdG8gbWVtY3B5ICovCisgICAgICBkc3QtPkRlcHRoID0gc3JjLT5EZXB0aDsKKyAgIH0KKyAgIGlmIChtYXNrICYgR0xfRU5BQkxFX0JJVCkgeworICAgICAgLyogbm8gb3AgKi8KKyAgIH0KKyAgIGlmIChtYXNrICYgR0xfRVZBTF9CSVQpIHsKKyAgICAgIC8qIE9LIHRvIG1lbWNweSAqLworICAgICAgZHN0LT5FdmFsID0gc3JjLT5FdmFsOworICAgfQorICAgaWYgKG1hc2sgJiBHTF9GT0dfQklUKSB7CisgICAgICAvKiBPSyB0byBtZW1jcHkgKi8KKyAgICAgIGRzdC0+Rm9nID0gc3JjLT5Gb2c7CisgICB9CisgICBpZiAobWFzayAmIEdMX0hJTlRfQklUKSB7CisgICAgICAvKiBPSyB0byBtZW1jcHkgKi8KKyAgICAgIGRzdC0+SGludCA9IHNyYy0+SGludDsKKyAgIH0KKyAgIGlmIChtYXNrICYgR0xfTElHSFRJTkdfQklUKSB7CisgICAgICBHTHVpbnQgaTsKKyAgICAgIC8qIGJlZ2luIHdpdGggbWVtY3B5ICovCisgICAgICBkc3QtPkxpZ2h0ID0gc3JjLT5MaWdodDsKKyAgICAgIC8qIGZpeHVwIGxpbmtlZCBsaXN0cyB0byBwcmV2ZW50IHBvaW50ZXIgaW5zYW5pdHkgKi8KKyAgICAgIG1ha2VfZW1wdHlfbGlzdCggJihkc3QtPkxpZ2h0LkVuYWJsZWRMaXN0KSApOworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9MSUdIVFM7IGkrKykgeworICAgICAgICAgaWYgKGRzdC0+TGlnaHQuTGlnaHRbaV0uRW5hYmxlZCkgeworICAgICAgICAgICAgaW5zZXJ0X2F0X3RhaWwoJihkc3QtPkxpZ2h0LkVuYWJsZWRMaXN0KSwgJihkc3QtPkxpZ2h0LkxpZ2h0W2ldKSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBpZiAobWFzayAmIEdMX0xJTkVfQklUKSB7CisgICAgICAvKiBPSyB0byBtZW1jcHkgKi8KKyAgICAgIGRzdC0+TGluZSA9IHNyYy0+TGluZTsKKyAgIH0KKyAgIGlmIChtYXNrICYgR0xfTElTVF9CSVQpIHsKKyAgICAgIC8qIE9LIHRvIG1lbWNweSAqLworICAgICAgZHN0LT5MaXN0ID0gc3JjLT5MaXN0OworICAgfQorICAgaWYgKG1hc2sgJiBHTF9QSVhFTF9NT0RFX0JJVCkgeworICAgICAgLyogT0sgdG8gbWVtY3B5ICovCisgICAgICBkc3QtPlBpeGVsID0gc3JjLT5QaXhlbDsKKyAgIH0KKyAgIGlmIChtYXNrICYgR0xfUE9JTlRfQklUKSB7CisgICAgICAvKiBPSyB0byBtZW1jcHkgKi8KKyAgICAgIGRzdC0+UG9pbnQgPSBzcmMtPlBvaW50OworICAgfQorICAgaWYgKG1hc2sgJiBHTF9QT0xZR09OX0JJVCkgeworICAgICAgLyogT0sgdG8gbWVtY3B5ICovCisgICAgICBkc3QtPlBvbHlnb24gPSBzcmMtPlBvbHlnb247CisgICB9CisgICBpZiAobWFzayAmIEdMX1BPTFlHT05fU1RJUFBMRV9CSVQpIHsKKyAgICAgIC8qIFVzZSBsb29wIGluc3RlYWQgb2YgbWVtY3B5IGR1ZSB0byBwcm9ibGVtIHdpdGggUG9ydGxhbmQgR3JvdXAncworICAgICAgICogQyBjb21waWxlci4gIFJlcG9ydGVkIGJ5IEpvaG4gU3RvbmUuCisgICAgICAgKi8KKyAgICAgIEdMdWludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgIGRzdC0+UG9seWdvblN0aXBwbGVbaV0gPSBzcmMtPlBvbHlnb25TdGlwcGxlW2ldOworICAgICAgfQorICAgfQorICAgaWYgKG1hc2sgJiBHTF9TQ0lTU09SX0JJVCkgeworICAgICAgLyogT0sgdG8gbWVtY3B5ICovCisgICAgICBkc3QtPlNjaXNzb3IgPSBzcmMtPlNjaXNzb3I7CisgICB9CisgICBpZiAobWFzayAmIEdMX1NURU5DSUxfQlVGRkVSX0JJVCkgeworICAgICAgLyogT0sgdG8gbWVtY3B5ICovCisgICAgICBkc3QtPlN0ZW5jaWwgPSBzcmMtPlN0ZW5jaWw7CisgICB9CisgICBpZiAobWFzayAmIEdMX1RFWFRVUkVfQklUKSB7CisgICAgICAvKiBDYW5ub3QgbWVtY3B5IGJlY2F1c2Ugb2YgcG9pbnRlcnMgKi8KKyAgICAgIF9tZXNhX2NvcHlfdGV4dHVyZV9zdGF0ZShzcmMsIGRzdCk7CisgICB9CisgICBpZiAobWFzayAmIEdMX1RSQU5TRk9STV9CSVQpIHsKKyAgICAgIC8qIE9LIHRvIG1lbWNweSAqLworICAgICAgZHN0LT5UcmFuc2Zvcm0gPSBzcmMtPlRyYW5zZm9ybTsKKyAgIH0KKyAgIGlmIChtYXNrICYgR0xfVklFV1BPUlRfQklUKSB7CisgICAgICAvKiBDYW5ub3QgdXNlIG1lbWNweSwgYmVjYXVzZSBvZiBwb2ludGVycyBpbiBHTG1hdHJpeCBfV2luZG93TWFwICovCisgICAgICB1bnNpZ25lZCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNyYy0+Q29uc3QuTWF4Vmlld3BvcnRzOyBpKyspIHsKKyAgICAgICAgIGRzdC0+Vmlld3BvcnRBcnJheVtpXS5YID0gc3JjLT5WaWV3cG9ydEFycmF5W2ldLlg7CisgICAgICAgICBkc3QtPlZpZXdwb3J0QXJyYXlbaV0uWSA9IHNyYy0+Vmlld3BvcnRBcnJheVtpXS5ZOworICAgICAgICAgZHN0LT5WaWV3cG9ydEFycmF5W2ldLldpZHRoID0gc3JjLT5WaWV3cG9ydEFycmF5W2ldLldpZHRoOworICAgICAgICAgZHN0LT5WaWV3cG9ydEFycmF5W2ldLkhlaWdodCA9IHNyYy0+Vmlld3BvcnRBcnJheVtpXS5IZWlnaHQ7CisgICAgICAgICBkc3QtPlZpZXdwb3J0QXJyYXlbaV0uTmVhciA9IHNyYy0+Vmlld3BvcnRBcnJheVtpXS5OZWFyOworICAgICAgICAgZHN0LT5WaWV3cG9ydEFycmF5W2ldLkZhciA9IHNyYy0+Vmlld3BvcnRBcnJheVtpXS5GYXI7CisgICAgICAgICBfbWF0aF9tYXRyaXhfY29weSgmZHN0LT5WaWV3cG9ydEFycmF5W2ldLl9XaW5kb3dNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjLT5WaWV3cG9ydEFycmF5W2ldLl9XaW5kb3dNYXApOworICAgICAgfQorICAgfQorCisgICAvKiBYWFggRklYTUU6ICBDYWxsIGNhbGxiYWNrcz8KKyAgICAqLworICAgZHN0LT5OZXdTdGF0ZSA9IF9ORVdfQUxMOworICAgZHN0LT5OZXdEcml2ZXJTdGF0ZSA9IH4wOworfQorCisKKy8qKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGNvbnRleHQgY2FuIHJlbmRlciBpbnRvIHRoZSBnaXZlbiBmcmFtZWJ1ZmZlcgorICogYnkgY2hlY2tpbmcgdmlzdWFsIGF0dHJpYnV0ZXMuCisgKgorICogTW9zdCBvZiB0aGVzZSB0ZXN0cyBjb3VsZCBnbyBhd2F5IGJlY2F1c2UgTWVzYSBpcyBub3cgcHJldHR5IGZsZXhpYmxlCisgKiBpbiB0ZXJtcyBvZiBtaXhpbmcgcmVuZGVyaW5nIGNvbnRleHRzIHdpdGggZnJhbWVidWZmZXJzLiAgQXMgbG9uZworICogYXMgUkdCIHZzLiBDSSBtb2RlIGFncmVlLCB3ZSdyZSBwcm9iYWJseSBnb29kLgorICoKKyAqIFxyZXR1cm4gR0xfVFJVRSBpZiBjb21wYXRpYmxlLCBHTF9GQUxTRSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4gCitjaGVja19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqYnVmZmVyKQoreworICAgY29uc3Qgc3RydWN0IGdsX2NvbmZpZyAqY3R4dmlzID0gJmN0eC0+VmlzdWFsOworICAgY29uc3Qgc3RydWN0IGdsX2NvbmZpZyAqYnVmdmlzID0gJmJ1ZmZlci0+VmlzdWFsOworCisgICBpZiAoYnVmZmVyID09IF9tZXNhX2dldF9pbmNvbXBsZXRlX2ZyYW1lYnVmZmVyKCkpCisgICAgICByZXR1cm4gR0xfVFJVRTsKKworI2lmIDAKKyAgIC8qIGRpc2FibGluZyB0aGlzIGZpeGVzIHRoZSBmZ2xfZ2x4Z2VhcnMgcGJ1ZmZlciBkZW1vICovCisgICBpZiAoY3R4dmlzLT5kb3VibGVCdWZmZXJNb2RlICYmICFidWZ2aXMtPmRvdWJsZUJ1ZmZlck1vZGUpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisjZW5kaWYKKyAgIGlmIChjdHh2aXMtPnN0ZXJlb01vZGUgJiYgIWJ1ZnZpcy0+c3RlcmVvTW9kZSkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIGlmIChjdHh2aXMtPmhhdmVBY2N1bUJ1ZmZlciAmJiAhYnVmdmlzLT5oYXZlQWNjdW1CdWZmZXIpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICBpZiAoY3R4dmlzLT5oYXZlRGVwdGhCdWZmZXIgJiYgIWJ1ZnZpcy0+aGF2ZURlcHRoQnVmZmVyKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgaWYgKGN0eHZpcy0+aGF2ZVN0ZW5jaWxCdWZmZXIgJiYgIWJ1ZnZpcy0+aGF2ZVN0ZW5jaWxCdWZmZXIpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICBpZiAoY3R4dmlzLT5yZWRNYXNrICYmIGN0eHZpcy0+cmVkTWFzayAhPSBidWZ2aXMtPnJlZE1hc2spCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICBpZiAoY3R4dmlzLT5ncmVlbk1hc2sgJiYgY3R4dmlzLT5ncmVlbk1hc2sgIT0gYnVmdmlzLT5ncmVlbk1hc2spCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICBpZiAoY3R4dmlzLT5ibHVlTWFzayAmJiBjdHh2aXMtPmJsdWVNYXNrICE9IGJ1ZnZpcy0+Ymx1ZU1hc2spCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisjaWYgMAorICAgLyogZGlzYWJsZWQgKHNlZSBidWcgMTExNjEpICovCisgICBpZiAoY3R4dmlzLT5kZXB0aEJpdHMgJiYgY3R4dmlzLT5kZXB0aEJpdHMgIT0gYnVmdmlzLT5kZXB0aEJpdHMpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisjZW5kaWYKKyAgIGlmIChjdHh2aXMtPnN0ZW5jaWxCaXRzICYmIGN0eHZpcy0+c3RlbmNpbEJpdHMgIT0gYnVmdmlzLT5zdGVuY2lsQml0cykKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKworLyoqCisgKiBDaGVjayBpZiB0aGUgdmlld3BvcnQvc2Npc3NvciBzaXplIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuCisgKiBJbml0aWFsaXplIHRoZSBzaXplIGlmIHRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBub24temVyby4KKyAqLwordm9pZAorX21lc2FfY2hlY2tfaW5pdF92aWV3cG9ydChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpCit7CisgICBpZiAoIWN0eC0+Vmlld3BvcnRJbml0aWFsaXplZCAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgdW5zaWduZWQgaTsKKworICAgICAgLyogTm90ZTogc2V0IGZsYWcgaGVyZSwgYmVmb3JlIGNhbGxpbmcgX21lc2Ffc2V0X3ZpZXdwb3J0KCksIHRvIHByZXZlbnQKKyAgICAgICAqIHBvdGVudGlhbCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgICAgKi8KKyAgICAgIGN0eC0+Vmlld3BvcnRJbml0aWFsaXplZCA9IEdMX1RSVUU7CisKKyAgICAgIC8qIE5vdGU6IGN0eC0+Q29uc3QuTWF4Vmlld3BvcnRzIG1heSBub3QgaGF2ZSBiZWVuIHNldCBieSB0aGUgZHJpdmVyCisgICAgICAgKiB5ZXQsIHNvIGp1c3QgaW5pdGlhbGl6ZSBhbGwgb2YgdGhlbS4KKyAgICAgICAqLworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9WSUVXUE9SVFM7IGkrKykgeworICAgICAgICAgX21lc2Ffc2V0X3ZpZXdwb3J0KGN0eCwgaSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICBfbWVzYV9zZXRfc2Npc3NvcihjdHgsIGksIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgfQorICAgfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2ZpcnN0X2N1cnJlbnQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIEdMZW51bSBidWZmZXI7CisgICBHTGludCBidWZmZXJJbmRleDsKKworICAgYXNzZXJ0KGN0eC0+VmVyc2lvbiA+IDApOworCisgICBjdHgtPkV4dGVuc2lvbnMuU3RyaW5nID0gX21lc2FfbWFrZV9leHRlbnNpb25fc3RyaW5nKGN0eCk7CisKKyAgIGNoZWNrX2NvbnRleHRfbGltaXRzKGN0eCk7CisKKyAgIC8qIEFjY29yZGluZyB0byBHTF9NRVNBX2NvbmZpZ2xlc3NfY29udGV4dCB0aGUgZGVmYXVsdCB2YWx1ZSBvZgorICAgICogZ2xEcmF3QnVmZmVycyBkZXBlbmRzIG9uIHRoZSBjb25maWcgb2YgdGhlIGZpcnN0IHN1cmZhY2UgaXQgaXMgYm91bmQgdG8uCisgICAgKiBGb3IgR0xFUyBpdCBpcyBhbHdheXMgR0xfQkFDSyB3aGljaCBoYXMgYSBtYWdpYyBpbnRlcnByZXRhdGlvbiAqLworICAgaWYgKCFjdHgtPkhhc0NvbmZpZyAmJiBfbWVzYV9pc19kZXNrdG9wX2dsKGN0eCkpIHsKKyAgICAgIGlmIChjdHgtPkRyYXdCdWZmZXIgIT0gX21lc2FfZ2V0X2luY29tcGxldGVfZnJhbWVidWZmZXIoKSkgeworICAgICAgICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+VmlzdWFsLmRvdWJsZUJ1ZmZlck1vZGUpCisgICAgICAgICAgICBidWZmZXIgPSBHTF9CQUNLOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmZmVyID0gR0xfRlJPTlQ7CisKKyAgICAgICAgIF9tZXNhX2RyYXdidWZmZXJzKGN0eCwgMSwgJmJ1ZmZlciwgTlVMTCAvKiBkZXN0TWFzayAqLyk7CisgICAgICB9CisKKyAgICAgIGlmIChjdHgtPlJlYWRCdWZmZXIgIT0gX21lc2FfZ2V0X2luY29tcGxldGVfZnJhbWVidWZmZXIoKSkgeworICAgICAgICAgaWYgKGN0eC0+UmVhZEJ1ZmZlci0+VmlzdWFsLmRvdWJsZUJ1ZmZlck1vZGUpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IEdMX0JBQ0s7CisgICAgICAgICAgICBidWZmZXJJbmRleCA9IEJVRkZFUl9CQUNLX0xFRlQ7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IEdMX0ZST05UOworICAgICAgICAgICAgYnVmZmVySW5kZXggPSBCVUZGRVJfRlJPTlRfTEVGVDsKKyAgICAgICAgIH0KKworICAgICAgICAgX21lc2FfcmVhZGJ1ZmZlcihjdHgsIGJ1ZmZlciwgYnVmZmVySW5kZXgpOworICAgICAgfQorICAgfQorCisgICAvKiBXZSBjYW4gdXNlIHRoaXMgdG8gaGVscCBkZWJ1ZyB1c2VyJ3MgcHJvYmxlbXMuICBUZWxsIHRoZW0gdG8gc2V0CisgICAgKiB0aGUgTUVTQV9JTkZPIGVudiB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyB0aGVpciBhcHAuICBUaGVuIHRoZQorICAgICogZmlyc3QgdGltZSBlYWNoIGNvbnRleHQgaXMgbWFkZSBjdXJyZW50IHdlJ2xsIHByaW50IHNvbWUgdXNlZnVsCisgICAgKiBpbmZvcm1hdGlvbi4KKyAgICAqLworICAgaWYgKF9tZXNhX2dldGVudigiTUVTQV9JTkZPIikpIHsKKyAgICAgIF9tZXNhX3ByaW50X2luZm8oY3R4KTsKKyAgIH0KK30KKworLyoqCisgKiBCaW5kIHRoZSBnaXZlbiBjb250ZXh0IHRvIHRoZSBnaXZlbiBkcmF3QnVmZmVyIGFuZCByZWFkQnVmZmVyIGFuZAorICogbWFrZSBpdCB0aGUgY3VycmVudCBjb250ZXh0IGZvciB0aGUgY2FsbGluZyB0aHJlYWQuCisgKiBXZSdsbCByZW5kZXIgaW50byB0aGUgZHJhd0J1ZmZlciBhbmQgcmVhZCBwaXhlbHMgZnJvbSB0aGUKKyAqIHJlYWRCdWZmZXIgKGkuZS4gZ2xSZWFkL0NvcHlQaXhlbHMsIGdsQ29weVRleEltYWdlLCBldGMpLgorICoKKyAqIFdlIGNoZWNrIHRoYXQgdGhlIGNvbnRleHQncyBhbmQgZnJhbWVidWZmZXIncyB2aXN1YWxzIGFyZSBjb21wYXRpYmxlCisgKiBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZXkncmUgbm90LgorICoKKyAqIFxwYXJhbSBuZXdDdHggIHRoZSBuZXcgR0wgY29udGV4dC4gSWYgTlVMTCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gY3VycmVudCBHTAorICogICAgICAgICAgICAgICAgY29udGV4dC4KKyAqIFxwYXJhbSBkcmF3QnVmZmVyICB0aGUgZHJhd2luZyBmcmFtZWJ1ZmZlcgorICogXHBhcmFtIHJlYWRCdWZmZXIgIHRoZSByZWFkaW5nIGZyYW1lYnVmZmVyCisgKi8KK0dMYm9vbGVhbgorX21lc2FfbWFrZV9jdXJyZW50KCBzdHJ1Y3QgZ2xfY29udGV4dCAqbmV3Q3R4LAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmRyYXdCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqcmVhZEJ1ZmZlciApCit7CisgICBHRVRfQ1VSUkVOVF9DT05URVhUKGN1ckN0eCk7CisKKyAgIGlmIChNRVNBX1ZFUkJPU0UgJiBWRVJCT1NFX0FQSSkKKyAgICAgIF9tZXNhX2RlYnVnKG5ld0N0eCwgIl9tZXNhX21ha2VfY3VycmVudCgpXG4iKTsKKworICAgLyogQ2hlY2sgdGhhdCB0aGUgY29udGV4dCdzIGFuZCBmcmFtZWJ1ZmZlcidzIHZpc3VhbHMgYXJlIGNvbXBhdGlibGUuCisgICAgKi8KKyAgIGlmIChuZXdDdHggJiYgZHJhd0J1ZmZlciAmJiBuZXdDdHgtPldpblN5c0RyYXdCdWZmZXIgIT0gZHJhd0J1ZmZlcikgeworICAgICAgaWYgKCFjaGVja19jb21wYXRpYmxlKG5ld0N0eCwgZHJhd0J1ZmZlcikpIHsKKyAgICAgICAgIF9tZXNhX3dhcm5pbmcobmV3Q3R4LAorICAgICAgICAgICAgICAiTWFrZUN1cnJlbnQ6IGluY29tcGF0aWJsZSB2aXN1YWxzIGZvciBjb250ZXh0IGFuZCBkcmF3YnVmZmVyIik7CisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CisgICB9CisgICBpZiAobmV3Q3R4ICYmIHJlYWRCdWZmZXIgJiYgbmV3Q3R4LT5XaW5TeXNSZWFkQnVmZmVyICE9IHJlYWRCdWZmZXIpIHsKKyAgICAgIGlmICghY2hlY2tfY29tcGF0aWJsZShuZXdDdHgsIHJlYWRCdWZmZXIpKSB7CisgICAgICAgICBfbWVzYV93YXJuaW5nKG5ld0N0eCwKKyAgICAgICAgICAgICAgIk1ha2VDdXJyZW50OiBpbmNvbXBhdGlibGUgdmlzdWFscyBmb3IgY29udGV4dCBhbmQgcmVhZGJ1ZmZlciIpOworICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgfQorICAgfQorCisgICBpZiAoY3VyQ3R4ICYmIAorICAgICAgKGN1ckN0eC0+V2luU3lzRHJhd0J1ZmZlciB8fCBjdXJDdHgtPldpblN5c1JlYWRCdWZmZXIpICYmCisgICAgICAgLyogbWFrZSBzdXJlIHRoaXMgY29udGV4dCBpcyB2YWxpZCBmb3IgZmx1c2hpbmcgKi8KKyAgICAgIGN1ckN0eCAhPSBuZXdDdHgpCisgICAgICBfbWVzYV9mbHVzaChjdXJDdHgpOworCisgICAvKiBXZSB1c2VkIHRvIGNhbGwgX2dsYXBpX2NoZWNrX211bHRpdGhyZWFkKCkgaGVyZS4gIE5vdyBkbyBpdCBpbiBkcml2ZXJzICovCisgICBfZ2xhcGlfc2V0X2NvbnRleHQoKHZvaWQgKikgbmV3Q3R4KTsKKyAgIEFTU0VSVChfbWVzYV9nZXRfY3VycmVudF9jb250ZXh0KCkgPT0gbmV3Q3R4KTsKKworICAgaWYgKCFuZXdDdHgpIHsKKyAgICAgIF9nbGFwaV9zZXRfZGlzcGF0Y2goTlVMTCk7ICAvKiBub25lIGN1cnJlbnQgKi8KKyAgIH0KKyAgIGVsc2UgeworICAgICAgX2dsYXBpX3NldF9kaXNwYXRjaChuZXdDdHgtPkN1cnJlbnREaXNwYXRjaCk7CisKKyAgICAgIGlmIChkcmF3QnVmZmVyICYmIHJlYWRCdWZmZXIpIHsKKyAgICAgICAgIEFTU0VSVChfbWVzYV9pc193aW5zeXNfZmJvKGRyYXdCdWZmZXIpKTsKKyAgICAgICAgIEFTU0VSVChfbWVzYV9pc193aW5zeXNfZmJvKHJlYWRCdWZmZXIpKTsKKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmbmV3Q3R4LT5XaW5TeXNEcmF3QnVmZmVyLCBkcmF3QnVmZmVyKTsKKyAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmbmV3Q3R4LT5XaW5TeXNSZWFkQnVmZmVyLCByZWFkQnVmZmVyKTsKKworICAgICAgICAgLyoKKyAgICAgICAgICAqIE9ubHkgc2V0IHRoZSBjb250ZXh0J3MgRHJhdy9SZWFkQnVmZmVyIGZpZWxkcyBpZiB0aGV5J3JlIE5VTEwKKyAgICAgICAgICAqIG9yIG5vdCBib3VuZCB0byBhIHVzZXItY3JlYXRlZCBGQk8uCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICghbmV3Q3R4LT5EcmF3QnVmZmVyIHx8IF9tZXNhX2lzX3dpbnN5c19mYm8obmV3Q3R4LT5EcmF3QnVmZmVyKSkgeworICAgICAgICAgICAgX21lc2FfcmVmZXJlbmNlX2ZyYW1lYnVmZmVyKCZuZXdDdHgtPkRyYXdCdWZmZXIsIGRyYXdCdWZmZXIpOworICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBGQk8ncyBsaXN0IG9mIGRyYXdidWZmZXJzL3JlbmRlcmJ1ZmZlcnMuCisgICAgICAgICAgICAgKiBGb3Igd2luc3lzIEZCT3MgdGhpcyBjb21lcyBmcm9tIHRoZSBHTCBzdGF0ZSAod2hpY2ggbWF5IGhhdmUKKyAgICAgICAgICAgICAqIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIEZCTyB3YXMgYm91bmQpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBfbWVzYV91cGRhdGVfZHJhd19idWZmZXJzKG5ld0N0eCk7CisgICAgICAgICB9CisgICAgICAgICBpZiAoIW5ld0N0eC0+UmVhZEJ1ZmZlciB8fCBfbWVzYV9pc193aW5zeXNfZmJvKG5ld0N0eC0+UmVhZEJ1ZmZlcikpIHsKKyAgICAgICAgICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmbmV3Q3R4LT5SZWFkQnVmZmVyLCByZWFkQnVmZmVyKTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogWFhYIG9ubHkgc2V0IHRoaXMgZmxhZyBpZiB3ZSdyZSByZWFsbHkgY2hhbmdpbmcgdGhlIGRyYXcvcmVhZAorICAgICAgICAgICogZnJhbWVidWZmZXIgYmluZGluZ3MuCisgICAgICAgICAgKi8KKwkgbmV3Q3R4LT5OZXdTdGF0ZSB8PSBfTkVXX0JVRkZFUlM7CisKKyAgICAgICAgIGlmIChkcmF3QnVmZmVyKSB7CisgICAgICAgICAgICBfbWVzYV9jaGVja19pbml0X3ZpZXdwb3J0KG5ld0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0J1ZmZlci0+V2lkdGgsIGRyYXdCdWZmZXItPkhlaWdodCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChuZXdDdHgtPkZpcnN0VGltZUN1cnJlbnQpIHsKKyAgICAgICAgIGhhbmRsZV9maXJzdF9jdXJyZW50KG5ld0N0eCk7CisJIG5ld0N0eC0+Rmlyc3RUaW1lQ3VycmVudCA9IEdMX0ZBTFNFOworICAgICAgfQorICAgfQorICAgCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisvKioKKyAqIE1ha2UgY29udGV4dCAnY3R4JyBzaGFyZSB0aGUgZGlzcGxheSBsaXN0cywgdGV4dHVyZXMgYW5kIHByb2dyYW1zCisgKiB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggJ2N0eFRvU2hhcmUnLgorICogQW55IGRpc3BsYXkgbGlzdHMsIHRleHR1cmVzIG9yIHByb2dyYW1zIGFzc29jaWF0ZWQgd2l0aCAnY3R4JyB3aWxsCisgKiBiZSBkZWxldGVkIGlmIG5vYm9keSBlbHNlIGlzIHNoYXJpbmcgdGhlbS4KKyAqLworR0xib29sZWFuCitfbWVzYV9zaGFyZV9zdGF0ZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4VG9TaGFyZSkKK3sKKyAgIGlmIChjdHggJiYgY3R4VG9TaGFyZSAmJiBjdHgtPlNoYXJlZCAmJiBjdHhUb1NoYXJlLT5TaGFyZWQpIHsKKyAgICAgIHN0cnVjdCBnbF9zaGFyZWRfc3RhdGUgKm9sZFNoYXJlZCA9IE5VTEw7CisKKyAgICAgIC8qIHNhdmUgcmVmIHRvIG9sZCBzdGF0ZSB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgZGVsZXRlZCBpbW1lZGlhdGVseSAqLworICAgICAgX21lc2FfcmVmZXJlbmNlX3NoYXJlZF9zdGF0ZShjdHgsICZvbGRTaGFyZWQsIGN0eC0+U2hhcmVkKTsKKworICAgICAgLyogdXBkYXRlIGN0eCdzIFNoYXJlZCBwb2ludGVyICovCisgICAgICBfbWVzYV9yZWZlcmVuY2Vfc2hhcmVkX3N0YXRlKGN0eCwgJmN0eC0+U2hhcmVkLCBjdHhUb1NoYXJlLT5TaGFyZWQpOworCisgICAgICB1cGRhdGVfZGVmYXVsdF9vYmplY3RzKGN0eCk7CisKKyAgICAgIC8qIHJlbGVhc2UgdGhlIG9sZCBzaGFyZWQgc3RhdGUgKi8KKyAgICAgIF9tZXNhX3JlZmVyZW5jZV9zaGFyZWRfc3RhdGUoY3R4LCAmb2xkU2hhcmVkLCBOVUxMKTsKKworICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9CisgICBlbHNlIHsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KK30KKworCisKKy8qKgorICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBjdXJyZW50IEdMIGNvbnRleHQgZm9yIHRoaXMgdGhyZWFkLgorICogCisgKiBDYWxscyBfZ2xhcGlfZ2V0X2NvbnRleHQoKS4gVGhpcyBpc24ndCB0aGUgZmFzdGVzdCB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50CisgKiBjb250ZXh0LiAgSWYgeW91IG5lZWQgc3BlZWQsIHNlZSB0aGUgI0dFVF9DVVJSRU5UX0NPTlRFWFQgbWFjcm8gaW4KKyAqIGNvbnRleHQuaC4KKyAqLworc3RydWN0IGdsX2NvbnRleHQgKgorX21lc2FfZ2V0X2N1cnJlbnRfY29udGV4dCggdm9pZCApCit7CisgICByZXR1cm4gKHN0cnVjdCBnbF9jb250ZXh0ICopIF9nbGFwaV9nZXRfY29udGV4dCgpOworfQorCisKKy8qKgorICogR2V0IGNvbnRleHQncyBjdXJyZW50IEFQSSBkaXNwYXRjaCB0YWJsZS4KKyAqCisgKiBJdCdsbCBlaXRoZXIgYmUgdGhlIGltbWVkaWF0ZS1tb2RlIGV4ZWN1dGUgZGlzcGF0Y2hlciBvciB0aGUgZGlzcGxheSBsaXN0CisgKiBjb21waWxlIGRpc3BhdGNoZXIuCisgKiAKKyAqIFxwYXJhbSBjdHggR0wgY29udGV4dC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gZGlzcGF0Y2hfdGFibGUuCisgKgorICogU2ltcGx5IHJldHVybnMgX19zdHJ1Y3QgZ2xfY29udGV4dFJlYzo6Q3VycmVudERpc3BhdGNoLgorICovCitzdHJ1Y3QgX2dsYXBpX3RhYmxlICoKK19tZXNhX2dldF9kaXNwYXRjaChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgcmV0dXJuIGN0eC0+Q3VycmVudERpc3BhdGNoOworfQorCisvKkB9Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKkB7Ki8KKworLyoqCisgKiBSZWNvcmQgYW4gZXJyb3IuCisgKgorICogXHBhcmFtIGN0eCBHTCBjb250ZXh0LgorICogXHBhcmFtIGVycm9yIGVycm9yIGNvZGUuCisgKiAKKyAqIFJlY29yZHMgdGhlIGdpdmVuIGVycm9yIGNvZGUgYW5kIGNhbGwgdGhlIGRyaXZlcidzIGRkX2Z1bmN0aW9uX3RhYmxlOjpFcnJvcgorICogZnVuY3Rpb24gaWYgZGVmaW5lZC4KKyAqCisgKiBcc2EKKyAqIFRoaXMgaXMgY2FsbGVkIHZpYSBfbWVzYV9lcnJvcigpLgorICovCit2b2lkCitfbWVzYV9yZWNvcmRfZXJyb3Ioc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIGVycm9yKQoreworICAgaWYgKCFjdHgpCisgICAgICByZXR1cm47CisKKyAgIGlmIChjdHgtPkVycm9yVmFsdWUgPT0gR0xfTk9fRVJST1IpIHsKKyAgICAgIGN0eC0+RXJyb3JWYWx1ZSA9IGVycm9yOworICAgfQorfQorCisKKy8qKgorICogRmx1c2ggY29tbWFuZHMgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uCisgKi8KK3ZvaWQKK19tZXNhX2ZpbmlzaChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgRkxVU0hfVkVSVElDRVMoIGN0eCwgMCApOworICAgRkxVU0hfQ1VSUkVOVCggY3R4LCAwICk7CisgICBpZiAoY3R4LT5Ecml2ZXIuRmluaXNoKSB7CisgICAgICBjdHgtPkRyaXZlci5GaW5pc2goY3R4KTsKKyAgIH0KK30KKworCisvKioKKyAqIEZsdXNoIGNvbW1hbmRzLgorICovCit2b2lkCitfbWVzYV9mbHVzaChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgRkxVU0hfVkVSVElDRVMoIGN0eCwgMCApOworICAgRkxVU0hfQ1VSUkVOVCggY3R4LCAwICk7CisgICBpZiAoY3R4LT5Ecml2ZXIuRmx1c2gpIHsKKyAgICAgIGN0eC0+RHJpdmVyLkZsdXNoKGN0eCk7CisgICB9Cit9CisKKworCisvKioKKyAqIEV4ZWN1dGUgZ2xGaW5pc2goKS4KKyAqCisgKiBDYWxscyB0aGUgI0FTU0VSVF9PVVRTSURFX0JFR0lOX0VORF9BTkRfRkxVU0ggbWFjcm8gYW5kIHRoZQorICogZGRfZnVuY3Rpb25fdGFibGU6OkZpbmlzaCBkcml2ZXIgY2FsbGJhY2ssIGlmIG5vdCBOVUxMLgorICovCit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0ZpbmlzaCh2b2lkKQoreworICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOworICAgQVNTRVJUX09VVFNJREVfQkVHSU5fRU5EKGN0eCk7CisgICBfbWVzYV9maW5pc2goY3R4KTsKK30KKworCisvKioKKyAqIEV4ZWN1dGUgZ2xGbHVzaCgpLgorICoKKyAqIENhbGxzIHRoZSAjQVNTRVJUX09VVFNJREVfQkVHSU5fRU5EX0FORF9GTFVTSCBtYWNybyBhbmQgdGhlCisgKiBkZF9mdW5jdGlvbl90YWJsZTo6Rmx1c2ggZHJpdmVyIGNhbGxiYWNrLCBpZiBub3QgTlVMTC4KKyAqLwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9GbHVzaCh2b2lkKQoreworICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdHgpOworICAgQVNTRVJUX09VVFNJREVfQkVHSU5fRU5EKGN0eCk7CisgICBfbWVzYV9mbHVzaChjdHgpOworfQorCisKKy8qCisgKiBBUkJfYmxlbmRfZnVuY19leHRlbmRlZCAtIEVSUk9SUyBzZWN0aW9uCisgKiAiVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSBCZWdpbiBvciBhbnkgcHJvY2VkdXJlIHRoYXQKKyAqICBpbXBsaWNpdGx5IGNhbGxzIEJlZ2luIGlmIGFueSBkcmF3IGJ1ZmZlciBoYXMgYSBibGVuZCBmdW5jdGlvbiByZXF1aXJpbmcgdGhlCisgKiAgc2Vjb25kIGNvbG9yIGlucHV0IChTUkMxX0NPTE9SLCBPTkVfTUlOVVNfU1JDMV9DT0xPUiwgU1JDMV9BTFBIQSBvcgorICogIE9ORV9NSU5VU19TUkMxX0FMUEhBKSwgYW5kIGEgZnJhbWVidWZmZXIgaXMgYm91bmQgdGhhdCBoYXMgbW9yZSB0aGFuCisgKiAgdGhlIHZhbHVlIG9mIE1BWF9EVUFMX1NPVVJDRV9EUkFXX0JVRkZFUlMtMSBhY3RpdmUgY29sb3IgYXR0YWNoZW1lbnRzLiIKKyAqLworc3RhdGljIEdMYm9vbGVhbgorX21lc2FfY2hlY2tfYmxlbmRfZnVuY19lcnJvcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgR0x1aW50IGk7CisgICBmb3IgKGkgPSBjdHgtPkNvbnN0Lk1heER1YWxTb3VyY2VEcmF3QnVmZmVyczsKKwlpIDwgY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsKKwlpKyspIHsKKyAgICAgIGlmIChjdHgtPkNvbG9yLkJsZW5kW2ldLl9Vc2VzRHVhbFNyYykgeworCSBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfT1BFUkFUSU9OLAorCQkgICAgICJkdWFsIHNvdXJjZSBibGVuZCBvbiBpbGxlZ2FsIGF0dGFjaG1lbnQiKTsKKwkgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgfQorICAgfQorICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKK3N0YXRpYyBib29sCitzaGFkZXJfbGlua2VkX29yX2Fic2VudChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2csCisgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaGFkZXJfcHJlc2VudCwgY29uc3QgY2hhciAqd2hlcmUpCit7CisgICBpZiAoc2hQcm9nKSB7CisgICAgICAqc2hhZGVyX3ByZXNlbnQgPSB0cnVlOworCisgICAgICBpZiAoIXNoUHJvZy0+TGlua1N0YXR1cykgeworICAgICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwgIiVzKHNoYWRlciBub3QgbGlua2VkKSIsIHdoZXJlKTsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyNpZiAwIC8qIG5vdCBub3JtYWxseSBlbmFibGVkICovCisgICAgICB7CisgICAgICAgICBjaGFyIGVyck1zZ1sxMDBdOworICAgICAgICAgaWYgKCFfbWVzYV92YWxpZGF0ZV9zaGFkZXJfcHJvZ3JhbShjdHgsIHNoUHJvZywgZXJyTXNnKSkgeworICAgICAgICAgICAgX21lc2Ffd2FybmluZyhjdHgsICJTaGFkZXIgcHJvZ3JhbSAldSBpcyBpbnZhbGlkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoUHJvZy0+TmFtZSwgZXJyTXNnKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBQcmlvciB0byBkcmF3aW5nIGFueXRoaW5nIHdpdGggZ2xCZWdpbiwgZ2xEcmF3QXJyYXlzLCBldGMuIHRoaXMgZnVuY3Rpb24KKyAqIGlzIGNhbGxlZCB0byBzZWUgaWYgaXQncyB2YWxpZCB0byByZW5kZXIuICBUaGlzIGludm9sdmVzIGNoZWNraW5nIHRoYXQKKyAqIHRoZSBjdXJyZW50IHNoYWRlciBpcyB2YWxpZCBhbmQgdGhlIGZyYW1lYnVmZmVyIGlzIGNvbXBsZXRlLgorICogSXQgYWxzbyBjaGVjayB0aGUgY3VycmVudCBwaXBlbGluZSBvYmplY3QgaXMgdmFsaWQgaWYgYW55LgorICogSWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgaXQnbGwgYmUgcmVjb3JkZWQgaGVyZS4KKyAqIFxyZXR1cm4gR0xfVFJVRSBpZiBPSyB0byByZW5kZXIsIEdMX0ZBTFNFIGlmIG5vdAorICovCitHTGJvb2xlYW4KK19tZXNhX3ZhbGlkX3RvX3JlbmRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICp3aGVyZSkKK3sKKyAgIGJvb2wgZnJvbV9nbHNsX3NoYWRlcltNRVNBX1NIQURFUl9DT01QVVRFXSA9IHsgZmFsc2UgfTsKKyAgIHVuc2lnbmVkIGk7CisKKyAgIC8qIFRoaXMgZGVwZW5kcyBvbiBoYXZpbmcgdXAgdG8gZGF0ZSBkZXJpdmVkIHN0YXRlIChzaGFkZXJzKSAqLworICAgaWYgKGN0eC0+TmV3U3RhdGUpCisgICAgICBfbWVzYV91cGRhdGVfc3RhdGUoY3R4KTsKKworICAgZm9yIChpID0gMDsgaSA8IE1FU0FfU0hBREVSX0NPTVBVVEU7IGkrKykgeworICAgICAgaWYgKCFzaGFkZXJfbGlua2VkX29yX2Fic2VudChjdHgsIGN0eC0+X1NoYWRlci0+Q3VycmVudFByb2dyYW1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm9tX2dsc2xfc2hhZGVyW2ldLCB3aGVyZSkpCisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyAgIC8qIEFueSBzaGFkZXIgc3RhZ2VzIHRoYXQgYXJlIG5vdCBzdXBwbGllZCBieSB0aGUgR0xTTCBzaGFkZXIgYW5kIGhhdmUKKyAgICAqIGFzc2VtYmx5IHNoYWRlcnMgZW5hYmxlZCBtdXN0IG5vdyBiZSB2YWxpZGF0ZWQuCisgICAgKi8KKyAgIGlmICghZnJvbV9nbHNsX3NoYWRlcltNRVNBX1NIQURFUl9WRVJURVhdCisgICAgICAgJiYgY3R4LT5WZXJ0ZXhQcm9ncmFtLkVuYWJsZWQgJiYgIWN0eC0+VmVydGV4UHJvZ3JhbS5fRW5hYmxlZCkgeworICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwKKwkJICAiJXModmVydGV4IHByb2dyYW0gbm90IHZhbGlkKSIsIHdoZXJlKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgLyogRklOSVNITUU6IElmIEdMX05WX2dlb21ldHJ5X3Byb2dyYW00IGlzIGV2ZXIgc3VwcG9ydGVkLCB0aGUgY3VycmVudAorICAgICogRklOSVNITUU6IGdlb21ldHJ5IHByb2dyYW0gc2hvdWxkIHZhbGlkYXRlZCBoZXJlLgorICAgICovCisgICAodm9pZCkgZnJvbV9nbHNsX3NoYWRlcltNRVNBX1NIQURFUl9HRU9NRVRSWV07CisKKyAgIGlmICghZnJvbV9nbHNsX3NoYWRlcltNRVNBX1NIQURFUl9GUkFHTUVOVF0pIHsKKyAgICAgIGlmIChjdHgtPkZyYWdtZW50UHJvZ3JhbS5FbmFibGVkICYmICFjdHgtPkZyYWdtZW50UHJvZ3JhbS5fRW5hYmxlZCkgeworCSBfbWVzYV9lcnJvcihjdHgsIEdMX0lOVkFMSURfT1BFUkFUSU9OLAorCQkgICAgICIlcyhmcmFnbWVudCBwcm9ncmFtIG5vdCB2YWxpZCkiLCB3aGVyZSk7CisJIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKworICAgICAgLyogSWYgZHJhd2luZyB0byBpbnRlZ2VyLXZhbHVlZCBjb2xvciBidWZmZXJzLCB0aGVyZSBtdXN0IGJlIGFuCisgICAgICAgKiBhY3RpdmUgZnJhZ21lbnQgc2hhZGVyIChHTF9FWFRfdGV4dHVyZV9pbnRlZ2VyKS4KKyAgICAgICAqLworICAgICAgaWYgKGN0eC0+RHJhd0J1ZmZlciAmJiBjdHgtPkRyYXdCdWZmZXItPl9JbnRlZ2VyQ29sb3IpIHsKKyAgICAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAiJXMoaW50ZWdlciBmb3JtYXQgYnV0IG5vIGZyYWdtZW50IHNoYWRlcikiLCB3aGVyZSk7CisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICB9CisgICB9CisKKyAgIC8qIEEgcGlwZWxpbmUgb2JqZWN0IGlzIGJvdW5kICovCisgICBpZiAoY3R4LT5fU2hhZGVyLT5OYW1lICYmICFjdHgtPl9TaGFkZXItPlZhbGlkYXRlZCkgeworICAgICAgLyogRXJyb3IgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQgaW5zaWRlIF9tZXNhX3ZhbGlkYXRlX3Byb2dyYW1fcGlwZWxpbmUuCisgICAgICAgKi8KKyAgICAgIGlmICghX21lc2FfdmFsaWRhdGVfcHJvZ3JhbV9waXBlbGluZShjdHgsIGN0eC0+X1NoYWRlciwgR0xfVFJVRSkpIHsKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGN0eC0+RHJhd0J1ZmZlci0+X1N0YXR1cyAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9FWFQpIHsKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fRVhULAorICAgICAgICAgICAgICAgICAgIiVzKGluY29tcGxldGUgZnJhbWVidWZmZXIpIiwgd2hlcmUpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoX21lc2FfY2hlY2tfYmxlbmRfZnVuY19lcnJvcihjdHgpID09IEdMX0ZBTFNFKSB7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9CisKKyNpZmRlZiBERUJVRworICAgaWYgKGN0eC0+R2xzbEZsYWdzICYgR0xTTF9MT0cpIHsKKyAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqKnNoUHJvZyA9IGN0eC0+X1NoYWRlci0+Q3VycmVudFByb2dyYW07CisgICAgICBnbF9zaGFkZXJfc3RhZ2UgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisJIGlmIChzaFByb2dbaV0gPT0gTlVMTCB8fCBzaFByb2dbaV0tPl9Vc2VkCisJICAgICB8fCBzaFByb2dbaV0tPl9MaW5rZWRTaGFkZXJzW2ldID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhpcyBzaGFkZXIgaXMgYmVpbmcgdXNlZC4KKwkgICogQXBwZW5kIHNoYWRlcidzIGNvbnN0YW50cy91bmlmb3JtcyB0byBsb2cgZmlsZS4KKwkgICoKKwkgICogT25seSBsb2cgZGF0YSBmb3IgdGhlIHByb2dyYW0gdGFyZ2V0IHRoYXQgbWF0Y2hlcyB0aGUgc2hhZGVyCisJICAqIHRhcmdldC4gIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIHByb2dyYW0gYm91bmQgdG8gdGhlIHZlcnRleAorCSAgKiBzaGFkZXIgdGFyZ2V0IHRoYXQgYWxzbyBzdXBwbGllZCBhIGZyYWdtZW50IHNoYWRlci4gIElmIHRoYXQKKwkgICogcHJvZ3JhbSBpc24ndCBhbHNvIGJvdW5kIHRvIHRoZSBmcmFnbWVudCBzaGFkZXIgdGFyZ2V0IHdlIGRvbid0CisJICAqIHdhbnQgdG8gbG9nIGl0cyBmcmFnbWVudCBkYXRhLgorCSAgKi8KKwkgX21lc2FfYXBwZW5kX3VuaWZvcm1zX3RvX2ZpbGUoc2hQcm9nW2ldLT5fTGlua2VkU2hhZGVyc1tpXSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworCSBpZiAoc2hQcm9nW2ldICE9IE5VTEwpCisJICAgIHNoUHJvZ1tpXS0+X1VzZWQgPSBHTF9UUlVFOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9jb250ZXh0LmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNmOWZhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9jb250ZXh0LmgKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisvKioKKyAqIFxmaWxlIGNvbnRleHQuaAorICogTWVzYSBjb250ZXh0IGFuZCB2aXN1YWwtcmVsYXRlZCBmdW5jdGlvbnMuCisgKgorICogVGhlcmUgYXJlIHRocmVlIGxhcmdlIE1lc2EgZGF0YSB0eXBlcy9jbGFzc2VzIHdoaWNoIGFyZSBtZWFudCB0byBiZQorICogdXNlZCBieSBkZXZpY2UgZHJpdmVyczoKKyAqIC0gc3RydWN0IGdsX2NvbnRleHQ6IHRoaXMgY29udGFpbnMgdGhlIE1lc2EgcmVuZGVyaW5nIHN0YXRlCisgKiAtIHN0cnVjdCBnbF9jb25maWc6ICB0aGlzIGRlc2NyaWJlcyB0aGUgY29sb3IgYnVmZmVyIChSR0IgdnMuIGNpKSwgd2hldGhlcgorICogICBvciBub3QgdGhlcmUncyBhIGRlcHRoIGJ1ZmZlciwgc3RlbmNpbCBidWZmZXIsIGV0Yy4KKyAqIC0gc3RydWN0IGdsX2ZyYW1lYnVmZmVyOiAgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGRlcHRoIGJ1ZmZlciwgc3RlbmNpbAorICogICBidWZmZXIsIGFjY3VtIGJ1ZmZlciBhbmQgYWxwaGEgYnVmZmVycy4KKyAqCisgKiBUaGVzZSB0eXBlcyBzaG91bGQgYmUgZW5jYXBzdWxhdGVkIGJ5IGNvcnJlc3BvbmRpbmcgZGV2aWNlIGRyaXZlcgorICogZGF0YSB0eXBlcy4gIFNlZSB4bWVzYS5oIGFuZCB4bWVzYVAuaCBmb3IgYW4gZXhhbXBsZS4KKyAqCisgKiBJbiBPT1AgdGVybXMsIHN0cnVjdCBnbF9jb250ZXh0LCBzdHJ1Y3QgZ2xfY29uZmlnLCBhbmQgc3RydWN0IGdsX2ZyYW1lYnVmZmVyCisgKiBhcmUgYmFzZSBjbGFzc2VzIHdoaWNoIHRoZSBkZXZpY2UgZHJpdmVyIG11c3QgZGVyaXZlIGZyb20uCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIGFuZCBkZXN0cm95IHRoZXNlIGRhdGEgdHlwZXMuCisgKi8KKworCisjaWZuZGVmIENPTlRFWFRfSAorI2RlZmluZSBDT05URVhUX0gKKworCisjaW5jbHVkZSAiaW1wb3J0cy5oIgorI2luY2x1ZGUgIm10eXBlcy5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitzdHJ1Y3QgX2dsYXBpX3RhYmxlOworCisKKy8qKiBcbmFtZSBWaXN1YWwtcmVsYXRlZCBmdW5jdGlvbnMgKi8KKy8qQHsqLworIAorZXh0ZXJuIHN0cnVjdCBnbF9jb25maWcgKgorX21lc2FfY3JlYXRlX3Zpc3VhbCggR0xib29sZWFuIGRiRmxhZywKKyAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBzdGVyZW9GbGFnLAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgcmVkQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGdyZWVuQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJsdWVCaXRzLAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYWxwaGFCaXRzLAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgZGVwdGhCaXRzLAorICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc3RlbmNpbEJpdHMsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBhY2N1bVJlZEJpdHMsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBhY2N1bUdyZWVuQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGFjY3VtQmx1ZUJpdHMsCisgICAgICAgICAgICAgICAgICAgICBHTGludCBhY2N1bUFscGhhQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IG51bVNhbXBsZXMgKTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21lc2FfaW5pdGlhbGl6ZV92aXN1YWwoIHN0cnVjdCBnbF9jb25maWcgKnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIGRiRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gc3RlcmVvRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCByZWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGdyZWVuQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBibHVlQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBhbHBoYUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgZGVwdGhCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHN0ZW5jaWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGFjY3VtUmVkQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBhY2N1bUdyZWVuQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBhY2N1bUJsdWVCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGFjY3VtQWxwaGFCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IG51bVNhbXBsZXMgKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2Rlc3Ryb3lfdmlzdWFsKCBzdHJ1Y3QgZ2xfY29uZmlnICp2aXMgKTsKKworLypAfSovCisKKworLyoqIFxuYW1lIENvbnRleHQtcmVsYXRlZCBmdW5jdGlvbnMgKi8KKy8qQHsqLworCitleHRlcm4gR0xib29sZWFuCitfbWVzYV9pbml0aWFsaXplX2NvbnRleHQoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX2FwaSBhcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9jb25maWcgKnZpc3VhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2NvbnRleHQgKnNoYXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZHJpdmVyRnVuY3Rpb25zKTsKKworZXh0ZXJuIHN0cnVjdCBnbF9jb250ZXh0ICoKK19tZXNhX2NyZWF0ZV9jb250ZXh0KGdsX2FwaSBhcGksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfY29uZmlnICp2aXN1YWwsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfY29udGV4dCAqc2hhcmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZHJpdmVyRnVuY3Rpb25zKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2VuYWJsZV9nbHNsX3RocmVhZHBvb2woc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgaW50IG1heF90aHJlYWRzKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZyZWVfY29udGV4dF9kYXRhKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ICk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9kZXN0cm95X2NvbnRleHQoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggKTsKKworCitleHRlcm4gdm9pZAorX21lc2FfY29weV9jb250ZXh0KGNvbnN0IHN0cnVjdCBnbF9jb250ZXh0ICpzcmMsIHN0cnVjdCBnbF9jb250ZXh0ICpkc3QsIEdMdWludCBtYXNrKTsKKworCitleHRlcm4gdm9pZAorX21lc2FfY2hlY2tfaW5pdF92aWV3cG9ydChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpOworCitleHRlcm4gR0xib29sZWFuCitfbWVzYV9tYWtlX2N1cnJlbnQoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZHJhd0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpyZWFkQnVmZmVyICk7CisKK2V4dGVybiBHTGJvb2xlYW4KK19tZXNhX3NoYXJlX3N0YXRlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9jb250ZXh0ICpjdHhUb1NoYXJlKTsKKworZXh0ZXJuIHN0cnVjdCBnbF9jb250ZXh0ICoKK19tZXNhX2dldF9jdXJyZW50X2NvbnRleHQodm9pZCk7CisKKy8qQH0qLworCitleHRlcm4gdm9pZAorX21lc2FfaW5pdF9nZXRfaGFzaChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX25vdGlmeVN3YXBCdWZmZXJzKHN0cnVjdCBnbF9jb250ZXh0ICpnYyk7CisKKworZXh0ZXJuIHN0cnVjdCBfZ2xhcGlfdGFibGUgKgorX21lc2FfZ2V0X2Rpc3BhdGNoKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCisKK2V4dGVybiBHTGJvb2xlYW4KK19tZXNhX3ZhbGlkX3RvX3JlbmRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICp3aGVyZSk7CisKKworCisvKiogXG5hbWUgTWlzY2VsbGFuZW91cyAqLworLypAeyovCisKK2V4dGVybiB2b2lkCitfbWVzYV9yZWNvcmRfZXJyb3IoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBlcnJvciApOworCisKK2V4dGVybiB2b2lkCitfbWVzYV9maW5pc2goc3RydWN0IGdsX2NvbnRleHQgKmN0eCk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9mbHVzaChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKworZXh0ZXJuIGludAorX21lc2FfZ2VuZXJpY19ub3Aodm9pZCk7CisKK2V4dGVybiB2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0ZpbmlzaCggdm9pZCApOworCitleHRlcm4gdm9pZCBHTEFQSUVOVFJZCitfbWVzYV9GbHVzaCggdm9pZCApOworCisvKkB9Ki8KKworCisvKioKKyAqIEFyZSB3ZSBjdXJyZW50bHkgYmV0d2VlbiBnbEJlZ2luIGFuZCBnbEVuZD8KKyAqIER1cmluZyBleGVjdXRpb24sIG5vdCBkaXNwbGF5IGxpc3QgY29tcGlsYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgR0xib29sZWFuCitfbWVzYV9pbnNpZGVfYmVnaW5fZW5kKGNvbnN0IHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICByZXR1cm4gY3R4LT5Ecml2ZXIuQ3VycmVudEV4ZWNQcmltaXRpdmUgIT0gUFJJTV9PVVRTSURFX0JFR0lOX0VORDsKK30KKworCisvKioKKyAqIEFyZSB3ZSBjdXJyZW50bHkgYmV0d2VlbiBnbEJlZ2luIGFuZCBnbEVuZCBpbiBhIGRpc3BsYXkgbGlzdD8KKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK19tZXNhX2luc2lkZV9kbGlzdF9iZWdpbl9lbmQoY29uc3Qgc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIHJldHVybiBjdHgtPkRyaXZlci5DdXJyZW50U2F2ZVByaW1pdGl2ZSA8PSBQUklNX01BWDsKK30KKworCisKKy8qKgorICogXG5hbWUgTWFjcm9zIGZvciBmbHVzaGluZyBidWZmZXJlZCByZW5kZXJpbmcgY29tbWFuZHMgYmVmb3JlIHN0YXRlIGNoYW5nZXMsCisgKiBjaGVja2luZyBpZiBpbnNpZGUgZ2xCZWdpbi9nbEVuZCwgZXRjLgorICovCisvKkB7Ki8KKworLyoqCisgKiBGbHVzaCB2ZXJ0aWNlcy4KKyAqCisgKiBccGFyYW0gY3R4IEdMIGNvbnRleHQuCisgKiBccGFyYW0gbmV3c3RhdGUgbmV3IHN0YXRlLgorICoKKyAqIENoZWNrcyBpZiBkZF9mdW5jdGlvbl90YWJsZTo6TmVlZEZsdXNoIGlzIG1hcmtlZCB0byBmbHVzaCBzdG9yZWQgdmVydGljZXMsCisgKiBhbmQgY2FsbHMgZGRfZnVuY3Rpb25fdGFibGU6OkZsdXNoVmVydGljZXMgaWYgc28uIE1hcmtzCisgKiBfX3N0cnVjdCBnbF9jb250ZXh0UmVjOjpOZXdTdGF0ZSB3aXRoIFxwIG5ld3N0YXRlLgorICovCisjZGVmaW5lIEZMVVNIX1ZFUlRJQ0VTKGN0eCwgbmV3c3RhdGUpCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgIGlmIChNRVNBX1ZFUkJPU0UgJiBWRVJCT1NFX1NUQVRFKQkJCQlcCisgICAgICBfbWVzYV9kZWJ1ZyhjdHgsICJGTFVTSF9WRVJUSUNFUyBpbiAlc1xuIiwgTUVTQV9GVU5DVElPTik7XAorICAgaWYgKGN0eC0+RHJpdmVyLk5lZWRGbHVzaCAmIEZMVVNIX1NUT1JFRF9WRVJUSUNFUykJCVwKKyAgICAgIGN0eC0+RHJpdmVyLkZsdXNoVmVydGljZXMoY3R4LCBGTFVTSF9TVE9SRURfVkVSVElDRVMpOwlcCisgICBjdHgtPk5ld1N0YXRlIHw9IG5ld3N0YXRlOwkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiBGbHVzaCBjdXJyZW50IHN0YXRlLgorICoKKyAqIFxwYXJhbSBjdHggR0wgY29udGV4dC4KKyAqIFxwYXJhbSBuZXdzdGF0ZSBuZXcgc3RhdGUuCisgKgorICogQ2hlY2tzIGlmIGRkX2Z1bmN0aW9uX3RhYmxlOjpOZWVkRmx1c2ggaXMgbWFya2VkIHRvIGZsdXNoIGN1cnJlbnQgc3RhdGUsCisgKiBhbmQgY2FsbHMgZGRfZnVuY3Rpb25fdGFibGU6OkZsdXNoVmVydGljZXMgaWYgc28uIE1hcmtzCisgKiBfX3N0cnVjdCBnbF9jb250ZXh0UmVjOjpOZXdTdGF0ZSB3aXRoIFxwIG5ld3N0YXRlLgorICovCisjZGVmaW5lIEZMVVNIX0NVUlJFTlQoY3R4LCBuZXdzdGF0ZSkJCQkJXAorZG8gewkJCQkJCQkJXAorICAgaWYgKE1FU0FfVkVSQk9TRSAmIFZFUkJPU0VfU1RBVEUpCQkJCVwKKyAgICAgIF9tZXNhX2RlYnVnKGN0eCwgIkZMVVNIX0NVUlJFTlQgaW4gJXNcbiIsIE1FU0FfRlVOQ1RJT04pOwlcCisgICBpZiAoY3R4LT5Ecml2ZXIuTmVlZEZsdXNoICYgRkxVU0hfVVBEQVRFX0NVUlJFTlQpCQlcCisgICAgICBjdHgtPkRyaXZlci5GbHVzaFZlcnRpY2VzKGN0eCwgRkxVU0hfVVBEQVRFX0NVUlJFTlQpOwlcCisgICBjdHgtPk5ld1N0YXRlIHw9IG5ld3N0YXRlOwkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiBNYWNybyB0byBhc3NlcnQgdGhhdCB0aGUgQVBJIGNhbGwgd2FzIG1hZGUgb3V0c2lkZSB0aGUKKyAqIGdsQmVnaW4oKS9nbEVuZCgpIHBhaXIsIHdpdGggcmV0dXJuIHZhbHVlLgorICogCisgKiBccGFyYW0gY3R4IEdMIGNvbnRleHQuCisgKiBccGFyYW0gcmV0dmFsIHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIHRoZSBhc3NlcnRpb24gZmFpbHMuCisgKi8KKyNkZWZpbmUgQVNTRVJUX09VVFNJREVfQkVHSU5fRU5EX1dJVEhfUkVUVkFMKGN0eCwgcmV0dmFsKQkJXAorZG8gewkJCQkJCQkJCVwKKyAgIGlmIChfbWVzYV9pbnNpZGVfYmVnaW5fZW5kKGN0eCkpIHsJCQkJCVwKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnNpZGUgZ2xCZWdpbi9nbEVuZCIpOwlcCisgICAgICByZXR1cm4gcmV0dmFsOwkJCQkJCQlcCisgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiBNYWNybyB0byBhc3NlcnQgdGhhdCB0aGUgQVBJIGNhbGwgd2FzIG1hZGUgb3V0c2lkZSB0aGUKKyAqIGdsQmVnaW4oKS9nbEVuZCgpIHBhaXIuCisgKiAKKyAqIFxwYXJhbSBjdHggR0wgY29udGV4dC4KKyAqLworI2RlZmluZSBBU1NFUlRfT1VUU0lERV9CRUdJTl9FTkQoY3R4KQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgIGlmIChfbWVzYV9pbnNpZGVfYmVnaW5fZW5kKGN0eCkpIHsJCQkJCVwKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnNpZGUgZ2xCZWdpbi9nbEVuZCIpOwlcCisgICAgICByZXR1cm47CQkJCQkJCQlcCisgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLypAfSovCisKKworLyoqCisgKiBDaGVja3MgaWYgdGhlIGNvbnRleHQgaXMgZm9yIERlc2t0b3AgR0wgKENvbXBhdGliaWxpdHkgb3IgQ29yZSkKKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK19tZXNhX2lzX2Rlc2t0b3BfZ2woY29uc3Qgc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIHJldHVybiBjdHgtPkFQSSA9PSBBUElfT1BFTkdMX0NPTVBBVCB8fCBjdHgtPkFQSSA9PSBBUElfT1BFTkdMX0NPUkU7Cit9CisKKworLyoqCisgKiBDaGVja3MgaWYgdGhlIGNvbnRleHQgaXMgZm9yIGFueSBHTEVTIHZlcnNpb24KKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK19tZXNhX2lzX2dsZXMoY29uc3Qgc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIHJldHVybiBjdHgtPkFQSSA9PSBBUElfT1BFTkdMRVMgfHwgY3R4LT5BUEkgPT0gQVBJX09QRU5HTEVTMjsKK30KKworCisvKioKKyAqIENoZWNrcyBpZiB0aGUgY29udGV4dCBpcyBmb3IgR0xFUyAzLngKKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK19tZXNhX2lzX2dsZXMzKGNvbnN0IHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICByZXR1cm4gY3R4LT5BUEkgPT0gQVBJX09QRU5HTEVTMiAmJiBjdHgtPlZlcnNpb24gPj0gMzA7Cit9CisKKworLyoqCisgKiBDaGVja3MgaWYgdGhlIGNvbnRleHQgc3VwcG9ydHMgZ2VvbWV0cnkgc2hhZGVycy4KKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK19tZXNhX2hhc19nZW9tZXRyeV9zaGFkZXJzKGNvbnN0IHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICByZXR1cm4gX21lc2FfaXNfZGVza3RvcF9nbChjdHgpICYmCisgICAgICAoY3R4LT5WZXJzaW9uID49IDMyIHx8IGN0eC0+RXh0ZW5zaW9ucy5BUkJfZ2VvbWV0cnlfc2hhZGVyNCk7Cit9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2RkLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlMGFkNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZGQuaApAQCAtMCwwICsxLDExMzggQEAKKy8qKgorICogXGZpbGUgZGQuaAorICogRGV2aWNlIGRyaXZlciBpbnRlcmZhY2VzLgorICovCisKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIEREX0lOQ0xVREVECisjZGVmaW5lIEREX0lOQ0xVREVECisKKy8qIFRISVMgRklMRSBPTkxZIElOQ0xVREVEIEJZIG10eXBlcy5oICEhISEhICovCisKKyNpbmNsdWRlICJnbGhlYWRlci5oIgorCitzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdDsKK3N0cnVjdCBnbF9jb250ZXh0Oworc3RydWN0IGdsX2Rpc3BsYXlfbGlzdDsKK3N0cnVjdCBnbF9mcmFtZWJ1ZmZlcjsKK3N0cnVjdCBnbF9pbWFnZV91bml0Oworc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliOworc3RydWN0IGdsX3Byb2dyYW07CitzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyOworc3RydWN0IGdsX3JlbmRlcmJ1ZmZlcl9hdHRhY2htZW50Oworc3RydWN0IGdsX3NoYWRlcjsKK3N0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbTsKK3N0cnVjdCBnbF90ZXh0dXJlX2ltYWdlOworc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0OworCisvKiBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QgKi8KKy8qIE1vZGlmaWVzIEdMX01BUF9VTlNZTkNIUk9OSVpFRF9CSVQgdG8gYWxsb3cgZHJpdmVyIHRvIGZhaWwgKHJldHVybgorICogTlVMTCkgaWYgYnVmZmVyIGlzIHVuYXZhaWxhYmxlIGZvciBpbW1lZGlhdGUgbWFwcGluZy4KKyAqCisgKiBEb2VzIEdMX01BUF9JTlZBTElEQVRFX1JBTkdFX0JJVCBkbyB0aGlzPyAgSXQgc2VlbXMgc28sIGJ1dCBpdAorICogd291bGQgcmVxdWlyZSBtb3JlIGJvb2sta2VlcGluZyBpbiB0aGUgZHJpdmVyIHRoYW4gc2VlbXMgbmVjZXNzYXJ5CisgKiBhdCB0aGlzIHBvaW50LgorICoKKyAqIERvZXMgR0xfTUFQX0lOVkFMRElBVEVfQlVGRkVSX0JJVCBkbyB0aGlzPyAgTm90IHJlYWxseSAtLSB3ZSBkb24ndAorICogd2FudCB0byBwcm92b2tlIHRoZSBkcml2ZXIgdG8gdGhyb3cgYXdheSB0aGUgb2xkIHN0b3JhZ2UsIHdlIHdpbGwKKyAqIHJlc3BlY3QgdGhlIGNvbnRlbnRzIG9mIGFscmVhZHkgcmVmZXJlbmNlZCBkYXRhLgorICovCisjZGVmaW5lIE1FU0FfTUFQX05PV0FJVF9CSVQgICAgICAgMHgwMDQwCisKKworLyoqCisgKiBEZXZpY2UgZHJpdmVyIGZ1bmN0aW9uIHRhYmxlLgorICogQ29yZSBNZXNhIHVzZXMgdGhlc2UgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY2FsbCBpbnRvIGRldmljZSBkcml2ZXJzLgorICogTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgY29ycmVzcG9uZCB0byBPcGVuR0wgc3RhdGUgY29tbWFuZHMuCisgKiBDb3JlIE1lc2Egd2lsbCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBhZnRlciBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lCisgKiBzbyB0aGF0IHRoZSBkcml2ZXJzIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZXJyb3IgdGVzdGluZy4KKyAqCisgKiBWZXJ0ZXggdHJhbnNmb3JtYXRpb24vY2xpcHBpbmcvbGlnaHRpbmcgaXMgcGF0Y2hlZCBpbnRvIHRoZSBUJkwgbW9kdWxlLgorICogUmFzdGVyaXphdGlvbiBmdW5jdGlvbnMgYXJlIHBhdGNoZWQgaW50byB0aGUgc3dyYXN0IG1vZHVsZS4KKyAqCisgKiBOb3RlOiB3aGVuIG5ldyBmdW5jdGlvbnMgYXJlIGFkZGVkIGhlcmUsIHRoZSBkcml2ZXJzL2NvbW1vbi9kcml2ZXJmdW5jcy5jCisgKiBmaWxlIHNob3VsZCBiZSB1cGRhdGVkIHRvbyEhIQorICovCitzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgeworICAgLyoqCisgICAgKiBSZXR1cm4gYSBzdHJpbmcgYXMgbmVlZGVkIGJ5IGdsR2V0U3RyaW5nKCkuCisgICAgKiBPbmx5IHRoZSBHTF9SRU5ERVJFUiBxdWVyeSBtdXN0IGJlIGltcGxlbWVudGVkLiAgT3RoZXJ3aXNlLCBOVUxMIGNhbiBiZQorICAgICogcmV0dXJuZWQuCisgICAgKi8KKyAgIGNvbnN0IEdMdWJ5dGUgKiAoKkdldFN0cmluZykoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBuYW1lICk7CisKKyAgIC8qKgorICAgICogTm90aWZ5IHRoZSBkcml2ZXIgYWZ0ZXIgTWVzYSBoYXMgbWFkZSBzb21lIGludGVybmFsIHN0YXRlIGNoYW5nZXMuICAKKyAgICAqCisgICAgKiBUaGlzIGlzIGluIGFkZGl0aW9uIHRvIGFueSBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2tzIE1lc2EgbWF5IGFscmVhZHkgaGF2ZQorICAgICogbWFkZS4KKyAgICAqLworICAgdm9pZCAoKlVwZGF0ZVN0YXRlKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xiaXRmaWVsZCBuZXdfc3RhdGUgKTsKKworICAgLyoqCisgICAgKiBSZXNpemUgdGhlIGdpdmVuIGZyYW1lYnVmZmVyIHRvIHRoZSBnaXZlbiBzaXplLgorICAgICogWFhYIE9CU09MRVRFOiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICAgICovCisgICB2b2lkICgqUmVzaXplQnVmZmVycykoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCk7CisKKyAgIC8qKgorICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgZ2xGaW5pc2goKSBpcyBjYWxsZWQuCisgICAgKi8KKyAgIHZvaWQgKCpGaW5pc2gpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ICk7CisKKyAgIC8qKgorICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgZ2xGbHVzaCgpIGlzIGNhbGxlZC4KKyAgICAqLworICAgdm9pZCAoKkZsdXNoKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCApOworCisgICAvKioKKyAgICAqIENsZWFyIHRoZSBjb2xvci9kZXB0aC9zdGVuY2lsL2FjY3VtIGJ1ZmZlcihzKS4KKyAgICAqIFxwYXJhbSBidWZmZXJzICBhIGJpdG1hc2sgb2YgQlVGRkVSX0JJVF8qIGZsYWdzIGluZGljYXRpbmcgd2hpY2gKKyAgICAqICAgICAgICAgICAgICAgICByZW5kZXJidWZmZXJzIG5lZWQgdG8gYmUgY2xlYXJlZC4KKyAgICAqLworICAgdm9pZCAoKkNsZWFyKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xiaXRmaWVsZCBidWZmZXJzICk7CisKKyAgIC8qKgorICAgICogRXhlY3V0ZSBnbEFjY3VtIGNvbW1hbmQuCisgICAgKi8KKyAgIHZvaWQgKCpBY2N1bSkoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBvcCwgR0xmbG9hdCB2YWx1ZSApOworCisKKyAgIC8qKgorICAgICogRXhlY3V0ZSBnbFJhc3RlclBvcywgdXBkYXRpbmcgdGhlIGN0eC0+Q3VycmVudC5SYXN0ZXIgZmllbGRzCisgICAgKi8KKyAgIHZvaWQgKCpSYXN0ZXJQb3MpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBHTGZsb2F0IHZbNF0gKTsKKworICAgLyoqCisgICAgKiBcbmFtZSBJbWFnZS1yZWxhdGVkIGZ1bmN0aW9ucworICAgICovCisgICAvKkB7Ki8KKworICAgLyoqCisgICAgKiBDYWxsZWQgYnkgZ2xEcmF3UGl4ZWxzKCkuCisgICAgKiBccCB1bnBhY2sgZGVzY3JpYmVzIGhvdyB0byB1bnBhY2sgdGhlIHNvdXJjZSBpbWFnZSBkYXRhLgorICAgICovCisgICB2b2lkICgqRHJhd1BpeGVscykoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisJCSAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKwkJICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGdsX3BpeGVsc3RvcmVfYXR0cmliICp1bnBhY2ssCisJCSAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscyApOworCisgICAvKioKKyAgICAqIENhbGxlZCBieSBnbFJlYWRQaXhlbHMoKS4KKyAgICAqLworICAgdm9pZCAoKlJlYWRQaXhlbHMpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisJCSAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBnbF9waXhlbHN0b3JlX2F0dHJpYiAqdW5wYWNrLAorCQkgICAgICAgR0x2b2lkICpkZXN0ICk7CisKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsQ29weVBpeGVscygpLiAgCisgICAgKi8KKyAgIHZvaWQgKCpDb3B5UGl4ZWxzKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xpbnQgc3JjeCwgR0xpbnQgc3JjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGRzdHgsIEdMaW50IGRzdHksIEdMZW51bSB0eXBlICk7CisKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsQml0bWFwKCkuICAKKyAgICAqLworICAgdm9pZCAoKkJpdG1hcCkoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisJCSAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorCQkgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnVucGFjaywKKwkJICAgY29uc3QgR0x1Ynl0ZSAqYml0bWFwICk7CisgICAvKkB9Ki8KKworICAgCisgICAvKioKKyAgICAqIFxuYW1lIFRleHR1cmUgaW1hZ2UgZnVuY3Rpb25zCisgICAgKi8KKyAgIC8qQHsqLworCisgICAvKioKKyAgICAqIENob29zZSBhY3R1YWwgaGFyZHdhcmUgdGV4dHVyZSBmb3JtYXQgZ2l2ZW4gdGhlIHRleHR1cmUgdGFyZ2V0LCB0aGUKKyAgICAqIHVzZXItcHJvdmlkZWQgc291cmNlIGltYWdlIGZvcm1hdCBhbmQgdHlwZSBhbmQgdGhlIGRlc2lyZWQgaW50ZXJuYWwKKyAgICAqIGZvcm1hdC4gIEluIHNvbWUgY2FzZXMsIHNyY0Zvcm1hdCBhbmQgc3JjVHlwZSBjYW4gYmUgR0xfTk9ORS4KKyAgICAqIE5vdGU6ICB0YXJnZXQgbWF5IGJlIEdMX1RFWFRVUkVfQ1VCRV9NQVAsIGJ1dCBuZXZlcgorICAgICogR0xfVEVYVFVSRV9DVUJFX01BUF9bUE9TSVRJVkUvTkVHQVRJVkVdX1tYWVpdLgorICAgICogQ2FsbGVkIGJ5IGdsVGV4SW1hZ2UoKSwgZXRjLgorICAgICovCisgICBtZXNhX2Zvcm1hdCAoKkNob29zZVRleHR1cmVGb3JtYXQpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gc3JjRm9ybWF0LCBHTGVudW0gc3JjVHlwZSApOworCisgICAvKioKKyAgICAqIERldGVybWluZSBzYW1wbGUgY291bnRzIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQgYW5kIGZvcm1hdAorICAgICoKKyAgICAqIFxwYXJhbSBjdHggICAgICAgICAgICBHTCBjb250ZXh0CisgICAgKiBccGFyYW0gdGFyZ2V0ICAgICAgICAgR0wgdGFyZ2V0IGVudW0KKyAgICAqIFxwYXJhbSBpbnRlcm5hbEZvcm1hdCBHTCBmb3JtYXQgZW51bQorICAgICogXHBhcmFtIHNhbXBsZXMgICAgICAgIEJ1ZmZlciB0byBob2xkIHRoZSByZXR1cm5lZCBzYW1wbGUgY291bnRzLgorICAgICogICAgICAgICAgICAgICAgICAgICAgIERyaXZlcnMgXGIgbXVzdCBcYiBub3QgcmV0dXJuIG1vcmUgdGhhbiAxNiBjb3VudHMuCisgICAgKgorICAgICogXHJldHVybnMKKyAgICAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlIGNvdW50cyBhY3R1YWxseSB3cml0dGVuIHRvIFxjIHNhbXBsZXMuICBJZgorICAgICogXGMgaW50ZXJuYUZvcm1hdCBpcyBub3QgcmVuZGVyYWJsZSwgemVybyBpcyByZXR1cm5lZC4KKyAgICAqLworICAgc2l6ZV90ICgqUXVlcnlTYW1wbGVzRm9yRm9ybWF0KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzWzE2XSk7CisKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsVGV4SW1hZ2VbMTIzXUQoKSBhbmQgZ2xDb3B5VGV4SW1hZ2VbMTJdRCgpCisgICAgKiBBbGxvY2F0ZSB0ZXh0dXJlIG1lbW9yeSBhbmQgY29weSB0aGUgdXNlcidzIGltYWdlIHRvIHRoZSBidWZmZXIuCisgICAgKiBUaGUgZ2xfdGV4dHVyZV9pbWFnZSBmaWVsZHMsIGV0Yy4gd2lsbCBiZSBmdWxseSBpbml0aWFsaXplZC4KKyAgICAqIFRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyBnbFRleEltYWdlM0QoKSwgcGx1czoKKyAgICAqIFxwYXJhbSBkaW1zICAxLCAyLCBvciAzIGluZGljYXRpbmcgZ2xUZXhJbWFnZTEvMi8zRCgpCisgICAgKiBccGFyYW0gcGFja2luZyBkZXNjcmliZXMgaG93IHRvIHVucGFjayB0aGUgc291cmNlIGRhdGEuCisgICAgKiBccGFyYW0gdGV4SW1hZ2UgaXMgdGhlIGRlc3RpbmF0aW9uIHRleHR1cmUgaW1hZ2UuCisgICAgKi8KKyAgIHZvaWQgKCpUZXhJbWFnZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IGRpbXMsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcpOworCisgICAvKioKKyAgICAqIENhbGxlZCBieSBnbFRleFN1YkltYWdlWzEyM11EKCkuCisgICAgKiBSZXBsYWNlIGEgc3Vic2V0IG9mIHRoZSB0YXJnZXQgdGV4dHVyZSB3aXRoIG5ldyB0ZXhlbCBkYXRhLgorICAgICovCisgICB2b2lkICgqVGV4U3ViSW1hZ2UpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBkaW1zLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcGl4ZWxzdG9yZV9hdHRyaWIgKnBhY2tpbmcpOworCisKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsR2V0VGV4SW1hZ2UoKS4KKyAgICAqLworICAgdm9pZCAoKkdldFRleEltYWdlKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSApOworCisgICAvKioKKyAgICAqIENhbGxlZCBieSBnbENvcHlUZXhbU3ViXUltYWdlWzEyM11EKCkuCisgICAgKgorICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgY29weSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBpbiB0aGUgcmIgdG8gYSBzaW5nbGUKKyAgICAqIGRlc3RpbmF0aW9uIHNsaWNlLCBzcGVjaWZpZWQgYnkgQHNsaWNlLiAgSW4gdGhlIGNhc2Ugb2YgMUQgYXJyYXkKKyAgICAqIHRleHR1cmVzICh3aGVyZSBvbmUgR0wgY2FsbCBjYW4gcG90ZW50aWFsbHkgYWZmZWN0IG11bHRpcGxlIGRlc3RpbmF0aW9uCisgICAgKiBzbGljZXMpLCBjb3JlIG1lc2EgdGFrZXMgY2FyZSBvZiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMsCisgICAgKiBvbmNlIGZvciBlYWNoIHNjYW5saW5lIHRvIGJlIGNvcGllZC4KKyAgICAqLworICAgdm9pZCAoKkNvcHlUZXhTdWJJbWFnZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IGRpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCBzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKworICAgLyoqCisgICAgKiBDYWxsZWQgYnkgZ2xHZW5lcmF0ZU1pcG1hcCgpIG9yIHdoZW4gR0xfR0VORVJBVEVfTUlQTUFQX1NHSVMgaXMgZW5hYmxlZC4KKyAgICAqIE5vdGUgdGhhdCBpZiB0aGUgdGV4dHVyZSBpcyBhIGN1YmUgbWFwLCB0aGUgPHRhcmdldD4gcGFyYW1ldGVyIHdpbGwKKyAgICAqIGluZGljYXRlIHdoaWNoIGN1YmUgZmFjZSB0byBnZW5lcmF0ZSAoR0xfUE9TSVRJVkUvTkVHQVRJVkVfWC9ZL1opLgorICAgICogdGV4T2JqLT5CYXNlTGV2ZWwgaXMgdGhlIGxldmVsIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIHJlbWFpbmluZworICAgICogbWlwbWFwIGxldmVscy4KKyAgICAqLworICAgdm9pZCAoKkdlbmVyYXRlTWlwbWFwKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaik7CisKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsVGV4SW1hZ2UsIGdsQ29tcHJlc3NlZFRleEltYWdlLCBnbENvcHlUZXhJbWFnZQorICAgICogYW5kIGdsVGV4U3RvcmFnZSB0byBjaGVjayBpZiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdGV4dHVyZSBpbWFnZQorICAgICogYXJlIHRvbyBsYXJnZS4KKyAgICAqIFxwYXJhbSB0YXJnZXQgIGFueSBHTF9QUk9YWV9URVhUVVJFX3ggdGFyZ2V0CisgICAgKiBccmV0dXJuIEdMX1RSVUUgaWYgdGhlIGltYWdlIGlzIE9LLCBHTF9GQUxTRSBpZiB0b28gbGFyZ2UKKyAgICAqLworICAgR0xib29sZWFuICgqVGVzdFByb3h5VGV4SW1hZ2UpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgbGV2ZWwsIG1lc2FfZm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGRlcHRoLCBHTGludCBib3JkZXIpOworICAgLypAfSovCisKKyAgIAorICAgLyoqCisgICAgKiBcbmFtZSBDb21wcmVzc2VkIHRleHR1cmUgZnVuY3Rpb25zCisgICAgKi8KKyAgIC8qQHsqLworCisgICAvKioKKyAgICAqIENhbGxlZCBieSBnbENvbXByZXNzZWRUZXhJbWFnZVsxMjNdRCgpLgorICAgICovCisgICB2b2lkICgqQ29tcHJlc3NlZFRleEltYWdlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworCisgICAvKioKKyAgICAqIENhbGxlZCBieSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZVsxMjNdRCgpLgorICAgICovCisgICB2b2lkICgqQ29tcHJlc3NlZFRleFN1YkltYWdlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworCisgICAvKioKKyAgICAqIENhbGxlZCBieSBnbEdldENvbXByZXNzZWRUZXhJbWFnZS4KKyAgICAqLworICAgdm9pZCAoKkdldENvbXByZXNzZWRUZXhJbWFnZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdm9pZCAqZGF0YSk7CisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBcbmFtZSBUZXh0dXJlIG9iamVjdCAvIGltYWdlIGZ1bmN0aW9ucworICAgICovCisgICAvKkB7Ki8KKworICAgLyoqCisgICAgKiBDYWxsZWQgYnkgZ2xCaW5kVGV4dHVyZSgpIGFuZCBnbEJpbmRUZXh0dXJlcygpLgorICAgICovCisgICB2b2lkICgqQmluZFRleHR1cmUpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgdGV4VW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdE9iaiApOworCisgICAvKioKKyAgICAqIENhbGxlZCB0byBhbGxvY2F0ZSBhIG5ldyB0ZXh0dXJlIG9iamVjdC4gIERyaXZlcnMgd2lsbCB1c3VhbGx5CisgICAgKiBhbGxvY2F0ZS9yZXR1cm4gYSBzdWJjbGFzcyBvZiBnbF90ZXh0dXJlX29iamVjdC4KKyAgICAqLworICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICogKCpOZXdUZXh0dXJlT2JqZWN0KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbmFtZSwgR0xlbnVtIHRhcmdldCk7CisgICAvKioKKyAgICAqIENhbGxlZCB0byBkZWxldGUvZnJlZSBhIHRleHR1cmUgb2JqZWN0LiAgRHJpdmVycyBzaG91bGQgZnJlZSB0aGUKKyAgICAqIG9iamVjdCBhbmQgYW55IGltYWdlIGRhdGEgaXQgY29udGFpbnMuCisgICAgKi8KKyAgIHZvaWQgKCpEZWxldGVUZXh0dXJlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqKTsKKworICAgLyoqIENhbGxlZCB0byBhbGxvY2F0ZSBhIG5ldyB0ZXh0dXJlIGltYWdlIG9iamVjdC4gKi8KKyAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICogKCpOZXdUZXh0dXJlSW1hZ2UpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCisgICAvKiogQ2FsbGVkIHRvIGZyZWUgYSB0ZXh0dXJlIGltYWdlIG9iamVjdCByZXR1cm5lZCBieSBOZXdUZXh0dXJlSW1hZ2UoKSAqLworICAgdm9pZCAoKkRlbGV0ZVRleHR1cmVJbWFnZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICopOworCisgICAvKiogQ2FsbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzaW5nbGUgdGV4dHVyZSBpbWFnZSAqLworICAgR0xib29sZWFuICgqQWxsb2NUZXh0dXJlSW1hZ2VCdWZmZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKTsKKworICAgLyoqIEZyZWUgdGhlIG1lbW9yeSBmb3IgYSBzaW5nbGUgdGV4dHVyZSBpbWFnZSAqLworICAgdm9pZCAoKkZyZWVUZXh0dXJlSW1hZ2VCdWZmZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKTsKKworICAgLyoqIE1hcCBhIHNsaWNlIG9mIGEgdGV4dHVyZSBpbWFnZSBpbnRvIHVzZXIgc3BhY2UuCisgICAgKiBOb3RlOiBmb3IgR0xfVEVYVFVSRV8xRF9BUlJBWSwgaGVpZ2h0IG11c3QgYmUgMSwgeSBtdXN0IGJlIDAgYW5kIHNsaWNlCisgICAgKiBpbmRpY2F0ZXMgdGhlIDFEIGFycmF5IGluZGV4LgorICAgICogXHBhcmFtIHRleEltYWdlICB0aGUgdGV4dHVyZSBpbWFnZQorICAgICogXHBhcmFtIHNsaWNlICB0aGUgM0QgaW1hZ2Ugc2xpY2Ugb3IgYXJyYXkgdGV4dHVyZSBzbGljZQorICAgICogXHBhcmFtIHgsIHksIHcsIGggIHJlZ2lvbiBvZiBpbnRlcmVzdAorICAgICogXHBhcmFtIG1vZGUgIGJpdG1hc2sgb2YgR0xfTUFQX1JFQURfQklULCBHTF9NQVBfV1JJVEVfQklUIGFuZAorICAgICogICAgICAgICAgICAgIEdMX01BUF9JTlZBTElEQVRFX1JBTkdFX0JJVCAoaWYgd3JpdGluZykKKyAgICAqIFxwYXJhbSBtYXBPdXQgIHJldHVybnMgc3RhcnQgb2YgbWFwcGluZyBvZiByZWdpb24gb2YgaW50ZXJlc3QKKyAgICAqIFxwYXJhbSByb3dTdHJpZGVPdXQgcmV0dXJucyByb3cgc3RyaWRlIChpbiBieXRlcykuICBJbiB0aGUgY2FzZSBvZiBhCisgICAgKiBjb21wcmVzc2VkIHRleHR1cmUsIHRoaXMgaXMgdGhlIGJ5dGUgc3RyaWRlIGJldHdlZW4gb25lIHJvdyBvZiBibG9ja3MKKyAgICAqIGFuZCBhbm90aGVyLgorICAgICovCisgICB2b2lkICgqTWFwVGV4dHVyZUltYWdlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlLAorCQkJICAgR0x1aW50IHNsaWNlLAorCQkJICAgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgdywgR0x1aW50IGgsCisJCQkgICBHTGJpdGZpZWxkIG1vZGUsCisJCQkgICBHTHVieXRlICoqbWFwT3V0LCBHTGludCAqcm93U3RyaWRlT3V0KTsKKworICAgdm9pZCAoKlVubWFwVGV4dHVyZUltYWdlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkJICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UsCisJCQkgICAgIEdMdWludCBzbGljZSk7CisKKyAgIC8qKiBGb3IgR0xfQVJCX3RleHR1cmVfc3RvcmFnZS4gIEFsbG9jYXRlIG1lbW9yeSBmb3Igd2hvbGUgbWlwbWFwIHN0YWNrLgorICAgICogQWxsIHRoZSBnbF90ZXh0dXJlX2ltYWdlcyBpbiB0aGUgdGV4dHVyZSBvYmplY3Qgd2lsbCBoYXZlIHRoZWlyCisgICAgKiBkaW1lbnNpb25zLCBmb3JtYXQsIGV0Yy4gaW5pdGlhbGl6ZWQgYWxyZWFkeS4KKyAgICAqLworICAgR0xib29sZWFuICgqQWxsb2NUZXh0dXJlU3RvcmFnZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqdGV4T2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBsZXZlbHMsIEdMc2l6ZWkgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CisKKyAgIC8qKiBDYWxsZWQgYXMgcGFydCBvZiBnbFRleHR1cmVWaWV3IHRvIGFkZCB2aWV3cyB0byBvcmlnVGV4T2JqICovCisgICBHTGJvb2xlYW4gKCpUZXh0dXJlVmlldykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKm9yaWdUZXhPYmopOworCisgICAvKioKKyAgICAqIE1hcCBhIHJlbmRlcmJ1ZmZlciBpbnRvIHVzZXIgc3BhY2UuCisgICAgKiBccGFyYW0gbW9kZSAgYml0bWFzayBvZiBHTF9NQVBfUkVBRF9CSVQsIEdMX01BUF9XUklURV9CSVQgYW5kCisgICAgKiAgICAgICAgICAgICAgR0xfTUFQX0lOVkFMSURBVEVfUkFOR0VfQklUIChpZiB3cml0aW5nKQorICAgICovCisgICB2b2lkICgqTWFwUmVuZGVyYnVmZmVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGdsX3JlbmRlcmJ1ZmZlciAqcmIsCisJCQkgICBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3LCBHTHVpbnQgaCwKKwkJCSAgIEdMYml0ZmllbGQgbW9kZSwKKwkJCSAgIEdMdWJ5dGUgKiptYXBPdXQsIEdMaW50ICpyb3dTdHJpZGVPdXQpOworCisgICB2b2lkICgqVW5tYXBSZW5kZXJidWZmZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisJCQkgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKTsKKworICAgLyoqCisgICAgKiBPcHRpb25hbCBkcml2ZXIgZW50cnlwb2ludCB0aGF0IGJpbmRzIGEgbm9uLXRleHR1cmUgcmVuZGVyYnVmZmVyJ3MKKyAgICAqIGNvbnRlbnRzIHRvIGEgdGV4dHVyZSBpbWFnZS4KKyAgICAqLworICAgR0xib29sZWFuICgqQmluZFJlbmRlcmJ1ZmZlclRleEltYWdlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKnRleEltYWdlKTsKKyAgIC8qQH0qLworCisKKyAgIC8qKgorICAgICogXG5hbWUgVmVydGV4L2ZyYWdtZW50IHByb2dyYW0gZnVuY3Rpb25zCisgICAgKi8KKyAgIC8qQHsqLworICAgLyoqIEJpbmQgYSB2ZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbSAqLworICAgdm9pZCAoKkJpbmRQcm9ncmFtKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyk7CisgICAvKiogQWxsb2NhdGUgYSBuZXcgcHJvZ3JhbSAqLworICAgc3RydWN0IGdsX3Byb2dyYW0gKiAoKk5ld1Byb2dyYW0pKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGlkKTsKKyAgIC8qKiBDb25zdHJ1Y3QgZ2xfcHJvZ3JhbSBmb3IgYSBzaGFkZXIuICovCisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqICgqR2V0UHJvZ3JhbSkgKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcik7CisgICAvKiogRGVsZXRlIGEgcHJvZ3JhbSAqLworICAgdm9pZCAoKkRlbGV0ZVByb2dyYW0pKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsgICAKKyAgIC8qKgorICAgICogTm90aWZ5IGRyaXZlciB0aGF0IGEgcHJvZ3JhbSBzdHJpbmcgKGFuZCBHUFUgY29kZSkgaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgKiBvciBtb2RpZmllZC4gIFJldHVybiBHTF9UUlVFIG9yIEdMX0ZBTFNFIHRvIGluZGljYXRlIGlmIHRoZSBwcm9ncmFtIGlzCisgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlci4KKyAgICAqLworICAgR0xib29sZWFuICgqUHJvZ3JhbVN0cmluZ05vdGlmeSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyk7CisKKyAgIC8qKgorICAgICogTm90aWZ5IGRyaXZlciB0aGF0IHRoZSBzYW1wbGVyIHVuaWZvcm1zIGZvciB0aGUgY3VycmVudCBwcm9ncmFtIGhhdmUKKyAgICAqIGNoYW5nZWQuICBPbiBzb21lIGRyaXZlcnMsIHRoaXMgbWF5IHJlcXVpcmUgc2hhZGVyIHJlY29tcGlsZXMuCisgICAgKi8KKyAgIHZvaWQgKCpTYW1wbGVyVW5pZm9ybUNoYW5nZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpOworCisgICAvKiogUXVlcnkgaWYgcHJvZ3JhbSBjYW4gYmUgbG9hZGVkIG9udG8gaGFyZHdhcmUgKi8KKyAgIEdMYm9vbGVhbiAoKklzUHJvZ3JhbU5hdGl2ZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgCisJCQkJc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpOworICAgCisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBcbmFtZSBHTFNMIHNoYWRlci9wcm9ncmFtIGZ1bmN0aW9ucy4KKyAgICAqLworICAgLypAeyovCisgICAvKioKKyAgICAqIENhbGxlZCB3aGVuIGEgc2hhZGVyIHByb2dyYW0gaXMgdG8gYmUgbGlua2VkLgorICAgICoKKyAgICAqIFRoaXMgaXMgb3B0aW9uYWwgYW5kIGdpdmVzIGRyaXZlcnMgYW4gb3Bwb3J0dW5pdHkgdG8gaW5zcGVjdCB0aGUgY29udGV4dAorICAgICogYW5kIHByZXBhcmUgZm9yIExpbmtTaGFkZXIsIHdoaWNoIG1heSBiZSBkZWZlcnJlZCB0byBhbm90aGVyIHRocmVhZC4KKyAgICAqLworICAgdm9pZCAoKk5vdGlmeUxpbmtTaGFkZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXIpOworICAgLyoqCisgICAgKiBDYWxsZWQgd2hlbiBhIHNoYWRlciBwcm9ncmFtIGlzIGxpbmtlZC4KKyAgICAqCisgICAgKiBUaGlzIGdpdmVzIGRyaXZlcnMgYW4gb3Bwb3J0dW5pdHkgdG8gY2xvbmUgdGhlIElSIGFuZCBtYWtlIHRoZWlyCisgICAgKiBvd24gdHJhbnNmb3JtYXRpb25zIG9uIGl0IGZvciB0aGUgcHVycG9zZXMgb2YgY29kZSBnZW5lcmF0aW9uLgorICAgICovCisgICBHTGJvb2xlYW4gKCpMaW5rU2hhZGVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXIpOworICAgLypAfSovCisKKyAgIC8qKgorICAgICogXG5hbWUgU3RhdGUtY2hhbmdpbmcgZnVuY3Rpb25zLgorICAgICoKKyAgICAqIFxub3RlIGRyYXdpbmcgZnVuY3Rpb25zIGFyZSBhYm92ZS4KKyAgICAqCisgICAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGVpciBjb3JyZXNwb25kaW5nIE9wZW5HTCBBUEkgZnVuY3Rpb25zLgorICAgICogVGhleSBhcmUgXGUgYWxzbyBjYWxsZWQgYnkgdGhlIGdsX1BvcEF0dHJpYigpIGZ1bmN0aW9uISEhCisgICAgKiBNYXkgYWRkIG1vcmUgZnVuY3Rpb25zIGxpa2UgdGhlc2UgdG8gdGhlIGRldmljZSBkcml2ZXIgaW4gdGhlIGZ1dHVyZS4KKyAgICAqLworICAgLypAeyovCisgICAvKiogU3BlY2lmeSB0aGUgYWxwaGEgdGVzdCBmdW5jdGlvbiAqLworICAgdm9pZCAoKkFscGhhRnVuYykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIGZ1bmMsIEdMZmxvYXQgcmVmKTsKKyAgIC8qKiBTZXQgdGhlIGJsZW5kIGNvbG9yICovCisgICB2b2lkICgqQmxlbmRDb2xvcikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgY29uc3QgR0xmbG9hdCBjb2xvcls0XSk7CisgICAvKiogU2V0IHRoZSBibGVuZCBlcXVhdGlvbiAqLworICAgdm9pZCAoKkJsZW5kRXF1YXRpb25TZXBhcmF0ZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUEpOworICAgdm9pZCAoKkJsZW5kRXF1YXRpb25TZXBhcmF0ZWkpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQSk7CisgICAvKiogU3BlY2lmeSBwaXhlbCBhcml0aG1ldGljICovCisgICB2b2lkICgqQmxlbmRGdW5jU2VwYXJhdGUpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHNmYWN0b3JBLCBHTGVudW0gZGZhY3RvckEpOworICAgdm9pZCAoKkJsZW5kRnVuY1NlcGFyYXRlaSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBzZmFjdG9yQSwgR0xlbnVtIGRmYWN0b3JBKTsKKyAgIC8qKiBTcGVjaWZ5IGEgcGxhbmUgYWdhaW5zdCB3aGljaCBhbGwgZ2VvbWV0cnkgaXMgY2xpcHBlZCAqLworICAgdm9pZCAoKkNsaXBQbGFuZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcSk7CisgICAvKiogRW5hYmxlIGFuZCBkaXNhYmxlIHdyaXRpbmcgb2YgZnJhbWUgYnVmZmVyIGNvbG9yIGNvbXBvbmVudHMgKi8KKyAgIHZvaWQgKCpDb2xvck1hc2spKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMYm9vbGVhbiBybWFzaywgR0xib29sZWFuIGdtYXNrLAorICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIGJtYXNrLCBHTGJvb2xlYW4gYW1hc2sgKTsKKyAgIHZvaWQgKCpDb2xvck1hc2tJbmRleGVkKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgYnVmLCBHTGJvb2xlYW4gcm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIGdtYXNrLCBHTGJvb2xlYW4gYm1hc2ssIEdMYm9vbGVhbiBhbWFzayk7CisgICAvKiogQ2F1c2UgYSBtYXRlcmlhbCBjb2xvciB0byB0cmFjayB0aGUgY3VycmVudCBjb2xvciAqLworICAgdm9pZCAoKkNvbG9yTWF0ZXJpYWwpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7CisgICAvKiogU3BlY2lmeSB3aGV0aGVyIGZyb250LSBvciBiYWNrLWZhY2luZyBmYWNldHMgY2FuIGJlIGN1bGxlZCAqLworICAgdm9pZCAoKkN1bGxGYWNlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSk7CisgICAvKiogRGVmaW5lIGZyb250LSBhbmQgYmFjay1mYWNpbmcgcG9seWdvbnMgKi8KKyAgIHZvaWQgKCpGcm9udEZhY2UpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBtb2RlKTsKKyAgIC8qKiBTcGVjaWZ5IHRoZSB2YWx1ZSB1c2VkIGZvciBkZXB0aCBidWZmZXIgY29tcGFyaXNvbnMgKi8KKyAgIHZvaWQgKCpEZXB0aEZ1bmMpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBmdW5jKTsKKyAgIC8qKiBFbmFibGUgb3IgZGlzYWJsZSB3cml0aW5nIGludG8gdGhlIGRlcHRoIGJ1ZmZlciAqLworICAgdm9pZCAoKkRlcHRoTWFzaykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xib29sZWFuIGZsYWcpOworICAgLyoqIFNwZWNpZnkgbWFwcGluZyBvZiBkZXB0aCB2YWx1ZXMgZnJvbSBOREMgdG8gd2luZG93IGNvb3JkaW5hdGVzICovCisgICB2b2lkICgqRGVwdGhSYW5nZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCk7CisgICAvKiogU3BlY2lmeSB0aGUgY3VycmVudCBidWZmZXIgZm9yIHdyaXRpbmcgKi8KKyAgIHZvaWQgKCpEcmF3QnVmZmVyKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIGJ1ZmZlciApOworICAgLyoqIFNwZWNpZnkgdGhlIGJ1ZmZlcnMgZm9yIHdyaXRpbmcgZm9yIGZyYWdtZW50IHByb2dyYW1zKi8KKyAgIHZvaWQgKCpEcmF3QnVmZmVycykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZmZlcnMpOworICAgLyoqIEVuYWJsZSBvciBkaXNhYmxlIHNlcnZlci1zaWRlIGdsIGNhcGFiaWxpdGllcyAqLworICAgdm9pZCAoKkVuYWJsZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIGNhcCwgR0xib29sZWFuIHN0YXRlKTsKKyAgIC8qKiBTcGVjaWZ5IGZvZyBwYXJhbWV0ZXJzICovCisgICB2b2lkICgqRm9nZnYpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyAgIC8qKiBTcGVjaWZ5IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGhpbnRzICovCisgICB2b2lkICgqSGludCkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworICAgLyoqIFNldCBsaWdodCBzb3VyY2UgcGFyYW1ldGVycy4KKyAgICAqIE5vdGU6IGZvciBHTF9QT1NJVElPTiBhbmQgR0xfU1BPVF9ESVJFQ1RJT04sIHBhcmFtcyB3aWxsIGhhdmUgYWxyZWFkeQorICAgICogYmVlbiB0cmFuc2Zvcm1lZCB0byBleWUtc3BhY2UuCisgICAgKi8KKyAgIHZvaWQgKCpMaWdodGZ2KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gbGlnaHQsCisJCSAgIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CisgICAvKiogU2V0IHRoZSBsaWdodGluZyBtb2RlbCBwYXJhbWV0ZXJzICovCisgICB2b2lkICgqTGlnaHRNb2RlbGZ2KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworICAgLyoqIFNwZWNpZnkgdGhlIGxpbmUgc3RpcHBsZSBwYXR0ZXJuICovCisgICB2b2lkICgqTGluZVN0aXBwbGUpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMaW50IGZhY3RvciwgR0x1c2hvcnQgcGF0dGVybiApOworICAgLyoqIFNwZWNpZnkgdGhlIHdpZHRoIG9mIHJhc3Rlcml6ZWQgbGluZXMgKi8KKyAgIHZvaWQgKCpMaW5lV2lkdGgpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZmxvYXQgd2lkdGgpOworICAgLyoqIFNwZWNpZnkgYSBsb2dpY2FsIHBpeGVsIG9wZXJhdGlvbiBmb3IgY29sb3IgaW5kZXggcmVuZGVyaW5nICovCisgICB2b2lkICgqTG9naWNPcGNvZGUpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBvcGNvZGUpOworICAgdm9pZCAoKlBvaW50UGFyYW1ldGVyZnYpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworICAgLyoqIFNwZWNpZnkgdGhlIGRpYW1ldGVyIG9mIHJhc3Rlcml6ZWQgcG9pbnRzICovCisgICB2b2lkICgqUG9pbnRTaXplKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGZsb2F0IHNpemUpOworICAgLyoqIFNlbGVjdCBhIHBvbHlnb24gcmFzdGVyaXphdGlvbiBtb2RlICovCisgICB2b2lkICgqUG9seWdvbk1vZGUpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7CisgICAvKiogU2V0IHRoZSBzY2FsZSBhbmQgdW5pdHMgdXNlZCB0byBjYWxjdWxhdGUgZGVwdGggdmFsdWVzICovCisgICB2b2lkICgqUG9seWdvbk9mZnNldCkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOworICAgLyoqIFNldCB0aGUgcG9seWdvbiBzdGlwcGxpbmcgcGF0dGVybiAqLworICAgdm9pZCAoKlBvbHlnb25TdGlwcGxlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBHTHVieXRlICptYXNrICk7CisgICAvKiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgYnVmZmVyIGZvciByZWFkaW5nICovCisgICB2b2lkICgqUmVhZEJ1ZmZlcikoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBidWZmZXIgKTsKKyAgIC8qKiBTZXQgcmFzdGVyaXphdGlvbiBtb2RlICovCisgICB2b2lkICgqUmVuZGVyTW9kZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIG1vZGUgKTsKKyAgIC8qKiBEZWZpbmUgdGhlIHNjaXNzb3IgYm94ICovCisgICB2b2lkICgqU2Npc3Nvcikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCk7CisgICAvKiogU2VsZWN0IGZsYXQgb3Igc21vb3RoIHNoYWRpbmcgKi8KKyAgIHZvaWQgKCpTaGFkZU1vZGVsKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSk7CisgICAvKiogT3BlbkdMIDIuMCB0d28tc2lkZWQgU3RlbmNpbEZ1bmMgKi8KKyAgIHZvaWQgKCpTdGVuY2lsRnVuY1NlcGFyYXRlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CisgICAvKiogT3BlbkdMIDIuMCB0d28tc2lkZWQgU3RlbmNpbE1hc2sgKi8KKyAgIHZvaWQgKCpTdGVuY2lsTWFza1NlcGFyYXRlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOworICAgLyoqIE9wZW5HTCAyLjAgdHdvLXNpZGVkIFN0ZW5jaWxPcCAqLworICAgdm9pZCAoKlN0ZW5jaWxPcFNlcGFyYXRlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKKyAgIC8qKiBDb250cm9sIHRoZSBnZW5lcmF0aW9uIG9mIHRleHR1cmUgY29vcmRpbmF0ZXMgKi8KKyAgIHZvaWQgKCpUZXhHZW4pKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLAorCQkgIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisgICAvKiogU2V0IHRleHR1cmUgZW52aXJvbm1lbnQgcGFyYW1ldGVycyAqLworICAgdm9pZCAoKlRleEVudikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCAqcGFyYW0pOworICAgLyoqIFNldCB0ZXh0dXJlIHBhcmFtZXRlcnMgKi8KKyAgIHZvaWQgKCpUZXhQYXJhbWV0ZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyAgIC8qKiBTZXQgdGhlIHZpZXdwb3J0ICovCisgICB2b2lkICgqVmlld3BvcnQpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworICAgLypAfSovCisKKworICAgLyoqCisgICAgKiBcbmFtZSBWZXJ0ZXgvcGl4ZWwgYnVmZmVyIG9iamVjdCBmdW5jdGlvbnMKKyAgICAqLworICAgLypAeyovCisgICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqICgqTmV3QnVmZmVyT2JqZWN0KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHRhcmdldCk7CisgICAKKyAgIHZvaWQgKCpEZWxldGVCdWZmZXIpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqICk7CisKKyAgIEdMYm9vbGVhbiAoKkJ1ZmZlckRhdGEpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHN0b3JhZ2VGbGFncywgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaik7CisKKyAgIHZvaWQgKCpCdWZmZXJTdWJEYXRhKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xpbnRwdHJBUkIgb2Zmc2V0LAorCQkJICBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwKKwkJCSAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaiApOworCisgICB2b2lkICgqR2V0QnVmZmVyU3ViRGF0YSkoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisJCQkgICAgIEdMaW50cHRyQVJCIG9mZnNldCwgR0xzaXplaXB0ckFSQiBzaXplLAorCQkJICAgICBHTHZvaWQgKmRhdGEsIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmogKTsKKworICAgdm9pZCAoKkNsZWFyQnVmZmVyU3ViRGF0YSkoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpjbGVhclZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWlwdHIgY2xlYXJWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaiApOworCisgICB2b2lkICgqQ29weUJ1ZmZlclN1YkRhdGEpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludHB0ciByZWFkT2Zmc2V0LCBHTGludHB0ciB3cml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWlwdHIgc2l6ZSApOworCisgICAvKiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXBwZWQgcmFuZ2UuCisgICAgKiBNYXkgcmV0dXJuIE5VTEwgaWYgTUVTQV9NQVBfTk9XQUlUX0JJVCBpcyBzZXQgaW4gYWNjZXNzOgorICAgICovCisgICB2b2lkICogKCpNYXBCdWZmZXJSYW5nZSkoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMaW50cHRyIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaXB0ciBsZW5ndGgsIEdMYml0ZmllbGQgYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9tYXBfYnVmZmVyX2luZGV4IGluZGV4KTsKKworICAgdm9pZCAoKkZsdXNoTWFwcGVkQnVmZmVyUmFuZ2UpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfYnVmZmVyX29iamVjdCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX21hcF9idWZmZXJfaW5kZXggaW5kZXgpOworCisgICBHTGJvb2xlYW4gKCpVbm1hcEJ1ZmZlcikoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisJCQkgICAgIHN0cnVjdCBnbF9idWZmZXJfb2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX21hcF9idWZmZXJfaW5kZXggaW5kZXgpOworICAgLypAfSovCisKKyAgIC8qKgorICAgICogXG5hbWUgRnVuY3Rpb25zIGZvciBHTF9BUFBMRV9vYmplY3RfcHVyZ2VhYmxlCisgICAgKi8KKyAgIC8qQHsqLworICAgLyogdmFyaWF0aW9ucyBvbiBPYmplY3RQdXJnZWFibGUgKi8KKyAgIEdMZW51bSAoKkJ1ZmZlck9iamVjdFB1cmdlYWJsZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaiwgR0xlbnVtIG9wdGlvbik7CisgICBHTGVudW0gKCpSZW5kZXJPYmplY3RQdXJnZWFibGUpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKm9iaiwgR0xlbnVtIG9wdGlvbik7CisgICBHTGVudW0gKCpUZXh0dXJlT2JqZWN0UHVyZ2VhYmxlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gb3B0aW9uKTsKKworICAgLyogdmFyaWF0aW9ucyBvbiBPYmplY3RVbnB1cmdlYWJsZSAqLworICAgR0xlbnVtICgqQnVmZmVyT2JqZWN0VW5wdXJnZWFibGUpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2J1ZmZlcl9vYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gb3B0aW9uKTsKKyAgIEdMZW51bSAoKlJlbmRlck9iamVjdFVucHVyZ2VhYmxlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gb3B0aW9uKTsKKyAgIEdMZW51bSAoKlRleHR1cmVPYmplY3RVbnB1cmdlYWJsZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBvcHRpb24pOworICAgLypAfSovCisKKyAgIC8qKgorICAgICogXG5hbWUgRnVuY3Rpb25zIGZvciBHTF9FWFRfZnJhbWVidWZmZXJfe29iamVjdCxibGl0LGRpc2NhcmR9LgorICAgICovCisgICAvKkB7Ki8KKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqICgqTmV3RnJhbWVidWZmZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbmFtZSk7CisgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICogKCpOZXdSZW5kZXJidWZmZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBuYW1lKTsKKyAgIHZvaWQgKCpCaW5kRnJhbWVidWZmZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmRyYXdGYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqcmVhZEZiKTsKKyAgIHZvaWQgKCpGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYik7CisgICB2b2lkICgqUmVuZGVyVGV4dHVyZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXJfYXR0YWNobWVudCAqYXR0KTsKKyAgIHZvaWQgKCpGaW5pc2hSZW5kZXJUZXh0dXJlKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiKTsKKyAgIHZvaWQgKCpWYWxpZGF0ZUZyYW1lYnVmZmVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIpOworICAgLypAfSovCisgICB2b2lkICgqQmxpdEZyYW1lYnVmZmVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7CisgICB2b2lkICgqRGlzY2FyZEZyYW1lYnVmZmVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpOworCisgICAvKioKKyAgICAqIFxuYW1lIFF1ZXJ5IG9iamVjdHMKKyAgICAqLworICAgLypAeyovCisgICBzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICogKCpOZXdRdWVyeU9iamVjdCkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IGlkKTsKKyAgIHZvaWQgKCpEZWxldGVRdWVyeSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3F1ZXJ5X29iamVjdCAqcSk7CisgICB2b2lkICgqQmVnaW5RdWVyeSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3F1ZXJ5X29iamVjdCAqcSk7CisgICB2b2lkICgqUXVlcnlDb3VudGVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICpxKTsKKyAgIHZvaWQgKCpFbmRRdWVyeSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3F1ZXJ5X29iamVjdCAqcSk7CisgICB2b2lkICgqQ2hlY2tRdWVyeSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3F1ZXJ5X29iamVjdCAqcSk7CisgICB2b2lkICgqV2FpdFF1ZXJ5KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICpxKTsKKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIFxuYW1lIFBlcmZvcm1hbmNlIG1vbml0b3JzCisgICAgKi8KKyAgIC8qQHsqLworICAgc3RydWN0IGdsX3BlcmZfbW9uaXRvcl9vYmplY3QgKiAoKk5ld1BlcmZNb25pdG9yKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKyAgIHZvaWQgKCpEZWxldGVQZXJmTW9uaXRvcikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3BlcmZfbW9uaXRvcl9vYmplY3QgKm0pOworICAgR0xib29sZWFuICgqQmVnaW5QZXJmTW9uaXRvcikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wZXJmX21vbml0b3Jfb2JqZWN0ICptKTsKKworICAgLyoqIFN0b3AgYW4gYWN0aXZlIHBlcmZvcm1hbmNlIG1vbml0b3IsIGRpc2NhcmRpbmcgcmVzdWx0cy4gKi8KKyAgIHZvaWQgKCpSZXNldFBlcmZNb25pdG9yKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wZXJmX21vbml0b3Jfb2JqZWN0ICptKTsKKyAgIHZvaWQgKCpFbmRQZXJmTW9uaXRvcikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3BlcmZfbW9uaXRvcl9vYmplY3QgKm0pOworICAgR0xib29sZWFuICgqSXNQZXJmTW9uaXRvclJlc3VsdEF2YWlsYWJsZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wZXJmX21vbml0b3Jfb2JqZWN0ICptKTsKKyAgIHZvaWQgKCpHZXRQZXJmTW9uaXRvclJlc3VsdCkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3BlcmZfbW9uaXRvcl9vYmplY3QgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgKmJ5dGVzV3JpdHRlbik7CisgICAvKkB9Ki8KKworCisgICAvKioKKyAgICAqIFxuYW1lIFZlcnRleCBBcnJheSBvYmplY3RzCisgICAgKi8KKyAgIC8qQHsqLworICAgc3RydWN0IGdsX3ZlcnRleF9hcnJheV9vYmplY3QgKiAoKk5ld0FycmF5T2JqZWN0KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgaWQpOworICAgdm9pZCAoKkRlbGV0ZUFycmF5T2JqZWN0KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfdmVydGV4X2FycmF5X29iamVjdCAqKTsKKyAgIHZvaWQgKCpCaW5kQXJyYXlPYmplY3QpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF92ZXJ0ZXhfYXJyYXlfb2JqZWN0ICopOworICAgLypAfSovCisKKyAgIC8qKgorICAgICogXG5hbWUgR0xTTC1yZWxhdGVkIGZ1bmN0aW9ucyAoQVJCIGV4dGVuc2lvbnMgYW5kIE9wZW5HTCAyLngpCisgICAgKi8KKyAgIC8qQHsqLworICAgc3RydWN0IGdsX3NoYWRlciAqKCpOZXdTaGFkZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG5hbWUsIEdMZW51bSB0eXBlKTsKKyAgIHZvaWQgKCpEZWxldGVTaGFkZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcik7CisgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKigqTmV3U2hhZGVyUHJvZ3JhbSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbmFtZSk7CisgICB2b2lkICgqRGVsZXRlU2hhZGVyUHJvZ3JhbSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoUHJvZyk7CisgICB2b2lkICgqVXNlUHJvZ3JhbSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2cpOworICAgLypAfSovCisKKworICAgLyoqCisgICAgKiBcbmFtZSBTdXBwb3J0IGZvciBtdWx0aXBsZSBUJkwgZW5naW5lcworICAgICovCisgICAvKkB7Ki8KKworICAgLyoqCisgICAgKiBTZXQgYnkgdGhlIGRyaXZlci1zdXBwbGllZCBUJkwgZW5naW5lLiAgCisgICAgKgorICAgICogU2V0IHRvIFBSSU1fT1VUU0lERV9CRUdJTl9FTkQgd2hlbiBvdXRzaWRlIGdsQmVnaW4oKS9nbEVuZCgpLgorICAgICovCisgICBHTHVpbnQgQ3VycmVudEV4ZWNQcmltaXRpdmU7CisKKyAgIC8qKgorICAgICogQ3VycmVudCBnbEJlZ2luIHN0YXRlIG9mIGFuIGluLXByb2dyZXNzIGNvbXBpbGF0aW9uLiAgTWF5IGJlCisgICAgKiBHTF9QT0lOVFMsIEdMX1RSSUFOR0xFX1NUUklQLCBldGMuIG9yIFBSSU1fT1VUU0lERV9CRUdJTl9FTkQKKyAgICAqIG9yIFBSSU1fVU5LTk9XTi4KKyAgICAqLworICAgR0x1aW50IEN1cnJlbnRTYXZlUHJpbWl0aXZlOworCisKKyNkZWZpbmUgRkxVU0hfU1RPUkVEX1ZFUlRJQ0VTIDB4MQorI2RlZmluZSBGTFVTSF9VUERBVEVfQ1VSUkVOVCAgMHgyCisgICAvKioKKyAgICAqIFNldCBieSB0aGUgZHJpdmVyLXN1cHBsaWVkIFQmTCBlbmdpbmUgd2hlbmV2ZXIgdmVydGljZXMgYXJlIGJ1ZmZlcmVkCisgICAgKiBiZXR3ZWVuIGdsQmVnaW4oKS9nbEVuZCgpIG9iamVjdHMgb3IgX19zdHJ1Y3QgZ2xfY29udGV4dFJlYzo6Q3VycmVudAorICAgICogaXMgbm90IHVwZGF0ZWQuICBBIGJpdG1hc2sgb2YgdGhlIEZMVVNIX3ggdmFsdWVzIGFib3ZlLgorICAgICoKKyAgICAqIFRoZSBkZF9mdW5jdGlvbl90YWJsZTo6Rmx1c2hWZXJ0aWNlcyBjYWxsIGJlbG93IG1heSBiZSB1c2VkIHRvIHJlc29sdmUKKyAgICAqIHRoZXNlIGNvbmRpdGlvbnMuCisgICAgKi8KKyAgIEdMYml0ZmllbGQgTmVlZEZsdXNoOworCisgICAvKiogTmVlZCB0byBjYWxsIFNhdmVGbHVzaFZlcnRpY2VzKCkgdXBvbiBzdGF0ZSBjaGFuZ2U/ICovCisgICBHTGJvb2xlYW4gU2F2ZU5lZWRGbHVzaDsKKworICAgLyogQ2FsbGVkIHByaW9yIHRvIGFueSBvZiB0aGUgR0x2ZXJ0ZXhmb3JtYXQgZnVuY3Rpb25zIGJlaW5nCisgICAgKiBjYWxsZWQuICBQYWlyZWQgd2l0aCBEcml2ZXIuRmx1c2hWZXJ0aWNlcygpLgorICAgICovCisgICB2b2lkICgqQmVnaW5WZXJ0aWNlcykoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggKTsKKworICAgLyoqCisgICAgKiBJZiBpbnNpZGUgZ2xCZWdpbigpL2dsRW5kKCksIGl0IHNob3VsZCBBU1NFUlQoMCkuICBPdGhlcndpc2UsIGlmCisgICAgKiBGTFVTSF9TVE9SRURfVkVSVElDRVMgYml0IGluIFxwIGZsYWdzIGlzIHNldCBmbHVzaGVzIGFueSBidWZmZXJlZAorICAgICogdmVydGljZXMsIGlmIEZMVVNIX1VQREFURV9DVVJSRU5UIGJpdCBpcyBzZXQgdXBkYXRlcworICAgICogX19zdHJ1Y3QgZ2xfY29udGV4dFJlYzo6Q3VycmVudCBhbmQgZ2xfbGlnaHRfYXR0cmliOjpNYXRlcmlhbAorICAgICoKKyAgICAqIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBUJkwgZW5naW5lIG5ldmVyIGNsZWFycyB0aGUKKyAgICAqIEZMVVNIX1VQREFURV9DVVJSRU5UIGJpdCwgZXZlbiBhZnRlciBwZXJmb3JtaW5nIHRoZSB1cGRhdGUuCisgICAgKi8KKyAgIHZvaWQgKCpGbHVzaFZlcnRpY2VzKSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IGZsYWdzICk7CisgICB2b2lkICgqU2F2ZUZsdXNoVmVydGljZXMpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ICk7CisKKyAgIC8qKgorICAgICogR2l2ZSB0aGUgZHJpdmVyIHRoZSBvcHBvcnR1bml0eSB0byBob29rIGluIGl0cyBvd24gdnR4Zm10IGZvcgorICAgICogY29tcGlsaW5nIG9wdGltaXplZCBkaXNwbGF5IGxpc3RzLiAgVGhpcyBpcyBjYWxsZWQgb24gZWFjaCB2YWxpZAorICAgICogZ2xCZWdpbigpIGR1cmluZyBsaXN0IGNvbXBpbGF0aW9uLgorICAgICovCisgICBHTGJvb2xlYW4gKCpOb3RpZnlTYXZlQmVnaW4pKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSApOworCisgICAvKioKKyAgICAqIE5vdGlmeSBkcml2ZXIgdGhhdCB0aGUgc3BlY2lhbCBkZXJpdmVkIHZhbHVlIF9OZWVkRXllQ29vcmRzIGhhcworICAgICogY2hhbmdlZC4KKyAgICAqLworICAgdm9pZCAoKkxpZ2h0aW5nU3BhY2VDaGFuZ2UpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ICk7CisKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsTmV3TGlzdCgpLgorICAgICoKKyAgICAqIExldCB0aGUgVCZMIGNvbXBvbmVudCBrbm93IHdoYXQgaXMgZ29pbmcgb24gd2l0aCBkaXNwbGF5IGxpc3RzCisgICAgKiBpbiB0aW1lIHRvIG1ha2UgY2hhbmdlcyB0byBkaXNwYXRjaCB0YWJsZXMsIGV0Yy4KKyAgICAqLworICAgdm9pZCAoKk5ld0xpc3QpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgbGlzdCwgR0xlbnVtIG1vZGUgKTsKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsRW5kTGlzdCgpLgorICAgICoKKyAgICAqIFxzYSBkZF9mdW5jdGlvbl90YWJsZTo6TmV3TGlzdC4KKyAgICAqLworICAgdm9pZCAoKkVuZExpc3QpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ICk7CisKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsQ2FsbExpc3QocykuCisgICAgKgorICAgICogTm90aWZ5IHRoZSBUJkwgY29tcG9uZW50IGJlZm9yZSBhbmQgYWZ0ZXIgY2FsbGluZyBhIGRpc3BsYXkgbGlzdC4KKyAgICAqLworICAgdm9pZCAoKkJlZ2luQ2FsbExpc3QpKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCAKKwkJCSAgc3RydWN0IGdsX2Rpc3BsYXlfbGlzdCAqZGxpc3QgKTsKKyAgIC8qKgorICAgICogQ2FsbGVkIGJ5IGdsRW5kQ2FsbExpc3QoKS4KKyAgICAqCisgICAgKiBcc2EgZGRfZnVuY3Rpb25fdGFibGU6OkJlZ2luQ2FsbExpc3QuCisgICAgKi8KKyAgIHZvaWQgKCpFbmRDYWxsTGlzdCkoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggKTsKKworICAgLyoqQH0qLworCisgICAvKioKKyAgICAqIFxuYW1lIEdMX0FSQl9zeW5jIGludGVyZmFjZXMKKyAgICAqLworICAgLypAeyovCisgICBzdHJ1Y3QgZ2xfc3luY19vYmplY3QgKiAoKk5ld1N5bmNPYmplY3QpKHN0cnVjdCBnbF9jb250ZXh0ICosIEdMZW51bSk7CisgICB2b2lkICgqRmVuY2VTeW5jKShzdHJ1Y3QgZ2xfY29udGV4dCAqLCBzdHJ1Y3QgZ2xfc3luY19vYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgIEdMZW51bSwgR0xiaXRmaWVsZCk7CisgICB2b2lkICgqRGVsZXRlU3luY09iamVjdCkoc3RydWN0IGdsX2NvbnRleHQgKiwgc3RydWN0IGdsX3N5bmNfb2JqZWN0ICopOworICAgdm9pZCAoKkNoZWNrU3luYykoc3RydWN0IGdsX2NvbnRleHQgKiwgc3RydWN0IGdsX3N5bmNfb2JqZWN0ICopOworICAgdm9pZCAoKkNsaWVudFdhaXRTeW5jKShzdHJ1Y3QgZ2xfY29udGV4dCAqLCBzdHJ1Y3QgZ2xfc3luY19vYmplY3QgKiwKKwkJCSAgR0xiaXRmaWVsZCwgR0x1aW50NjQpOworICAgdm9pZCAoKlNlcnZlcldhaXRTeW5jKShzdHJ1Y3QgZ2xfY29udGV4dCAqLCBzdHJ1Y3QgZ2xfc3luY19vYmplY3QgKiwKKwkJCSAgR0xiaXRmaWVsZCwgR0x1aW50NjQpOworICAgLypAfSovCisKKyAgIC8qKiBHTF9OVl9jb25kaXRpb25hbF9yZW5kZXIgKi8KKyAgIHZvaWQgKCpCZWdpbkNvbmRpdGlvbmFsUmVuZGVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9xdWVyeV9vYmplY3QgKnEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIG1vZGUpOworICAgdm9pZCAoKkVuZENvbmRpdGlvbmFsUmVuZGVyKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcXVlcnlfb2JqZWN0ICpxKTsKKworICAgLyoqCisgICAgKiBcbmFtZSBHTF9PRVNfZHJhd190ZXh0dXJlIGludGVyZmFjZQorICAgICovCisgICAvKkB7Ki8KKyAgIHZvaWQgKCpEcmF3VGV4KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LAorICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KTsKKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIFxuYW1lIEdMX09FU19FR0xfaW1hZ2UgaW50ZXJmYWNlCisgICAgKi8KKyAgIHZvaWQgKCpFR0xJbWFnZVRhcmdldFRleHR1cmUyRCkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKwkJCQkgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKwkJCQkgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqdGV4SW1hZ2UsCisJCQkJICAgR0xlZ2xJbWFnZU9FUyBpbWFnZV9oYW5kbGUpOworICAgdm9pZCAoKkVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJCQkJICAgICBzdHJ1Y3QgZ2xfcmVuZGVyYnVmZmVyICpyYiwKKwkJCQkJICAgICB2b2lkICppbWFnZV9oYW5kbGUpOworCisgICAvKioKKyAgICAqIFxuYW1lIEdMX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sgaW50ZXJmYWNlCisgICAgKi8KKyAgIHN0cnVjdCBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfb2JqZWN0ICoKKyAgICAgICAgKCpOZXdUcmFuc2Zvcm1GZWVkYmFjaykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUpOworICAgdm9pZCAoKkRlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdHJhbnNmb3JtX2ZlZWRiYWNrX29iamVjdCAqb2JqKTsKKyAgIHZvaWQgKCpCZWdpblRyYW5zZm9ybUZlZWRiYWNrKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdHJhbnNmb3JtX2ZlZWRiYWNrX29iamVjdCAqb2JqKTsKKyAgIHZvaWQgKCpFbmRUcmFuc2Zvcm1GZWVkYmFjaykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RyYW5zZm9ybV9mZWVkYmFja19vYmplY3QgKm9iaik7CisgICB2b2lkICgqUGF1c2VUcmFuc2Zvcm1GZWVkYmFjaykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdHJhbnNmb3JtX2ZlZWRiYWNrX29iamVjdCAqb2JqKTsKKyAgIHZvaWQgKCpSZXN1bWVUcmFuc2Zvcm1GZWVkYmFjaykoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RyYW5zZm9ybV9mZWVkYmFja19vYmplY3QgKm9iaik7CisKKyAgIC8qKgorICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdmVydGljZXMgd3JpdHRlbiB0byBhIHN0cmVhbSBkdXJpbmcgdGhlIGxhc3QKKyAgICAqIEJlZ2luL0VuZFRyYW5zZm9ybUZlZWRiYWNrIGJsb2NrLgorICAgICovCisgICBHTHNpemVpICgqR2V0VHJhbnNmb3JtRmVlZGJhY2tWZXJ0ZXhDb3VudCkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfb2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgc3RyZWFtKTsKKworICAgLyoqCisgICAgKiBcbmFtZSBHTF9OVl90ZXh0dXJlX2JhcnJpZXIgaW50ZXJmYWNlCisgICAgKi8KKyAgIHZvaWQgKCpUZXh0dXJlQmFycmllcikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCk7CisKKyAgIC8qKgorICAgICogXG5hbWUgR0xfQVJCX3NhbXBsZXJfb2JqZWN0cworICAgICovCisgICBzdHJ1Y3QgZ2xfc2FtcGxlcl9vYmplY3QgKiAoKk5ld1NhbXBsZXJPYmplY3QpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBuYW1lKTsKKyAgIHZvaWQgKCpEZWxldGVTYW1wbGVyT2JqZWN0KShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zYW1wbGVyX29iamVjdCAqc2FtcCk7CisKKyAgIC8qKgorICAgICogXG5hbWUgUmV0dXJuIGEgdGltZXN0YW1wIGluIG5hbm9zZWNvbmRzIGFzIGRlZmluZWQgYnkgR0xfQVJCX3RpbWVyX3F1ZXJ5LgorICAgICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byBnbEdldEludGVnZXI2NHYoR0xfVElNRVNUQU1QKTsKKyAgICAqLworICAgdWludDY0X3QgKCpHZXRUaW1lc3RhbXApKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCisgICAvKioKKyAgICAqIFxuYW1lIEdMX0FSQl90ZXh0dXJlX211bHRpc2FtcGxlCisgICAgKi8KKyAgIHZvaWQgKCpHZXRTYW1wbGVQb3NpdGlvbikoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0ICpvdXRWYWx1ZSk7CisKKyAgIC8qKgorICAgICogXG5hbWUgTlZfdmRwYXVfaW50ZXJvcCBpbnRlcmZhY2UKKyAgICAqLworICAgdm9pZCAoKlZEUEFVTWFwU3VyZmFjZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBhY2Nlc3MsIEdMYm9vbGVhbiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdGV4dHVyZV9vYmplY3QgKnRleE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqdmRwU3VyZmFjZSwgR0x1aW50IGluZGV4KTsKKyAgIHZvaWQgKCpWRFBBVVVubWFwU3VyZmFjZSkoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGFjY2VzcywgR0xib29sZWFuIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90ZXh0dXJlX2ltYWdlICp0ZXhJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICp2ZHBTdXJmYWNlLCBHTHVpbnQgaW5kZXgpOworCisgICAvKioKKyAgICAqIFF1ZXJ5IHJlc2V0IHN0YXR1cyBmb3IgR0xfQVJCX3JvYnVzdG5lc3MKKyAgICAqCisgICAgKiBQZXIgXGMgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzQVJCLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYQorICAgICogbm9uLXplcm8gdmFsdWUgb25jZSBhZnRlciBhIHJlc2V0LiAgSWYgYSByZXNldCBpcyBub24tYXRvbWljLCB0aGUKKyAgICAqIG5vbi16ZXJvIHN0YXR1cyBzaG91bGQgYmUgcmV0dXJuZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVzZXQuCisgICAgKi8KKyAgIEdMZW51bSAoKkdldEdyYXBoaWNzUmVzZXRTdGF0dXMpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCisgICAvKioKKyAgICAqIFxuYW1lIEdMX0FSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZSBpbnRlcmZhY2UuCisgICAgKi8KKyAgIC8qKiBAeyAqLworICAgdm9pZCAoKkJpbmRJbWFnZVRleHR1cmUpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ltYWdlX3VuaXQgKnVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ZXhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgbGV2ZWwsIEdMYm9vbGVhbiBsYXllcmVkLCBHTGludCBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gYWNjZXNzLCBHTGVudW0gZm9ybWF0KTsKKworICAgdm9pZCAoKk1lbW9yeUJhcnJpZXIpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMYml0ZmllbGQgYmFycmllcnMpOworICAgLyoqIEB9ICovCit9OworCisKKy8qKgorICogUGVyLXZlcnRleCBmdW5jdGlvbnMuCisgKgorICogVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgd2hpY2ggY2FuIGFwcGVhciBiZXR3ZWVuIGdsQmVnaW4gYW5kIGdsRW5kLgorICogRGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UncmUgaW5zaWRlIG9yIG91dHNpZGUgYSBnbEJlZ2luL0VuZCBwYWlyCisgKiBhbmQgd2hldGhlciB3ZSdyZSBpbiBpbW1lZGlhdGUgbW9kZSBvciBidWlsZGluZyBhIGRpc3BsYXkgbGlzdCwgdGhlc2UKKyAqIGZ1bmN0aW9ucyBiZWhhdmUgZGlmZmVyZW50bHkuICBUaGlzIHN0cnVjdHVyZSBhbGxvd3MgdXMgdG8gc3dpdGNoCisgKiBiZXR3ZWVuIHRob3NlIG1vZGVzIG1vcmUgZWFzaWx5LgorICoKKyAqIEdlbmVyYWxseSwgdGhlc2UgcG9pbnRlcnMgcG9pbnQgdG8gZnVuY3Rpb25zIGluIHRoZSBWQk8gbW9kdWxlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB2b2lkIChHTEFQSUVOVFJZUCBBcnJheUVsZW1lbnQpKCBHTGludCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgQ29sb3IzZikoIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIENvbG9yM2Z2KSggY29uc3QgR0xmbG9hdCAqICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBDb2xvcjRmKSggR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgQ29sb3I0ZnYpKCBjb25zdCBHTGZsb2F0ICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIEVkZ2VGbGFnKSggR0xib29sZWFuICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBFdmFsQ29vcmQxZikoIEdMZmxvYXQgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIEV2YWxDb29yZDFmdikoIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgRXZhbENvb3JkMmYpKCBHTGZsb2F0LCBHTGZsb2F0ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBFdmFsQ29vcmQyZnYpKCBjb25zdCBHTGZsb2F0ICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIEV2YWxQb2ludDEpKCBHTGludCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgRXZhbFBvaW50MikoIEdMaW50LCBHTGludCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgRm9nQ29vcmRmRVhUKSggR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgRm9nQ29vcmRmdkVYVCkoIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgSW5kZXhmKSggR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgSW5kZXhmdikoIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTWF0ZXJpYWxmdikoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTXVsdGlUZXhDb29yZDFmQVJCKSggR0xlbnVtLCBHTGZsb2F0ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBNdWx0aVRleENvb3JkMWZ2QVJCKSggR0xlbnVtLCBjb25zdCBHTGZsb2F0ICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIE11bHRpVGV4Q29vcmQyZkFSQikoIEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTXVsdGlUZXhDb29yZDJmdkFSQikoIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBNdWx0aVRleENvb3JkM2ZBUkIpKCBHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIE11bHRpVGV4Q29vcmQzZnZBUkIpKCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTXVsdGlUZXhDb29yZDRmQVJCKSggR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBNdWx0aVRleENvb3JkNGZ2QVJCKSggR0xlbnVtLCBjb25zdCBHTGZsb2F0ICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIE5vcm1hbDNmKSggR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTm9ybWFsM2Z2KSggY29uc3QgR0xmbG9hdCAqICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBTZWNvbmRhcnlDb2xvcjNmRVhUKSggR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgU2Vjb25kYXJ5Q29sb3IzZnZFWFQpKCBjb25zdCBHTGZsb2F0ICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFRleENvb3JkMWYpKCBHTGZsb2F0ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBUZXhDb29yZDFmdikoIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgVGV4Q29vcmQyZikoIEdMZmxvYXQsIEdMZmxvYXQgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFRleENvb3JkMmZ2KSggY29uc3QgR0xmbG9hdCAqICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBUZXhDb29yZDNmKSggR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgVGV4Q29vcmQzZnYpKCBjb25zdCBHTGZsb2F0ICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFRleENvb3JkNGYpKCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBUZXhDb29yZDRmdikoIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4MmYpKCBHTGZsb2F0LCBHTGZsb2F0ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXgyZnYpKCBjb25zdCBHTGZsb2F0ICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleDNmKSggR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCApOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4M2Z2KSggY29uc3QgR0xmbG9hdCAqICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXg0ZikoIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleDRmdikoIGNvbnN0IEdMZmxvYXQgKiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgQ2FsbExpc3QpKCBHTHVpbnQgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIENhbGxMaXN0cykoIEdMc2l6ZWksIEdMZW51bSwgY29uc3QgR0x2b2lkICogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIEJlZ2luKSggR0xlbnVtICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBFbmQpKCB2b2lkICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBQcmltaXRpdmVSZXN0YXJ0TlYpKCB2b2lkICk7CisgICAvKiBPcmlnaW5hbGx5IGZvciBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbSwgbm93IHVzZWQgb25seSBkbGlzdC5jIGFuZCBmcmllbmRzICovCisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWIxZk5WKSggR0x1aW50IGluZGV4LCBHTGZsb2F0IHggKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjFmdk5WKSggR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWIyZk5WKSggR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSApOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliMmZ2TlYpKCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjNmTlYpKCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjNmdk5WKSggR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWI0Zk5WKSggR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjRmdk5WKSggR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2ICk7CisgICAvKiBHTF9BUkJfdmVydGV4X3Byb2dyYW0gKi8KKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjFmQVJCKSggR0x1aW50IGluZGV4LCBHTGZsb2F0IHggKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjFmdkFSQikoIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdiApOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliMmZBUkIpKCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWIyZnZBUkIpKCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjNmQVJCKSggR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWIzZnZBUkIpKCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjRmQVJCKSggR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYjRmdkFSQikoIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdiApOworCisgICAvKiBHTF9FWFRfZ3B1X3NoYWRlcjQgLyBHTCAzLjAgKi8KKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYkkxaSkoIEdMdWludCBpbmRleCwgR0xpbnQgeCk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWJJMmkpKCBHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHkpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliSTNpKSggR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYkk0aSkoIEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWJJMml2KSggR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWJJM2l2KSggR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWJJNGl2KSggR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYkkxdWkpKCBHTHVpbnQgaW5kZXgsIEdMdWludCB4KTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYkkydWkpKCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWJJM3VpKSggR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6KTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYkk0dWkpKCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleEF0dHJpYkkydWl2KSggR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliSTN1aXYpKCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhBdHRyaWJJNHVpdikoIEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKKworICAgLyogR0xfQVJCX3ZlcnRleF90eXBlXzEwXzEwXzEwXzJfcmV2IC8gR0wzLjMgKi8KKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleFAydWkpKCBHTGVudW0gdHlwZSwgR0x1aW50IHZhbHVlICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhQMnVpdikoIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKKworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4UDN1aSkoIEdMZW51bSB0eXBlLCBHTHVpbnQgdmFsdWUgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFZlcnRleFAzdWl2KSggR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqdmFsdWUpOworCisgICB2b2lkIChHTEFQSUVOVFJZUCBWZXJ0ZXhQNHVpKSggR0xlbnVtIHR5cGUsIEdMdWludCB2YWx1ZSApOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4UDR1aXYpKCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFRleENvb3JkUDF1aSkoIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBUZXhDb29yZFAxdWl2KSggR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzICk7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFRleENvb3JkUDJ1aSkoIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBUZXhDb29yZFAydWl2KSggR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzICk7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFRleENvb3JkUDN1aSkoIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBUZXhDb29yZFAzdWl2KSggR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzICk7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIFRleENvb3JkUDR1aSkoIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBUZXhDb29yZFA0dWl2KSggR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzICk7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIE11bHRpVGV4Q29vcmRQMXVpKSggR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBNdWx0aVRleENvb3JkUDF1aXYpKCBHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBNdWx0aVRleENvb3JkUDJ1aSkoIEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgR0x1aW50IGNvb3JkcyApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTXVsdGlUZXhDb29yZFAydWl2KSggR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3JkcyApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTXVsdGlUZXhDb29yZFAzdWkpKCBHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIE11bHRpVGV4Q29vcmRQM3VpdikoIEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIE11bHRpVGV4Q29vcmRQNHVpKSggR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBNdWx0aVRleENvb3JkUDR1aXYpKCBHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzICk7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIE5vcm1hbFAzdWkpKCBHTGVudW0gdHlwZSwgR0x1aW50IGNvb3JkcyApOworICAgdm9pZCAoR0xBUElFTlRSWVAgTm9ybWFsUDN1aXYpKCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMgKTsKKworICAgdm9pZCAoR0xBUElFTlRSWVAgQ29sb3JQM3VpKSggR0xlbnVtIHR5cGUsIEdMdWludCBjb2xvciApOworICAgdm9pZCAoR0xBUElFTlRSWVAgQ29sb3JQM3VpdikoIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvbG9yICk7CisKKyAgIHZvaWQgKEdMQVBJRU5UUllQIENvbG9yUDR1aSkoIEdMZW51bSB0eXBlLCBHTHVpbnQgY29sb3IgKTsKKyAgIHZvaWQgKEdMQVBJRU5UUllQIENvbG9yUDR1aXYpKCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb2xvciApOworCisgICB2b2lkIChHTEFQSUVOVFJZUCBTZWNvbmRhcnlDb2xvclAzdWkpKCBHTGVudW0gdHlwZSwgR0x1aW50IGNvbG9yICk7CisgICB2b2lkIChHTEFQSUVOVFJZUCBTZWNvbmRhcnlDb2xvclAzdWl2KSggR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29sb3IgKTsKKworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDF1aSkoIEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsCisJCQkJCUdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDJ1aSkoIEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsCisJCQkJCUdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDN1aSkoIEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsCisJCQkJCUdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDR1aSkoIEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsCisJCQkJCUdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDF1aXYpKCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLAorCQkJCQlHTGJvb2xlYW4gbm9ybWFsaXplZCwKKwkJCQkJIGNvbnN0IEdMdWludCAqdmFsdWUpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDJ1aXYpKCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLAorCQkJCQlHTGJvb2xlYW4gbm9ybWFsaXplZCwKKwkJCQkJIGNvbnN0IEdMdWludCAqdmFsdWUpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDN1aXYpKCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLAorCQkJCQlHTGJvb2xlYW4gbm9ybWFsaXplZCwKKwkJCQkJIGNvbnN0IEdMdWludCAqdmFsdWUpOworICAgdm9pZCAoR0xBUElFTlRSWVAgVmVydGV4QXR0cmliUDR1aXYpKCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLAorCQkJCQkgR0xib29sZWFuIG5vcm1hbGl6ZWQsCisJCQkJCSBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK30gR0x2ZXJ0ZXhmb3JtYXQ7CisKKworI2VuZGlmIC8qIEREX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2VudW1zLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2VudW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlNDQwOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZW51bXMuYwpAQCAtMCwwICsxLDQxMzkgQEAKKy8qIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGdsX2VudW1zLnB5IChmcm9tIE1lc2EpIHNjcmlwdCAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgQnJpYW4gUGF1bCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBCUklBTiBQQVVMLAorICogQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRzogQURECisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vZW51bXMuaCIKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgdWludDE2X3Qgb2Zmc2V0OworICAgaW50IG47Cit9IGVudW1fZWx0OworCitMT05HU1RSSU5HIHN0YXRpYyBjb25zdCBjaGFyIGVudW1fc3RyaW5nX3RhYmxlW10gPSAKKyAgICJHTF9GQUxTRVwwIgorICAgIkdMX0xJTkVTXDAiCisgICAiR0xfTElORV9MT09QXDAiCisgICAiR0xfTElORV9TVFJJUFwwIgorICAgIkdMX1RSSUFOR0xFU1wwIgorICAgIkdMX1RSSUFOR0xFX1NUUklQXDAiCisgICAiR0xfVFJJQU5HTEVfRkFOXDAiCisgICAiR0xfUVVBRFNcMCIKKyAgICJHTF9RVUFEX1NUUklQXDAiCisgICAiR0xfUE9MWUdPTlwwIgorICAgIkdMX0xJTkVTX0FESkFDRU5DWVwwIgorICAgIkdMX0xJTkVfU1RSSVBfQURKQUNFTkNZXDAiCisgICAiR0xfVFJJQU5HTEVTX0FESkFDRU5DWVwwIgorICAgIkdMX1RSSUFOR0xFX1NUUklQX0FESkFDRU5DWVwwIgorICAgIkdMX1BPTFlHT05fU1RJUFBMRV9CSVRcMCIKKyAgICJHTF9QSVhFTF9NT0RFX0JJVFwwIgorICAgIkdMX0xJR0hUSU5HX0JJVFwwIgorICAgIkdMX0ZPR19CSVRcMCIKKyAgICJHTF9BQ0NVTVwwIgorICAgIkdMX0xPQURcMCIKKyAgICJHTF9SRVRVUk5cMCIKKyAgICJHTF9NVUxUXDAiCisgICAiR0xfQUREXDAiCisgICAiR0xfTkVWRVJcMCIKKyAgICJHTF9MRVNTXDAiCisgICAiR0xfRVFVQUxcMCIKKyAgICJHTF9MRVFVQUxcMCIKKyAgICJHTF9HUkVBVEVSXDAiCisgICAiR0xfTk9URVFVQUxcMCIKKyAgICJHTF9HRVFVQUxcMCIKKyAgICJHTF9BTFdBWVNcMCIKKyAgICJHTF9TUkNfQ09MT1JcMCIKKyAgICJHTF9PTkVfTUlOVVNfU1JDX0NPTE9SXDAiCisgICAiR0xfU1JDX0FMUEhBXDAiCisgICAiR0xfT05FX01JTlVTX1NSQ19BTFBIQVwwIgorICAgIkdMX0RTVF9BTFBIQVwwIgorICAgIkdMX09ORV9NSU5VU19EU1RfQUxQSEFcMCIKKyAgICJHTF9EU1RfQ09MT1JcMCIKKyAgICJHTF9PTkVfTUlOVVNfRFNUX0NPTE9SXDAiCisgICAiR0xfU1JDX0FMUEhBX1NBVFVSQVRFXDAiCisgICAiR0xfRlJPTlRfTEVGVFwwIgorICAgIkdMX0ZST05UX1JJR0hUXDAiCisgICAiR0xfQkFDS19MRUZUXDAiCisgICAiR0xfQkFDS19SSUdIVFwwIgorICAgIkdMX0ZST05UXDAiCisgICAiR0xfQkFDS1wwIgorICAgIkdMX0xFRlRcMCIKKyAgICJHTF9SSUdIVFwwIgorICAgIkdMX0ZST05UX0FORF9CQUNLXDAiCisgICAiR0xfQVVYMFwwIgorICAgIkdMX0FVWDFcMCIKKyAgICJHTF9BVVgyXDAiCisgICAiR0xfQVVYM1wwIgorICAgIkdMX0lOVkFMSURfRU5VTVwwIgorICAgIkdMX0lOVkFMSURfVkFMVUVcMCIKKyAgICJHTF9JTlZBTElEX09QRVJBVElPTlwwIgorICAgIkdMX1NUQUNLX09WRVJGTE9XXDAiCisgICAiR0xfU1RBQ0tfVU5ERVJGTE9XXDAiCisgICAiR0xfT1VUX09GX01FTU9SWVwwIgorICAgIkdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OXDAiCisgICAiR0xfMkRcMCIKKyAgICJHTF8zRFwwIgorICAgIkdMXzNEX0NPTE9SXDAiCisgICAiR0xfM0RfQ09MT1JfVEVYVFVSRVwwIgorICAgIkdMXzREX0NPTE9SX1RFWFRVUkVcMCIKKyAgICJHTF9QQVNTX1RIUk9VR0hfVE9LRU5cMCIKKyAgICJHTF9QT0lOVF9UT0tFTlwwIgorICAgIkdMX0xJTkVfVE9LRU5cMCIKKyAgICJHTF9QT0xZR09OX1RPS0VOXDAiCisgICAiR0xfQklUTUFQX1RPS0VOXDAiCisgICAiR0xfRFJBV19QSVhFTF9UT0tFTlwwIgorICAgIkdMX0NPUFlfUElYRUxfVE9LRU5cMCIKKyAgICJHTF9MSU5FX1JFU0VUX1RPS0VOXDAiCisgICAiR0xfRVhQXDAiCisgICAiR0xfRVhQMlwwIgorICAgIkdMX0NXXDAiCisgICAiR0xfQ0NXXDAiCisgICAiR0xfQ09FRkZcMCIKKyAgICJHTF9PUkRFUlwwIgorICAgIkdMX0RPTUFJTlwwIgorICAgIkdMX0NVUlJFTlRfQ09MT1JcMCIKKyAgICJHTF9DVVJSRU5UX0lOREVYXDAiCisgICAiR0xfQ1VSUkVOVF9OT1JNQUxcMCIKKyAgICJHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTXDAiCisgICAiR0xfQ1VSUkVOVF9SQVNURVJfQ09MT1JcMCIKKyAgICJHTF9DVVJSRU5UX1JBU1RFUl9JTkRFWFwwIgorICAgIkdMX0NVUlJFTlRfUkFTVEVSX1RFWFRVUkVfQ09PUkRTXDAiCisgICAiR0xfQ1VSUkVOVF9SQVNURVJfUE9TSVRJT05cMCIKKyAgICJHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTl9WQUxJRFwwIgorICAgIkdMX0NVUlJFTlRfUkFTVEVSX0RJU1RBTkNFXDAiCisgICAiR0xfUE9JTlRfU01PT1RIXDAiCisgICAiR0xfUE9JTlRfU0laRVwwIgorICAgIkdMX1BPSU5UX1NJWkVfUkFOR0VcMCIKKyAgICJHTF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZXDAiCisgICAiR0xfTElORV9TTU9PVEhcMCIKKyAgICJHTF9MSU5FX1dJRFRIXDAiCisgICAiR0xfTElORV9XSURUSF9SQU5HRVwwIgorICAgIkdMX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFlcMCIKKyAgICJHTF9MSU5FX1NUSVBQTEVcMCIKKyAgICJHTF9MSU5FX1NUSVBQTEVfUEFUVEVSTlwwIgorICAgIkdMX0xJTkVfU1RJUFBMRV9SRVBFQVRcMCIKKyAgICJHTF9MSVNUX01PREVcMCIKKyAgICJHTF9NQVhfTElTVF9ORVNUSU5HXDAiCisgICAiR0xfTElTVF9CQVNFXDAiCisgICAiR0xfTElTVF9JTkRFWFwwIgorICAgIkdMX1BPTFlHT05fTU9ERVwwIgorICAgIkdMX1BPTFlHT05fU01PT1RIXDAiCisgICAiR0xfUE9MWUdPTl9TVElQUExFXDAiCisgICAiR0xfRURHRV9GTEFHXDAiCisgICAiR0xfQ1VMTF9GQUNFXDAiCisgICAiR0xfQ1VMTF9GQUNFX01PREVcMCIKKyAgICJHTF9GUk9OVF9GQUNFXDAiCisgICAiR0xfTElHSFRJTkdcMCIKKyAgICJHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVJcMCIKKyAgICJHTF9MSUdIVF9NT0RFTF9UV09fU0lERVwwIgorICAgIkdMX0xJR0hUX01PREVMX0FNQklFTlRcMCIKKyAgICJHTF9TSEFERV9NT0RFTFwwIgorICAgIkdMX0NPTE9SX01BVEVSSUFMX0ZBQ0VcMCIKKyAgICJHTF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVJcMCIKKyAgICJHTF9DT0xPUl9NQVRFUklBTFwwIgorICAgIkdMX0ZPR1wwIgorICAgIkdMX0ZPR19JTkRFWFwwIgorICAgIkdMX0ZPR19ERU5TSVRZXDAiCisgICAiR0xfRk9HX1NUQVJUXDAiCisgICAiR0xfRk9HX0VORFwwIgorICAgIkdMX0ZPR19NT0RFXDAiCisgICAiR0xfRk9HX0NPTE9SXDAiCisgICAiR0xfREVQVEhfUkFOR0VcMCIKKyAgICJHTF9ERVBUSF9URVNUXDAiCisgICAiR0xfREVQVEhfV1JJVEVNQVNLXDAiCisgICAiR0xfREVQVEhfQ0xFQVJfVkFMVUVcMCIKKyAgICJHTF9ERVBUSF9GVU5DXDAiCisgICAiR0xfQUNDVU1fQ0xFQVJfVkFMVUVcMCIKKyAgICJHTF9TVEVOQ0lMX1RFU1RcMCIKKyAgICJHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFXDAiCisgICAiR0xfU1RFTkNJTF9GVU5DXDAiCisgICAiR0xfU1RFTkNJTF9WQUxVRV9NQVNLXDAiCisgICAiR0xfU1RFTkNJTF9GQUlMXDAiCisgICAiR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUxcMCIKKyAgICJHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTU1wwIgorICAgIkdMX1NURU5DSUxfUkVGXDAiCisgICAiR0xfU1RFTkNJTF9XUklURU1BU0tcMCIKKyAgICJHTF9NQVRSSVhfTU9ERVwwIgorICAgIkdMX05PUk1BTElaRVwwIgorICAgIkdMX1ZJRVdQT1JUXDAiCisgICAiR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIXDAiCisgICAiR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSFwwIgorICAgIkdMX1RFWFRVUkVfU1RBQ0tfREVQVEhcMCIKKyAgICJHTF9NT0RFTFZJRVdfTUFUUklYXDAiCisgICAiR0xfUFJPSkVDVElPTl9NQVRSSVhcMCIKKyAgICJHTF9URVhUVVJFX01BVFJJWFwwIgorICAgIkdMX0FUVFJJQl9TVEFDS19ERVBUSFwwIgorICAgIkdMX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEhcMCIKKyAgICJHTF9BTFBIQV9URVNUXDAiCisgICAiR0xfQUxQSEFfVEVTVF9GVU5DXDAiCisgICAiR0xfQUxQSEFfVEVTVF9SRUZcMCIKKyAgICJHTF9ESVRIRVJcMCIKKyAgICJHTF9CTEVORF9EU1RcMCIKKyAgICJHTF9CTEVORF9TUkNcMCIKKyAgICJHTF9CTEVORFwwIgorICAgIkdMX0xPR0lDX09QX01PREVcMCIKKyAgICJHTF9JTkRFWF9MT0dJQ19PUFwwIgorICAgIkdMX0NPTE9SX0xPR0lDX09QXDAiCisgICAiR0xfQVVYX0JVRkZFUlNcMCIKKyAgICJHTF9EUkFXX0JVRkZFUlwwIgorICAgIkdMX1JFQURfQlVGRkVSXDAiCisgICAiR0xfU0NJU1NPUl9CT1hcMCIKKyAgICJHTF9TQ0lTU09SX1RFU1RcMCIKKyAgICJHTF9JTkRFWF9DTEVBUl9WQUxVRVwwIgorICAgIkdMX0lOREVYX1dSSVRFTUFTS1wwIgorICAgIkdMX0NPTE9SX0NMRUFSX1ZBTFVFXDAiCisgICAiR0xfQ09MT1JfV1JJVEVNQVNLXDAiCisgICAiR0xfSU5ERVhfTU9ERVwwIgorICAgIkdMX1JHQkFfTU9ERVwwIgorICAgIkdMX0RPVUJMRUJVRkZFUlwwIgorICAgIkdMX1NURVJFT1wwIgorICAgIkdMX1JFTkRFUl9NT0RFXDAiCisgICAiR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UXDAiCisgICAiR0xfUE9JTlRfU01PT1RIX0hJTlRcMCIKKyAgICJHTF9MSU5FX1NNT09USF9ISU5UXDAiCisgICAiR0xfUE9MWUdPTl9TTU9PVEhfSElOVFwwIgorICAgIkdMX0ZPR19ISU5UXDAiCisgICAiR0xfVEVYVFVSRV9HRU5fU1wwIgorICAgIkdMX1RFWFRVUkVfR0VOX1RcMCIKKyAgICJHTF9URVhUVVJFX0dFTl9SXDAiCisgICAiR0xfVEVYVFVSRV9HRU5fUVwwIgorICAgIkdMX1BJWEVMX01BUF9JX1RPX0lcMCIKKyAgICJHTF9QSVhFTF9NQVBfU19UT19TXDAiCisgICAiR0xfUElYRUxfTUFQX0lfVE9fUlwwIgorICAgIkdMX1BJWEVMX01BUF9JX1RPX0dcMCIKKyAgICJHTF9QSVhFTF9NQVBfSV9UT19CXDAiCisgICAiR0xfUElYRUxfTUFQX0lfVE9fQVwwIgorICAgIkdMX1BJWEVMX01BUF9SX1RPX1JcMCIKKyAgICJHTF9QSVhFTF9NQVBfR19UT19HXDAiCisgICAiR0xfUElYRUxfTUFQX0JfVE9fQlwwIgorICAgIkdMX1BJWEVMX01BUF9BX1RPX0FcMCIKKyAgICJHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfU19UT19TX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfSV9UT19SX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfSV9UT19CX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfSV9UT19BX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfR19UT19HX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfQl9UT19CX1NJWkVcMCIKKyAgICJHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkVcMCIKKyAgICJHTF9VTlBBQ0tfU1dBUF9CWVRFU1wwIgorICAgIkdMX1VOUEFDS19MU0JfRklSU1RcMCIKKyAgICJHTF9VTlBBQ0tfUk9XX0xFTkdUSFwwIgorICAgIkdMX1VOUEFDS19TS0lQX1JPV1NcMCIKKyAgICJHTF9VTlBBQ0tfU0tJUF9QSVhFTFNcMCIKKyAgICJHTF9VTlBBQ0tfQUxJR05NRU5UXDAiCisgICAiR0xfUEFDS19TV0FQX0JZVEVTXDAiCisgICAiR0xfUEFDS19MU0JfRklSU1RcMCIKKyAgICJHTF9QQUNLX1JPV19MRU5HVEhcMCIKKyAgICJHTF9QQUNLX1NLSVBfUk9XU1wwIgorICAgIkdMX1BBQ0tfU0tJUF9QSVhFTFNcMCIKKyAgICJHTF9QQUNLX0FMSUdOTUVOVFwwIgorICAgIkdMX01BUF9DT0xPUlwwIgorICAgIkdMX01BUF9TVEVOQ0lMXDAiCisgICAiR0xfSU5ERVhfU0hJRlRcMCIKKyAgICJHTF9JTkRFWF9PRkZTRVRcMCIKKyAgICJHTF9SRURfU0NBTEVcMCIKKyAgICJHTF9SRURfQklBU1wwIgorICAgIkdMX1pPT01fWFwwIgorICAgIkdMX1pPT01fWVwwIgorICAgIkdMX0dSRUVOX1NDQUxFXDAiCisgICAiR0xfR1JFRU5fQklBU1wwIgorICAgIkdMX0JMVUVfU0NBTEVcMCIKKyAgICJHTF9CTFVFX0JJQVNcMCIKKyAgICJHTF9BTFBIQV9TQ0FMRVwwIgorICAgIkdMX0FMUEhBX0JJQVNcMCIKKyAgICJHTF9ERVBUSF9TQ0FMRVwwIgorICAgIkdMX0RFUFRIX0JJQVNcMCIKKyAgICJHTF9NQVhfRVZBTF9PUkRFUlwwIgorICAgIkdMX01BWF9MSUdIVFNcMCIKKyAgICJHTF9NQVhfQ0xJUF9ESVNUQU5DRVNcMCIKKyAgICJHTF9NQVhfVEVYVFVSRV9TSVpFXDAiCisgICAiR0xfTUFYX1BJWEVMX01BUF9UQUJMRVwwIgorICAgIkdMX01BWF9BVFRSSUJfU1RBQ0tfREVQVEhcMCIKKyAgICJHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIXDAiCisgICAiR0xfTUFYX05BTUVfU1RBQ0tfREVQVEhcMCIKKyAgICJHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSFwwIgorICAgIkdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIXDAiCisgICAiR0xfTUFYX1ZJRVdQT1JUX0RJTVNcMCIKKyAgICJHTF9NQVhfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSFwwIgorICAgIkdMX1NVQlBJWEVMX0JJVFNcMCIKKyAgICJHTF9JTkRFWF9CSVRTXDAiCisgICAiR0xfUkVEX0JJVFNcMCIKKyAgICJHTF9HUkVFTl9CSVRTXDAiCisgICAiR0xfQkxVRV9CSVRTXDAiCisgICAiR0xfQUxQSEFfQklUU1wwIgorICAgIkdMX0RFUFRIX0JJVFNcMCIKKyAgICJHTF9TVEVOQ0lMX0JJVFNcMCIKKyAgICJHTF9BQ0NVTV9SRURfQklUU1wwIgorICAgIkdMX0FDQ1VNX0dSRUVOX0JJVFNcMCIKKyAgICJHTF9BQ0NVTV9CTFVFX0JJVFNcMCIKKyAgICJHTF9BQ0NVTV9BTFBIQV9CSVRTXDAiCisgICAiR0xfTkFNRV9TVEFDS19ERVBUSFwwIgorICAgIkdMX0FVVE9fTk9STUFMXDAiCisgICAiR0xfTUFQMV9DT0xPUl80XDAiCisgICAiR0xfTUFQMV9JTkRFWFwwIgorICAgIkdMX01BUDFfTk9STUFMXDAiCisgICAiR0xfTUFQMV9URVhUVVJFX0NPT1JEXzFcMCIKKyAgICJHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMlwwIgorICAgIkdMX01BUDFfVEVYVFVSRV9DT09SRF8zXDAiCisgICAiR0xfTUFQMV9URVhUVVJFX0NPT1JEXzRcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF8zXDAiCisgICAiR0xfTUFQMV9WRVJURVhfNFwwIgorICAgIkdMX01BUDJfQ09MT1JfNFwwIgorICAgIkdMX01BUDJfSU5ERVhcMCIKKyAgICJHTF9NQVAyX05PUk1BTFwwIgorICAgIkdMX01BUDJfVEVYVFVSRV9DT09SRF8xXDAiCisgICAiR0xfTUFQMl9URVhUVVJFX0NPT1JEXzJcMCIKKyAgICJHTF9NQVAyX1RFWFRVUkVfQ09PUkRfM1wwIgorICAgIkdMX01BUDJfVEVYVFVSRV9DT09SRF80XDAiCisgICAiR0xfTUFQMl9WRVJURVhfM1wwIgorICAgIkdMX01BUDJfVkVSVEVYXzRcMCIKKyAgICJHTF9NQVAxX0dSSURfRE9NQUlOXDAiCisgICAiR0xfTUFQMV9HUklEX1NFR01FTlRTXDAiCisgICAiR0xfTUFQMl9HUklEX0RPTUFJTlwwIgorICAgIkdMX01BUDJfR1JJRF9TRUdNRU5UU1wwIgorICAgIkdMX1RFWFRVUkVfMURcMCIKKyAgICJHTF9URVhUVVJFXzJEXDAiCisgICAiR0xfRkVFREJBQ0tfQlVGRkVSX1BPSU5URVJcMCIKKyAgICJHTF9GRUVEQkFDS19CVUZGRVJfU0laRVwwIgorICAgIkdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFXDAiCisgICAiR0xfU0VMRUNUSU9OX0JVRkZFUl9QT0lOVEVSXDAiCisgICAiR0xfU0VMRUNUSU9OX0JVRkZFUl9TSVpFXDAiCisgICAiR0xfVEVYVFVSRV9XSURUSFwwIgorICAgIkdMX1RFWFRVUkVfSEVJR0hUXDAiCisgICAiR0xfVEVYVFVSRV9DT01QT05FTlRTXDAiCisgICAiR0xfVEVYVFVSRV9CT1JERVJfQ09MT1JcMCIKKyAgICJHTF9URVhUVVJFX0JPUkRFUlwwIgorICAgIkdMX0RPTlRfQ0FSRVwwIgorICAgIkdMX0ZBU1RFU1RcMCIKKyAgICJHTF9OSUNFU1RcMCIKKyAgICJHTF9BTUJJRU5UXDAiCisgICAiR0xfRElGRlVTRVwwIgorICAgIkdMX1NQRUNVTEFSXDAiCisgICAiR0xfUE9TSVRJT05cMCIKKyAgICJHTF9TUE9UX0RJUkVDVElPTlwwIgorICAgIkdMX1NQT1RfRVhQT05FTlRcMCIKKyAgICJHTF9TUE9UX0NVVE9GRlwwIgorICAgIkdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OXDAiCisgICAiR0xfTElORUFSX0FUVEVOVUFUSU9OXDAiCisgICAiR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OXDAiCisgICAiR0xfQ09NUElMRVwwIgorICAgIkdMX0NPTVBJTEVfQU5EX0VYRUNVVEVcMCIKKyAgICJHTF9CWVRFXDAiCisgICAiR0xfVU5TSUdORURfQllURVwwIgorICAgIkdMX1NIT1JUXDAiCisgICAiR0xfVU5TSUdORURfU0hPUlRcMCIKKyAgICJHTF9JTlRcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRcMCIKKyAgICJHTF9GTE9BVFwwIgorICAgIkdMXzJfQllURVNcMCIKKyAgICJHTF8zX0JZVEVTXDAiCisgICAiR0xfNF9CWVRFU1wwIgorICAgIkdMX0RPVUJMRVwwIgorICAgIkdMX0hBTEZfRkxPQVRcMCIKKyAgICJHTF9GSVhFRFwwIgorICAgIkdMX0NMRUFSXDAiCisgICAiR0xfQU5EXDAiCisgICAiR0xfQU5EX1JFVkVSU0VcMCIKKyAgICJHTF9DT1BZXDAiCisgICAiR0xfQU5EX0lOVkVSVEVEXDAiCisgICAiR0xfTk9PUFwwIgorICAgIkdMX1hPUlwwIgorICAgIkdMX09SXDAiCisgICAiR0xfTk9SXDAiCisgICAiR0xfRVFVSVZcMCIKKyAgICJHTF9JTlZFUlRcMCIKKyAgICJHTF9PUl9SRVZFUlNFXDAiCisgICAiR0xfQ09QWV9JTlZFUlRFRFwwIgorICAgIkdMX09SX0lOVkVSVEVEXDAiCisgICAiR0xfTkFORFwwIgorICAgIkdMX1NFVFwwIgorICAgIkdMX0VNSVNTSU9OXDAiCisgICAiR0xfU0hJTklORVNTXDAiCisgICAiR0xfQU1CSUVOVF9BTkRfRElGRlVTRVwwIgorICAgIkdMX0NPTE9SX0lOREVYRVNcMCIKKyAgICJHTF9NT0RFTFZJRVdcMCIKKyAgICJHTF9QUk9KRUNUSU9OXDAiCisgICAiR0xfVEVYVFVSRVwwIgorICAgIkdMX0NPTE9SXDAiCisgICAiR0xfREVQVEhcMCIKKyAgICJHTF9TVEVOQ0lMXDAiCisgICAiR0xfQ09MT1JfSU5ERVhcMCIKKyAgICJHTF9TVEVOQ0lMX0lOREVYXDAiCisgICAiR0xfREVQVEhfQ09NUE9ORU5UXDAiCisgICAiR0xfUkVEXDAiCisgICAiR0xfR1JFRU5cMCIKKyAgICJHTF9CTFVFXDAiCisgICAiR0xfQUxQSEFcMCIKKyAgICJHTF9SR0JcMCIKKyAgICJHTF9SR0JBXDAiCisgICAiR0xfTFVNSU5BTkNFXDAiCisgICAiR0xfTFVNSU5BTkNFX0FMUEhBXDAiCisgICAiR0xfQklUTUFQXDAiCisgICAiR0xfUE9JTlRcMCIKKyAgICJHTF9MSU5FXDAiCisgICAiR0xfRklMTFwwIgorICAgIkdMX1JFTkRFUlwwIgorICAgIkdMX0ZFRURCQUNLXDAiCisgICAiR0xfU0VMRUNUXDAiCisgICAiR0xfRkxBVFwwIgorICAgIkdMX1NNT09USFwwIgorICAgIkdMX0tFRVBcMCIKKyAgICJHTF9SRVBMQUNFXDAiCisgICAiR0xfSU5DUlwwIgorICAgIkdMX0RFQ1JcMCIKKyAgICJHTF9WRU5ET1JcMCIKKyAgICJHTF9SRU5ERVJFUlwwIgorICAgIkdMX1ZFUlNJT05cMCIKKyAgICJHTF9FWFRFTlNJT05TXDAiCisgICAiR0xfU1wwIgorICAgIkdMX1RcMCIKKyAgICJHTF9SXDAiCisgICAiR0xfUVwwIgorICAgIkdMX01PRFVMQVRFXDAiCisgICAiR0xfREVDQUxcMCIKKyAgICJHTF9URVhUVVJFX0VOVl9NT0RFXDAiCisgICAiR0xfVEVYVFVSRV9FTlZfQ09MT1JcMCIKKyAgICJHTF9URVhUVVJFX0VOVlwwIgorICAgIkdMX0VZRV9MSU5FQVJcMCIKKyAgICJHTF9PQkpFQ1RfTElORUFSXDAiCisgICAiR0xfU1BIRVJFX01BUFwwIgorICAgIkdMX1RFWFRVUkVfR0VOX01PREVcMCIKKyAgICJHTF9PQkpFQ1RfUExBTkVcMCIKKyAgICJHTF9FWUVfUExBTkVcMCIKKyAgICJHTF9ORUFSRVNUXDAiCisgICAiR0xfTElORUFSXDAiCisgICAiR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVFwwIgorICAgIkdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVFwwIgorICAgIkdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUlwwIgorICAgIkdMX0xJTkVBUl9NSVBNQVBfTElORUFSXDAiCisgICAiR0xfVEVYVFVSRV9NQUdfRklMVEVSXDAiCisgICAiR0xfVEVYVFVSRV9NSU5fRklMVEVSXDAiCisgICAiR0xfVEVYVFVSRV9XUkFQX1NcMCIKKyAgICJHTF9URVhUVVJFX1dSQVBfVFwwIgorICAgIkdMX0NMQU1QXDAiCisgICAiR0xfUkVQRUFUXDAiCisgICAiR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFNcMCIKKyAgICJHTF9QT0xZR09OX09GRlNFVF9QT0lOVFwwIgorICAgIkdMX1BPTFlHT05fT0ZGU0VUX0xJTkVcMCIKKyAgICJHTF9SM19HM19CMlwwIgorICAgIkdMX1YyRlwwIgorICAgIkdMX1YzRlwwIgorICAgIkdMX0M0VUJfVjJGXDAiCisgICAiR0xfQzRVQl9WM0ZcMCIKKyAgICJHTF9DM0ZfVjNGXDAiCisgICAiR0xfTjNGX1YzRlwwIgorICAgIkdMX0M0Rl9OM0ZfVjNGXDAiCisgICAiR0xfVDJGX1YzRlwwIgorICAgIkdMX1Q0Rl9WNEZcMCIKKyAgICJHTF9UMkZfQzRVQl9WM0ZcMCIKKyAgICJHTF9UMkZfQzNGX1YzRlwwIgorICAgIkdMX1QyRl9OM0ZfVjNGXDAiCisgICAiR0xfVDJGX0M0Rl9OM0ZfVjNGXDAiCisgICAiR0xfVDRGX0M0Rl9OM0ZfVjRGXDAiCisgICAiR0xfQ0xJUF9ESVNUQU5DRTBcMCIKKyAgICJHTF9DTElQX0RJU1RBTkNFMVwwIgorICAgIkdMX0NMSVBfRElTVEFOQ0UyXDAiCisgICAiR0xfQ0xJUF9ESVNUQU5DRTNcMCIKKyAgICJHTF9DTElQX0RJU1RBTkNFNFwwIgorICAgIkdMX0NMSVBfRElTVEFOQ0U1XDAiCisgICAiR0xfQ0xJUF9ESVNUQU5DRTZcMCIKKyAgICJHTF9DTElQX0RJU1RBTkNFN1wwIgorICAgIkdMX0xJR0hUMFwwIgorICAgIkdMX0xJR0hUMVwwIgorICAgIkdMX0xJR0hUMlwwIgorICAgIkdMX0xJR0hUM1wwIgorICAgIkdMX0xJR0hUNFwwIgorICAgIkdMX0xJR0hUNVwwIgorICAgIkdMX0xJR0hUNlwwIgorICAgIkdMX0xJR0hUN1wwIgorICAgIkdMX0hJTlRfQklUXDAiCisgICAiR0xfQ09OU1RBTlRfQ09MT1JcMCIKKyAgICJHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1JcMCIKKyAgICJHTF9DT05TVEFOVF9BTFBIQVwwIgorICAgIkdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQVwwIgorICAgIkdMX0JMRU5EX0NPTE9SXDAiCisgICAiR0xfRlVOQ19BRERcMCIKKyAgICJHTF9NSU5cMCIKKyAgICJHTF9NQVhcMCIKKyAgICJHTF9CTEVORF9FUVVBVElPTlwwIgorICAgIkdMX0ZVTkNfU1VCVFJBQ1RcMCIKKyAgICJHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1RcMCIKKyAgICJHTF9DT05WT0xVVElPTl8xRFwwIgorICAgIkdMX0NPTlZPTFVUSU9OXzJEXDAiCisgICAiR0xfU0VQQVJBQkxFXzJEXDAiCisgICAiR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREVcMCIKKyAgICJHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEVcMCIKKyAgICJHTF9DT05WT0xVVElPTl9GSUxURVJfQklBU1wwIgorICAgIkdMX1JFRFVDRVwwIgorICAgIkdMX0NPTlZPTFVUSU9OX0ZPUk1BVFwwIgorICAgIkdMX0NPTlZPTFVUSU9OX1dJRFRIXDAiCisgICAiR0xfQ09OVk9MVVRJT05fSEVJR0hUXDAiCisgICAiR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIXDAiCisgICAiR0xfTUFYX0NPTlZPTFVUSU9OX0hFSUdIVFwwIgorICAgIkdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFXDAiCisgICAiR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRVwwIgorICAgIkdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRVwwIgorICAgIkdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEVcMCIKKyAgICJHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTXDAiCisgICAiR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTXDAiCisgICAiR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVNcMCIKKyAgICJHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVNcMCIKKyAgICJHTF9ISVNUT0dSQU1cMCIKKyAgICJHTF9QUk9YWV9ISVNUT0dSQU1cMCIKKyAgICJHTF9ISVNUT0dSQU1fV0lEVEhcMCIKKyAgICJHTF9ISVNUT0dSQU1fRk9STUFUXDAiCisgICAiR0xfSElTVE9HUkFNX1JFRF9TSVpFXDAiCisgICAiR0xfSElTVE9HUkFNX0dSRUVOX1NJWkVcMCIKKyAgICJHTF9ISVNUT0dSQU1fQkxVRV9TSVpFXDAiCisgICAiR0xfSElTVE9HUkFNX0FMUEhBX1NJWkVcMCIKKyAgICJHTF9ISVNUT0dSQU1fTFVNSU5BTkNFX1NJWkVcMCIKKyAgICJHTF9ISVNUT0dSQU1fU0lOS1wwIgorICAgIkdMX01JTk1BWFwwIgorICAgIkdMX01JTk1BWF9GT1JNQVRcMCIKKyAgICJHTF9NSU5NQVhfU0lOS1wwIgorICAgIkdMX1RBQkxFX1RPT19MQVJHRV9FWFRcMCIKKyAgICJHTF9VTlNJR05FRF9CWVRFXzNfM18yXDAiCisgICAiR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNFwwIgorICAgIkdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzFcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfOF84XzhfOFwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yXDAiCisgICAiR0xfUE9MWUdPTl9PRkZTRVRfRklMTFwwIgorICAgIkdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUlwwIgorICAgIkdMX1BPTFlHT05fT0ZGU0VUX0JJQVNfRVhUXDAiCisgICAiR0xfUkVTQ0FMRV9OT1JNQUxcMCIKKyAgICJHTF9BTFBIQTRcMCIKKyAgICJHTF9BTFBIQThcMCIKKyAgICJHTF9BTFBIQTEyXDAiCisgICAiR0xfQUxQSEExNlwwIgorICAgIkdMX0xVTUlOQU5DRTRcMCIKKyAgICJHTF9MVU1JTkFOQ0U4XDAiCisgICAiR0xfTFVNSU5BTkNFMTJcMCIKKyAgICJHTF9MVU1JTkFOQ0UxNlwwIgorICAgIkdMX0xVTUlOQU5DRTRfQUxQSEE0XDAiCisgICAiR0xfTFVNSU5BTkNFNl9BTFBIQTJcMCIKKyAgICJHTF9MVU1JTkFOQ0U4X0FMUEhBOFwwIgorICAgIkdMX0xVTUlOQU5DRTEyX0FMUEhBNFwwIgorICAgIkdMX0xVTUlOQU5DRTEyX0FMUEhBMTJcMCIKKyAgICJHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2XDAiCisgICAiR0xfSU5URU5TSVRZXDAiCisgICAiR0xfSU5URU5TSVRZNFwwIgorICAgIkdMX0lOVEVOU0lUWThcMCIKKyAgICJHTF9JTlRFTlNJVFkxMlwwIgorICAgIkdMX0lOVEVOU0lUWTE2XDAiCisgICAiR0xfUkdCMl9FWFRcMCIKKyAgICJHTF9SR0I0XDAiCisgICAiR0xfUkdCNVwwIgorICAgIkdMX1JHQjhcMCIKKyAgICJHTF9SR0IxMFwwIgorICAgIkdMX1JHQjEyXDAiCisgICAiR0xfUkdCMTZcMCIKKyAgICJHTF9SR0JBMlwwIgorICAgIkdMX1JHQkE0XDAiCisgICAiR0xfUkdCNV9BMVwwIgorICAgIkdMX1JHQkE4XDAiCisgICAiR0xfUkdCMTBfQTJcMCIKKyAgICJHTF9SR0JBMTJcMCIKKyAgICJHTF9SR0JBMTZcMCIKKyAgICJHTF9URVhUVVJFX1JFRF9TSVpFXDAiCisgICAiR0xfVEVYVFVSRV9HUkVFTl9TSVpFXDAiCisgICAiR0xfVEVYVFVSRV9CTFVFX1NJWkVcMCIKKyAgICJHTF9URVhUVVJFX0FMUEhBX1NJWkVcMCIKKyAgICJHTF9URVhUVVJFX0xVTUlOQU5DRV9TSVpFXDAiCisgICAiR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRVwwIgorICAgIkdMX1JFUExBQ0VfRVhUXDAiCisgICAiR0xfUFJPWFlfVEVYVFVSRV8xRFwwIgorICAgIkdMX1BST1hZX1RFWFRVUkVfMkRcMCIKKyAgICJHTF9URVhUVVJFX1RPT19MQVJHRV9FWFRcMCIKKyAgICJHTF9URVhUVVJFX1BSSU9SSVRZXDAiCisgICAiR0xfVEVYVFVSRV9SRVNJREVOVFwwIgorICAgIkdMX1RFWFRVUkVfQklORElOR18xRFwwIgorICAgIkdMX1RFWFRVUkVfQklORElOR18yRFwwIgorICAgIkdMX1RFWFRVUkVfQklORElOR18zRFwwIgorICAgIkdMX1BBQ0tfU0tJUF9JTUFHRVNcMCIKKyAgICJHTF9QQUNLX0lNQUdFX0hFSUdIVFwwIgorICAgIkdMX1VOUEFDS19TS0lQX0lNQUdFU1wwIgorICAgIkdMX1VOUEFDS19JTUFHRV9IRUlHSFRcMCIKKyAgICJHTF9URVhUVVJFXzNEXDAiCisgICAiR0xfUFJPWFlfVEVYVFVSRV8zRFwwIgorICAgIkdMX1RFWFRVUkVfREVQVEhcMCIKKyAgICJHTF9URVhUVVJFX1dSQVBfUlwwIgorICAgIkdMX01BWF8zRF9URVhUVVJFX1NJWkVcMCIKKyAgICJHTF9WRVJURVhfQVJSQVlcMCIKKyAgICJHTF9OT1JNQUxfQVJSQVlcMCIKKyAgICJHTF9DT0xPUl9BUlJBWVwwIgorICAgIkdMX0lOREVYX0FSUkFZXDAiCisgICAiR0xfVEVYVFVSRV9DT09SRF9BUlJBWVwwIgorICAgIkdMX0VER0VfRkxBR19BUlJBWVwwIgorICAgIkdMX1ZFUlRFWF9BUlJBWV9TSVpFXDAiCisgICAiR0xfVkVSVEVYX0FSUkFZX1RZUEVcMCIKKyAgICJHTF9WRVJURVhfQVJSQVlfU1RSSURFXDAiCisgICAiR0xfVkVSVEVYX0FSUkFZX0NPVU5UX0VYVFwwIgorICAgIkdMX05PUk1BTF9BUlJBWV9UWVBFXDAiCisgICAiR0xfTk9STUFMX0FSUkFZX1NUUklERVwwIgorICAgIkdMX05PUk1BTF9BUlJBWV9DT1VOVF9FWFRcMCIKKyAgICJHTF9DT0xPUl9BUlJBWV9TSVpFXDAiCisgICAiR0xfQ09MT1JfQVJSQVlfVFlQRVwwIgorICAgIkdMX0NPTE9SX0FSUkFZX1NUUklERVwwIgorICAgIkdMX0NPTE9SX0FSUkFZX0NPVU5UX0VYVFwwIgorICAgIkdMX0lOREVYX0FSUkFZX1RZUEVcMCIKKyAgICJHTF9JTkRFWF9BUlJBWV9TVFJJREVcMCIKKyAgICJHTF9JTkRFWF9BUlJBWV9DT1VOVF9FWFRcMCIKKyAgICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkVcMCIKKyAgICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVcMCIKKyAgICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERVwwIgorICAgIkdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQ09VTlRfRVhUXDAiCisgICAiR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERVwwIgorICAgIkdMX0VER0VfRkxBR19BUlJBWV9DT1VOVF9FWFRcMCIKKyAgICJHTF9WRVJURVhfQVJSQVlfUE9JTlRFUlwwIgorICAgIkdMX05PUk1BTF9BUlJBWV9QT0lOVEVSXDAiCisgICAiR0xfQ09MT1JfQVJSQVlfUE9JTlRFUlwwIgorICAgIkdMX0lOREVYX0FSUkFZX1BPSU5URVJcMCIKKyAgICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVJcMCIKKyAgICJHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUlwwIgorICAgIkdMX01VTFRJU0FNUExFXDAiCisgICAiR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFXDAiCisgICAiR0xfU0FNUExFX0FMUEhBX1RPX09ORVwwIgorICAgIkdMX1NBTVBMRV9DT1ZFUkFHRVwwIgorICAgIkdMX1NBTVBMRV9CVUZGRVJTXDAiCisgICAiR0xfU0FNUExFU1wwIgorICAgIkdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRVwwIgorICAgIkdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlRcMCIKKyAgICJHTF9DT0xPUl9NQVRSSVhcMCIKKyAgICJHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEhcMCIKKyAgICJHTF9NQVhfQ09MT1JfTUFUUklYX1NUQUNLX0RFUFRIXDAiCisgICAiR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX1NDQUxFXDAiCisgICAiR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fU0NBTEVcMCIKKyAgICJHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX1NDQUxFXDAiCisgICAiR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEVcMCIKKyAgICJHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBU1wwIgorICAgIkdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX0JJQVNcMCIKKyAgICJHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX0JJQVNcMCIKKyAgICJHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTXDAiCisgICAiR0xfVEVYVFVSRV9DT0xPUl9UQUJMRV9TR0lcMCIKKyAgICJHTF9QUk9YWV9URVhUVVJFX0NPTE9SX1RBQkxFX1NHSVwwIgorICAgIkdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQlwwIgorICAgIkdMX0JMRU5EX0RTVF9SR0JcMCIKKyAgICJHTF9CTEVORF9TUkNfUkdCXDAiCisgICAiR0xfQkxFTkRfRFNUX0FMUEhBXDAiCisgICAiR0xfQkxFTkRfU1JDX0FMUEhBXDAiCisgICAiR0xfQ09MT1JfVEFCTEVcMCIKKyAgICJHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFXDAiCisgICAiR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEVcMCIKKyAgICJHTF9QUk9YWV9DT0xPUl9UQUJMRVwwIgorICAgIkdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEVcMCIKKyAgICJHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRVwwIgorICAgIkdMX0NPTE9SX1RBQkxFX1NDQUxFXDAiCisgICAiR0xfQ09MT1JfVEFCTEVfQklBU1wwIgorICAgIkdMX0NPTE9SX1RBQkxFX0ZPUk1BVFwwIgorICAgIkdMX0NPTE9SX1RBQkxFX1dJRFRIXDAiCisgICAiR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVcMCIKKyAgICJHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFXDAiCisgICAiR0xfQ09MT1JfVEFCTEVfQkxVRV9TSVpFXDAiCisgICAiR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRVwwIgorICAgIkdMX0NPTE9SX1RBQkxFX0xVTUlOQU5DRV9TSVpFXDAiCisgICAiR0xfQ09MT1JfVEFCTEVfSU5URU5TSVRZX1NJWkVcMCIKKyAgICJHTF9CR1JcMCIKKyAgICJHTF9CR1JBXDAiCisgICAiR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTXDAiCisgICAiR0xfTUFYX0VMRU1FTlRTX0lORElDRVNcMCIKKyAgICJHTF9URVhUVVJFX0lOREVYX1NJWkVfRVhUXDAiCisgICAiR0xfQ0xJUF9WT0xVTUVfQ0xJUFBJTkdfSElOVF9FWFRcMCIKKyAgICJHTF9QT0lOVF9TSVpFX01JTlwwIgorICAgIkdMX1BPSU5UX1NJWkVfTUFYXDAiCisgICAiR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRVwwIgorICAgIkdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OXDAiCisgICAiR0xfQ0xBTVBfVE9fQk9SREVSXDAiCisgICAiR0xfQ0xBTVBfVE9fRURHRVwwIgorICAgIkdMX1RFWFRVUkVfTUlOX0xPRFwwIgorICAgIkdMX1RFWFRVUkVfTUFYX0xPRFwwIgorICAgIkdMX1RFWFRVUkVfQkFTRV9MRVZFTFwwIgorICAgIkdMX1RFWFRVUkVfTUFYX0xFVkVMXDAiCisgICAiR0xfSUdOT1JFX0JPUkRFUl9IUFwwIgorICAgIkdMX0NPTlNUQU5UX0JPUkRFUl9IUFwwIgorICAgIkdMX1JFUExJQ0FURV9CT1JERVJfSFBcMCIKKyAgICJHTF9DT05WT0xVVElPTl9CT1JERVJfQ09MT1JcMCIKKyAgICJHTF9PQ0NMVVNJT05fVEVTVF9IUFwwIgorICAgIkdMX09DQ0xVU0lPTl9URVNUX1JFU1VMVF9IUFwwIgorICAgIkdMX0xJTkVBUl9DTElQTUFQX0xJTkVBUl9TR0lYXDAiCisgICAiR0xfVEVYVFVSRV9DTElQTUFQX0NFTlRFUl9TR0lYXDAiCisgICAiR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVhcMCIKKyAgICJHTF9URVhUVVJFX0NMSVBNQVBfT0ZGU0VUX1NHSVhcMCIKKyAgICJHTF9URVhUVVJFX0NMSVBNQVBfVklSVFVBTF9ERVBUSF9TR0lYXDAiCisgICAiR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWFwwIgorICAgIkdMX1RFWFRVUkVfQ0xJUE1BUF9ERVBUSF9TR0lYXDAiCisgICAiR0xfTUFYX0NMSVBNQVBfREVQVEhfU0dJWFwwIgorICAgIkdMX01BWF9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWFwwIgorICAgIkdMX1BPU1RfVEVYVFVSRV9GSUxURVJfQklBU19TR0lYXDAiCisgICAiR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9TR0lYXDAiCisgICAiR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1JBTkdFX1NHSVhcMCIKKyAgICJHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1JBTkdFX1NHSVhcMCIKKyAgICJHTF9URVhUVVJFX0xPRF9CSUFTX1NfU0dJWFwwIgorICAgIkdMX1RFWFRVUkVfTE9EX0JJQVNfVF9TR0lYXDAiCisgICAiR0xfVEVYVFVSRV9MT0RfQklBU19SX1NHSVhcMCIKKyAgICJHTF9HRU5FUkFURV9NSVBNQVBcMCIKKyAgICJHTF9HRU5FUkFURV9NSVBNQVBfSElOVFwwIgorICAgIkdMX0ZPR19PRkZTRVRfU0dJWFwwIgorICAgIkdMX0ZPR19PRkZTRVRfVkFMVUVfU0dJWFwwIgorICAgIkdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYXDAiCisgICAiR0xfVEVYVFVSRV9DT01QQVJFX09QRVJBVE9SX1NHSVhcMCIKKyAgICJHTF9URVhUVVJFX0xFUVVBTF9SX1NHSVhcMCIKKyAgICJHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVhcMCIKKyAgICJHTF9ERVBUSF9DT01QT05FTlQxNlwwIgorICAgIkdMX0RFUFRIX0NPTVBPTkVOVDI0XDAiCisgICAiR0xfREVQVEhfQ09NUE9ORU5UMzJcMCIKKyAgICJHTF9BUlJBWV9FTEVNRU5UX0xPQ0tfRklSU1RfRVhUXDAiCisgICAiR0xfQVJSQVlfRUxFTUVOVF9MT0NLX0NPVU5UX0VYVFwwIgorICAgIkdMX0NVTExfVkVSVEVYX0VYVFwwIgorICAgIkdMX0NVTExfVkVSVEVYX09CSkVDVF9QT1NJVElPTl9FWFRcMCIKKyAgICJHTF9DVUxMX1ZFUlRFWF9FWUVfUE9TSVRJT05fRVhUXDAiCisgICAiR0xfV1JBUF9CT1JERVJfU1VOXDAiCisgICAiR0xfVEVYVFVSRV9DT0xPUl9XUklURU1BU0tfU0dJU1wwIgorICAgIkdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0xcMCIKKyAgICJHTF9TSU5HTEVfQ09MT1JcMCIKKyAgICJHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUlwwIgorICAgIkdMX1NIQVJFRF9URVhUVVJFX1BBTEVUVEVfRVhUXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElOR1wwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEVcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1JFRF9TSVpFXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkVcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0FMUEhBX1NJWkVcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkVcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRVwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0RFRkFVTFRcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9VTkRFRklORURcMCIKKyAgICJHTF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRcMCIKKyAgICJHTF9NQUpPUl9WRVJTSU9OXDAiCisgICAiR0xfTUlOT1JfVkVSU0lPTlwwIgorICAgIkdMX05VTV9FWFRFTlNJT05TXDAiCisgICAiR0xfQ09OVEVYVF9GTEFHU1wwIgorICAgIkdMX0JVRkZFUl9JTU1VVEFCTEVfU1RPUkFHRVwwIgorICAgIkdMX0JVRkZFUl9TVE9SQUdFX0ZMQUdTXDAiCisgICAiR0xfSU5ERVhcMCIKKyAgICJHTF9ERVBUSF9CVUZGRVJcMCIKKyAgICJHTF9TVEVOQ0lMX0JVRkZFUlwwIgorICAgIkdMX0NPTVBSRVNTRURfUkVEXDAiCisgICAiR0xfQ09NUFJFU1NFRF9SR1wwIgorICAgIkdMX1JHXDAiCisgICAiR0xfUkdfSU5URUdFUlwwIgorICAgIkdMX1I4XDAiCisgICAiR0xfUjE2XDAiCisgICAiR0xfUkc4XDAiCisgICAiR0xfUkcxNlwwIgorICAgIkdMX1IxNkZcMCIKKyAgICJHTF9SMzJGXDAiCisgICAiR0xfUkcxNkZcMCIKKyAgICJHTF9SRzMyRlwwIgorICAgIkdMX1I4SVwwIgorICAgIkdMX1I4VUlcMCIKKyAgICJHTF9SMTZJXDAiCisgICAiR0xfUjE2VUlcMCIKKyAgICJHTF9SMzJJXDAiCisgICAiR0xfUjMyVUlcMCIKKyAgICJHTF9SRzhJXDAiCisgICAiR0xfUkc4VUlcMCIKKyAgICJHTF9SRzE2SVwwIgorICAgIkdMX1JHMTZVSVwwIgorICAgIkdMX1JHMzJJXDAiCisgICAiR0xfUkczMlVJXDAiCisgICAiR0xfREVCVUdfT1VUUFVUX1NZTkNIUk9OT1VTX0FSQlwwIgorICAgIkdMX0RFQlVHX05FWFRfTE9HR0VEX01FU1NBR0VfTEVOR1RIX0FSQlwwIgorICAgIkdMX0RFQlVHX0NBTExCQUNLX0ZVTkNUSU9OX0FSQlwwIgorICAgIkdMX0RFQlVHX0NBTExCQUNLX1VTRVJfUEFSQU1fQVJCXDAiCisgICAiR0xfREVCVUdfU09VUkNFX0FQSV9BUkJcMCIKKyAgICJHTF9ERUJVR19TT1VSQ0VfV0lORE9XX1NZU1RFTV9BUkJcMCIKKyAgICJHTF9ERUJVR19TT1VSQ0VfU0hBREVSX0NPTVBJTEVSX0FSQlwwIgorICAgIkdMX0RFQlVHX1NPVVJDRV9USElSRF9QQVJUWV9BUkJcMCIKKyAgICJHTF9ERUJVR19TT1VSQ0VfQVBQTElDQVRJT05fQVJCXDAiCisgICAiR0xfREVCVUdfU09VUkNFX09USEVSX0FSQlwwIgorICAgIkdMX0RFQlVHX1RZUEVfRVJST1JfQVJCXDAiCisgICAiR0xfREVCVUdfVFlQRV9ERVBSRUNBVEVEX0JFSEFWSU9SX0FSQlwwIgorICAgIkdMX0RFQlVHX1RZUEVfVU5ERUZJTkVEX0JFSEFWSU9SX0FSQlwwIgorICAgIkdMX0RFQlVHX1RZUEVfUE9SVEFCSUxJVFlfQVJCXDAiCisgICAiR0xfREVCVUdfVFlQRV9QRVJGT1JNQU5DRV9BUkJcMCIKKyAgICJHTF9ERUJVR19UWVBFX09USEVSX0FSQlwwIgorICAgIkdMX0xPU0VfQ09OVEVYVF9PTl9SRVNFVF9BUkJcMCIKKyAgICJHTF9HVUlMVFlfQ09OVEVYVF9SRVNFVF9BUkJcMCIKKyAgICJHTF9JTk5PQ0VOVF9DT05URVhUX1JFU0VUX0FSQlwwIgorICAgIkdMX1VOS05PV05fQ09OVEVYVF9SRVNFVF9BUkJcMCIKKyAgICJHTF9SRVNFVF9OT1RJRklDQVRJT05fU1RSQVRFR1lfQVJCXDAiCisgICAiR0xfUFJPR1JBTV9CSU5BUllfUkVUUklFVkFCTEVfSElOVFwwIgorICAgIkdMX1BST0dSQU1fU0VQQVJBQkxFX0VYVFwwIgorICAgIkdMX0FDVElWRV9QUk9HUkFNX0VYVFwwIgorICAgIkdMX1BST0dSQU1fUElQRUxJTkVfQklORElOR19FWFRcMCIKKyAgICJHTF9NQVhfVklFV1BPUlRTXDAiCisgICAiR0xfVklFV1BPUlRfU1VCUElYRUxfQklUU1wwIgorICAgIkdMX1ZJRVdQT1JUX0JPVU5EU19SQU5HRVwwIgorICAgIkdMX0xBWUVSX1BST1ZPS0lOR19WRVJURVhcMCIKKyAgICJHTF9WSUVXUE9SVF9JTkRFWF9QUk9WT0tJTkdfVkVSVEVYXDAiCisgICAiR0xfVU5ERUZJTkVEX1ZFUlRFWFwwIgorICAgIkdMX05PX1JFU0VUX05PVElGSUNBVElPTl9BUkJcMCIKKyAgICJHTF9NQVhfQ09NUFVURV9TSEFSRURfTUVNT1JZX1NJWkVcMCIKKyAgICJHTF9NQVhfQ09NUFVURV9VTklGT1JNX0NPTVBPTkVOVFNcMCIKKyAgICJHTF9NQVhfQ09NUFVURV9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTXDAiCisgICAiR0xfTUFYX0NPTVBVVEVfQVRPTUlDX0NPVU5URVJTXDAiCisgICAiR0xfTUFYX0NPTUJJTkVEX0NPTVBVVEVfVU5JRk9STV9DT01QT05FTlRTXDAiCisgICAiR0xfQ09NUFVURV9XT1JLX0dST1VQX1NJWkVcMCIKKyAgICJHTF9ERUJVR19UWVBFX01BUktFUlwwIgorICAgIkdMX0RFQlVHX1RZUEVfUFVTSF9HUk9VUFwwIgorICAgIkdMX0RFQlVHX1RZUEVfUE9QX0dST1VQXDAiCisgICAiR0xfREVCVUdfU0VWRVJJVFlfTk9USUZJQ0FUSU9OXDAiCisgICAiR0xfTUFYX0RFQlVHX0dST1VQX1NUQUNLX0RFUFRIXDAiCisgICAiR0xfREVCVUdfR1JPVVBfU1RBQ0tfREVQVEhcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0JJTkRJTkdcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX1JFTEFUSVZFX09GRlNFVFwwIgorICAgIkdMX1ZFUlRFWF9CSU5ESU5HX0RJVklTT1JcMCIKKyAgICJHTF9WRVJURVhfQklORElOR19PRkZTRVRcMCIKKyAgICJHTF9WRVJURVhfQklORElOR19TVFJJREVcMCIKKyAgICJHTF9NQVhfVkVSVEVYX0FUVFJJQl9SRUxBVElWRV9PRkZTRVRcMCIKKyAgICJHTF9NQVhfVkVSVEVYX0FUVFJJQl9CSU5ESU5HU1wwIgorICAgIkdMX1RFWFRVUkVfSU1NVVRBQkxFX0xFVkVMU1wwIgorICAgIkdMX0JVRkZFUlwwIgorICAgIkdMX1NIQURFUlwwIgorICAgIkdMX1BST0dSQU1cMCIKKyAgICJHTF9RVUVSWVwwIgorICAgIkdMX1BST0dSQU1fUElQRUxJTkVcMCIKKyAgICJHTF9TQU1QTEVSXDAiCisgICAiR0xfRElTUExBWV9MSVNUXDAiCisgICAiR0xfTUFYX0xBQkVMX0xFTkdUSFwwIgorICAgIkdMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWXDAiCisgICAiR0xfVU5TSUdORURfU0hPUlRfNV82XzVcMCIKKyAgICJHTF9VTlNJR05FRF9TSE9SVF81XzZfNV9SRVZcMCIKKyAgICJHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVlwwIgorICAgIkdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWXDAiCisgICAiR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWXDAiCisgICAiR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWXDAiCisgICAiR0xfVEVYVFVSRV9NQVhfQ0xBTVBfU19TR0lYXDAiCisgICAiR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYXDAiCisgICAiR0xfVEVYVFVSRV9NQVhfQ0xBTVBfUl9TR0lYXDAiCisgICAiR0xfTUlSUk9SRURfUkVQRUFUXDAiCisgICAiR0xfUkdCX1MzVENcMCIKKyAgICJHTF9SR0I0X1MzVENcMCIKKyAgICJHTF9SR0JBX1MzVENcMCIKKyAgICJHTF9SR0JBNF9TM1RDXDAiCisgICAiR0xfUkdCQV9EWFQ1X1MzVENcMCIKKyAgICJHTF9SR0JBNF9EWFQ1X1MzVENcMCIKKyAgICJHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUXDAiCisgICAiR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFRcMCIKKyAgICJHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0FOR0xFXDAiCisgICAiR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9BTkdMRVwwIgorICAgIkdMX1BFUkZRVUVSWV9ET05PVF9GTFVTSF9JTlRFTFwwIgorICAgIkdMX1BFUkZRVUVSWV9GTFVTSF9JTlRFTFwwIgorICAgIkdMX1BFUkZRVUVSWV9XQUlUX0lOVEVMXDAiCisgICAiR0xfTkVBUkVTVF9DTElQTUFQX05FQVJFU1RfU0dJWFwwIgorICAgIkdMX05FQVJFU1RfQ0xJUE1BUF9MSU5FQVJfU0dJWFwwIgorICAgIkdMX0xJTkVBUl9DTElQTUFQX05FQVJFU1RfU0dJWFwwIgorICAgIkdMX0ZPR19DT09SRElOQVRFX1NPVVJDRVwwIgorICAgIkdMX0ZPR19DT09SRFwwIgorICAgIkdMX0ZSQUdNRU5UX0RFUFRIXDAiCisgICAiR0xfQ1VSUkVOVF9GT0dfQ09PUkRcMCIKKyAgICJHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFXDAiCisgICAiR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFXDAiCisgICAiR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfUE9JTlRFUlwwIgorICAgIkdMX0ZPR19DT09SRElOQVRFX0FSUkFZXDAiCisgICAiR0xfQ09MT1JfU1VNXDAiCisgICAiR0xfQ1VSUkVOVF9TRUNPTkRBUllfQ09MT1JcMCIKKyAgICJHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRVwwIgorICAgIkdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFXDAiCisgICAiR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NUUklERVwwIgorICAgIkdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9QT0lOVEVSXDAiCisgICAiR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZXDAiCisgICAiR0xfQ1VSUkVOVF9SQVNURVJfU0VDT05EQVJZX0NPTE9SXDAiCisgICAiR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFXDAiCisgICAiR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFXDAiCisgICAiR0xfVEVYVFVSRTBcMCIKKyAgICJHTF9URVhUVVJFMVwwIgorICAgIkdMX1RFWFRVUkUyXDAiCisgICAiR0xfVEVYVFVSRTNcMCIKKyAgICJHTF9URVhUVVJFNFwwIgorICAgIkdMX1RFWFRVUkU1XDAiCisgICAiR0xfVEVYVFVSRTZcMCIKKyAgICJHTF9URVhUVVJFN1wwIgorICAgIkdMX1RFWFRVUkU4XDAiCisgICAiR0xfVEVYVFVSRTlcMCIKKyAgICJHTF9URVhUVVJFMTBcMCIKKyAgICJHTF9URVhUVVJFMTFcMCIKKyAgICJHTF9URVhUVVJFMTJcMCIKKyAgICJHTF9URVhUVVJFMTNcMCIKKyAgICJHTF9URVhUVVJFMTRcMCIKKyAgICJHTF9URVhUVVJFMTVcMCIKKyAgICJHTF9URVhUVVJFMTZcMCIKKyAgICJHTF9URVhUVVJFMTdcMCIKKyAgICJHTF9URVhUVVJFMThcMCIKKyAgICJHTF9URVhUVVJFMTlcMCIKKyAgICJHTF9URVhUVVJFMjBcMCIKKyAgICJHTF9URVhUVVJFMjFcMCIKKyAgICJHTF9URVhUVVJFMjJcMCIKKyAgICJHTF9URVhUVVJFMjNcMCIKKyAgICJHTF9URVhUVVJFMjRcMCIKKyAgICJHTF9URVhUVVJFMjVcMCIKKyAgICJHTF9URVhUVVJFMjZcMCIKKyAgICJHTF9URVhUVVJFMjdcMCIKKyAgICJHTF9URVhUVVJFMjhcMCIKKyAgICJHTF9URVhUVVJFMjlcMCIKKyAgICJHTF9URVhUVVJFMzBcMCIKKyAgICJHTF9URVhUVVJFMzFcMCIKKyAgICJHTF9BQ1RJVkVfVEVYVFVSRVwwIgorICAgIkdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRVwwIgorICAgIkdMX01BWF9URVhUVVJFX1VOSVRTXDAiCisgICAiR0xfVFJBTlNQT1NFX01PREVMVklFV19NQVRSSVhcMCIKKyAgICJHTF9UUkFOU1BPU0VfUFJPSkVDVElPTl9NQVRSSVhcMCIKKyAgICJHTF9UUkFOU1BPU0VfVEVYVFVSRV9NQVRSSVhcMCIKKyAgICJHTF9UUkFOU1BPU0VfQ09MT1JfTUFUUklYXDAiCisgICAiR0xfU1VCVFJBQ1RcMCIKKyAgICJHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVcMCIKKyAgICJHTF9DT01QUkVTU0VEX0FMUEhBXDAiCisgICAiR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VcMCIKKyAgICJHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQVwwIgorICAgIkdMX0NPTVBSRVNTRURfSU5URU5TSVRZXDAiCisgICAiR0xfQ09NUFJFU1NFRF9SR0JcMCIKKyAgICJHTF9DT01QUkVTU0VEX1JHQkFcMCIKKyAgICJHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlRcMCIKKyAgICJHTF9URVhUVVJFX1JFQ1RBTkdMRVwwIgorICAgIkdMX1RFWFRVUkVfQklORElOR19SRUNUQU5HTEVcMCIKKyAgICJHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRVwwIgorICAgIkdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFXDAiCisgICAiR0xfREVQVEhfU1RFTkNJTFwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF8yNF84XDAiCisgICAiR0xfTUFYX1RFWFRVUkVfTE9EX0JJQVNcMCIKKyAgICJHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVFwwIgorICAgIkdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVFwwIgorICAgIkdMX1RFWFRVUkVfRklMVEVSX0NPTlRST0xcMCIKKyAgICJHTF9URVhUVVJFX0xPRF9CSUFTXDAiCisgICAiR0xfQ09NQklORTRfTlZcMCIKKyAgICJHTF9NQVhfU0hJTklORVNTX05WXDAiCisgICAiR0xfTUFYX1NQT1RfRVhQT05FTlRfTlZcMCIKKyAgICJHTF9JTkNSX1dSQVBcMCIKKyAgICJHTF9ERUNSX1dSQVBcMCIKKyAgICJHTF9NT0RFTFZJRVcxX0FSQlwwIgorICAgIkdMX05PUk1BTF9NQVBcMCIKKyAgICJHTF9SRUZMRUNUSU9OX01BUFwwIgorICAgIkdMX1RFWFRVUkVfQ1VCRV9NQVBcMCIKKyAgICJHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBcMCIKKyAgICJHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hcMCIKKyAgICJHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hcMCIKKyAgICJHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lcMCIKKyAgICJHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lcMCIKKyAgICJHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pcMCIKKyAgICJHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pcMCIKKyAgICJHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQXDAiCisgICAiR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRVwwIgorICAgIkdMX01VTFRJU0FNUExFX0ZJTFRFUl9ISU5UX05WXDAiCisgICAiR0xfUFJJTUlUSVZFX1JFU1RBUlRfTlZcMCIKKyAgICJHTF9QUklNSVRJVkVfUkVTVEFSVF9JTkRFWF9OVlwwIgorICAgIkdMX0ZPR19ESVNUQU5DRV9NT0RFX05WXDAiCisgICAiR0xfRVlFX1JBRElBTF9OVlwwIgorICAgIkdMX0VZRV9QTEFORV9BQlNPTFVURV9OVlwwIgorICAgIkdMX0NPTUJJTkVcMCIKKyAgICJHTF9DT01CSU5FX1JHQlwwIgorICAgIkdMX0NPTUJJTkVfQUxQSEFcMCIKKyAgICJHTF9SR0JfU0NBTEVcMCIKKyAgICJHTF9BRERfU0lHTkVEXDAiCisgICAiR0xfSU5URVJQT0xBVEVcMCIKKyAgICJHTF9DT05TVEFOVFwwIgorICAgIkdMX1BSSU1BUllfQ09MT1JcMCIKKyAgICJHTF9QUkVWSU9VU1wwIgorICAgIkdMX1NPVVJDRTBfUkdCXDAiCisgICAiR0xfU09VUkNFMV9SR0JcMCIKKyAgICJHTF9TT1VSQ0UyX1JHQlwwIgorICAgIkdMX1NPVVJDRTNfUkdCX05WXDAiCisgICAiR0xfU09VUkNFMF9BTFBIQVwwIgorICAgIkdMX1NPVVJDRTFfQUxQSEFcMCIKKyAgICJHTF9TT1VSQ0UyX0FMUEhBXDAiCisgICAiR0xfU09VUkNFM19BTFBIQV9OVlwwIgorICAgIkdMX09QRVJBTkQwX1JHQlwwIgorICAgIkdMX09QRVJBTkQxX1JHQlwwIgorICAgIkdMX09QRVJBTkQyX1JHQlwwIgorICAgIkdMX09QRVJBTkQzX1JHQl9OVlwwIgorICAgIkdMX09QRVJBTkQwX0FMUEhBXDAiCisgICAiR0xfT1BFUkFORDFfQUxQSEFcMCIKKyAgICJHTF9PUEVSQU5EMl9BTFBIQVwwIgorICAgIkdMX09QRVJBTkQzX0FMUEhBX05WXDAiCisgICAiR0xfQlVGRkVSX09CSkVDVF9BUFBMRVwwIgorICAgIkdMX1ZFUlRFWF9BUlJBWV9CSU5ESU5HXDAiCisgICAiR0xfVEVYVFVSRV9SQU5HRV9MRU5HVEhfQVBQTEVcMCIKKyAgICJHTF9URVhUVVJFX1JBTkdFX1BPSU5URVJfQVBQTEVcMCIKKyAgICJHTF9ZQ0JDUl80MjJfQVBQTEVcMCIKKyAgICJHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEVcMCIKKyAgICJHTF9VTlNJR05FRF9TSE9SVF84XzhfUkVWX0FQUExFXDAiCisgICAiR0xfVEVYVFVSRV9TVE9SQUdFX0hJTlRfQVBQTEVcMCIKKyAgICJHTF9TVE9SQUdFX1BSSVZBVEVfQVBQTEVcMCIKKyAgICJHTF9TVE9SQUdFX0NBQ0hFRF9BUFBMRVwwIgorICAgIkdMX1NUT1JBR0VfU0hBUkVEX0FQUExFXDAiCisgICAiR0xfU0xJQ0VfQUNDVU1fU1VOXDAiCisgICAiR0xfUVVBRF9NRVNIX1NVTlwwIgorICAgIkdMX1RSSUFOR0xFX01FU0hfU1VOXDAiCisgICAiR0xfVkVSVEVYX1BST0dSQU1fQVJCXDAiCisgICAiR0xfVkVSVEVYX1NUQVRFX1BST0dSQU1fTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRURcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkVcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERVwwIgorICAgIkdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRVwwIgorICAgIkdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQlwwIgorICAgIkdMX1BST0dSQU1fTEVOR1RIX0FSQlwwIgorICAgIkdMX1BST0dSQU1fU1RSSU5HX0FSQlwwIgorICAgIkdMX01PREVMVklFV19QUk9KRUNUSU9OX05WXDAiCisgICAiR0xfSURFTlRJVFlfTlZcMCIKKyAgICJHTF9JTlZFUlNFX05WXDAiCisgICAiR0xfVFJBTlNQT1NFX05WXDAiCisgICAiR0xfSU5WRVJTRV9UUkFOU1BPU0VfTlZcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9NQVRSSVhfU1RBQ0tfREVQVEhfQVJCXDAiCisgICAiR0xfTUFYX1BST0dSQU1fTUFUUklDRVNfQVJCXDAiCisgICAiR0xfTUFUUklYMF9OVlwwIgorICAgIkdMX01BVFJJWDFfTlZcMCIKKyAgICJHTF9NQVRSSVgyX05WXDAiCisgICAiR0xfTUFUUklYM19OVlwwIgorICAgIkdMX01BVFJJWDRfTlZcMCIKKyAgICJHTF9NQVRSSVg1X05WXDAiCisgICAiR0xfTUFUUklYNl9OVlwwIgorICAgIkdMX01BVFJJWDdfTlZcMCIKKyAgICJHTF9DVVJSRU5UX01BVFJJWF9TVEFDS19ERVBUSF9BUkJcMCIKKyAgICJHTF9DVVJSRU5UX01BVFJJWF9BUkJcMCIKKyAgICJHTF9QUk9HUkFNX1BPSU5UX1NJWkVcMCIKKyAgICJHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERVwwIgorICAgIkdMX1BST0dSQU1fUEFSQU1FVEVSX05WXDAiCisgICAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSXDAiCisgICAiR0xfUFJPR1JBTV9UQVJHRVRfTlZcMCIKKyAgICJHTF9QUk9HUkFNX1JFU0lERU5UX05WXDAiCisgICAiR0xfVFJBQ0tfTUFUUklYX05WXDAiCisgICAiR0xfVFJBQ0tfTUFUUklYX1RSQU5TRk9STV9OVlwwIgorICAgIkdMX1ZFUlRFWF9QUk9HUkFNX0JJTkRJTkdfTlZcMCIKKyAgICJHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX0FSQlwwIgorICAgIkdMX0RFUFRIX0NMQU1QXDAiCisgICAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTBfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZMV9OVlwwIgorICAgIkdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkyX05WXDAiCisgICAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTNfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZNF9OVlwwIgorICAgIkdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk1X05WXDAiCisgICAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTZfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZN19OVlwwIgorICAgIkdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk4X05WXDAiCisgICAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTlfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZMTBfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZMTFfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZMTJfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZMTNfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZMTRfTlZcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZMTVfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUIwXzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxXzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUIyXzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUIzXzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUI0XzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUI1XzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUI2XzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUI3XzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUI4XzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUI5XzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMF80X05WXDAiCisgICAiR0xfTUFQMV9WRVJURVhfQVRUUklCMTFfNF9OVlwwIgorICAgIkdMX01BUDFfVkVSVEVYX0FUVFJJQjEyXzRfTlZcMCIKKyAgICJHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxM180X05WXDAiCisgICAiR0xfTUFQMV9WRVJURVhfQVRUUklCMTRfNF9OVlwwIgorICAgIkdMX01BUDFfVkVSVEVYX0FUVFJJQjE1XzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUIwXzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxXzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUIyXzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUIzXzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUI0XzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUI1XzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUI2XzRfTlZcMCIKKyAgICJHTF9QUk9HUkFNX0JJTkRJTkdfQVJCXDAiCisgICAiR0xfTUFQMl9WRVJURVhfQVRUUklCOF80X05WXDAiCisgICAiR0xfTUFQMl9WRVJURVhfQVRUUklCOV80X05WXDAiCisgICAiR0xfTUFQMl9WRVJURVhfQVRUUklCMTBfNF9OVlwwIgorICAgIkdMX01BUDJfVkVSVEVYX0FUVFJJQjExXzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMl80X05WXDAiCisgICAiR0xfTUFQMl9WRVJURVhfQVRUUklCMTNfNF9OVlwwIgorICAgIkdMX01BUDJfVkVSVEVYX0FUVFJJQjE0XzRfTlZcMCIKKyAgICJHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNV80X05WXDAiCisgICAiR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkVcMCIKKyAgICJHTF9URVhUVVJFX0NPTVBSRVNTRURcMCIKKyAgICJHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNcMCIKKyAgICJHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU1wwIgorICAgIkdMX01BWF9WRVJURVhfVU5JVFNfQVJCXDAiCisgICAiR0xfQUNUSVZFX1ZFUlRFWF9VTklUU19BUkJcMCIKKyAgICJHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQlwwIgorICAgIkdMX1ZFUlRFWF9CTEVORF9BUkJcMCIKKyAgICJHTF9DVVJSRU5UX1dFSUdIVF9BUkJcMCIKKyAgICJHTF9XRUlHSFRfQVJSQVlfVFlQRV9BUkJcMCIKKyAgICJHTF9XRUlHSFRfQVJSQVlfU1RSSURFX0FSQlwwIgorICAgIkdMX1dFSUdIVF9BUlJBWV9TSVpFX0FSQlwwIgorICAgIkdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX0FSQlwwIgorICAgIkdMX1dFSUdIVF9BUlJBWV9BUkJcMCIKKyAgICJHTF9ET1QzX1JHQlwwIgorICAgIkdMX0RPVDNfUkdCQVwwIgorICAgIkdMX0NPTVBSRVNTRURfUkdCX0ZYVDFfM0RGWFwwIgorICAgIkdMX0NPTVBSRVNTRURfUkdCQV9GWFQxXzNERlhcMCIKKyAgICJHTF9NVUxUSVNBTVBMRV8zREZYXDAiCisgICAiR0xfU0FNUExFX0JVRkZFUlNfM0RGWFwwIgorICAgIkdMX1NBTVBMRVNfM0RGWFwwIgorICAgIkdMX1NVUkZBQ0VfU1RBVEVfTlZcMCIKKyAgICJHTF9TVVJGQUNFX1JFR0lTVEVSRURfTlZcMCIKKyAgICJHTF9TVVJGQUNFX01BUFBFRF9OVlwwIgorICAgIkdMX01PREVMVklFVzJfQVJCXDAiCisgICAiR0xfTU9ERUxWSUVXM19BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVc0X0FSQlwwIgorICAgIkdMX01PREVMVklFVzVfQVJCXDAiCisgICAiR0xfTU9ERUxWSUVXNl9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVc3X0FSQlwwIgorICAgIkdMX01PREVMVklFVzhfQVJCXDAiCisgICAiR0xfTU9ERUxWSUVXOV9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxMF9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxMV9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxMl9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxM19BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxNF9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxNV9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxNl9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxN19BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxOF9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcxOV9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyMF9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyMV9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyMl9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyM19BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyNF9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyNV9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyNl9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyN19BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyOF9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVcyOV9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVczMF9BUkJcMCIKKyAgICJHTF9NT0RFTFZJRVczMV9BUkJcMCIKKyAgICJHTF9ET1QzX1JHQl9FWFRcMCIKKyAgICJHTF9QUk9HUkFNX0JJTkFSWV9MRU5HVEhcMCIKKyAgICJHTF9NSVJST1JfQ0xBTVBfRVhUXDAiCisgICAiR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfRVhUXDAiCisgICAiR0xfTU9EVUxBVEVfQUREX0FUSVwwIgorICAgIkdMX01PRFVMQVRFX1NJR05FRF9BRERfQVRJXDAiCisgICAiR0xfTU9EVUxBVEVfU1VCVFJBQ1RfQVRJXDAiCisgICAiR0xfWUNCQ1JfTUVTQVwwIgorICAgIkdMX1BBQ0tfSU5WRVJUX01FU0FcMCIKKyAgICJHTF9CVUZGRVJfU0laRVwwIgorICAgIkdMX0JVRkZFUl9VU0FHRVwwIgorICAgIkdMX0JVTVBfUk9UX01BVFJJWF9BVElcMCIKKyAgICJHTF9CVU1QX1JPVF9NQVRSSVhfU0laRV9BVElcMCIKKyAgICJHTF9CVU1QX05VTV9URVhfVU5JVFNfQVRJXDAiCisgICAiR0xfQlVNUF9URVhfVU5JVFNfQVRJXDAiCisgICAiR0xfRFVEVl9BVElcMCIKKyAgICJHTF9EVThEVjhfQVRJXDAiCisgICAiR0xfQlVNUF9FTlZNQVBfQVRJXDAiCisgICAiR0xfQlVNUF9UQVJHRVRfQVRJXDAiCisgICAiR0xfTlVNX1BST0dSQU1fQklOQVJZX0ZPUk1BVFNcMCIKKyAgICJHTF9QUk9HUkFNX0JJTkFSWV9GT1JNQVRTXDAiCisgICAiR0xfU1RFTkNJTF9CQUNLX0ZVTkNcMCIKKyAgICJHTF9TVEVOQ0lMX0JBQ0tfRkFJTFwwIgorICAgIkdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUxcMCIKKyAgICJHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTXDAiCisgICAiR0xfRlJBR01FTlRfUFJPR1JBTV9BUkJcMCIKKyAgICJHTF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCXDAiCisgICAiR0xfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQlwwIgorICAgIkdMX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkJcMCIKKyAgICJHTF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQlwwIgorICAgIkdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTlNUUlVDVElPTlNfQVJCXDAiCisgICAiR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9BTFVfSU5TVFJVQ1RJT05TX0FSQlwwIgorICAgIkdMX01BWF9QUk9HUkFNX1RFWF9JTlNUUlVDVElPTlNfQVJCXDAiCisgICAiR0xfTUFYX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkJcMCIKKyAgICJHTF9SR0JBMzJGXDAiCisgICAiR0xfUkdCMzJGXDAiCisgICAiR0xfQUxQSEEzMkZfQVJCXDAiCisgICAiR0xfSU5URU5TSVRZMzJGX0FSQlwwIgorICAgIkdMX0xVTUlOQU5DRTMyRl9BUkJcMCIKKyAgICJHTF9MVU1JTkFOQ0VfQUxQSEEzMkZfQVJCXDAiCisgICAiR0xfUkdCQTE2RlwwIgorICAgIkdMX1JHQjE2RlwwIgorICAgIkdMX0FMUEhBMTZGX0FSQlwwIgorICAgIkdMX0lOVEVOU0lUWTE2Rl9BUkJcMCIKKyAgICJHTF9MVU1JTkFOQ0UxNkZfQVJCXDAiCisgICAiR0xfTFVNSU5BTkNFX0FMUEhBMTZGX0FSQlwwIgorICAgIkdMX1JHQkFfRkxPQVRfTU9ERV9BUkJcMCIKKyAgICJHTF9NQVhfRFJBV19CVUZGRVJTXDAiCisgICAiR0xfRFJBV19CVUZGRVIwXDAiCisgICAiR0xfRFJBV19CVUZGRVIxXDAiCisgICAiR0xfRFJBV19CVUZGRVIyXDAiCisgICAiR0xfRFJBV19CVUZGRVIzXDAiCisgICAiR0xfRFJBV19CVUZGRVI0XDAiCisgICAiR0xfRFJBV19CVUZGRVI1XDAiCisgICAiR0xfRFJBV19CVUZGRVI2XDAiCisgICAiR0xfRFJBV19CVUZGRVI3XDAiCisgICAiR0xfRFJBV19CVUZGRVI4XDAiCisgICAiR0xfRFJBV19CVUZGRVI5XDAiCisgICAiR0xfRFJBV19CVUZGRVIxMFwwIgorICAgIkdMX0RSQVdfQlVGRkVSMTFcMCIKKyAgICJHTF9EUkFXX0JVRkZFUjEyXDAiCisgICAiR0xfRFJBV19CVUZGRVIxM1wwIgorICAgIkdMX0RSQVdfQlVGRkVSMTRcMCIKKyAgICJHTF9EUkFXX0JVRkZFUjE1XDAiCisgICAiR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFcMCIKKyAgICJHTF9NQVRSSVhfUEFMRVRURV9BUkJcMCIKKyAgICJHTF9NQVhfTUFUUklYX1BBTEVUVEVfU1RBQ0tfREVQVEhfQVJCXDAiCisgICAiR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfQVJCXDAiCisgICAiR0xfQ1VSUkVOVF9QQUxFVFRFX01BVFJJWF9BUkJcMCIKKyAgICJHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQVJCXDAiCisgICAiR0xfQ1VSUkVOVF9NQVRSSVhfSU5ERVhfQVJCXDAiCisgICAiR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfQVJCXDAiCisgICAiR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfQVJCXDAiCisgICAiR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9BUkJcMCIKKyAgICJHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9BUkJcMCIKKyAgICJHTF9URVhUVVJFX0RFUFRIX1NJWkVcMCIKKyAgICJHTF9ERVBUSF9URVhUVVJFX01PREVcMCIKKyAgICJHTF9URVhUVVJFX0NPTVBBUkVfTU9ERVwwIgorICAgIkdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DXDAiCisgICAiR0xfQ09NUEFSRV9SRUZfVE9fVEVYVFVSRVwwIgorICAgIkdMX1RFWFRVUkVfQ1VCRV9NQVBfU0VBTUxFU1NcMCIKKyAgICJHTF9QT0lOVF9TUFJJVEVcMCIKKyAgICJHTF9DT09SRF9SRVBMQUNFXDAiCisgICAiR0xfUE9JTlRfU1BSSVRFX1JfTU9ERV9OVlwwIgorICAgIkdMX1FVRVJZX0NPVU5URVJfQklUU1wwIgorICAgIkdMX0NVUlJFTlRfUVVFUllcMCIKKyAgICJHTF9RVUVSWV9SRVNVTFRcMCIKKyAgICJHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFXDAiCisgICAiR0xfTUFYX0ZSQUdNRU5UX1BST0dSQU1fTE9DQUxfUEFSQU1FVEVSU19OVlwwIgorICAgIkdMX01BWF9WRVJURVhfQVRUUklCU1wwIgorICAgIkdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRFwwIgorICAgIkdMX0RFUFRIX1NURU5DSUxfVE9fUkdCQV9OVlwwIgorICAgIkdMX0RFUFRIX1NURU5DSUxfVE9fQkdSQV9OVlwwIgorICAgIkdMX0ZSQUdNRU5UX1BST0dSQU1fTlZcMCIKKyAgICJHTF9NQVhfVEVYVFVSRV9DT09SRFNcMCIKKyAgICJHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUU1wwIgorICAgIkdMX0ZSQUdNRU5UX1BST0dSQU1fQklORElOR19OVlwwIgorICAgIkdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQlwwIgorICAgIkdMX1BST0dSQU1fRk9STUFUX0FTQ0lJX0FSQlwwIgorICAgIkdMX1BST0dSQU1fRk9STUFUX0FSQlwwIgorICAgIkdMX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OU1wwIgorICAgIkdMX1RFWFRVUkVfVU5TSUdORURfUkVNQVBfTU9ERV9OVlwwIgorICAgIkdMX0RFUFRIX0JPVU5EU19URVNUX0VYVFwwIgorICAgIkdMX0RFUFRIX0JPVU5EU19FWFRcMCIKKyAgICJHTF9BUlJBWV9CVUZGRVJcMCIKKyAgICJHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUlwwIgorICAgIkdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HXDAiCisgICAiR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElOR1wwIgorICAgIkdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElOR1wwIgorICAgIkdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElOR1wwIgorICAgIkdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HXDAiCisgICAiR0xfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HXDAiCisgICAiR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HXDAiCisgICAiR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HXDAiCisgICAiR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HXDAiCisgICAiR0xfUFJPR1JBTV9JTlNUUlVDVElPTlNfQVJCXDAiCisgICAiR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQlwwIgorICAgIkdMX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQlwwIgorICAgIkdMX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCXDAiCisgICAiR0xfTUFYX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCXDAiCisgICAiR0xfUFJPR1JBTV9OQVRJVkVfVEVNUE9SQVJJRVNfQVJCXDAiCisgICAiR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQlwwIgorICAgIkdMX1BST0dSQU1fUEFSQU1FVEVSU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9QQVJBTUVURVJTX0FSQlwwIgorICAgIkdMX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCXDAiCisgICAiR0xfTUFYX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCXDAiCisgICAiR0xfUFJPR1JBTV9BVFRSSUJTX0FSQlwwIgorICAgIkdMX01BWF9QUk9HUkFNX0FUVFJJQlNfQVJCXDAiCisgICAiR0xfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkJcMCIKKyAgICJHTF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQlwwIgorICAgIkdMX01BWF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQlwwIgorICAgIkdMX1BST0dSQU1fTkFUSVZFX0FERFJFU1NfUkVHSVNURVJTX0FSQlwwIgorICAgIkdMX01BWF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkJcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9MT0NBTF9QQVJBTUVURVJTX0FSQlwwIgorICAgIkdMX01BWF9QUk9HUkFNX0VOVl9QQVJBTUVURVJTX0FSQlwwIgorICAgIkdMX1BST0dSQU1fVU5ERVJfTkFUSVZFX0xJTUlUU19BUkJcMCIKKyAgICJHTF9UUkFOU1BPU0VfQ1VSUkVOVF9NQVRSSVhfQVJCXDAiCisgICAiR0xfUkVBRF9PTkxZXDAiCisgICAiR0xfV1JJVEVfT05MWVwwIgorICAgIkdMX1JFQURfV1JJVEVcMCIKKyAgICJHTF9CVUZGRVJfQUNDRVNTXDAiCisgICAiR0xfQlVGRkVSX01BUFBFRFwwIgorICAgIkdMX0JVRkZFUl9NQVBfUE9JTlRFUlwwIgorICAgIkdMX1dSSVRFX0RJU0NBUkRfTlZcMCIKKyAgICJHTF9USU1FX0VMQVBTRURcMCIKKyAgICJHTF9NQVRSSVgwX0FSQlwwIgorICAgIkdMX01BVFJJWDFfQVJCXDAiCisgICAiR0xfTUFUUklYMl9BUkJcMCIKKyAgICJHTF9NQVRSSVgzX0FSQlwwIgorICAgIkdMX01BVFJJWDRfQVJCXDAiCisgICAiR0xfTUFUUklYNV9BUkJcMCIKKyAgICJHTF9NQVRSSVg2X0FSQlwwIgorICAgIkdMX01BVFJJWDdfQVJCXDAiCisgICAiR0xfTUFUUklYOF9BUkJcMCIKKyAgICJHTF9NQVRSSVg5X0FSQlwwIgorICAgIkdMX01BVFJJWDEwX0FSQlwwIgorICAgIkdMX01BVFJJWDExX0FSQlwwIgorICAgIkdMX01BVFJJWDEyX0FSQlwwIgorICAgIkdMX01BVFJJWDEzX0FSQlwwIgorICAgIkdMX01BVFJJWDE0X0FSQlwwIgorICAgIkdMX01BVFJJWDE1X0FSQlwwIgorICAgIkdMX01BVFJJWDE2X0FSQlwwIgorICAgIkdMX01BVFJJWDE3X0FSQlwwIgorICAgIkdMX01BVFJJWDE4X0FSQlwwIgorICAgIkdMX01BVFJJWDE5X0FSQlwwIgorICAgIkdMX01BVFJJWDIwX0FSQlwwIgorICAgIkdMX01BVFJJWDIxX0FSQlwwIgorICAgIkdMX01BVFJJWDIyX0FSQlwwIgorICAgIkdMX01BVFJJWDIzX0FSQlwwIgorICAgIkdMX01BVFJJWDI0X0FSQlwwIgorICAgIkdMX01BVFJJWDI1X0FSQlwwIgorICAgIkdMX01BVFJJWDI2X0FSQlwwIgorICAgIkdMX01BVFJJWDI3X0FSQlwwIgorICAgIkdMX01BVFJJWDI4X0FSQlwwIgorICAgIkdMX01BVFJJWDI5X0FSQlwwIgorICAgIkdMX01BVFJJWDMwX0FSQlwwIgorICAgIkdMX01BVFJJWDMxX0FSQlwwIgorICAgIkdMX1NUUkVBTV9EUkFXXDAiCisgICAiR0xfU1RSRUFNX1JFQURcMCIKKyAgICJHTF9TVFJFQU1fQ09QWVwwIgorICAgIkdMX1NUQVRJQ19EUkFXXDAiCisgICAiR0xfU1RBVElDX1JFQURcMCIKKyAgICJHTF9TVEFUSUNfQ09QWVwwIgorICAgIkdMX0RZTkFNSUNfRFJBV1wwIgorICAgIkdMX0RZTkFNSUNfUkVBRFwwIgorICAgIkdMX0RZTkFNSUNfQ09QWVwwIgorICAgIkdMX1BJWEVMX1BBQ0tfQlVGRkVSXDAiCisgICAiR0xfUElYRUxfVU5QQUNLX0JVRkZFUlwwIgorICAgIkdMX1BJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9ERVBUSDI0X1NURU5DSUw4XDAiCisgICAiR0xfVEVYVFVSRV9TVEVOQ0lMX1NJWkVcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OVlwwIgorICAgIkdMX01BWF9QUk9HUkFNX0NBTExfREVQVEhfTlZcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9JRl9ERVBUSF9OVlwwIgorICAgIkdMX01BWF9QUk9HUkFNX0xPT1BfREVQVEhfTlZcMCIKKyAgICJHTF9NQVhfUFJPR1JBTV9MT09QX0NPVU5UX05WXDAiCisgICAiR0xfU1JDMV9DT0xPUlwwIgorICAgIkdMX09ORV9NSU5VU19TUkMxX0NPTE9SXDAiCisgICAiR0xfT05FX01JTlVTX1NSQzFfQUxQSEFcMCIKKyAgICJHTF9NQVhfRFVBTF9TT1VSQ0VfRFJBV19CVUZGRVJTXDAiCisgICAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9JTlRFR0VSXDAiCisgICAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SX0FSQlwwIgorICAgIkdMX01BWF9BUlJBWV9URVhUVVJFX0xBWUVSU1wwIgorICAgIkdMX01JTl9QUk9HUkFNX1RFWEVMX09GRlNFVFwwIgorICAgIkdMX01BWF9QUk9HUkFNX1RFWEVMX09GRlNFVFwwIgorICAgIkdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFRcMCIKKyAgICJHTF9BQ1RJVkVfU1RFTkNJTF9GQUNFX0VYVFwwIgorICAgIkdMX01JUlJPUl9DTEFNUF9UT19CT1JERVJfRVhUXDAiCisgICAiR0xfU0FNUExFU19QQVNTRURcMCIKKyAgICJHTF9HRU9NRVRSWV9WRVJUSUNFU19PVVRcMCIKKyAgICJHTF9HRU9NRVRSWV9JTlBVVF9UWVBFXDAiCisgICAiR0xfR0VPTUVUUllfT1VUUFVUX1RZUEVcMCIKKyAgICJHTF9TQU1QTEVSX0JJTkRJTkdcMCIKKyAgICJHTF9DTEFNUF9WRVJURVhfQ09MT1JcMCIKKyAgICJHTF9DTEFNUF9GUkFHTUVOVF9DT0xPUlwwIgorICAgIkdMX0NMQU1QX1JFQURfQ09MT1JcMCIKKyAgICJHTF9GSVhFRF9PTkxZXDAiCisgICAiR0xfRlJBR01FTlRfU0hBREVSX0FUSVwwIgorICAgIkdMX1JFR18wX0FUSVwwIgorICAgIkdMX1JFR18xX0FUSVwwIgorICAgIkdMX1JFR18yX0FUSVwwIgorICAgIkdMX1JFR18zX0FUSVwwIgorICAgIkdMX1JFR180X0FUSVwwIgorICAgIkdMX1JFR181X0FUSVwwIgorICAgIkdMX1JFR182X0FUSVwwIgorICAgIkdMX1JFR183X0FUSVwwIgorICAgIkdMX1JFR184X0FUSVwwIgorICAgIkdMX1JFR185X0FUSVwwIgorICAgIkdMX1JFR18xMF9BVElcMCIKKyAgICJHTF9SRUdfMTFfQVRJXDAiCisgICAiR0xfUkVHXzEyX0FUSVwwIgorICAgIkdMX1JFR18xM19BVElcMCIKKyAgICJHTF9SRUdfMTRfQVRJXDAiCisgICAiR0xfUkVHXzE1X0FUSVwwIgorICAgIkdMX1JFR18xNl9BVElcMCIKKyAgICJHTF9SRUdfMTdfQVRJXDAiCisgICAiR0xfUkVHXzE4X0FUSVwwIgorICAgIkdMX1JFR18xOV9BVElcMCIKKyAgICJHTF9SRUdfMjBfQVRJXDAiCisgICAiR0xfUkVHXzIxX0FUSVwwIgorICAgIkdMX1JFR18yMl9BVElcMCIKKyAgICJHTF9SRUdfMjNfQVRJXDAiCisgICAiR0xfUkVHXzI0X0FUSVwwIgorICAgIkdMX1JFR18yNV9BVElcMCIKKyAgICJHTF9SRUdfMjZfQVRJXDAiCisgICAiR0xfUkVHXzI3X0FUSVwwIgorICAgIkdMX1JFR18yOF9BVElcMCIKKyAgICJHTF9SRUdfMjlfQVRJXDAiCisgICAiR0xfUkVHXzMwX0FUSVwwIgorICAgIkdMX1JFR18zMV9BVElcMCIKKyAgICJHTF9DT05fMF9BVElcMCIKKyAgICJHTF9DT05fMV9BVElcMCIKKyAgICJHTF9DT05fMl9BVElcMCIKKyAgICJHTF9DT05fM19BVElcMCIKKyAgICJHTF9DT05fNF9BVElcMCIKKyAgICJHTF9DT05fNV9BVElcMCIKKyAgICJHTF9DT05fNl9BVElcMCIKKyAgICJHTF9DT05fN19BVElcMCIKKyAgICJHTF9DT05fOF9BVElcMCIKKyAgICJHTF9DT05fOV9BVElcMCIKKyAgICJHTF9DT05fMTBfQVRJXDAiCisgICAiR0xfQ09OXzExX0FUSVwwIgorICAgIkdMX0NPTl8xMl9BVElcMCIKKyAgICJHTF9DT05fMTNfQVRJXDAiCisgICAiR0xfQ09OXzE0X0FUSVwwIgorICAgIkdMX0NPTl8xNV9BVElcMCIKKyAgICJHTF9DT05fMTZfQVRJXDAiCisgICAiR0xfQ09OXzE3X0FUSVwwIgorICAgIkdMX0NPTl8xOF9BVElcMCIKKyAgICJHTF9DT05fMTlfQVRJXDAiCisgICAiR0xfQ09OXzIwX0FUSVwwIgorICAgIkdMX0NPTl8yMV9BVElcMCIKKyAgICJHTF9DT05fMjJfQVRJXDAiCisgICAiR0xfQ09OXzIzX0FUSVwwIgorICAgIkdMX0NPTl8yNF9BVElcMCIKKyAgICJHTF9DT05fMjVfQVRJXDAiCisgICAiR0xfQ09OXzI2X0FUSVwwIgorICAgIkdMX0NPTl8yN19BVElcMCIKKyAgICJHTF9DT05fMjhfQVRJXDAiCisgICAiR0xfQ09OXzI5X0FUSVwwIgorICAgIkdMX0NPTl8zMF9BVElcMCIKKyAgICJHTF9DT05fMzFfQVRJXDAiCisgICAiR0xfTU9WX0FUSVwwIgorICAgIkdMX0FERF9BVElcMCIKKyAgICJHTF9NVUxfQVRJXDAiCisgICAiR0xfU1VCX0FUSVwwIgorICAgIkdMX0RPVDNfQVRJXDAiCisgICAiR0xfRE9UNF9BVElcMCIKKyAgICJHTF9NQURfQVRJXDAiCisgICAiR0xfTEVSUF9BVElcMCIKKyAgICJHTF9DTkRfQVRJXDAiCisgICAiR0xfQ05EMF9BVElcMCIKKyAgICJHTF9ET1QyX0FERF9BVElcMCIKKyAgICJHTF9TRUNPTkRBUllfSU5URVJQT0xBVE9SX0FUSVwwIgorICAgIkdMX05VTV9GUkFHTUVOVF9SRUdJU1RFUlNfQVRJXDAiCisgICAiR0xfTlVNX0ZSQUdNRU5UX0NPTlNUQU5UU19BVElcMCIKKyAgICJHTF9OVU1fUEFTU0VTX0FUSVwwIgorICAgIkdMX05VTV9JTlNUUlVDVElPTlNfUEVSX1BBU1NfQVRJXDAiCisgICAiR0xfTlVNX0lOU1RSVUNUSU9OU19UT1RBTF9BVElcMCIKKyAgICJHTF9OVU1fSU5QVVRfSU5URVJQT0xBVE9SX0NPTVBPTkVOVFNfQVRJXDAiCisgICAiR0xfTlVNX0xPT1BCQUNLX0NPTVBPTkVOVFNfQVRJXDAiCisgICAiR0xfQ09MT1JfQUxQSEFfUEFJUklOR19BVElcMCIKKyAgICJHTF9TV0laWkxFX1NUUl9BVElcMCIKKyAgICJHTF9TV0laWkxFX1NUUV9BVElcMCIKKyAgICJHTF9TV0laWkxFX1NUUl9EUl9BVElcMCIKKyAgICJHTF9TV0laWkxFX1NUUV9EUV9BVElcMCIKKyAgICJHTF9TV0laWkxFX1NUUlFfQVRJXDAiCisgICAiR0xfU1dJWlpMRV9TVFJRX0RRX0FUSVwwIgorICAgIkdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVNcMCIKKyAgICJHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVNcMCIKKyAgICJHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTXDAiCisgICAiR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVNcMCIKKyAgICJHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVNcMCIKKyAgICJHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVNcMCIKKyAgICJHTF9VTklGT1JNX0JVRkZFUlwwIgorICAgIkdMX0JVRkZFUl9TRVJJQUxJWkVEX01PRElGWV9BUFBMRVwwIgorICAgIkdMX0JVRkZFUl9GTFVTSElOR19VTk1BUF9BUFBMRVwwIgorICAgIkdMX1JFTEVBU0VEX0FQUExFXDAiCisgICAiR0xfVk9MQVRJTEVfQVBQTEVcMCIKKyAgICJHTF9SRVRBSU5FRF9BUFBMRVwwIgorICAgIkdMX1VOREVGSU5FRF9BUFBMRVwwIgorICAgIkdMX1BVUkdFQUJMRV9BUFBMRVwwIgorICAgIkdMX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9VTklGT1JNX0JVRkZFUl9TVEFSVFwwIgorICAgIkdMX1VOSUZPUk1fQlVGRkVSX1NJWkVcMCIKKyAgICJHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTXDAiCisgICAiR0xfTUFYX0dFT01FVFJZX1VOSUZPUk1fQkxPQ0tTXDAiCisgICAiR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTXDAiCisgICAiR0xfTUFYX0NPTUJJTkVEX1VOSUZPUk1fQkxPQ0tTXDAiCisgICAiR0xfTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTXDAiCisgICAiR0xfTUFYX1VOSUZPUk1fQkxPQ0tfU0laRVwwIgorICAgIkdMX01BWF9DT01CSU5FRF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTXDAiCisgICAiR0xfTUFYX0NPTUJJTkVEX0dFT01FVFJZX1VOSUZPUk1fQ09NUE9ORU5UU1wwIgorICAgIkdMX01BWF9DT01CSU5FRF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFNcMCIKKyAgICJHTF9VTklGT1JNX0JVRkZFUl9PRkZTRVRfQUxJR05NRU5UXDAiCisgICAiR0xfQUNUSVZFX1VOSUZPUk1fQkxPQ0tfTUFYX05BTUVfTEVOR1RIXDAiCisgICAiR0xfQUNUSVZFX1VOSUZPUk1fQkxPQ0tTXDAiCisgICAiR0xfVU5JRk9STV9UWVBFXDAiCisgICAiR0xfVU5JRk9STV9TSVpFXDAiCisgICAiR0xfVU5JRk9STV9OQU1FX0xFTkdUSFwwIgorICAgIkdMX1VOSUZPUk1fQkxPQ0tfSU5ERVhcMCIKKyAgICJHTF9VTklGT1JNX09GRlNFVFwwIgorICAgIkdMX1VOSUZPUk1fQVJSQVlfU1RSSURFXDAiCisgICAiR0xfVU5JRk9STV9NQVRSSVhfU1RSSURFXDAiCisgICAiR0xfVU5JRk9STV9JU19ST1dfTUFKT1JcMCIKKyAgICJHTF9VTklGT1JNX0JMT0NLX0JJTkRJTkdcMCIKKyAgICJHTF9VTklGT1JNX0JMT0NLX0RBVEFfU0laRVwwIgorICAgIkdMX1VOSUZPUk1fQkxPQ0tfTkFNRV9MRU5HVEhcMCIKKyAgICJHTF9VTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNU1wwIgorICAgIkdMX1VOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFU1wwIgorICAgIkdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9WRVJURVhfU0hBREVSXDAiCisgICAiR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0dFT01FVFJZX1NIQURFUlwwIgorICAgIkdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9GUkFHTUVOVF9TSEFERVJcMCIKKyAgICJHTF9URVhUVVJFX1NSR0JfREVDT0RFX0VYVFwwIgorICAgIkdMX0RFQ09ERV9FWFRcMCIKKyAgICJHTF9TS0lQX0RFQ09ERV9FWFRcMCIKKyAgICJHTF9GUkFHTUVOVF9TSEFERVJcMCIKKyAgICJHTF9WRVJURVhfU0hBREVSXDAiCisgICAiR0xfUFJPR1JBTV9PQkpFQ1RfQVJCXDAiCisgICAiR0xfU0hBREVSX09CSkVDVF9BUkJcMCIKKyAgICJHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTXDAiCisgICAiR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFNcMCIKKyAgICJHTF9NQVhfVkFSWUlOR19DT01QT05FTlRTXDAiCisgICAiR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTXDAiCisgICAiR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNcMCIKKyAgICJHTF9PQkpFQ1RfVFlQRV9BUkJcMCIKKyAgICJHTF9TSEFERVJfVFlQRVwwIgorICAgIkdMX0ZMT0FUX1ZFQzJcMCIKKyAgICJHTF9GTE9BVF9WRUMzXDAiCisgICAiR0xfRkxPQVRfVkVDNFwwIgorICAgIkdMX0lOVF9WRUMyXDAiCisgICAiR0xfSU5UX1ZFQzNcMCIKKyAgICJHTF9JTlRfVkVDNFwwIgorICAgIkdMX0JPT0xcMCIKKyAgICJHTF9CT09MX1ZFQzJcMCIKKyAgICJHTF9CT09MX1ZFQzNcMCIKKyAgICJHTF9CT09MX1ZFQzRcMCIKKyAgICJHTF9GTE9BVF9NQVQyXDAiCisgICAiR0xfRkxPQVRfTUFUM1wwIgorICAgIkdMX0ZMT0FUX01BVDRcMCIKKyAgICJHTF9TQU1QTEVSXzFEXDAiCisgICAiR0xfU0FNUExFUl8yRFwwIgorICAgIkdMX1NBTVBMRVJfM0RcMCIKKyAgICJHTF9TQU1QTEVSX0NVQkVcMCIKKyAgICJHTF9TQU1QTEVSXzFEX1NIQURPV1wwIgorICAgIkdMX1NBTVBMRVJfMkRfU0hBRE9XXDAiCisgICAiR0xfU0FNUExFUl8yRF9SRUNUXDAiCisgICAiR0xfU0FNUExFUl8yRF9SRUNUX1NIQURPV1wwIgorICAgIkdMX0ZMT0FUX01BVDJ4M1wwIgorICAgIkdMX0ZMT0FUX01BVDJ4NFwwIgorICAgIkdMX0ZMT0FUX01BVDN4MlwwIgorICAgIkdMX0ZMT0FUX01BVDN4NFwwIgorICAgIkdMX0ZMT0FUX01BVDR4MlwwIgorICAgIkdMX0ZMT0FUX01BVDR4M1wwIgorICAgIkdMX0RFTEVURV9TVEFUVVNcMCIKKyAgICJHTF9DT01QSUxFX1NUQVRVU1wwIgorICAgIkdMX0xJTktfU1RBVFVTXDAiCisgICAiR0xfVkFMSURBVEVfU1RBVFVTXDAiCisgICAiR0xfSU5GT19MT0dfTEVOR1RIXDAiCisgICAiR0xfQVRUQUNIRURfU0hBREVSU1wwIgorICAgIkdMX0FDVElWRV9VTklGT1JNU1wwIgorICAgIkdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEhcMCIKKyAgICJHTF9TSEFERVJfU09VUkNFX0xFTkdUSFwwIgorICAgIkdMX0FDVElWRV9BVFRSSUJVVEVTXDAiCisgICAiR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIXDAiCisgICAiR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVFwwIgorICAgIkdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTlwwIgorICAgIkdMX0NVUlJFTlRfUFJPR1JBTVwwIgorICAgIkdMX1BBTEVUVEU0X1JHQjhfT0VTXDAiCisgICAiR0xfUEFMRVRURTRfUkdCQThfT0VTXDAiCisgICAiR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTXDAiCisgICAiR0xfUEFMRVRURTRfUkdCQTRfT0VTXDAiCisgICAiR0xfUEFMRVRURTRfUkdCNV9BMV9PRVNcMCIKKyAgICJHTF9QQUxFVFRFOF9SR0I4X09FU1wwIgorICAgIkdMX1BBTEVUVEU4X1JHQkE4X09FU1wwIgorICAgIkdMX1BBTEVUVEU4X1I1X0c2X0I1X09FU1wwIgorICAgIkdMX1BBTEVUVEU4X1JHQkE0X09FU1wwIgorICAgIkdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTXDAiCisgICAiR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFXDAiCisgICAiR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRcMCIKKyAgICJHTF9QT0lOVF9TSVpFX0FSUkFZX09FU1wwIgorICAgIkdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FU1wwIgorICAgIkdMX01BVFJJWF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19PRVNcMCIKKyAgICJHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FU1wwIgorICAgIkdMX0NPVU5URVJfVFlQRV9BTURcMCIKKyAgICJHTF9DT1VOVEVSX1JBTkdFX0FNRFwwIgorICAgIkdMX1VOU0lHTkVEX0lOVDY0X0FNRFwwIgorICAgIkdMX1BFQ0VOVEFHRV9BTURcMCIKKyAgICJHTF9QRVJGTU9OX1JFU1VMVF9BVkFJTEFCTEVfQU1EXDAiCisgICAiR0xfUEVSRk1PTl9SRVNVTFRfU0laRV9BTURcMCIKKyAgICJHTF9QRVJGTU9OX1JFU1VMVF9BTURcMCIKKyAgICJHTF9URVhUVVJFX1JFRF9UWVBFXDAiCisgICAiR0xfVEVYVFVSRV9HUkVFTl9UWVBFXDAiCisgICAiR0xfVEVYVFVSRV9CTFVFX1RZUEVcMCIKKyAgICJHTF9URVhUVVJFX0FMUEhBX1RZUEVcMCIKKyAgICJHTF9URVhUVVJFX0xVTUlOQU5DRV9UWVBFXDAiCisgICAiR0xfVEVYVFVSRV9JTlRFTlNJVFlfVFlQRVwwIgorICAgIkdMX1RFWFRVUkVfREVQVEhfVFlQRVwwIgorICAgIkdMX1VOU0lHTkVEX05PUk1BTElaRURcMCIKKyAgICJHTF9URVhUVVJFXzFEX0FSUkFZXDAiCisgICAiR0xfUFJPWFlfVEVYVFVSRV8xRF9BUlJBWVwwIgorICAgIkdMX1RFWFRVUkVfMkRfQVJSQVlcMCIKKyAgICJHTF9QUk9YWV9URVhUVVJFXzJEX0FSUkFZXDAiCisgICAiR0xfVEVYVFVSRV9CSU5ESU5HXzFEX0FSUkFZXDAiCisgICAiR0xfVEVYVFVSRV9CSU5ESU5HXzJEX0FSUkFZXDAiCisgICAiR0xfTUFYX0dFT01FVFJZX1RFWFRVUkVfSU1BR0VfVU5JVFNcMCIKKyAgICJHTF9URVhUVVJFX0JVRkZFUlwwIgorICAgIkdMX01BWF9URVhUVVJFX0JVRkZFUl9TSVpFXDAiCisgICAiR0xfVEVYVFVSRV9CSU5ESU5HX0JVRkZFUlwwIgorICAgIkdMX1RFWFRVUkVfQlVGRkVSX0RBVEFfU1RPUkVfQklORElOR1wwIgorICAgIkdMX1RFWFRVUkVfQlVGRkVSX0ZPUk1BVFwwIgorICAgIkdMX0FOWV9TQU1QTEVTX1BBU1NFRFwwIgorICAgIkdMX1NBTVBMRV9TSEFESU5HXDAiCisgICAiR0xfTUlOX1NBTVBMRV9TSEFESU5HX1ZBTFVFXDAiCisgICAiR0xfUjExRl9HMTFGX0IxMEZcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWXDAiCisgICAiR0xfUkdCQV9TSUdORURfQ09NUE9ORU5UU19FWFRcMCIKKyAgICJHTF9SR0I5X0U1XDAiCisgICAiR0xfVU5TSUdORURfSU5UXzVfOV85XzlfUkVWXDAiCisgICAiR0xfVEVYVFVSRV9TSEFSRURfU0laRVwwIgorICAgIkdMX1NSR0JcMCIKKyAgICJHTF9TUkdCOFwwIgorICAgIkdMX1NSR0JfQUxQSEFcMCIKKyAgICJHTF9TUkdCOF9BTFBIQThcMCIKKyAgICJHTF9TTFVNSU5BTkNFX0FMUEhBXDAiCisgICAiR0xfU0xVTUlOQU5DRThfQUxQSEE4XDAiCisgICAiR0xfU0xVTUlOQU5DRVwwIgorICAgIkdMX1NMVU1JTkFOQ0U4XDAiCisgICAiR0xfQ09NUFJFU1NFRF9TUkdCXDAiCisgICAiR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBXDAiCisgICAiR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFXDAiCisgICAiR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFX0FMUEhBXDAiCisgICAiR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdfTUFYX0xFTkdUSFwwIgorICAgIkdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERVwwIgorICAgIkdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UU1wwIgorICAgIkdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HU1wwIgorICAgIkdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlRcMCIKKyAgICJHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NJWkVcMCIKKyAgICJHTF9QUklNSVRJVkVTX0dFTkVSQVRFRFwwIgorICAgIkdMX1RSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU5cMCIKKyAgICJHTF9SQVNURVJJWkVSX0RJU0NBUkRcMCIKKyAgICJHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0NPTVBPTkVOVFNcMCIKKyAgICJHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlNcMCIKKyAgICJHTF9JTlRFUkxFQVZFRF9BVFRSSUJTXDAiCisgICAiR0xfU0VQQVJBVEVfQVRUUklCU1wwIgorICAgIkdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJcMCIKKyAgICJHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9QT0lOVF9TUFJJVEVfQ09PUkRfT1JJR0lOXDAiCisgICAiR0xfTE9XRVJfTEVGVFwwIgorICAgIkdMX1VQUEVSX0xFRlRcMCIKKyAgICJHTF9TVEVOQ0lMX0JBQ0tfUkVGXDAiCisgICAiR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0tcMCIKKyAgICJHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLXDAiCisgICAiR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HXDAiCisgICAiR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9SRUFEX0ZSQU1FQlVGRkVSXDAiCisgICAiR0xfRFJBV19GUkFNRUJVRkZFUlwwIgorICAgIkdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR1wwIgorICAgIkdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTXDAiCisgICAiR0xfREVQVEhfQ09NUE9ORU5UMzJGXDAiCisgICAiR0xfREVQVEgzMkZfU1RFTkNJTDhcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRVwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTFwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVFwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFVQTElDQVRFX0FUVEFDSE1FTlRfRVhUXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX0VYVFwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19FWFRcMCIKKyAgICJHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RSQVdfQlVGRkVSXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9SRUFEX0JVRkZFUlwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfU1RBVFVTX0VSUk9SX0VYVFwwIgorICAgIkdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU1wwIgorICAgIkdMX0NPTE9SX0FUVEFDSE1FTlQwXDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDFcMCIKKyAgICJHTF9DT0xPUl9BVFRBQ0hNRU5UMlwwIgorICAgIkdMX0NPTE9SX0FUVEFDSE1FTlQzXDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDRcMCIKKyAgICJHTF9DT0xPUl9BVFRBQ0hNRU5UNVwwIgorICAgIkdMX0NPTE9SX0FUVEFDSE1FTlQ2XDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDdcMCIKKyAgICJHTF9DT0xPUl9BVFRBQ0hNRU5UOFwwIgorICAgIkdMX0NPTE9SX0FUVEFDSE1FTlQ5XDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDEwXDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDExXDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDEyXDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDEzXDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDE0XDAiCisgICAiR0xfQ09MT1JfQVRUQUNITUVOVDE1XDAiCisgICAiR0xfREVQVEhfQVRUQUNITUVOVFwwIgorICAgIkdMX1NURU5DSUxfQVRUQUNITUVOVFwwIgorICAgIkdMX0ZSQU1FQlVGRkVSXDAiCisgICAiR0xfUkVOREVSQlVGRkVSXDAiCisgICAiR0xfUkVOREVSQlVGRkVSX1dJRFRIXDAiCisgICAiR0xfUkVOREVSQlVGRkVSX0hFSUdIVFwwIgorICAgIkdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRcMCIKKyAgICJHTF9TVEVOQ0lMX0lOREVYX0VYVFwwIgorICAgIkdMX1NURU5DSUxfSU5ERVgxXDAiCisgICAiR0xfU1RFTkNJTF9JTkRFWDRcMCIKKyAgICJHTF9TVEVOQ0lMX0lOREVYOFwwIgorICAgIkdMX1NURU5DSUxfSU5ERVgxNlwwIgorICAgIkdMX1JFTkRFUkJVRkZFUl9SRURfU0laRVwwIgorICAgIkdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFXDAiCisgICAiR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRVwwIgorICAgIkdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFXDAiCisgICAiR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVcMCIKKyAgICJHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRVwwIgorICAgIkdMX01BWF9TQU1QTEVTXDAiCisgICAiR0xfVEVYVFVSRV9HRU5fU1RSX09FU1wwIgorICAgIkdMX0hBTEZfRkxPQVRfT0VTXDAiCisgICAiR0xfUkdCNTY1XDAiCisgICAiR0xfRVRDMV9SR0I4X09FU1wwIgorICAgIkdMX1RFWFRVUkVfRVhURVJOQUxfT0VTXDAiCisgICAiR0xfU0FNUExFUl9FWFRFUk5BTF9PRVNcMCIKKyAgICJHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTXDAiCisgICAiR0xfUkVRVUlSRURfVEVYVFVSRV9JTUFHRV9VTklUU19PRVNcMCIKKyAgICJHTF9QUklNSVRJVkVfUkVTVEFSVF9GSVhFRF9JTkRFWFwwIgorICAgIkdMX0FOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkVcMCIKKyAgICJHTF9NQVhfRUxFTUVOVF9JTkRFWFwwIgorICAgIkdMX1JHQkEzMlVJXDAiCisgICAiR0xfUkdCMzJVSVwwIgorICAgIkdMX0FMUEhBMzJVSV9FWFRcMCIKKyAgICJHTF9JTlRFTlNJVFkzMlVJX0VYVFwwIgorICAgIkdMX0xVTUlOQU5DRTMyVUlfRVhUXDAiCisgICAiR0xfTFVNSU5BTkNFX0FMUEhBMzJVSV9FWFRcMCIKKyAgICJHTF9SR0JBMTZVSVwwIgorICAgIkdMX1JHQjE2VUlcMCIKKyAgICJHTF9BTFBIQTE2VUlfRVhUXDAiCisgICAiR0xfSU5URU5TSVRZMTZVSV9FWFRcMCIKKyAgICJHTF9MVU1JTkFOQ0UxNlVJX0VYVFwwIgorICAgIkdMX0xVTUlOQU5DRV9BTFBIQTE2VUlfRVhUXDAiCisgICAiR0xfUkdCQThVSVwwIgorICAgIkdMX1JHQjhVSVwwIgorICAgIkdMX0FMUEhBOFVJX0VYVFwwIgorICAgIkdMX0lOVEVOU0lUWThVSV9FWFRcMCIKKyAgICJHTF9MVU1JTkFOQ0U4VUlfRVhUXDAiCisgICAiR0xfTFVNSU5BTkNFX0FMUEhBOFVJX0VYVFwwIgorICAgIkdMX1JHQkEzMklcMCIKKyAgICJHTF9SR0IzMklcMCIKKyAgICJHTF9BTFBIQTMySV9FWFRcMCIKKyAgICJHTF9JTlRFTlNJVFkzMklfRVhUXDAiCisgICAiR0xfTFVNSU5BTkNFMzJJX0VYVFwwIgorICAgIkdMX0xVTUlOQU5DRV9BTFBIQTMySV9FWFRcMCIKKyAgICJHTF9SR0JBMTZJXDAiCisgICAiR0xfUkdCMTZJXDAiCisgICAiR0xfQUxQSEExNklfRVhUXDAiCisgICAiR0xfSU5URU5TSVRZMTZJX0VYVFwwIgorICAgIkdMX0xVTUlOQU5DRTE2SV9FWFRcMCIKKyAgICJHTF9MVU1JTkFOQ0VfQUxQSEExNklfRVhUXDAiCisgICAiR0xfUkdCQThJXDAiCisgICAiR0xfUkdCOElcMCIKKyAgICJHTF9BTFBIQThJX0VYVFwwIgorICAgIkdMX0lOVEVOU0lUWThJX0VYVFwwIgorICAgIkdMX0xVTUlOQU5DRThJX0VYVFwwIgorICAgIkdMX0xVTUlOQU5DRV9BTFBIQThJX0VYVFwwIgorICAgIkdMX1JFRF9JTlRFR0VSXDAiCisgICAiR0xfR1JFRU5fSU5URUdFUlwwIgorICAgIkdMX0JMVUVfSU5URUdFUlwwIgorICAgIkdMX0FMUEhBX0lOVEVHRVJfRVhUXDAiCisgICAiR0xfUkdCX0lOVEVHRVJcMCIKKyAgICJHTF9SR0JBX0lOVEVHRVJcMCIKKyAgICJHTF9CR1JfSU5URUdFUlwwIgorICAgIkdMX0JHUkFfSU5URUdFUlwwIgorICAgIkdMX0xVTUlOQU5DRV9JTlRFR0VSX0VYVFwwIgorICAgIkdMX0xVTUlOQU5DRV9BTFBIQV9JTlRFR0VSX0VYVFwwIgorICAgIkdMX1JHQkFfSU5URUdFUl9NT0RFX0VYVFwwIgorICAgIkdMX0lOVF8yXzEwXzEwXzEwX1JFVlwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRFwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfVEFSR0VUU1wwIgorICAgIkdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfQ09VTlRfQVJCXDAiCisgICAiR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWXDAiCisgICAiR0xfRlJBTUVCVUZGRVJfU1JHQlwwIgorICAgIkdMX0ZSQU1FQlVGRkVSX1NSR0JfQ0FQQUJMRV9FWFRcMCIKKyAgICJHTF9DT01QUkVTU0VEX1JFRF9SR1RDMVwwIgorICAgIkdMX0NPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMVwwIgorICAgIkdMX0NPTVBSRVNTRURfUkdfUkdUQzJcMCIKKyAgICJHTF9DT01QUkVTU0VEX1NJR05FRF9SR19SR1RDMlwwIgorICAgIkdMX1NBTVBMRVJfMURfQVJSQVlcMCIKKyAgICJHTF9TQU1QTEVSXzJEX0FSUkFZXDAiCisgICAiR0xfU0FNUExFUl9CVUZGRVJcMCIKKyAgICJHTF9TQU1QTEVSXzFEX0FSUkFZX1NIQURPV1wwIgorICAgIkdMX1NBTVBMRVJfMkRfQVJSQVlfU0hBRE9XXDAiCisgICAiR0xfU0FNUExFUl9DVUJFX1NIQURPV1wwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9WRUMyXDAiCisgICAiR0xfVU5TSUdORURfSU5UX1ZFQzNcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfVkVDNFwwIgorICAgIkdMX0lOVF9TQU1QTEVSXzFEXDAiCisgICAiR0xfSU5UX1NBTVBMRVJfMkRcMCIKKyAgICJHTF9JTlRfU0FNUExFUl8zRFwwIgorICAgIkdMX0lOVF9TQU1QTEVSX0NVQkVcMCIKKyAgICJHTF9JTlRfU0FNUExFUl8yRF9SRUNUXDAiCisgICAiR0xfSU5UX1NBTVBMRVJfMURfQVJSQVlcMCIKKyAgICJHTF9JTlRfU0FNUExFUl8yRF9BUlJBWVwwIgorICAgIkdMX0lOVF9TQU1QTEVSX0JVRkZFUlwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzFEXDAiCisgICAiR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8zRFwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkVcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9SRUNUXDAiCisgICAiR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMURfQVJSQVlcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWVwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0JVRkZFUlwwIgorICAgIkdMX0dFT01FVFJZX1NIQURFUlwwIgorICAgIkdMX0dFT01FVFJZX1ZFUlRJQ0VTX09VVF9BUkJcMCIKKyAgICJHTF9HRU9NRVRSWV9JTlBVVF9UWVBFX0FSQlwwIgorICAgIkdMX0dFT01FVFJZX09VVFBVVF9UWVBFX0FSQlwwIgorICAgIkdMX01BWF9HRU9NRVRSWV9WQVJZSU5HX0NPTVBPTkVOVFNfQVJCXDAiCisgICAiR0xfTUFYX1ZFUlRFWF9WQVJZSU5HX0NPTVBPTkVOVFNfQVJCXDAiCisgICAiR0xfTUFYX0dFT01FVFJZX1VOSUZPUk1fQ09NUE9ORU5UU1wwIgorICAgIkdMX01BWF9HRU9NRVRSWV9PVVRQVVRfVkVSVElDRVNcMCIKKyAgICJHTF9NQVhfR0VPTUVUUllfVE9UQUxfT1VUUFVUX0NPTVBPTkVOVFNcMCIKKyAgICJHTF9MT1dfRkxPQVRcMCIKKyAgICJHTF9NRURJVU1fRkxPQVRcMCIKKyAgICJHTF9ISUdIX0ZMT0FUXDAiCisgICAiR0xfTE9XX0lOVFwwIgorICAgIkdMX01FRElVTV9JTlRcMCIKKyAgICJHTF9ISUdIX0lOVFwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yX09FU1wwIgorICAgIkdMX0lOVF8xMF8xMF8xMF8yX09FU1wwIgorICAgIkdMX1NIQURFUl9CSU5BUllfRk9STUFUU1wwIgorICAgIkdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFNcMCIKKyAgICJHTF9TSEFERVJfQ09NUElMRVJcMCIKKyAgICJHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SU1wwIgorICAgIkdMX01BWF9WQVJZSU5HX1ZFQ1RPUlNcMCIKKyAgICJHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTXDAiCisgICAiR0xfUVVFUllfV0FJVFwwIgorICAgIkdMX1FVRVJZX05PX1dBSVRcMCIKKyAgICJHTF9RVUVSWV9CWV9SRUdJT05fV0FJVFwwIgorICAgIkdMX1FVRVJZX0JZX1JFR0lPTl9OT19XQUlUXDAiCisgICAiR0xfVFJBTlNGT1JNX0ZFRURCQUNLXDAiCisgICAiR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9QQVVTRURcMCIKKyAgICJHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0FDVElWRVwwIgorICAgIkdMX1RSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HXDAiCisgICAiR0xfVElNRVNUQU1QXDAiCisgICAiR0xfVEVYVFVSRV9TV0laWkxFX1JcMCIKKyAgICJHTF9URVhUVVJFX1NXSVpaTEVfR1wwIgorICAgIkdMX1RFWFRVUkVfU1dJWlpMRV9CXDAiCisgICAiR0xfVEVYVFVSRV9TV0laWkxFX0FcMCIKKyAgICJHTF9URVhUVVJFX1NXSVpaTEVfUkdCQVwwIgorICAgIkdMX1FVQURTX0ZPTExPV19QUk9WT0tJTkdfVkVSVEVYX0NPTlZFTlRJT05cMCIKKyAgICJHTF9GSVJTVF9WRVJURVhfQ09OVkVOVElPTlwwIgorICAgIkdMX0xBU1RfVkVSVEVYX0NPTlZFTlRJT05cMCIKKyAgICJHTF9QUk9WT0tJTkdfVkVSVEVYXDAiCisgICAiR0xfU0FNUExFX1BPU0lUSU9OXDAiCisgICAiR0xfU0FNUExFX01BU0tcMCIKKyAgICJHTF9TQU1QTEVfTUFTS19WQUxVRVwwIgorICAgIkdMX01BWF9TQU1QTEVfTUFTS19XT1JEU1wwIgorICAgIkdMX01BWF9HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlNcMCIKKyAgICJHTF9NSU5fRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVRcMCIKKyAgICJHTF9NQVhfRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVRcMCIKKyAgICJHTF9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVF9CSVRTXDAiCisgICAiR0xfTUlOX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUXDAiCisgICAiR0xfTUFYX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUXDAiCisgICAiR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJTXDAiCisgICAiR0xfTUFYX1ZFUlRFWF9TVFJFQU1TXDAiCisgICAiR0xfQ09QWV9SRUFEX0JVRkZFUlwwIgorICAgIkdMX0NPUFlfV1JJVEVfQlVGRkVSXDAiCisgICAiR0xfTUFYX0lNQUdFX1VOSVRTXDAiCisgICAiR0xfTUFYX0NPTUJJTkVEX0lNQUdFX1VOSVRTX0FORF9GUkFHTUVOVF9PVVRQVVRTXDAiCisgICAiR0xfSU1BR0VfQklORElOR19OQU1FXDAiCisgICAiR0xfSU1BR0VfQklORElOR19MRVZFTFwwIgorICAgIkdMX0lNQUdFX0JJTkRJTkdfTEFZRVJFRFwwIgorICAgIkdMX0lNQUdFX0JJTkRJTkdfTEFZRVJcMCIKKyAgICJHTF9JTUFHRV9CSU5ESU5HX0FDQ0VTU1wwIgorICAgIkdMX0RSQVdfSU5ESVJFQ1RfQlVGRkVSXDAiCisgICAiR0xfRFJBV19JTkRJUkVDVF9CVUZGRVJfQklORElOR1wwIgorICAgIkdMX1JFRF9TTk9STVwwIgorICAgIkdMX1JHX1NOT1JNXDAiCisgICAiR0xfUkdCX1NOT1JNXDAiCisgICAiR0xfUkdCQV9TTk9STVwwIgorICAgIkdMX1I4X1NOT1JNXDAiCisgICAiR0xfUkc4X1NOT1JNXDAiCisgICAiR0xfUkdCOF9TTk9STVwwIgorICAgIkdMX1JHQkE4X1NOT1JNXDAiCisgICAiR0xfUjE2X1NOT1JNXDAiCisgICAiR0xfUkcxNl9TTk9STVwwIgorICAgIkdMX1JHQjE2X1NOT1JNXDAiCisgICAiR0xfUkdCQTE2X1NOT1JNXDAiCisgICAiR0xfU0lHTkVEX05PUk1BTElaRURcMCIKKyAgICJHTF9QUklNSVRJVkVfUkVTVEFSVFwwIgorICAgIkdMX1BSSU1JVElWRV9SRVNUQVJUX0lOREVYXDAiCisgICAiR0xfTUFYX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfQ09NUE9ORU5UU19BUkJcMCIKKyAgICJHTF9URVhUVVJFX0NVQkVfTUFQX0FSUkFZX0FSQlwwIgorICAgIkdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9BUlJBWV9BUkJcMCIKKyAgICJHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0FSUkFZX0FSQlwwIgorICAgIkdMX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfQVJCXDAiCisgICAiR0xfU0FNUExFUl9DVUJFX01BUF9BUlJBWV9TSEFET1dfQVJCXDAiCisgICAiR0xfSU5UX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfQVJCXDAiCisgICAiR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfQVJCXDAiCisgICAiR0xfSU1BR0VfMURcMCIKKyAgICJHTF9JTUFHRV8yRFwwIgorICAgIkdMX0lNQUdFXzNEXDAiCisgICAiR0xfSU1BR0VfMkRfUkVDVFwwIgorICAgIkdMX0lNQUdFX0NVQkVcMCIKKyAgICJHTF9JTUFHRV9CVUZGRVJcMCIKKyAgICJHTF9JTUFHRV8xRF9BUlJBWVwwIgorICAgIkdMX0lNQUdFXzJEX0FSUkFZXDAiCisgICAiR0xfSU1BR0VfQ1VCRV9NQVBfQVJSQVlcMCIKKyAgICJHTF9JTUFHRV8yRF9NVUxUSVNBTVBMRVwwIgorICAgIkdMX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZXDAiCisgICAiR0xfSU5UX0lNQUdFXzFEXDAiCisgICAiR0xfSU5UX0lNQUdFXzJEXDAiCisgICAiR0xfSU5UX0lNQUdFXzNEXDAiCisgICAiR0xfSU5UX0lNQUdFXzJEX1JFQ1RcMCIKKyAgICJHTF9JTlRfSU1BR0VfQ1VCRVwwIgorICAgIkdMX0lOVF9JTUFHRV9CVUZGRVJcMCIKKyAgICJHTF9JTlRfSU1BR0VfMURfQVJSQVlcMCIKKyAgICJHTF9JTlRfSU1BR0VfMkRfQVJSQVlcMCIKKyAgICJHTF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVlcMCIKKyAgICJHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVcMCIKKyAgICJHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVlcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfSU1BR0VfMURcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfSU1BR0VfM0RcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfUkVDVFwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9JTUFHRV9DVUJFXDAiCisgICAiR0xfVU5TSUdORURfSU5UX0lNQUdFX0JVRkZFUlwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRF9BUlJBWVwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9BUlJBWVwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWVwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRVwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRV9BUlJBWVwwIgorICAgIkdMX01BWF9JTUFHRV9TQU1QTEVTXDAiCisgICAiR0xfSU1BR0VfQklORElOR19GT1JNQVRcMCIKKyAgICJHTF9SR0IxMF9BMlVJXDAiCisgICAiR0xfTUlOX01BUF9CVUZGRVJfQUxJR05NRU5UXDAiCisgICAiR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfVFlQRVwwIgorICAgIkdMX0lNQUdFX0ZPUk1BVF9DT01QQVRJQklMSVRZX0JZX1NJWkVcMCIKKyAgICJHTF9JTUFHRV9GT1JNQVRfQ09NUEFUSUJJTElUWV9CWV9DTEFTU1wwIgorICAgIkdMX01BWF9WRVJURVhfSU1BR0VfVU5JRk9STVNcMCIKKyAgICJHTF9NQVhfVEVTU19DT05UUk9MX0lNQUdFX1VOSUZPUk1TXDAiCisgICAiR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9JTUFHRV9VTklGT1JNU1wwIgorICAgIkdMX01BWF9HRU9NRVRSWV9JTUFHRV9VTklGT1JNU1wwIgorICAgIkdMX01BWF9GUkFHTUVOVF9JTUFHRV9VTklGT1JNU1wwIgorICAgIkdMX01BWF9DT01CSU5FRF9JTUFHRV9VTklGT1JNU1wwIgorICAgIkdMX0RFUFRIX1NURU5DSUxfVEVYVFVSRV9NT0RFXDAiCisgICAiR0xfTUFYX0NPTVBVVEVfV09SS19HUk9VUF9JTlZPQ0FUSU9OU1wwIgorICAgIkdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9DT01QVVRFX1NIQURFUlwwIgorICAgIkdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX0NPTVBVVEVfU0hBREVSXDAiCisgICAiR0xfRElTUEFUQ0hfSU5ESVJFQ1RfQlVGRkVSXDAiCisgICAiR0xfRElTUEFUQ0hfSU5ESVJFQ1RfQlVGRkVSX0JJTkRJTkdcMCIKKyAgICJHTF9URVhUVVJFXzJEX01VTFRJU0FNUExFXDAiCisgICAiR0xfUFJPWFlfVEVYVFVSRV8yRF9NVUxUSVNBTVBMRVwwIgorICAgIkdMX1RFWFRVUkVfMkRfTVVMVElTQU1QTEVfQVJSQVlcMCIKKyAgICJHTF9QUk9YWV9URVhUVVJFXzJEX01VTFRJU0FNUExFX0FSUkFZXDAiCisgICAiR0xfVEVYVFVSRV9CSU5ESU5HXzJEX01VTFRJU0FNUExFXDAiCisgICAiR0xfVEVYVFVSRV9CSU5ESU5HXzJEX01VTFRJU0FNUExFX0FSUkFZXDAiCisgICAiR0xfVEVYVFVSRV9TQU1QTEVTXDAiCisgICAiR0xfVEVYVFVSRV9GSVhFRF9TQU1QTEVfTE9DQVRJT05TXDAiCisgICAiR0xfU0FNUExFUl8yRF9NVUxUSVNBTVBMRVwwIgorICAgIkdMX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFXDAiCisgICAiR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVcMCIKKyAgICJHTF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZXDAiCisgICAiR0xfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVlcMCIKKyAgICJHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWVwwIgorICAgIkdMX01BWF9DT0xPUl9URVhUVVJFX1NBTVBMRVNcMCIKKyAgICJHTF9NQVhfREVQVEhfVEVYVFVSRV9TQU1QTEVTXDAiCisgICAiR0xfTUFYX0lOVEVHRVJfU0FNUExFU1wwIgorICAgIkdMX01BWF9TRVJWRVJfV0FJVF9USU1FT1VUXDAiCisgICAiR0xfT0JKRUNUX1RZUEVcMCIKKyAgICJHTF9TWU5DX0NPTkRJVElPTlwwIgorICAgIkdMX1NZTkNfU1RBVFVTXDAiCisgICAiR0xfU1lOQ19GTEFHU1wwIgorICAgIkdMX1NZTkNfRkVOQ0VcMCIKKyAgICJHTF9TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURVwwIgorICAgIkdMX1VOU0lHTkFMRURcMCIKKyAgICJHTF9TSUdOQUxFRFwwIgorICAgIkdMX0FMUkVBRFlfU0lHTkFMRURcMCIKKyAgICJHTF9USU1FT1VUX0VYUElSRURcMCIKKyAgICJHTF9DT05ESVRJT05fU0FUSVNGSUVEXDAiCisgICAiR0xfV0FJVF9GQUlMRURcMCIKKyAgICJHTF9CVUZGRVJfQUNDRVNTX0ZMQUdTXDAiCisgICAiR0xfQlVGRkVSX01BUF9MRU5HVEhcMCIKKyAgICJHTF9CVUZGRVJfTUFQX09GRlNFVFwwIgorICAgIkdMX01BWF9WRVJURVhfT1VUUFVUX0NPTVBPTkVOVFNcMCIKKyAgICJHTF9NQVhfR0VPTUVUUllfSU5QVVRfQ09NUE9ORU5UU1wwIgorICAgIkdMX01BWF9HRU9NRVRSWV9PVVRQVVRfQ09NUE9ORU5UU1wwIgorICAgIkdMX01BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTXDAiCisgICAiR0xfQ09OVEVYVF9QUk9GSUxFX01BU0tcMCIKKyAgICJHTF9URVhUVVJFX0lNTVVUQUJMRV9GT1JNQVRcMCIKKyAgICJHTF9NQVhfREVCVUdfTUVTU0FHRV9MRU5HVEhfQVJCXDAiCisgICAiR0xfTUFYX0RFQlVHX0xPR0dFRF9NRVNTQUdFU19BUkJcMCIKKyAgICJHTF9ERUJVR19MT0dHRURfTUVTU0FHRVNfQVJCXDAiCisgICAiR0xfREVCVUdfU0VWRVJJVFlfSElHSF9BUkJcMCIKKyAgICJHTF9ERUJVR19TRVZFUklUWV9NRURJVU1fQVJCXDAiCisgICAiR0xfREVCVUdfU0VWRVJJVFlfTE9XX0FSQlwwIgorICAgIkdMX1RFWFRVUkVfQlVGRkVSX09GRlNFVFwwIgorICAgIkdMX1RFWFRVUkVfQlVGRkVSX1NJWkVcMCIKKyAgICJHTF9URVhUVVJFX0JVRkZFUl9PRkZTRVRfQUxJR05NRU5UXDAiCisgICAiR0xfQ09NUFVURV9TSEFERVJcMCIKKyAgICJHTF9NQVhfQ09NUFVURV9VTklGT1JNX0JMT0NLU1wwIgorICAgIkdMX01BWF9DT01QVVRFX1RFWFRVUkVfSU1BR0VfVU5JVFNcMCIKKyAgICJHTF9NQVhfQ09NUFVURV9JTUFHRV9VTklGT1JNU1wwIgorICAgIkdMX01BWF9DT01QVVRFX1dPUktfR1JPVVBfQ09VTlRcMCIKKyAgICJHTF9NQVhfQ09NUFVURV9XT1JLX0dST1VQX1NJWkVcMCIKKyAgICJHTF9DT01QUkVTU0VEX1IxMV9FQUNcMCIKKyAgICJHTF9DT01QUkVTU0VEX1NJR05FRF9SMTFfRUFDXDAiCisgICAiR0xfQ09NUFJFU1NFRF9SRzExX0VBQ1wwIgorICAgIkdMX0NPTVBSRVNTRURfU0lHTkVEX1JHMTFfRUFDXDAiCisgICAiR0xfQ09NUFJFU1NFRF9SR0I4X0VUQzJcMCIKKyAgICJHTF9DT01QUkVTU0VEX1NSR0I4X0VUQzJcMCIKKyAgICJHTF9DT01QUkVTU0VEX1JHQjhfUFVOQ0hUSFJPVUdIX0FMUEhBMV9FVEMyXDAiCisgICAiR0xfQ09NUFJFU1NFRF9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzJcMCIKKyAgICJHTF9DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDXDAiCisgICAiR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUNcMCIKKyAgICJHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJcMCIKKyAgICJHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQklORElOR1wwIgorICAgIkdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TVEFSVFwwIgorICAgIkdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TSVpFXDAiCisgICAiR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0RBVEFfU0laRVwwIgorICAgIkdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9BQ1RJVkVfQVRPTUlDX0NPVU5URVJTXDAiCisgICAiR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0FDVElWRV9BVE9NSUNfQ09VTlRFUl9JTkRJQ0VTXDAiCisgICAiR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUlwwIgorICAgIkdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX1RFU1NfQ09OVFJPTF9TSEFERVJcMCIKKyAgICJHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9URVNTX0VWQUxVQVRJT05fU0hBREVSXDAiCisgICAiR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfR0VPTUVUUllfU0hBREVSXDAiCisgICAiR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSXDAiCisgICAiR0xfTUFYX1ZFUlRFWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTXDAiCisgICAiR0xfTUFYX1RFU1NfQ09OVFJPTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTXDAiCisgICAiR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTXDAiCisgICAiR0xfTUFYX0dFT01FVFJZX0FUT01JQ19DT1VOVEVSX0JVRkZFUlNcMCIKKyAgICJHTF9NQVhfRlJBR01FTlRfQVRPTUlDX0NPVU5URVJfQlVGRkVSU1wwIgorICAgIkdMX01BWF9DT01CSU5FRF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTXDAiCisgICAiR0xfTUFYX1ZFUlRFWF9BVE9NSUNfQ09VTlRFUlNcMCIKKyAgICJHTF9NQVhfVEVTU19DT05UUk9MX0FUT01JQ19DT1VOVEVSU1wwIgorICAgIkdMX01BWF9URVNTX0VWQUxVQVRJT05fQVRPTUlDX0NPVU5URVJTXDAiCisgICAiR0xfTUFYX0dFT01FVFJZX0FUT01JQ19DT1VOVEVSU1wwIgorICAgIkdMX01BWF9GUkFHTUVOVF9BVE9NSUNfQ09VTlRFUlNcMCIKKyAgICJHTF9NQVhfQ09NQklORURfQVRPTUlDX0NPVU5URVJTXDAiCisgICAiR0xfTUFYX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TSVpFXDAiCisgICAiR0xfQUNUSVZFX0FUT01JQ19DT1VOVEVSX0JVRkZFUlNcMCIKKyAgICJHTF9VTklGT1JNX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9JTkRFWFwwIgorICAgIkdMX1VOU0lHTkVEX0lOVF9BVE9NSUNfQ09VTlRFUlwwIgorICAgIkdMX01BWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQklORElOR1NcMCIKKyAgICJHTF9ERUJVR19PVVRQVVRcMCIKKyAgICJHTF9OVU1fU0FNUExFX0NPVU5UU1wwIgorICAgIkdMX1BFUkZRVUVSWV9DT1VOVEVSX0VWRU5UX0lOVEVMXDAiCisgICAiR0xfUEVSRlFVRVJZX0NPVU5URVJfRFVSQVRJT05fTk9STV9JTlRFTFwwIgorICAgIkdMX1BFUkZRVUVSWV9DT1VOVEVSX0RVUkFUSU9OX1JBV19JTlRFTFwwIgorICAgIkdMX1BFUkZRVUVSWV9DT1VOVEVSX1RIUk9VR0hQVVRfSU5URUxcMCIKKyAgICJHTF9QRVJGUVVFUllfQ09VTlRFUl9SQVdfSU5URUxcMCIKKyAgICJHTF9QRVJGUVVFUllfQ09VTlRFUl9USU1FU1RBTVBfSU5URUxcMCIKKyAgICJHTF9QRVJGUVVFUllfQ09VTlRFUl9EQVRBX1VJTlQzMl9JTlRFTFwwIgorICAgIkdMX1BFUkZRVUVSWV9DT1VOVEVSX0RBVEFfVUlOVDY0X0lOVEVMXDAiCisgICAiR0xfUEVSRlFVRVJZX0NPVU5URVJfREFUQV9GTE9BVF9JTlRFTFwwIgorICAgIkdMX1BFUkZRVUVSWV9DT1VOVEVSX0RBVEFfRE9VQkxFX0lOVEVMXDAiCisgICAiR0xfUEVSRlFVRVJZX0NPVU5URVJfREFUQV9CT09MMzJfSU5URUxcMCIKKyAgICJHTF9QRVJGUVVFUllfUVVFUllfTkFNRV9MRU5HVEhfTUFYX0lOVEVMXDAiCisgICAiR0xfUEVSRlFVRVJZX0NPVU5URVJfTkFNRV9MRU5HVEhfTUFYX0lOVEVMXDAiCisgICAiR0xfUEVSRlFVRVJZX0NPVU5URVJfREVTQ19MRU5HVEhfTUFYX0lOVEVMXDAiCisgICAiR0xfUEVSRlFVRVJZX0dQQV9FWFRFTkRFRF9DT1VOVEVSU19JTlRFTFwwIgorICAgIkdMX0VWQUxfQklUXDAiCisgICAiR0xfUkFTVEVSX1BPU0lUSU9OX1VOQ0xJUFBFRF9JQk1cMCIKKyAgICJHTF9MSVNUX0JJVFwwIgorICAgIkdMX1RFWFRVUkVfQklUXDAiCisgICAiR0xfU0NJU1NPUl9CSVRcMCIKKyAgICJHTF9BTExfQVRUUklCX0JJVFNcMCIKKyAgICJHTF9NVUxUSVNBTVBMRV9CSVRcMCIKKyAgICJHTF9BTExfQ0xJRU5UX0FUVFJJQl9CSVRTXDAiCisgICA7CisKK3N0YXRpYyBjb25zdCBlbnVtX2VsdCBlbnVtX3N0cmluZ190YWJsZV9vZmZzZXRzWzIwMDddID0KK3sKKyAgIHsgICAgIDAsIDB4MDAwMDAwMDAgfSwgLyogR0xfRkFMU0UgKi8KKyAgIHsgICAgIDksIDB4MDAwMDAwMDEgfSwgLyogR0xfTElORVMgKi8KKyAgIHsgICAgMTgsIDB4MDAwMDAwMDIgfSwgLyogR0xfTElORV9MT09QICovCisgICB7ICAgIDMxLCAweDAwMDAwMDAzIH0sIC8qIEdMX0xJTkVfU1RSSVAgKi8KKyAgIHsgICAgNDUsIDB4MDAwMDAwMDQgfSwgLyogR0xfVFJJQU5HTEVTICovCisgICB7ICAgIDU4LCAweDAwMDAwMDA1IH0sIC8qIEdMX1RSSUFOR0xFX1NUUklQICovCisgICB7ICAgIDc2LCAweDAwMDAwMDA2IH0sIC8qIEdMX1RSSUFOR0xFX0ZBTiAqLworICAgeyAgICA5MiwgMHgwMDAwMDAwNyB9LCAvKiBHTF9RVUFEUyAqLworICAgeyAgIDEwMSwgMHgwMDAwMDAwOCB9LCAvKiBHTF9RVUFEX1NUUklQICovCisgICB7ICAgMTE1LCAweDAwMDAwMDA5IH0sIC8qIEdMX1BPTFlHT04gKi8KKyAgIHsgICAxMjYsIDB4MDAwMDAwMEEgfSwgLyogR0xfTElORVNfQURKQUNFTkNZICovCisgICB7ICAgMTQ1LCAweDAwMDAwMDBCIH0sIC8qIEdMX0xJTkVfU1RSSVBfQURKQUNFTkNZICovCisgICB7ICAgMTY5LCAweDAwMDAwMDBDIH0sIC8qIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1kgKi8KKyAgIHsgICAxOTIsIDB4MDAwMDAwMEQgfSwgLyogR0xfVFJJQU5HTEVfU1RSSVBfQURKQUNFTkNZICovCisgICB7ICAgMjIwLCAweDAwMDAwMDEwIH0sIC8qIEdMX1BPTFlHT05fU1RJUFBMRV9CSVQgKi8KKyAgIHsgICAyNDMsIDB4MDAwMDAwMjAgfSwgLyogR0xfUElYRUxfTU9ERV9CSVQgKi8KKyAgIHsgICAyNjEsIDB4MDAwMDAwNDAgfSwgLyogR0xfTElHSFRJTkdfQklUICovCisgICB7ICAgMjc3LCAweDAwMDAwMDgwIH0sIC8qIEdMX0ZPR19CSVQgKi8KKyAgIHsgICAyODgsIDB4MDAwMDAxMDAgfSwgLyogR0xfQUNDVU0gKi8KKyAgIHsgICAyOTcsIDB4MDAwMDAxMDEgfSwgLyogR0xfTE9BRCAqLworICAgeyAgIDMwNSwgMHgwMDAwMDEwMiB9LCAvKiBHTF9SRVRVUk4gKi8KKyAgIHsgICAzMTUsIDB4MDAwMDAxMDMgfSwgLyogR0xfTVVMVCAqLworICAgeyAgIDMyMywgMHgwMDAwMDEwNCB9LCAvKiBHTF9BREQgKi8KKyAgIHsgICAzMzAsIDB4MDAwMDAyMDAgfSwgLyogR0xfTkVWRVIgKi8KKyAgIHsgICAzMzksIDB4MDAwMDAyMDEgfSwgLyogR0xfTEVTUyAqLworICAgeyAgIDM0NywgMHgwMDAwMDIwMiB9LCAvKiBHTF9FUVVBTCAqLworICAgeyAgIDM1NiwgMHgwMDAwMDIwMyB9LCAvKiBHTF9MRVFVQUwgKi8KKyAgIHsgICAzNjYsIDB4MDAwMDAyMDQgfSwgLyogR0xfR1JFQVRFUiAqLworICAgeyAgIDM3NywgMHgwMDAwMDIwNSB9LCAvKiBHTF9OT1RFUVVBTCAqLworICAgeyAgIDM4OSwgMHgwMDAwMDIwNiB9LCAvKiBHTF9HRVFVQUwgKi8KKyAgIHsgICAzOTksIDB4MDAwMDAyMDcgfSwgLyogR0xfQUxXQVlTICovCisgICB7ICAgNDA5LCAweDAwMDAwMzAwIH0sIC8qIEdMX1NSQ19DT0xPUiAqLworICAgeyAgIDQyMiwgMHgwMDAwMDMwMSB9LCAvKiBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICovCisgICB7ICAgNDQ1LCAweDAwMDAwMzAyIH0sIC8qIEdMX1NSQ19BTFBIQSAqLworICAgeyAgIDQ1OCwgMHgwMDAwMDMwMyB9LCAvKiBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCisgICB7ICAgNDgxLCAweDAwMDAwMzA0IH0sIC8qIEdMX0RTVF9BTFBIQSAqLworICAgeyAgIDQ5NCwgMHgwMDAwMDMwNSB9LCAvKiBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCisgICB7ICAgNTE3LCAweDAwMDAwMzA2IH0sIC8qIEdMX0RTVF9DT0xPUiAqLworICAgeyAgIDUzMCwgMHgwMDAwMDMwNyB9LCAvKiBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICovCisgICB7ICAgNTUzLCAweDAwMDAwMzA4IH0sIC8qIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAqLworICAgeyAgIDU3NSwgMHgwMDAwMDQwMCB9LCAvKiBHTF9GUk9OVF9MRUZUICovCisgICB7ICAgNTg5LCAweDAwMDAwNDAxIH0sIC8qIEdMX0ZST05UX1JJR0hUICovCisgICB7ICAgNjA0LCAweDAwMDAwNDAyIH0sIC8qIEdMX0JBQ0tfTEVGVCAqLworICAgeyAgIDYxNywgMHgwMDAwMDQwMyB9LCAvKiBHTF9CQUNLX1JJR0hUICovCisgICB7ICAgNjMxLCAweDAwMDAwNDA0IH0sIC8qIEdMX0ZST05UICovCisgICB7ICAgNjQwLCAweDAwMDAwNDA1IH0sIC8qIEdMX0JBQ0sgKi8KKyAgIHsgICA2NDgsIDB4MDAwMDA0MDYgfSwgLyogR0xfTEVGVCAqLworICAgeyAgIDY1NiwgMHgwMDAwMDQwNyB9LCAvKiBHTF9SSUdIVCAqLworICAgeyAgIDY2NSwgMHgwMDAwMDQwOCB9LCAvKiBHTF9GUk9OVF9BTkRfQkFDSyAqLworICAgeyAgIDY4MywgMHgwMDAwMDQwOSB9LCAvKiBHTF9BVVgwICovCisgICB7ICAgNjkxLCAweDAwMDAwNDBBIH0sIC8qIEdMX0FVWDEgKi8KKyAgIHsgICA2OTksIDB4MDAwMDA0MEIgfSwgLyogR0xfQVVYMiAqLworICAgeyAgIDcwNywgMHgwMDAwMDQwQyB9LCAvKiBHTF9BVVgzICovCisgICB7ICAgNzE1LCAweDAwMDAwNTAwIH0sIC8qIEdMX0lOVkFMSURfRU5VTSAqLworICAgeyAgIDczMSwgMHgwMDAwMDUwMSB9LCAvKiBHTF9JTlZBTElEX1ZBTFVFICovCisgICB7ICAgNzQ4LCAweDAwMDAwNTAyIH0sIC8qIEdMX0lOVkFMSURfT1BFUkFUSU9OICovCisgICB7ICAgNzY5LCAweDAwMDAwNTAzIH0sIC8qIEdMX1NUQUNLX09WRVJGTE9XICovCisgICB7ICAgNzg3LCAweDAwMDAwNTA0IH0sIC8qIEdMX1NUQUNLX1VOREVSRkxPVyAqLworICAgeyAgIDgwNiwgMHgwMDAwMDUwNSB9LCAvKiBHTF9PVVRfT0ZfTUVNT1JZICovCisgICB7ICAgODIzLCAweDAwMDAwNTA2IH0sIC8qIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OICovCisgICB7ICAgODU2LCAweDAwMDAwNjAwIH0sIC8qIEdMXzJEICovCisgICB7ICAgODYyLCAweDAwMDAwNjAxIH0sIC8qIEdMXzNEICovCisgICB7ICAgODY4LCAweDAwMDAwNjAyIH0sIC8qIEdMXzNEX0NPTE9SICovCisgICB7ICAgODgwLCAweDAwMDAwNjAzIH0sIC8qIEdMXzNEX0NPTE9SX1RFWFRVUkUgKi8KKyAgIHsgICA5MDAsIDB4MDAwMDA2MDQgfSwgLyogR0xfNERfQ09MT1JfVEVYVFVSRSAqLworICAgeyAgIDkyMCwgMHgwMDAwMDcwMCB9LCAvKiBHTF9QQVNTX1RIUk9VR0hfVE9LRU4gKi8KKyAgIHsgICA5NDIsIDB4MDAwMDA3MDEgfSwgLyogR0xfUE9JTlRfVE9LRU4gKi8KKyAgIHsgICA5NTcsIDB4MDAwMDA3MDIgfSwgLyogR0xfTElORV9UT0tFTiAqLworICAgeyAgIDk3MSwgMHgwMDAwMDcwMyB9LCAvKiBHTF9QT0xZR09OX1RPS0VOICovCisgICB7ICAgOTg4LCAweDAwMDAwNzA0IH0sIC8qIEdMX0JJVE1BUF9UT0tFTiAqLworICAgeyAgMTAwNCwgMHgwMDAwMDcwNSB9LCAvKiBHTF9EUkFXX1BJWEVMX1RPS0VOICovCisgICB7ICAxMDI0LCAweDAwMDAwNzA2IH0sIC8qIEdMX0NPUFlfUElYRUxfVE9LRU4gKi8KKyAgIHsgIDEwNDQsIDB4MDAwMDA3MDcgfSwgLyogR0xfTElORV9SRVNFVF9UT0tFTiAqLworICAgeyAgMTA2NCwgMHgwMDAwMDgwMCB9LCAvKiBHTF9FWFAgKi8KKyAgIHsgIDEwNzEsIDB4MDAwMDA4MDEgfSwgLyogR0xfRVhQMiAqLworICAgeyAgMTA3OSwgMHgwMDAwMDkwMCB9LCAvKiBHTF9DVyAqLworICAgeyAgMTA4NSwgMHgwMDAwMDkwMSB9LCAvKiBHTF9DQ1cgKi8KKyAgIHsgIDEwOTIsIDB4MDAwMDBBMDAgfSwgLyogR0xfQ09FRkYgKi8KKyAgIHsgIDExMDEsIDB4MDAwMDBBMDEgfSwgLyogR0xfT1JERVIgKi8KKyAgIHsgIDExMTAsIDB4MDAwMDBBMDIgfSwgLyogR0xfRE9NQUlOICovCisgICB7ICAxMTIwLCAweDAwMDAwQjAwIH0sIC8qIEdMX0NVUlJFTlRfQ09MT1IgKi8KKyAgIHsgIDExMzcsIDB4MDAwMDBCMDEgfSwgLyogR0xfQ1VSUkVOVF9JTkRFWCAqLworICAgeyAgMTE1NCwgMHgwMDAwMEIwMiB9LCAvKiBHTF9DVVJSRU5UX05PUk1BTCAqLworICAgeyAgMTE3MiwgMHgwMDAwMEIwMyB9LCAvKiBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTICovCisgICB7ICAxMTk4LCAweDAwMDAwQjA0IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0NPTE9SICovCisgICB7ICAxMjIyLCAweDAwMDAwQjA1IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0lOREVYICovCisgICB7ICAxMjQ2LCAweDAwMDAwQjA2IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1RFWFRVUkVfQ09PUkRTICovCisgICB7ICAxMjc5LCAweDAwMDAwQjA3IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OICovCisgICB7ICAxMzA2LCAweDAwMDAwQjA4IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OX1ZBTElEICovCisgICB7ICAxMzM5LCAweDAwMDAwQjA5IH0sIC8qIEdMX0NVUlJFTlRfUkFTVEVSX0RJU1RBTkNFICovCisgICB7ICAxMzY2LCAweDAwMDAwQjEwIH0sIC8qIEdMX1BPSU5UX1NNT09USCAqLworICAgeyAgMTM4MiwgMHgwMDAwMEIxMSB9LCAvKiBHTF9QT0lOVF9TSVpFICovCisgICB7ICAxMzk2LCAweDAwMDAwQjEyIH0sIC8qIEdMX1BPSU5UX1NJWkVfUkFOR0UgKi8KKyAgIHsgIDE0MTYsIDB4MDAwMDBCMTMgfSwgLyogR0xfUE9JTlRfU0laRV9HUkFOVUxBUklUWSAqLworICAgeyAgMTQ0MiwgMHgwMDAwMEIyMCB9LCAvKiBHTF9MSU5FX1NNT09USCAqLworICAgeyAgMTQ1NywgMHgwMDAwMEIyMSB9LCAvKiBHTF9MSU5FX1dJRFRIICovCisgICB7ICAxNDcxLCAweDAwMDAwQjIyIH0sIC8qIEdMX0xJTkVfV0lEVEhfUkFOR0UgKi8KKyAgIHsgIDE0OTEsIDB4MDAwMDBCMjMgfSwgLyogR0xfTElORV9XSURUSF9HUkFOVUxBUklUWSAqLworICAgeyAgMTUxNywgMHgwMDAwMEIyNCB9LCAvKiBHTF9MSU5FX1NUSVBQTEUgKi8KKyAgIHsgIDE1MzMsIDB4MDAwMDBCMjUgfSwgLyogR0xfTElORV9TVElQUExFX1BBVFRFUk4gKi8KKyAgIHsgIDE1NTcsIDB4MDAwMDBCMjYgfSwgLyogR0xfTElORV9TVElQUExFX1JFUEVBVCAqLworICAgeyAgMTU4MCwgMHgwMDAwMEIzMCB9LCAvKiBHTF9MSVNUX01PREUgKi8KKyAgIHsgIDE1OTMsIDB4MDAwMDBCMzEgfSwgLyogR0xfTUFYX0xJU1RfTkVTVElORyAqLworICAgeyAgMTYxMywgMHgwMDAwMEIzMiB9LCAvKiBHTF9MSVNUX0JBU0UgKi8KKyAgIHsgIDE2MjYsIDB4MDAwMDBCMzMgfSwgLyogR0xfTElTVF9JTkRFWCAqLworICAgeyAgMTY0MCwgMHgwMDAwMEI0MCB9LCAvKiBHTF9QT0xZR09OX01PREUgKi8KKyAgIHsgIDE2NTYsIDB4MDAwMDBCNDEgfSwgLyogR0xfUE9MWUdPTl9TTU9PVEggKi8KKyAgIHsgIDE2NzQsIDB4MDAwMDBCNDIgfSwgLyogR0xfUE9MWUdPTl9TVElQUExFICovCisgICB7ICAxNjkzLCAweDAwMDAwQjQzIH0sIC8qIEdMX0VER0VfRkxBRyAqLworICAgeyAgMTcwNiwgMHgwMDAwMEI0NCB9LCAvKiBHTF9DVUxMX0ZBQ0UgKi8KKyAgIHsgIDE3MTksIDB4MDAwMDBCNDUgfSwgLyogR0xfQ1VMTF9GQUNFX01PREUgKi8KKyAgIHsgIDE3MzcsIDB4MDAwMDBCNDYgfSwgLyogR0xfRlJPTlRfRkFDRSAqLworICAgeyAgMTc1MSwgMHgwMDAwMEI1MCB9LCAvKiBHTF9MSUdIVElORyAqLworICAgeyAgMTc2MywgMHgwMDAwMEI1MSB9LCAvKiBHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIgKi8KKyAgIHsgIDE3OTEsIDB4MDAwMDBCNTIgfSwgLyogR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgKi8KKyAgIHsgIDE4MTUsIDB4MDAwMDBCNTMgfSwgLyogR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAqLworICAgeyAgMTgzOCwgMHgwMDAwMEI1NCB9LCAvKiBHTF9TSEFERV9NT0RFTCAqLworICAgeyAgMTg1MywgMHgwMDAwMEI1NSB9LCAvKiBHTF9DT0xPUl9NQVRFUklBTF9GQUNFICovCisgICB7ICAxODc2LCAweDAwMDAwQjU2IH0sIC8qIEdMX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUiAqLworICAgeyAgMTkwNCwgMHgwMDAwMEI1NyB9LCAvKiBHTF9DT0xPUl9NQVRFUklBTCAqLworICAgeyAgMTkyMiwgMHgwMDAwMEI2MCB9LCAvKiBHTF9GT0cgKi8KKyAgIHsgIDE5MjksIDB4MDAwMDBCNjEgfSwgLyogR0xfRk9HX0lOREVYICovCisgICB7ICAxOTQyLCAweDAwMDAwQjYyIH0sIC8qIEdMX0ZPR19ERU5TSVRZICovCisgICB7ICAxOTU3LCAweDAwMDAwQjYzIH0sIC8qIEdMX0ZPR19TVEFSVCAqLworICAgeyAgMTk3MCwgMHgwMDAwMEI2NCB9LCAvKiBHTF9GT0dfRU5EICovCisgICB7ICAxOTgxLCAweDAwMDAwQjY1IH0sIC8qIEdMX0ZPR19NT0RFICovCisgICB7ICAxOTkzLCAweDAwMDAwQjY2IH0sIC8qIEdMX0ZPR19DT0xPUiAqLworICAgeyAgMjAwNiwgMHgwMDAwMEI3MCB9LCAvKiBHTF9ERVBUSF9SQU5HRSAqLworICAgeyAgMjAyMSwgMHgwMDAwMEI3MSB9LCAvKiBHTF9ERVBUSF9URVNUICovCisgICB7ICAyMDM1LCAweDAwMDAwQjcyIH0sIC8qIEdMX0RFUFRIX1dSSVRFTUFTSyAqLworICAgeyAgMjA1NCwgMHgwMDAwMEI3MyB9LCAvKiBHTF9ERVBUSF9DTEVBUl9WQUxVRSAqLworICAgeyAgMjA3NSwgMHgwMDAwMEI3NCB9LCAvKiBHTF9ERVBUSF9GVU5DICovCisgICB7ICAyMDg5LCAweDAwMDAwQjgwIH0sIC8qIEdMX0FDQ1VNX0NMRUFSX1ZBTFVFICovCisgICB7ICAyMTEwLCAweDAwMDAwQjkwIH0sIC8qIEdMX1NURU5DSUxfVEVTVCAqLworICAgeyAgMjEyNiwgMHgwMDAwMEI5MSB9LCAvKiBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFICovCisgICB7ICAyMTQ5LCAweDAwMDAwQjkyIH0sIC8qIEdMX1NURU5DSUxfRlVOQyAqLworICAgeyAgMjE2NSwgMHgwMDAwMEI5MyB9LCAvKiBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgKi8KKyAgIHsgIDIxODcsIDB4MDAwMDBCOTQgfSwgLyogR0xfU1RFTkNJTF9GQUlMICovCisgICB7ICAyMjAzLCAweDAwMDAwQjk1IH0sIC8qIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICovCisgICB7ICAyMjMwLCAweDAwMDAwQjk2IH0sIC8qIEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTICovCisgICB7ICAyMjU3LCAweDAwMDAwQjk3IH0sIC8qIEdMX1NURU5DSUxfUkVGICovCisgICB7ICAyMjcyLCAweDAwMDAwQjk4IH0sIC8qIEdMX1NURU5DSUxfV1JJVEVNQVNLICovCisgICB7ICAyMjkzLCAweDAwMDAwQkEwIH0sIC8qIEdMX01BVFJJWF9NT0RFICovCisgICB7ICAyMzA4LCAweDAwMDAwQkExIH0sIC8qIEdMX05PUk1BTElaRSAqLworICAgeyAgMjMyMSwgMHgwMDAwMEJBMiB9LCAvKiBHTF9WSUVXUE9SVCAqLworICAgeyAgMjMzMywgMHgwMDAwMEJBMyB9LCAvKiBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggKi8KKyAgIHsgIDIzNTgsIDB4MDAwMDBCQTQgfSwgLyogR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAqLworICAgeyAgMjM4NCwgMHgwMDAwMEJBNSB9LCAvKiBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICovCisgICB7ICAyNDA3LCAweDAwMDAwQkE2IH0sIC8qIEdMX01PREVMVklFV19NQVRSSVggKi8KKyAgIHsgIDI0MjcsIDB4MDAwMDBCQTcgfSwgLyogR0xfUFJPSkVDVElPTl9NQVRSSVggKi8KKyAgIHsgIDI0NDgsIDB4MDAwMDBCQTggfSwgLyogR0xfVEVYVFVSRV9NQVRSSVggKi8KKyAgIHsgIDI0NjYsIDB4MDAwMDBCQjAgfSwgLyogR0xfQVRUUklCX1NUQUNLX0RFUFRIICovCisgICB7ICAyNDg4LCAweDAwMDAwQkIxIH0sIC8qIEdMX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEggKi8KKyAgIHsgIDI1MTcsIDB4MDAwMDBCQzAgfSwgLyogR0xfQUxQSEFfVEVTVCAqLworICAgeyAgMjUzMSwgMHgwMDAwMEJDMSB9LCAvKiBHTF9BTFBIQV9URVNUX0ZVTkMgKi8KKyAgIHsgIDI1NTAsIDB4MDAwMDBCQzIgfSwgLyogR0xfQUxQSEFfVEVTVF9SRUYgKi8KKyAgIHsgIDI1NjgsIDB4MDAwMDBCRDAgfSwgLyogR0xfRElUSEVSICovCisgICB7ICAyNTc4LCAweDAwMDAwQkUwIH0sIC8qIEdMX0JMRU5EX0RTVCAqLworICAgeyAgMjU5MSwgMHgwMDAwMEJFMSB9LCAvKiBHTF9CTEVORF9TUkMgKi8KKyAgIHsgIDI2MDQsIDB4MDAwMDBCRTIgfSwgLyogR0xfQkxFTkQgKi8KKyAgIHsgIDI2MTMsIDB4MDAwMDBCRjAgfSwgLyogR0xfTE9HSUNfT1BfTU9ERSAqLworICAgeyAgMjYzMCwgMHgwMDAwMEJGMSB9LCAvKiBHTF9JTkRFWF9MT0dJQ19PUCAqLworICAgeyAgMjY0OCwgMHgwMDAwMEJGMiB9LCAvKiBHTF9DT0xPUl9MT0dJQ19PUCAqLworICAgeyAgMjY2NiwgMHgwMDAwMEMwMCB9LCAvKiBHTF9BVVhfQlVGRkVSUyAqLworICAgeyAgMjY4MSwgMHgwMDAwMEMwMSB9LCAvKiBHTF9EUkFXX0JVRkZFUiAqLworICAgeyAgMjY5NiwgMHgwMDAwMEMwMiB9LCAvKiBHTF9SRUFEX0JVRkZFUiAqLworICAgeyAgMjcxMSwgMHgwMDAwMEMxMCB9LCAvKiBHTF9TQ0lTU09SX0JPWCAqLworICAgeyAgMjcyNiwgMHgwMDAwMEMxMSB9LCAvKiBHTF9TQ0lTU09SX1RFU1QgKi8KKyAgIHsgIDI3NDIsIDB4MDAwMDBDMjAgfSwgLyogR0xfSU5ERVhfQ0xFQVJfVkFMVUUgKi8KKyAgIHsgIDI3NjMsIDB4MDAwMDBDMjEgfSwgLyogR0xfSU5ERVhfV1JJVEVNQVNLICovCisgICB7ICAyNzgyLCAweDAwMDAwQzIyIH0sIC8qIEdMX0NPTE9SX0NMRUFSX1ZBTFVFICovCisgICB7ICAyODAzLCAweDAwMDAwQzIzIH0sIC8qIEdMX0NPTE9SX1dSSVRFTUFTSyAqLworICAgeyAgMjgyMiwgMHgwMDAwMEMzMCB9LCAvKiBHTF9JTkRFWF9NT0RFICovCisgICB7ICAyODM2LCAweDAwMDAwQzMxIH0sIC8qIEdMX1JHQkFfTU9ERSAqLworICAgeyAgMjg0OSwgMHgwMDAwMEMzMiB9LCAvKiBHTF9ET1VCTEVCVUZGRVIgKi8KKyAgIHsgIDI4NjUsIDB4MDAwMDBDMzMgfSwgLyogR0xfU1RFUkVPICovCisgICB7ICAyODc1LCAweDAwMDAwQzQwIH0sIC8qIEdMX1JFTkRFUl9NT0RFICovCisgICB7ICAyODkwLCAweDAwMDAwQzUwIH0sIC8qIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAqLworICAgeyAgMjkyMSwgMHgwMDAwMEM1MSB9LCAvKiBHTF9QT0lOVF9TTU9PVEhfSElOVCAqLworICAgeyAgMjk0MiwgMHgwMDAwMEM1MiB9LCAvKiBHTF9MSU5FX1NNT09USF9ISU5UICovCisgICB7ICAyOTYyLCAweDAwMDAwQzUzIH0sIC8qIEdMX1BPTFlHT05fU01PT1RIX0hJTlQgKi8KKyAgIHsgIDI5ODUsIDB4MDAwMDBDNTQgfSwgLyogR0xfRk9HX0hJTlQgKi8KKyAgIHsgIDI5OTcsIDB4MDAwMDBDNjAgfSwgLyogR0xfVEVYVFVSRV9HRU5fUyAqLworICAgeyAgMzAxNCwgMHgwMDAwMEM2MSB9LCAvKiBHTF9URVhUVVJFX0dFTl9UICovCisgICB7ICAzMDMxLCAweDAwMDAwQzYyIH0sIC8qIEdMX1RFWFRVUkVfR0VOX1IgKi8KKyAgIHsgIDMwNDgsIDB4MDAwMDBDNjMgfSwgLyogR0xfVEVYVFVSRV9HRU5fUSAqLworICAgeyAgMzA2NSwgMHgwMDAwMEM3MCB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19JICovCisgICB7ICAzMDg1LCAweDAwMDAwQzcxIH0sIC8qIEdMX1BJWEVMX01BUF9TX1RPX1MgKi8KKyAgIHsgIDMxMDUsIDB4MDAwMDBDNzIgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fUiAqLworICAgeyAgMzEyNSwgMHgwMDAwMEM3MyB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19HICovCisgICB7ICAzMTQ1LCAweDAwMDAwQzc0IH0sIC8qIEdMX1BJWEVMX01BUF9JX1RPX0IgKi8KKyAgIHsgIDMxNjUsIDB4MDAwMDBDNzUgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fQSAqLworICAgeyAgMzE4NSwgMHgwMDAwMEM3NiB9LCAvKiBHTF9QSVhFTF9NQVBfUl9UT19SICovCisgICB7ICAzMjA1LCAweDAwMDAwQzc3IH0sIC8qIEdMX1BJWEVMX01BUF9HX1RPX0cgKi8KKyAgIHsgIDMyMjUsIDB4MDAwMDBDNzggfSwgLyogR0xfUElYRUxfTUFQX0JfVE9fQiAqLworICAgeyAgMzI0NSwgMHgwMDAwMEM3OSB9LCAvKiBHTF9QSVhFTF9NQVBfQV9UT19BICovCisgICB7ICAzMjY1LCAweDAwMDAwQ0IwIH0sIC8qIEdMX1BJWEVMX01BUF9JX1RPX0lfU0laRSAqLworICAgeyAgMzI5MCwgMHgwMDAwMENCMSB9LCAvKiBHTF9QSVhFTF9NQVBfU19UT19TX1NJWkUgKi8KKyAgIHsgIDMzMTUsIDB4MDAwMDBDQjIgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fUl9TSVpFICovCisgICB7ICAzMzQwLCAweDAwMDAwQ0IzIH0sIC8qIEdMX1BJWEVMX01BUF9JX1RPX0dfU0laRSAqLworICAgeyAgMzM2NSwgMHgwMDAwMENCNCB9LCAvKiBHTF9QSVhFTF9NQVBfSV9UT19CX1NJWkUgKi8KKyAgIHsgIDMzOTAsIDB4MDAwMDBDQjUgfSwgLyogR0xfUElYRUxfTUFQX0lfVE9fQV9TSVpFICovCisgICB7ICAzNDE1LCAweDAwMDAwQ0I2IH0sIC8qIEdMX1BJWEVMX01BUF9SX1RPX1JfU0laRSAqLworICAgeyAgMzQ0MCwgMHgwMDAwMENCNyB9LCAvKiBHTF9QSVhFTF9NQVBfR19UT19HX1NJWkUgKi8KKyAgIHsgIDM0NjUsIDB4MDAwMDBDQjggfSwgLyogR0xfUElYRUxfTUFQX0JfVE9fQl9TSVpFICovCisgICB7ICAzNDkwLCAweDAwMDAwQ0I5IH0sIC8qIEdMX1BJWEVMX01BUF9BX1RPX0FfU0laRSAqLworICAgeyAgMzUxNSwgMHgwMDAwMENGMCB9LCAvKiBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLworICAgeyAgMzUzNiwgMHgwMDAwMENGMSB9LCAvKiBHTF9VTlBBQ0tfTFNCX0ZJUlNUICovCisgICB7ICAzNTU2LCAweDAwMDAwQ0YyIH0sIC8qIEdMX1VOUEFDS19ST1dfTEVOR1RIICovCisgICB7ICAzNTc3LCAweDAwMDAwQ0YzIH0sIC8qIEdMX1VOUEFDS19TS0lQX1JPV1MgKi8KKyAgIHsgIDM1OTcsIDB4MDAwMDBDRjQgfSwgLyogR0xfVU5QQUNLX1NLSVBfUElYRUxTICovCisgICB7ICAzNjE5LCAweDAwMDAwQ0Y1IH0sIC8qIEdMX1VOUEFDS19BTElHTk1FTlQgKi8KKyAgIHsgIDM2MzksIDB4MDAwMDBEMDAgfSwgLyogR0xfUEFDS19TV0FQX0JZVEVTICovCisgICB7ICAzNjU4LCAweDAwMDAwRDAxIH0sIC8qIEdMX1BBQ0tfTFNCX0ZJUlNUICovCisgICB7ICAzNjc2LCAweDAwMDAwRDAyIH0sIC8qIEdMX1BBQ0tfUk9XX0xFTkdUSCAqLworICAgeyAgMzY5NSwgMHgwMDAwMEQwMyB9LCAvKiBHTF9QQUNLX1NLSVBfUk9XUyAqLworICAgeyAgMzcxMywgMHgwMDAwMEQwNCB9LCAvKiBHTF9QQUNLX1NLSVBfUElYRUxTICovCisgICB7ICAzNzMzLCAweDAwMDAwRDA1IH0sIC8qIEdMX1BBQ0tfQUxJR05NRU5UICovCisgICB7ICAzNzUxLCAweDAwMDAwRDEwIH0sIC8qIEdMX01BUF9DT0xPUiAqLworICAgeyAgMzc2NCwgMHgwMDAwMEQxMSB9LCAvKiBHTF9NQVBfU1RFTkNJTCAqLworICAgeyAgMzc3OSwgMHgwMDAwMEQxMiB9LCAvKiBHTF9JTkRFWF9TSElGVCAqLworICAgeyAgMzc5NCwgMHgwMDAwMEQxMyB9LCAvKiBHTF9JTkRFWF9PRkZTRVQgKi8KKyAgIHsgIDM4MTAsIDB4MDAwMDBEMTQgfSwgLyogR0xfUkVEX1NDQUxFICovCisgICB7ICAzODIzLCAweDAwMDAwRDE1IH0sIC8qIEdMX1JFRF9CSUFTICovCisgICB7ICAzODM1LCAweDAwMDAwRDE2IH0sIC8qIEdMX1pPT01fWCAqLworICAgeyAgMzg0NSwgMHgwMDAwMEQxNyB9LCAvKiBHTF9aT09NX1kgKi8KKyAgIHsgIDM4NTUsIDB4MDAwMDBEMTggfSwgLyogR0xfR1JFRU5fU0NBTEUgKi8KKyAgIHsgIDM4NzAsIDB4MDAwMDBEMTkgfSwgLyogR0xfR1JFRU5fQklBUyAqLworICAgeyAgMzg4NCwgMHgwMDAwMEQxQSB9LCAvKiBHTF9CTFVFX1NDQUxFICovCisgICB7ICAzODk4LCAweDAwMDAwRDFCIH0sIC8qIEdMX0JMVUVfQklBUyAqLworICAgeyAgMzkxMSwgMHgwMDAwMEQxQyB9LCAvKiBHTF9BTFBIQV9TQ0FMRSAqLworICAgeyAgMzkyNiwgMHgwMDAwMEQxRCB9LCAvKiBHTF9BTFBIQV9CSUFTICovCisgICB7ICAzOTQwLCAweDAwMDAwRDFFIH0sIC8qIEdMX0RFUFRIX1NDQUxFICovCisgICB7ICAzOTU1LCAweDAwMDAwRDFGIH0sIC8qIEdMX0RFUFRIX0JJQVMgKi8KKyAgIHsgIDM5NjksIDB4MDAwMDBEMzAgfSwgLyogR0xfTUFYX0VWQUxfT1JERVIgKi8KKyAgIHsgIDM5ODcsIDB4MDAwMDBEMzEgfSwgLyogR0xfTUFYX0xJR0hUUyAqLworICAgeyAgNDAwMSwgMHgwMDAwMEQzMiB9LCAvKiBHTF9NQVhfQ0xJUF9ESVNUQU5DRVMgKi8KKyAgIHsgIDQwMjMsIDB4MDAwMDBEMzMgfSwgLyogR0xfTUFYX1RFWFRVUkVfU0laRSAqLworICAgeyAgNDA0MywgMHgwMDAwMEQzNCB9LCAvKiBHTF9NQVhfUElYRUxfTUFQX1RBQkxFICovCisgICB7ICA0MDY2LCAweDAwMDAwRDM1IH0sIC8qIEdMX01BWF9BVFRSSUJfU1RBQ0tfREVQVEggKi8KKyAgIHsgIDQwOTIsIDB4MDAwMDBEMzYgfSwgLyogR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAqLworICAgeyAgNDEyMSwgMHgwMDAwMEQzNyB9LCAvKiBHTF9NQVhfTkFNRV9TVEFDS19ERVBUSCAqLworICAgeyAgNDE0NSwgMHgwMDAwMEQzOCB9LCAvKiBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAqLworICAgeyAgNDE3NSwgMHgwMDAwMEQzOSB9LCAvKiBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAqLworICAgeyAgNDIwMiwgMHgwMDAwMEQzQSB9LCAvKiBHTF9NQVhfVklFV1BPUlRfRElNUyAqLworICAgeyAgNDIyMywgMHgwMDAwMEQzQiB9LCAvKiBHTF9NQVhfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSCAqLworICAgeyAgNDI1NiwgMHgwMDAwMEQ1MCB9LCAvKiBHTF9TVUJQSVhFTF9CSVRTICovCisgICB7ICA0MjczLCAweDAwMDAwRDUxIH0sIC8qIEdMX0lOREVYX0JJVFMgKi8KKyAgIHsgIDQyODcsIDB4MDAwMDBENTIgfSwgLyogR0xfUkVEX0JJVFMgKi8KKyAgIHsgIDQyOTksIDB4MDAwMDBENTMgfSwgLyogR0xfR1JFRU5fQklUUyAqLworICAgeyAgNDMxMywgMHgwMDAwMEQ1NCB9LCAvKiBHTF9CTFVFX0JJVFMgKi8KKyAgIHsgIDQzMjYsIDB4MDAwMDBENTUgfSwgLyogR0xfQUxQSEFfQklUUyAqLworICAgeyAgNDM0MCwgMHgwMDAwMEQ1NiB9LCAvKiBHTF9ERVBUSF9CSVRTICovCisgICB7ICA0MzU0LCAweDAwMDAwRDU3IH0sIC8qIEdMX1NURU5DSUxfQklUUyAqLworICAgeyAgNDM3MCwgMHgwMDAwMEQ1OCB9LCAvKiBHTF9BQ0NVTV9SRURfQklUUyAqLworICAgeyAgNDM4OCwgMHgwMDAwMEQ1OSB9LCAvKiBHTF9BQ0NVTV9HUkVFTl9CSVRTICovCisgICB7ICA0NDA4LCAweDAwMDAwRDVBIH0sIC8qIEdMX0FDQ1VNX0JMVUVfQklUUyAqLworICAgeyAgNDQyNywgMHgwMDAwMEQ1QiB9LCAvKiBHTF9BQ0NVTV9BTFBIQV9CSVRTICovCisgICB7ICA0NDQ3LCAweDAwMDAwRDcwIH0sIC8qIEdMX05BTUVfU1RBQ0tfREVQVEggKi8KKyAgIHsgIDQ0NjcsIDB4MDAwMDBEODAgfSwgLyogR0xfQVVUT19OT1JNQUwgKi8KKyAgIHsgIDQ0ODIsIDB4MDAwMDBEOTAgfSwgLyogR0xfTUFQMV9DT0xPUl80ICovCisgICB7ICA0NDk4LCAweDAwMDAwRDkxIH0sIC8qIEdMX01BUDFfSU5ERVggKi8KKyAgIHsgIDQ1MTIsIDB4MDAwMDBEOTIgfSwgLyogR0xfTUFQMV9OT1JNQUwgKi8KKyAgIHsgIDQ1MjcsIDB4MDAwMDBEOTMgfSwgLyogR0xfTUFQMV9URVhUVVJFX0NPT1JEXzEgKi8KKyAgIHsgIDQ1NTEsIDB4MDAwMDBEOTQgfSwgLyogR0xfTUFQMV9URVhUVVJFX0NPT1JEXzIgKi8KKyAgIHsgIDQ1NzUsIDB4MDAwMDBEOTUgfSwgLyogR0xfTUFQMV9URVhUVVJFX0NPT1JEXzMgKi8KKyAgIHsgIDQ1OTksIDB4MDAwMDBEOTYgfSwgLyogR0xfTUFQMV9URVhUVVJFX0NPT1JEXzQgKi8KKyAgIHsgIDQ2MjMsIDB4MDAwMDBEOTcgfSwgLyogR0xfTUFQMV9WRVJURVhfMyAqLworICAgeyAgNDY0MCwgMHgwMDAwMEQ5OCB9LCAvKiBHTF9NQVAxX1ZFUlRFWF80ICovCisgICB7ICA0NjU3LCAweDAwMDAwREIwIH0sIC8qIEdMX01BUDJfQ09MT1JfNCAqLworICAgeyAgNDY3MywgMHgwMDAwMERCMSB9LCAvKiBHTF9NQVAyX0lOREVYICovCisgICB7ICA0Njg3LCAweDAwMDAwREIyIH0sIC8qIEdMX01BUDJfTk9STUFMICovCisgICB7ICA0NzAyLCAweDAwMDAwREIzIH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8xICovCisgICB7ICA0NzI2LCAweDAwMDAwREI0IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCisgICB7ICA0NzUwLCAweDAwMDAwREI1IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCisgICB7ICA0Nzc0LCAweDAwMDAwREI2IH0sIC8qIEdMX01BUDJfVEVYVFVSRV9DT09SRF80ICovCisgICB7ICA0Nzk4LCAweDAwMDAwREI3IH0sIC8qIEdMX01BUDJfVkVSVEVYXzMgKi8KKyAgIHsgIDQ4MTUsIDB4MDAwMDBEQjggfSwgLyogR0xfTUFQMl9WRVJURVhfNCAqLworICAgeyAgNDgzMiwgMHgwMDAwMEREMCB9LCAvKiBHTF9NQVAxX0dSSURfRE9NQUlOICovCisgICB7ICA0ODUyLCAweDAwMDAwREQxIH0sIC8qIEdMX01BUDFfR1JJRF9TRUdNRU5UUyAqLworICAgeyAgNDg3NCwgMHgwMDAwMEREMiB9LCAvKiBHTF9NQVAyX0dSSURfRE9NQUlOICovCisgICB7ICA0ODk0LCAweDAwMDAwREQzIH0sIC8qIEdMX01BUDJfR1JJRF9TRUdNRU5UUyAqLworICAgeyAgNDkxNiwgMHgwMDAwMERFMCB9LCAvKiBHTF9URVhUVVJFXzFEICovCisgICB7ICA0OTMwLCAweDAwMDAwREUxIH0sIC8qIEdMX1RFWFRVUkVfMkQgKi8KKyAgIHsgIDQ5NDQsIDB4MDAwMDBERjAgfSwgLyogR0xfRkVFREJBQ0tfQlVGRkVSX1BPSU5URVIgKi8KKyAgIHsgIDQ5NzEsIDB4MDAwMDBERjEgfSwgLyogR0xfRkVFREJBQ0tfQlVGRkVSX1NJWkUgKi8KKyAgIHsgIDQ5OTUsIDB4MDAwMDBERjIgfSwgLyogR0xfRkVFREJBQ0tfQlVGRkVSX1RZUEUgKi8KKyAgIHsgIDUwMTksIDB4MDAwMDBERjMgfSwgLyogR0xfU0VMRUNUSU9OX0JVRkZFUl9QT0lOVEVSICovCisgICB7ICA1MDQ3LCAweDAwMDAwREY0IH0sIC8qIEdMX1NFTEVDVElPTl9CVUZGRVJfU0laRSAqLworICAgeyAgNTA3MiwgMHgwMDAwMTAwMCB9LCAvKiBHTF9URVhUVVJFX1dJRFRIICovCisgICB7ICA1MDg5LCAweDAwMDAxMDAxIH0sIC8qIEdMX1RFWFRVUkVfSEVJR0hUICovCisgICB7ICA1MTA3LCAweDAwMDAxMDAzIH0sIC8qIEdMX1RFWFRVUkVfQ09NUE9ORU5UUyAqLworICAgeyAgNTEyOSwgMHgwMDAwMTAwNCB9LCAvKiBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiAqLworICAgeyAgNTE1MywgMHgwMDAwMTAwNSB9LCAvKiBHTF9URVhUVVJFX0JPUkRFUiAqLworICAgeyAgNTE3MSwgMHgwMDAwMTEwMCB9LCAvKiBHTF9ET05UX0NBUkUgKi8KKyAgIHsgIDUxODQsIDB4MDAwMDExMDEgfSwgLyogR0xfRkFTVEVTVCAqLworICAgeyAgNTE5NSwgMHgwMDAwMTEwMiB9LCAvKiBHTF9OSUNFU1QgKi8KKyAgIHsgIDUyMDUsIDB4MDAwMDEyMDAgfSwgLyogR0xfQU1CSUVOVCAqLworICAgeyAgNTIxNiwgMHgwMDAwMTIwMSB9LCAvKiBHTF9ESUZGVVNFICovCisgICB7ICA1MjI3LCAweDAwMDAxMjAyIH0sIC8qIEdMX1NQRUNVTEFSICovCisgICB7ICA1MjM5LCAweDAwMDAxMjAzIH0sIC8qIEdMX1BPU0lUSU9OICovCisgICB7ICA1MjUxLCAweDAwMDAxMjA0IH0sIC8qIEdMX1NQT1RfRElSRUNUSU9OICovCisgICB7ICA1MjY5LCAweDAwMDAxMjA1IH0sIC8qIEdMX1NQT1RfRVhQT05FTlQgKi8KKyAgIHsgIDUyODYsIDB4MDAwMDEyMDYgfSwgLyogR0xfU1BPVF9DVVRPRkYgKi8KKyAgIHsgIDUzMDEsIDB4MDAwMDEyMDcgfSwgLyogR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gKi8KKyAgIHsgIDUzMjUsIDB4MDAwMDEyMDggfSwgLyogR0xfTElORUFSX0FUVEVOVUFUSU9OICovCisgICB7ICA1MzQ3LCAweDAwMDAxMjA5IH0sIC8qIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAqLworICAgeyAgNTM3MiwgMHgwMDAwMTMwMCB9LCAvKiBHTF9DT01QSUxFICovCisgICB7ICA1MzgzLCAweDAwMDAxMzAxIH0sIC8qIEdMX0NPTVBJTEVfQU5EX0VYRUNVVEUgKi8KKyAgIHsgIDU0MDYsIDB4MDAwMDE0MDAgfSwgLyogR0xfQllURSAqLworICAgeyAgNTQxNCwgMHgwMDAwMTQwMSB9LCAvKiBHTF9VTlNJR05FRF9CWVRFICovCisgICB7ICA1NDMxLCAweDAwMDAxNDAyIH0sIC8qIEdMX1NIT1JUICovCisgICB7ICA1NDQwLCAweDAwMDAxNDAzIH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUICovCisgICB7ICA1NDU4LCAweDAwMDAxNDA0IH0sIC8qIEdMX0lOVCAqLworICAgeyAgNTQ2NSwgMHgwMDAwMTQwNSB9LCAvKiBHTF9VTlNJR05FRF9JTlQgKi8KKyAgIHsgIDU0ODEsIDB4MDAwMDE0MDYgfSwgLyogR0xfRkxPQVQgKi8KKyAgIHsgIDU0OTAsIDB4MDAwMDE0MDcgfSwgLyogR0xfMl9CWVRFUyAqLworICAgeyAgNTUwMSwgMHgwMDAwMTQwOCB9LCAvKiBHTF8zX0JZVEVTICovCisgICB7ICA1NTEyLCAweDAwMDAxNDA5IH0sIC8qIEdMXzRfQllURVMgKi8KKyAgIHsgIDU1MjMsIDB4MDAwMDE0MEEgfSwgLyogR0xfRE9VQkxFICovCisgICB7ICA1NTMzLCAweDAwMDAxNDBCIH0sIC8qIEdMX0hBTEZfRkxPQVQgKi8KKyAgIHsgIDU1NDcsIDB4MDAwMDE0MEMgfSwgLyogR0xfRklYRUQgKi8KKyAgIHsgIDU1NTYsIDB4MDAwMDE1MDAgfSwgLyogR0xfQ0xFQVIgKi8KKyAgIHsgIDU1NjUsIDB4MDAwMDE1MDEgfSwgLyogR0xfQU5EICovCisgICB7ICA1NTcyLCAweDAwMDAxNTAyIH0sIC8qIEdMX0FORF9SRVZFUlNFICovCisgICB7ICA1NTg3LCAweDAwMDAxNTAzIH0sIC8qIEdMX0NPUFkgKi8KKyAgIHsgIDU1OTUsIDB4MDAwMDE1MDQgfSwgLyogR0xfQU5EX0lOVkVSVEVEICovCisgICB7ICA1NjExLCAweDAwMDAxNTA1IH0sIC8qIEdMX05PT1AgKi8KKyAgIHsgIDU2MTksIDB4MDAwMDE1MDYgfSwgLyogR0xfWE9SICovCisgICB7ICA1NjI2LCAweDAwMDAxNTA3IH0sIC8qIEdMX09SICovCisgICB7ICA1NjMyLCAweDAwMDAxNTA4IH0sIC8qIEdMX05PUiAqLworICAgeyAgNTYzOSwgMHgwMDAwMTUwOSB9LCAvKiBHTF9FUVVJViAqLworICAgeyAgNTY0OCwgMHgwMDAwMTUwQSB9LCAvKiBHTF9JTlZFUlQgKi8KKyAgIHsgIDU2NTgsIDB4MDAwMDE1MEIgfSwgLyogR0xfT1JfUkVWRVJTRSAqLworICAgeyAgNTY3MiwgMHgwMDAwMTUwQyB9LCAvKiBHTF9DT1BZX0lOVkVSVEVEICovCisgICB7ICA1Njg5LCAweDAwMDAxNTBEIH0sIC8qIEdMX09SX0lOVkVSVEVEICovCisgICB7ICA1NzA0LCAweDAwMDAxNTBFIH0sIC8qIEdMX05BTkQgKi8KKyAgIHsgIDU3MTIsIDB4MDAwMDE1MEYgfSwgLyogR0xfU0VUICovCisgICB7ICA1NzE5LCAweDAwMDAxNjAwIH0sIC8qIEdMX0VNSVNTSU9OICovCisgICB7ICA1NzMxLCAweDAwMDAxNjAxIH0sIC8qIEdMX1NISU5JTkVTUyAqLworICAgeyAgNTc0NCwgMHgwMDAwMTYwMiB9LCAvKiBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICovCisgICB7ICA1NzY3LCAweDAwMDAxNjAzIH0sIC8qIEdMX0NPTE9SX0lOREVYRVMgKi8KKyAgIHsgIDU3ODQsIDB4MDAwMDE3MDAgfSwgLyogR0xfTU9ERUxWSUVXICovCisgICB7ICA1Nzk3LCAweDAwMDAxNzAxIH0sIC8qIEdMX1BST0pFQ1RJT04gKi8KKyAgIHsgIDU4MTEsIDB4MDAwMDE3MDIgfSwgLyogR0xfVEVYVFVSRSAqLworICAgeyAgNTgyMiwgMHgwMDAwMTgwMCB9LCAvKiBHTF9DT0xPUiAqLworICAgeyAgNTgzMSwgMHgwMDAwMTgwMSB9LCAvKiBHTF9ERVBUSCAqLworICAgeyAgNTg0MCwgMHgwMDAwMTgwMiB9LCAvKiBHTF9TVEVOQ0lMICovCisgICB7ICA1ODUxLCAweDAwMDAxOTAwIH0sIC8qIEdMX0NPTE9SX0lOREVYICovCisgICB7ICA1ODY2LCAweDAwMDAxOTAxIH0sIC8qIEdMX1NURU5DSUxfSU5ERVggKi8KKyAgIHsgIDU4ODMsIDB4MDAwMDE5MDIgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UICovCisgICB7ICA1OTAyLCAweDAwMDAxOTAzIH0sIC8qIEdMX1JFRCAqLworICAgeyAgNTkwOSwgMHgwMDAwMTkwNCB9LCAvKiBHTF9HUkVFTiAqLworICAgeyAgNTkxOCwgMHgwMDAwMTkwNSB9LCAvKiBHTF9CTFVFICovCisgICB7ICA1OTI2LCAweDAwMDAxOTA2IH0sIC8qIEdMX0FMUEhBICovCisgICB7ICA1OTM1LCAweDAwMDAxOTA3IH0sIC8qIEdMX1JHQiAqLworICAgeyAgNTk0MiwgMHgwMDAwMTkwOCB9LCAvKiBHTF9SR0JBICovCisgICB7ICA1OTUwLCAweDAwMDAxOTA5IH0sIC8qIEdMX0xVTUlOQU5DRSAqLworICAgeyAgNTk2MywgMHgwMDAwMTkwQSB9LCAvKiBHTF9MVU1JTkFOQ0VfQUxQSEEgKi8KKyAgIHsgIDU5ODIsIDB4MDAwMDFBMDAgfSwgLyogR0xfQklUTUFQICovCisgICB7ICA1OTkyLCAweDAwMDAxQjAwIH0sIC8qIEdMX1BPSU5UICovCisgICB7ICA2MDAxLCAweDAwMDAxQjAxIH0sIC8qIEdMX0xJTkUgKi8KKyAgIHsgIDYwMDksIDB4MDAwMDFCMDIgfSwgLyogR0xfRklMTCAqLworICAgeyAgNjAxNywgMHgwMDAwMUMwMCB9LCAvKiBHTF9SRU5ERVIgKi8KKyAgIHsgIDYwMjcsIDB4MDAwMDFDMDEgfSwgLyogR0xfRkVFREJBQ0sgKi8KKyAgIHsgIDYwMzksIDB4MDAwMDFDMDIgfSwgLyogR0xfU0VMRUNUICovCisgICB7ICA2MDQ5LCAweDAwMDAxRDAwIH0sIC8qIEdMX0ZMQVQgKi8KKyAgIHsgIDYwNTcsIDB4MDAwMDFEMDEgfSwgLyogR0xfU01PT1RIICovCisgICB7ICA2MDY3LCAweDAwMDAxRTAwIH0sIC8qIEdMX0tFRVAgKi8KKyAgIHsgIDYwNzUsIDB4MDAwMDFFMDEgfSwgLyogR0xfUkVQTEFDRSAqLworICAgeyAgNjA4NiwgMHgwMDAwMUUwMiB9LCAvKiBHTF9JTkNSICovCisgICB7ICA2MDk0LCAweDAwMDAxRTAzIH0sIC8qIEdMX0RFQ1IgKi8KKyAgIHsgIDYxMDIsIDB4MDAwMDFGMDAgfSwgLyogR0xfVkVORE9SICovCisgICB7ICA2MTEyLCAweDAwMDAxRjAxIH0sIC8qIEdMX1JFTkRFUkVSICovCisgICB7ICA2MTI0LCAweDAwMDAxRjAyIH0sIC8qIEdMX1ZFUlNJT04gKi8KKyAgIHsgIDYxMzUsIDB4MDAwMDFGMDMgfSwgLyogR0xfRVhURU5TSU9OUyAqLworICAgeyAgNjE0OSwgMHgwMDAwMjAwMCB9LCAvKiBHTF9TICovCisgICB7ICA2MTU0LCAweDAwMDAyMDAxIH0sIC8qIEdMX1QgKi8KKyAgIHsgIDYxNTksIDB4MDAwMDIwMDIgfSwgLyogR0xfUiAqLworICAgeyAgNjE2NCwgMHgwMDAwMjAwMyB9LCAvKiBHTF9RICovCisgICB7ICA2MTY5LCAweDAwMDAyMTAwIH0sIC8qIEdMX01PRFVMQVRFICovCisgICB7ICA2MTgxLCAweDAwMDAyMTAxIH0sIC8qIEdMX0RFQ0FMICovCisgICB7ICA2MTkwLCAweDAwMDAyMjAwIH0sIC8qIEdMX1RFWFRVUkVfRU5WX01PREUgKi8KKyAgIHsgIDYyMTAsIDB4MDAwMDIyMDEgfSwgLyogR0xfVEVYVFVSRV9FTlZfQ09MT1IgKi8KKyAgIHsgIDYyMzEsIDB4MDAwMDIzMDAgfSwgLyogR0xfVEVYVFVSRV9FTlYgKi8KKyAgIHsgIDYyNDYsIDB4MDAwMDI0MDAgfSwgLyogR0xfRVlFX0xJTkVBUiAqLworICAgeyAgNjI2MCwgMHgwMDAwMjQwMSB9LCAvKiBHTF9PQkpFQ1RfTElORUFSICovCisgICB7ICA2Mjc3LCAweDAwMDAyNDAyIH0sIC8qIEdMX1NQSEVSRV9NQVAgKi8KKyAgIHsgIDYyOTEsIDB4MDAwMDI1MDAgfSwgLyogR0xfVEVYVFVSRV9HRU5fTU9ERSAqLworICAgeyAgNjMxMSwgMHgwMDAwMjUwMSB9LCAvKiBHTF9PQkpFQ1RfUExBTkUgKi8KKyAgIHsgIDYzMjcsIDB4MDAwMDI1MDIgfSwgLyogR0xfRVlFX1BMQU5FICovCisgICB7ICA2MzQwLCAweDAwMDAyNjAwIH0sIC8qIEdMX05FQVJFU1QgKi8KKyAgIHsgIDYzNTEsIDB4MDAwMDI2MDEgfSwgLyogR0xfTElORUFSICovCisgICB7ICA2MzYxLCAweDAwMDAyNzAwIH0sIC8qIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgKi8KKyAgIHsgIDYzODcsIDB4MDAwMDI3MDEgfSwgLyogR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICovCisgICB7ICA2NDEyLCAweDAwMDAyNzAyIH0sIC8qIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAqLworICAgeyAgNjQzNywgMHgwMDAwMjcwMyB9LCAvKiBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAqLworICAgeyAgNjQ2MSwgMHgwMDAwMjgwMCB9LCAvKiBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KKyAgIHsgIDY0ODMsIDB4MDAwMDI4MDEgfSwgLyogR0xfVEVYVFVSRV9NSU5fRklMVEVSICovCisgICB7ICA2NTA1LCAweDAwMDAyODAyIH0sIC8qIEdMX1RFWFRVUkVfV1JBUF9TICovCisgICB7ICA2NTIzLCAweDAwMDAyODAzIH0sIC8qIEdMX1RFWFRVUkVfV1JBUF9UICovCisgICB7ICA2NTQxLCAweDAwMDAyOTAwIH0sIC8qIEdMX0NMQU1QICovCisgICB7ICA2NTUwLCAweDAwMDAyOTAxIH0sIC8qIEdMX1JFUEVBVCAqLworICAgeyAgNjU2MCwgMHgwMDAwMkEwMCB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAqLworICAgeyAgNjU4NCwgMHgwMDAwMkEwMSB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9QT0lOVCAqLworICAgeyAgNjYwOCwgMHgwMDAwMkEwMiB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9MSU5FICovCisgICB7ICA2NjMxLCAweDAwMDAyQTEwIH0sIC8qIEdMX1IzX0czX0IyICovCisgICB7ICA2NjQzLCAweDAwMDAyQTIwIH0sIC8qIEdMX1YyRiAqLworICAgeyAgNjY1MCwgMHgwMDAwMkEyMSB9LCAvKiBHTF9WM0YgKi8KKyAgIHsgIDY2NTcsIDB4MDAwMDJBMjIgfSwgLyogR0xfQzRVQl9WMkYgKi8KKyAgIHsgIDY2NjksIDB4MDAwMDJBMjMgfSwgLyogR0xfQzRVQl9WM0YgKi8KKyAgIHsgIDY2ODEsIDB4MDAwMDJBMjQgfSwgLyogR0xfQzNGX1YzRiAqLworICAgeyAgNjY5MiwgMHgwMDAwMkEyNSB9LCAvKiBHTF9OM0ZfVjNGICovCisgICB7ICA2NzAzLCAweDAwMDAyQTI2IH0sIC8qIEdMX0M0Rl9OM0ZfVjNGICovCisgICB7ICA2NzE4LCAweDAwMDAyQTI3IH0sIC8qIEdMX1QyRl9WM0YgKi8KKyAgIHsgIDY3MjksIDB4MDAwMDJBMjggfSwgLyogR0xfVDRGX1Y0RiAqLworICAgeyAgNjc0MCwgMHgwMDAwMkEyOSB9LCAvKiBHTF9UMkZfQzRVQl9WM0YgKi8KKyAgIHsgIDY3NTYsIDB4MDAwMDJBMkEgfSwgLyogR0xfVDJGX0MzRl9WM0YgKi8KKyAgIHsgIDY3NzEsIDB4MDAwMDJBMkIgfSwgLyogR0xfVDJGX04zRl9WM0YgKi8KKyAgIHsgIDY3ODYsIDB4MDAwMDJBMkMgfSwgLyogR0xfVDJGX0M0Rl9OM0ZfVjNGICovCisgICB7ICA2ODA1LCAweDAwMDAyQTJEIH0sIC8qIEdMX1Q0Rl9DNEZfTjNGX1Y0RiAqLworICAgeyAgNjgyNCwgMHgwMDAwMzAwMCB9LCAvKiBHTF9DTElQX0RJU1RBTkNFMCAqLworICAgeyAgNjg0MiwgMHgwMDAwMzAwMSB9LCAvKiBHTF9DTElQX0RJU1RBTkNFMSAqLworICAgeyAgNjg2MCwgMHgwMDAwMzAwMiB9LCAvKiBHTF9DTElQX0RJU1RBTkNFMiAqLworICAgeyAgNjg3OCwgMHgwMDAwMzAwMyB9LCAvKiBHTF9DTElQX0RJU1RBTkNFMyAqLworICAgeyAgNjg5NiwgMHgwMDAwMzAwNCB9LCAvKiBHTF9DTElQX0RJU1RBTkNFNCAqLworICAgeyAgNjkxNCwgMHgwMDAwMzAwNSB9LCAvKiBHTF9DTElQX0RJU1RBTkNFNSAqLworICAgeyAgNjkzMiwgMHgwMDAwMzAwNiB9LCAvKiBHTF9DTElQX0RJU1RBTkNFNiAqLworICAgeyAgNjk1MCwgMHgwMDAwMzAwNyB9LCAvKiBHTF9DTElQX0RJU1RBTkNFNyAqLworICAgeyAgNjk2OCwgMHgwMDAwNDAwMCB9LCAvKiBHTF9MSUdIVDAgKi8KKyAgIHsgIDY5NzgsIDB4MDAwMDQwMDEgfSwgLyogR0xfTElHSFQxICovCisgICB7ICA2OTg4LCAweDAwMDA0MDAyIH0sIC8qIEdMX0xJR0hUMiAqLworICAgeyAgNjk5OCwgMHgwMDAwNDAwMyB9LCAvKiBHTF9MSUdIVDMgKi8KKyAgIHsgIDcwMDgsIDB4MDAwMDQwMDQgfSwgLyogR0xfTElHSFQ0ICovCisgICB7ICA3MDE4LCAweDAwMDA0MDA1IH0sIC8qIEdMX0xJR0hUNSAqLworICAgeyAgNzAyOCwgMHgwMDAwNDAwNiB9LCAvKiBHTF9MSUdIVDYgKi8KKyAgIHsgIDcwMzgsIDB4MDAwMDQwMDcgfSwgLyogR0xfTElHSFQ3ICovCisgICB7ICA3MDQ4LCAweDAwMDA4MDAwIH0sIC8qIEdMX0hJTlRfQklUICovCisgICB7ICA3MDYwLCAweDAwMDA4MDAxIH0sIC8qIEdMX0NPTlNUQU5UX0NPTE9SICovCisgICB7ICA3MDc4LCAweDAwMDA4MDAyIH0sIC8qIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAqLworICAgeyAgNzEwNiwgMHgwMDAwODAwMyB9LCAvKiBHTF9DT05TVEFOVF9BTFBIQSAqLworICAgeyAgNzEyNCwgMHgwMDAwODAwNCB9LCAvKiBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEgKi8KKyAgIHsgIDcxNTIsIDB4MDAwMDgwMDUgfSwgLyogR0xfQkxFTkRfQ09MT1IgKi8KKyAgIHsgIDcxNjcsIDB4MDAwMDgwMDYgfSwgLyogR0xfRlVOQ19BREQgKi8KKyAgIHsgIDcxNzksIDB4MDAwMDgwMDcgfSwgLyogR0xfTUlOICovCisgICB7ICA3MTg2LCAweDAwMDA4MDA4IH0sIC8qIEdMX01BWCAqLworICAgeyAgNzE5MywgMHgwMDAwODAwOSB9LCAvKiBHTF9CTEVORF9FUVVBVElPTiAqLworICAgeyAgNzIxMSwgMHgwMDAwODAwQSB9LCAvKiBHTF9GVU5DX1NVQlRSQUNUICovCisgICB7ICA3MjI4LCAweDAwMDA4MDBCIH0sIC8qIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAqLworICAgeyAgNzI1MywgMHgwMDAwODAxMCB9LCAvKiBHTF9DT05WT0xVVElPTl8xRCAqLworICAgeyAgNzI3MSwgMHgwMDAwODAxMSB9LCAvKiBHTF9DT05WT0xVVElPTl8yRCAqLworICAgeyAgNzI4OSwgMHgwMDAwODAxMiB9LCAvKiBHTF9TRVBBUkFCTEVfMkQgKi8KKyAgIHsgIDczMDUsIDB4MDAwMDgwMTMgfSwgLyogR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREUgKi8KKyAgIHsgIDczMzIsIDB4MDAwMDgwMTQgfSwgLyogR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFICovCisgICB7ICA3MzYwLCAweDAwMDA4MDE1IH0sIC8qIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTICovCisgICB7ICA3Mzg3LCAweDAwMDA4MDE2IH0sIC8qIEdMX1JFRFVDRSAqLworICAgeyAgNzM5NywgMHgwMDAwODAxNyB9LCAvKiBHTF9DT05WT0xVVElPTl9GT1JNQVQgKi8KKyAgIHsgIDc0MTksIDB4MDAwMDgwMTggfSwgLyogR0xfQ09OVk9MVVRJT05fV0lEVEggKi8KKyAgIHsgIDc0NDAsIDB4MDAwMDgwMTkgfSwgLyogR0xfQ09OVk9MVVRJT05fSEVJR0hUICovCisgICB7ICA3NDYyLCAweDAwMDA4MDFBIH0sIC8qIEdMX01BWF9DT05WT0xVVElPTl9XSURUSCAqLworICAgeyAgNzQ4NywgMHgwMDAwODAxQiB9LCAvKiBHTF9NQVhfQ09OVk9MVVRJT05fSEVJR0hUICovCisgICB7ICA3NTEzLCAweDAwMDA4MDFDIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFICovCisgICB7ICA3NTQzLCAweDAwMDA4MDFEIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fU0NBTEUgKi8KKyAgIHsgIDc1NzUsIDB4MDAwMDgwMUUgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX1NDQUxFICovCisgICB7ICA3NjA2LCAweDAwMDA4MDFGIH0sIC8qIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUgKi8KKyAgIHsgIDc2MzgsIDB4MDAwMDgwMjAgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9SRURfQklBUyAqLworICAgeyAgNzY2NywgMHgwMDAwODAyMSB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX0JJQVMgKi8KKyAgIHsgIDc2OTgsIDB4MDAwMDgwMjIgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVMgKi8KKyAgIHsgIDc3MjgsIDB4MDAwMDgwMjMgfSwgLyogR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTICovCisgICB7ICA3NzU5LCAweDAwMDA4MDI0IH0sIC8qIEdMX0hJU1RPR1JBTSAqLworICAgeyAgNzc3MiwgMHgwMDAwODAyNSB9LCAvKiBHTF9QUk9YWV9ISVNUT0dSQU0gKi8KKyAgIHsgIDc3OTEsIDB4MDAwMDgwMjYgfSwgLyogR0xfSElTVE9HUkFNX1dJRFRIICovCisgICB7ICA3ODEwLCAweDAwMDA4MDI3IH0sIC8qIEdMX0hJU1RPR1JBTV9GT1JNQVQgKi8KKyAgIHsgIDc4MzAsIDB4MDAwMDgwMjggfSwgLyogR0xfSElTVE9HUkFNX1JFRF9TSVpFICovCisgICB7ICA3ODUyLCAweDAwMDA4MDI5IH0sIC8qIEdMX0hJU1RPR1JBTV9HUkVFTl9TSVpFICovCisgICB7ICA3ODc2LCAweDAwMDA4MDJBIH0sIC8qIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkUgKi8KKyAgIHsgIDc4OTksIDB4MDAwMDgwMkIgfSwgLyogR0xfSElTVE9HUkFNX0FMUEhBX1NJWkUgKi8KKyAgIHsgIDc5MjMsIDB4MDAwMDgwMkMgfSwgLyogR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFICovCisgICB7ICA3OTUxLCAweDAwMDA4MDJEIH0sIC8qIEdMX0hJU1RPR1JBTV9TSU5LICovCisgICB7ICA3OTY5LCAweDAwMDA4MDJFIH0sIC8qIEdMX01JTk1BWCAqLworICAgeyAgNzk3OSwgMHgwMDAwODAyRiB9LCAvKiBHTF9NSU5NQVhfRk9STUFUICovCisgICB7ICA3OTk2LCAweDAwMDA4MDMwIH0sIC8qIEdMX01JTk1BWF9TSU5LICovCisgICB7ICA4MDExLCAweDAwMDA4MDMxIH0sIC8qIEdMX1RBQkxFX1RPT19MQVJHRV9FWFQgKi8KKyAgIHsgIDgwMzQsIDB4MDAwMDgwMzIgfSwgLyogR0xfVU5TSUdORURfQllURV8zXzNfMiAqLworICAgeyAgODA1NywgMHgwMDAwODAzMyB9LCAvKiBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICovCisgICB7ICA4MDgzLCAweDAwMDA4MDM0IH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgKi8KKyAgIHsgIDgxMDksIDB4MDAwMDgwMzUgfSwgLyogR0xfVU5TSUdORURfSU5UXzhfOF84XzggKi8KKyAgIHsgIDgxMzMsIDB4MDAwMDgwMzYgfSwgLyogR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzIgKi8KKyAgIHsgIDgxNjAsIDB4MDAwMDgwMzcgfSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAqLworICAgeyAgODE4MywgMHgwMDAwODAzOCB9LCAvKiBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgKi8KKyAgIHsgIDgyMDgsIDB4MDAwMDgwMzkgfSwgLyogR0xfUE9MWUdPTl9PRkZTRVRfQklBU19FWFQgKi8KKyAgIHsgIDgyMzUsIDB4MDAwMDgwM0EgfSwgLyogR0xfUkVTQ0FMRV9OT1JNQUwgKi8KKyAgIHsgIDgyNTMsIDB4MDAwMDgwM0IgfSwgLyogR0xfQUxQSEE0ICovCisgICB7ICA4MjYzLCAweDAwMDA4MDNDIH0sIC8qIEdMX0FMUEhBOCAqLworICAgeyAgODI3MywgMHgwMDAwODAzRCB9LCAvKiBHTF9BTFBIQTEyICovCisgICB7ICA4Mjg0LCAweDAwMDA4MDNFIH0sIC8qIEdMX0FMUEhBMTYgKi8KKyAgIHsgIDgyOTUsIDB4MDAwMDgwM0YgfSwgLyogR0xfTFVNSU5BTkNFNCAqLworICAgeyAgODMwOSwgMHgwMDAwODA0MCB9LCAvKiBHTF9MVU1JTkFOQ0U4ICovCisgICB7ICA4MzIzLCAweDAwMDA4MDQxIH0sIC8qIEdMX0xVTUlOQU5DRTEyICovCisgICB7ICA4MzM4LCAweDAwMDA4MDQyIH0sIC8qIEdMX0xVTUlOQU5DRTE2ICovCisgICB7ICA4MzUzLCAweDAwMDA4MDQzIH0sIC8qIEdMX0xVTUlOQU5DRTRfQUxQSEE0ICovCisgICB7ICA4Mzc0LCAweDAwMDA4MDQ0IH0sIC8qIEdMX0xVTUlOQU5DRTZfQUxQSEEyICovCisgICB7ICA4Mzk1LCAweDAwMDA4MDQ1IH0sIC8qIEdMX0xVTUlOQU5DRThfQUxQSEE4ICovCisgICB7ICA4NDE2LCAweDAwMDA4MDQ2IH0sIC8qIEdMX0xVTUlOQU5DRTEyX0FMUEhBNCAqLworICAgeyAgODQzOCwgMHgwMDAwODA0NyB9LCAvKiBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyICovCisgICB7ICA4NDYxLCAweDAwMDA4MDQ4IH0sIC8qIEdMX0xVTUlOQU5DRTE2X0FMUEhBMTYgKi8KKyAgIHsgIDg0ODQsIDB4MDAwMDgwNDkgfSwgLyogR0xfSU5URU5TSVRZICovCisgICB7ICA4NDk3LCAweDAwMDA4MDRBIH0sIC8qIEdMX0lOVEVOU0lUWTQgKi8KKyAgIHsgIDg1MTEsIDB4MDAwMDgwNEIgfSwgLyogR0xfSU5URU5TSVRZOCAqLworICAgeyAgODUyNSwgMHgwMDAwODA0QyB9LCAvKiBHTF9JTlRFTlNJVFkxMiAqLworICAgeyAgODU0MCwgMHgwMDAwODA0RCB9LCAvKiBHTF9JTlRFTlNJVFkxNiAqLworICAgeyAgODU1NSwgMHgwMDAwODA0RSB9LCAvKiBHTF9SR0IyX0VYVCAqLworICAgeyAgODU2NywgMHgwMDAwODA0RiB9LCAvKiBHTF9SR0I0ICovCisgICB7ICA4NTc1LCAweDAwMDA4MDUwIH0sIC8qIEdMX1JHQjUgKi8KKyAgIHsgIDg1ODMsIDB4MDAwMDgwNTEgfSwgLyogR0xfUkdCOCAqLworICAgeyAgODU5MSwgMHgwMDAwODA1MiB9LCAvKiBHTF9SR0IxMCAqLworICAgeyAgODYwMCwgMHgwMDAwODA1MyB9LCAvKiBHTF9SR0IxMiAqLworICAgeyAgODYwOSwgMHgwMDAwODA1NCB9LCAvKiBHTF9SR0IxNiAqLworICAgeyAgODYxOCwgMHgwMDAwODA1NSB9LCAvKiBHTF9SR0JBMiAqLworICAgeyAgODYyNywgMHgwMDAwODA1NiB9LCAvKiBHTF9SR0JBNCAqLworICAgeyAgODYzNiwgMHgwMDAwODA1NyB9LCAvKiBHTF9SR0I1X0ExICovCisgICB7ICA4NjQ3LCAweDAwMDA4MDU4IH0sIC8qIEdMX1JHQkE4ICovCisgICB7ICA4NjU2LCAweDAwMDA4MDU5IH0sIC8qIEdMX1JHQjEwX0EyICovCisgICB7ICA4NjY4LCAweDAwMDA4MDVBIH0sIC8qIEdMX1JHQkExMiAqLworICAgeyAgODY3OCwgMHgwMDAwODA1QiB9LCAvKiBHTF9SR0JBMTYgKi8KKyAgIHsgIDg2ODgsIDB4MDAwMDgwNUMgfSwgLyogR0xfVEVYVFVSRV9SRURfU0laRSAqLworICAgeyAgODcwOCwgMHgwMDAwODA1RCB9LCAvKiBHTF9URVhUVVJFX0dSRUVOX1NJWkUgKi8KKyAgIHsgIDg3MzAsIDB4MDAwMDgwNUUgfSwgLyogR0xfVEVYVFVSRV9CTFVFX1NJWkUgKi8KKyAgIHsgIDg3NTEsIDB4MDAwMDgwNUYgfSwgLyogR0xfVEVYVFVSRV9BTFBIQV9TSVpFICovCisgICB7ICA4NzczLCAweDAwMDA4MDYwIH0sIC8qIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1NJWkUgKi8KKyAgIHsgIDg3OTksIDB4MDAwMDgwNjEgfSwgLyogR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRSAqLworICAgeyAgODgyNSwgMHgwMDAwODA2MiB9LCAvKiBHTF9SRVBMQUNFX0VYVCAqLworICAgeyAgODg0MCwgMHgwMDAwODA2MyB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzFEICovCisgICB7ICA4ODYwLCAweDAwMDA4MDY0IH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfMkQgKi8KKyAgIHsgIDg4ODAsIDB4MDAwMDgwNjUgfSwgLyogR0xfVEVYVFVSRV9UT09fTEFSR0VfRVhUICovCisgICB7ICA4OTA1LCAweDAwMDA4MDY2IH0sIC8qIEdMX1RFWFRVUkVfUFJJT1JJVFkgKi8KKyAgIHsgIDg5MjUsIDB4MDAwMDgwNjcgfSwgLyogR0xfVEVYVFVSRV9SRVNJREVOVCAqLworICAgeyAgODk0NSwgMHgwMDAwODA2OCB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMUQgKi8KKyAgIHsgIDg5NjcsIDB4MDAwMDgwNjkgfSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HXzJEICovCisgICB7ICA4OTg5LCAweDAwMDA4MDZBIH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18zRCAqLworICAgeyAgOTAxMSwgMHgwMDAwODA2QiB9LCAvKiBHTF9QQUNLX1NLSVBfSU1BR0VTICovCisgICB7ICA5MDMxLCAweDAwMDA4MDZDIH0sIC8qIEdMX1BBQ0tfSU1BR0VfSEVJR0hUICovCisgICB7ICA5MDUyLCAweDAwMDA4MDZEIH0sIC8qIEdMX1VOUEFDS19TS0lQX0lNQUdFUyAqLworICAgeyAgOTA3NCwgMHgwMDAwODA2RSB9LCAvKiBHTF9VTlBBQ0tfSU1BR0VfSEVJR0hUICovCisgICB7ICA5MDk3LCAweDAwMDA4MDZGIH0sIC8qIEdMX1RFWFRVUkVfM0QgKi8KKyAgIHsgIDkxMTEsIDB4MDAwMDgwNzAgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8zRCAqLworICAgeyAgOTEzMSwgMHgwMDAwODA3MSB9LCAvKiBHTF9URVhUVVJFX0RFUFRIICovCisgICB7ICA5MTQ4LCAweDAwMDA4MDcyIH0sIC8qIEdMX1RFWFRVUkVfV1JBUF9SICovCisgICB7ICA5MTY2LCAweDAwMDA4MDczIH0sIC8qIEdMX01BWF8zRF9URVhUVVJFX1NJWkUgKi8KKyAgIHsgIDkxODksIDB4MDAwMDgwNzQgfSwgLyogR0xfVkVSVEVYX0FSUkFZICovCisgICB7ICA5MjA1LCAweDAwMDA4MDc1IH0sIC8qIEdMX05PUk1BTF9BUlJBWSAqLworICAgeyAgOTIyMSwgMHgwMDAwODA3NiB9LCAvKiBHTF9DT0xPUl9BUlJBWSAqLworICAgeyAgOTIzNiwgMHgwMDAwODA3NyB9LCAvKiBHTF9JTkRFWF9BUlJBWSAqLworICAgeyAgOTI1MSwgMHgwMDAwODA3OCB9LCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICovCisgICB7ICA5Mjc0LCAweDAwMDA4MDc5IH0sIC8qIEdMX0VER0VfRkxBR19BUlJBWSAqLworICAgeyAgOTI5MywgMHgwMDAwODA3QSB9LCAvKiBHTF9WRVJURVhfQVJSQVlfU0laRSAqLworICAgeyAgOTMxNCwgMHgwMDAwODA3QiB9LCAvKiBHTF9WRVJURVhfQVJSQVlfVFlQRSAqLworICAgeyAgOTMzNSwgMHgwMDAwODA3QyB9LCAvKiBHTF9WRVJURVhfQVJSQVlfU1RSSURFICovCisgICB7ICA5MzU4LCAweDAwMDA4MDdEIH0sIC8qIEdMX1ZFUlRFWF9BUlJBWV9DT1VOVF9FWFQgKi8KKyAgIHsgIDkzODQsIDB4MDAwMDgwN0UgfSwgLyogR0xfTk9STUFMX0FSUkFZX1RZUEUgKi8KKyAgIHsgIDk0MDUsIDB4MDAwMDgwN0YgfSwgLyogR0xfTk9STUFMX0FSUkFZX1NUUklERSAqLworICAgeyAgOTQyOCwgMHgwMDAwODA4MCB9LCAvKiBHTF9OT1JNQUxfQVJSQVlfQ09VTlRfRVhUICovCisgICB7ICA5NDU0LCAweDAwMDA4MDgxIH0sIC8qIEdMX0NPTE9SX0FSUkFZX1NJWkUgKi8KKyAgIHsgIDk0NzQsIDB4MDAwMDgwODIgfSwgLyogR0xfQ09MT1JfQVJSQVlfVFlQRSAqLworICAgeyAgOTQ5NCwgMHgwMDAwODA4MyB9LCAvKiBHTF9DT0xPUl9BUlJBWV9TVFJJREUgKi8KKyAgIHsgIDk1MTYsIDB4MDAwMDgwODQgfSwgLyogR0xfQ09MT1JfQVJSQVlfQ09VTlRfRVhUICovCisgICB7ICA5NTQxLCAweDAwMDA4MDg1IH0sIC8qIEdMX0lOREVYX0FSUkFZX1RZUEUgKi8KKyAgIHsgIDk1NjEsIDB4MDAwMDgwODYgfSwgLyogR0xfSU5ERVhfQVJSQVlfU1RSSURFICovCisgICB7ICA5NTgzLCAweDAwMDA4MDg3IH0sIC8qIEdMX0lOREVYX0FSUkFZX0NPVU5UX0VYVCAqLworICAgeyAgOTYwOCwgMHgwMDAwODA4OCB9LCAvKiBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUgKi8KKyAgIHsgIDk2MzYsIDB4MDAwMDgwODkgfSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFICovCisgICB7ICA5NjY0LCAweDAwMDA4MDhBIH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCisgICB7ICA5Njk0LCAweDAwMDA4MDhCIH0sIC8qIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQ09VTlRfRVhUICovCisgICB7ICA5NzI3LCAweDAwMDA4MDhDIH0sIC8qIEdMX0VER0VfRkxBR19BUlJBWV9TVFJJREUgKi8KKyAgIHsgIDk3NTMsIDB4MDAwMDgwOEQgfSwgLyogR0xfRURHRV9GTEFHX0FSUkFZX0NPVU5UX0VYVCAqLworICAgeyAgOTc4MiwgMHgwMDAwODA4RSB9LCAvKiBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAqLworICAgeyAgOTgwNiwgMHgwMDAwODA4RiB9LCAvKiBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiAqLworICAgeyAgOTgzMCwgMHgwMDAwODA5MCB9LCAvKiBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICovCisgICB7ICA5ODUzLCAweDAwMDA4MDkxIH0sIC8qIEdMX0lOREVYX0FSUkFZX1BPSU5URVIgKi8KKyAgIHsgIDk4NzYsIDB4MDAwMDgwOTIgfSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSICovCisgICB7ICA5OTA3LCAweDAwMDA4MDkzIH0sIC8qIEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSICovCisgICB7ICA5OTM0LCAweDAwMDA4MDlEIH0sIC8qIEdMX01VTFRJU0FNUExFICovCisgICB7ICA5OTQ5LCAweDAwMDA4MDlFIH0sIC8qIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAqLworICAgeyAgOTk3NywgMHgwMDAwODA5RiB9LCAvKiBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICovCisgICB7IDEwMDAwLCAweDAwMDA4MEEwIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRSAqLworICAgeyAxMDAxOSwgMHgwMDAwODBBOCB9LCAvKiBHTF9TQU1QTEVfQlVGRkVSUyAqLworICAgeyAxMDAzNywgMHgwMDAwODBBOSB9LCAvKiBHTF9TQU1QTEVTICovCisgICB7IDEwMDQ4LCAweDAwMDA4MEFBIH0sIC8qIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAqLworICAgeyAxMDA3MywgMHgwMDAwODBBQiB9LCAvKiBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUICovCisgICB7IDEwMDk5LCAweDAwMDA4MEIxIH0sIC8qIEdMX0NPTE9SX01BVFJJWCAqLworICAgeyAxMDExNSwgMHgwMDAwODBCMiB9LCAvKiBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggKi8KKyAgIHsgMTAxNDMsIDB4MDAwMDgwQjMgfSwgLyogR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSCAqLworICAgeyAxMDE3NSwgMHgwMDAwODBCNCB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEUgKi8KKyAgIHsgMTAyMDYsIDB4MDAwMDgwQjUgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fU0NBTEUgKi8KKyAgIHsgMTAyMzksIDB4MDAwMDgwQjYgfSwgLyogR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRSAqLworICAgeyAxMDI3MSwgMHgwMDAwODBCNyB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9TQ0FMRSAqLworICAgeyAxMDMwNCwgMHgwMDAwODBCOCB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBUyAqLworICAgeyAxMDMzNCwgMHgwMDAwODBCOSB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9CSUFTICovCisgICB7IDEwMzY2LCAweDAwMDA4MEJBIH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfQklBUyAqLworICAgeyAxMDM5NywgMHgwMDAwODBCQiB9LCAvKiBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTICovCisgICB7IDEwNDI5LCAweDAwMDA4MEJDIH0sIC8qIEdMX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICovCisgICB7IDEwNDU2LCAweDAwMDA4MEJEIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICovCisgICB7IDEwNDg5LCAweDAwMDA4MEJGIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQiAqLworICAgeyAxMDUyMywgMHgwMDAwODBDOCB9LCAvKiBHTF9CTEVORF9EU1RfUkdCICovCisgICB7IDEwNTQwLCAweDAwMDA4MEM5IH0sIC8qIEdMX0JMRU5EX1NSQ19SR0IgKi8KKyAgIHsgMTA1NTcsIDB4MDAwMDgwQ0EgfSwgLyogR0xfQkxFTkRfRFNUX0FMUEhBICovCisgICB7IDEwNTc2LCAweDAwMDA4MENCIH0sIC8qIEdMX0JMRU5EX1NSQ19BTFBIQSAqLworICAgeyAxMDU5NSwgMHgwMDAwODBEMCB9LCAvKiBHTF9DT0xPUl9UQUJMRSAqLworICAgeyAxMDYxMCwgMHgwMDAwODBEMSB9LCAvKiBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFICovCisgICB7IDEwNjQyLCAweDAwMDA4MEQyIH0sIC8qIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFICovCisgICB7IDEwNjc1LCAweDAwMDA4MEQzIH0sIC8qIEdMX1BST1hZX0NPTE9SX1RBQkxFICovCisgICB7IDEwNjk2LCAweDAwMDA4MEQ0IH0sIC8qIEdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEUgKi8KKyAgIHsgMTA3MzQsIDB4MDAwMDgwRDUgfSwgLyogR0xfUFJPWFlfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUgKi8KKyAgIHsgMTA3NzMsIDB4MDAwMDgwRDYgfSwgLyogR0xfQ09MT1JfVEFCTEVfU0NBTEUgKi8KKyAgIHsgMTA3OTQsIDB4MDAwMDgwRDcgfSwgLyogR0xfQ09MT1JfVEFCTEVfQklBUyAqLworICAgeyAxMDgxNCwgMHgwMDAwODBEOCB9LCAvKiBHTF9DT0xPUl9UQUJMRV9GT1JNQVQgKi8KKyAgIHsgMTA4MzYsIDB4MDAwMDgwRDkgfSwgLyogR0xfQ09MT1JfVEFCTEVfV0lEVEggKi8KKyAgIHsgMTA4NTcsIDB4MDAwMDgwREEgfSwgLyogR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkUgKi8KKyAgIHsgMTA4ODEsIDB4MDAwMDgwREIgfSwgLyogR0xfQ09MT1JfVEFCTEVfR1JFRU5fU0laRSAqLworICAgeyAxMDkwNywgMHgwMDAwODBEQyB9LCAvKiBHTF9DT0xPUl9UQUJMRV9CTFVFX1NJWkUgKi8KKyAgIHsgMTA5MzIsIDB4MDAwMDgwREQgfSwgLyogR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRSAqLworICAgeyAxMDk1OCwgMHgwMDAwODBERSB9LCAvKiBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRSAqLworICAgeyAxMDk4OCwgMHgwMDAwODBERiB9LCAvKiBHTF9DT0xPUl9UQUJMRV9JTlRFTlNJVFlfU0laRSAqLworICAgeyAxMTAxOCwgMHgwMDAwODBFMCB9LCAvKiBHTF9CR1IgKi8KKyAgIHsgMTEwMjUsIDB4MDAwMDgwRTEgfSwgLyogR0xfQkdSQSAqLworICAgeyAxMTAzMywgMHgwMDAwODBFOCB9LCAvKiBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgKi8KKyAgIHsgMTEwNTgsIDB4MDAwMDgwRTkgfSwgLyogR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgKi8KKyAgIHsgMTEwODIsIDB4MDAwMDgwRUQgfSwgLyogR0xfVEVYVFVSRV9JTkRFWF9TSVpFX0VYVCAqLworICAgeyAxMTEwOCwgMHgwMDAwODBGMCB9LCAvKiBHTF9DTElQX1ZPTFVNRV9DTElQUElOR19ISU5UX0VYVCAqLworICAgeyAxMTE0MSwgMHgwMDAwODEyNiB9LCAvKiBHTF9QT0lOVF9TSVpFX01JTiAqLworICAgeyAxMTE1OSwgMHgwMDAwODEyNyB9LCAvKiBHTF9QT0lOVF9TSVpFX01BWCAqLworICAgeyAxMTE3NywgMHgwMDAwODEyOCB9LCAvKiBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICovCisgICB7IDExMjA2LCAweDAwMDA4MTI5IH0sIC8qIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OICovCisgICB7IDExMjM2LCAweDAwMDA4MTJEIH0sIC8qIEdMX0NMQU1QX1RPX0JPUkRFUiAqLworICAgeyAxMTI1NSwgMHgwMDAwODEyRiB9LCAvKiBHTF9DTEFNUF9UT19FREdFICovCisgICB7IDExMjcyLCAweDAwMDA4MTNBIH0sIC8qIEdMX1RFWFRVUkVfTUlOX0xPRCAqLworICAgeyAxMTI5MSwgMHgwMDAwODEzQiB9LCAvKiBHTF9URVhUVVJFX01BWF9MT0QgKi8KKyAgIHsgMTEzMTAsIDB4MDAwMDgxM0MgfSwgLyogR0xfVEVYVFVSRV9CQVNFX0xFVkVMICovCisgICB7IDExMzMyLCAweDAwMDA4MTNEIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0xFVkVMICovCisgICB7IDExMzUzLCAweDAwMDA4MTUwIH0sIC8qIEdMX0lHTk9SRV9CT1JERVJfSFAgKi8KKyAgIHsgMTEzNzMsIDB4MDAwMDgxNTEgfSwgLyogR0xfQ09OU1RBTlRfQk9SREVSX0hQICovCisgICB7IDExMzk1LCAweDAwMDA4MTUzIH0sIC8qIEdMX1JFUExJQ0FURV9CT1JERVJfSFAgKi8KKyAgIHsgMTE0MTgsIDB4MDAwMDgxNTQgfSwgLyogR0xfQ09OVk9MVVRJT05fQk9SREVSX0NPTE9SICovCisgICB7IDExNDQ2LCAweDAwMDA4MTY1IH0sIC8qIEdMX09DQ0xVU0lPTl9URVNUX0hQICovCisgICB7IDExNDY3LCAweDAwMDA4MTY2IH0sIC8qIEdMX09DQ0xVU0lPTl9URVNUX1JFU1VMVF9IUCAqLworICAgeyAxMTQ5NSwgMHgwMDAwODE3MCB9LCAvKiBHTF9MSU5FQVJfQ0xJUE1BUF9MSU5FQVJfU0dJWCAqLworICAgeyAxMTUyNSwgMHgwMDAwODE3MSB9LCAvKiBHTF9URVhUVVJFX0NMSVBNQVBfQ0VOVEVSX1NHSVggKi8KKyAgIHsgMTE1NTYsIDB4MDAwMDgxNzIgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVggKi8KKyAgIHsgMTE1ODYsIDB4MDAwMDgxNzMgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX09GRlNFVF9TR0lYICovCisgICB7IDExNjE3LCAweDAwMDA4MTc0IH0sIC8qIEdMX1RFWFRVUkVfQ0xJUE1BUF9WSVJUVUFMX0RFUFRIX1NHSVggKi8KKyAgIHsgMTE2NTUsIDB4MDAwMDgxNzUgfSwgLyogR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAqLworICAgeyAxMTY5MCwgMHgwMDAwODE3NiB9LCAvKiBHTF9URVhUVVJFX0NMSVBNQVBfREVQVEhfU0dJWCAqLworICAgeyAxMTcyMCwgMHgwMDAwODE3NyB9LCAvKiBHTF9NQVhfQ0xJUE1BUF9ERVBUSF9TR0lYICovCisgICB7IDExNzQ2LCAweDAwMDA4MTc4IH0sIC8qIEdMX01BWF9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAqLworICAgeyAxMTc4MCwgMHgwMDAwODE3OSB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX0JJQVNfU0dJWCAqLworICAgeyAxMTgxMywgMHgwMDAwODE3QSB9LCAvKiBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1NHSVggKi8KKyAgIHsgMTE4NDcsIDB4MDAwMDgxN0IgfSwgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1JBTkdFX1NHSVggKi8KKyAgIHsgMTE4ODYsIDB4MDAwMDgxN0MgfSwgLyogR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9SQU5HRV9TR0lYICovCisgICB7IDExOTI2LCAweDAwMDA4MThFIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfU19TR0lYICovCisgICB7IDExOTUzLCAweDAwMDA4MThGIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfVF9TR0lYICovCisgICB7IDExOTgwLCAweDAwMDA4MTkwIH0sIC8qIEdMX1RFWFRVUkVfTE9EX0JJQVNfUl9TR0lYICovCisgICB7IDEyMDA3LCAweDAwMDA4MTkxIH0sIC8qIEdMX0dFTkVSQVRFX01JUE1BUCAqLworICAgeyAxMjAyNiwgMHgwMDAwODE5MiB9LCAvKiBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAqLworICAgeyAxMjA1MCwgMHgwMDAwODE5OCB9LCAvKiBHTF9GT0dfT0ZGU0VUX1NHSVggKi8KKyAgIHsgMTIwNjksIDB4MDAwMDgxOTkgfSwgLyogR0xfRk9HX09GRlNFVF9WQUxVRV9TR0lYICovCisgICB7IDEyMDk0LCAweDAwMDA4MTlBIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICovCisgICB7IDEyMTE4LCAweDAwMDA4MTlCIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9PUEVSQVRPUl9TR0lYICovCisgICB7IDEyMTUxLCAweDAwMDA4MTlDIH0sIC8qIEdMX1RFWFRVUkVfTEVRVUFMX1JfU0dJWCAqLworICAgeyAxMjE3NiwgMHgwMDAwODE5RCB9LCAvKiBHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVggKi8KKyAgIHsgMTIyMDEsIDB4MDAwMDgxQTUgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMTYgKi8KKyAgIHsgMTIyMjIsIDB4MDAwMDgxQTYgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMjQgKi8KKyAgIHsgMTIyNDMsIDB4MDAwMDgxQTcgfSwgLyogR0xfREVQVEhfQ09NUE9ORU5UMzIgKi8KKyAgIHsgMTIyNjQsIDB4MDAwMDgxQTggfSwgLyogR0xfQVJSQVlfRUxFTUVOVF9MT0NLX0ZJUlNUX0VYVCAqLworICAgeyAxMjI5NiwgMHgwMDAwODFBOSB9LCAvKiBHTF9BUlJBWV9FTEVNRU5UX0xPQ0tfQ09VTlRfRVhUICovCisgICB7IDEyMzI4LCAweDAwMDA4MUFBIH0sIC8qIEdMX0NVTExfVkVSVEVYX0VYVCAqLworICAgeyAxMjM0NywgMHgwMDAwODFBQiB9LCAvKiBHTF9DVUxMX1ZFUlRFWF9PQkpFQ1RfUE9TSVRJT05fRVhUICovCisgICB7IDEyMzgyLCAweDAwMDA4MUFDIH0sIC8qIEdMX0NVTExfVkVSVEVYX0VZRV9QT1NJVElPTl9FWFQgKi8KKyAgIHsgMTI0MTQsIDB4MDAwMDgxRDQgfSwgLyogR0xfV1JBUF9CT1JERVJfU1VOICovCisgICB7IDEyNDMzLCAweDAwMDA4MUVGIH0sIC8qIEdMX1RFWFRVUkVfQ09MT1JfV1JJVEVNQVNLX1NHSVMgKi8KKyAgIHsgMTI0NjUsIDB4MDAwMDgxRjggfSwgLyogR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTCAqLworICAgeyAxMjQ5NCwgMHgwMDAwODFGOSB9LCAvKiBHTF9TSU5HTEVfQ09MT1IgKi8KKyAgIHsgMTI1MTAsIDB4MDAwMDgxRkEgfSwgLyogR0xfU0VQQVJBVEVfU1BFQ1VMQVJfQ09MT1IgKi8KKyAgIHsgMTI1MzcsIDB4MDAwMDgxRkIgfSwgLyogR0xfU0hBUkVEX1RFWFRVUkVfUEFMRVRURV9FWFQgKi8KKyAgIHsgMTI1NjcsIDB4MDAwMDgyMTAgfSwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElORyAqLworICAgeyAxMjYwOCwgMHgwMDAwODIxMSB9LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFICovCisgICB7IDEyNjQ5LCAweDAwMDA4MjEyIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfUkVEX1NJWkUgKi8KKyAgIHsgMTI2ODQsIDB4MDAwMDgyMTMgfSwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFICovCisgICB7IDEyNzIxLCAweDAwMDA4MjE0IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQkxVRV9TSVpFICovCisgICB7IDEyNzU3LCAweDAwMDA4MjE1IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQUxQSEFfU0laRSAqLworICAgeyAxMjc5NCwgMHgwMDAwODIxNiB9LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkUgKi8KKyAgIHsgMTI4MzEsIDB4MDAwMDgyMTcgfSwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9TVEVOQ0lMX1NJWkUgKi8KKyAgIHsgMTI4NzAsIDB4MDAwMDgyMTggfSwgLyogR0xfRlJBTUVCVUZGRVJfREVGQVVMVCAqLworICAgeyAxMjg5MywgMHgwMDAwODIxOSB9LCAvKiBHTF9GUkFNRUJVRkZFUl9VTkRFRklORUQgKi8KKyAgIHsgMTI5MTgsIDB4MDAwMDgyMUEgfSwgLyogR0xfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UICovCisgICB7IDEyOTQ2LCAweDAwMDA4MjFCIH0sIC8qIEdMX01BSk9SX1ZFUlNJT04gKi8KKyAgIHsgMTI5NjMsIDB4MDAwMDgyMUMgfSwgLyogR0xfTUlOT1JfVkVSU0lPTiAqLworICAgeyAxMjk4MCwgMHgwMDAwODIxRCB9LCAvKiBHTF9OVU1fRVhURU5TSU9OUyAqLworICAgeyAxMjk5OCwgMHgwMDAwODIxRSB9LCAvKiBHTF9DT05URVhUX0ZMQUdTICovCisgICB7IDEzMDE1LCAweDAwMDA4MjFGIH0sIC8qIEdMX0JVRkZFUl9JTU1VVEFCTEVfU1RPUkFHRSAqLworICAgeyAxMzA0MywgMHgwMDAwODIyMCB9LCAvKiBHTF9CVUZGRVJfU1RPUkFHRV9GTEFHUyAqLworICAgeyAxMzA2NywgMHgwMDAwODIyMiB9LCAvKiBHTF9JTkRFWCAqLworICAgeyAxMzA3NiwgMHgwMDAwODIyMyB9LCAvKiBHTF9ERVBUSF9CVUZGRVIgKi8KKyAgIHsgMTMwOTIsIDB4MDAwMDgyMjQgfSwgLyogR0xfU1RFTkNJTF9CVUZGRVIgKi8KKyAgIHsgMTMxMTAsIDB4MDAwMDgyMjUgfSwgLyogR0xfQ09NUFJFU1NFRF9SRUQgKi8KKyAgIHsgMTMxMjgsIDB4MDAwMDgyMjYgfSwgLyogR0xfQ09NUFJFU1NFRF9SRyAqLworICAgeyAxMzE0NSwgMHgwMDAwODIyNyB9LCAvKiBHTF9SRyAqLworICAgeyAxMzE1MSwgMHgwMDAwODIyOCB9LCAvKiBHTF9SR19JTlRFR0VSICovCisgICB7IDEzMTY1LCAweDAwMDA4MjI5IH0sIC8qIEdMX1I4ICovCisgICB7IDEzMTcxLCAweDAwMDA4MjJBIH0sIC8qIEdMX1IxNiAqLworICAgeyAxMzE3OCwgMHgwMDAwODIyQiB9LCAvKiBHTF9SRzggKi8KKyAgIHsgMTMxODUsIDB4MDAwMDgyMkMgfSwgLyogR0xfUkcxNiAqLworICAgeyAxMzE5MywgMHgwMDAwODIyRCB9LCAvKiBHTF9SMTZGICovCisgICB7IDEzMjAxLCAweDAwMDA4MjJFIH0sIC8qIEdMX1IzMkYgKi8KKyAgIHsgMTMyMDksIDB4MDAwMDgyMkYgfSwgLyogR0xfUkcxNkYgKi8KKyAgIHsgMTMyMTgsIDB4MDAwMDgyMzAgfSwgLyogR0xfUkczMkYgKi8KKyAgIHsgMTMyMjcsIDB4MDAwMDgyMzEgfSwgLyogR0xfUjhJICovCisgICB7IDEzMjM0LCAweDAwMDA4MjMyIH0sIC8qIEdMX1I4VUkgKi8KKyAgIHsgMTMyNDIsIDB4MDAwMDgyMzMgfSwgLyogR0xfUjE2SSAqLworICAgeyAxMzI1MCwgMHgwMDAwODIzNCB9LCAvKiBHTF9SMTZVSSAqLworICAgeyAxMzI1OSwgMHgwMDAwODIzNSB9LCAvKiBHTF9SMzJJICovCisgICB7IDEzMjY3LCAweDAwMDA4MjM2IH0sIC8qIEdMX1IzMlVJICovCisgICB7IDEzMjc2LCAweDAwMDA4MjM3IH0sIC8qIEdMX1JHOEkgKi8KKyAgIHsgMTMyODQsIDB4MDAwMDgyMzggfSwgLyogR0xfUkc4VUkgKi8KKyAgIHsgMTMyOTMsIDB4MDAwMDgyMzkgfSwgLyogR0xfUkcxNkkgKi8KKyAgIHsgMTMzMDIsIDB4MDAwMDgyM0EgfSwgLyogR0xfUkcxNlVJICovCisgICB7IDEzMzEyLCAweDAwMDA4MjNCIH0sIC8qIEdMX1JHMzJJICovCisgICB7IDEzMzIxLCAweDAwMDA4MjNDIH0sIC8qIEdMX1JHMzJVSSAqLworICAgeyAxMzMzMSwgMHgwMDAwODI0MiB9LCAvKiBHTF9ERUJVR19PVVRQVVRfU1lOQ0hST05PVVNfQVJCICovCisgICB7IDEzMzYzLCAweDAwMDA4MjQzIH0sIC8qIEdMX0RFQlVHX05FWFRfTE9HR0VEX01FU1NBR0VfTEVOR1RIX0FSQiAqLworICAgeyAxMzQwMywgMHgwMDAwODI0NCB9LCAvKiBHTF9ERUJVR19DQUxMQkFDS19GVU5DVElPTl9BUkIgKi8KKyAgIHsgMTM0MzQsIDB4MDAwMDgyNDUgfSwgLyogR0xfREVCVUdfQ0FMTEJBQ0tfVVNFUl9QQVJBTV9BUkIgKi8KKyAgIHsgMTM0NjcsIDB4MDAwMDgyNDYgfSwgLyogR0xfREVCVUdfU09VUkNFX0FQSV9BUkIgKi8KKyAgIHsgMTM0OTEsIDB4MDAwMDgyNDcgfSwgLyogR0xfREVCVUdfU09VUkNFX1dJTkRPV19TWVNURU1fQVJCICovCisgICB7IDEzNTI1LCAweDAwMDA4MjQ4IH0sIC8qIEdMX0RFQlVHX1NPVVJDRV9TSEFERVJfQ09NUElMRVJfQVJCICovCisgICB7IDEzNTYxLCAweDAwMDA4MjQ5IH0sIC8qIEdMX0RFQlVHX1NPVVJDRV9USElSRF9QQVJUWV9BUkIgKi8KKyAgIHsgMTM1OTMsIDB4MDAwMDgyNEEgfSwgLyogR0xfREVCVUdfU09VUkNFX0FQUExJQ0FUSU9OX0FSQiAqLworICAgeyAxMzYyNSwgMHgwMDAwODI0QiB9LCAvKiBHTF9ERUJVR19TT1VSQ0VfT1RIRVJfQVJCICovCisgICB7IDEzNjUxLCAweDAwMDA4MjRDIH0sIC8qIEdMX0RFQlVHX1RZUEVfRVJST1JfQVJCICovCisgICB7IDEzNjc1LCAweDAwMDA4MjREIH0sIC8qIEdMX0RFQlVHX1RZUEVfREVQUkVDQVRFRF9CRUhBVklPUl9BUkIgKi8KKyAgIHsgMTM3MTMsIDB4MDAwMDgyNEUgfSwgLyogR0xfREVCVUdfVFlQRV9VTkRFRklORURfQkVIQVZJT1JfQVJCICovCisgICB7IDEzNzUwLCAweDAwMDA4MjRGIH0sIC8qIEdMX0RFQlVHX1RZUEVfUE9SVEFCSUxJVFlfQVJCICovCisgICB7IDEzNzgwLCAweDAwMDA4MjUwIH0sIC8qIEdMX0RFQlVHX1RZUEVfUEVSRk9STUFOQ0VfQVJCICovCisgICB7IDEzODEwLCAweDAwMDA4MjUxIH0sIC8qIEdMX0RFQlVHX1RZUEVfT1RIRVJfQVJCICovCisgICB7IDEzODM0LCAweDAwMDA4MjUyIH0sIC8qIEdMX0xPU0VfQ09OVEVYVF9PTl9SRVNFVF9BUkIgKi8KKyAgIHsgMTM4NjMsIDB4MDAwMDgyNTMgfSwgLyogR0xfR1VJTFRZX0NPTlRFWFRfUkVTRVRfQVJCICovCisgICB7IDEzODkxLCAweDAwMDA4MjU0IH0sIC8qIEdMX0lOTk9DRU5UX0NPTlRFWFRfUkVTRVRfQVJCICovCisgICB7IDEzOTIxLCAweDAwMDA4MjU1IH0sIC8qIEdMX1VOS05PV05fQ09OVEVYVF9SRVNFVF9BUkIgKi8KKyAgIHsgMTM5NTAsIDB4MDAwMDgyNTYgfSwgLyogR0xfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0FSQiAqLworICAgeyAxMzk4NSwgMHgwMDAwODI1NyB9LCAvKiBHTF9QUk9HUkFNX0JJTkFSWV9SRVRSSUVWQUJMRV9ISU5UICovCisgICB7IDE0MDIwLCAweDAwMDA4MjU4IH0sIC8qIEdMX1BST0dSQU1fU0VQQVJBQkxFX0VYVCAqLworICAgeyAxNDA0NSwgMHgwMDAwODI1OSB9LCAvKiBHTF9BQ1RJVkVfUFJPR1JBTV9FWFQgKi8KKyAgIHsgMTQwNjcsIDB4MDAwMDgyNUEgfSwgLyogR0xfUFJPR1JBTV9QSVBFTElORV9CSU5ESU5HX0VYVCAqLworICAgeyAxNDA5OSwgMHgwMDAwODI1QiB9LCAvKiBHTF9NQVhfVklFV1BPUlRTICovCisgICB7IDE0MTE2LCAweDAwMDA4MjVDIH0sIC8qIEdMX1ZJRVdQT1JUX1NVQlBJWEVMX0JJVFMgKi8KKyAgIHsgMTQxNDIsIDB4MDAwMDgyNUQgfSwgLyogR0xfVklFV1BPUlRfQk9VTkRTX1JBTkdFICovCisgICB7IDE0MTY3LCAweDAwMDA4MjVFIH0sIC8qIEdMX0xBWUVSX1BST1ZPS0lOR19WRVJURVggKi8KKyAgIHsgMTQxOTMsIDB4MDAwMDgyNUYgfSwgLyogR0xfVklFV1BPUlRfSU5ERVhfUFJPVk9LSU5HX1ZFUlRFWCAqLworICAgeyAxNDIyOCwgMHgwMDAwODI2MCB9LCAvKiBHTF9VTkRFRklORURfVkVSVEVYICovCisgICB7IDE0MjQ4LCAweDAwMDA4MjYxIH0sIC8qIEdMX05PX1JFU0VUX05PVElGSUNBVElPTl9BUkIgKi8KKyAgIHsgMTQyNzcsIDB4MDAwMDgyNjIgfSwgLyogR0xfTUFYX0NPTVBVVEVfU0hBUkVEX01FTU9SWV9TSVpFICovCisgICB7IDE0MzExLCAweDAwMDA4MjYzIH0sIC8qIEdMX01BWF9DT01QVVRFX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworICAgeyAxNDM0NSwgMHgwMDAwODI2NCB9LCAvKiBHTF9NQVhfQ09NUFVURV9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisgICB7IDE0MzgzLCAweDAwMDA4MjY1IH0sIC8qIEdMX01BWF9DT01QVVRFX0FUT01JQ19DT1VOVEVSUyAqLworICAgeyAxNDQxNCwgMHgwMDAwODI2NiB9LCAvKiBHTF9NQVhfQ09NQklORURfQ09NUFVURV9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKyAgIHsgMTQ0NTcsIDB4MDAwMDgyNjcgfSwgLyogR0xfQ09NUFVURV9XT1JLX0dST1VQX1NJWkUgKi8KKyAgIHsgMTQ0ODQsIDB4MDAwMDgyNjggfSwgLyogR0xfREVCVUdfVFlQRV9NQVJLRVIgKi8KKyAgIHsgMTQ1MDUsIDB4MDAwMDgyNjkgfSwgLyogR0xfREVCVUdfVFlQRV9QVVNIX0dST1VQICovCisgICB7IDE0NTMwLCAweDAwMDA4MjZBIH0sIC8qIEdMX0RFQlVHX1RZUEVfUE9QX0dST1VQICovCisgICB7IDE0NTU0LCAweDAwMDA4MjZCIH0sIC8qIEdMX0RFQlVHX1NFVkVSSVRZX05PVElGSUNBVElPTiAqLworICAgeyAxNDU4NSwgMHgwMDAwODI2QyB9LCAvKiBHTF9NQVhfREVCVUdfR1JPVVBfU1RBQ0tfREVQVEggKi8KKyAgIHsgMTQ2MTYsIDB4MDAwMDgyNkQgfSwgLyogR0xfREVCVUdfR1JPVVBfU1RBQ0tfREVQVEggKi8KKyAgIHsgMTQ2NDMsIDB4MDAwMDgyRDQgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9CSU5ESU5HICovCisgICB7IDE0NjY4LCAweDAwMDA4MkQ1IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfUkVMQVRJVkVfT0ZGU0VUICovCisgICB7IDE0NzAxLCAweDAwMDA4MkQ2IH0sIC8qIEdMX1ZFUlRFWF9CSU5ESU5HX0RJVklTT1IgKi8KKyAgIHsgMTQ3MjcsIDB4MDAwMDgyRDcgfSwgLyogR0xfVkVSVEVYX0JJTkRJTkdfT0ZGU0VUICovCisgICB7IDE0NzUyLCAweDAwMDA4MkQ4IH0sIC8qIEdMX1ZFUlRFWF9CSU5ESU5HX1NUUklERSAqLworICAgeyAxNDc3NywgMHgwMDAwODJEOSB9LCAvKiBHTF9NQVhfVkVSVEVYX0FUVFJJQl9SRUxBVElWRV9PRkZTRVQgKi8KKyAgIHsgMTQ4MTQsIDB4MDAwMDgyREEgfSwgLyogR0xfTUFYX1ZFUlRFWF9BVFRSSUJfQklORElOR1MgKi8KKyAgIHsgMTQ4NDQsIDB4MDAwMDgyREYgfSwgLyogR0xfVEVYVFVSRV9JTU1VVEFCTEVfTEVWRUxTICovCisgICB7IDE0ODcyLCAweDAwMDA4MkUwIH0sIC8qIEdMX0JVRkZFUiAqLworICAgeyAxNDg4MiwgMHgwMDAwODJFMSB9LCAvKiBHTF9TSEFERVIgKi8KKyAgIHsgMTQ4OTIsIDB4MDAwMDgyRTIgfSwgLyogR0xfUFJPR1JBTSAqLworICAgeyAxNDkwMywgMHgwMDAwODJFMyB9LCAvKiBHTF9RVUVSWSAqLworICAgeyAxNDkxMiwgMHgwMDAwODJFNCB9LCAvKiBHTF9QUk9HUkFNX1BJUEVMSU5FICovCisgICB7IDE0OTMyLCAweDAwMDA4MkU2IH0sIC8qIEdMX1NBTVBMRVIgKi8KKyAgIHsgMTQ5NDMsIDB4MDAwMDgyRTcgfSwgLyogR0xfRElTUExBWV9MSVNUICovCisgICB7IDE0OTU5LCAweDAwMDA4MkU4IH0sIC8qIEdMX01BWF9MQUJFTF9MRU5HVEggKi8KKyAgIHsgMTQ5NzksIDB4MDAwMDgzNjIgfSwgLyogR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYgKi8KKyAgIHsgMTUwMDYsIDB4MDAwMDgzNjMgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfNV82XzUgKi8KKyAgIHsgMTUwMzAsIDB4MDAwMDgzNjQgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfNV82XzVfUkVWICovCisgICB7IDE1MDU4LCAweDAwMDA4MzY1IH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWICovCisgICB7IDE1MDg4LCAweDAwMDA4MzY2IH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWICovCisgICB7IDE1MTE4LCAweDAwMDA4MzY3IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViAqLworICAgeyAxNTE0NiwgMHgwMDAwODM2OCB9LCAvKiBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYgKi8KKyAgIHsgMTUxNzcsIDB4MDAwMDgzNjkgfSwgLyogR0xfVEVYVFVSRV9NQVhfQ0xBTVBfU19TR0lYICovCisgICB7IDE1MjA1LCAweDAwMDA4MzZBIH0sIC8qIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1RfU0dJWCAqLworICAgeyAxNTIzMywgMHgwMDAwODM2QiB9LCAvKiBHTF9URVhUVVJFX01BWF9DTEFNUF9SX1NHSVggKi8KKyAgIHsgMTUyNjEsIDB4MDAwMDgzNzAgfSwgLyogR0xfTUlSUk9SRURfUkVQRUFUICovCisgICB7IDE1MjgwLCAweDAwMDA4M0EwIH0sIC8qIEdMX1JHQl9TM1RDICovCisgICB7IDE1MjkyLCAweDAwMDA4M0ExIH0sIC8qIEdMX1JHQjRfUzNUQyAqLworICAgeyAxNTMwNSwgMHgwMDAwODNBMiB9LCAvKiBHTF9SR0JBX1MzVEMgKi8KKyAgIHsgMTUzMTgsIDB4MDAwMDgzQTMgfSwgLyogR0xfUkdCQTRfUzNUQyAqLworICAgeyAxNTMzMiwgMHgwMDAwODNBNCB9LCAvKiBHTF9SR0JBX0RYVDVfUzNUQyAqLworICAgeyAxNTM1MCwgMHgwMDAwODNBNSB9LCAvKiBHTF9SR0JBNF9EWFQ1X1MzVEMgKi8KKyAgIHsgMTUzNjksIDB4MDAwMDgzRjAgfSwgLyogR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCAqLworICAgeyAxNTQwMSwgMHgwMDAwODNGMSB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCAqLworICAgeyAxNTQzNCwgMHgwMDAwODNGMiB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0FOR0xFICovCisgICB7IDE1NDY5LCAweDAwMDA4M0YzIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfQU5HTEUgKi8KKyAgIHsgMTU1MDQsIDB4MDAwMDgzRjkgfSwgLyogR0xfUEVSRlFVRVJZX0RPTk9UX0ZMVVNIX0lOVEVMICovCisgICB7IDE1NTM1LCAweDAwMDA4M0ZBIH0sIC8qIEdMX1BFUkZRVUVSWV9GTFVTSF9JTlRFTCAqLworICAgeyAxNTU2MCwgMHgwMDAwODNGQiB9LCAvKiBHTF9QRVJGUVVFUllfV0FJVF9JTlRFTCAqLworICAgeyAxNTU4NCwgMHgwMDAwODQ0RCB9LCAvKiBHTF9ORUFSRVNUX0NMSVBNQVBfTkVBUkVTVF9TR0lYICovCisgICB7IDE1NjE2LCAweDAwMDA4NDRFIH0sIC8qIEdMX05FQVJFU1RfQ0xJUE1BUF9MSU5FQVJfU0dJWCAqLworICAgeyAxNTY0NywgMHgwMDAwODQ0RiB9LCAvKiBHTF9MSU5FQVJfQ0xJUE1BUF9ORUFSRVNUX1NHSVggKi8KKyAgIHsgMTU2NzgsIDB4MDAwMDg0NTAgfSwgLyogR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFICovCisgICB7IDE1NzAzLCAweDAwMDA4NDUxIH0sIC8qIEdMX0ZPR19DT09SRCAqLworICAgeyAxNTcxNiwgMHgwMDAwODQ1MiB9LCAvKiBHTF9GUkFHTUVOVF9ERVBUSCAqLworICAgeyAxNTczNCwgMHgwMDAwODQ1MyB9LCAvKiBHTF9DVVJSRU5UX0ZPR19DT09SRCAqLworICAgeyAxNTc1NSwgMHgwMDAwODQ1NCB9LCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFICovCisgICB7IDE1Nzg0LCAweDAwMDA4NDU1IH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1NUUklERSAqLworICAgeyAxNTgxNSwgMHgwMDAwODQ1NiB9LCAvKiBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSICovCisgICB7IDE1ODQ3LCAweDAwMDA4NDU3IH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZICovCisgICB7IDE1ODcxLCAweDAwMDA4NDU4IH0sIC8qIEdMX0NPTE9SX1NVTSAqLworICAgeyAxNTg4NCwgMHgwMDAwODQ1OSB9LCAvKiBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUiAqLworICAgeyAxNTkxMSwgMHgwMDAwODQ1QSB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRSAqLworICAgeyAxNTk0MSwgMHgwMDAwODQ1QiB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfVFlQRSAqLworICAgeyAxNTk3MSwgMHgwMDAwODQ1QyB9LCAvKiBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFICovCisgICB7IDE2MDAzLCAweDAwMDA4NDVEIH0sIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9QT0lOVEVSICovCisgICB7IDE2MDM2LCAweDAwMDA4NDVFIH0sIC8qIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWSAqLworICAgeyAxNjA2MSwgMHgwMDAwODQ1RiB9LCAvKiBHTF9DVVJSRU5UX1JBU1RFUl9TRUNPTkRBUllfQ09MT1IgKi8KKyAgIHsgMTYwOTUsIDB4MDAwMDg0NkQgfSwgLyogR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICovCisgICB7IDE2MTIzLCAweDAwMDA4NDZFIH0sIC8qIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAqLworICAgeyAxNjE1MSwgMHgwMDAwODRDMCB9LCAvKiBHTF9URVhUVVJFMCAqLworICAgeyAxNjE2MywgMHgwMDAwODRDMSB9LCAvKiBHTF9URVhUVVJFMSAqLworICAgeyAxNjE3NSwgMHgwMDAwODRDMiB9LCAvKiBHTF9URVhUVVJFMiAqLworICAgeyAxNjE4NywgMHgwMDAwODRDMyB9LCAvKiBHTF9URVhUVVJFMyAqLworICAgeyAxNjE5OSwgMHgwMDAwODRDNCB9LCAvKiBHTF9URVhUVVJFNCAqLworICAgeyAxNjIxMSwgMHgwMDAwODRDNSB9LCAvKiBHTF9URVhUVVJFNSAqLworICAgeyAxNjIyMywgMHgwMDAwODRDNiB9LCAvKiBHTF9URVhUVVJFNiAqLworICAgeyAxNjIzNSwgMHgwMDAwODRDNyB9LCAvKiBHTF9URVhUVVJFNyAqLworICAgeyAxNjI0NywgMHgwMDAwODRDOCB9LCAvKiBHTF9URVhUVVJFOCAqLworICAgeyAxNjI1OSwgMHgwMDAwODRDOSB9LCAvKiBHTF9URVhUVVJFOSAqLworICAgeyAxNjI3MSwgMHgwMDAwODRDQSB9LCAvKiBHTF9URVhUVVJFMTAgKi8KKyAgIHsgMTYyODQsIDB4MDAwMDg0Q0IgfSwgLyogR0xfVEVYVFVSRTExICovCisgICB7IDE2Mjk3LCAweDAwMDA4NENDIH0sIC8qIEdMX1RFWFRVUkUxMiAqLworICAgeyAxNjMxMCwgMHgwMDAwODRDRCB9LCAvKiBHTF9URVhUVVJFMTMgKi8KKyAgIHsgMTYzMjMsIDB4MDAwMDg0Q0UgfSwgLyogR0xfVEVYVFVSRTE0ICovCisgICB7IDE2MzM2LCAweDAwMDA4NENGIH0sIC8qIEdMX1RFWFRVUkUxNSAqLworICAgeyAxNjM0OSwgMHgwMDAwODREMCB9LCAvKiBHTF9URVhUVVJFMTYgKi8KKyAgIHsgMTYzNjIsIDB4MDAwMDg0RDEgfSwgLyogR0xfVEVYVFVSRTE3ICovCisgICB7IDE2Mzc1LCAweDAwMDA4NEQyIH0sIC8qIEdMX1RFWFRVUkUxOCAqLworICAgeyAxNjM4OCwgMHgwMDAwODREMyB9LCAvKiBHTF9URVhUVVJFMTkgKi8KKyAgIHsgMTY0MDEsIDB4MDAwMDg0RDQgfSwgLyogR0xfVEVYVFVSRTIwICovCisgICB7IDE2NDE0LCAweDAwMDA4NEQ1IH0sIC8qIEdMX1RFWFRVUkUyMSAqLworICAgeyAxNjQyNywgMHgwMDAwODRENiB9LCAvKiBHTF9URVhUVVJFMjIgKi8KKyAgIHsgMTY0NDAsIDB4MDAwMDg0RDcgfSwgLyogR0xfVEVYVFVSRTIzICovCisgICB7IDE2NDUzLCAweDAwMDA4NEQ4IH0sIC8qIEdMX1RFWFRVUkUyNCAqLworICAgeyAxNjQ2NiwgMHgwMDAwODREOSB9LCAvKiBHTF9URVhUVVJFMjUgKi8KKyAgIHsgMTY0NzksIDB4MDAwMDg0REEgfSwgLyogR0xfVEVYVFVSRTI2ICovCisgICB7IDE2NDkyLCAweDAwMDA4NERCIH0sIC8qIEdMX1RFWFRVUkUyNyAqLworICAgeyAxNjUwNSwgMHgwMDAwODREQyB9LCAvKiBHTF9URVhUVVJFMjggKi8KKyAgIHsgMTY1MTgsIDB4MDAwMDg0REQgfSwgLyogR0xfVEVYVFVSRTI5ICovCisgICB7IDE2NTMxLCAweDAwMDA4NERFIH0sIC8qIEdMX1RFWFRVUkUzMCAqLworICAgeyAxNjU0NCwgMHgwMDAwODRERiB9LCAvKiBHTF9URVhUVVJFMzEgKi8KKyAgIHsgMTY1NTcsIDB4MDAwMDg0RTAgfSwgLyogR0xfQUNUSVZFX1RFWFRVUkUgKi8KKyAgIHsgMTY1NzUsIDB4MDAwMDg0RTEgfSwgLyogR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFICovCisgICB7IDE2NjAwLCAweDAwMDA4NEUyIH0sIC8qIEdMX01BWF9URVhUVVJFX1VOSVRTICovCisgICB7IDE2NjIxLCAweDAwMDA4NEUzIH0sIC8qIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYICovCisgICB7IDE2NjUxLCAweDAwMDA4NEU0IH0sIC8qIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWCAqLworICAgeyAxNjY4MiwgMHgwMDAwODRFNSB9LCAvKiBHTF9UUkFOU1BPU0VfVEVYVFVSRV9NQVRSSVggKi8KKyAgIHsgMTY3MTAsIDB4MDAwMDg0RTYgfSwgLyogR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWCAqLworICAgeyAxNjczNiwgMHgwMDAwODRFNyB9LCAvKiBHTF9TVUJUUkFDVCAqLworICAgeyAxNjc0OCwgMHgwMDAwODRFOCB9LCAvKiBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkUgKi8KKyAgIHsgMTY3NzMsIDB4MDAwMDg0RTkgfSwgLyogR0xfQ09NUFJFU1NFRF9BTFBIQSAqLworICAgeyAxNjc5MywgMHgwMDAwODRFQSB9LCAvKiBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRSAqLworICAgeyAxNjgxNywgMHgwMDAwODRFQiB9LCAvKiBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQSAqLworICAgeyAxNjg0NywgMHgwMDAwODRFQyB9LCAvKiBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWSAqLworICAgeyAxNjg3MSwgMHgwMDAwODRFRCB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQiAqLworICAgeyAxNjg4OSwgMHgwMDAwODRFRSB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkEgKi8KKyAgIHsgMTY5MDgsIDB4MDAwMDg0RUYgfSwgLyogR0xfVEVYVFVSRV9DT01QUkVTU0lPTl9ISU5UICovCisgICB7IDE2OTM2LCAweDAwMDA4NEY1IH0sIC8qIEdMX1RFWFRVUkVfUkVDVEFOR0xFICovCisgICB7IDE2OTU3LCAweDAwMDA4NEY2IH0sIC8qIEdMX1RFWFRVUkVfQklORElOR19SRUNUQU5HTEUgKi8KKyAgIHsgMTY5ODYsIDB4MDAwMDg0RjcgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEUgKi8KKyAgIHsgMTcwMTMsIDB4MDAwMDg0RjggfSwgLyogR0xfTUFYX1JFQ1RBTkdMRV9URVhUVVJFX1NJWkUgKi8KKyAgIHsgMTcwNDMsIDB4MDAwMDg0RjkgfSwgLyogR0xfREVQVEhfU1RFTkNJTCAqLworICAgeyAxNzA2MCwgMHgwMDAwODRGQSB9LCAvKiBHTF9VTlNJR05FRF9JTlRfMjRfOCAqLworICAgeyAxNzA4MSwgMHgwMDAwODRGRCB9LCAvKiBHTF9NQVhfVEVYVFVSRV9MT0RfQklBUyAqLworICAgeyAxNzEwNSwgMHgwMDAwODRGRSB9LCAvKiBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAqLworICAgeyAxNzEzNSwgMHgwMDAwODRGRiB9LCAvKiBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKi8KKyAgIHsgMTcxNjksIDB4MDAwMDg1MDAgfSwgLyogR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTCAqLworICAgeyAxNzE5NSwgMHgwMDAwODUwMSB9LCAvKiBHTF9URVhUVVJFX0xPRF9CSUFTICovCisgICB7IDE3MjE1LCAweDAwMDA4NTAzIH0sIC8qIEdMX0NPTUJJTkU0X05WICovCisgICB7IDE3MjMwLCAweDAwMDA4NTA0IH0sIC8qIEdMX01BWF9TSElOSU5FU1NfTlYgKi8KKyAgIHsgMTcyNTAsIDB4MDAwMDg1MDUgfSwgLyogR0xfTUFYX1NQT1RfRVhQT05FTlRfTlYgKi8KKyAgIHsgMTcyNzQsIDB4MDAwMDg1MDcgfSwgLyogR0xfSU5DUl9XUkFQICovCisgICB7IDE3Mjg3LCAweDAwMDA4NTA4IH0sIC8qIEdMX0RFQ1JfV1JBUCAqLworICAgeyAxNzMwMCwgMHgwMDAwODUwQSB9LCAvKiBHTF9NT0RFTFZJRVcxX0FSQiAqLworICAgeyAxNzMxOCwgMHgwMDAwODUxMSB9LCAvKiBHTF9OT1JNQUxfTUFQICovCisgICB7IDE3MzMyLCAweDAwMDA4NTEyIH0sIC8qIEdMX1JFRkxFQ1RJT05fTUFQICovCisgICB7IDE3MzUwLCAweDAwMDA4NTEzIH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVAgKi8KKyAgIHsgMTczNzAsIDB4MDAwMDg1MTQgfSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICovCisgICB7IDE3Mzk4LCAweDAwMDA4NTE1IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAqLworICAgeyAxNzQyOSwgMHgwMDAwODUxNiB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggKi8KKyAgIHsgMTc0NjAsIDB4MDAwMDg1MTcgfSwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICovCisgICB7IDE3NDkxLCAweDAwMDA4NTE4IH0sIC8qIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAqLworICAgeyAxNzUyMiwgMHgwMDAwODUxOSB9LCAvKiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogKi8KKyAgIHsgMTc1NTMsIDB4MDAwMDg1MUEgfSwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aICovCisgICB7IDE3NTg0LCAweDAwMDA4NTFCIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAgKi8KKyAgIHsgMTc2MTAsIDB4MDAwMDg1MUMgfSwgLyogR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAqLworICAgeyAxNzYzOSwgMHgwMDAwODUzNCB9LCAvKiBHTF9NVUxUSVNBTVBMRV9GSUxURVJfSElOVF9OViAqLworICAgeyAxNzY2OSwgMHgwMDAwODU1OCB9LCAvKiBHTF9QUklNSVRJVkVfUkVTVEFSVF9OViAqLworICAgeyAxNzY5MywgMHgwMDAwODU1OSB9LCAvKiBHTF9QUklNSVRJVkVfUkVTVEFSVF9JTkRFWF9OViAqLworICAgeyAxNzcyMywgMHgwMDAwODU1QSB9LCAvKiBHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViAqLworICAgeyAxNzc0NywgMHgwMDAwODU1QiB9LCAvKiBHTF9FWUVfUkFESUFMX05WICovCisgICB7IDE3NzY0LCAweDAwMDA4NTVDIH0sIC8qIEdMX0VZRV9QTEFORV9BQlNPTFVURV9OViAqLworICAgeyAxNzc4OSwgMHgwMDAwODU3MCB9LCAvKiBHTF9DT01CSU5FICovCisgICB7IDE3ODAwLCAweDAwMDA4NTcxIH0sIC8qIEdMX0NPTUJJTkVfUkdCICovCisgICB7IDE3ODE1LCAweDAwMDA4NTcyIH0sIC8qIEdMX0NPTUJJTkVfQUxQSEEgKi8KKyAgIHsgMTc4MzIsIDB4MDAwMDg1NzMgfSwgLyogR0xfUkdCX1NDQUxFICovCisgICB7IDE3ODQ1LCAweDAwMDA4NTc0IH0sIC8qIEdMX0FERF9TSUdORUQgKi8KKyAgIHsgMTc4NTksIDB4MDAwMDg1NzUgfSwgLyogR0xfSU5URVJQT0xBVEUgKi8KKyAgIHsgMTc4NzQsIDB4MDAwMDg1NzYgfSwgLyogR0xfQ09OU1RBTlQgKi8KKyAgIHsgMTc4ODYsIDB4MDAwMDg1NzcgfSwgLyogR0xfUFJJTUFSWV9DT0xPUiAqLworICAgeyAxNzkwMywgMHgwMDAwODU3OCB9LCAvKiBHTF9QUkVWSU9VUyAqLworICAgeyAxNzkxNSwgMHgwMDAwODU4MCB9LCAvKiBHTF9TT1VSQ0UwX1JHQiAqLworICAgeyAxNzkzMCwgMHgwMDAwODU4MSB9LCAvKiBHTF9TT1VSQ0UxX1JHQiAqLworICAgeyAxNzk0NSwgMHgwMDAwODU4MiB9LCAvKiBHTF9TT1VSQ0UyX1JHQiAqLworICAgeyAxNzk2MCwgMHgwMDAwODU4MyB9LCAvKiBHTF9TT1VSQ0UzX1JHQl9OViAqLworICAgeyAxNzk3OCwgMHgwMDAwODU4OCB9LCAvKiBHTF9TT1VSQ0UwX0FMUEhBICovCisgICB7IDE3OTk1LCAweDAwMDA4NTg5IH0sIC8qIEdMX1NPVVJDRTFfQUxQSEEgKi8KKyAgIHsgMTgwMTIsIDB4MDAwMDg1OEEgfSwgLyogR0xfU09VUkNFMl9BTFBIQSAqLworICAgeyAxODAyOSwgMHgwMDAwODU4QiB9LCAvKiBHTF9TT1VSQ0UzX0FMUEhBX05WICovCisgICB7IDE4MDQ5LCAweDAwMDA4NTkwIH0sIC8qIEdMX09QRVJBTkQwX1JHQiAqLworICAgeyAxODA2NSwgMHgwMDAwODU5MSB9LCAvKiBHTF9PUEVSQU5EMV9SR0IgKi8KKyAgIHsgMTgwODEsIDB4MDAwMDg1OTIgfSwgLyogR0xfT1BFUkFORDJfUkdCICovCisgICB7IDE4MDk3LCAweDAwMDA4NTkzIH0sIC8qIEdMX09QRVJBTkQzX1JHQl9OViAqLworICAgeyAxODExNiwgMHgwMDAwODU5OCB9LCAvKiBHTF9PUEVSQU5EMF9BTFBIQSAqLworICAgeyAxODEzNCwgMHgwMDAwODU5OSB9LCAvKiBHTF9PUEVSQU5EMV9BTFBIQSAqLworICAgeyAxODE1MiwgMHgwMDAwODU5QSB9LCAvKiBHTF9PUEVSQU5EMl9BTFBIQSAqLworICAgeyAxODE3MCwgMHgwMDAwODU5QiB9LCAvKiBHTF9PUEVSQU5EM19BTFBIQV9OViAqLworICAgeyAxODE5MSwgMHgwMDAwODVCMyB9LCAvKiBHTF9CVUZGRVJfT0JKRUNUX0FQUExFICovCisgICB7IDE4MjE0LCAweDAwMDA4NUI1IH0sIC8qIEdMX1ZFUlRFWF9BUlJBWV9CSU5ESU5HICovCisgICB7IDE4MjM4LCAweDAwMDA4NUI3IH0sIC8qIEdMX1RFWFRVUkVfUkFOR0VfTEVOR1RIX0FQUExFICovCisgICB7IDE4MjY4LCAweDAwMDA4NUI4IH0sIC8qIEdMX1RFWFRVUkVfUkFOR0VfUE9JTlRFUl9BUFBMRSAqLworICAgeyAxODI5OSwgMHgwMDAwODVCOSB9LCAvKiBHTF9ZQ0JDUl80MjJfQVBQTEUgKi8KKyAgIHsgMTgzMTgsIDB4MDAwMDg1QkEgfSwgLyogR0xfVU5TSUdORURfU0hPUlRfOF84X0FQUExFICovCisgICB7IDE4MzQ2LCAweDAwMDA4NUJCIH0sIC8qIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUgKi8KKyAgIHsgMTgzNzgsIDB4MDAwMDg1QkMgfSwgLyogR0xfVEVYVFVSRV9TVE9SQUdFX0hJTlRfQVBQTEUgKi8KKyAgIHsgMTg0MDgsIDB4MDAwMDg1QkQgfSwgLyogR0xfU1RPUkFHRV9QUklWQVRFX0FQUExFICovCisgICB7IDE4NDMzLCAweDAwMDA4NUJFIH0sIC8qIEdMX1NUT1JBR0VfQ0FDSEVEX0FQUExFICovCisgICB7IDE4NDU3LCAweDAwMDA4NUJGIH0sIC8qIEdMX1NUT1JBR0VfU0hBUkVEX0FQUExFICovCisgICB7IDE4NDgxLCAweDAwMDA4NUNDIH0sIC8qIEdMX1NMSUNFX0FDQ1VNX1NVTiAqLworICAgeyAxODUwMCwgMHgwMDAwODYxNCB9LCAvKiBHTF9RVUFEX01FU0hfU1VOICovCisgICB7IDE4NTE3LCAweDAwMDA4NjE1IH0sIC8qIEdMX1RSSUFOR0xFX01FU0hfU1VOICovCisgICB7IDE4NTM4LCAweDAwMDA4NjIwIH0sIC8qIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiAqLworICAgeyAxODU2MCwgMHgwMDAwODYyMSB9LCAvKiBHTF9WRVJURVhfU1RBVEVfUFJPR1JBTV9OViAqLworICAgeyAxODU4NywgMHgwMDAwODYyMiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQgKi8KKyAgIHsgMTg2MTgsIDB4MDAwMDg2MjMgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFICovCisgICB7IDE4NjQ2LCAweDAwMDA4NjI0IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICovCisgICB7IDE4Njc2LCAweDAwMDA4NjI1IH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAqLworICAgeyAxODcwNCwgMHgwMDAwODYyNiB9LCAvKiBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUIgKi8KKyAgIHsgMTg3MjksIDB4MDAwMDg2MjcgfSwgLyogR0xfUFJPR1JBTV9MRU5HVEhfQVJCICovCisgICB7IDE4NzUxLCAweDAwMDA4NjI4IH0sIC8qIEdMX1BST0dSQU1fU1RSSU5HX0FSQiAqLworICAgeyAxODc3MywgMHgwMDAwODYyOSB9LCAvKiBHTF9NT0RFTFZJRVdfUFJPSkVDVElPTl9OViAqLworICAgeyAxODgwMCwgMHgwMDAwODYyQSB9LCAvKiBHTF9JREVOVElUWV9OViAqLworICAgeyAxODgxNSwgMHgwMDAwODYyQiB9LCAvKiBHTF9JTlZFUlNFX05WICovCisgICB7IDE4ODI5LCAweDAwMDA4NjJDIH0sIC8qIEdMX1RSQU5TUE9TRV9OViAqLworICAgeyAxODg0NSwgMHgwMDAwODYyRCB9LCAvKiBHTF9JTlZFUlNFX1RSQU5TUE9TRV9OViAqLworICAgeyAxODg2OSwgMHgwMDAwODYyRSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9NQVRSSVhfU1RBQ0tfREVQVEhfQVJCICovCisgICB7IDE4OTA3LCAweDAwMDA4NjJGIH0sIC8qIEdMX01BWF9QUk9HUkFNX01BVFJJQ0VTX0FSQiAqLworICAgeyAxODkzNSwgMHgwMDAwODYzMCB9LCAvKiBHTF9NQVRSSVgwX05WICovCisgICB7IDE4OTQ5LCAweDAwMDA4NjMxIH0sIC8qIEdMX01BVFJJWDFfTlYgKi8KKyAgIHsgMTg5NjMsIDB4MDAwMDg2MzIgfSwgLyogR0xfTUFUUklYMl9OViAqLworICAgeyAxODk3NywgMHgwMDAwODYzMyB9LCAvKiBHTF9NQVRSSVgzX05WICovCisgICB7IDE4OTkxLCAweDAwMDA4NjM0IH0sIC8qIEdMX01BVFJJWDRfTlYgKi8KKyAgIHsgMTkwMDUsIDB4MDAwMDg2MzUgfSwgLyogR0xfTUFUUklYNV9OViAqLworICAgeyAxOTAxOSwgMHgwMDAwODYzNiB9LCAvKiBHTF9NQVRSSVg2X05WICovCisgICB7IDE5MDMzLCAweDAwMDA4NjM3IH0sIC8qIEdMX01BVFJJWDdfTlYgKi8KKyAgIHsgMTkwNDcsIDB4MDAwMDg2NDAgfSwgLyogR0xfQ1VSUkVOVF9NQVRSSVhfU1RBQ0tfREVQVEhfQVJCICovCisgICB7IDE5MDgxLCAweDAwMDA4NjQxIH0sIC8qIEdMX0NVUlJFTlRfTUFUUklYX0FSQiAqLworICAgeyAxOTEwMywgMHgwMDAwODY0MiB9LCAvKiBHTF9QUk9HUkFNX1BPSU5UX1NJWkUgKi8KKyAgIHsgMTkxMjUsIDB4MDAwMDg2NDMgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREUgKi8KKyAgIHsgMTkxNTIsIDB4MDAwMDg2NDQgfSwgLyogR0xfUFJPR1JBTV9QQVJBTUVURVJfTlYgKi8KKyAgIHsgMTkxNzYsIDB4MDAwMDg2NDUgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSICovCisgICB7IDE5MjA3LCAweDAwMDA4NjQ2IH0sIC8qIEdMX1BST0dSQU1fVEFSR0VUX05WICovCisgICB7IDE5MjI4LCAweDAwMDA4NjQ3IH0sIC8qIEdMX1BST0dSQU1fUkVTSURFTlRfTlYgKi8KKyAgIHsgMTkyNTEsIDB4MDAwMDg2NDggfSwgLyogR0xfVFJBQ0tfTUFUUklYX05WICovCisgICB7IDE5MjcwLCAweDAwMDA4NjQ5IH0sIC8qIEdMX1RSQUNLX01BVFJJWF9UUkFOU0ZPUk1fTlYgKi8KKyAgIHsgMTkyOTksIDB4MDAwMDg2NEEgfSwgLyogR0xfVkVSVEVYX1BST0dSQU1fQklORElOR19OViAqLworICAgeyAxOTMyOCwgMHgwMDAwODY0QiB9LCAvKiBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX0FSQiAqLworICAgeyAxOTM1OCwgMHgwMDAwODY0RiB9LCAvKiBHTF9ERVBUSF9DTEFNUCAqLworICAgeyAxOTM3MywgMHgwMDAwODY1MCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMF9OViAqLworICAgeyAxOTQwMCwgMHgwMDAwODY1MSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMV9OViAqLworICAgeyAxOTQyNywgMHgwMDAwODY1MiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMl9OViAqLworICAgeyAxOTQ1NCwgMHgwMDAwODY1MyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZM19OViAqLworICAgeyAxOTQ4MSwgMHgwMDAwODY1NCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNF9OViAqLworICAgeyAxOTUwOCwgMHgwMDAwODY1NSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNV9OViAqLworICAgeyAxOTUzNSwgMHgwMDAwODY1NiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZNl9OViAqLworICAgeyAxOTU2MiwgMHgwMDAwODY1NyB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZN19OViAqLworICAgeyAxOTU4OSwgMHgwMDAwODY1OCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOF9OViAqLworICAgeyAxOTYxNiwgMHgwMDAwODY1OSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZOV9OViAqLworICAgeyAxOTY0MywgMHgwMDAwODY1QSB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTBfTlYgKi8KKyAgIHsgMTk2NzEsIDB4MDAwMDg2NUIgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTExX05WICovCisgICB7IDE5Njk5LCAweDAwMDA4NjVDIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMl9OViAqLworICAgeyAxOTcyNywgMHgwMDAwODY1RCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTNfTlYgKi8KKyAgIHsgMTk3NTUsIDB4MDAwMDg2NUUgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTE0X05WICovCisgICB7IDE5NzgzLCAweDAwMDA4NjVGIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNV9OViAqLworICAgeyAxOTgxMSwgMHgwMDAwODY2MCB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIwXzRfTlYgKi8KKyAgIHsgMTk4MzksIDB4MDAwMDg2NjEgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMV80X05WICovCisgICB7IDE5ODY3LCAweDAwMDA4NjYyIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjJfNF9OViAqLworICAgeyAxOTg5NSwgMHgwMDAwODY2MyB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIzXzRfTlYgKi8KKyAgIHsgMTk5MjMsIDB4MDAwMDg2NjQgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCNF80X05WICovCisgICB7IDE5OTUxLCAweDAwMDA4NjY1IH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjVfNF9OViAqLworICAgeyAxOTk3OSwgMHgwMDAwODY2NiB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI2XzRfTlYgKi8KKyAgIHsgMjAwMDcsIDB4MDAwMDg2NjcgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCN180X05WICovCisgICB7IDIwMDM1LCAweDAwMDA4NjY4IH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjhfNF9OViAqLworICAgeyAyMDA2MywgMHgwMDAwODY2OSB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI5XzRfTlYgKi8KKyAgIHsgMjAwOTEsIDB4MDAwMDg2NkEgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTBfNF9OViAqLworICAgeyAyMDEyMCwgMHgwMDAwODY2QiB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMV80X05WICovCisgICB7IDIwMTQ5LCAweDAwMDA4NjZDIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEyXzRfTlYgKi8KKyAgIHsgMjAxNzgsIDB4MDAwMDg2NkQgfSwgLyogR0xfTUFQMV9WRVJURVhfQVRUUklCMTNfNF9OViAqLworICAgeyAyMDIwNywgMHgwMDAwODY2RSB9LCAvKiBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNF80X05WICovCisgICB7IDIwMjM2LCAweDAwMDA4NjZGIH0sIC8qIEdMX01BUDFfVkVSVEVYX0FUVFJJQjE1XzRfTlYgKi8KKyAgIHsgMjAyNjUsIDB4MDAwMDg2NzAgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMF80X05WICovCisgICB7IDIwMjkzLCAweDAwMDA4NjcxIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjFfNF9OViAqLworICAgeyAyMDMyMSwgMHgwMDAwODY3MiB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIyXzRfTlYgKi8KKyAgIHsgMjAzNDksIDB4MDAwMDg2NzMgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCM180X05WICovCisgICB7IDIwMzc3LCAweDAwMDA4Njc0IH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjRfNF9OViAqLworICAgeyAyMDQwNSwgMHgwMDAwODY3NSB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI1XzRfTlYgKi8KKyAgIHsgMjA0MzMsIDB4MDAwMDg2NzYgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCNl80X05WICovCisgICB7IDIwNDYxLCAweDAwMDA4Njc3IH0sIC8qIEdMX1BST0dSQU1fQklORElOR19BUkIgKi8KKyAgIHsgMjA0ODQsIDB4MDAwMDg2NzggfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCOF80X05WICovCisgICB7IDIwNTEyLCAweDAwMDA4Njc5IH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjlfNF9OViAqLworICAgeyAyMDU0MCwgMHgwMDAwODY3QSB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMF80X05WICovCisgICB7IDIwNTY5LCAweDAwMDA4NjdCIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjExXzRfTlYgKi8KKyAgIHsgMjA1OTgsIDB4MDAwMDg2N0MgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTJfNF9OViAqLworICAgeyAyMDYyNywgMHgwMDAwODY3RCB9LCAvKiBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxM180X05WICovCisgICB7IDIwNjU2LCAweDAwMDA4NjdFIH0sIC8qIEdMX01BUDJfVkVSVEVYX0FUVFJJQjE0XzRfTlYgKi8KKyAgIHsgMjA2ODUsIDB4MDAwMDg2N0YgfSwgLyogR0xfTUFQMl9WRVJURVhfQVRUUklCMTVfNF9OViAqLworICAgeyAyMDcxNCwgMHgwMDAwODZBMCB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTRURfSU1BR0VfU0laRSAqLworICAgeyAyMDc0NywgMHgwMDAwODZBMSB9LCAvKiBHTF9URVhUVVJFX0NPTVBSRVNTRUQgKi8KKyAgIHsgMjA3NjksIDB4MDAwMDg2QTIgfSwgLyogR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICovCisgICB7IDIwODAzLCAweDAwMDA4NkEzIH0sIC8qIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICovCisgICB7IDIwODMzLCAweDAwMDA4NkE0IH0sIC8qIEdMX01BWF9WRVJURVhfVU5JVFNfQVJCICovCisgICB7IDIwODU3LCAweDAwMDA4NkE1IH0sIC8qIEdMX0FDVElWRV9WRVJURVhfVU5JVFNfQVJCICovCisgICB7IDIwODg0LCAweDAwMDA4NkE2IH0sIC8qIEdMX1dFSUdIVF9TVU1fVU5JVFlfQVJCICovCisgICB7IDIwOTA4LCAweDAwMDA4NkE3IH0sIC8qIEdMX1ZFUlRFWF9CTEVORF9BUkIgKi8KKyAgIHsgMjA5MjgsIDB4MDAwMDg2QTggfSwgLyogR0xfQ1VSUkVOVF9XRUlHSFRfQVJCICovCisgICB7IDIwOTUwLCAweDAwMDA4NkE5IH0sIC8qIEdMX1dFSUdIVF9BUlJBWV9UWVBFX0FSQiAqLworICAgeyAyMDk3NSwgMHgwMDAwODZBQSB9LCAvKiBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX0FSQiAqLworICAgeyAyMTAwMiwgMHgwMDAwODZBQiB9LCAvKiBHTF9XRUlHSFRfQVJSQVlfU0laRV9BUkIgKi8KKyAgIHsgMjEwMjcsIDB4MDAwMDg2QUMgfSwgLyogR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfQVJCICovCisgICB7IDIxMDU1LCAweDAwMDA4NkFEIH0sIC8qIEdMX1dFSUdIVF9BUlJBWV9BUkIgKi8KKyAgIHsgMjEwNzUsIDB4MDAwMDg2QUUgfSwgLyogR0xfRE9UM19SR0IgKi8KKyAgIHsgMjEwODcsIDB4MDAwMDg2QUYgfSwgLyogR0xfRE9UM19SR0JBICovCisgICB7IDIxMTAwLCAweDAwMDA4NkIwIH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCX0ZYVDFfM0RGWCAqLworICAgeyAyMTEyOCwgMHgwMDAwODZCMSB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYICovCisgICB7IDIxMTU3LCAweDAwMDA4NkIyIH0sIC8qIEdMX01VTFRJU0FNUExFXzNERlggKi8KKyAgIHsgMjExNzcsIDB4MDAwMDg2QjMgfSwgLyogR0xfU0FNUExFX0JVRkZFUlNfM0RGWCAqLworICAgeyAyMTIwMCwgMHgwMDAwODZCNCB9LCAvKiBHTF9TQU1QTEVTXzNERlggKi8KKyAgIHsgMjEyMTYsIDB4MDAwMDg2RUIgfSwgLyogR0xfU1VSRkFDRV9TVEFURV9OViAqLworICAgeyAyMTIzNiwgMHgwMDAwODZGRCB9LCAvKiBHTF9TVVJGQUNFX1JFR0lTVEVSRURfTlYgKi8KKyAgIHsgMjEyNjEsIDB4MDAwMDg3MDAgfSwgLyogR0xfU1VSRkFDRV9NQVBQRURfTlYgKi8KKyAgIHsgMjEyODIsIDB4MDAwMDg3MjIgfSwgLyogR0xfTU9ERUxWSUVXMl9BUkIgKi8KKyAgIHsgMjEzMDAsIDB4MDAwMDg3MjMgfSwgLyogR0xfTU9ERUxWSUVXM19BUkIgKi8KKyAgIHsgMjEzMTgsIDB4MDAwMDg3MjQgfSwgLyogR0xfTU9ERUxWSUVXNF9BUkIgKi8KKyAgIHsgMjEzMzYsIDB4MDAwMDg3MjUgfSwgLyogR0xfTU9ERUxWSUVXNV9BUkIgKi8KKyAgIHsgMjEzNTQsIDB4MDAwMDg3MjYgfSwgLyogR0xfTU9ERUxWSUVXNl9BUkIgKi8KKyAgIHsgMjEzNzIsIDB4MDAwMDg3MjcgfSwgLyogR0xfTU9ERUxWSUVXN19BUkIgKi8KKyAgIHsgMjEzOTAsIDB4MDAwMDg3MjggfSwgLyogR0xfTU9ERUxWSUVXOF9BUkIgKi8KKyAgIHsgMjE0MDgsIDB4MDAwMDg3MjkgfSwgLyogR0xfTU9ERUxWSUVXOV9BUkIgKi8KKyAgIHsgMjE0MjYsIDB4MDAwMDg3MkEgfSwgLyogR0xfTU9ERUxWSUVXMTBfQVJCICovCisgICB7IDIxNDQ1LCAweDAwMDA4NzJCIH0sIC8qIEdMX01PREVMVklFVzExX0FSQiAqLworICAgeyAyMTQ2NCwgMHgwMDAwODcyQyB9LCAvKiBHTF9NT0RFTFZJRVcxMl9BUkIgKi8KKyAgIHsgMjE0ODMsIDB4MDAwMDg3MkQgfSwgLyogR0xfTU9ERUxWSUVXMTNfQVJCICovCisgICB7IDIxNTAyLCAweDAwMDA4NzJFIH0sIC8qIEdMX01PREVMVklFVzE0X0FSQiAqLworICAgeyAyMTUyMSwgMHgwMDAwODcyRiB9LCAvKiBHTF9NT0RFTFZJRVcxNV9BUkIgKi8KKyAgIHsgMjE1NDAsIDB4MDAwMDg3MzAgfSwgLyogR0xfTU9ERUxWSUVXMTZfQVJCICovCisgICB7IDIxNTU5LCAweDAwMDA4NzMxIH0sIC8qIEdMX01PREVMVklFVzE3X0FSQiAqLworICAgeyAyMTU3OCwgMHgwMDAwODczMiB9LCAvKiBHTF9NT0RFTFZJRVcxOF9BUkIgKi8KKyAgIHsgMjE1OTcsIDB4MDAwMDg3MzMgfSwgLyogR0xfTU9ERUxWSUVXMTlfQVJCICovCisgICB7IDIxNjE2LCAweDAwMDA4NzM0IH0sIC8qIEdMX01PREVMVklFVzIwX0FSQiAqLworICAgeyAyMTYzNSwgMHgwMDAwODczNSB9LCAvKiBHTF9NT0RFTFZJRVcyMV9BUkIgKi8KKyAgIHsgMjE2NTQsIDB4MDAwMDg3MzYgfSwgLyogR0xfTU9ERUxWSUVXMjJfQVJCICovCisgICB7IDIxNjczLCAweDAwMDA4NzM3IH0sIC8qIEdMX01PREVMVklFVzIzX0FSQiAqLworICAgeyAyMTY5MiwgMHgwMDAwODczOCB9LCAvKiBHTF9NT0RFTFZJRVcyNF9BUkIgKi8KKyAgIHsgMjE3MTEsIDB4MDAwMDg3MzkgfSwgLyogR0xfTU9ERUxWSUVXMjVfQVJCICovCisgICB7IDIxNzMwLCAweDAwMDA4NzNBIH0sIC8qIEdMX01PREVMVklFVzI2X0FSQiAqLworICAgeyAyMTc0OSwgMHgwMDAwODczQiB9LCAvKiBHTF9NT0RFTFZJRVcyN19BUkIgKi8KKyAgIHsgMjE3NjgsIDB4MDAwMDg3M0MgfSwgLyogR0xfTU9ERUxWSUVXMjhfQVJCICovCisgICB7IDIxNzg3LCAweDAwMDA4NzNEIH0sIC8qIEdMX01PREVMVklFVzI5X0FSQiAqLworICAgeyAyMTgwNiwgMHgwMDAwODczRSB9LCAvKiBHTF9NT0RFTFZJRVczMF9BUkIgKi8KKyAgIHsgMjE4MjUsIDB4MDAwMDg3M0YgfSwgLyogR0xfTU9ERUxWSUVXMzFfQVJCICovCisgICB7IDIxODQ0LCAweDAwMDA4NzQwIH0sIC8qIEdMX0RPVDNfUkdCX0VYVCAqLworICAgeyAyMTg2MCwgMHgwMDAwODc0MSB9LCAvKiBHTF9QUk9HUkFNX0JJTkFSWV9MRU5HVEggKi8KKyAgIHsgMjE4ODUsIDB4MDAwMDg3NDIgfSwgLyogR0xfTUlSUk9SX0NMQU1QX0VYVCAqLworICAgeyAyMTkwNSwgMHgwMDAwODc0MyB9LCAvKiBHTF9NSVJST1JfQ0xBTVBfVE9fRURHRV9FWFQgKi8KKyAgIHsgMjE5MzMsIDB4MDAwMDg3NDQgfSwgLyogR0xfTU9EVUxBVEVfQUREX0FUSSAqLworICAgeyAyMTk1MywgMHgwMDAwODc0NSB9LCAvKiBHTF9NT0RVTEFURV9TSUdORURfQUREX0FUSSAqLworICAgeyAyMTk4MCwgMHgwMDAwODc0NiB9LCAvKiBHTF9NT0RVTEFURV9TVUJUUkFDVF9BVEkgKi8KKyAgIHsgMjIwMDUsIDB4MDAwMDg3NTcgfSwgLyogR0xfWUNCQ1JfTUVTQSAqLworICAgeyAyMjAxOSwgMHgwMDAwODc1OCB9LCAvKiBHTF9QQUNLX0lOVkVSVF9NRVNBICovCisgICB7IDIyMDM5LCAweDAwMDA4NzY0IH0sIC8qIEdMX0JVRkZFUl9TSVpFICovCisgICB7IDIyMDU0LCAweDAwMDA4NzY1IH0sIC8qIEdMX0JVRkZFUl9VU0FHRSAqLworICAgeyAyMjA3MCwgMHgwMDAwODc3NSB9LCAvKiBHTF9CVU1QX1JPVF9NQVRSSVhfQVRJICovCisgICB7IDIyMDkzLCAweDAwMDA4Nzc2IH0sIC8qIEdMX0JVTVBfUk9UX01BVFJJWF9TSVpFX0FUSSAqLworICAgeyAyMjEyMSwgMHgwMDAwODc3NyB9LCAvKiBHTF9CVU1QX05VTV9URVhfVU5JVFNfQVRJICovCisgICB7IDIyMTQ3LCAweDAwMDA4Nzc4IH0sIC8qIEdMX0JVTVBfVEVYX1VOSVRTX0FUSSAqLworICAgeyAyMjE2OSwgMHgwMDAwODc3OSB9LCAvKiBHTF9EVURWX0FUSSAqLworICAgeyAyMjE4MSwgMHgwMDAwODc3QSB9LCAvKiBHTF9EVThEVjhfQVRJICovCisgICB7IDIyMTk1LCAweDAwMDA4NzdCIH0sIC8qIEdMX0JVTVBfRU5WTUFQX0FUSSAqLworICAgeyAyMjIxNCwgMHgwMDAwODc3QyB9LCAvKiBHTF9CVU1QX1RBUkdFVF9BVEkgKi8KKyAgIHsgMjIyMzMsIDB4MDAwMDg3RkUgfSwgLyogR0xfTlVNX1BST0dSQU1fQklOQVJZX0ZPUk1BVFMgKi8KKyAgIHsgMjIyNjMsIDB4MDAwMDg3RkYgfSwgLyogR0xfUFJPR1JBTV9CSU5BUllfRk9STUFUUyAqLworICAgeyAyMjI4OSwgMHgwMDAwODgwMCB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyAqLworICAgeyAyMjMxMCwgMHgwMDAwODgwMSB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfRkFJTCAqLworICAgeyAyMjMzMSwgMHgwMDAwODgwMiB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICovCisgICB7IDIyMzYzLCAweDAwMDA4ODAzIH0sIC8qIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgKi8KKyAgIHsgMjIzOTUsIDB4MDAwMDg4MDQgfSwgLyogR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIgKi8KKyAgIHsgMjI0MTksIDB4MDAwMDg4MDUgfSwgLyogR0xfUFJPR1JBTV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAqLworICAgeyAyMjQ1MSwgMHgwMDAwODgwNiB9LCAvKiBHTF9QUk9HUkFNX1RFWF9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDIyNDgzLCAweDAwMDA4ODA3IH0sIC8qIEdMX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkIgKi8KKyAgIHsgMjI1MTUsIDB4MDAwMDg4MDggfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMjI1NTQsIDB4MDAwMDg4MDkgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMjI1OTMsIDB4MDAwMDg4MEEgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgKi8KKyAgIHsgMjI2MzIsIDB4MDAwMDg4MEIgfSwgLyogR0xfTUFYX1BST0dSQU1fQUxVX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMjI2NjgsIDB4MDAwMDg4MEMgfSwgLyogR0xfTUFYX1BST0dSQU1fVEVYX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMjI3MDQsIDB4MDAwMDg4MEQgfSwgLyogR0xfTUFYX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkIgKi8KKyAgIHsgMjI3NDAsIDB4MDAwMDg4MEUgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FMVV9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDIyNzgzLCAweDAwMDA4ODBGIH0sIC8qIEdMX01BWF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAqLworICAgeyAyMjgyNiwgMHgwMDAwODgxMCB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgKi8KKyAgIHsgMjI4NjksIDB4MDAwMDg4MTQgfSwgLyogR0xfUkdCQTMyRiAqLworICAgeyAyMjg4MCwgMHgwMDAwODgxNSB9LCAvKiBHTF9SR0IzMkYgKi8KKyAgIHsgMjI4OTAsIDB4MDAwMDg4MTYgfSwgLyogR0xfQUxQSEEzMkZfQVJCICovCisgICB7IDIyOTA2LCAweDAwMDA4ODE3IH0sIC8qIEdMX0lOVEVOU0lUWTMyRl9BUkIgKi8KKyAgIHsgMjI5MjYsIDB4MDAwMDg4MTggfSwgLyogR0xfTFVNSU5BTkNFMzJGX0FSQiAqLworICAgeyAyMjk0NiwgMHgwMDAwODgxOSB9LCAvKiBHTF9MVU1JTkFOQ0VfQUxQSEEzMkZfQVJCICovCisgICB7IDIyOTcyLCAweDAwMDA4ODFBIH0sIC8qIEdMX1JHQkExNkYgKi8KKyAgIHsgMjI5ODMsIDB4MDAwMDg4MUIgfSwgLyogR0xfUkdCMTZGICovCisgICB7IDIyOTkzLCAweDAwMDA4ODFDIH0sIC8qIEdMX0FMUEhBMTZGX0FSQiAqLworICAgeyAyMzAwOSwgMHgwMDAwODgxRCB9LCAvKiBHTF9JTlRFTlNJVFkxNkZfQVJCICovCisgICB7IDIzMDI5LCAweDAwMDA4ODFFIH0sIC8qIEdMX0xVTUlOQU5DRTE2Rl9BUkIgKi8KKyAgIHsgMjMwNDksIDB4MDAwMDg4MUYgfSwgLyogR0xfTFVNSU5BTkNFX0FMUEhBMTZGX0FSQiAqLworICAgeyAyMzA3NSwgMHgwMDAwODgyMCB9LCAvKiBHTF9SR0JBX0ZMT0FUX01PREVfQVJCICovCisgICB7IDIzMDk4LCAweDAwMDA4ODI0IH0sIC8qIEdMX01BWF9EUkFXX0JVRkZFUlMgKi8KKyAgIHsgMjMxMTgsIDB4MDAwMDg4MjUgfSwgLyogR0xfRFJBV19CVUZGRVIwICovCisgICB7IDIzMTM0LCAweDAwMDA4ODI2IH0sIC8qIEdMX0RSQVdfQlVGRkVSMSAqLworICAgeyAyMzE1MCwgMHgwMDAwODgyNyB9LCAvKiBHTF9EUkFXX0JVRkZFUjIgKi8KKyAgIHsgMjMxNjYsIDB4MDAwMDg4MjggfSwgLyogR0xfRFJBV19CVUZGRVIzICovCisgICB7IDIzMTgyLCAweDAwMDA4ODI5IH0sIC8qIEdMX0RSQVdfQlVGRkVSNCAqLworICAgeyAyMzE5OCwgMHgwMDAwODgyQSB9LCAvKiBHTF9EUkFXX0JVRkZFUjUgKi8KKyAgIHsgMjMyMTQsIDB4MDAwMDg4MkIgfSwgLyogR0xfRFJBV19CVUZGRVI2ICovCisgICB7IDIzMjMwLCAweDAwMDA4ODJDIH0sIC8qIEdMX0RSQVdfQlVGRkVSNyAqLworICAgeyAyMzI0NiwgMHgwMDAwODgyRCB9LCAvKiBHTF9EUkFXX0JVRkZFUjggKi8KKyAgIHsgMjMyNjIsIDB4MDAwMDg4MkUgfSwgLyogR0xfRFJBV19CVUZGRVI5ICovCisgICB7IDIzMjc4LCAweDAwMDA4ODJGIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTAgKi8KKyAgIHsgMjMyOTUsIDB4MDAwMDg4MzAgfSwgLyogR0xfRFJBV19CVUZGRVIxMSAqLworICAgeyAyMzMxMiwgMHgwMDAwODgzMSB9LCAvKiBHTF9EUkFXX0JVRkZFUjEyICovCisgICB7IDIzMzI5LCAweDAwMDA4ODMyIH0sIC8qIEdMX0RSQVdfQlVGRkVSMTMgKi8KKyAgIHsgMjMzNDYsIDB4MDAwMDg4MzMgfSwgLyogR0xfRFJBV19CVUZGRVIxNCAqLworICAgeyAyMzM2MywgMHgwMDAwODgzNCB9LCAvKiBHTF9EUkFXX0JVRkZFUjE1ICovCisgICB7IDIzMzgwLCAweDAwMDA4ODNEIH0sIC8qIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICovCisgICB7IDIzNDA0LCAweDAwMDA4ODQwIH0sIC8qIEdMX01BVFJJWF9QQUxFVFRFX0FSQiAqLworICAgeyAyMzQyNiwgMHgwMDAwODg0MSB9LCAvKiBHTF9NQVhfTUFUUklYX1BBTEVUVEVfU1RBQ0tfREVQVEhfQVJCICovCisgICB7IDIzNDY0LCAweDAwMDA4ODQyIH0sIC8qIEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX0FSQiAqLworICAgeyAyMzQ5MiwgMHgwMDAwODg0MyB9LCAvKiBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX0FSQiAqLworICAgeyAyMzUyMiwgMHgwMDAwODg0NCB9LCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQVJCICovCisgICB7IDIzNTQ4LCAweDAwMDA4ODQ1IH0sIC8qIEdMX0NVUlJFTlRfTUFUUklYX0lOREVYX0FSQiAqLworICAgeyAyMzU3NiwgMHgwMDAwODg0NiB9LCAvKiBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9BUkIgKi8KKyAgIHsgMjM2MDcsIDB4MDAwMDg4NDcgfSwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfQVJCICovCisgICB7IDIzNjM4LCAweDAwMDA4ODQ4IH0sIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfQVJCICovCisgICB7IDIzNjcxLCAweDAwMDA4ODQ5IH0sIC8qIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX0FSQiAqLworICAgeyAyMzcwNSwgMHgwMDAwODg0QSB9LCAvKiBHTF9URVhUVVJFX0RFUFRIX1NJWkUgKi8KKyAgIHsgMjM3MjcsIDB4MDAwMDg4NEIgfSwgLyogR0xfREVQVEhfVEVYVFVSRV9NT0RFICovCisgICB7IDIzNzQ5LCAweDAwMDA4ODRDIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFICovCisgICB7IDIzNzczLCAweDAwMDA4ODREIH0sIC8qIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DICovCisgICB7IDIzNzk3LCAweDAwMDA4ODRFIH0sIC8qIEdMX0NPTVBBUkVfUkVGX1RPX1RFWFRVUkUgKi8KKyAgIHsgMjM4MjMsIDB4MDAwMDg4NEYgfSwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9TRUFNTEVTUyAqLworICAgeyAyMzg1MiwgMHgwMDAwODg2MSB9LCAvKiBHTF9QT0lOVF9TUFJJVEUgKi8KKyAgIHsgMjM4NjgsIDB4MDAwMDg4NjIgfSwgLyogR0xfQ09PUkRfUkVQTEFDRSAqLworICAgeyAyMzg4NSwgMHgwMDAwODg2MyB9LCAvKiBHTF9QT0lOVF9TUFJJVEVfUl9NT0RFX05WICovCisgICB7IDIzOTExLCAweDAwMDA4ODY0IH0sIC8qIEdMX1FVRVJZX0NPVU5URVJfQklUUyAqLworICAgeyAyMzkzMywgMHgwMDAwODg2NSB9LCAvKiBHTF9DVVJSRU5UX1FVRVJZICovCisgICB7IDIzOTUwLCAweDAwMDA4ODY2IH0sIC8qIEdMX1FVRVJZX1JFU1VMVCAqLworICAgeyAyMzk2NiwgMHgwMDAwODg2NyB9LCAvKiBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICovCisgICB7IDIzOTkyLCAweDAwMDA4ODY4IH0sIC8qIEdMX01BWF9GUkFHTUVOVF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfTlYgKi8KKyAgIHsgMjQwMzYsIDB4MDAwMDg4NjkgfSwgLyogR0xfTUFYX1ZFUlRFWF9BVFRSSUJTICovCisgICB7IDI0MDU4LCAweDAwMDA4ODZBIH0sIC8qIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAqLworICAgeyAyNDA5MiwgMHgwMDAwODg2RSB9LCAvKiBHTF9ERVBUSF9TVEVOQ0lMX1RPX1JHQkFfTlYgKi8KKyAgIHsgMjQxMjAsIDB4MDAwMDg4NkYgfSwgLyogR0xfREVQVEhfU1RFTkNJTF9UT19CR1JBX05WICovCisgICB7IDI0MTQ4LCAweDAwMDA4ODcwIH0sIC8qIEdMX0ZSQUdNRU5UX1BST0dSQU1fTlYgKi8KKyAgIHsgMjQxNzEsIDB4MDAwMDg4NzEgfSwgLyogR0xfTUFYX1RFWFRVUkVfQ09PUkRTICovCisgICB7IDI0MTkzLCAweDAwMDA4ODcyIH0sIC8qIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTICovCisgICB7IDI0MjIwLCAweDAwMDA4ODczIH0sIC8qIEdMX0ZSQUdNRU5UX1BST0dSQU1fQklORElOR19OViAqLworICAgeyAyNDI1MSwgMHgwMDAwODg3NCB9LCAvKiBHTF9QUk9HUkFNX0VSUk9SX1NUUklOR19BUkIgKi8KKyAgIHsgMjQyNzksIDB4MDAwMDg4NzUgfSwgLyogR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICovCisgICB7IDI0MzA3LCAweDAwMDA4ODc2IH0sIC8qIEdMX1BST0dSQU1fRk9STUFUX0FSQiAqLworICAgeyAyNDMyOSwgMHgwMDAwODg3RiB9LCAvKiBHTF9HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlMgKi8KKyAgIHsgMjQzNjAsIDB4MDAwMDg4OEYgfSwgLyogR0xfVEVYVFVSRV9VTlNJR05FRF9SRU1BUF9NT0RFX05WICovCisgICB7IDI0Mzk0LCAweDAwMDA4ODkwIH0sIC8qIEdMX0RFUFRIX0JPVU5EU19URVNUX0VYVCAqLworICAgeyAyNDQxOSwgMHgwMDAwODg5MSB9LCAvKiBHTF9ERVBUSF9CT1VORFNfRVhUICovCisgICB7IDI0NDM5LCAweDAwMDA4ODkyIH0sIC8qIEdMX0FSUkFZX0JVRkZFUiAqLworICAgeyAyNDQ1NSwgMHgwMDAwODg5MyB9LCAvKiBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAqLworICAgeyAyNDQ3OSwgMHgwMDAwODg5NCB9LCAvKiBHTF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAyNDUwMywgMHgwMDAwODg5NSB9LCAvKiBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDI0NTM1LCAweDAwMDA4ODk2IH0sIC8qIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAyNDU2NiwgMHgwMDAwODg5NyB9LCAvKiBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgIHsgMjQ1OTcsIDB4MDAwMDg4OTggfSwgLyogR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgIHsgMjQ2MjcsIDB4MDAwMDg4OTkgfSwgLyogR0xfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgIHsgMjQ2NTcsIDB4MDAwMDg4OUEgfSwgLyogR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAyNDY5NSwgMHgwMDAwODg5QiB9LCAvKiBHTF9FREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkcgKi8KKyAgIHsgMjQ3MjksIDB4MDAwMDg4OUMgfSwgLyogR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDI0NzY5LCAweDAwMDA4ODlEIH0sIC8qIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDI0ODA4LCAweDAwMDA4ODlFIH0sIC8qIEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElORyAqLworICAgeyAyNDgzOSwgMHgwMDAwODg5RiB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDI0ODc3LCAweDAwMDA4OEEwIH0sIC8qIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAqLworICAgeyAyNDkwNSwgMHgwMDAwODhBMSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9JTlNUUlVDVElPTlNfQVJCICovCisgICB7IDI0OTM3LCAweDAwMDA4OEEyIH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMjQ5NzIsIDB4MDAwMDg4QTMgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgKi8KKyAgIHsgMjUwMTEsIDB4MDAwMDg4QTQgfSwgLyogR0xfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgKi8KKyAgIHsgMjUwMzgsIDB4MDAwMDg4QTUgfSwgLyogR0xfTUFYX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICovCisgICB7IDI1MDY5LCAweDAwMDA4OEE2IH0sIC8qIEdMX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAqLworICAgeyAyNTEwMywgMHgwMDAwODhBNyB9LCAvKiBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVNUE9SQVJJRVNfQVJCICovCisgICB7IDI1MTQxLCAweDAwMDA4OEE4IH0sIC8qIEdMX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgKi8KKyAgIHsgMjUxNjcsIDB4MDAwMDg4QTkgfSwgLyogR0xfTUFYX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgKi8KKyAgIHsgMjUxOTcsIDB4MDAwMDg4QUEgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfUEFSQU1FVEVSU19BUkIgKi8KKyAgIHsgMjUyMzAsIDB4MDAwMDg4QUIgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCICovCisgICB7IDI1MjY3LCAweDAwMDA4OEFDIH0sIC8qIEdMX1BST0dSQU1fQVRUUklCU19BUkIgKi8KKyAgIHsgMjUyOTAsIDB4MDAwMDg4QUQgfSwgLyogR0xfTUFYX1BST0dSQU1fQVRUUklCU19BUkIgKi8KKyAgIHsgMjUzMTcsIDB4MDAwMDg4QUUgfSwgLyogR0xfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkIgKi8KKyAgIHsgMjUzNDcsIDB4MDAwMDg4QUYgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICovCisgICB7IDI1MzgxLCAweDAwMDA4OEIwIH0sIC8qIEdMX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCICovCisgICB7IDI1NDE0LCAweDAwMDA4OEIxIH0sIC8qIEdMX01BWF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLworICAgeyAyNTQ1MSwgMHgwMDAwODhCMiB9LCAvKiBHTF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgKi8KKyAgIHsgMjU0OTEsIDB4MDAwMDg4QjMgfSwgLyogR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FERFJFU1NfUkVHSVNURVJTX0FSQiAqLworICAgeyAyNTUzNSwgMHgwMDAwODhCNCB9LCAvKiBHTF9NQVhfUFJPR1JBTV9MT0NBTF9QQVJBTUVURVJTX0FSQiAqLworICAgeyAyNTU3MSwgMHgwMDAwODhCNSB9LCAvKiBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgKi8KKyAgIHsgMjU2MDUsIDB4MDAwMDg4QjYgfSwgLyogR0xfUFJPR1JBTV9VTkRFUl9OQVRJVkVfTElNSVRTX0FSQiAqLworICAgeyAyNTY0MCwgMHgwMDAwODhCNyB9LCAvKiBHTF9UUkFOU1BPU0VfQ1VSUkVOVF9NQVRSSVhfQVJCICovCisgICB7IDI1NjcyLCAweDAwMDA4OEI4IH0sIC8qIEdMX1JFQURfT05MWSAqLworICAgeyAyNTY4NSwgMHgwMDAwODhCOSB9LCAvKiBHTF9XUklURV9PTkxZICovCisgICB7IDI1Njk5LCAweDAwMDA4OEJBIH0sIC8qIEdMX1JFQURfV1JJVEUgKi8KKyAgIHsgMjU3MTMsIDB4MDAwMDg4QkIgfSwgLyogR0xfQlVGRkVSX0FDQ0VTUyAqLworICAgeyAyNTczMCwgMHgwMDAwODhCQyB9LCAvKiBHTF9CVUZGRVJfTUFQUEVEICovCisgICB7IDI1NzQ3LCAweDAwMDA4OEJEIH0sIC8qIEdMX0JVRkZFUl9NQVBfUE9JTlRFUiAqLworICAgeyAyNTc2OSwgMHgwMDAwODhCRSB9LCAvKiBHTF9XUklURV9ESVNDQVJEX05WICovCisgICB7IDI1Nzg5LCAweDAwMDA4OEJGIH0sIC8qIEdMX1RJTUVfRUxBUFNFRCAqLworICAgeyAyNTgwNSwgMHgwMDAwODhDMCB9LCAvKiBHTF9NQVRSSVgwX0FSQiAqLworICAgeyAyNTgyMCwgMHgwMDAwODhDMSB9LCAvKiBHTF9NQVRSSVgxX0FSQiAqLworICAgeyAyNTgzNSwgMHgwMDAwODhDMiB9LCAvKiBHTF9NQVRSSVgyX0FSQiAqLworICAgeyAyNTg1MCwgMHgwMDAwODhDMyB9LCAvKiBHTF9NQVRSSVgzX0FSQiAqLworICAgeyAyNTg2NSwgMHgwMDAwODhDNCB9LCAvKiBHTF9NQVRSSVg0X0FSQiAqLworICAgeyAyNTg4MCwgMHgwMDAwODhDNSB9LCAvKiBHTF9NQVRSSVg1X0FSQiAqLworICAgeyAyNTg5NSwgMHgwMDAwODhDNiB9LCAvKiBHTF9NQVRSSVg2X0FSQiAqLworICAgeyAyNTkxMCwgMHgwMDAwODhDNyB9LCAvKiBHTF9NQVRSSVg3X0FSQiAqLworICAgeyAyNTkyNSwgMHgwMDAwODhDOCB9LCAvKiBHTF9NQVRSSVg4X0FSQiAqLworICAgeyAyNTk0MCwgMHgwMDAwODhDOSB9LCAvKiBHTF9NQVRSSVg5X0FSQiAqLworICAgeyAyNTk1NSwgMHgwMDAwODhDQSB9LCAvKiBHTF9NQVRSSVgxMF9BUkIgKi8KKyAgIHsgMjU5NzEsIDB4MDAwMDg4Q0IgfSwgLyogR0xfTUFUUklYMTFfQVJCICovCisgICB7IDI1OTg3LCAweDAwMDA4OENDIH0sIC8qIEdMX01BVFJJWDEyX0FSQiAqLworICAgeyAyNjAwMywgMHgwMDAwODhDRCB9LCAvKiBHTF9NQVRSSVgxM19BUkIgKi8KKyAgIHsgMjYwMTksIDB4MDAwMDg4Q0UgfSwgLyogR0xfTUFUUklYMTRfQVJCICovCisgICB7IDI2MDM1LCAweDAwMDA4OENGIH0sIC8qIEdMX01BVFJJWDE1X0FSQiAqLworICAgeyAyNjA1MSwgMHgwMDAwODhEMCB9LCAvKiBHTF9NQVRSSVgxNl9BUkIgKi8KKyAgIHsgMjYwNjcsIDB4MDAwMDg4RDEgfSwgLyogR0xfTUFUUklYMTdfQVJCICovCisgICB7IDI2MDgzLCAweDAwMDA4OEQyIH0sIC8qIEdMX01BVFJJWDE4X0FSQiAqLworICAgeyAyNjA5OSwgMHgwMDAwODhEMyB9LCAvKiBHTF9NQVRSSVgxOV9BUkIgKi8KKyAgIHsgMjYxMTUsIDB4MDAwMDg4RDQgfSwgLyogR0xfTUFUUklYMjBfQVJCICovCisgICB7IDI2MTMxLCAweDAwMDA4OEQ1IH0sIC8qIEdMX01BVFJJWDIxX0FSQiAqLworICAgeyAyNjE0NywgMHgwMDAwODhENiB9LCAvKiBHTF9NQVRSSVgyMl9BUkIgKi8KKyAgIHsgMjYxNjMsIDB4MDAwMDg4RDcgfSwgLyogR0xfTUFUUklYMjNfQVJCICovCisgICB7IDI2MTc5LCAweDAwMDA4OEQ4IH0sIC8qIEdMX01BVFJJWDI0X0FSQiAqLworICAgeyAyNjE5NSwgMHgwMDAwODhEOSB9LCAvKiBHTF9NQVRSSVgyNV9BUkIgKi8KKyAgIHsgMjYyMTEsIDB4MDAwMDg4REEgfSwgLyogR0xfTUFUUklYMjZfQVJCICovCisgICB7IDI2MjI3LCAweDAwMDA4OERCIH0sIC8qIEdMX01BVFJJWDI3X0FSQiAqLworICAgeyAyNjI0MywgMHgwMDAwODhEQyB9LCAvKiBHTF9NQVRSSVgyOF9BUkIgKi8KKyAgIHsgMjYyNTksIDB4MDAwMDg4REQgfSwgLyogR0xfTUFUUklYMjlfQVJCICovCisgICB7IDI2Mjc1LCAweDAwMDA4OERFIH0sIC8qIEdMX01BVFJJWDMwX0FSQiAqLworICAgeyAyNjI5MSwgMHgwMDAwODhERiB9LCAvKiBHTF9NQVRSSVgzMV9BUkIgKi8KKyAgIHsgMjYzMDcsIDB4MDAwMDg4RTAgfSwgLyogR0xfU1RSRUFNX0RSQVcgKi8KKyAgIHsgMjYzMjIsIDB4MDAwMDg4RTEgfSwgLyogR0xfU1RSRUFNX1JFQUQgKi8KKyAgIHsgMjYzMzcsIDB4MDAwMDg4RTIgfSwgLyogR0xfU1RSRUFNX0NPUFkgKi8KKyAgIHsgMjYzNTIsIDB4MDAwMDg4RTQgfSwgLyogR0xfU1RBVElDX0RSQVcgKi8KKyAgIHsgMjYzNjcsIDB4MDAwMDg4RTUgfSwgLyogR0xfU1RBVElDX1JFQUQgKi8KKyAgIHsgMjYzODIsIDB4MDAwMDg4RTYgfSwgLyogR0xfU1RBVElDX0NPUFkgKi8KKyAgIHsgMjYzOTcsIDB4MDAwMDg4RTggfSwgLyogR0xfRFlOQU1JQ19EUkFXICovCisgICB7IDI2NDEzLCAweDAwMDA4OEU5IH0sIC8qIEdMX0RZTkFNSUNfUkVBRCAqLworICAgeyAyNjQyOSwgMHgwMDAwODhFQSB9LCAvKiBHTF9EWU5BTUlDX0NPUFkgKi8KKyAgIHsgMjY0NDUsIDB4MDAwMDg4RUIgfSwgLyogR0xfUElYRUxfUEFDS19CVUZGRVIgKi8KKyAgIHsgMjY0NjYsIDB4MDAwMDg4RUMgfSwgLyogR0xfUElYRUxfVU5QQUNLX0JVRkZFUiAqLworICAgeyAyNjQ4OSwgMHgwMDAwODhFRCB9LCAvKiBHTF9QSVhFTF9QQUNLX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDI2NTE4LCAweDAwMDA4OEVGIH0sIC8qIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElORyAqLworICAgeyAyNjU0OSwgMHgwMDAwODhGMCB9LCAvKiBHTF9ERVBUSDI0X1NURU5DSUw4ICovCisgICB7IDI2NTY5LCAweDAwMDA4OEYxIH0sIC8qIEdMX1RFWFRVUkVfU1RFTkNJTF9TSVpFICovCisgICB7IDI2NTkzLCAweDAwMDA4OEY0IH0sIC8qIEdMX01BWF9QUk9HUkFNX0VYRUNfSU5TVFJVQ1RJT05TX05WICovCisgICB7IDI2NjI5LCAweDAwMDA4OEY1IH0sIC8qIEdMX01BWF9QUk9HUkFNX0NBTExfREVQVEhfTlYgKi8KKyAgIHsgMjY2NTgsIDB4MDAwMDg4RjYgfSwgLyogR0xfTUFYX1BST0dSQU1fSUZfREVQVEhfTlYgKi8KKyAgIHsgMjY2ODUsIDB4MDAwMDg4RjcgfSwgLyogR0xfTUFYX1BST0dSQU1fTE9PUF9ERVBUSF9OViAqLworICAgeyAyNjcxNCwgMHgwMDAwODhGOCB9LCAvKiBHTF9NQVhfUFJPR1JBTV9MT09QX0NPVU5UX05WICovCisgICB7IDI2NzQzLCAweDAwMDA4OEY5IH0sIC8qIEdMX1NSQzFfQ09MT1IgKi8KKyAgIHsgMjY3NTcsIDB4MDAwMDg4RkEgfSwgLyogR0xfT05FX01JTlVTX1NSQzFfQ09MT1IgKi8KKyAgIHsgMjY3ODEsIDB4MDAwMDg4RkIgfSwgLyogR0xfT05FX01JTlVTX1NSQzFfQUxQSEEgKi8KKyAgIHsgMjY4MDUsIDB4MDAwMDg4RkMgfSwgLyogR0xfTUFYX0RVQUxfU09VUkNFX0RSQVdfQlVGRkVSUyAqLworICAgeyAyNjgzNywgMHgwMDAwODhGRCB9LCAvKiBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVIgKi8KKyAgIHsgMjY4NjgsIDB4MDAwMDg4RkUgfSwgLyogR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SX0FSQiAqLworICAgeyAyNjkwMywgMHgwMDAwODhGRiB9LCAvKiBHTF9NQVhfQVJSQVlfVEVYVFVSRV9MQVlFUlMgKi8KKyAgIHsgMjY5MzEsIDB4MDAwMDg5MDQgfSwgLyogR0xfTUlOX1BST0dSQU1fVEVYRUxfT0ZGU0VUICovCisgICB7IDI2OTU5LCAweDAwMDA4OTA1IH0sIC8qIEdMX01BWF9QUk9HUkFNX1RFWEVMX09GRlNFVCAqLworICAgeyAyNjk4NywgMHgwMDAwODkxMCB9LCAvKiBHTF9TVEVOQ0lMX1RFU1RfVFdPX1NJREVfRVhUICovCisgICB7IDI3MDE2LCAweDAwMDA4OTExIH0sIC8qIEdMX0FDVElWRV9TVEVOQ0lMX0ZBQ0VfRVhUICovCisgICB7IDI3MDQzLCAweDAwMDA4OTEyIH0sIC8qIEdMX01JUlJPUl9DTEFNUF9UT19CT1JERVJfRVhUICovCisgICB7IDI3MDczLCAweDAwMDA4OTE0IH0sIC8qIEdMX1NBTVBMRVNfUEFTU0VEICovCisgICB7IDI3MDkxLCAweDAwMDA4OTE2IH0sIC8qIEdMX0dFT01FVFJZX1ZFUlRJQ0VTX09VVCAqLworICAgeyAyNzExNiwgMHgwMDAwODkxNyB9LCAvKiBHTF9HRU9NRVRSWV9JTlBVVF9UWVBFICovCisgICB7IDI3MTM5LCAweDAwMDA4OTE4IH0sIC8qIEdMX0dFT01FVFJZX09VVFBVVF9UWVBFICovCisgICB7IDI3MTYzLCAweDAwMDA4OTE5IH0sIC8qIEdMX1NBTVBMRVJfQklORElORyAqLworICAgeyAyNzE4MiwgMHgwMDAwODkxQSB9LCAvKiBHTF9DTEFNUF9WRVJURVhfQ09MT1IgKi8KKyAgIHsgMjcyMDQsIDB4MDAwMDg5MUIgfSwgLyogR0xfQ0xBTVBfRlJBR01FTlRfQ09MT1IgKi8KKyAgIHsgMjcyMjgsIDB4MDAwMDg5MUMgfSwgLyogR0xfQ0xBTVBfUkVBRF9DT0xPUiAqLworICAgeyAyNzI0OCwgMHgwMDAwODkxRCB9LCAvKiBHTF9GSVhFRF9PTkxZICovCisgICB7IDI3MjYyLCAweDAwMDA4OTIwIH0sIC8qIEdMX0ZSQUdNRU5UX1NIQURFUl9BVEkgKi8KKyAgIHsgMjcyODUsIDB4MDAwMDg5MjEgfSwgLyogR0xfUkVHXzBfQVRJICovCisgICB7IDI3Mjk4LCAweDAwMDA4OTIyIH0sIC8qIEdMX1JFR18xX0FUSSAqLworICAgeyAyNzMxMSwgMHgwMDAwODkyMyB9LCAvKiBHTF9SRUdfMl9BVEkgKi8KKyAgIHsgMjczMjQsIDB4MDAwMDg5MjQgfSwgLyogR0xfUkVHXzNfQVRJICovCisgICB7IDI3MzM3LCAweDAwMDA4OTI1IH0sIC8qIEdMX1JFR180X0FUSSAqLworICAgeyAyNzM1MCwgMHgwMDAwODkyNiB9LCAvKiBHTF9SRUdfNV9BVEkgKi8KKyAgIHsgMjczNjMsIDB4MDAwMDg5MjcgfSwgLyogR0xfUkVHXzZfQVRJICovCisgICB7IDI3Mzc2LCAweDAwMDA4OTI4IH0sIC8qIEdMX1JFR183X0FUSSAqLworICAgeyAyNzM4OSwgMHgwMDAwODkyOSB9LCAvKiBHTF9SRUdfOF9BVEkgKi8KKyAgIHsgMjc0MDIsIDB4MDAwMDg5MkEgfSwgLyogR0xfUkVHXzlfQVRJICovCisgICB7IDI3NDE1LCAweDAwMDA4OTJCIH0sIC8qIEdMX1JFR18xMF9BVEkgKi8KKyAgIHsgMjc0MjksIDB4MDAwMDg5MkMgfSwgLyogR0xfUkVHXzExX0FUSSAqLworICAgeyAyNzQ0MywgMHgwMDAwODkyRCB9LCAvKiBHTF9SRUdfMTJfQVRJICovCisgICB7IDI3NDU3LCAweDAwMDA4OTJFIH0sIC8qIEdMX1JFR18xM19BVEkgKi8KKyAgIHsgMjc0NzEsIDB4MDAwMDg5MkYgfSwgLyogR0xfUkVHXzE0X0FUSSAqLworICAgeyAyNzQ4NSwgMHgwMDAwODkzMCB9LCAvKiBHTF9SRUdfMTVfQVRJICovCisgICB7IDI3NDk5LCAweDAwMDA4OTMxIH0sIC8qIEdMX1JFR18xNl9BVEkgKi8KKyAgIHsgMjc1MTMsIDB4MDAwMDg5MzIgfSwgLyogR0xfUkVHXzE3X0FUSSAqLworICAgeyAyNzUyNywgMHgwMDAwODkzMyB9LCAvKiBHTF9SRUdfMThfQVRJICovCisgICB7IDI3NTQxLCAweDAwMDA4OTM0IH0sIC8qIEdMX1JFR18xOV9BVEkgKi8KKyAgIHsgMjc1NTUsIDB4MDAwMDg5MzUgfSwgLyogR0xfUkVHXzIwX0FUSSAqLworICAgeyAyNzU2OSwgMHgwMDAwODkzNiB9LCAvKiBHTF9SRUdfMjFfQVRJICovCisgICB7IDI3NTgzLCAweDAwMDA4OTM3IH0sIC8qIEdMX1JFR18yMl9BVEkgKi8KKyAgIHsgMjc1OTcsIDB4MDAwMDg5MzggfSwgLyogR0xfUkVHXzIzX0FUSSAqLworICAgeyAyNzYxMSwgMHgwMDAwODkzOSB9LCAvKiBHTF9SRUdfMjRfQVRJICovCisgICB7IDI3NjI1LCAweDAwMDA4OTNBIH0sIC8qIEdMX1JFR18yNV9BVEkgKi8KKyAgIHsgMjc2MzksIDB4MDAwMDg5M0IgfSwgLyogR0xfUkVHXzI2X0FUSSAqLworICAgeyAyNzY1MywgMHgwMDAwODkzQyB9LCAvKiBHTF9SRUdfMjdfQVRJICovCisgICB7IDI3NjY3LCAweDAwMDA4OTNEIH0sIC8qIEdMX1JFR18yOF9BVEkgKi8KKyAgIHsgMjc2ODEsIDB4MDAwMDg5M0UgfSwgLyogR0xfUkVHXzI5X0FUSSAqLworICAgeyAyNzY5NSwgMHgwMDAwODkzRiB9LCAvKiBHTF9SRUdfMzBfQVRJICovCisgICB7IDI3NzA5LCAweDAwMDA4OTQwIH0sIC8qIEdMX1JFR18zMV9BVEkgKi8KKyAgIHsgMjc3MjMsIDB4MDAwMDg5NDEgfSwgLyogR0xfQ09OXzBfQVRJICovCisgICB7IDI3NzM2LCAweDAwMDA4OTQyIH0sIC8qIEdMX0NPTl8xX0FUSSAqLworICAgeyAyNzc0OSwgMHgwMDAwODk0MyB9LCAvKiBHTF9DT05fMl9BVEkgKi8KKyAgIHsgMjc3NjIsIDB4MDAwMDg5NDQgfSwgLyogR0xfQ09OXzNfQVRJICovCisgICB7IDI3Nzc1LCAweDAwMDA4OTQ1IH0sIC8qIEdMX0NPTl80X0FUSSAqLworICAgeyAyNzc4OCwgMHgwMDAwODk0NiB9LCAvKiBHTF9DT05fNV9BVEkgKi8KKyAgIHsgMjc4MDEsIDB4MDAwMDg5NDcgfSwgLyogR0xfQ09OXzZfQVRJICovCisgICB7IDI3ODE0LCAweDAwMDA4OTQ4IH0sIC8qIEdMX0NPTl83X0FUSSAqLworICAgeyAyNzgyNywgMHgwMDAwODk0OSB9LCAvKiBHTF9DT05fOF9BVEkgKi8KKyAgIHsgMjc4NDAsIDB4MDAwMDg5NEEgfSwgLyogR0xfQ09OXzlfQVRJICovCisgICB7IDI3ODUzLCAweDAwMDA4OTRCIH0sIC8qIEdMX0NPTl8xMF9BVEkgKi8KKyAgIHsgMjc4NjcsIDB4MDAwMDg5NEMgfSwgLyogR0xfQ09OXzExX0FUSSAqLworICAgeyAyNzg4MSwgMHgwMDAwODk0RCB9LCAvKiBHTF9DT05fMTJfQVRJICovCisgICB7IDI3ODk1LCAweDAwMDA4OTRFIH0sIC8qIEdMX0NPTl8xM19BVEkgKi8KKyAgIHsgMjc5MDksIDB4MDAwMDg5NEYgfSwgLyogR0xfQ09OXzE0X0FUSSAqLworICAgeyAyNzkyMywgMHgwMDAwODk1MCB9LCAvKiBHTF9DT05fMTVfQVRJICovCisgICB7IDI3OTM3LCAweDAwMDA4OTUxIH0sIC8qIEdMX0NPTl8xNl9BVEkgKi8KKyAgIHsgMjc5NTEsIDB4MDAwMDg5NTIgfSwgLyogR0xfQ09OXzE3X0FUSSAqLworICAgeyAyNzk2NSwgMHgwMDAwODk1MyB9LCAvKiBHTF9DT05fMThfQVRJICovCisgICB7IDI3OTc5LCAweDAwMDA4OTU0IH0sIC8qIEdMX0NPTl8xOV9BVEkgKi8KKyAgIHsgMjc5OTMsIDB4MDAwMDg5NTUgfSwgLyogR0xfQ09OXzIwX0FUSSAqLworICAgeyAyODAwNywgMHgwMDAwODk1NiB9LCAvKiBHTF9DT05fMjFfQVRJICovCisgICB7IDI4MDIxLCAweDAwMDA4OTU3IH0sIC8qIEdMX0NPTl8yMl9BVEkgKi8KKyAgIHsgMjgwMzUsIDB4MDAwMDg5NTggfSwgLyogR0xfQ09OXzIzX0FUSSAqLworICAgeyAyODA0OSwgMHgwMDAwODk1OSB9LCAvKiBHTF9DT05fMjRfQVRJICovCisgICB7IDI4MDYzLCAweDAwMDA4OTVBIH0sIC8qIEdMX0NPTl8yNV9BVEkgKi8KKyAgIHsgMjgwNzcsIDB4MDAwMDg5NUIgfSwgLyogR0xfQ09OXzI2X0FUSSAqLworICAgeyAyODA5MSwgMHgwMDAwODk1QyB9LCAvKiBHTF9DT05fMjdfQVRJICovCisgICB7IDI4MTA1LCAweDAwMDA4OTVEIH0sIC8qIEdMX0NPTl8yOF9BVEkgKi8KKyAgIHsgMjgxMTksIDB4MDAwMDg5NUUgfSwgLyogR0xfQ09OXzI5X0FUSSAqLworICAgeyAyODEzMywgMHgwMDAwODk1RiB9LCAvKiBHTF9DT05fMzBfQVRJICovCisgICB7IDI4MTQ3LCAweDAwMDA4OTYwIH0sIC8qIEdMX0NPTl8zMV9BVEkgKi8KKyAgIHsgMjgxNjEsIDB4MDAwMDg5NjEgfSwgLyogR0xfTU9WX0FUSSAqLworICAgeyAyODE3MiwgMHgwMDAwODk2MyB9LCAvKiBHTF9BRERfQVRJICovCisgICB7IDI4MTgzLCAweDAwMDA4OTY0IH0sIC8qIEdMX01VTF9BVEkgKi8KKyAgIHsgMjgxOTQsIDB4MDAwMDg5NjUgfSwgLyogR0xfU1VCX0FUSSAqLworICAgeyAyODIwNSwgMHgwMDAwODk2NiB9LCAvKiBHTF9ET1QzX0FUSSAqLworICAgeyAyODIxNywgMHgwMDAwODk2NyB9LCAvKiBHTF9ET1Q0X0FUSSAqLworICAgeyAyODIyOSwgMHgwMDAwODk2OCB9LCAvKiBHTF9NQURfQVRJICovCisgICB7IDI4MjQwLCAweDAwMDA4OTY5IH0sIC8qIEdMX0xFUlBfQVRJICovCisgICB7IDI4MjUyLCAweDAwMDA4OTZBIH0sIC8qIEdMX0NORF9BVEkgKi8KKyAgIHsgMjgyNjMsIDB4MDAwMDg5NkIgfSwgLyogR0xfQ05EMF9BVEkgKi8KKyAgIHsgMjgyNzUsIDB4MDAwMDg5NkMgfSwgLyogR0xfRE9UMl9BRERfQVRJICovCisgICB7IDI4MjkxLCAweDAwMDA4OTZEIH0sIC8qIEdMX1NFQ09OREFSWV9JTlRFUlBPTEFUT1JfQVRJICovCisgICB7IDI4MzIxLCAweDAwMDA4OTZFIH0sIC8qIEdMX05VTV9GUkFHTUVOVF9SRUdJU1RFUlNfQVRJICovCisgICB7IDI4MzUxLCAweDAwMDA4OTZGIH0sIC8qIEdMX05VTV9GUkFHTUVOVF9DT05TVEFOVFNfQVRJICovCisgICB7IDI4MzgxLCAweDAwMDA4OTcwIH0sIC8qIEdMX05VTV9QQVNTRVNfQVRJICovCisgICB7IDI4Mzk5LCAweDAwMDA4OTcxIH0sIC8qIEdMX05VTV9JTlNUUlVDVElPTlNfUEVSX1BBU1NfQVRJICovCisgICB7IDI4NDMyLCAweDAwMDA4OTcyIH0sIC8qIEdMX05VTV9JTlNUUlVDVElPTlNfVE9UQUxfQVRJICovCisgICB7IDI4NDYyLCAweDAwMDA4OTczIH0sIC8qIEdMX05VTV9JTlBVVF9JTlRFUlBPTEFUT1JfQ09NUE9ORU5UU19BVEkgKi8KKyAgIHsgMjg1MDMsIDB4MDAwMDg5NzQgfSwgLyogR0xfTlVNX0xPT1BCQUNLX0NPTVBPTkVOVFNfQVRJICovCisgICB7IDI4NTM0LCAweDAwMDA4OTc1IH0sIC8qIEdMX0NPTE9SX0FMUEhBX1BBSVJJTkdfQVRJICovCisgICB7IDI4NTYxLCAweDAwMDA4OTc2IH0sIC8qIEdMX1NXSVpaTEVfU1RSX0FUSSAqLworICAgeyAyODU4MCwgMHgwMDAwODk3NyB9LCAvKiBHTF9TV0laWkxFX1NUUV9BVEkgKi8KKyAgIHsgMjg1OTksIDB4MDAwMDg5NzggfSwgLyogR0xfU1dJWlpMRV9TVFJfRFJfQVRJICovCisgICB7IDI4NjIxLCAweDAwMDA4OTc5IH0sIC8qIEdMX1NXSVpaTEVfU1RRX0RRX0FUSSAqLworICAgeyAyODY0MywgMHgwMDAwODk3QSB9LCAvKiBHTF9TV0laWkxFX1NUUlFfQVRJICovCisgICB7IDI4NjYzLCAweDAwMDA4OTdCIH0sIC8qIEdMX1NXSVpaTEVfU1RSUV9EUV9BVEkgKi8KKyAgIHsgMjg2ODYsIDB4MDAwMDg5OEEgfSwgLyogR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyAqLworICAgeyAyODcxNSwgMHgwMDAwODk4QiB9LCAvKiBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgKi8KKyAgIHsgMjg3NDYsIDB4MDAwMDg5OEMgfSwgLyogR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUyAqLworICAgeyAyODc3OCwgMHgwMDAwODk4RCB9LCAvKiBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAqLworICAgeyAyODgyMCwgMHgwMDAwODk4RSB9LCAvKiBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgKi8KKyAgIHsgMjg4NjMsIDB4MDAwMDg5OEYgfSwgLyogR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICovCisgICB7IDI4OTAzLCAweDAwMDA4QTExIH0sIC8qIEdMX1VOSUZPUk1fQlVGRkVSICovCisgICB7IDI4OTIxLCAweDAwMDA4QTEyIH0sIC8qIEdMX0JVRkZFUl9TRVJJQUxJWkVEX01PRElGWV9BUFBMRSAqLworICAgeyAyODk1NSwgMHgwMDAwOEExMyB9LCAvKiBHTF9CVUZGRVJfRkxVU0hJTkdfVU5NQVBfQVBQTEUgKi8KKyAgIHsgMjg5ODYsIDB4MDAwMDhBMTkgfSwgLyogR0xfUkVMRUFTRURfQVBQTEUgKi8KKyAgIHsgMjkwMDQsIDB4MDAwMDhBMUEgfSwgLyogR0xfVk9MQVRJTEVfQVBQTEUgKi8KKyAgIHsgMjkwMjIsIDB4MDAwMDhBMUIgfSwgLyogR0xfUkVUQUlORURfQVBQTEUgKi8KKyAgIHsgMjkwNDAsIDB4MDAwMDhBMUMgfSwgLyogR0xfVU5ERUZJTkVEX0FQUExFICovCisgICB7IDI5MDU5LCAweDAwMDA4QTFEIH0sIC8qIEdMX1BVUkdFQUJMRV9BUFBMRSAqLworICAgeyAyOTA3OCwgMHgwMDAwOEEyOCB9LCAvKiBHTF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDI5MTA0LCAweDAwMDA4QTI5IH0sIC8qIEdMX1VOSUZPUk1fQlVGRkVSX1NUQVJUICovCisgICB7IDI5MTI4LCAweDAwMDA4QTJBIH0sIC8qIEdMX1VOSUZPUk1fQlVGRkVSX1NJWkUgKi8KKyAgIHsgMjkxNTEsIDB4MDAwMDhBMkIgfSwgLyogR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0JMT0NLUyAqLworICAgeyAyOTE4MCwgMHgwMDAwOEEyQyB9LCAvKiBHTF9NQVhfR0VPTUVUUllfVU5JRk9STV9CTE9DS1MgKi8KKyAgIHsgMjkyMTEsIDB4MDAwMDhBMkQgfSwgLyogR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTICovCisgICB7IDI5MjQyLCAweDAwMDA4QTJFIH0sIC8qIEdMX01BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUyAqLworICAgeyAyOTI3MywgMHgwMDAwOEEyRiB9LCAvKiBHTF9NQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1MgKi8KKyAgIHsgMjkzMDQsIDB4MDAwMDhBMzAgfSwgLyogR0xfTUFYX1VOSUZPUk1fQkxPQ0tfU0laRSAqLworICAgeyAyOTMzMCwgMHgwMDAwOEEzMSB9LCAvKiBHTF9NQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworICAgeyAyOTM3MiwgMHgwMDAwOEEzMiB9LCAvKiBHTF9NQVhfQ09NQklORURfR0VPTUVUUllfVU5JRk9STV9DT01QT05FTlRTICovCisgICB7IDI5NDE2LCAweDAwMDA4QTMzIH0sIC8qIEdMX01BWF9DT01CSU5FRF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKyAgIHsgMjk0NjAsIDB4MDAwMDhBMzQgfSwgLyogR0xfVU5JRk9STV9CVUZGRVJfT0ZGU0VUX0FMSUdOTUVOVCAqLworICAgeyAyOTQ5NSwgMHgwMDAwOEEzNSB9LCAvKiBHTF9BQ1RJVkVfVU5JRk9STV9CTE9DS19NQVhfTkFNRV9MRU5HVEggKi8KKyAgIHsgMjk1MzUsIDB4MDAwMDhBMzYgfSwgLyogR0xfQUNUSVZFX1VOSUZPUk1fQkxPQ0tTICovCisgICB7IDI5NTYwLCAweDAwMDA4QTM3IH0sIC8qIEdMX1VOSUZPUk1fVFlQRSAqLworICAgeyAyOTU3NiwgMHgwMDAwOEEzOCB9LCAvKiBHTF9VTklGT1JNX1NJWkUgKi8KKyAgIHsgMjk1OTIsIDB4MDAwMDhBMzkgfSwgLyogR0xfVU5JRk9STV9OQU1FX0xFTkdUSCAqLworICAgeyAyOTYxNSwgMHgwMDAwOEEzQSB9LCAvKiBHTF9VTklGT1JNX0JMT0NLX0lOREVYICovCisgICB7IDI5NjM4LCAweDAwMDA4QTNCIH0sIC8qIEdMX1VOSUZPUk1fT0ZGU0VUICovCisgICB7IDI5NjU2LCAweDAwMDA4QTNDIH0sIC8qIEdMX1VOSUZPUk1fQVJSQVlfU1RSSURFICovCisgICB7IDI5NjgwLCAweDAwMDA4QTNEIH0sIC8qIEdMX1VOSUZPUk1fTUFUUklYX1NUUklERSAqLworICAgeyAyOTcwNSwgMHgwMDAwOEEzRSB9LCAvKiBHTF9VTklGT1JNX0lTX1JPV19NQUpPUiAqLworICAgeyAyOTcyOSwgMHgwMDAwOEEzRiB9LCAvKiBHTF9VTklGT1JNX0JMT0NLX0JJTkRJTkcgKi8KKyAgIHsgMjk3NTQsIDB4MDAwMDhBNDAgfSwgLyogR0xfVU5JRk9STV9CTE9DS19EQVRBX1NJWkUgKi8KKyAgIHsgMjk3ODEsIDB4MDAwMDhBNDEgfSwgLyogR0xfVU5JRk9STV9CTE9DS19OQU1FX0xFTkdUSCAqLworICAgeyAyOTgxMCwgMHgwMDAwOEE0MiB9LCAvKiBHTF9VTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNUyAqLworICAgeyAyOTg0MywgMHgwMDAwOEE0MyB9LCAvKiBHTF9VTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNX0lORElDRVMgKi8KKyAgIHsgMjk4ODMsIDB4MDAwMDhBNDQgfSwgLyogR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1ZFUlRFWF9TSEFERVIgKi8KKyAgIHsgMjk5MjgsIDB4MDAwMDhBNDUgfSwgLyogR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0dFT01FVFJZX1NIQURFUiAqLworICAgeyAyOTk3NSwgMHgwMDAwOEE0NiB9LCAvKiBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSICovCisgICB7IDMwMDIyLCAweDAwMDA4QTQ4IH0sIC8qIEdMX1RFWFRVUkVfU1JHQl9ERUNPREVfRVhUICovCisgICB7IDMwMDQ5LCAweDAwMDA4QTQ5IH0sIC8qIEdMX0RFQ09ERV9FWFQgKi8KKyAgIHsgMzAwNjMsIDB4MDAwMDhBNEEgfSwgLyogR0xfU0tJUF9ERUNPREVfRVhUICovCisgICB7IDMwMDgyLCAweDAwMDA4QjMwIH0sIC8qIEdMX0ZSQUdNRU5UX1NIQURFUiAqLworICAgeyAzMDEwMSwgMHgwMDAwOEIzMSB9LCAvKiBHTF9WRVJURVhfU0hBREVSICovCisgICB7IDMwMTE4LCAweDAwMDA4QjQwIH0sIC8qIEdMX1BST0dSQU1fT0JKRUNUX0FSQiAqLworICAgeyAzMDE0MCwgMHgwMDAwOEI0OCB9LCAvKiBHTF9TSEFERVJfT0JKRUNUX0FSQiAqLworICAgeyAzMDE2MSwgMHgwMDAwOEI0OSB9LCAvKiBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTICovCisgICB7IDMwMTk2LCAweDAwMDA4QjRBIH0sIC8qIEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTICovCisgICB7IDMwMjI5LCAweDAwMDA4QjRCIH0sIC8qIEdMX01BWF9WQVJZSU5HX0NPTVBPTkVOVFMgKi8KKyAgIHsgMzAyNTUsIDB4MDAwMDhCNEMgfSwgLyogR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTICovCisgICB7IDMwMjg5LCAweDAwMDA4QjREIH0sIC8qIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTICovCisgICB7IDMwMzI1LCAweDAwMDA4QjRFIH0sIC8qIEdMX09CSkVDVF9UWVBFX0FSQiAqLworICAgeyAzMDM0NCwgMHgwMDAwOEI0RiB9LCAvKiBHTF9TSEFERVJfVFlQRSAqLworICAgeyAzMDM1OSwgMHgwMDAwOEI1MCB9LCAvKiBHTF9GTE9BVF9WRUMyICovCisgICB7IDMwMzczLCAweDAwMDA4QjUxIH0sIC8qIEdMX0ZMT0FUX1ZFQzMgKi8KKyAgIHsgMzAzODcsIDB4MDAwMDhCNTIgfSwgLyogR0xfRkxPQVRfVkVDNCAqLworICAgeyAzMDQwMSwgMHgwMDAwOEI1MyB9LCAvKiBHTF9JTlRfVkVDMiAqLworICAgeyAzMDQxMywgMHgwMDAwOEI1NCB9LCAvKiBHTF9JTlRfVkVDMyAqLworICAgeyAzMDQyNSwgMHgwMDAwOEI1NSB9LCAvKiBHTF9JTlRfVkVDNCAqLworICAgeyAzMDQzNywgMHgwMDAwOEI1NiB9LCAvKiBHTF9CT09MICovCisgICB7IDMwNDQ1LCAweDAwMDA4QjU3IH0sIC8qIEdMX0JPT0xfVkVDMiAqLworICAgeyAzMDQ1OCwgMHgwMDAwOEI1OCB9LCAvKiBHTF9CT09MX1ZFQzMgKi8KKyAgIHsgMzA0NzEsIDB4MDAwMDhCNTkgfSwgLyogR0xfQk9PTF9WRUM0ICovCisgICB7IDMwNDg0LCAweDAwMDA4QjVBIH0sIC8qIEdMX0ZMT0FUX01BVDIgKi8KKyAgIHsgMzA0OTgsIDB4MDAwMDhCNUIgfSwgLyogR0xfRkxPQVRfTUFUMyAqLworICAgeyAzMDUxMiwgMHgwMDAwOEI1QyB9LCAvKiBHTF9GTE9BVF9NQVQ0ICovCisgICB7IDMwNTI2LCAweDAwMDA4QjVEIH0sIC8qIEdMX1NBTVBMRVJfMUQgKi8KKyAgIHsgMzA1NDAsIDB4MDAwMDhCNUUgfSwgLyogR0xfU0FNUExFUl8yRCAqLworICAgeyAzMDU1NCwgMHgwMDAwOEI1RiB9LCAvKiBHTF9TQU1QTEVSXzNEICovCisgICB7IDMwNTY4LCAweDAwMDA4QjYwIH0sIC8qIEdMX1NBTVBMRVJfQ1VCRSAqLworICAgeyAzMDU4NCwgMHgwMDAwOEI2MSB9LCAvKiBHTF9TQU1QTEVSXzFEX1NIQURPVyAqLworICAgeyAzMDYwNSwgMHgwMDAwOEI2MiB9LCAvKiBHTF9TQU1QTEVSXzJEX1NIQURPVyAqLworICAgeyAzMDYyNiwgMHgwMDAwOEI2MyB9LCAvKiBHTF9TQU1QTEVSXzJEX1JFQ1QgKi8KKyAgIHsgMzA2NDUsIDB4MDAwMDhCNjQgfSwgLyogR0xfU0FNUExFUl8yRF9SRUNUX1NIQURPVyAqLworICAgeyAzMDY3MSwgMHgwMDAwOEI2NSB9LCAvKiBHTF9GTE9BVF9NQVQyeDMgKi8KKyAgIHsgMzA2ODcsIDB4MDAwMDhCNjYgfSwgLyogR0xfRkxPQVRfTUFUMng0ICovCisgICB7IDMwNzAzLCAweDAwMDA4QjY3IH0sIC8qIEdMX0ZMT0FUX01BVDN4MiAqLworICAgeyAzMDcxOSwgMHgwMDAwOEI2OCB9LCAvKiBHTF9GTE9BVF9NQVQzeDQgKi8KKyAgIHsgMzA3MzUsIDB4MDAwMDhCNjkgfSwgLyogR0xfRkxPQVRfTUFUNHgyICovCisgICB7IDMwNzUxLCAweDAwMDA4QjZBIH0sIC8qIEdMX0ZMT0FUX01BVDR4MyAqLworICAgeyAzMDc2NywgMHgwMDAwOEI4MCB9LCAvKiBHTF9ERUxFVEVfU1RBVFVTICovCisgICB7IDMwNzg0LCAweDAwMDA4QjgxIH0sIC8qIEdMX0NPTVBJTEVfU1RBVFVTICovCisgICB7IDMwODAyLCAweDAwMDA4QjgyIH0sIC8qIEdMX0xJTktfU1RBVFVTICovCisgICB7IDMwODE3LCAweDAwMDA4QjgzIH0sIC8qIEdMX1ZBTElEQVRFX1NUQVRVUyAqLworICAgeyAzMDgzNiwgMHgwMDAwOEI4NCB9LCAvKiBHTF9JTkZPX0xPR19MRU5HVEggKi8KKyAgIHsgMzA4NTUsIDB4MDAwMDhCODUgfSwgLyogR0xfQVRUQUNIRURfU0hBREVSUyAqLworICAgeyAzMDg3NSwgMHgwMDAwOEI4NiB9LCAvKiBHTF9BQ1RJVkVfVU5JRk9STVMgKi8KKyAgIHsgMzA4OTQsIDB4MDAwMDhCODcgfSwgLyogR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCAqLworICAgeyAzMDkyMywgMHgwMDAwOEI4OCB9LCAvKiBHTF9TSEFERVJfU09VUkNFX0xFTkdUSCAqLworICAgeyAzMDk0NywgMHgwMDAwOEI4OSB9LCAvKiBHTF9BQ1RJVkVfQVRUUklCVVRFUyAqLworICAgeyAzMDk2OCwgMHgwMDAwOEI4QSB9LCAvKiBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggKi8KKyAgIHsgMzA5OTksIDB4MDAwMDhCOEIgfSwgLyogR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVCAqLworICAgeyAzMTAzNCwgMHgwMDAwOEI4QyB9LCAvKiBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gKi8KKyAgIHsgMzEwNjIsIDB4MDAwMDhCOEQgfSwgLyogR0xfQ1VSUkVOVF9QUk9HUkFNICovCisgICB7IDMxMDgxLCAweDAwMDA4QjkwIH0sIC8qIEdMX1BBTEVUVEU0X1JHQjhfT0VTICovCisgICB7IDMxMTAyLCAweDAwMDA4QjkxIH0sIC8qIEdMX1BBTEVUVEU0X1JHQkE4X09FUyAqLworICAgeyAzMTEyNCwgMHgwMDAwOEI5MiB9LCAvKiBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgKi8KKyAgIHsgMzExNDksIDB4MDAwMDhCOTMgfSwgLyogR0xfUEFMRVRURTRfUkdCQTRfT0VTICovCisgICB7IDMxMTcxLCAweDAwMDA4Qjk0IH0sIC8qIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICovCisgICB7IDMxMTk1LCAweDAwMDA4Qjk1IH0sIC8qIEdMX1BBTEVUVEU4X1JHQjhfT0VTICovCisgICB7IDMxMjE2LCAweDAwMDA4Qjk2IH0sIC8qIEdMX1BBTEVUVEU4X1JHQkE4X09FUyAqLworICAgeyAzMTIzOCwgMHgwMDAwOEI5NyB9LCAvKiBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgKi8KKyAgIHsgMzEyNjMsIDB4MDAwMDhCOTggfSwgLyogR0xfUEFMRVRURThfUkdCQTRfT0VTICovCisgICB7IDMxMjg1LCAweDAwMDA4Qjk5IH0sIC8qIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICovCisgICB7IDMxMzA5LCAweDAwMDA4QjlBIH0sIC8qIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSAqLworICAgeyAzMTM0MywgMHgwMDAwOEI5QiB9LCAvKiBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCAqLworICAgeyAzMTM3OSwgMHgwMDAwOEI5QyB9LCAvKiBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAqLworICAgeyAzMTQwMywgMHgwMDAwOEI5RCB9LCAvKiBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMgKi8KKyAgIHsgMzE0MjgsIDB4MDAwMDhCOUUgfSwgLyogR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAqLworICAgeyAzMTQ2OSwgMHgwMDAwOEI5RiB9LCAvKiBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAqLworICAgeyAzMTUwOCwgMHgwMDAwOEJDMCB9LCAvKiBHTF9DT1VOVEVSX1RZUEVfQU1EICovCisgICB7IDMxNTI4LCAweDAwMDA4QkMxIH0sIC8qIEdMX0NPVU5URVJfUkFOR0VfQU1EICovCisgICB7IDMxNTQ5LCAweDAwMDA4QkMyIH0sIC8qIEdMX1VOU0lHTkVEX0lOVDY0X0FNRCAqLworICAgeyAzMTU3MSwgMHgwMDAwOEJDMyB9LCAvKiBHTF9QRUNFTlRBR0VfQU1EICovCisgICB7IDMxNTg4LCAweDAwMDA4QkM0IH0sIC8qIEdMX1BFUkZNT05fUkVTVUxUX0FWQUlMQUJMRV9BTUQgKi8KKyAgIHsgMzE2MjAsIDB4MDAwMDhCQzUgfSwgLyogR0xfUEVSRk1PTl9SRVNVTFRfU0laRV9BTUQgKi8KKyAgIHsgMzE2NDcsIDB4MDAwMDhCQzYgfSwgLyogR0xfUEVSRk1PTl9SRVNVTFRfQU1EICovCisgICB7IDMxNjY5LCAweDAwMDA4QzEwIH0sIC8qIEdMX1RFWFRVUkVfUkVEX1RZUEUgKi8KKyAgIHsgMzE2ODksIDB4MDAwMDhDMTEgfSwgLyogR0xfVEVYVFVSRV9HUkVFTl9UWVBFICovCisgICB7IDMxNzExLCAweDAwMDA4QzEyIH0sIC8qIEdMX1RFWFRVUkVfQkxVRV9UWVBFICovCisgICB7IDMxNzMyLCAweDAwMDA4QzEzIH0sIC8qIEdMX1RFWFRVUkVfQUxQSEFfVFlQRSAqLworICAgeyAzMTc1NCwgMHgwMDAwOEMxNCB9LCAvKiBHTF9URVhUVVJFX0xVTUlOQU5DRV9UWVBFICovCisgICB7IDMxNzgwLCAweDAwMDA4QzE1IH0sIC8qIEdMX1RFWFRVUkVfSU5URU5TSVRZX1RZUEUgKi8KKyAgIHsgMzE4MDYsIDB4MDAwMDhDMTYgfSwgLyogR0xfVEVYVFVSRV9ERVBUSF9UWVBFICovCisgICB7IDMxODI4LCAweDAwMDA4QzE3IH0sIC8qIEdMX1VOU0lHTkVEX05PUk1BTElaRUQgKi8KKyAgIHsgMzE4NTEsIDB4MDAwMDhDMTggfSwgLyogR0xfVEVYVFVSRV8xRF9BUlJBWSAqLworICAgeyAzMTg3MSwgMHgwMDAwOEMxOSB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzFEX0FSUkFZICovCisgICB7IDMxODk3LCAweDAwMDA4QzFBIH0sIC8qIEdMX1RFWFRVUkVfMkRfQVJSQVkgKi8KKyAgIHsgMzE5MTcsIDB4MDAwMDhDMUIgfSwgLyogR0xfUFJPWFlfVEVYVFVSRV8yRF9BUlJBWSAqLworICAgeyAzMTk0MywgMHgwMDAwOEMxQyB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMURfQVJSQVkgKi8KKyAgIHsgMzE5NzEsIDB4MDAwMDhDMUQgfSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HXzJEX0FSUkFZICovCisgICB7IDMxOTk5LCAweDAwMDA4QzI5IH0sIC8qIEdMX01BWF9HRU9NRVRSWV9URVhUVVJFX0lNQUdFX1VOSVRTICovCisgICB7IDMyMDM1LCAweDAwMDA4QzJBIH0sIC8qIEdMX1RFWFRVUkVfQlVGRkVSICovCisgICB7IDMyMDUzLCAweDAwMDA4QzJCIH0sIC8qIEdMX01BWF9URVhUVVJFX0JVRkZFUl9TSVpFICovCisgICB7IDMyMDgwLCAweDAwMDA4QzJDIH0sIC8qIEdMX1RFWFRVUkVfQklORElOR19CVUZGRVIgKi8KKyAgIHsgMzIxMDYsIDB4MDAwMDhDMkQgfSwgLyogR0xfVEVYVFVSRV9CVUZGRVJfREFUQV9TVE9SRV9CSU5ESU5HICovCisgICB7IDMyMTQzLCAweDAwMDA4QzJFIH0sIC8qIEdMX1RFWFRVUkVfQlVGRkVSX0ZPUk1BVCAqLworICAgeyAzMjE2OCwgMHgwMDAwOEMyRiB9LCAvKiBHTF9BTllfU0FNUExFU19QQVNTRUQgKi8KKyAgIHsgMzIxOTAsIDB4MDAwMDhDMzYgfSwgLyogR0xfU0FNUExFX1NIQURJTkcgKi8KKyAgIHsgMzIyMDgsIDB4MDAwMDhDMzcgfSwgLyogR0xfTUlOX1NBTVBMRV9TSEFESU5HX1ZBTFVFICovCisgICB7IDMyMjM2LCAweDAwMDA4QzNBIH0sIC8qIEdMX1IxMUZfRzExRl9CMTBGICovCisgICB7IDMyMjU0LCAweDAwMDA4QzNCIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF8xMEZfMTFGXzExRl9SRVYgKi8KKyAgIHsgMzIyODYsIDB4MDAwMDhDM0MgfSwgLyogR0xfUkdCQV9TSUdORURfQ09NUE9ORU5UU19FWFQgKi8KKyAgIHsgMzIzMTYsIDB4MDAwMDhDM0QgfSwgLyogR0xfUkdCOV9FNSAqLworICAgeyAzMjMyNywgMHgwMDAwOEMzRSB9LCAvKiBHTF9VTlNJR05FRF9JTlRfNV85XzlfOV9SRVYgKi8KKyAgIHsgMzIzNTUsIDB4MDAwMDhDM0YgfSwgLyogR0xfVEVYVFVSRV9TSEFSRURfU0laRSAqLworICAgeyAzMjM3OCwgMHgwMDAwOEM0MCB9LCAvKiBHTF9TUkdCICovCisgICB7IDMyMzg2LCAweDAwMDA4QzQxIH0sIC8qIEdMX1NSR0I4ICovCisgICB7IDMyMzk1LCAweDAwMDA4QzQyIH0sIC8qIEdMX1NSR0JfQUxQSEEgKi8KKyAgIHsgMzI0MDksIDB4MDAwMDhDNDMgfSwgLyogR0xfU1JHQjhfQUxQSEE4ICovCisgICB7IDMyNDI1LCAweDAwMDA4QzQ0IH0sIC8qIEdMX1NMVU1JTkFOQ0VfQUxQSEEgKi8KKyAgIHsgMzI0NDUsIDB4MDAwMDhDNDUgfSwgLyogR0xfU0xVTUlOQU5DRThfQUxQSEE4ICovCisgICB7IDMyNDY3LCAweDAwMDA4QzQ2IH0sIC8qIEdMX1NMVU1JTkFOQ0UgKi8KKyAgIHsgMzI0ODEsIDB4MDAwMDhDNDcgfSwgLyogR0xfU0xVTUlOQU5DRTggKi8KKyAgIHsgMzI0OTYsIDB4MDAwMDhDNDggfSwgLyogR0xfQ09NUFJFU1NFRF9TUkdCICovCisgICB7IDMyNTE1LCAweDAwMDA4QzQ5IH0sIC8qIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQSAqLworICAgeyAzMjU0MCwgMHgwMDAwOEM0QSB9LCAvKiBHTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0UgKi8KKyAgIHsgMzI1NjUsIDB4MDAwMDhDNEIgfSwgLyogR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFX0FMUEhBICovCisgICB7IDMyNTk2LCAweDAwMDA4Qzc2IH0sIC8qIEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HX01BWF9MRU5HVEggKi8KKyAgIHsgMzI2MzcsIDB4MDAwMDhDN0YgfSwgLyogR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9NT0RFICovCisgICB7IDMyNjcxLCAweDAwMDA4QzgwIH0sIC8qIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UUyAqLworICAgeyAzMjcxNywgMHgwMDAwOEM4MyB9LCAvKiBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfVkFSWUlOR1MgKi8KKyAgIHsgMzI3NDgsIDB4MDAwMDhDODQgfSwgLyogR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TVEFSVCAqLworICAgeyAzMjc4MywgMHgwMDAwOEM4NSB9LCAvKiBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NJWkUgKi8KKyAgIHsgMzI4MTcsIDB4MDAwMDhDODcgfSwgLyogR0xfUFJJTUlUSVZFU19HRU5FUkFURUQgKi8KKyAgIHsgMzI4NDEsIDB4MDAwMDhDODggfSwgLyogR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BSSU1JVElWRVNfV1JJVFRFTiAqLworICAgeyAzMjg4MiwgMHgwMDAwOEM4OSB9LCAvKiBHTF9SQVNURVJJWkVSX0RJU0NBUkQgKi8KKyAgIHsgMzI5MDQsIDB4MDAwMDhDOEEgfSwgLyogR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTICovCisgICB7IDMyOTUzLCAweDAwMDA4QzhCIH0sIC8qIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQVRUUklCUyAqLworICAgeyAzMjk5NiwgMHgwMDAwOEM4QyB9LCAvKiBHTF9JTlRFUkxFQVZFRF9BVFRSSUJTICovCisgICB7IDMzMDE5LCAweDAwMDA4QzhEIH0sIC8qIEdMX1NFUEFSQVRFX0FUVFJJQlMgKi8KKyAgIHsgMzMwMzksIDB4MDAwMDhDOEUgfSwgLyogR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUiAqLworICAgeyAzMzA2OCwgMHgwMDAwOEM4RiB9LCAvKiBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0JJTkRJTkcgKi8KKyAgIHsgMzMxMDUsIDB4MDAwMDhDQTAgfSwgLyogR0xfUE9JTlRfU1BSSVRFX0NPT1JEX09SSUdJTiAqLworICAgeyAzMzEzNCwgMHgwMDAwOENBMSB9LCAvKiBHTF9MT1dFUl9MRUZUICovCisgICB7IDMzMTQ4LCAweDAwMDA4Q0EyIH0sIC8qIEdMX1VQUEVSX0xFRlQgKi8KKyAgIHsgMzMxNjIsIDB4MDAwMDhDQTMgfSwgLyogR0xfU1RFTkNJTF9CQUNLX1JFRiAqLworICAgeyAzMzE4MiwgMHgwMDAwOENBNCB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAqLworICAgeyAzMzIwOSwgMHgwMDAwOENBNSB9LCAvKiBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLICovCisgICB7IDMzMjM1LCAweDAwMDA4Q0E2IH0sIC8qIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElORyAqLworICAgeyAzMzI2MywgMHgwMDAwOENBNyB9LCAvKiBHTF9SRU5ERVJCVUZGRVJfQklORElORyAqLworICAgeyAzMzI4NywgMHgwMDAwOENBOCB9LCAvKiBHTF9SRUFEX0ZSQU1FQlVGRkVSICovCisgICB7IDMzMzA3LCAweDAwMDA4Q0E5IH0sIC8qIEdMX0RSQVdfRlJBTUVCVUZGRVIgKi8KKyAgIHsgMzMzMjcsIDB4MDAwMDhDQUEgfSwgLyogR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HICovCisgICB7IDMzMzU1LCAweDAwMDA4Q0FCIH0sIC8qIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTICovCisgICB7IDMzMzc5LCAweDAwMDA4Q0FDIH0sIC8qIEdMX0RFUFRIX0NPTVBPTkVOVDMyRiAqLworICAgeyAzMzQwMSwgMHgwMDAwOENBRCB9LCAvKiBHTF9ERVBUSDMyRl9TVEVOQ0lMOCAqLworICAgeyAzMzQyMiwgMHgwMDAwOENEMCB9LCAvKiBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFICovCisgICB7IDMzNDYwLCAweDAwMDA4Q0QxIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUgKi8KKyAgIHsgMzM0OTgsIDB4MDAwMDhDRDIgfSwgLyogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMICovCisgICB7IDMzNTM4LCAweDAwMDA4Q0QzIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFICovCisgICB7IDMzNTg2LCAweDAwMDA4Q0Q0IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUiAqLworICAgeyAzMzYyNiwgMHgwMDAwOENENSB9LCAvKiBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSAqLworICAgeyAzMzY1MCwgMHgwMDAwOENENiB9LCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQgKi8KKyAgIHsgMzM2ODcsIDB4MDAwMDhDRDcgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgKi8KKyAgIHsgMzM3MzIsIDB4MDAwMDhDRDggfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9EVVBMSUNBVEVfQVRUQUNITUVOVF9FWFQgKi8KKyAgIHsgMzM3ODMsIDB4MDAwMDhDRDkgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX0VYVCAqLworICAgeyAzMzgyNCwgMHgwMDAwOENEQSB9LCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfRVhUICovCisgICB7IDMzODYyLCAweDAwMDA4Q0RCIH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVIgKi8KKyAgIHsgMzM5MDAsIDB4MDAwMDhDREMgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9SRUFEX0JVRkZFUiAqLworICAgeyAzMzkzOCwgMHgwMDAwOENERCB9LCAvKiBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCAqLworICAgeyAzMzk2NSwgMHgwMDAwOENERSB9LCAvKiBHTF9GUkFNRUJVRkZFUl9TVEFUVVNfRVJST1JfRVhUICovCisgICB7IDMzOTk3LCAweDAwMDA4Q0RGIH0sIC8qIEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UUyAqLworICAgeyAzNDAyMiwgMHgwMDAwOENFMCB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMCAqLworICAgeyAzNDA0MywgMHgwMDAwOENFMSB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMSAqLworICAgeyAzNDA2NCwgMHgwMDAwOENFMiB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMiAqLworICAgeyAzNDA4NSwgMHgwMDAwOENFMyB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMyAqLworICAgeyAzNDEwNiwgMHgwMDAwOENFNCB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNCAqLworICAgeyAzNDEyNywgMHgwMDAwOENFNSB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNSAqLworICAgeyAzNDE0OCwgMHgwMDAwOENFNiB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNiAqLworICAgeyAzNDE2OSwgMHgwMDAwOENFNyB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UNyAqLworICAgeyAzNDE5MCwgMHgwMDAwOENFOCB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UOCAqLworICAgeyAzNDIxMSwgMHgwMDAwOENFOSB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UOSAqLworICAgeyAzNDIzMiwgMHgwMDAwOENFQSB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMTAgKi8KKyAgIHsgMzQyNTQsIDB4MDAwMDhDRUIgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDExICovCisgICB7IDM0Mjc2LCAweDAwMDA4Q0VDIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxMiAqLworICAgeyAzNDI5OCwgMHgwMDAwOENFRCB9LCAvKiBHTF9DT0xPUl9BVFRBQ0hNRU5UMTMgKi8KKyAgIHsgMzQzMjAsIDB4MDAwMDhDRUUgfSwgLyogR0xfQ09MT1JfQVRUQUNITUVOVDE0ICovCisgICB7IDM0MzQyLCAweDAwMDA4Q0VGIH0sIC8qIEdMX0NPTE9SX0FUVEFDSE1FTlQxNSAqLworICAgeyAzNDM2NCwgMHgwMDAwOEQwMCB9LCAvKiBHTF9ERVBUSF9BVFRBQ0hNRU5UICovCisgICB7IDM0Mzg0LCAweDAwMDA4RDIwIH0sIC8qIEdMX1NURU5DSUxfQVRUQUNITUVOVCAqLworICAgeyAzNDQwNiwgMHgwMDAwOEQ0MCB9LCAvKiBHTF9GUkFNRUJVRkZFUiAqLworICAgeyAzNDQyMSwgMHgwMDAwOEQ0MSB9LCAvKiBHTF9SRU5ERVJCVUZGRVIgKi8KKyAgIHsgMzQ0MzcsIDB4MDAwMDhENDIgfSwgLyogR0xfUkVOREVSQlVGRkVSX1dJRFRIICovCisgICB7IDM0NDU5LCAweDAwMDA4RDQzIH0sIC8qIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgKi8KKyAgIHsgMzQ0ODIsIDB4MDAwMDhENDQgfSwgLyogR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAqLworICAgeyAzNDUxNCwgMHgwMDAwOEQ0NSB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYX0VYVCAqLworICAgeyAzNDUzNSwgMHgwMDAwOEQ0NiB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYMSAqLworICAgeyAzNDU1MywgMHgwMDAwOEQ0NyB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYNCAqLworICAgeyAzNDU3MSwgMHgwMDAwOEQ0OCB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYOCAqLworICAgeyAzNDU4OSwgMHgwMDAwOEQ0OSB9LCAvKiBHTF9TVEVOQ0lMX0lOREVYMTYgKi8KKyAgIHsgMzQ2MDgsIDB4MDAwMDhENTAgfSwgLyogR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFICovCisgICB7IDM0NjMzLCAweDAwMDA4RDUxIH0sIC8qIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICovCisgICB7IDM0NjYwLCAweDAwMDA4RDUyIH0sIC8qIEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkUgKi8KKyAgIHsgMzQ2ODYsIDB4MDAwMDhENTMgfSwgLyogR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkUgKi8KKyAgIHsgMzQ3MTMsIDB4MDAwMDhENTQgfSwgLyogR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkUgKi8KKyAgIHsgMzQ3NDAsIDB4MDAwMDhENTUgfSwgLyogR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSAqLworICAgeyAzNDc2OSwgMHgwMDAwOEQ1NiB9LCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFICovCisgICB7IDM0ODA3LCAweDAwMDA4RDU3IH0sIC8qIEdMX01BWF9TQU1QTEVTICovCisgICB7IDM0ODIyLCAweDAwMDA4RDYwIH0sIC8qIEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMgKi8KKyAgIHsgMzQ4NDUsIDB4MDAwMDhENjEgfSwgLyogR0xfSEFMRl9GTE9BVF9PRVMgKi8KKyAgIHsgMzQ4NjMsIDB4MDAwMDhENjIgfSwgLyogR0xfUkdCNTY1ICovCisgICB7IDM0ODczLCAweDAwMDA4RDY0IH0sIC8qIEdMX0VUQzFfUkdCOF9PRVMgKi8KKyAgIHsgMzQ4OTAsIDB4MDAwMDhENjUgfSwgLyogR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgKi8KKyAgIHsgMzQ5MTQsIDB4MDAwMDhENjYgfSwgLyogR0xfU0FNUExFUl9FWFRFUk5BTF9PRVMgKi8KKyAgIHsgMzQ5MzgsIDB4MDAwMDhENjcgfSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HX0VYVEVSTkFMX09FUyAqLworICAgeyAzNDk3MCwgMHgwMDAwOEQ2OCB9LCAvKiBHTF9SRVFVSVJFRF9URVhUVVJFX0lNQUdFX1VOSVRTX09FUyAqLworICAgeyAzNTAwNiwgMHgwMDAwOEQ2OSB9LCAvKiBHTF9QUklNSVRJVkVfUkVTVEFSVF9GSVhFRF9JTkRFWCAqLworICAgeyAzNTAzOSwgMHgwMDAwOEQ2QSB9LCAvKiBHTF9BTllfU0FNUExFU19QQVNTRURfQ09OU0VSVkFUSVZFICovCisgICB7IDM1MDc0LCAweDAwMDA4RDZCIH0sIC8qIEdMX01BWF9FTEVNRU5UX0lOREVYICovCisgICB7IDM1MDk1LCAweDAwMDA4RDcwIH0sIC8qIEdMX1JHQkEzMlVJICovCisgICB7IDM1MTA3LCAweDAwMDA4RDcxIH0sIC8qIEdMX1JHQjMyVUkgKi8KKyAgIHsgMzUxMTgsIDB4MDAwMDhENzIgfSwgLyogR0xfQUxQSEEzMlVJX0VYVCAqLworICAgeyAzNTEzNSwgMHgwMDAwOEQ3MyB9LCAvKiBHTF9JTlRFTlNJVFkzMlVJX0VYVCAqLworICAgeyAzNTE1NiwgMHgwMDAwOEQ3NCB9LCAvKiBHTF9MVU1JTkFOQ0UzMlVJX0VYVCAqLworICAgeyAzNTE3NywgMHgwMDAwOEQ3NSB9LCAvKiBHTF9MVU1JTkFOQ0VfQUxQSEEzMlVJX0VYVCAqLworICAgeyAzNTIwNCwgMHgwMDAwOEQ3NiB9LCAvKiBHTF9SR0JBMTZVSSAqLworICAgeyAzNTIxNiwgMHgwMDAwOEQ3NyB9LCAvKiBHTF9SR0IxNlVJICovCisgICB7IDM1MjI3LCAweDAwMDA4RDc4IH0sIC8qIEdMX0FMUEhBMTZVSV9FWFQgKi8KKyAgIHsgMzUyNDQsIDB4MDAwMDhENzkgfSwgLyogR0xfSU5URU5TSVRZMTZVSV9FWFQgKi8KKyAgIHsgMzUyNjUsIDB4MDAwMDhEN0EgfSwgLyogR0xfTFVNSU5BTkNFMTZVSV9FWFQgKi8KKyAgIHsgMzUyODYsIDB4MDAwMDhEN0IgfSwgLyogR0xfTFVNSU5BTkNFX0FMUEhBMTZVSV9FWFQgKi8KKyAgIHsgMzUzMTMsIDB4MDAwMDhEN0MgfSwgLyogR0xfUkdCQThVSSAqLworICAgeyAzNTMyNCwgMHgwMDAwOEQ3RCB9LCAvKiBHTF9SR0I4VUkgKi8KKyAgIHsgMzUzMzQsIDB4MDAwMDhEN0UgfSwgLyogR0xfQUxQSEE4VUlfRVhUICovCisgICB7IDM1MzUwLCAweDAwMDA4RDdGIH0sIC8qIEdMX0lOVEVOU0lUWThVSV9FWFQgKi8KKyAgIHsgMzUzNzAsIDB4MDAwMDhEODAgfSwgLyogR0xfTFVNSU5BTkNFOFVJX0VYVCAqLworICAgeyAzNTM5MCwgMHgwMDAwOEQ4MSB9LCAvKiBHTF9MVU1JTkFOQ0VfQUxQSEE4VUlfRVhUICovCisgICB7IDM1NDE2LCAweDAwMDA4RDgyIH0sIC8qIEdMX1JHQkEzMkkgKi8KKyAgIHsgMzU0MjcsIDB4MDAwMDhEODMgfSwgLyogR0xfUkdCMzJJICovCisgICB7IDM1NDM3LCAweDAwMDA4RDg0IH0sIC8qIEdMX0FMUEhBMzJJX0VYVCAqLworICAgeyAzNTQ1MywgMHgwMDAwOEQ4NSB9LCAvKiBHTF9JTlRFTlNJVFkzMklfRVhUICovCisgICB7IDM1NDczLCAweDAwMDA4RDg2IH0sIC8qIEdMX0xVTUlOQU5DRTMySV9FWFQgKi8KKyAgIHsgMzU0OTMsIDB4MDAwMDhEODcgfSwgLyogR0xfTFVNSU5BTkNFX0FMUEhBMzJJX0VYVCAqLworICAgeyAzNTUxOSwgMHgwMDAwOEQ4OCB9LCAvKiBHTF9SR0JBMTZJICovCisgICB7IDM1NTMwLCAweDAwMDA4RDg5IH0sIC8qIEdMX1JHQjE2SSAqLworICAgeyAzNTU0MCwgMHgwMDAwOEQ4QSB9LCAvKiBHTF9BTFBIQTE2SV9FWFQgKi8KKyAgIHsgMzU1NTYsIDB4MDAwMDhEOEIgfSwgLyogR0xfSU5URU5TSVRZMTZJX0VYVCAqLworICAgeyAzNTU3NiwgMHgwMDAwOEQ4QyB9LCAvKiBHTF9MVU1JTkFOQ0UxNklfRVhUICovCisgICB7IDM1NTk2LCAweDAwMDA4RDhEIH0sIC8qIEdMX0xVTUlOQU5DRV9BTFBIQTE2SV9FWFQgKi8KKyAgIHsgMzU2MjIsIDB4MDAwMDhEOEUgfSwgLyogR0xfUkdCQThJICovCisgICB7IDM1NjMyLCAweDAwMDA4RDhGIH0sIC8qIEdMX1JHQjhJICovCisgICB7IDM1NjQxLCAweDAwMDA4RDkwIH0sIC8qIEdMX0FMUEhBOElfRVhUICovCisgICB7IDM1NjU2LCAweDAwMDA4RDkxIH0sIC8qIEdMX0lOVEVOU0lUWThJX0VYVCAqLworICAgeyAzNTY3NSwgMHgwMDAwOEQ5MiB9LCAvKiBHTF9MVU1JTkFOQ0U4SV9FWFQgKi8KKyAgIHsgMzU2OTQsIDB4MDAwMDhEOTMgfSwgLyogR0xfTFVNSU5BTkNFX0FMUEhBOElfRVhUICovCisgICB7IDM1NzE5LCAweDAwMDA4RDk0IH0sIC8qIEdMX1JFRF9JTlRFR0VSICovCisgICB7IDM1NzM0LCAweDAwMDA4RDk1IH0sIC8qIEdMX0dSRUVOX0lOVEVHRVIgKi8KKyAgIHsgMzU3NTEsIDB4MDAwMDhEOTYgfSwgLyogR0xfQkxVRV9JTlRFR0VSICovCisgICB7IDM1NzY3LCAweDAwMDA4RDk3IH0sIC8qIEdMX0FMUEhBX0lOVEVHRVJfRVhUICovCisgICB7IDM1Nzg4LCAweDAwMDA4RDk4IH0sIC8qIEdMX1JHQl9JTlRFR0VSICovCisgICB7IDM1ODAzLCAweDAwMDA4RDk5IH0sIC8qIEdMX1JHQkFfSU5URUdFUiAqLworICAgeyAzNTgxOSwgMHgwMDAwOEQ5QSB9LCAvKiBHTF9CR1JfSU5URUdFUiAqLworICAgeyAzNTgzNCwgMHgwMDAwOEQ5QiB9LCAvKiBHTF9CR1JBX0lOVEVHRVIgKi8KKyAgIHsgMzU4NTAsIDB4MDAwMDhEOUMgfSwgLyogR0xfTFVNSU5BTkNFX0lOVEVHRVJfRVhUICovCisgICB7IDM1ODc1LCAweDAwMDA4RDlEIH0sIC8qIEdMX0xVTUlOQU5DRV9BTFBIQV9JTlRFR0VSX0VYVCAqLworICAgeyAzNTkwNiwgMHgwMDAwOEQ5RSB9LCAvKiBHTF9SR0JBX0lOVEVHRVJfTU9ERV9FWFQgKi8KKyAgIHsgMzU5MzEsIDB4MDAwMDhEOUYgfSwgLyogR0xfSU5UXzJfMTBfMTBfMTBfUkVWICovCisgICB7IDM1OTUzLCAweDAwMDA4REE3IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRCAqLworICAgeyAzNTk4NywgMHgwMDAwOERBOCB9LCAvKiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0xBWUVSX1RBUkdFVFMgKi8KKyAgIHsgMzYwMjcsIDB4MDAwMDhEQTkgfSwgLyogR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9MQVlFUl9DT1VOVF9BUkIgKi8KKyAgIHsgMzYwNjksIDB4MDAwMDhEQUQgfSwgLyogR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWICovCisgICB7IDM2MTAzLCAweDAwMDA4REI5IH0sIC8qIEdMX0ZSQU1FQlVGRkVSX1NSR0IgKi8KKyAgIHsgMzYxMjMsIDB4MDAwMDhEQkEgfSwgLyogR0xfRlJBTUVCVUZGRVJfU1JHQl9DQVBBQkxFX0VYVCAqLworICAgeyAzNjE1NSwgMHgwMDAwOERCQiB9LCAvKiBHTF9DT01QUkVTU0VEX1JFRF9SR1RDMSAqLworICAgeyAzNjE3OSwgMHgwMDAwOERCQyB9LCAvKiBHTF9DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzEgKi8KKyAgIHsgMzYyMTAsIDB4MDAwMDhEQkQgfSwgLyogR0xfQ09NUFJFU1NFRF9SR19SR1RDMiAqLworICAgeyAzNjIzMywgMHgwMDAwOERCRSB9LCAvKiBHTF9DT01QUkVTU0VEX1NJR05FRF9SR19SR1RDMiAqLworICAgeyAzNjI2MywgMHgwMDAwOERDMCB9LCAvKiBHTF9TQU1QTEVSXzFEX0FSUkFZICovCisgICB7IDM2MjgzLCAweDAwMDA4REMxIH0sIC8qIEdMX1NBTVBMRVJfMkRfQVJSQVkgKi8KKyAgIHsgMzYzMDMsIDB4MDAwMDhEQzIgfSwgLyogR0xfU0FNUExFUl9CVUZGRVIgKi8KKyAgIHsgMzYzMjEsIDB4MDAwMDhEQzMgfSwgLyogR0xfU0FNUExFUl8xRF9BUlJBWV9TSEFET1cgKi8KKyAgIHsgMzYzNDgsIDB4MDAwMDhEQzQgfSwgLyogR0xfU0FNUExFUl8yRF9BUlJBWV9TSEFET1cgKi8KKyAgIHsgMzYzNzUsIDB4MDAwMDhEQzUgfSwgLyogR0xfU0FNUExFUl9DVUJFX1NIQURPVyAqLworICAgeyAzNjM5OCwgMHgwMDAwOERDNiB9LCAvKiBHTF9VTlNJR05FRF9JTlRfVkVDMiAqLworICAgeyAzNjQxOSwgMHgwMDAwOERDNyB9LCAvKiBHTF9VTlNJR05FRF9JTlRfVkVDMyAqLworICAgeyAzNjQ0MCwgMHgwMDAwOERDOCB9LCAvKiBHTF9VTlNJR05FRF9JTlRfVkVDNCAqLworICAgeyAzNjQ2MSwgMHgwMDAwOERDOSB9LCAvKiBHTF9JTlRfU0FNUExFUl8xRCAqLworICAgeyAzNjQ3OSwgMHgwMDAwOERDQSB9LCAvKiBHTF9JTlRfU0FNUExFUl8yRCAqLworICAgeyAzNjQ5NywgMHgwMDAwOERDQiB9LCAvKiBHTF9JTlRfU0FNUExFUl8zRCAqLworICAgeyAzNjUxNSwgMHgwMDAwOERDQyB9LCAvKiBHTF9JTlRfU0FNUExFUl9DVUJFICovCisgICB7IDM2NTM1LCAweDAwMDA4RENEIH0sIC8qIEdMX0lOVF9TQU1QTEVSXzJEX1JFQ1QgKi8KKyAgIHsgMzY1NTgsIDB4MDAwMDhEQ0UgfSwgLyogR0xfSU5UX1NBTVBMRVJfMURfQVJSQVkgKi8KKyAgIHsgMzY1ODIsIDB4MDAwMDhEQ0YgfSwgLyogR0xfSU5UX1NBTVBMRVJfMkRfQVJSQVkgKi8KKyAgIHsgMzY2MDYsIDB4MDAwMDhERDAgfSwgLyogR0xfSU5UX1NBTVBMRVJfQlVGRkVSICovCisgICB7IDM2NjI4LCAweDAwMDA4REQxIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzFEICovCisgICB7IDM2NjU1LCAweDAwMDA4REQyIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEICovCisgICB7IDM2NjgyLCAweDAwMDA4REQzIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzNEICovCisgICB7IDM2NzA5LCAweDAwMDA4REQ0IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkUgKi8KKyAgIHsgMzY3MzgsIDB4MDAwMDhERDUgfSwgLyogR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfUkVDVCAqLworICAgeyAzNjc3MCwgMHgwMDAwOERENiB9LCAvKiBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8xRF9BUlJBWSAqLworICAgeyAzNjgwMywgMHgwMDAwOERENyB9LCAvKiBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWSAqLworICAgeyAzNjgzNiwgMHgwMDAwOEREOCB9LCAvKiBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9CVUZGRVIgKi8KKyAgIHsgMzY4NjcsIDB4MDAwMDhERDkgfSwgLyogR0xfR0VPTUVUUllfU0hBREVSICovCisgICB7IDM2ODg2LCAweDAwMDA4RERBIH0sIC8qIEdMX0dFT01FVFJZX1ZFUlRJQ0VTX09VVF9BUkIgKi8KKyAgIHsgMzY5MTUsIDB4MDAwMDhEREIgfSwgLyogR0xfR0VPTUVUUllfSU5QVVRfVFlQRV9BUkIgKi8KKyAgIHsgMzY5NDIsIDB4MDAwMDhEREMgfSwgLyogR0xfR0VPTUVUUllfT1VUUFVUX1RZUEVfQVJCICovCisgICB7IDM2OTcwLCAweDAwMDA4REREIH0sIC8qIEdMX01BWF9HRU9NRVRSWV9WQVJZSU5HX0NPTVBPTkVOVFNfQVJCICovCisgICB7IDM3MDA5LCAweDAwMDA4RERFIH0sIC8qIEdMX01BWF9WRVJURVhfVkFSWUlOR19DT01QT05FTlRTX0FSQiAqLworICAgeyAzNzA0NiwgMHgwMDAwOERERiB9LCAvKiBHTF9NQVhfR0VPTUVUUllfVU5JRk9STV9DT01QT05FTlRTICovCisgICB7IDM3MDgxLCAweDAwMDA4REUwIH0sIC8qIEdMX01BWF9HRU9NRVRSWV9PVVRQVVRfVkVSVElDRVMgKi8KKyAgIHsgMzcxMTMsIDB4MDAwMDhERTEgfSwgLyogR0xfTUFYX0dFT01FVFJZX1RPVEFMX09VVFBVVF9DT01QT05FTlRTICovCisgICB7IDM3MTUzLCAweDAwMDA4REYwIH0sIC8qIEdMX0xPV19GTE9BVCAqLworICAgeyAzNzE2NiwgMHgwMDAwOERGMSB9LCAvKiBHTF9NRURJVU1fRkxPQVQgKi8KKyAgIHsgMzcxODIsIDB4MDAwMDhERjIgfSwgLyogR0xfSElHSF9GTE9BVCAqLworICAgeyAzNzE5NiwgMHgwMDAwOERGMyB9LCAvKiBHTF9MT1dfSU5UICovCisgICB7IDM3MjA3LCAweDAwMDA4REY0IH0sIC8qIEdMX01FRElVTV9JTlQgKi8KKyAgIHsgMzcyMjEsIDB4MDAwMDhERjUgfSwgLyogR0xfSElHSF9JTlQgKi8KKyAgIHsgMzcyMzMsIDB4MDAwMDhERjYgfSwgLyogR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzJfT0VTICovCisgICB7IDM3MjY0LCAweDAwMDA4REY3IH0sIC8qIEdMX0lOVF8xMF8xMF8xMF8yX09FUyAqLworICAgeyAzNzI4NiwgMHgwMDAwOERGOCB9LCAvKiBHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFMgKi8KKyAgIHsgMzczMTEsIDB4MDAwMDhERjkgfSwgLyogR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUyAqLworICAgeyAzNzM0MCwgMHgwMDAwOERGQSB9LCAvKiBHTF9TSEFERVJfQ09NUElMRVIgKi8KKyAgIHsgMzczNTksIDB4MDAwMDhERkIgfSwgLyogR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgKi8KKyAgIHsgMzczODksIDB4MDAwMDhERkMgfSwgLyogR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyAqLworICAgeyAzNzQxMiwgMHgwMDAwOERGRCB9LCAvKiBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTICovCisgICB7IDM3NDQ0LCAweDAwMDA4RTEzIH0sIC8qIEdMX1FVRVJZX1dBSVQgKi8KKyAgIHsgMzc0NTgsIDB4MDAwMDhFMTQgfSwgLyogR0xfUVVFUllfTk9fV0FJVCAqLworICAgeyAzNzQ3NSwgMHgwMDAwOEUxNSB9LCAvKiBHTF9RVUVSWV9CWV9SRUdJT05fV0FJVCAqLworICAgeyAzNzQ5OSwgMHgwMDAwOEUxNiB9LCAvKiBHTF9RVUVSWV9CWV9SRUdJT05fTk9fV0FJVCAqLworICAgeyAzNzUyNiwgMHgwMDAwOEUyMiB9LCAvKiBHTF9UUkFOU0ZPUk1fRkVFREJBQ0sgKi8KKyAgIHsgMzc1NDgsIDB4MDAwMDhFMjMgfSwgLyogR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9QQVVTRUQgKi8KKyAgIHsgMzc1ODQsIDB4MDAwMDhFMjQgfSwgLyogR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9BQ1RJVkUgKi8KKyAgIHsgMzc2MjAsIDB4MDAwMDhFMjUgfSwgLyogR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkcgKi8KKyAgIHsgMzc2NTAsIDB4MDAwMDhFMjggfSwgLyogR0xfVElNRVNUQU1QICovCisgICB7IDM3NjYzLCAweDAwMDA4RTQyIH0sIC8qIEdMX1RFWFRVUkVfU1dJWlpMRV9SICovCisgICB7IDM3Njg0LCAweDAwMDA4RTQzIH0sIC8qIEdMX1RFWFRVUkVfU1dJWlpMRV9HICovCisgICB7IDM3NzA1LCAweDAwMDA4RTQ0IH0sIC8qIEdMX1RFWFRVUkVfU1dJWlpMRV9CICovCisgICB7IDM3NzI2LCAweDAwMDA4RTQ1IH0sIC8qIEdMX1RFWFRVUkVfU1dJWlpMRV9BICovCisgICB7IDM3NzQ3LCAweDAwMDA4RTQ2IH0sIC8qIEdMX1RFWFRVUkVfU1dJWlpMRV9SR0JBICovCisgICB7IDM3NzcxLCAweDAwMDA4RTRDIH0sIC8qIEdMX1FVQURTX0ZPTExPV19QUk9WT0tJTkdfVkVSVEVYX0NPTlZFTlRJT04gKi8KKyAgIHsgMzc4MTUsIDB4MDAwMDhFNEQgfSwgLyogR0xfRklSU1RfVkVSVEVYX0NPTlZFTlRJT04gKi8KKyAgIHsgMzc4NDIsIDB4MDAwMDhFNEUgfSwgLyogR0xfTEFTVF9WRVJURVhfQ09OVkVOVElPTiAqLworICAgeyAzNzg2OCwgMHgwMDAwOEU0RiB9LCAvKiBHTF9QUk9WT0tJTkdfVkVSVEVYICovCisgICB7IDM3ODg4LCAweDAwMDA4RTUwIH0sIC8qIEdMX1NBTVBMRV9QT1NJVElPTiAqLworICAgeyAzNzkwNywgMHgwMDAwOEU1MSB9LCAvKiBHTF9TQU1QTEVfTUFTSyAqLworICAgeyAzNzkyMiwgMHgwMDAwOEU1MiB9LCAvKiBHTF9TQU1QTEVfTUFTS19WQUxVRSAqLworICAgeyAzNzk0MywgMHgwMDAwOEU1OSB9LCAvKiBHTF9NQVhfU0FNUExFX01BU0tfV09SRFMgKi8KKyAgIHsgMzc5NjgsIDB4MDAwMDhFNUEgfSwgLyogR0xfTUFYX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OUyAqLworICAgeyAzODAwMywgMHgwMDAwOEU1QiB9LCAvKiBHTF9NSU5fRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVQgKi8KKyAgIHsgMzgwNDAsIDB4MDAwMDhFNUMgfSwgLyogR0xfTUFYX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUICovCisgICB7IDM4MDc3LCAweDAwMDA4RTVEIH0sIC8qIEdMX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUX0JJVFMgKi8KKyAgIHsgMzgxMTUsIDB4MDAwMDhFNUUgfSwgLyogR0xfTUlOX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUICovCisgICB7IDM4MTUyLCAweDAwMDA4RTVGIH0sIC8qIEdMX01BWF9QUk9HUkFNX1RFWFRVUkVfR0FUSEVSX09GRlNFVCAqLworICAgeyAzODE4OSwgMHgwMDAwOEU3MCB9LCAvKiBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUlMgKi8KKyAgIHsgMzgyMjMsIDB4MDAwMDhFNzEgfSwgLyogR0xfTUFYX1ZFUlRFWF9TVFJFQU1TICovCisgICB7IDM4MjQ1LCAweDAwMDA4RjM2IH0sIC8qIEdMX0NPUFlfUkVBRF9CVUZGRVIgKi8KKyAgIHsgMzgyNjUsIDB4MDAwMDhGMzcgfSwgLyogR0xfQ09QWV9XUklURV9CVUZGRVIgKi8KKyAgIHsgMzgyODYsIDB4MDAwMDhGMzggfSwgLyogR0xfTUFYX0lNQUdFX1VOSVRTICovCisgICB7IDM4MzA1LCAweDAwMDA4RjM5IH0sIC8qIEdMX01BWF9DT01CSU5FRF9JTUFHRV9VTklUU19BTkRfRlJBR01FTlRfT1VUUFVUUyAqLworICAgeyAzODM1NCwgMHgwMDAwOEYzQSB9LCAvKiBHTF9JTUFHRV9CSU5ESU5HX05BTUUgKi8KKyAgIHsgMzgzNzYsIDB4MDAwMDhGM0IgfSwgLyogR0xfSU1BR0VfQklORElOR19MRVZFTCAqLworICAgeyAzODM5OSwgMHgwMDAwOEYzQyB9LCAvKiBHTF9JTUFHRV9CSU5ESU5HX0xBWUVSRUQgKi8KKyAgIHsgMzg0MjQsIDB4MDAwMDhGM0QgfSwgLyogR0xfSU1BR0VfQklORElOR19MQVlFUiAqLworICAgeyAzODQ0NywgMHgwMDAwOEYzRSB9LCAvKiBHTF9JTUFHRV9CSU5ESU5HX0FDQ0VTUyAqLworICAgeyAzODQ3MSwgMHgwMDAwOEYzRiB9LCAvKiBHTF9EUkFXX0lORElSRUNUX0JVRkZFUiAqLworICAgeyAzODQ5NSwgMHgwMDAwOEY0MyB9LCAvKiBHTF9EUkFXX0lORElSRUNUX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDM4NTI3LCAweDAwMDA4RjkwIH0sIC8qIEdMX1JFRF9TTk9STSAqLworICAgeyAzODU0MCwgMHgwMDAwOEY5MSB9LCAvKiBHTF9SR19TTk9STSAqLworICAgeyAzODU1MiwgMHgwMDAwOEY5MiB9LCAvKiBHTF9SR0JfU05PUk0gKi8KKyAgIHsgMzg1NjUsIDB4MDAwMDhGOTMgfSwgLyogR0xfUkdCQV9TTk9STSAqLworICAgeyAzODU3OSwgMHgwMDAwOEY5NCB9LCAvKiBHTF9SOF9TTk9STSAqLworICAgeyAzODU5MSwgMHgwMDAwOEY5NSB9LCAvKiBHTF9SRzhfU05PUk0gKi8KKyAgIHsgMzg2MDQsIDB4MDAwMDhGOTYgfSwgLyogR0xfUkdCOF9TTk9STSAqLworICAgeyAzODYxOCwgMHgwMDAwOEY5NyB9LCAvKiBHTF9SR0JBOF9TTk9STSAqLworICAgeyAzODYzMywgMHgwMDAwOEY5OCB9LCAvKiBHTF9SMTZfU05PUk0gKi8KKyAgIHsgMzg2NDYsIDB4MDAwMDhGOTkgfSwgLyogR0xfUkcxNl9TTk9STSAqLworICAgeyAzODY2MCwgMHgwMDAwOEY5QSB9LCAvKiBHTF9SR0IxNl9TTk9STSAqLworICAgeyAzODY3NSwgMHgwMDAwOEY5QiB9LCAvKiBHTF9SR0JBMTZfU05PUk0gKi8KKyAgIHsgMzg2OTEsIDB4MDAwMDhGOUMgfSwgLyogR0xfU0lHTkVEX05PUk1BTElaRUQgKi8KKyAgIHsgMzg3MTIsIDB4MDAwMDhGOUQgfSwgLyogR0xfUFJJTUlUSVZFX1JFU1RBUlQgKi8KKyAgIHsgMzg3MzMsIDB4MDAwMDhGOUUgfSwgLyogR0xfUFJJTUlUSVZFX1JFU1RBUlRfSU5ERVggKi8KKyAgIHsgMzg3NjAsIDB4MDAwMDhGOUYgfSwgLyogR0xfTUFYX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfQ09NUE9ORU5UU19BUkIgKi8KKyAgIHsgMzg4MDUsIDB4MDAwMDkwMDkgfSwgLyogR0xfVEVYVFVSRV9DVUJFX01BUF9BUlJBWV9BUkIgKi8KKyAgIHsgMzg4MzUsIDB4MDAwMDkwMEEgfSwgLyogR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0FSUkFZX0FSQiAqLworICAgeyAzODg3MywgMHgwMDAwOTAwQiB9LCAvKiBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0FSUkFZX0FSQiAqLworICAgeyAzODkwOSwgMHgwMDAwOTAwQyB9LCAvKiBHTF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX0FSQiAqLworICAgeyAzODkzOSwgMHgwMDAwOTAwRCB9LCAvKiBHTF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX1NIQURPV19BUkIgKi8KKyAgIHsgMzg5NzYsIDB4MDAwMDkwMEUgfSwgLyogR0xfSU5UX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfQVJCICovCisgICB7IDM5MDEwLCAweDAwMDA5MDBGIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX0FSQiAqLworICAgeyAzOTA1MywgMHgwMDAwOTA0QyB9LCAvKiBHTF9JTUFHRV8xRCAqLworICAgeyAzOTA2NSwgMHgwMDAwOTA0RCB9LCAvKiBHTF9JTUFHRV8yRCAqLworICAgeyAzOTA3NywgMHgwMDAwOTA0RSB9LCAvKiBHTF9JTUFHRV8zRCAqLworICAgeyAzOTA4OSwgMHgwMDAwOTA0RiB9LCAvKiBHTF9JTUFHRV8yRF9SRUNUICovCisgICB7IDM5MTA2LCAweDAwMDA5MDUwIH0sIC8qIEdMX0lNQUdFX0NVQkUgKi8KKyAgIHsgMzkxMjAsIDB4MDAwMDkwNTEgfSwgLyogR0xfSU1BR0VfQlVGRkVSICovCisgICB7IDM5MTM2LCAweDAwMDA5MDUyIH0sIC8qIEdMX0lNQUdFXzFEX0FSUkFZICovCisgICB7IDM5MTU0LCAweDAwMDA5MDUzIH0sIC8qIEdMX0lNQUdFXzJEX0FSUkFZICovCisgICB7IDM5MTcyLCAweDAwMDA5MDU0IH0sIC8qIEdMX0lNQUdFX0NVQkVfTUFQX0FSUkFZICovCisgICB7IDM5MTk2LCAweDAwMDA5MDU1IH0sIC8qIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFICovCisgICB7IDM5MjIwLCAweDAwMDA5MDU2IH0sIC8qIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisgICB7IDM5MjUwLCAweDAwMDA5MDU3IH0sIC8qIEdMX0lOVF9JTUFHRV8xRCAqLworICAgeyAzOTI2NiwgMHgwMDAwOTA1OCB9LCAvKiBHTF9JTlRfSU1BR0VfMkQgKi8KKyAgIHsgMzkyODIsIDB4MDAwMDkwNTkgfSwgLyogR0xfSU5UX0lNQUdFXzNEICovCisgICB7IDM5Mjk4LCAweDAwMDA5MDVBIH0sIC8qIEdMX0lOVF9JTUFHRV8yRF9SRUNUICovCisgICB7IDM5MzE5LCAweDAwMDA5MDVCIH0sIC8qIEdMX0lOVF9JTUFHRV9DVUJFICovCisgICB7IDM5MzM3LCAweDAwMDA5MDVDIH0sIC8qIEdMX0lOVF9JTUFHRV9CVUZGRVIgKi8KKyAgIHsgMzkzNTcsIDB4MDAwMDkwNUQgfSwgLyogR0xfSU5UX0lNQUdFXzFEX0FSUkFZICovCisgICB7IDM5Mzc5LCAweDAwMDA5MDVFIH0sIC8qIEdMX0lOVF9JTUFHRV8yRF9BUlJBWSAqLworICAgeyAzOTQwMSwgMHgwMDAwOTA1RiB9LCAvKiBHTF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVkgKi8KKyAgIHsgMzk0MjksIDB4MDAwMDkwNjAgfSwgLyogR0xfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFICovCisgICB7IDM5NDU3LCAweDAwMDA5MDYxIH0sIC8qIEdMX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRV9BUlJBWSAqLworICAgeyAzOTQ5MSwgMHgwMDAwOTA2MiB9LCAvKiBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMUQgKi8KKyAgIHsgMzk1MTYsIDB4MDAwMDkwNjMgfSwgLyogR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEICovCisgICB7IDM5NTQxLCAweDAwMDA5MDY0IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8zRCAqLworICAgeyAzOTU2NiwgMHgwMDAwOTA2NSB9LCAvKiBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfUkVDVCAqLworICAgeyAzOTU5NiwgMHgwMDAwOTA2NiB9LCAvKiBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRSAqLworICAgeyAzOTYyMywgMHgwMDAwOTA2NyB9LCAvKiBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQlVGRkVSICovCisgICB7IDM5NjUyLCAweDAwMDA5MDY4IH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRF9BUlJBWSAqLworICAgeyAzOTY4MywgMHgwMDAwOTA2OSB9LCAvKiBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfQVJSQVkgKi8KKyAgIHsgMzk3MTQsIDB4MDAwMDkwNkEgfSwgLyogR0xfVU5TSUdORURfSU5UX0lNQUdFX0NVQkVfTUFQX0FSUkFZICovCisgICB7IDM5NzUxLCAweDAwMDA5MDZCIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRSAqLworICAgeyAzOTc4OCwgMHgwMDAwOTA2QyB9LCAvKiBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKyAgIHsgMzk4MzEsIDB4MDAwMDkwNkQgfSwgLyogR0xfTUFYX0lNQUdFX1NBTVBMRVMgKi8KKyAgIHsgMzk4NTIsIDB4MDAwMDkwNkUgfSwgLyogR0xfSU1BR0VfQklORElOR19GT1JNQVQgKi8KKyAgIHsgMzk4NzYsIDB4MDAwMDkwNkYgfSwgLyogR0xfUkdCMTBfQTJVSSAqLworICAgeyAzOTg5MCwgMHgwMDAwOTBCQyB9LCAvKiBHTF9NSU5fTUFQX0JVRkZFUl9BTElHTk1FTlQgKi8KKyAgIHsgMzk5MTgsIDB4MDAwMDkwQzcgfSwgLyogR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfVFlQRSAqLworICAgeyAzOTk1MywgMHgwMDAwOTBDOCB9LCAvKiBHTF9JTUFHRV9GT1JNQVRfQ09NUEFUSUJJTElUWV9CWV9TSVpFICovCisgICB7IDM5OTkxLCAweDAwMDA5MEM5IH0sIC8qIEdMX0lNQUdFX0ZPUk1BVF9DT01QQVRJQklMSVRZX0JZX0NMQVNTICovCisgICB7IDQwMDMwLCAweDAwMDA5MENBIH0sIC8qIEdMX01BWF9WRVJURVhfSU1BR0VfVU5JRk9STVMgKi8KKyAgIHsgNDAwNTksIDB4MDAwMDkwQ0IgfSwgLyogR0xfTUFYX1RFU1NfQ09OVFJPTF9JTUFHRV9VTklGT1JNUyAqLworICAgeyA0MDA5NCwgMHgwMDAwOTBDQyB9LCAvKiBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX0lNQUdFX1VOSUZPUk1TICovCisgICB7IDQwMTMyLCAweDAwMDA5MENEIH0sIC8qIEdMX01BWF9HRU9NRVRSWV9JTUFHRV9VTklGT1JNUyAqLworICAgeyA0MDE2MywgMHgwMDAwOTBDRSB9LCAvKiBHTF9NQVhfRlJBR01FTlRfSU1BR0VfVU5JRk9STVMgKi8KKyAgIHsgNDAxOTQsIDB4MDAwMDkwQ0YgfSwgLyogR0xfTUFYX0NPTUJJTkVEX0lNQUdFX1VOSUZPUk1TICovCisgICB7IDQwMjI1LCAweDAwMDA5MEVBIH0sIC8qIEdMX0RFUFRIX1NURU5DSUxfVEVYVFVSRV9NT0RFICovCisgICB7IDQwMjU1LCAweDAwMDA5MEVCIH0sIC8qIEdMX01BWF9DT01QVVRFX1dPUktfR1JPVVBfSU5WT0NBVElPTlMgKi8KKyAgIHsgNDAyOTMsIDB4MDAwMDkwRUMgfSwgLyogR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0NPTVBVVEVfU0hBREVSICovCisgICB7IDQwMzM5LCAweDAwMDA5MEVEIH0sIC8qIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX0NPTVBVVEVfU0hBREVSICovCisgICB7IDQwMzkzLCAweDAwMDA5MEVFIH0sIC8qIEdMX0RJU1BBVENIX0lORElSRUNUX0JVRkZFUiAqLworICAgeyA0MDQyMSwgMHgwMDAwOTBFRiB9LCAvKiBHTF9ESVNQQVRDSF9JTkRJUkVDVF9CVUZGRVJfQklORElORyAqLworICAgeyA0MDQ1NywgMHgwMDAwOTEwMCB9LCAvKiBHTF9URVhUVVJFXzJEX01VTFRJU0FNUExFICovCisgICB7IDQwNDgzLCAweDAwMDA5MTAxIH0sIC8qIEdMX1BST1hZX1RFWFRVUkVfMkRfTVVMVElTQU1QTEUgKi8KKyAgIHsgNDA1MTUsIDB4MDAwMDkxMDIgfSwgLyogR0xfVEVYVFVSRV8yRF9NVUxUSVNBTVBMRV9BUlJBWSAqLworICAgeyA0MDU0NywgMHgwMDAwOTEwMyB9LCAvKiBHTF9QUk9YWV9URVhUVVJFXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisgICB7IDQwNTg1LCAweDAwMDA5MTA0IH0sIC8qIEdMX1RFWFRVUkVfQklORElOR18yRF9NVUxUSVNBTVBMRSAqLworICAgeyA0MDYxOSwgMHgwMDAwOTEwNSB9LCAvKiBHTF9URVhUVVJFX0JJTkRJTkdfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKyAgIHsgNDA2NTksIDB4MDAwMDkxMDYgfSwgLyogR0xfVEVYVFVSRV9TQU1QTEVTICovCisgICB7IDQwNjc4LCAweDAwMDA5MTA3IH0sIC8qIEdMX1RFWFRVUkVfRklYRURfU0FNUExFX0xPQ0FUSU9OUyAqLworICAgeyA0MDcxMiwgMHgwMDAwOTEwOCB9LCAvKiBHTF9TQU1QTEVSXzJEX01VTFRJU0FNUExFICovCisgICB7IDQwNzM4LCAweDAwMDA5MTA5IH0sIC8qIEdMX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFICovCisgICB7IDQwNzY4LCAweDAwMDA5MTBBIH0sIC8qIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFICovCisgICB7IDQwODA3LCAweDAwMDA5MTBCIH0sIC8qIEdMX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKyAgIHsgNDA4MzksIDB4MDAwMDkxMEMgfSwgLyogR0xfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKyAgIHsgNDA4NzUsIDB4MDAwMDkxMEQgfSwgLyogR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKyAgIHsgNDA5MjAsIDB4MDAwMDkxMEUgfSwgLyogR0xfTUFYX0NPTE9SX1RFWFRVUkVfU0FNUExFUyAqLworICAgeyA0MDk0OSwgMHgwMDAwOTEwRiB9LCAvKiBHTF9NQVhfREVQVEhfVEVYVFVSRV9TQU1QTEVTICovCisgICB7IDQwOTc4LCAweDAwMDA5MTEwIH0sIC8qIEdMX01BWF9JTlRFR0VSX1NBTVBMRVMgKi8KKyAgIHsgNDEwMDEsIDB4MDAwMDkxMTEgfSwgLyogR0xfTUFYX1NFUlZFUl9XQUlUX1RJTUVPVVQgKi8KKyAgIHsgNDEwMjgsIDB4MDAwMDkxMTIgfSwgLyogR0xfT0JKRUNUX1RZUEUgKi8KKyAgIHsgNDEwNDMsIDB4MDAwMDkxMTMgfSwgLyogR0xfU1lOQ19DT05ESVRJT04gKi8KKyAgIHsgNDEwNjEsIDB4MDAwMDkxMTQgfSwgLyogR0xfU1lOQ19TVEFUVVMgKi8KKyAgIHsgNDEwNzYsIDB4MDAwMDkxMTUgfSwgLyogR0xfU1lOQ19GTEFHUyAqLworICAgeyA0MTA5MCwgMHgwMDAwOTExNiB9LCAvKiBHTF9TWU5DX0ZFTkNFICovCisgICB7IDQxMTA0LCAweDAwMDA5MTE3IH0sIC8qIEdMX1NZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFICovCisgICB7IDQxMTM0LCAweDAwMDA5MTE4IH0sIC8qIEdMX1VOU0lHTkFMRUQgKi8KKyAgIHsgNDExNDgsIDB4MDAwMDkxMTkgfSwgLyogR0xfU0lHTkFMRUQgKi8KKyAgIHsgNDExNjAsIDB4MDAwMDkxMUEgfSwgLyogR0xfQUxSRUFEWV9TSUdOQUxFRCAqLworICAgeyA0MTE4MCwgMHgwMDAwOTExQiB9LCAvKiBHTF9USU1FT1VUX0VYUElSRUQgKi8KKyAgIHsgNDExOTksIDB4MDAwMDkxMUMgfSwgLyogR0xfQ09ORElUSU9OX1NBVElTRklFRCAqLworICAgeyA0MTIyMiwgMHgwMDAwOTExRCB9LCAvKiBHTF9XQUlUX0ZBSUxFRCAqLworICAgeyA0MTIzNywgMHgwMDAwOTExRiB9LCAvKiBHTF9CVUZGRVJfQUNDRVNTX0ZMQUdTICovCisgICB7IDQxMjYwLCAweDAwMDA5MTIwIH0sIC8qIEdMX0JVRkZFUl9NQVBfTEVOR1RIICovCisgICB7IDQxMjgxLCAweDAwMDA5MTIxIH0sIC8qIEdMX0JVRkZFUl9NQVBfT0ZGU0VUICovCisgICB7IDQxMzAyLCAweDAwMDA5MTIyIH0sIC8qIEdMX01BWF9WRVJURVhfT1VUUFVUX0NPTVBPTkVOVFMgKi8KKyAgIHsgNDEzMzQsIDB4MDAwMDkxMjMgfSwgLyogR0xfTUFYX0dFT01FVFJZX0lOUFVUX0NPTVBPTkVOVFMgKi8KKyAgIHsgNDEzNjcsIDB4MDAwMDkxMjQgfSwgLyogR0xfTUFYX0dFT01FVFJZX09VVFBVVF9DT01QT05FTlRTICovCisgICB7IDQxNDAxLCAweDAwMDA5MTI1IH0sIC8qIEdMX01BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTICovCisgICB7IDQxNDM0LCAweDAwMDA5MTI2IH0sIC8qIEdMX0NPTlRFWFRfUFJPRklMRV9NQVNLICovCisgICB7IDQxNDU4LCAweDAwMDA5MTJGIH0sIC8qIEdMX1RFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVCAqLworICAgeyA0MTQ4NiwgMHgwMDAwOTE0MyB9LCAvKiBHTF9NQVhfREVCVUdfTUVTU0FHRV9MRU5HVEhfQVJCICovCisgICB7IDQxNTE4LCAweDAwMDA5MTQ0IH0sIC8qIEdMX01BWF9ERUJVR19MT0dHRURfTUVTU0FHRVNfQVJCICovCisgICB7IDQxNTUxLCAweDAwMDA5MTQ1IH0sIC8qIEdMX0RFQlVHX0xPR0dFRF9NRVNTQUdFU19BUkIgKi8KKyAgIHsgNDE1ODAsIDB4MDAwMDkxNDYgfSwgLyogR0xfREVCVUdfU0VWRVJJVFlfSElHSF9BUkIgKi8KKyAgIHsgNDE2MDcsIDB4MDAwMDkxNDcgfSwgLyogR0xfREVCVUdfU0VWRVJJVFlfTUVESVVNX0FSQiAqLworICAgeyA0MTYzNiwgMHgwMDAwOTE0OCB9LCAvKiBHTF9ERUJVR19TRVZFUklUWV9MT1dfQVJCICovCisgICB7IDQxNjYyLCAweDAwMDA5MTlEIH0sIC8qIEdMX1RFWFRVUkVfQlVGRkVSX09GRlNFVCAqLworICAgeyA0MTY4NywgMHgwMDAwOTE5RSB9LCAvKiBHTF9URVhUVVJFX0JVRkZFUl9TSVpFICovCisgICB7IDQxNzEwLCAweDAwMDA5MTlGIH0sIC8qIEdMX1RFWFRVUkVfQlVGRkVSX09GRlNFVF9BTElHTk1FTlQgKi8KKyAgIHsgNDE3NDUsIDB4MDAwMDkxQjkgfSwgLyogR0xfQ09NUFVURV9TSEFERVIgKi8KKyAgIHsgNDE3NjMsIDB4MDAwMDkxQkIgfSwgLyogR0xfTUFYX0NPTVBVVEVfVU5JRk9STV9CTE9DS1MgKi8KKyAgIHsgNDE3OTMsIDB4MDAwMDkxQkMgfSwgLyogR0xfTUFYX0NPTVBVVEVfVEVYVFVSRV9JTUFHRV9VTklUUyAqLworICAgeyA0MTgyOCwgMHgwMDAwOTFCRCB9LCAvKiBHTF9NQVhfQ09NUFVURV9JTUFHRV9VTklGT1JNUyAqLworICAgeyA0MTg1OCwgMHgwMDAwOTFCRSB9LCAvKiBHTF9NQVhfQ09NUFVURV9XT1JLX0dST1VQX0NPVU5UICovCisgICB7IDQxODkwLCAweDAwMDA5MUJGIH0sIC8qIEdMX01BWF9DT01QVVRFX1dPUktfR1JPVVBfU0laRSAqLworICAgeyA0MTkyMSwgMHgwMDAwOTI3MCB9LCAvKiBHTF9DT01QUkVTU0VEX1IxMV9FQUMgKi8KKyAgIHsgNDE5NDMsIDB4MDAwMDkyNzEgfSwgLyogR0xfQ09NUFJFU1NFRF9TSUdORURfUjExX0VBQyAqLworICAgeyA0MTk3MiwgMHgwMDAwOTI3MiB9LCAvKiBHTF9DT01QUkVTU0VEX1JHMTFfRUFDICovCisgICB7IDQxOTk1LCAweDAwMDA5MjczIH0sIC8qIEdMX0NPTVBSRVNTRURfU0lHTkVEX1JHMTFfRUFDICovCisgICB7IDQyMDI1LCAweDAwMDA5Mjc0IH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCOF9FVEMyICovCisgICB7IDQyMDQ5LCAweDAwMDA5Mjc1IH0sIC8qIEdMX0NPTVBSRVNTRURfU1JHQjhfRVRDMiAqLworICAgeyA0MjA3NCwgMHgwMDAwOTI3NiB9LCAvKiBHTF9DT01QUkVTU0VEX1JHQjhfUFVOQ0hUSFJPVUdIX0FMUEhBMV9FVEMyICovCisgICB7IDQyMTE4LCAweDAwMDA5Mjc3IH0sIC8qIEdMX0NPTVBSRVNTRURfU1JHQjhfUFVOQ0hUSFJPVUdIX0FMUEhBMV9FVEMyICovCisgICB7IDQyMTYzLCAweDAwMDA5Mjc4IH0sIC8qIEdMX0NPTVBSRVNTRURfUkdCQThfRVRDMl9FQUMgKi8KKyAgIHsgNDIxOTIsIDB4MDAwMDkyNzkgfSwgLyogR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUMgKi8KKyAgIHsgNDIyMjgsIDB4MDAwMDkyQzAgfSwgLyogR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSICovCisgICB7IDQyMjUzLCAweDAwMDA5MkMxIH0sIC8qIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9CSU5ESU5HICovCisgICB7IDQyMjg2LCAweDAwMDA5MkMyIH0sIC8qIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TVEFSVCAqLworICAgeyA0MjMxNywgMHgwMDAwOTJDMyB9LCAvKiBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU0laRSAqLworICAgeyA0MjM0NywgMHgwMDAwOTJDNCB9LCAvKiBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfREFUQV9TSVpFICovCisgICB7IDQyMzgyLCAweDAwMDA5MkM1IH0sIC8qIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9BQ1RJVkVfQVRPTUlDX0NPVU5URVJTICovCisgICB7IDQyNDMwLCAweDAwMDA5MkM2IH0sIC8qIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9BQ1RJVkVfQVRPTUlDX0NPVU5URVJfSU5ESUNFUyAqLworICAgeyA0MjQ4NSwgMHgwMDAwOTJDNyB9LCAvKiBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9WRVJURVhfU0hBREVSICovCisgICB7IDQyNTM4LCAweDAwMDA5MkM4IH0sIC8qIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX1RFU1NfQ09OVFJPTF9TSEFERVIgKi8KKyAgIHsgNDI1OTcsIDB4MDAwMDkyQzkgfSwgLyogR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfVEVTU19FVkFMVUFUSU9OX1NIQURFUiAqLworICAgeyA0MjY1OSwgMHgwMDAwOTJDQSB9LCAvKiBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9HRU9NRVRSWV9TSEFERVIgKi8KKyAgIHsgNDI3MTQsIDB4MDAwMDkyQ0IgfSwgLyogR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSICovCisgICB7IDQyNzY5LCAweDAwMDA5MkNDIH0sIC8qIEdMX01BWF9WRVJURVhfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAqLworICAgeyA0MjgwNiwgMHgwMDAwOTJDRCB9LCAvKiBHTF9NQVhfVEVTU19DT05UUk9MX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgKi8KKyAgIHsgNDI4NDksIDB4MDAwMDkyQ0UgfSwgLyogR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisgICB7IDQyODk1LCAweDAwMDA5MkNGIH0sIC8qIEdMX01BWF9HRU9NRVRSWV9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisgICB7IDQyOTM0LCAweDAwMDA5MkQwIH0sIC8qIEdMX01BWF9GUkFHTUVOVF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisgICB7IDQyOTczLCAweDAwMDA5MkQxIH0sIC8qIEdMX01BWF9DT01CSU5FRF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisgICB7IDQzMDEyLCAweDAwMDA5MkQyIH0sIC8qIEdMX01BWF9WRVJURVhfQVRPTUlDX0NPVU5URVJTICovCisgICB7IDQzMDQyLCAweDAwMDA5MkQzIH0sIC8qIEdMX01BWF9URVNTX0NPTlRST0xfQVRPTUlDX0NPVU5URVJTICovCisgICB7IDQzMDc4LCAweDAwMDA5MkQ0IH0sIC8qIEdMX01BWF9URVNTX0VWQUxVQVRJT05fQVRPTUlDX0NPVU5URVJTICovCisgICB7IDQzMTE3LCAweDAwMDA5MkQ1IH0sIC8qIEdMX01BWF9HRU9NRVRSWV9BVE9NSUNfQ09VTlRFUlMgKi8KKyAgIHsgNDMxNDksIDB4MDAwMDkyRDYgfSwgLyogR0xfTUFYX0ZSQUdNRU5UX0FUT01JQ19DT1VOVEVSUyAqLworICAgeyA0MzE4MSwgMHgwMDAwOTJENyB9LCAvKiBHTF9NQVhfQ09NQklORURfQVRPTUlDX0NPVU5URVJTICovCisgICB7IDQzMjEzLCAweDAwMDA5MkQ4IH0sIC8qIEdMX01BWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU0laRSAqLworICAgeyA0MzI0NywgMHgwMDAwOTJEOSB9LCAvKiBHTF9BQ1RJVkVfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAqLworICAgeyA0MzI4MCwgMHgwMDAwOTJEQSB9LCAvKiBHTF9VTklGT1JNX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9JTkRFWCAqLworICAgeyA0MzMxOSwgMHgwMDAwOTJEQiB9LCAvKiBHTF9VTlNJR05FRF9JTlRfQVRPTUlDX0NPVU5URVIgKi8KKyAgIHsgNDMzNTAsIDB4MDAwMDkyREMgfSwgLyogR0xfTUFYX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9CSU5ESU5HUyAqLworICAgeyA0MzM4OCwgMHgwMDAwOTJFMCB9LCAvKiBHTF9ERUJVR19PVVRQVVQgKi8KKyAgIHsgNDM0MDQsIDB4MDAwMDkzODAgfSwgLyogR0xfTlVNX1NBTVBMRV9DT1VOVFMgKi8KKyAgIHsgNDM0MjUsIDB4MDAwMDk0RjAgfSwgLyogR0xfUEVSRlFVRVJZX0NPVU5URVJfRVZFTlRfSU5URUwgKi8KKyAgIHsgNDM0NTgsIDB4MDAwMDk0RjEgfSwgLyogR0xfUEVSRlFVRVJZX0NPVU5URVJfRFVSQVRJT05fTk9STV9JTlRFTCAqLworICAgeyA0MzQ5OSwgMHgwMDAwOTRGMiB9LCAvKiBHTF9QRVJGUVVFUllfQ09VTlRFUl9EVVJBVElPTl9SQVdfSU5URUwgKi8KKyAgIHsgNDM1MzksIDB4MDAwMDk0RjMgfSwgLyogR0xfUEVSRlFVRVJZX0NPVU5URVJfVEhST1VHSFBVVF9JTlRFTCAqLworICAgeyA0MzU3NywgMHgwMDAwOTRGNCB9LCAvKiBHTF9QRVJGUVVFUllfQ09VTlRFUl9SQVdfSU5URUwgKi8KKyAgIHsgNDM2MDgsIDB4MDAwMDk0RjUgfSwgLyogR0xfUEVSRlFVRVJZX0NPVU5URVJfVElNRVNUQU1QX0lOVEVMICovCisgICB7IDQzNjQ1LCAweDAwMDA5NEY4IH0sIC8qIEdMX1BFUkZRVUVSWV9DT1VOVEVSX0RBVEFfVUlOVDMyX0lOVEVMICovCisgICB7IDQzNjg0LCAweDAwMDA5NEY5IH0sIC8qIEdMX1BFUkZRVUVSWV9DT1VOVEVSX0RBVEFfVUlOVDY0X0lOVEVMICovCisgICB7IDQzNzIzLCAweDAwMDA5NEZBIH0sIC8qIEdMX1BFUkZRVUVSWV9DT1VOVEVSX0RBVEFfRkxPQVRfSU5URUwgKi8KKyAgIHsgNDM3NjEsIDB4MDAwMDk0RkIgfSwgLyogR0xfUEVSRlFVRVJZX0NPVU5URVJfREFUQV9ET1VCTEVfSU5URUwgKi8KKyAgIHsgNDM4MDAsIDB4MDAwMDk0RkMgfSwgLyogR0xfUEVSRlFVRVJZX0NPVU5URVJfREFUQV9CT09MMzJfSU5URUwgKi8KKyAgIHsgNDM4MzksIDB4MDAwMDk0RkQgfSwgLyogR0xfUEVSRlFVRVJZX1FVRVJZX05BTUVfTEVOR1RIX01BWF9JTlRFTCAqLworICAgeyA0Mzg4MCwgMHgwMDAwOTRGRSB9LCAvKiBHTF9QRVJGUVVFUllfQ09VTlRFUl9OQU1FX0xFTkdUSF9NQVhfSU5URUwgKi8KKyAgIHsgNDM5MjMsIDB4MDAwMDk0RkYgfSwgLyogR0xfUEVSRlFVRVJZX0NPVU5URVJfREVTQ19MRU5HVEhfTUFYX0lOVEVMICovCisgICB7IDQzOTY2LCAweDAwMDA5NTAwIH0sIC8qIEdMX1BFUkZRVUVSWV9HUEFfRVhURU5ERURfQ09VTlRFUlNfSU5URUwgKi8KKyAgIHsgNDQwMDcsIDB4MDAwMTAwMDAgfSwgLyogR0xfRVZBTF9CSVQgKi8KKyAgIHsgNDQwMTksIDB4MDAwMTkyNjIgfSwgLyogR0xfUkFTVEVSX1BPU0lUSU9OX1VOQ0xJUFBFRF9JQk0gKi8KKyAgIHsgNDQwNTIsIDB4MDAwMjAwMDAgfSwgLyogR0xfTElTVF9CSVQgKi8KKyAgIHsgNDQwNjQsIDB4MDAwNDAwMDAgfSwgLyogR0xfVEVYVFVSRV9CSVQgKi8KKyAgIHsgNDQwNzksIDB4MDAwODAwMDAgfSwgLyogR0xfU0NJU1NPUl9CSVQgKi8KKyAgIHsgNDQwOTQsIDB4MDAwRkZGRkYgfSwgLyogR0xfQUxMX0FUVFJJQl9CSVRTICovCisgICB7IDQ0MTEzLCAweDIwMDAwMDAwIH0sIC8qIEdMX01VTFRJU0FNUExFX0JJVCAqLworICAgeyA0NDEzMiwgMHhGRkZGRkZGRiB9LCAvKiBHTF9BTExfQ0xJRU5UX0FUVFJJQl9CSVRTICovCit9OworCisKK3R5cGVkZWYgaW50ICgqY2Z1bmMpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKKworLyoqCisgKiBDb21wYXJlIGEga2V5IGVudW0gdmFsdWUgdG8gYW4gZWxlbWVudCBpbiB0aGUgXGMgZW51bV9zdHJpbmdfdGFibGVfb2Zmc2V0cyBhcnJheS4KKyAqCisgKiBcYyBic2VhcmNoIGFsd2F5cyBwYXNzZXMgdGhlIGtleSBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIGFuZCB0aGUgcG9pbnRlcgorICogdG8gdGhlIGFycmF5IGVsZW1lbnQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuICBXZSBjYW4gZWxpbWlhdGUgc29tZQorICogZXh0cmEgd29yayBieSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoYXQgZmFjdC4KKyAqCisgKiBccGFyYW0gYSAgUG9pbnRlciB0byB0aGUgZGVzaXJlZCBlbnVtIG5hbWUuCisgKiBccGFyYW0gYiAgUG9pbnRlciBpbnRvIHRoZSBcYyBlbnVtX3N0cmluZ190YWJsZV9vZmZzZXRzIGFycmF5LgorICovCitzdGF0aWMgaW50IGNvbXBhcl9uciggY29uc3QgaW50ICphLCBlbnVtX2VsdCAqYiApCit7CisgICByZXR1cm4gYVswXSAtIGItPm47Cit9CisKKworc3RhdGljIGNoYXIgdG9rZW5fdG1wWzIwXTsKKworY29uc3QgY2hhciAqX21lc2FfbG9va3VwX2VudW1fYnlfbnIoIGludCBuciApCit7CisgICBlbnVtX2VsdCAqZWx0OworCisgICBTVEFUSUNfQVNTRVJUKHNpemVvZihlbnVtX3N0cmluZ190YWJsZSkgPCAoMSA8PCAxNikpOworCisgICBlbHQgPSBfbWVzYV9ic2VhcmNoKCYgbnIsIGVudW1fc3RyaW5nX3RhYmxlX29mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzKGVudW1fc3RyaW5nX3RhYmxlX29mZnNldHMpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZW51bV9zdHJpbmdfdGFibGVfb2Zmc2V0c1swXSksCisgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYykgY29tcGFyX25yKTsKKworICAgaWYgKGVsdCAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gJmVudW1fc3RyaW5nX3RhYmxlW2VsdC0+b2Zmc2V0XTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogdGhpcyBpcyBub3QgcmUtZW50cmFudCBzYWZlLCBubyBiaWcgZGVhbCBoZXJlICovCisgICAgICBfbWVzYV9zbnByaW50Zih0b2tlbl90bXAsIHNpemVvZih0b2tlbl90bXApIC0gMSwgIjB4JXgiLCBucik7CisgICAgICB0b2tlbl90bXBbc2l6ZW9mKHRva2VuX3RtcCkgLSAxXSA9ICdcMCc7CisgICAgICByZXR1cm4gdG9rZW5fdG1wOworICAgfQorfQorCisvKioKKyAqIFByaW1pdGl2ZSBuYW1lcworICovCitzdGF0aWMgY29uc3QgY2hhciAqcHJpbV9uYW1lc1tQUklNX01BWCszXSA9IHsKKyAgICJHTF9QT0lOVFMiLAorICAgIkdMX0xJTkVTIiwKKyAgICJHTF9MSU5FX0xPT1AiLAorICAgIkdMX0xJTkVfU1RSSVAiLAorICAgIkdMX1RSSUFOR0xFUyIsCisgICAiR0xfVFJJQU5HTEVfU1RSSVAiLAorICAgIkdMX1RSSUFOR0xFX0ZBTiIsCisgICAiR0xfUVVBRFMiLAorICAgIkdMX1FVQURfU1RSSVAiLAorICAgIkdMX1BPTFlHT04iLAorICAgIkdMX0xJTkVTX0FESkFDRU5DWSIsCisgICAiR0xfTElORV9TVFJJUF9BREpBQ0VOQ1kiLAorICAgIkdMX1RSSUFOR0xFU19BREpBQ0VOQ1kiLAorICAgIkdMX1RSSUFOR0xFX1NUUklQX0FESkFDRU5DWSIsCisgICAib3V0c2lkZSBiZWdpbi9lbmQiLAorICAgInVua25vd24gc3RhdGUiCit9OworCisKKy8qIEdldCB0aGUgbmFtZSBvZiBhbiBlbnVtIGdpdmVuIHRoYXQgaXQgaXMgYSBwcmltaXRpdmUgdHlwZS4gIEF2b2lkcworICogR0xfRkFMU0UvR0xfUE9JTlRTIGFtYmlndWl0eSBhbmQgb3RoZXJzLgorICovCitjb25zdCBjaGFyICoKK19tZXNhX2xvb2t1cF9wcmltX2J5X25yKEdMdWludCBucikKK3sKKyAgIGlmIChuciA8IEVsZW1lbnRzKHByaW1fbmFtZXMpKQorICAgICAgcmV0dXJuIHByaW1fbmFtZXNbbnJdOworICAgZWxzZQorICAgICAgcmV0dXJuICJpbnZhbGlkIG1vZGUiOworfQorCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lbnVtcy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lbnVtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzA1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2VudW1zLmgKQEAgLTAsMCArMSw0NyBAQAorLyoqCisgKiBcZmlsZSBlbnVtcy5oCisgKiBFbnVtZXJhdGlvbiBuYW1lL251bWJlciBsb29rdXAgZnVuY3Rpb25zLgorICogCisgKiBcaWYgc3Vic2V0CisgKiAoTm8tb3ApCisgKgorICogXGVuZGlmCisgKi8KKworLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgX0VOVU1TX0hfCisjZGVmaW5lIF9FTlVNU19IXworCisKK2V4dGVybiBjb25zdCBjaGFyICpfbWVzYV9sb29rdXBfZW51bV9ieV9uciggaW50IG5yICk7CisKKy8qIEdldCB0aGUgbmFtZSBvZiBhbiBlbnVtIGdpdmVuIHRoYXQgaXQgaXMgYSBwcmltaXRpdmUgdHlwZS4gIEF2b2lkcworICogR0xfRkFMU0UvR0xfUE9JTlRTIGFtYmlndWl0eSBhbmQgb3RoZXJzLgorICovCitjb25zdCBjaGFyICpfbWVzYV9sb29rdXBfcHJpbV9ieV9uciggdW5zaWduZWQgbnIgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2Vycm9ycy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lcnJvcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI3ZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lcnJvcnMuYwpAQCAtMCwwICsxLDczMSBAQAorLyoqCisgKiBcZmlsZSBlcnJvcnMuYworICogTWVzYSBkZWJ1Z2dpbmcgYW5kIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgImVudW1zLmgiCisjaW5jbHVkZSAiaW1wb3J0cy5oIgorI2luY2x1ZGUgImNvbnRleHQuaCIKKy8vICNpbmNsdWRlICJkaXNwYXRjaC5oIiAgLy8gTHVuYXJHIFJFTToKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAibXR5cGVzLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgImhhc2hfdGFibGUuaCIKKworc3RhdGljIG10eF90IER5bmFtaWNJRE11dGV4ID0gX01UWF9JTklUSUFMSVpFUl9OUDsKK3N0YXRpYyBHTHVpbnQgTmV4dER5bmFtaWNJRCA9IDE7CisKKy8qKgorICogQSBuYW1lc3BhY2UgZWxlbWVudC4KKyAqLworc3RydWN0IGdsX2RlYnVnX2VsZW1lbnQKK3sKKyAgIHN0cnVjdCBzaW1wbGVfbm9kZSBsaW5rOworCisgICBHTHVpbnQgSUQ7CisgICAvKiBhdCB3aGljaCBzZXZlcml0eSBsZXZlbHMgKG1lc2FfZGVidWdfc2V2ZXJpdHkpIGlzIHRoZSBtZXNzYWdlIGVuYWJsZWQgKi8KKyAgIEdMYml0ZmllbGQgU3RhdGU7Cit9OworCitzdHJ1Y3QgZ2xfZGVidWdfbmFtZXNwYWNlCit7CisgICBzdHJ1Y3Qgc2ltcGxlX25vZGUgRWxlbWVudHM7CisgICBHTGJpdGZpZWxkIERlZmF1bHRTdGF0ZTsKK307CisKK3N0cnVjdCBnbF9kZWJ1Z19ncm91cCB7CisgICBzdHJ1Y3QgZ2xfZGVidWdfbmFtZXNwYWNlIE5hbWVzcGFjZXNbTUVTQV9ERUJVR19TT1VSQ0VfQ09VTlRdW01FU0FfREVCVUdfVFlQRV9DT1VOVF07Cit9OworCisvKioKKyAqIEFuIGVycm9yLCB3YXJuaW5nLCBvciBvdGhlciBwaWVjZSBvZiBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgYW4gYXBwbGljYXRpb24KKyAqIHRvIGNvbnN1bWUgdmlhIEdMX0FSQl9kZWJ1Z19vdXRwdXQvR0xfS0hSX2RlYnVnLgorICovCitzdHJ1Y3QgZ2xfZGVidWdfbWVzc2FnZQoreworICAgZW51bSBtZXNhX2RlYnVnX3NvdXJjZSBzb3VyY2U7CisgICBlbnVtIG1lc2FfZGVidWdfdHlwZSB0eXBlOworICAgR0x1aW50IGlkOworICAgZW51bSBtZXNhX2RlYnVnX3NldmVyaXR5IHNldmVyaXR5OworICAgR0xzaXplaSBsZW5ndGg7CisgICBHTGNoYXJBUkIgKm1lc3NhZ2U7Cit9OworCisvKioKKyAqIERlYnVnIG1lc3NhZ2UgbG9nLiAgSXQgd29ya3MgbGlrZSBhIHJpbmcgYnVmZmVyLgorICovCitzdHJ1Y3QgZ2xfZGVidWdfbG9nIHsKKyAgIHN0cnVjdCBnbF9kZWJ1Z19tZXNzYWdlIE1lc3NhZ2VzW01BWF9ERUJVR19MT0dHRURfTUVTU0FHRVNdOworICAgR0xpbnQgTmV4dE1lc3NhZ2U7CisgICBHTGludCBOdW1NZXNzYWdlczsKK307CisKK3N0cnVjdCBnbF9kZWJ1Z19zdGF0ZQoreworICAgR0xERUJVR1BST0MgQ2FsbGJhY2s7CisgICBjb25zdCB2b2lkICpDYWxsYmFja0RhdGE7CisgICBHTGJvb2xlYW4gU3luY091dHB1dDsKKyAgIEdMYm9vbGVhbiBEZWJ1Z091dHB1dDsKKworICAgc3RydWN0IGdsX2RlYnVnX2dyb3VwICpHcm91cHNbTUFYX0RFQlVHX0dST1VQX1NUQUNLX0RFUFRIXTsKKyAgIHN0cnVjdCBnbF9kZWJ1Z19tZXNzYWdlIEdyb3VwTWVzc2FnZXNbTUFYX0RFQlVHX0dST1VQX1NUQUNLX0RFUFRIXTsKKyAgIEdMaW50IEdyb3VwU3RhY2tEZXB0aDsKKworICAgc3RydWN0IGdsX2RlYnVnX2xvZyBMb2c7Cit9OworCitzdGF0aWMgY2hhciBvdXRfb2ZfbWVtb3J5W10gPSAiRGVidWdnaW5nIGVycm9yOiBvdXQgb2YgbWVtb3J5IjsKKworc3RhdGljIGNvbnN0IEdMZW51bSBkZWJ1Z19zb3VyY2VfZW51bXNbXSA9IHsKKyAgIEdMX0RFQlVHX1NPVVJDRV9BUEksCisgICBHTF9ERUJVR19TT1VSQ0VfV0lORE9XX1NZU1RFTSwKKyAgIEdMX0RFQlVHX1NPVVJDRV9TSEFERVJfQ09NUElMRVIsCisgICBHTF9ERUJVR19TT1VSQ0VfVEhJUkRfUEFSVFksCisgICBHTF9ERUJVR19TT1VSQ0VfQVBQTElDQVRJT04sCisgICBHTF9ERUJVR19TT1VSQ0VfT1RIRVIsCit9OworCitzdGF0aWMgY29uc3QgR0xlbnVtIGRlYnVnX3R5cGVfZW51bXNbXSA9IHsKKyAgIEdMX0RFQlVHX1RZUEVfRVJST1IsCisgICBHTF9ERUJVR19UWVBFX0RFUFJFQ0FURURfQkVIQVZJT1IsCisgICBHTF9ERUJVR19UWVBFX1VOREVGSU5FRF9CRUhBVklPUiwKKyAgIEdMX0RFQlVHX1RZUEVfUE9SVEFCSUxJVFksCisgICBHTF9ERUJVR19UWVBFX1BFUkZPUk1BTkNFLAorICAgR0xfREVCVUdfVFlQRV9PVEhFUiwKKyAgIEdMX0RFQlVHX1RZUEVfTUFSS0VSLAorICAgR0xfREVCVUdfVFlQRV9QVVNIX0dST1VQLAorICAgR0xfREVCVUdfVFlQRV9QT1BfR1JPVVAsCit9OworCitzdGF0aWMgY29uc3QgR0xlbnVtIGRlYnVnX3NldmVyaXR5X2VudW1zW10gPSB7CisgICBHTF9ERUJVR19TRVZFUklUWV9MT1csCisgICBHTF9ERUJVR19TRVZFUklUWV9NRURJVU0sCisgICBHTF9ERUJVR19TRVZFUklUWV9ISUdILAorICAgR0xfREVCVUdfU0VWRVJJVFlfTk9USUZJQ0FUSU9OLAorfTsKKworLyoqCisgKiBIYW5kbGVzIGdlbmVyYXRpbmcgYSBHTF9BUkJfZGVidWdfb3V0cHV0IG1lc3NhZ2UgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBHTCBvcgorICogR0xTTCBjb21waWxlci4KKyAqCisgKiBUaGUgR0wgQVBJIGhhcyB0aGlzICJJRCIgbWVjaGFuaXNtLCB3aGVyZSB0aGUgaW50ZW50aW9uIGlzIHRvIGFsbG93IGEKKyAqIGNsaWVudCB0byBmaWx0ZXIgaW4vb3V0IG1lc3NhZ2VzIGJhc2VkIG9uIHNvdXJjZSwgdHlwZSwgYW5kIElELiAgT2YgY291cnNlLAorICogYnVpbGRpbmcgYSBnaWFudCBlbnVtIGxpc3Qgb2YgYWxsIGRlYnVnIG91dHB1dCBtZXNzYWdlcyB0aGF0IE1lc2EgbWlnaHQKKyAqIGdlbmVyYXRlIGlzIHJpZGljdWxvdXMsIHNvIGluc3RlYWQgd2UgaGF2ZSBvdXIgY2FsbGVyIHBhc3MgdXMgYSBwb2ludGVyIHRvCisgKiBzdGF0aWMgc3RvcmFnZSB3aGVyZSB0aGUgSUQgc2hvdWxkIGdldCBzdG9yZWQuICBUaGlzIElEIHdpbGwgYmUgc2hhcmVkCisgKiBhY3Jvc3MgYWxsIGNvbnRleHRzIGZvciB0aGF0IG1lc3NhZ2UgKHdoaWNoIHNlZW1zIGxpa2UgYSBkZXNpcmFibGUKKyAqIHByb3BlcnR5LCBldmVuIGlmIGl0J3Mgbm90IGV4cGVjdGVkIGJ5IHRoZSBzcGVjKSwgYnV0IG5vdGUgdGhhdCBpdCB3b24ndCBiZQorICogdGhlIHNhbWUgYmV0d2VlbiBleGVjdXRpb25zIGlmIG1lc3NhZ2VzIGFyZW4ndCBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIuCisgKi8KK3N0YXRpYyB2b2lkCitkZWJ1Z19nZXRfaWQoR0x1aW50ICppZCkKK3sKKyAgIGlmICghKCppZCkpIHsKKyAgICAgIG10eF9sb2NrKCZEeW5hbWljSURNdXRleCk7CisgICAgICBpZiAoISgqaWQpKQorICAgICAgICAgKmlkID0gTmV4dER5bmFtaWNJRCsrOworICAgICAgbXR4X3VubG9jaygmRHluYW1pY0lETXV0ZXgpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorZGVidWdfbWVzc2FnZV9zdG9yZShzdHJ1Y3QgZ2xfZGVidWdfbWVzc2FnZSAqbXNnLAorICAgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc291cmNlIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZW51bSBtZXNhX2RlYnVnX3R5cGUgdHlwZSwgR0x1aW50IGlkLAorICAgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgbGVuLCBjb25zdCBjaGFyICpidWYpCit7CisgICBhc3NlcnQoIW1zZy0+bWVzc2FnZSAmJiAhbXNnLT5sZW5ndGgpOworCisgICBtc2ctPm1lc3NhZ2UgPSBtYWxsb2MobGVuKzEpOworICAgaWYgKG1zZy0+bWVzc2FnZSkgeworICAgICAgKHZvaWQpIHN0cm5jcHkobXNnLT5tZXNzYWdlLCBidWYsIChzaXplX3QpbGVuKTsKKyAgICAgIG1zZy0+bWVzc2FnZVtsZW5dID0gJ1wwJzsKKworICAgICAgbXNnLT5sZW5ndGggPSBsZW4rMTsKKyAgICAgIG1zZy0+c291cmNlID0gc291cmNlOworICAgICAgbXNnLT50eXBlID0gdHlwZTsKKyAgICAgIG1zZy0+aWQgPSBpZDsKKyAgICAgIG1zZy0+c2V2ZXJpdHkgPSBzZXZlcml0eTsKKyAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgR0x1aW50IG9vbV9tc2dfaWQgPSAwOworICAgICAgZGVidWdfZ2V0X2lkKCZvb21fbXNnX2lkKTsKKworICAgICAgLyogbWFsbG9jIGZhaWxlZCEgKi8KKyAgICAgIG1zZy0+bWVzc2FnZSA9IG91dF9vZl9tZW1vcnk7CisgICAgICBtc2ctPmxlbmd0aCA9IHN0cmxlbihvdXRfb2ZfbWVtb3J5KSsxOworICAgICAgbXNnLT5zb3VyY2UgPSBNRVNBX0RFQlVHX1NPVVJDRV9PVEhFUjsKKyAgICAgIG1zZy0+dHlwZSA9IE1FU0FfREVCVUdfVFlQRV9FUlJPUjsKKyAgICAgIG1zZy0+aWQgPSBvb21fbXNnX2lkOworICAgICAgbXNnLT5zZXZlcml0eSA9IE1FU0FfREVCVUdfU0VWRVJJVFlfSElHSDsKKyAgIH0KK30KK3N0YXRpYyB2b2lkCitkZWJ1Z19uYW1lc3BhY2VfY2xlYXIoc3RydWN0IGdsX2RlYnVnX25hbWVzcGFjZSAqbnMpCit7CisgICBzdHJ1Y3Qgc2ltcGxlX25vZGUgKm5vZGUsICp0bXA7CisKKyAgIGZvcmVhY2hfcyhub2RlLCB0bXAsICZucy0+RWxlbWVudHMpCisgICAgICBmcmVlKG5vZGUpOworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgXHAgaWQgaW4gdGhlIG5hbWVzcGFjZS4KKyAqLworc3RhdGljIGJvb2wKK2RlYnVnX25hbWVzcGFjZV9nZXQoY29uc3Qgc3RydWN0IGdsX2RlYnVnX25hbWVzcGFjZSAqbnMsIEdMdWludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgZW51bSBtZXNhX2RlYnVnX3NldmVyaXR5IHNldmVyaXR5KQoreworICAgc3RydWN0IHNpbXBsZV9ub2RlICpub2RlOworICAgdWludDMyX3Qgc3RhdGU7CisKKyAgIHN0YXRlID0gbnMtPkRlZmF1bHRTdGF0ZTsKKyAgIGZvcmVhY2gobm9kZSwgJm5zLT5FbGVtZW50cykgeworICAgICAgc3RydWN0IGdsX2RlYnVnX2VsZW1lbnQgKmVsZW0gPSAoc3RydWN0IGdsX2RlYnVnX2VsZW1lbnQgKikgbm9kZTsKKworICAgICAgaWYgKGVsZW0tPklEID09IGlkKSB7CisgICAgICAgICBzdGF0ZSA9IGVsZW0tPlN0YXRlOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAoc3RhdGUgJiAoMSA8PCBzZXZlcml0eSkpOworfQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIHRoZSB0b3AgZGVidWcgZ3JvdXAgcG9pbnRzIHRvIHRoZSBncm91cCBiZWxvdyBpdC4KKyAqLworc3RhdGljIGJvb2wKK2RlYnVnX2lzX2dyb3VwX3JlYWRfb25seShjb25zdCBzdHJ1Y3QgZ2xfZGVidWdfc3RhdGUgKmRlYnVnKQoreworICAgY29uc3QgR0xpbnQgZ3N0YWNrID0gZGVidWctPkdyb3VwU3RhY2tEZXB0aDsKKyAgIHJldHVybiAoZ3N0YWNrID4gMCAmJiBkZWJ1Zy0+R3JvdXBzW2dzdGFja10gPT0gZGVidWctPkdyb3Vwc1tnc3RhY2sgLSAxXSk7Cit9CisKKy8qKgorICogRnJlZSB0aGUgdG9wIGRlYnVnIGdyb3VwLgorICovCitzdGF0aWMgdm9pZAorZGVidWdfY2xlYXJfZ3JvdXAoc3RydWN0IGdsX2RlYnVnX3N0YXRlICpkZWJ1ZykKK3sKKyAgIGNvbnN0IEdMaW50IGdzdGFjayA9IGRlYnVnLT5Hcm91cFN0YWNrRGVwdGg7CisKKyAgIGlmICghZGVidWdfaXNfZ3JvdXBfcmVhZF9vbmx5KGRlYnVnKSkgeworICAgICAgc3RydWN0IGdsX2RlYnVnX2dyb3VwICpncnAgPSBkZWJ1Zy0+R3JvdXBzW2dzdGFja107CisgICAgICBpbnQgcywgdDsKKworICAgICAgZm9yIChzID0gMDsgcyA8IE1FU0FfREVCVUdfU09VUkNFX0NPVU5UOyBzKyspIHsKKyAgICAgICAgIGZvciAodCA9IDA7IHQgPCBNRVNBX0RFQlVHX1RZUEVfQ09VTlQ7IHQrKykKKyAgICAgICAgICAgIGRlYnVnX25hbWVzcGFjZV9jbGVhcigmZ3JwLT5OYW1lc3BhY2VzW3NdW3RdKTsKKyAgICAgIH0KKworICAgICAgZnJlZShncnApOworICAgfQorCisgICBkZWJ1Zy0+R3JvdXBzW2dzdGFja10gPSBOVUxMOworfQorCisvKioKKyAqIExvb3AgdGhyb3VnaCBkZWJ1ZyBncm91cCBzdGFjayB0ZWFyaW5nIGRvd24gc3RhdGVzIGZvcgorICogZmlsdGVyaW5nIGRlYnVnIG1lc3NhZ2VzLiAgVGhlbiBmcmVlIGRlYnVnIG91dHB1dCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2RlYnVnX2Rlc3Ryb3koc3RydWN0IGdsX2RlYnVnX3N0YXRlICpkZWJ1ZykKK3sKKyAgIHdoaWxlIChkZWJ1Zy0+R3JvdXBTdGFja0RlcHRoID4gMCkgeworICAgICAgZGVidWdfY2xlYXJfZ3JvdXAoZGVidWcpOworICAgICAgZGVidWctPkdyb3VwU3RhY2tEZXB0aC0tOworICAgfQorCisgICBkZWJ1Z19jbGVhcl9ncm91cChkZWJ1Zyk7CisgICBmcmVlKGRlYnVnKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiBtZXNzYWdlIHNvdXJjZS90eXBlL0lEIHR1cGxlIGlzIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBib29sCitkZWJ1Z19pc19tZXNzYWdlX2VuYWJsZWQoY29uc3Qgc3RydWN0IGdsX2RlYnVnX3N0YXRlICpkZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc291cmNlIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc2V2ZXJpdHkgc2V2ZXJpdHkpCit7CisgICBjb25zdCBHTGludCBnc3RhY2sgPSBkZWJ1Zy0+R3JvdXBTdGFja0RlcHRoOworICAgc3RydWN0IGdsX2RlYnVnX2dyb3VwICpncnAgPSBkZWJ1Zy0+R3JvdXBzW2dzdGFja107CisgICBzdHJ1Y3QgZ2xfZGVidWdfbmFtZXNwYWNlICpuc3BhY2UgPSAmZ3JwLT5OYW1lc3BhY2VzW3NvdXJjZV1bdHlwZV07CisKKyAgIGlmICghZGVidWctPkRlYnVnT3V0cHV0KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICByZXR1cm4gZGVidWdfbmFtZXNwYWNlX2dldChuc3BhY2UsIGlkLCBzZXZlcml0eSk7Cit9CisKKy8qKgorICogJ2J1ZicgaXMgbm90IG5lY2Vzc2FyaWx5IGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gV2hlbiBsb2dnaW5nLCBjb3B5CisgKiAnbGVuJyBjaGFyYWN0ZXJzIGZyb20gaXQsIHN0b3JlIHRoZW0gaW4gYSBuZXcsIG51bGwtdGVybWluYXRlZCBzdHJpbmcsCisgKiBhbmQgcmVtZW1iZXIgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGJ5IHRoYXQgc3RyaW5nLCAqaW5jbHVkaW5nKgorICogdGhlIG51bGwgdGVybWluYXRvciB0aGlzIHRpbWUuCisgKi8KK3N0YXRpYyB2b2lkCitkZWJ1Z19sb2dfbWVzc2FnZShzdHJ1Y3QgZ2xfZGVidWdfc3RhdGUgKmRlYnVnLAorICAgICAgICAgICAgICAgICAgZW51bSBtZXNhX2RlYnVnX3NvdXJjZSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfdHlwZSB0eXBlLCBHTHVpbnQgaWQsCisgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICBHTHNpemVpIGxlbiwgY29uc3QgY2hhciAqYnVmKQoreworICAgc3RydWN0IGdsX2RlYnVnX2xvZyAqbG9nID0gJmRlYnVnLT5Mb2c7CisgICBHTGludCBuZXh0RW1wdHk7CisgICBzdHJ1Y3QgZ2xfZGVidWdfbWVzc2FnZSAqZW1wdHlTbG90OworCisgICBhc3NlcnQobGVuID49IDAgJiYgbGVuIDwgTUFYX0RFQlVHX01FU1NBR0VfTEVOR1RIKTsKKworICAgaWYgKGxvZy0+TnVtTWVzc2FnZXMgPT0gTUFYX0RFQlVHX0xPR0dFRF9NRVNTQUdFUykKKyAgICAgIHJldHVybjsKKworICAgbmV4dEVtcHR5ID0gKGxvZy0+TmV4dE1lc3NhZ2UgKyBsb2ctPk51bU1lc3NhZ2VzKQorICAgICAgJSBNQVhfREVCVUdfTE9HR0VEX01FU1NBR0VTOworICAgZW1wdHlTbG90ID0gJmxvZy0+TWVzc2FnZXNbbmV4dEVtcHR5XTsKKworICAgZGVidWdfbWVzc2FnZV9zdG9yZShlbXB0eVNsb3QsIHNvdXJjZSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaWQsIHNldmVyaXR5LCBsZW4sIGJ1Zik7CisKKyAgIGxvZy0+TnVtTWVzc2FnZXMrKzsKK30KKworLyoqCisgKiBMb2NrIGFuZCByZXR1cm4gZGVidWcgc3RhdGUgZm9yIHRoZSBjb250ZXh0LiAgVGhlIGRlYnVnIHN0YXRlIHdpbGwgYmUKKyAqIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdXBvbiB0aGUgZmlyc3QgY2FsbC4gIFdoZW4gTlVMTCBpcyByZXR1cm5lZCwgdGhlCisgKiBkZWJ1ZyBzdGF0ZSBpcyBub3QgbG9ja2VkLgorICovCitzdGF0aWMgc3RydWN0IGdsX2RlYnVnX3N0YXRlICoKK19tZXNhX2xvY2tfZGVidWdfc3RhdGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK19tZXNhX3VubG9ja19kZWJ1Z19zdGF0ZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworfQorCisvKioKKyAqIFNldCB0aGUgaW50ZWdlciBkZWJ1ZyBzdGF0ZSBzcGVjaWZpZWQgYnkgXHAgcG5hbWUuICBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbQorICogX21lc2Ffc2V0X2VuYWJsZSBmb3IgZXhhbXBsZS4KKyAqLworYm9vbAorX21lc2Ffc2V0X2RlYnVnX3N0YXRlX2ludChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbCkKK3sKKyAgIHN0cnVjdCBnbF9kZWJ1Z19zdGF0ZSAqZGVidWcgPSBfbWVzYV9sb2NrX2RlYnVnX3N0YXRlKGN0eCk7CisKKyAgIGlmICghZGVidWcpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHN3aXRjaCAocG5hbWUpIHsKKyAgIGNhc2UgR0xfREVCVUdfT1VUUFVUOgorICAgICAgZGVidWctPkRlYnVnT3V0cHV0ID0gKHZhbCAhPSAwKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9ERUJVR19PVVRQVVRfU1lOQ0hST05PVVNfQVJCOgorICAgICAgZGVidWctPlN5bmNPdXRwdXQgPSAodmFsICE9IDApOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEidW5rbm93biBkZWJ1ZyBvdXRwdXQgcGFyYW0iKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBfbWVzYV91bmxvY2tfZGVidWdfc3RhdGUoY3R4KTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIGludGVnZXIgZGVidWcgc3RhdGUgc3BlY2lmaWVkIGJ5IFxwIHBuYW1lLiAgVGhpcyBjYW4gYmUgY2FsbGVkCisgKiBfbWVzYV9HZXRJbnRlZ2VydiBmb3IgZXhhbXBsZS4KKyAqLworR0xpbnQKK19tZXNhX2dldF9kZWJ1Z19zdGF0ZV9pbnQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lKQoreworICAgc3RydWN0IGdsX2RlYnVnX3N0YXRlICpkZWJ1ZzsKKyAgIEdMaW50IHZhbDsKKworICAgbXR4X2xvY2soJmN0eC0+RGVidWdNdXRleCk7CisgICBkZWJ1ZyA9IGN0eC0+RGVidWc7CisgICBpZiAoIWRlYnVnKSB7CisgICAgICBtdHhfdW5sb2NrKCZjdHgtPkRlYnVnTXV0ZXgpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIHN3aXRjaCAocG5hbWUpIHsKKyAgIGNhc2UgR0xfREVCVUdfT1VUUFVUOgorICAgICAgdmFsID0gZGVidWctPkRlYnVnT3V0cHV0OworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0RFQlVHX09VVFBVVF9TWU5DSFJPTk9VU19BUkI6CisgICAgICB2YWwgPSBkZWJ1Zy0+U3luY091dHB1dDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9ERUJVR19MT0dHRURfTUVTU0FHRVM6CisgICAgICB2YWwgPSBkZWJ1Zy0+TG9nLk51bU1lc3NhZ2VzOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0RFQlVHX05FWFRfTE9HR0VEX01FU1NBR0VfTEVOR1RIOgorICAgICAgdmFsID0gKGRlYnVnLT5Mb2cuTnVtTWVzc2FnZXMpID8KKyAgICAgICAgIGRlYnVnLT5Mb2cuTWVzc2FnZXNbZGVidWctPkxvZy5OZXh0TWVzc2FnZV0ubGVuZ3RoIDogMDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9ERUJVR19HUk9VUF9TVEFDS19ERVBUSDoKKyAgICAgIHZhbCA9IGRlYnVnLT5Hcm91cFN0YWNrRGVwdGg7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJ1bmtub3duIGRlYnVnIG91dHB1dCBwYXJhbSIpOworICAgICAgdmFsID0gMDsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBtdHhfdW5sb2NrKCZjdHgtPkRlYnVnTXV0ZXgpOworCisgICByZXR1cm4gdmFsOworfQorCisvKioKKyAqIFF1ZXJ5IHRoZSBwb2ludGVyIGRlYnVnIHN0YXRlIHNwZWNpZmllZCBieSBccCBwbmFtZS4gIFRoaXMgY2FuIGJlIGNhbGxlZAorICogX21lc2FfR2V0UG9pbnRlcnYgZm9yIGV4YW1wbGUuCisgKi8KK3ZvaWQgKgorX21lc2FfZ2V0X2RlYnVnX3N0YXRlX3B0cihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUpCit7CisgICBzdHJ1Y3QgZ2xfZGVidWdfc3RhdGUgKmRlYnVnOworICAgdm9pZCAqdmFsOworCisgICBtdHhfbG9jaygmY3R4LT5EZWJ1Z011dGV4KTsKKyAgIGRlYnVnID0gY3R4LT5EZWJ1ZzsKKyAgIGlmICghZGVidWcpIHsKKyAgICAgIG10eF91bmxvY2soJmN0eC0+RGVidWdNdXRleCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgc3dpdGNoIChwbmFtZSkgeworICAgY2FzZSBHTF9ERUJVR19DQUxMQkFDS19GVU5DVElPTl9BUkI6CisgICAgICB2YWwgPSAodm9pZCAqKSBkZWJ1Zy0+Q2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfREVCVUdfQ0FMTEJBQ0tfVVNFUl9QQVJBTV9BUkI6CisgICAgICB2YWwgPSAodm9pZCAqKSBkZWJ1Zy0+Q2FsbGJhY2tEYXRhOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEidW5rbm93biBkZWJ1ZyBvdXRwdXQgcGFyYW0iKTsKKyAgICAgIHZhbCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgIH0KKworICAgbXR4X3VubG9jaygmY3R4LT5EZWJ1Z011dGV4KTsKKworICAgcmV0dXJuIHZhbDsKK30KKworLyoqCisgKiBJbnNlcnQgYSBkZWJ1ZyBtZXNzYWdlLiAgVGhlIG11dGV4IGlzIGFzc3VtZWQgdG8gYmUgbG9ja2VkLCBhbmQgd2lsbCBiZQorICogdW5sb2NrZWQgYnkgdGhpcyBjYWxsLgorICovCitzdGF0aWMgdm9pZAorbG9nX21zZ19sb2NrZWRfYW5kX3VubG9jayhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc291cmNlIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBtZXNhX2RlYnVnX3R5cGUgdHlwZSwgR0x1aW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGxlbiwgY29uc3QgY2hhciAqYnVmKQoreworICAgc3RydWN0IGdsX2RlYnVnX3N0YXRlICpkZWJ1ZyA9IGN0eC0+RGVidWc7CisKKyAgIGlmICghZGVidWdfaXNfbWVzc2FnZV9lbmFibGVkKGRlYnVnLCBzb3VyY2UsIHR5cGUsIGlkLCBzZXZlcml0eSkpIHsKKyAgICAgIF9tZXNhX3VubG9ja19kZWJ1Z19zdGF0ZShjdHgpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoY3R4LT5EZWJ1Zy0+Q2FsbGJhY2spIHsKKyAgICAgIEdMZW51bSBnbF9zb3VyY2UgPSBkZWJ1Z19zb3VyY2VfZW51bXNbc291cmNlXTsKKyAgICAgIEdMZW51bSBnbF90eXBlID0gZGVidWdfdHlwZV9lbnVtc1t0eXBlXTsKKyAgICAgIEdMZW51bSBnbF9zZXZlcml0eSA9IGRlYnVnX3NldmVyaXR5X2VudW1zW3NldmVyaXR5XTsKKyAgICAgIEdMREVCVUdQUk9DIGNhbGxiYWNrID0gY3R4LT5EZWJ1Zy0+Q2FsbGJhY2s7CisgICAgICBjb25zdCB2b2lkICpkYXRhID0gY3R4LT5EZWJ1Zy0+Q2FsbGJhY2tEYXRhOworCisgICAgICAvKgorICAgICAgICogV2hlbiBjdHgtPkRlYnVnLT5TeW5jT3V0cHV0IGlzIEdMX0ZBTFNFLCB0aGUgY2xpZW50IGlzIHByZXBhcmVkIGZvcgorICAgICAgICogdW5zeW5jaHJvbm91cyBjYWxscy4gIFdoZW4gaXQgaXMgR0xfVFJVRSwgd2Ugd2lsbCBub3Qgc3Bhd24gdGhyZWFkcy4KKyAgICAgICAqIEluIGVpdGhlciBjYXNlLCB3ZSBjYW4gY2FsbCB0aGUgY2FsbGJhY2sgdW5sb2NrZWQuCisgICAgICAgKi8KKyAgICAgIF9tZXNhX3VubG9ja19kZWJ1Z19zdGF0ZShjdHgpOworICAgICAgY2FsbGJhY2soZ2xfc291cmNlLCBnbF90eXBlLCBpZCwgZ2xfc2V2ZXJpdHksIGxlbiwgYnVmLCBkYXRhKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgZGVidWdfbG9nX21lc3NhZ2UoY3R4LT5EZWJ1Zywgc291cmNlLCB0eXBlLCBpZCwgc2V2ZXJpdHksIGxlbiwgYnVmKTsKKyAgICAgIF9tZXNhX3VubG9ja19kZWJ1Z19zdGF0ZShjdHgpOworICAgfQorfQorCisvKioKKyAqIExvZyBhIGNsaWVudCBvciBkcml2ZXIgZGVidWcgbWVzc2FnZS4KKyAqLworc3RhdGljIHZvaWQKK2xvZ19tc2coc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgZW51bSBtZXNhX2RlYnVnX3NvdXJjZSBzb3VyY2UsCisgICAgICAgIGVudW0gbWVzYV9kZWJ1Z190eXBlIHR5cGUsIEdMdWludCBpZCwKKyAgICAgICAgZW51bSBtZXNhX2RlYnVnX3NldmVyaXR5IHNldmVyaXR5LCBHTGludCBsZW4sIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKyAgIHN0cnVjdCBnbF9kZWJ1Z19zdGF0ZSAqZGVidWcgPSBfbWVzYV9sb2NrX2RlYnVnX3N0YXRlKGN0eCk7CisKKyAgIGlmICghZGVidWcpCisgICAgICByZXR1cm47CisKKyAgIGxvZ19tc2dfbG9ja2VkX2FuZF91bmxvY2soY3R4LCBzb3VyY2UsIHR5cGUsIGlkLCBzZXZlcml0eSwgbGVuLCBidWYpOworfQorCisKK3ZvaWQKK19tZXNhX2luaXRfZXJyb3JzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBtdHhfaW5pdCgmY3R4LT5EZWJ1Z011dGV4LCBtdHhfcGxhaW4pOworfQorCisKK3ZvaWQKK19tZXNhX2ZyZWVfZXJyb3JzX2RhdGEoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIGlmIChjdHgtPkRlYnVnKSB7CisgICAgICBkZWJ1Z19kZXN0cm95KGN0eC0+RGVidWcpOworICAgICAgLyogc2V0IHRvIE5VTEwganVzdCBpbiBjYXNlIGl0IGlzIHVzZWQgYmVmb3JlIGNvbnRleHQgaXMgY29tcGxldGVseSBnb25lLiAqLworICAgICAgY3R4LT5EZWJ1ZyA9IE5VTEw7CisgICB9CisKKyAgIG10eF9kZXN0cm95KCZjdHgtPkRlYnVnTXV0ZXgpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIERpYWdub3N0aWNzICovCisvKkB7Ki8KKworc3RhdGljIHZvaWQKK291dHB1dF9pZl9kZWJ1Zyhjb25zdCBjaGFyICpwcmVmaXhTdHJpbmcsIGNvbnN0IGNoYXIgKm91dHB1dFN0cmluZywKKyAgICAgICAgICAgICAgICBHTGJvb2xlYW4gbmV3bGluZSkKK3sKKyAgIHN0YXRpYyBpbnQgZGVidWcgPSAtMTsKKyAgIHN0YXRpYyBGSUxFICpmb3V0ID0gTlVMTDsKKworICAgLyogSW5pdCB0aGUgbG9jYWwgJ2RlYnVnJyB2YXIgb25jZS4KKyAgICAqIE5vdGU6IHRoZSBfbWVzYV9pbml0X2RlYnVnKCkgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAqIGJ5IG5vdyBzbyBNRVNBX0RFQlVHX0ZMQUdTIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICAgKi8KKyAgIGlmIChkZWJ1ZyA9PSAtMSkgeworICAgICAgLyogSWYgTUVTQV9MT0dfRklMRSBlbnYgdmFyIGlzIHNldCwgbG9nIE1lc2EgZXJyb3JzLCB3YXJuaW5ncywKKyAgICAgICAqIGV0YyB0byB0aGUgbmFtZWQgZmlsZS4gIE90aGVyd2lzZSwgb3V0cHV0IHRvIHN0ZGVyci4KKyAgICAgICAqLworICAgICAgY29uc3QgY2hhciAqbG9nRmlsZSA9IF9tZXNhX2dldGVudigiTUVTQV9MT0dfRklMRSIpOworICAgICAgaWYgKGxvZ0ZpbGUpCisgICAgICAgICBmb3V0ID0gZm9wZW4obG9nRmlsZSwgInciKTsKKyAgICAgIGlmICghZm91dCkKKyAgICAgICAgIGZvdXQgPSBzdGRlcnI7CisjaWZkZWYgREVCVUcKKyAgICAgIC8qIGluIGRlYnVnIGJ1aWxkcywgcHJpbnQgbWVzc2FnZXMgdW5sZXNzIE1FU0FfREVCVUc9InNpbGVudCIgKi8KKyAgICAgIGlmIChNRVNBX0RFQlVHX0ZMQUdTICYgREVCVUdfU0lMRU5UKQorICAgICAgICAgZGVidWcgPSAwOworICAgICAgZWxzZQorICAgICAgICAgZGVidWcgPSAxOworI2Vsc2UKKyAgICAgIC8qIGluIHJlbGVhc2UgYnVpbGRzLCBiZSBzaWxlbnQgdW5sZXNzIE1FU0FfREVCVUcgaXMgc2V0ICovCisgICAgICBkZWJ1ZyA9IF9tZXNhX2dldGVudigiTUVTQV9ERUJVRyIpICE9IE5VTEw7CisjZW5kaWYKKyAgIH0KKworICAgLyogTm93IG9ubHkgcHJpbnQgdGhlIHN0cmluZyBpZiB3ZSdyZSByZXF1aXJlZCB0byBkbyBzby4gKi8KKyAgIGlmIChkZWJ1ZykgeworICAgICAgZnByaW50Zihmb3V0LCAiJXM6ICVzIiwgcHJlZml4U3RyaW5nLCBvdXRwdXRTdHJpbmcpOworICAgICAgaWYgKG5ld2xpbmUpCisgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOworICAgICAgZmZsdXNoKGZvdXQpOworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgICAvKiBzdGRlcnIgZnJvbSB3aW5kb3dzIGFwcGxpY2F0aW9ucyB3aXRob3V0IGNvbnNvbGUgaXMgbm90IHVzdWFsbHkgCisgICAgICAgKiB2aXNpYmxlLCBzbyBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkZWJ1Z2dlciBpbnN0ZWFkICovIAorICAgICAgeworICAgICAgICAgY2hhciBidWZbNDA5Nl07CisgICAgICAgICBfbWVzYV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6ICVzJXMiLCBwcmVmaXhTdHJpbmcsIG91dHB1dFN0cmluZywgbmV3bGluZSA/ICJcbiIgOiAiIik7CisgICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZ0EoYnVmKTsKKyAgICAgIH0KKyNlbmRpZgorICAgfQorfQorCisKKy8qKgorICogV2hlbiBhIG5ldyB0eXBlIG9mIGVycm9yIGlzIHJlY29yZGVkLCBwcmludCBhIG1lc3NhZ2UgZGVzY3JpYmluZworICogcHJldmlvdXMgZXJyb3JzIHdoaWNoIHdlcmUgYWNjdW11bGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitmbHVzaF9kZWxheWVkX2Vycm9ycyggc3RydWN0IGdsX2NvbnRleHQgKmN0eCApCit7CisgICBjaGFyIHNbTUFYX0RFQlVHX01FU1NBR0VfTEVOR1RIXTsKKworICAgaWYgKGN0eC0+RXJyb3JEZWJ1Z0NvdW50KSB7CisgICAgICBfbWVzYV9zbnByaW50ZihzLCBNQVhfREVCVUdfTUVTU0FHRV9MRU5HVEgsICIlZCBzaW1pbGFyICVzIGVycm9ycyIsIAorICAgICAgICAgICAgICAgICAgICAgY3R4LT5FcnJvckRlYnVnQ291bnQsCisgICAgICAgICAgICAgICAgICAgICBfbWVzYV9sb29rdXBfZW51bV9ieV9ucihjdHgtPkVycm9yVmFsdWUpKTsKKworICAgICAgb3V0cHV0X2lmX2RlYnVnKCJNZXNhIiwgcywgR0xfVFJVRSk7CisKKyAgICAgIGN0eC0+RXJyb3JEZWJ1Z0NvdW50ID0gMDsKKyAgIH0KK30KKworCisvKioKKyAqIFJlcG9ydCBhIHdhcm5pbmcgKGEgcmVjb3ZlcmFibGUgZXJyb3IgY29uZGl0aW9uKSB0byBzdGRlcnIgaWYKKyAqIGVpdGhlciBERUJVRyBpcyBkZWZpbmVkIG9yIHRoZSBNRVNBX0RFQlVHIGVudiB2YXIgaXMgc2V0LgorICoKKyAqIFxwYXJhbSBjdHggR0wgY29udGV4dC4KKyAqIFxwYXJhbSBmbXRTdHJpbmcgcHJpbnRmKCktbGlrZSBmb3JtYXQgc3RyaW5nLgorICovCit2b2lkCitfbWVzYV93YXJuaW5nKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpmbXRTdHJpbmcsIC4uLiApCit7CisgICBjaGFyIHN0cltNQVhfREVCVUdfTUVTU0FHRV9MRU5HVEhdOworICAgdmFfbGlzdCBhcmdzOworICAgdmFfc3RhcnQoIGFyZ3MsIGZtdFN0cmluZyApOyAgCisgICAodm9pZCkgX21lc2FfdnNucHJpbnRmKCBzdHIsIE1BWF9ERUJVR19NRVNTQUdFX0xFTkdUSCwgZm10U3RyaW5nLCBhcmdzICk7CisgICB2YV9lbmQoIGFyZ3MgKTsKKyAgIAorICAgaWYgKGN0eCkKKyAgICAgIGZsdXNoX2RlbGF5ZWRfZXJyb3JzKCBjdHggKTsKKworICAgb3V0cHV0X2lmX2RlYnVnKCJNZXNhIHdhcm5pbmciLCBzdHIsIEdMX1RSVUUpOworfQorCisKKy8qKgorICogUmVwb3J0IGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIHByb2JsZW0uCisgKiBQcmludHMgdGhlIG1lc3NhZ2UgdG8gc3RkZXJyIHZpYSBmcHJpbnRmKCkuCisgKgorICogXHBhcmFtIGN0eCBHTCBjb250ZXh0LgorICogXHBhcmFtIGZtdFN0cmluZyBwcm9ibGVtIGRlc2NyaXB0aW9uIHN0cmluZy4KKyAqLwordm9pZAorX21lc2FfcHJvYmxlbSggY29uc3Qgc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqZm10U3RyaW5nLCAuLi4gKQoreworICAgIC8vIEx1bmFyRyBERUw6Cit9CisKKwordm9pZAorX21lc2FfZ2xfZGVidWcoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgIEdMdWludCAqaWQsCisgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgZW51bSBtZXNhX2RlYnVnX3NldmVyaXR5IHNldmVyaXR5LAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10U3RyaW5nLCAuLi4pCit7CisgICBjaGFyIHNbTUFYX0RFQlVHX01FU1NBR0VfTEVOR1RIXTsKKyAgIGludCBsZW47CisgICB2YV9saXN0IGFyZ3M7CisKKyAgIGRlYnVnX2dldF9pZChpZCk7CisKKyAgIHZhX3N0YXJ0KGFyZ3MsIGZtdFN0cmluZyk7CisgICBsZW4gPSBfbWVzYV92c25wcmludGYocywgTUFYX0RFQlVHX01FU1NBR0VfTEVOR1RILCBmbXRTdHJpbmcsIGFyZ3MpOworICAgdmFfZW5kKGFyZ3MpOworCisgICBsb2dfbXNnKGN0eCwgTUVTQV9ERUJVR19TT1VSQ0VfQVBJLCB0eXBlLCAqaWQsIHNldmVyaXR5LCBsZW4sIHMpOworfQorCisKKy8qKgorICogUmVjb3JkIGFuIE9wZW5HTCBzdGF0ZSBlcnJvci4gIFRoZXNlIHVzdWFsbHkgb2NjdXIgd2hlbiB0aGUgdXNlcgorICogcGFzc2VzIGludmFsaWQgcGFyYW1ldGVycyB0byBhIEdMIGZ1bmN0aW9uLgorICoKKyAqIElmIGRlYnVnZ2luZyBpcyBlbmFibGVkIChlaXRoZXIgYXQgY29tcGlsZS10aW1lIHZpYSB0aGUgREVCVUcgbWFjcm8sIG9yCisgKiBydW4tdGltZSB2aWEgdGhlIE1FU0FfREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUpLCByZXBvcnQgdGhlIGVycm9yIHdpdGgKKyAqIF9tZXNhX2RlYnVnKCkuCisgKiAKKyAqIFxwYXJhbSBjdHggdGhlIEdMIGNvbnRleHQuCisgKiBccGFyYW0gZXJyb3IgdGhlIGVycm9yIHZhbHVlLgorICogXHBhcmFtIGZtdFN0cmluZyBwcmludGYoKSBzdHlsZSBmb3JtYXQgc3RyaW5nLCBmb2xsb3dlZCBieSBvcHRpb25hbCBhcmdzCisgKi8KK3ZvaWQKK19tZXNhX2Vycm9yKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gZXJyb3IsIGNvbnN0IGNoYXIgKmZtdFN0cmluZywgLi4uICkKK3sKK30KKwordm9pZAorX21lc2FfZXJyb3Jfbm9fbWVtb3J5KGNvbnN0IGNoYXIgKmNhbGxlcikKK3sKK30KKworLyoqCisgKiBSZXBvcnQgZGVidWcgaW5mb3JtYXRpb24uICBQcmludCBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciB2aWEgZnByaW50ZigpLgorICogTm8tb3AgaWYgREVCVUcgbW9kZSBub3QgZW5hYmxlZC4KKyAqIAorICogXHBhcmFtIGN0eCBHTCBjb250ZXh0LgorICogXHBhcmFtIGZtdFN0cmluZyBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nLCBmb2xsb3dlZCBieSBvcHRpb25hbCBhcmdzLgorICovCit2b2lkCitfbWVzYV9kZWJ1ZyggY29uc3Qgc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqZm10U3RyaW5nLCAuLi4gKQoreworI2lmZGVmIERFQlVHCisgICBjaGFyIHNbTUFYX0RFQlVHX01FU1NBR0VfTEVOR1RIXTsKKyAgIHZhX2xpc3QgYXJnczsKKyAgIHZhX3N0YXJ0KGFyZ3MsIGZtdFN0cmluZyk7CisgICBfbWVzYV92c25wcmludGYocywgTUFYX0RFQlVHX01FU1NBR0VfTEVOR1RILCBmbXRTdHJpbmcsIGFyZ3MpOworICAgdmFfZW5kKGFyZ3MpOworICAgb3V0cHV0X2lmX2RlYnVnKCJNZXNhIiwgcywgR0xfRkFMU0UpOworI2VuZGlmIC8qIERFQlVHICovCisgICAodm9pZCkgY3R4OworICAgKHZvaWQpIGZtdFN0cmluZzsKK30KKworCisvKioKKyAqIFJlcG9ydCBkZWJ1ZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzaGFkZXIgY29tcGlsZXIgdmlhIEdMX0FSQl9kZWJ1Z19vdXRwdXQuCisgKgorICogXHBhcmFtIGN0eCBHTCBjb250ZXh0LgorICogXHBhcmFtIHR5cGUgVGhlIG5hbWVzcGFjZSB0byB3aGljaCB0aGlzIG1lc3NhZ2UgYmVsb25ncy4KKyAqIFxwYXJhbSBpZCBUaGUgbWVzc2FnZSBJRCB3aXRoaW4gdGhlIGdpdmVuIG5hbWVzcGFjZS4KKyAqIFxwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gb3V0cHV0LiBOZWVkIG5vdCBiZSBudWxsLXRlcm1pbmF0ZWQuCisgKiBccGFyYW0gbGVuIFRoZSBsZW5ndGggb2YgJ21zZycuIElmIG5lZ2F0aXZlLCAnbXNnJyBtdXN0IGJlIG51bGwtdGVybWluYXRlZC4KKyAqLwordm9pZAorX21lc2Ffc2hhZGVyX2RlYnVnKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdHlwZSwgR0x1aW50ICppZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuICkKK3sKKyAgIGVudW0gbWVzYV9kZWJ1Z19zb3VyY2Ugc291cmNlID0gTUVTQV9ERUJVR19TT1VSQ0VfU0hBREVSX0NPTVBJTEVSOworICAgZW51bSBtZXNhX2RlYnVnX3NldmVyaXR5IHNldmVyaXR5ID0gTUVTQV9ERUJVR19TRVZFUklUWV9ISUdIOworCisgICBkZWJ1Z19nZXRfaWQoaWQpOworCisgICBpZiAobGVuIDwgMCkKKyAgICAgIGxlbiA9IHN0cmxlbihtc2cpOworCisgICAvKiBUcnVuY2F0ZSB0aGUgbWVzc2FnZSBpZiBuZWNlc3NhcnkuICovCisgICBpZiAobGVuID49IE1BWF9ERUJVR19NRVNTQUdFX0xFTkdUSCkKKyAgICAgIGxlbiA9IE1BWF9ERUJVR19NRVNTQUdFX0xFTkdUSCAtIDE7CisKKyAgIGxvZ19tc2coY3R4LCBzb3VyY2UsIHR5cGUsICppZCwgc2V2ZXJpdHksIGxlbiwgbXNnKTsKK30KKworLypAfSovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2Vycm9ycy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg4MTM4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9lcnJvcnMuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKy8qKgorICogXGZpbGUgZXJyb3JzLmgKKyAqIE1lc2EgZGVidWdnaW5nIGFuZCBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byByZWNvcmQgZXJyb3JzLCB3YXJuaW5ncywgYW5kIG1pc2NlbGxhbmVvdXMKKyAqIGRlYnVnIGluZm9ybWF0aW9uLgorICovCisKKworI2lmbmRlZiBFUlJPUlNfSAorI2RlZmluZSBFUlJPUlNfSAorCisKKyNpbmNsdWRlICJjb21waWxlci5oIgorI2luY2x1ZGUgImdsaGVhZGVyLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAibXR5cGVzLmgiCisKK3N0cnVjdCBfZ2xhcGlfdGFibGU7CisKK2V4dGVybiB2b2lkCitfbWVzYV9pbml0X2Vycm9ycyggc3RydWN0IGdsX2NvbnRleHQgKmN0eCApOworCitleHRlcm4gdm9pZAorX21lc2FfZnJlZV9lcnJvcnNfZGF0YSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCApOworCitleHRlcm4gdm9pZAorX21lc2Ffd2FybmluZyggc3RydWN0IGdsX2NvbnRleHQgKmdjLCBjb25zdCBjaGFyICpmbXRTdHJpbmcsIC4uLiApIFBSSU5URkxJS0UoMiwgMyk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9wcm9ibGVtKCBjb25zdCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpmbXRTdHJpbmcsIC4uLiApIFBSSU5URkxJS0UoMiwgMyk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9lcnJvciggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIGVycm9yLCBjb25zdCBjaGFyICpmbXRTdHJpbmcsIC4uLiApIFBSSU5URkxJS0UoMywgNCk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9lcnJvcl9ub19tZW1vcnkoY29uc3QgY2hhciAqY2FsbGVyKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2RlYnVnKCBjb25zdCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpmbXRTdHJpbmcsIC4uLiApIFBSSU5URkxJS0UoMiwgMyk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9nbF9kZWJ1ZyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgR0x1aW50ICppZCwKKyAgICAgICAgICAgICAgIGVudW0gbWVzYV9kZWJ1Z190eXBlIHR5cGUsCisgICAgICAgICAgICAgICBlbnVtIG1lc2FfZGVidWdfc2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXRTdHJpbmcsIC4uLikgUFJJTlRGTElLRSg1LCA2KTsKKworI2RlZmluZSBfbWVzYV9wZXJmX2RlYnVnKGN0eCwgc2V2LCAuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBzdGF0aWMgR0x1aW50IG1zZ19pZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGlmICh1bmxpa2VseShjdHgtPkNvbnN0LkNvbnRleHRGbGFncyAmIEdMX0NPTlRFWFRfRkxBR19ERUJVR19CSVQpKSB7ICAgXAorICAgICAgX21lc2FfZ2xfZGVidWcoY3R4LCAmbXNnX2lkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBNRVNBX0RFQlVHX1RZUEVfUEVSRk9STUFOQ0UsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHNldiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK2Jvb2wKK19tZXNhX3NldF9kZWJ1Z19zdGF0ZV9pbnQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWwpOworCitHTGludAorX21lc2FfZ2V0X2RlYnVnX3N0YXRlX2ludChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gcG5hbWUpOworCit2b2lkICoKK19tZXNhX2dldF9kZWJ1Z19zdGF0ZV9wdHIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHBuYW1lKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3NoYWRlcl9kZWJ1ZyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdHlwZSwgR0x1aW50ICppZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptc2csIGludCBsZW4pOworCit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0RlYnVnTWVzc2FnZUluc2VydChHTGVudW0gc291cmNlLCBHTGVudW0gdHlwZSwgR0x1aW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBzZXZlcml0eSwgR0xpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMY2hhciogYnVmKTsKK0dMdWludCBHTEFQSUVOVFJZCitfbWVzYV9HZXREZWJ1Z01lc3NhZ2VMb2coR0x1aW50IGNvdW50LCBHTHNpemVpIGxvZ1NpemUsIEdMZW51bSogc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0qIHR5cGVzLCBHTGVudW0qIGlkcywgR0xlbnVtKiBzZXZlcml0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkqIGxlbmd0aHMsIEdMY2hhciogbWVzc2FnZUxvZyk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0RlYnVnTWVzc2FnZUNvbnRyb2woR0xlbnVtIHNvdXJjZSwgR0xlbnVtIHR5cGUsIEdMZW51bSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICppZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBlbmFibGVkKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfRGVidWdNZXNzYWdlQ2FsbGJhY2soR0xERUJVR1BST0MgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp1c2VyUGFyYW0pOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9QdXNoRGVidWdHcm91cChHTGVudW0gc291cmNlLCBHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xjaGFyICptZXNzYWdlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUG9wRGVidWdHcm91cCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogRVJST1JTX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZm9ybWF0cy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9mb3JtYXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYTI5MgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZm9ybWF0cy5jCkBAIC0wLDAgKzEsMzUzOCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSAgVk13YXJlLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgImdsZm9ybWF0cy5oIgorCisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgdGV4dHVyZSBmb3JtYXRzLgorICovCitzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8KK3sKKyAgIG1lc2FfZm9ybWF0IE5hbWU7CisKKyAgIC8qKiB0ZXh0IG5hbWUgZm9yIGRlYnVnZ2luZyAqLworICAgY29uc3QgY2hhciAqU3RyTmFtZTsKKworICAgLyoqCisgICAgKiBCYXNlIGZvcm1hdCBpcyBvbmUgb2YgR0xfUkVELCBHTF9SRywgR0xfUkdCLCBHTF9SR0JBLCBHTF9BTFBIQSwKKyAgICAqIEdMX0xVTUlOQU5DRSwgR0xfTFVNSU5BTkNFX0FMUEhBLCBHTF9JTlRFTlNJVFksIEdMX1lDQkNSX01FU0EsCisgICAgKiBHTF9ERVBUSF9DT01QT05FTlQsIEdMX1NURU5DSUxfSU5ERVgsIEdMX0RFUFRIX1NURU5DSUwsIEdMX0RVRFZfQVRJLgorICAgICovCisgICBHTGVudW0gQmFzZUZvcm1hdDsKKworICAgLyoqCisgICAgKiBMb2dpY2FsIGRhdGEgdHlwZTogb25lIG9mICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCBHTF9TSUdORURfTk9STUFMSVpFRCwKKyAgICAqIEdMX1VOU0lHTkVEX0lOVCwgR0xfSU5ULCBHTF9GTE9BVC4KKyAgICAqLworICAgR0xlbnVtIERhdGFUeXBlOworCisgICBHTHVieXRlIFJlZEJpdHM7CisgICBHTHVieXRlIEdyZWVuQml0czsKKyAgIEdMdWJ5dGUgQmx1ZUJpdHM7CisgICBHTHVieXRlIEFscGhhQml0czsKKyAgIEdMdWJ5dGUgTHVtaW5hbmNlQml0czsKKyAgIEdMdWJ5dGUgSW50ZW5zaXR5Qml0czsKKyAgIEdMdWJ5dGUgSW5kZXhCaXRzOworICAgR0x1Ynl0ZSBEZXB0aEJpdHM7CisgICBHTHVieXRlIFN0ZW5jaWxCaXRzOworCisgICAvKioKKyAgICAqIFRvIGRlc2NyaWJlIGNvbXByZXNzZWQgZm9ybWF0cy4gIElmIG5vdCBjb21wcmVzc2VkLCBXaWR0aD1IZWlnaHQ9MS4KKyAgICAqLworICAgR0x1Ynl0ZSBCbG9ja1dpZHRoLCBCbG9ja0hlaWdodDsKKyAgIEdMdWJ5dGUgQnl0ZXNQZXJCbG9jazsKK307CisKKworLyoqCisgKiBJbmZvIGFib3V0IGVhY2ggZm9ybWF0LgorICogVGhlc2UgbXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgTUVTQV9GT1JNQVRfKiBlbnVtcyBzbyB0aGF0CisgKiB3ZSBjYW4gZG8gbG9va3VwcyB3aXRob3V0IHNlYXJjaGluZy4KKyAqLworc3RhdGljIHN0cnVjdCBnbF9mb3JtYXRfaW5mbyBmb3JtYXRfaW5mb1tNRVNBX0ZPUk1BVF9DT1VOVF0gPQoreworICAgLyogUGFja2VkIHVub3JtIGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX05PTkUsICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX05PTkUiLCAgICAgICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9OT05FLCAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX05PTkUsICAgICAgICAgICAgICAgICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BOEI4RzhSOF9VTk9STSwgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9BOEI4RzhSOF9VTk9STSIsLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCQSwgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICA4LCA4LCA4LCA4LCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCA0ICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfWDhCOEc4UjhfVU5PUk0sICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfWDhCOEc4UjhfVU5PUk0iLC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX1JHQiwgICAgICAgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgOCwgOCwgOCwgMCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgNCAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1I4RzhCOEE4X1VOT1JNIiwvKiBTdHJOYW1lICovCisgICAgICBHTF9SR0JBLCAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDgsIDgsIDgsIDgsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDQgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SOEc4QjhYOF9VTk9STSwgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9SOEc4QjhYOF9VTk9STSIsLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCLCAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICA4LCA4LCA4LCAwLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCA0ICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfQjhHOFI4QThfVU5PUk0sICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfQjhHOFI4QThfVU5PUk0iLC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX1JHQkEsICAgICAgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgOCwgOCwgOCwgOCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgNCAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0I4RzhSOFg4X1VOT1JNLCAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0I4RzhSOFg4X1VOT1JNIiwvKiBTdHJOYW1lICovCisgICAgICBHTF9SR0IsICAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDgsIDgsIDgsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDQgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BOFI4RzhCOF9VTk9STSwgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9BOFI4RzhCOF9VTk9STSIsLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCQSwgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICA4LCA4LCA4LCA4LCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCA0ICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfWDhSOEc4QjhfVU5PUk0sICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfWDhSOEc4QjhfVU5PUk0iLC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX1JHQiwgICAgICAgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgOCwgOCwgOCwgMCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgNCAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0wxNkExNl9VTk9STSwgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0wxNkExNl9VTk9STSIsICAvKiBTdHJOYW1lICovCisgICAgICBHTF9MVU1JTkFOQ0VfQUxQSEEsICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDE2LCAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAxNiwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDQgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BMTZMMTZfVU5PUk0sICAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9BMTZMMTZfVU5PUk0iLCAgLyogU3RyTmFtZSAqLworICAgICAgR0xfTFVNSU5BTkNFX0FMUEhBLCAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAwLCAwLCAwLCAxNiwgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMTYsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCA0ICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfQjVHNlI1X1VOT1JNLCAgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfQjVHNlI1X1VOT1JNIiwgIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX1JHQiwgICAgICAgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgNSwgNiwgNSwgMCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgMiAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1I1RzZCNV9VTk9STSwgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1I1RzZCNV9VTk9STSIsICAvKiBTdHJOYW1lICovCisgICAgICBHTF9SR0IsICAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDUsIDYsIDUsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDIgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9CNEc0UjRBNF9VTk9STSwgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9CNEc0UjRBNF9VTk9STSIsLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCQSwgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICA0LCA0LCA0LCA0LCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAyICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfQjRHNFI0WDRfVU5PUk0sCisgICAgICAiTUVTQV9GT1JNQVRfQjRHNFI0WDRfVU5PUk0iLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDQsIDQsIDQsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0E0UjRHNEI0X1VOT1JNLCAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0E0UjRHNEI0X1VOT1JNIiwvKiBTdHJOYW1lICovCisgICAgICBHTF9SR0JBLCAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDQsIDQsIDQsIDQsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDIgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BMUI1RzVSNV9VTk9STSwgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9BMUI1RzVSNV9VTk9STSIsLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCQSwgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICA1LCA1LCA1LCAxLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAyICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfQjVHNVI1QTFfVU5PUk0sICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfQjVHNVI1QTFfVU5PUk0iLC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX1JHQkEsICAgICAgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgNSwgNSwgNSwgMSwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgMiAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0I1RzVSNVgxX1VOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX0I1RzVSNVgxX1VOT1JNIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA1LCA1LCA1LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BMVI1RzVCNV9VTk9STSwgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9BMVI1RzVCNV9VTk9STSIsLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCQSwgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICA1LCA1LCA1LCAxLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAyICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfTDhBOF9VTk9STSwgICAgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfTDhBOF9VTk9STSIsICAgIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSwgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgMCwgMCwgMCwgOCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDgsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgMiAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0E4TDhfVU5PUk0sICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0E4TDhfVU5PUk0iLCAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9MVU1JTkFOQ0VfQUxQSEEsICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDgsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICA4LCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDIgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SOEc4X1VOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX1I4RzhfVU5PUk0iLAorICAgICAgR0xfUkcsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgOCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfRzhSOF9VTk9STSwKKyAgICAgICJNRVNBX0ZPUk1BVF9HOFI4X1VOT1JNIiwKKyAgICAgIEdMX1JHLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDgsIDgsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0w0QTRfVU5PUk0sICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0w0QTRfVU5PUk0iLCAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9MVU1JTkFOQ0VfQUxQSEEsICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDQsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICA0LCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDEgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9CMkczUjNfVU5PUk0sICAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9CMkczUjNfVU5PUk0iLCAgLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCLCAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAzLCAzLCAyLCAwLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAxICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUjE2RzE2X1VOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX1IxNkcxNl9VTk9STSIsCisgICAgICBHTF9SRywKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxNiwgMTYsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0cxNlIxNl9VTk9STSwKKyAgICAgICJNRVNBX0ZPUk1BVF9HMTZSMTZfVU5PUk0iLAorICAgICAgR0xfUkcsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgMTYsIDE2LCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9CMTBHMTBSMTBBMl9VTk9STSwKKyAgICAgICJNRVNBX0ZPUk1BVF9CMTBHMTBSMTBBMl9VTk9STSIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDEwLCAxMCwgMTAsIDIsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0IxMEcxMFIxMFgyX1VOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX0IxMEcxMFIxMFgyX1VOT1JNIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxMCwgMTAsIDEwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STSwKKyAgICAgICJNRVNBX0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STSIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDEwLCAxMCwgMTAsIDIsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1M4X1VJTlRfWjI0X1VOT1JNLCAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9TOF9VSU5UX1oyNF9VTk9STSIsIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX0RFUFRIX1NURU5DSUwsICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDI0LCA4LCAgICAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfWDhfVUlOVF9aMjRfVU5PUk0sICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1g4X1VJTlRfWjI0X1VOT1JNIiwgLyogU3RyTmFtZSAqLworICAgICAgR0xfREVQVEhfQ09NUE9ORU5ULCAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMjQsIDAsICAgICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9aMjRfVU5PUk1fUzhfVUlOVCwgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfWjI0X1VOT1JNX1M4X1VJTlQiLCAvKiBTdHJOYW1lICovCisgICAgICBHTF9ERVBUSF9TVEVOQ0lMLCAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAyNCwgOCwgICAgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1oyNF9VTk9STV9YOF9VSU5ULCAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9aMjRfVU5PUk1fWDhfVUlOVCIsIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX0RFUFRIX0NPTVBPTkVOVCwgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDI0LCAwLCAgICAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfWUNCQ1IsICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfWUNCQ1IiLCAgICAgICAgIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX1lDQkNSX01FU0EsICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgMiAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1lDQkNSX1JFViwgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1lDQkNSX1JFViIsICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9ZQ0JDUl9NRVNBLCAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDIgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisKKyAgIC8qIEFycmF5IHVub3JtIGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0RVRFY4LAorICAgICAgIk1FU0FfRk9STUFUX0RVRFY4IiwKKyAgICAgIEdMX0RVRFZfQVRJLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1VOT1JNOCwgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9BX1VOT1JNOCIsICAgICAgLyogU3RyTmFtZSAqLworICAgICAgR0xfQUxQSEEsICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAwLCAwLCAwLCA4LCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAxICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfQV9VTk9STTE2LCAgICAgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfQV9VTk9STTE2IiwgICAgIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX0FMUEhBLCAgICAgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgMCwgMCwgMCwgMTYsICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgMiAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xfVU5PUk04LCAgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0xfVU5PUk04IiwgICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9MVU1JTkFOQ0UsICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICA4LCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDEgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MX1VOT1JNMTYsICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9MX1VOT1JNMTYiLCAgICAgLyogU3RyTmFtZSAqLworICAgICAgR0xfTFVNSU5BTkNFLCAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMTYsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAyICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfSV9VTk9STTgsICAgICAgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfSV9VTk9STTgiLCAgICAgIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX0lOVEVOU0lUWSwgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDgsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgMSAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0lfVU5PUk0xNiwgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0lfVU5PUk0xNiIsICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9JTlRFTlNJVFksICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAxNiwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDIgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SX1VOT1JNOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9SX1VOT1JNOCIsCisgICAgICBHTF9SRUQsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUl9VTk9STTE2LAorICAgICAgIk1FU0FfRk9STUFUX1JfVU5PUk0xNiIsCisgICAgICBHTF9SRUQsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgMTYsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0JHUl9VTk9STTgsICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX0JHUl9VTk9STTgiLCAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9SR0IsICAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDgsIDgsIDgsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDMgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JfVU5PUk04LCAgICAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JfVU5PUk04IiwgICAgLyogU3RyTmFtZSAqLworICAgICAgR0xfUkdCLCAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICA4LCA4LCA4LCAwLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAzICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCQV9VTk9STTE2LAorICAgICAgIk1FU0FfRk9STUFUX1JHQkFfVU5PUk0xNiIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDgKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JYX1VOT1JNMTYsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCWF9VTk9STTE2IiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxNiwgMTYsIDE2LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDgKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9aX1VOT1JNMTYsICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICJNRVNBX0ZPUk1BVF9aX1VOT1JNMTYiLCAgICAgLyogU3RyTmFtZSAqLworICAgICAgR0xfREVQVEhfQ09NUE9ORU5ULCAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMTYsIDAsICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAyICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfWl9VTk9STTMyLCAgICAgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfWl9VTk9STTMyIiwgICAgIC8qIFN0ck5hbWUgKi8KKyAgICAgIEdMX0RFUFRIX0NPTVBPTkVOVCwgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKiBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDMyLCAwLCAgICAgICAgICAgICAgLyogTHVtL0ludC9JbmRleC9EZXB0aC9TdGVuY2lsQml0cyAqLworICAgICAgMSwgMSwgNCAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1NfVUlOVDgsICAgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1NfVUlOVDgiLCAgICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9TVEVOQ0lMX0lOREVYLCAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwgICAgICAgICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCA4LCAgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDEgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisKKyAgIC8qIFBhY2tlZCBzaWduZWQvbm9ybWFsaXplZCBmb3JtYXRzICovCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BOEI4RzhSOF9TTk9STSwKKyAgICAgICJNRVNBX0ZPUk1BVF9BOEI4RzhSOF9TTk9STSIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA4LCA4LCA4LCA4LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9YOEI4RzhSOF9TTk9STSwKKyAgICAgICJNRVNBX0ZPUk1BVF9YOEI4RzhSOF9TTk9STSIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDgsIDgsIDgsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNCAgICAgICAgICAgICAgICAgICAgICAgLyogNCBicHAsIGJ1dCBubyBhbHBoYSAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1I4RzhCOEE4X1NOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX1I4RzhCOEE4X1NOT1JNIiwKKyAgICAgIEdMX1JHQkEsCisgICAgICBHTF9TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDgsIDgsIDgsIDgsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1I4RzhCOFg4X1NOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX1I4RzhCOFg4X1NOT1JNIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgOCwgOCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUjE2RzE2X1NOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX1IxNkcxNl9TTk9STSIsCisgICAgICBHTF9SRywKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgMTYsIDE2LCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9HMTZSMTZfU05PUk0sCisgICAgICAiTUVTQV9GT1JNQVRfRzE2UjE2X1NOT1JNIiwKKyAgICAgIEdMX1JHLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxNiwgMTYsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1I4RzhfU05PUk0sCisgICAgICAiTUVTQV9GT1JNQVRfUjhHOF9TTk9STSIsCisgICAgICBHTF9SRywKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgOCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfRzhSOF9TTk9STSwKKyAgICAgICJNRVNBX0ZPUk1BVF9HOFI4X1NOT1JNIiwKKyAgICAgIEdMX1JHLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA4LCA4LCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MOEE4X1NOT1JNLAorICAgICAgIk1FU0FfRk9STUFUX0w4QThfU05PUk0iLAorICAgICAgR0xfTFVNSU5BTkNFX0FMUEhBLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAwLCAwLCAwLCA4LAorICAgICAgOCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisKKyAgIC8qIEFycmF5IHNpZ25lZC9ub3JtYWxpemVkIGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0FfU05PUk04LAorICAgICAgIk1FU0FfRk9STUFUX0FfU05PUk04IiwKKyAgICAgIEdMX0FMUEhBLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAwLCAwLCAwLCA4LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDEKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1NOT1JNMTYsCisgICAgICAiTUVTQV9GT1JNQVRfQV9TTk9STTE2IiwKKyAgICAgIEdMX0FMUEhBLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAwLCAwLCAwLCAxNiwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfTF9TTk9STTgsCisgICAgICAiTUVTQV9GT1JNQVRfTF9TTk9STTgiLAorICAgICAgR0xfTFVNSU5BTkNFLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAwLCAwLCAwLCAwLAorICAgICAgOCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDEKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MX1NOT1JNMTYsCisgICAgICAiTUVTQV9GT1JNQVRfTF9TTk9STTE2IiwKKyAgICAgIEdMX0xVTUlOQU5DRSwKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDE2LCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0lfU05PUk04LAorICAgICAgIk1FU0FfRk9STUFUX0lfU05PUk04IiwKKyAgICAgIEdMX0lOVEVOU0lUWSwKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDgsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfSV9TTk9STTE2LAorICAgICAgIk1FU0FfRk9STUFUX0lfU05PUk0xNiIsCisgICAgICBHTF9JTlRFTlNJVFksCisgICAgICBHTF9TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICAwLCAxNiwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SX1NOT1JNOCwgICAgICAgICAvKiBOYW1lICovCisgICAgICAiTUVTQV9GT1JNQVRfUl9TTk9STTgiLCAgICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9SRUQsICAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlRm9ybWF0ICovCisgICAgICBHTF9TSUdORURfTk9STUFMSVpFRCwgICAgICAgICAvKiBEYXRhVHlwZSAqLworICAgICAgOCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCAxICAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja1dpZHRoL0hlaWdodCxCeXRlcyAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JfU05PUk0xNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SX1NOT1JNMTYiLAorICAgICAgR0xfUkVELAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxNiwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfTEFfU05PUk0xNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9MQV9TTk9STTE2IiwKKyAgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgMCwgMCwgMCwgMTYsCisgICAgICAxNiwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JfU05PUk0xNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JfU05PUk0xNiIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDE2LCAxNiwgMTYsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQkFfU05PUk0xNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JBX1NOT1JNMTYiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgMTYsIDE2LCAxNiwgMTYsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgOAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQlhfU05PUk0xNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JYX1NOT1JNMTYiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxNiwgMTYsIDE2LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDgKKyAgIH0sCisKKyAgIC8qIFBhY2tlZCBzUkdCIGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0E4QjhHOFI4X1NSR0IsCisgICAgICAiTUVTQV9GT1JNQVRfQThCOEc4UjhfU1JHQiIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwgICAgCisgICAgICA4LCA4LCA4LCA4LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9COEc4UjhBOF9TUkdCLAorICAgICAgIk1FU0FfRk9STUFUX0I4RzhSOEE4X1NSR0IiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgIAorICAgICAgOCwgOCwgOCwgOCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfQjhHOFI4WDhfU1JHQiwKKyAgICAgICJNRVNBX0ZPUk1BVF9COEc4UjhYOF9TUkdCIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA4LCA4LCA4LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SOEc4QjhBOF9TUkdCLAorICAgICAgIk1FU0FfRk9STUFUX1I4RzhCOEE4X1NSR0IiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgIAorICAgICAgOCwgOCwgOCwgOCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUjhHOEI4WDhfU1JHQiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SOEc4QjhYOF9TUkdCIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA4LCA4LCA4LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MOEE4X1NSR0IsCisgICAgICAiTUVTQV9GT1JNQVRfTDhBOF9TUkdCIiwKKyAgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgIAorICAgICAgMCwgMCwgMCwgOCwKKyAgICAgIDgsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorCisgICAvKiBBcnJheSBzUkdCIGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xfU1JHQjgsCisgICAgICAiTUVTQV9GT1JNQVRfTF9TUkdCOCIsCisgICAgICBHTF9MVU1JTkFOQ0UsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICA4LCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMQorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0JHUl9TUkdCOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9CR1JfU1JHQjgiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDgsIDgsIDgsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMworICAgfSwKKworICAgLyogUGFja2VkIGZsb2F0IGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1I5RzlCOUU1X0ZMT0FULAorICAgICAgIk1FU0FfRk9STUFUX1JHQjlfRTUiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfRkxPQVQsCisgICAgICA5LCA5LCA5LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SMTFHMTFCMTBfRkxPQVQsCisgICAgICAiTUVTQV9GT1JNQVRfUjExRzExQjEwX0ZMT0FUIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX0ZMT0FULAorICAgICAgMTEsIDExLCAxMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfWjMyX0ZMT0FUX1M4WDI0X1VJTlQsICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1ozMl9GTE9BVF9TOFgyNF9VSU5UIiwgLyogU3RyTmFtZSAqLworICAgICAgR0xfREVQVEhfU1RFTkNJTCwgICAgICAgICAgICAgICAgICAgLyogQmFzZUZvcm1hdCAqLworICAgICAgLyogRGF0YVR5cGUgaGVyZSBpcyB1c2VkIHRvIGFuc3dlciBHTF9URVhUVVJFX0RFUFRIX1RZUEUgcXVlcmllcywgYW5kIGlzCisgICAgICAgKiBuZXZlciB1c2VkIGZvciBzdGVuY2lsIGJlY2F1c2Ugc3RlbmNpbCBpcyBhbHdheXMgR0xfVU5TSUdORURfSU5ULgorICAgICAgICovCisgICAgICBHTF9GTE9BVCwgICAgICAgICAgICAgICAgICAgIC8qIERhdGFUeXBlICovCisgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qIFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMzIsIDgsICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICAxLCAxLCA4ICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrV2lkdGgvSGVpZ2h0LEJ5dGVzICovCisgICB9LAorCisgICAvKiBBcnJheSBmbG9hdCBmb3JtYXRzICovCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX0ZMT0FUMTYsCisgICAgICAiTUVTQV9GT1JNQVRfQV9GTE9BVDE2IiwKKyAgICAgIEdMX0FMUEhBLAorICAgICAgR0xfRkxPQVQsCisgICAgICAwLCAwLCAwLCAxNiwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfQV9GTE9BVDMyLAorICAgICAgIk1FU0FfRk9STUFUX0FfRkxPQVQzMiIsCisgICAgICBHTF9BTFBIQSwKKyAgICAgIEdMX0ZMT0FULAorICAgICAgMCwgMCwgMCwgMzIsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xfRkxPQVQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9MX0ZMT0FUMTYiLAorICAgICAgR0xfTFVNSU5BTkNFLAorICAgICAgR0xfRkxPQVQsCisgICAgICAwLCAwLCAwLCAwLAorICAgICAgMTYsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfTF9GTE9BVDMyLAorICAgICAgIk1FU0FfRk9STUFUX0xfRkxPQVQzMiIsCisgICAgICBHTF9MVU1JTkFOQ0UsCisgICAgICBHTF9GTE9BVCwKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICAzMiwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MQV9GTE9BVDE2LAorICAgICAgIk1FU0FfRk9STUFUX0xBX0ZMT0FUMTYiLAorICAgICAgR0xfTFVNSU5BTkNFX0FMUEhBLAorICAgICAgR0xfRkxPQVQsCisgICAgICAwLCAwLCAwLCAxNiwKKyAgICAgIDE2LCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xBX0ZMT0FUMzIsCisgICAgICAiTUVTQV9GT1JNQVRfTEFfRkxPQVQzMiIsCisgICAgICBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICBHTF9GTE9BVCwKKyAgICAgIDAsIDAsIDAsIDMyLAorICAgICAgMzIsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA4CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfSV9GTE9BVDE2LAorICAgICAgIk1FU0FfRk9STUFUX0lfRkxPQVQxNiIsCisgICAgICBHTF9JTlRFTlNJVFksCisgICAgICBHTF9GTE9BVCwKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICAwLCAxNiwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9JX0ZMT0FUMzIsCisgICAgICAiTUVTQV9GT1JNQVRfSV9GTE9BVDMyIiwKKyAgICAgIEdMX0lOVEVOU0lUWSwKKyAgICAgIEdMX0ZMT0FULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDMyLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JfRkxPQVQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SX0ZMT0FUMTYiLAorICAgICAgR0xfUkVELAorICAgICAgR0xfRkxPQVQsCisgICAgICAxNiwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUl9GTE9BVDMyLAorICAgICAgIk1FU0FfRk9STUFUX1JfRkxPQVQzMiIsCisgICAgICBHTF9SRUQsCisgICAgICBHTF9GTE9BVCwKKyAgICAgIDMyLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR19GTE9BVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JHX0ZMT0FUMTYiLAorICAgICAgR0xfUkcsCisgICAgICBHTF9GTE9BVCwKKyAgICAgIDE2LCAxNiwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdfRkxPQVQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR19GTE9BVDMyIiwKKyAgICAgIEdMX1JHLAorICAgICAgR0xfRkxPQVQsCisgICAgICAzMiwgMzIsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgOAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQl9GTE9BVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JHQl9GTE9BVDE2IiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX0ZMT0FULAorICAgICAgMTYsIDE2LCAxNiwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA2CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCX0ZMT0FUMzIsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCX0ZMT0FUMzIiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfRkxPQVQsCisgICAgICAzMiwgMzIsIDMyLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDEyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCQV9GTE9BVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JHQkFfRkxPQVQxNiIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfRkxPQVQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA4CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCQV9GTE9BVDMyLAorICAgICAgIk1FU0FfRk9STUFUX1JHQkFfRkxPQVQzMiIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfRkxPQVQsCisgICAgICAzMiwgMzIsIDMyLCAzMiwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxNgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQlhfRkxPQVQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JYX0ZMT0FUMTYiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfRkxPQVQsCisgICAgICAxNiwgMTYsIDE2LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDgKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JYX0ZMT0FUMzIsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCWF9GTE9BVDMyIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX0ZMT0FULAorICAgICAgMzIsIDMyLCAzMiwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxNgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1pfRkxPQVQzMiwgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1pfRkxPQVQzMiIsICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9ERVBUSF9DT01QT05FTlQsICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX0ZMT0FULCAgICAgICAgICAgICAgICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyogUmVkL0dyZWVuL0JsdWUvQWxwaGFCaXRzICovCisgICAgICAwLCAwLCAwLCAzMiwgMCwgICAgICAgICAgICAgIC8qIEx1bS9JbnQvSW5kZXgvRGVwdGgvU3RlbmNpbEJpdHMgKi8KKyAgICAgIDEsIDEsIDQgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2tXaWR0aC9IZWlnaHQsQnl0ZXMgKi8KKyAgIH0sCisKKyAgIC8qIFBhY2tlZCBzaWduZWQvdW5zaWduZWQgbm9uLW5vcm1hbGl6ZWQgaW50ZWdlciBmb3JtYXRzICovCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9CMTBHMTBSMTBBMl9VSU5ULAorICAgICAgIk1FU0FfRk9STUFUX0IxMEcxMFIxMEEyX1VJTlQiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDEwLCAxMCwgMTAsIDIsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1IxMEcxMEIxMEEyX1VJTlQsCisgICAgICAiTUVTQV9GT1JNQVRfUjEwRzEwQjEwQTJfVUlOVCIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgMTAsIDEwLCAxMCwgMiwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorCisgICAvKiBBcnJheSBzaWduZWQvdW5zaWduZWQgbm9uLW5vcm1hbGl6ZWQgaW50ZWdlciBmb3JtYXRzICovCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1VJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX0FfVUlOVDgiLAorICAgICAgR0xfQUxQSEEsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAwLCAwLCAwLCA4LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDEKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1VJTlQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9BX1VJTlQxNiIsCisgICAgICBHTF9BTFBIQSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDAsIDAsIDAsIDE2LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1VJTlQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9BX1VJTlQzMiIsCisgICAgICBHTF9BTFBIQSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDAsIDAsIDAsIDMyLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1NJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX0FfU0lOVDgiLAorICAgICAgR0xfQUxQSEEsCisgICAgICBHTF9JTlQsCisgICAgICAwLCAwLCAwLCA4LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDEKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1NJTlQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9BX1NJTlQxNiIsCisgICAgICBHTF9BTFBIQSwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDAsIDAsIDAsIDE2LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9BX1NJTlQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9BX1NJTlQzMiIsCisgICAgICBHTF9BTFBIQSwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDAsIDAsIDAsIDMyLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9JX1VJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX0lfVUlOVDgiLAorICAgICAgR0xfSU5URU5TSVRZLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDgsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfSV9VSU5UMTYsCisgICAgICAiTUVTQV9GT1JNQVRfSV9VSU5UMTYiLAorICAgICAgR0xfSU5URU5TSVRZLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDE2LCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0lfVUlOVDMyLAorICAgICAgIk1FU0FfRk9STUFUX0lfVUlOVDMyIiwKKyAgICAgIEdMX0lOVEVOU0lUWSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICAwLCAzMiwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9JX1NJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX0lfU0lOVDgiLAorICAgICAgR0xfSU5URU5TSVRZLAorICAgICAgR0xfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDgsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfSV9TSU5UMTYsCisgICAgICAiTUVTQV9GT1JNQVRfSV9TSU5UMTYiLAorICAgICAgR0xfSU5URU5TSVRZLAorICAgICAgR0xfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDE2LCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0lfU0lOVDMyLAorICAgICAgIk1FU0FfRk9STUFUX0lfU0lOVDMyIiwKKyAgICAgIEdMX0lOVEVOU0lUWSwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICAwLCAzMiwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MX1VJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX0xfVUlOVDgiLAorICAgICAgR0xfTFVNSU5BTkNFLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDgsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfTF9VSU5UMTYsCisgICAgICAiTUVTQV9GT1JNQVRfTF9VSU5UMTYiLAorICAgICAgR0xfTFVNSU5BTkNFLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDE2LCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xfVUlOVDMyLAorICAgICAgIk1FU0FfRk9STUFUX0xfVUlOVDMyIiwKKyAgICAgIEdMX0xVTUlOQU5DRSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICAzMiwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MX1NJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX0xfU0lOVDgiLAorICAgICAgR0xfTFVNSU5BTkNFLAorICAgICAgR0xfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDgsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfTF9TSU5UMTYsCisgICAgICAiTUVTQV9GT1JNQVRfTF9TSU5UMTYiLAorICAgICAgR0xfTFVNSU5BTkNFLAorICAgICAgR0xfSU5ULAorICAgICAgMCwgMCwgMCwgMCwKKyAgICAgIDE2LCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xfU0lOVDMyLAorICAgICAgIk1FU0FfRk9STUFUX0xfU0lOVDMyIiwKKyAgICAgIEdMX0xVTUlOQU5DRSwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDAsIDAsIDAsIDAsCisgICAgICAzMiwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MQV9VSU5UOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9MQV9VSU5UOCIsCisgICAgICBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAwLCAwLCAwLCA4LAorICAgICAgOCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MQV9VSU5UMTYsCisgICAgICAiTUVTQV9GT1JNQVRfTEFfVUlOVDE2IiwKKyAgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDAsIDAsIDAsIDE2LAorICAgICAgMTYsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfTEFfVUlOVDMyLAorICAgICAgIk1FU0FfRk9STUFUX0xBX1VJTlQzMiIsCisgICAgICBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAwLCAwLCAwLCAzMiwKKyAgICAgIDMyLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgOAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xBX1NJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX0xBX1NJTlQ4IiwKKyAgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDAsIDAsIDAsIDgsCisgICAgICA4LCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0xBX1NJTlQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9MQV9TSU5UMTYiLAorICAgICAgR0xfTFVNSU5BTkNFX0FMUEhBLAorICAgICAgR0xfSU5ULAorICAgICAgMCwgMCwgMCwgMTYsCisgICAgICAxNiwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9MQV9TSU5UMzIsCisgICAgICAiTUVTQV9GT1JNQVRfTEFfU0lOVDMyIiwKKyAgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDAsIDAsIDAsIDMyLAorICAgICAgMzIsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA4CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUl9VSU5UOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9SX1VJTlQ4IiwKKyAgICAgIEdMX1JFRCwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDgsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMQorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JfVUlOVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JfVUlOVDE2IiwKKyAgICAgIEdMX1JFRCwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDE2LCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SX1VJTlQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SX1VJTlQzMiIsCisgICAgICBHTF9SRUQsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAzMiwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUl9TSU5UOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9SX1NJTlQ4IiwKKyAgICAgIEdMX1JFRCwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDgsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMQorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JfU0lOVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JfU0lOVDE2IiwKKyAgICAgIEdMX1JFRCwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDE2LCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SX1NJTlQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SX1NJTlQzMiIsCisgICAgICBHTF9SRUQsCisgICAgICBHTF9JTlQsCisgICAgICAzMiwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA0CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdfVUlOVDgsCisgICAgICAiTUVTQV9GT1JNQVRfUkdfVUlOVDgiLAorICAgICAgR0xfUkcsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICA4LCA4LCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR19VSU5UMTYsCisgICAgICAiTUVTQV9GT1JNQVRfUkdfVUlOVDE2IiwKKyAgICAgIEdMX1JHLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgMTYsIDE2LCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR19VSU5UMzIsCisgICAgICAiTUVTQV9GT1JNQVRfUkdfVUlOVDMyIiwKKyAgICAgIEdMX1JHLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgMzIsIDMyLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDgKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR19TSU5UOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR19TSU5UOCIsCisgICAgICBHTF9SRywKKyAgICAgIEdMX0lOVCwKKyAgICAgIDgsIDgsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHX1NJTlQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR19TSU5UMTYiLAorICAgICAgR0xfUkcsCisgICAgICBHTF9JTlQsCisgICAgICAxNiwgMTYsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHX1NJTlQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR19TSU5UMzIiLAorICAgICAgR0xfUkcsCisgICAgICBHTF9JTlQsCisgICAgICAzMiwgMzIsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgOAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQl9VSU5UOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JfVUlOVDgiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfVU5TSUdORURfSU5ULAorICAgICAgOCwgOCwgOCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAzCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCX1VJTlQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JfVUlOVDE2IiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDE2LCAxNiwgMTYsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQl9VSU5UMzIsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCX1VJTlQzMiIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAzMiwgMzIsIDMyLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDEyCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCX1NJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX1JHQl9TSU5UOCIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9JTlQsCisgICAgICA4LCA4LCA4LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDMKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JfU0lOVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JHQl9TSU5UMTYiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfSU5ULAorICAgICAgMTYsIDE2LCAxNiwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA2CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCX1NJTlQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JfU0lOVDMyIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDMyLCAzMiwgMzIsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMTIKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JBX1VJTlQ4LAorICAgICAgIk1FU0FfRk9STUFUX1JHQkFfVUlOVDgiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDgsIDgsIDgsIDgsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQkFfVUlOVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JHQkFfVUlOVDE2IiwKKyAgICAgIEdMX1JHQkEsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCA4CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCQV9VSU5UMzIsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCQV9VSU5UMzIiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX0lOVCwKKyAgICAgIDMyLCAzMiwgMzIsIDMyLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDE2CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCQV9TSU5UOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JBX1NJTlQ4IiwKKyAgICAgIEdMX1JHQkEsCisgICAgICBHTF9JTlQsCisgICAgICA4LCA4LCA4LCA4LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JBX1NJTlQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JBX1NJTlQxNiIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfSU5ULAorICAgICAgMTYsIDE2LCAxNiwgMTYsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgOAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQkFfU0lOVDMyLAorICAgICAgIk1FU0FfRk9STUFUX1JHQkFfU0lOVDMyIiwKKyAgICAgIEdMX1JHQkEsCisgICAgICBHTF9JTlQsCisgICAgICAzMiwgMzIsIDMyLCAzMiwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAxLCAxLCAxNgorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQlhfVUlOVDgsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCWF9VSU5UOCIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICA4LCA4LCA4LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDQKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JYX1VJTlQxNiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JYX1VJTlQxNiIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAxNiwgMTYsIDE2LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDgKKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JYX1VJTlQzMiwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JYX1VJTlQzMiIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9VTlNJR05FRF9JTlQsCisgICAgICAzMiwgMzIsIDMyLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDEsIDEsIDE2CisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCWF9TSU5UOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JYX1NJTlQ4IiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDgsIDgsIDgsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgNAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQlhfU0lOVDE2LAorICAgICAgIk1FU0FfRk9STUFUX1JHQlhfU0lOVDE2IiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDE2LCAxNiwgMTYsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgOAorICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQlhfU0lOVDMyLAorICAgICAgIk1FU0FfRk9STUFUX1JHQlhfU0lOVDMyIiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX0lOVCwKKyAgICAgIDMyLCAzMiwgMzIsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMSwgMSwgMTYKKyAgIH0sCisKKyAgIC8qIERYVCBjb21wcmVzc2VkIGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQl9EWFQxLCAgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1JHQl9EWFQxIiwgICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9SR0IsICAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDQsIDQsIDQsIDAsICAgICAgICAgICAgICAgICAgLyogYXBwcm94IFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQkFfRFhUMSwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JBX0RYVDEiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgIAorICAgICAgNCwgNCwgNCwgNCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQkFfRFhUMywKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JBX0RYVDMiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgIAorICAgICAgNCwgNCwgNCwgNCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA0LCA0LCAxNiAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9SR0JBX0RYVDUsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCQV9EWFQ1IiwKKyAgICAgIEdMX1JHQkEsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELCAgICAKKyAgICAgIDQsIDQsIDQsIDQsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgNCwgNCwgMTYgICAgICAgICAgICAgICAgICAgICAvKiAxNiBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorCisgICAvKiBEWFQgc1JHQiBjb21wcmVzc2VkIGZvcm1hdHMgKi8KKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1NSR0JfRFhUMSwgICAgICAgLyogTmFtZSAqLworICAgICAgIk1FU0FfRk9STUFUX1NSR0JfRFhUMSIsICAgICAvKiBTdHJOYW1lICovCisgICAgICBHTF9SR0IsICAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VGb3JtYXQgKi8KKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsICAgICAgLyogRGF0YVR5cGUgKi8KKyAgICAgIDQsIDQsIDQsIDAsICAgICAgICAgICAgICAgICAgLyogYXBwcm94IFJlZC9HcmVlbi9CbHVlL0FscGhhQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBMdW0vSW50L0luZGV4L0RlcHRoL1N0ZW5jaWxCaXRzICovCisgICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1NSR0JBX0RYVDEsCisgICAgICAiTUVTQV9GT1JNQVRfU1JHQkFfRFhUMSIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDQsIDQsIDQsIDQsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgNCwgNCwgOCAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9TUkdCQV9EWFQzLAorICAgICAgIk1FU0FfRk9STUFUX1NSR0JBX0RYVDMiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA0LCA0LCA0LCA0LAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDQsIDQsIDE2ICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1NSR0JBX0RYVDUsCisgICAgICAiTUVTQV9GT1JNQVRfU1JHQkFfRFhUNSIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDQsIDQsIDQsIDQsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgNCwgNCwgMTYgICAgICAgICAgICAgICAgICAgICAvKiAxNiBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorCisgICAvKiBGWFQxIGNvbXByZXNzZWQgZm9ybWF0cyAqLworICAgeworICAgICAgTUVTQV9GT1JNQVRfUkdCX0ZYVDEsCisgICAgICAiTUVTQV9GT1JNQVRfUkdCX0ZYVDEiLAorICAgICAgR0xfUkdCLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDQsIDQsIDQsIDAsICAgICAgICAgICAgICAgICAgLyogYXBwcm94IFJlZC9HcmVlbi9CbHVlQml0cyAqLworICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDgsIDQsIDE2ICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZXMgcGVyIDh4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX1JHQkFfRlhUMSwKKyAgICAgICJNRVNBX0ZPUk1BVF9SR0JBX0ZYVDEiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA0LCA0LCA0LCAxLCAgICAgICAgICAgICAgICAgIC8qIGFwcHJveCBSZWQvR3JlZW4vQmx1ZS9BbHBoYUJpdHMgKi8KKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA4LCA0LCAxNiAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBlciA4eDQgYmxvY2sgKi8KKyAgIH0sCisKKyAgIC8qIFJHVEMgY29tcHJlc3NlZCBmb3JtYXRzICovCisgICB7CisgICAgIE1FU0FfRk9STUFUX1JfUkdUQzFfVU5PUk0sCisgICAgICJNRVNBX0ZPUk1BVF9SX1JHVEMxX1VOT1JNIiwKKyAgICAgR0xfUkVELAorICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICA4LCAwLCAwLCAwLAorICAgICAwLCAwLCAwLCAwLCAwLAorICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgLyogOCBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorICAgeworICAgICBNRVNBX0ZPUk1BVF9SX1JHVEMxX1NOT1JNLAorICAgICAiTUVTQV9GT1JNQVRfUl9SR1RDMV9TTk9STSIsCisgICAgIEdMX1JFRCwKKyAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgIDgsIDAsIDAsIDAsCisgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgIDQsIDQsIDggICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgIE1FU0FfRk9STUFUX1JHX1JHVEMyX1VOT1JNLAorICAgICAiTUVTQV9GT1JNQVRfUkdfUkdUQzJfVU5PUk0iLAorICAgICBHTF9SRywKKyAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgOCwgOCwgMCwgMCwKKyAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgNCwgNCwgMTYgICAgICAgICAgICAgICAgICAgICAvKiAxNiBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorICAgeworICAgICBNRVNBX0ZPUk1BVF9SR19SR1RDMl9TTk9STSwKKyAgICAgIk1FU0FfRk9STUFUX1JHX1JHVEMyX1NOT1JNIiwKKyAgICAgR0xfUkcsCisgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICA4LCA4LCAwLCAwLAorICAgICAwLCAwLCAwLCAwLCAwLAorICAgICA0LCA0LCAxNiAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisKKyAgIC8qIExBVEMxLzIgY29tcHJlc3NlZCBmb3JtYXRzICovCisgICB7CisgICAgIE1FU0FfRk9STUFUX0xfTEFUQzFfVU5PUk0sCisgICAgICJNRVNBX0ZPUk1BVF9MX0xBVEMxX1VOT1JNIiwKKyAgICAgR0xfTFVNSU5BTkNFLAorICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAwLCAwLCAwLCAwLAorICAgICA0LCAwLCAwLCAwLCAwLAorICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgLyogOCBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorICAgeworICAgICBNRVNBX0ZPUk1BVF9MX0xBVEMxX1NOT1JNLAorICAgICAiTUVTQV9GT1JNQVRfTF9MQVRDMV9TTk9STSIsCisgICAgIEdMX0xVTUlOQU5DRSwKKyAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgIDAsIDAsIDAsIDAsCisgICAgIDQsIDAsIDAsIDAsIDAsCisgICAgIDQsIDQsIDggICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgIE1FU0FfRk9STUFUX0xBX0xBVEMyX1VOT1JNLAorICAgICAiTUVTQV9GT1JNQVRfTEFfTEFUQzJfVU5PUk0iLAorICAgICBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgIDAsIDAsIDAsIDQsCisgICAgIDQsIDAsIDAsIDAsIDAsCisgICAgIDQsIDQsIDE2ICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgTUVTQV9GT1JNQVRfTEFfTEFUQzJfU05PUk0sCisgICAgICJNRVNBX0ZPUk1BVF9MQV9MQVRDMl9TTk9STSIsCisgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgIDAsIDAsIDAsIDQsCisgICAgIDQsIDAsIDAsIDAsIDAsCisgICAgIDQsIDQsIDE2ICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKworICAgLyogRVRDMS8yIGNvbXByZXNzZWQgZm9ybWF0cyAqLworICAgeworICAgICAgTUVTQV9GT1JNQVRfRVRDMV9SR0I4LAorICAgICAgIk1FU0FfRk9STUFUX0VUQzFfUkdCOCIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgOCwgOCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgLyogOCBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfRVRDMl9SR0I4LAorICAgICAgIk1FU0FfRk9STUFUX0VUQzJfUkdCOCIsCisgICAgICBHTF9SR0IsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgOCwgOCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgLyogOCBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfRVRDMl9TUkdCOCwKKyAgICAgICJNRVNBX0ZPUk1BVF9FVEMyX1NSR0I4IiwKKyAgICAgIEdMX1JHQiwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA4LCA4LCA4LCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDQsIDQsIDggICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9FVEMyX1JHQkE4X0VBQywKKyAgICAgICJNRVNBX0ZPUk1BVF9FVEMyX1JHQkE4X0VBQyIsCisgICAgICBHTF9SR0JBLAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDgsIDgsIDgsIDgsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgNCwgNCwgMTYgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9FVEMyX1NSR0I4X0FMUEhBOF9FQUMsCisgICAgICAiTUVTQV9GT1JNQVRfRVRDMl9TUkdCOF9BTFBIQThfRUFDIiwKKyAgICAgIEdMX1JHQkEsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgOCwgOCwgOCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA0LCA0LCAxNiAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0VUQzJfUjExX0VBQywKKyAgICAgICJNRVNBX0ZPUk1BVF9FVEMyX1IxMV9FQUMiLAorICAgICAgR0xfUkVELAorICAgICAgR0xfVU5TSUdORURfTk9STUFMSVpFRCwKKyAgICAgIDExLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDQsIDQsIDggICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZXMgcGVyIDR4NCBibG9jayAqLworICAgfSwKKyAgIHsKKyAgICAgIE1FU0FfRk9STUFUX0VUQzJfUkcxMV9FQUMsCisgICAgICAiTUVTQV9GT1JNQVRfRVRDMl9SRzExX0VBQyIsCisgICAgICBHTF9SRywKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxMSwgMTEsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgNCwgNCwgMTYgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SMTFfRUFDLAorICAgICAgIk1FU0FfRk9STUFUX0VUQzJfU0lHTkVEX1IxMV9FQUMiLAorICAgICAgR0xfUkVELAorICAgICAgR0xfU0lHTkVEX05PUk1BTElaRUQsCisgICAgICAxMSwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SRzExX0VBQywKKyAgICAgICJNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SRzExX0VBQyIsCisgICAgICBHTF9SRywKKyAgICAgIEdMX1NJR05FRF9OT1JNQUxJWkVELAorICAgICAgMTEsIDExLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDQsIDQsIDE2ICAgICAgICAgICAgICAgICAgICAvKiAxNiBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorICAgeworICAgICAgTUVTQV9GT1JNQVRfRVRDMl9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTEsCisgICAgICAiTUVTQV9GT1JNQVRfRVRDMl9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTEiLAorICAgICAgR0xfUkdCQSwKKyAgICAgIEdMX1VOU0lHTkVEX05PUk1BTElaRUQsCisgICAgICA4LCA4LCA4LCAxLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDQsIDQsIDggICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGVzIHBlciA0eDQgYmxvY2sgKi8KKyAgIH0sCisgICB7CisgICAgICBNRVNBX0ZPUk1BVF9FVEMyX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTEsCisgICAgICAiTUVTQV9GT1JNQVRfRVRDMl9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExIiwKKyAgICAgIEdMX1JHQkEsCisgICAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVELAorICAgICAgOCwgOCwgOCwgMSwKKyAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICA0LCA0LCA4ICAgICAgICAgICAgICAgICAgICAgLyogOCBieXRlcyBwZXIgNHg0IGJsb2NrICovCisgICB9LAorfTsKKworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKgorX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKG1lc2FfZm9ybWF0IGZvcm1hdCkKK3sKKyAgIGNvbnN0IHN0cnVjdCBnbF9mb3JtYXRfaW5mbyAqaW5mbyA9ICZmb3JtYXRfaW5mb1tmb3JtYXRdOworICAgYXNzZXJ0KGluZm8tPk5hbWUgPT0gZm9ybWF0KTsKKyAgIHJldHVybiBpbmZvOworfQorCisKKy8qKiBSZXR1cm4gc3RyaW5nIG5hbWUgb2YgZm9ybWF0IChmb3IgZGVidWdnaW5nKSAqLworY29uc3QgY2hhciAqCitfbWVzYV9nZXRfZm9ybWF0X25hbWUobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICByZXR1cm4gaW5mby0+U3RyTmFtZTsKK30KKworCisKKy8qKgorICogUmV0dXJuIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBhIGJsb2NrIG9mIHBpeGVscyBpbiB0aGUgZ2l2ZW4gZm9ybWF0LgorICogTm9ybWFsbHksIGEgYmxvY2sgaXMgMXgxIChhIHNpbmdsZSBwaXhlbCkuICBCdXQgZm9yIGNvbXByZXNzZWQgZm9ybWF0cworICogYSBibG9jayBtYXkgYmUgNHg0IG9yIDh4NCwgZXRjLgorICoKKyAqIE5vdGU6IG5vdCBHTHVpbnQsIHNvIGFzIG5vdCB0byBjb2VyY2UgbWF0aCB0byB1bnNpZ25lZC4gY2YuIGZkbyAjMzczNTEKKyAqLworR0xpbnQKK19tZXNhX2dldF9mb3JtYXRfYnl0ZXMobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICBBU1NFUlQoaW5mby0+Qnl0ZXNQZXJCbG9jayk7CisgICBBU1NFUlQoaW5mby0+Qnl0ZXNQZXJCbG9jayA8PSBNQVhfUElYRUxfQllURVMgfHwKKyAgICAgICAgICBfbWVzYV9pc19mb3JtYXRfY29tcHJlc3NlZChmb3JtYXQpKTsKKyAgIHJldHVybiBpbmZvLT5CeXRlc1BlckJsb2NrOworfQorCisKKy8qKgorICogUmV0dXJuIGJpdHMgcGVyIGNvbXBvbmVudCBmb3IgdGhlIGdpdmVuIGZvcm1hdC4KKyAqIFxwYXJhbSBmb3JtYXQgIG9uZSBvZiBNRVNBX0ZPUk1BVF94CisgKiBccGFyYW0gcG5hbWUgIHRoZSBjb21wb25lbnQsIHN1Y2ggYXMgR0xfUkVEX0JJVFMsIEdMX1RFWFRVUkVfQkxVRV9CSVRTLCBldGMuCisgKi8KK0dMaW50CitfbWVzYV9nZXRfZm9ybWF0X2JpdHMobWVzYV9mb3JtYXQgZm9ybWF0LCBHTGVudW0gcG5hbWUpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKworICAgc3dpdGNoIChwbmFtZSkgeworICAgY2FzZSBHTF9SRURfQklUUzoKKyAgIGNhc2UgR0xfVEVYVFVSRV9SRURfU0laRToKKyAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX0VYVDoKKyAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRToKKyAgICAgIHJldHVybiBpbmZvLT5SZWRCaXRzOworICAgY2FzZSBHTF9HUkVFTl9CSVRTOgorICAgY2FzZSBHTF9URVhUVVJFX0dSRUVOX1NJWkU6CisgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX0VYVDoKKyAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFOgorICAgICAgcmV0dXJuIGluZm8tPkdyZWVuQml0czsKKyAgIGNhc2UgR0xfQkxVRV9CSVRTOgorICAgY2FzZSBHTF9URVhUVVJFX0JMVUVfU0laRToKKyAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9FWFQ6CisgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQkxVRV9TSVpFOgorICAgICAgcmV0dXJuIGluZm8tPkJsdWVCaXRzOworICAgY2FzZSBHTF9BTFBIQV9CSVRTOgorICAgY2FzZSBHTF9URVhUVVJFX0FMUEhBX1NJWkU6CisgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX0VYVDoKKyAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOgorICAgICAgcmV0dXJuIGluZm8tPkFscGhhQml0czsKKyAgIGNhc2UgR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRToKKyAgICAgIHJldHVybiBpbmZvLT5JbnRlbnNpdHlCaXRzOworICAgY2FzZSBHTF9URVhUVVJFX0xVTUlOQU5DRV9TSVpFOgorICAgICAgcmV0dXJuIGluZm8tPkx1bWluYW5jZUJpdHM7CisgICBjYXNlIEdMX0lOREVYX0JJVFM6CisgICAgICByZXR1cm4gaW5mby0+SW5kZXhCaXRzOworICAgY2FzZSBHTF9ERVBUSF9CSVRTOgorICAgY2FzZSBHTF9URVhUVVJFX0RFUFRIX1NJWkVfQVJCOgorICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9FWFQ6CisgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRToKKyAgICAgIHJldHVybiBpbmZvLT5EZXB0aEJpdHM7CisgICBjYXNlIEdMX1NURU5DSUxfQklUUzoKKyAgIGNhc2UgR0xfVEVYVFVSRV9TVEVOQ0lMX1NJWkVfRVhUOgorICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX0VYVDoKKyAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9TVEVOQ0lMX1NJWkU6CisgICAgICByZXR1cm4gaW5mby0+U3RlbmNpbEJpdHM7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiYmFkIHBuYW1lIGluIF9tZXNhX2dldF9mb3JtYXRfYml0cygpIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KK30KKworCitHTHVpbnQKK19tZXNhX2dldF9mb3JtYXRfbWF4X2JpdHMobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICBHTHVpbnQgbWF4ID0gTUFYMihpbmZvLT5SZWRCaXRzLCBpbmZvLT5HcmVlbkJpdHMpOworICAgbWF4ID0gTUFYMihtYXgsIGluZm8tPkJsdWVCaXRzKTsKKyAgIG1heCA9IE1BWDIobWF4LCBpbmZvLT5BbHBoYUJpdHMpOworICAgbWF4ID0gTUFYMihtYXgsIGluZm8tPkx1bWluYW5jZUJpdHMpOworICAgbWF4ID0gTUFYMihtYXgsIGluZm8tPkludGVuc2l0eUJpdHMpOworICAgbWF4ID0gTUFYMihtYXgsIGluZm8tPkRlcHRoQml0cyk7CisgICBtYXggPSBNQVgyKG1heCwgaW5mby0+U3RlbmNpbEJpdHMpOworICAgcmV0dXJuIG1heDsKK30KKworCisvKioKKyAqIFJldHVybiB0aGUgZGF0YSB0eXBlIChvciBtb3JlIHNwZWNpZmljYWxseSwgdGhlIGRhdGEgcmVwcmVzZW50YXRpb24pCisgKiBmb3IgdGhlIGdpdmVuIGZvcm1hdC4KKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBvbmUgb2Y6CisgKiAgICBHTF9VTlNJR05FRF9OT1JNQUxJWkVEID0gdW5zaWduZWQgaW50IHJlcHJlc2VudGluZyBbMCwxXQorICogICAgR0xfU0lHTkVEX05PUk1BTElaRUQgPSBzaWduZWQgaW50IHJlcHJlc2VudGluZyBbLTEsIDFdCisgKiAgICBHTF9VTlNJR05FRF9JTlQgPSBhbiBvcmRpbmFyeSB1bnNpZ25lZCBpbnRlZ2VyCisgKiAgICBHTF9JTlQgPSBhbiBvcmRpbmFyeSBzaWduZWQgaW50ZWdlcgorICogICAgR0xfRkxPQVQgPSBhbiBvcmRpbmFyeSBmbG9hdAorICovCitHTGVudW0KK19tZXNhX2dldF9mb3JtYXRfZGF0YXR5cGUobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICByZXR1cm4gaW5mby0+RGF0YVR5cGU7Cit9CisKKworLyoqCisgKiBSZXR1cm4gdGhlIGJhc2ljIGZvcm1hdCBmb3IgdGhlIGdpdmVuIHR5cGUuICBUaGUgcmVzdWx0IHdpbGwgYmUgb25lIG9mCisgKiBHTF9SR0IsIEdMX1JHQkEsIEdMX0FMUEhBLCBHTF9MVU1JTkFOQ0UsIEdMX0xVTUlOQU5DRV9BTFBIQSwgR0xfSU5URU5TSVRZLAorICogR0xfWUNCQ1JfTUVTQSwgR0xfREVQVEhfQ09NUE9ORU5ULCBHTF9TVEVOQ0lMX0lOREVYLCBHTF9ERVBUSF9TVEVOQ0lMLgorICovCitHTGVudW0KK19tZXNhX2dldF9mb3JtYXRfYmFzZV9mb3JtYXQobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICByZXR1cm4gaW5mby0+QmFzZUZvcm1hdDsKK30KKworCisvKioKKyAqIFJldHVybiB0aGUgYmxvY2sgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgdGhlIGdpdmVuIGZvcm1hdC4gIE5vcm1hbGx5CisgKiB0aGUgYmxvY2sgc2l6ZSBpcyAxeDEuICBCdXQgY29tcHJlc3NlZCBmb3JtYXRzIHdpbGwgaGF2ZSBibG9jayBzaXplcworICogb2YgNHg0IG9yIDh4NCBwaXhlbHMsIGV0Yy4KKyAqIFxwYXJhbSBidyAgcmV0dXJucyBibG9jayB3aWR0aCBpbiBwaXhlbHMKKyAqIFxwYXJhbSBiaCAgcmV0dXJucyBibG9jayBoZWlnaHQgaW4gcGl4ZWxzCisgKi8KK3ZvaWQKK19tZXNhX2dldF9mb3JtYXRfYmxvY2tfc2l6ZShtZXNhX2Zvcm1hdCBmb3JtYXQsIEdMdWludCAqYncsIEdMdWludCAqYmgpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKyAgICpidyA9IGluZm8tPkJsb2NrV2lkdGg7CisgICAqYmggPSBpbmZvLT5CbG9ja0hlaWdodDsKK30KKworCisvKiogSXMgdGhlIGdpdmVuIGZvcm1hdCBhIGNvbXByZXNzZWQgZm9ybWF0PyAqLworR0xib29sZWFuCitfbWVzYV9pc19mb3JtYXRfY29tcHJlc3NlZChtZXNhX2Zvcm1hdCBmb3JtYXQpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKyAgIHJldHVybiBpbmZvLT5CbG9ja1dpZHRoID4gMSB8fCBpbmZvLT5CbG9ja0hlaWdodCA+IDE7Cit9CisKKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGdpdmVuIGZvcm1hdCByZXByZXNlbnRzIGEgcGFja2VkIGRlcHRoL3N0ZW5jaWwgYnVmZmVyLgorICovCitHTGJvb2xlYW4KK19tZXNhX2lzX2Zvcm1hdF9wYWNrZWRfZGVwdGhfc3RlbmNpbChtZXNhX2Zvcm1hdCBmb3JtYXQpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKworICAgcmV0dXJuIGluZm8tPkJhc2VGb3JtYXQgPT0gR0xfREVQVEhfU1RFTkNJTDsKK30KKworCisvKioKKyAqIElzIHRoZSBnaXZlbiBmb3JtYXQgYSBzaWduZWQvdW5zaWduZWQgaW50ZWdlciBjb2xvciBmb3JtYXQ/CisgKi8KK0dMYm9vbGVhbgorX21lc2FfaXNfZm9ybWF0X2ludGVnZXJfY29sb3IobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICByZXR1cm4gKGluZm8tPkRhdGFUeXBlID09IEdMX0lOVCB8fCBpbmZvLT5EYXRhVHlwZSA9PSBHTF9VTlNJR05FRF9JTlQpICYmCisgICAgICBpbmZvLT5CYXNlRm9ybWF0ICE9IEdMX0RFUFRIX0NPTVBPTkVOVCAmJgorICAgICAgaW5mby0+QmFzZUZvcm1hdCAhPSBHTF9ERVBUSF9TVEVOQ0lMICYmCisgICAgICBpbmZvLT5CYXNlRm9ybWF0ICE9IEdMX1NURU5DSUxfSU5ERVg7Cit9CisKKworLyoqCisgKiBJcyB0aGUgZ2l2ZW4gZm9ybWF0IGFuIHVuc2lnbmVkIGludGVnZXIgZm9ybWF0PworICovCitHTGJvb2xlYW4KK19tZXNhX2lzX2Zvcm1hdF91bnNpZ25lZChtZXNhX2Zvcm1hdCBmb3JtYXQpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKyAgIHJldHVybiBfbWVzYV9pc190eXBlX3Vuc2lnbmVkKGluZm8tPkRhdGFUeXBlKTsKK30KKworCisvKioKKyAqIERvZXMgdGhlIGdpdmVuIGZvcm1hdCBzdG9yZSBzaWduZWQgdmFsdWVzPworICovCitHTGJvb2xlYW4KK19tZXNhX2lzX2Zvcm1hdF9zaWduZWQobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgaWYgKGZvcm1hdCA9PSBNRVNBX0ZPUk1BVF9SMTFHMTFCMTBfRkxPQVQgfHwgCisgICAgICAgZm9ybWF0ID09IE1FU0FfRk9STUFUX1I5RzlCOUU1X0ZMT0FUKSB7CisgICAgICAvKiB0aGVzZSBwYWNrZWQgZmxvYXQgZm9ybWF0cyBvbmx5IHN0b3JlIHVuc2lnbmVkIHZhbHVlcyAqLworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorICAgZWxzZSB7CisgICAgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKyAgICAgIHJldHVybiAoaW5mby0+RGF0YVR5cGUgPT0gR0xfU0lHTkVEX05PUk1BTElaRUQgfHwKKyAgICAgICAgICAgICAgaW5mby0+RGF0YVR5cGUgPT0gR0xfSU5UIHx8CisgICAgICAgICAgICAgIGluZm8tPkRhdGFUeXBlID09IEdMX0ZMT0FUKTsKKyAgIH0KK30KKworLyoqCisgKiBJcyB0aGUgZ2l2ZW4gZm9ybWF0IGFuIGludGVnZXIgZm9ybWF0PworICovCitHTGJvb2xlYW4KK19tZXNhX2lzX2Zvcm1hdF9pbnRlZ2VyKG1lc2FfZm9ybWF0IGZvcm1hdCkKK3sKKyAgIGNvbnN0IHN0cnVjdCBnbF9mb3JtYXRfaW5mbyAqaW5mbyA9IF9tZXNhX2dldF9mb3JtYXRfaW5mbyhmb3JtYXQpOworICAgcmV0dXJuIChpbmZvLT5EYXRhVHlwZSA9PSBHTF9JTlQgfHwgaW5mby0+RGF0YVR5cGUgPT0gR0xfVU5TSUdORURfSU5UKTsKK30KKworLyoqCisgKiBSZXR1cm4gY29sb3IgZW5jb2RpbmcgZm9yIGdpdmVuIGZvcm1hdC4KKyAqIFxyZXR1cm4gR0xfTElORUFSIG9yIEdMX1NSR0IKKyAqLworR0xlbnVtCitfbWVzYV9nZXRfZm9ybWF0X2NvbG9yX2VuY29kaW5nKG1lc2FfZm9ybWF0IGZvcm1hdCkKK3sKKyAgIC8qIFhYWCB0aGlzIGluZm8gc2hvdWxkIGJlIGVuY29kZWQgaW4gZ2xfZm9ybWF0X2luZm8gKi8KKyAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICBjYXNlIE1FU0FfRk9STUFUX0JHUl9TUkdCODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQThCOEc4UjhfU1JHQjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjhHOFI4QThfU1JHQjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjhHOEI4QThfU1JHQjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TUkdCODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTDhBOF9TUkdCOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9TUkdCX0RYVDE6CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDE6CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDM6CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDU6CisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhCOFg4X1NSR0I6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU1JHQjg6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU1JHQjhfQUxQSEE4X0VBQzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9COEc4UjhYOF9TUkdCOgorICAgICAgcmV0dXJuIEdMX1NSR0I7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdMX0xJTkVBUjsKKyAgIH0KK30KKworCisvKioKKyAqIEZvciBhbiBzUkdCIGZvcm1hdCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGxpbmVhciBjb2xvciBzcGFjZSBmb3JtYXQuCisgKiBGb3Igbm9uLXNSR0IgZm9ybWF0cywgcmV0dXJuIHRoZSBmb3JtYXQgYXMtaXMuCisgKi8KK21lc2FfZm9ybWF0CitfbWVzYV9nZXRfc3JnYl9mb3JtYXRfbGluZWFyKG1lc2FfZm9ybWF0IGZvcm1hdCkKK3sKKyAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICBjYXNlIE1FU0FfRk9STUFUX0JHUl9TUkdCODoKKyAgICAgIGZvcm1hdCA9IE1FU0FfRk9STUFUX0JHUl9VTk9STTg7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQThCOEc4UjhfU1JHQjoKKyAgICAgIGZvcm1hdCA9IE1FU0FfRk9STUFUX0E4QjhHOFI4X1VOT1JNOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfRk9STUFUX0I4RzhSOEE4X1NSR0I6CisgICAgICBmb3JtYXQgPSBNRVNBX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SOEc4QjhBOF9TUkdCOgorICAgICAgZm9ybWF0ID0gTUVTQV9GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TUkdCODoKKyAgICAgIGZvcm1hdCA9IE1FU0FfRk9STUFUX0xfVU5PUk04OworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfRk9STUFUX0w4QThfU1JHQjoKKyAgICAgIGZvcm1hdCA9IE1FU0FfRk9STUFUX0w4QThfVU5PUk07CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQl9EWFQxOgorICAgICAgZm9ybWF0ID0gTUVTQV9GT1JNQVRfUkdCX0RYVDE7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQkFfRFhUMToKKyAgICAgIGZvcm1hdCA9IE1FU0FfRk9STUFUX1JHQkFfRFhUMTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBNRVNBX0ZPUk1BVF9TUkdCQV9EWFQzOgorICAgICAgZm9ybWF0ID0gTUVTQV9GT1JNQVRfUkdCQV9EWFQzOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDU6CisgICAgICBmb3JtYXQgPSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDU7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjhHOEI4WDhfU1JHQjoKKyAgICAgIGZvcm1hdCA9IE1FU0FfRk9STUFUX1I4RzhCOFg4X1VOT1JNOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU1JHQjg6CisgICAgICBmb3JtYXQgPSBNRVNBX0ZPUk1BVF9FVEMyX1JHQjg7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9TUkdCOF9BTFBIQThfRUFDOgorICAgICAgZm9ybWF0ID0gTUVTQV9GT1JNQVRfRVRDMl9SR0JBOF9FQUM7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExOgorICAgICAgZm9ybWF0ID0gTUVTQV9GT1JNQVRfRVRDMl9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTE7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjhHOFI4WDhfU1JHQjoKKyAgICAgIGZvcm1hdCA9IE1FU0FfRk9STUFUX0I4RzhSOFg4X1VOT1JNOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gZm9ybWF0OworfQorCisKKy8qKgorICogSWYgdGhlIGdpdmVuIGZvcm1hdCBpcyBhIGNvbXByZXNzZWQgZm9ybWF0LCByZXR1cm4gYSBjb3JyZXNwb25kaW5nCisgKiB1bmNvbXByZXNzZWQgZm9ybWF0LgorICovCittZXNhX2Zvcm1hdAorX21lc2FfZ2V0X3VuY29tcHJlc3NlZF9mb3JtYXQobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX0ZYVDE6CisgICAgICByZXR1cm4gTUVTQV9GT1JNQVRfQkdSX1VOT1JNODsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9GWFQxOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX0E4QjhHOFI4X1VOT1JNOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRFhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQl9EWFQxOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX0JHUl9VTk9STTg7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfRFhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQkFfRFhUMToKKyAgICAgIHJldHVybiBNRVNBX0ZPUk1BVF9BOEI4RzhSOF9VTk9STTsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9EWFQzOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9TUkdCQV9EWFQzOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX0E4QjhHOFI4X1VOT1JNOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDU6CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDU6CisgICAgICByZXR1cm4gTUVTQV9GT1JNQVRfQThCOEc4UjhfVU5PUk07CisgICBjYXNlIE1FU0FfRk9STUFUX1JfUkdUQzFfVU5PUk06CisgICAgICByZXR1cm4gTUVTQV9GT1JNQVRfUl9VTk9STTg7CisgICBjYXNlIE1FU0FfRk9STUFUX1JfUkdUQzFfU05PUk06CisgICAgICByZXR1cm4gTUVTQV9GT1JNQVRfUl9TTk9STTg7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHX1JHVEMyX1VOT1JNOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX1I4RzhfVU5PUk07CisgICBjYXNlIE1FU0FfRk9STUFUX1JHX1JHVEMyX1NOT1JNOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX1I4RzhfU05PUk07CisgICBjYXNlIE1FU0FfRk9STUFUX0xfTEFUQzFfVU5PUk06CisgICAgICByZXR1cm4gTUVTQV9GT1JNQVRfTF9VTk9STTg7CisgICBjYXNlIE1FU0FfRk9STUFUX0xfTEFUQzFfU05PUk06CisgICAgICByZXR1cm4gTUVTQV9GT1JNQVRfTF9TTk9STTg7CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX0xBVEMyX1VOT1JNOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX0w4QThfVU5PUk07CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX0xBVEMyX1NOT1JNOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX0w4QThfU05PUk07CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzFfUkdCODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9SR0I4OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1NSR0I4OgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX0JHUl9VTk9STTg7CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfUkdCQThfRUFDOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1NSR0I4X0FMUEhBOF9FQUM6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTE6CisgICAgICByZXR1cm4gTUVTQV9GT1JNQVRfQThCOEc4UjhfVU5PUk07CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfUjExX0VBQzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9TSUdORURfUjExX0VBQzoKKyAgICAgIHJldHVybiBNRVNBX0ZPUk1BVF9SX1VOT1JNMTY7CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfUkcxMV9FQUM6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU0lHTkVEX1JHMTFfRUFDOgorICAgICAgcmV0dXJuIE1FU0FfRk9STUFUX1IxNkcxNl9VTk9STTsKKyAgIGRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKyAgICAgIGFzc2VydCghX21lc2FfaXNfZm9ybWF0X2NvbXByZXNzZWQoZm9ybWF0KSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBmb3JtYXQ7CisgICB9Cit9CisKKworR0x1aW50CitfbWVzYV9mb3JtYXRfbnVtX2NvbXBvbmVudHMobWVzYV9mb3JtYXQgZm9ybWF0KQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICByZXR1cm4gKChpbmZvLT5SZWRCaXRzID4gMCkgKworICAgICAgICAgICAoaW5mby0+R3JlZW5CaXRzID4gMCkgKworICAgICAgICAgICAoaW5mby0+Qmx1ZUJpdHMgPiAwKSArCisgICAgICAgICAgIChpbmZvLT5BbHBoYUJpdHMgPiAwKSArCisgICAgICAgICAgIChpbmZvLT5MdW1pbmFuY2VCaXRzID4gMCkgKworICAgICAgICAgICAoaW5mby0+SW50ZW5zaXR5Qml0cyA+IDApICsKKyAgICAgICAgICAgKGluZm8tPkRlcHRoQml0cyA+IDApICsKKyAgICAgICAgICAgKGluZm8tPlN0ZW5jaWxCaXRzID4gMCkpOworfQorCisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIGEgY29sb3IgZm9ybWF0IGhhcyBkYXRhIHN0b3JlZCBpbiB0aGUgUi9HL0IvQSBjaGFubmVscywKKyAqIGdpdmVuIGFuIGluZGV4IGZyb20gMCB0byAzLgorICovCitib29sCitfbWVzYV9mb3JtYXRfaGFzX2NvbG9yX2NvbXBvbmVudChtZXNhX2Zvcm1hdCBmb3JtYXQsIGludCBjb21wb25lbnQpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKworICAgYXNzZXJ0KGluZm8tPkJhc2VGb3JtYXQgIT0gR0xfREVQVEhfQ09NUE9ORU5UICYmCisgICAgICAgICAgaW5mby0+QmFzZUZvcm1hdCAhPSBHTF9ERVBUSF9TVEVOQ0lMICYmCisgICAgICAgICAgaW5mby0+QmFzZUZvcm1hdCAhPSBHTF9TVEVOQ0lMX0lOREVYKTsKKworICAgc3dpdGNoIChjb21wb25lbnQpIHsKKyAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAoaW5mby0+UmVkQml0cyArIGluZm8tPkludGVuc2l0eUJpdHMgKyBpbmZvLT5MdW1pbmFuY2VCaXRzKSA+IDA7CisgICBjYXNlIDE6CisgICAgICByZXR1cm4gKGluZm8tPkdyZWVuQml0cyArIGluZm8tPkludGVuc2l0eUJpdHMgKyBpbmZvLT5MdW1pbmFuY2VCaXRzKSA+IDA7CisgICBjYXNlIDI6CisgICAgICByZXR1cm4gKGluZm8tPkJsdWVCaXRzICsgaW5mby0+SW50ZW5zaXR5Qml0cyArIGluZm8tPkx1bWluYW5jZUJpdHMpID4gMDsKKyAgIGNhc2UgMzoKKyAgICAgIHJldHVybiAoaW5mby0+QWxwaGFCaXRzICsgaW5mby0+SW50ZW5zaXR5Qml0cykgPiAwOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIkludmFsaWQgY29sb3IgY29tcG9uZW50OiBtdXN0IGJlIDAuLjMiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KKworCisvKioKKyAqIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIGFuIGltYWdlIG9mIHRoZSBnaXZlbiBzaXplCisgKiBpbiB0aGUgZ2l2ZW4gZm9ybWF0LgorICovCitHTHVpbnQKK19tZXNhX2Zvcm1hdF9pbWFnZV9zaXplKG1lc2FfZm9ybWF0IGZvcm1hdCwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKQoreworICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGZvcm1hdCk7CisgICAvKiBTdHJpY3RseSBzcGVha2luZywgYSBjb25kaXRpb25hbCBpc24ndCBuZWVkZWQgaGVyZSAqLworICAgaWYgKGluZm8tPkJsb2NrV2lkdGggPiAxIHx8IGluZm8tPkJsb2NrSGVpZ2h0ID4gMSkgeworICAgICAgLyogY29tcHJlc3NlZCBmb3JtYXQgKDJEIG9ubHkgZm9yIG5vdykgKi8KKyAgICAgIGNvbnN0IEdMdWludCBidyA9IGluZm8tPkJsb2NrV2lkdGgsIGJoID0gaW5mby0+QmxvY2tIZWlnaHQ7CisgICAgICBjb25zdCBHTHVpbnQgd2Jsb2NrcyA9ICh3aWR0aCArIGJ3IC0gMSkgLyBidzsKKyAgICAgIGNvbnN0IEdMdWludCBoYmxvY2tzID0gKGhlaWdodCArIGJoIC0gMSkgLyBiaDsKKyAgICAgIGNvbnN0IEdMdWludCBzeiA9IHdibG9ja3MgKiBoYmxvY2tzICogaW5mby0+Qnl0ZXNQZXJCbG9jazsKKyAgICAgIHJldHVybiBzeiAqIGRlcHRoOworICAgfQorICAgZWxzZSB7CisgICAgICAvKiBub24tY29tcHJlc3NlZCAqLworICAgICAgY29uc3QgR0x1aW50IHN6ID0gd2lkdGggKiBoZWlnaHQgKiBkZXB0aCAqIGluZm8tPkJ5dGVzUGVyQmxvY2s7CisgICAgICByZXR1cm4gc3o7CisgICB9Cit9CisKKworLyoqCisgKiBTYW1lIGFzIF9tZXNhX2Zvcm1hdF9pbWFnZV9zaXplKCkgYnV0IHJldHVybnMgYSA2NC1iaXQgdmFsdWUgdG8KKyAqIGFjY29tbW9kYXRlIHZlcnkgbGFyZ2UgdGV4dHVyZXMuCisgKi8KK3VpbnQ2NF90CitfbWVzYV9mb3JtYXRfaW1hZ2Vfc2l6ZTY0KG1lc2FfZm9ybWF0IGZvcm1hdCwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKyAgIC8qIFN0cmljdGx5IHNwZWFraW5nLCBhIGNvbmRpdGlvbmFsIGlzbid0IG5lZWRlZCBoZXJlICovCisgICBpZiAoaW5mby0+QmxvY2tXaWR0aCA+IDEgfHwgaW5mby0+QmxvY2tIZWlnaHQgPiAxKSB7CisgICAgICAvKiBjb21wcmVzc2VkIGZvcm1hdCAoMkQgb25seSBmb3Igbm93KSAqLworICAgICAgY29uc3QgdWludDY0X3QgYncgPSBpbmZvLT5CbG9ja1dpZHRoLCBiaCA9IGluZm8tPkJsb2NrSGVpZ2h0OworICAgICAgY29uc3QgdWludDY0X3Qgd2Jsb2NrcyA9ICh3aWR0aCArIGJ3IC0gMSkgLyBidzsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IGhibG9ja3MgPSAoaGVpZ2h0ICsgYmggLSAxKSAvIGJoOworICAgICAgY29uc3QgdWludDY0X3Qgc3ogPSB3YmxvY2tzICogaGJsb2NrcyAqIGluZm8tPkJ5dGVzUGVyQmxvY2s7CisgICAgICByZXR1cm4gc3ogKiBkZXB0aDsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogbm9uLWNvbXByZXNzZWQgKi8KKyAgICAgIGNvbnN0IHVpbnQ2NF90IHN6ID0gKCh1aW50NjRfdCkgd2lkdGggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSBoZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSBkZXB0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5CeXRlc1BlckJsb2NrKTsKKyAgICAgIHJldHVybiBzejsKKyAgIH0KK30KKworCisKK0dMaW50CitfbWVzYV9mb3JtYXRfcm93X3N0cmlkZShtZXNhX2Zvcm1hdCBmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZm9ybWF0X2luZm8gKmluZm8gPSBfbWVzYV9nZXRfZm9ybWF0X2luZm8oZm9ybWF0KTsKKyAgIC8qIFN0cmljdGx5IHNwZWFraW5nLCBhIGNvbmRpdGlvbmFsIGlzbid0IG5lZWRlZCBoZXJlICovCisgICBpZiAoaW5mby0+QmxvY2tXaWR0aCA+IDEgfHwgaW5mby0+QmxvY2tIZWlnaHQgPiAxKSB7CisgICAgICAvKiBjb21wcmVzc2VkIGZvcm1hdCAqLworICAgICAgY29uc3QgR0x1aW50IGJ3ID0gaW5mby0+QmxvY2tXaWR0aDsKKyAgICAgIGNvbnN0IEdMdWludCB3YmxvY2tzID0gKHdpZHRoICsgYncgLSAxKSAvIGJ3OworICAgICAgY29uc3QgR0xpbnQgc3RyaWRlID0gd2Jsb2NrcyAqIGluZm8tPkJ5dGVzUGVyQmxvY2s7CisgICAgICByZXR1cm4gc3RyaWRlOworICAgfQorICAgZWxzZSB7CisgICAgICBjb25zdCBHTGludCBzdHJpZGUgPSB3aWR0aCAqIGluZm8tPkJ5dGVzUGVyQmxvY2s7CisgICAgICByZXR1cm4gc3RyaWRlOworICAgfQorfQorCisKKy8qKgorICogRGVidWcvdGVzdDogY2hlY2sgdGhhdCBhbGwgZm9ybWF0cyBhcmUgaGFuZGxlZCBpbiB0aGUKKyAqIF9tZXNhX2Zvcm1hdF90b190eXBlX2FuZF9jb21wcygpIGZ1bmN0aW9uLiAgV2hlbiBuZXcgcGl4ZWwgZm9ybWF0cworICogYXJlIGFkZGVkIHRvIE1lc2EsIHRoYXQgZnVuY3Rpb24gbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAqIFRoaXMgaXMgYSBuby1vcCBhZnRlciB0aGUgZmlyc3QgY2FsbC4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2Zvcm1hdF90b190eXBlX2FuZF9jb21wcyh2b2lkKQoreworICAgbWVzYV9mb3JtYXQgZjsKKworICAgZm9yIChmID0gTUVTQV9GT1JNQVRfTk9ORSArIDE7IGYgPCBNRVNBX0ZPUk1BVF9DT1VOVDsgZisrKSB7CisgICAgICBHTGVudW0gZGF0YXR5cGUgPSAwOworICAgICAgR0x1aW50IGNvbXBzID0gMDsKKyAgICAgIC8qIFRoaXMgZnVuY3Rpb24gd2lsbCBlbWl0IGEgcHJvYmxlbS93YXJuaW5nIGlmIHRoZSBmb3JtYXQgaXMKKyAgICAgICAqIG5vdCBoYW5kbGVkLgorICAgICAgICovCisgICAgICBfbWVzYV9mb3JtYXRfdG9fdHlwZV9hbmRfY29tcHMoZiwgJmRhdGF0eXBlLCAmY29tcHMpOworICAgfQorfQorCisKKy8qKgorICogRG8gc2FuaXR5IGNoZWNraW5nIG9mIHRoZSBmb3JtYXQgaW5mbyB0YWJsZS4KKyAqLwordm9pZAorX21lc2FfdGVzdF9mb3JtYXRzKHZvaWQpCit7CisgICBHTHVpbnQgaTsKKworICAgU1RBVElDX0FTU0VSVChFbGVtZW50cyhmb3JtYXRfaW5mbykgPT0gTUVTQV9GT1JNQVRfQ09VTlQpOworCisgICBmb3IgKGkgPSAwOyBpIDwgTUVTQV9GT1JNQVRfQ09VTlQ7IGkrKykgeworICAgICAgY29uc3Qgc3RydWN0IGdsX2Zvcm1hdF9pbmZvICppbmZvID0gX21lc2FfZ2V0X2Zvcm1hdF9pbmZvKGkpOworICAgICAgYXNzZXJ0KGluZm8pOworCisgICAgICBhc3NlcnQoaW5mby0+TmFtZSA9PSBpKTsKKworICAgICAgaWYgKGluZm8tPk5hbWUgPT0gTUVTQV9GT1JNQVRfTk9ORSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoaW5mby0+QmxvY2tXaWR0aCA9PSAxICYmIGluZm8tPkJsb2NrSGVpZ2h0ID09IDEpIHsKKyAgICAgICAgIGlmIChpbmZvLT5SZWRCaXRzID4gMCkgeworICAgICAgICAgICAgR0x1aW50IHQgPSBpbmZvLT5SZWRCaXRzICsgaW5mby0+R3JlZW5CaXRzCisgICAgICAgICAgICAgICArIGluZm8tPkJsdWVCaXRzICsgaW5mby0+QWxwaGFCaXRzOworICAgICAgICAgICAgYXNzZXJ0KHQgLyA4IDw9IGluZm8tPkJ5dGVzUGVyQmxvY2spOworICAgICAgICAgICAgKHZvaWQpIHQ7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFzc2VydChpbmZvLT5EYXRhVHlwZSA9PSBHTF9VTlNJR05FRF9OT1JNQUxJWkVEIHx8CisgICAgICAgICAgICAgaW5mby0+RGF0YVR5cGUgPT0gR0xfU0lHTkVEX05PUk1BTElaRUQgfHwKKyAgICAgICAgICAgICBpbmZvLT5EYXRhVHlwZSA9PSBHTF9VTlNJR05FRF9JTlQgfHwKKyAgICAgICAgICAgICBpbmZvLT5EYXRhVHlwZSA9PSBHTF9JTlQgfHwKKyAgICAgICAgICAgICBpbmZvLT5EYXRhVHlwZSA9PSBHTF9GTE9BVCB8fAorICAgICAgICAgICAgIC8qIFozMl9GTE9BVF9YMjRTOCBoYXMgRGF0YVR5cGUgb2YgR0xfTk9ORSAqLworICAgICAgICAgICAgIGluZm8tPkRhdGFUeXBlID09IEdMX05PTkUpOworCisgICAgICBpZiAoaW5mby0+QmFzZUZvcm1hdCA9PSBHTF9SR0IpIHsKKyAgICAgICAgIGFzc2VydChpbmZvLT5SZWRCaXRzID4gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+R3JlZW5CaXRzID4gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+Qmx1ZUJpdHMgPiAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5BbHBoYUJpdHMgPT0gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+THVtaW5hbmNlQml0cyA9PSAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5JbnRlbnNpdHlCaXRzID09IDApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaW5mby0+QmFzZUZvcm1hdCA9PSBHTF9SR0JBKSB7CisgICAgICAgICBhc3NlcnQoaW5mby0+UmVkQml0cyA+IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkdyZWVuQml0cyA+IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkJsdWVCaXRzID4gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+QWxwaGFCaXRzID4gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+THVtaW5hbmNlQml0cyA9PSAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5JbnRlbnNpdHlCaXRzID09IDApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaW5mby0+QmFzZUZvcm1hdCA9PSBHTF9SRykgeworICAgICAgICAgYXNzZXJ0KGluZm8tPlJlZEJpdHMgPiAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5HcmVlbkJpdHMgPiAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5CbHVlQml0cyA9PSAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5BbHBoYUJpdHMgPT0gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+THVtaW5hbmNlQml0cyA9PSAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5JbnRlbnNpdHlCaXRzID09IDApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaW5mby0+QmFzZUZvcm1hdCA9PSBHTF9SRUQpIHsKKyAgICAgICAgIGFzc2VydChpbmZvLT5SZWRCaXRzID4gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+R3JlZW5CaXRzID09IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkJsdWVCaXRzID09IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkFscGhhQml0cyA9PSAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5MdW1pbmFuY2VCaXRzID09IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkludGVuc2l0eUJpdHMgPT0gMCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpbmZvLT5CYXNlRm9ybWF0ID09IEdMX0xVTUlOQU5DRSkgeworICAgICAgICAgYXNzZXJ0KGluZm8tPlJlZEJpdHMgPT0gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+R3JlZW5CaXRzID09IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkJsdWVCaXRzID09IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkFscGhhQml0cyA9PSAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5MdW1pbmFuY2VCaXRzID4gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+SW50ZW5zaXR5Qml0cyA9PSAwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGluZm8tPkJhc2VGb3JtYXQgPT0gR0xfSU5URU5TSVRZKSB7CisgICAgICAgICBhc3NlcnQoaW5mby0+UmVkQml0cyA9PSAwKTsKKyAgICAgICAgIGFzc2VydChpbmZvLT5HcmVlbkJpdHMgPT0gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+Qmx1ZUJpdHMgPT0gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+QWxwaGFCaXRzID09IDApOworICAgICAgICAgYXNzZXJ0KGluZm8tPkx1bWluYW5jZUJpdHMgPT0gMCk7CisgICAgICAgICBhc3NlcnQoaW5mby0+SW50ZW5zaXR5Qml0cyA+IDApOworICAgICAgfQorICAgfQorCisgICBjaGVja19mb3JtYXRfdG9fdHlwZV9hbmRfY29tcHMoKTsKK30KKworCisKKy8qKgorICogUmV0dXJuIGRhdGF0eXBlIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cyBwZXIgdGV4ZWwgZm9yIHRoZSBnaXZlbiBtZXNhX2Zvcm1hdC4KKyAqIE9ubHkgdXNlZCBmb3IgbWlwbWFwIGdlbmVyYXRpb24gY29kZS4KKyAqLwordm9pZAorX21lc2FfZm9ybWF0X3RvX3R5cGVfYW5kX2NvbXBzKG1lc2FfZm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gKmRhdGF0eXBlLCBHTHVpbnQgKmNvbXBzKQoreworICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQThCOEc4UjhfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhCOEE4X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9COEc4UjhBOF9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQThSOEc4QjhfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1g4QjhHOFI4X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SOEc4QjhYOF9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjhHOFI4WDhfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1g4UjhHOEI4X1VOT1JNOgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX0JHUl9VTk9STTg6CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9VTk9STTg6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgKmNvbXBzID0gMzsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjVHNlI1X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SNUc2QjVfVU5PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKKyAgICAgICpjb21wcyA9IDM7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjRHNFI0QTRfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0E0UjRHNEI0X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9CNEc0UjRYNF9VTk9STToKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0I1RzVSNUExX1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9BMVI1RzVCNV9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjVHNVI1WDFfVU5PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVjsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjEwRzEwUjEwQTJfVU5PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVY7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0ExQjVHNVI1X1VOT1JNOgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTDRBNF9VTk9STToKKyAgICAgICpkYXRhdHlwZSA9IE1FU0FfVU5TSUdORURfQllURV80XzQ7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0w4QThfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0E4TDhfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0c4UjhfVU5PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9MMTZBMTZfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0ExNkwxNl9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjE2RzE2X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9HMTZSMTZfVU5PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9VTk9STTE2OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9BX1VOT1JNMTY6CisgICBjYXNlIE1FU0FfRk9STUFUX0xfVU5PUk0xNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9VTk9STTE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfU0hPUlQ7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0IyRzNSM19VTk9STToKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEVfM18zXzI7CisgICAgICAqY29tcHMgPSAzOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0FfVU5PUk04OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1VOT1JNODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9VTk9STTg6CisgICBjYXNlIE1FU0FfRk9STUFUX1JfVU5PUk04OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9TX1VJTlQ4OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfWUNCQ1I6CisgICBjYXNlIE1FU0FfRk9STUFUX1lDQkNSX1JFVjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9TOF9VSU5UX1oyNF9VTk9STToKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVF8yNF84X01FU0E7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1oyNF9VTk9STV9TOF9VSU5UOgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfSU5UXzhfMjRfUkVWX01FU0E7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1pfVU5PUk0xNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUOworICAgICAgKmNvbXBzID0gMTsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9aMjRfVU5PUk1fWDhfVUlOVDoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVDsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfWDhfVUlOVF9aMjRfVU5PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9JTlQ7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1pfVU5PUk0zMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVDsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfWl9GTE9BVDMyOgorICAgICAgKmRhdGF0eXBlID0gR0xfRkxPQVQ7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1ozMl9GTE9BVF9TOFgyNF9VSU5UOgorICAgICAgKmRhdGF0eXBlID0gR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWOworICAgICAgKmNvbXBzID0gMTsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9EVURWODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0JZVEU7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JfU05PUk04OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9BX1NOT1JNODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TTk9STTg6CisgICBjYXNlIE1FU0FfRk9STUFUX0lfU05PUk04OgorICAgICAgKmRhdGF0eXBlID0gR0xfQllURTsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhfU05PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0w4QThfU05PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9CWVRFOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQThCOEc4UjhfU05PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhCOEE4X1NOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9YOEI4RzhSOF9TTk9STToKKyAgICAgICpkYXRhdHlwZSA9IEdMX0JZVEU7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfVU5PUk0xNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUOworICAgICAgKmNvbXBzID0gNDsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SX1NOT1JNMTY6CisgICBjYXNlIE1FU0FfRk9STUFUX0FfU05PUk0xNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TTk9STTE2OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1NOT1JNMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1IxNkcxNl9TTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfU05PUk0xNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1NIT1JUOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX1NOT1JNMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDM7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfU05PUk0xNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1NIT1JUOworICAgICAgKmNvbXBzID0gNDsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9CR1JfU1JHQjg6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgKmNvbXBzID0gMzsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQThCOEc4UjhfU1JHQjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjhHOFI4QThfU1JHQjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjhHOEI4QThfU1JHQjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1NSR0I4OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX0w4QThfU1JHQjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9GWFQxOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0ZYVDE6CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9EWFQxOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDE6CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfRFhUMzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9EWFQ1OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9TUkdCX0RYVDE6CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDE6CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDM6CisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JBX0RYVDU6CisgICBjYXNlIE1FU0FfRk9STUFUX1JfUkdUQzFfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1JfUkdUQzFfU05PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1JHX1JHVEMyX1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR19SR1RDMl9TTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9MQVRDMV9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9MQVRDMV9TTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfTEFUQzJfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX0xBVEMyX1NOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMxX1JHQjg6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfUkdCODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9TUkdCODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9SR0JBOF9FQUM6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU1JHQjhfQUxQSEE4X0VBQzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9SMTFfRUFDOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1JHMTFfRUFDOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SMTFfRUFDOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SRzExX0VBQzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTE6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU1JHQjhfUFVOQ0hUSFJPVUdIX0FMUEhBMToKKyAgICAgIC8qIFhYWCBnZW5lcmF0ZSBlcnJvciBpbnN0ZWFkPyAqLworICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICpjb21wcyA9IDA7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9GTE9BVDMyOgorICAgICAgKmRhdGF0eXBlID0gR0xfRkxPQVQ7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0ZMT0FUMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9IQUxGX0ZMT0FUX0FSQjsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9GTE9BVDMyOgorICAgICAgKmRhdGF0eXBlID0gR0xfRkxPQVQ7CisgICAgICAqY29tcHMgPSAzOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRkxPQVQxNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0hBTEZfRkxPQVRfQVJCOworICAgICAgKmNvbXBzID0gMzsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfRkxPQVQzMjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfRkxPQVQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0ZMT0FUOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfRkxPQVQxNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfRkxPQVQxNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0hBTEZfRkxPQVRfQVJCOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9GTE9BVDMyOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9MX0ZMT0FUMzI6CisgICBjYXNlIE1FU0FfRk9STUFUX0lfRkxPQVQzMjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9GTE9BVDMyOgorICAgICAgKmRhdGF0eXBlID0gR0xfRkxPQVQ7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9BX0ZMT0FUMTY6CisgICBjYXNlIE1FU0FfRk9STUFUX0xfRkxPQVQxNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9GTE9BVDE2OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SX0ZMT0FUMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9IQUxGX0ZMT0FUX0FSQjsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9VSU5UODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9VSU5UODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9VSU5UODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MQV9VSU5UODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0FfVUlOVDE2OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1VJTlQxNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9VSU5UMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX1VJTlQxNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9VSU5UMzI6CisgICBjYXNlIE1FU0FfRk9STUFUX0xfVUlOVDMyOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1VJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVDsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX1VJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVDsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX0FfU0lOVDg6CisgICBjYXNlIE1FU0FfRk9STUFUX0xfU0lOVDg6CisgICBjYXNlIE1FU0FfRk9STUFUX0lfU0lOVDg6CisgICAgICAqZGF0YXR5cGUgPSBHTF9CWVRFOworICAgICAgKmNvbXBzID0gMTsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfU0lOVDg6CisgICAgICAqZGF0YXR5cGUgPSBHTF9CWVRFOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9BX1NJTlQxNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TSU5UMTY6CisgICBjYXNlIE1FU0FfRk9STUFUX0lfU0lOVDE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfU0hPUlQ7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MQV9TSU5UMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9TSU5UMzI6CisgICBjYXNlIE1FU0FfRk9STUFUX0xfU0lOVDMyOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1NJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0lOVDsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX1NJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0lOVDsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9TSU5UODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0JZVEU7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR19TSU5UODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0JZVEU7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfU0lOVDg6CisgICAgICAqZGF0YXR5cGUgPSBHTF9CWVRFOworICAgICAgKmNvbXBzID0gMzsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9TSU5UODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0JZVEU7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SX1NJTlQxNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1NIT1JUOworICAgICAgKmNvbXBzID0gMTsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfU0lOVDE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfU0hPUlQ7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfU0lOVDE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfU0hPUlQ7CisgICAgICAqY29tcHMgPSAzOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX1NJTlQxNjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1NIT1JUOworICAgICAgKmNvbXBzID0gNDsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9TSU5UMzI6CisgICAgICAqZGF0YXR5cGUgPSBHTF9JTlQ7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR19TSU5UMzI6CisgICAgICAqZGF0YXR5cGUgPSBHTF9JTlQ7CisgICAgICAqY29tcHMgPSAyOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfU0lOVDMyOgorICAgICAgKmRhdGF0eXBlID0gR0xfSU5UOworICAgICAgKmNvbXBzID0gMzsKKyAgICAgIHJldHVybjsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9TSU5UMzI6CisgICAgICAqZGF0YXR5cGUgPSBHTF9JTlQ7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICAvKioKKyAgICAqIFxuYW1lIE5vbi1ub3JtYWxpemVkIHVuc2lnbmVkIGludGVnZXIgZm9ybWF0cy4KKyAgICAqLworICAgY2FzZSBNRVNBX0ZPUk1BVF9SX1VJTlQ4OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHX1VJTlQ4OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9VSU5UODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAqY29tcHMgPSAzOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX1VJTlQ4OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JfVUlOVDE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfU0hPUlQ7CisgICAgICAqY29tcHMgPSAxOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR19VSU5UMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9VSU5UMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDM7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfVUlOVDE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfU0hPUlQ7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SX1VJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVDsKKyAgICAgICpjb21wcyA9IDE7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHX1VJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVDsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9VSU5UMzI6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9JTlQ7CisgICAgICAqY29tcHMgPSAzOworICAgICAgcmV0dXJuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX1VJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVDsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjlHOUI5RTVfRkxPQVQ6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9JTlRfNV85XzlfOV9SRVY7CisgICAgICAqY29tcHMgPSAzOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1IxMUcxMUIxMF9GTE9BVDoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0lOVF8xMEZfMTFGXzExRl9SRVY7CisgICAgICAqY29tcHMgPSAzOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0IxMEcxMFIxMEEyX1VJTlQ6CisgICBjYXNlIE1FU0FfRk9STUFUX1IxMEcxMEIxMEEyX1VJTlQ6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVY7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhCOFg4X1NSR0I6CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQlhfVUlOVDg6CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgKmNvbXBzID0gNDsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SOEc4QjhYOF9TTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9TSU5UODoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0JZVEU7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0IxMEcxMFIxMFgyX1VOT1JNOgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOworICAgICAgKmNvbXBzID0gNDsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JYX1VOT1JNMTY6CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQlhfVUlOVDE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfU0hPUlQ7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JHQlhfU05PUk0xNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9TSU5UMTY6CisgICAgICAqZGF0YXR5cGUgPSBHTF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9GTE9BVDE2OgorICAgICAgKmRhdGF0eXBlID0gR0xfSEFMRl9GTE9BVDsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9GTE9BVDMyOgorICAgICAgKmRhdGF0eXBlID0gR0xfRkxPQVQ7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JHQlhfVUlOVDMyOgorICAgICAgKmRhdGF0eXBlID0gR0xfVU5TSUdORURfSU5UOworICAgICAgKmNvbXBzID0gNDsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JYX1NJTlQzMjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX0lOVDsKKyAgICAgICpjb21wcyA9IDQ7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVY7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0c4UjhfU05PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9CWVRFOworICAgICAgKmNvbXBzID0gMjsKKyAgICAgIHJldHVybjsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9HMTZSMTZfU05PUk06CisgICAgICAqZGF0YXR5cGUgPSBHTF9TSE9SVDsKKyAgICAgICpjb21wcyA9IDI7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjhHOFI4WDhfU1JHQjoKKyAgICAgICpkYXRhdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAqY29tcHMgPSA0OworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0NPVU5UOgorICAgICAgYXNzZXJ0KDApOworICAgICAgcmV0dXJuOworCisgICBjYXNlIE1FU0FfRk9STUFUX05PTkU6CisgICAvKiBGb3IgZGVidWcgYnVpbGRzLCB3YXJuIGlmIGFueSBmb3JtYXRzIGFyZSBub3QgaGFuZGxlZCAqLworI2lmZGVmIERFQlVHCisgICBkZWZhdWx0OgorI2VuZGlmCisgICAgICBfbWVzYV9wcm9ibGVtKE5VTEwsICJiYWQgZm9ybWF0ICVzIGluIF9tZXNhX2Zvcm1hdF90b190eXBlX2FuZF9jb21wcyIsCisgICAgICAgICAgICAgICAgICAgIF9tZXNhX2dldF9mb3JtYXRfbmFtZShmb3JtYXQpKTsKKyAgICAgICpkYXRhdHlwZSA9IDA7CisgICAgICAqY29tcHMgPSAxOworICAgfQorfQorCisvKioKKyAqIENoZWNrIGlmIGEgbWVzYV9mb3JtYXQgZXhhY3RseSBtYXRjaGVzIGEgR0wgZm9ybWF0L3R5cGUgY29tYmluYXRpb24KKyAqIHN1Y2ggdGhhdCB3ZSBjYW4gdXNlIG1lbWNweSgpIGZyb20gb25lIHRvIHRoZSBvdGhlci4KKyAqIFxwYXJhbSBtZXNhX2Zvcm1hdCAgYSBNRVNBX0ZPUk1BVF94IHZhbHVlCisgKiBccGFyYW0gZm9ybWF0ICB0aGUgdXNlci1zcGVjaWZpZWQgaW1hZ2UgZm9ybWF0CisgKiBccGFyYW0gdHlwZSAgdGhlIHVzZXItc3BlY2lmaWVkIGltYWdlIGRhdGF0eXBlCisgKiBccGFyYW0gc3dhcEJ5dGVzICB0eXBpY2FsbHkgdGhlIGN1cnJlbnQgcGl4ZWwgcGFjay91bnBhY2sgYnl0ZXN3YXAgc3RhdGUKKyAqIFxyZXR1cm4gR0xfVFJVRSBpZiB0aGUgZm9ybWF0cyBtYXRjaCwgR0xfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitHTGJvb2xlYW4KK19tZXNhX2Zvcm1hdF9tYXRjaGVzX2Zvcm1hdF9hbmRfdHlwZShtZXNhX2Zvcm1hdCBtZXNhX2Zvcm1hdCwKKwkJCQkgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBzd2FwQnl0ZXMpCit7CisgICBjb25zdCBHTGJvb2xlYW4gbGl0dGxlRW5kaWFuID0gX21lc2FfbGl0dGxlX2VuZGlhbigpOworCisgICAvKiBOb3RlOiBXaGVuIHJlYWRpbmcgYSBHTCBmb3JtYXQvdHlwZSBjb21iaW5hdGlvbiwgdGhlIGZvcm1hdCBsaXN0cyBjaGFubmVsCisgICAgKiBhc3NpZ25tZW50cyBmcm9tIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbm5lbCBpbiB0aGUgdHlwZSB0byBsZWFzdAorICAgICogc2lnbmlmaWNhbnQuICBBIHR5cGUgd2l0aCBfUkVWIGluZGljYXRlcyB0aGF0IHRoZSBhc3NpZ25tZW50cyBhcmUKKyAgICAqIHN3YXBwZWQsIHNvIHRoZXkgYXJlIGxpc3RlZCBmcm9tIGxlYXN0IHNpZ25pZmljYW50IHRvIG1vc3Qgc2lnbmlmaWNhbnQuCisgICAgKgorICAgICogRm9yIHNhbml0eSwgcGxlYXNlIGtlZXAgdGhpcyBzd2l0Y2ggc3RhdGVtZW50IG9yZGVyZWQgdGhlIHNhbWUgYXMgdGhlCisgICAgKiBlbnVtcyBpbiBmb3JtYXRzLmguCisgICAgKi8KKworICAgc3dpdGNoIChtZXNhX2Zvcm1hdCkgeworCisgICBjYXNlIE1FU0FfRk9STUFUX05PTkU6CisgICBjYXNlIE1FU0FfRk9STUFUX0NPVU5UOgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBjYXNlIE1FU0FfRk9STUFUX0E4QjhHOFI4X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9BOEI4RzhSOF9TUkdCOgorICAgICAgaWYgKGZvcm1hdCA9PSBHTF9SR0JBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzggJiYgIXN3YXBCeXRlcykKKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworCisgICAgICBpZiAoZm9ybWF0ID09IEdMX1JHQkEgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYgJiYgc3dhcEJ5dGVzKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfUkdCQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgIWxpdHRsZUVuZGlhbikKKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworCisgICAgICBpZiAoZm9ybWF0ID09IEdMX0FCR1JfRVhUICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWCisgICAgICAgICAgJiYgIXN3YXBCeXRlcykKKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworCisgICAgICBpZiAoZm9ybWF0ID09IEdMX0FCR1JfRVhUICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzgKKyAgICAgICAgICAmJiBzd2FwQnl0ZXMpCisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHTF9BQkdSX0VYVCAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgbGl0dGxlRW5kaWFuKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SOEc4QjhBOF9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjhHOEI4QThfU1JHQjoKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfUkdCQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViAmJgorICAgICAgICAgICFzd2FwQnl0ZXMpCisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHTF9SR0JBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzggJiYgc3dhcEJ5dGVzKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfUkdCQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgbGl0dGxlRW5kaWFuKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfQUJHUl9FWFQgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOCAmJgorICAgICAgICAgICFzd2FwQnl0ZXMpCisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHTF9BQkdSX0VYVCAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViAmJgorICAgICAgICAgIHN3YXBCeXRlcykKKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworCisgICAgICBpZiAoZm9ybWF0ID09IEdMX0FCR1JfRVhUICYmIHR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJiAhbGl0dGxlRW5kaWFuKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9COEc4UjhBOF9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjhHOFI4QThfU1JHQjoKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfQkdSQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViAmJgorICAgICAgICAgICFzd2FwQnl0ZXMpCisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHTF9CR1JBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzggJiYgc3dhcEJ5dGVzKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfQkdSQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgbGl0dGxlRW5kaWFuKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9BOFI4RzhCOF9VTk9STToKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfQkdSQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0lOVF84XzhfOF84ICYmICFzd2FwQnl0ZXMpCisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHTF9CR1JBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWICYmCisgICAgICAgICAgc3dhcEJ5dGVzKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfQkdSQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgIWxpdHRsZUVuZGlhbikKKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfWDhCOEc4UjhfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhCOFg4X1VOT1JNOgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBjYXNlIE1FU0FfRk9STUFUX0I4RzhSOFg4X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9YOFI4RzhCOF9VTk9STToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9CR1JfVU5PUk04OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9CR1JfU1JHQjg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0JHUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgbGl0dGxlRW5kaWFuOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9VTk9STTg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgbGl0dGxlRW5kaWFuOworCisgICBjYXNlIE1FU0FfRk9STUFUX0I1RzZSNV9VTk9STToKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCICYmIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYgIXN3YXBCeXRlczsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SNUc2QjVfVU5PUk06CisgICAgICAvKiBTb21lIG9mIHRoZSAxNi1iaXQgTUVTQV9GT1JNQVRzIHRoYXQgd291bGQgc2VlbSB0byBjb3JyZXNwb25kIHRvCisgICAgICAgKiBHTF9VTlNJR05FRF9TSE9SVF8qIGFyZSBieXRlLXN3YXBwZWQgaW5zdGVhZCBvZiBjaGFubmVsLXJldmVyc2VkLAorICAgICAgICogYWNjb3JkaW5nIHRvIGZvcm1hdHMuaCwgc28gdGhleSBjYW4ndCBiZSBtYXRjaGVkLgorICAgICAgICovCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjRHNFI0QTRfVU5PUk06CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0JHUkEgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFViAmJgorICAgICAgICAgIXN3YXBCeXRlczsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9BNFI0RzRCNF9VTk9STToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9BMUI1RzVSNV9VTk9STToKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgJiYKKyAgICAgICAgICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjVHNVI1QTFfVU5PUk06CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0JHUkEgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViAmJgorICAgICAgICAgIXN3YXBCeXRlczsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9BMVI1RzVCNV9VTk9STToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9MNEE0X1VOT1JNOgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MOEE4X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9MOEE4X1NSR0I6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0xVTUlOQU5DRV9BTFBIQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgbGl0dGxlRW5kaWFuOworICAgY2FzZSBNRVNBX0ZPUk1BVF9BOEw4X1VOT1JNOgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBjYXNlIE1FU0FfRk9STUFUX0wxNkExNl9VTk9STToKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFX0FMUEhBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlQgJiYgbGl0dGxlRW5kaWFuICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0ExNkwxNl9VTk9STToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9CMkczUjNfVU5PUk06CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEVfM18zXzI7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9VTk9STTg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0FMUEhBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfQllURTsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9VTk9STTE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9BTFBIQSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0xfVU5PUk04OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1NSR0I4OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0UgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1VOT1JNMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0xVTUlOQU5DRSAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0lfVU5PUk04OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRUQgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1VOT1JNMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JFRCAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfWUNCQ1I6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1lDQkNSX01FU0EgJiYKKyAgICAgICAgICAgICAoKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfOF84X01FU0EgJiYgbGl0dGxlRW5kaWFuICE9IHN3YXBCeXRlcykgfHwKKyAgICAgICAgICAgICAgKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9NRVNBICYmIGxpdHRsZUVuZGlhbiA9PSBzd2FwQnl0ZXMpKTsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfWUNCQ1JfUkVWOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9ZQ0JDUl9NRVNBICYmCisgICAgICAgICAgICAgKCh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9NRVNBICYmIGxpdHRsZUVuZGlhbiA9PSBzd2FwQnl0ZXMpIHx8CisgICAgICAgICAgICAgICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfTUVTQSAmJiBsaXR0bGVFbmRpYW4gIT0gc3dhcEJ5dGVzKSk7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9VTk9STTg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JFRCAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEU7CisgICBjYXNlIE1FU0FfRk9STUFUX1I4RzhfVU5PUk06CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHICYmIHR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJiBsaXR0bGVFbmRpYW47CisgICBjYXNlIE1FU0FfRk9STUFUX0c4UjhfVU5PUk06CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9VTk9STTE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRUQgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCAmJgorICAgICAgICAgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjE2RzE2X1VOT1JNOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRyAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUICYmIGxpdHRsZUVuZGlhbiAmJgorICAgICAgICAgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRzE2UjE2X1VOT1JNOgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBjYXNlIE1FU0FfRk9STUFUX0IxMEcxMFIxMEEyX1VOT1JNOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9CR1JBICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICYmCisgICAgICAgICAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX1M4X1VJTlRfWjI0X1VOT1JNOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9ERVBUSF9TVEVOQ0lMICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzI0XzggJiYKKyAgICAgICAgICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1g4X1VJTlRfWjI0X1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9aMjRfVU5PUk1fUzhfVUlOVDoKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9aX1VOT1JNMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUICYmCisgICAgICAgICAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX1oyNF9VTk9STV9YOF9VSU5UOgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBjYXNlIE1FU0FfRk9STUFUX1pfVU5PUk0zMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfREVQVEhfQ09NUE9ORU5UICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UICYmCisgICAgICAgICAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX1NfVUlOVDg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1NURU5DSUxfSU5ERVggJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFOworCisgICBjYXNlIE1FU0FfRk9STUFUX1NSR0JfRFhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQkFfRFhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQkFfRFhUMzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfU1JHQkFfRFhUNToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRlhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9GWFQxOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfRFhUMToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9EWFQxOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0RYVDM6CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfRFhUNToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0ZMT0FUMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQkEgJiYgdHlwZSA9PSBHTF9GTE9BVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX0ZMT0FUMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQkEgJiYgdHlwZSA9PSBHTF9IQUxGX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX0ZMT0FUMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQiAmJiB0eXBlID09IEdMX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9GTE9BVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0IgJiYgdHlwZSA9PSBHTF9IQUxGX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9GTE9BVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9BTFBIQSAmJiB0eXBlID09IEdMX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0FfRkxPQVQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfQUxQSEEgJiYgdHlwZSA9PSBHTF9IQUxGX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9GTE9BVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0UgJiYgdHlwZSA9PSBHTF9GTE9BVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MX0ZMT0FUMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0xVTUlOQU5DRSAmJiB0eXBlID09IEdMX0hBTEZfRkxPQVQgJiYgIXN3YXBCeXRlczsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9MQV9GTE9BVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0VfQUxQSEEgJiYgdHlwZSA9PSBHTF9GTE9BVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MQV9GTE9BVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0VfQUxQSEEgJiYgdHlwZSA9PSBHTF9IQUxGX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9GTE9BVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRUQgJiYgdHlwZSA9PSBHTF9GTE9BVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9JX0ZMT0FUMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JFRCAmJiB0eXBlID09IEdMX0hBTEZfRkxPQVQgJiYgIXN3YXBCeXRlczsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SX0ZMT0FUMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JFRCAmJiB0eXBlID09IEdMX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JfRkxPQVQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEICYmIHR5cGUgPT0gR0xfSEFMRl9GTE9BVCAmJiAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JHX0ZMT0FUMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHICYmIHR5cGUgPT0gR0xfRkxPQVQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfRkxPQVQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkcgJiYgdHlwZSA9PSBHTF9IQUxGX0ZMT0FUICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9VSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfQUxQSEFfSU5URUdFUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEU7CisgICBjYXNlIE1FU0FfRk9STUFUX0FfVUlOVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9BTFBIQV9JTlRFR0VSICYmIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlQgJiYKKyAgICAgICAgICAgICAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9BX1VJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfQUxQSEFfSU5URUdFUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0lOVCAmJgorICAgICAgICAgICAgICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0FfU0lOVDg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0FMUEhBX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9BX1NJTlQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfQUxQSEFfSU5URUdFUiAmJiB0eXBlID09IEdMX1NIT1JUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0FfU0lOVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9BTFBIQV9JTlRFR0VSICYmIHR5cGUgPT0gR0xfSU5UICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9VSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1VJTlQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1VJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9TSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1NJTlQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9TSE9SVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1NJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9JTlQgJiYgIXN3YXBCeXRlczsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1VJTlQ4OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0VfSU5URUdFUl9FWFQgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1VJTlQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFX0lOVEVHRVJfRVhUICYmIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlQgJiYKKyAgICAgICAgICAgICAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1VJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFX0lOVEVHRVJfRVhUICYmIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UICYmCisgICAgICAgICAgICAgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFX0lOVEVHRVJfRVhUICYmIHR5cGUgPT0gR0xfQllURTsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TSU5UMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0xVTUlOQU5DRV9JTlRFR0VSX0VYVCAmJiB0eXBlID09IEdMX1NIT1JUICYmCisgICAgICAgICAgICAgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTF9TSU5UMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0xVTUlOQU5DRV9JTlRFR0VSX0VYVCAmJiB0eXBlID09IEdMX0lOVCAmJiAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX0xBX1VJTlQ4OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0VfQUxQSEFfSU5URUdFUl9FWFQgJiYKKyAgICAgICAgICAgICB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfVUlOVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0VfQUxQSEFfSU5URUdFUl9FWFQgJiYKKyAgICAgICAgICAgICB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX1VJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFX0FMUEhBX0lOVEVHRVJfRVhUICYmCisgICAgICAgICAgICAgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfU0lOVDg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0xVTUlOQU5DRV9BTFBIQV9JTlRFR0VSX0VYVCAmJiB0eXBlID09IEdMX0JZVEUgJiYKKyAgICAgICAgICAgICAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MQV9TSU5UMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX0xVTUlOQU5DRV9BTFBIQV9JTlRFR0VSX0VYVCAmJiB0eXBlID09IEdMX1NIT1JUICYmCisgICAgICAgICAgICAgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfU0lOVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9MVU1JTkFOQ0VfQUxQSEFfSU5URUdFUl9FWFQgJiYgdHlwZSA9PSBHTF9JTlQgJiYKKyAgICAgICAgICAgICAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JfU0lOVDg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JFRF9JTlRFR0VSICYmIHR5cGUgPT0gR0xfQllURTsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfU0lOVDg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9CWVRFICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9TSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9CWVRFICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfU0lOVDg6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQkFfSU5URUdFUiAmJiB0eXBlID09IEdMX0JZVEUgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9TSU5UMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JFRF9JTlRFR0VSICYmIHR5cGUgPT0gR0xfU0hPUlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfU0lOVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR19JTlRFR0VSICYmIHR5cGUgPT0gR0xfU0hPUlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX1NJTlQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9TSE9SVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX1NJTlQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCQV9JTlRFR0VSICYmIHR5cGUgPT0gR0xfU0hPUlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9TSU5UMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JFRF9JTlRFR0VSICYmIHR5cGUgPT0gR0xfSU5UICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHX1NJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdfSU5URUdFUiAmJiB0eXBlID09IEdMX0lOVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JfU0lOVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0JfSU5URUdFUiAmJiB0eXBlID09IEdMX0lOVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX1NJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCQV9JTlRFR0VSICYmIHR5cGUgPT0gR0xfSU5UICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9VSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR19VSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdfSU5URUdFUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX1VJTlQ4OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0JfSU5URUdFUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9VSU5UODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCQV9JTlRFR0VSICYmIHR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJgorICAgICAgICAgICAgICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JfVUlOVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRURfSU5URUdFUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUICYmCisgICAgICAgICAgICAgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfVUlOVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR19JTlRFR0VSICYmIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX1VJTlQxNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCAmJgorICAgICAgICAgICAgICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQkFfVUlOVDE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0JBX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCAmJgorICAgICAgICAgICAgICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JfVUlOVDMyOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRURfSU5URUdFUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0lOVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR19VSU5UMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCX1VJTlQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkdCX0lOVEVHRVIgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCQV9VSU5UMzI6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQkFfSU5URUdFUiAmJiB0eXBlID09IEdMX1VOU0lHTkVEX0lOVCAmJiAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX0RVRFY4OgorICAgICAgcmV0dXJuIChmb3JtYXQgPT0gR0xfRFU4RFY4X0FUSSB8fCBmb3JtYXQgPT0gR0xfRFVEVl9BVEkpICYmCisgICAgICAgICAgICAgdHlwZSA9PSBHTF9CWVRFICYmIGxpdHRsZUVuZGlhbiAmJiAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JfU05PUk04OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRUQgJiYgdHlwZSA9PSBHTF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SOEc4X1NOT1JNOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRyAmJiB0eXBlID09IEdMX0JZVEUgJiYgbGl0dGxlRW5kaWFuICYmCisgICAgICAgICAgICAgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfWDhCOEc4UjhfU05PUk06CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQThCOEc4UjhfU05PUk06CisgICAgICBpZiAoZm9ybWF0ID09IEdMX1JHQkEgJiYgdHlwZSA9PSBHTF9CWVRFICYmICFsaXR0bGVFbmRpYW4pCisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHTF9BQkdSX0VYVCAmJiB0eXBlID09IEdMX0JZVEUgJiYgbGl0dGxlRW5kaWFuKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9SOEc4QjhBOF9TTk9STToKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfUkdCQSAmJiB0eXBlID09IEdMX0JZVEUgJiYgbGl0dGxlRW5kaWFuKQorICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR0xfQUJHUl9FWFQgJiYgdHlwZSA9PSBHTF9CWVRFICYmICFsaXR0bGVFbmRpYW4pCisgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBjYXNlIE1FU0FfRk9STUFUX1JfU05PUk0xNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEICYmIHR5cGUgPT0gR0xfU0hPUlQgJiYKKyAgICAgICAgICAgICAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SMTZHMTZfU05PUk06CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHICYmIHR5cGUgPT0gR0xfU0hPUlQgJiYgbGl0dGxlRW5kaWFuICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQl9TTk9STTE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0IgJiYgdHlwZSA9PSBHTF9TSE9SVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX1NOT1JNMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQkEgJiYgdHlwZSA9PSBHTF9TSE9SVCAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JBX1VOT1JNMTY6CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQkEgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCAmJgorICAgICAgICAgICAgICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9SR1RDMV9VTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUl9SR1RDMV9TTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdfUkdUQzJfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1JHX1JHVEMyX1NOT1JNOgorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBjYXNlIE1FU0FfRk9STUFUX0xfTEFUQzFfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0xfTEFUQzFfU05PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0xBX0xBVEMyX1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9MQV9MQVRDMl9TTk9STToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMxX1JHQjg6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfUkdCODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9TUkdCODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9SR0JBOF9FQUM6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU1JHQjhfQUxQSEE4X0VBQzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9SMTFfRUFDOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1JHMTFfRUFDOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SMTFfRUFDOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SRzExX0VBQzoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRVRDMl9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTE6CisgICBjYXNlIE1FU0FfRk9STUFUX0VUQzJfU1JHQjhfUFVOQ0hUSFJPVUdIX0FMUEhBMToKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9BX1NOT1JNODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfQUxQSEEgJiYgdHlwZSA9PSBHTF9CWVRFOworICAgY2FzZSBNRVNBX0ZPUk1BVF9MX1NOT1JNODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFICYmIHR5cGUgPT0gR0xfQllURTsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTDhBOF9TTk9STToKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFX0FMUEhBICYmIHR5cGUgPT0gR0xfQllURSAmJgorICAgICAgICAgICAgIGxpdHRsZUVuZGlhbiAmJiAhc3dhcEJ5dGVzOworICAgY2FzZSBNRVNBX0ZPUk1BVF9JX1NOT1JNODoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkVEICYmIHR5cGUgPT0gR0xfQllURTsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQV9TTk9STTE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9BTFBIQSAmJiB0eXBlID09IEdMX1NIT1JUICYmICFzd2FwQnl0ZXM7CisgICBjYXNlIE1FU0FfRk9STUFUX0xfU05PUk0xNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFICYmIHR5cGUgPT0gR0xfU0hPUlQgJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfTEFfU05PUk0xNjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfTFVNSU5BTkNFX0FMUEhBICYmIHR5cGUgPT0gR0xfU0hPUlQgJiYKKyAgICAgICAgICAgICBsaXR0bGVFbmRpYW4gJiYgIXN3YXBCeXRlczsKKyAgIGNhc2UgTUVTQV9GT1JNQVRfSV9TTk9STTE2OgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRUQgJiYgdHlwZSA9PSBHTF9TSE9SVCAmJiBsaXR0bGVFbmRpYW4gJiYKKyAgICAgICAgICAgICAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX0IxMEcxMFIxMEEyX1VJTlQ6CisgICAgICByZXR1cm4gKGZvcm1hdCA9PSBHTF9CR1JBX0lOVEVHRVJfRVhUICYmCisgICAgICAgICAgICAgIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICYmCisgICAgICAgICAgICAgICFzd2FwQnl0ZXMpOworCisgICBjYXNlIE1FU0FfRk9STUFUX1IxMEcxMEIxMEEyX1VJTlQ6CisgICAgICByZXR1cm4gKGZvcm1hdCA9PSBHTF9SR0JBX0lOVEVHRVJfRVhUICYmCisgICAgICAgICAgICAgIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICYmCisgICAgICAgICAgICAgICFzd2FwQnl0ZXMpOworCisgICBjYXNlIE1FU0FfRk9STUFUX1I5RzlCOUU1X0ZMT0FUOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0IgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfNV85XzlfOV9SRVYgJiYKKyAgICAgICAgICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjExRzExQjEwX0ZMT0FUOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0IgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWICYmCisgICAgICAgICAhc3dhcEJ5dGVzOworCisgICBjYXNlIE1FU0FfRk9STUFUX1pfRkxPQVQzMjoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfREVQVEhfQ09NUE9ORU5UICYmIHR5cGUgPT0gR0xfRkxPQVQgJiYgIXN3YXBCeXRlczsKKworICAgY2FzZSBNRVNBX0ZPUk1BVF9aMzJfRkxPQVRfUzhYMjRfVUlOVDoKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfREVQVEhfU1RFTkNJTCAmJgorICAgICAgICAgICAgIHR5cGUgPT0gR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWICYmICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjRHNFI0WDRfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX0I1RzVSNVgxX1VOT1JNOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SOEc4QjhYOF9TTk9STToKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjhHOEI4WDhfU1JHQjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9VSU5UODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9TSU5UODoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjEwRzEwUjEwWDJfVU5PUk06CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQlhfVU5PUk0xNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9TTk9STTE2OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JYX0ZMT0FUMTY6CisgICBjYXNlIE1FU0FfRk9STUFUX1JHQlhfVUlOVDE2OgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JYX1NJTlQxNjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9GTE9BVDMyOgorICAgY2FzZSBNRVNBX0ZPUk1BVF9SR0JYX1VJTlQzMjoKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUkdCWF9TSU5UMzI6CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk06CisgICAgICByZXR1cm4gZm9ybWF0ID09IEdMX1JHQkEgJiYgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYgJiYKKyAgICAgICAgICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRzhSOF9TTk9STToKKyAgICAgIHJldHVybiBmb3JtYXQgPT0gR0xfUkcgJiYgdHlwZSA9PSBHTF9CWVRFICYmICFsaXR0bGVFbmRpYW4gJiYKKyAgICAgICAgICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfRzE2UjE2X1NOT1JNOgorICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SRyAmJiB0eXBlID09IEdMX1NIT1JUICYmICFsaXR0bGVFbmRpYW4gJiYKKyAgICAgICAgICFzd2FwQnl0ZXM7CisKKyAgIGNhc2UgTUVTQV9GT1JNQVRfQjhHOFI4WDhfU1JHQjoKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2Zvcm1hdHMuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZm9ybWF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTUxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2Zvcm1hdHMuaApAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSAgVk13YXJlLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQXV0aG9yczoKKyAqICAgQnJpYW4gUGF1bAorICovCisKKworI2lmbmRlZiBGT1JNQVRTX0gKKyNkZWZpbmUgRk9STUFUU19ICisKKworI2luY2x1ZGUgPEdML2dsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioKKyAqIE9wZW5HTCBkb2Vzbid0IGhhdmUgR0xfVU5TSUdORURfQllURV80XzQsIHNvIHdlIG11c3QgZGVmaW5lIG91ciBvd24gdHlwZQorICogZm9yIEdMX0xVTUlOQU5DRTRfQUxQSEE0LgorICovCisjZGVmaW5lIE1FU0FfVU5TSUdORURfQllURV80XzQgKEdMX1VOU0lHTkVEX0JZVEU8PDEpCisKKworLyoqCisgKiBNYXggbnVtYmVyIG9mIGJ5dGVzIGZvciBhbnkgbm9uLWNvbXByZXNzZWQgcGl4ZWwgZm9ybWF0IGJlbG93LCBvciBmb3IKKyAqIGludGVybWVkaWF0ZSBwaXhlbCBzdG9yYWdlIGluIE1lc2EuICBUaGlzIHNob3VsZCBuZXZlciBiZSBsZXNzIHRoYW4KKyAqIDE2LiAgTWF5YmUgMzIgc29tZWRheT8KKyAqLworI2RlZmluZSBNQVhfUElYRUxfQllURVMgMTYKKworCisvKioKKyAqIE1lc2EgdGV4dHVyZS9yZW5kZXJidWZmZXIgaW1hZ2UgZm9ybWF0cy4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICBNRVNBX0ZPUk1BVF9OT05FID0gMCwKKworICAgLyoqCisgICAgKiBcbmFtZSBCYXNpYyBoYXJkd2FyZSBmb3JtYXRzCisgICAgKgorICAgICogVGhlIG1lc2EgZm9ybWF0IG5hbWUgc3BlY2lmaWNhdGlvbiBpcyBhcyBmb2xsb3dzOgorICAgICoKKyAgICAqICBUaGVyZSBzaGFsbCBiZSAzIG5hbWluZyBmb3JtYXQgYmFzZSB0eXBlczogdGhvc2UgZm9yIGNvbXBvbmVudCBhcnJheQorICAgICogIGZvcm1hdHMgKHR5cGUgQSk7IHRob3NlIGZvciBjb21wcmVzc2VkIGZvcm1hdHMgKHR5cGUgQyk7IGFuZCB0aG9zZSBmb3IKKyAgICAqICBwYWNrZWQgY29tcG9uZW50IGZvcm1hdHMgKHR5cGUgUCkuIFdpdGggdHlwZSBBIGZvcm1hdHMsIGNvbG9yIGNvbXBvbmVudAorICAgICogIG9yZGVyIGRvZXMgbm90IGNoYW5nZSB3aXRoIGVuZGlhbm5lc3MuIEVhY2ggZm9ybWF0IG5hbWUgc2hhbGwgYmVnaW4gd2l0aAorICAgICogIE1FU0FfRk9STUFUXywgZm9sbG93ZWQgYnkgYSBjb21wb25lbnQgbGFiZWwgKGZyb20gdGhlIENvbXBvbmVudCBMYWJlbAorICAgICogIGxpc3QgYmVsb3cpIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgY29tcG9uZW50KHMpIG9jY3VyCisgICAgKiAgaW4gdGhlIGZvcm1hdCwgZXhjZXB0IGZvciBub24tbGluZWFyIGNvbG9yIGZvcm1hdHMgd2hlcmUgdGhlIGZpcnN0CisgICAgKiAgbGV0dGVyIHNoYWxsIGJlICdTJy4gRm9yIHR5cGUgUCBmb3JtYXRzLCBlYWNoIGNvbXBvbmVudCBsYWJlbCBpcworICAgICogIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IHJlcHJlc2VudCBpdCBpbiB0aGUgZnVuZGFtZW50YWwKKyAgICAqICBkYXRhIHR5cGUgdXNlZCBieSB0aGUgZm9ybWF0LgorICAgICoKKyAgICAqICBGb2xsb3dpbmcgdGhlIGxpc3Rpbmcgb2YgdGhlIGNvbXBvbmVudCBsYWJlbHMgc2hhbGwgYmUgYW4gdW5kZXJzY29yZTsgYQorICAgICogIGNvbXByZXNzaW9uIHR5cGUgZm9sbG93ZWQgYnkgYW4gdW5kZXJzY29yZSBmb3IgVHlwZSBDIGZvcm1hdHMgb25seTsgYQorICAgICogIHN0b3JhZ2UgdHlwZSBmcm9tIHRoZSBsaXN0IGJlbG93OyBhbmQgYSBiaXQgd2l0aCBmb3IgdHlwZSBBIGZvcm1hdHMsCisgICAgKiAgd2hpY2ggaXMgdGhlIGJpdCB3aWR0aCBmb3IgZWFjaCBhcnJheSBlbGVtZW50LgorICAgICoKKyAgICAqCisgICAgKiAgLS0tLS0tLS0tLSAgICBGb3JtYXQgQmFzZSBUeXBlIEE6IEFycmF5IC0tLS0tLS0tLS0KKyAgICAqICBNRVNBX0ZPUk1BVF9bY29tcG9uZW50IGxpc3RdX1tzdG9yYWdlIHR5cGVdW2FycmF5IGVsZW1lbnQgYml0IHdpZHRoXQorICAgICoKKyAgICAqICBleGFtcGxlczoKKyAgICAqICBNRVNBX0ZPUk1BVF9BX1NOT1JNOCAgICAgLSB1Y2hhcltpXSA9IEEKKyAgICAqICBNRVNBX0ZPUk1BVF9SR0JBXzE2IC0gdXNob3J0W2kgKiA0ICsgMF0gPSBSLCB1c2hvcnRbaSAqIDQgKyAxXSA9IEcsCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0W2kgKiA0ICsgMl0gPSBCLCB1c2hvcnRbaSAqIDQgKyAzXSA9IEEKKyAgICAqICBNRVNBX0ZPUk1BVF9aX1VOT1JNMzIgICAgLSBmbG9hdFtpXSA9IFoKKyAgICAqCisgICAgKgorICAgICoKKyAgICAqICAtLS0tLS0tLS0tICAgIEZvcm1hdCBCYXNlIFR5cGUgQzogQ29tcHJlc3NlZCAtLS0tLS0tLS0tCisgICAgKiAgTUVTQV9GT1JNQVRfW2NvbXBvbmVudCBsaXN0Kl1bXypdW2NvbXByZXNzaW9uIHR5cGVdW3N0b3JhZ2UgdHlwZSpdCisgICAgKiAgKiB3aGVyZSByZXF1aXJlZAorICAgICoKKyAgICAqICBleGFtcGxlczoKKyAgICAqICBNRVNBX0ZPUk1BVF9SR0JfRVRDMQorICAgICogIE1FU0FfRk9STUFUX1JHQkFfRVRDMgorICAgICogIE1FU0FfRk9STUFUX0xBVEMxX1VOT1JNCisgICAgKiAgTUVTQV9GT1JNQVRfUkdCQV9GWFQxCisgICAgKgorICAgICoKKyAgICAqCisgICAgKiAgLS0tLS0tLS0tLSAgICBGb3JtYXQgQmFzZSBUeXBlIFA6IFBhY2tlZCAgLS0tLS0tLS0tLQorICAgICogIE1FU0FfRk9STUFUX1tbY29tcG9uZW50IGxpc3QsYml0IHdpZHRoXVtzdG9yYWdlIHR5cGUqXVtfXV1bX11bc3RvcmFnZSB0eXBlKipdCisgICAgKiAgICogd2hlbiB0eXBlIGRpZmZlcnMgYmV0d2VlbiBjb21wb25lbnQKKyAgICAqICAgKiogd2hlbiB0eXBlIGFwcGxpZXMgdG8gYWxsIGNvbXBvbmVudHMKKyAgICAqCisgICAgKiAgZXhhbXBsZXM6ICAgICAgICAgICAgICAgICAgIG1zYiA8LS0tLS0tIFRFWEVMIEJJVFMgLS0tLS0tLS0tLS0+IGxzYgorICAgICogIE1FU0FfRk9STUFUX0E4QjhHOFI4X1VOT1JNLCBBQUFBIEFBQUEgQkJCQiBCQkJCIEdHR0cgR0dHRyBSUlJSIFJSUlIKKyAgICAqICBNRVNBX0ZPUk1BVF9SNUc2QjVfVU5PUk0gICAgICAgICAgICAgICAgICAgICAgICBSUlJSIFJHR0cgR0dHQiBCQkJCCisgICAgKiAgTUVTQV9GT1JNQVRfQjRHNFI0WDRfVU5PUk0gICAgICAgICAgICAgICAgICAgICAgQkJCQiBHR0dHIFJSUlIgWFhYWAorICAgICogIE1FU0FfRk9STUFUX1ozMl9GTE9BVF9TOFgyNF9VSU5UCisgICAgKiAgTUVTQV9GT1JNQVRfUjEwRzEwQjEwQTJfVUlOVAorICAgICogIE1FU0FfRk9STUFUX1I5RzlCOUU1X0ZMT0FUCisgICAgKgorICAgICoKKyAgICAqCisgICAgKiAgLS0tLS0tLS0tLSAgICBDb21wb25lbnQgTGFiZWxzOiAtLS0tLS0tLS0tCisgICAgKiAgQSAtIEFscGhhCisgICAgKiAgQiAtIEJsdWUKKyAgICAqICBEVSAtIERlbHRhIFUKKyAgICAqICBEViAtIERlbHRhIFYKKyAgICAqICBFIC0gU2hhcmVkIEV4cG9uZW50CisgICAgKiAgRyAtIEdyZWVuCisgICAgKiAgSSAtIEludGVuc2l0eQorICAgICogIEwgLSBMdW1pbmFuY2UKKyAgICAqICBSIC0gUmVkCisgICAgKiAgUyAtIFN0ZW5jaWwgKHdoZW4gbm90IGZvbGxvd2VkIGJ5IFJHQiBvciBSR0JBKQorICAgICogIFUgLSBDaHJvbWluYW5jZQorICAgICogIFYgLSBDaHJvbWluYW5jZQorICAgICogIFkgLSBMdW1hCisgICAgKiAgWCAtIFBhY2tpbmcgYml0cworICAgICogIFogLSBEZXB0aAorICAgICoKKyAgICAqCisgICAgKgorICAgICogIC0tLS0tLS0tLS0gICAgVHlwZSBDIENvbXByZXNzaW9uIFR5cGVzOiAtLS0tLS0tLS0tCisgICAgKiAgRFhUMSAtIENvbG9yIGNvbXBvbmVudCBsYWJlbHMgc2hhbGwgYmUgZ2l2ZW4KKyAgICAqICBEWFQzIC0gQ29sb3IgY29tcG9uZW50IGxhYmVscyBzaGFsbCBiZSBnaXZlbgorICAgICogIERYVDUgLSBDb2xvciBjb21wb25lbnQgbGFiZWxzIHNoYWxsIGJlIGdpdmVuCisgICAgKiAgRVRDMSAtIE5vIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkCisgICAgKiAgRVRDMiAtIE5vIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkCisgICAgKiAgRlhUMSAtIENvbG9yIGNvbXBvbmVudCBsYWJlbHMgc2hhbGwgYmUgZ2l2ZW4KKyAgICAqICBGWFQzIC0gQ29sb3IgY29tcG9uZW50IGxhYmVscyBzaGFsbCBiZSBnaXZlbgorICAgICogIExBVEMxIC0gRnVuZGFtZW50YWwgZGF0YSB0eXBlIHNoYWxsIGJlIGdpdmVuCisgICAgKiAgTEFUQzIgLSBGdW5kYW1lbnRhbCBkYXRhIHR5cGUgc2hhbGwgYmUgZ2l2ZW4KKyAgICAqICBSR1RDMSAtIENvbG9yIGNvbXBvbmVudCBsYWJlbHMgYW5kIGRhdGEgdHlwZSBzaGFsbCBiZSBnaXZlbgorICAgICogIFJHVEMyIC0gQ29sb3IgY29tcG9uZW50IGxhYmVscyBhbmQgZGF0YSB0eXBlIHNoYWxsIGJlIGdpdmVuCisgICAgKgorICAgICoKKyAgICAqCisgICAgKiAgLS0tLS0tLS0tLSAgICBTdG9yYWdlIFR5cGVzOiAtLS0tLS0tLS0tCisgICAgKiAgRkxPQVQKKyAgICAqICBTSU5UCisgICAgKiAgVUlOVAorICAgICogIFNOT1JNCisgICAgKiAgVU5PUk0KKyAgICAqICBTUkdCIC0gUkdCIGNvbXBvbmVudHMsIG9yIEwgYXJlIFVOT1JNcyBpbiBzUkdCIGNvbG9yIHNwYWNlLgorICAgICogICAgICAgICBBbHBoYSwgaWYgcHJlc2VudCBpcyBsaW5lYXIuCisgICAgKgorICAgICovCisKKyAgIC8qIFBhY2tlZCB1bm9ybSBmb3JtYXRzICovICAgIC8qIG1zYiA8LS0tLS0tIFRFWEVMIEJJVFMgLS0tLS0tLS0tLS0+IGxzYiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tICovCisgICBNRVNBX0ZPUk1BVF9BOEI4RzhSOF9VTk9STSwgICAvKiBSUlJSIFJSUlIgR0dHRyBHR0dHIEJCQkIgQkJCQiBBQUFBIEFBQUEgKi8KKyAgIE1FU0FfRk9STUFUX1g4QjhHOFI4X1VOT1JNLCAgIC8qIFJSUlIgUlJSUiBHR0dHIEdHR0cgQkJCQiBCQkJCIHh4eHggeHh4eCAqLworICAgTUVTQV9GT1JNQVRfUjhHOEI4QThfVU5PUk0sICAgLyogQUFBQSBBQUFBIEJCQkIgQkJCQiBHR0dHIEdHR0cgUlJSUiBSUlJSICovCisgICBNRVNBX0ZPUk1BVF9SOEc4QjhYOF9VTk9STSwgICAvKiB4eHh4IHh4eHggQkJCQiBCQkJCIEdHR0cgR0dHRyBSUlJSIFJSUlIgKi8KKyAgIE1FU0FfRk9STUFUX0I4RzhSOEE4X1VOT1JNLCAgIC8qIEFBQUEgQUFBQSBSUlJSIFJSUlIgR0dHRyBHR0dHIEJCQkIgQkJCQiAqLworICAgTUVTQV9GT1JNQVRfQjhHOFI4WDhfVU5PUk0sICAgLyogeHh4eCB4eHh4IFJSUlIgUlJSUiBHR0dHIEdHR0cgQkJCQiBCQkJCICovCisgICBNRVNBX0ZPUk1BVF9BOFI4RzhCOF9VTk9STSwgICAvKiBCQkJCIEJCQkIgR0dHRyBHR0dHIFJSUlIgUlJSUiBBQUFBIEFBQUEgKi8KKyAgIE1FU0FfRk9STUFUX1g4UjhHOEI4X1VOT1JNLCAgIC8qIEJCQkIgQkJCQiBHR0dHIEdHR0cgUlJSUiBSUlJSIHh4eHggeHh4eCAqLworICAgTUVTQV9GT1JNQVRfTDE2QTE2X1VOT1JNLCAgICAgLyogQUFBQSBBQUFBIEFBQUEgQUFBQSBMTExMIExMTEwgTExMTCBMTExMICovCisgICBNRVNBX0ZPUk1BVF9BMTZMMTZfVU5PUk0sICAgICAvKiBMTExMIExMTEwgTExMTCBMTExMIEFBQUEgQUFBQSBBQUFBIEFBQUEgKi8KKyAgIE1FU0FfRk9STUFUX0I1RzZSNV9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlJSUiBSR0dHIEdHR0IgQkJCQiAqLworICAgTUVTQV9GT1JNQVRfUjVHNkI1X1VOT1JNLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCQkJCIEJHR0cgR0dHUiBSUlJSICovCisgICBNRVNBX0ZPUk1BVF9CNEc0UjRBNF9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgIC8qIEFBQUEgUlJSUiBHR0dHIEJCQkIgKi8KKyAgIE1FU0FfRk9STUFUX0I0RzRSNFg0X1VOT1JNLCAgICAgICAgICAgICAgICAgICAgICAgLyogeHh4eCBSUlJSIEdHR0cgQkJCQiAqLworICAgTUVTQV9GT1JNQVRfQTRSNEc0QjRfVU5PUk0sICAgICAgICAgICAgICAgICAgICAgICAvKiBCQkJCIEdHR0cgUlJSUiBBQUFBICovCisgICBNRVNBX0ZPUk1BVF9BMUI1RzVSNV9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJSUlIgUkdHRyBHR0JCIEJCQkEgKi8KKyAgIE1FU0FfRk9STUFUX0I1RzVSNUExX1VOT1JNLCAgICAgICAgICAgICAgICAgICAgICAgLyogQVJSUiBSUkdHIEdHR0IgQkJCQiAqLworICAgTUVTQV9GT1JNQVRfQjVHNVI1WDFfVU5PUk0sICAgICAgICAgICAgICAgICAgICAgICAvKiB4UlJSIFJSR0cgR0dHQiBCQkJCICovCisgICBNRVNBX0ZPUk1BVF9BMVI1RzVCNV9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgIC8qIEJCQkIgQkdHRyBHR1JSIFJSUkEgKi8KKyAgIE1FU0FfRk9STUFUX0w4QThfVU5PUk0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUFBQSBBQUFBIExMTEwgTExMTCAqLworICAgTUVTQV9GT1JNQVRfQThMOF9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMTExMIExMTEwgQUFBQSBBQUFBICovCisgICBNRVNBX0ZPUk1BVF9SOEc4X1VOT1JNLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdHR0cgR0dHRyBSUlJSIFJSUlIgKi8KKyAgIE1FU0FfRk9STUFUX0c4UjhfVU5PUk0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlJSUiBSUlJSIEdHR0cgR0dHRyAqLworICAgTUVTQV9GT1JNQVRfTDRBNF9VTk9STSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUFBQSBMTExMICovCisgICBNRVNBX0ZPUk1BVF9CMkczUjNfVU5PUk0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSUlJHIEdHQkIgKi8KKworICAgTUVTQV9GT1JNQVRfUjE2RzE2X1VOT1JNLCAgICAgLyogR0dHRyBHR0dHIEdHR0cgR0dHRyBSUlJSIFJSUlIgUlJSUiBSUlJSICovCisgICBNRVNBX0ZPUk1BVF9HMTZSMTZfVU5PUk0sICAgICAvKiBSUlJSIFJSUlIgUlJSUiBSUlJSIEdHR0cgR0dHRyBHR0dHIEdHR0cgKi8KKyAgIE1FU0FfRk9STUFUX0IxMEcxMFIxMEEyX1VOT1JNLC8qIEFBUlIgUlJSUiBSUlJSIEdHR0cgR0dHRyBHR0JCIEJCQkIgQkJCQiAqLworICAgTUVTQV9GT1JNQVRfQjEwRzEwUjEwWDJfVU5PUk0sLyogeHhSUiBSUlJSIFJSUlIgR0dHRyBHR0dHIEdHQkIgQkJCQiBCQkJCICovCisgICBNRVNBX0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STSwvKiBBQUJCIEJCQkIgQkJCQiBHR0dHIEdHR0cgR0dSUiBSUlJSIFJSUlIgKi8KKworICAgTUVTQV9GT1JNQVRfUzhfVUlOVF9aMjRfVU5PUk0sLyogWlpaWiBaWlpaIFpaWlogWlpaWiBaWlpaIFpaWlogU1NTUyBTU1NTICovCisgICBNRVNBX0ZPUk1BVF9YOF9VSU5UX1oyNF9VTk9STSwvKiBaWlpaIFpaWlogWlpaWiBaWlpaIFpaWlogWlpaWiB4eHh4IHh4eHggKi8KKyAgIE1FU0FfRk9STUFUX1oyNF9VTk9STV9TOF9VSU5ULC8qIFNTU1MgU1NTUyBaWlpaIFpaWlogWlpaWiBaWlpaIFpaWlogWlpaWiAqLworICAgTUVTQV9GT1JNQVRfWjI0X1VOT1JNX1g4X1VJTlQsLyogeHh4eCB4eHh4IFpaWlogWlpaWiBaWlpaIFpaWlogWlpaWiBaWlpaICovCisKKyAgIE1FU0FfRk9STUFUX1lDQkNSLCAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgWVlZWSBZWVlZIFVvclYgVW9yViAqLworICAgTUVTQV9GT1JNQVRfWUNCQ1JfUkVWLCAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICBVb3JWIFVvclYgWVlZWSBZWVlZICovCisKKyAgIE1FU0FfRk9STUFUX0RVRFY4LCAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgRFVEVSBEVURVIERWRFYgRFZEViAqLworCisgICAvKiBBcnJheSB1bm9ybSBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9BX1VOT1JNOCwgICAgICAvKiB1Ynl0ZVtpXSA9IEEgKi8KKyAgIE1FU0FfRk9STUFUX0FfVU5PUk0xNiwgICAgIC8qIHVzaG9ydFtpXSA9IEEgKi8KKyAgIE1FU0FfRk9STUFUX0xfVU5PUk04LCAgICAgIC8qIHVieXRlW2ldID0gTCAqLworICAgTUVTQV9GT1JNQVRfTF9VTk9STTE2LCAgICAgLyogdXNob3J0W2ldID0gTCAqLworICAgTUVTQV9GT1JNQVRfSV9VTk9STTgsICAgICAgLyogdWJ5dGVbaV0gPSBJICovCisgICBNRVNBX0ZPUk1BVF9JX1VOT1JNMTYsICAgICAvKiB1c2hvcnRbaV0gPSBJICovCisgICBNRVNBX0ZPUk1BVF9SX1VOT1JNOCwgICAgICAvKiB1Ynl0ZVtpXSA9IFIgKi8KKyAgIE1FU0FfRk9STUFUX1JfVU5PUk0xNiwgICAgIC8qIHVzaG9ydFtpXSA9IFIgKi8KKyAgIE1FU0FfRk9STUFUX0JHUl9VTk9STTgsICAgIC8qIHVieXRlW2kqM10gPSBCLCBbaSozKzFdID0gRywgW2kqMysyXSA9IFIgKi8KKyAgIE1FU0FfRk9STUFUX1JHQl9VTk9STTgsICAgIC8qIHVieXRlW2kqM10gPSBSLCBbaSozKzFdID0gRywgW2kqMysyXSA9IEIgKi8KKyAgIE1FU0FfRk9STUFUX1JHQkFfVU5PUk0xNiwgIC8qIHVzaG9ydFtpXSA9IFIsIFsxXSA9IEcsIFsyXSA9IEIsIFszXSA9IEEgKi8KKyAgIE1FU0FfRk9STUFUX1JHQlhfVU5PUk0xNiwgIAorCisgICBNRVNBX0ZPUk1BVF9aX1VOT1JNMTYsICAgICAvKiB1c2hvcnRbaV0gPSBaICovCisgICBNRVNBX0ZPUk1BVF9aX1VOT1JNMzIsICAgICAvKiB1aW50W2ldID0gWiAqLworICAgTUVTQV9GT1JNQVRfU19VSU5UOCwgICAgICAgLyogdWJ5dGVbaV0gPSBTICovCisKKyAgIC8qIFBhY2tlZCBzaWduZWQvbm9ybWFsaXplZCBmb3JtYXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtc2IgPC0tLS0tLSBURVhFTCBCSVRTIC0tLS0tLS0tLS0tPiBsc2IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAqLworICAgTUVTQV9GT1JNQVRfQThCOEc4UjhfU05PUk0sICAgLyogUlJSUiBSUlJSIEdHR0cgR0dHRyBCQkJCIEJCQkIgQUFBQSBBQUFBICovCisgICBNRVNBX0ZPUk1BVF9YOEI4RzhSOF9TTk9STSwgICAvKiBSUlJSIFJSUlIgR0dHRyBHR0dHIEJCQkIgQkJCQiB4eHh4IHh4eHggKi8KKyAgIE1FU0FfRk9STUFUX1I4RzhCOEE4X1NOT1JNLCAgIC8qIEFBQUEgQUFBQSBCQkJCIEJCQkIgR0dHRyBHR0dHIFJSUlIgUlJSUiAqLworICAgTUVTQV9GT1JNQVRfUjhHOEI4WDhfU05PUk0sICAgLyogeHh4eCB4eHh4IEJCQkIgQkJCQiBHR0dHIEdHR0cgUlJSUiBSUlJSICovCisgICBNRVNBX0ZPUk1BVF9SMTZHMTZfU05PUk0sICAgICAvKiBHR0dHIEdHR0cgR0dHRyBHR0dHIFJSUlIgUlJSUiBSUlJSIFJSUlIgKi8KKyAgIE1FU0FfRk9STUFUX0cxNlIxNl9TTk9STSwgICAgIC8qIFJSUlIgUlJSUiBSUlJSIFJSUlIgR0dHRyBHR0dHIEdHR0cgR0dHRyAqLworICAgTUVTQV9GT1JNQVRfUjhHOF9TTk9STSwgICAgICAgLyogICAgICAgICAgICAgICAgICAgICBHR0dHIEdHR0cgUlJSUiBSUlJSICovCisgICBNRVNBX0ZPUk1BVF9HOFI4X1NOT1JNLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgIFJSUlIgUlJSUiBHR0dHIEdHR0cgKi8KKyAgIE1FU0FfRk9STUFUX0w4QThfU05PUk0sICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgQUFBQSBBQUFBIExMTEwgTExMTCAqLworCisgICAvKiBBcnJheSBzaWduZWQvbm9ybWFsaXplZCBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9BX1NOT1JNOCwgICAgICAvKiBieXRlW2ldID0gQSAqLworICAgTUVTQV9GT1JNQVRfQV9TTk9STTE2LCAgICAgLyogc2hvcnRbaV0gPSBBICovCisgICBNRVNBX0ZPUk1BVF9MX1NOT1JNOCwgICAgICAvKiBieXRlW2ldID0gTCAqLworICAgTUVTQV9GT1JNQVRfTF9TTk9STTE2LCAgICAgLyogc2hvcnRbaV0gPSBMICovCisgICBNRVNBX0ZPUk1BVF9JX1NOT1JNOCwgICAgICAvKiBieXRlW2ldID0gSSAqLworICAgTUVTQV9GT1JNQVRfSV9TTk9STTE2LCAgICAgLyogc2hvcnRbaV0gPSBJICovCisgICBNRVNBX0ZPUk1BVF9SX1NOT1JNOCwgICAgICAvKiBieXRlW2ldID0gUiAqLworICAgTUVTQV9GT1JNQVRfUl9TTk9STTE2LCAgICAgLyogc2hvcnRbaV0gPSBSICovCisgICBNRVNBX0ZPUk1BVF9MQV9TTk9STTE2LCAgICAvKiBzaG9ydFtpICogMl0gPSBMLCBbaSAqIDIgKyAxXSA9IEEgKi8KKyAgIE1FU0FfRk9STUFUX1JHQl9TTk9STTE2LCAgIC8qIHNob3J0W2kqM10gPSBSLCBbaSozKzFdID0gRywgW2kqMysyXSA9IEIgKi8KKyAgIE1FU0FfRk9STUFUX1JHQkFfU05PUk0xNiwgIC8qIC4uLiAqLworICAgTUVTQV9GT1JNQVRfUkdCWF9TTk9STTE2LCAgLyogLi4uICovCisKKyAgIC8qIFBhY2tlZCBzUkdCIGZvcm1hdHMgKi8KKyAgIE1FU0FfRk9STUFUX0E4QjhHOFI4X1NSR0IsICAgIC8qIFJSUlIgUlJSUiBHR0dHIEdHR0cgQkJCQiBCQkJCIEFBQUEgQUFBQSAqLworICAgTUVTQV9GT1JNQVRfQjhHOFI4QThfU1JHQiwgICAgLyogQUFBQSBBQUFBIFJSUlIgUlJSUiBHR0dHIEdHR0cgQkJCQiBCQkJCICovCisgICBNRVNBX0ZPUk1BVF9COEc4UjhYOF9TUkdCLCAgICAvKiB4eHh4IHh4eHggUlJSUiBSUlJSIEdHR0cgR0dHRyBCQkJCIEJCQkIgKi8KKyAgIE1FU0FfRk9STUFUX1I4RzhCOEE4X1NSR0IsICAgIC8qIEFBQUEgQUFBQSBCQkJCIEJCQkIgR0dHRyBHR0dHIFJSUlIgUlJSUiAqLworICAgTUVTQV9GT1JNQVRfUjhHOEI4WDhfU1JHQiwgICAgLyogeHh4eCB4eHh4IEJCQkIgQkJCQiBHR0dHIEdHR0cgUlJSUiBSUlJSICovCisgICBNRVNBX0ZPUk1BVF9MOEE4X1NSR0IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFBQUEgQUFBQSBMTExMIExMTEwgKi8KKworICAgLyogQXJyYXkgc1JHQiBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9MX1NSR0I4LCAgICAgICAvKiB1Ynl0ZVtpXSA9IEwgKi8KKyAgIE1FU0FfRk9STUFUX0JHUl9TUkdCOCwgICAgIC8qIHVieXRlW2kqM10gPSBCLCBbaSozKzFdID0gRywgW2kqMysyXSA9IFIgKi8KKworICAgLyogUGFja2VkIGZsb2F0IGZvcm1hdHMgKi8KKyAgIE1FU0FfRk9STUFUX1I5RzlCOUU1X0ZMT0FULAorICAgTUVTQV9GT1JNQVRfUjExRzExQjEwX0ZMT0FULCAgIC8qIEJCQkIgQkJCQiBCQkdHIEdHR0cgR0dHRyBHUlJSIFJSUlIgUlJSUiAqLworICAgTUVTQV9GT1JNQVRfWjMyX0ZMT0FUX1M4WDI0X1VJTlQsIC8qIChmbG9hdCwgeDI0czgpICovCisKKyAgIC8qIEFycmF5IGZsb2F0IGZvcm1hdHMgKi8KKyAgIE1FU0FfRk9STUFUX0FfRkxPQVQxNiwKKyAgIE1FU0FfRk9STUFUX0FfRkxPQVQzMiwKKyAgIE1FU0FfRk9STUFUX0xfRkxPQVQxNiwKKyAgIE1FU0FfRk9STUFUX0xfRkxPQVQzMiwKKyAgIE1FU0FfRk9STUFUX0xBX0ZMT0FUMTYsCisgICBNRVNBX0ZPUk1BVF9MQV9GTE9BVDMyLAorICAgTUVTQV9GT1JNQVRfSV9GTE9BVDE2LAorICAgTUVTQV9GT1JNQVRfSV9GTE9BVDMyLAorICAgTUVTQV9GT1JNQVRfUl9GTE9BVDE2LAorICAgTUVTQV9GT1JNQVRfUl9GTE9BVDMyLAorICAgTUVTQV9GT1JNQVRfUkdfRkxPQVQxNiwKKyAgIE1FU0FfRk9STUFUX1JHX0ZMT0FUMzIsCisgICBNRVNBX0ZPUk1BVF9SR0JfRkxPQVQxNiwKKyAgIE1FU0FfRk9STUFUX1JHQl9GTE9BVDMyLAorICAgTUVTQV9GT1JNQVRfUkdCQV9GTE9BVDE2LAorICAgTUVTQV9GT1JNQVRfUkdCQV9GTE9BVDMyLCAgLyogZmxvYXRbMF0gPSBSLCBbMV0gPSBHLCBbMl0gPSBCLCBbM10gPSBBICovCisgICBNRVNBX0ZPUk1BVF9SR0JYX0ZMT0FUMTYsCisgICBNRVNBX0ZPUk1BVF9SR0JYX0ZMT0FUMzIsCisgICBNRVNBX0ZPUk1BVF9aX0ZMT0FUMzIsCisKKyAgIC8qIFBhY2tlZCBzaWduZWQvdW5zaWduZWQgbm9uLW5vcm1hbGl6ZWQgaW50ZWdlciBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9CMTBHMTBSMTBBMl9VSU5ULCAvKiBBQVJSIFJSUlIgUlJSUiBHR0dHIEdHR0cgR0dCQiBCQkJCIEJCQkIgKi8KKyAgIE1FU0FfRk9STUFUX1IxMEcxMEIxMEEyX1VJTlQsIC8qIEFBQkIgQkJCQiBCQkJCIEdHR0cgR0dHRyBHR1JSIFJSUlIgUlJSUiAqLworCisgICAvKiBBcnJheSBzaWduZWQvdW5zaWduZWQgbm9uLW5vcm1hbGl6ZWQgaW50ZWdlciBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9BX1VJTlQ4LAorICAgTUVTQV9GT1JNQVRfQV9VSU5UMTYsCisgICBNRVNBX0ZPUk1BVF9BX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX0FfU0lOVDgsCisgICBNRVNBX0ZPUk1BVF9BX1NJTlQxNiwKKyAgIE1FU0FfRk9STUFUX0FfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9JX1VJTlQ4LAorICAgTUVTQV9GT1JNQVRfSV9VSU5UMTYsCisgICBNRVNBX0ZPUk1BVF9JX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX0lfU0lOVDgsCisgICBNRVNBX0ZPUk1BVF9JX1NJTlQxNiwKKyAgIE1FU0FfRk9STUFUX0lfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9MX1VJTlQ4LAorICAgTUVTQV9GT1JNQVRfTF9VSU5UMTYsCisgICBNRVNBX0ZPUk1BVF9MX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX0xfU0lOVDgsCisgICBNRVNBX0ZPUk1BVF9MX1NJTlQxNiwKKyAgIE1FU0FfRk9STUFUX0xfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9MQV9VSU5UOCwKKyAgIE1FU0FfRk9STUFUX0xBX1VJTlQxNiwKKyAgIE1FU0FfRk9STUFUX0xBX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX0xBX1NJTlQ4LAorICAgTUVTQV9GT1JNQVRfTEFfU0lOVDE2LAorICAgTUVTQV9GT1JNQVRfTEFfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9SX1VJTlQ4LAorICAgTUVTQV9GT1JNQVRfUl9VSU5UMTYsCisgICBNRVNBX0ZPUk1BVF9SX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX1JfU0lOVDgsCisgICBNRVNBX0ZPUk1BVF9SX1NJTlQxNiwKKyAgIE1FU0FfRk9STUFUX1JfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9SR19VSU5UOCwKKyAgIE1FU0FfRk9STUFUX1JHX1VJTlQxNiwKKyAgIE1FU0FfRk9STUFUX1JHX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX1JHX1NJTlQ4LAorICAgTUVTQV9GT1JNQVRfUkdfU0lOVDE2LAorICAgTUVTQV9GT1JNQVRfUkdfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9SR0JfVUlOVDgsCisgICBNRVNBX0ZPUk1BVF9SR0JfVUlOVDE2LAorICAgTUVTQV9GT1JNQVRfUkdCX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX1JHQl9TSU5UOCwKKyAgIE1FU0FfRk9STUFUX1JHQl9TSU5UMTYsCisgICBNRVNBX0ZPUk1BVF9SR0JfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9SR0JBX1VJTlQ4LAorICAgTUVTQV9GT1JNQVRfUkdCQV9VSU5UMTYsCisgICBNRVNBX0ZPUk1BVF9SR0JBX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX1JHQkFfU0lOVDgsCisgICBNRVNBX0ZPUk1BVF9SR0JBX1NJTlQxNiwKKyAgIE1FU0FfRk9STUFUX1JHQkFfU0lOVDMyLAorCisgICBNRVNBX0ZPUk1BVF9SR0JYX1VJTlQ4LAorICAgTUVTQV9GT1JNQVRfUkdCWF9VSU5UMTYsCisgICBNRVNBX0ZPUk1BVF9SR0JYX1VJTlQzMiwKKyAgIE1FU0FfRk9STUFUX1JHQlhfU0lOVDgsCisgICBNRVNBX0ZPUk1BVF9SR0JYX1NJTlQxNiwKKyAgIE1FU0FfRk9STUFUX1JHQlhfU0lOVDMyLAorCisgICAvKiBEWFQgY29tcHJlc3NlZCBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9SR0JfRFhUMSwKKyAgIE1FU0FfRk9STUFUX1JHQkFfRFhUMSwKKyAgIE1FU0FfRk9STUFUX1JHQkFfRFhUMywKKyAgIE1FU0FfRk9STUFUX1JHQkFfRFhUNSwKKworICAgLyogRFhUIHNSR0IgY29tcHJlc3NlZCBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9TUkdCX0RYVDEsCisgICBNRVNBX0ZPUk1BVF9TUkdCQV9EWFQxLAorICAgTUVTQV9GT1JNQVRfU1JHQkFfRFhUMywKKyAgIE1FU0FfRk9STUFUX1NSR0JBX0RYVDUsCisKKyAgIC8qIEZYVDEgY29tcHJlc3NlZCBmb3JtYXRzICovCisgICBNRVNBX0ZPUk1BVF9SR0JfRlhUMSwKKyAgIE1FU0FfRk9STUFUX1JHQkFfRlhUMSwKKworICAgLyogUkdUQyBjb21wcmVzc2VkIGZvcm1hdHMgKi8KKyAgIE1FU0FfRk9STUFUX1JfUkdUQzFfVU5PUk0sCisgICBNRVNBX0ZPUk1BVF9SX1JHVEMxX1NOT1JNLAorICAgTUVTQV9GT1JNQVRfUkdfUkdUQzJfVU5PUk0sCisgICBNRVNBX0ZPUk1BVF9SR19SR1RDMl9TTk9STSwKKworICAgLyogTEFUQzEvMiBjb21wcmVzc2VkIGZvcm1hdHMgKi8KKyAgIE1FU0FfRk9STUFUX0xfTEFUQzFfVU5PUk0sCisgICBNRVNBX0ZPUk1BVF9MX0xBVEMxX1NOT1JNLAorICAgTUVTQV9GT1JNQVRfTEFfTEFUQzJfVU5PUk0sCisgICBNRVNBX0ZPUk1BVF9MQV9MQVRDMl9TTk9STSwKKworICAgLyogRVRDMS8yIGNvbXByZXNzZWQgZm9ybWF0cyAqLworICAgTUVTQV9GT1JNQVRfRVRDMV9SR0I4LAorICAgTUVTQV9GT1JNQVRfRVRDMl9SR0I4LAorICAgTUVTQV9GT1JNQVRfRVRDMl9TUkdCOCwKKyAgIE1FU0FfRk9STUFUX0VUQzJfUkdCQThfRUFDLAorICAgTUVTQV9GT1JNQVRfRVRDMl9TUkdCOF9BTFBIQThfRUFDLAorICAgTUVTQV9GT1JNQVRfRVRDMl9SMTFfRUFDLAorICAgTUVTQV9GT1JNQVRfRVRDMl9SRzExX0VBQywKKyAgIE1FU0FfRk9STUFUX0VUQzJfU0lHTkVEX1IxMV9FQUMsCisgICBNRVNBX0ZPUk1BVF9FVEMyX1NJR05FRF9SRzExX0VBQywKKyAgIE1FU0FfRk9STUFUX0VUQzJfUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExLAorICAgTUVTQV9GT1JNQVRfRVRDMl9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExLAorCisgICBNRVNBX0ZPUk1BVF9DT1VOVAorfSBtZXNhX2Zvcm1hdDsKKworCitleHRlcm4gY29uc3QgY2hhciAqCitfbWVzYV9nZXRfZm9ybWF0X25hbWUobWVzYV9mb3JtYXQgZm9ybWF0KTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9nZXRfZm9ybWF0X2J5dGVzKG1lc2FfZm9ybWF0IGZvcm1hdCk7CisKK2V4dGVybiBHTGludAorX21lc2FfZ2V0X2Zvcm1hdF9iaXRzKG1lc2FfZm9ybWF0IGZvcm1hdCwgR0xlbnVtIHBuYW1lKTsKKworZXh0ZXJuIEdMdWludAorX21lc2FfZ2V0X2Zvcm1hdF9tYXhfYml0cyhtZXNhX2Zvcm1hdCBmb3JtYXQpOworCitleHRlcm4gR0xlbnVtCitfbWVzYV9nZXRfZm9ybWF0X2RhdGF0eXBlKG1lc2FfZm9ybWF0IGZvcm1hdCk7CisKK2V4dGVybiBHTGVudW0KK19tZXNhX2dldF9mb3JtYXRfYmFzZV9mb3JtYXQobWVzYV9mb3JtYXQgZm9ybWF0KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2dldF9mb3JtYXRfYmxvY2tfc2l6ZShtZXNhX2Zvcm1hdCBmb3JtYXQsIEdMdWludCAqYncsIEdMdWludCAqYmgpOworCitleHRlcm4gR0xib29sZWFuCitfbWVzYV9pc19mb3JtYXRfY29tcHJlc3NlZChtZXNhX2Zvcm1hdCBmb3JtYXQpOworCitleHRlcm4gR0xib29sZWFuCitfbWVzYV9pc19mb3JtYXRfcGFja2VkX2RlcHRoX3N0ZW5jaWwobWVzYV9mb3JtYXQgZm9ybWF0KTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21lc2FfaXNfZm9ybWF0X2ludGVnZXJfY29sb3IobWVzYV9mb3JtYXQgZm9ybWF0KTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21lc2FfaXNfZm9ybWF0X3Vuc2lnbmVkKG1lc2FfZm9ybWF0IGZvcm1hdCk7CisKK2V4dGVybiBHTGJvb2xlYW4KK19tZXNhX2lzX2Zvcm1hdF9zaWduZWQobWVzYV9mb3JtYXQgZm9ybWF0KTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21lc2FfaXNfZm9ybWF0X2ludGVnZXIobWVzYV9mb3JtYXQgZm9ybWF0KTsKKworZXh0ZXJuIEdMZW51bQorX21lc2FfZ2V0X2Zvcm1hdF9jb2xvcl9lbmNvZGluZyhtZXNhX2Zvcm1hdCBmb3JtYXQpOworCitleHRlcm4gR0x1aW50CitfbWVzYV9mb3JtYXRfaW1hZ2Vfc2l6ZShtZXNhX2Zvcm1hdCBmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CisKK2V4dGVybiB1aW50NjRfdAorX21lc2FfZm9ybWF0X2ltYWdlX3NpemU2NChtZXNhX2Zvcm1hdCBmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9mb3JtYXRfcm93X3N0cmlkZShtZXNhX2Zvcm1hdCBmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOworCitleHRlcm4gdm9pZAorX21lc2FfZm9ybWF0X3RvX3R5cGVfYW5kX2NvbXBzKG1lc2FfZm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gKmRhdGF0eXBlLCBHTHVpbnQgKmNvbXBzKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3Rlc3RfZm9ybWF0cyh2b2lkKTsKKworZXh0ZXJuIG1lc2FfZm9ybWF0CitfbWVzYV9nZXRfc3JnYl9mb3JtYXRfbGluZWFyKG1lc2FfZm9ybWF0IGZvcm1hdCk7CisKK2V4dGVybiBtZXNhX2Zvcm1hdAorX21lc2FfZ2V0X3VuY29tcHJlc3NlZF9mb3JtYXQobWVzYV9mb3JtYXQgZm9ybWF0KTsKKworZXh0ZXJuIEdMdWludAorX21lc2FfZm9ybWF0X251bV9jb21wb25lbnRzKG1lc2FfZm9ybWF0IGZvcm1hdCk7CisKK2V4dGVybiBib29sCitfbWVzYV9mb3JtYXRfaGFzX2NvbG9yX2NvbXBvbmVudChtZXNhX2Zvcm1hdCBmb3JtYXQsIGludCBjb21wb25lbnQpOworCitHTGJvb2xlYW4KK19tZXNhX2Zvcm1hdF9tYXRjaGVzX2Zvcm1hdF9hbmRfdHlwZShtZXNhX2Zvcm1hdCBtZXNhX2Zvcm1hdCwKKwkJCQkgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBzd2FwQnl0ZXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogRk9STUFUU19IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2dsaGVhZGVyLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2dsaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ZjlhMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vZ2xoZWFkZXIuaApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKy8qKgorICogXGZpbGUgZ2xoZWFkZXIuaAorICogV3JhcHBlciBmb3IgR0wvZ2wuaCBhbmQgR0wvZ2xleHQuaAorICovCisKKworI2lmbmRlZiBHTEhFQURFUl9ICisjZGVmaW5lIEdMSEVBREVSX0gKKworCisjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKKyNpbmNsdWRlICJHTC9nbC5oIgorI2luY2x1ZGUgIkdML2dsZXh0LmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK3R5cGVkZWYgaW50IEdMY2xhbXB4OworCisKKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQordHlwZWRlZiB2b2lkICpHTGVnbEltYWdlT0VTOworI2VuZGlmCisKKworI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsCisjZGVmaW5lIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY1CisjZGVmaW5lIEdMX1NBTVBMRVJfRVhURVJOQUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY2CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY3CisjZGVmaW5lIEdMX1JFUVVJUkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgICAgMHg4RDY4CisjZW5kaWYKKworCisjaWZuZGVmIEdMX09FU19wb2ludF9zaXplX2FycmF5CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjlDCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThBCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThCCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThDCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgMHg4QjlGCisjZW5kaWYKKworCisjaWZuZGVmIEdMX09FU19kcmF3X3RleHR1cmUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAweDhCOUQKKyNlbmRpZgorCisKKyNpZm5kZWYgR0xfUFJPR1JBTV9CSU5BUllfTEVOR1RIX09FUworI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9MRU5HVEhfT0VTIDB4ODc0MQorI2VuZGlmCisKKy8qIEdMRVMgMi4wIHRva2VucyAqLworI2lmbmRlZiBHTF9SR0I1NjUKKyNkZWZpbmUgR0xfUkdCNTY1IDB4OEQ2MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfVEVYVFVSRV9HRU5fU1RSX09FUworI2RlZmluZSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MAorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MQorI2RlZmluZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MgorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NQorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NgorI2RlZmluZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NworI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5OAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVNfVkVSU0lPTl8yXzAKKyNkZWZpbmUgR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgICAgICAgMHg4REY4CisjZGVmaW5lIEdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAgIDB4OERGOQorI2RlZmluZSBHTF9TSEFERVJfQ09NUElMRVIgICAgICAgICAgICAgICAgICAweDhERkEKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgICAgICAgMHg4REZCCisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX1ZFQ1RPUlMgICAgICAgICAgICAgIDB4OERGQworI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTICAgICAweDhERkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0dXJlX2NvbXByZXNzaW9uXzNkYworI2RlZmluZSBHTF9BVElfdGV4dHVyZV9jb21wcmVzc2lvbl8zZGMgMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQV8zRENfQVRJIDB4ODgzNworI2VuZGlmCisKKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKKyNkZWZpbmUgR0xfRVRDMV9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjQKKyNlbmRpZgorCisKKy8qIEluZXhwbGljYWJseSwgR0xfSEFMRl9GTE9BVF9PRVMgaGFzIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gR0xfSEFMRl9GTE9BVC4KKyAqLworI2lmbmRlZiBHTF9IQUxGX0ZMT0FUX09FUworI2RlZmluZSBHTF9IQUxGX0ZMT0FUX09FUyAweDhENjEKKyNlbmRpZgorCisKKy8qKgorICogSW50ZXJuYWwgdG9rZW4gdG8gcmVwcmVzZW50IGEgR0xTTCBzaGFkZXIgcHJvZ3JhbSAoYSBjb2xsZWN0aW9uIG9mCisgKiBvbmUgb3IgbW9yZSBzaGFkZXJzIHRoYXQgZ2V0IGxpbmtlZCB0b2dldGhlcikuICBOb3RlIHRoYXQgR0xTTAorICogc2hhZGVycyBhbmQgc2hhZGVyIHByb2dyYW1zIHNoYXJlIG9uZSBuYW1lIHNwYWNlIChvbmUgaGFzaCB0YWJsZSkKKyAqIHNvIHdlIG5lZWQgYSB2YWx1ZSB0aGF0J3MgZGlmZmVyZW50IGZyb20gYW55IG9mIHRoZQorICogR0xfVkVSVEVYL0ZSQUdNRU5UL0dFT01FVFJZX1BST0dSQU0gdG9rZW5zLgorICovCisjZGVmaW5lIEdMX1NIQURFUl9QUk9HUkFNX01FU0EgMHg5OTk5CisKKworLyoqCisgKiBJbnRlcm5hbCB0b2tlbiBmb3IgZ2VvbWV0cnkgcHJvZ3JhbXMuCisgKiBVc2UgdGhlIHZhbHVlIGZvciBHTF9HRU9NRVRSWV9QUk9HUkFNX05WIGZvciBub3cuCisgKi8KKyNkZWZpbmUgTUVTQV9HRU9NRVRSWV9QUk9HUkFNIDB4OGMyNgorCisvKiBTZXZlcmFsIGZpZWxkcyBvZiBzdHJ1Y3QgZ2xfY29uZmlnIGNhbiB0YWtlIHRoZXNlIGFzIHZhbHVlcy4gIFNpbmNlCisgKiBHTFggaGVhZGVyIGZpbGVzIG1heSBub3QgYmUgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUgdGhleSBuZWVkIHRvIGJlIHVzZWQsCisgKiByZWRlZmluZSB0aGVtIGhlcmUuCisgKi8KKyNkZWZpbmUgR0xYX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgR0xYX1NMT1dfQ09ORklHICAgICAgICAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgR0xYX1RSVUVfQ09MT1IgICAgICAgICAgICAgICAgICAgICAweDgwMDIKKyNkZWZpbmUgR0xYX0RJUkVDVF9DT0xPUiAgICAgICAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xYX1BTRVVET19DT0xPUiAgICAgICAgICAgICAgICAgICAweDgwMDQKKyNkZWZpbmUgR0xYX1NUQVRJQ19DT0xPUiAgICAgICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgR0xYX0dSQVlfU0NBTEUgICAgICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xYX1NUQVRJQ19HUkFZICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JHQiAgICAgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRyAgICAgICAgICAweDgwMEQKKyNkZWZpbmUgR0xYX1NXQVBfRVhDSEFOR0VfT01MICAgICAgICAgICAgICAweDgwNjEKKyNkZWZpbmUgR0xYX1NXQVBfQ09QWV9PTUwgICAgICAgICAgICAgICAgICAweDgwNjIKKyNkZWZpbmUgR0xYX1NXQVBfVU5ERUZJTkVEX09NTCAgICAgICAgICAgICAweDgwNjMKKworI2RlZmluZSBHTFhfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogR0xIRUFERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9oYXNoLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzAxOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9oYXNoLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qKgorICogXGZpbGUgaGFzaC5jCisgKiBHZW5lcmljIGhhc2ggdGFibGUuIAorICoKKyAqIFVzZWQgZm9yIGRpc3BsYXkgbGlzdHMsIHRleHR1cmUgb2JqZWN0cywgdmVydGV4L2ZyYWdtZW50IHByb2dyYW1zLAorICogYnVmZmVyIG9iamVjdHMsIGV0Yy4gIFRoZSBoYXNoIGZ1bmN0aW9ucyBhcmUgdGhyZWFkLXNhZmUuCisgKiAKKyAqIFxub3RlIGtleT0wIGlzIGlsbGVnYWwuCisgKgorICogXGF1dGhvciBCcmlhbiBQYXVsCisgKi8KKworLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgImhhc2hfdGFibGUuaCIKKworLyoqCisgKiBNYWdpYyBHTHVpbnQgb2JqZWN0IG5hbWUgdGhhdCBnZXRzIHN0b3JlZCBvdXRzaWRlIG9mIHRoZSBzdHJ1Y3QgaGFzaF90YWJsZS4KKyAqCisgKiBUaGUgaGFzaCB0YWJsZSBuZWVkcyBhIHBhcnRpY3VsYXIgcG9pbnRlciB0byBiZSB0aGUgbWFya2VyIGZvciBhIGtleSB0aGF0CisgKiB3YXMgZGVsZXRlZCBmcm9tIHRoZSB0YWJsZSwgYWxvbmcgd2l0aCBOVUxMIGZvciB0aGUgIm5ldmVyIGFsbG9jYXRlZCBpbiB0aGUKKyAqIHRhYmxlIiBtYXJrZXIuICBMZWdhY3kgR0wgYWxsb3dzIGFueSBHTHVpbnQgdG8gYmUgdXNlZCBhcyBhIEdMIG9iamVjdCBuYW1lLAorICogYW5kIHdlIHVzZSBhIDE6MSBtYXBwaW5nIGZyb20gR0x1aW50cyB0byBrZXkgcG9pbnRlcnMsIHNvIHdlIG5lZWQgdG8gYmUKKyAqIGFibGUgdG8gdHJhY2sgYSBHTHVpbnQgdGhhdCBoYXBwZW5zIHRvIG1hdGNoIHRoZSBkZWxldGVkIGtleSBvdXRzaWRlIG9mCisgKiBzdHJ1Y3QgaGFzaF90YWJsZS4gIFdlIHRlbGwgdGhlIGhhc2ggdGFibGUgdG8gdXNlICIxIiBhcyB0aGUgZGVsZXRlZCBrZXkKKyAqIHZhbHVlLCBzbyB0aGF0IHdlIHRlc3QgdGhlIGRlbGV0ZWQta2V5LWluLXRoZS10YWJsZSBwYXRoIGFzIGJlc3Qgd2UgY2FuLgorICovCisjZGVmaW5lIERFTEVURURfS0VZX1ZBTFVFIDEKKworLyoqCisgKiBUaGUgaGFzaCB0YWJsZSBkYXRhIHN0cnVjdHVyZS4gIAorICovCitzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlIHsKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKKyAgIEdMdWludCBNYXhLZXk7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBoaWdoZXN0IGtleSBpbnNlcnRlZCBzbyBmYXIgKi8KKyAgIG10eF90IE11dGV4OyAgICAgICAgICAgICAgICAvKio8IG11dHVhbCBleGNsdXNpb24gbG9jayAqLworICAgbXR4X3QgV2Fsa011dGV4OyAgICAgICAgICAgIC8qKjwgZm9yIF9tZXNhX0hhc2hXYWxrKCkgKi8KKyAgIEdMYm9vbGVhbiBJbkRlbGV0ZUFsbDsgICAgICAgICAgICAgICAgLyoqPCBEZWJ1ZyBjaGVjayAqLworICAgLyoqIFZhbHVlIHRoYXQgd291bGQgYmUgaW4gdGhlIHRhYmxlIGZvciBERUxFVEVEX0tFWV9WQUxVRS4gKi8KKyAgIHZvaWQgKmRlbGV0ZWRfa2V5X2RhdGE7Cit9OworCisvKiogQHsKKyAqIE1hcHBpbmcgZnJvbSBvdXIgdXNlIG9mIEdMdWludCBhcyBib3RoIHRoZSBrZXkgYW5kIHRoZSBoYXNoIHZhbHVlIHRvIHRoZQorICogaGFzaF90YWJsZS5oIEFQSQorICoKKyAqIFRoZXJlIGV4aXN0IG1hbnkgaW50ZWdlciBoYXNoIGZ1bmN0aW9ucywgZGVzaWduZWQgdG8gYXZvaWQgY29sbGlzaW9ucyB3aGVuCisgKiB0aGUgaW50ZWdlcnMgYXJlIHNwcmVhZCBhY3Jvc3Mga2V5IHNwYWNlIHdpdGggc29tZSBwYXR0ZXJucy4gIEluIEdMLCB0aGUKKyAqIHBhdHRlcm4gKGluIHRoZSBjYXNlIG9mIGdsR2VuKigpZWQgb2JqZWN0IElEcykgaXMgdGhhdCB0aGUga2V5cyBhcmUgdW5pcXVlCisgKiBjb250aWd1b3VzIGludGVnZXJzIHN0YXJ0aW5nIGZyb20gMS4gIEJlY2F1c2Ugb2YgdGhhdCwgd2UganVzdCB1c2UgdGhlIGtleQorICogYXMgdGhlIGhhc2ggdmFsdWUsIHRvIG1pbmltaXplIHRoZSBjb3N0IG9mIHRoZSBoYXNoIGZ1bmN0aW9uLiAgSWYgb2JqZWN0cworICogYXJlIG5ldmVyIGRlbGV0ZWQsIHdlIHdpbGwgbmV2ZXIgc2VlIGEgY29sbGlzaW9uIGluIHRoZSB0YWJsZSwgYmVjYXVzZSB0aGUKKyAqIHRhYmxlIHJlc2l6ZXMgaXRzZWxmIHdoZW4gaXQgYXBwcm9hY2hlcyBmdWxsLCBhbmQgdGh1cyBrZXkgJSB0YWJsZV9zaXplID09CisgKiBrZXkuCisgKgorICogVGhlIGNhc2Ugd2hlcmUgd2UgY291bGQgaGF2ZSBjb2xsaXNpb25zIGZvciBnZW5uZWQgb2JqZWN0cyB3b3VsZCBiZQorICogc29tZXRoaW5nIGxpa2U6IGdsR2VuQnVmZmVycygmYSwgMTAwKTsgZ2xEZWxldGVCdWZmZXJzKCZhICsgNTAsIDUwKTsKKyAqIGdsR2VuQnVmZmVycygmYiwgMTAwKSwgYmVjYXVzZSBvYmplY3RzIDEtNTAgYW5kIDEwMS0yMDAgYXJlIGFsbG9jYXRlZCBhdAorICogdGhlIGVuZCBvZiB0aGF0IHNlcXVlbmNlLCBpbnN0ZWFkIG9mIDEtMTUwLiAgU28gZmFyIGl0IGRvZXNuJ3QgYXBwZWFyIHRvIGJlCisgKiBhIHByb2JsZW0uCisgKi8KK3N0YXRpYyBib29sCit1aW50X2tleV9jb21wYXJlKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICByZXR1cm4gYSA9PSBiOworfQorCitzdGF0aWMgdWludDMyX3QKK3VpbnRfaGFzaChHTHVpbnQgaWQpCit7CisgICByZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyB2b2lkICoKK3VpbnRfa2V5KEdMdWludCBpZCkKK3sKKyAgIHJldHVybiAodm9pZCAqKSh1aW50cHRyX3QpIGlkOworfQorLyoqIEB9ICovCisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGhhc2ggdGFibGUuCisgKiAKKyAqIFxyZXR1cm4gcG9pbnRlciB0byBhIG5ldywgZW1wdHkgaGFzaCB0YWJsZS4KKyAqLworc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqCitfbWVzYV9OZXdIYXNoVGFibGUodm9pZCkKK3sKKyAgIHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlID0gQ0FMTE9DX1NUUlVDVChfbWVzYV9IYXNoVGFibGUpOworCisgICBpZiAodGFibGUpIHsKKyAgICAgIHRhYmxlLT5odCA9IF9tZXNhX2hhc2hfdGFibGVfY3JlYXRlKE5VTEwsIHVpbnRfa2V5X2NvbXBhcmUpOworICAgICAgX21lc2FfaGFzaF90YWJsZV9zZXRfZGVsZXRlZF9rZXkodGFibGUtPmh0LCB1aW50X2tleShERUxFVEVEX0tFWV9WQUxVRSkpOworICAgICAgbXR4X2luaXQoJnRhYmxlLT5NdXRleCwgbXR4X3BsYWluKTsKKyAgICAgIG10eF9pbml0KCZ0YWJsZS0+V2Fsa011dGV4LCBtdHhfcGxhaW4pOworICAgfQorICAgcmV0dXJuIHRhYmxlOworfQorCisKKworLyoqCisgKiBEZWxldGUgYSBoYXNoIHRhYmxlLgorICogRnJlZXMgZWFjaCBlbnRyeSBvbiB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlbiB0aGUgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICogTm90ZSB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgYWxyZWFkeSB0cmF2ZXJzZWQgdGhlIHRhYmxlIGFuZCBkZWxldGVkCisgKiB0aGUgb2JqZWN0cyBpbiB0aGUgdGFibGUgKGkuZS4gV2UgZG9uJ3QgZnJlZSB0aGUgZW50cmllcycgZGF0YSBwb2ludGVyKS4KKyAqCisgKiBccGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gZGVsZXRlLgorICovCit2b2lkCitfbWVzYV9EZWxldGVIYXNoVGFibGUoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUpCit7CisgICBhc3NlcnQodGFibGUpOworCisgICBpZiAoX21lc2FfaGFzaF90YWJsZV9uZXh0X2VudHJ5KHRhYmxlLT5odCwgTlVMTCkgIT0gTlVMTCkgeworICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiSW4gX21lc2FfRGVsZXRlSGFzaFRhYmxlLCBmb3VuZCBub24tZnJlZWQgZGF0YSIpOworICAgfQorCisgICBfbWVzYV9oYXNoX3RhYmxlX2Rlc3Ryb3kodGFibGUtPmh0LCBOVUxMKTsKKworICAgbXR4X2Rlc3Ryb3koJnRhYmxlLT5NdXRleCk7CisgICBtdHhfZGVzdHJveSgmdGFibGUtPldhbGtNdXRleCk7CisgICBmcmVlKHRhYmxlKTsKK30KKworCisKKy8qKgorICogTG9va3VwIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLCB3aXRob3V0IGxvY2tpbmcuCisgKiBcc2EgX21lc2FfSGFzaExvb2t1cAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX21lc2FfSGFzaExvb2t1cF91bmxvY2tlZChzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSwgR0x1aW50IGtleSkKK3sKKyAgIGNvbnN0IHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKworICAgYXNzZXJ0KHRhYmxlKTsKKyAgIGFzc2VydChrZXkpOworCisgICBpZiAoa2V5ID09IERFTEVURURfS0VZX1ZBTFVFKQorICAgICAgcmV0dXJuIHRhYmxlLT5kZWxldGVkX2tleV9kYXRhOworCisgICBlbnRyeSA9IF9tZXNhX2hhc2hfdGFibGVfc2VhcmNoKHRhYmxlLT5odCwgdWludF9oYXNoKGtleSksIHVpbnRfa2V5KGtleSkpOworICAgaWYgKCFlbnRyeSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICByZXR1cm4gZW50cnktPmRhdGE7Cit9CisKKworLyoqCisgKiBMb29rdXAgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuCisgKiAKKyAqIFxwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIFxwYXJhbSBrZXkgdGhlIGtleS4KKyAqIAorICogXHJldHVybiBwb2ludGVyIHRvIHVzZXIncyBkYXRhIG9yIE5VTEwgaWYga2V5IG5vdCBpbiB0YWJsZQorICovCit2b2lkICoKK19tZXNhX0hhc2hMb29rdXAoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsIEdMdWludCBrZXkpCit7CisgICB2b2lkICpyZXM7CisgICBhc3NlcnQodGFibGUpOworICAgbXR4X2xvY2soJnRhYmxlLT5NdXRleCk7CisgICByZXMgPSBfbWVzYV9IYXNoTG9va3VwX3VubG9ja2VkKHRhYmxlLCBrZXkpOworICAgbXR4X3VubG9jaygmdGFibGUtPk11dGV4KTsKKyAgIHJldHVybiByZXM7Cit9CisKKworLyoqCisgKiBMb29rdXAgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgd2l0aG91dCBsb2NraW5nIHRoZSBtdXRleC4KKyAqCisgKiBUaGUgaGFzaCB0YWJsZSBtdXRleCBtdXN0IGJlIGxvY2tlZCBtYW51YWxseSBieSBjYWxsaW5nCisgKiBfbWVzYV9IYXNoTG9ja011dGV4KCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBccGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBccGFyYW0ga2V5IHRoZSBrZXkuCisgKgorICogXHJldHVybiBwb2ludGVyIHRvIHVzZXIncyBkYXRhIG9yIE5VTEwgaWYga2V5IG5vdCBpbiB0YWJsZQorICovCit2b2lkICoKK19tZXNhX0hhc2hMb29rdXBMb2NrZWQoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsIEdMdWludCBrZXkpCit7CisgICByZXR1cm4gX21lc2FfSGFzaExvb2t1cF91bmxvY2tlZCh0YWJsZSwga2V5KTsKK30KKworCisvKioKKyAqIExvY2sgdGhlIGhhc2ggdGFibGUgbXV0ZXguCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aGVuIG11bHRpcGxlIG9iamVjdHMgbmVlZAorICogdG8gYmUgbG9va2VkIHVwIGluIHRoZSBoYXNoIHRhYmxlLCB0byBhdm9pZCBoYXZpbmcgdG8gbG9jaworICogYW5kIHVubG9jayB0aGUgbXV0ZXggZWFjaCB0aW1lLgorICoKKyAqIFxwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqLwordm9pZAorX21lc2FfSGFzaExvY2tNdXRleChzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgIGFzc2VydCh0YWJsZSk7CisgICBtdHhfbG9jaygmdGFibGUtPk11dGV4KTsKK30KKworCisvKioKKyAqIFVubG9jayB0aGUgaGFzaCB0YWJsZSBtdXRleC4KKyAqCisgKiBccGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKi8KK3ZvaWQKK19tZXNhX0hhc2hVbmxvY2tNdXRleChzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgIGFzc2VydCh0YWJsZSk7CisgICBtdHhfdW5sb2NrKCZ0YWJsZS0+TXV0ZXgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX21lc2FfSGFzaEluc2VydF91bmxvY2tlZChzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSwgR0x1aW50IGtleSwgdm9pZCAqZGF0YSkKK3sKKyAgIHVpbnQzMl90IGhhc2ggPSB1aW50X2hhc2goa2V5KTsKKyAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKworICAgYXNzZXJ0KHRhYmxlKTsKKyAgIGFzc2VydChrZXkpOworCisgICBpZiAoa2V5ID4gdGFibGUtPk1heEtleSkKKyAgICAgIHRhYmxlLT5NYXhLZXkgPSBrZXk7CisKKyAgIGlmIChrZXkgPT0gREVMRVRFRF9LRVlfVkFMVUUpIHsKKyAgICAgIHRhYmxlLT5kZWxldGVkX2tleV9kYXRhID0gZGF0YTsKKyAgIH0gZWxzZSB7CisgICAgICBlbnRyeSA9IF9tZXNhX2hhc2hfdGFibGVfc2VhcmNoKHRhYmxlLT5odCwgaGFzaCwgdWludF9rZXkoa2V5KSk7CisgICAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgIGVudHJ5LT5kYXRhID0gZGF0YTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBfbWVzYV9oYXNoX3RhYmxlX2luc2VydCh0YWJsZS0+aHQsIGhhc2gsIHVpbnRfa2V5KGtleSksIGRhdGEpOworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogSW5zZXJ0IGEga2V5L3BvaW50ZXIgcGFpciBpbnRvIHRoZSBoYXNoIHRhYmxlIHdpdGhvdXQgbG9ja2luZyB0aGUgbXV0ZXguCisgKiBJZiBhbiBlbnRyeSB3aXRoIHRoaXMga2V5IGFscmVhZHkgZXhpc3RzIHdlJ2xsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGVudHJ5LgorICoKKyAqIFRoZSBoYXNoIHRhYmxlIG11dGV4IG11c3QgYmUgbG9ja2VkIG1hbnVhbGx5IGJ5IGNhbGxpbmcKKyAqIF9tZXNhX0hhc2hMb2NrTXV0ZXgoKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFxwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIFxwYXJhbSBrZXkgdGhlIGtleSAobm90IHplcm8pLgorICogXHBhcmFtIGRhdGEgcG9pbnRlciB0byB1c2VyIGRhdGEuCisgKi8KK3ZvaWQKK19tZXNhX0hhc2hJbnNlcnRMb2NrZWQoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsIEdMdWludCBrZXksIHZvaWQgKmRhdGEpCit7CisgICBfbWVzYV9IYXNoSW5zZXJ0X3VubG9ja2VkKHRhYmxlLCBrZXksIGRhdGEpOworfQorCisKKy8qKgorICogSW5zZXJ0IGEga2V5L3BvaW50ZXIgcGFpciBpbnRvIHRoZSBoYXNoIHRhYmxlLgorICogSWYgYW4gZW50cnkgd2l0aCB0aGlzIGtleSBhbHJlYWR5IGV4aXN0cyB3ZSdsbCByZXBsYWNlIHRoZSBleGlzdGluZyBlbnRyeS4KKyAqCisgKiBccGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBccGFyYW0ga2V5IHRoZSBrZXkgKG5vdCB6ZXJvKS4KKyAqIFxwYXJhbSBkYXRhIHBvaW50ZXIgdG8gdXNlciBkYXRhLgorICovCit2b2lkCitfbWVzYV9IYXNoSW5zZXJ0KHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlLCBHTHVpbnQga2V5LCB2b2lkICpkYXRhKQoreworICAgYXNzZXJ0KHRhYmxlKTsKKyAgIG10eF9sb2NrKCZ0YWJsZS0+TXV0ZXgpOworICAgX21lc2FfSGFzaEluc2VydF91bmxvY2tlZCh0YWJsZSwga2V5LCBkYXRhKTsKKyAgIG10eF91bmxvY2soJnRhYmxlLT5NdXRleCk7Cit9CisKKworLyoqCisgKiBSZW1vdmUgYW4gZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZS4KKyAqIAorICogXHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogXHBhcmFtIGtleSBrZXkgb2YgZW50cnkgdG8gcmVtb3ZlLgorICoKKyAqIFdoaWxlIGhvbGRpbmcgdGhlIGhhc2ggdGFibGUncyBsb2NrLCBzZWFyY2hlcyB0aGUgZW50cnkgd2l0aCB0aGUgbWF0Y2hpbmcKKyAqIGtleSBhbmQgdW5saW5rcyBpdC4KKyAqLwordm9pZAorX21lc2FfSGFzaFJlbW92ZShzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSwgR0x1aW50IGtleSkKK3sKKyAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKworICAgYXNzZXJ0KHRhYmxlKTsKKyAgIGFzc2VydChrZXkpOworCisgICAvKiBoYXZlIHRvIGNoZWNrIHRoaXMgb3V0c2lkZSBvZiBtdXRleCBsb2NrICovCisgICBpZiAodGFibGUtPkluRGVsZXRlQWxsKSB7CisgICAgICBfbWVzYV9wcm9ibGVtKE5VTEwsICJfbWVzYV9IYXNoUmVtb3ZlIGlsbGVnYWxseSBjYWxsZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICJfbWVzYV9IYXNoRGVsZXRlQWxsIGNhbGxiYWNrIGZ1bmN0aW9uIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIG10eF9sb2NrKCZ0YWJsZS0+TXV0ZXgpOworICAgaWYgKGtleSA9PSBERUxFVEVEX0tFWV9WQUxVRSkgeworICAgICAgdGFibGUtPmRlbGV0ZWRfa2V5X2RhdGEgPSBOVUxMOworICAgfSBlbHNlIHsKKyAgICAgIGVudHJ5ID0gX21lc2FfaGFzaF90YWJsZV9zZWFyY2godGFibGUtPmh0LCB1aW50X2hhc2goa2V5KSwgdWludF9rZXkoa2V5KSk7CisgICAgICBfbWVzYV9oYXNoX3RhYmxlX3JlbW92ZSh0YWJsZS0+aHQsIGVudHJ5KTsKKyAgIH0KKyAgIG10eF91bmxvY2soJnRhYmxlLT5NdXRleCk7Cit9CisKKworCisvKioKKyAqIERlbGV0ZSBhbGwgZW50cmllcyBpbiBhIGhhc2ggdGFibGUsIGJ1dCBkb24ndCBkZWxldGUgdGhlIHRhYmxlIGl0c2VsZi4KKyAqIEludm9rZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2ggdGFibGUgZW50cnkuCisgKgorICogXHBhcmFtIHRhYmxlICB0aGUgaGFzaCB0YWJsZSB0byBkZWxldGUKKyAqIFxwYXJhbSBjYWxsYmFjayAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBccGFyYW0gdXNlckRhdGEgIGFyYml0cmFyeSBwb2ludGVyIHRvIHBhc3MgYWxvbmcgdG8gdGhlIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgICAgICh0aGlzIGlzIHR5cGljYWxseSBhIHN0cnVjdCBnbF9jb250ZXh0IHBvaW50ZXIpCisgKi8KK3ZvaWQKK19tZXNhX0hhc2hEZWxldGVBbGwoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYWxsYmFjaykoR0x1aW50IGtleSwgdm9pZCAqZGF0YSwgdm9pZCAqdXNlckRhdGEpLAorICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSkKK3sKKyAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKworICAgQVNTRVJUKHRhYmxlKTsKKyAgIEFTU0VSVChjYWxsYmFjayk7CisgICBtdHhfbG9jaygmdGFibGUtPk11dGV4KTsKKyAgIHRhYmxlLT5JbkRlbGV0ZUFsbCA9IEdMX1RSVUU7CisgICBoYXNoX3RhYmxlX2ZvcmVhY2godGFibGUtPmh0LCBlbnRyeSkgeworICAgICAgY2FsbGJhY2soKHVpbnRwdHJfdCllbnRyeS0+a2V5LCBlbnRyeS0+ZGF0YSwgdXNlckRhdGEpOworICAgICAgX21lc2FfaGFzaF90YWJsZV9yZW1vdmUodGFibGUtPmh0LCBlbnRyeSk7CisgICB9CisgICBpZiAodGFibGUtPmRlbGV0ZWRfa2V5X2RhdGEpIHsKKyAgICAgIGNhbGxiYWNrKERFTEVURURfS0VZX1ZBTFVFLCB0YWJsZS0+ZGVsZXRlZF9rZXlfZGF0YSwgdXNlckRhdGEpOworICAgICAgdGFibGUtPmRlbGV0ZWRfa2V5X2RhdGEgPSBOVUxMOworICAgfQorICAgdGFibGUtPkluRGVsZXRlQWxsID0gR0xfRkFMU0U7CisgICBtdHhfdW5sb2NrKCZ0YWJsZS0+TXV0ZXgpOworfQorCisKKy8qKgorICogQ2xvbmUgYWxsIGVudHJpZXMgaW4gYSBoYXNoIHRhYmxlLCBpbnRvIGEgbmV3IHRhYmxlLgorICoKKyAqIFxwYXJhbSB0YWJsZSAgdGhlIGhhc2ggdGFibGUgdG8gY2xvbmUKKyAqLworc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqCitfbWVzYV9IYXNoQ2xvbmUoY29uc3Qgc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUpCit7CisgICAvKiBjYXN0LWF3YXkgY29uc3QgKi8KKyAgIHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlMiA9IChzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICopIHRhYmxlOworICAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OworICAgc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqY2xvbmV0YWJsZTsKKworICAgQVNTRVJUKHRhYmxlKTsKKyAgIG10eF9sb2NrKCZ0YWJsZTItPk11dGV4KTsKKworICAgY2xvbmV0YWJsZSA9IF9tZXNhX05ld0hhc2hUYWJsZSgpOworICAgYXNzZXJ0KGNsb25ldGFibGUpOworICAgaGFzaF90YWJsZV9mb3JlYWNoKHRhYmxlLT5odCwgZW50cnkpIHsKKyAgICAgIF9tZXNhX0hhc2hJbnNlcnQoY2xvbmV0YWJsZSwgKEdMaW50KSh1aW50cHRyX3QpZW50cnktPmtleSwgZW50cnktPmRhdGEpOworICAgfQorCisgICBtdHhfdW5sb2NrKCZ0YWJsZTItPk11dGV4KTsKKworICAgcmV0dXJuIGNsb25ldGFibGU7Cit9CisKKworLyoqCisgKiBXYWxrIG92ZXIgYWxsIGVudHJpZXMgaW4gYSBoYXNoIHRhYmxlLCBjYWxsaW5nIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoLgorICogTm90ZTogd2UgdXNlIGEgc2VwYXJhdGUgbXV0ZXggaW4gdGhpcyBmdW5jdGlvbiB0byBhdm9pZCBhIHJlY3Vyc2l2ZQorICogbG9ja2luZyBkZWFkbG9jayAoaW4gY2FzZSB0aGUgY2FsbGJhY2sgY2FsbHMgX21lc2FfSGFzaFJlbW92ZSgpKSBhbmQgdG8KKyAqIHByZXZlbnQgbXVsdGlwbGUgdGhyZWFkcy9jb250ZXh0cyBmcm9tIGdldHRpbmcgdGFuZ2xlZCB1cC4KKyAqIEEgbG9jay1sZXNzIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIHdoZW4gdGhlIHRhYmxlIHdpbGwKKyAqIG5vdCBiZSBtb2RpZmllZC4KKyAqIFxwYXJhbSB0YWJsZSAgdGhlIGhhc2ggdGFibGUgdG8gd2FsaworICogXHBhcmFtIGNhbGxiYWNrICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIFxwYXJhbSB1c2VyRGF0YSAgYXJiaXRyYXJ5IHBvaW50ZXIgdG8gcGFzcyBhbG9uZyB0byB0aGUgY2FsbGJhY2sKKyAqICAgICAgICAgICAgICAgICAgKHRoaXMgaXMgdHlwaWNhbGx5IGEgc3RydWN0IGdsX2NvbnRleHQgcG9pbnRlcikKKyAqLwordm9pZAorX21lc2FfSGFzaFdhbGsoY29uc3Qgc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICB2b2lkICgqY2FsbGJhY2spKEdMdWludCBrZXksIHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJEYXRhKSwKKyAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKQoreworICAgLyogY2FzdC1hd2F5IGNvbnN0ICovCisgICBzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZTIgPSAoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqKSB0YWJsZTsKKyAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKworICAgQVNTRVJUKHRhYmxlKTsKKyAgIEFTU0VSVChjYWxsYmFjayk7CisgICBtdHhfbG9jaygmdGFibGUyLT5XYWxrTXV0ZXgpOworICAgaGFzaF90YWJsZV9mb3JlYWNoKHRhYmxlLT5odCwgZW50cnkpIHsKKyAgICAgIGNhbGxiYWNrKCh1aW50cHRyX3QpZW50cnktPmtleSwgZW50cnktPmRhdGEsIHVzZXJEYXRhKTsKKyAgIH0KKyAgIGlmICh0YWJsZS0+ZGVsZXRlZF9rZXlfZGF0YSkKKyAgICAgIGNhbGxiYWNrKERFTEVURURfS0VZX1ZBTFVFLCB0YWJsZS0+ZGVsZXRlZF9rZXlfZGF0YSwgdXNlckRhdGEpOworICAgbXR4X3VubG9jaygmdGFibGUyLT5XYWxrTXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfcHJpbnRfZW50cnkoR0x1aW50IGtleSwgdm9pZCAqZGF0YSwgdm9pZCAqdXNlckRhdGEpCit7CisgICBfbWVzYV9kZWJ1ZyhOVUxMLCAiJXUgJXBcbiIsIGtleSwgZGF0YSk7Cit9CisKKy8qKgorICogRHVtcCBjb250ZW50cyBvZiBoYXNoIHRhYmxlIGZvciBkZWJ1Z2dpbmcuCisgKiAKKyAqIFxwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqLwordm9pZAorX21lc2FfSGFzaFByaW50KGNvbnN0IHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlKQoreworICAgaWYgKHRhYmxlLT5kZWxldGVkX2tleV9kYXRhKQorICAgICAgZGVidWdfcHJpbnRfZW50cnkoREVMRVRFRF9LRVlfVkFMVUUsIHRhYmxlLT5kZWxldGVkX2tleV9kYXRhLCBOVUxMKTsKKyAgIF9tZXNhX0hhc2hXYWxrKHRhYmxlLCBkZWJ1Z19wcmludF9lbnRyeSwgTlVMTCk7Cit9CisKKworLyoqCisgKiBGaW5kIGEgYmxvY2sgb2YgYWRqYWNlbnQgdW51c2VkIGhhc2gga2V5cy4KKyAqIAorICogXHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogXHBhcmFtIG51bUtleXMgbnVtYmVyIG9mIGtleXMgbmVlZGVkLgorICogCisgKiBccmV0dXJuIFN0YXJ0aW5nIGtleSBvZiBmcmVlIGJsb2NrIG9yIDAgaWYgZmFpbHVyZS4KKyAqCisgKiBJZiB0aGVyZSBhcmUgZW5vdWdoIGZyZWUga2V5cyBiZXR3ZWVuIHRoZSBtYXhpbXVtIGtleSBleGlzdGluZyBpbiB0aGUgdGFibGUKKyAqIChfbWVzYV9IYXNoVGFibGU6Ok1heEtleSkgYW5kIHRoZSBtYXhpbXVtIGtleSBwb3NzaWJsZSwgdGhlbiBzaW1wbHkgcmV0dXJuCisgKiB0aGUgYWRqYWNlbnQga2V5LiBPdGhlcndpc2UgZG8gYSBmdWxsIHNlYXJjaCBmb3IgYSBmcmVlIGtleSBibG9jayBpbiB0aGUKKyAqIGFsbG93YWJsZSBrZXkgcmFuZ2UuCisgKi8KK0dMdWludAorX21lc2FfSGFzaEZpbmRGcmVlS2V5QmxvY2soc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsIEdMdWludCBudW1LZXlzKQoreworICAgY29uc3QgR0x1aW50IG1heEtleSA9IH4oKEdMdWludCkgMCkgLSAxOworICAgbXR4X2xvY2soJnRhYmxlLT5NdXRleCk7CisgICBpZiAobWF4S2V5IC0gbnVtS2V5cyA+IHRhYmxlLT5NYXhLZXkpIHsKKyAgICAgIC8qIHRoZSBxdWljayBzb2x1dGlvbiAqLworICAgICAgbXR4X3VubG9jaygmdGFibGUtPk11dGV4KTsKKyAgICAgIHJldHVybiB0YWJsZS0+TWF4S2V5ICsgMTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogdGhlIHNsb3cgc29sdXRpb24gKi8KKyAgICAgIEdMdWludCBmcmVlQ291bnQgPSAwOworICAgICAgR0x1aW50IGZyZWVTdGFydCA9IDE7CisgICAgICBHTHVpbnQga2V5OworICAgICAgZm9yIChrZXkgPSAxOyBrZXkgIT0gbWF4S2V5OyBrZXkrKykgeworCSBpZiAoX21lc2FfSGFzaExvb2t1cF91bmxvY2tlZCh0YWJsZSwga2V5KSkgeworCSAgICAvKiBkYXJuLCB0aGlzIGtleSBpcyBhbHJlYWR5IGluIHVzZSAqLworCSAgICBmcmVlQ291bnQgPSAwOworCSAgICBmcmVlU3RhcnQgPSBrZXkrMTsKKwkgfQorCSBlbHNlIHsKKwkgICAgLyogdGhpcyBrZXkgbm90IGluIHVzZSwgY2hlY2sgaWYgd2UndmUgZm91bmQgZW5vdWdoICovCisJICAgIGZyZWVDb3VudCsrOworCSAgICBpZiAoZnJlZUNvdW50ID09IG51bUtleXMpIHsKKyAgICAgICAgICAgICAgIG10eF91bmxvY2soJnRhYmxlLT5NdXRleCk7CisJICAgICAgIHJldHVybiBmcmVlU3RhcnQ7CisJICAgIH0KKwkgfQorICAgICAgfQorICAgICAgLyogY2Fubm90IGFsbG9jYXRlIGEgYmxvY2sgb2YgbnVtS2V5cyBjb25zZWN1dGl2ZSBrZXlzICovCisgICAgICBtdHhfdW5sb2NrKCZ0YWJsZS0+TXV0ZXgpOworICAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKKworLyoqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLgorICovCitHTHVpbnQKK19tZXNhX0hhc2hOdW1FbnRyaWVzKGNvbnN0IHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlKQoreworICAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OworICAgR0x1aW50IGNvdW50ID0gMDsKKworICAgaWYgKHRhYmxlLT5kZWxldGVkX2tleV9kYXRhKQorICAgICAgY291bnQrKzsKKworICAgaGFzaF90YWJsZV9mb3JlYWNoKHRhYmxlLT5odCwgZW50cnkpCisgICAgICBjb3VudCsrOworCisgICByZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2hhc2guaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZThmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2hhc2guaApAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIFxmaWxlIGhhc2guaAorICogR2VuZXJpYyBoYXNoIHRhYmxlLiAKKyAqLworCisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBIQVNIX0gKKyNkZWZpbmUgSEFTSF9ICisKKworI2luY2x1ZGUgImdsaGVhZGVyLmgiCisKKworZXh0ZXJuIHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKl9tZXNhX05ld0hhc2hUYWJsZSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgX21lc2FfRGVsZXRlSGFzaFRhYmxlKHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlKTsKKworZXh0ZXJuIHZvaWQgKl9tZXNhX0hhc2hMb29rdXAoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsIEdMdWludCBrZXkpOworCitleHRlcm4gdm9pZCBfbWVzYV9IYXNoSW5zZXJ0KHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlLCBHTHVpbnQga2V5LCB2b2lkICpkYXRhKTsKKworZXh0ZXJuIHZvaWQgX21lc2FfSGFzaFJlbW92ZShzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSwgR0x1aW50IGtleSk7CisKK2V4dGVybiB2b2lkIF9tZXNhX0hhc2hMb2NrTXV0ZXgoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUpOworCitleHRlcm4gdm9pZCBfbWVzYV9IYXNoVW5sb2NrTXV0ZXgoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUpOworCitleHRlcm4gdm9pZCAqX21lc2FfSGFzaExvb2t1cExvY2tlZChzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSwgR0x1aW50IGtleSk7CisKK2V4dGVybiB2b2lkIF9tZXNhX0hhc2hJbnNlcnRMb2NrZWQoc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBrZXksIHZvaWQgKmRhdGEpOworCitleHRlcm4gdm9pZAorX21lc2FfSGFzaERlbGV0ZUFsbChzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNhbGxiYWNrKShHTHVpbnQga2V5LCB2b2lkICpkYXRhLCB2b2lkICp1c2VyRGF0YSksCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKworZXh0ZXJuIHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKgorX21lc2FfSGFzaENsb25lKGNvbnN0IHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX0hhc2hXYWxrKGNvbnN0IHN0cnVjdCBfbWVzYV9IYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgdm9pZCAoKmNhbGxiYWNrKShHTHVpbnQga2V5LCB2b2lkICpkYXRhLCB2b2lkICp1c2VyRGF0YSksCisgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSk7CisKK2V4dGVybiB2b2lkIF9tZXNhX0hhc2hQcmludChjb25zdCBzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICp0YWJsZSk7CisKK2V4dGVybiBHTHVpbnQgX21lc2FfSGFzaEZpbmRGcmVlS2V5QmxvY2soc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUsIEdMdWludCBudW1LZXlzKTsKKworZXh0ZXJuIEdMdWludAorX21lc2FfSGFzaE51bUVudHJpZXMoY29uc3Qgc3RydWN0IF9tZXNhX0hhc2hUYWJsZSAqdGFibGUpOworCitleHRlcm4gdm9pZCBfbWVzYV90ZXN0X2hhc2hfZnVuY3Rpb25zKHZvaWQpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9oYXNoX3RhYmxlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2hhc2hfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmM1ODUxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9oYXNoX3RhYmxlLmMKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSwyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMTk4OC0yMDA0IEtlaXRoIFBhY2thcmQgYW5kIEJhcnQgTWFzc2V5LgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMKKyAqIG9yIHRoZWlyIGluc3RpdHV0aW9ucyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzCisgKiBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZQorICogYXV0aG9ycy4KKyAqCisgKiBBdXRob3JzOgorICogICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqICAgIEtlaXRoIFBhY2thcmQgPGtlaXRocEBrZWl0aHAuY29tPgorICovCisKKy8qKgorICogSW1wbGVtZW50cyBhbiBvcGVuLWFkZHJlc3NpbmcsIGxpbmVhci1yZXByb2JpbmcgaGFzaCB0YWJsZS4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOgorICoKKyAqIGh0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9+YW5ob2x0L2hhc2hfdGFibGUvdHJlZS9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpY2QtdXRpbHMuaCIgLy8gTHVuYXJHOiBBREQKKyNpbmNsdWRlICJtYWluL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgInJhbGxvYy5oIgorCitzdGF0aWMgY29uc3QgdWludDMyX3QgZGVsZXRlZF9rZXlfdmFsdWU7CisKKy8qKgorICogRnJvbSBLbnV0aCAtLSBhIGdvb2QgY2hvaWNlIGZvciBoYXNoL3JlaGFzaCB2YWx1ZXMgaXMgcCwgcC0yIHdoZXJlCisgKiBwIGFuZCBwLTIgYXJlIGJvdGggcHJpbWUuICBUaGVzZSB0YWJsZXMgYXJlIHNpemVkIHRvIGhhdmUgYW4gZXh0cmEgMTAlCisgKiBmcmVlIHRvIGF2b2lkIGV4cG9uZW50aWFsIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGFzIHRoZSBoYXNoIHRhYmxlIGZpbGxzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgdWludDMyX3QgbWF4X2VudHJpZXMsIHNpemUsIHJlaGFzaDsKK30gaGFzaF9zaXplc1tdID0geworICAgeyAyLAkJCTUsCQkzCSAgfSwKKyAgIHsgNCwJCQk3LAkJNQkgIH0sCisgICB7IDgsCQkJMTMsCQkxMQkgIH0sCisgICB7IDE2LAkJMTksCQkxNwkgIH0sCisgICB7IDMyLAkJNDMsCQk0MSAgICAgICAgfSwKKyAgIHsgNjQsCQk3MywJCTcxICAgICAgICB9LAorICAgeyAxMjgsCQkxNTEsCQkxNDkgICAgICAgfSwKKyAgIHsgMjU2LAkJMjgzLAkJMjgxICAgICAgIH0sCisgICB7IDUxMiwJCTU3MSwJCTU2OSAgICAgICB9LAorICAgeyAxMDI0LAkJMTE1MywJCTExNTEgICAgICB9LAorICAgeyAyMDQ4LAkJMjI2OSwJCTIyNjcgICAgICB9LAorICAgeyA0MDk2LAkJNDUxOSwJCTQ1MTcgICAgICB9LAorICAgeyA4MTkyLAkJOTAxMywJCTkwMTEgICAgICB9LAorICAgeyAxNjM4NCwJCTE4MDQzLAkJMTgwNDEgICAgIH0sCisgICB7IDMyNzY4LAkJMzYxMDksCQkzNjEwNyAgICAgfSwKKyAgIHsgNjU1MzYsCQk3MjA5MSwJCTcyMDg5ICAgICB9LAorICAgeyAxMzEwNzIsCQkxNDQ0MDksCQkxNDQ0MDcgICAgfSwKKyAgIHsgMjYyMTQ0LAkJMjg4MzYxLAkJMjg4MzU5ICAgIH0sCisgICB7IDUyNDI4OCwJCTU3Njg4MywJCTU3Njg4MSAgICB9LAorICAgeyAxMDQ4NTc2LAkJMTE1MzQ1OSwJMTE1MzQ1NyAgIH0sCisgICB7IDIwOTcxNTIsCQkyMzA3MTYzLAkyMzA3MTYxICAgfSwKKyAgIHsgNDE5NDMwNCwJCTQ2MTM4OTMsCTQ2MTM4OTEgICB9LAorICAgeyA4Mzg4NjA4LAkJOTIyNzY0MSwJOTIyNzYzOSAgIH0sCisgICB7IDE2Nzc3MjE2LAkJMTg0NTUwMjksCTE4NDU1MDI3ICB9LAorICAgeyAzMzU1NDQzMiwJCTM2OTExMDExLAkzNjkxMTAwOSAgfSwKKyAgIHsgNjcxMDg4NjQsCQk3MzgxOTg2MSwJNzM4MTk4NTkgIH0sCisgICB7IDEzNDIxNzcyOCwJCTE0NzYzOTU4OSwJMTQ3NjM5NTg3IH0sCisgICB7IDI2ODQzNTQ1NiwJCTI5NTI3OTA4MSwJMjk1Mjc5MDc5IH0sCisgICB7IDUzNjg3MDkxMiwJCTU5MDU1OTc5MywJNTkwNTU5NzkxIH0sCisgICB7IDEwNzM3NDE4MjQsCTExODExMTYyNzMsCTExODExMTYyNzF9LAorICAgeyAyMTQ3NDgzNjQ4dWwsCTIzNjIyMzIyMzN1bCwJMjM2MjIzMjIzMXVsfQorfTsKKworc3RhdGljIGludAorZW50cnlfaXNfZnJlZShjb25zdCBzdHJ1Y3QgaGFzaF9lbnRyeSAqZW50cnkpCit7CisgICByZXR1cm4gZW50cnktPmtleSA9PSBOVUxMOworfQorCitzdGF0aWMgaW50CitlbnRyeV9pc19kZWxldGVkKGNvbnN0IHN0cnVjdCBoYXNoX3RhYmxlICpodCwgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5KQoreworICAgcmV0dXJuIGVudHJ5LT5rZXkgPT0gaHQtPmRlbGV0ZWRfa2V5OworfQorCitzdGF0aWMgaW50CitlbnRyeV9pc19wcmVzZW50KGNvbnN0IHN0cnVjdCBoYXNoX3RhYmxlICpodCwgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5KQoreworICAgcmV0dXJuIGVudHJ5LT5rZXkgIT0gTlVMTCAmJiBlbnRyeS0+a2V5ICE9IGh0LT5kZWxldGVkX2tleTsKK30KKworc3RydWN0IGhhc2hfdGFibGUgKgorX21lc2FfaGFzaF90YWJsZV9jcmVhdGUodm9pZCAqbWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCprZXlfZXF1YWxzX2Z1bmN0aW9uKShjb25zdCB2b2lkICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmIpKQoreworICAgc3RydWN0IGhhc2hfdGFibGUgKmh0OworCisgICBodCA9IHJhbGxvYyhtZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSk7CisgICBpZiAoaHQgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBodC0+c2l6ZV9pbmRleCA9IDA7CisgICBodC0+c2l6ZSA9IGhhc2hfc2l6ZXNbaHQtPnNpemVfaW5kZXhdLnNpemU7CisgICBodC0+cmVoYXNoID0gaGFzaF9zaXplc1todC0+c2l6ZV9pbmRleF0ucmVoYXNoOworICAgaHQtPm1heF9lbnRyaWVzID0gaGFzaF9zaXplc1todC0+c2l6ZV9pbmRleF0ubWF4X2VudHJpZXM7CisgICBodC0+a2V5X2VxdWFsc19mdW5jdGlvbiA9IGtleV9lcXVhbHNfZnVuY3Rpb247CisgICBodC0+dGFibGUgPSByemFsbG9jX2FycmF5KGh0LCBzdHJ1Y3QgaGFzaF9lbnRyeSwgaHQtPnNpemUpOworICAgaHQtPmVudHJpZXMgPSAwOworICAgaHQtPmRlbGV0ZWRfZW50cmllcyA9IDA7CisgICBodC0+ZGVsZXRlZF9rZXkgPSAmZGVsZXRlZF9rZXlfdmFsdWU7CisKKyAgIGlmIChodC0+dGFibGUgPT0gTlVMTCkgeworICAgICAgcmFsbG9jX2ZyZWUoaHQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHJldHVybiBodDsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgZ2l2ZW4gaGFzaCB0YWJsZS4KKyAqCisgKiBJZiBkZWxldGVfZnVuY3Rpb24gaXMgcGFzc2VkLCBpdCBnZXRzIGNhbGxlZCBvbiBlYWNoIGVudHJ5IHByZXNlbnQgYmVmb3JlCisgKiBmcmVlaW5nLgorICovCit2b2lkCitfbWVzYV9oYXNoX3RhYmxlX2Rlc3Ryb3koc3RydWN0IGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZWxldGVfZnVuY3Rpb24pKHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeSkpCit7CisgICBpZiAoIWh0KQorICAgICAgcmV0dXJuOworCisgICBpZiAoZGVsZXRlX2Z1bmN0aW9uKSB7CisgICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqZW50cnk7CisKKyAgICAgIGhhc2hfdGFibGVfZm9yZWFjaChodCwgZW50cnkpIHsKKyAgICAgICAgIGRlbGV0ZV9mdW5jdGlvbihlbnRyeSk7CisgICAgICB9CisgICB9CisgICByYWxsb2NfZnJlZShodCk7Cit9CisKKy8qKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUga2V5IHBvaW50ZXIgdXNlZCBmb3IgZGVsZXRlZCBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKyAqCisgKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHVzdWFsbHkga2V5cyBhcmUgYWN0dWFsIHBvaW50ZXJzLCBzbyB3ZSB1c2UgYQorICogZGVmYXVsdCB2YWx1ZSBvZiBhIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHBpZWNlIG9mIHN0b3JhZ2UgaW4gdGhlIGxpYnJhcnkuCisgKiBCdXQgaW4gc29tZSBjYXNlcyBhIGNvbnN1bWVyIHdhbnRzIHRvIHN0b3JlIHNvbWUgb3RoZXIgc29ydCBvZiB2YWx1ZSBpbiB0aGUKKyAqIHRhYmxlLCBsaWtlIGEgdWludDMyX3QsIGluIHdoaWNoIGNhc2UgdGhhdCBwb2ludGVyIG1heSBjb25mbGljdCB3aXRoIG9uZSBvZgorICogdGhlaXIgdmFsaWQga2V5cy4gIFRoaXMgbGV0cyB0aGF0IHVzZXIgc2VsZWN0IGEgc2FmZSB2YWx1ZS4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkga2V5cyBhcmUgYWN0dWFsbHkgZGVsZXRlZCBmcm9tIHRoZSB0YWJsZS4KKyAqLwordm9pZAorX21lc2FfaGFzaF90YWJsZV9zZXRfZGVsZXRlZF9rZXkoc3RydWN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB2b2lkICpkZWxldGVkX2tleSkKK3sKKyAgIGh0LT5kZWxldGVkX2tleSA9IGRlbGV0ZWRfa2V5OworfQorCisvKioKKyAqIEZpbmRzIGEgaGFzaCB0YWJsZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIGhhc2ggb2YgdGhhdCBrZXkuCisgKgorICogUmV0dXJucyBOVUxMIGlmIG5vIGVudHJ5IGlzIGZvdW5kLiAgTm90ZSB0aGF0IHRoZSBkYXRhIHBvaW50ZXIgbWF5IGJlCisgKiBtb2RpZmllZCBieSB0aGUgdXNlci4KKyAqLworc3RydWN0IGhhc2hfZW50cnkgKgorX21lc2FfaGFzaF90YWJsZV9zZWFyY2goc3RydWN0IGhhc2hfdGFibGUgKmh0LCB1aW50MzJfdCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5KQoreworICAgdWludDMyX3Qgc3RhcnRfaGFzaF9hZGRyZXNzID0gaGFzaCAlIGh0LT5zaXplOworICAgdWludDMyX3QgaGFzaF9hZGRyZXNzID0gc3RhcnRfaGFzaF9hZGRyZXNzOworCisgICBkbyB7CisgICAgICB1aW50MzJfdCBkb3VibGVfaGFzaDsKKworICAgICAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5ID0gaHQtPnRhYmxlICsgaGFzaF9hZGRyZXNzOworCisgICAgICBpZiAoZW50cnlfaXNfZnJlZShlbnRyeSkpIHsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfSBlbHNlIGlmIChlbnRyeV9pc19wcmVzZW50KGh0LCBlbnRyeSkgJiYgZW50cnktPmhhc2ggPT0gaGFzaCkgeworICAgICAgICAgaWYgKGh0LT5rZXlfZXF1YWxzX2Z1bmN0aW9uKGtleSwgZW50cnktPmtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZG91YmxlX2hhc2ggPSAxICsgaGFzaCAlIGh0LT5yZWhhc2g7CisKKyAgICAgIGhhc2hfYWRkcmVzcyA9IChoYXNoX2FkZHJlc3MgKyBkb3VibGVfaGFzaCkgJSBodC0+c2l6ZTsKKyAgIH0gd2hpbGUgKGhhc2hfYWRkcmVzcyAhPSBzdGFydF9oYXNoX2FkZHJlc3MpOworCisgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK19tZXNhX2hhc2hfdGFibGVfcmVoYXNoKHN0cnVjdCBoYXNoX3RhYmxlICpodCwgaW50IG5ld19zaXplX2luZGV4KQoreworICAgc3RydWN0IGhhc2hfdGFibGUgb2xkX2h0OworICAgc3RydWN0IGhhc2hfZW50cnkgKnRhYmxlLCAqZW50cnk7CisKKyAgIGlmIChuZXdfc2l6ZV9pbmRleCA+PSBBUlJBWV9TSVpFKGhhc2hfc2l6ZXMpKQorICAgICAgcmV0dXJuOworCisgICB0YWJsZSA9IHJ6YWxsb2NfYXJyYXkoaHQsIHN0cnVjdCBoYXNoX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfc2l6ZXNbbmV3X3NpemVfaW5kZXhdLnNpemUpOworICAgaWYgKHRhYmxlID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIG9sZF9odCA9ICpodDsKKworICAgaHQtPnRhYmxlID0gdGFibGU7CisgICBodC0+c2l6ZV9pbmRleCA9IG5ld19zaXplX2luZGV4OworICAgaHQtPnNpemUgPSBoYXNoX3NpemVzW2h0LT5zaXplX2luZGV4XS5zaXplOworICAgaHQtPnJlaGFzaCA9IGhhc2hfc2l6ZXNbaHQtPnNpemVfaW5kZXhdLnJlaGFzaDsKKyAgIGh0LT5tYXhfZW50cmllcyA9IGhhc2hfc2l6ZXNbaHQtPnNpemVfaW5kZXhdLm1heF9lbnRyaWVzOworICAgaHQtPmVudHJpZXMgPSAwOworICAgaHQtPmRlbGV0ZWRfZW50cmllcyA9IDA7CisKKyAgIGhhc2hfdGFibGVfZm9yZWFjaCgmb2xkX2h0LCBlbnRyeSkgeworICAgICAgX21lc2FfaGFzaF90YWJsZV9pbnNlcnQoaHQsIGVudHJ5LT5oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmtleSwgZW50cnktPmRhdGEpOworICAgfQorCisgICByYWxsb2NfZnJlZShvbGRfaHQudGFibGUpOworfQorCisvKioKKyAqIEluc2VydHMgdGhlIGtleSB3aXRoIHRoZSBnaXZlbiBoYXNoIGludG8gdGhlIHRhYmxlLgorICoKKyAqIE5vdGUgdGhhdCBpbnNlcnRpb24gbWF5IHJlYXJyYW5nZSB0aGUgdGFibGUgb24gYSByZXNpemUgb3IgcmVoYXNoLAorICogc28gcHJldmlvdXNseSBmb3VuZCBoYXNoX2VudHJpZXMgYXJlIG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzIGZ1bmN0aW9uLgorICovCitzdHJ1Y3QgaGFzaF9lbnRyeSAqCitfbWVzYV9oYXNoX3RhYmxlX2luc2VydChzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsIHVpbnQzMl90IGhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEpCit7CisgICB1aW50MzJfdCBzdGFydF9oYXNoX2FkZHJlc3MsIGhhc2hfYWRkcmVzczsKKworICAgaWYgKGh0LT5lbnRyaWVzID49IGh0LT5tYXhfZW50cmllcykgeworICAgICAgX21lc2FfaGFzaF90YWJsZV9yZWhhc2goaHQsIGh0LT5zaXplX2luZGV4ICsgMSk7CisgICB9IGVsc2UgaWYgKGh0LT5kZWxldGVkX2VudHJpZXMgKyBodC0+ZW50cmllcyA+PSBodC0+bWF4X2VudHJpZXMpIHsKKyAgICAgIF9tZXNhX2hhc2hfdGFibGVfcmVoYXNoKGh0LCBodC0+c2l6ZV9pbmRleCk7CisgICB9CisKKyAgIHN0YXJ0X2hhc2hfYWRkcmVzcyA9IGhhc2ggJSBodC0+c2l6ZTsKKyAgIGhhc2hfYWRkcmVzcyA9IHN0YXJ0X2hhc2hfYWRkcmVzczsKKyAgIGRvIHsKKyAgICAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeSA9IGh0LT50YWJsZSArIGhhc2hfYWRkcmVzczsKKyAgICAgIHVpbnQzMl90IGRvdWJsZV9oYXNoOworCisgICAgICBpZiAoIWVudHJ5X2lzX3ByZXNlbnQoaHQsIGVudHJ5KSkgeworICAgICAgICAgaWYgKGVudHJ5X2lzX2RlbGV0ZWQoaHQsIGVudHJ5KSkKKyAgICAgICAgICAgIGh0LT5kZWxldGVkX2VudHJpZXMtLTsKKyAgICAgICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICAgICAgIGVudHJ5LT5rZXkgPSBrZXk7CisgICAgICAgICBlbnRyeS0+ZGF0YSA9IGRhdGE7CisgICAgICAgICBodC0+ZW50cmllcysrOworICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgfQorCisgICAgICAvKiBJbXBsZW1lbnQgcmVwbGFjZW1lbnQgd2hlbiBhbm90aGVyIGluc2VydCBoYXBwZW5zCisgICAgICAgKiB3aXRoIGEgbWF0Y2hpbmcga2V5LiAgVGhpcyBpcyBhIHJlbGF0aXZlbHkgY29tbW9uCisgICAgICAgKiBmZWF0dXJlIG9mIGhhc2ggdGFibGVzLCB3aXRoIHRoZSBhbHRlcm5hdGl2ZQorICAgICAgICogZ2VuZXJhbGx5IGJlaW5nICJpbnNlcnQgdGhlIG5ldyB2YWx1ZSBhcyB3ZWxsLCBhbmQKKyAgICAgICAqIHJldHVybiBpdCBmaXJzdCB3aGVuIHRoZSBrZXkgaXMgc2VhcmNoZWQgZm9yIi4KKyAgICAgICAqCisgICAgICAgKiBOb3RlIHRoYXQgdGhlIGhhc2ggdGFibGUgZG9lc24ndCBoYXZlIGEgZGVsZXRlCisgICAgICAgKiBjYWxsYmFjay4gIElmIGZyZWVpbmcgb2Ygb2xkIGRhdGEgcG9pbnRlcnMgaXMKKyAgICAgICAqIHJlcXVpcmVkIHRvIGF2b2lkIG1lbW9yeSBsZWFrcywgcGVyZm9ybSBhIHNlYXJjaAorICAgICAgICogYmVmb3JlIGluc2VydGluZy4KKyAgICAgICAqLworICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2ggJiYKKyAgICAgICAgICBodC0+a2V5X2VxdWFsc19mdW5jdGlvbihrZXksIGVudHJ5LT5rZXkpKSB7CisgICAgICAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgICAgICAgZW50cnktPmRhdGEgPSBkYXRhOworICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgfQorCisKKyAgICAgIGRvdWJsZV9oYXNoID0gMSArIGhhc2ggJSBodC0+cmVoYXNoOworCisgICAgICBoYXNoX2FkZHJlc3MgPSAoaGFzaF9hZGRyZXNzICsgZG91YmxlX2hhc2gpICUgaHQtPnNpemU7CisgICB9IHdoaWxlIChoYXNoX2FkZHJlc3MgIT0gc3RhcnRfaGFzaF9hZGRyZXNzKTsKKworICAgLyogV2UgY291bGQgaGl0IGhlcmUgaWYgYSByZXF1aXJlZCByZXNpemUgZmFpbGVkLiBBbiB1bmNoZWNrZWQtbWFsbG9jCisgICAgKiBhcHBsaWNhdGlvbiBjb3VsZCBpZ25vcmUgdGhpcyByZXN1bHQuCisgICAgKi8KKyAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyB0aGUgZ2l2ZW4gaGFzaCB0YWJsZSBlbnRyeS4KKyAqCisgKiBOb3RlIHRoYXQgZGVsZXRpb24gZG9lc24ndCBvdGhlcndpc2UgbW9kaWZ5IHRoZSB0YWJsZSwgc28gYW4gaXRlcmF0aW9uIG92ZXIKKyAqIHRoZSB0YWJsZSBkZWxldGluZyBlbnRyaWVzIGlzIHNhZmUuCisgKi8KK3ZvaWQKK19tZXNhX2hhc2hfdGFibGVfcmVtb3ZlKHN0cnVjdCBoYXNoX3RhYmxlICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeSkKK3sKKyAgIGlmICghZW50cnkpCisgICAgICByZXR1cm47CisKKyAgIGVudHJ5LT5rZXkgPSBodC0+ZGVsZXRlZF9rZXk7CisgICBodC0+ZW50cmllcy0tOworICAgaHQtPmRlbGV0ZWRfZW50cmllcysrOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgaGFzaCB0YWJsZS4KKyAqCisgKiBQYXNzIGluIE5VTEwgZm9yIHRoZSBmaXJzdCBlbnRyeSwgYXMgaW4gdGhlIHN0YXJ0IG9mIGEgZm9yIGxvb3AuICBOb3RlIHRoYXQKKyAqIGFuIGl0ZXJhdGlvbiBvdmVyIHRoZSB0YWJsZSBpcyBPKHRhYmxlX3NpemUpIG5vdCBPKGVudHJpZXMpLgorICovCitzdHJ1Y3QgaGFzaF9lbnRyeSAqCitfbWVzYV9oYXNoX3RhYmxlX25leHRfZW50cnkoc3RydWN0IGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeSkKK3sKKyAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgZW50cnkgPSBodC0+dGFibGU7CisgICBlbHNlCisgICAgICBlbnRyeSA9IGVudHJ5ICsgMTsKKworICAgZm9yICg7IGVudHJ5ICE9IGh0LT50YWJsZSArIGh0LT5zaXplOyBlbnRyeSsrKSB7CisgICAgICBpZiAoZW50cnlfaXNfcHJlc2VudChodCwgZW50cnkpKSB7CisgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJldHVybnMgYSByYW5kb20gZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZS4KKyAqCisgKiBUaGlzIG1heSBiZSB1c2VmdWwgaW4gaW1wbGVtZW50aW5nIHJhbmRvbSByZXBsYWNlbWVudCAoYXMgb3Bwb3NlZAorICogdG8ganVzdCByZW1vdmluZyBldmVyeXRoaW5nKSBpbiBjYWNoZXMgYmFzZWQgb24gdGhpcyBoYXNoIHRhYmxlCisgKiBpbXBsZW1lbnRhdGlvbi4gIEBwcmVkaWNhdGUgbWF5IGJlIHVzZWQgdG8gZmlsdGVyIGVudHJpZXMsIG9yIG1heQorICogYmUgc2V0IHRvIE5VTEwgZm9yIG5vIGZpbHRlcmluZy4KKyAqLworc3RydWN0IGhhc2hfZW50cnkgKgorX21lc2FfaGFzaF90YWJsZV9yYW5kb21fZW50cnkoc3RydWN0IGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKnByZWRpY2F0ZSkoc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5KSkKK3sKKyAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKyAgIHVpbnQzMl90IGkgPSByYW5kKCkgJSBodC0+c2l6ZTsKKworICAgaWYgKGh0LT5lbnRyaWVzID09IDApCisgICAgICByZXR1cm4gTlVMTDsKKworICAgZm9yIChlbnRyeSA9IGh0LT50YWJsZSArIGk7IGVudHJ5ICE9IGh0LT50YWJsZSArIGh0LT5zaXplOyBlbnRyeSsrKSB7CisgICAgICBpZiAoZW50cnlfaXNfcHJlc2VudChodCwgZW50cnkpICYmCisgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKGVudHJ5KSkpIHsKKyAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgIH0KKyAgIH0KKworICAgZm9yIChlbnRyeSA9IGh0LT50YWJsZTsgZW50cnkgIT0gaHQtPnRhYmxlICsgaTsgZW50cnkrKykgeworICAgICAgaWYgKGVudHJ5X2lzX3ByZXNlbnQoaHQsIGVudHJ5KSAmJgorICAgICAgICAgICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZShlbnRyeSkpKSB7CisgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorCisKKy8qKgorICogUXVpY2sgRk5WLTEgaGFzaCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbjoKKyAqIGh0dHA6Ly93d3cuaXN0aGUuY29tL2Nob25nby90ZWNoL2NvbXAvZm52LworICoKKyAqIEZOVi0xIGlzIG5vdCBiZSB0aGUgYmVzdCBoYXNoIG91dCB0aGVyZSAtLSBKZW5raW5zJ3MgbG9va3VwMyBpcyBzdXBwb3NlZCB0bworICogYmUgcXVpdGUgZ29vZCwgYW5kIGl0IHByb2JhYmx5IGJlYXRzIEZOVi4gIEJ1dCBGTlYgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdAorICogaXQgaW52b2x2ZXMgYWxtb3N0IG5vIGNvZGUuICBGb3IgYW4gaW1wcm92ZW1lbnQgb24gYm90aCwgc2VlIFBhdWwKKyAqIEhzaWVoJ3MgaHR0cDovL3d3dy5hemlsbGlvbm1vbmtleXMuY29tL3FlZC9oYXNoLmh0bWwKKyAqLwordWludDMyX3QKK19tZXNhX2hhc2hfZGF0YShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgIHVpbnQzMl90IGhhc2ggPSAyMTY2MTM2MjYxdWw7CisgICBjb25zdCB1aW50OF90ICpieXRlcyA9IGRhdGE7CisKKyAgIHdoaWxlIChzaXplLS0gIT0gMCkgeworICAgICAgaGFzaCBePSAqYnl0ZXM7CisgICAgICBoYXNoID0gaGFzaCAqIDB4MDEwMDAxOTM7CisgICAgICBieXRlcysrOworICAgfQorCisgICByZXR1cm4gaGFzaDsKK30KKworLyoqIEZOVi0xIHN0cmluZyBoYXNoIGltcGxlbWVudGF0aW9uICovCit1aW50MzJfdAorX21lc2FfaGFzaF9zdHJpbmcoY29uc3QgY2hhciAqa2V5KQoreworICAgdWludDMyX3QgaGFzaCA9IDIxNjYxMzYyNjF1bDsKKworICAgd2hpbGUgKCprZXkgIT0gMCkgeworICAgICAgaGFzaCBePSAqa2V5OworICAgICAgaGFzaCA9IGhhc2ggKiAweDAxMDAwMTkzOworICAgICAga2V5Kys7CisgICB9CisKKyAgIHJldHVybiBoYXNoOworfQorCisvKioKKyAqIFN0cmluZyBjb21wYXJlIGZ1bmN0aW9uIGZvciB1c2UgYXMgdGhlIGNvbXBhcmlzb24gY2FsbGJhY2sgaW4KKyAqIF9tZXNhX2hhc2hfdGFibGVfY3JlYXRlKCkuCisgKi8KK2Jvb2wKK19tZXNhX2tleV9zdHJpbmdfZXF1YWwoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgIHJldHVybiBzdHJjbXAoYSwgYikgPT0gMDsKK30KKworYm9vbAorX21lc2Ffa2V5X3BvaW50ZXJfZXF1YWwoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgIHJldHVybiBhID09IGI7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2hhc2hfdGFibGUuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vaGFzaF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTEzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2hhc2hfdGFibGUuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5LDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNpZm5kZWYgX0hBU0hfVEFCTEVfSAorI2RlZmluZSBfSEFTSF9UQUJMRV9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgImNvbXBpbGVyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGhhc2hfZW50cnkgeworICAgdWludDMyX3QgaGFzaDsKKyAgIGNvbnN0IHZvaWQgKmtleTsKKyAgIHZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgaGFzaF90YWJsZSB7CisgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqdGFibGU7CisgICBib29sICgqa2V5X2VxdWFsc19mdW5jdGlvbikoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CisgICBjb25zdCB2b2lkICpkZWxldGVkX2tleTsKKyAgIHVpbnQzMl90IHNpemU7CisgICB1aW50MzJfdCByZWhhc2g7CisgICB1aW50MzJfdCBtYXhfZW50cmllczsKKyAgIHVpbnQzMl90IHNpemVfaW5kZXg7CisgICB1aW50MzJfdCBlbnRyaWVzOworICAgdWludDMyX3QgZGVsZXRlZF9lbnRyaWVzOworfTsKKworc3RydWN0IGhhc2hfdGFibGUgKgorX21lc2FfaGFzaF90YWJsZV9jcmVhdGUodm9pZCAqbWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCprZXlfZXF1YWxzX2Z1bmN0aW9uKShjb25zdCB2b2lkICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmIpKTsKK3ZvaWQgX21lc2FfaGFzaF90YWJsZV9kZXN0cm95KHN0cnVjdCBoYXNoX3RhYmxlICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZWxldGVfZnVuY3Rpb24pKHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeSkpOwordm9pZCBfbWVzYV9oYXNoX3RhYmxlX3NldF9kZWxldGVkX2tleShzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRlbGV0ZWRfa2V5KTsKKworc3RydWN0IGhhc2hfZW50cnkgKgorX21lc2FfaGFzaF90YWJsZV9pbnNlcnQoc3RydWN0IGhhc2hfdGFibGUgKmh0LCB1aW50MzJfdCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpkYXRhKTsKK3N0cnVjdCBoYXNoX2VudHJ5ICoKK19tZXNhX2hhc2hfdGFibGVfc2VhcmNoKHN0cnVjdCBoYXNoX3RhYmxlICpodCwgdWludDMyX3QgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSk7Cit2b2lkIF9tZXNhX2hhc2hfdGFibGVfcmVtb3ZlKHN0cnVjdCBoYXNoX3RhYmxlICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5KTsKKworc3RydWN0IGhhc2hfZW50cnkgKl9tZXNhX2hhc2hfdGFibGVfbmV4dF9lbnRyeShzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeSk7CitzdHJ1Y3QgaGFzaF9lbnRyeSAqCitfbWVzYV9oYXNoX3RhYmxlX3JhbmRvbV9lbnRyeShzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqcHJlZGljYXRlKShzdHJ1Y3QgaGFzaF9lbnRyeSAqZW50cnkpKTsKKwordWludDMyX3QgX21lc2FfaGFzaF9kYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKK3VpbnQzMl90IF9tZXNhX2hhc2hfc3RyaW5nKGNvbnN0IGNoYXIgKmtleSk7Citib29sIF9tZXNhX2tleV9zdHJpbmdfZXF1YWwoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7Citib29sIF9tZXNhX2tleV9wb2ludGVyX2VxdWFsKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9tZXNhX2hhc2hfcG9pbnRlcihjb25zdCB2b2lkICpwb2ludGVyKQoreworICAgcmV0dXJuIF9tZXNhX2hhc2hfZGF0YSgmcG9pbnRlciwgc2l6ZW9mKHBvaW50ZXIpKTsKK30KKworLyoqCisgKiBUaGlzIGZvcmVhY2ggZnVuY3Rpb24gaXMgc2FmZSBhZ2FpbnN0IGRlbGV0aW9uICh3aGljaCBqdXN0IHJlcGxhY2VzCisgKiBhbiBlbnRyeSdzIGRhdGEgd2l0aCB0aGUgZGVsZXRlZCBtYXJrZXIpLCBidXQgbm90IGFnYWluc3QgaW5zZXJ0aW9uCisgKiAod2hpY2ggbWF5IHJlaGFzaCB0aGUgdGFibGUsIG1ha2luZyBlbnRyeSBhIGRhbmdsaW5nIHBvaW50ZXIpLgorICovCisjZGVmaW5lIGhhc2hfdGFibGVfZm9yZWFjaChodCwgZW50cnkpICAgICAgICAgICAgICAgICAgIFwKKyAgIGZvciAoZW50cnkgPSBfbWVzYV9oYXNoX3RhYmxlX25leHRfZW50cnkoaHQsIE5VTEwpOyAgXAorICAgICAgICBlbnRyeSAhPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVudHJ5ID0gX21lc2FfaGFzaF90YWJsZV9uZXh0X2VudHJ5KGh0LCBlbnRyeSkpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gQyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfSEFTSF9UQUJMRV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2ltcG9ydHMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vaW1wb3J0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjI3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2ltcG9ydHMuYwpAQCAtMCwwICsxLDYyMiBAQAorLyoqCisgKiBcZmlsZSBpbXBvcnRzLmMKKyAqIFN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbiB3cmFwcGVycy4KKyAqIAorICogSW1wb3J0cyBhcmUgc2VydmljZXMgd2hpY2ggdGhlIGRldmljZSBkcml2ZXIgb3Igd2luZG93IHN5c3RlbSBvcgorICogb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlcyB0byB0aGUgY29yZSByZW5kZXJlci4gIFRoZSBjb3JlIHJlbmRlcmVyIChNZXNhKQorICogd2lsbCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBpbiBvcmRlciB0byBkbyBtZW1vcnkgYWxsb2NhdGlvbiwgc2ltcGxlIEkvTywKKyAqIGV0Yy4KKyAqCisgKiBTb21lIGRyaXZlcnMgd2lsbCB3YW50IHRvIG92ZXJyaWRlL3JlcGxhY2UgdGhpcyBmaWxlIHdpdGggc29tZXRoaW5nCisgKiBzcGVjaWFsaXplZCwgYnV0IHRoYXQnbGwgYmUgcmFyZS4KKyAqCisgKiBFdmVudHVhbGx5LCBJIHdhbnQgdG8gbW92ZSByb2xsIHRoZSBnbGhlYWRlci5oIGZpbGUgaW50byB0aGlzLgorICoKKyAqIFx0b2RvIEZ1bmN0aW9ucyBzdGlsbCBuZWVkZWQ6CisgKiAtIHNjYW5mCisgKiAtIHFzb3J0CisgKiAtIHJhbmQgYW5kIFJBTkRfTUFYCisgKi8KKworLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKworI2luY2x1ZGUgImltcG9ydHMuaCIKKyNpbmNsdWRlICJtdHlwZXMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZmRlZiBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPHhsb2NhbGUuaD4KKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VsaWYgZGVmaW5lZChfX0lCTUNfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQorZXh0ZXJuIGludCB2c25wcmludGYoY2hhciAqc3RyLCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmcpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIE1lbW9yeSAqLworLypAeyovCisKKy8qKgorICogQWxsb2NhdGUgYWxpZ25lZCBtZW1vcnkuCisgKgorICogXHBhcmFtIGJ5dGVzIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4KKyAqIFxwYXJhbSBhbGlnbm1lbnQgYWxpZ25tZW50IChtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvKS4KKyAqIAorICogQWxsb2NhdGVzIGV4dHJhIG1lbW9yeSB0byBhY2NvbW1vZGF0ZSByb3VuZGluZyB1cCB0aGUgYWRkcmVzcyBmb3IKKyAqIGFsaWdubWVudCBhbmQgdG8gcmVjb3JkIHRoZSByZWFsIG1hbGxvYyBhZGRyZXNzLgorICoKKyAqIFxzYSBfbWVzYV9hbGlnbl9mcmVlKCkuCisgKi8KK3ZvaWQgKgorX21lc2FfYWxpZ25fbWFsbG9jKHNpemVfdCBieXRlcywgdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQpCit7CisjaWYgZGVmaW5lZChIQVZFX1BPU0lYX01FTUFMSUdOKQorICAgdm9pZCAqbWVtOworICAgaW50IGVyciA9IHBvc2l4X21lbWFsaWduKCYgbWVtLCBhbGlnbm1lbnQsIGJ5dGVzKTsKKyAgIGlmIChlcnIpCisgICAgICByZXR1cm4gTlVMTDsKKyAgIHJldHVybiBtZW07CisjZWxpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfTVNDX1ZFUikKKyAgIHJldHVybiBfYWxpZ25lZF9tYWxsb2MoYnl0ZXMsIGFsaWdubWVudCk7CisjZWxzZQorICAgdWludHB0cl90IHB0ciwgYnVmOworCisgICBBU1NFUlQoIGFsaWdubWVudCA+IDAgKTsKKworICAgcHRyID0gKHVpbnRwdHJfdCltYWxsb2MoYnl0ZXMgKyBhbGlnbm1lbnQgKyBzaXplb2Yodm9pZCAqKSk7CisgICBpZiAoIXB0cikKKyAgICAgIHJldHVybiBOVUxMOworCisgICBidWYgPSAocHRyICsgYWxpZ25tZW50ICsgc2l6ZW9mKHZvaWQgKikpICYgfih1aW50cHRyX3QpKGFsaWdubWVudCAtIDEpOworICAgKih1aW50cHRyX3QgKikoYnVmIC0gc2l6ZW9mKHZvaWQgKikpID0gcHRyOworCisjaWZkZWYgREVCVUcKKyAgIC8qIG1hcmsgdGhlIG5vbi1hbGlnbmVkIGFyZWEgKi8KKyAgIHdoaWxlICggcHRyIDwgYnVmIC0gc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAqKHVuc2lnbmVkIGxvbmcgKilwdHIgPSAweGNkY2RjZGNkOworICAgICAgcHRyICs9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgIH0KKyNlbmRpZgorCisgICByZXR1cm4gKHZvaWQgKikgYnVmOworI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9QT1NJWF9NRU1BTElHTikgKi8KK30KKworLyoqCisgKiBTYW1lIGFzIF9tZXNhX2FsaWduX21hbGxvYygpLCBidXQgdXNpbmcgY2FsbG9jKDEsICkgaW5zdGVhZCBvZgorICogbWFsbG9jKCkKKyAqLwordm9pZCAqCitfbWVzYV9hbGlnbl9jYWxsb2Moc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBsb25nIGFsaWdubWVudCkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfUE9TSVhfTUVNQUxJR04pCisgICB2b2lkICptZW07CisgICAKKyAgIG1lbSA9IF9tZXNhX2FsaWduX21hbGxvYyhieXRlcywgYWxpZ25tZW50KTsKKyAgIGlmIChtZW0gIT0gTlVMTCkgeworICAgICAgKHZvaWQpIG1lbXNldChtZW0sIDAsIGJ5dGVzKTsKKyAgIH0KKworICAgcmV0dXJuIG1lbTsKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQorICAgdm9pZCAqbWVtOworCisgICBtZW0gPSBfYWxpZ25lZF9tYWxsb2MoYnl0ZXMsIGFsaWdubWVudCk7CisgICBpZiAobWVtICE9IE5VTEwpIHsKKyAgICAgICh2b2lkKSBtZW1zZXQobWVtLCAwLCBieXRlcyk7CisgICB9CisKKyAgIHJldHVybiBtZW07CisjZWxzZQorICAgdWludHB0cl90IHB0ciwgYnVmOworCisgICBBU1NFUlQoIGFsaWdubWVudCA+IDAgKTsKKworICAgcHRyID0gKHVpbnRwdHJfdCljYWxsb2MoMSwgYnl0ZXMgKyBhbGlnbm1lbnQgKyBzaXplb2Yodm9pZCAqKSk7CisgICBpZiAoIXB0cikKKyAgICAgIHJldHVybiBOVUxMOworCisgICBidWYgPSAocHRyICsgYWxpZ25tZW50ICsgc2l6ZW9mKHZvaWQgKikpICYgfih1aW50cHRyX3QpKGFsaWdubWVudCAtIDEpOworICAgKih1aW50cHRyX3QgKikoYnVmIC0gc2l6ZW9mKHZvaWQgKikpID0gcHRyOworCisjaWZkZWYgREVCVUcKKyAgIC8qIG1hcmsgdGhlIG5vbi1hbGlnbmVkIGFyZWEgKi8KKyAgIHdoaWxlICggcHRyIDwgYnVmIC0gc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAqKHVuc2lnbmVkIGxvbmcgKilwdHIgPSAweGNkY2RjZGNkOworICAgICAgcHRyICs9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgIH0KKyNlbmRpZgorCisgICByZXR1cm4gKHZvaWQgKilidWY7CisjZW5kaWYgLyogZGVmaW5lZChIQVZFX1BPU0lYX01FTUFMSUdOKSAqLworfQorCisvKioKKyAqIEZyZWUgbWVtb3J5IHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2l0aCBlaXRoZXIgX21lc2FfYWxpZ25fbWFsbG9jKCkKKyAqIG9yIF9tZXNhX2FsaWduX2NhbGxvYygpLgorICogXHBhcmFtIHB0ciBwb2ludGVyIHRvIHRoZSBtZW1vcnkgdG8gYmUgZnJlZWQuCisgKiBUaGUgYWN0dWFsIGFkZHJlc3MgdG8gZnJlZSBpcyBzdG9yZWQgaW4gdGhlIHdvcmQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZQorICogYWRkcmVzcyB0aGUgY2xpZW50IHNlZXMuCisgKiBOb3RlIHRoYXQgaXQgaXMgbGVnYWwgdG8gcGFzcyBOVUxMIHBvaW50ZXIgdG8gdGhpcyBmdW5jdGlvbiBhbmQgd2lsbCBiZQorICogaGFuZGxlZCBhY2NvcmRpbmdseS4KKyAqLwordm9pZAorX21lc2FfYWxpZ25fZnJlZSh2b2lkICpwdHIpCit7CisjaWYgZGVmaW5lZChIQVZFX1BPU0lYX01FTUFMSUdOKQorICAgZnJlZShwdHIpOworI2VsaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX01TQ19WRVIpCisgICBfYWxpZ25lZF9mcmVlKHB0cik7CisjZWxzZQorICAgaWYgKHB0cikgeworICAgICAgdm9pZCAqKmN1YmJ5SG9sZSA9ICh2b2lkICoqKSAoKGNoYXIgKikgcHRyIC0gc2l6ZW9mKHZvaWQgKikpOworICAgICAgdm9pZCAqcmVhbEFkZHIgPSAqY3ViYnlIb2xlOworICAgICAgZnJlZShyZWFsQWRkcik7CisgICB9CisjZW5kaWYgLyogZGVmaW5lZChIQVZFX1BPU0lYX01FTUFMSUdOKSAqLworfQorCisvKioKKyAqIFJlYWxsb2NhdGUgbWVtb3J5LCB3aXRoIGFsaWdubWVudC4KKyAqLwordm9pZCAqCitfbWVzYV9hbGlnbl9yZWFsbG9jKHZvaWQgKm9sZEJ1ZmZlciwgc2l6ZV90IG9sZFNpemUsIHNpemVfdCBuZXdTaXplLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFsaWdubWVudCkKK3sKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICh2b2lkKSBvbGRTaXplOworICAgcmV0dXJuIF9hbGlnbmVkX3JlYWxsb2Mob2xkQnVmZmVyLCBuZXdTaXplLCBhbGlnbm1lbnQpOworI2Vsc2UKKyAgIGNvbnN0IHNpemVfdCBjb3B5U2l6ZSA9IChvbGRTaXplIDwgbmV3U2l6ZSkgPyBvbGRTaXplIDogbmV3U2l6ZTsKKyAgIHZvaWQgKm5ld0J1ZiA9IF9tZXNhX2FsaWduX21hbGxvYyhuZXdTaXplLCBhbGlnbm1lbnQpOworICAgaWYgKG5ld0J1ZiAmJiBvbGRCdWZmZXIgJiYgY29weVNpemUgPiAwKSB7CisgICAgICBtZW1jcHkobmV3QnVmLCBvbGRCdWZmZXIsIGNvcHlTaXplKTsKKyAgIH0KKworICAgX21lc2FfYWxpZ25fZnJlZShvbGRCdWZmZXIpOworICAgcmV0dXJuIG5ld0J1ZjsKKyNlbmRpZgorfQorCisKKworLyoqIFJlYWxsb2NhdGUgbWVtb3J5ICovCit2b2lkICoKK19tZXNhX3JlYWxsb2Modm9pZCAqb2xkQnVmZmVyLCBzaXplX3Qgb2xkU2l6ZSwgc2l6ZV90IG5ld1NpemUpCit7CisgICBjb25zdCBzaXplX3QgY29weVNpemUgPSAob2xkU2l6ZSA8IG5ld1NpemUpID8gb2xkU2l6ZSA6IG5ld1NpemU7CisgICB2b2lkICpuZXdCdWZmZXIgPSBtYWxsb2MobmV3U2l6ZSk7CisgICBpZiAobmV3QnVmZmVyICYmIG9sZEJ1ZmZlciAmJiBjb3B5U2l6ZSA+IDApCisgICAgICBtZW1jcHkobmV3QnVmZmVyLCBvbGRCdWZmZXIsIGNvcHlTaXplKTsKKyAgIGZyZWUob2xkQnVmZmVyKTsKKyAgIHJldHVybiBuZXdCdWZmZXI7Cit9CisKKy8qQH0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIE1hdGggKi8KKy8qQHsqLworCisKKyNpZm5kZWYgX19HTlVDX18KKy8qKgorICogRmluZCB0aGUgZmlyc3QgYml0IHNldCBpbiBhIHdvcmQuCisgKi8KK2ludAorZmZzKGludCBpKQoreworICAgcmVnaXN0ZXIgaW50IGJpdCA9IDA7CisgICBpZiAoaSAhPSAwKSB7CisgICAgICBpZiAoKGkgJiAweGZmZmYpID09IDApIHsKKyAgICAgICAgIGJpdCArPSAxNjsKKyAgICAgICAgIGkgPj49IDE2OworICAgICAgfQorICAgICAgaWYgKChpICYgMHhmZikgPT0gMCkgeworICAgICAgICAgYml0ICs9IDg7CisgICAgICAgICBpID4+PSA4OworICAgICAgfQorICAgICAgaWYgKChpICYgMHhmKSA9PSAwKSB7CisgICAgICAgICBiaXQgKz0gNDsKKyAgICAgICAgIGkgPj49IDQ7CisgICAgICB9CisgICAgICB3aGlsZSAoKGkgJiAxKSA9PSAwKSB7CisgICAgICAgICBiaXQrKzsKKyAgICAgICAgIGkgPj49IDE7CisgICAgICB9CisgICAgICBiaXQrKzsKKyAgIH0KKyAgIHJldHVybiBiaXQ7Cit9CisKKworLyoqCisgKiBGaW5kIHBvc2l0aW9uIG9mIGZpcnN0IGJpdCBzZXQgaW4gZ2l2ZW4gdmFsdWUuCisgKiBYWFggV2FybmluZzogdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIG9uIDY0LWJpdCBzeXN0ZW1zIQorICogXHJldHVybiAgcG9zaXRpb24gb2YgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IHNldCwgc3RhcnRpbmcgYXQgMSwgcmV0dXJuIHplcm8KKyAqICAgICAgICAgIGlmIG5vIGJpdHMgc2V0LgorICovCitpbnQKK2Zmc2xsKGxvbmcgbG9uZyBpbnQgdmFsKQoreworICAgaW50IGJpdDsKKworICAgYXNzZXJ0KHNpemVvZih2YWwpID09IDgpOworCisgICBiaXQgPSBmZnMoKGludCkgdmFsKTsKKyAgIGlmIChiaXQgIT0gMCkKKyAgICAgIHJldHVybiBiaXQ7CisKKyAgIGJpdCA9IGZmcygoaW50KSAodmFsID4+IDMyKSk7CisgICBpZiAoYml0ICE9IDApCisgICAgICByZXR1cm4gMzIgKyBiaXQ7CisKKyAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIF9fR05VQ19fICovCisKKworI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fFwKKyAgICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPCAzMDQpIC8qIE5vdCBnY2MgMy40IG9yIGxhdGVyICovCisvKioKKyAqIFJldHVybiBudW1iZXIgb2YgYml0cyBzZXQgaW4gZ2l2ZW4gR0x1aW50LgorICovCit1bnNpZ25lZCBpbnQKK19tZXNhX2JpdGNvdW50KHVuc2lnbmVkIGludCBuKQoreworICAgdW5zaWduZWQgaW50IGJpdHM7CisgICBmb3IgKGJpdHMgPSAwOyBuID4gMDsgbiA9IG4gPj4gMSkgeworICAgICAgYml0cyArPSAobiAmIDEpOworICAgfQorICAgcmV0dXJuIGJpdHM7Cit9CisKKy8qKgorICogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBnaXZlbiA2NC1iaXQgdWludC4KKyAqLwordW5zaWduZWQgaW50CitfbWVzYV9iaXRjb3VudF82NCh1aW50NjRfdCBuKQoreworICAgdW5zaWduZWQgaW50IGJpdHM7CisgICBmb3IgKGJpdHMgPSAwOyBuID4gMDsgbiA9IG4gPj4gMSkgeworICAgICAgYml0cyArPSAobiAmIDEpOworICAgfQorICAgcmV0dXJuIGJpdHM7Cit9CisjZW5kaWYKKworCisvKiBVc2luZyBDOTkgcm91bmRpbmcgZnVuY3Rpb25zIGZvciByb3VuZFRvRXZlbigpIGltcGxlbWVudGF0aW9uIGlzCisgKiBkaWZmaWN1bHQsIGJlY2F1c2Ugcm91bmQoKSwgcmludCwgYW5kIG5lYXJieWludCgpIGFyZSBhZmZlY3RlZCBieQorICogZmVzZXRlbnYoKSwgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIG1heSBoYXZlIGRvbmUgZm9yIGl0cyBvd24KKyAqIHB1cnBvc2VzLiAgTWVzYSdzIElST1VORCBtYWNybyBpcyBjbG9zZSB0byB3aGF0IHdlIHdhbnQsIGJ1dCBpdAorICogcm91bmRzIGF3YXkgZnJvbSAwIG9uIG4gKyAwLjUuCisgKi8KK2ludAorX21lc2Ffcm91bmRfdG9fZXZlbihmbG9hdCB2YWwpCit7CisgICBpbnQgcm91bmRlZCA9IElST1VORCh2YWwpOworCisgICBpZiAodmFsIC0gZmxvb3IodmFsKSA9PSAwLjUpIHsKKyAgICAgIGlmIChyb3VuZGVkICUgMiAhPSAwKQorICAgICAgICAgcm91bmRlZCArPSB2YWwgPiAwID8gLTEgOiAxOworICAgfQorCisgICByZXR1cm4gcm91bmRlZDsKK30KKworCisvKioKKyAqIENvbnZlcnQgYSA0LWJ5dGUgZmxvYXQgdG8gYSAyLWJ5dGUgaGFsZiBmbG9hdC4KKyAqCisgKiBOb3QgYWxsIGZsb2F0MzIgdmFsdWVzIGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZmxvYXQxNiB2YWx1ZS4gV2UKKyAqIHJvdW5kIHN1Y2ggaW50ZXJtZWRpYXRlIGZsb2F0MzIgdmFsdWVzIHRvIHRoZSBuZWFyZXN0IGZsb2F0MTYuIFdoZW4gdGhlCisgKiBmbG9hdDMyIGxpZXMgZXhhY3RseSBiZXR3ZWVuIHRvIGZsb2F0MTYgdmFsdWVzLCB3ZSByb3VuZCB0byB0aGUgb25lIHdpdGgKKyAqIGFuIGV2ZW4gbWFudGlzc2EuCisgKgorICogVGhpcyByb3VuZGluZyBiZWhhdmlvciBoYXMgc2V2ZXJhbCBiZW5lZml0czoKKyAqICAgLSBJdCBoYXMgbm8gc2lnbiBiaWFzLgorICoKKyAqICAgLSBJdCByZXByb2R1Y2VzIHRoZSBiZWhhdmlvciBvZiByZWFsIGhhcmR3YXJlOiBvcGNvZGUgRjMyVE8xNiBpbiBJbnRlbCdzCisgKiAgICAgR1BVIElTQS4KKyAqCisgKiAgIC0gQnkgcmVwcm9kdWNpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSBHUFUgKGF0IGxlYXN0IG9uIEludGVsIGhhcmR3YXJlKSwKKyAqICAgICBjb21waWxlLXRpbWUgZXZhbHVhdGlvbiBvZiBjb25zdGFudCBwYWNrSGFsZjJ4MTYgR0xTTCBleHByZXNzaW9ucyB3aWxsCisgKiAgICAgcmVzdWx0IGluIHRoZSBzYW1lIHZhbHVlIGFzIGlmIHRoZSBleHByZXNzaW9uIHdlcmUgZXhlY3V0ZWQgb24gdGhlIEdQVS4KKyAqLworR0xoYWxmQVJCCitfbWVzYV9mbG9hdF90b19oYWxmKGZsb2F0IHZhbCkKK3sKKyAgIGNvbnN0IGZpX3R5cGUgZmkgPSB7dmFsfTsKKyAgIGNvbnN0IGludCBmbHRfbSA9IGZpLmkgJiAweDdmZmZmZjsKKyAgIGNvbnN0IGludCBmbHRfZSA9IChmaS5pID4+IDIzKSAmIDB4ZmY7CisgICBjb25zdCBpbnQgZmx0X3MgPSAoZmkuaSA+PiAzMSkgJiAweDE7CisgICBpbnQgcywgZSwgbSA9IDA7CisgICBHTGhhbGZBUkIgcmVzdWx0OworICAgCisgICAvKiBzaWduIGJpdCAqLworICAgcyA9IGZsdF9zOworCisgICAvKiBoYW5kbGUgc3BlY2lhbCBjYXNlcyAqLworICAgaWYgKChmbHRfZSA9PSAwKSAmJiAoZmx0X20gPT0gMCkpIHsKKyAgICAgIC8qIHplcm8gKi8KKyAgICAgIC8qIG0gPSAwOyAtIGFscmVhZHkgc2V0ICovCisgICAgICBlID0gMDsKKyAgIH0KKyAgIGVsc2UgaWYgKChmbHRfZSA9PSAwKSAmJiAoZmx0X20gIT0gMCkpIHsKKyAgICAgIC8qIGRlbm9ybSAtLSBkZW5vcm0gZmxvYXQgbWFwcyB0byAwIGhhbGYgKi8KKyAgICAgIC8qIG0gPSAwOyAtIGFscmVhZHkgc2V0ICovCisgICAgICBlID0gMDsKKyAgIH0KKyAgIGVsc2UgaWYgKChmbHRfZSA9PSAweGZmKSAmJiAoZmx0X20gPT0gMCkpIHsKKyAgICAgIC8qIGluZmluaXR5ICovCisgICAgICAvKiBtID0gMDsgLSBhbHJlYWR5IHNldCAqLworICAgICAgZSA9IDMxOworICAgfQorICAgZWxzZSBpZiAoKGZsdF9lID09IDB4ZmYpICYmIChmbHRfbSAhPSAwKSkgeworICAgICAgLyogTmFOICovCisgICAgICBtID0gMTsKKyAgICAgIGUgPSAzMTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogcmVndWxhciBudW1iZXIgKi8KKyAgICAgIGNvbnN0IGludCBuZXdfZXhwID0gZmx0X2UgLSAxMjc7CisgICAgICBpZiAobmV3X2V4cCA8IC0xNCkgeworICAgICAgICAgLyogVGhlIGZsb2F0MzIgbGllcyBpbiB0aGUgcmFuZ2UgKDAuMCwgbWluX25vcm1hbDE2KSBhbmQgaXMgcm91bmRlZAorICAgICAgICAgICogdG8gYSBuZWFyYnkgZmxvYXQxNiB2YWx1ZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGVpdGhlciB6ZXJvLCBzdWJub3JtYWwsCisgICAgICAgICAgKiBvciBub3JtYWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIGUgPSAwOworICAgICAgICAgbSA9IF9tZXNhX3JvdW5kX3RvX2V2ZW4oKDEgPDwgMjQpICogZmFic2YoZmkuZikpOworICAgICAgfQorICAgICAgZWxzZSBpZiAobmV3X2V4cCA+IDE1KSB7CisgICAgICAgICAvKiBtYXAgdGhpcyB2YWx1ZSB0byBpbmZpbml0eSAqLworICAgICAgICAgLyogbSA9IDA7IC0gYWxyZWFkeSBzZXQgKi8KKyAgICAgICAgIGUgPSAzMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgLyogVGhlIGZsb2F0MzIgbGllcyBpbiB0aGUgcmFuZ2UKKyAgICAgICAgICAqICAgW21pbl9ub3JtYWwxNiwgbWF4X25vcm1hbDE2ICsgbWF4X3N0ZXAxNikKKyAgICAgICAgICAqIGFuZCBpcyByb3VuZGVkIHRvIGEgbmVhcmJ5IGZsb2F0MTYgdmFsdWUuIFRoZSByZXN1bHQgd2lsbCBiZQorICAgICAgICAgICogZWl0aGVyIG5vcm1hbCBvciBpbmZpbml0ZS4KKyAgICAgICAgICAqLworICAgICAgICAgZSA9IG5ld19leHAgKyAxNTsKKyAgICAgICAgIG0gPSBfbWVzYV9yb3VuZF90b19ldmVuKGZsdF9tIC8gKGZsb2F0KSAoMSA8PCAxMykpOworICAgICAgfQorICAgfQorCisgICBhc3NlcnQoMCA8PSBtICYmIG0gPD0gMTAyNCk7CisgICBpZiAobSA9PSAxMDI0KSB7CisgICAgICAvKiBUaGUgZmxvYXQzMiB3YXMgcm91bmRlZCB1cHdhcmRzIGludG8gdGhlIHJhbmdlIG9mIHRoZSBuZXh0IGV4cG9uZW50LAorICAgICAgICogc28gYnVtcCB0aGUgZXhwb25lbnQuIFRoaXMgY29ycmVjdGx5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgZjMyCisgICAgICAgKiBzaG91bGQgYmUgcm91bmRlZCB1cCB0byBmbG9hdDE2IGluZmluaXR5LgorICAgICAgICovCisgICAgICArK2U7CisgICAgICBtID0gMDsKKyAgIH0KKworICAgcmVzdWx0ID0gKHMgPDwgMTUpIHwgKGUgPDwgMTApIHwgbTsKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiBDb252ZXJ0IGEgMi1ieXRlIGhhbGYgZmxvYXQgdG8gYSA0LWJ5dGUgZmxvYXQuCisgKiBCYXNlZCBvbiBjb2RlIGZyb206CisgKiBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvZGlzY3Vzc2lvbl9ib2FyZHMvdWJiL0ZvcnVtMy9IVE1MLzAwODc4Ni5odG1sCisgKi8KK2Zsb2F0CitfbWVzYV9oYWxmX3RvX2Zsb2F0KEdMaGFsZkFSQiB2YWwpCit7CisgICAvKiBYWFggY291bGQgYWxzbyB1c2UgYSA2NEstZW50cnkgbG9va3VwIHRhYmxlICovCisgICBjb25zdCBpbnQgbSA9IHZhbCAmIDB4M2ZmOworICAgY29uc3QgaW50IGUgPSAodmFsID4+IDEwKSAmIDB4MWY7CisgICBjb25zdCBpbnQgcyA9ICh2YWwgPj4gMTUpICYgMHgxOworICAgaW50IGZsdF9tLCBmbHRfZSwgZmx0X3M7CisgICBmaV90eXBlIGZpOworICAgZmxvYXQgcmVzdWx0OworCisgICAvKiBzaWduIGJpdCAqLworICAgZmx0X3MgPSBzOworCisgICAvKiBoYW5kbGUgc3BlY2lhbCBjYXNlcyAqLworICAgaWYgKChlID09IDApICYmIChtID09IDApKSB7CisgICAgICAvKiB6ZXJvICovCisgICAgICBmbHRfbSA9IDA7CisgICAgICBmbHRfZSA9IDA7CisgICB9CisgICBlbHNlIGlmICgoZSA9PSAwKSAmJiAobSAhPSAwKSkgeworICAgICAgLyogZGVub3JtIC0tIGRlbm9ybSBoYWxmIHdpbGwgZml0IGluIG5vbi1kZW5vcm0gc2luZ2xlICovCisgICAgICBjb25zdCBmbG9hdCBoYWxmX2Rlbm9ybSA9IDEuMGYgLyAxNjM4NC4wZjsgLyogMl4tMTQgKi8KKyAgICAgIGZsb2F0IG1hbnRpc3NhID0gKChmbG9hdCkgKG0pKSAvIDEwMjQuMGY7CisgICAgICBmbG9hdCBzaWduID0gcyA/IC0xLjBmIDogMS4wZjsKKyAgICAgIHJldHVybiBzaWduICogbWFudGlzc2EgKiBoYWxmX2Rlbm9ybTsKKyAgIH0KKyAgIGVsc2UgaWYgKChlID09IDMxKSAmJiAobSA9PSAwKSkgeworICAgICAgLyogaW5maW5pdHkgKi8KKyAgICAgIGZsdF9lID0gMHhmZjsKKyAgICAgIGZsdF9tID0gMDsKKyAgIH0KKyAgIGVsc2UgaWYgKChlID09IDMxKSAmJiAobSAhPSAwKSkgeworICAgICAgLyogTmFOICovCisgICAgICBmbHRfZSA9IDB4ZmY7CisgICAgICBmbHRfbSA9IDE7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIHJlZ3VsYXIgKi8KKyAgICAgIGZsdF9lID0gZSArIDExMjsKKyAgICAgIGZsdF9tID0gbSA8PCAxMzsKKyAgIH0KKworICAgZmkuaSA9IChmbHRfcyA8PCAzMSkgfCAoZmx0X2UgPDwgMjMpIHwgZmx0X207CisgICByZXN1bHQgPSBmaS5mOworICAgcmV0dXJuIHJlc3VsdDsKK30KKworLypAfSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgU29ydCAmIFNlYXJjaCAqLworLypAeyovCisKKy8qKgorICogV3JhcHBlciBmb3IgYnNlYXJjaCgpLgorICovCit2b2lkICoKK19tZXNhX2JzZWFyY2goIGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgCisgICAgICAgICAgICAgICBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSApCit7CisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorICAgdm9pZCAqbWlkOworICAgaW50IGNtcDsKKyAgIHdoaWxlIChubWVtYikgeworICAgICAgbm1lbWIgPj49IDE7CisgICAgICBtaWQgPSAoY2hhciAqKWJhc2UgKyBubWVtYiAqIHNpemU7CisgICAgICBjbXAgPSAoKmNvbXBhcikoa2V5LCBtaWQpOworICAgICAgaWYgKGNtcCA9PSAwKQorCSByZXR1cm4gbWlkOworICAgICAgaWYgKGNtcCA+IDApIHsKKwkgYmFzZSA9IChjaGFyICopbWlkICsgc2l6ZTsKKwkgLS1ubWVtYjsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBOVUxMOworI2Vsc2UKKyAgIHJldHVybiBic2VhcmNoKGtleSwgYmFzZSwgbm1lbWIsIHNpemUsIGNvbXBhcik7CisjZW5kaWYKK30KKworLypAfSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgRW52aXJvbm1lbnQgdmFycyAqLworLypAeyovCisKKy8qKgorICogV3JhcHBlciBmb3IgZ2V0ZW52KCkuCisgKi8KK2NoYXIgKgorX21lc2FfZ2V0ZW52KCBjb25zdCBjaGFyICp2YXIgKQoreworI2lmIGRlZmluZWQoX1hCT1gpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKyAgIHJldHVybiBOVUxMOworI2Vsc2UKKyAgIHJldHVybiBnZXRlbnYodmFyKTsKKyNlbmRpZgorfQorCisvKkB9Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBTdHJpbmcgKi8KKy8qQHsqLworCisvKioKKyAqIEltcGxlbWVudGVkIHVzaW5nIG1hbGxvYygpIGFuZCBzdHJjcHkuCisgKiBOb3RlIHRoYXQgTlVMTCBpcyBoYW5kbGVkIGFjY29yZGluZ2x5LgorICovCitjaGFyICoKK19tZXNhX3N0cmR1cCggY29uc3QgY2hhciAqcyApCit7CisgICBpZiAocykgeworICAgICAgc2l6ZV90IGwgPSBzdHJsZW4ocyk7CisgICAgICBjaGFyICpzMiA9IG1hbGxvYyhsICsgMSk7CisgICAgICBpZiAoczIpCisgICAgICAgICBzdHJjcHkoczIsIHMpOworICAgICAgcmV0dXJuIHMyOworICAgfQorICAgZWxzZSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KK30KKworLyoqIFdyYXBwZXIgYXJvdW5kIHN0cnRvZigpICovCitmbG9hdAorX21lc2Ffc3RydG9mKCBjb25zdCBjaGFyICpzLCBjaGFyICoqZW5kICkKK3sKKyNpZiBkZWZpbmVkKF9HTlVfU09VUkNFKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgXAorICAgIWRlZmluZWQoQU5EUk9JRCkgJiYgIWRlZmluZWQoX19IQUlLVV9fKSAmJiAhZGVmaW5lZChfX1VDTElCQ19fKSAmJiBcCisgICAhZGVmaW5lZChfX05ldEJTRF9fKQorICAgc3RhdGljIGxvY2FsZV90IGxvYyA9IE5VTEw7CisgICBpZiAoIWxvYykgeworICAgICAgbG9jID0gbmV3bG9jYWxlKExDX0NUWVBFX01BU0ssICJDIiwgTlVMTCk7CisgICB9CisgICByZXR1cm4gc3RydG9mX2wocywgZW5kLCBsb2MpOworI2VsaWYgZGVmaW5lZChfSVNPQzk5X1NPVVJDRSkgfHwgKGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgJiYgX1hPUEVOX1NPVVJDRSA+PSA2MDApCisgICByZXR1cm4gc3RydG9mKHMsIGVuZCk7CisjZWxzZQorICAgcmV0dXJuIChmbG9hdClzdHJ0b2QocywgZW5kKTsKKyNlbmRpZgorfQorCisvKiogQ29tcHV0ZSBzaW1wbGUgY2hlY2tzdW0vaGFzaCBmb3IgYSBzdHJpbmcgKi8KK3Vuc2lnbmVkIGludAorX21lc2Ffc3RyX2NoZWNrc3VtKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgIC8qIFRoaXMgY291bGQgcHJvYmFibHkgYmUgbXVjaCBiZXR0ZXIgKi8KKyAgIHVuc2lnbmVkIGludCBzdW0sIGk7CisgICBjb25zdCBjaGFyICpjOworICAgc3VtID0gaSA9IDE7CisgICBmb3IgKGMgPSBzdHI7ICpjOyBjKyssIGkrKykKKyAgICAgIHN1bSArPSAqYyAqIChpICUgMTAwKTsKKyAgIHJldHVybiBzdW0gKyBpOworfQorCisKKy8qQH0qLworCisKKy8qKiBOZWVkZWQgZHVlIHRvICNpZmRlZidzLCBhYm92ZS4gKi8KK2ludAorX21lc2FfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworICAgcmV0dXJuIHZzbnByaW50Ziggc3RyLCBzaXplLCBmbXQsIGFyZ3MpOworfQorCisvKiogV3JhcHBlciBhcm91bmQgdnNucHJpbnRmKCkgKi8KK2ludAorX21lc2Ffc25wcmludGYoIGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKyAgIGludCByOworICAgdmFfbGlzdCBhcmdzOworICAgdmFfc3RhcnQoIGFyZ3MsIGZtdCApOyAgCisgICByID0gdnNucHJpbnRmKCBzdHIsIHNpemUsIGZtdCwgYXJncyApOworICAgdmFfZW5kKCBhcmdzICk7CisgICByZXR1cm4gcjsKK30KKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2ltcG9ydHMuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vaW1wb3J0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGRkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2ltcG9ydHMuaApAQCAtMCwwICsxLDYwMyBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKy8qKgorICogXGZpbGUgaW1wb3J0cy5oCisgKiBTdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb24gd3JhcHBlcnMuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIHdyYXBwZXJzIGZvciBhbGwgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbnMKKyAqIGxpa2UgbWFsbG9jKCksIGZyZWUoKSwgcHJpbnRmKCksIGdldGVudigpLCBldGMuCisgKi8KKworCisjaWZuZGVmIElNUE9SVFNfSAorI2RlZmluZSBJTVBPUlRTX0gKKworCisjaW5jbHVkZSAiY29tcGlsZXIuaCIKKyNpbmNsdWRlICJnbGhlYWRlci5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogTWVtb3J5IG1hY3JvcyAqLworLypAeyovCisKKy8qKiBBbGxvY2F0ZSBhIHN0cnVjdHVyZSBvZiB0eXBlIFxwIFQgKi8KKyNkZWZpbmUgTUFMTE9DX1NUUlVDVChUKSAgIChzdHJ1Y3QgVCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBUKSkKKy8qKiBBbGxvY2F0ZSBhbmQgemVybyBhIHN0cnVjdHVyZSBvZiB0eXBlIFxwIFQgKi8KKyNkZWZpbmUgQ0FMTE9DX1NUUlVDVChUKSAgIChzdHJ1Y3QgVCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBUKSkKKworLypAfSovCisKKworLyoKKyAqIEZvciBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3Qgd2UgbmVlZCB0byB0cmVhdCB2ZXJ0ZXggYXJyYXkgcG9pbnRlcnMKKyAqIGFzIG9mZnNldHMgaW50byBidWZmZXIgc3RvcmVzLiAgU2luY2UgdGhlIHZlcnRleCBhcnJheSBwb2ludGVyIGFuZAorICogYnVmZmVyIHN0b3JlIHBvaW50ZXIgYXJlIGJvdGggcG9pbnRlcnMgYW5kIHdlIG5lZWQgdG8gYWRkIHRoZW0sIHdlIHVzZQorICogdGhpcyBtYWNyby4KKyAqIEJvdGggcG9pbnRlcnMvb2Zmc2V0cyBhcmUgZXhwcmVzc2VkIGluIGJ5dGVzLgorICovCisjZGVmaW5lIEFERF9QT0lOVEVSUyhBLCBCKSAgKCAoR0x1Ynl0ZSAqKSAoQSkgKyAodWludHB0cl90KSAoQikgKQorCisKKy8qKgorICogU29tZXRpbWVzIHdlIHRyZWF0IEdMZmxvYXRzIGFzIEdMaW50cy4gIE9uIHg4NiBzeXN0ZW1zLCBtb3ZpbmcgYSBmbG9hdAorICogYXMgYSBpbnQgKHRoZXJlYnkgdXNpbmcgaW50ZWdlciByZWdpc3RlcnMgaW5zdGVhZCBvZiBGUCByZWdpc3RlcnMpIGlzCisgKiBhIHBlcmZvcm1hbmNlIHdpbi4gIFR5cGljYWxseSwgdGhpcyBjYW4gYmUgZG9uZSB3aXRoIG9yZGluYXJ5IGNhc3RzLgorICogQnV0IHdpdGggZ2NjJ3MgLWZzdHJpY3QtYWxpYXNpbmcgZmxhZyAod2hpY2ggZGVmYXVsdHMgdG8gb24gaW4gZ2NjIDMuMCkKKyAqIHRoZXNlIGNhc3RzIGdlbmVyYXRlIHdhcm5pbmdzLgorICogVGhlIGZvbGxvd2luZyB1bmlvbiB0eXBlZGVmIGlzIHVzZWQgdG8gc29sdmUgdGhhdC4KKyAqLwordHlwZWRlZiB1bmlvbiB7IEdMZmxvYXQgZjsgR0xpbnQgaTsgR0x1aW50IHU7IH0gZmlfdHlwZTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRoIG1hY3JvcworICovCisKKyNkZWZpbmUgTUFYX0dMVVNIT1JUCTB4ZmZmZgorI2RlZmluZSBNQVhfR0xVSU5UCTB4ZmZmZmZmZmYKKworLyogRGVncmVlcyB0byByYWRpYW5zIGNvbnZlcnNpb246ICovCisjZGVmaW5lIERFRzJSQUQgKE1fUEkvMTgwLjApCisKKworLyoqCisgKiBcbmFtZSBXb3JrLWFyb3VuZHMgZm9yIHBsYXRmb3JtcyB0aGF0IGxhY2sgQzk5IG1hdGggZnVuY3Rpb25zCisgKi8KKy8qQHsqLworI2lmICghZGVmaW5lZChfWE9QRU5fU09VUkNFKSB8fCAoX1hPUEVOX1NPVVJDRSA8IDYwMCkpICYmICFkZWZpbmVkKF9JU09DOTlfU09VUkNFKSBcCisgICAmJiAoIWRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgfHwgKF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMKSkgXAorICAgJiYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPCAxNDAwKSkKKyNkZWZpbmUgYWNvc2YoZikgKChmbG9hdCkgYWNvcyhmKSkKKyNkZWZpbmUgYXNpbmYoZikgKChmbG9hdCkgYXNpbihmKSkKKyNkZWZpbmUgYXRhbjJmKHgseSkgKChmbG9hdCkgYXRhbjIoeCx5KSkKKyNkZWZpbmUgYXRhbmYoZikgKChmbG9hdCkgYXRhbihmKSkKKyNkZWZpbmUgY2VpbGYoZikgKChmbG9hdCkgY2VpbChmKSkKKyNkZWZpbmUgY29zZihmKSAoKGZsb2F0KSBjb3MoZikpCisjZGVmaW5lIGNvc2hmKGYpICgoZmxvYXQpIGNvc2goZikpCisjZGVmaW5lIGV4cGYoZikgKChmbG9hdCkgZXhwKGYpKQorI2RlZmluZSBleHAyZihmKSAoKGZsb2F0KSBleHAyKGYpKQorI2RlZmluZSBmbG9vcmYoZikgKChmbG9hdCkgZmxvb3IoZikpCisjZGVmaW5lIGxvZ2YoZikgKChmbG9hdCkgbG9nKGYpKQorCisjaWZkZWYgQU5EUk9JRAorI2RlZmluZSBsb2cyZihmKSAobG9nZihmKSAqIChmbG9hdCkgKDEuMCAvIE1fTE4yKSkKKyNlbHNlCisjZGVmaW5lIGxvZzJmKGYpICgoZmxvYXQpIGxvZzIoZikpCisjZW5kaWYKKworI2RlZmluZSBwb3dmKHgseSkgKChmbG9hdCkgcG93KHgseSkpCisjZGVmaW5lIHNpbmYoZikgKChmbG9hdCkgc2luKGYpKQorI2RlZmluZSBzaW5oZihmKSAoKGZsb2F0KSBzaW5oKGYpKQorI2RlZmluZSBzcXJ0ZihmKSAoKGZsb2F0KSBzcXJ0KGYpKQorI2RlZmluZSB0YW5mKGYpICgoZmxvYXQpIHRhbihmKSkKKyNkZWZpbmUgdGFuaGYoZikgKChmbG9hdCkgdGFuaChmKSkKKyNkZWZpbmUgYWNvc2hmKGYpICgoZmxvYXQpIGFjb3NoKGYpKQorI2RlZmluZSBhc2luaGYoZikgKChmbG9hdCkgYXNpbmgoZikpCisjZGVmaW5lIGF0YW5oZihmKSAoKGZsb2F0KSBhdGFuaChmKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpZiBfTVNDX1ZFUiA8IDE4MDAgIC8qIE5vdCByZXEnZCBvbiBWUzIwMTMgYW5kIGFib3ZlICovCitzdGF0aWMgaW5saW5lIGZsb2F0IHRydW5jZihmbG9hdCB4KSB7IHJldHVybiB4IDwgMC4wZiA/IGNlaWxmKHgpIDogZmxvb3JmKHgpOyB9CitzdGF0aWMgaW5saW5lIGZsb2F0IGV4cDJmKGZsb2F0IHgpIHsgcmV0dXJuIHBvd2YoMi4wZiwgeCk7IH0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgbG9nMmYoZmxvYXQgeCkgeyByZXR1cm4gbG9nZih4KSAqIDEuNDQyNjk1MDQxZjsgfQorc3RhdGljIGlubGluZSBmbG9hdCBhc2luaGYoZmxvYXQgeCkgeyByZXR1cm4gbG9nZih4ICsgc3FydGYoeCAqIHggKyAxLjBmKSk7IH0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgYWNvc2hmKGZsb2F0IHgpIHsgcmV0dXJuIGxvZ2YoeCArIHNxcnRmKHggKiB4IC0gMS4wZikpOyB9CitzdGF0aWMgaW5saW5lIGZsb2F0IGF0YW5oZihmbG9hdCB4KSB7IHJldHVybiAobG9nZigxLjBmICsgeCkgLSBsb2dmKDEuMGYgLSB4KSkgLyAyLjBmOyB9CitzdGF0aWMgaW5saW5lIGludCBpc2JsYW5rKGludCBjaCkgeyByZXR1cm4gY2ggPT0gJyAnIHx8IGNoID09ICdcdCc7IH0KKyNkZWZpbmUgc3RydG9sbChwLCBlLCBiKSBfc3RydG9pNjQocCwgZSwgYikKKyNlbmRpZiAvKiBfTVNDX1ZFUiA8IDE4MDAgKi8KKyNkZWZpbmUgc3RyY2FzZWNtcChzMSwgczIpIF9zdHJpY21wKHMxLCBzMikKKyNlbmRpZgorLypAfSovCisKKworLyoKKyAqIHNpZ25iaXQoKSBpcyBhIG1hY3JvIG9uIExpbnV4LiAgTm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICovCisjaWZuZGVmIHNpZ25iaXQKKyNkZWZpbmUgc2lnbmJpdCh4KSAoKHgpIDwgMC4wZikKKyNlbmRpZgorCisKKy8qKiBzaW5nbGUtcHJlY2lzaW9uIGludmVyc2Ugc3F1YXJlIHJvb3QgKi8KK3N0YXRpYyBpbmxpbmUgZmxvYXQKK0lOVl9TUVJURihmbG9hdCB4KQoreworICAgLyogWFhYIHdlIGNvdWxkIHRyeSBRdWFrZSdzIGZhc3QgaW52ZXJzZSBzcXVhcmUgcm9vdCBmdW5jdGlvbiBoZXJlICovCisgICByZXR1cm4gMS4wRiAvIHNxcnRmKHgpOworfQorCisKKy8qKioKKyAqKiogTE9HMjogTG9nIGJhc2UgMiBvZiBmbG9hdAorICoqKi8KK3N0YXRpYyBpbmxpbmUgR0xmbG9hdCBMT0cyKEdMZmxvYXQgeCkKK3sKKyNpZmRlZiBVU0VfSUVFRQorI2lmIDAKKyAgIC8qIFRoaXMgaXMgcHJldHR5IGZhc3QsIGJ1dCBub3QgYWNjdXJhdGUgZW5vdWdoIChvbmx5IDIgZnJhY3Rpb25hbCBiaXRzKS4KKyAgICAqIEJhc2VkIG9uIGNvZGUgZnJvbSBodHRwOi8vd3d3LnN0ZXJlb3BzaXMuY29tL2xvZzIuaHRtbAorICAgICovCisgICBjb25zdCBHTGZsb2F0IHkgPSB4ICogeCAqIHggKiB4OworICAgY29uc3QgR0x1aW50IGl4ID0gKigoR0x1aW50ICopICZ5KTsKKyAgIGNvbnN0IEdMdWludCBleHAgPSAoaXggPj4gMjMpICYgMHhGRjsKKyAgIGNvbnN0IEdMaW50IGxvZzIgPSAoKEdMaW50KSBleHApIC0gMTI3OworICAgcmV0dXJuIChHTGZsb2F0KSBsb2cyICogKDEuMCAvIDQuMCk7ICAvKiA0LCBiZWNhdXNlIG9mIHheNCBhYm92ZSAqLworI2VuZGlmCisgICAvKiBQcmV0dHkgZmFzdCwgYW5kIGFjY3VyYXRlLgorICAgICogQmFzZWQgb24gY29kZSBmcm9tIGh0dHA6Ly93d3cuZmxpcGNvZGUuY29tL3RvdGQvCisgICAgKi8KKyAgIGZpX3R5cGUgbnVtOworICAgR0xpbnQgbG9nXzI7CisgICBudW0uZiA9IHg7CisgICBsb2dfMiA9ICgobnVtLmkgPj4gMjMpICYgMjU1KSAtIDEyODsKKyAgIG51bS5pICY9IH4oMjU1IDw8IDIzKTsKKyAgIG51bS5pICs9IDEyNyA8PCAyMzsKKyAgIG51bS5mID0gKCgtMS4wZi8zKSAqIG51bS5mICsgMikgKiBudW0uZiAtIDIuMGYvMzsKKyAgIHJldHVybiBudW0uZiArIGxvZ18yOworI2Vsc2UKKyAgIC8qCisgICAgKiBOT1RFOiBsb2dfYmFzZV8yKHgpID0gbG9nKHgpIC8gbG9nKDIpCisgICAgKiBOT1RFOiAxLjQ0MjY5NSA9IDEvbG9nKDIpLgorICAgICovCisgICByZXR1cm4gKEdMZmxvYXQpIChsb2coeCkgKiAxLjQ0MjY5NUYpOworI2VuZGlmCit9CisKKworCisvKioqCisgKioqIElTX0lORl9PUl9OQU46IHRlc3QgaWYgZmxvYXQgaXMgaW5maW5pdGUgb3IgTmFOCisgKioqLworI2lmZGVmIFVTRV9JRUVFCitzdGF0aWMgaW5saW5lIGludCBJU19JTkZfT1JfTkFOKCBmbG9hdCB4ICkKK3sKKyAgIGZpX3R5cGUgdG1wOworICAgdG1wLmYgPSB4OworICAgcmV0dXJuICEoaW50KSgodW5zaWduZWQgaW50KSgodG1wLmkgJiAweDdmZmZmZmZmKS0weDdmODAwMDAwKSA+PiAzMSk7Cit9CisjZWxpZiBkZWZpbmVkKGlzZmluaXRlKQorI2RlZmluZSBJU19JTkZfT1JfTkFOKHgpICAgICAgICAoIWlzZmluaXRlKHgpKQorI2VsaWYgZGVmaW5lZChmaW5pdGUpCisjZGVmaW5lIElTX0lORl9PUl9OQU4oeCkgICAgICAgICghZmluaXRlKHgpKQorI2VsaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgSVNfSU5GX09SX05BTih4KSAgICAgICAgKCFpc2Zpbml0ZSh4KSkKKyNlbHNlCisjZGVmaW5lIElTX0lORl9PUl9OQU4oeCkgICAgICAgICghZmluaXRlKHgpKQorI2VuZGlmCisKKworLyoqKgorICoqKiBDRUlMRjogY2VpbGluZyBvZiBmbG9hdAorICoqKiBGTE9PUkY6IGZsb29yIG9mIGZsb2F0CisgKioqIEZBQlNGOiBhYnNvbHV0ZSB2YWx1ZSBvZiBmbG9hdAorICoqKiBMT0dGOiB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKGJhc2UgZSkgb2YgdGhlIHZhbHVlCisgKioqIEVYUEY6IHJhaXNlIGUgdG8gdGhlIHZhbHVlCisgKioqIExERVhQRjogbXVsdGlwbHkgdmFsdWUgYnkgYW4gaW50ZWdyYWwgcG93ZXIgb2YgdHdvCisgKioqIEZSRVhQRjogZXh0cmFjdCBtYW50aXNzYSBhbmQgZXhwb25lbnQgZnJvbSB2YWx1ZQorICoqKi8KKyNpZiBkZWZpbmVkKF9fZ251X2xpbnV4X18pCisvKiBDOTkgZnVuY3Rpb25zICovCisjZGVmaW5lIENFSUxGKHgpICAgY2VpbGYoeCkKKyNkZWZpbmUgRkxPT1JGKHgpICBmbG9vcmYoeCkKKyNkZWZpbmUgRkFCU0YoeCkgICBmYWJzZih4KQorI2RlZmluZSBMT0dGKHgpICAgIGxvZ2YoeCkKKyNkZWZpbmUgRVhQRih4KSAgICBleHBmKHgpCisjZGVmaW5lIExERVhQRih4LHkpICBsZGV4cGYoeCx5KQorI2RlZmluZSBGUkVYUEYoeCx5KSAgZnJleHBmKHgseSkKKyNlbHNlCisjZGVmaW5lIENFSUxGKHgpICAgKChHTGZsb2F0KSBjZWlsKHgpKQorI2RlZmluZSBGTE9PUkYoeCkgICgoR0xmbG9hdCkgZmxvb3IoeCkpCisjZGVmaW5lIEZBQlNGKHgpICAgKChHTGZsb2F0KSBmYWJzKHgpKQorI2RlZmluZSBMT0dGKHgpICAgICgoR0xmbG9hdCkgbG9nKHgpKQorI2RlZmluZSBFWFBGKHgpICAgICgoR0xmbG9hdCkgZXhwKHgpKQorI2RlZmluZSBMREVYUEYoeCx5KSAgKChHTGZsb2F0KSBsZGV4cCh4LHkpKQorI2RlZmluZSBGUkVYUEYoeCx5KSAgKChHTGZsb2F0KSBmcmV4cCh4LHkpKQorI2VuZGlmCisKKworLyoqCisgKiBDb252ZXJ0IGZsb2F0IHRvIGludCBieSByb3VuZGluZyB0byBuZWFyZXN0IGludGVnZXIsIGF3YXkgZnJvbSB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIGludCBJUk9VTkQoZmxvYXQgZikKK3sKKyAgIHJldHVybiAoaW50KSAoKGYgPj0gMC4wRikgPyAoZiArIDAuNUYpIDogKGYgLSAwLjVGKSk7Cit9CisKKworLyoqCisgKiBDb252ZXJ0IGZsb2F0IHRvIGludDY0IGJ5IHJvdW5kaW5nIHRvIG5lYXJlc3QgaW50ZWdlci4KKyAqLworc3RhdGljIGlubGluZSBHTGludDY0IElST1VORDY0KGZsb2F0IGYpCit7CisgICByZXR1cm4gKEdMaW50NjQpICgoZiA+PSAwLjBGKSA/IChmICsgMC41RikgOiAoZiAtIDAuNUYpKTsKK30KKworCisvKioKKyAqIENvbnZlcnQgcG9zaXRpdmUgZmxvYXQgdG8gaW50IGJ5IHJvdW5kaW5nIHRvIG5lYXJlc3QgaW50ZWdlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgSVJPVU5EX1BPUyhmbG9hdCBmKQoreworICAgYXNzZXJ0KGYgPj0gMC4wRik7CisgICByZXR1cm4gKGludCkgKGYgKyAwLjVGKTsKK30KKworCisvKioKKyAqIENvbnZlcnQgZmxvYXQgdG8gaW50IHVzaW5nIGEgZmFzdCBtZXRob2QuICBUaGUgcm91bmRpbmcgbW9kZSBtYXkgdmFyeS4KKyAqIFhYWCBXZSBjb3VsZCB1c2UgYW4geDg2LTY0L1NTRTIgdmVyc2lvbiBoZXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBGX1RPX0koZmxvYXQgZikKK3sKKyNpZiBkZWZpbmVkKFVTRV9YODZfQVNNKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorICAgaW50IHI7CisgICBfX2FzbV9fICgiZmlzdHBsICUwIiA6ICI9bSIgKHIpIDogInQiIChmKSA6ICJzdCIpOworICAgcmV0dXJuIHI7CisjZWxpZiBkZWZpbmVkKFVTRV9YODZfQVNNKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQorICAgaW50IHI7CisgICBfYXNtIHsKKwkgZmxkIGYKKwkgZmlzdHAgcgorCX0KKyAgIHJldHVybiByOworI2Vsc2UKKyAgIHJldHVybiBJUk9VTkQoZik7CisjZW5kaWYKK30KKworCisvKiogUmV0dXJuIChhcyBhbiBpbnRlZ2VyKSBmbG9vciBvZiBmbG9hdCAqLworc3RhdGljIGlubGluZSBpbnQgSUZMT09SKGZsb2F0IGYpCit7CisjaWYgZGVmaW5lZChVU0VfWDg2X0FTTSkgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKKyAgIC8qCisgICAgKiBJRUVFIGZsb29yIGZvciBjb21wdXRlcnMgdGhhdCByb3VuZCB0byBuZWFyZXN0IG9yIGV2ZW4uCisgICAgKiAnZicgbXVzdCBiZSBiZXR3ZWVuIC00MTk0MzA0IGFuZCA0MTk0MzAzLgorICAgICogVGhpcyBmbG9vciBvcGVyYXRpb24gaXMgZG9uZSBieSAiKGlyb3VuZChmICsgLjUpICsgaXJvdW5kKGYgLSAuNSkpID4+IDEiLAorICAgICogYnV0IHVzZXMgc29tZSBJRUVFIHNwZWNpZmljIHRyaWNrcyBmb3IgYmV0dGVyIHNwZWVkLgorICAgICogQ29udHJpYnV0ZWQgYnkgSm9zaCBWYW5kZXJob29mCisgICAgKi8KKyAgIGludCBhaSwgYmk7CisgICBkb3VibGUgYWYsIGJmOworICAgYWYgPSAoMyA8PCAyMikgKyAwLjUgKyAoZG91YmxlKWY7CisgICBiZiA9ICgzIDw8IDIyKSArIDAuNSAtIChkb3VibGUpZjsKKyAgIC8qIEdDQyBnZW5lcmF0ZXMgYW4gZXh0cmEgZnN0cC9mbGQgd2l0aG91dCB0aGlzLiAqLworICAgX19hc21fXyAoImZzdHBzICUwIiA6ICI9bSIgKGFpKSA6ICJ0IiAoYWYpIDogInN0Iik7CisgICBfX2FzbV9fICgiZnN0cHMgJTAiIDogIj1tIiAoYmkpIDogInQiIChiZikgOiAic3QiKTsKKyAgIHJldHVybiAoYWkgLSBiaSkgPj4gMTsKKyNlbGlmIGRlZmluZWQoVVNFX0lFRUUpCisgICBpbnQgYWksIGJpOworICAgZG91YmxlIGFmLCBiZjsKKyAgIGZpX3R5cGUgdTsKKyAgIGFmID0gKDMgPDwgMjIpICsgMC41ICsgKGRvdWJsZSlmOworICAgYmYgPSAoMyA8PCAyMikgKyAwLjUgLSAoZG91YmxlKWY7CisgICB1LmYgPSAoZmxvYXQpIGFmOyAgYWkgPSB1Lmk7CisgICB1LmYgPSAoZmxvYXQpIGJmOyAgYmkgPSB1Lmk7CisgICByZXR1cm4gKGFpIC0gYmkpID4+IDE7CisjZWxzZQorICAgaW50IGkgPSBJUk9VTkQoZik7CisgICByZXR1cm4gKGkgPiBmKSA/IGkgLSAxIDogaTsKKyNlbmRpZgorfQorCisKKy8qKiBSZXR1cm4gKGFzIGFuIGludGVnZXIpIGNlaWxpbmcgb2YgZmxvYXQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IElDRUlMKGZsb2F0IGYpCit7CisjaWYgZGVmaW5lZChVU0VfWDg2X0FTTSkgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKKyAgIC8qCisgICAgKiBJRUVFIGNlaWwgZm9yIGNvbXB1dGVycyB0aGF0IHJvdW5kIHRvIG5lYXJlc3Qgb3IgZXZlbi4KKyAgICAqICdmJyBtdXN0IGJlIGJldHdlZW4gLTQxOTQzMDQgYW5kIDQxOTQzMDMuCisgICAgKiBUaGlzIGNlaWwgb3BlcmF0aW9uIGlzIGRvbmUgYnkgIihpcm91bmQoZiArIC41KSArIGlyb3VuZChmIC0gLjUpICsgMSkgPj4gMSIsCisgICAgKiBidXQgdXNlcyBzb21lIElFRUUgc3BlY2lmaWMgdHJpY2tzIGZvciBiZXR0ZXIgc3BlZWQuCisgICAgKiBDb250cmlidXRlZCBieSBKb3NoIFZhbmRlcmhvb2YKKyAgICAqLworICAgaW50IGFpLCBiaTsKKyAgIGRvdWJsZSBhZiwgYmY7CisgICBhZiA9ICgzIDw8IDIyKSArIDAuNSArIChkb3VibGUpZjsKKyAgIGJmID0gKDMgPDwgMjIpICsgMC41IC0gKGRvdWJsZSlmOworICAgLyogR0NDIGdlbmVyYXRlcyBhbiBleHRyYSBmc3RwL2ZsZCB3aXRob3V0IHRoaXMuICovCisgICBfX2FzbV9fICgiZnN0cHMgJTAiIDogIj1tIiAoYWkpIDogInQiIChhZikgOiAic3QiKTsKKyAgIF9fYXNtX18gKCJmc3RwcyAlMCIgOiAiPW0iIChiaSkgOiAidCIgKGJmKSA6ICJzdCIpOworICAgcmV0dXJuIChhaSAtIGJpICsgMSkgPj4gMTsKKyNlbGlmIGRlZmluZWQoVVNFX0lFRUUpCisgICBpbnQgYWksIGJpOworICAgZG91YmxlIGFmLCBiZjsKKyAgIGZpX3R5cGUgdTsKKyAgIGFmID0gKDMgPDwgMjIpICsgMC41ICsgKGRvdWJsZSlmOworICAgYmYgPSAoMyA8PCAyMikgKyAwLjUgLSAoZG91YmxlKWY7CisgICB1LmYgPSAoZmxvYXQpIGFmOyBhaSA9IHUuaTsKKyAgIHUuZiA9IChmbG9hdCkgYmY7IGJpID0gdS5pOworICAgcmV0dXJuIChhaSAtIGJpICsgMSkgPj4gMTsKKyNlbHNlCisgICBpbnQgaSA9IElST1VORChmKTsKKyAgIHJldHVybiAoaSA8IGYpID8gaSArIDEgOiBpOworI2VuZGlmCit9CisKKworLyoqCisgKiBJcyB4IGEgcG93ZXIgb2YgdHdvPworICovCitzdGF0aWMgaW5saW5lIGludAorX21lc2FfaXNfcG93X3R3byhpbnQgeCkKK3sKKyAgIHJldHVybiAhKHggJiAoeCAtIDEpKTsKK30KKworLyoqCisgKiBSb3VuZCBnaXZlbiBpbnRlZ2VyIHRvIG5leHQgaGlnaGVyIHBvd2VyIG9mIHR3bworICogSWYgWCBpcyB6ZXJvIHJlc3VsdCBpcyB1bmRlZmluZWQuCisgKgorICogU291cmNlIGZvciB0aGUgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaXMKKyAqIFNlYW4gRXJvbiBBbmRlcnNvbidzIHdlYnBhZ2UgIkJpdCBUd2lkZGxpbmcgSGFja3MiCisgKiBodHRwOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L35zZWFuZGVyL2JpdGhhY2tzLmh0bWwKKyAqCisgKiBXaGVuIHVzaW5nIGJ1aWx0aW4gZnVuY3Rpb24gaGF2ZSB0byBkbyBzb21lIHdvcmsKKyAqIGZvciBjYXNlIHdoZW4gcGFzc2VkIHZhbHVlcyAxIHRvIHByZXZlbnQgaGl0aW5nCisgKiB1bmRlZmluZWQgcmVzdWx0IGZyb20gX19idWlsdGluX2Nsei4gVW5kZWZpbmVkCisgKiByZXN1bHRzIHdvdWxkIGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gb3B0aW1pemF0aW9uCisgKiBsZXZlbCB1c2VkIGZvciBidWlsZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQzMl90CitfbWVzYV9uZXh0X3Bvd190d29fMzIodWludDMyX3QgeCkKK3sKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCisJKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAzMDQpIC8qIGdjYyAzLjQgb3IgbGF0ZXIgKi8KKwl1aW50MzJfdCB5ID0gKHggIT0gMSk7CisJcmV0dXJuICgxICsgeSkgPDwgKChfX2J1aWx0aW5fY2x6KHggLSB5KSBeIDMxKSApOworI2Vsc2UKKwl4LS07CisJeCB8PSB4ID4+IDE7CisJeCB8PSB4ID4+IDI7CisJeCB8PSB4ID4+IDQ7CisJeCB8PSB4ID4+IDg7CisJeCB8PSB4ID4+IDE2OworCXgrKzsKKwlyZXR1cm4geDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludDY0X3QKK19tZXNhX25leHRfcG93X3R3b182NCh1aW50NjRfdCB4KQoreworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIFwKKwkoKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pID49IDMwNCkgLyogZ2NjIDMuNCBvciBsYXRlciAqLworCXVpbnQ2NF90IHkgPSAoeCAhPSAxKTsKKwlpZiAoc2l6ZW9mKHgpID09IHNpemVvZihsb25nKSkKKwkJcmV0dXJuICgxICsgeSkgPDwgKChfX2J1aWx0aW5fY2x6bCh4IC0geSkgXiA2MykpOworCWVsc2UKKwkJcmV0dXJuICgxICsgeSkgPDwgKChfX2J1aWx0aW5fY2x6bGwoeCAtIHkpIF4gNjMpKTsKKyNlbHNlCisJeC0tOworCXggfD0geCA+PiAxOworCXggfD0geCA+PiAyOworCXggfD0geCA+PiA0OworCXggfD0geCA+PiA4OworCXggfD0geCA+PiAxNjsKKwl4IHw9IHggPj4gMzI7CisJeCsrOworCXJldHVybiB4OworI2VuZGlmCit9CisKKworLyoKKyAqIFJldHVybnMgdGhlIGZsb29yIGZvcm0gb2YgYmluYXJ5IGxvZ2FyaXRobSBmb3IgYSAzMi1iaXQgaW50ZWdlci4KKyAqLworc3RhdGljIGlubGluZSBHTHVpbnQKK19tZXNhX2xvZ2Jhc2UyKEdMdWludCBuKQoreworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIFwKKyAgICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMzA0KSAvKiBnY2MgMy40IG9yIGxhdGVyICovCisgICByZXR1cm4gKDMxIC0gX19idWlsdGluX2NseihuIHwgMSkpOworI2Vsc2UKKyAgIEdMdWludCBwb3MgPSAwOworICAgaWYgKG4gPj0gMTw8MTYpIHsgbiA+Pj0gMTY7IHBvcyArPSAxNjsgfQorICAgaWYgKG4gPj0gMTw8IDgpIHsgbiA+Pj0gIDg7IHBvcyArPSAgODsgfQorICAgaWYgKG4gPj0gMTw8IDQpIHsgbiA+Pj0gIDQ7IHBvcyArPSAgNDsgfQorICAgaWYgKG4gPj0gMTw8IDIpIHsgbiA+Pj0gIDI7IHBvcyArPSAgMjsgfQorICAgaWYgKG4gPj0gMTw8IDEpIHsgICAgICAgICAgIHBvcyArPSAgMTsgfQorICAgcmV0dXJuIHBvczsKKyNlbmRpZgorfQorCisKKy8qKgorICogUmV0dXJuIDEgaWYgdGhpcyBpcyBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZSwgMCBpZiBiaWcgZW5kaWFuLgorICovCitzdGF0aWMgaW5saW5lIEdMYm9vbGVhbgorX21lc2FfbGl0dGxlX2VuZGlhbih2b2lkKQoreworICAgY29uc3QgR0x1aW50IHVpID0gMTsgLyogaW50ZW50aW9uYWxseSBub3Qgc3RhdGljICovCisgICByZXR1cm4gKigoY29uc3QgR0x1Ynl0ZSAqKSAmdWkpOworfQorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitzdGF0aWMgaW5saW5lIGludAorX21lc2FfbWtkaXIoY29uc3QgY2hhciAqcGF0aCkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgIGlmIChfbWtkaXIocGF0aCkgIT0gMCkKKyAgICAgIHJldHVybiBlcnJubzsKKyAgIHJldHVybiAwOworI2Vsc2UKKyAgIGlmIChta2RpcihwYXRoLCAwNzc1KSAhPSAwKQorICAgICAgcmV0dXJuIGVycm5vOworICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbnMKKyAqLworCitleHRlcm4gdm9pZCAqCitfbWVzYV9hbGlnbl9tYWxsb2MoIHNpemVfdCBieXRlcywgdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQgKTsKKworZXh0ZXJuIHZvaWQgKgorX21lc2FfYWxpZ25fY2FsbG9jKCBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgYWxpZ25tZW50ICk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9hbGlnbl9mcmVlKCB2b2lkICpwdHIgKTsKKworZXh0ZXJuIHZvaWQgKgorX21lc2FfYWxpZ25fcmVhbGxvYyh2b2lkICpvbGRCdWZmZXIsIHNpemVfdCBvbGRTaXplLCBzaXplX3QgbmV3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQpOworCitleHRlcm4gdm9pZCAqCitfbWVzYV9leGVjX21hbGxvYyggR0x1aW50IHNpemUgKTsKKworZXh0ZXJuIHZvaWQgCitfbWVzYV9leGVjX2ZyZWUoIHZvaWQgKmFkZHIgKTsKKworZXh0ZXJuIHZvaWQgKgorX21lc2FfcmVhbGxvYyggdm9pZCAqb2xkQnVmZmVyLCBzaXplX3Qgb2xkU2l6ZSwgc2l6ZV90IG5ld1NpemUgKTsKKworCisjaWZuZGVmIEZGU19ERUZJTkVECisjZGVmaW5lIEZGU19ERUZJTkVEIDEKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBmZnMgX19idWlsdGluX2ZmcworI2RlZmluZSBmZnNsbCBfX2J1aWx0aW5fZmZzbGwKKyNlbHNlCitleHRlcm4gaW50IGZmcyhpbnQgaSk7CitleHRlcm4gaW50IGZmc2xsKGxvbmcgbG9uZyBpbnQgaSk7CisjZW5kaWYgLypfXyBHTlVDX18gKi8KKyNlbmRpZiAvKiBGRlNfREVGSU5FRCAqLworCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pID49IDMwNCkgLyogZ2NjIDMuNCBvciBsYXRlciAqLworI2RlZmluZSBfbWVzYV9iaXRjb3VudChpKSBfX2J1aWx0aW5fcG9wY291bnQoaSkKKyNkZWZpbmUgX21lc2FfYml0Y291bnRfNjQoaSkgX19idWlsdGluX3BvcGNvdW50bGwoaSkKKyNlbHNlCitleHRlcm4gdW5zaWduZWQgaW50CitfbWVzYV9iaXRjb3VudCh1bnNpZ25lZCBpbnQgbik7CitleHRlcm4gdW5zaWduZWQgaW50CitfbWVzYV9iaXRjb3VudF82NCh1aW50NjRfdCBuKTsKKyNlbmRpZgorCisvKioKKyAqIEZpbmQgdGhlIGxhc3QgKG1vc3Qgc2lnbmlmaWNhbnQpIGJpdCBzZXQgaW4gYSB3b3JkLgorICoKKyAqIEVzc2VudGlhbGx5IGZmcygpIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK19tZXNhX2Zscyh1bnNpZ25lZCBpbnQgbikKK3sKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pID49IDMwNCkKKyAgIHJldHVybiBuID09IDAgPyAwIDogMzIgLSBfX2J1aWx0aW5fY2x6KG4pOworI2Vsc2UKKyAgIHVuc2lnbmVkIGludCB2ID0gMTsKKworICAgaWYgKG4gPT0gMCkKKyAgICAgIHJldHVybiAwOworCisgICB3aGlsZSAobiA+Pj0gMSkKKyAgICAgICB2Kys7CisKKyAgIHJldHVybiB2OworI2VuZGlmCit9CisKK2V4dGVybiBpbnQKK19tZXNhX3JvdW5kX3RvX2V2ZW4oZmxvYXQgdmFsKTsKKworZXh0ZXJuIEdMaGFsZkFSQgorX21lc2FfZmxvYXRfdG9faGFsZihmbG9hdCBmKTsKKworZXh0ZXJuIGZsb2F0CitfbWVzYV9oYWxmX3RvX2Zsb2F0KEdMaGFsZkFSQiBoKTsKKworCitleHRlcm4gdm9pZCAqCitfbWVzYV9ic2VhcmNoKCBjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIAorICAgICAgICAgICAgICAgaW50ICgqY29tcGFyKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikgKTsKKworZXh0ZXJuIGNoYXIgKgorX21lc2FfZ2V0ZW52KCBjb25zdCBjaGFyICp2YXIgKTsKKworZXh0ZXJuIGNoYXIgKgorX21lc2Ffc3RyZHVwKCBjb25zdCBjaGFyICpzICk7CisKK2V4dGVybiBmbG9hdAorX21lc2Ffc3RydG9mKCBjb25zdCBjaGFyICpzLCBjaGFyICoqZW5kICk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQKK19tZXNhX3N0cl9jaGVja3N1bShjb25zdCBjaGFyICpzdHIpOworCitleHRlcm4gaW50CitfbWVzYV9zbnByaW50ZiggY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4gKSBQUklOVEZMSUtFKDMsIDQpOworCitleHRlcm4gaW50CitfbWVzYV92c25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZyk7CisKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKHNucHJpbnRmKQorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIElNUE9SVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9tYWNyb3MuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiNWVmOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vbWFjcm9zLmgKQEAgLTAsMCArMSw4MjYgQEAKKy8qKgorICogXGZpbGUgbWFjcm9zLmgKKyAqIEEgY29sbGVjdGlvbiBvZiB1c2VmdWwgbWFjcm9zLgorICovCisKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIE1BQ1JPU19ICisjZGVmaW5lIE1BQ1JPU19ICisKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisKKworLyoqCisgKiBcbmFtZSBJbnRlZ2VyIC8gZmxvYXQgY29udmVyc2lvbiBmb3IgY29sb3JzLCBub3JtYWxzLCBldGMuCisgKi8KKy8qQHsqLworCisvKiogQ29udmVydCBHTHVieXRlIGluIFswLDI1NV0gdG8gR0xmbG9hdCBpbiBbMC4wLDEuMF0gKi8KK2V4dGVybiBHTGZsb2F0IF9tZXNhX3VieXRlX3RvX2Zsb2F0X2NvbG9yX3RhYlsyNTZdOworI2RlZmluZSBVQllURV9UT19GTE9BVCh1KSBfbWVzYV91Ynl0ZV90b19mbG9hdF9jb2xvcl90YWJbKHVuc2lnbmVkIGludCkodSldCisKKy8qKiBDb252ZXJ0IEdMZmxvYXQgaW4gWzAuMCwxLjBdIHRvIEdMdWJ5dGUgaW4gWzAsMjU1XSAqLworI2RlZmluZSBGTE9BVF9UT19VQllURShYKSAgICgoR0x1Ynl0ZSkgKEdMaW50KSAoKFgpICogMjU1LjBGKSkKKworCisvKiogQ29udmVydCBHTGJ5dGUgaW4gWy0xMjgsMTI3XSB0byBHTGZsb2F0IGluIFstMS4wLDEuMF0gKi8KKyNkZWZpbmUgQllURV9UT19GTE9BVChCKSAgICAoKDIuMEYgKiAoQikgKyAxLjBGKSAqICgxLjBGLzI1NS4wRikpCisKKy8qKiBDb252ZXJ0IEdMZmxvYXQgaW4gWy0xLjAsMS4wXSB0byBHTGJ5dGUgaW4gWy0xMjgsMTI3XSAqLworI2RlZmluZSBGTE9BVF9UT19CWVRFKFgpICAgICggKCgoR0xpbnQpICgyNTUuMEYgKiAoWCkpKSAtIDEpIC8gMiApCisKKworLyoqIENvbnZlcnQgR0xieXRlIHRvIEdMZmxvYXQgd2hpbGUgcHJlc2VydmluZyB6ZXJvICovCisjZGVmaW5lIEJZVEVfVE9fRkxPQVRaKEIpICAgKChCKSA9PSAwID8gMC4wRiA6IEJZVEVfVE9fRkxPQVQoQikpCisKKworLyoqIENvbnZlcnQgR0xieXRlIGluIFstMTI4LDEyN10gdG8gR0xmbG9hdCBpbiBbLTEuMCwxLjBdLCB0ZXh0dXJlL2ZiIGRhdGEgKi8KKyNkZWZpbmUgQllURV9UT19GTE9BVF9URVgoQikgICAgKChCKSA9PSAtMTI4ID8gLTEuMEYgOiAoQikgKiAoMS4wRi8xMjcuMEYpKQorCisvKiogQ29udmVydCBHTGZsb2F0IGluIFstMS4wLDEuMF0gdG8gR0xieXRlIGluIFstMTI4LDEyN10sIHRleHR1cmUvZmIgZGF0YSAqLworI2RlZmluZSBGTE9BVF9UT19CWVRFX1RFWChYKSAgICBDTEFNUCggKEdMaW50KSAoMTI3LjBGICogKFgpKSwgLTEyOCwgMTI3ICkKKworLyoqIENvbnZlcnQgR0x1c2hvcnQgaW4gWzAsNjU1MzVdIHRvIEdMZmxvYXQgaW4gWzAuMCwxLjBdICovCisjZGVmaW5lIFVTSE9SVF9UT19GTE9BVChTKSAgKChHTGZsb2F0KSAoUykgKiAoMS4wRiAvIDY1NTM1LjBGKSkKKworLyoqIENvbnZlcnQgR0xmbG9hdCBpbiBbMC4wLDEuMF0gdG8gR0x1c2hvcnQgaW4gWzAsIDY1NTM1XSAqLworI2RlZmluZSBGTE9BVF9UT19VU0hPUlQoWCkgICAoKEdMdWludCkgKChYKSAqIDY1NTM1LjBGKSkKKworCisvKiogQ29udmVydCBHTHNob3J0IGluIFstMzI3NjgsMzI3NjddIHRvIEdMZmxvYXQgaW4gWy0xLjAsMS4wXSAqLworI2RlZmluZSBTSE9SVF9UT19GTE9BVChTKSAgICgoMi4wRiAqIChTKSArIDEuMEYpICogKDEuMEYvNjU1MzUuMEYpKQorCisvKiogQ29udmVydCBHTGZsb2F0IGluIFstMS4wLDEuMF0gdG8gR0xzaG9ydCBpbiBbLTMyNzY4LDMyNzY3XSAqLworI2RlZmluZSBGTE9BVF9UT19TSE9SVChYKSAgICggKCgoR0xpbnQpICg2NTUzNS4wRiAqIChYKSkpIC0gMSkgLyAyICkKKworLyoqIENvbnZlcnQgR0xzaG9ydCB0byBHTGZsb2F0IHdoaWxlIHByZXNlcnZpbmcgemVybyAqLworI2RlZmluZSBTSE9SVF9UT19GTE9BVFooUykgICAoKFMpID09IDAgPyAwLjBGIDogU0hPUlRfVE9fRkxPQVQoUykpCisKKworLyoqIENvbnZlcnQgR0xzaG9ydCBpbiBbLTMyNzY4LDMyNzY3XSB0byBHTGZsb2F0IGluIFstMS4wLDEuMF0sIHRleHR1cmUvZmIgZGF0YSAqLworI2RlZmluZSBTSE9SVF9UT19GTE9BVF9URVgoUykgICAgKChTKSA9PSAtMzI3NjggPyAtMS4wRiA6IChTKSAqICgxLjBGLzMyNzY3LjBGKSkKKworLyoqIENvbnZlcnQgR0xmbG9hdCBpbiBbLTEuMCwxLjBdIHRvIEdMc2hvcnQgaW4gWy0zMjc2OCwzMjc2N10sIHRleHR1cmUvZmIgZGF0YSAqLworI2RlZmluZSBGTE9BVF9UT19TSE9SVF9URVgoWCkgICAgKCAoR0xpbnQpICgzMjc2Ny4wRiAqIChYKSkgKQorCisKKy8qKiBDb252ZXJ0IEdMdWludCBpbiBbMCw0Mjk0OTY3Mjk1XSB0byBHTGZsb2F0IGluIFswLjAsMS4wXSAqLworI2RlZmluZSBVSU5UX1RPX0ZMT0FUKFUpICAgICgoR0xmbG9hdCkgKChVKSAqICgxLjBGIC8gNDI5NDk2NzI5NS4wKSkpCisKKy8qKiBDb252ZXJ0IEdMZmxvYXQgaW4gWzAuMCwxLjBdIHRvIEdMdWludCBpbiBbMCw0Mjk0OTY3Mjk1XSAqLworI2RlZmluZSBGTE9BVF9UT19VSU5UKFgpICAgICgoR0x1aW50KSAoKFgpICogNDI5NDk2NzI5NS4wKSkKKworCisvKiogQ29udmVydCBHTGludCBpbiBbLTIxNDc0ODM2NDgsMjE0NzQ4MzY0N10gdG8gR0xmbG9hdCBpbiBbLTEuMCwxLjBdICovCisjZGVmaW5lIElOVF9UT19GTE9BVChJKSAgICAgKChHTGZsb2F0KSAoKDIuMEYgKiAoSSkgKyAxLjBGKSAqICgxLjBGLzQyOTQ5NjcyOTQuMCkpKQorCisvKiogQ29udmVydCBHTGZsb2F0IGluIFstMS4wLDEuMF0gdG8gR0xpbnQgaW4gWy0yMTQ3NDgzNjQ4LDIxNDc0ODM2NDddICovCisvKiBjYXVzZXMgb3ZlcmZsb3c6CisjZGVmaW5lIEZMT0FUX1RPX0lOVChYKSAgICAgKCAoKChHTGludCkgKDQyOTQ5NjcyOTQuMCAqIChYKSkpIC0gMSkgLyAyICkKKyovCisvKiBhIGNsb3NlIGFwcHJveGltYXRpb246ICovCisjZGVmaW5lIEZMT0FUX1RPX0lOVChYKSAgICAgKCAoR0xpbnQpICgyMTQ3NDgzNjQ3LjAgKiAoWCkpICkKKworLyoqIENvbnZlcnQgR0xmbG9hdCBpbiBbLTEuMCwxLjBdIHRvIEdMaW50NjQgaW4gWy0oMTw8NjMpLCgxIDw8IDYzKSAtMV0gKi8KKyNkZWZpbmUgRkxPQVRfVE9fSU5UNjQoWCkgICAgICggKEdMaW50NjQpICg5MjIzMzcyMDM2ODU0Nzc1ODA3LjAgKiAoZG91YmxlKShYKSkgKQorCisKKy8qKiBDb252ZXJ0IEdMaW50IGluIFstMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ3XSB0byBHTGZsb2F0IGluIFstMS4wLDEuMF0sIHRleHR1cmUvZmIgZGF0YSAqLworI2RlZmluZSBJTlRfVE9fRkxPQVRfVEVYKEkpICAgICgoSSkgPT0gLTIxNDc0ODM2NDggPyAtMS4wRiA6IChJKSAqICgxLjBGLzIxNDc0ODM2NDcuMCkpCisKKy8qKiBDb252ZXJ0IEdMZmxvYXQgaW4gWy0xLjAsMS4wXSB0byBHTGludCBpbiBbLTIxNDc0ODM2NDgsMjE0NzQ4MzY0N10sIHRleHR1cmUvZmIgZGF0YSAqLworI2RlZmluZSBGTE9BVF9UT19JTlRfVEVYKFgpICAgICggKEdMaW50KSAoMjE0NzQ4MzY0Ny4wICogKFgpKSApCisKKworI2RlZmluZSBCWVRFX1RPX1VCWVRFKGIpICAgKChHTHVieXRlKSAoKGIpIDwgMCA/IDAgOiAoR0x1Ynl0ZSkgKGIpKSkKKyNkZWZpbmUgU0hPUlRfVE9fVUJZVEUocykgICgoR0x1Ynl0ZSkgKChzKSA8IDAgPyAwIDogKEdMdWJ5dGUpICgocykgPj4gNykpKQorI2RlZmluZSBVU0hPUlRfVE9fVUJZVEUocykgKChHTHVieXRlKSAoKHMpID4+IDgpKQorI2RlZmluZSBJTlRfVE9fVUJZVEUoaSkgICAgKChHTHVieXRlKSAoKGkpIDwgMCA/IDAgOiAoR0x1Ynl0ZSkgKChpKSA+PiAyMykpKQorI2RlZmluZSBVSU5UX1RPX1VCWVRFKGkpICAgKChHTHVieXRlKSAoKGkpID4+IDI0KSkKKworCisjZGVmaW5lIEJZVEVfVE9fVVNIT1JUKGIpICAoKGIpIDwgMCA/IDAgOiAoKEdMdXNob3J0KSAoKChiKSAqIDY1NTM1KSAvIDI1NSkpKQorI2RlZmluZSBVQllURV9UT19VU0hPUlQoYikgKCgoR0x1c2hvcnQpIChiKSA8PCA4KSB8IChHTHVzaG9ydCkgKGIpKQorI2RlZmluZSBTSE9SVF9UT19VU0hPUlQocykgKChzKSA8IDAgPyAwIDogKChHTHVzaG9ydCkgKCgocykgKiA2NTUzNSAvIDMyNzY3KSkpKQorI2RlZmluZSBJTlRfVE9fVVNIT1JUKGkpICAgKChpKSA8IDAgPyAwIDogKChHTHVzaG9ydCkgKChpKSA+PiAxNSkpKQorI2RlZmluZSBVSU5UX1RPX1VTSE9SVChpKSAgKChpKSA8IDAgPyAwIDogKChHTHVzaG9ydCkgKChpKSA+PiAxNikpKQorI2RlZmluZSBVTkNMQU1QRURfRkxPQVRfVE9fVVNIT1JUKHVzLCBmKSAgXAorICAgICAgICB1cyA9ICggKEdMdXNob3J0KSBGX1RPX0koIENMQU1QKChmKSwgMC4wRiwgMS4wRikgKiA2NTUzNS4wRikgKQorI2RlZmluZSBDTEFNUEVEX0ZMT0FUX1RPX1VTSE9SVCh1cywgZikgIFwKKyAgICAgICAgdXMgPSAoIChHTHVzaG9ydCkgRl9UT19JKCAoZikgKiA2NTUzNS4wRikgKQorCisjZGVmaW5lIFVOQ0xBTVBFRF9GTE9BVF9UT19TSE9SVChzLCBmKSAgXAorICAgICAgICBzID0gKCAoR0xzaG9ydCkgRl9UT19JKCBDTEFNUCgoZiksIC0xLjBGLCAxLjBGKSAqIDMyNzY3LjBGKSApCisKKy8qKioKKyAqKiogVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFOiBjbGFtcCBmbG9hdCB0byBbMCwxXSBhbmQgbWFwIHRvIHVieXRlIGluIFswLDI1NV0KKyAqKiogQ0xBTVBFRF9GTE9BVF9UT19VQllURTogbWFwIGZsb2F0IGtub3duIHRvIGJlIGluIFswLDFdIHRvIHVieXRlIGluIFswLDI1NV0KKyAqKiovCisjaWYgZGVmaW5lZChVU0VfSUVFRSkgJiYgIWRlZmluZWQoREVCVUcpCisvKiBUaGlzIGZ1bmN0aW9uL21hY3JvIGlzIHNlbnNpdGl2ZSB0byBwcmVjaXNpb24uICBUZXN0IHZlcnkgY2FyZWZ1bGx5CisgKiBpZiB5b3UgY2hhbmdlIGl0IQorICovCisjZGVmaW5lIFVOQ0xBTVBFRF9GTE9BVF9UT19VQllURShVQiwgRikJCQkJCVwKKyAgICAgICAgZG8gewkJCQkJCQkJXAorICAgICAgICAgICBmaV90eXBlIF9fdG1wOwkJCQkJCVwKKyAgICAgICAgICAgX190bXAuZiA9IChGKTsJCQkJCQlcCisgICAgICAgICAgIGlmIChfX3RtcC5pIDwgMCkJCQkJCQlcCisgICAgICAgICAgICAgIFVCID0gKEdMdWJ5dGUpIDA7CQkJCQkJXAorICAgICAgICAgICBlbHNlIGlmIChfX3RtcC5pID49IElFRUVfT05FKQkJCQlcCisgICAgICAgICAgICAgIFVCID0gKEdMdWJ5dGUpIDI1NTsJCQkJCVwKKyAgICAgICAgICAgZWxzZSB7CQkJCQkJCVwKKyAgICAgICAgICAgICAgX190bXAuZiA9IF9fdG1wLmYgKiAoMjU1LjBGLzI1Ni4wRikgKyAzMjc2OC4wRjsJCVwKKyAgICAgICAgICAgICAgVUIgPSAoR0x1Ynl0ZSkgX190bXAuaTsJCQkJCVwKKyAgICAgICAgICAgfQkJCQkJCQkJXAorICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBDTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKFVCLCBGKQkJCQkJXAorICAgICAgICBkbyB7CQkJCQkJCQlcCisgICAgICAgICAgIGZpX3R5cGUgX190bXA7CQkJCQkJXAorICAgICAgICAgICBfX3RtcC5mID0gKEYpICogKDI1NS4wRi8yNTYuMEYpICsgMzI3NjguMEY7CQkJXAorICAgICAgICAgICBVQiA9IChHTHVieXRlKSBfX3RtcC5pOwkJCQkJXAorICAgICAgICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgVU5DTEFNUEVEX0ZMT0FUX1RPX1VCWVRFKHViLCBmKSBcCisJdWIgPSAoKEdMdWJ5dGUpIEZfVE9fSShDTEFNUCgoZiksIDAuMEYsIDEuMEYpICogMjU1LjBGKSkKKyNkZWZpbmUgQ0xBTVBFRF9GTE9BVF9UT19VQllURSh1YiwgZikgXAorCXViID0gKChHTHVieXRlKSBGX1RPX0koKGYpICogMjU1LjBGKSkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIEdMZmxvYXQgSU5UX0FTX0ZMVChHTGludCBpKQoreworICAgZmlfdHlwZSB0bXA7CisgICB0bXAuaSA9IGk7CisgICByZXR1cm4gdG1wLmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgR0xmbG9hdCBVSU5UX0FTX0ZMVChHTHVpbnQgdSkKK3sKKyAgIGZpX3R5cGUgdG1wOworICAgdG1wLnUgPSB1OworICAgcmV0dXJuIHRtcC5mOworfQorCisvKioKKyAqIENvbnZlcnQgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBhbiB1bnNpZ25lZCBmaXhlZCBwb2ludCB2YWx1ZS4KKyAqCisgKiBccGFyYW0gZnJhY19iaXRzICAgVGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3RvcmUgdGhlIGZyYWN0aW9uYWwgcGFydC4KKyAqLworc3RhdGljIElOTElORSB1aW50MzJfdAorVV9GSVhFRChmbG9hdCB2YWx1ZSwgdWludDMyX3QgZnJhY19iaXRzKQoreworICAgdmFsdWUgKj0gKDEgPDwgZnJhY19iaXRzKTsKKyAgIHJldHVybiB2YWx1ZSA8IDAuMGYgPyAwIDogKHVpbnQzMl90KSB2YWx1ZTsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gYW4gc2lnbmVkIGZpeGVkIHBvaW50IHZhbHVlLgorICoKKyAqIFxwYXJhbSBmcmFjX2JpdHMgICBUaGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzdG9yZSB0aGUgZnJhY3Rpb25hbCBwYXJ0LgorICovCitzdGF0aWMgSU5MSU5FIGludDMyX3QKK1NfRklYRUQoZmxvYXQgdmFsdWUsIHVpbnQzMl90IGZyYWNfYml0cykKK3sKKyAgIHJldHVybiAoaW50MzJfdCkgKHZhbHVlICogKDEgPDwgZnJhY19iaXRzKSk7Cit9CisvKkB9Ki8KKworCisvKiogU3RlcHBpbmcgYSBHTGZsb2F0IHBvaW50ZXIgYnkgYSBieXRlIHN0cmlkZSAqLworI2RlZmluZSBTVFJJREVfRihwLCBpKSAgKHAgPSAoR0xmbG9hdCAqKSgoR0x1Ynl0ZSAqKXAgKyBpKSkKKy8qKiBTdGVwcGluZyBhIEdMdWludCBwb2ludGVyIGJ5IGEgYnl0ZSBzdHJpZGUgKi8KKyNkZWZpbmUgU1RSSURFX1VJKHAsIGkpICAocCA9IChHTHVpbnQgKikoKEdMdWJ5dGUgKilwICsgaSkpCisvKiogU3RlcHBpbmcgYSBHTHVieXRlWzRdIHBvaW50ZXIgYnkgYSBieXRlIHN0cmlkZSAqLworI2RlZmluZSBTVFJJREVfNFVCKHAsIGkpICAocCA9IChHTHVieXRlICgqKVs0XSkoKEdMdWJ5dGUgKilwICsgaSkpCisvKiogU3RlcHBpbmcgYSBHTGZsb2F0WzRdIHBvaW50ZXIgYnkgYSBieXRlIHN0cmlkZSAqLworI2RlZmluZSBTVFJJREVfNEYocCwgaSkgIChwID0gKEdMZmxvYXQgKCopWzRdKSgoR0x1Ynl0ZSAqKXAgKyBpKSkKKy8qKiBTdGVwcGluZyBhIFxwIHQgcG9pbnRlciBieSBhIGJ5dGUgc3RyaWRlICovCisjZGVmaW5lIFNUUklERV9UKHAsIHQsIGkpICAocCA9ICh0KSgoR0x1Ynl0ZSAqKXAgKyBpKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSA0LWVsZW1lbnQgdmVjdG9yIG9wZXJhdGlvbnMgKi8KKy8qQHsqLworCisvKiogWmVybyAqLworI2RlZmluZSBaRVJPXzRWKCBEU1QgKSAgKERTVClbMF0gPSAoRFNUKVsxXSA9IChEU1QpWzJdID0gKERTVClbM10gPSAwCisKKy8qKiBUZXN0IGZvciBlcXVhbGl0eSAqLworI2RlZmluZSBURVNUX0VRXzRWKGEsYikgICgoYSlbMF0gPT0gKGIpWzBdICYmICAgXAorICAgICAgICAgICAgICAoYSlbMV0gPT0gKGIpWzFdICYmICAgXAorICAgICAgICAgICAgICAoYSlbMl0gPT0gKGIpWzJdICYmICAgXAorICAgICAgICAgICAgICAoYSlbM10gPT0gKGIpWzNdKQorCisvKiogVGVzdCBmb3IgZXF1YWxpdHkgKHVuc2lnbmVkIGJ5dGVzKSAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK1RFU1RfRVFfNFVCVihjb25zdCBHTHVieXRlIGFbNF0sIGNvbnN0IEdMdWJ5dGUgYls0XSkKK3sKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorICAgcmV0dXJuICooKGNvbnN0IEdMdWludCAqKSBhKSA9PSAqKChjb25zdCBHTHVpbnQgKikgYik7CisjZWxzZQorICAgcmV0dXJuIFRFU1RfRVFfNFYoYSwgYik7CisjZW5kaWYKK30KKworCisvKiogQ29weSBhIDQtZWxlbWVudCB2ZWN0b3IgKi8KKyNkZWZpbmUgQ09QWV80ViggRFNULCBTUkMgKSAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChEU1QpWzBdID0gKFNSQylbMF07ICAgICAgICAgICAgIFwKKyAgIChEU1QpWzFdID0gKFNSQylbMV07ICAgICAgICAgICAgIFwKKyAgIChEU1QpWzJdID0gKFNSQylbMl07ICAgICAgICAgICAgIFwKKyAgIChEU1QpWzNdID0gKFNSQylbM107ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBDb3B5IGEgNC1lbGVtZW50IHVuc2lnbmVkIGJ5dGUgdmVjdG9yICovCitzdGF0aWMgaW5saW5lIHZvaWQKK0NPUFlfNFVCVihHTHVieXRlIGRzdFs0XSwgY29uc3QgR0x1Ynl0ZSBzcmNbNF0pCit7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKyAgICooKEdMdWludCAqKSBkc3QpID0gKigoR0x1aW50ICopIHNyYyk7CisjZWxzZQorICAgLyogVGhlIEdMdWludCBjYXN0IG1pZ2h0IGZhaWwgaWYgRFNUIG9yIFNSQyBhcmUgbm90IGR3b3JkLWFsaWduZWQgKFJJU0MpICovCisgICBDT1BZXzRWKGRzdCwgc3JjKTsKKyNlbmRpZgorfQorCisvKiogQ29weSBhIDQtZWxlbWVudCBmbG9hdCB2ZWN0b3IgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorQ09QWV80RlYoR0xmbG9hdCBkc3RbNF0sIGNvbnN0IEdMZmxvYXQgc3JjWzRdKQoreworICAgLyogbWVtY3B5IHNlZW1zIHRvIGJlIG1vc3QgZWZmaWNpZW50ICovCisgICBtZW1jcHkoZHN0LCBzcmMsIHNpemVvZihHTGZsb2F0KSAqIDQpOworfQorCisvKiogQ29weSBccCBTWiBlbGVtZW50cyBpbnRvIGEgNC1lbGVtZW50IHZlY3RvciAqLworI2RlZmluZSBDT1BZX1NaXzRWKERTVCwgU1osIFNSQykgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBzd2l0Y2ggKFNaKSB7ICAgICAgICAgICAgICAgICAgXAorICAgY2FzZSA0OiAoRFNUKVszXSA9IChTUkMpWzNdOyAgIFwKKyAgIGNhc2UgMzogKERTVClbMl0gPSAoU1JDKVsyXTsgICBcCisgICBjYXNlIDI6IChEU1QpWzFdID0gKFNSQylbMV07ICAgXAorICAgY2FzZSAxOiAoRFNUKVswXSA9IChTUkMpWzBdOyAgIFwKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKy8qKiBDb3B5IFxwIFNaIGVsZW1lbnRzIGludG8gYSBob21lZ2VuZW91cyAoNC1lbGVtZW50KSB2ZWN0b3IsIGdpdmluZworICogZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIHJlbWFpbmluZyAqLworI2RlZmluZSBDT1BZX0NMRUFOXzRWKERTVCwgU1osIFNSQykgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBU1NJR05fNFYoIERTVCwgMCwgMCwgMCwgMSApOyAgXAorICAgICAgQ09QWV9TWl80ViggRFNULCBTWiwgU1JDICk7ICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBTdWJ0cmFjdGlvbiAqLworI2RlZmluZSBTVUJfNFYoIERTVCwgU1JDQSwgU1JDQiApICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdID0gKFNSQ0EpWzBdIC0gKFNSQ0IpWzBdOyAgICAgXAorICAgICAgKERTVClbMV0gPSAoU1JDQSlbMV0gLSAoU1JDQilbMV07ICAgICBcCisgICAgICAoRFNUKVsyXSA9IChTUkNBKVsyXSAtIChTUkNCKVsyXTsgICAgIFwKKyAgICAgIChEU1QpWzNdID0gKFNSQ0EpWzNdIC0gKFNSQ0IpWzNdOyAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIEFkZGl0aW9uICovCisjZGVmaW5lIEFERF80ViggRFNULCBTUkNBLCBTUkNCICkgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gPSAoU1JDQSlbMF0gKyAoU1JDQilbMF07ICAgICBcCisgICAgICAoRFNUKVsxXSA9IChTUkNBKVsxXSArIChTUkNCKVsxXTsgICAgIFwKKyAgICAgIChEU1QpWzJdID0gKFNSQ0EpWzJdICsgKFNSQ0IpWzJdOyAgICAgXAorICAgICAgKERTVClbM10gPSAoU1JDQSlbM10gKyAoU1JDQilbM107ICAgICBcCit9IHdoaWxlICgwKQorCisvKiogRWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uICovCisjZGVmaW5lIFNDQUxFXzRWKCBEU1QsIFNSQ0EsIFNSQ0IgKSAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gPSAoU1JDQSlbMF0gKiAoU1JDQilbMF07ICAgICBcCisgICAgICAoRFNUKVsxXSA9IChTUkNBKVsxXSAqIChTUkNCKVsxXTsgICAgIFwKKyAgICAgIChEU1QpWzJdID0gKFNSQ0EpWzJdICogKFNSQ0IpWzJdOyAgICAgXAorICAgICAgKERTVClbM10gPSAoU1JDQSlbM10gKiAoU1JDQilbM107ICAgICBcCit9IHdoaWxlICgwKQorCisvKiogSW4tcGxhY2UgYWRkaXRpb24gKi8KKyNkZWZpbmUgQUNDXzRWKCBEU1QsIFNSQyApICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICs9IChTUkMpWzBdOyAgICAgICAgIFwKKyAgICAgIChEU1QpWzFdICs9IChTUkMpWzFdOyAgICAgICAgIFwKKyAgICAgIChEU1QpWzJdICs9IChTUkMpWzJdOyAgICAgICAgIFwKKyAgICAgIChEU1QpWzNdICs9IChTUkMpWzNdOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBFbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uICovCisjZGVmaW5lIEFDQ19TQ0FMRV80ViggRFNULCBTUkNBLCBTUkNCICkgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gKz0gKFNSQ0EpWzBdICogKFNSQ0IpWzBdOyAgICBcCisgICAgICAoRFNUKVsxXSArPSAoU1JDQSlbMV0gKiAoU1JDQilbMV07ICAgIFwKKyAgICAgIChEU1QpWzJdICs9IChTUkNBKVsyXSAqIChTUkNCKVsyXTsgICAgXAorICAgICAgKERTVClbM10gKz0gKFNSQ0EpWzNdICogKFNSQ0IpWzNdOyAgICBcCit9IHdoaWxlICgwKQorCisvKiogSW4tcGxhY2Ugc2NhbGFyIG11bHRpcGxpY2F0aW9uIGFuZCBhZGRpdGlvbiAqLworI2RlZmluZSBBQ0NfU0NBTEVfU0NBTEFSXzRWKCBEU1QsIFMsIFNSQ0IgKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICs9IFMgKiAoU1JDQilbMF07ICAgICAgICAgICAgXAorICAgICAgKERTVClbMV0gKz0gUyAqIChTUkNCKVsxXTsgICAgICAgICAgICBcCisgICAgICAoRFNUKVsyXSArPSBTICogKFNSQ0IpWzJdOyAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzNdICs9IFMgKiAoU1JDQilbM107ICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIFNjYWxhciBtdWx0aXBsaWNhdGlvbiAqLworI2RlZmluZSBTQ0FMRV9TQ0FMQVJfNFYoIERTVCwgUywgU1JDQiApIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSA9IFMgKiAoU1JDQilbMF07ICAgICAgICAgXAorICAgICAgKERTVClbMV0gPSBTICogKFNSQ0IpWzFdOyAgICAgICAgIFwKKyAgICAgIChEU1QpWzJdID0gUyAqIChTUkNCKVsyXTsgICAgICAgICBcCisgICAgICAoRFNUKVszXSA9IFMgKiAoU1JDQilbM107ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIEluLXBsYWNlIHNjYWxhciBtdWx0aXBsaWNhdGlvbiAqLworI2RlZmluZSBTRUxGX1NDQUxFX1NDQUxBUl80ViggRFNULCBTICkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gKj0gUzsgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMV0gKj0gUzsgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMl0gKj0gUzsgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbM10gKj0gUzsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUgQVNTSUdOXzRWKCBWLCBWMCwgVjEsIFYyLCBWMyApICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZbMF0gPSBWMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWWzFdID0gVjE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlsyXSA9IFYyOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZbM10gPSBWMzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworLypAfSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgMy1lbGVtZW50IHZlY3RvciBvcGVyYXRpb25zKi8KKy8qQHsqLworCisvKiogWmVybyAqLworI2RlZmluZSBaRVJPXzNWKCBEU1QgKSAgKERTVClbMF0gPSAoRFNUKVsxXSA9IChEU1QpWzJdID0gMAorCisvKiogVGVzdCBmb3IgZXF1YWxpdHkgKi8KKyNkZWZpbmUgVEVTVF9FUV8zVihhLGIpICBcCisgICAoKGEpWzBdID09IChiKVswXSAmJiAgXAorICAgIChhKVsxXSA9PSAoYilbMV0gJiYgIFwKKyAgICAoYSlbMl0gPT0gKGIpWzJdKQorCisvKiogQ29weSBhIDMtZWxlbWVudCB2ZWN0b3IgKi8KKyNkZWZpbmUgQ09QWV8zViggRFNULCBTUkMgKSAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChEU1QpWzBdID0gKFNSQylbMF07ICAgICAgICAgICAgIFwKKyAgIChEU1QpWzFdID0gKFNSQylbMV07ICAgICAgICAgICAgIFwKKyAgIChEU1QpWzJdID0gKFNSQylbMl07ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBDb3B5IGEgMy1lbGVtZW50IHZlY3RvciB3aXRoIGNhc3QgKi8KKyNkZWZpbmUgQ09QWV8zVl9DQVNUKCBEU1QsIFNSQywgQ0FTVCApICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKERTVClbMF0gPSAoQ0FTVCkoU1JDKVswXTsgICAgICAgICAgIFwKKyAgIChEU1QpWzFdID0gKENBU1QpKFNSQylbMV07ICAgICAgICAgICBcCisgICAoRFNUKVsyXSA9IChDQVNUKShTUkMpWzJdOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIENvcHkgYSAzLWVsZW1lbnQgZmxvYXQgdmVjdG9yICovCisjZGVmaW5lIENPUFlfM0ZWKCBEU1QsIFNSQyApICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBjb25zdCBHTGZsb2F0ICpfdG1wID0gKFNSQyk7ICAgICBcCisgICAoRFNUKVswXSA9IF90bXBbMF07ICAgICAgICAgICAgICBcCisgICAoRFNUKVsxXSA9IF90bXBbMV07ICAgICAgICAgICAgICBcCisgICAoRFNUKVsyXSA9IF90bXBbMl07ICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiogU3VidHJhY3Rpb24gKi8KKyNkZWZpbmUgU1VCXzNWKCBEU1QsIFNSQ0EsIFNSQ0IgKSAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSA9IChTUkNBKVswXSAtIChTUkNCKVswXTsgIFwKKyAgICAgIChEU1QpWzFdID0gKFNSQ0EpWzFdIC0gKFNSQ0IpWzFdOyAgXAorICAgICAgKERTVClbMl0gPSAoU1JDQSlbMl0gLSAoU1JDQilbMl07ICBcCit9IHdoaWxlICgwKQorCisvKiogQWRkaXRpb24gKi8KKyNkZWZpbmUgQUREXzNWKCBEU1QsIFNSQ0EsIFNSQ0IgKSAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gPSAoU1JDQSlbMF0gKyAoU1JDQilbMF07IFwKKyAgICAgIChEU1QpWzFdID0gKFNSQ0EpWzFdICsgKFNSQ0IpWzFdOyBcCisgICAgICAoRFNUKVsyXSA9IChTUkNBKVsyXSArIChTUkNCKVsyXTsgXAorfSB3aGlsZSAoMCkKKworLyoqIEluLXBsYWNlIHNjYWxhciBtdWx0aXBsaWNhdGlvbiAqLworI2RlZmluZSBTQ0FMRV8zViggRFNULCBTUkNBLCBTUkNCICkgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSA9IChTUkNBKVswXSAqIChTUkNCKVswXTsgXAorICAgICAgKERTVClbMV0gPSAoU1JDQSlbMV0gKiAoU1JDQilbMV07IFwKKyAgICAgIChEU1QpWzJdID0gKFNSQ0EpWzJdICogKFNSQ0IpWzJdOyBcCit9IHdoaWxlICgwKQorCisvKiogSW4tcGxhY2UgZWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uICovCisjZGVmaW5lIFNFTEZfU0NBTEVfM1YoIERTVCwgU1JDICkgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSAqPSAoU1JDKVswXTsgICAgICAgICBcCisgICAgICAoRFNUKVsxXSAqPSAoU1JDKVsxXTsgICAgICAgICBcCisgICAgICAoRFNUKVsyXSAqPSAoU1JDKVsyXTsgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiogSW4tcGxhY2UgYWRkaXRpb24gKi8KKyNkZWZpbmUgQUNDXzNWKCBEU1QsIFNSQyApICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICs9IChTUkMpWzBdOyAgICAgICAgIFwKKyAgICAgIChEU1QpWzFdICs9IChTUkMpWzFdOyAgICAgICAgIFwKKyAgICAgIChEU1QpWzJdICs9IChTUkMpWzJdOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBFbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uICovCisjZGVmaW5lIEFDQ19TQ0FMRV8zViggRFNULCBTUkNBLCBTUkNCICkgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gKz0gKFNSQ0EpWzBdICogKFNSQ0IpWzBdOyAgICBcCisgICAgICAoRFNUKVsxXSArPSAoU1JDQSlbMV0gKiAoU1JDQilbMV07ICAgIFwKKyAgICAgIChEU1QpWzJdICs9IChTUkNBKVsyXSAqIChTUkNCKVsyXTsgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIFNjYWxhciBtdWx0aXBsaWNhdGlvbiAqLworI2RlZmluZSBTQ0FMRV9TQ0FMQVJfM1YoIERTVCwgUywgU1JDQiApIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSA9IFMgKiAoU1JDQilbMF07ICAgICAgICAgXAorICAgICAgKERTVClbMV0gPSBTICogKFNSQ0IpWzFdOyAgICAgICAgIFwKKyAgICAgIChEU1QpWzJdID0gUyAqIChTUkNCKVsyXTsgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiogSW4tcGxhY2Ugc2NhbGFyIG11bHRpcGxpY2F0aW9uIGFuZCBhZGRpdGlvbiAqLworI2RlZmluZSBBQ0NfU0NBTEVfU0NBTEFSXzNWKCBEU1QsIFMsIFNSQ0IgKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICs9IFMgKiAoU1JDQilbMF07ICAgICAgICAgICAgXAorICAgICAgKERTVClbMV0gKz0gUyAqIChTUkNCKVsxXTsgICAgICAgICAgICBcCisgICAgICAoRFNUKVsyXSArPSBTICogKFNSQ0IpWzJdOyAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBJbi1wbGFjZSBzY2FsYXIgbXVsdGlwbGljYXRpb24gKi8KKyNkZWZpbmUgU0VMRl9TQ0FMRV9TQ0FMQVJfM1YoIERTVCwgUyApIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICo9IFM7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzFdICo9IFM7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzJdICo9IFM7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBJbi1wbGFjZSBzY2FsYXIgYWRkaXRpb24gKi8KKyNkZWZpbmUgQUNDX1NDQUxBUl8zViggRFNULCBTICkgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICs9IFM7ICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzFdICs9IFM7ICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzJdICs9IFM7ICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBBc3NpZ25tZW50ICovCisjZGVmaW5lIEFTU0lHTl8zViggViwgVjAsIFYxLCBWMiApICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlswXSA9IFYwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlsxXSA9IFYxOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlsyXSA9IFYyOyAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKy8qQH0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIDItZWxlbWVudCB2ZWN0b3Igb3BlcmF0aW9ucyovCisvKkB7Ki8KKworLyoqIFplcm8gKi8KKyNkZWZpbmUgWkVST18yViggRFNUICkgIChEU1QpWzBdID0gKERTVClbMV0gPSAwCisKKy8qKiBDb3B5IGEgMi1lbGVtZW50IHZlY3RvciAqLworI2RlZmluZSBDT1BZXzJWKCBEU1QsIFNSQyApICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChEU1QpWzBdID0gKFNSQylbMF07ICAgICAgICAgICAgIFwKKyAgIChEU1QpWzFdID0gKFNSQylbMV07ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBDb3B5IGEgMi1lbGVtZW50IHZlY3RvciB3aXRoIGNhc3QgKi8KKyNkZWZpbmUgQ09QWV8yVl9DQVNUKCBEU1QsIFNSQywgQ0FTVCApICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChEU1QpWzBdID0gKENBU1QpKFNSQylbMF07ICAgICAgICAgICBcCisgICAoRFNUKVsxXSA9IChDQVNUKShTUkMpWzFdOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIENvcHkgYSAyLWVsZW1lbnQgZmxvYXQgdmVjdG9yICovCisjZGVmaW5lIENPUFlfMkZWKCBEU1QsIFNSQyApICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGNvbnN0IEdMZmxvYXQgKl90bXAgPSAoU1JDKTsgICAgICAgICBcCisgICAoRFNUKVswXSA9IF90bXBbMF07ICAgICAgICAgICAgICBcCisgICAoRFNUKVsxXSA9IF90bXBbMV07ICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiogU3VidHJhY3Rpb24gKi8KKyNkZWZpbmUgU1VCXzJWKCBEU1QsIFNSQ0EsIFNSQ0IgKSAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gPSAoU1JDQSlbMF0gLSAoU1JDQilbMF07ICAgICBcCisgICAgICAoRFNUKVsxXSA9IChTUkNBKVsxXSAtIChTUkNCKVsxXTsgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBBZGRpdGlvbiAqLworI2RlZmluZSBBRERfMlYoIERTVCwgU1JDQSwgU1JDQiApICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSA9IChTUkNBKVswXSArIChTUkNCKVswXTsgICAgIFwKKyAgICAgIChEU1QpWzFdID0gKFNSQ0EpWzFdICsgKFNSQ0IpWzFdOyAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIEluLXBsYWNlIHNjYWxhciBtdWx0aXBsaWNhdGlvbiAqLworI2RlZmluZSBTQ0FMRV8yViggRFNULCBTUkNBLCBTUkNCICkgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSA9IChTUkNBKVswXSAqIChTUkNCKVswXTsgICAgIFwKKyAgICAgIChEU1QpWzFdID0gKFNSQ0EpWzFdICogKFNSQ0IpWzFdOyAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIEluLXBsYWNlIGFkZGl0aW9uICovCisjZGVmaW5lIEFDQ18yViggRFNULCBTUkMgKSAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gKz0gKFNSQylbMF07ICAgICAgICAgXAorICAgICAgKERTVClbMV0gKz0gKFNSQylbMV07ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIEVsZW1lbnQtd2lzZSBtdWx0aXBsaWNhdGlvbiBhbmQgYWRkaXRpb24gKi8KKyNkZWZpbmUgQUNDX1NDQUxFXzJWKCBEU1QsIFNSQ0EsIFNSQ0IgKSAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICs9IChTUkNBKVswXSAqIChTUkNCKVswXTsgICAgXAorICAgICAgKERTVClbMV0gKz0gKFNSQ0EpWzFdICogKFNSQ0IpWzFdOyAgICBcCit9IHdoaWxlICgwKQorCisvKiogU2NhbGFyIG11bHRpcGxpY2F0aW9uICovCisjZGVmaW5lIFNDQUxFX1NDQUxBUl8yViggRFNULCBTLCBTUkNCICkgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSA9IFMgKiAoU1JDQilbMF07ICAgICAgICAgXAorICAgICAgKERTVClbMV0gPSBTICogKFNSQ0IpWzFdOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBJbi1wbGFjZSBzY2FsYXIgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uICovCisjZGVmaW5lIEFDQ19TQ0FMRV9TQ0FMQVJfMlYoIERTVCwgUywgU1JDQiApIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoRFNUKVswXSArPSBTICogKFNSQ0IpWzBdOyAgICAgICAgXAorICAgICAgKERTVClbMV0gKz0gUyAqIChTUkNCKVsxXTsgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBJbi1wbGFjZSBzY2FsYXIgbXVsdGlwbGljYXRpb24gKi8KKyNkZWZpbmUgU0VMRl9TQ0FMRV9TQ0FMQVJfMlYoIERTVCwgUyApICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzBdICo9IFM7ICAgICAgICAgICAgICAgIFwKKyAgICAgIChEU1QpWzFdICo9IFM7ICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKiBJbi1wbGFjZSBzY2FsYXIgYWRkaXRpb24gKi8KKyNkZWZpbmUgQUNDX1NDQUxBUl8yViggRFNULCBTICkgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMF0gKz0gUzsgICAgICAgICAgICAgICAgXAorICAgICAgKERTVClbMV0gKz0gUzsgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyoqIEFzc2lnbiBzY2FsZXJzIHRvIHNob3J0IHZlY3RvcnMgKi8KKyNkZWZpbmUgQVNTSUdOXzJWKCBWLCBWMCwgVjEgKQlcCitkbyB7CQkJCVwKKyAgICBWWzBdID0gVjA7CQkJXAorICAgIFZbMV0gPSBWMTsJCQlcCit9IHdoaWxlKDApCisKKy8qQH0qLworCisvKiogQ29weSBccCBzeiBlbGVtZW50cyBpbnRvIGEgaG9tZWdlbmVvdXMgKDQtZWxlbWVudCkgdmVjdG9yLCBnaXZpbmcKKyAqIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSByZW1haW5pbmcgY29tcG9uZW50cy4KKyAqIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGJhc2VkIG9uIFxwIHR5cGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorQ09QWV9DTEVBTl80Vl9UWVBFX0FTX0ZMT0FUKEdMZmxvYXQgZHN0WzRdLCBpbnQgc3osIGNvbnN0IEdMZmxvYXQgc3JjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlKQoreworICAgc3dpdGNoICh0eXBlKSB7CisgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgQVNTSUdOXzRWKGRzdCwgMCwgMCwgMCwgMSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xfSU5UOgorICAgICAgQVNTSUdOXzRWKGRzdCwgSU5UX0FTX0ZMVCgwKSwgSU5UX0FTX0ZMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIElOVF9BU19GTFQoMCksIElOVF9BU19GTFQoMSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKKyAgICAgIEFTU0lHTl80Vihkc3QsIFVJTlRfQVNfRkxUKDApLCBVSU5UX0FTX0ZMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIFVJTlRfQVNfRkxUKDApLCBVSU5UX0FTX0ZMVCgxKSk7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBBU1NJR05fNFYoZHN0LCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsgLyogc2lsZW5jZSB3YXJuaW5ncyAqLworICAgICAgQVNTRVJUKCEiVW5leHBlY3RlZCB0eXBlIGluIENPUFlfQ0xFQU5fNFZfVFlQRV9BU19GTE9BVCBtYWNybyIpOworICAgfQorICAgQ09QWV9TWl80Vihkc3QsIHN6LCBzcmMpOworfQorCisvKiogXG5hbWUgTGluZWFyIGludGVycG9sYXRpb24gZnVuY3Rpb25zICovCisvKkB7Ki8KKworc3RhdGljIGlubGluZSBHTGZsb2F0CitMSU5URVJQKEdMZmxvYXQgdCwgR0xmbG9hdCBvdXQsIEdMZmxvYXQgaW4pCit7CisgICByZXR1cm4gb3V0ICsgdCAqIChpbiAtIG91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorSU5URVJQXzNGKEdMZmxvYXQgdCwgR0xmbG9hdCBkc3RbM10sIGNvbnN0IEdMZmxvYXQgb3V0WzNdLCBjb25zdCBHTGZsb2F0IGluWzNdKQoreworICAgZHN0WzBdID0gTElOVEVSUCggdCwgb3V0WzBdLCBpblswXSApOworICAgZHN0WzFdID0gTElOVEVSUCggdCwgb3V0WzFdLCBpblsxXSApOworICAgZHN0WzJdID0gTElOVEVSUCggdCwgb3V0WzJdLCBpblsyXSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK0lOVEVSUF80RihHTGZsb2F0IHQsIEdMZmxvYXQgZHN0WzRdLCBjb25zdCBHTGZsb2F0IG91dFs0XSwgY29uc3QgR0xmbG9hdCBpbls0XSkKK3sKKyAgIGRzdFswXSA9IExJTlRFUlAoIHQsIG91dFswXSwgaW5bMF0gKTsKKyAgIGRzdFsxXSA9IExJTlRFUlAoIHQsIG91dFsxXSwgaW5bMV0gKTsKKyAgIGRzdFsyXSA9IExJTlRFUlAoIHQsIG91dFsyXSwgaW5bMl0gKTsKKyAgIGRzdFszXSA9IExJTlRFUlAoIHQsIG91dFszXSwgaW5bM10gKTsKK30KKworLypAfSovCisKKworCisvKiogQ2xhbXAgWCB0byBbTUlOLE1BWF0gKi8KKyNkZWZpbmUgQ0xBTVAoIFgsIE1JTiwgTUFYICkgICggKFgpPChNSU4pID8gKE1JTikgOiAoKFgpPihNQVgpID8gKE1BWCkgOiAoWCkpICkKKworLyoqIE1pbmltdW0gb2YgdHdvIHZhbHVlczogKi8KKyNkZWZpbmUgTUlOMiggQSwgQiApICAgKCAoQSk8KEIpID8gKEEpIDogKEIpICkKKworLyoqIE1heGltdW0gb2YgdHdvIHZhbHVlczogKi8KKyNkZWZpbmUgTUFYMiggQSwgQiApICAgKCAoQSk+KEIpID8gKEEpIDogKEIpICkKKworLyoqIE1pbmltdW0gYW5kIG1heGltdW0gb2YgdGhyZWUgdmFsdWVzOiAqLworI2RlZmluZSBNSU4zKCBBLCBCLCBDICkgKChBKSA8IChCKSA/IE1JTjIoQSwgQykgOiBNSU4yKEIsIEMpKQorI2RlZmluZSBNQVgzKCBBLCBCLCBDICkgKChBKSA+IChCKSA/IE1BWDIoQSwgQykgOiBNQVgyKEIsIEMpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCittaW5pZnkodW5zaWduZWQgdmFsdWUsIHVuc2lnbmVkIGxldmVscykKK3sKKyAgICByZXR1cm4gTUFYMigxLCB2YWx1ZSA+PiBsZXZlbHMpOworfQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHBvd2VyIG9mIHR3by4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBjb25zaWRlcnMgMCBhIHBvd2VyIG9mIHR3by4KKyAqLworc3RhdGljIGlubGluZSBib29sCitpc19wb3dlcl9vZl90d28odW5zaWduZWQgdmFsdWUpCit7CisgICByZXR1cm4gKHZhbHVlICYgKHZhbHVlIC0gMSkpID09IDA7Cit9CisKKy8qKgorICogQWxpZ24gYSB2YWx1ZSB1cCB0byBhbiBhbGlnbm1lbnQgdmFsdWUKKyAqCisgKiBJZiBcYyB2YWx1ZSBpcyBub3QgYWxyZWFkeSBhbGlnbmVkIHRvIHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50IHZhbHVlLCBpdAorICogd2lsbCBiZSByb3VuZGVkIHVwLgorICoKKyAqIFxwYXJhbSB2YWx1ZSAgVmFsdWUgdG8gYmUgcm91bmRlZAorICogXHBhcmFtIGFsaWdubWVudCAgQWxpZ25tZW50IHZhbHVlIHRvIGJlIHVzZWQuICBUaGlzIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCisgKgorICogXHNhIFJPVU5EX0RPV05fVE8oKQorICovCisjZGVmaW5lIEFMSUdOKHZhbHVlLCBhbGlnbm1lbnQpICAoKCh2YWx1ZSkgKyAoYWxpZ25tZW50KSAtIDEpICYgfigoYWxpZ25tZW50KSAtIDEpKQorCisvKioKKyAqIEFsaWduIGEgdmFsdWUgZG93biB0byBhbiBhbGlnbm1lbnQgdmFsdWUKKyAqCisgKiBJZiBcYyB2YWx1ZSBpcyBub3QgYWxyZWFkeSBhbGlnbmVkIHRvIHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50IHZhbHVlLCBpdAorICogd2lsbCBiZSByb3VuZGVkIGRvd24uCisgKgorICogXHBhcmFtIHZhbHVlICBWYWx1ZSB0byBiZSByb3VuZGVkCisgKiBccGFyYW0gYWxpZ25tZW50ICBBbGlnbm1lbnQgdmFsdWUgdG8gYmUgdXNlZC4gIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKyAqCisgKiBcc2EgQUxJR04oKQorICovCisjZGVmaW5lIFJPVU5EX0RPV05fVE8odmFsdWUsIGFsaWdubWVudCkgKCh2YWx1ZSkgJiB+KGFsaWdubWVudCAtIDEpKQorCisKKy8qKiBDcm9zcyBwcm9kdWN0IG9mIHR3byAzLWVsZW1lbnQgdmVjdG9ycyAqLworc3RhdGljIGlubGluZSB2b2lkCitDUk9TUzMoR0xmbG9hdCBuWzNdLCBjb25zdCBHTGZsb2F0IHVbM10sIGNvbnN0IEdMZmxvYXQgdlszXSkKK3sKKyAgIG5bMF0gPSB1WzFdICogdlsyXSAtIHVbMl0gKiB2WzFdOworICAgblsxXSA9IHVbMl0gKiB2WzBdIC0gdVswXSAqIHZbMl07CisgICBuWzJdID0gdVswXSAqIHZbMV0gLSB1WzFdICogdlswXTsKK30KKworCisvKiogRG90IHByb2R1Y3Qgb2YgdHdvIDItZWxlbWVudCB2ZWN0b3JzICovCitzdGF0aWMgaW5saW5lIEdMZmxvYXQKK0RPVDIoY29uc3QgR0xmbG9hdCBhWzJdLCBjb25zdCBHTGZsb2F0IGJbMl0pCit7CisgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXTsKK30KKworc3RhdGljIGlubGluZSBHTGZsb2F0CitET1QzKGNvbnN0IEdMZmxvYXQgYVszXSwgY29uc3QgR0xmbG9hdCBiWzNdKQoreworICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTsKK30KKworc3RhdGljIGlubGluZSBHTGZsb2F0CitET1Q0KGNvbnN0IEdMZmxvYXQgYVs0XSwgY29uc3QgR0xmbG9hdCBiWzRdKQoreworICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXSArIGFbM10gKiBiWzNdOworfQorCisKK3N0YXRpYyBpbmxpbmUgR0xmbG9hdAorTEVOX1NRVUFSRURfM0ZWKGNvbnN0IEdMZmxvYXQgdlszXSkKK3sKKyAgIHJldHVybiBET1QzKHYsIHYpOworfQorCitzdGF0aWMgaW5saW5lIEdMZmxvYXQKK0xFTl9TUVVBUkVEXzJGVihjb25zdCBHTGZsb2F0IHZbMl0pCit7CisgICByZXR1cm4gRE9UMih2LCB2KTsKK30KKworCitzdGF0aWMgaW5saW5lIEdMZmxvYXQKK0xFTl8zRlYoY29uc3QgR0xmbG9hdCB2WzNdKQoreworICAgcmV0dXJuIHNxcnRmKExFTl9TUVVBUkVEXzNGVih2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgR0xmbG9hdAorTEVOXzJGVihjb25zdCBHTGZsb2F0IHZbMl0pCit7CisgICByZXR1cm4gc3FydGYoTEVOX1NRVUFSRURfMkZWKHYpKTsKK30KKworCisvKiBOb3JtYWxpemUgYSAzLWVsZW1lbnQgdmVjdG9yIHRvIHVuaXQgbGVuZ3RoLiAqLworc3RhdGljIGlubGluZSB2b2lkCitOT1JNQUxJWkVfM0ZWKEdMZmxvYXQgdlszXSkKK3sKKyAgIEdMZmxvYXQgbGVuID0gKEdMZmxvYXQpIExFTl9TUVVBUkVEXzNGVih2KTsKKyAgIGlmIChsZW4pIHsKKyAgICAgIGxlbiA9IElOVl9TUVJURihsZW4pOworICAgICAgdlswXSAqPSBsZW47CisgICAgICB2WzFdICo9IGxlbjsKKyAgICAgIHZbMl0gKj0gbGVuOworICAgfQorfQorCisKKy8qKiBJcyBmbG9hdCB2YWx1ZSBuZWdhdGl2ZT8gKi8KK3N0YXRpYyBpbmxpbmUgR0xib29sZWFuCitJU19ORUdBVElWRShmbG9hdCB4KQoreworICAgcmV0dXJuIHNpZ25iaXQoeCkgIT0gMDsKK30KKworLyoqIFRlc3QgdHdvIGZsb2F0cyBoYXZlIG9wcG9zaXRlIHNpZ25zICovCitzdGF0aWMgaW5saW5lIEdMYm9vbGVhbgorRElGRkVSRU5UX1NJR05TKEdMZmxvYXQgeCwgR0xmbG9hdCB5KQoreworICAgcmV0dXJuIHNpZ25iaXQoeCkgIT0gc2lnbmJpdCh5KTsKK30KKworCisvKiogQ29tcHV0ZSBjZWlsaW5nIG9mIGludGVnZXIgcXVvdGllbnQgb2YgQSBkaXZpZGVkIGJ5IEIuICovCisjZGVmaW5lIENFSUxJTkcoIEEsIEIgKSAgKCAoQSkgJSAoQikgPT0gMCA/IChBKS8oQikgOiAoQSkvKEIpKzEgKQorCisKKy8qKiBjYXN0cyB0byBzaWxlbmNlIHdhcm5pbmdzIHdpdGggc29tZSBjb21waWxlcnMgKi8KKyNkZWZpbmUgRU5VTV9UT19JTlQoRSkgICAgICgoR0xpbnQpKEUpKQorI2RlZmluZSBFTlVNX1RPX0ZMT0FUKEUpICAgKChHTGZsb2F0KShHTGludCkoRSkpCisjZGVmaW5lIEVOVU1fVE9fRE9VQkxFKEUpICAoKEdMZG91YmxlKShHTGludCkoRSkpCisjZGVmaW5lIEVOVU1fVE9fQk9PTEVBTihFKSAoKEUpID8gR0xfVFJVRSA6IEdMX0ZBTFNFKQorCisvKiBDb21wdXRlIHRoZSBzaXplIG9mIGFuIGFycmF5ICovCisvLyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKHhbMF0pKQorCisvKiBTdHJpbmdpZnkgKi8KKyNkZWZpbmUgU1RSSU5HSUZZKHgpICN4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9tdHlwZXMuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vbXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYTEyZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vbXR5cGVzLmgKQEAgLTAsMCArMSwyMzg5IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSAgVk13YXJlLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBtdHlwZXMuaAorICogTWFpbiBNZXNhIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiBQbGVhc2UgdHJ5IHRvIG1hcmsgZGVyaXZlZCB2YWx1ZXMgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZSAoJ18nKS4KKyAqLworCisjaWZuZGVmIE1UWVBFU19ICisjZGVmaW5lIE1UWVBFU19ICisKKworI2luY2x1ZGUgPHN0ZGludC5oPiAgICAgICAgICAgICAvKiB1aW50MzJfdCAqLworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2NvbmZpZy5oIgorI2luY2x1ZGUgImdsYXBpL2dsYXBpLmgiCisjaW5jbHVkZSAibWF0aC9tX21hdHJpeC5oIgkvKiBHTG1hdHJpeCAqLworI2luY2x1ZGUgIm1haW4vc2ltcGxlX2xpc3QuaCIJLyogc3RydWN0IHNpbXBsZV9ub2RlICovCisjaW5jbHVkZSAibWFpbi9mb3JtYXRzLmgiICAgICAgIC8qIE1FU0FfRk9STUFUX0NPVU5UICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKgorICogXG5hbWUgNjQtYml0IGV4dGVuc2lvbiBvZiBHTGJpdGZpZWxkLgorICovCisvKkB7Ki8KK3R5cGVkZWYgR0x1aW50NjQgR0xiaXRmaWVsZDY0OworCisvKiogU2V0IGEgc2luZ2xlIGJpdCAqLworI2RlZmluZSBCSVRGSUVMRDY0X0JJVChiKSAgICAgICgoR0xiaXRmaWVsZDY0KTEgPDwgKGIpKQorLyoqIFNldCBhbGwgYml0cyB1cCB0byBleGNsdWRpbmcgYml0IGIgKi8KKyNkZWZpbmUgQklURklFTEQ2NF9NQVNLKGIpICAgICAgXAorICAgKChiKSA9PSA2NCA/ICh+KEdMYml0ZmllbGQ2NCkwKSA6IEJJVEZJRUxENjRfQklUKGIpIC0gMSkKKy8qKiBTZXQgY291bnQgYml0cyBzdGFydGluZyBmcm9tIGJpdCBiICAqLworI2RlZmluZSBCSVRGSUVMRDY0X1JBTkdFKGIsIGNvdW50KSBcCisgICAoQklURklFTEQ2NF9NQVNLKChiKSArIChjb3VudCkpICYgfkJJVEZJRUxENjRfTUFTSyhiKSkKKworCisvKioKKyAqIFxuYW1lIFNvbWUgZm9yd2FyZCB0eXBlIGRlY2xhcmF0aW9ucworICovCisvKkB7Ki8KK3N0cnVjdCBfbWVzYV9IYXNoVGFibGU7CitzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbDsKK3N0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2s7CitzdHJ1Y3QgZ2xfYXR0cmliX25vZGU7CitzdHJ1Y3QgZ2xfbGlzdF9leHRlbnNpb25zOworc3RydWN0IGdsX21ldGFfc3RhdGU7CitzdHJ1Y3QgZ2xfcHJvZ3JhbV9jYWNoZTsKK3N0cnVjdCBnbF90ZXh0dXJlX29iamVjdDsKK3N0cnVjdCBnbF9kZWJ1Z19zdGF0ZTsKK3N0cnVjdCBnbF9jb250ZXh0Oworc3RydWN0IHN0X2NvbnRleHQ7CitzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlOworc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb247CitzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdDsKK3N0cnVjdCBzZXQ7CitzdHJ1Y3Qgc2V0X2VudHJ5Oworc3RydWN0IHZib19jb250ZXh0OworLypAfSovCisKKworLyoqIEV4dHJhIGRyYXcgbW9kZXMgYmV5b25kIEdMX1BPSU5UUywgR0xfVFJJQU5HTEVfRkFOLCBldGMgKi8KKyNkZWZpbmUgUFJJTV9NQVggICAgICAgICAgICAgICAgIEdMX1RSSUFOR0xFX1NUUklQX0FESkFDRU5DWQorI2RlZmluZSBQUklNX09VVFNJREVfQkVHSU5fRU5EICAgKFBSSU1fTUFYICsgMSkKKyNkZWZpbmUgUFJJTV9VTktOT1dOICAgICAgICAgICAgIChQUklNX01BWCArIDIpCisKKworCisvKioKKyAqIEluZGV4ZXMgZm9yIHZlcnRleCBwcm9ncmFtIGF0dHJpYnV0ZXMuCisgKiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbSBhbGlhc2VzIGdlbmVyaWMgYXR0cmlidXRlcyBvdmVyIHRoZSBjb252ZW50aW9uYWwKKyAqIGF0dHJpYnV0ZXMuICBJbiBHTF9BUkJfdmVydGV4X3Byb2dyYW0gc2hhZGVyIHRoZSBhbGlhc2luZyBpcyBvcHRpb25hbC4KKyAqIEluIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyIC8gT3BlbkdMIDIuMCB0aGUgYWxpYXNpbmcgaXMgZGlzYWxsb3dlZCAodGhlCisgKiBnZW5lcmljIGF0dHJpYnV0ZXMgYXJlIGRpc3RpbmN0L3NlcGFyYXRlKS4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICBWRVJUX0FUVFJJQl9QT1MgPSAwLAorICAgVkVSVF9BVFRSSUJfV0VJR0hUID0gMSwKKyAgIFZFUlRfQVRUUklCX05PUk1BTCA9IDIsCisgICBWRVJUX0FUVFJJQl9DT0xPUjAgPSAzLAorICAgVkVSVF9BVFRSSUJfQ09MT1IxID0gNCwKKyAgIFZFUlRfQVRUUklCX0ZPRyA9IDUsCisgICBWRVJUX0FUVFJJQl9DT0xPUl9JTkRFWCA9IDYsCisgICBWRVJUX0FUVFJJQl9FREdFRkxBRyA9IDcsCisgICBWRVJUX0FUVFJJQl9URVgwID0gOCwKKyAgIFZFUlRfQVRUUklCX1RFWDEgPSA5LAorICAgVkVSVF9BVFRSSUJfVEVYMiA9IDEwLAorICAgVkVSVF9BVFRSSUJfVEVYMyA9IDExLAorICAgVkVSVF9BVFRSSUJfVEVYNCA9IDEyLAorICAgVkVSVF9BVFRSSUJfVEVYNSA9IDEzLAorICAgVkVSVF9BVFRSSUJfVEVYNiA9IDE0LAorICAgVkVSVF9BVFRSSUJfVEVYNyA9IDE1LAorICAgVkVSVF9BVFRSSUJfUE9JTlRfU0laRSA9IDE2LAorICAgVkVSVF9BVFRSSUJfR0VORVJJQzAgPSAxNywKKyAgIFZFUlRfQVRUUklCX0dFTkVSSUMxID0gMTgsCisgICBWRVJUX0FUVFJJQl9HRU5FUklDMiA9IDE5LAorICAgVkVSVF9BVFRSSUJfR0VORVJJQzMgPSAyMCwKKyAgIFZFUlRfQVRUUklCX0dFTkVSSUM0ID0gMjEsCisgICBWRVJUX0FUVFJJQl9HRU5FUklDNSA9IDIyLAorICAgVkVSVF9BVFRSSUJfR0VORVJJQzYgPSAyMywKKyAgIFZFUlRfQVRUUklCX0dFTkVSSUM3ID0gMjQsCisgICBWRVJUX0FUVFJJQl9HRU5FUklDOCA9IDI1LAorICAgVkVSVF9BVFRSSUJfR0VORVJJQzkgPSAyNiwKKyAgIFZFUlRfQVRUUklCX0dFTkVSSUMxMCA9IDI3LAorICAgVkVSVF9BVFRSSUJfR0VORVJJQzExID0gMjgsCisgICBWRVJUX0FUVFJJQl9HRU5FUklDMTIgPSAyOSwKKyAgIFZFUlRfQVRUUklCX0dFTkVSSUMxMyA9IDMwLAorICAgVkVSVF9BVFRSSUJfR0VORVJJQzE0ID0gMzEsCisgICBWRVJUX0FUVFJJQl9HRU5FUklDMTUgPSAzMiwKKyAgIFZFUlRfQVRUUklCX01BWCA9IDMzCit9IGdsX3ZlcnRfYXR0cmliOworCisvKioKKyAqIFN5bWJvbGljIGNvbnN0YXRzIHRvIGhlbHAgaXRlcmF0aW5nIG92ZXIKKyAqIHNwZWNpZmljIGJsb2NrcyBvZiB2ZXJ0ZXggYXR0cmlidXRlcy4KKyAqCisgKiBWRVJUX0FUVFJJQl9GRgorICogICBpbmNsdWRlcyBhbGwgZml4ZWQgZnVuY3Rpb24gYXR0cmlidXRlcyBhcyB3ZWxsIGFzCisgKiAgIHRoZSBhbGlhc2VkIEdMX05WX3ZlcnRleF9wcm9ncmFtIHNoYWRlciBhdHRyaWJ1dGVzLgorICogVkVSVF9BVFRSSUJfVEVYCisgKiAgIGluY2x1ZGUgdGhlIGNsYXNzaWMgdGV4dHVyZSBjb29yZGluYXRlIGF0dHJpYnV0ZXMuCisgKiAgIElzIGEgc3Vic2V0IG9mIFZFUlRfQVRUUklCX0ZGLgorICogVkVSVF9BVFRSSUJfR0VORVJJQworICogICBpbmNsdWRlIHRoZSBPcGVuR0wgMi4wKyBHTFNMIGdlbmVyaWMgc2hhZGVyIGF0dHJpYnV0ZXMuCisgKiAgIFRoZXNlIGFsaWFzIHRoZSBnZW5lcmljIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyIGF0dHJpYnV0ZXMuCisgKi8KKyNkZWZpbmUgVkVSVF9BVFRSSUJfRkYoaSkgICAgICAgICAgIChWRVJUX0FUVFJJQl9QT1MgKyAoaSkpCisjZGVmaW5lIFZFUlRfQVRUUklCX0ZGX01BWCAgICAgICAgICBWRVJUX0FUVFJJQl9HRU5FUklDMAorCisjZGVmaW5lIFZFUlRfQVRUUklCX1RFWChpKSAgICAgICAgICAoVkVSVF9BVFRSSUJfVEVYMCArIChpKSkKKyNkZWZpbmUgVkVSVF9BVFRSSUJfVEVYX01BWCAgICAgICAgIE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTCisKKyNkZWZpbmUgVkVSVF9BVFRSSUJfR0VORVJJQyhpKSAgICAgIChWRVJUX0FUVFJJQl9HRU5FUklDMCArIChpKSkKKyNkZWZpbmUgVkVSVF9BVFRSSUJfR0VORVJJQ19NQVggICAgIE1BWF9WRVJURVhfR0VORVJJQ19BVFRSSUJTCisKKy8qKgorICogQml0ZmxhZ3MgZm9yIHZlcnRleCBhdHRyaWJ1dGVzLgorICogVGhlc2UgYXJlIHVzZWQgaW4gYml0ZmllbGRzIGluIG1hbnkgcGxhY2VzLgorICovCisvKkB7Ki8KKyNkZWZpbmUgVkVSVF9CSVRfUE9TICAgICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX1BPUykKKyNkZWZpbmUgVkVSVF9CSVRfV0VJR0hUICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX1dFSUdIVCkKKyNkZWZpbmUgVkVSVF9CSVRfTk9STUFMICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX05PUk1BTCkKKyNkZWZpbmUgVkVSVF9CSVRfQ09MT1IwICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX0NPTE9SMCkKKyNkZWZpbmUgVkVSVF9CSVRfQ09MT1IxICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX0NPTE9SMSkKKyNkZWZpbmUgVkVSVF9CSVRfRk9HICAgICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX0ZPRykKKyNkZWZpbmUgVkVSVF9CSVRfQ09MT1JfSU5ERVggICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX0NPTE9SX0lOREVYKQorI2RlZmluZSBWRVJUX0JJVF9FREdFRkxBRyAgICAgICAgQklURklFTEQ2NF9CSVQoVkVSVF9BVFRSSUJfRURHRUZMQUcpCisjZGVmaW5lIFZFUlRfQklUX1RFWDAgICAgICAgICAgICBCSVRGSUVMRDY0X0JJVChWRVJUX0FUVFJJQl9URVgwKQorI2RlZmluZSBWRVJUX0JJVF9URVgxICAgICAgICAgICAgQklURklFTEQ2NF9CSVQoVkVSVF9BVFRSSUJfVEVYMSkKKyNkZWZpbmUgVkVSVF9CSVRfVEVYMiAgICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX1RFWDIpCisjZGVmaW5lIFZFUlRfQklUX1RFWDMgICAgICAgICAgICBCSVRGSUVMRDY0X0JJVChWRVJUX0FUVFJJQl9URVgzKQorI2RlZmluZSBWRVJUX0JJVF9URVg0ICAgICAgICAgICAgQklURklFTEQ2NF9CSVQoVkVSVF9BVFRSSUJfVEVYNCkKKyNkZWZpbmUgVkVSVF9CSVRfVEVYNSAgICAgICAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX1RFWDUpCisjZGVmaW5lIFZFUlRfQklUX1RFWDYgICAgICAgICAgICBCSVRGSUVMRDY0X0JJVChWRVJUX0FUVFJJQl9URVg2KQorI2RlZmluZSBWRVJUX0JJVF9URVg3ICAgICAgICAgICAgQklURklFTEQ2NF9CSVQoVkVSVF9BVFRSSUJfVEVYNykKKyNkZWZpbmUgVkVSVF9CSVRfUE9JTlRfU0laRSAgICAgIEJJVEZJRUxENjRfQklUKFZFUlRfQVRUUklCX1BPSU5UX1NJWkUpCisjZGVmaW5lIFZFUlRfQklUX0dFTkVSSUMwICAgICAgICBCSVRGSUVMRDY0X0JJVChWRVJUX0FUVFJJQl9HRU5FUklDMCkKKworI2RlZmluZSBWRVJUX0JJVChpKSAgICAgICAgICAgICAgQklURklFTEQ2NF9CSVQoaSkKKyNkZWZpbmUgVkVSVF9CSVRfQUxMICAgICAgICAgICAgIEJJVEZJRUxENjRfUkFOR0UoMCwgVkVSVF9BVFRSSUJfTUFYKQorCisjZGVmaW5lIFZFUlRfQklUX0ZGKGkpICAgICAgICAgICBWRVJUX0JJVChpKQorI2RlZmluZSBWRVJUX0JJVF9GRl9BTEwgICAgICAgICAgQklURklFTEQ2NF9SQU5HRSgwLCBWRVJUX0FUVFJJQl9GRl9NQVgpCisjZGVmaW5lIFZFUlRfQklUX1RFWChpKSAgICAgICAgICBWRVJUX0JJVChWRVJUX0FUVFJJQl9URVgoaSkpCisjZGVmaW5lIFZFUlRfQklUX1RFWF9BTEwgICAgICAgICBcCisgICBCSVRGSUVMRDY0X1JBTkdFKFZFUlRfQVRUUklCX1RFWCgwKSwgVkVSVF9BVFRSSUJfVEVYX01BWCkKKworI2RlZmluZSBWRVJUX0JJVF9HRU5FUklDKGkpICAgICAgVkVSVF9CSVQoVkVSVF9BVFRSSUJfR0VORVJJQyhpKSkKKyNkZWZpbmUgVkVSVF9CSVRfR0VORVJJQ19BTEwgICAgIFwKKyAgIEJJVEZJRUxENjRfUkFOR0UoVkVSVF9BVFRSSUJfR0VORVJJQygwKSwgVkVSVF9BVFRSSUJfR0VORVJJQ19NQVgpCisvKkB9Ki8KKworCisvKioKKyAqIEluZGV4ZXMgZm9yIHZlcnRleCBzaGFkZXIgb3V0cHV0cywgZ2VvbWV0cnkgc2hhZGVyIGlucHV0cy9vdXRwdXRzLCBhbmQKKyAqIGZyYWdtZW50IHNoYWRlciBpbnB1dHMuCisgKgorICogTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSBub3QgYXZhaWxhYmxlIHRvIGFsbCBwaXBlbGluZSBzdGFnZXMuCisgKgorICogV2hlbiB0aGlzIGVudW0gaXMgdXBkYXRlZCwgdGhlIGZvbGxvd2luZyBjb2RlIG11c3QgYmUgdXBkYXRlZCB0b286CisgKiAtIHZlcnRSZXN1bHRzIChpbiBwcm9nX3ByaW50LmMncyBhcmJfb3V0cHV0X2F0dHJpYl9zdHJpbmcoKSkKKyAqIC0gZnJhZ0F0dHJpYnMgKGluIHByb2dfcHJpbnQuYydzIGFyYl9pbnB1dF9hdHRyaWJfc3RyaW5nKCkpCisgKiAtIF9tZXNhX3Zhcnlpbmdfc2xvdF9pbl9mcygpCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgVkFSWUlOR19TTE9UX1BPUywKKyAgIFZBUllJTkdfU0xPVF9DT0wwLCAvKiBDT0wwIGFuZCBDT0wxIG11c3QgYmUgY29udGlndW91cyAqLworICAgVkFSWUlOR19TTE9UX0NPTDEsCisgICBWQVJZSU5HX1NMT1RfRk9HQywKKyAgIFZBUllJTkdfU0xPVF9URVgwLCAvKiBURVgwLVRFWDcgbXVzdCBiZSBjb250aWd1b3VzICovCisgICBWQVJZSU5HX1NMT1RfVEVYMSwKKyAgIFZBUllJTkdfU0xPVF9URVgyLAorICAgVkFSWUlOR19TTE9UX1RFWDMsCisgICBWQVJZSU5HX1NMT1RfVEVYNCwKKyAgIFZBUllJTkdfU0xPVF9URVg1LAorICAgVkFSWUlOR19TTE9UX1RFWDYsCisgICBWQVJZSU5HX1NMT1RfVEVYNywKKyAgIFZBUllJTkdfU0xPVF9QU0laLCAvKiBEb2VzIG5vdCBhcHBlYXIgaW4gRlMgKi8KKyAgIFZBUllJTkdfU0xPVF9CRkMwLCAvKiBEb2VzIG5vdCBhcHBlYXIgaW4gRlMgKi8KKyAgIFZBUllJTkdfU0xPVF9CRkMxLCAvKiBEb2VzIG5vdCBhcHBlYXIgaW4gRlMgKi8KKyAgIFZBUllJTkdfU0xPVF9FREdFLCAvKiBEb2VzIG5vdCBhcHBlYXIgaW4gRlMgKi8KKyAgIFZBUllJTkdfU0xPVF9DTElQX1ZFUlRFWCwgLyogRG9lcyBub3QgYXBwZWFyIGluIEZTICovCisgICBWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMCwKKyAgIFZBUllJTkdfU0xPVF9DTElQX0RJU1QxLAorICAgVkFSWUlOR19TTE9UX1BSSU1JVElWRV9JRCwgLyogRG9lcyBub3QgYXBwZWFyIGluIFZTICovCisgICBWQVJZSU5HX1NMT1RfTEFZRVIsIC8qIEFwcGVhcnMgYXMgVlMgb3IgR1Mgb3V0cHV0ICovCisgICBWQVJZSU5HX1NMT1RfVklFV1BPUlQsIC8qIEFwcGVhcnMgYXMgVlMgb3IgR1Mgb3V0cHV0ICovCisgICBWQVJZSU5HX1NMT1RfRkFDRSwgLyogRlMgb25seSAqLworICAgVkFSWUlOR19TTE9UX1BOVEMsIC8qIEZTIG9ubHkgKi8KKyAgIFZBUllJTkdfU0xPVF9WQVIwLCAvKiBGaXJzdCBnZW5lcmljIHZhcnlpbmcgc2xvdCAqLworICAgVkFSWUlOR19TTE9UX01BWCA9IFZBUllJTkdfU0xPVF9WQVIwICsgTUFYX1ZBUllJTkcKK30gZ2xfdmFyeWluZ19zbG90OworCisKKy8qKgorICogQml0ZmxhZ3MgZm9yIHZhcnlpbmcgc2xvdHMuCisgKi8KKy8qQHsqLworI2RlZmluZSBWQVJZSU5HX0JJVF9QT1MgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX1BPUykKKyNkZWZpbmUgVkFSWUlOR19CSVRfQ09MMCBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQ09MMCkKKyNkZWZpbmUgVkFSWUlOR19CSVRfQ09MMSBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQ09MMSkKKyNkZWZpbmUgVkFSWUlOR19CSVRfRk9HQyBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfRk9HQykKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYMCBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYMCkKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYMSBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYMSkKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYMiBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYMikKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYMyBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYMykKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYNCBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYNCkKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYNSBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYNSkKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYNiBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYNikKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYNyBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfVEVYNykKKyNkZWZpbmUgVkFSWUlOR19CSVRfVEVYKFUpIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9URVgwICsgKFUpKQorI2RlZmluZSBWQVJZSU5HX0JJVFNfVEVYX0FOWSBCSVRGSUVMRDY0X1JBTkdFKFZBUllJTkdfU0xPVF9URVgwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1RFWFRVUkVfQ09PUkRfVU5JVFMpCisjZGVmaW5lIFZBUllJTkdfQklUX1BTSVogQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX1BTSVopCisjZGVmaW5lIFZBUllJTkdfQklUX0JGQzAgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0JGQzApCisjZGVmaW5lIFZBUllJTkdfQklUX0JGQzEgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0JGQzEpCisjZGVmaW5lIFZBUllJTkdfQklUX0VER0UgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0VER0UpCisjZGVmaW5lIFZBUllJTkdfQklUX0NMSVBfVkVSVEVYIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9DTElQX1ZFUlRFWCkKKyNkZWZpbmUgVkFSWUlOR19CSVRfQ0xJUF9ESVNUMCBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMCkKKyNkZWZpbmUgVkFSWUlOR19CSVRfQ0xJUF9ESVNUMSBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMSkKKyNkZWZpbmUgVkFSWUlOR19CSVRfUFJJTUlUSVZFX0lEIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9QUklNSVRJVkVfSUQpCisjZGVmaW5lIFZBUllJTkdfQklUX0xBWUVSIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9MQVlFUikKKyNkZWZpbmUgVkFSWUlOR19CSVRfVklFV1BPUlQgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX1ZJRVdQT1JUKQorI2RlZmluZSBWQVJZSU5HX0JJVF9GQUNFIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9GQUNFKQorI2RlZmluZSBWQVJZSU5HX0JJVF9QTlRDIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9QTlRDKQorI2RlZmluZSBWQVJZSU5HX0JJVF9WQVIoVikgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX1ZBUjAgKyAoVikpCisvKkB9Ki8KKworLyoqCisgKiBCaXRmbGFncyBmb3Igc3lzdGVtIHZhbHVlcy4KKyAqLworI2RlZmluZSBTWVNURU1fQklUX1NBTVBMRV9JRCBCSVRGSUVMRDY0X0JJVChTWVNURU1fVkFMVUVfU0FNUExFX0lEKQorI2RlZmluZSBTWVNURU1fQklUX1NBTVBMRV9QT1MgQklURklFTEQ2NF9CSVQoU1lTVEVNX1ZBTFVFX1NBTVBMRV9QT1MpCisjZGVmaW5lIFNZU1RFTV9CSVRfU0FNUExFX01BU0tfSU4gQklURklFTEQ2NF9CSVQoU1lTVEVNX1ZBTFVFX1NBTVBMRV9NQVNLX0lOKQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gZ2xfdmFyeWluZ19zbG90IGFwcGVhcnMgaW4gdGhlIGZyYWdtZW50IHNoYWRlci4KKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK19tZXNhX3Zhcnlpbmdfc2xvdF9pbl9mcyhnbF92YXJ5aW5nX3Nsb3Qgc2xvdCkKK3sKKyAgIHN3aXRjaCAoc2xvdCkgeworICAgY2FzZSBWQVJZSU5HX1NMT1RfUFNJWjoKKyAgIGNhc2UgVkFSWUlOR19TTE9UX0JGQzA6CisgICBjYXNlIFZBUllJTkdfU0xPVF9CRkMxOgorICAgY2FzZSBWQVJZSU5HX1NMT1RfRURHRToKKyAgIGNhc2UgVkFSWUlOR19TTE9UX0NMSVBfVkVSVEVYOgorICAgY2FzZSBWQVJZSU5HX1NMT1RfTEFZRVI6CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9Cit9CisKKworLyoqCisgKiBGcmFnbWVudCBwcm9ncmFtIHJlc3VsdHMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICBGUkFHX1JFU1VMVF9ERVBUSCA9IDAsCisgICBGUkFHX1JFU1VMVF9TVEVOQ0lMID0gMSwKKyAgIC8qIElmIGEgc2luZ2xlIGNvbG9yIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbCByZW5kZXIgdGFyZ2V0cywgdGhpcworICAgICogcmVnaXN0ZXIgaXMgd3JpdHRlbi4gIE5vIEZSQUdfUkVTVUxUX0RBVEFuIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAqLworICAgRlJBR19SRVNVTFRfQ09MT1IgPSAyLAorICAgRlJBR19SRVNVTFRfU0FNUExFX01BU0sgPSAzLAorCisgICAvKiBGUkFHX1JFU1VMVF9EQVRBbiBhcmUgdGhlIHBlci1yZW5kZXItdGFyZ2V0IChHTFNMIGdsX0ZyYWdEYXRhW25dCisgICAgKiBvciBBUkJfZnJhZ21lbnRfcHJvZ3JhbSBmcmFnbWVudC5jb2xvcltuXSkgY29sb3IgcmVzdWx0cy4gIElmCisgICAgKiBhbnkgYXJlIHdyaXR0ZW4sIEZSQUdfUkVTVUxUX0NPTE9SIHdpbGwgbm90IGJlIHdyaXR0ZW4uCisgICAgKi8KKyAgIEZSQUdfUkVTVUxUX0RBVEEwID0gNCwKKyAgIEZSQUdfUkVTVUxUX01BWCA9IChGUkFHX1JFU1VMVF9EQVRBMCArIE1BWF9EUkFXX0JVRkZFUlMpCit9IGdsX2ZyYWdfcmVzdWx0OworCisKKy8qKgorICogSW5kZXhlcyBmb3IgYWxsIHJlbmRlcmJ1ZmZlcnMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAvKiB0aGUgZm91ciBzdGFuZGFyZCBjb2xvciBidWZmZXJzICovCisgICBCVUZGRVJfRlJPTlRfTEVGVCwKKyAgIEJVRkZFUl9CQUNLX0xFRlQsCisgICBCVUZGRVJfRlJPTlRfUklHSFQsCisgICBCVUZGRVJfQkFDS19SSUdIVCwKKyAgIEJVRkZFUl9ERVBUSCwKKyAgIEJVRkZFUl9TVEVOQ0lMLAorICAgQlVGRkVSX0FDQ1VNLAorICAgLyogb3B0aW9uYWwgYXV4IGJ1ZmZlciAqLworICAgQlVGRkVSX0FVWDAsCisgICAvKiBnZW5lcmljIHJlbmRlcmJ1ZmZlcnMgKi8KKyAgIEJVRkZFUl9DT0xPUjAsCisgICBCVUZGRVJfQ09MT1IxLAorICAgQlVGRkVSX0NPTE9SMiwKKyAgIEJVRkZFUl9DT0xPUjMsCisgICBCVUZGRVJfQ09MT1I0LAorICAgQlVGRkVSX0NPTE9SNSwKKyAgIEJVRkZFUl9DT0xPUjYsCisgICBCVUZGRVJfQ09MT1I3LAorICAgQlVGRkVSX0NPVU5UCit9IGdsX2J1ZmZlcl9pbmRleDsKKworLyoqCisgKiBCaXQgZmxhZ3MgZm9yIGFsbCByZW5kZXJidWZmZXJzCisgKi8KKyNkZWZpbmUgQlVGRkVSX0JJVF9GUk9OVF9MRUZUICAgKDEgPDwgQlVGRkVSX0ZST05UX0xFRlQpCisjZGVmaW5lIEJVRkZFUl9CSVRfQkFDS19MRUZUICAgICgxIDw8IEJVRkZFUl9CQUNLX0xFRlQpCisjZGVmaW5lIEJVRkZFUl9CSVRfRlJPTlRfUklHSFQgICgxIDw8IEJVRkZFUl9GUk9OVF9SSUdIVCkKKyNkZWZpbmUgQlVGRkVSX0JJVF9CQUNLX1JJR0hUICAgKDEgPDwgQlVGRkVSX0JBQ0tfUklHSFQpCisjZGVmaW5lIEJVRkZFUl9CSVRfQVVYMCAgICAgICAgICgxIDw8IEJVRkZFUl9BVVgwKQorI2RlZmluZSBCVUZGRVJfQklUX0FVWDEgICAgICAgICAoMSA8PCBCVUZGRVJfQVVYMSkKKyNkZWZpbmUgQlVGRkVSX0JJVF9BVVgyICAgICAgICAgKDEgPDwgQlVGRkVSX0FVWDIpCisjZGVmaW5lIEJVRkZFUl9CSVRfQVVYMyAgICAgICAgICgxIDw8IEJVRkZFUl9BVVgzKQorI2RlZmluZSBCVUZGRVJfQklUX0RFUFRIICAgICAgICAoMSA8PCBCVUZGRVJfREVQVEgpCisjZGVmaW5lIEJVRkZFUl9CSVRfU1RFTkNJTCAgICAgICgxIDw8IEJVRkZFUl9TVEVOQ0lMKQorI2RlZmluZSBCVUZGRVJfQklUX0FDQ1VNICAgICAgICAoMSA8PCBCVUZGRVJfQUNDVU0pCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1IwICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjApCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1IxICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjEpCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1IyICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjIpCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1IzICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjMpCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1I0ICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjQpCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1I1ICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjUpCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1I2ICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjYpCisjZGVmaW5lIEJVRkZFUl9CSVRfQ09MT1I3ICAgICAgICgxIDw8IEJVRkZFUl9DT0xPUjcpCisKKy8qKgorICogTWFzayBvZiBhbGwgdGhlIGNvbG9yIGJ1ZmZlciBiaXRzIChidXQgbm90IGFjY3VtKS4KKyAqLworI2RlZmluZSBCVUZGRVJfQklUU19DT0xPUiAgKEJVRkZFUl9CSVRfRlJPTlRfTEVGVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfQklUX0JBQ0tfTEVGVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfQklUX0ZST05UX1JJR0hUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRkZFUl9CSVRfQkFDS19SSUdIVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfQklUX0FVWDAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjYgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0JJVF9DT0xPUjcpCisKKworLyoqCisgKiBTaGFkZXIgc3RhZ2VzLiBOb3RlIHRoYXQgdGhlc2Ugd2lsbCBiZWNvbWUgNSB3aXRoIHRlc3NlbGxhdGlvbi4KKyAqCisgKiBUaGUgb3JkZXIgbXVzdCBtYXRjaCBob3cgc2hhZGVycyBhcmUgb3JkZXJlZCBpbiB0aGUgcGlwZWxpbmUuCisgKiBUaGUgR0xTTCBsaW5rZXIgYXNzdW1lcyB0aGF0IGlmIGk8aiwgdGhlbiB0aGUgai10aCBzaGFkZXIgaXMKKyAqIGV4ZWN1dGVkIGxhdGVyIHRoYW4gdGhlIGktdGggc2hhZGVyLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgIE1FU0FfU0hBREVSX1ZFUlRFWCA9IDAsCisgICBNRVNBX1NIQURFUl9HRU9NRVRSWSA9IDEsCisgICBNRVNBX1NIQURFUl9GUkFHTUVOVCA9IDIsCisgICBNRVNBX1NIQURFUl9DT01QVVRFID0gMywKK30gZ2xfc2hhZGVyX3N0YWdlOworCisjZGVmaW5lIE1FU0FfU0hBREVSX1NUQUdFUyAoTUVTQV9TSEFERVJfQ09NUFVURSArIDEpCisKKworCisvKioKKyAqIFxuYW1lIEJpdCBmbGFncyB1c2VkIGZvciB1cGRhdGluZyBtYXRlcmlhbCB2YWx1ZXMuCisgKi8KKy8qQHsqLworI2RlZmluZSBNQVRfQVRUUklCX0ZST05UX0FNQklFTlQgICAgICAgICAgIDAgCisjZGVmaW5lIE1BVF9BVFRSSUJfQkFDS19BTUJJRU5UICAgICAgICAgICAgMQorI2RlZmluZSBNQVRfQVRUUklCX0ZST05UX0RJRkZVU0UgICAgICAgICAgIDIgCisjZGVmaW5lIE1BVF9BVFRSSUJfQkFDS19ESUZGVVNFICAgICAgICAgICAgMworI2RlZmluZSBNQVRfQVRUUklCX0ZST05UX1NQRUNVTEFSICAgICAgICAgIDQgCisjZGVmaW5lIE1BVF9BVFRSSUJfQkFDS19TUEVDVUxBUiAgICAgICAgICAgNQorI2RlZmluZSBNQVRfQVRUUklCX0ZST05UX0VNSVNTSU9OICAgICAgICAgIDYKKyNkZWZpbmUgTUFUX0FUVFJJQl9CQUNLX0VNSVNTSU9OICAgICAgICAgICA3CisjZGVmaW5lIE1BVF9BVFRSSUJfRlJPTlRfU0hJTklORVNTICAgICAgICAgOAorI2RlZmluZSBNQVRfQVRUUklCX0JBQ0tfU0hJTklORVNTICAgICAgICAgIDkKKyNkZWZpbmUgTUFUX0FUVFJJQl9GUk9OVF9JTkRFWEVTICAgICAgICAgICAxMAorI2RlZmluZSBNQVRfQVRUUklCX0JBQ0tfSU5ERVhFUyAgICAgICAgICAgIDExCisjZGVmaW5lIE1BVF9BVFRSSUJfTUFYICAgICAgICAgICAgICAgICAgICAgMTIKKworI2RlZmluZSBNQVRfQVRUUklCX0FNQklFTlQoZikgIChNQVRfQVRUUklCX0ZST05UX0FNQklFTlQrKGYpKSAgCisjZGVmaW5lIE1BVF9BVFRSSUJfRElGRlVTRShmKSAgKE1BVF9BVFRSSUJfRlJPTlRfRElGRlVTRSsoZikpICAKKyNkZWZpbmUgTUFUX0FUVFJJQl9TUEVDVUxBUihmKSAoTUFUX0FUVFJJQl9GUk9OVF9TUEVDVUxBUisoZikpIAorI2RlZmluZSBNQVRfQVRUUklCX0VNSVNTSU9OKGYpIChNQVRfQVRUUklCX0ZST05UX0VNSVNTSU9OKyhmKSkgCisjZGVmaW5lIE1BVF9BVFRSSUJfU0hJTklORVNTKGYpKE1BVF9BVFRSSUJfRlJPTlRfU0hJTklORVNTKyhmKSkKKyNkZWZpbmUgTUFUX0FUVFJJQl9JTkRFWEVTKGYpICAoTUFUX0FUVFJJQl9GUk9OVF9JTkRFWEVTKyhmKSkgIAorCisjZGVmaW5lIE1BVF9JTkRFWF9BTUJJRU5UICAwCisjZGVmaW5lIE1BVF9JTkRFWF9ESUZGVVNFICAxCisjZGVmaW5lIE1BVF9JTkRFWF9TUEVDVUxBUiAyCisKKyNkZWZpbmUgTUFUX0JJVF9GUk9OVF9BTUJJRU5UICAgICAgICAgKDE8PE1BVF9BVFRSSUJfRlJPTlRfQU1CSUVOVCkKKyNkZWZpbmUgTUFUX0JJVF9CQUNLX0FNQklFTlQgICAgICAgICAgKDE8PE1BVF9BVFRSSUJfQkFDS19BTUJJRU5UKQorI2RlZmluZSBNQVRfQklUX0ZST05UX0RJRkZVU0UgICAgICAgICAoMTw8TUFUX0FUVFJJQl9GUk9OVF9ESUZGVVNFKQorI2RlZmluZSBNQVRfQklUX0JBQ0tfRElGRlVTRSAgICAgICAgICAoMTw8TUFUX0FUVFJJQl9CQUNLX0RJRkZVU0UpCisjZGVmaW5lIE1BVF9CSVRfRlJPTlRfU1BFQ1VMQVIgICAgICAgICgxPDxNQVRfQVRUUklCX0ZST05UX1NQRUNVTEFSKQorI2RlZmluZSBNQVRfQklUX0JBQ0tfU1BFQ1VMQVIgICAgICAgICAoMTw8TUFUX0FUVFJJQl9CQUNLX1NQRUNVTEFSKQorI2RlZmluZSBNQVRfQklUX0ZST05UX0VNSVNTSU9OICAgICAgICAoMTw8TUFUX0FUVFJJQl9GUk9OVF9FTUlTU0lPTikKKyNkZWZpbmUgTUFUX0JJVF9CQUNLX0VNSVNTSU9OICAgICAgICAgKDE8PE1BVF9BVFRSSUJfQkFDS19FTUlTU0lPTikKKyNkZWZpbmUgTUFUX0JJVF9GUk9OVF9TSElOSU5FU1MgICAgICAgKDE8PE1BVF9BVFRSSUJfRlJPTlRfU0hJTklORVNTKQorI2RlZmluZSBNQVRfQklUX0JBQ0tfU0hJTklORVNTICAgICAgICAoMTw8TUFUX0FUVFJJQl9CQUNLX1NISU5JTkVTUykKKyNkZWZpbmUgTUFUX0JJVF9GUk9OVF9JTkRFWEVTICAgICAgICAgKDE8PE1BVF9BVFRSSUJfRlJPTlRfSU5ERVhFUykKKyNkZWZpbmUgTUFUX0JJVF9CQUNLX0lOREVYRVMgICAgICAgICAgKDE8PE1BVF9BVFRSSUJfQkFDS19JTkRFWEVTKQorCisKKyNkZWZpbmUgRlJPTlRfTUFURVJJQUxfQklUUwkoTUFUX0JJVF9GUk9OVF9FTUlTU0lPTiB8IAlcCisJCQkJIE1BVF9CSVRfRlJPTlRfQU1CSUVOVCB8CVwKKwkJCQkgTUFUX0JJVF9GUk9OVF9ESUZGVVNFIHwgCVwKKwkJCQkgTUFUX0JJVF9GUk9OVF9TUEVDVUxBUiB8CVwKKwkJCQkgTUFUX0JJVF9GUk9OVF9TSElOSU5FU1MgfCAJXAorCQkJCSBNQVRfQklUX0ZST05UX0lOREVYRVMpCisKKyNkZWZpbmUgQkFDS19NQVRFUklBTF9CSVRTCShNQVRfQklUX0JBQ0tfRU1JU1NJT04gfAlcCisJCQkJIE1BVF9CSVRfQkFDS19BTUJJRU5UIHwJCVwKKwkJCQkgTUFUX0JJVF9CQUNLX0RJRkZVU0UgfAkJXAorCQkJCSBNQVRfQklUX0JBQ0tfU1BFQ1VMQVIgfAlcCisJCQkJIE1BVF9CSVRfQkFDS19TSElOSU5FU1MgfAlcCisJCQkJIE1BVF9CSVRfQkFDS19JTkRFWEVTKQorCisjZGVmaW5lIEFMTF9NQVRFUklBTF9CSVRTCShGUk9OVF9NQVRFUklBTF9CSVRTIHwgQkFDS19NQVRFUklBTF9CSVRTKQorLypAfSovCisKKworLyoqCisgKiBMaWdodCBzdGF0ZSBmbGFncy4KKyAqLworLypAeyovCisjZGVmaW5lIExJR0hUX1NQT1QgICAgICAgICAweDEKKyNkZWZpbmUgTElHSFRfTE9DQUxfVklFV0VSIDB4MgorI2RlZmluZSBMSUdIVF9QT1NJVElPTkFMICAgMHg0CisjZGVmaW5lIExJR0hUX05FRURfVkVSVElDRVMgKExJR0hUX1BPU0lUSU9OQUx8TElHSFRfTE9DQUxfVklFV0VSKQorLypAfSovCisKKworCisKKworLyoqCisgKiBNdWx0aXNhbXBsZSBhdHRyaWJ1dGUgZ3JvdXAgKEdMX01VTFRJU0FNUExFX0JJVCkuCisgKi8KK3N0cnVjdCBnbF9tdWx0aXNhbXBsZV9hdHRyaWIKK3sKKyAgIEdMYm9vbGVhbiBFbmFibGVkOworICAgR0xib29sZWFuIF9FbmFibGVkOyAgIC8qKjwgdHJ1ZSBpZiBFbmFibGVkIGFuZCBtdWx0aXNhbXBsZSBidWZmZXIgKi8KKyAgIEdMYm9vbGVhbiBTYW1wbGVBbHBoYVRvQ292ZXJhZ2U7CisgICBHTGJvb2xlYW4gU2FtcGxlQWxwaGFUb09uZTsKKyAgIEdMYm9vbGVhbiBTYW1wbGVDb3ZlcmFnZTsKKyAgIEdMZmxvYXQgU2FtcGxlQ292ZXJhZ2VWYWx1ZTsKKyAgIEdMYm9vbGVhbiBTYW1wbGVDb3ZlcmFnZUludmVydDsKKyAgIEdMYm9vbGVhbiBTYW1wbGVTaGFkaW5nOworICAgR0xmbG9hdCBNaW5TYW1wbGVTaGFkaW5nVmFsdWU7CisKKyAgIC8qIEFSQl90ZXh0dXJlX211bHRpc2FtcGxlIC8gR0wzLjIgYWRkaXRpb25zICovCisgICBHTGJvb2xlYW4gU2FtcGxlTWFzazsKKyAgIC8qKiBUaGUgR0wgc3BlYyBkZWZpbmVzIHRoaXMgYXMgYW4gYXJyYXkgYnV0ID4zMnggTVNBQSBpcyBtYWRuZXNzICovCisgICBHTGJpdGZpZWxkIFNhbXBsZU1hc2tWYWx1ZTsKK307CisKKworLyoqCisgKiBBbiBpbmRleCBmb3IgZWFjaCB0eXBlIG9mIHRleHR1cmUgb2JqZWN0LiAgVGhlc2UgY29ycmVzcG9uZCB0byB0aGUgR0wKKyAqIHRleHR1cmUgdGFyZ2V0IGVudW1zLCBzdWNoIGFzIEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1VCRV9NQVAsIGV0Yy4KKyAqIE5vdGU6IHRoZSBvcmRlciBpcyBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgdG8gbG93ZXN0IHByaW9yaXR5LgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgIFRFWFRVUkVfMkRfTVVMVElTQU1QTEVfSU5ERVgsCisgICBURVhUVVJFXzJEX01VTFRJU0FNUExFX0FSUkFZX0lOREVYLAorICAgVEVYVFVSRV9DVUJFX0FSUkFZX0lOREVYLAorICAgVEVYVFVSRV9CVUZGRVJfSU5ERVgsCisgICBURVhUVVJFXzJEX0FSUkFZX0lOREVYLAorICAgVEVYVFVSRV8xRF9BUlJBWV9JTkRFWCwKKyAgIFRFWFRVUkVfRVhURVJOQUxfSU5ERVgsCisgICBURVhUVVJFX0NVQkVfSU5ERVgsCisgICBURVhUVVJFXzNEX0lOREVYLAorICAgVEVYVFVSRV9SRUNUX0lOREVYLAorICAgVEVYVFVSRV8yRF9JTkRFWCwKKyAgIFRFWFRVUkVfMURfSU5ERVgsCisgICBOVU1fVEVYVFVSRV9UQVJHRVRTCit9IGdsX3RleHR1cmVfaW5kZXg7CisKKworLyoqCisgKiBCaXQgZmxhZ3MgZm9yIGVhY2ggdHlwZSBvZiB0ZXh0dXJlIG9iamVjdAorICovCisvKkB7Ki8KKyNkZWZpbmUgVEVYVFVSRV8yRF9NVUxUSVNBTVBMRV9CSVQgKDEgPDwgVEVYVFVSRV8yRF9NVUxUSVNBTVBMRV9JTkRFWCkKKyNkZWZpbmUgVEVYVFVSRV8yRF9NVUxUSVNBTVBMRV9BUlJBWV9CSVQgKDEgPDwgVEVYVFVSRV8yRF9NVUxUSVNBTVBMRV9BUlJBWV9JTkRFWCkKKyNkZWZpbmUgVEVYVFVSRV9DVUJFX0FSUkFZX0JJVCAoMSA8PCBURVhUVVJFX0NVQkVfQVJSQVlfSU5ERVgpCisjZGVmaW5lIFRFWFRVUkVfQlVGRkVSX0JJVCAgICgxIDw8IFRFWFRVUkVfQlVGRkVSX0lOREVYKQorI2RlZmluZSBURVhUVVJFXzJEX0FSUkFZX0JJVCAoMSA8PCBURVhUVVJFXzJEX0FSUkFZX0lOREVYKQorI2RlZmluZSBURVhUVVJFXzFEX0FSUkFZX0JJVCAoMSA8PCBURVhUVVJFXzFEX0FSUkFZX0lOREVYKQorI2RlZmluZSBURVhUVVJFX0VYVEVSTkFMX0JJVCAoMSA8PCBURVhUVVJFX0VYVEVSTkFMX0lOREVYKQorI2RlZmluZSBURVhUVVJFX0NVQkVfQklUICAgICAoMSA8PCBURVhUVVJFX0NVQkVfSU5ERVgpCisjZGVmaW5lIFRFWFRVUkVfM0RfQklUICAgICAgICgxIDw8IFRFWFRVUkVfM0RfSU5ERVgpCisjZGVmaW5lIFRFWFRVUkVfUkVDVF9CSVQgICAgICgxIDw8IFRFWFRVUkVfUkVDVF9JTkRFWCkKKyNkZWZpbmUgVEVYVFVSRV8yRF9CSVQgICAgICAgKDEgPDwgVEVYVFVSRV8yRF9JTkRFWCkKKyNkZWZpbmUgVEVYVFVSRV8xRF9CSVQgICAgICAgKDEgPDwgVEVYVFVSRV8xRF9JTkRFWCkKKy8qQH0qLworCisKKy8qKgorICogSW5kZXhlcyBmb3IgY3ViZSBtYXAgZmFjZXMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgRkFDRV9QT1NfWCA9IDAsCisgICBGQUNFX05FR19YID0gMSwKKyAgIEZBQ0VfUE9TX1kgPSAyLAorICAgRkFDRV9ORUdfWSA9IDMsCisgICBGQUNFX1BPU19aID0gNCwKKyAgIEZBQ0VfTkVHX1ogPSA1LAorICAgTUFYX0ZBQ0VTID0gNgorfSBnbF9mYWNlX2luZGV4OworCisKKworLyoqIFVwIHRvIGZvdXIgY29tYmluZXIgc291cmNlcyBhcmUgcG9zc2libGUgd2l0aCBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNCAqLworI2RlZmluZSBNQVhfQ09NQklORVJfVEVSTVMgNAorCisKKy8qKgorICogVGV4dHVyZSBjb21iaW5lIGVudmlyb25tZW50IHN0YXRlLgorICovCitzdHJ1Y3QgZ2xfdGV4X2Vudl9jb21iaW5lX3N0YXRlCit7CisgICBHTGVudW0gTW9kZVJHQjsgICAgICAgLyoqPCBHTF9SRVBMQUNFLCBHTF9ERUNBTCwgR0xfQURELCBldGMuICovCisgICBHTGVudW0gTW9kZUE7ICAgICAgICAgLyoqPCBHTF9SRVBMQUNFLCBHTF9ERUNBTCwgR0xfQURELCBldGMuICovCisgICAvKiogU291cmNlIHRlcm1zOiBHTF9QUklNQVJZX0NPTE9SLCBHTF9URVhUVVJFLCBldGMgKi8KKyAgIEdMZW51bSBTb3VyY2VSR0JbTUFYX0NPTUJJTkVSX1RFUk1TXTsKKyAgIEdMZW51bSBTb3VyY2VBW01BWF9DT01CSU5FUl9URVJNU107CisgICAvKiogU291cmNlIG9wZXJhbmRzOiBHTF9TUkNfQ09MT1IsIEdMX09ORV9NSU5VU19TUkNfQ09MT1IsIGV0YyAqLworICAgR0xlbnVtIE9wZXJhbmRSR0JbTUFYX0NPTUJJTkVSX1RFUk1TXTsKKyAgIEdMZW51bSBPcGVyYW5kQVtNQVhfQ09NQklORVJfVEVSTVNdOworICAgR0x1aW50IFNjYWxlU2hpZnRSR0I7IC8qKjwgMCwgMSBvciAyICovCisgICBHTHVpbnQgU2NhbGVTaGlmdEE7ICAgLyoqPCAwLCAxIG9yIDIgKi8KKyAgIEdMdWludCBfTnVtQXJnc1JHQjsgICAvKio8IE51bWJlciBvZiBpbnB1dHMgdXNlZCBmb3IgdGhlIFJHQiBjb21iaW5lciAqLworICAgR0x1aW50IF9OdW1BcmdzQTsgICAgIC8qKjwgTnVtYmVyIG9mIGlucHV0cyB1c2VkIGZvciB0aGUgQSBjb21iaW5lciAqLworfTsKKworCisvKioKKyAqIFRleEdlbkVuYWJsZWQgZmxhZ3MuCisgKi8KKy8qQHsqLworI2RlZmluZSBTX0JJVCAxCisjZGVmaW5lIFRfQklUIDIKKyNkZWZpbmUgUl9CSVQgNAorI2RlZmluZSBRX0JJVCA4CisjZGVmaW5lIFNUUl9CSVRTIChTX0JJVCB8IFRfQklUIHwgUl9CSVQpCisvKkB9Ki8KKworCisvKioKKyAqIEJpdCBmbGFnIHZlcnNpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nIEdMXyBjb25zdGFudHMuCisgKi8KKy8qQHsqLworI2RlZmluZSBURVhHRU5fU1BIRVJFX01BUCAgICAgICAgMHgxCisjZGVmaW5lIFRFWEdFTl9PQkpfTElORUFSICAgICAgICAweDIKKyNkZWZpbmUgVEVYR0VOX0VZRV9MSU5FQVIgICAgICAgIDB4NAorI2RlZmluZSBURVhHRU5fUkVGTEVDVElPTl9NQVBfTlYgMHg4CisjZGVmaW5lIFRFWEdFTl9OT1JNQUxfTUFQX05WICAgICAweDEwCisKKyNkZWZpbmUgVEVYR0VOX05FRURfTk9STUFMUyAgICAgIChURVhHRU5fU1BIRVJFX01BUCAgICAgICAgfCBcCisJCQkJICBURVhHRU5fUkVGTEVDVElPTl9NQVBfTlYgfCBcCisJCQkJICBURVhHRU5fTk9STUFMX01BUF9OVikKKyNkZWZpbmUgVEVYR0VOX05FRURfRVlFX0NPT1JEICAgIChURVhHRU5fU1BIRVJFX01BUCAgICAgICAgfCBcCisJCQkJICBURVhHRU5fUkVGTEVDVElPTl9NQVBfTlYgfCBcCisJCQkJICBURVhHRU5fTk9STUFMX01BUF9OViAgICAgfCBcCisJCQkJICBURVhHRU5fRVlFX0xJTkVBUikKKy8qQH0qLworCisKKworLyoqIFRleC1nZW4gZW5hYmxlZCBmb3IgdGV4dHVyZSB1bml0PyAqLworI2RlZmluZSBFTkFCTEVfVEVYR0VOKHVuaXQpICgxIDw8ICh1bml0KSkKKworLyoqIE5vbi1pZGVudGl0eSB0ZXh0dXJlIG1hdHJpeCBmb3IgdGV4dHVyZSB1bml0PyAqLworI2RlZmluZSBFTkFCTEVfVEVYTUFUKHVuaXQpICgxIDw8ICh1bml0KSkKKworLyoqCisgKiBEYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzaW5nbGUgY2xpcCBwbGFuZSAoZS5nLiBvbmUgb2YgdGhlIGVsZW1lbnRzCisgKiBvZiB0aGUgY3R4LT5UcmFuc2Zvcm0uRXllVXNlclBsYW5lIG9yIGN0eC0+VHJhbnNmb3JtLl9DbGlwVXNlclBsYW5lIGFycmF5KS4KKyAqLwordHlwZWRlZiBHTGZsb2F0IGdsX2NsaXBfcGxhbmVbNF07CisKK3R5cGVkZWYgZW51bSB7CisgICBNQVBfVVNFUiwKKyAgIE1BUF9JTlRFUk5BTCwKKworICAgTUFQX0NPVU5UCit9IGdsX21hcF9idWZmZXJfaW5kZXg7CisKKworLyoqCisgKiBGaWVsZHMgZGVzY3JpYmluZyBhIG1hcHBlZCBidWZmZXIgcmFuZ2UuCisgKi8KKworc3RydWN0IGdsX3RyYW5zZm9ybV9mZWVkYmFja192YXJ5aW5nX2luZm8KK3sKKyAgIGNoYXIgKk5hbWU7CisgICBHTGVudW0gVHlwZTsKKyAgIEdMaW50IFNpemU7Cit9OworCisKKy8qKgorICogUGVyLW91dHB1dCBpbmZvIHZlcnRleCBzaGFkZXJzIGZvciB0cmFuc2Zvcm0gZmVlZGJhY2suCisgKi8KK3N0cnVjdCBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfb3V0cHV0Cit7CisgICB1bnNpZ25lZCBPdXRwdXRSZWdpc3RlcjsKKyAgIHVuc2lnbmVkIE91dHB1dEJ1ZmZlcjsKKyAgIHVuc2lnbmVkIE51bUNvbXBvbmVudHM7CisKKyAgIC8qKiBvZmZzZXQgKGluIERXT1JEcykgb2YgdGhpcyBvdXRwdXQgd2l0aGluIHRoZSBpbnRlcmxlYXZlZCBzdHJ1Y3R1cmUgKi8KKyAgIHVuc2lnbmVkIERzdE9mZnNldDsKKworICAgLyoqCisgICAgKiBPZmZzZXQgaW50byB0aGUgb3V0cHV0IHJlZ2lzdGVyIG9mIHRoZSBkYXRhIHRvIG91dHB1dC4gIEZvciBleGFtcGxlLAorICAgICogaWYgTnVtQ29tcG9uZW50cyBpcyAyIGFuZCBDb21wb25lbnRPZmZzZXQgaXMgMSwgdGhlbiB0aGUgZGF0YSB0bworICAgICogb2Zmc2V0IGlzIGluIHRoZSB5IGFuZCB6IGNvbXBvbmVudHMgb2YgdGhlIG91dHB1dCByZWdpc3Rlci4KKyAgICAqLworICAgdW5zaWduZWQgQ29tcG9uZW50T2Zmc2V0OworfTsKKworCisvKiogUG9zdC1saW5rIHRyYW5zZm9ybSBmZWVkYmFjayBpbmZvLiAqLworc3RydWN0IGdsX3RyYW5zZm9ybV9mZWVkYmFja19pbmZvCit7CisgICB1bnNpZ25lZCBOdW1PdXRwdXRzOworCisgICAvKioKKyAgICAqIE51bWJlciBvZiB0cmFuc2Zvcm0gZmVlZGJhY2sgYnVmZmVycyBpbiB1c2UgYnkgdGhpcyBwcm9ncmFtLgorICAgICovCisgICB1bnNpZ25lZCBOdW1CdWZmZXJzOworCisgICBzdHJ1Y3QgZ2xfdHJhbnNmb3JtX2ZlZWRiYWNrX291dHB1dCAqT3V0cHV0czsKKworICAgLyoqIFRyYW5zZm9ybSBmZWVkYmFjayB2YXJ5aW5ncyB1c2VkIGZvciB0aGUgbGlua2luZyBvZiB0aGlzIHNoYWRlciBwcm9ncmFtLgorICAgICoKKyAgICAqIFVzZSBmb3IgZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoKS4KKyAgICAqLworICAgc3RydWN0IGdsX3RyYW5zZm9ybV9mZWVkYmFja192YXJ5aW5nX2luZm8gKlZhcnlpbmdzOworICAgR0xpbnQgTnVtVmFyeWluZzsKKworICAgLyoqCisgICAgKiBUb3RhbCBudW1iZXIgb2YgY29tcG9uZW50cyBzdG9yZWQgaW4gZWFjaCBidWZmZXIuICBUaGlzIG1heSBiZSB1c2VkIGJ5CisgICAgKiBoYXJkd2FyZSBiYWNrLWVuZHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHN0cmlkZSB3aGVuIGludGVybGVhdmluZworICAgICogbXVsdGlwbGUgdHJhbnNmb3JtIGZlZWRiYWNrIG91dHB1dHMgaW4gdGhlIHNhbWUgYnVmZmVyLgorICAgICovCisgICB1bnNpZ25lZCBCdWZmZXJTdHJpZGVbTUFYX0ZFRURCQUNLX0JVRkZFUlNdOworfTsKKworCisvKioKKyAqIE5hbWVzIG9mIHRoZSB2YXJpb3VzIHZlcnRleC9mcmFnbWVudCBwcm9ncmFtIHJlZ2lzdGVyIGZpbGVzLCBldGMuCisgKgorICogTk9URTogZmlyc3QgZm91ciB0b2tlbnMgbXVzdCBmaXQgaW50byAyIGJpdHMgKHNlZSB0X3ZiX2FyYnByb2dyYW0uYykKKyAqIEFsbCB2YWx1ZXMgc2hvdWxkIGZpdCBpbiBhIDQtYml0IGZpZWxkLgorICoKKyAqIE5PVEU6IFBST0dSQU1fU1RBVEVfVkFSLCBQUk9HUkFNX0NPTlNUQU5ULCBhbmQgUFJPR1JBTV9VTklGT1JNIGNhbiBhbGwgYmUKKyAqIGNvbnNpZGVyZWQgdG8gYmUgInVuaWZvcm0iIHZhcmlhYmxlcyBzaW5jZSB0aGV5IGNhbiBvbmx5IGJlIHNldCBvdXRzaWRlCisgKiBnbEJlZ2luL0VuZC4gIFRoZXkncmUgYWxzbyBhbGwgc3RvcmVkIGluIHRoZSBzYW1lIFBhcmFtZXRlcnMgYXJyYXkuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgUFJPR1JBTV9URU1QT1JBUlksICAgLyoqPCBtYWNoaW5lLT5UZW1wb3JhcnlbXSAqLworICAgUFJPR1JBTV9BUlJBWSwgICAgICAgLyoqPCBBcnJheXMgJiBNYXRyaXhlcyAqLworICAgUFJPR1JBTV9JTlBVVCwgICAgICAgLyoqPCBtYWNoaW5lLT5JbnB1dHNbXSAqLworICAgUFJPR1JBTV9PVVRQVVQsICAgICAgLyoqPCBtYWNoaW5lLT5PdXRwdXRzW10gKi8KKyAgIFBST0dSQU1fU1RBVEVfVkFSLCAgIC8qKjwgZ2xfcHJvZ3JhbS0+UGFyYW1ldGVyc1tdICovCisgICBQUk9HUkFNX0NPTlNUQU5ULCAgICAvKio8IGdsX3Byb2dyYW0tPlBhcmFtZXRlcnNbXSAqLworICAgUFJPR1JBTV9VTklGT1JNLCAgICAgLyoqPCBnbF9wcm9ncmFtLT5QYXJhbWV0ZXJzW10gKi8KKyAgIFBST0dSQU1fV1JJVEVfT05MWSwgIC8qKjwgQSBkdW1teSwgd3JpdGUtb25seSByZWdpc3RlciAqLworICAgUFJPR1JBTV9BRERSRVNTLCAgICAgLyoqPCBtYWNoaW5lLT5BZGRyZXNzUmVnICovCisgICBQUk9HUkFNX1NBTVBMRVIsICAgICAvKio8IGZvciBzaGFkZXIgc2FtcGxlcnMsIGNvbXBpbGUtdGltZSBvbmx5ICovCisgICBQUk9HUkFNX1NZU1RFTV9WQUxVRSwvKio8IEluc3RhbmNlSWQsIFByaW1pdGl2ZUlELCBldGMuICovCisgICBQUk9HUkFNX1VOREVGSU5FRCwgICAvKio8IEludmFsaWQvVEJEIHZhbHVlICovCisgICBQUk9HUkFNX0ZJTEVfTUFYCit9IGdsX3JlZ2lzdGVyX2ZpbGU7CisKKworLyoqCisgKiBJZiB0aGUgcmVnaXN0ZXIgZmlsZSBpcyBQUk9HUkFNX1NZU1RFTV9WQUxVRSwgdGhlIHJlZ2lzdGVyIGluZGV4IHdpbGwgYmUKKyAqIG9uZSBvZiB0aGVzZSB2YWx1ZXMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgU1lTVEVNX1ZBTFVFX0ZST05UX0ZBQ0UsICAgICAvKio8IEZyYWdtZW50IHNoYWRlciBvbmx5IChub3QgZG9uZSB5ZXQpICovCisgICBTWVNURU1fVkFMVUVfVkVSVEVYX0lELCAgICAgIC8qKjwgVmVydGV4IHNoYWRlciBvbmx5ICovCisgICBTWVNURU1fVkFMVUVfSU5TVEFOQ0VfSUQsICAgIC8qKjwgVmVydGV4IHNoYWRlciBvbmx5ICovCisgICBTWVNURU1fVkFMVUVfU0FNUExFX0lELCAgICAgIC8qKjwgRnJhZ21lbnQgc2hhZGVyIG9ubHkgKi8KKyAgIFNZU1RFTV9WQUxVRV9TQU1QTEVfUE9TLCAgICAgLyoqPCBGcmFnbWVudCBzaGFkZXIgb25seSAqLworICAgU1lTVEVNX1ZBTFVFX1NBTVBMRV9NQVNLX0lOLCAvKio8IEZyYWdtZW50IHNoYWRlciBvbmx5ICovCisgICBTWVNURU1fVkFMVUVfSU5WT0NBVElPTl9JRCwgIC8qKjwgR2VvbWV0cnkgc2hhZGVyIG9ubHkgKi8KKyAgIFNZU1RFTV9WQUxVRV9NQVggICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdmFsdWVzICovCit9IGdsX3N5c3RlbV92YWx1ZTsKKworCisvKioKKyAqIFRoZSBwb3NzaWJsZSBpbnRlcnBvbGF0aW9uIHF1YWxpZmllcnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGZyYWdtZW50CisgKiBzaGFkZXIgaW5wdXQgaW4gR0xTTC4KKyAqCisgKiBOb3RlOiBJTlRFUlBfUVVBTElGSUVSX05PTkUgbXVzdCBiZSAwIHNvIHRoYXQgbWVtc2V0dGluZyB0aGUKKyAqIGdsX2ZyYWdtZW50X3Byb2dyYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gMCBjYXVzZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisgKi8KK2VudW0gZ2xzbF9pbnRlcnBfcXVhbGlmaWVyCit7CisgICBJTlRFUlBfUVVBTElGSUVSX05PTkUgPSAwLAorICAgSU5URVJQX1FVQUxJRklFUl9TTU9PVEgsCisgICBJTlRFUlBfUVVBTElGSUVSX0ZMQVQsCisgICBJTlRFUlBfUVVBTElGSUVSX05PUEVSU1BFQ1RJVkUsCisgICBJTlRFUlBfUVVBTElGSUVSX0NPVU5UIC8qKjwgTnVtYmVyIG9mIGludGVycG9sYXRpb24gcXVhbGlmaWVycyAqLworfTsKKworCisvKioKKyAqIFxicmllZiBMYXlvdXQgcXVhbGlmaWVycyBmb3IgZ2xfRnJhZ0RlcHRoLgorICoKKyAqIEV4dGVuc2lvbiBBTURfY29uc2VydmF0aXZlX2RlcHRoIGFsbG93cyBnbF9GcmFnRGVwdGggdG8gYmUgcmVkZWNsYXJlZCB3aXRoCisgKiBhIGxheW91dCBxdWFsaWZpZXIuCisgKgorICogXHNlZSBlbnVtIGlyX2RlcHRoX2xheW91dAorICovCitlbnVtIGdsX2ZyYWdfZGVwdGhfbGF5b3V0Cit7CisgICBGUkFHX0RFUFRIX0xBWU9VVF9OT05FLCAvKio8IE5vIGxheW91dCBpcyBzcGVjaWZpZWQuICovCisgICBGUkFHX0RFUFRIX0xBWU9VVF9BTlksCisgICBGUkFHX0RFUFRIX0xBWU9VVF9HUkVBVEVSLAorICAgRlJBR19ERVBUSF9MQVlPVVRfTEVTUywKKyAgIEZSQUdfREVQVEhfTEFZT1VUX1VOQ0hBTkdFRAorfTsKKworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFueSBraW5kIG9mIHByb2dyYW0gb2JqZWN0CisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtCit7CisgICBHTHVpbnQgSWQ7CisgICBHTHVieXRlICpTdHJpbmc7ICAvKio8IE51bGwtdGVybWluYXRlZCBwcm9ncmFtIHRleHQgKi8KKyAgIC8vIEx1bmFyRzogUmVtb3ZlIC0gVksgZG9lcyBub3QgdXNlIHJlZmVyZW5jZSBjb3VudHMKKyAgIC8vIEdMaW50IFJlZkNvdW50OworICAgR0xlbnVtIFRhcmdldDsgICAgLyoqPCBHTF9WRVJURVgvRlJBR01FTlRfUFJPR1JBTV9BUkIsIEdMX0dFT01FVFJZX1BST0dSQU1fTlYgKi8KKyAgIEdMZW51bSBGb3JtYXQ7ICAgIC8qKjwgU3RyaW5nIGVuY29kaW5nIGZvcm1hdCAqLworCisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqSW5zdHJ1Y3Rpb25zOworCisgICBHTGJpdGZpZWxkNjQgSW5wdXRzUmVhZDsgICAgIC8qKjwgQml0bWFzayBvZiB3aGljaCBpbnB1dCByZWdzIGFyZSByZWFkICovCisgICBHTGJpdGZpZWxkNjQgT3V0cHV0c1dyaXR0ZW47IC8qKjwgQml0bWFzayBvZiB3aGljaCBvdXRwdXQgcmVncyBhcmUgd3JpdHRlbiAqLworICAgR0xiaXRmaWVsZCBTeXN0ZW1WYWx1ZXNSZWFkOyAgIC8qKjwgQml0bWFzayBvZiBTWVNURU1fVkFMVUVfeCBpbnB1dHMgdXNlZCAqLworICAgR0xiaXRmaWVsZCBJbnB1dEZsYWdzW01BWF9QUk9HUkFNX0lOUFVUU107ICAgLyoqPCBQUk9HX1BBUkFNX0JJVF94IGZsYWdzICovCisgICBHTGJpdGZpZWxkIE91dHB1dEZsYWdzW01BWF9QUk9HUkFNX09VVFBVVFNdOyAvKio8IFBST0dfUEFSQU1fQklUX3ggZmxhZ3MgKi8KKyAgIEdMYml0ZmllbGQgVGV4dHVyZXNVc2VkW01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTXTsgIC8qKjwgVEVYVFVSRV94X0JJVCBiaXRtYXNrICovCisgICBHTGJpdGZpZWxkIFNhbXBsZXJzVXNlZDsgICAvKio8IEJpdGZpZWxkIG9mIHdoaWNoIHNhbXBsZXJzIGFyZSB1c2VkICovCisgICBHTGJpdGZpZWxkIFNoYWRvd1NhbXBsZXJzOyAvKio8IFRleHR1cmUgdW5pdHMgdXNlZCBmb3Igc2hhZG93IHNhbXBsaW5nLiAqLworCisgICBHTGJvb2xlYW4gVXNlc0dhdGhlcjsgLyoqPCBEb2VzIHRoaXMgcHJvZ3JhbSB1c2UgZ2F0aGVyNCBhdCBhbGw/ICovCisKKyAgIC8qKgorICAgICogRm9yIHZlcnRleCBhbmQgZ2VvbWV0cnkgc2hhZGVycywgdHJ1ZSBpZiB0aGUgcHJvZ3JhbSB1c2VzIHRoZQorICAgICogZ2xfQ2xpcERpc3RhbmNlIG91dHB1dC4gIElnbm9yZWQgZm9yIGZyYWdtZW50IHNoYWRlcnMuCisgICAgKi8KKyAgIEdMYm9vbGVhbiBVc2VzQ2xpcERpc3RhbmNlT3V0OworCisKKyAgIC8qKiBOYW1lZCBwYXJhbWV0ZXJzLCBjb25zdGFudHMsIGV0Yy4gZnJvbSBwcm9ncmFtIHRleHQgKi8KKyAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpQYXJhbWV0ZXJzOworCisgICAvKioKKyAgICAqIExvY2FsIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgcHJvZ3JhbS4KKyAgICAqCisgICAgKiBJdCdzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBiZWNhdXNlIGl0IGlzIHJhcmVseSB1c2VkIChqdXN0CisgICAgKiBhc3NlbWJseS1zdHlsZSBwcm9ncmFtcyksIGFuZCBNQVhfUFJPR1JBTV9MT0NBTF9QQVJBTVMgZW50cmllcyBvbmNlIGl0J3MKKyAgICAqIGFsbG9jYXRlZC4KKyAgICAqLworICAgR0xmbG9hdCAoKkxvY2FsUGFyYW1zKVs0XTsKKworICAgLyoqIE1hcCBmcm9tIHNhbXBsZXIgdW5pdCB0byB0ZXh0dXJlIHVuaXQgKHNldCBieSBnbFVuaWZvcm0xaSgpKSAqLworICAgLy8gTHVuYXJHIC0gQnVtcCB0byAzMiBiaXRzIHRvIGhvbGQgYmluZGluZyBhbmQgc2V0CisgICBHTHVpbnQgU2FtcGxlclVuaXRzW01BWF9TQU1QTEVSU107CisKKyAgIC8qKiBCaXRtYXNrIG9mIHdoaWNoIHJlZ2lzdGVyIGZpbGVzIGFyZSByZWFkL3dyaXR0ZW4gd2l0aCBpbmRpcmVjdAorICAgICogYWRkcmVzc2luZy4gIE1hc2sgb2YgKDEgPDwgUFJPR1JBTV94KSBiaXRzLgorICAgICovCisgICBHTGJpdGZpZWxkIEluZGlyZWN0UmVnaXN0ZXJGaWxlczsKKworICAgLyoqIExvZ2ljYWwgY291bnRzICovCisgICAvKkB7Ki8KKyAgIEdMdWludCBOdW1JbnN0cnVjdGlvbnM7CisgICBHTHVpbnQgTnVtVGVtcG9yYXJpZXM7CisgICBHTHVpbnQgTnVtUGFyYW1ldGVyczsKKyAgIEdMdWludCBOdW1BdHRyaWJ1dGVzOworICAgR0x1aW50IE51bUFkZHJlc3NSZWdzOworICAgR0x1aW50IE51bUFsdUluc3RydWN0aW9uczsKKyAgIEdMdWludCBOdW1UZXhJbnN0cnVjdGlvbnM7CisgICBHTHVpbnQgTnVtVGV4SW5kaXJlY3Rpb25zOworICAgLypAfSovCisgICAvKiogTmF0aXZlLCBhY3R1YWwgaC93IGNvdW50cyAqLworICAgLypAeyovCisgICBHTHVpbnQgTnVtTmF0aXZlSW5zdHJ1Y3Rpb25zOworICAgR0x1aW50IE51bU5hdGl2ZVRlbXBvcmFyaWVzOworICAgR0x1aW50IE51bU5hdGl2ZVBhcmFtZXRlcnM7CisgICBHTHVpbnQgTnVtTmF0aXZlQXR0cmlidXRlczsKKyAgIEdMdWludCBOdW1OYXRpdmVBZGRyZXNzUmVnczsKKyAgIEdMdWludCBOdW1OYXRpdmVBbHVJbnN0cnVjdGlvbnM7CisgICBHTHVpbnQgTnVtTmF0aXZlVGV4SW5zdHJ1Y3Rpb25zOworICAgR0x1aW50IE51bU5hdGl2ZVRleEluZGlyZWN0aW9uczsKKyAgIC8qQH0qLworfTsKKworCisvKiogVmVydGV4IHByb2dyYW0gb2JqZWN0ICovCitzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0KK3sKKyAgIHN0cnVjdCBnbF9wcm9ncmFtIEJhc2U7ICAgLyoqPCBiYXNlIGNsYXNzICovCisgICBHTGJvb2xlYW4gSXNQb3NpdGlvbkludmFyaWFudDsKK307CisKKworLyoqIEdlb21ldHJ5IHByb2dyYW0gb2JqZWN0ICovCitzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbQoreworICAgc3RydWN0IGdsX3Byb2dyYW0gQmFzZTsgICAvKio8IGJhc2UgY2xhc3MgKi8KKworICAgR0xpbnQgVmVydGljZXNJbjsKKyAgIEdMaW50IFZlcnRpY2VzT3V0OworICAgR0xpbnQgSW52b2NhdGlvbnM7CisgICBHTGVudW0gSW5wdXRUeXBlOyAgLyoqPCBHTF9QT0lOVFMsIEdMX0xJTkVTLCBHTF9MSU5FU19BREpBQ0VOQ1lfQVJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVFJJQU5HTEVTLCBvciBHTF9UUklBTkdMRVNfQURKQUNFTkNZX0FSQiAqLworICAgR0xlbnVtIE91dHB1dFR5cGU7IC8qKjwgR0xfUE9JTlRTLCBHTF9MSU5FX1NUUklQIG9yIEdMX1RSSUFOR0xFX1NUUklQICovCisgICBHTGJvb2xlYW4gVXNlc0VuZFByaW1pdGl2ZTsKK307CisKKworLyoqIEZyYWdtZW50IHByb2dyYW0gb2JqZWN0ICovCitzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbQoreworICAgc3RydWN0IGdsX3Byb2dyYW0gQmFzZTsgICAvKio8IGJhc2UgY2xhc3MgKi8KKyAgIEdMYm9vbGVhbiBVc2VzS2lsbDsgICAgICAgICAgLyoqPCBzaGFkZXIgdXNlcyBLSUwgaW5zdHJ1Y3Rpb24gKi8KKyAgIEdMYm9vbGVhbiBVc2VzREZkeTsgICAgICAgICAgLyoqPCBzaGFkZXIgdXNlcyBERFkgaW5zdHJ1Y3Rpb24gKi8KKyAgIEdMYm9vbGVhbiBPcmlnaW5VcHBlckxlZnQ7CisgICBHTGJvb2xlYW4gUGl4ZWxDZW50ZXJJbnRlZ2VyOworICAgZW51bSBnbF9mcmFnX2RlcHRoX2xheW91dCBGcmFnRGVwdGhMYXlvdXQ7CisKKyAgIC8qKgorICAgICogR0xTTCBpbnRlcnBvbGF0aW9uIHF1YWxpZmllciBhc3NvY2lhdGVkIHdpdGggZWFjaCBmcmFnbWVudCBzaGFkZXIgaW5wdXQuCisgICAgKiBGb3IgaW5wdXRzIHRoYXQgZG8gbm90IGhhdmUgYW4gaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXIgc3BlY2lmaWVkIGluCisgICAgKiBHTFNMLCB0aGUgdmFsdWUgaXMgSU5URVJQX1FVQUxJRklFUl9OT05FLgorICAgICovCisgICBlbnVtIGdsc2xfaW50ZXJwX3F1YWxpZmllciBJbnRlcnBRdWFsaWZpZXJbVkFSWUlOR19TTE9UX01BWF07CisKKyAgIC8qKgorICAgICogQml0ZmllbGQgaW5kaWNhdGluZywgZm9yIGVhY2ggZnJhZ21lbnQgc2hhZGVyIGlucHV0LCAxIGlmIHRoYXQgaW5wdXQKKyAgICAqIHVzZXMgY2VudHJvaWQgaW50ZXJwb2xhdGlvbiwgMCBvdGhlcndpc2UuICBVbnVzZWQgaW5wdXRzIGFyZSAwLgorICAgICovCisgICBHTGJpdGZpZWxkNjQgSXNDZW50cm9pZDsKKworICAgLyoqCisgICAgKiBCaXRmaWVsZCBpbmRpY2F0aW5nLCBmb3IgZWFjaCBmcmFnbWVudCBzaGFkZXIgaW5wdXQsIDEgaWYgdGhhdCBpbnB1dAorICAgICogdXNlcyBzYW1wbGUgaW50ZXJwb2xhdGlvbiwgMCBvdGhlcndpc2UuICBVbnVzZWQgaW5wdXRzIGFyZSAwLgorICAgICovCisgICBHTGJpdGZpZWxkNjQgSXNTYW1wbGU7Cit9OworCisKKy8qKiBDb21wdXRlIHByb2dyYW0gb2JqZWN0ICovCitzdHJ1Y3QgZ2xfY29tcHV0ZV9wcm9ncmFtCit7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSBCYXNlOyAgIC8qKjwgYmFzZSBjbGFzcyAqLworCisgICAvKioKKyAgICAqIFNpemUgc3BlY2lmaWVkIHVzaW5nIGxvY2FsX3NpemVfe3gseSx6fS4KKyAgICAqLworICAgdW5zaWduZWQgTG9jYWxTaXplWzNdOworfTsKKworCisvKioKKyAqIFN0YXRlIGNvbW1vbiB0byB2ZXJ0ZXggYW5kIGZyYWdtZW50IHByb2dyYW1zLgorICovCitzdHJ1Y3QgZ2xfcHJvZ3JhbV9zdGF0ZQoreworICAgR0xpbnQgRXJyb3JQb3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX0FSQi9OViAqLworICAgY29uc3QgY2hhciAqRXJyb3JTdHJpbmc7ICAgICAgICAgICAgICAvKiBHTF9QUk9HUkFNX0VSUk9SX1NUUklOR19BUkIvTlYgKi8KK307CisKKworLyoqCisgKiBDb250ZXh0IHN0YXRlIGZvciB2ZXJ0ZXggcHJvZ3JhbXMuCisgKi8KK3N0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbV9zdGF0ZQoreworICAgR0xib29sZWFuIEVuYWJsZWQ7ICAgICAgICAgICAgLyoqPCBVc2VyLXNldCBHTF9WRVJURVhfUFJPR1JBTV9BUkIvTlYgZmxhZyAqLworICAgR0xib29sZWFuIF9FbmFibGVkOyAgICAgICAgICAgLyoqPCBFbmFibGVkIGFuZCBfdmFsaWRfIHVzZXIgcHJvZ3JhbT8gKi8KKyAgIEdMYm9vbGVhbiBQb2ludFNpemVFbmFibGVkOyAgIC8qKjwgR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9BUkIvTlYgKi8KKyAgIEdMYm9vbGVhbiBUd29TaWRlRW5hYmxlZDsgICAgIC8qKjwgR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfQVJCL05WICovCisgICAvKiogQ29tcHV0ZWQgdHdvIHNpZGVkIGxpZ2h0aW5nIGZvciBmaXhlZCBmdW5jdGlvbi9wcm9ncmFtcy4gKi8KKyAgIEdMYm9vbGVhbiBfVHdvU2lkZUVuYWJsZWQ7CisgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKkN1cnJlbnQ7ICAvKio8IFVzZXItYm91bmQgdmVydGV4IHByb2dyYW0gKi8KKworICAgLyoqIEN1cnJlbnRseSBlbmFibGVkIGFuZCB2YWxpZCB2ZXJ0ZXggcHJvZ3JhbSAoaW5jbHVkaW5nIGludGVybmFsCisgICAgKiBwcm9ncmFtcywgdXNlci1kZWZpbmVkIHZlcnRleCBwcm9ncmFtcyBhbmQgR0xTTCB2ZXJ0ZXggc2hhZGVycykuCisgICAgKiBUaGlzIGlzIHRoZSBwcm9ncmFtIHdlIG11c3QgdXNlIHdoZW4gcmVuZGVyaW5nLgorICAgICovCisgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKl9DdXJyZW50OworCisgICBHTGZsb2F0IFBhcmFtZXRlcnNbTUFYX1BST0dSQU1fRU5WX1BBUkFNU11bNF07IC8qKjwgRW52IHBhcmFtcyAqLworCisgICAvKiogU2hvdWxkIGZpeGVkLWZ1bmN0aW9uIFQmTCBiZSBpbXBsZW1lbnRlZCB3aXRoIGEgdmVydGV4IHByb2c/ICovCisgICBHTGJvb2xlYW4gX01haW50YWluVG5sUHJvZ3JhbTsKKworICAgLyoqIFByb2dyYW0gdG8gZW11bGF0ZSBmaXhlZC1mdW5jdGlvbiBUJkwgKHNlZSBhYm92ZSkgKi8KKyAgIHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqX1RubFByb2dyYW07CisKKyAgIC8qKiBDYWNoZSBvZiBmaXhlZC1mdW5jdGlvbiBwcm9ncmFtcyAqLworICAgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKkNhY2hlOworCisgICBHTGJvb2xlYW4gX092ZXJyaWRlbjsKK307CisKKworLyoqCisgKiBDb250ZXh0IHN0YXRlIGZvciBnZW9tZXRyeSBwcm9ncmFtcy4KKyAqLworc3RydWN0IGdsX2dlb21ldHJ5X3Byb2dyYW1fc3RhdGUKK3sKKyAgIEdMYm9vbGVhbiBFbmFibGVkOyAgICAgICAgICAgICAgIC8qKjwgR0xfQVJCX0dFT01FVFJZX1NIQURFUjQgKi8KKyAgIEdMYm9vbGVhbiBfRW5hYmxlZDsgICAgICAgICAgICAgIC8qKjwgRW5hYmxlZCBhbmQgdmFsaWQgcHJvZ3JhbT8gKi8KKyAgIHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICpDdXJyZW50OyAgLyoqPCB1c2VyLWJvdW5kIGdlb21ldHJ5IHByb2dyYW0gKi8KKworICAgLyoqIEN1cnJlbnRseSBlbmFibGVkIGFuZCB2YWxpZCBwcm9ncmFtIChpbmNsdWRpbmcgaW50ZXJuYWwgcHJvZ3JhbXMKKyAgICAqIGFuZCBjb21waWxlZCBzaGFkZXIgcHJvZ3JhbXMpLgorICAgICovCisgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqX0N1cnJlbnQ7CisKKyAgIEdMZmxvYXQgUGFyYW1ldGVyc1tNQVhfUFJPR1JBTV9FTlZfUEFSQU1TXVs0XTsgLyoqPCBFbnYgcGFyYW1zICovCisKKyAgIC8qKiBDYWNoZSBvZiBmaXhlZC1mdW5jdGlvbiBwcm9ncmFtcyAqLworICAgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKkNhY2hlOworfTsKKworLyoqCisgKiBDb250ZXh0IHN0YXRlIGZvciBmcmFnbWVudCBwcm9ncmFtcy4KKyAqLworc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW1fc3RhdGUKK3sKKyAgIEdMYm9vbGVhbiBFbmFibGVkOyAgICAgLyoqPCBVc2VyLXNldCBmcmFnbWVudCBwcm9ncmFtIGVuYWJsZSBmbGFnICovCisgICBHTGJvb2xlYW4gX0VuYWJsZWQ7ICAgIC8qKjwgRW5hYmxlZCBhbmQgX3ZhbGlkXyB1c2VyIHByb2dyYW0/ICovCisgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqQ3VycmVudDsgIC8qKjwgVXNlci1ib3VuZCBmcmFnbWVudCBwcm9ncmFtICovCisKKyAgIC8qKiBDdXJyZW50bHkgZW5hYmxlZCBhbmQgdmFsaWQgZnJhZ21lbnQgcHJvZ3JhbSAoaW5jbHVkaW5nIGludGVybmFsCisgICAgKiBwcm9ncmFtcywgdXNlci1kZWZpbmVkIGZyYWdtZW50IHByb2dyYW1zIGFuZCBHTFNMIGZyYWdtZW50IHNoYWRlcnMpLgorICAgICogVGhpcyBpcyB0aGUgcHJvZ3JhbSB3ZSBtdXN0IHVzZSB3aGVuIHJlbmRlcmluZy4KKyAgICAqLworICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKl9DdXJyZW50OworCisgICBHTGZsb2F0IFBhcmFtZXRlcnNbTUFYX1BST0dSQU1fRU5WX1BBUkFNU11bNF07IC8qKjwgRW52IHBhcmFtcyAqLworCisgICAvKiogU2hvdWxkIGZpeGVkLWZ1bmN0aW9uIHRleHR1cmluZyBiZSBpbXBsZW1lbnRlZCB3aXRoIGEgZnJhZ21lbnQgcHJvZz8gKi8KKyAgIEdMYm9vbGVhbiBfTWFpbnRhaW5UZXhFbnZQcm9ncmFtOworCisgICAvKiogUHJvZ3JhbSB0byBlbXVsYXRlIGZpeGVkLWZ1bmN0aW9uIHRleHR1cmUgZW52L2NvbWJpbmUgKHNlZSBhYm92ZSkgKi8KKyAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpfVGV4RW52UHJvZ3JhbTsKKworICAgLyoqIENhY2hlIG9mIGZpeGVkLWZ1bmN0aW9uIHByb2dyYW1zICovCisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9jYWNoZSAqQ2FjaGU7Cit9OworCisKKy8qKgorICogQVRJX2ZyYWdtZW50X3NoYWRlciBydW50aW1lIHN0YXRlCisgKi8KKyNkZWZpbmUgQVRJX0ZTX0lOUFVUX1BSSU1BUlkgMAorI2RlZmluZSBBVElfRlNfSU5QVVRfU0VDT05EQVJZIDEKKworc3RydWN0IGF0aWZzX2luc3RydWN0aW9uOworc3RydWN0IGF0aWZzX3NldHVwaW5zdDsKKworLyoqCisgKiBBVEkgZnJhZ21lbnQgc2hhZGVyCisgKi8KK3N0cnVjdCBhdGlfZnJhZ21lbnRfc2hhZGVyCit7CisgICBHTHVpbnQgSWQ7CisgICBHTGludCBSZWZDb3VudDsKKyAgIHN0cnVjdCBhdGlmc19pbnN0cnVjdGlvbiAqSW5zdHJ1Y3Rpb25zWzJdOworICAgc3RydWN0IGF0aWZzX3NldHVwaW5zdCAqU2V0dXBJbnN0WzJdOworICAgR0xmbG9hdCBDb25zdGFudHNbOF1bNF07CisgICBHTGJpdGZpZWxkIExvY2FsQ29uc3REZWY7ICAvKio8IEluZGljYXRlcyB3aGljaCBjb25zdGFudHMgaGF2ZSBiZWVuIHNldCAqLworICAgR0x1Ynl0ZSBudW1Bcml0aEluc3RyWzJdOworICAgR0x1Ynl0ZSByZWdzQXNzaWduZWRbMl07CisgICBHTHVieXRlIE51bVBhc3NlczsgICAgICAgICAvKio8IDEgb3IgMiAqLworICAgR0x1Ynl0ZSBjdXJfcGFzczsKKyAgIEdMdWJ5dGUgbGFzdF9vcHR5cGU7CisgICBHTGJvb2xlYW4gaW50ZXJwaW5wMTsKKyAgIEdMYm9vbGVhbiBpc1ZhbGlkOworICAgR0x1aW50IHN3aXp6bGVycTsKK307CisKKy8qKgorICogQ29udGV4dCBzdGF0ZSBmb3IgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorICovCitzdHJ1Y3QgZ2xfYXRpX2ZyYWdtZW50X3NoYWRlcl9zdGF0ZQoreworICAgR0xib29sZWFuIEVuYWJsZWQ7CisgICBHTGJvb2xlYW4gX0VuYWJsZWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBlbmFibGVkIGFuZCB2YWxpZCBzaGFkZXI/ICovCisgICBHTGJvb2xlYW4gQ29tcGlsaW5nOworICAgR0xmbG9hdCBHbG9iYWxDb25zdGFudHNbOF1bNF07CisgICBzdHJ1Y3QgYXRpX2ZyYWdtZW50X3NoYWRlciAqQ3VycmVudDsKK307CisKKworLyoqIFNldCBieSAjcHJhZ21hIGRpcmVjdGl2ZXMgKi8KK3N0cnVjdCBnbF9zbF9wcmFnbWFzCit7CisgICBHTGJvb2xlYW4gSWdub3JlT3B0aW1pemU7ICAvKio8IGlnbm9yZSAjcHJhZ21hIG9wdGltaXplKG9uL29mZikgPyAqLworICAgR0xib29sZWFuIElnbm9yZURlYnVnOyAgICAgLyoqPCBpZ25vcmUgI3ByYWdtYSBkZWJ1Zyhvbi9vZmYpID8gKi8KKyAgIEdMYm9vbGVhbiBPcHRpbWl6ZTsgIC8qKjwgZGVmYXVsdHMgb24gKi8KKyAgIEdMYm9vbGVhbiBEZWJ1ZzsgICAgIC8qKjwgZGVmYXVsdHMgb2ZmICovCit9OworCisKKy8qKgorICogQSBHTFNMIHZlcnRleCBvciBmcmFnbWVudCBzaGFkZXIgb2JqZWN0LgorICovCitzdHJ1Y3QgZ2xfc2hhZGVyCit7CisgICAvKiogR0xfRlJBR01FTlRfU0hBREVSIHx8IEdMX1ZFUlRFWF9TSEFERVIgfHwgR0xfR0VPTUVUUllfU0hBREVSX0FSQi4KKyAgICAqIE11c3QgYmUgdGhlIGZpcnN0IGZpZWxkLgorICAgICovCisgICBHTGVudW0gVHlwZTsKKyAgIGdsX3NoYWRlcl9zdGFnZSBTdGFnZTsKKyAgIEdMdWludCBOYW1lOyAgLyoqPCBBS0EgdGhlIGhhbmRsZSAqLworICAgR0xjaGFyICpMYWJlbDsgICAvKio8IEdMX0tIUl9kZWJ1ZyAqLworICAgLy8gTHVuYXJHOiBSZW1vdmUgLSBWSyBkb2VzIG5vdCB1c2UgcmVmZXJlbmNlIGNvdW50cworICAgLy8gR0xpbnQgUmVmQ291bnQ7CisgICBHTGJvb2xlYW4gRGVsZXRlUGVuZGluZzsKKyAgIEdMYm9vbGVhbiBDb21waWxlU3RhdHVzOworICAgY29uc3QgR0xjaGFyICpTb3VyY2U7ICAvKio8IFNQViBvciBHTFNMIHNvdXJjZSBjb2RlICovCisgICBHTHVpbnQgU2l6ZTsgICAgICAgICAvKio8IFNQViBzaXplICovCisgICBHTHVpbnQgU291cmNlQ2hlY2tzdW07ICAgICAgIC8qKjwgZm9yIGRlYnVnL2xvZ2dpbmcgcHVycG9zZXMgKi8KKyAgIHN0cnVjdCBnbF9wcm9ncmFtICpQcm9ncmFtOyAgLyoqPCBQb3N0LWNvbXBpbGUgYXNzZW1ibHkgY29kZSAqLworICAgR0xjaGFyICpJbmZvTG9nOworICAgc3RydWN0IGdsX3NsX3ByYWdtYXMgUHJhZ21hczsKKworICAgdW5zaWduZWQgVmVyc2lvbjsgICAgICAgLyoqPCBHTFNMIHZlcnNpb24gdXNlZCBmb3IgbGlua2luZyAqLworICAgR0xib29sZWFuIElzRVM7ICAgICAgICAgLyoqPCBUcnVlIGlmIHRoaXMgc2hhZGVyIHVzZXMgR0xTTCBFUyAqLworCisgICAvKioKKyAgICAqIFxuYW1lIFNhbXBsZXIgdHJhY2tpbmcKKyAgICAqCisgICAgKiBcbm90ZSBFYWNoIG9mIHRoZXNlIGZpZWxkcyBpcyBvbmx5IHNldCBwb3N0LWxpbmtpbmcuCisgICAgKi8KKyAgIC8qQHsqLworICAgdW5zaWduZWQgbnVtX3NhbXBsZXJzOwkvKio8IE51bWJlciBvZiBzYW1wbGVycyB1c2VkIGJ5IHRoaXMgc2hhZGVyLiAqLworICAgR0xiaXRmaWVsZCBhY3RpdmVfc2FtcGxlcnM7CS8qKjwgQml0ZmllbGQgb2Ygd2hpY2ggc2FtcGxlcnMgYXJlIHVzZWQgKi8KKyAgIEdMYml0ZmllbGQgc2hhZG93X3NhbXBsZXJzOwkvKio8IFNhbXBsZXJzIHVzZWQgZm9yIHNoYWRvdyBzYW1wbGluZy4gKi8KKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIE1hcCBmcm9tIHNhbXBsZXIgdW5pdCB0byB0ZXh0dXJlIHVuaXQgKHNldCBieSBnbFVuaWZvcm0xaSgpKQorICAgICoKKyAgICAqIEEgc2FtcGxlciB1bml0IGlzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHNhbXBsZXIgdW5pZm9ybSBieSB0aGUgbGlua2VyLgorICAgICogVGhlIHNhbXBsZXIgdW5pdCBhc3NvY2lhdGVkIHdpdGggZWFjaCB1bmlmb3JtIGlzIHN0b3JlZCBpbiB0aGUKKyAgICAqIFxjIGdsX3VuaWZvcm1fc3RvcmFnZTo6c2FtcGxlciBmaWVsZC4KKyAgICAqLworICAgLy8gTHVuYXJHIC0gQnVtcCB0byAzMiBiaXRzIHRvIGhvbGQgYmluZGluZyBhbmQgc2V0CisgICBHTHVpbnQgU2FtcGxlclVuaXRzW01BWF9TQU1QTEVSU107CisgICAvKiogV2hpY2ggdGV4dHVyZSB0YXJnZXQgaXMgYmVpbmcgc2FtcGxlZCAoVEVYVFVSRV8xRC8yRC8zRC9ldGNfSU5ERVgpICovCisgICBnbF90ZXh0dXJlX2luZGV4IFNhbXBsZXJUYXJnZXRzW01BWF9TQU1QTEVSU107CisKKyAgIC8qKgorICAgICogTnVtYmVyIG9mIGRlZmF1bHQgdW5pZm9ybSBibG9jayBjb21wb25lbnRzIHVzZWQgYnkgdGhpcyBzaGFkZXIuCisgICAgKgorICAgICogVGhpcyBmaWVsZCBpcyBvbmx5IHNldCBwb3N0LWxpbmtpbmcuCisgICAgKi8KKyAgIHVuc2lnbmVkIG51bV91bmlmb3JtX2NvbXBvbmVudHM7CisKKyAgIC8qKgorICAgICogTnVtYmVyIG9mIGNvbWJpbmVkIHVuaWZvcm0gY29tcG9uZW50cyB1c2VkIGJ5IHRoaXMgc2hhZGVyLgorICAgICoKKyAgICAqIFRoaXMgZmllbGQgaXMgb25seSBzZXQgcG9zdC1saW5raW5nLiAgSXQgaXMgdGhlIHN1bSBvZiB0aGUgdW5pZm9ybSBibG9jaworICAgICogc2l6ZXMgZGl2aWRlZCBieSBzaXplb2YoZmxvYXQpLCBhbmQgbnVtX3VuaWZvcm1fY29tcG9lbm50cy4KKyAgICAqLworICAgdW5zaWduZWQgbnVtX2NvbWJpbmVkX3VuaWZvcm1fY29tcG9uZW50czsKKworICAgLyoqCisgICAgKiBUaGlzIHNoYWRlcidzIHVuaWZvcm0gYmxvY2sgaW5mb3JtYXRpb24uCisgICAgKgorICAgICogVGhlc2UgZmllbGRzIGFyZSBvbmx5IHNldCBwb3N0LWxpbmtpbmcuCisgICAgKi8KKyAgIHN0cnVjdCBnbF91bmlmb3JtX2Jsb2NrICpVbmlmb3JtQmxvY2tzOworICAgdW5zaWduZWQgTnVtVW5pZm9ybUJsb2NrczsKKworICAgc3RydWN0IGV4ZWNfbGlzdCAqaXI7CisgICBzdHJ1Y3QgZ2xzbF9zeW1ib2xfdGFibGUgKnN5bWJvbHM7CisKKyAgIGJvb2wgdXNlc19idWlsdGluX2Z1bmN0aW9uczsKKyAgIGJvb2wgdXNlc19nbF9mcmFnY29vcmQ7CisgICBib29sIHJlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkOworICAgYm9vbCBBUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnNfZW5hYmxlOworCisgICAvKioKKyAgICAqIEZyYWdtZW50IHNoYWRlciBzdGF0ZSBmcm9tIEdMU0wgMS41MCBsYXlvdXQgcXVhbGlmaWVycy4KKyAgICAqLworICAgYm9vbCBvcmlnaW5fdXBwZXJfbGVmdDsKKyAgIGJvb2wgcGl4ZWxfY2VudGVyX2ludGVnZXI7CisKKyAgIC8qKgorICAgICogR2VvbWV0cnkgc2hhZGVyIHN0YXRlIGZyb20gR0xTTCAxLjUwIGxheW91dCBxdWFsaWZpZXJzLgorICAgICovCisgICBzdHJ1Y3QgeworICAgICAgR0xpbnQgVmVydGljZXNPdXQ7CisgICAgICAvKioKKyAgICAgICAqIDAgLSBJbnZvY2F0aW9ucyBjb3VudCBub3QgZGVjbGFyZWQgaW4gc2hhZGVyLCBvcgorICAgICAgICogMSAuLiBNQVhfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TCisgICAgICAgKi8KKyAgICAgIEdMaW50IEludm9jYXRpb25zOworICAgICAgLyoqCisgICAgICAgKiBHTF9QT0lOVFMsIEdMX0xJTkVTLCBHTF9MSU5FU19BREpBQ0VOQ1ksIEdMX1RSSUFOR0xFUywgb3IKKyAgICAgICAqIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1ksIG9yIFBSSU1fVU5LTk9XTiBpZiBpdCdzIG5vdCBzZXQgaW4gdGhpcworICAgICAgICogc2hhZGVyLgorICAgICAgICovCisgICAgICBHTGVudW0gSW5wdXRUeXBlOworICAgICAgIC8qKgorICAgICAgICAqIEdMX1BPSU5UUywgR0xfTElORV9TVFJJUCBvciBHTF9UUklBTkdMRV9TVFJJUCwgb3IgUFJJTV9VTktOT1dOIGlmCisgICAgICAgICogaXQncyBub3Qgc2V0IGluIHRoaXMgc2hhZGVyLgorICAgICAgICAqLworICAgICAgR0xlbnVtIE91dHB1dFR5cGU7CisgICB9IEdlb207CisKKyAgIC8qKgorICAgICogTWFwIGZyb20gaW1hZ2UgdW5pZm9ybSBpbmRleCB0byBpbWFnZSB1bml0IChzZXQgYnkgZ2xVbmlmb3JtMWkoKSkKKyAgICAqCisgICAgKiBBbiBpbWFnZSB1bmlmb3JtIGluZGV4IGlzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGltYWdlIHVuaWZvcm0gYnkKKyAgICAqIHRoZSBsaW5rZXIuICBUaGUgaW1hZ2UgaW5kZXggYXNzb2NpYXRlZCB3aXRoIGVhY2ggdW5pZm9ybSBpcworICAgICogc3RvcmVkIGluIHRoZSBcYyBnbF91bmlmb3JtX3N0b3JhZ2U6OmltYWdlIGZpZWxkLgorICAgICovCisgICBHTHVieXRlIEltYWdlVW5pdHNbTUFYX0lNQUdFX1VOSUZPUk1TXTsKKworICAgLyoqCisgICAgKiBBY2Nlc3MgcXVhbGlmaWVyIHNwZWNpZmllZCBpbiB0aGUgc2hhZGVyIGZvciBlYWNoIGltYWdlIHVuaWZvcm0KKyAgICAqIGluZGV4LiAgRWl0aGVyIFxjIEdMX1JFQURfT05MWSwgXGMgR0xfV1JJVEVfT05MWSBvciBcYworICAgICogR0xfUkVBRF9XUklURS4KKyAgICAqCisgICAgKiBJdCBtYXkgYmUgZGlmZmVyZW50LCB0aG91Z2ggb25seSBtb3JlIHN0cmljdCB0aGFuIHRoZSB2YWx1ZSBvZgorICAgICogXGMgZ2xfaW1hZ2VfdW5pdDo6QWNjZXNzIGZvciB0aGUgY29ycmVzcG9uZGluZyBpbWFnZSB1bml0LgorICAgICovCisgICBHTGVudW0gSW1hZ2VBY2Nlc3NbTUFYX0lNQUdFX1VOSUZPUk1TXTsKKworICAgLyoqCisgICAgKiBOdW1iZXIgb2YgaW1hZ2UgdW5pZm9ybXMgZGVmaW5lZCBpbiB0aGUgc2hhZGVyLiAgSXQgc3BlY2lmaWVzCisgICAgKiB0aGUgbnVtYmVyIG9mIHZhbGlkIGVsZW1lbnRzIGluIHRoZSBcYyBJbWFnZVVuaXRzIGFuZCBcYworICAgICogSW1hZ2VBY2Nlc3MgYXJyYXlzIGFib3ZlLgorICAgICovCisgICBHTHVpbnQgTnVtSW1hZ2VzOworCisgICAvKioKKyAgICAqIENvbXB1dGUgc2hhZGVyIHN0YXRlIGZyb20gQVJCX2NvbXB1dGVfc2hhZGVyIGxheW91dCBxdWFsaWZpZXJzLgorICAgICovCisgICBzdHJ1Y3QgeworICAgICAgLyoqCisgICAgICAgKiBTaXplIHNwZWNpZmllZCB1c2luZyBsb2NhbF9zaXplX3t4LHksen0sIG9yIGFsbCAwJ3MgdG8gaW5kaWNhdGUgdGhhdAorICAgICAgICogaXQncyBub3Qgc2V0IGluIHRoaXMgc2hhZGVyLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBMb2NhbFNpemVbM107CisgICB9IENvbXA7CisKKyAgIC8qKgorICAgICogRGVmZXJyZWQgdGFzayBvZiBnbENvbXBpbGVTaGFkZXIuICBXZSBzaG91bGQgZXh0ZW5kIHRoZSBtdXRleCwgbm90IG9ubHkKKyAgICAqIHRvIHByb3RlY3QgdGhlIGRlZmVycmVkIHRhc2ssIGJ1dCB0byBwcm90ZWN0IHRoZSBlbnRpcmUgZ2xfc2hhZGVyLgorICAgICoKKyAgICAqIE1VU1QgQkUgTEFTVCBGT1IgU0hBREVSIENBQ0hFIFRPIFdPUksKKyAgICAqLworICAgbXR4X3QgTXV0ZXg7CisgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICpUYXNrOworICAgdm9pZCAqVGFza0RhdGE7Cit9OworCisKK3N0cnVjdCBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZQoreworICAgY2hhciAqTmFtZTsKKworICAgLyoqCisgICAgKiBOYW1lIG9mIHRoZSB1bmlmb3JtIGFzIHNlZW4gYnkgZ2xHZXRVbmlmb3JtSW5kaWNlcy4KKyAgICAqCisgICAgKiBnbEdldFVuaWZvcm1JbmRpY2VzIHJlcXVpcmVzIHRoYXQgdGhlIGJsb2NrIGluc3RhbmNlIGluZGV4IFxiIG5vdCBiZQorICAgICogcHJlc2VudCBpbiB0aGUgbmFtZSBvZiBxdWVyaWVkIHVuaWZvcm1zLgorICAgICoKKyAgICAqIFxub3RlCisgICAgKiBcYyBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZTo6SW5kZXhOYW1lIGFuZAorICAgICogXGMgZ2xfdW5pZm9ybV9idWZmZXJfdmFyaWFibGU6Ok5hbWUgbWF5IHBvaW50IHRvIGlkZW50aWNhbCBzdG9yYWdlLgorICAgICovCisgICBjaGFyICpJbmRleE5hbWU7CisKKyAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKlR5cGU7CisgICB1bnNpZ25lZCBpbnQgT2Zmc2V0OworICAgR0xib29sZWFuIFJvd01ham9yOworfTsKKworCitlbnVtIGdsX3VuaWZvcm1fYmxvY2tfcGFja2luZworeworICAgdWJvX3BhY2tpbmdfc3RkMTQwLAorICAgdWJvX3BhY2tpbmdfc2hhcmVkLAorICAgdWJvX3BhY2tpbmdfcGFja2VkCit9OworCisKK3N0cnVjdCBnbF91bmlmb3JtX2Jsb2NrCit7CisgICAvKiogRGVjbGFyZWQgbmFtZSBvZiB0aGUgdW5pZm9ybSBibG9jayAqLworICAgY2hhciAqTmFtZTsKKworICAgLyoqIEFycmF5IG9mIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiBhYm91dCBVQk8gaXJfdmFyaWFibGVzLiAqLworICAgc3RydWN0IGdsX3VuaWZvcm1fYnVmZmVyX3ZhcmlhYmxlICpVbmlmb3JtczsKKyAgIEdMdWludCBOdW1Vbmlmb3JtczsKKworICAgLyoqCisgICAgKiBJbmRleCAoR0xfVU5JRk9STV9CTE9DS19CSU5ESU5HKSBpbnRvIGN0eC0+VW5pZm9ybUJ1ZmZlckJpbmRpbmdzW10gdG8gdXNlCisgICAgKiB3aXRoIGdsQmluZEJ1ZmZlckJhc2UgdG8gYmluZCBhIGJ1ZmZlciBvYmplY3QgdG8gdGhpcyB1bmlmb3JtIGJsb2NrLiAgV2hlbgorICAgICogdXBkYXRlZCBpbiB0aGUgcHJvZ3JhbSwgX05FV19CVUZGRVJfT0JKRUNUIHdpbGwgYmUgc2V0LgorICAgICovCisgICBHTHVpbnQgQmluZGluZzsKKworICAgLyoqCisgICAgKiBNaW5pbXVtIHNpemUgb2YgYSBidWZmZXIgb2JqZWN0IHRvIGJhY2sgdGhpcyB1bmlmb3JtIGJ1ZmZlcgorICAgICogKEdMX1VOSUZPUk1fQkxPQ0tfREFUQV9TSVpFKS4KKyAgICAqLworICAgR0x1aW50IFVuaWZvcm1CdWZmZXJTaXplOworCisgICAvKioKKyAgICAqIExheW91dCBzcGVjaWZpZWQgaW4gdGhlIHNoYWRlcgorICAgICoKKyAgICAqIFRoaXMgaXNuJ3QgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBBUEksIGJ1dCBpdCBpcyB1c2VkIHdoaWxlCisgICAgKiBjcm9zcy12YWxpZGF0aW5nIHVuaWZvcm0gYmxvY2tzLgorICAgICovCisgICBlbnVtIGdsX3VuaWZvcm1fYmxvY2tfcGFja2luZyBfUGFja2luZzsKK307CisKKy8qKgorICogU3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhbiBhdG9taWMgYnVmZmVyIGZyb20gc29tZQorICogc2hhZGVyIHByb2dyYW0uCisgKi8KK3N0cnVjdCBnbF9hY3RpdmVfYXRvbWljX2J1ZmZlcgoreworICAgLyoqIFVuaWZvcm0gaW5kaWNlcyBvZiB0aGUgYXRvbWljIGNvdW50ZXJzIGRlY2xhcmVkIHdpdGhpbiBpdC4gKi8KKyAgIEdMdWludCAqVW5pZm9ybXM7CisgICBHTHVpbnQgTnVtVW5pZm9ybXM7CisKKyAgIC8qKiBCaW5kaW5nIHBvaW50IGluZGV4IGFzc29jaWF0ZWQgd2l0aCBpdC4gKi8KKyAgIEdMdWludCBCaW5kaW5nOworCisgICAvKiogTWluaW11bSByZWFzb25hYmxlIHNpemUgaXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZS4gKi8KKyAgIEdMdWludCBNaW5pbXVtU2l6ZTsKKworICAgLyoqIFNoYWRlciBzdGFnZXMgbWFraW5nIHVzZSBvZiBpdC4gKi8KKyAgIEdMYm9vbGVhbiBTdGFnZVJlZmVyZW5jZXNbTUVTQV9TSEFERVJfU1RBR0VTXTsKK307CisKKy8qKgorICogQSBHTFNMIHByb2dyYW0gb2JqZWN0LgorICogQmFzaWNhbGx5IGEgbGlua2VkIGNvbGxlY3Rpb24gb2YgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzLgorICovCitzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0KK3sKKyAgIEdMZW51bSBUeXBlOyAgLyoqPCBBbHdheXMgR0xfU0hBREVSX1BST0dSQU0gKGludGVybmFsIHRva2VuKSAqLworICAgR0x1aW50IE5hbWU7ICAvKio8IGFrYSBoYW5kbGUgb3IgSUQgKi8KKyAgIEdMY2hhciAqTGFiZWw7ICAgLyoqPCBHTF9LSFJfZGVidWcgKi8KKyAgIC8vIEx1bmFyRzogUmVtb3ZlIC0gVksgZG9lcyBub3QgdXNlIHJlZmVyZW5jZSBjb3VudHMKKyAgIC8vIEdMaW50IFJlZkNvdW50OworICAgR0xib29sZWFuIERlbGV0ZVBlbmRpbmc7CisKKyAgIC8qKgorICAgICogSXMgdGhlIGFwcGxpY2F0aW9uIGludGVuZGluZyB0byBnbEdldFByb2dyYW1CaW5hcnkgdGhpcyBwcm9ncmFtPworICAgICovCisgICBHTGJvb2xlYW4gQmluYXJ5UmV0cmVpdmFibGVIaW50OworCisgICAvKioKKyAgICAqIEluZGljYXRlcyB3aGV0aGVyIHByb2dyYW0gY2FuIGJlIGJvdW5kIGZvciBpbmRpdmlkdWFsIHBpcGVsaW5lIHN0YWdlcworICAgICogdXNpbmcgVXNlUHJvZ3JhbVN0YWdlcyBhZnRlciBpdCBpcyBuZXh0IGxpbmtlZC4KKyAgICAqLworICAgR0xib29sZWFuIFNlcGFyYXRlU2hhZGVyOworCisgICBHTHVpbnQgTnVtU2hhZGVyczsgICAgICAgICAgLyoqPCBudW1iZXIgb2YgYXR0YWNoZWQgc2hhZGVycyAqLworICAgc3RydWN0IGdsX3NoYWRlciAqKlNoYWRlcnM7IC8qKjwgTGlzdCBvZiBhdHRhY2hlZCB0aGUgc2hhZGVycyAqLworCisgICAvKioKKyAgICAqIFVzZXItZGVmaW5lZCBhdHRyaWJ1dGUgYmluZGluZ3MKKyAgICAqCisgICAgKiBUaGVzZSBhcmUgc2V0IHZpYSBcYyBnbEJpbmRBdHRyaWJMb2NhdGlvbiBhbmQgYXJlIHVzZWQgdG8gZGlyZWN0IHRoZQorICAgICogR0xTTCBsaW5rZXIuICBUaGVzZSBhcmUgXGIgbm90IHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgY29tcGlsZWQgc2hhZGVyLAorICAgICogYW5kIHRoZXkgYXJlIFxiIG5vdCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IFxjIGdsR2V0QXR0cmliTG9jYXRpb24uCisgICAgKi8KKyAgIHN0cnVjdCBzdHJpbmdfdG9fdWludF9tYXAgKkF0dHJpYnV0ZUJpbmRpbmdzOworCisgICAvKioKKyAgICAqIFVzZXItZGVmaW5lZCBmcmFnbWVudCBkYXRhIGJpbmRpbmdzCisgICAgKgorICAgICogVGhlc2UgYXJlIHNldCB2aWEgXGMgZ2xCaW5kRnJhZ0RhdGFMb2NhdGlvbiBhbmQgYXJlIHVzZWQgdG8gZGlyZWN0IHRoZQorICAgICogR0xTTCBsaW5rZXIuICBUaGVzZSBhcmUgXGIgbm90IHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgY29tcGlsZWQgc2hhZGVyLAorICAgICogYW5kIHRoZXkgYXJlIFxiIG5vdCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IFxjIGdsR2V0RnJhZ0RhdGFMb2NhdGlvbi4KKyAgICAqLworICAgc3RydWN0IHN0cmluZ190b191aW50X21hcCAqRnJhZ0RhdGFCaW5kaW5nczsKKyAgIHN0cnVjdCBzdHJpbmdfdG9fdWludF9tYXAgKkZyYWdEYXRhSW5kZXhCaW5kaW5nczsKKworICAgLyoqCisgICAgKiBUcmFuc2Zvcm0gZmVlZGJhY2sgdmFyeWluZ3MgbGFzdCBzcGVjaWZpZWQgYnkKKyAgICAqIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncygpLgorICAgICoKKyAgICAqIEZvciB0aGUgY3VycmVudCBzZXQgb2YgdHJhbnNmb3JtIGZlZWVkYmFjayB2YXJ5aW5ncyB1c2VkIGZvciB0cmFuc2Zvcm0KKyAgICAqIGZlZWRiYWNrIG91dHB1dCwgc2VlIExpbmtlZFRyYW5zZm9ybUZlZWRiYWNrLgorICAgICovCisgICBzdHJ1Y3QgeworICAgICAgR0xlbnVtIEJ1ZmZlck1vZGU7CisgICAgICBHTHVpbnQgTnVtVmFyeWluZzsKKyAgICAgIEdMY2hhciAqKlZhcnlpbmdOYW1lczsgIC8qKjwgQXJyYXkgW051bVZhcnlpbmddIG9mIGNoYXIgKiAqLworICAgfSBUcmFuc2Zvcm1GZWVkYmFjazsKKworICAgLyoqIFBvc3QtbGluayB0cmFuc2Zvcm0gZmVlZGJhY2sgaW5mby4gKi8KKyAgIHN0cnVjdCBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfaW5mbyBMaW5rZWRUcmFuc2Zvcm1GZWVkYmFjazsKKworICAgLyoqIFBvc3QtbGluayBnbF9GcmFnRGVwdGggbGF5b3V0IGZvciBBUkJfY29uc2VydmF0aXZlX2RlcHRoLiAqLworICAgZW51bSBnbF9mcmFnX2RlcHRoX2xheW91dCBGcmFnRGVwdGhMYXlvdXQ7CisKKyAgIC8qKgorICAgICogR2VvbWV0cnkgc2hhZGVyIHN0YXRlIC0gY29waWVkIGludG8gZ2xfZ2VvbWV0cnlfcHJvZ3JhbSBieQorICAgICogX21lc2FfY29weV9saW5rZWRfcHJvZ3JhbV9kYXRhKCkuCisgICAgKi8KKyAgIHN0cnVjdCB7CisgICAgICBHTGludCBWZXJ0aWNlc0luOworICAgICAgR0xpbnQgVmVydGljZXNPdXQ7CisgICAgICAvKioKKyAgICAgICAqIDEgLi4gTUFYX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OUworICAgICAgICovCisgICAgICBHTGludCBJbnZvY2F0aW9uczsKKyAgICAgIEdMZW51bSBJbnB1dFR5cGU7ICAvKio8IEdMX1BPSU5UUywgR0xfTElORVMsIEdMX0xJTkVTX0FESkFDRU5DWV9BUkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9UUklBTkdMRVMsIG9yIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1lfQVJCICovCisgICAgICBHTGVudW0gT3V0cHV0VHlwZTsgLyoqPCBHTF9QT0lOVFMsIEdMX0xJTkVfU1RSSVAgb3IgR0xfVFJJQU5HTEVfU1RSSVAgKi8KKyAgICAgIC8qKgorICAgICAgICogVHJ1ZSBpZiBnbF9DbGlwRGlzdGFuY2UgaXMgd3JpdHRlbiB0by4gIENvcGllZCBpbnRvCisgICAgICAgKiBnbF9nZW9tZXRyeV9wcm9ncmFtIGJ5IF9tZXNhX2NvcHlfbGlua2VkX3Byb2dyYW1fZGF0YSgpLgorICAgICAgICovCisgICAgICBHTGJvb2xlYW4gVXNlc0NsaXBEaXN0YW5jZTsKKyAgICAgIEdMdWludCBDbGlwRGlzdGFuY2VBcnJheVNpemU7IC8qKjwgU2l6ZSBvZiB0aGUgZ2xfQ2xpcERpc3RhbmNlIGFycmF5LCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCBwcmVzZW50LiAqLworICAgICAgR0xib29sZWFuIFVzZXNFbmRQcmltaXRpdmU7CisgICB9IEdlb207CisKKyAgIC8qKiBWZXJ0ZXggc2hhZGVyIHN0YXRlICovCisgICBzdHJ1Y3QgeworICAgICAgLyoqCisgICAgICAgKiBUcnVlIGlmIGdsX0NsaXBEaXN0YW5jZSBpcyB3cml0dGVuIHRvLiAgQ29waWVkIGludG8gZ2xfdmVydGV4X3Byb2dyYW0KKyAgICAgICAqIGJ5IF9tZXNhX2NvcHlfbGlua2VkX3Byb2dyYW1fZGF0YSgpLgorICAgICAgICovCisgICAgICBHTGJvb2xlYW4gVXNlc0NsaXBEaXN0YW5jZTsKKyAgICAgIEdMdWludCBDbGlwRGlzdGFuY2VBcnJheVNpemU7IC8qKjwgU2l6ZSBvZiB0aGUgZ2xfQ2xpcERpc3RhbmNlIGFycmF5LCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCBwcmVzZW50LiAqLworICAgfSBWZXJ0OworCisgICAvKioKKyAgICAqIENvbXB1dGUgc2hhZGVyIHN0YXRlIC0gY29waWVkIGludG8gZ2xfY29tcHV0ZV9wcm9ncmFtIGJ5CisgICAgKiBfbWVzYV9jb3B5X2xpbmtlZF9wcm9ncmFtX2RhdGEoKS4KKyAgICAqLworICAgc3RydWN0IHsKKyAgICAgIC8qKgorICAgICAgICogSWYgdGhpcyBzaGFkZXIgY29udGFpbnMgYSBjb21wdXRlIHN0YWdlLCBzaXplIHNwZWNpZmllZCB1c2luZworICAgICAgICogbG9jYWxfc2l6ZV97eCx5LHp9LiAgT3RoZXJ3aXNlIHVuZGVmaW5lZC4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgTG9jYWxTaXplWzNdOworICAgfSBDb21wOworCisgICAvKiBwb3N0LWxpbmsgaW5mbzogKi8KKyAgIHVuc2lnbmVkIE51bVVzZXJVbmlmb3JtU3RvcmFnZTsKKyAgIHN0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgKlVuaWZvcm1TdG9yYWdlOworCisgICAvKioKKyAgICAqIE1hcHBpbmcgZnJvbSBHTCB1bmlmb3JtIGxvY2F0aW9ucyByZXR1cm5lZCBieSBcYyBnbFVuaWZvcm1Mb2NhdGlvbiB0bworICAgICogVW5pZm9ybVN0b3JhZ2UgZW50cmllcy4gQXJyYXlzIHdpbGwgaGF2ZSBtdWx0aXBsZSBjb250aWd1b3VzIHNsb3RzCisgICAgKiBpbiB0aGUgVW5pZm9ybVJlbWFwVGFibGUsIGFsbCBwb2ludGluZyB0byB0aGUgc2FtZSBVbmlmb3JtU3RvcmFnZSBlbnRyeS4KKyAgICAqLworICAgdW5zaWduZWQgTnVtVW5pZm9ybVJlbWFwVGFibGU7CisgICBzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlICoqVW5pZm9ybVJlbWFwVGFibGU7CisKKyAgIC8qKgorICAgICogU2l6ZSBvZiB0aGUgZ2xfQ2xpcERpc3RhbmNlIGFycmF5IHRoYXQgaXMgb3V0cHV0IGZyb20gdGhlIGxhc3QgcGlwZWxpbmUKKyAgICAqIHN0YWdlIGJlZm9yZSB0aGUgZnJhZ21lbnQgc2hhZGVyLgorICAgICovCisgICB1bnNpZ25lZCBMYXN0Q2xpcERpc3RhbmNlQXJyYXlTaXplOworCisgICBzdHJ1Y3QgZ2xfdW5pZm9ybV9ibG9jayAqVW5pZm9ybUJsb2NrczsKKyAgIHVuc2lnbmVkIE51bVVuaWZvcm1CbG9ja3M7CisKKyAgIC8qKgorICAgICogSW5kaWNlcyBpbnRvIHRoZSBfTGlua2VkU2hhZGVycydzIFVuaWZvcm1CbG9ja3NbXSBhcnJheSBmb3IgZWFjaCBzdGFnZQorICAgICogdGhleSdyZSB1c2VkIGluLCBvciAtMS4KKyAgICAqCisgICAgKiBUaGlzIGlzIHVzZWQgdG8gbWFpbnRhaW4gdGhlIEJpbmRpbmcgdmFsdWVzIG9mIHRoZSBzdGFnZSdzIFVuaWZvcm1CbG9ja3NbXQorICAgICogYW5kIHRvIGFuc3dlciB0aGUgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZXypfU0hBREVSIHF1ZXJpZXMuCisgICAgKi8KKyAgIGludCAqVW5pZm9ybUJsb2NrU3RhZ2VJbmRleFtNRVNBX1NIQURFUl9TVEFHRVNdOworCisgICAvKioKKyAgICAqIE1hcCBvZiBhY3RpdmUgdW5pZm9ybSBuYW1lcyB0byBsb2NhdGlvbnMKKyAgICAqCisgICAgKiBNYXBzIGFueSBhY3RpdmUgdW5pZm9ybSB0aGF0IGlzIG5vdCBhbiBhcnJheSBlbGVtZW50IHRvIGEgbG9jYXRpb24uCisgICAgKiBFYWNoIGFjdGl2ZSB1bmlmb3JtLCBpbmNsdWRpbmcgaW5kaXZpZHVhbCBzdHJ1Y3R1cmUgbWVtYmVycyB3aWxsIGFwcGVhcgorICAgICogaW4gdGhpcyBtYXAuICBUaGlzIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gdGhlIHNldCBvZiBuYW1lcyB0aGF0IHdvdWxkIGJlCisgICAgKiBlbnVtZXJhdGVkIGJ5IFxjIGdsR2V0QWN0aXZlVW5pZm9ybS4KKyAgICAqLworICAgc3RydWN0IHN0cmluZ190b191aW50X21hcCAqVW5pZm9ybUhhc2g7CisKKyAgIHN0cnVjdCBnbF9hY3RpdmVfYXRvbWljX2J1ZmZlciAqQXRvbWljQnVmZmVyczsKKyAgIHVuc2lnbmVkIE51bUF0b21pY0J1ZmZlcnM7CisKKyAgIEdMYm9vbGVhbiBMaW5rU3RhdHVzOyAgIC8qKjwgR0xfTElOS19TVEFUVVMgKi8KKyAgIEdMYm9vbGVhbiBWYWxpZGF0ZWQ7CisgICBHTGJvb2xlYW4gX1VzZWQ7ICAgICAgICAvKio8IEV2ZXIgdXNlZCBmb3IgZHJhd2luZz8gKi8KKyAgIEdMYm9vbGVhbiBfTGlua2VkOyAgICAgIC8qKjwgRXZlciBsaW5rZWQ/ICovCisgICBHTGNoYXIgKkluZm9Mb2c7CisKKyAgIHVuc2lnbmVkIFZlcnNpb247ICAgICAgIC8qKjwgR0xTTCB2ZXJzaW9uIHVzZWQgZm9yIGxpbmtpbmcgKi8KKyAgIEdMYm9vbGVhbiBJc0VTOyAgICAgICAgIC8qKjwgVHJ1ZSBpZiB0aGlzIHByb2dyYW0gdXNlcyBHTFNMIEVTICovCisKKyAgIC8qKgorICAgICogUGVyLXN0YWdlIHNoYWRlcnMgcmVzdWx0aW5nIGZyb20gdGhlIGZpcnN0IHN0YWdlIG9mIGxpbmtpbmcuCisgICAgKgorICAgICogU2V0IG9mIGxpbmtlZCBzaGFkZXJzIGZvciB0aGlzIHByb2dyYW0uICBUaGUgYXJyYXkgaXMgYWNjZXNzZWQgdXNpbmcgdGhlCisgICAgKiBcYyBNRVNBX1NIQURFUl8qIGRlZmluZXMuICBFbnRyaWVzIGZvciBub24tZXhpc3RlbnQgc3RhZ2VzIHdpbGwgYmUKKyAgICAqIFxjIE5VTEwuCisgICAgKi8KKyAgIHN0cnVjdCBnbF9zaGFkZXIgKl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX1NUQUdFU107CisKKyAgIC8qIFRydWUgaWYgYW55IG9mIHRoZSBmcmFnbWVudCBzaGFkZXJzIGF0dGFjaGVkIHRvIHRoaXMgcHJvZ3JhbSB1c2U6CisgICAgKiAjZXh0ZW5zaW9uIEFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uczogZW5hYmxlCisgICAgKi8KKyAgIEdMYm9vbGVhbiBBUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnNfZW5hYmxlOworCisgICAvKioKKyAgICAqIERlZmVycmVkIHRhc2sgb2YgZ2xMaW5rUHJvZ3JhbS4gIFdlIHNob3VsZCBleHRlbmQgdGhlIG11dGV4LCBub3Qgb25seQorICAgICogdG8gcHJvdGVjdCB0aGUgZGVmZXJyZWQgdGFzaywgYnV0IHRvIHByb3RlY3QgdGhlIGVudGlyZQorICAgICogZ2xfc2hhZGVyX3Byb2dyYW0uCisgICAgKgorICAgICogTVVTVCBCRSBMQVNUIEZPUiBTSEFERVIgQ0FDSEUgVE8gV09SSworICAgICovCisgICBtdHhfdCBNdXRleDsKKyAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2sgKlRhc2s7CisgICB2b2lkICpUYXNrRGF0YTsKK307ICAgCisKKworI2RlZmluZSBHTFNMX0RVTVAgICAgICAweDEgIC8qKjwgRHVtcCBzaGFkZXJzIHRvIHN0ZG91dCAqLworI2RlZmluZSBHTFNMX0xPRyAgICAgICAweDIgIC8qKjwgV3JpdGUgc2hhZGVycyB0byBmaWxlcyAqLworI2RlZmluZSBHTFNMX09QVCAgICAgICAweDQgIC8qKjwgRm9yY2Ugb3B0aW1pemF0aW9ucyAob3ZlcnJpZGUgcHJhZ21hcykgKi8KKyNkZWZpbmUgR0xTTF9OT19PUFQgICAgMHg4ICAvKio8IEZvcmNlIG5vIG9wdGltaXphdGlvbnMgKG92ZXJyaWRlIHByYWdtYXMpICovCisjZGVmaW5lIEdMU0xfVU5JRk9STVMgMHgxMCAgLyoqPCBQcmludCBnbFVuaWZvcm0gY2FsbHMgKi8KKyNkZWZpbmUgR0xTTF9OT1BfVkVSVCAweDIwICAvKio8IEZvcmNlIG5vLW9wIHZlcnRleCBzaGFkZXJzICovCisjZGVmaW5lIEdMU0xfTk9QX0ZSQUcgMHg0MCAgLyoqPCBGb3JjZSBuby1vcCBmcmFnbWVudCBzaGFkZXJzICovCisjZGVmaW5lIEdMU0xfVVNFX1BST0cgMHg4MCAgLyoqPCBMb2cgZ2xVc2VQcm9ncmFtIGNhbGxzICovCisjZGVmaW5lIEdMU0xfUkVQT1JUX0VSUk9SUyAweDEwMCAgLyoqPCBQcmludCBjb21waWxhdGlvbiBlcnJvcnMgKi8KKyNkZWZpbmUgR0xTTF9EVU1QX09OX0VSUk9SIDB4MjAwIC8qKjwgRHVtcCBzaGFkZXJzIHRvIHN0ZGVyciBvbiBjb21waWxlIGVycm9yICovCisjZGVmaW5lIEdMU0xfVVNFX0dMQVNTICAgICAweDQwMCAvKio8IFVzZSBMdW5hckdsYXNzIG9wdGltaXplciAqLworCisvKioKKyAqIENvbXBpbGVyIG9wdGlvbnMgZm9yIGEgc2luZ2xlIEdMU0wgc2hhZGVycyB0eXBlCisgKi8KK3N0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucworeworICAgLyoqIERyaXZlci1zZWxlY3RhYmxlIG9wdGlvbnM6ICovCisgICBHTGJvb2xlYW4gRW1pdENvbmRDb2RlczsgICAgICAgICAgICAgLyoqPCBVc2UgY29uZGl0aW9uIGNvZGVzPyAqLworICAgR0xib29sZWFuIEVtaXROb0xvb3BzOworICAgR0xib29sZWFuIEVtaXROb0Z1bmN0aW9uczsKKyAgIEdMYm9vbGVhbiBFbWl0Tm9Db250OyAgICAgICAgICAgICAgICAgIC8qKjwgRW1pdCBDT05UIG9wY29kZT8gKi8KKyAgIEdMYm9vbGVhbiBFbWl0Tm9NYWluUmV0dXJuOyAgICAgICAgICAgIC8qKjwgRW1pdCBDT05UL1JFVCBvcGNvZGVzPyAqLworICAgR0xib29sZWFuIEVtaXROb05vaXNlOyAgICAgICAgICAgICAgICAgLyoqPCBFbWl0IE5PSVNFIG9wY29kZXM/ICovCisgICBHTGJvb2xlYW4gRW1pdE5vUG93OyAgICAgICAgICAgICAgICAgICAvKio8IEVtaXQgUE9XIG9wY29kZXM/ICovCisgICBHTGJvb2xlYW4gTG93ZXJDbGlwRGlzdGFuY2U7IC8qKjwgTG93ZXIgZ2xfQ2xpcERpc3RhbmNlIGZyb20gZmxvYXRbOF0gdG8gdmVjNFsyXT8gKi8KKworICAgLyoqCisgICAgKiBcbmFtZSBGb3JtcyBvZiBpbmRpcmVjdCBhZGRyZXNzaW5nIHRoZSBkcml2ZXIgY2Fubm90IGRvLgorICAgICovCisgICAvKkB7Ki8KKyAgIEdMYm9vbGVhbiBFbWl0Tm9JbmRpcmVjdElucHV0OyAgIC8qKjwgTm8gaW5kaXJlY3QgYWRkcmVzc2luZyBvZiBpbnB1dHMgKi8KKyAgIEdMYm9vbGVhbiBFbWl0Tm9JbmRpcmVjdE91dHB1dDsgIC8qKjwgTm8gaW5kaXJlY3QgYWRkcmVzc2luZyBvZiBvdXRwdXRzICovCisgICBHTGJvb2xlYW4gRW1pdE5vSW5kaXJlY3RUZW1wOyAgICAvKio8IE5vIGluZGlyZWN0IGFkZHJlc3Npbmcgb2YgdGVtcHMgKi8KKyAgIEdMYm9vbGVhbiBFbWl0Tm9JbmRpcmVjdFVuaWZvcm07IC8qKjwgTm8gaW5kaXJlY3QgYWRkcmVzc2luZyBvZiBjb25zdGFudHMgKi8KKyAgIC8qQH0qLworCisgICBHTHVpbnQgTWF4SWZEZXB0aDsgICAgICAgICAgICAgICAvKio8IE1heGltdW0gbmVzdGVkIElGIGJsb2NrcyAqLworICAgR0x1aW50IE1heFVucm9sbEl0ZXJhdGlvbnM7CisKKyAgIC8qKgorICAgICogT3B0aW1pemUgY29kZSBmb3IgYXJyYXkgb2Ygc3RydWN0dXJlcyBiYWNrZW5kcy4KKyAgICAqCisgICAgKiBUaGlzIGlzIGEgcHJveHkgZm9yOgorICAgICogICAtIHByZWZlcnJpbmcgRFA0IGluc3RydWN0aW9ucyAocmF0aGVyIHRoYW4gTVVML01BRCkgZm9yCisgICAgKiAgICAgbWF0cml4ICogdmVjdG9yIG9wZXJhdGlvbnMsIHN1Y2ggYXMgcG9zaXRpb24gdHJhbnNmb3JtYXRpb24uCisgICAgKi8KKyAgIEdMYm9vbGVhbiBPcHRpbWl6ZUZvckFPUzsKKworICAgc3RydWN0IGdsX3NsX3ByYWdtYXMgRGVmYXVsdFByYWdtYXM7IC8qKjwgRGVmYXVsdCAjcHJhZ21hIHNldHRpbmdzICovCit9OworCisvKioKKyAqIFN0YXRlIHdoaWNoIGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgY29udGV4dHM6CisgKi8KK3N0cnVjdCBnbF9zaGFyZWRfc3RhdGUKK3sKKyAgIG10eF90IE11dGV4OwkJICAgLyoqPCBmb3IgdGhyZWFkIHNhZmV0eSAqLworICAgR0xpbnQgUmVmQ291bnQ7CQkJICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICAgLyoqCisgICAgKiBcbmFtZSBWZXJ0ZXgvZ2VvbWV0cnkvZnJhZ21lbnQgcHJvZ3JhbXMKKyAgICAqLworICAgLypAeyovCisgICBzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICpQcm9ncmFtczsgLyoqPCBBbGwgdmVydGV4L2ZyYWdtZW50IHByb2dyYW1zICovCisgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKkRlZmF1bHRWZXJ0ZXhQcm9ncmFtOworICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKkRlZmF1bHRGcmFnbWVudFByb2dyYW07CisgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqRGVmYXVsdEdlb21ldHJ5UHJvZ3JhbTsKKyAgIC8qQH0qLworCisgICAvKiBHTF9BVElfZnJhZ21lbnRfc2hhZGVyICovCisgICBzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICpBVElTaGFkZXJzOworICAgc3RydWN0IGF0aV9mcmFnbWVudF9zaGFkZXIgKkRlZmF1bHRGcmFnbWVudFNoYWRlcjsKKworICAgLyoqIFRhYmxlIG9mIGJvdGggZ2xfc2hhZGVyIGFuZCBnbF9zaGFkZXJfcHJvZ3JhbSBvYmplY3RzICovCisgICBzdHJ1Y3QgX21lc2FfSGFzaFRhYmxlICpTaGFkZXJPYmplY3RzOworCisgICAvKioKKyAgICAqIFNvbWUgY29udGV4dCBpbiB0aGlzIHNoYXJlIGdyb3VwIHdhcyBhZmZlY3RlZCBieSBhIEdQVSByZXNldAorICAgICoKKyAgICAqIE9uIHRoZSBuZXh0IGNhbGwgdG8gXGMgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzLCBjb250ZXh0cyB0aGF0IGhhdmUgbm90CisgICAgKiBiZWVuIGFmZmVjdGVkIGJ5IGEgR1BVIHJlc2V0IG11c3QgYWxzbyByZXR1cm4KKyAgICAqIFxjIEdMX0lOTk9DRU5UX0NPTlRFWFRfUkVTRVRfQVJCLgorICAgICoKKyAgICAqIE9uY2UgdGhpcyBmaWVsZCBiZWNvbWVzIHRydWUsIGl0IGlzIG5ldmVyIHJlc2V0IHRvIGZhbHNlLgorICAgICovCisgICBib29sIFNoYXJlR3JvdXBSZXNldDsKK307CisKKworCisvKioKKyAqIFByZWNpc2lvbiBpbmZvIGZvciBzaGFkZXIgZGF0YXR5cGVzLiAgU2VlIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCkuCisgKi8KK3N0cnVjdCBnbF9wcmVjaXNpb24KK3sKKyAgIEdMdXNob3J0IFJhbmdlTWluOyAgIC8qKjwgbWluIHZhbHVlIGV4cG9uZW50ICovCisgICBHTHVzaG9ydCBSYW5nZU1heDsgICAvKio8IG1heCB2YWx1ZSBleHBvbmVudCAqLworICAgR0x1c2hvcnQgUHJlY2lzaW9uOyAgLyoqPCBudW1iZXIgb2YgbWFudGlzc2EgYml0cyAqLworfTsKKworCisvKioKKyAqIExpbWl0cyBmb3IgdmVydGV4LCBnZW9tZXRyeSBhbmQgZnJhZ21lbnQgcHJvZ3JhbXMvc2hhZGVycy4KKyAqLworc3RydWN0IGdsX3Byb2dyYW1fY29uc3RhbnRzCit7CisgICAvKiBsb2dpY2FsIGxpbWl0cyAqLworICAgR0x1aW50IE1heEluc3RydWN0aW9uczsKKyAgIEdMdWludCBNYXhBbHVJbnN0cnVjdGlvbnM7CisgICBHTHVpbnQgTWF4VGV4SW5zdHJ1Y3Rpb25zOworICAgR0x1aW50IE1heFRleEluZGlyZWN0aW9uczsKKyAgIEdMdWludCBNYXhBdHRyaWJzOworICAgR0x1aW50IE1heFRlbXBzOworICAgR0x1aW50IE1heEFkZHJlc3NSZWdzOworICAgR0x1aW50IE1heEFkZHJlc3NPZmZzZXQ7ICAvKio8IFstTWF4QWRkcmVzc09mZnNldCwgTWF4QWRkcmVzc09mZnNldC0xXSAqLworICAgR0x1aW50IE1heFBhcmFtZXRlcnM7CisgICBHTHVpbnQgTWF4TG9jYWxQYXJhbXM7CisgICBHTHVpbnQgTWF4RW52UGFyYW1zOworICAgLyogbmF0aXZlL2hhcmR3YXJlIGxpbWl0cyAqLworICAgR0x1aW50IE1heE5hdGl2ZUluc3RydWN0aW9uczsKKyAgIEdMdWludCBNYXhOYXRpdmVBbHVJbnN0cnVjdGlvbnM7CisgICBHTHVpbnQgTWF4TmF0aXZlVGV4SW5zdHJ1Y3Rpb25zOworICAgR0x1aW50IE1heE5hdGl2ZVRleEluZGlyZWN0aW9uczsKKyAgIEdMdWludCBNYXhOYXRpdmVBdHRyaWJzOworICAgR0x1aW50IE1heE5hdGl2ZVRlbXBzOworICAgR0x1aW50IE1heE5hdGl2ZUFkZHJlc3NSZWdzOworICAgR0x1aW50IE1heE5hdGl2ZVBhcmFtZXRlcnM7CisgICAvKiBGb3Igc2hhZGVycyAqLworICAgR0x1aW50IE1heFVuaWZvcm1Db21wb25lbnRzOyAgLyoqPCBVc3VhbGx5ID09IE1heFBhcmFtZXRlcnMgKiA0ICovCisKKyAgIC8qKgorICAgICogXG5hbWUgUGVyLXN0YWdlIGlucHV0IC8gb3V0cHV0IGxpbWl0cworICAgICoKKyAgICAqIFByZXZpb3VzIHRvIE9wZW5HTCAzLjIsIHRoZSBpbnRyYXN0YWdlIGRhdGEgbGltaXRzIHdlcmUgYWR2ZXJ0aXNlZCB3aXRoCisgICAgKiBhIHNpbmdsZSB2YWx1ZTogR0xfTUFYX1ZBUllJTkdfQ09NUE9ORU5UUyAoR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyBpbgorICAgICogRVMpLiAgVGhpcyBpcyBzdG9yZWQgYXMgXGMgZ2xfY29uc3RhbnRzOjpNYXhWYXJ5aW5nLgorICAgICoKKyAgICAqIFN0YXJ0aW5nIHdpdGggT3BlbkdMIDMuMiwgdGhlIGxpbWl0cyBhcmUgYWR2ZXJ0aXNlZCB3aXRoIHBlci1zdGFnZQorICAgICogdmFyaWFibGVzLiAgRWFjaCBzdGFnZSBhcyBhIGNlcnRhaW4gbnVtYmVyIG9mIG91dHB1dHMgdGhhdCBpdCBjYW4gZmVlZAorICAgICogdG8gdGhlIG5leHQgc3RhZ2UgYW5kIGEgY2VydGFpbiBudW1iZXIgaW5wdXRzIHRoYXQgaXQgY2FuIGNvbnN1bWUgZnJvbQorICAgICogdGhlIHByZXZpb3VzIHN0YWdlLgorICAgICoKKyAgICAqIFZlcnRleCBzaGFkZXIgaW5wdXRzIGRvIG5vdCBwYXJ0aWNpcGF0ZSB0aGlzIGluIHRoaXMgYWNjb3VudGluZy4KKyAgICAqIFRoZXNlIGFyZSB0cmFja2VkIGV4Y2x1c2l2ZWx5IGJ5IFxjIGdsX3Byb2dyYW1fY29uc3RhbnRzOjpNYXhBdHRyaWJzLgorICAgICoKKyAgICAqIEZyYWdtZW50IHNoYWRlciBvdXRwdXRzIGRvIG5vdCBwYXJ0aWNpcGF0ZSB0aGlzIGluIHRoaXMgYWNjb3VudGluZy4KKyAgICAqIFRoZXNlIGFyZSB0cmFja2VkIGV4Y2x1c2l2ZWx5IGJ5IFxjIGdsX2NvbnN0YW50czo6TWF4RHJhd0J1ZmZlcnMuCisgICAgKi8KKyAgIC8qQHsqLworICAgR0x1aW50IE1heElucHV0Q29tcG9uZW50czsKKyAgIEdMdWludCBNYXhPdXRwdXRDb21wb25lbnRzOworICAgLypAfSovCisKKyAgIC8qIEVTIDIuMCBhbmQgR0xfQVJCX0VTMl9jb21wYXRpYmlsaXR5ICovCisgICBzdHJ1Y3QgZ2xfcHJlY2lzaW9uIExvd0Zsb2F0LCBNZWRpdW1GbG9hdCwgSGlnaEZsb2F0OworICAgc3RydWN0IGdsX3ByZWNpc2lvbiBMb3dJbnQsIE1lZGl1bUludCwgSGlnaEludDsKKyAgIC8qIEdMX0FSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QgKi8KKyAgIEdMdWludCBNYXhVbmlmb3JtQmxvY2tzOworICAgR0x1aW50IE1heENvbWJpbmVkVW5pZm9ybUNvbXBvbmVudHM7CisgICBHTHVpbnQgTWF4VGV4dHVyZUltYWdlVW5pdHM7CisKKyAgIC8qIEdMX0FSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzICovCisgICBHTHVpbnQgTWF4QXRvbWljQnVmZmVyczsKKyAgIEdMdWludCBNYXhBdG9taWNDb3VudGVyczsKKworICAgLyogR0xfQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlICovCisgICBHTHVpbnQgTWF4SW1hZ2VVbmlmb3JtczsKK307CisKKworLyoqCisgKiBDb25zdGFudHMgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4gYnkgZGV2aWNlIGRyaXZlciBkdXJpbmcgY29udGV4dCBjcmVhdGlvbgorICogYnV0IGFyZSBuZXZlciBjaGFuZ2VkIGFmdGVyIHRoYXQuCisgKi8KK3N0cnVjdCBnbF9jb25zdGFudHMKK3sKKyAgIEdMdWludCBNYXhUZXh0dXJlTWJ5dGVzOyAgICAgIC8qKjwgTWF4IG1lbW9yeSBwZXIgaW1hZ2UsIGluIE1CICovCisgICBHTHVpbnQgTWF4VGV4dHVyZUxldmVsczsgICAgICAvKio8IE1heCBtaXBtYXAgbGV2ZWxzLiAqLyAKKyAgIEdMdWludCBNYXgzRFRleHR1cmVMZXZlbHM7ICAgIC8qKjwgTWF4IG1pcG1hcCBsZXZlbHMgZm9yIDNEIHRleHR1cmVzICovCisgICBHTHVpbnQgTWF4Q3ViZVRleHR1cmVMZXZlbHM7ICAvKio8IE1heCBtaXBtYXAgbGV2ZWxzIGZvciBjdWJlIHRleHR1cmVzICovCisgICBHTHVpbnQgTWF4QXJyYXlUZXh0dXJlTGF5ZXJzOyAvKio8IE1heCBsYXllcnMgaW4gYXJyYXkgdGV4dHVyZXMgKi8KKyAgIEdMdWludCBNYXhUZXh0dXJlUmVjdFNpemU7ICAgIC8qKjwgTWF4IHJlY3RhbmdsZSB0ZXh0dXJlIHNpemUsIGluIHBpeGVzICovCisgICBHTHVpbnQgTWF4VGV4dHVyZUNvb3JkVW5pdHM7CisgICBHTHVpbnQgTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0czsKKyAgIEdMdWludCBNYXhUZXh0dXJlVW5pdHM7IC8qKjwgPSBNSU4oQ29vcmRVbml0cywgRnJhZ21lbnRQcm9ncmFtLkltYWdlVW5pdHMpICovCisgICBHTGZsb2F0IE1heFRleHR1cmVNYXhBbmlzb3Ryb3B5OyAgLyoqPCBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgKi8KKyAgIEdMZmxvYXQgTWF4VGV4dHVyZUxvZEJpYXM7ICAgICAgICAvKio8IEdMX0VYVF90ZXh0dXJlX2xvZF9iaWFzICovCisgICBHTHVpbnQgTWF4VGV4dHVyZUJ1ZmZlclNpemU7ICAgICAgLyoqPCBHTF9BUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0ICovCisKKyAgIEdMdWludCBUZXh0dXJlQnVmZmVyT2Zmc2V0QWxpZ25tZW50OyAvKio8IEdMX0FSQl90ZXh0dXJlX2J1ZmZlcl9yYW5nZSAqLworCisgICBHTHVpbnQgTWF4QXJyYXlMb2NrU2l6ZTsKKworICAgR0xpbnQgU3ViUGl4ZWxCaXRzOworCisgICBHTGZsb2F0IE1pblBvaW50U2l6ZSwgTWF4UG9pbnRTaXplOwkgICAgIC8qKjwgYWxpYXNlZCAqLworICAgR0xmbG9hdCBNaW5Qb2ludFNpemVBQSwgTWF4UG9pbnRTaXplQUE7ICAgLyoqPCBhbnRpYWxpYXNlZCAqLworICAgR0xmbG9hdCBQb2ludFNpemVHcmFudWxhcml0eTsKKyAgIEdMZmxvYXQgTWluTGluZVdpZHRoLCBNYXhMaW5lV2lkdGg7ICAgICAgIC8qKjwgYWxpYXNlZCAqLworICAgR0xmbG9hdCBNaW5MaW5lV2lkdGhBQSwgTWF4TGluZVdpZHRoQUE7ICAgLyoqPCBhbnRpYWxpYXNlZCAqLworICAgR0xmbG9hdCBMaW5lV2lkdGhHcmFudWxhcml0eTsKKworICAgR0x1aW50IE1heENsaXBQbGFuZXM7CisgICBHTHVpbnQgTWF4TGlnaHRzOworICAgR0xmbG9hdCBNYXhTaGluaW5lc3M7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBHTF9OVl9saWdodF9tYXhfZXhwb25lbnQgKi8KKyAgIEdMZmxvYXQgTWF4U3BvdEV4cG9uZW50OyAgICAgICAgICAgICAgICAgIC8qKjwgR0xfTlZfbGlnaHRfbWF4X2V4cG9uZW50ICovCisKKyAgIEdMdWludCBNYXhWaWV3cG9ydFdpZHRoLCBNYXhWaWV3cG9ydEhlaWdodDsKKyAgIEdMdWludCBNYXhWaWV3cG9ydHM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR0xfQVJCX3ZpZXdwb3J0X2FycmF5ICovCisgICBHTHVpbnQgVmlld3BvcnRTdWJwaXhlbEJpdHM7ICAgICAgICAgICAgICAvKio8IEdMX0FSQl92aWV3cG9ydF9hcnJheSAqLworICAgc3RydWN0IHsKKyAgICAgIEdMZmxvYXQgTWluOworICAgICAgR0xmbG9hdCBNYXg7CisgICB9IFZpZXdwb3J0Qm91bmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEdMX0FSQl92aWV3cG9ydF9hcnJheSAqLworCisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9jb25zdGFudHMgUHJvZ3JhbVtNRVNBX1NIQURFUl9TVEFHRVNdOworICAgR0x1aW50IE1heFByb2dyYW1NYXRyaWNlczsKKyAgIEdMdWludCBNYXhQcm9ncmFtTWF0cml4U3RhY2tEZXB0aDsKKworICAgc3RydWN0IHsKKyAgICAgIEdMdWludCBTYW1wbGVzUGFzc2VkOworICAgICAgR0x1aW50IFRpbWVFbGFwc2VkOworICAgICAgR0x1aW50IFRpbWVzdGFtcDsKKyAgICAgIEdMdWludCBQcmltaXRpdmVzR2VuZXJhdGVkOworICAgICAgR0x1aW50IFByaW1pdGl2ZXNXcml0dGVuOworICAgfSBRdWVyeUNvdW50ZXJCaXRzOworCisgICAvKiogdmVydGV4IGFycmF5IC8gYnVmZmVyIG9iamVjdCBib3VuZHMgY2hlY2tpbmcgKi8KKyAgIEdMYm9vbGVhbiBDaGVja0FycmF5Qm91bmRzOworCisgICBHTHVpbnQgTWF4RHJhd0J1ZmZlcnM7ICAgIC8qKjwgR0xfQVJCX2RyYXdfYnVmZmVycyAqLworCisgICBHTHVpbnQgTWF4Q29sb3JBdHRhY2htZW50czsgICAvKio8IEdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKyAgIEdMdWludCBNYXhSZW5kZXJidWZmZXJTaXplOyAgIC8qKjwgR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdCAqLworICAgR0x1aW50IE1heFNhbXBsZXM7ICAgICAgICAgICAgLyoqPCBHTF9BUkJfZnJhbWVidWZmZXJfb2JqZWN0ICovCisKKyAgIC8qKiBOdW1iZXIgb2YgdmFyeWluZyB2ZWN0b3JzIGJldHdlZW4gYW55IHR3byBzaGFkZXIgc3RhZ2VzLiAqLworICAgR0x1aW50IE1heFZhcnlpbmc7CisKKyAgIC8qKiBAeworICAgICogR0xfQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdAorICAgICovCisgICBHTHVpbnQgTWF4Q29tYmluZWRVbmlmb3JtQmxvY2tzOworICAgR0x1aW50IE1heFVuaWZvcm1CdWZmZXJCaW5kaW5nczsKKyAgIEdMdWludCBNYXhVbmlmb3JtQmxvY2tTaXplOworICAgR0x1aW50IFVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQ7CisgICAvKiogQH0gKi8KKworICAgLyoqIEdMX0FSQl9nZW9tZXRyeV9zaGFkZXI0ICovCisgICBHTHVpbnQgTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlczsKKyAgIEdMdWludCBNYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50czsKKworICAgR0x1aW50IEdMU0xWZXJzaW9uOyAgLyoqPCBHTFNMIHZlcnNpb24gc3VwcG9ydGVkIChleDogMTIwID0gMS4yMCkgKi8KKworICAgLyoqCisgICAgKiBDaGFuZ2VzIGRlZmF1bHQgR0xTTCBleHRlbnNpb24gYmVoYXZpb3IgZnJvbSAiZXJyb3IiIHRvICJ3YXJuIi4gIEl0J3Mgb3V0CisgICAgKiBvZiBzcGVjLCBidXQgaXQgY2FuIG1ha2Ugc29tZSBhcHBzIHdvcmsgdGhhdCBvdGhlcndpc2Ugd291bGRuJ3QuCisgICAgKi8KKyAgIEdMYm9vbGVhbiBGb3JjZUdMU0xFeHRlbnNpb25zV2FybjsKKworICAgLyoqCisgICAgKiBJZiBub24temVybywgZm9yY2VzIEdMU0wgc2hhZGVycyB3aXRob3V0IHRoZSAjdmVyc2lvbiBkaXJlY3RpdmUgdG8gYmVoYXZlCisgICAgKiBhcyBpZiB0aGV5IGJlZ2FuIHdpdGggIiN2ZXJzaW9uIEZvcmNlR0xTTFZlcnNpb24iLgorICAgICovCisgICBHTHVpbnQgRm9yY2VHTFNMVmVyc2lvbjsKKworICAgLyoqCisgICAgKiBMdW5hckdsYXNzIG9wdGltaXplciBtb2RlOgorICAgICogMCA9IG5ldmVyIHVzZSAoZm9yY2UgZGlzYWJsZSkKKyAgICAqIDEgPSB1c2UgZHJpdmVyIHdoaXRlbGlzdAorICAgICogMiA9IGFsd2F5cyB1c2UgKGZvcmNlIGVuYWJsZSkKKyAgICAqLworICAgR0x1aW50IEdsYXNzTW9kZTsKKworICAgLyoqCisgICAgKiBMdW5hckdsYXNzIG9wdGltaXphdGlvbiBmbGFnczoKKyAgICAqIFRoaXMgaXMganVzdCBvbmUgZm9yIG5vdywgYnV0IG1vcmUgc2hvdWxkIGJlIGFkZGVkLgorICAgICovCisgICBHTGJvb2xlYW4gR2xhc3NFbmFibGVSZWFzc29jaWF0aW9uOworCisgICAvKioKKyAgICAqIERvZXMgdGhlIGRyaXZlciBzdXBwb3J0IHJlYWwgMzItYml0IGludGVnZXJzPyAgKE90aGVyd2lzZSwgaW50ZWdlcnMgYXJlCisgICAgKiBzaW11bGF0ZWQgdmlhIGZsb2F0cy4pCisgICAgKi8KKyAgIEdMYm9vbGVhbiBOYXRpdmVJbnRlZ2VyczsKKworICAgLyoqCisgICAgKiBJZiB0aGUgZHJpdmVyIHN1cHBvcnRzIHJlYWwgMzItYml0IGludGVnZXJzLCB3aGF0IGludGVnZXIgdmFsdWUgc2hvdWxkIGJlCisgICAgKiB1c2VkIGZvciBib29sZWFuIHRydWUgaW4gdW5pZm9ybSB1cGxvYWRzPyAgKFVzdWFsbHkgMSBvciB+MC4pCisgICAgKi8KKyAgIEdMdWludCBVbmlmb3JtQm9vbGVhblRydWU7CisKKyAgIC8qKiBXaGljaCB0ZXh0dXJlIHVuaXRzIHN1cHBvcnQgR0xfQVRJX2Vudm1hcF9idW1wbWFwIGFzIHRhcmdldHMgKi8KKyAgIEdMYml0ZmllbGQgU3VwcG9ydGVkQnVtcFVuaXRzOworCisgICAvKioKKyAgICAqIE1heGltdW0gYW1vdW50IG9mIHRpbWUsIG1lYXN1cmVkIGluIG5hbnNlY29uZHMsIHRoYXQgdGhlIHNlcnZlciBjYW4gd2FpdC4KKyAgICAqLworICAgR0x1aW50NjQgTWF4U2VydmVyV2FpdFRpbWVvdXQ7CisKKyAgIC8qKiBHTF9FWFRfcHJvdm9raW5nX3ZlcnRleCAqLworICAgR0xib29sZWFuIFF1YWRzRm9sbG93UHJvdm9raW5nVmVydGV4Q29udmVudGlvbjsKKworICAgLyoqIE9wZW5HTCB2ZXJzaW9uIDMuMCAqLworICAgR0xiaXRmaWVsZCBDb250ZXh0RmxhZ3M7ICAvKio8IEV4OiBHTF9DT05URVhUX0ZMQUdfRk9SV0FSRF9DT01QQVRJQkxFX0JJVCAqLworCisgICAvKiogT3BlbkdMIHZlcnNpb24gMy4yICovCisgICBHTGJpdGZpZWxkIFByb2ZpbGVNYXNrOyAgIC8qKjwgTWFzayBvZiBDT05URVhUX3hfUFJPRklMRV9CSVQgKi8KKworICAgLyoqIEdMX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sgKi8KKyAgIEdMdWludCBNYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnM7CisgICBHTHVpbnQgTWF4VHJhbnNmb3JtRmVlZGJhY2tTZXBhcmF0ZUNvbXBvbmVudHM7CisgICBHTHVpbnQgTWF4VHJhbnNmb3JtRmVlZGJhY2tJbnRlcmxlYXZlZENvbXBvbmVudHM7CisgICBHTHVpbnQgTWF4VmVydGV4U3RyZWFtczsKKworICAgLyoqIEdMX0VYVF9ncHVfc2hhZGVyNCAqLworICAgR0xpbnQgTWluUHJvZ3JhbVRleGVsT2Zmc2V0LCBNYXhQcm9ncmFtVGV4ZWxPZmZzZXQ7CisKKyAgIC8qKiBHTF9BUkJfdGV4dHVyZV9nYXRoZXIgKi8KKyAgIEdMdWludCBNaW5Qcm9ncmFtVGV4dHVyZUdhdGhlck9mZnNldDsKKyAgIEdMdWludCBNYXhQcm9ncmFtVGV4dHVyZUdhdGhlck9mZnNldDsKKyAgIEdMdWludCBNYXhQcm9ncmFtVGV4dHVyZUdhdGhlckNvbXBvbmVudHM7CisKKyAgIC8qIEdMX0FSQl9yb2J1c3RuZXNzICovCisgICBHTGVudW0gUmVzZXRTdHJhdGVneTsKKworICAgLyogR0xfQVJCX2JsZW5kX2Z1bmNfZXh0ZW5kZWQgKi8KKyAgIEdMdWludCBNYXhEdWFsU291cmNlRHJhd0J1ZmZlcnM7CisKKyAgIC8qKgorICAgICogV2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gc3RyaXBzIG91dCBhbmQgaWdub3JlcyB0ZXh0dXJlIGJvcmRlcnMuCisgICAgKgorICAgICogTWFueSBHUFUgaGFyZHdhcmUgaW1wbGVtZW50YXRpb25zIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIHdpdGggdGV4dHVyZQorICAgICogYm9yZGVycyBhbmQgbWlwbWFwcGVkIHRleHR1cmVzLiAgKE5vdGU6IG5vdCBzdGF0aWMgYm9yZGVyIGNvbG9yLCBidXQgdGhlCisgICAgKiBvbGQgMS1waXhlbCBib3JkZXIgYXJvdW5kIGVhY2ggZWRnZSkuICBJbXBsZW1lbnRhdGlvbnMgdGhlbiBoYXZlIHRvIGRvCisgICAgKiBzbG93IGZhbGxiYWNrcyB0byBiZSBjb3JyZWN0LCBvciBqdXN0IGlnbm9yZSB0aGUgYm9yZGVyIGFuZCBiZSBmYXN0IGJ1dAorICAgICogd3JvbmcuICBTZXR0aW5nIHRoZSBmbGFnIHN0cmlwcyB0aGUgYm9yZGVyIG9mZiBvZiBUZXhJbWFnZSBjYWxscywKKyAgICAqIHByb3ZpZGluZyAiZmFzdCBidXQgd3JvbmciIGF0IHNpZ25pZmljYW50bHkgcmVkdWNlZCBkcml2ZXIgY29tcGxleGl0eS4KKyAgICAqCisgICAgKiBUZXh0dXJlIGJvcmRlcnMgYXJlIGRlcHJlY2F0ZWQgaW4gR0wgMy4wLgorICAgICoqLworICAgR0xib29sZWFuIFN0cmlwVGV4dHVyZUJvcmRlcjsKKworICAgLyoqCisgICAgKiBGb3IgZHJpdmVycyB3aGljaCBjYW4gZG8gYSBiZXR0ZXIgam9iIGF0IGVsaW1pbmF0aW5nIHVudXNlZCB1bmlmb3JtcworICAgICogdGhhbiB0aGUgR0xTTCBjb21waWxlci4KKyAgICAqCisgICAgKiBYWFggUmVtb3ZlIHRoZXNlIGFzIHNvb24gYXMgYSBiZXR0ZXIgc29sdXRpb24gaXMgYXZhaWxhYmxlLgorICAgICovCisgICBHTGJvb2xlYW4gR0xTTFNraXBTdHJpY3RNYXhVbmlmb3JtTGltaXRDaGVjazsKKworICAgLyoqCisgICAgKiBGb3JjZSBzb2Z0d2FyZSBzdXBwb3J0IGZvciBwcmltaXRpdmUgcmVzdGFydCBpbiB0aGUgVkJPIG1vZHVsZS4KKyAgICAqLworICAgR0xib29sZWFuIFByaW1pdGl2ZVJlc3RhcnRJblNvZnR3YXJlOworCisgICAvKioKKyAgICAqIEFsd2F5cyB1c2UgdGhlIEdldFRyYW5zZm9ybUZlZWRiYWNrVmVydGV4Q291bnQoKSBkcml2ZXIgaG9vaywgcmF0aGVyCisgICAgKiB0aGFuIHBhc3NpbmcgdGhlIHRyYW5zZm9ybSBmZWVkYmFjayBvYmplY3QgdG8gdGhlIGRyYXdpbmcgZnVuY3Rpb24uCisgICAgKi8KKyAgIEdMYm9vbGVhbiBBbHdheXNVc2VHZXRUcmFuc2Zvcm1GZWVkYmFja1ZlcnRleENvdW50OworCisgICAvKiogR0xfQVJCX21hcF9idWZmZXJfYWxpZ25tZW50ICovCisgICBHTHVpbnQgTWluTWFwQnVmZmVyQWxpZ25tZW50OworCisgICAvKioKKyAgICAqIERpc2FibGUgdmFyeWluZyBwYWNraW5nLiAgVGhpcyBpcyBvdXQgb2Ygc3BlYywgYnV0IHBvdGVudGlhbGx5IHVzZWZ1bAorICAgICogZm9yIG9sZGVyIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnRzIGEgbGltaXRlZCBudW1iZXIgb2YgdGV4dHVyZQorICAgICogaW5kaXJlY3Rpb25zLS1vbiB0aGVzZSBwbGF0Zm9ybXMsIHVucGFja2luZyB0aGUgdmFyeWluZ3MgaW4gdGhlIGZyYWdtZW50CisgICAgKiBzaGFkZXIgaW5jcmVhc2VzIHRoZSBudW1iZXIgb2YgdGV4dHVyZSBpbmRpcmVjdGlvbnMgYnkgMSwgd2hpY2ggbWlnaHQKKyAgICAqIG1ha2Ugc29tZSBzaGFkZXJzIG5vdCBleGVjdXRhYmxlIGF0IGFsbC4KKyAgICAqCisgICAgKiBEcml2ZXJzIHRoYXQgc3VwcG9ydCB0cmFuc2Zvcm0gZmVlZGJhY2sgbXVzdCBzZXQgdGhpcyB2YWx1ZSB0byBHTF9GQUxTRS4KKyAgICAqLworICAgR0xib29sZWFuIERpc2FibGVWYXJ5aW5nUGFja2luZzsKKworICAgLyoKKyAgICAqIE1heGltdW0gdmFsdWUgc3VwcG9ydGVkIGZvciBhbiBpbmRleCBpbiBEcmF3RWxlbWVudHMgYW5kIGZyaWVuZHMuCisgICAgKgorICAgICogVGhpcyBtdXN0IGJlIGF0IGxlYXN0ICgxdWxsPDwyNCktMS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgKiAoMXVsbDw8MzIpLTEuCisgICAgKgorICAgICogXHNpbmNlIEVTIDMuMCBvciBHTF9BUkJfRVMzX2NvbXBhdGliaWxpdHkKKyAgICAqIFxzYSBfbWVzYV9pbml0X2NvbnN0YW50cworICAgICovCisgICBHTHVpbnQ2NCBNYXhFbGVtZW50SW5kZXg7CisKKyAgIC8qKgorICAgICogRGlzYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBsaW5lIGNvbnRpbnVhdGlvbnMgKGxpbmVzIGVuZGluZyB3aXRoIGEKKyAgICAqIGJhY2tzbGFzaCBjaGFyYWN0ZXIgKCdcJykgaW4gR0xTTCBzb3VyY2UuCisgICAgKi8KKyAgIEdMYm9vbGVhbiBEaXNhYmxlR0xTTExpbmVDb250aW51YXRpb25zOworCisgICAvKiogR0xfQVJCX3RleHR1cmVfbXVsdGlzYW1wbGUgKi8KKyAgIEdMaW50IE1heENvbG9yVGV4dHVyZVNhbXBsZXM7CisgICBHTGludCBNYXhEZXB0aFRleHR1cmVTYW1wbGVzOworICAgR0xpbnQgTWF4SW50ZWdlclNhbXBsZXM7CisKKyAgIC8qKiBHTF9BUkJfc2hhZGVyX2F0b21pY19jb3VudGVycyAqLworICAgR0x1aW50IE1heEF0b21pY0J1ZmZlckJpbmRpbmdzOworICAgR0x1aW50IE1heEF0b21pY0J1ZmZlclNpemU7CisgICBHTHVpbnQgTWF4Q29tYmluZWRBdG9taWNCdWZmZXJzOworICAgR0x1aW50IE1heENvbWJpbmVkQXRvbWljQ291bnRlcnM7CisKKyAgIC8qKiBHTF9BUkJfdmVydGV4X2F0dHJpYl9iaW5kaW5nICovCisgICBHTGludCBNYXhWZXJ0ZXhBdHRyaWJSZWxhdGl2ZU9mZnNldDsKKyAgIEdMaW50IE1heFZlcnRleEF0dHJpYkJpbmRpbmdzOworCisgICAvKiBHTF9BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUgKi8KKyAgIEdMdWludCBNYXhJbWFnZVVuaXRzOworICAgR0x1aW50IE1heENvbWJpbmVkSW1hZ2VVbml0c0FuZEZyYWdtZW50T3V0cHV0czsKKyAgIEdMdWludCBNYXhJbWFnZVNhbXBsZXM7CisgICBHTHVpbnQgTWF4Q29tYmluZWRJbWFnZVVuaWZvcm1zOworCisgICAvKiogR0xfQVJCX2NvbXB1dGVfc2hhZGVyICovCisgICBHTHVpbnQgTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzNdOyAvKiBBcnJheSBvZiB4LCB5LCB6IGRpbWVuc2lvbnMgKi8KKyAgIEdMdWludCBNYXhDb21wdXRlV29ya0dyb3VwU2l6ZVszXTsgLyogQXJyYXkgb2YgeCwgeSwgeiBkaW1lbnNpb25zICovCisgICBHTHVpbnQgTWF4Q29tcHV0ZVdvcmtHcm91cEludm9jYXRpb25zOworCisgICAvKiogR0xfQVJCX2dwdV9zaGFkZXI1ICovCisgICBHTGZsb2F0IE1pbkZyYWdtZW50SW50ZXJwb2xhdGlvbk9mZnNldDsKKyAgIEdMZmxvYXQgTWF4RnJhZ21lbnRJbnRlcnBvbGF0aW9uT2Zmc2V0OworCisgICBHTGJvb2xlYW4gRmFrZVNXTVNBQTsKKworICAgLyoKKyAgICAqIERlZmVyIGNlcnRhaW4gb3BlcmF0aW9ucyB0byBhIHRocmVhZCBwb29sLgorICAgICoKKyAgICAqIFdoZW4gRGVmZXJMaW5rUHJvZ3JhbSBpcyBzZXQsIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIHRocmVhZC1zYWZlCisgICAgKgorICAgICogICBjdHgtPkRyaXZlci5OZXdTaGFkZXIKKyAgICAqICAgY3R4LT5Ecml2ZXIuRGVsZXRlU2hhZGVyCisgICAgKiAgIGN0eC0+RHJpdmVyLkxpbmtTaGFkZXIKKyAgICAqLworICAgR0xib29sZWFuIERlZmVyQ29tcGlsZVNoYWRlcjsKKyAgIEdMYm9vbGVhbiBEZWZlckxpbmtQcm9ncmFtOworCisgICAvKiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gbGltaXQgYm90aCBwcm9ncmFtIGFuZCBzaGFkZXIgY2FjaGUgc2l6ZXMgKi8KKyAgIC8qIElmIHNldCB0byAwLCBpdCB3aWxsIGRpc2FibGUgY2FjaGluZyAqLworICAgR0x1aW50IE1heFNoYWRlckNhY2hlU2l6ZTsKK307CisKKworLyoqCisgKiBFbmFibGUgZmxhZyBmb3IgZWFjaCBPcGVuR0wgZXh0ZW5zaW9uLiAgRGlmZmVyZW50IGRldmljZSBkcml2ZXJzIHdpbGwKKyAqIGVuYWJsZSBkaWZmZXJlbnQgZXh0ZW5zaW9ucyBhdCBydW50aW1lLgorICovCitzdHJ1Y3QgZ2xfZXh0ZW5zaW9ucworeworICAgR0xib29sZWFuIGR1bW15OyAgLyogZG9uJ3QgcmVtb3ZlIHRoaXMhICovCisgICBHTGJvb2xlYW4gZHVtbXlfdHJ1ZTsgIC8qIFNldCB0cnVlIGJ5IF9tZXNhX2luaXRfZXh0ZW5zaW9ucygpLiAqLworICAgR0xib29sZWFuIGR1bW15X2ZhbHNlOyAvKiBTZXQgZmFsc2UgYnkgX21lc2FfaW5pdF9leHRlbnNpb25zKCkuICovCisgICBHTGJvb2xlYW4gQU5HTEVfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQ7CisgICBHTGJvb2xlYW4gQVJCX0VTMl9jb21wYXRpYmlsaXR5OworICAgR0xib29sZWFuIEFSQl9FUzNfY29tcGF0aWJpbGl0eTsKKyAgIEdMYm9vbGVhbiBBUkJfYXJyYXlzX29mX2FycmF5czsKKyAgIEdMYm9vbGVhbiBBUkJfYmFzZV9pbnN0YW5jZTsKKyAgIEdMYm9vbGVhbiBBUkJfYmxlbmRfZnVuY19leHRlbmRlZDsKKyAgIEdMYm9vbGVhbiBBUkJfYnVmZmVyX3N0b3JhZ2U7CisgICBHTGJvb2xlYW4gQVJCX2NvbG9yX2J1ZmZlcl9mbG9hdDsKKyAgIEdMYm9vbGVhbiBBUkJfY29tcHV0ZV9zaGFkZXI7CisgICBHTGJvb2xlYW4gQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aDsKKyAgIEdMYm9vbGVhbiBBUkJfZGVwdGhfYnVmZmVyX2Zsb2F0OworICAgR0xib29sZWFuIEFSQl9kZXB0aF9jbGFtcDsKKyAgIEdMYm9vbGVhbiBBUkJfZGVwdGhfdGV4dHVyZTsKKyAgIEdMYm9vbGVhbiBBUkJfZHJhd19idWZmZXJzX2JsZW5kOworICAgR0xib29sZWFuIEFSQl9kcmF3X2VsZW1lbnRzX2Jhc2VfdmVydGV4OworICAgR0xib29sZWFuIEFSQl9kcmF3X2luZGlyZWN0OworICAgR0xib29sZWFuIEFSQl9kcmF3X2luc3RhbmNlZDsKKyAgIEdMYm9vbGVhbiBBUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnM7CisgICBHTGJvb2xlYW4gQVJCX2ZyYWdtZW50X3Byb2dyYW07CisgICBHTGJvb2xlYW4gQVJCX2ZyYWdtZW50X3Byb2dyYW1fc2hhZG93OworICAgR0xib29sZWFuIEFSQl9mcmFnbWVudF9zaGFkZXI7CisgICBHTGJvb2xlYW4gQVJCX2ZyYW1lYnVmZmVyX29iamVjdDsKKyAgIEdMYm9vbGVhbiBBUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uOworICAgR0xib29sZWFuIEFSQl9nZW9tZXRyeV9zaGFkZXI0OworICAgR0xib29sZWFuIEFSQl9ncHVfc2hhZGVyNTsKKyAgIEdMYm9vbGVhbiBBUkJfaGFsZl9mbG9hdF92ZXJ0ZXg7CisgICBHTGJvb2xlYW4gQVJCX2luc3RhbmNlZF9hcnJheXM7CisgICBHTGJvb2xlYW4gQVJCX2ludGVybmFsZm9ybWF0X3F1ZXJ5OworICAgR0xib29sZWFuIEFSQl9tYXBfYnVmZmVyX3JhbmdlOworICAgR0xib29sZWFuIEFSQl9vY2NsdXNpb25fcXVlcnk7CisgICBHTGJvb2xlYW4gQVJCX29jY2x1c2lvbl9xdWVyeTI7CisgICBHTGJvb2xlYW4gQVJCX3BvaW50X3Nwcml0ZTsKKyAgIEdMYm9vbGVhbiBBUkJfc2FtcGxlX3NoYWRpbmc7CisgICBHTGJvb2xlYW4gQVJCX3NlYW1sZXNzX2N1YmVfbWFwOworICAgR0xib29sZWFuIEFSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzOworICAgR0xib29sZWFuIEFSQl9zaGFkZXJfYml0X2VuY29kaW5nOworICAgR0xib29sZWFuIEFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZTsKKyAgIEdMYm9vbGVhbiBBUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0OworICAgR0xib29sZWFuIEFSQl9zaGFkZXJfdGV4dHVyZV9sb2Q7CisgICBHTGJvb2xlYW4gQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZzsKKyAgIEdMYm9vbGVhbiBBUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrOworICAgR0xib29sZWFuIEFSQl9zaGFkb3c7CisgICBHTGJvb2xlYW4gQVJCX3N0ZW5jaWxfdGV4dHVyaW5nOworICAgR0xib29sZWFuIEFSQl9zeW5jOworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcDsKKyAgIEdMYm9vbGVhbiBBUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0OworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX2J1ZmZlcl9vYmplY3RfcmdiMzI7CisgICBHTGJvb2xlYW4gQVJCX3RleHR1cmVfYnVmZmVyX3JhbmdlOworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGM7CisgICBHTGJvb2xlYW4gQVJCX3RleHR1cmVfY3ViZV9tYXA7CisgICBHTGJvb2xlYW4gQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXk7CisgICBHTGJvb2xlYW4gQVJCX3RleHR1cmVfZW52X2NvbWJpbmU7CisgICBHTGJvb2xlYW4gQVJCX3RleHR1cmVfZW52X2Nyb3NzYmFyOworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX2Vudl9kb3QzOworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX2Zsb2F0OworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX2dhdGhlcjsKKyAgIEdMYm9vbGVhbiBBUkJfdGV4dHVyZV9taXJyb3JfY2xhbXBfdG9fZWRnZTsKKyAgIEdMYm9vbGVhbiBBUkJfdGV4dHVyZV9tdWx0aXNhbXBsZTsKKyAgIEdMYm9vbGVhbiBBUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvOworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX3N0ZW5jaWw4OworICAgR0xib29sZWFuIEFSQl90ZXh0dXJlX3F1ZXJ5X2xldmVsczsKKyAgIEdMYm9vbGVhbiBBUkJfdGV4dHVyZV9xdWVyeV9sb2Q7CisgICBHTGJvb2xlYW4gQVJCX3RleHR1cmVfcmc7CisgICBHTGJvb2xlYW4gQVJCX3RleHR1cmVfcmdiMTBfYTJ1aTsKKyAgIEdMYm9vbGVhbiBBUkJfdGV4dHVyZV92aWV3OworICAgR0xib29sZWFuIEFSQl90aW1lcl9xdWVyeTsKKyAgIEdMYm9vbGVhbiBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMjsKKyAgIEdMYm9vbGVhbiBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMzsKKyAgIEdMYm9vbGVhbiBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrX2luc3RhbmNlZDsKKyAgIEdMYm9vbGVhbiBBUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0OworICAgR0xib29sZWFuIEFSQl92ZXJ0ZXhfcHJvZ3JhbTsKKyAgIEdMYm9vbGVhbiBBUkJfdmVydGV4X3NoYWRlcjsKKyAgIEdMYm9vbGVhbiBBUkJfdmVydGV4X3R5cGVfMTBmXzExZl8xMWZfcmV2OworICAgR0xib29sZWFuIEFSQl92ZXJ0ZXhfdHlwZV8yXzEwXzEwXzEwX3JldjsKKyAgIEdMYm9vbGVhbiBBUkJfdmlld3BvcnRfYXJyYXk7CisgICBHTGJvb2xlYW4gRVhUX2JsZW5kX2NvbG9yOworICAgR0xib29sZWFuIEVYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZTsKKyAgIEdMYm9vbGVhbiBFWFRfYmxlbmRfZnVuY19zZXBhcmF0ZTsKKyAgIEdMYm9vbGVhbiBFWFRfYmxlbmRfbWlubWF4OworICAgR0xib29sZWFuIEVYVF9kZXB0aF9ib3VuZHNfdGVzdDsKKyAgIEdMYm9vbGVhbiBFWFRfZHJhd19idWZmZXJzMjsKKyAgIEdMYm9vbGVhbiBFWFRfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGU7CisgICBHTGJvb2xlYW4gRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlX2JsaXRfc2NhbGVkOworICAgR0xib29sZWFuIEVYVF9mcmFtZWJ1ZmZlcl9zUkdCOworICAgR0xib29sZWFuIEVYVF9ncHVfcHJvZ3JhbV9wYXJhbWV0ZXJzOworICAgR0xib29sZWFuIEVYVF9ncHVfc2hhZGVyNDsKKyAgIEdMYm9vbGVhbiBFWFRfcGFja2VkX2Zsb2F0OworICAgR0xib29sZWFuIEVYVF9waXhlbF9idWZmZXJfb2JqZWN0OworICAgR0xib29sZWFuIEVYVF9wb2ludF9wYXJhbWV0ZXJzOworICAgR0xib29sZWFuIEVYVF9wcm92b2tpbmdfdmVydGV4OworICAgR0xib29sZWFuIEVYVF9zaGFkZXJfaW50ZWdlcl9taXg7CisgICBHTGJvb2xlYW4gRVhUX3N0ZW5jaWxfdHdvX3NpZGU7CisgICBHTGJvb2xlYW4gRVhUX3RleHR1cmUzRDsKKyAgIEdMYm9vbGVhbiBFWFRfdGV4dHVyZV9hcnJheTsKKyAgIEdMYm9vbGVhbiBFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9sYXRjOworICAgR0xib29sZWFuIEVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGM7CisgICBHTGJvb2xlYW4gRVhUX3RleHR1cmVfZW52X2RvdDM7CisgICBHTGJvb2xlYW4gRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljOworICAgR0xib29sZWFuIEVYVF90ZXh0dXJlX2ludGVnZXI7CisgICBHTGJvb2xlYW4gRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wOworICAgR0xib29sZWFuIEVYVF90ZXh0dXJlX3NoYXJlZF9leHBvbmVudDsKKyAgIEdMYm9vbGVhbiBFWFRfdGV4dHVyZV9zbm9ybTsKKyAgIEdMYm9vbGVhbiBFWFRfdGV4dHVyZV9zUkdCOworICAgR0xib29sZWFuIEVYVF90ZXh0dXJlX3NSR0JfZGVjb2RlOworICAgR0xib29sZWFuIEVYVF90ZXh0dXJlX3N3aXp6bGU7CisgICBHTGJvb2xlYW4gRVhUX3RyYW5zZm9ybV9mZWVkYmFjazsKKyAgIEdMYm9vbGVhbiBFWFRfdGltZXJfcXVlcnk7CisgICBHTGJvb2xlYW4gRVhUX3ZlcnRleF9hcnJheV9iZ3JhOworICAgR0xib29sZWFuIE9FU19zdGFuZGFyZF9kZXJpdmF0aXZlczsKKyAgIC8qIHZlbmRvciBleHRlbnNpb25zICovCisgICBHTGJvb2xlYW4gQU1EX3BlcmZvcm1hbmNlX21vbml0b3I7CisgICBHTGJvb2xlYW4gQU1EX3NlYW1sZXNzX2N1YmVtYXBfcGVyX3RleHR1cmU7CisgICBHTGJvb2xlYW4gQU1EX3ZlcnRleF9zaGFkZXJfbGF5ZXI7CisgICBHTGJvb2xlYW4gQVBQTEVfb2JqZWN0X3B1cmdlYWJsZTsKKyAgIEdMYm9vbGVhbiBBVElfZW52bWFwX2J1bXBtYXA7CisgICBHTGJvb2xlYW4gQVRJX3RleHR1cmVfY29tcHJlc3Npb25fM2RjOworICAgR0xib29sZWFuIEFUSV90ZXh0dXJlX21pcnJvcl9vbmNlOworICAgR0xib29sZWFuIEFUSV90ZXh0dXJlX2Vudl9jb21iaW5lMzsKKyAgIEdMYm9vbGVhbiBBVElfZnJhZ21lbnRfc2hhZGVyOworICAgR0xib29sZWFuIEFUSV9zZXBhcmF0ZV9zdGVuY2lsOworICAgR0xib29sZWFuIElOVEVMX3BlcmZvcm1hbmNlX3F1ZXJ5OworICAgR0xib29sZWFuIE1FU0FfcGFja19pbnZlcnQ7CisgICBHTGJvb2xlYW4gTUVTQV95Y2Jjcl90ZXh0dXJlOworICAgR0xib29sZWFuIE5WX2NvbmRpdGlvbmFsX3JlbmRlcjsKKyAgIEdMYm9vbGVhbiBOVl9mb2dfZGlzdGFuY2U7CisgICBHTGJvb2xlYW4gTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb247CisgICBHTGJvb2xlYW4gTlZfcG9pbnRfc3ByaXRlOworICAgR0xib29sZWFuIE5WX3ByaW1pdGl2ZV9yZXN0YXJ0OworICAgR0xib29sZWFuIE5WX3RleHR1cmVfYmFycmllcjsKKyAgIEdMYm9vbGVhbiBOVl90ZXh0dXJlX2Vudl9jb21iaW5lNDsKKyAgIEdMYm9vbGVhbiBOVl90ZXh0dXJlX3JlY3RhbmdsZTsKKyAgIEdMYm9vbGVhbiBOVl92ZHBhdV9pbnRlcm9wOworICAgR0xib29sZWFuIFRERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxOworICAgR0xib29sZWFuIE9FU19FR0xfaW1hZ2U7CisgICBHTGJvb2xlYW4gT0VTX2RyYXdfdGV4dHVyZTsKKyAgIEdMYm9vbGVhbiBPRVNfZGVwdGhfdGV4dHVyZV9jdWJlX21hcDsKKyAgIEdMYm9vbGVhbiBPRVNfRUdMX2ltYWdlX2V4dGVybmFsOworICAgR0xib29sZWFuIE9FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlOworICAgR0xib29sZWFuIGV4dGVuc2lvbl9zZW50aW5lbDsKKyAgIC8qKiBUaGUgZXh0ZW5zaW9uIHN0cmluZyAqLworICAgY29uc3QgR0x1Ynl0ZSAqU3RyaW5nOworICAgLyoqIE51bWJlciBvZiBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyAqLworICAgR0x1aW50IENvdW50OworfTsKKworCisvKioKKyAqIEEgc3RhY2sgb2YgbWF0cmljZXMgKHByb2plY3Rpb24sIG1vZGVsdmlldywgY29sb3IsIHRleHR1cmUsIGV0YykuCisgKi8KK3N0cnVjdCBnbF9tYXRyaXhfc3RhY2sKK3sKKyAgIEdMbWF0cml4ICpUb3A7ICAgICAgLyoqPCBwb2ludHMgaW50byBTdGFjayAqLworICAgR0xtYXRyaXggKlN0YWNrOyAgICAvKio8IGFycmF5IFtNYXhEZXB0aF0gb2YgR0xtYXRyaXggKi8KKyAgIEdMdWludCBEZXB0aDsgICAgICAgLyoqPCAwIDw9IERlcHRoIDwgTWF4RGVwdGggKi8KKyAgIEdMdWludCBNYXhEZXB0aDsgICAgLyoqPCBzaXplIG9mIFN0YWNrW10gYXJyYXkgKi8KKyAgIEdMdWludCBEaXJ0eUZsYWc7ICAgLyoqPCBfTkVXX01PREVMVklFVyBvciBfTkVXX1BST0pFQ1RJT04sIGZvciBleGFtcGxlICovCit9OworCisKKy8qKgorICogXG5hbWUgQml0cyBmb3IgaW1hZ2UgdHJhbnNmZXIgb3BlcmF0aW9ucyAKKyAqIFxzYSBfX3N0cnVjdCBnbF9jb250ZXh0UmVjOjpJbWFnZVRyYW5zZmVyU3RhdGUuCisgKi8KKy8qQHsqLworI2RlZmluZSBJTUFHRV9TQ0FMRV9CSUFTX0JJVCAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgSU1BR0VfU0hJRlRfT0ZGU0VUX0JJVCAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIElNQUdFX01BUF9DT0xPUl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBJTUFHRV9DTEFNUF9CSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMAorCisKKy8qKiBQaXhlbCBUcmFuc2ZlciBvcHMgKi8KKyNkZWZpbmUgSU1BR0VfQklUUyAoSU1BR0VfU0NBTEVfQklBU19CSVQgfAkJCVwKKwkJICAgIElNQUdFX1NISUZUX09GRlNFVF9CSVQgfAkJCVwKKwkJICAgIElNQUdFX01BUF9DT0xPUl9CSVQpCisKKy8qKgorICogXG5hbWUgQml0cyB0byBpbmRpY2F0ZSB3aGF0IHN0YXRlIGhhcyBjaGFuZ2VkLiAgCisgKi8KKy8qQHsqLworI2RlZmluZSBfTkVXX01PREVMVklFVyAgICAgICAgICgxIDw8IDApICAgLyoqPCBnbF9jb250ZXh0OjpNb2RlbFZpZXcgKi8KKyNkZWZpbmUgX05FV19QUk9KRUNUSU9OICAgICAgICAoMSA8PCAxKSAgIC8qKjwgZ2xfY29udGV4dDo6UHJvamVjdGlvbiAqLworI2RlZmluZSBfTkVXX1RFWFRVUkVfTUFUUklYICAgICgxIDw8IDIpICAgLyoqPCBnbF9jb250ZXh0OjpUZXh0dXJlTWF0cml4ICovCisjZGVmaW5lIF9ORVdfQ09MT1IgICAgICAgICAgICAgKDEgPDwgMykgICAvKio8IGdsX2NvbnRleHQ6OkNvbG9yICovCisjZGVmaW5lIF9ORVdfREVQVEggICAgICAgICAgICAgKDEgPDwgNCkgICAvKio8IGdsX2NvbnRleHQ6OkRlcHRoICovCisjZGVmaW5lIF9ORVdfRVZBTCAgICAgICAgICAgICAgKDEgPDwgNSkgICAvKio8IGdsX2NvbnRleHQ6OkV2YWwsIEV2YWxNYXAgKi8KKyNkZWZpbmUgX05FV19GT0cgICAgICAgICAgICAgICAoMSA8PCA2KSAgIC8qKjwgZ2xfY29udGV4dDo6Rm9nICovCisjZGVmaW5lIF9ORVdfSElOVCAgICAgICAgICAgICAgKDEgPDwgNykgICAvKio8IGdsX2NvbnRleHQ6OkhpbnQgKi8KKyNkZWZpbmUgX05FV19MSUdIVCAgICAgICAgICAgICAoMSA8PCA4KSAgIC8qKjwgZ2xfY29udGV4dDo6TGlnaHQgKi8KKyNkZWZpbmUgX05FV19MSU5FICAgICAgICAgICAgICAoMSA8PCA5KSAgIC8qKjwgZ2xfY29udGV4dDo6TGluZSAqLworI2RlZmluZSBfTkVXX1BJWEVMICAgICAgICAgICAgICgxIDw8IDEwKSAgLyoqPCBnbF9jb250ZXh0OjpQaXhlbCAqLworI2RlZmluZSBfTkVXX1BPSU5UICAgICAgICAgICAgICgxIDw8IDExKSAgLyoqPCBnbF9jb250ZXh0OjpQb2ludCAqLworI2RlZmluZSBfTkVXX1BPTFlHT04gICAgICAgICAgICgxIDw8IDEyKSAgLyoqPCBnbF9jb250ZXh0OjpQb2x5Z29uICovCisjZGVmaW5lIF9ORVdfUE9MWUdPTlNUSVBQTEUgICAgKDEgPDwgMTMpICAvKio8IGdsX2NvbnRleHQ6OlBvbHlnb25TdGlwcGxlICovCisjZGVmaW5lIF9ORVdfU0NJU1NPUiAgICAgICAgICAgKDEgPDwgMTQpICAvKio8IGdsX2NvbnRleHQ6OlNjaXNzb3IgKi8KKyNkZWZpbmUgX05FV19TVEVOQ0lMICAgICAgICAgICAoMSA8PCAxNSkgIC8qKjwgZ2xfY29udGV4dDo6U3RlbmNpbCAqLworI2RlZmluZSBfTkVXX1RFWFRVUkUgICAgICAgICAgICgxIDw8IDE2KSAgLyoqPCBnbF9jb250ZXh0OjpUZXh0dXJlICovCisjZGVmaW5lIF9ORVdfVFJBTlNGT1JNICAgICAgICAgKDEgPDwgMTcpICAvKio8IGdsX2NvbnRleHQ6OlRyYW5zZm9ybSAqLworI2RlZmluZSBfTkVXX1ZJRVdQT1JUICAgICAgICAgICgxIDw8IDE4KSAgLyoqPCBnbF9jb250ZXh0OjpWaWV3cG9ydCAqLworLyogZ2FwLCByZS11c2UgZm9yIGNvcmUgTWVzYSBzdGF0ZSBvbmx5OyB1c2UgY3R4LT5Ecml2ZXJGbGFncyBvdGhlcndpc2UgKi8KKyNkZWZpbmUgX05FV19BUlJBWSAgICAgICAgICAgICAoMSA8PCAyMCkgIC8qKjwgZ2xfY29udGV4dDo6QXJyYXkgKi8KKyNkZWZpbmUgX05FV19SRU5ERVJNT0RFICAgICAgICAoMSA8PCAyMSkgIC8qKjwgZ2xfY29udGV4dDo6UmVuZGVyTW9kZSwgZXRjICovCisjZGVmaW5lIF9ORVdfQlVGRkVSUyAgICAgICAgICAgKDEgPDwgMjIpICAvKio8IGdsX2NvbnRleHQ6OlZpc3VhbCwgRHJhd0J1ZmZlciwgKi8KKyNkZWZpbmUgX05FV19DVVJSRU5UX0FUVFJJQiAgICAoMSA8PCAyMykgIC8qKjwgZ2xfY29udGV4dDo6Q3VycmVudCAqLworI2RlZmluZSBfTkVXX01VTFRJU0FNUExFICAgICAgICgxIDw8IDI0KSAgLyoqPCBnbF9jb250ZXh0OjpNdWx0aXNhbXBsZSAqLworI2RlZmluZSBfTkVXX1RSQUNLX01BVFJJWCAgICAgICgxIDw8IDI1KSAgLyoqPCBnbF9jb250ZXh0OjpWZXJ0ZXhQcm9ncmFtICovCisjZGVmaW5lIF9ORVdfUFJPR1JBTSAgICAgICAgICAgKDEgPDwgMjYpICAvKio8IE5ldyBwcm9ncmFtL3NoYWRlciBzdGF0ZSAqLworI2RlZmluZSBfTkVXX1BST0dSQU1fQ09OU1RBTlRTICgxIDw8IDI3KQorI2RlZmluZSBfTkVXX0JVRkZFUl9PQkpFQ1QgICAgICgxIDw8IDI4KQorI2RlZmluZSBfTkVXX0ZSQUdfQ0xBTVAgICAgICAgICgxIDw8IDI5KQorLyogZ2FwLCByZS11c2UgZm9yIGNvcmUgTWVzYSBzdGF0ZSBvbmx5OyB1c2UgY3R4LT5Ecml2ZXJGbGFncyBvdGhlcndpc2UgKi8KKyNkZWZpbmUgX05FV19WQVJZSU5HX1ZQX0lOUFVUUyAoMSA8PCAzMSkgLyoqPCBnbF9jb250ZXh0Ojp2YXJ5aW5nX3ZwX2lucHV0cyAqLworI2RlZmluZSBfTkVXX0FMTCB+MAorLypAfSovCisKKworLyoqCisgKiBDb21wb3NpdGUgc3RhdGUgZmxhZ3MKKyAqLworLypAeyovCisjZGVmaW5lIF9NRVNBX05FV19ORUVEX0VZRV9DT09SRFMgICAgICAgICAoX05FV19MSUdIVCB8CQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05FV19URVhUVVJFIHwJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ORVdfUE9JTlQgfAkJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ORVdfUFJPR1JBTSB8CVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTkVXX01PREVMVklFVykKKworI2RlZmluZSBfTUVTQV9ORVdfU0VQQVJBVEVfU1BFQ1VMQVIgICAgICAgIChfTkVXX0xJR0hUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTkVXX0ZPRyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05FV19QUk9HUkFNKQorCisKKy8qQH0qLworCisKKworCisvKiBUaGlzIGhhcyB0byBiZSBpbmNsdWRlZCBoZXJlLiAqLworI2luY2x1ZGUgImRkLmgiCisKKworLyoqCisgKiBEaXNwbGF5IGxpc3QgZmxhZ3MuCisgKiBTdHJpY3RseSB0aGlzIGlzIGEgdG5sLXByaXZhdGUgY29uY2VwdCwgYnV0IGl0IGRvZXNuJ3Qgc2VlbQorICogd29ydGh3aGlsZSBhZGRpbmcgYSB0bmwgcHJpdmF0ZSBzdHJ1Y3R1cmUganVzdCB0byBob2xkIHRoaXMgb25lIGJpdAorICogb2YgaW5mb3JtYXRpb246CisgKi8KKyNkZWZpbmUgRExJU1RfREFOR0xJTkdfUkVGUyAgICAgMHgxIAorCisvKiogQHsKKyAqCisgKiBUaGVzZSBhcmUgYSBtYXBwaW5nIG9mIHRoZSBHTF9BUkJfZGVidWdfb3V0cHV0L0dMX0tIUl9kZWJ1ZyBlbnVtcworICogdG8gc21hbGwgZW51bXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBhcnJheSBpbmRleC4KKyAqLworCitlbnVtIG1lc2FfZGVidWdfc291cmNlIHsKKyAgIE1FU0FfREVCVUdfU09VUkNFX0FQSSwKKyAgIE1FU0FfREVCVUdfU09VUkNFX1dJTkRPV19TWVNURU0sCisgICBNRVNBX0RFQlVHX1NPVVJDRV9TSEFERVJfQ09NUElMRVIsCisgICBNRVNBX0RFQlVHX1NPVVJDRV9USElSRF9QQVJUWSwKKyAgIE1FU0FfREVCVUdfU09VUkNFX0FQUExJQ0FUSU9OLAorICAgTUVTQV9ERUJVR19TT1VSQ0VfT1RIRVIsCisgICBNRVNBX0RFQlVHX1NPVVJDRV9DT1VOVAorfTsKKworZW51bSBtZXNhX2RlYnVnX3R5cGUgeworICAgTUVTQV9ERUJVR19UWVBFX0VSUk9SLAorICAgTUVTQV9ERUJVR19UWVBFX0RFUFJFQ0FURUQsCisgICBNRVNBX0RFQlVHX1RZUEVfVU5ERUZJTkVELAorICAgTUVTQV9ERUJVR19UWVBFX1BPUlRBQklMSVRZLAorICAgTUVTQV9ERUJVR19UWVBFX1BFUkZPUk1BTkNFLAorICAgTUVTQV9ERUJVR19UWVBFX09USEVSLAorICAgTUVTQV9ERUJVR19UWVBFX01BUktFUiwKKyAgIE1FU0FfREVCVUdfVFlQRV9QVVNIX0dST1VQLAorICAgTUVTQV9ERUJVR19UWVBFX1BPUF9HUk9VUCwKKyAgIE1FU0FfREVCVUdfVFlQRV9DT1VOVAorfTsKKworZW51bSBtZXNhX2RlYnVnX3NldmVyaXR5IHsKKyAgIE1FU0FfREVCVUdfU0VWRVJJVFlfTE9XLAorICAgTUVTQV9ERUJVR19TRVZFUklUWV9NRURJVU0sCisgICBNRVNBX0RFQlVHX1NFVkVSSVRZX0hJR0gsCisgICBNRVNBX0RFQlVHX1NFVkVSSVRZX05PVElGSUNBVElPTiwKKyAgIE1FU0FfREVCVUdfU0VWRVJJVFlfQ09VTlQKK307CisKKy8qKiBAfSAqLworCisvKioKKyAqIEVudW0gZm9yIHRoZSBPcGVuR0wgQVBJcyB3ZSBrbm93IGFib3V0IGFuZCBtYXkgc3VwcG9ydC4KKyAqCisgKiBOT1RFOiBUaGlzIG11c3QgbWF0Y2ggdGhlIGFwaV9lbnVtIHRhYmxlIGluCisgKiBzcmMvbWVzYS9tYWluL2dldF9oYXNoX2dlbmVyYXRvci5weQorICovCit0eXBlZGVmIGVudW0KK3sKKyAgIEFQSV9PUEVOR0xfQ09NUEFULCAgICAgIC8qIGxlZ2FjeSAvIGNvbXBhdGliaWxpdHkgY29udGV4dHMgKi8KKyAgIEFQSV9PUEVOR0xFUywKKyAgIEFQSV9PUEVOR0xFUzIsCisgICBBUElfT1BFTkdMX0NPUkUsCisgICBBUElfVkssCisgICBBUElfT1BFTkdMX0xBU1QgPSBBUElfT1BFTkdMX0NPUkUKK30gZ2xfYXBpOworCisKKy8qKgorICogTWVzYSByZW5kZXJpbmcgY29udGV4dC4KKyAqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIGNvbnRleHQgZGF0YSBzdHJ1Y3R1cmUgZm9yIE1lc2EuICBBbG1vc3QgYWxsCisgKiBPcGVuR0wgc3RhdGUgaXMgY29udGFpbmVkIGluIHRoaXMgc3RydWN0dXJlLgorICogVGhpbmsgb2YgdGhpcyBhcyBhIGJhc2UgY2xhc3MgZnJvbSB3aGljaCBkZXZpY2UgZHJpdmVycyB3aWxsIGRlcml2ZQorICogc3ViIGNsYXNzZXMuCisgKi8KK3N0cnVjdCBnbF9jb250ZXh0Cit7CisgICAvKiogU3RhdGUgcG9zc2libHkgc2hhcmVkIHdpdGggb3RoZXIgY29udGV4dHMgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgKi8KKyAgICBzdHJ1Y3QgZ2xfc2hhcmVkX3N0YXRlICpTaGFyZWQ7CisKKyAgIC8qKiBcbmFtZSBBUEkgZnVuY3Rpb24gcG9pbnRlciB0YWJsZXMgKi8KKyAgIC8qQHsqLworICAgIGdsX2FwaSBBUEk7CisKKyAgIC8qKgorICAgICogRGV2aWNlIGRyaXZlciBmdW5jdGlvbiBwb2ludGVyIHRhYmxlCisgICAgKi8KKyAgICBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgRHJpdmVyOyAgLy8gTHVuYXJHOiBNQVJLRURfRk9SX0RFQVRICisKKyAgIC8qKiBDb3JlL0RyaXZlciBjb25zdGFudHMgKi8KKyAgIHN0cnVjdCBnbF9jb25zdGFudHMgQ29uc3Q7CisKKyAgIC8qKiBFeHRlbnNpb24gaW5mb3JtYXRpb24gKi8KKyAgIHN0cnVjdCBnbF9leHRlbnNpb25zIEV4dGVuc2lvbnM7CisKKyAgIC8qKiBHTCB2ZXJzaW9uIGludGVnZXIsIGZvciBleGFtcGxlIDMxIGZvciBHTCAzLjEsIG9yIDIwIGZvciBHTEVTIDIuMC4gKi8KKyAgIEdMdWludCBWZXJzaW9uOworICAgY2hhciAqVmVyc2lvblN0cmluZzsKKworICAgc3RydWN0IGdsX211bHRpc2FtcGxlX2F0dHJpYiBNdWx0aXNhbXBsZTsKKworICAgc3RydWN0IGdsX3Byb2dyYW1fc3RhdGUgUHJvZ3JhbTsgIC8qKjwgZ2VuZXJhbCBwcm9ncmFtIHN0YXRlICovCisgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW1fc3RhdGUgVmVydGV4UHJvZ3JhbTsKKyAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtX3N0YXRlIEZyYWdtZW50UHJvZ3JhbTsKKyAgIHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtX3N0YXRlIEdlb21ldHJ5UHJvZ3JhbTsKKyAgIHN0cnVjdCBnbF9hdGlfZnJhZ21lbnRfc2hhZGVyX3N0YXRlIEFUSUZyYWdtZW50U2hhZGVyOworCisgICBzdHJ1Y3QgZ2xfc2hhZGVyX2NvbXBpbGVyX29wdGlvbnMgU2hhZGVyQ29tcGlsZXJPcHRpb25zW01FU0FfU0hBREVSX1NUQUdFU107CisKKyAgIEdMZW51bSBFcnJvclZhbHVlOyAgICAgICAgLyoqPCBMYXN0IGVycm9yIGNvZGUgKi8KKworICAgLyoqCisgICAgKiBSZWNvZ25pemUgYW5kIHNpbGVuY2UgcmVwZWF0ZWQgZXJyb3IgZGVidWcgbWVzc2FnZXMgaW4gYnVnZ3kgYXBwcy4KKyAgICAqLworICAgY29uc3QgY2hhciAqRXJyb3JEZWJ1Z0ZtdFN0cmluZzsKKyAgIEdMdWludCBFcnJvckRlYnVnQ291bnQ7CisKKyAgIC8qIEdMX0FSQl9kZWJ1Z19vdXRwdXQvR0xfS0hSX2RlYnVnICovCisgICAgLy8gTHVuYXJHOiBNQVJLRURfRk9SX0RFQVRICisgICBtdHhfdCBEZWJ1Z011dGV4OworICAgc3RydWN0IGdsX2RlYnVnX3N0YXRlICpEZWJ1ZzsKKworCisgICBzdHJ1Y3QgZ2xfbGlzdF9leHRlbnNpb25zICpMaXN0RXh0OyAvKio8IGRyaXZlciBkbGlzdCBleHRlbnNpb25zICovCisKKyAgIEdMYml0ZmllbGQgR2xzbEZsYWdzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXNrIG9mIEdMU0xfeCBmbGFncyAqLworCisgICAvKiBBIHRocmVhZCBwb29sIGZvciB0aHJlYWRlZCBzaGFkZXIgY29tcGlsYXRpb24gKi8KKyAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sICpUaHJlYWRQb29sOworfTsKKworCisvLyBMdW5hckcgLSB1cGRhdGUgdGhpcyB3aGVuIG1lcmdpbmcgY29tcGlsZXIgYW5kIGRyaXZlciBkZWJ1ZyBmbGFncworI2lmZGVmIERFQlVHCisvL2V4dGVybiBpbnQgTUVTQV9WRVJCT1NFOworLy9leHRlcm4gaW50IE1FU0FfREVCVUdfRkxBR1M7CisvLyMgZGVmaW5lIE1FU0FfRlVOQ1RJT04gX19GVU5DVElPTl9fCisjIGRlZmluZSBNRVNBX1ZFUkJPU0UgMAorIyBkZWZpbmUgTUVTQV9ERUJVR19GTEFHUyAwCisjIGRlZmluZSBNRVNBX0ZVTkNUSU9OICJhIGZ1bmN0aW9uIgorI2Vsc2UKKyMgZGVmaW5lIE1FU0FfVkVSQk9TRSAwCisjIGRlZmluZSBNRVNBX0RFQlVHX0ZMQUdTIDAKKyMgZGVmaW5lIE1FU0FfRlVOQ1RJT04gImEgZnVuY3Rpb24iCisjIGlmbmRlZiBOREVCVUcKKyMgIGRlZmluZSBOREVCVUcKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qKiBUaGUgTUVTQV9WRVJCT1NFIHZhciBpcyBhIGJpdG1hc2sgb2YgdGhlc2UgZmxhZ3MgKi8KK2VudW0gX3ZlcmJvc2UKK3sKKyAgIFZFUkJPU0VfVkFSUkFZCQk9IDB4MDAwMSwKKyAgIFZFUkJPU0VfVEVYVFVSRQkJPSAweDAwMDIsCisgICBWRVJCT1NFX01BVEVSSUFMCQk9IDB4MDAwNCwKKyAgIFZFUkJPU0VfUElQRUxJTkUJCT0gMHgwMDA4LAorICAgVkVSQk9TRV9EUklWRVIJCT0gMHgwMDEwLAorICAgVkVSQk9TRV9TVEFURQkJPSAweDAwMjAsCisgICBWRVJCT1NFX0FQSQkJCT0gMHgwMDQwLAorICAgVkVSQk9TRV9ESVNQTEFZX0xJU1QJCT0gMHgwMTAwLAorICAgVkVSQk9TRV9MSUdIVElORwkJPSAweDAyMDAsCisgICBWRVJCT1NFX1BSSU1TCQk9IDB4MDQwMCwKKyAgIFZFUkJPU0VfVkVSVFMJCT0gMHgwODAwLAorICAgVkVSQk9TRV9ESVNBU1NFTQkJPSAweDEwMDAsCisgICBWRVJCT1NFX0RSQVcgICAgICAgICAgICAgICAgID0gMHgyMDAwLAorICAgVkVSQk9TRV9TV0FQQlVGRkVSUyAgICAgICAgICA9IDB4NDAwMAorfTsKKworCisvKiogVGhlIE1FU0FfREVCVUdfRkxBR1MgdmFyIGlzIGEgYml0bWFzayBvZiB0aGVzZSBmbGFncyAqLworZW51bSBfZGVidWcKK3sKKyAgIERFQlVHX1NJTEVOVCAgICAgICAgICAgICAgICAgPSAoMSA8PCAwKSwKKyAgIERFQlVHX0FMV0FZU19GTFVTSAkJPSAoMSA8PCAxKSwKKyAgIERFQlVHX0lOQ09NUExFVEVfVEVYVFVSRSAgICAgPSAoMSA8PCAyKSwKKyAgIERFQlVHX0lOQ09NUExFVEVfRkJPICAgICAgICAgPSAoMSA8PCAzKQorfTsKKworCisjZGVmaW5lIERSSV9DT05GX0dMQVNTX01PREVfTkVWRVIgMAorI2RlZmluZSBEUklfQ09ORl9HTEFTU19NT0RFX1dISVRFTElTVCAxCisjZGVmaW5lIERSSV9DT05GX0dMQVNTX01PREVfQUxXQVlTIDIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTVRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vc2hhZGVyb2JqLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3NoYWRlcm9iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjhhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3NoYWRlcm9iai5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBTSEFERVJPQkpfSAorI2RlZmluZSBTSEFERVJPQkpfSAorCisKKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9pcl90b19tZXNhLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKgorICogSW50ZXJuYWwgZnVuY3Rpb25zCisgKi8KKworZXh0ZXJuIHZvaWQKK19tZXNhX2luaXRfc2hhZGVyX3N0YXRlKHN0cnVjdCBnbF9jb250ZXh0ICogY3R4KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZyZWVfc2hhZGVyX3N0YXRlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCisKK2V4dGVybiB2b2lkCitfbWVzYV9yZWZlcmVuY2Vfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3dhaXRfc2hhZGVycyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKipzaGFkZXJzLAorICAgICAgICAgICAgICAgICAgIGludCBudW1fc2hhZGVycyk7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfc2hhZGVyICoKK19tZXNhX2xvb2t1cF9zaGFkZXJfbm9fd2FpdChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgbmFtZSk7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfc2hhZGVyICoKK19tZXNhX2xvb2t1cF9zaGFkZXJfZXJyX25vX3dhaXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhbGxlcik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdsX3NoYWRlciAqCitfbWVzYV9sb29rdXBfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBuYW1lKQoreworICAgc3RydWN0IGdsX3NoYWRlciAqc2ggPSBfbWVzYV9sb29rdXBfc2hhZGVyX25vX3dhaXQoY3R4LCBuYW1lKTsKKyAgIGlmIChzaCkKKyAgICAgIF9tZXNhX3dhaXRfc2hhZGVycyhjdHgsICZzaCwgMSk7CisgICByZXR1cm4gc2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdsX3NoYWRlciAqCitfbWVzYV9sb29rdXBfc2hhZGVyX2VycihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTHVpbnQgbmFtZSwgY29uc3QgY2hhciAqY2FsbGVyKQoreworICAgc3RydWN0IGdsX3NoYWRlciAqc2ggPSBfbWVzYV9sb29rdXBfc2hhZGVyX2Vycl9ub193YWl0KGN0eCwgbmFtZSwgY2FsbGVyKTsKKyAgIGlmIChzaCkKKyAgICAgIF9tZXNhX3dhaXRfc2hhZGVycyhjdHgsICZzaCwgMSk7CisgICByZXR1cm4gc2g7Cit9CisKK2V4dGVybiB2b2lkCitfbWVzYV9yZWZlcmVuY2Vfc2hhZGVyX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2cpOworZXh0ZXJuIHZvaWQKK19tZXNhX2luaXRfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcik7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfc2hhZGVyICoKK19tZXNhX25ld19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUsIEdMZW51bSB0eXBlKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2luaXRfc2hhZGVyX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3dhaXRfc2hhZGVyX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2cpOworCitleHRlcm4gc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICoKK19tZXNhX2xvb2t1cF9zaGFkZXJfcHJvZ3JhbV9ub193YWl0KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBuYW1lKTsKKworZXh0ZXJuIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqCitfbWVzYV9sb29rdXBfc2hhZGVyX3Byb2dyYW1fZXJyX25vX3dhaXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY2FsbGVyKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKgorX21lc2FfbG9va3VwX3NoYWRlcl9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBuYW1lKQoreworICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2cgPQorICAgICAgX21lc2FfbG9va3VwX3NoYWRlcl9wcm9ncmFtX25vX3dhaXQoY3R4LCBuYW1lKTsKKyAgIGlmIChzaFByb2cpCisgICAgICBfbWVzYV93YWl0X3NoYWRlcl9wcm9ncmFtKGN0eCwgc2hQcm9nKTsKKyAgIHJldHVybiBzaFByb2c7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICoKK19tZXNhX2xvb2t1cF9zaGFkZXJfcHJvZ3JhbV9lcnIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhbGxlcikKK3sKKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hQcm9nID0KKyAgICAgIF9tZXNhX2xvb2t1cF9zaGFkZXJfcHJvZ3JhbV9lcnJfbm9fd2FpdChjdHgsIG5hbWUsIGNhbGxlcik7CisgICBpZiAoc2hQcm9nKQorICAgICAgX21lc2Ffd2FpdF9zaGFkZXJfcHJvZ3JhbShjdHgsIHNoUHJvZyk7CisgICByZXR1cm4gc2hQcm9nOworfQorCitleHRlcm4gdm9pZAorX21lc2FfY2xlYXJfc2hhZGVyX3Byb2dyYW1fZGF0YShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoUHJvZyk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9mcmVlX3NoYWRlcl9wcm9ncmFtX2RhdGEoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoUHJvZyk7CisKKworCitleHRlcm4gdm9pZAorX21lc2FfaW5pdF9zaGFkZXJfb2JqZWN0X2Z1bmN0aW9ucyhzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmRyaXZlcik7CisKK2V4dGVybiB2b2lkCitfbWVzYV9pbml0X3NoYWRlcl9zdGF0ZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZyZWVfc2hhZGVyX3N0YXRlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCisKK3N0YXRpYyBpbmxpbmUgZ2xfc2hhZGVyX3N0YWdlCitfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2UoR0xlbnVtIHYpCit7CisgICBzd2l0Y2ggKHYpIHsKKyAgIGNhc2UgR0xfVkVSVEVYX1NIQURFUjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9WRVJURVg7CisgICBjYXNlIEdMX0ZSQUdNRU5UX1NIQURFUjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9GUkFHTUVOVDsKKyAgIGNhc2UgR0xfR0VPTUVUUllfU0hBREVSOgorICAgICAgcmV0dXJuIE1FU0FfU0hBREVSX0dFT01FVFJZOworICAgY2FzZSBHTF9DT01QVVRFX1NIQURFUjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9DT01QVVRFOworICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVCgwICYmICJiYWQgdmFsdWUgaW4gX21lc2Ffc2hhZGVyX2VudW1fdG9fc2hhZGVyX3N0YWdlKCkiKTsKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9WRVJURVg7CisgICB9Cit9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNIQURFUk9CSl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3NpbXBsZV9saXN0LmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3NpbXBsZV9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzNDMyZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21haW4vc2ltcGxlX2xpc3QuaApAQCAtMCwwICsxLDIxMCBAQAorLyoqCisgKiBcZmlsZSBzaW1wbGVfbGlzdC5oCisgKiBTaW1wbGUgbWFjcm9zIGZvciB0eXBlLXNhZmUsIGludHJ1c2l2ZSBsaXN0cy4KKyAqCisgKiAgSW50ZW5kZWQgdG8gd29yayB3aXRoIGEgbGlzdCBzZW50aW5hbCB3aGljaCBpcyBjcmVhdGVkIGFzIGFuIGVtcHR5CisgKiAgbGlzdC4gIEluc2VydCAmIGRlbGV0ZSBhcmUgTygxKS4KKyAqICAKKyAqIFxhdXRob3IKKyAqICAoQykgMTk5NywgS2VpdGggV2hpdHdlbGwKKyAqLworCisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfU0lNUExFX0xJU1RfSAorI2RlZmluZSBfU0lNUExFX0xJU1RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBzaW1wbGVfbm9kZSB7CisgICBzdHJ1Y3Qgc2ltcGxlX25vZGUgKm5leHQ7CisgICBzdHJ1Y3Qgc2ltcGxlX25vZGUgKnByZXY7Cit9OworCisvKioKKyAqIFJlbW92ZSBhbiBlbGVtZW50IGZyb20gbGlzdC4KKyAqCisgKiBccGFyYW0gZWxlbSBlbGVtZW50IHRvIHJlbW92ZS4KKyAqLworI2RlZmluZSByZW1vdmVfZnJvbV9saXN0KGVsZW0pCQkJXAorZG8gewkJCQkJCVwKKyAgIChlbGVtKS0+bmV4dC0+cHJldiA9IChlbGVtKS0+cHJldjsJCVwKKyAgIChlbGVtKS0+cHJldi0+bmV4dCA9IChlbGVtKS0+bmV4dDsJCVwKK30gd2hpbGUgKDApCisKKy8qKgorICogSW5zZXJ0IGFuIGVsZW1lbnQgdG8gdGhlIGxpc3QgaGVhZC4KKyAqCisgKiBccGFyYW0gbGlzdCBsaXN0LgorICogXHBhcmFtIGVsZW0gZWxlbWVudCB0byBpbnNlcnQuCisgKi8KKyNkZWZpbmUgaW5zZXJ0X2F0X2hlYWQobGlzdCwgZWxlbSkJCVwKK2RvIHsJCQkJCQlcCisgICAoZWxlbSktPnByZXYgPSBsaXN0OwkJCQlcCisgICAoZWxlbSktPm5leHQgPSAobGlzdCktPm5leHQ7CQkJXAorICAgKGxpc3QpLT5uZXh0LT5wcmV2ID0gZWxlbTsJCQlcCisgICAobGlzdCktPm5leHQgPSBlbGVtOwkJCQlcCit9IHdoaWxlKDApCisKKy8qKgorICogSW5zZXJ0IGFuIGVsZW1lbnQgdG8gdGhlIGxpc3QgdGFpbC4KKyAqCisgKiBccGFyYW0gbGlzdCBsaXN0LgorICogXHBhcmFtIGVsZW0gZWxlbWVudCB0byBpbnNlcnQuCisgKi8KKyNkZWZpbmUgaW5zZXJ0X2F0X3RhaWwobGlzdCwgZWxlbSkJCVwKK2RvIHsJCQkJCQlcCisgICAoZWxlbSktPm5leHQgPSBsaXN0OwkJCQlcCisgICAoZWxlbSktPnByZXYgPSAobGlzdCktPnByZXY7CQkJXAorICAgKGxpc3QpLT5wcmV2LT5uZXh0ID0gZWxlbTsJCQlcCisgICAobGlzdCktPnByZXYgPSBlbGVtOwkJCQlcCit9IHdoaWxlKDApCisKKy8qKgorICogTW92ZSBhbiBlbGVtZW50IHRvIHRoZSBsaXN0IGhlYWQuCisgKgorICogXHBhcmFtIGxpc3QgbGlzdC4KKyAqIFxwYXJhbSBlbGVtIGVsZW1lbnQgdG8gbW92ZS4KKyAqLworI2RlZmluZSBtb3ZlX3RvX2hlYWQobGlzdCwgZWxlbSkJCVwKK2RvIHsJCQkJCQlcCisgICByZW1vdmVfZnJvbV9saXN0KGVsZW0pOwkJCVwKKyAgIGluc2VydF9hdF9oZWFkKGxpc3QsIGVsZW0pOwkJCVwKK30gd2hpbGUgKDApCisKKy8qKgorICogTW92ZSBhbiBlbGVtZW50IHRvIHRoZSBsaXN0IHRhaWwuCisgKgorICogXHBhcmFtIGxpc3QgbGlzdC4KKyAqIFxwYXJhbSBlbGVtIGVsZW1lbnQgdG8gbW92ZS4KKyAqLworI2RlZmluZSBtb3ZlX3RvX3RhaWwobGlzdCwgZWxlbSkJCVwKK2RvIHsJCQkJCQlcCisgICByZW1vdmVfZnJvbV9saXN0KGVsZW0pOwkJCVwKKyAgIGluc2VydF9hdF90YWlsKGxpc3QsIGVsZW0pOwkJCVwKK30gd2hpbGUgKDApCisKKy8qKgorICogTWFrZSBhIGVtcHR5IGxpc3QgZW1wdHkuCisgKgorICogXHBhcmFtIHNlbnRpbmFsIGxpc3QgKHNlbnRpbmFsIGVsZW1lbnQpLgorICovCisjZGVmaW5lIG1ha2VfZW1wdHlfbGlzdChzZW50aW5hbCkJCVwKK2RvIHsJCQkJCQlcCisgICAoc2VudGluYWwpLT5uZXh0ID0gc2VudGluYWw7CQkJXAorICAgKHNlbnRpbmFsKS0+cHJldiA9IHNlbnRpbmFsOwkJCVwKK30gd2hpbGUgKDApCisKKy8qKgorICogR2V0IGxpc3QgZmlyc3QgZWxlbWVudC4KKyAqCisgKiBccGFyYW0gbGlzdCBsaXN0LgorICoKKyAqIFxyZXR1cm4gcG9pbnRlciB0byBmaXJzdCBlbGVtZW50LgorICovCisjZGVmaW5lIGZpcnN0X2VsZW0obGlzdCkgICAgICAgKChsaXN0KS0+bmV4dCkKKworLyoqCisgKiBHZXQgbGlzdCBsYXN0IGVsZW1lbnQuCisgKgorICogXHBhcmFtIGxpc3QgbGlzdC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gbGFzdCBlbGVtZW50LgorICovCisjZGVmaW5lIGxhc3RfZWxlbShsaXN0KSAgICAgICAgKChsaXN0KS0+cHJldikKKworLyoqCisgKiBHZXQgbmV4dCBlbGVtZW50LgorICoKKyAqIFxwYXJhbSBlbGVtIGVsZW1lbnQuCisgKgorICogXHJldHVybiBwb2ludGVyIHRvIG5leHQgZWxlbWVudC4KKyAqLworI2RlZmluZSBuZXh0X2VsZW0oZWxlbSkgICAgICAgICgoZWxlbSktPm5leHQpCisKKy8qKgorICogR2V0IHByZXZpb3VzIGVsZW1lbnQuCisgKgorICogXHBhcmFtIGVsZW0gZWxlbWVudC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gcHJldmlvdXMgZWxlbWVudC4KKyAqLworI2RlZmluZSBwcmV2X2VsZW0oZWxlbSkgICAgICAgICgoZWxlbSktPnByZXYpCisKKy8qKgorICogVGVzdCB3aGV0aGVyIGVsZW1lbnQgaXMgYXQgZW5kIG9mIHRoZSBsaXN0LgorICogCisgKiBccGFyYW0gbGlzdCBsaXN0LgorICogXHBhcmFtIGVsZW0gZWxlbWVudC4KKyAqIAorICogXHJldHVybiBub24temVybyBpZiBlbGVtZW50IGlzIGF0IGVuZCBvZiBsaXN0LCBvciB6ZXJvIG90aGVyd2lzZS4KKyAqLworI2RlZmluZSBhdF9lbmQobGlzdCwgZWxlbSkgICAgICgoZWxlbSkgPT0gKGxpc3QpKQorCisvKioKKyAqIFRlc3QgaWYgYSBsaXN0IGlzIGVtcHR5LgorICogCisgKiBccGFyYW0gbGlzdCBsaXN0LgorICogCisgKiBccmV0dXJuIG5vbi16ZXJvIGlmIGxpc3QgZW1wdHksIG9yIHplcm8gb3RoZXJ3aXNlLgorICovCisjZGVmaW5lIGlzX2VtcHR5X2xpc3QobGlzdCkgICAgKChsaXN0KS0+bmV4dCA9PSAobGlzdCkpCisKKy8qKgorICogV2FsayB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiBhIGxpc3QuCisgKgorICogXHBhcmFtIHB0ciBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgKiBccGFyYW0gbGlzdCBsaXN0LgorICoKKyAqIFxub3RlIEl0IHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIHsgfSBibG9jayBvciBhIHNpbmdsZSBzdGF0ZW1lbnQsIGFzIGluIGEgXGMKKyAqIGZvciBsb29wLgorICovCisjZGVmaW5lIGZvcmVhY2gocHRyLCBsaXN0KSAgICAgXAorICAgICAgICBmb3IoIHB0cj0obGlzdCktPm5leHQgOyAgcHRyIT1saXN0IDsgIHB0cj0ocHRyKS0+bmV4dCApCisKKy8qKgorICogV2FsayB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiBhIGxpc3QuCisgKgorICogU2FtZSBhcyAjZm9yZWFjaCBidXQgbGV0cyB5b3UgdW5saW5rIHRoZSBjdXJyZW50IHZhbHVlIGR1cmluZyBhIGxpc3QKKyAqIHRyYXZlcnNhbC4gIFVzZWZ1bCBmb3IgZnJlZWluZyBhIGxpc3QsIGVsZW1lbnQgYnkgZWxlbWVudC4KKyAqIAorICogXHBhcmFtIHB0ciBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgKiBccGFyYW0gdCB0ZW1wb3JhcnkgcG9pbnRlci4KKyAqIFxwYXJhbSBsaXN0IGxpc3QuCisgKgorICogXG5vdGUgSXQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgeyB9IGJsb2NrIG9yIGEgc2luZ2xlIHN0YXRlbWVudCwgYXMgaW4gYSBcYworICogZm9yIGxvb3AuCisgKi8KKyNkZWZpbmUgZm9yZWFjaF9zKHB0ciwgdCwgbGlzdCkgICBcCisgICAgICAgIGZvcihwdHI9KGxpc3QpLT5uZXh0LHQ9KHB0ciktPm5leHQ7IGxpc3QgIT0gcHRyOyBwdHI9dCwgdD0odCktPm5leHQpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi91bmlmb3Jtcy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi91bmlmb3Jtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYTA1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3VuaWZvcm1zLmMKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCAgVk13YXJlLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgdW5pZm9ybXMuYworICogRnVuY3Rpb25zIHJlbGF0ZWQgdG8gR0xTTCB1bmlmb3JtIHZhcmlhYmxlcy4KKyAqIFxhdXRob3IgQnJpYW4gUGF1bAorICovCisKKy8qKgorICogWFhYIHRoaW5ncyB0byBkbzoKKyAqIDEuIENoZWNrIHRoYXQgdGhlIHJpZ2h0IGVycm9yIGNvZGUgaXMgZ2VuZXJhdGVkIGZvciBhbGwgX21lc2FfZXJyb3IoKSBjYWxscy4KKyAqIDIuIEluc2VydCBGTFVTSF9WRVJUSUNFUyBjYWxscyBpbiB2YXJpb3VzIHBsYWNlcworICovCisKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9jb250ZXh0LmgiCisjaW5jbHVkZSAibWFpbi9zaGFkZXJvYmouaCIKKyNpbmNsdWRlICJtYWluL3VuaWZvcm1zLmgiCisjaW5jbHVkZSAibWFpbi9lbnVtcy5oIgorI2luY2x1ZGUgImlyX3VuaWZvcm0uaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9ncmFtLmgiCisKKy8qKgorICogVXBkYXRlIHRoZSB2ZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbSdzIFRleHR1cmVzVXNlZCBhcnJheS4KKyAqCisgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBnbFVuaWZvcm0oc2V0IHNhbXBsZXIgdmFyKSBpcyBjYWxsZWQuCisgKiBBIGNhbGwgdG8gZ2xVbmlmb3JtKHNhbXBsZXJWYXIsIHZhbHVlKSBjYXVzZXMgYSBzYW1wbGVyIHRvIHBvaW50IHRvIGEKKyAqIHBhcnRpY3VsYXIgdGV4dHVyZSB1bml0LiAgV2Uga25vdyB0aGUgc2FtcGxlcidzIHRleHR1cmUgdGFyZ2V0CisgKiAoMUQvMkQvM0QvZXRjKSBmcm9tIGNvbXBpbGUgdGltZSBidXQgdGhlIHNhbXBsZXIncyB0ZXh0dXJlIHVuaXQgaXMKKyAqIHNldCBieSBnbFVuaWZvcm0oKSBjYWxscy4KKyAqCisgKiBTbywgc2NhbiB0aGUgcHJvZ3JhbS0+U2FtcGxlclVuaXRzW10gYW5kIHByb2dyYW0tPlNhbXBsZXJUYXJnZXRzW10KKyAqIGluZm9ybWF0aW9uIHRvIHVwZGF0ZSB0aGUgcHJvZy0+VGV4dHVyZXNVc2VkW10gdmFsdWVzLgorICogRWFjaCB2YWx1ZSBvZiBUZXh0dXJlc1VzZWRbdW5pdF0gaXMgb25lIG9mIHplcm8sIFRFWFRVUkVfMURfSU5ERVgsCisgKiBURVhUVVJFXzJEX0lOREVYLCBURVhUVVJFXzNEX0lOREVYLCBldGMuCisgKiBXZSdsbCB1c2UgdGhhdCBpbmZvIGZvciBzdGF0ZSB2YWxpZGF0aW9uIGJlZm9yZSByZW5kZXJpbmcuCisgKi8KK3ZvaWQKK19tZXNhX3VwZGF0ZV9zaGFkZXJfdGV4dHVyZXNfdXNlZChzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoUHJvZywKKwkJCQkgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgR0x1aW50IHM7CisgICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIgPQorICAgICAgc2hQcm9nLT5fTGlua2VkU2hhZGVyc1tfbWVzYV9wcm9ncmFtX2VudW1fdG9fc2hhZGVyX3N0YWdlKHByb2ctPlRhcmdldCldOworCisgICBhc3NlcnQoc2hhZGVyKTsKKworICAgbWVtY3B5KHByb2ctPlNhbXBsZXJVbml0cywgc2hhZGVyLT5TYW1wbGVyVW5pdHMsIHNpemVvZihwcm9nLT5TYW1wbGVyVW5pdHMpKTsKKyAgIG1lbXNldChwcm9nLT5UZXh0dXJlc1VzZWQsIDAsIHNpemVvZihwcm9nLT5UZXh0dXJlc1VzZWQpKTsKKworICAgZm9yIChzID0gMDsgcyA8IE1BWF9TQU1QTEVSUzsgcysrKSB7CisgICAgICBpZiAocHJvZy0+U2FtcGxlcnNVc2VkICYgKDEgPDwgcykpIHsKKyAgICAgICAgIC8vIEx1bmFyRyAtIG1hc2sgb3V0IHRoZSBzZXQgdmFsdWUsIHdoaWNoIHJlc2lkZXMgaW4gdXBwZXIgMTYtYml0cworICAgICAgICAgR0x1aW50IHVuaXQgPSBzaGFkZXItPlNhbXBsZXJVbml0c1tzXSAmIDB4RkZGRjsKKyAgICAgICAgIEdMdWludCB0Z3QgPSBzaGFkZXItPlNhbXBsZXJUYXJnZXRzW3NdOworICAgICAgICAgYXNzZXJ0KHVuaXQgPCBFbGVtZW50cyhwcm9nLT5UZXh0dXJlc1VzZWQpKTsKKyAgICAgICAgIGFzc2VydCh0Z3QgPCBOVU1fVEVYVFVSRV9UQVJHRVRTKTsKKyAgICAgICAgIHByb2ctPlRleHR1cmVzVXNlZFt1bml0XSB8PSAoMSA8PCB0Z3QpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi91bmlmb3Jtcy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi91bmlmb3Jtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTNlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3VuaWZvcm1zLmgKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwICBWTXdhcmUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgVU5JRk9STVNfSAorI2RlZmluZSBVTklGT1JNU19ICisKKyNpbmNsdWRlICJnbGhlYWRlci5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICIuLi9nbHNsL2dsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICIuLi9nbHNsL2lyX3VuaWZvcm0uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK3N0cnVjdCBnbF9wcm9ncmFtOworc3RydWN0IF9nbGFwaV90YWJsZTsKKwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtMWYoR0xpbnQsIEdMZmxvYXQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtMmYoR0xpbnQsIEdMZmxvYXQsIEdMZmxvYXQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtM2YoR0xpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtNGYoR0xpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtMWkoR0xpbnQsIEdMaW50KTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTJpKEdMaW50LCBHTGludCwgR0xpbnQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtM2koR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtNGkoR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTFmdihHTGludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTJmdihHTGludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTNmdihHTGludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTRmdihHTGludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTFpdihHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VuaWZvcm0yaXYoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtM2l2KEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTRpdihHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VuaWZvcm0xdWkoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VuaWZvcm0ydWkoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTN1aShHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2Mik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VuaWZvcm00dWkoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VuaWZvcm0xdWl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybTJ1aXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtM3VpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VuaWZvcm00dWl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybU1hdHJpeDJmdihHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Vbmlmb3JtTWF0cml4M2Z2KEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1VuaWZvcm1NYXRyaXg0ZnYoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybU1hdHJpeDJ4M2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybU1hdHJpeDN4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybU1hdHJpeDJ4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybU1hdHJpeDR4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybU1hdHJpeDN4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybU1hdHJpeDR4M2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Qcm9ncmFtVW5pZm9ybTFmKEdMdWludCBwcm9ncmFtLCBHTGludCwgR0xmbG9hdCk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtMmYoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm0zZihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Qcm9ncmFtVW5pZm9ybTRmKEdMdWludCBwcm9ncmFtLCBHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtMWkoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTGludCk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtMmkoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTGludCwgR0xpbnQpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Qcm9ncmFtVW5pZm9ybTNpKEdMdWludCBwcm9ncmFtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtNGkoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtMWZ2KEdMdWludCBwcm9ncmFtLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm0yZnYoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Qcm9ncmFtVW5pZm9ybTNmdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtNGZ2KEdMdWludCBwcm9ncmFtLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm0xaXYoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm0yaXYoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm0zaXYoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm00aXYoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm0xdWkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Qcm9ncmFtVW5pZm9ybTJ1aShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm0zdWkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCB2Mik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtNHVpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgdjIsIEdMdWludCB2Myk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtMXVpdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtMnVpdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtM3VpdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtNHVpdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtTWF0cml4MmZ2KEdMdWludCBwcm9ncmFtLCBHTGludCwgR0xzaXplaSwgR0xib29sZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnYoR0x1aW50IHByb2dyYW0sIEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICopOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9Qcm9ncmFtVW5pZm9ybU1hdHJpeDRmdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtTWF0cml4MngzZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtTWF0cml4M3gyZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtTWF0cml4NHgyZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX1Byb2dyYW1Vbmlmb3JtTWF0cml4NHgzZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CisKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0blVuaWZvcm1mdkFSQihHTHVpbnQsIEdMaW50LCBHTHNpemVpLCBHTGZsb2F0ICopOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9HZXRVbmlmb3JtZnYoR0x1aW50LCBHTGludCwgR0xmbG9hdCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0blVuaWZvcm1pdkFSQihHTHVpbnQsIEdMaW50LCBHTHNpemVpLCBHTGludCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0VW5pZm9ybXVpdihHTHVpbnQsIEdMaW50LCBHTHVpbnQgKik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0dldG5Vbmlmb3JtdWl2QVJCKEdMdWludCwgR0xpbnQsIEdMc2l6ZWksIEdMdWludCAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0VW5pZm9ybXVpdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCAqcGFyYW1zKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0blVuaWZvcm1kdkFSQihHTHVpbnQsIEdMaW50LCBHTHNpemVpLCBHTGRvdWJsZSAqKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0VW5pZm9ybWR2KEdMdWludCwgR0xpbnQsIEdMZG91YmxlICopOworR0xpbnQgR0xBUElFTlRSWQorX21lc2FfR2V0VW5pZm9ybUxvY2F0aW9uKEdMdWludCwgY29uc3QgR0xjaGFyQVJCICopOworR0x1aW50IEdMQVBJRU5UUlkKK19tZXNhX0dldFVuaWZvcm1CbG9ja0luZGV4KEdMdWludCBwcm9ncmFtLAorCQkJICAgY29uc3QgR0xjaGFyICp1bmlmb3JtQmxvY2tOYW1lKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0VW5pZm9ybUluZGljZXMoR0x1aW50IHByb2dyYW0sCisJCQlHTHNpemVpIHVuaWZvcm1Db3VudCwKKwkJCWNvbnN0IEdMY2hhciAqIGNvbnN0ICp1bmlmb3JtTmFtZXMsCisJCQlHTHVpbnQgKnVuaWZvcm1JbmRpY2VzKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfVW5pZm9ybUJsb2NrQmluZGluZyhHTHVpbnQgcHJvZ3JhbSwKKwkJCSAgR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LAorCQkJICBHTHVpbnQgdW5pZm9ybUJsb2NrQmluZGluZyk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0dldEFjdGl2ZUF0b21pY0NvdW50ZXJCdWZmZXJpdihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0dldEFjdGl2ZVVuaWZvcm1CbG9ja2l2KEdMdWludCBwcm9ncmFtLAorCQkJICAgICAgR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LAorCQkJICAgICAgR0xlbnVtIHBuYW1lLAorCQkJICAgICAgR0xpbnQgKnBhcmFtcyk7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0dldEFjdGl2ZVVuaWZvcm1CbG9ja05hbWUoR0x1aW50IHByb2dyYW0sCisJCQkJR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LAorCQkJCUdMc2l6ZWkgYnVmU2l6ZSwKKwkJCQlHTHNpemVpICpsZW5ndGgsCisJCQkJR0xjaGFyICp1bmlmb3JtQmxvY2tOYW1lKTsKK3ZvaWQgR0xBUElFTlRSWQorX21lc2FfR2V0QWN0aXZlVW5pZm9ybU5hbWUoR0x1aW50IHByb2dyYW0sIEdMdWludCB1bmlmb3JtSW5kZXgsCisJCQkgICBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwKKwkJCSAgIEdMY2hhciAqdW5pZm9ybU5hbWUpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9HZXRBY3RpdmVVbmlmb3JtKEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50ICosIEdMZW51bSAqLCBHTGNoYXJBUkIgKik7Cit2b2lkIEdMQVBJRU5UUlkKK19tZXNhX0dldEFjdGl2ZVVuaWZvcm1zaXYoR0x1aW50IHByb2dyYW0sCisJCQkgIEdMc2l6ZWkgdW5pZm9ybUNvdW50LAorCQkJICBjb25zdCBHTHVpbnQgKnVuaWZvcm1JbmRpY2VzLAorCQkJICBHTGVudW0gcG5hbWUsCisJCQkgIEdMaW50ICpwYXJhbXMpOwordm9pZCBHTEFQSUVOVFJZCitfbWVzYV9HZXRVbmlmb3JtaXYoR0x1aW50LCBHTGludCwgR0xpbnQgKik7CisKK2xvbmcKK19tZXNhX3BhcnNlX3Byb2dyYW1fcmVzb3VyY2VfbmFtZShjb25zdCBHTGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xjaGFyICoqb3V0X2Jhc2VfbmFtZV9lbmQpOworCit1bnNpZ25lZAorX21lc2FfZ2V0X3VuaWZvcm1fbG9jYXRpb24oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2csCisJCQkgICBjb25zdCBHTGNoYXIgKm5hbWUsIHVuc2lnbmVkICpvZmZzZXQpOworCit2b2lkCitfbWVzYV91bmlmb3JtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW0sCisJICAgICAgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqdmFsdWVzLCBHTGVudW0gdHlwZSk7CisKK3ZvaWQKK19tZXNhX3VuaWZvcm1fbWF0cml4KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hQcm9nLAorCQkgICAgIEdMdWludCBjb2xzLCBHTHVpbnQgcm93cywKKyAgICAgICAgICAgICAgICAgICAgIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWVzKTsKKwordm9pZAorX21lc2FfZ2V0X3VuaWZvcm0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLAorCQkgIEdMc2l6ZWkgYnVmU2l6ZSwgZW51bSBnbHNsX2Jhc2VfdHlwZSByZXR1cm5UeXBlLAorCQkgIEdMdm9pZCAqcGFyYW1zT3V0KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3VuaWZvcm1fYXR0YWNoX2RyaXZlcl9zdG9yYWdlKHN0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgKiwKKwkJCQkgICAgdW5zaWduZWQgZWxlbWVudF9zdHJpZGUsCisJCQkJICAgIHVuc2lnbmVkIHZlY3Rvcl9zdHJpZGUsCisJCQkJICAgIGVudW0gZ2xfdW5pZm9ybV9kcml2ZXJfZm9ybWF0IGZvcm1hdCwKKwkJCQkgICAgdm9pZCAqZGF0YSk7CisKK2V4dGVybiB2b2lkCitfbWVzYV91bmlmb3JtX2RldGFjaF9hbGxfZHJpdmVyX3N0b3JhZ2Uoc3RydWN0IGdsX3VuaWZvcm1fc3RvcmFnZSAqdW5pKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3Byb3BhZ2F0ZV91bmlmb3Jtc190b19kcml2ZXJfc3RvcmFnZShzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlICp1bmksCisJCQkJCSAgIHVuc2lnbmVkIGFycmF5X2luZGV4LAorCQkJCQkgICB1bnNpZ25lZCBjb3VudCk7CisKK2V4dGVybiB2b2lkCitfbWVzYV91cGRhdGVfc2hhZGVyX3RleHR1cmVzX3VzZWQoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2csCisJCQkJICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyk7CisKK2V4dGVybiBib29sCitfbWVzYV9zYW1wbGVyX3VuaWZvcm1zX2FyZV92YWxpZChjb25zdCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoUHJvZywKKwkJCQkgY2hhciAqZXJyTXNnLCBzaXplX3QgZXJyTXNnTGVuZ3RoKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlciAqCitnZXRfdW5pZm9ybV9wYXJhbWV0ZXIoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaFByb2csIEdMaW50IGluZGV4KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2dldF91bmlmb3JtX25hbWUoY29uc3Qgc3RydWN0IGdsX3VuaWZvcm1fc3RvcmFnZSAqdW5pLAorICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBHTGNoYXIgKm5hbWVPdXQpOworCitzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgeworICAgY29uc3QgY2hhciAqZmllbGQ7CisgICBpbnQgdG9rZW5zW1NUQVRFX0xFTkdUSF07CisgICBpbnQgc3dpenpsZTsKK307CisKK3N0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZGVzYyB7CisgICBjb25zdCBjaGFyICpuYW1lOworICAgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50ICplbGVtZW50czsKKyAgIHVuc2lnbmVkIGludCBudW1fZWxlbWVudHM7Cit9OworCisvKioKKyAqIFxuYW1lIEdMU0wgdW5pZm9ybSBhcnJheXMgYW5kIHN0cnVjdHMgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nLgorICoKKyAqIFRoZSBHTF9BUkJfc2hhZGVyX29iamVjdHMgc3BlYyBzYXlzIHRoYXQgaWYgeW91IHVzZQorICogZ2xHZXRVbmlmb3JtTG9jYXRpb24gdG8gZ2V0IHRoZSBsb2NhdGlvbiBvZiBhbiBhcnJheSwgeW91IENBTk5PVAorICogYWNjZXNzIG90aGVyIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBieSBhZGRpbmcgYW4gb2Zmc2V0IHRvIHRoZQorICogcmV0dXJuZWQgbG9jYXRpb24uICBGb3IgZXhhbXBsZSwgeW91IG11c3QgY2FsbAorICogZ2xHZXRVbmlmb3JtTG9jYXRpb24oImZvb1sxNl0iKSBpZiB5b3Ugd2FudCB0byBzZXQgdGhlIDE2dGggZWxlbWVudAorICogb2YgdGhlIGFycmF5IHdpdGggZ2xVbmlmb3JtKCkuCisgKgorICogSE9XRVZFUiwgc29tZSBvdGhlciBPcGVuR0wgZHJpdmVycyBhbGxvdyBhY2Nlc3NpbmcgYXJyYXkgZWxlbWVudHMKKyAqIGJ5IGFkZGluZyBhbiBvZmZzZXQgdG8gdGhlIHJldHVybmVkIGFycmF5IGxvY2F0aW9uLiAgQW5kIHNvbWUgYXBwcworICogc2VlbSB0byBkZXBlbmQgb24gdGhhdCBiZWhhdmlvdXIuCisgKgorICogTWVzYSdzIGdsX3VuaWZvcm1fbGlzdCBkb2Vzbid0IGRpcmVjdGx5IHN1cHBvcnQgdGhpcyBzaW5jZSBlYWNoCisgKiBlbnRyeSBpbiB0aGUgbGlzdCBkZXNjcmliZXMgb25lIHVuaWZvcm0gdmFyaWFibGUsIG5vdCBvbmUgdW5pZm9ybQorICogZWxlbWVudC4gIFdlIGNvdWxkIGluc2VydCBkdW1teSBlbnRyaWVzIGluIHRoZSBsaXN0IGZvciBlYWNoIGFycmF5CisgKiBlbGVtZW50IGFmdGVyIFswXSBidXQgdGhhdCBjYXVzZXMgY29tcGxpY2F0aW9ucyBlbHNld2hlcmUuCisgKgorICogV2Ugc29sdmUgdGhpcyBwcm9ibGVtIGJ5IGNyZWF0aW5nIG11bHRpcGxlIGVudHJpZXMgZm9yIHVuaWZvcm0gYXJyYXlzCisgKiBpbiB0aGUgVW5pZm9ybVJlbWFwVGFibGUgc28gdGhhdCB0aGVpciBlbGVtZW50cyBnZXQgc2VxdWVudGlhbCBsb2NhdGlvbnMuCisgKgorICogVXRpbGl0eSBmdW5jdGlvbnMgYmVsb3cgb2ZmZXIgZnVuY3Rpb25hbGl0eSB0byBzcGxpdCBVbmlmb3JtUmVtYXBUYWJsZQorICogbG9jYXRpb24gaW4gdG8gbG9jYXRpb24gb2YgdGhlIHVuaWZvcm0gaW4gVW5pZm9ybVN0b3JhZ2UgKyBvZmZzZXQgdG8gdGhlCisgKiBhcnJheSBlbGVtZW50ICgwIGlmIG5vdCBhbiBhcnJheSkgYW5kIGFsc28gbWVyZ2UgaXQgYmFjayBhZ2FpbiBhcyB0aGUKKyAqIFVuaWZvcm1SZW1hcFRhYmxlIGxvY2F0aW9uLgorICoKKyAqLworLypAeyovCisvKioKKyAqIENvbWJpbmUgdGhlIHVuaWZvcm0ncyBzdG9yYWdlIGluZGV4IGFuZCB0aGUgYXJyYXkgaW5kZXgKKyAqLworc3RhdGljIGlubGluZSBHTGludAorX21lc2FfdW5pZm9ybV9tZXJnZV9sb2NhdGlvbl9vZmZzZXQoY29uc3Qgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RvcmFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVuaWZvcm1fYXJyYXlfaW5kZXgpCit7CisgICAvKiBsb2NhdGlvbiBpbiByZW1hcCB0YWJsZSArIGFycmF5IGVsZW1lbnQgb2Zmc2V0ICovCisgICByZXR1cm4gcHJvZy0+VW5pZm9ybVN0b3JhZ2Vbc3RvcmFnZV9pbmRleF0ucmVtYXBfbG9jYXRpb24gKworICAgICAgdW5pZm9ybV9hcnJheV9pbmRleDsKK30KKworLyoqCisgKiBTZXBhcmF0ZSB0aGUgdW5pZm9ybSBzdG9yYWdlIGluZGV4IGFuZCBhcnJheSBpbmRleAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19tZXNhX3VuaWZvcm1fc3BsaXRfbG9jYXRpb25fb2Zmc2V0KGNvbnN0IHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGxvY2F0aW9uLCB1bnNpZ25lZCAqc3RvcmFnZV9pbmRleCwKKwkJCQkgICAgdW5zaWduZWQgKnVuaWZvcm1fYXJyYXlfaW5kZXgpCit7CisgICAqc3RvcmFnZV9pbmRleCA9IHByb2ctPlVuaWZvcm1SZW1hcFRhYmxlW2xvY2F0aW9uXSAtIHByb2ctPlVuaWZvcm1TdG9yYWdlOworICAgKnVuaWZvcm1fYXJyYXlfaW5kZXggPSBsb2NhdGlvbiAtCisgICAgICBwcm9nLT5Vbmlmb3JtUmVtYXBUYWJsZVtsb2NhdGlvbl0tPnJlbWFwX2xvY2F0aW9uOworCisgICAvKmdsX3VuaWZvcm1fc3RvcmFnZSBpbiBVbmlmb3JtU3RvcmFnZSB3aXRoIHRoZSBjYWxjdWxhdGVkIGJhc2VfbG9jYXRpb24KKyAgICAqIG11c3QgbWF0Y2ggd2l0aCB0aGUgZW50cnkgaW4gcmVtYXAgdGFibGUKKyAgICAqLworICAgYXNzZXJ0KCZwcm9nLT5Vbmlmb3JtU3RvcmFnZVsqc3RvcmFnZV9pbmRleF0gPT0KKyAgICAgICAgICBwcm9nLT5Vbmlmb3JtUmVtYXBUYWJsZVtsb2NhdGlvbl0pOworfQorLypAfSovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogVU5JRk9STVNfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjBjN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwICBWTXdhcmUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpbmNsdWRlICJpbXBvcnRzLmgiCisjaW5jbHVkZSAibXR5cGVzLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorLy8gI2luY2x1ZGUgImdpdF9zaGExLmgiIC8vIEx1bmFyRyBERUw6CisKKy8qKgorICogU2NhbnMgJ3N0cmluZycgdG8gc2VlIGlmIGl0IGVuZHMgd2l0aCAnZW5kaW5nJy4KKyAqLworc3RhdGljIEdMYm9vbGVhbgorY2hlY2tfZm9yX2VuZGluZyhjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmVuZGluZykKK3sKKyAgIGludCBsZW4xLCBsZW4yOworCisgICBsZW4xID0gc3RybGVuKHN0cmluZyk7CisgICBsZW4yID0gc3RybGVuKGVuZGluZyk7CisKKyAgIGlmIChsZW4yID4gbGVuMSkgeworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoc3RyY21wKHN0cmluZyArIChsZW4xIC0gbGVuMiksIGVuZGluZykgPT0gMCkgeworICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGdsIG92ZXJyaWRlIGRhdGEKKyAqCisgKiB2ZXJzaW9uID4gMCBpbmRpY2F0ZXMgdGhlcmUgaXMgYW4gb3ZlcnJpZGUgcmVxdWVzdGVkCisgKiBmd2RfY29udGV4dCBpcyBvbmx5IHZhbGlkIGlmIHZlcnNpb24gPiAwCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfZ2xfb3ZlcnJpZGUoaW50ICp2ZXJzaW9uLCBHTGJvb2xlYW4gKmZ3ZF9jb250ZXh0KQoreworICAgY29uc3QgY2hhciAqZW52X3ZhciA9ICJNRVNBX0dMX1ZFUlNJT05fT1ZFUlJJREUiOworICAgY29uc3QgY2hhciAqdmVyc2lvbl9zdHI7CisgICBpbnQgbWFqb3IsIG1pbm9yLCBuOworICAgc3RhdGljIGludCBvdmVycmlkZV92ZXJzaW9uID0gLTE7CisgICBzdGF0aWMgR0xib29sZWFuIGZjX3N1ZmZpeCA9IEdMX0ZBTFNFOworCisgICBpZiAob3ZlcnJpZGVfdmVyc2lvbiA8IDApIHsKKyAgICAgIG92ZXJyaWRlX3ZlcnNpb24gPSAwOworCisgICAgICB2ZXJzaW9uX3N0ciA9IGdldGVudihlbnZfdmFyKTsKKyAgICAgIGlmICh2ZXJzaW9uX3N0cikgeworICAgICAgICAgZmNfc3VmZml4ID0gY2hlY2tfZm9yX2VuZGluZyh2ZXJzaW9uX3N0ciwgIkZDIik7CisKKyAgICAgICAgIG4gPSBzc2NhbmYodmVyc2lvbl9zdHIsICIldS4ldSIsICZtYWpvciwgJm1pbm9yKTsKKyAgICAgICAgIGlmIChuICE9IDIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGludmFsaWQgdmFsdWUgZm9yICVzOiAlc1xuIiwgZW52X3ZhciwgdmVyc2lvbl9zdHIpOworICAgICAgICAgICAgb3ZlcnJpZGVfdmVyc2lvbiA9IDA7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3ZlcnJpZGVfdmVyc2lvbiA9IG1ham9yICogMTAgKyBtaW5vcjsKKyAgICAgICAgICAgIGlmIChvdmVycmlkZV92ZXJzaW9uIDwgMzAgJiYgZmNfc3VmZml4KSB7CisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBpbnZhbGlkIHZhbHVlIGZvciAlczogJXNcbiIsIGVudl92YXIsIHZlcnNpb25fc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgKnZlcnNpb24gPSBvdmVycmlkZV92ZXJzaW9uOworICAgKmZ3ZF9jb250ZXh0ID0gZmNfc3VmZml4OworfQorCisvKioKKyAqIEJ1aWxkcyB0aGUgTUVTQSB2ZXJzaW9uIHN0cmluZy4KKyAqLworc3RhdGljIHZvaWQKK2NyZWF0ZV92ZXJzaW9uX3N0cmluZyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICBzdGF0aWMgY29uc3QgaW50IG1heCA9IDEwMDsKKworICAgY3R4LT5WZXJzaW9uU3RyaW5nID0gbWFsbG9jKG1heCk7CisgICBpZiAoY3R4LT5WZXJzaW9uU3RyaW5nKSB7CisgICAgICAgY3R4LT5WZXJzaW9uU3RyaW5nWzBdID0gJ1wwJzsKKyAgIH0KK30KKworLyoqCisgKiBPdmVycmlkZSB0aGUgY29udGV4dCdzIHZlcnNpb24gYW5kL29yIEFQSSB0eXBlIGlmIHRoZQorICogZW52aXJvbm1lbnQgdmFyaWFibGUgTUVTQV9HTF9WRVJTSU9OX09WRVJSSURFIGlzIHNldC4KKyAqCisgKiBFeGFtcGxlIHVzZXMgb2YgTUVTQV9HTF9WRVJTSU9OX09WRVJSSURFOgorICoKKyAqIDIuMTogc2VsZWN0IGEgY29tcGF0aWJpbGl0eSAobm9uLUNvcmUpIHByb2ZpbGUgd2l0aCBHTCB2ZXJzaW9uIDIuMQorICogMy4wOiBzZWxlY3QgYSBjb21wYXRpYmlsaXR5IChub24tQ29yZSkgcHJvZmlsZSB3aXRoIEdMIHZlcnNpb24gMy4wCisgKiAzLjBGQzogc2VsZWN0IGEgQ29yZStGb3J3YXJkIENvbXBhdGlibGUgcHJvZmlsZSB3aXRoIEdMIHZlcnNpb24gMy4wCisgKiAzLjE6IHNlbGVjdCBhIENvcmUgcHJvZmlsZSB3aXRoIEdMIHZlcnNpb24gMy4xCisgKiAzLjFGQzogc2VsZWN0IGEgQ29yZStGb3J3YXJkIENvbXBhdGlibGUgcHJvZmlsZSB3aXRoIEdMIHZlcnNpb24gMy4xCisgKi8KK3ZvaWQKK19tZXNhX292ZXJyaWRlX2dsX3ZlcnNpb24oc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIGludCB2ZXJzaW9uOworICAgR0xib29sZWFuIGZ3ZF9jb250ZXh0OworCisgICBnZXRfZ2xfb3ZlcnJpZGUoJnZlcnNpb24sICZmd2RfY29udGV4dCk7CisKKyAgIGlmICh2ZXJzaW9uID4gMCkgeworICAgICAgY3R4LT5WZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgIGlmICh2ZXJzaW9uID49IDMwICYmIGZ3ZF9jb250ZXh0KSB7CisgICAgICAgICBjdHgtPkFQSSA9IEFQSV9PUEVOR0xfQ09SRTsKKyAgICAgICAgIGN0eC0+Q29uc3QuQ29udGV4dEZsYWdzIHw9IEdMX0NPTlRFWFRfRkxBR19GT1JXQVJEX0NPTVBBVElCTEVfQklUOworICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID49IDMxKSB7CisgICAgICAgICBjdHgtPkFQSSA9IEFQSV9PUEVOR0xfQ09SRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBjdHgtPkFQSSA9IEFQSV9PUEVOR0xfQ09NUEFUOworICAgICAgfQorICAgICAgY3JlYXRlX3ZlcnNpb25fc3RyaW5nKGN0eCwgIiIpOworICAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGdsIG92ZXJyaWRlIHZhbHVlCisgKgorICogdmVyc2lvbiA+IDAgaW5kaWNhdGVzIHRoZXJlIGlzIGFuIG92ZXJyaWRlIHJlcXVlc3RlZAorICovCitpbnQKK19tZXNhX2dldF9nbF92ZXJzaW9uX292ZXJyaWRlKHZvaWQpCit7CisgICBpbnQgdmVyc2lvbjsKKyAgIEdMYm9vbGVhbiBmd2RfY29udGV4dDsKKworICAgZ2V0X2dsX292ZXJyaWRlKCZ2ZXJzaW9uLCAmZndkX2NvbnRleHQpOworCisgICByZXR1cm4gdmVyc2lvbjsKK30KKworLyoqCisgKiBPdmVycmlkZSB0aGUgY29udGV4dCdzIEdMU0wgdmVyc2lvbiBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIE1FU0FfR0xTTF9WRVJTSU9OX09WRVJSSURFIGlzIHNldC4gVmFsaWQgdmFsdWVzIGZvcgorICogTUVTQV9HTFNMX1ZFUlNJT05fT1ZFUlJJREUgYXJlIGludGVnZXJzLCBzdWNoIGFzICIxMzAiLgorICovCit2b2lkCitfbWVzYV9vdmVycmlkZV9nbHNsX3ZlcnNpb24oc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIGNvbnN0IGNoYXIgKmVudl92YXIgPSAiTUVTQV9HTFNMX1ZFUlNJT05fT1ZFUlJJREUiOworICAgY29uc3QgY2hhciAqdmVyc2lvbjsKKyAgIGludCBuOworCisgICB2ZXJzaW9uID0gZ2V0ZW52KGVudl92YXIpOworICAgaWYgKCF2ZXJzaW9uKSB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIG4gPSBzc2NhbmYodmVyc2lvbiwgIiV1IiwgJmN0eC0+Q29uc3QuR0xTTFZlcnNpb24pOworICAgaWYgKG4gIT0gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogaW52YWxpZCB2YWx1ZSBmb3IgJXM6ICVzXG4iLCBlbnZfdmFyLCB2ZXJzaW9uKTsKKyAgICAgIHJldHVybjsKKyAgIH0KK30KKworLyoqCisgKiBFeGFtaW5lIGVuYWJsZWQgR0wgZXh0ZW5zaW9ucyB0byBkZXRlcm1pbmUgR0wgdmVyc2lvbi4KKyAqLworc3RhdGljIHZvaWQKK2NvbXB1dGVfdmVyc2lvbihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgR0x1aW50IG1ham9yLCBtaW5vcjsKKworICAgY29uc3QgR0xib29sZWFuIHZlcl8xXzMgPSAoY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX2N1YmVfbWFwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfZW52X2NvbWJpbmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9lbnZfZG90Myk7CisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzFfNCA9ICh2ZXJfMV8zICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2RlcHRoX3RleHR1cmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZG93ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfZW52X2Nyb3NzYmFyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX2NvbG9yICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfYmxlbmRfbWlubWF4ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3BvaW50X3BhcmFtZXRlcnMpOworICAgY29uc3QgR0xib29sZWFuIHZlcl8xXzUgPSAodmVyXzFfNCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9vY2NsdXNpb25fcXVlcnkpOworICAgY29uc3QgR0xib29sZWFuIHZlcl8yXzAgPSAodmVyXzFfNSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9wb2ludF9zcHJpdGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdmVydGV4X3NoYWRlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9mcmFnbWVudF9zaGFkZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICYmCisKKwkJCSAgICAgIC8qIFRlY2huaWNhbGx5LCAyLjAgcmVxdWlyZXMgdGhlIGZ1bmN0aW9uYWxpdHkKKwkJCSAgICAgICAqIG9mIHRoZSBFWFQgdmVyc2lvbi4gIEVuYWJsZSAyLjAgaWYgZWl0aGVyCisJCQkgICAgICAgKiBleHRlbnNpb24gaXMgYXZhaWxhYmxlLCBhbmQgYXNzdW1lIHRoYXQgYQorCQkJICAgICAgICogZHJpdmVyIHRoYXQgb25seSBleHBvc2VzIHRoZSBBVEkgZXh0ZW5zaW9uCisJCQkgICAgICAgKiB3aWxsIGZhbGxiYWNrIHRvIHNvZnR3YXJlIHdoZW4gbmVjZXNzYXJ5LgorCQkJICAgICAgICovCisJCQkgICAgICAoY3R4LT5FeHRlbnNpb25zLkVYVF9zdGVuY2lsX3R3b19zaWRlCisJCQkgICAgICAgfHwgY3R4LT5FeHRlbnNpb25zLkFUSV9zZXBhcmF0ZV9zdGVuY2lsKSk7CisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzJfMSA9ICh2ZXJfMl8wICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3BpeGVsX2J1ZmZlcl9vYmplY3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfdGV4dHVyZV9zUkdCKTsKKyAgIGNvbnN0IEdMYm9vbGVhbiB2ZXJfM18wID0gKHZlcl8yXzEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Q29uc3QuR0xTTFZlcnNpb24gPj0gMTMwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5Db25zdC5NYXhTYW1wbGVzID49IDQgfHwgY3R4LT5Db25zdC5GYWtlU1dNU0FBKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eC0+QVBJID09IEFQSV9PUEVOR0xfQ09SRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfY29sb3JfYnVmZmVyX2Zsb2F0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9kZXB0aF9idWZmZXJfZmxvYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfaGFsZl9mbG9hdF92ZXJ0ZXggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfbWFwX2J1ZmZlcl9yYW5nZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9zaGFkZXJfdGV4dHVyZV9sb2QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9mbG9hdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX3JnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF9kcmF3X2J1ZmZlcnMyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2ZyYW1lYnVmZmVyX29iamVjdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF9mcmFtZWJ1ZmZlcl9zUkdCICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3BhY2tlZF9mbG9hdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF90ZXh0dXJlX2FycmF5ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3RleHR1cmVfc2hhcmVkX2V4cG9uZW50ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3RyYW5zZm9ybV9mZWVkYmFjayAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLk5WX2NvbmRpdGlvbmFsX3JlbmRlcik7CisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzNfMSA9ICh2ZXJfM18wICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkNvbnN0LkdMU0xWZXJzaW9uID49IDE0MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9kcmF3X2luc3RhbmNlZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX2J1ZmZlcl9vYmplY3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3RleHR1cmVfc25vcm0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5OVl9wcmltaXRpdmVfcmVzdGFydCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLk5WX3RleHR1cmVfcmVjdGFuZ2xlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhUZXh0dXJlSW1hZ2VVbml0cyA+PSAxNik7CisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzNfMiA9ICh2ZXJfM18xICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkNvbnN0LkdMU0xWZXJzaW9uID49IDE1MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9kZXB0aF9jbGFtcCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9kcmF3X2VsZW1lbnRzX2Jhc2VfdmVydGV4ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3Byb3Zva2luZ192ZXJ0ZXggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2VhbWxlc3NfY3ViZV9tYXAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc3luYyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX211bHRpc2FtcGxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3ZlcnRleF9hcnJheV9iZ3JhKTsKKyAgIGNvbnN0IEdMYm9vbGVhbiB2ZXJfM18zID0gKHZlcl8zXzIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Q29uc3QuR0xTTFZlcnNpb24gPj0gMzMwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2JsZW5kX2Z1bmNfZXh0ZW5kZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2luc3RhbmNlZF9hcnJheXMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfb2NjbHVzaW9uX3F1ZXJ5MiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9zaGFkZXJfYml0X2VuY29kaW5nICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfcmdiMTBfYTJ1aSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl90aW1lcl9xdWVyeSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl92ZXJ0ZXhfdHlwZV8yXzEwXzEwXzEwX3JldiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF90ZXh0dXJlX3N3aXp6bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVJCX3NhbXBsZXJfb2JqZWN0cyBpcyBhbHdheXMgZW5hYmxlZCBpbiBtZXNhICovCisKKyAgIGlmICh2ZXJfM18zKSB7CisgICAgICBtYWpvciA9IDM7CisgICAgICBtaW5vciA9IDM7CisgICB9CisgICBlbHNlIGlmICh2ZXJfM18yKSB7CisgICAgICBtYWpvciA9IDM7CisgICAgICBtaW5vciA9IDI7CisgICB9CisgICBlbHNlIGlmICh2ZXJfM18xKSB7CisgICAgICBtYWpvciA9IDM7CisgICAgICBtaW5vciA9IDE7CisgICB9CisgICBlbHNlIGlmICh2ZXJfM18wKSB7CisgICAgICBtYWpvciA9IDM7CisgICAgICBtaW5vciA9IDA7CisgICB9CisgICBlbHNlIGlmICh2ZXJfMl8xKSB7CisgICAgICBtYWpvciA9IDI7CisgICAgICBtaW5vciA9IDE7CisgICB9CisgICBlbHNlIGlmICh2ZXJfMl8wKSB7CisgICAgICBtYWpvciA9IDI7CisgICAgICBtaW5vciA9IDA7CisgICB9CisgICBlbHNlIGlmICh2ZXJfMV81KSB7CisgICAgICBtYWpvciA9IDE7CisgICAgICBtaW5vciA9IDU7CisgICB9CisgICBlbHNlIGlmICh2ZXJfMV80KSB7CisgICAgICBtYWpvciA9IDE7CisgICAgICBtaW5vciA9IDQ7CisgICB9CisgICBlbHNlIGlmICh2ZXJfMV8zKSB7CisgICAgICBtYWpvciA9IDE7CisgICAgICBtaW5vciA9IDM7CisgICB9CisgICBlbHNlIHsKKyAgICAgIG1ham9yID0gMTsKKyAgICAgIG1pbm9yID0gMjsKKyAgIH0KKworICAgY3R4LT5WZXJzaW9uID0gbWFqb3IgKiAxMCArIG1pbm9yOworCisgICBjcmVhdGVfdmVyc2lvbl9zdHJpbmcoY3R4LCAiIik7Cit9CisKK3N0YXRpYyB2b2lkCitjb21wdXRlX3ZlcnNpb25fZXMxKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICAvKiBPcGVuR0wgRVMgMS4wIGlzIGRlcml2ZWQgZnJvbSBPcGVuR0wgMS4zICovCisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzFfMCA9IChjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfZW52X2NvbWJpbmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9lbnZfZG90Myk7CisgICAvKiBPcGVuR0wgRVMgMS4xIGlzIGRlcml2ZWQgZnJvbSBPcGVuR0wgMS41ICovCisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzFfMSA9ICh2ZXJfMV8wICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3BvaW50X3BhcmFtZXRlcnMpOworCisgICBpZiAodmVyXzFfMSkgeworICAgICAgY3R4LT5WZXJzaW9uID0gMTE7CisgICB9IGVsc2UgaWYgKHZlcl8xXzApIHsKKyAgICAgIGN0eC0+VmVyc2lvbiA9IDEwOworICAgfSBlbHNlIHsKKyAgICAgIF9tZXNhX3Byb2JsZW0oY3R4LCAiSW5jb21wbGV0ZSBPcGVuR0wgRVMgMS4wIHN1cHBvcnQuIik7CisgICB9CisKKyAgIGNyZWF0ZV92ZXJzaW9uX3N0cmluZyhjdHgsICJPcGVuR0wgRVMtQ00gIik7Cit9CisKK3N0YXRpYyB2b2lkCitjb21wdXRlX3ZlcnNpb25fZXMyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICAvKiBPcGVuR0wgRVMgMi4wIGlzIGRlcml2ZWQgZnJvbSBPcGVuR0wgMi4wICovCisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzJfMCA9IChjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfY3ViZV9tYXAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfYmxlbmRfY29sb3IgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF9ibGVuZF9taW5tYXggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdmVydGV4X3NoYWRlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl9mcmFnbWVudF9zaGFkZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlKTsKKyAgIC8qIEZJTklTSE1FOiBUaGlzIGxpc3QgaXNuJ3QgcXVpdGUgcmlnaHQuICovCisgICBjb25zdCBHTGJvb2xlYW4gdmVyXzNfMCA9IChjdHgtPkV4dGVuc2lvbnMuQVJCX2hhbGZfZmxvYXRfdmVydGV4ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2ludGVybmFsZm9ybWF0X3F1ZXJ5ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX21hcF9idWZmZXJfcmFuZ2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGVyX3RleHR1cmVfbG9kICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfZmxvYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9yZyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfZHJhd19idWZmZXJzMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3R4LT5FeHRlbnNpb25zLkFSQl9mcmFtZWJ1ZmZlcl9vYmplY3QgJiYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfZnJhbWVidWZmZXJfc1JHQiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF9wYWNrZWRfZmxvYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfdGV4dHVyZV9hcnJheSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF90ZXh0dXJlX3NoYXJlZF9leHBvbmVudCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLkVYVF90cmFuc2Zvcm1fZmVlZGJhY2sgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5OVl9jb25kaXRpb25hbF9yZW5kZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfZHJhd19pbnN0YW5jZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkV4dGVuc2lvbnMuRVhUX3RleHR1cmVfc25vcm0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+RXh0ZW5zaW9ucy5OVl9wcmltaXRpdmVfcmVzdGFydCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5FeHRlbnNpb25zLk9FU19kZXB0aF90ZXh0dXJlX2N1YmVfbWFwKTsKKyAgIGlmICh2ZXJfM18wKSB7CisgICAgICBjdHgtPlZlcnNpb24gPSAzMDsKKyAgIH0gZWxzZSBpZiAodmVyXzJfMCkgeworICAgICAgY3R4LT5WZXJzaW9uID0gMjA7CisgICB9IGVsc2UgeworICAgICAgX21lc2FfcHJvYmxlbShjdHgsICJJbmNvbXBsZXRlIE9wZW5HTCBFUyAyLjAgc3VwcG9ydC4iKTsKKyAgIH0KKworICAgY3JlYXRlX3ZlcnNpb25fc3RyaW5nKGN0eCwgIk9wZW5HTCBFUyAiKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGNvbnRleHQncyBWZXJzaW9uIGFuZCBWZXJzaW9uU3RyaW5nIGZpZWxkcy4KKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgYXMgcGFydCBvZiBjb250ZXh0IGluaXRpYWxpemF0aW9uCisgKiBvciB0byBwZXJmb3JtIHZlcnNpb24gY2hlY2sgZm9yIEdMWF9BUkJfY3JlYXRlX2NvbnRleHRfcHJvZmlsZS4KKyAqLwordm9pZAorX21lc2FfY29tcHV0ZV92ZXJzaW9uKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBpZiAoY3R4LT5WZXJzaW9uKQorICAgICAgcmV0dXJuOworCisgICBzd2l0Y2ggKGN0eC0+QVBJKSB7CisgICBjYXNlIEFQSV9PUEVOR0xfQ09NUEFUOgorICAgICAgLyogRGlzYWJsZSBHTFNMIDEuNDAgYW5kIGxhdGVyIGZvciBsZWdhY3kgY29udGV4dHMuCisgICAgICAgKiBUaGlzIGRpc2FsbG93cyBjcmVhdGlvbiBvZiB0aGUgR0wgMy4xIGNvbXBhdGliaWxpdHkgY29udGV4dC4gKi8KKyAgICAgIGlmIChjdHgtPkNvbnN0LkdMU0xWZXJzaW9uID4gMTMwKSB7CisgICAgICAgICBjdHgtPkNvbnN0LkdMU0xWZXJzaW9uID0gMTMwOworICAgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICBjYXNlIEFQSV9PUEVOR0xfQ09SRToKKyAgICAgIGNvbXB1dGVfdmVyc2lvbihjdHgpOworICAgICAgYnJlYWs7CisgICBjYXNlIEFQSV9PUEVOR0xFUzoKKyAgICAgIGNvbXB1dGVfdmVyc2lvbl9lczEoY3R4KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBBUElfT1BFTkdMRVMyOgorICAgICAgY29tcHV0ZV92ZXJzaW9uX2VzMihjdHgpOworICAgICAgYnJlYWs7CisgICBjYXNlIEFQSV9WSzoKKyAgICAgICBicmVhazsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzhmODdhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi92ZXJzaW9uLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFZNd2FyZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBWRVJTSU9OX0gKKyNkZWZpbmUgVkVSU0lPTl9ICisKKworc3RydWN0IGdsX2NvbnRleHQ7CisKKworZXh0ZXJuIHZvaWQKK19tZXNhX2NvbXB1dGVfdmVyc2lvbihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX292ZXJyaWRlX2dsX3ZlcnNpb24oc3RydWN0IGdsX2NvbnRleHQgKmN0eCk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9vdmVycmlkZV9nbHNsX3ZlcnNpb24oc3RydWN0IGdsX2NvbnRleHQgKmN0eCk7CisKK2V4dGVybiBpbnQKK19tZXNhX2dldF9nbF92ZXJzaW9uX292ZXJyaWRlKHZvaWQpOworCisjZW5kaWYgLyogVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYXRoL21fbWF0cml4LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYXRoL21fbWF0cml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3ODc2NQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL21hdGgvbV9tYXRyaXguYwpAQCAtMCwwICsxLDE2MDkgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisvKioKKyAqIFxmaWxlIG1fbWF0cml4LmMKKyAqIE1hdHJpeCBvcGVyYXRpb25zLgorICoKKyAqIFxub3RlCisgKiAtIyA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgYXJlIHN0b3JlZCBpbiBtZW1vcnkgaW4gY29sdW1uIG1ham9yIG9yZGVyLgorICogLSMgUG9pbnRzL3ZlcnRpY2VzIGFyZSB0byBiZSB0aG91Z2h0IG9mIGFzIGNvbHVtbiB2ZWN0b3JzLgorICogLSMgVHJhbnNmb3JtYXRpb24gb2YgYSBwb2ludCBwIGJ5IGEgbWF0cml4IE0gaXM6IHAnID0gTSAqIHAKKyAqLworCisKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9pbXBvcnRzLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKworI2luY2x1ZGUgIm1fbWF0cml4LmgiCisKKworLyoqCisgKiBcZGVmZ3JvdXAgTWF0RmxhZ3MgTUFUX0ZMQUdfWFhYLWZsYWdzCisgKgorICogQml0bWFza3MgdG8gaW5kaWNhdGUgZGlmZmVyZW50IGtpbmRzIG9mIDR4NCBtYXRyaWNlcyBpbiBHTG1hdHJpeDo6ZmxhZ3MKKyAqLworLypAeyovCisjZGVmaW5lIE1BVF9GTEFHX0lERU5USVRZICAgICAgIDAgICAgIC8qKjwgaXMgYW4gaWRlbnRpdHkgbWF0cml4IGZsYWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgKE5vdCBhY3R1YWxseSB1c2VkIC0gdGhlIGlkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgbWF0cml4IGlzIGlkZW50aWZpZWQgYnkgdGhlIGFic2VuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBvZiBhbGwgb3RoZXIgZmxhZ3MuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFUX0ZMQUdfR0VORVJBTCAgICAgICAgMHgxICAgLyoqPCBpcyBhIGdlbmVyYWwgbWF0cml4IGZsYWcgKi8KKyNkZWZpbmUgTUFUX0ZMQUdfUk9UQVRJT04gICAgICAgMHgyICAgLyoqPCBpcyBhIHJvdGF0aW9uIG1hdHJpeCBmbGFnICovCisjZGVmaW5lIE1BVF9GTEFHX1RSQU5TTEFUSU9OICAgIDB4NCAgIC8qKjwgaXMgYSB0cmFuc2xhdGlvbiBtYXRyaXggZmxhZyAqLworI2RlZmluZSBNQVRfRkxBR19VTklGT1JNX1NDQUxFICAweDggICAvKio8IGlzIGFuIHVuaWZvcm0gc2NhbGluZyBtYXRyaXggZmxhZyAqLworI2RlZmluZSBNQVRfRkxBR19HRU5FUkFMX1NDQUxFICAweDEwICAvKio8IGlzIGEgZ2VuZXJhbCBzY2FsaW5nIG1hdHJpeCBmbGFnICovCisjZGVmaW5lIE1BVF9GTEFHX0dFTkVSQUxfM0QgICAgIDB4MjAgIC8qKjwgZ2VuZXJhbCAzRCBtYXRyaXggZmxhZyAqLworI2RlZmluZSBNQVRfRkxBR19QRVJTUEVDVElWRSAgICAweDQwICAvKio8IGlzIGEgcGVyc3BlY3RpdmUgcHJvaiBtYXRyaXggZmxhZyAqLworI2RlZmluZSBNQVRfRkxBR19TSU5HVUxBUiAgICAgICAweDgwICAvKio8IGlzIGEgc2luZ3VsYXIgbWF0cml4IGZsYWcgKi8KKyNkZWZpbmUgTUFUX0RJUlRZX1RZUEUgICAgICAgICAgMHgxMDAgIC8qKjwgbWF0cml4IHR5cGUgaXMgZGlydHkgKi8KKyNkZWZpbmUgTUFUX0RJUlRZX0ZMQUdTICAgICAgICAgMHgyMDAgIC8qKjwgbWF0cml4IGZsYWdzIGFyZSBkaXJ0eSAqLworI2RlZmluZSBNQVRfRElSVFlfSU5WRVJTRSAgICAgICAweDQwMCAgLyoqPCBtYXRyaXggaW52ZXJzZSBpcyBkaXJ0eSAqLworCisvKiogYW5nbGUgcHJlc2VydmluZyBtYXRyaXggZmxhZ3MgbWFzayAqLworI2RlZmluZSBNQVRfRkxBR1NfQU5HTEVfUFJFU0VSVklORyAoTUFUX0ZMQUdfUk9UQVRJT04gfCBcCisJCQkJICAgIE1BVF9GTEFHX1RSQU5TTEFUSU9OIHwgXAorCQkJCSAgICBNQVRfRkxBR19VTklGT1JNX1NDQUxFKQorCisvKiogZ2VvbWV0cnkgcmVsYXRlZCBtYXRyaXggZmxhZ3MgbWFzayAqLworI2RlZmluZSBNQVRfRkxBR1NfR0VPTUVUUlkgKE1BVF9GTEFHX0dFTkVSQUwgfCBcCisJCQkgICAgTUFUX0ZMQUdfUk9UQVRJT04gfCBcCisJCQkgICAgTUFUX0ZMQUdfVFJBTlNMQVRJT04gfCBcCisJCQkgICAgTUFUX0ZMQUdfVU5JRk9STV9TQ0FMRSB8IFwKKwkJCSAgICBNQVRfRkxBR19HRU5FUkFMX1NDQUxFIHwgXAorCQkJICAgIE1BVF9GTEFHX0dFTkVSQUxfM0QgfCBcCisJCQkgICAgTUFUX0ZMQUdfUEVSU1BFQ1RJVkUgfCBcCisJICAgICAgICAgICAgICAgICAgICBNQVRfRkxBR19TSU5HVUxBUikKKworLyoqIGxlbmd0aCBwcmVzZXJ2aW5nIG1hdHJpeCBmbGFncyBtYXNrICovCisjZGVmaW5lIE1BVF9GTEFHU19MRU5HVEhfUFJFU0VSVklORyAoTUFUX0ZMQUdfUk9UQVRJT04gfCBcCisJCQkJICAgICBNQVRfRkxBR19UUkFOU0xBVElPTikKKworCisvKiogM0QgKG5vbi1wZXJzcGVjdGl2ZSkgbWF0cml4IGZsYWdzIG1hc2sgKi8KKyNkZWZpbmUgTUFUX0ZMQUdTXzNEIChNQVRfRkxBR19ST1RBVElPTiB8IFwKKwkJICAgICAgTUFUX0ZMQUdfVFJBTlNMQVRJT04gfCBcCisJCSAgICAgIE1BVF9GTEFHX1VOSUZPUk1fU0NBTEUgfCBcCisJCSAgICAgIE1BVF9GTEFHX0dFTkVSQUxfU0NBTEUgfCBcCisJCSAgICAgIE1BVF9GTEFHX0dFTkVSQUxfM0QpCisKKy8qKiBkaXJ0eSBtYXRyaXggZmxhZ3MgbWFzayAqLworI2RlZmluZSBNQVRfRElSVFkgICAgICAgICAgKE1BVF9ESVJUWV9UWVBFIHwgXAorCQkJICAgIE1BVF9ESVJUWV9GTEFHUyB8IFwKKwkJCSAgICBNQVRfRElSVFlfSU5WRVJTRSkKKworLypAfSovCisKKworLyoqIAorICogVGVzdCBnZW9tZXRyeSByZWxhdGVkIG1hdHJpeCBmbGFncy4KKyAqIAorICogXHBhcmFtIG1hdCBhIHBvaW50ZXIgdG8gYSBHTG1hdHJpeCBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gYSBmbGFncyBtYXNrLgorICoKKyAqIFxyZXR1cm5zIG5vbi16ZXJvIGlmIGFsbCBnZW9tZXRyeSByZWxhdGVkIG1hdHJpeCBmbGFncyBhcmUgY29udGFpbmVkIHdpdGhpbgorICogdGhlIG1hc2ssIG9yIHplcm8gb3RoZXJ3aXNlLgorICovIAorI2RlZmluZSBURVNUX01BVF9GTEFHUyhtYXQsIGEpICBcCisgICAgKChNQVRfRkxBR1NfR0VPTUVUUlkgJiAofihhKSkgJiAoKG1hdCktPmZsYWdzKSApID09IDApCisKKworCisvKioKKyAqIE5hbWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIEdMbWF0cml4dHlwZSB2YWx1ZXMuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp0eXBlc1tdID0geworICAgIk1BVFJJWF9HRU5FUkFMIiwKKyAgICJNQVRSSVhfSURFTlRJVFkiLAorICAgIk1BVFJJWF8zRF9OT19ST1QiLAorICAgIk1BVFJJWF9QRVJTUEVDVElWRSIsCisgICAiTUFUUklYXzJEIiwKKyAgICJNQVRSSVhfMkRfTk9fUk9UIiwKKyAgICJNQVRSSVhfM0QiCit9OworCisKKy8qKgorICogSWRlbnRpdHkgbWF0cml4LgorICovCitzdGF0aWMgR0xmbG9hdCBJZGVudGl0eVsxNl0gPSB7CisgICAxLjAsIDAuMCwgMC4wLCAwLjAsCisgICAwLjAsIDEuMCwgMC4wLCAwLjAsCisgICAwLjAsIDAuMCwgMS4wLCAwLjAsCisgICAwLjAsIDAuMCwgMC4wLCAxLjAKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBNYXRyaXggbXVsdGlwbGljYXRpb24gKi8KKy8qQHsqLworCisjZGVmaW5lIEEocm93LGNvbCkgIGFbKGNvbDw8Mikrcm93XQorI2RlZmluZSBCKHJvdyxjb2wpICBiWyhjb2w8PDIpK3Jvd10KKyNkZWZpbmUgUChyb3csY29sKSAgcHJvZHVjdFsoY29sPDwyKStyb3ddCisKKy8qKgorICogUGVyZm9ybSBhIGZ1bGwgNHg0IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KKyAqCisgKiBccGFyYW0gYSBtYXRyaXguCisgKiBccGFyYW0gYiBtYXRyaXguCisgKiBccGFyYW0gcHJvZHVjdCB3aWxsIHJlY2VpdmUgdGhlIHByb2R1Y3Qgb2YgXHAgYSBhbmQgXHAgYi4KKyAqCisgKiBcd2FybmluZyBJcyBhc3N1bWVkIHRoYXQgXHAgcHJvZHVjdCAhPSBccCBiLiBccCBwcm9kdWN0ID09IFxwIGEgaXMgYWxsb3dlZC4KKyAqCisgKiBcbm90ZSBLVzogNCoxNiA9IDY0IG11bHRpcGxpY2F0aW9ucworICogCisgKiBcYXV0aG9yIFRoaXMgXGMgbWF0bXVsIHdhcyBjb250cmlidXRlZCBieSBUaG9tYXMgTWFsaWsKKyAqLworc3RhdGljIHZvaWQgbWF0bXVsNCggR0xmbG9hdCAqcHJvZHVjdCwgY29uc3QgR0xmbG9hdCAqYSwgY29uc3QgR0xmbG9hdCAqYiApCit7CisgICBHTGludCBpOworICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgY29uc3QgR0xmbG9hdCBhaTA9QShpLDApLCAgYWkxPUEoaSwxKSwgIGFpMj1BKGksMiksICBhaTM9QShpLDMpOworICAgICAgUChpLDApID0gYWkwICogQigwLDApICsgYWkxICogQigxLDApICsgYWkyICogQigyLDApICsgYWkzICogQigzLDApOworICAgICAgUChpLDEpID0gYWkwICogQigwLDEpICsgYWkxICogQigxLDEpICsgYWkyICogQigyLDEpICsgYWkzICogQigzLDEpOworICAgICAgUChpLDIpID0gYWkwICogQigwLDIpICsgYWkxICogQigxLDIpICsgYWkyICogQigyLDIpICsgYWkzICogQigzLDIpOworICAgICAgUChpLDMpID0gYWkwICogQigwLDMpICsgYWkxICogQigxLDMpICsgYWkyICogQigyLDMpICsgYWkzICogQigzLDMpOworICAgfQorfQorCisvKioKKyAqIE11bHRpcGx5IHR3byBtYXRyaWNlcyBrbm93biB0byBvY2N1cHkgb25seSB0aGUgdG9wIHRocmVlIHJvd3MsIHN1Y2gKKyAqIGFzIHR5cGljYWwgbW9kZWwgbWF0cmljZXMsIGFuZCBvcnRob2dvbmFsIG1hdHJpY2VzLgorICoKKyAqIFxwYXJhbSBhIG1hdHJpeC4KKyAqIFxwYXJhbSBiIG1hdHJpeC4KKyAqIFxwYXJhbSBwcm9kdWN0IHdpbGwgcmVjZWl2ZSB0aGUgcHJvZHVjdCBvZiBccCBhIGFuZCBccCBiLgorICovCitzdGF0aWMgdm9pZCBtYXRtdWwzNCggR0xmbG9hdCAqcHJvZHVjdCwgY29uc3QgR0xmbG9hdCAqYSwgY29uc3QgR0xmbG9hdCAqYiApCit7CisgICBHTGludCBpOworICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgY29uc3QgR0xmbG9hdCBhaTA9QShpLDApLCAgYWkxPUEoaSwxKSwgIGFpMj1BKGksMiksICBhaTM9QShpLDMpOworICAgICAgUChpLDApID0gYWkwICogQigwLDApICsgYWkxICogQigxLDApICsgYWkyICogQigyLDApOworICAgICAgUChpLDEpID0gYWkwICogQigwLDEpICsgYWkxICogQigxLDEpICsgYWkyICogQigyLDEpOworICAgICAgUChpLDIpID0gYWkwICogQigwLDIpICsgYWkxICogQigxLDIpICsgYWkyICogQigyLDIpOworICAgICAgUChpLDMpID0gYWkwICogQigwLDMpICsgYWkxICogQigxLDMpICsgYWkyICogQigyLDMpICsgYWkzOworICAgfQorICAgUCgzLDApID0gMDsKKyAgIFAoMywxKSA9IDA7CisgICBQKDMsMikgPSAwOworICAgUCgzLDMpID0gMTsKK30KKworI3VuZGVmIEEKKyN1bmRlZiBCCisjdW5kZWYgUAorCisvKioKKyAqIE11bHRpcGx5IGEgbWF0cml4IGJ5IGFuIGFycmF5IG9mIGZsb2F0cyB3aXRoIGtub3duIHByb3BlcnRpZXMuCisgKgorICogXHBhcmFtIG1hdCBwb2ludGVyIHRvIGEgR0xtYXRyaXggc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGxlZnQgbXVsdGlwbGljYXRpb24KKyAqIG1hdHJpeCwgYW5kIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBwcm9kdWN0IHJlc3VsdC4KKyAqIFxwYXJhbSBtIHJpZ2h0IG11bHRpcGxpY2F0aW9uIG1hdHJpeCBhcnJheS4KKyAqIFxwYXJhbSBmbGFncyBmbGFncyBvZiB0aGUgbWF0cml4IFxwIG0uCisgKiAKKyAqIEpvaW5zIGJvdGggZmxhZ3MgYW5kIG1hcmtzIHRoZSB0eXBlIGFuZCBpbnZlcnNlIGFzIGRpcnR5LiAgQ2FsbHMgbWF0bXVsMzQoKQorICogaWYgYm90aCBtYXRyaWNlcyBhcmUgM0QsIG9yIG1hdG11bDQoKSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyB2b2lkIG1hdHJpeF9tdWx0ZiggR0xtYXRyaXggKm1hdCwgY29uc3QgR0xmbG9hdCAqbSwgR0x1aW50IGZsYWdzICkKK3sKKyAgIG1hdC0+ZmxhZ3MgfD0gKGZsYWdzIHwgTUFUX0RJUlRZX1RZUEUgfCBNQVRfRElSVFlfSU5WRVJTRSk7CisKKyAgIGlmIChURVNUX01BVF9GTEFHUyhtYXQsIE1BVF9GTEFHU18zRCkpCisgICAgICBtYXRtdWwzNCggbWF0LT5tLCBtYXQtPm0sIG0gKTsKKyAgIGVsc2UKKyAgICAgIG1hdG11bDQoIG1hdC0+bSwgbWF0LT5tLCBtICk7Cit9CisKKy8qKgorICogTWF0cml4IG11bHRpcGxpY2F0aW9uLgorICoKKyAqIFxwYXJhbSBkZXN0IGRlc3RpbmF0aW9uIG1hdHJpeC4KKyAqIFxwYXJhbSBhIGxlZnQgbWF0cml4LgorICogXHBhcmFtIGIgcmlnaHQgbWF0cml4LgorICogCisgKiBKb2lucyBib3RoIGZsYWdzIGFuZCBtYXJrcyB0aGUgdHlwZSBhbmQgaW52ZXJzZSBhcyBkaXJ0eS4gIENhbGxzIG1hdG11bDM0KCkKKyAqIGlmIGJvdGggbWF0cmljZXMgYXJlIDNELCBvciBtYXRtdWw0KCkgb3RoZXJ3aXNlLgorICovCit2b2lkCitfbWF0aF9tYXRyaXhfbXVsX21hdHJpeCggR0xtYXRyaXggKmRlc3QsIGNvbnN0IEdMbWF0cml4ICphLCBjb25zdCBHTG1hdHJpeCAqYiApCit7CisgICBkZXN0LT5mbGFncyA9IChhLT5mbGFncyB8CisJCSAgYi0+ZmxhZ3MgfAorCQkgIE1BVF9ESVJUWV9UWVBFIHwKKwkJICBNQVRfRElSVFlfSU5WRVJTRSk7CisKKyAgIGlmIChURVNUX01BVF9GTEFHUyhkZXN0LCBNQVRfRkxBR1NfM0QpKQorICAgICAgbWF0bXVsMzQoIGRlc3QtPm0sIGEtPm0sIGItPm0gKTsKKyAgIGVsc2UKKyAgICAgIG1hdG11bDQoIGRlc3QtPm0sIGEtPm0sIGItPm0gKTsKK30KKworLyoqCisgKiBNYXRyaXggbXVsdGlwbGljYXRpb24uCisgKgorICogXHBhcmFtIGRlc3QgbGVmdCBhbmQgZGVzdGluYXRpb24gbWF0cml4LgorICogXHBhcmFtIG0gcmlnaHQgbWF0cml4IGFycmF5LgorICogCisgKiBNYXJrcyB0aGUgbWF0cml4IGZsYWdzIHdpdGggZ2VuZXJhbCBmbGFnLCBhbmQgdHlwZSBhbmQgaW52ZXJzZSBkaXJ0eSBmbGFncy4KKyAqIENhbGxzIG1hdG11bDQoKSBmb3IgdGhlIG11bHRpcGxpY2F0aW9uLgorICovCit2b2lkCitfbWF0aF9tYXRyaXhfbXVsX2Zsb2F0cyggR0xtYXRyaXggKmRlc3QsIGNvbnN0IEdMZmxvYXQgKm0gKQoreworICAgZGVzdC0+ZmxhZ3MgfD0gKE1BVF9GTEFHX0dFTkVSQUwgfAorCQkgICBNQVRfRElSVFlfVFlQRSB8CisJCSAgIE1BVF9ESVJUWV9JTlZFUlNFIHwKKyAgICAgICAgICAgICAgICAgICBNQVRfRElSVFlfRkxBR1MpOworCisgICBtYXRtdWw0KCBkZXN0LT5tLCBkZXN0LT5tLCBtICk7Cit9CisKKy8qQH0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFxuYW1lIE1hdHJpeCBvdXRwdXQgKi8KKy8qQHsqLworCisvKioKKyAqIFByaW50IGEgbWF0cml4IGFycmF5LgorICoKKyAqIFxwYXJhbSBtIG1hdHJpeCBhcnJheS4KKyAqCisgKiBDYWxsZWQgYnkgX21hdGhfbWF0cml4X3ByaW50KCkgdG8gcHJpbnQgYSBtYXRyaXggb3IgaXRzIGludmVyc2UuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X21hdHJpeF9mbG9hdHMoIGNvbnN0IEdMZmxvYXQgbVsxNl0gKQoreworICAgaW50IGk7CisgICBmb3IgKGk9MDtpPDQ7aSsrKSB7CisgICAgICBfbWVzYV9kZWJ1ZyhOVUxMLCJcdCVmICVmICVmICVmXG4iLCBtW2ldLCBtWzQraV0sIG1bOCtpXSwgbVsxMitpXSApOworICAgfQorfQorCisvKioKKyAqIER1bXBzIHRoZSBjb250ZW50cyBvZiBhIEdMbWF0cml4IHN0cnVjdHVyZS4KKyAqIAorICogXHBhcmFtIG0gcG9pbnRlciB0byB0aGUgR0xtYXRyaXggc3RydWN0dXJlLgorICovCit2b2lkCitfbWF0aF9tYXRyaXhfcHJpbnQoIGNvbnN0IEdMbWF0cml4ICptICkKK3sKKyAgIEdMZmxvYXQgcHJvZFsxNl07CisKKyAgIF9tZXNhX2RlYnVnKE5VTEwsICJNYXRyaXggdHlwZTogJXMsIGZsYWdzOiAleFxuIiwgdHlwZXNbbS0+dHlwZV0sIG0tPmZsYWdzKTsKKyAgIHByaW50X21hdHJpeF9mbG9hdHMobS0+bSk7CisgICBfbWVzYV9kZWJ1ZyhOVUxMLCAiSW52ZXJzZTogXG4iKTsKKyAgIHByaW50X21hdHJpeF9mbG9hdHMobS0+aW52KTsKKyAgIG1hdG11bDQocHJvZCwgbS0+bSwgbS0+aW52KTsKKyAgIF9tZXNhX2RlYnVnKE5VTEwsICJNYXQgKiBJbnZlcnNlOlxuIik7CisgICBwcmludF9tYXRyaXhfZmxvYXRzKHByb2QpOworfQorCisvKkB9Ki8KKworCisvKioKKyAqIFJlZmVyZW5jZXMgYW4gZWxlbWVudCBvZiA0eDQgbWF0cml4LgorICoKKyAqIFxwYXJhbSBtIG1hdHJpeCBhcnJheS4KKyAqIFxwYXJhbSBjIGNvbHVtbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50LgorICogXHBhcmFtIHIgcm93IG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQuCisgKiAKKyAqIFxyZXR1cm4gdmFsdWUgb2YgdGhlIGRlc2lyZWQgZWxlbWVudC4KKyAqCisgKiBDYWxjdWxhdGUgdGhlIGxpbmVhciBzdG9yYWdlIGluZGV4IG9mIHRoZSBlbGVtZW50IGFuZCByZWZlcmVuY2VzIGl0LiAKKyAqLworI2RlZmluZSBNQVQobSxyLGMpIChtKVsoYykqNCsocildCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgTWF0cml4IGludmVyc2lvbiAqLworLypAeyovCisKKy8qKgorICogU3dhcHMgdGhlIHZhbHVlcyBvZiB0d28gZmxvYXRpbmcgcG9pbnQgdmFyaWFibGVzLgorICoKKyAqIFVzZWQgYnkgaW52ZXJ0X21hdHJpeF9nZW5lcmFsKCkgdG8gc3dhcCB0aGUgcm93IHBvaW50ZXJzLgorICovCisjZGVmaW5lIFNXQVBfUk9XUyhhLCBiKSB7IEdMZmxvYXQgKl90bXAgPSBhOyAoYSk9KGIpOyAoYik9X3RtcDsgfQorCisvKioKKyAqIENvbXB1dGUgaW52ZXJzZSBvZiA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICogCisgKiBccGFyYW0gbWF0IHBvaW50ZXIgdG8gYSBHTG1hdHJpeCBzdHJ1Y3R1cmUuIFRoZSBtYXRyaXggaW52ZXJzZSB3aWxsIGJlCisgKiBzdG9yZWQgaW4gdGhlIEdMbWF0cml4OjppbnYgYXR0cmlidXRlLgorICogCisgKiBccmV0dXJuIEdMX1RSVUUgZm9yIHN1Y2Nlc3MsIEdMX0ZBTFNFIGZvciBmYWlsdXJlIChccCBzaW5ndWxhciBtYXRyaXgpLgorICogCisgKiBcYXV0aG9yCisgKiBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEphY3F1ZXMgTGVyb3kgamxlQHN0YXIuYmUKKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG1hdHJpeCBieSBwZXJmb3JtaW5nIHRoZSBnYXVzc2lhbiBtYXRyaXggcmVkdWN0aW9uCisgKiB3aXRoIHBhcnRpYWwgcGl2b3RpbmcgZm9sbG93ZWQgYnkgYmFjay9zdWJzdGl0dXRpb24gd2l0aCB0aGUgbG9vcHMgbWFudWFsbHkKKyAqIHVucm9sbGVkLgorICovCitzdGF0aWMgR0xib29sZWFuIGludmVydF9tYXRyaXhfZ2VuZXJhbCggR0xtYXRyaXggKm1hdCApCit7CisgICBjb25zdCBHTGZsb2F0ICptID0gbWF0LT5tOworICAgR0xmbG9hdCAqb3V0ID0gbWF0LT5pbnY7CisgICBHTGZsb2F0IHd0bXBbNF1bOF07CisgICBHTGZsb2F0IG0wLCBtMSwgbTIsIG0zLCBzOworICAgR0xmbG9hdCAqcjAsICpyMSwgKnIyLCAqcjM7CisKKyAgIHIwID0gd3RtcFswXSwgcjEgPSB3dG1wWzFdLCByMiA9IHd0bXBbMl0sIHIzID0gd3RtcFszXTsKKworICAgcjBbMF0gPSBNQVQobSwwLDApLCByMFsxXSA9IE1BVChtLDAsMSksCisgICByMFsyXSA9IE1BVChtLDAsMiksIHIwWzNdID0gTUFUKG0sMCwzKSwKKyAgIHIwWzRdID0gMS4wLCByMFs1XSA9IHIwWzZdID0gcjBbN10gPSAwLjAsCisKKyAgIHIxWzBdID0gTUFUKG0sMSwwKSwgcjFbMV0gPSBNQVQobSwxLDEpLAorICAgcjFbMl0gPSBNQVQobSwxLDIpLCByMVszXSA9IE1BVChtLDEsMyksCisgICByMVs1XSA9IDEuMCwgcjFbNF0gPSByMVs2XSA9IHIxWzddID0gMC4wLAorCisgICByMlswXSA9IE1BVChtLDIsMCksIHIyWzFdID0gTUFUKG0sMiwxKSwKKyAgIHIyWzJdID0gTUFUKG0sMiwyKSwgcjJbM10gPSBNQVQobSwyLDMpLAorICAgcjJbNl0gPSAxLjAsIHIyWzRdID0gcjJbNV0gPSByMls3XSA9IDAuMCwKKworICAgcjNbMF0gPSBNQVQobSwzLDApLCByM1sxXSA9IE1BVChtLDMsMSksCisgICByM1syXSA9IE1BVChtLDMsMiksIHIzWzNdID0gTUFUKG0sMywzKSwKKyAgIHIzWzddID0gMS4wLCByM1s0XSA9IHIzWzVdID0gcjNbNl0gPSAwLjA7CisKKyAgIC8qIGNob29zZSBwaXZvdCAtIG9yIGRpZSAqLworICAgaWYgKEZBQlNGKHIzWzBdKT5GQUJTRihyMlswXSkpIFNXQVBfUk9XUyhyMywgcjIpOworICAgaWYgKEZBQlNGKHIyWzBdKT5GQUJTRihyMVswXSkpIFNXQVBfUk9XUyhyMiwgcjEpOworICAgaWYgKEZBQlNGKHIxWzBdKT5GQUJTRihyMFswXSkpIFNXQVBfUk9XUyhyMSwgcjApOworICAgaWYgKDAuMCA9PSByMFswXSkgIHJldHVybiBHTF9GQUxTRTsKKworICAgLyogZWxpbWluYXRlIGZpcnN0IHZhcmlhYmxlICAgICAqLworICAgbTEgPSByMVswXS9yMFswXTsgbTIgPSByMlswXS9yMFswXTsgbTMgPSByM1swXS9yMFswXTsKKyAgIHMgPSByMFsxXTsgcjFbMV0gLT0gbTEgKiBzOyByMlsxXSAtPSBtMiAqIHM7IHIzWzFdIC09IG0zICogczsKKyAgIHMgPSByMFsyXTsgcjFbMl0gLT0gbTEgKiBzOyByMlsyXSAtPSBtMiAqIHM7IHIzWzJdIC09IG0zICogczsKKyAgIHMgPSByMFszXTsgcjFbM10gLT0gbTEgKiBzOyByMlszXSAtPSBtMiAqIHM7IHIzWzNdIC09IG0zICogczsKKyAgIHMgPSByMFs0XTsKKyAgIGlmIChzICE9IDAuMCkgeyByMVs0XSAtPSBtMSAqIHM7IHIyWzRdIC09IG0yICogczsgcjNbNF0gLT0gbTMgKiBzOyB9CisgICBzID0gcjBbNV07CisgICBpZiAocyAhPSAwLjApIHsgcjFbNV0gLT0gbTEgKiBzOyByMls1XSAtPSBtMiAqIHM7IHIzWzVdIC09IG0zICogczsgfQorICAgcyA9IHIwWzZdOworICAgaWYgKHMgIT0gMC4wKSB7IHIxWzZdIC09IG0xICogczsgcjJbNl0gLT0gbTIgKiBzOyByM1s2XSAtPSBtMyAqIHM7IH0KKyAgIHMgPSByMFs3XTsKKyAgIGlmIChzICE9IDAuMCkgeyByMVs3XSAtPSBtMSAqIHM7IHIyWzddIC09IG0yICogczsgcjNbN10gLT0gbTMgKiBzOyB9CisKKyAgIC8qIGNob29zZSBwaXZvdCAtIG9yIGRpZSAqLworICAgaWYgKEZBQlNGKHIzWzFdKT5GQUJTRihyMlsxXSkpIFNXQVBfUk9XUyhyMywgcjIpOworICAgaWYgKEZBQlNGKHIyWzFdKT5GQUJTRihyMVsxXSkpIFNXQVBfUk9XUyhyMiwgcjEpOworICAgaWYgKDAuMCA9PSByMVsxXSkgIHJldHVybiBHTF9GQUxTRTsKKworICAgLyogZWxpbWluYXRlIHNlY29uZCB2YXJpYWJsZSAqLworICAgbTIgPSByMlsxXS9yMVsxXTsgbTMgPSByM1sxXS9yMVsxXTsKKyAgIHIyWzJdIC09IG0yICogcjFbMl07IHIzWzJdIC09IG0zICogcjFbMl07CisgICByMlszXSAtPSBtMiAqIHIxWzNdOyByM1szXSAtPSBtMyAqIHIxWzNdOworICAgcyA9IHIxWzRdOyBpZiAoMC4wICE9IHMpIHsgcjJbNF0gLT0gbTIgKiBzOyByM1s0XSAtPSBtMyAqIHM7IH0KKyAgIHMgPSByMVs1XTsgaWYgKDAuMCAhPSBzKSB7IHIyWzVdIC09IG0yICogczsgcjNbNV0gLT0gbTMgKiBzOyB9CisgICBzID0gcjFbNl07IGlmICgwLjAgIT0gcykgeyByMls2XSAtPSBtMiAqIHM7IHIzWzZdIC09IG0zICogczsgfQorICAgcyA9IHIxWzddOyBpZiAoMC4wICE9IHMpIHsgcjJbN10gLT0gbTIgKiBzOyByM1s3XSAtPSBtMyAqIHM7IH0KKworICAgLyogY2hvb3NlIHBpdm90IC0gb3IgZGllICovCisgICBpZiAoRkFCU0YocjNbMl0pPkZBQlNGKHIyWzJdKSkgU1dBUF9ST1dTKHIzLCByMik7CisgICBpZiAoMC4wID09IHIyWzJdKSAgcmV0dXJuIEdMX0ZBTFNFOworCisgICAvKiBlbGltaW5hdGUgdGhpcmQgdmFyaWFibGUgKi8KKyAgIG0zID0gcjNbMl0vcjJbMl07CisgICByM1szXSAtPSBtMyAqIHIyWzNdLCByM1s0XSAtPSBtMyAqIHIyWzRdLAorICAgcjNbNV0gLT0gbTMgKiByMls1XSwgcjNbNl0gLT0gbTMgKiByMls2XSwKKyAgIHIzWzddIC09IG0zICogcjJbN107CisKKyAgIC8qIGxhc3QgY2hlY2sgKi8KKyAgIGlmICgwLjAgPT0gcjNbM10pIHJldHVybiBHTF9GQUxTRTsKKworICAgcyA9IDEuMEYvcjNbM107ICAgICAgICAgICAgIC8qIG5vdyBiYWNrIHN1YnN0aXR1dGUgcm93IDMgKi8KKyAgIHIzWzRdICo9IHM7IHIzWzVdICo9IHM7IHIzWzZdICo9IHM7IHIzWzddICo9IHM7CisKKyAgIG0yID0gcjJbM107ICAgICAgICAgICAgICAgICAvKiBub3cgYmFjayBzdWJzdGl0dXRlIHJvdyAyICovCisgICBzICA9IDEuMEYvcjJbMl07CisgICByMls0XSA9IHMgKiAocjJbNF0gLSByM1s0XSAqIG0yKSwgcjJbNV0gPSBzICogKHIyWzVdIC0gcjNbNV0gKiBtMiksCisgICByMls2XSA9IHMgKiAocjJbNl0gLSByM1s2XSAqIG0yKSwgcjJbN10gPSBzICogKHIyWzddIC0gcjNbN10gKiBtMik7CisgICBtMSA9IHIxWzNdOworICAgcjFbNF0gLT0gcjNbNF0gKiBtMSwgcjFbNV0gLT0gcjNbNV0gKiBtMSwKKyAgIHIxWzZdIC09IHIzWzZdICogbTEsIHIxWzddIC09IHIzWzddICogbTE7CisgICBtMCA9IHIwWzNdOworICAgcjBbNF0gLT0gcjNbNF0gKiBtMCwgcjBbNV0gLT0gcjNbNV0gKiBtMCwKKyAgIHIwWzZdIC09IHIzWzZdICogbTAsIHIwWzddIC09IHIzWzddICogbTA7CisKKyAgIG0xID0gcjFbMl07ICAgICAgICAgICAgICAgICAvKiBub3cgYmFjayBzdWJzdGl0dXRlIHJvdyAxICovCisgICBzICA9IDEuMEYvcjFbMV07CisgICByMVs0XSA9IHMgKiAocjFbNF0gLSByMls0XSAqIG0xKSwgcjFbNV0gPSBzICogKHIxWzVdIC0gcjJbNV0gKiBtMSksCisgICByMVs2XSA9IHMgKiAocjFbNl0gLSByMls2XSAqIG0xKSwgcjFbN10gPSBzICogKHIxWzddIC0gcjJbN10gKiBtMSk7CisgICBtMCA9IHIwWzJdOworICAgcjBbNF0gLT0gcjJbNF0gKiBtMCwgcjBbNV0gLT0gcjJbNV0gKiBtMCwKKyAgIHIwWzZdIC09IHIyWzZdICogbTAsIHIwWzddIC09IHIyWzddICogbTA7CisKKyAgIG0wID0gcjBbMV07ICAgICAgICAgICAgICAgICAvKiBub3cgYmFjayBzdWJzdGl0dXRlIHJvdyAwICovCisgICBzICA9IDEuMEYvcjBbMF07CisgICByMFs0XSA9IHMgKiAocjBbNF0gLSByMVs0XSAqIG0wKSwgcjBbNV0gPSBzICogKHIwWzVdIC0gcjFbNV0gKiBtMCksCisgICByMFs2XSA9IHMgKiAocjBbNl0gLSByMVs2XSAqIG0wKSwgcjBbN10gPSBzICogKHIwWzddIC0gcjFbN10gKiBtMCk7CisKKyAgIE1BVChvdXQsMCwwKSA9IHIwWzRdOyBNQVQob3V0LDAsMSkgPSByMFs1XSwKKyAgIE1BVChvdXQsMCwyKSA9IHIwWzZdOyBNQVQob3V0LDAsMykgPSByMFs3XSwKKyAgIE1BVChvdXQsMSwwKSA9IHIxWzRdOyBNQVQob3V0LDEsMSkgPSByMVs1XSwKKyAgIE1BVChvdXQsMSwyKSA9IHIxWzZdOyBNQVQob3V0LDEsMykgPSByMVs3XSwKKyAgIE1BVChvdXQsMiwwKSA9IHIyWzRdOyBNQVQob3V0LDIsMSkgPSByMls1XSwKKyAgIE1BVChvdXQsMiwyKSA9IHIyWzZdOyBNQVQob3V0LDIsMykgPSByMls3XSwKKyAgIE1BVChvdXQsMywwKSA9IHIzWzRdOyBNQVQob3V0LDMsMSkgPSByM1s1XSwKKyAgIE1BVChvdXQsMywyKSA9IHIzWzZdOyBNQVQob3V0LDMsMykgPSByM1s3XTsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisjdW5kZWYgU1dBUF9ST1dTCisKKy8qKgorICogQ29tcHV0ZSBpbnZlcnNlIG9mIGEgZ2VuZXJhbCAzZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgKiAKKyAqIFxwYXJhbSBtYXQgcG9pbnRlciB0byBhIEdMbWF0cml4IHN0cnVjdHVyZS4gVGhlIG1hdHJpeCBpbnZlcnNlIHdpbGwgYmUKKyAqIHN0b3JlZCBpbiB0aGUgR0xtYXRyaXg6OmludiBhdHRyaWJ1dGUuCisgKiAKKyAqIFxyZXR1cm4gR0xfVFJVRSBmb3Igc3VjY2VzcywgR0xfRkFMU0UgZm9yIGZhaWx1cmUgKFxwIHNpbmd1bGFyIG1hdHJpeCkuCisgKgorICogXGF1dGhvciBBZGFwdGVkIGZyb20gZ3JhcGhpY3MgZ2VtcyBJSS4KKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG9mIHRoZSB1cHBlciBsZWZ0IGJ5IGZpcnN0IGNhbGN1bGF0aW5nIGl0cworICogZGV0ZXJtaW5hbnQgYW5kIG11bHRpcGx5aW5nIGl0IHRvIHRoZSBzeW1tZXRyaWMgYWRqdXN0IG1hdHJpeCBvZiBlYWNoCisgKiBlbGVtZW50LiBGaW5hbGx5IGRlYWxzIHdpdGggdGhlIHRyYW5zbGF0aW9uIHBhcnQgYnkgdHJhbnNmb3JtaW5nIHRoZQorICogb3JpZ2luYWwgdHJhbnNsYXRpb24gdmVjdG9yIHVzaW5nIGJ5IHRoZSBjYWxjdWxhdGVkIHN1Ym1hdHJpeCBpbnZlcnNlLgorICovCitzdGF0aWMgR0xib29sZWFuIGludmVydF9tYXRyaXhfM2RfZ2VuZXJhbCggR0xtYXRyaXggKm1hdCApCit7CisgICBjb25zdCBHTGZsb2F0ICppbiA9IG1hdC0+bTsKKyAgIEdMZmxvYXQgKm91dCA9IG1hdC0+aW52OworICAgR0xmbG9hdCBwb3MsIG5lZywgdDsKKyAgIEdMZmxvYXQgZGV0OworCisgICAvKiBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50IG9mIHVwcGVyIGxlZnQgM3gzIHN1Ym1hdHJpeCBhbmQKKyAgICAqIGRldGVybWluZSBpZiB0aGUgbWF0cml4IGlzIHNpbmd1bGFyLgorICAgICovCisgICBwb3MgPSBuZWcgPSAwLjA7CisgICB0ID0gIE1BVChpbiwwLDApICogTUFUKGluLDEsMSkgKiBNQVQoaW4sMiwyKTsKKyAgIGlmICh0ID49IDAuMCkgcG9zICs9IHQ7IGVsc2UgbmVnICs9IHQ7CisKKyAgIHQgPSAgTUFUKGluLDEsMCkgKiBNQVQoaW4sMiwxKSAqIE1BVChpbiwwLDIpOworICAgaWYgKHQgPj0gMC4wKSBwb3MgKz0gdDsgZWxzZSBuZWcgKz0gdDsKKworICAgdCA9ICBNQVQoaW4sMiwwKSAqIE1BVChpbiwwLDEpICogTUFUKGluLDEsMik7CisgICBpZiAodCA+PSAwLjApIHBvcyArPSB0OyBlbHNlIG5lZyArPSB0OworCisgICB0ID0gLU1BVChpbiwyLDApICogTUFUKGluLDEsMSkgKiBNQVQoaW4sMCwyKTsKKyAgIGlmICh0ID49IDAuMCkgcG9zICs9IHQ7IGVsc2UgbmVnICs9IHQ7CisKKyAgIHQgPSAtTUFUKGluLDEsMCkgKiBNQVQoaW4sMCwxKSAqIE1BVChpbiwyLDIpOworICAgaWYgKHQgPj0gMC4wKSBwb3MgKz0gdDsgZWxzZSBuZWcgKz0gdDsKKworICAgdCA9IC1NQVQoaW4sMCwwKSAqIE1BVChpbiwyLDEpICogTUFUKGluLDEsMik7CisgICBpZiAodCA+PSAwLjApIHBvcyArPSB0OyBlbHNlIG5lZyArPSB0OworCisgICBkZXQgPSBwb3MgKyBuZWc7CisKKyAgIGlmIChGQUJTRihkZXQpIDwgMWUtMjUpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGRldCA9IDEuMEYgLyBkZXQ7CisgICBNQVQob3V0LDAsMCkgPSAoICAoTUFUKGluLDEsMSkqTUFUKGluLDIsMikgLSBNQVQoaW4sMiwxKSpNQVQoaW4sMSwyKSApKmRldCk7CisgICBNQVQob3V0LDAsMSkgPSAoLSAoTUFUKGluLDAsMSkqTUFUKGluLDIsMikgLSBNQVQoaW4sMiwxKSpNQVQoaW4sMCwyKSApKmRldCk7CisgICBNQVQob3V0LDAsMikgPSAoICAoTUFUKGluLDAsMSkqTUFUKGluLDEsMikgLSBNQVQoaW4sMSwxKSpNQVQoaW4sMCwyKSApKmRldCk7CisgICBNQVQob3V0LDEsMCkgPSAoLSAoTUFUKGluLDEsMCkqTUFUKGluLDIsMikgLSBNQVQoaW4sMiwwKSpNQVQoaW4sMSwyKSApKmRldCk7CisgICBNQVQob3V0LDEsMSkgPSAoICAoTUFUKGluLDAsMCkqTUFUKGluLDIsMikgLSBNQVQoaW4sMiwwKSpNQVQoaW4sMCwyKSApKmRldCk7CisgICBNQVQob3V0LDEsMikgPSAoLSAoTUFUKGluLDAsMCkqTUFUKGluLDEsMikgLSBNQVQoaW4sMSwwKSpNQVQoaW4sMCwyKSApKmRldCk7CisgICBNQVQob3V0LDIsMCkgPSAoICAoTUFUKGluLDEsMCkqTUFUKGluLDIsMSkgLSBNQVQoaW4sMiwwKSpNQVQoaW4sMSwxKSApKmRldCk7CisgICBNQVQob3V0LDIsMSkgPSAoLSAoTUFUKGluLDAsMCkqTUFUKGluLDIsMSkgLSBNQVQoaW4sMiwwKSpNQVQoaW4sMCwxKSApKmRldCk7CisgICBNQVQob3V0LDIsMikgPSAoICAoTUFUKGluLDAsMCkqTUFUKGluLDEsMSkgLSBNQVQoaW4sMSwwKSpNQVQoaW4sMCwxKSApKmRldCk7CisKKyAgIC8qIERvIHRoZSB0cmFuc2xhdGlvbiBwYXJ0ICovCisgICBNQVQob3V0LDAsMykgPSAtIChNQVQoaW4sMCwzKSAqIE1BVChvdXQsMCwwKSArCisJCSAgICAgTUFUKGluLDEsMykgKiBNQVQob3V0LDAsMSkgKworCQkgICAgIE1BVChpbiwyLDMpICogTUFUKG91dCwwLDIpICk7CisgICBNQVQob3V0LDEsMykgPSAtIChNQVQoaW4sMCwzKSAqIE1BVChvdXQsMSwwKSArCisJCSAgICAgTUFUKGluLDEsMykgKiBNQVQob3V0LDEsMSkgKworCQkgICAgIE1BVChpbiwyLDMpICogTUFUKG91dCwxLDIpICk7CisgICBNQVQob3V0LDIsMykgPSAtIChNQVQoaW4sMCwzKSAqIE1BVChvdXQsMiwwKSArCisJCSAgICAgTUFUKGluLDEsMykgKiBNQVQob3V0LDIsMSkgKworCQkgICAgIE1BVChpbiwyLDMpICogTUFUKG91dCwyLDIpICk7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisvKioKKyAqIENvbXB1dGUgaW52ZXJzZSBvZiBhIDNkIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAqIAorICogXHBhcmFtIG1hdCBwb2ludGVyIHRvIGEgR0xtYXRyaXggc3RydWN0dXJlLiBUaGUgbWF0cml4IGludmVyc2Ugd2lsbCBiZQorICogc3RvcmVkIGluIHRoZSBHTG1hdHJpeDo6aW52IGF0dHJpYnV0ZS4KKyAqIAorICogXHJldHVybiBHTF9UUlVFIGZvciBzdWNjZXNzLCBHTF9GQUxTRSBmb3IgZmFpbHVyZSAoXHAgc2luZ3VsYXIgbWF0cml4KS4KKyAqCisgKiBJZiB0aGUgbWF0cml4IGlzIG5vdCBhbiBhbmdsZSBwcmVzZXJ2aW5nIG1hdHJpeCB0aGVuIGNhbGxzCisgKiBpbnZlcnRfbWF0cml4XzNkX2dlbmVyYWwgZm9yIHRoZSBhY3R1YWwgY2FsY3VsYXRpb24uIE90aGVyd2lzZSBjYWxjdWxhdGVzCisgKiB0aGUgaW52ZXJzZSBtYXRyaXggYW5hbHl6aW5nIGFuZCBpbnZlcnRpbmcgZWFjaCBvZiB0aGUgc2NhbGluZywgcm90YXRpb24gYW5kCisgKiB0cmFuc2xhdGlvbiBwYXJ0cy4KKyAqLworc3RhdGljIEdMYm9vbGVhbiBpbnZlcnRfbWF0cml4XzNkKCBHTG1hdHJpeCAqbWF0ICkKK3sKKyAgIGNvbnN0IEdMZmxvYXQgKmluID0gbWF0LT5tOworICAgR0xmbG9hdCAqb3V0ID0gbWF0LT5pbnY7CisKKyAgIGlmICghVEVTVF9NQVRfRkxBR1MobWF0LCBNQVRfRkxBR1NfQU5HTEVfUFJFU0VSVklORykpIHsKKyAgICAgIHJldHVybiBpbnZlcnRfbWF0cml4XzNkX2dlbmVyYWwoIG1hdCApOworICAgfQorCisgICBpZiAobWF0LT5mbGFncyAmIE1BVF9GTEFHX1VOSUZPUk1fU0NBTEUpIHsKKyAgICAgIEdMZmxvYXQgc2NhbGUgPSAoTUFUKGluLDAsMCkgKiBNQVQoaW4sMCwwKSArCisgICAgICAgICAgICAgICAgICAgICAgIE1BVChpbiwwLDEpICogTUFUKGluLDAsMSkgKworICAgICAgICAgICAgICAgICAgICAgICBNQVQoaW4sMCwyKSAqIE1BVChpbiwwLDIpKTsKKworICAgICAgaWYgKHNjYWxlID09IDAuMCkKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgICAgc2NhbGUgPSAxLjBGIC8gc2NhbGU7CisKKyAgICAgIC8qIFRyYW5zcG9zZSBhbmQgc2NhbGUgdGhlIDMgYnkgMyB1cHBlci1sZWZ0IHN1Ym1hdHJpeC4gKi8KKyAgICAgIE1BVChvdXQsMCwwKSA9IHNjYWxlICogTUFUKGluLDAsMCk7CisgICAgICBNQVQob3V0LDEsMCkgPSBzY2FsZSAqIE1BVChpbiwwLDEpOworICAgICAgTUFUKG91dCwyLDApID0gc2NhbGUgKiBNQVQoaW4sMCwyKTsKKyAgICAgIE1BVChvdXQsMCwxKSA9IHNjYWxlICogTUFUKGluLDEsMCk7CisgICAgICBNQVQob3V0LDEsMSkgPSBzY2FsZSAqIE1BVChpbiwxLDEpOworICAgICAgTUFUKG91dCwyLDEpID0gc2NhbGUgKiBNQVQoaW4sMSwyKTsKKyAgICAgIE1BVChvdXQsMCwyKSA9IHNjYWxlICogTUFUKGluLDIsMCk7CisgICAgICBNQVQob3V0LDEsMikgPSBzY2FsZSAqIE1BVChpbiwyLDEpOworICAgICAgTUFUKG91dCwyLDIpID0gc2NhbGUgKiBNQVQoaW4sMiwyKTsKKyAgIH0KKyAgIGVsc2UgaWYgKG1hdC0+ZmxhZ3MgJiBNQVRfRkxBR19ST1RBVElPTikgeworICAgICAgLyogVHJhbnNwb3NlIHRoZSAzIGJ5IDMgdXBwZXItbGVmdCBzdWJtYXRyaXguICovCisgICAgICBNQVQob3V0LDAsMCkgPSBNQVQoaW4sMCwwKTsKKyAgICAgIE1BVChvdXQsMSwwKSA9IE1BVChpbiwwLDEpOworICAgICAgTUFUKG91dCwyLDApID0gTUFUKGluLDAsMik7CisgICAgICBNQVQob3V0LDAsMSkgPSBNQVQoaW4sMSwwKTsKKyAgICAgIE1BVChvdXQsMSwxKSA9IE1BVChpbiwxLDEpOworICAgICAgTUFUKG91dCwyLDEpID0gTUFUKGluLDEsMik7CisgICAgICBNQVQob3V0LDAsMikgPSBNQVQoaW4sMiwwKTsKKyAgICAgIE1BVChvdXQsMSwyKSA9IE1BVChpbiwyLDEpOworICAgICAgTUFUKG91dCwyLDIpID0gTUFUKGluLDIsMik7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIHB1cmUgdHJhbnNsYXRpb24gKi8KKyAgICAgIG1lbWNweSggb3V0LCBJZGVudGl0eSwgc2l6ZW9mKElkZW50aXR5KSApOworICAgICAgTUFUKG91dCwwLDMpID0gLSBNQVQoaW4sMCwzKTsKKyAgICAgIE1BVChvdXQsMSwzKSA9IC0gTUFUKGluLDEsMyk7CisgICAgICBNQVQob3V0LDIsMykgPSAtIE1BVChpbiwyLDMpOworICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9CisKKyAgIGlmIChtYXQtPmZsYWdzICYgTUFUX0ZMQUdfVFJBTlNMQVRJT04pIHsKKyAgICAgIC8qIERvIHRoZSB0cmFuc2xhdGlvbiBwYXJ0ICovCisgICAgICBNQVQob3V0LDAsMykgPSAtIChNQVQoaW4sMCwzKSAqIE1BVChvdXQsMCwwKSArCisJCQlNQVQoaW4sMSwzKSAqIE1BVChvdXQsMCwxKSArCisJCQlNQVQoaW4sMiwzKSAqIE1BVChvdXQsMCwyKSApOworICAgICAgTUFUKG91dCwxLDMpID0gLSAoTUFUKGluLDAsMykgKiBNQVQob3V0LDEsMCkgKworCQkJTUFUKGluLDEsMykgKiBNQVQob3V0LDEsMSkgKworCQkJTUFUKGluLDIsMykgKiBNQVQob3V0LDEsMikgKTsKKyAgICAgIE1BVChvdXQsMiwzKSA9IC0gKE1BVChpbiwwLDMpICogTUFUKG91dCwyLDApICsKKwkJCU1BVChpbiwxLDMpICogTUFUKG91dCwyLDEpICsKKwkJCU1BVChpbiwyLDMpICogTUFUKG91dCwyLDIpICk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIE1BVChvdXQsMCwzKSA9IE1BVChvdXQsMSwzKSA9IE1BVChvdXQsMiwzKSA9IDAuMDsKKyAgIH0KKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKy8qKgorICogQ29tcHV0ZSBpbnZlcnNlIG9mIGFuIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAqIAorICogXHBhcmFtIG1hdCBwb2ludGVyIHRvIGEgR0xtYXRyaXggc3RydWN0dXJlLiBUaGUgbWF0cml4IGludmVyc2Ugd2lsbCBiZQorICogc3RvcmVkIGluIHRoZSBHTG1hdHJpeDo6aW52IGF0dHJpYnV0ZS4KKyAqIAorICogXHJldHVybiBhbHdheXMgR0xfVFJVRS4KKyAqCisgKiBTaW1wbHkgY29waWVzIElkZW50aXR5IGludG8gR0xtYXRyaXg6Omludi4KKyAqLworc3RhdGljIEdMYm9vbGVhbiBpbnZlcnRfbWF0cml4X2lkZW50aXR5KCBHTG1hdHJpeCAqbWF0ICkKK3sKKyAgIG1lbWNweSggbWF0LT5pbnYsIElkZW50aXR5LCBzaXplb2YoSWRlbnRpdHkpICk7CisgICByZXR1cm4gR0xfVFJVRTsKK30KKworLyoqCisgKiBDb21wdXRlIGludmVyc2Ugb2YgYSBuby1yb3RhdGlvbiAzZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgKiAKKyAqIFxwYXJhbSBtYXQgcG9pbnRlciB0byBhIEdMbWF0cml4IHN0cnVjdHVyZS4gVGhlIG1hdHJpeCBpbnZlcnNlIHdpbGwgYmUKKyAqIHN0b3JlZCBpbiB0aGUgR0xtYXRyaXg6OmludiBhdHRyaWJ1dGUuCisgKiAKKyAqIFxyZXR1cm4gR0xfVFJVRSBmb3Igc3VjY2VzcywgR0xfRkFMU0UgZm9yIGZhaWx1cmUgKFxwIHNpbmd1bGFyIG1hdHJpeCkuCisgKgorICogQ2FsY3VsYXRlcyB0aGUgCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4gaW52ZXJ0X21hdHJpeF8zZF9ub19yb3QoIEdMbWF0cml4ICptYXQgKQoreworICAgY29uc3QgR0xmbG9hdCAqaW4gPSBtYXQtPm07CisgICBHTGZsb2F0ICpvdXQgPSBtYXQtPmludjsKKworICAgaWYgKE1BVChpbiwwLDApID09IDAgfHwgTUFUKGluLDEsMSkgPT0gMCB8fCBNQVQoaW4sMiwyKSA9PSAwICkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgbWVtY3B5KCBvdXQsIElkZW50aXR5LCAxNiAqIHNpemVvZihHTGZsb2F0KSApOworICAgTUFUKG91dCwwLDApID0gMS4wRiAvIE1BVChpbiwwLDApOworICAgTUFUKG91dCwxLDEpID0gMS4wRiAvIE1BVChpbiwxLDEpOworICAgTUFUKG91dCwyLDIpID0gMS4wRiAvIE1BVChpbiwyLDIpOworCisgICBpZiAobWF0LT5mbGFncyAmIE1BVF9GTEFHX1RSQU5TTEFUSU9OKSB7CisgICAgICBNQVQob3V0LDAsMykgPSAtIChNQVQoaW4sMCwzKSAqIE1BVChvdXQsMCwwKSk7CisgICAgICBNQVQob3V0LDEsMykgPSAtIChNQVQoaW4sMSwzKSAqIE1BVChvdXQsMSwxKSk7CisgICAgICBNQVQob3V0LDIsMykgPSAtIChNQVQoaW4sMiwzKSAqIE1BVChvdXQsMiwyKSk7CisgICB9CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisvKioKKyAqIENvbXB1dGUgaW52ZXJzZSBvZiBhIG5vLXJvdGF0aW9uIDJkIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAqIAorICogXHBhcmFtIG1hdCBwb2ludGVyIHRvIGEgR0xtYXRyaXggc3RydWN0dXJlLiBUaGUgbWF0cml4IGludmVyc2Ugd2lsbCBiZQorICogc3RvcmVkIGluIHRoZSBHTG1hdHJpeDo6aW52IGF0dHJpYnV0ZS4KKyAqIAorICogXHJldHVybiBHTF9UUlVFIGZvciBzdWNjZXNzLCBHTF9GQUxTRSBmb3IgZmFpbHVyZSAoXHAgc2luZ3VsYXIgbWF0cml4KS4KKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG1hdHJpeCBieSBhcHBseWluZyB0aGUgaW52ZXJzZSBzY2FsaW5nIGFuZAorICogdHJhbnNsYXRpb24gdG8gdGhlIGlkZW50aXR5IG1hdHJpeC4KKyAqLworc3RhdGljIEdMYm9vbGVhbiBpbnZlcnRfbWF0cml4XzJkX25vX3JvdCggR0xtYXRyaXggKm1hdCApCit7CisgICBjb25zdCBHTGZsb2F0ICppbiA9IG1hdC0+bTsKKyAgIEdMZmxvYXQgKm91dCA9IG1hdC0+aW52OworCisgICBpZiAoTUFUKGluLDAsMCkgPT0gMCB8fCBNQVQoaW4sMSwxKSA9PSAwKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBtZW1jcHkoIG91dCwgSWRlbnRpdHksIDE2ICogc2l6ZW9mKEdMZmxvYXQpICk7CisgICBNQVQob3V0LDAsMCkgPSAxLjBGIC8gTUFUKGluLDAsMCk7CisgICBNQVQob3V0LDEsMSkgPSAxLjBGIC8gTUFUKGluLDEsMSk7CisKKyAgIGlmIChtYXQtPmZsYWdzICYgTUFUX0ZMQUdfVFJBTlNMQVRJT04pIHsKKyAgICAgIE1BVChvdXQsMCwzKSA9IC0gKE1BVChpbiwwLDMpICogTUFUKG91dCwwLDApKTsKKyAgICAgIE1BVChvdXQsMSwzKSA9IC0gKE1BVChpbiwxLDMpICogTUFUKG91dCwxLDEpKTsKKyAgIH0KKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKyNpZiAwCisvKiBicm9rZW4gKi8KK3N0YXRpYyBHTGJvb2xlYW4gaW52ZXJ0X21hdHJpeF9wZXJzcGVjdGl2ZSggR0xtYXRyaXggKm1hdCApCit7CisgICBjb25zdCBHTGZsb2F0ICppbiA9IG1hdC0+bTsKKyAgIEdMZmxvYXQgKm91dCA9IG1hdC0+aW52OworCisgICBpZiAoTUFUKGluLDIsMykgPT0gMCkKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKworICAgbWVtY3B5KCBvdXQsIElkZW50aXR5LCAxNiAqIHNpemVvZihHTGZsb2F0KSApOworCisgICBNQVQob3V0LDAsMCkgPSAxLjBGIC8gTUFUKGluLDAsMCk7CisgICBNQVQob3V0LDEsMSkgPSAxLjBGIC8gTUFUKGluLDEsMSk7CisKKyAgIE1BVChvdXQsMCwzKSA9IE1BVChpbiwwLDIpOworICAgTUFUKG91dCwxLDMpID0gTUFUKGluLDEsMik7CisKKyAgIE1BVChvdXQsMiwyKSA9IDA7CisgICBNQVQob3V0LDIsMykgPSAtMTsKKworICAgTUFUKG91dCwzLDIpID0gMS4wRiAvIE1BVChpbiwyLDMpOworICAgTUFUKG91dCwzLDMpID0gTUFUKGluLDIsMikgKiBNQVQob3V0LDMsMik7CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorI2VuZGlmCisKKy8qKgorICogTWF0cml4IGludmVyc2lvbiBmdW5jdGlvbiBwb2ludGVyIHR5cGUuCisgKi8KK3R5cGVkZWYgR0xib29sZWFuICgqaW52X21hdF9mdW5jKSggR0xtYXRyaXggKm1hdCApOworCisvKioKKyAqIFRhYmxlIG9mIHRoZSBtYXRyaXggaW52ZXJzaW9uIGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIG1hdHJpeCB0eXBlLgorICovCitzdGF0aWMgaW52X21hdF9mdW5jIGludl9tYXRfdGFiWzddID0geworICAgaW52ZXJ0X21hdHJpeF9nZW5lcmFsLAorICAgaW52ZXJ0X21hdHJpeF9pZGVudGl0eSwKKyAgIGludmVydF9tYXRyaXhfM2Rfbm9fcm90LAorI2lmIDAKKyAgIC8qIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBub3cgLSBpdCBmYWlscyB3aGVuIHRoZSBwcm9qZWN0aW9uIG1hdHJpeAorICAgICogaXMgcHJlbXVsdGlwbGllZCBieSBhIHRyYW5zbGF0aW9uIChhbGEgQ2hyb21pdW0ncyB0aWxlc29ydCBTUFUpLgorICAgICovCisgICBpbnZlcnRfbWF0cml4X3BlcnNwZWN0aXZlLAorI2Vsc2UKKyAgIGludmVydF9tYXRyaXhfZ2VuZXJhbCwKKyNlbmRpZgorICAgaW52ZXJ0X21hdHJpeF8zZCwJCS8qIGxhenkhICovCisgICBpbnZlcnRfbWF0cml4XzJkX25vX3JvdCwKKyAgIGludmVydF9tYXRyaXhfM2QKK307CisKKy8qKgorICogQ29tcHV0ZSBpbnZlcnNlIG9mIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICogCisgKiBccGFyYW0gbWF0IHBvaW50ZXIgdG8gYSBHTG1hdHJpeCBzdHJ1Y3R1cmUuIFRoZSBtYXRyaXggaW52ZXJzZSB3aWxsIGJlCisgKiBzdG9yZWQgaW4gdGhlIEdMbWF0cml4OjppbnYgYXR0cmlidXRlLgorICogCisgKiBccmV0dXJuIEdMX1RSVUUgZm9yIHN1Y2Nlc3MsIEdMX0ZBTFNFIGZvciBmYWlsdXJlIChccCBzaW5ndWxhciBtYXRyaXgpLgorICoKKyAqIENhbGxzIHRoZSBtYXRyaXggaW52ZXJzaW9uIGZ1bmN0aW9uIGluIGludl9tYXRfdGFiIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiBnaXZlbiBtYXRyaXggdHlwZS4gIEluIGNhc2Ugb2YgZmFpbHVyZSwgdXBkYXRlcyB0aGUgTUFUX0ZMQUdfU0lOR1VMQVIgZmxhZywKKyAqIGFuZCBjb3BpZXMgdGhlIGlkZW50aXR5IG1hdHJpeCBpbnRvIEdMbWF0cml4OjppbnYuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4gbWF0cml4X2ludmVydCggR0xtYXRyaXggKm1hdCApCit7CisgICBpZiAoaW52X21hdF90YWJbbWF0LT50eXBlXShtYXQpKSB7CisgICAgICBtYXQtPmZsYWdzICY9IH5NQVRfRkxBR19TSU5HVUxBUjsKKyAgICAgIHJldHVybiBHTF9UUlVFOworICAgfSBlbHNlIHsKKyAgICAgIG1hdC0+ZmxhZ3MgfD0gTUFUX0ZMQUdfU0lOR1VMQVI7CisgICAgICBtZW1jcHkoIG1hdC0+aW52LCBJZGVudGl0eSwgc2l6ZW9mKElkZW50aXR5KSApOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorfQorCisvKkB9Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBNYXRyaXggZ2VuZXJhdGlvbiAqLworLypAeyovCisKKy8qKgorICogR2VuZXJhdGUgYSA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gZ2xSb3RhdGUgcGFyYW1ldGVycywgYW5kCisgKiBwb3N0LW11bHRpcGx5IHRoZSBpbnB1dCBtYXRyaXggYnkgaXQuCisgKgorICogXGF1dGhvcgorICogVGhpcyBmdW5jdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRXJpY2ggQm9sZXluIChlcmljaEB1cnVrLm9yZykuCisgKiBPcHRpbWl6YXRpb25zIGNvbnRyaWJ1dGVkIGJ5IFJ1ZG9sZiBPcGFsbGEgKHJ1ZGlAa2htLmRlKS4KKyAqLwordm9pZAorX21hdGhfbWF0cml4X3JvdGF0ZSggR0xtYXRyaXggKm1hdCwKKwkJICAgICBHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKK3sKKyAgIEdMZmxvYXQgeHgsIHl5LCB6eiwgeHksIHl6LCB6eCwgeHMsIHlzLCB6cywgb25lX2MsIHMsIGM7CisgICBHTGZsb2F0IG1bMTZdOworICAgR0xib29sZWFuIG9wdGltaXplZDsKKworICAgcyA9IChHTGZsb2F0KSBzaW4oIGFuZ2xlICogREVHMlJBRCApOworICAgYyA9IChHTGZsb2F0KSBjb3MoIGFuZ2xlICogREVHMlJBRCApOworCisgICBtZW1jcHkobSwgSWRlbnRpdHksIHNpemVvZihHTGZsb2F0KSoxNik7CisgICBvcHRpbWl6ZWQgPSBHTF9GQUxTRTsKKworI2RlZmluZSBNKHJvdyxjb2wpICBtW2NvbCo0K3Jvd10KKworICAgaWYgKHggPT0gMC4wRikgeworICAgICAgaWYgKHkgPT0gMC4wRikgeworICAgICAgICAgaWYgKHogIT0gMC4wRikgeworICAgICAgICAgICAgb3B0aW1pemVkID0gR0xfVFJVRTsKKyAgICAgICAgICAgIC8qIHJvdGF0ZSBvbmx5IGFyb3VuZCB6LWF4aXMgKi8KKyAgICAgICAgICAgIE0oMCwwKSA9IGM7CisgICAgICAgICAgICBNKDEsMSkgPSBjOworICAgICAgICAgICAgaWYgKHogPCAwLjBGKSB7CisgICAgICAgICAgICAgICBNKDAsMSkgPSBzOworICAgICAgICAgICAgICAgTSgxLDApID0gLXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIE0oMCwxKSA9IC1zOworICAgICAgICAgICAgICAgTSgxLDApID0gczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHogPT0gMC4wRikgeworICAgICAgICAgb3B0aW1pemVkID0gR0xfVFJVRTsKKyAgICAgICAgIC8qIHJvdGF0ZSBvbmx5IGFyb3VuZCB5LWF4aXMgKi8KKyAgICAgICAgIE0oMCwwKSA9IGM7CisgICAgICAgICBNKDIsMikgPSBjOworICAgICAgICAgaWYgKHkgPCAwLjBGKSB7CisgICAgICAgICAgICBNKDAsMikgPSAtczsKKyAgICAgICAgICAgIE0oMiwwKSA9IHM7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE0oMCwyKSA9IHM7CisgICAgICAgICAgICBNKDIsMCkgPSAtczsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgaWYgKHkgPT0gMC4wRikgeworICAgICAgaWYgKHogPT0gMC4wRikgeworICAgICAgICAgb3B0aW1pemVkID0gR0xfVFJVRTsKKyAgICAgICAgIC8qIHJvdGF0ZSBvbmx5IGFyb3VuZCB4LWF4aXMgKi8KKyAgICAgICAgIE0oMSwxKSA9IGM7CisgICAgICAgICBNKDIsMikgPSBjOworICAgICAgICAgaWYgKHggPCAwLjBGKSB7CisgICAgICAgICAgICBNKDEsMikgPSBzOworICAgICAgICAgICAgTSgyLDEpID0gLXM7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE0oMSwyKSA9IC1zOworICAgICAgICAgICAgTSgyLDEpID0gczsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKCFvcHRpbWl6ZWQpIHsKKyAgICAgIGNvbnN0IEdMZmxvYXQgbWFnID0gc3FydGYoeCAqIHggKyB5ICogeSArIHogKiB6KTsKKworICAgICAgaWYgKG1hZyA8PSAxLjBlLTQpIHsKKyAgICAgICAgIC8qIG5vIHJvdGF0aW9uLCBsZWF2ZSBtYXQgYXMtaXMgKi8KKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgeCAvPSBtYWc7CisgICAgICB5IC89IG1hZzsKKyAgICAgIHogLz0gbWFnOworCisKKyAgICAgIC8qCisgICAgICAgKiAgICAgQXJiaXRyYXJ5IGF4aXMgcm90YXRpb24gbWF0cml4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGNvbXBvc2VkIG9mIDUgbWF0cmljZXMsIFJ6LCBSeSwgVCwgUnknLCBSeicsIG11bHRpcGxpZWQKKyAgICAgICAqICBsaWtlIHNvOiAgUnogKiBSeSAqIFQgKiBSeScgKiBSeicuICBUIGlzIHRoZSBmaW5hbCByb3RhdGlvbgorICAgICAgICogICh3aGljaCBpcyBhYm91dCB0aGUgWC1heGlzKSwgYW5kIHRoZSB0d28gY29tcG9zaXRlIHRyYW5zZm9ybXMKKyAgICAgICAqICBSeScgKiBSeicgYW5kIFJ6ICogUnkgYXJlIChyZXNwZWN0aXZlbHkpIHRoZSByb3RhdGlvbnMgbmVjZXNzYXJ5CisgICAgICAgKiAgZnJvbSB0aGUgYXJiaXRyYXJ5IGF4aXMgdG8gdGhlIFgtYXhpcyB0aGVuIGJhY2suICBUaGV5IGFyZQorICAgICAgICogIGFsbCBlbGVtZW50YXJ5IHJvdGF0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgUnonIGlzIGEgcm90YXRpb24gYWJvdXQgdGhlIFotYXhpcywgdG8gYnJpbmcgdGhlIGF4aXMgdmVjdG9yCisgICAgICAgKiAgaW50byB0aGUgeC16IHBsYW5lLiAgVGhlbiBSeScgaXMgYXBwbGllZCwgcm90YXRpbmcgYWJvdXQgdGhlCisgICAgICAgKiAgWS1heGlzIHRvIGJyaW5nIHRoZSBheGlzIHZlY3RvciBwYXJhbGxlbCB3aXRoIHRoZSBYLWF4aXMuICBUaGUKKyAgICAgICAqICByb3RhdGlvbiBhYm91dCB0aGUgWC1heGlzIGlzIHRoZW4gcGVyZm9ybWVkLiAgUnkgYW5kIFJ6IGFyZQorICAgICAgICogIHNpbXBseSB0aGUgcmVzcGVjdGl2ZSBpbnZlcnNlIHRyYW5zZm9ybXMgdG8gYnJpbmcgdGhlIGFyYml0cmFyeQorICAgICAgICogIGF4aXMgYmFjayB0byBpdHMgb3JpZ2luYWwgb3JpZW50YXRpb24uICBUaGUgZmlyc3QgdHJhbnNmb3JtcworICAgICAgICogIFJ6JyBhbmQgUnknIGFyZSBjb25zaWRlcmVkIGludmVyc2VzLCBzaW5jZSB0aGUgZGF0YSBmcm9tIHRoZQorICAgICAgICogIGFyYml0cmFyeSBheGlzIGdpdmVzIHlvdSBpbmZvIG9uIGhvdyB0byBnZXQgdG8gaXQsIG5vdCBob3cKKyAgICAgICAqICB0byBnZXQgYXdheSBmcm9tIGl0LCBhbmQgYW4gaW52ZXJzZSBtdXN0IGJlIGFwcGxpZWQuCisgICAgICAgKgorICAgICAgICogIFRoZSBiYXNpYyBjYWxjdWxhdGlvbiB1c2VkIGlzIHRvIHJlY29nbml6ZSB0aGF0IHRoZSBhcmJpdHJhcnkKKyAgICAgICAqICBheGlzIHZlY3RvciAoeCwgeSwgeiksIHNpbmNlIGl0IGlzIG9mIHVuaXQgbGVuZ3RoLCBhY3R1YWxseQorICAgICAgICogIHJlcHJlc2VudHMgdGhlIHNpbmVzIGFuZCBjb3NpbmVzIG9mIHRoZSBhbmdsZXMgdG8gcm90YXRlIHRoZQorICAgICAgICogIFgtYXhpcyB0byB0aGUgc2FtZSBvcmllbnRhdGlvbiwgd2l0aCB0aGV0YSBiZWluZyB0aGUgYW5nbGUgYWJvdXQKKyAgICAgICAqICBaIGFuZCBwaGkgdGhlIGFuZ2xlIGFib3V0IFkgKGluIHRoZSBvcmRlciBkZXNjcmliZWQgYWJvdmUpCisgICAgICAgKiAgYXMgZm9sbG93czoKKyAgICAgICAqCisgICAgICAgKiAgY29zICggdGhldGEgKSA9IHggLyBzcXJ0ICggMSAtIHpeMiApCisgICAgICAgKiAgc2luICggdGhldGEgKSA9IHkgLyBzcXJ0ICggMSAtIHpeMiApCisgICAgICAgKgorICAgICAgICogIGNvcyAoIHBoaSApID0gc3FydCAoIDEgLSB6XjIgKQorICAgICAgICogIHNpbiAoIHBoaSApID0gegorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgY29zICggcGhpICkgY2FuIGZ1cnRoZXIgYmUgaW5zZXJ0ZWQgdG8gdGhlIGFib3ZlCisgICAgICAgKiAgZm9ybXVsYXM6CisgICAgICAgKgorICAgICAgICogIGNvcyAoIHRoZXRhICkgPSB4IC8gY29zICggcGhpICkKKyAgICAgICAqICBzaW4gKCB0aGV0YSApID0geSAvIHNpbiAoIHBoaSApCisgICAgICAgKgorICAgICAgICogIC4uLmV0Yy4gIEJlY2F1c2Ugb2YgdGhvc2UgcmVsYXRpb25zIGFuZCB0aGUgc3RhbmRhcmQgdHJpZ29ub21ldHJpYworICAgICAgICogIHJlbGF0aW9ucywgaXQgaXMgcHNzaWJsZSB0byByZWR1Y2UgdGhlIHRyYW5zZm9ybXMgZG93biB0byB3aGF0CisgICAgICAgKiAgaXMgdXNlZCBiZWxvdy4gIEl0IG1heSBiZSB0aGF0IGFueSBwcmltYXJ5IGF4aXMgY2hvc2VuIHdpbGwgZ2l2ZSB0aGUKKyAgICAgICAqICBzYW1lIHJlc3VsdHMgKG1vZHVsbyBhIHNpZ24gY29udmVudGlvbikgdXNpbmcgdGhpZSBtZXRob2QuCisgICAgICAgKgorICAgICAgICogIFBhcnRpY3VsYXJseSBuaWNlIGlzIHRvIG5vdGljZSB0aGF0IGFsbCBkaXZpc2lvbnMgdGhhdCBtaWdodAorICAgICAgICogIGhhdmUgY2F1c2VkIHRyb3VibGUgd2hlbiBwYXJhbGxlbCB0byBjZXJ0YWluIHBsYW5lcyBvcgorICAgICAgICogIGF4aXMgZ28gYXdheSB3aXRoIGNhcmUgcGFpZCB0byByZWR1Y2luZyB0aGUgZXhwcmVzc2lvbnMuCisgICAgICAgKiAgQWZ0ZXIgY2hlY2tpbmcsIGl0IGRvZXMgcGVyZm9ybSBjb3JyZWN0bHkgdW5kZXIgYWxsIGNhc2VzLCBzaW5jZQorICAgICAgICogIGluIGFsbCB0aGUgY2FzZXMgb2YgZGl2aXNpb24gd2hlcmUgdGhlIGRlbm9taW5hdG9yIHdvdWxkIGhhdmUKKyAgICAgICAqICBiZWVuIHplcm8sIHRoZSBudW1lcmF0b3Igd291bGQgaGF2ZSBiZWVuIHplcm8gYXMgd2VsbCwgZ2l2aW5nCisgICAgICAgKiAgdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAgICAgICAqLworCisgICAgICB4eCA9IHggKiB4OworICAgICAgeXkgPSB5ICogeTsKKyAgICAgIHp6ID0geiAqIHo7CisgICAgICB4eSA9IHggKiB5OworICAgICAgeXogPSB5ICogejsKKyAgICAgIHp4ID0geiAqIHg7CisgICAgICB4cyA9IHggKiBzOworICAgICAgeXMgPSB5ICogczsKKyAgICAgIHpzID0geiAqIHM7CisgICAgICBvbmVfYyA9IDEuMEYgLSBjOworCisgICAgICAvKiBXZSBhbHJlYWR5IGhvbGQgdGhlIGlkZW50aXR5LW1hdHJpeCBzbyB3ZSBjYW4gc2tpcCBzb21lIHN0YXRlbWVudHMgKi8KKyAgICAgIE0oMCwwKSA9IChvbmVfYyAqIHh4KSArIGM7CisgICAgICBNKDAsMSkgPSAob25lX2MgKiB4eSkgLSB6czsKKyAgICAgIE0oMCwyKSA9IChvbmVfYyAqIHp4KSArIHlzOworLyogICAgTSgwLDMpID0gMC4wRjsgKi8KKworICAgICAgTSgxLDApID0gKG9uZV9jICogeHkpICsgenM7CisgICAgICBNKDEsMSkgPSAob25lX2MgKiB5eSkgKyBjOworICAgICAgTSgxLDIpID0gKG9uZV9jICogeXopIC0geHM7CisvKiAgICBNKDEsMykgPSAwLjBGOyAqLworCisgICAgICBNKDIsMCkgPSAob25lX2MgKiB6eCkgLSB5czsKKyAgICAgIE0oMiwxKSA9IChvbmVfYyAqIHl6KSArIHhzOworICAgICAgTSgyLDIpID0gKG9uZV9jICogenopICsgYzsKKy8qICAgIE0oMiwzKSA9IDAuMEY7ICovCisKKy8qCisgICAgICBNKDMsMCkgPSAwLjBGOworICAgICAgTSgzLDEpID0gMC4wRjsKKyAgICAgIE0oMywyKSA9IDAuMEY7CisgICAgICBNKDMsMykgPSAxLjBGOworKi8KKyAgIH0KKyN1bmRlZiBNCisKKyAgIG1hdHJpeF9tdWx0ZiggbWF0LCBtLCBNQVRfRkxBR19ST1RBVElPTiApOworfQorCisvKioKKyAqIEFwcGx5IGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguCisgKgorICogXHBhcmFtIG1hdCBtYXRyaXggdG8gYXBwbHkgdGhlIHByb2plY3Rpb24uCisgKiBccGFyYW0gbGVmdCBsZWZ0IGNsaXBwaW5nIHBsYW5lIGNvb3JkaW5hdGUuCisgKiBccGFyYW0gcmlnaHQgcmlnaHQgY2xpcHBpbmcgcGxhbmUgY29vcmRpbmF0ZS4KKyAqIFxwYXJhbSBib3R0b20gYm90dG9tIGNsaXBwaW5nIHBsYW5lIGNvb3JkaW5hdGUuCisgKiBccGFyYW0gdG9wIHRvcCBjbGlwcGluZyBwbGFuZSBjb29yZGluYXRlLgorICogXHBhcmFtIG5lYXJ2YWwgZGlzdGFuY2UgdG8gdGhlIG5lYXIgY2xpcHBpbmcgcGxhbmUuCisgKiBccGFyYW0gZmFydmFsIGRpc3RhbmNlIHRvIHRoZSBmYXIgY2xpcHBpbmcgcGxhbmUuCisgKgorICogQ3JlYXRlcyB0aGUgcHJvamVjdGlvbiBtYXRyaXggYW5kIG11bHRpcGxpZXMgaXQgd2l0aCBccCBtYXQsIG1hcmtpbmcgdGhlCisgKiBNQVRfRkxBR19QRVJTUEVDVElWRSBmbGFnLgorICovCit2b2lkCitfbWF0aF9tYXRyaXhfZnJ1c3R1bSggR0xtYXRyaXggKm1hdCwKKwkJICAgICAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LAorCQkgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCisJCSAgICAgIEdMZmxvYXQgbmVhcnZhbCwgR0xmbG9hdCBmYXJ2YWwgKQoreworICAgR0xmbG9hdCB4LCB5LCBhLCBiLCBjLCBkOworICAgR0xmbG9hdCBtWzE2XTsKKworICAgeCA9ICgyLjBGKm5lYXJ2YWwpIC8gKHJpZ2h0LWxlZnQpOworICAgeSA9ICgyLjBGKm5lYXJ2YWwpIC8gKHRvcC1ib3R0b20pOworICAgYSA9IChyaWdodCtsZWZ0KSAvIChyaWdodC1sZWZ0KTsKKyAgIGIgPSAodG9wK2JvdHRvbSkgLyAodG9wLWJvdHRvbSk7CisgICBjID0gLShmYXJ2YWwrbmVhcnZhbCkgLyAoIGZhcnZhbC1uZWFydmFsKTsKKyAgIGQgPSAtKDIuMEYqZmFydmFsKm5lYXJ2YWwpIC8gKGZhcnZhbC1uZWFydmFsKTsgIC8qIGVycm9yPyAqLworCisjZGVmaW5lIE0ocm93LGNvbCkgIG1bY29sKjQrcm93XQorICAgTSgwLDApID0geDsgICAgIE0oMCwxKSA9IDAuMEY7ICBNKDAsMikgPSBhOyAgICAgIE0oMCwzKSA9IDAuMEY7CisgICBNKDEsMCkgPSAwLjBGOyAgTSgxLDEpID0geTsgICAgIE0oMSwyKSA9IGI7ICAgICAgTSgxLDMpID0gMC4wRjsKKyAgIE0oMiwwKSA9IDAuMEY7ICBNKDIsMSkgPSAwLjBGOyAgTSgyLDIpID0gYzsgICAgICBNKDIsMykgPSBkOworICAgTSgzLDApID0gMC4wRjsgIE0oMywxKSA9IDAuMEY7ICBNKDMsMikgPSAtMS4wRjsgIE0oMywzKSA9IDAuMEY7CisjdW5kZWYgTQorCisgICBtYXRyaXhfbXVsdGYoIG1hdCwgbSwgTUFUX0ZMQUdfUEVSU1BFQ1RJVkUgKTsKK30KKworLyoqCisgKiBBcHBseSBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXguCisgKgorICogXHBhcmFtIG1hdCBtYXRyaXggdG8gYXBwbHkgdGhlIHByb2plY3Rpb24uCisgKiBccGFyYW0gbGVmdCBsZWZ0IGNsaXBwaW5nIHBsYW5lIGNvb3JkaW5hdGUuCisgKiBccGFyYW0gcmlnaHQgcmlnaHQgY2xpcHBpbmcgcGxhbmUgY29vcmRpbmF0ZS4KKyAqIFxwYXJhbSBib3R0b20gYm90dG9tIGNsaXBwaW5nIHBsYW5lIGNvb3JkaW5hdGUuCisgKiBccGFyYW0gdG9wIHRvcCBjbGlwcGluZyBwbGFuZSBjb29yZGluYXRlLgorICogXHBhcmFtIG5lYXJ2YWwgZGlzdGFuY2UgdG8gdGhlIG5lYXIgY2xpcHBpbmcgcGxhbmUuCisgKiBccGFyYW0gZmFydmFsIGRpc3RhbmNlIHRvIHRoZSBmYXIgY2xpcHBpbmcgcGxhbmUuCisgKgorICogQ3JlYXRlcyB0aGUgcHJvamVjdGlvbiBtYXRyaXggYW5kIG11bHRpcGxpZXMgaXQgd2l0aCBccCBtYXQsIG1hcmtpbmcgdGhlCisgKiBNQVRfRkxBR19HRU5FUkFMX1NDQUxFIGFuZCBNQVRfRkxBR19UUkFOU0xBVElPTiBmbGFncy4KKyAqLwordm9pZAorX21hdGhfbWF0cml4X29ydGhvKCBHTG1hdHJpeCAqbWF0LAorCQkgICAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LAorCQkgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAorCQkgICAgR0xmbG9hdCBuZWFydmFsLCBHTGZsb2F0IGZhcnZhbCApCit7CisgICBHTGZsb2F0IG1bMTZdOworCisjZGVmaW5lIE0ocm93LGNvbCkgIG1bY29sKjQrcm93XQorICAgTSgwLDApID0gMi4wRiAvIChyaWdodC1sZWZ0KTsKKyAgIE0oMCwxKSA9IDAuMEY7CisgICBNKDAsMikgPSAwLjBGOworICAgTSgwLDMpID0gLShyaWdodCtsZWZ0KSAvIChyaWdodC1sZWZ0KTsKKworICAgTSgxLDApID0gMC4wRjsKKyAgIE0oMSwxKSA9IDIuMEYgLyAodG9wLWJvdHRvbSk7CisgICBNKDEsMikgPSAwLjBGOworICAgTSgxLDMpID0gLSh0b3ArYm90dG9tKSAvICh0b3AtYm90dG9tKTsKKworICAgTSgyLDApID0gMC4wRjsKKyAgIE0oMiwxKSA9IDAuMEY7CisgICBNKDIsMikgPSAtMi4wRiAvIChmYXJ2YWwtbmVhcnZhbCk7CisgICBNKDIsMykgPSAtKGZhcnZhbCtuZWFydmFsKSAvIChmYXJ2YWwtbmVhcnZhbCk7CisKKyAgIE0oMywwKSA9IDAuMEY7CisgICBNKDMsMSkgPSAwLjBGOworICAgTSgzLDIpID0gMC4wRjsKKyAgIE0oMywzKSA9IDEuMEY7CisjdW5kZWYgTQorCisgICBtYXRyaXhfbXVsdGYoIG1hdCwgbSwgKE1BVF9GTEFHX0dFTkVSQUxfU0NBTEV8TUFUX0ZMQUdfVFJBTlNMQVRJT04pKTsKK30KKworLyoqCisgKiBNdWx0aXBseSBhIG1hdHJpeCB3aXRoIGEgZ2VuZXJhbCBzY2FsaW5nIG1hdHJpeC4KKyAqCisgKiBccGFyYW0gbWF0IG1hdHJpeC4KKyAqIFxwYXJhbSB4IHggYXhpcyBzY2FsZSBmYWN0b3IuCisgKiBccGFyYW0geSB5IGF4aXMgc2NhbGUgZmFjdG9yLgorICogXHBhcmFtIHogeiBheGlzIHNjYWxlIGZhY3Rvci4KKyAqCisgKiBNdWx0aXBsaWVzIGluLXBsYWNlIHRoZSBlbGVtZW50cyBvZiBccCBtYXQgYnkgdGhlIHNjYWxlIGZhY3RvcnMuIENoZWNrcyBpZgorICogdGhlIHNjYWxlcyBmYWN0b3JzIGFyZSByb3VnaGx5IHRoZSBzYW1lLCBtYXJraW5nIHRoZSBNQVRfRkxBR19VTklGT1JNX1NDQUxFCisgKiBmbGFnLCBvciBNQVRfRkxBR19HRU5FUkFMX1NDQUxFLiBNYXJrcyB0aGUgTUFUX0RJUlRZX1RZUEUgYW5kCisgKiBNQVRfRElSVFlfSU5WRVJTRSBkaXJ0eSBmbGFncy4KKyAqLwordm9pZAorX21hdGhfbWF0cml4X3NjYWxlKCBHTG1hdHJpeCAqbWF0LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKK3sKKyAgIEdMZmxvYXQgKm0gPSBtYXQtPm07CisgICBtWzBdICo9IHg7ICAgbVs0XSAqPSB5OyAgIG1bOF0gICo9IHo7CisgICBtWzFdICo9IHg7ICAgbVs1XSAqPSB5OyAgIG1bOV0gICo9IHo7CisgICBtWzJdICo9IHg7ICAgbVs2XSAqPSB5OyAgIG1bMTBdICo9IHo7CisgICBtWzNdICo9IHg7ICAgbVs3XSAqPSB5OyAgIG1bMTFdICo9IHo7CisKKyAgIGlmIChGQUJTRih4IC0geSkgPCAxZS04ICYmIEZBQlNGKHggLSB6KSA8IDFlLTgpCisgICAgICBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX1VOSUZPUk1fU0NBTEU7CisgICBlbHNlCisgICAgICBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX0dFTkVSQUxfU0NBTEU7CisKKyAgIG1hdC0+ZmxhZ3MgfD0gKE1BVF9ESVJUWV9UWVBFIHwKKwkJICBNQVRfRElSVFlfSU5WRVJTRSk7Cit9CisKKy8qKgorICogTXVsdGlwbHkgYSBtYXRyaXggd2l0aCBhIHRyYW5zbGF0aW9uIG1hdHJpeC4KKyAqCisgKiBccGFyYW0gbWF0IG1hdHJpeC4KKyAqIFxwYXJhbSB4IHRyYW5zbGF0aW9uIHZlY3RvciB4IGNvb3JkaW5hdGUuCisgKiBccGFyYW0geSB0cmFuc2xhdGlvbiB2ZWN0b3IgeSBjb29yZGluYXRlLgorICogXHBhcmFtIHogdHJhbnNsYXRpb24gdmVjdG9yIHogY29vcmRpbmF0ZS4KKyAqCisgKiBBZGRzIHRoZSB0cmFuc2xhdGlvbiBjb29yZGluYXRlcyB0byB0aGUgZWxlbWVudHMgb2YgXHAgbWF0IGluLXBsYWNlLiAgTWFya3MKKyAqIHRoZSBNQVRfRkxBR19UUkFOU0xBVElPTiBmbGFnLCBhbmQgdGhlIE1BVF9ESVJUWV9UWVBFIGFuZCBNQVRfRElSVFlfSU5WRVJTRQorICogZGlydHkgZmxhZ3MuCisgKi8KK3ZvaWQKK19tYXRoX21hdHJpeF90cmFuc2xhdGUoIEdMbWF0cml4ICptYXQsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQoreworICAgR0xmbG9hdCAqbSA9IG1hdC0+bTsKKyAgIG1bMTJdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gICogeiArIG1bMTJdOworICAgbVsxM10gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAgKiB6ICsgbVsxM107CisgICBtWzE0XSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XTsKKyAgIG1bMTVdID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdOworCisgICBtYXQtPmZsYWdzIHw9IChNQVRfRkxBR19UUkFOU0xBVElPTiB8CisJCSAgTUFUX0RJUlRZX1RZUEUgfAorCQkgIE1BVF9ESVJUWV9JTlZFUlNFKTsKK30KKworCisvKioKKyAqIFNldCBtYXRyaXggdG8gZG8gdmlld3BvcnQgYW5kIGRlcHRocmFuZ2UgbWFwcGluZy4KKyAqIFRyYW5zZm9ybXMgTm9ybWFsaXplZCBEZXZpY2UgQ29vcmRzIHRvIHdpbmRvdy9aIHZhbHVlcy4KKyAqLwordm9pZAorX21hdGhfbWF0cml4X3ZpZXdwb3J0KEdMbWF0cml4ICptLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhciwgR0xkb3VibGUgZGVwdGhNYXgpCit7CisgICBtLT5tW01BVF9TWF0gPSB3aWR0aCAvIDIuMEY7CisgICBtLT5tW01BVF9UWF0gPSBtLT5tW01BVF9TWF0gKyB4OworICAgbS0+bVtNQVRfU1ldID0gaGVpZ2h0IC8gMi4wRjsKKyAgIG0tPm1bTUFUX1RZXSA9IG0tPm1bTUFUX1NZXSArIHk7CisgICBtLT5tW01BVF9TWl0gPSAoR0xmbG9hdCkgKGRlcHRoTWF4ICogKCh6RmFyIC0gek5lYXIpIC8gMi4wKSk7CisgICBtLT5tW01BVF9UWl0gPSAoR0xmbG9hdCkgKGRlcHRoTWF4ICogKCh6RmFyIC0gek5lYXIpIC8gMi4wICsgek5lYXIpKTsKKyAgIG0tPmZsYWdzID0gTUFUX0ZMQUdfR0VORVJBTF9TQ0FMRSB8IE1BVF9GTEFHX1RSQU5TTEFUSU9OOworICAgbS0+dHlwZSA9IE1BVFJJWF8zRF9OT19ST1Q7Cit9CisKKworLyoqCisgKiBTZXQgYSBtYXRyaXggdG8gdGhlIGlkZW50aXR5IG1hdHJpeC4KKyAqCisgKiBccGFyYW0gbWF0IG1hdHJpeC4KKyAqCisgKiBDb3BpZXMgOjpJZGVudGl0eSBpbnRvIFxwIEdMbWF0cml4OjptLCBhbmQgaW50byBHTG1hdHJpeDo6aW52IGlmIG5vdCBOVUxMLgorICogU2V0cyB0aGUgbWF0cml4IHR5cGUgdG8gaWRlbnRpdHksIGFuZCBjbGVhciB0aGUgZGlydHkgZmxhZ3MuCisgKi8KK3ZvaWQKK19tYXRoX21hdHJpeF9zZXRfaWRlbnRpdHkoIEdMbWF0cml4ICptYXQgKQoreworICAgbWVtY3B5KCBtYXQtPm0sIElkZW50aXR5LCAxNipzaXplb2YoR0xmbG9hdCkgKTsKKyAgIG1lbWNweSggbWF0LT5pbnYsIElkZW50aXR5LCAxNipzaXplb2YoR0xmbG9hdCkgKTsKKworICAgbWF0LT50eXBlID0gTUFUUklYX0lERU5USVRZOworICAgbWF0LT5mbGFncyAmPSB+KE1BVF9ESVJUWV9GTEFHU3wKKwkJICAgTUFUX0RJUlRZX1RZUEV8CisJCSAgIE1BVF9ESVJUWV9JTlZFUlNFKTsKK30KKworLypAfSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgTWF0cml4IGFuYWx5c2lzICovCisvKkB7Ki8KKworI2RlZmluZSBaRVJPKHgpICgxPDx4KQorI2RlZmluZSBPTkUoeCkgICgxPDwoeCsxNikpCisKKyNkZWZpbmUgTUFTS19OT19UUlggICAgICAoWkVSTygxMikgfCBaRVJPKDEzKSB8IFpFUk8oMTQpKQorI2RlZmluZSBNQVNLX05PXzJEX1NDQUxFICggT05FKDApICB8IE9ORSg1KSkKKworI2RlZmluZSBNQVNLX0lERU5USVRZICAgICggT05FKDApICB8IFpFUk8oNCkgIHwgWkVSTyg4KSAgfCBaRVJPKDEyKSB8XAorCQkJICBaRVJPKDEpICB8ICBPTkUoNSkgIHwgWkVSTyg5KSAgfCBaRVJPKDEzKSB8XAorCQkJICBaRVJPKDIpICB8IFpFUk8oNikgIHwgIE9ORSgxMCkgfCBaRVJPKDE0KSB8XAorCQkJICBaRVJPKDMpICB8IFpFUk8oNykgIHwgWkVSTygxMSkgfCAgT05FKDE1KSApCisKKyNkZWZpbmUgTUFTS18yRF9OT19ST1QgICAoICAgICAgICAgICBaRVJPKDQpICB8IFpFUk8oOCkgIHwgICAgICAgICAgIFwKKwkJCSAgWkVSTygxKSAgfCAgICAgICAgICAgIFpFUk8oOSkgIHwgICAgICAgICAgIFwKKwkJCSAgWkVSTygyKSAgfCBaRVJPKDYpICB8ICBPTkUoMTApIHwgWkVSTygxNCkgfFwKKwkJCSAgWkVSTygzKSAgfCBaRVJPKDcpICB8IFpFUk8oMTEpIHwgIE9ORSgxNSkgKQorCisjZGVmaW5lIE1BU0tfMkQgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICBaRVJPKDgpICB8ICAgICAgICAgICBcCisJCQkgICAgICAgICAgICAgICAgICAgICAgICBaRVJPKDkpICB8ICAgICAgICAgICBcCisJCQkgIFpFUk8oMikgIHwgWkVSTyg2KSAgfCAgT05FKDEwKSB8IFpFUk8oMTQpIHxcCisJCQkgIFpFUk8oMykgIHwgWkVSTyg3KSAgfCBaRVJPKDExKSB8ICBPTkUoMTUpICkKKworCisjZGVmaW5lIE1BU0tfM0RfTk9fUk9UICAgKCAgICAgICAgICAgWkVSTyg0KSAgfCBaRVJPKDgpICB8ICAgICAgICAgICBcCisJCQkgIFpFUk8oMSkgIHwgICAgICAgICAgICBaRVJPKDkpICB8ICAgICAgICAgICBcCisJCQkgIFpFUk8oMikgIHwgWkVSTyg2KSAgfCAgICAgICAgICAgICAgICAgICAgICBcCisJCQkgIFpFUk8oMykgIHwgWkVSTyg3KSAgfCBaRVJPKDExKSB8ICBPTkUoMTUpICkKKworI2RlZmluZSBNQVNLXzNEICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJICBaRVJPKDMpICB8IFpFUk8oNykgIHwgWkVSTygxMSkgfCAgT05FKDE1KSApCisKKworI2RlZmluZSBNQVNLX1BFUlNQRUNUSVZFICggICAgICAgICAgIFpFUk8oNCkgIHwgICAgICAgICAgICBaRVJPKDEyKSB8XAorCQkJICBaRVJPKDEpICB8ICAgICAgICAgICAgICAgICAgICAgICBaRVJPKDEzKSB8XAorCQkJICBaRVJPKDIpICB8IFpFUk8oNikgIHwgICAgICAgICAgICAgICAgICAgICAgXAorCQkJICBaRVJPKDMpICB8IFpFUk8oNykgIHwgICAgICAgICAgICBaRVJPKDE1KSApCisKKyNkZWZpbmUgU1EoeCkgKCh4KSooeCkpCisKKy8qKgorICogRGV0ZXJtaW5lIHR5cGUgYW5kIGZsYWdzIGZyb20gc2NyYXRjaC4gIAorICoKKyAqIFxwYXJhbSBtYXQgbWF0cml4LgorICogCisgKiBUaGlzIGlzIGV4cGVuc2l2ZSBlbm91Z2ggdG8gb25seSB3YW50IHRvIGRvIGl0IG9uY2UuCisgKi8KK3N0YXRpYyB2b2lkIGFuYWx5c2VfZnJvbV9zY3JhdGNoKCBHTG1hdHJpeCAqbWF0ICkKK3sKKyAgIGNvbnN0IEdMZmxvYXQgKm0gPSBtYXQtPm07CisgICBHTHVpbnQgbWFzayA9IDA7CisgICBHTHVpbnQgaTsKKworICAgZm9yIChpID0gMCA7IGkgPCAxNiA7IGkrKykgeworICAgICAgaWYgKG1baV0gPT0gMC4wKSBtYXNrIHw9ICgxPDxpKTsKKyAgIH0KKworICAgaWYgKG1bMF0gPT0gMS4wRikgbWFzayB8PSAoMTw8MTYpOworICAgaWYgKG1bNV0gPT0gMS4wRikgbWFzayB8PSAoMTw8MjEpOworICAgaWYgKG1bMTBdID09IDEuMEYpIG1hc2sgfD0gKDE8PDI2KTsKKyAgIGlmIChtWzE1XSA9PSAxLjBGKSBtYXNrIHw9ICgxPDwzMSk7CisKKyAgIG1hdC0+ZmxhZ3MgJj0gfk1BVF9GTEFHU19HRU9NRVRSWTsKKworICAgLyogQ2hlY2sgZm9yIHRyYW5zbGF0aW9uIC0gbm8tb25lIHJlYWxseSBjYXJlcworICAgICovCisgICBpZiAoKG1hc2sgJiBNQVNLX05PX1RSWCkgIT0gTUFTS19OT19UUlgpCisgICAgICBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX1RSQU5TTEFUSU9OOworCisgICAvKiBEbyB0aGUgcmVhbCB3b3JrCisgICAgKi8KKyAgIGlmIChtYXNrID09IChHTHVpbnQpIE1BU0tfSURFTlRJVFkpIHsKKyAgICAgIG1hdC0+dHlwZSA9IE1BVFJJWF9JREVOVElUWTsKKyAgIH0KKyAgIGVsc2UgaWYgKChtYXNrICYgTUFTS18yRF9OT19ST1QpID09IChHTHVpbnQpIE1BU0tfMkRfTk9fUk9UKSB7CisgICAgICBtYXQtPnR5cGUgPSBNQVRSSVhfMkRfTk9fUk9UOworCisgICAgICBpZiAoKG1hc2sgJiBNQVNLX05PXzJEX1NDQUxFKSAhPSBNQVNLX05PXzJEX1NDQUxFKQorCSBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX0dFTkVSQUxfU0NBTEU7CisgICB9CisgICBlbHNlIGlmICgobWFzayAmIE1BU0tfMkQpID09IChHTHVpbnQpIE1BU0tfMkQpIHsKKyAgICAgIEdMZmxvYXQgbW0gPSBET1QyKG0sIG0pOworICAgICAgR0xmbG9hdCBtNG00ID0gRE9UMihtKzQsbSs0KTsKKyAgICAgIEdMZmxvYXQgbW00ID0gRE9UMihtLG0rNCk7CisKKyAgICAgIG1hdC0+dHlwZSA9IE1BVFJJWF8yRDsKKworICAgICAgLyogQ2hlY2sgZm9yIHNjYWxlICovCisgICAgICBpZiAoU1EobW0tMSkgPiBTUSgxZS02KSB8fAorCSAgU1EobTRtNC0xKSA+IFNRKDFlLTYpKQorCSBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX0dFTkVSQUxfU0NBTEU7CisKKyAgICAgIC8qIENoZWNrIGZvciByb3RhdGlvbiAqLworICAgICAgaWYgKFNRKG1tNCkgPiBTUSgxZS02KSkKKwkgbWF0LT5mbGFncyB8PSBNQVRfRkxBR19HRU5FUkFMXzNEOworICAgICAgZWxzZQorCSBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX1JPVEFUSU9OOworCisgICB9CisgICBlbHNlIGlmICgobWFzayAmIE1BU0tfM0RfTk9fUk9UKSA9PSAoR0x1aW50KSBNQVNLXzNEX05PX1JPVCkgeworICAgICAgbWF0LT50eXBlID0gTUFUUklYXzNEX05PX1JPVDsKKworICAgICAgLyogQ2hlY2sgZm9yIHNjYWxlICovCisgICAgICBpZiAoU1EobVswXS1tWzVdKSA8IFNRKDFlLTYpICYmCisJICBTUShtWzBdLW1bMTBdKSA8IFNRKDFlLTYpKSB7CisJIGlmIChTUShtWzBdLTEuMCkgPiBTUSgxZS02KSkgeworCSAgICBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX1VOSUZPUk1fU0NBTEU7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgbWF0LT5mbGFncyB8PSBNQVRfRkxBR19HRU5FUkFMX1NDQUxFOworICAgICAgfQorICAgfQorICAgZWxzZSBpZiAoKG1hc2sgJiBNQVNLXzNEKSA9PSAoR0x1aW50KSBNQVNLXzNEKSB7CisgICAgICBHTGZsb2F0IGMxID0gRE9UMyhtLG0pOworICAgICAgR0xmbG9hdCBjMiA9IERPVDMobSs0LG0rNCk7CisgICAgICBHTGZsb2F0IGMzID0gRE9UMyhtKzgsbSs4KTsKKyAgICAgIEdMZmxvYXQgZDEgPSBET1QzKG0sIG0rNCk7CisgICAgICBHTGZsb2F0IGNwWzNdOworCisgICAgICBtYXQtPnR5cGUgPSBNQVRSSVhfM0Q7CisKKyAgICAgIC8qIENoZWNrIGZvciBzY2FsZSAqLworICAgICAgaWYgKFNRKGMxLWMyKSA8IFNRKDFlLTYpICYmIFNRKGMxLWMzKSA8IFNRKDFlLTYpKSB7CisJIGlmIChTUShjMS0xLjApID4gU1EoMWUtNikpCisJICAgIG1hdC0+ZmxhZ3MgfD0gTUFUX0ZMQUdfVU5JRk9STV9TQ0FMRTsKKwkgLyogZWxzZSBubyBzY2FsZSBhdCBhbGwgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCSBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX0dFTkVSQUxfU0NBTEU7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGZvciByb3RhdGlvbiAqLworICAgICAgaWYgKFNRKGQxKSA8IFNRKDFlLTYpKSB7CisJIENST1NTMyggY3AsIG0sIG0rNCApOworCSBTVUJfM1YoIGNwLCBjcCwgKG0rOCkgKTsKKwkgaWYgKExFTl9TUVVBUkVEXzNGVihjcCkgPCBTUSgxZS02KSkKKwkgICAgbWF0LT5mbGFncyB8PSBNQVRfRkxBR19ST1RBVElPTjsKKwkgZWxzZQorCSAgICBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX0dFTkVSQUxfM0Q7CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgbWF0LT5mbGFncyB8PSBNQVRfRkxBR19HRU5FUkFMXzNEOyAvKiBzaGVhciwgZXRjICovCisgICAgICB9CisgICB9CisgICBlbHNlIGlmICgobWFzayAmIE1BU0tfUEVSU1BFQ1RJVkUpID09IE1BU0tfUEVSU1BFQ1RJVkUgJiYgbVsxMV09PS0xLjBGKSB7CisgICAgICBtYXQtPnR5cGUgPSBNQVRSSVhfUEVSU1BFQ1RJVkU7CisgICAgICBtYXQtPmZsYWdzIHw9IE1BVF9GTEFHX0dFTkVSQUw7CisgICB9CisgICBlbHNlIHsKKyAgICAgIG1hdC0+dHlwZSA9IE1BVFJJWF9HRU5FUkFMOworICAgICAgbWF0LT5mbGFncyB8PSBNQVRfRkxBR19HRU5FUkFMOworICAgfQorfQorCisvKioKKyAqIEFuYWx5emUgYSBtYXRyaXggZ2l2ZW4gdGhhdCBpdHMgZmxhZ3MgYXJlIGFjY3VyYXRlLgorICogCisgKiBUaGlzIGlzIHRoZSBtb3JlIGNvbW1vbiBvcGVyYXRpb24sIGhvcGVmdWxseS4KKyAqLworc3RhdGljIHZvaWQgYW5hbHlzZV9mcm9tX2ZsYWdzKCBHTG1hdHJpeCAqbWF0ICkKK3sKKyAgIGNvbnN0IEdMZmxvYXQgKm0gPSBtYXQtPm07CisKKyAgIGlmIChURVNUX01BVF9GTEFHUyhtYXQsIDApKSB7CisgICAgICBtYXQtPnR5cGUgPSBNQVRSSVhfSURFTlRJVFk7CisgICB9CisgICBlbHNlIGlmIChURVNUX01BVF9GTEFHUyhtYXQsIChNQVRfRkxBR19UUkFOU0xBVElPTiB8CisJCQkJIE1BVF9GTEFHX1VOSUZPUk1fU0NBTEUgfAorCQkJCSBNQVRfRkxBR19HRU5FUkFMX1NDQUxFKSkpIHsKKyAgICAgIGlmICggbVsxMF09PTEuMEYgJiYgbVsxNF09PTAuMEYgKSB7CisJIG1hdC0+dHlwZSA9IE1BVFJJWF8yRF9OT19ST1Q7CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgbWF0LT50eXBlID0gTUFUUklYXzNEX05PX1JPVDsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgaWYgKFRFU1RfTUFUX0ZMQUdTKG1hdCwgTUFUX0ZMQUdTXzNEKSkgeworICAgICAgaWYgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1bIDhdPT0wLjBGCisgICAgICAgICAgICAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVsgOV09PTAuMEYKKyAgICAgICAgICAgICYmIG1bMl09PTAuMEYgJiYgbVs2XT09MC4wRiAmJiBtWzEwXT09MS4wRiAmJiBtWzE0XT09MC4wRikgeworCSBtYXQtPnR5cGUgPSBNQVRSSVhfMkQ7CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgbWF0LT50eXBlID0gTUFUUklYXzNEOworICAgICAgfQorICAgfQorICAgZWxzZSBpZiAoICAgICAgICAgICAgICAgICBtWzRdPT0wLjBGICAgICAgICAgICAgICAgICAmJiBtWzEyXT09MC4wRgorICAgICAgICAgICAgJiYgbVsxXT09MC4wRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtWzEzXT09MC4wRgorICAgICAgICAgICAgJiYgbVsyXT09MC4wRiAmJiBtWzZdPT0wLjBGCisgICAgICAgICAgICAmJiBtWzNdPT0wLjBGICYmIG1bN109PTAuMEYgJiYgbVsxMV09PS0xLjBGICYmIG1bMTVdPT0wLjBGKSB7CisgICAgICBtYXQtPnR5cGUgPSBNQVRSSVhfUEVSU1BFQ1RJVkU7CisgICB9CisgICBlbHNlIHsKKyAgICAgIG1hdC0+dHlwZSA9IE1BVFJJWF9HRU5FUkFMOworICAgfQorfQorCisvKioKKyAqIEFuYWx5emUgYW5kIHVwZGF0ZSBhIG1hdHJpeC4KKyAqCisgKiBccGFyYW0gbWF0IG1hdHJpeC4KKyAqCisgKiBJZiB0aGUgbWF0cml4IHR5cGUgaXMgZGlydHkgdGhlbiBjYWxscyBlaXRoZXIgYW5hbHlzZV9mcm9tX3NjcmF0Y2goKSBvcgorICogYW5hbHlzZV9mcm9tX2ZsYWdzKCkgdG8gZGV0ZXJtaW5lIGl0cyB0eXBlLCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgZmxhZ3MKKyAqIGFyZSBkaXJ0eSBvciBub3QsIHJlc3BlY3RpdmVseS4gSWYgdGhlIG1hdHJpeCBoYXMgYW4gaW52ZXJzZSBhbmQgaXQncyBkaXJ0eQorICogdGhlbiBjYWxscyBtYXRyaXhfaW52ZXJ0KCkuIEZpbmFsbHkgY2xlYXJzIHRoZSBkaXJ0eSBmbGFncy4KKyAqLwordm9pZAorX21hdGhfbWF0cml4X2FuYWx5c2UoIEdMbWF0cml4ICptYXQgKQoreworICAgaWYgKG1hdC0+ZmxhZ3MgJiBNQVRfRElSVFlfVFlQRSkgeworICAgICAgaWYgKG1hdC0+ZmxhZ3MgJiBNQVRfRElSVFlfRkxBR1MpCisJIGFuYWx5c2VfZnJvbV9zY3JhdGNoKCBtYXQgKTsKKyAgICAgIGVsc2UKKwkgYW5hbHlzZV9mcm9tX2ZsYWdzKCBtYXQgKTsKKyAgIH0KKworICAgaWYgKG1hdC0+aW52ICYmIChtYXQtPmZsYWdzICYgTUFUX0RJUlRZX0lOVkVSU0UpKSB7CisgICAgICBtYXRyaXhfaW52ZXJ0KCBtYXQgKTsKKyAgICAgIG1hdC0+ZmxhZ3MgJj0gfk1BVF9ESVJUWV9JTlZFUlNFOworICAgfQorCisgICBtYXQtPmZsYWdzICY9IH4oTUFUX0RJUlRZX0ZMQUdTIHwgTUFUX0RJUlRZX1RZUEUpOworfQorCisvKkB9Ki8KKworCisvKioKKyAqIFRlc3QgaWYgdGhlIGdpdmVuIG1hdHJpeCBwcmVzZXJ2ZXMgdmVjdG9yIGxlbmd0aHMuCisgKi8KK0dMYm9vbGVhbgorX21hdGhfbWF0cml4X2lzX2xlbmd0aF9wcmVzZXJ2aW5nKCBjb25zdCBHTG1hdHJpeCAqbSApCit7CisgICByZXR1cm4gVEVTVF9NQVRfRkxBR1MoIG0sIE1BVF9GTEFHU19MRU5HVEhfUFJFU0VSVklORyk7Cit9CisKKworLyoqCisgKiBUZXN0IGlmIHRoZSBnaXZlbiBtYXRyaXggZG9lcyBhbnkgcm90YXRpb24uCisgKiAob3IgcGVyaGFwcyBpZiB0aGUgdXBwZXItbGVmdCAzeDMgaXMgbm9uLWlkZW50aXR5KQorICovCitHTGJvb2xlYW4KK19tYXRoX21hdHJpeF9oYXNfcm90YXRpb24oIGNvbnN0IEdMbWF0cml4ICptICkKK3sKKyAgIGlmIChtLT5mbGFncyAmIChNQVRfRkxBR19HRU5FUkFMIHwKKyAgICAgICAgICAgICAgICAgICBNQVRfRkxBR19ST1RBVElPTiB8CisgICAgICAgICAgICAgICAgICAgTUFUX0ZMQUdfR0VORVJBTF8zRCB8CisgICAgICAgICAgICAgICAgICAgTUFUX0ZMQUdfUEVSU1BFQ1RJVkUpKQorICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICBlbHNlCisgICAgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKKworR0xib29sZWFuCitfbWF0aF9tYXRyaXhfaXNfZ2VuZXJhbF9zY2FsZSggY29uc3QgR0xtYXRyaXggKm0gKQoreworICAgcmV0dXJuIChtLT5mbGFncyAmIE1BVF9GTEFHX0dFTkVSQUxfU0NBTEUpID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCisKK0dMYm9vbGVhbgorX21hdGhfbWF0cml4X2lzX2RpcnR5KCBjb25zdCBHTG1hdHJpeCAqbSApCit7CisgICByZXR1cm4gKG0tPmZsYWdzICYgTUFUX0RJUlRZKSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBcbmFtZSBNYXRyaXggc2V0dXAgKi8KKy8qQHsqLworCisvKioKKyAqIENvcHkgYSBtYXRyaXguCisgKgorICogXHBhcmFtIHRvIGRlc3RpbmF0aW9uIG1hdHJpeC4KKyAqIFxwYXJhbSBmcm9tIHNvdXJjZSBtYXRyaXguCisgKgorICogQ29waWVzIGFsbCBmaWVsZHMgaW4gR0xtYXRyaXgsIGNyZWF0aW5nIGFuIGludmVyc2UgYXJyYXkgaWYgbmVjZXNzYXJ5LgorICovCit2b2lkCitfbWF0aF9tYXRyaXhfY29weSggR0xtYXRyaXggKnRvLCBjb25zdCBHTG1hdHJpeCAqZnJvbSApCit7CisgICBtZW1jcHkoIHRvLT5tLCBmcm9tLT5tLCBzaXplb2YoSWRlbnRpdHkpICk7CisgICBtZW1jcHkodG8tPmludiwgZnJvbS0+aW52LCAxNiAqIHNpemVvZihHTGZsb2F0KSk7CisgICB0by0+ZmxhZ3MgPSBmcm9tLT5mbGFnczsKKyAgIHRvLT50eXBlID0gZnJvbS0+dHlwZTsKK30KKworLyoqCisgKiBMb2FkcyBhIG1hdHJpeCBhcnJheSBpbnRvIEdMbWF0cml4LgorICogCisgKiBccGFyYW0gbSBtYXRyaXggYXJyYXkuCisgKiBccGFyYW0gbWF0IG1hdHJpeC4KKyAqCisgKiBDb3BpZXMgXHAgbSBpbnRvIEdMbWF0cml4OjptIGFuZCBtYXJrcyB0aGUgTUFUX0ZMQUdfR0VORVJBTCBhbmQgTUFUX0RJUlRZCisgKiBmbGFncy4KKyAqLwordm9pZAorX21hdGhfbWF0cml4X2xvYWRmKCBHTG1hdHJpeCAqbWF0LCBjb25zdCBHTGZsb2F0ICptICkKK3sKKyAgIG1lbWNweSggbWF0LT5tLCBtLCAxNipzaXplb2YoR0xmbG9hdCkgKTsKKyAgIG1hdC0+ZmxhZ3MgPSAoTUFUX0ZMQUdfR0VORVJBTCB8IE1BVF9ESVJUWSk7Cit9CisKKy8qKgorICogTWF0cml4IGNvbnN0cnVjdG9yLgorICoKKyAqIFxwYXJhbSBtIG1hdHJpeC4KKyAqCisgKiBJbml0aWFsaXplIHRoZSBHTG1hdHJpeCBmaWVsZHMuCisgKi8KK3ZvaWQKK19tYXRoX21hdHJpeF9jdHIoIEdMbWF0cml4ICptICkKK3sKKyAgIG0tPm0gPSBfbWVzYV9hbGlnbl9tYWxsb2MoIDE2ICogc2l6ZW9mKEdMZmxvYXQpLCAxNiApOworICAgaWYgKG0tPm0pCisgICAgICBtZW1jcHkoIG0tPm0sIElkZW50aXR5LCBzaXplb2YoSWRlbnRpdHkpICk7CisgICBtLT5pbnYgPSBfbWVzYV9hbGlnbl9tYWxsb2MoIDE2ICogc2l6ZW9mKEdMZmxvYXQpLCAxNiApOworICAgaWYgKG0tPmludikKKyAgICAgIG1lbWNweSggbS0+aW52LCBJZGVudGl0eSwgc2l6ZW9mKElkZW50aXR5KSApOworICAgbS0+dHlwZSA9IE1BVFJJWF9JREVOVElUWTsKKyAgIG0tPmZsYWdzID0gMDsKK30KKworLyoqCisgKiBNYXRyaXggZGVzdHJ1Y3Rvci4KKyAqCisgKiBccGFyYW0gbSBtYXRyaXguCisgKgorICogRnJlZXMgdGhlIGRhdGEgaW4gYSBHTG1hdHJpeC4KKyAqLwordm9pZAorX21hdGhfbWF0cml4X2R0ciggR0xtYXRyaXggKm0gKQoreworICAgX21lc2FfYWxpZ25fZnJlZSggbS0+bSApOworICAgbS0+bSA9IE5VTEw7CisKKyAgIF9tZXNhX2FsaWduX2ZyZWUoIG0tPmludiApOworICAgbS0+aW52ID0gTlVMTDsKK30KKworLypAfSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogXG5hbWUgTWF0cml4IHRyYW5zcG9zZSAqLworLypAeyovCisKKy8qKgorICogVHJhbnNwb3NlIGEgR0xmbG9hdCBtYXRyaXguCisgKgorICogXHBhcmFtIHRvIGRlc3RpbmF0aW9uIGFycmF5LgorICogXHBhcmFtIGZyb20gc291cmNlIGFycmF5LgorICovCit2b2lkCitfbWF0aF90cmFuc3Bvc2VmKCBHTGZsb2F0IHRvWzE2XSwgY29uc3QgR0xmbG9hdCBmcm9tWzE2XSApCit7CisgICB0b1swXSA9IGZyb21bMF07CisgICB0b1sxXSA9IGZyb21bNF07CisgICB0b1syXSA9IGZyb21bOF07CisgICB0b1szXSA9IGZyb21bMTJdOworICAgdG9bNF0gPSBmcm9tWzFdOworICAgdG9bNV0gPSBmcm9tWzVdOworICAgdG9bNl0gPSBmcm9tWzldOworICAgdG9bN10gPSBmcm9tWzEzXTsKKyAgIHRvWzhdID0gZnJvbVsyXTsKKyAgIHRvWzldID0gZnJvbVs2XTsKKyAgIHRvWzEwXSA9IGZyb21bMTBdOworICAgdG9bMTFdID0gZnJvbVsxNF07CisgICB0b1sxMl0gPSBmcm9tWzNdOworICAgdG9bMTNdID0gZnJvbVs3XTsKKyAgIHRvWzE0XSA9IGZyb21bMTFdOworICAgdG9bMTVdID0gZnJvbVsxNV07Cit9CisKKy8qKgorICogVHJhbnNwb3NlIGEgR0xkb3VibGUgbWF0cml4LgorICoKKyAqIFxwYXJhbSB0byBkZXN0aW5hdGlvbiBhcnJheS4KKyAqIFxwYXJhbSBmcm9tIHNvdXJjZSBhcnJheS4KKyAqLwordm9pZAorX21hdGhfdHJhbnNwb3NlZCggR0xkb3VibGUgdG9bMTZdLCBjb25zdCBHTGRvdWJsZSBmcm9tWzE2XSApCit7CisgICB0b1swXSA9IGZyb21bMF07CisgICB0b1sxXSA9IGZyb21bNF07CisgICB0b1syXSA9IGZyb21bOF07CisgICB0b1szXSA9IGZyb21bMTJdOworICAgdG9bNF0gPSBmcm9tWzFdOworICAgdG9bNV0gPSBmcm9tWzVdOworICAgdG9bNl0gPSBmcm9tWzldOworICAgdG9bN10gPSBmcm9tWzEzXTsKKyAgIHRvWzhdID0gZnJvbVsyXTsKKyAgIHRvWzldID0gZnJvbVs2XTsKKyAgIHRvWzEwXSA9IGZyb21bMTBdOworICAgdG9bMTFdID0gZnJvbVsxNF07CisgICB0b1sxMl0gPSBmcm9tWzNdOworICAgdG9bMTNdID0gZnJvbVs3XTsKKyAgIHRvWzE0XSA9IGZyb21bMTFdOworICAgdG9bMTVdID0gZnJvbVsxNV07Cit9CisKKy8qKgorICogVHJhbnNwb3NlIGEgR0xkb3VibGUgbWF0cml4IGFuZCBjb252ZXJ0IHRvIEdMZmxvYXQuCisgKgorICogXHBhcmFtIHRvIGRlc3RpbmF0aW9uIGFycmF5LgorICogXHBhcmFtIGZyb20gc291cmNlIGFycmF5LgorICovCit2b2lkCitfbWF0aF90cmFuc3Bvc2VmZCggR0xmbG9hdCB0b1sxNl0sIGNvbnN0IEdMZG91YmxlIGZyb21bMTZdICkKK3sKKyAgIHRvWzBdID0gKEdMZmxvYXQpIGZyb21bMF07CisgICB0b1sxXSA9IChHTGZsb2F0KSBmcm9tWzRdOworICAgdG9bMl0gPSAoR0xmbG9hdCkgZnJvbVs4XTsKKyAgIHRvWzNdID0gKEdMZmxvYXQpIGZyb21bMTJdOworICAgdG9bNF0gPSAoR0xmbG9hdCkgZnJvbVsxXTsKKyAgIHRvWzVdID0gKEdMZmxvYXQpIGZyb21bNV07CisgICB0b1s2XSA9IChHTGZsb2F0KSBmcm9tWzldOworICAgdG9bN10gPSAoR0xmbG9hdCkgZnJvbVsxM107CisgICB0b1s4XSA9IChHTGZsb2F0KSBmcm9tWzJdOworICAgdG9bOV0gPSAoR0xmbG9hdCkgZnJvbVs2XTsKKyAgIHRvWzEwXSA9IChHTGZsb2F0KSBmcm9tWzEwXTsKKyAgIHRvWzExXSA9IChHTGZsb2F0KSBmcm9tWzE0XTsKKyAgIHRvWzEyXSA9IChHTGZsb2F0KSBmcm9tWzNdOworICAgdG9bMTNdID0gKEdMZmxvYXQpIGZyb21bN107CisgICB0b1sxNF0gPSAoR0xmbG9hdCkgZnJvbVsxMV07CisgICB0b1sxNV0gPSAoR0xmbG9hdCkgZnJvbVsxNV07Cit9CisKKy8qQH0qLworCisKKy8qKgorICogVHJhbnNmb3JtIGEgNC1lbGVtZW50IHJvdyB2ZWN0b3IgKDF4NCBtYXRyaXgpIGJ5IGEgNHg0IG1hdHJpeC4gIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRyYW5zZm9ybWluZyBjbGlwcGluZyBwbGFuZSBlcXVhdGlvbnMgYW5kIHNwb3RsaWdodAorICogZGlyZWN0aW9ucy4KKyAqIE1hdGhlbWF0aWNhbGx5LCAgdSA9IHYgKiBtLgorICogSW5wdXQ6ICB2IC0gaW5wdXQgdmVjdG9yCisgKiAgICAgICAgIG0gLSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKKyAqIE91dHB1dDogIHUgLSB0cmFuc2Zvcm1lZCB2ZWN0b3IKKyAqLwordm9pZAorX21lc2FfdHJhbnNmb3JtX3ZlY3RvciggR0xmbG9hdCB1WzRdLCBjb25zdCBHTGZsb2F0IHZbNF0sIGNvbnN0IEdMZmxvYXQgbVsxNl0gKQoreworICAgY29uc3QgR0xmbG9hdCB2MCA9IHZbMF0sIHYxID0gdlsxXSwgdjIgPSB2WzJdLCB2MyA9IHZbM107CisjZGVmaW5lIE0ocm93LGNvbCkgIG1bcm93ICsgY29sKjRdCisgICB1WzBdID0gdjAgKiBNKDAsMCkgKyB2MSAqIE0oMSwwKSArIHYyICogTSgyLDApICsgdjMgKiBNKDMsMCk7CisgICB1WzFdID0gdjAgKiBNKDAsMSkgKyB2MSAqIE0oMSwxKSArIHYyICogTSgyLDEpICsgdjMgKiBNKDMsMSk7CisgICB1WzJdID0gdjAgKiBNKDAsMikgKyB2MSAqIE0oMSwyKSArIHYyICogTSgyLDIpICsgdjMgKiBNKDMsMik7CisgICB1WzNdID0gdjAgKiBNKDAsMykgKyB2MSAqIE0oMSwzKSArIHYyICogTSgyLDMpICsgdjMgKiBNKDMsMyk7CisjdW5kZWYgTQorfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWF0aC9tX21hdHJpeC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWF0aC9tX21hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGNlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYXRoL21fbWF0cml4LmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisvKioKKyAqIFxmaWxlIG1hdGgvbV9tYXRyaXguaAorICogRGVmaW5lcyBiYXNpYyBzdHJ1Y3R1cmVzIGZvciBtYXRyaXgtaGFuZGxpbmcuCisgKi8KKworI2lmbmRlZiBfTV9NQVRSSVhfSAorI2RlZmluZSBfTV9NQVRSSVhfSAorCisKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKgorICogXG5hbWUgU3ltYm9saWMgbmFtZXMgdG8gc29tZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgbWF0cml4CisgKgorICogVGhlc2UgYXJlIGhhbmR5IGZvciB0aGUgdmlld3BvcnQgbWFwcGluZywgd2hpY2ggaXMgZXhwcmVzc2VkIGFzIGEgbWF0cml4LgorICovCisvKkB7Ki8KKyNkZWZpbmUgTUFUX1NYIDAKKyNkZWZpbmUgTUFUX1NZIDUKKyNkZWZpbmUgTUFUX1NaIDEwCisjZGVmaW5lIE1BVF9UWCAxMgorI2RlZmluZSBNQVRfVFkgMTMKKyNkZWZpbmUgTUFUX1RaIDE0CisvKkB9Ki8KKworCisvKioKKyAqIERpZmZlcmVudCBraW5kcyBvZiA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMuCisgKiBXZSB1c2UgdGhlc2UgdG8gc2VsZWN0IHNwZWNpZmljIG9wdGltaXplZCB2ZXJ0ZXggdHJhbnNmb3JtYXRpb24gcm91dGluZXMuCisgKi8KK2VudW0gR0xtYXRyaXh0eXBlIHsKKyAgIE1BVFJJWF9HRU5FUkFMLAkvKio8IGdlbmVyYWwgNHg0IG1hdHJpeCAqLworICAgTUFUUklYX0lERU5USVRZLAkvKio8IGlkZW50aXR5IG1hdHJpeCAqLworICAgTUFUUklYXzNEX05PX1JPVCwJLyoqPCBvcnRob2dvbmFsIHByb2plY3Rpb24gYW5kIG90aGVycy4uLiAqLworICAgTUFUUklYX1BFUlNQRUNUSVZFLAkvKio8IHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4ICovCisgICBNQVRSSVhfMkQsCQkvKio8IDItRCB0cmFuc2Zvcm1hdGlvbiAqLworICAgTUFUUklYXzJEX05PX1JPVCwJLyoqPCAyLUQgc2NhbGUgJiB0cmFuc2xhdGUgb25seSAqLworICAgTUFUUklYXzNECQkvKio8IDMtRCB0cmFuc2Zvcm1hdGlvbiAqLworfSA7CisKKy8qKgorICogTWF0cml4IHR5cGUgdG8gcmVwcmVzZW50IDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgR0xmbG9hdCAqbTsJCS8qKjwgMTYgbWF0cml4IGVsZW1lbnRzICgxNi1ieXRlIGFsaWduZWQpICovCisgICBHTGZsb2F0ICppbnY7CS8qKjwgMTYtZWxlbWVudCBpbnZlcnNlICgxNi1ieXRlIGFsaWduZWQpICovCisgICBHTHVpbnQgZmxhZ3M7ICAgICAgICAvKio8IHBvc3NpYmxlIHZhbHVlcyBkZXRlcm1pbmVkIGJ5IChvZiBcbGluaworICAgICAgICAgICAgICAgICAgICAgICAgICogTWF0RmxhZ3MgTUFUX0ZMQUdfKiBmbGFnc1xlbmRsaW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICBlbnVtIEdMbWF0cml4dHlwZSB0eXBlOworfSBHTG1hdHJpeDsKKworCisKKworZXh0ZXJuIHZvaWQKK19tYXRoX21hdHJpeF9jdHIoIEdMbWF0cml4ICptICk7CisKK2V4dGVybiB2b2lkCitfbWF0aF9tYXRyaXhfZHRyKCBHTG1hdHJpeCAqbSApOworCitleHRlcm4gdm9pZAorX21hdGhfbWF0cml4X211bF9tYXRyaXgoIEdMbWF0cml4ICpkZXN0LCBjb25zdCBHTG1hdHJpeCAqYSwgY29uc3QgR0xtYXRyaXggKmIgKTsKKworZXh0ZXJuIHZvaWQKK19tYXRoX21hdHJpeF9tdWxfZmxvYXRzKCBHTG1hdHJpeCAqZGVzdCwgY29uc3QgR0xmbG9hdCAqYiApOworCitleHRlcm4gdm9pZAorX21hdGhfbWF0cml4X2xvYWRmKCBHTG1hdHJpeCAqbWF0LCBjb25zdCBHTGZsb2F0ICptICk7CisKK2V4dGVybiB2b2lkCitfbWF0aF9tYXRyaXhfdHJhbnNsYXRlKCBHTG1hdHJpeCAqbWF0LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CisKK2V4dGVybiB2b2lkCitfbWF0aF9tYXRyaXhfcm90YXRlKCBHTG1hdHJpeCAqbSwgR0xmbG9hdCBhbmdsZSwKKwkJICAgICBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CisKK2V4dGVybiB2b2lkCitfbWF0aF9tYXRyaXhfc2NhbGUoIEdMbWF0cml4ICptYXQsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKTsKKworZXh0ZXJuIHZvaWQKK19tYXRoX21hdHJpeF9vcnRobyggR0xtYXRyaXggKm1hdCwKKwkJICAgIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwKKwkJICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKwkJICAgIEdMZmxvYXQgbmVhcnZhbCwgR0xmbG9hdCBmYXJ2YWwgKTsKKworZXh0ZXJuIHZvaWQKK19tYXRoX21hdHJpeF9mcnVzdHVtKCBHTG1hdHJpeCAqbWF0LAorCQkgICAgICBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsCisJCSAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKwkJICAgICAgR0xmbG9hdCBuZWFydmFsLCBHTGZsb2F0IGZhcnZhbCApOworCitleHRlcm4gdm9pZAorX21hdGhfbWF0cml4X3ZpZXdwb3J0KEdMbWF0cml4ICptLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgR0xkb3VibGUgek5lYXIsIEdMZG91YmxlIHpGYXIsIEdMZG91YmxlIGRlcHRoTWF4KTsKKworZXh0ZXJuIHZvaWQKK19tYXRoX21hdHJpeF9zZXRfaWRlbnRpdHkoIEdMbWF0cml4ICpkZXN0ICk7CisKK2V4dGVybiB2b2lkCitfbWF0aF9tYXRyaXhfY29weSggR0xtYXRyaXggKnRvLCBjb25zdCBHTG1hdHJpeCAqZnJvbSApOworCitleHRlcm4gdm9pZAorX21hdGhfbWF0cml4X2FuYWx5c2UoIEdMbWF0cml4ICptYXQgKTsKKworZXh0ZXJuIHZvaWQKK19tYXRoX21hdHJpeF9wcmludCggY29uc3QgR0xtYXRyaXggKm0gKTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21hdGhfbWF0cml4X2lzX2xlbmd0aF9wcmVzZXJ2aW5nKCBjb25zdCBHTG1hdHJpeCAqbSApOworCitleHRlcm4gR0xib29sZWFuCitfbWF0aF9tYXRyaXhfaGFzX3JvdGF0aW9uKCBjb25zdCBHTG1hdHJpeCAqbSApOworCitleHRlcm4gR0xib29sZWFuCitfbWF0aF9tYXRyaXhfaXNfZ2VuZXJhbF9zY2FsZSggY29uc3QgR0xtYXRyaXggKm0gKTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21hdGhfbWF0cml4X2lzX2RpcnR5KCBjb25zdCBHTG1hdHJpeCAqbSApOworCisKKy8qKgorICogXG5hbWUgUmVsYXRlZCBmdW5jdGlvbnMgdGhhdCBkb24ndCBhY3R1YWxseSBvcGVyYXRlIG9uIEdMbWF0cml4IHN0cnVjdHMKKyAqLworLypAeyovCisKK2V4dGVybiB2b2lkCitfbWF0aF90cmFuc3Bvc2VmKCBHTGZsb2F0IHRvWzE2XSwgY29uc3QgR0xmbG9hdCBmcm9tWzE2XSApOworCitleHRlcm4gdm9pZAorX21hdGhfdHJhbnNwb3NlZCggR0xkb3VibGUgdG9bMTZdLCBjb25zdCBHTGRvdWJsZSBmcm9tWzE2XSApOworCitleHRlcm4gdm9pZAorX21hdGhfdHJhbnNwb3NlZmQoIEdMZmxvYXQgdG9bMTZdLCBjb25zdCBHTGRvdWJsZSBmcm9tWzE2XSApOworCisKKy8qCisgKiBUcmFuc2Zvcm0gYSBwb2ludCAoY29sdW1uIHZlY3RvcikgYnkgYSBtYXRyaXg6ICAgUSA9IE0gKiBQCisgKi8KKyNkZWZpbmUgVFJBTlNGT1JNX1BPSU5UKCBRLCBNLCBQICkJCQkJCVwKKyAgIFFbMF0gPSBNWzBdICogUFswXSArIE1bNF0gKiBQWzFdICsgTVs4XSAqICBQWzJdICsgTVsxMl0gKiBQWzNdOwlcCisgICBRWzFdID0gTVsxXSAqIFBbMF0gKyBNWzVdICogUFsxXSArIE1bOV0gKiAgUFsyXSArIE1bMTNdICogUFszXTsJXAorICAgUVsyXSA9IE1bMl0gKiBQWzBdICsgTVs2XSAqIFBbMV0gKyBNWzEwXSAqIFBbMl0gKyBNWzE0XSAqIFBbM107CVwKKyAgIFFbM10gPSBNWzNdICogUFswXSArIE1bN10gKiBQWzFdICsgTVsxMV0gKiBQWzJdICsgTVsxNV0gKiBQWzNdOworCisKKyNkZWZpbmUgVFJBTlNGT1JNX1BPSU5UMyggUSwgTSwgUCApCQkJCVwKKyAgIFFbMF0gPSBNWzBdICogUFswXSArIE1bNF0gKiBQWzFdICsgTVs4XSAqICBQWzJdICsgTVsxMl07CVwKKyAgIFFbMV0gPSBNWzFdICogUFswXSArIE1bNV0gKiBQWzFdICsgTVs5XSAqICBQWzJdICsgTVsxM107CVwKKyAgIFFbMl0gPSBNWzJdICogUFswXSArIE1bNl0gKiBQWzFdICsgTVsxMF0gKiBQWzJdICsgTVsxNF07CVwKKyAgIFFbM10gPSBNWzNdICogUFswXSArIE1bN10gKiBQWzFdICsgTVsxMV0gKiBQWzJdICsgTVsxNV07CisKKworLyoKKyAqIFRyYW5zZm9ybSBhIG5vcm1hbCAocm93IHZlY3RvcikgYnkgYSBtYXRyaXg6ICBbTlggTlkgTlpdID0gTiAqIE1BVAorICovCisjZGVmaW5lIFRSQU5TRk9STV9OT1JNQUwoIFRPLCBOLCBNQVQgKQkJCQlcCitkbyB7CQkJCQkJCQlcCisgICBUT1swXSA9IE5bMF0gKiBNQVRbMF0gKyBOWzFdICogTUFUWzFdICsgTlsyXSAqIE1BVFsyXTsJXAorICAgVE9bMV0gPSBOWzBdICogTUFUWzRdICsgTlsxXSAqIE1BVFs1XSArIE5bMl0gKiBNQVRbNl07CVwKKyAgIFRPWzJdID0gTlswXSAqIE1BVFs4XSArIE5bMV0gKiBNQVRbOV0gKyBOWzJdICogTUFUWzEwXTsJXAorfSB3aGlsZSAoMCkKKworCisvKioKKyAqIFRyYW5zZm9ybSBhIGRpcmVjdGlvbiBieSBhIG1hdHJpeC4KKyAqLworI2RlZmluZSBUUkFOU0ZPUk1fRElSRUNUSU9OKCBUTywgRElSLCBNQVQgKQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgIFRPWzBdID0gRElSWzBdICogTUFUWzBdICsgRElSWzFdICogTUFUWzRdICsgRElSWzJdICogTUFUWzhdOwlcCisgICBUT1sxXSA9IERJUlswXSAqIE1BVFsxXSArIERJUlsxXSAqIE1BVFs1XSArIERJUlsyXSAqIE1BVFs5XTsJXAorICAgVE9bMl0gPSBESVJbMF0gKiBNQVRbMl0gKyBESVJbMV0gKiBNQVRbNl0gKyBESVJbMl0gKiBNQVRbMTBdO1wKK30gd2hpbGUgKDApCisKKworZXh0ZXJuIHZvaWQKK19tZXNhX3RyYW5zZm9ybV92ZWN0b3IoR0xmbG9hdCB1WzRdLCBjb25zdCBHTGZsb2F0IHZbNF0sIGNvbnN0IEdMZmxvYXQgbVsxNl0pOworCisKKy8qQH0qLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9BbmRyb2lkLm1rIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWFmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3OSBAQAorIyBDb3B5cmlnaHQgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorIyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorIyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisjIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorIyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyMgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyMgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyMgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorIyBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworZGVmaW5lIGxvY2FsLWwtdG8tYworCUBta2RpciAtcCAkKGRpciAkQCkKKwlAZWNobyAiTWVzYSBMZXg6ICQoUFJJVkFURV9NT0RVTEUpIDw9ICQ8IgorCSQoaGlkZSkgJChMRVgpIC1vJEAgJDwKK2VuZGVmCisKK2RlZmluZSBtZXNhX2xvY2FsLXktdG8tYy1hbmQtaAorCUBta2RpciAtcCAkKGRpciAkQCkKKwlAZWNobyAiTWVzYSBZYWNjOiAkKFBSSVZBVEVfTU9EVUxFKSA8PSAkPCIKKwkkKGhpZGUpICQoWUFDQykgLW8gJEAgLXAgIl9tZXNhX3Byb2dyYW1fIiAkPAorZW5kZWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGxpYm1lc2FfcHJvZ3JhbS5hCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJbXBvcnQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CisjICAgICBQUk9HUkFNX0ZJTEVTCitpbmNsdWRlICQoTUVTQV9UT1ApL3NyYy9tZXNhL01ha2VmaWxlLnNvdXJjZXMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJtZXNhX3Byb2dyYW0KK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBTVEFUSUNfTElCUkFSSUVTCisKK2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyKQorCisjIFRPRE8oY2hhZHYpOiBJbiBNYWtlZmlsZS5zb3VyY2VzLCBtb3ZlIHRoZXNlIHZhcnMgdG8gYSBkaWZmZXJlbnQgbGlzdCBzbyB3ZSBjYW4KKyMgcmVtb3ZlIHRoaXMga2x1ZGdlLgorZ2VuZXJhdGVkX3NvdXJjZXNfYmFzZW5hbWVzIDo9IFwKKwlsZXgueXkuYyBcCisJcHJvZ3JhbV9wYXJzZS50YWIuYyBcCisJcHJvZ3JhbV9wYXJzZS50YWIuaAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCSQoZmlsdGVyLW91dCAkKGdlbmVyYXRlZF9zb3VyY2VzX2Jhc2VuYW1lcyksJChzdWJzdCBwcm9ncmFtLywsJChQUk9HUkFNX0ZJTEVTKSkpCisKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTIDo9IFwKKwkkKGFkZHByZWZpeCAkKGludGVybWVkaWF0ZXMpL3Byb2dyYW0vLCQoZ2VuZXJhdGVkX3NvdXJjZXNfYmFzZW5hbWVzKSkKKworJChpbnRlcm1lZGlhdGVzKS9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmM6ICQoTE9DQUxfUEFUSCkvcHJvZ3JhbV9wYXJzZS55CisJJChtZXNhX2xvY2FsLXktdG8tYy1hbmQtaCkKKworJChpbnRlcm1lZGlhdGVzKS9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmg6ICQoaW50ZXJtZWRpYXRlcykvcHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnRhYi5jCisJQAorCiskKGludGVybWVkaWF0ZXMpL3Byb2dyYW0vbGV4Lnl5LmM6ICQoTE9DQUxfUEFUSCkvcHJvZ3JhbV9sZXhlci5sCisJJChsb2NhbC1sLXRvLWMpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoaW50ZXJtZWRpYXRlcykgXAorCSQoTUVTQV9UT1ApL3NyYy9tYXBpIFwKKwkkKE1FU0FfVE9QKS9zcmMvbWVzYSBcCisJJChNRVNBX1RPUCkvc3JjL2dsc2wKKworaW5jbHVkZSAkKE1FU0FfQ09NTU9OX01LKQoraW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9hcmJwcm9ncGFyc2UuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vYXJicHJvZ3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NjY1MAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vYXJicHJvZ3BhcnNlLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDggIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2RlZmluZSBERUJVR19QQVJTSU5HIDAKKworLyoqCisgKiBcZmlsZSBhcmJwcm9ncGFyc2UuYworICogQVJCXypfcHJvZ3JhbSBwYXJzZXIgY29yZQorICogXGF1dGhvciBLYXJsIFJhc2NoZQorICovCisKKy8qKgorTm90ZXMgb24gcHJvZ3JhbSBwYXJhbWV0ZXJzLCBldGMuCisKK1RoZSBpbnN0cnVjdGlvbnMgd2UgZW1pdCB3aWxsIHVzZSBzaXgga2luZHMgb2Ygc291cmNlIHJlZ2lzdGVyczoKKworICBQUk9HUkFNX0lOUFVUICAgICAgLSBpbnB1dCByZWdpc3RlcnMKKyAgUFJPR1JBTV9URU1QT1JBUlkgIC0gdGVtcCByZWdpc3RlcnMKKyAgUFJPR1JBTV9BRERSRVNTICAgIC0gYWRkcmVzcy9pbmRpcmVjdCByZWdpc3RlcgorICBQUk9HUkFNX1NBTVBMRVIgICAgLSB0ZXh0dXJlIHNhbXBsZXIKKyAgUFJPR1JBTV9DT05TVEFOVCAgIC0gaW5kZXhlcyBpbnRvIHByb2dyYW0tPlBhcmFtZXRlcnMsIGEga25vd24gY29uc3RhbnQvbGl0ZXJhbAorICBQUk9HUkFNX1NUQVRFX1ZBUiAgLSBpbmRleGVzIGludG8gcHJvZ3JhbS0+UGFyYW1ldGVycywgYW5kIG1heSBhY3R1YWxseSBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgKyBhIHN0YXRlIHZhcmlhYmxlLCBsaWtlICJzdGF0ZS5mb2cuY29sb3IiLCBvcgorICAgICAgICAgICAgICAgICAgICAgICArIGEgcG9pbnRlciB0byBhICJwcm9ncmFtLmxvY2FsW2tdIiBwYXJhbWV0ZXIsIG9yCisgICAgICAgICAgICAgICAgICAgICAgICsgYSBwb2ludGVyIHRvIGEgInByb2dyYW0uZW52W2tdIiBwYXJhbWV0ZXIKKworQmFzaWNhbGx5LCBhbGwgdGhlIHByb2dyYW0ubG9jYWxbXSBhbmQgcHJvZ3JhbS5lbnZbXSB2YWx1ZXMgd2lsbCBnZXQgbWFwcGVkCitpbnRvIHRoZSB1bmlmaWVkIGdsX3Byb2dyYW0tPlBhcmFtZXRlcnMgYXJyYXkuICBUaGlzIHNvbHZlcyB0aGUgcHJvYmxlbSBvZgoraGF2aW5nIHRocmVlIHNlcGFyYXRlIHByb2dyYW0gcGFyYW1ldGVyIGFycmF5cy4KKyovCisKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL2NvbnRleHQuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgImFyYnByb2dwYXJzZS5oIgorI2luY2x1ZGUgInByb2dyYW1vcHQuaCIKKyNpbmNsdWRlICJwcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgInByb2dfc3RhdGV2YXJzLmgiCisjaW5jbHVkZSAicHJvZ19pbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgInByb2dyYW1fcGFyc2VyLmgiCisKKwordm9pZAorX21lc2FfcGFyc2VfYXJiX2ZyYWdtZW50X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQqIGN0eCwgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqc3RyLCBHTHNpemVpIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpwcm9ncmFtKQoreworICAgc3RydWN0IGdsX3Byb2dyYW0gcHJvZzsKKyAgIHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlIHN0YXRlOworICAgR0x1aW50IGk7CisKKyAgIEFTU0VSVCh0YXJnZXQgPT0gR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIpOworCisgICBtZW1zZXQoJnByb2csIDAsIHNpemVvZihwcm9nKSk7CisgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKyAgIHN0YXRlLnByb2cgPSAmcHJvZzsKKworICAgaWYgKCFfbWVzYV9wYXJzZV9hcmJfcHJvZ3JhbShjdHgsIHRhcmdldCwgKGNvbnN0IEdMdWJ5dGUqKSBzdHIsIGxlbiwKKwkJCQkmc3RhdGUpKSB7CisgICAgICAvKiBFcnJvciBpbiB0aGUgcHJvZ3JhbS4gSnVzdCByZXR1cm4uICovCisgICAgICByZXR1cm47CisgICB9CisKKyAgIGZyZWUocHJvZ3JhbS0+QmFzZS5TdHJpbmcpOworCisgICAvKiBDb3B5IHRoZSByZWxldmFudCBjb250ZW50cyBvZiB0aGUgYXJiX3Byb2dyYW0gc3RydWN0IGludG8gdGhlCisgICAgKiBmcmFnbWVudF9wcm9ncmFtIHN0cnVjdC4KKyAgICAqLworICAgcHJvZ3JhbS0+QmFzZS5TdHJpbmcgICAgICAgICAgPSBwcm9nLlN0cmluZzsKKyAgIHByb2dyYW0tPkJhc2UuTnVtSW5zdHJ1Y3Rpb25zID0gcHJvZy5OdW1JbnN0cnVjdGlvbnM7CisgICBwcm9ncmFtLT5CYXNlLk51bVRlbXBvcmFyaWVzICA9IHByb2cuTnVtVGVtcG9yYXJpZXM7CisgICBwcm9ncmFtLT5CYXNlLk51bVBhcmFtZXRlcnMgICA9IHByb2cuTnVtUGFyYW1ldGVyczsKKyAgIHByb2dyYW0tPkJhc2UuTnVtQXR0cmlidXRlcyAgID0gcHJvZy5OdW1BdHRyaWJ1dGVzOworICAgcHJvZ3JhbS0+QmFzZS5OdW1BZGRyZXNzUmVncyAgPSBwcm9nLk51bUFkZHJlc3NSZWdzOworICAgcHJvZ3JhbS0+QmFzZS5OdW1OYXRpdmVJbnN0cnVjdGlvbnMgPSBwcm9nLk51bU5hdGl2ZUluc3RydWN0aW9uczsKKyAgIHByb2dyYW0tPkJhc2UuTnVtTmF0aXZlVGVtcG9yYXJpZXMgPSBwcm9nLk51bU5hdGl2ZVRlbXBvcmFyaWVzOworICAgcHJvZ3JhbS0+QmFzZS5OdW1OYXRpdmVQYXJhbWV0ZXJzID0gcHJvZy5OdW1OYXRpdmVQYXJhbWV0ZXJzOworICAgcHJvZ3JhbS0+QmFzZS5OdW1OYXRpdmVBdHRyaWJ1dGVzID0gcHJvZy5OdW1OYXRpdmVBdHRyaWJ1dGVzOworICAgcHJvZ3JhbS0+QmFzZS5OdW1OYXRpdmVBZGRyZXNzUmVncyA9IHByb2cuTnVtTmF0aXZlQWRkcmVzc1JlZ3M7CisgICBwcm9ncmFtLT5CYXNlLk51bUFsdUluc3RydWN0aW9ucyAgID0gcHJvZy5OdW1BbHVJbnN0cnVjdGlvbnM7CisgICBwcm9ncmFtLT5CYXNlLk51bVRleEluc3RydWN0aW9ucyAgID0gcHJvZy5OdW1UZXhJbnN0cnVjdGlvbnM7CisgICBwcm9ncmFtLT5CYXNlLk51bVRleEluZGlyZWN0aW9ucyAgID0gcHJvZy5OdW1UZXhJbmRpcmVjdGlvbnM7CisgICBwcm9ncmFtLT5CYXNlLk51bU5hdGl2ZUFsdUluc3RydWN0aW9ucyA9IHByb2cuTnVtQWx1SW5zdHJ1Y3Rpb25zOworICAgcHJvZ3JhbS0+QmFzZS5OdW1OYXRpdmVUZXhJbnN0cnVjdGlvbnMgPSBwcm9nLk51bVRleEluc3RydWN0aW9uczsKKyAgIHByb2dyYW0tPkJhc2UuTnVtTmF0aXZlVGV4SW5kaXJlY3Rpb25zID0gcHJvZy5OdW1UZXhJbmRpcmVjdGlvbnM7CisgICBwcm9ncmFtLT5CYXNlLklucHV0c1JlYWQgICAgICA9IHByb2cuSW5wdXRzUmVhZDsKKyAgIHByb2dyYW0tPkJhc2UuT3V0cHV0c1dyaXR0ZW4gID0gcHJvZy5PdXRwdXRzV3JpdHRlbjsKKyAgIHByb2dyYW0tPkJhc2UuSW5kaXJlY3RSZWdpc3RlckZpbGVzID0gcHJvZy5JbmRpcmVjdFJlZ2lzdGVyRmlsZXM7CisgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM7IGkrKykgeworICAgICAgcHJvZ3JhbS0+QmFzZS5UZXh0dXJlc1VzZWRbaV0gPSBwcm9nLlRleHR1cmVzVXNlZFtpXTsKKyAgICAgIGlmIChwcm9nLlRleHR1cmVzVXNlZFtpXSkKKyAgICAgICAgIHByb2dyYW0tPkJhc2UuU2FtcGxlcnNVc2VkIHw9ICgxIDw8IGkpOworICAgfQorICAgcHJvZ3JhbS0+QmFzZS5TaGFkb3dTYW1wbGVycyA9IHByb2cuU2hhZG93U2FtcGxlcnM7CisgICBwcm9ncmFtLT5PcmlnaW5VcHBlckxlZnQgPSBzdGF0ZS5vcHRpb24uT3JpZ2luVXBwZXJMZWZ0OworICAgcHJvZ3JhbS0+UGl4ZWxDZW50ZXJJbnRlZ2VyID0gc3RhdGUub3B0aW9uLlBpeGVsQ2VudGVySW50ZWdlcjsKKworICAgcHJvZ3JhbS0+VXNlc0tpbGwgICAgICAgICAgICA9IHN0YXRlLmZyYWdtZW50LlVzZXNLaWxsOworICAgcHJvZ3JhbS0+VXNlc0RGZHkgICAgICAgICAgICA9IHN0YXRlLmZyYWdtZW50LlVzZXNERmR5OworCisgICBmcmVlKHByb2dyYW0tPkJhc2UuSW5zdHJ1Y3Rpb25zKTsKKyAgIHByb2dyYW0tPkJhc2UuSW5zdHJ1Y3Rpb25zID0gcHJvZy5JbnN0cnVjdGlvbnM7CisKKyAgIGlmIChwcm9ncmFtLT5CYXNlLlBhcmFtZXRlcnMpCisgICAgICBfbWVzYV9mcmVlX3BhcmFtZXRlcl9saXN0KHByb2dyYW0tPkJhc2UuUGFyYW1ldGVycyk7CisgICBwcm9ncmFtLT5CYXNlLlBhcmFtZXRlcnMgICAgPSBwcm9nLlBhcmFtZXRlcnM7CisKKyAgIC8qIEFwcGVuZCBmb2cgaW5zdHJ1Y3Rpb25zIG5vdyBpZiB0aGUgcHJvZ3JhbSBoYXMgIk9QVElPTiBBUkJfZm9nX2V4cCIKKyAgICAqIG9yIHNpbWlsYXIuICBXZSB1c2VkIHRvIGxlYXZlIHRoaXMgdXAgdG8gZHJpdmVycywgYnV0IGl0IGFwcGVhcnMKKyAgICAqIHRoZXJlJ3Mgbm8gaGFyZHdhcmUgdGhhdCB3YW50cyB0byBkbyBmb2cgaW4gYSBkaXNjcmV0ZSBzdGFnZSBzZXBhcmF0ZQorICAgICogZnJvbSB0aGUgZnJhZ21lbnQgc2hhZGVyLgorICAgICovCisgICBpZiAoc3RhdGUub3B0aW9uLkZvZyAhPSBPUFRJT05fTk9ORSkgeworICAgICAgc3RhdGljIGNvbnN0IEdMZW51bSBmb2dfbW9kZXNbNF0gPSB7CisJIEdMX05PTkUsIEdMX0VYUCwgR0xfRVhQMiwgR0xfTElORUFSCisgICAgICB9OworCisgICAgICAvKiBYWFg6IHdlIHNob3VsZCBzb21laG93IHJlY29tcGlsZSB0aGlzIHRvIHJlbW92ZSBjbGFtcGluZyBpZiBkaXNhYmxlZAorICAgICAgICogT24gdGhlIEFUSSBkcml2ZXIsIHRoaXMgaXMgdW5jbGFtcGxlZCBpZiBmcmFnbWVudCBjbGFtcGluZyBpcyBkaXNhYmxlZAorICAgICAgICovCisgICAgICBfbWVzYV9hcHBlbmRfZm9nX2NvZGUoY3R4LCBwcm9ncmFtLCBmb2dfbW9kZXNbc3RhdGUub3B0aW9uLkZvZ10sIEdMX1RSVUUpOworICAgfQorCisjaWYgREVCVUdfRlAKKyAgIHByaW50ZigiX19fX19fX19fX19fRnJhZ21lbnQgcHJvZ3JhbSAldSBfX19fX19fX1xuIiwgcHJvZ3JhbS0+QmFzZS5JZCk7CisgICBfbWVzYV9wcmludF9wcm9ncmFtKCZwcm9ncmFtLT5CYXNlKTsKKyNlbmRpZgorfQorCisKKworLyoqCisgKiBQYXJzZSB0aGUgdmVydGV4IHByb2dyYW0gc3RyaW5nLiAgSWYgc3VjY2VzcywgdXBkYXRlIHRoZSBnaXZlbgorICogdmVydGV4X3Byb2dyYW0gb2JqZWN0IHdpdGggdGhlIG5ldyBwcm9ncmFtLiAgRWxzZSwgbGVhdmUgdGhlIHZlcnRleF9wcm9ncmFtCisgKiBvYmplY3QgdW5jaGFuZ2VkLgorICovCit2b2lkCitfbWVzYV9wYXJzZV9hcmJfdmVydGV4X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKwkJCSAgICAgICBjb25zdCBHTHZvaWQgKnN0ciwgR0xzaXplaSBsZW4sCisJCQkgICAgICAgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwcm9ncmFtKQoreworICAgc3RydWN0IGdsX3Byb2dyYW0gcHJvZzsKKyAgIHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlIHN0YXRlOworCisgICBBU1NFUlQodGFyZ2V0ID09IEdMX1ZFUlRFWF9QUk9HUkFNX0FSQik7CisKKyAgIG1lbXNldCgmcHJvZywgMCwgc2l6ZW9mKHByb2cpKTsKKyAgIG1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdGF0ZSkpOworICAgc3RhdGUucHJvZyA9ICZwcm9nOworCisgICBpZiAoIV9tZXNhX3BhcnNlX2FyYl9wcm9ncmFtKGN0eCwgdGFyZ2V0LCAoY29uc3QgR0x1Ynl0ZSopIHN0ciwgbGVuLAorCQkJCSZzdGF0ZSkpIHsKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sICJnbFByb2dyYW1TdHJpbmcoYmFkIHByb2dyYW0pIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGZyZWUocHJvZ3JhbS0+QmFzZS5TdHJpbmcpOworCisgICAvKiBDb3B5IHRoZSByZWxldmFudCBjb250ZW50cyBvZiB0aGUgYXJiX3Byb2dyYW0gc3RydWN0IGludG8gdGhlIAorICAgICogdmVydGV4X3Byb2dyYW0gc3RydWN0LgorICAgICovCisgICBwcm9ncmFtLT5CYXNlLlN0cmluZyAgICAgICAgICA9IHByb2cuU3RyaW5nOworICAgcHJvZ3JhbS0+QmFzZS5OdW1JbnN0cnVjdGlvbnMgPSBwcm9nLk51bUluc3RydWN0aW9uczsKKyAgIHByb2dyYW0tPkJhc2UuTnVtVGVtcG9yYXJpZXMgID0gcHJvZy5OdW1UZW1wb3JhcmllczsKKyAgIHByb2dyYW0tPkJhc2UuTnVtUGFyYW1ldGVycyAgID0gcHJvZy5OdW1QYXJhbWV0ZXJzOworICAgcHJvZ3JhbS0+QmFzZS5OdW1BdHRyaWJ1dGVzICAgPSBwcm9nLk51bUF0dHJpYnV0ZXM7CisgICBwcm9ncmFtLT5CYXNlLk51bUFkZHJlc3NSZWdzICA9IHByb2cuTnVtQWRkcmVzc1JlZ3M7CisgICBwcm9ncmFtLT5CYXNlLk51bU5hdGl2ZUluc3RydWN0aW9ucyA9IHByb2cuTnVtTmF0aXZlSW5zdHJ1Y3Rpb25zOworICAgcHJvZ3JhbS0+QmFzZS5OdW1OYXRpdmVUZW1wb3JhcmllcyA9IHByb2cuTnVtTmF0aXZlVGVtcG9yYXJpZXM7CisgICBwcm9ncmFtLT5CYXNlLk51bU5hdGl2ZVBhcmFtZXRlcnMgPSBwcm9nLk51bU5hdGl2ZVBhcmFtZXRlcnM7CisgICBwcm9ncmFtLT5CYXNlLk51bU5hdGl2ZUF0dHJpYnV0ZXMgPSBwcm9nLk51bU5hdGl2ZUF0dHJpYnV0ZXM7CisgICBwcm9ncmFtLT5CYXNlLk51bU5hdGl2ZUFkZHJlc3NSZWdzID0gcHJvZy5OdW1OYXRpdmVBZGRyZXNzUmVnczsKKyAgIHByb2dyYW0tPkJhc2UuSW5wdXRzUmVhZCAgICAgPSBwcm9nLklucHV0c1JlYWQ7CisgICBwcm9ncmFtLT5CYXNlLk91dHB1dHNXcml0dGVuID0gcHJvZy5PdXRwdXRzV3JpdHRlbjsKKyAgIHByb2dyYW0tPkJhc2UuSW5kaXJlY3RSZWdpc3RlckZpbGVzID0gcHJvZy5JbmRpcmVjdFJlZ2lzdGVyRmlsZXM7CisgICBwcm9ncmFtLT5Jc1Bvc2l0aW9uSW52YXJpYW50ID0gKHN0YXRlLm9wdGlvbi5Qb3NpdGlvbkludmFyaWFudCkKKyAgICAgID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworCisgICBmcmVlKHByb2dyYW0tPkJhc2UuSW5zdHJ1Y3Rpb25zKTsKKyAgIHByb2dyYW0tPkJhc2UuSW5zdHJ1Y3Rpb25zID0gcHJvZy5JbnN0cnVjdGlvbnM7CisKKyAgIGlmIChwcm9ncmFtLT5CYXNlLlBhcmFtZXRlcnMpCisgICAgICBfbWVzYV9mcmVlX3BhcmFtZXRlcl9saXN0KHByb2dyYW0tPkJhc2UuUGFyYW1ldGVycyk7CisgICBwcm9ncmFtLT5CYXNlLlBhcmFtZXRlcnMgPSBwcm9nLlBhcmFtZXRlcnM7IAorCisjaWYgREVCVUdfVlAKKyAgIHByaW50ZigiX19fX19fX19fX19fVmVydGV4IHByb2dyYW0gJXUgX19fX19fX19fX1xuIiwgcHJvZ3JhbS0+QmFzZS5JZCk7CisgICBfbWVzYV9wcmludF9wcm9ncmFtKCZwcm9ncmFtLT5CYXNlKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9hcmJwcm9ncGFyc2UuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vYXJicHJvZ3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMjExNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vYXJicHJvZ3BhcnNlLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgQVJCUFJPR1BBUlNFX0gKKyNkZWZpbmUgQVJCUFJPR1BBUlNFX0gKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKworc3RydWN0IGdsX2NvbnRleHQ7CitzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbTsKK3N0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3BhcnNlX2FyYl92ZXJ0ZXhfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAorCQkJICAgICAgIGNvbnN0IEdMdm9pZCAqc3RyLCBHTHNpemVpIGxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnByb2dyYW0pOworCitleHRlcm4gdm9pZAorX21lc2FfcGFyc2VfYXJiX2ZyYWdtZW50X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqc3RyLCBHTHNpemVpIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpwcm9ncmFtKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL2hhc2hfdGFibGUuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vaGFzaF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjZiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL2hhc2hfdGFibGUuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaGFzaF90YWJsZS5oCisgKiBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBnZW5lcmljLCBvcGFxdWUgaGFzaCB0YWJsZSBkYXRhIHR5cGUuCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworCisjaWZuZGVmIEhBU0hfVEFCTEVfSAorI2RlZmluZSBIQVNIX1RBQkxFX0gKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworc3RydWN0IHN0cmluZ190b191aW50X21hcDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaGFzaF90YWJsZTsKKwordHlwZWRlZiB1bnNpZ25lZCAoKmhhc2hfZnVuY190KShjb25zdCB2b2lkICprZXkpOwordHlwZWRlZiBpbnQgKCpoYXNoX2NvbXBhcmVfZnVuY190KShjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyKTsKKworLyoqCisgKiBIYXNoIHRhYmxlIGNvbnN0cnVjdG9yCisgKgorICogQ3JlYXRlcyBhIGhhc2ggdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBidWNrZXRzLiAgVGhlIHN1cHBsaWVkCisgKiBcYyBoYXNoIGFuZCBcYyBjb21wYXJlIHJvdXRpbmVzIGFyZSB1c2VkIHdoZW4gYWRkaW5nIGVsZW1lbnRzIHRvIHRoZSB0YWJsZQorICogYW5kIHdoZW4gc2VhcmNoaW5nIGZvciBlbGVtZW50cyBpbiB0aGUgdGFibGUuCisgKgorICogXHBhcmFtIG51bV9idWNrZXRzICBOdW1iZXIgb2YgYnVja2V0cyAoYmlucykgaW4gdGhlIGhhc2ggdGFibGUuCisgKiBccGFyYW0gaGFzaCAgICAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gY29tcHV0ZSBoYXNoIHZhbHVlIG9mIGlucHV0IGtleXMuCisgKiBccGFyYW0gY29tcGFyZSAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSBrZXlzLgorICovCitleHRlcm4gc3RydWN0IGhhc2hfdGFibGUgKmhhc2hfdGFibGVfY3Rvcih1bnNpZ25lZCBudW1fYnVja2V0cywKKyAgICBoYXNoX2Z1bmNfdCBoYXNoLCBoYXNoX2NvbXBhcmVfZnVuY190IGNvbXBhcmUpOworCisKKy8qKgorICogUmVsZWFzZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIGhhc2ggdGFibGUKKyAqCisgKiBcd2FybmluZworICogVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmVsZWFzZSBtZW1vcnkgb2NjdXBpZWQgZWl0aGVyIGJ5IGtleXMgb3IgZGF0YS4KKyAqLworZXh0ZXJuIHZvaWQgaGFzaF90YWJsZV9kdG9yKHN0cnVjdCBoYXNoX3RhYmxlICpodCk7CisKKworLyoqCisgKiBGbHVzaCBhbGwgZW50cmllcyBmcm9tIGEgaGFzaCB0YWJsZQorICoKKyAqIFxwYXJhbSBodCAgVGFibGUgdG8gYmUgY2xlYXJlZCBvZiBpdHMgZW50cmllcy4KKyAqLworZXh0ZXJuIHZvaWQgaGFzaF90YWJsZV9jbGVhcihzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpOworCisKKy8qKgorICogU2VhcmNoIGEgaGFzaCB0YWJsZSBmb3IgYSBzcGVjaWZpYyBlbGVtZW50CisgKgorICogXHBhcmFtIGh0ICAgVGFibGUgdG8gYmUgc2VhcmNoZWQKKyAqIFxwYXJhbSBrZXkgIEtleSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50CisgKgorICogXHJldHVybgorICogVGhlIFxjIGRhdGEgdmFsdWUgc3VwcGxpZWQgdG8gXGMgaGFzaF90YWJsZV9pbnNlcnQgd2hlbiB0aGUgZWxlbWVudCB3aXRoCisgKiB0aGUgbWF0Y2hpbmcga2V5IHdhcyBhZGRlZC4gIElmIG5vIG1hdGNoaW5nIGtleSBleGlzdHMgaW4gdGhlIHRhYmxlLAorICogXGMgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworZXh0ZXJuIHZvaWQgKmhhc2hfdGFibGVfZmluZChzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSk7CisKKworLyoqCisgKiBBZGQgYW4gZWxlbWVudCB0byBhIGhhc2ggdGFibGUKKyAqCisgKiBcd2FybmluZworICogSWYgXGMga2V5IGlzIGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUsIGl0IHdpbGwgYmUgYWRkZWQgYWdhaW4uICBGdXR1cmUKKyAqIGNhbGxzIHRvIFxjIGhhc2hfdGFibGVfZmluZCBhbmQgXGMgaGFzaF90YWJsZV9yZW1vdmUgd2lsbCByZXR1cm4gb3IgcmVtb3ZlLAorICogcmVzcGVjdGl2ZWx5LCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBpbnN0YW5jZSBvZiBcYyBrZXkuCisgKgorICogXHdhcm5pbmcKKyAqIFRoZSB2YWx1ZSBwYXNzZWQgYnkgXGMga2V5IGlzIGtlcHQgaW4gdGhlIGhhc2ggdGFibGUgYW5kIGlzIHVzZWQgYnkgbGF0ZXIKKyAqIGNhbGxzIHRvIFxjIGhhc2hfdGFibGVfZmluZC4KKyAqCisgKiBcc2EgaGFzaF90YWJsZV9yZXBsYWNlCisgKi8KK2V4dGVybiB2b2lkIGhhc2hfdGFibGVfaW5zZXJ0KHN0cnVjdCBoYXNoX3RhYmxlICpodCwgdm9pZCAqZGF0YSwKKyAgICBjb25zdCB2b2lkICprZXkpOworCisvKioKKyAqIEFkZCBhbiBlbGVtZW50IHRvIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxhY2VtZW50CisgKgorICogXHJldHVybgorICogMSBpZiBpdCBkaWQgcmVwbGFjZSB0aGUgdGhlIHZhbHVlIChpbiB3aGljaCBjYXNlIHRoZSBvbGQga2V5IGlzIGtlcHQpLCAwIGlmCisgKiBpdCBkaWQgbm90IHJlcGxhY2UgdGhlIHZhbHVlIChpbiB3aGljaCBjYXNlIHRoZSBuZXcga2V5IGlzIGtlcHQpLgorICoKKyAqIFx3YXJuaW5nCisgKiBJZiBcYyBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZSwgXGMgZGF0YSB3aWxsIFxiIHJlcGxhY2UgdGhlIG1vc3QKKyAqIHJlY2VudGx5IGluc2VydGVkIFxjIGRhdGEgKHNlZSB0aGUgd2FybmluZyBpbiBcYyBoYXNoX3RhYmxlX2luc2VydCkgZm9yCisgKiB0aGF0IGtleS4KKyAqCisgKiBcc2EgaGFzaF90YWJsZV9pbnNlcnQKKyAqLworZXh0ZXJuIGJvb2wgaGFzaF90YWJsZV9yZXBsYWNlKHN0cnVjdCBoYXNoX3RhYmxlICpodCwgdm9pZCAqZGF0YSwKKyAgICBjb25zdCB2b2lkICprZXkpOworCisvKioKKyAqIFJlbW92ZSBhIHNwZWNpZmljIGVsZW1lbnQgZnJvbSBhIGhhc2ggdGFibGUuCisgKi8KK2V4dGVybiB2b2lkIGhhc2hfdGFibGVfcmVtb3ZlKHN0cnVjdCBoYXNoX3RhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5KTsKKworLyoqCisgKiBDb21wdXRlIGhhc2ggdmFsdWUgb2YgYSBzdHJpbmcKKyAqCisgKiBDb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBvZiBhIHN0cmluZyB1c2luZyB0aGUgREpCMiBhbGdvcml0aG0gZGV2ZWxvcGVkIGJ5CisgKiBQcm9mZXNzb3IgRGFuaWVsIEouIEJlcm5zdGVpbi4gIEl0IHdhcyBwdWJsaXNoZWQgb24gY29tcC5sYW5nLmMgb25jZSB1cG9uCisgKiBhIHRpbWUuICBJIHdhcyB1bmFibGUgdG8gZmluZCB0aGUgb3JpZ2luYWwgcG9zdGluZyBpbiB0aGUgYXJjaGl2ZXMuCisgKgorICogXHBhcmFtIGtleSAgUG9pbnRlciB0byBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyB0byBiZSBoYXNoZWQuCisgKgorICogXHNhIGhhc2hfdGFibGVfc3RyaW5nX2NvbXBhcmUKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGhhc2hfdGFibGVfc3RyaW5nX2hhc2goY29uc3Qgdm9pZCAqa2V5KTsKKworCisvKioKKyAqIENvbXBhcmUgdHdvIHN0cmluZ3MgdXNlZCBhcyBrZXlzCisgKgorICogVGhpcyBpcyBqdXN0IGEgbWFjcm8gd3JhcHBlciBhcm91bmQgXGMgc3RyY21wLgorICoKKyAqIFxzYSBoYXNoX3RhYmxlX3N0cmluZ19oYXNoCisgKi8KKyNkZWZpbmUgaGFzaF90YWJsZV9zdHJpbmdfY29tcGFyZSAoKGhhc2hfY29tcGFyZV9mdW5jX3QpIHN0cmNtcCkKKworCisvKioKKyAqIENvbXB1dGUgaGFzaCB2YWx1ZSBvZiBhIHBvaW50ZXIKKyAqCisgKiBccGFyYW0ga2V5ICBQb2ludGVyIHRvIGJlIHVzZWQgYXMgYSBoYXNoIGtleQorICoKKyAqIFxub3RlCisgKiBUaGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgXGMga2V5IGlzIFxiIG5ldmVyIGFjY2Vzc2VkLiAgVGhlIHZhbHVlIG9mIFxjIGtleQorICogaXRzZWxmIGlzIHVzZWQgYXMgdGhlIGhhc2gga2V5CisgKgorICogXHNhIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlCisgKi8KK3Vuc2lnbmVkCitoYXNoX3RhYmxlX3BvaW50ZXJfaGFzaChjb25zdCB2b2lkICprZXkpOworCisKKy8qKgorICogQ29tcGFyZSB0d28gcG9pbnRlcnMgdXNlZCBhcyBrZXlzCisgKgorICogXHNhIGhhc2hfdGFibGVfcG9pbnRlcl9oYXNoCisgKi8KK2ludAoraGFzaF90YWJsZV9wb2ludGVyX2NvbXBhcmUoY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5Mik7CisKK3ZvaWQKK2hhc2hfdGFibGVfY2FsbF9mb3JlYWNoKHN0cnVjdCBoYXNoX3RhYmxlICpodCwKKwkJCXZvaWQgKCpjYWxsYmFjaykoY29uc3Qgdm9pZCAqa2V5LAorCQkJCQkgdm9pZCAqZGF0YSwKKwkJCQkJIHZvaWQgKmNsb3N1cmUpLAorCQkJdm9pZCAqY2xvc3VyZSk7CisKK3N0cnVjdCBzdHJpbmdfdG9fdWludF9tYXAgKgorc3RyaW5nX3RvX3VpbnRfbWFwX2N0b3IoKTsKKwordm9pZAorc3RyaW5nX3RvX3VpbnRfbWFwX2R0b3Ioc3RydWN0IHN0cmluZ190b191aW50X21hcCAqKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKworLyoqCisgKiBNYXAgZnJvbSBhIHN0cmluZyAobmFtZSkgdG8gYW4gdW5zaWduZWQgaW50ZWdlciB2YWx1ZQorICoKKyAqIFxub3RlCisgKiBCZWNhdXNlIG9mIHRoZSB3YXkgdGhpcyBjbGFzcyBpbnRlcmFjdHMgd2l0aCB0aGUgXGMgaGFzaF90YWJsZQorICogaW1wbGVtZW50YXRpb24sIHZhbHVlcyBvZiBcYyBVSU5UX01BWCBjYW5ub3QgYmUgc3RvcmVkIGluIHRoZSBtYXAuCisgKi8KK3N0cnVjdCBzdHJpbmdfdG9fdWludF9tYXAgeworcHVibGljOgorICAgc3RyaW5nX3RvX3VpbnRfbWFwKCkKKyAgIHsKKyAgICAgIHRoaXMtPmh0ID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfc3RyaW5nX2hhc2gsCisJCQkJIGhhc2hfdGFibGVfc3RyaW5nX2NvbXBhcmUpOworICAgfQorCisgICB+c3RyaW5nX3RvX3VpbnRfbWFwKCkKKyAgIHsKKyAgICAgIGhhc2hfdGFibGVfY2FsbF9mb3JlYWNoKHRoaXMtPmh0LCBkZWxldGVfa2V5LCBOVUxMKTsKKyAgICAgIGhhc2hfdGFibGVfZHRvcih0aGlzLT5odCk7CisgICB9CisKKyAgIC8qKgorICAgICogUmVtb3ZlIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgbWFwLgorICAgICovCisgICB2b2lkIGNsZWFyKCkKKyAgIHsKKyAgICAgIGhhc2hfdGFibGVfY2FsbF9mb3JlYWNoKHRoaXMtPmh0LCBkZWxldGVfa2V5LCBOVUxMKTsKKyAgICAgIGhhc2hfdGFibGVfY2xlYXIodGhpcy0+aHQpOworICAgfQorCisgICAvKioKKyAgICAqIFJ1bnMgYSBwYXNzZWQgY2FsbGJhY2sgZm9yIHRoZSBoYXNoCisgICAgKi8KKyAgIHZvaWQgaXRlcmF0ZSh2b2lkICgqZnVuYykoY29uc3Qgdm9pZCAqLCB2b2lkICosIHZvaWQgKiksIHZvaWQgKmNsb3N1cmUpCisgICB7CisgICAgICBoYXNoX3RhYmxlX2NhbGxfZm9yZWFjaCh0aGlzLT5odCwgZnVuYywgY2xvc3VyZSk7CisgICB9CisKKyAgIC8qKgorICAgICogR2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGtleQorICAgICoKKyAgICAqIFxyZXR1cm4KKyAgICAqIElmIFxjIGtleSBpcyBmb3VuZCBpbiB0aGUgbWFwLCBcYyB0cnVlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIFxjIGZhbHNlCisgICAgKiBpcyByZXR1cm5lZC4KKyAgICAqCisgICAgKiBcbm90ZQorICAgICogSWYgXGMga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUsIFxjIHZhbHVlIGlzIG5vdCBtb2RpZmllZC4KKyAgICAqLworICAgYm9vbCBnZXQodW5zaWduZWQgJnZhbHVlLCBjb25zdCBjaGFyICprZXkpCisgICB7CisgICAgICBjb25zdCBpbnRwdHJfdCB2ID0KKwkgKGludHB0cl90KSBoYXNoX3RhYmxlX2ZpbmQodGhpcy0+aHQsIChjb25zdCB2b2lkICopIGtleSk7CisKKyAgICAgIGlmICh2ID09IDApCisJIHJldHVybiBmYWxzZTsKKworICAgICAgdmFsdWUgPSAodW5zaWduZWQpKHYgLSAxKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICB2b2lkIHB1dCh1bnNpZ25lZCB2YWx1ZSwgY29uc3QgY2hhciAqa2V5KQorICAgeworICAgICAgLyogVGhlIGxvdy1sZXZlbCBoYXNoIHRhYmxlIHN0cnVjdHVyZSByZXR1cm5zIE5VTEwgaWYga2V5IGlzIG5vdCBpbiB0aGUKKyAgICAgICAqIGhhc2ggdGFibGUuICBIb3dldmVyLCB1c2VycyBvZiB0aGlzIG1hcCBtaWdodCB3YW50IHRvIHN0b3JlIHplcm8gYXMgYQorICAgICAgICogdmFsaWQgdmFsdWUgaW4gdGhlIHRhYmxlLiAgQmlhcyB0aGUgdmFsdWUgYnkgKzEgc28gdGhhdCBhCisgICAgICAgKiB1c2VyLXNwZWNpZmllZCB6ZXJvIGlzIHN0b3JlZCBhcyAxLiAgVGhpcyBlbmFibGVzIDo6Z2V0IHRvIHRlbGwgdGhlCisgICAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gYSB1c2VyLXNwZWNpZmllZCB6ZXJvIChyZXR1cm5lZCBhcyAxIGJ5CisgICAgICAgKiBoYXNoX3RhYmxlX2ZpbmQpIGFuZCB0aGUga2V5IG5vdCBpbiB0aGUgdGFibGUgKHJldHVybmVkIGFzIDAgYnkKKyAgICAgICAqIGhhc2hfdGFibGVfZmluZCkuCisgICAgICAgKgorICAgICAgICogVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCB3ZSBjYW4ndCBzdG9yZSBVSU5UX01BWCBpbiB0aGUgdGFibGUuICBUaGlzIGlzCisgICAgICAgKiBiZWNhdXNlIFVJTlRfTUFYKzEgPSAwLgorICAgICAgICovCisgICAgICBhc3NlcnQodmFsdWUgIT0gVUlOVF9NQVgpOworICAgICAgY2hhciAqZHVwX2tleSA9IHN0cmR1cChrZXkpOworICAgICAgYm9vbCByZXN1bHQgPSBoYXNoX3RhYmxlX3JlcGxhY2UodGhpcy0+aHQsCisJCQkJICAgICAgICh2b2lkICopIChpbnRwdHJfdCkgKHZhbHVlICsgMSksCisJCQkJICAgICAgIGR1cF9rZXkpOworICAgICAgaWYgKHJlc3VsdCkKKwkgZnJlZShkdXBfa2V5KTsKKyAgIH0KKworcHJpdmF0ZToKKyAgIHN0YXRpYyB2b2lkIGRlbGV0ZV9rZXkoY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpkYXRhLCB2b2lkICpjbG9zdXJlKQorICAgeworICAgICAgKHZvaWQpIGRhdGE7CisgICAgICAodm9pZCkgY2xvc3VyZTsKKworICAgICAgZnJlZSgoY2hhciAqKWtleSk7CisgICB9CisKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKK307CisKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmIC8qIEhBU0hfVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9pcl90b19tZXNhLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vaXJfdG9fbWVzYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViYzBjOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vaXJfdG9fbWVzYS5jcHAKQEAgLTAsMCArMSwzMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBWTXdhcmUsIEluYy4gICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBpcl90b19tZXNhLmNwcAorICoKKyAqIFRyYW5zbGF0ZSBHTFNMIElSIHRvIE1lc2EncyBnbF9wcm9ncmFtIHJlcHJlc2VudGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm1haW4vY29tcGlsZXIuaCIKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9leHByZXNzaW9uX2ZsYXR0ZW5pbmcuaCIKKyNpbmNsdWRlICJpcl91bmlmb3JtLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImdsc2xfcGFyc2VyX2V4dHJhcy5oIgorLy8jaW5jbHVkZSAiLi4vZ2xzbC9wcm9ncmFtLmgiIC8vIEx1bmFyRyA6IFJlbW92ZWQKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJhc3QuaCIKKyNpbmNsdWRlICJsaW5rZXIuaCIKKworI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAibWFpbi9zaGFkZXJvYmouaCIKKyNpbmNsdWRlICJtYWluL3VuaWZvcm1zLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1haW4vc2hhZGVyYXBpLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX29wdGltaXplLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3ByaW50LmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9ncmFtLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgInByb2dyYW0vc2FtcGxlci5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19kaXNrY2FjaGUuaCIKK30KKworc3RhdGljIGludCBzd2l6emxlX2Zvcl9zaXplKGludCBzaXplKTsKKworbmFtZXNwYWNlIHsKKworY2xhc3Mgc3JjX3JlZzsKK2NsYXNzIGRzdF9yZWc7CisKKy8qKgorICogVGhpcyBzdHJ1Y3QgaXMgYSBjb3JyZXNwb25kaW5nIHN0cnVjdCB0byBNZXNhIHByb2dfc3JjX3JlZ2lzdGVyLCB3aXRoCisgKiB3aWRlciBmaWVsZHMuCisgKi8KK2NsYXNzIHNyY19yZWcgeworcHVibGljOgorICAgc3JjX3JlZyhnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIGludCBpbmRleCwgY29uc3QgZ2xzbF90eXBlICp0eXBlKQorICAgeworICAgICAgdGhpcy0+ZmlsZSA9IGZpbGU7CisgICAgICB0aGlzLT5pbmRleCA9IGluZGV4OworICAgICAgaWYgKHR5cGUgJiYgKHR5cGUtPmlzX3NjYWxhcigpIHx8IHR5cGUtPmlzX3ZlY3RvcigpIHx8IHR5cGUtPmlzX21hdHJpeCgpKSkKKwkgdGhpcy0+c3dpenpsZSA9IHN3aXp6bGVfZm9yX3NpemUodHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgIGVsc2UKKwkgdGhpcy0+c3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgIHRoaXMtPm5lZ2F0ZSA9IDA7CisgICAgICB0aGlzLT5yZWxhZGRyID0gTlVMTDsKKyAgIH0KKworICAgc3JjX3JlZygpCisgICB7CisgICAgICB0aGlzLT5maWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisgICAgICB0aGlzLT5pbmRleCA9IDA7CisgICAgICB0aGlzLT5zd2l6emxlID0gMDsKKyAgICAgIHRoaXMtPm5lZ2F0ZSA9IDA7CisgICAgICB0aGlzLT5yZWxhZGRyID0gTlVMTDsKKyAgIH0KKworICAgZXhwbGljaXQgc3JjX3JlZyhkc3RfcmVnIHJlZyk7CisKKyAgIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZTsgLyoqPCBQUk9HUkFNXyogZnJvbSBNZXNhICovCisgICBpbnQgaW5kZXg7IC8qKjwgdGVtcG9yYXJ5IGluZGV4LCBWRVJUX0FUVFJJQl8qLCBWQVJZSU5HX1NMT1RfKiwgZXRjLiAqLworICAgR0x1aW50IHN3aXp6bGU7IC8qKjwgU1dJWlpMRV9YWVpXT05FWkVSTyBzd2l6emxlcyBmcm9tIE1lc2EuICovCisgICBpbnQgbmVnYXRlOyAvKio8IE5FR0FURV9YWVpXIG1hc2sgZnJvbSBtZXNhICovCisgICAvKiogUmVnaXN0ZXIgaW5kZXggc2hvdWxkIGJlIG9mZnNldCBieSB0aGUgaW50ZWdlciBpbiB0aGlzIHJlZy4gKi8KKyAgIHNyY19yZWcgKnJlbGFkZHI7Cit9OworCitjbGFzcyBkc3RfcmVnIHsKK3B1YmxpYzoKKyAgIGRzdF9yZWcoZ2xfcmVnaXN0ZXJfZmlsZSBmaWxlLCBpbnQgd3JpdGVtYXNrKQorICAgeworICAgICAgdGhpcy0+ZmlsZSA9IGZpbGU7CisgICAgICB0aGlzLT5pbmRleCA9IDA7CisgICAgICB0aGlzLT53cml0ZW1hc2sgPSB3cml0ZW1hc2s7CisgICAgICB0aGlzLT5jb25kX21hc2sgPSBDT05EX1RSOworICAgICAgdGhpcy0+cmVsYWRkciA9IE5VTEw7CisgICB9CisKKyAgIGRzdF9yZWcoKQorICAgeworICAgICAgdGhpcy0+ZmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworICAgICAgdGhpcy0+aW5kZXggPSAwOworICAgICAgdGhpcy0+d3JpdGVtYXNrID0gMDsKKyAgICAgIHRoaXMtPmNvbmRfbWFzayA9IENPTkRfVFI7CisgICAgICB0aGlzLT5yZWxhZGRyID0gTlVMTDsKKyAgIH0KKworICAgZXhwbGljaXQgZHN0X3JlZyhzcmNfcmVnIHJlZyk7CisKKyAgIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZTsgLyoqPCBQUk9HUkFNXyogZnJvbSBNZXNhICovCisgICBpbnQgaW5kZXg7IC8qKjwgdGVtcG9yYXJ5IGluZGV4LCBWRVJUX0FUVFJJQl8qLCBWQVJZSU5HX1NMT1RfKiwgZXRjLiAqLworICAgaW50IHdyaXRlbWFzazsgLyoqPCBCaXRmaWVsZCBvZiBXUklURU1BU0tfW1hZWlddICovCisgICBHTHVpbnQgY29uZF9tYXNrOjQ7CisgICAvKiogUmVnaXN0ZXIgaW5kZXggc2hvdWxkIGJlIG9mZnNldCBieSB0aGUgaW50ZWdlciBpbiB0aGlzIHJlZy4gKi8KKyAgIHNyY19yZWcgKnJlbGFkZHI7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworc3JjX3JlZzo6c3JjX3JlZyhkc3RfcmVnIHJlZykKK3sKKyAgIHRoaXMtPmZpbGUgPSByZWcuZmlsZTsKKyAgIHRoaXMtPmluZGV4ID0gcmVnLmluZGV4OworICAgdGhpcy0+c3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgIHRoaXMtPm5lZ2F0ZSA9IDA7CisgICB0aGlzLT5yZWxhZGRyID0gcmVnLnJlbGFkZHI7Cit9CisKK2RzdF9yZWc6OmRzdF9yZWcoc3JjX3JlZyByZWcpCit7CisgICB0aGlzLT5maWxlID0gcmVnLmZpbGU7CisgICB0aGlzLT5pbmRleCA9IHJlZy5pbmRleDsKKyAgIHRoaXMtPndyaXRlbWFzayA9IFdSSVRFTUFTS19YWVpXOworICAgdGhpcy0+Y29uZF9tYXNrID0gQ09ORF9UUjsKKyAgIHRoaXMtPnJlbGFkZHIgPSByZWcucmVsYWRkcjsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiA6IHB1YmxpYyBleGVjX25vZGUgeworcHVibGljOgorICAgREVDTEFSRV9SQUxMT0NfQ1hYX09QRVJBVE9SUyhpcl90b19tZXNhX2luc3RydWN0aW9uKQorCisgICBlbnVtIHByb2dfb3Bjb2RlIG9wOworICAgZHN0X3JlZyBkc3Q7CisgICBzcmNfcmVnIHNyY1szXTsKKyAgIC8qKiBQb2ludGVyIHRvIHRoZSBpciBzb3VyY2UgdGhpcyB0cmVlIGNhbWUgZnJvbSBmb3IgZGVidWdnaW5nICovCisgICBpcl9pbnN0cnVjdGlvbiAqaXI7CisgICBHTGJvb2xlYW4gY29uZF91cGRhdGU7CisgICBib29sIHNhdHVyYXRlOworICAgaW50IHNhbXBsZXI7IC8qKjwgc2FtcGxlciBpbmRleCAqLworICAgaW50IHRleF90YXJnZXQ7IC8qKjwgT25lIG9mIFRFWFRVUkVfKl9JTkRFWCAqLworICAgR0xib29sZWFuIHRleF9zaGFkb3c7Cit9OworCitjbGFzcyB2YXJpYWJsZV9zdG9yYWdlIDogcHVibGljIGV4ZWNfbm9kZSB7CitwdWJsaWM6CisgICB2YXJpYWJsZV9zdG9yYWdlKGlyX3ZhcmlhYmxlICp2YXIsIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwgaW50IGluZGV4KQorICAgICAgOiBmaWxlKGZpbGUpLCBpbmRleChpbmRleCksIHZhcih2YXIpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICBnbF9yZWdpc3Rlcl9maWxlIGZpbGU7CisgICBpbnQgaW5kZXg7CisgICBpcl92YXJpYWJsZSAqdmFyOyAvKiB2YXJpYWJsZSB0aGF0IG1hcHMgdG8gdGhpcywgaWYgYW55ICovCit9OworCitjbGFzcyBmdW5jdGlvbl9lbnRyeSA6IHB1YmxpYyBleGVjX25vZGUgeworcHVibGljOgorICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWc7CisKKyAgIC8qKgorICAgICogaWRlbnRpZmllciBvZiB0aGlzIGZ1bmN0aW9uIHNpZ25hdHVyZSB1c2VkIGJ5IHRoZSBwcm9ncmFtLgorICAgICoKKyAgICAqIEF0IHRoZSBwb2ludCB0aGF0IE1lc2EgaW5zdHJ1Y3Rpb25zIGZvciBmdW5jdGlvbiBjYWxscyBhcmUKKyAgICAqIGdlbmVyYXRlZCwgd2UgZG9uJ3Qga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YKKyAgICAqIHRoZSBmdW5jdGlvbiBib2R5LiAgU28gd2UgbWFrZSB0aGUgQnJhbmNoVGFyZ2V0IHRoYXQgaXMgY2FsbGVkIGEKKyAgICAqIHNtYWxsIGludGVnZXIgYW5kIHJld3JpdGUgdGhlbSBkdXJpbmcgc2V0X2JyYW5jaHRhcmdldHMoKS4KKyAgICAqLworICAgaW50IHNpZ19pZDsKKworICAgLyoqCisgICAgKiBQb2ludGVyIHRvIGZpcnN0IGluc3RydWN0aW9uIG9mIHRoZSBmdW5jdGlvbiBib2R5LgorICAgICoKKyAgICAqIFNldCBkdXJpbmcgZnVuY3Rpb24gYm9keSBlbWl0cyBhZnRlciBtYWluKCkgaXMgcHJvY2Vzc2VkLgorICAgICovCisgICBpcl90b19tZXNhX2luc3RydWN0aW9uICpiZ25faW5zdDsKKworICAgLyoqCisgICAgKiBJbmRleCBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGZ1bmN0aW9uIGJvZHkgaW4gYWN0dWFsCisgICAgKiBNZXNhIElSLgorICAgICoKKyAgICAqIFNldCBhZnRlciBjb252ZXJzaW9uIGZyb20gaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiB0byBwcm9nX2luc3RydWN0aW9uLgorICAgICovCisgICBpbnQgaW5zdDsKKworICAgLyoqIFN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUuICovCisgICBzcmNfcmVnIHJldHVybl9yZWc7Cit9OworCitjbGFzcyBpcl90b19tZXNhX3Zpc2l0b3IgOiBwdWJsaWMgaXJfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl90b19tZXNhX3Zpc2l0b3IoKTsKKyAgIH5pcl90b19tZXNhX3Zpc2l0b3IoKTsKKworICAgZnVuY3Rpb25fZW50cnkgKmN1cnJlbnRfZnVuY3Rpb247CisKKyAgIHN0cnVjdCBnbF9jb250ZXh0ICpjdHg7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZzsKKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW07CisgICBzdHJ1Y3QgZ2xfc2hhZGVyX2NvbXBpbGVyX29wdGlvbnMgKm9wdGlvbnM7CisKKyAgIGludCBuZXh0X3RlbXA7CisKKyAgIHZhcmlhYmxlX3N0b3JhZ2UgKmZpbmRfdmFyaWFibGVfc3RvcmFnZShjb25zdCBpcl92YXJpYWJsZSAqdmFyKTsKKworICAgc3JjX3JlZyBnZXRfdGVtcChjb25zdCBnbHNsX3R5cGUgKnR5cGUpOworICAgdm9pZCByZWxhZGRyX3RvX3RlbXAoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBzcmNfcmVnICpyZWcsIGludCAqbnVtX3JlbGFkZHIpOworCisgICBzcmNfcmVnIHNyY19yZWdfZm9yX2Zsb2F0KGZsb2F0IHZhbCk7CisKKyAgIC8qKgorICAgICogXG5hbWUgVmlzaXQgbWV0aG9kcworICAgICoKKyAgICAqIEFzIHR5cGljYWwgZm9yIHRoZSB2aXNpdG9yIHBhdHRlcm4sIHRoZXJlIG11c3QgYmUgb25lIFxjIHZpc2l0IG1ldGhvZCBmb3IKKyAgICAqIGVhY2ggY29uY3JldGUgc3ViY2xhc3Mgb2YgXGMgaXJfaW5zdHJ1Y3Rpb24uICBWaXJ0dWFsIGJhc2UgY2xhc3NlcyB3aXRoaW4KKyAgICAqIHRoZSBoaWVyYXJjaHkgc2hvdWxkIG5vdCBoYXZlIFxjIHZpc2l0IG1ldGhvZHMuCisgICAgKi8KKyAgIC8qQHsqLworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX3ZhcmlhYmxlICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2xvb3AgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfbG9vcF9qdW1wICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9mdW5jdGlvbiAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9leHByZXNzaW9uICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX3N3aXp6bGUgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2RlcmVmZXJlbmNlX2FycmF5ICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9hc3NpZ25tZW50ICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2NvbnN0YW50ICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2NhbGwgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfcmV0dXJuICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2Rpc2NhcmQgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfdGV4dHVyZSAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9pZiAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9lbWl0X3ZlcnRleCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9lbmRfcHJpbWl0aXZlICopOworICAgLypAfSovCisKKyAgIHNyY19yZWcgcmVzdWx0OworCisgICAvKiogTGlzdCBvZiB2YXJpYWJsZV9zdG9yYWdlICovCisgICBleGVjX2xpc3QgdmFyaWFibGVzOworCisgICAvKiogTGlzdCBvZiBmdW5jdGlvbl9lbnRyeSAqLworICAgZXhlY19saXN0IGZ1bmN0aW9uX3NpZ25hdHVyZXM7CisgICBpbnQgbmV4dF9zaWduYXR1cmVfaWQ7CisKKyAgIC8qKiBMaXN0IG9mIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKi8KKyAgIGV4ZWNfbGlzdCBpbnN0cnVjdGlvbnM7CisKKyAgIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKmVtaXQoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBlbnVtIHByb2dfb3Bjb2RlIG9wKTsKKworICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqZW1pdChpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3AsCisJCQkgICAgICAgIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzApOworCisgICBpcl90b19tZXNhX2luc3RydWN0aW9uICplbWl0KGlyX2luc3RydWN0aW9uICppciwgZW51bSBwcm9nX29wY29kZSBvcCwKKwkJCSAgICAgICAgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKworICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqZW1pdChpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3AsCisJCQkgICAgICAgIGRzdF9yZWcgZHN0LAorCQkJICAgICAgICBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSwgc3JjX3JlZyBzcmMyKTsKKworICAgLyoqCisgICAgKiBFbWl0IHRoZSBjb3JyZWN0IGRvdC1wcm9kdWN0IGluc3RydWN0aW9uIGZvciB0aGUgdHlwZSBvZiBhcmd1bWVudHMKKyAgICAqLworICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqIGVtaXRfZHAoaXJfaW5zdHJ1Y3Rpb24gKmlyLAorCQkJCSAgICBkc3RfcmVnIGRzdCwKKwkJCQkgICAgc3JjX3JlZyBzcmMwLAorCQkJCSAgICBzcmNfcmVnIHNyYzEsCisJCQkJICAgIHVuc2lnbmVkIGVsZW1lbnRzKTsKKworICAgdm9pZCBlbWl0X3NjYWxhcihpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3AsCisJCSAgICBkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKTsKKworICAgdm9pZCBlbWl0X3NjYWxhcihpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3AsCisJCSAgICBkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworCisgICB2b2lkIGVtaXRfc2NzKGlyX2luc3RydWN0aW9uICppciwgZW51bSBwcm9nX29wY29kZSBvcCwKKwkJIGRzdF9yZWcgZHN0LCBjb25zdCBzcmNfcmVnICZzcmMpOworCisgICBib29sIHRyeV9lbWl0X21hZChpcl9leHByZXNzaW9uICppciwKKwkJCSAgaW50IG11bF9vcGVyYW5kKTsKKyAgIGJvb2wgdHJ5X2VtaXRfbWFkX2Zvcl9hbmRfbm90KGlyX2V4cHJlc3Npb24gKmlyLAorCQkJCSBpbnQgbXVsX29wZXJhbmQpOworICAgYm9vbCB0cnlfZW1pdF9zYXQoaXJfZXhwcmVzc2lvbiAqaXIpOworCisgICB2b2lkIGVtaXRfc3d6KGlyX2V4cHJlc3Npb24gKmlyKTsKKworICAgYm9vbCBwcm9jZXNzX21vdmVfY29uZGl0aW9uKGlyX3J2YWx1ZSAqaXIpOworCisgICB2b2lkIGNvcHlfcHJvcGFnYXRlKHZvaWQpOworCisgICB2b2lkICptZW1fY3R4OworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK3N0YXRpYyBzcmNfcmVnIHVuZGVmX3NyYyA9IHNyY19yZWcoUFJPR1JBTV9VTkRFRklORUQsIDAsIE5VTEwpOworCitzdGF0aWMgZHN0X3JlZyB1bmRlZl9kc3QgPSBkc3RfcmVnKFBST0dSQU1fVU5ERUZJTkVELCBTV0laWkxFX05PT1ApOworCitzdGF0aWMgZHN0X3JlZyBhZGRyZXNzX3JlZyA9IGRzdF9yZWcoUFJPR1JBTV9BRERSRVNTLCBXUklURU1BU0tfWCk7CisKK3N0YXRpYyBpbnQKK3N3aXp6bGVfZm9yX3NpemUoaW50IHNpemUpCit7CisgICBzdGF0aWMgY29uc3QgaW50IHNpemVfc3dpenpsZXNbNF0gPSB7CisgICAgICBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCksCisgICAgICBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCBTV0laWkxFX1ksIFNXSVpaTEVfWSksCisgICAgICBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCBTV0laWkxFX1osIFNXSVpaTEVfWiksCisgICAgICBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCBTV0laWkxFX1osIFNXSVpaTEVfVyksCisgICB9OworCisgICBhc3NlcnQoKHNpemUgPj0gMSkgJiYgKHNpemUgPD0gNCkpOworICAgcmV0dXJuIHNpemVfc3dpenpsZXNbc2l6ZSAtIDFdOworfQorCitpcl90b19tZXNhX2luc3RydWN0aW9uICoKK2lyX3RvX21lc2FfdmlzaXRvcjo6ZW1pdChpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3AsCisJCQkgZHN0X3JlZyBkc3QsCisJCQkgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEsIHNyY19yZWcgc3JjMikKK3sKKyAgIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKmluc3QgPSBuZXcobWVtX2N0eCkgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbigpOworICAgaW50IG51bV9yZWxhZGRyID0gMDsKKworICAgLyogSWYgd2UgaGF2ZSB0byBkbyByZWxhdGl2ZSBhZGRyZXNzaW5nLCB3ZSB3YW50IHRvIGxvYWQgdGhlIEFSTAorICAgICogcmVnIGRpcmVjdGx5IGZvciBvbmUgb2YgdGhlIHJlZ3MsIGFuZCBwcmVsb2FkIHRoZSBvdGhlciByZWxhZGRyCisgICAgKiBzb3VyY2VzIGludG8gdGVtcHMuCisgICAgKi8KKyAgIG51bV9yZWxhZGRyICs9IGRzdC5yZWxhZGRyICE9IE5VTEw7CisgICBudW1fcmVsYWRkciArPSBzcmMwLnJlbGFkZHIgIT0gTlVMTDsKKyAgIG51bV9yZWxhZGRyICs9IHNyYzEucmVsYWRkciAhPSBOVUxMOworICAgbnVtX3JlbGFkZHIgKz0gc3JjMi5yZWxhZGRyICE9IE5VTEw7CisKKyAgIHJlbGFkZHJfdG9fdGVtcChpciwgJnNyYzIsICZudW1fcmVsYWRkcik7CisgICByZWxhZGRyX3RvX3RlbXAoaXIsICZzcmMxLCAmbnVtX3JlbGFkZHIpOworICAgcmVsYWRkcl90b190ZW1wKGlyLCAmc3JjMCwgJm51bV9yZWxhZGRyKTsKKworICAgaWYgKGRzdC5yZWxhZGRyKSB7CisgICAgICBlbWl0KGlyLCBPUENPREVfQVJMLCBhZGRyZXNzX3JlZywgKmRzdC5yZWxhZGRyKTsKKyAgICAgIG51bV9yZWxhZGRyLS07CisgICB9CisgICBhc3NlcnQobnVtX3JlbGFkZHIgPT0gMCk7CisKKyAgIGluc3QtPm9wID0gb3A7CisgICBpbnN0LT5kc3QgPSBkc3Q7CisgICBpbnN0LT5zcmNbMF0gPSBzcmMwOworICAgaW5zdC0+c3JjWzFdID0gc3JjMTsKKyAgIGluc3QtPnNyY1syXSA9IHNyYzI7CisgICBpbnN0LT5pciA9IGlyOworCisgICB0aGlzLT5pbnN0cnVjdGlvbnMucHVzaF90YWlsKGluc3QpOworCisgICByZXR1cm4gaW5zdDsKK30KKworCitpcl90b19tZXNhX2luc3RydWN0aW9uICoKK2lyX3RvX21lc2FfdmlzaXRvcjo6ZW1pdChpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3AsCisJCQkgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKQoreworICAgcmV0dXJuIGVtaXQoaXIsIG9wLCBkc3QsIHNyYzAsIHNyYzEsIHVuZGVmX3NyYyk7Cit9CisKK2lyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKgoraXJfdG9fbWVzYV92aXNpdG9yOjplbWl0KGlyX2luc3RydWN0aW9uICppciwgZW51bSBwcm9nX29wY29kZSBvcCwKKwkJCSBkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKQoreworICAgYXNzZXJ0KGRzdC53cml0ZW1hc2sgIT0gMCk7CisgICByZXR1cm4gZW1pdChpciwgb3AsIGRzdCwgc3JjMCwgdW5kZWZfc3JjLCB1bmRlZl9zcmMpOworfQorCitpcl90b19tZXNhX2luc3RydWN0aW9uICoKK2lyX3RvX21lc2FfdmlzaXRvcjo6ZW1pdChpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3ApCit7CisgICByZXR1cm4gZW1pdChpciwgb3AsIHVuZGVmX2RzdCwgdW5kZWZfc3JjLCB1bmRlZl9zcmMsIHVuZGVmX3NyYyk7Cit9CisKK2lyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKgoraXJfdG9fbWVzYV92aXNpdG9yOjplbWl0X2RwKGlyX2luc3RydWN0aW9uICppciwKKwkJCSAgICBkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEsCisJCQkgICAgdW5zaWduZWQgZWxlbWVudHMpCit7CisgICBzdGF0aWMgY29uc3QgZ2xfaW5zdF9vcGNvZGUgZG90X29wY29kZXNbXSA9IHsKKyAgICAgIE9QQ09ERV9EUDIsIE9QQ09ERV9EUDMsIE9QQ09ERV9EUDQKKyAgIH07CisKKyAgIHJldHVybiBlbWl0KGlyLCBkb3Rfb3Bjb2Rlc1tlbGVtZW50cyAtIDJdLCBkc3QsIHNyYzAsIHNyYzEpOworfQorCisvKioKKyAqIEVtaXRzIE1lc2Egc2NhbGFyIG9wY29kZXMgdG8gcHJvZHVjZSB1bmlxdWUgYW5zd2VycyBhY3Jvc3MgY2hhbm5lbHMuCisgKgorICogU29tZSBNZXNhIG9wY29kZXMgYXJlIHNjYWxhci1vbmx5LCBsaWtlIEFSQl9mcC92cC4gIFRoZSBzcmMgWAorICogY2hhbm5lbCBkZXRlcm1pbmVzIHRoZSByZXN1bHQgYWNyb3NzIGFsbCBjaGFubmVscy4gIFNvIHRvIGRvIGEgdmVjNAorICogb2YgdGhpcyBvcGVyYXRpb24sIHdlIHdhbnQgdG8gZW1pdCBhIHNjYWxhciBwZXIgc291cmNlIGNoYW5uZWwgdXNlZAorICogdG8gcHJvZHVjZSBkZXN0IGNoYW5uZWxzLgorICovCit2b2lkCitpcl90b19tZXNhX3Zpc2l0b3I6OmVtaXRfc2NhbGFyKGlyX2luc3RydWN0aW9uICppciwgZW51bSBwcm9nX29wY29kZSBvcCwKKwkJCSAgICAgICAgZHN0X3JlZyBkc3QsCisJCQkJc3JjX3JlZyBvcmlnX3NyYzAsIHNyY19yZWcgb3JpZ19zcmMxKQoreworICAgaW50IGksIGo7CisgICBpbnQgZG9uZV9tYXNrID0gfmRzdC53cml0ZW1hc2s7CisKKyAgIC8qIE1lc2EgUkNQIGlzIGEgc2NhbGFyIG9wZXJhdGlvbiBzcGxhdHRpbmcgcmVzdWx0cyB0byBhbGwgY2hhbm5lbHMsCisgICAgKiBsaWtlIEFSQl9mcC92cC4gIFNvIGVtaXQgYXMgbWFueSBSQ1BzIGFzIG5lY2Vzc2FyeSB0byBjb3ZlciBvdXIKKyAgICAqIGRzdCBjaGFubmVscy4KKyAgICAqLworICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgR0x1aW50IHRoaXNfbWFzayA9ICgxIDw8IGkpOworICAgICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqaW5zdDsKKyAgICAgIHNyY19yZWcgc3JjMCA9IG9yaWdfc3JjMDsKKyAgICAgIHNyY19yZWcgc3JjMSA9IG9yaWdfc3JjMTsKKworICAgICAgaWYgKGRvbmVfbWFzayAmIHRoaXNfbWFzaykKKwkgY29udGludWU7CisKKyAgICAgIEdMdWludCBzcmMwX3N3aXogPSBHRVRfU1daKHNyYzAuc3dpenpsZSwgaSk7CisgICAgICBHTHVpbnQgc3JjMV9zd2l6ID0gR0VUX1NXWihzcmMxLnN3aXp6bGUsIGkpOworICAgICAgZm9yIChqID0gaSArIDE7IGogPCA0OyBqKyspIHsKKwkgLyogSWYgdGhlcmUgaXMgYW5vdGhlciBlbmFibGVkIGNvbXBvbmVudCBpbiB0aGUgZGVzdGluYXRpb24gdGhhdCBpcworCSAgKiBkZXJpdmVkIGZyb20gdGhlIHNhbWUgaW5wdXRzLCBnZW5lcmF0ZSBpdHMgdmFsdWUgb24gdGhpcyBwYXNzIGFzCisJICAqIHdlbGwuCisJICAqLworCSBpZiAoIShkb25lX21hc2sgJiAoMSA8PCBqKSkgJiYKKwkgICAgIEdFVF9TV1ooc3JjMC5zd2l6emxlLCBqKSA9PSBzcmMwX3N3aXogJiYKKwkgICAgIEdFVF9TV1ooc3JjMS5zd2l6emxlLCBqKSA9PSBzcmMxX3N3aXopIHsKKwkgICAgdGhpc19tYXNrIHw9ICgxIDw8IGopOworCSB9CisgICAgICB9CisgICAgICBzcmMwLnN3aXp6bGUgPSBNQUtFX1NXSVpaTEU0KHNyYzBfc3dpeiwgc3JjMF9zd2l6LAorCQkJCSAgIHNyYzBfc3dpeiwgc3JjMF9zd2l6KTsKKyAgICAgIHNyYzEuc3dpenpsZSA9IE1BS0VfU1dJWlpMRTQoc3JjMV9zd2l6LCBzcmMxX3N3aXosCisJCQkJICBzcmMxX3N3aXosIHNyYzFfc3dpeik7CisKKyAgICAgIGluc3QgPSBlbWl0KGlyLCBvcCwgZHN0LCBzcmMwLCBzcmMxKTsKKyAgICAgIGluc3QtPmRzdC53cml0ZW1hc2sgPSB0aGlzX21hc2s7CisgICAgICBkb25lX21hc2sgfD0gdGhpc19tYXNrOworICAgfQorfQorCit2b2lkCitpcl90b19tZXNhX3Zpc2l0b3I6OmVtaXRfc2NhbGFyKGlyX2luc3RydWN0aW9uICppciwgZW51bSBwcm9nX29wY29kZSBvcCwKKwkJCSAgICAgICAgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCkKK3sKKyAgIHNyY19yZWcgdW5kZWYgPSB1bmRlZl9zcmM7CisKKyAgIHVuZGVmLnN3aXp6bGUgPSBTV0laWkxFX1hYWFg7CisKKyAgIGVtaXRfc2NhbGFyKGlyLCBvcCwgZHN0LCBzcmMwLCB1bmRlZik7Cit9CisKKy8qKgorICogRW1pdCBhbiBPUENPREVfU0NTIGluc3RydWN0aW9uCisgKgorICogVGhlIFxjIFNDUyBvcGNvZGUgZnVuY3Rpb25zIGEgYml0IGRpZmZlcmVudGx5IHRoYW4gdGhlIG90aGVyIE1lc2EgKG9yCisgKiBBUkJfZnJhZ21lbnRfcHJvZ3JhbSkgb3Bjb2Rlcy4gIEluc3RlYWQgb2Ygc3BsYXR0aW5nIGl0cyByZXN1bHQgYWNyb3NzIGFsbAorICogZm91ciBjb21wb25lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiwgaXQgd3JpdGVzIG9uZSB2YWx1ZSB0byB0aGUgXGMgeAorICogY29tcG9uZW50IGFuZCBhbm90aGVyIHZhbHVlIHRvIHRoZSBcYyB5IGNvbXBvbmVudC4KKyAqCisgKiBccGFyYW0gaXIgICAgICAgIElSIGluc3RydWN0aW9uIGJlaW5nIHByb2Nlc3NlZAorICogXHBhcmFtIG9wICAgICAgICBFaXRoZXIgXGMgT1BDT0RFX1NJTiBvciBcYyBPUENPREVfQ09TIGRlcGVuZGluZyBvbiB3aGljaAorICogICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBkZXNpcmVkLgorICogXHBhcmFtIGRzdCAgICAgICBEZXN0aW5hdGlvbiByZWdpc3RlcgorICogXHBhcmFtIHNyYyAgICAgICBTb3VyY2UgcmVnaXN0ZXIKKyAqLwordm9pZAoraXJfdG9fbWVzYV92aXNpdG9yOjplbWl0X3Njcyhpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gcHJvZ19vcGNvZGUgb3AsCisJCQkgICAgIGRzdF9yZWcgZHN0LAorCQkJICAgICBjb25zdCBzcmNfcmVnICZzcmMpCit7CisgICAvKiBWZXJ0ZXggcHJvZ3JhbXMgY2Fubm90IHVzZSB0aGUgU0NTIG9wY29kZS4KKyAgICAqLworICAgaWYgKHRoaXMtPnByb2ctPlRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIpIHsKKyAgICAgIGVtaXRfc2NhbGFyKGlyLCBvcCwgZHN0LCBzcmMpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBjb25zdCB1bnNpZ25lZCBjb21wb25lbnQgPSAob3AgPT0gT1BDT0RFX1NJTikgPyAwIDogMTsKKyAgIGNvbnN0IHVuc2lnbmVkIHNjc19tYXNrID0gKDFVIDw8IGNvbXBvbmVudCk7CisgICBpbnQgZG9uZV9tYXNrID0gfmRzdC53cml0ZW1hc2s7CisgICBzcmNfcmVnIHRtcDsKKworICAgYXNzZXJ0KG9wID09IE9QQ09ERV9TSU4gfHwgb3AgPT0gT1BDT0RFX0NPUyk7CisKKyAgIC8qIElmIHRoZXJlIGFyZSBjb21wbmVudHMgaW4gdGhlIGRlc3RpbmF0aW9uIHRoYXQgZGlmZmVyIGZyb20gdGhlIGNvbXBvbmVudAorICAgICogdGhhdCB3aWxsIGJlIHdyaXR0ZW4gYnkgdGhlIFNDUyBpbnN0cnV0aW9uLCB3ZSdsbCBuZWVkIGEgdGVtcG9yYXJ5LgorICAgICovCisgICBpZiAoc2NzX21hc2sgIT0gdW5zaWduZWQoZHN0LndyaXRlbWFzaykpIHsKKyAgICAgIHRtcCA9IGdldF90ZW1wKGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgIH0KKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgdW5zaWduZWQgdGhpc19tYXNrID0gKDFVIDw8IGkpOworICAgICAgc3JjX3JlZyBzcmMwID0gc3JjOworCisgICAgICBpZiAoKGRvbmVfbWFzayAmIHRoaXNfbWFzaykgIT0gMCkKKwkgY29udGludWU7CisKKyAgICAgIC8qIFRoZSBzb3VyY2Ugc3dpenpsZSBzcGVjaWZpZWQgd2hpY2ggY29tcG9uZW50IG9mIHRoZSBzb3VyY2UgZ2VuZXJhdGVzCisgICAgICAgKiBzaW5lIC8gY29zaW5lIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gdGhlIGRlc3RpbmF0aW9uLiAgVGhlIFNDUworICAgICAgICogaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgdGhhdCB0aGlzIHZhbHVlIGJlIHN3aXp6bGUgdG8gdGhlIFggY29tcG9uZW50LgorICAgICAgICogUmVwbGFjZSB0aGUgY3VycmVudCBzd2l6emxlIHdpdGggYSBzd2l6emxlIHRoYXQgcHV0cyB0aGUgc291cmNlIGluCisgICAgICAgKiB0aGUgWCBjb21wb25lbnQuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIHNyYzBfc3dpeiA9IEdFVF9TV1ooc3JjLnN3aXp6bGUsIGkpOworCisgICAgICBzcmMwLnN3aXp6bGUgPSBNQUtFX1NXSVpaTEU0KHNyYzBfc3dpeiwgc3JjMF9zd2l6LAorCQkJCSAgIHNyYzBfc3dpeiwgc3JjMF9zd2l6KTsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IGkgKyAxOyBqIDwgNDsgaisrKSB7CisJIC8qIElmIHRoZXJlIGlzIGFub3RoZXIgZW5hYmxlZCBjb21wb25lbnQgaW4gdGhlIGRlc3RpbmF0aW9uIHRoYXQgaXMKKwkgICogZGVyaXZlZCBmcm9tIHRoZSBzYW1lIGlucHV0cywgZ2VuZXJhdGUgaXRzIHZhbHVlIG9uIHRoaXMgcGFzcyBhcworCSAgKiB3ZWxsLgorCSAgKi8KKwkgaWYgKCEoZG9uZV9tYXNrICYgKDEgPDwgaikpICYmCisJICAgICBHRVRfU1daKHNyYzAuc3dpenpsZSwgaikgPT0gc3JjMF9zd2l6KSB7CisJICAgIHRoaXNfbWFzayB8PSAoMSA8PCBqKTsKKwkgfQorICAgICAgfQorCisgICAgICBpZiAodGhpc19tYXNrICE9IHNjc19tYXNrKSB7CisJIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKmluc3Q7CisJIGRzdF9yZWcgdG1wX2RzdCA9IGRzdF9yZWcodG1wKTsKKworCSAvKiBFbWl0IHRoZSBTQ1MgaW5zdHJ1Y3Rpb24uCisJICAqLworCSBpbnN0ID0gZW1pdChpciwgT1BDT0RFX1NDUywgdG1wX2RzdCwgc3JjMCk7CisJIGluc3QtPmRzdC53cml0ZW1hc2sgPSBzY3NfbWFzazsKKworCSAvKiBNb3ZlIHRoZSByZXN1bHQgb2YgdGhlIFNDUyBpbnN0cnVjdGlvbiB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbiBpbgorCSAgKiB0aGUgZGVzdGluYXRpb24uCisJICAqLworCSB0bXAuc3dpenpsZSA9IE1BS0VfU1dJWlpMRTQoY29tcG9uZW50LCBjb21wb25lbnQsCisJCQkJICAgICBjb21wb25lbnQsIGNvbXBvbmVudCk7CisJIGluc3QgPSBlbWl0KGlyLCBPUENPREVfU0NTLCBkc3QsIHRtcCk7CisJIGluc3QtPmRzdC53cml0ZW1hc2sgPSB0aGlzX21hc2s7CisgICAgICB9IGVsc2UgeworCSAvKiBFbWl0IHRoZSBTQ1MgaW5zdHJ1Y3Rpb24gdG8gd3JpdGUgZGlyZWN0bHkgdG8gdGhlIGRlc3RpbmF0aW9uLgorCSAgKi8KKwkgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoaXIsIE9QQ09ERV9TQ1MsIGRzdCwgc3JjMCk7CisJIGluc3QtPmRzdC53cml0ZW1hc2sgPSBzY3NfbWFzazsKKyAgICAgIH0KKworICAgICAgZG9uZV9tYXNrIHw9IHRoaXNfbWFzazsKKyAgIH0KK30KKworc3JjX3JlZworaXJfdG9fbWVzYV92aXNpdG9yOjpzcmNfcmVnX2Zvcl9mbG9hdChmbG9hdCB2YWwpCit7CisgICBzcmNfcmVnIHNyYyhQUk9HUkFNX0NPTlNUQU5ULCAtMSwgTlVMTCk7CisKKyAgIHNyYy5pbmRleCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHRoaXMtPnByb2ctPlBhcmFtZXRlcnMsCisJCQkJCSAgKGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlICopJnZhbCwgMSwgJnNyYy5zd2l6emxlKTsKKworICAgcmV0dXJuIHNyYzsKK30KKworc3RhdGljIGludAordHlwZV9zaXplKGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICB1bnNpZ25lZCBpbnQgaTsKKyAgIGludCBzaXplOworCisgICBzd2l0Y2ggKHR5cGUtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIGlmICh0eXBlLT5pc19tYXRyaXgoKSkgeworCSByZXR1cm4gdHlwZS0+bWF0cml4X2NvbHVtbnM7CisgICAgICB9IGVsc2UgeworCSAvKiBSZWdhcmRsZXNzIG9mIHNpemUgb2YgdmVjdG9yLCBpdCBnZXRzIGEgdmVjNC4gVGhpcyBpcyBiYWQKKwkgICogcGFja2luZyBmb3IgdGhpbmdzIGxpa2UgZmxvYXRzLCBidXQgb3RoZXJ3aXNlIGFycmF5cyBiZWNvbWUgYQorCSAgKiBtZXNzLiAgSG9wZWZ1bGx5IGEgbGF0ZXIgcGFzcyBvdmVyIHRoZSBjb2RlIGNhbiBwYWNrIHNjYWxhcnMKKwkgICogZG93biBpZiBhcHByb3ByaWF0ZS4KKwkgICovCisJIHJldHVybiAxOworICAgICAgfQorICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6CisgICAgICBhc3NlcnQodHlwZS0+bGVuZ3RoID4gMCk7CisgICAgICByZXR1cm4gdHlwZV9zaXplKHR5cGUtPmZpZWxkcy5hcnJheSkgKiB0eXBlLT5sZW5ndGg7CisgICBjYXNlIEdMU0xfVFlQRV9TVFJVQ1Q6CisgICAgICBzaXplID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0eXBlLT5sZW5ndGg7IGkrKykgeworCSBzaXplICs9IHR5cGVfc2l6ZSh0eXBlLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHNpemU7CisgICBjYXNlIEdMU0xfVFlQRV9TQU1QTEVSOgorICAgY2FzZSBHTFNMX1RZUEVfSU1BR0U6CisgICAgICAvKiBTYW1wbGVycyB0YWtlIHVwIG9uZSBzbG90IGluIFVOSUZPUk1TW10sIGJ1dCB0aGV5J3JlIGJha2VkIGluCisgICAgICAgKiBhdCBsaW5rIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHJldHVybiAxOworICAgY2FzZSBHTFNMX1RZUEVfQVRPTUlDX1VJTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICBjYXNlIEdMU0xfVFlQRV9JTlRFUkZBQ0U6CisgICAgICBhc3NlcnQoISJJbnZhbGlkIHR5cGUgaW4gdHlwZV9zaXplIik7CisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW4gdGhlIGluaXRpYWwgcGFzcyBvZiBjb2RlZ2VuLCB3ZSBhc3NpZ24gdGVtcG9yYXJ5IG51bWJlcnMgdG8KKyAqIGludGVybWVkaWF0ZSByZXN1bHRzLiAgKG5vdCBTU0EgLS0gdmFyaWFibGUgYXNzaWdubWVudHMgd2lsbCByZXVzZQorICogc3RvcmFnZSkuICBBY3R1YWwgcmVnaXN0ZXIgYWxsb2NhdGlvbiBmb3IgdGhlIE1lc2EgVk0gb2NjdXJzIGluIGEKKyAqIHBhc3Mgb3ZlciB0aGUgTWVzYSBJUiBsYXRlci4KKyAqLworc3JjX3JlZworaXJfdG9fbWVzYV92aXNpdG9yOjpnZXRfdGVtcChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBzcmNfcmVnIHNyYzsKKworICAgc3JjLmZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKyAgIHNyYy5pbmRleCA9IG5leHRfdGVtcDsKKyAgIHNyYy5yZWxhZGRyID0gTlVMTDsKKyAgIG5leHRfdGVtcCArPSB0eXBlX3NpemUodHlwZSk7CisKKyAgIGlmICh0eXBlLT5pc19hcnJheSgpIHx8IHR5cGUtPmlzX3JlY29yZCgpKSB7CisgICAgICBzcmMuc3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIH0gZWxzZSB7CisgICAgICBzcmMuc3dpenpsZSA9IHN3aXp6bGVfZm9yX3NpemUodHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgIH0KKyAgIHNyYy5uZWdhdGUgPSAwOworCisgICByZXR1cm4gc3JjOworfQorCit2YXJpYWJsZV9zdG9yYWdlICoKK2lyX3RvX21lc2FfdmlzaXRvcjo6ZmluZF92YXJpYWJsZV9zdG9yYWdlKGNvbnN0IGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICB2YXJpYWJsZV9zdG9yYWdlICplbnRyeTsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT52YXJpYWJsZXMpIHsKKyAgICAgIGVudHJ5ID0gKHZhcmlhYmxlX3N0b3JhZ2UgKikgbm9kZTsKKworICAgICAgaWYgKGVudHJ5LT52YXIgPT0gdmFyKQorCSByZXR1cm4gZW50cnk7CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorCit2b2lkCitpcl90b19tZXNhX3Zpc2l0b3I6OnZpc2l0KGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIGlmIChzdHJjbXAoaXItPm5hbWUsICJnbF9GcmFnQ29vcmQiKSA9PSAwKSB7CisgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSAoc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKil0aGlzLT5wcm9nOworCisgICAgICBmcC0+T3JpZ2luVXBwZXJMZWZ0ID0gaXItPmRhdGEub3JpZ2luX3VwcGVyX2xlZnQ7CisgICAgICBmcC0+UGl4ZWxDZW50ZXJJbnRlZ2VyID0gaXItPmRhdGEucGl4ZWxfY2VudGVyX2ludGVnZXI7CisgICB9CisKKyAgIGlmIChpci0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtICYmIHN0cm5jbXAoaXItPm5hbWUsICJnbF8iLCAzKSA9PSAwKSB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgIGNvbnN0IGlyX3N0YXRlX3Nsb3QgKmNvbnN0IHNsb3RzID0gaXItPnN0YXRlX3Nsb3RzOworICAgICAgYXNzZXJ0KGlyLT5zdGF0ZV9zbG90cyAhPSBOVUxMKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhpcyBzdGF0ZXZhcidzIHNldHVwIGluIHRoZSBTVEFURSBmaWxlIGV4YWN0bHkKKyAgICAgICAqIG1hdGNoZXMgaG93IHdlJ2xsIHdhbnQgdG8gcmVmZXJlbmNlIGl0IGFzIGEKKyAgICAgICAqIHN0cnVjdC9hcnJheS93aGF0ZXZlci4gIElmIG5vdCwgdGhlbiB3ZSBuZWVkIHRvIG1vdmUgaXQgaW50bworICAgICAgICogdGVtcG9yYXJ5IHN0b3JhZ2UgYW5kIGhvcGUgdGhhdCBpdCdsbCBnZXQgY29weS1wcm9wYWdhdGVkCisgICAgICAgKiBvdXQuCisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpci0+bnVtX3N0YXRlX3Nsb3RzOyBpKyspIHsKKwkgaWYgKHNsb3RzW2ldLnN3aXp6bGUgIT0gU1dJWlpMRV9YWVpXKSB7CisJICAgIGJyZWFrOworCSB9CisgICAgICB9CisKKyAgICAgIHZhcmlhYmxlX3N0b3JhZ2UgKnN0b3JhZ2U7CisgICAgICBkc3RfcmVnIGRzdDsKKyAgICAgIGlmIChpID09IGlyLT5udW1fc3RhdGVfc2xvdHMpIHsKKwkgLyogV2UnbGwgc2V0IHRoZSBpbmRleCBsYXRlci4gKi8KKwkgc3RvcmFnZSA9IG5ldyhtZW1fY3R4KSB2YXJpYWJsZV9zdG9yYWdlKGlyLCBQUk9HUkFNX1NUQVRFX1ZBUiwgLTEpOworCSB0aGlzLT52YXJpYWJsZXMucHVzaF90YWlsKHN0b3JhZ2UpOworCisJIGRzdCA9IHVuZGVmX2RzdDsKKyAgICAgIH0gZWxzZSB7CisJIC8qIFRoZSB2YXJpYWJsZV9zdG9yYWdlIGNvbnN0cnVjdG9yIGFsbG9jYXRlcyBzbG90cyBiYXNlZCBvbiB0aGUgc2l6ZQorCSAgKiBvZiB0aGUgdHlwZS4gIEhvd2V2ZXIsIHRoaXMgaGFkIGJldHRlciBtYXRjaCB0aGUgbnVtYmVyIG9mIHN0YXRlCisJICAqIGVsZW1lbnRzIHRoYXQgd2UncmUgZ29pbmcgdG8gY29weSBpbnRvIHRoZSBuZXcgdGVtcG9yYXJ5LgorCSAgKi8KKwkgYXNzZXJ0KChpbnQpIGlyLT5udW1fc3RhdGVfc2xvdHMgPT0gdHlwZV9zaXplKGlyLT50eXBlKSk7CisKKwkgc3RvcmFnZSA9IG5ldyhtZW1fY3R4KSB2YXJpYWJsZV9zdG9yYWdlKGlyLCBQUk9HUkFNX1RFTVBPUkFSWSwKKwkJCQkJCSB0aGlzLT5uZXh0X3RlbXApOworCSB0aGlzLT52YXJpYWJsZXMucHVzaF90YWlsKHN0b3JhZ2UpOworCSB0aGlzLT5uZXh0X3RlbXAgKz0gdHlwZV9zaXplKGlyLT50eXBlKTsKKworCSBkc3QgPSBkc3RfcmVnKHNyY19yZWcoUFJPR1JBTV9URU1QT1JBUlksIHN0b3JhZ2UtPmluZGV4LCBOVUxMKSk7CisgICAgICB9CisKKworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBpci0+bnVtX3N0YXRlX3Nsb3RzOyBpKyspIHsKKwkgaW50IGluZGV4ID0gX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZSh0aGlzLT5wcm9nLT5QYXJhbWV0ZXJzLAorCQkJCQkgICAgICAgKGdsX3N0YXRlX2luZGV4ICopc2xvdHNbaV0udG9rZW5zKTsKKworCSBpZiAoc3RvcmFnZS0+ZmlsZSA9PSBQUk9HUkFNX1NUQVRFX1ZBUikgeworCSAgICBpZiAoc3RvcmFnZS0+aW5kZXggPT0gLTEpIHsKKwkgICAgICAgc3RvcmFnZS0+aW5kZXggPSBpbmRleDsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgYXNzZXJ0KGluZGV4ID09IHN0b3JhZ2UtPmluZGV4ICsgKGludClpKTsKKwkgICAgfQorCSB9IGVsc2UgeworCSAgICBzcmNfcmVnIHNyYyhQUk9HUkFNX1NUQVRFX1ZBUiwgaW5kZXgsIE5VTEwpOworCSAgICBzcmMuc3dpenpsZSA9IHNsb3RzW2ldLnN3aXp6bGU7CisJICAgIGVtaXQoaXIsIE9QQ09ERV9NT1YsIGRzdCwgc3JjKTsKKwkgICAgLyogZXZlbiBhIGZsb2F0IHRha2VzIHVwIGEgd2hvbGUgdmVjNCByZWcgaW4gYSBzdHJ1Y3QvYXJyYXkuICovCisJICAgIGRzdC5pbmRleCsrOworCSB9CisgICAgICB9CisKKyAgICAgIGlmIChzdG9yYWdlLT5maWxlID09IFBST0dSQU1fVEVNUE9SQVJZICYmCisJICBkc3QuaW5kZXggIT0gc3RvcmFnZS0+aW5kZXggKyAoaW50KSBpci0+bnVtX3N0YXRlX3Nsb3RzKSB7CisJIGxpbmtlcl9lcnJvcih0aGlzLT5zaGFkZXJfcHJvZ3JhbSwKKwkJICAgICAgImZhaWxlZCB0byBsb2FkIGJ1aWx0aW4gdW5pZm9ybSBgJXMnICIKKwkJICAgICAgIiglZC8lZCByZWdzIGxvYWRlZClcbiIsCisJCSAgICAgIGlyLT5uYW1lLCBkc3QuaW5kZXggLSBzdG9yYWdlLT5pbmRleCwKKwkJICAgICAgdHlwZV9zaXplKGlyLT50eXBlKSk7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfbG9vcCAqaXIpCit7CisgICBlbWl0KE5VTEwsIE9QQ09ERV9CR05MT09QKTsKKworICAgdmlzaXRfZXhlY19saXN0KCZpci0+Ym9keV9pbnN0cnVjdGlvbnMsIHRoaXMpOworCisgICBlbWl0KE5VTEwsIE9QQ09ERV9FTkRMT09QKTsKK30KKwordm9pZAoraXJfdG9fbWVzYV92aXNpdG9yOjp2aXNpdChpcl9sb29wX2p1bXAgKmlyKQoreworICAgc3dpdGNoIChpci0+bW9kZSkgeworICAgY2FzZSBpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWs6CisgICAgICBlbWl0KE5VTEwsIE9QQ09ERV9CUkspOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2xvb3BfanVtcDo6anVtcF9jb250aW51ZToKKyAgICAgIGVtaXQoTlVMTCwgT1BDT0RFX0NPTlQpOworICAgICAgYnJlYWs7CisgICB9Cit9CisKKwordm9pZAoraXJfdG9fbWVzYV92aXNpdG9yOjp2aXNpdChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgYXNzZXJ0KDApOworICAgKHZvaWQpaXI7Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfZnVuY3Rpb24gKmlyKQoreworICAgLyogSWdub3JlIGZ1bmN0aW9uIGJvZGllcyBvdGhlciB0aGFuIG1haW4oKSAtLSB3ZSBzaG91bGRuJ3Qgc2VlIGNhbGxzIHRvCisgICAgKiB0aGVtIHNpbmNlIHRoZXkgc2hvdWxkIGFsbCBiZSBpbmxpbmVkIGJlZm9yZSB3ZSBnZXQgdG8gaXJfdG9fbWVzYS4KKyAgICAqLworICAgaWYgKHN0cmNtcChpci0+bmFtZSwgIm1haW4iKSA9PSAwKSB7CisgICAgICBjb25zdCBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZzsKKyAgICAgIGV4ZWNfbGlzdCBlbXB0eTsKKworICAgICAgc2lnID0gaXItPm1hdGNoaW5nX3NpZ25hdHVyZShOVUxMLCAmZW1wdHkpOworCisgICAgICBhc3NlcnQoc2lnKTsKKworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsICZzaWctPmJvZHkpIHsKKwkgaXJfaW5zdHJ1Y3Rpb24gKmlyID0gKGlyX2luc3RydWN0aW9uICopIG5vZGU7CisKKwkgaXItPmFjY2VwdCh0aGlzKTsKKyAgICAgIH0KKyAgIH0KK30KKworYm9vbAoraXJfdG9fbWVzYV92aXNpdG9yOjp0cnlfZW1pdF9tYWQoaXJfZXhwcmVzc2lvbiAqaXIsIGludCBtdWxfb3BlcmFuZCkKK3sKKyAgIGludCBub25tdWxfb3BlcmFuZCA9IDEgLSBtdWxfb3BlcmFuZDsKKyAgIHNyY19yZWcgYSwgYiwgYzsKKworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IGlyLT5vcGVyYW5kc1ttdWxfb3BlcmFuZF0tPmFzX2V4cHJlc3Npb24oKTsKKyAgIGlmICghZXhwciB8fCBleHByLT5vcGVyYXRpb24gIT0gaXJfYmlub3BfbXVsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBleHByLT5vcGVyYW5kc1swXS0+YWNjZXB0KHRoaXMpOworICAgYSA9IHRoaXMtPnJlc3VsdDsKKyAgIGV4cHItPm9wZXJhbmRzWzFdLT5hY2NlcHQodGhpcyk7CisgICBiID0gdGhpcy0+cmVzdWx0OworICAgaXItPm9wZXJhbmRzW25vbm11bF9vcGVyYW5kXS0+YWNjZXB0KHRoaXMpOworICAgYyA9IHRoaXMtPnJlc3VsdDsKKworICAgdGhpcy0+cmVzdWx0ID0gZ2V0X3RlbXAoaXItPnR5cGUpOworICAgZW1pdChpciwgT1BDT0RFX01BRCwgZHN0X3JlZyh0aGlzLT5yZXN1bHQpLCBhLCBiLCBjKTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogRW1pdCBPUENPREVfTUFEKGEsIC1iLCBhKSBpbnN0ZWFkIG9mIEFORChhLCBOT1QoYikpCisgKgorICogVGhlIGxvZ2ljIHZhbHVlcyBhcmUgMS4wIGZvciB0cnVlIGFuZCAwLjAgZm9yIGZhbHNlLiAgTG9naWNhbC1hbmQgaXMKKyAqIGltcGxlbWVudGVkIHVzaW5nIG11bHRpcGxpY2F0aW9uLCBhbmQgbG9naWNhbC1vciBpcyBpbXBsZW1lbnRlZCB1c2luZworICogYWRkaXRpb24uICBMb2dpY2FsLW5vdCBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgKHRydWUgLSB4KSwgb3IgKDEuMCAtIHgpLgorICogQXMgcmVzdWx0LCB0aGUgbG9naWNhbCBleHByZXNzaW9uIChhICYgIWIpIGNhbiBiZSByZXdyaXR0ZW4gYXM6CisgKgorICogICAgIC0gYSAqICFiCisgKiAgICAgLSBhICogKDEgLSBiKQorICogICAgIC0gKGEgKiAxKSAtIChhICogYikKKyAqICAgICAtIGEgKyAtKGEgKiBiKQorICogICAgIC0gYSArIChhICogLWIpCisgKgorICogVGhpcyBmaW5hbCBleHByZXNzaW9uIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZSBNQUQoYSwgLWIsIGEpCisgKiBpbnN0cnVjdGlvbi4KKyAqLworYm9vbAoraXJfdG9fbWVzYV92aXNpdG9yOjp0cnlfZW1pdF9tYWRfZm9yX2FuZF9ub3QoaXJfZXhwcmVzc2lvbiAqaXIsIGludCB0cnlfb3BlcmFuZCkKK3sKKyAgIGNvbnN0IGludCBvdGhlcl9vcGVyYW5kID0gMSAtIHRyeV9vcGVyYW5kOworICAgc3JjX3JlZyBhLCBiOworCisgICBpcl9leHByZXNzaW9uICpleHByID0gaXItPm9wZXJhbmRzW3RyeV9vcGVyYW5kXS0+YXNfZXhwcmVzc2lvbigpOworICAgaWYgKCFleHByIHx8IGV4cHItPm9wZXJhdGlvbiAhPSBpcl91bm9wX2xvZ2ljX25vdCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaXItPm9wZXJhbmRzW290aGVyX29wZXJhbmRdLT5hY2NlcHQodGhpcyk7CisgICBhID0gdGhpcy0+cmVzdWx0OworICAgZXhwci0+b3BlcmFuZHNbMF0tPmFjY2VwdCh0aGlzKTsKKyAgIGIgPSB0aGlzLT5yZXN1bHQ7CisKKyAgIGIubmVnYXRlID0gfmIubmVnYXRlOworCisgICB0aGlzLT5yZXN1bHQgPSBnZXRfdGVtcChpci0+dHlwZSk7CisgICBlbWl0KGlyLCBPUENPREVfTUFELCBkc3RfcmVnKHRoaXMtPnJlc3VsdCksIGEsIGIsIGEpOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAoraXJfdG9fbWVzYV92aXNpdG9yOjp0cnlfZW1pdF9zYXQoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICAvKiBTYXR1cmF0ZXMgd2VyZSBvbmx5IGludHJvZHVjZWQgdG8gdmVydGV4IHByb2dyYW1zIGluCisgICAgKiBOVl92ZXJ0ZXhfcHJvZ3JhbTMsIHNvIGRvbid0IGdpdmUgdGhlbSB0byBkcml2ZXJzIGluIHRoZSBWUC4KKyAgICAqLworICAgaWYgKHRoaXMtPnByb2ctPlRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlyX3J2YWx1ZSAqc2F0X3NyYyA9IGlyLT5hc19ydmFsdWVfdG9fc2F0dXJhdGUoKTsKKyAgIGlmICghc2F0X3NyYykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgc2F0X3NyYy0+YWNjZXB0KHRoaXMpOworICAgc3JjX3JlZyBzcmMgPSB0aGlzLT5yZXN1bHQ7CisKKyAgIC8qIElmIHdlIGdlbmVyYXRlZCBhbiBleHByZXNzaW9uIGluc3RydWN0aW9uIGludG8gYSB0ZW1wb3JhcnkgaW4KKyAgICAqIHByb2Nlc3NpbmcgdGhlIHNhdHVyYXRlJ3Mgb3BlcmFuZCwgYXBwbHkgdGhlIHNhdHVyYXRlIHRvIHRoYXQKKyAgICAqIGluc3RydWN0aW9uLiAgT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIE1PViB0byBkbyB0aGUgc2F0dXJhdGUuCisgICAgKgorICAgICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBvbmx5IGRvIHRoaXMgb3B0aW1pemF0aW9uIGlmCisgICAgKiB0aGUgaW5zdHJ1Y3Rpb24gaW4gcXVlc3Rpb24gd2FzIHdoYXQgZ2VuZXJhdGVkIHNyYy0+cmVzdWx0LiAgRm9yCisgICAgKiBleGFtcGxlLCBpcl9kZXJlZmVyZW5jZV9hcnJheSBtaWdodCBnZW5lcmF0ZSBhIE1VTCBpbnN0cnVjdGlvbgorICAgICogdG8gY3JlYXRlIHRoZSByZWxhZGRyLCBhbmQgcmV0dXJuIHVzIGEgc3JjIHJlZyB1c2luZyB0aGF0CisgICAgKiByZWxhZGRyLiAgVGhhdCBNVUwgcmVzdWx0IGlzIG5vdCB0aGUgdmFsdWUgd2UncmUgdHJ5aW5nIHRvCisgICAgKiBzYXR1cmF0ZS4KKyAgICAqLworICAgaXJfZXhwcmVzc2lvbiAqc2F0X3NyY19leHByID0gc2F0X3NyYy0+YXNfZXhwcmVzc2lvbigpOworICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqbmV3X2luc3Q7CisgICBuZXdfaW5zdCA9IChpcl90b19tZXNhX2luc3RydWN0aW9uICopdGhpcy0+aW5zdHJ1Y3Rpb25zLmdldF90YWlsKCk7CisgICBpZiAoc2F0X3NyY19leHByICYmIChzYXRfc3JjX2V4cHItPm9wZXJhdGlvbiA9PSBpcl9iaW5vcF9tdWwgfHwKKwkJCXNhdF9zcmNfZXhwci0+b3BlcmF0aW9uID09IGlyX2Jpbm9wX2FkZCB8fAorCQkJc2F0X3NyY19leHByLT5vcGVyYXRpb24gPT0gaXJfYmlub3BfZG90KSkgeworICAgICAgbmV3X2luc3QtPnNhdHVyYXRlID0gdHJ1ZTsKKyAgIH0gZWxzZSB7CisgICAgICB0aGlzLT5yZXN1bHQgPSBnZXRfdGVtcChpci0+dHlwZSk7CisgICAgICBpcl90b19tZXNhX2luc3RydWN0aW9uICppbnN0OworICAgICAgaW5zdCA9IGVtaXQoaXIsIE9QQ09ERV9NT1YsIGRzdF9yZWcodGhpcy0+cmVzdWx0KSwgc3JjKTsKKyAgICAgIGluc3QtPnNhdHVyYXRlID0gdHJ1ZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6cmVsYWRkcl90b190ZW1wKGlyX2luc3RydWN0aW9uICppciwKKwkJCQkgICAgc3JjX3JlZyAqcmVnLCBpbnQgKm51bV9yZWxhZGRyKQoreworICAgaWYgKCFyZWctPnJlbGFkZHIpCisgICAgICByZXR1cm47CisKKyAgIGVtaXQoaXIsIE9QQ09ERV9BUkwsIGFkZHJlc3NfcmVnLCAqcmVnLT5yZWxhZGRyKTsKKworICAgaWYgKCpudW1fcmVsYWRkciAhPSAxKSB7CisgICAgICBzcmNfcmVnIHRlbXAgPSBnZXRfdGVtcChnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9NT1YsIGRzdF9yZWcodGVtcCksICpyZWcpOworICAgICAgKnJlZyA9IHRlbXA7CisgICB9CisKKyAgICgqbnVtX3JlbGFkZHIpLS07Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6ZW1pdF9zd3ooaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICAvKiBBc3N1bWUgdGhhdCB0aGUgdmVjdG9yIG9wZXJhdG9yIGlzIGluIGEgZm9ybSBjb21wYXRpYmxlIHdpdGggT1BDT0RFX1NXWi4KKyAgICAqIFRoaXMgbWVhbnMgdGhhdCBlYWNoIG9mIHRoZSBvcGVyYW5kcyBpcyBlaXRoZXIgYW4gaW1tZWRpYXRlIHZhbHVlIG9mIC0xLAorICAgICogMCwgb3IgMSwgb3IgaXMgYSBjb21wb25lbnQgZnJvbSBvbmUgc291cmNlIHJlZ2lzdGVyIChwb3NzaWJseSB3aXRoCisgICAgKiBuZWdhdGlvbikuCisgICAgKi8KKyAgIHVpbnQ4X3QgY29tcG9uZW50c1s0XSA9IHsgMCB9OworICAgYm9vbCBuZWdhdGVbNF0gPSB7IGZhbHNlIH07CisgICBpcl92YXJpYWJsZSAqdmFyID0gTlVMTDsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgaXJfcnZhbHVlICpvcCA9IGlyLT5vcGVyYW5kc1tpXTsKKworICAgICAgYXNzZXJ0KG9wLT50eXBlLT5pc19zY2FsYXIoKSk7CisKKyAgICAgIHdoaWxlIChvcCAhPSBOVUxMKSB7CisJIHN3aXRjaCAob3AtPmlyX3R5cGUpIHsKKwkgY2FzZSBpcl90eXBlX2NvbnN0YW50OiB7CisKKwkgICAgYXNzZXJ0KG9wLT50eXBlLT5pc19zY2FsYXIoKSk7CisKKwkgICAgY29uc3QgaXJfY29uc3RhbnQgKmNvbnN0IGMgPSBvcC0+YXNfY29uc3RhbnQoKTsKKwkgICAgaWYgKGMtPmlzX29uZSgpKSB7CisJICAgICAgIGNvbXBvbmVudHNbaV0gPSBTV0laWkxFX09ORTsKKwkgICAgfSBlbHNlIGlmIChjLT5pc196ZXJvKCkpIHsKKwkgICAgICAgY29tcG9uZW50c1tpXSA9IFNXSVpaTEVfWkVSTzsKKwkgICAgfSBlbHNlIGlmIChjLT5pc19uZWdhdGl2ZV9vbmUoKSkgeworCSAgICAgICBjb21wb25lbnRzW2ldID0gU1dJWlpMRV9PTkU7CisJICAgICAgIG5lZ2F0ZVtpXSA9IHRydWU7CisJICAgIH0gZWxzZSB7CisJICAgICAgIGFzc2VydCghIlNXWiBjb25zdGFudCBtdXN0IGJlIDAuMCBvciAxLjAuIik7CisJICAgIH0KKworCSAgICBvcCA9IE5VTEw7CisJICAgIGJyZWFrOworCSB9CisKKwkgY2FzZSBpcl90eXBlX2RlcmVmZXJlbmNlX3ZhcmlhYmxlOiB7CisJICAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpjb25zdCBkZXJlZiA9CisJICAgICAgIChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqKSBvcDsKKworCSAgICBhc3NlcnQoKHZhciA9PSBOVUxMKSB8fCAoZGVyZWYtPnZhciA9PSB2YXIpKTsKKwkgICAgY29tcG9uZW50c1tpXSA9IFNXSVpaTEVfWDsKKwkgICAgdmFyID0gZGVyZWYtPnZhcjsKKwkgICAgb3AgPSBOVUxMOworCSAgICBicmVhazsKKwkgfQorCisJIGNhc2UgaXJfdHlwZV9leHByZXNzaW9uOiB7CisJICAgIGlyX2V4cHJlc3Npb24gKmNvbnN0IGV4cHIgPSAoaXJfZXhwcmVzc2lvbiAqKSBvcDsKKworCSAgICBhc3NlcnQoZXhwci0+b3BlcmF0aW9uID09IGlyX3Vub3BfbmVnKTsKKwkgICAgbmVnYXRlW2ldID0gdHJ1ZTsKKworCSAgICBvcCA9IGV4cHItPm9wZXJhbmRzWzBdOworCSAgICBicmVhazsKKwkgfQorCisJIGNhc2UgaXJfdHlwZV9zd2l6emxlOiB7CisJICAgIGlyX3N3aXp6bGUgKmNvbnN0IHN3aXogPSAoaXJfc3dpenpsZSAqKSBvcDsKKworCSAgICBjb21wb25lbnRzW2ldID0gc3dpei0+bWFzay54OworCSAgICBvcCA9IHN3aXotPnZhbDsKKwkgICAgYnJlYWs7CisJIH0KKworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworCSAgICByZXR1cm47CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgYXNzZXJ0KHZhciAhPSBOVUxMKTsKKworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmNvbnN0IGRlcmVmID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworCisgICB0aGlzLT5yZXN1bHQuZmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworICAgZGVyZWYtPmFjY2VwdCh0aGlzKTsKKyAgIGlmICh0aGlzLT5yZXN1bHQuZmlsZSA9PSBQUk9HUkFNX1VOREVGSU5FRCkgeworICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IHRyZWUgZm9yIGV4cHJlc3Npb24gb3BlcmFuZDpcbiIpOworICAgICAgZGVyZWYtPnByaW50KCk7CisgICAgICBwcmludGYoIlxuIik7CisgICAgICBleGl0KDEpOworICAgfQorCisgICBzcmNfcmVnIHNyYzsKKworICAgc3JjID0gdGhpcy0+cmVzdWx0OworICAgc3JjLnN3aXp6bGUgPSBNQUtFX1NXSVpaTEU0KGNvbXBvbmVudHNbMF0sCisJCQkgICAgICAgY29tcG9uZW50c1sxXSwKKwkJCSAgICAgICBjb21wb25lbnRzWzJdLAorCQkJICAgICAgIGNvbXBvbmVudHNbM10pOworICAgc3JjLm5lZ2F0ZSA9ICgodW5zaWduZWQobmVnYXRlWzBdKSA8PCAwKQorCQkgfCAodW5zaWduZWQobmVnYXRlWzFdKSA8PCAxKQorCQkgfCAodW5zaWduZWQobmVnYXRlWzJdKSA8PCAyKQorCQkgfCAodW5zaWduZWQobmVnYXRlWzNdKSA8PCAzKSk7CisKKyAgIC8qIFN0b3JhZ2UgZm9yIG91ciByZXN1bHQuICBJZGVhbGx5IGZvciBhbiBhc3NpZ25tZW50IHdlJ2QgYmUgdXNpbmcgdGhlCisgICAgKiBhY3R1YWwgc3RvcmFnZSBmb3IgdGhlIHJlc3VsdCBoZXJlLCBpbnN0ZWFkLgorICAgICovCisgICBjb25zdCBzcmNfcmVnIHJlc3VsdF9zcmMgPSBnZXRfdGVtcChpci0+dHlwZSk7CisgICBkc3RfcmVnIHJlc3VsdF9kc3QgPSBkc3RfcmVnKHJlc3VsdF9zcmMpOworCisgICAvKiBMaW1pdCB3cml0ZXMgdG8gdGhlIGNoYW5uZWxzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHJlc3VsdF9zcmMgbGF0ZXIuCisgICAgKiBUaGlzIGRvZXMgbGltaXQgdGhpcyB0ZW1wJ3MgdXNlIGFzIGEgdGVtcG9yYXJ5IGZvciBtdWx0aS1pbnN0cnVjdGlvbgorICAgICogc2VxdWVuY2VzLgorICAgICovCisgICByZXN1bHRfZHN0LndyaXRlbWFzayA9ICgxIDw8IGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIC0gMTsKKworICAgZW1pdChpciwgT1BDT0RFX1NXWiwgcmVzdWx0X2RzdCwgc3JjKTsKKyAgIHRoaXMtPnJlc3VsdCA9IHJlc3VsdF9zcmM7Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICB1bnNpZ25lZCBpbnQgb3BlcmFuZDsKKyAgIHNyY19yZWcgb3BbRWxlbWVudHMoaXItPm9wZXJhbmRzKV07CisgICBzcmNfcmVnIHJlc3VsdF9zcmM7CisgICBkc3RfcmVnIHJlc3VsdF9kc3Q7CisKKyAgIC8qIFF1aWNrIHBlZXBob2xlOiBFbWl0IE9QQ09ERV9NQUQoYSwgYiwgYykgaW5zdGVhZCBvZiBBREQoTVVMKGEsIGIpLCBjKQorICAgICovCisgICBpZiAoaXItPm9wZXJhdGlvbiA9PSBpcl9iaW5vcF9hZGQpIHsKKyAgICAgIGlmICh0cnlfZW1pdF9tYWQoaXIsIDEpKQorCSByZXR1cm47CisgICAgICBpZiAodHJ5X2VtaXRfbWFkKGlyLCAwKSkKKwkgcmV0dXJuOworICAgfQorCisgICAvKiBRdWljayBwZWVwaG9sZTogRW1pdCBPUENPREVfTUFEKC1hLCAtYiwgYSkgaW5zdGVhZCBvZiBBTkQoYSwgTk9UKGIpKQorICAgICovCisgICBpZiAoaXItPm9wZXJhdGlvbiA9PSBpcl9iaW5vcF9sb2dpY19hbmQpIHsKKyAgICAgIGlmICh0cnlfZW1pdF9tYWRfZm9yX2FuZF9ub3QoaXIsIDEpKQorCSByZXR1cm47CisgICAgICBpZiAodHJ5X2VtaXRfbWFkX2Zvcl9hbmRfbm90KGlyLCAwKSkKKwkgcmV0dXJuOworICAgfQorCisgICBpZiAodHJ5X2VtaXRfc2F0KGlyKSkKKyAgICAgIHJldHVybjsKKworICAgaWYgKGlyLT5vcGVyYXRpb24gPT0gaXJfcXVhZG9wX3ZlY3RvcikgeworICAgICAgdGhpcy0+ZW1pdF9zd3ooaXIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3IgKG9wZXJhbmQgPSAwOyBvcGVyYW5kIDwgaXItPmdldF9udW1fb3BlcmFuZHMoKTsgb3BlcmFuZCsrKSB7CisgICAgICB0aGlzLT5yZXN1bHQuZmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworICAgICAgaXItPm9wZXJhbmRzW29wZXJhbmRdLT5hY2NlcHQodGhpcyk7CisgICAgICBpZiAodGhpcy0+cmVzdWx0LmZpbGUgPT0gUFJPR1JBTV9VTkRFRklORUQpIHsKKwkgcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IHRyZWUgZm9yIGV4cHJlc3Npb24gb3BlcmFuZDpcbiIpOworICAgICAgICAgaXItPm9wZXJhbmRzW29wZXJhbmRdLT5wcmludCgpOworICAgICAgICAgcHJpbnRmKCJcbiIpOworCSBleGl0KDEpOworICAgICAgfQorICAgICAgb3Bbb3BlcmFuZF0gPSB0aGlzLT5yZXN1bHQ7CisKKyAgICAgIC8qIE1hdHJpeCBleHByZXNzaW9uIG9wZXJhbmRzIHNob3VsZCBoYXZlIGJlZW4gYnJva2VuIGRvd24gdG8gdmVjdG9yCisgICAgICAgKiBvcGVyYXRpb25zIGFscmVhZHkuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCghaXItPm9wZXJhbmRzW29wZXJhbmRdLT50eXBlLT5pc19tYXRyaXgoKSk7CisgICB9CisKKyAgIGludCB2ZWN0b3JfZWxlbWVudHMgPSBpci0+b3BlcmFuZHNbMF0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsKKyAgIGlmIChpci0+b3BlcmFuZHNbMV0pIHsKKyAgICAgIHZlY3Rvcl9lbGVtZW50cyA9IE1BWDIodmVjdG9yX2VsZW1lbnRzLAorCQkJICAgICBpci0+b3BlcmFuZHNbMV0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICB9CisKKyAgIHRoaXMtPnJlc3VsdC5maWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisKKyAgIC8qIFN0b3JhZ2UgZm9yIG91ciByZXN1bHQuICBJZGVhbGx5IGZvciBhbiBhc3NpZ25tZW50IHdlJ2QgYmUgdXNpbmcKKyAgICAqIHRoZSBhY3R1YWwgc3RvcmFnZSBmb3IgdGhlIHJlc3VsdCBoZXJlLCBpbnN0ZWFkLgorICAgICovCisgICByZXN1bHRfc3JjID0gZ2V0X3RlbXAoaXItPnR5cGUpOworICAgLyogY29udmVuaWVuY2UgZm9yIHRoZSBlbWl0IGZ1bmN0aW9ucyBiZWxvdy4gKi8KKyAgIHJlc3VsdF9kc3QgPSBkc3RfcmVnKHJlc3VsdF9zcmMpOworICAgLyogTGltaXQgd3JpdGVzIHRvIHRoZSBjaGFubmVscyB0aGF0IHdpbGwgYmUgdXNlZCBieSByZXN1bHRfc3JjIGxhdGVyLgorICAgICogVGhpcyBkb2VzIGxpbWl0IHRoaXMgdGVtcCdzIHVzZSBhcyBhIHRlbXBvcmFyeSBmb3IgbXVsdGktaW5zdHJ1Y3Rpb24KKyAgICAqIHNlcXVlbmNlcy4KKyAgICAqLworICAgcmVzdWx0X2RzdC53cml0ZW1hc2sgPSAoMSA8PCBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKSAtIDE7CisKKyAgIHN3aXRjaCAoaXItPm9wZXJhdGlvbikgeworICAgY2FzZSBpcl91bm9wX2xvZ2ljX25vdDoKKyAgICAgIC8qIFByZXZpb3VzbHkgJ1NFUSBkc3QsIHNyYywgMC4wJyB3YXMgdXNlZCBmb3IgdGhpcy4gIEhvd2V2ZXIsIG1hbnkKKyAgICAgICAqIG9sZGVyIEdQVXMgaW1wbGVtZW50IFNFUSB1c2luZyBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgKGk5MTUgdXNlcyB0d28KKyAgICAgICAqIFNHRSBpbnN0cnVjdGlvbnMgYW5kIGEgTVVMIGluc3RydWN0aW9uKS4gIFNpbmNlIG91ciBsb2dpYyB2YWx1ZXMgYXJlCisgICAgICAgKiAwLjAgYW5kIDEuMCwgMS14IGFsc28gaW1wbGVtZW50cyAheC4KKyAgICAgICAqLworICAgICAgb3BbMF0ubmVnYXRlID0gfm9wWzBdLm5lZ2F0ZTsKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9BREQsIHJlc3VsdF9kc3QsIG9wWzBdLCBzcmNfcmVnX2Zvcl9mbG9hdCgxLjApKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX25lZzoKKyAgICAgIG9wWzBdLm5lZ2F0ZSA9IH5vcFswXS5uZWdhdGU7CisgICAgICByZXN1bHRfc3JjID0gb3BbMF07CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9hYnM6CisgICAgICBlbWl0KGlyLCBPUENPREVfQUJTLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9zaWduOgorICAgICAgZW1pdChpciwgT1BDT0RFX1NTRywgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfcmNwOgorICAgICAgZW1pdF9zY2FsYXIoaXIsIE9QQ09ERV9SQ1AsIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfZXhwMjoKKyAgICAgIGVtaXRfc2NhbGFyKGlyLCBPUENPREVfRVgyLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9leHA6CisgICBjYXNlIGlyX3Vub3BfbG9nOgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IHNob3VsZCBiZSBoYW5kbGVkIGJ5IGlyX2V4cGxvZ190b19leHBsb2cyIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9sb2cyOgorICAgICAgZW1pdF9zY2FsYXIoaXIsIE9QQ09ERV9MRzIsIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3NpbjoKKyAgICAgIGVtaXRfc2NhbGFyKGlyLCBPUENPREVfU0lOLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9jb3M6CisgICAgICBlbWl0X3NjYWxhcihpciwgT1BDT0RFX0NPUywgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3Bfc2luX3JlZHVjZWQ6CisgICAgICBlbWl0X3NjcyhpciwgT1BDT0RFX1NJTiwgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfY29zX3JlZHVjZWQ6CisgICAgICBlbWl0X3NjcyhpciwgT1BDT0RFX0NPUywgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9kRmR4OgorICAgICAgZW1pdChpciwgT1BDT0RFX0REWCwgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZEZkeToKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9ERFksIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfbm9pc2U6IHsKKyAgICAgIGNvbnN0IGVudW0gcHJvZ19vcGNvZGUgb3Bjb2RlID0KKwkgcHJvZ19vcGNvZGUoT1BDT0RFX05PSVNFMQorCQkgICAgICsgKGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKSAtIDEpOworICAgICAgYXNzZXJ0KChvcGNvZGUgPj0gT1BDT0RFX05PSVNFMSkgJiYgKG9wY29kZSA8PSBPUENPREVfTk9JU0U0KSk7CisKKyAgICAgIGVtaXQoaXIsIG9wY29kZSwgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfYmlub3BfYWRkOgorICAgICAgZW1pdChpciwgT1BDT0RFX0FERCwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9zdWI6CisgICAgICBlbWl0KGlyLCBPUENPREVfU1VCLCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbXVsOgorICAgICAgZW1pdChpciwgT1BDT0RFX01VTCwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9kaXY6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgaXJfZGl2X3RvX211bF9yY3AiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9tb2Q6CisgICAgICAvKiBGbG9hdGluZyBwb2ludCBzaG91bGQgYmUgbG93ZXJlZCBieSBNT0RfVE9fRlJBQ1QgaW4gdGhlIGNvbXBpbGVyLiAqLworICAgICAgYXNzZXJ0KGlyLT50eXBlLT5pc19pbnRlZ2VyKCkpOworICAgICAgZW1pdChpciwgT1BDT0RFX01VTCwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2xlc3M6CisgICAgICBlbWl0KGlyLCBPUENPREVfU0xULCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICAgICBlbWl0KGlyLCBPUENPREVfU0dULCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2xlcXVhbDoKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9TTEUsIHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfZ2VxdWFsOgorICAgICAgZW1pdChpciwgT1BDT0RFX1NHRSwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9lcXVhbDoKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9TRVEsIHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfbmVxdWFsOgorICAgICAgZW1pdChpciwgT1BDT0RFX1NORSwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9hbGxfZXF1YWw6CisgICAgICAvKiAiPT0iIG9wZXJhdG9yIHByb2R1Y2luZyBhIHNjYWxhciBib29sZWFuLiAqLworICAgICAgaWYgKGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfdmVjdG9yKCkgfHwKKwkgIGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+aXNfdmVjdG9yKCkpIHsKKwkgc3JjX3JlZyB0ZW1wID0gZ2V0X3RlbXAoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworCSBlbWl0KGlyLCBPUENPREVfU05FLCBkc3RfcmVnKHRlbXApLCBvcFswXSwgb3BbMV0pOworCisJIC8qIEFmdGVyIHRoZSBkb3QtcHJvZHVjdCwgdGhlIHZhbHVlIHdpbGwgYmUgYW4gaW50ZWdlciBvbiB0aGUKKwkgICogcmFuZ2UgWzAsNF0uICBaZXJvIGJlY29tZXMgMS4wLCBhbmQgcG9zaXRpdmUgdmFsdWVzIGJlY29tZSB6ZXJvLgorCSAgKi8KKwkgZW1pdF9kcChpciwgcmVzdWx0X2RzdCwgdGVtcCwgdGVtcCwgdmVjdG9yX2VsZW1lbnRzKTsKKworCSAvKiBOZWdhdGluZyB0aGUgcmVzdWx0IG9mIHRoZSBkb3QtcHJvZHVjdCBnaXZlcyB2YWx1ZXMgb24gdGhlIHJhbmdlCisJICAqIFstNCwgMF0uICBaZXJvIGJlY29tZXMgMS4wLCBhbmQgbmVnYXRpdmUgdmFsdWVzIGJlY29tZSB6ZXJvLiAgVGhpcworCSAgKiBhY2hpZXZlZCB1c2luZyBTR0UuCisJICAqLworCSBzcmNfcmVnIHNnZV9zcmMgPSByZXN1bHRfc3JjOworCSBzZ2Vfc3JjLm5lZ2F0ZSA9IH5zZ2Vfc3JjLm5lZ2F0ZTsKKwkgZW1pdChpciwgT1BDT0RFX1NHRSwgcmVzdWx0X2RzdCwgc2dlX3NyYywgc3JjX3JlZ19mb3JfZmxvYXQoMC4wKSk7CisgICAgICB9IGVsc2UgeworCSBlbWl0KGlyLCBPUENPREVfU0VRLCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2FueV9uZXF1YWw6CisgICAgICAvKiAiIT0iIG9wZXJhdG9yIHByb2R1Y2luZyBhIHNjYWxhciBib29sZWFuLiAqLworICAgICAgaWYgKGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfdmVjdG9yKCkgfHwKKwkgIGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+aXNfdmVjdG9yKCkpIHsKKwkgc3JjX3JlZyB0ZW1wID0gZ2V0X3RlbXAoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworCSBlbWl0KGlyLCBPUENPREVfU05FLCBkc3RfcmVnKHRlbXApLCBvcFswXSwgb3BbMV0pOworCisJIC8qIEFmdGVyIHRoZSBkb3QtcHJvZHVjdCwgdGhlIHZhbHVlIHdpbGwgYmUgYW4gaW50ZWdlciBvbiB0aGUKKwkgICogcmFuZ2UgWzAsNF0uICBaZXJvIHN0YXlzIHplcm8sIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgYmVjb21lIDEuMC4KKwkgICovCisJIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKmNvbnN0IGRwID0KKwkgICAgZW1pdF9kcChpciwgcmVzdWx0X2RzdCwgdGVtcCwgdGVtcCwgdmVjdG9yX2VsZW1lbnRzKTsKKwkgaWYgKHRoaXMtPnByb2ctPlRhcmdldCA9PSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQikgeworCSAgICAvKiBUaGUgY2xhbXBpbmcgdG8gWzAsMV0gY2FuIGJlIGRvbmUgZm9yIGZyZWUgaW4gdGhlIGZyYWdtZW50CisJICAgICAqIHNoYWRlciB3aXRoIGEgc2F0dXJhdGUuCisJICAgICAqLworCSAgICBkcC0+c2F0dXJhdGUgPSB0cnVlOworCSB9IGVsc2UgeworCSAgICAvKiBOZWdhdGluZyB0aGUgcmVzdWx0IG9mIHRoZSBkb3QtcHJvZHVjdCBnaXZlcyB2YWx1ZXMgb24gdGhlIHJhbmdlCisJICAgICAqIFstNCwgMF0uICBaZXJvIHN0YXlzIHplcm8sIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgYmVjb21lIDEuMC4gIFRoaXMKKwkgICAgICogYWNoaWV2ZWQgdXNpbmcgU0xULgorCSAgICAgKi8KKwkgICAgc3JjX3JlZyBzbHRfc3JjID0gcmVzdWx0X3NyYzsKKwkgICAgc2x0X3NyYy5uZWdhdGUgPSB+c2x0X3NyYy5uZWdhdGU7CisJICAgIGVtaXQoaXIsIE9QQ09ERV9TTFQsIHJlc3VsdF9kc3QsIHNsdF9zcmMsIHNyY19yZWdfZm9yX2Zsb2F0KDAuMCkpOworCSB9CisgICAgICB9IGVsc2UgeworCSBlbWl0KGlyLCBPUENPREVfU05FLCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9hbnk6IHsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3ZlY3RvcigpKTsKKworICAgICAgLyogQWZ0ZXIgdGhlIGRvdC1wcm9kdWN0LCB0aGUgdmFsdWUgd2lsbCBiZSBhbiBpbnRlZ2VyIG9uIHRoZQorICAgICAgICogcmFuZ2UgWzAsNF0uICBaZXJvIHN0YXlzIHplcm8sIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgYmVjb21lIDEuMC4KKyAgICAgICAqLworICAgICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqY29uc3QgZHAgPQorCSBlbWl0X2RwKGlyLCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMF0sCisJCSBpci0+b3BlcmFuZHNbMF0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICAgICBpZiAodGhpcy0+cHJvZy0+VGFyZ2V0ID09IEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCKSB7CisJIC8qIFRoZSBjbGFtcGluZyB0byBbMCwxXSBjYW4gYmUgZG9uZSBmb3IgZnJlZSBpbiB0aGUgZnJhZ21lbnQKKwkgICogc2hhZGVyIHdpdGggYSBzYXR1cmF0ZS4KKwkgICovCisJIGRwLT5zYXR1cmF0ZSA9IHRydWU7CisgICAgICB9IGVsc2UgeworCSAvKiBOZWdhdGluZyB0aGUgcmVzdWx0IG9mIHRoZSBkb3QtcHJvZHVjdCBnaXZlcyB2YWx1ZXMgb24gdGhlIHJhbmdlCisJICAqIFstNCwgMF0uICBaZXJvIHN0YXlzIHplcm8sIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgYmVjb21lIDEuMC4gIFRoaXMKKwkgICogaXMgYWNoaWV2ZWQgdXNpbmcgU0xULgorCSAgKi8KKwkgc3JjX3JlZyBzbHRfc3JjID0gcmVzdWx0X3NyYzsKKwkgc2x0X3NyYy5uZWdhdGUgPSB+c2x0X3NyYy5uZWdhdGU7CisJIGVtaXQoaXIsIE9QQ09ERV9TTFQsIHJlc3VsdF9kc3QsIHNsdF9zcmMsIHNyY19yZWdfZm9yX2Zsb2F0KDAuMCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfeG9yOgorICAgICAgZW1pdChpciwgT1BDT0RFX1NORSwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX29yOiB7CisgICAgICAvKiBBZnRlciB0aGUgYWRkaXRpb24sIHRoZSB2YWx1ZSB3aWxsIGJlIGFuIGludGVnZXIgb24gdGhlCisgICAgICAgKiByYW5nZSBbMCwyXS4gIFplcm8gc3RheXMgemVybywgYW5kIHBvc2l0aXZlIHZhbHVlcyBiZWNvbWUgMS4wLgorICAgICAgICovCisgICAgICBpcl90b19tZXNhX2luc3RydWN0aW9uICphZGQgPQorCSBlbWl0KGlyLCBPUENPREVfQURELCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgaWYgKHRoaXMtPnByb2ctPlRhcmdldCA9PSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQikgeworCSAvKiBUaGUgY2xhbXBpbmcgdG8gWzAsMV0gY2FuIGJlIGRvbmUgZm9yIGZyZWUgaW4gdGhlIGZyYWdtZW50CisJICAqIHNoYWRlciB3aXRoIGEgc2F0dXJhdGUuCisJICAqLworCSBhZGQtPnNhdHVyYXRlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisJIC8qIE5lZ2F0aW5nIHRoZSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uIGdpdmVzIHZhbHVlcyBvbiB0aGUgcmFuZ2UKKwkgICogWy0yLCAwXS4gIFplcm8gc3RheXMgemVybywgYW5kIG5lZ2F0aXZlIHZhbHVlcyBiZWNvbWUgMS4wLiAgVGhpcworCSAgKiBpcyBhY2hpZXZlZCB1c2luZyBTTFQuCisJICAqLworCSBzcmNfcmVnIHNsdF9zcmMgPSByZXN1bHRfc3JjOworCSBzbHRfc3JjLm5lZ2F0ZSA9IH5zbHRfc3JjLm5lZ2F0ZTsKKwkgZW1pdChpciwgT1BDT0RFX1NMVCwgcmVzdWx0X2RzdCwgc2x0X3NyYywgc3JjX3JlZ19mb3JfZmxvYXQoMC4wKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBpcl9iaW5vcF9sb2dpY19hbmQ6CisgICAgICAvKiB0aGUgYm9vbCBhcmdzIGFyZSBzdG9yZWQgYXMgZmxvYXQgMC4wIG9yIDEuMCwgc28gIm11bCIgZ2l2ZXMgdXMgImFuZCIuICovCisgICAgICBlbWl0KGlyLCBPUENPREVfTVVMLCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfZG90OgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfdmVjdG9yKCkpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMV0tPnR5cGUpOworICAgICAgZW1pdF9kcChpciwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdLAorCSAgICAgIGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfc3FydDoKKyAgICAgIC8qIHNxcnQoeCkgPSB4ICogcnNxKHgpLiAqLworICAgICAgZW1pdF9zY2FsYXIoaXIsIE9QQ09ERV9SU1EsIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9NVUwsIHJlc3VsdF9kc3QsIHJlc3VsdF9zcmMsIG9wWzBdKTsKKyAgICAgIC8qIEZvciBpbmNvbWluZyBjaGFubmVscyA8PSAwLCBzZXQgdGhlIHJlc3VsdCB0byAwLiAqLworICAgICAgb3BbMF0ubmVnYXRlID0gfm9wWzBdLm5lZ2F0ZTsKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9DTVAsIHJlc3VsdF9kc3QsCisJCQkgIG9wWzBdLCByZXN1bHRfc3JjLCBzcmNfcmVnX2Zvcl9mbG9hdCgwLjApKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3JzcToKKyAgICAgIGVtaXRfc2NhbGFyKGlyLCBPUENPREVfUlNRLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9pMmY6CisgICBjYXNlIGlyX3Vub3BfdTJmOgorICAgY2FzZSBpcl91bm9wX2IyZjoKKyAgIGNhc2UgaXJfdW5vcF9iMmk6CisgICBjYXNlIGlyX3Vub3BfaTJ1OgorICAgY2FzZSBpcl91bm9wX3UyaToKKyAgICAgIC8qIE1lc2EgSVIgbGFja3MgdHlwZXMsIGludHMgYXJlIHN0b3JlZCBhcyB0cnVuY2F0ZWQgZmxvYXRzLiAqLworICAgICAgcmVzdWx0X3NyYyA9IG9wWzBdOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZjJpOgorICAgY2FzZSBpcl91bm9wX2YydToKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9UUlVOQywgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZjJiOgorICAgY2FzZSBpcl91bm9wX2kyYjoKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9TTkUsIHJlc3VsdF9kc3QsCisJCQkgIG9wWzBdLCBzcmNfcmVnX2Zvcl9mbG9hdCgwLjApKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2JpdGNhc3RfZjJpOiAvLyBJZ25vcmUgdGhlc2UgNCwgdGhleSBjYW4ndCBoYXBwZW4gaGVyZSBhbnl3YXkKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2YydToKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2kyZjoKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X3UyZjoKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3RydW5jOgorICAgICAgZW1pdChpciwgT1BDT0RFX1RSVU5DLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9jZWlsOgorICAgICAgb3BbMF0ubmVnYXRlID0gfm9wWzBdLm5lZ2F0ZTsKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9GTFIsIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIHJlc3VsdF9zcmMubmVnYXRlID0gfnJlc3VsdF9zcmMubmVnYXRlOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZmxvb3I6CisgICAgICBlbWl0KGlyLCBPUENPREVfRkxSLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9mcmFjdDoKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9GUkMsIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Nub3JtXzR4ODoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Vub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfcGFja191bm9ybV80eDg6CisgICBjYXNlIGlyX3Vub3BfcGFja19oYWxmXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Nub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Nub3JtXzR4ODoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfdW5vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfdW5vcm1fNHg4OgorICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNl9zcGxpdF94OgorICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTZfc3BsaXRfeToKKyAgIGNhc2UgaXJfYmlub3BfcGFja19oYWxmXzJ4MTZfc3BsaXQ6CisgICBjYXNlIGlyX3Vub3BfYml0ZmllbGRfcmV2ZXJzZToKKyAgIGNhc2UgaXJfdW5vcF9iaXRfY291bnQ6CisgICBjYXNlIGlyX3Vub3BfZmluZF9tc2I6CisgICBjYXNlIGlyX3Vub3BfZmluZF9sc2I6CisgICAgICBhc3NlcnQoISJub3Qgc3VwcG9ydGVkIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfbWluOgorICAgICAgZW1pdChpciwgT1BDT0RFX01JTiwgcmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9tYXg6CisgICAgICBlbWl0KGlyLCBPUENPREVfTUFYLCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX3BvdzoKKyAgICAgIGVtaXRfc2NhbGFyKGlyLCBPUENPREVfUE9XLCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdMU0wgMS4zMCBpbnRlZ2VyIG9wcyBhcmUgdW5zdXBwb3J0ZWQgaW4gTWVzYSBJUiwgYnV0IHNpbmNlCisgICAgICAgKiBoYXJkd2FyZSBiYWNrZW5kcyBoYXZlIG5vIHdheSB0byBhdm9pZCBNZXNhIElSIGdlbmVyYXRpb24KKyAgICAgICAqIGV2ZW4gaWYgdGhleSBkb24ndCB1c2UgaXQsIHdlIG5lZWQgdG8gZW1pdCAic29tZXRoaW5nIiBhbmQKKyAgICAgICAqIGNvbnRpbnVlLgorICAgICAgICovCisgICBjYXNlIGlyX2Jpbm9wX2xzaGlmdDoKKyAgIGNhc2UgaXJfYmlub3BfcnNoaWZ0OgorICAgY2FzZSBpcl9iaW5vcF9iaXRfYW5kOgorICAgY2FzZSBpcl9iaW5vcF9iaXRfeG9yOgorICAgY2FzZSBpcl9iaW5vcF9iaXRfb3I6CisgICAgICBlbWl0KGlyLCBPUENPREVfQURELCByZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9iaXRfbm90OgorICAgY2FzZSBpcl91bm9wX3JvdW5kX2V2ZW46CisgICAgICBlbWl0KGlyLCBPUENPREVfTU9WLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF91Ym9fbG9hZDoKKyAgICAgIGFzc2VydCghIm5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2xycDoKKyAgICAgIC8qIGlyX3RyaW9wX2xycCBvcGVyYW5kcyBhcmUgKHgsIHksIGEpIHdoaWxlCisgICAgICAgKiBPUENPREVfTFJQIG9wZXJhbmRzIGFyZSAoYSwgeSwgeCkgdG8gbWF0Y2ggQVJCX2ZyYWdtZW50X3Byb2dyYW0uCisgICAgICAgKi8KKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9MUlAsIHJlc3VsdF9kc3QsIG9wWzJdLCBvcFsxXSwgb3BbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfdmVjdG9yX2V4dHJhY3Q6CisgICBjYXNlIGlyX2Jpbm9wX2JmbToKKyAgIGNhc2UgaXJfdHJpb3BfZm1hOgorICAgY2FzZSBpcl90cmlvcF9iZmk6CisgICBjYXNlIGlyX3RyaW9wX2JpdGZpZWxkX2V4dHJhY3Q6CisgICBjYXNlIGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQ6CisgICBjYXNlIGlyX3F1YWRvcF9iaXRmaWVsZF9pbnNlcnQ6CisgICBjYXNlIGlyX2Jpbm9wX2xkZXhwOgorICAgY2FzZSBpcl90cmlvcF9jc2VsOgorICAgY2FzZSBpcl9iaW5vcF9jYXJyeToKKyAgIGNhc2UgaXJfYmlub3BfYm9ycm93OgorICAgY2FzZSBpcl9iaW5vcF9pbXVsX2hpZ2g6CisgICAgICBhc3NlcnQoISJub3Qgc3VwcG9ydGVkIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9xdWFkb3BfdmVjdG9yOgorICAgICAgLyogVGhpcyBvcGVyYXRpb24gc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICBicmVhazsKKyAgIH0KKworICAgdGhpcy0+cmVzdWx0ID0gcmVzdWx0X3NyYzsKK30KKworCit2b2lkCitpcl90b19tZXNhX3Zpc2l0b3I6OnZpc2l0KGlyX3N3aXp6bGUgKmlyKQoreworICAgc3JjX3JlZyBzcmM7CisgICBpbnQgaTsKKyAgIGludCBzd2l6emxlWzRdOworCisgICAvKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHN3aXp6bGVzIGluIGV4cHJlc3Npb25zLCBub3QgdGhvc2Ugb24gdGhlIGxlZnQKKyAgICAqIGhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LCB3aGljaCBkbyB3cml0ZSBtYXNraW5nLiAgU2VlIGlyX2Fzc2lnbm1lbnQKKyAgICAqIGZvciB0aGF0LgorICAgICovCisKKyAgIGlyLT52YWwtPmFjY2VwdCh0aGlzKTsKKyAgIHNyYyA9IHRoaXMtPnJlc3VsdDsKKyAgIGFzc2VydChzcmMuZmlsZSAhPSBQUk9HUkFNX1VOREVGSU5FRCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIGlmIChpIDwgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgeworCSBzd2l0Y2ggKGkpIHsKKwkgY2FzZSAwOgorCSAgICBzd2l6emxlW2ldID0gR0VUX1NXWihzcmMuc3dpenpsZSwgaXItPm1hc2sueCk7CisJICAgIGJyZWFrOworCSBjYXNlIDE6CisJICAgIHN3aXp6bGVbaV0gPSBHRVRfU1daKHNyYy5zd2l6emxlLCBpci0+bWFzay55KTsKKwkgICAgYnJlYWs7CisJIGNhc2UgMjoKKwkgICAgc3dpenpsZVtpXSA9IEdFVF9TV1ooc3JjLnN3aXp6bGUsIGlyLT5tYXNrLnopOworCSAgICBicmVhazsKKwkgY2FzZSAzOgorCSAgICBzd2l6emxlW2ldID0gR0VUX1NXWihzcmMuc3dpenpsZSwgaXItPm1hc2sudyk7CisJICAgIGJyZWFrOworCSB9CisgICAgICB9IGVsc2UgeworCSAvKiBJZiB0aGUgdHlwZSBpcyBzbWFsbGVyIHRoYW4gYSB2ZWM0LCByZXBsaWNhdGUgdGhlIGxhc3QKKwkgICogY2hhbm5lbCBvdXQuCisJICAqLworCSBzd2l6emxlW2ldID0gc3dpenpsZVtpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzIC0gMV07CisgICAgICB9CisgICB9CisKKyAgIHNyYy5zd2l6emxlID0gTUFLRV9TV0laWkxFNChzd2l6emxlWzBdLCBzd2l6emxlWzFdLCBzd2l6emxlWzJdLCBzd2l6emxlWzNdKTsKKworICAgdGhpcy0+cmVzdWx0ID0gc3JjOworfQorCit2b2lkCitpcl90b19tZXNhX3Zpc2l0b3I6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIHZhcmlhYmxlX3N0b3JhZ2UgKmVudHJ5ID0gZmluZF92YXJpYWJsZV9zdG9yYWdlKGlyLT52YXIpOworICAgaXJfdmFyaWFibGUgKnZhciA9IGlyLT52YXI7CisKKyAgIGlmICghZW50cnkpIHsKKyAgICAgIHN3aXRjaCAodmFyLT5kYXRhLm1vZGUpIHsKKyAgICAgIGNhc2UgaXJfdmFyX3VuaWZvcm06CisJIGVudHJ5ID0gbmV3KG1lbV9jdHgpIHZhcmlhYmxlX3N0b3JhZ2UodmFyLCBQUk9HUkFNX1VOSUZPUk0sCisJCQkJCSAgICAgICB2YXItPmRhdGEubG9jYXRpb24pOworCSB0aGlzLT52YXJpYWJsZXMucHVzaF90YWlsKGVudHJ5KTsKKwkgYnJlYWs7CisgICAgICBjYXNlIGlyX3Zhcl9zaGFkZXJfaW46CisJIC8qIFRoZSBsaW5rZXIgYXNzaWducyBsb2NhdGlvbnMgZm9yIHZhcnlpbmdzIGFuZCBhdHRyaWJ1dGVzLAorCSAgKiBpbmNsdWRpbmcgZGVwcmVjYXRlZCBidWlsdGlucyAobGlrZSBnbF9Db2xvciksCisJICAqIHVzZXItYXNzaWduZWQgZ2VuZXJpYyBhdHRyaWJ1dGVzIChnbEJpbmRWZXJ0ZXhMb2NhdGlvbiksCisJICAqIGFuZCB1c2VyLWRlZmluZWQgdmFyeWluZ3MuCisJICAqLworCSBhc3NlcnQodmFyLT5kYXRhLmxvY2F0aW9uICE9IC0xKTsKKyAgICAgICAgIGVudHJ5ID0gbmV3KG1lbV9jdHgpIHZhcmlhYmxlX3N0b3JhZ2UodmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9HUkFNX0lOUFVULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPmRhdGEubG9jYXRpb24pOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGlyX3Zhcl9zaGFkZXJfb3V0OgorCSBhc3NlcnQodmFyLT5kYXRhLmxvY2F0aW9uICE9IC0xKTsKKyAgICAgICAgIGVudHJ5ID0gbmV3KG1lbV9jdHgpIHZhcmlhYmxlX3N0b3JhZ2UodmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9HUkFNX09VVFBVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIGlyX3Zhcl9zeXN0ZW1fdmFsdWU6CisgICAgICAgICBlbnRyeSA9IG5ldyhtZW1fY3R4KSB2YXJpYWJsZV9zdG9yYWdlKHZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPR1JBTV9TWVNURU1fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaXJfdmFyX2F1dG86CisgICAgICBjYXNlIGlyX3Zhcl90ZW1wb3Jhcnk6CisJIGVudHJ5ID0gbmV3KG1lbV9jdHgpIHZhcmlhYmxlX3N0b3JhZ2UodmFyLCBQUk9HUkFNX1RFTVBPUkFSWSwKKwkJCQkJICAgICAgIHRoaXMtPm5leHRfdGVtcCk7CisJIHRoaXMtPnZhcmlhYmxlcy5wdXNoX3RhaWwoZW50cnkpOworCisJIG5leHRfdGVtcCArPSB0eXBlX3NpemUodmFyLT50eXBlKTsKKwkgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghZW50cnkpIHsKKwkgcHJpbnRmKCJGYWlsZWQgdG8gbWFrZSBzdG9yYWdlIGZvciAlc1xuIiwgdmFyLT5uYW1lKTsKKwkgZXhpdCgxKTsKKyAgICAgIH0KKyAgIH0KKworICAgdGhpcy0+cmVzdWx0ID0gc3JjX3JlZyhlbnRyeS0+ZmlsZSwgZW50cnktPmluZGV4LCB2YXItPnR5cGUpOworfQorCit2b2lkCitpcl90b19tZXNhX3Zpc2l0b3I6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKK3sKKyAgIGlyX2NvbnN0YW50ICppbmRleDsKKyAgIHNyY19yZWcgc3JjOworICAgaW50IGVsZW1lbnRfc2l6ZSA9IHR5cGVfc2l6ZShpci0+dHlwZSk7CisKKyAgIGluZGV4ID0gaXItPmFycmF5X2luZGV4LT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisKKyAgIGlyLT5hcnJheS0+YWNjZXB0KHRoaXMpOworICAgc3JjID0gdGhpcy0+cmVzdWx0OworCisgICBpZiAoaW5kZXgpIHsKKyAgICAgIHNyYy5pbmRleCArPSBpbmRleC0+dmFsdWUuaVswXSAqIGVsZW1lbnRfc2l6ZTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBWYXJpYWJsZSBpbmRleCBhcnJheSBkZXJlZmVyZW5jZS4gIEl0IGVhdHMgdGhlICJ2ZWM0IiBvZiB0aGUKKyAgICAgICAqIGJhc2Ugb2YgdGhlIGFycmF5IGFuZCBhbiBpbmRleCB0aGF0IG9mZnNldHMgdGhlIE1lc2EgcmVnaXN0ZXIKKyAgICAgICAqIGluZGV4LgorICAgICAgICovCisgICAgICBpci0+YXJyYXlfaW5kZXgtPmFjY2VwdCh0aGlzKTsKKworICAgICAgc3JjX3JlZyBpbmRleF9yZWc7CisKKyAgICAgIGlmIChlbGVtZW50X3NpemUgPT0gMSkgeworCSBpbmRleF9yZWcgPSB0aGlzLT5yZXN1bHQ7CisgICAgICB9IGVsc2UgeworCSBpbmRleF9yZWcgPSBnZXRfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworCisJIGVtaXQoaXIsIE9QQ09ERV9NVUwsIGRzdF9yZWcoaW5kZXhfcmVnKSwKKwkgICAgICB0aGlzLT5yZXN1bHQsIHNyY19yZWdfZm9yX2Zsb2F0KGVsZW1lbnRfc2l6ZSkpOworICAgICAgfQorCisgICAgICAvKiBJZiB0aGVyZSB3YXMgYWxyZWFkeSBhIHJlbGF0aXZlIGFkZHJlc3MgcmVnaXN0ZXIgaW52b2x2ZWQsIGFkZCB0aGUKKyAgICAgICAqIG5ldyBhbmQgdGhlIG9sZCB0b2dldGhlciB0byBnZXQgdGhlIG5ldyBvZmZzZXQuCisgICAgICAgKi8KKyAgICAgIGlmIChzcmMucmVsYWRkciAhPSBOVUxMKSAgeworCSBzcmNfcmVnIGFjY3VtX3JlZyA9IGdldF90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisKKwkgZW1pdChpciwgT1BDT0RFX0FERCwgZHN0X3JlZyhhY2N1bV9yZWcpLAorCSAgICAgIGluZGV4X3JlZywgKnNyYy5yZWxhZGRyKTsKKworCSBpbmRleF9yZWcgPSBhY2N1bV9yZWc7CisgICAgICB9CisKKyAgICAgIHNyYy5yZWxhZGRyID0gcmFsbG9jKG1lbV9jdHgsIHNyY19yZWcpOworICAgICAgbWVtY3B5KHNyYy5yZWxhZGRyLCAmaW5kZXhfcmVnLCBzaXplb2YoaW5kZXhfcmVnKSk7CisgICB9CisKKyAgIC8qIElmIHRoZSB0eXBlIGlzIHNtYWxsZXIgdGhhbiBhIHZlYzQsIHJlcGxpY2F0ZSB0aGUgbGFzdCBjaGFubmVsIG91dC4gKi8KKyAgIGlmIChpci0+dHlwZS0+aXNfc2NhbGFyKCkgfHwgaXItPnR5cGUtPmlzX3ZlY3RvcigpKQorICAgICAgc3JjLnN3aXp6bGUgPSBzd2l6emxlX2Zvcl9zaXplKGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworICAgZWxzZQorICAgICAgc3JjLnN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisKKyAgIHRoaXMtPnJlc3VsdCA9IHNyYzsKK30KKwordm9pZAoraXJfdG9fbWVzYV92aXNpdG9yOjp2aXNpdChpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmlyKQoreworICAgdW5zaWduZWQgaW50IGk7CisgICBjb25zdCBnbHNsX3R5cGUgKnN0cnVjdF90eXBlID0gaXItPnJlY29yZC0+dHlwZTsKKyAgIGludCBvZmZzZXQgPSAwOworCisgICBpci0+cmVjb3JkLT5hY2NlcHQodGhpcyk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBzdHJ1Y3RfdHlwZS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAoc3RydWN0X3R5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSwgaXItPmZpZWxkKSA9PSAwKQorCSBicmVhazsKKyAgICAgIG9mZnNldCArPSB0eXBlX3NpemUoc3RydWN0X3R5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSk7CisgICB9CisKKyAgIC8qIElmIHRoZSB0eXBlIGlzIHNtYWxsZXIgdGhhbiBhIHZlYzQsIHJlcGxpY2F0ZSB0aGUgbGFzdCBjaGFubmVsIG91dC4gKi8KKyAgIGlmIChpci0+dHlwZS0+aXNfc2NhbGFyKCkgfHwgaXItPnR5cGUtPmlzX3ZlY3RvcigpKQorICAgICAgdGhpcy0+cmVzdWx0LnN3aXp6bGUgPSBzd2l6emxlX2Zvcl9zaXplKGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworICAgZWxzZQorICAgICAgdGhpcy0+cmVzdWx0LnN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisKKyAgIHRoaXMtPnJlc3VsdC5pbmRleCArPSBvZmZzZXQ7Cit9CisKKy8qKgorICogV2Ugd2FudCB0byBiZSBjYXJlZnVsIGluIGFzc2lnbm1lbnQgc2V0dXAgdG8gaGl0IHRoZSBhY3R1YWwgc3RvcmFnZQorICogaW5zdGVhZCBvZiBwb3RlbnRpYWxseSB1c2luZyBhIHRlbXBvcmFyeSBsaWtlIHdlIG1pZ2h0IHdpdGggdGhlCisgKiBpcl9kZXJlZmVyZW5jZSBoYW5kbGVyLgorICovCitzdGF0aWMgZHN0X3JlZworZ2V0X2Fzc2lnbm1lbnRfbGhzKGlyX2RlcmVmZXJlbmNlICppciwgaXJfdG9fbWVzYV92aXNpdG9yICp2KQoreworICAgLyogVGhlIExIUyBtdXN0IGJlIGEgZGVyZWZlcmVuY2UuICBJZiB0aGUgTEhTIGlzIGEgdmFyaWFibGUgaW5kZXhlZCBhcnJheQorICAgICogYWNjZXNzIG9mIGEgdmVjdG9yLCBpdCBtdXN0IGJlIHNlcGFyYXRlZCBpbnRvIGEgc2VyaWVzIGNvbmRpdGlvbmFsIG1vdmVzCisgICAgKiBiZWZvcmUgcmVhY2hpbmcgdGhpcyBwb2ludCAoc2VlIGlyX3ZlY19pbmRleF90b19jb25kX2Fzc2lnbikuCisgICAgKi8KKyAgIGFzc2VydChpci0+YXNfZGVyZWZlcmVuY2UoKSk7CisgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqZGVyZWZfYXJyYXkgPSBpci0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKTsKKyAgIGlmIChkZXJlZl9hcnJheSkgeworICAgICAgYXNzZXJ0KCFkZXJlZl9hcnJheS0+YXJyYXktPnR5cGUtPmlzX3ZlY3RvcigpKTsKKyAgIH0KKworICAgLyogVXNlIHRoZSBydmFsdWUgZGVyZWYgaGFuZGxlciBmb3IgdGhlIG1vc3QgcGFydC4gIFdlJ2xsIGlnbm9yZQorICAgICogc3dpenpsZXMgaW4gaXQgYW5kIHdyaXRlIHN3aXp6bGVzIHVzaW5nIHdyaXRlbWFzaywgdGhvdWdoLgorICAgICovCisgICBpci0+YWNjZXB0KHYpOworICAgcmV0dXJuIGRzdF9yZWcodi0+cmVzdWx0KTsKK30KKworLyoqCisgKiBQcm9jZXNzIHRoZSBjb25kaXRpb24gb2YgYSBjb25kaXRpb25hbCBhc3NpZ25tZW50CisgKgorICogRXhhbWluZXMgdGhlIGNvbmRpdGlvbiBvZiBhIGNvbmRpdGlvbmFsIGFzc2lnbm1lbnQgdG8gZ2VuZXJhdGUgdGhlIG9wdGltYWwKKyAqIGZpcnN0IG9wZXJhbmQgb2YgYSBcYyBDTVAgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgY29uZGl0aW9uIGlzIGEgcmVsYXRpb25hbAorICogb3BlcmF0b3Igd2l0aCAwIChlLmcuLCBcYyBpcl9iaW5vcF9sZXNzKSwgdGhlIHZhbHVlIGJlaW5nIGNvbXBhcmVkIHdpbGwgYmUKKyAqIHVzZWQgYXMgdGhlIHNvdXJjZSBmb3IgdGhlIFxjIENNUCBpbnN0cnVjdGlvbi4gIE90aGVyd2lzZSB0aGUgY29tcGFyaXNvbgorICogaXMgcHJvY2Vzc2VkIHRvIGEgYm9vbGVhbiByZXN1bHQsIGFuZCB0aGUgYm9vbGVhbiByZXN1bHQgaXMgdXNlZCBhcyB0aGUKKyAqIG9wZXJhbmQgdG8gdGhlIENNUCBpbnN0cnVjdGlvbi4KKyAqLworYm9vbAoraXJfdG9fbWVzYV92aXNpdG9yOjpwcm9jZXNzX21vdmVfY29uZGl0aW9uKGlyX3J2YWx1ZSAqaXIpCit7CisgICBpcl9ydmFsdWUgKnNyY19pciA9IGlyOworICAgYm9vbCBuZWdhdGUgPSB0cnVlOworICAgYm9vbCBzd2l0Y2hfb3JkZXIgPSBmYWxzZTsKKworICAgaXJfZXhwcmVzc2lvbiAqY29uc3QgZXhwciA9IGlyLT5hc19leHByZXNzaW9uKCk7CisgICBpZiAoKGV4cHIgIT0gTlVMTCkgJiYgKGV4cHItPmdldF9udW1fb3BlcmFuZHMoKSA9PSAyKSkgeworICAgICAgYm9vbCB6ZXJvX29uX2xlZnQgPSBmYWxzZTsKKworICAgICAgaWYgKGV4cHItPm9wZXJhbmRzWzBdLT5pc196ZXJvKCkpIHsKKwkgc3JjX2lyID0gZXhwci0+b3BlcmFuZHNbMV07CisJIHplcm9fb25fbGVmdCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGV4cHItPm9wZXJhbmRzWzFdLT5pc196ZXJvKCkpIHsKKwkgc3JjX2lyID0gZXhwci0+b3BlcmFuZHNbMF07CisJIHplcm9fb25fbGVmdCA9IGZhbHNlOworICAgICAgfQorCisgICAgICAvKiAgICAgIGEgaXMgLSAgMCAgKyAgICAgICAgICAgIC0gIDAgICsKKyAgICAgICAqIChhIDwgIDApICBUICBGICBGICAoIGEgPCAwKSAgVCAgRiAgRgorICAgICAgICogKDAgPCAgYSkgIEYgIEYgIFQgICgtYSA8IDApICBGICBGICBUCisgICAgICAgKiAoYSA8PSAwKSAgVCAgVCAgRiAgKC1hIDwgMCkgIEYgIEYgIFQgIChzd2FwIG9yZGVyIG9mIG90aGVyIG9wZXJhbmRzKQorICAgICAgICogKDAgPD0gYSkgIEYgIFQgIFQgICggYSA8IDApICBUICBGICBGICAoc3dhcCBvcmRlciBvZiBvdGhlciBvcGVyYW5kcykKKyAgICAgICAqIChhID4gIDApICBGICBGICBUICAoLWEgPCAwKSAgRiAgRiAgVAorICAgICAgICogKDAgPiAgYSkgIFQgIEYgIEYgICggYSA8IDApICBUICBGICBGCisgICAgICAgKiAoYSA+PSAwKSAgRiAgVCAgVCAgKCBhIDwgMCkgIFQgIEYgIEYgIChzd2FwIG9yZGVyIG9mIG90aGVyIG9wZXJhbmRzKQorICAgICAgICogKDAgPj0gYSkgIFQgIFQgIEYgICgtYSA8IDApICBGICBGICBUICAoc3dhcCBvcmRlciBvZiBvdGhlciBvcGVyYW5kcykKKyAgICAgICAqCisgICAgICAgKiBOb3RlIHRoYXQgZXhjaGFuZ2luZyB0aGUgb3JkZXIgb2YgMCBhbmQgJ2EnIGluIHRoZSBjb21wYXJpc29uIHNpbXBseQorICAgICAgICogbWVhbnMgdGhhdCB0aGUgdmFsdWUgb2YgJ2EnIHNob3VsZCBiZSBuZWdhdGVkLgorICAgICAgICovCisgICAgICBpZiAoc3JjX2lyICE9IGlyKSB7CisJIHN3aXRjaCAoZXhwci0+b3BlcmF0aW9uKSB7CisJIGNhc2UgaXJfYmlub3BfbGVzczoKKwkgICAgc3dpdGNoX29yZGVyID0gZmFsc2U7CisJICAgIG5lZ2F0ZSA9IHplcm9fb25fbGVmdDsKKwkgICAgYnJlYWs7CisKKwkgY2FzZSBpcl9iaW5vcF9ncmVhdGVyOgorCSAgICBzd2l0Y2hfb3JkZXIgPSBmYWxzZTsKKwkgICAgbmVnYXRlID0gIXplcm9fb25fbGVmdDsKKwkgICAgYnJlYWs7CisKKwkgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisJICAgIHN3aXRjaF9vcmRlciA9IHRydWU7CisJICAgIG5lZ2F0ZSA9ICF6ZXJvX29uX2xlZnQ7CisJICAgIGJyZWFrOworCisJIGNhc2UgaXJfYmlub3BfZ2VxdWFsOgorCSAgICBzd2l0Y2hfb3JkZXIgPSB0cnVlOworCSAgICBuZWdhdGUgPSB6ZXJvX29uX2xlZnQ7CisJICAgIGJyZWFrOworCisJIGRlZmF1bHQ6CisJICAgIC8qIFRoaXMgaXNuJ3QgdGhlIHJpZ2h0IGtpbmQgb2YgY29tcGFyaXNvbiBhZnRlcmFsbCwgc28gbWFrZSBzdXJlCisJICAgICAqIHRoZSB3aG9sZSBjb25kaXRpb24gaXMgdmlzaXRlZC4KKwkgICAgICovCisJICAgIHNyY19pciA9IGlyOworCSAgICBicmVhazsKKwkgfQorICAgICAgfQorICAgfQorCisgICBzcmNfaXItPmFjY2VwdCh0aGlzKTsKKworICAgLyogV2UgdXNlIHRoZSBPUENPREVfQ01QIChhIDwgMCA/IGIgOiBjKSBmb3IgY29uZGl0aW9uYWwgbW92ZXMsIGFuZCB0aGUKKyAgICAqIGNvbmRpdGlvbiB3ZSBwcm9kdWNlZCBpcyAwLjAgb3IgMS4wLiAgQnkgZmxpcHBpbmcgdGhlIHNpZ24sIHdlIGNhbgorICAgICogY2hvb3NlIHdoaWNoIHZhbHVlIE9QQ09ERV9DTVAgcHJvZHVjZXMgd2l0aG91dCBhbiBleHRyYSBpbnN0cnVjdGlvbgorICAgICogY29tcHV0aW5nIHRoZSBjb25kaXRpb24uCisgICAgKi8KKyAgIGlmIChuZWdhdGUpCisgICAgICB0aGlzLT5yZXN1bHQubmVnYXRlID0gfnRoaXMtPnJlc3VsdC5uZWdhdGU7CisKKyAgIHJldHVybiBzd2l0Y2hfb3JkZXI7Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBkc3RfcmVnIGw7CisgICBzcmNfcmVnIHI7CisgICBpbnQgaTsKKworICAgaXItPnJocy0+YWNjZXB0KHRoaXMpOworICAgciA9IHRoaXMtPnJlc3VsdDsKKworICAgbCA9IGdldF9hc3NpZ25tZW50X2xocyhpci0+bGhzLCB0aGlzKTsKKworICAgLyogRklOSVNITUU6IFRoaXMgc2hvdWxkIHJlYWxseSBzZXQgdG8gdGhlIGNvcnJlY3QgbWF4aW1hbCB3cml0ZW1hc2sgZm9yIGVhY2gKKyAgICAqIEZJTklTSE1FOiBjb21wb25lbnQgd3JpdHRlbiAoaW4gdGhlIGxvb3BzIGJlbG93KS4gIFRoaXMgY2FzZSBjYW4gb25seQorICAgICogRklOSVNITUU6IG9jY3VyIGZvciBtYXRyaWNlcywgYXJyYXlzLCBhbmQgc3RydWN0dXJlcy4KKyAgICAqLworICAgaWYgKGlyLT53cml0ZV9tYXNrID09IDApIHsKKyAgICAgIGFzc2VydCghaXItPmxocy0+dHlwZS0+aXNfc2NhbGFyKCkgJiYgIWlyLT5saHMtPnR5cGUtPmlzX3ZlY3RvcigpKTsKKyAgICAgIGwud3JpdGVtYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICB9IGVsc2UgaWYgKGlyLT5saHMtPnR5cGUtPmlzX3NjYWxhcigpKSB7CisgICAgICAvKiBGSU5JU0hNRTogVGhpcyBoYWNrIG1ha2VzIHdyaXRpbmcgdG8gZ2xfRnJhZ0RlcHRoLCB3aGljaCBsaXZlcyBpbiB0aGUKKyAgICAgICAqIEZJTklTSE1FOiBXIGNvbXBvbmVudCBvZiBmcmFnbWVudCBzaGFkZXIgb3V0cHV0IHplcm8sIHdvcmsgY29ycmVjdGx5LgorICAgICAgICovCisgICAgICBsLndyaXRlbWFzayA9IFdSSVRFTUFTS19YWVpXOworICAgfSBlbHNlIHsKKyAgICAgIGludCBzd2l6emxlc1s0XTsKKyAgICAgIGludCBmaXJzdF9lbmFibGVkX2NoYW4gPSAwOworICAgICAgaW50IHJoc19jaGFuID0gMDsKKworICAgICAgYXNzZXJ0KGlyLT5saHMtPnR5cGUtPmlzX3ZlY3RvcigpKTsKKyAgICAgIGwud3JpdGVtYXNrID0gaXItPndyaXRlX21hc2s7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJIGlmIChsLndyaXRlbWFzayAmICgxIDw8IGkpKSB7CisJICAgIGZpcnN0X2VuYWJsZWRfY2hhbiA9IEdFVF9TV1ooci5zd2l6emxlLCBpKTsKKwkgICAgYnJlYWs7CisJIH0KKyAgICAgIH0KKworICAgICAgLyogU3dpenpsZSBhIHNtYWxsIFJIUyB2ZWN0b3IgaW50byB0aGUgY2hhbm5lbHMgYmVpbmcgd3JpdHRlbi4KKyAgICAgICAqCisgICAgICAgKiBnbHNsIGlyIHRyZWF0cyB3cml0ZV9tYXNrIGFzIGRpY3RhdGluZyBob3cgbWFueSBjaGFubmVscyBhcmUKKyAgICAgICAqIHByZXNlbnQgb24gdGhlIFJIUyB3aGlsZSBNZXNhIElSIHRyZWF0cyB3cml0ZV9tYXNrIGFzIGp1c3QKKyAgICAgICAqIHNob3dpbmcgd2hpY2ggY2hhbm5lbHMgb2YgdGhlIHZlYzQgUkhTIGdldCB3cml0dGVuLgorICAgICAgICovCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCSBpZiAobC53cml0ZW1hc2sgJiAoMSA8PCBpKSkKKwkgICAgc3dpenpsZXNbaV0gPSBHRVRfU1daKHIuc3dpenpsZSwgcmhzX2NoYW4rKyk7CisJIGVsc2UKKwkgICAgc3dpenpsZXNbaV0gPSBmaXJzdF9lbmFibGVkX2NoYW47CisgICAgICB9CisgICAgICByLnN3aXp6bGUgPSBNQUtFX1NXSVpaTEU0KHN3aXp6bGVzWzBdLCBzd2l6emxlc1sxXSwKKwkJCQlzd2l6emxlc1syXSwgc3dpenpsZXNbM10pOworICAgfQorCisgICBhc3NlcnQobC5maWxlICE9IFBST0dSQU1fVU5ERUZJTkVEKTsKKyAgIGFzc2VydChyLmZpbGUgIT0gUFJPR1JBTV9VTkRFRklORUQpOworCisgICBpZiAoaXItPmNvbmRpdGlvbikgeworICAgICAgY29uc3QgYm9vbCBzd2l0Y2hfb3JkZXIgPSB0aGlzLT5wcm9jZXNzX21vdmVfY29uZGl0aW9uKGlyLT5jb25kaXRpb24pOworICAgICAgc3JjX3JlZyBjb25kaXRpb24gPSB0aGlzLT5yZXN1bHQ7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0eXBlX3NpemUoaXItPmxocy0+dHlwZSk7IGkrKykgeworCSBpZiAoc3dpdGNoX29yZGVyKSB7CisJICAgIGVtaXQoaXIsIE9QQ09ERV9DTVAsIGwsIGNvbmRpdGlvbiwgc3JjX3JlZyhsKSwgcik7CisJIH0gZWxzZSB7CisJICAgIGVtaXQoaXIsIE9QQ09ERV9DTVAsIGwsIGNvbmRpdGlvbiwgciwgc3JjX3JlZyhsKSk7CisJIH0KKworCSBsLmluZGV4Kys7CisJIHIuaW5kZXgrKzsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZV9zaXplKGlyLT5saHMtPnR5cGUpOyBpKyspIHsKKwkgZW1pdChpciwgT1BDT0RFX01PViwgbCwgcik7CisJIGwuaW5kZXgrKzsKKwkgci5pbmRleCsrOworICAgICAgfQorICAgfQorfQorCisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfY29uc3RhbnQgKmlyKQoreworICAgc3JjX3JlZyBzcmM7CisgICBHTGZsb2F0IHN0YWNrX3ZhbHNbNF0gPSB7IDAgfTsKKyAgIEdMZmxvYXQgKnZhbHVlcyA9IHN0YWNrX3ZhbHM7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgLyogVW5mb3J0dW5hdGVseSwgNCBmbG9hdHMgaXMgYWxsIHdlIGNhbiBnZXQgaW50bworICAgICogX21lc2FfYWRkX3VubmFtZWRfY29uc3RhbnQuICBTbywgbWFrZSBhIHRlbXAgdG8gc3RvcmUgYW4KKyAgICAqIGFnZ3JlZ2F0ZSBjb25zdGFudCBhbmQgbW92ZSBlYWNoIGNvbnN0YW50IHZhbHVlIGludG8gaXQuICBJZiB3ZQorICAgICogZ2V0IGx1Y2t5LCBjb3B5IHByb3BhZ2F0aW9uIHdpbGwgZWxpbWluYXRlIHRoZSBleHRyYSBtb3Zlcy4KKyAgICAqLworCisgICBpZiAoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfU1RSVUNUKSB7CisgICAgICBzcmNfcmVnIHRlbXBfYmFzZSA9IGdldF90ZW1wKGlyLT50eXBlKTsKKyAgICAgIGRzdF9yZWcgdGVtcCA9IGRzdF9yZWcodGVtcF9iYXNlKTsKKworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsICZpci0+Y29tcG9uZW50cykgeworCSBpcl9jb25zdGFudCAqZmllbGRfdmFsdWUgPSAoaXJfY29uc3RhbnQgKikgbm9kZTsKKwkgaW50IHNpemUgPSB0eXBlX3NpemUoZmllbGRfdmFsdWUtPnR5cGUpOworCisJIGFzc2VydChzaXplID4gMCk7CisKKwkgZmllbGRfdmFsdWUtPmFjY2VwdCh0aGlzKTsKKwkgc3JjID0gdGhpcy0+cmVzdWx0OworCisJIGZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KXNpemU7IGkrKykgeworCSAgICBlbWl0KGlyLCBPUENPREVfTU9WLCB0ZW1wLCBzcmMpOworCisJICAgIHNyYy5pbmRleCsrOworCSAgICB0ZW1wLmluZGV4Kys7CisJIH0KKyAgICAgIH0KKyAgICAgIHRoaXMtPnJlc3VsdCA9IHRlbXBfYmFzZTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGlyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICBzcmNfcmVnIHRlbXBfYmFzZSA9IGdldF90ZW1wKGlyLT50eXBlKTsKKyAgICAgIGRzdF9yZWcgdGVtcCA9IGRzdF9yZWcodGVtcF9iYXNlKTsKKyAgICAgIGludCBzaXplID0gdHlwZV9zaXplKGlyLT50eXBlLT5maWVsZHMuYXJyYXkpOworCisgICAgICBhc3NlcnQoc2l6ZSA+IDApOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXItPnR5cGUtPmxlbmd0aDsgaSsrKSB7CisJIGlyLT5hcnJheV9lbGVtZW50c1tpXS0+YWNjZXB0KHRoaXMpOworCSBzcmMgPSB0aGlzLT5yZXN1bHQ7CisJIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisJICAgIGVtaXQoaXIsIE9QQ09ERV9NT1YsIHRlbXAsIHNyYyk7CisKKwkgICAgc3JjLmluZGV4Kys7CisJICAgIHRlbXAuaW5kZXgrKzsKKwkgfQorICAgICAgfQorICAgICAgdGhpcy0+cmVzdWx0ID0gdGVtcF9iYXNlOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoaXItPnR5cGUtPmlzX21hdHJpeCgpKSB7CisgICAgICBzcmNfcmVnIG1hdCA9IGdldF90ZW1wKGlyLT50eXBlKTsKKyAgICAgIGRzdF9yZWcgbWF0X2NvbHVtbiA9IGRzdF9yZWcobWF0KTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGlyLT50eXBlLT5tYXRyaXhfY29sdW1uczsgaSsrKSB7CisJIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisJIHZhbHVlcyA9ICZpci0+dmFsdWUuZltpICogaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50c107CisKKwkgc3JjID0gc3JjX3JlZyhQUk9HUkFNX0NPTlNUQU5ULCAtMSwgTlVMTCk7CisJIHNyYy5pbmRleCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHRoaXMtPnByb2ctPlBhcmFtZXRlcnMsCisJCQkJCQkoZ2xfY29uc3RhbnRfdmFsdWUgKikgdmFsdWVzLAorCQkJCQkJaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cywKKwkJCQkJCSZzcmMuc3dpenpsZSk7CisJIGVtaXQoaXIsIE9QQ09ERV9NT1YsIG1hdF9jb2x1bW4sIHNyYyk7CisKKwkgbWF0X2NvbHVtbi5pbmRleCsrOworICAgICAgfQorCisgICAgICB0aGlzLT5yZXN1bHQgPSBtYXQ7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHNyYy5maWxlID0gUFJPR1JBTV9DT05TVEFOVDsKKyAgIHN3aXRjaCAoaXItPnR5cGUtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisgICAgICB2YWx1ZXMgPSAmaXItPnZhbHVlLmZbMF07CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIHZhbHVlc1tpXSA9IGlyLT52YWx1ZS51W2ldOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIHZhbHVlc1tpXSA9IGlyLT52YWx1ZS5pW2ldOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorICAgICAgZm9yIChpID0gMDsgaSA8IGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSB2YWx1ZXNbaV0gPSBpci0+dmFsdWUuYltpXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIk5vbi1mbG9hdC91aW50L2ludC9ib29sIGNvbnN0YW50Iik7CisgICB9CisKKyAgIHRoaXMtPnJlc3VsdCA9IHNyY19yZWcoUFJPR1JBTV9DT05TVEFOVCwgLTEsIGlyLT50eXBlKTsKKyAgIHRoaXMtPnJlc3VsdC5pbmRleCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHRoaXMtPnByb2ctPlBhcmFtZXRlcnMsCisJCQkJCQkgICAoZ2xfY29uc3RhbnRfdmFsdWUgKikgdmFsdWVzLAorCQkJCQkJICAgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cywKKwkJCQkJCSAgICZ0aGlzLT5yZXN1bHQuc3dpenpsZSk7Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfY2FsbCAqKQoreworICAgYXNzZXJ0KCEiaXJfdG9fbWVzYTogQWxsIGZ1bmN0aW9uIGNhbGxzIHNob3VsZCBoYXZlIGJlZW4gaW5saW5lZCBieSBub3cuIik7Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfdGV4dHVyZSAqaXIpCit7CisgICBzcmNfcmVnIHJlc3VsdF9zcmMsIGNvb3JkLCBsb2RfaW5mbywgcHJvamVjdG9yLCBkeCwgZHk7CisgICBkc3RfcmVnIHJlc3VsdF9kc3QsIGNvb3JkX2RzdDsKKyAgIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKmluc3QgPSBOVUxMOworICAgcHJvZ19vcGNvZGUgb3Bjb2RlID0gT1BDT0RFX05PUDsKKworICAgLyogTmVpdGhlciBvcGNvZGUgdXNlcyBjb29yZGluYXRlICovCisgICBpZiAoaXItPm9wID09IGlyX3R4cyB8fCBpci0+b3AgPT0gaXJfcXVlcnlfbGV2ZWxzKQorICAgICAgdGhpcy0+cmVzdWx0ID0gc3JjX3JlZ19mb3JfZmxvYXQoMC4wKTsKKyAgIGVsc2UKKyAgICAgIGlyLT5jb29yZGluYXRlLT5hY2NlcHQodGhpcyk7CisKKyAgIC8qIFB1dCBvdXIgY29vcmRzIGluIGEgdGVtcC4gIFdlJ2xsIG5lZWQgdG8gbW9kaWZ5IHRoZW0gZm9yIHNoYWRvdywKKyAgICAqIHByb2plY3Rpb24sIG9yIExPRCwgc28gdGhlIG9ubHkgY2FzZSB3ZSdkIHVzZSBpdCBhcyBpcyBpcyBpZgorICAgICogd2UncmUgZG9pbmcgcGxhaW4gb2xkIHRleHR1cmluZy4gIE1lc2EgSVIgb3B0aW1pemF0aW9uIHNob3VsZAorICAgICogaGFuZGxlIGNsZWFuaW5nIHVwIG91ciBtZXNzIGluIHRoYXQgY2FzZS4KKyAgICAqLworICAgY29vcmQgPSBnZXRfdGVtcChnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisgICBjb29yZF9kc3QgPSBkc3RfcmVnKGNvb3JkKTsKKyAgIGVtaXQoaXIsIE9QQ09ERV9NT1YsIGNvb3JkX2RzdCwgdGhpcy0+cmVzdWx0KTsKKworICAgaWYgKGlyLT5wcm9qZWN0b3IpIHsKKyAgICAgIGlyLT5wcm9qZWN0b3ItPmFjY2VwdCh0aGlzKTsKKyAgICAgIHByb2plY3RvciA9IHRoaXMtPnJlc3VsdDsKKyAgIH0KKworICAgLyogU3RvcmFnZSBmb3Igb3VyIHJlc3VsdC4gIElkZWFsbHkgZm9yIGFuIGFzc2lnbm1lbnQgd2UnZCBiZSB1c2luZworICAgICogdGhlIGFjdHVhbCBzdG9yYWdlIGZvciB0aGUgcmVzdWx0IGhlcmUsIGluc3RlYWQuCisgICAgKi8KKyAgIHJlc3VsdF9zcmMgPSBnZXRfdGVtcChnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisgICByZXN1bHRfZHN0ID0gZHN0X3JlZyhyZXN1bHRfc3JjKTsKKworICAgc3dpdGNoIChpci0+b3ApIHsKKyAgIGNhc2UgaXJfdGV4OgorICAgY2FzZSBpcl90eHM6CisgICAgICBvcGNvZGUgPSBPUENPREVfVEVYOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4YjoKKyAgICAgIG9wY29kZSA9IE9QQ09ERV9UWEI7CisgICAgICBpci0+bG9kX2luZm8uYmlhcy0+YWNjZXB0KHRoaXMpOworICAgICAgbG9kX2luZm8gPSB0aGlzLT5yZXN1bHQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhmOgorICAgICAgLyogUHJldGVuZCB0byBiZSBUWEwgc28gdGhlIHNhbXBsZXIsIGNvb3JkaW5hdGUsIGxvZCBhcmUgYXZhaWxhYmxlICovCisgICBjYXNlIGlyX3R4bDoKKyAgICAgIG9wY29kZSA9IE9QQ09ERV9UWEw7CisgICAgICBpci0+bG9kX2luZm8ubG9kLT5hY2NlcHQodGhpcyk7CisgICAgICBsb2RfaW5mbyA9IHRoaXMtPnJlc3VsdDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6CisgICAgICBvcGNvZGUgPSBPUENPREVfVFhEOworICAgICAgaXItPmxvZF9pbmZvLmdyYWQuZFBkeC0+YWNjZXB0KHRoaXMpOworICAgICAgZHggPSB0aGlzLT5yZXN1bHQ7CisgICAgICBpci0+bG9kX2luZm8uZ3JhZC5kUGR5LT5hY2NlcHQodGhpcyk7CisgICAgICBkeSA9IHRoaXMtPnJlc3VsdDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGZfbXM6CisgICAgICBhc3NlcnQoISJVbmV4cGVjdGVkIGlyX3R4Zl9tcyBvcGNvZGUiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9sb2Q6CisgICAgICBhc3NlcnQoISJVbmV4cGVjdGVkIGlyX2xvZCBvcGNvZGUiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90ZzQ6CisgICAgICBhc3NlcnQoISJVbmV4cGVjdGVkIGlyX3RnNCBvcGNvZGUiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9xdWVyeV9sZXZlbHM6CisgICAgICBhc3NlcnQoISJVbmV4cGVjdGVkIGlyX3F1ZXJ5X2xldmVscyBvcGNvZGUiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBjb25zdCBnbHNsX3R5cGUgKnNhbXBsZXJfdHlwZSA9IGlyLT5zYW1wbGVyLT50eXBlOworCisgICBpZiAoaXItPnByb2plY3RvcikgeworICAgICAgaWYgKG9wY29kZSA9PSBPUENPREVfVEVYKSB7CisJIC8qIFNsb3QgdGhlIHByb2plY3RvciBpbiBhcyB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIGNvb3JkLiAqLworCSBjb29yZF9kc3Qud3JpdGVtYXNrID0gV1JJVEVNQVNLX1c7CisJIGVtaXQoaXIsIE9QQ09ERV9NT1YsIGNvb3JkX2RzdCwgcHJvamVjdG9yKTsKKwkgY29vcmRfZHN0LndyaXRlbWFzayA9IFdSSVRFTUFTS19YWVpXOworCSBvcGNvZGUgPSBPUENPREVfVFhQOworICAgICAgfSBlbHNlIHsKKwkgc3JjX3JlZyBjb29yZF93ID0gY29vcmQ7CisJIGNvb3JkX3cuc3dpenpsZSA9IFNXSVpaTEVfV1dXVzsKKworCSAvKiBGb3IgdGhlIG90aGVyIFRFWCBvcGNvZGVzIHRoZXJlJ3Mgbm8gcHJvamVjdGl2ZSB2ZXJzaW9uCisJICAqIHNpbmNlIHRoZSBsYXN0IHNsb3QgaXMgdGFrZW4gdXAgYnkgbG9kIGluZm8uICBEbyB0aGUKKwkgICogcHJvamVjdGl2ZSBkaXZpZGUgbm93LgorCSAgKi8KKwkgY29vcmRfZHN0LndyaXRlbWFzayA9IFdSSVRFTUFTS19XOworCSBlbWl0KGlyLCBPUENPREVfUkNQLCBjb29yZF9kc3QsIHByb2plY3Rvcik7CisKKwkgLyogSW4gdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSB0byBwcm9qZWN0IHRoZSBjb29yZGluYXRlcyAiYnkgaGFuZCwiCisJICAqIHRoZSBzaGFkb3cgY29tcGFyaXRvciB2YWx1ZSBtdXN0IGFsc28gYmUgcHJvamVjdGVkLgorCSAgKi8KKwkgc3JjX3JlZyB0bXBfc3JjID0gY29vcmQ7CisJIGlmIChpci0+c2hhZG93X2NvbXBhcml0b3IpIHsKKwkgICAgLyogU2xvdCB0aGUgc2hhZG93IHZhbHVlIGluIGFzIHRoZSBzZWNvbmQgdG8gbGFzdCBjb21wb25lbnQgb2YgdGhlCisJICAgICAqIGNvb3JkLgorCSAgICAgKi8KKwkgICAgaXItPnNoYWRvd19jb21wYXJpdG9yLT5hY2NlcHQodGhpcyk7CisKKwkgICAgdG1wX3NyYyA9IGdldF90ZW1wKGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKwkgICAgZHN0X3JlZyB0bXBfZHN0ID0gZHN0X3JlZyh0bXBfc3JjKTsKKworCSAgICAvKiBQcm9qZWN0aXZlIGRpdmlzaW9uIG5vdCBhbGxvd2VkIGZvciBhcnJheSBzYW1wbGVycy4gKi8KKwkgICAgYXNzZXJ0KCFzYW1wbGVyX3R5cGUtPnNhbXBsZXJfYXJyYXkpOworCisJICAgIHRtcF9kc3Qud3JpdGVtYXNrID0gV1JJVEVNQVNLX1o7CisJICAgIGVtaXQoaXIsIE9QQ09ERV9NT1YsIHRtcF9kc3QsIHRoaXMtPnJlc3VsdCk7CisKKwkgICAgdG1wX2RzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWFk7CisJICAgIGVtaXQoaXIsIE9QQ09ERV9NT1YsIHRtcF9kc3QsIGNvb3JkKTsKKwkgfQorCisJIGNvb3JkX2RzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWFlaOworCSBlbWl0KGlyLCBPUENPREVfTVVMLCBjb29yZF9kc3QsIHRtcF9zcmMsIGNvb3JkX3cpOworCisJIGNvb3JkX2RzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWFlaVzsKKwkgY29vcmQuc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSWYgcHJvamVjdGlvbiBpcyBkb25lIGFuZCB0aGUgb3Bjb2RlIGlzIG5vdCBPUENPREVfVFhQLCB0aGVuIHRoZSBzaGFkb3cKKyAgICAqIGNvbXBhcml0b3Igd2FzIHB1dCBpbiB0aGUgY29ycmVjdCBwbGFjZSAoYW5kIHByb2plY3RlZCkgYnkgdGhlIGNvZGUsCisgICAgKiBhYm92ZSwgdGhhdCBoYW5kbGVzIGJ5LWhhbmQgcHJvamVjdGlvbi4KKyAgICAqLworICAgaWYgKGlyLT5zaGFkb3dfY29tcGFyaXRvciAmJiAoIWlyLT5wcm9qZWN0b3IgfHwgb3Bjb2RlID09IE9QQ09ERV9UWFApKSB7CisgICAgICAvKiBTbG90IHRoZSBzaGFkb3cgdmFsdWUgaW4gYXMgdGhlIHNlY29uZCB0byBsYXN0IGNvbXBvbmVudCBvZiB0aGUKKyAgICAgICAqIGNvb3JkLgorICAgICAgICovCisgICAgICBpci0+c2hhZG93X2NvbXBhcml0b3ItPmFjY2VwdCh0aGlzKTsKKworICAgICAgLyogWFhYIFRoaXMgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIGN1YmVtYXAgYXJyYXkgc2FtcGxlcnMuICovCisgICAgICBpZiAoc2FtcGxlcl90eXBlLT5zYW1wbGVyX2RpbWVuc2lvbmFsaXR5ID09IEdMU0xfU0FNUExFUl9ESU1fMkQgJiYKKyAgICAgICAgICBzYW1wbGVyX3R5cGUtPnNhbXBsZXJfYXJyYXkpIHsKKyAgICAgICAgIGNvb3JkX2RzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfVzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBjb29yZF9kc3Qud3JpdGVtYXNrID0gV1JJVEVNQVNLX1o7CisgICAgICB9CisKKyAgICAgIGVtaXQoaXIsIE9QQ09ERV9NT1YsIGNvb3JkX2RzdCwgdGhpcy0+cmVzdWx0KTsKKyAgICAgIGNvb3JkX2RzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWFlaVzsKKyAgIH0KKworICAgaWYgKG9wY29kZSA9PSBPUENPREVfVFhMIHx8IG9wY29kZSA9PSBPUENPREVfVFhCKSB7CisgICAgICAvKiBNZXNhIElSIHN0b3JlcyBsb2Qgb3IgbG9kIGJpYXMgaW4gdGhlIGxhc3QgY2hhbm5lbCBvZiB0aGUgY29vcmRzLiAqLworICAgICAgY29vcmRfZHN0LndyaXRlbWFzayA9IFdSSVRFTUFTS19XOworICAgICAgZW1pdChpciwgT1BDT0RFX01PViwgY29vcmRfZHN0LCBsb2RfaW5mbyk7CisgICAgICBjb29yZF9kc3Qud3JpdGVtYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICB9CisKKyAgIGlmIChvcGNvZGUgPT0gT1BDT0RFX1RYRCkKKyAgICAgIGluc3QgPSBlbWl0KGlyLCBvcGNvZGUsIHJlc3VsdF9kc3QsIGNvb3JkLCBkeCwgZHkpOworICAgZWxzZQorICAgICAgaW5zdCA9IGVtaXQoaXIsIG9wY29kZSwgcmVzdWx0X2RzdCwgY29vcmQpOworCisgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKQorICAgICAgaW5zdC0+dGV4X3NoYWRvdyA9IEdMX1RSVUU7CisKKyAgIGluc3QtPnNhbXBsZXIgPSBfbWVzYV9nZXRfc2FtcGxlcl91bmlmb3JtX3ZhbHVlKGlyLT5zYW1wbGVyLAorCQkJCQkJICAgdGhpcy0+c2hhZGVyX3Byb2dyYW0sCisJCQkJCQkgICB0aGlzLT5wcm9nKTsKKworICAgc3dpdGNoIChzYW1wbGVyX3R5cGUtPnNhbXBsZXJfZGltZW5zaW9uYWxpdHkpIHsKKyAgIGNhc2UgR0xTTF9TQU1QTEVSX0RJTV8xRDoKKyAgICAgIGluc3QtPnRleF90YXJnZXQgPSAoc2FtcGxlcl90eXBlLT5zYW1wbGVyX2FycmF5KQorCSA/IFRFWFRVUkVfMURfQVJSQVlfSU5ERVggOiBURVhUVVJFXzFEX0lOREVYOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fMkQ6CisgICAgICBpbnN0LT50ZXhfdGFyZ2V0ID0gKHNhbXBsZXJfdHlwZS0+c2FtcGxlcl9hcnJheSkKKwkgPyBURVhUVVJFXzJEX0FSUkFZX0lOREVYIDogVEVYVFVSRV8yRF9JTkRFWDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzNEOgorICAgICAgaW5zdC0+dGV4X3RhcmdldCA9IFRFWFRVUkVfM0RfSU5ERVg7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xTTF9TQU1QTEVSX0RJTV9DVUJFOgorICAgICAgaW5zdC0+dGV4X3RhcmdldCA9IFRFWFRVUkVfQ1VCRV9JTkRFWDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNX1JFQ1Q6CisgICAgICBpbnN0LT50ZXhfdGFyZ2V0ID0gVEVYVFVSRV9SRUNUX0lOREVYOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fQlVGOgorICAgICAgYXNzZXJ0KCEiRklOSVNITUU6IEltcGxlbWVudCBBUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0Iik7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xTTF9TQU1QTEVSX0RJTV9FWFRFUk5BTDoKKyAgICAgIGluc3QtPnRleF90YXJnZXQgPSBURVhUVVJFX0VYVEVSTkFMX0lOREVYOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKyAgIH0KKworICAgdGhpcy0+cmVzdWx0ID0gcmVzdWx0X3NyYzsKK30KKwordm9pZAoraXJfdG9fbWVzYV92aXNpdG9yOjp2aXNpdChpcl9yZXR1cm4gKmlyKQoreworICAgLyogTm9uLXZvaWQgZnVuY3Rpb25zIHNob3VsZCBoYXZlIGJlZW4gaW5saW5lZC4gIFdlIG1heSBzdGlsbCBlbWl0IFJFVHMKKyAgICAqIGZyb20gbWFpbigpIHVubGVzcyB0aGUgRW1pdE5vTWFpblJldHVybiBvcHRpb24gaXMgc2V0LgorICAgICovCisgICBhc3NlcnQoIWlyLT5nZXRfdmFsdWUoKSk7CisgICBlbWl0KGlyLCBPUENPREVfUkVUKTsKK30KKwordm9pZAoraXJfdG9fbWVzYV92aXNpdG9yOjp2aXNpdChpcl9kaXNjYXJkICppcikKK3sKKyAgIGlmIChpci0+Y29uZGl0aW9uKSB7CisgICAgICBpci0+Y29uZGl0aW9uLT5hY2NlcHQodGhpcyk7CisgICAgICB0aGlzLT5yZXN1bHQubmVnYXRlID0gfnRoaXMtPnJlc3VsdC5uZWdhdGU7CisgICAgICBlbWl0KGlyLCBPUENPREVfS0lMLCB1bmRlZl9kc3QsIHRoaXMtPnJlc3VsdCk7CisgICB9IGVsc2UgeworICAgICAgZW1pdChpciwgT1BDT0RFX0tJTF9OVik7CisgICB9Cit9CisKK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6dmlzaXQoaXJfaWYgKmlyKQoreworICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqY29uZF9pbnN0LCAqaWZfaW5zdDsKKyAgIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKnByZXZfaW5zdDsKKworICAgcHJldl9pbnN0ID0gKGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKil0aGlzLT5pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgaXItPmNvbmRpdGlvbi0+YWNjZXB0KHRoaXMpOworICAgYXNzZXJ0KHRoaXMtPnJlc3VsdC5maWxlICE9IFBST0dSQU1fVU5ERUZJTkVEKTsKKworICAgaWYgKHRoaXMtPm9wdGlvbnMtPkVtaXRDb25kQ29kZXMpIHsKKyAgICAgIGNvbmRfaW5zdCA9IChpcl90b19tZXNhX2luc3RydWN0aW9uICopdGhpcy0+aW5zdHJ1Y3Rpb25zLmdldF90YWlsKCk7CisKKyAgICAgIC8qIFNlZSBpZiB3ZSBhY3R1YWxseSBnZW5lcmF0ZWQgYW55IGluc3RydWN0aW9uIGZvciBnZW5lcmF0aW5nCisgICAgICAgKiB0aGUgY29uZGl0aW9uLiAgSWYgbm90LCB0aGVuIGNvb2sgdXAgYSBtb3ZlIHRvIGEgdGVtcCBzbyB3ZQorICAgICAgICogaGF2ZSBzb21ldGhpbmcgdG8gc2V0IGNvbmRfdXBkYXRlIG9uLgorICAgICAgICovCisgICAgICBpZiAoY29uZF9pbnN0ID09IHByZXZfaW5zdCkgeworCSBzcmNfcmVnIHRlbXAgPSBnZXRfdGVtcChnbHNsX3R5cGU6OmJvb2xfdHlwZSk7CisJIGNvbmRfaW5zdCA9IGVtaXQoaXItPmNvbmRpdGlvbiwgT1BDT0RFX01PViwgZHN0X3JlZyh0ZW1wKSwgcmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIGNvbmRfaW5zdC0+Y29uZF91cGRhdGUgPSBHTF9UUlVFOworCisgICAgICBpZl9pbnN0ID0gZW1pdChpci0+Y29uZGl0aW9uLCBPUENPREVfSUYpOworICAgICAgaWZfaW5zdC0+ZHN0LmNvbmRfbWFzayA9IENPTkRfTkU7CisgICB9IGVsc2UgeworICAgICAgaWZfaW5zdCA9IGVtaXQoaXItPmNvbmRpdGlvbiwgT1BDT0RFX0lGLCB1bmRlZl9kc3QsIHRoaXMtPnJlc3VsdCk7CisgICB9CisKKyAgIHRoaXMtPmluc3RydWN0aW9ucy5wdXNoX3RhaWwoaWZfaW5zdCk7CisKKyAgIHZpc2l0X2V4ZWNfbGlzdCgmaXItPnRoZW5faW5zdHJ1Y3Rpb25zLCB0aGlzKTsKKworICAgaWYgKCFpci0+ZWxzZV9pbnN0cnVjdGlvbnMuaXNfZW1wdHkoKSkgeworICAgICAgZW1pdChpci0+Y29uZGl0aW9uLCBPUENPREVfRUxTRSk7CisgICAgICB2aXNpdF9leGVjX2xpc3QoJmlyLT5lbHNlX2luc3RydWN0aW9ucywgdGhpcyk7CisgICB9CisKKyAgIGVtaXQoaXItPmNvbmRpdGlvbiwgT1BDT0RFX0VORElGKTsKK30KKwordm9pZAoraXJfdG9fbWVzYV92aXNpdG9yOjp2aXNpdChpcl9lbWl0X3ZlcnRleCAqKQoreworICAgYXNzZXJ0KCEiR2VvbWV0cnkgc2hhZGVycyBub3Qgc3VwcG9ydGVkLiIpOworfQorCit2b2lkCitpcl90b19tZXNhX3Zpc2l0b3I6OnZpc2l0KGlyX2VuZF9wcmltaXRpdmUgKikKK3sKKyAgIGFzc2VydCghIkdlb21ldHJ5IHNoYWRlcnMgbm90IHN1cHBvcnRlZC4iKTsKK30KKworaXJfdG9fbWVzYV92aXNpdG9yOjppcl90b19tZXNhX3Zpc2l0b3IoKQoreworICAgcmVzdWx0LmZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKyAgIG5leHRfdGVtcCA9IDE7CisgICBuZXh0X3NpZ25hdHVyZV9pZCA9IDE7CisgICBjdXJyZW50X2Z1bmN0aW9uID0gTlVMTDsKKyAgIG1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKK30KKworaXJfdG9fbWVzYV92aXNpdG9yOjp+aXJfdG9fbWVzYV92aXNpdG9yKCkKK3sKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworfQorCitzdGF0aWMgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyCittZXNhX3NyY19yZWdfZnJvbV9pcl9zcmNfcmVnKHNyY19yZWcgcmVnKQoreworICAgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyIG1lc2FfcmVnOworCisgICBtZXNhX3JlZy5GaWxlID0gcmVnLmZpbGU7CisgICBhc3NlcnQocmVnLmluZGV4IDwgKDEgPDwgSU5TVF9JTkRFWF9CSVRTKSk7CisgICBtZXNhX3JlZy5JbmRleCA9IHJlZy5pbmRleDsKKyAgIG1lc2FfcmVnLlN3aXp6bGUgPSByZWcuc3dpenpsZTsKKyAgIG1lc2FfcmVnLlJlbEFkZHIgPSByZWcucmVsYWRkciAhPSBOVUxMOworICAgbWVzYV9yZWcuTmVnYXRlID0gcmVnLm5lZ2F0ZTsKKyAgIG1lc2FfcmVnLkFicyA9IDA7CisgICBtZXNhX3JlZy5IYXNJbmRleDIgPSBHTF9GQUxTRTsKKyAgIG1lc2FfcmVnLlJlbEFkZHIyID0gMDsKKyAgIG1lc2FfcmVnLkluZGV4MiA9IDA7CisKKyAgIHJldHVybiBtZXNhX3JlZzsKK30KKworc3RhdGljIHZvaWQKK3NldF9icmFuY2h0YXJnZXRzKGlyX3RvX21lc2FfdmlzaXRvciAqdiwKKwkJICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqbWVzYV9pbnN0cnVjdGlvbnMsCisJCSAgaW50IG51bV9pbnN0cnVjdGlvbnMpCit7CisgICBpbnQgaWZfY291bnQgPSAwLCBsb29wX2NvdW50ID0gMDsKKyAgIGludCAqaWZfc3RhY2ssICpsb29wX3N0YWNrOworICAgaW50IGlmX3N0YWNrX3BvcyA9IDAsIGxvb3Bfc3RhY2tfcG9zID0gMDsKKyAgIGludCBpLCBqOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2luc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzd2l0Y2ggKG1lc2FfaW5zdHJ1Y3Rpb25zW2ldLk9wY29kZSkgeworICAgICAgY2FzZSBPUENPREVfSUY6CisJIGlmX2NvdW50Kys7CisJIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfQkdOTE9PUDoKKwkgbG9vcF9jb3VudCsrOworCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0JSSzoKKyAgICAgIGNhc2UgT1BDT0RFX0NPTlQ6CisJIG1lc2FfaW5zdHJ1Y3Rpb25zW2ldLkJyYW5jaFRhcmdldCA9IC0xOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGJyZWFrOworICAgICAgfQorICAgfQorCisgICBpZl9zdGFjayA9IHJ6YWxsb2NfYXJyYXkodi0+bWVtX2N0eCwgaW50LCBpZl9jb3VudCk7CisgICBsb29wX3N0YWNrID0gcnphbGxvY19hcnJheSh2LT5tZW1fY3R4LCBpbnQsIGxvb3BfY291bnQpOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2luc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzd2l0Y2ggKG1lc2FfaW5zdHJ1Y3Rpb25zW2ldLk9wY29kZSkgeworICAgICAgY2FzZSBPUENPREVfSUY6CisJIGlmX3N0YWNrW2lmX3N0YWNrX3Bvc10gPSBpOworCSBpZl9zdGFja19wb3MrKzsKKwkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9FTFNFOgorCSBtZXNhX2luc3RydWN0aW9uc1tpZl9zdGFja1tpZl9zdGFja19wb3MgLSAxXV0uQnJhbmNoVGFyZ2V0ID0gaTsKKwkgaWZfc3RhY2tbaWZfc3RhY2tfcG9zIC0gMV0gPSBpOworCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0VORElGOgorCSBtZXNhX2luc3RydWN0aW9uc1tpZl9zdGFja1tpZl9zdGFja19wb3MgLSAxXV0uQnJhbmNoVGFyZ2V0ID0gaTsKKwkgaWZfc3RhY2tfcG9zLS07CisJIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfQkdOTE9PUDoKKwkgbG9vcF9zdGFja1tsb29wX3N0YWNrX3Bvc10gPSBpOworCSBsb29wX3N0YWNrX3BvcysrOworCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0VORExPT1A6CisJIGxvb3Bfc3RhY2tfcG9zLS07CisJIC8qIFJld3JpdGUgYW55IGJyZWFrcy9jb250cyBhdCB0aGlzIG5lc3RpbmcgbGV2ZWwgKGhhdmVuJ3QKKwkgICogYWxyZWFkeSBoYWQgYSBCcmFuY2hUYXJnZXQgYXNzaWduZWQpIHRvIHBvaW50IHRvIHRoZSBlbmQKKwkgICogb2YgdGhlIGxvb3AuCisJICAqLworCSBmb3IgKGogPSBsb29wX3N0YWNrW2xvb3Bfc3RhY2tfcG9zXTsgaiA8IGk7IGorKykgeworCSAgICBpZiAobWVzYV9pbnN0cnVjdGlvbnNbal0uT3Bjb2RlID09IE9QQ09ERV9CUksgfHwKKwkJbWVzYV9pbnN0cnVjdGlvbnNbal0uT3Bjb2RlID09IE9QQ09ERV9DT05UKSB7CisJICAgICAgIGlmIChtZXNhX2luc3RydWN0aW9uc1tqXS5CcmFuY2hUYXJnZXQgPT0gLTEpIHsKKwkJICBtZXNhX2luc3RydWN0aW9uc1tqXS5CcmFuY2hUYXJnZXQgPSBpOworCSAgICAgICB9CisJICAgIH0KKwkgfQorCSAvKiBUaGUgbG9vcCBlbmRzIHBvaW50IGF0IGVhY2ggb3RoZXIuICovCisJIG1lc2FfaW5zdHJ1Y3Rpb25zW2ldLkJyYW5jaFRhcmdldCA9IGxvb3Bfc3RhY2tbbG9vcF9zdGFja19wb3NdOworCSBtZXNhX2luc3RydWN0aW9uc1tsb29wX3N0YWNrW2xvb3Bfc3RhY2tfcG9zXV0uQnJhbmNoVGFyZ2V0ID0gaTsKKwkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9DQUw6CisJIGZvcmVhY2hfbGlzdChuLCAmdi0+ZnVuY3Rpb25fc2lnbmF0dXJlcykgeworCSAgICBmdW5jdGlvbl9lbnRyeSAqZW50cnkgPSAoZnVuY3Rpb25fZW50cnkgKikgbjsKKworCSAgICBpZiAoZW50cnktPnNpZ19pZCA9PSBtZXNhX2luc3RydWN0aW9uc1tpXS5CcmFuY2hUYXJnZXQpIHsKKwkgICAgICAgbWVzYV9pbnN0cnVjdGlvbnNbaV0uQnJhbmNoVGFyZ2V0ID0gZW50cnktPmluc3Q7CisJICAgICAgIGJyZWFrOworCSAgICB9CisJIH0KKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBicmVhazsKKyAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X3Byb2dyYW0oc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKm1lc2FfaW5zdHJ1Y3Rpb25zLAorCSAgICAgIGlyX2luc3RydWN0aW9uICoqbWVzYV9pbnN0cnVjdGlvbl9hbm5vdGF0aW9uLAorCSAgICAgIGludCBudW1faW5zdHJ1Y3Rpb25zKQoreworICAgaXJfaW5zdHJ1Y3Rpb24gKmxhc3RfaXIgPSBOVUxMOworICAgaW50IGk7CisgICBpbnQgaW5kZW50ID0gMDsKKworICAgZm9yIChpID0gMDsgaSA8IG51bV9pbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKm1lc2FfaW5zdCA9IG1lc2FfaW5zdHJ1Y3Rpb25zICsgaTsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IG1lc2FfaW5zdHJ1Y3Rpb25fYW5ub3RhdGlvbltpXTsKKworICAgICAgZnByaW50ZihzdGRvdXQsICIlM2Q6ICIsIGkpOworCisgICAgICBpZiAobGFzdF9pciAhPSBpciAmJiBpcikgeworCSBpbnQgajsKKworCSBmb3IgKGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKwkgICAgZnByaW50ZihzdGRvdXQsICIgIik7CisJIH0KKwkgaXItPnByaW50KCk7CisJIHByaW50ZigiXG4iKTsKKwkgbGFzdF9pciA9IGlyOworCisJIGZwcmludGYoc3Rkb3V0LCAiICAgICAiKTsgLyogbGluZSBudW1iZXIgc3BhY2luZy4gKi8KKyAgICAgIH0KKworICAgICAgaW5kZW50ID0gX21lc2FfZnByaW50X2luc3RydWN0aW9uX29wdChzdGRvdXQsIG1lc2FfaW5zdCwgaW5kZW50LAorCQkJCQkgICAgUFJPR19QUklOVF9ERUJVRywgTlVMTCk7CisgICB9Cit9CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIGFkZF91bmlmb3JtX3RvX3NoYWRlciA6IHB1YmxpYyBwcm9ncmFtX3Jlc291cmNlX3Zpc2l0b3IgeworcHVibGljOgorICAgYWRkX3VuaWZvcm1fdG9fc2hhZGVyKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW0sCisJCQkgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXJfc3RhZ2Ugc2hhZGVyX3R5cGUpCisgICAgICA6IHNoYWRlcl9wcm9ncmFtKHNoYWRlcl9wcm9ncmFtKSwgcGFyYW1zKHBhcmFtcyksIGlkeCgtMSksCisgICAgICAgIHNoYWRlcl90eXBlKHNoYWRlcl90eXBlKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdm9pZCBwcm9jZXNzKGlyX3ZhcmlhYmxlICp2YXIpCisgICB7CisgICAgICB0aGlzLT5pZHggPSAtMTsKKyAgICAgIHRoaXMtPnByb2dyYW1fcmVzb3VyY2VfdmlzaXRvcjo6cHJvY2Vzcyh2YXIpOworCisgICAgICB2YXItPmRhdGEubG9jYXRpb24gPSB0aGlzLT5pZHg7CisgICB9CisKK3ByaXZhdGU6CisgICB2aXJ0dWFsIHZvaWQgdmlzaXRfZmllbGQoY29uc3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcm93X21ham9yKTsKKworICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZ3JhbTsKKyAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbXM7CisgICBpbnQgaWR4OworICAgZ2xfc2hhZGVyX3N0YWdlIHNoYWRlcl90eXBlOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK3ZvaWQKK2FkZF91bmlmb3JtX3RvX3NoYWRlcjo6dmlzaXRfZmllbGQoY29uc3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJvd19tYWpvcikKK3sKKyAgIHVuc2lnbmVkIGludCBzaXplOworCisgICAodm9pZCkgcm93X21ham9yOworCisgICBpZiAodHlwZS0+aXNfdmVjdG9yKCkgfHwgdHlwZS0+aXNfc2NhbGFyKCkpIHsKKyAgICAgIHNpemUgPSB0eXBlLT52ZWN0b3JfZWxlbWVudHM7CisgICB9IGVsc2UgeworICAgICAgc2l6ZSA9IHR5cGVfc2l6ZSh0eXBlKSAqIDQ7CisgICB9CisKKyAgIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZTsKKyAgIGlmICh0eXBlLT5pc19zYW1wbGVyKCkgfHwKKyAgICAgICAodHlwZS0+aXNfYXJyYXkoKSAmJiB0eXBlLT5maWVsZHMuYXJyYXktPmlzX3NhbXBsZXIoKSkpIHsKKyAgICAgIGZpbGUgPSBQUk9HUkFNX1NBTVBMRVI7CisgICB9IGVsc2UgeworICAgICAgZmlsZSA9IFBST0dSQU1fVU5JRk9STTsKKyAgIH0KKworICAgaW50IGluZGV4ID0gX21lc2FfbG9va3VwX3BhcmFtZXRlcl9pbmRleChwYXJhbXMsIC0xLCBuYW1lKTsKKyAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgIGluZGV4ID0gX21lc2FfYWRkX3BhcmFtZXRlcihwYXJhbXMsIGZpbGUsIG5hbWUsIHNpemUsIHR5cGUtPmdsX3R5cGUsCisJCQkJICBOVUxMLCBOVUxMKTsKKworICAgICAgLyogU2FtcGxlciB1bmlmb3JtIHZhbHVlcyBhcmUgc3RvcmVkIGluIHByb2ctPlNhbXBsZXJVbml0cywKKyAgICAgICAqIGFuZCB0aGUgZW50cnkgaW4gdGhhdCBhcnJheSBpcyBzZWxlY3RlZCBieSB0aGlzIGluZGV4IHdlCisgICAgICAgKiBzdG9yZSBpbiBQYXJhbWV0ZXJWYWx1ZXNbXS4KKyAgICAgICAqLworICAgICAgaWYgKGZpbGUgPT0gUFJPR1JBTV9TQU1QTEVSKSB7CisJIHVuc2lnbmVkIGxvY2F0aW9uOworCSBjb25zdCBib29sIGZvdW5kID0KKwkgICAgdGhpcy0+c2hhZGVyX3Byb2dyYW0tPlVuaWZvcm1IYXNoLT5nZXQobG9jYXRpb24sCisJCQkJCQkgICBwYXJhbXMtPlBhcmFtZXRlcnNbaW5kZXhdLk5hbWUpOworCSBhc3NlcnQoZm91bmQpOworCisJIGlmICghZm91bmQpCisJICAgIHJldHVybjsKKworCSBzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlICpzdG9yYWdlID0KKwkgICAgJnRoaXMtPnNoYWRlcl9wcm9ncmFtLT5Vbmlmb3JtU3RvcmFnZVtsb2NhdGlvbl07CisKKyAgICAgICAgIGFzc2VydChzdG9yYWdlLT5zYW1wbGVyW3NoYWRlcl90eXBlXS5hY3RpdmUpOworCisJIGZvciAodW5zaWduZWQgaW50IGogPSAwOyBqIDwgc2l6ZSAvIDQ7IGorKykKKyAgICAgICAgICAgIHBhcmFtcy0+UGFyYW1ldGVyVmFsdWVzW2luZGV4ICsgal1bMF0uZiA9CisgICAgICAgICAgICAgICBzdG9yYWdlLT5zYW1wbGVyW3NoYWRlcl90eXBlXS5pbmRleCArIGo7CisgICAgICB9CisgICB9CisKKyAgIC8qIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB1bmlmb3JtIHRoYXQncyBwcm9jZXNzZWQgZGV0ZXJtaW5lcyB0aGUgYmFzZQorICAgICogbG9jYXRpb24gb2YgdGhlIHdob2xlIHVuaWZvcm0gKGZvciBzdHJ1Y3R1cmVzKS4KKyAgICAqLworICAgaWYgKHRoaXMtPmlkeCA8IDApCisgICAgICB0aGlzLT5pZHggPSBpbmRleDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgcHJvZ3JhbSBwYXJhbWV0ZXJzIGxpc3QgZm9yIHRoZSB1c2VyIHVuaWZvcm1zIGluIGEgc2hhZGVyCisgKgorICogXHBhcmFtIHNoYWRlcl9wcm9ncmFtIExpbmtlZCBzaGFkZXIgcHJvZ3JhbS4gIFRoaXMgaXMgb25seSB1c2VkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgZW1pdCBwb3NzaWJsZSBsaW5rIGVycm9ycyB0byB0aGUgaW5mbyBsb2cuCisgKiBccGFyYW0gc2ggICAgICAgICAgICAgU2hhZGVyIHdob3NlIHVuaWZvcm1zIGFyZSB0byBiZSBwcm9jZXNzZWQuCisgKiBccGFyYW0gcGFyYW1zICAgICAgICAgUGFyYW1ldGVyIGxpc3QgdG8gYmUgZmlsbGVkIGluLgorICovCit2b2lkCitfbWVzYV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2xpc3RfZm9yX3VuaWZvcm1zKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbQorCQkJCQkgICAgKnNoYWRlcl9wcm9ncmFtLAorCQkJCQkgICAgc3RydWN0IGdsX3NoYWRlciAqc2gsCisJCQkJCSAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdAorCQkJCQkgICAgKnBhcmFtcykKK3sKKyAgIGFkZF91bmlmb3JtX3RvX3NoYWRlciBhZGQoc2hhZGVyX3Byb2dyYW0sIHBhcmFtcywgc2gtPlN0YWdlKTsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsIHNoLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKnZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICgodmFyID09IE5VTEwpIHx8ICh2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfdW5pZm9ybSkKKwkgIHx8IHZhci0+aXNfaW5fdW5pZm9ybV9ibG9jaygpIHx8IChzdHJuY21wKHZhci0+bmFtZSwgImdsXyIsIDMpID09IDApKQorCSBjb250aW51ZTsKKworICAgICAgYWRkLnByb2Nlc3ModmFyKTsKKyAgIH0KK30KKwordm9pZAorX21lc2FfYXNzb2NpYXRlX3VuaWZvcm1fc3RvcmFnZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkJCXN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW0sCisJCQkJc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtcykKK3sKKyAgIC8qIEFmdGVyIGFkZGluZyBlYWNoIHVuaWZvcm0gdG8gdGhlIHBhcmFtZXRlciBsaXN0LCBjb25uZWN0IHRoZSBzdG9yYWdlIGZvcgorICAgICogdGhlIHBhcmFtZXRlciB3aXRoIHRoZSB0cmFja2luZyBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgQVBJIGZvciB0aGUKKyAgICAqIHVuaWZvcm0uCisgICAgKi8KKyAgIHVuc2lnbmVkIGxhc3RfbG9jYXRpb24gPSB1bnNpZ25lZCh+MCk7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGFyYW1zLT5OdW1QYXJhbWV0ZXJzOyBpKyspIHsKKyAgICAgIGlmIChwYXJhbXMtPlBhcmFtZXRlcnNbaV0uVHlwZSAhPSBQUk9HUkFNX1VOSUZPUk0pCisJIGNvbnRpbnVlOworCisgICAgICB1bnNpZ25lZCBsb2NhdGlvbjsKKyAgICAgIGNvbnN0IGJvb2wgZm91bmQgPQorCSBzaGFkZXJfcHJvZ3JhbS0+VW5pZm9ybUhhc2gtPmdldChsb2NhdGlvbiwgcGFyYW1zLT5QYXJhbWV0ZXJzW2ldLk5hbWUpOworICAgICAgYXNzZXJ0KGZvdW5kKTsKKworICAgICAgaWYgKCFmb3VuZCkKKwkgY29udGludWU7CisKKyAgICAgIGlmIChsb2NhdGlvbiAhPSBsYXN0X2xvY2F0aW9uKSB7CisJIHN0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgKnN0b3JhZ2UgPQorCSAgICAmc2hhZGVyX3Byb2dyYW0tPlVuaWZvcm1TdG9yYWdlW2xvY2F0aW9uXTsKKwkgZW51bSBnbF91bmlmb3JtX2RyaXZlcl9mb3JtYXQgZm9ybWF0ID0gdW5pZm9ybV9uYXRpdmU7CisKKwkgdW5zaWduZWQgY29sdW1ucyA9IDA7CisJIHN3aXRjaCAoc3RvcmFnZS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGFzc2VydChjdHgtPkNvbnN0Lk5hdGl2ZUludGVnZXJzKTsKKwkgICAgZm9ybWF0ID0gdW5pZm9ybV9uYXRpdmU7CisJICAgIGNvbHVtbnMgPSAxOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBmb3JtYXQgPQorCSAgICAgICAoY3R4LT5Db25zdC5OYXRpdmVJbnRlZ2VycykgPyB1bmlmb3JtX25hdGl2ZSA6IHVuaWZvcm1faW50X2Zsb2F0OworCSAgICBjb2x1bW5zID0gMTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBmb3JtYXQgPSB1bmlmb3JtX25hdGl2ZTsKKwkgICAgY29sdW1ucyA9IHN0b3JhZ2UtPnR5cGUtPm1hdHJpeF9jb2x1bW5zOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgICAgaWYgKGN0eC0+Q29uc3QuTmF0aXZlSW50ZWdlcnMpIHsKKwkgICAgICAgZm9ybWF0ID0gKGN0eC0+Q29uc3QuVW5pZm9ybUJvb2xlYW5UcnVlID09IDEpCisJCSAgPyB1bmlmb3JtX2Jvb2xfaW50XzBfMSA6IHVuaWZvcm1fYm9vbF9pbnRfMF9ub3QwOworCSAgICB9IGVsc2UgeworCSAgICAgICBmb3JtYXQgPSB1bmlmb3JtX2Jvb2xfZmxvYXQ7CisJICAgIH0KKwkgICAgY29sdW1ucyA9IDE7CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9TQU1QTEVSOgorCSBjYXNlIEdMU0xfVFlQRV9JTUFHRToKKwkgICAgZm9ybWF0ID0gdW5pZm9ybV9uYXRpdmU7CisJICAgIGNvbHVtbnMgPSAxOworCSAgICBicmVhazsKKyAgICAgICAgIGNhc2UgR0xTTF9UWVBFX0FUT01JQ19VSU5UOgorICAgICAgICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6CisgICAgICAgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgICAgICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOgorICAgICAgICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICAgICAgICBjYXNlIEdMU0xfVFlQRV9JTlRFUkZBQ0U6CisJICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisJICAgIGJyZWFrOworCSB9CisKKwkgX21lc2FfdW5pZm9ybV9hdHRhY2hfZHJpdmVyX3N0b3JhZ2Uoc3RvcmFnZSwKKwkJCQkJICAgICA0ICogc2l6ZW9mKGZsb2F0KSAqIGNvbHVtbnMsCisJCQkJCSAgICAgNCAqIHNpemVvZihmbG9hdCksCisJCQkJCSAgICAgZm9ybWF0LAorCQkJCQkgICAgICZwYXJhbXMtPlBhcmFtZXRlclZhbHVlc1tpXSk7CisKKwkgLyogQWZ0ZXIgYXR0YWNoaW5nIHRoZSBkcml2ZXIncyBzdG9yYWdlIHRvIHRoZSB1bmlmb3JtLCBwcm9wYWdhdGUgYW55CisJICAqIGRhdGEgZnJvbSB0aGUgbGlua2VyJ3MgYmFja2luZyBzdG9yZS4gIFRoaXMgd2lsbCBjYXVzZSB2YWx1ZXMgZnJvbQorCSAgKiBpbml0aWFsaXplcnMgaW4gdGhlIHNvdXJjZSBjb2RlIHRvIGJlIGNvcGllZCBvdmVyLgorCSAgKi8KKwkgX21lc2FfcHJvcGFnYXRlX3VuaWZvcm1zX3RvX2RyaXZlcl9zdG9yYWdlKHN0b3JhZ2UsCisJCQkJCQkgICAgMCwKKwkJCQkJCSAgICBNQVgyKDEsIHN0b3JhZ2UtPmFycmF5X2VsZW1lbnRzKSk7CisKKwkgbGFzdF9sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgICAgfQorICAgfQorfQorCisvKgorICogT24gYSBiYXNpYyBibG9jayBiYXNpcywgdHJhY2tzIGF2YWlsYWJsZSBQUk9HUkFNX1RFTVBPUkFSWSByZWdpc3RlcgorICogY2hhbm5lbHMgZm9yIGNvcHkgcHJvcGFnYXRpb24gYW5kIHVwZGF0ZXMgZm9sbG93aW5nIGluc3RydWN0aW9ucyB0bworICogdXNlIHRoZSBvcmlnaW5hbCB2ZXJzaW9ucy4KKyAqCisgKiBUaGUgaXJfdG9fbWVzYV92aXNpdG9yIGxhemlseSBwcm9kdWNlcyBjb2RlIGFzc3VtaW5nIHRoYXQgdGhpcyBwYXNzCisgKiB3aWxsIG9jY3VyLiAgQXMgYW4gZXhhbXBsZSwgYSBUWFAgcHJvZHVjdGlvbiBiZWZvcmUgdGhpcyBwYXNzOgorICoKKyAqIDA6IE1PViBURU1QWzFdLCBJTlBVVFs0XS54eXl5OworICogMTogTU9WIFRFTVBbMV0udywgSU5QVVRbNF0ud3d3dzsKKyAqIDI6IFRYUCBURU1QWzJdLCBURU1QWzFdLCB0ZXh0dXJlWzBdLCAyRDsKKyAqCisgKiBhbmQgYWZ0ZXI6CisgKgorICogMDogTU9WIFRFTVBbMV0sIElOUFVUWzRdLnh5eXk7CisgKiAxOiBNT1YgVEVNUFsxXS53LCBJTlBVVFs0XS53d3d3OworICogMjogVFhQIFRFTVBbMl0sIElOUFVUWzRdLnh5eXcsIHRleHR1cmVbMF0sIDJEOworICoKKyAqIHdoaWNoIGFsbG93cyBmb3IgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIG9uIFRFTVBbMV0ncyB3cml0ZXMuCisgKi8KK3ZvaWQKK2lyX3RvX21lc2FfdmlzaXRvcjo6Y29weV9wcm9wYWdhdGUodm9pZCkKK3sKKyAgIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKiphY3AgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsCisJCQkJCQkgICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqLAorCQkJCQkJICAgIHRoaXMtPm5leHRfdGVtcCAqIDQpOworICAgaW50ICphY3BfbGV2ZWwgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgdGhpcy0+bmV4dF90ZW1wICogNCk7CisgICBpbnQgbGV2ZWwgPSAwOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqaW5zdCA9IChpcl90b19tZXNhX2luc3RydWN0aW9uICopIG5vZGU7CisKKyAgICAgIGFzc2VydChpbnN0LT5kc3QuZmlsZSAhPSBQUk9HUkFNX1RFTVBPUkFSWQorCSAgICAgfHwgaW5zdC0+ZHN0LmluZGV4IDwgdGhpcy0+bmV4dF90ZW1wKTsKKworICAgICAgLyogRmlyc3QsIGRvIGFueSBjb3B5IHByb3BhZ2F0aW9uIHBvc3NpYmxlIGludG8gdGhlIHNyYyByZWdzLiAqLworICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAzOyByKyspIHsKKwkgaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqZmlyc3QgPSBOVUxMOworCSBib29sIGdvb2QgPSB0cnVlOworCSBpbnQgYWNwX2Jhc2UgPSBpbnN0LT5zcmNbcl0uaW5kZXggKiA0OworCisJIGlmIChpbnN0LT5zcmNbcl0uZmlsZSAhPSBQUk9HUkFNX1RFTVBPUkFSWSB8fAorCSAgICAgaW5zdC0+c3JjW3JdLnJlbGFkZHIpCisJICAgIGNvbnRpbnVlOworCisJIC8qIFNlZSBpZiB3ZSBjYW4gZmluZCBlbnRyaWVzIGluIHRoZSBBQ1AgY29uc2lzdGluZyBvZiBNT1ZzCisJICAqIGZyb20gdGhlIHNhbWUgc3JjIHJlZ2lzdGVyIGZvciBhbGwgdGhlIHN3aXp6bGVkIGNoYW5uZWxzCisJICAqIG9mIHRoaXMgc3JjIHJlZ2lzdGVyIHJlZmVyZW5jZS4KKwkgICovCisJIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJICAgIGludCBzcmNfY2hhbiA9IEdFVF9TV1ooaW5zdC0+c3JjW3JdLnN3aXp6bGUsIGkpOworCSAgICBpcl90b19tZXNhX2luc3RydWN0aW9uICpjb3B5X2NoYW4gPSBhY3BbYWNwX2Jhc2UgKyBzcmNfY2hhbl07CisKKwkgICAgaWYgKCFjb3B5X2NoYW4pIHsKKwkgICAgICAgZ29vZCA9IGZhbHNlOworCSAgICAgICBicmVhazsKKwkgICAgfQorCisJICAgIGFzc2VydChhY3BfbGV2ZWxbYWNwX2Jhc2UgKyBzcmNfY2hhbl0gPD0gbGV2ZWwpOworCisJICAgIGlmICghZmlyc3QpIHsKKwkgICAgICAgZmlyc3QgPSBjb3B5X2NoYW47CisJICAgIH0gZWxzZSB7CisJICAgICAgIGlmIChmaXJzdC0+c3JjWzBdLmZpbGUgIT0gY29weV9jaGFuLT5zcmNbMF0uZmlsZSB8fAorCQkgICBmaXJzdC0+c3JjWzBdLmluZGV4ICE9IGNvcHlfY2hhbi0+c3JjWzBdLmluZGV4KSB7CisJCSAgZ29vZCA9IGZhbHNlOworCQkgIGJyZWFrOworCSAgICAgICB9CisJICAgIH0KKwkgfQorCisJIGlmIChnb29kKSB7CisJICAgIC8qIFdlJ3ZlIG5vdyB2YWxpZGF0ZWQgdGhhdCB3ZSBjYW4gY29weS1wcm9wYWdhdGUgdG8KKwkgICAgICogcmVwbGFjZSB0aGlzIHNyYyByZWdpc3RlciByZWZlcmVuY2UuICBEbyBpdC4KKwkgICAgICovCisJICAgIGluc3QtPnNyY1tyXS5maWxlID0gZmlyc3QtPnNyY1swXS5maWxlOworCSAgICBpbnN0LT5zcmNbcl0uaW5kZXggPSBmaXJzdC0+c3JjWzBdLmluZGV4OworCisJICAgIGludCBzd2l6emxlID0gMDsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkgICAgICAgaW50IHNyY19jaGFuID0gR0VUX1NXWihpbnN0LT5zcmNbcl0uc3dpenpsZSwgaSk7CisJICAgICAgIGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKmNvcHlfaW5zdCA9IGFjcFthY3BfYmFzZSArIHNyY19jaGFuXTsKKwkgICAgICAgc3dpenpsZSB8PSAoR0VUX1NXWihjb3B5X2luc3QtPnNyY1swXS5zd2l6emxlLCBzcmNfY2hhbikgPDwKKwkJCSAgICgzICogaSkpOworCSAgICB9CisJICAgIGluc3QtPnNyY1tyXS5zd2l6emxlID0gc3dpenpsZTsKKwkgfQorICAgICAgfQorCisgICAgICBzd2l0Y2ggKGluc3QtPm9wKSB7CisgICAgICBjYXNlIE9QQ09ERV9CR05MT09QOgorICAgICAgY2FzZSBPUENPREVfRU5ETE9PUDoKKwkgLyogRW5kIG9mIGEgYmFzaWMgYmxvY2ssIGNsZWFyIHRoZSBBQ1AgZW50aXJlbHkuICovCisJIG1lbXNldChhY3AsIDAsIHNpemVvZigqYWNwKSAqIHRoaXMtPm5leHRfdGVtcCAqIDQpOworCSBicmVhazsKKworICAgICAgY2FzZSBPUENPREVfSUY6CisJICsrbGV2ZWw7CisJIGJyZWFrOworCisgICAgICBjYXNlIE9QQ09ERV9FTkRJRjoKKyAgICAgIGNhc2UgT1BDT0RFX0VMU0U6CisJIC8qIENsZWFyIGFsbCBjaGFubmVscyB3cml0dGVuIGluc2lkZSB0aGUgYmxvY2sgZnJvbSB0aGUgQUNQLCBidXQKKwkgICogbGVhdmluZyB0aG9zZSB0aGF0IHdlcmUgbm90IHRvdWNoZWQuCisJICAqLworCSBmb3IgKGludCByID0gMDsgciA8IHRoaXMtPm5leHRfdGVtcDsgcisrKSB7CisJICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisJICAgICAgIGlmICghYWNwWzQgKiByICsgY10pCisJCSAgY29udGludWU7CisKKwkgICAgICAgaWYgKGFjcF9sZXZlbFs0ICogciArIGNdID49IGxldmVsKQorCQkgIGFjcFs0ICogciArIGNdID0gTlVMTDsKKwkgICAgfQorCSB9CisJIGlmIChpbnN0LT5vcCA9PSBPUENPREVfRU5ESUYpCisJICAgIC0tbGV2ZWw7CisJIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorCSAvKiBDb250aW51aW5nIHRoZSBibG9jaywgY2xlYXIgYW55IHdyaXR0ZW4gY2hhbm5lbHMgZnJvbQorCSAgKiB0aGUgQUNQLgorCSAgKi8KKwkgaWYgKGluc3QtPmRzdC5maWxlID09IFBST0dSQU1fVEVNUE9SQVJZICYmIGluc3QtPmRzdC5yZWxhZGRyKSB7CisJICAgIC8qIEFueSB0ZW1wb3JhcnkgbWlnaHQgYmUgd3JpdHRlbiwgc28gbm8gY29weSBwcm9wYWdhdGlvbgorCSAgICAgKiBhY3Jvc3MgdGhpcyBpbnN0cnVjdGlvbi4KKwkgICAgICovCisJICAgIG1lbXNldChhY3AsIDAsIHNpemVvZigqYWNwKSAqIHRoaXMtPm5leHRfdGVtcCAqIDQpOworCSB9IGVsc2UgaWYgKGluc3QtPmRzdC5maWxlID09IFBST0dSQU1fT1VUUFVUICYmCisJCSAgICBpbnN0LT5kc3QucmVsYWRkcikgeworCSAgICAvKiBBbnkgb3V0cHV0IG1pZ2h0IGJlIHdyaXR0ZW4sIHNvIG5vIGNvcHkgcHJvcGFnYXRpb24KKwkgICAgICogZnJvbSBvdXRwdXRzIGFjcm9zcyB0aGlzIGluc3RydWN0aW9uLgorCSAgICAgKi8KKwkgICAgZm9yIChpbnQgciA9IDA7IHIgPCB0aGlzLT5uZXh0X3RlbXA7IHIrKykgeworCSAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgeworCQkgIGlmICghYWNwWzQgKiByICsgY10pCisJCSAgICAgY29udGludWU7CisKKwkJICBpZiAoYWNwWzQgKiByICsgY10tPnNyY1swXS5maWxlID09IFBST0dSQU1fT1VUUFVUKQorCQkgICAgIGFjcFs0ICogciArIGNdID0gTlVMTDsKKwkgICAgICAgfQorCSAgICB9CisJIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgfHwKKwkJICAgIGluc3QtPmRzdC5maWxlID09IFBST0dSQU1fT1VUUFVUKSB7CisJICAgIC8qIENsZWFyIHdoZXJlIGl0J3MgdXNlZCBhcyBkc3QuICovCisJICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSkgeworCSAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgeworCQkgIGlmIChpbnN0LT5kc3Qud3JpdGVtYXNrICYgKDEgPDwgYykpIHsKKwkJICAgICBhY3BbNCAqIGluc3QtPmRzdC5pbmRleCArIGNdID0gTlVMTDsKKwkJICB9CisJICAgICAgIH0KKwkgICAgfQorCisJICAgIC8qIENsZWFyIHdoZXJlIGl0J3MgdXNlZCBhcyBzcmMuICovCisJICAgIGZvciAoaW50IHIgPSAwOyByIDwgdGhpcy0+bmV4dF90ZW1wOyByKyspIHsKKwkgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspIHsKKwkJICBpZiAoIWFjcFs0ICogciArIGNdKQorCQkgICAgIGNvbnRpbnVlOworCisJCSAgaW50IHNyY19jaGFuID0gR0VUX1NXWihhY3BbNCAqIHIgKyBjXS0+c3JjWzBdLnN3aXp6bGUsIGMpOworCisJCSAgaWYgKGFjcFs0ICogciArIGNdLT5zcmNbMF0uZmlsZSA9PSBpbnN0LT5kc3QuZmlsZSAmJgorCQkgICAgICBhY3BbNCAqIHIgKyBjXS0+c3JjWzBdLmluZGV4ID09IGluc3QtPmRzdC5pbmRleCAmJgorCQkgICAgICBpbnN0LT5kc3Qud3JpdGVtYXNrICYgKDEgPDwgc3JjX2NoYW4pKQorCQkgIHsKKwkJICAgICBhY3BbNCAqIHIgKyBjXSA9IE5VTEw7CisJCSAgfQorCSAgICAgICB9CisJICAgIH0KKwkgfQorCSBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogSWYgdGhpcyBpcyBhIGNvcHksIGFkZCBpdCB0byB0aGUgQUNQLiAqLworICAgICAgaWYgKGluc3QtPm9wID09IE9QQ09ERV9NT1YgJiYKKwkgIGluc3QtPmRzdC5maWxlID09IFBST0dSQU1fVEVNUE9SQVJZICYmCisJICAhKGluc3QtPmRzdC5maWxlID09IGluc3QtPnNyY1swXS5maWxlICYmCisJICAgIGluc3QtPmRzdC5pbmRleCA9PSBpbnN0LT5zcmNbMF0uaW5kZXgpICYmCisJICAhaW5zdC0+ZHN0LnJlbGFkZHIgJiYKKwkgICFpbnN0LT5zYXR1cmF0ZSAmJgorCSAgIWluc3QtPnNyY1swXS5yZWxhZGRyICYmCisJICAhaW5zdC0+c3JjWzBdLm5lZ2F0ZSkgeworCSBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCSAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmICgxIDw8IGkpKSB7CisJICAgICAgIGFjcFs0ICogaW5zdC0+ZHN0LmluZGV4ICsgaV0gPSBpbnN0OworCSAgICAgICBhY3BfbGV2ZWxbNCAqIGluc3QtPmRzdC5pbmRleCArIGldID0gbGV2ZWw7CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQorCisgICByYWxsb2NfZnJlZShhY3BfbGV2ZWwpOworICAgcmFsbG9jX2ZyZWUoYWNwKTsKK30KKworCisvKioKKyAqIENvbnZlcnQgYSBzaGFkZXIncyBHTFNMIElSIGludG8gYSBNZXNhIGdsX3Byb2dyYW0uCisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2lyX2dldF9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyKQoreworICAgaXJfdG9fbWVzYV92aXNpdG9yIHY7CisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqbWVzYV9pbnN0cnVjdGlvbnMsICptZXNhX2luc3Q7CisgICBpcl9pbnN0cnVjdGlvbiAqKm1lc2FfaW5zdHJ1Y3Rpb25fYW5ub3RhdGlvbjsKKyAgIGludCBpOworICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2c7CisgICBHTGVudW0gdGFyZ2V0ID0gX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3Byb2dyYW0oc2hhZGVyLT5TdGFnZSk7CisgICBjb25zdCBjaGFyICp0YXJnZXRfc3RyaW5nID0gX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhzaGFkZXItPlN0YWdlKTsKKyAgIHN0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucyAqb3B0aW9ucyA9CisgICAgICAgICAmY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbc2hhZGVyLT5TdGFnZV07CisKKyAgIHZhbGlkYXRlX2lyX3RyZWUoc2hhZGVyLT5pcik7CisKKyAgIHByb2cgPSBjdHgtPkRyaXZlci5OZXdQcm9ncmFtKGN0eCwgdGFyZ2V0LCBzaGFkZXJfcHJvZ3JhbS0+TmFtZSk7CisgICBpZiAoIXByb2cpCisgICAgICByZXR1cm4gTlVMTDsKKyAgIHByb2ctPlBhcmFtZXRlcnMgPSBfbWVzYV9uZXdfcGFyYW1ldGVyX2xpc3QoKTsKKyAgIHYuY3R4ID0gY3R4OworICAgdi5wcm9nID0gcHJvZzsKKyAgIHYuc2hhZGVyX3Byb2dyYW0gPSBzaGFkZXJfcHJvZ3JhbTsKKyAgIHYub3B0aW9ucyA9IG9wdGlvbnM7CisKKyAgIF9tZXNhX2dlbmVyYXRlX3BhcmFtZXRlcnNfbGlzdF9mb3JfdW5pZm9ybXMoc2hhZGVyX3Byb2dyYW0sIHNoYWRlciwKKwkJCQkJICAgICAgIHByb2ctPlBhcmFtZXRlcnMpOworCisgICAvKiBFbWl0IE1lc2EgSVIgZm9yIG1haW4oKS4gKi8KKyAgIHZpc2l0X2V4ZWNfbGlzdChzaGFkZXItPmlyLCAmdik7CisgICB2LmVtaXQoTlVMTCwgT1BDT0RFX0VORCk7CisKKyAgIHByb2ctPk51bVRlbXBvcmFyaWVzID0gdi5uZXh0X3RlbXA7CisKKyAgIGludCBudW1faW5zdHJ1Y3Rpb25zID0gMDsKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdi5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIG51bV9pbnN0cnVjdGlvbnMrKzsKKyAgIH0KKworICAgbWVzYV9pbnN0cnVjdGlvbnMgPQorICAgICAgKHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICopY2FsbG9jKG51bV9pbnN0cnVjdGlvbnMsCisJCQkJCXNpemVvZigqbWVzYV9pbnN0cnVjdGlvbnMpKTsKKyAgIG1lc2FfaW5zdHJ1Y3Rpb25fYW5ub3RhdGlvbiA9IHJhbGxvY19hcnJheSh2Lm1lbV9jdHgsIGlyX2luc3RydWN0aW9uICosCisJCQkJCSAgICAgIG51bV9pbnN0cnVjdGlvbnMpOworCisgICB2LmNvcHlfcHJvcGFnYXRlKCk7CisKKyAgIC8qIENvbnZlcnQgaXJfbWVzYV9pbnN0cnVjdGlvbnMgaW50byBwcm9nX2luc3RydWN0aW9ucy4KKyAgICAqLworICAgbWVzYV9pbnN0ID0gbWVzYV9pbnN0cnVjdGlvbnM7CisgICBpID0gMDsKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdi5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGNvbnN0IGlyX3RvX21lc2FfaW5zdHJ1Y3Rpb24gKmluc3QgPSAoaXJfdG9fbWVzYV9pbnN0cnVjdGlvbiAqKSBub2RlOworCisgICAgICBtZXNhX2luc3QtPk9wY29kZSA9IGluc3QtPm9wOworICAgICAgbWVzYV9pbnN0LT5Db25kVXBkYXRlID0gaW5zdC0+Y29uZF91cGRhdGU7CisgICAgICBpZiAoaW5zdC0+c2F0dXJhdGUpCisJIG1lc2FfaW5zdC0+U2F0dXJhdGVNb2RlID0gU0FUVVJBVEVfWkVST19PTkU7CisgICAgICBtZXNhX2luc3QtPkRzdFJlZy5GaWxlID0gaW5zdC0+ZHN0LmZpbGU7CisgICAgICBtZXNhX2luc3QtPkRzdFJlZy5JbmRleCA9IGluc3QtPmRzdC5pbmRleDsKKyAgICAgIG1lc2FfaW5zdC0+RHN0UmVnLkNvbmRNYXNrID0gaW5zdC0+ZHN0LmNvbmRfbWFzazsKKyAgICAgIG1lc2FfaW5zdC0+RHN0UmVnLldyaXRlTWFzayA9IGluc3QtPmRzdC53cml0ZW1hc2s7CisgICAgICBtZXNhX2luc3QtPkRzdFJlZy5SZWxBZGRyID0gaW5zdC0+ZHN0LnJlbGFkZHIgIT0gTlVMTDsKKyAgICAgIG1lc2FfaW5zdC0+U3JjUmVnWzBdID0gbWVzYV9zcmNfcmVnX2Zyb21faXJfc3JjX3JlZyhpbnN0LT5zcmNbMF0pOworICAgICAgbWVzYV9pbnN0LT5TcmNSZWdbMV0gPSBtZXNhX3NyY19yZWdfZnJvbV9pcl9zcmNfcmVnKGluc3QtPnNyY1sxXSk7CisgICAgICBtZXNhX2luc3QtPlNyY1JlZ1syXSA9IG1lc2Ffc3JjX3JlZ19mcm9tX2lyX3NyY19yZWcoaW5zdC0+c3JjWzJdKTsKKyAgICAgIG1lc2FfaW5zdC0+VGV4U3JjVW5pdCA9IGluc3QtPnNhbXBsZXI7CisgICAgICBtZXNhX2luc3QtPlRleFNyY1RhcmdldCA9IGluc3QtPnRleF90YXJnZXQ7CisgICAgICBtZXNhX2luc3QtPlRleFNoYWRvdyA9IGluc3QtPnRleF9zaGFkb3c7CisgICAgICBtZXNhX2luc3RydWN0aW9uX2Fubm90YXRpb25baV0gPSBpbnN0LT5pcjsKKworICAgICAgLyogU2V0IEluZGlyZWN0UmVnaXN0ZXJGaWxlcy4gKi8KKyAgICAgIGlmIChtZXNhX2luc3QtPkRzdFJlZy5SZWxBZGRyKQorICAgICAgICAgcHJvZy0+SW5kaXJlY3RSZWdpc3RlckZpbGVzIHw9IDEgPDwgbWVzYV9pbnN0LT5Ec3RSZWcuRmlsZTsKKworICAgICAgLyogVXBkYXRlIHByb2dyYW0ncyBiaXRtYXNrIG9mIGluZGlyZWN0bHkgYWNjZXNzZWQgcmVnaXN0ZXIgZmlsZXMgKi8KKyAgICAgIGZvciAodW5zaWduZWQgc3JjID0gMDsgc3JjIDwgMzsgc3JjKyspCisgICAgICAgICBpZiAobWVzYV9pbnN0LT5TcmNSZWdbc3JjXS5SZWxBZGRyKQorICAgICAgICAgICAgcHJvZy0+SW5kaXJlY3RSZWdpc3RlckZpbGVzIHw9IDEgPDwgbWVzYV9pbnN0LT5TcmNSZWdbc3JjXS5GaWxlOworCisgICAgICBzd2l0Y2ggKG1lc2FfaW5zdC0+T3Bjb2RlKSB7CisgICAgICBjYXNlIE9QQ09ERV9JRjoKKwkgaWYgKG9wdGlvbnMtPk1heElmRGVwdGggPT0gMCkgeworCSAgICBsaW5rZXJfd2FybmluZyhzaGFkZXJfcHJvZ3JhbSwKKwkJCSAgICJDb3VsZG4ndCBmbGF0dGVuIGlmLXN0YXRlbWVudC4gICIKKwkJCSAgICJUaGlzIHdpbGwgbGlrZWx5IHJlc3VsdCBpbiBzb2Z0d2FyZSAiCisJCQkgICAicmFzdGVyaXphdGlvbi5cbiIpOworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfQkdOTE9PUDoKKwkgaWYgKG9wdGlvbnMtPkVtaXROb0xvb3BzKSB7CisJICAgIGxpbmtlcl93YXJuaW5nKHNoYWRlcl9wcm9ncmFtLAorCQkJICAgIkNvdWxkbid0IHVucm9sbCBsb29wLiAgIgorCQkJICAgIlRoaXMgd2lsbCBsaWtlbHkgcmVzdWx0IGluIHNvZnR3YXJlICIKKwkJCSAgICJyYXN0ZXJpemF0aW9uLlxuIik7CisJIH0KKwkgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9DT05UOgorCSBpZiAob3B0aW9ucy0+RW1pdE5vQ29udCkgeworCSAgICBsaW5rZXJfd2FybmluZyhzaGFkZXJfcHJvZ3JhbSwKKwkJCSAgICJDb3VsZG4ndCBsb3dlciBjb250aW51ZS1zdGF0ZW1lbnQuICAiCisJCQkgICAiVGhpcyB3aWxsIGxpa2VseSByZXN1bHQgaW4gc29mdHdhcmUgIgorCQkJICAgInJhc3Rlcml6YXRpb24uXG4iKTsKKwkgfQorCSBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0FSTDoKKwkgcHJvZy0+TnVtQWRkcmVzc1JlZ3MgPSAxOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGJyZWFrOworICAgICAgfQorCisgICAgICBtZXNhX2luc3QrKzsKKyAgICAgIGkrKzsKKworICAgICAgaWYgKCFzaGFkZXJfcHJvZ3JhbS0+TGlua1N0YXR1cykKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICBpZiAoIXNoYWRlcl9wcm9ncmFtLT5MaW5rU3RhdHVzKSB7CisgICAgICBnb3RvIGZhaWxfZXhpdDsKKyAgIH0KKworICAgc2V0X2JyYW5jaHRhcmdldHMoJnYsIG1lc2FfaW5zdHJ1Y3Rpb25zLCBudW1faW5zdHJ1Y3Rpb25zKTsKKworICAgaWYgKGN0eC0+R2xzbEZsYWdzICYgR0xTTF9EVU1QKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdMU0wgSVIgZm9yIGxpbmtlZCAlcyBwcm9ncmFtICVkOlxuIiwgdGFyZ2V0X3N0cmluZywKKwkgICAgICBzaGFkZXJfcHJvZ3JhbS0+TmFtZSk7CisgICAgICBfbWVzYV9wcmludF9pcihzdGRlcnIsIHNoYWRlci0+aXIsIE5VTEwpOworICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJNZXNhIElSIGZvciBsaW5rZWQgJXMgcHJvZ3JhbSAlZDpcbiIsIHRhcmdldF9zdHJpbmcsCisJICAgICAgc2hhZGVyX3Byb2dyYW0tPk5hbWUpOworICAgICAgcHJpbnRfcHJvZ3JhbShtZXNhX2luc3RydWN0aW9ucywgbWVzYV9pbnN0cnVjdGlvbl9hbm5vdGF0aW9uLAorCQkgICAgbnVtX2luc3RydWN0aW9ucyk7CisgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgIH0KKworICAgcHJvZy0+SW5zdHJ1Y3Rpb25zID0gbWVzYV9pbnN0cnVjdGlvbnM7CisgICBwcm9nLT5OdW1JbnN0cnVjdGlvbnMgPSBudW1faW5zdHJ1Y3Rpb25zOworCisgICAvKiBTZXR0aW5nIHRoaXMgdG8gTlVMTCBwcmV2ZW50cyBhIHBvc3NpYmxlIGRvdWJsZSBmcmVlIGluIHRoZSBmYWlsX2V4aXQKKyAgICAqIHBhdGggKGZhciBiZWxvdykuCisgICAgKi8KKyAgIG1lc2FfaW5zdHJ1Y3Rpb25zID0gTlVMTDsKKworICAgZG9fc2V0X3Byb2dyYW1faW5vdXRzKHNoYWRlci0+aXIsIHByb2csIHNoYWRlci0+U3RhZ2UpOworCisgICBwcm9nLT5TYW1wbGVyc1VzZWQgPSBzaGFkZXItPmFjdGl2ZV9zYW1wbGVyczsKKyAgIHByb2ctPlNoYWRvd1NhbXBsZXJzID0gc2hhZGVyLT5zaGFkb3dfc2FtcGxlcnM7CisgICBfbWVzYV91cGRhdGVfc2hhZGVyX3RleHR1cmVzX3VzZWQoc2hhZGVyX3Byb2dyYW0sIHByb2cpOworCisgICAvKiBTZXQgdGhlIGdsX0ZyYWdEZXB0aCBsYXlvdXQuICovCisgICBpZiAodGFyZ2V0ID09IEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCKSB7CisgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSAoc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKilwcm9nOworICAgICAgZnAtPkZyYWdEZXB0aExheW91dCA9IHNoYWRlcl9wcm9ncmFtLT5GcmFnRGVwdGhMYXlvdXQ7CisgICB9CisKKyAgIF9tZXNhX3JlZmVyZW5jZV9wcm9ncmFtKGN0eCwgJnNoYWRlci0+UHJvZ3JhbSwgcHJvZyk7CisKKyAgIGlmICgoY3R4LT5HbHNsRmxhZ3MgJiBHTFNMX05PX09QVCkgPT0gMCkgeworICAgICAgX21lc2Ffb3B0aW1pemVfcHJvZ3JhbShjdHgsIHByb2cpOworICAgfQorCisgICAvKiBUaGlzIGhhcyB0byBiZSBkb25lIGxhc3QuICBBbnkgb3BlcmF0aW9uIHRoYXQgY2FuIGNhdXNlCisgICAgKiBwcm9nLT5QYXJhbWV0ZXJWYWx1ZXMgdG8gZ2V0IHJlYWxsb2NhdGVkIChlLmcuLCBhbnl0aGluZyB0aGF0IGFkZHMgYQorICAgICogcHJvZ3JhbSBjb25zdGFudCkgaGFzIHRvIGhhcHBlbiBiZWZvcmUgY3JlYXRpbmcgdGhpcyBsaW5rYWdlLgorICAgICovCisgICBfbWVzYV9hc3NvY2lhdGVfdW5pZm9ybV9zdG9yYWdlKGN0eCwgc2hhZGVyX3Byb2dyYW0sIHByb2ctPlBhcmFtZXRlcnMpOworICAgaWYgKCFzaGFkZXJfcHJvZ3JhbS0+TGlua1N0YXR1cykgeworICAgICAgZ290byBmYWlsX2V4aXQ7CisgICB9CisKKyAgIHJldHVybiBwcm9nOworCitmYWlsX2V4aXQ6CisgICBmcmVlKG1lc2FfaW5zdHJ1Y3Rpb25zKTsKKyAgIF9tZXNhX3JlZmVyZW5jZV9wcm9ncmFtKGN0eCwgJnNoYWRlci0+UHJvZ3JhbSwgTlVMTCk7CisgICByZXR1cm4gTlVMTDsKK30KKworZXh0ZXJuICJDIiB7CisKKy8qKgorICogTGluayBhIHNoYWRlci4KKyAqIENhbGxlZCB2aWEgY3R4LT5Ecml2ZXIuTGlua1NoYWRlcigpCisgKiBUaGlzIGFjdHVhbGx5IGludm9sdmVzIGNvbnZlcnRpbmcgR0xTTCBJUiBpbnRvIE1lc2EgZ2xfcHJvZ3JhbXMgd2l0aAorICogY29kZSBsb3dlcmluZyBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucy4KKyAqLworR0xib29sZWFuCitfbWVzYV9pcl9saW5rX3NoYWRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCit7CisgICBhc3NlcnQocHJvZy0+TGlua1N0YXR1cyk7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworICAgICAgaWYgKHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldID09IE5VTEwpCisJIGNvbnRpbnVlOworCisgICAgICBib29sIHByb2dyZXNzOworICAgICAgZXhlY19saXN0ICppciA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldLT5pcjsKKyAgICAgIGNvbnN0IHN0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucyAqb3B0aW9ucyA9CisgICAgICAgICAgICAmY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0tPlN0YWdlXTsKKworICAgICAgZG8geworCSBwcm9ncmVzcyA9IGZhbHNlOworCisJIC8qIExvd2VyaW5nICovCisJIGRvX21hdF9vcF90b192ZWMoaXIpOworCSBsb3dlcl9pbnN0cnVjdGlvbnMoaXIsIChNT0RfVE9fRlJBQ1QgfCBESVZfVE9fTVVMX1JDUCB8IEVYUF9UT19FWFAyCisJCQkJIHwgTE9HX1RPX0xPRzIgfCBJTlRfRElWX1RPX01VTF9SQ1AKKwkJCQkgfCAoKG9wdGlvbnMtPkVtaXROb1BvdykgPyBQT1dfVE9fRVhQMiA6IDApKSk7CisKKwkgcHJvZ3Jlc3MgPSBkb19sb3dlcl9qdW1wcyhpciwgdHJ1ZSwgdHJ1ZSwgb3B0aW9ucy0+RW1pdE5vTWFpblJldHVybiwgb3B0aW9ucy0+RW1pdE5vQ29udCwgb3B0aW9ucy0+RW1pdE5vTG9vcHMpIHx8IHByb2dyZXNzOworCisJIHByb2dyZXNzID0gZG9fY29tbW9uX29wdGltaXphdGlvbihpciwgdHJ1ZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLCBjdHgtPkNvbnN0Lk5hdGl2ZUludGVnZXJzKQorCSAgIHx8IHByb2dyZXNzOworCisJIHByb2dyZXNzID0gbG93ZXJfcXVhZG9wX3ZlY3RvcihpciwgdHJ1ZSkgfHwgcHJvZ3Jlc3M7CisKKwkgaWYgKG9wdGlvbnMtPk1heElmRGVwdGggPT0gMCkKKwkgICAgcHJvZ3Jlc3MgPSBsb3dlcl9kaXNjYXJkKGlyKSB8fCBwcm9ncmVzczsKKworCSBwcm9ncmVzcyA9IGxvd2VyX2lmX3RvX2NvbmRfYXNzaWduKGlyLCBvcHRpb25zLT5NYXhJZkRlcHRoKSB8fCBwcm9ncmVzczsKKworCSBpZiAob3B0aW9ucy0+RW1pdE5vTm9pc2UpCisJICAgIHByb2dyZXNzID0gbG93ZXJfbm9pc2UoaXIpIHx8IHByb2dyZXNzOworCisJIC8qIElmIHRoZXJlIGFyZSBmb3JtcyBvZiBpbmRpcmVjdCBhZGRyZXNzaW5nIHRoYXQgdGhlIGRyaXZlcgorCSAgKiBjYW5ub3QgaGFuZGxlLCBwZXJmb3JtIHRoZSBsb3dlcmluZyBwYXNzLgorCSAgKi8KKwkgaWYgKG9wdGlvbnMtPkVtaXROb0luZGlyZWN0SW5wdXQgfHwgb3B0aW9ucy0+RW1pdE5vSW5kaXJlY3RPdXRwdXQKKwkgICAgIHx8IG9wdGlvbnMtPkVtaXROb0luZGlyZWN0VGVtcCB8fCBvcHRpb25zLT5FbWl0Tm9JbmRpcmVjdFVuaWZvcm0pCisJICAgcHJvZ3Jlc3MgPQorCSAgICAgbG93ZXJfdmFyaWFibGVfaW5kZXhfdG9fY29uZF9hc3NpZ24oaXIsCisJCQkJCQkgb3B0aW9ucy0+RW1pdE5vSW5kaXJlY3RJbnB1dCwKKwkJCQkJCSBvcHRpb25zLT5FbWl0Tm9JbmRpcmVjdE91dHB1dCwKKwkJCQkJCSBvcHRpb25zLT5FbWl0Tm9JbmRpcmVjdFRlbXAsCisJCQkJCQkgb3B0aW9ucy0+RW1pdE5vSW5kaXJlY3RVbmlmb3JtKQorCSAgICAgfHwgcHJvZ3Jlc3M7CisKKwkgcHJvZ3Jlc3MgPSBkb192ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ24oaXIpIHx8IHByb2dyZXNzOworICAgICAgICAgcHJvZ3Jlc3MgPSBsb3dlcl92ZWN0b3JfaW5zZXJ0KGlyLCB0cnVlKSB8fCBwcm9ncmVzczsKKyAgICAgIH0gd2hpbGUgKHByb2dyZXNzKTsKKworICAgICAgdmFsaWRhdGVfaXJfdHJlZShpcik7CisgICB9CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKmxpbmtlZF9wcm9nOworCisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0gPT0gTlVMTCkKKwkgY29udGludWU7CisKKyAgICAgIGxpbmtlZF9wcm9nID0gX21lc2FfaXJfZ2V0X3Byb2dyYW0oY3R4LCBwcm9nLCBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXSk7CisKKyAgICAgIGlmIChsaW5rZWRfcHJvZykgeworICAgICAgICAgX21lc2FfY29weV9saW5rZWRfcHJvZ3JhbV9kYXRhKChnbF9zaGFkZXJfc3RhZ2UpIGksIHByb2csIGxpbmtlZF9wcm9nKTsKKworCSBfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShjdHgsICZwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+UHJvZ3JhbSwKKwkJCQkgbGlua2VkX3Byb2cpOworICAgICAgICAgaWYgKCFjdHgtPkRyaXZlci5Qcm9ncmFtU3RyaW5nTm90aWZ5KGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fcHJvZ3JhbShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZWRfcHJvZykpIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oY3R4LCAmbGlua2VkX3Byb2csIE5VTEwpOworICAgfQorCisgICByZXR1cm4gcHJvZy0+TGlua1N0YXR1czsKK30KKworLyoqCisgKiBMaW5rIGEgR0xTTCBzaGFkZXIgcHJvZ3JhbS4gIENhbGxlZCB2aWEgZ2xMaW5rUHJvZ3JhbSgpLgorICovCit2b2lkCitfbWVzYV9nbHNsX2xpbmtfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHVuc2lnbmVkIGludCBpOworCisgICBfbWVzYV9jbGVhcl9zaGFkZXJfcHJvZ3JhbV9kYXRhKGN0eCwgcHJvZyk7CisKKyAgIHByb2ctPkxpbmtTdGF0dXMgPSBHTF9UUlVFOworCisgICBmb3IgKGkgPSAwOyBpIDwgcHJvZy0+TnVtU2hhZGVyczsgaSsrKSB7CisgICAgICBpZiAoIXByb2ctPlNoYWRlcnNbaV0tPkNvbXBpbGVTdGF0dXMpIHsKKwkgbGlua2VyX2Vycm9yKHByb2csICJsaW5raW5nIHdpdGggdW5jb21waWxlZCBzaGFkZXIiKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogU2VhcmNoIHByb2dyYW0gZGlzayBjYWNoZSBpZiBhY3RpdmUuICovCisgICBpZiAoY3R4LT5CaW5hcnlQcm9ncmFtQ2FjaGVBY3RpdmUgJiYgbWVzYV9wcm9ncmFtX2Rpc2tjYWNoZV9maW5kKGN0eCwgcHJvZykgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKHByb2ctPkxpbmtTdGF0dXMpIHsKKyAgICAgIGxpbmtfc2hhZGVycyhjdHgsIHByb2cpOworICAgfQorCisgICBpZiAocHJvZy0+TGlua1N0YXR1cykgeworICAgICAgaWYgKCFjdHgtPkRyaXZlci5MaW5rU2hhZGVyKGN0eCwgcHJvZykpIHsKKwkgcHJvZy0+TGlua1N0YXR1cyA9IEdMX0ZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlmIChjdHgtPkJpbmFyeVByb2dyYW1DYWNoZUFjdGl2ZSkKKyAgICAgICAgICAgIG1lc2FfcHJvZ3JhbV9kaXNrY2FjaGVfY2FjaGUoY3R4LCBwcm9nKTsKKyAgICAgICAgIHByb2ctPl9MaW5rZWQgPSBHTF9UUlVFOworICAgICAgfQorICAgfQorCisgICBpZiAoY3R4LT5HbHNsRmxhZ3MgJiBHTFNMX0RVTVApIHsKKyAgICAgIGlmICghcHJvZy0+TGlua1N0YXR1cykgeworCSBmcHJpbnRmKHN0ZGVyciwgIkdMU0wgc2hhZGVyIHByb2dyYW0gJWQgZmFpbGVkIHRvIGxpbmtcbiIsIHByb2ctPk5hbWUpOworICAgICAgfQorCisgICAgICBpZiAocHJvZy0+SW5mb0xvZyAmJiBwcm9nLT5JbmZvTG9nWzBdICE9IDApIHsKKwkgZnByaW50ZihzdGRlcnIsICJHTFNMIHNoYWRlciBwcm9ncmFtICVkIGluZm8gbG9nOlxuIiwgcHJvZy0+TmFtZSk7CisJIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHByb2ctPkluZm9Mb2cpOworICAgICAgfQorICAgfQorfQorCit9IC8qIGV4dGVybiAiQyIgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vaXJfdG9fbWVzYS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9pcl90b19tZXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1MDU1NQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vaXJfdG9fbWVzYS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZ2xfY29udGV4dDsKK3N0cnVjdCBnbF9zaGFkZXI7CitzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW07CisKK3ZvaWQgX21lc2FfZ2xzbF9saW5rX3NoYWRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpOworR0xib29sZWFuIF9tZXNhX2lyX2NvbXBpbGVfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcik7CitHTGJvb2xlYW4gX21lc2FfaXJfbGlua19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3N0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2lyX2dldF9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyKTsKKwordm9pZAorX21lc2FfZ2VuZXJhdGVfcGFyYW1ldGVyc19saXN0X2Zvcl91bmlmb3JtcyhzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0KKwkJCQkJICAgICpzaGFkZXJfcHJvZ3JhbSwKKwkJCQkJICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoLAorCQkJCQkgICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QKKwkJCQkJICAgICpwYXJhbXMpOwordm9pZAorX21lc2FfYXNzb2NpYXRlX3VuaWZvcm1fc3RvcmFnZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkJCXN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW0sCisJCQkJc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL2xleC55eS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9sZXgueXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjA1OGQzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9sZXgueXkuYwpAQCAtMCwwICsxLDM2ODIgQEAKKyNsaW5lIDIgInByb2dyYW0vbGV4Lnl5LmMiCisKKyNsaW5lIDQgInByb2dyYW0vbGV4Lnl5LmMiCisKKyNkZWZpbmUgIFlZX0lOVF9BTElHTkVEIHNob3J0IGludAorCisvKiBBIGxleGljYWwgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgZmxleCAqLworCisjZGVmaW5lIEZMRVhfU0NBTk5FUgorI2RlZmluZSBZWV9GTEVYX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBZWV9GTEVYX01JTk9SX1ZFUlNJT04gNQorI2RlZmluZSBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gMzUKKyNpZiBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gPiAwCisjZGVmaW5lIEZMRVhfQkVUQQorI2VuZGlmCisKKy8qIEZpcnN0LCB3ZSBkZWFsIHdpdGggIHBsYXRmb3JtLXNwZWNpZmljIG9yIGNvbXBpbGVyLXNwZWNpZmljIGlzc3Vlcy4gKi8KKworLyogYmVnaW4gc3RhbmRhcmQgQyBoZWFkZXJzLiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogZW5kIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KKworLyogZmxleCBpbnRlZ2VyIHR5cGUgZGVmaW5pdGlvbnMgKi8KKworI2lmbmRlZiBGTEVYSU5UX0gKKyNkZWZpbmUgRkxFWElOVF9ICisKKy8qIEM5OSBzeXN0ZW1zIGhhdmUgPGludHR5cGVzLmg+LiBOb24tQzk5IHN5c3RlbXMgbWF5IG9yIG1heSBub3QuICovCisKKyNpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKworLyogQzk5IHNheXMgdG8gZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MgYmVmb3JlIGluY2x1ZGluZyBzdGRpbnQuaCwKKyAqIGlmIHlvdSB3YW50IHRoZSBsaW1pdCAobWF4L21pbikgbWFjcm9zIGZvciBpbnQgdHlwZXMuIAorICovCisjaWZuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+Cit0eXBlZGVmIGludDhfdCBmbGV4X2ludDhfdDsKK3R5cGVkZWYgdWludDhfdCBmbGV4X3VpbnQ4X3Q7Cit0eXBlZGVmIGludDE2X3QgZmxleF9pbnQxNl90OwordHlwZWRlZiB1aW50MTZfdCBmbGV4X3VpbnQxNl90OwordHlwZWRlZiBpbnQzMl90IGZsZXhfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgZmxleF91aW50MzJfdDsKKyNlbHNlCit0eXBlZGVmIHNpZ25lZCBjaGFyIGZsZXhfaW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQgZmxleF9pbnQxNl90OwordHlwZWRlZiBpbnQgZmxleF9pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZsZXhfdWludDhfdDsgCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBmbGV4X3VpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxleF91aW50MzJfdDsKKworLyogTGltaXRzIG9mIGludGVncmFsIHR5cGVzLiAqLworI2lmbmRlZiBJTlQ4X01JTgorI2RlZmluZSBJTlQ4X01JTiAgICAgICAgICAgICAgICgtMTI4KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorI2RlZmluZSBJTlQxNl9NSU4gICAgICAgICAgICAgICgtMzI3NjctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NSU4KKyNkZWZpbmUgSU5UMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQ4X01BWAorI2RlZmluZSBJTlQ4X01BWCAgICAgICAgICAgICAgICgxMjcpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUFYCisjZGVmaW5lIElOVDE2X01BWCAgICAgICAgICAgICAgKDMyNzY3KQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggICAgICAgICAgICAgICgyMTQ3NDgzNjQ3KQorI2VuZGlmCisjaWZuZGVmIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgICAgICAgICAgICgyNTVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVDE2X01BWCAgICAgICAgICAgICAoNjU1MzVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVUpCisjZW5kaWYKKworI2VuZGlmIC8qICEgQzk5ICovCisKKyNlbmRpZiAvKiAhIEZMRVhJTlRfSCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyogVGhlICJjb25zdCIgc3RvcmFnZS1jbGFzcy1tb2RpZmllciBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbHNlCS8qICEgX19jcGx1c3BsdXMgKi8KKworLyogQzk5IHJlcXVpcmVzIF9fU1REQ19fIHRvIGJlIGRlZmluZWQgYXMgMS4gKi8KKyNpZiBkZWZpbmVkIChfX1NURENfXykKKworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2VuZGlmCS8qIGRlZmluZWQgKF9fU1REQ19fKSAqLworI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIFlZX1VTRV9DT05TVAorI2RlZmluZSB5eWNvbnN0IGNvbnN0CisjZWxzZQorI2RlZmluZSB5eWNvbnN0CisjZW5kaWYKKworLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KKyNkZWZpbmUgWVlfTlVMTCAwCisKKy8qIFByb21vdGVzIGEgcG9zc2libHkgbmVnYXRpdmUsIHBvc3NpYmx5IHNpZ25lZCBjaGFyIHRvIGFuIHVuc2lnbmVkCisgKiBpbnRlZ2VyIGZvciB1c2UgYXMgYW4gYXJyYXkgaW5kZXguICBJZiB0aGUgc2lnbmVkIGNoYXIgaXMgbmVnYXRpdmUsCisgKiB3ZSB3YW50IHRvIGluc3RlYWQgdHJlYXQgaXQgYXMgYW4gOC1iaXQgdW5zaWduZWQgY2hhciwgaGVuY2UgdGhlCisgKiBkb3VibGUgY2FzdC4KKyAqLworI2RlZmluZSBZWV9TQ19UT19VSShjKSAoKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGMpCisKKy8qIEFuIG9wYXF1ZSBwb2ludGVyLiAqLworI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NDQU5ORVJfVAorI2RlZmluZSBZWV9UWVBFREVGX1lZX1NDQU5ORVJfVAordHlwZWRlZiB2b2lkKiB5eXNjYW5fdDsKKyNlbmRpZgorCisvKiBGb3IgY29udmVuaWVuY2UsIHRoZXNlIHZhcnMgKHBsdXMgdGhlIGJpc29uIHZhcnMgZmFyIGJlbG93KQorICAgYXJlIG1hY3JvcyBpbiB0aGUgcmVlbnRyYW50IHNjYW5uZXIuICovCisjZGVmaW5lIHl5aW4geXlnLT55eWluX3IKKyNkZWZpbmUgeXlvdXQgeXlnLT55eW91dF9yCisjZGVmaW5lIHl5ZXh0cmEgeXlnLT55eWV4dHJhX3IKKyNkZWZpbmUgeXlsZW5nIHl5Zy0+eXlsZW5nX3IKKyNkZWZpbmUgeXl0ZXh0IHl5Zy0+eXl0ZXh0X3IKKyNkZWZpbmUgeXlsaW5lbm8gKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnNfbGluZW5vKQorI2RlZmluZSB5eWNvbHVtbiAoWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9ic19jb2x1bW4pCisjZGVmaW5lIHl5X2ZsZXhfZGVidWcgeXlnLT55eV9mbGV4X2RlYnVnX3IKKworLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAorICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCisgKiBkZWZpbml0aW9uIG9mIEJFR0lOLgorICovCisjZGVmaW5lIEJFR0lOIHl5Zy0+eXlfc3RhcnQgPSAxICsgMiAqCisKKy8qIFRyYW5zbGF0ZSB0aGUgY3VycmVudCBzdGFydCBzdGF0ZSBpbnRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgbGF0ZXIgaGFuZGVkCisgKiB0byBCRUdJTiB0byByZXR1cm4gdG8gdGhlIHN0YXRlLiAgVGhlIFlZU1RBVEUgYWxpYXMgaXMgZm9yIGxleAorICogY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBZWV9TVEFSVCAoKHl5Zy0+eXlfc3RhcnQgLSAxKSAvIDIpCisjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKKworLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKKworLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KKyNkZWZpbmUgWVlfTkVXX0ZJTEUgX21lc2FfcHJvZ3JhbV9sZXhlcl9yZXN0YXJ0KHl5aW4gLHl5c2Nhbm5lciApCisKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUl9DSEFSIDAKKworLyogU2l6ZSBvZiBkZWZhdWx0IGlucHV0IGJ1ZmZlci4gKi8KKyNpZm5kZWYgWVlfQlVGX1NJWkUKKyNpZmRlZiBfX2lhNjRfXworLyogT24gSUEtNjQsIHRoZSBidWZmZXIgc2l6ZSBpcyAxNmssIG5vdCA4ay4KKyAqIE1vcmVvdmVyLCBZWV9CVUZfU0laRSBpcyAyKllZX1JFQURfQlVGX1NJWkUgaW4gdGhlIGdlbmVyYWwgY2FzZS4KKyAqIERpdHRvIGZvciB0aGUgX19pYTY0X18gY2FzZSBhY2NvcmRpbmdseS4KKyAqLworI2RlZmluZSBZWV9CVUZfU0laRSAzMjc2OAorI2Vsc2UKKyNkZWZpbmUgWVlfQlVGX1NJWkUgMTYzODQKKyNlbmRpZiAvKiBfX2lhNjRfXyAqLworI2VuZGlmCisKKy8qIFRoZSBzdGF0ZSBidWYgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvbmUgc3RhdGUgcGVyIGNoYXJhY3RlciBpbiB0aGUgbWFpbiBidWZmZXIuCisgKi8KKyNkZWZpbmUgWVlfU1RBVEVfQlVGX1NJWkUgICAoKFlZX0JVRl9TSVpFICsgMikgKiBzaXplb2YoeXlfc3RhdGVfdHlwZSkpCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKK3R5cGVkZWYgc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSAqWVlfQlVGRkVSX1NUQVRFOworI2VuZGlmCisKKyNkZWZpbmUgRU9CX0FDVF9DT05USU5VRV9TQ0FOIDAKKyNkZWZpbmUgRU9CX0FDVF9FTkRfT0ZfRklMRSAxCisjZGVmaW5lIEVPQl9BQ1RfTEFTVF9NQVRDSCAyCisKKyAgICAjZGVmaW5lIFlZX0xFU1NfTElORU5PKG4pCisgICAgCisvKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgIm4iIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCisjZGVmaW5lIHl5bGVzcyhuKSBcCisJZG8gXAorCQl7IFwKKwkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgeXl0ZXh0LiAqLyBcCisgICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCisgICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKKwkJKnl5X2NwID0geXlnLT55eV9ob2xkX2NoYXI7IFwKKwkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVCBcCisJCXl5Zy0+eXlfY19idWZfcCA9IHl5X2NwID0geXlfYnAgKyB5eWxlc3NfbWFjcm9fYXJnIC0gWVlfTU9SRV9BREo7IFwKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHl5dGV4dCBhZ2FpbiAqLyBcCisJCX0gXAorCXdoaWxlICggMCApCisKKyNkZWZpbmUgdW5wdXQoYykgeXl1bnB1dCggYywgeXlnLT55eXRleHRfcHRyICwgeXlzY2FubmVyICkKKworI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NJWkVfVAorI2RlZmluZSBZWV9UWVBFREVGX1lZX1NJWkVfVAordHlwZWRlZiBzaXplX3QgeXlfc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQorI2RlZmluZSBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCitzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlCisJeworCUZJTEUgKnl5X2lucHV0X2ZpbGU7CisKKwljaGFyICp5eV9jaF9idWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwljaGFyICp5eV9idWZfcG9zOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBpbnB1dCBidWZmZXIgKi8KKworCS8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIHJvb20gZm9yIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJeXlfc2l6ZV90IHl5X2J1Zl9zaXplOworCisJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1Ziwgbm90IGluY2x1ZGluZyBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCWludCB5eV9uX2NoYXJzOworCisJLyogV2hldGhlciB3ZSAib3duIiB0aGUgYnVmZmVyIC0gaS5lLiwgd2Uga25vdyB3ZSBjcmVhdGVkIGl0LAorCSAqIGFuZCBjYW4gcmVhbGxvYygpIGl0IHRvIGdyb3cgaXQsIGFuZCBzaG91bGQgZnJlZSgpIGl0IHRvCisJICogZGVsZXRlIGl0LgorCSAqLworCWludCB5eV9pc19vdXJfYnVmZmVyOworCisJLyogV2hldGhlciB0aGlzIGlzIGFuICJpbnRlcmFjdGl2ZSIgaW5wdXQgc291cmNlOyBpZiBzbywgYW5kCisJICogaWYgd2UncmUgdXNpbmcgc3RkaW8gZm9yIGlucHV0LCB0aGVuIHdlIHdhbnQgdG8gdXNlIGdldGMoKQorCSAqIGluc3RlYWQgb2YgZnJlYWQoKSwgdG8gbWFrZSBzdXJlIHdlIHN0b3AgZmV0Y2hpbmcgaW5wdXQgYWZ0ZXIKKwkgKiBlYWNoIG5ld2xpbmUuCisJICovCisJaW50IHl5X2lzX2ludGVyYWN0aXZlOworCisJLyogV2hldGhlciB3ZSdyZSBjb25zaWRlcmVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCSAqIElmIHNvLCAnXicgcnVsZXMgd2lsbCBiZSBhY3RpdmUgb24gdGhlIG5leHQgbWF0Y2gsIG90aGVyd2lzZQorCSAqIG5vdC4KKwkgKi8KKwlpbnQgeXlfYXRfYm9sOworCisgICAgaW50IHl5X2JzX2xpbmVubzsgLyoqPCBUaGUgbGluZSBjb3VudC4gKi8KKyAgICBpbnQgeXlfYnNfY29sdW1uOyAvKio8IFRoZSBjb2x1bW4gY291bnQuICovCisgICAgCisJLyogV2hldGhlciB0byB0cnkgdG8gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdoZW4gd2UgcmVhY2ggdGhlCisJICogZW5kIG9mIGl0LgorCSAqLworCWludCB5eV9maWxsX2J1ZmZlcjsKKworCWludCB5eV9idWZmZXJfc3RhdHVzOworCisjZGVmaW5lIFlZX0JVRkZFUl9ORVcgMAorI2RlZmluZSBZWV9CVUZGRVJfTk9STUFMIDEKKwkvKiBXaGVuIGFuIEVPRidzIGJlZW4gc2VlbiBidXQgdGhlcmUncyBzdGlsbCBzb21lIHRleHQgdG8gcHJvY2VzcworCSAqIHRoZW4gd2UgbWFyayB0aGUgYnVmZmVyIGFzIFlZX0VPRl9QRU5ESU5HLCB0byBpbmRpY2F0ZSB0aGF0IHdlCisJICogc2hvdWxkbid0IHRyeSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHNvdXJjZSBhbnkgbW9yZS4gIFdlIG1pZ2h0CisJICogc3RpbGwgaGF2ZSBhIGJ1bmNoIG9mIHRva2VucyB0byBtYXRjaCwgdGhvdWdoLCBiZWNhdXNlIG9mCisJICogcG9zc2libGUgYmFja2luZy11cC4KKwkgKgorCSAqIFdoZW4gd2UgYWN0dWFsbHkgc2VlIHRoZSBFT0YsIHdlIGNoYW5nZSB0aGUgc3RhdHVzIHRvICJuZXciCisJICogKHZpYSBfbWVzYV9wcm9ncmFtX2xleGVyX3Jlc3RhcnQoKSksIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHNjYW5uaW5nIGJ5CisJICoganVzdCBwb2ludGluZyB5eWluIGF0IGEgbmV3IGlucHV0IGZpbGUuCisJICovCisjZGVmaW5lIFlZX0JVRkZFUl9FT0ZfUEVORElORyAyCisKKwl9OworI2VuZGlmIC8qICFZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFICovCisKKy8qIFdlIHByb3ZpZGUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgYnVmZmVyIHN0YXRlcyBpbiBjYXNlIGluIHRoZQorICogZnV0dXJlIHdlIHdhbnQgdG8gcHV0IHRoZSBidWZmZXIgc3RhdGVzIGluIGEgbW9yZSBnZW5lcmFsCisgKiAic2Nhbm5lciBzdGF0ZSIuCisgKgorICogUmV0dXJucyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgb3IgTlVMTC4KKyAqLworI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUiAoIHl5Zy0+eXlfYnVmZmVyX3N0YWNrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyB5eWctPnl5X2J1ZmZlcl9zdGFja1t5eWctPnl5X2J1ZmZlcl9zdGFja190b3BdIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMKQorCisvKiBTYW1lIGFzIHByZXZpb3VzIG1hY3JvLCBidXQgdXNlZnVsIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBidWZmZXIgc3RhY2sgaXMgbm90CisgKiBOVUxMIG9yIHdoZW4gd2UgbmVlZCBhbiBsdmFsdWUuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAqLworI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgeXlnLT55eV9idWZmZXJfc3RhY2tbeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wXQorCit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfcmVzdGFydCAoRklMRSAqaW5wdXRfZmlsZSAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX3N3aXRjaF90b19idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK1lZX0JVRkZFUl9TVEFURSBfbWVzYV9wcm9ncmFtX2xleGVyX19jcmVhdGVfYnVmZmVyIChGSUxFICpmaWxlLGludCBzaXplICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9fZGVsZXRlX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX19mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9wdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3BvcF9idWZmZXJfc3RhdGUgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitzdGF0aWMgdm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX2Vuc3VyZV9idWZmZXJfc3RhY2sgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworc3RhdGljIHZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9fbG9hZF9idWZmZXJfc3RhdGUgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworc3RhdGljIHZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9faW5pdF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiLEZJTEUgKmZpbGUgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCisjZGVmaW5lIFlZX0ZMVVNIX0JVRkZFUiBfbWVzYV9wcm9ncmFtX2xleGVyX19mbHVzaF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgLHl5c2Nhbm5lcikKKworWVlfQlVGRkVSX1NUQVRFIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX3NjYW5fYnVmZmVyIChjaGFyICpiYXNlLHl5X3NpemVfdCBzaXplICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK1lZX0JVRkZFUl9TVEFURSBfbWVzYV9wcm9ncmFtX2xleGVyX19zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICp5eV9zdHIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworWVlfQlVGRkVSX1NUQVRFIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX3NjYW5fYnl0ZXMgKHl5Y29uc3QgY2hhciAqYnl0ZXMsaW50IGxlbiAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgKl9tZXNhX3Byb2dyYW1fbGV4ZXJfYWxsb2MgKHl5X3NpemVfdCAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkICpfbWVzYV9wcm9ncmFtX2xleGVyX3JlYWxsb2MgKHZvaWQgKix5eV9zaXplX3QgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX2ZyZWUgKHZvaWQgKiAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKKyNkZWZpbmUgeXlfbmV3X2J1ZmZlciBfbWVzYV9wcm9ncmFtX2xleGVyX19jcmVhdGVfYnVmZmVyCisKKyNkZWZpbmUgeXlfc2V0X2ludGVyYWN0aXZlKGlzX2ludGVyYWN0aXZlKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7IFwKKyAgICAgICAgX21lc2FfcHJvZ3JhbV9sZXhlcl9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSAseXlzY2FubmVyKTsgXAorCX0gXAorCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaXNfaW50ZXJhY3RpdmUgPSBpc19pbnRlcmFjdGl2ZTsgXAorCX0KKworI2RlZmluZSB5eV9zZXRfYm9sKGF0X2JvbCkgXAorCXsgXAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApe1wKKyAgICAgICAgX21lc2FfcHJvZ3JhbV9sZXhlcl9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSAseXlzY2FubmVyKTsgXAorCX0gXAorCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gYXRfYm9sOyBcCisJfQorCisjZGVmaW5lIFlZX0FUX0JPTCgpIChZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2F0X2JvbCkKKworLyogQmVnaW4gdXNlciBzZWN0MyAqLworCisjZGVmaW5lIF9tZXNhX3Byb2dyYW1fbGV4ZXJfd3JhcChuKSAxCisjZGVmaW5lIFlZX1NLSVBfWVlXUkFQCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBZWV9DSEFSOworCit0eXBlZGVmIGludCB5eV9zdGF0ZV90eXBlOworCisjZGVmaW5lIHl5dGV4dF9wdHIgeXl0ZXh0X3IKKworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgKHl5X3N0YXRlX3R5cGUgY3VycmVudF9zdGF0ZSAgLHl5c2Nhbl90IHl5c2Nhbm5lcik7CitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAoeXlzY2FuX3QgeXlzY2FubmVyICk7CitzdGF0aWMgdm9pZCB5eV9mYXRhbF9lcnJvciAoeXljb25zdCBjaGFyIG1zZ1tdICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworLyogRG9uZSBhZnRlciB0aGUgY3VycmVudCBwYXR0ZXJuIGhhcyBiZWVuIG1hdGNoZWQgYW5kIGJlZm9yZSB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIC0gc2V0cyB1cCB5eXRleHQuCisgKi8KKyNkZWZpbmUgWVlfRE9fQkVGT1JFX0FDVElPTiBcCisJeXlnLT55eXRleHRfcHRyID0geXlfYnA7IFwKKwl5eWxlbmcgPSAoc2l6ZV90KSAoeXlfY3AgLSB5eV9icCk7IFwKKwl5eWctPnl5X2hvbGRfY2hhciA9ICp5eV9jcDsgXAorCSp5eV9jcCA9ICdcMCc7IFwKKwl5eWctPnl5X2NfYnVmX3AgPSB5eV9jcDsKKworI2RlZmluZSBZWV9OVU1fUlVMRVMgMTcwCisjZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMTcxCisvKiBUaGlzIHN0cnVjdCBpcyBub3QgdXNlZCBpbiB0aGlzIHNjYW5uZXIsCisgICBidXQgaXRzIHByZXNlbmNlIGlzIG5lY2Vzc2FyeS4gKi8KK3N0cnVjdCB5eV90cmFuc19pbmZvCisJeworCWZsZXhfaW50MzJfdCB5eV92ZXJpZnk7CisJZmxleF9pbnQzMl90IHl5X254dDsKKwl9Oworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFs4NTBdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMCwgICAgMCwgIDE3MSwgIDE2OSwgIDE2NywgIDE2NiwgIDE2OSwgIDE2OSwgIDEzOSwgIDE2NSwKKyAgICAgIDE0MSwgIDE0MSwgIDE0MSwgIDE0MSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDE2NywgICAgMCwgICAgMCwgIDE2OCwgIDEzOSwKKyAgICAgICAgMCwgIDE0MCwgIDE0MiwgIDE2MiwgIDE2MiwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDE2MiwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDExOSwgIDE2MywgIDEyMCwKKyAgICAgIDEyMSwgIDE1MywgIDE1MywgIDE1MywgIDE1MywgICAgMCwgIDE0MSwgICAgMCwgIDEyNywgIDEyOCwKKyAgICAgIDEyOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKworICAgICAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LAorICAgICAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LAorICAgICAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTYxLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTYwLCAgMTYwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgMTU5LCAgMTU5LCAgMTU5LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUxLCAgMTUxLCAgMTUyLCAgMTQzLAorICAgICAgMTQyLCAgMTQzLCAgICAwLCAgMTQ0LCAgIDExLCAgIDEyLCAgMTM5LCAgIDEzLCAgMTM5LCAgMTM5LAorICAgICAgIDE0LCAgIDE1LCAgMTM5LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLCAgICA2LAorCisgICAgICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjgsICAgMjcsICAgMjksICAgMzAsICAgMzEsCisgICAgICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAgNDAsCisgICAgICAgNDEsICAxMzksICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAxMzksCisgICAgICAgNDksICAgNTAsICAgNTEsICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAxMzksICAgNTYsICAgNTcsCisgICAgICAgNTgsICAgNTksICAxMzksICAxMzksICAgNjQsICAgNjUsICAxMzksICAxMzksICAxMzksICAxMzksCisgICAgICAxMzksICAxMzksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxNDIsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgODAsICAgODEsICAgODMsCisgICAgICAgIDAsICAxNTgsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgOTcsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxNTcsCisgICAgICAxNTYsICAxNTYsICAxMDksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisKKyAgICAgICAgMCwgICAgMCwgICAgMCwgIDE0NywgIDE0NywgIDE0OCwgIDE0OSwgICAgMCwgIDE0NSwgICAxMSwKKyAgICAgICAxMSwgIDEzOSwgICAxMiwgICAxMiwgICAxMiwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgICAxNSwgICAxNSwgIDEzOSwgIDEzMCwgICAxNiwgICAxNiwgIDEzOSwgICAxNywgICAxNywgIDEzOSwKKyAgICAgICAxOCwgICAxOCwgIDEzOSwgICAxOSwgICAxOSwgIDEzOSwgICAyMCwgICAyMCwgIDEzOSwgICAyMSwKKyAgICAgICAyMSwgIDEzOSwgICAyMiwgICAyMiwgIDEzOSwgICAyNCwgICAyNCwgIDEzOSwgICAyNSwgICAyNSwKKyAgICAgIDEzOSwgICAyOCwgICAyOCwgIDEzOSwgICAyNywgICAyNywgIDEzOSwgICAzMCwgICAzMCwgIDEzOSwKKyAgICAgICAzMSwgICAzMSwgIDEzOSwgICAzMiwgICAzMiwgIDEzOSwgICAzMywgICAzMywgIDEzOSwgICAzNCwKKyAgICAgICAzNCwgIDEzOSwgICAzNSwgICAzNSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgICAzNiwgIDEzOSwKKyAgICAgICAzOCwgIDEzOSwgICA0MCwgICA0MCwgIDEzOSwgICA0MSwgICA0MSwgIDEzOSwgIDEzMSwgICA0MiwKKyAgICAgICA0MiwgIDEzOSwgICA0MywgICA0MywgIDEzOSwgIDEzOSwgICA0NSwgICA0NSwgIDEzOSwgICA0NiwKKworICAgICAgIDQ2LCAgMTM5LCAgIDQ3LCAgIDQ3LCAgMTM5LCAgIDQ4LCAgIDQ4LCAgMTM5LCAgMTM5LCAgIDQ5LAorICAgICAgIDQ5LCAgMTM5LCAgIDUwLCAgIDUwLCAgMTM5LCAgIDUxLCAgIDUxLCAgMTM5LCAgIDUyLCAgIDUyLAorICAgICAgMTM5LCAgIDUzLCAgIDUzLCAgMTM5LCAgIDU0LCAgIDU0LCAgMTM5LCAgMTM5LCAgIDEwLCAgIDU2LAorICAgICAgMTM5LCAgIDU3LCAgMTM5LCAgIDU4LCAgMTM5LCAgIDU5LCAgMTM5LCAgIDYwLCAgMTM5LCAgIDYyLAorICAgICAgMTM5LCAgIDY0LCAgIDY0LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LCAgMTM5LAorICAgICAgMTM5LCAgICAwLCAgMTY0LCAgICAwLCAgICAwLCAgICAwLCAgIDczLCAgIDc0LCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgIDg1LCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTU1LCAgICAwLCAgICAwLCAgICAwLCAgMTEzLCAgICAwLAorICAgICAgMTE1LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTU0LCAgMTQ2LCAgMTM5LAorCisgICAgICAxMzksICAxMzksICAgIDQsICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksCisgICAgICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksCisgICAgICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAgIDksICAgMzcsICAgMzksICAxMzksCisgICAgICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksCisgICAgICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksICAxMzksCisgICAgICAgNjAsICAxMzksICAgNjEsICAgNjIsICAxMzksICAgNjMsICAxMzksICAxMzksICAxMzksICAxMzksCisgICAgICAxMzksICAgNjksICAxMzksICAxMzksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgNzUsCisgICAgICAgNzYsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgODQsICAgIDAsICAgIDAsICAgODgsICAgOTEsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDIsICAxMDMsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAxMDgsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgICAgNSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgICAgNywgICAgOCwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgIDEzOSwgICA2MSwgIDEzOSwgIDEzOSwgICA2MywgIDEzOSwgIDEzOSwKKyAgICAgIDEzOSwgIDEzOSwgIDEzOSwgICA3MCwgIDEzOSwgICA2NiwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICA5NCwgICAgMCwgICA5OCwgICA5OSwgICAgMCwgIDEwMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDExNywgIDExOCwgICAgMCwgICAgMCwKKworICAgICAgMTI1LCAgIDExLCAgICAzLCAgIDEyLCAgMTM1LCAgMTM2LCAgMTM5LCAgIDE0LCAgIDE1LCAgIDE2LAorICAgICAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLCAgIDIyLCAgIDI0LCAgIDI1LCAgIDI4LCAgIDI3LAorICAgICAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLAorICAgICAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgMTM5LCAgMTM5LCAgMTM5LCAgIDQ5LCAgIDUwLAorICAgICAgIDUxLCAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgMTM5LAorICAgICAgMTM5LCAgMTM5LCAgMTM5LCAgIDY0LCAgIDY1LCAgMTM5LCAgIDY4LCAgMTI2LCAgICAwLCAgICAwLAorICAgICAgIDcxLCAgICAwLCAgIDc3LCAgICAwLCAgICAwLCAgICAwLCAgIDg2LCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgMTAwLCAgICAwLCAgICAwLCAgMTA2LCAgIDkzLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTIyLCAgICAwLCAgMTM5LCAgMTMyLCAgMTMzLCAgMTM5LAorICAgICAgIDYwLCAgMTM5LCAgIDYyLCAgMTM5LCAgIDY3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgIDc5LAorCisgICAgICAgODIsICAgODcsICAgIDAsICAgIDAsICAgOTIsICAgIDAsICAgIDAsICAgIDAsICAxMDUsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAxMTQsICAxMTYsICAgIDAsICAxMzksICAxMzksICAgNjEsICAgNjMsCisgICAgICAgIDIsICAgIDEsICAgIDAsICAgNzgsICAgIDAsICAgOTAsICAgIDAsICAgOTYsICAxMDQsICAgIDAsCisgICAgICAgIDAsICAxMTEsICAxMTIsICAxMjMsICAxMzksICAxMzQsICAgIDAsICAgODksICAgIDAsICAxMDcsCisgICAgICAxMTAsICAxMzksICAgNzIsICAgOTUsICAxMzksICAxMzksICAxMzcsICAxMzgsICAgIDAKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAorICAgICAgICAxLCAgICAxLCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAyLCAgICA1LCAgICAxLCAgICA2LCAgICA3LCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICA4LCAgICAxLCAgICA4LCAgICA5LCAgICAxLCAgIDEwLCAgIDExLCAgIDEyLAorICAgICAgIDEzLCAgIDE0LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgIDIyLCAgIDIzLCAgIDI0LCAgICA3LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLAorICAgICAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgIDQxLCAgICAxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LAorCisgICAgICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsICAgNTIsICAgNTMsICAgNTQsICAgNTUsCisgICAgICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsCisgICAgICAgNjYsICAgNjcsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfbWV0YVs2OF0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAzLCAgICAyLAorICAgICAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLAorICAgICAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLAorICAgICAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLAorICAgICAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLAorICAgICAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLAorICAgICAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyCisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9iYXNlWzg1M10gPQorICAgIHsgICAwLAorICAgICAgICAwLCAgICAwLCAxMjk5LCAxMzAwLCAgIDY2LCAxMzAwLCAxMjkzLCAxMjk0LCAgICAwLCAgIDY5LAorICAgICAgIDg1LCAgMTI4LCAgMTQwLCAgMTUyLCAgMTUxLCAgIDU4LCAgIDU2LCAgIDYzLCAgIDc2LCAxMjcyLAorICAgICAgMTU4LCAgMTYwLCAgIDM5LCAgMTYzLCAgMTczLCAgMTg5LCAgIDUyLCAxMjY1LCAgIDc2LCAxMjM1LAorICAgICAxMjM0LCAxMjQ2LCAxMjMwLCAxMjQ0LCAxMjQzLCAgMTA1LCAxMjcyLCAxMjg0LCAxMzAwLCAgICAwLAorICAgICAgMjI1LCAxMzAwLCAgMjE4LCAgMTYwLCAgMTU3LCAgIDIwLCAgMTIzLCAgIDY2LCAgMTE5LCAgMTkyLAorICAgICAxMjQ0LCAxMjMwLCAgIDU0LCAgMTYyLCAxMjI4LCAxMjQwLCAgMTk0LCAxMzAwLCAgMjAwLCAgMTk1LAorICAgICAgIDk4LCAgMjI3LCAgMTk2LCAgMjMxLCAgMjM1LCAgMjkzLCAgMzA1LCAgMzE2LCAxMzAwLCAxMzAwLAorICAgICAxMzAwLCAxMjQ5LCAxMjYyLCAxMjU2LCAgMjIzLCAxMjQ1LCAxMjQ4LCAxMjQ0LCAxMjU5LCAgMTA3LAorICAgICAgMjk4LCAxMjQxLCAxMjU1LCAgMjQ2LCAxMjQxLCAxMjU0LCAxMjQ1LCAxMjU4LCAxMjM1LCAxMjQ2LAorICAgICAxMjM3LCAgMTgyLCAxMjM4LCAxMjI5LCAxMjM4LCAxMjI5LCAxMjI4LCAxMjI5LCAgMTQ0LCAxMjIzLAorCisgICAgIDEyMjksIDEyNDAsIDEyMzEsIDEyMjUsIDEyMjIsIDEyMjMsIDEyMjcsICAyODksIDEyMzYsIDEyMjMsCisgICAgICAzMDIsIDEyMzAsIDEyMTcsIDEyMzEsIDEyMDcsICAgNjUsICAzMTUsICAyNzYsIDEyMjcsIDEyMjYsCisgICAgIDEyMDIsIDExODcsIDExODIsIDExOTksIDExNzUsIDExODAsIDEyMDYsICAyNzksIDExOTUsICAyOTMsCisgICAgIDExOTAsICAzNDIsICAyOTksIDExOTIsIDExNzMsICAzMTcsIDExODMsIDExNzksIDExNzQsICAyMDcsCisgICAgIDExODAsIDExNjYsIDExODIsIDExNzksIDExNzAsICAzMjAsICAzMjQsIDExNzIsIDExNjEsIDExNzUsCisgICAgIDExNzgsIDExNjAsIDExNzUsIDExNjIsIDExNTksIDExNjYsICAyODQsIDExNzQsICAyMjcsICAyODgsCisgICAgICAzMjcsICAzNDIsICAzNDUsIDExNTEsIDExNjgsIDExNjksIDExNjIsIDExNDQsICAzMTgsIDExNDUsCisgICAgIDExNjcsIDExNTgsICAzMzAsICAzNDEsICAzNDUsICAzNDksICAzNTMsICAzNTcsICAzNjEsIDEzMDAsCisgICAgICA0MTksICA0MzAsICA0MzYsICA0NDIsICA0NDAsICA0NDEsIDExOTEsICAgIDAsIDExOTAsIDExNzMsCisgICAgIDExNjMsICA0NDMsIDExODMsICA0NDQsICA0NTEsICA0NjgsICA0NzAsICA0NzIsICA0NzEsICAgIDAsCisKKyAgICAgIDQ5NiwgICAgMCwgIDQ5NywgIDQ5OCwgICAgMCwgIDQ5OSwgIDUwMCwgICAgMCwgIDUyNCwgIDUyNSwKKyAgICAgIDUyNiwgIDUzNiwgIDUzNywgIDU1MywgMTE3OCwgMTE3MSwgMTE4NCwgIDM1NCwgIDM1NiwgIDU2MSwKKyAgICAgIDU2MywgMTE2NSwgIDU2NCwgIDU2NSwgMTE1NywgIDU4MCwgIDU5MCwgIDU5MSwgIDU5MiwgMTE3OCwKKyAgICAgIDU5MywgIDYxNywgIDYxOCwgIDYxOSwgIDYyOSwgIDYzMCwgMTE1NSwgMTE2NSwgIDMzMCwgIDM2MiwKKyAgICAgIDQxOSwgIDQ4MywgIDQ0NSwgIDM2NCwgIDY0NiwgMTE1MywgMTE0NSwgMTE0NCwgMTEyOSwgMTEyOSwKKyAgICAgMTEyOCwgMTEyNywgMTE3MCwgMTE0MiwgMTEzMCwgIDY2MiwgIDY2OSwgIDY0MywgMTEzNCwgIDQ4NywKKyAgICAgMTEzMSwgMTEyNSwgMTEyNSwgMTExOSwgMTEzMiwgMTEzMiwgMTExNywgMTMwMCwgMTMwMCwgMTEzMiwKKyAgICAgMTEyMCwgIDY0NiwgMTEyNywgIDEzNSwgMTEyNCwgMTEzMCwgIDU2MSwgMTEyNSwgMTMwMCwgMTExNiwKKyAgICAgMTEyMywgMTEyMiwgMTEyNSwgMTExMSwgMTExMCwgMTExNCwgMTEwOSwgIDQ0OCwgMTExNCwgIDY1MCwKKyAgICAgIDY1MywgIDY2NSwgMTMwMCwgMTEwNiwgMTEwNCwgMTEwNCwgMTExMiwgMTExMywgMTA5NSwgIDY3MCwKKworICAgICAxMTAwLCAxMTA2LCAgNDg2LCAgNTc5LCAgNjU1LCAgNjYxLCAgNjY4LCAgNzI2LCAgNzMyLCAxMTEyLAorICAgICAgNjgyLCAxMTE5LCAxMTEwLCAgNjg4LCAgNzMwLCAxMTE3LCAxMTE2LCAxMTA5LCAxMTIzLCAxMTEzLAorICAgICAxMTA0LCAgNzEyLCAxMTExLCAgICAwLCAxMTAyLCAgNzMxLCAxMTA5LCAxMTAwLCAgNzMzLCAxMTA3LAorICAgICAxMDk4LCAgNzM0LCAxMTA1LCAxMDk2LCAgNzM2LCAxMTAzLCAxMDk0LCAgNzM3LCAxMTAxLCAxMDkyLAorICAgICAgNzM4LCAxMDk5LCAxMDkwLCAgNzM5LCAxMDk3LCAxMDg4LCAgNzQwLCAxMDk1LCAxMDg2LCAgNzQxLAorICAgICAxMDkzLCAxMDg0LCAgNzQyLCAxMDkxLCAxMDgyLCAgNzQzLCAxMDg5LCAxMDgwLCAgNzQ0LCAxMDg3LAorICAgICAxMDc4LCAgNzQ1LCAxMDg1LCAxMDc2LCAgNzQ2LCAxMDgzLCAxMDc0LCAgNzQ3LCAxMDgxLCAxMDcyLAorICAgICAgNzQ4LCAxMDc5LCAxMDcwLCAgNzQ5LCAxMDc3LCAxMDgwLCAxMDczLCAxMDgwLCAgICAwLCAxMDczLAorICAgICAgICAwLCAxMDg4LCAxMDYzLCAgNzUwLCAxMDcwLCAxMDYxLCAgNzUxLCAxMDY4LCAgICAwLCAxMDU5LAorICAgICAgNzUyLCAxMDY2LCAxMDU3LCAgNzU1LCAxMDY0LCAxMDYzLCAxMDU0LCAgNzU4LCAxMDYxLCAxMDUyLAorCisgICAgICA3NzYsIDEwNTksIDEwNTAsICA3NzcsIDEwNTcsIDEwNDgsICA3NzksIDEwNTUsIDEwNTgsIDEwNDUsCisgICAgICA3ODAsIDEwNTIsIDEwNDMsICA3ODIsIDEwNTAsIDEwNDEsICA3ODMsIDEwNDgsIDEwMzksICA3ODQsCisgICAgIDEwNDYsIDEwMzcsICA3ODUsIDEwNDQsIDEwMzUsICA3ODYsIDEwNDIsIDEwNDEsICAgIDAsIDEwMzIsCisgICAgIDEwMzksIDEwMzAsIDEwMzcsIDEwMjgsIDEwMzUsIDEwMjYsIDEwMzMsICA3ODcsIDEwMzIsICA3ODgsCisgICAgIDEwNDcsIDEwMjIsICA3ODksIDEwMjksIDEwMjgsIDEwMDYsIDEwMDAsIDEwMDUsIDEwMTEsICA5OTQsCisgICAgIDEwMDksICA0MjQsIDEzMDAsIDEwMDgsICA5OTgsIDEwMDIsIDEzMDAsIDEzMDAsICA5OTIsIDEwMDEsCisgICAgICA5ODcsIDEwMDQsICA5ODcsICA5OTAsICA5ODQsIDEzMDAsICA5ODUsICA5ODQsICA5ODEsICA5ODgsCisgICAgICA5ODEsICA5ODksICA5ODUsICA5OTUsICA5OTIsICA5NzQsICA5ODAsICA5ODcsICA5NzEsICA5NzAsCisgICAgICA5ODgsICA5NzAsICA5ODIsICA5ODEsIDEzMDAsICA5ODAsICA5NzAsICA5NzQsIDEzMDAsICA5NjEsCisgICAgIDEzMDAsICA5NjYsICA5NjYsICA5NzQsICA5NTcsICA5NTgsICA5NjgsIDEzMDAsIDEzMDAsIDEwMDAsCisKKyAgICAgIDk4MiwgIDk5OCwgICAgMCwgIDc5OCwgIDk5NiwgIDk5NiwgIDk5NSwgIDk5NCwgIDk5MywgIDk5MiwKKyAgICAgIDk5MSwgIDk5MCwgIDk4OSwgIDk4OCwgIDk4NywgIDk4NiwgIDk4NSwgIDk4NCwgIDk4MywgIDk4MiwKKyAgICAgIDk4MSwgIDk4MCwgIDk3OSwgIDk3OCwgIDk2NSwgIDk1OCwgICAgMCwgICAgMCwgICAgMCwgIDk3NSwKKyAgICAgIDk3NCwgIDk3MywgIDk3MiwgIDk3MSwgIDk3MCwgIDk2OSwgIDk2OCwgIDk2NywgIDk0NSwgIDk2NSwKKyAgICAgIDk2NCwgIDk2MywgIDk2MiwgIDk2MSwgIDk2MCwgIDk1OSwgIDk1OCwgIDk1NywgIDk1NiwgIDk1NSwKKyAgICAgIDkyOSwgIDkzNiwgIDc5MywgIDkyNywgIDkzNCwgIDc5NCwgIDk1MCwgIDk0OSwgIDkxOCwgIDkyMSwKKyAgICAgIDkwMSwgICAgMCwgIDkwMiwgIDg5NSwgIDkwMiwgIDkwMSwgIDkwMiwgIDg5NCwgIDkxMiwgMTMwMCwKKyAgICAgMTMwMCwgIDg5NCwgIDg5MiwgIDkwMiwgIDg5NSwgMTMwMCwgIDg5MCwgIDkwNywgIDUxNiwgMTMwMCwKKyAgICAgIDg5OCwgIDg4MiwgIDg4MywgIDg5MiwgIDg4MywgIDg4MiwgIDg4MiwgMTMwMCwgIDg4MSwgIDg5MCwKKyAgICAgIDg4MCwgIDg5NiwgIDg5MywgMTMwMCwgIDg5MiwgIDg5MCwgIDg3OSwgIDg4MCwgIDg3NiwgIDg2OCwKKworICAgICAgODc1LCAgODcwLCAgODcxLCAgODY2LCAgODkyLCAgODkyLCAgODkwLCAgOTA0LCAgOTAzLCAgODk4LAorICAgICAgICAwLCAgODg2LCAgODg1LCAgODg0LCAgODgzLCAgODgyLCAgODgxLCAgODgwLCAgODc5LCAgODc4LAorICAgICAgODc3LCAgODc2LCAgODc1LCAgODc0LCAgODczLCAgODcyLCAgODcxLCAgODcwLCAgODY5LCAgODY4LAorICAgICAgICAwLCAgICAwLCAgODY3LCAgODY2LCAgODY1LCAgODY0LCAgODYzLCAgODYyLCAgODYxLCAgODYwLAorICAgICAgODU5LCAgODA0LCAgODU4LCAgODU3LCAgODU2LCAgODU1LCAgODU0LCAgODUzLCAgODUyLCAgODUxLAorICAgICAgODUwLCAgODQ5LCAgODQ4LCAgODY1LCAgODM5LCAgODQ2LCAgODYyLCAgODM2LCAgODQzLCAgODQxLAorICAgICAgODQwLCAgODE4LCAgODE4LCAgICAwLCAgODI1LCAgICAwLCAgODU5LCAgODU4LCAgODA3LCAgODI1LAorICAgICAxMzAwLCAgODIwLCAgODE1LCAgODA4LCAgODA0LCAgODE2LCAgODA2LCAgODA0LCAgODAwLCAgODE2LAorICAgICAgODA3LCAgODA2LCAxMzAwLCAxMzAwLCAgODA5LCAxMzAwLCAgODA0LCAgNzk3LCAgNzg2LCAgNzk3LAorICAgICAgNzg5LCAgNzkzLCAgODA2LCAgODAxLCAgODA0LCAgNzg2LCAxMzAwLCAxMzAwLCAgNzk4LCAgNzg3LAorCisgICAgIDEzMDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA4MjYsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA4MTQsICA4MTMsICA4MDIsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA3ODUsCisgICAgICA3OTgsICA3NzksICA3OTIsICAgIDAsICAgIDAsICA2NTYsICAgIDAsICAgIDAsICA3MDYsICA3MDIsCisgICAgIDEzMDAsICA2NDksIDEzMDAsICA2NDgsICA2NDgsICA2NTQsIDEzMDAsICA2MzcsICA2NDUsICA2MTAsCisgICAgICA2MTIsICA2MDgsICA2MDgsIDEzMDAsICA1NzIsICA1ODMsIDEzMDAsIDEzMDAsICA1NzcsICA1NzMsCisgICAgICA1NjAsICA1NTcsICA1NDIsICA1NTUsIDEzMDAsICA1MzksICA1NzMsICAgIDAsICAgIDAsICA1NzIsCisgICAgICAgIDAsICA1NTUsICAgIDAsICA1NDYsICAgIDAsICA1NjIsICA1NTEsICA0OTUsICA0NzksIDEzMDAsCisKKyAgICAgMTMwMCwgMTMwMCwgIDQ4MSwgIDQ4MSwgMTMwMCwgIDQ4MCwgIDQ0MywgICAzMSwgMTMwMCwgIDE0MSwKKyAgICAgIDE2NiwgIDE3MSwgIDE4NiwgMTMwMCwgMTMwMCwgIDIxMSwgIDIzNiwgIDI3NiwgICAgMCwgICAgMCwKKyAgICAgMTMwMCwgMTMwMCwgIDI5MCwgMTMwMCwgIDMyNSwgMTMwMCwgIDM0NiwgMTMwMCwgMTMwMCwgIDM0MywKKyAgICAgIDM0MSwgMTMwMCwgMTMwMCwgMTMwMCwgIDM2NSwgICAgMCwgIDM4MCwgMTMwMCwgIDM3MSwgMTMwMCwKKyAgICAgMTMwMCwgIDQ4NiwgMTMwMCwgMTMwMCwgIDQ1MSwgIDQ1OCwgICAgMCwgICAgMCwgMTMwMCwgIDgzNiwKKyAgICAgIDUwMywgIDgzOQorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfZGVmWzg1M10gPQorICAgIHsgICAwLAorICAgICAgODQ5LCAgICAxLCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODUwLCAgODUxLCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODQ5LCAgODQ5LCAgODUwLCAgODQ5LCAgODUxLAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODUyLCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKworICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NTEsCisKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKworICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLAorICAgICAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorCisgICAgICA4NDksICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NTEsICA4NTEsICA4NTEsICA4NTEsCisgICAgICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NTEsICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg1MSwgIDg1MSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKKyAgICAgIDg0OSwgIDg1MSwgIDg0OSwgIDg0OSwgIDg1MSwgIDg1MSwgIDg1MSwgIDg1MSwgICAgMCwgIDg0OSwKKyAgICAgIDg0OSwgIDg0OQorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfbnh0WzEzNjhdID0KKyAgICB7ICAgMCwKKyAgICAgICAgNCwgICAgNSwgICAgNiwgICAgNSwgICAgNywgICAgOCwgICAgOSwgICAgNCwgICAxMCwgICAxMSwKKyAgICAgICAxMiwgICAxMywgICAxNCwgICAxMSwgICAxMSwgICAxNSwgICAgOSwgICAxNiwgICAxNywgICAxOCwKKyAgICAgICAxOSwgICAgOSwgICAgOSwgICAgOSwgICAyMCwgICAyMSwgICAyMiwgICAgOSwgICAyMywgICAyNCwKKyAgICAgICAgOSwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAgOSwgICAgOSwgICAyOSwgICAgOSwgICAgOSwKKyAgICAgICAgOSwgICAgOSwgICAgOSwgICAgOSwgICAgOSwgICAgOSwgICAzMCwgICAgOSwgICAgOSwgICAgOSwKKyAgICAgICAgOSwgICAgOSwgICAgOSwgICAgOSwgICAgOSwgICAgOSwgICAzMSwgICAgOSwgICAzMiwgICAzMywKKyAgICAgICAzNCwgICAgOSwgICAzNSwgICAgOSwgICAgOSwgICAgOSwgICAgOSwgICAzNiwgICA5NiwgICAzNiwKKyAgICAgICA0MSwgIDExNiwgIDEzNywgICA5NywgICA4MCwgIDEzOCwgIDgyOSwgICA0MiwgICA0MywgICA0MywKKyAgICAgICA0MywgICA0MywgICA0MywgICA0MywgICA3NywgICA4MSwgICA3OCwgIDExOSwgICA4MiwgIDExNywKKyAgICAgICA4MywgIDIzOCwgICA3OSwgICA2NiwgICA2NywgICA2NywgICA2NywgICA2NywgICA2NywgICA2NywKKworICAgICAgIDg0LCAgIDg1LCAgMjM5LCAgMTUwLCAgIDY4LCAgMTIwLCAgIDM2LCAgIDg2LCAgIDM2LCAgMTUxLAorICAgICAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLCAgIDUyLCAgMTQxLAorICAgICAgMTQyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLAorICAgICAgIDY4LCAgMTQzLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LCAgIDY3LCAgIDY3LCAgIDY3LAorICAgICAgIDY3LCAgIDY3LCAgIDY3LCAgMTcwLCAgMTk0LCAgMTk1LCAgIDY5LCAgIDY4LCAgIDY2LCAgIDY3LAorICAgICAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgMjE4LCAgMTcxLCAgMjE5LCAgIDcwLCAgIDY4LAorICAgICAgIDY2LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDcyLCAgMTM5LCAgIDczLAorICAgICAgIDcxLCAgIDY4LCAgMTQwLCAgIDY4LCAgMTQ0LCAgIDkyLCAgIDc0LCAgMTQ1LCAgIDk4LCAgIDg4LAorICAgICAgNDY3LCAgIDg5LCAgIDc1LCAgIDkzLCAgIDc2LCAgIDY4LCAgIDkwLCAgIDk5LCAgIDk0LCAgIDkxLAorICAgICAgMTAxLCAgMTAwLCAgMTAyLCAgMTAzLCAgIDk1LCAgNDY4LCAgODMwLCAgIDY4LCAgMTM2LCAgMTMzLAorCisgICAgICAyMTAsICAxMzMsICAxMzMsICAxNTIsICAxMzMsICAxMDQsICAxMDUsICAxMzMsICAxMDYsICAxMDcsCisgICAgICAxMDgsICAxMDksICAxMTAsICAxMzQsICAxMTEsICAxMzMsICAxMTIsICAxNTMsICAxMzMsICAyMTEsCisgICAgICAxMzUsICA4MzEsICAxMTMsICAxMTQsICAxNTQsICAxMTUsICAgNDEsICAgNDMsICAgNDMsICAgNDMsCisgICAgICAgNDMsICAgNDMsICAgNDMsICAxNDYsICAxNDcsICAxNTcsICA4MzIsICAxMzIsICAxNjUsICAxMzMsCisgICAgICAxNjYsICAxNjEsICAxNjIsICAxNjcsICAxNjgsICA4MzMsICAxNTgsICAxNjMsICAxODgsICAxNTksCisgICAgICAxMzMsICAxNjksICAxNjAsICAyNjUsICAxODksICAxNjQsICA4MzQsICAyMDEsICAxMzMsICAxNzQsCisgICAgICAxNzMsICAxNzUsICAxNzYsICAxMzIsICA4MzUsICAyNjYsICAxMjgsICAxMjksICAgNDYsICAgNDcsCisgICAgICAgNDgsICAgNDksICAxNzIsICAgNTEsICAgNTIsICAyMDIsICAyODUsICAgNTMsICAgNTQsICAgNTUsCisgICAgICAgNTYsICAgNTcsICAgNTgsICAxMzAsICAgNjAsICAgNjEsICAyODYsICAyNDMsICAxMzEsICAyNDQsCisgICAgICAxNzMsICAxNzMsICAxNzMsICAxNzMsICAxNzcsICAxNzMsICAxNzMsICAxNzgsICAxNzksICAxNzMsCisKKyAgICAgIDE3MywgIDE3MywgIDE4MSwgIDE4MSwgIDE4MSwgIDE4MSwgIDE4MSwgIDE4MSwgIDIyOCwgIDgzNiwKKyAgICAgIDE5NiwgIDE5NywgIDE4MiwgICA2NiwgICA2NywgICA2NywgICA2NywgICA2NywgICA2NywgICA2NywKKyAgICAgIDE5OCwgIDIzMiwgIDIyOSwgIDE4MywgICA2OCwgIDE4NCwgIDE4NCwgIDE4NCwgIDE4NCwgIDE4NCwKKyAgICAgIDE4NCwgIDI0MCwgIDEzNCwgIDI0MSwgIDI1NSwgIDIzMywgIDI4MiwgIDI4NywgIDE4MiwgIDEzNSwKKyAgICAgIDI1OCwgIDI1OCwgIDI4MywgIDI4OCwgIDI0MiwgIDgzNywgIDI1OCwgIDQzMCwgIDE2NCwgIDI1NiwKKyAgICAgICA2OCwgIDI1NywgIDI1NywgIDI1NywgIDI1NywgIDI1NywgIDI1NywgIDI1OCwgIDI1OCwgIDI1OCwKKyAgICAgIDI2MSwgIDI1OCwgIDI1OCwgIDI5OCwgIDI1OCwgIDI3MiwgIDI1OCwgIDI1OCwgIDI1OCwgIDI1OCwKKyAgICAgIDQzMSwgIDI1OCwgIDM4MSwgIDI5OSwgIDI1OCwgIDI1OCwgIDM3OSwgIDgzOCwgIDI1OCwgIDQzMiwKKyAgICAgIDQ0MCwgIDI4OSwgIDI1OCwgIDI5MCwgIDI1OCwgIDI1OCwgIDI5MSwgIDI5MiwgIDM4MCwgIDI1OCwKKyAgICAgIDM4MiwgIDgzOSwgIDI1OCwgIDMwMywgIDMwMywgIDMwMywgIDMwMywgIDg0MCwgIDQ0MSwgIDg0MSwKKworICAgICAgMjU4LCAgODQyLCAgNDMzLCAgMjU4LCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzA0LCAgMzAzLAorICAgICAgMzAzLCAgMzA1LCAgMzA2LCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLAorICAgICAgMzA3LCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgIDQzLCAgIDQzLAorICAgICAgIDQzLCAgIDQzLCAgIDQzLCAgIDQzLCAgODQzLCAgODQ0LCAgNDM0LCAgMzA4LCAgMTMyLCAgMzA5LAorICAgICAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LCAgMTg0LCAgMTg0LCAgMTg0LCAgMTg0LCAgMTg0LAorICAgICAgMTg0LCAgMTg0LCAgMTg0LCAgMTg0LCAgMTg0LCAgMTg0LCAgMTg0LCAgMzEwLCAgMzEzLCAgNDM1LAorICAgICAgMzIxLCAgMzI1LCAgMzExLCAgMzE0LCAgMTMyLCAgMzIyLCAgMzI2LCAgNDM4LCAgMzI4LCAgODQ3LAorICAgICAgNTY1LCAgMzExLCAgMzE1LCAgMzI5LCAgMzIyLCAgMzI2LCAgODQ4LCAgMzExLCAgMzE0LCAgNDM5LAorICAgICAgMzEyLCAgMzE2LCAgMzI5LCAgMzIzLCAgMzI3LCAgMzMxLCAgNTY2LCAgMzM0LCAgMzQwLCAgMzM3LAorICAgICAgMzMyLCAgMzMwLCAgMzM1LCAgMzQxLCAgMzM4LCAgNDgyLCAgODQ1LCAgODQ2LCAgNDgzLCAgMzMyLAorCisgICAgICA0MzYsICAzMzUsICAzNDEsICAzMzgsICAgNDAsICAzMzIsICA4MjgsICAzMzUsICAzMzMsICAzMzgsCisgICAgICAzMzYsICAzNDIsICAzMzksICAzNDMsICAzNDYsICAzNDksICAzNTIsICAzNTUsICAzNDQsICAzNDcsCisgICAgICAzNTAsICAzNTMsICAzNTYsICA0MzcsICA4MjcsICA4MjYsICA4MjUsICAzNDQsICAzNDcsICAzNTAsCisgICAgICAzNTMsICAzNTYsICA0NTUsICA4MjQsICAzNDcsICAzNTAsICAzNDUsICAzNDgsICAzNTEsICAzNTQsCisgICAgICAzNTcsICAzNTgsICAzNjEsICAzNjQsICA4MjMsICA0NTYsICAzNTksICAzNjIsICAzNjUsICA0OTgsCisgICAgICA0OTgsICA0OTgsICA0OTgsICAzNjcsICAzNzAsICAzNTksICAzNjIsICAzNjUsICAzNjgsICAzNzEsCisgICAgICA4MjIsICAzNTksICAzNjIsICAzNjUsICAzNjAsICAzNjMsICAzNjYsICAzNjgsICAzNzEsICA2NzgsCisgICAgICAzNzMsICA4MjEsICA2NzksICAzNjgsICAzNzEsICAzNzQsICAzNjksICAzNzIsICAzODMsICA4MjAsCisgICAgICAzODYsICAzOTAsICAzOTMsICAzODQsICAzNzQsICAzODcsICAzOTEsICAzOTQsICA4MTksICA4MTgsCisgICAgICAzNzQsICA4MTcsICAzODQsICAzNzUsICAzODcsICAzOTEsICAzOTQsICAzOTcsICA4MTYsICA4MTUsCisKKyAgICAgIDgxNCwgIDM4NSwgIDM5OCwgIDM4OCwgIDM5MiwgIDM5NSwgIDQ3MSwgIDQwMCwgIDQwMywgIDQwNiwKKyAgICAgIDQxMCwgIDM5OCwgIDQwMSwgIDQwNCwgIDQwNywgIDQxMSwgIDgxMywgIDM5OCwgIDgxMiwgIDQ3MiwKKyAgICAgIDM5OSwgIDQwMSwgIDQwNCwgIDQwNywgIDQxMSwgIDgxMSwgIDgxMCwgIDQwMSwgIDQwNCwgIDQwNywKKyAgICAgIDQwMiwgIDQwNSwgIDQwOCwgIDQxMiwgIDQxMywgIDQxNiwgIDQxOSwgIDgwOSwgIDgwOCwgIDQxNCwKKyAgICAgIDQxNywgIDQyMCwgIDQ5OCwgIDQ5OCwgIDQ5OCwgIDQ5OCwgIDQyMiwgIDQyNSwgIDQxNCwgIDQxNywKKyAgICAgIDQyMCwgIDQyMywgIDQyNiwgIDgwNywgIDQxNCwgIDQxNywgIDQyMCwgIDQxNSwgIDQxOCwgIDQyMSwKKyAgICAgIDQyMywgIDQyNiwgIDgwNiwgIDQ0MiwgIDgwNSwgIDgwNCwgIDQyMywgIDQyNiwgIDQ0MywgIDQyNCwKKyAgICAgIDQyNywgIDI1NywgIDI1NywgIDI1NywgIDI1NywgIDI1NywgIDI1NywgIDQ0MywgIDI1NywgIDI1NywKKyAgICAgIDI1NywgIDI1NywgIDI1NywgIDI1NywgIDQ1MywgIDQ1MywgIDQ0NCwgIDQ1MywgIDQ1MywgIDgwMywKKyAgICAgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDgwMiwgIDQ1MywgIDgwMSwgIDMxMCwKKworICAgICAgNDUzLCAgNDUzLCAgODAwLCAgNzk5LCAgNDUzLCAgMzEzLCAgNDg1LCAgNDUzLCAgNDUzLCAgNzk4LAorICAgICAgNzk3LCAgNDUzLCAgNDUzLCAgNDkyLCAgNzk2LCAgNDkzLCAgNzk1LCAgNDk0LCAgNDk5LCAgNDk4LAorICAgICAgNDk4LCAgNDk4LCAgMzEyLCAgNDUzLCAgNDk4LCAgNDk4LCAgNDk4LCAgNDk4LCAgMzE2LCAgMzIxLAorICAgICAgNDk1LCAgNDk4LCAgNDk4LCAgNDk4LCAgNDk4LCAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LAorICAgICAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LCAgMzA5LCAgMzEzLCAgMzI1LCAgNTAxLAorICAgICAgMzI4LCAgMzMxLCAgMzIzLCAgMzM0LCAgMzM3LCAgMzQwLCAgMzQzLCAgMzQ2LCAgMzQ5LCAgMzUyLAorICAgICAgMzU1LCAgMzU4LCAgMzYxLCAgMzY0LCAgMzY3LCAgMzcwLCAgMzczLCAgMzgzLCAgMzg2LCAgMzkwLAorICAgICAgMzE2LCAgMzI3LCAgMzkzLCAgMzMwLCAgMzMzLCAgMzk3LCAgMzM2LCAgMzM5LCAgMzQyLCAgMzQ1LAorICAgICAgMzQ4LCAgMzUxLCAgMzU0LCAgMzU3LCAgMzYwLCAgMzYzLCAgMzY2LCAgMzY5LCAgMzcyLCAgMzc1LAorICAgICAgMzg1LCAgMzg4LCAgMzkyLCAgNDAwLCAgNDAzLCAgMzk1LCAgNDA2LCAgNDEwLCAgMzk5LCAgNDEzLAorCisgICAgICA0MTYsICA0MTksICA0MjIsICA0MjUsICA1NTEsICA1NTQsICA0NDIsICA3OTQsICA2MDgsICA2MDksCisgICAgICA2NTUsICA2NTgsICA3OTMsICA3OTIsICA3MzYsICA3MzcsICA0MDIsICA0MDUsICA3OTEsICA0MDgsCisgICAgICA0MTIsICA3OTAsICA0MTUsICA0MTgsICA0MjEsICA0MjQsICA0MjcsICA1NTIsICA1NTUsICA0NDQsCisgICAgICA2MTAsICA3ODksICA3ODgsICA2NTYsICA2NTksICA3MzgsICAgMzgsICAgMzgsICAgMzgsICAxODAsCisgICAgICAxODAsICA3ODcsICA3ODYsICA3ODUsICA3ODQsICA3ODMsICA3ODIsICA3ODEsICA3ODAsICA3NzksCisgICAgICA3NzgsICA3NzcsICA3NzYsICA3NzUsICA3NzQsICA3NzMsICA3NzIsICA3NzEsICA3NzAsICA3NjksCisgICAgICA3NjgsICA3NjcsICA3NjYsICA3NjUsICA3NjQsICA3NjMsICA3NjIsICA3NjEsICA3NjAsICA3NTksCisgICAgICA3NTgsICA3NTcsICA3NTYsICA3NTUsICA3NTQsICA3NTMsICA2NTksICA3NTIsICA3NTEsICA2NTYsCisgICAgICA3NTAsICA3NDksICA3NDgsICA3NDcsICA3NDYsICA3NDUsICA3NDQsICA3NDMsICA3NDIsICA3NDEsCisgICAgICA3NDAsICA3MzksICA3MzUsICA3MzQsICA3MzMsICA3MzIsICA3MzEsICA3MzAsICA3MjksICA3MjgsCisKKyAgICAgIDcyNywgIDcyNiwgIDcyNSwgIDcyNCwgIDcyMywgIDcyMiwgIDcyMSwgIDcyMCwgIDcxOSwgIDcxOCwKKyAgICAgIDcxNywgIDcxNiwgIDcxNSwgIDcxNCwgIDcxMywgIDcxMiwgIDcxMSwgIDcxMCwgIDcwOSwgIDcwOCwKKyAgICAgIDcwNywgIDcwNiwgIDcwNSwgIDcwNCwgIDcwMywgIDcwMiwgIDcwMSwgIDcwMCwgIDY5OSwgIDY5OCwKKyAgICAgIDY5NywgIDY5NiwgIDY5NSwgIDY5NCwgIDY5MywgIDY5MiwgIDY5MSwgIDY5MCwgIDY4OSwgIDY4OCwKKyAgICAgIDY4NywgIDY4NiwgIDY4NSwgIDY4NCwgIDY4MywgIDY4MiwgIDY4MSwgIDY4MCwgIDY3NywgIDY3NiwKKyAgICAgIDY3NSwgIDY3NCwgIDY3MywgIDY3MiwgIDY3MSwgIDY3MCwgIDY2OSwgIDY2OCwgIDY2NywgIDY2NiwKKyAgICAgIDY2NSwgIDY2NCwgIDY2MywgIDY2MiwgIDY2MSwgIDY2MCwgIDY1NywgIDU1NSwgIDY1NCwgIDU1MiwKKyAgICAgIDY1MywgIDY1MiwgIDY1MSwgIDY1MCwgIDY0OSwgIDY0OCwgIDY0NywgIDY0NiwgIDY0NSwgIDY0NCwKKyAgICAgIDY0MywgIDY0MiwgIDY0MSwgIDY0MCwgIDYzOSwgIDYzOCwgIDYzNywgIDYzNiwgIDYzNSwgIDYzNCwKKyAgICAgIDYzMywgIDYzMiwgIDYzMSwgIDYzMCwgIDYyOSwgIDYyOCwgIDYyNywgIDYyNiwgIDYyNSwgIDYyNCwKKworICAgICAgNjIzLCAgNjIyLCAgNjIxLCAgNjIwLCAgNjE5LCAgNjE4LCAgNjE3LCAgNjE2LCAgNjE1LCAgNjE0LAorICAgICAgNjEzLCAgNjEyLCAgNjExLCAgNjA3LCAgNjA2LCAgNjA1LCAgNjA0LCAgNjAzLCAgNjAyLCAgNjAxLAorICAgICAgNjAwLCAgNTk5LCAgNTk4LCAgNTk3LCAgNTk2LCAgNTk1LCAgNTk0LCAgNTkzLCAgNTkyLCAgNTkxLAorICAgICAgNTkwLCAgNTg5LCAgNTg4LCAgNTg3LCAgNTg2LCAgNTg1LCAgNTg0LCAgNTgzLCAgNTgyLCAgNTgxLAorICAgICAgNTgwLCAgNTc5LCAgNTc4LCAgNTc3LCAgNTc2LCAgNTc1LCAgNTc0LCAgNTczLCAgNTcyLCAgNTcxLAorICAgICAgNTcwLCAgNTY5LCAgNTY4LCAgNTY3LCAgNTY0LCAgNTYzLCAgNTYyLCAgNTYxLCAgNTYwLCAgNTU5LAorICAgICAgNTU4LCAgNTU3LCAgNDQ0LCAgNTU2LCAgNTUzLCAgNTUwLCAgNDM3LCAgNTQ5LCAgNDM1LCAgNTQ4LAorICAgICAgNDMzLCAgNTQ3LCAgNDMxLCAgNTQ2LCAgNTQ1LCAgNDI3LCAgNTQ0LCAgNDI0LCAgNTQzLCAgNDIxLAorICAgICAgNTQyLCAgNDE4LCAgNTQxLCAgNDE1LCAgNTQwLCAgNDEyLCAgNTM5LCAgNTM4LCAgNDA4LCAgNTM3LAorICAgICAgNDA1LCAgNTM2LCAgNDAyLCAgNTM1LCAgMzk5LCAgNTM0LCAgNTMzLCAgMzk1LCAgNTMyLCAgMzkyLAorCisgICAgICA1MzEsICAzODgsICA1MzAsICAzODUsICA1MjksICA1MjgsICA1MjcsICA1MjYsICA1MjUsICA1MjQsCisgICAgICAzNzUsICA1MjMsICAzNzIsICA1MjIsICAzNjksICA1MjEsICAzNjYsICA1MjAsICAzNjMsICA1MTksCisgICAgICAzNjAsICA1MTgsICAzNTcsICA1MTcsICAzNTQsICA1MTYsICAzNTEsICA1MTUsICAzNDgsICA1MTQsCisgICAgICAzNDUsICA1MTMsICAzNDIsICA1MTIsICAzMzksICA1MTEsICAzMzYsICA1MTAsICAzMzMsICA1MDksCisgICAgICAzMzAsICA1MDgsICAzMjcsICA1MDcsICAzMjMsICA1MDYsICA1MDUsICA1MDQsICA1MDMsICA1MDIsCisgICAgICAzMTYsICA1MDAsICAzMTIsICA0OTcsICA0OTYsICA0OTEsICA0OTAsICA0ODksICA0ODgsICA0ODcsCisgICAgICA0ODYsICA0ODQsICA0ODEsICA0ODAsICA0NzksICA0NzgsICA0NzcsICA0NzYsICA0NzUsICA0NzQsCisgICAgICA0NzMsICA0NzAsICA0NjksICA0NjYsICA0NjUsICA0NjQsICA0NjMsICA0NjIsICA0NjEsICA0NjAsCisgICAgICA0NTksICA0NTgsICA0NTcsICA0NTQsICAyODksICAyNjEsICA0NTIsICA0NTEsICA0NTAsICA0NDksCisgICAgICA0NDgsICA0NDcsICA0NDYsICA0NDUsICA0MjksICA0MjgsICA0MDksICAzOTYsICAzODksICAzNzgsCisKKyAgICAgIDM3NywgIDM3NiwgIDMyNCwgIDMyMCwgIDMxOSwgIDMxOCwgIDMxNywgIDMwMiwgIDMwMSwgIDMwMCwKKyAgICAgIDI5NywgIDI5NiwgIDI5NSwgIDI5NCwgIDI5MywgIDI4NCwgIDI4MSwgIDI4MCwgIDI3OSwgIDI3OCwKKyAgICAgIDI3NywgIDI3NiwgIDI3NSwgIDI3NCwgIDI3MywgIDI3MSwgIDI3MCwgIDI2OSwgIDI2OCwgIDI2NywKKyAgICAgIDI2NCwgIDI2MywgIDI2MiwgIDI2MCwgIDI1OSwgIDE3MiwgIDI1NCwgIDI1MywgIDI1MiwgIDI1MSwKKyAgICAgIDI1MCwgIDI0OSwgIDI0OCwgIDI0NywgIDI0NiwgIDI0NSwgIDIzNywgIDIzNiwgIDIzNSwgIDIzNCwKKyAgICAgIDIzMSwgIDIzMCwgIDIyNywgIDIyNiwgIDIyNSwgIDIyNCwgIDIyMywgIDIyMiwgIDIyMSwgIDIyMCwKKyAgICAgIDIxNywgIDIxNiwgIDIxNSwgIDIxNCwgIDIxMywgIDIxMiwgIDIwOSwgIDIwOCwgIDIwNywgIDIwNiwKKyAgICAgIDIwNSwgIDIwNCwgIDIwMywgIDIwMCwgIDE5OSwgIDE5MywgIDE5MiwgIDE5MSwgIDE5MCwgIDE4NywKKyAgICAgIDE4NiwgIDE4NSwgIDE1NiwgIDE1NSwgIDE0OSwgIDE0OCwgICAzOSwgIDEyNywgIDEyNiwgIDEyNSwKKyAgICAgIDEyNCwgIDEyMywgIDEyMiwgIDEyMSwgIDExOCwgICA4NywgICAzOSwgICAzNywgIDg0OSwgICAgMywKKworICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5CisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9jaGtbMTM2OF0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICA1LCAgIDIzLCAgICA1LAorICAgICAgIDEwLCAgIDI3LCAgIDQ2LCAgIDIzLCAgIDE3LCAgIDQ2LCAgODA4LCAgIDEwLCAgIDEwLCAgIDEwLAorICAgICAgIDEwLCAgIDEwLCAgIDEwLCAgIDEwLCAgIDE2LCAgIDE3LCAgIDE2LCAgIDI5LCAgIDE3LCAgIDI3LAorICAgICAgIDE4LCAgMTE2LCAgIDE2LCAgIDExLCAgIDExLCAgIDExLCAgIDExLCAgIDExLCAgIDExLCAgIDExLAorCisgICAgICAgMTgsICAgMTksICAxMTYsICAgNTMsICAgMTEsICAgMjksICAgMzYsICAgMTksICAgMzYsICAgNTMsCisgICAgICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgNDgsCisgICAgICAgNDgsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsCisgICAgICAgMTEsICAgNDgsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTIsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgNjEsICAgODAsICAgODAsICAgMTIsICAgMTIsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgOTksICAgNjEsICAgOTksICAgMTMsICAgMTMsCisgICAgICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTUsICAgNDcsICAgMTUsCisgICAgICAgMTQsICAgMTQsICAgNDcsICAgMTIsICAgNDksICAgMjIsICAgMTUsICAgNDksICAgMjQsICAgMjEsCisgICAgICAyNzQsICAgMjEsICAgMTUsICAgMjIsICAgMTUsICAgMTMsICAgMjEsICAgMjQsICAgMjIsICAgMjEsCisgICAgICAgMjUsICAgMjQsICAgMjUsICAgMjUsICAgMjIsICAyNzQsICA4MTAsICAgMTQsICAgNDUsICAgNDUsCisKKyAgICAgICA5MiwgICA0NCwgICA0NCwgICA1NCwgICA0NSwgICAyNSwgICAyNiwgICA0NCwgICAyNiwgICAyNiwKKyAgICAgICAyNiwgICAyNiwgICAyNiwgICA0NCwgICAyNiwgICA0NSwgICAyNiwgICA1NCwgICA0NCwgICA5MiwKKyAgICAgICA0NCwgIDgxMSwgICAyNiwgICAyNiwgICA1NCwgICAyNiwgICA0MSwgICA0MywgICA0MywgICA0MywKKyAgICAgICA0MywgICA0MywgICA0MywgICA1MCwgICA1MCwgICA1NywgIDgxMiwgICA0MywgICA2MCwgICA1MCwKKyAgICAgICA2MCwgICA1OSwgICA1OSwgICA2MCwgICA2MCwgIDgxMywgICA1NywgICA1OSwgICA3NSwgICA1NywKKyAgICAgICA1MCwgICA2MCwgICA1NywgIDE0MCwgICA3NSwgICA1OSwgIDgxNiwgICA4NCwgICA1OSwgICA2MywKKyAgICAgICA2MywgICA2MywgICA2MywgICA0MywgIDgxNywgIDE0MCwgICA0MSwgICA0MSwgICA0MSwgICA0MSwKKyAgICAgICA0MSwgICA0MSwgICA2MiwgICA0MSwgICA0MSwgICA4NCwgIDE1OSwgICA0MSwgICA0MSwgICA0MSwKKyAgICAgICA0MSwgICA0MSwgICA0MSwgICA0MSwgICA0MSwgICA0MSwgIDE1OSwgIDExOCwgICA0MSwgIDExOCwKKyAgICAgICA2MiwgICA2MiwgICA2MiwgICA2MiwgICA2NCwgICA2NCwgICA2NCwgICA2NCwgICA2NSwgICA2NSwKKworICAgICAgIDY1LCAgIDY1LCAgIDY2LCAgIDY2LCAgIDY2LCAgIDY2LCAgIDY2LCAgIDY2LCAgMTA4LCAgODE4LAorICAgICAgIDgxLCAgIDgxLCAgIDY2LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LCAgIDY3LAorICAgICAgIDgxLCAgMTExLCAgMTA4LCAgIDY4LCAgIDY3LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LAorICAgICAgIDY4LCAgMTE3LCAgMTI4LCAgMTE3LCAgMTMwLCAgMTExLCAgMTU3LCAgMTYwLCAgIDY2LCAgMTI4LAorICAgICAgMTMzLCAgMTMzLCAgMTU3LCAgMTYwLCAgMTE3LCAgODIzLCAgMTMzLCAgMjM5LCAgMTMwLCAgMTMyLAorICAgICAgIDY3LCAgMTMyLCAgMTMyLCAgMTMyLCAgMTMyLCAgMTMyLCAgMTMyLCAgMTMzLCAgMTM2LCAgMTM2LAorICAgICAgMTM2LCAgMTQ2LCAgMTQ2LCAgMTY5LCAgMTM2LCAgMTQ3LCAgMTQ3LCAgMTQ2LCAgMTYxLCAgMTYxLAorICAgICAgMjM5LCAgMTQ3LCAgMjE5LCAgMTY5LCAgMTYxLCAgMTM2LCAgMjE4LCAgODI1LCAgMTQ2LCAgMjQwLAorICAgICAgMjQ0LCAgMTYxLCAgMTQ3LCAgMTYyLCAgMTYyLCAgMTYxLCAgMTYzLCAgMTYzLCAgMjE4LCAgMTYyLAorICAgICAgMjE5LCAgODI3LCAgMTYzLCAgMTczLCAgMTczLCAgMTczLCAgMTczLCAgODMwLCAgMjQ0LCAgODMxLAorCisgICAgICAxNjIsICA4MzUsICAyNDAsICAxNjMsICAxNzQsICAxNzQsICAxNzQsICAxNzQsICAxNzUsICAxNzUsCisgICAgICAxNzUsICAxNzUsICAxNzYsICAxNzYsICAxNzYsICAxNzYsICAxNzcsICAxNzcsICAxNzcsICAxNzcsCisgICAgICAxNzgsICAxNzgsICAxNzgsICAxNzgsICAxNzksICAxNzksICAxNzksICAxNzksICAxODEsICAxODEsCisgICAgICAxODEsICAxODEsICAxODEsICAxODEsICA4MzcsICA4MzksICAyNDEsICAxODIsICAxODEsICAxODIsCisgICAgICAxODIsICAxODIsICAxODIsICAxODIsICAxODIsICAxODMsICAxODMsICAxODMsICAxODMsICAxODMsCisgICAgICAxODMsICAxODQsICAxODQsICAxODQsICAxODQsICAxODQsICAxODQsICAxODUsICAxODYsICAyNDEsCisgICAgICAxOTIsICAxOTQsICAxODUsICAxODYsICAxODEsICAxOTIsICAxOTQsICAyNDMsICAxOTUsICA4NDUsCisgICAgICA0NTIsICAxODUsICAxODYsICAxOTUsICAxOTIsICAxOTQsICA4NDYsICAxODUsICAxODYsICAyNDMsCisgICAgICAxODUsICAxODYsICAxOTUsICAxOTIsICAxOTQsICAxOTYsICA0NTIsICAxOTcsICAxOTksICAxOTgsCisgICAgICAxOTYsICAxOTUsICAxOTcsICAxOTksICAxOTgsICAyODgsICA4NDIsICA4NDIsICAyODgsICAxOTYsCisKKyAgICAgIDI0MiwgIDE5NywgIDE5OSwgIDE5OCwgIDg1MSwgIDE5NiwgIDgwNywgIDE5NywgIDE5NiwgIDE5OCwKKyAgICAgIDE5NywgIDE5OSwgIDE5OCwgIDIwMSwgIDIwMywgIDIwNCwgIDIwNiwgIDIwNywgIDIwMSwgIDIwMywKKyAgICAgIDIwNCwgIDIwNiwgIDIwNywgIDI0MiwgIDgwNiwgIDgwNCwgIDgwMywgIDIwMSwgIDIwMywgIDIwNCwKKyAgICAgIDIwNiwgIDIwNywgIDI2MCwgIDc5OSwgIDIwMywgIDIwNCwgIDIwMSwgIDIwMywgIDIwNCwgIDIwNiwKKyAgICAgIDIwNywgIDIwOSwgIDIxMCwgIDIxMSwgIDc5OCwgIDI2MCwgIDIwOSwgIDIxMCwgIDIxMSwgIDMwMywKKyAgICAgIDMwMywgIDMwMywgIDMwMywgIDIxMiwgIDIxMywgIDIwOSwgIDIxMCwgIDIxMSwgIDIxMiwgIDIxMywKKyAgICAgIDc5NywgIDIwOSwgIDIxMCwgIDIxMSwgIDIwOSwgIDIxMCwgIDIxMSwgIDIxMiwgIDIxMywgIDU3OSwKKyAgICAgIDIxNCwgIDc5NiwgIDU3OSwgIDIxMiwgIDIxMywgIDIxNCwgIDIxMiwgIDIxMywgIDIyMCwgIDc5NCwKKyAgICAgIDIyMSwgIDIyMywgIDIyNCwgIDIyMCwgIDIxNCwgIDIyMSwgIDIyMywgIDIyNCwgIDc5MiwgIDc5MCwKKyAgICAgIDIxNCwgIDc4NywgIDIyMCwgIDIxNCwgIDIyMSwgIDIyMywgIDIyNCwgIDIyNiwgIDc4NiwgIDc4NCwKKworICAgICAgNzgzLCAgMjIwLCAgMjI2LCAgMjIxLCAgMjIzLCAgMjI0LCAgMjc3LCAgMjI3LCAgMjI4LCAgMjI5LAorICAgICAgMjMxLCAgMjI2LCAgMjI3LCAgMjI4LCAgMjI5LCAgMjMxLCAgNzgyLCAgMjI2LCAgNzgxLCAgMjc3LAorICAgICAgMjI2LCAgMjI3LCAgMjI4LCAgMjI5LCAgMjMxLCAgNzgwLCAgNzc5LCAgMjI3LCAgMjI4LCAgMjI5LAorICAgICAgMjI3LCAgMjI4LCAgMjI5LCAgMjMxLCAgMjMyLCAgMjMzLCAgMjM0LCAgNzc2LCAgNzc1LCAgMjMyLAorICAgICAgMjMzLCAgMjM0LCAgMzA0LCAgMzA0LCAgMzA0LCAgMzA0LCAgMjM1LCAgMjM2LCAgMjMyLCAgMjMzLAorICAgICAgMjM0LCAgMjM1LCAgMjM2LCAgNzczLCAgMjMyLCAgMjMzLCAgMjM0LCAgMjMyLCAgMjMzLCAgMjM0LAorICAgICAgMjM1LCAgMjM2LCAgNzcyLCAgMjQ1LCAgNzcxLCAgNzcwLCAgMjM1LCAgMjM2LCAgMjQ1LCAgMjM1LAorICAgICAgMjM2LCAgMjU2LCAgMjU2LCAgMjU2LCAgMjU2LCAgMjU2LCAgMjU2LCAgMjQ1LCAgMjU3LCAgMjU3LAorICAgICAgMjU3LCAgMjU3LCAgMjU3LCAgMjU3LCAgMjU4LCAgMjU4LCAgMjQ1LCAgMjcyLCAgMjcyLCAgNzY5LAorICAgICAgMjU4LCAgMjkwLCAgMjkwLCAgMjcyLCAgMjkxLCAgMjkxLCAgNzY4LCAgMjkwLCAgNzY2LCAgMzExLAorCisgICAgICAyOTEsICAyNTgsICA3NjUsICA3NjQsICAyNzIsICAzMTQsICAyOTIsICAyOTIsICAyOTAsICA3NjIsCisgICAgICA3NjAsICAyOTEsICAyOTIsICAzMDAsICA3NTksICAzMDAsICA3NTYsICAzMDAsICAzMDUsICAzMDUsCisgICAgICAzMDUsICAzMDUsICAzMTEsICAyOTIsICAzMDYsICAzMDYsICAzMDYsICAzMDYsICAzMTQsICAzMjIsCisgICAgICAzMDAsICAzMDcsICAzMDcsICAzMDcsICAzMDcsICAzMDgsICAzMDgsICAzMDgsICAzMDgsICAzMDgsCisgICAgICAzMDgsICAzMDksICAzMDksICAzMDksICAzMDksICAzMDksICAzMDksICAzMTUsICAzMjYsICAzMTUsCisgICAgICAzMjksICAzMzIsICAzMjIsICAzMzUsICAzMzgsICAzNDEsICAzNDQsICAzNDcsICAzNTAsICAzNTMsCisgICAgICAzNTYsICAzNTksICAzNjIsICAzNjUsICAzNjgsICAzNzEsICAzNzQsICAzODQsICAzODcsICAzOTEsCisgICAgICAzMTUsICAzMjYsICAzOTQsICAzMjksICAzMzIsICAzOTgsICAzMzUsICAzMzgsICAzNDEsICAzNDQsCisgICAgICAzNDcsICAzNTAsICAzNTMsICAzNTYsICAzNTksICAzNjIsICAzNjUsICAzNjgsICAzNzEsICAzNzQsCisgICAgICAzODQsICAzODcsICAzOTEsICA0MDEsICA0MDQsICAzOTQsICA0MDcsICA0MTEsICAzOTgsICA0MTQsCisKKyAgICAgIDQxNywgIDQyMCwgIDQyMywgIDQyNiwgIDQzOCwgIDQ0MCwgIDQ0MywgIDc1MywgIDUwNCwgIDUwNCwKKyAgICAgIDU1MywgIDU1NiwgIDc1MiwgIDc1MSwgIDY0MiwgIDY0MiwgIDQwMSwgIDQwNCwgIDc1MCwgIDQwNywKKyAgICAgIDQxMSwgIDczOCwgIDQxNCwgIDQxNywgIDQyMCwgIDQyMywgIDQyNiwgIDQzOCwgIDQ0MCwgIDQ0MywKKyAgICAgIDUwNCwgIDczNywgIDczNiwgIDU1MywgIDU1NiwgIDY0MiwgIDg1MCwgIDg1MCwgIDg1MCwgIDg1MiwKKyAgICAgIDg1MiwgIDcwNywgIDcwMCwgIDY5OSwgIDY5NiwgIDY5NSwgIDY5NCwgIDY5MywgIDY5MiwgIDY5MSwKKyAgICAgIDY5MCwgIDY4OSwgIDY4OCwgIDY4NywgIDY4NSwgIDY4MiwgIDY4MSwgIDY4MCwgIDY3OSwgIDY3OCwKKyAgICAgIDY3NywgIDY3NiwgIDY3NSwgIDY3NCwgIDY3MywgIDY3MiwgIDY3MCwgIDY2OSwgIDY2OCwgIDY2NywKKyAgICAgIDY2NSwgIDY2MywgIDY2MiwgIDY2MSwgIDY2MCwgIDY1OSwgIDY1OCwgIDY1NywgIDY1NiwgIDY1NSwKKyAgICAgIDY1NCwgIDY1MywgIDY1MiwgIDY1MSwgIDY1MCwgIDY0OSwgIDY0OCwgIDY0NywgIDY0NiwgIDY0NSwKKyAgICAgIDY0NCwgIDY0MywgIDY0MSwgIDY0MCwgIDYzOSwgIDYzOCwgIDYzNywgIDYzNiwgIDYzNSwgIDYzNCwKKworICAgICAgNjMzLCAgNjMwLCAgNjI5LCAgNjI4LCAgNjI3LCAgNjI2LCAgNjI1LCAgNjI0LCAgNjIzLCAgNjIyLAorICAgICAgNjIxLCAgNjIwLCAgNjE5LCAgNjE4LCAgNjE3LCAgNjE2LCAgNjE1LCAgNjE0LCAgNjEzLCAgNjEyLAorICAgICAgNjEwLCAgNjA5LCAgNjA4LCAgNjA3LCAgNjA2LCAgNjA1LCAgNjA0LCAgNjAzLCAgNjAyLCAgNjAxLAorICAgICAgNjAwLCAgNTk5LCAgNTk4LCAgNTk3LCAgNTk2LCAgNTk1LCAgNTkzLCAgNTkyLCAgNTkxLCAgNTkwLAorICAgICAgNTg5LCAgNTg3LCAgNTg2LCAgNTg1LCAgNTg0LCAgNTgzLCAgNTgyLCAgNTgxLCAgNTc4LCAgNTc3LAorICAgICAgNTc1LCAgNTc0LCAgNTczLCAgNTcyLCAgNTY5LCAgNTY4LCAgNTY3LCAgNTY2LCAgNTY1LCAgNTY0LAorICAgICAgNTYzLCAgNTYxLCAgNTYwLCAgNTU5LCAgNTU4LCAgNTU3LCAgNTU1LCAgNTU0LCAgNTUyLCAgNTUxLAorICAgICAgNTUwLCAgNTQ5LCAgNTQ4LCAgNTQ3LCAgNTQ2LCAgNTQ1LCAgNTQ0LCAgNTQzLCAgNTQyLCAgNTQxLAorICAgICAgNTQwLCAgNTM5LCAgNTM4LCAgNTM3LCAgNTM2LCAgNTM1LCAgNTM0LCAgNTMzLCAgNTMyLCAgNTMxLAorICAgICAgNTMwLCAgNTI2LCAgNTI1LCAgNTI0LCAgNTIzLCAgNTIyLCAgNTIxLCAgNTIwLCAgNTE5LCAgNTE4LAorCisgICAgICA1MTcsICA1MTYsICA1MTUsICA1MTQsICA1MTMsICA1MTIsICA1MTEsICA1MTAsICA1MDksICA1MDgsCisgICAgICA1MDcsICA1MDYsICA1MDUsICA1MDIsICA1MDEsICA1MDAsICA0OTcsICA0OTYsICA0OTUsICA0OTQsCisgICAgICA0OTMsICA0OTIsICA0OTAsICA0ODgsICA0ODcsICA0ODYsICA0ODQsICA0ODMsICA0ODIsICA0ODEsCisgICAgICA0ODAsICA0NzksICA0NzgsICA0NzcsICA0NzYsICA0NzUsICA0NzQsICA0NzMsICA0NzIsICA0NzEsCisgICAgICA0NzAsICA0NjksICA0NjgsICA0NjcsICA0NjUsICA0NjQsICA0NjMsICA0NjIsICA0NjEsICA0NjAsCisgICAgICA0NTksICA0NTYsICA0NTUsICA0NTQsICA0NTEsICA0NTAsICA0NDksICA0NDgsICA0NDcsICA0NDYsCisgICAgICA0NDUsICA0NDQsICA0NDIsICA0NDEsICA0MzksICA0MzcsICA0MzYsICA0MzUsICA0MzQsICA0MzMsCisgICAgICA0MzIsICA0MzEsICA0MzAsICA0MjgsICA0MjcsICA0MjUsICA0MjQsICA0MjIsICA0MjEsICA0MTksCisgICAgICA0MTgsICA0MTYsICA0MTUsICA0MTMsICA0MTIsICA0MTAsICA0MDksICA0MDgsICA0MDYsICA0MDUsCisgICAgICA0MDMsICA0MDIsICA0MDAsICAzOTksICAzOTcsICAzOTYsICAzOTUsICAzOTMsICAzOTIsICAzOTAsCisKKyAgICAgIDM4OCwgIDM4NiwgIDM4NSwgIDM4MywgIDM4MiwgIDM4MCwgIDM3OCwgIDM3NywgIDM3NiwgIDM3NSwKKyAgICAgIDM3MywgIDM3MiwgIDM3MCwgIDM2OSwgIDM2NywgIDM2NiwgIDM2NCwgIDM2MywgIDM2MSwgIDM2MCwKKyAgICAgIDM1OCwgIDM1NywgIDM1NSwgIDM1NCwgIDM1MiwgIDM1MSwgIDM0OSwgIDM0OCwgIDM0NiwgIDM0NSwKKyAgICAgIDM0MywgIDM0MiwgIDM0MCwgIDMzOSwgIDMzNywgIDMzNiwgIDMzNCwgIDMzMywgIDMzMSwgIDMzMCwKKyAgICAgIDMyOCwgIDMyNywgIDMyNSwgIDMyMywgIDMyMSwgIDMyMCwgIDMxOSwgIDMxOCwgIDMxNywgIDMxNiwKKyAgICAgIDMxMywgIDMxMiwgIDMxMCwgIDMwMiwgIDMwMSwgIDI5OSwgIDI5OCwgIDI5NywgIDI5NiwgIDI5NSwKKyAgICAgIDI5NCwgIDI4OSwgIDI4NywgIDI4NiwgIDI4NSwgIDI4NCwgIDI4MywgIDI4MiwgIDI4MSwgIDI4MCwKKyAgICAgIDI3OCwgIDI3NiwgIDI3NSwgIDI3MywgIDI3MSwgIDI3MCwgIDI2NywgIDI2NiwgIDI2NSwgIDI2NCwKKyAgICAgIDI2MywgIDI2MiwgIDI2MSwgIDI1OSwgIDI1NSwgIDI1NCwgIDI1MywgIDI1MiwgIDI1MSwgIDI1MCwKKyAgICAgIDI0OSwgIDI0OCwgIDI0NywgIDI0NiwgIDIzOCwgIDIzNywgIDIzMCwgIDIyNSwgIDIyMiwgIDIxNywKKworICAgICAgMjE2LCAgMjE1LCAgMTkzLCAgMTkxLCAgMTkwLCAgMTg5LCAgMTg3LCAgMTcyLCAgMTcxLCAgMTcwLAorICAgICAgMTY4LCAgMTY3LCAgMTY2LCAgMTY1LCAgMTY0LCAgMTU4LCAgMTU2LCAgMTU1LCAgMTU0LCAgMTUzLAorICAgICAgMTUyLCAgMTUxLCAgMTUwLCAgMTQ5LCAgMTQ4LCAgMTQ1LCAgMTQ0LCAgMTQzLCAgMTQyLCAgMTQxLAorICAgICAgMTM5LCAgMTM4LCAgMTM3LCAgMTM1LCAgMTM0LCAgMTMxLCAgMTI5LCAgMTI3LCAgMTI2LCAgMTI1LAorICAgICAgMTI0LCAgMTIzLCAgMTIyLCAgMTIxLCAgMTIwLCAgMTE5LCAgMTE1LCAgMTE0LCAgMTEzLCAgMTEyLAorICAgICAgMTEwLCAgMTA5LCAgMTA3LCAgMTA2LCAgMTA1LCAgMTA0LCAgMTAzLCAgMTAyLCAgMTAxLCAgMTAwLAorICAgICAgIDk4LCAgIDk3LCAgIDk2LCAgIDk1LCAgIDk0LCAgIDkzLCAgIDkxLCAgIDkwLCAgIDg5LCAgIDg4LAorICAgICAgIDg3LCAgIDg2LCAgIDg1LCAgIDgzLCAgIDgyLCAgIDc5LCAgIDc4LCAgIDc3LCAgIDc2LCAgIDc0LAorICAgICAgIDczLCAgIDcyLCAgIDU2LCAgIDU1LCAgIDUyLCAgIDUxLCAgIDM4LCAgIDM3LCAgIDM1LCAgIDM0LAorICAgICAgIDMzLCAgIDMyLCAgIDMxLCAgIDMwLCAgIDI4LCAgIDIwLCAgICA4LCAgICA3LCAgICAzLCAgODQ5LAorCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksCisgICAgICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDksICA4NDkKKyAgICB9IDsKKworLyogVGhlIGludGVudCBiZWhpbmQgdGhpcyBkZWZpbml0aW9uIGlzIHRoYXQgaXQnbGwgY2F0Y2gKKyAqIGFueSB1c2VzIG9mIFJFSkVDVCB3aGljaCBmbGV4IG1pc3NlZC4KKyAqLworI2RlZmluZSBSRUpFQ1QgcmVqZWN0X3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSB5eW1vcmUoKSB5eW1vcmVfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIFlZX01PUkVfQURKIDAKKyNkZWZpbmUgWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorI2xpbmUgMSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCisjbGluZSAyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfc3RhdGV2YXJzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9zeW1ib2xfdGFibGUuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dyYW1fcGFyc2VyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnRhYi5oIgorCisjZGVmaW5lIHJlcXVpcmVfQVJCX3ZwICh5eWV4dHJhLT5tb2RlID09IEFSQl92ZXJ0ZXgpCisjZGVmaW5lIHJlcXVpcmVfQVJCX2ZwICh5eWV4dHJhLT5tb2RlID09IEFSQl9mcmFnbWVudCkKKyNkZWZpbmUgcmVxdWlyZV9OVl9mcCAgKHl5ZXh0cmEtPm9wdGlvbi5OVl9mcmFnbWVudCkKKyNkZWZpbmUgcmVxdWlyZV9zaGFkb3cgKHl5ZXh0cmEtPm9wdGlvbi5TaGFkb3cpCisjZGVmaW5lIHJlcXVpcmVfcmVjdCAgICh5eWV4dHJhLT5vcHRpb24uVGV4UmVjdCkKKyNkZWZpbmUgcmVxdWlyZV90ZXhhcnJheSAgICAgICAgKHl5ZXh0cmEtPm9wdGlvbi5UZXhBcnJheSkKKworI2lmbmRlZiBIQVZFX1VOSVNURF9ICisjZGVmaW5lIFlZX05PX1VOSVNURF9ICisjZW5kaWYKKworI2RlZmluZSByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihjb25kaXRpb24sIHRva2VuKQlcCisgICBkbyB7CQkJCQkJCVwKKyAgICAgIGlmIChjb25kaXRpb24pIHsJCQkJCVwKKwkgcmV0dXJuIHRva2VuOwkJCQkJXAorICAgICAgfSBlbHNlIHsJCQkJCQlcCisJIHJldHVybiBoYW5kbGVfaWRlbnQoeXlleHRyYSwgeXl0ZXh0LCB5eWx2YWwpOwlcCisgICAgICB9CQkJCQkJCVwKKyAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgcmV0dXJuX3Rva2VuX29yX0RPVChjb25kaXRpb24sIHRva2VuKQkJXAorICAgZG8gewkJCQkJCQlcCisgICAgICBpZiAoY29uZGl0aW9uKSB7CQkJCQlcCisJIHJldHVybiB0b2tlbjsJCQkJCVwKKyAgICAgIH0gZWxzZSB7CQkJCQkJXAorCSB5eWxlc3MoMSk7CQkJCQlcCisJIHJldHVybiBET1Q7CQkJCQlcCisgICAgICB9CQkJCQkJCVwKKyAgIH0gd2hpbGUgKDApCisKKworI2RlZmluZSByZXR1cm5fb3Bjb2RlKGNvbmRpdGlvbiwgdG9rZW4sIG9wY29kZSwgbGVuKQlcCisgICBkbyB7CQkJCQkJCVwKKyAgICAgIGlmIChjb25kaXRpb24gJiYJCQkJCVwKKwkgIF9tZXNhX3BhcnNlX2luc3RydWN0aW9uX3N1ZmZpeCh5eWV4dHJhLAlcCisJCQkJCSB5eXRleHQgKyBsZW4sCVwKKwkJCQkJICYgeXlsdmFsLT50ZW1wX2luc3QpKSB7CVwKKwkgeXlsdmFsLT50ZW1wX2luc3QuT3Bjb2RlID0gT1BDT0RFXyAjIyBvcGNvZGU7CVwKKwkgcmV0dXJuIHRva2VuOwkJCQkJXAorICAgICAgfSBlbHNlIHsJCQkJCQlcCisJIHJldHVybiBoYW5kbGVfaWRlbnQoeXlleHRyYSwgeXl0ZXh0LCB5eWx2YWwpOwlcCisgICAgICB9CQkJCQkJCVwKKyAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgU1dJWlpMRV9JTlZBTCAgTUFLRV9TV0laWkxFNChTV0laWkxFX05JTCwgU1dJWlpMRV9OSUwsIFwKKwkJCQkgICAgIFNXSVpaTEVfTklMLCBTV0laWkxFX05JTCkKKworc3RhdGljIHVuc2lnbmVkCittYXNrX2Zyb21fY2hhcihjaGFyIGMpCit7CisgICBzd2l0Y2ggKGMpIHsKKyAgIGNhc2UgJ3gnOgorICAgY2FzZSAncic6CisgICAgICByZXR1cm4gV1JJVEVNQVNLX1g7CisgICBjYXNlICd5JzoKKyAgIGNhc2UgJ2cnOgorICAgICAgcmV0dXJuIFdSSVRFTUFTS19ZOworICAgY2FzZSAneic6CisgICBjYXNlICdiJzoKKyAgICAgIHJldHVybiBXUklURU1BU0tfWjsKKyAgIGNhc2UgJ3cnOgorICAgY2FzZSAnYSc6CisgICAgICByZXR1cm4gV1JJVEVNQVNLX1c7CisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQKK3N3aXpfZnJvbV9jaGFyKGNoYXIgYykKK3sKKyAgIHN3aXRjaCAoYykgeworICAgY2FzZSAneCc6CisgICBjYXNlICdyJzoKKyAgICAgIHJldHVybiBTV0laWkxFX1g7CisgICBjYXNlICd5JzoKKyAgIGNhc2UgJ2cnOgorICAgICAgcmV0dXJuIFNXSVpaTEVfWTsKKyAgIGNhc2UgJ3onOgorICAgY2FzZSAnYic6CisgICAgICByZXR1cm4gU1dJWlpMRV9aOworICAgY2FzZSAndyc6CisgICBjYXNlICdhJzoKKyAgICAgIHJldHVybiBTV0laWkxFX1c7CisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitoYW5kbGVfaWRlbnQoc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICp0ZXh0LCBZWVNUWVBFICpsdmFsKQoreworICAgbHZhbC0+c3RyaW5nID0gc3RyZHVwKHRleHQpOworCisgICByZXR1cm4gKF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbChzdGF0ZS0+c3QsIDAsIHRleHQpID09IE5VTEwpCisgICAgICA/IElERU5USUZJRVIgOiBVU0VEX0lERU5USUZJRVI7Cit9CisKKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04JCQkJCQkJXAorICAgZG8gewkJCQkJCQkJCVwKKyAgICAgIHl5bGxvYy0+Zmlyc3RfY29sdW1uID0geXlsbG9jLT5sYXN0X2NvbHVtbjsJCQlcCisgICAgICB5eWxsb2MtPmxhc3RfY29sdW1uICs9IHl5bGVuZzsJCQkJCVwKKyAgICAgIGlmICgoeXlsbG9jLT5maXJzdF9saW5lID09IDEpCQkJCQlcCisJICAmJiAoeXlsbG9jLT5maXJzdF9jb2x1bW4gPT0gMSkpIHsJCQkJXAorCSB5eWxsb2MtPnBvc2l0aW9uID0gMTsJCQkJCQlcCisgICAgICB9IGVsc2UgewkJCQkJCQkJXAorCSB5eWxsb2MtPnBvc2l0aW9uICs9IHl5bGxvYy0+bGFzdF9jb2x1bW4gLSB5eWxsb2MtPmZpcnN0X2NvbHVtbjsgXAorICAgICAgfQkJCQkJCQkJCVwKKyAgIH0gd2hpbGUoMCk7CisKKyNkZWZpbmUgWVlfTk9fSU5QVVQKKworLyogWWVzLCB0aGlzIGlzIGludGVudGlvbmFsbHkgZG9pbmcgbm90aGluZy4gV2UgaGF2ZSB0aGlzIGxpbmUgb2YgY29kZQoraGVyZSBvbmx5IHRvIGF2b2lkIHRoZSBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCBhbiB1bnB1dCBmdW5jdGlvbgordGhhdCBpcyBkZWZpbmVkLCBidXQgbmV2ZXIgY2FsbGVkLiAqLworI2RlZmluZSBZWV9VU0VSX0lOSVQgd2hpbGUgKDApIHsgdW5wdXQoMCk7IH0KKworI2RlZmluZSBZWV9FWFRSQV9UWVBFIHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICoKKworLyogRmxleCBkZWZpbmVzIGEgY291cGxlIG9mIGZ1bmN0aW9ucyB3aXRoIG5vIGRlY2xhcmF0aW9ucyBub3IgdGhlCitzdGF0aWMga2V5d29yZC4gRGVjbGFyZSB0aGVtIGhlcmUgdG8gYXZvaWQgYSBjb21waWxlciB3YXJuaW5nLiAqLworaW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfZ2V0X2NvbHVtbiAgKHl5c2Nhbl90IHl5c2Nhbm5lcik7Cit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X2NvbHVtbiAoaW50ICBjb2x1bW5fbm8gLCB5eXNjYW5fdCB5eXNjYW5uZXIpOworCisjbGluZSAxMTc4ICJwcm9ncmFtL2xleC55eS5jIgorCisjZGVmaW5lIElOSVRJQUwgMAorCisjaWZuZGVmIFlZX05PX1VOSVNURF9ICisvKiBTcGVjaWFsIGNhc2UgZm9yICJ1bmlzdGQuaCIsIHNpbmNlIGl0IGlzIG5vbi1BTlNJLiBXZSBpbmNsdWRlIGl0IHdheQorICogZG93biBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdXNlcidzIHNlY3Rpb24gMSB0byBoYXZlIGJlZW4gc2Nhbm5lZCBmaXJzdC4KKyAqIFRoZSB1c2VyIGhhcyBhIGNoYW5jZSB0byBvdmVycmlkZSBpdCB3aXRoIGFuIG9wdGlvbi4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgWVlfRVhUUkFfVFlQRQorI2RlZmluZSBZWV9FWFRSQV9UWVBFIHZvaWQgKgorI2VuZGlmCisKKy8qIEhvbGRzIHRoZSBlbnRpcmUgc3RhdGUgb2YgdGhlIHJlZW50cmFudCBzY2FubmVyLiAqLworc3RydWN0IHl5Z3V0c190CisgICAgeworCisgICAgLyogVXNlci1kZWZpbmVkLiBOb3QgdG91Y2hlZCBieSBmbGV4LiAqLworICAgIFlZX0VYVFJBX1RZUEUgeXlleHRyYV9yOworCisgICAgLyogVGhlIHJlc3QgYXJlIHRoZSBzYW1lIGFzIHRoZSBnbG9iYWxzIGRlY2xhcmVkIGluIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuICovCisgICAgRklMRSAqeXlpbl9yLCAqeXlvdXRfcjsKKyAgICBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX3RvcDsgLyoqPCBpbmRleCBvZiB0b3Agb2Ygc3RhY2suICovCisgICAgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja19tYXg7IC8qKjwgY2FwYWNpdHkgb2Ygc3RhY2suICovCisgICAgWVlfQlVGRkVSX1NUQVRFICogeXlfYnVmZmVyX3N0YWNrOyAvKio8IFN0YWNrIGFzIGFuIGFycmF5LiAqLworICAgIGNoYXIgeXlfaG9sZF9jaGFyOworICAgIGludCB5eV9uX2NoYXJzOworICAgIGludCB5eWxlbmdfcjsKKyAgICBjaGFyICp5eV9jX2J1Zl9wOworICAgIGludCB5eV9pbml0OworICAgIGludCB5eV9zdGFydDsKKyAgICBpbnQgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mOworICAgIGludCB5eV9zdGFydF9zdGFja19wdHI7CisgICAgaW50IHl5X3N0YXJ0X3N0YWNrX2RlcHRoOworICAgIGludCAqeXlfc3RhcnRfc3RhY2s7CisgICAgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKKyAgICBjaGFyKiB5eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCisgICAgaW50IHl5bGluZW5vX3I7CisgICAgaW50IHl5X2ZsZXhfZGVidWdfcjsKKworICAgIGNoYXIgKnl5dGV4dF9yOworICAgIGludCB5eV9tb3JlX2ZsYWc7CisgICAgaW50IHl5X21vcmVfbGVuOworCisgICAgWVlTVFlQRSAqIHl5bHZhbF9yOworCisgICAgWVlMVFlQRSAqIHl5bGxvY19yOworCisgICAgfTsgLyogZW5kIHN0cnVjdCB5eWd1dHNfdCAqLworCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKKyAgICAvKiBUaGlzIG11c3QgZ28gaGVyZSBiZWNhdXNlIFlZU1RZUEUgYW5kIFlZTFRZUEUgYXJlIGluY2x1ZGVkCisgICAgICogZnJvbSBiaXNvbiBvdXRwdXQgaW4gc2VjdGlvbiAxLiovCisgICAgIyAgICBkZWZpbmUgeXlsdmFsIHl5Zy0+eXlsdmFsX3IKKyAgICAKKyAgICAjICAgIGRlZmluZSB5eWxsb2MgeXlnLT55eWxsb2NfcgorICAgIAoraW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2luaXQgKHl5c2Nhbl90KiBzY2FubmVyKTsKKworaW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2luaXRfZXh0cmEgKFlZX0VYVFJBX1RZUEUgdXNlcl9kZWZpbmVkLHl5c2Nhbl90KiBzY2FubmVyKTsKKworLyogQWNjZXNzb3IgbWV0aG9kcyB0byBnbG9iYWxzLgorICAgVGhlc2UgYXJlIG1hZGUgdmlzaWJsZSB0byBub24tcmVlbnRyYW50IHNjYW5uZXJzIGZvciBjb252ZW5pZW5jZS4gKi8KKworaW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2Rlc3Ryb3kgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitpbnQgX21lc2FfcHJvZ3JhbV9sZXhlcl9nZXRfZGVidWcgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X2RlYnVnIChpbnQgZGVidWdfZmxhZyAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK1lZX0VYVFJBX1RZUEUgX21lc2FfcHJvZ3JhbV9sZXhlcl9nZXRfZXh0cmEgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X2V4dHJhIChZWV9FWFRSQV9UWVBFIHVzZXJfZGVmaW5lZCAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK0ZJTEUgKl9tZXNhX3Byb2dyYW1fbGV4ZXJfZ2V0X2luICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3NldF9pbiAgKEZJTEUgKiBpbl9zdHIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitGSUxFICpfbWVzYV9wcm9ncmFtX2xleGVyX2dldF9vdXQgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X291dCAgKEZJTEUgKiBvdXRfc3RyICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworaW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfZ2V0X2xlbmcgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitjaGFyICpfbWVzYV9wcm9ncmFtX2xleGVyX2dldF90ZXh0ICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworaW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfZ2V0X2xpbmVubyAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9zZXRfbGluZW5vIChpbnQgbGluZV9udW1iZXIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitZWVNUWVBFICogX21lc2FfcHJvZ3JhbV9sZXhlcl9nZXRfbHZhbCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9zZXRfbHZhbCAoWVlTVFlQRSAqIHl5bHZhbF9wYXJhbSAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKKyAgICAgICBZWUxUWVBFICpfbWVzYV9wcm9ncmFtX2xleGVyX2dldF9sbG9jICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKyAgICAKKyAgICAgICAgdm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3NldF9sbG9jIChZWUxUWVBFICogeXlsbG9jX3BhcmFtICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKyAgICAKKy8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCisgKiBzZWN0aW9uIDEuCisgKi8KKworI2lmbmRlZiBZWV9TS0lQX1lZV1JBUAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGludCBfbWVzYV9wcm9ncmFtX2xleGVyX3dyYXAgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworI2Vsc2UKK2V4dGVybiBpbnQgX21lc2FfcHJvZ3JhbV9sZXhlcl93cmFwICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYyxjaGFyICpidWZfcHRyICAseXlzY2FuX3QgeXlzY2FubmVyKTsKKyAgICAKKyNpZm5kZWYgeXl0ZXh0X3B0cgorc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyICoseXljb25zdCBjaGFyICosaW50ICx5eXNjYW5fdCB5eXNjYW5uZXIpOworI2VuZGlmCisKKyNpZmRlZiBZWV9ORUVEX1NUUkxFTgorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogLHl5c2Nhbl90IHl5c2Nhbm5lcik7CisjZW5kaWYKKworI2lmbmRlZiBZWV9OT19JTlBVVAorCisjaWZkZWYgX19jcGx1c3BsdXMKK3N0YXRpYyBpbnQgeXlpbnB1dCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisjZWxzZQorc3RhdGljIGludCBpbnB1dCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisjZW5kaWYKKworI2VuZGlmCisKKy8qIEFtb3VudCBvZiBzdHVmZiB0byBzbHVycCB1cCB3aXRoIGVhY2ggcmVhZC4gKi8KKyNpZm5kZWYgWVlfUkVBRF9CVUZfU0laRQorI2lmZGVmIF9faWE2NF9fCisvKiBPbiBJQS02NCwgdGhlIGJ1ZmZlciBzaXplIGlzIDE2aywgbm90IDhrICovCisjZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgMTYzODQKKyNlbHNlCisjZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgODE5MgorI2VuZGlmIC8qIF9faWE2NF9fICovCisjZW5kaWYKKworLyogQ29weSB3aGF0ZXZlciB0aGUgbGFzdCBydWxlIG1hdGNoZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gKi8KKyNpZm5kZWYgRUNITworLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCisgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgorICovCisjZGVmaW5lIEVDSE8gZG8geyBpZiAoZndyaXRlKCB5eXRleHQsIHl5bGVuZywgMSwgeXlvdXQgKSkge30gfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCisgKiBpcyByZXR1cm5lZCBpbiAicmVzdWx0Ii4KKyAqLworI2lmbmRlZiBZWV9JTlBVVAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlICkgXAorCQl7IFwKKwkJaW50IGMgPSAnKic7IFwKKwkJc2l6ZV90IG47IFwKKwkJZm9yICggbiA9IDA7IG4gPCBtYXhfc2l6ZSAmJiBcCisJCQkgICAgIChjID0gZ2V0YyggeXlpbiApKSAhPSBFT0YgJiYgYyAhPSAnXG4nOyArK24gKSBcCisJCQlidWZbbl0gPSAoY2hhcikgYzsgXAorCQlpZiAoIGMgPT0gJ1xuJyApIFwKKwkJCWJ1ZltuKytdID0gKGNoYXIpIGM7IFwKKwkJaWYgKCBjID09IEVPRiAmJiBmZXJyb3IoIHl5aW4gKSApIFwKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAorCQlyZXN1bHQgPSBuOyBcCisJCX0gXAorCWVsc2UgXAorCQl7IFwKKwkJZXJybm89MDsgXAorCQl3aGlsZSAoIChyZXN1bHQgPSBmcmVhZChidWYsIDEsIG1heF9zaXplLCB5eWluKSk9PTAgJiYgZmVycm9yKHl5aW4pKSBcCisJCQl7IFwKKwkJCWlmKCBlcnJubyAhPSBFSU5UUikgXAorCQkJCXsgXAorCQkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAorCQkJCWJyZWFrOyBcCisJCQkJfSBcCisJCQllcnJubz0wOyBcCisJCQljbGVhcmVycih5eWluKTsgXAorCQkJfSBcCisJCX1cCitcCisKKyNlbmRpZgorCisvKiBObyBzZW1pLWNvbG9uIGFmdGVyIHJldHVybjsgY29ycmVjdCB1c2FnZSBpcyB0byB3cml0ZSAieXl0ZXJtaW5hdGUoKTsiIC0KKyAqIHdlIGRvbid0IHdhbnQgYW4gZXh0cmEgJzsnIGFmdGVyIHRoZSAicmV0dXJuIiBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZQorICogc29tZSBjb21waWxlcnMgdG8gY29tcGxhaW4gYWJvdXQgdW5yZWFjaGFibGUgc3RhdGVtZW50cy4KKyAqLworI2lmbmRlZiB5eXRlcm1pbmF0ZQorI2RlZmluZSB5eXRlcm1pbmF0ZSgpIHJldHVybiBZWV9OVUxMCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGVudHJpZXMgYnkgd2hpY2ggc3RhcnQtY29uZGl0aW9uIHN0YWNrIGdyb3dzLiAqLworI2lmbmRlZiBZWV9TVEFSVF9TVEFDS19JTkNSCisjZGVmaW5lIFlZX1NUQVJUX1NUQUNLX0lOQ1IgMjUKKyNlbmRpZgorCisvKiBSZXBvcnQgYSBmYXRhbCBlcnJvci4gKi8KKyNpZm5kZWYgWVlfRkFUQUxfRVJST1IKKyNkZWZpbmUgWVlfRkFUQUxfRVJST1IobXNnKSB5eV9mYXRhbF9lcnJvciggbXNnICwgeXlzY2FubmVyKQorI2VuZGlmCisKKy8qIGVuZCB0YWJsZXMgc2VyaWFsaXphdGlvbiBzdHJ1Y3R1cmVzIGFuZCBwcm90b3R5cGVzICovCisKKy8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KKyAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0xfSVNfT1VSUyAxCisKK2V4dGVybiBpbnQgX21lc2FfcHJvZ3JhbV9sZXhlcl9sZXggXAorICAgICAgICAgICAgICAgKFlZU1RZUEUgKiB5eWx2YWxfcGFyYW0sWVlMVFlQRSAqIHl5bGxvY19wYXJhbSAseXlzY2FuX3QgeXlzY2FubmVyKTsKKworI2RlZmluZSBZWV9ERUNMIGludCBfbWVzYV9wcm9ncmFtX2xleGVyX2xleCBcCisgICAgICAgICAgICAgICAoWVlTVFlQRSAqIHl5bHZhbF9wYXJhbSwgWVlMVFlQRSAqIHl5bGxvY19wYXJhbSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKKyNlbmRpZiAvKiAhWVlfREVDTCAqLworCisvKiBDb2RlIGV4ZWN1dGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBydWxlLCBhZnRlciB5eXRleHQgYW5kIHl5bGVuZworICogaGF2ZSBiZWVuIHNldCB1cC4KKyAqLworI2lmbmRlZiBZWV9VU0VSX0FDVElPTgorI2RlZmluZSBZWV9VU0VSX0FDVElPTgorI2VuZGlmCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHJ1bGUuICovCisjaWZuZGVmIFlZX0JSRUFLCisjZGVmaW5lIFlZX0JSRUFLIGJyZWFrOworI2VuZGlmCisKKyNkZWZpbmUgWVlfUlVMRV9TRVRVUCBcCisJWVlfVVNFUl9BQ1RJT04KKworLyoqIFRoZSBtYWluIHNjYW5uZXIgZnVuY3Rpb24gd2hpY2ggZG9lcyBhbGwgdGhlIHdvcmsuCisgKi8KK1lZX0RFQ0wKK3sKKwlyZWdpc3RlciB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGU7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3AsICp5eV9icDsKKwlyZWdpc3RlciBpbnQgeXlfYWN0OworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKworI2xpbmUgMTcwICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKKworCisjbGluZSAxNDI3ICJwcm9ncmFtL2xleC55eS5jIgorCisgICAgeXlsdmFsID0geXlsdmFsX3BhcmFtOworCisgICAgeXlsbG9jID0geXlsbG9jX3BhcmFtOworCisJaWYgKCAheXlnLT55eV9pbml0ICkKKwkJeworCQl5eWctPnl5X2luaXQgPSAxOworCisjaWZkZWYgWVlfVVNFUl9JTklUCisJCVlZX1VTRVJfSU5JVDsKKyNlbmRpZgorCisJCWlmICggISB5eWctPnl5X3N0YXJ0ICkKKwkJCXl5Zy0+eXlfc3RhcnQgPSAxOwkvKiBmaXJzdCBzdGFydCBzdGF0ZSAqLworCisJCWlmICggISB5eWluICkKKwkJCXl5aW4gPSBzdGRpbjsKKworCQlpZiAoICEgeXlvdXQgKQorCQkJeXlvdXQgPSBzdGRvdXQ7CisKKwkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICkgeworCQkJX21lc2FfcHJvZ3JhbV9sZXhlcl9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKwkJCQlfbWVzYV9wcm9ncmFtX2xleGVyX19jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUgLHl5c2Nhbm5lcik7CisJCX0KKworCQlfbWVzYV9wcm9ncmFtX2xleGVyX19sb2FkX2J1ZmZlcl9zdGF0ZSh5eXNjYW5uZXIgKTsKKwkJfQorCisJd2hpbGUgKCAxICkJCS8qIGxvb3BzIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgKi8KKwkJeworCQl5eV9jcCA9IHl5Zy0+eXlfY19idWZfcDsKKworCQkvKiBTdXBwb3J0IG9mIHl5dGV4dC4gKi8KKwkJKnl5X2NwID0geXlnLT55eV9ob2xkX2NoYXI7CisKKwkJLyogeXlfYnAgcG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBpbiB5eV9jaF9idWYgb2YgdGhlIHN0YXJ0IG9mCisJCSAqIHRoZSBjdXJyZW50IHJ1bi4KKwkJICovCisJCXl5X2JwID0geXlfY3A7CisKKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5Zy0+eXlfc3RhcnQ7Cit5eV9tYXRjaDoKKwkJZG8KKwkJCXsKKwkJCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldOworCQkJaWYgKCB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV0gKQorCQkJCXsKKwkJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MgPSB5eV9jcDsKKwkJCQl9CisJCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCisJCQkJeworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07CisJCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDg1MCApCisJCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJCX0KKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJKyt5eV9jcDsKKwkJCX0KKwkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDEzMDAgKTsKKworeXlfZmluZF9hY3Rpb246CisJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKKwkJaWYgKCB5eV9hY3QgPT0gMCApCisJCQl7IC8qIGhhdmUgdG8gYmFjayB1cCAqLworCQkJeXlfY3AgPSB5eWctPnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7CisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlnLT55eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKKwkJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKKwkJCX0KKworCQlZWV9ET19CRUZPUkVfQUNUSU9OOworCitkb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KKworCQlzd2l0Y2ggKCB5eV9hY3QgKQorCXsgLyogYmVnaW5uaW5nIG9mIGFjdGlvbiBzd2l0Y2ggKi8KKwkJCWNhc2UgMDogLyogbXVzdCBiYWNrIHVwICovCisJCQkvKiB1bmRvIHRoZSBlZmZlY3RzIG9mIFlZX0RPX0JFRk9SRV9BQ1RJT04gKi8KKwkJCSp5eV9jcCA9IHl5Zy0+eXlfaG9sZF9jaGFyOworCQkJeXlfY3AgPSB5eWctPnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7CisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlnLT55eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKKwkJCWdvdG8geXlfZmluZF9hY3Rpb247CisKK2Nhc2UgMToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE3MiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBBUkJ2cF8xMDsgfQorCVlZX0JSRUFLCitjYXNlIDI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAxNzMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gQVJCZnBfMTA7IH0KKwlZWV9CUkVBSworY2FzZSAzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTc0ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+aW50ZWdlciA9IGF0X2FkZHJlc3M7CisgICByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl92cCwgQUREUkVTUyk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgNDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE3OCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBBTElBUzsgfQorCVlZX0JSRUFLCitjYXNlIDU6CitZWV9SVUxFX1NFVFVQCisjbGluZSAxNzkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gQVRUUklCOyB9CisJWVlfQlJFQUsKK2Nhc2UgNjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE4MCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBFTkQ7IH0KKwlZWV9CUkVBSworY2FzZSA3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTgxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIE9QVElPTjsgfQorCVlZX0JSRUFLCitjYXNlIDg6CitZWV9SVUxFX1NFVFVQCisjbGluZSAxODIgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gT1VUUFVUOyB9CisJWVlfQlJFQUsKK2Nhc2UgOToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE4MyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBQQVJBTTsgfQorCVlZX0JSRUFLCitjYXNlIDEwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTg0ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgeXlsdmFsLT5pbnRlZ2VyID0gYXRfdGVtcDsgcmV0dXJuIFRFTVA7IH0KKwlZWV9CUkVBSworY2FzZSAxMToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE4NiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIFZFQ1RPUl9PUCwgQUJTLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTg3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBBREQsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM6CitZWV9SVUxFX1NFVFVQCisjbGluZSAxODggInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfQVJCX3ZwLCBBUkwsIEFSTCwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAxNDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE5MCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfZnAsIFRSSV9PUCwgQ01QLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDE1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTkxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl9mcCwgU0NBTEFSX09QLCBDT1MsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTY6CitZWV9SVUxFX1NFVFVQCisjbGluZSAxOTMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBWRUNUT1JfT1AsIEREWCwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAxNzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE5NCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFZFQ1RPUl9PUCwgRERZLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDE4OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTk1ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBEUDMsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTk6CitZWV9SVUxFX1NFVFVQCisjbGluZSAxOTYgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5fT1AsIERQNCwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAyMDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDE5NyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIEJJTl9PUCwgRFBILCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDIxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTk4ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBEU1QsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMjI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMDAgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBTQ0FMQVJfT1AsIEVYMiwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAyMzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIwMSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfdnAsIFNDQUxBUl9PUCwgRVhQLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDI0OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjAzICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgVkVDVE9SX09QLCBGTFIsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMjU6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMDQgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBWRUNUT1JfT1AsIEZSQywgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAyNjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIwNiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfZnAsIEtJTCwgS0lMLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDI3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjA4ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgVkVDVE9SX09QLCBMSVQsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMjg6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMDkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBTQ0FMQVJfT1AsIExHMiwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAyOToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIxMCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfdnAsIFNDQUxBUl9PUCwgTE9HLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDMwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjExICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl9mcCwgVFJJX09QLCBMUlAsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMzE6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMTMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBUUklfT1AsIE1BRCwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAzMjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIxNCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIEJJTl9PUCwgTUFYLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDMzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjE1ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBNSU4sIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMzQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMTYgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBWRUNUT1JfT1AsIE1PViwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSAzNToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIxNyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIEJJTl9PUCwgTVVMLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDM2OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjE5ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgVkVDVE9SX09QLCBQSzJILCA0KTsgfQorCVlZX0JSRUFLCitjYXNlIDM3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjIwICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgVkVDVE9SX09QLCBQSzJVUywgNSk7IH0KKwlZWV9CUkVBSworY2FzZSAzODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIyMSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFZFQ1RPUl9PUCwgUEs0QiwgNCk7IH0KKwlZWV9CUkVBSworY2FzZSAzOToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIyMiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFZFQ1RPUl9PUCwgUEs0VUIsIDUpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNDA6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMjMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5TQ19PUCwgUE9XLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDQxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjI1ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgU0NBTEFSX09QLCBSQ1AsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNDI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMjYgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBCSU5fT1AsICAgIFJGTCwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSA0MzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIyNyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIFNDQUxBUl9PUCwgUlNRLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDQ0OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjI5ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl9mcCwgU0NBTEFSX09QLCBTQ1MsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNDU6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMzAgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBCSU5fT1AsIFNFUSwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSA0NjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIzMSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIEJJTl9PUCwgU0ZMLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDQ3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjMyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBTR0UsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNDg6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMzMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBCSU5fT1AsIFNHVCwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSA0OToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIzNCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfZnAsIFNDQUxBUl9PUCwgU0lOLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDUwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjM1ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgQklOX09QLCBTTEUsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNTE6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMzYgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5fT1AsIFNMVCwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSA1MjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDIzNyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIEJJTl9PUCwgU05FLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDUzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjM4ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgQklOX09QLCBTVFIsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNTQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyMzkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5fT1AsIFNVQiwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSA1NToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI0MCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIFNXWiwgU1daLCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDU2OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjQyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl9mcCwgU0FNUExFX09QLCBURVgsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNTc6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNDMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfQVJCX2ZwLCBTQU1QTEVfT1AsIFRYQiwgMyk7IH0KKwlZWV9CUkVBSworY2FzZSA1ODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI0NCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFRYRF9PUCwgVFhELCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDU5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjQ1ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl9mcCwgU0FNUExFX09QLCBUWFAsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNjA6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNDcgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBTQ0FMQVJfT1AsIFVQMkgsIDQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNjE6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNDggInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBTQ0FMQVJfT1AsIFVQMlVTLCA1KTsgfQorCVlZX0JSRUFLCitjYXNlIDYyOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjQ5ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgU0NBTEFSX09QLCBVUDRCLCA0KTsgfQorCVlZX0JSRUFLCitjYXNlIDYzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjUwICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgU0NBTEFSX09QLCBVUDRVQiwgNSk7IH0KKwlZWV9CUkVBSworY2FzZSA2NDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI1MiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFRSSV9PUCwgWDJELCAzKTsgfQorCVlZX0JSRUFLCitjYXNlIDY1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjUzICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBYUEQsIDMpOyB9CisJWVlfQlJFQUsKK2Nhc2UgNjY6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNTUgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl92cCwgVkVSVEVYKTsgfQorCVlZX0JSRUFLCitjYXNlIDY3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjU2ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAsIEZSQUdNRU5UKTsgfQorCVlZX0JSRUFLCitjYXNlIDY4OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjU3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIFBST0dSQU07IH0KKwlZWV9CUkVBSworY2FzZSA2OToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI1OCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBTVEFURTsgfQorCVlZX0JSRUFLCitjYXNlIDcwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjU5ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIFJFU1VMVDsgfQorCVlZX0JSRUFLCitjYXNlIDcxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjYxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIEFNQklFTlQ7IH0KKwlZWV9CUkVBSworY2FzZSA3MjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI2MiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBBVFRFTlVBVElPTjsgfQorCVlZX0JSRUFLCitjYXNlIDczOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjYzICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIEJBQ0s7IH0KKwlZWV9CUkVBSworY2FzZSA3NDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI2NCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfdnAsIENMSVApOyB9CisJWVlfQlJFQUsKK2Nhc2UgNzU6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNjUgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gQ09MT1I7IH0KKwlZWV9CUkVBSworY2FzZSA3NjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI2NiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfZnAsIERFUFRIKTsgfQorCVlZX0JSRUFLCitjYXNlIDc3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjY3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIERJRkZVU0U7IH0KKwlZWV9CUkVBSworY2FzZSA3ODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI2OCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBESVJFQ1RJT047IH0KKwlZWV9CUkVBSworY2FzZSA3OToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI2OSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBFTUlTU0lPTjsgfQorCVlZX0JSRUFLCitjYXNlIDgwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjcwICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIEVOVjsgfQorCVlZX0JSRUFLCitjYXNlIDgxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjcxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIEVZRTsgfQorCVlZX0JSRUFLCitjYXNlIDgyOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjcyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIEZPR0NPT1JEOyB9CisJWVlfQlJFQUsKK2Nhc2UgODM6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNzMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gRk9HOyB9CisJWVlfQlJFQUsKK2Nhc2UgODQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNzQgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gRlJPTlQ7IH0KKwlZWV9CUkVBSworY2FzZSA4NToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI3NSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBIQUxGOyB9CisJWVlfQlJFQUsKK2Nhc2UgODY6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNzYgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gSU5WRVJTRTsgfQorCVlZX0JSRUFLCitjYXNlIDg3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjc3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIElOVlRSQU5TOyB9CisJWVlfQlJFQUsKK2Nhc2UgODg6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyNzggInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gTElHSFQ7IH0KKwlZWV9CUkVBSworY2FzZSA4OToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI3OSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBMSUdIVE1PREVMOyB9CisJWVlfQlJFQUsKK2Nhc2UgOTA6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyODAgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gTElHSFRQUk9EOyB9CisJWVlfQlJFQUsKK2Nhc2UgOTE6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyODEgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gTE9DQUw7IH0KKwlZWV9CUkVBSworY2FzZSA5MjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI4MiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBNQVRFUklBTDsgfQorCVlZX0JSRUFLCitjYXNlIDkzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjgzICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIE1BVF9QUk9HUkFNOyB9CisJWVlfQlJFQUsKK2Nhc2UgOTQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyODQgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gTUFUUklYOyB9CisJWVlfQlJFQUsKK2Nhc2UgOTU6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyODUgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBNQVRSSVhJTkRFWCk7IH0KKwlZWV9CUkVBSworY2FzZSA5NjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI4NiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBNT0RFTFZJRVc7IH0KKwlZWV9CUkVBSworY2FzZSA5NzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI4NyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBNVlA7IH0KKwlZWV9CUkVBSworY2FzZSA5ODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI4OCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfdnAsIE5PUk1BTCk7IH0KKwlZWV9CUkVBSworY2FzZSA5OToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI4OSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBPQkpFQ1Q7IH0KKwlZWV9CUkVBSworY2FzZSAxMDA6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyOTAgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gUEFMRVRURTsgfQorCVlZX0JSRUFLCitjYXNlIDEwMToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI5MSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBQQVJBTVM7IH0KKwlZWV9CUkVBSworY2FzZSAxMDI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyOTIgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gUExBTkU7IH0KKwlZWV9CUkVBSworY2FzZSAxMDM6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyOTMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBQT0lOVF9UT0spOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTA0OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjk0ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl92cCwgUE9JTlRTSVpFKTsgfQorCVlZX0JSRUFLCitjYXNlIDEwNToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI5NSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBQT1NJVElPTjsgfQorCVlZX0JSRUFLCitjYXNlIDEwNjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI5NiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBQUklNQVJZOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTA3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMjk3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIFBST0pFQ1RJT047IH0KKwlZWV9CUkVBSworY2FzZSAxMDg6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyOTggInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBSQU5HRSk7IH0KKwlZWV9CUkVBSworY2FzZSAxMDk6CitZWV9SVUxFX1NFVFVQCisjbGluZSAyOTkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gUk9XOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTEwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzAwICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIFNDRU5FQ09MT1I7IH0KKwlZWV9CUkVBSworY2FzZSAxMTE6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMDEgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gU0VDT05EQVJZOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTEyOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzAyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIFNISU5JTkVTUzsgfQorCVlZX0JSRUFLCitjYXNlIDExMzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMwMyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfdnAsIFNJWkVfVE9LKTsgfQorCVlZX0JSRUFLCitjYXNlIDExNDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMwNCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBTUEVDVUxBUjsgfQorCVlZX0JSRUFLCitjYXNlIDExNToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMwNSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBTUE9UOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTE2OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzA2ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIFRFWENPT1JEOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTE3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzA3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl9mcCwgVEVYRU5WKTsgfQorCVlZX0JSRUFLCitjYXNlIDExODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMwOCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfdnAsIFRFWEdFTik7IH0KKwlZWV9CUkVBSworY2FzZSAxMTk6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMDkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBURVhHRU5fUSk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjA6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMTAgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBURVhHRU5fUyk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjE6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMTEgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBURVhHRU5fVCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMTIgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gVEVYVFVSRTsgfQorCVlZX0JSRUFLCitjYXNlIDEyMzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMxMyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBUUkFOU1BPU0U7IH0KKwlZWV9CUkVBSworY2FzZSAxMjQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMTQgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBWVFhBVFRSSUIpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTI1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzE1ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl92cCwgV0VJR0hUKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyNjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMxNyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKHJlcXVpcmVfQVJCX2ZwLCBURVhUVVJFX1VOSVQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTI3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzE4ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAsIFRFWF8xRCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMjg6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMTkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCwgVEVYXzJEKTsgfQorCVlZX0JSRUFLCitjYXNlIDEyOToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMyMCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKHJlcXVpcmVfQVJCX2ZwLCBURVhfM0QpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTMwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzIxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAsIFRFWF9DVUJFKTsgfQorCVlZX0JSRUFLCitjYXNlIDEzMToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMyMiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKHJlcXVpcmVfQVJCX2ZwICYmIHJlcXVpcmVfcmVjdCwgVEVYX1JFQ1QpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTMyOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzIzICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAgJiYgcmVxdWlyZV9zaGFkb3csIFRFWF9TSEFET1cxRCk7IH0KKwlZWV9CUkVBSworY2FzZSAxMzM6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMjQgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCAmJiByZXF1aXJlX3NoYWRvdywgVEVYX1NIQURPVzJEKTsgfQorCVlZX0JSRUFLCitjYXNlIDEzNDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMyNSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKHJlcXVpcmVfQVJCX2ZwICYmIHJlcXVpcmVfc2hhZG93ICYmIHJlcXVpcmVfcmVjdCwgVEVYX1NIQURPV1JFQ1QpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzI2ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAgJiYgcmVxdWlyZV90ZXhhcnJheSwgVEVYX0FSUkFZMUQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM2OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzI3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAgJiYgcmVxdWlyZV90ZXhhcnJheSwgVEVYX0FSUkFZMkQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzI4ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAgJiYgcmVxdWlyZV9zaGFkb3cgJiYgcmVxdWlyZV90ZXhhcnJheSwgVEVYX0FSUkFZU0hBRE9XMUQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM4OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzI5ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAgJiYgcmVxdWlyZV9zaGFkb3cgJiYgcmVxdWlyZV90ZXhhcnJheSwgVEVYX0FSUkFZU0hBRE9XMkQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzMxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIGhhbmRsZV9pZGVudCh5eWV4dHJhLCB5eXRleHQsIHl5bHZhbCk7IH0KKwlZWV9CUkVBSworY2FzZSAxNDA6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMzMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreyByZXR1cm4gRE9UX0RPVDsgfQorCVlZX0JSRUFLCitjYXNlIDE0MToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMzNSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7CisgICB5eWx2YWwtPmludGVnZXIgPSBzdHJ0b2woeXl0ZXh0LCBOVUxMLCAxMCk7CisgICByZXR1cm4gSU5URUdFUjsKK30KKwlZWV9CUkVBSworY2FzZSAxNDI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMzkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreworICAgeXlsdmFsLT5yZWFsID0gX21lc2Ffc3RydG9mKHl5dGV4dCwgTlVMTCk7CisgICByZXR1cm4gUkVBTDsKK30KKwlZWV9CUkVBSworY2FzZSAxNDM6CisvKiBydWxlIDE0MyBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSB5eWctPnl5X2hvbGRfY2hhcjsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgeXl0ZXh0ICovCit5eWctPnl5X2NfYnVmX3AgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHl5dGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAorI2xpbmUgMzQzICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+cmVhbCA9IF9tZXNhX3N0cnRvZih5eXRleHQsIE5VTEwpOworICAgcmV0dXJuIFJFQUw7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTQ0OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzQ3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+cmVhbCA9IF9tZXNhX3N0cnRvZih5eXRleHQsIE5VTEwpOworICAgcmV0dXJuIFJFQUw7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTQ1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzUxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+cmVhbCA9IF9tZXNhX3N0cnRvZih5eXRleHQsIE5VTEwpOworICAgcmV0dXJuIFJFQUw7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTQ2OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzU2ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICByZXR1cm4gTUFTSzQ7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTQ3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzYyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19YWQorICAgICAgfCBtYXNrX2Zyb21fY2hhcih5eXRleHRbM10pOworICAgcmV0dXJuIE1BU0szOworfQorCVlZX0JSRUFLCitjYXNlIDE0ODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM2OCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7CisgICB5eWx2YWwtPnN3aXpfbWFzay5zd2l6emxlID0gU1dJWlpMRV9JTlZBTDsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBXUklURU1BU0tfWFpXOworICAgcmV0dXJuIE1BU0szOworfQorCVlZX0JSRUFLCitjYXNlIDE0OToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM3MyAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7CisgICB5eWx2YWwtPnN3aXpfbWFzay5zd2l6emxlID0gU1dJWlpMRV9JTlZBTDsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBXUklURU1BU0tfWVpXOworICAgcmV0dXJuIE1BU0szOworfQorCVlZX0JSRUFLCitjYXNlIDE1MDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM3OSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7CisgICB5eWx2YWwtPnN3aXpfbWFzay5zd2l6emxlID0gU1dJWlpMRV9JTlZBTDsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBXUklURU1BU0tfWAorICAgICAgfCBtYXNrX2Zyb21fY2hhcih5eXRleHRbMl0pOworICAgcmV0dXJuIE1BU0syOworfQorCVlZX0JSRUFLCitjYXNlIDE1MToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM4NSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7CisgICB5eWx2YWwtPnN3aXpfbWFzay5zd2l6emxlID0gU1dJWlpMRV9JTlZBTDsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBXUklURU1BU0tfWQorICAgICAgfCBtYXNrX2Zyb21fY2hhcih5eXRleHRbMl0pOworICAgcmV0dXJuIE1BU0syOworfQorCVlZX0JSRUFLCitjYXNlIDE1MjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM5MSAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7CisgICB5eWx2YWwtPnN3aXpfbWFzay5zd2l6emxlID0gU1dJWlpMRV9JTlZBTDsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBXUklURU1BU0tfWlc7CisgICByZXR1cm4gTUFTSzI7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTUzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzk3ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIGNvbnN0IHVuc2lnbmVkIHMgPSBzd2l6X2Zyb21fY2hhcih5eXRleHRbMV0pOworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IE1BS0VfU1dJWlpMRTQocywgcywgcywgcyk7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gbWFza19mcm9tX2NoYXIoeXl0ZXh0WzFdKTsKKyAgIHJldHVybiBNQVNLMTsgCit9CisJWVlfQlJFQUsKK2Nhc2UgMTU0OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDA0ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBNQUtFX1NXSVpaTEU0KHN3aXpfZnJvbV9jaGFyKHl5dGV4dFsxXSksCisJCQkJCSAgICBzd2l6X2Zyb21fY2hhcih5eXRleHRbMl0pLAorCQkJCQkgICAgc3dpel9mcm9tX2NoYXIoeXl0ZXh0WzNdKSwKKwkJCQkJICAgIHN3aXpfZnJvbV9jaGFyKHl5dGV4dFs0XSkpOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IDA7CisgICByZXR1cm4gU1dJWlpMRTsKK30KKwlZWV9CUkVBSworY2FzZSAxNTU6CitZWV9SVUxFX1NFVFVQCisjbGluZSA0MTMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBXUklURU1BU0tfWFlaVzsKKyAgIHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfZnAsIE1BU0s0KTsKK30KKwlZWV9CUkVBSworY2FzZSAxNTY6CitZWV9SVUxFX1NFVFVQCisjbGluZSA0MTkgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1hZCisgICAgICB8IG1hc2tfZnJvbV9jaGFyKHl5dGV4dFszXSk7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMyk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTU3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDI1ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19YWlc7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMyk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTU4OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDMwICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19ZWlc7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMyk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTU5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDM2ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19YCisgICAgICB8IG1hc2tfZnJvbV9jaGFyKHl5dGV4dFsyXSk7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMik7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTYwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDQyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19ZCisgICAgICB8IG1hc2tfZnJvbV9jaGFyKHl5dGV4dFsyXSk7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMik7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTYxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDQ4ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19aVzsKKyAgIHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfZnAsIE1BU0syKTsKK30KKwlZWV9CUkVBSworY2FzZSAxNjI6CitZWV9SVUxFX1NFVFVQCisjbGluZSA0NTQgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreworICAgY29uc3QgdW5zaWduZWQgcyA9IHN3aXpfZnJvbV9jaGFyKHl5dGV4dFsxXSk7CisgICB5eWx2YWwtPnN3aXpfbWFzay5zd2l6emxlID0gTUFLRV9TV0laWkxFNChzLCBzLCBzLCBzKTsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBtYXNrX2Zyb21fY2hhcih5eXRleHRbMV0pOworICAgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl9mcCwgTUFTSzEpOworfQorCVlZX0JSRUFLCitjYXNlIDE2MzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDQ2MiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7CisgICBpZiAocmVxdWlyZV9BUkJfdnApIHsKKyAgICAgIHJldHVybiBURVhHRU5fUjsKKyAgIH0gZWxzZSB7CisgICAgICB5eWx2YWwtPnN3aXpfbWFzay5zd2l6emxlID0gTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWCwKKwkJCQkJCVNXSVpaTEVfWCwgU1dJWlpMRV9YKTsKKyAgICAgIHl5bHZhbC0+c3dpel9tYXNrLm1hc2sgPSBXUklURU1BU0tfWDsKKyAgICAgIHJldHVybiBNQVNLMTsKKyAgIH0KK30KKwlZWV9CUkVBSworY2FzZSAxNjQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSA0NzMgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IE1BS0VfU1dJWlpMRTQoc3dpel9mcm9tX2NoYXIoeXl0ZXh0WzFdKSwKKwkJCQkJICAgIHN3aXpfZnJvbV9jaGFyKHl5dGV4dFsyXSksCisJCQkJCSAgICBzd2l6X2Zyb21fY2hhcih5eXRleHRbM10pLAorCQkJCQkgICAgc3dpel9mcm9tX2NoYXIoeXl0ZXh0WzRdKSk7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gMDsKKyAgIHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfZnAsIFNXSVpaTEUpOworfQorCVlZX0JSRUFLCitjYXNlIDE2NToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDQ4MiAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCit7IHJldHVybiBET1Q7IH0KKwlZWV9CUkVBSworY2FzZSAxNjY6CisvKiBydWxlIDE2NiBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCisjbGluZSA0ODQgInByb2dyYW0vcHJvZ3JhbV9sZXhlci5sIgoreworICAgeXlsbG9jLT5maXJzdF9saW5lKys7CisgICB5eWxsb2MtPmZpcnN0X2NvbHVtbiA9IDE7CisgICB5eWxsb2MtPmxhc3RfbGluZSsrOworICAgeXlsbG9jLT5sYXN0X2NvbHVtbiA9IDE7CisgICB5eWxsb2MtPnBvc2l0aW9uKys7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMTY3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDkxICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKKy8qIGVhdCB3aGl0ZXNwYWNlICovIDsKKwlZWV9CUkVBSworY2FzZSAxNjg6CisqeXlfY3AgPSB5eWctPnl5X2hvbGRfY2hhcjsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgeXl0ZXh0ICovCit5eWctPnl5X2NfYnVmX3AgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHl5dGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAorI2xpbmUgNDkyICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKKy8qIGVhdCBjb21tZW50cyAqLyA7CisJWVlfQlJFQUsKK2Nhc2UgMTY5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNDkzICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKK3sgcmV0dXJuIHl5dGV4dFswXTsgfQorCVlZX0JSRUFLCitjYXNlIDE3MDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDQ5NCAicHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwiCitFQ0hPOworCVlZX0JSRUFLCisjbGluZSAyNDkxICJwcm9ncmFtL2xleC55eS5jIgorY2FzZSBZWV9TVEFURV9FT0YoSU5JVElBTCk6CisJeXl0ZXJtaW5hdGUoKTsKKworCWNhc2UgWVlfRU5EX09GX0JVRkZFUjoKKwkJeworCQkvKiBBbW91bnQgb2YgdGV4dCBtYXRjaGVkIG5vdCBpbmNsdWRpbmcgdGhlIEVPQiBjaGFyLiAqLworCQlpbnQgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dCA9IChpbnQpICh5eV9jcCAtIHl5Zy0+eXl0ZXh0X3B0cikgLSAxOworCisJCS8qIFVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTi4gKi8KKwkJKnl5X2NwID0geXlnLT55eV9ob2xkX2NoYXI7CisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKKworCQlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfTkVXICkKKwkJCXsKKwkJCS8qIFdlJ3JlIHNjYW5uaW5nIGEgbmV3IGZpbGUgb3IgaW5wdXQgc291cmNlLiAgSXQncworCQkJICogcG9zc2libGUgdGhhdCB0aGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHVzZXIKKwkJCSAqIGp1c3QgcG9pbnRlZCB5eWluIGF0IGEgbmV3IHNvdXJjZSBhbmQgY2FsbGVkCisJCQkgKiBfbWVzYV9wcm9ncmFtX2xleGVyX2xleCgpLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBhc3N1cmUKKwkJCSAqIGNvbnNpc3RlbmN5IGJldHdlZW4gWVlfQ1VSUkVOVF9CVUZGRVIgYW5kIG91cgorCQkJICogZ2xvYmFscy4gIEhlcmUgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGRvIHNvLCBiZWNhdXNlCisJCQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBhY3Rpb24gKG90aGVyIHRoYW4gcG9zc2libHkgYQorCQkJICogYmFjay11cCkgdGhhdCB3aWxsIG1hdGNoIGZvciB0aGUgbmV3IGlucHV0IHNvdXJjZS4KKwkJCSAqLworCQkJeXlnLT55eV9uX2NoYXJzID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlID0geXlpbjsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9OT1JNQUw7CisJCQl9CisKKwkJLyogTm90ZSB0aGF0IGhlcmUgd2UgdGVzdCBmb3IgeXlfY19idWZfcCAiPD0iIHRvIHRoZSBwb3NpdGlvbgorCQkgKiBvZiB0aGUgZmlyc3QgRU9CIGluIHRoZSBidWZmZXIsIHNpbmNlIHl5X2NfYnVmX3Agd2lsbAorCQkgKiBhbHJlYWR5IGhhdmUgYmVlbiBpbmNyZW1lbnRlZCBwYXN0IHRoZSBOVUwgY2hhcmFjdGVyCisJCSAqIChzaW5jZSBhbGwgc3RhdGVzIG1ha2UgdHJhbnNpdGlvbnMgb24gRU9CIHRvIHRoZQorCQkgKiBlbmQtb2YtYnVmZmVyIHN0YXRlKS4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUgdGVzdAorCQkgKiBpbiBpbnB1dCgpLgorCQkgKi8KKwkJaWYgKCB5eWctPnl5X2NfYnVmX3AgPD0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFyc10gKQorCQkJeyAvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCisJCQl5eV9zdGF0ZV90eXBlIHl5X25leHRfc3RhdGU7CisKKwkJCXl5Zy0+eXlfY19idWZfcCA9IHl5Zy0+eXl0ZXh0X3B0ciArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoIHl5c2Nhbm5lciApOworCisJCQkvKiBPa2F5LCB3ZSdyZSBub3cgcG9zaXRpb25lZCB0byBtYWtlIHRoZSBOVUwKKwkJCSAqIHRyYW5zaXRpb24uICBXZSBjb3VsZG4ndCBoYXZlCisJCQkgKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKSBnbyBhaGVhZCBhbmQgZG8gaXQKKwkJCSAqIGZvciB1cyBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgdG8gZGVhbAorCQkJICogd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgamFtbWluZyAoYW5kIHdlIGRvbid0CisJCQkgKiB3YW50IHRvIGJ1aWxkIGphbW1pbmcgaW50byBpdCBiZWNhdXNlIHRoZW4gaXQKKwkJCSAqIHdpbGwgcnVuIG1vcmUgc2xvd2x5KS4KKwkJCSAqLworCisJCQl5eV9uZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggeXlfY3VycmVudF9zdGF0ZSAsIHl5c2Nhbm5lcik7CisKKwkJCXl5X2JwID0geXlnLT55eXRleHRfcHRyICsgWVlfTU9SRV9BREo7CisKKwkJCWlmICggeXlfbmV4dF9zdGF0ZSApCisJCQkJeworCQkJCS8qIENvbnN1bWUgdGhlIE5VTC4gKi8KKwkJCQl5eV9jcCA9ICsreXlnLT55eV9jX2J1Zl9wOworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9uZXh0X3N0YXRlOworCQkJCWdvdG8geXlfbWF0Y2g7CisJCQkJfQorCisJCQllbHNlCisJCQkJeworCQkJCXl5X2NwID0geXlnLT55eV9jX2J1Zl9wOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQkJfQorCQkJfQorCisJCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCB5eXNjYW5uZXIgKSApCisJCQl7CisJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJeworCQkJCXl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mID0gMDsKKworCQkJCWlmICggX21lc2FfcHJvZ3JhbV9sZXhlcl93cmFwKHl5c2Nhbm5lciApICkKKwkJCQkJeworCQkJCQkvKiBOb3RlOiBiZWNhdXNlIHdlJ3ZlIHRha2VuIGNhcmUgaW4KKwkJCQkJICogeXlfZ2V0X25leHRfYnVmZmVyKCkgdG8gaGF2ZSBzZXQgdXAKKwkJCQkJICogeXl0ZXh0LCB3ZSBjYW4gbm93IHNldCB1cAorCQkJCQkgKiB5eV9jX2J1Zl9wIHNvIHRoYXQgaWYgc29tZSB0b3RhbAorCQkJCQkgKiBob3NlciAobGlrZSBmbGV4IGl0c2VsZikgd2FudHMgdG8KKwkJCQkJICogY2FsbCB0aGUgc2Nhbm5lciBhZnRlciB3ZSByZXR1cm4gdGhlCisJCQkJCSAqIFlZX05VTEwsIGl0J2xsIHN0aWxsIHdvcmsgLSBhbm90aGVyCisJCQkJCSAqIFlZX05VTEwgd2lsbCBnZXQgcmV0dXJuZWQuCisJCQkJCSAqLworCQkJCQl5eWctPnl5X2NfYnVmX3AgPSB5eWctPnl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKworCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOworCQkJCQlnb3RvIGRvX2FjdGlvbjsKKwkJCQkJfQorCisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggISB5eWctPnl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiApCisJCQkJCQlZWV9ORVdfRklMRTsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46CisJCQkJeXlnLT55eV9jX2J1Zl9wID0KKwkJCQkJeXlnLT55eXRleHRfcHRyICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoIHl5c2Nhbm5lciApOworCisJCQkJeXlfY3AgPSB5eWctPnl5X2NfYnVmX3A7CisJCQkJeXlfYnAgPSB5eWctPnl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X21hdGNoOworCisJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQl5eWctPnl5X2NfYnVmX3AgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnNdOworCisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggeXlzY2FubmVyICk7CisKKwkJCQl5eV9jcCA9IHl5Zy0+eXlfY19idWZfcDsKKwkJCQl5eV9icCA9IHl5Zy0+eXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQl9CisJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlZWV9GQVRBTF9FUlJPUigKKwkJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLW5vIGFjdGlvbiBmb3VuZCIgKTsKKwl9IC8qIGVuZCBvZiBhY3Rpb24gc3dpdGNoICovCisJCX0gLyogZW5kIG9mIHNjYW5uaW5nIG9uZSB0b2tlbiAqLworfSAvKiBlbmQgb2YgX21lc2FfcHJvZ3JhbV9sZXhlcl9sZXggKi8KKworLyogeXlfZ2V0X25leHRfYnVmZmVyIC0gdHJ5IHRvIHJlYWQgaW4gYSBuZXcgYnVmZmVyCisgKgorICogUmV0dXJucyBhIGNvZGUgcmVwcmVzZW50aW5nIGFuIGFjdGlvbjoKKyAqCUVPQl9BQ1RfTEFTVF9NQVRDSCAtCisgKglFT0JfQUNUX0NPTlRJTlVFX1NDQU4gLSBjb250aW51ZSBzY2FubmluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24KKyAqCUVPQl9BQ1RfRU5EX09GX0ZJTEUgLSBlbmQgb2YgZmlsZQorICovCitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKwlyZWdpc3RlciBjaGFyICpkZXN0ID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWY7CisJcmVnaXN0ZXIgY2hhciAqc291cmNlID0geXlnLT55eXRleHRfcHRyOworCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSwgaTsKKwlpbnQgcmV0X3ZhbDsKKworCWlmICggeXlnLT55eV9jX2J1Zl9wID4gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFycyArIDFdICkKKwkJWVlfRkFUQUxfRVJST1IoCisJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2ZpbGxfYnVmZmVyID09IDAgKQorCQl7IC8qIERvbid0IHRyeSB0byBmaWxsIHRoZSBidWZmZXIsIHNvIHRoaXMgaXMgYW4gRU9GLiAqLworCQlpZiAoIHl5Zy0+eXlfY19idWZfcCAtIHl5Zy0+eXl0ZXh0X3B0ciAtIFlZX01PUkVfQURKID09IDEgKQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIHRoZSBFT0IsIHNvCisJCQkgKiB0cmVhdCB0aGlzIGFzIGEgZmluYWwgRU9GLgorCQkJICovCisJCQlyZXR1cm4gRU9CX0FDVF9FTkRfT0ZfRklMRTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQkvKiBXZSBtYXRjaGVkIHNvbWUgdGV4dCBwcmlvciB0byB0aGUgRU9CLCBmaXJzdAorCQkJICogcHJvY2VzcyBpdC4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfTEFTVF9NQVRDSDsKKwkJCX0KKwkJfQorCisJLyogVHJ5IHRvIHJlYWQgbW9yZSBkYXRhLiAqLworCisJLyogRmlyc3QgbW92ZSBsYXN0IGNoYXJzIHRvIHN0YXJ0IG9mIGJ1ZmZlci4gKi8KKwludW1iZXJfdG9fbW92ZSA9IChpbnQpICh5eWctPnl5X2NfYnVmX3AgLSB5eWctPnl5dGV4dF9wdHIpIC0gMTsKKworCWZvciAoIGkgPSAwOyBpIDwgbnVtYmVyX3RvX21vdmU7ICsraSApCisJCSooZGVzdCsrKSA9ICooc291cmNlKyspOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX0VPRl9QRU5ESU5HICkKKwkJLyogZG9uJ3QgZG8gdGhlIHJlYWQsIGl0J3Mgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGFuIEVPRiwKKwkJICoganVzdCBmb3JjZSBhbiBFT0YKKwkJICovCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9IHl5Zy0+eXlfbl9jaGFycyA9IDA7CisKKwllbHNlCisJCXsKKwkJCWludCBudW1fdG9fcmVhZCA9CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0gbnVtYmVyX3RvX21vdmUgLSAxOworCisJCXdoaWxlICggbnVtX3RvX3JlYWQgPD0gMCApCisJCQl7IC8qIE5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIC0gZ3JvdyBpdC4gKi8KKworCQkJLyoganVzdCBhIHNob3J0ZXIgbmFtZSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyICovCisJCQlZWV9CVUZGRVJfU1RBVEUgYiA9IFlZX0NVUlJFTlRfQlVGRkVSOworCisJCQlpbnQgeXlfY19idWZfcF9vZmZzZXQgPQorCQkJCShpbnQpICh5eWctPnl5X2NfYnVmX3AgLSBiLT55eV9jaF9idWYpOworCisJCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQkJCXsKKwkJCQlpbnQgbmV3X3NpemUgPSBiLT55eV9idWZfc2l6ZSAqIDI7CisKKwkJCQlpZiAoIG5ld19zaXplIDw9IDAgKQorCQkJCQliLT55eV9idWZfc2l6ZSArPSBiLT55eV9idWZfc2l6ZSAvIDg7CisJCQkJZWxzZQorCQkJCQliLT55eV9idWZfc2l6ZSAqPSAyOworCisJCQkJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikKKwkJCQkJLyogSW5jbHVkZSByb29tIGluIGZvciAyIEVPQiBjaGFycy4gKi8KKwkJCQkJX21lc2FfcHJvZ3JhbV9sZXhlcl9yZWFsbG9jKCh2b2lkICopIGItPnl5X2NoX2J1ZixiLT55eV9idWZfc2l6ZSArIDIgLHl5c2Nhbm5lciApOworCQkJCX0KKwkJCWVsc2UKKwkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCisJCQkJYi0+eXlfY2hfYnVmID0gMDsKKworCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCQkJWVlfRkFUQUxfRVJST1IoCisJCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7CisKKwkJCXl5Zy0+eXlfY19idWZfcCA9ICZiLT55eV9jaF9idWZbeXlfY19idWZfcF9vZmZzZXRdOworCisJCQludW1fdG9fcmVhZCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLQorCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOworCisJCQl9CisKKwkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQorCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOworCisJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLworCQlZWV9JTlBVVCggKCZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV0pLAorCQkJeXlnLT55eV9uX2NoYXJzLCAoc2l6ZV90KSBudW1fdG9fcmVhZCApOworCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9IHl5Zy0+eXlfbl9jaGFyczsKKwkJfQorCisJaWYgKCB5eWctPnl5X25fY2hhcnMgPT0gMCApCisJCXsKKwkJaWYgKCBudW1iZXJfdG9fbW92ZSA9PSBZWV9NT1JFX0FESiApCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9FTkRfT0ZfRklMRTsKKwkJCV9tZXNhX3Byb2dyYW1fbGV4ZXJfcmVzdGFydCh5eWluICAseXlzY2FubmVyKTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9MQVNUX01BVENIOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0KKwkJCQlZWV9CVUZGRVJfRU9GX1BFTkRJTkc7CisJCQl9CisJCX0KKworCWVsc2UKKwkJcmV0X3ZhbCA9IEVPQl9BQ1RfQ09OVElOVUVfU0NBTjsKKworCWlmICgoeXlfc2l6ZV90KSAoeXlnLT55eV9uX2NoYXJzICsgbnVtYmVyX3RvX21vdmUpID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSkgeworCQkvKiBFeHRlbmQgdGhlIGFycmF5IGJ5IDUwJSwgcGx1cyB0aGUgbnVtYmVyIHdlIHJlYWxseSBuZWVkLiAqLworCQl5eV9zaXplX3QgbmV3X3NpemUgPSB5eWctPnl5X25fY2hhcnMgKyBudW1iZXJfdG9fbW92ZSArICh5eWctPnl5X25fY2hhcnMgPj4gMSk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmID0gKGNoYXIgKikgX21lc2FfcHJvZ3JhbV9sZXhlcl9yZWFsbG9jKCh2b2lkICopIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmLG5ld19zaXplICx5eXNjYW5uZXIgKTsKKwkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2dldF9uZXh0X2J1ZmZlcigpIiApOworCX0KKworCXl5Zy0+eXlfbl9jaGFycyArPSBudW1iZXJfdG9fbW92ZTsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnNdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFycyArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJeXlnLT55eXRleHRfcHRyID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWzBdOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qIHl5X2dldF9wcmV2aW91c19zdGF0ZSAtIGdldCB0aGUgc3RhdGUganVzdCBiZWZvcmUgdGhlIEVPQiBjaGFyIHdhcyByZWFjaGVkICovCisKKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwlyZWdpc3RlciB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGU7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3A7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisJeXlfY3VycmVudF9zdGF0ZSA9IHl5Zy0+eXlfc3RhcnQ7CisKKwlmb3IgKCB5eV9jcCA9IHl5Zy0+eXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOyB5eV9jcCA8IHl5Zy0+eXlfY19idWZfcDsgKyt5eV9jcCApCisJCXsKKwkJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gKCp5eV9jcCA/IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldIDogMSk7CisJCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKKwkJCXsKKwkJCXl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUgPSB5eV9jdXJyZW50X3N0YXRlOworCQkJeXlnLT55eV9sYXN0X2FjY2VwdGluZ19jcG9zID0geXlfY3A7CisJCQl9CisJCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKKwkJCXsKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07CisJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gODUwICkKKwkJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKKwkJCX0KKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CisJCX0KKworCXJldHVybiB5eV9jdXJyZW50X3N0YXRlOworfQorCisvKiB5eV90cnlfTlVMX3RyYW5zIC0gdHJ5IHRvIG1ha2UgYSB0cmFuc2l0aW9uIG9uIHRoZSBOVUwgY2hhcmFjdGVyCisgKgorICogc3lub3BzaXMKKyAqCW5leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCBjdXJyZW50X3N0YXRlICk7CisgKi8KKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICAoeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworCXJlZ2lzdGVyIGludCB5eV9pc19qYW07CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOyAvKiBUaGlzIHZhciBtYXkgYmUgdW51c2VkIGRlcGVuZGluZyB1cG9uIG9wdGlvbnMuICovCisJcmVnaXN0ZXIgY2hhciAqeXlfY3AgPSB5eWctPnl5X2NfYnVmX3A7CisKKwlyZWdpc3RlciBZWV9DSEFSIHl5X2MgPSAxOworCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKKwkJeworCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJeXlnLT55eV9sYXN0X2FjY2VwdGluZ19jcG9zID0geXlfY3A7CisJCX0KKwl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCisJCXsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKKwkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDg1MCApCisJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKKwkJfQorCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlID09IDg0OSk7CisKKwlyZXR1cm4geXlfaXNfamFtID8gMCA6IHl5X2N1cnJlbnRfc3RhdGU7Cit9CisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYywgcmVnaXN0ZXIgY2hhciAqIHl5X2JwICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwOworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKworICAgIHl5X2NwID0geXlnLT55eV9jX2J1Zl9wOworCisJLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgeXl0ZXh0ICovCisJKnl5X2NwID0geXlnLT55eV9ob2xkX2NoYXI7CisKKwlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKKwkJeyAvKiBuZWVkIHRvIHNoaWZ0IHRoaW5ncyB1cCB0byBtYWtlIHJvb20gKi8KKwkJLyogKzIgZm9yIEVPQiBjaGFycy4gKi8KKwkJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlID0geXlnLT55eV9uX2NoYXJzICsgMjsKKwkJcmVnaXN0ZXIgY2hhciAqZGVzdCA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsKKwkJCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSArIDJdOworCQlyZWdpc3RlciBjaGFyICpzb3VyY2UgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV07CisKKwkJd2hpbGUgKCBzb3VyY2UgPiBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCisJCQkqLS1kZXN0ID0gKi0tc291cmNlOworCisJCXl5X2NwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJeXlfYnAgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPQorCQkJeXlnLT55eV9uX2NoYXJzID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZTsKKworCQlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIHB1c2gtYmFjayBvdmVyZmxvdyIgKTsKKwkJfQorCisJKi0teXlfY3AgPSAoY2hhcikgYzsKKworCXl5Zy0+eXl0ZXh0X3B0ciA9IHl5X2JwOworCXl5Zy0+eXlfaG9sZF9jaGFyID0gKnl5X2NwOworCXl5Zy0+eXlfY19idWZfcCA9IHl5X2NwOworfQorCisjaWZuZGVmIFlZX05PX0lOUFVUCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBzdGF0aWMgaW50IHl5aW5wdXQgKHl5c2Nhbl90IHl5c2Nhbm5lcikKKyNlbHNlCisgICAgc3RhdGljIGludCBpbnB1dCAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKKyNlbmRpZgorCit7CisJaW50IGM7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisJKnl5Zy0+eXlfY19idWZfcCA9IHl5Zy0+eXlfaG9sZF9jaGFyOworCisJaWYgKCAqeXlnLT55eV9jX2J1Zl9wID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggeXlnLT55eV9jX2J1Zl9wIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFyc10gKQorCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJKnl5Zy0+eXlfY19idWZfcCA9ICdcMCc7CisKKwkJZWxzZQorCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KKwkJCWludCBvZmZzZXQgPSB5eWctPnl5X2NfYnVmX3AgLSB5eWctPnl5dGV4dF9wdHI7CisJCQkrK3l5Zy0+eXlfY19idWZfcDsKKworCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCB5eXNjYW5uZXIgKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCV9tZXNhX3Byb2dyYW1fbGV4ZXJfcmVzdGFydCh5eWluICx5eXNjYW5uZXIpOworCisJCQkJCS8qRkFMTFRIUk9VR0gqLworCisJCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCQl7CisJCQkJCWlmICggX21lc2FfcHJvZ3JhbV9sZXhlcl93cmFwKHl5c2Nhbm5lciApICkKKwkJCQkJCXJldHVybiBFT0Y7CisKKwkJCQkJaWYgKCAhIHl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mICkKKwkJCQkJCVlZX05FV19GSUxFOworI2lmZGVmIF9fY3BsdXNwbHVzCisJCQkJCXJldHVybiB5eWlucHV0KHl5c2Nhbm5lcik7CisjZWxzZQorCQkJCQlyZXR1cm4gaW5wdXQoeXlzY2FubmVyKTsKKyNlbmRpZgorCQkJCQl9CisKKwkJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkJeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eXRleHRfcHRyICsgb2Zmc2V0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikgeXlnLT55eV9jX2J1Zl9wOwkvKiBjYXN0IGZvciA4LWJpdCBjaGFyJ3MgKi8KKwkqeXlnLT55eV9jX2J1Zl9wID0gJ1wwJzsJLyogcHJlc2VydmUgeXl0ZXh0ICovCisJeXlnLT55eV9ob2xkX2NoYXIgPSAqKyt5eWctPnl5X2NfYnVmX3A7CisKKwlyZXR1cm4gYzsKK30KKyNlbmRpZgkvKiBpZm5kZWYgWVlfTk9fSU5QVVQgKi8KKworLyoqIEltbWVkaWF0ZWx5IHN3aXRjaCB0byBhIGRpZmZlcmVudCBpbnB1dCBzdHJlYW0uCisgKiBAcGFyYW0gaW5wdXRfZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXNldCB0aGUgc3RhcnQgY29uZGl0aW9uIHRvIEBjIElOSVRJQUwgLgorICovCisgICAgdm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3Jlc3RhcnQgIChGSUxFICogaW5wdXRfZmlsZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsKKyAgICAgICAgX21lc2FfcHJvZ3JhbV9sZXhlcl9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorICAgICAgICAgICAgX21lc2FfcHJvZ3JhbV9sZXhlcl9fY3JlYXRlX2J1ZmZlcih5eWluLFlZX0JVRl9TSVpFICx5eXNjYW5uZXIpOworCX0KKworCV9tZXNhX3Byb2dyYW1fbGV4ZXJfX2luaXRfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSLGlucHV0X2ZpbGUgLHl5c2Nhbm5lcik7CisJX21lc2FfcHJvZ3JhbV9sZXhlcl9fbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7Cit9CisKKy8qKiBTd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqLworICAgIHZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9fc3dpdGNoX3RvX2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgbmV3X2J1ZmZlciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKwkvKiBUT0RPLiBXZSBzaG91bGQgYmUgYWJsZSB0byByZXBsYWNlIHRoaXMgZW50aXJlIGZ1bmN0aW9uIGJvZHkKKwkgKiB3aXRoCisJICoJCV9tZXNhX3Byb2dyYW1fbGV4ZXJfcG9wX2J1ZmZlcl9zdGF0ZSgpOworCSAqCQlfbWVzYV9wcm9ncmFtX2xleGVyX3B1c2hfYnVmZmVyX3N0YXRlKG5ld19idWZmZXIpOworICAgICAqLworCV9tZXNhX3Byb2dyYW1fbGV4ZXJfZW5zdXJlX2J1ZmZlcl9zdGFjayAoeXlzY2FubmVyKTsKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSID09IG5ld19idWZmZXIgKQorCQlyZXR1cm47CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeworCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCisJCSp5eWctPnl5X2NfYnVmX3AgPSB5eWctPnl5X2hvbGRfY2hhcjsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0geXlnLT55eV9jX2J1Zl9wOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSB5eWctPnl5X25fY2hhcnM7CisJCX0KKworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisJX21lc2FfcHJvZ3JhbV9sZXhlcl9fbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7CisKKwkvKiBXZSBkb24ndCBhY3R1YWxseSBrbm93IHdoZXRoZXIgd2UgZGlkIHRoaXMgc3dpdGNoIGR1cmluZworCSAqIEVPRiAoX21lc2FfcHJvZ3JhbV9sZXhlcl93cmFwKCkpIHByb2Nlc3NpbmcsIGJ1dCB0aGUgb25seSB0aW1lIHRoaXMgZmxhZworCSAqIGlzIGxvb2tlZCBhdCBpcyBhZnRlciBfbWVzYV9wcm9ncmFtX2xleGVyX3dyYXAoKSBpcyBjYWxsZWQsIHNvIGl0J3Mgc2FmZQorCSAqIHRvIGdvIGFoZWFkIGFuZCBhbHdheXMgc2V0IGl0LgorCSAqLworCXl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mID0gMTsKK30KKworc3RhdGljIHZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9fbG9hZF9idWZmZXJfc3RhdGUgICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCXl5Zy0+eXlfbl9jaGFycyA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwl5eWctPnl5dGV4dF9wdHIgPSB5eWctPnl5X2NfYnVmX3AgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3M7CisJeXlpbiA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZTsKKwl5eWctPnl5X2hvbGRfY2hhciA9ICp5eWctPnl5X2NfYnVmX3A7Cit9CisKKy8qKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnB1dCBidWZmZXIgc3RhdGUuCisgKiBAcGFyYW0gZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSBzaXplIFRoZSBjaGFyYWN0ZXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFdoZW4gaW4gZG91YnQsIHVzZSBAYyBZWV9CVUZfU0laRS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICogQHJldHVybiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZS4KKyAqLworICAgIFlZX0JVRkZFUl9TVEFURSBfbWVzYV9wcm9ncmFtX2xleGVyX19jcmVhdGVfYnVmZmVyICAoRklMRSAqIGZpbGUsIGludCAgc2l6ZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKyAgICAKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgX21lc2FfcHJvZ3JhbV9sZXhlcl9hbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAseXlzY2FubmVyICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBfbWVzYV9wcm9ncmFtX2xleGVyX19jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9idWZfc2l6ZSA9IHNpemU7CisKKwkvKiB5eV9jaF9idWYgaGFzIHRvIGJlIDIgY2hhcmFjdGVycyBsb25nZXIgdGhhbiB0aGUgc2l6ZSBnaXZlbiBiZWNhdXNlCisJICogd2UgbmVlZCB0byBwdXQgaW4gMiBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuCisJICovCisJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikgX21lc2FfcHJvZ3JhbV9sZXhlcl9hbGxvYyhiLT55eV9idWZfc2l6ZSArIDIgLHl5c2Nhbm5lciApOworCWlmICggISBiLT55eV9jaF9idWYgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBfbWVzYV9wcm9ncmFtX2xleGVyX19jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKKworCV9tZXNhX3Byb2dyYW1fbGV4ZXJfX2luaXRfYnVmZmVyKGIsZmlsZSAseXlzY2FubmVyKTsKKworCXJldHVybiBiOworfQorCisvKiogRGVzdHJveSB0aGUgYnVmZmVyLgorICogQHBhcmFtIGIgYSBidWZmZXIgY3JlYXRlZCB3aXRoIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX2NyZWF0ZV9idWZmZXIoKQorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KKyAgICB2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKwlpZiAoICEgYiApCisJCXJldHVybjsKKworCWlmICggYiA9PSBZWV9DVVJSRU5UX0JVRkZFUiApIC8qIE5vdCBzdXJlIGlmIHdlIHNob3VsZCBwb3AgaGVyZS4gKi8KKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gKFlZX0JVRkZFUl9TVEFURSkgMDsKKworCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCisJCV9tZXNhX3Byb2dyYW1fbGV4ZXJfZnJlZSgodm9pZCAqKSBiLT55eV9jaF9idWYgLHl5c2Nhbm5lciApOworCisJX21lc2FfcHJvZ3JhbV9sZXhlcl9mcmVlKCh2b2lkICopIGIgLHl5c2Nhbm5lciApOworfQorCisvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgorICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKKyAqIHN1Y2ggYXMgZHVyaW5nIGEgX21lc2FfcHJvZ3JhbV9sZXhlcl9yZXN0YXJ0KCkgb3IgYXQgRU9GLgorICovCisgICAgc3RhdGljIHZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9faW5pdF9idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIGIsIEZJTEUgKiBmaWxlICwgeXlzY2FuX3QgeXlzY2FubmVyKQorCit7CisJaW50IG9lcnJubyA9IGVycm5vOworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKworCV9tZXNhX3Byb2dyYW1fbGV4ZXJfX2ZsdXNoX2J1ZmZlcihiICx5eXNjYW5uZXIpOworCisJYi0+eXlfaW5wdXRfZmlsZSA9IGZpbGU7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAxOworCisgICAgLyogSWYgYiBpcyB0aGUgY3VycmVudCBidWZmZXIsIHRoZW4gX21lc2FfcHJvZ3JhbV9sZXhlcl9faW5pdF9idWZmZXIgd2FzIF9wcm9iYWJseV8KKyAgICAgKiBjYWxsZWQgZnJvbSBfbWVzYV9wcm9ncmFtX2xleGVyX3Jlc3RhcnQoKSBvciB0aHJvdWdoIHl5X2dldF9uZXh0X2J1ZmZlci4KKyAgICAgKiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIGxpbmVubyBvciBjb2x1bW4uCisgICAgICovCisgICAgaWYgKGIgIT0gWVlfQ1VSUkVOVF9CVUZGRVIpeworICAgICAgICBiLT55eV9ic19saW5lbm8gPSAxOworICAgICAgICBiLT55eV9ic19jb2x1bW4gPSAwOworICAgIH0KKworICAgICAgICBiLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisgICAgCisJZXJybm8gPSBvZXJybm87Cit9CisKKy8qKiBEaXNjYXJkIGFsbCBidWZmZXJlZCBjaGFyYWN0ZXJzLiBPbiB0aGUgbmV4dCBzY2FuLCBZWV9JTlBVVCB3aWxsIGJlIGNhbGxlZC4KKyAqIEBwYXJhbSBiIHRoZSBidWZmZXIgc3RhdGUgdG8gYmUgZmx1c2hlZCwgdXN1YWxseSBAYyBZWV9DVVJSRU5UX0JVRkZFUi4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCisgICAgdm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX19mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwliLT55eV9uX2NoYXJzID0gMDsKKworCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCisJICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKKwkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgorCSAqLworCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKKworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQlfbWVzYV9wcm9ncmFtX2xleGVyX19sb2FkX2J1ZmZlcl9zdGF0ZSh5eXNjYW5uZXIgKTsKK30KKworLyoqIFB1c2hlcyB0aGUgbmV3IHN0YXRlIG9udG8gdGhlIHN0YWNrLiBUaGUgbmV3IHN0YXRlIGJlY29tZXMKKyAqICB0aGUgY3VycmVudCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSBzdGFjaworICogIGlmIG5lY2Vzc2FyeS4KKyAqICBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IHN0YXRlLgorICogIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKwlpZiAobmV3X2J1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlfbWVzYV9wcm9ncmFtX2xleGVyX2Vuc3VyZV9idWZmZXJfc3RhY2soeXlzY2FubmVyKTsKKworCS8qIFRoaXMgYmxvY2sgaXMgY29waWVkIGZyb20gX21lc2FfcHJvZ3JhbV9sZXhlcl9fc3dpdGNoX3RvX2J1ZmZlci4gKi8KKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeworCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCisJCSp5eWctPnl5X2NfYnVmX3AgPSB5eWctPnl5X2hvbGRfY2hhcjsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0geXlnLT55eV9jX2J1Zl9wOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSB5eWctPnl5X25fY2hhcnM7CisJCX0KKworCS8qIE9ubHkgcHVzaCBpZiB0b3AgZXhpc3RzLiBPdGhlcndpc2UsIHJlcGxhY2UgdG9wLiAqLworCWlmIChZWV9DVVJSRU5UX0JVRkZFUikKKwkJeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wKys7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKKworCS8qIGNvcGllZCBmcm9tIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX3N3aXRjaF90b19idWZmZXIuICovCisJX21lc2FfcHJvZ3JhbV9sZXhlcl9fbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7CisJeXlnLT55eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAxOworfQorCisvKiogUmVtb3ZlcyBhbmQgZGVsZXRlcyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgaWYgcHJlc2VudC4KKyAqICBUaGUgbmV4dCBlbGVtZW50IGJlY29tZXMgdGhlIG5ldyB0b3AuCisgKiAgQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9wb3BfYnVmZmVyX3N0YXRlICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCWlmICghWVlfQ1VSUkVOVF9CVUZGRVIpCisJCXJldHVybjsKKworCV9tZXNhX3Byb2dyYW1fbGV4ZXJfX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgLHl5c2Nhbm5lcik7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKKwlpZiAoeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wID4gMCkKKwkJLS15eWctPnl5X2J1ZmZlcl9zdGFja190b3A7CisKKwlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpIHsKKwkJX21lc2FfcHJvZ3JhbV9sZXhlcl9fbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7CisJCXl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mID0gMTsKKwl9Cit9CisKKy8qIEFsbG9jYXRlcyB0aGUgc3RhY2sgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgKiAgR3VhcmFudGVlcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIHB1c2guCisgKi8KK3N0YXRpYyB2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfZW5zdXJlX2J1ZmZlcl9zdGFjayAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworCWludCBudW1fdG9fYWxsb2M7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisJaWYgKCF5eWctPnl5X2J1ZmZlcl9zdGFjaykgeworCisJCS8qIEZpcnN0IGFsbG9jYXRpb24gaXMganVzdCBmb3IgMiBlbGVtZW50cywgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzCisJCSAqIHNjYW5uZXIgd2lsbCBldmVuIG5lZWQgYSBzdGFjay4gV2UgdXNlIDIgaW5zdGVhZCBvZiAxIHRvIGF2b2lkIGFuCisJCSAqIGltbWVkaWF0ZSByZWFsbG9jIG9uIHRoZSBuZXh0IGNhbGwuCisgICAgICAgICAqLworCQludW1fdG9fYWxsb2MgPSAxOworCQl5eWctPnl5X2J1ZmZlcl9zdGFjayA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopX21lc2FfcHJvZ3JhbV9sZXhlcl9hbGxvYworCQkJCQkJCQkobnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQorCQkJCQkJCQksIHl5c2Nhbm5lcik7CisJCWlmICggISB5eWctPnl5X2J1ZmZlcl9zdGFjayApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBfbWVzYV9wcm9ncmFtX2xleGVyX2Vuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKKwkJCQkJCQkJICAKKwkJbWVtc2V0KHl5Zy0+eXlfYnVmZmVyX3N0YWNrLCAwLCBudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKKwkJCQkKKwkJeXlnLT55eV9idWZmZXJfc3RhY2tfbWF4ID0gbnVtX3RvX2FsbG9jOworCQl5eWctPnl5X2J1ZmZlcl9zdGFja190b3AgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKHl5Zy0+eXlfYnVmZmVyX3N0YWNrX3RvcCA+PSAoeXlnLT55eV9idWZmZXJfc3RhY2tfbWF4KSAtIDEpeworCisJCS8qIEluY3JlYXNlIHRoZSBidWZmZXIgdG8gcHJlcGFyZSBmb3IgYSBwb3NzaWJsZSBwdXNoLiAqLworCQlpbnQgZ3Jvd19zaXplID0gOCAvKiBhcmJpdHJhcnkgZ3JvdyBzaXplICovOworCisJCW51bV90b19hbGxvYyA9IHl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCArIGdyb3dfc2l6ZTsKKwkJeXlnLT55eV9idWZmZXJfc3RhY2sgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKV9tZXNhX3Byb2dyYW1fbGV4ZXJfcmVhbGxvYworCQkJCQkJCQkoeXlnLT55eV9idWZmZXJfc3RhY2ssCisJCQkJCQkJCW51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKKwkJCQkJCQkJLCB5eXNjYW5uZXIpOworCQlpZiAoICEgeXlnLT55eV9idWZmZXJfc3RhY2sgKQorCQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gX21lc2FfcHJvZ3JhbV9sZXhlcl9lbnN1cmVfYnVmZmVyX3N0YWNrKCkiICk7CisKKwkJLyogemVybyBvbmx5IHRoZSBuZXcgc2xvdHMuKi8KKwkJbWVtc2V0KHl5Zy0+eXlfYnVmZmVyX3N0YWNrICsgeXlnLT55eV9idWZmZXJfc3RhY2tfbWF4LCAwLCBncm93X3NpemUgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKKwkJeXlnLT55eV9idWZmZXJfc3RhY2tfbWF4ID0gbnVtX3RvX2FsbG9jOworCX0KK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBkaXJlY3RseSBmcm9tIGEgdXNlci1zcGVjaWZpZWQgY2hhcmFjdGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBiYXNlIHRoZSBjaGFyYWN0ZXIgYnVmZmVyCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4gCisgKi8KK1lZX0JVRkZFUl9TVEFURSBfbWVzYV9wcm9ncmFtX2xleGVyX19zY2FuX2J1ZmZlciAgKGNoYXIgKiBiYXNlLCB5eV9zaXplX3QgIHNpemUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisgICAgCisJaWYgKCBzaXplIDwgMiB8fAorCSAgICAgYmFzZVtzaXplLTJdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiB8fAorCSAgICAgYmFzZVtzaXplLTFdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCS8qIFRoZXkgZm9yZ290IHRvIGxlYXZlIHJvb20gZm9yIHRoZSBFT0Incy4gKi8KKwkJcmV0dXJuIDA7CisKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgX21lc2FfcHJvZ3JhbV9sZXhlcl9hbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAseXlzY2FubmVyICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBfbWVzYV9wcm9ncmFtX2xleGVyX19zY2FuX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplIC0gMjsJLyogIi0gMiIgdG8gdGFrZSBjYXJlIG9mIEVPQidzICovCisJYi0+eXlfYnVmX3BvcyA9IGItPnl5X2NoX2J1ZiA9IGJhc2U7CisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDA7CisJYi0+eXlfaW5wdXRfZmlsZSA9IDA7CisJYi0+eXlfbl9jaGFycyA9IGItPnl5X2J1Zl9zaXplOworCWItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMDsKKwliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKworCV9tZXNhX3Byb2dyYW1fbGV4ZXJfX3N3aXRjaF90b19idWZmZXIoYiAseXlzY2FubmVyICk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBhIHN0cmluZy4gVGhlIG5leHQgY2FsbCB0byBfbWVzYV9wcm9ncmFtX2xleGVyX2xleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgc3RyLgorICogQHBhcmFtIHl5c3RyIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHNjYW4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCisgKiBAbm90ZSBJZiB5b3Ugd2FudCB0byBzY2FuIGJ5dGVzIHRoYXQgbWF5IGNvbnRhaW4gTlVMIHZhbHVlcywgdGhlbiB1c2UKKyAqICAgICAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX3NjYW5fYnl0ZXMoKSBpbnN0ZWFkLgorICovCitZWV9CVUZGRVJfU1RBVEUgX21lc2FfcHJvZ3JhbV9sZXhlcl9fc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqIHl5c3RyICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIAorCXJldHVybiBfbWVzYV9wcm9ncmFtX2xleGVyX19zY2FuX2J5dGVzKHl5c3RyLHN0cmxlbih5eXN0cikgLHl5c2Nhbm5lcik7Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gdGhlIGdpdmVuIGJ5dGVzLiBUaGUgbmV4dCBjYWxsIHRvIF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4KCkgd2lsbAorICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBieXRlcy4KKyAqIEBwYXJhbSB5eWJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byBzY2FuCisgKiBAcGFyYW0gX3l5Ynl0ZXNfbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBhIGJ5dGVzLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIF9tZXNhX3Byb2dyYW1fbGV4ZXJfX3NjYW5fYnl0ZXMgICh5eWNvbnN0IGNoYXIgKiB5eWJ5dGVzLCBpbnQgIF95eWJ5dGVzX2xlbiAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKwljaGFyICpidWY7CisJeXlfc2l6ZV90IG47CisJaW50IGk7CisgICAgCisJLyogR2V0IG1lbW9yeSBmb3IgZnVsbCBidWZmZXIsIGluY2x1ZGluZyBzcGFjZSBmb3IgdHJhaWxpbmcgRU9CJ3MuICovCisJbiA9IF95eWJ5dGVzX2xlbiArIDI7CisJYnVmID0gKGNoYXIgKikgX21lc2FfcHJvZ3JhbV9sZXhlcl9hbGxvYyhuICx5eXNjYW5uZXIgKTsKKwlpZiAoICEgYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gX21lc2FfcHJvZ3JhbV9sZXhlcl9fc2Nhbl9ieXRlcygpIiApOworCisJZm9yICggaSA9IDA7IGkgPCBfeXlieXRlc19sZW47ICsraSApCisJCWJ1ZltpXSA9IHl5Ynl0ZXNbaV07CisKKwlidWZbX3l5Ynl0ZXNfbGVuXSA9IGJ1ZltfeXlieXRlc19sZW4rMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliID0gX21lc2FfcHJvZ3JhbV9sZXhlcl9fc2Nhbl9idWZmZXIoYnVmLG4gLHl5c2Nhbm5lcik7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggImJhZCBidWZmZXIgaW4gX21lc2FfcHJvZ3JhbV9sZXhlcl9fc2Nhbl9ieXRlcygpIiApOworCisJLyogSXQncyBva2F5IHRvIGdyb3cgZXRjLiB0aGlzIGJ1ZmZlciwgYW5kIHdlIHNob3VsZCB0aHJvdyBpdAorCSAqIGF3YXkgd2hlbiB3ZSdyZSBkb25lLgorCSAqLworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJcmV0dXJuIGI7Cit9CisKKyNpZm5kZWYgWVlfRVhJVF9GQUlMVVJFCisjZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCisjZW5kaWYKKworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciogbXNnICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIAkodm9pZCkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZyApOworCWV4aXQoIFlZX0VYSVRfRkFJTFVSRSApOworfQorCisvKiBSZWRlZmluZSB5eWxlc3MoKSBzbyBpdCB3b3JrcyBpbiBzZWN0aW9uIDMgY29kZS4gKi8KKworI3VuZGVmIHl5bGVzcworI2RlZmluZSB5eWxlc3MobikgXAorCWRvIFwKKwkJeyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dC4gKi8gXAorICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAorICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCisJCXl5dGV4dFt5eWxlbmddID0geXlnLT55eV9ob2xkX2NoYXI7IFwKKwkJeXlnLT55eV9jX2J1Zl9wID0geXl0ZXh0ICsgeXlsZXNzX21hY3JvX2FyZzsgXAorCQl5eWctPnl5X2hvbGRfY2hhciA9ICp5eWctPnl5X2NfYnVmX3A7IFwKKwkJKnl5Zy0+eXlfY19idWZfcCA9ICdcMCc7IFwKKwkJeXlsZW5nID0geXlsZXNzX21hY3JvX2FyZzsgXAorCQl9IFwKKwl3aGlsZSAoIDAgKQorCisvKiBBY2Nlc3NvciAgbWV0aG9kcyAoZ2V0L3NldCBmdW5jdGlvbnMpIHRvIHN0cnVjdCBtZW1iZXJzLiAqLworCisvKiogR2V0IHRoZSB1c2VyLWRlZmluZWQgZGF0YSBmb3IgdGhpcyBzY2FubmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK1lZX0VYVFJBX1RZUEUgX21lc2FfcHJvZ3JhbV9sZXhlcl9nZXRfZXh0cmEgICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIHJldHVybiB5eWV4dHJhOworfQorCisvKiogR2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK2ludCBfbWVzYV9wcm9ncmFtX2xleGVyX2dldF9saW5lbm8gICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIAorICAgICAgICBpZiAoISBZWV9DVVJSRU5UX0JVRkZFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiB5eWxpbmVubzsKK30KKworLyoqIEdldCB0aGUgY3VycmVudCBjb2x1bW4gbnVtYmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK2ludCBfbWVzYV9wcm9ncmFtX2xleGVyX2dldF9jb2x1bW4gICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIAorICAgICAgICBpZiAoISBZWV9DVVJSRU5UX0JVRkZFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiB5eWNvbHVtbjsKK30KKworLyoqIEdldCB0aGUgaW5wdXQgc3RyZWFtLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK0ZJTEUgKl9tZXNhX3Byb2dyYW1fbGV4ZXJfZ2V0X2luICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlpbjsKK30KKworLyoqIEdldCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCitGSUxFICpfbWVzYV9wcm9ncmFtX2xleGVyX2dldF9vdXQgICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIHJldHVybiB5eW91dDsKK30KKworLyoqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRva2VuLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK2ludCBfbWVzYV9wcm9ncmFtX2xleGVyX2dldF9sZW5nICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlsZW5nOworfQorCisvKiogR2V0IHRoZSBjdXJyZW50IHRva2VuLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KKworY2hhciAqX21lc2FfcHJvZ3JhbV9sZXhlcl9nZXRfdGV4dCAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgcmV0dXJuIHl5dGV4dDsKK30KKworLyoqIFNldCB0aGUgdXNlci1kZWZpbmVkIGRhdGEuIFRoaXMgZGF0YSBpcyBuZXZlciB0b3VjaGVkIGJ5IHRoZSBzY2FubmVyLgorICogQHBhcmFtIHVzZXJfZGVmaW5lZCBUaGUgZGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzY2FubmVyLgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9zZXRfZXh0cmEgKFlZX0VYVFJBX1RZUEUgIHVzZXJfZGVmaW5lZCAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlleHRyYSA9IHVzZXJfZGVmaW5lZCA7Cit9CisKKy8qKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X2xpbmVubyAoaW50ICBsaW5lX251bWJlciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKyAgICAgICAgLyogbGluZW5vIGlzIG9ubHkgdmFsaWQgaWYgYW4gaW5wdXQgYnVmZmVyIGV4aXN0cy4gKi8KKyAgICAgICAgaWYgKCEgWVlfQ1VSUkVOVF9CVUZGRVIgKQorICAgICAgICAgICB5eV9mYXRhbF9lcnJvciggIl9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X2xpbmVubyBjYWxsZWQgd2l0aCBubyBidWZmZXIiICwgeXlzY2FubmVyKTsgCisgICAgCisgICAgeXlsaW5lbm8gPSBsaW5lX251bWJlcjsKK30KKworLyoqIFNldCB0aGUgY3VycmVudCBjb2x1bW4uCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X2NvbHVtbiAoaW50ICBjb2x1bW5fbm8gLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisgICAgICAgIC8qIGNvbHVtbiBpcyBvbmx5IHZhbGlkIGlmIGFuIGlucHV0IGJ1ZmZlciBleGlzdHMuICovCisgICAgICAgIGlmICghIFlZX0NVUlJFTlRfQlVGRkVSICkKKyAgICAgICAgICAgeXlfZmF0YWxfZXJyb3IoICJfbWVzYV9wcm9ncmFtX2xleGVyX3NldF9jb2x1bW4gY2FsbGVkIHdpdGggbm8gYnVmZmVyIiAsIHl5c2Nhbm5lcik7IAorICAgIAorICAgIHl5Y29sdW1uID0gY29sdW1uX25vOworfQorCisvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgZG9lcyBub3QgZGlzY2FyZCB0aGUgY3VycmVudAorICogaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIGluX3N0ciBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICogQHNlZSBfbWVzYV9wcm9ncmFtX2xleGVyX19zd2l0Y2hfdG9fYnVmZmVyCisgKi8KK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9zZXRfaW4gKEZJTEUgKiAgaW5fc3RyICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICB5eWluID0gaW5fc3RyIDsKK30KKwordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3NldF9vdXQgKEZJTEUgKiAgb3V0X3N0ciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlvdXQgPSBvdXRfc3RyIDsKK30KKworaW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfZ2V0X2RlYnVnICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlfZmxleF9kZWJ1ZzsKK30KKwordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3NldF9kZWJ1ZyAoaW50ICBiZGVidWcgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIHl5X2ZsZXhfZGVidWcgPSBiZGVidWcgOworfQorCisvKiBBY2Nlc3NvciBtZXRob2RzIGZvciB5eWx2YWwgYW5kIHl5bGxvYyAqLworCitZWVNUWVBFICogX21lc2FfcHJvZ3JhbV9sZXhlcl9nZXRfbHZhbCAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgcmV0dXJuIHl5bHZhbDsKK30KKwordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3NldF9sdmFsIChZWVNUWVBFICogIHl5bHZhbF9wYXJhbSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlsdmFsID0geXlsdmFsX3BhcmFtOworfQorCitZWUxUWVBFICpfbWVzYV9wcm9ncmFtX2xleGVyX2dldF9sbG9jICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlsbG9jOworfQorICAgIAordm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX3NldF9sbG9jIChZWUxUWVBFICogIHl5bGxvY19wYXJhbSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlsbG9jID0geXlsbG9jX3BhcmFtOworfQorICAgIAorLyogVXNlci12aXNpYmxlIEFQSSAqLworCisvKiBfbWVzYV9wcm9ncmFtX2xleGVyX2xleF9pbml0IGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBjcmVhdGVzIHRoZSBzY2FubmVyIGl0c2VsZiwgc28gaXQgaXMKKyAqIHRoZSBPTkxZIHJlZW50cmFudCBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZSB0aGUgc2Nhbm5lciBhcyB0aGUgbGFzdCBhcmd1bWVudC4KKyAqIFRoYXQncyB3aHkgd2UgZXhwbGljaXRseSBoYW5kbGUgdGhlIGRlY2xhcmF0aW9uLCBpbnN0ZWFkIG9mIHVzaW5nIG91ciBtYWNyb3MuCisgKi8KKworaW50IF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2luaXQoeXlzY2FuX3QqIHB0cl95eV9nbG9iYWxzKQorCit7CisgICAgaWYgKHB0cl95eV9nbG9iYWxzID09IE5VTEwpeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgKnB0cl95eV9nbG9iYWxzID0gKHl5c2Nhbl90KSBfbWVzYV9wcm9ncmFtX2xleGVyX2FsbG9jICggc2l6ZW9mKCBzdHJ1Y3QgeXlndXRzX3QgKSwgTlVMTCApOworCisgICAgaWYgKCpwdHJfeXlfZ2xvYmFscyA9PSBOVUxMKXsKKyAgICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIEJ5IHNldHRpbmcgdG8gMHhBQSwgd2UgZXhwb3NlIGJ1Z3MgaW4geXlfaW5pdF9nbG9iYWxzLiBMZWF2ZSBhdCAweDAwIGZvciByZWxlYXNlcy4gKi8KKyAgICBtZW1zZXQoKnB0cl95eV9nbG9iYWxzLDB4MDAsc2l6ZW9mKHN0cnVjdCB5eWd1dHNfdCkpOworCisgICAgcmV0dXJuIHl5X2luaXRfZ2xvYmFscyAoICpwdHJfeXlfZ2xvYmFscyApOworfQorCisvKiBfbWVzYV9wcm9ncmFtX2xleGVyX2xleF9pbml0X2V4dHJhIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2luaXQsIGJ1dCBmb2xsb3dzIHRoZQorICogY29udmVudGlvbiBvZiB0YWtpbmcgdGhlIHNjYW5uZXIgYXMgdGhlIGxhc3QgYXJndW1lbnQuIE5vdGUgaG93ZXZlciwgdGhhdAorICogdGhpcyBpcyBhICpwb2ludGVyKiB0byBhIHNjYW5uZXIsIGFzIGl0IHdpbGwgYmUgYWxsb2NhdGVkIGJ5IHRoaXMgY2FsbCAoYW5kCisgKiBpcyB0aGUgcmVhc29uLCB0b28sIHdoeSB0aGlzIGZ1bmN0aW9uIGFsc28gbXVzdCBoYW5kbGUgaXRzIG93biBkZWNsYXJhdGlvbikuCisgKiBUaGUgdXNlciBkZWZpbmVkIHZhbHVlIGluIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGF2YWlsYWJsZSB0byBfbWVzYV9wcm9ncmFtX2xleGVyX2FsbG9jIGluCisgKiB0aGUgeXlleHRyYSBmaWVsZC4KKyAqLworCitpbnQgX21lc2FfcHJvZ3JhbV9sZXhlcl9sZXhfaW5pdF9leHRyYShZWV9FWFRSQV9UWVBFIHl5X3VzZXJfZGVmaW5lZCx5eXNjYW5fdCogcHRyX3l5X2dsb2JhbHMgKQorCit7CisgICAgc3RydWN0IHl5Z3V0c190IGR1bW15X3l5Z3V0czsKKworICAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfc2V0X2V4dHJhICh5eV91c2VyX2RlZmluZWQsICZkdW1teV95eWd1dHMpOworCisgICAgaWYgKHB0cl95eV9nbG9iYWxzID09IE5VTEwpeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCQorICAgICpwdHJfeXlfZ2xvYmFscyA9ICh5eXNjYW5fdCkgX21lc2FfcHJvZ3JhbV9sZXhlcl9hbGxvYyAoIHNpemVvZiggc3RydWN0IHl5Z3V0c190ICksICZkdW1teV95eWd1dHMgKTsKKwkKKyAgICBpZiAoKnB0cl95eV9nbG9iYWxzID09IE5VTEwpeworICAgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIC8qIEJ5IHNldHRpbmcgdG8gMHhBQSwgd2UgZXhwb3NlIGJ1Z3MgaW4KKyAgICB5eV9pbml0X2dsb2JhbHMuIExlYXZlIGF0IDB4MDAgZm9yIHJlbGVhc2VzLiAqLworICAgIG1lbXNldCgqcHRyX3l5X2dsb2JhbHMsMHgwMCxzaXplb2Yoc3RydWN0IHl5Z3V0c190KSk7CisgICAgCisgICAgX21lc2FfcHJvZ3JhbV9sZXhlcl9zZXRfZXh0cmEgKHl5X3VzZXJfZGVmaW5lZCwgKnB0cl95eV9nbG9iYWxzKTsKKyAgICAKKyAgICByZXR1cm4geXlfaW5pdF9nbG9iYWxzICggKnB0cl95eV9nbG9iYWxzICk7Cit9CisKK3N0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIC8qIEluaXRpYWxpemF0aW9uIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgbm9uLXJlZW50cmFudCBzY2FubmVyLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gX21lc2FfcHJvZ3JhbV9sZXhlcl9sZXhfZGVzdHJveSgpLCBzbyBkb24ndCBhbGxvY2F0ZSBoZXJlLgorICAgICAqLworCisgICAgeXlnLT55eV9idWZmZXJfc3RhY2sgPSAwOworICAgIHl5Zy0+eXlfYnVmZmVyX3N0YWNrX3RvcCA9IDA7CisgICAgeXlnLT55eV9idWZmZXJfc3RhY2tfbWF4ID0gMDsKKyAgICB5eWctPnl5X2NfYnVmX3AgPSAoY2hhciAqKSAwOworICAgIHl5Zy0+eXlfaW5pdCA9IDA7CisgICAgeXlnLT55eV9zdGFydCA9IDA7CisKKyAgICB5eWctPnl5X3N0YXJ0X3N0YWNrX3B0ciA9IDA7CisgICAgeXlnLT55eV9zdGFydF9zdGFja19kZXB0aCA9IDA7CisgICAgeXlnLT55eV9zdGFydF9zdGFjayA9ICBOVUxMOworCisvKiBEZWZpbmVkIGluIG1haW4uYyAqLworI2lmZGVmIFlZX1NURElOSVQKKyAgICB5eWluID0gc3RkaW47CisgICAgeXlvdXQgPSBzdGRvdXQ7CisjZWxzZQorICAgIHl5aW4gPSAoRklMRSAqKSAwOworICAgIHl5b3V0ID0gKEZJTEUgKikgMDsKKyNlbmRpZgorCisgICAgLyogRm9yIGZ1dHVyZSByZWZlcmVuY2U6IFNldCBlcnJubyBvbiBlcnJvciwgc2luY2Ugd2UgYXJlIGNhbGxlZCBieQorICAgICAqIF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2luaXQoKQorICAgICAqLworICAgIHJldHVybiAwOworfQorCisvKiBfbWVzYV9wcm9ncmFtX2xleGVyX2xleF9kZXN0cm95IGlzIGZvciBib3RoIHJlZW50cmFudCBhbmQgbm9uLXJlZW50cmFudCBzY2FubmVycy4gKi8KK2ludCBfbWVzYV9wcm9ncmFtX2xleGVyX2xleF9kZXN0cm95ICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKworICAgIC8qIFBvcCB0aGUgYnVmZmVyIHN0YWNrLCBkZXN0cm95aW5nIGVhY2ggZWxlbWVudC4gKi8KKwl3aGlsZShZWV9DVVJSRU5UX0JVRkZFUil7CisJCV9tZXNhX3Byb2dyYW1fbGV4ZXJfX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgLHl5c2Nhbm5lciApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBOVUxMOworCQlfbWVzYV9wcm9ncmFtX2xleGVyX3BvcF9idWZmZXJfc3RhdGUoeXlzY2FubmVyKTsKKwl9CisKKwkvKiBEZXN0cm95IHRoZSBzdGFjayBpdHNlbGYuICovCisJX21lc2FfcHJvZ3JhbV9sZXhlcl9mcmVlKHl5Zy0+eXlfYnVmZmVyX3N0YWNrICx5eXNjYW5uZXIpOworCXl5Zy0+eXlfYnVmZmVyX3N0YWNrID0gTlVMTDsKKworICAgIC8qIERlc3Ryb3kgdGhlIHN0YXJ0IGNvbmRpdGlvbiBzdGFjay4gKi8KKyAgICAgICAgX21lc2FfcHJvZ3JhbV9sZXhlcl9mcmVlKHl5Zy0+eXlfc3RhcnRfc3RhY2sgLHl5c2Nhbm5lciApOworICAgICAgICB5eWctPnl5X3N0YXJ0X3N0YWNrID0gTlVMTDsKKworICAgIC8qIFJlc2V0IHRoZSBnbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBpbiBhIG5vbi1yZWVudHJhbnQgc2Nhbm5lciBzbyB0aGUgbmV4dCB0aW1lCisgICAgICogX21lc2FfcHJvZ3JhbV9sZXhlcl9sZXgoKSBpcyBjYWxsZWQsIGluaXRpYWxpemF0aW9uIHdpbGwgb2NjdXIuICovCisgICAgeXlfaW5pdF9nbG9iYWxzKCB5eXNjYW5uZXIpOworCisgICAgLyogRGVzdHJveSB0aGUgbWFpbiBzdHJ1Y3QgKHJlZW50cmFudCBvbmx5KS4gKi8KKyAgICBfbWVzYV9wcm9ncmFtX2xleGVyX2ZyZWUgKCB5eXNjYW5uZXIgLCB5eXNjYW5uZXIgKTsKKyAgICB5eXNjYW5uZXIgPSBOVUxMOworICAgIHJldHVybiAwOworfQorCisvKgorICogSW50ZXJuYWwgdXRpbGl0eSByb3V0aW5lcy4KKyAqLworCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciogczEsIHl5Y29uc3QgY2hhciAqIHMyLCBpbnQgbiAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisJCXMxW2ldID0gczJbaV07Cit9CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiBzICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworCXJlZ2lzdGVyIGludCBuOworCWZvciAoIG4gPSAwOyBzW25dOyArK24gKQorCQk7CisKKwlyZXR1cm4gbjsKK30KKyNlbmRpZgorCit2b2lkICpfbWVzYV9wcm9ncmFtX2xleGVyX2FsbG9jICh5eV9zaXplX3QgIHNpemUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisJcmV0dXJuICh2b2lkICopIG1hbGxvYyggc2l6ZSApOworfQorCit2b2lkICpfbWVzYV9wcm9ncmFtX2xleGVyX3JlYWxsb2MgICh2b2lkICogcHRyLCB5eV9zaXplX3QgIHNpemUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisJLyogVGhlIGNhc3QgdG8gKGNoYXIgKikgaW4gdGhlIGZvbGxvd2luZyBhY2NvbW1vZGF0ZXMgYm90aAorCSAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSBjaGFyKiBnZW5lcmljIHBvaW50ZXJzLCBhbmQgdGhvc2UKKwkgKiB0aGF0IHVzZSB2b2lkKiBnZW5lcmljIHBvaW50ZXJzLiAgSXQgd29ya3Mgd2l0aCB0aGUgbGF0dGVyCisJICogYmVjYXVzZSBib3RoIEFOU0kgQyBhbmQgQysrIGFsbG93IGNhc3RsZXNzIGFzc2lnbm1lbnQgZnJvbQorCSAqIGFueSBwb2ludGVyIHR5cGUgdG8gdm9pZCosIGFuZCBkZWFsIHdpdGggYXJndW1lbnQgY29udmVyc2lvbnMKKwkgKiBhcyB0aG91Z2ggZG9pbmcgYW4gYXNzaWdubWVudC4KKwkgKi8KKwlyZXR1cm4gKHZvaWQgKikgcmVhbGxvYyggKGNoYXIgKikgcHRyLCBzaXplICk7Cit9CisKK3ZvaWQgX21lc2FfcHJvZ3JhbV9sZXhlcl9mcmVlICh2b2lkICogcHRyICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworCWZyZWUoIChjaGFyICopIHB0ciApOwkvKiBzZWUgX21lc2FfcHJvZ3JhbV9sZXhlcl9yZWFsbG9jKCkgZm9yIChjaGFyICopIGNhc3QgKi8KK30KKworI2RlZmluZSBZWVRBQkxFU19OQU1FICJ5eXRhYmxlcyIKKworI2xpbmUgNDk0ICJwcm9ncmFtL3Byb2dyYW1fbGV4ZXIubCIKKworCisKK3ZvaWQKK19tZXNhX3Byb2dyYW1fbGV4ZXJfY3Rvcih2b2lkICoqc2Nhbm5lciwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlLAorCQkJIGNvbnN0IGNoYXIgKnN0cmluZywgc2l6ZV90IGxlbikKK3sKKyAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2luaXRfZXh0cmEoc3RhdGUsc2Nhbm5lcik7CisgICBfbWVzYV9wcm9ncmFtX2xleGVyX19zY2FuX2J5dGVzKHN0cmluZyxsZW4sKnNjYW5uZXIpOworfQorCit2b2lkCitfbWVzYV9wcm9ncmFtX2xleGVyX2R0b3Iodm9pZCAqc2Nhbm5lcikKK3sKKyAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4X2Rlc3Ryb3koc2Nhbm5lcik7Cit9CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19jYWNoZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjM2Q4NAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19jYWNoZS5jCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVk13YXJlLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFZNV0FSRSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL3NoYWRlcm9iai5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19jYWNoZS5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ3JhbS5oIgorCisKK3N0cnVjdCBjYWNoZV9pdGVtCit7CisgICBHTHVpbnQgaGFzaDsKKyAgIHVuc2lnbmVkIGtleXNpemU7CisgICB2b2lkICprZXk7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbTsKKyAgIHN0cnVjdCBjYWNoZV9pdGVtICpuZXh0OworfTsKKworc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUKK3sKKyAgIHN0cnVjdCBjYWNoZV9pdGVtICoqaXRlbXM7CisgICBzdHJ1Y3QgY2FjaGVfaXRlbSAqbGFzdDsKKyAgIEdMdWludCBzaXplLCBuX2l0ZW1zOworfTsKKworCisKKy8qKgorICogQ29tcHV0ZSBoYXNoIGluZGV4IGZyb20gc3RhdGUga2V5LgorICovCitzdGF0aWMgR0x1aW50CitoYXNoX2tleShjb25zdCB2b2lkICprZXksIEdMdWludCBrZXlfc2l6ZSkKK3sKKyAgIGNvbnN0IEdMdWludCAqaWtleSA9IChjb25zdCBHTHVpbnQgKikga2V5OworICAgR0x1aW50IGhhc2ggPSAwLCBpOworCisgICBhc3NlcnQoa2V5X3NpemUgPj0gNCk7CisKKyAgIC8qIE1ha2UgYSBzbGlnaHRseSBiZXR0ZXIgYXR0ZW1wdCBhdCBhIGhhc2ggZnVuY3Rpb246CisgICAgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBrZXlfc2l6ZSAvIHNpemVvZigqaWtleSk7IGkrKykKKyAgIHsKKyAgICAgIGhhc2ggKz0gaWtleVtpXTsKKyAgICAgIGhhc2ggKz0gKGhhc2ggPDwgMTApOworICAgICAgaGFzaCBePSAoaGFzaCA+PiA2KTsKKyAgIH0KKworICAgcmV0dXJuIGhhc2g7Cit9CisKKworLyoqCisgKiBSZWJ1aWxkL2V4cGFuZCB0aGUgaGFzaCB0YWJsZSB0byBhY2NvbW1vZGF0ZSBtb3JlIGVudHJpZXMKKyAqLworc3RhdGljIHZvaWQKK3JlaGFzaChzdHJ1Y3QgZ2xfcHJvZ3JhbV9jYWNoZSAqY2FjaGUpCit7CisgICBzdHJ1Y3QgY2FjaGVfaXRlbSAqKml0ZW1zOworICAgc3RydWN0IGNhY2hlX2l0ZW0gKmMsICpuZXh0OworICAgR0x1aW50IHNpemUsIGk7CisKKyAgIGNhY2hlLT5sYXN0ID0gTlVMTDsKKworICAgc2l6ZSA9IGNhY2hlLT5zaXplICogMzsKKyAgIGl0ZW1zID0gbWFsbG9jKHNpemUgKiBzaXplb2YoKml0ZW1zKSk7CisgICBtZW1zZXQoaXRlbXMsIDAsIHNpemUgKiBzaXplb2YoKml0ZW1zKSk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBjYWNoZS0+c2l6ZTsgaSsrKQorICAgICAgZm9yIChjID0gY2FjaGUtPml0ZW1zW2ldOyBjOyBjID0gbmV4dCkgeworCSBuZXh0ID0gYy0+bmV4dDsKKwkgYy0+bmV4dCA9IGl0ZW1zW2MtPmhhc2ggJSBzaXplXTsKKwkgaXRlbXNbYy0+aGFzaCAlIHNpemVdID0gYzsKKyAgICAgIH0KKworICAgZnJlZShjYWNoZS0+aXRlbXMpOworICAgY2FjaGUtPml0ZW1zID0gaXRlbXM7CisgICBjYWNoZS0+c2l6ZSA9IHNpemU7Cit9CisKKworc3RhdGljIHZvaWQKK2NsZWFyX2NhY2hlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9wcm9ncmFtX2NhY2hlICpjYWNoZSwKKwkgICAgR0xib29sZWFuIHNoYWRlcikKK3sKKyAgIHN0cnVjdCBjYWNoZV9pdGVtICpjLCAqbmV4dDsKKyAgIEdMdWludCBpOworICAgCisgICBjYWNoZS0+bGFzdCA9IE5VTEw7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBjYWNoZS0+c2l6ZTsgaSsrKSB7CisgICAgICBmb3IgKGMgPSBjYWNoZS0+aXRlbXNbaV07IGM7IGMgPSBuZXh0KSB7CisJIG5leHQgPSBjLT5uZXh0OworCSBmcmVlKGMtPmtleSk7CisJIGlmIChzaGFkZXIpIHsKKwkgICAgX21lc2FfcmVmZXJlbmNlX3NoYWRlcl9wcm9ncmFtKGN0eCwKKwkJCQkJICAgKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqKikmYy0+cHJvZ3JhbSwKKwkJCQkJICAgTlVMTCk7CisJIH0gZWxzZSB7CisJICAgIF9tZXNhX3JlZmVyZW5jZV9wcm9ncmFtKGN0eCwgJmMtPnByb2dyYW0sIE5VTEwpOworCSB9CisJIGZyZWUoYyk7CisgICAgICB9CisgICAgICBjYWNoZS0+aXRlbXNbaV0gPSBOVUxMOworICAgfQorCisKKyAgIGNhY2hlLT5uX2l0ZW1zID0gMDsKK30KKworCisKK3N0cnVjdCBnbF9wcm9ncmFtX2NhY2hlICoKK19tZXNhX25ld19wcm9ncmFtX2NhY2hlKHZvaWQpCit7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9jYWNoZSAqY2FjaGUgPSBDQUxMT0NfU1RSVUNUKGdsX3Byb2dyYW1fY2FjaGUpOworICAgaWYgKGNhY2hlKSB7CisgICAgICBjYWNoZS0+c2l6ZSA9IDE3OworICAgICAgY2FjaGUtPml0ZW1zID0KKyAgICAgICAgIGNhbGxvYygxLCBjYWNoZS0+c2l6ZSAqIHNpemVvZihzdHJ1Y3QgY2FjaGVfaXRlbSkpOworICAgICAgaWYgKCFjYWNoZS0+aXRlbXMpIHsKKyAgICAgICAgIGZyZWUoY2FjaGUpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisgICByZXR1cm4gY2FjaGU7Cit9CisKKwordm9pZAorX21lc2FfZGVsZXRlX3Byb2dyYW1fY2FjaGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKmNhY2hlKQoreworICAgY2xlYXJfY2FjaGUoY3R4LCBjYWNoZSwgR0xfRkFMU0UpOworICAgZnJlZShjYWNoZS0+aXRlbXMpOworICAgZnJlZShjYWNoZSk7Cit9CisKK3ZvaWQKK19tZXNhX2RlbGV0ZV9zaGFkZXJfY2FjaGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJCSAgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKmNhY2hlKQoreworICAgY2xlYXJfY2FjaGUoY3R4LCBjYWNoZSwgR0xfVFJVRSk7CisgICBmcmVlKGNhY2hlLT5pdGVtcyk7CisgICBmcmVlKGNhY2hlKTsKK30KKworCitzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9zZWFyY2hfcHJvZ3JhbV9jYWNoZShzdHJ1Y3QgZ2xfcHJvZ3JhbV9jYWNoZSAqY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIEdMdWludCBrZXlzaXplKQoreworICAgaWYgKGNhY2hlLT5sYXN0ICYmCisgICAgICAgY2FjaGUtPmxhc3QtPmtleXNpemUgPT0ga2V5c2l6ZSAmJgorICAgICAgIG1lbWNtcChjYWNoZS0+bGFzdC0+a2V5LCBrZXksIGtleXNpemUpID09IDApIHsKKyAgICAgIHJldHVybiBjYWNoZS0+bGFzdC0+cHJvZ3JhbTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgY29uc3QgR0x1aW50IGhhc2ggPSBoYXNoX2tleShrZXksIGtleXNpemUpOworICAgICAgc3RydWN0IGNhY2hlX2l0ZW0gKmM7CisKKyAgICAgIGZvciAoYyA9IGNhY2hlLT5pdGVtc1toYXNoICUgY2FjaGUtPnNpemVdOyBjOyBjID0gYy0+bmV4dCkgeworICAgICAgICAgaWYgKGMtPmhhc2ggPT0gaGFzaCAmJgorICAgICAgICAgICAgIGMtPmtleXNpemUgPT0ga2V5c2l6ZSAmJgorICAgICAgICAgICAgIG1lbWNtcChjLT5rZXksIGtleSwga2V5c2l6ZSkgPT0gMCkgeworCisgICAgICAgICAgICBjYWNoZS0+bGFzdCA9IGM7CisgICAgICAgICAgICByZXR1cm4gYy0+cHJvZ3JhbTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIE5VTEw7CisgICB9Cit9CisKKwordm9pZAorX21lc2FfcHJvZ3JhbV9jYWNoZV9pbnNlcnQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX2NhY2hlICpjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgR0x1aW50IGtleXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbSkKK3sKKyAgIGNvbnN0IEdMdWludCBoYXNoID0gaGFzaF9rZXkoa2V5LCBrZXlzaXplKTsKKyAgIHN0cnVjdCBjYWNoZV9pdGVtICpjID0gQ0FMTE9DX1NUUlVDVChjYWNoZV9pdGVtKTsKKworICAgYy0+aGFzaCA9IGhhc2g7CisKKyAgIGMtPmtleSA9IG1hbGxvYyhrZXlzaXplKTsKKyAgIG1lbWNweShjLT5rZXksIGtleSwga2V5c2l6ZSk7CisgICBjLT5rZXlzaXplID0ga2V5c2l6ZTsKKworICAgYy0+cHJvZ3JhbSA9IHByb2dyYW07ICAvKiBubyByZWZjb3VudCBjaGFuZ2UgKi8KKworICAgaWYgKGNhY2hlLT5uX2l0ZW1zID4gY2FjaGUtPnNpemUgKiAxLjUpIHsKKyAgICAgIGlmIChjYWNoZS0+c2l6ZSA8IDEwMDApCisJIHJlaGFzaChjYWNoZSk7CisgICAgICBlbHNlIAorCSBjbGVhcl9jYWNoZShjdHgsIGNhY2hlLCBHTF9GQUxTRSk7CisgICB9CisKKyAgIGNhY2hlLT5uX2l0ZW1zKys7CisgICBjLT5uZXh0ID0gY2FjaGUtPml0ZW1zW2hhc2ggJSBjYWNoZS0+c2l6ZV07CisgICBjYWNoZS0+aXRlbXNbaGFzaCAlIGNhY2hlLT5zaXplXSA9IGM7Cit9CisKK3ZvaWQKK19tZXNhX3NoYWRlcl9jYWNoZV9pbnNlcnQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJCSAgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKmNhY2hlLAorCQkJICBjb25zdCB2b2lkICprZXksIEdMdWludCBrZXlzaXplLAorCQkJICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2dyYW0pCit7CisgICBjb25zdCBHTHVpbnQgaGFzaCA9IGhhc2hfa2V5KGtleSwga2V5c2l6ZSk7CisgICBzdHJ1Y3QgY2FjaGVfaXRlbSAqYyA9IENBTExPQ19TVFJVQ1QoY2FjaGVfaXRlbSk7CisKKyAgIGMtPmhhc2ggPSBoYXNoOworCisgICBjLT5rZXkgPSBtYWxsb2Moa2V5c2l6ZSk7CisgICBtZW1jcHkoYy0+a2V5LCBrZXksIGtleXNpemUpOworICAgYy0+a2V5c2l6ZSA9IGtleXNpemU7CisKKyAgIGMtPnByb2dyYW0gPSAoc3RydWN0IGdsX3Byb2dyYW0gKilwcm9ncmFtOyAgLyogbm8gcmVmY291bnQgY2hhbmdlICovCisKKyAgIGlmIChjYWNoZS0+bl9pdGVtcyA+IGNhY2hlLT5zaXplICogMS41KSB7CisgICAgICBpZiAoY2FjaGUtPnNpemUgPCAxMDAwKQorCSByZWhhc2goY2FjaGUpOworICAgICAgZWxzZQorCSBjbGVhcl9jYWNoZShjdHgsIGNhY2hlLCBHTF9UUlVFKTsKKyAgIH0KKworICAgY2FjaGUtPm5faXRlbXMrKzsKKyAgIGMtPm5leHQgPSBjYWNoZS0+aXRlbXNbaGFzaCAlIGNhY2hlLT5zaXplXTsKKyAgIGNhY2hlLT5pdGVtc1toYXNoICUgY2FjaGUtPnNpemVdID0gYzsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19jYWNoZS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkN2UyNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19jYWNoZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBWTXdhcmUsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVk1XQVJFIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBQUk9HX0NBQ0hFX0gKKyNkZWZpbmUgUFJPR19DQUNIRV9ICisKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKworc3RydWN0IGdsX2NvbnRleHQ7CisKKy8qKiBPcGFxdWUgdHlwZSAqLworc3RydWN0IGdsX3Byb2dyYW1fY2FjaGU7CisKKworZXh0ZXJuIHN0cnVjdCBnbF9wcm9ncmFtX2NhY2hlICoKK19tZXNhX25ld19wcm9ncmFtX2NhY2hlKHZvaWQpOworCitleHRlcm4gdm9pZAorX21lc2FfZGVsZXRlX3Byb2dyYW1fY2FjaGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKnBjKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2RlbGV0ZV9zaGFkZXJfY2FjaGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJCSAgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKmNhY2hlKTsKKworZXh0ZXJuIHN0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX3NlYXJjaF9wcm9ncmFtX2NhY2hlKHN0cnVjdCBnbF9wcm9ncmFtX2NhY2hlICpjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgR0x1aW50IGtleXNpemUpOworCitleHRlcm4gdm9pZAorX21lc2FfcHJvZ3JhbV9jYWNoZV9pbnNlcnQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX2NhY2hlICpjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSwgR0x1aW50IGtleXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbSk7CisKK3ZvaWQKK19tZXNhX3NoYWRlcl9jYWNoZV9pbnNlcnQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJCSAgc3RydWN0IGdsX3Byb2dyYW1fY2FjaGUgKmNhY2hlLAorCQkJICBjb25zdCB2b2lkICprZXksIEdMdWludCBrZXlzaXplLAorCQkJICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2dyYW0pOworCisKKyNlbmRpZiAvKiBQUk9HX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19kaXNrY2FjaGUuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19kaXNrY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmE3NjQxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2Rpc2tjYWNoZS5jCkBAIC0wLDAgKzEsNjU2IEBACisvKiAtKi0gYyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJzaGFkZXJfY2FjaGUuaCIKKyNpbmNsdWRlICJwcm9nX2Rpc2tjYWNoZS5oIgorI2luY2x1ZGUgImdsc2xfcGFyc2VyX2V4dHJhcy5oIgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPGRpcmVudC5oPgorCitzdHJ1Y3QgZGlyX2VudHJ5X3QKK3sKKyAgIGNoYXIgKnBhdGg7CisgICBzdHJ1Y3Qgc3RhdCBpbmZvOworfTsKKworCitzdGF0aWMgaW50Citzb3J0X2J5X2FjY2Vzc190aW1lKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKyAgIC8qIENvbXBhcmUgYWNjZXNzIHRpbWUgb2YgMiBlbnRyaWVzICovCisgICBzdHJ1Y3QgZGlyX2VudHJ5X3QgKmEgPSAoc3RydWN0IGRpcl9lbnRyeV90ICopIF9hOworICAgc3RydWN0IGRpcl9lbnRyeV90ICpiID0gKHN0cnVjdCBkaXJfZW50cnlfdCAqKSBfYjsKKworICAgaWYgKGEtPmluZm8uc3RfYXRpbWUgPiBiLT5pbmZvLnN0X2F0aW1lKQorICAgICAgcmV0dXJuIDE7CisgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludAordmFsaWRfY2FjaGVfZW50cnkoY29uc3Qgc3RydWN0IGRpcmVudCAqZW50cnkpCit7CisgICAvKiBPbmx5IHJlZ3VsYXIgZmlsZXMgYXJlIHBvc3NpYmxlIHZhbGlkIGNhY2hlIGVudHJpZXMuICovCisgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9SRUcpCisgICAgICByZXR1cm4gMTsKKyAgIHJldHVybiAwOworfQorCisKKy8qKgorICogQ2FjaGUgc2l6ZSBtYW5hZ2VtZW50LiBJZiBjYWNoZSBzaXplIGV4Y2VlZHMgbWF4X2NhY2hlX3NpemUsCisgKiBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgYWNjZXNzIHRpbWUgYW5kIG9sZGVzdCBlbnRyaWVzIGRlbGV0ZWQKKyAqIHVudGlsIHdlIGZpdC4KKyAqLworc3RhdGljIHZvaWQKK21hbmFnZV9jYWNoZV9zaXplKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIG1heF9jYWNoZV9zaXplKQoreworICAgaWYgKG1heF9jYWNoZV9zaXplID09IDB4RkZGRkZGRkYpIHsKKyAgICAgIC8qIGNhY2hlIHNpemUgb2YgLTEgbWVhbnMgZG9uJ3QgbGltaXQgdGhlIHNpemUgKi8KKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgc3RydWN0IGRpcmVudCAqKmVudHJpZXM7CisgICBpbnQgbiA9IHNjYW5kaXIocGF0aCwgJmVudHJpZXMsIHZhbGlkX2NhY2hlX2VudHJ5LCBOVUxMKTsKKworICAgaWYgKG4gPD0gMCkKKyAgICAgIHJldHVybjsKKworICAgc3RydWN0IGRpcl9lbnRyeV90ICpjYWNoZSA9IE5VTEw7CisgICB1bnNpZ25lZCBjYWNoZV9zaXplID0gMDsKKyAgIHVuc2lnbmVkIGNhY2hlX2VudHJpZXMgPSAwOworCisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisKKyAgIGNhY2hlID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsIHN0cnVjdCBkaXJfZW50cnlfdCwgbik7CisKKyAgIC8qIENvbnN0cnVjdCBlbnRyaWVzIHdpdGggcGF0aCBhbmQgYWNjZXNzIGluZm9ybWF0aW9uICsgY2FsY3VsYXRlCisgICAgKiB0b3RhbCBzaXplIHVzZWQgYnkgZW50cmllcy4KKyAgICAqLworICAgd2hpbGUgKG4tLSkgeworICAgICAgY2FjaGVbY2FjaGVfZW50cmllc10ucGF0aCA9CisgICAgICAgICByYWxsb2NfYXNwcmludGYobWVtX2N0eCwgIiVzLyVzIiwgcGF0aCwgZW50cmllc1tuXS0+ZF9uYW1lKTsKKyAgICAgIHN0YXQoY2FjaGVbY2FjaGVfZW50cmllc10ucGF0aCwgJmNhY2hlW2NhY2hlX2VudHJpZXNdLmluZm8pOworCisgICAgICBjYWNoZV9zaXplICs9IGNhY2hlW2NhY2hlX2VudHJpZXNdLmluZm8uc3Rfc2l6ZTsKKworICAgICAgY2FjaGVfZW50cmllcysrOworICAgICAgZnJlZShlbnRyaWVzW25dKTsKKyAgIH0KKyAgIGZyZWUoZW50cmllcyk7CisKKyAgIC8qIE5vIG5lZWQgdG8gbWFuYWdlIGlmIHdlIGZpdCB0aGUgbWF4IHNpemUuICovCisgICBpZiAoY2FjaGVfc2l6ZSA8IG1heF9jYWNoZV9zaXplKQorICAgICAgZ290byBmcmVlX2FsbG9jYXRlZF9tZW1vcnk7CisKKyAgIC8qIFNvcnQgb2xkZXN0IGZpcnN0IHNvIHdlIGNhbiAnZGVsZXRlIHVudGlsIGNhY2hlIHNpemUgbGVzcyB0aGFuIG1heCcuICovCisgICBxc29ydChjYWNoZSwgY2FjaGVfZW50cmllcywgc2l6ZW9mKHN0cnVjdCBkaXJfZW50cnlfdCksIHNvcnRfYnlfYWNjZXNzX3RpbWUpOworCisgICB1bnNpZ25lZCBpID0gMDsKKyAgIHdoaWxlIChjYWNoZV9zaXplID4gbWF4X2NhY2hlX3NpemUgJiYgaSA8IGNhY2hlX2VudHJpZXMpIHsKKyAgICAgIHVubGluayhjYWNoZVtpXS5wYXRoKTsKKyAgICAgIGNhY2hlX3NpemUgLT0gY2FjaGVbaV0uaW5mby5zdF9zaXplOworICAgICAgaSsrOworICAgfQorCitmcmVlX2FsbG9jYXRlZF9tZW1vcnk6CisKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworfQorI2VuZGlmCisKKworc3RhdGljIGludAorbWVzYV9ta2Rpcl9jYWNoZShjb25zdCBjaGFyICpwYXRoKQoreworICAgY2hhciAqY29weSA9IF9tZXNhX3N0cmR1cChwYXRoKTsKKyAgIGNoYXIgKmRpciA9IHN0cnRvayhjb3B5LCAiLyIpOworICAgY2hhciAqY3VycmVudCA9IHJhbGxvY19zdHJkdXAoTlVMTCwgIi8iKTsKKyAgIGludCByZXN1bHQgPSAwOworCisgICAvKiBBcyBleGFtcGxlIGxvb3AgaXRlcmF0ZXMgYW5kIGNhbGxzIG1rZGlyIGZvciBlYWNoIHRva2VuCisgICAgKiBzZXBhcmF0ZWQgYnkgJy8nIGluICIvaG9tZS95b2dzb3Rob3RoLy5jYWNoZS9tZXNhIi4KKyAgICAqLworICAgd2hpbGUgKGRpcikgeworICAgICAgcmFsbG9jX3N0cmNhdCgmY3VycmVudCwgZGlyKTsKKworICAgICAgcmVzdWx0ID0gX21lc2FfbWtkaXIoY3VycmVudCk7CisKKyAgICAgIGlmIChyZXN1bHQgIT0gMCAmJiByZXN1bHQgIT0gRUVYSVNUKQorICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICByYWxsb2Nfc3RyY2F0KCZjdXJyZW50LCAiLyIpOworICAgICAgZGlyID0gc3RydG9rKE5VTEwsICIvIik7CisgICB9CisKKyAgIHJhbGxvY19mcmVlKGN1cnJlbnQpOworICAgZnJlZShjb3B5KTsKKworICAgcmV0dXJuIDA7Cit9CisKKworaW50CittZXNhX3Byb2dyYW1fZGlza2NhY2hlX2luaXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIGNvbnN0IGNoYXIgKnRtcCA9ICIvdG1wIiwgKmNhY2hlX3Jvb3QgPSBOVUxMOworICAgaW50IHJlc3VsdCA9IDA7CisKKyAgIGlmIChjdHgtPkNvbnN0Lk1heFNoYWRlckNhY2hlU2l6ZSA9PSAwKSB7CisgICAgICAvLyBpZiAwIChkZWZhdWx0KSB0aGVuIG5vIGNhY2hlIHdpbGwgYmUgYWN0aXZlCisgICAgICBjdHgtPkJpbmFyeVByb2dyYW1DYWNoZUFjdGl2ZSA9IGZhbHNlOworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICBjYWNoZV9yb290ID0gX21lc2FfZ2V0ZW52KCJYREdfQ0FDSEVfRElSIik7CisgICBpZiAoIWNhY2hlX3Jvb3QpCisgICAgICBjYWNoZV9yb290ID0gX21lc2FfZ2V0ZW52KCJIT01FIik7CisgICBpZiAoIWNhY2hlX3Jvb3QpCisgICAgICBjYWNoZV9yb290ID0gdG1wOworCisgICBhc3ByaW50ZigmY3R4LT5CaW5hcnlQcm9ncmFtQ2FjaGVQYXRoLCAiJXMvLmNhY2hlL21lc2EvcHJvZ3JhbXMiLCBjYWNoZV9yb290KTsKKworICAgc3RydWN0IHN0YXQgc3RhdF9pbmZvOworICAgaWYgKHN0YXQoY3R4LT5CaW5hcnlQcm9ncmFtQ2FjaGVQYXRoLCAmc3RhdF9pbmZvKSAhPSAwKQorICAgICAgcmVzdWx0ID0gbWVzYV9ta2Rpcl9jYWNoZShjdHgtPkJpbmFyeVByb2dyYW1DYWNoZVBhdGgpOworI2lmbmRlZiBfV0lOMzIKKyAgIGVsc2UKKyAgICAgIG1hbmFnZV9jYWNoZV9zaXplKGN0eC0+QmluYXJ5UHJvZ3JhbUNhY2hlUGF0aCwgY3R4LT5Db25zdC5NYXhTaGFkZXJDYWNoZVNpemUpOworI2VuZGlmCisKKyAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgIGN0eC0+QmluYXJ5UHJvZ3JhbUNhY2hlQWN0aXZlID0gdHJ1ZTsKKyAgIGVsc2UKKyAgICAgIGN0eC0+QmluYXJ5UHJvZ3JhbUNhY2hlQWN0aXZlID0gZmFsc2U7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHVpbnQzMl90CitjaGVja3N1bShjb25zdCBjaGFyICpzcmMpCit7CisgICB1aW50MzJfdCBzdW0gPSBfbWVzYV9zdHJfY2hlY2tzdW0oc3JjKTsKKyAgIHVuc2lnbmVkIGk7CisKKyAgIC8qIEFkZCBzb21lIHN1Z2FyIG9uIHRvcCAoYm9ycm93ZWQgZnJvbSBicndfc3RhdGVfY2FjaGUpLiBUaGlzIGlzIG1lYW50CisgICAgKiB0byBjYXRjaCBjYWNoZSBjb2xsaXNpb25zIHdoZW4gdGhlcmUgYXJlIG9ubHkgc21hbGwgY2hhbmdlcyBpbiB0aGUKKyAgICAqIHNvdXJjZSBzdWNoIGFzIG1hdDMgLT4gbWF0NCBpbiBhIHR5cGUgZm9yIGV4YW1wbGUuCisgICAgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBzdHJsZW4oc3JjKTsgaSsrKSB7CisgICAgICBzdW0gXj0gKHVpbnQzMl90KSBzcmNbaV07CisgICAgICBzdW0gPSAoc3VtIDw8IDUpIHwgKHN1bSA+PiAyNyk7CisgICB9CisKKyAgIHJldHVybiBzdW07Cit9CisKKworLyoqCisgKiBBdHRlbXB0IHRvIGdlbmVyYXRlIHVuaXF1ZSBrZXkgZm9yIGEgZ2xfc2hhZGVyX3Byb2dyYW0uCisgKiBUT0RPIC0gdGhpcyBzaG91bGQgYmUgc3Ryb25nZXIgYW5kIGJlIGJhc2VkIG9uIHNvbWUgb2YgdGhlCisgKiBnbF9zaGFkZXJfcHJvZ3JhbSBjb250ZW50LCBub3QganVzdCBzb3VyY2VzLgorICovCitzdGF0aWMgY2hhciAqCitnZW5lcmF0ZV9rZXkoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgY2hhciAqa2V5ID0gcmFsbG9jX3N0cmR1cChwcm9nLCAiIik7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtU2hhZGVyczsgaSsrKSB7CisKKyAgICAgIC8qIE5vIHNvdXJjZSwgbm8ga2V5LiAqLworICAgICAgaWYgKCFwcm9nLT5TaGFkZXJzW2ldLT5Tb3VyY2UpCisgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgLyogQXQgbGVhc3Qgc29tZSBjb250ZW50IHJlcXVpcmVkLiAqLworICAgICAgaWYgKHN0cmNtcChwcm9nLT5TaGFkZXJzW2ldLT5Tb3VyY2UsICIiKSA9PSAwKQorICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIHVpbnQ2NF90IHN1bSA9IGNoZWNrc3VtKHByb2ctPlNoYWRlcnNbaV0tPlNvdXJjZSk7CisKKyAgICAgIGNoYXIgdG1wWzMyXTsKKyAgICAgIF9tZXNhX3NucHJpbnRmKHRtcCwgMzIsICIlbHUiLCBzdW0pOworCisgICAgICByYWxsb2Nfc3RyY2F0KCZrZXksIHRtcCk7CisgICB9CisKKyAgIC8qIEtleSBuZWVkcyB0byBoYXZlIGVub3VnaCBjb250ZW50LiAqLworICAgaWYgKHN0cmxlbihrZXkpIDwgNykgeworICAgICAgcmFsbG9jX2ZyZWUoa2V5KTsKKyAgICAgIGtleSA9IE5VTEw7CisgICB9CisKKyAgIHJldHVybiBrZXk7Cit9CisKKworLyoqCisgKiBDYWNoZSBnbF9zaGFkZXJfcHJvZ3JhbSB0byBkaXNrCisgKi8KK2ludAorbWVzYV9wcm9ncmFtX2Rpc2tjYWNoZV9jYWNoZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCit7CisgICBhc3NlcnQoY3R4KTsKKyAgIGludCByZXN1bHQgPSAtMTsKKyAgIHN0cnVjdCBzdGF0IHN0YXRfaW5mbzsKKyAgIGNoYXIgKmtleTsKKworICAga2V5ID0gZ2VuZXJhdGVfa2V5KHByb2cpOworCisgICBpZiAoIWtleSkKKyAgICAgIHJldHVybiAtMTsKKworICAgLyogR2xhc3N5IHZzLiBPcGFxdWUgY29tcGlsZWQgc2hhZGVycyAqLworICAgcmFsbG9jX3N0cmNhdCgma2V5LCAiLmciKTsKKworICAgY2hhciAqc2hhZGVyX3BhdGggPQorICAgICAgcmFsbG9jX2FzcHJpbnRmKE5VTEwsICIlcy8lcy5iaW4iLCBjdHgtPkJpbmFyeVByb2dyYW1DYWNoZVBhdGgsIGtleSk7CisKKyAgIC8qIENvbGxpc2lvbiwgZG8gbm90IGF0dGVtcHQgdG8gb3ZlcndyaXRlLiAqLworICAgaWYgKHN0YXQoc2hhZGVyX3BhdGgsICZzdGF0X2luZm8pID09IDApCisgICAgICBnb3RvIGNhY2hlX2VwaWxvZ3VlOworCisgICBzaXplX3Qgc2l6ZSA9IDA7CisgICBjaGFyICpkYXRhID0gbWVzYV9wcm9ncmFtX3NlcmlhbGl6ZShjdHgsIHByb2csICZzaXplKTsKKworICAgaWYgKCFkYXRhKQorICAgICAgZ290byBjYWNoZV9lcGlsb2d1ZTsKKworICAgRklMRSAqb3V0ID0gZm9wZW4oc2hhZGVyX3BhdGgsICJ3KyIpOworCisgICBpZiAoIW91dCkKKyAgICAgIGdvdG8gY2FjaGVfZXBpbG9ndWU7CisKKyAgIGZ3cml0ZShkYXRhLCBzaXplLCAxLCBvdXQpOworICAgZmNsb3NlKG91dCk7CisgICBmcmVlKGRhdGEpOworICAgcmVzdWx0ID0gMDsKKworY2FjaGVfZXBpbG9ndWU6CisgICByYWxsb2NfZnJlZShzaGFkZXJfcGF0aCk7CisgICByYWxsb2NfZnJlZShrZXkpOworICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbAorc3VwcG9ydGVkX2J5X3Byb2dyYW1fY2FjaGUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLCBib29sIGlzX3dyaXRlKQoreworICAgLyogTm8gZ2VvbWV0cnkgc2hhZGVyIHN1cHBvcnQuICovCisgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbTUVTQV9TSEFERVJfR0VPTUVUUlldKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBObyB1bmlmb3JtIGJsb2NrIHN1cHBvcnQuICovCisgICBpZiAocHJvZy0+TnVtVW5pZm9ybUJsb2NrcyA+IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIE5vIHRyYW5zZm9ybSBmZWVkYmFjayBzdXBwb3J0LiAqLworICAgaWYgKHByb2ctPlRyYW5zZm9ybUZlZWRiYWNrLk51bVZhcnlpbmcgPiAwKQorICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIFRoZXNlIG1vcmUgZXhwZW5zaXZlIGNoZWNrcyBzaG91bGQgb25seSBiZSBydW4gd2hlbiBnZW5lcmF0aW5nCisgICAgKiB0aGUgY2FjaGUgZW50cnkKKyAgICAqLworICAgaWYgKGlzX3dyaXRlKQorICAgeworICAgICAgLyogVW5pZm9ybSBzdHJ1Y3RzIGFyZSBub3Qgd29ya2luZyAqLworICAgICAgaWYgKHByb2ctPlVuaWZvcm1TdG9yYWdlKSB7CisgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtVXNlclVuaWZvcm1TdG9yYWdlOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjaHIocHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0ubmFtZSwgJy4nKSkgeworICAgICAgICAgICAgICAgLyogVGhlIHVuaWZvcm1zIHN0cnVjdCBmaWVsZHMgaGF2ZSBhbHJlYWR5IGJlZW4gYnJva2VuCisgICAgICAgICAgICAgICAgKiBkb3duIGludG8gdW5pcXVlIHZhcmlhYmxlcywgd2UgaGF2ZSB0byBpbnNwZWN0IHRoZWlyCisgICAgICAgICAgICAgICAgKiBuYW1lcyBhbmQga2ljayBiYWNrIHNpbmNlIHRoZXNlIGFyZW4ndCB3b3JraW5nLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFRoaXMgaXMgbmFzdHkhICBTaG9ydCB0ZXJtIHNvbHV0aW9uIGZvciBjb3JyZWN0bmVzcyEgKi8KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9nLT5OdW1TaGFkZXJzOyBpKyspIHsKKyAgICAgICAgIGlmIChwcm9nLT5TaGFkZXJzW2ldICYmIHByb2ctPlNoYWRlcnNbaV0tPlNvdXJjZSkgeworICAgICAgICAgICAgLyogVGhpcyBvcGNvZGUgaXMgbm90IHN1cHBvcnRlZCBieSBNZXNhSVIgKHlldD8pICovCisgICAgICAgICAgICBpZiAoc3Ryc3RyKHByb2ctPlNoYWRlcnNbaV0tPlNvdXJjZSwgInRleHR1cmVRdWVyeUxldmVscyIpKQorICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBGaWxsIGdsX3NoYWRlcl9wcm9ncmFtIGZyb20gY2FjaGUgaWYgZm91bmQKKyAqLworaW50CittZXNhX3Byb2dyYW1fZGlza2NhY2hlX2ZpbmQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgYXNzZXJ0KGN0eCk7CisgICBpbnQgcmVzdWx0ID0gMDsKKyAgIGNoYXIgKmtleTsKKworICAgLyogRG8gbm90IHVzZSBkaXNrY2FjaGUgd2hlbiBwcm9ncmFtIHJlbGlua3MuIFJlbGlua2luZyBpcyBub3QKKyAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgZHVlIHRvIHRoZSB3YXkgaG93IGNhY2hlIGtleSBnZXRzIGdlbmVyYXRlZC4KKyAgICAqIFdlIHdvdWxkIG5lZWQgdG8gbW9kaWZ5IGtleSBnZW5lcmF0aW9uIHRvIHRha2UgYWNjb3VudCBoYXNodGFibGVzCisgICAgKiBhbmQgcG9zc2libGUgb3RoZXIgZGF0YSBpbiBnbF9zaGFkZXJfcHJvZ3JhbSB0byBjYXRjaCBjaGFuZ2VzIGluCisgICAgKiB0aGUgZGF0YSB1c2VkIGFzIGlucHV0IGZvciBsaW5rZXIgKHJlc3VsdGluZyBpbiBhIGRpZmZlcmVudCBwcm9ncmFtCisgICAgKiB3aXRoIHNhbWUgc291cmNlcykuCisgICAgKi8KKyAgIGlmIChwcm9nLT5fTGlua2VkKQorICAgICAgcmV0dXJuIC0xOworCisgICAvKiBUaGlzIGlzIGhlYXZpZXIgdGhhbiB3ZSdkIGxpa2UsIGJ1dCBzdHJpbmcgY29tcGFyZXMgYXJlCisgICAgKiBpbnN1ZmZpY2llbnQgZm9yIHRoaXMgY2FjaGluZy4gIEl0IGRlcGVuZHMgb24gc3RhdGUgYXMgd2VsbC4KKyAgICAqLworICAgaWYgKCFzdXBwb3J0ZWRfYnlfcHJvZ3JhbV9jYWNoZShwcm9nLCBmYWxzZSAvKiBpc193cml0ZSAqLykpCisgICAgICByZXR1cm4gLTE7CisKKyAgIGtleSA9IGdlbmVyYXRlX2tleShwcm9nKTsKKworICAgaWYgKCFrZXkpCisgICAgICByZXR1cm4gLTE7CisKKyAgIC8qIEdsYXNzeSB2cy4gT3BhcXVlIGNvbXBpbGVkIHNoYWRlcnMgKi8KKyAgIHJhbGxvY19zdHJjYXQoJmtleSwgIi5nIik7CisKKworICAgY2hhciAqc2hhZGVyX3BhdGggPQorICAgICAgcmFsbG9jX2FzcHJpbnRmKE5VTEwsICIlcy8lcy5iaW4iLCBjdHgtPkJpbmFyeVByb2dyYW1DYWNoZVBhdGgsIGtleSk7CisKKyAgIHJlc3VsdCA9IG1lc2FfcHJvZ3JhbV9sb2FkKGN0eCwgcHJvZywgc2hhZGVyX3BhdGgpOworCisgICAvLyBUT0RPOiAgZW5zdXJlIHdlIGRpZCBub3QgZ2V0IGEgZmFsc2UgY2FjaGUgaGl0IGJ5IGNvbXBhcmluZyB0aGUKKyAgIC8vIGluY29taW5nIHN0cmluZ3Mgd2l0aCB3aGF0IHdlIGp1c3QgZGVzZXJpYWxpemVkCisKKyAgIHJhbGxvY19mcmVlKHNoYWRlcl9wYXRoKTsKKyAgIHJhbGxvY19mcmVlKGtleSk7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgc2hhZGVyIHZlcmlvbnMgb2YgcHJvZ3JhbSBjYWNoaW5nIGZ1bmN0aW9ucworICogVGhleSBjb3VsZCBiZSBtb3ZlZCB0byBhbm90aGVyIGZpbGUsIG9yIG1lcmdlZCB3aXRoIHRoZSBwcm9ncmFtIHZlcnNpb24KKyAqIHNpbmNlIHNldmVyYWwgaGF2ZSBsaW5lIG9mIGNvZGUgaW4gY29tbW9uLiAgVGhpcyBoYXNuJ3QgYmVlbiBkb25lIHlldCB0bworICogcHJldmVudCBwcmVtYXR1cmUgb3B0aW1pemF0aW9uLgorICovCisKK2Jvb2wKK3N1cHBvcnRlZF9ieV9zaGFkZXJfY2FjaGUoc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyLCBib29sIGlzX3dyaXRlKQoreworICAgLyogTm8gZ2VvbWV0cnkgc2hhZGVyIHN1cHBvcnQuICovCisgICAvLyBob3cgaGFyZCB0byBhZGQ/CisgICBpZiAoc2hhZGVyLT5TdGFnZSA9PSBNRVNBX1NIQURFUl9HRU9NRVRSWSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgLyogTm8gdW5pZm9ybSBibG9jayBzdXBwb3J0LiAqLworICAgaWYgKHNoYWRlci0+TnVtVW5pZm9ybUJsb2NrcyA+IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBpbnQKK21lc2FfbWtkaXJfc2hhZGVyX2NhY2hlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICBjaGFyICpjb3B5ID0gX21lc2Ffc3RyZHVwKHBhdGgpOworICAgY2hhciAqZGlyID0gc3RydG9rKGNvcHksICIvIik7CisgICBjaGFyICpjdXJyZW50ID0gcmFsbG9jX3N0cmR1cChOVUxMLCAiLyIpOworICAgaW50IHJlc3VsdCA9IDA7CisKKyAgIC8qIEFzIGV4YW1wbGUgbG9vcCBpdGVyYXRlcyBhbmQgY2FsbHMgbWtkaXIgZm9yIGVhY2ggdG9rZW4KKyAgICAqIHNlcGFyYXRlZCBieSAnLycgaW4gIi9ob21lL3lvZ3NvdGhvdGgvLmNhY2hlL21lc2EiLgorICAgICovCisgICB3aGlsZSAoZGlyKSB7CisgICAgICByYWxsb2Nfc3RyY2F0KCZjdXJyZW50LCBkaXIpOworCisgICAgICByZXN1bHQgPSBfbWVzYV9ta2RpcihjdXJyZW50KTsKKworICAgICAgaWYgKHJlc3VsdCAhPSAwICYmIHJlc3VsdCAhPSBFRVhJU1QpCisgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIHJhbGxvY19zdHJjYXQoJmN1cnJlbnQsICIvIik7CisgICAgICBkaXIgPSBzdHJ0b2soTlVMTCwgIi8iKTsKKyAgIH0KKworICAgcmFsbG9jX2ZyZWUoY3VycmVudCk7CisgICBmcmVlKGNvcHkpOworCisgICByZXR1cm4gMDsKK30KKworCisKKy8qIFRoaXMgaXMgYmFzZWQgb24gbWVzYV9wcm9ncmFtX2Rpc2tjYWNoZV9pbml0LAorICogd291bGQgYmUgZ29vZCB0byBtZXJnZSB0aGVtIGF0IHNvbWUgcG9pbnQuCisgKi8KKworaW50CittZXNhX3NoYWRlcl9kaXNrY2FjaGVfaW5pdChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgY29uc3QgY2hhciAqdG1wID0gIi90bXAiLCAqY2FjaGVfcm9vdCA9IE5VTEw7CisgICBpbnQgcmVzdWx0ID0gMDsKKworICAgaWYgKGN0eC0+Q29uc3QuTWF4U2hhZGVyQ2FjaGVTaXplID09IDApIHsKKyAgICAgIC8vIGlmIDAgKGRlZmF1bHQpIHRoZW4gbm8gY2FjaGUgd2lsbCBiZSBhY3RpdmUKKyAgICAgIGN0eC0+QmluYXJ5U2hhZGVyQ2FjaGVBY3RpdmUgPSBmYWxzZTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgY2FjaGVfcm9vdCA9IF9tZXNhX2dldGVudigiWERHX0NBQ0hFX0RJUiIpOworICAgaWYgKCFjYWNoZV9yb290KQorICAgICAgY2FjaGVfcm9vdCA9IF9tZXNhX2dldGVudigiSE9NRSIpOworICAgaWYgKCFjYWNoZV9yb290KQorICAgICAgY2FjaGVfcm9vdCA9IHRtcDsKKworICAgYXNwcmludGYoJmN0eC0+QmluYXJ5U2hhZGVyQ2FjaGVQYXRoLCAiJXMvLmNhY2hlL21lc2Evc2hhZGVycyIsIGNhY2hlX3Jvb3QpOworCisgICBzdHJ1Y3Qgc3RhdCBzdGF0X2luZm87CisgICBpZiAoc3RhdChjdHgtPkJpbmFyeVNoYWRlckNhY2hlUGF0aCwgJnN0YXRfaW5mbykgIT0gMCkKKyAgICAgIHJlc3VsdCA9IG1lc2FfbWtkaXJfc2hhZGVyX2NhY2hlKGN0eC0+QmluYXJ5U2hhZGVyQ2FjaGVQYXRoKTsKKyNpZm5kZWYgX1dJTjMyCisgICBlbHNlCisgICAgICBtYW5hZ2VfY2FjaGVfc2l6ZShjdHgtPkJpbmFyeVNoYWRlckNhY2hlUGF0aCwgY3R4LT5Db25zdC5NYXhTaGFkZXJDYWNoZVNpemUpOworI2VuZGlmCisKKyAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgIGN0eC0+QmluYXJ5U2hhZGVyQ2FjaGVBY3RpdmUgPSB0cnVlOworICAgZWxzZQorICAgICAgY3R4LT5CaW5hcnlTaGFkZXJDYWNoZUFjdGl2ZSA9IGZhbHNlOworCisgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB1aW50MzJfdAorc2hhZGVyX2NoZWNrc3VtKGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgIHVpbnQzMl90IHN1bSA9IF9tZXNhX3N0cl9jaGVja3N1bShzcmMpOworICAgdW5zaWduZWQgaTsKKworICAgLyogQWRkIHNvbWUgc3VnYXIgb24gdG9wIChib3Jyb3dlZCBmcm9tIGJyd19zdGF0ZV9jYWNoZSkuIFRoaXMgaXMgbWVhbnQKKyAgICAqIHRvIGNhdGNoIGNhY2hlIGNvbGxpc2lvbnMgd2hlbiB0aGVyZSBhcmUgb25seSBzbWFsbCBjaGFuZ2VzIGluIHRoZQorICAgICogc291cmNlIHN1Y2ggYXMgbWF0MyAtPiBtYXQ0IGluIGEgdHlwZSBmb3IgZXhhbXBsZS4KKyAgICAqLworICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbihzcmMpOyBpKyspIHsKKyAgICAgIHN1bSBePSAodWludDMyX3QpIHNyY1tpXTsKKyAgICAgIHN1bSA9IChzdW0gPDwgNSkgfCAoc3VtID4+IDI3KTsKKyAgIH0KKworICAgcmV0dXJuIHN1bTsKK30KKworCisvKiBUaGlzIGlzIGJhc2VkIG9uIGdlbmVyYXRlX2tleShwcm9nKSwgd291bGQKKyAqIGJlIGdvb2QgdG8gbWVyZ2UgdGhlbSBhdCBzb21lIHBvaW50LgorICovCitzdGF0aWMgY2hhciAqCitnZW5lcmF0ZV9zaGFkZXJfa2V5KHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcikKK3sKKyAgIGNoYXIgKmtleSA9IHJhbGxvY19zdHJkdXAoc2hhZGVyLCAiIik7CisKKyAgIC8qIE5vIHNvdXJjZSwgbm8ga2V5LiAqLworICAgaWYgKHNoYWRlci0+U291cmNlID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgLyogQXQgbGVhc3Qgc29tZSBjb250ZW50IHJlcXVpcmVkLiAqLworICAgaWYgKHN0cmNtcChzaGFkZXItPlNvdXJjZSwgIiIpID09IDApCisgICAgICByZXR1cm4gTlVMTDsKKworICAgdWludDY0X3Qgc3VtID0gc2hhZGVyX2NoZWNrc3VtKHNoYWRlci0+U291cmNlKTsKKworICAgY2hhciB0bXBbMzJdOworICAgX21lc2Ffc25wcmludGYodG1wLCAzMiwgIiVsdSIsIHN1bSk7CisKKyAgIHJhbGxvY19zdHJjYXQoJmtleSwgdG1wKTsKKworICAgLyogS2V5IG5lZWRzIHRvIGhhdmUgZW5vdWdoIGNvbnRlbnQuICovCisgICBpZiAoc3RybGVuKGtleSkgPCA3KSB7CisgICAgICByYWxsb2NfZnJlZShrZXkpOworICAgICAga2V5ID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIGtleTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZSBnbF9zaGFkZXIgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBnbF9zaGFkZXIgKgorbWVzYV9zaGFkZXJfZGVzZXJpYWxpemUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCkKK3sKKyAgIHJldHVybiByZWFkX3NpbmdsZV9zaGFkZXIoY3R4LCBzaGFkZXIsIHBhdGgpOworfQorCisKK2ludAorbWVzYV9zaGFkZXJfbG9hZChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisKKyAgIHN0cnVjdCBnbF9zaGFkZXIgKnJlc3VsdCA9IG1lc2Ffc2hhZGVyX2Rlc2VyaWFsaXplKGN0eCwgc2hhZGVyLCBwYXRoKTsKKworICAgaWYgKHJlc3VsdCkKKyAgICAgcmV0dXJuIDA7CisgICBlbHNlCisgICAgIHJldHVybiBNRVNBX1NIQURFUl9ERVNFUklBTElaRV9SRUFEX0VSUk9SOworfQorCisvKgorICogVGhpcyBpcyBiYXNlZCBvbiBtZXNhX3Byb2dyYW1fZGlza2NhY2hlX2NhY2hlLCB3b3VsZCBiZSBnb29kIHRvCisgKiBtZXJnZSB0aGVtIGF0IHNvbWUgcG9pbnQuCisgKi8KK2ludAorbWVzYV9zaGFkZXJfZGlza2NhY2hlX2NhY2hlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcikKK3sKKyAgIGFzc2VydChjdHgpOworICAgaW50IHJlc3VsdCA9IC0xOworICAgc3RydWN0IHN0YXQgc3RhdF9pbmZvOworICAgY2hhciAqa2V5OworICAgc2l6ZV90IHNpemUgPSAwOworCisgICBrZXkgPSBnZW5lcmF0ZV9zaGFkZXJfa2V5KHNoYWRlcik7CisKKyAgIGlmICgha2V5KQorICAgICAgcmV0dXJuIC0xOworCisgICAvKiBHbGFzc3kgdnMuIE9wYXF1ZSBjb21waWxlZCBzaGFkZXJzICovCisgICByYWxsb2Nfc3RyY2F0KCZrZXksICIuZyIpOworCisgICBjaGFyICpzaGFkZXJfcGF0aCA9CisgICAgICByYWxsb2NfYXNwcmludGYoTlVMTCwgIiVzLyVzLmJpbiIsIGN0eC0+QmluYXJ5U2hhZGVyQ2FjaGVQYXRoLCBrZXkpOworCisgICBjaGFyICpkYXRhID0gTlVMTDsKKyAgIEZJTEUgKm91dCA9IE5VTEw7CisKKyAgIC8qIENvbGxpc2lvbiwgZG8gbm90IGF0dGVtcHQgdG8gb3ZlcndyaXRlLiAqLworICAgaWYgKHN0YXQoc2hhZGVyX3BhdGgsICZzdGF0X2luZm8pID09IDApCisgICAgICBnb3RvIGNhY2hlX2VwaWxvZ3VlOworCisgICBkYXRhID0gbWVzYV9zaGFkZXJfc2VyaWFsaXplKGN0eCwgc2hhZGVyLCAmc2l6ZSwgdHJ1ZSAvKiBzaGFkZXJfb25seSAqLyk7CisKKyAgIGlmICghZGF0YSkKKyAgICAgIGdvdG8gY2FjaGVfZXBpbG9ndWU7CisKKyAgIG91dCA9IGZvcGVuKHNoYWRlcl9wYXRoLCAidysiKTsKKworICAgaWYgKCFvdXQpCisgICAgICBnb3RvIGNhY2hlX2VwaWxvZ3VlOworCisgICBmd3JpdGUoZGF0YSwgc2l6ZSwgMSwgb3V0KTsKKyAgIGZjbG9zZShvdXQpOworICAgZnJlZShkYXRhKTsKKyAgIHJlc3VsdCA9IDA7CisKK2NhY2hlX2VwaWxvZ3VlOgorICAgcmFsbG9jX2ZyZWUoc2hhZGVyX3BhdGgpOworICAgcmFsbG9jX2ZyZWUoa2V5KTsKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisvKiBUaGlzIGlzIGJhc2VkIG9uIG1lc2FfcHJvZ3JhbV9kaXNrY2FjaGVfZmluZCwgd291bGQgYmUgZ29vZCB0bworICogbWVyZ2UgdGhlbSBhdCBzb21lIHBvaW50LgorICovCitpbnQKK21lc2Ffc2hhZGVyX2Rpc2tjYWNoZV9maW5kKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcikKK3sKKyAgIGludCByZXN1bHQgPSAwOworICAgY2hhciAqa2V5OworCisgICAvKiBEb24ndCBsb29rdXAgaWYgYWxyZWFkeSBjb21waWxlZC4gKi8KKyAgIGlmIChzaGFkZXItPkNvbXBpbGVTdGF0dXMpCisgICAgICByZXR1cm4gLTE7CisKKyAgIC8qIFRoaXMgaXMgaGVhdmllciB0aGFuIHdlJ2QgbGlrZSwgYnV0IHN0cmluZyBjb21wYXJlcyBhcmUKKyAgICAqIGluc3VmZmljaWVudCBmb3IgdGhpcyBjYWNoaW5nLiAgSXQgZGVwZW5kcyBvbiBzdGF0ZSBhcyB3ZWxsLgorICAgICovCisgICBpZiAoIXN1cHBvcnRlZF9ieV9zaGFkZXJfY2FjaGUoc2hhZGVyLCBmYWxzZSAvKiBpc193cml0ZSAqLykpCisgICAgICByZXR1cm4gLTE7CisKKyAgIGtleSA9IGdlbmVyYXRlX3NoYWRlcl9rZXkoc2hhZGVyKTsKKworICAgaWYgKCFrZXkpCisgICAgICByZXR1cm4gLTE7CisKKyAgIC8qIEdsYXNzeSB2cy4gT3BhcXVlIGNvbXBpbGVkIHNoYWRlcnMgKi8KKyAgIHJhbGxvY19zdHJjYXQoJmtleSwgIi5nIik7CisKKyAgIGNoYXIgKnNoYWRlcl9wYXRoID0KKyAgICAgIHJhbGxvY19hc3ByaW50ZihOVUxMLCAiJXMvJXMuYmluIiwgY3R4LT5CaW5hcnlTaGFkZXJDYWNoZVBhdGgsIGtleSk7CisKKyAgIHJlc3VsdCA9IG1lc2Ffc2hhZGVyX2xvYWQoY3R4LCBzaGFkZXIsIHNoYWRlcl9wYXRoKTsKKworICAgLy8gVE9ETzogIGVuc3VyZSB3ZSBkaWQgbm90IGdldCBhIGZhbHNlIGNhY2hlIGhpdCBieSBjb21wYXJpbmcgdGhlCisgICAvLyBpbmNvbWluZyBzdHJpbmcgd2l0aCB3aGF0IHdlIGp1c3QgZGVzZXJpYWxpemVkCisKKyAgIHJhbGxvY19mcmVlKHNoYWRlcl9wYXRoKTsKKyAgIHJhbGxvY19mcmVlKGtleSk7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfZGlza2NhY2hlLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfZGlza2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzOTczYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19kaXNrY2FjaGUuaApAQCAtMCwwICsxLDU3IEBACisvKiAtKi0gYyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgUFJPR1JBTV9ESVNLQ0FDSEVfSAorI2RlZmluZSBQUk9HUkFNX0RJU0tDQUNIRV9ICisKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2ludAorbWVzYV9wcm9ncmFtX2Rpc2tjYWNoZV9pbml0KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCitpbnQKK21lc2FfcHJvZ3JhbV9kaXNrY2FjaGVfY2FjaGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKKworaW50CittZXNhX3Byb2dyYW1fZGlza2NhY2hlX2ZpbmQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuIGludAorbWVzYV9zaGFkZXJfZGlza2NhY2hlX2ZpbmQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyKTsKKworZXh0ZXJuIGludAorbWVzYV9zaGFkZXJfZGlza2NhY2hlX2NhY2hlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcik7CisKK2ludAorbWVzYV9zaGFkZXJfZGlza2NhY2hlX2luaXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQUk9HUkFNX0RJU0tDQUNIRV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfZXhlY3V0ZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2V4ZWN1dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTU1MjVlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2V4ZWN1dGUuYwpAQCAtMCwwICsxLDE2NzkgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDggIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBwcm9nX2V4ZWN1dGUuYworICogU29mdHdhcmUgaW50ZXJwcmV0ZXIgZm9yIHZlcnRleC9mcmFnbWVudCBwcm9ncmFtcy4KKyAqIFxhdXRob3IgQnJpYW4gUGF1bAorICovCisKKy8qCisgKiBOT1RFOiB3ZSBkbyBldmVyeXRoaW5nIGluIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQ7IHdlIGRvbid0CisgKiBjdXJyZW50bHkgb2JzZXJ2ZSB0aGUgc2luZ2xlL2hhbGYvZml4ZWQtcHJlY2lzaW9uIHF1YWxpZmllcnMuCisgKgorICovCisKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2NvbG9ybWFjLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJwcm9nX2V4ZWN1dGUuaCIKKyNpbmNsdWRlICJwcm9nX2luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAicHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJwcm9nX3ByaW50LmgiCisjaW5jbHVkZSAicHJvZ19ub2lzZS5oIgorCisKKy8qIGRlYnVnIHByZWRpY2F0ZSAqLworI2RlZmluZSBERUJVR19QUk9HIDAKKworCisvKioKKyAqIFNldCB4IHRvIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGluZmluaXR5LgorICovCisjaWYgZGVmaW5lZChVU0VfSUVFRSkgfHwgZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIFNFVF9QT1NfSU5GSU5JVFkoeCkgICAgICAgICAgICAgICAgICBcCisgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBmaV90eXBlIGZpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBmaS5pID0gMHg3RjgwMDAwMDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB4ID0gZmkuZjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9IHdoaWxlICgwKQorI2RlZmluZSBTRVRfTkVHX0lORklOSVRZKHgpICAgICAgICAgICAgICAgICAgXAorICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZmlfdHlwZSBmaTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZmkuaSA9IDB4RkY4MDAwMDA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgeCA9IGZpLmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFNFVF9QT1NfSU5GSU5JVFkoeCkgIHggPSAoR0xmbG9hdCkgSFVHRV9WQUwKKyNkZWZpbmUgU0VUX05FR19JTkZJTklUWSh4KSAgeCA9IChHTGZsb2F0KSAtSFVHRV9WQUwKKyNlbmRpZgorCisjZGVmaW5lIFNFVF9GTE9BVF9CSVRTKHgsIGJpdHMpICgoZmlfdHlwZSAqKSAodm9pZCAqKSAmKHgpKS0+aSA9IGJpdHMKKworCitzdGF0aWMgY29uc3QgR0xmbG9hdCBaZXJvVmVjWzRdID0geyAwLjBGLCAwLjBGLCAwLjBGLCAwLjBGIH07CisKKworLyoqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSA0LWVsZW1lbnQgZmxvYXQgdmVjdG9yIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4KKyAqIHNvdXJjZSByZWdpc3Rlci4KKyAqLworc3RhdGljIGlubGluZSBjb25zdCBHTGZsb2F0ICoKK2dldF9zcmNfcmVnaXN0ZXJfcG9pbnRlcihjb25zdCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbV9tYWNoaW5lICptYWNoaW5lKQoreworICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cgPSBtYWNoaW5lLT5DdXJQcm9ncmFtOworICAgR0xpbnQgcmVnID0gc291cmNlLT5JbmRleDsKKworICAgaWYgKHNvdXJjZS0+UmVsQWRkcikgeworICAgICAgLyogYWRkIGFkZHJlc3MgcmVnaXN0ZXIgdmFsdWUgdG8gc3JjIGluZGV4L29mZnNldCAqLworICAgICAgcmVnICs9IG1hY2hpbmUtPkFkZHJlc3NSZWdbMF1bMF07CisgICAgICBpZiAocmVnIDwgMCkgeworICAgICAgICAgcmV0dXJuIFplcm9WZWM7CisgICAgICB9CisgICB9CisKKyAgIHN3aXRjaCAoc291cmNlLT5GaWxlKSB7CisgICBjYXNlIFBST0dSQU1fVEVNUE9SQVJZOgorICAgICAgaWYgKHJlZyA+PSBNQVhfUFJPR1JBTV9URU1QUykKKyAgICAgICAgIHJldHVybiBaZXJvVmVjOworICAgICAgcmV0dXJuIG1hY2hpbmUtPlRlbXBvcmFyaWVzW3JlZ107CisKKyAgIGNhc2UgUFJPR1JBTV9JTlBVVDoKKyAgICAgIGlmIChwcm9nLT5UYXJnZXQgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCKSB7CisgICAgICAgICBpZiAocmVnID49IFZFUlRfQVRUUklCX01BWCkKKyAgICAgICAgICAgIHJldHVybiBaZXJvVmVjOworICAgICAgICAgcmV0dXJuIG1hY2hpbmUtPlZlcnRBdHRyaWJzW3JlZ107CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIGlmIChyZWcgPj0gVkFSWUlOR19TTE9UX01BWCkKKyAgICAgICAgICAgIHJldHVybiBaZXJvVmVjOworICAgICAgICAgcmV0dXJuIG1hY2hpbmUtPkF0dHJpYnNbcmVnXVttYWNoaW5lLT5DdXJFbGVtZW50XTsKKyAgICAgIH0KKworICAgY2FzZSBQUk9HUkFNX09VVFBVVDoKKyAgICAgIGlmIChyZWcgPj0gTUFYX1BST0dSQU1fT1VUUFVUUykKKyAgICAgICAgIHJldHVybiBaZXJvVmVjOworICAgICAgcmV0dXJuIG1hY2hpbmUtPk91dHB1dHNbcmVnXTsKKworICAgY2FzZSBQUk9HUkFNX1NUQVRFX1ZBUjoKKyAgICAgIC8qIEZhbGx0aHJvdWdoICovCisgICBjYXNlIFBST0dSQU1fQ09OU1RBTlQ6CisgICAgICAvKiBGYWxsdGhyb3VnaCAqLworICAgY2FzZSBQUk9HUkFNX1VOSUZPUk06CisgICAgICBpZiAocmVnID49IChHTGludCkgcHJvZy0+UGFyYW1ldGVycy0+TnVtUGFyYW1ldGVycykKKyAgICAgICAgIHJldHVybiBaZXJvVmVjOworICAgICAgcmV0dXJuIChHTGZsb2F0ICopIHByb2ctPlBhcmFtZXRlcnMtPlBhcmFtZXRlclZhbHVlc1tyZWddOworCisgICBjYXNlIFBST0dSQU1fU1lTVEVNX1ZBTFVFOgorICAgICAgYXNzZXJ0KHJlZyA8IEVsZW1lbnRzKG1hY2hpbmUtPlN5c3RlbVZhbHVlcykpOworICAgICAgcmV0dXJuIG1hY2hpbmUtPlN5c3RlbVZhbHVlc1tyZWddOworCisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShOVUxMLAorICAgICAgICAgIkludmFsaWQgc3JjIHJlZ2lzdGVyIGZpbGUgJWQgaW4gZ2V0X3NyY19yZWdpc3Rlcl9wb2ludGVyKCkiLAorICAgICAgICAgc291cmNlLT5GaWxlKTsKKyAgICAgIHJldHVybiBaZXJvVmVjOworICAgfQorfQorCisKKy8qKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgNC1lbGVtZW50IGZsb2F0IHZlY3RvciBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuCisgKiBkZXN0aW5hdGlvbiByZWdpc3Rlci4KKyAqLworc3RhdGljIGlubGluZSBHTGZsb2F0ICoKK2dldF9kc3RfcmVnaXN0ZXJfcG9pbnRlcihjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW1fbWFjaGluZSAqbWFjaGluZSkKK3sKKyAgIHN0YXRpYyBHTGZsb2F0IGR1bW15UmVnWzRdOworICAgR0xpbnQgcmVnID0gZGVzdC0+SW5kZXg7CisKKyAgIGlmIChkZXN0LT5SZWxBZGRyKSB7CisgICAgICAvKiBhZGQgYWRkcmVzcyByZWdpc3RlciB2YWx1ZSB0byBzcmMgaW5kZXgvb2Zmc2V0ICovCisgICAgICByZWcgKz0gbWFjaGluZS0+QWRkcmVzc1JlZ1swXVswXTsKKyAgICAgIGlmIChyZWcgPCAwKSB7CisgICAgICAgICByZXR1cm4gZHVtbXlSZWc7CisgICAgICB9CisgICB9CisKKyAgIHN3aXRjaCAoZGVzdC0+RmlsZSkgeworICAgY2FzZSBQUk9HUkFNX1RFTVBPUkFSWToKKyAgICAgIGlmIChyZWcgPj0gTUFYX1BST0dSQU1fVEVNUFMpCisgICAgICAgICByZXR1cm4gZHVtbXlSZWc7CisgICAgICByZXR1cm4gbWFjaGluZS0+VGVtcG9yYXJpZXNbcmVnXTsKKworICAgY2FzZSBQUk9HUkFNX09VVFBVVDoKKyAgICAgIGlmIChyZWcgPj0gTUFYX1BST0dSQU1fT1VUUFVUUykKKyAgICAgICAgIHJldHVybiBkdW1teVJlZzsKKyAgICAgIHJldHVybiBtYWNoaW5lLT5PdXRwdXRzW3JlZ107CisKKyAgIGRlZmF1bHQ6CisgICAgICBfbWVzYV9wcm9ibGVtKE5VTEwsCisgICAgICAgICAiSW52YWxpZCBkZXN0IHJlZ2lzdGVyIGZpbGUgJWQgaW4gZ2V0X2RzdF9yZWdpc3Rlcl9wb2ludGVyKCkiLAorICAgICAgICAgZGVzdC0+RmlsZSk7CisgICAgICByZXR1cm4gZHVtbXlSZWc7CisgICB9Cit9CisKKworCisvKioKKyAqIEZldGNoIGEgNC1lbGVtZW50IGZsb2F0IHZlY3RvciBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgcmVnaXN0ZXIuCisgKiBBcHBseSBzd2l6emxpbmcgYW5kIG5lZ2F0aW5nIGFzIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK2ZldGNoX3ZlY3RvcjQoY29uc3Qgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpzb3VyY2UsCisgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX21hY2hpbmUgKm1hY2hpbmUsIEdMZmxvYXQgcmVzdWx0WzRdKQoreworICAgY29uc3QgR0xmbG9hdCAqc3JjID0gZ2V0X3NyY19yZWdpc3Rlcl9wb2ludGVyKHNvdXJjZSwgbWFjaGluZSk7CisKKyAgIGlmIChzb3VyY2UtPlN3aXp6bGUgPT0gU1dJWlpMRV9OT09QKSB7CisgICAgICAvKiBubyBzd2l6emxpbmcgKi8KKyAgICAgIENPUFlfNFYocmVzdWx0LCBzcmMpOworICAgfQorICAgZWxzZSB7CisgICAgICBBU1NFUlQoR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDApIDw9IDMpOworICAgICAgQVNTRVJUKEdFVF9TV1ooc291cmNlLT5Td2l6emxlLCAxKSA8PSAzKTsKKyAgICAgIEFTU0VSVChHRVRfU1daKHNvdXJjZS0+U3dpenpsZSwgMikgPD0gMyk7CisgICAgICBBU1NFUlQoR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDMpIDw9IDMpOworICAgICAgcmVzdWx0WzBdID0gc3JjW0dFVF9TV1ooc291cmNlLT5Td2l6emxlLCAwKV07CisgICAgICByZXN1bHRbMV0gPSBzcmNbR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDEpXTsKKyAgICAgIHJlc3VsdFsyXSA9IHNyY1tHRVRfU1daKHNvdXJjZS0+U3dpenpsZSwgMildOworICAgICAgcmVzdWx0WzNdID0gc3JjW0dFVF9TV1ooc291cmNlLT5Td2l6emxlLCAzKV07CisgICB9CisKKyAgIGlmIChzb3VyY2UtPkFicykgeworICAgICAgcmVzdWx0WzBdID0gRkFCU0YocmVzdWx0WzBdKTsKKyAgICAgIHJlc3VsdFsxXSA9IEZBQlNGKHJlc3VsdFsxXSk7CisgICAgICByZXN1bHRbMl0gPSBGQUJTRihyZXN1bHRbMl0pOworICAgICAgcmVzdWx0WzNdID0gRkFCU0YocmVzdWx0WzNdKTsKKyAgIH0KKyAgIGlmIChzb3VyY2UtPk5lZ2F0ZSkgeworICAgICAgQVNTRVJUKHNvdXJjZS0+TmVnYXRlID09IE5FR0FURV9YWVpXKTsKKyAgICAgIHJlc3VsdFswXSA9IC1yZXN1bHRbMF07CisgICAgICByZXN1bHRbMV0gPSAtcmVzdWx0WzFdOworICAgICAgcmVzdWx0WzJdID0gLXJlc3VsdFsyXTsKKyAgICAgIHJlc3VsdFszXSA9IC1yZXN1bHRbM107CisgICB9CisKKyNpZmRlZiBOQU5fQ0hFQ0sKKyAgIGFzc2VydCghSVNfSU5GX09SX05BTihyZXN1bHRbMF0pKTsKKyAgIGFzc2VydCghSVNfSU5GX09SX05BTihyZXN1bHRbMF0pKTsKKyAgIGFzc2VydCghSVNfSU5GX09SX05BTihyZXN1bHRbMF0pKTsKKyAgIGFzc2VydCghSVNfSU5GX09SX05BTihyZXN1bHRbMF0pKTsKKyNlbmRpZgorfQorCisKKy8qKgorICogRmV0Y2ggdGhlIGRlcml2YXRpdmUgd2l0aCByZXNwZWN0IHRvIFggb3IgWSBmb3IgdGhlIGdpdmVuIHJlZ2lzdGVyLgorICogWFhYIHRoaXMgY3VycmVudGx5IG9ubHkgd29ya3MgZm9yIGZyYWdtZW50IHByb2dyYW0gaW5wdXQgYXR0cmlicy4KKyAqLworc3RhdGljIHZvaWQKK2ZldGNoX3ZlY3RvcjRfZGVyaXYoc3RydWN0IGdsX2NvbnRleHQgKiBjdHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbV9tYWNoaW5lICptYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICBjaGFyIHhPclksIEdMZmxvYXQgcmVzdWx0WzRdKQoreworICAgaWYgKHNvdXJjZS0+RmlsZSA9PSBQUk9HUkFNX0lOUFVUICYmCisgICAgICAgc291cmNlLT5JbmRleCA8IChHTGludCkgbWFjaGluZS0+TnVtRGVyaXYpIHsKKyAgICAgIGNvbnN0IEdMaW50IGNvbCA9IG1hY2hpbmUtPkN1ckVsZW1lbnQ7CisgICAgICBjb25zdCBHTGZsb2F0IHcgPSBtYWNoaW5lLT5BdHRyaWJzW1ZBUllJTkdfU0xPVF9QT1NdW2NvbF1bM107CisgICAgICBjb25zdCBHTGZsb2F0IGludlEgPSAxLjBmIC8gdzsKKyAgICAgIEdMZmxvYXQgZGVyaXZbNF07CisKKyAgICAgIGlmICh4T3JZID09ICdYJykgeworICAgICAgICAgZGVyaXZbMF0gPSBtYWNoaW5lLT5EZXJpdlhbc291cmNlLT5JbmRleF1bMF0gKiBpbnZROworICAgICAgICAgZGVyaXZbMV0gPSBtYWNoaW5lLT5EZXJpdlhbc291cmNlLT5JbmRleF1bMV0gKiBpbnZROworICAgICAgICAgZGVyaXZbMl0gPSBtYWNoaW5lLT5EZXJpdlhbc291cmNlLT5JbmRleF1bMl0gKiBpbnZROworICAgICAgICAgZGVyaXZbM10gPSBtYWNoaW5lLT5EZXJpdlhbc291cmNlLT5JbmRleF1bM10gKiBpbnZROworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBkZXJpdlswXSA9IG1hY2hpbmUtPkRlcml2WVtzb3VyY2UtPkluZGV4XVswXSAqIGludlE7CisgICAgICAgICBkZXJpdlsxXSA9IG1hY2hpbmUtPkRlcml2WVtzb3VyY2UtPkluZGV4XVsxXSAqIGludlE7CisgICAgICAgICBkZXJpdlsyXSA9IG1hY2hpbmUtPkRlcml2WVtzb3VyY2UtPkluZGV4XVsyXSAqIGludlE7CisgICAgICAgICBkZXJpdlszXSA9IG1hY2hpbmUtPkRlcml2WVtzb3VyY2UtPkluZGV4XVszXSAqIGludlE7CisgICAgICB9CisKKyAgICAgIHJlc3VsdFswXSA9IGRlcml2W0dFVF9TV1ooc291cmNlLT5Td2l6emxlLCAwKV07CisgICAgICByZXN1bHRbMV0gPSBkZXJpdltHRVRfU1daKHNvdXJjZS0+U3dpenpsZSwgMSldOworICAgICAgcmVzdWx0WzJdID0gZGVyaXZbR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDIpXTsKKyAgICAgIHJlc3VsdFszXSA9IGRlcml2W0dFVF9TV1ooc291cmNlLT5Td2l6emxlLCAzKV07CisgICAgICAKKyAgICAgIGlmIChzb3VyY2UtPkFicykgeworICAgICAgICAgcmVzdWx0WzBdID0gRkFCU0YocmVzdWx0WzBdKTsKKyAgICAgICAgIHJlc3VsdFsxXSA9IEZBQlNGKHJlc3VsdFsxXSk7CisgICAgICAgICByZXN1bHRbMl0gPSBGQUJTRihyZXN1bHRbMl0pOworICAgICAgICAgcmVzdWx0WzNdID0gRkFCU0YocmVzdWx0WzNdKTsKKyAgICAgIH0KKyAgICAgIGlmIChzb3VyY2UtPk5lZ2F0ZSkgeworICAgICAgICAgQVNTRVJUKHNvdXJjZS0+TmVnYXRlID09IE5FR0FURV9YWVpXKTsKKyAgICAgICAgIHJlc3VsdFswXSA9IC1yZXN1bHRbMF07CisgICAgICAgICByZXN1bHRbMV0gPSAtcmVzdWx0WzFdOworICAgICAgICAgcmVzdWx0WzJdID0gLXJlc3VsdFsyXTsKKyAgICAgICAgIHJlc3VsdFszXSA9IC1yZXN1bHRbM107CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIEFTU0lHTl80VihyZXN1bHQsIDAuMCwgMC4wLCAwLjAsIDAuMCk7CisgICB9Cit9CisKKworLyoqCisgKiBBcyBhYm92ZSwgYnV0IG9ubHkgcmV0dXJuIHJlc3VsdFswXSBlbGVtZW50LgorICovCitzdGF0aWMgdm9pZAorZmV0Y2hfdmVjdG9yMShjb25zdCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKnNvdXJjZSwKKyAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fbWFjaGluZSAqbWFjaGluZSwgR0xmbG9hdCByZXN1bHRbNF0pCit7CisgICBjb25zdCBHTGZsb2F0ICpzcmMgPSBnZXRfc3JjX3JlZ2lzdGVyX3BvaW50ZXIoc291cmNlLCBtYWNoaW5lKTsKKworICAgcmVzdWx0WzBdID0gc3JjW0dFVF9TV1ooc291cmNlLT5Td2l6emxlLCAwKV07CisKKyAgIGlmIChzb3VyY2UtPkFicykgeworICAgICAgcmVzdWx0WzBdID0gRkFCU0YocmVzdWx0WzBdKTsKKyAgIH0KKyAgIGlmIChzb3VyY2UtPk5lZ2F0ZSkgeworICAgICAgcmVzdWx0WzBdID0gLXJlc3VsdFswXTsKKyAgIH0KK30KKworCitzdGF0aWMgR0x1aW50CitmZXRjaF92ZWN0b3IxdWkoY29uc3Qgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpzb3VyY2UsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fbWFjaGluZSAqbWFjaGluZSkKK3sKKyAgIGNvbnN0IEdMdWludCAqc3JjID0gKEdMdWludCAqKSBnZXRfc3JjX3JlZ2lzdGVyX3BvaW50ZXIoc291cmNlLCBtYWNoaW5lKTsKKyAgIHJldHVybiBzcmNbR0VUX1NXWihzb3VyY2UtPlN3aXp6bGUsIDApXTsKK30KKworCisvKioKKyAqIEZldGNoIHRleGVsIGZyb20gdGV4dHVyZS4gIFVzZSBwYXJ0aWFsIGRlcml2YXRpdmVzIHdoZW4gcG9zc2libGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZmV0Y2hfdGV4ZWwoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX21hY2hpbmUgKm1hY2hpbmUsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgdGV4Y29vcmRbNF0sIEdMZmxvYXQgbG9kQmlhcywKKyAgICAgICAgICAgIEdMZmxvYXQgY29sb3JbNF0pCit7CisgICBjb25zdCBHTHVpbnQgdW5pdCA9IG1hY2hpbmUtPlNhbXBsZXJzW2luc3QtPlRleFNyY1VuaXRdOworCisgICAvKiBOb3RlOiB3ZSBvbmx5IGhhdmUgdGhlIHJpZ2h0IGRlcml2YXRpdmVzIGZvciBmcmFnbWVudCBpbnB1dCBhdHRyaWJzLgorICAgICovCisgICBpZiAobWFjaGluZS0+TnVtRGVyaXYgPiAwICYmCisgICAgICAgaW5zdC0+U3JjUmVnWzBdLkZpbGUgPT0gUFJPR1JBTV9JTlBVVCAmJgorICAgICAgIGluc3QtPlNyY1JlZ1swXS5JbmRleCA9PSBWQVJZSU5HX1NMT1RfVEVYMCArIGluc3QtPlRleFNyY1VuaXQpIHsKKyAgICAgIC8qIHNpbXBsZSB0ZXh0dXJlIGZldGNoIGZvciB3aGljaCB3ZSBzaG91bGQgaGF2ZSBkZXJpdmF0aXZlcyAqLworICAgICAgR0x1aW50IGF0dHIgPSBpbnN0LT5TcmNSZWdbMF0uSW5kZXg7CisgICAgICBtYWNoaW5lLT5GZXRjaFRleGVsRGVyaXYoY3R4LCB0ZXhjb29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lLT5EZXJpdlhbYXR0cl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZS0+RGVyaXZZW2F0dHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZEJpYXMsIHVuaXQsIGNvbG9yKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgbWFjaGluZS0+RmV0Y2hUZXhlbExvZChjdHgsIHRleGNvb3JkLCBsb2RCaWFzLCB1bml0LCBjb2xvcik7CisgICB9Cit9CisKKworLyoqCisgKiBUZXN0IHZhbHVlIGFnYWluc3QgemVybyBhbmQgcmV0dXJuIEdULCBMVCwgRVEgb3IgVU4gaWYgTmFOLgorICovCitzdGF0aWMgaW5saW5lIEdMdWludAorZ2VuZXJhdGVfY2MoZmxvYXQgdmFsdWUpCit7CisgICBpZiAodmFsdWUgIT0gdmFsdWUpCisgICAgICByZXR1cm4gQ09ORF9VTjsgICAgICAgICAgIC8qIE5hTiAqLworICAgaWYgKHZhbHVlID4gMC4wRikKKyAgICAgIHJldHVybiBDT05EX0dUOworICAgaWYgKHZhbHVlIDwgMC4wRikKKyAgICAgIHJldHVybiBDT05EX0xUOworICAgcmV0dXJuIENPTkRfRVE7Cit9CisKKworLyoqCisgKiBUZXN0IGlmIHRoZSBjY01hc2tSdWxlIGlzIHNhdGlzZmllZCBieSB0aGUgZ2l2ZW4gY29uZGl0aW9uIGNvZGUuCisgKiBVc2VkIHRvIG1hc2sgZGVzdGluYXRpb24gd3JpdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25kaXRpb24gY29kZS4KKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK3Rlc3RfY2MoR0x1aW50IGNvbmRDb2RlLCBHTHVpbnQgY2NNYXNrUnVsZSkKK3sKKyAgIHN3aXRjaCAoY2NNYXNrUnVsZSkgeworICAgY2FzZSBDT05EX0VROiByZXR1cm4gKGNvbmRDb2RlID09IENPTkRfRVEpOworICAgY2FzZSBDT05EX05FOiByZXR1cm4gKGNvbmRDb2RlICE9IENPTkRfRVEpOworICAgY2FzZSBDT05EX0xUOiByZXR1cm4gKGNvbmRDb2RlID09IENPTkRfTFQpOworICAgY2FzZSBDT05EX0dFOiByZXR1cm4gKGNvbmRDb2RlID09IENPTkRfR1QgfHwgY29uZENvZGUgPT0gQ09ORF9FUSk7CisgICBjYXNlIENPTkRfTEU6IHJldHVybiAoY29uZENvZGUgPT0gQ09ORF9MVCB8fCBjb25kQ29kZSA9PSBDT05EX0VRKTsKKyAgIGNhc2UgQ09ORF9HVDogcmV0dXJuIChjb25kQ29kZSA9PSBDT05EX0dUKTsKKyAgIGNhc2UgQ09ORF9UUjogcmV0dXJuIEdMX1RSVUU7CisgICBjYXNlIENPTkRfRkw6IHJldHVybiBHTF9GQUxTRTsKKyAgIGRlZmF1bHQ6ICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9Cit9CisKKworLyoqCisgKiBFdmFsdWF0ZSB0aGUgNCBjb25kaXRpb24gY29kZXMgYWdhaW5zdCBhIHByZWRpY2F0ZSBhbmQgcmV0dXJuIEdMX1RSVUUKKyAqIG9yIEdMX0ZBTFNFIHRvIGluZGljYXRlIHJlc3VsdC4KKyAqLworc3RhdGljIGlubGluZSBHTGJvb2xlYW4KK2V2YWxfY29uZGl0aW9uKGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX21hY2hpbmUgKm1hY2hpbmUsCisgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgIGNvbnN0IEdMdWludCBzd2l6emxlID0gaW5zdC0+RHN0UmVnLkNvbmRTd2l6emxlOworICAgY29uc3QgR0x1aW50IGNvbmRNYXNrID0gaW5zdC0+RHN0UmVnLkNvbmRNYXNrOworICAgaWYgKHRlc3RfY2MobWFjaGluZS0+Q29uZENvZGVzW0dFVF9TV1ooc3dpenpsZSwgMCldLCBjb25kTWFzaykgfHwKKyAgICAgICB0ZXN0X2NjKG1hY2hpbmUtPkNvbmRDb2Rlc1tHRVRfU1daKHN3aXp6bGUsIDEpXSwgY29uZE1hc2spIHx8CisgICAgICAgdGVzdF9jYyhtYWNoaW5lLT5Db25kQ29kZXNbR0VUX1NXWihzd2l6emxlLCAyKV0sIGNvbmRNYXNrKSB8fAorICAgICAgIHRlc3RfY2MobWFjaGluZS0+Q29uZENvZGVzW0dFVF9TV1ooc3dpenpsZSwgMyldLCBjb25kTWFzaykpIHsKKyAgICAgIHJldHVybiBHTF9UUlVFOworICAgfQorICAgZWxzZSB7CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9Cit9CisKKworCisvKioKKyAqIFN0b3JlIDQgZmxvYXRzIGludG8gYSByZWdpc3Rlci4gIE9ic2VydmUgdGhlIGluc3RydWN0aW9ucyBzYXR1cmF0ZSBhbmQKKyAqIHNldC1jb25kaXRpb24tY29kZSBmbGFncy4KKyAqLworc3RhdGljIHZvaWQKK3N0b3JlX3ZlY3RvcjQoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX21hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IEdMZmxvYXQgdmFsdWVbNF0pCit7CisgICBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdFJlZyA9ICYoaW5zdC0+RHN0UmVnKTsKKyAgIGNvbnN0IEdMYm9vbGVhbiBjbGFtcCA9IGluc3QtPlNhdHVyYXRlTW9kZSA9PSBTQVRVUkFURV9aRVJPX09ORTsKKyAgIEdMdWludCB3cml0ZU1hc2sgPSBkc3RSZWctPldyaXRlTWFzazsKKyAgIEdMZmxvYXQgY2xhbXBlZFZhbHVlWzRdOworICAgR0xmbG9hdCAqZHN0ID0gZ2V0X2RzdF9yZWdpc3Rlcl9wb2ludGVyKGRzdFJlZywgbWFjaGluZSk7CisKKyNpZiAwCisgICBpZiAodmFsdWVbMF0gPiAxLjBlMTAgfHwKKyAgICAgICBJU19JTkZfT1JfTkFOKHZhbHVlWzBdKSB8fAorICAgICAgIElTX0lORl9PUl9OQU4odmFsdWVbMV0pIHx8CisgICAgICAgSVNfSU5GX09SX05BTih2YWx1ZVsyXSkgfHwgSVNfSU5GX09SX05BTih2YWx1ZVszXSkpCisgICAgICBwcmludGYoInN0b3JlICVnICVnICVnICVnXG4iLCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVszXSk7CisjZW5kaWYKKworICAgaWYgKGNsYW1wKSB7CisgICAgICBjbGFtcGVkVmFsdWVbMF0gPSBDTEFNUCh2YWx1ZVswXSwgMC4wRiwgMS4wRik7CisgICAgICBjbGFtcGVkVmFsdWVbMV0gPSBDTEFNUCh2YWx1ZVsxXSwgMC4wRiwgMS4wRik7CisgICAgICBjbGFtcGVkVmFsdWVbMl0gPSBDTEFNUCh2YWx1ZVsyXSwgMC4wRiwgMS4wRik7CisgICAgICBjbGFtcGVkVmFsdWVbM10gPSBDTEFNUCh2YWx1ZVszXSwgMC4wRiwgMS4wRik7CisgICAgICB2YWx1ZSA9IGNsYW1wZWRWYWx1ZTsKKyAgIH0KKworICAgaWYgKGRzdFJlZy0+Q29uZE1hc2sgIT0gQ09ORF9UUikgeworICAgICAgLyogY29uZGl0aW9uIGNvZGVzIG1heSB0dXJuIG9mZiBzb21lIHdyaXRlcyAqLworICAgICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19YKSB7CisgICAgICAgICBpZiAoIXRlc3RfY2MobWFjaGluZS0+Q29uZENvZGVzW0dFVF9TV1ooZHN0UmVnLT5Db25kU3dpenpsZSwgMCldLAorICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZy0+Q29uZE1hc2spKQorICAgICAgICAgICAgd3JpdGVNYXNrICY9IH5XUklURU1BU0tfWDsKKyAgICAgIH0KKyAgICAgIGlmICh3cml0ZU1hc2sgJiBXUklURU1BU0tfWSkgeworICAgICAgICAgaWYgKCF0ZXN0X2NjKG1hY2hpbmUtPkNvbmRDb2Rlc1tHRVRfU1daKGRzdFJlZy0+Q29uZFN3aXp6bGUsIDEpXSwKKyAgICAgICAgICAgICAgICAgICAgICBkc3RSZWctPkNvbmRNYXNrKSkKKyAgICAgICAgICAgIHdyaXRlTWFzayAmPSB+V1JJVEVNQVNLX1k7CisgICAgICB9CisgICAgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1opIHsKKyAgICAgICAgIGlmICghdGVzdF9jYyhtYWNoaW5lLT5Db25kQ29kZXNbR0VUX1NXWihkc3RSZWctPkNvbmRTd2l6emxlLCAyKV0sCisgICAgICAgICAgICAgICAgICAgICAgZHN0UmVnLT5Db25kTWFzaykpCisgICAgICAgICAgICB3cml0ZU1hc2sgJj0gfldSSVRFTUFTS19aOworICAgICAgfQorICAgICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19XKSB7CisgICAgICAgICBpZiAoIXRlc3RfY2MobWFjaGluZS0+Q29uZENvZGVzW0dFVF9TV1ooZHN0UmVnLT5Db25kU3dpenpsZSwgMyldLAorICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZy0+Q29uZE1hc2spKQorICAgICAgICAgICAgd3JpdGVNYXNrICY9IH5XUklURU1BU0tfVzsKKyAgICAgIH0KKyAgIH0KKworI2lmZGVmIE5BTl9DSEVDSworICAgYXNzZXJ0KCFJU19JTkZfT1JfTkFOKHZhbHVlWzBdKSk7CisgICBhc3NlcnQoIUlTX0lORl9PUl9OQU4odmFsdWVbMF0pKTsKKyAgIGFzc2VydCghSVNfSU5GX09SX05BTih2YWx1ZVswXSkpOworICAgYXNzZXJ0KCFJU19JTkZfT1JfTkFOKHZhbHVlWzBdKSk7CisjZW5kaWYKKworICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19YKQorICAgICAgZHN0WzBdID0gdmFsdWVbMF07CisgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1kpCisgICAgICBkc3RbMV0gPSB2YWx1ZVsxXTsKKyAgIGlmICh3cml0ZU1hc2sgJiBXUklURU1BU0tfWikKKyAgICAgIGRzdFsyXSA9IHZhbHVlWzJdOworICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19XKQorICAgICAgZHN0WzNdID0gdmFsdWVbM107CisKKyAgIGlmIChpbnN0LT5Db25kVXBkYXRlKSB7CisgICAgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1gpCisgICAgICAgICBtYWNoaW5lLT5Db25kQ29kZXNbMF0gPSBnZW5lcmF0ZV9jYyh2YWx1ZVswXSk7CisgICAgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1kpCisgICAgICAgICBtYWNoaW5lLT5Db25kQ29kZXNbMV0gPSBnZW5lcmF0ZV9jYyh2YWx1ZVsxXSk7CisgICAgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1opCisgICAgICAgICBtYWNoaW5lLT5Db25kQ29kZXNbMl0gPSBnZW5lcmF0ZV9jYyh2YWx1ZVsyXSk7CisgICAgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1cpCisgICAgICAgICBtYWNoaW5lLT5Db25kQ29kZXNbM10gPSBnZW5lcmF0ZV9jYyh2YWx1ZVszXSk7CisjaWYgREVCVUdfUFJPRworICAgICAgcHJpbnRmKCJDb25kQ29kZXM9KCVzLCVzLCVzLCVzKSBmb3I6XG4iLAorICAgICAgICAgICAgIF9tZXNhX2NvbmRjb2RlX3N0cmluZyhtYWNoaW5lLT5Db25kQ29kZXNbMF0pLAorICAgICAgICAgICAgIF9tZXNhX2NvbmRjb2RlX3N0cmluZyhtYWNoaW5lLT5Db25kQ29kZXNbMV0pLAorICAgICAgICAgICAgIF9tZXNhX2NvbmRjb2RlX3N0cmluZyhtYWNoaW5lLT5Db25kQ29kZXNbMl0pLAorICAgICAgICAgICAgIF9tZXNhX2NvbmRjb2RlX3N0cmluZyhtYWNoaW5lLT5Db25kQ29kZXNbM10pKTsKKyNlbmRpZgorICAgfQorfQorCisKKy8qKgorICogU3RvcmUgNCB1aW50cyBpbnRvIGEgcmVnaXN0ZXIuICBPYnNlcnZlIHRoZSBzZXQtY29uZGl0aW9uLWNvZGUgZmxhZ3MuCisgKi8KK3N0YXRpYyB2b2lkCitzdG9yZV92ZWN0b3I0dWkoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW1fbWFjaGluZSAqbWFjaGluZSwgY29uc3QgR0x1aW50IHZhbHVlWzRdKQoreworICAgY29uc3Qgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyICpkc3RSZWcgPSAmKGluc3QtPkRzdFJlZyk7CisgICBHTHVpbnQgd3JpdGVNYXNrID0gZHN0UmVnLT5Xcml0ZU1hc2s7CisgICBHTHVpbnQgKmRzdCA9IChHTHVpbnQgKikgZ2V0X2RzdF9yZWdpc3Rlcl9wb2ludGVyKGRzdFJlZywgbWFjaGluZSk7CisKKyAgIGlmIChkc3RSZWctPkNvbmRNYXNrICE9IENPTkRfVFIpIHsKKyAgICAgIC8qIGNvbmRpdGlvbiBjb2RlcyBtYXkgdHVybiBvZmYgc29tZSB3cml0ZXMgKi8KKyAgICAgIGlmICh3cml0ZU1hc2sgJiBXUklURU1BU0tfWCkgeworICAgICAgICAgaWYgKCF0ZXN0X2NjKG1hY2hpbmUtPkNvbmRDb2Rlc1tHRVRfU1daKGRzdFJlZy0+Q29uZFN3aXp6bGUsIDApXSwKKyAgICAgICAgICAgICAgICAgICAgICBkc3RSZWctPkNvbmRNYXNrKSkKKyAgICAgICAgICAgIHdyaXRlTWFzayAmPSB+V1JJVEVNQVNLX1g7CisgICAgICB9CisgICAgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1kpIHsKKyAgICAgICAgIGlmICghdGVzdF9jYyhtYWNoaW5lLT5Db25kQ29kZXNbR0VUX1NXWihkc3RSZWctPkNvbmRTd2l6emxlLCAxKV0sCisgICAgICAgICAgICAgICAgICAgICAgZHN0UmVnLT5Db25kTWFzaykpCisgICAgICAgICAgICB3cml0ZU1hc2sgJj0gfldSSVRFTUFTS19ZOworICAgICAgfQorICAgICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19aKSB7CisgICAgICAgICBpZiAoIXRlc3RfY2MobWFjaGluZS0+Q29uZENvZGVzW0dFVF9TV1ooZHN0UmVnLT5Db25kU3dpenpsZSwgMildLAorICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZy0+Q29uZE1hc2spKQorICAgICAgICAgICAgd3JpdGVNYXNrICY9IH5XUklURU1BU0tfWjsKKyAgICAgIH0KKyAgICAgIGlmICh3cml0ZU1hc2sgJiBXUklURU1BU0tfVykgeworICAgICAgICAgaWYgKCF0ZXN0X2NjKG1hY2hpbmUtPkNvbmRDb2Rlc1tHRVRfU1daKGRzdFJlZy0+Q29uZFN3aXp6bGUsIDMpXSwKKyAgICAgICAgICAgICAgICAgICAgICBkc3RSZWctPkNvbmRNYXNrKSkKKyAgICAgICAgICAgIHdyaXRlTWFzayAmPSB+V1JJVEVNQVNLX1c7CisgICAgICB9CisgICB9CisKKyAgIGlmICh3cml0ZU1hc2sgJiBXUklURU1BU0tfWCkKKyAgICAgIGRzdFswXSA9IHZhbHVlWzBdOworICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19ZKQorICAgICAgZHN0WzFdID0gdmFsdWVbMV07CisgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1opCisgICAgICBkc3RbMl0gPSB2YWx1ZVsyXTsKKyAgIGlmICh3cml0ZU1hc2sgJiBXUklURU1BU0tfVykKKyAgICAgIGRzdFszXSA9IHZhbHVlWzNdOworCisgICBpZiAoaW5zdC0+Q29uZFVwZGF0ZSkgeworICAgICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19YKQorICAgICAgICAgbWFjaGluZS0+Q29uZENvZGVzWzBdID0gZ2VuZXJhdGVfY2MoKGZsb2F0KXZhbHVlWzBdKTsKKyAgICAgIGlmICh3cml0ZU1hc2sgJiBXUklURU1BU0tfWSkKKyAgICAgICAgIG1hY2hpbmUtPkNvbmRDb2Rlc1sxXSA9IGdlbmVyYXRlX2NjKChmbG9hdCl2YWx1ZVsxXSk7CisgICAgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1opCisgICAgICAgICBtYWNoaW5lLT5Db25kQ29kZXNbMl0gPSBnZW5lcmF0ZV9jYygoZmxvYXQpdmFsdWVbMl0pOworICAgICAgaWYgKHdyaXRlTWFzayAmIFdSSVRFTUFTS19XKQorICAgICAgICAgbWFjaGluZS0+Q29uZENvZGVzWzNdID0gZ2VuZXJhdGVfY2MoKGZsb2F0KXZhbHVlWzNdKTsKKyNpZiBERUJVR19QUk9HCisgICAgICBwcmludGYoIkNvbmRDb2Rlcz0oJXMsJXMsJXMsJXMpIGZvcjpcbiIsCisgICAgICAgICAgICAgX21lc2FfY29uZGNvZGVfc3RyaW5nKG1hY2hpbmUtPkNvbmRDb2Rlc1swXSksCisgICAgICAgICAgICAgX21lc2FfY29uZGNvZGVfc3RyaW5nKG1hY2hpbmUtPkNvbmRDb2Rlc1sxXSksCisgICAgICAgICAgICAgX21lc2FfY29uZGNvZGVfc3RyaW5nKG1hY2hpbmUtPkNvbmRDb2Rlc1syXSksCisgICAgICAgICAgICAgX21lc2FfY29uZGNvZGVfc3RyaW5nKG1hY2hpbmUtPkNvbmRDb2Rlc1szXSkpOworI2VuZGlmCisgICB9Cit9CisKKworCisvKioKKyAqIEV4ZWN1dGUgdGhlIGdpdmVuIHZlcnRleC9mcmFnbWVudCBwcm9ncmFtLgorICoKKyAqIFxwYXJhbSBjdHggIHJlbmRlcmluZyBjb250ZXh0CisgKiBccGFyYW0gcHJvZ3JhbSAgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZQorICogXHBhcmFtIG1hY2hpbmUgIG1hY2hpbmUgc3RhdGUgKG11c3QgYmUgaW5pdGlhbGl6ZWQpCisgKiBccmV0dXJuIEdMX1RSVUUgaWYgcHJvZ3JhbSBjb21wbGV0ZWQgb3IgR0xfRkFMU0UgaWYgcHJvZ3JhbSBleGVjdXRlZCBLSUwuCisgKi8KK0dMYm9vbGVhbgorX21lc2FfZXhlY3V0ZV9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX21hY2hpbmUgKm1hY2hpbmUpCit7CisgICBjb25zdCBHTHVpbnQgbnVtSW5zdCA9IHByb2dyYW0tPk51bUluc3RydWN0aW9uczsKKyAgIGNvbnN0IEdMdWludCBtYXhFeGVjID0gNjU1MzY7CisgICBHTHVpbnQgcGMsIG51bUV4ZWMgPSAwOworCisgICBtYWNoaW5lLT5DdXJQcm9ncmFtID0gcHJvZ3JhbTsKKworICAgaWYgKERFQlVHX1BST0cpIHsKKyAgICAgIHByaW50ZigiZXhlY3V0ZSBwcm9ncmFtICV1IC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBwcm9ncmFtLT5JZCk7CisgICB9CisKKyAgIGlmIChwcm9ncmFtLT5UYXJnZXQgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCKSB7CisgICAgICBtYWNoaW5lLT5FbnZQYXJhbXMgPSBjdHgtPlZlcnRleFByb2dyYW0uUGFyYW1ldGVyczsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgbWFjaGluZS0+RW52UGFyYW1zID0gY3R4LT5GcmFnbWVudFByb2dyYW0uUGFyYW1ldGVyczsKKyAgIH0KKworICAgZm9yIChwYyA9IDA7IHBjIDwgbnVtSW5zdDsgcGMrKykgeworICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSBwcm9ncmFtLT5JbnN0cnVjdGlvbnMgKyBwYzsKKworICAgICAgaWYgKERFQlVHX1BST0cpIHsKKyAgICAgICAgIF9tZXNhX3ByaW50X2luc3RydWN0aW9uKGluc3QpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGluc3QtPk9wY29kZSkgeworICAgICAgY2FzZSBPUENPREVfQUJTOgorICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdLCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gRkFCU0YoYVswXSk7CisgICAgICAgICAgICByZXN1bHRbMV0gPSBGQUJTRihhWzFdKTsKKyAgICAgICAgICAgIHJlc3VsdFsyXSA9IEZBQlNGKGFbMl0pOworICAgICAgICAgICAgcmVzdWx0WzNdID0gRkFCU0YoYVszXSk7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0FERDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSBhWzBdICsgYlswXTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IGFbMV0gKyBiWzFdOworICAgICAgICAgICAgcmVzdWx0WzJdID0gYVsyXSArIGJbMl07CisgICAgICAgICAgICByZXN1bHRbM10gPSBhWzNdICsgYlszXTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIkFERCAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnICVnKSArICglZyAlZyAlZyAlZylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdLCByZXN1bHRbMV0sIHJlc3VsdFsyXSwgcmVzdWx0WzNdLAorICAgICAgICAgICAgICAgICAgICAgIGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9BUkw6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIHQpOworICAgICAgICAgICAgbWFjaGluZS0+QWRkcmVzc1JlZ1swXVswXSA9IElGTE9PUih0WzBdKTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIkFSTCAlZFxuIiwgbWFjaGluZS0+QWRkcmVzc1JlZ1swXVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0JHTkxPT1A6CisgICAgICAgICAvKiBuby1vcCAqLworICAgICAgICAgQVNTRVJUKHByb2dyYW0tPkluc3RydWN0aW9uc1tpbnN0LT5CcmFuY2hUYXJnZXRdLk9wY29kZQorICAgICAgICAgICAgICAgID09IE9QQ09ERV9FTkRMT09QKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRU5ETE9PUDoKKyAgICAgICAgIC8qIHN1YnRyYWN0IDEgaGVyZSBzaW5jZSBwYyBpcyBpbmNyZW1lbnRlZCBieSBmb3IocGMpIGxvb3AgKi8KKyAgICAgICAgIEFTU0VSVChwcm9ncmFtLT5JbnN0cnVjdGlvbnNbaW5zdC0+QnJhbmNoVGFyZ2V0XS5PcGNvZGUKKyAgICAgICAgICAgICAgICA9PSBPUENPREVfQkdOTE9PUCk7CisgICAgICAgICBwYyA9IGluc3QtPkJyYW5jaFRhcmdldCAtIDE7ICAgLyogZ28gdG8gbWF0Y2hpbmcgQk5HTE9PUCAqLworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9CR05TVUI6ICAgICAgLyogYmVnaW4gc3Vicm91dGluZSAqLworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9FTkRTVUI6ICAgICAgLyogZW5kIHN1YnJvdXRpbmUgKi8KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfQlJLOiAgICAgICAgIC8qIGJyZWFrIG91dCBvZiBsb29wIChjb25kaXRpb25hbCkgKi8KKyAgICAgICAgIEFTU0VSVChwcm9ncmFtLT5JbnN0cnVjdGlvbnNbaW5zdC0+QnJhbmNoVGFyZ2V0XS5PcGNvZGUKKyAgICAgICAgICAgICAgICA9PSBPUENPREVfRU5ETE9PUCk7CisgICAgICAgICBpZiAoZXZhbF9jb25kaXRpb24obWFjaGluZSwgaW5zdCkpIHsKKyAgICAgICAgICAgIC8qIGJyZWFrIG91dCBvZiBsb29wICovCisgICAgICAgICAgICAvKiBwYysrIGF0IGVuZCBvZiBmb3ItbG9vcCB3aWxsIHB1dCB1cyBhZnRlciB0aGUgRU5ETE9PUCBpbnN0ICovCisgICAgICAgICAgICBwYyA9IGluc3QtPkJyYW5jaFRhcmdldDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfQ09OVDogICAgICAgIC8qIGNvbnRpbnVlIGxvb3AgKGNvbmRpdGlvbmFsKSAqLworICAgICAgICAgQVNTRVJUKHByb2dyYW0tPkluc3RydWN0aW9uc1tpbnN0LT5CcmFuY2hUYXJnZXRdLk9wY29kZQorICAgICAgICAgICAgICAgID09IE9QQ09ERV9FTkRMT09QKTsKKyAgICAgICAgIGlmIChldmFsX2NvbmRpdGlvbihtYWNoaW5lLCBpbnN0KSkgeworICAgICAgICAgICAgLyogY29udGludWUgYXQgRU5ETE9PUCAqLworICAgICAgICAgICAgLyogU3VidHJhY3QgMSBoZXJlIHNpbmNlIHdlJ2xsIGRvIHBjKysgYXQgZW5kIG9mIGZvci1sb29wICovCisgICAgICAgICAgICBwYyA9IGluc3QtPkJyYW5jaFRhcmdldCAtIDE7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0NBTDogICAgICAgICAvKiBDYWxsIHN1YnJvdXRpbmUgKGNvbmRpdGlvbmFsKSAqLworICAgICAgICAgaWYgKGV2YWxfY29uZGl0aW9uKG1hY2hpbmUsIGluc3QpKSB7CisgICAgICAgICAgICAvKiBjYWxsIHRoZSBzdWJyb3V0aW5lICovCisgICAgICAgICAgICBpZiAobWFjaGluZS0+U3RhY2tEZXB0aCA+PSBNQVhfUFJPR1JBTV9DQUxMX0RFUFRIKSB7CisgICAgICAgICAgICAgICByZXR1cm4gR0xfVFJVRTsgIC8qIFBlciBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTIgc3BlYyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFjaGluZS0+Q2FsbFN0YWNrW21hY2hpbmUtPlN0YWNrRGVwdGgrK10gPSBwYyArIDE7IC8qIG5leHQgaW5zdCAqLworICAgICAgICAgICAgLyogU3VidHJhY3QgMSBoZXJlIHNpbmNlIHdlJ2xsIGRvIHBjKysgYXQgZW5kIG9mIGZvci1sb29wICovCisgICAgICAgICAgICBwYyA9IGluc3QtPkJyYW5jaFRhcmdldCAtIDE7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0NNUDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgY1s0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMl0sIG1hY2hpbmUsIGMpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gYVswXSA8IDAuMEYgPyBiWzBdIDogY1swXTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IGFbMV0gPCAwLjBGID8gYlsxXSA6IGNbMV07CisgICAgICAgICAgICByZXN1bHRbMl0gPSBhWzJdIDwgMC4wRiA/IGJbMl0gOiBjWzJdOworICAgICAgICAgICAgcmVzdWx0WzNdID0gYVszXSA8IDAuMEYgPyBiWzNdIDogY1szXTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIkNNUCAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnICVnKSA8IDAgPyAoJWcgJWcgJWcgJWcpIDogKCVnICVnICVnICVnKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdLCByZXN1bHRbM10sCisgICAgICAgICAgICAgICAgICAgICAgYVswXSwgYVsxXSwgYVsyXSwgYVszXSwKKyAgICAgICAgICAgICAgICAgICAgICBiWzBdLCBiWzFdLCBiWzJdLCBiWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGNbMF0sIGNbMV0sIGNbMl0sIGNbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9DT1M6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjEoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICByZXN1bHRbMF0gPSByZXN1bHRbMV0gPSByZXN1bHRbMl0gPSByZXN1bHRbM10KKyAgICAgICAgICAgICAgID0gKEdMZmxvYXQpIGNvcyhhWzBdKTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRERYOiAgICAgICAgIC8qIFBhcnRpYWwgZGVyaXZhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gWCAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0X2Rlcml2KGN0eCwgJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnLCByZXN1bHQpOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9ERFk6ICAgICAgICAgLyogUGFydGlhbCBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byBZICovCisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjRfZGVyaXYoY3R4LCAmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScsIHJlc3VsdCk7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0RQMjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSByZXN1bHRbMV0gPSByZXN1bHRbMl0gPSByZXN1bHRbM10gPSBET1QyKGEsIGIpOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKERFQlVHX1BST0cpIHsKKyAgICAgICAgICAgICAgIHByaW50ZigiRFAyICVnID0gKCVnICVnKSAuICglZyAlZylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdLCBhWzBdLCBhWzFdLCBiWzBdLCBiWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRFAzOgorICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdLCBiWzRdLCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzFdLCBtYWNoaW5lLCBiKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IHJlc3VsdFsxXSA9IHJlc3VsdFsyXSA9IHJlc3VsdFszXSA9IERPVDMoYSwgYik7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJEUDMgJWcgPSAoJWcgJWcgJWcpIC4gKCVnICVnICVnKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0sIGFbMF0sIGFbMV0sIGFbMl0sIGJbMF0sIGJbMV0sIGJbMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9EUDQ6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gcmVzdWx0WzFdID0gcmVzdWx0WzJdID0gcmVzdWx0WzNdID0gRE9UNChhLCBiKTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIkRQNCAlZyA9ICglZywgJWcgJWcgJWcpIC4gKCVnLCAlZyAlZyAlZylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdLCBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9EUEg6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gcmVzdWx0WzFdID0gcmVzdWx0WzJdID0gcmVzdWx0WzNdID0gRE9UMyhhLCBiKSArIGJbM107CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0RTVDogICAgICAgICAvKiBEaXN0YW5jZSB2ZWN0b3IgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSAxLjBGOworICAgICAgICAgICAgcmVzdWx0WzFdID0gYVsxXSAqIGJbMV07CisgICAgICAgICAgICByZXN1bHRbMl0gPSBhWzJdOworICAgICAgICAgICAgcmVzdWx0WzNdID0gYlszXTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRVhQOgorICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCB0WzRdLCBxWzRdLCBmbG9vcl90MDsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjEoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgdCk7CisgICAgICAgICAgICBmbG9vcl90MCA9IEZMT09SRih0WzBdKTsKKyAgICAgICAgICAgIGlmIChmbG9vcl90MCA+IEZMVF9NQVhfRVhQKSB7CisgICAgICAgICAgICAgICBTRVRfUE9TX0lORklOSVRZKHFbMF0pOworICAgICAgICAgICAgICAgU0VUX1BPU19JTkZJTklUWShxWzJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGZsb29yX3QwIDwgRkxUX01JTl9FWFApIHsKKyAgICAgICAgICAgICAgIHFbMF0gPSAwLjBGOworICAgICAgICAgICAgICAgcVsyXSA9IDAuMEY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIHFbMF0gPSBMREVYUEYoMS4wLCAoaW50KSBmbG9vcl90MCk7CisgICAgICAgICAgICAgICAvKiBOb3RlOiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbSBleHBlY3RzIAorICAgICAgICAgICAgICAgICogcmVzdWx0LnogPSByZXN1bHQueCAqIEFQUFgocmVzdWx0LnkpCisgICAgICAgICAgICAgICAgKiBXZSBkbyB3aGF0IHRoZSBBUkIgZXh0ZW5zaW9uIHNheXMuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHFbMl0gPSAoR0xmbG9hdCkgcG93KDIuMCwgdFswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxWzFdID0gdFswXSAtIGZsb29yX3QwOworICAgICAgICAgICAgcVszXSA9IDEuMEY7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KCBpbnN0LCBtYWNoaW5lLCBxICk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0VYMjogICAgICAgICAvKiBFeHBvbmVudGlhbCBiYXNlIDIgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgcmVzdWx0WzRdLCB2YWw7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3IxKCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgdmFsID0gKEdMZmxvYXQpIHBvdygyLjAsIGFbMF0pOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIGlmIChJU19JTkZfT1JfTkFOKHZhbCkpCisgICAgICAgICAgICAgICB2YWwgPSAxLjBlMTA7CisgICAgICAgICAgICAqLworICAgICAgICAgICAgcmVzdWx0WzBdID0gcmVzdWx0WzFdID0gcmVzdWx0WzJdID0gcmVzdWx0WzNdID0gdmFsOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9GTFI6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICByZXN1bHRbMF0gPSBGTE9PUkYoYVswXSk7CisgICAgICAgICAgICByZXN1bHRbMV0gPSBGTE9PUkYoYVsxXSk7CisgICAgICAgICAgICByZXN1bHRbMl0gPSBGTE9PUkYoYVsyXSk7CisgICAgICAgICAgICByZXN1bHRbM10gPSBGTE9PUkYoYVszXSk7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0ZSQzoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IGFbMF0gLSBGTE9PUkYoYVswXSk7CisgICAgICAgICAgICByZXN1bHRbMV0gPSBhWzFdIC0gRkxPT1JGKGFbMV0pOworICAgICAgICAgICAgcmVzdWx0WzJdID0gYVsyXSAtIEZMT09SRihhWzJdKTsKKyAgICAgICAgICAgIHJlc3VsdFszXSA9IGFbM10gLSBGTE9PUkYoYVszXSk7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0lGOgorICAgICAgICAgeworICAgICAgICAgICAgR0xib29sZWFuIGNvbmQ7CisgICAgICAgICAgICBBU1NFUlQocHJvZ3JhbS0+SW5zdHJ1Y3Rpb25zW2luc3QtPkJyYW5jaFRhcmdldF0uT3Bjb2RlCisgICAgICAgICAgICAgICAgICAgPT0gT1BDT0RFX0VMU0UgfHwKKyAgICAgICAgICAgICAgICAgICBwcm9ncmFtLT5JbnN0cnVjdGlvbnNbaW5zdC0+QnJhbmNoVGFyZ2V0XS5PcGNvZGUKKyAgICAgICAgICAgICAgICAgICA9PSBPUENPREVfRU5ESUYpOworICAgICAgICAgICAgLyogZXZhbCBjb25kaXRpb24gKi8KKyAgICAgICAgICAgIGlmIChpbnN0LT5TcmNSZWdbMF0uRmlsZSAhPSBQUk9HUkFNX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgR0xmbG9hdCBhWzRdOworICAgICAgICAgICAgICAgZmV0Y2hfdmVjdG9yMSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgICAgIGNvbmQgPSAoYVswXSAhPSAwLjApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBjb25kID0gZXZhbF9jb25kaXRpb24obWFjaGluZSwgaW5zdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJJRjogJWRcbiIsIGNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZG8gaWYvZWxzZSAqLworICAgICAgICAgICAgaWYgKGNvbmQpIHsKKyAgICAgICAgICAgICAgIC8qIGRvIGlmLWNsYXVzZSAoanVzdCBjb250aW51ZSBleGVjdXRpb24pICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIC8qIGdvIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciBFTFNFIG9yIEVORElGICovCisgICAgICAgICAgICAgICBhc3NlcnQoaW5zdC0+QnJhbmNoVGFyZ2V0ID49IDApOworICAgICAgICAgICAgICAgcGMgPSBpbnN0LT5CcmFuY2hUYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0VMU0U6CisgICAgICAgICAvKiBnb3RvIEVORElGICovCisgICAgICAgICBBU1NFUlQocHJvZ3JhbS0+SW5zdHJ1Y3Rpb25zW2luc3QtPkJyYW5jaFRhcmdldF0uT3Bjb2RlCisgICAgICAgICAgICAgICAgPT0gT1BDT0RFX0VORElGKTsKKyAgICAgICAgIGFzc2VydChpbnN0LT5CcmFuY2hUYXJnZXQgPj0gMCk7CisgICAgICAgICBwYyA9IGluc3QtPkJyYW5jaFRhcmdldDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRU5ESUY6CisgICAgICAgICAvKiBub3RoaW5nICovCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0tJTF9OVjogICAgICAvKiBOVl9mX3Agb25seSAoY29uZGl0aW9uYWwpICovCisgICAgICAgICBpZiAoZXZhbF9jb25kaXRpb24obWFjaGluZSwgaW5zdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfS0lMOiAgICAgICAgIC8qIEFSQl9mX3Agb25seSAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIktJTCBpZiAoJWcgJWcgJWcgJWcpIDw9IDAuMFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFbMF0gPCAwLjBGIHx8IGFbMV0gPCAwLjBGIHx8IGFbMl0gPCAwLjBGIHx8IGFbM10gPCAwLjBGKSB7CisgICAgICAgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0xHMjogICAgICAgICAvKiBsb2cgYmFzZSAyICovCisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIHJlc3VsdFs0XSwgdmFsOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yMSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKwkgICAgLyogVGhlIGZhc3QgTE9HMiBtYWNybyBkb2Vzbid0IG1lZXQgdGhlIHByZWNpc2lvbiByZXF1aXJlbWVudHMuCisJICAgICAqLworICAgICAgICAgICAgaWYgKGFbMF0gPT0gMC4wRikgeworICAgICAgICAgICAgICAgdmFsID0gLUZMVF9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIHZhbCA9IChmbG9hdCkobG9nKGFbMF0pICogMS40NDI2OTVGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFswXSA9IHJlc3VsdFsxXSA9IHJlc3VsdFsyXSA9IHJlc3VsdFszXSA9IHZhbDsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfTElUOgorICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgR0xmbG9hdCBlcHNpbG9uID0gMS4wRiAvIDI1Ni4wRjsgICAgICAvKiBmcm9tIE5WIFZQIHNwZWMgKi8KKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGFbMF0gPSBNQVgyKGFbMF0sIDAuMEYpOworICAgICAgICAgICAgYVsxXSA9IE1BWDIoYVsxXSwgMC4wRik7CisgICAgICAgICAgICAvKiBYWFggQVJCIHZlcnNpb24gY2xhbXBzIGFbM10sIE5WIHZlcnNpb24gZG9lc24ndCAqLworICAgICAgICAgICAgYVszXSA9IENMQU1QKGFbM10sIC0oMTI4LjBGIC0gZXBzaWxvbiksICgxMjguMEYgLSBlcHNpbG9uKSk7CisgICAgICAgICAgICByZXN1bHRbMF0gPSAxLjBGOworICAgICAgICAgICAgcmVzdWx0WzFdID0gYVswXTsKKyAgICAgICAgICAgIC8qIFhYWCB3ZSBjb3VsZCBwcm9iYWJseSBqdXN0IHVzZSBwb3coKSBoZXJlICovCisgICAgICAgICAgICBpZiAoYVswXSA+IDAuMEYpIHsKKyAgICAgICAgICAgICAgIGlmIChhWzFdID09IDAuMCAmJiBhWzNdID09IDAuMCkKKyAgICAgICAgICAgICAgICAgIHJlc3VsdFsyXSA9IDEuMEY7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICByZXN1bHRbMl0gPSAoR0xmbG9hdCkgcG93KGFbMV0sIGFbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICByZXN1bHRbMl0gPSAwLjBGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0WzNdID0gMS4wRjsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIkxJVCAoJWcgJWcgJWcgJWcpIDogKCVnICVnICVnICVnKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdLCByZXN1bHRbM10sCisgICAgICAgICAgICAgICAgICAgICAgYVswXSwgYVsxXSwgYVsyXSwgYVszXSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0xPRzoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgdFs0XSwgcVs0XSwgYWJzX3QwOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yMSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCB0KTsKKyAgICAgICAgICAgIGFic190MCA9IEZBQlNGKHRbMF0pOworICAgICAgICAgICAgaWYgKGFic190MCAhPSAwLjBGKSB7CisgICAgICAgICAgICAgICBpZiAoSVNfSU5GX09SX05BTihhYnNfdDApKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgU0VUX1BPU19JTkZJTklUWShxWzBdKTsKKyAgICAgICAgICAgICAgICAgIHFbMV0gPSAxLjBGOworICAgICAgICAgICAgICAgICAgU0VUX1BPU19JTkZJTklUWShxWzJdKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgaW50IGV4cG9uZW50OworICAgICAgICAgICAgICAgICAgR0xmbG9hdCBtYW50aXNzYSA9IEZSRVhQRih0WzBdLCAmZXhwb25lbnQpOworICAgICAgICAgICAgICAgICAgcVswXSA9IChHTGZsb2F0KSAoZXhwb25lbnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgIHFbMV0gPSAoR0xmbG9hdCkgKDIuMCAqIG1hbnRpc3NhKTsgLyogbWFwIFsuNSwgMSkgLT4gWzEsIDIpICovCisKKwkJICAvKiBUaGUgZmFzdCBMT0cyIG1hY3JvIGRvZXNuJ3QgbWVldCB0aGUgcHJlY2lzaW9uCisJCSAgICogcmVxdWlyZW1lbnRzLgorCQkgICAqLworICAgICAgICAgICAgICAgICAgcVsyXSA9IChmbG9hdCkobG9nKHRbMF0pICogMS40NDI2OTVGKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgU0VUX05FR19JTkZJTklUWShxWzBdKTsKKyAgICAgICAgICAgICAgIHFbMV0gPSAxLjBGOworICAgICAgICAgICAgICAgU0VUX05FR19JTkZJTklUWShxWzJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHFbM10gPSAxLjA7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHEpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9MUlA6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIGNbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzJdLCBtYWNoaW5lLCBjKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IGFbMF0gKiBiWzBdICsgKDEuMEYgLSBhWzBdKSAqIGNbMF07CisgICAgICAgICAgICByZXN1bHRbMV0gPSBhWzFdICogYlsxXSArICgxLjBGIC0gYVsxXSkgKiBjWzFdOworICAgICAgICAgICAgcmVzdWx0WzJdID0gYVsyXSAqIGJbMl0gKyAoMS4wRiAtIGFbMl0pICogY1syXTsKKyAgICAgICAgICAgIHJlc3VsdFszXSA9IGFbM10gKiBiWzNdICsgKDEuMEYgLSBhWzNdKSAqIGNbM107CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJMUlAgKCVnICVnICVnICVnKSA9ICglZyAlZyAlZyAlZyksICIKKyAgICAgICAgICAgICAgICAgICAgICAiKCVnICVnICVnICVnKSwgKCVnICVnICVnICVnKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdLCByZXN1bHRbM10sCisgICAgICAgICAgICAgICAgICAgICAgYVswXSwgYVsxXSwgYVsyXSwgYVszXSwKKyAgICAgICAgICAgICAgICAgICAgICBiWzBdLCBiWzFdLCBiWzJdLCBiWzNdLCBjWzBdLCBjWzFdLCBjWzJdLCBjWzNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfTUFEOgorICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdLCBiWzRdLCBjWzRdLCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzFdLCBtYWNoaW5lLCBiKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1syXSwgbWFjaGluZSwgYyk7CisgICAgICAgICAgICByZXN1bHRbMF0gPSBhWzBdICogYlswXSArIGNbMF07CisgICAgICAgICAgICByZXN1bHRbMV0gPSBhWzFdICogYlsxXSArIGNbMV07CisgICAgICAgICAgICByZXN1bHRbMl0gPSBhWzJdICogYlsyXSArIGNbMl07CisgICAgICAgICAgICByZXN1bHRbM10gPSBhWzNdICogYlszXSArIGNbM107CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJNQUQgKCVnICVnICVnICVnKSA9ICglZyAlZyAlZyAlZykgKiAiCisgICAgICAgICAgICAgICAgICAgICAgIiglZyAlZyAlZyAlZykgKyAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10sIGNbMF0sIGNbMV0sIGNbMl0sIGNbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9NQVg6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gTUFYMihhWzBdLCBiWzBdKTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IE1BWDIoYVsxXSwgYlsxXSk7CisgICAgICAgICAgICByZXN1bHRbMl0gPSBNQVgyKGFbMl0sIGJbMl0pOworICAgICAgICAgICAgcmVzdWx0WzNdID0gTUFYMihhWzNdLCBiWzNdKTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIk1BWCAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnICVnKSwgKCVnICVnICVnICVnKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdLCByZXN1bHRbM10sCisgICAgICAgICAgICAgICAgICAgICAgYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYlswXSwgYlsxXSwgYlsyXSwgYlszXSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX01JTjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSBNSU4yKGFbMF0sIGJbMF0pOworICAgICAgICAgICAgcmVzdWx0WzFdID0gTUlOMihhWzFdLCBiWzFdKTsKKyAgICAgICAgICAgIHJlc3VsdFsyXSA9IE1JTjIoYVsyXSwgYlsyXSk7CisgICAgICAgICAgICByZXN1bHRbM10gPSBNSU4yKGFbM10sIGJbM10pOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9NT1Y6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIk1PViAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX01VTDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSBhWzBdICogYlswXTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IGFbMV0gKiBiWzFdOworICAgICAgICAgICAgcmVzdWx0WzJdID0gYVsyXSAqIGJbMl07CisgICAgICAgICAgICByZXN1bHRbM10gPSBhWzNdICogYlszXTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIk1VTCAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnICVnKSAqICglZyAlZyAlZyAlZylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdLCByZXN1bHRbMV0sIHJlc3VsdFsyXSwgcmVzdWx0WzNdLAorICAgICAgICAgICAgICAgICAgICAgIGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9OT0lTRTE6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjEoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICByZXN1bHRbMF0gPQorICAgICAgICAgICAgICAgcmVzdWx0WzFdID0KKyAgICAgICAgICAgICAgIHJlc3VsdFsyXSA9CisgICAgICAgICAgICAgICByZXN1bHRbM10gPSBfbWVzYV9ub2lzZTEoYVswXSk7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX05PSVNFMjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9CisgICAgICAgICAgICAgICByZXN1bHRbMV0gPQorICAgICAgICAgICAgICAgcmVzdWx0WzJdID0gcmVzdWx0WzNdID0gX21lc2Ffbm9pc2UyKGFbMF0sIGFbMV0pOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9OT0lTRTM6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICByZXN1bHRbMF0gPQorICAgICAgICAgICAgICAgcmVzdWx0WzFdID0KKyAgICAgICAgICAgICAgIHJlc3VsdFsyXSA9CisgICAgICAgICAgICAgICByZXN1bHRbM10gPSBfbWVzYV9ub2lzZTMoYVswXSwgYVsxXSwgYVsyXSk7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX05PSVNFNDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9CisgICAgICAgICAgICAgICByZXN1bHRbMV0gPQorICAgICAgICAgICAgICAgcmVzdWx0WzJdID0KKyAgICAgICAgICAgICAgIHJlc3VsdFszXSA9IF9tZXNhX25vaXNlNChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfTk9QOgorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9QSzJIOiAgICAgICAgLyogcGFjayB0d28gMTYtYml0IGZsb2F0cyBpbiBvbmUgMzItYml0IGZsb2F0ICovCisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF07CisgICAgICAgICAgICBHTHVpbnQgcmVzdWx0WzRdOworICAgICAgICAgICAgR0xoYWxmTlYgaHgsIGh5OworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGh4ID0gX21lc2FfZmxvYXRfdG9faGFsZihhWzBdKTsKKyAgICAgICAgICAgIGh5ID0gX21lc2FfZmxvYXRfdG9faGFsZihhWzFdKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9CisgICAgICAgICAgICByZXN1bHRbMV0gPQorICAgICAgICAgICAgcmVzdWx0WzJdID0KKyAgICAgICAgICAgIHJlc3VsdFszXSA9IGh4IHwgKGh5IDw8IDE2KTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjR1aShpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9QSzJVUzogICAgICAgLyogcGFjayB0d28gR0x1c2hvcnRzIGludG8gb25lIDMyLWJpdCBmbG9hdCAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdOworICAgICAgICAgICAgR0x1aW50IHJlc3VsdFs0XSwgdXN4LCB1c3k7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgYVswXSA9IENMQU1QKGFbMF0sIDAuMEYsIDEuMEYpOworICAgICAgICAgICAgYVsxXSA9IENMQU1QKGFbMV0sIDAuMEYsIDEuMEYpOworICAgICAgICAgICAgdXN4ID0gRl9UT19JKGFbMF0gKiA2NTUzNS4wRik7CisgICAgICAgICAgICB1c3kgPSBGX1RPX0koYVsxXSAqIDY1NTM1LjBGKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9CisgICAgICAgICAgICByZXN1bHRbMV0gPQorICAgICAgICAgICAgcmVzdWx0WzJdID0KKyAgICAgICAgICAgIHJlc3VsdFszXSA9IHVzeCB8ICh1c3kgPDwgMTYpOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNHVpKGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1BLNEI6ICAgICAgICAvKiBwYWNrIGZvdXIgR0xieXRlcyBpbnRvIG9uZSAzMi1iaXQgZmxvYXQgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XTsKKyAgICAgICAgICAgIEdMdWludCByZXN1bHRbNF0sIHVieCwgdWJ5LCB1YnosIHVidzsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBhWzBdID0gQ0xBTVAoYVswXSwgLTEyOC4wRiAvIDEyNy4wRiwgMS4wRik7CisgICAgICAgICAgICBhWzFdID0gQ0xBTVAoYVsxXSwgLTEyOC4wRiAvIDEyNy4wRiwgMS4wRik7CisgICAgICAgICAgICBhWzJdID0gQ0xBTVAoYVsyXSwgLTEyOC4wRiAvIDEyNy4wRiwgMS4wRik7CisgICAgICAgICAgICBhWzNdID0gQ0xBTVAoYVszXSwgLTEyOC4wRiAvIDEyNy4wRiwgMS4wRik7CisgICAgICAgICAgICB1YnggPSBGX1RPX0koMTI3LjBGICogYVswXSArIDEyOC4wRik7CisgICAgICAgICAgICB1YnkgPSBGX1RPX0koMTI3LjBGICogYVsxXSArIDEyOC4wRik7CisgICAgICAgICAgICB1YnogPSBGX1RPX0koMTI3LjBGICogYVsyXSArIDEyOC4wRik7CisgICAgICAgICAgICB1YncgPSBGX1RPX0koMTI3LjBGICogYVszXSArIDEyOC4wRik7CisgICAgICAgICAgICByZXN1bHRbMF0gPQorICAgICAgICAgICAgcmVzdWx0WzFdID0KKyAgICAgICAgICAgIHJlc3VsdFsyXSA9CisgICAgICAgICAgICByZXN1bHRbM10gPSB1YnggfCAodWJ5IDw8IDgpIHwgKHVieiA8PCAxNikgfCAodWJ3IDw8IDI0KTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjR1aShpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9QSzRVQjogICAgICAgLyogcGFjayBmb3VyIEdMdWJ5dGVzIGludG8gb25lIDMyLWJpdCBmbG9hdCAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdOworICAgICAgICAgICAgR0x1aW50IHJlc3VsdFs0XSwgdWJ4LCB1YnksIHVieiwgdWJ3OworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGFbMF0gPSBDTEFNUChhWzBdLCAwLjBGLCAxLjBGKTsKKyAgICAgICAgICAgIGFbMV0gPSBDTEFNUChhWzFdLCAwLjBGLCAxLjBGKTsKKyAgICAgICAgICAgIGFbMl0gPSBDTEFNUChhWzJdLCAwLjBGLCAxLjBGKTsKKyAgICAgICAgICAgIGFbM10gPSBDTEFNUChhWzNdLCAwLjBGLCAxLjBGKTsKKyAgICAgICAgICAgIHVieCA9IEZfVE9fSSgyNTUuMEYgKiBhWzBdKTsKKyAgICAgICAgICAgIHVieSA9IEZfVE9fSSgyNTUuMEYgKiBhWzFdKTsKKyAgICAgICAgICAgIHVieiA9IEZfVE9fSSgyNTUuMEYgKiBhWzJdKTsKKyAgICAgICAgICAgIHVidyA9IEZfVE9fSSgyNTUuMEYgKiBhWzNdKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9CisgICAgICAgICAgICByZXN1bHRbMV0gPQorICAgICAgICAgICAgcmVzdWx0WzJdID0KKyAgICAgICAgICAgIHJlc3VsdFszXSA9IHVieCB8ICh1YnkgPDwgOCkgfCAodWJ6IDw8IDE2KSB8ICh1YncgPDwgMjQpOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNHVpKGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1BPVzoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yMSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjEoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSByZXN1bHRbMV0gPSByZXN1bHRbMl0gPSByZXN1bHRbM10KKyAgICAgICAgICAgICAgID0gKEdMZmxvYXQpIHBvdyhhWzBdLCBiWzBdKTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9QQ09ERV9SQ1A6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjEoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgaWYgKGFbMF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiUkNQKDApXG4iKTsKKyAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0lORl9PUl9OQU4oYVswXSkpCisgICAgICAgICAgICAgICAgICBwcmludGYoIlJDUChpbmYpXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFswXSA9IHJlc3VsdFsxXSA9IHJlc3VsdFsyXSA9IHJlc3VsdFszXSA9IDEuMEYgLyBhWzBdOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9SRVQ6ICAgICAgICAgLyogcmV0dXJuIGZyb20gc3Vicm91dGluZSAoY29uZGl0aW9uYWwpICovCisgICAgICAgICBpZiAoZXZhbF9jb25kaXRpb24obWFjaGluZSwgaW5zdCkpIHsKKyAgICAgICAgICAgIGlmIChtYWNoaW5lLT5TdGFja0RlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgIHJldHVybiBHTF9UUlVFOyAgLyogUGVyIEdMX05WX3ZlcnRleF9wcm9ncmFtMiBzcGVjICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBzdWJ0cmFjdCBvbmUgYmVjYXVzZSBvZiBwYysrIGluIHRoZSBmb3IgbG9vcCAqLworICAgICAgICAgICAgcGMgPSBtYWNoaW5lLT5DYWxsU3RhY2tbLS1tYWNoaW5lLT5TdGFja0RlcHRoXSAtIDE7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1JGTDogICAgICAgICAvKiByZWZsZWN0aW9uIHZlY3RvciAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBheGlzWzRdLCBkaXJbNF0sIHJlc3VsdFs0XSwgdG1wWCwgdG1wVzsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYXhpcyk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGRpcik7CisgICAgICAgICAgICB0bXBXID0gRE9UMyhheGlzLCBheGlzKTsKKyAgICAgICAgICAgIHRtcFggPSAoMi4wRiAqIERPVDMoYXhpcywgZGlyKSkgLyB0bXBXOworICAgICAgICAgICAgcmVzdWx0WzBdID0gdG1wWCAqIGF4aXNbMF0gLSBkaXJbMF07CisgICAgICAgICAgICByZXN1bHRbMV0gPSB0bXBYICogYXhpc1sxXSAtIGRpclsxXTsKKyAgICAgICAgICAgIHJlc3VsdFsyXSA9IHRtcFggKiBheGlzWzJdIC0gZGlyWzJdOworICAgICAgICAgICAgLyogcmVzdWx0WzNdIGlzIG5ldmVyIHdyaXR0ZW4hIFhYWCBlbmZvcmNlIGluIHBhcnNlciEgKi8KKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfUlNROiAgICAgICAgIC8qIDEgLyBzcXJ0KCkgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yMSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGFbMF0gPSBGQUJTRihhWzBdKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IHJlc3VsdFsxXSA9IHJlc3VsdFsyXSA9IHJlc3VsdFszXSA9IElOVl9TUVJURihhWzBdKTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIlJTUSAlZyA9IDEvc3FydCh8JWd8KVxuIiwgcmVzdWx0WzBdLCBhWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfU0NTOiAgICAgICAgIC8qIHNpbmUgYW5kIGNvcyAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdLCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3IxKCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gKEdMZmxvYXQpIGNvcyhhWzBdKTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IChHTGZsb2F0KSBzaW4oYVswXSk7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAwLjA7ICAgIC8qIHVuZGVmaW5lZCEgKi8KKyAgICAgICAgICAgIHJlc3VsdFszXSA9IDAuMDsgICAgLyogdW5kZWZpbmVkISAqLworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TRVE6ICAgICAgICAgLyogc2V0IG9uIGVxdWFsICovCisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gKGFbMF0gPT0gYlswXSkgPyAxLjBGIDogMC4wRjsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IChhWzFdID09IGJbMV0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoYVsyXSA9PSBiWzJdKSA/IDEuMEYgOiAwLjBGOworICAgICAgICAgICAgcmVzdWx0WzNdID0gKGFbM10gPT0gYlszXSkgPyAxLjBGIDogMC4wRjsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIlNFUSAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnICVnKSA9PSAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TRkw6ICAgICAgICAgLyogc2V0IGZhbHNlLCBvcGVyYW5kcyBpZ25vcmVkICovCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgR0xmbG9hdCByZXN1bHRbNF0gPSB7IDAuMEYsIDAuMEYsIDAuMEYsIDAuMEYgfTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfU0dFOiAgICAgICAgIC8qIHNldCBvbiBncmVhdGVyIG9yIGVxdWFsICovCisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gKGFbMF0gPj0gYlswXSkgPyAxLjBGIDogMC4wRjsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IChhWzFdID49IGJbMV0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoYVsyXSA+PSBiWzJdKSA/IDEuMEYgOiAwLjBGOworICAgICAgICAgICAgcmVzdWx0WzNdID0gKGFbM10gPj0gYlszXSkgPyAxLjBGIDogMC4wRjsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIlNHRSAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnICVnKSA+PSAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TR1Q6ICAgICAgICAgLyogc2V0IG9uIGdyZWF0ZXIgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSAoYVswXSA+IGJbMF0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMV0gPSAoYVsxXSA+IGJbMV0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoYVsyXSA+IGJbMl0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbM10gPSAoYVszXSA+IGJbM10pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJTR1QgKCVnICVnICVnICVnKSA9ICglZyAlZyAlZyAlZykgPiAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TSU46CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjEoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICByZXN1bHRbMF0gPSByZXN1bHRbMV0gPSByZXN1bHRbMl0gPSByZXN1bHRbM10KKyAgICAgICAgICAgICAgID0gKEdMZmxvYXQpIHNpbihhWzBdKTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfU0xFOiAgICAgICAgIC8qIHNldCBvbiBsZXNzIG9yIGVxdWFsICovCisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gKGFbMF0gPD0gYlswXSkgPyAxLjBGIDogMC4wRjsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IChhWzFdIDw9IGJbMV0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoYVsyXSA8PSBiWzJdKSA/IDEuMEYgOiAwLjBGOworICAgICAgICAgICAgcmVzdWx0WzNdID0gKGFbM10gPD0gYlszXSkgPyAxLjBGIDogMC4wRjsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIlNMRSAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnICVnKSA8PSAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TTFQ6ICAgICAgICAgLyogc2V0IG9uIGxlc3MgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICByZXN1bHRbMF0gPSAoYVswXSA8IGJbMF0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMV0gPSAoYVsxXSA8IGJbMV0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoYVsyXSA8IGJbMl0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbM10gPSAoYVszXSA8IGJbM10pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJTTFQgKCVnICVnICVnICVnKSA9ICglZyAlZyAlZyAlZykgPCAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIGJbMF0sIGJbMV0sIGJbMl0sIGJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TTkU6ICAgICAgICAgLyogc2V0IG9uIG5vdCBlcXVhbCAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdLCBiWzRdLCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzFdLCBtYWNoaW5lLCBiKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IChhWzBdICE9IGJbMF0pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICByZXN1bHRbMV0gPSAoYVsxXSAhPSBiWzFdKSA/IDEuMEYgOiAwLjBGOworICAgICAgICAgICAgcmVzdWx0WzJdID0gKGFbMl0gIT0gYlsyXSkgPyAxLjBGIDogMC4wRjsKKyAgICAgICAgICAgIHJlc3VsdFszXSA9IChhWzNdICE9IGJbM10pID8gMS4wRiA6IDAuMEY7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJTTkUgKCVnICVnICVnICVnKSA9ICglZyAlZyAlZyAlZykgIT0gKCVnICVnICVnICVnKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdLCByZXN1bHRbM10sCisgICAgICAgICAgICAgICAgICAgICAgYVswXSwgYVsxXSwgYVsyXSwgYVszXSwKKyAgICAgICAgICAgICAgICAgICAgICBiWzBdLCBiWzFdLCBiWzJdLCBiWzNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfU1NHOiAgICAgICAgIC8qIHNldCBzaWduICgtMSwgMCBvciArMSkgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IChHTGZsb2F0KSAoKGFbMF0gPiAwLjBGKSAtIChhWzBdIDwgMC4wRikpOworICAgICAgICAgICAgcmVzdWx0WzFdID0gKEdMZmxvYXQpICgoYVsxXSA+IDAuMEYpIC0gKGFbMV0gPCAwLjBGKSk7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoR0xmbG9hdCkgKChhWzJdID4gMC4wRikgLSAoYVsyXSA8IDAuMEYpKTsKKyAgICAgICAgICAgIHJlc3VsdFszXSA9IChHTGZsb2F0KSAoKGFbM10gPiAwLjBGKSAtIChhWzNdIDwgMC4wRikpOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TVFI6ICAgICAgICAgLyogc2V0IHRydWUsIG9wZXJhbmRzIGlnbm9yZWQgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBHTGZsb2F0IHJlc3VsdFs0XSA9IHsgMS4wRiwgMS4wRiwgMS4wRiwgMS4wRiB9OworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9TVUI6CisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IGFbNF0sIGJbNF0sIHJlc3VsdFs0XTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1swXSwgbWFjaGluZSwgYSk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMV0sIG1hY2hpbmUsIGIpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gYVswXSAtIGJbMF07CisgICAgICAgICAgICByZXN1bHRbMV0gPSBhWzFdIC0gYlsxXTsKKyAgICAgICAgICAgIHJlc3VsdFsyXSA9IGFbMl0gLSBiWzJdOworICAgICAgICAgICAgcmVzdWx0WzNdID0gYVszXSAtIGJbM107CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJTVUIgKCVnICVnICVnICVnKSA9ICglZyAlZyAlZyAlZykgLSAoJWcgJWcgJWcgJWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0sIHJlc3VsdFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBiWzBdLCBiWzFdLCBiWzJdLCBiWzNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfU1daOiAgICAgICAgIC8qIGV4dGVuZGVkIHN3aXp6bGUgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciAqc291cmNlID0gJmluc3QtPlNyY1JlZ1swXTsKKyAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnNyYyA9IGdldF9zcmNfcmVnaXN0ZXJfcG9pbnRlcihzb3VyY2UsIG1hY2hpbmUpOworICAgICAgICAgICAgR0xmbG9hdCByZXN1bHRbNF07CisgICAgICAgICAgICBHTHVpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgIGNvbnN0IEdMdWludCBzd3ogPSBHRVRfU1daKHNvdXJjZS0+U3dpenpsZSwgaSk7CisgICAgICAgICAgICAgICBpZiAoc3d6ID09IFNXSVpaTEVfWkVSTykKKyAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IDAuMDsKKyAgICAgICAgICAgICAgIGVsc2UgaWYgKHN3eiA9PSBTV0laWkxFX09ORSkKKyAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IDEuMDsKKyAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgQVNTRVJUKHN3eiA+PSAwKTsKKyAgICAgICAgICAgICAgICAgIEFTU0VSVChzd3ogPD0gMyk7CisgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBzcmNbc3d6XTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPk5lZ2F0ZSAmICgxIDw8IGkpKQorICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gLXJlc3VsdFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfVEVYOiAgICAgICAgIC8qIEJvdGggQVJCIGFuZCBOViBmcmFnIHByb2cgKi8KKyAgICAgICAgIC8qIFNpbXBsZSB0ZXhlbCBsb29rdXAgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgdGV4Y29vcmRbNF0sIGNvbG9yWzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCB0ZXhjb29yZCk7CisKKyAgICAgICAgICAgIC8qIEZvciBURVgsIHRleGNvb3JkLlEgc2hvdWxkIG5vdCBiZSB1c2VkIGFuZCBpdHMgdmFsdWUgc2hvdWxkIG5vdAorICAgICAgICAgICAgICogbWF0dGVyIChhdCBtb3N0LCB3ZSBwYXNzIGNvb3JkLnh5eiB0byB0ZXh0dXJlM0QoKSBpbiBHTFNMKS4KKyAgICAgICAgICAgICAqIFNldCBRPTEgc28gdGhhdCBGZXRjaFRleGVsRGVyaXYoKSBkb2Vzbid0IGdldCBhIGdhcmJhZ2UgdmFsdWUKKyAgICAgICAgICAgICAqIHdoaWNoIGlzIGVmZmVjdGl2ZWx5IHdoYXQgaGFwcGVucyB3aGVuIHRoZSB0ZXhjb29yZCBzd2l6emxlCisgICAgICAgICAgICAgKiBpcyAueHl6egorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0ZXhjb29yZFszXSA9IDEuMGY7CisKKyAgICAgICAgICAgIGZldGNoX3RleGVsKGN0eCwgbWFjaGluZSwgaW5zdCwgdGV4Y29vcmQsIDAuMCwgY29sb3IpOworCisgICAgICAgICAgICBpZiAoREVCVUdfUFJPRykgeworICAgICAgICAgICAgICAgcHJpbnRmKCJURVggKCVnLCAlZywgJWcsICVnKSA9IHRleHR1cmVbJWRdWyVnLCAlZywgJWcsICVnXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBjb2xvclszXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5UZXhTcmNVbml0LAorICAgICAgICAgICAgICAgICAgICAgIHRleGNvb3JkWzBdLCB0ZXhjb29yZFsxXSwgdGV4Y29vcmRbMl0sIHRleGNvb3JkWzNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgY29sb3IpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9UWEI6ICAgICAgICAgLyogR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0gb25seSAqLworICAgICAgICAgLyogVGV4ZWwgbG9va3VwIHdpdGggTE9EIGJpYXMgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgdGV4Y29vcmRbNF0sIGNvbG9yWzRdLCBsb2RCaWFzOworCisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIHRleGNvb3JkKTsKKworICAgICAgICAgICAgLyogdGV4Y29vcmRbM10gaXMgdGhlIGJpYXMgdG8gYWRkIHRvIGxhbWJkYSAqLworICAgICAgICAgICAgbG9kQmlhcyA9IHRleGNvb3JkWzNdOworCisgICAgICAgICAgICBmZXRjaF90ZXhlbChjdHgsIG1hY2hpbmUsIGluc3QsIHRleGNvb3JkLCBsb2RCaWFzLCBjb2xvcik7CisKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIlRYQiAoJWcsICVnLCAlZywgJWcpID0gdGV4dHVyZVslZF1bJWcgJWcgJWcgJWddIgorICAgICAgICAgICAgICAgICAgICAgICIgIGJpYXMgJWdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgY29sb3JbM10sCisgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+VGV4U3JjVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBsb2RCaWFzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCBjb2xvcik7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1RYRDogICAgICAgICAvKiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtIG9ubHkgKi8KKyAgICAgICAgIC8qIFRleHR1cmUgbG9va3VwIHcvIHBhcnRpYWwgZGVyaXZhdGl2ZXMgZm9yIExPRCAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCB0ZXhjb29yZFs0XSwgZHRkeFs0XSwgZHRkeVs0XSwgY29sb3JbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIHRleGNvb3JkKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgZHRkeCk7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMl0sIG1hY2hpbmUsIGR0ZHkpOworICAgICAgICAgICAgbWFjaGluZS0+RmV0Y2hUZXhlbERlcml2KGN0eCwgdGV4Y29vcmQsIGR0ZHgsIGR0ZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAvKiBsb2RCaWFzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+VGV4U3JjVW5pdCwgY29sb3IpOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCBjb2xvcik7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1RYTDoKKyAgICAgICAgIC8qIFRleGVsIGxvb2t1cCB3aXRoIGV4cGxpY2l0IExPRCAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCB0ZXhjb29yZFs0XSwgY29sb3JbNF0sIGxvZDsKKworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCB0ZXhjb29yZCk7CisKKyAgICAgICAgICAgIC8qIHRleGNvb3JkWzNdIGlzIHRoZSBMT0QgKi8KKyAgICAgICAgICAgIGxvZCA9IHRleGNvb3JkWzNdOworCisJICAgIG1hY2hpbmUtPkZldGNoVGV4ZWxMb2QoY3R4LCB0ZXhjb29yZCwgbG9kLAorCQkJCSAgIG1hY2hpbmUtPlNhbXBsZXJzW2luc3QtPlRleFNyY1VuaXRdLCBjb2xvcik7CisKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgY29sb3IpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9UWFA6ICAgICAgICAgLyogR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0gb25seSAqLworICAgICAgICAgLyogVGV4dHVyZSBsb29rdXAgdy8gcHJvamVjdGl2ZSBkaXZpZGUgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgdGV4Y29vcmRbNF0sIGNvbG9yWzRdOworCisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIHRleGNvb3JkKTsKKyAgICAgICAgICAgIC8qIE5vdCBzbyBzdXJlIGFib3V0IHRoaXMgdGVzdCAtIGlmIHRleGNvb3JkWzNdIGlzCisgICAgICAgICAgICAgKiB6ZXJvLCB3ZSdkIHByb2JhYmx5IGJlIGZpbmUgZXhjZXB0IGZvciBhbiBBU1NFUlQgaW4KKyAgICAgICAgICAgICAqIElST1VORF9QT1MoKSB3aGljaCBnZXRzIHRyaWdnZXJlZCBieSB0aGUgaW5mIHZhbHVlcyBjcmVhdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodGV4Y29vcmRbM10gIT0gMC4wKSB7CisgICAgICAgICAgICAgICB0ZXhjb29yZFswXSAvPSB0ZXhjb29yZFszXTsKKyAgICAgICAgICAgICAgIHRleGNvb3JkWzFdIC89IHRleGNvb3JkWzNdOworICAgICAgICAgICAgICAgdGV4Y29vcmRbMl0gLz0gdGV4Y29vcmRbM107CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZldGNoX3RleGVsKGN0eCwgbWFjaGluZSwgaW5zdCwgdGV4Y29vcmQsIDAuMCwgY29sb3IpOworCisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIGNvbG9yKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfVFhQX05WOiAgICAgIC8qIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0gb25seSAqLworICAgICAgICAgLyogVGV4dHVyZSBsb29rdXAgdy8gcHJvamVjdGl2ZSBkaXZpZGUsIGFzIGFib3ZlLCBidXQgZG8gbm90CisgICAgICAgICAgKiBkbyB0aGUgZGl2aWRlIGJ5IHcgaWYgc2FtcGxpbmcgZnJvbSBhIGN1YmUgbWFwLgorICAgICAgICAgICovCisgICAgICAgICB7CisgICAgICAgICAgICBHTGZsb2F0IHRleGNvb3JkWzRdLCBjb2xvcls0XTsKKworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCB0ZXhjb29yZCk7CisgICAgICAgICAgICBpZiAoaW5zdC0+VGV4U3JjVGFyZ2V0ICE9IFRFWFRVUkVfQ1VCRV9JTkRFWCAmJgorICAgICAgICAgICAgICAgIHRleGNvb3JkWzNdICE9IDAuMCkgeworICAgICAgICAgICAgICAgdGV4Y29vcmRbMF0gLz0gdGV4Y29vcmRbM107CisgICAgICAgICAgICAgICB0ZXhjb29yZFsxXSAvPSB0ZXhjb29yZFszXTsKKyAgICAgICAgICAgICAgIHRleGNvb3JkWzJdIC89IHRleGNvb3JkWzNdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmZXRjaF90ZXhlbChjdHgsIG1hY2hpbmUsIGluc3QsIHRleGNvb3JkLCAwLjAsIGNvbG9yKTsKKworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCBjb2xvcik7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1RSVU5DOiAgICAgICAvKiB0cnVuY2F0ZSB0b3dhcmQgemVybyAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdLCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gKEdMZmxvYXQpIChHTGludCkgYVswXTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IChHTGZsb2F0KSAoR0xpbnQpIGFbMV07CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoR0xmbG9hdCkgKEdMaW50KSBhWzJdOworICAgICAgICAgICAgcmVzdWx0WzNdID0gKEdMZmxvYXQpIChHTGludCkgYVszXTsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfVVAySDogICAgICAgIC8qIHVucGFjayB0d28gMTYtYml0IGZsb2F0cyAqLworICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgR0x1aW50IHJhdyA9IGZldGNoX3ZlY3RvcjF1aSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lKTsKKyAgICAgICAgICAgIEdMZmxvYXQgcmVzdWx0WzRdOworICAgICAgICAgICAgR0x1c2hvcnQgaHgsIGh5OworICAgICAgICAgICAgaHggPSByYXcgJiAweGZmZmY7CisgICAgICAgICAgICBoeSA9IHJhdyA+PiAxNjsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IHJlc3VsdFsyXSA9IF9tZXNhX2hhbGZfdG9fZmxvYXQoaHgpOworICAgICAgICAgICAgcmVzdWx0WzFdID0gcmVzdWx0WzNdID0gX21lc2FfaGFsZl90b19mbG9hdChoeSk7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1VQMlVTOiAgICAgICAvKiB1bnBhY2sgdHdvIEdMdXNob3J0cyAqLworICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgR0x1aW50IHJhdyA9IGZldGNoX3ZlY3RvcjF1aSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lKTsKKyAgICAgICAgICAgIEdMZmxvYXQgcmVzdWx0WzRdOworICAgICAgICAgICAgR0x1c2hvcnQgdXN4LCB1c3k7CisgICAgICAgICAgICB1c3ggPSByYXcgJiAweGZmZmY7CisgICAgICAgICAgICB1c3kgPSByYXcgPj4gMTY7CisgICAgICAgICAgICByZXN1bHRbMF0gPSByZXN1bHRbMl0gPSB1c3ggKiAoMS4wZiAvIDY1NTM1LjBmKTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IHJlc3VsdFszXSA9IHVzeSAqICgxLjBmIC8gNjU1MzUuMGYpOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9VUDRCOiAgICAgICAgLyogdW5wYWNrIGZvdXIgR0xieXRlcyAqLworICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgR0x1aW50IHJhdyA9IGZldGNoX3ZlY3RvcjF1aSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lKTsKKyAgICAgICAgICAgIEdMZmxvYXQgcmVzdWx0WzRdOworICAgICAgICAgICAgcmVzdWx0WzBdID0gKCgocmF3ID4+IDApICYgMHhmZikgLSAxMjgpIC8gMTI3LjBGOworICAgICAgICAgICAgcmVzdWx0WzFdID0gKCgocmF3ID4+IDgpICYgMHhmZikgLSAxMjgpIC8gMTI3LjBGOworICAgICAgICAgICAgcmVzdWx0WzJdID0gKCgocmF3ID4+IDE2KSAmIDB4ZmYpIC0gMTI4KSAvIDEyNy4wRjsKKyAgICAgICAgICAgIHJlc3VsdFszXSA9ICgoKHJhdyA+PiAyNCkgJiAweGZmKSAtIDEyOCkgLyAxMjcuMEY7CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX1VQNFVCOiAgICAgICAvKiB1bnBhY2sgZm91ciBHTHVieXRlcyAqLworICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgR0x1aW50IHJhdyA9IGZldGNoX3ZlY3RvcjF1aSgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lKTsKKyAgICAgICAgICAgIEdMZmxvYXQgcmVzdWx0WzRdOworICAgICAgICAgICAgcmVzdWx0WzBdID0gKChyYXcgPj4gMCkgJiAweGZmKSAvIDI1NS4wRjsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9ICgocmF3ID4+IDgpICYgMHhmZikgLyAyNTUuMEY7CisgICAgICAgICAgICByZXN1bHRbMl0gPSAoKHJhdyA+PiAxNikgJiAweGZmKSAvIDI1NS4wRjsKKyAgICAgICAgICAgIHJlc3VsdFszXSA9ICgocmF3ID4+IDI0KSAmIDB4ZmYpIC8gMjU1LjBGOworICAgICAgICAgICAgc3RvcmVfdmVjdG9yNChpbnN0LCBtYWNoaW5lLCByZXN1bHQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9YUEQ6ICAgICAgICAgLyogY3Jvc3MgcHJvZHVjdCAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xmbG9hdCBhWzRdLCBiWzRdLCByZXN1bHRbNF07CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMF0sIG1hY2hpbmUsIGEpOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzFdLCBtYWNoaW5lLCBiKTsKKyAgICAgICAgICAgIHJlc3VsdFswXSA9IGFbMV0gKiBiWzJdIC0gYVsyXSAqIGJbMV07CisgICAgICAgICAgICByZXN1bHRbMV0gPSBhWzJdICogYlswXSAtIGFbMF0gKiBiWzJdOworICAgICAgICAgICAgcmVzdWx0WzJdID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTsKKyAgICAgICAgICAgIHJlc3VsdFszXSA9IDEuMDsKKyAgICAgICAgICAgIHN0b3JlX3ZlY3RvcjQoaW5zdCwgbWFjaGluZSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChERUJVR19QUk9HKSB7CisgICAgICAgICAgICAgICBwcmludGYoIlhQRCAoJWcgJWcgJWcgJWcpID0gKCVnICVnICVnKSBYICglZyAlZyAlZylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdLCByZXN1bHRbMV0sIHJlc3VsdFsyXSwgcmVzdWx0WzNdLAorICAgICAgICAgICAgICAgICAgICAgIGFbMF0sIGFbMV0sIGFbMl0sIGJbMF0sIGJbMV0sIGJbMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9YMkQ6ICAgICAgICAgLyogMi1EIG1hdHJpeCB0cmFuc2Zvcm0gKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEdMZmxvYXQgYVs0XSwgYls0XSwgY1s0XSwgcmVzdWx0WzRdOworICAgICAgICAgICAgZmV0Y2hfdmVjdG9yNCgmaW5zdC0+U3JjUmVnWzBdLCBtYWNoaW5lLCBhKTsKKyAgICAgICAgICAgIGZldGNoX3ZlY3RvcjQoJmluc3QtPlNyY1JlZ1sxXSwgbWFjaGluZSwgYik7CisgICAgICAgICAgICBmZXRjaF92ZWN0b3I0KCZpbnN0LT5TcmNSZWdbMl0sIG1hY2hpbmUsIGMpOworICAgICAgICAgICAgcmVzdWx0WzBdID0gYVswXSArIGJbMF0gKiBjWzBdICsgYlsxXSAqIGNbMV07CisgICAgICAgICAgICByZXN1bHRbMV0gPSBhWzFdICsgYlswXSAqIGNbMl0gKyBiWzFdICogY1szXTsKKyAgICAgICAgICAgIHJlc3VsdFsyXSA9IGFbMl0gKyBiWzBdICogY1swXSArIGJbMV0gKiBjWzFdOworICAgICAgICAgICAgcmVzdWx0WzNdID0gYVszXSArIGJbMF0gKiBjWzJdICsgYlsxXSAqIGNbM107CisgICAgICAgICAgICBzdG9yZV92ZWN0b3I0KGluc3QsIG1hY2hpbmUsIHJlc3VsdCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDT0RFX0VORDoKKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIF9tZXNhX3Byb2JsZW0oY3R4LCAiQmFkIG9wY29kZSAlZCBpbiBfbWVzYV9leGVjdXRlX3Byb2dyYW0iLAorICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5PcGNvZGUpOworICAgICAgICAgcmV0dXJuIEdMX1RSVUU7ICAgICAgICAvKiByZXR1cm4gdmFsdWUgZG9lc24ndCBtYXR0ZXIgKi8KKyAgICAgIH0KKworICAgICAgbnVtRXhlYysrOworICAgICAgaWYgKG51bUV4ZWMgPiBtYXhFeGVjKSB7CisJIHN0YXRpYyBHTGJvb2xlYW4gcmVwb3J0ZWQgPSBHTF9GQUxTRTsKKwkgaWYgKCFyZXBvcnRlZCkgeworCSAgICBfbWVzYV9wcm9ibGVtKGN0eCwgIkluZmluaXRlIGxvb3AgZGV0ZWN0ZWQgaW4gZnJhZ21lbnQgcHJvZ3JhbSIpOworCSAgICByZXBvcnRlZCA9IEdMX1RSVUU7CisJIH0KKyAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgfQorCisgICB9IC8qIGZvciBwYyAqLworCisgICByZXR1cm4gR0xfVFJVRTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19leGVjdXRlLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfZXhlY3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NTQyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfZXhlY3V0ZS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBQUk9HX0VYRUNVVEVfSAorI2RlZmluZSBQUk9HX0VYRUNVVEVfSAorCisjaW5jbHVkZSAibWFpbi9jb25maWcuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorCisKK3R5cGVkZWYgdm9pZCAoKkZldGNoVGV4ZWxMb2RGdW5jKShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBHTGZsb2F0IHRleGNvb3JkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgbGFtYmRhLCBHTHVpbnQgdW5pdCwgR0xmbG9hdCBjb2xvcls0XSk7CisKK3R5cGVkZWYgdm9pZCAoKkZldGNoVGV4ZWxEZXJpdkZ1bmMpKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIGNvbnN0IEdMZmxvYXQgdGV4Y29vcmRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0IHRleGR4WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB0ZXhkeVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgbG9kQmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCB1bml0LCBHTGZsb2F0IGNvbG9yWzRdKTsKKworCisvKiogTk9URTogVGhpcyBtdXN0IG1hdGNoIFNXUkFTVF9NQVhfV0lEVEggKi8KKyNkZWZpbmUgUFJPR19NQVhfV0lEVEggMTYzODQKKworCisvKioKKyAqIFZpcnR1YWwgbWFjaGluZSBzdGF0ZSB1c2VkIGR1cmluZyBleGVjdXRpb24gb2YgdmVydGV4L2ZyYWdtZW50IHByb2dyYW1zLgorICovCitzdHJ1Y3QgZ2xfcHJvZ3JhbV9tYWNoaW5lCit7CisgICBjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqQ3VyUHJvZ3JhbTsKKworICAgLyoqIEZyYWdtZW50IElucHV0IGF0dHJpYnV0ZXMgKi8KKyAgIEdMZmxvYXQgKCpBdHRyaWJzKVtQUk9HX01BWF9XSURUSF1bNF07CisgICBHTGZsb2F0ICgqRGVyaXZYKVs0XTsKKyAgIEdMZmxvYXQgKCpEZXJpdlkpWzRdOworICAgR0x1aW50IE51bURlcml2OyAvKio8IE1heCBpbmRleCBpbnRvIERlcml2WC9ZIGFycmF5cyAqLworICAgR0x1aW50IEN1ckVsZW1lbnQ7IC8qKjwgSW5kZXggaW50byBBdHRyaWJzIGFycmF5cyAqLworCisgICAvKiogVmVydGV4IElucHV0IGF0dHJpYnMgKi8KKyAgIEdMZmxvYXQgVmVydEF0dHJpYnNbVkVSVF9BVFRSSUJfTUFYXVs0XTsKKworICAgR0xmbG9hdCBUZW1wb3Jhcmllc1tNQVhfUFJPR1JBTV9URU1QU11bNF07CisgICBHTGZsb2F0IE91dHB1dHNbTUFYX1BST0dSQU1fT1VUUFVUU11bNF07CisgICBHTGZsb2F0ICgqRW52UGFyYW1zKVs0XTsgLyoqPCBWZXJ0ZXggb3IgRnJhZ21lbnQgZW52IHBhcmFtZXRlcnMgKi8KKyAgIEdMdWludCBDb25kQ29kZXNbNF07ICAvKio8IENPTkRfKiB2YWx1ZSBmb3IgeC95L3ovdyAqLworICAgR0xpbnQgQWRkcmVzc1JlZ1tNQVhfUFJPR1JBTV9BRERSRVNTX1JFR1NdWzRdOworICAgR0xmbG9hdCBTeXN0ZW1WYWx1ZXNbU1lTVEVNX1ZBTFVFX01BWF1bNF07CisKKyAgIGNvbnN0IEdMdWJ5dGUgKlNhbXBsZXJzOyAgLyoqIEFycmF5IG1hcHBpbmcgc2FtcGxlciB2YXIgdG8gdGV4IHVuaXQgKi8KKworICAgR0x1aW50IENhbGxTdGFja1tNQVhfUFJPR1JBTV9DQUxMX0RFUFRIXTsgLyoqPCBGb3IgQ0FML1JFVCBpbnN0cnVjdGlvbnMgKi8KKyAgIEdMdWludCBTdGFja0RlcHRoOyAvKio8IEluZGV4L3B0ciB0byB0b3Agb2YgQ2FsbFN0YWNrW10gKi8KKworICAgLyoqIFRleHR1cmUgZmV0Y2ggZnVuY3Rpb25zICovCisgICBGZXRjaFRleGVsTG9kRnVuYyBGZXRjaFRleGVsTG9kOworICAgRmV0Y2hUZXhlbERlcml2RnVuYyBGZXRjaFRleGVsRGVyaXY7Cit9OworCisKK2V4dGVybiB2b2lkCitfbWVzYV9nZXRfcHJvZ3JhbV9yZWdpc3RlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgdmFsWzRdKTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21lc2FfZXhlY3V0ZV9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW1fbWFjaGluZSAqbWFjaGluZSk7CisKKworI2VuZGlmIC8qIFBST0dfRVhFQ1VURV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfaGFzaF90YWJsZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2hhc2hfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDVlZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2hhc2hfdGFibGUuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaGFzaF90YWJsZS5jCisgKiBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBnZW5lcmljLCBvcGFxdWUgaGFzaCB0YWJsZSBkYXRhIHR5cGUuCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSAibWFpbi9pbXBvcnRzLmgiCisjaW5jbHVkZSAibWFpbi9zaW1wbGVfbGlzdC5oIgorI2luY2x1ZGUgImhhc2hfdGFibGUuaCIKKworc3RydWN0IG5vZGUgeworICAgc3RydWN0IG5vZGUgKm5leHQ7CisgICBzdHJ1Y3Qgbm9kZSAqcHJldjsKK307CisKK3N0cnVjdCBoYXNoX3RhYmxlIHsKKyAgICBoYXNoX2Z1bmNfdCAgICBoYXNoOworICAgIGhhc2hfY29tcGFyZV9mdW5jX3QgIGNvbXBhcmU7CisKKyAgICB1bnNpZ25lZCBudW1fYnVja2V0czsKKyAgICBzdHJ1Y3Qgbm9kZSBidWNrZXRzWzFdOworfTsKKworCitzdHJ1Y3QgaGFzaF9ub2RlIHsKKyAgICBzdHJ1Y3Qgbm9kZSBsaW5rOworICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICB2b2lkICpkYXRhOworfTsKKworCitzdHJ1Y3QgaGFzaF90YWJsZSAqCitoYXNoX3RhYmxlX2N0b3IodW5zaWduZWQgbnVtX2J1Y2tldHMsIGhhc2hfZnVuY190IGhhc2gsCisgICAgICAgICAgICAgICAgaGFzaF9jb21wYXJlX2Z1bmNfdCBjb21wYXJlKQoreworICAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKKyAgICB1bnNpZ25lZCBpOworCisKKyAgICBpZiAobnVtX2J1Y2tldHMgPCAxNikgeworICAgICAgICBudW1fYnVja2V0cyA9IDE2OworICAgIH0KKworICAgIGh0ID0gbWFsbG9jKHNpemVvZigqaHQpICsgKChudW1fYnVja2V0cyAtIDEpIAorCQkJCSAgICAgKiBzaXplb2YoaHQtPmJ1Y2tldHNbMF0pKSk7CisgICAgaWYgKGh0ICE9IE5VTEwpIHsKKyAgICAgICAgaHQtPmhhc2ggPSBoYXNoOworICAgICAgICBodC0+Y29tcGFyZSA9IGNvbXBhcmU7CisgICAgICAgIGh0LT5udW1fYnVja2V0cyA9IG51bV9idWNrZXRzOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVja2V0czsgaSsrKSB7CisgICAgICAgICAgICBtYWtlX2VtcHR5X2xpc3QoJiBodC0+YnVja2V0c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaHQ7Cit9CisKKwordm9pZAoraGFzaF90YWJsZV9kdG9yKHN0cnVjdCBoYXNoX3RhYmxlICpodCkKK3sKKyAgIGhhc2hfdGFibGVfY2xlYXIoaHQpOworICAgZnJlZShodCk7Cit9CisKKwordm9pZAoraGFzaF90YWJsZV9jbGVhcihzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpCit7CisgICBzdHJ1Y3Qgbm9kZSAqbm9kZTsKKyAgIHN0cnVjdCBub2RlICp0ZW1wOworICAgdW5zaWduZWQgaTsKKworCisgICBmb3IgKGkgPSAwOyBpIDwgaHQtPm51bV9idWNrZXRzOyBpKyspIHsKKyAgICAgIGZvcmVhY2hfcyhub2RlLCB0ZW1wLCAmIGh0LT5idWNrZXRzW2ldKSB7CisJIHJlbW92ZV9mcm9tX2xpc3Qobm9kZSk7CisJIGZyZWUobm9kZSk7CisgICAgICB9CisKKyAgICAgIGFzc2VydChpc19lbXB0eV9saXN0KCYgaHQtPmJ1Y2tldHNbaV0pKTsKKyAgIH0KK30KKworCitzdGF0aWMgc3RydWN0IGhhc2hfbm9kZSAqCitnZXRfbm9kZShzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBoYXNoX3ZhbHVlID0gKCpodC0+aGFzaCkoa2V5KTsKKyAgICBjb25zdCB1bnNpZ25lZCBidWNrZXQgPSBoYXNoX3ZhbHVlICUgaHQtPm51bV9idWNrZXRzOworICAgIHN0cnVjdCBub2RlICpub2RlOworCisgICAgZm9yZWFjaChub2RlLCAmIGh0LT5idWNrZXRzW2J1Y2tldF0pIHsKKyAgICAgICBzdHJ1Y3QgaGFzaF9ub2RlICpobiA9IChzdHJ1Y3QgaGFzaF9ub2RlICopIG5vZGU7CisKKyAgICAgICBpZiAoKCpodC0+Y29tcGFyZSkoaG4tPmtleSwga2V5KSA9PSAwKSB7CisJICByZXR1cm4gaG47CisgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICoKK2hhc2hfdGFibGVfZmluZChzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSkKK3sKKyAgIHN0cnVjdCBoYXNoX25vZGUgKmhuID0gZ2V0X25vZGUoaHQsIGtleSk7CisKKyAgIHJldHVybiAoaG4gPT0gTlVMTCkgPyBOVUxMIDogaG4tPmRhdGE7Cit9CisKK3ZvaWQKK2hhc2hfdGFibGVfaW5zZXJ0KHN0cnVjdCBoYXNoX3RhYmxlICpodCwgdm9pZCAqZGF0YSwgY29uc3Qgdm9pZCAqa2V5KQoreworICAgIGNvbnN0IHVuc2lnbmVkIGhhc2hfdmFsdWUgPSAoKmh0LT5oYXNoKShrZXkpOworICAgIGNvbnN0IHVuc2lnbmVkIGJ1Y2tldCA9IGhhc2hfdmFsdWUgJSBodC0+bnVtX2J1Y2tldHM7CisgICAgc3RydWN0IGhhc2hfbm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpub2RlKSk7CisKKyAgICBub2RlLT5kYXRhID0gZGF0YTsKKyAgICBub2RlLT5rZXkgPSBrZXk7CisKKyAgICBpbnNlcnRfYXRfaGVhZCgmIGh0LT5idWNrZXRzW2J1Y2tldF0sICYgbm9kZS0+bGluayk7Cit9CisKK2Jvb2wKK2hhc2hfdGFibGVfcmVwbGFjZShzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsIHZvaWQgKmRhdGEsIGNvbnN0IHZvaWQgKmtleSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBoYXNoX3ZhbHVlID0gKCpodC0+aGFzaCkoa2V5KTsKKyAgICBjb25zdCB1bnNpZ25lZCBidWNrZXQgPSBoYXNoX3ZhbHVlICUgaHQtPm51bV9idWNrZXRzOworICAgIHN0cnVjdCBub2RlICpub2RlOworICAgIHN0cnVjdCBoYXNoX25vZGUgKmhuOworCisgICAgZm9yZWFjaChub2RlLCAmIGh0LT5idWNrZXRzW2J1Y2tldF0pIHsKKyAgICAgICBobiA9IChzdHJ1Y3QgaGFzaF9ub2RlICopIG5vZGU7CisKKyAgICAgICBpZiAoKCpodC0+Y29tcGFyZSkoaG4tPmtleSwga2V5KSA9PSAwKSB7CisJICBobi0+ZGF0YSA9IGRhdGE7CisJICByZXR1cm4gdHJ1ZTsKKyAgICAgICB9CisgICAgfQorCisgICAgaG4gPSBjYWxsb2MoMSwgc2l6ZW9mKCpobikpOworCisgICAgaG4tPmRhdGEgPSBkYXRhOworICAgIGhuLT5rZXkgPSBrZXk7CisKKyAgICBpbnNlcnRfYXRfaGVhZCgmIGh0LT5idWNrZXRzW2J1Y2tldF0sICYgaG4tPmxpbmspOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZAoraGFzaF90YWJsZV9yZW1vdmUoc3RydWN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB2b2lkICprZXkpCit7CisgICBzdHJ1Y3Qgbm9kZSAqbm9kZSA9IChzdHJ1Y3Qgbm9kZSAqKSBnZXRfbm9kZShodCwga2V5KTsKKyAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgIHJlbW92ZV9mcm9tX2xpc3Qobm9kZSk7CisgICAgICBmcmVlKG5vZGUpOworICAgICAgcmV0dXJuOworICAgfQorfQorCit2b2lkCitoYXNoX3RhYmxlX2NhbGxfZm9yZWFjaChzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsCisJCQl2b2lkICgqY2FsbGJhY2spKGNvbnN0IHZvaWQgKmtleSwKKwkJCQkJIHZvaWQgKmRhdGEsCisJCQkJCSB2b2lkICpjbG9zdXJlKSwKKwkJCXZvaWQgKmNsb3N1cmUpCit7CisgICB1bnNpZ25lZCBidWNrZXQ7CisKKyAgIGZvciAoYnVja2V0ID0gMDsgYnVja2V0IDwgaHQtPm51bV9idWNrZXRzOyBidWNrZXQrKykgeworICAgICAgc3RydWN0IG5vZGUgKm5vZGUsICp0ZW1wOworICAgICAgZm9yZWFjaF9zKG5vZGUsIHRlbXAsICZodC0+YnVja2V0c1tidWNrZXRdKSB7CisJIHN0cnVjdCBoYXNoX25vZGUgKmhuID0gKHN0cnVjdCBoYXNoX25vZGUgKikgbm9kZTsKKworCSBjYWxsYmFjayhobi0+a2V5LCBobi0+ZGF0YSwgY2xvc3VyZSk7CisgICAgICB9CisgICB9Cit9CisKK3Vuc2lnbmVkCitoYXNoX3RhYmxlX3N0cmluZ19oYXNoKGNvbnN0IHZvaWQgKmtleSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSAoY29uc3QgY2hhciAqKSBrZXk7CisgICAgdW5zaWduZWQgaGFzaCA9IDUzODE7CisKKworICAgIHdoaWxlICgqc3RyICE9ICdcMCcpIHsKKyAgICAgICAgaGFzaCA9IChoYXNoICogMzMpICsgKnN0cjsKKyAgICAgICAgc3RyKys7CisgICAgfQorCisgICAgcmV0dXJuIGhhc2g7Cit9CisKKwordW5zaWduZWQKK2hhc2hfdGFibGVfcG9pbnRlcl9oYXNoKGNvbnN0IHZvaWQgKmtleSkKK3sKKyAgIHJldHVybiAodW5zaWduZWQpKCh1aW50cHRyX3QpIGtleSAvIHNpemVvZih2b2lkICopKTsKK30KKworCitpbnQKK2hhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKGNvbnN0IHZvaWQgKmtleTEsIGNvbnN0IHZvaWQgKmtleTIpCit7CisgICByZXR1cm4ga2V5MSA9PSBrZXkyID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfaW5zdHJ1Y3Rpb24uYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZmVkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfaW5zdHJ1Y3Rpb24uYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOSAgVk13YXJlLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vaW1wb3J0cy5oIgorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAicHJvZ19pbnN0cnVjdGlvbi5oIgorCisKKy8qKgorICogSW5pdGlhbGl6ZSBwcm9ncmFtIGluc3RydWN0aW9uIGZpZWxkcyB0byBkZWZhdWx0cy4KKyAqIFxwYXJhbSBpbnN0ICBmaXJzdCBpbnN0cnVjdGlvbiB0byBpbml0aWFsaXplCisgKiBccGFyYW0gY291bnQgIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gaW5pdGlhbGl6ZQorICovCit2b2lkCitfbWVzYV9pbml0X2luc3RydWN0aW9ucyhzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwgR0x1aW50IGNvdW50KQoreworICAgR0x1aW50IGk7CisKKyAgIG1lbXNldChpbnN0LCAwLCBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbikpOworCisgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgaW5zdFtpXS5TcmNSZWdbMF0uRmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworICAgICAgaW5zdFtpXS5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgICAgIGluc3RbaV0uU3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKyAgICAgIGluc3RbaV0uU3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisgICAgICBpbnN0W2ldLlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisgICAgICBpbnN0W2ldLlNyY1JlZ1syXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisgICAgICBpbnN0W2ldLkRzdFJlZy5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisgICAgICBpbnN0W2ldLkRzdFJlZy5Xcml0ZU1hc2sgPSBXUklURU1BU0tfWFlaVzsKKyAgICAgIGluc3RbaV0uRHN0UmVnLkNvbmRNYXNrID0gQ09ORF9UUjsKKyAgICAgIGluc3RbaV0uRHN0UmVnLkNvbmRTd2l6emxlID0gU1dJWlpMRV9OT09QOworCisgICAgICBpbnN0W2ldLlNhdHVyYXRlTW9kZSA9IFNBVFVSQVRFX09GRjsKKyAgICAgIGluc3RbaV0uUHJlY2lzaW9uID0gRkxPQVQzMjsKKyAgIH0KK30KKworCisvKioKKyAqIEFsbG9jYXRlIGFuIGFycmF5IG9mIHByb2dyYW0gaW5zdHJ1Y3Rpb25zLgorICogXHBhcmFtIG51bUluc3QgIG51bWJlciBvZiBpbnN0cnVjdGlvbnMKKyAqIFxyZXR1cm4gcG9pbnRlciB0byBpbnN0cnVjdGlvbiBtZW1vcnkKKyAqLworc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKgorX21lc2FfYWxsb2NfaW5zdHJ1Y3Rpb25zKEdMdWludCBudW1JbnN0KQoreworICAgcmV0dXJuCisgICAgICBjYWxsb2MoMSwgbnVtSW5zdCAqIHNpemVvZihzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbikpOworfQorCisKKy8qKgorICogUmVhbGxvY2F0ZSBtZW1vcnkgc3RvcmluZyBhbiBhcnJheSBvZiBwcm9ncmFtIGluc3RydWN0aW9ucy4KKyAqIFRoaXMgaXMgdXNlZCB3aGVuIHdlIG5lZWQgdG8gYXBwZW5kIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIG9udG8gYW4KKyAqIHByb2dyYW0uCisgKiBccGFyYW0gb2xkSW5zdCAgcG9pbnRlciB0byBmaXJzdCBvZiBvbGQvc3JjIGluc3RydWN0aW9ucworICogXHBhcmFtIG51bU9sZEluc3QgIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgYXQgPG9sZEluc3Q+CisgKiBccGFyYW0gbnVtTmV3SW5zdCAgZGVzaXJlZCBzaXplIG9mIG5ldyBpbnN0cnVjdGlvbiBhcnJheS4KKyAqIFxyZXR1cm4gIHBvaW50ZXIgdG8gc3RhcnQgb2YgbmV3IGluc3RydWN0aW9uIGFycmF5LgorICovCitzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqCitfbWVzYV9yZWFsbG9jX2luc3RydWN0aW9ucyhzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqb2xkSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBudW1PbGRJbnN0LCBHTHVpbnQgbnVtTmV3SW5zdCkKK3sKKyAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpuZXdJbnN0OworCisgICBuZXdJbnN0ID0gKHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICopCisgICAgICBfbWVzYV9yZWFsbG9jKG9sZEluc3QsCisgICAgICAgICAgICAgICAgICAgIG51bU9sZEluc3QgKiBzaXplb2Yoc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24pLAorICAgICAgICAgICAgICAgICAgICBudW1OZXdJbnN0ICogc2l6ZW9mKHN0cnVjdCBwcm9nX2luc3RydWN0aW9uKSk7CisKKyAgIHJldHVybiBuZXdJbnN0OworfQorCisKKy8qKgorICogQ29weSBhbiBhcnJheSBvZiBwcm9ncmFtIGluc3RydWN0aW9ucy4KKyAqIFxwYXJhbSBkZXN0ICBwb2ludGVyIHRvIGRlc3RpbmF0aW9uLgorICogXHBhcmFtIHNyYyAgcG9pbnRlciB0byBzb3VyY2UuCisgKiBccGFyYW0gbiAgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0byBjb3B5LgorICogXHJldHVybiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uLgorICovCitzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqCitfbWVzYV9jb3B5X2luc3RydWN0aW9ucyhzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpzcmMsIEdMdWludCBuKQoreworICAgR0x1aW50IGk7CisgICBtZW1jcHkoZGVzdCwgc3JjLCBuICogc2l6ZW9mKHN0cnVjdCBwcm9nX2luc3RydWN0aW9uKSk7CisgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBpZiAoc3JjW2ldLkNvbW1lbnQpCisgICAgICAgICBkZXN0W2ldLkNvbW1lbnQgPSBfbWVzYV9zdHJkdXAoc3JjW2ldLkNvbW1lbnQpOworICAgfQorICAgcmV0dXJuIGRlc3Q7Cit9CisKKworLyoqCisgKiBGcmVlIGFuIGFycmF5IG9mIGluc3RydWN0aW9ucworICovCit2b2lkCitfbWVzYV9mcmVlX2luc3RydWN0aW9ucyhzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwgR0x1aW50IGNvdW50KQoreworICAgR0x1aW50IGk7CisgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgZnJlZSgoY2hhciAqKWluc3RbaV0uQ29tbWVudCk7CisgICB9CisgICBmcmVlKGluc3QpOworfQorCisKKy8qKgorICogQmFzaWMgaW5mbyBhYm91dCBlYWNoIGluc3RydWN0aW9uCisgKi8KK3N0cnVjdCBpbnN0cnVjdGlvbl9pbmZvCit7CisgICBnbF9pbnN0X29wY29kZSBPcGNvZGU7CisgICBjb25zdCBjaGFyICpOYW1lOworICAgR0x1aW50IE51bVNyY1JlZ3M7CisgICBHTHVpbnQgTnVtRHN0UmVnczsKK307CisKKy8qKgorICogSW5zdHJ1Y3Rpb24gaW5mbworICogXG5vdGUgT3Bjb2RlIHNob3VsZCBlcXVhbCBhcnJheSBpbmRleCEKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnN0cnVjdGlvbl9pbmZvIEluc3RJbmZvW01BWF9PUENPREVdID0geworICAgeyBPUENPREVfTk9QLCAgICAiTk9QIiwgICAgIDAsIDAgfSwKKyAgIHsgT1BDT0RFX0FCUywgICAgIkFCUyIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9BREQsICAgICJBREQiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfQVJMLCAgICAiQVJMIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX0JHTkxPT1AsIkJHTkxPT1AiLCAwLCAwIH0sCisgICB7IE9QQ09ERV9CR05TVUIsICJCR05TVUIiLCAgMCwgMCB9LAorICAgeyBPUENPREVfQlJLLCAgICAiQlJLIiwgICAgIDAsIDAgfSwKKyAgIHsgT1BDT0RFX0NBTCwgICAgIkNBTCIsICAgICAwLCAwIH0sCisgICB7IE9QQ09ERV9DTVAsICAgICJDTVAiLCAgICAgMywgMSB9LAorICAgeyBPUENPREVfQ09OVCwgICAiQ09OVCIsICAgIDAsIDAgfSwKKyAgIHsgT1BDT0RFX0NPUywgICAgIkNPUyIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9ERFgsICAgICJERFgiLCAgICAgMSwgMSB9LAorICAgeyBPUENPREVfRERZLCAgICAiRERZIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX0RQMiwgICAgIkRQMiIsICAgICAyLCAxIH0sCisgICB7IE9QQ09ERV9EUDMsICAgICJEUDMiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfRFA0LCAgICAiRFA0IiwgICAgIDIsIDEgfSwKKyAgIHsgT1BDT0RFX0RQSCwgICAgIkRQSCIsICAgICAyLCAxIH0sCisgICB7IE9QQ09ERV9EU1QsICAgICJEU1QiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfRUxTRSwgICAiRUxTRSIsICAgIDAsIDAgfSwKKyAgIHsgT1BDT0RFX0VORCwgICAgIkVORCIsICAgICAwLCAwIH0sCisgICB7IE9QQ09ERV9FTkRJRiwgICJFTkRJRiIsICAgMCwgMCB9LAorICAgeyBPUENPREVfRU5ETE9PUCwiRU5ETE9PUCIsIDAsIDAgfSwKKyAgIHsgT1BDT0RFX0VORFNVQiwgIkVORFNVQiIsICAwLCAwIH0sCisgICB7IE9QQ09ERV9FWDIsICAgICJFWDIiLCAgICAgMSwgMSB9LAorICAgeyBPUENPREVfRVhQLCAgICAiRVhQIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX0ZMUiwgICAgIkZMUiIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9GUkMsICAgICJGUkMiLCAgICAgMSwgMSB9LAorICAgeyBPUENPREVfSUYsICAgICAiSUYiLCAgICAgIDEsIDAgfSwKKyAgIHsgT1BDT0RFX0tJTCwgICAgIktJTCIsICAgICAxLCAwIH0sCisgICB7IE9QQ09ERV9LSUxfTlYsICJLSUxfTlYiLCAgMCwgMCB9LAorICAgeyBPUENPREVfTEcyLCAgICAiTEcyIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX0xJVCwgICAgIkxJVCIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9MT0csICAgICJMT0ciLCAgICAgMSwgMSB9LAorICAgeyBPUENPREVfTFJQLCAgICAiTFJQIiwgICAgIDMsIDEgfSwKKyAgIHsgT1BDT0RFX01BRCwgICAgIk1BRCIsICAgICAzLCAxIH0sCisgICB7IE9QQ09ERV9NQVgsICAgICJNQVgiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfTUlOLCAgICAiTUlOIiwgICAgIDIsIDEgfSwKKyAgIHsgT1BDT0RFX01PViwgICAgIk1PViIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9NVUwsICAgICJNVUwiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfTk9JU0UxLCAiTk9JU0UxIiwgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX05PSVNFMiwgIk5PSVNFMiIsICAxLCAxIH0sCisgICB7IE9QQ09ERV9OT0lTRTMsICJOT0lTRTMiLCAgMSwgMSB9LAorICAgeyBPUENPREVfTk9JU0U0LCAiTk9JU0U0IiwgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1BLMkgsICAgIlBLMkgiLCAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9QSzJVUywgICJQSzJVUyIsICAgMSwgMSB9LAorICAgeyBPUENPREVfUEs0QiwgICAiUEs0QiIsICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1BLNFVCLCAgIlBLNFVCIiwgICAxLCAxIH0sCisgICB7IE9QQ09ERV9QT1csICAgICJQT1ciLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfUkNQLCAgICAiUkNQIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1JFVCwgICAgIlJFVCIsICAgICAwLCAwIH0sCisgICB7IE9QQ09ERV9SRkwsICAgICJSRkwiLCAgICAgMSwgMSB9LAorICAgeyBPUENPREVfUlNRLCAgICAiUlNRIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1NDUywgICAgIlNDUyIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9TRVEsICAgICJTRVEiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfU0ZMLCAgICAiU0ZMIiwgICAgIDAsIDEgfSwKKyAgIHsgT1BDT0RFX1NHRSwgICAgIlNHRSIsICAgICAyLCAxIH0sCisgICB7IE9QQ09ERV9TR1QsICAgICJTR1QiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfU0lOLCAgICAiU0lOIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1NMRSwgICAgIlNMRSIsICAgICAyLCAxIH0sCisgICB7IE9QQ09ERV9TTFQsICAgICJTTFQiLCAgICAgMiwgMSB9LAorICAgeyBPUENPREVfU05FLCAgICAiU05FIiwgICAgIDIsIDEgfSwKKyAgIHsgT1BDT0RFX1NTRywgICAgIlNTRyIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9TVFIsICAgICJTVFIiLCAgICAgMCwgMSB9LAorICAgeyBPUENPREVfU1VCLCAgICAiU1VCIiwgICAgIDIsIDEgfSwKKyAgIHsgT1BDT0RFX1NXWiwgICAgIlNXWiIsICAgICAxLCAxIH0sCisgICB7IE9QQ09ERV9URVgsICAgICJURVgiLCAgICAgMSwgMSB9LAorICAgeyBPUENPREVfVFhCLCAgICAiVFhCIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1RYRCwgICAgIlRYRCIsICAgICAzLCAxIH0sCisgICB7IE9QQ09ERV9UWEwsICAgICJUWEwiLCAgICAgMSwgMSB9LAorICAgeyBPUENPREVfVFhQLCAgICAiVFhQIiwgICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1RYUF9OViwgIlRYUF9OViIsICAxLCAxIH0sCisgICB7IE9QQ09ERV9UUlVOQywgICJUUlVOQyIsICAgMSwgMSB9LAorICAgeyBPUENPREVfVVAySCwgICAiVVAySCIsICAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1VQMlVTLCAgIlVQMlVTIiwgICAxLCAxIH0sCisgICB7IE9QQ09ERV9VUDRCLCAgICJVUDRCIiwgICAgMSwgMSB9LAorICAgeyBPUENPREVfVVA0VUIsICAiVVA0VUIiLCAgIDEsIDEgfSwKKyAgIHsgT1BDT0RFX1gyRCwgICAgIlgyRCIsICAgICAzLCAxIH0sCisgICB7IE9QQ09ERV9YUEQsICAgICJYUEQiLCAgICAgMiwgMSB9Cit9OworCisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3JjIHJlZ2lzdGVycyBmb3IgdGhlIGdpdmVuIGluc3RydWN0aW9uL29wY29kZS4KKyAqLworR0x1aW50CitfbWVzYV9udW1faW5zdF9zcmNfcmVncyhnbF9pbnN0X29wY29kZSBvcGNvZGUpCit7CisgICBBU1NFUlQob3Bjb2RlIDwgTUFYX09QQ09ERSk7CisgICBBU1NFUlQob3Bjb2RlID09IEluc3RJbmZvW29wY29kZV0uT3Bjb2RlKTsKKyAgIEFTU0VSVChPUENPREVfWFBEID09IEluc3RJbmZvW09QQ09ERV9YUERdLk9wY29kZSk7CisgICByZXR1cm4gSW5zdEluZm9bb3Bjb2RlXS5OdW1TcmNSZWdzOworfQorCisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZHN0IHJlZ2lzdGVycyBmb3IgdGhlIGdpdmVuIGluc3RydWN0aW9uL29wY29kZS4KKyAqLworR0x1aW50CitfbWVzYV9udW1faW5zdF9kc3RfcmVncyhnbF9pbnN0X29wY29kZSBvcGNvZGUpCit7CisgICBBU1NFUlQob3Bjb2RlIDwgTUFYX09QQ09ERSk7CisgICBBU1NFUlQob3Bjb2RlID09IEluc3RJbmZvW29wY29kZV0uT3Bjb2RlKTsKKyAgIEFTU0VSVChPUENPREVfWFBEID09IEluc3RJbmZvW09QQ09ERV9YUERdLk9wY29kZSk7CisgICByZXR1cm4gSW5zdEluZm9bb3Bjb2RlXS5OdW1Ec3RSZWdzOworfQorCisKK0dMYm9vbGVhbgorX21lc2FfaXNfdGV4X2luc3RydWN0aW9uKGdsX2luc3Rfb3Bjb2RlIG9wY29kZSkKK3sKKyAgIHJldHVybiAob3Bjb2RlID09IE9QQ09ERV9URVggfHwKKyAgICAgICAgICAgb3Bjb2RlID09IE9QQ09ERV9UWEIgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IE9QQ09ERV9UWEQgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IE9QQ09ERV9UWEwgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IE9QQ09ERV9UWFApOworfQorCisKKy8qKgorICogQ2hlY2sgaWYgdGhlcmUncyBhIHBvdGVudGlhbCBzcmMvZHN0IHJlZ2lzdGVyIGRhdGEgZGVwZW5kZW5jeSB3aGVuCisgKiB1c2luZyBTT0EgZXhlY3V0aW9uLgorICogRXhhbXBsZToKKyAqICAgTU9WIFQsIFQueXh3ejsKKyAqIFRoaXMgd291bGQgZXhwYW5kIGludG86CisgKiAgIE1PViB0MCwgdDE7CisgKiAgIE1PViB0MSwgdDA7CisgKiAgIE1PViB0MiwgdDM7CisgKiAgIE1PViB0MywgdDI7CisgKiBUaGUgc2Vjb25kIGluc3RydWN0aW9uIHdpbGwgaGF2ZSB0aGUgd3JvbmcgdmFsdWUgZm9yIHQwIGlmIGV4ZWN1dGVkIGFzLWlzLgorICovCitHTGJvb2xlYW4KK19tZXNhX2NoZWNrX3NvYV9kZXBlbmRlbmNpZXMoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICBHTHVpbnQgaSwgY2hhbjsKKworICAgaWYgKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgPT0gV1JJVEVNQVNLX1ggfHwKKyAgICAgICBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID09IFdSSVRFTUFTS19ZIHx8CisgICAgICAgaW5zdC0+RHN0UmVnLldyaXRlTWFzayA9PSBXUklURU1BU0tfWiB8fAorICAgICAgIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgPT0gV1JJVEVNQVNLX1cgfHwKKyAgICAgICBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID09IDB4MCkgeworICAgICAgLyogbm8gY2hhbmNlIG9mIGRhdGEgZGVwZW5kZW5jeSAqLworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICAvKiBsb29wIG92ZXIgc3JjIHJlZ3MgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIGlmIChpbnN0LT5TcmNSZWdbaV0uRmlsZSA9PSBpbnN0LT5Ec3RSZWcuRmlsZSAmJgorICAgICAgICAgIGluc3QtPlNyY1JlZ1tpXS5JbmRleCA9PSBpbnN0LT5Ec3RSZWcuSW5kZXgpIHsKKyAgICAgICAgIC8qIGxvb3Agb3ZlciBkZXN0IGNoYW5uZWxzICovCisgICAgICAgICBHTHVpbnQgY2hhbm5lbHNXcml0dGVuID0gMHgwOworICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IDQ7IGNoYW4rKykgeworICAgICAgICAgICAgaWYgKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJiAoMSA8PCBjaGFuKSkgeworICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgd2UncmUgcmVhZGluZyBhIGNoYW5uZWwgdGhhdCdzIGJlZW4gd3JpdHRlbiAqLworICAgICAgICAgICAgICAgR0x1aW50IHN3aXp6bGUgPSBHRVRfU1daKGluc3QtPlNyY1JlZ1tpXS5Td2l6emxlLCBjaGFuKTsKKyAgICAgICAgICAgICAgIGlmIChzd2l6emxlIDw9IFNXSVpaTEVfVyAmJgorICAgICAgICAgICAgICAgICAgIChjaGFubmVsc1dyaXR0ZW4gJiAoMSA8PCBzd2l6emxlKSkpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBHTF9UUlVFOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBjaGFubmVsc1dyaXR0ZW4gfD0gKDEgPDwgY2hhbik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKKworLyoqCisgKiBSZXR1cm4gc3RyaW5nIG5hbWUgZm9yIGdpdmVuIHByb2dyYW0gb3Bjb2RlLgorICovCitjb25zdCBjaGFyICoKK19tZXNhX29wY29kZV9zdHJpbmcoZ2xfaW5zdF9vcGNvZGUgb3Bjb2RlKQoreworICAgaWYgKG9wY29kZSA8IE1BWF9PUENPREUpCisgICAgICByZXR1cm4gSW5zdEluZm9bb3Bjb2RlXS5OYW1lOworICAgZWxzZSB7CisgICAgICBzdGF0aWMgY2hhciBzWzIwXTsKKyAgICAgIF9tZXNhX3NucHJpbnRmKHMsIHNpemVvZihzKSwgIk9QJXUiLCBvcGNvZGUpOworICAgICAgcmV0dXJuIHM7CisgICB9Cit9CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2MDRlNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5oCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworLyoqCisgKiBcZmlsZSBwcm9nX2luc3RydWN0aW9uLmgKKyAqCisgKiBWZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbSBpbnN0cnVjdGlvbiBkYXRhdHlwZXMgYW5kIGNvbnN0YW50cy4KKyAqCisgKiBcYXV0aG9yIEJyaWFuIFBhdWwKKyAqIFxhdXRob3IgS2VpdGggV2hpdHdlbGwKKyAqIFxhdXRob3IgSWFuIFJvbWFuaWNrIDxpZHJAdXMuaWJtLmNvbT4KKyAqLworCisKKyNpZm5kZWYgUFJPR19JTlNUUlVDVElPTl9ICisjZGVmaW5lIFBST0dfSU5TVFJVQ1RJT05fSAorCisKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisKKworLyoqCisgKiBTd2l6emxlIGluZGV4ZXMuCisgKiBEbyBub3QgY2hhbmdlIQorICovCisvKkB7Ki8KKyNkZWZpbmUgU1dJWlpMRV9YICAgIDAKKyNkZWZpbmUgU1dJWlpMRV9ZICAgIDEKKyNkZWZpbmUgU1dJWlpMRV9aICAgIDIKKyNkZWZpbmUgU1dJWlpMRV9XICAgIDMKKyNkZWZpbmUgU1dJWlpMRV9aRVJPIDQgICAvKio8IEZvciBTV1ogaW5zdHJ1Y3Rpb24gb25seSAqLworI2RlZmluZSBTV0laWkxFX09ORSAgNSAgIC8qKjwgRm9yIFNXWiBpbnN0cnVjdGlvbiBvbmx5ICovCisjZGVmaW5lIFNXSVpaTEVfTklMICA3ICAgLyoqPCB1c2VkIGR1cmluZyBzaGFkZXIgY29kZSBnZW4gKHVuZGVmaW5lZCB2YWx1ZSkgKi8KKy8qQH0qLworCisjZGVmaW5lIE1BS0VfU1dJWlpMRTQoYSxiLGMsZCkgKCgoYSk8PDApIHwgKChiKTw8MykgfCAoKGMpPDw2KSB8ICgoZCk8PDkpKQorI2RlZmluZSBTV0laWkxFX05PT1AgICAgICAgICAgIE1BS0VfU1dJWlpMRTQoMCwxLDIsMykKKyNkZWZpbmUgR0VUX1NXWihzd3osIGlkeCkgICAgICAoKChzd3opID4+ICgoaWR4KSozKSkgJiAweDcpCisjZGVmaW5lIEdFVF9CSVQobXNrLCBpZHgpICAgICAgKCgobXNrKSA+PiAoaWR4KSkgJiAweDEpCisKKyNkZWZpbmUgU1dJWlpMRV9YWVpXIE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9YLCBTV0laWkxFX1ksIFNXSVpaTEVfWiwgU1dJWlpMRV9XKQorI2RlZmluZSBTV0laWkxFX1hYWFggTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX1gpCisjZGVmaW5lIFNXSVpaTEVfWVlZWSBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWSwgU1dJWlpMRV9ZLCBTV0laWkxFX1ksIFNXSVpaTEVfWSkKKyNkZWZpbmUgU1dJWlpMRV9aWlpaIE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9aLCBTV0laWkxFX1osIFNXSVpaTEVfWiwgU1dJWlpMRV9aKQorI2RlZmluZSBTV0laWkxFX1dXV1cgTUFLRV9TV0laWkxFNChTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1cpCisKKworLyoqCisgKiBXcml0ZW1hc2sgdmFsdWVzLCAxIGJpdCBwZXIgY29tcG9uZW50LgorICovCisvKkB7Ki8KKyNkZWZpbmUgV1JJVEVNQVNLX1ggICAgIDB4MQorI2RlZmluZSBXUklURU1BU0tfWSAgICAgMHgyCisjZGVmaW5lIFdSSVRFTUFTS19YWSAgICAweDMKKyNkZWZpbmUgV1JJVEVNQVNLX1ogICAgIDB4NAorI2RlZmluZSBXUklURU1BU0tfWFogICAgMHg1CisjZGVmaW5lIFdSSVRFTUFTS19ZWiAgICAweDYKKyNkZWZpbmUgV1JJVEVNQVNLX1hZWiAgIDB4NworI2RlZmluZSBXUklURU1BU0tfVyAgICAgMHg4CisjZGVmaW5lIFdSSVRFTUFTS19YVyAgICAweDkKKyNkZWZpbmUgV1JJVEVNQVNLX1lXICAgIDB4YQorI2RlZmluZSBXUklURU1BU0tfWFlXICAgMHhiCisjZGVmaW5lIFdSSVRFTUFTS19aVyAgICAweGMKKyNkZWZpbmUgV1JJVEVNQVNLX1haVyAgIDB4ZAorI2RlZmluZSBXUklURU1BU0tfWVpXICAgMHhlCisjZGVmaW5lIFdSSVRFTUFTS19YWVpXICAweGYKKy8qQH0qLworCisKKy8qKgorICogQ29uZGl0aW9uIGNvZGVzCisgKi8KKy8qQHsqLworI2RlZmluZSBDT05EX0dUICAxICAvKio8IGdyZWF0ZXIgdGhhbiB6ZXJvICovCisjZGVmaW5lIENPTkRfRVEgIDIgIC8qKjwgZXF1YWwgdG8gemVybyAqLworI2RlZmluZSBDT05EX0xUICAzICAvKio8IGxlc3MgdGhhbiB6ZXJvICovCisjZGVmaW5lIENPTkRfVU4gIDQgIC8qKjwgdW5vcmRlcmVkIChOYU4pICovCisjZGVmaW5lIENPTkRfR0UgIDUgIC8qKjwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8gKi8KKyNkZWZpbmUgQ09ORF9MRSAgNiAgLyoqPCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyAqLworI2RlZmluZSBDT05EX05FICA3ICAvKio8IG5vdCBlcXVhbCB0byB6ZXJvICovCisjZGVmaW5lIENPTkRfVFIgIDggIC8qKjwgYWx3YXlzIHRydWUgKi8KKyNkZWZpbmUgQ09ORF9GTCAgOSAgLyoqPCBhbHdheXMgZmFsc2UgKi8KKy8qQH0qLworCisKKy8qKgorICogSW5zdHJ1Y3Rpb24gcHJlY2lzaW9uIGZvciBHTF9OVl9mcmFnbWVudF9wcm9ncmFtCisgKi8KKy8qQHsqLworI2RlZmluZSBGTE9BVDMyICAweDEKKyNkZWZpbmUgRkxPQVQxNiAgMHgyCisjZGVmaW5lIEZJWEVEMTIgIDB4NAorLypAfSovCisKKworLyoqCisgKiBTYXR1cmF0aW9uIG1vZGVzIHdoZW4gc3RvcmluZyB2YWx1ZXMuCisgKi8KKy8qQHsqLworI2RlZmluZSBTQVRVUkFURV9PRkYgICAgICAgICAgICAwCisjZGVmaW5lIFNBVFVSQVRFX1pFUk9fT05FICAgICAgIDEKKy8qQH0qLworCisKKy8qKgorICogUGVyLWNvbXBvbmVudCBuZWdhdGlvbiBtYXNrcworICovCisvKkB7Ki8KKyNkZWZpbmUgTkVHQVRFX1ggICAgMHgxCisjZGVmaW5lIE5FR0FURV9ZICAgIDB4MgorI2RlZmluZSBORUdBVEVfWiAgICAweDQKKyNkZWZpbmUgTkVHQVRFX1cgICAgMHg4CisjZGVmaW5lIE5FR0FURV9YWVogIDB4NworI2RlZmluZSBORUdBVEVfWFlaVyAweGYKKyNkZWZpbmUgTkVHQVRFX05PTkUgMHgwCisvKkB9Ki8KKworCisvKioKKyAqIFByb2dyYW0gaW5zdHJ1Y3Rpb24gb3Bjb2RlcyBmb3IgdmVydGV4LCBmcmFnbWVudCBhbmQgZ2VvbWV0cnkgcHJvZ3JhbXMuCisgKi8KK3R5cGVkZWYgZW51bSBwcm9nX29wY29kZSB7CisgICAgICAgICAgICAgICAgICAgICAvKiBBUkJfdnAgICBBUkJfZnAgICBOVl92cCAgIE5WX2ZwICAgICBHTFNMICovCisgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBPUENPREVfTk9QID0gMCwgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfQUJTLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgMS4xICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfQURELCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfQVJMLCAgICAgICAvKiAgIFggICAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfQkdOTE9PUCwgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfQkdOU1VCLCAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfQlJLLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfQ0FMLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICAyICAgICAgICBvcHQgICovCisgICBPUENPREVfQ01QLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfQ09OVCwgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfQ09TLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfRERYLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfRERZLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfRFAyLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgWCAgICovCisgICBPUENPREVfRFAzLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfRFA0LCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfRFBILCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgMS4xICAgICAgICAgICAgICAgICAgICovCisgICBPUENPREVfRFNULCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfRUxTRSwgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfRU5ELCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICBvcHQgICovCisgICBPUENPREVfRU5ESUYsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfRU5ETE9PUCwgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfRU5EU1VCLCAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfRVgyLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfRVhQLCAgICAgICAvKiAgIFggICAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgICovCisgICBPUENPREVfRkxSLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfRlJDLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfSUYsICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgICovCisgICBPUENPREVfS0lMLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfS0lMX05WLCAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfTEcyLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfTElULCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfTE9HLCAgICAgICAvKiAgIFggICAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgICovCisgICBPUENPREVfTFJQLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfTUFELCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfTUFYLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfTUlOLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfTU9WLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfTVVMLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfTk9JU0UxLCAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfTk9JU0UyLCAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfTk9JU0UzLCAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfTk9JU0U0LCAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfUEsySCwgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfUEsyVVMsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfUEs0QiwgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfUEs0VUIsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfUE9XLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgICAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfUkNQLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfUkVULCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICAyICAgICAgICBvcHQgICovCisgICBPUENPREVfUkZMLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfUlNRLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU0NTLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfU0VRLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU0ZMLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfU0dFLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU0dULCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU0lOLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU0xFLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU0xULCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgWCAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU05FLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU1NHLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfU1RSLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMiAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfU1VCLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgMS4xICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfU1daLCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfVEVYLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgMyAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfVFhCLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgMyAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfVFhELCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgWCAgICovCisgICBPUENPREVfVFhMLCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgMyAgICAgICAyICAgICAgICAgWCAgICovCisgICBPUENPREVfVFhQLCAgICAgICAvKiAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfVFhQX05WLCAgICAvKiAgICAgICAgICAgICAgICAgICAgMyAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfVFJVTkMsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICovCisgICBPUENPREVfVVAySCwgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfVVAyVVMsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfVVA0QiwgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfVVA0VUIsICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfWDJELCAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICovCisgICBPUENPREVfWFBELCAgICAgICAvKiAgIFggICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICBNQVhfT1BDT0RFCit9IGdsX2luc3Rfb3Bjb2RlOworCisKKy8qKgorICogTnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBzcmMvZHN0IHJlZ2lzdGVyIEluZGV4IGZpZWxkLgorICogVGhpcyBsaW1pdHMgdGhlIHNpemUgb2YgdGVtcC91bmlmb3JtIHJlZ2lzdGVyIGZpbGVzLgorICovCisjZGVmaW5lIElOU1RfSU5ERVhfQklUUyAxMgorCisKKy8qKgorICogSW5zdHJ1Y3Rpb24gc291cmNlIHJlZ2lzdGVyLgorICovCitzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIKK3sKKyAgIEdMdWludCBGaWxlOjQ7CS8qKjwgT25lIG9mIHRoZSBQUk9HUkFNXyogcmVnaXN0ZXIgZmlsZSB2YWx1ZXMuICovCisgICBHTGludCBJbmRleDooSU5TVF9JTkRFWF9CSVRTKzEpOyAvKio8IEV4dHJhIGJpdCBoZXJlIGZvciBzaWduIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE1heSBiZSBuZWdhdGl2ZSBmb3IgcmVsYXRpdmUgYWRkcmVzc2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgR0x1aW50IFN3aXp6bGU6MTI7CisgICBHTHVpbnQgUmVsQWRkcjoxOworCisgICAvKiogVGFrZSB0aGUgY29tcG9uZW50LXdpc2UgYWJzb2x1dGUgdmFsdWUgKi8KKyAgIEdMdWludCBBYnM6MTsKKworICAgLyoqCisgICAgKiBQb3N0LUFicyBuZWdhdGlvbi4KKyAgICAqIFRoaXMgd2lsbCBlaXRoZXIgYmUgTkVHQVRFX05PTkUgb3IgTkVHQVRFX1hZWlcsIGV4Y2VwdCBmb3IgdGhlIFNXWgorICAgICogaW5zdHJ1Y3Rpb24gd2hpY2ggYWxsb3dzIHBlci1jb21wb25lbnQgbmVnYXRpb24uCisgICAgKi8KKyAgIEdMdWludCBOZWdhdGU6NDsKKworICAgLyoqCisgICAgKiBJcyB0aGUgcmVnaXN0ZXIgdHdvLWRpbWVuc2lvbmFsLgorICAgICogVHdvIGRpbWVuc2lvbmFsIHJlZ2lzdGVycyBhcmUgb2YgdGhlCisgICAgKiBSRUdJU1RFUltpbmRleF1baW5kZXgyXSBmb3JtYXQuCisgICAgKiBUaGV5IGFyZSB1c2VkIGJ5IHRoZSBnZW9tZXRyeSBzaGFkZXJzIHdoZXJlCisgICAgKiB0aGUgZmlyc3QgaW5kZXggaXMgdGhlIGluZGV4IHdpdGhpbiBhbiBhcnJheQorICAgICogYW5kIHRoZSBzZWNvbmQgaW5kZXggaXMgdGhlIHNlbWFudGljIG9mIHRoZQorICAgICogYXJyYXksIGUuZy4gZ2xfUG9zaXRpb25JbltpbmRleF0gd291bGQgYmVjb21lCisgICAgKiBJTlBVVFtpbmRleF1bZ2xfUG9zaXRpb25Jbl0KKyAgICAqLworICAgR0x1aW50IEhhc0luZGV4MjoxOworICAgR0x1aW50IFJlbEFkZHIyOjE7CisgICBHTGludCBJbmRleDI6KElOU1RfSU5ERVhfQklUUysxKTsgLyoqPCBFeHRyYSBiaXQgaGVyZSBmb3Igc2lnbiBiaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE1heSBiZSBuZWdhdGl2ZSBmb3IgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkcmVzc2luZy4gKi8KK307CisKKworLyoqCisgKiBJbnN0cnVjdGlvbiBkZXN0aW5hdGlvbiByZWdpc3Rlci4KKyAqLworc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyCit7CisgICBHTHVpbnQgRmlsZTo0OyAgICAgIC8qKjwgT25lIG9mIHRoZSBQUk9HUkFNXyogcmVnaXN0ZXIgZmlsZSB2YWx1ZXMgKi8KKyAgIEdMdWludCBJbmRleDpJTlNUX0lOREVYX0JJVFM7ICAvKio8IFVuc2lnbmVkLCBuZXZlciBuZWdhdGl2ZSAqLworICAgR0x1aW50IFdyaXRlTWFzazo0OworICAgR0x1aW50IFJlbEFkZHI6MTsKKworICAgLyoqCisgICAgKiBcbmFtZSBDb25kaXRpb25hbCBkZXN0aW5hdGlvbiB1cGRhdGUgY29udHJvbC4KKyAgICAqCisgICAgKiBcc2luY2UKKyAgICAqIE5WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uLCBOVl92ZXJ0ZXhfcHJvZ3JhbTIsIE5WX3ZlcnRleF9wcm9ncmFtMl9vcHRpb24uCisgICAgKi8KKyAgIC8qQHsqLworICAgLyoqCisgICAgKiBUYWtlcyBvbmUgb2YgdGhlIDkgcG9zc2libGUgY29uZGl0aW9uIHZhbHVlcyAoRVEsIEZMLCBHVCwgR0UsIExFLCBMVCwKKyAgICAqIE5FLCBUUiwgb3IgVU4pLiAgRGVzdCByZWcgaXMgb25seSB3cml0dGVuIHRvIGlmIHRoZSBtYXRjaGluZworICAgICogKHN3aXp6bGVkKSBjb25kaXRpb24gY29kZSB2YWx1ZSBwYXNzZXMuICBXaGVuIGEgY29uZGl0aW9uYWwgdXBkYXRlIG1hc2sKKyAgICAqIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBcYyBDT05EX1RSLgorICAgICovCisgICBHTHVpbnQgQ29uZE1hc2s6NDsKKworICAgLyoqCisgICAgKiBDb25kaXRpb24gY29kZSBzd2l6emxlIHZhbHVlLgorICAgICovCisgICBHTHVpbnQgQ29uZFN3aXp6bGU6MTI7Cit9OworCisKKy8qKgorICogVmVydGV4L2ZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24uCisgKi8KK3N0cnVjdCBwcm9nX2luc3RydWN0aW9uCit7CisgICBnbF9pbnN0X29wY29kZSBPcGNvZGU7CisgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgU3JjUmVnWzNdOworICAgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIERzdFJlZzsKKworICAgLyoqCisgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gc2hvdWxkIHVwZGF0ZSB0aGUgY29uZGl0aW9uIGNvZGUKKyAgICAqIHJlZ2lzdGVyLgorICAgICoKKyAgICAqIFxzaW5jZQorICAgICogTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24sIE5WX3ZlcnRleF9wcm9ncmFtMiwgTlZfdmVydGV4X3Byb2dyYW0yX29wdGlvbi4KKyAgICAqLworICAgR0x1aW50IENvbmRVcGRhdGU6MTsKKworICAgLyoqCisgICAgKiBJZiBwcm9nX2luc3RydWN0aW9uOjpDb25kVXBkYXRlIGlzIFxjIEdMX1RSVUUsIHRoaXMgdmFsdWUgc2VsZWN0cyB0aGUKKyAgICAqIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIHRoYXQgaXMgdG8gYmUgdXBkYXRlZC4KKyAgICAqCisgICAgKiBJbiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtIG9yIEdMX05WX3ZlcnRleF9wcm9ncmFtMiBtb2RlLCBvbmx5IGNvbmRpdGlvbgorICAgICogY29kZSByZWdpc3RlciAwIGlzIGF2YWlsYWJsZS4gIEluIEdMX05WX3ZlcnRleF9wcm9ncmFtMyBtb2RlLCBjb25kaXRpb24KKyAgICAqIGNvZGUgcmVnaXN0ZXJzIDAgYW5kIDEgYXJlIGF2YWlsYWJsZS4KKyAgICAqCisgICAgKiBcc2luY2UKKyAgICAqIE5WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uLCBOVl92ZXJ0ZXhfcHJvZ3JhbTIsIE5WX3ZlcnRleF9wcm9ncmFtMl9vcHRpb24uCisgICAgKi8KKyAgIEdMdWludCBDb25kRHN0OjE7CisKKyAgIC8qKgorICAgICogU2F0dXJhdGUgZWFjaCB2YWx1ZSBvZiB0aGUgdmVjdG9yZWQgcmVzdWx0IHRvIHRoZSByYW5nZSBbMCwxXSBvciB0aGUKKyAgICAqIHJhbmdlIFstMSwxXS4gIFxjIFNTQVQgbW9kZSAoaS5lLiwgc2F0dXJhdGlvbiB0byB0aGUgcmFuZ2UgWy0xLDFdKSBpcworICAgICogb25seSBhdmFpbGFibGUgaW4gTlZfZnJhZ21lbnRfcHJvZ3JhbTIgbW9kZS4KKyAgICAqIFZhbHVlIGlzIG9uZSBvZiB0aGUgU0FUVVJBVEVfKiB0b2tlbnMuCisgICAgKgorICAgICogXHNpbmNlCisgICAgKiBOVl9mcmFnbWVudF9wcm9ncmFtX29wdGlvbiwgTlZfdmVydGV4X3Byb2dyYW0zLgorICAgICovCisgICBHTHVpbnQgU2F0dXJhdGVNb2RlOjI7CisKKyAgIC8qKgorICAgICogUGVyLWluc3RydWN0aW9uIHNlbGVjdGFibGUgcHJlY2lzaW9uOiBGTE9BVDMyLCBGTE9BVDE2LCBGSVhFRDEyLgorICAgICoKKyAgICAqIFxzaW5jZQorICAgICogTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24uCisgICAgKi8KKyAgIEdMdWludCBQcmVjaXNpb246MzsKKworICAgLyoqCisgICAgKiBcbmFtZSBFeHRyYSBmaWVsZHMgZm9yIFRFWCwgVFhCLCBUWEQsIFRYTCwgVFhQIGluc3RydWN0aW9ucy4KKyAgICAqLworICAgLypAeyovCisgICAvKiogU291cmNlIHRleHR1cmUgdW5pdC4gKi8KKyAgIEdMdWludCBUZXhTcmNVbml0OjU7CisKKyAgIC8qKiBTb3VyY2UgdGV4dHVyZSB0YXJnZXQsIG9uZSBvZiBURVhUVVJFX3sxRCwyRCwzRCxDVUJFLFJFQ1R9X0lOREVYICovCisgICBHTHVpbnQgVGV4U3JjVGFyZ2V0OjQ7CisKKyAgIC8qKiBUcnVlIGlmIHRleCBpbnN0cnVjdGlvbiBzaG91bGQgZG8gc2hhZG93IGNvbXBhcmlzb24gKi8KKyAgIEdMdWludCBUZXhTaGFkb3c6MTsKKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIEZvciBCUkEgYW5kIENBTCBpbnN0cnVjdGlvbnMsIHRoZSBsb2NhdGlvbiB0byBqdW1wIHRvLgorICAgICogRm9yIEJHTkxPT1AsIHBvaW50cyB0byBFTkRMT09QIChhbmQgdmljZS12ZXJzYSkuCisgICAgKiBGb3IgQlJLLCBwb2ludHMgdG8gRU5ETE9PUAorICAgICogRm9yIElGLCBwb2ludHMgdG8gRUxTRSBvciBFTkRJRi4KKyAgICAqIEZvciBFTFNFLCBwb2ludHMgdG8gRU5ESUYuCisgICAgKi8KKyAgIEdMaW50IEJyYW5jaFRhcmdldDsKKworICAgLyoqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KKyAgIGNvbnN0IGNoYXIgKkNvbW1lbnQ7CisKKyAgIC8qKiBmb3IgZHJpdmVyIHVzZSAodHJ5IHRvIHJlbW92ZSBzb21lZGF5KSAqLworICAgR0xpbnQgQXV4OworfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiB2b2lkCitfbWVzYV9pbml0X2luc3RydWN0aW9ucyhzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwgR0x1aW50IGNvdW50KTsKKworZXh0ZXJuIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICoKK19tZXNhX2FsbG9jX2luc3RydWN0aW9ucyhHTHVpbnQgbnVtSW5zdCk7CisKK2V4dGVybiBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqCitfbWVzYV9yZWFsbG9jX2luc3RydWN0aW9ucyhzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqb2xkSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBudW1PbGRJbnN0LCBHTHVpbnQgbnVtTmV3SW5zdCk7CisKK2V4dGVybiBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqCitfbWVzYV9jb3B5X2luc3RydWN0aW9ucyhzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpzcmMsIEdMdWludCBuKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZyZWVfaW5zdHJ1Y3Rpb25zKHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0LCBHTHVpbnQgY291bnQpOworCitleHRlcm4gR0x1aW50CitfbWVzYV9udW1faW5zdF9zcmNfcmVncyhnbF9pbnN0X29wY29kZSBvcGNvZGUpOworCitleHRlcm4gR0x1aW50CitfbWVzYV9udW1faW5zdF9kc3RfcmVncyhnbF9pbnN0X29wY29kZSBvcGNvZGUpOworCitleHRlcm4gR0xib29sZWFuCitfbWVzYV9pc190ZXhfaW5zdHJ1Y3Rpb24oZ2xfaW5zdF9vcGNvZGUgb3Bjb2RlKTsKKworZXh0ZXJuIEdMYm9vbGVhbgorX21lc2FfY2hlY2tfc29hX2RlcGVuZGVuY2llcyhjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCk7CisKK2V4dGVybiBjb25zdCBjaGFyICoKK19tZXNhX29wY29kZV9zdHJpbmcoZ2xfaW5zdF9vcGNvZGUgb3Bjb2RlKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBQUk9HX0lOU1RSVUNUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19ub2lzZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX25vaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5MjBjMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19ub2lzZS5jCkBAIC0wLDAgKzEsNjM4IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKgorICogU2ltcGxleE5vaXNlMTIzNAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUsIFN0ZWZhbiBHdXN0YXZzb24KKyAqCisgKiBDb250YWN0OiBzdGVndUBpdG4ubGl1LnNlCisgKi8KKworLyoqCisgKiBcZmlsZQorICogXGJyaWVmIEMgaW1wbGVtZW50YXRpb24gb2YgUGVybGluIFNpbXBsZXggTm9pc2Ugb3ZlciAxLCAyLCAzIGFuZCA0IGRpbXMuCisgKiBcYXV0aG9yIFN0ZWZhbiBHdXN0YXZzb24gKHN0ZWd1QGl0bi5saXUuc2UpCisgKgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgIlNpbXBsZXggTm9pc2UiIGFzIHByZXNlbnRlZCBieQorICogS2VuIFBlcmxpbiBhdCBhIHJlbGF0aXZlbHkgb2JzY3VyZSBhbmQgbm90IG9mdGVuIGNpdGVkIGNvdXJzZQorICogc2Vzc2lvbiAiUmVhbC1UaW1lIFNoYWRpbmciIGF0IFNpZ2dyYXBoIDIwMDEgKGJlZm9yZSByZWFsCisgKiB0aW1lIHNoYWRpbmcgYWN0dWFsbHkgdG9vayBvbiksIHVuZGVyIHRoZSB0aXRsZSAiaGFyZHdhcmUgbm9pc2UiLgorICogVGhlIDNEIGZ1bmN0aW9uIGlzIG51bWVyaWNhbGx5IGVxdWl2YWxlbnQgdG8gaGlzIEphdmEgcmVmZXJlbmNlCisgKiBjb2RlIGF2YWlsYWJsZSBpbiB0aGUgUERGIGNvdXJzZSBub3RlcywgYWx0aG91Z2ggSSByZS1pbXBsZW1lbnRlZAorICogaXQgZnJvbSBzY3JhdGNoIHRvIGdldCBtb3JlIHJlYWRhYmxlIGNvZGUuIFRoZSAxRCwgMkQgYW5kIDREIGNhc2VzCisgKiB3ZXJlIGltcGxlbWVudGVkIGZyb20gc2NyYXRjaCBieSBtZSBmcm9tIEtlbiBQZXJsaW4ncyB0ZXh0LgorICoKKyAqIFRoaXMgZmlsZSBoYXMgbm8gZGVwZW5kZW5jaWVzIG9uIGFueSBvdGhlciBmaWxlLCBub3QgZXZlbiBpdHMgb3duCisgKiBoZWFkZXIgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGlzIG1hZGUgZm9yIHVzZSBieSBleHRlcm5hbCBjb2RlIG9ubHkuCisgKi8KKworCisjaW5jbHVkZSAibWFpbi9pbXBvcnRzLmgiCisjaW5jbHVkZSAicHJvZ19ub2lzZS5oIgorCisjZGVmaW5lIEZBU1RGTE9PUih4KSAoICgoeCk+MCkgPyAoKGludCl4KSA6ICgoKGludCl4KS0xKSApCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBkYXRhCisgKi8KKworLyoqCisgKiBQZXJtdXRhdGlvbiB0YWJsZS4gVGhpcyBpcyBqdXN0IGEgcmFuZG9tIGp1bWJsZSBvZiBhbGwgbnVtYmVycyAwLTI1NSwKKyAqIHJlcGVhdGVkIHR3aWNlIHRvIGF2b2lkIHdyYXBwaW5nIHRoZSBpbmRleCBhdCAyNTUgZm9yIGVhY2ggbG9va3VwLgorICogVGhpcyBuZWVkcyB0byBiZSBleGFjdGx5IHRoZSBzYW1lIGZvciBhbGwgaW5zdGFuY2VzIG9uIGFsbCBwbGF0Zm9ybXMsCisgKiBzbyBpdCdzIGVhc2llc3QgdG8ganVzdCBrZWVwIGl0IGFzIHN0YXRpYyBleHBsaWNpdCBkYXRhLgorICogVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5lZWQgZm9yIGFueSBpbml0aWFsaXNhdGlvbiBvZiB0aGlzIGNsYXNzLgorICoKKyAqIE5vdGUgdGhhdCBtYWtpbmcgdGhpcyBhbiBpbnRbXSBpbnN0ZWFkIG9mIGEgY2hhcltdIG1pZ2h0IG1ha2UgdGhlCisgKiBjb2RlIHJ1biBmYXN0ZXIgb24gcGxhdGZvcm1zIHdpdGggYSBoaWdoIHBlbmFsdHkgZm9yIHVuYWxpZ25lZCBzaW5nbGUKKyAqIGJ5dGUgYWRkcmVzc2luZy4gSW50ZWwgeDg2IGlzIGdlbmVyYWxseSBzaW5nbGUtYnl0ZS1mcmllbmRseSwgYnV0CisgKiBzb21lIG90aGVyIENQVXMgYXJlIGZhc3RlciB3aXRoIDQtYWxpZ25lZCByZWFkcy4KKyAqIEhvd2V2ZXIsIGEgY2hhcltdIGlzIHNtYWxsZXIsIHdoaWNoIGF2b2lkcyBjYWNoZSB0cmFzaGluZywgYW5kIHRoYXQKKyAqIGlzIHByb2JhYmx5IHRoZSBtb3N0IGltcG9ydGFudCBhc3BlY3Qgb24gbW9zdCBhcmNoaXRlY3R1cmVzLgorICogVGhpcyBhcnJheSBpcyBhY2Nlc3NlZCBhICpsb3QqIGJ5IHRoZSBub2lzZSBmdW5jdGlvbnMuCisgKiBBIHZlY3Rvci12YWx1ZWQgbm9pc2Ugb3ZlciAzRCBhY2Nlc3NlcyBpdCA5NiB0aW1lcywgYW5kIGEKKyAqIGZsb2F0LXZhbHVlZCA0RCBub2lzZSA2NCB0aW1lcy4gV2Ugd2FudCB0aGlzIHRvIGZpdCBpbiB0aGUgY2FjaGUhCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBlcm1bNTEyXSA9IHsgMTUxLCAxNjAsIDEzNywgOTEsIDkwLCAxNSwKKyAgIDEzMSwgMTMsIDIwMSwgOTUsIDk2LCA1MywgMTk0LCAyMzMsIDcsIDIyNSwgMTQwLCAzNiwgMTAzLCAzMCwgNjksIDE0MiwgOCwKKyAgICAgIDk5LCAzNywgMjQwLCAyMSwgMTAsIDIzLAorICAgMTkwLCA2LCAxNDgsIDI0NywgMTIwLCAyMzQsIDc1LCAwLCAyNiwgMTk3LCA2MiwgOTQsIDI1MiwgMjE5LCAyMDMsIDExNywgMzUsCisgICAgICAxMSwgMzIsIDU3LCAxNzcsIDMzLAorICAgODgsIDIzNywgMTQ5LCA1NiwgODcsIDE3NCwgMjAsIDEyNSwgMTM2LCAxNzEsIDE2OCwgNjgsIDE3NSwgNzQsIDE2NSwgNzEsCisgICAgICAxMzQsIDEzOSwgNDgsIDI3LCAxNjYsCisgICA3NywgMTQ2LCAxNTgsIDIzMSwgODMsIDExMSwgMjI5LCAxMjIsIDYwLCAyMTEsIDEzMywgMjMwLCAyMjAsIDEwNSwgOTIsIDQxLAorICAgICAgNTUsIDQ2LCAyNDUsIDQwLCAyNDQsCisgICAxMDIsIDE0MywgNTQsIDY1LCAyNSwgNjMsIDE2MSwgMSwgMjE2LCA4MCwgNzMsIDIwOSwgNzYsIDEzMiwgMTg3LCAyMDgsIDg5LAorICAgICAgMTgsIDE2OSwgMjAwLCAxOTYsCisgICAxMzUsIDEzMCwgMTE2LCAxODgsIDE1OSwgODYsIDE2NCwgMTAwLCAxMDksIDE5OCwgMTczLCAxODYsIDMsIDY0LCA1MiwgMjE3LAorICAgICAgMjI2LCAyNTAsIDEyNCwgMTIzLAorICAgNSwgMjAyLCAzOCwgMTQ3LCAxMTgsIDEyNiwgMjU1LCA4MiwgODUsIDIxMiwgMjA3LCAyMDYsIDU5LCAyMjcsIDQ3LCAxNiwgNTgsCisgICAgICAxNywgMTgyLCAxODksIDI4LCA0MiwKKyAgIDIyMywgMTgzLCAxNzAsIDIxMywgMTE5LCAyNDgsIDE1MiwgMiwgNDQsIDE1NCwgMTYzLCA3MCwgMjIxLCAxNTMsIDEwMSwgMTU1LAorICAgICAgMTY3LCA0MywgMTcyLCA5LAorICAgMTI5LCAyMiwgMzksIDI1MywgMTksIDk4LCAxMDgsIDExMCwgNzksIDExMywgMjI0LCAyMzIsIDE3OCwgMTg1LCAxMTIsIDEwNCwKKyAgICAgIDIxOCwgMjQ2LCA5NywgMjI4LAorICAgMjUxLCAzNCwgMjQyLCAxOTMsIDIzOCwgMjEwLCAxNDQsIDEyLCAxOTEsIDE3OSwgMTYyLCAyNDEsIDgxLCA1MSwgMTQ1LCAyMzUsCisgICAgICAyNDksIDE0LCAyMzksIDEwNywKKyAgIDQ5LCAxOTIsIDIxNCwgMzEsIDE4MSwgMTk5LCAxMDYsIDE1NywgMTg0LCA4NCwgMjA0LCAxNzYsIDExNSwgMTIxLCA1MCwgNDUsCisgICAgICAxMjcsIDQsIDE1MCwgMjU0LAorICAgMTM4LCAyMzYsIDIwNSwgOTMsIDIyMiwgMTE0LCA2NywgMjksIDI0LCA3MiwgMjQzLCAxNDEsIDEyOCwgMTk1LCA3OCwgNjYsCisgICAgICAyMTUsIDYxLCAxNTYsIDE4MCwKKyAgIDE1MSwgMTYwLCAxMzcsIDkxLCA5MCwgMTUsCisgICAxMzEsIDEzLCAyMDEsIDk1LCA5NiwgNTMsIDE5NCwgMjMzLCA3LCAyMjUsIDE0MCwgMzYsIDEwMywgMzAsIDY5LCAxNDIsIDgsCisgICAgICA5OSwgMzcsIDI0MCwgMjEsIDEwLCAyMywKKyAgIDE5MCwgNiwgMTQ4LCAyNDcsIDEyMCwgMjM0LCA3NSwgMCwgMjYsIDE5NywgNjIsIDk0LCAyNTIsIDIxOSwgMjAzLCAxMTcsIDM1LAorICAgICAgMTEsIDMyLCA1NywgMTc3LCAzMywKKyAgIDg4LCAyMzcsIDE0OSwgNTYsIDg3LCAxNzQsIDIwLCAxMjUsIDEzNiwgMTcxLCAxNjgsIDY4LCAxNzUsIDc0LCAxNjUsIDcxLAorICAgICAgMTM0LCAxMzksIDQ4LCAyNywgMTY2LAorICAgNzcsIDE0NiwgMTU4LCAyMzEsIDgzLCAxMTEsIDIyOSwgMTIyLCA2MCwgMjExLCAxMzMsIDIzMCwgMjIwLCAxMDUsIDkyLCA0MSwKKyAgICAgIDU1LCA0NiwgMjQ1LCA0MCwgMjQ0LAorICAgMTAyLCAxNDMsIDU0LCA2NSwgMjUsIDYzLCAxNjEsIDEsIDIxNiwgODAsIDczLCAyMDksIDc2LCAxMzIsIDE4NywgMjA4LCA4OSwKKyAgICAgIDE4LCAxNjksIDIwMCwgMTk2LAorICAgMTM1LCAxMzAsIDExNiwgMTg4LCAxNTksIDg2LCAxNjQsIDEwMCwgMTA5LCAxOTgsIDE3MywgMTg2LCAzLCA2NCwgNTIsIDIxNywKKyAgICAgIDIyNiwgMjUwLCAxMjQsIDEyMywKKyAgIDUsIDIwMiwgMzgsIDE0NywgMTE4LCAxMjYsIDI1NSwgODIsIDg1LCAyMTIsIDIwNywgMjA2LCA1OSwgMjI3LCA0NywgMTYsIDU4LAorICAgICAgMTcsIDE4MiwgMTg5LCAyOCwgNDIsCisgICAyMjMsIDE4MywgMTcwLCAyMTMsIDExOSwgMjQ4LCAxNTIsIDIsIDQ0LCAxNTQsIDE2MywgNzAsIDIyMSwgMTUzLCAxMDEsIDE1NSwKKyAgICAgIDE2NywgNDMsIDE3MiwgOSwKKyAgIDEyOSwgMjIsIDM5LCAyNTMsIDE5LCA5OCwgMTA4LCAxMTAsIDc5LCAxMTMsIDIyNCwgMjMyLCAxNzgsIDE4NSwgMTEyLCAxMDQsCisgICAgICAyMTgsIDI0NiwgOTcsIDIyOCwKKyAgIDI1MSwgMzQsIDI0MiwgMTkzLCAyMzgsIDIxMCwgMTQ0LCAxMiwgMTkxLCAxNzksIDE2MiwgMjQxLCA4MSwgNTEsIDE0NSwgMjM1LAorICAgICAgMjQ5LCAxNCwgMjM5LCAxMDcsCisgICA0OSwgMTkyLCAyMTQsIDMxLCAxODEsIDE5OSwgMTA2LCAxNTcsIDE4NCwgODQsIDIwNCwgMTc2LCAxMTUsIDEyMSwgNTAsIDQ1LAorICAgICAgMTI3LCA0LCAxNTAsIDI1NCwKKyAgIDEzOCwgMjM2LCAyMDUsIDkzLCAyMjIsIDExNCwgNjcsIDI5LCAyNCwgNzIsIDI0MywgMTQxLCAxMjgsIDE5NSwgNzgsIDY2LAorICAgICAgMjE1LCA2MSwgMTU2LCAxODAKK307CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyB0byBjb21wdXRlIGdyYWRpZW50cy1kb3QtcmVzaWR1YWx2ZWN0b3JzICgxRCB0byA0RCkKKyAqIE5vdGUgdGhhdCB0aGVzZSBnZW5lcmF0ZSBncmFkaWVudHMgb2YgbW9yZSB0aGFuIHVuaXQgbGVuZ3RoLiBUbyBtYWtlCisgKiBhIGNsb3NlIG1hdGNoIHdpdGggdGhlIHZhbHVlIHJhbmdlIG9mIGNsYXNzaWMgUGVybGluIG5vaXNlLCB0aGUgZmluYWwKKyAqIG5vaXNlIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkIHRvIGZpdCBuaWNlbHkgd2l0aGluIFstMSwxXS4KKyAqIChUaGUgc2ltcGxleCBub2lzZSBmdW5jdGlvbnMgYXMgc3VjaCBhbHNvIGhhdmUgZGlmZmVyZW50IHNjYWxpbmcuKQorICogTm90ZSBhbHNvIHRoYXQgdGhlc2Ugbm9pc2UgZnVuY3Rpb25zIGFyZSB0aGUgbW9zdCBwcmFjdGljYWwgYW5kIHVzZWZ1bAorICogc2lnbmVkIHZlcnNpb24gb2YgUGVybGluIG5vaXNlLiBUbyByZXR1cm4gdmFsdWVzIGFjY29yZGluZyB0byB0aGUKKyAqIFJlbmRlck1hbiBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIFNMIG5vaXNlKCkgYW5kIHBub2lzZSgpIGZ1bmN0aW9ucywKKyAqIHRoZSBub2lzZSB2YWx1ZXMgbmVlZCB0byBiZSBzY2FsZWQgYW5kIG9mZnNldCB0byBbMCwxXSwgbGlrZSB0aGlzOgorICogZmxvYXQgU0xub2lzZSA9IChTaW1wbGV4Tm9pc2UxMjM0Ojpub2lzZSh4LHkseikgKyAxLjApICogMC41OworICovCisKK3N0YXRpYyBmbG9hdAorZ3JhZDEoaW50IGhhc2gsIGZsb2F0IHgpCit7CisgICBpbnQgaCA9IGhhc2ggJiAxNTsKKyAgIGZsb2F0IGdyYWQgPSAxLjBmICsgKGggJiA3KTsgLyogR3JhZGllbnQgdmFsdWUgMS4wLCAyLjAsIC4uLiwgOC4wICovCisgICBpZiAoaCAmIDgpCisgICAgICBncmFkID0gLWdyYWQ7ICAgICAgICAgICAgIC8qIFNldCBhIHJhbmRvbSBzaWduIGZvciB0aGUgZ3JhZGllbnQgKi8KKyAgIHJldHVybiAoZ3JhZCAqIHgpOyAgICAgICAgICAgLyogTXVsdGlwbHkgdGhlIGdyYWRpZW50IHdpdGggdGhlIGRpc3RhbmNlICovCit9CisKK3N0YXRpYyBmbG9hdAorZ3JhZDIoaW50IGhhc2gsIGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICBpbnQgaCA9IGhhc2ggJiA3OyAgICAgICAgICAgIC8qIENvbnZlcnQgbG93IDMgYml0cyBvZiBoYXNoIGNvZGUgKi8KKyAgIGZsb2F0IHUgPSBoIDwgNCA/IHggOiB5OyAgICAgLyogaW50byA4IHNpbXBsZSBncmFkaWVudCBkaXJlY3Rpb25zLCAqLworICAgZmxvYXQgdiA9IGggPCA0ID8geSA6IHg7ICAgICAvKiBhbmQgY29tcHV0ZSB0aGUgZG90IHByb2R1Y3Qgd2l0aCAoeCx5KS4gKi8KKyAgIHJldHVybiAoKGggJiAxKSA/IC11IDogdSkgKyAoKGggJiAyKSA/IC0yLjBmICogdiA6IDIuMGYgKiB2KTsKK30KKworc3RhdGljIGZsb2F0CitncmFkMyhpbnQgaGFzaCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKK3sKKyAgIGludCBoID0gaGFzaCAmIDE1OyAgICAgICAgICAgLyogQ29udmVydCBsb3cgNCBiaXRzIG9mIGhhc2ggY29kZSBpbnRvIDEyIHNpbXBsZSAqLworICAgZmxvYXQgdSA9IGggPCA4ID8geCA6IHk7ICAgICAvKiBncmFkaWVudCBkaXJlY3Rpb25zLCBhbmQgY29tcHV0ZSBkb3QgcHJvZHVjdC4gKi8KKyAgIGZsb2F0IHYgPSBoIDwgNCA/IHkgOiBoID09IDEyIHx8IGggPT0gMTQgPyB4IDogejsgICAgLyogRml4IHJlcGVhdHMgYXQgaCA9IDEyIHRvIDE1ICovCisgICByZXR1cm4gKChoICYgMSkgPyAtdSA6IHUpICsgKChoICYgMikgPyAtdiA6IHYpOworfQorCitzdGF0aWMgZmxvYXQKK2dyYWQ0KGludCBoYXNoLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB0KQoreworICAgaW50IGggPSBoYXNoICYgMzE7ICAgICAgICAgICAvKiBDb252ZXJ0IGxvdyA1IGJpdHMgb2YgaGFzaCBjb2RlIGludG8gMzIgc2ltcGxlICovCisgICBmbG9hdCB1ID0gaCA8IDI0ID8geCA6IHk7ICAgIC8qIGdyYWRpZW50IGRpcmVjdGlvbnMsIGFuZCBjb21wdXRlIGRvdCBwcm9kdWN0LiAqLworICAgZmxvYXQgdiA9IGggPCAxNiA/IHkgOiB6OworICAgZmxvYXQgdyA9IGggPCA4ID8geiA6IHQ7CisgICByZXR1cm4gKChoICYgMSkgPyAtdSA6IHUpICsgKChoICYgMikgPyAtdiA6IHYpICsgKChoICYgNCkgPyAtdyA6IHcpOworfQorCisvKioKKyAqIEEgbG9va3VwIHRhYmxlIHRvIHRyYXZlcnNlIHRoZSBzaW1wbGV4IGFyb3VuZCBhIGdpdmVuIHBvaW50IGluIDRELgorICogRGV0YWlscyBjYW4gYmUgZm91bmQgd2hlcmUgdGhpcyB0YWJsZSBpcyB1c2VkLCBpbiB0aGUgNEQgbm9pc2UgbWV0aG9kLgorICogVE9ETzogVGhpcyBzaG91bGQgbm90IGJlIHJlcXVpcmVkLCBiYWNrcG9ydCBpdCBmcm9tIEJpbGwncyBHTFNMIGNvZGUhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNpbXBsZXhbNjRdWzRdID0geworICAgezAsIDEsIDIsIDN9LCB7MCwgMSwgMywgMn0sIHswLCAwLCAwLCAwfSwgezAsIDIsIDMsIDF9LAorICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezEsIDIsIDMsIDB9LAorICAgezAsIDIsIDEsIDN9LCB7MCwgMCwgMCwgMH0sIHswLCAzLCAxLCAyfSwgezAsIDMsIDIsIDF9LAorICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezEsIDMsIDIsIDB9LAorICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgezEsIDIsIDAsIDN9LCB7MCwgMCwgMCwgMH0sIHsxLCAzLCAwLCAyfSwgezAsIDAsIDAsIDB9LAorICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sIHsyLCAzLCAwLCAxfSwgezIsIDMsIDEsIDB9LAorICAgezEsIDAsIDIsIDN9LCB7MSwgMCwgMywgMn0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgezAsIDAsIDAsIDB9LCB7MiwgMCwgMywgMX0sIHswLCAwLCAwLCAwfSwgezIsIDEsIDMsIDB9LAorICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgezIsIDAsIDEsIDN9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgezMsIDAsIDEsIDJ9LCB7MywgMCwgMiwgMX0sIHswLCAwLCAwLCAwfSwgezMsIDEsIDIsIDB9LAorICAgezIsIDEsIDAsIDN9LCB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LAorICAgezMsIDEsIDAsIDJ9LCB7MCwgMCwgMCwgMH0sIHszLCAyLCAwLCAxfSwgezMsIDIsIDEsIDB9Cit9OworCisKKy8qKiAxRCBzaW1wbGV4IG5vaXNlICovCitHTGZsb2F0CitfbWVzYV9ub2lzZTEoR0xmbG9hdCB4KQoreworICAgaW50IGkwID0gRkFTVEZMT09SKHgpOworICAgaW50IGkxID0gaTAgKyAxOworICAgZmxvYXQgeDAgPSB4IC0gaTA7CisgICBmbG9hdCB4MSA9IHgwIC0gMS4wZjsKKyAgIGZsb2F0IHQxID0gMS4wZiAtIHgxICogeDE7CisgICBmbG9hdCBuMCwgbjE7CisKKyAgIGZsb2F0IHQwID0gMS4wZiAtIHgwICogeDA7CisvKiAgaWYodDAgPCAwLjBmKSB0MCA9IDAuMGY7IC8vIHRoaXMgbmV2ZXIgaGFwcGVucyBmb3IgdGhlIDFEIGNhc2UgKi8KKyAgIHQwICo9IHQwOworICAgbjAgPSB0MCAqIHQwICogZ3JhZDEocGVybVtpMCAmIDB4ZmZdLCB4MCk7CisKKy8qICBpZih0MSA8IDAuMGYpIHQxID0gMC4wZjsgLy8gdGhpcyBuZXZlciBoYXBwZW5zIGZvciB0aGUgMUQgY2FzZSAqLworICAgdDEgKj0gdDE7CisgICBuMSA9IHQxICogdDEgKiBncmFkMShwZXJtW2kxICYgMHhmZl0sIHgxKTsKKyAgIC8qIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoaXMgbm9pc2UgaXMgOCooMy80KV40ID0gMi41MzEyNSAqLworICAgLyogQSBmYWN0b3Igb2YgMC4zOTUgd291bGQgc2NhbGUgdG8gZml0IGV4YWN0bHkgd2l0aGluIFstMSwxXSwgYnV0ICovCisgICAvKiB3ZSB3YW50IHRvIG1hdGNoIFBSTWFuJ3MgMUQgbm9pc2UsIHNvIHdlIHNjYWxlIGl0IGRvd24gc29tZSBtb3JlLiAqLworICAgcmV0dXJuIDAuMjVmICogKG4wICsgbjEpOworfQorCisKKy8qKiAyRCBzaW1wbGV4IG5vaXNlICovCitHTGZsb2F0CitfbWVzYV9ub2lzZTIoR0xmbG9hdCB4LCBHTGZsb2F0IHkpCit7CisjZGVmaW5lIEYyIDAuMzY2MDI1NDAzZiAgICAgICAgIC8qIEYyID0gMC41KihzcXJ0KDMuMCktMS4wKSAqLworI2RlZmluZSBHMiAwLjIxMTMyNDg2NWYgICAgICAgICAvKiBHMiA9ICgzLjAtTWF0aC5zcXJ0KDMuMCkpLzYuMCAqLworCisgICBmbG9hdCBuMCwgbjEsIG4yOyAgICAgICAgICAgIC8qIE5vaXNlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgdGhyZWUgY29ybmVycyAqLworCisgICAvKiBTa2V3IHRoZSBpbnB1dCBzcGFjZSB0byBkZXRlcm1pbmUgd2hpY2ggc2ltcGxleCBjZWxsIHdlJ3JlIGluICovCisgICBmbG9hdCBzID0gKHggKyB5KSAqIEYyOyAgICAgIC8qIEhhaXJ5IGZhY3RvciBmb3IgMkQgKi8KKyAgIGZsb2F0IHhzID0geCArIHM7CisgICBmbG9hdCB5cyA9IHkgKyBzOworICAgaW50IGkgPSBGQVNURkxPT1IoeHMpOworICAgaW50IGogPSBGQVNURkxPT1IoeXMpOworCisgICBmbG9hdCB0ID0gKGZsb2F0KSAoaSArIGopICogRzI7CisgICBmbG9hdCBYMCA9IGkgLSB0OyAgICAgICAgICAgIC8qIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5KSBzcGFjZSAqLworICAgZmxvYXQgWTAgPSBqIC0gdDsKKyAgIGZsb2F0IHgwID0geCAtIFgwOyAgICAgICAgICAgLyogVGhlIHgseSBkaXN0YW5jZXMgZnJvbSB0aGUgY2VsbCBvcmlnaW4gKi8KKyAgIGZsb2F0IHkwID0geSAtIFkwOworCisgICBmbG9hdCB4MSwgeTEsIHgyLCB5MjsKKyAgIHVuc2lnbmVkIGludCBpaSwgamo7CisgICBmbG9hdCB0MCwgdDEsIHQyOworCisgICAvKiBGb3IgdGhlIDJEIGNhc2UsIHRoZSBzaW1wbGV4IHNoYXBlIGlzIGFuIGVxdWlsYXRlcmFsIHRyaWFuZ2xlLiAqLworICAgLyogRGV0ZXJtaW5lIHdoaWNoIHNpbXBsZXggd2UgYXJlIGluLiAqLworICAgdW5zaWduZWQgaW50IGkxLCBqMTsgICAgICAgICAvKiBPZmZzZXRzIGZvciBzZWNvbmQgKG1pZGRsZSkgY29ybmVyIG9mIHNpbXBsZXggaW4gKGksaikgY29vcmRzICovCisgICBpZiAoeDAgPiB5MCkgeworICAgICAgaTEgPSAxOworICAgICAgajEgPSAwOworICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3dlciB0cmlhbmdsZSwgWFkgb3JkZXI6ICgwLDApLT4oMSwwKS0+KDEsMSkgKi8KKyAgIGVsc2UgeworICAgICAgaTEgPSAwOworICAgICAgajEgPSAxOworICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cHBlciB0cmlhbmdsZSwgWVggb3JkZXI6ICgwLDApLT4oMCwxKS0+KDEsMSkgKi8KKworICAgLyogQSBzdGVwIG9mICgxLDApIGluIChpLGopIG1lYW5zIGEgc3RlcCBvZiAoMS1jLC1jKSBpbiAoeCx5KSwgYW5kICovCisgICAvKiBhIHN0ZXAgb2YgKDAsMSkgaW4gKGksaikgbWVhbnMgYSBzdGVwIG9mICgtYywxLWMpIGluICh4LHkpLCB3aGVyZSAqLworICAgLyogYyA9ICgzLXNxcnQoMykpLzYgKi8KKworICAgeDEgPSB4MCAtIGkxICsgRzI7ICAgICAgICAgICAvKiBPZmZzZXRzIGZvciBtaWRkbGUgY29ybmVyIGluICh4LHkpIHVuc2tld2VkIGNvb3JkcyAqLworICAgeTEgPSB5MCAtIGoxICsgRzI7CisgICB4MiA9IHgwIC0gMS4wZiArIDIuMGYgKiBHMjsgIC8qIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkpIHVuc2tld2VkIGNvb3JkcyAqLworICAgeTIgPSB5MCAtIDEuMGYgKyAyLjBmICogRzI7CisKKyAgIC8qIFdyYXAgdGhlIGludGVnZXIgaW5kaWNlcyBhdCAyNTYsIHRvIGF2b2lkIGluZGV4aW5nIHBlcm1bXSBvdXQgb2YgYm91bmRzICovCisgICBpaSA9IGkgJiAweGZmOworICAgamogPSBqICYgMHhmZjsKKworICAgLyogQ2FsY3VsYXRlIHRoZSBjb250cmlidXRpb24gZnJvbSB0aGUgdGhyZWUgY29ybmVycyAqLworICAgdDAgPSAwLjVmIC0geDAgKiB4MCAtIHkwICogeTA7CisgICBpZiAodDAgPCAwLjBmKQorICAgICAgbjAgPSAwLjBmOworICAgZWxzZSB7CisgICAgICB0MCAqPSB0MDsKKyAgICAgIG4wID0gdDAgKiB0MCAqIGdyYWQyKHBlcm1baWkgKyBwZXJtW2pqXV0sIHgwLCB5MCk7CisgICB9CisKKyAgIHQxID0gMC41ZiAtIHgxICogeDEgLSB5MSAqIHkxOworICAgaWYgKHQxIDwgMC4wZikKKyAgICAgIG4xID0gMC4wZjsKKyAgIGVsc2UgeworICAgICAgdDEgKj0gdDE7CisgICAgICBuMSA9IHQxICogdDEgKiBncmFkMihwZXJtW2lpICsgaTEgKyBwZXJtW2pqICsgajFdXSwgeDEsIHkxKTsKKyAgIH0KKworICAgdDIgPSAwLjVmIC0geDIgKiB4MiAtIHkyICogeTI7CisgICBpZiAodDIgPCAwLjBmKQorICAgICAgbjIgPSAwLjBmOworICAgZWxzZSB7CisgICAgICB0MiAqPSB0MjsKKyAgICAgIG4yID0gdDIgKiB0MiAqIGdyYWQyKHBlcm1baWkgKyAxICsgcGVybVtqaiArIDFdXSwgeDIsIHkyKTsKKyAgIH0KKworICAgLyogQWRkIGNvbnRyaWJ1dGlvbnMgZnJvbSBlYWNoIGNvcm5lciB0byBnZXQgdGhlIGZpbmFsIG5vaXNlIHZhbHVlLiAqLworICAgLyogVGhlIHJlc3VsdCBpcyBzY2FsZWQgdG8gcmV0dXJuIHZhbHVlcyBpbiB0aGUgaW50ZXJ2YWwgWy0xLDFdLiAqLworICAgcmV0dXJuIDQwLjBmICogKG4wICsgbjEgKyBuMik7ICAgICAgIC8qIFRPRE86IFRoZSBzY2FsZSBmYWN0b3IgaXMgcHJlbGltaW5hcnkhICovCit9CisKKworLyoqIDNEIHNpbXBsZXggbm9pc2UgKi8KK0dMZmxvYXQKK19tZXNhX25vaXNlMyhHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworLyogU2ltcGxlIHNrZXdpbmcgZmFjdG9ycyBmb3IgdGhlIDNEIGNhc2UgKi8KKyNkZWZpbmUgRjMgMC4zMzMzMzMzMzNmCisjZGVmaW5lIEczIDAuMTY2NjY2NjY3ZgorCisgICBmbG9hdCBuMCwgbjEsIG4yLCBuMzsgICAgICAgIC8qIE5vaXNlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgZm91ciBjb3JuZXJzICovCisKKyAgIC8qIFNrZXcgdGhlIGlucHV0IHNwYWNlIHRvIGRldGVybWluZSB3aGljaCBzaW1wbGV4IGNlbGwgd2UncmUgaW4gKi8KKyAgIGZsb2F0IHMgPSAoeCArIHkgKyB6KSAqIEYzOyAgLyogVmVyeSBuaWNlIGFuZCBzaW1wbGUgc2tldyBmYWN0b3IgZm9yIDNEICovCisgICBmbG9hdCB4cyA9IHggKyBzOworICAgZmxvYXQgeXMgPSB5ICsgczsKKyAgIGZsb2F0IHpzID0geiArIHM7CisgICBpbnQgaSA9IEZBU1RGTE9PUih4cyk7CisgICBpbnQgaiA9IEZBU1RGTE9PUih5cyk7CisgICBpbnQgayA9IEZBU1RGTE9PUih6cyk7CisKKyAgIGZsb2F0IHQgPSAoZmxvYXQpIChpICsgaiArIGspICogRzM7CisgICBmbG9hdCBYMCA9IGkgLSB0OyAgICAgICAgICAgIC8qIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHopIHNwYWNlICovCisgICBmbG9hdCBZMCA9IGogLSB0OworICAgZmxvYXQgWjAgPSBrIC0gdDsKKyAgIGZsb2F0IHgwID0geCAtIFgwOyAgICAgICAgICAgLyogVGhlIHgseSx6IGRpc3RhbmNlcyBmcm9tIHRoZSBjZWxsIG9yaWdpbiAqLworICAgZmxvYXQgeTAgPSB5IC0gWTA7CisgICBmbG9hdCB6MCA9IHogLSBaMDsKKworICAgZmxvYXQgeDEsIHkxLCB6MSwgeDIsIHkyLCB6MiwgeDMsIHkzLCB6MzsKKyAgIHVuc2lnbmVkIGludCBpaSwgamosIGtrOworICAgZmxvYXQgdDAsIHQxLCB0MiwgdDM7CisKKyAgIC8qIEZvciB0aGUgM0QgY2FzZSwgdGhlIHNpbXBsZXggc2hhcGUgaXMgYSBzbGlnaHRseSBpcnJlZ3VsYXIgdGV0cmFoZWRyb24uICovCisgICAvKiBEZXRlcm1pbmUgd2hpY2ggc2ltcGxleCB3ZSBhcmUgaW4uICovCisgICB1bnNpZ25lZCBpbnQgaTEsIGoxLCBrMTsgICAgIC8qIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3JkcyAqLworICAgdW5zaWduZWQgaW50IGkyLCBqMiwgazI7ICAgICAvKiBPZmZzZXRzIGZvciB0aGlyZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3JkcyAqLworCisvKiBUaGlzIGNvZGUgd291bGQgYmVuZWZpdCBmcm9tIGEgYmFja3BvcnQgZnJvbSB0aGUgR0xTTCB2ZXJzaW9uISAqLworICAgaWYgKHgwID49IHkwKSB7CisgICAgICBpZiAoeTAgPj0gejApIHsKKyAgICAgICAgIGkxID0gMTsKKyAgICAgICAgIGoxID0gMDsKKyAgICAgICAgIGsxID0gMDsKKyAgICAgICAgIGkyID0gMTsKKyAgICAgICAgIGoyID0gMTsKKyAgICAgICAgIGsyID0gMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogWCBZIFogb3JkZXIgKi8KKyAgICAgIGVsc2UgaWYgKHgwID49IHowKSB7CisgICAgICAgICBpMSA9IDE7CisgICAgICAgICBqMSA9IDA7CisgICAgICAgICBrMSA9IDA7CisgICAgICAgICBpMiA9IDE7CisgICAgICAgICBqMiA9IDA7CisgICAgICAgICBrMiA9IDE7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFggWiBZIG9yZGVyICovCisgICAgICBlbHNlIHsKKyAgICAgICAgIGkxID0gMDsKKyAgICAgICAgIGoxID0gMDsKKyAgICAgICAgIGsxID0gMTsKKyAgICAgICAgIGkyID0gMTsKKyAgICAgICAgIGoyID0gMDsKKyAgICAgICAgIGsyID0gMTsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogWiBYIFkgb3JkZXIgKi8KKyAgIH0KKyAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgLyogeDA8eTAgKi8KKyAgICAgIGlmICh5MCA8IHowKSB7CisgICAgICAgICBpMSA9IDA7CisgICAgICAgICBqMSA9IDA7CisgICAgICAgICBrMSA9IDE7CisgICAgICAgICBpMiA9IDA7CisgICAgICAgICBqMiA9IDE7CisgICAgICAgICBrMiA9IDE7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFogWSBYIG9yZGVyICovCisgICAgICBlbHNlIGlmICh4MCA8IHowKSB7CisgICAgICAgICBpMSA9IDA7CisgICAgICAgICBqMSA9IDE7CisgICAgICAgICBrMSA9IDA7CisgICAgICAgICBpMiA9IDA7CisgICAgICAgICBqMiA9IDE7CisgICAgICAgICBrMiA9IDE7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFkgWiBYIG9yZGVyICovCisgICAgICBlbHNlIHsKKyAgICAgICAgIGkxID0gMDsKKyAgICAgICAgIGoxID0gMTsKKyAgICAgICAgIGsxID0gMDsKKyAgICAgICAgIGkyID0gMTsKKyAgICAgICAgIGoyID0gMTsKKyAgICAgICAgIGsyID0gMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogWSBYIFogb3JkZXIgKi8KKyAgIH0KKworICAgLyogQSBzdGVwIG9mICgxLDAsMCkgaW4gKGksaixrKSBtZWFucyBhIHN0ZXAgb2YgKDEtYywtYywtYykgaW4KKyAgICAqICh4LHkseiksIGEgc3RlcCBvZiAoMCwxLDApIGluIChpLGosaykgbWVhbnMgYSBzdGVwIG9mCisgICAgKiAoLWMsMS1jLC1jKSBpbiAoeCx5LHopLCBhbmQgYSBzdGVwIG9mICgwLDAsMSkgaW4gKGksaixrKSBtZWFucyBhCisgICAgKiBzdGVwIG9mICgtYywtYywxLWMpIGluICh4LHkseiksIHdoZXJlIGMgPSAxLzYuCisgICAgKi8KKworICAgeDEgPSB4MCAtIGkxICsgRzM7ICAgICAgICAgLyogT2Zmc2V0cyBmb3Igc2Vjb25kIGNvcm5lciBpbiAoeCx5LHopIGNvb3JkcyAqLworICAgeTEgPSB5MCAtIGoxICsgRzM7CisgICB6MSA9IHowIC0gazEgKyBHMzsKKyAgIHgyID0geDAgLSBpMiArIDIuMGYgKiBHMzsgIC8qIE9mZnNldHMgZm9yIHRoaXJkIGNvcm5lciBpbiAoeCx5LHopIGNvb3JkcyAqLworICAgeTIgPSB5MCAtIGoyICsgMi4wZiAqIEczOworICAgejIgPSB6MCAtIGsyICsgMi4wZiAqIEczOworICAgeDMgPSB4MCAtIDEuMGYgKyAzLjBmICogRzM7LyogT2Zmc2V0cyBmb3IgbGFzdCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHMgKi8KKyAgIHkzID0geTAgLSAxLjBmICsgMy4wZiAqIEczOworICAgejMgPSB6MCAtIDEuMGYgKyAzLjBmICogRzM7CisKKyAgIC8qIFdyYXAgdGhlIGludGVnZXIgaW5kaWNlcyBhdCAyNTYgdG8gYXZvaWQgaW5kZXhpbmcgcGVybVtdIG91dCBvZiBib3VuZHMgKi8KKyAgIGlpID0gaSAmIDB4ZmY7CisgICBqaiA9IGogJiAweGZmOworICAga2sgPSBrICYgMHhmZjsKKworICAgLyogQ2FsY3VsYXRlIHRoZSBjb250cmlidXRpb24gZnJvbSB0aGUgZm91ciBjb3JuZXJzICovCisgICB0MCA9IDAuNmYgLSB4MCAqIHgwIC0geTAgKiB5MCAtIHowICogejA7CisgICBpZiAodDAgPCAwLjBmKQorICAgICAgbjAgPSAwLjBmOworICAgZWxzZSB7CisgICAgICB0MCAqPSB0MDsKKyAgICAgIG4wID0gdDAgKiB0MCAqIGdyYWQzKHBlcm1baWkgKyBwZXJtW2pqICsgcGVybVtra11dXSwgeDAsIHkwLCB6MCk7CisgICB9CisKKyAgIHQxID0gMC42ZiAtIHgxICogeDEgLSB5MSAqIHkxIC0gejEgKiB6MTsKKyAgIGlmICh0MSA8IDAuMGYpCisgICAgICBuMSA9IDAuMGY7CisgICBlbHNlIHsKKyAgICAgIHQxICo9IHQxOworICAgICAgbjEgPQorICAgICAgICAgdDEgKiB0MSAqIGdyYWQzKHBlcm1baWkgKyBpMSArIHBlcm1bamogKyBqMSArIHBlcm1ba2sgKyBrMV1dXSwgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgeTEsIHoxKTsKKyAgIH0KKworICAgdDIgPSAwLjZmIC0geDIgKiB4MiAtIHkyICogeTIgLSB6MiAqIHoyOworICAgaWYgKHQyIDwgMC4wZikKKyAgICAgIG4yID0gMC4wZjsKKyAgIGVsc2UgeworICAgICAgdDIgKj0gdDI7CisgICAgICBuMiA9CisgICAgICAgICB0MiAqIHQyICogZ3JhZDMocGVybVtpaSArIGkyICsgcGVybVtqaiArIGoyICsgcGVybVtrayArIGsyXV1dLCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB5MiwgejIpOworICAgfQorCisgICB0MyA9IDAuNmYgLSB4MyAqIHgzIC0geTMgKiB5MyAtIHozICogejM7CisgICBpZiAodDMgPCAwLjBmKQorICAgICAgbjMgPSAwLjBmOworICAgZWxzZSB7CisgICAgICB0MyAqPSB0MzsKKyAgICAgIG4zID0KKyAgICAgICAgIHQzICogdDMgKiBncmFkMyhwZXJtW2lpICsgMSArIHBlcm1bamogKyAxICsgcGVybVtrayArIDFdXV0sIHgzLCB5MywKKyAgICAgICAgICAgICAgICAgICAgICAgICB6Myk7CisgICB9CisKKyAgIC8qIEFkZCBjb250cmlidXRpb25zIGZyb20gZWFjaCBjb3JuZXIgdG8gZ2V0IHRoZSBmaW5hbCBub2lzZSB2YWx1ZS4KKyAgICAqIFRoZSByZXN1bHQgaXMgc2NhbGVkIHRvIHN0YXkganVzdCBpbnNpZGUgWy0xLDFdCisgICAgKi8KKyAgIHJldHVybiAzMi4wZiAqIChuMCArIG4xICsgbjIgKyBuMyk7ICAvKiBUT0RPOiBUaGUgc2NhbGUgZmFjdG9yIGlzIHByZWxpbWluYXJ5ISAqLworfQorCisKKy8qKiA0RCBzaW1wbGV4IG5vaXNlICovCitHTGZsb2F0CitfbWVzYV9ub2lzZTQoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KQoreworICAgLyogVGhlIHNrZXdpbmcgYW5kIHVuc2tld2luZyBmYWN0b3JzIGFyZSBoYWlyeSBhZ2FpbiBmb3IgdGhlIDREIGNhc2UgKi8KKyNkZWZpbmUgRjQgMC4zMDkwMTY5OTRmICAgICAgICAgLyogRjQgPSAoTWF0aC5zcXJ0KDUuMCktMS4wKS80LjAgKi8KKyNkZWZpbmUgRzQgMC4xMzgxOTY2MDFmICAgICAgICAgLyogRzQgPSAoNS4wLU1hdGguc3FydCg1LjApKS8yMC4wICovCisKKyAgIGZsb2F0IG4wLCBuMSwgbjIsIG4zLCBuNDsgICAgLyogTm9pc2UgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBmaXZlIGNvcm5lcnMgKi8KKworICAgLyogU2tldyB0aGUgKHgseSx6LHcpIHNwYWNlIHRvIGRldGVybWluZSB3aGljaCBjZWxsIG9mIDI0IHNpbXBsaWNlcyB3ZSdyZSBpbiAqLworICAgZmxvYXQgcyA9ICh4ICsgeSArIHogKyB3KSAqIEY0OyAgICAgIC8qIEZhY3RvciBmb3IgNEQgc2tld2luZyAqLworICAgZmxvYXQgeHMgPSB4ICsgczsKKyAgIGZsb2F0IHlzID0geSArIHM7CisgICBmbG9hdCB6cyA9IHogKyBzOworICAgZmxvYXQgd3MgPSB3ICsgczsKKyAgIGludCBpID0gRkFTVEZMT09SKHhzKTsKKyAgIGludCBqID0gRkFTVEZMT09SKHlzKTsKKyAgIGludCBrID0gRkFTVEZMT09SKHpzKTsKKyAgIGludCBsID0gRkFTVEZMT09SKHdzKTsKKworICAgZmxvYXQgdCA9IChpICsgaiArIGsgKyBsKSAqIEc0OyAgICAgIC8qIEZhY3RvciBmb3IgNEQgdW5za2V3aW5nICovCisgICBmbG9hdCBYMCA9IGkgLSB0OyAgICAgICAgICAgIC8qIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHosdykgc3BhY2UgKi8KKyAgIGZsb2F0IFkwID0gaiAtIHQ7CisgICBmbG9hdCBaMCA9IGsgLSB0OworICAgZmxvYXQgVzAgPSBsIC0gdDsKKworICAgZmxvYXQgeDAgPSB4IC0gWDA7ICAgICAgICAgICAvKiBUaGUgeCx5LHosdyBkaXN0YW5jZXMgZnJvbSB0aGUgY2VsbCBvcmlnaW4gKi8KKyAgIGZsb2F0IHkwID0geSAtIFkwOworICAgZmxvYXQgejAgPSB6IC0gWjA7CisgICBmbG9hdCB3MCA9IHcgLSBXMDsKKworICAgLyogRm9yIHRoZSA0RCBjYXNlLCB0aGUgc2ltcGxleCBpcyBhIDREIHNoYXBlIEkgd29uJ3QgZXZlbiB0cnkgdG8gZGVzY3JpYmUuCisgICAgKiBUbyBmaW5kIG91dCB3aGljaCBvZiB0aGUgMjQgcG9zc2libGUgc2ltcGxpY2VzIHdlJ3JlIGluLCB3ZSBuZWVkIHRvCisgICAgKiBkZXRlcm1pbmUgdGhlIG1hZ25pdHVkZSBvcmRlcmluZyBvZiB4MCwgeTAsIHowIGFuZCB3MC4KKyAgICAqIFRoZSBtZXRob2QgYmVsb3cgaXMgYSBnb29kIHdheSBvZiBmaW5kaW5nIHRoZSBvcmRlcmluZyBvZiB4LHkseix3IGFuZAorICAgICogdGhlbiBmaW5kIHRoZSBjb3JyZWN0IHRyYXZlcnNhbCBvcmRlciBmb3IgdGhlIHNpbXBsZXggd2UncmUgaW4uCisgICAgKiBGaXJzdCwgc2l4IHBhaXItd2lzZSBjb21wYXJpc29ucyBhcmUgcGVyZm9ybWVkIGJldHdlZW4gZWFjaCBwb3NzaWJsZSBwYWlyCisgICAgKiBvZiB0aGUgZm91ciBjb29yZGluYXRlcywgYW5kIHRoZSByZXN1bHRzIGFyZSB1c2VkIHRvIGFkZCB1cCBiaW5hcnkgYml0cworICAgICogZm9yIGFuIGludGVnZXIgaW5kZXguCisgICAgKi8KKyAgIGludCBjMSA9ICh4MCA+IHkwKSA/IDMyIDogMDsKKyAgIGludCBjMiA9ICh4MCA+IHowKSA/IDE2IDogMDsKKyAgIGludCBjMyA9ICh5MCA+IHowKSA/IDggOiAwOworICAgaW50IGM0ID0gKHgwID4gdzApID8gNCA6IDA7CisgICBpbnQgYzUgPSAoeTAgPiB3MCkgPyAyIDogMDsKKyAgIGludCBjNiA9ICh6MCA+IHcwKSA/IDEgOiAwOworICAgaW50IGMgPSBjMSArIGMyICsgYzMgKyBjNCArIGM1ICsgYzY7CisKKyAgIHVuc2lnbmVkIGludCBpMSwgajEsIGsxLCBsMTsgIC8qIFRoZSBpbnRlZ2VyIG9mZnNldHMgZm9yIHRoZSBzZWNvbmQgc2ltcGxleCBjb3JuZXIgKi8KKyAgIHVuc2lnbmVkIGludCBpMiwgajIsIGsyLCBsMjsgIC8qIFRoZSBpbnRlZ2VyIG9mZnNldHMgZm9yIHRoZSB0aGlyZCBzaW1wbGV4IGNvcm5lciAqLworICAgdW5zaWduZWQgaW50IGkzLCBqMywgazMsIGwzOyAgLyogVGhlIGludGVnZXIgb2Zmc2V0cyBmb3IgdGhlIGZvdXJ0aCBzaW1wbGV4IGNvcm5lciAqLworCisgICBmbG9hdCB4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6MiwgdzIsIHgzLCB5MywgejMsIHczLCB4NCwgeTQsIHo0LCB3NDsKKyAgIHVuc2lnbmVkIGludCBpaSwgamosIGtrLCBsbDsKKyAgIGZsb2F0IHQwLCB0MSwgdDIsIHQzLCB0NDsKKworICAgLyoKKyAgICAqIHNpbXBsZXhbY10gaXMgYSA0LXZlY3RvciB3aXRoIHRoZSBudW1iZXJzIDAsIDEsIDIgYW5kIDMgaW4gc29tZQorICAgICogb3JkZXIuICBNYW55IHZhbHVlcyBvZiBjIHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIGUuZy4geD55Pno+dworICAgICogbWFrZXMgeDx6LCB5PHcgYW5kIHg8dyBpbXBvc3NpYmxlLiBPbmx5IHRoZSAyNCBpbmRpY2VzIHdoaWNoCisgICAgKiBoYXZlIG5vbi16ZXJvIGVudHJpZXMgbWFrZSBhbnkgc2Vuc2UuICBXZSB1c2UgYSB0aHJlc2hvbGRpbmcgdG8KKyAgICAqIHNldCB0aGUgY29vcmRpbmF0ZXMgaW4gdHVybiBmcm9tIHRoZSBsYXJnZXN0IG1hZ25pdHVkZS4gIFRoZQorICAgICogbnVtYmVyIDMgaW4gdGhlICJzaW1wbGV4IiBhcnJheSBpcyBhdCB0aGUgcG9zaXRpb24gb2YgdGhlCisgICAgKiBsYXJnZXN0IGNvb3JkaW5hdGUuCisgICAgKi8KKyAgIGkxID0gc2ltcGxleFtjXVswXSA+PSAzID8gMSA6IDA7CisgICBqMSA9IHNpbXBsZXhbY11bMV0gPj0gMyA/IDEgOiAwOworICAgazEgPSBzaW1wbGV4W2NdWzJdID49IDMgPyAxIDogMDsKKyAgIGwxID0gc2ltcGxleFtjXVszXSA+PSAzID8gMSA6IDA7CisgICAvKiBUaGUgbnVtYmVyIDIgaW4gdGhlICJzaW1wbGV4IiBhcnJheSBpcyBhdCB0aGUgc2Vjb25kIGxhcmdlc3QgY29vcmRpbmF0ZS4gKi8KKyAgIGkyID0gc2ltcGxleFtjXVswXSA+PSAyID8gMSA6IDA7CisgICBqMiA9IHNpbXBsZXhbY11bMV0gPj0gMiA/IDEgOiAwOworICAgazIgPSBzaW1wbGV4W2NdWzJdID49IDIgPyAxIDogMDsKKyAgIGwyID0gc2ltcGxleFtjXVszXSA+PSAyID8gMSA6IDA7CisgICAvKiBUaGUgbnVtYmVyIDEgaW4gdGhlICJzaW1wbGV4IiBhcnJheSBpcyBhdCB0aGUgc2Vjb25kIHNtYWxsZXN0IGNvb3JkaW5hdGUuICovCisgICBpMyA9IHNpbXBsZXhbY11bMF0gPj0gMSA/IDEgOiAwOworICAgajMgPSBzaW1wbGV4W2NdWzFdID49IDEgPyAxIDogMDsKKyAgIGszID0gc2ltcGxleFtjXVsyXSA+PSAxID8gMSA6IDA7CisgICBsMyA9IHNpbXBsZXhbY11bM10gPj0gMSA/IDEgOiAwOworICAgLyogVGhlIGZpZnRoIGNvcm5lciBoYXMgYWxsIGNvb3JkaW5hdGUgb2Zmc2V0cyA9IDEsIHNvIG5vIG5lZWQgdG8gbG9vayB0aGF0IHVwLiAqLworCisgICB4MSA9IHgwIC0gaTEgKyBHNDsgICAgICAgICAgIC8qIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3JkcyAqLworICAgeTEgPSB5MCAtIGoxICsgRzQ7CisgICB6MSA9IHowIC0gazEgKyBHNDsKKyAgIHcxID0gdzAgLSBsMSArIEc0OworICAgeDIgPSB4MCAtIGkyICsgMi4wZiAqIEc0OyAgICAvKiBPZmZzZXRzIGZvciB0aGlyZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3JkcyAqLworICAgeTIgPSB5MCAtIGoyICsgMi4wZiAqIEc0OworICAgejIgPSB6MCAtIGsyICsgMi4wZiAqIEc0OworICAgdzIgPSB3MCAtIGwyICsgMi4wZiAqIEc0OworICAgeDMgPSB4MCAtIGkzICsgMy4wZiAqIEc0OyAgICAvKiBPZmZzZXRzIGZvciBmb3VydGggY29ybmVyIGluICh4LHkseix3KSBjb29yZHMgKi8KKyAgIHkzID0geTAgLSBqMyArIDMuMGYgKiBHNDsKKyAgIHozID0gejAgLSBrMyArIDMuMGYgKiBHNDsKKyAgIHczID0gdzAgLSBsMyArIDMuMGYgKiBHNDsKKyAgIHg0ID0geDAgLSAxLjBmICsgNC4wZiAqIEc0OyAgLyogT2Zmc2V0cyBmb3IgbGFzdCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3JkcyAqLworICAgeTQgPSB5MCAtIDEuMGYgKyA0LjBmICogRzQ7CisgICB6NCA9IHowIC0gMS4wZiArIDQuMGYgKiBHNDsKKyAgIHc0ID0gdzAgLSAxLjBmICsgNC4wZiAqIEc0OworCisgICAvKiBXcmFwIHRoZSBpbnRlZ2VyIGluZGljZXMgYXQgMjU2LCB0byBhdm9pZCBpbmRleGluZyBwZXJtW10gb3V0IG9mIGJvdW5kcyAqLworICAgaWkgPSBpICYgMHhmZjsKKyAgIGpqID0gaiAmIDB4ZmY7CisgICBrayA9IGsgJiAweGZmOworICAgbGwgPSBsICYgMHhmZjsKKworICAgLyogQ2FsY3VsYXRlIHRoZSBjb250cmlidXRpb24gZnJvbSB0aGUgZml2ZSBjb3JuZXJzICovCisgICB0MCA9IDAuNmYgLSB4MCAqIHgwIC0geTAgKiB5MCAtIHowICogejAgLSB3MCAqIHcwOworICAgaWYgKHQwIDwgMC4wZikKKyAgICAgIG4wID0gMC4wZjsKKyAgIGVsc2UgeworICAgICAgdDAgKj0gdDA7CisgICAgICBuMCA9CisgICAgICAgICB0MCAqIHQwICogZ3JhZDQocGVybVtpaSArIHBlcm1bamogKyBwZXJtW2trICsgcGVybVtsbF1dXV0sIHgwLCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6MCwgdzApOworICAgfQorCisgICB0MSA9IDAuNmYgLSB4MSAqIHgxIC0geTEgKiB5MSAtIHoxICogejEgLSB3MSAqIHcxOworICAgaWYgKHQxIDwgMC4wZikKKyAgICAgIG4xID0gMC4wZjsKKyAgIGVsc2UgeworICAgICAgdDEgKj0gdDE7CisgICAgICBuMSA9CisgICAgICAgICB0MSAqIHQxICoKKyAgICAgICAgIGdyYWQ0KHBlcm1baWkgKyBpMSArIHBlcm1bamogKyBqMSArIHBlcm1ba2sgKyBrMSArIHBlcm1bbGwgKyBsMV1dXV0sCisgICAgICAgICAgICAgICB4MSwgeTEsIHoxLCB3MSk7CisgICB9CisKKyAgIHQyID0gMC42ZiAtIHgyICogeDIgLSB5MiAqIHkyIC0gejIgKiB6MiAtIHcyICogdzI7CisgICBpZiAodDIgPCAwLjBmKQorICAgICAgbjIgPSAwLjBmOworICAgZWxzZSB7CisgICAgICB0MiAqPSB0MjsKKyAgICAgIG4yID0KKyAgICAgICAgIHQyICogdDIgKgorICAgICAgICAgZ3JhZDQocGVybVtpaSArIGkyICsgcGVybVtqaiArIGoyICsgcGVybVtrayArIGsyICsgcGVybVtsbCArIGwyXV1dXSwKKyAgICAgICAgICAgICAgIHgyLCB5MiwgejIsIHcyKTsKKyAgIH0KKworICAgdDMgPSAwLjZmIC0geDMgKiB4MyAtIHkzICogeTMgLSB6MyAqIHozIC0gdzMgKiB3MzsKKyAgIGlmICh0MyA8IDAuMGYpCisgICAgICBuMyA9IDAuMGY7CisgICBlbHNlIHsKKyAgICAgIHQzICo9IHQzOworICAgICAgbjMgPQorICAgICAgICAgdDMgKiB0MyAqCisgICAgICAgICBncmFkNChwZXJtW2lpICsgaTMgKyBwZXJtW2pqICsgajMgKyBwZXJtW2trICsgazMgKyBwZXJtW2xsICsgbDNdXV1dLAorICAgICAgICAgICAgICAgeDMsIHkzLCB6MywgdzMpOworICAgfQorCisgICB0NCA9IDAuNmYgLSB4NCAqIHg0IC0geTQgKiB5NCAtIHo0ICogejQgLSB3NCAqIHc0OworICAgaWYgKHQ0IDwgMC4wZikKKyAgICAgIG40ID0gMC4wZjsKKyAgIGVsc2UgeworICAgICAgdDQgKj0gdDQ7CisgICAgICBuNCA9CisgICAgICAgICB0NCAqIHQ0ICoKKyAgICAgICAgIGdyYWQ0KHBlcm1baWkgKyAxICsgcGVybVtqaiArIDEgKyBwZXJtW2trICsgMSArIHBlcm1bbGwgKyAxXV1dXSwgeDQsCisgICAgICAgICAgICAgICB5NCwgejQsIHc0KTsKKyAgIH0KKworICAgLyogU3VtIHVwIGFuZCBzY2FsZSB0aGUgcmVzdWx0IHRvIGNvdmVyIHRoZSByYW5nZSBbLTEsMV0gKi8KKyAgIHJldHVybiAyNy4wZiAqIChuMCArIG4xICsgbjIgKyBuMyArIG40KTsgICAgIC8qIFRPRE86IFRoZSBzY2FsZSBmYWN0b3IgaXMgcHJlbGltaW5hcnkhICovCit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfbm9pc2UuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19ub2lzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTI0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfbm9pc2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFBST0dfTk9JU0UKKyNkZWZpbmUgUFJPR19OT0lTRQorCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorCitleHRlcm4gR0xmbG9hdCBfbWVzYV9ub2lzZTEoR0xmbG9hdCk7CitleHRlcm4gR0xmbG9hdCBfbWVzYV9ub2lzZTIoR0xmbG9hdCwgR0xmbG9hdCk7CitleHRlcm4gR0xmbG9hdCBfbWVzYV9ub2lzZTMoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitleHRlcm4gR0xmbG9hdCBfbWVzYV9ub2lzZTQoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfb3B0X2NvbnN0YW50X2ZvbGQuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19vcHRfY29uc3RhbnRfZm9sZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTFjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfb3B0X2NvbnN0YW50X2ZvbGQuYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9jb250ZXh0LmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJwcm9ncmFtLmgiCisjaW5jbHVkZSAicHJvZ19pbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgInByb2dfb3B0aW1pemUuaCIKKyNpbmNsdWRlICJwcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworc3RhdGljIGJvb2wKK3NyY19yZWdzX2FyZV9jb25zdGFudChjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwgdW5zaWduZWQgbnVtX3NyY3MpCit7CisgICB1bnNpZ25lZCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NyY3M7IGkrKykgeworICAgICAgaWYgKGluc3QtPlNyY1JlZ1tpXS5GaWxlICE9IFBST0dSQU1fQ09OU1RBTlQpCisJIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIKK3NyY19yZWdfZm9yX2Zsb2F0KHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLCBmbG9hdCB2YWwpCit7CisgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgc3JjOworICAgdW5zaWduZWQgc3dpejsKKworICAgbWVtc2V0KCZzcmMsIDAsIHNpemVvZihzcmMpKTsKKworICAgc3JjLkZpbGUgPSBQUk9HUkFNX0NPTlNUQU5UOworICAgc3JjLkluZGV4ID0gX21lc2FfYWRkX3VubmFtZWRfY29uc3RhbnQocHJvZy0+UGFyYW1ldGVycywKKwkJCQkJICAoZ2xfY29uc3RhbnRfdmFsdWUgKikgJnZhbCwgMSwgJnN3aXopOworICAgc3JjLlN3aXp6bGUgPSBzd2l6OworICAgcmV0dXJuIHNyYzsKK30KKworc3RhdGljIHN0cnVjdCBwcm9nX3NyY19yZWdpc3Rlcgorc3JjX3JlZ19mb3JfdmVjNChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywgY29uc3QgZmxvYXQgKnZhbCkKK3sKKyAgIHN0cnVjdCBwcm9nX3NyY19yZWdpc3RlciBzcmM7CisgICB1bnNpZ25lZCBzd2l6OworCisgICBtZW1zZXQoJnNyYywgMCwgc2l6ZW9mKHNyYykpOworCisgICBzcmMuRmlsZSA9IFBST0dSQU1fQ09OU1RBTlQ7CisgICBzcmMuSW5kZXggPSBfbWVzYV9hZGRfdW5uYW1lZF9jb25zdGFudChwcm9nLT5QYXJhbWV0ZXJzLAorCQkJCQkgIChnbF9jb25zdGFudF92YWx1ZSAqKSB2YWwsIDQsICZzd2l6KTsKKyAgIHNyYy5Td2l6emxlID0gc3dpejsKKyAgIHJldHVybiBzcmM7Cit9CisKK3N0YXRpYyBib29sCitzcmNfcmVnc19hcmVfc2FtZShjb25zdCBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgKmEsCisJCSAgY29uc3Qgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpiKQoreworICAgcmV0dXJuIChhLT5GaWxlID09IGItPkZpbGUpCisgICAgICAmJiAoYS0+SW5kZXggPT0gYi0+SW5kZXgpCisgICAgICAmJiAoYS0+U3dpenpsZSA9PSBiLT5Td2l6emxlKQorICAgICAgJiYgKGEtPkFicyA9PSBiLT5BYnMpCisgICAgICAmJiAoYS0+TmVnYXRlID09IGItPk5lZ2F0ZSkKKyAgICAgICYmIChhLT5SZWxBZGRyID09IDApCisgICAgICAmJiAoYi0+UmVsQWRkciA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK2dldF92YWx1ZShzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpyLCBmbG9hdCAqZGF0YSkKK3sKKyAgIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlICpjb25zdCB2YWx1ZSA9CisgICAgICBwcm9nLT5QYXJhbWV0ZXJzLT5QYXJhbWV0ZXJWYWx1ZXNbci0+SW5kZXhdOworCisgICBkYXRhWzBdID0gdmFsdWVbR0VUX1NXWihyLT5Td2l6emxlLCAwKV0uZjsKKyAgIGRhdGFbMV0gPSB2YWx1ZVtHRVRfU1daKHItPlN3aXp6bGUsIDEpXS5mOworICAgZGF0YVsyXSA9IHZhbHVlW0dFVF9TV1ooci0+U3dpenpsZSwgMildLmY7CisgICBkYXRhWzNdID0gdmFsdWVbR0VUX1NXWihyLT5Td2l6emxlLCAzKV0uZjsKKworICAgaWYgKHItPkFicykgeworICAgICAgZGF0YVswXSA9IGZhYnNmKGRhdGFbMF0pOworICAgICAgZGF0YVsxXSA9IGZhYnNmKGRhdGFbMV0pOworICAgICAgZGF0YVsyXSA9IGZhYnNmKGRhdGFbMl0pOworICAgICAgZGF0YVszXSA9IGZhYnNmKGRhdGFbM10pOworICAgfQorCisgICBpZiAoci0+TmVnYXRlICYgMHgwMSkgeworICAgICAgZGF0YVswXSA9IC1kYXRhWzBdOworICAgfQorCisgICBpZiAoci0+TmVnYXRlICYgMHgwMikgeworICAgICAgZGF0YVsxXSA9IC1kYXRhWzFdOworICAgfQorCisgICBpZiAoci0+TmVnYXRlICYgMHgwNCkgeworICAgICAgZGF0YVsyXSA9IC1kYXRhWzJdOworICAgfQorCisgICBpZiAoci0+TmVnYXRlICYgMHgwOCkgeworICAgICAgZGF0YVszXSA9IC1kYXRhWzNdOworICAgfQorfQorCisvKioKKyAqIFRyeSB0byByZXBsYWNlIGluc3RydWN0aW9ucyB0aGF0IHByb2R1Y2UgYSBjb25zdGFudCByZXN1bHQgd2l0aCBzaW1wbGUgbW92ZXMKKyAqCisgKiBUaGUgaG9wZSBpcyB0aGF0IGEgZm9sbG93aW5nIGNvcHkgcHJvcGFnYXRpb24gcGFzcyB3aWxsIGVsaW1pbmF0ZSB0aGUKKyAqIHVubmVjZXNzYXJ5IG1vdmUgaW5zdHJ1Y3Rpb25zLgorICovCitHTGJvb2xlYW4KK19tZXNhX2NvbnN0YW50X2ZvbGQoc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisgICB1bnNpZ25lZCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOyBpKyspIHsKKyAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpjb25zdCBpbnN0ID0gJnByb2ctPkluc3RydWN0aW9uc1tpXTsKKworICAgICAgc3dpdGNoIChpbnN0LT5PcGNvZGUpIHsKKyAgICAgIGNhc2UgT1BDT0RFX0FERDoKKwkgaWYgKHNyY19yZWdzX2FyZV9jb25zdGFudChpbnN0LCAyKSkgeworCSAgICBmbG9hdCBhWzRdOworCSAgICBmbG9hdCBiWzRdOworCSAgICBmbG9hdCByZXN1bHRbNF07CisKKwkgICAgZ2V0X3ZhbHVlKHByb2csICZpbnN0LT5TcmNSZWdbMF0sIGEpOworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1sxXSwgYik7CisKKwkgICAgcmVzdWx0WzBdID0gYVswXSArIGJbMF07CisJICAgIHJlc3VsdFsxXSA9IGFbMV0gKyBiWzFdOworCSAgICByZXN1bHRbMl0gPSBhWzJdICsgYlsyXTsKKwkgICAgcmVzdWx0WzNdID0gYVszXSArIGJbM107CisKKwkgICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKwkgICAgaW5zdC0+U3JjUmVnWzBdID0gc3JjX3JlZ19mb3JfdmVjNChwcm9nLCByZXN1bHQpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfQorCSBicmVhazsKKworICAgICAgY2FzZSBPUENPREVfQ01QOgorCSAvKiBGSU5JU0hNRTogV2UgY291bGQgYWxzbyBvcHRpbWl6ZSBDTVAgaW5zdHJ1Y3Rpb25zIHdoZXJlIHRoZSBmaXJzdAorCSAgKiBGSU5JU0hNRTogc291cmNlIGlzIGEgY29uc3RhbnQgdGhhdCBpcyBlaXRoZXIgYWxsIDwgMC4wIG9yIGFsbAorCSAgKiBGSU5JU0hNRTogPj0gMC4wLgorCSAgKi8KKwkgaWYgKHNyY19yZWdzX2FyZV9jb25zdGFudChpbnN0LCAzKSkgeworCSAgICBmbG9hdCBhWzRdOworCSAgICBmbG9hdCBiWzRdOworCSAgICBmbG9hdCBjWzRdOworCSAgICBmbG9hdCByZXN1bHRbNF07CisKKwkgICAgZ2V0X3ZhbHVlKHByb2csICZpbnN0LT5TcmNSZWdbMF0sIGEpOworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1sxXSwgYik7CisJICAgIGdldF92YWx1ZShwcm9nLCAmaW5zdC0+U3JjUmVnWzJdLCBjKTsKKworICAgICAgICAgICAgcmVzdWx0WzBdID0gYVswXSA8IDAuMGYgPyBiWzBdIDogY1swXTsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IGFbMV0gPCAwLjBmID8gYlsxXSA6IGNbMV07CisgICAgICAgICAgICByZXN1bHRbMl0gPSBhWzJdIDwgMC4wZiA/IGJbMl0gOiBjWzJdOworICAgICAgICAgICAgcmVzdWx0WzNdID0gYVszXSA8IDAuMGYgPyBiWzNdIDogY1szXTsKKworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl92ZWM0KHByb2csIHJlc3VsdCk7CisKKwkgICAgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKwkgICAgaW5zdC0+U3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisJICAgIGluc3QtPlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1syXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfQorCSBicmVhazsKKworICAgICAgY2FzZSBPUENPREVfRFAyOgorICAgICAgY2FzZSBPUENPREVfRFAzOgorICAgICAgY2FzZSBPUENPREVfRFA0OgorCSBpZiAoc3JjX3JlZ3NfYXJlX2NvbnN0YW50KGluc3QsIDIpKSB7CisJICAgIGZsb2F0IGFbNF07CisJICAgIGZsb2F0IGJbNF07CisJICAgIGZsb2F0IHJlc3VsdDsKKworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1swXSwgYSk7CisJICAgIGdldF92YWx1ZShwcm9nLCAmaW5zdC0+U3JjUmVnWzFdLCBiKTsKKworCSAgICByZXN1bHQgPSAoYVswXSAqIGJbMF0pICsgKGFbMV0gKiBiWzFdKTsKKworCSAgICBpZiAoaW5zdC0+T3Bjb2RlID49IE9QQ09ERV9EUDMpCisJICAgICAgIHJlc3VsdCArPSBhWzJdICogYlsyXTsKKworCSAgICBpZiAoaW5zdC0+T3Bjb2RlID09IE9QQ09ERV9EUDQpCisJICAgICAgIHJlc3VsdCArPSBhWzNdICogYlszXTsKKworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl9mbG9hdChwcm9nLCByZXN1bHQpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfQorCSBicmVhazsKKworICAgICAgY2FzZSBPUENPREVfTVVMOgorCSBpZiAoc3JjX3JlZ3NfYXJlX2NvbnN0YW50KGluc3QsIDIpKSB7CisJICAgIGZsb2F0IGFbNF07CisJICAgIGZsb2F0IGJbNF07CisJICAgIGZsb2F0IHJlc3VsdFs0XTsKKworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1swXSwgYSk7CisJICAgIGdldF92YWx1ZShwcm9nLCAmaW5zdC0+U3JjUmVnWzFdLCBiKTsKKworCSAgICByZXN1bHRbMF0gPSBhWzBdICogYlswXTsKKwkgICAgcmVzdWx0WzFdID0gYVsxXSAqIGJbMV07CisJICAgIHJlc3VsdFsyXSA9IGFbMl0gKiBiWzJdOworCSAgICByZXN1bHRbM10gPSBhWzNdICogYlszXTsKKworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl92ZWM0KHByb2csIHJlc3VsdCk7CisKKwkgICAgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKwkgICAgaW5zdC0+U3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisKKwkgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSB9CisJIGJyZWFrOworCisgICAgICBjYXNlIE9QQ09ERV9TRVE6CisJIGlmIChzcmNfcmVnc19hcmVfY29uc3RhbnQoaW5zdCwgMikpIHsKKwkgICAgZmxvYXQgYVs0XTsKKwkgICAgZmxvYXQgYls0XTsKKwkgICAgZmxvYXQgcmVzdWx0WzRdOworCisJICAgIGdldF92YWx1ZShwcm9nLCAmaW5zdC0+U3JjUmVnWzBdLCBhKTsKKwkgICAgZ2V0X3ZhbHVlKHByb2csICZpbnN0LT5TcmNSZWdbMV0sIGIpOworCisJICAgIHJlc3VsdFswXSA9IChhWzBdID09IGJbMF0pID8gMS4wZiA6IDAuMGY7CisJICAgIHJlc3VsdFsxXSA9IChhWzFdID09IGJbMV0pID8gMS4wZiA6IDAuMGY7CisJICAgIHJlc3VsdFsyXSA9IChhWzJdID09IGJbMl0pID8gMS4wZiA6IDAuMGY7CisJICAgIHJlc3VsdFszXSA9IChhWzNdID09IGJbM10pID8gMS4wZiA6IDAuMGY7CisKKwkgICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKwkgICAgaW5zdC0+U3JjUmVnWzBdID0gc3JjX3JlZ19mb3JfdmVjNChwcm9nLCByZXN1bHQpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfSBlbHNlIGlmIChzcmNfcmVnc19hcmVfc2FtZSgmaW5zdC0+U3JjUmVnWzBdLCAmaW5zdC0+U3JjUmVnWzFdKSkgeworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl9mbG9hdChwcm9nLCAxLjBmKTsKKworCSAgICBpbnN0LT5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworCSAgICBpbnN0LT5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKworCSAgICBwcm9ncmVzcyA9IHRydWU7CisJIH0KKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgT1BDT0RFX1NHRToKKwkgaWYgKHNyY19yZWdzX2FyZV9jb25zdGFudChpbnN0LCAyKSkgeworCSAgICBmbG9hdCBhWzRdOworCSAgICBmbG9hdCBiWzRdOworCSAgICBmbG9hdCByZXN1bHRbNF07CisKKwkgICAgZ2V0X3ZhbHVlKHByb2csICZpbnN0LT5TcmNSZWdbMF0sIGEpOworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1sxXSwgYik7CisKKwkgICAgcmVzdWx0WzBdID0gKGFbMF0gPj0gYlswXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzFdID0gKGFbMV0gPj0gYlsxXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzJdID0gKGFbMl0gPj0gYlsyXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzNdID0gKGFbM10gPj0gYlszXSkgPyAxLjBmIDogMC4wZjsKKworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl92ZWM0KHByb2csIHJlc3VsdCk7CisKKwkgICAgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKwkgICAgaW5zdC0+U3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisKKwkgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSB9IGVsc2UgaWYgKHNyY19yZWdzX2FyZV9zYW1lKCZpbnN0LT5TcmNSZWdbMF0sICZpbnN0LT5TcmNSZWdbMV0pKSB7CisJICAgIGluc3QtPk9wY29kZSA9IE9QQ09ERV9NT1Y7CisJICAgIGluc3QtPlNyY1JlZ1swXSA9IHNyY19yZWdfZm9yX2Zsb2F0KHByb2csIDEuMGYpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfQorCSBicmVhazsKKworICAgICAgY2FzZSBPUENPREVfU0dUOgorCSBpZiAoc3JjX3JlZ3NfYXJlX2NvbnN0YW50KGluc3QsIDIpKSB7CisJICAgIGZsb2F0IGFbNF07CisJICAgIGZsb2F0IGJbNF07CisJICAgIGZsb2F0IHJlc3VsdFs0XTsKKworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1swXSwgYSk7CisJICAgIGdldF92YWx1ZShwcm9nLCAmaW5zdC0+U3JjUmVnWzFdLCBiKTsKKworCSAgICByZXN1bHRbMF0gPSAoYVswXSA+IGJbMF0pID8gMS4wZiA6IDAuMGY7CisJICAgIHJlc3VsdFsxXSA9IChhWzFdID4gYlsxXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzJdID0gKGFbMl0gPiBiWzJdKSA/IDEuMGYgOiAwLjBmOworCSAgICByZXN1bHRbM10gPSAoYVszXSA+IGJbM10pID8gMS4wZiA6IDAuMGY7CisKKwkgICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKwkgICAgaW5zdC0+U3JjUmVnWzBdID0gc3JjX3JlZ19mb3JfdmVjNChwcm9nLCByZXN1bHQpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfSBlbHNlIGlmIChzcmNfcmVnc19hcmVfc2FtZSgmaW5zdC0+U3JjUmVnWzBdLCAmaW5zdC0+U3JjUmVnWzFdKSkgeworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl9mbG9hdChwcm9nLCAwLjBmKTsKKworCSAgICBpbnN0LT5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworCSAgICBpbnN0LT5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKworCSAgICBwcm9ncmVzcyA9IHRydWU7CisJIH0KKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgT1BDT0RFX1NMRToKKwkgaWYgKHNyY19yZWdzX2FyZV9jb25zdGFudChpbnN0LCAyKSkgeworCSAgICBmbG9hdCBhWzRdOworCSAgICBmbG9hdCBiWzRdOworCSAgICBmbG9hdCByZXN1bHRbNF07CisKKwkgICAgZ2V0X3ZhbHVlKHByb2csICZpbnN0LT5TcmNSZWdbMF0sIGEpOworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1sxXSwgYik7CisKKwkgICAgcmVzdWx0WzBdID0gKGFbMF0gPD0gYlswXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzFdID0gKGFbMV0gPD0gYlsxXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzJdID0gKGFbMl0gPD0gYlsyXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzNdID0gKGFbM10gPD0gYlszXSkgPyAxLjBmIDogMC4wZjsKKworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl92ZWM0KHByb2csIHJlc3VsdCk7CisKKwkgICAgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKwkgICAgaW5zdC0+U3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisKKwkgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSB9IGVsc2UgaWYgKHNyY19yZWdzX2FyZV9zYW1lKCZpbnN0LT5TcmNSZWdbMF0sICZpbnN0LT5TcmNSZWdbMV0pKSB7CisJICAgIGluc3QtPk9wY29kZSA9IE9QQ09ERV9NT1Y7CisJICAgIGluc3QtPlNyY1JlZ1swXSA9IHNyY19yZWdfZm9yX2Zsb2F0KHByb2csIDEuMGYpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfQorCSBicmVhazsKKworICAgICAgY2FzZSBPUENPREVfU0xUOgorCSBpZiAoc3JjX3JlZ3NfYXJlX2NvbnN0YW50KGluc3QsIDIpKSB7CisJICAgIGZsb2F0IGFbNF07CisJICAgIGZsb2F0IGJbNF07CisJICAgIGZsb2F0IHJlc3VsdFs0XTsKKworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1swXSwgYSk7CisJICAgIGdldF92YWx1ZShwcm9nLCAmaW5zdC0+U3JjUmVnWzFdLCBiKTsKKworCSAgICByZXN1bHRbMF0gPSAoYVswXSA8IGJbMF0pID8gMS4wZiA6IDAuMGY7CisJICAgIHJlc3VsdFsxXSA9IChhWzFdIDwgYlsxXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzJdID0gKGFbMl0gPCBiWzJdKSA/IDEuMGYgOiAwLjBmOworCSAgICByZXN1bHRbM10gPSAoYVszXSA8IGJbM10pID8gMS4wZiA6IDAuMGY7CisKKwkgICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKwkgICAgaW5zdC0+U3JjUmVnWzBdID0gc3JjX3JlZ19mb3JfdmVjNChwcm9nLCByZXN1bHQpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfSBlbHNlIGlmIChzcmNfcmVnc19hcmVfc2FtZSgmaW5zdC0+U3JjUmVnWzBdLCAmaW5zdC0+U3JjUmVnWzFdKSkgeworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl9mbG9hdChwcm9nLCAwLjBmKTsKKworCSAgICBpbnN0LT5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworCSAgICBpbnN0LT5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKworCSAgICBwcm9ncmVzcyA9IHRydWU7CisJIH0KKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgT1BDT0RFX1NORToKKwkgaWYgKHNyY19yZWdzX2FyZV9jb25zdGFudChpbnN0LCAyKSkgeworCSAgICBmbG9hdCBhWzRdOworCSAgICBmbG9hdCBiWzRdOworCSAgICBmbG9hdCByZXN1bHRbNF07CisKKwkgICAgZ2V0X3ZhbHVlKHByb2csICZpbnN0LT5TcmNSZWdbMF0sIGEpOworCSAgICBnZXRfdmFsdWUocHJvZywgJmluc3QtPlNyY1JlZ1sxXSwgYik7CisKKwkgICAgcmVzdWx0WzBdID0gKGFbMF0gIT0gYlswXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzFdID0gKGFbMV0gIT0gYlsxXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzJdID0gKGFbMl0gIT0gYlsyXSkgPyAxLjBmIDogMC4wZjsKKwkgICAgcmVzdWx0WzNdID0gKGFbM10gIT0gYlszXSkgPyAxLjBmIDogMC4wZjsKKworCSAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworCSAgICBpbnN0LT5TcmNSZWdbMF0gPSBzcmNfcmVnX2Zvcl92ZWM0KHByb2csIHJlc3VsdCk7CisKKwkgICAgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKwkgICAgaW5zdC0+U3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisKKwkgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSB9IGVsc2UgaWYgKHNyY19yZWdzX2FyZV9zYW1lKCZpbnN0LT5TcmNSZWdbMF0sICZpbnN0LT5TcmNSZWdbMV0pKSB7CisJICAgIGluc3QtPk9wY29kZSA9IE9QQ09ERV9NT1Y7CisJICAgIGluc3QtPlNyY1JlZ1swXSA9IHNyY19yZWdfZm9yX2Zsb2F0KHByb2csIDAuMGYpOworCisJICAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfQorCSBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19vcHRpbWl6ZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX29wdGltaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZDBlMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19vcHRpbWl6ZS5jCkBAIC0wLDAgKzEsMTM2MiBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFZNd2FyZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZNV0FSRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vY29udGV4dC5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicHJvZ3JhbS5oIgorI2luY2x1ZGUgInByb2dfaW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJwcm9nX29wdGltaXplLmgiCisjaW5jbHVkZSAicHJvZ19wcmludC5oIgorCisKKyNkZWZpbmUgTUFYX0xPT1BfTkVTVElORyA1MAorLyogTUFYX1BST0dSQU1fVEVNUFMgaXMgYSBsb3cgbnVtYmVyICgyNTYpLCBhbmQgd2Ugd2FudCB0byBiZSBhYmxlIHRvCisgKiByZWdpc3RlciBhbGxvY2F0ZSBtYW55IHRlbXBvcmFyeSB2YWx1ZXMgaW50byB0aGF0IHNtYWxsIG51bWJlciBvZgorICogdGVtcHMuICBTbyBhbGxvdyBsYXJnZSB0ZW1wb3JhcnkgaW5kaWNlcyBjb21pbmcgaW50byB0aGUgcmVnaXN0ZXIKKyAqIGFsbG9jYXRvci4KKyAqLworI2RlZmluZSBSRUdfQUxMT0NBVEVfTUFYX1BST0dSQU1fVEVNUFMJKCgxIDw8IElOU1RfSU5ERVhfQklUUykgLSAxKQorCitzdGF0aWMgR0xib29sZWFuIGRiZyA9IEdMX0ZBTFNFOworCisjZGVmaW5lIE5PX01BU0sgMHhmCisKKy8qKgorICogUmV0dXJucyB0aGUgbWFzayBvZiBjaGFubmVscyAoYml0bWFzayBvZiBXUklURU1BU0tfWCxZLFosVykgd2hpY2gKKyAqIGFyZSByZWFkIGZyb20gdGhlIGdpdmVuIHNyYyBpbiB0aGlzIGluc3RydWN0aW9uLCBXZSBhbHNvIHByb3ZpZGUKKyAqIG9uZSBvcHRpb25hbCBtYXNrcyB3aGljaCBtYXkgbWFzayBvdGhlciBjb21wb25lbnRzIGluIHRoZSBkc3QKKyAqIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBHTHVpbnQKK2dldF9zcmNfYXJnX21hc2soY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgIEdMdWludCBhcmcsIEdMdWludCBkc3RfbWFzaykKK3sKKyAgIEdMdWludCByZWFkX21hc2ssIGNoYW5uZWxfbWFzazsKKyAgIEdMdWludCBjb21wOworCisgICBBU1NFUlQoYXJnIDwgX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKSk7CisKKyAgIC8qIEZvcm0gdGhlIGRzdCByZWdpc3RlciwgZmluZCB0aGUgd3JpdHRlbiBjaGFubmVscyAqLworICAgaWYgKGluc3QtPkNvbmRVcGRhdGUpIHsKKyAgICAgIGNoYW5uZWxfbWFzayA9IFdSSVRFTUFTS19YWVpXOworICAgfQorICAgZWxzZSB7CisgICAgICBzd2l0Y2ggKGluc3QtPk9wY29kZSkgeworICAgICAgY2FzZSBPUENPREVfTU9WOgorICAgICAgY2FzZSBPUENPREVfTUlOOgorICAgICAgY2FzZSBPUENPREVfTUFYOgorICAgICAgY2FzZSBPUENPREVfQUJTOgorICAgICAgY2FzZSBPUENPREVfQUREOgorICAgICAgY2FzZSBPUENPREVfTUFEOgorICAgICAgY2FzZSBPUENPREVfTVVMOgorICAgICAgY2FzZSBPUENPREVfU1VCOgorICAgICAgY2FzZSBPUENPREVfQ01QOgorICAgICAgY2FzZSBPUENPREVfRkxSOgorICAgICAgY2FzZSBPUENPREVfRlJDOgorICAgICAgY2FzZSBPUENPREVfTFJQOgorICAgICAgY2FzZSBPUENPREVfU0VROgorICAgICAgY2FzZSBPUENPREVfU0dFOgorICAgICAgY2FzZSBPUENPREVfU0dUOgorICAgICAgY2FzZSBPUENPREVfU0xFOgorICAgICAgY2FzZSBPUENPREVfU0xUOgorICAgICAgY2FzZSBPUENPREVfU05FOgorICAgICAgY2FzZSBPUENPREVfU1NHOgorICAgICAgICAgY2hhbm5lbF9tYXNrID0gaW5zdC0+RHN0UmVnLldyaXRlTWFzayAmIGRzdF9tYXNrOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9SQ1A6CisgICAgICBjYXNlIE9QQ09ERV9TSU46CisgICAgICBjYXNlIE9QQ09ERV9DT1M6CisgICAgICBjYXNlIE9QQ09ERV9SU1E6CisgICAgICBjYXNlIE9QQ09ERV9QT1c6CisgICAgICBjYXNlIE9QQ09ERV9FWDI6CisgICAgICBjYXNlIE9QQ09ERV9MT0c6CisgICAgICAgICBjaGFubmVsX21hc2sgPSBXUklURU1BU0tfWDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRFAyOgorICAgICAgICAgY2hhbm5lbF9tYXNrID0gV1JJVEVNQVNLX1hZOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9EUDM6CisgICAgICBjYXNlIE9QQ09ERV9YUEQ6CisgICAgICAgICBjaGFubmVsX21hc2sgPSBXUklURU1BU0tfWFlaOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgY2hhbm5lbF9tYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgLyogTm93LCBnaXZlbiB0aGUgc3JjIHN3aXp6bGUgYW5kIHRoZSB3cml0dGVuIGNoYW5uZWxzLCBmaW5kIHdoaWNoCisgICAgKiBjb21wb25lbnRzIGFyZSBhY3R1YWxseSByZWFkCisgICAgKi8KKyAgIHJlYWRfbWFzayA9IDB4MDsKKyAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA0OyArK2NvbXApIHsKKyAgICAgIGNvbnN0IEdMdWludCBjb29yZCA9IEdFVF9TV1ooaW5zdC0+U3JjUmVnW2FyZ10uU3dpenpsZSwgY29tcCk7CisgICAgICBBU1NFUlQoY29vcmQgPCA0KTsKKyAgICAgIGlmIChjaGFubmVsX21hc2sgJiAoMSA8PCBjb21wKSAmJiBjb29yZCA8PSBTV0laWkxFX1cpCisgICAgICAgICByZWFkX21hc2sgfD0gMSA8PCBjb29yZDsKKyAgIH0KKworICAgcmV0dXJuIHJlYWRfbWFzazsKK30KKworCisvKioKKyAqIEZvciBhIE1PViBpbnN0cnVjdGlvbiwgY29tcHV0ZSBhIHdyaXRlIG1hc2sgd2hlbiBzcmMgcmVnaXN0ZXIgYWxzbyBoYXMKKyAqIGEgbWFzaworICovCitzdGF0aWMgR0x1aW50CitnZXRfZHN0X21hc2tfZm9yX21vdihjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqbW92LCBHTHVpbnQgc3JjX21hc2spCit7CisgICBjb25zdCBHTHVpbnQgbWFzayA9IG1vdi0+RHN0UmVnLldyaXRlTWFzazsKKyAgIEdMdWludCBjb21wOworICAgR0x1aW50IHVwZGF0ZWRfbWFzayA9IDB4MDsKKworICAgQVNTRVJUKG1vdi0+T3Bjb2RlID09IE9QQ09ERV9NT1YpOworCisgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNDsgKytjb21wKSB7CisgICAgICBHTHVpbnQgc3JjX2NvbXA7CisgICAgICBpZiAoKG1hc2sgJiAoMSA8PCBjb21wKSkgPT0gMCkKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgc3JjX2NvbXAgPSBHRVRfU1daKG1vdi0+U3JjUmVnWzBdLlN3aXp6bGUsIGNvbXApOworICAgICAgaWYgKChzcmNfbWFzayAmICgxIDw8IHNyY19jb21wKSkgPT0gMCkKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgdXBkYXRlZF9tYXNrIHw9IDEgPDwgY29tcDsKKyAgIH0KKworICAgcmV0dXJuIHVwZGF0ZWRfbWFzazsKK30KKworCisvKioKKyAqIEVuc3VyZSB0aGF0IHRoZSBzd2l6emxlIGlzIHJlZ3VsYXIuICBUaGF0IGlzLCBhbGwgb2YgdGhlIHN3aXp6bGUKKyAqIHRlcm1zIGFyZSBTV0laWkxFX1gsWSxaLFcgYW5kIG5vdCBTV0laWkxFX1pFUk8gb3IgU1dJWlpMRV9PTkUuCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4KK2lzX3N3aXp6bGVfcmVndWxhcihHTHVpbnQgc3d6KQoreworICAgcmV0dXJuIEdFVF9TV1ooc3d6LDApIDw9IFNXSVpaTEVfVyAmJgorICAgICAgICAgIEdFVF9TV1ooc3d6LDEpIDw9IFNXSVpaTEVfVyAmJgorICAgICAgICAgIEdFVF9TV1ooc3d6LDIpIDw9IFNXSVpaTEVfVyAmJgorICAgICAgICAgIEdFVF9TV1ooc3d6LDMpIDw9IFNXSVpaTEVfVzsKK30KKworCisvKioKKyAqIEluICdwcm9nJyByZW1vdmUgaW5zdHJ1Y3Rpb25baV0gaWYgcmVtb3ZlRmxhZ3NbaV0gPT0gVFJVRS4KKyAqIFxyZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyByZW1vdmVkCisgKi8KK3N0YXRpYyBHTHVpbnQKK3JlbW92ZV9pbnN0cnVjdGlvbnMoc3RydWN0IGdsX3Byb2dyYW0gKnByb2csIGNvbnN0IEdMYm9vbGVhbiAqcmVtb3ZlRmxhZ3MpCit7CisgICBHTGludCBpLCByZW1vdmVFbmQgPSAwLCByZW1vdmVDb3VudCA9IDA7CisgICBHTHVpbnQgdG90YWxSZW1vdmVkID0gMDsKKworICAgLyogZ28gYmFja3dhcmQgKi8KKyAgIGZvciAoaSA9IHByb2ctPk51bUluc3RydWN0aW9ucyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAocmVtb3ZlRmxhZ3NbaV0pIHsKKyAgICAgICAgIHRvdGFsUmVtb3ZlZCsrOworICAgICAgICAgaWYgKHJlbW92ZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8qIGJlZ2luIGEgcnVuIG9mIGluc3RydWN0aW9ucyB0byByZW1vdmUgKi8KKyAgICAgICAgICAgIHJlbW92ZUVuZCA9IGk7CisgICAgICAgICAgICByZW1vdmVDb3VudCA9IDE7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGV4dGVuZCB0aGUgcnVuIG9mIGluc3RydWN0aW9ucyB0byByZW1vdmUgKi8KKyAgICAgICAgICAgIHJlbW92ZUNvdW50Kys7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIC8qIGRvbid0IHJlbW92ZSB0aGlzIGluc3RydWN0aW9uLCBidXQgY2hlY2sgaWYgdGhlIHByZWNlZGluZworICAgICAgICAgICogaW5zdHJ1Y3Rpb25zIGFyZSB0byBiZSByZW1vdmVkLgorICAgICAgICAgICovCisgICAgICAgICBpZiAocmVtb3ZlQ291bnQgPiAwKSB7CisgICAgICAgICAgICBHTGludCByZW1vdmVTdGFydCA9IHJlbW92ZUVuZCAtIHJlbW92ZUNvdW50ICsgMTsKKyAgICAgICAgICAgIF9tZXNhX2RlbGV0ZV9pbnN0cnVjdGlvbnMocHJvZywgcmVtb3ZlU3RhcnQsIHJlbW92ZUNvdW50KTsKKyAgICAgICAgICAgIHJlbW92ZVN0YXJ0ID0gcmVtb3ZlQ291bnQgPSAwOyAvKiByZXNldCByZW1vdmFsIGluZm8gKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIC8qIEZpbmlzaCByZW1vdmluZyBpZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2FzIHRvIGJlIHJlbW92ZWQuICovCisgICBpZiAocmVtb3ZlQ291bnQgPiAwKSB7CisgICAgICBHTGludCByZW1vdmVTdGFydCA9IHJlbW92ZUVuZCAtIHJlbW92ZUNvdW50ICsgMTsKKyAgICAgIF9tZXNhX2RlbGV0ZV9pbnN0cnVjdGlvbnMocHJvZywgcmVtb3ZlU3RhcnQsIHJlbW92ZUNvdW50KTsKKyAgIH0KKyAgIHJldHVybiB0b3RhbFJlbW92ZWQ7Cit9CisKKworLyoqCisgKiBSZW1hcCByZWdpc3RlciBpbmRleGVzIGFjY29yZGluZyB0byBtYXAuCisgKiBccGFyYW0gcHJvZyAgdGhlIHByb2dyYW0gdG8gc2VhcmNoL3JlcGxhY2UKKyAqIFxwYXJhbSBmaWxlICB0aGUgdHlwZSBvZiByZWdpc3RlciBmaWxlIHRvIHNlYXJjaC9yZXBsYWNlCisgKiBccGFyYW0gbWFwICBtYXBzIG9sZCByZWdpc3RlciBpbmRleGVzIHRvIG5ldyBpbmRleGVzCisgKi8KK3N0YXRpYyB2b2lkCityZXBsYWNlX3JlZ3Moc3RydWN0IGdsX3Byb2dyYW0gKnByb2csIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwgY29uc3QgR0xpbnQgbWFwW10pCit7CisgICBHTHVpbnQgaTsKKworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBjb25zdCBHTHVpbnQgbnVtU3JjID0gX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsKKyAgICAgIEdMdWludCBqOworICAgICAgZm9yIChqID0gMDsgaiA8IG51bVNyYzsgaisrKSB7CisgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gZmlsZSkgeworICAgICAgICAgICAgR0x1aW50IGluZGV4ID0gaW5zdC0+U3JjUmVnW2pdLkluZGV4OworICAgICAgICAgICAgQVNTRVJUKG1hcFtpbmRleF0gPj0gMCk7CisgICAgICAgICAgICBpbnN0LT5TcmNSZWdbal0uSW5kZXggPSBtYXBbaW5kZXhdOworICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGluc3QtPkRzdFJlZy5GaWxlID09IGZpbGUpIHsKKyAgICAgICAgIGNvbnN0IEdMdWludCBpbmRleCA9IGluc3QtPkRzdFJlZy5JbmRleDsKKyAgICAgICAgIEFTU0VSVChtYXBbaW5kZXhdID49IDApOworICAgICAgICAgaW5zdC0+RHN0UmVnLkluZGV4ID0gbWFwW2luZGV4XTsKKyAgICAgIH0KKyAgIH0KK30KKworCisvKioKKyAqIFJlbW92ZSBkZWFkIGluc3RydWN0aW9ucyBmcm9tIHRoZSBnaXZlbiBwcm9ncmFtLgorICogVGhpcyBpcyB2ZXJ5IHByaW1pdGl2ZSBmb3Igbm93LiAgQmFzaWNhbGx5IGxvb2sgZm9yIHRlbXAgcmVnaXN0ZXJzCisgKiB0aGF0IGFyZSB3cml0dGVuIHRvIGJ1dCBuZXZlciByZWFkLiAgUmVtb3ZlIGFueSBpbnN0cnVjdGlvbnMgdGhhdAorICogd3JpdGUgdG8gc3VjaCByZWdpc3RlcnMuICBCZSBjYXJlZnVsIHdpdGggY29uZGl0aW9uIGNvZGUgc2V0dGVycy4KKyAqLworc3RhdGljIEdMYm9vbGVhbgorX21lc2FfcmVtb3ZlX2RlYWRfY29kZV9nbG9iYWwoc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICBHTGJvb2xlYW4gdGVtcFJlYWRbUkVHX0FMTE9DQVRFX01BWF9QUk9HUkFNX1RFTVBTXVs0XTsKKyAgIEdMYm9vbGVhbiAqcmVtb3ZlSW5zdDsgLyogcGVyLWluc3RydWN0aW9uIHJlbW92YWwgZmxhZyAqLworICAgR0x1aW50IGksIHJlbSA9IDAsIGNvbXA7CisKKyAgIG1lbXNldCh0ZW1wUmVhZCwgMCwgc2l6ZW9mKHRlbXBSZWFkKSk7CisKKyAgIGlmIChkYmcpIHsKKyAgICAgIHByaW50ZigiT3B0aW1pemU6IEJlZ2luIGRlYWQgY29kZSByZW1vdmFsXG4iKTsKKyAgICAgIC8qX21lc2FfcHJpbnRfcHJvZ3JhbShwcm9nKTsqLworICAgfQorCisgICByZW1vdmVJbnN0ID0KKyAgICAgIGNhbGxvYygxLCBwcm9nLT5OdW1JbnN0cnVjdGlvbnMgKiBzaXplb2YoR0xib29sZWFuKSk7CisKKyAgIC8qIERldGVybWluZSB3aGljaCB0ZW1wcyBhcmUgcmVhZCBhbmQgd3JpdHRlbiAqLworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBjb25zdCBHTHVpbnQgbnVtU3JjID0gX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsKKyAgICAgIEdMdWludCBqOworCisgICAgICAvKiBjaGVjayBzcmMgcmVncyAqLworICAgICAgZm9yIChqID0gMDsgaiA8IG51bVNyYzsgaisrKSB7CisgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpIHsKKyAgICAgICAgICAgIGNvbnN0IEdMdWludCBpbmRleCA9IGluc3QtPlNyY1JlZ1tqXS5JbmRleDsKKyAgICAgICAgICAgIEdMdWludCByZWFkX21hc2s7CisgICAgICAgICAgICBBU1NFUlQoaW5kZXggPCBSRUdfQUxMT0NBVEVfTUFYX1BST0dSQU1fVEVNUFMpOworCSAgICByZWFkX21hc2sgPSBnZXRfc3JjX2FyZ19tYXNrKGluc3QsIGosIE5PX01BU0spOworCisgICAgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLlJlbEFkZHIpIHsKKyAgICAgICAgICAgICAgIGlmIChkYmcpCisgICAgICAgICAgICAgICAgICBwcmludGYoImFib3J0IHJlbW92ZSBkZWFkIGNvZGUgKGluZGlyZWN0IHRlbXApXG4iKTsKKyAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKworCSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNDsgY29tcCsrKSB7CisJICAgICAgIGNvbnN0IEdMdWludCBzd3ogPSBHRVRfU1daKGluc3QtPlNyY1JlZ1tqXS5Td2l6emxlLCBjb21wKTsKKwkgICAgICAgQVNTRVJUKHN3eiA8IDQpOworICAgICAgICAgICAgICAgaWYgKChyZWFkX21hc2sgJiAoMSA8PCBzd3opKSA9PSAwKQorCQkgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgaWYgKHN3eiA8PSBTV0laWkxFX1cpCisgICAgICAgICAgICAgICAgICB0ZW1wUmVhZFtpbmRleF1bc3d6XSA9IEdMX1RSVUU7CisJICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogY2hlY2sgZHN0IHJlZyAqLworICAgICAgaWYgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZKSB7CisgICAgICAgICBjb25zdCBHTHVpbnQgaW5kZXggPSBpbnN0LT5Ec3RSZWcuSW5kZXg7CisgICAgICAgICBBU1NFUlQoaW5kZXggPCBSRUdfQUxMT0NBVEVfTUFYX1BST0dSQU1fVEVNUFMpOworCisgICAgICAgICBpZiAoaW5zdC0+RHN0UmVnLlJlbEFkZHIpIHsKKyAgICAgICAgICAgIGlmIChkYmcpCisgICAgICAgICAgICAgICBwcmludGYoImFib3J0IHJlbW92ZSBkZWFkIGNvZGUgKGluZGlyZWN0IHRlbXApXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGluc3QtPkNvbmRVcGRhdGUpIHsKKyAgICAgICAgICAgIC8qIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhpcyByZWdpc3RlciBhbmQgc2V0dGluZyBjb25kaXRpb24KKyAgICAgICAgICAgICAqIGNvZGVzIHdlIGNhbm5vdCByZW1vdmUgdGhlIGluc3RydWN0aW9uLiAgUHJldmVudCByZW1vdmFsCisgICAgICAgICAgICAgKiBieSBzZXR0aW5nIHRoZSAncmVhZCcgZmxhZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGVtcFJlYWRbaW5kZXhdWzBdID0gR0xfVFJVRTsKKyAgICAgICAgICAgIHRlbXBSZWFkW2luZGV4XVsxXSA9IEdMX1RSVUU7CisgICAgICAgICAgICB0ZW1wUmVhZFtpbmRleF1bMl0gPSBHTF9UUlVFOworICAgICAgICAgICAgdGVtcFJlYWRbaW5kZXhdWzNdID0gR0xfVFJVRTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogZmluZCBpbnN0cnVjdGlvbnMgdGhhdCB3cml0ZSB0byBkZWFkIHJlZ2lzdGVycywgZmxhZyBmb3IgcmVtb3ZhbCAqLworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBjb25zdCBHTHVpbnQgbnVtRHN0ID0gX21lc2FfbnVtX2luc3RfZHN0X3JlZ3MoaW5zdC0+T3Bjb2RlKTsKKworICAgICAgaWYgKG51bURzdCAhPSAwICYmIGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZKSB7CisgICAgICAgICBHTGludCBjaGFuLCBpbmRleCA9IGluc3QtPkRzdFJlZy5JbmRleDsKKworCSBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgNDsgY2hhbisrKSB7CisJICAgIGlmICghdGVtcFJlYWRbaW5kZXhdW2NoYW5dICYmCisJCWluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJiAoMSA8PCBjaGFuKSkgeworCSAgICAgICBpZiAoZGJnKSB7CisJCSAgcHJpbnRmKCJSZW1vdmUgd3JpdGVtYXNrIG9uICV1LiVjXG4iLCBpLAorCQkJICAgICAgIGNoYW4gPT0gMyA/ICd3JyA6ICd4JyArIGNoYW4pOworCSAgICAgICB9CisJICAgICAgIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgJj0gfigxIDw8IGNoYW4pOworCSAgICAgICByZW0rKzsKKwkgICAgfQorCSB9CisKKwkgaWYgKGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgPT0gMCkgeworCSAgICAvKiBJZiB3ZSBjbGVhcmVkIGFsbCB3cml0ZXMsIHRoZSBpbnN0cnVjdGlvbiBjYW4gYmUgcmVtb3ZlZC4gKi8KKwkgICAgaWYgKGRiZykKKwkgICAgICAgcHJpbnRmKCJSZW1vdmUgaW5zdHJ1Y3Rpb24gJXU6IFxuIiwgaSk7CisJICAgIHJlbW92ZUluc3RbaV0gPSBHTF9UUlVFOworCSB9CisgICAgICB9CisgICB9CisKKyAgIC8qIG5vdyByZW1vdmUgdGhlIGluc3RydWN0aW9ucyB3aGljaCBhcmVuJ3QgbmVlZGVkICovCisgICByZW0gPSByZW1vdmVfaW5zdHJ1Y3Rpb25zKHByb2csIHJlbW92ZUluc3QpOworCisgICBpZiAoZGJnKSB7CisgICAgICBwcmludGYoIk9wdGltaXplOiBFbmQgZGVhZCBjb2RlIHJlbW92YWwuXG4iKTsKKyAgICAgIHByaW50ZigiICAldSBjaGFubmVsIHdyaXRlcyByZW1vdmVkXG4iLCByZW0pOworICAgICAgcHJpbnRmKCIgICV1IGluc3RydWN0aW9ucyByZW1vdmVkXG4iLCByZW0pOworICAgICAgLypfbWVzYV9wcmludF9wcm9ncmFtKHByb2cpOyovCisgICB9CisKK2RvbmU6CisgICBmcmVlKHJlbW92ZUluc3QpOworICAgcmV0dXJuIHJlbSAhPSAwOworfQorCisKK2VudW0gaW5zdF91c2UKK3sKKyAgIFJFQUQsCisgICBXUklURSwKKyAgIEZMT1csCisgICBFTkQKK307CisKKworLyoqCisgKiBTY2FuIGZvcndhcmQgaW4gcHJvZ3JhbSBmcm9tICdzdGFydCcgZm9yIHRoZSBuZXh0IG9jY3VycmVuY2VzIG9mIFRFTVBbaW5kZXhdLgorICogV2UgbG9vayBpZiBhbiBpbnN0cnVjdGlvbiByZWFkcyB0aGUgY29tcG9uZW50IGdpdmVuIGJ5IHRoZSBtYXNrcyBhbmQgaWYgdGhleQorICogYXJlIG92ZXJ3cml0dGVuLgorICogUmV0dXJuIFJFQUQsIFdSSVRFLCBGTE9XIG9yIEVORCB0byBpbmRpY2F0ZSB0aGUgbmV4dCB1c2FnZSBvciBhbiBpbmRpY2F0b3IKKyAqIHRoYXQgd2UgY2FuJ3QgbG9vayBmdXJ0aGVyLgorICovCitzdGF0aWMgZW51bSBpbnN0X3VzZQorZmluZF9uZXh0X3VzZShjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgR0x1aW50IHN0YXJ0LAorICAgICAgICAgICAgICBHTHVpbnQgaW5kZXgsCisgICAgICAgICAgICAgIEdMdWludCBtYXNrKQoreworICAgR0x1aW50IGk7CisKKyAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOyBpKyspIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gcHJvZy0+SW5zdHJ1Y3Rpb25zICsgaTsKKyAgICAgIHN3aXRjaCAoaW5zdC0+T3Bjb2RlKSB7CisgICAgICBjYXNlIE9QQ09ERV9CR05MT09QOgorICAgICAgY2FzZSBPUENPREVfQkdOU1VCOgorICAgICAgY2FzZSBPUENPREVfQ0FMOgorICAgICAgY2FzZSBPUENPREVfQ09OVDoKKyAgICAgIGNhc2UgT1BDT0RFX0lGOgorICAgICAgY2FzZSBPUENPREVfRUxTRToKKyAgICAgIGNhc2UgT1BDT0RFX0VORElGOgorICAgICAgY2FzZSBPUENPREVfRU5ETE9PUDoKKyAgICAgIGNhc2UgT1BDT0RFX0VORFNVQjoKKyAgICAgIGNhc2UgT1BDT0RFX1JFVDoKKyAgICAgICAgIHJldHVybiBGTE9XOworICAgICAgY2FzZSBPUENPREVfRU5EOgorICAgICAgICAgcmV0dXJuIEVORDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBHTHVpbnQgbnVtU3JjID0gX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsKKyAgICAgICAgICAgIEdMdWludCBqOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVNyYzsgaisrKSB7CisgICAgICAgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLlJlbEFkZHIgfHwKKyAgICAgICAgICAgICAgICAgICAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgJiYKKyAgICAgICAgICAgICAgICAgICBpbnN0LT5TcmNSZWdbal0uSW5kZXggPT0gaW5kZXggJiYKKyAgICAgICAgICAgICAgICAgICAoZ2V0X3NyY19hcmdfbWFzayhpbnN0LGosTk9fTUFTSykgJiBtYXNrKSkpCisgICAgICAgICAgICAgICAgICByZXR1cm4gUkVBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfbWVzYV9udW1faW5zdF9kc3RfcmVncyhpbnN0LT5PcGNvZGUpID09IDEgJiYKKyAgICAgICAgICAgICAgICBpbnN0LT5Ec3RSZWcuRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSAmJgorICAgICAgICAgICAgICAgIGluc3QtPkRzdFJlZy5JbmRleCA9PSBpbmRleCkgeworICAgICAgICAgICAgICAgbWFzayAmPSB+aW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICAgICAgICAgICAgIGlmIChtYXNrID09IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4gV1JJVEU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICByZXR1cm4gRU5EOworfQorCisKKy8qKgorICogSXMgdGhlIGdpdmVuIGluc3RydWN0aW9uIG9wY29kZSBhIGZsb3ctY29udHJvbCBvcGNvZGU/CisgKiBYWFggbWF5YmUgbW92ZSB0aGlzIGludG8gcHJvZ19pbnN0cnVjdGlvbi5bY2hdCisgKi8KK3N0YXRpYyBHTGJvb2xlYW4KK19tZXNhX2lzX2Zsb3dfY29udHJvbF9vcGNvZGUoZW51bSBwcm9nX29wY29kZSBvcGNvZGUpCit7CisgICBzd2l0Y2ggKG9wY29kZSkgeworICAgY2FzZSBPUENPREVfQkdOTE9PUDoKKyAgIGNhc2UgT1BDT0RFX0JHTlNVQjoKKyAgIGNhc2UgT1BDT0RFX0NBTDoKKyAgIGNhc2UgT1BDT0RFX0NPTlQ6CisgICBjYXNlIE9QQ09ERV9JRjoKKyAgIGNhc2UgT1BDT0RFX0VMU0U6CisgICBjYXNlIE9QQ09ERV9FTkQ6CisgICBjYXNlIE9QQ09ERV9FTkRJRjoKKyAgIGNhc2UgT1BDT0RFX0VORExPT1A6CisgICBjYXNlIE9QQ09ERV9FTkRTVUI6CisgICBjYXNlIE9QQ09ERV9SRVQ6CisgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9Cit9CisKKworLyoqCisgKiBUZXN0IGlmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBpcyBhIHNpbXBsZSBNT1YgKG5vIGNvbmRpdGlvbmFsIHVwZGF0aW5nLAorICogbm90IHJlbGF0aXZlIGFkZHJlc3NpbmcsIG5vIG5lZ2F0aW9uL2FicywgZXRjKS4KKyAqLworc3RhdGljIEdMYm9vbGVhbgorY2FuX2Rvd253YXJkX21vdl9iZV9tb2RpZmVkKGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICptb3YpCit7CisgICByZXR1cm4KKyAgICAgIG1vdi0+T3Bjb2RlID09IE9QQ09ERV9NT1YgJiYKKyAgICAgIG1vdi0+Q29uZFVwZGF0ZSA9PSBHTF9GQUxTRSAmJgorICAgICAgbW92LT5TcmNSZWdbMF0uUmVsQWRkciA9PSAwICYmCisgICAgICBtb3YtPlNyY1JlZ1swXS5OZWdhdGUgPT0gMCAmJgorICAgICAgbW92LT5TcmNSZWdbMF0uQWJzID09IDAgJiYKKyAgICAgIG1vdi0+U3JjUmVnWzBdLkhhc0luZGV4MiA9PSAwICYmCisgICAgICBtb3YtPlNyY1JlZ1swXS5SZWxBZGRyMiA9PSAwICYmCisgICAgICBtb3YtPkRzdFJlZy5SZWxBZGRyID09IDAgJiYKKyAgICAgIG1vdi0+RHN0UmVnLkNvbmRNYXNrID09IENPTkRfVFI7Cit9CisKKworc3RhdGljIEdMYm9vbGVhbgorY2FuX3Vwd2FyZF9tb3ZfYmVfbW9kaWZlZChjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqbW92KQoreworICAgcmV0dXJuCisgICAgICBjYW5fZG93bndhcmRfbW92X2JlX21vZGlmZWQobW92KSAmJgorICAgICAgbW92LT5Ec3RSZWcuRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSAmJgorICAgICAgbW92LT5TYXR1cmF0ZU1vZGUgPT0gU0FUVVJBVEVfT0ZGOworfQorCisKKy8qKgorICogVHJ5IHRvIHJlbW92ZSB1c2Ugb2YgZXh0cmFuZW91cyBNT1YgaW5zdHJ1Y3Rpb25zLCB0byBmcmVlIHRoZW0gdXAgZm9yIGRlYWQKKyAqIGNvZGUgcmVtb3ZhbC4KKyAqLworc3RhdGljIHZvaWQKK19tZXNhX3JlbW92ZV9leHRyYV9tb3ZlX3VzZShzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIEdMdWludCBpLCBqOworCisgICBpZiAoZGJnKSB7CisgICAgICBwcmludGYoIk9wdGltaXplOiBCZWdpbiByZW1vdmUgZXh0cmEgbW92ZSB1c2VcbiIpOworICAgICAgX21lc2FfcHJpbnRfcHJvZ3JhbShwcm9nKTsKKyAgIH0KKworICAgLyoKKyAgICAqIExvb2sgZm9yIHNlcXVlbmNlcyBzdWNoIGFzIHRoaXM6CisgICAgKiAgICBNT1YgdG1wWCwgYXJnMDsKKyAgICAqICAgIC4uLgorICAgICogICAgRk9PIHRtcFksIHRtcFgsIGFyZzE7CisgICAgKiBhbmQgY29udmVydCBpbnRvOgorICAgICogICAgTU9WIHRtcFgsIGFyZzA7CisgICAgKiAgICAuLi4KKyAgICAqICAgIEZPTyB0bXBZLCBhcmcwLCBhcmcxOworICAgICovCisKKyAgIGZvciAoaSA9IDA7IGkgKyAxIDwgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOyBpKyspIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICptb3YgPSBwcm9nLT5JbnN0cnVjdGlvbnMgKyBpOworICAgICAgR0x1aW50IGRzdF9tYXNrLCBzcmNfbWFzazsKKyAgICAgIGlmIChjYW5fdXB3YXJkX21vdl9iZV9tb2RpZmVkKG1vdikgPT0gR0xfRkFMU0UpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogU2Nhbm5pbmcgdGhlIGNvZGUsIHdlIG1haW50YWluIHRoZSBjb21wb25lbnRzIHdoaWNoIGFyZSBzdGlsbCBhY3RpdmUgaW4KKyAgICAgICAqIHRoZXNlIHR3byBtYXNrcworICAgICAgICovCisgICAgICBkc3RfbWFzayA9IG1vdi0+RHN0UmVnLldyaXRlTWFzazsKKyAgICAgIHNyY19tYXNrID0gZ2V0X3NyY19hcmdfbWFzayhtb3YsIDAsIE5PX01BU0spOworCisgICAgICAvKiBXYWxrIHRocm91Z2ggcmVtYWluaW5nIGluc3RydWN0aW9ucyB1bnRpbCB0aGUgb3Igc3JjIHJlZyBnZXRzCisgICAgICAgKiByZXdyaXR0ZW4gb3Igd2UgZ2V0IGludG8gc29tZSBmbG93LWNvbnRyb2wsIGVsaW1pbmF0aW5nIHRoZSB1c2Ugb2YKKyAgICAgICAqIHRoaXMgTU9WLgorICAgICAgICovCisgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaisrKSB7CisJIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0MiA9IHByb2ctPkluc3RydWN0aW9ucyArIGo7CisgICAgICAgICBHTHVpbnQgYXJnOworCisJIGlmIChfbWVzYV9pc19mbG93X2NvbnRyb2xfb3Bjb2RlKGluc3QyLT5PcGNvZGUpKQorCSAgICAgYnJlYWs7CisKKwkgLyogRmlyc3QgcmV3cml0ZSB0aGlzIGluc3RydWN0aW9uJ3MgYXJncyBpZiBhcHByb3ByaWF0ZS4gKi8KKwkgZm9yIChhcmcgPSAwOyBhcmcgPCBfbWVzYV9udW1faW5zdF9zcmNfcmVncyhpbnN0Mi0+T3Bjb2RlKTsgYXJnKyspIHsKKwkgICAgR0x1aW50IGNvbXAsIHJlYWRfbWFzazsKKworCSAgICBpZiAoaW5zdDItPlNyY1JlZ1thcmddLkZpbGUgIT0gbW92LT5Ec3RSZWcuRmlsZSB8fAorCQlpbnN0Mi0+U3JjUmVnW2FyZ10uSW5kZXggIT0gbW92LT5Ec3RSZWcuSW5kZXggfHwKKwkJaW5zdDItPlNyY1JlZ1thcmddLlJlbEFkZHIgfHwKKwkJaW5zdDItPlNyY1JlZ1thcmddLkFicykKKwkgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZWFkX21hc2sgPSBnZXRfc3JjX2FyZ19tYXNrKGluc3QyLCBhcmcsIE5PX01BU0spOworCisJICAgIC8qIEFkanVzdCB0aGUgc3dpenpsZXMgb2YgaW5zdDIgdG8gcG9pbnQgYXQgTU9WJ3Mgc291cmNlIGlmIEFMTCB0aGUKKyAgICAgICAgICAgICAqIGNvbXBvbmVudHMgcmVhZCBzdGlsbCBjb21lIGZyb20gdGhlIG1vdiBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGlzX3N3aXp6bGVfcmVndWxhcihpbnN0Mi0+U3JjUmVnW2FyZ10uU3dpenpsZSkgJiYKKyAgICAgICAgICAgICAgIChyZWFkX21hc2sgJiBkc3RfbWFzaykgPT0gcmVhZF9tYXNrKSB7CisgICAgICAgICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNDsgY29tcCsrKSB7CisgICAgICAgICAgICAgICAgICBjb25zdCBHTHVpbnQgaW5zdDJfc3d6ID0KKyAgICAgICAgICAgICAgICAgICAgIEdFVF9TV1ooaW5zdDItPlNyY1JlZ1thcmddLlN3aXp6bGUsIGNvbXApOworICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50IHMgPSBHRVRfU1daKG1vdi0+U3JjUmVnWzBdLlN3aXp6bGUsIGluc3QyX3N3eik7CisgICAgICAgICAgICAgICAgICBpbnN0Mi0+U3JjUmVnW2FyZ10uU3dpenpsZSAmPSB+KDcgPDwgKDMgKiBjb21wKSk7CisgICAgICAgICAgICAgICAgICBpbnN0Mi0+U3JjUmVnW2FyZ10uU3dpenpsZSB8PSBzIDw8ICgzICogY29tcCk7CisgICAgICAgICAgICAgICAgICBpbnN0Mi0+U3JjUmVnW2FyZ10uTmVnYXRlIF49ICgoKG1vdi0+U3JjUmVnWzBdLk5lZ2F0ZSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0Ml9zd3opICYgMHgxKSA8PCBjb21wKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGluc3QyLT5TcmNSZWdbYXJnXS5GaWxlID0gbW92LT5TcmNSZWdbMF0uRmlsZTsKKyAgICAgICAgICAgICAgIGluc3QyLT5TcmNSZWdbYXJnXS5JbmRleCA9IG1vdi0+U3JjUmVnWzBdLkluZGV4OworICAgICAgICAgICAgfQorCSB9CisKKwkgLyogVGhlIHNvdXJjZSBvZiBNT1YgaXMgd3JpdHRlbi4gVGhpcyBwb3RlbnRpYWxseSBkZWFjdGl2YXRlcyBzb21lCisgICAgICAgICAgKiBjb21wb25lbnRzIGZyb20gdGhlIHNyYyBhbmQgZHN0IG9mIHRoZSBNT1YgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAqLworCSBpZiAoaW5zdDItPkRzdFJlZy5GaWxlID09IG1vdi0+RHN0UmVnLkZpbGUgJiYKKwkgICAgIChpbnN0Mi0+RHN0UmVnLlJlbEFkZHIgfHwKKwkgICAgICBpbnN0Mi0+RHN0UmVnLkluZGV4ID09IG1vdi0+RHN0UmVnLkluZGV4KSkgeworICAgICAgICAgICAgZHN0X21hc2sgJj0gfmluc3QyLT5Ec3RSZWcuV3JpdGVNYXNrOworICAgICAgICAgICAgc3JjX21hc2sgPSBnZXRfc3JjX2FyZ19tYXNrKG1vdiwgMCwgZHN0X21hc2spOworICAgICAgICAgfQorCisgICAgICAgICAvKiBJZGVtIHdoZW4gdGhlIGRlc3RpbmF0aW9uIG9mIG1vdiBpcyB3cml0dGVuICovCisJIGlmIChpbnN0Mi0+RHN0UmVnLkZpbGUgPT0gbW92LT5TcmNSZWdbMF0uRmlsZSAmJgorCSAgICAgKGluc3QyLT5Ec3RSZWcuUmVsQWRkciB8fAorCSAgICAgIGluc3QyLT5Ec3RSZWcuSW5kZXggPT0gbW92LT5TcmNSZWdbMF0uSW5kZXgpKSB7CisgICAgICAgICAgICBzcmNfbWFzayAmPSB+aW5zdDItPkRzdFJlZy5Xcml0ZU1hc2s7CisgICAgICAgICAgICBkc3RfbWFzayAmPSBnZXRfZHN0X21hc2tfZm9yX21vdihtb3YsIHNyY19tYXNrKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChkc3RfbWFzayA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGlmIChkYmcpIHsKKyAgICAgIHByaW50ZigiT3B0aW1pemU6IEVuZCByZW1vdmUgZXh0cmEgbW92ZSB1c2UuXG4iKTsKKyAgICAgIC8qX21lc2FfcHJpbnRfcHJvZ3JhbShwcm9nKTsqLworICAgfQorfQorCisKKy8qKgorICogQ29tcGxlbWVudHMgZGVhZF9jb2RlX2dsb2JhbC4gVHJ5IHRvIHJlbW92ZSBjb2RlIGluIGJsb2NrIG9mIGNvZGUgYnkKKyAqIGNhcmVmdWxseSBtb25pdG9yaW5nIHRoZSBzd2l6emxlcy4gQm90aCBmdW5jdGlvbnMgc2hvdWxkIGJlIG1lcmdlZCBpbnRvIG9uZQorICogd2l0aCBhIHByb3BlciBjb250cm9sIGZsb3cgZ3JhcGgKKyAqLworc3RhdGljIEdMYm9vbGVhbgorX21lc2FfcmVtb3ZlX2RlYWRfY29kZV9sb2NhbChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIEdMYm9vbGVhbiAqcmVtb3ZlSW5zdDsKKyAgIEdMdWludCBpLCBhcmcsIHJlbSA9IDA7CisKKyAgIHJlbW92ZUluc3QgPQorICAgICAgY2FsbG9jKDEsIHByb2ctPk51bUluc3RydWN0aW9ucyAqIHNpemVvZihHTGJvb2xlYW4pKTsKKworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBjb25zdCBHTHVpbnQgaW5kZXggPSBpbnN0LT5Ec3RSZWcuSW5kZXg7CisgICAgICBjb25zdCBHTHVpbnQgbWFzayA9IGluc3QtPkRzdFJlZy5Xcml0ZU1hc2s7CisgICAgICBlbnVtIGluc3RfdXNlIHVzZTsKKworICAgICAgLyogV2UgbXVzdCBkZWFjdGl2YXRlIHRoZSBwYXNzIGFzIHNvb24gYXMgc29tZSBpbmRpcmVjdGlvbiBpcyB1c2VkICovCisgICAgICBpZiAoaW5zdC0+RHN0UmVnLlJlbEFkZHIpCisgICAgICAgICBnb3RvIGRvbmU7CisgICAgICBmb3IgKGFyZyA9IDA7IGFyZyA8IF9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3QtPk9wY29kZSk7IGFyZysrKQorICAgICAgICAgaWYgKGluc3QtPlNyY1JlZ1thcmddLlJlbEFkZHIpCisgICAgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgIGlmIChfbWVzYV9pc19mbG93X2NvbnRyb2xfb3Bjb2RlKGluc3QtPk9wY29kZSkgfHwKKyAgICAgICAgICBfbWVzYV9udW1faW5zdF9kc3RfcmVncyhpbnN0LT5PcGNvZGUpID09IDAgfHwKKyAgICAgICAgICBpbnN0LT5Ec3RSZWcuRmlsZSAhPSBQUk9HUkFNX1RFTVBPUkFSWSB8fAorICAgICAgICAgIGluc3QtPkRzdFJlZy5SZWxBZGRyKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIHVzZSA9IGZpbmRfbmV4dF91c2UocHJvZywgaSsxLCBpbmRleCwgbWFzayk7CisgICAgICBpZiAodXNlID09IFdSSVRFIHx8IHVzZSA9PSBFTkQpCisgICAgICAgICByZW1vdmVJbnN0W2ldID0gR0xfVFJVRTsKKyAgIH0KKworICAgcmVtID0gcmVtb3ZlX2luc3RydWN0aW9ucyhwcm9nLCByZW1vdmVJbnN0KTsKKworZG9uZToKKyAgIGZyZWUocmVtb3ZlSW5zdCk7CisgICByZXR1cm4gcmVtICE9IDA7Cit9CisKKworLyoqCisgKiBUcnkgdG8gaW5qZWN0IHRoZSBkZXN0aW5hdGlvbiBvZiBtb3YgYXMgdGhlIGRlc3RpbmF0aW9uIG9mIGluc3QgYW5kIHJlY29tcHV0ZQorICogdGhlIHN3aXp6bGVzIG9wZXJhdG9ycyBmb3IgdGhlIHNvdXJjZXMgb2YgaW5zdCBpZiByZXF1aXJlZC4gUmV0dXJuIEdMX1RSVUUKKyAqIG9mIHRoZSBzdWJzdGl0dXRpb24gd2FzIHBvc3NpYmxlLCBHTF9GQUxTRSBvdGhlcndpc2UKKyAqLworc3RhdGljIEdMYm9vbGVhbgorX21lc2FfbWVyZ2VfbW92X2ludG9faW5zdChzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKm1vdikKK3sKKyAgIC8qIEluZGlyZWN0aW9uIHRhYmxlIHdoaWNoIGFzc29jaWF0ZXMgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBjb21wb25lbnRzIGZvcgorICAgICogdGhlIG1vdiBpbnN0cnVjdGlvbgorICAgICovCisgICBjb25zdCBHTHVpbnQgbWFzayA9IGdldF9zcmNfYXJnX21hc2sobW92LCAwLCBOT19NQVNLKTsKKworICAgLyogU29tZSBjb21wb25lbnRzIGFyZSBub3Qgd3JpdHRlbiBieSBpbnN0LiBXZSBjYW5ub3QgcmVtb3ZlIHRoZSBtb3YgKi8KKyAgIGlmIChtYXNrICE9IChpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgbWFzaykpCisgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgIGluc3QtPlNhdHVyYXRlTW9kZSB8PSBtb3YtPlNhdHVyYXRlTW9kZTsKKworICAgLyogRGVwZW5kaW5nIG9uIHRoZSBpbnN0cnVjdGlvbiwgd2UgbWF5IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBzd2l6emxlcy4KKyAgICAqIEFsc28sIHNvbWUgb3RoZXIgaW5zdHJ1Y3Rpb25zIChsaWtlIFRFWCkgYXJlIG5vdCBsaW5lYXIuIFdlIHdpbGwgb25seQorICAgICogY29uc2lkZXIgY29tcGxldGVseSBhY3RpdmUgc291cmNlcyBhbmQgZGVzdGluYXRpb25zCisgICAgKi8KKyAgIHN3aXRjaCAoaW5zdC0+T3Bjb2RlKSB7CisKKyAgIC8qIENhcnN0ZXNpYW4gaW5zdHJ1Y3Rpb25zOiB3ZSBjb21wdXRlIHRoZSBzd2l6emxlICovCisgICBjYXNlIE9QQ09ERV9NT1Y6CisgICBjYXNlIE9QQ09ERV9NSU46CisgICBjYXNlIE9QQ09ERV9NQVg6CisgICBjYXNlIE9QQ09ERV9BQlM6CisgICBjYXNlIE9QQ09ERV9BREQ6CisgICBjYXNlIE9QQ09ERV9NQUQ6CisgICBjYXNlIE9QQ09ERV9NVUw6CisgICBjYXNlIE9QQ09ERV9TVUI6CisgICB7CisgICAgICBHTHVpbnQgZHN0X3RvX3NyY19jb21wWzRdID0gezAsMCwwLDB9OworICAgICAgR0x1aW50IGRzdF9jb21wLCBhcmc7CisgICAgICBmb3IgKGRzdF9jb21wID0gMDsgZHN0X2NvbXAgPCA0OyArK2RzdF9jb21wKSB7CisgICAgICAgICBpZiAobW92LT5Ec3RSZWcuV3JpdGVNYXNrICYgKDEgPDwgZHN0X2NvbXApKSB7CisgICAgICAgICAgICBjb25zdCBHTHVpbnQgc3JjX2NvbXAgPSBHRVRfU1daKG1vdi0+U3JjUmVnWzBdLlN3aXp6bGUsIGRzdF9jb21wKTsKKyAgICAgICAgICAgIEFTU0VSVChzcmNfY29tcCA8IDQpOworICAgICAgICAgICAgZHN0X3RvX3NyY19jb21wW2RzdF9jb21wXSA9IHNyY19jb21wOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBQYXRjaCBlYWNoIHNvdXJjZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIGZvciAoYXJnID0gMDsgYXJnIDwgX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsgYXJnKyspIHsKKyAgICAgICAgIGNvbnN0IEdMdWludCBhcmdfc3d6ID0gaW5zdC0+U3JjUmVnW2FyZ10uU3dpenpsZTsKKyAgICAgICAgIGluc3QtPlNyY1JlZ1thcmddLlN3aXp6bGUgPSAwOworCisgICAgICAgICAvKiBSZXNldCBlYWNoIGFjdGl2ZSBjb21wb25lbnQgb2YgdGhlIHN3aXp6bGUgKi8KKyAgICAgICAgIGZvciAoZHN0X2NvbXAgPSAwOyBkc3RfY29tcCA8IDQ7ICsrZHN0X2NvbXApIHsKKyAgICAgICAgICAgIEdMdWludCBzcmNfY29tcCwgYXJnX2NvbXA7CisgICAgICAgICAgICBpZiAoKG1vdi0+RHN0UmVnLldyaXRlTWFzayAmICgxIDw8IGRzdF9jb21wKSkgPT0gMCkKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgc3JjX2NvbXAgPSBkc3RfdG9fc3JjX2NvbXBbZHN0X2NvbXBdOworICAgICAgICAgICAgQVNTRVJUKHNyY19jb21wIDwgNCk7CisgICAgICAgICAgICBhcmdfY29tcCA9IEdFVF9TV1ooYXJnX3N3eiwgc3JjX2NvbXApOworICAgICAgICAgICAgQVNTRVJUKGFyZ19jb21wIDwgNCk7CisgICAgICAgICAgICBpbnN0LT5TcmNSZWdbYXJnXS5Td2l6emxlIHw9IGFyZ19jb21wIDw8ICgzKmRzdF9jb21wKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluc3QtPkRzdFJlZyA9IG1vdi0+RHN0UmVnOworICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9CisKKyAgIC8qIERvdCBwcm9kdWN0cyBhbmQgc2NhbGFyIGluc3RydWN0aW9uczogd2Ugb25seSBjaGFuZ2UgdGhlIGRlc3RpbmF0aW9uICovCisgICBjYXNlIE9QQ09ERV9SQ1A6CisgICBjYXNlIE9QQ09ERV9TSU46CisgICBjYXNlIE9QQ09ERV9DT1M6CisgICBjYXNlIE9QQ09ERV9SU1E6CisgICBjYXNlIE9QQ09ERV9QT1c6CisgICBjYXNlIE9QQ09ERV9FWDI6CisgICBjYXNlIE9QQ09ERV9MT0c6CisgICBjYXNlIE9QQ09ERV9EUDI6CisgICBjYXNlIE9QQ09ERV9EUDM6CisgICBjYXNlIE9QQ09ERV9EUDQ6CisgICAgICBpbnN0LT5Ec3RSZWcgPSBtb3YtPkRzdFJlZzsKKyAgICAgIHJldHVybiBHTF9UUlVFOworCisgICAvKiBBbGwgb3RoZXIgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgZnVsbHkgYWN0aXZlIGNvbXBvbmVudHMgd2l0aCBubyBzd2l6emxlICovCisgICBkZWZhdWx0OgorICAgICAgaWYgKG1vdi0+U3JjUmVnWzBdLlN3aXp6bGUgIT0gU1dJWlpMRV9YWVpXIHx8CisgICAgICAgICAgaW5zdC0+RHN0UmVnLldyaXRlTWFzayAhPSBXUklURU1BU0tfWFlaVykKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIGluc3QtPkRzdFJlZyA9IG1vdi0+RHN0UmVnOworICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICB9Cit9CisKKworLyoqCisgKiBUcnkgdG8gcmVtb3ZlIGV4dHJhbmVvdXMgTU9WIGluc3RydWN0aW9ucyBmcm9tIHRoZSBnaXZlbiBwcm9ncmFtLgorICovCitzdGF0aWMgR0xib29sZWFuCitfbWVzYV9yZW1vdmVfZXh0cmFfbW92ZXMoc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICBHTGJvb2xlYW4gKnJlbW92ZUluc3Q7IC8qIHBlci1pbnN0cnVjdGlvbiByZW1vdmFsIGZsYWcgKi8KKyAgIEdMdWludCBpLCByZW0gPSAwLCBuZXN0aW5nID0gMDsKKworICAgaWYgKGRiZykgeworICAgICAgcHJpbnRmKCJPcHRpbWl6ZTogQmVnaW4gcmVtb3ZlIGV4dHJhIG1vdmVzXG4iKTsKKyAgICAgIF9tZXNhX3ByaW50X3Byb2dyYW0ocHJvZyk7CisgICB9CisKKyAgIHJlbW92ZUluc3QgPQorICAgICAgY2FsbG9jKDEsIHByb2ctPk51bUluc3RydWN0aW9ucyAqIHNpemVvZihHTGJvb2xlYW4pKTsKKworICAgLyoKKyAgICAqIExvb2sgZm9yIHNlcXVlbmNlcyBzdWNoIGFzIHRoaXM6CisgICAgKiAgICBGT08gdG1wWCwgYXJnMCwgYXJnMTsKKyAgICAqICAgIE1PViB0bXBZLCB0bXBYOworICAgICogYW5kIGNvbnZlcnQgaW50bzoKKyAgICAqICAgIEZPTyB0bXBZLCBhcmcwLCBhcmcxOworICAgICovCisKKyAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLT5OdW1JbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKm1vdiA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisKKyAgICAgIHN3aXRjaCAobW92LT5PcGNvZGUpIHsKKyAgICAgIGNhc2UgT1BDT0RFX0JHTkxPT1A6CisgICAgICBjYXNlIE9QQ09ERV9CR05TVUI6CisgICAgICBjYXNlIE9QQ09ERV9JRjoKKyAgICAgICAgIG5lc3RpbmcrKzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENPREVfRU5ETE9PUDoKKyAgICAgIGNhc2UgT1BDT0RFX0VORFNVQjoKKyAgICAgIGNhc2UgT1BDT0RFX0VORElGOgorICAgICAgICAgbmVzdGluZy0tOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9QQ09ERV9NT1Y6CisgICAgICAgICBpZiAoaSA+IDAgJiYKKyAgICAgICAgICAgICBjYW5fZG93bndhcmRfbW92X2JlX21vZGlmZWQobW92KSAmJgorICAgICAgICAgICAgIG1vdi0+U3JjUmVnWzBdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkgJiYKKyAgICAgICAgICAgICBuZXN0aW5nID09IDApCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qIHNlZSBpZiB0aGlzIE1PViBjYW4gYmUgcmVtb3ZlZCAqLworICAgICAgICAgICAgY29uc3QgR0x1aW50IGlkID0gbW92LT5TcmNSZWdbMF0uSW5kZXg7CisgICAgICAgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqcHJldkluc3Q7CisgICAgICAgICAgICBHTHVpbnQgcHJldkk7CisKKyAgICAgICAgICAgIC8qIGdldCBwb2ludGVyIHRvIHByZXZpb3VzIGluc3RydWN0aW9uICovCisgICAgICAgICAgICBwcmV2SSA9IGkgLSAxOworICAgICAgICAgICAgd2hpbGUgKHByZXZJID4gMCAmJiByZW1vdmVJbnN0W3ByZXZJXSkKKyAgICAgICAgICAgICAgIHByZXZJLS07CisgICAgICAgICAgICBwcmV2SW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIHByZXZJOworCisgICAgICAgICAgICBpZiAocHJldkluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZICYmCisgICAgICAgICAgICAgICAgcHJldkluc3QtPkRzdFJlZy5JbmRleCA9PSBpZCAmJgorICAgICAgICAgICAgICAgIHByZXZJbnN0LT5Ec3RSZWcuUmVsQWRkciA9PSAwICYmCisgICAgICAgICAgICAgICAgcHJldkluc3QtPkRzdFJlZy5Db25kTWFzayA9PSBDT05EX1RSKSB7CisKKyAgICAgICAgICAgICAgIGNvbnN0IEdMdWludCBkc3RfbWFzayA9IHByZXZJbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgICAgICAgICAgICAgZW51bSBpbnN0X3VzZSBuZXh0X3VzZSA9IGZpbmRfbmV4dF91c2UocHJvZywgaSsxLCBpZCwgZHN0X21hc2spOworCisgICAgICAgICAgICAgICBpZiAobmV4dF91c2UgPT0gV1JJVEUgfHwgbmV4dF91c2UgPT0gRU5EKSB7CisgICAgICAgICAgICAgICAgICAvKiBPSywgd2UgY2FuIHNhZmVseSByZW1vdmUgdGhpcyBNT1YgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgICAgICAgICAgKiBUcmFuc2Zvcm06CisgICAgICAgICAgICAgICAgICAgKiAgIHByZXZJOiBGT08gdGVtcEluZGV4LCB4LCB5OworICAgICAgICAgICAgICAgICAgICogICAgICAgaTogTU9WIHosIHRlbXBJbmRleDsKKyAgICAgICAgICAgICAgICAgICAqIEludG86CisgICAgICAgICAgICAgICAgICAgKiAgIHByZXZJOiBGT08geiwgeCwgeTsKKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKF9tZXNhX21lcmdlX21vdl9pbnRvX2luc3QocHJldkluc3QsIG1vdikpIHsKKyAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluc3RbaV0gPSBHTF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgaWYgKGRiZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZW1vdmUgTU9WIGF0ICV1XG4iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigibmV3IHByZXYgaW5zdCAldTogIiwgcHJldkkpOworICAgICAgICAgICAgICAgICAgICAgICAgX21lc2FfcHJpbnRfaW5zdHJ1Y3Rpb24ocHJldkluc3QpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgOyAvKiBub3RoaW5nICovCisgICAgICB9CisgICB9CisKKyAgIC8qIG5vdyByZW1vdmUgdGhlIGluc3RydWN0aW9ucyB3aGljaCBhcmVuJ3QgbmVlZGVkICovCisgICByZW0gPSByZW1vdmVfaW5zdHJ1Y3Rpb25zKHByb2csIHJlbW92ZUluc3QpOworCisgICBmcmVlKHJlbW92ZUluc3QpOworCisgICBpZiAoZGJnKSB7CisgICAgICBwcmludGYoIk9wdGltaXplOiBFbmQgcmVtb3ZlIGV4dHJhIG1vdmVzLiAgJXUgaW5zdHJ1Y3Rpb25zIHJlbW92ZWRcbiIsIHJlbSk7CisgICAgICAvKl9tZXNhX3ByaW50X3Byb2dyYW0ocHJvZyk7Ki8KKyAgIH0KKworICAgcmV0dXJuIHJlbSAhPSAwOworfQorCisKKy8qKiBBIGxpdmUgcmVnaXN0ZXIgaW50ZXJ2YWwgKi8KK3N0cnVjdCBpbnRlcnZhbAoreworICAgR0x1aW50IFJlZzsgICAgICAgICAvKiogVGhlIHRlbXBvcmFyeSByZWdpc3RlciBpbmRleCAqLworICAgR0x1aW50IFN0YXJ0LCBFbmQ7ICAvKiogU3RhcnQvZW5kIGluc3RydWN0aW9uIG51bWJlcnMgKi8KK307CisKKworLyoqIEEgbGlzdCBvZiByZWdpc3RlciBpbnRlcnZhbHMgKi8KK3N0cnVjdCBpbnRlcnZhbF9saXN0Cit7CisgICBHTHVpbnQgTnVtOworICAgc3RydWN0IGludGVydmFsIEludGVydmFsc1tSRUdfQUxMT0NBVEVfTUFYX1BST0dSQU1fVEVNUFNdOworfTsKKworCitzdGF0aWMgdm9pZAorYXBwZW5kX2ludGVydmFsKHN0cnVjdCBpbnRlcnZhbF9saXN0ICpsaXN0LCBjb25zdCBzdHJ1Y3QgaW50ZXJ2YWwgKmludikKK3sKKyAgIGxpc3QtPkludGVydmFsc1tsaXN0LT5OdW0rK10gPSAqaW52OworfQorCisKKy8qKiBJbnNlcnQgaW50ZXJ2YWwgaW52IGludG8gbGlzdCwgc29ydGVkIGJ5IGludGVydmFsIGVuZCAqLworc3RhdGljIHZvaWQKK2luc2VydF9pbnRlcnZhbF9ieV9lbmQoc3RydWN0IGludGVydmFsX2xpc3QgKmxpc3QsIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCAqaW52KQoreworICAgLyogWFhYIHdlIGNvdWxkIGRvIGEgYmluYXJ5IHNlYXJjaCBpbnNlcnRpb24gaGVyZSBzaW5jZSBsaXN0IGlzIHNvcnRlZCAqLworICAgR0xpbnQgaSA9IGxpc3QtPk51bSAtIDE7CisgICB3aGlsZSAoaSA+PSAwICYmIGxpc3QtPkludGVydmFsc1tpXS5FbmQgPiBpbnYtPkVuZCkgeworICAgICAgbGlzdC0+SW50ZXJ2YWxzW2kgKyAxXSA9IGxpc3QtPkludGVydmFsc1tpXTsKKyAgICAgIGktLTsKKyAgIH0KKyAgIGxpc3QtPkludGVydmFsc1tpICsgMV0gPSAqaW52OworICAgbGlzdC0+TnVtKys7CisKKyNpZmRlZiBERUJVRworICAgeworICAgICAgR0x1aW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGxpc3QtPk51bTsgaSsrKSB7CisgICAgICAgICBBU1NFUlQobGlzdC0+SW50ZXJ2YWxzW2ldLkVuZCA8PSBsaXN0LT5JbnRlcnZhbHNbaSArIDFdLkVuZCk7CisgICAgICB9CisgICB9CisjZW5kaWYKK30KKworCisvKiogUmVtb3ZlIHRoZSBnaXZlbiBpbnRlcnZhbCBmcm9tIHRoZSBpbnRlcnZhbCBsaXN0ICovCitzdGF0aWMgdm9pZAorcmVtb3ZlX2ludGVydmFsKHN0cnVjdCBpbnRlcnZhbF9saXN0ICpsaXN0LCBjb25zdCBzdHJ1Y3QgaW50ZXJ2YWwgKmludikKK3sKKyAgIC8qIFhYWCB3ZSBjb3VsZCBiaW5hcnkgc2VhcmNoIHNpbmNlIGxpc3QgaXMgc29ydGVkICovCisgICBHTHVpbnQgazsKKyAgIGZvciAoayA9IDA7IGsgPCBsaXN0LT5OdW07IGsrKykgeworICAgICAgaWYgKGxpc3QtPkludGVydmFsc1trXS5SZWcgPT0gaW52LT5SZWcpIHsKKyAgICAgICAgIC8qIGZvdW5kLCByZW1vdmUgaXQgKi8KKyAgICAgICAgIEFTU0VSVChsaXN0LT5JbnRlcnZhbHNba10uU3RhcnQgPT0gaW52LT5TdGFydCk7CisgICAgICAgICBBU1NFUlQobGlzdC0+SW50ZXJ2YWxzW2tdLkVuZCA9PSBpbnYtPkVuZCk7CisgICAgICAgICB3aGlsZSAoayA8IGxpc3QtPk51bSAtIDEpIHsKKyAgICAgICAgICAgIGxpc3QtPkludGVydmFsc1trXSA9IGxpc3QtPkludGVydmFsc1trICsgMV07CisgICAgICAgICAgICBrKys7CisgICAgICAgICB9CisgICAgICAgICBsaXN0LT5OdW0tLTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIH0KK30KKworCisvKiogY2FsbGVkIGJ5IHFzb3J0KCkgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfc3RhcnQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCAqaWEgPSAoY29uc3Qgc3RydWN0IGludGVydmFsICopIGE7CisgICBjb25zdCBzdHJ1Y3QgaW50ZXJ2YWwgKmliID0gKGNvbnN0IHN0cnVjdCBpbnRlcnZhbCAqKSBiOworICAgaWYgKGlhLT5TdGFydCA8IGliLT5TdGFydCkKKyAgICAgIHJldHVybiAtMTsKKyAgIGVsc2UgaWYgKGlhLT5TdGFydCA+IGliLT5TdGFydCkKKyAgICAgIHJldHVybiArMTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAwOworfQorCisKKy8qKiBzb3J0IHRoZSBpbnRlcnZhbCBsaXN0IGFjY29yZGluZyB0byBpbnRlcnZhbCBzdGFydHMgKi8KK3N0YXRpYyB2b2lkCitzb3J0X2ludGVydmFsX2xpc3RfYnlfc3RhcnQoc3RydWN0IGludGVydmFsX2xpc3QgKmxpc3QpCit7CisgICBxc29ydChsaXN0LT5JbnRlcnZhbHMsIGxpc3QtPk51bSwgc2l6ZW9mKHN0cnVjdCBpbnRlcnZhbCksIGNvbXBhcmVfc3RhcnQpOworI2lmZGVmIERFQlVHCisgICB7CisgICAgICBHTHVpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbGlzdC0+TnVtOyBpKyspIHsKKyAgICAgICAgIEFTU0VSVChsaXN0LT5JbnRlcnZhbHNbaV0uU3RhcnQgPD0gbGlzdC0+SW50ZXJ2YWxzW2kgKyAxXS5TdGFydCk7CisgICAgICB9CisgICB9CisjZW5kaWYKK30KKworc3RydWN0IGxvb3BfaW5mbworeworICAgR0x1aW50IFN0YXJ0LCBFbmQ7ICAvKio8IFN0YXJ0LCBlbmQgaW5zdHJ1Y3Rpb25zIG9mIGxvb3AgKi8KK307CisKKy8qKgorICogVXBkYXRlIHRoZSBpbnRlcm1lZGlhdGUgaW50ZXJ2YWwgaW5mbyBmb3IgcmVnaXN0ZXIgJ2luZGV4JyBhbmQKKyAqIGluc3RydWN0aW9uICdpYycuCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfaW50ZXJ2YWwoR0xpbnQgaW50QmVnaW5bXSwgR0xpbnQgaW50RW5kW10sCisJCXN0cnVjdCBsb29wX2luZm8gKmxvb3BTdGFjaywgR0x1aW50IGxvb3BTdGFja0RlcHRoLAorCQlHTHVpbnQgaW5kZXgsIEdMdWludCBpYykKK3sKKyAgIGludCBpOworICAgR0x1aW50IGJlZ2luID0gaWM7CisgICBHTHVpbnQgZW5kID0gaWM7CisKKyAgIC8qIElmIHRoZSByZWdpc3RlciBpcyB1c2VkIGluIGEgbG9vcCwgZXh0ZW5kIGl0cyBsaWZldGltZSB0aHJvdWdoIHRoZSBlbmQKKyAgICAqIG9mIHRoZSBvdXRlcm1vc3QgbG9vcCB0aGF0IGRvZXNuJ3QgY29udGFpbiBpdHMgZGVmaW5pdGlvbi4KKyAgICAqLworICAgZm9yIChpID0gMDsgaSA8IGxvb3BTdGFja0RlcHRoOyBpKyspIHsKKyAgICAgIGlmIChpbnRCZWdpbltpbmRleF0gPCBsb29wU3RhY2tbaV0uU3RhcnQpIHsKKwkgZW5kID0gbG9vcFN0YWNrW2ldLkVuZDsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIC8qIFZhcmlhYmxlcyB0aGF0IGFyZSBsaXZlIGF0IHRoZSBlbmQgb2YgYSBsb29wIHdpbGwgYWxzbyBiZSBsaXZlIGF0IHRoZQorICAgICogYmVnaW5uaW5nLCBzbyBhbiBpbnN0cnVjdGlvbiBpbnNpZGUgb2YgYSBsb29wIHNob3VsZCBoYXZlIGl0cyBsaXZlCisgICAgKiBpbnRlcnZhbCBiZWdpbiBhdCB0aGUgc3RhcnQgb2YgdGhlIG91dGVybW9zdCBsb29wLgorICAgICovCisgICBpZiAobG9vcFN0YWNrRGVwdGggPiAwICYmIGljID4gbG9vcFN0YWNrWzBdLlN0YXJ0ICYmIGljIDwgbG9vcFN0YWNrWzBdLkVuZCkgeworICAgICAgYmVnaW4gPSBsb29wU3RhY2tbMF0uU3RhcnQ7CisgICB9CisKKyAgIEFTU0VSVChpbmRleCA8IFJFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QUyk7CisgICBpZiAoaW50QmVnaW5baW5kZXhdID09IC0xKSB7CisgICAgICBBU1NFUlQoaW50RW5kW2luZGV4XSA9PSAtMSk7CisgICAgICBpbnRCZWdpbltpbmRleF0gPSBiZWdpbjsKKyAgICAgIGludEVuZFtpbmRleF0gPSBlbmQ7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGludEVuZFtpbmRleF0gPSBlbmQ7CisgICB9Cit9CisKKworLyoqCisgKiBGaW5kIGZpcnN0L2xhc3QgaW5zdHJ1Y3Rpb24gdGhhdCByZWZlcmVuY2VzIGVhY2ggdGVtcG9yYXJ5IHJlZ2lzdGVyLgorICovCitHTGJvb2xlYW4KK19tZXNhX2ZpbmRfdGVtcF9pbnRlcnZhbHMoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG51bUluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW50QmVnaW5bUkVHX0FMTE9DQVRFX01BWF9QUk9HUkFNX1RFTVBTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW50RW5kW1JFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QU10pCit7CisgICBzdHJ1Y3QgbG9vcF9pbmZvIGxvb3BTdGFja1tNQVhfTE9PUF9ORVNUSU5HXTsKKyAgIEdMdWludCBsb29wU3RhY2tEZXB0aCA9IDA7CisgICBHTHVpbnQgaTsKKworICAgZm9yIChpID0gMDsgaSA8IFJFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QUzsgaSsrKXsKKyAgICAgIGludEJlZ2luW2ldID0gaW50RW5kW2ldID0gLTE7CisgICB9CisKKyAgIC8qIFNjYW4gaW5zdHJ1Y3Rpb25zIGxvb2tpbmcgZm9yIHRlbXBvcmFyeSByZWdpc3RlcnMgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBudW1JbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSBpbnN0cnVjdGlvbnMgKyBpOworICAgICAgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfQkdOTE9PUCkgeworICAgICAgICAgbG9vcFN0YWNrW2xvb3BTdGFja0RlcHRoXS5TdGFydCA9IGk7CisgICAgICAgICBsb29wU3RhY2tbbG9vcFN0YWNrRGVwdGhdLkVuZCA9IGluc3QtPkJyYW5jaFRhcmdldDsKKyAgICAgICAgIGxvb3BTdGFja0RlcHRoKys7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0VORExPT1ApIHsKKyAgICAgICAgIGxvb3BTdGFja0RlcHRoLS07CisgICAgICB9CisgICAgICBlbHNlIGlmIChpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0NBTCkgeworICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBjb25zdCBHTHVpbnQgbnVtU3JjID0gMzsvKl9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3QtPk9wY29kZSk7Ki8KKyAgICAgICAgIEdMdWludCBqOworICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVNyYzsgaisrKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpIHsKKyAgICAgICAgICAgICAgIGNvbnN0IEdMdWludCBpbmRleCA9IGluc3QtPlNyY1JlZ1tqXS5JbmRleDsKKyAgICAgICAgICAgICAgIGlmIChpbnN0LT5TcmNSZWdbal0uUmVsQWRkcikKKyAgICAgICAgICAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgICAgICAgICAgIHVwZGF0ZV9pbnRlcnZhbChpbnRCZWdpbiwgaW50RW5kLCBsb29wU3RhY2ssIGxvb3BTdGFja0RlcHRoLAorCQkJICAgICAgIGluZGV4LCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChpbnN0LT5Ec3RSZWcuRmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSkgeworICAgICAgICAgICAgY29uc3QgR0x1aW50IGluZGV4ID0gaW5zdC0+RHN0UmVnLkluZGV4OworICAgICAgICAgICAgaWYgKGluc3QtPkRzdFJlZy5SZWxBZGRyKQorICAgICAgICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgICAgICAgdXBkYXRlX2ludGVydmFsKGludEJlZ2luLCBpbnRFbmQsIGxvb3BTdGFjaywgbG9vcFN0YWNrRGVwdGgsCisJCQkgICAgaW5kZXgsIGkpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworCisvKioKKyAqIEZpbmQgdGhlIGxpdmUgaW50ZXJ2YWxzIGZvciBlYWNoIHRlbXBvcmFyeSByZWdpc3RlciBpbiB0aGUgcHJvZ3JhbS4KKyAqIEZvciByZWdpc3RlciBSLCB0aGUgaW50ZXJ2YWwgW0EsQl0gaW5kaWNhdGVzIHRoYXQgUiBpcyByZWZlcmVuY2VkCisgKiBmcm9tIGluc3RydWN0aW9uIEEgdGhyb3VnaCBpbnN0cnVjdGlvbiBCLgorICogU3BlY2lhbCBjb25zaWRlcmF0aW9uIGlzIG5lZWRlZCBmb3IgbG9vcHMgYW5kIHN1YnJvdXRpbmVzLgorICogXHJldHVybiBHTF9UUlVFIGlmIHN1Y2Nlc3MsIEdMX0ZBTFNFIGlmIHdlIGNhbm5vdCBwcm9jZWVkIGZvciBzb21lIHJlYXNvbgorICovCitzdGF0aWMgR0xib29sZWFuCitmaW5kX2xpdmVfaW50ZXJ2YWxzKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZXJ2YWxfbGlzdCAqbGl2ZUludGVydmFscykKK3sKKyAgIEdMaW50IGludEJlZ2luW1JFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QU107CisgICBHTGludCBpbnRFbmRbUkVHX0FMTE9DQVRFX01BWF9QUk9HUkFNX1RFTVBTXTsKKyAgIEdMdWludCBpOworCisgICAvKgorICAgICogTm90ZTogd2UnbGwgcmV0dXJuIEdMX0ZBTFNFIGJlbG93IGlmIHdlIGZpbmQgcmVsYXRpdmUgaW5kZXhpbmcKKyAgICAqIGludG8gdGhlIFRFTVAgcmVnaXN0ZXIgZmlsZS4gIFdlIGNhbid0IGhhbmRsZSB0aGF0IHlldC4KKyAgICAqIFdlIGFsc28gZ2l2ZSB1cCBvbiBzdWJyb3V0aW5lcyBmb3Igbm93LgorICAgICovCisKKyAgIGlmIChkYmcpIHsKKyAgICAgIHByaW50ZigiT3B0aW1pemU6IEJlZ2luIGZpbmQgaW50ZXJ2YWxzXG4iKTsKKyAgIH0KKworICAgLyogYnVpbGQgaW50ZXJtZWRpYXRlIGFycmF5cyAqLworICAgaWYgKCFfbWVzYV9maW5kX3RlbXBfaW50ZXJ2YWxzKHByb2ctPkluc3RydWN0aW9ucywgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludEJlZ2luLCBpbnRFbmQpKQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICAvKiBCdWlsZCBsaXZlIGludGVydmFscyBsaXN0IGZyb20gaW50ZXJtZWRpYXRlIGFycmF5cyAqLworICAgbGl2ZUludGVydmFscy0+TnVtID0gMDsKKyAgIGZvciAoaSA9IDA7IGkgPCBSRUdfQUxMT0NBVEVfTUFYX1BST0dSQU1fVEVNUFM7IGkrKykgeworICAgICAgaWYgKGludEJlZ2luW2ldID49IDApIHsKKyAgICAgICAgIHN0cnVjdCBpbnRlcnZhbCBpbnY7CisgICAgICAgICBpbnYuUmVnID0gaTsKKyAgICAgICAgIGludi5TdGFydCA9IGludEJlZ2luW2ldOworICAgICAgICAgaW52LkVuZCA9IGludEVuZFtpXTsKKyAgICAgICAgIGFwcGVuZF9pbnRlcnZhbChsaXZlSW50ZXJ2YWxzLCAmaW52KTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogU29ydCB0aGUgbGlzdCBhY2NvcmRpbmcgdG8gaW50ZXJ2YWwgc3RhcnRzICovCisgICBzb3J0X2ludGVydmFsX2xpc3RfYnlfc3RhcnQobGl2ZUludGVydmFscyk7CisKKyAgIGlmIChkYmcpIHsKKyAgICAgIC8qIHByaW50IGludGVydmFsIGluZm8gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsaXZlSW50ZXJ2YWxzLT5OdW07IGkrKykgeworICAgICAgICAgY29uc3Qgc3RydWN0IGludGVydmFsICppbnYgPSBsaXZlSW50ZXJ2YWxzLT5JbnRlcnZhbHMgKyBpOworICAgICAgICAgcHJpbnRmKCJSZWdbJWRdIGxpdmUgWyVkLCAlZF06IiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnYtPlJlZywgaW52LT5TdGFydCwgaW52LT5FbmQpOworICAgICAgICAgaWYgKDEpIHsKKyAgICAgICAgICAgIEdMdWludCBqOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGludi0+U3RhcnQ7IGorKykKKyAgICAgICAgICAgICAgIHByaW50ZigiICIpOworICAgICAgICAgICAgZm9yIChqID0gaW52LT5TdGFydDsgaiA8PSBpbnYtPkVuZDsgaisrKQorICAgICAgICAgICAgICAgcHJpbnRmKCJ4Iik7CisgICAgICAgICB9CisgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisKKy8qKiBTY2FuIHRoZSBhcnJheSBvZiB1c2VkIHJlZ2lzdGVyIGZsYWdzIHRvIGZpbmQgZnJlZSBlbnRyeSAqLworc3RhdGljIEdMaW50CithbGxvY19yZWdpc3RlcihHTGJvb2xlYW4gdXNlZFJlZ3NbUkVHX0FMTE9DQVRFX01BWF9QUk9HUkFNX1RFTVBTXSkKK3sKKyAgIEdMdWludCBrOworICAgZm9yIChrID0gMDsgayA8IFJFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QUzsgaysrKSB7CisgICAgICBpZiAoIXVzZWRSZWdzW2tdKSB7CisgICAgICAgICB1c2VkUmVnc1trXSA9IEdMX1RSVUU7CisgICAgICAgICByZXR1cm4gazsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiAtMTsKK30KKworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyAiTGluZWFyIFNjYW4gUmVnaXN0ZXIgQWxsb2NhdGlvbiIgdG8gcmVkdWNlCisgKiB0aGUgbnVtYmVyIG9mIHRlbXBvcmFyeSByZWdpc3RlcnMgdXNlZCBieSB0aGUgcHJvZ3JhbS4KKyAqCisgKiBXZSBjb21wdXRlIHRoZSAibGl2ZSBpbnRlcnZhbCIgZm9yIGFsbCB0ZW1wb3JhcnkgcmVnaXN0ZXJzIHRoZW4KKyAqIGV4YW1pbmUgdGhlIG92ZXJsYXAgb2YgdGhlIGludGVydmFscyB0byBhbGxvY2F0ZSBuZXcgcmVnaXN0ZXJzLgorICogQmFzaWNhbGx5LCBpZiB0d28gaW50ZXJ2YWxzIGRvIG5vdCBvdmVybGFwLCB0aGV5IGNhbiB1c2UgdGhlIHNhbWUgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitfbWVzYV9yZWFsbG9jYXRlX3JlZ2lzdGVycyhzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHN0cnVjdCBpbnRlcnZhbF9saXN0IGxpdmVJbnRlcnZhbHM7CisgICBHTGludCByZWdpc3Rlck1hcFtSRUdfQUxMT0NBVEVfTUFYX1BST0dSQU1fVEVNUFNdOworICAgR0xib29sZWFuIHVzZWRSZWdzW1JFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QU107CisgICBHTHVpbnQgaTsKKyAgIEdMaW50IG1heFRlbXAgPSAtMTsKKworICAgaWYgKGRiZykgeworICAgICAgcHJpbnRmKCJPcHRpbWl6ZTogQmVnaW4gbGl2ZS1pbnRlcnZhbCByZWdpc3RlciByZWFsbG9jYXRpb25cbiIpOworICAgICAgX21lc2FfcHJpbnRfcHJvZ3JhbShwcm9nKTsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IFJFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QUzsgaSsrKXsKKyAgICAgIHJlZ2lzdGVyTWFwW2ldID0gLTE7CisgICAgICB1c2VkUmVnc1tpXSA9IEdMX0ZBTFNFOworICAgfQorCisgICBpZiAoIWZpbmRfbGl2ZV9pbnRlcnZhbHMocHJvZywgJmxpdmVJbnRlcnZhbHMpKSB7CisgICAgICBpZiAoZGJnKQorICAgICAgICAgcHJpbnRmKCJBYm9ydGluZyByZWdpc3RlciByZWFsbG9jYXRpb25cbiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJ2YWxfbGlzdCBhY3RpdmVJbnRlcnZhbHM7CisgICAgICBhY3RpdmVJbnRlcnZhbHMuTnVtID0gMDsKKworICAgICAgLyogbG9vcCBvdmVyIGxpdmUgaW50ZXJ2YWxzLCBhbGxvY2F0aW5nIGEgbmV3IHJlZ2lzdGVyIGZvciBlYWNoICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGl2ZUludGVydmFscy5OdW07IGkrKykgeworICAgICAgICAgY29uc3Qgc3RydWN0IGludGVydmFsICpsaXZlID0gbGl2ZUludGVydmFscy5JbnRlcnZhbHMgKyBpOworCisgICAgICAgICBpZiAoZGJnKQorICAgICAgICAgICAgcHJpbnRmKCJDb25zaWRlciByZWdpc3RlciAldVxuIiwgbGl2ZS0+UmVnKTsKKworICAgICAgICAgLyogRXhwaXJlIG9sZCBpbnRlcnZhbHMuICBJbnRlcnZhbHMgd2hpY2ggaGF2ZSBlbmRlZCB3aXRoIHJlc3BlY3QKKyAgICAgICAgICAqIHRvIHRoZSBsaXZlIGludGVydmFsIGNhbiBoYXZlIHRoZWlyIHJlbWFwcGVkIHJlZ2lzdGVycyBmcmVlZC4KKyAgICAgICAgICAqLworICAgICAgICAgeworICAgICAgICAgICAgR0xpbnQgajsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoR0xpbnQpIGFjdGl2ZUludGVydmFscy5OdW07IGorKykgeworICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVydmFsICppbnYgPSBhY3RpdmVJbnRlcnZhbHMuSW50ZXJ2YWxzICsgajsKKyAgICAgICAgICAgICAgIGlmIChpbnYtPkVuZCA+PSBsaXZlLT5TdGFydCkgeworICAgICAgICAgICAgICAgICAgLyogU3RvcCBub3cuICBTaW5jZSB0aGUgYWN0aXZlSW50ZXJ2YWwgbGlzdCBpcyBzb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAqIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZSB0byBnbyBmdXJ0aGVyLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgLyogSW50ZXJ2YWwgJ2ludicgaGFzIGV4cGlyZWQgKi8KKyAgICAgICAgICAgICAgICAgIGNvbnN0IEdMaW50IHJlZ05ldyA9IHJlZ2lzdGVyTWFwW2ludi0+UmVnXTsKKyAgICAgICAgICAgICAgICAgIEFTU0VSVChyZWdOZXcgPj0gMCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChkYmcpCisgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgZXhwaXJlIGludGVydmFsIGZvciByZWcgJXVcbiIsIGludi0+UmVnKTsKKworICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGludGVydmFsIGogZnJvbSBhY3RpdmUgbGlzdCAqLworICAgICAgICAgICAgICAgICAgcmVtb3ZlX2ludGVydmFsKCZhY3RpdmVJbnRlcnZhbHMsIGludik7CisgICAgICAgICAgICAgICAgICBqLS07ICAvKiBjb3VudGVyLWFjdCBqKysgaW4gZm9yLWxvb3AgYWJvdmUgKi8KKworICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHJlZ2lzdGVyIHJlZ05ldyB0byB0aGUgZnJlZSBwb29sICovCisgICAgICAgICAgICAgICAgICBpZiAoZGJnKQorICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIGZyZWUgcmVnICVkXG4iLCByZWdOZXcpOworICAgICAgICAgICAgICAgICAgQVNTRVJUKHVzZWRSZWdzW3JlZ05ld10gPT0gR0xfVFJVRSk7CisgICAgICAgICAgICAgICAgICB1c2VkUmVnc1tyZWdOZXddID0gR0xfRkFMU0U7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIGZpbmQgYSBmcmVlIHJlZ2lzdGVyIGZvciB0aGlzIGxpdmUgaW50ZXJ2YWwgKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IGsgPSBhbGxvY19yZWdpc3Rlcih1c2VkUmVncyk7CisgICAgICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICAgICAgIC8qIG91dCBvZiByZWdpc3RlcnMsIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ2lzdGVyTWFwW2xpdmUtPlJlZ10gPSBrOworICAgICAgICAgICAgbWF4VGVtcCA9IE1BWDIobWF4VGVtcCwgayk7CisgICAgICAgICAgICBpZiAoZGJnKQorICAgICAgICAgICAgICAgcHJpbnRmKCIgIHJlbWFwIHJlZ2lzdGVyICV1IC0+ICVkXG4iLCBsaXZlLT5SZWcsIGspOworICAgICAgICAgfQorCisgICAgICAgICAvKiBJbnNlcnQgdGhpcyBsaXZlIGludGVydmFsIGludG8gdGhlIGFjdGl2ZSBsaXN0IHdoaWNoIGlzIHNvcnRlZAorICAgICAgICAgICogYnkgaW5jcmVhc2luZyBlbmQgcG9pbnRzLgorICAgICAgICAgICovCisgICAgICAgICBpbnNlcnRfaW50ZXJ2YWxfYnlfZW5kKCZhY3RpdmVJbnRlcnZhbHMsIGxpdmUpOworICAgICAgfQorICAgfQorCisgICBpZiAobWF4VGVtcCArIDEgPCAoR0xpbnQpIGxpdmVJbnRlcnZhbHMuTnVtKSB7CisgICAgICAvKiBPSywgd2UndmUgcmVkdWNlZCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBuZWVkZWQuCisgICAgICAgKiBTY2FuIHRoZSBwcm9ncmFtIGFuZCByZXBsYWNlIGFsbCB0aGUgb2xkIHRlbXBvcmFyeSByZWdpc3RlcgorICAgICAgICogaW5kZXhlcyB3aXRoIHRoZSBuZXcgaW5kZXhlcy4KKyAgICAgICAqLworICAgICAgcmVwbGFjZV9yZWdzKHByb2csIFBST0dSQU1fVEVNUE9SQVJZLCByZWdpc3Rlck1hcCk7CisKKyAgICAgIHByb2ctPk51bVRlbXBvcmFyaWVzID0gbWF4VGVtcCArIDE7CisgICB9CisKKyAgIGlmIChkYmcpIHsKKyAgICAgIHByaW50ZigiT3B0aW1pemU6IEVuZCBsaXZlLWludGVydmFsIHJlZ2lzdGVyIHJlYWxsb2NhdGlvblxuIik7CisgICAgICBwcmludGYoIk51bSB0ZW1wIHJlZ3MgYmVmb3JlOiAldSAgYWZ0ZXI6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgIGxpdmVJbnRlcnZhbHMuTnVtLCBtYXhUZW1wICsgMSk7CisgICAgICBfbWVzYV9wcmludF9wcm9ncmFtKHByb2cpOworICAgfQorfQorCisKKyNpZiAwCitzdGF0aWMgdm9pZAorcHJpbnRfaXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2dyYW0sIGNvbnN0IGNoYXIgKnR4dCkgeworICAgZnByaW50ZihzdGRlcnIsICIlcyAoJXUgaW5zdCk6XG4iLCB0eHQsIHByb2dyYW0tPk51bUluc3RydWN0aW9ucyk7CisgICBfbWVzYV9wcmludF9wcm9ncmFtKHByb2dyYW0pOworICAgX21lc2FfcHJpbnRfcHJvZ3JhbV9wYXJhbWV0ZXJzKGN0eCwgcHJvZ3JhbSk7CisgICBmcHJpbnRmKHN0ZGVyciwgIlxuXG4iKTsKK30KKyNlbmRpZgorCisvKioKKyAqIFRoaXMgcGFzcyByZXBsYWNlcyBDTVAgVDAsIFQxIFQyIFQwIHdpdGggTU9WIFQwLCBUMiB3aGVuIHRoZSBDTVAKKyAqIGluc3RydWN0aW9uIGlzIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byB3cml0ZSB0byByZWdpc3RlciBUMC4gIFRoZSBhcmUKKyAqIHNldmVyYWwgbG93ZXJpbmcgcGFzc2VzIGRvbmUgaW4gR0xTTCBJUiAoZS5nLiBicmFuY2hlcyBhbmQKKyAqIHJlbGF0aXZlIGFkZHJlc3NpbmcpIHRoYXQgY3JlYXRlIGEgbGFyZ2UgbnVtYmVyIG9mIGNvbmRpdGlvbmFsIGFzc2lnbm1lbnRzCisgKiB0aGF0IGlyX3RvX21lc2EgY29udmVydHMgdG8gQ01QIGluc3RydWN0aW9ucyBsaWtlIHRoZSBvbmUgbWVudGlvbmVkIGFib3ZlLgorICoKKyAqIEhlcmUgaXMgd2h5IHRoaXMgY29udmVyc2lvbiBpcyBzYWZlOgorICogQ01QIFQwLCBUMSBUMiBUMCBjYW4gYmUgZXhwYW5kZWQgdG86CisgKiBpZiAoVDEgPCAwLjApCisgKiAJTU9WIFQwLCBUMjsKKyAqIGVsc2UKKyAqIAlNT1YgVDAsIFQwOworICoKKyAqIElmIChUMSA8IDAuMCkgZXZhbHVhdGVzIHRvIHRydWUgdGhlbiBvdXIgcmVwbGFjZW1lbnQgTU9WIFQwLCBUMiBpcyB0aGUgc2FtZQorICogYXMgdGhlIG9yaWdpbmFsIHByb2dyYW0uICBJZiAoVDEgPCAwLjApIGV2YWx1YXRlcyB0byBmYWxzZSwgZXhlY3V0aW5nCisgKiBNT1YgVDAsIFQwIHdpbGwgc3RvcmUgYSBnYXJiYWdlIHZhbHVlIGluIFQwIHNpbmNlIFQwIGlzIHVuaW5pdGlhbGl6ZWQuCisgKiBUaGVyZWZvcmUsIGl0IGRvZXNuJ3QgbWF0dGVyIHRoYXQgd2UgYXJlIHJlcGxhY2luZyBNT1YgVDAsIFQwIHdpdGggTU9WIFQwLCBUMgorICogYmVjYXVzZSBhbnkgaW5zdHJ1Y3Rpb24gdGhhdCB3YXMgZ29pbmcgdG8gcmVhZCBmcm9tIFQwIGFmdGVyIHRoaXMgd2FzIGdvaW5nCisgKiB0byByZWFkIGEgZ2FyYmFnZSB2YWx1ZSBhbnl3YXkuCisgKi8KK3N0YXRpYyB2b2lkCitfbWVzYV9zaW1wbGlmeV9jbXAoc3RydWN0IGdsX3Byb2dyYW0gKiBwcm9ncmFtKQoreworICAgR0x1aW50IHRlbXBXcml0ZXNbUkVHX0FMTE9DQVRFX01BWF9QUk9HUkFNX1RFTVBTXTsKKyAgIEdMdWludCBvdXRwdXRXcml0ZXNbTUFYX1BST0dSQU1fT1VUUFVUU107CisgICBHTHVpbnQgaTsKKworICAgaWYgKGRiZykgeworICAgICAgcHJpbnRmKCJPcHRpbWl6ZTogQmVnaW4gcmVhZHMgd2l0aG91dCB3cml0ZXNcbiIpOworICAgICAgX21lc2FfcHJpbnRfcHJvZ3JhbShwcm9ncmFtKTsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IFJFR19BTExPQ0FURV9NQVhfUFJPR1JBTV9URU1QUzsgaSsrKSB7CisgICAgICB0ZW1wV3JpdGVzW2ldID0gMDsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IE1BWF9QUk9HUkFNX09VVFBVVFM7IGkrKykgeworICAgICAgb3V0cHV0V3JpdGVzW2ldID0gMDsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IHByb2dyYW0tPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2dyYW0tPkluc3RydWN0aW9ucyArIGk7CisgICAgICBHTHVpbnQgcHJldldyaXRlTWFzazsKKworICAgICAgLyogR2l2ZSB1cCBpZiB3ZSBlbmNvdW50ZXIgcmVsYXRpdmUgYWRkcmVzc2luZyBvciBmbG93IGNvbnRyb2wuICovCisgICAgICBpZiAoX21lc2FfaXNfZmxvd19jb250cm9sX29wY29kZShpbnN0LT5PcGNvZGUpIHx8IGluc3QtPkRzdFJlZy5SZWxBZGRyKSB7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5Ec3RSZWcuRmlsZSA9PSBQUk9HUkFNX09VVFBVVCkgeworICAgICAgICAgYXNzZXJ0KGluc3QtPkRzdFJlZy5JbmRleCA8IE1BWF9QUk9HUkFNX09VVFBVVFMpOworICAgICAgICAgcHJldldyaXRlTWFzayA9IG91dHB1dFdyaXRlc1tpbnN0LT5Ec3RSZWcuSW5kZXhdOworICAgICAgICAgb3V0cHV0V3JpdGVzW2luc3QtPkRzdFJlZy5JbmRleF0gfD0gaW5zdC0+RHN0UmVnLldyaXRlTWFzazsKKyAgICAgIH0gZWxzZSBpZiAoaW5zdC0+RHN0UmVnLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpIHsKKyAgICAgICAgIGFzc2VydChpbnN0LT5Ec3RSZWcuSW5kZXggPCBSRUdfQUxMT0NBVEVfTUFYX1BST0dSQU1fVEVNUFMpOworICAgICAgICAgcHJldldyaXRlTWFzayA9IHRlbXBXcml0ZXNbaW5zdC0+RHN0UmVnLkluZGV4XTsKKyAgICAgICAgIHRlbXBXcml0ZXNbaW5zdC0+RHN0UmVnLkluZGV4XSB8PSBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIE5vIG90aGVyIHJlZ2lzdGVyIHR5cGUgY2FuIGJlIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIuICovCisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogRm9yIGEgQ01QIHRvIGJlIGNvbnNpZGVyZWQgYSBjb25kaXRpb25hbCB3cml0ZSwgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgKiByZWdpc3RlciBhbmQgc291cmNlIHJlZ2lzdGVyIHR3byBtdXN0IGJlIHRoZSBzYW1lLiAqLworICAgICAgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfQ01QCisgICAgICAgICAgJiYgIShpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrICYgcHJldldyaXRlTWFzaykKKyAgICAgICAgICAmJiBpbnN0LT5TcmNSZWdbMl0uRmlsZSA9PSBpbnN0LT5Ec3RSZWcuRmlsZQorICAgICAgICAgICYmIGluc3QtPlNyY1JlZ1syXS5JbmRleCA9PSBpbnN0LT5Ec3RSZWcuSW5kZXgKKyAgICAgICAgICAmJiBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID09IGdldF9zcmNfYXJnX21hc2soaW5zdCwgMiwgTk9fTUFTSykpIHsKKworICAgICAgICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKyAgICAgICAgIGluc3QtPlNyY1JlZ1swXSA9IGluc3QtPlNyY1JlZ1sxXTsKKworCSAvKiBVbnVzZWQgb3BlcmFuZHMgYXJlIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGZpbGUgc2V0IHRvCisJICAqIFBST0dSQU1fVU5ERUZJTkVELiAgVGhpcyBpcyBob3cgX21lc2FfaW5pdF9pbnN0cnVjdGlvbnMgaW5pdGlhbGl6ZXMKKwkgICogYWxsIG9mIHRoZSBzb3VyY2VzLgorCSAgKi8KKwkgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKwkgaW5zdC0+U3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisJIGluc3QtPlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9VTkRFRklORUQ7CisJIGluc3QtPlNyY1JlZ1syXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworICAgICAgfQorICAgfQorICAgaWYgKGRiZykgeworICAgICAgcHJpbnRmKCJPcHRpbWl6ZTogRW5kIHJlYWRzIHdpdGhvdXQgd3JpdGVzXG4iKTsKKyAgICAgIF9tZXNhX3ByaW50X3Byb2dyYW0ocHJvZ3JhbSk7CisgICB9Cit9CisKKy8qKgorICogQXBwbHkgb3B0aW1pemF0aW9ucyB0byB0aGUgZ2l2ZW4gcHJvZ3JhbSB0byBlbGltaW5hdGUgdW5uZWNlc3NhcnkKKyAqIGluc3RydWN0aW9ucywgdGVtcCByZWdzLCBldGMuCisgKi8KK3ZvaWQKK19tZXNhX29wdGltaXplX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2dyYW0pCit7CisgICBHTGJvb2xlYW4gYW55X2NoYW5nZTsKKworICAgX21lc2Ffc2ltcGxpZnlfY21wKHByb2dyYW0pOworICAgLyogU3RvcCB3aGVuIG5vIG1vZGlmaWNhdGlvbnMgd2VyZSBvdXRwdXQgKi8KKyAgIGRvIHsKKyAgICAgIGFueV9jaGFuZ2UgPSBHTF9GQUxTRTsKKyAgICAgIF9tZXNhX3JlbW92ZV9leHRyYV9tb3ZlX3VzZShwcm9ncmFtKTsKKyAgICAgIGlmIChfbWVzYV9yZW1vdmVfZGVhZF9jb2RlX2dsb2JhbChwcm9ncmFtKSkKKyAgICAgICAgIGFueV9jaGFuZ2UgPSBHTF9UUlVFOworICAgICAgaWYgKF9tZXNhX3JlbW92ZV9leHRyYV9tb3Zlcyhwcm9ncmFtKSkKKyAgICAgICAgIGFueV9jaGFuZ2UgPSBHTF9UUlVFOworICAgICAgaWYgKF9tZXNhX3JlbW92ZV9kZWFkX2NvZGVfbG9jYWwocHJvZ3JhbSkpCisgICAgICAgICBhbnlfY2hhbmdlID0gR0xfVFJVRTsKKworICAgICAgYW55X2NoYW5nZSA9IF9tZXNhX2NvbnN0YW50X2ZvbGQocHJvZ3JhbSkgfHwgYW55X2NoYW5nZTsKKyAgICAgIF9tZXNhX3JlYWxsb2NhdGVfcmVnaXN0ZXJzKHByb2dyYW0pOworICAgfSB3aGlsZSAoYW55X2NoYW5nZSk7Cit9CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19vcHRpbWl6ZS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX29wdGltaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwN2JmZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19vcHRpbWl6ZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBWTXdhcmUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWTVdBUkUgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFBST0dfT1BUX0gKKyNkZWZpbmUgUFJPR19PUFRfSAorCisKKyNpbmNsdWRlICJtYWluL2NvbmZpZy5oIgorI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKworCitzdHJ1Y3QgZ2xfY29udGV4dDsKK3N0cnVjdCBnbF9wcm9ncmFtOworc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb247CisKKworZXh0ZXJuIEdMYm9vbGVhbgorX21lc2FfZmluZF90ZW1wX2ludGVydmFscyhjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbnVtSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBpbnRCZWdpbltNQVhfUFJPR1JBTV9URU1QU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludEVuZFtNQVhfUFJPR1JBTV9URU1QU10pOworCitleHRlcm4gdm9pZAorX21lc2Ffb3B0aW1pemVfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZ3JhbSk7CisKK2V4dGVybiBHTGJvb2xlYW4KK19tZXNhX2NvbnN0YW50X2ZvbGQoc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXIuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2RkYTlmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX3BhcmFtZXRlci5jCkBAIC0wLDAgKzEsNTgyIEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA4ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgcHJvZ19wYXJhbWV0ZXIuYworICogUHJvZ3JhbSBwYXJhbWV0ZXIgbGlzdHMgYW5kIGZ1bmN0aW9ucy4KKyAqIFxhdXRob3IgQnJpYW4gUGF1bAorICovCisKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgInByb2dfaW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJwcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgInByb2dfc3RhdGV2YXJzLmgiCisKKworc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKgorX21lc2FfbmV3X3BhcmFtZXRlcl9saXN0KHZvaWQpCit7CisgICByZXR1cm4gQ0FMTE9DX1NUUlVDVChnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0KTsKK30KKworCitzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqCitfbWVzYV9uZXdfcGFyYW1ldGVyX2xpc3Rfc2l6ZWQodW5zaWduZWQgc2l6ZSkKK3sKKyAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwID0gX21lc2FfbmV3X3BhcmFtZXRlcl9saXN0KCk7CisKKyAgIGlmICgocCAhPSBOVUxMKSAmJiAoc2l6ZSAhPSAwKSkgeworICAgICAgcC0+U2l6ZSA9IHNpemU7CisKKyAgICAgIC8qIGFsbG9jIGFycmF5cyAqLworICAgICAgcC0+UGFyYW1ldGVycyA9IChzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIgKikKKwkgY2FsbG9jKDEsIHNpemUgKiBzaXplb2Yoc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyKSk7CisKKyAgICAgIHAtPlBhcmFtZXRlclZhbHVlcyA9IChnbF9jb25zdGFudF92YWx1ZSAoKilbNF0pCisgICAgICAgICBfbWVzYV9hbGlnbl9tYWxsb2Moc2l6ZSAqIDQgKnNpemVvZihnbF9jb25zdGFudF92YWx1ZSksIDE2KTsKKworCisgICAgICBpZiAoKHAtPlBhcmFtZXRlcnMgPT0gTlVMTCkgfHwgKHAtPlBhcmFtZXRlclZhbHVlcyA9PSBOVUxMKSkgeworCSBmcmVlKHAtPlBhcmFtZXRlcnMpOworCSBfbWVzYV9hbGlnbl9mcmVlKHAtPlBhcmFtZXRlclZhbHVlcyk7CisJIGZyZWUocCk7CisJIHAgPSBOVUxMOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gcDsKK30KKworCisvKioKKyAqIEZyZWUgYSBwYXJhbWV0ZXIgbGlzdCBhbmQgYWxsIGl0cyBwYXJhbWV0ZXJzCisgKi8KK3ZvaWQKK19tZXNhX2ZyZWVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtTGlzdCkKK3sKKyAgIEdMdWludCBpOworICAgZm9yIChpID0gMDsgaSA8IHBhcmFtTGlzdC0+TnVtUGFyYW1ldGVyczsgaSsrKSB7CisgICAgICBmcmVlKCh2b2lkICopcGFyYW1MaXN0LT5QYXJhbWV0ZXJzW2ldLk5hbWUpOworICAgfQorICAgZnJlZShwYXJhbUxpc3QtPlBhcmFtZXRlcnMpOworICAgX21lc2FfYWxpZ25fZnJlZShwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlcyk7CisgICBmcmVlKHBhcmFtTGlzdCk7Cit9CisKKworLyoqCisgKiBBZGQgYSBuZXcgcGFyYW1ldGVyIHRvIGEgcGFyYW1ldGVyIGxpc3QuCisgKiBOb3RlIHRoYXQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgdXN1YWxseSA0LWVsZW1lbnQgR0xmbG9hdCB2ZWN0b3JzLgorICogV2hlbiBzaXplID4gNCB3ZSdsbCBhbGxvY2F0ZSBhIHNlcXVlbnRpYWwgYmxvY2sgb2YgcGFyYW1ldGVycyB0bworICogc3RvcmUgYWxsIHRoZSB2YWx1ZXMgKGluIGJsb2NrcyBvZiA0KS4KKyAqCisgKiBccGFyYW0gcGFyYW1MaXN0ICB0aGUgbGlzdCB0byBhZGQgdGhlIHBhcmFtZXRlciB0bworICogXHBhcmFtIHR5cGUgIHR5cGUgb2YgcGFyYW1ldGVyLCBzdWNoIGFzIAorICogXHBhcmFtIG5hbWUgIHRoZSBwYXJhbWV0ZXIgbmFtZSwgd2lsbCBiZSBkdXBsaWNhdGVkL2NvcGllZCEKKyAqIFxwYXJhbSBzaXplICBudW1iZXIgb2YgZWxlbWVudHMgaW4gJ3ZhbHVlcycgdmVjdG9yICgxLi40LCBvciBtb3JlKQorICogXHBhcmFtIGRhdGF0eXBlICBHTF9GTE9BVCwgR0xfRkxPQVRfVkVDeCwgR0xfSU5ULCBHTF9JTlRfVkVDeCBvciBHTF9OT05FLgorICogXHBhcmFtIHZhbHVlcyAgaW5pdGlhbCBwYXJhbWV0ZXIgdmFsdWUsIHVwIHRvIDQgZ2xfY29uc3RhbnRfdmFsdWVzLCBvciBOVUxMCisgKiBccGFyYW0gc3RhdGUgIHN0YXRlIGluZGV4ZXMsIG9yIE5VTEwKKyAqIFxyZXR1cm4gIGluZGV4IG9mIG5ldyBwYXJhbWV0ZXIgaW4gdGhlIGxpc3QsIG9yIC0xIGlmIGVycm9yIChvdXQgb2YgbWVtKQorICovCitHTGludAorX21lc2FfYWRkX3BhcmFtZXRlcihzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICBnbF9yZWdpc3Rlcl9maWxlIHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgIEdMdWludCBzaXplLCBHTGVudW0gZGF0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlICp2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsX3N0YXRlX2luZGV4IHN0YXRlW1NUQVRFX0xFTkdUSF0pCit7CisgICBjb25zdCBHTHVpbnQgb2xkTnVtID0gcGFyYW1MaXN0LT5OdW1QYXJhbWV0ZXJzOworICAgY29uc3QgR0x1aW50IHN6NCA9IChzaXplICsgMykgLyA0OyAvKiBuby4gb2YgbmV3IHBhcmFtIHNsb3RzIG5lZWRlZCAqLworCisgICBhc3NlcnQoc2l6ZSA+IDApOworCisgICBpZiAob2xkTnVtICsgc3o0ID4gcGFyYW1MaXN0LT5TaXplKSB7CisgICAgICAvKiBOZWVkIHRvIGdyb3cgdGhlIHBhcmFtZXRlciBsaXN0IGFycmF5IChhbGxvYyBzb21lIGV4dHJhKSAqLworICAgICAgcGFyYW1MaXN0LT5TaXplID0gcGFyYW1MaXN0LT5TaXplICsgNCAqIHN6NDsKKworICAgICAgLyogcmVhbGxvYyBhcnJheXMgKi8KKyAgICAgIHBhcmFtTGlzdC0+UGFyYW1ldGVycyA9IChzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIgKikKKwkgX21lc2FfcmVhbGxvYyhwYXJhbUxpc3QtPlBhcmFtZXRlcnMsCisJCSAgICAgICBvbGROdW0gKiBzaXplb2Yoc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyKSwKKwkJICAgICAgIHBhcmFtTGlzdC0+U2l6ZSAqIHNpemVvZihzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIpKTsKKworICAgICAgcGFyYW1MaXN0LT5QYXJhbWV0ZXJWYWx1ZXMgPSAoZ2xfY29uc3RhbnRfdmFsdWUgKCopWzRdKQorICAgICAgICAgX21lc2FfYWxpZ25fcmVhbGxvYyhwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlcywgICAgICAgICAvKiBvbGQgYnVmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZE51bSAqIDQgKiBzaXplb2YoZ2xfY29uc3RhbnRfdmFsdWUpLC8qIG9sZCBzeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QtPlNpemUqNCpzaXplb2YoZ2xfY29uc3RhbnRfdmFsdWUpLC8qbmV3Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOworICAgfQorCisgICBpZiAoIXBhcmFtTGlzdC0+UGFyYW1ldGVycyB8fAorICAgICAgICFwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlcykgeworICAgICAgLyogb3V0IG9mIG1lbW9yeSAqLworICAgICAgcGFyYW1MaXN0LT5OdW1QYXJhbWV0ZXJzID0gMDsKKyAgICAgIHBhcmFtTGlzdC0+U2l6ZSA9IDA7CisgICAgICByZXR1cm4gLTE7CisgICB9CisgICBlbHNlIHsKKyAgICAgIEdMdWludCBpLCBqOworCisgICAgICBwYXJhbUxpc3QtPk51bVBhcmFtZXRlcnMgPSBvbGROdW0gKyBzejQ7CisKKyAgICAgIG1lbXNldCgmcGFyYW1MaXN0LT5QYXJhbWV0ZXJzW29sZE51bV0sIDAsCisgICAgICAgICAgICAgc3o0ICogc2l6ZW9mKHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcikpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3o0OyBpKyspIHsKKyAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlciAqcCA9IHBhcmFtTGlzdC0+UGFyYW1ldGVycyArIG9sZE51bSArIGk7CisgICAgICAgICBwLT5OYW1lID0gbmFtZSA/IF9tZXNhX3N0cmR1cChuYW1lKSA6IE5VTEw7CisgICAgICAgICBwLT5UeXBlID0gdHlwZTsKKyAgICAgICAgIHAtPlNpemUgPSBzaXplOworICAgICAgICAgcC0+RGF0YVR5cGUgPSBkYXRhdHlwZTsKKyAgICAgICAgIGlmICh2YWx1ZXMpIHsKKyAgICAgICAgICAgIGlmIChzaXplID49IDQpIHsKKyAgICAgICAgICAgICAgIENPUFlfNFYocGFyYW1MaXN0LT5QYXJhbWV0ZXJWYWx1ZXNbb2xkTnVtICsgaV0sIHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIC8qIGNvcHkgMSwgMiBvciAzIHZhbHVlcyAqLworICAgICAgICAgICAgICAgR0x1aW50IHJlbWFpbmluZyA9IHNpemUgJSA0OworICAgICAgICAgICAgICAgYXNzZXJ0KHJlbWFpbmluZyA8IDQpOworICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJlbWFpbmluZzsgaisrKSB7CisgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlc1tvbGROdW0gKyBpXVtqXS5mID0gdmFsdWVzW2pdLmY7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAvKiBmaWxsIGluIHJlbWFpbmluZyBwb3NpdGlvbnMgd2l0aCB6ZXJvcyAqLworICAgICAgICAgICAgICAgZm9yICg7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgIHBhcmFtTGlzdC0+UGFyYW1ldGVyVmFsdWVzW29sZE51bSArIGldW2pdLmYgPSAwLjBmOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWVzICs9IDQ7CisgICAgICAgICAgICBwLT5Jbml0aWFsaXplZCA9IEdMX1RSVUU7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIHNpbGVuY2UgdmFsZ3JpbmQgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICAJcGFyYW1MaXN0LT5QYXJhbWV0ZXJWYWx1ZXNbb2xkTnVtICsgaV1bal0uZiA9IDA7CisgICAgICAgICB9CisgICAgICAgICBzaXplIC09IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZSkgeworICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNUQVRFX0xFTkdUSDsgaSsrKQorICAgICAgICAgICAgcGFyYW1MaXN0LT5QYXJhbWV0ZXJzW29sZE51bV0uU3RhdGVJbmRleGVzW2ldID0gc3RhdGVbaV07CisgICAgICB9CisKKyAgICAgIHJldHVybiAoR0xpbnQpIG9sZE51bTsKKyAgIH0KK30KKworCisvKioKKyAqIEFkZCBhIG5ldyBuYW1lZCBjb25zdGFudCB0byB0aGUgcGFyYW1ldGVyIGxpc3QuCisgKiBUaGlzIHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBwcm9ncmFtIGNvbnRhaW5zIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKiAgICBQQVJBTSBteVZhbHMgPSB7IDAsIDEsIDIsIDMgfTsKKyAqCisgKiBccGFyYW0gcGFyYW1MaXN0ICB0aGUgcGFyYW1ldGVyIGxpc3QKKyAqIFxwYXJhbSBuYW1lICB0aGUgbmFtZSBmb3IgdGhlIGNvbnN0YW50CisgKiBccGFyYW0gdmFsdWVzICBmb3VyIGZsb2F0IHZhbHVlcworICogXHJldHVybiBpbmRleC9wb3NpdGlvbiBvZiB0aGUgbmV3IHBhcmFtZXRlciBpbiB0aGUgcGFyYW1ldGVyIGxpc3QKKyAqLworR0xpbnQKK19tZXNhX2FkZF9uYW1lZF9jb25zdGFudChzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlIHZhbHVlc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgc2l6ZSkKK3sKKyAgIC8qIGZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYSBkdXBsaWNhdGUgY29uc3RhbnQgKi8KKyAgIEdMaW50IHBvczsKKyAgIGZvciAocG9zID0gMDsgcG9zIDwgKEdMaW50KXBhcmFtTGlzdC0+TnVtUGFyYW1ldGVyczsgcG9zKyspIHsKKyAgICAgIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlICpwdmFscyA9IHBhcmFtTGlzdC0+UGFyYW1ldGVyVmFsdWVzW3Bvc107CisgICAgICBpZiAocHZhbHNbMF0udSA9PSB2YWx1ZXNbMF0udSAmJgorICAgICAgICAgIHB2YWxzWzFdLnUgPT0gdmFsdWVzWzFdLnUgJiYKKyAgICAgICAgICBwdmFsc1syXS51ID09IHZhbHVlc1syXS51ICYmCisgICAgICAgICAgcHZhbHNbM10udSA9PSB2YWx1ZXNbM10udSAmJgorICAgICAgICAgIHN0cmNtcChwYXJhbUxpc3QtPlBhcmFtZXRlcnNbcG9zXS5OYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAvKiBTYW1lIG5hbWUgYW5kIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIHBhcmFtIGxpc3QgLSByZXVzZSBpdCAqLworICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgIH0KKyAgIH0KKyAgIC8qIG5vdCBmb3VuZCwgYWRkIG5ldyBwYXJhbWV0ZXIgKi8KKyAgIHJldHVybiBfbWVzYV9hZGRfcGFyYW1ldGVyKHBhcmFtTGlzdCwgUFJPR1JBTV9DT05TVEFOVCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIEdMX05PTkUsIHZhbHVlcywgTlVMTCk7Cit9CisKKworLyoqCisgKiBBZGQgYSBuZXcgdW5uYW1lZCBjb25zdGFudCB0byB0aGUgcGFyYW1ldGVyIGxpc3QuICBUaGlzIHdpbGwgYmUgdXNlZAorICogd2hlbiBhIGZyYWdtZW50L3ZlcnRleCBwcm9ncmFtIGNvbnRhaW5zIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKiAgICBNT1YgciwgeyAwLCAxLCAyLCAzIH07CisgKiBJZiBzd2l6emxlT3V0IGlzIG5vbi1udWxsIHdlJ2xsIHNlYXJjaCB0aGUgcGFyYW1ldGVyIGxpc3QgZm9yIGFuCisgKiBleGlzdGluZyBpbnN0YW5jZSBvZiB0aGUgY29uc3RhbnQgd2hpY2ggbWF0Y2hlcyB3aXRoIGEgc3dpenpsZS4KKyAqCisgKiBccGFyYW0gcGFyYW1MaXN0ICB0aGUgcGFyYW1ldGVyIGxpc3QKKyAqIFxwYXJhbSB2YWx1ZXMgIGZvdXIgZmxvYXQgdmFsdWVzCisgKiBccGFyYW0gc3dpenpsZU91dCAgcmV0dXJucyBzd2l6emxlIG1hc2sgZm9yIGFjY2Vzc2luZyB0aGUgY29uc3RhbnQKKyAqIFxyZXR1cm4gaW5kZXgvcG9zaXRpb24gb2YgdGhlIG5ldyBwYXJhbWV0ZXIgaW4gdGhlIHBhcmFtZXRlciBsaXN0LgorICovCitHTGludAorX21lc2FfYWRkX3R5cGVkX3VubmFtZWRfY29uc3RhbnQoc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlIHZhbHVlc1s0XSwgR0x1aW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZGF0YXR5cGUsIEdMdWludCAqc3dpenpsZU91dCkKK3sKKyAgIEdMaW50IHBvczsKKyAgIEFTU0VSVChzaXplID49IDEpOworICAgQVNTRVJUKHNpemUgPD0gNCk7CisKKyAgIGlmIChzd2l6emxlT3V0ICYmCisgICAgICAgX21lc2FfbG9va3VwX3BhcmFtZXRlcl9jb25zdGFudChwYXJhbUxpc3QsIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsICZwb3MsIHN3aXp6bGVPdXQpKSB7CisgICAgICByZXR1cm4gcG9zOworICAgfQorCisgICAvKiBMb29rIGZvciBlbXB0eSBzcGFjZSBpbiBhbiBhbHJlYWR5IHVubmFtZWQgY29uc3RhbnQgcGFyYW1ldGVyCisgICAgKiB0byBhZGQgdGhpcyBjb25zdGFudC4gIFRoaXMgd2lsbCBvbmx5IHdvcmsgZm9yIHNpbmdsZS1lbGVtZW50CisgICAgKiBjb25zdGFudHMgYmVjYXVzZSB3ZSByZWx5IG9uIHNtZWFyaW5nIChpLmUuIC55eXl5IG9yIC56enp6KS4KKyAgICAqLworICAgaWYgKHNpemUgPT0gMSAmJiBzd2l6emxlT3V0KSB7CisgICAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IChHTGludCkgcGFyYW1MaXN0LT5OdW1QYXJhbWV0ZXJzOyBwb3MrKykgeworICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyICpwID0gcGFyYW1MaXN0LT5QYXJhbWV0ZXJzICsgcG9zOworICAgICAgICAgaWYgKHAtPlR5cGUgPT0gUFJPR1JBTV9DT05TVEFOVCAmJiBwLT5TaXplICsgc2l6ZSA8PSA0KSB7CisgICAgICAgICAgICAvKiBvaywgZm91bmQgcm9vbSAqLworICAgICAgICAgICAgZ2xfY29uc3RhbnRfdmFsdWUgKnBWYWwgPSBwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlc1twb3NdOworICAgICAgICAgICAgR0x1aW50IHN3eiA9IHAtPlNpemU7IC8qIDEsIDIgb3IgMyBmb3IgWSwgWiwgVyAqLworICAgICAgICAgICAgcFZhbFtwLT5TaXplXSA9IHZhbHVlc1swXTsKKyAgICAgICAgICAgIHAtPlNpemUrKzsKKyAgICAgICAgICAgICpzd2l6emxlT3V0ID0gTUFLRV9TV0laWkxFNChzd3osIHN3eiwgc3d6LCBzd3opOworICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogYWRkIGEgbmV3IHBhcmFtZXRlciB0byBzdG9yZSB0aGlzIGNvbnN0YW50ICovCisgICBwb3MgPSBfbWVzYV9hZGRfcGFyYW1ldGVyKHBhcmFtTGlzdCwgUFJPR1JBTV9DT05TVEFOVCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZGF0YXR5cGUsIHZhbHVlcywgTlVMTCk7CisgICBpZiAocG9zID49IDAgJiYgc3dpenpsZU91dCkgeworICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICpzd2l6emxlT3V0ID0gU1dJWlpMRV9YWFhYOworICAgICAgZWxzZQorICAgICAgICAgKnN3aXp6bGVPdXQgPSBTV0laWkxFX05PT1A7CisgICB9CisgICByZXR1cm4gcG9zOworfQorCisvKioKKyAqIEFkZCBhIG5ldyB1bm5hbWVkIGNvbnN0YW50IHRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gIFRoaXMgd2lsbCBiZSB1c2VkCisgKiB3aGVuIGEgZnJhZ21lbnQvdmVydGV4IHByb2dyYW0gY29udGFpbnMgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqICAgIE1PViByLCB7IDAsIDEsIDIsIDMgfTsKKyAqIElmIHN3aXp6bGVPdXQgaXMgbm9uLW51bGwgd2UnbGwgc2VhcmNoIHRoZSBwYXJhbWV0ZXIgbGlzdCBmb3IgYW4KKyAqIGV4aXN0aW5nIGluc3RhbmNlIG9mIHRoZSBjb25zdGFudCB3aGljaCBtYXRjaGVzIHdpdGggYSBzd2l6emxlLgorICoKKyAqIFxwYXJhbSBwYXJhbUxpc3QgIHRoZSBwYXJhbWV0ZXIgbGlzdAorICogXHBhcmFtIHZhbHVlcyAgZm91ciBmbG9hdCB2YWx1ZXMKKyAqIFxwYXJhbSBzd2l6emxlT3V0ICByZXR1cm5zIHN3aXp6bGUgbWFzayBmb3IgYWNjZXNzaW5nIHRoZSBjb25zdGFudAorICogXHJldHVybiBpbmRleC9wb3NpdGlvbiBvZiB0aGUgbmV3IHBhcmFtZXRlciBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCisgKiBcc2EgX21lc2FfYWRkX3R5cGVkX3VubmFtZWRfY29uc3RhbnQKKyAqLworR0xpbnQKK19tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbF9jb25zdGFudF92YWx1ZSB2YWx1ZXNbNF0sIEdMdWludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50ICpzd2l6emxlT3V0KQoreworICAgcmV0dXJuIF9tZXNhX2FkZF90eXBlZF91bm5hbWVkX2NvbnN0YW50KHBhcmFtTGlzdCwgdmFsdWVzLCBzaXplLCBHTF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGVPdXQpOworfQorCisjaWYgMCAvKiBub3QgdXNlZCB5ZXQgKi8KKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIDQtY29tcG9uZW50IHJlZ2lzdGVycyBuZWVkZWQgdG8gc3RvcmUgYSBwaWVjZQorICogb2YgR0wgc3RhdGUuICBGb3IgbWF0cmljZXMgdGhpcyBtYXkgYmUgYXMgbWFueSBhcyA0IHJlZ2lzdGVycywKKyAqIGV2ZXJ5dGhpbmcgZWxzZSBuZWVkcworICoganVzdCAxIHJlZ2lzdGVyLgorICovCitzdGF0aWMgR0x1aW50CitzaXplb2Zfc3RhdGVfcmVmZXJlbmNlKGNvbnN0IEdMaW50ICpzdGF0ZVRva2VucykKK3sKKyAgIGlmIChzdGF0ZVRva2Vuc1swXSA9PSBTVEFURV9NQVRSSVgpIHsKKyAgICAgIEdMdWludCByb3dzID0gc3RhdGVUb2tlbnNbNF0gLSBzdGF0ZVRva2Vuc1szXSArIDE7CisgICAgICBhc3NlcnQocm93cyA+PSAxKTsKKyAgICAgIGFzc2VydChyb3dzIDw9IDQpOworICAgICAgcmV0dXJuIHJvd3M7CisgICB9CisgICBlbHNlIHsKKyAgICAgIHJldHVybiAxOworICAgfQorfQorI2VuZGlmCisKKworLyoqCisgKiBBZGQgYSBuZXcgc3RhdGUgcmVmZXJlbmNlIHRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4KKyAqIFRoaXMgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHByb2dyYW0gY29udGFpbnMgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqICAgIFBBUkFNIGFtYmllbnQgPSBzdGF0ZS5tYXRlcmlhbC5mcm9udC5hbWJpZW50OworICoKKyAqIFxwYXJhbSBwYXJhbUxpc3QgIHRoZSBwYXJhbWV0ZXIgbGlzdAorICogXHBhcmFtIHN0YXRlVG9rZW5zICBhbiBhcnJheSBvZiA1IChTVEFURV9MRU5HVEgpIHN0YXRlIHRva2VucworICogXHJldHVybiBpbmRleCBvZiB0aGUgbmV3IHBhcmFtZXRlci4KKyAqLworR0xpbnQKK19tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2Uoc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfc3RhdGVfaW5kZXggc3RhdGVUb2tlbnNbU1RBVEVfTEVOR1RIXSkKK3sKKyAgIGNvbnN0IEdMdWludCBzaXplID0gNDsgLyogWFhYIGZpeCAqLworICAgY2hhciAqbmFtZTsKKyAgIEdMaW50IGluZGV4OworCisgICAvKiBDaGVjayBpZiB0aGUgc3RhdGUgcmVmZXJlbmNlIGlzIGFscmVhZHkgaW4gdGhlIGxpc3QgKi8KKyAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IChHTGludCkgcGFyYW1MaXN0LT5OdW1QYXJhbWV0ZXJzOyBpbmRleCsrKSB7CisgICAgICBpZiAoIW1lbWNtcChwYXJhbUxpc3QtPlBhcmFtZXRlcnNbaW5kZXhdLlN0YXRlSW5kZXhlcywKKwkJICBzdGF0ZVRva2VucywgU1RBVEVfTEVOR1RIICogc2l6ZW9mKGdsX3N0YXRlX2luZGV4KSkpIHsKKwkgcmV0dXJuIGluZGV4OworICAgICAgfQorICAgfQorCisgICBuYW1lID0gX21lc2FfcHJvZ3JhbV9zdGF0ZV9zdHJpbmcoc3RhdGVUb2tlbnMpOworICAgaW5kZXggPSBfbWVzYV9hZGRfcGFyYW1ldGVyKHBhcmFtTGlzdCwgUFJPR1JBTV9TVEFURV9WQVIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgR0xfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAoZ2xfc3RhdGVfaW5kZXggKikgc3RhdGVUb2tlbnMpOworICAgcGFyYW1MaXN0LT5TdGF0ZUZsYWdzIHw9IF9tZXNhX3Byb2dyYW1fc3RhdGVfZmxhZ3Moc3RhdGVUb2tlbnMpOworCisgICAvKiBmcmVlIG5hbWUgc3RyaW5nIGhlcmUgc2luY2Ugd2UgZHVwbGljYXRlZCBpdCBpbiBhZGRfcGFyYW1ldGVyKCkgKi8KKyAgIGZyZWUobmFtZSk7CisKKyAgIHJldHVybiBpbmRleDsKK30KKworCisvKioKKyAqIExvb2t1cCBhIHBhcmFtZXRlciB2YWx1ZSBieSBuYW1lIGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgbGlzdC4KKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgZmxvYXRbNF0gdmFsdWVzLgorICovCitnbF9jb25zdGFudF92YWx1ZSAqCitfbWVzYV9sb29rdXBfcGFyYW1ldGVyX3ZhbHVlKGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgbmFtZUxlbiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIEdMaW50IGkgPSBfbWVzYV9sb29rdXBfcGFyYW1ldGVyX2luZGV4KHBhcmFtTGlzdCwgbmFtZUxlbiwgbmFtZSk7CisgICBpZiAoaSA8IDApCisgICAgICByZXR1cm4gTlVMTDsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlc1tpXTsKK30KKworCisvKioKKyAqIEdpdmVuIGEgcHJvZ3JhbSBwYXJhbWV0ZXIgbmFtZSwgZmluZCBpdHMgcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVycy4KKyAqIFxwYXJhbSBwYXJhbUxpc3QgIHRoZSBwYXJhbWV0ZXIgbGlzdCB0byBzZWFyY2gKKyAqIFxwYXJhbSBuYW1lTGVuICBsZW5ndGggb2YgbmFtZSAoaW4gY2hhcnMpLgorICogICAgICAgICAgICAgICAgIElmIGxlbmd0aCBpcyBuZWdhdGl2ZSwgYXNzdW1lIHRoYXQgbmFtZSBpcyBudWxsLXRlcm1pbmF0ZWQuCisgKiBccGFyYW0gbmFtZSAgdGhlIG5hbWUgdG8gc2VhcmNoIGZvcgorICogXHJldHVybiBpbmRleCBvZiBwYXJhbWV0ZXIgaW4gdGhlIGxpc3QuCisgKi8KK0dMaW50CitfbWVzYV9sb29rdXBfcGFyYW1ldGVyX2luZGV4KGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgbmFtZUxlbiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIEdMaW50IGk7CisKKyAgIGlmICghcGFyYW1MaXN0KQorICAgICAgcmV0dXJuIC0xOworCisgICBpZiAobmFtZUxlbiA9PSAtMSkgeworICAgICAgLyogbmFtZSBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoR0xpbnQpIHBhcmFtTGlzdC0+TnVtUGFyYW1ldGVyczsgaSsrKSB7CisgICAgICAgICBpZiAocGFyYW1MaXN0LT5QYXJhbWV0ZXJzW2ldLk5hbWUgJiYKKwkgICAgIHN0cmNtcChwYXJhbUxpc3QtPlBhcmFtZXRlcnNbaV0uTmFtZSwgbmFtZSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBuYW1lIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQsIHVzZSBuYW1lTGVuICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgKEdMaW50KSBwYXJhbUxpc3QtPk51bVBhcmFtZXRlcnM7IGkrKykgeworICAgICAgICAgaWYgKHBhcmFtTGlzdC0+UGFyYW1ldGVyc1tpXS5OYW1lICYmCisJICAgICBzdHJuY21wKHBhcmFtTGlzdC0+UGFyYW1ldGVyc1tpXS5OYW1lLCBuYW1lLCBuYW1lTGVuKSA9PSAwCisgICAgICAgICAgICAgJiYgc3RybGVuKHBhcmFtTGlzdC0+UGFyYW1ldGVyc1tpXS5OYW1lKSA9PSAoc2l6ZV90KW5hbWVMZW4pCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiAtMTsKK30KKworCisvKioKKyAqIExvb2sgZm9yIGEgZmxvYXQgdmVjdG9yIGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgbGlzdC4gIFRoZSBmbG9hdCB2ZWN0b3IKKyAqIG1heSBiZSBvZiBsZW5ndGggMSwgMiwgMyBvciA0LiAgSWYgc3dpenpsZU91dCBpcyBub24tbnVsbCwgd2UnbGwgdHJ5CisgKiBzd2l6emxpbmcgdG8gZmluZCBhIG1hdGNoLgorICogXHBhcmFtIGxpc3QgIHRoZSBwYXJhbWV0ZXIgbGlzdCB0byBzZWFyY2gKKyAqIFxwYXJhbSB2ICB0aGUgZmxvYXQgdmVjdG9yIHRvIHNlYXJjaCBmb3IKKyAqIFxwYXJhbSB2U2l6ZSAgbnVtYmVyIG9mIGVsZW1lbnQgaW4gdgorICogXHBhcmFtIHBvc091dCAgcmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbnN0YW50LCBpZiBmb3VuZAorICogXHBhcmFtIHN3aXp6bGVPdXQgIHJldHVybnMgYSBzd2l6emxlIG1hc2sgZGVzY3JpYmluZyBsb2NhdGlvbiBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZWxlbWVudHMgaWYgZm91bmQuCisgKiBccmV0dXJuIEdMX1RSVUUgaWYgZm91bmQsIEdMX0ZBTFNFIGlmIG5vdCBmb3VuZAorICovCitHTGJvb2xlYW4KK19tZXNhX2xvb2t1cF9wYXJhbWV0ZXJfY29uc3RhbnQoY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlIHZbXSwgR0x1aW50IHZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCAqcG9zT3V0LCBHTHVpbnQgKnN3aXp6bGVPdXQpCit7CisgICBHTHVpbnQgaTsKKworICAgYXNzZXJ0KHZTaXplID49IDEpOworICAgYXNzZXJ0KHZTaXplIDw9IDQpOworCisgICBpZiAoIWxpc3QpIHsKKyAgICAgICpwb3NPdXQgPSAtMTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IGxpc3QtPk51bVBhcmFtZXRlcnM7IGkrKykgeworICAgICAgaWYgKGxpc3QtPlBhcmFtZXRlcnNbaV0uVHlwZSA9PSBQUk9HUkFNX0NPTlNUQU5UKSB7CisgICAgICAgICBpZiAoIXN3aXp6bGVPdXQpIHsKKyAgICAgICAgICAgIC8qIHN3aXp6bGUgbm90IGFsbG93ZWQgKi8KKyAgICAgICAgICAgIEdMdWludCBqLCBtYXRjaCA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdlNpemU7IGorKykgeworICAgICAgICAgICAgICAgaWYgKHZbal0udSA9PSBsaXN0LT5QYXJhbWV0ZXJWYWx1ZXNbaV1bal0udSkKKyAgICAgICAgICAgICAgICAgIG1hdGNoKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF0Y2ggPT0gdlNpemUpIHsKKyAgICAgICAgICAgICAgICpwb3NPdXQgPSBpOworICAgICAgICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIHRyeSBtYXRjaGluZyB3LyBzd2l6emxlICovCisgICAgICAgICAgICAgaWYgKHZTaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBsb29rIGZvciB2WzBdIGFueXdoZXJlIHdpdGhpbiBmbG9hdFs0XSB2YWx1ZSAqLworICAgICAgICAgICAgICAgIEdMdWludCBqOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaXN0LT5QYXJhbWV0ZXJzW2ldLlNpemU7IGorKykgeworICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LT5QYXJhbWV0ZXJWYWx1ZXNbaV1bal0udSA9PSB2WzBdLnUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VuZCBpdCAqLworICAgICAgICAgICAgICAgICAgICAgICpwb3NPdXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICpzd2l6emxlT3V0ID0gTUFLRV9TV0laWkxFNChqLCBqLCBqLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIGlmICh2U2l6ZSA8PSBsaXN0LT5QYXJhbWV0ZXJzW2ldLlNpemUpIHsKKyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgd2UgY2FuIG1hdGNoIHRoaXMgY29uc3RhbnQgKHdpdGggYSBzd2l6emxlKSAqLworICAgICAgICAgICAgICAgIEdMdWludCBzd3pbNF07CisgICAgICAgICAgICAgICAgR0x1aW50IG1hdGNoID0gMCwgaiwgazsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdlNpemU7IGorKykgeworICAgICAgICAgICAgICAgICAgIGlmICh2W2pdLnUgPT0gbGlzdC0+UGFyYW1ldGVyVmFsdWVzW2ldW2pdLnUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzd3pbal0gPSBqOworICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKys7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBsaXN0LT5QYXJhbWV0ZXJzW2ldLlNpemU7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2W2pdLnUgPT0gbGlzdC0+UGFyYW1ldGVyVmFsdWVzW2ldW2tdLnUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd3pbal0gPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHNtZWFyIGxhc3QgdmFsdWUgdG8gcmVtYWluaW5nIHBvc2l0aW9ucyAqLworICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgNCAmJiBqID4gMDsgaisrKQorICAgICAgICAgICAgICAgICAgIHN3eltqXSA9IHN3eltqLTFdOworCisgICAgICAgICAgICAgICAgaWYgKG1hdGNoID09IHZTaXplKSB7CisgICAgICAgICAgICAgICAgICAgKnBvc091dCA9IGk7CisgICAgICAgICAgICAgICAgICAgKnN3aXp6bGVPdXQgPSBNQUtFX1NXSVpaTEU0KHN3elswXSwgc3d6WzFdLCBzd3pbMl0sIHN3elszXSk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdMX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgKnBvc091dCA9IC0xOworICAgcmV0dXJuIEdMX0ZBTFNFOworfQorCisKK3N0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICoKK19tZXNhX2Nsb25lX3BhcmFtZXRlcl9saXN0KGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpsaXN0KQoreworICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmNsb25lOworICAgR0x1aW50IGk7CisKKyAgIGNsb25lID0gX21lc2FfbmV3X3BhcmFtZXRlcl9saXN0KCk7CisgICBpZiAoIWNsb25lKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIC8qKiBOb3QgdG9vIGVmZmljaWVudCwgYnV0IGNvcnJlY3QgKi8KKyAgIGZvciAoaSA9IDA7IGkgPCBsaXN0LT5OdW1QYXJhbWV0ZXJzOyBpKyspIHsKKyAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlciAqcCA9IGxpc3QtPlBhcmFtZXRlcnMgKyBpOworICAgICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyICpwQ29weTsKKyAgICAgIEdMdWludCBzaXplID0gTUlOMihwLT5TaXplLCA0KTsKKyAgICAgIEdMaW50IGogPSBfbWVzYV9hZGRfcGFyYW1ldGVyKGNsb25lLCBwLT5UeXBlLCBwLT5OYW1lLCBzaXplLCBwLT5EYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QtPlBhcmFtZXRlclZhbHVlc1tpXSwgTlVMTCk7CisgICAgICBBU1NFUlQoaiA+PSAwKTsKKyAgICAgIHBDb3B5ID0gY2xvbmUtPlBhcmFtZXRlcnMgKyBqOworICAgICAgLyogY29weSBzdGF0ZSBpbmRleGVzICovCisgICAgICBpZiAocC0+VHlwZSA9PSBQUk9HUkFNX1NUQVRFX1ZBUikgeworICAgICAgICAgR0xpbnQgazsKKyAgICAgICAgIGZvciAoayA9IDA7IGsgPCBTVEFURV9MRU5HVEg7IGsrKykgeworICAgICAgICAgICAgcENvcHktPlN0YXRlSW5kZXhlc1trXSA9IHAtPlN0YXRlSW5kZXhlc1trXTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgY2xvbmUtPlBhcmFtZXRlcnNbal0uU2l6ZSA9IHAtPlNpemU7CisgICAgICB9CisgICAgICAKKyAgIH0KKworICAgY2xvbmUtPlN0YXRlRmxhZ3MgPSBsaXN0LT5TdGF0ZUZsYWdzOworCisgICByZXR1cm4gY2xvbmU7Cit9CisKKworLyoqCisgKiBSZXR1cm4gYSBuZXcgcGFyYW1ldGVyIGxpc3Qgd2hpY2ggaXMgbGlzdEEgKyBsaXN0Qi4KKyAqLworc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKgorX21lc2FfY29tYmluZV9wYXJhbWV0ZXJfbGlzdHMoY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmxpc3RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmxpc3RCKQoreworICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmxpc3Q7CisKKyAgIGlmIChsaXN0QSkgeworICAgICAgbGlzdCA9IF9tZXNhX2Nsb25lX3BhcmFtZXRlcl9saXN0KGxpc3RBKTsKKyAgICAgIGlmIChsaXN0ICYmIGxpc3RCKSB7CisgICAgICAgICBHTHVpbnQgaTsKKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Qi0+TnVtUGFyYW1ldGVyczsgaSsrKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIgKnBhcmFtID0gbGlzdEItPlBhcmFtZXRlcnMgKyBpOworICAgICAgICAgICAgX21lc2FfYWRkX3BhcmFtZXRlcihsaXN0LCBwYXJhbS0+VHlwZSwgcGFyYW0tPk5hbWUsIHBhcmFtLT5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+RGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RCLT5QYXJhbWV0ZXJWYWx1ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5TdGF0ZUluZGV4ZXMpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZWxzZSBpZiAobGlzdEIpIHsKKyAgICAgIGxpc3QgPSBfbWVzYV9jbG9uZV9wYXJhbWV0ZXJfbGlzdChsaXN0Qik7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGxpc3QgPSBOVUxMOworICAgfQorICAgcmV0dXJuIGxpc3Q7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzYjNjMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHByb2dfcGFyYW1ldGVyLmMKKyAqIFByb2dyYW0gcGFyYW1ldGVyIGxpc3RzIGFuZCBmdW5jdGlvbnMuCisgKiBcYXV0aG9yIEJyaWFuIFBhdWwKKyAqLworCisjaWZuZGVmIFBST0dfUEFSQU1FVEVSX0gKKyNkZWZpbmUgUFJPR19QQVJBTUVURVJfSAorCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJwcm9nX3N0YXRldmFycy5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioKKyAqIEFjdHVhbCBkYXRhIGZvciBjb25zdGFudCB2YWx1ZXMgb2YgcGFyYW1ldGVycy4KKyAqLwordHlwZWRlZiB1bmlvbiBnbF9jb25zdGFudF92YWx1ZQoreworICAgR0xmbG9hdCBmOworICAgR0xpbnQgYjsKKyAgIEdMaW50IGk7CisgICBHTHVpbnQgdTsKK30gZ2xfY29uc3RhbnRfdmFsdWU7CisKKworLyoqCisgKiBQcm9ncmFtIHBhcmFtZXRlci4KKyAqIFVzZWQgYnkgc2hhZGVycy9wcm9ncmFtcyBmb3IgdW5pZm9ybXMsIGNvbnN0YW50cywgdmFyeWluZyB2YXJzLCBldGMuCisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcgoreworICAgY29uc3QgY2hhciAqTmFtZTsgICAgICAgIC8qKjwgTnVsbC10ZXJtaW5hdGVkIHN0cmluZyAqLworICAgZ2xfcmVnaXN0ZXJfZmlsZSBUeXBlOyAgIC8qKjwgUFJPR1JBTV9DT05TVEFOVCBvciBTVEFURV9WQVIgKi8KKyAgIEdMZW51bSBEYXRhVHlwZTsgICAgICAgICAvKio8IEdMX0ZMT0FULCBHTF9GTE9BVF9WRUMyLCBldGMgKi8KKyAgIC8qKgorICAgICogTnVtYmVyIG9mIGNvbXBvbmVudHMgKDEuLjQpLCBvciBtb3JlLgorICAgICogSWYgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGlzIGdyZWF0ZXIgdGhhbiA0LAorICAgICogdGhpcyBwYXJhbWV0ZXIgaXMgcGFydCBvZiBhIGxhcmdlciB1bmlmb3JtIGxpa2UgYSBHTFNMIG1hdHJpeCBvciBhcnJheS4KKyAgICAqIFRoZSBuZXh0IHByb2dyYW0gcGFyYW1ldGVyJ3MgU2l6ZSB3aWxsIGJlIFNpemUtNCBvZiB0aGlzIHBhcmFtZXRlci4KKyAgICAqLworICAgR0x1aW50IFNpemU7CisgICBHTGJvb2xlYW4gSW5pdGlhbGl6ZWQ7ICAgLyoqPCBkZWJ1ZzogSGFzIHRoZSBQYXJhbWV0ZXJWYWx1ZVtdIGJlZW4gc2V0PyAqLworICAgLyoqCisgICAgKiBBIHNlcXVlbmNlIG9mIFNUQVRFXyogdG9rZW5zIGFuZCBpbnRlZ2VycyB0byBpZGVudGlmeSBHTCBzdGF0ZS4KKyAgICAqLworICAgZ2xfc3RhdGVfaW5kZXggU3RhdGVJbmRleGVzW1NUQVRFX0xFTkdUSF07Cit9OworCisKKy8qKgorICogTGlzdCBvZiBnbF9wcm9ncmFtX3BhcmFtZXRlciBpbnN0YW5jZXMuCisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0Cit7CisgICBHTHVpbnQgU2l6ZTsgICAgICAgICAgIC8qKjwgYWxsb2NhdGVkIHNpemUgb2YgUGFyYW1ldGVycywgUGFyYW1ldGVyVmFsdWVzICovCisgICBHTHVpbnQgTnVtUGFyYW1ldGVyczsgIC8qKjwgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gYXJyYXlzICovCisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIgKlBhcmFtZXRlcnM7IC8qKjwgQXJyYXkgW1NpemVdICovCisgICBnbF9jb25zdGFudF92YWx1ZSAoKlBhcmFtZXRlclZhbHVlcylbNF07IC8qKjwgQXJyYXkgW1NpemVdIG9mIGNvbnN0YW50WzRdICovCisgICBHTGJpdGZpZWxkIFN0YXRlRmxhZ3M7IC8qKjwgX05FV18qIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggc3RhdGUgY2hhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZ2h0IGludmFsaWRhdGUgUGFyYW1ldGVyVmFsdWVzW10gKi8KK307CisKKworZXh0ZXJuIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICoKK19tZXNhX25ld19wYXJhbWV0ZXJfbGlzdCh2b2lkKTsKKworZXh0ZXJuIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICoKK19tZXNhX25ld19wYXJhbWV0ZXJfbGlzdF9zaXplZCh1bnNpZ25lZCBzaXplKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZyZWVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtTGlzdCk7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqCitfbWVzYV9jbG9uZV9wYXJhbWV0ZXJfbGlzdChjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqbGlzdCk7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqCitfbWVzYV9jb21iaW5lX3BhcmFtZXRlcl9saXN0cyhjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpiKTsKKworc3RhdGljIGlubGluZSBHTHVpbnQKK19tZXNhX251bV9wYXJhbWV0ZXJzKGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpsaXN0KQoreworICAgcmV0dXJuIGxpc3QgPyBsaXN0LT5OdW1QYXJhbWV0ZXJzIDogMDsKK30KKworZXh0ZXJuIEdMaW50CitfbWVzYV9hZGRfcGFyYW1ldGVyKHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3QsCisgICAgICAgICAgICAgICAgICAgIGdsX3JlZ2lzdGVyX2ZpbGUgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgR0x1aW50IHNpemUsIEdMZW51bSBkYXRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfY29uc3RhbnRfdmFsdWUgKnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfc3RhdGVfaW5kZXggc3RhdGVbU1RBVEVfTEVOR1RIXSk7CisKK2V4dGVybiBHTGludAorX21lc2FfYWRkX25hbWVkX2NvbnN0YW50KHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZ2xfY29uc3RhbnRfdmFsdWUgdmFsdWVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBzaXplKTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9hZGRfdHlwZWRfdW5uYW1lZF9jb25zdGFudChzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfY29uc3RhbnRfdmFsdWUgdmFsdWVzWzRdLCBHTHVpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBkYXRhdHlwZSwgR0x1aW50ICpzd2l6emxlT3V0KTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9hZGRfdW5uYW1lZF9jb25zdGFudChzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfY29uc3RhbnRfdmFsdWUgdmFsdWVzWzRdLCBHTHVpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCAqc3dpenpsZU91dCk7CisKK2V4dGVybiBHTGludAorX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZShzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbF9zdGF0ZV9pbmRleCBzdGF0ZVRva2Vuc1tTVEFURV9MRU5HVEhdKTsKKworZXh0ZXJuIGdsX2NvbnN0YW50X3ZhbHVlICoKK19tZXNhX2xvb2t1cF9wYXJhbWV0ZXJfdmFsdWUoY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnBhcmFtTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBuYW1lTGVuLCBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9sb29rdXBfcGFyYW1ldGVyX2luZGV4KGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgbmFtZUxlbiwgY29uc3QgY2hhciAqbmFtZSk7CisKK2V4dGVybiBHTGJvb2xlYW4KK19tZXNhX2xvb2t1cF9wYXJhbWV0ZXJfY29uc3RhbnQoY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlIHZbXSwgR0x1aW50IHZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCAqcG9zT3V0LCBHTHVpbnQgKnN3aXp6bGVPdXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUFJPR19QQVJBTUVURVJfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX3BhcmFtZXRlcl9sYXlvdXQuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXJfbGF5b3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzNDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXJfbGF5b3V0LmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHByb2dfcGFyYW1ldGVyX2xheW91dC5jCisgKiBcYnJpZWYgSGVscGVyIGZ1bmN0aW9ucyB0byBsYXlvdXQgc3RvcmFnZSBmb3IgcHJvZ3JhbSBwYXJhbWV0ZXJzCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSAibWFpbi9jb21waWxlci5oIgorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAicHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJwcm9nX3BhcmFtZXRlcl9sYXlvdXQuaCIKKyNpbmNsdWRlICJwcm9nX2luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAicHJvZ3JhbV9wYXJzZXIuaCIKKwordW5zaWduZWQKK19tZXNhX2NvbWJpbmVfc3dpenpsZXModW5zaWduZWQgYmFzZSwgdW5zaWduZWQgYXBwbGllZCkKK3sKKyAgIHVuc2lnbmVkIHN3aXogPSAwOworICAgdW5zaWduZWQgaTsKKworICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgY29uc3QgdW5zaWduZWQgcyA9IEdFVF9TV1ooYXBwbGllZCwgaSk7CisKKyAgICAgIHN3aXogfD0gKChzIDw9IFNXSVpaTEVfVykgPyBHRVRfU1daKGJhc2UsIHMpIDogcykgPDwgKGkgKiAzKTsKKyAgIH0KKworICAgcmV0dXJuIHN3aXo7Cit9CisKKworLyoqCisgKiBDb3B5IGluZGlyZWN0IGFjY2VzcyBhcnJheSBmcm9tIG9uZSBwYXJhbWV0ZXIgbGlzdCB0byBhbm90aGVyCisgKgorICogXHBhcmFtIHNyYyAgIFBhcmFtZXRlciBhcnJheSBjb3BpZWQgZnJvbQorICogXHBhcmFtIGRzdCAgIFBhcmFtZXRlciBhcnJheSBjb3BpZWQgdG8KKyAqIFxwYXJhbSBmaXJzdCBJbmRleCBvZiBmaXJzdCBlbGVtZW50IGluIFxjIHNyYyB0byBjb3B5CisgKiBccGFyYW0gY291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkKKyAqCisgKiBccmV0dXJuCisgKiBUaGUgbG9jYXRpb24gaW4gXGMgZHN0IG9mIHRoZSBmaXJzdCBlbGVtZW50IGNvcGllZCBmcm9tIFxjIHNyYyBvbgorICogc3VjY2Vzcy4gIC0xIG9uIGZhaWx1cmUuCisgKgorICogXHdhcm5pbmcKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGFscmVhZHkgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbgorICogXGMgZHN0IHRvIGhvbGQgYWxsIG9mIHRoZSBlbGVtZW50cyB0aGF0IHdpbGwgYmUgY29waWVkIG92ZXIuCisgKi8KK3N0YXRpYyBpbnQKK2NvcHlfaW5kaXJlY3RfYWNjZXNzZWRfYXJyYXkoc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKnNyYywKKwkJCSAgICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmRzdCwKKwkJCSAgICAgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIGNvdW50KQoreworICAgY29uc3QgaW50IGJhc2UgPSBkc3QtPk51bVBhcmFtZXRlcnM7CisgICB1bnNpZ25lZCBpLCBqOworCisgICBmb3IgKGkgPSBmaXJzdDsgaSA8IChmaXJzdCArIGNvdW50KTsgaSsrKSB7CisgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIgKmN1cnIgPSAmIHNyYy0+UGFyYW1ldGVyc1tpXTsKKworICAgICAgaWYgKGN1cnItPlR5cGUgPT0gUFJPR1JBTV9DT05TVEFOVCkgeworCSBqID0gZHN0LT5OdW1QYXJhbWV0ZXJzOworICAgICAgfSBlbHNlIHsKKwkgZm9yIChqID0gMDsgaiA8IGRzdC0+TnVtUGFyYW1ldGVyczsgaisrKSB7CisJICAgIGlmIChtZW1jbXAoZHN0LT5QYXJhbWV0ZXJzW2pdLlN0YXRlSW5kZXhlcywgY3Vyci0+U3RhdGVJbmRleGVzLCAKKwkJICAgICAgIHNpemVvZihjdXJyLT5TdGF0ZUluZGV4ZXMpKSA9PSAwKSB7CisJICAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCSB9CisgICAgICB9CisKKyAgICAgIGFzc2VydChqID09IGRzdC0+TnVtUGFyYW1ldGVycyk7CisKKyAgICAgIC8qIGNvcHkgc3JjIHBhcmFtZXRlciBbaV0gdG8gZGVzdCBwYXJhbWV0ZXIgW2pdICovCisgICAgICBtZW1jcHkoJiBkc3QtPlBhcmFtZXRlcnNbal0sIGN1cnIsCisJICAgICBzaXplb2YoZHN0LT5QYXJhbWV0ZXJzW2pdKSk7CisgICAgICBtZW1jcHkoZHN0LT5QYXJhbWV0ZXJWYWx1ZXNbal0sIHNyYy0+UGFyYW1ldGVyVmFsdWVzW2ldLAorCSAgICAgc2l6ZW9mKEdMZmxvYXQpICogNCk7CisKKyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHN0cmluZyBuYW1lIHdhcyBjb3BpZWQuICBOdWxsLW91dCBzcmMgcGFyYW0gbmFtZQorICAgICAgICogdG8gcHJldmVudCBkb3VibGUgZnJlZSBsYXRlci4KKyAgICAgICAqLworICAgICAgY3Vyci0+TmFtZSA9IE5VTEw7CisKKyAgICAgIGRzdC0+TnVtUGFyYW1ldGVycysrOworICAgfQorCisgICByZXR1cm4gYmFzZTsKK30KKworCisvKioKKyAqIFhYWCBkZXNjcmlwdGlvbj8/PworICogXHJldHVybiBHTF9UUlVFIGZvciBzdWNjZXNzLCBHTF9GQUxTRSBmb3IgZmFpbHVyZQorICovCitHTGJvb2xlYW4KK19tZXNhX2xheW91dF9wYXJhbWV0ZXJzKHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpsYXlvdXQ7CisgICBzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICppbnN0OworICAgdW5zaWduZWQgaTsKKworICAgbGF5b3V0ID0KKyAgICAgIF9tZXNhX25ld19wYXJhbWV0ZXJfbGlzdF9zaXplZChzdGF0ZS0+cHJvZy0+UGFyYW1ldGVycy0+TnVtUGFyYW1ldGVycyk7CisKKyAgIC8qIFBBU1MgMTogIE1vdmUgYW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgYWNjZXNzZWQgaW5kaXJlY3RseSBmcm9tIHRoZQorICAgICogb3JpZ2luYWwgcGFyYW1ldGVyIGxpc3QgdG8gdGhlIG5ldyBwYXJhbWV0ZXIgbGlzdC4KKyAgICAqLworICAgZm9yIChpbnN0ID0gc3RhdGUtPmluc3RfaGVhZDsgaW5zdCAhPSBOVUxMOyBpbnN0ID0gaW5zdC0+bmV4dCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCSBpZiAoaW5zdC0+U3JjUmVnW2ldLkJhc2UuUmVsQWRkcikgeworCSAgICAvKiBPbmx5IGF0dGVtcHQgdG8gYWRkIHRoZSB0byB0aGUgbmV3IHBhcmFtZXRlciBsaXN0IG9uY2UuCisJICAgICAqLworCSAgICBpZiAoIWluc3QtPlNyY1JlZ1tpXS5TeW1ib2wtPnBhc3MxX2RvbmUpIHsKKwkgICAgICAgY29uc3QgaW50IG5ld19iZWdpbiA9CisJCSAgY29weV9pbmRpcmVjdF9hY2Nlc3NlZF9hcnJheShzdGF0ZS0+cHJvZy0+UGFyYW1ldGVycywgbGF5b3V0LAorCQkgICAgICBpbnN0LT5TcmNSZWdbaV0uU3ltYm9sLT5wYXJhbV9iaW5kaW5nX2JlZ2luLAorCQkgICAgICBpbnN0LT5TcmNSZWdbaV0uU3ltYm9sLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCk7CisKKwkgICAgICAgaWYgKG5ld19iZWdpbiA8IDApIHsKKwkJICBfbWVzYV9mcmVlX3BhcmFtZXRlcl9saXN0KGxheW91dCk7CisJCSAgcmV0dXJuIEdMX0ZBTFNFOworCSAgICAgICB9CisKKwkgICAgICAgaW5zdC0+U3JjUmVnW2ldLlN5bWJvbC0+cGFyYW1fYmluZGluZ19iZWdpbiA9IG5ld19iZWdpbjsKKwkgICAgICAgaW5zdC0+U3JjUmVnW2ldLlN5bWJvbC0+cGFzczFfZG9uZSA9IDE7CisJICAgIH0KKworCSAgICAvKiBQcmV2aW91c2x5IHRoZSBJbmRleCB3YXMganVzdCB0aGUgb2Zmc2V0IGZyb20gdGhlIHBhcmFtZXRlcgorCSAgICAgKiBhcnJheS4gIE5vdyB0aGF0IHRoZSBiYXNlIG9mIHRoZSBwYXJhbWV0ZXIgYXJyYXkgaXMga25vd24sIHRoZQorCSAgICAgKiBpbmRleCBjYW4gYmUgdXBkYXRlZCB0byBpdHMgYWN0dWFsIHZhbHVlLgorCSAgICAgKi8KKwkgICAgaW5zdC0+QmFzZS5TcmNSZWdbaV0gPSBpbnN0LT5TcmNSZWdbaV0uQmFzZTsKKwkgICAgaW5zdC0+QmFzZS5TcmNSZWdbaV0uSW5kZXggKz0KKwkgICAgICAgaW5zdC0+U3JjUmVnW2ldLlN5bWJvbC0+cGFyYW1fYmluZGluZ19iZWdpbjsKKwkgfQorICAgICAgfQorICAgfQorCisgICAvKiBQQVNTIDI6ICBNb3ZlIGFueSBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBhY2Nlc3NlZCBpbmRpcmVjdGx5IGZyb20gdGhlCisgICAgKiBvcmlnaW5hbCBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgbmV3IHBhcmFtZXRlciBsaXN0LgorICAgICovCisgICBmb3IgKGluc3QgPSBzdGF0ZS0+aW5zdF9oZWFkOyBpbnN0ICE9IE5VTEw7IGluc3QgPSBpbnN0LT5uZXh0KSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlciAqcDsKKwkgY29uc3QgaW50IGlkeCA9IGluc3QtPlNyY1JlZ1tpXS5CYXNlLkluZGV4OworCSB1bnNpZ25lZCBzd2l6emxlID0gU1dJWlpMRV9OT09QOworCisJIC8qIEFsbCByZWxhdGl2ZSBhZGRyZXNzZWQgb3BlcmFuZHMgd2VyZSBwcm9jZXNzZWQgb24gdGhlIGZpcnN0CisJICAqIHBhc3MuICBKdXN0IHNraXAgdGhlbSBoZXJlLgorCSAgKi8KKwkgaWYgKGluc3QtPlNyY1JlZ1tpXS5CYXNlLlJlbEFkZHIpIHsKKwkgICAgY29udGludWU7CisJIH0KKworCSBpZiAoKGluc3QtPlNyY1JlZ1tpXS5CYXNlLkZpbGUgPD0gUFJPR1JBTV9PVVRQVVQpCisJICAgICB8fCAoaW5zdC0+U3JjUmVnW2ldLkJhc2UuRmlsZSA+PSBQUk9HUkFNX1dSSVRFX09OTFkpKSB7CisJICAgIGNvbnRpbnVlOworCSB9CisKKwkgaW5zdC0+QmFzZS5TcmNSZWdbaV0gPSBpbnN0LT5TcmNSZWdbaV0uQmFzZTsKKwkgcCA9ICYgc3RhdGUtPnByb2ctPlBhcmFtZXRlcnMtPlBhcmFtZXRlcnNbaWR4XTsKKworCSBzd2l0Y2ggKHAtPlR5cGUpIHsKKwkgY2FzZSBQUk9HUkFNX0NPTlNUQU5UOiB7CisJICAgIGNvbnN0IGdsX2NvbnN0YW50X3ZhbHVlICpjb25zdCB2ID0KKwkgICAgICAgc3RhdGUtPnByb2ctPlBhcmFtZXRlcnMtPlBhcmFtZXRlclZhbHVlc1tpZHhdOworCisJICAgIGluc3QtPkJhc2UuU3JjUmVnW2ldLkluZGV4ID0KKwkgICAgICAgX21lc2FfYWRkX3VubmFtZWRfY29uc3RhbnQobGF5b3V0LCB2LCBwLT5TaXplLCAmIHN3aXp6bGUpOworCisJICAgIGluc3QtPkJhc2UuU3JjUmVnW2ldLlN3aXp6bGUgPSAKKwkgICAgICAgX21lc2FfY29tYmluZV9zd2l6emxlcyhzd2l6emxlLCBpbnN0LT5CYXNlLlNyY1JlZ1tpXS5Td2l6emxlKTsKKwkgICAgYnJlYWs7CisJIH0KKworCSBjYXNlIFBST0dSQU1fU1RBVEVfVkFSOgorCSAgICBpbnN0LT5CYXNlLlNyY1JlZ1tpXS5JbmRleCA9CisJICAgICAgIF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UobGF5b3V0LCBwLT5TdGF0ZUluZGV4ZXMpOworCSAgICBicmVhazsKKworCSBkZWZhdWx0OgorCSAgICBicmVhazsKKwkgfQorCisJIGluc3QtPlNyY1JlZ1tpXS5CYXNlLkZpbGUgPSBwLT5UeXBlOworCSBpbnN0LT5CYXNlLlNyY1JlZ1tpXS5GaWxlID0gcC0+VHlwZTsKKyAgICAgIH0KKyAgIH0KKworICAgbGF5b3V0LT5TdGF0ZUZsYWdzID0gc3RhdGUtPnByb2ctPlBhcmFtZXRlcnMtPlN0YXRlRmxhZ3M7CisgICBfbWVzYV9mcmVlX3BhcmFtZXRlcl9saXN0KHN0YXRlLT5wcm9nLT5QYXJhbWV0ZXJzKTsKKyAgIHN0YXRlLT5wcm9nLT5QYXJhbWV0ZXJzID0gbGF5b3V0OworCisgICByZXR1cm4gR0xfVFJVRTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wYXJhbWV0ZXJfbGF5b3V0LmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfcGFyYW1ldGVyX2xheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTdiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfcGFyYW1ldGVyX2xheW91dC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHByb2dfcGFyYW1ldGVyX2xheW91dC5oCisgKiBcYnJpZWYgSGVscGVyIGZ1bmN0aW9ucyB0byBsYXlvdXQgc3RvcmFnZSBmb3IgcHJvZ3JhbSBwYXJhbWV0ZXJzCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmbmRlZiBQUk9HX1BBUkFNRVRFUl9MQVlPVVRfSAorI2RlZmluZSBQUk9HX1BBUkFNRVRFUl9MQVlPVVRfSAorCitleHRlcm4gdW5zaWduZWQgX21lc2FfY29tYmluZV9zd2l6emxlcyh1bnNpZ25lZCBiYXNlLCB1bnNpZ25lZCBhcHBsaWVkKTsKKworc3RydWN0IGFzbV9wYXJzZXJfc3RhdGU7CisKK2V4dGVybiBHTGJvb2xlYW4gX21lc2FfbGF5b3V0X3BhcmFtZXRlcnMoc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKTsKKworI2VuZGlmIC8qIFBST0dfUEFSQU1FVEVSX0xBWU9VVF9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfcHJpbnQuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNWMxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfcHJpbnQuYwpAQCAtMCwwICsxLDEwOTIgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDggIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBWTXdhcmUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHByb2dfcHJpbnQuYworICogUHJpbnQgdmVydGV4L2ZyYWdtZW50IHByb2dyYW1zIC0gZm9yIGRlYnVnZ2luZy4KKyAqIFxhdXRob3IgQnJpYW4gUGF1bAorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPiAgLyogZm9yIFBSSXg2NCBtYWNybyAqLworCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vY29udGV4dC5oIgorI2luY2x1ZGUgIm1haW4vaW1wb3J0cy5oIgorI2luY2x1ZGUgInByb2dfaW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJwcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgInByb2dfcHJpbnQuaCIKKyNpbmNsdWRlICJwcm9nX3N0YXRldmFycy5oIgorCisKKworLyoqCisgKiBSZXR1cm4gc3RyaW5nIG5hbWUgZm9yIGdpdmVuIHByb2dyYW0vcmVnaXN0ZXIgZmlsZS4KKyAqLworY29uc3QgY2hhciAqCitfbWVzYV9yZWdpc3Rlcl9maWxlX25hbWUoZ2xfcmVnaXN0ZXJfZmlsZSBmKQoreworICAgc3dpdGNoIChmKSB7CisgICBjYXNlIFBST0dSQU1fVEVNUE9SQVJZOgorICAgICAgcmV0dXJuICJURU1QIjsKKyAgIGNhc2UgUFJPR1JBTV9TVEFURV9WQVI6CisgICAgICByZXR1cm4gIlNUQVRFIjsKKyAgIGNhc2UgUFJPR1JBTV9JTlBVVDoKKyAgICAgIHJldHVybiAiSU5QVVQiOworICAgY2FzZSBQUk9HUkFNX09VVFBVVDoKKyAgICAgIHJldHVybiAiT1VUUFVUIjsKKyAgIGNhc2UgUFJPR1JBTV9DT05TVEFOVDoKKyAgICAgIHJldHVybiAiQ09OU1QiOworICAgY2FzZSBQUk9HUkFNX1VOSUZPUk06CisgICAgICByZXR1cm4gIlVOSUZPUk0iOworICAgY2FzZSBQUk9HUkFNX0FERFJFU1M6CisgICAgICByZXR1cm4gIkFERFIiOworICAgY2FzZSBQUk9HUkFNX1NBTVBMRVI6CisgICAgICByZXR1cm4gIlNBTVBMRVIiOworICAgY2FzZSBQUk9HUkFNX1NZU1RFTV9WQUxVRToKKyAgICAgIHJldHVybiAiU1lTVkFMIjsKKyAgIGNhc2UgUFJPR1JBTV9VTkRFRklORUQ6CisgICAgICByZXR1cm4gIlVOREVGSU5FRCI7CisgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICAgc3RhdGljIGNoYXIgc1syMF07CisgICAgICAgICBfbWVzYV9zbnByaW50ZihzLCBzaXplb2YocyksICJGSUxFJXUiLCBmKTsKKyAgICAgICAgIHJldHVybiBzOworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogUmV0dXJuIEFSQl92L2ZfcHJvZy1zdHlsZSBpbnB1dCBhdHRyaWIgc3RyaW5nLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCithcmJfaW5wdXRfYXR0cmliX3N0cmluZyhHTGludCBpbmRleCwgR0xlbnVtIHByb2dUeXBlKQoreworICAgLyoKKyAgICAqIFRoZXNlIHN0cmluZ3Mgc2hvdWxkIG1hdGNoIHRoZSBWRVJUX0FUVFJJQl94IGFuZCBWQVJZSU5HX1NMT1RfeCB0b2tlbnMuCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ZXJ0QXR0cmlic1tdID0geworICAgICAgInZlcnRleC5wb3NpdGlvbiIsCisgICAgICAidmVydGV4LndlaWdodCIsCisgICAgICAidmVydGV4Lm5vcm1hbCIsCisgICAgICAidmVydGV4LmNvbG9yLnByaW1hcnkiLAorICAgICAgInZlcnRleC5jb2xvci5zZWNvbmRhcnkiLAorICAgICAgInZlcnRleC5mb2djb29yZCIsCisgICAgICAidmVydGV4LihzaXgpIiwgLyogVkVSVF9BVFRSSUJfQ09MT1JfSU5ERVggKi8KKyAgICAgICJ2ZXJ0ZXguKHNldmVuKSIsIC8qIFZFUlRfQVRUUklCX0VER0VGTEFHICovCisgICAgICAidmVydGV4LnRleGNvb3JkWzBdIiwKKyAgICAgICJ2ZXJ0ZXgudGV4Y29vcmRbMV0iLAorICAgICAgInZlcnRleC50ZXhjb29yZFsyXSIsCisgICAgICAidmVydGV4LnRleGNvb3JkWzNdIiwKKyAgICAgICJ2ZXJ0ZXgudGV4Y29vcmRbNF0iLAorICAgICAgInZlcnRleC50ZXhjb29yZFs1XSIsCisgICAgICAidmVydGV4LnRleGNvb3JkWzZdIiwKKyAgICAgICJ2ZXJ0ZXgudGV4Y29vcmRbN10iLAorICAgICAgInZlcnRleC4oc2l4dGVlbikiLCAvKiBWRVJUX0FUVFJJQl9QT0lOVF9TSVpFICovCisgICAgICAidmVydGV4LmF0dHJpYlswXSIsCisgICAgICAidmVydGV4LmF0dHJpYlsxXSIsCisgICAgICAidmVydGV4LmF0dHJpYlsyXSIsCisgICAgICAidmVydGV4LmF0dHJpYlszXSIsCisgICAgICAidmVydGV4LmF0dHJpYls0XSIsCisgICAgICAidmVydGV4LmF0dHJpYls1XSIsCisgICAgICAidmVydGV4LmF0dHJpYls2XSIsCisgICAgICAidmVydGV4LmF0dHJpYls3XSIsCisgICAgICAidmVydGV4LmF0dHJpYls4XSIsCisgICAgICAidmVydGV4LmF0dHJpYls5XSIsCisgICAgICAidmVydGV4LmF0dHJpYlsxMF0iLAorICAgICAgInZlcnRleC5hdHRyaWJbMTFdIiwKKyAgICAgICJ2ZXJ0ZXguYXR0cmliWzEyXSIsCisgICAgICAidmVydGV4LmF0dHJpYlsxM10iLAorICAgICAgInZlcnRleC5hdHRyaWJbMTRdIiwKKyAgICAgICJ2ZXJ0ZXguYXR0cmliWzE1XSIgLyogTUFYX1ZBUllJTkcgPSAxNiAqLworICAgfTsKKyAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmcmFnQXR0cmlic1tdID0geworICAgICAgImZyYWdtZW50LnBvc2l0aW9uIiwKKyAgICAgICJmcmFnbWVudC5jb2xvci5wcmltYXJ5IiwKKyAgICAgICJmcmFnbWVudC5jb2xvci5zZWNvbmRhcnkiLAorICAgICAgImZyYWdtZW50LmZvZ2Nvb3JkIiwKKyAgICAgICJmcmFnbWVudC50ZXhjb29yZFswXSIsCisgICAgICAiZnJhZ21lbnQudGV4Y29vcmRbMV0iLAorICAgICAgImZyYWdtZW50LnRleGNvb3JkWzJdIiwKKyAgICAgICJmcmFnbWVudC50ZXhjb29yZFszXSIsCisgICAgICAiZnJhZ21lbnQudGV4Y29vcmRbNF0iLAorICAgICAgImZyYWdtZW50LnRleGNvb3JkWzVdIiwKKyAgICAgICJmcmFnbWVudC50ZXhjb29yZFs2XSIsCisgICAgICAiZnJhZ21lbnQudGV4Y29vcmRbN10iLAorICAgICAgImZyYWdtZW50Lih0d2VsdmUpIiwgLyogVkFSWUlOR19TTE9UX1BTSVogKi8KKyAgICAgICJmcmFnbWVudC4odGhpcnRlZW4pIiwgLyogVkFSWUlOR19TTE9UX0JGQzAgKi8KKyAgICAgICJmcmFnbWVudC4oZm91cnRlZW4pIiwgLyogVkFSWUlOR19TTE9UX0JGQzEgKi8KKyAgICAgICJmcmFnbWVudC4oZmlmdGVlbikiLCAvKiBWQVJZSU5HX1NMT1RfRURHRSAqLworICAgICAgImZyYWdtZW50LihzaXh0ZWVuKSIsIC8qIFZBUllJTkdfU0xPVF9DTElQX1ZFUlRFWCAqLworICAgICAgImZyYWdtZW50LihzZXZlbnRlZW4pIiwgLyogVkFSWUlOR19TTE9UX0NMSVBfRElTVDAgKi8KKyAgICAgICJmcmFnbWVudC4oZWlnaHRlZW4pIiwgLyogVkFSWUlOR19TTE9UX0NMSVBfRElTVDEgKi8KKyAgICAgICJmcmFnbWVudC4obmluZXRlZW4pIiwgLyogVkFSWUlOR19TTE9UX1BSSU1JVElWRV9JRCAqLworICAgICAgImZyYWdtZW50Lih0d2VudHkpIiwgLyogVkFSWUlOR19TTE9UX0xBWUVSICovCisgICAgICAiZnJhZ21lbnQuKHR3ZW50eS1vbmUpIiwgLyogVkFSWUlOR19TTE9UX1ZJRVdQT1JUICovCisgICAgICAiZnJhZ21lbnQuKHR3ZW50eS10d28pIiwgLyogVkFSWUlOR19TTE9UX0ZBQ0UgKi8KKyAgICAgICJmcmFnbWVudC4odHdlbnR5LXRocmVlKSIsIC8qIFZBUllJTkdfU0xPVF9QTlRDICovCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1swXSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1sxXSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1syXSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1szXSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1s0XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1s1XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1s2XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1s3XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1s4XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1s5XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1sxMF0iLAorICAgICAgImZyYWdtZW50LnZhcnlpbmdbMTFdIiwKKyAgICAgICJmcmFnbWVudC52YXJ5aW5nWzEyXSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1sxM10iLAorICAgICAgImZyYWdtZW50LnZhcnlpbmdbMTRdIiwKKyAgICAgICJmcmFnbWVudC52YXJ5aW5nWzE1XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1sxNl0iLAorICAgICAgImZyYWdtZW50LnZhcnlpbmdbMTddIiwKKyAgICAgICJmcmFnbWVudC52YXJ5aW5nWzE4XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1sxOV0iLAorICAgICAgImZyYWdtZW50LnZhcnlpbmdbMjBdIiwKKyAgICAgICJmcmFnbWVudC52YXJ5aW5nWzIxXSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1syMl0iLAorICAgICAgImZyYWdtZW50LnZhcnlpbmdbMjNdIiwKKyAgICAgICJmcmFnbWVudC52YXJ5aW5nWzI0XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1syNV0iLAorICAgICAgImZyYWdtZW50LnZhcnlpbmdbMjZdIiwKKyAgICAgICJmcmFnbWVudC52YXJ5aW5nWzI3XSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1syOF0iLAorICAgICAgImZyYWdtZW50LnZhcnlpbmdbMjldIiwKKyAgICAgICJmcmFnbWVudC52YXJ5aW5nWzMwXSIsCisgICAgICAiZnJhZ21lbnQudmFyeWluZ1szMV0iLCAvKiBNQVhfVkFSWUlORyA9IDMyICovCisgICB9OworCisgICAvKiBzYW5pdHkgY2hlY2tzICovCisgICBTVEFUSUNfQVNTRVJUKEVsZW1lbnRzKHZlcnRBdHRyaWJzKSA9PSBWRVJUX0FUVFJJQl9NQVgpOworICAgU1RBVElDX0FTU0VSVChFbGVtZW50cyhmcmFnQXR0cmlicykgPT0gVkFSWUlOR19TTE9UX01BWCk7CisgICBhc3NlcnQoc3RyY21wKHZlcnRBdHRyaWJzW1ZFUlRfQVRUUklCX1RFWDBdLCAidmVydGV4LnRleGNvb3JkWzBdIikgPT0gMCk7CisgICBhc3NlcnQoc3RyY21wKHZlcnRBdHRyaWJzW1ZFUlRfQVRUUklCX0dFTkVSSUMxNV0sICJ2ZXJ0ZXguYXR0cmliWzE1XSIpID09IDApOworICAgYXNzZXJ0KHN0cmNtcChmcmFnQXR0cmlic1tWQVJZSU5HX1NMT1RfVEVYMF0sICJmcmFnbWVudC50ZXhjb29yZFswXSIpID09IDApOworICAgYXNzZXJ0KHN0cmNtcChmcmFnQXR0cmlic1tWQVJZSU5HX1NMT1RfVkFSMCsxNV0sICJmcmFnbWVudC52YXJ5aW5nWzE1XSIpID09IDApOworCisgICBpZiAocHJvZ1R5cGUgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCKSB7CisgICAgICBhc3NlcnQoaW5kZXggPCBFbGVtZW50cyh2ZXJ0QXR0cmlicykpOworICAgICAgcmV0dXJuIHZlcnRBdHRyaWJzW2luZGV4XTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgYXNzZXJ0KHByb2dUeXBlID09IEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCKTsKKyAgICAgIGFzc2VydChpbmRleCA8IEVsZW1lbnRzKGZyYWdBdHRyaWJzKSk7CisgICAgICByZXR1cm4gZnJhZ0F0dHJpYnNbaW5kZXhdOworICAgfQorfQorCisKKy8qKgorICogUHJpbnQgYSB2ZXJ0ZXggcHJvZ3JhbSdzIElucHV0c1JlYWQgZmllbGQgaW4gaHVtYW4tcmVhZGFibGUgZm9ybWF0LgorICogRm9yIGRlYnVnZ2luZy4KKyAqLwordm9pZAorX21lc2FfcHJpbnRfdnBfaW5wdXRzKEdMYml0ZmllbGQgaW5wdXRzKQoreworICAgcHJpbnRmKCJWUCBJbnB1dHMgMHgleDogXG4iLCBpbnB1dHMpOworICAgd2hpbGUgKGlucHV0cykgeworICAgICAgR0xpbnQgYXR0ciA9IGZmcyhpbnB1dHMpIC0gMTsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBhcmJfaW5wdXRfYXR0cmliX3N0cmluZyhhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQik7CisgICAgICBwcmludGYoIiAgJWQ6ICVzXG4iLCBhdHRyLCBuYW1lKTsKKyAgICAgIGlucHV0cyAmPSB+KDEgPDwgYXR0cik7CisgICB9Cit9CisKKworLyoqCisgKiBQcmludCBhIGZyYWdtZW50IHByb2dyYW0ncyBJbnB1dHNSZWFkIGZpZWxkIGluIGh1bWFuLXJlYWRhYmxlIGZvcm1hdC4KKyAqIEZvciBkZWJ1Z2dpbmcuCisgKi8KK3ZvaWQKK19tZXNhX3ByaW50X2ZwX2lucHV0cyhHTGJpdGZpZWxkIGlucHV0cykKK3sKKyAgIHByaW50ZigiRlAgSW5wdXRzIDB4JXg6IFxuIiwgaW5wdXRzKTsKKyAgIHdoaWxlIChpbnB1dHMpIHsKKyAgICAgIEdMaW50IGF0dHIgPSBmZnMoaW5wdXRzKSAtIDE7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gYXJiX2lucHV0X2F0dHJpYl9zdHJpbmcoYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQik7CisgICAgICBwcmludGYoIiAgJWQ6ICVzXG4iLCBhdHRyLCBuYW1lKTsKKyAgICAgIGlucHV0cyAmPSB+KDEgPDwgYXR0cik7CisgICB9Cit9CisKKworCisvKioKKyAqIFJldHVybiBBUkJfdi9mX3Byb2ctc3R5bGUgb3V0cHV0IGF0dHJpYiBzdHJpbmcuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2FyYl9vdXRwdXRfYXR0cmliX3N0cmluZyhHTGludCBpbmRleCwgR0xlbnVtIHByb2dUeXBlKQoreworICAgLyoKKyAgICAqIFRoZXNlIHN0cmluZ3Mgc2hvdWxkIG1hdGNoIHRoZSBWQVJZSU5HX1NMT1RfeCBhbmQgRlJBR19SRVNVTFRfeCB0b2tlbnMuCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ZXJ0UmVzdWx0c1tdID0geworICAgICAgInJlc3VsdC5wb3NpdGlvbiIsCisgICAgICAicmVzdWx0LmNvbG9yLnByaW1hcnkiLAorICAgICAgInJlc3VsdC5jb2xvci5zZWNvbmRhcnkiLAorICAgICAgInJlc3VsdC5mb2djb29yZCIsCisgICAgICAicmVzdWx0LnRleGNvb3JkWzBdIiwKKyAgICAgICJyZXN1bHQudGV4Y29vcmRbMV0iLAorICAgICAgInJlc3VsdC50ZXhjb29yZFsyXSIsCisgICAgICAicmVzdWx0LnRleGNvb3JkWzNdIiwKKyAgICAgICJyZXN1bHQudGV4Y29vcmRbNF0iLAorICAgICAgInJlc3VsdC50ZXhjb29yZFs1XSIsCisgICAgICAicmVzdWx0LnRleGNvb3JkWzZdIiwKKyAgICAgICJyZXN1bHQudGV4Y29vcmRbN10iLAorICAgICAgInJlc3VsdC5wb2ludHNpemUiLCAvKiBWQVJZSU5HX1NMT1RfUFNJWiAqLworICAgICAgInJlc3VsdC4odGhpcnRlZW4pIiwgLyogVkFSWUlOR19TTE9UX0JGQzAgKi8KKyAgICAgICJyZXN1bHQuKGZvdXJ0ZWVuKSIsIC8qIFZBUllJTkdfU0xPVF9CRkMxICovCisgICAgICAicmVzdWx0LihmaWZ0ZWVuKSIsIC8qIFZBUllJTkdfU0xPVF9FREdFICovCisgICAgICAicmVzdWx0LihzaXh0ZWVuKSIsIC8qIFZBUllJTkdfU0xPVF9DTElQX1ZFUlRFWCAqLworICAgICAgInJlc3VsdC4oc2V2ZW50ZWVuKSIsIC8qIFZBUllJTkdfU0xPVF9DTElQX0RJU1QwICovCisgICAgICAicmVzdWx0LihlaWdodGVlbikiLCAvKiBWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMSAqLworICAgICAgInJlc3VsdC4obmluZXRlZW4pIiwgLyogVkFSWUlOR19TTE9UX1BSSU1JVElWRV9JRCAqLworICAgICAgInJlc3VsdC4odHdlbnR5KSIsIC8qIFZBUllJTkdfU0xPVF9MQVlFUiAqLworICAgICAgInJlc3VsdC4odHdlbnR5LW9uZSkiLCAvKiBWQVJZSU5HX1NMT1RfVklFV1BPUlQgKi8KKyAgICAgICJyZXN1bHQuKHR3ZW50eS10d28pIiwgLyogVkFSWUlOR19TTE9UX0ZBQ0UgKi8KKyAgICAgICJyZXN1bHQuKHR3ZW50eS10aHJlZSkiLCAvKiBWQVJZSU5HX1NMT1RfUE5UQyAqLworICAgICAgInJlc3VsdC52YXJ5aW5nWzBdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1sxXSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMl0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzNdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1s0XSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbNV0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzZdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1s3XSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbOF0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzldIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1sxMF0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzExXSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMTJdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1sxM10iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzE0XSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMTVdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1sxNl0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzE3XSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMThdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1sxOV0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzIwXSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMjFdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1syMl0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzIzXSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMjRdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1syNV0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzI2XSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMjddIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1syOF0iLAorICAgICAgInJlc3VsdC52YXJ5aW5nWzI5XSIsCisgICAgICAicmVzdWx0LnZhcnlpbmdbMzBdIiwKKyAgICAgICJyZXN1bHQudmFyeWluZ1szMV0iLCAvKiBNQVhfVkFSWUlORyA9IDMyICovCisgICB9OworICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZyYWdSZXN1bHRzW10gPSB7CisgICAgICAicmVzdWx0LmRlcHRoIiwgLyogRlJBR19SRVNVTFRfREVQVEggKi8KKyAgICAgICJyZXN1bHQuKG9uZSkiLCAvKiBGUkFHX1JFU1VMVF9TVEVOQ0lMICovCisgICAgICAicmVzdWx0LmNvbG9yIiwgLyogRlJBR19SRVNVTFRfQ09MT1IgKi8KKyAgICAgICJyZXN1bHQuc2FtcGxlbWFzayIsIC8qIEZSQUdfUkVTVUxUX1NBTVBMRV9NQVNLICovCisgICAgICAicmVzdWx0LmNvbG9yWzBdIiwgLyogRlJBR19SRVNVTFRfREFUQTAgKG5hbWVkIGZvciBHTFNMJ3MgZ2xfRnJhZ0RhdGEpICovCisgICAgICAicmVzdWx0LmNvbG9yWzFdIiwKKyAgICAgICJyZXN1bHQuY29sb3JbMl0iLAorICAgICAgInJlc3VsdC5jb2xvclszXSIsCisgICAgICAicmVzdWx0LmNvbG9yWzRdIiwKKyAgICAgICJyZXN1bHQuY29sb3JbNV0iLAorICAgICAgInJlc3VsdC5jb2xvcls2XSIsCisgICAgICAicmVzdWx0LmNvbG9yWzddIiAvKiBNQVhfRFJBV19CVUZGRVJTID0gOCAqLworICAgfTsKKworICAgLyogc2FuaXR5IGNoZWNrcyAqLworICAgU1RBVElDX0FTU0VSVChFbGVtZW50cyh2ZXJ0UmVzdWx0cykgPT0gVkFSWUlOR19TTE9UX01BWCk7CisgICBTVEFUSUNfQVNTRVJUKEVsZW1lbnRzKGZyYWdSZXN1bHRzKSA9PSBGUkFHX1JFU1VMVF9NQVgpOworICAgYXNzZXJ0KHN0cmNtcCh2ZXJ0UmVzdWx0c1tWQVJZSU5HX1NMT1RfUE9TXSwgInJlc3VsdC5wb3NpdGlvbiIpID09IDApOworICAgYXNzZXJ0KHN0cmNtcCh2ZXJ0UmVzdWx0c1tWQVJZSU5HX1NMT1RfVkFSMF0sICJyZXN1bHQudmFyeWluZ1swXSIpID09IDApOworICAgYXNzZXJ0KHN0cmNtcChmcmFnUmVzdWx0c1tGUkFHX1JFU1VMVF9EQVRBMF0sICJyZXN1bHQuY29sb3JbMF0iKSA9PSAwKTsKKworICAgaWYgKHByb2dUeXBlID09IEdMX1ZFUlRFWF9QUk9HUkFNX0FSQikgeworICAgICAgYXNzZXJ0KGluZGV4IDwgRWxlbWVudHModmVydFJlc3VsdHMpKTsKKyAgICAgIHJldHVybiB2ZXJ0UmVzdWx0c1tpbmRleF07CisgICB9CisgICBlbHNlIHsKKyAgICAgIGFzc2VydChwcm9nVHlwZSA9PSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQik7CisgICAgICBhc3NlcnQoaW5kZXggPCBFbGVtZW50cyhmcmFnUmVzdWx0cykpOworICAgICAgcmV0dXJuIGZyYWdSZXN1bHRzW2luZGV4XTsKKyAgIH0KK30KKworCisvKioKKyAqIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHJlZ2lzdGVyLgorICogTm90ZSB0aGF0IHNvbWUgdHlwZXMgb2YgcmVnaXN0ZXJzIChsaWtlIFBST0dSQU1fVU5JRk9STSkgYXJlbid0IGRlZmluZWQKKyAqIGJ5IHRoZSBBUkIvTlYgcHJvZ3JhbSBsYW5ndWFnZXMgc28gd2UndmUgdGFrZW4gc29tZSBsaWJlcnRpZXMgaGVyZS4KKyAqIFxwYXJhbSBmICB0aGUgcmVnaXN0ZXIgZmlsZSAoUFJPR1JBTV9JTlBVVCwgUFJPR1JBTV9URU1QT1JBUlksIGV0YykKKyAqIFxwYXJhbSBpbmRleCAgbnVtYmVyIG9mIHRoZSByZWdpc3RlciBpbiB0aGUgcmVnaXN0ZXIgZmlsZQorICogXHBhcmFtIG1vZGUgIHRoZSBvdXRwdXQgZm9ybWF0L21vZGUvc3R5bGUKKyAqIFxwYXJhbSBwcm9nICBwb2ludGVyIHRvIGNvbnRhaW5pbmcgcHJvZ3JhbQorICovCitzdGF0aWMgY29uc3QgY2hhciAqCityZWdfc3RyaW5nKGdsX3JlZ2lzdGVyX2ZpbGUgZiwgR0xpbnQgaW5kZXgsIGdsX3Byb2dfcHJpbnRfbW9kZSBtb2RlLAorICAgICAgICAgICBHTGJvb2xlYW4gcmVsQWRkciwgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgIEdMYm9vbGVhbiBoYXNJbmRleDIsIEdMYm9vbGVhbiByZWxBZGRyMiwgR0xpbnQgaW5kZXgyKQoreworICAgc3RhdGljIGNoYXIgc3RyWzEwMF07CisgICBjb25zdCBjaGFyICphZGRyID0gcmVsQWRkciA/ICJBRERSKyIgOiAiIjsKKworICAgc3RyWzBdID0gMDsKKworICAgc3dpdGNoIChtb2RlKSB7CisgICBjYXNlIFBST0dfUFJJTlRfREVCVUc6CisgICAgICBzcHJpbnRmKHN0ciwgIiVzWyVzJWRdIiwKKyAgICAgICAgICAgICAgX21lc2FfcmVnaXN0ZXJfZmlsZV9uYW1lKGYpLCBhZGRyLCBpbmRleCk7CisgICAgICBpZiAoaGFzSW5kZXgyKSB7CisgICAgICAgICBpbnQgb2Zmc2V0ID0gc3RybGVuKHN0cik7CisgICAgICAgICBjb25zdCBjaGFyICphZGRyMiA9IHJlbEFkZHIyID8gIkFERFIrIiA6ICIiOworICAgICAgICAgc3ByaW50ZihzdHIrb2Zmc2V0LCAiWyVzJWRdIiwgYWRkcjIsIGluZGV4Mik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBQUk9HX1BSSU5UX0FSQjoKKyAgICAgIHN3aXRjaCAoZikgeworICAgICAgY2FzZSBQUk9HUkFNX0lOUFVUOgorICAgICAgICAgc3ByaW50ZihzdHIsICIlcyIsIGFyYl9pbnB1dF9hdHRyaWJfc3RyaW5nKGluZGV4LCBwcm9nLT5UYXJnZXQpKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9HUkFNX09VVFBVVDoKKyAgICAgICAgIHNwcmludGYoc3RyLCAiJXMiLCBhcmJfb3V0cHV0X2F0dHJpYl9zdHJpbmcoaW5kZXgsIHByb2ctPlRhcmdldCkpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST0dSQU1fVEVNUE9SQVJZOgorICAgICAgICAgc3ByaW50ZihzdHIsICJ0ZW1wJWQiLCBpbmRleCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFJPR1JBTV9DT05TVEFOVDogLyogZXh0ZW5zaW9uICovCisgICAgICAgICBzcHJpbnRmKHN0ciwgImNvbnN0YW50WyVzJWRdIiwgYWRkciwgaW5kZXgpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST0dSQU1fVU5JRk9STTogLyogZXh0ZW5zaW9uICovCisgICAgICAgICBzcHJpbnRmKHN0ciwgInVuaWZvcm1bJXMlZF0iLCBhZGRyLCBpbmRleCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFJPR1JBTV9TWVNURU1fVkFMVUU6CisgICAgICAgICBzcHJpbnRmKHN0ciwgInN5c3ZhbHVlWyVzJWRdIiwgYWRkciwgaW5kZXgpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST0dSQU1fU1RBVEVfVkFSOgorICAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyICpwYXJhbQorICAgICAgICAgICAgICAgPSBwcm9nLT5QYXJhbWV0ZXJzLT5QYXJhbWV0ZXJzICsgaW5kZXg7CisgICAgICAgICAgICBjaGFyICpzdGF0ZSA9IF9tZXNhX3Byb2dyYW1fc3RhdGVfc3RyaW5nKHBhcmFtLT5TdGF0ZUluZGV4ZXMpOworICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyIsIHN0YXRlKTsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST0dSQU1fQUREUkVTUzoKKyAgICAgICAgIHNwcmludGYoc3RyLCAiQSVkIiwgaW5kZXgpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiYmFkIGZpbGUgaW4gcmVnX3N0cmluZygpIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgImJhZCBtb2RlIGluIHJlZ19zdHJpbmcoKSIpOworICAgfQorCisgICByZXR1cm4gc3RyOworfQorCisKKy8qKgorICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzd2l6emxlIHdvcmQuCisgKiBJZiBleHRlbmRlZCBpcyB0cnVlLCB1c2UgZXh0ZW5kZWQgKGNvbW1hLXNlcGFyYXRlZCkgZm9ybWF0LgorICogXHBhcmFtIHN3aXp6bGUgIHRoZSBzd2l6emxlIGZpZWxkCisgKiBccGFyYW0gbmVnYXRlQmFzZSAgNC1iaXQgbmVnYXRpb24gdmVjdG9yCisgKiBccGFyYW0gZXh0ZW5kZWQgIGlmIHRydWUsIGFsc28gYWxsb3cgMCwgMSB2YWx1ZXMKKyAqLworY29uc3QgY2hhciAqCitfbWVzYV9zd2l6emxlX3N0cmluZyhHTHVpbnQgc3dpenpsZSwgR0x1aW50IG5lZ2F0ZU1hc2ssIEdMYm9vbGVhbiBleHRlbmRlZCkKK3sKKyAgIHN0YXRpYyBjb25zdCBjaGFyIHN3eltdID0gInh5encwMSE/IjsgIC8qIFNlZSBTV0laWkxFX3ggZGVmaW5pdGlvbnMgKi8KKyAgIHN0YXRpYyBjaGFyIHNbMjBdOworICAgR0x1aW50IGkgPSAwOworCisgICBpZiAoIWV4dGVuZGVkICYmIHN3aXp6bGUgPT0gU1dJWlpMRV9OT09QICYmIG5lZ2F0ZU1hc2sgPT0gMCkKKyAgICAgIHJldHVybiAiIjsgLyogbm8gc3dpenpsZS9uZWdhdGlvbiAqLworCisgICBpZiAoIWV4dGVuZGVkKQorICAgICAgc1tpKytdID0gJy4nOworCisgICBpZiAobmVnYXRlTWFzayAmIE5FR0FURV9YKQorICAgICAgc1tpKytdID0gJy0nOworICAgc1tpKytdID0gc3d6W0dFVF9TV1ooc3dpenpsZSwgMCldOworCisgICBpZiAoZXh0ZW5kZWQpIHsKKyAgICAgIHNbaSsrXSA9ICcsJzsKKyAgIH0KKworICAgaWYgKG5lZ2F0ZU1hc2sgJiBORUdBVEVfWSkKKyAgICAgIHNbaSsrXSA9ICctJzsKKyAgIHNbaSsrXSA9IHN3eltHRVRfU1daKHN3aXp6bGUsIDEpXTsKKworICAgaWYgKGV4dGVuZGVkKSB7CisgICAgICBzW2krK10gPSAnLCc7CisgICB9CisKKyAgIGlmIChuZWdhdGVNYXNrICYgTkVHQVRFX1opCisgICAgICBzW2krK10gPSAnLSc7CisgICBzW2krK10gPSBzd3pbR0VUX1NXWihzd2l6emxlLCAyKV07CisKKyAgIGlmIChleHRlbmRlZCkgeworICAgICAgc1tpKytdID0gJywnOworICAgfQorCisgICBpZiAobmVnYXRlTWFzayAmIE5FR0FURV9XKQorICAgICAgc1tpKytdID0gJy0nOworICAgc1tpKytdID0gc3d6W0dFVF9TV1ooc3dpenpsZSwgMyldOworCisgICBzW2ldID0gMDsKKyAgIHJldHVybiBzOworfQorCisKK3ZvaWQKK19tZXNhX3ByaW50X3N3aXp6bGUoR0x1aW50IHN3aXp6bGUpCit7CisgICBpZiAoc3dpenpsZSA9PSBTV0laWkxFX1hZWlcpIHsKKyAgICAgIHByaW50ZigiLnh5endcbiIpOworICAgfQorICAgZWxzZSB7CisgICAgICBjb25zdCBjaGFyICpzID0gX21lc2Ffc3dpenpsZV9zdHJpbmcoc3dpenpsZSwgMCwgMCk7CisgICAgICBwcmludGYoIiVzXG4iLCBzKTsKKyAgIH0KK30KKworCitjb25zdCBjaGFyICoKK19tZXNhX3dyaXRlbWFza19zdHJpbmcoR0x1aW50IHdyaXRlTWFzaykKK3sKKyAgIHN0YXRpYyBjaGFyIHNbMTBdOworICAgR0x1aW50IGkgPSAwOworCisgICBpZiAod3JpdGVNYXNrID09IFdSSVRFTUFTS19YWVpXKQorICAgICAgcmV0dXJuICIiOworCisgICBzW2krK10gPSAnLic7CisgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1gpCisgICAgICBzW2krK10gPSAneCc7CisgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1kpCisgICAgICBzW2krK10gPSAneSc7CisgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1opCisgICAgICBzW2krK10gPSAneic7CisgICBpZiAod3JpdGVNYXNrICYgV1JJVEVNQVNLX1cpCisgICAgICBzW2krK10gPSAndyc7CisKKyAgIHNbaV0gPSAwOworICAgcmV0dXJuIHM7Cit9CisKKworY29uc3QgY2hhciAqCitfbWVzYV9jb25kY29kZV9zdHJpbmcoR0x1aW50IGNvbmRjb2RlKQoreworICAgc3dpdGNoIChjb25kY29kZSkgeworICAgY2FzZSBDT05EX0dUOiAgcmV0dXJuICJHVCI7CisgICBjYXNlIENPTkRfRVE6ICByZXR1cm4gIkVRIjsKKyAgIGNhc2UgQ09ORF9MVDogIHJldHVybiAiTFQiOworICAgY2FzZSBDT05EX1VOOiAgcmV0dXJuICJVTiI7CisgICBjYXNlIENPTkRfR0U6ICByZXR1cm4gIkdFIjsKKyAgIGNhc2UgQ09ORF9MRTogIHJldHVybiAiTEUiOworICAgY2FzZSBDT05EX05FOiAgcmV0dXJuICJORSI7CisgICBjYXNlIENPTkRfVFI6ICByZXR1cm4gIlRSIjsKKyAgIGNhc2UgQ09ORF9GTDogIHJldHVybiAiRkwiOworICAgZGVmYXVsdDogcmV0dXJuICJjb25kPz8/IjsKKyAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZnByaW50X2RzdF9yZWcoRklMRSAqIGYsCisgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdFJlZywKKyAgICAgICAgICAgICAgIGdsX3Byb2dfcHJpbnRfbW9kZSBtb2RlLAorICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICBmcHJpbnRmKGYsICIlcyVzIiwKKwkgICByZWdfc3RyaW5nKChnbF9yZWdpc3Rlcl9maWxlKSBkc3RSZWctPkZpbGUsCisJCSAgICAgIGRzdFJlZy0+SW5kZXgsIG1vZGUsIGRzdFJlZy0+UmVsQWRkciwgcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICBHTF9GQUxTRSwgR0xfRkFMU0UsIDApLAorCSAgIF9tZXNhX3dyaXRlbWFza19zdHJpbmcoZHN0UmVnLT5Xcml0ZU1hc2spKTsKKyAgIAorICAgaWYgKGRzdFJlZy0+Q29uZE1hc2sgIT0gQ09ORF9UUikgeworICAgICAgZnByaW50ZihmLCAiICglcy4lcykiLAorCSAgICAgIF9tZXNhX2NvbmRjb2RlX3N0cmluZyhkc3RSZWctPkNvbmRNYXNrKSwKKwkgICAgICBfbWVzYV9zd2l6emxlX3N0cmluZyhkc3RSZWctPkNvbmRTd2l6emxlLAorCQkJCSAgIEdMX0ZBTFNFLCBHTF9GQUxTRSkpOworICAgfQorCisjaWYgMAorICAgZnByaW50ZihmLCAiJXNbJWRdJXMiLAorCSAgIF9tZXNhX3JlZ2lzdGVyX2ZpbGVfbmFtZSgoZ2xfcmVnaXN0ZXJfZmlsZSkgZHN0UmVnLT5GaWxlKSwKKwkgICBkc3RSZWctPkluZGV4LAorCSAgIF9tZXNhX3dyaXRlbWFza19zdHJpbmcoZHN0UmVnLT5Xcml0ZU1hc2spKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkCitmcHJpbnRfc3JjX3JlZyhGSUxFICpmLAorICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByb2dfc3JjX3JlZ2lzdGVyICpzcmNSZWcsIAorICAgICAgICAgICAgICAgZ2xfcHJvZ19wcmludF9tb2RlIG1vZGUsCisgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIGNvbnN0IGNoYXIgKmFicyA9IHNyY1JlZy0+QWJzID8gInwiIDogIiI7CisKKyAgIGZwcmludGYoZiwgIiVzJXMlcyVzIiwKKwkgICBhYnMsCisJICAgcmVnX3N0cmluZygoZ2xfcmVnaXN0ZXJfZmlsZSkgc3JjUmVnLT5GaWxlLAorCQkgICAgICBzcmNSZWctPkluZGV4LCBtb2RlLCBzcmNSZWctPlJlbEFkZHIsIHByb2csCisgICAgICAgICAgICAgICAgICAgICAgc3JjUmVnLT5IYXNJbmRleDIsIHNyY1JlZy0+UmVsQWRkcjIsIHNyY1JlZy0+SW5kZXgyKSwKKwkgICBfbWVzYV9zd2l6emxlX3N0cmluZyhzcmNSZWctPlN3aXp6bGUsCisJCQkJc3JjUmVnLT5OZWdhdGUsIEdMX0ZBTFNFKSwKKwkgICBhYnMpOworI2lmIDAKKyAgIGZwcmludGYoZiwgIiVzWyVkXSVzIiwKKwkgICBfbWVzYV9yZWdpc3Rlcl9maWxlX25hbWUoKGdsX3JlZ2lzdGVyX2ZpbGUpIHNyY1JlZy0+RmlsZSksCisJICAgc3JjUmVnLT5JbmRleCwKKwkgICBfbWVzYV9zd2l6emxlX3N0cmluZyhzcmNSZWctPlN3aXp6bGUsCisJCQkJc3JjUmVnLT5OZWdhdGUsIEdMX0ZBTFNFKSk7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZAorZnByaW50X2NvbW1lbnQoRklMRSAqZiwgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICBpZiAoaW5zdC0+Q29tbWVudCkKKyAgICAgIGZwcmludGYoZiwgIjsgICMgJXNcbiIsIGluc3QtPkNvbW1lbnQpOworICAgZWxzZQorICAgICAgZnByaW50ZihmLCAiO1xuIik7Cit9CisKKwordm9pZAorX21lc2FfZnByaW50X2FsdV9pbnN0cnVjdGlvbihGSUxFICpmLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwKKwkJCSAgICAgY29uc3QgY2hhciAqb3Bjb2RlX3N0cmluZywgR0x1aW50IG51bVJlZ3MsCisJCQkgICAgIGdsX3Byb2dfcHJpbnRfbW9kZSBtb2RlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIEdMdWludCBqOworCisgICBmcHJpbnRmKGYsICIlcyIsIG9wY29kZV9zdHJpbmcpOworICAgaWYgKGluc3QtPkNvbmRVcGRhdGUpCisgICAgICBmcHJpbnRmKGYsICIuQyIpOworCisgICAvKiBmcmFnIHByb2cgb25seSAqLworICAgaWYgKGluc3QtPlNhdHVyYXRlTW9kZSA9PSBTQVRVUkFURV9aRVJPX09ORSkKKyAgICAgIGZwcmludGYoZiwgIl9TQVQiKTsKKworICAgZnByaW50ZihmLCAiICIpOworICAgaWYgKGluc3QtPkRzdFJlZy5GaWxlICE9IFBST0dSQU1fVU5ERUZJTkVEKSB7CisgICAgICBmcHJpbnRfZHN0X3JlZyhmLCAmaW5zdC0+RHN0UmVnLCBtb2RlLCBwcm9nKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgZnByaW50ZihmLCAiID8/PyIpOworICAgfQorCisgICBpZiAobnVtUmVncyA+IDApCisgICAgICBmcHJpbnRmKGYsICIsICIpOworCisgICBmb3IgKGogPSAwOyBqIDwgbnVtUmVnczsgaisrKSB7CisgICAgICBmcHJpbnRfc3JjX3JlZyhmLCBpbnN0LT5TcmNSZWcgKyBqLCBtb2RlLCBwcm9nKTsKKyAgICAgIGlmIChqICsgMSA8IG51bVJlZ3MpCisJIGZwcmludGYoZiwgIiwgIik7CisgICB9CisKKyAgIGZwcmludF9jb21tZW50KGYsIGluc3QpOworfQorCisKK3ZvaWQKK19tZXNhX3ByaW50X2FsdV9pbnN0cnVjdGlvbihjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcGNvZGVfc3RyaW5nLCBHTHVpbnQgbnVtUmVncykKK3sKKyAgIF9tZXNhX2ZwcmludF9hbHVfaW5zdHJ1Y3Rpb24oc3RkZXJyLCBpbnN0LCBvcGNvZGVfc3RyaW5nLAorCQkJCW51bVJlZ3MsIFBST0dfUFJJTlRfREVCVUcsIE5VTEwpOworfQorCisKKy8qKgorICogUHJpbnQgYSBzaW5nbGUgdmVydGV4L2ZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24uCisgKi8KK0dMaW50CitfbWVzYV9mcHJpbnRfaW5zdHJ1Y3Rpb25fb3B0KEZJTEUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3Byb2dfcHJpbnRfbW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgR0xpbnQgaTsKKworICAgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfRUxTRSB8fAorICAgICAgIGluc3QtPk9wY29kZSA9PSBPUENPREVfRU5ESUYgfHwKKyAgICAgICBpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0VORExPT1AgfHwKKyAgICAgICBpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0VORFNVQikgeworICAgICAgaW5kZW50IC09IDM7CisgICB9CisgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgIGZwcmludGYoZiwgIiAiKTsKKyAgIH0KKworICAgc3dpdGNoIChpbnN0LT5PcGNvZGUpIHsKKyAgIGNhc2UgT1BDT0RFX1NXWjoKKyAgICAgIGZwcmludGYoZiwgIlNXWiIpOworICAgICAgaWYgKGluc3QtPlNhdHVyYXRlTW9kZSA9PSBTQVRVUkFURV9aRVJPX09ORSkKKyAgICAgICAgIGZwcmludGYoZiwgIl9TQVQiKTsKKyAgICAgIGZwcmludGYoZiwgIiAiKTsKKyAgICAgIGZwcmludF9kc3RfcmVnKGYsICZpbnN0LT5Ec3RSZWcsIG1vZGUsIHByb2cpOworICAgICAgZnByaW50ZihmLCAiLCAlc1slZF0sICVzIiwKKwkgICAgICBfbWVzYV9yZWdpc3Rlcl9maWxlX25hbWUoKGdsX3JlZ2lzdGVyX2ZpbGUpIGluc3QtPlNyY1JlZ1swXS5GaWxlKSwKKwkgICAgICBpbnN0LT5TcmNSZWdbMF0uSW5kZXgsCisJICAgICAgX21lc2Ffc3dpenpsZV9zdHJpbmcoaW5zdC0+U3JjUmVnWzBdLlN3aXp6bGUsCisJCQkJICAgaW5zdC0+U3JjUmVnWzBdLk5lZ2F0ZSwgR0xfVFJVRSkpOworICAgICAgZnByaW50X2NvbW1lbnQoZiwgaW5zdCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgT1BDT0RFX1RFWDoKKyAgIGNhc2UgT1BDT0RFX1RYUDoKKyAgIGNhc2UgT1BDT0RFX1RYTDoKKyAgIGNhc2UgT1BDT0RFX1RYQjoKKyAgIGNhc2UgT1BDT0RFX1RYRDoKKyAgICAgIGZwcmludGYoZiwgIiVzIiwgX21lc2Ffb3Bjb2RlX3N0cmluZyhpbnN0LT5PcGNvZGUpKTsKKyAgICAgIGlmIChpbnN0LT5TYXR1cmF0ZU1vZGUgPT0gU0FUVVJBVEVfWkVST19PTkUpCisgICAgICAgICBmcHJpbnRmKGYsICJfU0FUIik7CisgICAgICBmcHJpbnRmKGYsICIgIik7CisgICAgICBmcHJpbnRfZHN0X3JlZyhmLCAmaW5zdC0+RHN0UmVnLCBtb2RlLCBwcm9nKTsKKyAgICAgIGZwcmludGYoZiwgIiwgIik7CisgICAgICBmcHJpbnRfc3JjX3JlZyhmLCAmaW5zdC0+U3JjUmVnWzBdLCBtb2RlLCBwcm9nKTsKKyAgICAgIGlmIChpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX1RYRCkgeworICAgICAgICAgZnByaW50ZihmLCAiLCAiKTsKKyAgICAgICAgIGZwcmludF9zcmNfcmVnKGYsICZpbnN0LT5TcmNSZWdbMV0sIG1vZGUsIHByb2cpOworICAgICAgICAgZnByaW50ZihmLCAiLCAiKTsKKyAgICAgICAgIGZwcmludF9zcmNfcmVnKGYsICZpbnN0LT5TcmNSZWdbMl0sIG1vZGUsIHByb2cpOworICAgICAgfQorICAgICAgZnByaW50ZihmLCAiLCB0ZXh0dXJlWyVkXSwgIiwgaW5zdC0+VGV4U3JjVW5pdCk7CisgICAgICBzd2l0Y2ggKGluc3QtPlRleFNyY1RhcmdldCkgeworICAgICAgY2FzZSBURVhUVVJFXzFEX0lOREVYOiAgIGZwcmludGYoZiwgIjFEIik7ICAgIGJyZWFrOworICAgICAgY2FzZSBURVhUVVJFXzJEX0lOREVYOiAgIGZwcmludGYoZiwgIjJEIik7ICAgIGJyZWFrOworICAgICAgY2FzZSBURVhUVVJFXzNEX0lOREVYOiAgIGZwcmludGYoZiwgIjNEIik7ICAgIGJyZWFrOworICAgICAgY2FzZSBURVhUVVJFX0NVQkVfSU5ERVg6IGZwcmludGYoZiwgIkNVQkUiKTsgIGJyZWFrOworICAgICAgY2FzZSBURVhUVVJFX1JFQ1RfSU5ERVg6IGZwcmludGYoZiwgIlJFQ1QiKTsgIGJyZWFrOworICAgICAgY2FzZSBURVhUVVJFXzFEX0FSUkFZX0lOREVYOiBmcHJpbnRmKGYsICIxRF9BUlJBWSIpOyBicmVhazsKKyAgICAgIGNhc2UgVEVYVFVSRV8yRF9BUlJBWV9JTkRFWDogZnByaW50ZihmLCAiMkRfQVJSQVkiKTsgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgOworICAgICAgfQorICAgICAgaWYgKGluc3QtPlRleFNoYWRvdykKKyAgICAgICAgIGZwcmludGYoZiwgIiBTSEFET1ciKTsKKyAgICAgIGZwcmludF9jb21tZW50KGYsIGluc3QpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgT1BDT0RFX0tJTDoKKyAgICAgIGZwcmludGYoZiwgIiVzIiwgX21lc2Ffb3Bjb2RlX3N0cmluZyhpbnN0LT5PcGNvZGUpKTsKKyAgICAgIGZwcmludGYoZiwgIiAiKTsKKyAgICAgIGZwcmludF9zcmNfcmVnKGYsICZpbnN0LT5TcmNSZWdbMF0sIG1vZGUsIHByb2cpOworICAgICAgZnByaW50X2NvbW1lbnQoZiwgaW5zdCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgT1BDT0RFX0tJTF9OVjoKKyAgICAgIGZwcmludGYoZiwgIiVzIiwgX21lc2Ffb3Bjb2RlX3N0cmluZyhpbnN0LT5PcGNvZGUpKTsKKyAgICAgIGZwcmludGYoZiwgIiAiKTsKKyAgICAgIGZwcmludGYoZiwgIiVzLiVzIiwKKwkgICAgICBfbWVzYV9jb25kY29kZV9zdHJpbmcoaW5zdC0+RHN0UmVnLkNvbmRNYXNrKSwKKwkgICAgICBfbWVzYV9zd2l6emxlX3N0cmluZyhpbnN0LT5Ec3RSZWcuQ29uZFN3aXp6bGUsCisJCQkJICAgR0xfRkFMU0UsIEdMX0ZBTFNFKSk7CisgICAgICBmcHJpbnRfY29tbWVudChmLCBpbnN0KTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIE9QQ09ERV9BUkw6CisgICAgICBmcHJpbnRmKGYsICJBUkwgIik7CisgICAgICBmcHJpbnRfZHN0X3JlZyhmLCAmaW5zdC0+RHN0UmVnLCBtb2RlLCBwcm9nKTsKKyAgICAgIGZwcmludGYoZiwgIiwgIik7CisgICAgICBmcHJpbnRfc3JjX3JlZyhmLCAmaW5zdC0+U3JjUmVnWzBdLCBtb2RlLCBwcm9nKTsKKyAgICAgIGZwcmludF9jb21tZW50KGYsIGluc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIE9QQ09ERV9JRjoKKyAgICAgIGlmIChpbnN0LT5TcmNSZWdbMF0uRmlsZSAhPSBQUk9HUkFNX1VOREVGSU5FRCkgeworICAgICAgICAgLyogVXNlIG9yZGluYXJ5IHJlZ2lzdGVyICovCisgICAgICAgICBmcHJpbnRmKGYsICJJRiAiKTsKKyAgICAgICAgIGZwcmludF9zcmNfcmVnKGYsICZpbnN0LT5TcmNSZWdbMF0sIG1vZGUsIHByb2cpOworICAgICAgICAgZnByaW50ZihmLCAiOyAiKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgLyogVXNlIGNvbmQgY29kZXMgKi8KKyAgICAgICAgIGZwcmludGYoZiwgIklGICglcyVzKTsiLAorCQkgX21lc2FfY29uZGNvZGVfc3RyaW5nKGluc3QtPkRzdFJlZy5Db25kTWFzayksCisJCSBfbWVzYV9zd2l6emxlX3N0cmluZyhpbnN0LT5Ec3RSZWcuQ29uZFN3aXp6bGUsCisJCQkJICAgICAgMCwgR0xfRkFMU0UpKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZiwgIiAjIChpZiBmYWxzZSwgZ290byAlZCkiLCBpbnN0LT5CcmFuY2hUYXJnZXQpOworICAgICAgZnByaW50X2NvbW1lbnQoZiwgaW5zdCk7CisgICAgICByZXR1cm4gaW5kZW50ICsgMzsKKyAgIGNhc2UgT1BDT0RFX0VMU0U6CisgICAgICBmcHJpbnRmKGYsICJFTFNFOyAjIChnb3RvICVkKVxuIiwgaW5zdC0+QnJhbmNoVGFyZ2V0KTsKKyAgICAgIHJldHVybiBpbmRlbnQgKyAzOworICAgY2FzZSBPUENPREVfRU5ESUY6CisgICAgICBmcHJpbnRmKGYsICJFTkRJRjtcbiIpOworICAgICAgYnJlYWs7CisgICBjYXNlIE9QQ09ERV9CR05MT09QOgorICAgICAgZnByaW50ZihmLCAiQkdOTE9PUDsgIyAoZW5kIGF0ICVkKVxuIiwgaW5zdC0+QnJhbmNoVGFyZ2V0KTsKKyAgICAgIHJldHVybiBpbmRlbnQgKyAzOworICAgY2FzZSBPUENPREVfRU5ETE9PUDoKKyAgICAgIGZwcmludGYoZiwgIkVORExPT1A7ICMgKGdvdG8gJWQpXG4iLCBpbnN0LT5CcmFuY2hUYXJnZXQpOworICAgICAgYnJlYWs7CisgICBjYXNlIE9QQ09ERV9CUks6CisgICBjYXNlIE9QQ09ERV9DT05UOgorICAgICAgZnByaW50ZihmLCAiJXMgKCVzJXMpOyAjIChnb3RvICVkKSIsCisJICAgICAgX21lc2Ffb3Bjb2RlX3N0cmluZyhpbnN0LT5PcGNvZGUpLAorCSAgICAgIF9tZXNhX2NvbmRjb2RlX3N0cmluZyhpbnN0LT5Ec3RSZWcuQ29uZE1hc2spLAorCSAgICAgIF9tZXNhX3N3aXp6bGVfc3RyaW5nKGluc3QtPkRzdFJlZy5Db25kU3dpenpsZSwgMCwgR0xfRkFMU0UpLAorCSAgICAgIGluc3QtPkJyYW5jaFRhcmdldCk7CisgICAgICBmcHJpbnRfY29tbWVudChmLCBpbnN0KTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIE9QQ09ERV9CR05TVUI6CisgICAgICBmcHJpbnRmKGYsICJCR05TVUIiKTsKKyAgICAgIGZwcmludF9jb21tZW50KGYsIGluc3QpOworICAgICAgcmV0dXJuIGluZGVudCArIDM7CisgICBjYXNlIE9QQ09ERV9FTkRTVUI6CisgICAgICBpZiAobW9kZSA9PSBQUk9HX1BSSU5UX0RFQlVHKSB7CisgICAgICAgICBmcHJpbnRmKGYsICJFTkRTVUIiKTsKKyAgICAgICAgIGZwcmludF9jb21tZW50KGYsIGluc3QpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIE9QQ09ERV9DQUw6CisgICAgICBmcHJpbnRmKGYsICJDQUwgJXUiLCBpbnN0LT5CcmFuY2hUYXJnZXQpOworICAgICAgZnByaW50X2NvbW1lbnQoZiwgaW5zdCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgT1BDT0RFX1JFVDoKKyAgICAgIGZwcmludGYoZiwgIlJFVCAoJXMlcykiLAorCSAgICAgIF9tZXNhX2NvbmRjb2RlX3N0cmluZyhpbnN0LT5Ec3RSZWcuQ29uZE1hc2spLAorCSAgICAgIF9tZXNhX3N3aXp6bGVfc3RyaW5nKGluc3QtPkRzdFJlZy5Db25kU3dpenpsZSwgMCwgR0xfRkFMU0UpKTsKKyAgICAgIGZwcmludF9jb21tZW50KGYsIGluc3QpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgT1BDT0RFX0VORDoKKyAgICAgIGZwcmludGYoZiwgIkVORFxuIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgT1BDT0RFX05PUDoKKyAgICAgIGlmIChtb2RlID09IFBST0dfUFJJTlRfREVCVUcpIHsKKyAgICAgICAgIGZwcmludGYoZiwgIk5PUCIpOworICAgICAgICAgZnByaW50X2NvbW1lbnQoZiwgaW5zdCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpbnN0LT5Db21tZW50KSB7CisgICAgICAgICAvKiBBUkIvTlYgZXh0ZW5zaW9ucyBkb24ndCBoYXZlIE5PUCBpbnN0cnVjdGlvbiAqLworICAgICAgICAgZnByaW50ZihmLCAiIyAlc1xuIiwgaW5zdC0+Q29tbWVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIC8qIFhYWCBtYXkgbmVlZCBvdGhlciBzcGVjaWFsLWNhc2UgaW5zdHJ1Y3Rpb25zICovCisgICBkZWZhdWx0OgorICAgICAgaWYgKGluc3QtPk9wY29kZSA8IE1BWF9PUENPREUpIHsKKyAgICAgICAgIC8qIHR5cGljYWwgYWx1IGluc3RydWN0aW9uICovCisgICAgICAgICBfbWVzYV9mcHJpbnRfYWx1X2luc3RydWN0aW9uKGYsIGluc3QsCisJCQkJICAgICAgX21lc2Ffb3Bjb2RlX3N0cmluZyhpbnN0LT5PcGNvZGUpLAorCQkJCSAgICAgIF9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3QtPk9wY29kZSksCisJCQkJICAgICAgbW9kZSwgcHJvZyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIF9tZXNhX2ZwcmludF9hbHVfaW5zdHJ1Y3Rpb24oZiwgaW5zdCwKKwkJCQkgICAgICBfbWVzYV9vcGNvZGVfc3RyaW5nKGluc3QtPk9wY29kZSksCisJCQkJICAgICAgMy8qX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKSovLAorCQkJCSAgICAgIG1vZGUsIHByb2cpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gaW5kZW50OworfQorCisKK0dMaW50CitfbWVzYV9wcmludF9pbnN0cnVjdGlvbl9vcHQoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3Byb2dfcHJpbnRfbW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgcmV0dXJuIF9tZXNhX2ZwcmludF9pbnN0cnVjdGlvbl9vcHQoc3RkZXJyLCBpbnN0LCBpbmRlbnQsIG1vZGUsIHByb2cpOworfQorCisKK3ZvaWQKK19tZXNhX3ByaW50X2luc3RydWN0aW9uKGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgLyogbm90ZTogNHRoIHBhcmFtIHNob3VsZCBiZSBpZ25vcmVkIGZvciBQUk9HX1BSSU5UX0RFQlVHICovCisgICBfbWVzYV9mcHJpbnRfaW5zdHJ1Y3Rpb25fb3B0KHN0ZGVyciwgaW5zdCwgMCwgUFJPR19QUklOVF9ERUJVRywgTlVMTCk7Cit9CisKKworCisvKioKKyAqIFByaW50IHByb2dyYW0sIHdpdGggb3B0aW9ucy4KKyAqLwordm9pZAorX21lc2FfZnByaW50X3Byb2dyYW1fb3B0KEZJTEUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfcHJvZ19wcmludF9tb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIGxpbmVOdW1iZXJzKQoreworICAgR0x1aW50IGksIGluZGVudCA9IDA7CisKKyAgIHN3aXRjaCAocHJvZy0+VGFyZ2V0KSB7CisgICBjYXNlIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQjoKKyAgICAgIGlmIChtb2RlID09IFBST0dfUFJJTlRfQVJCKQorICAgICAgICAgZnByaW50ZihmLCAiISFBUkJ2cDEuMFxuIik7CisgICAgICBlbHNlCisgICAgICAgICBmcHJpbnRmKGYsICIjIFZlcnRleCBQcm9ncmFtL1NoYWRlciAldVxuIiwgcHJvZy0+SWQpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCOgorICAgICAgaWYgKG1vZGUgPT0gUFJPR19QUklOVF9BUkIpCisgICAgICAgICBmcHJpbnRmKGYsICIhIUFSQmZwMS4wXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGZwcmludGYoZiwgIiMgRnJhZ21lbnQgUHJvZ3JhbS9TaGFkZXIgJXVcbiIsIHByb2ctPklkKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBNRVNBX0dFT01FVFJZX1BST0dSQU06CisgICAgICBmcHJpbnRmKGYsICIjIEdlb21ldHJ5IFNoYWRlclxuIik7CisgICB9CisKKyAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLT5OdW1JbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgaWYgKGxpbmVOdW1iZXJzKQorICAgICAgICAgZnByaW50ZihmLCAiJTNkOiAiLCBpKTsKKyAgICAgIGluZGVudCA9IF9tZXNhX2ZwcmludF9pbnN0cnVjdGlvbl9vcHQoZiwgcHJvZy0+SW5zdHJ1Y3Rpb25zICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQsIG1vZGUsIHByb2cpOworICAgfQorfQorCisKKy8qKgorICogUHJpbnQgcHJvZ3JhbSB0byBzdGRlcnIsIGRlZmF1bHQgb3B0aW9ucy4KKyAqLwordm9pZAorX21lc2FfcHJpbnRfcHJvZ3JhbShjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIF9tZXNhX2ZwcmludF9wcm9ncmFtX29wdChzdGRlcnIsIHByb2csIFBST0dfUFJJTlRfREVCVUcsIEdMX1RSVUUpOworfQorCisKKy8qKgorICogUmV0dXJuIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiA2NC1iaXQgdmFsdWUgKGFzIGEgc3RyaW5nKS4KKyAqIEluc2VydCBhIGNvbW1hIHRvIHNlcGFyYXRlIGVhY2ggZ3JvdXAgb2YgOCBiaXRzLgorICogTm90ZSB3ZSByZXR1cm4gYSBwb2ludGVyIHRvIGxvY2FsIHN0YXRpYyBzdG9yYWdlIHNvIHRoaXMgaXMgbm90CisgKiByZS1lbnRyYW50LCBldGMuCisgKiBYWFggbW92ZSB0byBpbXBvcnRzLltjaF0gaWYgdXNlZnVsIGVsc2V3aGVyZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorYmluYXJ5KEdMYml0ZmllbGQ2NCB2YWwpCit7CisgICBzdGF0aWMgY2hhciBidWZbODBdOworICAgR0xpbnQgaSwgbGVuID0gMDsKKyAgIGZvciAoaSA9IDYzOyBpID49IDA7IC0taSkgeworICAgICAgaWYgKHZhbCAmIChCSVRGSUVMRDY0X0JJVChpKSkpCisgICAgICAgICBidWZbbGVuKytdID0gJzEnOworICAgICAgZWxzZSBpZiAobGVuID4gMCB8fCBpID09IDApCisgICAgICAgICBidWZbbGVuKytdID0gJzAnOworICAgICAgaWYgKGxlbiA+IDAgJiYgKChpLTEpICUgOCkgPT0gNykKKyAgICAgICAgIGJ1ZltsZW4rK10gPSAnLCc7CisgICB9CisgICBidWZbbGVuXSA9ICdcMCc7CisgICByZXR1cm4gYnVmOworfQorCisKKy8qKgorICogUHJpbnQgYWxsIG9mIGEgcHJvZ3JhbSdzIHBhcmFtZXRlcnMvZmllbGRzIHRvIGdpdmVuIGZpbGUuCisgKi8KK3N0YXRpYyB2b2lkCitfbWVzYV9mcHJpbnRfcHJvZ3JhbV9wYXJhbWV0ZXJzKEZJTEUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgR0x1aW50IGk7CisKKyAgIGZwcmludGYoZiwgIklucHV0c1JlYWQ6ICUiIFBSSXg2NCAiICgwYiVzKVxuIiwKKyAgICAgICAgICAgKHVpbnQ2NF90KSBwcm9nLT5JbnB1dHNSZWFkLCBiaW5hcnkocHJvZy0+SW5wdXRzUmVhZCkpOworICAgZnByaW50ZihmLCAiT3V0cHV0c1dyaXR0ZW46ICUiIFBSSXg2NCAiICgwYiVzKVxuIiwKKyAgICAgICAgICAgKHVpbnQ2NF90KSBwcm9nLT5PdXRwdXRzV3JpdHRlbiwgYmluYXJ5KHByb2ctPk91dHB1dHNXcml0dGVuKSk7CisgICBmcHJpbnRmKGYsICJOdW1JbnN0cnVjdGlvbnM9JWRcbiIsIHByb2ctPk51bUluc3RydWN0aW9ucyk7CisgICBmcHJpbnRmKGYsICJOdW1UZW1wb3Jhcmllcz0lZFxuIiwgcHJvZy0+TnVtVGVtcG9yYXJpZXMpOworICAgZnByaW50ZihmLCAiTnVtUGFyYW1ldGVycz0lZFxuIiwgcHJvZy0+TnVtUGFyYW1ldGVycyk7CisgICBmcHJpbnRmKGYsICJOdW1BdHRyaWJ1dGVzPSVkXG4iLCBwcm9nLT5OdW1BdHRyaWJ1dGVzKTsKKyAgIGZwcmludGYoZiwgIk51bUFkZHJlc3NSZWdzPSVkXG4iLCBwcm9nLT5OdW1BZGRyZXNzUmVncyk7CisgICBmcHJpbnRmKGYsICJJbmRpcmVjdFJlZ2lzdGVyRmlsZXM6IDB4JXggKDBiJXMpXG4iLAorICAgICAgICAgICBwcm9nLT5JbmRpcmVjdFJlZ2lzdGVyRmlsZXMsIGJpbmFyeShwcm9nLT5JbmRpcmVjdFJlZ2lzdGVyRmlsZXMpKTsKKyAgIGZwcmludGYoZiwgIlNhbXBsZXJzVXNlZDogMHgleCAoMGIlcylcbiIsCisgICAgICAgICAgICAgICAgIHByb2ctPlNhbXBsZXJzVXNlZCwgYmluYXJ5KHByb2ctPlNhbXBsZXJzVXNlZCkpOworICAgZnByaW50ZihmLCAiU2FtcGxlcnM9WyAiKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU0FNUExFUlM7IGkrKykgeworICAgICAgZnByaW50ZihmLCAiJWQgIiwgcHJvZy0+U2FtcGxlclVuaXRzW2ldKTsKKyAgIH0KKyAgIGZwcmludGYoZiwgIl1cbiIpOworCisgICBfbWVzYV9sb2FkX3N0YXRlX3BhcmFtZXRlcnMoY3R4LCBwcm9nLT5QYXJhbWV0ZXJzKTsKKworI2lmIDAKKyAgIGZwcmludGYoZiwgIkxvY2FsIFBhcmFtczpcbiIpOworICAgZm9yIChpID0gMDsgaSA8IE1BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNUzsgaSsrKXsKKyAgICAgIGNvbnN0IEdMZmxvYXQgKnAgPSBwcm9nLT5Mb2NhbFBhcmFtc1tpXTsKKyAgICAgIGZwcmludGYoZiwgIiUyZDogJWYsICVmLCAlZiwgJWZcbiIsIGksIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworICAgfQorI2VuZGlmCQorICAgX21lc2FfcHJpbnRfcGFyYW1ldGVyX2xpc3QocHJvZy0+UGFyYW1ldGVycyk7Cit9CisKKworLyoqCisgKiBQcmludCBhbGwgb2YgYSBwcm9ncmFtJ3MgcGFyYW1ldGVycy9maWVsZHMgdG8gc3RkZXJyLgorICovCit2b2lkCitfbWVzYV9wcmludF9wcm9ncmFtX3BhcmFtZXRlcnMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICBfbWVzYV9mcHJpbnRfcHJvZ3JhbV9wYXJhbWV0ZXJzKHN0ZGVyciwgY3R4LCBwcm9nKTsKK30KKworCisvKioKKyAqIFByaW50IGEgcHJvZ3JhbSBwYXJhbWV0ZXIgbGlzdCB0byBnaXZlbiBmaWxlLgorICovCitzdGF0aWMgdm9pZAorX21lc2FfZnByaW50X3BhcmFtZXRlcl9saXN0KEZJTEUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmxpc3QpCit7CisgICBHTHVpbnQgaTsKKworICAgaWYgKCFsaXN0KQorICAgICAgcmV0dXJuOworCisgICBpZiAoMCkKKyAgICAgIGZwcmludGYoZiwgInBhcmFtIGxpc3QgJXBcbiIsICh2b2lkICopIGxpc3QpOworICAgZnByaW50ZihmLCAiZGlydHkgc3RhdGUgZmxhZ3M6IDB4JXhcbiIsIGxpc3QtPlN0YXRlRmxhZ3MpOworICAgZm9yIChpID0gMDsgaSA8IGxpc3QtPk51bVBhcmFtZXRlcnM7IGkrKyl7CisgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIgKnBhcmFtID0gbGlzdC0+UGFyYW1ldGVycyArIGk7CisgICAgICBjb25zdCBHTGZsb2F0ICp2ID0gKEdMZmxvYXQgKikgbGlzdC0+UGFyYW1ldGVyVmFsdWVzW2ldOworICAgICAgZnByaW50ZihmLCAicGFyYW1bJWRdIHN6PSVkICVzICVzID0geyUuM2csICUuM2csICUuM2csICUuM2d9IiwKKwkgICAgICBpLCBwYXJhbS0+U2l6ZSwKKwkgICAgICBfbWVzYV9yZWdpc3Rlcl9maWxlX25hbWUobGlzdC0+UGFyYW1ldGVyc1tpXS5UeXBlKSwKKwkgICAgICBwYXJhbS0+TmFtZSwgdlswXSwgdlsxXSwgdlsyXSwgdlszXSk7CisgICAgICBmcHJpbnRmKGYsICJcbiIpOworICAgfQorfQorCisKKy8qKgorICogUHJpbnQgYSBwcm9ncmFtIHBhcmFtZXRlciBsaXN0IHRvIHN0ZGVyci4KKyAqLwordm9pZAorX21lc2FfcHJpbnRfcGFyYW1ldGVyX2xpc3QoY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3QgKmxpc3QpCit7CisgICBfbWVzYV9mcHJpbnRfcGFyYW1ldGVyX2xpc3Qoc3RkZXJyLCBsaXN0KTsKK30KKworCisvKioKKyAqIFdyaXRlIHNoYWRlciBhbmQgYXNzb2NpYXRlZCBpbmZvIHRvIGEgZmlsZS4KKyAqLwordm9pZAorX21lc2Ffd3JpdGVfc2hhZGVyX3RvX2ZpbGUoY29uc3Qgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyKQoreworICAgY29uc3QgY2hhciAqdHlwZSA9ICI/Pz8/IjsKKyAgIGNoYXIgZmlsZW5hbWVbMTAwXTsKKyAgIEZJTEUgKmY7CisKKyAgIHN3aXRjaCAoc2hhZGVyLT5TdGFnZSkgeworICAgY2FzZSBNRVNBX1NIQURFUl9GUkFHTUVOVDoKKyAgICAgIHR5cGUgPSAiZnJhZyI7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgdHlwZSA9ICJ2ZXJ0IjsKKyAgICAgIGJyZWFrOworICAgY2FzZSBNRVNBX1NIQURFUl9HRU9NRVRSWToKKyAgICAgIHR5cGUgPSAiZ2VvbSI7CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9TSEFERVJfQ09NUFVURToKKyAgICAgIHR5cGUgPSAiY29tcCI7CisgICAgICBicmVhazsKKyAgIH0KKworICAgX21lc2Ffc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICJzaGFkZXJfJXUuJXMiLCBzaGFkZXItPk5hbWUsIHR5cGUpOworICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOworICAgaWYgKCFmKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuICVzIGZvciB3cml0aW5nXG4iLCBmaWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGZwcmludGYoZiwgIi8qIFNoYWRlciAldSBzb3VyY2UsIGNoZWNrc3VtICV1ICovXG4iLCBzaGFkZXItPk5hbWUsIHNoYWRlci0+U291cmNlQ2hlY2tzdW0pOworICAgZnB1dHMoc2hhZGVyLT5Tb3VyY2UsIGYpOworICAgZnByaW50ZihmLCAiXG4iKTsKKworICAgZnByaW50ZihmLCAiLyogQ29tcGlsZSBzdGF0dXM6ICVzICovXG4iLAorICAgICAgICAgICBzaGFkZXItPkNvbXBpbGVTdGF0dXMgPyAib2siIDogImZhaWwiKTsKKyAgIGZwcmludGYoZiwgIi8qIExvZyBJbmZvOiAqL1xuIik7CisgICBpZiAoc2hhZGVyLT5JbmZvTG9nKSB7CisgICAgICBmcHV0cyhzaGFkZXItPkluZm9Mb2csIGYpOworICAgfQorICAgaWYgKHNoYWRlci0+Q29tcGlsZVN0YXR1cyAmJiBzaGFkZXItPlByb2dyYW0pIHsKKyAgICAgIGZwcmludGYoZiwgIi8qIEdQVSBjb2RlICovXG4iKTsKKyAgICAgIGZwcmludGYoZiwgIi8qXG4iKTsKKyAgICAgIF9tZXNhX2ZwcmludF9wcm9ncmFtX29wdChmLCBzaGFkZXItPlByb2dyYW0sIFBST0dfUFJJTlRfREVCVUcsIEdMX1RSVUUpOworICAgICAgZnByaW50ZihmLCAiKi9cbiIpOworICAgICAgZnByaW50ZihmLCAiLyogUGFyYW1ldGVycyAvIGNvbnN0YW50cyAqL1xuIik7CisgICAgICBmcHJpbnRmKGYsICIvKlxuIik7CisgICAgICBfbWVzYV9mcHJpbnRfcGFyYW1ldGVyX2xpc3QoZiwgc2hhZGVyLT5Qcm9ncmFtLT5QYXJhbWV0ZXJzKTsKKyAgICAgIGZwcmludGYoZiwgIiovXG4iKTsKKyAgIH0KKworICAgZmNsb3NlKGYpOworfQorCisKKy8qKgorICogQXBwZW5kIHRoZSBzaGFkZXIncyB1bmlmb3JtIGluZm8vdmFsdWVzIHRvIHRoZSBzaGFkZXIgbG9nIGZpbGUuCisgKiBUaGUgbG9nIGZpbGUgd2lsbCB0eXBpY2FsbHkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlCisgKiBfbWVzYV93cml0ZV9zaGFkZXJfdG9fZmlsZSBmdW5jdGlvbi4KKyAqLwordm9pZAorX21lc2FfYXBwZW5kX3VuaWZvcm1zX3RvX2ZpbGUoY29uc3Qgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyKQoreworICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKmNvbnN0IHByb2cgPSBzaGFkZXItPlByb2dyYW07CisgICBjb25zdCBjaGFyICp0eXBlOworICAgY2hhciBmaWxlbmFtZVsxMDBdOworICAgRklMRSAqZjsKKworICAgaWYgKHNoYWRlci0+U3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpCisgICAgICB0eXBlID0gImZyYWciOworICAgZWxzZQorICAgICAgdHlwZSA9ICJ2ZXJ0IjsKKworICAgX21lc2Ffc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICJzaGFkZXJfJXUuJXMiLCBzaGFkZXItPk5hbWUsIHR5cGUpOworICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAiYSIpOyAvKiBhcHBlbmQgKi8KKyAgIGlmICghZikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiAlcyBmb3IgYXBwZW5kaW5nXG4iLCBmaWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGZwcmludGYoZiwgIi8qIEZpcnN0LWRyYXcgcGFyYW1ldGVycyAvIGNvbnN0YW50cyAqL1xuIik7CisgICBmcHJpbnRmKGYsICIvKlxuIik7CisgICBfbWVzYV9mcHJpbnRfcGFyYW1ldGVyX2xpc3QoZiwgcHJvZy0+UGFyYW1ldGVycyk7CisgICBmcHJpbnRmKGYsICIqL1xuIik7CisKKyAgIGZjbG9zZShmKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wcmludC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX3ByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MTU2OAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19wcmludC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBQUk9HX1BSSU5UX0gKKyNkZWZpbmUgUFJPR19QUklOVF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisKK3N0cnVjdCBnbF9wcm9ncmFtOworc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyX2xpc3Q7CitzdHJ1Y3QgZ2xfc2hhZGVyOworc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb247CisKKworLyoqCisgKiBUaGUgb3V0cHV0IHN0eWxlIHRvIHVzZSB3aGVuIHByaW50aW5nIHByb2dyYW1zLgorICovCit0eXBlZGVmIGVudW0geworICAgUFJPR19QUklOVF9BUkIsCisgICBQUk9HX1BSSU5UX0RFQlVHCit9IGdsX3Byb2dfcHJpbnRfbW9kZTsKKworCitleHRlcm4gY29uc3QgY2hhciAqCitfbWVzYV9yZWdpc3Rlcl9maWxlX25hbWUoZ2xfcmVnaXN0ZXJfZmlsZSBmKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3ByaW50X3ZwX2lucHV0cyhHTGJpdGZpZWxkIGlucHV0cyk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9wcmludF9mcF9pbnB1dHMoR0xiaXRmaWVsZCBpbnB1dHMpOworCitleHRlcm4gY29uc3QgY2hhciAqCitfbWVzYV9jb25kY29kZV9zdHJpbmcoR0x1aW50IGNvbmRjb2RlKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKgorX21lc2Ffc3dpenpsZV9zdHJpbmcoR0x1aW50IHN3aXp6bGUsIEdMdWludCBuZWdhdGVCYXNlLCBHTGJvb2xlYW4gZXh0ZW5kZWQpOworCitjb25zdCBjaGFyICoKK19tZXNhX3dyaXRlbWFza19zdHJpbmcoR0x1aW50IHdyaXRlTWFzayk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9wcmludF9zd2l6emxlKEdMdWludCBzd2l6emxlKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZwcmludF9hbHVfaW5zdHJ1Y3Rpb24oRklMRSAqZiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkgICAgIGNvbnN0IGNoYXIgKm9wY29kZV9zdHJpbmcsIEdMdWludCBudW1SZWdzLAorCQkJICAgICBnbF9wcm9nX3ByaW50X21vZGUgbW9kZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpOworCitleHRlcm4gdm9pZAorX21lc2FfcHJpbnRfYWx1X2luc3RydWN0aW9uKGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wY29kZV9zdHJpbmcsIEdMdWludCBudW1SZWdzKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3ByaW50X2luc3RydWN0aW9uKGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9mcHJpbnRfaW5zdHJ1Y3Rpb25fb3B0KEZJTEUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3Byb2dfcHJpbnRfbW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9wcmludF9pbnN0cnVjdGlvbl9vcHQoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsIEdMaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9wcm9nX3ByaW50X21vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9wcmludF9wcm9ncmFtKGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZwcmludF9wcm9ncmFtX29wdChGSUxFICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLCBnbF9wcm9nX3ByaW50X21vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gbGluZU51bWJlcnMpOworCitleHRlcm4gdm9pZAorX21lc2FfcHJpbnRfcHJvZ3JhbV9wYXJhbWV0ZXJzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3ByaW50X3BhcmFtZXRlcl9saXN0KGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpsaXN0KTsKKworCitleHRlcm4gdm9pZAorX21lc2Ffd3JpdGVfc2hhZGVyX3RvX2ZpbGUoY29uc3Qgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2FwcGVuZF91bmlmb3Jtc190b19maWxlKGNvbnN0IHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcik7CisKKworI2VuZGlmIC8qIFBST0dfUFJJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX3N0YXRldmFycy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX3N0YXRldmFycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzU2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dfc3RhdGV2YXJzLmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBwcm9nX3N0YXRldmFycy5jCisgKiBQcm9ncmFtIHN0YXRlIHZhcmlhYmxlIG1hbmFnZW1lbnQuCisgKiBcYXV0aG9yIEJyaWFuIFBhdWwKKyAqLworCisKKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9jb250ZXh0LmgiCisvLyNpbmNsdWRlICJtYWluL2JsZW5kLmgiCisjaW5jbHVkZSAibWFpbi9pbXBvcnRzLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorLy8jaW5jbHVkZSAibWFpbi9mYm9iamVjdC5oIgorI2luY2x1ZGUgInByb2dfc3RhdGV2YXJzLmgiCisjaW5jbHVkZSAicHJvZ19wYXJhbWV0ZXIuaCIKKy8vI2luY2x1ZGUgIm1haW4vc2FtcGxlcm9iai5oIgorCisKKy8qKgorICogVXNlIHRoZSBsaXN0IG9mIHRva2VucyBpbiB0aGUgc3RhdGVbXSBhcnJheSB0byBmaW5kIGdsb2JhbCBHTCBzdGF0ZQorICogYW5kIHJldHVybiBpdCBpbiA8dmFsdWU+LiAgVXN1YWxseSwgZm91ciB2YWx1ZXMgYXJlIHJldHVybmVkIGluIDx2YWx1ZT4KKyAqIGJ1dCBtYXRyaXggcXVlcmllcyBtYXkgcmV0dXJuIGFzIG1hbnkgYXMgMTYgdmFsdWVzLgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBBUkIgdmVydGV4L2ZyYWdtZW50IHByb2dyYW1zLgorICogVGhlIHByb2dyYW0gcGFyc2VyIHdpbGwgcHJvZHVjZSB0aGUgc3RhdGVbXSB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitfbWVzYV9mZXRjaF9zdGF0ZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCBnbF9zdGF0ZV9pbmRleCBzdGF0ZVtdLAorICAgICAgICAgICAgICAgICAgR0xmbG9hdCAqdmFsdWUpCit7CisgICAgX21lc2FfcHJvYmxlbShjdHgsICJJbnZhbGlkIHN0YXRlIGluIF9tZXNhX2ZldGNoX3N0YXRlIik7Cit9CisKKworLyoqCisgKiBSZXR1cm4gYSBiaXRtYXNrIG9mIHRoZSBNZXNhIHN0YXRlIGZsYWdzIChfTkVXXyogdmFsdWVzKSB3aGljaCB3b3VsZAorICogaW5kaWNhdGUgdGhhdCB0aGUgZ2l2ZW4gY29udGV4dCBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkLgorICogVGhlIGJpdG1hc2sgaXMgdXNlZCBkdXJpbmcgdmFsaWRhdGlvbiB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byB1cGRhdGUKKyAqIHZlcnRleC9mcmFnbWVudCBwcm9ncmFtIHBhcmFtZXRlcnMgKGxpa2UgInN0YXRlLm1hdGVyaWFsLmNvbG9yIikgd2hlbgorICogc29tZSBHTCBzdGF0ZSBoYXMgY2hhbmdlZC4KKyAqLworR0xiaXRmaWVsZAorX21lc2FfcHJvZ3JhbV9zdGF0ZV9mbGFncyhjb25zdCBnbF9zdGF0ZV9pbmRleCBzdGF0ZVtTVEFURV9MRU5HVEhdKQoreworICAgc3dpdGNoIChzdGF0ZVswXSkgeworICAgY2FzZSBTVEFURV9NQVRFUklBTDoKKyAgIGNhc2UgU1RBVEVfTElHSFRQUk9EOgorICAgY2FzZSBTVEFURV9MSUdIVE1PREVMX1NDRU5FQ09MT1I6CisgICAgICAvKiB0aGVzZSBjYW4gYmUgZWZmZWN0ZWQgYnkgZ2xDb2xvciB3aGVuIGNvbG9ybWF0ZXJpYWwgbW9kZSBpcyB1c2VkICovCisgICAgICByZXR1cm4gX05FV19MSUdIVCB8IF9ORVdfQ1VSUkVOVF9BVFRSSUI7CisKKyAgIGNhc2UgU1RBVEVfTElHSFQ6CisgICBjYXNlIFNUQVRFX0xJR0hUTU9ERUxfQU1CSUVOVDoKKyAgICAgIHJldHVybiBfTkVXX0xJR0hUOworCisgICBjYXNlIFNUQVRFX1RFWEdFTjoKKyAgICAgIHJldHVybiBfTkVXX1RFWFRVUkU7CisgICBjYXNlIFNUQVRFX1RFWEVOVl9DT0xPUjoKKyAgICAgIHJldHVybiBfTkVXX1RFWFRVUkUgfCBfTkVXX0JVRkZFUlMgfCBfTkVXX0ZSQUdfQ0xBTVA7CisKKyAgIGNhc2UgU1RBVEVfRk9HX0NPTE9SOgorICAgICAgcmV0dXJuIF9ORVdfRk9HIHwgX05FV19CVUZGRVJTIHwgX05FV19GUkFHX0NMQU1QOworICAgY2FzZSBTVEFURV9GT0dfUEFSQU1TOgorICAgICAgcmV0dXJuIF9ORVdfRk9HOworCisgICBjYXNlIFNUQVRFX0NMSVBQTEFORToKKyAgICAgIHJldHVybiBfTkVXX1RSQU5TRk9STTsKKworICAgY2FzZSBTVEFURV9QT0lOVF9TSVpFOgorICAgY2FzZSBTVEFURV9QT0lOVF9BVFRFTlVBVElPTjoKKyAgICAgIHJldHVybiBfTkVXX1BPSU5UOworCisgICBjYXNlIFNUQVRFX01PREVMVklFV19NQVRSSVg6CisgICAgICByZXR1cm4gX05FV19NT0RFTFZJRVc7CisgICBjYXNlIFNUQVRFX1BST0pFQ1RJT05fTUFUUklYOgorICAgICAgcmV0dXJuIF9ORVdfUFJPSkVDVElPTjsKKyAgIGNhc2UgU1RBVEVfTVZQX01BVFJJWDoKKyAgICAgIHJldHVybiBfTkVXX01PREVMVklFVyB8IF9ORVdfUFJPSkVDVElPTjsKKyAgIGNhc2UgU1RBVEVfVEVYVFVSRV9NQVRSSVg6CisgICAgICByZXR1cm4gX05FV19URVhUVVJFX01BVFJJWDsKKyAgIGNhc2UgU1RBVEVfUFJPR1JBTV9NQVRSSVg6CisgICAgICByZXR1cm4gX05FV19UUkFDS19NQVRSSVg7CisKKyAgIGNhc2UgU1RBVEVfTlVNX1NBTVBMRVM6CisgICAgICByZXR1cm4gX05FV19CVUZGRVJTOworCisgICBjYXNlIFNUQVRFX0RFUFRIX1JBTkdFOgorICAgICAgcmV0dXJuIF9ORVdfVklFV1BPUlQ7CisKKyAgIGNhc2UgU1RBVEVfRlJBR01FTlRfUFJPR1JBTToKKyAgIGNhc2UgU1RBVEVfVkVSVEVYX1BST0dSQU06CisgICAgICByZXR1cm4gX05FV19QUk9HUkFNOworCisgICBjYXNlIFNUQVRFX05PUk1BTF9TQ0FMRToKKyAgICAgIHJldHVybiBfTkVXX01PREVMVklFVzsKKworICAgY2FzZSBTVEFURV9JTlRFUk5BTDoKKyAgICAgIHN3aXRjaCAoc3RhdGVbMV0pIHsKKyAgICAgIGNhc2UgU1RBVEVfQ1VSUkVOVF9BVFRSSUI6CisgICAgICAgICByZXR1cm4gX05FV19DVVJSRU5UX0FUVFJJQjsKKyAgICAgIGNhc2UgU1RBVEVfQ1VSUkVOVF9BVFRSSUJfTUFZQkVfVlBfQ0xBTVBFRDoKKyAgICAgICAgIHJldHVybiBfTkVXX0NVUlJFTlRfQVRUUklCIHwgX05FV19MSUdIVCB8IF9ORVdfQlVGRkVSUzsKKworICAgICAgY2FzZSBTVEFURV9OT1JNQUxfU0NBTEU6CisgICAgICAgICByZXR1cm4gX05FV19NT0RFTFZJRVc7CisKKyAgICAgIGNhc2UgU1RBVEVfVEVYUkVDVF9TQ0FMRToKKyAgICAgIGNhc2UgU1RBVEVfUk9UX01BVFJJWF8wOgorICAgICAgY2FzZSBTVEFURV9ST1RfTUFUUklYXzE6CisJIHJldHVybiBfTkVXX1RFWFRVUkU7CisgICAgICBjYXNlIFNUQVRFX0ZPR19QQVJBTVNfT1BUSU1JWkVEOgorCSByZXR1cm4gX05FV19GT0c7CisgICAgICBjYXNlIFNUQVRFX1BPSU5UX1NJWkVfQ0xBTVBFRDoKKyAgICAgICAgIHJldHVybiBfTkVXX1BPSU5UIHwgX05FV19NVUxUSVNBTVBMRTsKKyAgICAgIGNhc2UgU1RBVEVfTElHSFRfU1BPVF9ESVJfTk9STUFMSVpFRDoKKyAgICAgIGNhc2UgU1RBVEVfTElHSFRfUE9TSVRJT046CisgICAgICBjYXNlIFNUQVRFX0xJR0hUX1BPU0lUSU9OX05PUk1BTElaRUQ6CisgICAgICBjYXNlIFNUQVRFX0xJR0hUX0hBTEZfVkVDVE9SOgorICAgICAgICAgcmV0dXJuIF9ORVdfTElHSFQ7CisKKyAgICAgIGNhc2UgU1RBVEVfUFRfU0NBTEU6CisgICAgICBjYXNlIFNUQVRFX1BUX0JJQVM6CisgICAgICAgICByZXR1cm4gX05FV19QSVhFTDsKKworICAgICAgY2FzZSBTVEFURV9GQl9TSVpFOgorICAgICAgY2FzZSBTVEFURV9GQl9XUE9TX1lfVFJBTlNGT1JNOgorICAgICAgICAgcmV0dXJuIF9ORVdfQlVGRkVSUzsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIC8qIHVua25vd24gc3RhdGUgaW5kZXhlcyBhcmUgc2lsZW50bHkgaWdub3JlZCBhbmQKKyAgICAgICAgICogIG5vIGZsYWcgc2V0LCBzaW5jZSBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBkcml2ZXIuCisgICAgICAgICAqLworCSByZXR1cm4gMDsKKyAgICAgIH0KKworICAgZGVmYXVsdDoKKyAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgInVuZXhwZWN0ZWQgc3RhdGVbMF0gaW4gbWFrZV9zdGF0ZV9mbGFncygpIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KK30KKworCitzdGF0aWMgdm9pZAorYXBwZW5kKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICAgd2hpbGUgKCpkc3QpCisgICAgICBkc3QrKzsKKyAgIHdoaWxlICgqc3JjKQorICAgICAqZHN0KysgPSAqc3JjKys7CisgICAqZHN0ID0gMDsKK30KKworCisvKioKKyAqIENvbnZlcnQgdG9rZW4gJ2snIHRvIGEgc3RyaW5nLCBhcHBlbmQgaXQgb250byAnZHN0JyBzdHJpbmcuCisgKi8KK3N0YXRpYyB2b2lkCithcHBlbmRfdG9rZW4oY2hhciAqZHN0LCBnbF9zdGF0ZV9pbmRleCBrKQoreworICAgc3dpdGNoIChrKSB7CisgICBjYXNlIFNUQVRFX01BVEVSSUFMOgorICAgICAgYXBwZW5kKGRzdCwgIm1hdGVyaWFsIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfTElHSFQ6CisgICAgICBhcHBlbmQoZHN0LCAibGlnaHQiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9MSUdIVE1PREVMX0FNQklFTlQ6CisgICAgICBhcHBlbmQoZHN0LCAibGlnaHRtb2RlbC5hbWJpZW50Iik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfTElHSFRNT0RFTF9TQ0VORUNPTE9SOgorICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0xJR0hUUFJPRDoKKyAgICAgIGFwcGVuZChkc3QsICJsaWdodHByb2QiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9URVhHRU46CisgICAgICBhcHBlbmQoZHN0LCAidGV4Z2VuIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfRk9HX0NPTE9SOgorICAgICAgYXBwZW5kKGRzdCwgImZvZy5jb2xvciIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0ZPR19QQVJBTVM6CisgICAgICBhcHBlbmQoZHN0LCAiZm9nLnBhcmFtcyIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0NMSVBQTEFORToKKyAgICAgIGFwcGVuZChkc3QsICJjbGlwIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfUE9JTlRfU0laRToKKyAgICAgIGFwcGVuZChkc3QsICJwb2ludC5zaXplIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfUE9JTlRfQVRURU5VQVRJT046CisgICAgICBhcHBlbmQoZHN0LCAicG9pbnQuYXR0ZW51YXRpb24iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9NT0RFTFZJRVdfTUFUUklYOgorICAgICAgYXBwZW5kKGRzdCwgIm1hdHJpeC5tb2RlbHZpZXciKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9QUk9KRUNUSU9OX01BVFJJWDoKKyAgICAgIGFwcGVuZChkc3QsICJtYXRyaXgucHJvamVjdGlvbiIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX01WUF9NQVRSSVg6CisgICAgICBhcHBlbmQoZHN0LCAibWF0cml4Lm12cCIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1RFWFRVUkVfTUFUUklYOgorICAgICAgYXBwZW5kKGRzdCwgIm1hdHJpeC50ZXh0dXJlIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfUFJPR1JBTV9NQVRSSVg6CisgICAgICBhcHBlbmQoZHN0LCAibWF0cml4LnByb2dyYW0iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9NQVRSSVhfSU5WRVJTRToKKyAgICAgIGFwcGVuZChkc3QsICIuaW52ZXJzZSIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX01BVFJJWF9UUkFOU1BPU0U6CisgICAgICBhcHBlbmQoZHN0LCAiLnRyYW5zcG9zZSIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX01BVFJJWF9JTlZUUkFOUzoKKyAgICAgIGFwcGVuZChkc3QsICIuaW52dHJhbnMiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9BTUJJRU5UOgorICAgICAgYXBwZW5kKGRzdCwgIi5hbWJpZW50Iik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfRElGRlVTRToKKyAgICAgIGFwcGVuZChkc3QsICIuZGlmZnVzZSIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1NQRUNVTEFSOgorICAgICAgYXBwZW5kKGRzdCwgIi5zcGVjdWxhciIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0VNSVNTSU9OOgorICAgICAgYXBwZW5kKGRzdCwgIi5lbWlzc2lvbiIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1NISU5JTkVTUzoKKyAgICAgIGFwcGVuZChkc3QsICJsc2hpbmluZXNzIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfSEFMRl9WRUNUT1I6CisgICAgICBhcHBlbmQoZHN0LCAiLmhhbGYiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9QT1NJVElPTjoKKyAgICAgIGFwcGVuZChkc3QsICIucG9zaXRpb24iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9BVFRFTlVBVElPTjoKKyAgICAgIGFwcGVuZChkc3QsICIuYXR0ZW51YXRpb24iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9TUE9UX0RJUkVDVElPTjoKKyAgICAgIGFwcGVuZChkc3QsICIuc3BvdC5kaXJlY3Rpb24iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9TUE9UX0NVVE9GRjoKKyAgICAgIGFwcGVuZChkc3QsICIuc3BvdC5jdXRvZmYiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9URVhHRU5fRVlFX1M6CisgICAgICBhcHBlbmQoZHN0LCAiLmV5ZS5zIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfVEVYR0VOX0VZRV9UOgorICAgICAgYXBwZW5kKGRzdCwgIi5leWUudCIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1RFWEdFTl9FWUVfUjoKKyAgICAgIGFwcGVuZChkc3QsICIuZXllLnIiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9URVhHRU5fRVlFX1E6CisgICAgICBhcHBlbmQoZHN0LCAiLmV5ZS5xIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfVEVYR0VOX09CSkVDVF9TOgorICAgICAgYXBwZW5kKGRzdCwgIi5vYmplY3QucyIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1RFWEdFTl9PQkpFQ1RfVDoKKyAgICAgIGFwcGVuZChkc3QsICIub2JqZWN0LnQiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9URVhHRU5fT0JKRUNUX1I6CisgICAgICBhcHBlbmQoZHN0LCAiLm9iamVjdC5yIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfVEVYR0VOX09CSkVDVF9ROgorICAgICAgYXBwZW5kKGRzdCwgIi5vYmplY3QucSIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1RFWEVOVl9DT0xPUjoKKyAgICAgIGFwcGVuZChkc3QsICJ0ZXhlbnYiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9OVU1fU0FNUExFUzoKKyAgICAgIGFwcGVuZChkc3QsICJudW1zYW1wbGVzIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfREVQVEhfUkFOR0U6CisgICAgICBhcHBlbmQoZHN0LCAiZGVwdGgucmFuZ2UiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9WRVJURVhfUFJPR1JBTToKKyAgIGNhc2UgU1RBVEVfRlJBR01FTlRfUFJPR1JBTToKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9FTlY6CisgICAgICBhcHBlbmQoZHN0LCAiZW52Iik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfTE9DQUw6CisgICAgICBhcHBlbmQoZHN0LCAibG9jYWwiKTsKKyAgICAgIGJyZWFrOworICAgLyogQkVHSU4gaW50ZXJuYWwgc3RhdGUgdmFycyAqLworICAgY2FzZSBTVEFURV9JTlRFUk5BTDoKKyAgICAgIGFwcGVuZChkc3QsICIuaW50ZXJuYWwuIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfQ1VSUkVOVF9BVFRSSUI6CisgICAgICBhcHBlbmQoZHN0LCAiY3VycmVudCIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0NVUlJFTlRfQVRUUklCX01BWUJFX1ZQX0NMQU1QRUQ6CisgICAgICBhcHBlbmQoZHN0LCAiY3VycmVudEF0dHJpYk1heWJlVlBDbGFtcGVkIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfTk9STUFMX1NDQUxFOgorICAgICAgYXBwZW5kKGRzdCwgIm5vcm1hbFNjYWxlIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfVEVYUkVDVF9TQ0FMRToKKyAgICAgIGFwcGVuZChkc3QsICJ0ZXhyZWN0U2NhbGUiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9GT0dfUEFSQU1TX09QVElNSVpFRDoKKyAgICAgIGFwcGVuZChkc3QsICJmb2dQYXJhbXNPcHRpbWl6ZWQiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9QT0lOVF9TSVpFX0NMQU1QRUQ6CisgICAgICBhcHBlbmQoZHN0LCAicG9pbnRTaXplQ2xhbXBlZCIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0xJR0hUX1NQT1RfRElSX05PUk1BTElaRUQ6CisgICAgICBhcHBlbmQoZHN0LCAibGlnaHRTcG90RGlyTm9ybWFsaXplZCIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0xJR0hUX1BPU0lUSU9OOgorICAgICAgYXBwZW5kKGRzdCwgImxpZ2h0UG9zaXRpb24iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9MSUdIVF9QT1NJVElPTl9OT1JNQUxJWkVEOgorICAgICAgYXBwZW5kKGRzdCwgImxpZ2h0LnBvc2l0aW9uLm5vcm1hbGl6ZWQiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9MSUdIVF9IQUxGX1ZFQ1RPUjoKKyAgICAgIGFwcGVuZChkc3QsICJsaWdodEhhbGZWZWN0b3IiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9QVF9TQ0FMRToKKyAgICAgIGFwcGVuZChkc3QsICJQVHNjYWxlIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfUFRfQklBUzoKKyAgICAgIGFwcGVuZChkc3QsICJQVGJpYXMiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9GQl9TSVpFOgorICAgICAgYXBwZW5kKGRzdCwgIkZiU2l6ZSIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0ZCX1dQT1NfWV9UUkFOU0ZPUk06CisgICAgICBhcHBlbmQoZHN0LCAiRmJXcG9zWVRyYW5zZm9ybSIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1JPVF9NQVRSSVhfMDoKKyAgICAgIGFwcGVuZChkc3QsICJyb3RNYXRyaXhSb3cwIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfUk9UX01BVFJJWF8xOgorICAgICAgYXBwZW5kKGRzdCwgInJvdE1hdHJpeFJvdzEiKTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIC8qIHByb2JhYmx5IFNUQVRFX0lOVEVSTkFMX0RSSVZFUitpIChkcml2ZXIgcHJpdmF0ZSBzdGF0ZSkgKi8KKyAgICAgIGFwcGVuZChkc3QsICJkcml2ZXJTdGF0ZSIpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorYXBwZW5kX2ZhY2UoY2hhciAqZHN0LCBHTGludCBmYWNlKQoreworICAgaWYgKGZhY2UgPT0gMCkKKyAgICAgIGFwcGVuZChkc3QsICJmcm9udC4iKTsKKyAgIGVsc2UKKyAgICAgIGFwcGVuZChkc3QsICJiYWNrLiIpOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kX2luZGV4KGNoYXIgKmRzdCwgR0xpbnQgaW5kZXgpCit7CisgICBjaGFyIHNbMjBdOworICAgc3ByaW50ZihzLCAiWyVkXSIsIGluZGV4KTsKKyAgIGFwcGVuZChkc3QsIHMpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gc3RhdGUgdmVjdG9yLgorICogRm9yIGV4YW1wbGUsIHJldHVybiAic3RhdGUubWF0cml4LnRleHR1cmVbMl0uaW52ZXJzZSIuCisgKiBVc2UgZnJlZSgpIHRvIGRlYWxsb2NhdGUgdGhlIHN0cmluZy4KKyAqLworY2hhciAqCitfbWVzYV9wcm9ncmFtX3N0YXRlX3N0cmluZyhjb25zdCBnbF9zdGF0ZV9pbmRleCBzdGF0ZVtTVEFURV9MRU5HVEhdKQoreworICAgY2hhciBzdHJbMTAwMF0gPSAiIjsKKyAgIGNoYXIgdG1wWzMwXTsKKworICAgYXBwZW5kKHN0ciwgInN0YXRlLiIpOworICAgYXBwZW5kX3Rva2VuKHN0ciwgc3RhdGVbMF0pOworCisgICBzd2l0Y2ggKHN0YXRlWzBdKSB7CisgICBjYXNlIFNUQVRFX01BVEVSSUFMOgorICAgICAgYXBwZW5kX2ZhY2Uoc3RyLCBzdGF0ZVsxXSk7CisgICAgICBhcHBlbmRfdG9rZW4oc3RyLCBzdGF0ZVsyXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfTElHSFQ6CisgICAgICBhcHBlbmRfaW5kZXgoc3RyLCBzdGF0ZVsxXSk7IC8qIGxpZ2h0IG51bWJlciBbaV0uICovCisgICAgICBhcHBlbmRfdG9rZW4oc3RyLCBzdGF0ZVsyXSk7IC8qIGNvZWZmaWNpZW50cyAqLworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0xJR0hUTU9ERUxfQU1CSUVOVDoKKyAgICAgIGFwcGVuZChzdHIsICJsaWdodG1vZGVsLmFtYmllbnQiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9MSUdIVE1PREVMX1NDRU5FQ09MT1I6CisgICAgICBpZiAoc3RhdGVbMV0gPT0gMCkgeworICAgICAgICAgYXBwZW5kKHN0ciwgImxpZ2h0bW9kZWwuZnJvbnQuc2NlbmVjb2xvciIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBhcHBlbmQoc3RyLCAibGlnaHRtb2RlbC5iYWNrLnNjZW5lY29sb3IiKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9MSUdIVFBST0Q6CisgICAgICBhcHBlbmRfaW5kZXgoc3RyLCBzdGF0ZVsxXSk7IC8qIGxpZ2h0IG51bWJlciBbaV0uICovCisgICAgICBhcHBlbmRfZmFjZShzdHIsIHN0YXRlWzJdKTsKKyAgICAgIGFwcGVuZF90b2tlbihzdHIsIHN0YXRlWzNdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9URVhHRU46CisgICAgICBhcHBlbmRfaW5kZXgoc3RyLCBzdGF0ZVsxXSk7IC8qIHRleCB1bml0IFtpXSAqLworICAgICAgYXBwZW5kX3Rva2VuKHN0ciwgc3RhdGVbMl0pOyAvKiBwbGFuZSBjb2VmICovCisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfVEVYRU5WX0NPTE9SOgorICAgICAgYXBwZW5kX2luZGV4KHN0ciwgc3RhdGVbMV0pOyAvKiB0ZXggdW5pdCBbaV0gKi8KKyAgICAgIGFwcGVuZChzdHIsICJjb2xvciIpOworICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX0NMSVBQTEFORToKKyAgICAgIGFwcGVuZF9pbmRleChzdHIsIHN0YXRlWzFdKTsgLyogcGxhbmUgW2ldICovCisgICAgICBhcHBlbmQoc3RyLCAiLnBsYW5lIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfTU9ERUxWSUVXX01BVFJJWDoKKyAgIGNhc2UgU1RBVEVfUFJPSkVDVElPTl9NQVRSSVg6CisgICBjYXNlIFNUQVRFX01WUF9NQVRSSVg6CisgICBjYXNlIFNUQVRFX1RFWFRVUkVfTUFUUklYOgorICAgY2FzZSBTVEFURV9QUk9HUkFNX01BVFJJWDoKKyAgICAgIHsKKyAgICAgICAgIC8qIHN0YXRlWzBdID0gbW9kZWx2aWV3LCBwcm9qZWN0aW9uLCB0ZXh0dXJlLCBldGMuICovCisgICAgICAgICAvKiBzdGF0ZVsxXSA9IHdoaWNoIHRleHR1cmUgbWF0cml4IG9yIHByb2dyYW0gbWF0cml4ICovCisgICAgICAgICAvKiBzdGF0ZVsyXSA9IGZpcnN0IHJvdyB0byBmZXRjaCAqLworICAgICAgICAgLyogc3RhdGVbM10gPSBsYXN0IHJvdyB0byBmZXRjaCAqLworICAgICAgICAgLyogc3RhdGVbNF0gPSB0cmFuc3Bvc2UsIGludmVyc2Ugb3IgaW52dHJhbnMgKi8KKyAgICAgICAgIGNvbnN0IGdsX3N0YXRlX2luZGV4IG1hdCA9IHN0YXRlWzBdOworICAgICAgICAgY29uc3QgR0x1aW50IGluZGV4ID0gKEdMdWludCkgc3RhdGVbMV07CisgICAgICAgICBjb25zdCBHTHVpbnQgZmlyc3RSb3cgPSAoR0x1aW50KSBzdGF0ZVsyXTsKKyAgICAgICAgIGNvbnN0IEdMdWludCBsYXN0Um93ID0gKEdMdWludCkgc3RhdGVbM107CisgICAgICAgICBjb25zdCBnbF9zdGF0ZV9pbmRleCBtb2RpZmllciA9IHN0YXRlWzRdOworICAgICAgICAgaWYgKGluZGV4IHx8CisgICAgICAgICAgICAgbWF0ID09IFNUQVRFX1RFWFRVUkVfTUFUUklYIHx8CisgICAgICAgICAgICAgbWF0ID09IFNUQVRFX1BST0dSQU1fTUFUUklYKQorICAgICAgICAgICAgYXBwZW5kX2luZGV4KHN0ciwgaW5kZXgpOworICAgICAgICAgaWYgKG1vZGlmaWVyKQorICAgICAgICAgICAgYXBwZW5kX3Rva2VuKHN0ciwgbW9kaWZpZXIpOworICAgICAgICAgaWYgKGZpcnN0Um93ID09IGxhc3RSb3cpCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIi5yb3dbJWRdIiwgZmlyc3RSb3cpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3ByaW50Zih0bXAsICIucm93WyVkLi4lZF0iLCBmaXJzdFJvdywgbGFzdFJvdyk7CisgICAgICAgICBhcHBlbmQoc3RyLCB0bXApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIFNUQVRFX1BPSU5UX1NJWkU6CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfUE9JTlRfQVRURU5VQVRJT046CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfRk9HX1BBUkFNUzoKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9GT0dfQ09MT1I6CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfTlVNX1NBTVBMRVM6CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfREVQVEhfUkFOR0U6CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfRlJBR01FTlRfUFJPR1JBTToKKyAgIGNhc2UgU1RBVEVfVkVSVEVYX1BST0dSQU06CisgICAgICAvKiBzdGF0ZVsxXSA9IHtTVEFURV9FTlYsIFNUQVRFX0xPQ0FMfSAqLworICAgICAgLyogc3RhdGVbMl0gPSBwYXJhbWV0ZXIgaW5kZXggICAgICAgICAgKi8KKyAgICAgIGFwcGVuZF90b2tlbihzdHIsIHN0YXRlWzFdKTsKKyAgICAgIGFwcGVuZF9pbmRleChzdHIsIHN0YXRlWzJdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTVEFURV9OT1JNQUxfU0NBTEU6CisgICAgICBicmVhazsKKyAgIGNhc2UgU1RBVEVfSU5URVJOQUw6CisgICAgICBhcHBlbmRfdG9rZW4oc3RyLCBzdGF0ZVsxXSk7CisgICAgICBpZiAoc3RhdGVbMV0gPT0gU1RBVEVfQ1VSUkVOVF9BVFRSSUIpCisgICAgICAgICBhcHBlbmRfaW5kZXgoc3RyLCBzdGF0ZVsyXSk7CisgICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiSW52YWxpZCBzdGF0ZSBpbiBfbWVzYV9wcm9ncmFtX3N0YXRlX3N0cmluZyIpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiBfbWVzYV9zdHJkdXAoc3RyKTsKK30KKworCisvKioKKyAqIExvb3Agb3ZlciBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gYSBwYXJhbWV0ZXIgbGlzdC4gIElmIHRoZSBwYXJhbWV0ZXIKKyAqIGlzIGEgR0wgc3RhdGUgcmVmZXJlbmNlLCBsb29rIHVwIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoYXQgc3RhdGUKKyAqIHZhcmlhYmxlIGFuZCBwdXQgaXQgaW50byB0aGUgcGFyYW1ldGVyJ3MgVmFsdWVbNF0gYXJyYXkuCisgKiBPdGhlciBwYXJhbWV0ZXIgdHlwZXMgbmV2ZXIgY2hhbmdlIG9yIGFyZSBleHBsaWNpdGx5IHNldCBieSB0aGUgdXNlcgorICogd2l0aCBnbFVuaWZvcm0oKSBvciBnbFByb2dyYW1QYXJhbWV0ZXIoKSwgZXRjLgorICogVGhpcyB3b3VsZCBiZSBjYWxsZWQgYXQgZ2xCZWdpbiB0aW1lLgorICovCit2b2lkCitfbWVzYV9sb2FkX3N0YXRlX3BhcmFtZXRlcnMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1MaXN0KQoreworICAgR0x1aW50IGk7CisKKyAgIGlmICghcGFyYW1MaXN0KQorICAgICAgcmV0dXJuOworCisgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1MaXN0LT5OdW1QYXJhbWV0ZXJzOyBpKyspIHsKKyAgICAgIGlmIChwYXJhbUxpc3QtPlBhcmFtZXRlcnNbaV0uVHlwZSA9PSBQUk9HUkFNX1NUQVRFX1ZBUikgeworICAgICAgICAgX21lc2FfZmV0Y2hfc3RhdGUoY3R4LAorCQkJICAgcGFyYW1MaXN0LT5QYXJhbWV0ZXJzW2ldLlN0YXRlSW5kZXhlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbUxpc3QtPlBhcmFtZXRlclZhbHVlc1tpXVswXS5mKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19zdGF0ZXZhcnMuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ19zdGF0ZXZhcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2E5ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9nX3N0YXRldmFycy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgUFJPR19TVEFURVZBUlNfSAorI2RlZmluZSBQUk9HX1NUQVRFVkFSU19ICisKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworc3RydWN0IGdsX2NvbnRleHQ7CitzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdDsKKworLyoqCisgKiBOdW1iZXIgb2YgU1RBVEVfKiB2YWx1ZXMgd2UgbmVlZCB0byBhZGRyZXNzIGFueSBHTCBzdGF0ZS4KKyAqIFVzZWQgdG8gZGltZW5zaW9uIGFycmF5cy4KKyAqLworI2RlZmluZSBTVEFURV9MRU5HVEggNQorCisKKy8qKgorICogVXNlZCBmb3IgZGVzY3JpYmluZyBHTCBzdGF0ZSByZWZlcmVuY2VkIGZyb20gaW5zaWRlIEFSQiB2ZXJ0ZXggYW5kCisgKiBmcmFnbWVudCBwcm9ncmFtcy4KKyAqIEEgc3RyaW5nIHN1Y2ggYXMgInN0YXRlLmxpZ2h0WzBdLmFtYmllbnQiIGdldHMgdHJhbnNsYXRlZCBpbnRvIGEKKyAqIHNlcXVlbmNlIG9mIHRva2VucyBzdWNoIGFzIFsgU1RBVEVfTElHSFQsIDAsIFNUQVRFX0FNQklFTlQgXS4KKyAqCisgKiBGb3Igc3RhdGUgdGhhdCdzIGFuIGFycmF5LCBsaWtlIFNUQVRFX0NMSVBQTEFORSwgdGhlIDJuZCB0b2tlbiBbMV0gc2hvdWxkCisgKiBhbHdheXMgYmUgdGhlIGFycmF5IGluZGV4LgorICovCit0eXBlZGVmIGVudW0gZ2xfc3RhdGVfaW5kZXhfIHsKKyAgIFNUQVRFX01BVEVSSUFMID0gMTAwLCAgLyogc3RhcnQgYXQgMTAwIHNvIHNtYWxsIGludHMgYXJlIHNlZW4gYXMgaW50cyAqLworCisgICBTVEFURV9MSUdIVCwKKyAgIFNUQVRFX0xJR0hUTU9ERUxfQU1CSUVOVCwKKyAgIFNUQVRFX0xJR0hUTU9ERUxfU0NFTkVDT0xPUiwKKyAgIFNUQVRFX0xJR0hUUFJPRCwKKworICAgU1RBVEVfVEVYR0VOLAorCisgICBTVEFURV9GT0dfQ09MT1IsCisgICBTVEFURV9GT0dfUEFSQU1TLAorCisgICBTVEFURV9DTElQUExBTkUsCisKKyAgIFNUQVRFX1BPSU5UX1NJWkUsCisgICBTVEFURV9QT0lOVF9BVFRFTlVBVElPTiwKKworICAgU1RBVEVfTU9ERUxWSUVXX01BVFJJWCwKKyAgIFNUQVRFX1BST0pFQ1RJT05fTUFUUklYLAorICAgU1RBVEVfTVZQX01BVFJJWCwKKyAgIFNUQVRFX1RFWFRVUkVfTUFUUklYLAorICAgU1RBVEVfUFJPR1JBTV9NQVRSSVgsCisgICBTVEFURV9NQVRSSVhfSU5WRVJTRSwKKyAgIFNUQVRFX01BVFJJWF9UUkFOU1BPU0UsCisgICBTVEFURV9NQVRSSVhfSU5WVFJBTlMsCisKKyAgIFNUQVRFX0FNQklFTlQsCisgICBTVEFURV9ESUZGVVNFLAorICAgU1RBVEVfU1BFQ1VMQVIsCisgICBTVEFURV9FTUlTU0lPTiwKKyAgIFNUQVRFX1NISU5JTkVTUywKKyAgIFNUQVRFX0hBTEZfVkVDVE9SLAorCisgICBTVEFURV9QT1NJVElPTiwgICAgICAgLyoqPCB4eXp3ID0gcG9zaXRpb24gKi8KKyAgIFNUQVRFX0FUVEVOVUFUSU9OLCAgICAvKio8IHh5eiA9IGF0dGVudWF0aW9uLCB3ID0gc3BvdCBleHBvbmVudCAqLworICAgU1RBVEVfU1BPVF9ESVJFQ1RJT04sIC8qKjwgeHl6ID0gZGlyZWN0aW9uLCB3ID0gY29zKGN1dG9mZikgKi8KKyAgIFNUQVRFX1NQT1RfQ1VUT0ZGLCAgICAvKio8IHggPSBjdXRvZmYsIHl6dyA9IHVuZGVmaW5lZCAqLworCisgICBTVEFURV9URVhHRU5fRVlFX1MsCisgICBTVEFURV9URVhHRU5fRVlFX1QsCisgICBTVEFURV9URVhHRU5fRVlFX1IsCisgICBTVEFURV9URVhHRU5fRVlFX1EsCisgICBTVEFURV9URVhHRU5fT0JKRUNUX1MsCisgICBTVEFURV9URVhHRU5fT0JKRUNUX1QsCisgICBTVEFURV9URVhHRU5fT0JKRUNUX1IsCisgICBTVEFURV9URVhHRU5fT0JKRUNUX1EsCisKKyAgIFNUQVRFX1RFWEVOVl9DT0xPUiwKKworICAgU1RBVEVfTlVNX1NBTVBMRVMsICAgIC8qIEFuIGludGVnZXIsIG5vdCBhIGZsb2F0IGxpa2UgdGhlIG90aGVyIHN0YXRlIHZhcnMgKi8KKworICAgU1RBVEVfREVQVEhfUkFOR0UsCisKKyAgIFNUQVRFX1ZFUlRFWF9QUk9HUkFNLAorICAgU1RBVEVfRlJBR01FTlRfUFJPR1JBTSwKKworICAgU1RBVEVfRU5WLAorICAgU1RBVEVfTE9DQUwsCisKKyAgIFNUQVRFX0lOVEVSTkFMLAkJLyogTWVzYSBhZGRpdGlvbnMgKi8KKyAgIFNUQVRFX0NVUlJFTlRfQVRUUklCLCAgICAgICAgLyogY3R4LT5DdXJyZW50IHZlcnRleCBhdHRyaWIgdmFsdWUgKi8KKyAgIFNUQVRFX0NVUlJFTlRfQVRUUklCX01BWUJFX1ZQX0NMQU1QRUQsICAgICAgICAvKiBjdHgtPkN1cnJlbnQgdmVydGV4IGF0dHJpYiB2YWx1ZSBhZnRlciBwYXNzdGhyb3VnaCB2ZXJ0ZXggcHJvY2Vzc2luZyAqLworICAgU1RBVEVfTk9STUFMX1NDQUxFLAorICAgU1RBVEVfVEVYUkVDVF9TQ0FMRSwKKyAgIFNUQVRFX0ZPR19QQVJBTVNfT1BUSU1JWkVELCAgLyogZm9yIGZhc3RlciBmb2cgY2FsYyAqLworICAgU1RBVEVfUE9JTlRfU0laRV9DTEFNUEVELCAgICAvKiBpbmNsdWRlcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgc2l6ZSBjbGFtcCAqLworICAgU1RBVEVfTElHSFRfU1BPVF9ESVJfTk9STUFMSVpFRCwgICAvKiBwcmUtbm9ybWFsaXplZCBzcG90IGRpciAqLworICAgU1RBVEVfTElHSFRfUE9TSVRJT04sICAgICAgICAgICAgICAvKiBvYmplY3QgdnMgZXllIHNwYWNlICovCisgICBTVEFURV9MSUdIVF9QT1NJVElPTl9OT1JNQUxJWkVELCAgIC8qIG9iamVjdCB2cyBleWUgc3BhY2UgKi8KKyAgIFNUQVRFX0xJR0hUX0hBTEZfVkVDVE9SLCAgICAgICAgICAgLyogb2JqZWN0IHZzIGV5ZSBzcGFjZSAqLworICAgU1RBVEVfUFRfU0NBTEUsICAgICAgICAgICAgICAvKio8IFBpeGVsIHRyYW5zZmVyIFJHQkEgc2NhbGUgKi8KKyAgIFNUQVRFX1BUX0JJQVMsICAgICAgICAgICAgICAgLyoqPCBQaXhlbCB0cmFuc2ZlciBSR0JBIGJpYXMgKi8KKyAgIFNUQVRFX0ZCX1NJWkUsICAgICAgICAgICAgICAgLyoqPCAod2lkdGgtMSwgaGVpZ2h0LTEsIDAsIDApICovCisgICBTVEFURV9GQl9XUE9TX1lfVFJBTlNGT1JNLCAgIC8qKjwgKDEsIDAsIC0xLCBoZWlnaHQpIGlmIGEgRkJPIGlzIGJvdW5kLCAoLTEsIGhlaWdodCwgMSwgMCkgb3RoZXJ3aXNlICovCisgICBTVEFURV9ST1RfTUFUUklYXzAsICAgICAgICAgIC8qKjwgQVRJX2Vudm1hcF9idW1wbWFwLCByb3QgbWF0cml4IHJvdyAwICovCisgICBTVEFURV9ST1RfTUFUUklYXzEsICAgICAgICAgIC8qKjwgQVRJX2Vudm1hcF9idW1wbWFwLCByb3QgbWF0cml4IHJvdyAxICovCisgICBTVEFURV9JTlRFUk5BTF9EUklWRVIJLyogZmlyc3QgYXZhaWxhYmxlIHN0YXRlIGluZGV4IGZvciBkcml2ZXJzIChtdXN0IGJlIGxhc3QpICovCit9IGdsX3N0YXRlX2luZGV4OworCisKKworZXh0ZXJuIHZvaWQKK19tZXNhX2xvYWRfc3RhdGVfcGFyYW1ldGVycyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbUxpc3QpOworCisKK2V4dGVybiBHTGJpdGZpZWxkCitfbWVzYV9wcm9ncmFtX3N0YXRlX2ZsYWdzKGNvbnN0IGdsX3N0YXRlX2luZGV4IHN0YXRlW1NUQVRFX0xFTkdUSF0pOworCisKK2V4dGVybiBjaGFyICoKK19tZXNhX3Byb2dyYW1fc3RhdGVfc3RyaW5nKGNvbnN0IGdsX3N0YXRlX2luZGV4IHN0YXRlW1NUQVRFX0xFTkdUSF0pOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBST0dfU1RBVEVWQVJTX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9ncmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzNjBhYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbS5jCkBAIC0wLDAgKzEsMTA4OCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHByb2dyYW0uYworICogVmVydGV4IGFuZCBmcmFnbWVudCBwcm9ncmFtIHN1cHBvcnQgZnVuY3Rpb25zLgorICogXGF1dGhvciBCcmlhbiBQYXVsCisgKi8KKworCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRzogQURECisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vY29udGV4dC5oIgorI2luY2x1ZGUgIm1haW4vaGFzaC5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicHJvZ3JhbS5oIgorLy8jaW5jbHVkZSAicHJvZ19jYWNoZS5oIgorI2luY2x1ZGUgInByb2dfcGFyYW1ldGVyLmgiCisjaW5jbHVkZSAicHJvZ19pbnN0cnVjdGlvbi5oIgorCisKKy8qKgorICogQSBwb2ludGVyIHRvIHRoaXMgZHVtbXkgcHJvZ3JhbSBpcyBwdXQgaW50byB0aGUgaGFzaCB0YWJsZSB3aGVuCisgKiBnbEdlblByb2dyYW1zIGlzIGNhbGxlZC4KKyAqLworc3RydWN0IGdsX3Byb2dyYW0gX21lc2FfRHVtbXlQcm9ncmFtOworCisKKy8qKgorICogSW5pdCBjb250ZXh0J3MgdmVydGV4L2ZyYWdtZW50IHByb2dyYW0gc3RhdGUKKyAqLwordm9pZAorX21lc2FfaW5pdF9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICAvKgorICAgICogSWYgdGhpcyBhc3NlcnRpb24gZmFpbHMsIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIGZpZWxkCisgICAgKiBzaXplIGZvciByZWdpc3RlciBpbmRleGVzIChzZWUgSU5TVF9JTkRFWF9CSVRTKS4KKyAgICAqLworICAgQVNTRVJUKGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heFVuaWZvcm1Db21wb25lbnRzIC8gNAorICAgICAgICAgIDw9ICgxIDw8IElOU1RfSU5ERVhfQklUUykpOworICAgQVNTRVJUKGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VW5pZm9ybUNvbXBvbmVudHMgLyA0CisgICAgICAgICAgPD0gKDEgPDwgSU5TVF9JTkRFWF9CSVRTKSk7CisKKyAgIEFTU0VSVChjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhUZW1wcyA8PSAoMSA8PCBJTlNUX0lOREVYX0JJVFMpKTsKKyAgIEFTU0VSVChjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhMb2NhbFBhcmFtcyA8PSAoMSA8PCBJTlNUX0lOREVYX0JJVFMpKTsKKyAgIEFTU0VSVChjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heFRlbXBzIDw9ICgxIDw8IElOU1RfSU5ERVhfQklUUykpOworICAgQVNTRVJUKGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TG9jYWxQYXJhbXMgPD0gKDEgPDwgSU5TVF9JTkRFWF9CSVRTKSk7CisKKyAgIEFTU0VSVChjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhVbmlmb3JtQ29tcG9uZW50cyA8PSA0ICogTUFYX1VOSUZPUk1TKTsKKyAgIEFTU0VSVChjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heFVuaWZvcm1Db21wb25lbnRzIDw9IDQgKiBNQVhfVU5JRk9STVMpOworCisgICBBU1NFUlQoY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4QWRkcmVzc09mZnNldCA8PSAoMSA8PCBJTlNUX0lOREVYX0JJVFMpKTsKKyAgIEFTU0VSVChjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heEFkZHJlc3NPZmZzZXQgPD0gKDEgPDwgSU5TVF9JTkRFWF9CSVRTKSk7CisKKyAgIC8qIElmIHRoaXMgZmFpbHMsIGluY3JlYXNlIHByb2dfaW5zdHJ1Y3Rpb246OlRleFNyY1VuaXQgc2l6ZSAqLworICAgU1RBVElDX0FTU0VSVChNQVhfVEVYVFVSRV9VTklUUyA8PSAoMSA8PCA1KSk7CisKKyAgIC8qIElmIHRoaXMgZmFpbHMsIGluY3JlYXNlIHByb2dfaW5zdHJ1Y3Rpb246OlRleFNyY1RhcmdldCBzaXplICovCisgICBTVEFUSUNfQVNTRVJUKE5VTV9URVhUVVJFX1RBUkdFVFMgPD0gKDEgPDwgNCkpOworCisgICBjdHgtPlByb2dyYW0uRXJyb3JQb3MgPSAtMTsKKyAgIGN0eC0+UHJvZ3JhbS5FcnJvclN0cmluZyA9IF9tZXNhX3N0cmR1cCgiIik7CisKKyAgIGN0eC0+VmVydGV4UHJvZ3JhbS5FbmFibGVkID0gR0xfRkFMU0U7CisgICBjdHgtPlZlcnRleFByb2dyYW0uUG9pbnRTaXplRW5hYmxlZCA9CisgICAgICAoY3R4LT5BUEkgPT0gQVBJX09QRU5HTEVTMikgPyBHTF9UUlVFIDogR0xfRkFMU0U7CisgICBjdHgtPlZlcnRleFByb2dyYW0uVHdvU2lkZUVuYWJsZWQgPSBHTF9GQUxTRTsKKyAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPlNoYXJlZC0+RGVmYXVsdFZlcnRleFByb2dyYW0pOworICAgYXNzZXJ0KGN0eC0+VmVydGV4UHJvZ3JhbS5DdXJyZW50KTsKKy8vICAgY3R4LT5WZXJ0ZXhQcm9ncmFtLkNhY2hlID0gX21lc2FfbmV3X3Byb2dyYW1fY2FjaGUoKTsKKworICAgY3R4LT5GcmFnbWVudFByb2dyYW0uRW5hYmxlZCA9IEdMX0ZBTFNFOworICAgX21lc2FfcmVmZXJlbmNlX2ZyYWdwcm9nKGN0eCwgJmN0eC0+RnJhZ21lbnRQcm9ncmFtLkN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5TaGFyZWQtPkRlZmF1bHRGcmFnbWVudFByb2dyYW0pOworICAgYXNzZXJ0KGN0eC0+RnJhZ21lbnRQcm9ncmFtLkN1cnJlbnQpOworLy8gICBjdHgtPkZyYWdtZW50UHJvZ3JhbS5DYWNoZSA9IF9tZXNhX25ld19wcm9ncmFtX2NhY2hlKCk7CisKKyAgIGN0eC0+R2VvbWV0cnlQcm9ncmFtLkVuYWJsZWQgPSBHTF9GQUxTRTsKKyAgIC8qIHJpZ2h0IG5vdyBieSBkZWZhdWx0IHdlIGRvbid0IGhhdmUgYSBnZW9tZXRyeSBwcm9ncmFtICovCisgICBfbWVzYV9yZWZlcmVuY2VfZ2VvbXByb2coY3R4LCAmY3R4LT5HZW9tZXRyeVByb2dyYW0uQ3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKy8vICAgY3R4LT5HZW9tZXRyeVByb2dyYW0uQ2FjaGUgPSBfbWVzYV9uZXdfcHJvZ3JhbV9jYWNoZSgpOworCisgICAvKiBYWFggcHJvYmFibHkgbW92ZSB0aGlzIHN0dWZmICovCisgICBjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkVuYWJsZWQgPSBHTF9GQUxTRTsKKyAgIGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudCA9IGN0eC0+U2hhcmVkLT5EZWZhdWx0RnJhZ21lbnRTaGFkZXI7CisgICBhc3NlcnQoY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50KTsKKyAgIGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudC0+UmVmQ291bnQrKzsKK30KKworCisvKioKKyAqIEZyZWUgYSBjb250ZXh0J3MgdmVydGV4L2ZyYWdtZW50IHByb2dyYW0gc3RhdGUKKyAqLwordm9pZAorX21lc2FfZnJlZV9wcm9ncmFtX2RhdGEoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIF9tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhjdHgsICZjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudCwgTlVMTCk7CisvLyAgIF9tZXNhX2RlbGV0ZV9wcm9ncmFtX2NhY2hlKGN0eCwgY3R4LT5WZXJ0ZXhQcm9ncmFtLkNhY2hlKTsKKyAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5DdXJyZW50LCBOVUxMKTsKKy8vICAgX21lc2FfZGVsZXRlX3NoYWRlcl9jYWNoZShjdHgsIGN0eC0+RnJhZ21lbnRQcm9ncmFtLkNhY2hlKTsKKyAgIF9tZXNhX3JlZmVyZW5jZV9nZW9tcHJvZyhjdHgsICZjdHgtPkdlb21ldHJ5UHJvZ3JhbS5DdXJyZW50LCBOVUxMKTsKKy8vICAgX21lc2FfZGVsZXRlX3Byb2dyYW1fY2FjaGUoY3R4LCBjdHgtPkdlb21ldHJ5UHJvZ3JhbS5DYWNoZSk7CisKKyAgIC8qIFhYWCBwcm9iYWJseSBtb3ZlIHRoaXMgc3R1ZmYgKi8KKyAgIGlmIChjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkN1cnJlbnQpIHsKKyAgICAgIGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudC0+UmVmQ291bnQtLTsKKyAgICAgIGlmIChjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkN1cnJlbnQtPlJlZkNvdW50IDw9IDApIHsKKyAgICAgICAgIGZyZWUoY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50KTsKKyAgICAgIH0KKyAgIH0KKworICAgZnJlZSgodm9pZCAqKSBjdHgtPlByb2dyYW0uRXJyb3JTdHJpbmcpOworfQorCisKKy8qKgorICogVXBkYXRlIHRoZSBkZWZhdWx0IHByb2dyYW0gb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29udGV4dCB0byByZWZlcmVuY2UgdGhvc2UKKyAqIHNwZWNpZmllZCBpbiB0aGUgc2hhcmVkIHN0YXRlIGFuZCByZWxlYXNlIHRob3NlIHJlZmVyZW5jaW5nIHRoZSBvbGQKKyAqIHNoYXJlZCBzdGF0ZS4KKyAqLwordm9pZAorX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c19wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBfbWVzYV9yZWZlcmVuY2VfdmVydHByb2coY3R4LCAmY3R4LT5WZXJ0ZXhQcm9ncmFtLkN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5TaGFyZWQtPkRlZmF1bHRWZXJ0ZXhQcm9ncmFtKTsKKyAgIGFzc2VydChjdHgtPlZlcnRleFByb2dyYW0uQ3VycmVudCk7CisKKyAgIF9tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhjdHgsICZjdHgtPkZyYWdtZW50UHJvZ3JhbS5DdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+U2hhcmVkLT5EZWZhdWx0RnJhZ21lbnRQcm9ncmFtKTsKKyAgIGFzc2VydChjdHgtPkZyYWdtZW50UHJvZ3JhbS5DdXJyZW50KTsKKworICAgX21lc2FfcmVmZXJlbmNlX2dlb21wcm9nKGN0eCwgJmN0eC0+R2VvbWV0cnlQcm9ncmFtLkN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgY3R4LT5TaGFyZWQtPkRlZmF1bHRHZW9tZXRyeVByb2dyYW0pOworCisgICAvKiBYWFggcHJvYmFibHkgbW92ZSB0aGlzIHN0dWZmICovCisgICBpZiAoY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50KSB7CisgICAgICBjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkN1cnJlbnQtPlJlZkNvdW50LS07CisgICAgICBpZiAoY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50LT5SZWZDb3VudCA8PSAwKSB7CisgICAgICAgICBmcmVlKGN0eC0+QVRJRnJhZ21lbnRTaGFkZXIuQ3VycmVudCk7CisgICAgICB9CisgICB9CisgICBjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkN1cnJlbnQgPSAoc3RydWN0IGF0aV9mcmFnbWVudF9zaGFkZXIgKikgY3R4LT5TaGFyZWQtPkRlZmF1bHRGcmFnbWVudFNoYWRlcjsKKyAgIGFzc2VydChjdHgtPkFUSUZyYWdtZW50U2hhZGVyLkN1cnJlbnQpOworICAgY3R4LT5BVElGcmFnbWVudFNoYWRlci5DdXJyZW50LT5SZWZDb3VudCsrOworfQorCisKKy8qKgorICogU2V0IHRoZSB2ZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbSBlcnJvciBzdGF0ZSAocG9zaXRpb24gYW5kIGVycm9yIHN0cmluZykuCisgKiBUaGlzIGlzIGdlbmVyYWxseSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlcnMuCisgKi8KK3ZvaWQKK19tZXNhX3NldF9wcm9ncmFtX2Vycm9yKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMaW50IHBvcywgY29uc3QgY2hhciAqc3RyaW5nKQoreworICAgY3R4LT5Qcm9ncmFtLkVycm9yUG9zID0gcG9zOworICAgZnJlZSgodm9pZCAqKSBjdHgtPlByb2dyYW0uRXJyb3JTdHJpbmcpOworICAgaWYgKCFzdHJpbmcpCisgICAgICBzdHJpbmcgPSAiIjsKKyAgIGN0eC0+UHJvZ3JhbS5FcnJvclN0cmluZyA9IF9tZXNhX3N0cmR1cChzdHJpbmcpOworfQorCisKKy8qKgorICogRmluZCB0aGUgbGluZSBudW1iZXIgYW5kIGNvbHVtbiBmb3IgJ3Bvcycgd2l0aGluICdzdHJpbmcnLgorICogUmV0dXJuIGEgY29weSBvZiB0aGUgbGluZSB3aGljaCBjb250YWlucyAncG9zJy4gIEZyZWUgdGhlIGxpbmUgd2l0aAorICogZnJlZSgpLgorICogXHBhcmFtIHN0cmluZyAgdGhlIHByb2dyYW0gc3RyaW5nCisgKiBccGFyYW0gcG9zICAgICB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJpbmcKKyAqIFxwYXJhbSBsaW5lICAgIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gJ3BvcycuCisgKiBccGFyYW0gY29sICAgICByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gJ3BvcycuCisgKiBccmV0dXJuIGNvcHkgb2YgdGhlIGxpbmUgY29udGFpbmluZyAncG9zJy4KKyAqLworY29uc3QgR0x1Ynl0ZSAqCitfbWVzYV9maW5kX2xpbmVfY29sdW1uKGNvbnN0IEdMdWJ5dGUgKnN0cmluZywgY29uc3QgR0x1Ynl0ZSAqcG9zLAorICAgICAgICAgICAgICAgICAgICAgICBHTGludCAqbGluZSwgR0xpbnQgKmNvbCkKK3sKKyAgIGNvbnN0IEdMdWJ5dGUgKmxpbmVTdGFydCA9IHN0cmluZzsKKyAgIGNvbnN0IEdMdWJ5dGUgKnAgPSBzdHJpbmc7CisgICBHTHVieXRlICpzOworICAgaW50IGxlbjsKKworICAgKmxpbmUgPSAxOworCisgICB3aGlsZSAocCAhPSBwb3MpIHsKKyAgICAgIGlmICgqcCA9PSAoR0x1Ynl0ZSkgJ1xuJykgeworICAgICAgICAgKCpsaW5lKSsrOworICAgICAgICAgbGluZVN0YXJ0ID0gcCArIDE7CisgICAgICB9CisgICAgICBwKys7CisgICB9CisKKyAgICpjb2wgPSAocG9zIC0gbGluZVN0YXJ0KSArIDE7CisKKyAgIC8qIHJldHVybiBjb3B5IG9mIHRoaXMgbGluZSAqLworICAgd2hpbGUgKCpwICE9IDAgJiYgKnAgIT0gJ1xuJykKKyAgICAgIHArKzsKKyAgIGxlbiA9IHAgLSBsaW5lU3RhcnQ7CisgICBzID0gbWFsbG9jKGxlbiArIDEpOworICAgbWVtY3B5KHMsIGxpbmVTdGFydCwgbGVuKTsKKyAgIHNbbGVuXSA9IDA7CisKKyAgIHJldHVybiBzOworfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyB2ZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbSBvYmplY3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9pbml0X3Byb2dyYW1fc3RydWN0KCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCkKK3sKKyAgICh2b2lkKSBjdHg7CisgICBpZiAocHJvZykgeworICAgICAgR0x1aW50IGk7CisgICAgICBtZW1zZXQocHJvZywgMCwgc2l6ZW9mKCpwcm9nKSk7CisgICAgICBwcm9nLT5JZCA9IGlkOworICAgICAgcHJvZy0+VGFyZ2V0ID0gdGFyZ2V0OworICAgICAgLy8gTHVuYXJHOiBWSyBkb2VzIG5vdCB1c2UgcmVmZXJlbmNlIGNvdW50cworICAgICAgLy8gcHJvZy0+UmVmQ291bnQgPSAxOworICAgICAgcHJvZy0+Rm9ybWF0ID0gR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCOworCisgICAgICAvKiBkZWZhdWx0IG1hcHBpbmcgZnJvbSBzYW1wbGVycyB0byB0ZXh0dXJlIHVuaXRzICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NBTVBMRVJTOyBpKyspCisgICAgICAgICBwcm9nLT5TYW1wbGVyVW5pdHNbaV0gPSBpOworICAgfQorCisgICByZXR1cm4gcHJvZzsKK30KKworCisvKioKKyAqIEluaXRpYWxpemUgYSBuZXcgZnJhZ21lbnQgcHJvZ3JhbSBvYmplY3QuCisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2luaXRfZnJhZ21lbnRfcHJvZ3JhbSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCkKK3sKKyAgIGlmIChwcm9nKQorICAgICAgcmV0dXJuIF9tZXNhX2luaXRfcHJvZ3JhbV9zdHJ1Y3QoIGN0eCwgJnByb2ctPkJhc2UsIHRhcmdldCwgaWQgKTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyB2ZXJ0ZXggcHJvZ3JhbSBvYmplY3QuCisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2luaXRfdmVydGV4X3Byb2dyYW0oIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCkKK3sKKyAgIGlmIChwcm9nKQorICAgICAgcmV0dXJuIF9tZXNhX2luaXRfcHJvZ3JhbV9zdHJ1Y3QoIGN0eCwgJnByb2ctPkJhc2UsIHRhcmdldCwgaWQgKTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyBjb21wdXRlIHByb2dyYW0gb2JqZWN0LgorICovCitzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9pbml0X2NvbXB1dGVfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2NvbXB1dGVfcHJvZ3JhbSAqcHJvZywgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBpZCkKK3sKKyAgIGlmIChwcm9nKQorICAgICAgcmV0dXJuIF9tZXNhX2luaXRfcHJvZ3JhbV9zdHJ1Y3QoIGN0eCwgJnByb2ctPkJhc2UsIHRhcmdldCwgaWQgKTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyBnZW9tZXRyeSBwcm9ncmFtIG9iamVjdC4KKyAqLworc3RydWN0IGdsX3Byb2dyYW0gKgorX21lc2FfaW5pdF9nZW9tZXRyeV9wcm9ncmFtKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKQoreworICAgaWYgKHByb2cpCisgICAgICByZXR1cm4gX21lc2FfaW5pdF9wcm9ncmFtX3N0cnVjdCggY3R4LCAmcHJvZy0+QmFzZSwgdGFyZ2V0LCBpZCApOworICAgZWxzZQorICAgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBmcmFnbWVudC92ZXJ0ZXggcHJvZ3JhbSBvYmplY3QgYnV0CisgKiBkb24ndCBwdXQgaXQgaW50byB0aGUgcHJvZ3JhbSBoYXNoIHRhYmxlLiAgQ2FsbGVkIHZpYQorICogY3R4LT5Ecml2ZXIuTmV3UHJvZ3JhbS4gIE1heSBiZSBvdmVycmlkZGVuIChpZS4gcmVwbGFjZWQpIGJ5IGEKKyAqIGRldmljZSBkcml2ZXIgZnVuY3Rpb24gdG8gaW1wbGVtZW50IE9PIGRlcml2aWF0aW9uIHdpdGggYWRkaXRpb25hbAorICogdHlwZXMgbm90IHVuZGVyc3Rvb2QgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBccGFyYW0gY3R4ICBjb250ZXh0CisgKiBccGFyYW0gaWQgICBwcm9ncmFtIGlkL251bWJlcgorICogXHBhcmFtIHRhcmdldCAgcHJvZ3JhbSB0YXJnZXQvdHlwZQorICogXHJldHVybiAgcG9pbnRlciB0byBuZXcgcHJvZ3JhbSBvYmplY3QKKyAqLworc3RydWN0IGdsX3Byb2dyYW0gKgorX21lc2FfbmV3X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKQoreworICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2c7CisgICBzd2l0Y2ggKHRhcmdldCkgeworICAgY2FzZSBHTF9WRVJURVhfUFJPR1JBTV9BUkI6IC8qID09IEdMX1ZFUlRFWF9QUk9HUkFNX05WICovCisgICAgICBwcm9nID0gX21lc2FfaW5pdF92ZXJ0ZXhfcHJvZ3JhbShjdHgsIENBTExPQ19TVFJVQ1QoZ2xfdmVydGV4X3Byb2dyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBpZCApOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fTlY6CisgICBjYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCOgorICAgICAgcHJvZyA9X21lc2FfaW5pdF9mcmFnbWVudF9wcm9ncmFtKGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTE9DX1NUUlVDVChnbF9mcmFnbWVudF9wcm9ncmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBpZCApOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfR0VPTUVUUllfUFJPR1JBTToKKyAgICAgIHByb2cgPSBfbWVzYV9pbml0X2dlb21ldHJ5X3Byb2dyYW0oY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMT0NfU1RSVUNUKGdsX2dlb21ldHJ5X3Byb2dyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGlkKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTF9DT01QVVRFX1BST0dSQU1fTlY6CisgICAgICBwcm9nID0gX21lc2FfaW5pdF9jb21wdXRlX3Byb2dyYW0oY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTExPQ19TVFJVQ1QoZ2xfY29tcHV0ZV9wcm9ncmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGlkKTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIF9tZXNhX3Byb2JsZW0oY3R4LCAiYmFkIHRhcmdldCBpbiBfbWVzYV9uZXdfcHJvZ3JhbSIpOworICAgICAgcHJvZyA9IE5VTEw7CisgICB9CisgICByZXR1cm4gcHJvZzsKK30KKworCisvKioKKyAqIERlbGV0ZSBhIHByb2dyYW0gYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBoYXNoIHRhYmxlLCBpZ25vcmluZyB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqIENhbGxlZCB2aWEgY3R4LT5Ecml2ZXIuRGVsZXRlUHJvZ3JhbS4gIE1heSBiZSB3cmFwcGVkIChPTyBkZXJpdmlhdGlvbikKKyAqIGJ5IGEgZGV2aWNlIGRyaXZlciBmdW5jdGlvbi4KKyAqLwordm9pZAorX21lc2FfZGVsZXRlX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICAodm9pZCkgY3R4OworICAgQVNTRVJUKHByb2cpOworICAgLy8gTHVuYXJHOiBWSyBkb2VzIG5vdCB1c2UgcmVmZXJlbmNlIGNvdW50cworICAgLy9BU1NFUlQocHJvZy0+UmVmQ291bnQ9PTApOworCisgICBpZiAocHJvZyA9PSAmX21lc2FfRHVtbXlQcm9ncmFtKQorICAgICAgcmV0dXJuOworCisgICBmcmVlKHByb2ctPlN0cmluZyk7CisgICBmcmVlKHByb2ctPkxvY2FsUGFyYW1zKTsKKworICAgaWYgKHByb2ctPkluc3RydWN0aW9ucykgeworICAgICAgX21lc2FfZnJlZV9pbnN0cnVjdGlvbnMocHJvZy0+SW5zdHJ1Y3Rpb25zLCBwcm9nLT5OdW1JbnN0cnVjdGlvbnMpOworICAgfQorICAgaWYgKHByb2ctPlBhcmFtZXRlcnMpIHsKKyAgICAgICBfbWVzYV9mcmVlX3BhcmFtZXRlcl9saXN0KHByb2ctPlBhcmFtZXRlcnMpOworICAgfQorCisgICBmcmVlKHByb2cpOworfQorCisKKy8qKgorICogUmV0dXJuIHRoZSBnbF9wcm9ncmFtIG9iamVjdCBmb3IgYSBnaXZlbiBJRC4KKyAqIEJhc2ljYWxseSBqdXN0IGEgd3JhcHBlciBmb3IgX21lc2FfSGFzaExvb2t1cCgpIHRvIGF2b2lkIGEgbG90IG9mCisgKiBjYXN0cyBlbHNld2hlcmUuCisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2xvb2t1cF9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBpZCkKK3sKKyAgIGlmIChpZCkKKyAgICAgIHJldHVybiAoc3RydWN0IGdsX3Byb2dyYW0gKikgX21lc2FfSGFzaExvb2t1cChjdHgtPlNoYXJlZC0+UHJvZ3JhbXMsIGlkKTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworfQorCisKKy8qKgorICogUmVmZXJlbmNlIGNvdW50aW5nIGZvciB2ZXJ0ZXgvZnJhZ21lbnQgcHJvZ3JhbXMKKyAqIFRoaXMgaXMgbm9ybWFsbHkgb25seSBjYWxsZWQgZnJvbSB0aGUgX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oKSBtYWNybworICogd2hlbiB0aGVyZSdzIGEgcmVhbCBwb2ludGVyIGNoYW5nZS4KKyAqLwordm9pZAorX21lc2FfcmVmZXJlbmNlX3Byb2dyYW1fKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisvLyBMdW5hckc6IFZLIGRvZXMgbm90IHVzZSByZWZlcmVuY2UgY291bnRzCisjaWYgMAorI2lmbmRlZiBOREVCVUcKKyAgIGFzc2VydChwdHIpOworICAgaWYgKCpwdHIgJiYgcHJvZykgeworICAgICAgLyogc2FuaXR5IGNoZWNrICovCisgICAgICBpZiAoKCpwdHIpLT5UYXJnZXQgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCKQorICAgICAgICAgQVNTRVJUKHByb2ctPlRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIpOworICAgICAgZWxzZSBpZiAoKCpwdHIpLT5UYXJnZXQgPT0gR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIpCisgICAgICAgICBBU1NFUlQocHJvZy0+VGFyZ2V0ID09IEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCIHx8CisgICAgICAgICAgICAgICAgcHJvZy0+VGFyZ2V0ID09IEdMX0ZSQUdNRU5UX1BST0dSQU1fTlYpOworICAgICAgZWxzZSBpZiAoKCpwdHIpLT5UYXJnZXQgPT0gTUVTQV9HRU9NRVRSWV9QUk9HUkFNKQorICAgICAgICAgQVNTRVJUKHByb2ctPlRhcmdldCA9PSBNRVNBX0dFT01FVFJZX1BST0dSQU0pOworICAgfQorI2VuZGlmCisKKyAgIGlmICgqcHRyKSB7CisgICAgICBHTGJvb2xlYW4gZGVsZXRlRmxhZzsKKworICAgICAgLyptdHhfbG9jaygmKCpwdHIpLT5NdXRleCk7Ki8KKyNpZiAwCisgICAgICBwcmludGYoIlByb2dyYW0gJXAgSUQ9JXUgVGFyZ2V0PSVzICBSZWZjb3VudC0tIHRvICVkXG4iLAorICAgICAgICAgICAgICpwdHIsICgqcHRyKS0+SWQsCisgICAgICAgICAgICAgKCgqcHRyKS0+VGFyZ2V0ID09IEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiA/ICJWUCIgOgorICAgICAgICAgICAgICAoKCpwdHIpLT5UYXJnZXQgPT0gTUVTQV9HRU9NRVRSWV9QUk9HUkFNID8gIkdQIiA6ICJGUCIpKSwKKyAgICAgICAgICAgICAoKnB0ciktPlJlZkNvdW50IC0gMSk7CisjZW5kaWYKKyAgICAgIEFTU0VSVCgoKnB0ciktPlJlZkNvdW50ID4gMCk7CisgICAgICAoKnB0ciktPlJlZkNvdW50LS07CisKKyAgICAgIGRlbGV0ZUZsYWcgPSAoKCpwdHIpLT5SZWZDb3VudCA9PSAwKTsKKyAgICAgIC8qbXR4X2xvY2soJigqcHRyKS0+TXV0ZXgpOyovCisKKyAgICAgIGlmIChkZWxldGVGbGFnKSB7CisgICAgICAgICBBU1NFUlQoY3R4KTsKKyAgICAgICAgIGN0eC0+RHJpdmVyLkRlbGV0ZVByb2dyYW0oY3R4LCAqcHRyKTsKKyAgICAgIH0KKworICAgICAgKnB0ciA9IE5VTEw7CisgICB9CisKKyAgIGFzc2VydCghKnB0cik7CisgICBpZiAocHJvZykgeworICAgICAgLyptdHhfbG9jaygmcHJvZy0+TXV0ZXgpOyovCisgICAgICBwcm9nLT5SZWZDb3VudCsrOworI2lmIDAKKyAgICAgIHByaW50ZigiUHJvZ3JhbSAlcCBJRD0ldSBUYXJnZXQ9JXMgIFJlZmNvdW50KysgdG8gJWRcbiIsCisgICAgICAgICAgICAgcHJvZywgcHJvZy0+SWQsCisgICAgICAgICAgICAgKHByb2ctPlRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIgPyAiVlAiIDoKKyAgICAgICAgICAgICAgKHByb2ctPlRhcmdldCA9PSBNRVNBX0dFT01FVFJZX1BST0dSQU0gPyAiR1AiIDogIkZQIikpLAorICAgICAgICAgICAgIHByb2ctPlJlZkNvdW50KTsKKyNlbmRpZgorICAgICAgLyptdHhfdW5sb2NrKCZwcm9nLT5NdXRleCk7Ki8KKyAgIH0KKyNlbmRpZgorCisgICAqcHRyID0gcHJvZzsKK30KKworCisvKioKKyAqIFJldHVybiBhIGNvcHkgb2YgYSBwcm9ncmFtLgorICogWFhYIFByb2JsZW0gaGVyZSBpZiB0aGUgcHJvZ3JhbSBvYmplY3QgaXMgYWN0dWFsbHkgT08tZGVyaXZhdGlvbgorICogbWFkZSBieSBhIGRldmljZSBkcml2ZXIuCisgKi8KK3N0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2Nsb25lX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqY2xvbmU7CisKKyAgIGNsb25lID0gY3R4LT5Ecml2ZXIuTmV3UHJvZ3JhbShjdHgsIHByb2ctPlRhcmdldCwgcHJvZy0+SWQpOworICAgaWYgKCFjbG9uZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBhc3NlcnQoY2xvbmUtPlRhcmdldCA9PSBwcm9nLT5UYXJnZXQpOworICAgLy8gTHVuYXJHOiBWSyBkb2VzIG5vdCB1c2UgcmVmZXJlbmNlIGNvdW50cworICAgLy8gYXNzZXJ0KGNsb25lLT5SZWZDb3VudCA9PSAxKTsKKworICAgY2xvbmUtPlN0cmluZyA9IChHTHVieXRlICopIF9tZXNhX3N0cmR1cCgoY2hhciAqKSBwcm9nLT5TdHJpbmcpOworICAgY2xvbmUtPkZvcm1hdCA9IHByb2ctPkZvcm1hdDsKKyAgIGNsb25lLT5JbnN0cnVjdGlvbnMgPSBfbWVzYV9hbGxvY19pbnN0cnVjdGlvbnMocHJvZy0+TnVtSW5zdHJ1Y3Rpb25zKTsKKyAgIGlmICghY2xvbmUtPkluc3RydWN0aW9ucykgeworICAgICAgX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oY3R4LCAmY2xvbmUsIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisgICBfbWVzYV9jb3B5X2luc3RydWN0aW9ucyhjbG9uZS0+SW5zdHJ1Y3Rpb25zLCBwcm9nLT5JbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nLT5OdW1JbnN0cnVjdGlvbnMpOworICAgY2xvbmUtPklucHV0c1JlYWQgPSBwcm9nLT5JbnB1dHNSZWFkOworICAgY2xvbmUtPk91dHB1dHNXcml0dGVuID0gcHJvZy0+T3V0cHV0c1dyaXR0ZW47CisgICBjbG9uZS0+U2FtcGxlcnNVc2VkID0gcHJvZy0+U2FtcGxlcnNVc2VkOworICAgY2xvbmUtPlNoYWRvd1NhbXBsZXJzID0gcHJvZy0+U2hhZG93U2FtcGxlcnM7CisgICBtZW1jcHkoY2xvbmUtPlRleHR1cmVzVXNlZCwgcHJvZy0+VGV4dHVyZXNVc2VkLCBzaXplb2YocHJvZy0+VGV4dHVyZXNVc2VkKSk7CisKKyAgIGlmIChwcm9nLT5QYXJhbWV0ZXJzKQorICAgICAgY2xvbmUtPlBhcmFtZXRlcnMgPSBfbWVzYV9jbG9uZV9wYXJhbWV0ZXJfbGlzdChwcm9nLT5QYXJhbWV0ZXJzKTsKKyAgIGlmIChwcm9nLT5Mb2NhbFBhcmFtcykgeworICAgICAgY2xvbmUtPkxvY2FsUGFyYW1zID0gbWFsbG9jKE1BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNUyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0WzRdKSk7CisgICAgICBpZiAoIWNsb25lLT5Mb2NhbFBhcmFtcykgeworICAgICAgICAgX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oY3R4LCAmY2xvbmUsIE5VTEwpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBtZW1jcHkoY2xvbmUtPkxvY2FsUGFyYW1zLCBwcm9nLT5Mb2NhbFBhcmFtcywKKyAgICAgICAgICAgICBNQVhfUFJPR1JBTV9MT0NBTF9QQVJBTVMgKiBzaXplb2YoZmxvYXRbNF0pKTsKKyAgIH0KKyAgIGNsb25lLT5JbmRpcmVjdFJlZ2lzdGVyRmlsZXMgPSBwcm9nLT5JbmRpcmVjdFJlZ2lzdGVyRmlsZXM7CisgICBjbG9uZS0+TnVtSW5zdHJ1Y3Rpb25zID0gcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOworICAgY2xvbmUtPk51bVRlbXBvcmFyaWVzID0gcHJvZy0+TnVtVGVtcG9yYXJpZXM7CisgICBjbG9uZS0+TnVtUGFyYW1ldGVycyA9IHByb2ctPk51bVBhcmFtZXRlcnM7CisgICBjbG9uZS0+TnVtQXR0cmlidXRlcyA9IHByb2ctPk51bUF0dHJpYnV0ZXM7CisgICBjbG9uZS0+TnVtQWRkcmVzc1JlZ3MgPSBwcm9nLT5OdW1BZGRyZXNzUmVnczsKKyAgIGNsb25lLT5OdW1OYXRpdmVJbnN0cnVjdGlvbnMgPSBwcm9nLT5OdW1OYXRpdmVJbnN0cnVjdGlvbnM7CisgICBjbG9uZS0+TnVtTmF0aXZlVGVtcG9yYXJpZXMgPSBwcm9nLT5OdW1OYXRpdmVUZW1wb3JhcmllczsKKyAgIGNsb25lLT5OdW1OYXRpdmVQYXJhbWV0ZXJzID0gcHJvZy0+TnVtTmF0aXZlUGFyYW1ldGVyczsKKyAgIGNsb25lLT5OdW1OYXRpdmVBdHRyaWJ1dGVzID0gcHJvZy0+TnVtTmF0aXZlQXR0cmlidXRlczsKKyAgIGNsb25lLT5OdW1OYXRpdmVBZGRyZXNzUmVncyA9IHByb2ctPk51bU5hdGl2ZUFkZHJlc3NSZWdzOworICAgY2xvbmUtPk51bUFsdUluc3RydWN0aW9ucyA9IHByb2ctPk51bUFsdUluc3RydWN0aW9uczsKKyAgIGNsb25lLT5OdW1UZXhJbnN0cnVjdGlvbnMgPSBwcm9nLT5OdW1UZXhJbnN0cnVjdGlvbnM7CisgICBjbG9uZS0+TnVtVGV4SW5kaXJlY3Rpb25zID0gcHJvZy0+TnVtVGV4SW5kaXJlY3Rpb25zOworICAgY2xvbmUtPk51bU5hdGl2ZUFsdUluc3RydWN0aW9ucyA9IHByb2ctPk51bU5hdGl2ZUFsdUluc3RydWN0aW9uczsKKyAgIGNsb25lLT5OdW1OYXRpdmVUZXhJbnN0cnVjdGlvbnMgPSBwcm9nLT5OdW1OYXRpdmVUZXhJbnN0cnVjdGlvbnM7CisgICBjbG9uZS0+TnVtTmF0aXZlVGV4SW5kaXJlY3Rpb25zID0gcHJvZy0+TnVtTmF0aXZlVGV4SW5kaXJlY3Rpb25zOworCisgICBzd2l0Y2ggKHByb2ctPlRhcmdldCkgeworICAgY2FzZSBHTF9WRVJURVhfUFJPR1JBTV9BUkI6CisgICAgICB7CisgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnZwID0gZ2xfdmVydGV4X3Byb2dyYW1fY29uc3QocHJvZyk7CisgICAgICAgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnZwYyA9IGdsX3ZlcnRleF9wcm9ncmFtKGNsb25lKTsKKyAgICAgICAgIHZwYy0+SXNQb3NpdGlvbkludmFyaWFudCA9IHZwLT5Jc1Bvc2l0aW9uSW52YXJpYW50OworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCOgorICAgICAgeworICAgICAgICAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwID0gZ2xfZnJhZ21lbnRfcHJvZ3JhbV9jb25zdChwcm9nKTsKKyAgICAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcGMgPSBnbF9mcmFnbWVudF9wcm9ncmFtKGNsb25lKTsKKyAgICAgICAgIGZwYy0+VXNlc0tpbGwgPSBmcC0+VXNlc0tpbGw7CisgICAgICAgICBmcGMtPlVzZXNERmR5ID0gZnAtPlVzZXNERmR5OworICAgICAgICAgZnBjLT5PcmlnaW5VcHBlckxlZnQgPSBmcC0+T3JpZ2luVXBwZXJMZWZ0OworICAgICAgICAgZnBjLT5QaXhlbENlbnRlckludGVnZXIgPSBmcC0+UGl4ZWxDZW50ZXJJbnRlZ2VyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfR0VPTUVUUllfUFJPR1JBTToKKyAgICAgIHsKKyAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICpncCA9IGdsX2dlb21ldHJ5X3Byb2dyYW1fY29uc3QocHJvZyk7CisgICAgICAgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqZ3BjID0gZ2xfZ2VvbWV0cnlfcHJvZ3JhbShjbG9uZSk7CisgICAgICAgICBncGMtPlZlcnRpY2VzT3V0ID0gZ3AtPlZlcnRpY2VzT3V0OworICAgICAgICAgZ3BjLT5JbnB1dFR5cGUgPSBncC0+SW5wdXRUeXBlOworICAgICAgICAgZ3BjLT5JbnZvY2F0aW9ucyA9IGdwLT5JbnZvY2F0aW9uczsKKyAgICAgICAgIGdwYy0+T3V0cHV0VHlwZSA9IGdwLT5PdXRwdXRUeXBlOworICAgICAgICAgZ3BjLT5Vc2VzRW5kUHJpbWl0aXZlID0gZ3AtPlVzZXNFbmRQcmltaXRpdmU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBfbWVzYV9wcm9ibGVtKE5VTEwsICJVbmV4cGVjdGVkIHRhcmdldCBpbiBfbWVzYV9jbG9uZV9wcm9ncmFtIik7CisgICB9CisKKyAgIHJldHVybiBjbG9uZTsKK30KKworCisvKioKKyAqIEluc2VydCAnY291bnQnIE5PUCBpbnN0cnVjdGlvbnMgYXQgJ3N0YXJ0JyBpbiB0aGUgZ2l2ZW4gcHJvZ3JhbS4KKyAqIEFkanVzdCBicmFuY2ggdGFyZ2V0cyBhY2NvcmRpbmdseS4KKyAqLworR0xib29sZWFuCitfbWVzYV9pbnNlcnRfaW5zdHJ1Y3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLCBHTHVpbnQgc3RhcnQsIEdMdWludCBjb3VudCkKK3sKKyAgIGNvbnN0IEdMdWludCBvcmlnTGVuID0gcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOworICAgY29uc3QgR0x1aW50IG5ld0xlbiA9IG9yaWdMZW4gKyBjb3VudDsKKyAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpuZXdJbnN0OworICAgR0x1aW50IGk7CisKKyAgIC8qIGFkanVzdCBicmFuY2hlcyAqLworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBpZiAoaW5zdC0+QnJhbmNoVGFyZ2V0ID4gMCkgeworICAgICAgICAgaWYgKChHTHVpbnQpaW5zdC0+QnJhbmNoVGFyZ2V0ID49IHN0YXJ0KSB7CisgICAgICAgICAgICBpbnN0LT5CcmFuY2hUYXJnZXQgKz0gY291bnQ7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIEFsbG9jIHN0b3JhZ2UgZm9yIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIG5ld0luc3QgPSBfbWVzYV9hbGxvY19pbnN0cnVjdGlvbnMobmV3TGVuKTsKKyAgIGlmICghbmV3SW5zdCkgeworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICAvKiBDb3B5ICdzdGFydCcgaW5zdHJ1Y3Rpb25zIGludG8gbmV3IGluc3RydWN0aW9uIGJ1ZmZlciAqLworICAgX21lc2FfY29weV9pbnN0cnVjdGlvbnMobmV3SW5zdCwgcHJvZy0+SW5zdHJ1Y3Rpb25zLCBzdGFydCk7CisKKyAgIC8qIGluaXQgdGhlIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIF9tZXNhX2luaXRfaW5zdHJ1Y3Rpb25zKG5ld0luc3QgKyBzdGFydCwgY291bnQpOworCisgICAvKiBDb3B5IHRoZSByZW1haW5pbmcvdGFpbCBpbnN0cnVjdGlvbnMgdG8gbmV3IGluc3QgYnVmZmVyICovCisgICBfbWVzYV9jb3B5X2luc3RydWN0aW9ucyhuZXdJbnN0ICsgc3RhcnQgKyBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ctPkluc3RydWN0aW9ucyArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ0xlbiAtIHN0YXJ0KTsKKworICAgLyogZnJlZSBvbGQgaW5zdHJ1Y3Rpb25zICovCisgICBfbWVzYV9mcmVlX2luc3RydWN0aW9ucyhwcm9nLT5JbnN0cnVjdGlvbnMsIG9yaWdMZW4pOworCisgICAvKiBpbnN0YWxsIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIHByb2ctPkluc3RydWN0aW9ucyA9IG5ld0luc3Q7CisgICBwcm9nLT5OdW1JbnN0cnVjdGlvbnMgPSBuZXdMZW47CisKKyAgIHJldHVybiBHTF9UUlVFOworfQorCisvKioKKyAqIERlbGV0ZSAnY291bnQnIGluc3RydWN0aW9ucyBhdCAnc3RhcnQnIGluIHRoZSBnaXZlbiBwcm9ncmFtLgorICogQWRqdXN0IGJyYW5jaCB0YXJnZXRzIGFjY29yZGluZ2x5LgorICovCitHTGJvb2xlYW4KK19tZXNhX2RlbGV0ZV9pbnN0cnVjdGlvbnMoc3RydWN0IGdsX3Byb2dyYW0gKnByb2csIEdMdWludCBzdGFydCwgR0x1aW50IGNvdW50KQoreworICAgY29uc3QgR0x1aW50IG9yaWdMZW4gPSBwcm9nLT5OdW1JbnN0cnVjdGlvbnM7CisgICBjb25zdCBHTHVpbnQgbmV3TGVuID0gb3JpZ0xlbiAtIGNvdW50OworICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKm5ld0luc3Q7CisgICBHTHVpbnQgaTsKKworICAgLyogYWRqdXN0IGJyYW5jaGVzICovCisgICBmb3IgKGkgPSAwOyBpIDwgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOyBpKyspIHsKKyAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gcHJvZy0+SW5zdHJ1Y3Rpb25zICsgaTsKKyAgICAgIGlmIChpbnN0LT5CcmFuY2hUYXJnZXQgPiAwKSB7CisgICAgICAgICBpZiAoaW5zdC0+QnJhbmNoVGFyZ2V0ID4gKEdMaW50KSBzdGFydCkgeworICAgICAgICAgICAgaW5zdC0+QnJhbmNoVGFyZ2V0IC09IGNvdW50OworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBBbGxvYyBzdG9yYWdlIGZvciBuZXcgaW5zdHJ1Y3Rpb25zICovCisgICBuZXdJbnN0ID0gX21lc2FfYWxsb2NfaW5zdHJ1Y3Rpb25zKG5ld0xlbik7CisgICBpZiAoIW5ld0luc3QpIHsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KKworICAgLyogQ29weSAnc3RhcnQnIGluc3RydWN0aW9ucyBpbnRvIG5ldyBpbnN0cnVjdGlvbiBidWZmZXIgKi8KKyAgIF9tZXNhX2NvcHlfaW5zdHJ1Y3Rpb25zKG5ld0luc3QsIHByb2ctPkluc3RydWN0aW9ucywgc3RhcnQpOworCisgICAvKiBDb3B5IHRoZSByZW1haW5pbmcvdGFpbCBpbnN0cnVjdGlvbnMgdG8gbmV3IGluc3QgYnVmZmVyICovCisgICBfbWVzYV9jb3B5X2luc3RydWN0aW9ucyhuZXdJbnN0ICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nLT5JbnN0cnVjdGlvbnMgKyBzdGFydCArIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVuIC0gc3RhcnQpOworCisgICAvKiBmcmVlIG9sZCBpbnN0cnVjdGlvbnMgKi8KKyAgIF9tZXNhX2ZyZWVfaW5zdHJ1Y3Rpb25zKHByb2ctPkluc3RydWN0aW9ucywgb3JpZ0xlbik7CisKKyAgIC8qIGluc3RhbGwgbmV3IGluc3RydWN0aW9ucyAqLworICAgcHJvZy0+SW5zdHJ1Y3Rpb25zID0gbmV3SW5zdDsKKyAgIHByb2ctPk51bUluc3RydWN0aW9ucyA9IG5ld0xlbjsKKworICAgcmV0dXJuIEdMX1RSVUU7Cit9CisKKworLyoqCisgKiBTZWFyY2ggaW5zdHJ1Y3Rpb25zIGZvciByZWdpc3RlcnMgdGhhdCBtYXRjaCAob2xkRmlsZSwgb2xkSW5kZXgpLAorICogcmVwbGFjaW5nIHRoZW0gd2l0aCAobmV3RmlsZSwgbmV3SW5kZXgpLgorICovCitzdGF0aWMgdm9pZAorcmVwbGFjZV9yZWdpc3RlcnMoc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsIEdMdWludCBudW1JbnN0LAorICAgICAgICAgICAgICAgICAgR0x1aW50IG9sZEZpbGUsIEdMdWludCBvbGRJbmRleCwKKyAgICAgICAgICAgICAgICAgIEdMdWludCBuZXdGaWxlLCBHTHVpbnQgbmV3SW5kZXgpCit7CisgICBHTHVpbnQgaSwgajsKKyAgIGZvciAoaSA9IDA7IGkgPCBudW1JbnN0OyBpKyspIHsKKyAgICAgIC8qIHNyYyByZWdzICovCisgICAgICBmb3IgKGogPSAwOyBqIDwgX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdFtpXS5PcGNvZGUpOyBqKyspIHsKKyAgICAgICAgIGlmIChpbnN0W2ldLlNyY1JlZ1tqXS5GaWxlID09IG9sZEZpbGUgJiYKKyAgICAgICAgICAgICBpbnN0W2ldLlNyY1JlZ1tqXS5JbmRleCA9PSBvbGRJbmRleCkgeworICAgICAgICAgICAgaW5zdFtpXS5TcmNSZWdbal0uRmlsZSA9IG5ld0ZpbGU7CisgICAgICAgICAgICBpbnN0W2ldLlNyY1JlZ1tqXS5JbmRleCA9IG5ld0luZGV4OworICAgICAgICAgfQorICAgICAgfQorICAgICAgLyogZHN0IHJlZyAqLworICAgICAgaWYgKGluc3RbaV0uRHN0UmVnLkZpbGUgPT0gb2xkRmlsZSAmJiBpbnN0W2ldLkRzdFJlZy5JbmRleCA9PSBvbGRJbmRleCkgeworICAgICAgICAgaW5zdFtpXS5Ec3RSZWcuRmlsZSA9IG5ld0ZpbGU7CisgICAgICAgICBpbnN0W2ldLkRzdFJlZy5JbmRleCA9IG5ld0luZGV4OworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogU2VhcmNoIGluc3RydWN0aW9ucyBmb3IgcmVmZXJlbmNlcyB0byBwcm9ncmFtIHBhcmFtZXRlcnMuICBXaGVuIGZvdW5kLAorICogaW5jcmVtZW50IHRoZSBwYXJhbWV0ZXIgaW5kZXggYnkgJ29mZnNldCcuCisgKiBVc2VkIHdoZW4gY29tYmluaW5nIHByb2dyYW1zLgorICovCitzdGF0aWMgdm9pZAorYWRqdXN0X3BhcmFtX2luZGV4ZXMoc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QsIEdMdWludCBudW1JbnN0LAorICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG9mZnNldCkKK3sKKyAgIEdMdWludCBpLCBqOworICAgZm9yIChpID0gMDsgaSA8IG51bUluc3Q7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IF9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3RbaV0uT3Bjb2RlKTsgaisrKSB7CisgICAgICAgICBHTHVpbnQgZiA9IGluc3RbaV0uU3JjUmVnW2pdLkZpbGU7CisgICAgICAgICBpZiAoZiA9PSBQUk9HUkFNX0NPTlNUQU5UIHx8CisgICAgICAgICAgICAgZiA9PSBQUk9HUkFNX1VOSUZPUk0gfHwKKyAgICAgICAgICAgICBmID09IFBST0dSQU1fU1RBVEVfVkFSKSB7CisgICAgICAgICAgICBpbnN0W2ldLlNyY1JlZ1tqXS5JbmRleCArPSBvZmZzZXQ7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKworLyoqCisgKiBDb21iaW5lIHR3byBwcm9ncmFtcyBpbnRvIG9uZS4gIEZpeCBpbnN0cnVjdGlvbnMgc28gdGhlIG91dHB1dHMgb2YKKyAqIHRoZSBmaXJzdCBwcm9ncmFtIGdvIHRvIHRoZSBpbnB1dHMgb2YgdGhlIHNlY29uZCBwcm9ncmFtLgorICovCitzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9jb21iaW5lX3Byb2dyYW1zKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nQSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2dCKQoreworICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKm5ld0luc3Q7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqbmV3UHJvZzsKKyAgIGNvbnN0IEdMdWludCBsZW5BID0gcHJvZ0EtPk51bUluc3RydWN0aW9ucyAtIDE7IC8qIG9taXQgRU5EIGluc3RyICovCisgICBjb25zdCBHTHVpbnQgbGVuQiA9IHByb2dCLT5OdW1JbnN0cnVjdGlvbnM7CisgICBjb25zdCBHTHVpbnQgbnVtUGFyYW1zQSA9IF9tZXNhX251bV9wYXJhbWV0ZXJzKHByb2dBLT5QYXJhbWV0ZXJzKTsKKyAgIGNvbnN0IEdMdWludCBuZXdMZW5ndGggPSBsZW5BICsgbGVuQjsKKyAgIEdMYm9vbGVhbiB1c2VkVGVtcHNbTUFYX1BST0dSQU1fVEVNUFNdOworICAgR0x1aW50IGZpcnN0VGVtcCA9IDA7CisgICBHTGJpdGZpZWxkNjQgaW5wdXRzQjsKKyAgIEdMdWludCBpOworCisgICBBU1NFUlQocHJvZ0EtPlRhcmdldCA9PSBwcm9nQi0+VGFyZ2V0KTsKKworICAgbmV3SW5zdCA9IF9tZXNhX2FsbG9jX2luc3RydWN0aW9ucyhuZXdMZW5ndGgpOworICAgaWYgKCFuZXdJbnN0KQorICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICBfbWVzYV9jb3B5X2luc3RydWN0aW9ucyhuZXdJbnN0LCBwcm9nQS0+SW5zdHJ1Y3Rpb25zLCBsZW5BKTsKKyAgIF9tZXNhX2NvcHlfaW5zdHJ1Y3Rpb25zKG5ld0luc3QgKyBsZW5BLCBwcm9nQi0+SW5zdHJ1Y3Rpb25zLCBsZW5CKTsKKworICAgLyogYWRqdXN0IGJyYW5jaCAvIGluc3RydWN0aW9uIGFkZHJlc3NlcyBmb3IgQidzIGluc3RydWN0aW9ucyAqLworICAgZm9yIChpID0gMDsgaSA8IGxlbkI7IGkrKykgeworICAgICAgbmV3SW5zdFtsZW5BICsgaV0uQnJhbmNoVGFyZ2V0ICs9IGxlbkE7CisgICB9CisKKyAgIG5ld1Byb2cgPSBjdHgtPkRyaXZlci5OZXdQcm9ncmFtKGN0eCwgcHJvZ0EtPlRhcmdldCwgMCk7CisgICBuZXdQcm9nLT5JbnN0cnVjdGlvbnMgPSBuZXdJbnN0OworICAgbmV3UHJvZy0+TnVtSW5zdHJ1Y3Rpb25zID0gbmV3TGVuZ3RoOworCisgICAvKiBmaW5kIHVzZWQgdGVtcCByZWdzICh3ZSBtYXkgbmVlZCBuZXcgdGVtcHMgYmVsb3cpICovCisgICBfbWVzYV9maW5kX3VzZWRfcmVnaXN0ZXJzKG5ld1Byb2csIFBST0dSQU1fVEVNUE9SQVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkVGVtcHMsIE1BWF9QUk9HUkFNX1RFTVBTKTsKKworICAgaWYgKG5ld1Byb2ctPlRhcmdldCA9PSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQikgeworICAgICAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwcm9nQSwgKmZwcm9nQjsKKyAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpuZXdGcHJvZzsKKyAgICAgIEdMYml0ZmllbGQ2NCBwcm9nQl9pbnB1dHNSZWFkID0gcHJvZ0ItPklucHV0c1JlYWQ7CisgICAgICBHTGludCBwcm9nQl9jb2xvckZpbGUsIHByb2dCX2NvbG9ySW5kZXg7CisKKyAgICAgIGZwcm9nQSA9IGdsX2ZyYWdtZW50X3Byb2dyYW1fY29uc3QocHJvZ0EpOworICAgICAgZnByb2dCID0gZ2xfZnJhZ21lbnRfcHJvZ3JhbV9jb25zdChwcm9nQik7CisgICAgICBuZXdGcHJvZyA9IGdsX2ZyYWdtZW50X3Byb2dyYW0obmV3UHJvZyk7CisKKyAgICAgIG5ld0Zwcm9nLT5Vc2VzS2lsbCA9IGZwcm9nQS0+VXNlc0tpbGwgfHwgZnByb2dCLT5Vc2VzS2lsbDsKKyAgICAgIG5ld0Zwcm9nLT5Vc2VzREZkeSA9IGZwcm9nQS0+VXNlc0RGZHkgfHwgZnByb2dCLT5Vc2VzREZkeTsKKworICAgICAgLyogV2UnbGwgZG8gYSBzZWFyY2ggYW5kIHJlcGxhY2UgZm9yIGluc3RhbmNlcworICAgICAgICogb2YgcHJvZ0JfY29sb3JGaWxlL3Byb2dCX2NvbG9ySW5kZXggYmVsb3cuLi4KKyAgICAgICAqLworICAgICAgcHJvZ0JfY29sb3JGaWxlID0gUFJPR1JBTV9JTlBVVDsKKyAgICAgIHByb2dCX2NvbG9ySW5kZXggPSBWQVJZSU5HX1NMT1RfQ09MMDsKKworICAgICAgLyoKKyAgICAgICAqIFRoZSBmcmFnbWVudCBwcm9ncmFtIG1heSBnZXQgY29sb3IgZnJvbSBhIHN0YXRlIHZhciByYXRoZXIgdGhhbgorICAgICAgICogYSBmcmFnbWVudCBpbnB1dCAodmVydGV4IG91dHB1dCkgaWYgaXQncyBjb25zdGFudC4KKyAgICAgICAqIFNlZSB0aGUgdGV4ZW52cHJvZ3JhbS5jIGNvZGUuCisgICAgICAgKiBTbywgc2VhcmNoIHRoZSBwcm9ncmFtJ3MgcGFyYW1ldGVyIGxpc3Qgbm93IHRvIHNlZSBpZiB0aGUgcHJvZ3JhbQorICAgICAgICogZ2V0cyBjb2xvciBmcm9tIGEgc3RhdGUgdmFyIGluc3RlYWQgb2YgYSBjb252ZW50aW9uYWwgZnJhZ21lbnQKKyAgICAgICAqIGlucHV0IHJlZ2lzdGVyLgorICAgICAgICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvZ0ItPlBhcmFtZXRlcnMtPk51bVBhcmFtZXRlcnM7IGkrKykgeworICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyICpwID0gJnByb2dCLT5QYXJhbWV0ZXJzLT5QYXJhbWV0ZXJzW2ldOworICAgICAgICAgaWYgKHAtPlR5cGUgPT0gUFJPR1JBTV9TVEFURV9WQVIgJiYKKyAgICAgICAgICAgICBwLT5TdGF0ZUluZGV4ZXNbMF0gPT0gU1RBVEVfSU5URVJOQUwgJiYKKyAgICAgICAgICAgICBwLT5TdGF0ZUluZGV4ZXNbMV0gPT0gU1RBVEVfQ1VSUkVOVF9BVFRSSUIgJiYKKyAgICAgICAgICAgICAoaW50KSBwLT5TdGF0ZUluZGV4ZXNbMl0gPT0gKGludCkgVkVSVF9BVFRSSUJfQ09MT1IwKSB7CisgICAgICAgICAgICBwcm9nQl9pbnB1dHNSZWFkIHw9IFZBUllJTkdfQklUX0NPTDA7CisgICAgICAgICAgICBwcm9nQl9jb2xvckZpbGUgPSBQUk9HUkFNX1NUQVRFX1ZBUjsKKyAgICAgICAgICAgIHByb2dCX2NvbG9ySW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENvbm5lY3QgY29sb3Igb3V0cHV0cyBvZiBmcHJvZ0EgdG8gY29sb3IgaW5wdXRzIG9mIGZwcm9nQiwgdmlhIGEKKyAgICAgICAqIG5ldyB0ZW1wb3JhcnkgcmVnaXN0ZXIuCisgICAgICAgKi8KKyAgICAgIGlmICgocHJvZ0EtPk91dHB1dHNXcml0dGVuICYgQklURklFTEQ2NF9CSVQoRlJBR19SRVNVTFRfQ09MT1IpKSAmJgorICAgICAgICAgIChwcm9nQl9pbnB1dHNSZWFkICYgVkFSWUlOR19CSVRfQ09MMCkpIHsKKyAgICAgICAgIEdMaW50IHRlbXBSZWcgPSBfbWVzYV9maW5kX2ZyZWVfcmVnaXN0ZXIodXNlZFRlbXBzLCBNQVhfUFJPR1JBTV9URU1QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUZW1wKTsKKyAgICAgICAgIGlmICh0ZW1wUmVnIDwgMCkgeworICAgICAgICAgICAgX21lc2FfcHJvYmxlbShjdHgsICJObyBmcmVlIHRlbXAgcmVncyBmb3VuZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJfbWVzYV9jb21iaW5lX3Byb2dyYW1zKCksIHVzaW5nIDMxIik7CisgICAgICAgICAgICB0ZW1wUmVnID0gMzE7CisgICAgICAgICB9CisgICAgICAgICBmaXJzdFRlbXAgPSB0ZW1wUmVnICsgMTsKKworICAgICAgICAgLyogcmVwbGFjZSB3cml0ZXMgdG8gcmVzdWx0LmNvbG9yWzBdIHdpdGggdGVtcFJlZyAqLworICAgICAgICAgcmVwbGFjZV9yZWdpc3RlcnMobmV3SW5zdCwgbGVuQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0dSQU1fT1VUUFVULCBGUkFHX1JFU1VMVF9DT0xPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0dSQU1fVEVNUE9SQVJZLCB0ZW1wUmVnKTsKKyAgICAgICAgIC8qIHJlcGxhY2UgcmVhZHMgZnJvbSB0aGUgaW5wdXQgY29sb3Igd2l0aCB0ZW1wUmVnICovCisgICAgICAgICByZXBsYWNlX3JlZ2lzdGVycyhuZXdJbnN0ICsgbGVuQSwgbGVuQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dCX2NvbG9yRmlsZSwgcHJvZ0JfY29sb3JJbmRleCwgLyogc2VhcmNoIGZvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPR1JBTV9URU1QT1JBUlksIHRlbXBSZWcgIC8qIHJlcGxhY2Ugd2l0aCAqLyApOworICAgICAgfQorCisgICAgICAvKiBjb21wdXRlIGNvbWJpbmVkIHByb2dyYW0ncyBJbnB1dHNSZWFkICovCisgICAgICBpbnB1dHNCID0gcHJvZ0JfaW5wdXRzUmVhZDsKKyAgICAgIGlmIChwcm9nQS0+T3V0cHV0c1dyaXR0ZW4gJiBCSVRGSUVMRDY0X0JJVChGUkFHX1JFU1VMVF9DT0xPUikpIHsKKyAgICAgICAgIGlucHV0c0IgJj0gfigxIDw8IFZBUllJTkdfU0xPVF9DT0wwKTsKKyAgICAgIH0KKyAgICAgIG5ld1Byb2ctPklucHV0c1JlYWQgPSBwcm9nQS0+SW5wdXRzUmVhZCB8IGlucHV0c0I7CisgICAgICBuZXdQcm9nLT5PdXRwdXRzV3JpdHRlbiA9IHByb2dCLT5PdXRwdXRzV3JpdHRlbjsKKyAgICAgIG5ld1Byb2ctPlNhbXBsZXJzVXNlZCA9IHByb2dBLT5TYW1wbGVyc1VzZWQgfCBwcm9nQi0+U2FtcGxlcnNVc2VkOworICAgfQorICAgZWxzZSB7CisgICAgICAvKiB2ZXJ0ZXggcHJvZ3JhbSAqLworICAgICAgYXNzZXJ0KDApOyAgICAgIC8qIFhYWCB0b2RvICovCisgICB9CisKKyAgIC8qCisgICAgKiBNZXJnZSBwYXJhbWV0ZXJzICh1bmlmb3JtcywgY29uc3RhbnRzLCBldGMpCisgICAgKi8KKyAgIG5ld1Byb2ctPlBhcmFtZXRlcnMgPSBfbWVzYV9jb21iaW5lX3BhcmFtZXRlcl9saXN0cyhwcm9nQS0+UGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nQi0+UGFyYW1ldGVycyk7CisKKyAgIGFkanVzdF9wYXJhbV9pbmRleGVzKG5ld0luc3QgKyBsZW5BLCBsZW5CLCBudW1QYXJhbXNBKTsKKworCisgICByZXR1cm4gbmV3UHJvZzsKK30KKworCisvKioKKyAqIFBvcHVsYXRlIHRoZSAndXNlZCcgYXJyYXkgd2l0aCBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIHJlZ2lzdGVycyAoVEVNUHMsCisgKiBJTlBVVHMsIE9VVFBVVHMsIGV0YywgYXJlIHVzZWQgYnkgdGhlIGdpdmVuIHByb2dyYW0uCisgKiBccGFyYW0gZmlsZSAgdHlwZSBvZiByZWdpc3RlciB0byBzY2FuIGZvcgorICogXHBhcmFtIHVzZWQgIHJldHVybnMgdHJ1ZS9mYWxzZSBmbGFncyBmb3IgaW4gdXNlIC8gZnJlZQorICogXHBhcmFtIHVzZWRTaXplICBzaXplIG9mIHRoZSAndXNlZCcgYXJyYXkKKyAqLwordm9pZAorX21lc2FfZmluZF91c2VkX3JlZ2lzdGVycyhjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfcmVnaXN0ZXJfZmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdXNlZFtdLCBHTHVpbnQgdXNlZFNpemUpCit7CisgICBHTHVpbnQgaSwgajsKKworICAgbWVtc2V0KHVzZWQsIDAsIHVzZWRTaXplKTsKKworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBjb25zdCBHTHVpbnQgbiA9IF9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3QtPk9wY29kZSk7CisKKyAgICAgIGlmIChpbnN0LT5Ec3RSZWcuRmlsZSA9PSBmaWxlKSB7CisgICAgICAgICBBU1NFUlQoaW5zdC0+RHN0UmVnLkluZGV4IDwgdXNlZFNpemUpOworICAgICAgICAgaWYoaW5zdC0+RHN0UmVnLkluZGV4IDwgdXNlZFNpemUpCisgICAgICAgICAgICB1c2VkW2luc3QtPkRzdFJlZy5JbmRleF0gPSBHTF9UUlVFOworICAgICAgfQorCisgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gZmlsZSkgeworICAgICAgICAgICAgQVNTRVJUKGluc3QtPlNyY1JlZ1tqXS5JbmRleCA8IChHTGludCkgdXNlZFNpemUpOworICAgICAgICAgICAgaWYgKGluc3QtPlNyY1JlZ1tqXS5JbmRleCA8IChHTGludCkgdXNlZFNpemUpCisgICAgICAgICAgICAgICB1c2VkW2luc3QtPlNyY1JlZ1tqXS5JbmRleF0gPSBHTF9UUlVFOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogU2NhbiB0aGUgZ2l2ZW4gJ3VzZWQnIHJlZ2lzdGVyIGZsYWcgYXJyYXkgZm9yIHRoZSBmaXJzdCBlbnRyeQorICogdGhhdCdzID49IGZpcnN0UmVnLgorICogXHBhcmFtIHVzZWQgIHZlY3RvciBvZiBmbGFncyBpbmRpY2F0aW5nIHJlZ2lzdGVycyBpbiB1c2UgKGFzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgYnkgX21lc2FfZmluZF91c2VkX3JlZ2lzdGVycygpKQorICogXHBhcmFtIHVzZWRTaXplICBzaXplIG9mIHRoZSAndXNlZCcgYXJyYXkKKyAqIFxwYXJhbSBmaXJzdFJlZyAgZmlyc3QgcmVnaXN0ZXIgdG8gc3RhcnQgc2VhcmNoaW5nIGF0CisgKiBccmV0dXJuIGluZGV4IG9mIHVudXNlZCByZWdpc3Rlciwgb3IgLTEgaWYgbm9uZS4KKyAqLworR0xpbnQKK19tZXNhX2ZpbmRfZnJlZV9yZWdpc3Rlcihjb25zdCBHTGJvb2xlYW4gdXNlZFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCB1c2VkU2l6ZSwgR0x1aW50IGZpcnN0UmVnKQoreworICAgR0x1aW50IGk7CisKKyAgIGFzc2VydChmaXJzdFJlZyA8IHVzZWRTaXplKTsKKworICAgZm9yIChpID0gZmlyc3RSZWc7IGkgPCB1c2VkU2l6ZTsgaSsrKQorICAgICAgaWYgKCF1c2VkW2ldKQorICAgICAgICAgcmV0dXJuIGk7CisKKyAgIHJldHVybiAtMTsKK30KKworCisKKy8qKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIHJlZ2lzdGVyIGluZGV4IGlzIHZhbGlkIChkb2Vzbid0IGV4Y2VlZCBpbXBsZW1lbnRhdGlvbi0KKyAqIGRlcGVuZGVudCBsaW1pdHMpLgorICogXHJldHVybiBHTF9UUlVFIGlmIE9LLCBHTF9GQUxTRSBpZiBiYWQgaW5kZXgKKyAqLworR0xib29sZWFuCitfbWVzYV92YWxpZF9yZWdpc3Rlcl9pbmRleChjb25zdCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfc2hhZGVyX3N0YWdlIHNoYWRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIEdMaW50IGluZGV4KQoreworICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW1fY29uc3RhbnRzICpjOworCisgICBhc3NlcnQoMCA8PSBzaGFkZXJUeXBlICYmIHNoYWRlclR5cGUgPCBNRVNBX1NIQURFUl9TVEFHRVMpOworICAgYyA9ICZjdHgtPkNvbnN0LlByb2dyYW1bc2hhZGVyVHlwZV07CisKKyAgIHN3aXRjaCAoZmlsZSkgeworICAgY2FzZSBQUk9HUkFNX1VOREVGSU5FRDoKKyAgICAgIHJldHVybiBHTF9UUlVFOyAgLyogWFhYIG9yIG1heWJlIGZhbHNlPyAqLworCisgICBjYXNlIFBST0dSQU1fVEVNUE9SQVJZOgorICAgICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCAoR0xpbnQpIGMtPk1heFRlbXBzOworCisgICBjYXNlIFBST0dSQU1fVU5JRk9STToKKyAgIGNhc2UgUFJPR1JBTV9TVEFURV9WQVI6CisgICAgICAvKiBha2EgY29uc3RhbnQgYnVmZmVyICovCisgICAgICByZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IChHTGludCkgYy0+TWF4VW5pZm9ybUNvbXBvbmVudHMgLyA0OworCisgICBjYXNlIFBST0dSQU1fQ09OU1RBTlQ6CisgICAgICAvKiBjb25zdGFudCBidWZmZXIgdy8gcG9zc2libGUgcmVsYXRpdmUgbmVnYXRpdmUgYWRkcmVzc2luZyAqLworICAgICAgcmV0dXJuIChpbmRleCA+IChpbnQpIGMtPk1heFVuaWZvcm1Db21wb25lbnRzIC8gLTQgJiYKKyAgICAgICAgICAgICAgaW5kZXggPCAoaW50KSBjLT5NYXhVbmlmb3JtQ29tcG9uZW50cyAvIDQpOworCisgICBjYXNlIFBST0dSQU1fSU5QVVQ6CisgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworCisgICAgICBzd2l0Y2ggKHNoYWRlclR5cGUpIHsKKyAgICAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgICAgcmV0dXJuIGluZGV4IDwgVkVSVF9BVFRSSUJfR0VORVJJQzAgKyAoR0xpbnQpIGMtPk1heEF0dHJpYnM7CisgICAgICBjYXNlIE1FU0FfU0hBREVSX0ZSQUdNRU5UOgorICAgICAgICAgcmV0dXJuIGluZGV4IDwgVkFSWUlOR19TTE9UX1ZBUjAgKyAoR0xpbnQpIGN0eC0+Q29uc3QuTWF4VmFyeWluZzsKKyAgICAgIGNhc2UgTUVTQV9TSEFERVJfR0VPTUVUUlk6CisgICAgICAgICByZXR1cm4gaW5kZXggPCBWQVJZSU5HX1NMT1RfVkFSMCArIChHTGludCkgY3R4LT5Db25zdC5NYXhWYXJ5aW5nOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICAgIH0KKworICAgY2FzZSBQUk9HUkFNX09VVFBVVDoKKyAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgICAgIHN3aXRjaCAoc2hhZGVyVHlwZSkgeworICAgICAgY2FzZSBNRVNBX1NIQURFUl9WRVJURVg6CisgICAgICAgICByZXR1cm4gaW5kZXggPCBWQVJZSU5HX1NMT1RfVkFSMCArIChHTGludCkgY3R4LT5Db25zdC5NYXhWYXJ5aW5nOworICAgICAgY2FzZSBNRVNBX1NIQURFUl9GUkFHTUVOVDoKKyAgICAgICAgIHJldHVybiBpbmRleCA8IEZSQUdfUkVTVUxUX0RBVEEwICsgKEdMaW50KSBjdHgtPkNvbnN0Lk1heERyYXdCdWZmZXJzOworICAgICAgY2FzZSBNRVNBX1NIQURFUl9HRU9NRVRSWToKKyAgICAgICAgIHJldHVybiBpbmRleCA8IFZBUllJTkdfU0xPVF9WQVIwICsgKEdMaW50KSBjdHgtPkNvbnN0Lk1heFZhcnlpbmc7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgICAgfQorCisgICBjYXNlIFBST0dSQU1fQUREUkVTUzoKKyAgICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgKEdMaW50KSBjLT5NYXhBZGRyZXNzUmVnczsKKworICAgZGVmYXVsdDoKKyAgICAgIF9tZXNhX3Byb2JsZW0oY3R4LAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCByZWdpc3RlciBmaWxlIGluIF9tZXNhX3ZhbGlkX3JlZ2lzdGVyX2luZGV4KCkiKTsKKyAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgIH0KK30KKworCisKKy8qKgorICogIlBvc3QtcHJvY2VzcyIgYSBHUFUgcHJvZ3JhbS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgZGVidWdnaW5nLgorICogRXhhbXBsZSBhY3Rpb25zIGluY2x1ZGUgbm8tb3AnaW5nIGluc3RydWN0aW9ucyBvciBjaGFuZ2luZyBpbnN0cnVjdGlvbgorICogYmVoYXZpb3VyLgorICovCit2b2lkCitfbWVzYV9wb3N0cHJvY2Vzc19wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgc3RhdGljIGNvbnN0IEdMZmxvYXQgd2hpdGVbNF0gPSB7IDAuNSwgMC41LCAwLjUsIDAuNSB9OworICAgR0x1aW50IGk7CisgICBHTHVpbnQgd2hpdGVTd2l6emxlOworICAgR0xpbnQgd2hpdGVJbmRleCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHByb2ctPlBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdsX2NvbnN0YW50X3ZhbHVlICopIHdoaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsICZ3aGl0ZVN3aXp6bGUpOworCisgICAodm9pZCkgd2hpdGVJbmRleDsKKworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBjb25zdCBHTHVpbnQgbiA9IF9tZXNhX251bV9pbnN0X3NyY19yZWdzKGluc3QtPk9wY29kZSk7CisKKyAgICAgICh2b2lkKSBuOworCisgICAgICBpZiAoX21lc2FfaXNfdGV4X2luc3RydWN0aW9uKGluc3QtPk9wY29kZSkpIHsKKyNpZiAwCisgICAgICAgICAvKiByZXBsYWNlIFRFWC9UWFAvVFhCIHdpdGggTU9WICovCisgICAgICAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworICAgICAgICAgaW5zdC0+RHN0UmVnLldyaXRlTWFzayA9IFdSSVRFTUFTS19YWVpXOworICAgICAgICAgaW5zdC0+U3JjUmVnWzBdLlN3aXp6bGUgPSBTV0laWkxFX1hZWlc7CisgICAgICAgICBpbnN0LT5TcmNSZWdbMF0uTmVnYXRlID0gTkVHQVRFX05PTkU7CisjZW5kaWYKKworI2lmIDAKKyAgICAgICAgIC8qIGRpc2FibGUgc2hhZG93IHRleHR1cmUgbW9kZSAqLworICAgICAgICAgaW5zdC0+VGV4U2hhZG93ID0gMDsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+T3Bjb2RlID09IE9QQ09ERV9UWFApIHsKKyNpZiAwCisgICAgICAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTU9WOworICAgICAgICAgaW5zdC0+RHN0UmVnLldyaXRlTWFzayA9IFdSSVRFTUFTS19YWVpXOworICAgICAgICAgaW5zdC0+U3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX0NPTlNUQU5UOworICAgICAgICAgaW5zdC0+U3JjUmVnWzBdLkluZGV4ID0gd2hpdGVJbmRleDsKKyAgICAgICAgIGluc3QtPlNyY1JlZ1swXS5Td2l6emxlID0gU1dJWlpMRV9YWVpXOworICAgICAgICAgaW5zdC0+U3JjUmVnWzBdLk5lZ2F0ZSA9IE5FR0FURV9OT05FOworI2VuZGlmCisjaWYgMAorICAgICAgICAgaW5zdC0+VGV4U2hhZG93ID0gMDsKKyNlbmRpZgorI2lmIDAKKyAgICAgICAgIGluc3QtPk9wY29kZSA9IE9QQ09ERV9URVg7CisgICAgICAgICBpbnN0LT5UZXhTaGFkb3cgPSAwOworI2VuZGlmCisgICAgICB9CisKKyAgIH0KK30KKworLyogR2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2Ygc2hhZGVyIGludm9jYXRpb25zIHBlciBmcmFnbWVudC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGRvIHBlcgorICogc2FtcGxlIHNoYWRpbmcgb3IgcGVyIGZyYWdtZW50IHNoYWRpbmcuCisgKi8KK0dMaW50CitfbWVzYV9nZXRfbWluX2ludm9jYXRpb25zX3Blcl9mcmFnbWVudChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZV9zYW1wbGVfcXVhbGlmaWVyKQoreworICAgLyogRnJvbSBBUkJfc2FtcGxlX3NoYWRpbmcgc3BlY2lmaWNhdGlvbjoKKyAgICAqICJVc2luZyBnbF9TYW1wbGVJRCBpbiBhIGZyYWdtZW50IHNoYWRlciBjYXVzZXMgdGhlIGVudGlyZSBzaGFkZXIKKyAgICAqICB0byBiZSBldmFsdWF0ZWQgcGVyLXNhbXBsZS4iCisgICAgKgorICAgICogIlVzaW5nIGdsX1NhbXBsZVBvc2l0aW9uIGluIGEgZnJhZ21lbnQgc2hhZGVyIGNhdXNlcyB0aGUgZW50aXJlCisgICAgKiAgc2hhZGVyIHRvIGJlIGV2YWx1YXRlZCBwZXItc2FtcGxlLiIKKyAgICAqCisgICAgKiAiSWYgTVVMVElTQU1QTEUgb3IgU0FNUExFX1NIQURJTkdfQVJCIGlzIGRpc2FibGVkLCBzYW1wbGUgc2hhZGluZworICAgICogIGhhcyBubyBlZmZlY3QuIgorICAgICovCisgICBpZiAoY3R4LT5NdWx0aXNhbXBsZS5FbmFibGVkKSB7CisgICAgICAgLy8gTHVuYXJHIFJFTToKKyAgICAgIC8qIC9cKiBUaGUgQVJCX2dwdV9zaGFkZXI1IHNwZWNpZmljYXRpb24gc2F5czogKi8KKyAgICAgIC8qICAqICovCisgICAgICAvKiAgKiAiVXNlIG9mIHRoZSAic2FtcGxlIiBxdWFsaWZpZXIgb24gYSBmcmFnbWVudCBzaGFkZXIgaW5wdXQgKi8KKyAgICAgIC8qICAqICBmb3JjZXMgcGVyLXNhbXBsZSBzaGFkaW5nIiAqLworICAgICAgLyogICpcLyAqLworICAgICAgLyogaWYgKHByb2ctPklzU2FtcGxlICYmICFpZ25vcmVfc2FtcGxlX3F1YWxpZmllcikgKi8KKyAgICAgIC8qICAgIHJldHVybiBNQVgyKGN0eC0+RHJhd0J1ZmZlci0+VmlzdWFsLnNhbXBsZXMsIDEpOyAqLworCisgICAgICAvKiBpZiAocHJvZy0+QmFzZS5TeXN0ZW1WYWx1ZXNSZWFkICYgKFNZU1RFTV9CSVRfU0FNUExFX0lEIHwgKi8KKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX0JJVF9TQU1QTEVfUE9TKSkgKi8KKyAgICAgIC8qICAgIHJldHVybiBNQVgyKGN0eC0+RHJhd0J1ZmZlci0+VmlzdWFsLnNhbXBsZXMsIDEpOyAqLworICAgICAgLyogZWxzZSBpZiAoY3R4LT5NdWx0aXNhbXBsZS5TYW1wbGVTaGFkaW5nKSAqLworICAgICAgLyogICAgcmV0dXJuIE1BWDIoY2VpbChjdHgtPk11bHRpc2FtcGxlLk1pblNhbXBsZVNoYWRpbmdWYWx1ZSAqICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgIGN0eC0+RHJhd0J1ZmZlci0+VmlzdWFsLnNhbXBsZXMpLCAxKTsgKi8KKyAgICAgIC8qIGVsc2UgKi8KKyAgICAgICAgIHJldHVybiAxOworICAgfQorICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW0uaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjk4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW0uaApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHByb2dyYW0uYworICogVmVydGV4IGFuZCBmcmFnbWVudCBwcm9ncmFtIHN1cHBvcnQgZnVuY3Rpb25zLgorICogXGF1dGhvciBCcmlhbiBQYXVsCisgKi8KKworCisvKioKKyAqIFxtYWlucGFnZSBNZXNhIHZlcnRleCBhbmQgZnJhZ21lbnQgcHJvZ3JhbSBtb2R1bGUKKyAqCisgKiBUaGlzIG1vZHVsZSBvciBkaXJlY3RvcnkgY29udGFpbnMgbW9zdCBvZiB0aGUgY29kZSBmb3IgdmVydGV4IGFuZAorICogZnJhZ21lbnQgcHJvZ3JhbXMgYW5kIHNoYWRlcnMsIGluY2x1ZGluZyBzdGF0ZSBtYW5hZ2VtZW50LCBwYXJzZXJzLAorICogYW5kIChzb21lKSBzb2Z0d2FyZSByb3V0aW5lcyBmb3IgZXhlY3V0aW5nIHByb2dyYW1zCisgKi8KKworI2lmbmRlZiBQUk9HUkFNX0gKKyNkZWZpbmUgUFJPR1JBTV9ICisKKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSBfbWVzYV9EdW1teVByb2dyYW07CisKKworZXh0ZXJuIHZvaWQKK19tZXNhX2luaXRfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZyZWVfcHJvZ3JhbV9kYXRhKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCitleHRlcm4gdm9pZAorX21lc2FfdXBkYXRlX2RlZmF1bHRfb2JqZWN0c19wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCitleHRlcm4gdm9pZAorX21lc2Ffc2V0X3Byb2dyYW1fZXJyb3Ioc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xpbnQgcG9zLCBjb25zdCBjaGFyICpzdHJpbmcpOworCitleHRlcm4gY29uc3QgR0x1Ynl0ZSAqCitfbWVzYV9maW5kX2xpbmVfY29sdW1uKGNvbnN0IEdMdWJ5dGUgKnN0cmluZywgY29uc3QgR0x1Ynl0ZSAqcG9zLAorICAgICAgICAgICAgICAgICAgICAgICBHTGludCAqbGluZSwgR0xpbnQgKmNvbCk7CisKKworZXh0ZXJuIHN0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2luaXRfdmVydGV4X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOworCitleHRlcm4gc3RydWN0IGdsX3Byb2dyYW0gKgorX21lc2FfaW5pdF9mcmFnbWVudF9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKKworZXh0ZXJuIHN0cnVjdCBnbF9wcm9ncmFtICoKK19tZXNhX2luaXRfZ2VvbWV0cnlfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9pbml0X2NvbXB1dGVfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2NvbXB1dGVfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9uZXdfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOworCitleHRlcm4gdm9pZAorX21lc2FfZGVsZXRlX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpOworCitleHRlcm4gc3RydWN0IGdsX3Byb2dyYW0gKgorX21lc2FfbG9va3VwX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IGlkKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3JlZmVyZW5jZV9wcm9ncmFtXyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICoqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIGlmICgqcHRyICE9IHByb2cpCisgICAgICBfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbV8oY3R4LCBwdHIsIHByb2cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19tZXNhX3JlZmVyZW5jZV92ZXJ0cHJvZyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnByb2cpCit7CisgICBfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShjdHgsIChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqKikgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBnbF9wcm9ncmFtICopIHByb2cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19tZXNhX3JlZmVyZW5jZV9mcmFncHJvZyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICoqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpwcm9nKQoreworICAgX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oY3R4LCAoc3RydWN0IGdsX3Byb2dyYW0gKiopIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqKSBwcm9nKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfbWVzYV9yZWZlcmVuY2VfZ2VvbXByb2coc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIF9tZXNhX3JlZmVyZW5jZV9wcm9ncmFtKGN0eCwgKHN0cnVjdCBnbF9wcm9ncmFtICoqKSBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGdsX3Byb2dyYW0gKikgcHJvZyk7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9jbG9uZV9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKgorX21lc2FfY2xvbmVfdmVydGV4X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHJldHVybiAoc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICopIF9tZXNhX2Nsb25lX3Byb2dyYW0oY3R4LCAmcHJvZy0+QmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdsX2dlb21ldHJ5X3Byb2dyYW0gKgorX21lc2FfY2xvbmVfZ2VvbWV0cnlfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHJldHVybiAoc3RydWN0IGdsX2dlb21ldHJ5X3Byb2dyYW0gKikgX21lc2FfY2xvbmVfcHJvZ3JhbShjdHgsICZwcm9nLT5CYXNlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqCitfbWVzYV9jbG9uZV9mcmFnbWVudF9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpwcm9nKQoreworICAgcmV0dXJuIChzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqKSBfbWVzYV9jbG9uZV9wcm9ncmFtKGN0eCwgJnByb2ctPkJhc2UpOworfQorCisKK2V4dGVybiAgR0xib29sZWFuCitfbWVzYV9pbnNlcnRfaW5zdHJ1Y3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLCBHTHVpbnQgc3RhcnQsIEdMdWludCBjb3VudCk7CisKK2V4dGVybiAgR0xib29sZWFuCitfbWVzYV9kZWxldGVfaW5zdHJ1Y3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLCBHTHVpbnQgc3RhcnQsIEdMdWludCBjb3VudCk7CisKK2V4dGVybiBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqCitfbWVzYV9jb21iaW5lX3Byb2dyYW1zKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nQSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2dCKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2ZpbmRfdXNlZF9yZWdpc3RlcnMoY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIHVzZWRbXSwgR0x1aW50IHVzZWRTaXplKTsKKworZXh0ZXJuIEdMaW50CitfbWVzYV9maW5kX2ZyZWVfcmVnaXN0ZXIoY29uc3QgR0xib29sZWFuIHVzZWRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbWF4UmVncywgR0x1aW50IGZpcnN0UmVnKTsKKworCitleHRlcm4gR0xib29sZWFuCitfbWVzYV92YWxpZF9yZWdpc3Rlcl9pbmRleChjb25zdCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfc2hhZGVyX3N0YWdlIHNoYWRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIEdMaW50IGluZGV4KTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3Bvc3Rwcm9jZXNzX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpOworCitleHRlcm4gR0xpbnQKK19tZXNhX2dldF9taW5faW52b2NhdGlvbnNfcGVyX2ZyYWdtZW50KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JlX3NhbXBsZV9xdWFsaWZpZXIpOworCitzdGF0aWMgaW5saW5lIEdMdWludAorX21lc2FfcHJvZ3JhbV9lbnVtX3RvX3NoYWRlcl9zdGFnZShHTGVudW0gdikKK3sKKyAgIHN3aXRjaCAodikgeworICAgY2FzZSBHTF9WRVJURVhfUFJPR1JBTV9BUkI6CisgICAgICByZXR1cm4gTUVTQV9TSEFERVJfVkVSVEVYOworICAgY2FzZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9GUkFHTUVOVDsKKyAgIGNhc2UgR0xfR0VPTUVUUllfUFJPR1JBTV9OVjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9HRU9NRVRSWTsKKyAgIGNhc2UgR0xfQ09NUFVURV9QUk9HUkFNX05WOgorICAgICAgcmV0dXJuIE1FU0FfU0hBREVSX0NPTVBVVEU7CisgICBkZWZhdWx0OgorICAgICAgQVNTRVJUKDApOworICAgICAgcmV0dXJuIH4wOworICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUgR0xlbnVtCitfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fcHJvZ3JhbSh1bnNpZ25lZCBzdGFnZSkKK3sKKyAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgcmV0dXJuIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQjsKKyAgIGNhc2UgTUVTQV9TSEFERVJfRlJBR01FTlQ6CisgICAgICByZXR1cm4gR0xfRlJBR01FTlRfUFJPR1JBTV9BUkI7CisgICBjYXNlIE1FU0FfU0hBREVSX0dFT01FVFJZOgorICAgICAgcmV0dXJuIEdMX0dFT01FVFJZX1BST0dSQU1fTlY7CisgICBjYXNlIE1FU0FfU0hBREVSX0NPTVBVVEU6CisgICAgICByZXR1cm4gR0xfQ09NUFVURV9QUk9HUkFNX05WOworICAgfQorCisgICBhc3NlcnQoISJVbmV4cGVjdGVkIHNoYWRlciBzdGFnZSBpbiBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fcHJvZ3JhbSIpOworICAgcmV0dXJuIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQjsKK30KKworCisvKiBDYXN0IHdyYXBwZXJzIGZyb20gZ2xfcHJvZ3JhbSB0byBnbF92ZXJ0ZXgvZ2VvbWV0cnkvZnJhZ21lbnRfcHJvZ3JhbSAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICoKK2dsX2ZyYWdtZW50X3Byb2dyYW0oc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICByZXR1cm4gKHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICopIHByb2c7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKgorZ2xfZnJhZ21lbnRfcHJvZ3JhbV9jb25zdChjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHJldHVybiAoY29uc3Qgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKikgcHJvZzsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqCitnbF92ZXJ0ZXhfcHJvZ3JhbShzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHJldHVybiAoc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICopIHByb2c7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICoKK2dsX3ZlcnRleF9wcm9ncmFtX2NvbnN0KGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgcmV0dXJuIChjb25zdCBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKikgcHJvZzsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICoKK2dsX2dlb21ldHJ5X3Byb2dyYW0oc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICByZXR1cm4gKHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICopIHByb2c7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGdsX2dlb21ldHJ5X3Byb2dyYW0gKgorZ2xfZ2VvbWV0cnlfcHJvZ3JhbV9jb25zdChjb25zdCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHJldHVybiAoY29uc3Qgc3RydWN0IGdsX2dlb21ldHJ5X3Byb2dyYW0gKikgcHJvZzsKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBQUk9HUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9sZXhlci5sIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9ncmFtX2xleGVyLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkYmNmMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9sZXhlci5sCkBAIC0wLDAgKzEsNTA4IEBACisleworLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorI2luY2x1ZGUgIm1haW4vaW1wb3J0cy5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19zdGF0ZXZhcnMuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ3JhbV9wYXJzZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmgiCisKKyNkZWZpbmUgcmVxdWlyZV9BUkJfdnAgKHl5ZXh0cmEtPm1vZGUgPT0gQVJCX3ZlcnRleCkKKyNkZWZpbmUgcmVxdWlyZV9BUkJfZnAgKHl5ZXh0cmEtPm1vZGUgPT0gQVJCX2ZyYWdtZW50KQorI2RlZmluZSByZXF1aXJlX05WX2ZwICAoeXlleHRyYS0+b3B0aW9uLk5WX2ZyYWdtZW50KQorI2RlZmluZSByZXF1aXJlX3NoYWRvdyAoeXlleHRyYS0+b3B0aW9uLlNoYWRvdykKKyNkZWZpbmUgcmVxdWlyZV9yZWN0ICAgKHl5ZXh0cmEtPm9wdGlvbi5UZXhSZWN0KQorI2RlZmluZSByZXF1aXJlX3RleGFycmF5ICAgICAgICAoeXlleHRyYS0+b3B0aW9uLlRleEFycmF5KQorCisjaWZuZGVmIEhBVkVfVU5JU1REX0gKKyNkZWZpbmUgWVlfTk9fVU5JU1REX0gKKyNlbmRpZgorCisjZGVmaW5lIHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKGNvbmRpdGlvbiwgdG9rZW4pCVwKKyAgIGRvIHsJCQkJCQkJXAorICAgICAgaWYgKGNvbmRpdGlvbikgewkJCQkJXAorCSByZXR1cm4gdG9rZW47CQkJCQlcCisgICAgICB9IGVsc2UgewkJCQkJCVwKKwkgcmV0dXJuIGhhbmRsZV9pZGVudCh5eWV4dHJhLCB5eXRleHQsIHl5bHZhbCk7CVwKKyAgICAgIH0JCQkJCQkJXAorICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSByZXR1cm5fdG9rZW5fb3JfRE9UKGNvbmRpdGlvbiwgdG9rZW4pCQlcCisgICBkbyB7CQkJCQkJCVwKKyAgICAgIGlmIChjb25kaXRpb24pIHsJCQkJCVwKKwkgcmV0dXJuIHRva2VuOwkJCQkJXAorICAgICAgfSBlbHNlIHsJCQkJCQlcCisJIHl5bGVzcygxKTsJCQkJCVwKKwkgcmV0dXJuIERPVDsJCQkJCVwKKyAgICAgIH0JCQkJCQkJXAorICAgfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIHJldHVybl9vcGNvZGUoY29uZGl0aW9uLCB0b2tlbiwgb3Bjb2RlLCBsZW4pCVwKKyAgIGRvIHsJCQkJCQkJXAorICAgICAgaWYgKGNvbmRpdGlvbiAmJgkJCQkJXAorCSAgX21lc2FfcGFyc2VfaW5zdHJ1Y3Rpb25fc3VmZml4KHl5ZXh0cmEsCVwKKwkJCQkJIHl5dGV4dCArIGxlbiwJXAorCQkJCQkgJiB5eWx2YWwtPnRlbXBfaW5zdCkpIHsJXAorCSB5eWx2YWwtPnRlbXBfaW5zdC5PcGNvZGUgPSBPUENPREVfICMjIG9wY29kZTsJXAorCSByZXR1cm4gdG9rZW47CQkJCQlcCisgICAgICB9IGVsc2UgewkJCQkJCVwKKwkgcmV0dXJuIGhhbmRsZV9pZGVudCh5eWV4dHJhLCB5eXRleHQsIHl5bHZhbCk7CVwKKyAgICAgIH0JCQkJCQkJXAorICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTV0laWkxFX0lOVkFMICBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfTklMLCBTV0laWkxFX05JTCwgXAorCQkJCSAgICAgU1dJWlpMRV9OSUwsIFNXSVpaTEVfTklMKQorCitzdGF0aWMgdW5zaWduZWQKK21hc2tfZnJvbV9jaGFyKGNoYXIgYykKK3sKKyAgIHN3aXRjaCAoYykgeworICAgY2FzZSAneCc6CisgICBjYXNlICdyJzoKKyAgICAgIHJldHVybiBXUklURU1BU0tfWDsKKyAgIGNhc2UgJ3knOgorICAgY2FzZSAnZyc6CisgICAgICByZXR1cm4gV1JJVEVNQVNLX1k7CisgICBjYXNlICd6JzoKKyAgIGNhc2UgJ2InOgorICAgICAgcmV0dXJuIFdSSVRFTUFTS19aOworICAgY2FzZSAndyc6CisgICBjYXNlICdhJzoKKyAgICAgIHJldHVybiBXUklURU1BU0tfVzsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorc3dpel9mcm9tX2NoYXIoY2hhciBjKQoreworICAgc3dpdGNoIChjKSB7CisgICBjYXNlICd4JzoKKyAgIGNhc2UgJ3InOgorICAgICAgcmV0dXJuIFNXSVpaTEVfWDsKKyAgIGNhc2UgJ3knOgorICAgY2FzZSAnZyc6CisgICAgICByZXR1cm4gU1dJWlpMRV9ZOworICAgY2FzZSAneic6CisgICBjYXNlICdiJzoKKyAgICAgIHJldHVybiBTV0laWkxFX1o7CisgICBjYXNlICd3JzoKKyAgIGNhc2UgJ2EnOgorICAgICAgcmV0dXJuIFNXSVpaTEVfVzsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9pZGVudChzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKnRleHQsIFlZU1RZUEUgKmx2YWwpCit7CisgICBsdmFsLT5zdHJpbmcgPSBzdHJkdXAodGV4dCk7CisKKyAgIHJldHVybiAoX21lc2Ffc3ltYm9sX3RhYmxlX2ZpbmRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgdGV4dCkgPT0gTlVMTCkKKyAgICAgID8gSURFTlRJRklFUiA6IFVTRURfSURFTlRJRklFUjsKK30KKworI2RlZmluZSBZWV9VU0VSX0FDVElPTgkJCQkJCQlcCisgICBkbyB7CQkJCQkJCQkJXAorICAgICAgeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MtPmxhc3RfY29sdW1uOwkJCVwKKyAgICAgIHl5bGxvYy0+bGFzdF9jb2x1bW4gKz0geXlsZW5nOwkJCQkJXAorICAgICAgaWYgKCh5eWxsb2MtPmZpcnN0X2xpbmUgPT0gMSkJCQkJCVwKKwkgICYmICh5eWxsb2MtPmZpcnN0X2NvbHVtbiA9PSAxKSkgewkJCQlcCisJIHl5bGxvYy0+cG9zaXRpb24gPSAxOwkJCQkJCVwKKyAgICAgIH0gZWxzZSB7CQkJCQkJCQlcCisJIHl5bGxvYy0+cG9zaXRpb24gKz0geXlsbG9jLT5sYXN0X2NvbHVtbiAtIHl5bGxvYy0+Zmlyc3RfY29sdW1uOyBcCisgICAgICB9CQkJCQkJCQkJXAorICAgfSB3aGlsZSgwKTsKKworI2RlZmluZSBZWV9OT19JTlBVVAorCisvKiBZZXMsIHRoaXMgaXMgaW50ZW50aW9uYWxseSBkb2luZyBub3RoaW5nLiBXZSBoYXZlIHRoaXMgbGluZSBvZiBjb2RlCitoZXJlIG9ubHkgdG8gYXZvaWQgdGhlIGNvbXBpbGVyIGNvbXBsYWluaW5nIGFib3V0IGFuIHVucHV0IGZ1bmN0aW9uCit0aGF0IGlzIGRlZmluZWQsIGJ1dCBuZXZlciBjYWxsZWQuICovCisjZGVmaW5lIFlZX1VTRVJfSU5JVCB3aGlsZSAoMCkgeyB1bnB1dCgwKTsgfQorCisjZGVmaW5lIFlZX0VYVFJBX1RZUEUgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKgorCisvKiBGbGV4IGRlZmluZXMgYSBjb3VwbGUgb2YgZnVuY3Rpb25zIHdpdGggbm8gZGVjbGFyYXRpb25zIG5vciB0aGUKK3N0YXRpYyBrZXl3b3JkLiBEZWNsYXJlIHRoZW0gaGVyZSB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcuICovCitpbnQgeXlnZXRfY29sdW1uICAoeXlzY2FuX3QgeXlzY2FubmVyKTsKK3ZvaWQgeXlzZXRfY29sdW1uIChpbnQgIGNvbHVtbl9ubyAsIHl5c2Nhbl90IHl5c2Nhbm5lcik7CisKKyV9CisKK251bSAgICBbMC05XSsKK2V4cCAgICBbRWVdWy0rXT9bMC05XSsKK2ZyYWMgICAiLiJbMC05XSsKK2RvdCAgICAiLiJbIFx0XSoKKworc3ogICAgIFtIUlhdPworc3pmICAgIFtIUl0/CitjYyAgICAgQz8KK3NhdCAgICAoX1NBVCk/CisKKyVvcHRpb24gcHJlZml4PSJfbWVzYV9wcm9ncmFtX2xleGVyXyIKKyVvcHRpb24gYmlzb24tYnJpZGdlIGJpc29uLWxvY2F0aW9ucyByZWVudHJhbnQgbm95eXdyYXAKKyUlCisKKyIhIUFSQnZwMS4wIiAgICAgICAgICAgICAgeyByZXR1cm4gQVJCdnBfMTA7IH0KKyIhIUFSQmZwMS4wIiAgICAgICAgICAgICAgeyByZXR1cm4gQVJCZnBfMTA7IH0KK0FERFJFU1MgICAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5pbnRlZ2VyID0gYXRfYWRkcmVzczsKKyAgIHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKHJlcXVpcmVfQVJCX3ZwLCBBRERSRVNTKTsKK30KK0FMSUFTICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gQUxJQVM7IH0KK0FUVFJJQiAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gQVRUUklCOyB9CitFTkQgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIEVORDsgfQorT1BUSU9OICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBPUFRJT047IH0KK09VVFBVVCAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gT1VUUFVUOyB9CitQQVJBTSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFBBUkFNOyB9CitURU1QICAgICAgICAgICAgICAgICAgICAgIHsgeXlsdmFsLT5pbnRlZ2VyID0gYXRfdGVtcDsgcmV0dXJuIFRFTVA7IH0KKworQUJTe3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgVkVDVE9SX09QLCBBQlMsIDMpOyB9CitBRER7c3p9e2NjfXtzYXR9ICAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5fT1AsIEFERCwgMyk7IH0KK0FSTCAgICAgICAgICAgICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfdnAsIEFSTCwgQVJMLCAzKTsgfQorCitDTVB7c2F0fSAgICAgICAgICAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfQVJCX2ZwLCBUUklfT1AsIENNUCwgMyk7IH0KK0NPU3tzemZ9e2NjfXtzYXR9ICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfZnAsIFNDQUxBUl9PUCwgQ09TLCAzKTsgfQorCitERFh7c3pmfXtjY317c2F0fSAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBWRUNUT1JfT1AsIEREWCwgMyk7IH0KK0REWXtzemZ9e2NjfXtzYXR9ICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFZFQ1RPUl9PUCwgRERZLCAzKTsgfQorRFAze3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBEUDMsIDMpOyB9CitEUDR7c3p9e2NjfXtzYXR9ICAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5fT1AsIERQNCwgMyk7IH0KK0RQSHtzen17Y2N9e3NhdH0gICB7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIEJJTl9PUCwgRFBILCAzKTsgfQorRFNUe3N6Zn17Y2N9e3NhdH0gIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBEU1QsIDMpOyB9CisKK0VYMntzemZ9e2NjfXtzYXR9ICB7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIFNDQUxBUl9PUCwgRVgyLCAzKTsgfQorRVhQICAgICAgICAgICAgICAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl92cCwgU0NBTEFSX09QLCBFWFAsIDMpOyB9CisKK0ZMUntzen17Y2N9e3NhdH0gICB7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIFZFQ1RPUl9PUCwgRkxSLCAzKTsgfQorRlJDe3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgVkVDVE9SX09QLCBGUkMsIDMpOyB9CisKK0tJTCAgICAgICAgICAgICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfZnAsIEtJTCwgS0lMLCAzKTsgfQorCitMSVR7c3pmfXtjY317c2F0fSAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBWRUNUT1JfT1AsIExJVCwgMyk7IH0KK0xHMntzemZ9e2NjfXtzYXR9ICB7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIFNDQUxBUl9PUCwgTEcyLCAzKTsgfQorTE9HICAgICAgICAgICAgICAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl92cCwgU0NBTEFSX09QLCBMT0csIDMpOyB9CitMUlB7c3p9e2NjfXtzYXR9ICAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfQVJCX2ZwLCBUUklfT1AsIExSUCwgMyk7IH0KKworTUFEe3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgVFJJX09QLCBNQUQsIDMpOyB9CitNQVh7c3p9e2NjfXtzYXR9ICAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5fT1AsIE1BWCwgMyk7IH0KK01JTntzen17Y2N9e3NhdH0gICB7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIEJJTl9PUCwgTUlOLCAzKTsgfQorTU9We3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgVkVDVE9SX09QLCBNT1YsIDMpOyB9CitNVUx7c3p9e2NjfXtzYXR9ICAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5fT1AsIE1VTCwgMyk7IH0KKworUEsySCAgICAgICAgICAgICAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgVkVDVE9SX09QLCBQSzJILCA0KTsgfQorUEsyVVMgICAgICAgICAgICAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgVkVDVE9SX09QLCBQSzJVUywgNSk7IH0KK1BLNEIgICAgICAgICAgICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFZFQ1RPUl9PUCwgUEs0QiwgNCk7IH0KK1BLNFVCICAgICAgICAgICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFZFQ1RPUl9PUCwgUEs0VUIsIDUpOyB9CitQT1d7c3pmfXtjY317c2F0fSAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBCSU5TQ19PUCwgUE9XLCAzKTsgfQorCitSQ1B7c3pmfXtjY317c2F0fSAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBTQ0FMQVJfT1AsIFJDUCwgMyk7IH0KK1JGTHtzemZ9e2NjfXtzYXR9ICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIEJJTl9PUCwgICAgUkZMLCAzKTsgfQorUlNRe3N6Zn17Y2N9e3NhdH0gIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgU0NBTEFSX09QLCBSU1EsIDMpOyB9CisKK1NDU3tzYXR9ICAgICAgICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9BUkJfZnAsIFNDQUxBUl9PUCwgU0NTLCAzKTsgfQorU0VRe3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgQklOX09QLCBTRVEsIDMpOyB9CitTRkx7c3p9e2NjfXtzYXR9ICAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBCSU5fT1AsIFNGTCwgMyk7IH0KK1NHRXtzen17Y2N9e3NhdH0gICB7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIEJJTl9PUCwgU0dFLCAzKTsgfQorU0dUe3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX05WX2ZwLCAgQklOX09QLCBTR1QsIDMpOyB9CitTSU57c3pmfXtjY317c2F0fSAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfQVJCX2ZwLCBTQ0FMQVJfT1AsIFNJTiwgMyk7IH0KK1NMRXtzen17Y2N9e3NhdH0gICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIEJJTl9PUCwgU0xFLCAzKTsgfQorU0xUe3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBTTFQsIDMpOyB9CitTTkV7c3p9e2NjfXtzYXR9ICAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBCSU5fT1AsIFNORSwgMyk7IH0KK1NUUntzen17Y2N9e3NhdH0gICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIEJJTl9PUCwgU1RSLCAzKTsgfQorU1VCe3N6fXtjY317c2F0fSAgIHsgcmV0dXJuX29wY29kZSggICAgICAgICAgICAgMSwgQklOX09QLCBTVUIsIDMpOyB9CitTV1p7c2F0fSAgICAgICAgICAgeyByZXR1cm5fb3Bjb2RlKCAgICAgICAgICAgICAxLCBTV1osIFNXWiwgMyk7IH0KKworVEVYe2NjfXtzYXR9ICAgICAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl9mcCwgU0FNUExFX09QLCBURVgsIDMpOyB9CitUWEJ7Y2N9e3NhdH0gICAgICAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfQVJCX2ZwLCBTQU1QTEVfT1AsIFRYQiwgMyk7IH0KK1RYRHtjY317c2F0fSAgICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFRYRF9PUCwgVFhELCAzKTsgfQorVFhQe2NjfXtzYXR9ICAgICAgIHsgcmV0dXJuX29wY29kZShyZXF1aXJlX0FSQl9mcCwgU0FNUExFX09QLCBUWFAsIDMpOyB9CisKK1VQMkh7Y2N9e3NhdH0gICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFNDQUxBUl9PUCwgVVAySCwgNCk7IH0KK1VQMlVTe2NjfXtzYXR9ICAgICB7IHJldHVybl9vcGNvZGUocmVxdWlyZV9OVl9mcCwgIFNDQUxBUl9PUCwgVVAyVVMsIDUpOyB9CitVUDRCe2NjfXtzYXR9ICAgICAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBTQ0FMQVJfT1AsIFVQNEIsIDQpOyB9CitVUDRVQntjY317c2F0fSAgICAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBTQ0FMQVJfT1AsIFVQNFVCLCA1KTsgfQorCitYMkR7c3pmfXtjY317c2F0fSAgeyByZXR1cm5fb3Bjb2RlKHJlcXVpcmVfTlZfZnAsICBUUklfT1AsIFgyRCwgMyk7IH0KK1hQRHtzYXR9ICAgICAgICAgICB7IHJldHVybl9vcGNvZGUoICAgICAgICAgICAgIDEsIEJJTl9PUCwgWFBELCAzKTsgfQorCit2ZXJ0ZXggICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfdnAsIFZFUlRFWCk7IH0KK2ZyYWdtZW50ICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCwgRlJBR01FTlQpOyB9Citwcm9ncmFtICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFBST0dSQU07IH0KK3N0YXRlICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gU1RBVEU7IH0KK3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gUkVTVUxUOyB9CisKK3tkb3R9YW1iaWVudCAgICAgICAgICAgICAgeyByZXR1cm4gQU1CSUVOVDsgfQore2RvdH1hdHRlbnVhdGlvbiAgICAgICAgICB7IHJldHVybiBBVFRFTlVBVElPTjsgfQore2RvdH1iYWNrICAgICAgICAgICAgICAgICB7IHJldHVybiBCQUNLOyB9Cit7ZG90fWNsaXAgICAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl92cCwgQ0xJUCk7IH0KK3tkb3R9Y29sb3IgICAgICAgICAgICAgICAgeyByZXR1cm4gQ09MT1I7IH0KK3tkb3R9ZGVwdGggICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBERVBUSCk7IH0KK3tkb3R9ZGlmZnVzZSAgICAgICAgICAgICAgeyByZXR1cm4gRElGRlVTRTsgfQore2RvdH1kaXJlY3Rpb24gICAgICAgICAgICB7IHJldHVybiBESVJFQ1RJT047IH0KK3tkb3R9ZW1pc3Npb24gICAgICAgICAgICAgeyByZXR1cm4gRU1JU1NJT047IH0KK3tkb3R9ZW52ICAgICAgICAgICAgICAgICAgeyByZXR1cm4gRU5WOyB9Cit7ZG90fWV5ZSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIEVZRTsgfQore2RvdH1mb2djb29yZCAgICAgICAgICAgICB7IHJldHVybiBGT0dDT09SRDsgfQore2RvdH1mb2cgICAgICAgICAgICAgICAgICB7IHJldHVybiBGT0c7IH0KK3tkb3R9ZnJvbnQgICAgICAgICAgICAgICAgeyByZXR1cm4gRlJPTlQ7IH0KK3tkb3R9aGFsZiAgICAgICAgICAgICAgICAgeyByZXR1cm4gSEFMRjsgfQore2RvdH1pbnZlcnNlICAgICAgICAgICAgICB7IHJldHVybiBJTlZFUlNFOyB9Cit7ZG90fWludnRyYW5zICAgICAgICAgICAgIHsgcmV0dXJuIElOVlRSQU5TOyB9Cit7ZG90fWxpZ2h0ICAgICAgICAgICAgICAgIHsgcmV0dXJuIExJR0hUOyB9Cit7ZG90fWxpZ2h0bW9kZWwgICAgICAgICAgIHsgcmV0dXJuIExJR0hUTU9ERUw7IH0KK3tkb3R9bGlnaHRwcm9kICAgICAgICAgICAgeyByZXR1cm4gTElHSFRQUk9EOyB9Cit7ZG90fWxvY2FsICAgICAgICAgICAgICAgIHsgcmV0dXJuIExPQ0FMOyB9Cit7ZG90fW1hdGVyaWFsICAgICAgICAgICAgIHsgcmV0dXJuIE1BVEVSSUFMOyB9Cit7ZG90fXByb2dyYW0gICAgICAgICAgICAgIHsgcmV0dXJuIE1BVF9QUk9HUkFNOyB9Cit7ZG90fW1hdHJpeCAgICAgICAgICAgICAgIHsgcmV0dXJuIE1BVFJJWDsgfQore2RvdH1tYXRyaXhpbmRleCAgICAgICAgICB7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfdnAsIE1BVFJJWElOREVYKTsgfQore2RvdH1tb2RlbHZpZXcgICAgICAgICAgICB7IHJldHVybiBNT0RFTFZJRVc7IH0KK3tkb3R9bXZwICAgICAgICAgICAgICAgICAgeyByZXR1cm4gTVZQOyB9Cit7ZG90fW5vcm1hbCAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl92cCwgTk9STUFMKTsgfQore2RvdH1vYmplY3QgICAgICAgICAgICAgICB7IHJldHVybiBPQkpFQ1Q7IH0KK3tkb3R9cGFsZXR0ZSAgICAgICAgICAgICAgeyByZXR1cm4gUEFMRVRURTsgfQore2RvdH1wYXJhbXMgICAgICAgICAgICAgICB7IHJldHVybiBQQVJBTVM7IH0KK3tkb3R9cGxhbmUgICAgICAgICAgICAgICAgeyByZXR1cm4gUExBTkU7IH0KK3tkb3R9cG9pbnQgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBQT0lOVF9UT0spOyB9Cit7ZG90fXBvaW50c2l6ZSAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl92cCwgUE9JTlRTSVpFKTsgfQore2RvdH1wb3NpdGlvbiAgICAgICAgICAgICB7IHJldHVybiBQT1NJVElPTjsgfQore2RvdH1wcmltYXJ5ICAgICAgICAgICAgICB7IHJldHVybiBQUklNQVJZOyB9Cit7ZG90fXByb2plY3Rpb24gICAgICAgICAgIHsgcmV0dXJuIFBST0pFQ1RJT047IH0KK3tkb3R9cmFuZ2UgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBSQU5HRSk7IH0KK3tkb3R9cm93ICAgICAgICAgICAgICAgICAgeyByZXR1cm4gUk9XOyB9Cit7ZG90fXNjZW5lY29sb3IgICAgICAgICAgIHsgcmV0dXJuIFNDRU5FQ09MT1I7IH0KK3tkb3R9c2Vjb25kYXJ5ICAgICAgICAgICAgeyByZXR1cm4gU0VDT05EQVJZOyB9Cit7ZG90fXNoaW5pbmVzcyAgICAgICAgICAgIHsgcmV0dXJuIFNISU5JTkVTUzsgfQore2RvdH1zaXplICAgICAgICAgICAgICAgICB7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfdnAsIFNJWkVfVE9LKTsgfQore2RvdH1zcGVjdWxhciAgICAgICAgICAgICB7IHJldHVybiBTUEVDVUxBUjsgfQore2RvdH1zcG90ICAgICAgICAgICAgICAgICB7IHJldHVybiBTUE9UOyB9Cit7ZG90fXRleGNvb3JkICAgICAgICAgICAgIHsgcmV0dXJuIFRFWENPT1JEOyB9Cit7ZG90fXRleGVudiAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl9mcCwgVEVYRU5WKTsgfQore2RvdH10ZXhnZW4gICAgICAgICAgICAgICB7IHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfdnAsIFRFWEdFTik7IH0KK3tkb3R9cSAgICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBURVhHRU5fUSk7IH0KK3tkb3R9cyAgICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBURVhHRU5fUyk7IH0KK3tkb3R9dCAgICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBURVhHRU5fVCk7IH0KK3tkb3R9dGV4dHVyZSAgICAgICAgICAgICAgeyByZXR1cm4gVEVYVFVSRTsgfQore2RvdH10cmFuc3Bvc2UgICAgICAgICAgICB7IHJldHVybiBUUkFOU1BPU0U7IH0KK3tkb3R9YXR0cmliICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX3ZwLCBWVFhBVFRSSUIpOyB9Cit7ZG90fXdlaWdodCAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl92cCwgV0VJR0hUKTsgfQorCit0ZXh0dXJlICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAsIFRFWFRVUkVfVU5JVCk7IH0KKzFEICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCwgVEVYXzFEKTsgfQorMkQgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKHJlcXVpcmVfQVJCX2ZwLCBURVhfMkQpOyB9CiszRCAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAsIFRFWF8zRCk7IH0KK0NVQkUgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCwgVEVYX0NVQkUpOyB9CitSRUNUICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAgJiYgcmVxdWlyZV9yZWN0LCBURVhfUkVDVCk7IH0KK1NIQURPVzFEICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCAmJiByZXF1aXJlX3NoYWRvdywgVEVYX1NIQURPVzFEKTsgfQorU0hBRE9XMkQgICAgICAgICAgICAgICAgICB7IHJldHVybl90b2tlbl9vcl9JREVOVElGSUVSKHJlcXVpcmVfQVJCX2ZwICYmIHJlcXVpcmVfc2hhZG93LCBURVhfU0hBRE9XMkQpOyB9CitTSEFET1dSRUNUICAgICAgICAgICAgICAgIHsgcmV0dXJuX3Rva2VuX29yX0lERU5USUZJRVIocmVxdWlyZV9BUkJfZnAgJiYgcmVxdWlyZV9zaGFkb3cgJiYgcmVxdWlyZV9yZWN0LCBURVhfU0hBRE9XUkVDVCk7IH0KK0FSUkFZMUQgICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCAmJiByZXF1aXJlX3RleGFycmF5LCBURVhfQVJSQVkxRCk7IH0KK0FSUkFZMkQgICAgICAgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCAmJiByZXF1aXJlX3RleGFycmF5LCBURVhfQVJSQVkyRCk7IH0KK0FSUkFZU0hBRE9XMUQgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCAmJiByZXF1aXJlX3NoYWRvdyAmJiByZXF1aXJlX3RleGFycmF5LCBURVhfQVJSQVlTSEFET1cxRCk7IH0KK0FSUkFZU0hBRE9XMkQgICAgICAgICAgICAgeyByZXR1cm5fdG9rZW5fb3JfSURFTlRJRklFUihyZXF1aXJlX0FSQl9mcCAmJiByZXF1aXJlX3NoYWRvdyAmJiByZXF1aXJlX3RleGFycmF5LCBURVhfQVJSQVlTSEFET1cyRCk7IH0KKworW19hLXpBLVokXVtfYS16QS1aMC05JF0qICB7IHJldHVybiBoYW5kbGVfaWRlbnQoeXlleHRyYSwgeXl0ZXh0LCB5eWx2YWwpOyB9CisKKyIuLiIgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gRE9UX0RPVDsgfQorCit7bnVtfSAgICAgICAgICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+aW50ZWdlciA9IHN0cnRvbCh5eXRleHQsIE5VTEwsIDEwKTsKKyAgIHJldHVybiBJTlRFR0VSOworfQore251bX0/e2ZyYWN9e2V4cH0/ICAgICAgICB7CisgICB5eWx2YWwtPnJlYWwgPSBfbWVzYV9zdHJ0b2YoeXl0ZXh0LCBOVUxMKTsKKyAgIHJldHVybiBSRUFMOworfQore251bX0iLiIvW14uXSAgICAgICAgICAgICB7CisgICB5eWx2YWwtPnJlYWwgPSBfbWVzYV9zdHJ0b2YoeXl0ZXh0LCBOVUxMKTsKKyAgIHJldHVybiBSRUFMOworfQore251bX17ZXhwfSAgICAgICAgICAgICAgICB7CisgICB5eWx2YWwtPnJlYWwgPSBfbWVzYV9zdHJ0b2YoeXl0ZXh0LCBOVUxMKTsKKyAgIHJldHVybiBSRUFMOworfQore251bX0iLiJ7ZXhwfSAgICAgICAgICAgICB7CisgICB5eWx2YWwtPnJlYWwgPSBfbWVzYV9zdHJ0b2YoeXl0ZXh0LCBOVUxMKTsKKyAgIHJldHVybiBSRUFMOworfQorCisiLnh5enciICAgICAgICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICByZXR1cm4gTUFTSzQ7Cit9CisKKyIueHkiW3p3XSAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1hZCisgICAgICB8IG1hc2tfZnJvbV9jaGFyKHl5dGV4dFszXSk7CisgICByZXR1cm4gTUFTSzM7Cit9CisiLnh6dyIgICAgICAgICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19YWlc7CisgICByZXR1cm4gTUFTSzM7Cit9CisiLnl6dyIgICAgICAgICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19ZWlc7CisgICByZXR1cm4gTUFTSzM7Cit9CisKKyIueCJbeXp3XSAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1gKKyAgICAgIHwgbWFza19mcm9tX2NoYXIoeXl0ZXh0WzJdKTsKKyAgIHJldHVybiBNQVNLMjsKK30KKyIueSJbenddICAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1kKKyAgICAgIHwgbWFza19mcm9tX2NoYXIoeXl0ZXh0WzJdKTsKKyAgIHJldHVybiBNQVNLMjsKK30KKyIuenciICAgICAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1pXOworICAgcmV0dXJuIE1BU0syOworfQorCisiLiJbeHl6d10gICAgICAgICAgICAgICAgIHsKKyAgIGNvbnN0IHVuc2lnbmVkIHMgPSBzd2l6X2Zyb21fY2hhcih5eXRleHRbMV0pOworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IE1BS0VfU1dJWlpMRTQocywgcywgcywgcyk7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gbWFza19mcm9tX2NoYXIoeXl0ZXh0WzFdKTsKKyAgIHJldHVybiBNQVNLMTsgCit9CisKKyIuIlt4eXp3XXs0fSAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IE1BS0VfU1dJWlpMRTQoc3dpel9mcm9tX2NoYXIoeXl0ZXh0WzFdKSwKKwkJCQkJICAgIHN3aXpfZnJvbV9jaGFyKHl5dGV4dFsyXSksCisJCQkJCSAgICBzd2l6X2Zyb21fY2hhcih5eXRleHRbM10pLAorCQkJCQkgICAgc3dpel9mcm9tX2NoYXIoeXl0ZXh0WzRdKSk7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gMDsKKyAgIHJldHVybiBTV0laWkxFOworfQorCisiLnJnYmEiICAgICAgICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLNCk7Cit9CisKKyIucmciW2JhXSAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1hZCisgICAgICB8IG1hc2tfZnJvbV9jaGFyKHl5dGV4dFszXSk7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMyk7Cit9CisiLnJiYSIgICAgICAgICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19YWlc7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMyk7Cit9CisiLmdiYSIgICAgICAgICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBTV0laWkxFX0lOVkFMOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19ZWlc7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBNQVNLMyk7Cit9CisKKyIuciJbZ2JhXSAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1gKKyAgICAgIHwgbWFza19mcm9tX2NoYXIoeXl0ZXh0WzJdKTsKKyAgIHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfZnAsIE1BU0syKTsKK30KKyIuZyJbYmFdICAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1kKKyAgICAgIHwgbWFza19mcm9tX2NoYXIoeXl0ZXh0WzJdKTsKKyAgIHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfZnAsIE1BU0syKTsKK30KKyIuYmEiICAgICAgICAgICAgICAgICAgICAgeworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IFNXSVpaTEVfSU5WQUw7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gV1JJVEVNQVNLX1pXOworICAgcmV0dXJuX3Rva2VuX29yX0RPVChyZXF1aXJlX0FSQl9mcCwgTUFTSzIpOworfQorCisiLiJbZ2JhXSAgICAgICAgICAgICAgICAgIHsKKyAgIGNvbnN0IHVuc2lnbmVkIHMgPSBzd2l6X2Zyb21fY2hhcih5eXRleHRbMV0pOworICAgeXlsdmFsLT5zd2l6X21hc2suc3dpenpsZSA9IE1BS0VfU1dJWlpMRTQocywgcywgcywgcyk7CisgICB5eWx2YWwtPnN3aXpfbWFzay5tYXNrID0gbWFza19mcm9tX2NoYXIoeXl0ZXh0WzFdKTsKKyAgIHJldHVybl90b2tlbl9vcl9ET1QocmVxdWlyZV9BUkJfZnAsIE1BU0sxKTsKK30KKworCisiLnIiICAgICAgICAgICAgICAgICAgICAgIHsKKyAgIGlmIChyZXF1aXJlX0FSQl92cCkgeworICAgICAgcmV0dXJuIFRFWEdFTl9SOworICAgfSBlbHNlIHsKKyAgICAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9YLAorCQkJCQkJU1dJWlpMRV9YLCBTV0laWkxFX1gpOworICAgICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IFdSSVRFTUFTS19YOworICAgICAgcmV0dXJuIE1BU0sxOworICAgfQorfQorCisiLiJbcmdiYV17NH0gICAgICAgICAgICAgIHsKKyAgIHl5bHZhbC0+c3dpel9tYXNrLnN3aXp6bGUgPSBNQUtFX1NXSVpaTEU0KHN3aXpfZnJvbV9jaGFyKHl5dGV4dFsxXSksCisJCQkJCSAgICBzd2l6X2Zyb21fY2hhcih5eXRleHRbMl0pLAorCQkJCQkgICAgc3dpel9mcm9tX2NoYXIoeXl0ZXh0WzNdKSwKKwkJCQkJICAgIHN3aXpfZnJvbV9jaGFyKHl5dGV4dFs0XSkpOworICAgeXlsdmFsLT5zd2l6X21hc2subWFzayA9IDA7CisgICByZXR1cm5fdG9rZW5fb3JfRE9UKHJlcXVpcmVfQVJCX2ZwLCBTV0laWkxFKTsKK30KKworIi4iICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBET1Q7IH0KKworXG4gICAgICAgICAgICAgICAgICAgICAgICB7CisgICB5eWxsb2MtPmZpcnN0X2xpbmUrKzsKKyAgIHl5bGxvYy0+Zmlyc3RfY29sdW1uID0gMTsKKyAgIHl5bGxvYy0+bGFzdF9saW5lKys7CisgICB5eWxsb2MtPmxhc3RfY29sdW1uID0gMTsKKyAgIHl5bGxvYy0+cG9zaXRpb24rKzsKK30KK1sgXHRccl0rICAgICAgICAgICAgICAgICAgLyogZWF0IHdoaXRlc3BhY2UgKi8gOworIy4qJCAgICAgICAgICAgICAgICAgICAgICAvKiBlYXQgY29tbWVudHMgKi8gOworLiAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07IH0KKyUlCisKK3ZvaWQKK19tZXNhX3Byb2dyYW1fbGV4ZXJfY3Rvcih2b2lkICoqc2Nhbm5lciwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlLAorCQkJIGNvbnN0IGNoYXIgKnN0cmluZywgc2l6ZV90IGxlbikKK3sKKyAgIHl5bGV4X2luaXRfZXh0cmEoc3RhdGUsIHNjYW5uZXIpOworICAgeXlfc2Nhbl9ieXRlcyhzdHJpbmcsIGxlbiwgKnNjYW5uZXIpOworfQorCit2b2lkCitfbWVzYV9wcm9ncmFtX2xleGVyX2R0b3Iodm9pZCAqc2Nhbm5lcikKK3sKKyAgIHl5bGV4X2Rlc3Ryb3koc2Nhbm5lcik7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5NzlmZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZS50YWIuYwpAQCAtMCwwICsxLDU2NzQgQEAKKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjcuMTItNDk5Ni4gICovCisKKy8qIEJpc29uIGltcGxlbWVudGF0aW9uIGZvciBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCisgICAKKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucworICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKKyAgIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBzbyBsb25nIGFzIHRoYXQgd29yayBpc24ndCBpdHNlbGYgYQorICAgcGFyc2VyIGdlbmVyYXRvciB1c2luZyB0aGUgc2tlbGV0b24gb3IgYSBtb2RpZmllZCB2ZXJzaW9uIHRoZXJlb2YKKyAgIGFzIGEgcGFyc2VyIHNrZWxldG9uLiAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IG1vZGlmeSBvciByZWRpc3RyaWJ1dGUKKyAgIHRoZSBwYXJzZXIgc2tlbGV0b24gaXRzZWxmLCB5b3UgbWF5IChhdCB5b3VyIG9wdGlvbikgcmVtb3ZlIHRoaXMKKyAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZworICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgorICAgCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCisgICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCisKKy8qIEMgTEFMUigxKSBwYXJzZXIgc2tlbGV0b24gd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuLCBieQorICAgc2ltcGxpZnlpbmcgdGhlIG9yaWdpbmFsIHNvLWNhbGxlZCAic2VtYW50aWMiIHBhcnNlci4gICovCisKKy8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCisgICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKKyAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCisgICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCisgICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgorICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCisKKy8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisjZGVmaW5lIFlZQklTT04gMQorCisvKiBCaXNvbiB2ZXJzaW9uLiAgKi8KKyNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjcuMTItNDk5NiIKKworLyogU2tlbGV0b24gbmFtZS4gICovCisjZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgorCisvKiBQdXJlIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVUkUgMQorCisvKiBQdXNoIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVU0ggMAorCisvKiBQdWxsIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVTEwgMQorCisKKy8qIFN1YnN0aXR1dGUgdGhlIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBuYW1lcy4gICovCisjZGVmaW5lIHl5cGFyc2UgICAgICAgICBfbWVzYV9wcm9ncmFtX3BhcnNlCisjZGVmaW5lIHl5bGV4ICAgICAgICAgICBfbWVzYV9wcm9ncmFtX2xleAorI2RlZmluZSB5eWVycm9yICAgICAgICAgX21lc2FfcHJvZ3JhbV9lcnJvcgorI2RlZmluZSB5eWx2YWwgICAgICAgICAgX21lc2FfcHJvZ3JhbV9sdmFsCisjZGVmaW5lIHl5Y2hhciAgICAgICAgICBfbWVzYV9wcm9ncmFtX2NoYXIKKyNkZWZpbmUgeXlkZWJ1ZyAgICAgICAgIF9tZXNhX3Byb2dyYW1fZGVidWcKKyNkZWZpbmUgeXluZXJycyAgICAgICAgIF9tZXNhX3Byb2dyYW1fbmVycnMKKyNkZWZpbmUgeXlsbG9jICAgICAgICAgIF9tZXNhX3Byb2dyYW1fbGxvYworCisvKiBDb3B5IHRoZSBmaXJzdCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKy8qIExpbmUgMzcxIG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorCisvKgorICogQ29weXJpZ2h0IMKpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dyYW0uaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3BhcmFtZXRlcl9sYXlvdXQuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfc3RhdGV2YXJzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgiCisKKyNpbmNsdWRlICJwcm9ncmFtL3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ3JhbV9wYXJzZXIuaCIKKworZXh0ZXJuIHZvaWQgKnl5X3NjYW5fc3RyaW5nKGNoYXIgKik7CitleHRlcm4gdm9pZCB5eV9kZWxldGVfYnVmZmVyKHZvaWQgKik7CisKK3N0YXRpYyBzdHJ1Y3QgYXNtX3N5bWJvbCAqZGVjbGFyZV92YXJpYWJsZShzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsCisgICAgY2hhciAqbmFtZSwgZW51bSBhc21fdHlwZSB0LCBzdHJ1Y3QgWVlMVFlQRSAqbG9jcCk7CisKK3N0YXRpYyBpbnQgYWRkX3N0YXRlX3JlZmVyZW5jZShzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1fbGlzdCwKKyAgICBjb25zdCBnbF9zdGF0ZV9pbmRleCB0b2tlbnNbU1RBVEVfTEVOR1RIXSk7CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9zdGF0ZShzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqcGFyYW1fdmFyLCBjb25zdCBnbF9zdGF0ZV9pbmRleCB0b2tlbnNbU1RBVEVfTEVOR1RIXSk7CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9wYXJhbShzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqcGFyYW1fdmFyLCBjb25zdCBnbF9zdGF0ZV9pbmRleCB0b2tlbnNbU1RBVEVfTEVOR1RIXSk7CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqcGFyYW1fdmFyLCBjb25zdCBzdHJ1Y3QgYXNtX3ZlY3RvciAqdmVjLAorICAgIEdMYm9vbGVhbiBhbGxvd1N3aXp6bGUpOworCitzdGF0aWMgaW50IHl5cGFyc2Uoc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKTsKKworc3RhdGljIGNoYXIgKm1ha2VfZXJyb3Jfc3RyaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworc3RhdGljIHZvaWQgeXllcnJvcihzdHJ1Y3QgWVlMVFlQRSAqbG9jcCwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlLAorICAgIGNvbnN0IGNoYXIgKnMpOworCitzdGF0aWMgaW50IHZhbGlkYXRlX2lucHV0cyhzdHJ1Y3QgWVlMVFlQRSAqbG9jcCwKKyAgICBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUpOworCitzdGF0aWMgdm9pZCBpbml0X2RzdF9yZWcoc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyICpyKTsKKworc3RhdGljIHZvaWQgc2V0X2RzdF9yZWcoc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xfcmVnaXN0ZXJfZmlsZSBmaWxlLCBHTGludCBpbmRleCk7CisKK3N0YXRpYyB2b2lkIGluaXRfc3JjX3JlZyhzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqcik7CisKK3N0YXRpYyB2b2lkIHNldF9zcmNfcmVnKHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xfcmVnaXN0ZXJfZmlsZSBmaWxlLCBHTGludCBpbmRleCk7CisKK3N0YXRpYyB2b2lkIHNldF9zcmNfcmVnX3N3eihzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIEdMaW50IGluZGV4LCBHTHVpbnQgc3dpenpsZSk7CisKK3N0YXRpYyB2b2lkIGFzbV9pbnN0cnVjdGlvbl9zZXRfb3BlcmFuZHMoc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdCwgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzAsCisgICAgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzEsIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMyKTsKKworc3RhdGljIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKmFzbV9pbnN0cnVjdGlvbl9jdG9yKGdsX2luc3Rfb3Bjb2RlIG9wLAorICAgIGNvbnN0IHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciAqZHN0LCBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMCwKKyAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMSwgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzIpOworCitzdGF0aWMgc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqYXNtX2luc3RydWN0aW9uX2NvcHlfY3RvcigKKyAgICBjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqYmFzZSwgY29uc3Qgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyICpkc3QsCisgICAgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzAsIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMxLAorICAgIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMyKTsKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgKCFGQUxTRSkKKyNlbmRpZgorCisjZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJCVwKKyAgIGRvIHsJCQkJCQkJCQlcCisgICAgICBpZiAoTikgewkJCQkJCQlcCisJIChDdXJyZW50KS5maXJzdF9saW5lID0gWVlSSFNMT0MoUmhzLCAxKS5maXJzdF9saW5lOwkJXAorCSAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKKwkgKEN1cnJlbnQpLnBvc2l0aW9uID0gWVlSSFNMT0MoUmhzLCAxKS5wb3NpdGlvbjsJCVwKKwkgKEN1cnJlbnQpLmxhc3RfbGluZSA9IFlZUkhTTE9DKFJocywgTikubGFzdF9saW5lOwkJXAorCSAoQ3VycmVudCkubGFzdF9jb2x1bW4gPSBZWVJIU0xPQyhSaHMsIE4pLmxhc3RfY29sdW1uOwkJXAorICAgICAgfSBlbHNlIHsJCQkJCQkJCVwKKwkgKEN1cnJlbnQpLmZpcnN0X2xpbmUgPSBZWVJIU0xPQyhSaHMsIDApLmxhc3RfbGluZTsJCVwKKwkgKEN1cnJlbnQpLmxhc3RfbGluZSA9IChDdXJyZW50KS5maXJzdF9saW5lOwkJCVwKKwkgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DKFJocywgMCkubGFzdF9jb2x1bW47CQlcCisJIChDdXJyZW50KS5sYXN0X2NvbHVtbiA9IChDdXJyZW50KS5maXJzdF9jb2x1bW47CQlcCisJIChDdXJyZW50KS5wb3NpdGlvbiA9IFlZUkhTTE9DKFJocywgMCkucG9zaXRpb24JCQlcCisJICAgICsgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbjsJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICB9IHdoaWxlKDApCisKKy8qIExpbmUgMzcxIG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE5MyAiLi9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmMiCisKKyMgaWZuZGVmIFlZX05VTEwKKyMgIGlmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgMjAxMTAzTCA8PSBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBZWV9OVUxMIG51bGxwdHIKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlfTlVMTCAwCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBFbmFibGluZyB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLiAgKi8KKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyMgdW5kZWYgWVlFUlJPUl9WRVJCT1NFCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMQorI2Vsc2UKKyMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAxCisjZW5kaWYKKworLyogSW4gYSBmdXR1cmUgcmVsZWFzZSBvZiBCaXNvbiwgdGhpcyBzZWN0aW9uIHdpbGwgYmUgcmVwbGFjZWQKKyAgIGJ5ICNpbmNsdWRlICJwcm9ncmFtX3BhcnNlLnRhYi5oIi4gICovCisjaWZuZGVmIFlZX19NRVNBX1BST0dSQU1fUFJPR1JBTV9QUk9HUkFNX1BBUlNFX1RBQl9IX0lOQ0xVREVECisjIGRlZmluZSBZWV9fTUVTQV9QUk9HUkFNX1BST0dSQU1fUFJPR1JBTV9QQVJTRV9UQUJfSF9JTkNMVURFRAorLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KKyNpZm5kZWYgWVlERUJVRworIyBkZWZpbmUgWVlERUJVRyAwCisjZW5kaWYKKyNpZiBZWURFQlVHCitleHRlcm4gaW50IF9tZXNhX3Byb2dyYW1fZGVidWc7CisjZW5kaWYKKworLyogVG9rZW5zLiAgKi8KKyNpZm5kZWYgWVlUT0tFTlRZUEUKKyMgZGVmaW5lIFlZVE9LRU5UWVBFCisgICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKKyAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCisgICBlbnVtIHl5dG9rZW50eXBlIHsKKyAgICAgQVJCdnBfMTAgPSAyNTgsCisgICAgIEFSQmZwXzEwID0gMjU5LAorICAgICBBRERSRVNTID0gMjYwLAorICAgICBBTElBUyA9IDI2MSwKKyAgICAgQVRUUklCID0gMjYyLAorICAgICBPUFRJT04gPSAyNjMsCisgICAgIE9VVFBVVCA9IDI2NCwKKyAgICAgUEFSQU0gPSAyNjUsCisgICAgIFRFTVAgPSAyNjYsCisgICAgIEVORCA9IDI2NywKKyAgICAgQklOX09QID0gMjY4LAorICAgICBCSU5TQ19PUCA9IDI2OSwKKyAgICAgU0FNUExFX09QID0gMjcwLAorICAgICBTQ0FMQVJfT1AgPSAyNzEsCisgICAgIFRSSV9PUCA9IDI3MiwKKyAgICAgVkVDVE9SX09QID0gMjczLAorICAgICBBUkwgPSAyNzQsCisgICAgIEtJTCA9IDI3NSwKKyAgICAgU1daID0gMjc2LAorICAgICBUWERfT1AgPSAyNzcsCisgICAgIElOVEVHRVIgPSAyNzgsCisgICAgIFJFQUwgPSAyNzksCisgICAgIEFNQklFTlQgPSAyODAsCisgICAgIEFUVEVOVUFUSU9OID0gMjgxLAorICAgICBCQUNLID0gMjgyLAorICAgICBDTElQID0gMjgzLAorICAgICBDT0xPUiA9IDI4NCwKKyAgICAgREVQVEggPSAyODUsCisgICAgIERJRkZVU0UgPSAyODYsCisgICAgIERJUkVDVElPTiA9IDI4NywKKyAgICAgRU1JU1NJT04gPSAyODgsCisgICAgIEVOViA9IDI4OSwKKyAgICAgRVlFID0gMjkwLAorICAgICBGT0cgPSAyOTEsCisgICAgIEZPR0NPT1JEID0gMjkyLAorICAgICBGUkFHTUVOVCA9IDI5MywKKyAgICAgRlJPTlQgPSAyOTQsCisgICAgIEhBTEYgPSAyOTUsCisgICAgIElOVkVSU0UgPSAyOTYsCisgICAgIElOVlRSQU5TID0gMjk3LAorICAgICBMSUdIVCA9IDI5OCwKKyAgICAgTElHSFRNT0RFTCA9IDI5OSwKKyAgICAgTElHSFRQUk9EID0gMzAwLAorICAgICBMT0NBTCA9IDMwMSwKKyAgICAgTUFURVJJQUwgPSAzMDIsCisgICAgIE1BVF9QUk9HUkFNID0gMzAzLAorICAgICBNQVRSSVggPSAzMDQsCisgICAgIE1BVFJJWElOREVYID0gMzA1LAorICAgICBNT0RFTFZJRVcgPSAzMDYsCisgICAgIE1WUCA9IDMwNywKKyAgICAgTk9STUFMID0gMzA4LAorICAgICBPQkpFQ1QgPSAzMDksCisgICAgIFBBTEVUVEUgPSAzMTAsCisgICAgIFBBUkFNUyA9IDMxMSwKKyAgICAgUExBTkUgPSAzMTIsCisgICAgIFBPSU5UX1RPSyA9IDMxMywKKyAgICAgUE9JTlRTSVpFID0gMzE0LAorICAgICBQT1NJVElPTiA9IDMxNSwKKyAgICAgUFJJTUFSWSA9IDMxNiwKKyAgICAgUFJPR1JBTSA9IDMxNywKKyAgICAgUFJPSkVDVElPTiA9IDMxOCwKKyAgICAgUkFOR0UgPSAzMTksCisgICAgIFJFU1VMVCA9IDMyMCwKKyAgICAgUk9XID0gMzIxLAorICAgICBTQ0VORUNPTE9SID0gMzIyLAorICAgICBTRUNPTkRBUlkgPSAzMjMsCisgICAgIFNISU5JTkVTUyA9IDMyNCwKKyAgICAgU0laRV9UT0sgPSAzMjUsCisgICAgIFNQRUNVTEFSID0gMzI2LAorICAgICBTUE9UID0gMzI3LAorICAgICBTVEFURSA9IDMyOCwKKyAgICAgVEVYQ09PUkQgPSAzMjksCisgICAgIFRFWEVOViA9IDMzMCwKKyAgICAgVEVYR0VOID0gMzMxLAorICAgICBURVhHRU5fUSA9IDMzMiwKKyAgICAgVEVYR0VOX1IgPSAzMzMsCisgICAgIFRFWEdFTl9TID0gMzM0LAorICAgICBURVhHRU5fVCA9IDMzNSwKKyAgICAgVEVYVFVSRSA9IDMzNiwKKyAgICAgVFJBTlNQT1NFID0gMzM3LAorICAgICBURVhUVVJFX1VOSVQgPSAzMzgsCisgICAgIFRFWF8xRCA9IDMzOSwKKyAgICAgVEVYXzJEID0gMzQwLAorICAgICBURVhfM0QgPSAzNDEsCisgICAgIFRFWF9DVUJFID0gMzQyLAorICAgICBURVhfUkVDVCA9IDM0MywKKyAgICAgVEVYX1NIQURPVzFEID0gMzQ0LAorICAgICBURVhfU0hBRE9XMkQgPSAzNDUsCisgICAgIFRFWF9TSEFET1dSRUNUID0gMzQ2LAorICAgICBURVhfQVJSQVkxRCA9IDM0NywKKyAgICAgVEVYX0FSUkFZMkQgPSAzNDgsCisgICAgIFRFWF9BUlJBWVNIQURPVzFEID0gMzQ5LAorICAgICBURVhfQVJSQVlTSEFET1cyRCA9IDM1MCwKKyAgICAgVkVSVEVYID0gMzUxLAorICAgICBWVFhBVFRSSUIgPSAzNTIsCisgICAgIFdFSUdIVCA9IDM1MywKKyAgICAgSURFTlRJRklFUiA9IDM1NCwKKyAgICAgVVNFRF9JREVOVElGSUVSID0gMzU1LAorICAgICBNQVNLNCA9IDM1NiwKKyAgICAgTUFTSzMgPSAzNTcsCisgICAgIE1BU0syID0gMzU4LAorICAgICBNQVNLMSA9IDM1OSwKKyAgICAgU1dJWlpMRSA9IDM2MCwKKyAgICAgRE9UX0RPVCA9IDM2MSwKKyAgICAgRE9UID0gMzYyCisgICB9OworI2VuZGlmCisKKworI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECit0eXBlZGVmIHVuaW9uIFlZU1RZUEUKK3sKKy8qIExpbmUgMzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEyNCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisKKyAgIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKmluc3Q7CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqc3ltOworICAgc3RydWN0IGFzbV9zeW1ib2wgdGVtcF9zeW07CisgICBzdHJ1Y3QgYXNtX3N3aXp6bGVfbWFzayBzd2l6X21hc2s7CisgICBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciBzcmNfcmVnOworICAgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIGRzdF9yZWc7CisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiB0ZW1wX2luc3Q7CisgICBjaGFyICpzdHJpbmc7CisgICB1bnNpZ25lZCByZXN1bHQ7CisgICB1bnNpZ25lZCBhdHRyaWI7CisgICBpbnQgaW50ZWdlcjsKKyAgIGZsb2F0IHJlYWw7CisgICBnbF9zdGF0ZV9pbmRleCBzdGF0ZVtTVEFURV9MRU5HVEhdOworICAgaW50IG5lZ2F0ZTsKKyAgIHN0cnVjdCBhc21fdmVjdG9yIHZlY3RvcjsKKyAgIGdsX2luc3Rfb3Bjb2RlIG9wY29kZTsKKworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIHN3ejsKKyAgICAgIHVuc2lnbmVkIHJnYmFfdmFsaWQ6MTsKKyAgICAgIHVuc2lnbmVkIHh5endfdmFsaWQ6MTsKKyAgICAgIHVuc2lnbmVkIG5lZ2F0ZToxOworICAgfSBleHRfc3dpenpsZTsKKworCisvKiBMaW5lIDM4NyBvZiB5YWNjLmMgICovCisjbGluZSAzNzAgIi4vcHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnRhYi5jIgorfSBZWVNUWVBFOworIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKyMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KKyMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgWVlMVFlQRSAmJiAhIGRlZmluZWQgWVlMVFlQRV9JU19ERUNMQVJFRAordHlwZWRlZiBzdHJ1Y3QgWVlMVFlQRQoreworICBpbnQgZmlyc3RfbGluZTsKKyAgaW50IGZpcnN0X2NvbHVtbjsKKyAgaW50IGxhc3RfbGluZTsKKyAgaW50IGxhc3RfY29sdW1uOworfSBZWUxUWVBFOworIyBkZWZpbmUgeXlsdHlwZSBZWUxUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLworIyBkZWZpbmUgWVlMVFlQRV9JU19ERUNMQVJFRCAxCisjIGRlZmluZSBZWUxUWVBFX0lTX1RSSVZJQUwgMQorI2VuZGlmCisKKworI2lmZGVmIFlZUEFSU0VfUEFSQU0KKyNpZiBkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKK2ludCBfbWVzYV9wcm9ncmFtX3BhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKTsKKyNlbHNlCitpbnQgX21lc2FfcHJvZ3JhbV9wYXJzZSAoKTsKKyNlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCitpbnQgX21lc2FfcHJvZ3JhbV9wYXJzZSAoc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKTsKKyNlbHNlCitpbnQgX21lc2FfcHJvZ3JhbV9wYXJzZSAoKTsKKyNlbmRpZgorI2VuZGlmIC8qICEgWVlQQVJTRV9QQVJBTSAqLworCisjZW5kaWYgLyogIVlZX19NRVNBX1BST0dSQU1fUFJPR1JBTV9QUk9HUkFNX1BBUlNFX1RBQl9IX0lOQ0xVREVEICAqLworCisvKiBDb3B5IHRoZSBzZWNvbmQgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCisvKiBMaW5lIDM5MCBvZiB5YWNjLmMgICovCisjbGluZSAyNjkgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorCitleHRlcm4gaW50CitfbWVzYV9wcm9ncmFtX2xleGVyX2xleChZWVNUWVBFICp5eWx2YWxfcGFyYW0sIFlZTFRZUEUgKnl5bGxvY19wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnl5c2Nhbm5lcik7CisKK3N0YXRpYyBpbnQKK3l5bGV4KFlZU1RZUEUgKnl5bHZhbF9wYXJhbSwgWVlMVFlQRSAqeXlsbG9jX3BhcmFtLAorICAgICAgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIF9tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4KHl5bHZhbF9wYXJhbSwgeXlsbG9jX3BhcmFtLCBzdGF0ZS0+c2Nhbm5lcik7Cit9CisKKy8qIExpbmUgMzkwIG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQyMyAiLi9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmMiCisKKyNpZmRlZiBzaG9ydAorIyB1bmRlZiBzaG9ydAorI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfVUlOVDgKK3R5cGVkZWYgWVlUWVBFX1VJTlQ4IHl5dHlwZV91aW50ODsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgeXl0eXBlX3VpbnQ4OworI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfSU5UOAordHlwZWRlZiBZWVRZUEVfSU5UOCB5eXR5cGVfaW50ODsKKyNlbGlmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIGNoYXIgeXl0eXBlX2ludDg7CisjZWxzZQordHlwZWRlZiBzaG9ydCBpbnQgeXl0eXBlX2ludDg7CisjZW5kaWYKKworI2lmZGVmIFlZVFlQRV9VSU5UMTYKK3R5cGVkZWYgWVlUWVBFX1VJTlQxNiB5eXR5cGVfdWludDE2OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHl5dHlwZV91aW50MTY7CisjZW5kaWYKKworI2lmZGVmIFlZVFlQRV9JTlQxNgordHlwZWRlZiBZWVRZUEVfSU5UMTYgeXl0eXBlX2ludDE2OworI2Vsc2UKK3R5cGVkZWYgc2hvcnQgaW50IHl5dHlwZV9pbnQxNjsKKyNlbmRpZgorCisjaWZuZGVmIFlZU0laRV9UCisjIGlmZGVmIF9fU0laRV9UWVBFX18KKyMgIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCisjIGVsaWYgZGVmaW5lZCBzaXplX3QKKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZWxpZiAhIGRlZmluZWQgWVlTSVpFX1QgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorIyAgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZWxzZQorIyAgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgWVlTSVpFX01BWElNVU0gKChZWVNJWkVfVCkgLTEpCisKKyNpZm5kZWYgWVlfCisjIGlmIGRlZmluZWQgWVlFTkFCTEVfTkxTICYmIFlZRU5BQkxFX05MUworIyAgaWYgRU5BQkxFX05MUworIyAgIGluY2x1ZGUgPGxpYmludGwuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGRlZmluZSBZWV8oTXNnaWQpIGRnZXR0ZXh0ICgiYmlzb24tcnVudGltZSIsIE1zZ2lkKQorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIFlZXworIyAgZGVmaW5lIFlZXyhNc2dpZCkgTXNnaWQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fYXR0cmlidXRlX18KKy8qIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgaW4gZ2NjIHZlcnNpb25zIDIuNSBhbmQgbGF0ZXIuICAqLworIyBpZiAoISBkZWZpbmVkIF9fR05VQ19fIHx8IF9fR05VQ19fIDwgMiBcCisgICAgICB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDUpKQorIyAgZGVmaW5lIF9fYXR0cmlidXRlX18oU3BlYykgLyogZW1wdHkgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTdXBwcmVzcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZ3MgYnkgInVzaW5nIiBFLiAgKi8KKyNpZiAhIGRlZmluZWQgbGludCB8fCBkZWZpbmVkIF9fR05VQ19fCisjIGRlZmluZSBZWVVTRShFKSAoKHZvaWQpIChFKSkKKyNlbHNlCisjIGRlZmluZSBZWVVTRShFKSAvKiBlbXB0eSAqLworI2VuZGlmCisKKworLyogSWRlbnRpdHkgZnVuY3Rpb24sIHVzZWQgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgY29uc3RhbnQgY29uZGl0aW9ucy4gICovCisjaWZuZGVmIGxpbnQKKyMgZGVmaW5lIFlZSUQoTikgKE4pCisjZWxzZQorI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyBpbnQKK1lZSUQgKGludCB5eWkpCisjZWxzZQorc3RhdGljIGludAorWVlJRCAoeXlpKQorICAgIGludCB5eWk7CisjZW5kaWYKK3sKKyAgcmV0dXJuIHl5aTsKK30KKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFCisKKy8qIFRoZSBwYXJzZXIgaW52b2tlcyBhbGxvY2Egb3IgbWFsbG9jOyBkZWZpbmUgdGhlIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KKworIyBpZmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgIGlmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgIGlmZGVmIF9fR05VQ19fCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYnVpbHRpbl9hbGxvY2EKKyMgICBlbGlmIGRlZmluZWQgX19CVUlMVElOX1ZBX0FSR19JTkNSCisjICAgIGluY2x1ZGUgPGFsbG9jYS5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZWxpZiBkZWZpbmVkIF9BSVgKKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19hbGxvY2EKKyMgICBlbGlmIGRlZmluZWQgX01TQ19WRVIKKyMgICAgaW5jbHVkZSA8bWFsbG9jLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjICAgZWxzZQorIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKKyMgICAgaWYgISBkZWZpbmVkIF9BTExPQ0FfSCAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKKyMgICAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisgICAgICAvKiBVc2UgRVhJVF9TVUNDRVNTIGFzIGEgd2l0bmVzcyBmb3Igc3RkbGliLmguICAqLworIyAgICAgaWZuZGVmIEVYSVRfU1VDQ0VTUworIyAgICAgIGRlZmluZSBFWElUX1NVQ0NFU1MgMAorIyAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBZWVNUQUNLX0FMTE9DCisgICAvKiBQYWNpZnkgR0NDJ3MgYGVtcHR5IGlmLWJvZHknIHdhcm5pbmcuICAqLworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRShQdHIpIGRvIHsgLyogZW1wdHkgKi87IH0gd2hpbGUgKFlZSUQgKDApKQorIyAgaWZuZGVmIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTQorICAgIC8qIFRoZSBPUyBtaWdodCBndWFyYW50ZWUgb25seSBvbmUgZ3VhcmQgcGFnZSBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaywKKyAgICAgICBhbmQgYSBwYWdlIHNpemUgY2FuIGJlIGFzIHNtYWxsIGFzIDQwOTYgYnl0ZXMuICBTbyB3ZSBjYW5ub3Qgc2FmZWx5CisgICAgICAgaW52b2tlIGFsbG9jYSAoTikgaWYgTiBleGNlZWRzIDQwOTYuICBVc2UgYSBzbGlnaHRseSBzbWFsbGVyIG51bWJlcgorICAgICAgIHRvIGFsbG93IGZvciBhIGZldyBjb21waWxlci1hbGxvY2F0ZWQgdGVtcG9yYXJ5IHN0YWNrIHNsb3RzLiAgKi8KKyMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIDQwMzIgLyogcmVhc29uYWJsZSBjaXJjYSAyMDA2ICovCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgWVlTVEFDS19BTExPQyBZWU1BTExPQworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBZWUZSRUUKKyMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KKyMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIFlZU0laRV9NQVhJTVVNCisjICBlbmRpZgorIyAgaWYgKGRlZmluZWQgX19jcGx1c3BsdXMgJiYgISBkZWZpbmVkIEVYSVRfU1VDQ0VTUyBcCisgICAgICAgJiYgISAoKGRlZmluZWQgWVlNQUxMT0MgfHwgZGVmaW5lZCBtYWxsb2MpIFwKKwkgICAgICYmIChkZWZpbmVkIFlZRlJFRSB8fCBkZWZpbmVkIGZyZWUpKSkKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGlmbmRlZiBFWElUX1NVQ0NFU1MKKyMgICAgZGVmaW5lIEVYSVRfU1VDQ0VTUyAwCisjICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZm5kZWYgWVlNQUxMT0MKKyMgICBkZWZpbmUgWVlNQUxMT0MgbWFsbG9jCisjICAgaWYgISBkZWZpbmVkIG1hbGxvYyAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3ZvaWQgKm1hbGxvYyAoWVlTSVpFX1QpOyAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZm5kZWYgWVlGUkVFCisjICAgZGVmaW5lIFlZRlJFRSBmcmVlCisjICAgaWYgISBkZWZpbmVkIGZyZWUgJiYgISBkZWZpbmVkIEVYSVRfU1VDQ0VTUyAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCit2b2lkIGZyZWUgKHZvaWQgKik7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiAhIGRlZmluZWQgeXlvdmVyZmxvdyB8fCBZWUVSUk9SX1ZFUkJPU0UgKi8KKworCisjaWYgKCEgZGVmaW5lZCB5eW92ZXJmbG93IFwKKyAgICAgJiYgKCEgZGVmaW5lZCBfX2NwbHVzcGx1cyBcCisJIHx8IChkZWZpbmVkIFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWUxUWVBFX0lTX1RSSVZJQUwgXAorCSAgICAgJiYgZGVmaW5lZCBZWVNUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisKKy8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwordW5pb24geXlhbGxvYworeworICB5eXR5cGVfaW50MTYgeXlzc19hbGxvYzsKKyAgWVlTVFlQRSB5eXZzX2FsbG9jOworICBZWUxUWVBFIHl5bHNfYWxsb2M7Cit9OworCisvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLworIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYSU1VTSAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCisKKy8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAorICAgTiBlbGVtZW50cy4gICovCisjIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHl5dHlwZV9pbnQxNikgKyBzaXplb2YgKFlZU1RZUEUpICsgc2l6ZW9mIChZWUxUWVBFKSkgXAorICAgICAgKyAyICogWVlTVEFDS19HQVBfTUFYSU1VTSkKKworIyBkZWZpbmUgWVlDT1BZX05FRURFRCAxCisKKy8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQorICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCisgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKKyAgIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2tfYWxsb2MsIFN0YWNrKQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorCVlZQ09QWSAoJnl5cHRyLT5TdGFja19hbGxvYywgU3RhY2ssIHl5c2l6ZSk7CQkJXAorCVN0YWNrID0gJnl5cHRyLT5TdGFja19hbGxvYzsJCQkJCVwKKwl5eW5ld2J5dGVzID0geXlzdGFja3NpemUgKiBzaXplb2YgKCpTdGFjaykgKyBZWVNUQUNLX0dBUF9NQVhJTVVNOyBcCisJeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICB3aGlsZSAoWVlJRCAoMCkpCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBZWUNPUFlfTkVFREVEICYmIFlZQ09QWV9ORUVERUQKKy8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIFNSQyB0byBEU1QuICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbworICAgbm90IG92ZXJsYXAuICAqLworIyBpZm5kZWYgWVlDT1BZCisjICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIDEgPCBfX0dOVUNfXworIyAgIGRlZmluZSBZWUNPUFkoRHN0LCBTcmMsIENvdW50KSBcCisgICAgICBfX2J1aWx0aW5fbWVtY3B5IChEc3QsIFNyYywgKENvdW50KSAqIHNpemVvZiAoKihTcmMpKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlDT1BZKERzdCwgU3JjLCBDb3VudCkgICAgICAgICAgICAgIFwKKyAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBZWVNJWkVfVCB5eWk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3IgKHl5aSA9IDA7IHl5aSA8IChDb3VudCk7IHl5aSsrKSAgIFwKKyAgICAgICAgICAgIChEc3QpW3l5aV0gPSAoU3JjKVt5eWldOyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHdoaWxlIChZWUlEICgwKSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYgLyogIVlZQ09QWV9ORUVERUQgKi8KKworLyogWVlGSU5BTCAtLSBTdGF0ZSBudW1iZXIgb2YgdGhlIHRlcm1pbmF0aW9uIHN0YXRlLiAgKi8KKyNkZWZpbmUgWVlGSU5BTCAgNQorLyogWVlMQVNUIC0tIExhc3QgaW5kZXggaW4gWVlUQUJMRS4gICovCisjZGVmaW5lIFlZTEFTVCAgIDQwMgorCisvKiBZWU5UT0tFTlMgLS0gTnVtYmVyIG9mIHRlcm1pbmFscy4gICovCisjZGVmaW5lIFlZTlRPS0VOUyAgMTIwCisvKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gICovCisjZGVmaW5lIFlZTk5UUyAgMTQzCisvKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2YgcnVsZXMuICAqLworI2RlZmluZSBZWU5SVUxFUyAgMjgzCisvKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAgKi8KKyNkZWZpbmUgWVlOU1RBVEVTICA0NzgKKworLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCisjZGVmaW5lIFlZVU5ERUZUT0sgIDIKKyNkZWZpbmUgWVlNQVhVVE9LICAgMzYyCisKKyNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKQkJCQkJCVwKKyAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQorCisvKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXl0cmFuc2xhdGVbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgMTE1LCAgIDExNiwgICAgIDIsICAgMTEzLCAgIDEwOSwgICAxMTQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAxMDgsCisgICAgICAgMiwgICAxMTcsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAxMTEsICAgICAyLCAgIDExMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgIDExOCwgICAxMTAsICAgMTE5LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LAorICAgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCisgICAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwKKyAgICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LAorICAgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCisgICAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwKKyAgICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LAorICAgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsCisgICAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICA4NCwKKyAgICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LAorICAgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsCisgICAgIDEwNSwgICAxMDYsICAgMTA3Cit9OworCisjaWYgWVlERUJVRworLyogWVlQUkhTW1lZTl0gLS0gSW5kZXggb2YgdGhlIGZpcnN0IFJIUyBzeW1ib2wgb2YgcnVsZSBudW1iZXIgWVlOIGluCisgICBZWVJIUy4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXByaHNbXSA9Cit7CisgICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTYsICAgIDIwLCAgICAyMywKKyAgICAgIDI0LCAgICAyNywgICAgMzAsICAgIDMyLCAgICAzNCwgICAgMzYsICAgIDM4LCAgICA0MCwgICAgNDIsICAgIDQ0LAorICAgICAgNDYsICAgIDQ4LCAgICA1MCwgICAgNTIsICAgIDU0LCAgICA1OSwgICAgNjQsICAgIDY5LCAgICA3NiwgICAgODMsCisgICAgICA5MiwgICAxMDEsICAgMTA0LCAgIDEwNywgICAxMjAsICAgMTIzLCAgIDEyNSwgICAxMjcsICAgMTI5LCAgIDEzMSwKKyAgICAgMTMzLCAgIDEzNSwgICAxMzcsICAgMTM5LCAgIDE0MSwgICAxNDMsICAgMTQ1LCAgIDE0NywgICAxNTQsICAgMTU3LAorICAgICAxNjIsICAgMTY1LCAgIDE2NywgICAxNzEsICAgMTc3LCAgIDE4MSwgICAxODQsICAgMTkyLCAgIDE5NSwgICAxOTcsCisgICAgIDE5OSwgICAyMDEsICAgMjAzLCAgIDIwOCwgICAyMTAsICAgMjEyLCAgIDIxNCwgICAyMTYsICAgMjE4LCAgIDIyMCwKKyAgICAgMjIyLCAgIDIyNiwgICAyMjcsICAgMjMwLCAgIDIzMywgICAyMzUsICAgMjM3LCAgIDIzOSwgICAyNDEsICAgMjQzLAorICAgICAyNDUsICAgMjQ3LCAgIDI0OSwgICAyNTEsICAgMjUyLCAgIDI1NCwgICAyNTYsICAgMjU4LCAgIDI2MCwgICAyNjEsCisgICAgIDI2NSwgICAyNjksICAgMjcwLCAgIDI3MywgICAyNzYsICAgMjc4LCAgIDI4MCwgICAyODIsICAgMjg0LCAgIDI4NiwKKyAgICAgMjg4LCAgIDI5MCwgICAyOTIsICAgMjk3LCAgIDMwMCwgICAzMDMsICAgMzA1LCAgIDMwOCwgICAzMTAsICAgMzEzLAorICAgICAzMTUsICAgMzE4LCAgIDMyMywgICAzMjgsICAgMzMwLCAgIDMzMSwgICAzMzUsICAgMzM3LCAgIDMzOSwgICAzNDIsCisgICAgIDM0NCwgICAzNDcsICAgMzQ5LCAgIDM1MSwgICAzNTUsICAgMzYyLCAgIDM2MywgICAzNjUsICAgMzY4LCAgIDM3MywKKyAgICAgMzc1LCAgIDM3OSwgICAzODEsICAgMzgzLCAgIDM4NSwgICAzODcsICAgMzg5LCAgIDM5MSwgICAzOTMsICAgMzk1LAorICAgICAzOTcsICAgMzk5LCAgIDQwMiwgICA0MDUsICAgNDA4LCAgIDQxMSwgICA0MTQsICAgNDE3LCAgIDQyMCwgICA0MjMsCisgICAgIDQyNiwgICA0MjksICAgNDMyLCAgIDQzNSwgICA0MzksICAgNDQxLCAgIDQ0MywgICA0NDUsICAgNDUxLCAgIDQ1MywKKyAgICAgNDU1LCAgIDQ1NywgICA0NjAsICAgNDYyLCAgIDQ2NCwgICA0NjcsICAgNDY5LCAgIDQ3MiwgICA0NzksICAgNDgxLAorICAgICA0ODUsICAgNDg3LCAgIDQ4OSwgICA0OTEsICAgNDkzLCAgIDQ5NSwgICA1MDAsICAgNTAyLCAgIDUwNCwgICA1MDYsCisgICAgIDUwOCwgICA1MTAsICAgNTEyLCAgIDUxNSwgICA1MTcsICAgNTE5LCAgIDUyNSwgICA1MjcsICAgNTMwLCAgIDUzMiwKKyAgICAgNTM0LCAgIDU0MCwgICA1NDMsICAgNTQ0LCAgIDU1MSwgICA1NTUsICAgNTU2LCAgIDU1OCwgICA1NjAsICAgNTYyLAorICAgICA1NjQsICAgNTY2LCAgIDU2OSwgICA1NzEsICAgNTczLCAgIDU3NiwgICA1ODEsICAgNTg2LCAgIDU4NywgICA1OTEsCisgICAgIDU5MywgICA1OTUsICAgNTk3LCAgIDYwMCwgICA2MDIsICAgNjA0LCAgIDYwNiwgICA2MDgsICAgNjE0LCAgIDYxNiwKKyAgICAgNjIwLCAgIDYyNiwgICA2MzIsICAgNjM0LCAgIDYzOCwgICA2NDQsICAgNjQ2LCAgIDY0OCwgICA2NTAsICAgNjUyLAorICAgICA2NTQsICAgNjU2LCAgIDY1OCwgICA2NjAsICAgNjYyLCAgIDY2NiwgICA2NzIsICAgNjgwLCAgIDY5MCwgICA2OTMsCisgICAgIDY5NiwgICA2OTgsICAgNzAwLCAgIDcwMSwgICA3MDIsICAgNzA3LCAgIDcwOSwgICA3MTAsICAgNzExLCAgIDcxNSwKKyAgICAgNzE5LCAgIDcyMSwgICA3MjcsICAgNzMwLCAgIDczMywgICA3MzYsICAgNzM5LCAgIDc0MywgICA3NDYsICAgNzUwLAorICAgICA3NTEsICAgNzU1LCAgIDc1NywgICA3NTksICAgNzYwLCAgIDc2MiwgICA3NjQsICAgNzY1LCAgIDc2NywgICA3NjksCisgICAgIDc3MCwgICA3NzIsICAgNzc0LCAgIDc3NSwgICA3NzksICAgNzgwLCAgIDc4NCwgICA3ODUsICAgNzg5LCAgIDc5MSwKKyAgICAgNzkzLCAgIDc5NSwgICA4MDAsICAgODAyCit9OworCisvKiBZWVJIUyAtLSBBIGAtMSctc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHJ1bGVzJyBSSFMuICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eXJoc1tdID0KK3sKKyAgICAgMTIxLCAgICAgMCwgICAgLTEsICAgMTIyLCAgIDEyMywgICAxMjUsICAgIDEyLCAgICAtMSwgICAgIDMsICAgIC0xLAorICAgICAgIDQsICAgIC0xLCAgIDEyMywgICAxMjQsICAgIC0xLCAgICAtMSwgICAgIDgsICAgMjYyLCAgIDEwOCwgICAgLTEsCisgICAgIDEyNSwgICAxMjYsICAgIC0xLCAgICAtMSwgICAxMjcsICAgMTA4LCAgICAtMSwgICAxNzAsICAgMTA4LCAgICAtMSwKKyAgICAgMTI4LCAgICAtMSwgICAxMjksICAgIC0xLCAgIDEzMCwgICAgLTEsICAgMTMxLCAgICAtMSwgICAxMzIsICAgIC0xLAorICAgICAxMzMsICAgIC0xLCAgIDEzNCwgICAgLTEsICAgMTM1LCAgICAtMSwgICAxNDEsICAgIC0xLCAgIDEzNiwgICAgLTEsCisgICAgIDEzNywgICAgLTEsICAgMTM4LCAgICAtMSwgICAgMTksICAgMTQ2LCAgIDEwOSwgICAxNDIsICAgIC0xLCAgICAxOCwKKyAgICAgMTQ1LCAgIDEwOSwgICAxNDQsICAgIC0xLCAgICAxNiwgICAxNDUsICAgMTA5LCAgIDE0MiwgICAgLTEsICAgIDE0LAorICAgICAxNDUsICAgMTA5LCAgIDE0MiwgICAxMDksICAgMTQyLCAgICAtMSwgICAgMTMsICAgMTQ1LCAgIDEwOSwgICAxNDQsCisgICAgIDEwOSwgICAxNDQsICAgIC0xLCAgICAxNywgICAxNDUsICAgMTA5LCAgIDE0NCwgICAxMDksICAgMTQ0LCAgIDEwOSwKKyAgICAgMTQ0LCAgICAtMSwgICAgMTUsICAgMTQ1LCAgIDEwOSwgICAxNDQsICAgMTA5LCAgIDEzOSwgICAxMDksICAgMTQwLAorICAgICAgLTEsICAgIDIwLCAgIDE0NCwgICAgLTEsICAgIDIwLCAgIDE2NiwgICAgLTEsICAgIDIyLCAgIDE0NSwgICAxMDksCisgICAgIDE0NCwgICAxMDksICAgMTQ0LCAgIDEwOSwgICAxNDQsICAgMTA5LCAgIDEzOSwgICAxMDksICAgMTQwLCAgICAtMSwKKyAgICAgIDgzLCAgIDI1NiwgICAgLTEsICAgIDg0LCAgICAtMSwgICAgODUsICAgIC0xLCAgICA4NiwgICAgLTEsICAgIDg3LAorICAgICAgLTEsICAgIDg4LCAgICAtMSwgICAgODksICAgIC0xLCAgICA5MCwgICAgLTEsICAgIDkxLCAgICAtMSwgICAgOTIsCisgICAgICAtMSwgICAgOTMsICAgIC0xLCAgICA5NCwgICAgLTEsICAgIDk1LCAgICAtMSwgICAgMjEsICAgMTQ1LCAgIDEwOSwKKyAgICAgMTUwLCAgIDEwOSwgICAxNDcsICAgIC0xLCAgIDI0MSwgICAxNDMsICAgIC0xLCAgIDI0MSwgICAxMTAsICAgMTQzLAorICAgICAxMTAsICAgIC0xLCAgIDE1MCwgICAxNjIsICAgIC0xLCAgIDIzOCwgICAgLTEsICAgMjQxLCAgIDE1MCwgICAxNjMsCisgICAgICAtMSwgICAyNDEsICAgMTEwLCAgIDE1MCwgICAxNjMsICAgMTEwLCAgICAtMSwgICAxNTEsICAgMTY0LCAgIDE2NSwKKyAgICAgIC0xLCAgIDE1OSwgICAxNjEsICAgIC0xLCAgIDE0OCwgICAxMDksICAgMTQ4LCAgIDEwOSwgICAxNDgsICAgMTA5LAorICAgICAxNDgsICAgIC0xLCAgIDI0MSwgICAxNDksICAgIC0xLCAgICAyMywgICAgLTEsICAgMjYyLCAgICAtMSwgICAxMDAsCisgICAgICAtMSwgICAxNzIsICAgIC0xLCAgIDE1MiwgICAxMTEsICAgMTUzLCAgIDExMiwgICAgLTEsICAgMTg2LCAgICAtMSwKKyAgICAgMjQ5LCAgICAtMSwgICAxMDAsICAgIC0xLCAgIDEwMCwgICAgLTEsICAgMTU0LCAgICAtMSwgICAxNTUsICAgIC0xLAorICAgICAgMjMsICAgIC0xLCAgIDE1OSwgICAxNjAsICAgMTU2LCAgICAtMSwgICAgLTEsICAgMTEzLCAgIDE1NywgICAgLTEsCisgICAgIDExNCwgICAxNTgsICAgIC0xLCAgICAyMywgICAgLTEsICAgIDIzLCAgICAtMSwgICAxMDAsICAgIC0xLCAgIDEwNCwKKyAgICAgIC0xLCAgIDEwNCwgICAgLTEsICAgMTA0LCAgICAtMSwgICAxMDQsICAgIC0xLCAgIDEwMSwgICAgLTEsICAgMTA1LAorICAgICAgLTEsICAgIC0xLCAgIDEwMSwgICAgLTEsICAgMTAyLCAgICAtMSwgICAxMDMsICAgIC0xLCAgIDEwNCwgICAgLTEsCisgICAgICAtMSwgICAxMTUsICAgMTY2LCAgIDExNiwgICAgLTEsICAgMTE1LCAgIDE2NywgICAxMTYsICAgIC0xLCAgICAtMSwKKyAgICAgMTY4LCAgIDE2MywgICAgLTEsICAgMTY5LCAgIDE2MywgICAgLTEsICAgIDk5LCAgICAtMSwgICAxMDAsICAgIC0xLAorICAgICAxNzEsICAgIC0xLCAgIDE3OCwgICAgLTEsICAgMjQyLCAgICAtMSwgICAyNDUsICAgIC0xLCAgIDI0OCwgICAgLTEsCisgICAgIDI2MSwgICAgLTEsICAgICA3LCAgICA5OSwgICAxMTcsICAgMTcyLCAgICAtMSwgICAgOTYsICAgMTczLCAgICAtMSwKKyAgICAgIDM4LCAgIDE3NywgICAgLTEsICAgIDYwLCAgICAtMSwgICAgOTgsICAgMTc1LCAgICAtMSwgICAgNTMsICAgIC0xLAorICAgICAgMjksICAgMjU0LCAgICAtMSwgICAgMzcsICAgIC0xLCAgICA3NCwgICAyNTUsICAgIC0xLCAgICA1MCwgICAxMTEsCisgICAgIDE3NiwgICAxMTIsICAgIC0xLCAgICA5NywgICAxMTEsICAgMTc0LCAgIDExMiwgICAgLTEsICAgIDIzLCAgICAtMSwKKyAgICAgIC0xLCAgIDExMSwgICAxNzYsICAgMTEyLCAgICAtMSwgICAgMjMsICAgIC0xLCAgICA2MCwgICAgLTEsICAgIDI5LAorICAgICAyNTQsICAgIC0xLCAgICAzNywgICAgLTEsICAgIDc0LCAgIDI1NSwgICAgLTEsICAgMTc5LCAgICAtMSwgICAxODAsCisgICAgICAtMSwgICAgMTAsICAgIDk5LCAgIDE4MiwgICAgLTEsICAgIDEwLCAgICA5OSwgICAxMTEsICAgMTgxLCAgIDExMiwKKyAgICAgMTgzLCAgICAtMSwgICAgLTEsICAgIDIzLCAgICAtMSwgICAxMTcsICAgMTg1LCAgICAtMSwgICAxMTcsICAgMTE4LAorICAgICAxODQsICAgMTE5LCAgICAtMSwgICAxODcsICAgIC0xLCAgIDE4NCwgICAxMDksICAgMTg3LCAgICAtMSwgICAxODksCisgICAgICAtMSwgICAyMjUsICAgIC0xLCAgIDIzNSwgICAgLTEsICAgMTg5LCAgICAtMSwgICAyMjUsICAgIC0xLCAgIDIzNiwKKyAgICAgIC0xLCAgIDE4OCwgICAgLTEsICAgMjI2LCAgICAtMSwgICAyMzUsICAgIC0xLCAgIDE4OSwgICAgLTEsICAgIDczLAorICAgICAyMTMsICAgIC0xLCAgICA3MywgICAxOTAsICAgIC0xLCAgICA3MywgICAxOTIsICAgIC0xLCAgICA3MywgICAxOTUsCisgICAgICAtMSwgICAgNzMsICAgMTk3LCAgICAtMSwgICAgNzMsICAgMjAzLCAgICAtMSwgICAgNzMsICAgMTk5LCAgICAtMSwKKyAgICAgIDczLCAgIDIwNiwgICAgLTEsICAgIDczLCAgIDIwOCwgICAgLTEsICAgIDczLCAgIDIxMCwgICAgLTEsICAgIDczLAorICAgICAyMTIsICAgIC0xLCAgICA3MywgICAyMjQsICAgIC0xLCAgICA0NywgICAyNTMsICAgMTkxLCAgICAtMSwgICAyMDEsCisgICAgICAtMSwgICAgMzMsICAgIC0xLCAgICA2OSwgICAgLTEsICAgIDQzLCAgIDExMSwgICAyMDIsICAgMTEyLCAgIDE5MywKKyAgICAgIC0xLCAgIDIwMSwgICAgLTEsICAgIDYwLCAgICAtMSwgICAgMjYsICAgIC0xLCAgICA3MiwgICAxOTQsICAgIC0xLAorICAgICAgNDAsICAgIC0xLCAgICAzMiwgICAgLTEsICAgIDQ0LCAgIDE5NiwgICAgLTEsICAgIDI1LCAgICAtMSwgICAyNTMsCisgICAgICA2NywgICAgLTEsICAgIDQ1LCAgIDExMSwgICAyMDIsICAgMTEyLCAgIDI1MywgICAxOTgsICAgIC0xLCAgIDIwMSwKKyAgICAgIC0xLCAgICA3NSwgICAyNTcsICAgMjAwLCAgICAtMSwgICAgMjksICAgIC0xLCAgICAyNSwgICAgLTEsICAgIDMxLAorICAgICAgLTEsICAgIDcxLCAgICAtMSwgICAgMjMsICAgIC0xLCAgICA3NiwgICAyNTUsICAgMjA0LCAgIDIwNSwgICAgLTEsCisgICAgICAzNSwgICAgLTEsICAgIDU0LCAgICAtMSwgICAgNzksICAgIC0xLCAgICA4MCwgICAgLTEsICAgIDc4LCAgICAtMSwKKyAgICAgIDc3LCAgICAtMSwgICAgMzYsICAgMjA3LCAgICAtMSwgICAgMjksICAgIC0xLCAgICA1NiwgICAgLTEsICAgIDI4LAorICAgICAxMTEsICAgMjA5LCAgIDExMiwgICAgNTcsICAgIC0xLCAgICAyMywgICAgLTEsICAgIDU4LCAgIDIxMSwgICAgLTEsCisgICAgICA3MCwgICAgLTEsICAgIDI2LCAgICAtMSwgICAyMTUsICAgIDY2LCAgIDExMSwgICAyMTgsICAgMTEyLCAgICAtMSwKKyAgICAgMjE1LCAgIDIxNCwgICAgLTEsICAgIC0xLCAgICA2NiwgICAxMTEsICAgMjE4LCAgIDEwNiwgICAyMTgsICAgMTEyLAorICAgICAgLTEsICAgIDQ5LCAgIDIxOSwgICAyMTYsICAgIC0xLCAgICAtMSwgICAyMTcsICAgIC0xLCAgICA0MSwgICAgLTEsCisgICAgICA4MiwgICAgLTEsICAgIDQyLCAgICAtMSwgICAgMjMsICAgIC0xLCAgICA1MSwgICAyMjAsICAgIC0xLCAgICA2MywKKyAgICAgIC0xLCAgICA1MiwgICAgLTEsICAgIDgxLCAgIDI1NSwgICAgLTEsICAgIDU1LCAgIDExMSwgICAyMjIsICAgMTEyLAorICAgICAgLTEsICAgIDQ4LCAgIDExMSwgICAyMjMsICAgMTEyLCAgICAtMSwgICAgLTEsICAgMTExLCAgIDIyMSwgICAxMTIsCisgICAgICAtMSwgICAgMjMsICAgIC0xLCAgICAyMywgICAgLTEsICAgIDIzLCAgICAtMSwgICAgMzAsICAgIDY0LCAgICAtMSwKKyAgICAgMjI5LCAgICAtMSwgICAyMzIsICAgIC0xLCAgIDIyNywgICAgLTEsICAgMjMwLCAgICAtMSwgICAgNjIsICAgIDM0LAorICAgICAxMTEsICAgMjI4LCAgIDExMiwgICAgLTEsICAgMjMzLCAgICAtMSwgICAyMzMsICAgMTA2LCAgIDIzMywgICAgLTEsCisgICAgICA2MiwgICAgMzQsICAgMTExLCAgIDIzMywgICAxMTIsICAgIC0xLCAgICA2MiwgICAgNDYsICAgMTExLCAgIDIzMSwKKyAgICAgMTEyLCAgICAtMSwgICAyMzQsICAgIC0xLCAgIDIzNCwgICAxMDYsICAgMjM0LCAgICAtMSwgICAgNjIsICAgIDQ2LAorICAgICAxMTEsICAgMjM0LCAgIDExMiwgICAgLTEsICAgIDIzLCAgICAtMSwgICAgMjMsICAgIC0xLCAgIDIzNywgICAgLTEsCisgICAgIDIzOSwgICAgLTEsICAgMjM4LCAgICAtMSwgICAyMzksICAgIC0xLCAgIDI0MCwgICAgLTEsICAgIDI0LCAgICAtMSwKKyAgICAgIDIzLCAgICAtMSwgICAxMTgsICAgMjQwLCAgIDExOSwgICAgLTEsICAgMTE4LCAgIDI0MCwgICAxMDksICAgMjQwLAorICAgICAxMTksICAgIC0xLCAgIDExOCwgICAyNDAsICAgMTA5LCAgIDI0MCwgICAxMDksICAgMjQwLCAgIDExOSwgICAgLTEsCisgICAgIDExOCwgICAyNDAsICAgMTA5LCAgIDI0MCwgICAxMDksICAgMjQwLCAgIDEwOSwgICAyNDAsICAgMTE5LCAgICAtMSwKKyAgICAgMjQxLCAgICAyNCwgICAgLTEsICAgMjQxLCAgICAyMywgICAgLTEsICAgMTEzLCAgICAtMSwgICAxMTQsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgIDI0NCwgICAgMTEsICAgMjQzLCAgIDI0NywgICAgLTEsICAgMjYyLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgIDUsICAgMjQ2LCAgIDI0NywgICAgLTEsICAgMjQ3LCAgIDEwOSwgICAgOTksICAgIC0xLCAgICA5OSwKKyAgICAgIC0xLCAgIDI0NCwgICAgIDksICAgIDk5LCAgIDExNywgICAyNDksICAgIC0xLCAgICA2NSwgICAgNjAsICAgIC0xLAorICAgICAgNjUsICAgIDM3LCAgICAtMSwgICAgNjUsICAgMjUwLCAgICAtMSwgICAgNjUsICAgIDU5LCAgICAtMSwgICAgNjUsCisgICAgICA3NCwgICAyNTUsICAgIC0xLCAgICA2NSwgICAgMzAsICAgIC0xLCAgICAyOSwgICAyNTEsICAgMjUyLCAgICAtMSwKKyAgICAgIC0xLCAgIDExMSwgICAgMjMsICAgMTEyLCAgICAtMSwgICAgMzksICAgIC0xLCAgICAyNywgICAgLTEsICAgIC0xLAorICAgICAgNjEsICAgIC0xLCAgICA2OCwgICAgLTEsICAgIC0xLCAgICAzOSwgICAgLTEsICAgIDI3LCAgICAtMSwgICAgLTEsCisgICAgICA2MSwgICAgLTEsICAgIDY4LCAgICAtMSwgICAgLTEsICAgMTExLCAgIDI1OCwgICAxMTIsICAgIC0xLCAgICAtMSwKKyAgICAgMTExLCAgIDI1OSwgICAxMTIsICAgIC0xLCAgICAtMSwgICAxMTEsICAgMjYwLCAgIDExMiwgICAgLTEsICAgIDIzLAorICAgICAgLTEsICAgIDIzLCAgICAtMSwgICAgMjMsICAgIC0xLCAgICAgNiwgICAgOTksICAgMTE3LCAgIDEwMCwgICAgLTEsCisgICAgICA5OSwgICAgLTEsICAgMTAwLCAgICAtMQorfTsKKworLyogWVlSTElORVtZWU5dIC0tIHNvdXJjZSBsaW5lIHdoZXJlIHJ1bGUgbnVtYmVyIFlZTiB3YXMgZGVmaW5lZC4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXJsaW5lW10gPQoreworICAgICAgIDAsICAgMjg0LCAgIDI4NCwgICAyODcsICAgMjk1LCAgIDMwNywgICAzMDgsICAgMzExLCAgIDMzNSwgICAzMzYsCisgICAgIDMzOSwgICAzNTQsICAgMzU3LCAgIDM2MiwgICAzNjksICAgMzcwLCAgIDM3MSwgICAzNzIsICAgMzczLCAgIDM3NCwKKyAgICAgMzc1LCAgIDM3OCwgICAzNzksICAgMzgwLCAgIDM4MywgICAzODksICAgMzk3LCAgIDQwMywgICA0MTAsICAgNDE2LAorICAgICA0MjMsICAgNDY3LCAgIDQ3MiwgICA0ODEsICAgNTI1LCAgIDUzMSwgICA1MzIsICAgNTMzLCAgIDUzNCwgICA1MzUsCisgICAgIDUzNiwgICA1MzcsICAgNTM4LCAgIDUzOSwgICA1NDAsICAgNTQxLCAgIDU0MiwgICA1NDUsICAgNTU3LCAgIDU2NSwKKyAgICAgNTgyLCAgIDU4OSwgICA2MDgsICAgNjE5LCAgIDYzOSwgICA2NjMsICAgNjcwLCAgIDcwMywgICA3MTAsICAgNzI2LAorICAgICA3ODUsICAgODI4LCAgIDgzNywgICA4NTksICAgODY5LCAgIDg3MywgICA5MDIsICAgOTIxLCAgIDkyMSwgICA5MjMsCisgICAgIDkzMCwgICA5NDIsICAgOTQzLCAgIDk0NCwgICA5NDcsICAgOTYxLCAgIDk3NSwgICA5OTUsICAxMDA2LCAgMTAxOCwKKyAgICAxMDIwLCAgMTAyMSwgIDEwMjIsICAxMDIzLCAgMTAyNiwgIDEwMjYsICAxMDI2LCAgMTAyNiwgIDEwMjcsICAxMDMwLAorICAgIDEwMzQsICAxMDM5LCAgMTA0NSwgIDEwNTIsICAxMDU5LCAgMTA4MSwgIDExMDMsICAxMTA0LCAgMTEwNSwgIDExMDYsCisgICAgMTEwNywgIDExMDgsICAxMTExLCAgMTEzMCwgIDExMzQsICAxMTQwLCAgMTE0NCwgIDExNDgsICAxMTUyLCAgMTE1NiwKKyAgICAxMTYwLCAgMTE2NCwgIDExNjksICAxMTc1LCAgMTE4NiwgIDExODYsICAxMTg3LCAgMTE4OSwgIDExOTMsICAxMTk3LAorICAgIDEyMDEsICAxMjA3LCAgMTIwNywgIDEyMDksICAxMjI3LCAgMTI1MywgIDEyNTYsICAxMjcxLCAgMTI3NywgIDEyODMsCisgICAgMTI4NCwgIDEyOTEsICAxMjk3LCAgMTMwMywgIDEzMTEsICAxMzE3LCAgMTMyMywgIDEzMzEsICAxMzM3LCAgMTM0MywKKyAgICAxMzUxLCAgMTM1MiwgIDEzNTUsICAxMzU2LCAgMTM1NywgIDEzNTgsICAxMzU5LCAgMTM2MCwgIDEzNjEsICAxMzYyLAorICAgIDEzNjMsICAxMzY0LCAgMTM2NSwgIDEzNjgsICAxMzc3LCAgMTM4MSwgIDEzODUsICAxMzkxLCAgMTQwMCwgIDE0MDQsCisgICAgMTQwOCwgIDE0MTcsICAxNDIxLCAgMTQyNywgIDE0MzMsICAxNDQwLCAgMTQ0NSwgIDE0NTMsICAxNDYzLCAgMTQ2NSwKKyAgICAxNDczLCAgMTQ3OSwgIDE0ODMsICAxNDg3LCAgMTQ5MywgIDE1MDQsICAxNTEzLCAgMTUxNywgIDE1MjIsICAxNTI2LAorICAgIDE1MzAsICAxNTM0LCAgMTU0MCwgIDE1NDcsICAxNTUxLCAgMTU1NywgIDE1NjUsICAxNTc2LCAgMTU4MywgIDE1ODcsCisgICAgMTU5MywgIDE2MDMsICAxNjE0LCAgMTYxOCwgIDE2MzYsICAxNjQ1LCAgMTY0OCwgIDE2NTQsICAxNjU4LCAgMTY2MiwKKyAgICAxNjY4LCAgMTY3OSwgIDE2ODQsICAxNjg5LCAgMTY5NCwgIDE2OTksICAxNzA0LCAgMTcxMiwgIDE3MTUsICAxNzIwLAorICAgIDE3MzMsICAxNzQxLCAgMTc1MiwgIDE3NjAsICAxNzYwLCAgMTc2MiwgIDE3NjIsICAxNzY0LCAgMTc3NCwgIDE3NzksCisgICAgMTc4NiwgIDE3OTYsICAxODA1LCAgMTgxMCwgIDE4MTcsICAxODI3LCAgMTgzNywgIDE4NDksICAxODQ5LCAgMTg1MCwKKyAgICAxODUwLCAgMTg1MiwgIDE4NjIsICAxODcwLCAgMTg4MCwgIDE4ODgsICAxODk2LCAgMTkwNSwgIDE5MTYsICAxOTIwLAorICAgIDE5MjYsICAxOTI3LCAgMTkyOCwgIDE5MzEsICAxOTMxLCAgMTkzNCwgIDE5NjksICAxOTczLCAgMTk3MywgIDE5NzYsCisgICAgMTk4MywgIDE5OTIsICAyMDA2LCAgMjAxNSwgIDIwMjQsICAyMDI4LCAgMjAzNywgIDIwNDYsICAyMDU3LCAgMjA2NCwKKyAgICAyMDc0LCAgMjEwMiwgIDIxMTEsICAyMTIzLCAgMjEyNiwgIDIxMzUsICAyMTQ2LCAgMjE0NywgIDIxNDgsICAyMTUxLAorICAgIDIxNTIsICAyMTUzLCAgMjE1NiwgIDIxNTcsICAyMTYwLCAgMjE2MSwgIDIxNjQsICAyMTY1LCAgMjE2OCwgIDIxNzksCisgICAgMjE5MCwgIDIyMDEsICAyMjI3LCAgMjIyOAorfTsKKyNlbmRpZgorCisjaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UgfHwgMQorLyogWVlUTkFNRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCisgICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9Cit7CisgICIkZW5kIiwgImVycm9yIiwgIiR1bmRlZmluZWQiLCAiQVJCdnBfMTAiLCAiQVJCZnBfMTAiLCAiQUREUkVTUyIsCisgICJBTElBUyIsICJBVFRSSUIiLCAiT1BUSU9OIiwgIk9VVFBVVCIsICJQQVJBTSIsICJURU1QIiwgIkVORCIsICJCSU5fT1AiLAorICAiQklOU0NfT1AiLCAiU0FNUExFX09QIiwgIlNDQUxBUl9PUCIsICJUUklfT1AiLCAiVkVDVE9SX09QIiwgIkFSTCIsCisgICJLSUwiLCAiU1daIiwgIlRYRF9PUCIsICJJTlRFR0VSIiwgIlJFQUwiLCAiQU1CSUVOVCIsICJBVFRFTlVBVElPTiIsCisgICJCQUNLIiwgIkNMSVAiLCAiQ09MT1IiLCAiREVQVEgiLCAiRElGRlVTRSIsICJESVJFQ1RJT04iLCAiRU1JU1NJT04iLAorICAiRU5WIiwgIkVZRSIsICJGT0ciLCAiRk9HQ09PUkQiLCAiRlJBR01FTlQiLCAiRlJPTlQiLCAiSEFMRiIsICJJTlZFUlNFIiwKKyAgIklOVlRSQU5TIiwgIkxJR0hUIiwgIkxJR0hUTU9ERUwiLCAiTElHSFRQUk9EIiwgIkxPQ0FMIiwgIk1BVEVSSUFMIiwKKyAgIk1BVF9QUk9HUkFNIiwgIk1BVFJJWCIsICJNQVRSSVhJTkRFWCIsICJNT0RFTFZJRVciLCAiTVZQIiwgIk5PUk1BTCIsCisgICJPQkpFQ1QiLCAiUEFMRVRURSIsICJQQVJBTVMiLCAiUExBTkUiLCAiUE9JTlRfVE9LIiwgIlBPSU5UU0laRSIsCisgICJQT1NJVElPTiIsICJQUklNQVJZIiwgIlBST0dSQU0iLCAiUFJPSkVDVElPTiIsICJSQU5HRSIsICJSRVNVTFQiLCAiUk9XIiwKKyAgIlNDRU5FQ09MT1IiLCAiU0VDT05EQVJZIiwgIlNISU5JTkVTUyIsICJTSVpFX1RPSyIsICJTUEVDVUxBUiIsICJTUE9UIiwKKyAgIlNUQVRFIiwgIlRFWENPT1JEIiwgIlRFWEVOViIsICJURVhHRU4iLCAiVEVYR0VOX1EiLCAiVEVYR0VOX1IiLAorICAiVEVYR0VOX1MiLCAiVEVYR0VOX1QiLCAiVEVYVFVSRSIsICJUUkFOU1BPU0UiLCAiVEVYVFVSRV9VTklUIiwgIlRFWF8xRCIsCisgICJURVhfMkQiLCAiVEVYXzNEIiwgIlRFWF9DVUJFIiwgIlRFWF9SRUNUIiwgIlRFWF9TSEFET1cxRCIsCisgICJURVhfU0hBRE9XMkQiLCAiVEVYX1NIQURPV1JFQ1QiLCAiVEVYX0FSUkFZMUQiLCAiVEVYX0FSUkFZMkQiLAorICAiVEVYX0FSUkFZU0hBRE9XMUQiLCAiVEVYX0FSUkFZU0hBRE9XMkQiLCAiVkVSVEVYIiwgIlZUWEFUVFJJQiIsCisgICJXRUlHSFQiLCAiSURFTlRJRklFUiIsICJVU0VEX0lERU5USUZJRVIiLCAiTUFTSzQiLCAiTUFTSzMiLCAiTUFTSzIiLAorICAiTUFTSzEiLCAiU1dJWlpMRSIsICJET1RfRE9UIiwgIkRPVCIsICInOyciLCAiJywnIiwgIid8JyIsICInWyciLCAiJ10nIiwKKyAgIicrJyIsICInLSciLCAiJygnIiwgIicpJyIsICInPSciLCAiJ3snIiwgIid9JyIsICIkYWNjZXB0IiwgInByb2dyYW0iLAorICAibGFuZ3VhZ2UiLCAib3B0aW9uU2VxdWVuY2UiLCAib3B0aW9uIiwgInN0YXRlbWVudFNlcXVlbmNlIiwgInN0YXRlbWVudCIsCisgICJpbnN0cnVjdGlvbiIsICJBTFVfaW5zdHJ1Y3Rpb24iLCAiVGV4SW5zdHJ1Y3Rpb24iLCAiQVJMX2luc3RydWN0aW9uIiwKKyAgIlZFQ1RPUm9wX2luc3RydWN0aW9uIiwgIlNDQUxBUm9wX2luc3RydWN0aW9uIiwgIkJJTlNDb3BfaW5zdHJ1Y3Rpb24iLAorICAiQklOb3BfaW5zdHJ1Y3Rpb24iLCAiVFJJb3BfaW5zdHJ1Y3Rpb24iLCAiU0FNUExFX2luc3RydWN0aW9uIiwKKyAgIktJTF9pbnN0cnVjdGlvbiIsICJUWERfaW5zdHJ1Y3Rpb24iLCAidGV4SW1hZ2VVbml0IiwgInRleFRhcmdldCIsCisgICJTV1pfaW5zdHJ1Y3Rpb24iLCAic2NhbGFyU3JjUmVnIiwgInNjYWxhclVzZSIsICJzd2l6emxlU3JjUmVnIiwKKyAgIm1hc2tlZERzdFJlZyIsICJtYXNrZWRBZGRyUmVnIiwgImV4dGVuZGVkU3dpenpsZSIsICJleHRTd2l6Q29tcCIsCisgICJleHRTd2l6U2VsIiwgInNyY1JlZyIsICJkc3RSZWciLCAicHJvZ1BhcmFtQXJyYXkiLCAicHJvZ1BhcmFtQXJyYXlNZW0iLAorICAicHJvZ1BhcmFtQXJyYXlBYnMiLCAicHJvZ1BhcmFtQXJyYXlSZWwiLCAiYWRkclJlZ1JlbE9mZnNldCIsCisgICJhZGRyUmVnUG9zT2Zmc2V0IiwgImFkZHJSZWdOZWdPZmZzZXQiLCAiYWRkclJlZyIsICJhZGRyQ29tcG9uZW50IiwKKyAgImFkZHJXcml0ZU1hc2siLCAic2NhbGFyU3VmZml4IiwgInN3aXp6bGVTdWZmaXgiLCAib3B0aW9uYWxNYXNrIiwKKyAgIm9wdGlvbmFsQ2NNYXNrIiwgImNjVGVzdCIsICJjY1Rlc3QyIiwgImNjTWFza1J1bGUiLCAiY2NNYXNrUnVsZTIiLAorICAibmFtaW5nU3RhdGVtZW50IiwgIkFUVFJJQl9zdGF0ZW1lbnQiLCAiYXR0cmliQmluZGluZyIsICJ2dHhBdHRyaWJJdGVtIiwKKyAgInZ0eEF0dHJpYk51bSIsICJ2dHhPcHRXZWlnaHROdW0iLCAidnR4V2VpZ2h0TnVtIiwgImZyYWdBdHRyaWJJdGVtIiwKKyAgIlBBUkFNX3N0YXRlbWVudCIsICJQQVJBTV9zaW5nbGVTdG10IiwgIlBBUkFNX211bHRpcGxlU3RtdCIsCisgICJvcHRBcnJheVNpemUiLCAicGFyYW1TaW5nbGVJbml0IiwgInBhcmFtTXVsdGlwbGVJbml0IiwKKyAgInBhcmFtTXVsdEluaXRMaXN0IiwgInBhcmFtU2luZ2xlSXRlbURlY2wiLCAicGFyYW1TaW5nbGVJdGVtVXNlIiwKKyAgInBhcmFtTXVsdGlwbGVJdGVtIiwgInN0YXRlTXVsdGlwbGVJdGVtIiwgInN0YXRlU2luZ2xlSXRlbSIsCisgICJzdGF0ZU1hdGVyaWFsSXRlbSIsICJzdGF0ZU1hdFByb3BlcnR5IiwgInN0YXRlTGlnaHRJdGVtIiwKKyAgInN0YXRlTGlnaHRQcm9wZXJ0eSIsICJzdGF0ZVNwb3RQcm9wZXJ0eSIsICJzdGF0ZUxpZ2h0TW9kZWxJdGVtIiwKKyAgInN0YXRlTE1vZFByb3BlcnR5IiwgInN0YXRlTGlnaHRQcm9kSXRlbSIsICJzdGF0ZUxQcm9kUHJvcGVydHkiLAorICAic3RhdGVUZXhFbnZJdGVtIiwgInN0YXRlVGV4RW52UHJvcGVydHkiLCAiYW1iRGlmZlNwZWNQcm9wZXJ0eSIsCisgICJzdGF0ZUxpZ2h0TnVtYmVyIiwgInN0YXRlVGV4R2VuSXRlbSIsICJzdGF0ZVRleEdlblR5cGUiLAorICAic3RhdGVUZXhHZW5Db29yZCIsICJzdGF0ZUZvZ0l0ZW0iLCAic3RhdGVGb2dQcm9wZXJ0eSIsCisgICJzdGF0ZUNsaXBQbGFuZUl0ZW0iLCAic3RhdGVDbGlwUGxhbmVOdW0iLCAic3RhdGVQb2ludEl0ZW0iLAorICAic3RhdGVQb2ludFByb3BlcnR5IiwgInN0YXRlTWF0cml4Um93IiwgInN0YXRlTWF0cml4Um93cyIsCisgICJvcHRNYXRyaXhSb3dzIiwgInN0YXRlTWF0cml4SXRlbSIsICJzdGF0ZU9wdE1hdE1vZGlmaWVyIiwKKyAgInN0YXRlTWF0TW9kaWZpZXIiLCAic3RhdGVNYXRyaXhSb3dOdW0iLCAic3RhdGVNYXRyaXhOYW1lIiwKKyAgInN0YXRlT3B0TW9kTWF0TnVtIiwgInN0YXRlTW9kTWF0TnVtIiwgInN0YXRlUGFsZXR0ZU1hdE51bSIsCisgICJzdGF0ZVByb2dyYW1NYXROdW0iLCAic3RhdGVEZXB0aEl0ZW0iLCAicHJvZ3JhbVNpbmdsZUl0ZW0iLAorICAicHJvZ3JhbU11bHRpcGxlSXRlbSIsICJwcm9nRW52UGFyYW1zIiwgInByb2dFbnZQYXJhbU51bXMiLAorICAicHJvZ0VudlBhcmFtIiwgInByb2dMb2NhbFBhcmFtcyIsICJwcm9nTG9jYWxQYXJhbU51bXMiLAorICAicHJvZ0xvY2FsUGFyYW0iLCAicHJvZ0VudlBhcmFtTnVtIiwgInByb2dMb2NhbFBhcmFtTnVtIiwKKyAgInBhcmFtQ29uc3REZWNsIiwgInBhcmFtQ29uc3RVc2UiLCAicGFyYW1Db25zdFNjYWxhckRlY2wiLAorICAicGFyYW1Db25zdFNjYWxhclVzZSIsICJwYXJhbUNvbnN0VmVjdG9yIiwgInNpZ25lZEZsb2F0Q29uc3RhbnQiLAorICAib3B0aW9uYWxTaWduIiwgIlRFTVBfc3RhdGVtZW50IiwgIkAxIiwgIm9wdFZhclNpemUiLAorICAiQUREUkVTU19zdGF0ZW1lbnQiLCAiQDIiLCAidmFyTmFtZUxpc3QiLCAiT1VUUFVUX3N0YXRlbWVudCIsCisgICJyZXN1bHRCaW5kaW5nIiwgInJlc3VsdENvbEJpbmRpbmciLCAib3B0UmVzdWx0RmFjZVR5cGUiLAorICAib3B0UmVzdWx0Q29sb3JUeXBlIiwgIm9wdEZhY2VUeXBlIiwgIm9wdENvbG9yVHlwZSIsCisgICJvcHRUZXhDb29yZFVuaXROdW0iLCAib3B0VGV4SW1hZ2VVbml0TnVtIiwgIm9wdExlZ2FjeVRleFVuaXROdW0iLAorICAidGV4Q29vcmRVbml0TnVtIiwgInRleEltYWdlVW5pdE51bSIsICJsZWdhY3lUZXhVbml0TnVtIiwKKyAgIkFMSUFTX3N0YXRlbWVudCIsICJzdHJpbmciLCBZWV9OVUxMCit9OworI2VuZGlmCisKKyMgaWZkZWYgWVlQUklOVAorLyogWVlUT0tOVU1bWVlMRVgtTlVNXSAtLSBJbnRlcm5hbCB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bworICAgdG9rZW4gWVlMRVgtTlVNLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5dG9rbnVtW10gPQoreworICAgICAgIDAsICAgMjU2LCAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNjEsICAgMjYyLCAgIDI2MywgICAyNjQsCisgICAgIDI2NSwgICAyNjYsICAgMjY3LCAgIDI2OCwgICAyNjksICAgMjcwLCAgIDI3MSwgICAyNzIsICAgMjczLCAgIDI3NCwKKyAgICAgMjc1LCAgIDI3NiwgICAyNzcsICAgMjc4LCAgIDI3OSwgICAyODAsICAgMjgxLCAgIDI4MiwgICAyODMsICAgMjg0LAorICAgICAyODUsICAgMjg2LCAgIDI4NywgICAyODgsICAgMjg5LCAgIDI5MCwgICAyOTEsICAgMjkyLCAgIDI5MywgICAyOTQsCisgICAgIDI5NSwgICAyOTYsICAgMjk3LCAgIDI5OCwgICAyOTksICAgMzAwLCAgIDMwMSwgICAzMDIsICAgMzAzLCAgIDMwNCwKKyAgICAgMzA1LCAgIDMwNiwgICAzMDcsICAgMzA4LCAgIDMwOSwgICAzMTAsICAgMzExLCAgIDMxMiwgICAzMTMsICAgMzE0LAorICAgICAzMTUsICAgMzE2LCAgIDMxNywgICAzMTgsICAgMzE5LCAgIDMyMCwgICAzMjEsICAgMzIyLCAgIDMyMywgICAzMjQsCisgICAgIDMyNSwgICAzMjYsICAgMzI3LCAgIDMyOCwgICAzMjksICAgMzMwLCAgIDMzMSwgICAzMzIsICAgMzMzLCAgIDMzNCwKKyAgICAgMzM1LCAgIDMzNiwgICAzMzcsICAgMzM4LCAgIDMzOSwgICAzNDAsICAgMzQxLCAgIDM0MiwgICAzNDMsICAgMzQ0LAorICAgICAzNDUsICAgMzQ2LCAgIDM0NywgICAzNDgsICAgMzQ5LCAgIDM1MCwgICAzNTEsICAgMzUyLCAgIDM1MywgICAzNTQsCisgICAgIDM1NSwgICAzNTYsICAgMzU3LCAgIDM1OCwgICAzNTksICAgMzYwLCAgIDM2MSwgICAzNjIsICAgIDU5LCAgICA0NCwKKyAgICAgMTI0LCAgICA5MSwgICAgOTMsICAgIDQzLCAgICA0NSwgICAgNDAsICAgIDQxLCAgICA2MSwgICAxMjMsICAgMTI1Cit9OworIyBlbmRpZgorCisvKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cjFbXSA9Cit7CisgICAgICAgMCwgICAxMjAsICAgMTIxLCAgIDEyMiwgICAxMjIsICAgMTIzLCAgIDEyMywgICAxMjQsICAgMTI1LCAgIDEyNSwKKyAgICAgMTI2LCAgIDEyNiwgICAxMjcsICAgMTI3LCAgIDEyOCwgICAxMjgsICAgMTI4LCAgIDEyOCwgICAxMjgsICAgMTI4LAorICAgICAxMjgsICAgMTI5LCAgIDEyOSwgICAxMjksICAgMTMwLCAgIDEzMSwgICAxMzIsICAgMTMzLCAgIDEzNCwgICAxMzUsCisgICAgIDEzNiwgICAxMzcsICAgMTM3LCAgIDEzOCwgICAxMzksICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQwLCAgIDE0MCwKKyAgICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQwLCAgIDE0MSwgICAxNDIsICAgMTQyLAorICAgICAxNDMsICAgMTQzLCAgIDE0NCwgICAxNDQsICAgMTQ1LCAgIDE0NiwgICAxNDcsICAgMTQ4LCAgIDE0OSwgICAxNDksCisgICAgIDE1MCwgICAxNTAsICAgMTUwLCAgIDE1MCwgICAxNTEsICAgMTUxLCAgIDE1MiwgICAxNTMsICAgMTUzLCAgIDE1NCwKKyAgICAgMTU1LCAgIDE1NiwgICAxNTYsICAgMTU2LCAgIDE1NywgICAxNTgsICAgMTU5LCAgIDE2MCwgICAxNjEsICAgMTYyLAorICAgICAxNjMsICAgMTYzLCAgIDE2MywgICAxNjMsICAgMTY0LCAgIDE2NCwgICAxNjQsICAgMTY0LCAgIDE2NCwgICAxNjUsCisgICAgIDE2NSwgICAxNjUsICAgMTY2LCAgIDE2NywgICAxNjgsICAgMTY5LCAgIDE3MCwgICAxNzAsICAgMTcwLCAgIDE3MCwKKyAgICAgMTcwLCAgIDE3MCwgICAxNzEsICAgMTcyLCAgIDE3MiwgICAxNzMsICAgMTczLCAgIDE3MywgICAxNzMsICAgMTczLAorICAgICAxNzMsICAgMTczLCAgIDE3MywgICAxNzQsICAgMTc1LCAgIDE3NSwgICAxNzYsICAgMTc3LCAgIDE3NywgICAxNzcsCisgICAgIDE3NywgICAxNzgsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMTgxLCAgIDE4MSwgICAxODIsICAgMTgzLCAgIDE4NCwKKyAgICAgMTg0LCAgIDE4NSwgICAxODUsICAgMTg1LCAgIDE4NiwgICAxODYsICAgMTg2LCAgIDE4NywgICAxODcsICAgMTg3LAorICAgICAxODgsICAgMTg4LCAgIDE4OSwgICAxODksICAgMTg5LCAgIDE4OSwgICAxODksICAgMTg5LCAgIDE4OSwgICAxODksCisgICAgIDE4OSwgICAxODksICAgMTg5LCAgIDE5MCwgICAxOTEsICAgMTkxLCAgIDE5MSwgICAxOTIsICAgMTkzLCAgIDE5MywKKyAgICAgMTkzLCAgIDE5MywgICAxOTMsICAgMTk0LCAgIDE5NSwgICAxOTYsICAgMTk2LCAgIDE5NywgICAxOTgsICAgMTk5LAorICAgICAyMDAsICAgMjAxLCAgIDIwMSwgICAyMDEsICAgMjAyLCAgIDIwMywgICAyMDQsICAgMjA0LCAgIDIwNSwgICAyMDUsCisgICAgIDIwNSwgICAyMDUsICAgMjA2LCAgIDIwNywgICAyMDcsICAgMjA4LCAgIDIwOSwgICAyMTAsICAgMjExLCAgIDIxMSwKKyAgICAgMjEyLCAgIDIxMywgICAyMTQsICAgMjE0LCAgIDIxNSwgICAyMTYsICAgMjE2LCAgIDIxNywgICAyMTcsICAgMjE3LAorICAgICAyMTgsICAgMjE5LCAgIDIxOSwgICAyMTksICAgMjE5LCAgIDIxOSwgICAyMTksICAgMjIwLCAgIDIyMCwgICAyMjEsCisgICAgIDIyMiwgICAyMjMsICAgMjI0LCAgIDIyNSwgICAyMjUsICAgMjI2LCAgIDIyNiwgICAyMjcsICAgMjI4LCAgIDIyOCwKKyAgICAgMjI5LCAgIDIzMCwgICAyMzEsICAgMjMxLCAgIDIzMiwgICAyMzMsICAgMjM0LCAgIDIzNSwgICAyMzUsICAgMjM2LAorICAgICAyMzYsICAgMjM3LCAgIDIzOCwgICAyMzgsICAgMjM5LCAgIDIzOSwgICAyMzksICAgMjM5LCAgIDI0MCwgICAyNDAsCisgICAgIDI0MSwgICAyNDEsICAgMjQxLCAgIDI0MywgICAyNDIsICAgMjQ0LCAgIDI0NCwgICAyNDYsICAgMjQ1LCAgIDI0NywKKyAgICAgMjQ3LCAgIDI0OCwgICAyNDksICAgMjQ5LCAgIDI0OSwgICAyNDksICAgMjQ5LCAgIDI0OSwgICAyNTAsICAgMjUxLAorICAgICAyNTEsICAgMjUxLCAgIDI1MSwgICAyNTIsICAgMjUyLCAgIDI1MiwgICAyNTMsICAgMjUzLCAgIDI1MywgICAyNTQsCisgICAgIDI1NCwgICAyNTQsICAgMjU1LCAgIDI1NSwgICAyNTYsICAgMjU2LCAgIDI1NywgICAyNTcsICAgMjU4LCAgIDI1OSwKKyAgICAgMjYwLCAgIDI2MSwgICAyNjIsICAgMjYyCit9OworCisvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjJbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICA0LCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDMsICAgICAyLCAgICAgMCwKKyAgICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICA0LCAgICAgNCwgICAgIDQsICAgICA2LCAgICAgNiwgICAgIDgsCisgICAgICAgOCwgICAgIDIsICAgICAyLCAgICAxMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNiwgICAgIDIsICAgICA0LAorICAgICAgIDIsICAgICAxLCAgICAgMywgICAgIDUsICAgICAzLCAgICAgMiwgICAgIDcsICAgICAyLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICA0LCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAzLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMCwgICAgIDMsCisgICAgICAgMywgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDQsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAxLAorICAgICAgIDIsICAgICA0LCAgICAgNCwgICAgIDEsICAgICAwLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsCisgICAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDYsICAgICAwLCAgICAgMSwgICAgIDIsICAgICA0LCAgICAgMSwKKyAgICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDUsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgNiwgICAgIDEsICAgICAzLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICA1LCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwKKyAgICAgICA1LCAgICAgMiwgICAgIDAsICAgICA2LCAgICAgMywgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgNCwgICAgIDQsICAgICAwLCAgICAgMywgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDUsICAgICAxLCAgICAgMywKKyAgICAgICA1LCAgICAgNSwgICAgIDEsICAgICAzLCAgICAgNSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgNSwgICAgIDcsICAgICA5LCAgICAgMiwgICAgIDIsCisgICAgICAgMSwgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDQsICAgICAxLCAgICAgMCwgICAgIDAsICAgICAzLCAgICAgMywKKyAgICAgICAxLCAgICAgNSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDMsICAgICAwLAorICAgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDAsCisgICAgICAgMSwgICAgIDEsICAgICAwLCAgICAgMywgICAgIDAsICAgICAzLCAgICAgMCwgICAgIDMsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgNCwgICAgIDEsICAgICAxCit9OworCisvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJlZHVjdGlvbiBudW1iZXIgaW4gc3RhdGUgU1RBVEUtTlVNLgorICAgUGVyZm9ybWVkIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCisgICBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbiBlcnJvci4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eWRlZmFjdFtdID0KK3sKKyAgICAgICAwLCAgICAgMywgICAgIDQsICAgICAwLCAgICAgNiwgICAgIDEsICAgICA5LCAgICAgMCwgICAgIDUsICAgMjQ2LAorICAgICAyODIsICAgMjgzLCAgICAgMCwgICAyNDcsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAyLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMjQyLCAgICAgMCwgICAgIDAsICAgICA4LCAgICAgMCwKKyAgICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjEsICAgIDIyLAorICAgICAgMjMsICAgIDIwLCAgICAgMCwgICAgOTYsICAgIDk3LCAgIDEyMSwgICAxMjIsICAgIDk4LCAgICAgMCwgICAgOTksCisgICAgIDEwMCwgICAxMDEsICAgMjQ1LCAgICAgNywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA2NSwKKyAgICAgICAwLCAgICA4OCwgICAgNjQsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNzYsICAgICAwLAorICAgICAgIDAsICAgIDk0LCAgIDI0MCwgICAyNDEsICAgIDMxLCAgICAzMiwgICAgODMsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAxMCwgICAgMTEsICAgICAwLCAgIDI0MywgICAyNTAsICAgMjQ4LCAgICAgMCwgICAgIDAsICAgMTI1LCAgIDI0MiwKKyAgICAgMTIzLCAgIDI1OSwgICAyNTcsICAgMjUzLCAgIDI1NSwgICAyNTIsICAgMjcyLCAgIDI1NCwgICAyNDIsICAgIDg0LAorICAgICAgODUsICAgIDg2LCAgICA4NywgICAgOTEsICAgMjQyLCAgIDI0MiwgICAyNDIsICAgMjQyLCAgIDI0MiwgICAyNDIsCisgICAgICA3OCwgICAgNTUsICAgIDgxLCAgICA4MCwgICAgODIsICAgIDkyLCAgIDIzMywgICAyMzIsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgNjAsICAgICAwLCAgIDI0MiwgICAgODMsICAgICAwLCAgICA2MSwgICAgNjMsICAgMTM0LAorICAgICAxMzUsICAgMjEzLCAgIDIxNCwgICAxMzYsICAgMjI5LCAgIDIzMCwgICAgIDAsICAgMjQyLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAyODEsICAgMTAyLCAgIDEyNiwgICAgIDAsICAgMTI3LCAgIDEzMSwgICAxMzIsICAgMTMzLCAgIDIyNywKKyAgICAgMjI4LCAgIDIzMSwgICAgIDAsICAgMjYyLCAgIDI2MSwgICAgIDAsICAgMjYzLCAgICAgMCwgICAyNTYsICAgICAwLAorICAgICAgIDAsICAgIDU0LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNiwgICAgIDAsICAgIDI1LCAgICAyNCwgICAyNjksCisgICAgIDExOSwgICAxMTcsICAgMjcyLCAgIDEwNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgMjY2LCAgICAgMCwgICAyNjYsICAgICAwLCAgICAgMCwgICAyNzYsICAgMjcyLCAgIDE0MiwgICAxNDMsICAgMTQ0LAorICAgICAxNDUsICAgMTQ3LCAgIDE0NiwgICAxNDgsICAgMTQ5LCAgIDE1MCwgICAxNTEsICAgICAwLCAgIDE1MiwgICAyNjksCisgICAgIDEwOSwgICAgIDAsICAgMTA3LCAgIDEwNSwgICAyNzIsICAgICAwLCAgIDExNCwgICAxMDMsICAgIDgzLCAgICAgMCwKKyAgICAgIDUyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAyNDQsICAgMjQ5LCAgICAgMCwgICAyMzksICAgMjM4LAorICAgICAgIDAsICAgMjY0LCAgIDI2NSwgICAyNTgsICAgMjc4LCAgICAgMCwgICAyNDIsICAgIDk1LCAgICAgMCwgICAgIDAsCisgICAgICA4MywgICAyNDIsICAgICAwLCAgICA0OCwgICAgIDAsICAgIDUxLCAgICAgMCwgICAyNDIsICAgMjcwLCAgIDI3MSwKKyAgICAgMTE4LCAgIDEyMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAyMTIsICAgMTgzLCAgIDE4NCwgICAxODIsICAgICAwLAorICAgICAxNjUsICAgMjY4LCAgIDI2NywgICAxNjQsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDIwNywgICAyMDMsCisgICAgICAgMCwgICAyMDIsICAgMjcyLCAgIDE5NSwgICAxODksICAgMTg4LCAgIDE4NywgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgIDEwOCwgICAgIDAsICAgMTEwLCAgICAgMCwgICAgIDAsICAgMTA2LCAgICAgMCwgICAyNDIsICAgMjM0LAorICAgICAgNjksICAgICAwLCAgICA2NywgICAgNjgsICAgICAwLCAgIDI0MiwgICAyNDIsICAgMjUxLCAgICAgMCwgICAxMjQsCisgICAgIDI2MCwgICAyNzMsICAgIDI4LCAgICA4OSwgICAgOTAsICAgIDkzLCAgICAyNywgICAgIDAsICAgIDc5LCAgICA1MCwKKyAgICAgMjc0LCAgICAgMCwgICAgIDAsICAgMjI1LCAgICAgMCwgICAyMjYsICAgICAwLCAgIDE4NiwgICAgIDAsICAgMTc0LAorICAgICAgIDAsICAgMTY2LCAgICAgMCwgICAxNzEsICAgMTcyLCAgIDE1NSwgICAxNTYsICAgMTczLCAgIDE1MywgICAxNTQsCisgICAgICAgMCwgICAgIDAsICAgMjAxLCAgICAgMCwgICAyMDQsICAgMTk3LCAgIDE5OSwgICAxOTgsICAgMTk0LCAgIDE5NiwKKyAgICAgMjgwLCAgICAgMCwgICAxNzAsICAgMTY5LCAgIDE3NiwgICAxNzcsICAgICAwLCAgICAgMCwgICAxMTYsICAgICAwLAorICAgICAxMTMsICAgICAwLCAgICAgMCwgICAgNTMsICAgICAwLCAgICA2MiwgICAgNzcsICAgIDcxLCAgICA0NywgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgMjQyLCAgICA0OSwgICAgIDAsICAgIDM0LCAgICAgMCwgICAyNDIsICAgMjIwLCAgIDIyNCwKKyAgICAgICAwLCAgICAgMCwgICAyNjYsICAgMjExLCAgICAgMCwgICAyMDksICAgICAwLCAgIDIxMCwgICAgIDAsICAgMjc3LAorICAgICAxODEsICAgMTgwLCAgIDE3OCwgICAxNzksICAgMTc1LCAgIDIwMCwgICAgIDAsICAgMTExLCAgIDExMiwgICAxMTUsCisgICAgIDI0MiwgICAyMzUsICAgICAwLCAgICAgMCwgICAgNzAsICAgMjQyLCAgICA1OCwgICAgNTcsICAgIDU5LCAgIDI0MiwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgMTI5LCAgIDEzNywgICAxNDAsICAgMTM4LCAgIDIxNSwgICAyMTYsICAgMTM5LAorICAgICAyNzksICAgICAwLCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsCisgICAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgMzAsICAgIDI5LCAgIDE4NSwgICAxNjAsICAgMTYyLCAgIDE1OSwKKyAgICAgICAwLCAgIDE1NywgICAxNTgsICAgICAwLCAgIDIwNiwgICAyMDgsICAgMjA1LCAgIDE5MCwgICAgIDAsICAgIDc0LAorICAgICAgNzIsICAgIDc1LCAgICA3MywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLCAgIDE5MiwgICAyNDIsCisgICAgIDEyOCwgICAyNzUsICAgMTYzLCAgIDE2MSwgICAxNjcsICAgMTY4LCAgIDI0MiwgICAyMzYsICAgMjQyLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgMTkxLCAgIDEzMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMjE4LAorICAgICAgIDAsICAgMjIyLCAgICAgMCwgICAyMzcsICAgMjQyLCAgICAgMCwgICAyMTcsICAgICAwLCAgIDIyMSwgICAgIDAsCisgICAgICAgMCwgICAgNTYsICAgIDMzLCAgIDIxOSwgICAyMjMsICAgICAwLCAgICAgMCwgICAxOTMKK307CisKKy8qIFlZREVGR09UT1tOVEVSTS1OVU1dLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlkZWZnb3RvW10gPQoreworICAgICAgLTEsICAgICAzLCAgICAgNCwgICAgIDYsICAgICA4LCAgICAgOSwgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsCisgICAgICAzMiwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgIDMwMSwKKyAgICAgNDE0LCAgICA0MSwgICAxNjIsICAgMjMzLCAgICA3NCwgICAgNjAsICAgIDY5LCAgIDM0OCwgICAzNDksICAgMzg3LAorICAgICAyMzQsICAgIDYxLCAgIDEyNiwgICAyODEsICAgMjgyLCAgIDI4MywgICAzODQsICAgNDMwLCAgIDQzMiwgICAgNzAsCisgICAgIDM0NywgICAxMTEsICAgMjk5LCAgIDExNSwgICAxMDMsICAgMTYxLCAgICA3NSwgICAyMjksICAgIDc2LCAgIDIzMCwKKyAgICAgIDQyLCAgICA0MywgICAxMjcsICAgMjA3LCAgIDM0MSwgICAyNzYsICAgMzM5LCAgIDE3MywgICAgNDQsICAgIDQ1LAorICAgICAgNDYsICAgMTQ0LCAgICA5MCwgICAyODksICAgMzkyLCAgIDE0NSwgICAxMjgsICAgMzkzLCAgIDM5NCwgICAxMjksCisgICAgIDE4NywgICAzMTgsICAgMTg4LCAgIDQyMSwgICA0NDMsICAgMTg5LCAgIDI1MywgICAxOTAsICAgNDQ0LCAgIDE5MSwKKyAgICAgMzMzLCAgIDMxOSwgICAzMTAsICAgMTkyLCAgIDMzNiwgICAzNzQsICAgMTkzLCAgIDI0OCwgICAxOTQsICAgMzA4LAorICAgICAxOTUsICAgMjY2LCAgIDE5NiwgICA0MzcsICAgNDUzLCAgIDE5NywgICAzMjgsICAgMzI5LCAgIDM3NiwgICAyNjMsCisgICAgIDMyMiwgICAzNjYsICAgMzY4LCAgIDM2NCwgICAxOTgsICAgMTMwLCAgIDM5NiwgICAzOTcsICAgNDU4LCAgIDEzMSwKKyAgICAgMzk4LCAgIDQ2MCwgICAxMzIsICAgMzA0LCAgIDMwNiwgICAzOTksICAgMTMzLCAgIDE0OSwgICAxMzQsICAgMTM1LAorICAgICAxNTEsICAgIDc3LCAgICA0NywgICAxMzksICAgIDQ4LCAgICA0OSwgICAgNTQsICAgIDg1LCAgICA1MCwgICAgNjIsCisgICAgICA5NywgICAxNTYsICAgMjIzLCAgIDI1NCwgICAyNDAsICAgMTU4LCAgIDM1NSwgICAyNjgsICAgMjI1LCAgIDQwMSwKKyAgICAgMzMxLCAgICA1MSwgICAgMTIKK307CisKKy8qIFlZUEFDVFtTVEFURS1OVU1dIC0tIEluZGV4IGluIFlZVEFCTEUgb2YgdGhlIHBvcnRpb24gZGVzY3JpYmluZworICAgU1RBVEUtTlVNLiAgKi8KKyNkZWZpbmUgWVlQQUNUX05JTkYgLTM5OAorc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eXBhY3RbXSA9Cit7CisgICAgICA1MiwgIC0zOTgsICAtMzk4LCAgICAxNCwgIC0zOTgsICAtMzk4LCAgICA2NywgICAxNTIsICAtMzk4LCAgICAyNCwKKyAgICAtMzk4LCAgLTM5OCwgICAgIDUsICAtMzk4LCAgICA0NywgICAgODEsICAgIDk5LCAgLTM5OCwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQzLCAgICA1NiwgICAgLTEsICAgIC0xLCAgLTM5OCwgICAgOTcsCisgICAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgICAxMTIsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgICAxNTYsICAtMzk4LAorICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMTExLCAgICA5OCwgICAxNDEsICAgIDk1LCAgIDEyNywgIC0zOTgsCisgICAgICA4NCwgICAxNDIsICAtMzk4LCAgIDE0NiwgICAxNTAsICAgMTUzLCAgIDE1NywgICAxNTgsICAtMzk4LCAgIDE1OSwKKyAgICAgMTY1LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMTEzLCAgIC0xMywgICAxNjEsICAgMTYzLAorICAgIC0zOTgsICAtMzk4LCAgIDE2MiwgIC0zOTgsICAtMzk4LCAgIDE2NCwgICAxNzQsICAgIDEwLCAgIDI1MiwgICAgLTMsCisgICAgLTM5OCwgICAtMTEsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIDE2NiwgIC0zOTgsICAgLTIwLCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMTY3LCAgIC0yMCwgICAtMjAsICAgLTIwLCAgIC0yMCwgICAtMjAsICAgLTIwLAorICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIDEzNywgICAgNzAsCisgICAgIDEzMiwgICAgODUsICAgMTY4LCAgICAzNCwgICAtMjAsICAgMTEzLCAgIDE2OSwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgIDM0LCAgIC0yMCwgICAxNzEsICAgMTExLAorICAgICAxNzksICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMTcyLCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsCisgICAgLTM5OCwgIC0zOTgsICAgMjE2LCAgLTM5OCwgIC0zOTgsICAgMjUzLCAgICA3NiwgICAyNTgsICAtMzk4LCAgIDE3NiwKKyAgICAgMTU0LCAgLTM5OCwgICAxNzgsICAgIDI5LCAgIDE4MCwgIC0zOTgsICAgMTgxLCAgLTM5OCwgIC0zOTgsICAgMTEwLAorICAgIC0zOTgsICAtMzk4LCAgIDE2NiwgIC0zOTgsICAgMTc1LCAgIDE4MiwgICAxODMsICAgMjE5LCAgICAzMiwgICAxODQsCisgICAgIDE3NywgICAxODYsICAgIDk0LCAgIDE0MCwgICAgIDcsICAgMTg3LCAgIDE2NiwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIDIyNiwgIC0zOTgsICAgMTEwLAorICAgIC0zOTgsICAgMTg4LCAgLTM5OCwgIC0zOTgsICAgMTY2LCAgIDE4OSwgICAxOTAsICAtMzk4LCAgIDExMywgICAgIDksCisgICAgLTM5OCwgICAgIDEsICAgMTkzLCAgIDE5NSwgICAyNDAsICAgMTY0LCAgLTM5OCwgICAxOTEsICAtMzk4LCAgLTM5OCwKKyAgICAgMTk0LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgICAxOTcsICAgLTIwLCAgLTM5OCwgICAxOTYsICAgMTk4LAorICAgICAxMTMsICAgLTIwLCAgICAzNCwgIC0zOTgsICAgMjAzLCAgIDIwNiwgICAyMjgsICAgLTIwLCAgLTM5OCwgIC0zOTgsCisgICAgLTM5OCwgIC0zOTgsICAgMjkwLCAgIDI5MiwgICAyOTMsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIDI5NCwKKyAgICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIDI1MSwgICAyOTQsICAgIDQ4LCAgIDIwOCwgICAyMDksICAtMzk4LAorICAgICAyMTAsICAtMzk4LCAgIDE2NiwgICAgMjEsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMjk5LCAgIDI5NSwgICAgMTIsCisgICAgIDIxMiwgIC0zOTgsICAgMzAyLCAgLTM5OCwgICAzMDQsICAgMzAyLCAgLTM5OCwgICAyMTgsICAgLTIwLCAgLTM5OCwKKyAgICAtMzk4LCAgIDIxNywgIC0zOTgsICAtMzk4LCAgIDIyNywgICAtMjAsICAgLTIwLCAgLTM5OCwgICAyMTQsICAtMzk4LAorICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMjIwLCAgLTM5OCwgIC0zOTgsCisgICAgIDIyMiwgICAyMjUsICAgMjI5LCAgLTM5OCwgICAyMjMsICAtMzk4LCAgIDIyNCwgIC0zOTgsICAgMjMwLCAgLTM5OCwKKyAgICAgMjMxLCAgLTM5OCwgICAyMzMsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LAorICAgICAzMTQsICAgMzE2LCAgLTM5OCwgICAzMTcsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsCisgICAgLTM5OCwgICAyMzQsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIDE3MCwgICAzMTgsICAtMzk4LCAgIDIzNSwKKyAgICAtMzk4LCAgIDIzNiwgICAyMzcsICAtMzk4LCAgICA0NCwgIC0zOTgsICAtMzk4LCAgIDE0MywgIC0zOTgsICAgMjQ0LAorICAgICAtMTUsICAgMjQ1LCAgICAzNiwgIC0zOTgsICAgMzMyLCAgLTM5OCwgICAxMzgsICAgLTIwLCAgLTM5OCwgIC0zOTgsCisgICAgIDMwMSwgICAxMDEsICAgIDk0LCAgLTM5OCwgICAyNDgsICAtMzk4LCAgIDI0OSwgIC0zOTgsICAgMjUwLCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMjU0LCAgLTM5OCwgIC0zOTgsICAtMzk4LAorICAgICAtMjAsICAtMzk4LCAgIDMzMywgICAzNDAsICAtMzk4LCAgIC0yMCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgICAtMjAsCisgICAgIDEwMiwgICAxMzIsICAgIDc1LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgIDI1NSwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LAorICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsCisgICAgIDMzNiwgIC0zOTgsICAtMzk4LCAgICA0OSwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgIDkwLCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMjU2LCAgIDI2MCwgICAyNTksICAgMjYxLCAgLTM5OCwgICAyOTgsICAgIDM2LAorICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgICAtMjAsICAtMzk4LCAgIC0yMCwgICAyMjgsCisgICAgIDI5MCwgICAyOTIsICAgMjYyLCAgLTM5OCwgIC0zOTgsICAgMjU3LCAgIDI2NSwgICAyNjgsICAgMjY2LCAgIDI3MywKKyAgICAgMjY5LCAgIDI3NCwgICAzMTgsICAtMzk4LCAgIC0yMCwgICAxMzgsICAtMzk4LCAgIDI5MCwgIC0zOTgsICAgMjkyLAorICAgICAxMDcsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIDMxOCwgICAyNzAsICAtMzk4Cit9OworCisvKiBZWVBHT1RPW05URVJNLU5VTV0uICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eXBnb3RvW10gPQoreworICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsCisgICAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgIC03OCwKKyAgICAgLTgyLCAgLTM5OCwgIC0xMDAsICAgMTU1LCAgIC04NiwgICAyMTUsICAtMzk4LCAgLTM5OCwgIC0zNzIsICAtMzk4LAorICAgICAtNTQsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgICAxNzMsCisgICAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTExOCwgIC0zOTgsICAtMzk4LCAgIDIzMiwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgICAzMDMsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMTE0LCAgLTM5OCwgIC0zOTgsICAtMzk4LAorICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgLTUzLCAgLTM5OCwgICAtODgsCisgICAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgLTMzNCwgICAxMzAsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LAorICAgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgICAgMCwgIC0zOTgsICAtMzk4LCAgLTM5NywgIC0zOTgsCisgICAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMzA1LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgIC0zOTgsICAtMzk2LCAgLTM4MywgICAzMDYsICAtMzk4LCAgLTM5OCwgIC0xMzcsICAgLTg3LAorICAgIC0xMjAsICAgLTg5LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwgIC0zOTgsICAgMjYzLCAgLTM5OCwgICAxODUsCisgICAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTE3NywgICAxOTksICAtMTU0LCAgLTM5OCwgIC0zOTgsICAtMzk4LCAgLTM5OCwKKyAgICAtMzk4LCAgLTM5OCwgICAgLTYKK307CisKKy8qIFlZVEFCTEVbWVlQQUNUW1NUQVRFLU5VTV1dLiAgV2hhdCB0byBkbyBpbiBzdGF0ZSBTVEFURS1OVU0uICBJZgorICAgcG9zaXRpdmUsIHNoaWZ0IHRoYXQgdG9rZW4uICBJZiBuZWdhdGl2ZSwgcmVkdWNlIHRoZSBydWxlIHdoaWNoCisgICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgWVlUQUJMRV9OSU5GLCBzeW50YXggZXJyb3IuICAqLworI2RlZmluZSBZWVRBQkxFX05JTkYgLTIzMAorc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eXRhYmxlW10gPQoreworICAgICAxNTIsICAgMTQ2LCAgIDE1MCwgICAgNTIsICAgMjA5LCAgIDI1NiwgICAxNjUsICAgMjEwLCAgIDM4NiwgICAxNjgsCisgICAgIDExNiwgICAxMTcsICAgMTU5LCAgIDQzMywgICAgIDUsICAgMTYzLCAgIDE1MywgICAxNjMsICAgMjQxLCAgIDE2NCwKKyAgICAgMTYzLCAgIDE2NiwgICAxNjcsICAgMTI1LCAgIDI4MCwgICAxMTgsICAgMjM1LCAgIDQyMiwgICAxNTQsICAgIDEzLAorICAgICAgMTQsICAgIDE1LCAgIDI2OSwgICAyNjQsICAgIDE2LCAgIDE1MiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsCisgICAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAzMzQsICAgMTE4LCAgIDExOSwKKyAgICAgMjczLCAgIDIxMywgICAxMTYsICAgMTE3LCAgIDQ1OSwgICAgIDEsICAgICAyLCAgIDExNiwgICAxMTcsICAgMTE5LAorICAgICAxMjAsICAgMjQ2LCAgIDMyNSwgICAzMjYsICAgIDU4LCAgIDQ3MCwgICAzMzUsICAgMTE4LCAgIDQ2MSwgICAyMDgsCisgICAgIDEyMCwgICA0NzMsICAgMTE4LCAgIDMxMywgICAzMTMsICAgICA3LCAgIDQ1NiwgICAyNjUsICAgNDc2LCAgIDMxNCwKKyAgICAgMzE0LCAgIDMxNSwgICAyMTIsICAgMTIxLCAgICAxMCwgICAgMTEsICAgNDc0LCAgIDEyMiwgICAyNDcsICAgNDQ1LAorICAgICAyNzcsICAgMTE5LCAgIDQ3MSwgICAgNzIsICAgIDczLCAgIDIzNSwgICAxMTksICAgMTIzLCAgIDM5MCwgICAgNTksCisgICAgIDE1NSwgICAgNjgsICAgMTIwLCAgIDMyNywgICAxNzQsICAgMTI0LCAgIDEyMSwgICAxMjAsICAgMzI0LCAgIDM5MSwKKyAgICAgIDcyLCAgICA3MywgICAyOTUsICAgIDUzLCAgIDE5OSwgICAxMjQsICAgMTc1LCAgIDMxNiwgICAyNzgsICAgMzE3LAorICAgICAzMTcsICAgMjUxLCAgIDIwMCwgICAgMTAsICAgIDExLCAgIDEyMSwgICAzMTMsICAgNDE3LCAgIDI3OSwgICAxMjIsCisgICAgIDEyMSwgICAyOTYsICAgMzE0LCAgIDI1MiwgICAxMjIsICAgMjAxLCAgIDQzNSwgICAyMjEsICAgMjAyLCAgIDIzMiwKKyAgICAgMjkyLCAgIDQxOCwgICAxNjMsICAgIDY4LCAgIDIyMiwgICAyMDMsICAgIDU1LCAgIDEyNCwgICA0MzYsICAgIDcyLAorICAgICAgNzMsICAgMzAyLCAgIDEyNCwgICAzODAsICAgMTI0LCAgICA3MSwgICAgOTEsICAgIDkyLCAgIDM0NCwgICAyMDQsCisgICAgIDE3NiwgICA0MTksICAgMTc3LCAgIDM4MSwgICAgOTMsICAgIDgyLCAgIDE2OSwgICAgODMsICAgMTc4LCAgICA3MiwKKyAgICAgIDczLCAgIDIzOCwgICAzMTcsICAgNDIwLCAgIDE3MCwgICAxNzksICAgMTgwLCAgIDE4MSwgICAyMzksICAgMTgyLAorICAgICAgNTYsICAgMTgzLCAgIDIwNSwgICAyMDYsICAgNDM5LCAgIDQyMywgICAgOTQsICAgIDk1LCAgIDI1NywgICAxNTIsCisgICAgIDE4NCwgICAyNTgsICAgMjU5LCAgICA5OCwgICA0NDAsICAgMjYwLCAgIDM1MCwgICAxNzEsICAgIDU3LCAgIDQ0NiwKKyAgICAgMzUxLCAgICA5NiwgICAyNTAsICAgMjYxLCAgIDI1MSwgICAgODAsICAgIDg4LCAgIDE4NSwgICAxODYsICAgNDQ3LAorICAgICAgODQsICAgMTcyLCAgICA4OSwgICA0NzUsICAgMTEyLCAgICA4NiwgICAyNTIsICAgMTEzLCAgIDExNCwgICA0MjcsCisgICAgICA4MSwgICAyNjIsICAgNDAyLCAgIDQwMywgICA0MDQsICAgNDA1LCAgIDQwNiwgICA0MDcsICAgNDA4LCAgIDQwOSwKKyAgICAgNDEwLCAgIDQxMSwgICA0MTIsICAgNDEzLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjcsICAgMjE4LAorICAgICAyMTksICAgIDc4LCAgICA3OSwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMzcwLCAgIDM3MSwgICAzNzIsCisgICAgIDM3MywgICAgMTAsICAgIDExLCAgICA3MSwgICAyMjcsICAgMTA0LCAgIDM4MiwgICAzODMsICAgIDg3LCAgIDEwNSwKKyAgICAgNDI4LCAgIDEzOCwgICAxMDYsICAgMTUyLCAgIDM5NSwgICAxNTAsICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLAorICAgICAxMzYsICAgNDE1LCAgIDEzNywgICAxNDAsICAgMTQxLCAgIDE0MywgICAyMjAsICAgMTU3LCAgIDIxNiwgICAtNjYsCisgICAgIDIxMSwgICAyMjQsICAgMTYwLCAgIDI0NSwgICAyMTcsICAgMjI2LCAgIDI0MiwgICAyMzEsICAgMjE0LCAgIDIzNiwKKyAgICAgMjM3LCAgIDE1MiwgICAyNzAsICAgMjQzLCAgIDI0NCwgICAyNDksICAgMzUwLCAgIDI1NSwgICAyNjcsICAgMjcyLAorICAgICAyNzQsICAgMjc1LCAgIDI4NSwgICA0MzQsICAgMjg2LCAgICA1OCwgICAyOTAsICAgMjk4LCAgIDI4OCwgICAyOTEsCisgICAgLTIyOSwgICAzMDAsICAgMjkzLCAgIDMwMywgICAyOTQsICAgMzA1LCAgIDMwNywgICAzMDksICAgMzExLCAgIDMyMCwKKyAgICAgMzIxLCAgIDMyMywgICAzMzAsICAgMzM3LCAgIDMzMiwgICAzMzgsICAgNDU1LCAgIDM0MCwgICAzNDMsICAgMzQ1LAorICAgICAzNTMsICAgMzQ2LCAgIDM1MiwgICAzNTQsICAgMzU2LCAgIDM1OCwgICAzNTksICAgMzYzLCAgIDM1NywgICAzNjUsCisgICAgIDM2NywgICAzNzUsICAgMzYwLCAgIDM2MSwgICAzODgsICAgMzYyLCAgIDM2OSwgICAzNzcsICAgMzc4LCAgIDM3OSwKKyAgICAgMTUyLCAgIDM5NSwgICAxNTAsICAgMzg1LCAgIDM4OSwgICA0MDAsICAgNDI5LCAgIDE1MiwgICA0MTYsICAgMzUwLAorICAgICA0MjQsICAgNDI1LCAgIDQyNiwgICA0MzEsICAgNDUyLCAgIDQ0OCwgICA0MjcsICAgNDQxLCAgIDQ0MiwgICA0NDksCisgICAgIDQ1MCwgICA0NTcsICAgNDUxLCAgIDQ2MiwgICA0NjQsICAgMzUwLCAgIDQ2MywgICA0NjUsICAgNDY2LCAgIDQ2NywKKyAgICAgNDY5LCAgIDQ2OCwgICA0NzcsICAgNDcyLCAgIDI4NCwgICAzMTIsICAgNDU0LCAgIDI5NywgICAgIDAsICAgMzQyLAorICAgICAxNDIsICAgNDM4LCAgIDIyOCwgICAgIDAsICAgMTQ3LCAgIDE0OCwgICAgIDAsICAgICAwLCAgIDI3MSwgICAyODcsCisgICAgICAgMCwgICAgIDAsICAgMjE1Cit9OworCisjZGVmaW5lIHl5cGFjdF92YWx1ZV9pc19kZWZhdWx0KFl5c3RhdGUpIFwKKyAgKCEhKChZeXN0YXRlKSA9PSAoLTM5OCkpKQorCisjZGVmaW5lIHl5dGFibGVfdmFsdWVfaXNfZXJyb3IoWXl0YWJsZV92YWx1ZSkgXAorICBZWUlEICgwKQorCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5Y2hlY2tbXSA9Cit7CisgICAgICA4OSwgICAgODksICAgIDg5LCAgICAgOSwgICAxMjQsICAgMTgyLCAgIDEwNiwgICAxMjUsICAgIDIzLCAgIDEwOSwKKyAgICAgIDIzLCAgICAyNCwgICAgOTgsICAgMzg1LCAgICAgMCwgICAxMDQsICAgIDI3LCAgIDEwNiwgICAxNzIsICAgMTA1LAorICAgICAxMDksICAgMTA3LCAgIDEwOCwgICAgNzcsICAgIDIzLCAgICAzOCwgICAxNjMsICAgMzYxLCAgICAzOSwgICAgIDUsCisgICAgICAgNiwgICAgIDcsICAgMTg2LCAgICAyNiwgICAgMTAsICAgMTI0LCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKKyAgICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAzNSwgICAgMzgsICAgIDYyLAorICAgICAyMDQsICAgMTM3LCAgICAyMywgICAgMjQsICAgNDUwLCAgICAgMywgICAgIDQsICAgIDIzLCAgICAyNCwgICAgNjIsCisgICAgICA3MywgICAgMjksICAgIDQxLCAgICA0MiwgICAgNjUsICAgNDYyLCAgICA1NCwgICAgMzgsICAgNDUxLCAgIDEyMywKKyAgICAgIDczLCAgIDQ2NywgICAgMzgsICAgIDI1LCAgICAyNSwgICAgIDgsICAgNDQ4LCAgICA3MCwgICA0NzUsICAgIDMxLAorICAgICAgMzEsICAgIDMzLCAgIDEzNiwgICAgOTYsICAgIDk5LCAgIDEwMCwgICA0NjksICAgMTAwLCAgICA1NiwgICA0MjMsCisgICAgIDIwOCwgICAgNjIsICAgNDY0LCAgIDExMywgICAxMTQsICAgMjMyLCAgICA2MiwgICAxMTAsICAgIDYyLCAgIDEwMCwKKyAgICAgMTExLCAgIDEwMCwgICAgNzMsICAgIDgyLCAgICAzNCwgICAxMTgsICAgIDk2LCAgICA3MywgICAyNjIsICAgIDczLAorICAgICAxMTMsICAgMTE0LCAgIDIzMCwgICAxMDgsICAgIDI5LCAgIDExOCwgICAgNDYsICAgIDY5LCAgIDEwOSwgICAgNzEsCisgICAgICA3MSwgICAgMjcsICAgIDM3LCAgICA5OSwgICAxMDAsICAgIDk2LCAgICAyNSwgICAgMjYsICAgMTE5LCAgIDEwMCwKKyAgICAgIDk2LCAgIDIzMSwgICAgMzEsICAgIDM5LCAgIDEwMCwgICAgNTAsICAgIDM0LCAgICA2MSwgICAgNTMsICAgMTEwLAorICAgICAyMjYsICAgIDQwLCAgIDIzMSwgICAxMDAsICAgIDY4LCAgICA2MCwgICAgOTksICAgMTE4LCAgICA0NiwgICAxMTMsCisgICAgIDExNCwgICAyMzcsICAgMTE4LCAgIDEwOSwgICAxMTgsICAgIDk5LCAgICAyOSwgICAgMzAsICAgMjc4LCAgICA3NCwKKyAgICAgIDI4LCAgICA2MCwgICAgMzAsICAgMTE5LCAgICAzNywgICAgIDksICAgIDI5LCAgICAxMSwgICAgMzYsICAgMTEzLAorICAgICAxMTQsICAgIDYxLCAgICA3MSwgICAgNzIsICAgIDM3LCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA2OCwgICAgNDcsCisgICAgICA5OSwgICAgNDksICAgIDk3LCAgICA5OCwgICAxMDksICAgMzYyLCAgICA1OSwgICAgNjAsICAgIDQ4LCAgIDI3OCwKKyAgICAgIDU4LCAgICA1MSwgICAgNTIsICAgMTA5LCAgIDExOSwgICAgNTUsICAgMjg1LCAgICA2MCwgICAgOTksICAgMTA5LAorICAgICAyODYsICAgIDc0LCAgICAyNSwgICAgNjMsICAgIDI3LCAgIDEwOCwgICAxMTEsICAgIDc1LCAgICA3NiwgICAxMTksCisgICAgICA5OSwgICAgNzQsICAgMTE3LCAgIDEwNiwgICAxMDEsICAgMTE3LCAgICAzOSwgICAxMDQsICAgMTA1LCAgIDExMiwKKyAgICAgMTA4LCAgICA4MSwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLAorICAgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjMsCisgICAgICAyNCwgICAgMjYsICAgIDI3LCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAgNzcsICAgIDc4LCAgICA3OSwKKyAgICAgIDgwLCAgICA5OSwgICAxMDAsICAgIDk5LCAgIDEwMCwgICAxMDksICAgMTEzLCAgIDExNCwgICAxMTcsICAgMTA5LAorICAgICAzODAsICAgIDk5LCAgIDEwOSwgICAzNTIsICAgMzUyLCAgIDM1MiwgICAxMDksICAgMTA5LCAgIDEwOSwgICAxMDQsCisgICAgIDEwOSwgICAzNTcsICAgMTA5LCAgIDEwOSwgICAxMDAsICAgIDIzLCAgICAyMywgICAxMTEsICAgIDk5LCAgIDExMSwKKyAgICAgMTExLCAgICAyMywgICAxMTUsICAgIDY0LCAgIDExMiwgICAxMDksICAgMTExLCAgIDEwOSwgICAxMTcsICAgMTA5LAorICAgICAxMDksICAgMzgwLCAgICA2NiwgICAxMTEsICAgMTExLCAgIDExMSwgICAzODUsICAgMTExLCAgIDExMSwgICAxMTEsCisgICAgIDExMSwgICAxMTEsICAgMTA5LCAgIDM4OSwgICAxMDksICAgIDY1LCAgIDExMiwgICAxMDQsICAgMTE3LCAgIDExMiwKKyAgICAgMTA0LCAgICA4MywgICAxMTYsICAgIDIzLCAgIDExNiwgICAgMjMsICAgIDIzLCAgICAyMywgICAgNjcsICAgMTExLAorICAgICAxMTEsICAgMTExLCAgICAyMywgICAxMTEsICAgIDI5LCAgICAyMywgICA0NDYsICAgIDIzLCAgIDExMCwgICAxMTIsCisgICAgIDExMCwgICAxMDQsICAgMTE4LCAgIDExMSwgICAxMDksICAgMTEyLCAgIDExMiwgICAgMjMsICAgMTA5LCAgICAyMywKKyAgICAgIDIzLCAgICAyMywgICAxMTIsICAgMTEyLCAgIDM1MCwgICAxMTIsICAgMTEyLCAgIDExMiwgICAxMTIsICAgMTEyLAorICAgICA0MzksICAgNDM5LCAgIDQzOSwgICAxMDksICAgMTA5LCAgICAyMywgICAgMjMsICAgNDQ2LCAgICA1NywgICA0NDgsCisgICAgIDExMiwgICAxMTIsICAgMTEyLCAgICAyMywgICAgNjYsICAgMTA5LCAgIDExMiwgICAxMTIsICAgIDMyLCAgIDEwOSwKKyAgICAgMTExLCAgIDQ0OSwgICAxMTEsICAgMTExLCAgIDEwOSwgICA0NjQsICAgMTE5LCAgIDEwOSwgICAxMTIsICAgMTA2LAorICAgICAxMDYsICAgMTEyLCAgIDExMiwgICA0NjUsICAgMjExLCAgIDI1NSwgICA0MzksICAgMjMyLCAgICAtMSwgICAyNzUsCisgICAgICA4NywgICAzOTEsICAgMTYwLCAgICAtMSwgICAgODksICAgIDg5LCAgICAtMSwgICAgLTEsICAgMTk5LCAgIDIxNCwKKyAgICAgIC0xLCAgICAtMSwgICAxMzkKK307CisKKy8qIFlZU1RPU1tTVEFURS1OVU1dIC0tIFRoZSAoaW50ZXJuYWwgbnVtYmVyIG9mIHRoZSkgYWNjZXNzaW5nCisgICBzeW1ib2wgb2Ygc3RhdGUgU1RBVEUtTlVNLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5c3Rvc1tdID0KK3sKKyAgICAgICAwLCAgICAgMywgICAgIDQsICAgMTIxLCAgIDEyMiwgICAgIDAsICAgMTIzLCAgICAgOCwgICAxMjQsICAgMTI1LAorICAgICAgOTksICAgMTAwLCAgIDI2MiwgICAgIDUsICAgICA2LCAgICAgNywgICAgMTAsICAgIDEyLCAgICAxMywgICAgMTQsCisgICAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgMTI2LCAgIDEyNywKKyAgICAgMTI4LCAgIDEyOSwgICAxMzAsICAgMTMxLCAgIDEzMiwgICAxMzMsICAgMTM0LCAgIDEzNSwgICAxMzYsICAgMTM3LAorICAgICAxMzgsICAgMTQxLCAgIDE3MCwgICAxNzEsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMjQyLCAgIDI0NCwgICAyNDUsCisgICAgIDI0OCwgICAyNjEsICAgMjYyLCAgIDEwOCwgICAyNDYsICAgIDk5LCAgICA5OSwgICAgOTksICAgIDY1LCAgIDEwMCwKKyAgICAgMTQ1LCAgIDE1MSwgICAyNDksICAgMTQ1LCAgIDE0NSwgICAxNDUsICAgMTQ1LCAgIDE0NSwgICAxMDAsICAgMTQ2LAorICAgICAxNTksICAgIDk5LCAgIDExMywgICAxMTQsICAgMTQ0LCAgIDE2NiwgICAxNjgsICAgMjQxLCAgIDE0NSwgICAxNDUsCisgICAgIDEwOCwgICAxMDgsICAgICA5LCAgICAxMSwgICAgOTksICAgMjQ3LCAgIDExNywgICAxMTcsICAgMTExLCAgIDExNywKKyAgICAgMTgyLCAgICAyOSwgICAgMzAsICAgIDM3LCAgICA1OSwgICAgNjAsICAgIDc0LCAgIDI1MCwgICAxMDksICAgMTAxLAorICAgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxNjQsICAgMTA5LCAgIDEwOSwgICAxMDksICAgMTA5LCAgIDEwOSwgICAxMDksCisgICAgIDEwNCwgICAxNjEsICAgMTAxLCAgIDEwNCwgICAxMDUsICAgMTYzLCAgICAyMywgICAgMjQsICAgIDM4LCAgICA2MiwKKyAgICAgIDczLCAgICA5NiwgICAxMDAsICAgMTEwLCAgIDExOCwgICAxNTAsICAgMTUyLCAgIDE3MiwgICAxODYsICAgMTg5LAorICAgICAyMjUsICAgMjI5LCAgIDIzMiwgICAyMzYsICAgMjM4LCAgIDIzOSwgICAxMDksICAgMTA5LCAgICA5OSwgICAyNDMsCisgICAgIDEwOSwgICAxMDAsICAgMTcyLCAgICAyMywgICAxODEsICAgMTg1LCAgIDE4OSwgICAyMjUsICAgMjM1LCAgIDIzNywKKyAgICAgMjM5LCAgIDI0MCwgICAyNDEsICAgIDI3LCAgICAzOSwgICAxMTEsICAgMjUxLCAgIDExMSwgICAyNTUsICAgMTQ0LAorICAgICAxMTUsICAgMTY1LCAgIDE0MiwgICAyNDEsICAgMTQ0LCAgIDE0MiwgICAxNDQsICAgMTQ0LCAgIDE0MiwgICAgMjksCisgICAgICAzNywgICAgNjAsICAgIDc0LCAgIDE3NywgICAgMzQsICAgIDQ2LCAgICAyOCwgICAgMzAsICAgIDM2LCAgICA0MywKKyAgICAgIDQ0LCAgICA0NSwgICAgNDcsICAgIDQ5LCAgICA1OCwgICAgNzUsICAgIDc2LCAgIDE5MCwgICAxOTIsICAgMTk1LAorICAgICAxOTcsICAgMTk5LCAgIDIwMywgICAyMDYsICAgMjA4LCAgIDIxMCwgICAyMTIsICAgMjE1LCAgIDIyNCwgICAgMjksCisgICAgICAzNywgICAgNTAsICAgIDUzLCAgICA2MCwgICAgNzQsICAgIDk3LCAgICA5OCwgICAxNzMsICAgMTUwLCAgIDI0MCwKKyAgICAgMTYzLCAgIDExMSwgICAxNTAsICAgMTQ0LCAgIDExNywgICAyNDcsICAgIDk5LCAgIDExMiwgICAgMjMsICAgIDI0LAorICAgICAgMjMsICAgIDYxLCAgICA2OCwgICAyNTIsICAgIDIzLCAgIDI1OCwgICAxMDksICAgMTAwLCAgIDE2NiwgICAxNjcsCisgICAgIDE2OSwgICAxMDksICAgMTEwLCAgIDE0MywgICAxNTAsICAgMjM4LCAgIDEwOSwgICAxMDksICAgIDYxLCAgICA2OCwKKyAgICAgMjU0LCAgIDI1NSwgICAxMTEsICAgMTExLCAgIDExMSwgICAgNjQsICAgIDI5LCAgICA1NiwgICAyMDcsICAgMTExLAorICAgICAgMjUsICAgIDI3LCAgICAzOSwgICAxOTYsICAgMjUzLCAgIDExMSwgICAyNTMsICAgIDQ4LCAgICA1MSwgICAgNTIsCisgICAgICA1NSwgICAgNjMsICAgIDgxLCAgIDIxOSwgICAgMjYsICAgIDcwLCAgIDIxMSwgICAxMTEsICAgMjU3LCAgIDI1NSwKKyAgICAgIDY2LCAgIDI1NCwgICAxMTEsICAgMjU1LCAgIDExMSwgICAxMTEsICAgMTc1LCAgIDE2MywgICAxMDksICAgMTE5LAorICAgICAgMjMsICAgMTUzLCAgIDE1NCwgICAxNTUsICAgMTU5LCAgIDEwOSwgICAxMDksICAgMjQ5LCAgIDExNywgICAxODMsCisgICAgIDExMiwgICAxMTIsICAgMTQ0LCAgIDExNiwgICAxMTYsICAgMTYzLCAgIDE0MiwgICAxNDMsICAgMTA0LCAgIDE2MiwKKyAgICAgIDgzLCAgIDEzOSwgICAxNDQsICAgIDIzLCAgIDIzMywgICAgMjMsICAgMjM0LCAgICAyMywgICAyMDksICAgIDIzLAorICAgICAyMDIsICAgIDY3LCAgIDIwMiwgICAgMjUsICAgIDMxLCAgICAzMywgICAgNjksICAgIDcxLCAgIDE5MSwgICAyMDEsCisgICAgIDExMSwgICAxMTEsICAgMjIwLCAgIDExMSwgICAyNTUsICAgIDQxLCAgICA0MiwgICAgODIsICAgMjE2LCAgIDIxNywKKyAgICAgIDIzLCAgIDI2MCwgICAgMjksICAgMjAwLCAgICAzNSwgICAgNTQsICAgMjA0LCAgIDExMSwgICAgMjMsICAgMTc2LAorICAgICAgMjMsICAgMTc0LCAgIDE3NiwgICAxMTAsICAgMjQwLCAgIDExMiwgICAxMDQsICAgMTYwLCAgIDE0NywgICAxNDgsCisgICAgIDI0MSwgICAxNDQsICAgMTE4LCAgIDExMCwgICAxMTEsICAgMjU2LCAgIDEwOSwgICAxMDksICAgMTEyLCAgIDExMiwKKyAgICAgMTEyLCAgIDExMiwgICAxMTIsICAgIDIzLCAgIDIyMywgICAgMjMsICAgMjIxLCAgICAyMywgICAyMjIsICAgMTEyLAorICAgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgMjA1LCAgICAyMywgICAyMTgsICAgMTEyLCAgIDExMiwgICAxMTIsCisgICAgIDEwOSwgICAxMTksICAgMTEzLCAgIDExNCwgICAxNTYsICAgMTA5LCAgICAyMywgICAxNDksICAgMjYyLCAgIDEwOSwKKyAgICAgIDYyLCAgICA3MywgICAxODQsICAgMTg3LCAgIDE4OCwgICAxODksICAgMjI2LCAgIDIyNywgICAyMzAsICAgMjM1LAorICAgICAgMjMsICAgMjU5LCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsCisgICAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAxNDAsICAgMTQ0LCAgICA1NywgICAgMjYsICAgIDQwLCAgICA2MCwKKyAgICAgIDcyLCAgIDE5MywgICAyMDEsICAgMjUzLCAgIDExMiwgICAxMTIsICAgMTEyLCAgIDExMiwgICAyNDAsICAgIDIzLAorICAgICAxNTcsICAgIDIzLCAgIDE1OCwgICAxNDgsICAgMTQ0LCAgICAzNCwgICAgNDYsICAgMjEzLCAgIDIxNSwgICAxMDksCisgICAgIDExOSwgICAxMTIsICAgIDMyLCAgIDE5NCwgICAxOTgsICAgMjAxLCAgIDEwOSwgICAxMTksICAgMTA5LCAgIDEwOSwKKyAgICAgMTExLCAgIDExMSwgICAgNjYsICAgMjE0LCAgIDE4NywgICAyNDAsICAgMTQ4LCAgIDEzOSwgICAyMjgsICAgMjMzLAorICAgICAyMzEsICAgMjM0LCAgIDExMSwgICAxMTksICAgMTA5LCAgIDEwOSwgICAxMTIsICAgMTA2LCAgIDExMiwgICAxMDYsCisgICAgIDIxOCwgICAxNDgsICAgMTQwLCAgIDIzMywgICAyMzQsICAgMTA2LCAgIDIxOCwgICAxMTIKK307CisKKyNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKKyNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQorI2RlZmluZSBZWUVNUFRZCQkoLTIpCisjZGVmaW5lIFlZRU9GCQkwCisKKyNkZWZpbmUgWVlBQ0NFUFQJZ290byB5eWFjY2VwdGxhYgorI2RlZmluZSBZWUFCT1JUCQlnb3RvIHl5YWJvcnRsYWIKKyNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycm9ybGFiCisKKworLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseQorICAgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgSG93ZXZlciwKKyAgIFlZRkFJTCBhcHBlYXJzIHRvIGJlIGluIHVzZS4gIE5ldmVydGhlbGVzcywgaXQgaXMgZm9ybWFsbHkgZGVwcmVjYXRlZAorICAgaW4gQmlzb24gMi40LjIncyBORVdTIGVudHJ5LCB3aGVyZSBhIHBsYW4gdG8gcGhhc2UgaXQgb3V0IGlzCisgICBkaXNjdXNzZWQuICAqLworCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorI2lmIGRlZmluZWQgWVlGQUlMCisgIC8qIFRoaXMgaXMgaGVyZSB0byBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIHRoZSBHQ0MgY3BwJ3MKKyAgICAgLVd1bnVzZWQtbWFjcm9zLiAgTm9ybWFsbHkgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhhdCB3YXJuaW5nLCBidXQKKyAgICAgc29tZSB1c2VycyBkbywgYW5kIHdlIHdhbnQgdG8gbWFrZSBpdCBlYXN5IGZvciB1c2VycyB0byByZW1vdmUKKyAgICAgWVlGQUlMIHVzZXMsIHdoaWNoIHdpbGwgcHJvZHVjZSB3YXJuaW5ncyBmcm9tIEJpc29uIDIuNS4gICovCisjZW5kaWYKKworI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCisKKyNkZWZpbmUgWVlCQUNLVVAoVG9rZW4sIFZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoeXljaGFyID09IFlZRU1QVFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB5eWNoYXIgPSAoVG9rZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeXlsdmFsID0gKFZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFlZUE9QU1RBQ0sgKHl5bGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB5eXN0YXRlID0gKnl5c3NwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZ290byB5eWJhY2t1cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHl5ZXJyb3IgKCZ5eWxsb2MsIHN0YXRlLCBZWV8oInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKSk7IFwKKyAgICAgIFlZRVJST1I7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCit3aGlsZSAoWVlJRCAoMCkpCisKKy8qIEVycm9yIHRva2VuIG51bWJlciAqLworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworCisvKiBZWUxMT0NfREVGQVVMVCAtLSBTZXQgQ1VSUkVOVCB0byBzcGFuIGZyb20gUkhTWzFdIHRvIFJIU1tOXS4KKyAgIElmIE4gaXMgMCwgdGhlbiBzZXQgQ1VSUkVOVCB0byB0aGUgZW1wdHkgbG9jYXRpb24gd2hpY2ggZW5kcworICAgdGhlIHByZXZpb3VzIHN5bWJvbDogUkhTWzBdIChhbHdheXMgZGVmaW5lZCkuICAqLworCisjaWZuZGVmIFlZTExPQ19ERUZBVUxUCisjIGRlZmluZSBZWUxMT0NfREVGQVVMVChDdXJyZW50LCBSaHMsIE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoWVlJRCAoTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7ICAgICAgICBcCisgICAgICAgICAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2NvbHVtbjsgICAgICBcCisgICAgICAgICAgKEN1cnJlbnQpLmxhc3RfbGluZSAgICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfbGluZTsgICAgICAgICBcCisgICAgICAgICAgKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfY29sdW1uOyAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IChDdXJyZW50KS5sYXN0X2xpbmUgICA9ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZWVJIU0xPQyAoUmhzLCAwKS5sYXN0X2xpbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBZWVJIU0xPQyAoUmhzLCAwKS5sYXN0X2NvbHVtbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKFlZSUQgKDApKQorI2VuZGlmCisKKyNkZWZpbmUgWVlSSFNMT0MoUmhzLCBLKSAoKFJocylbS10pCisKKworLyogWVlfTE9DQVRJT05fUFJJTlQgLS0gUHJpbnQgdGhlIGxvY2F0aW9uIG9uIHRoZSBzdHJlYW0uCisgICBUaGlzIG1hY3JvIHdhcyBub3QgbWFuZGF0ZWQgb3JpZ2luYWxseTogZGVmaW5lIG9ubHkgaWYgd2Uga25vdworICAgd2Ugd29uJ3QgYnJlYWsgdXNlciBjb2RlOiB3aGVuIHRoZXNlIGFyZSB0aGUgbG9jYXRpb25zIHdlIGtub3cuICAqLworCisjaWZuZGVmIFlZX0xPQ0FUSU9OX1BSSU5UCisjIGlmIGRlZmluZWQgWVlMVFlQRV9JU19UUklWSUFMICYmIFlZTFRZUEVfSVNfVFJJVklBTAorCisvKiBQcmludCAqWVlMT0NQIG9uIFlZTy4gIFByaXZhdGUsIGRvIG5vdCByZWx5IG9uIGl0cyBleGlzdGVuY2UuICovCisKK19fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyB1bnNpZ25lZAoreXlfbG9jYXRpb25fcHJpbnRfIChGSUxFICp5eW8sIFlZTFRZUEUgY29uc3QgKiBjb25zdCB5eWxvY3ApCisjZWxzZQorc3RhdGljIHVuc2lnbmVkCit5eV9sb2NhdGlvbl9wcmludF8gKHl5bywgeXlsb2NwKQorICAgIEZJTEUgKnl5bzsKKyAgICBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NwOworI2VuZGlmCit7CisgIHVuc2lnbmVkIHJlcyA9IDA7CisgIGludCBlbmRfY29sID0gMCAhPSB5eWxvY3AtPmxhc3RfY29sdW1uID8geXlsb2NwLT5sYXN0X2NvbHVtbiAtIDEgOiAwOworICBpZiAoMCA8PSB5eWxvY3AtPmZpcnN0X2xpbmUpCisgICAgeworICAgICAgcmVzICs9IGZwcmludGYgKHl5bywgIiVkIiwgeXlsb2NwLT5maXJzdF9saW5lKTsKKyAgICAgIGlmICgwIDw9IHl5bG9jcC0+Zmlyc3RfY29sdW1uKQorICAgICAgICByZXMgKz0gZnByaW50ZiAoeXlvLCAiLiVkIiwgeXlsb2NwLT5maXJzdF9jb2x1bW4pOworICAgIH0KKyAgaWYgKDAgPD0geXlsb2NwLT5sYXN0X2xpbmUpCisgICAgeworICAgICAgaWYgKHl5bG9jcC0+Zmlyc3RfbGluZSA8IHl5bG9jcC0+bGFzdF9saW5lKQorICAgICAgICB7CisgICAgICAgICAgcmVzICs9IGZwcmludGYgKHl5bywgIi0lZCIsIHl5bG9jcC0+bGFzdF9saW5lKTsKKyAgICAgICAgICBpZiAoMCA8PSBlbmRfY29sKQorICAgICAgICAgICAgcmVzICs9IGZwcmludGYgKHl5bywgIi4lZCIsIGVuZF9jb2wpOworICAgICAgICB9CisgICAgICBlbHNlIGlmICgwIDw9IGVuZF9jb2wgJiYgeXlsb2NwLT5maXJzdF9jb2x1bW4gPCBlbmRfY29sKQorICAgICAgICByZXMgKz0gZnByaW50ZiAoeXlvLCAiLSVkIiwgZW5kX2NvbCk7CisgICAgfQorICByZXR1cm4gcmVzOworIH0KKworIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgICAgICAgICAgXAorICB5eV9sb2NhdGlvbl9wcmludF8gKEZpbGUsICYoTG9jKSkKKworIyBlbHNlCisjICBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKSAoKHZvaWQpIDApCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBZWUxFWCAtLSBjYWxsaW5nIGB5eWxleCcgd2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzLiAgKi8KKyNpZmRlZiBZWUxFWF9QQVJBTQorIyBkZWZpbmUgWVlMRVggeXlsZXggKCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQorI2Vsc2UKKyMgZGVmaW5lIFlZTEVYIHl5bGV4ICgmeXlsdmFsLCAmeXlsbG9jLCBzdGF0ZSkKKyNlbmRpZgorCisvKiBFbmFibGUgZGVidWdnaW5nIGlmIHJlcXVlc3RlZC4gICovCisjaWYgWVlERUJVRworCisjIGlmbmRlZiBZWUZQUklOVEYKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWUZQUklOVEYgZnByaW50ZgorIyBlbmRpZgorCisjIGRlZmluZSBZWURQUklOVEYoQXJncykJCQlcCitkbyB7CQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCVwKKyAgICBZWUZQUklOVEYgQXJnczsJCQkJXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQkJCSAgXAorZG8gewkJCQkJCQkJCSAgXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJCSAgXAorICAgIHsJCQkJCQkJCQkgIFwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQkJICBcCisgICAgICB5eV9zeW1ib2xfcHJpbnQgKHN0ZGVyciwJCQkJCQkgIFwKKwkJICBUeXBlLCBWYWx1ZSwgTG9jYXRpb24sIHN0YXRlKTsgXAorICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwkJCQkJCSAgXAorICAgIH0JCQkJCQkJCQkgIFwKK30gd2hpbGUgKFlZSUQgKDApKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFByaW50IHRoaXMgc3ltYm9sIG9uIFlZT1VUUFVULiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypBUkdTVVNFRCovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF92YWx1ZV9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCwgWVlMVFlQRSBjb25zdCAqIGNvbnN0IHl5bG9jYXRpb25wLCBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUpCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wLCBzdGF0ZSkKKyAgICBGSUxFICp5eW91dHB1dDsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKKyAgICBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnA7CisgICAgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlOworI2VuZGlmCit7CisgIEZJTEUgKnl5byA9IHl5b3V0cHV0OworICBZWVVTRSAoeXlvKTsKKyAgaWYgKCF5eXZhbHVlcCkKKyAgICByZXR1cm47CisgIFlZVVNFICh5eWxvY2F0aW9ucCk7CisgIFlZVVNFIChzdGF0ZSk7CisjIGlmZGVmIFlZUFJJTlQKKyAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKKyAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKKyMgZWxzZQorICBZWVVTRSAoeXlvdXRwdXQpOworIyBlbmRpZgorICBZWVVTRSAoeXl0eXBlKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlfc3ltYm9sX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwLCBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnAsIHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfc3ltYm9sX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCwgeXlsb2NhdGlvbnAsIHN0YXRlKQorICAgIEZJTEUgKnl5b3V0cHV0OworICAgIGludCB5eXR5cGU7CisgICAgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwOworICAgIFlZTFRZUEUgY29uc3QgKiBjb25zdCB5eWxvY2F0aW9ucDsKKyAgICBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGU7CisjZW5kaWYKK3sKKyAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKKyAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAidG9rZW4gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7CisgIGVsc2UKKyAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAibnRlcm0gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7CisKKyAgWVlfTE9DQVRJT05fUFJJTlQgKHl5b3V0cHV0LCAqeXlsb2NhdGlvbnApOworICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiOiAiKTsKKyAgeXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCwgeXlsb2NhdGlvbnAsIHN0YXRlKTsKKyAgWVlGUFJJTlRGICh5eW91dHB1dCwgIikiKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5X3N0YWNrX3ByaW50IC0tIFByaW50IHRoZSBzdGF0ZSBzdGFjayBmcm9tIGl0cyBCT1RUT00gdXAgdG8gaXRzIHwKK3wgVE9QIChpbmNsdWRlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlfc3RhY2tfcHJpbnQgKHl5dHlwZV9pbnQxNiAqeXlib3R0b20sIHl5dHlwZV9pbnQxNiAqeXl0b3ApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3N0YWNrX3ByaW50ICh5eWJvdHRvbSwgeXl0b3ApCisgICAgeXl0eXBlX2ludDE2ICp5eWJvdHRvbTsKKyAgICB5eXR5cGVfaW50MTYgKnl5dG9wOworI2VuZGlmCit7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7CisgIGZvciAoOyB5eWJvdHRvbSA8PSB5eXRvcDsgeXlib3R0b20rKykKKyAgICB7CisgICAgICBpbnQgeXlib3QgPSAqeXlib3R0b207CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsIHl5Ym90KTsKKyAgICB9CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKK30KKworIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKKyAgICB5eV9zdGFja19wcmludCAoKEJvdHRvbSksIChUb3ApKTsJCQkJXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoWVlTVFlQRSAqeXl2c3AsIFlZTFRZUEUgKnl5bHNwLCBpbnQgeXlydWxlLCBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUpCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5bHNwLCB5eXJ1bGUsIHN0YXRlKQorICAgIFlZU1RZUEUgKnl5dnNwOworICAgIFlZTFRZUEUgKnl5bHNwOworICAgIGludCB5eXJ1bGU7CisgICAgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlOworI2VuZGlmCit7CisgIGludCB5eW5yaHMgPSB5eXIyW3l5cnVsZV07CisgIGludCB5eWk7CisgIHVuc2lnbmVkIGxvbmcgaW50IHl5bG5vID0geXlybGluZVt5eXJ1bGVdOworICBZWUZQUklOVEYgKHN0ZGVyciwgIlJlZHVjaW5nIHN0YWNrIGJ5IHJ1bGUgJWQgKGxpbmUgJWx1KTpcbiIsCisJICAgICB5eXJ1bGUgLSAxLCB5eWxubyk7CisgIC8qIFRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQuICAqLworICBmb3IgKHl5aSA9IDA7IHl5aSA8IHl5bnJoczsgeXlpKyspCisgICAgeworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgICAkJWQgPSAiLCB5eWkgKyAxKTsKKyAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLCB5eXJoc1t5eXByaHNbeXlydWxlXSArIHl5aV0sCisJCSAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKKwkJICAgICAgICwgJih5eWxzcFsoeXlpICsgMSkgLSAoeXlucmhzKV0pCQkgICAgICAgLCBzdGF0ZSk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CisgICAgfQorfQorCisjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkJCVwKK2RvIHsJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCVwKKyAgICB5eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCB5eWxzcCwgUnVsZSwgc3RhdGUpOyBcCit9IHdoaWxlIChZWUlEICgwKSkKKworLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0CisgICBtdWx0aXBsZSBwYXJzZXJzIGNhbiBjb2V4aXN0LiAgKi8KK2ludCB5eWRlYnVnOworI2Vsc2UgLyogIVlZREVCVUcgKi8KKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQorIyBkZWZpbmUgWVlfU1lNQk9MX1BSSU5UKFRpdGxlLCBUeXBlLCBWYWx1ZSwgTG9jYXRpb24pCisjIGRlZmluZSBZWV9TVEFDS19QUklOVChCb3R0b20sIFRvcCkKKyMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQorI2VuZGlmIC8qICFZWURFQlVHICovCisKKworLyogWVlJTklUREVQVEggLS0gaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MuICAqLworI2lmbmRlZglZWUlOSVRERVBUSAorIyBkZWZpbmUgWVlJTklUREVQVEggMjAwCisjZW5kaWYKKworLyogWVlNQVhERVBUSCAtLSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0byAoZWZmZWN0aXZlIG9ubHkKKyAgIGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLgorCisgICBEbyBub3QgbWFrZSB0aGlzIHZhbHVlIHRvbyBsYXJnZTsgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpZgorICAgWVlTVEFDS19BTExPQ19NQVhJTVVNIDwgWVlTVEFDS19CWVRFUyAoWVlNQVhERVBUSCkKKyAgIGV2YWx1YXRlZCB3aXRoIGluZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuICAqLworCisjaWZuZGVmIFlZTUFYREVQVEgKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKyNlbmRpZgorCisKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKworIyBpZm5kZWYgeXlzdHJsZW4KKyMgIGlmIGRlZmluZWQgX19HTElCQ19fICYmIGRlZmluZWQgX1NUUklOR19ICisjICAgZGVmaW5lIHl5c3RybGVuIHN0cmxlbgorIyAgZWxzZQorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgWVlTVFIuICAqLworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyBZWVNJWkVfVAoreXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQorI2Vsc2UKK3N0YXRpYyBZWVNJWkVfVAoreXlzdHJsZW4gKHl5c3RyKQorICAgIGNvbnN0IGNoYXIgKnl5c3RyOworI2VuZGlmCit7CisgIFlZU0laRV9UIHl5bGVuOworICBmb3IgKHl5bGVuID0gMDsgeXlzdHJbeXlsZW5dOyB5eWxlbisrKQorICAgIGNvbnRpbnVlOworICByZXR1cm4geXlsZW47Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiB5eXN0cGNweQorIyAgaWYgZGVmaW5lZCBfX0dMSUJDX18gJiYgZGVmaW5lZCBfU1RSSU5HX0ggJiYgZGVmaW5lZCBfR05VX1NPVVJDRQorIyAgIGRlZmluZSB5eXN0cGNweSBzdHBjcHkKKyMgIGVsc2UKKy8qIENvcHkgWVlTUkMgdG8gWVlERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nICdcMCcgaW4KKyAgIFlZREVTVC4gICovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIGNoYXIgKgoreXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCisjZWxzZQorc3RhdGljIGNoYXIgKgoreXlzdHBjcHkgKHl5ZGVzdCwgeXlzcmMpCisgICAgY2hhciAqeXlkZXN0OworICAgIGNvbnN0IGNoYXIgKnl5c3JjOworI2VuZGlmCit7CisgIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKKyAgY29uc3QgY2hhciAqeXlzID0geXlzcmM7CisKKyAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5ZCAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiB5eXRuYW1lcnIKKy8qIENvcHkgdG8gWVlSRVMgdGhlIGNvbnRlbnRzIG9mIFlZU1RSIGFmdGVyIHN0cmlwcGluZyBhd2F5IHVubmVjZXNzYXJ5CisgICBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLCBzbyB0aGF0IGl0J3Mgc3VpdGFibGUgZm9yIHl5ZXJyb3IuICBUaGUKKyAgIGhldXJpc3RpYyBpcyB0aGF0IGRvdWJsZS1xdW90aW5nIGlzIHVubmVjZXNzYXJ5IHVubGVzcyB0aGUgc3RyaW5nCisgICBjb250YWlucyBhbiBhcG9zdHJvcGhlLCBhIGNvbW1hLCBvciBiYWNrc2xhc2ggKG90aGVyIHRoYW4KKyAgIGJhY2tzbGFzaC1iYWNrc2xhc2gpLiAgWVlTVFIgaXMgdGFrZW4gZnJvbSB5eXRuYW1lLiAgSWYgWVlSRVMgaXMKKyAgIG51bGwsIGRvIG5vdCBjb3B5OyBpbnN0ZWFkLCByZXR1cm4gdGhlIGxlbmd0aCBvZiB3aGF0IHRoZSByZXN1bHQKKyAgIHdvdWxkIGhhdmUgYmVlbi4gICovCitzdGF0aWMgWVlTSVpFX1QKK3l5dG5hbWVyciAoY2hhciAqeXlyZXMsIGNvbnN0IGNoYXIgKnl5c3RyKQoreworICBpZiAoKnl5c3RyID09ICciJykKKyAgICB7CisgICAgICBZWVNJWkVfVCB5eW4gPSAwOworICAgICAgY2hhciBjb25zdCAqeXlwID0geXlzdHI7CisKKyAgICAgIGZvciAoOzspCisJc3dpdGNoICgqKyt5eXApCisJICB7CisJICBjYXNlICdcJyc6CisJICBjYXNlICcsJzoKKwkgICAgZ290byBkb19ub3Rfc3RyaXBfcXVvdGVzOworCisJICBjYXNlICdcXCc6CisJICAgIGlmICgqKyt5eXAgIT0gJ1xcJykKKwkgICAgICBnb3RvIGRvX25vdF9zdHJpcF9xdW90ZXM7CisJICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJICBkZWZhdWx0OgorCSAgICBpZiAoeXlyZXMpCisJICAgICAgeXlyZXNbeXluXSA9ICp5eXA7CisJICAgIHl5bisrOworCSAgICBicmVhazsKKworCSAgY2FzZSAnIic6CisJICAgIGlmICh5eXJlcykKKwkgICAgICB5eXJlc1t5eW5dID0gJ1wwJzsKKwkgICAgcmV0dXJuIHl5bjsKKwkgIH0KKyAgICBkb19ub3Rfc3RyaXBfcXVvdGVzOiA7CisgICAgfQorCisgIGlmICghIHl5cmVzKQorICAgIHJldHVybiB5eXN0cmxlbiAoeXlzdHIpOworCisgIHJldHVybiB5eXN0cGNweSAoeXlyZXMsIHl5c3RyKSAtIHl5cmVzOworfQorIyBlbmRpZgorCisvKiBDb3B5IGludG8gKllZTVNHLCB3aGljaCBpcyBvZiBzaXplICpZWU1TR19BTExPQywgYW4gZXJyb3IgbWVzc2FnZQorICAgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4gWVlUT0tFTiBmb3IgdGhlIHN0YXRlIHN0YWNrIHdob3NlIHRvcCBpcworICAgWVlTU1AuCisKKyAgIFJldHVybiAwIGlmICpZWU1TRyB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4uICBSZXR1cm4gMSBpZiAqWVlNU0cgaXMKKyAgIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgbWVzc2FnZS4gIEluIHRoYXQgY2FzZSwgYWxzbyBzZXQKKyAgICpZWU1TR19BTExPQyB0byB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ5dGVzLiAgUmV0dXJuIDIgaWYgdGhlCisgICByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMgaXMgdG9vIGxhcmdlIHRvIHN0b3JlLiAgKi8KK3N0YXRpYyBpbnQKK3l5c3ludGF4X2Vycm9yIChZWVNJWkVfVCAqeXltc2dfYWxsb2MsIGNoYXIgKip5eW1zZywKKyAgICAgICAgICAgICAgICB5eXR5cGVfaW50MTYgKnl5c3NwLCBpbnQgeXl0b2tlbikKK3sKKyAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoWVlfTlVMTCwgeXl0bmFtZVt5eXRva2VuXSk7CisgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7CisgIGVudW0geyBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNID0gNSB9OworICAvKiBJbnRlcm5hdGlvbmFsaXplZCBmb3JtYXQgc3RyaW5nLiAqLworICBjb25zdCBjaGFyICp5eWZvcm1hdCA9IFlZX05VTEw7CisgIC8qIEFyZ3VtZW50cyBvZiB5eWZvcm1hdC4gKi8KKyAgY2hhciBjb25zdCAqeXlhcmdbWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTV07CisgIC8qIE51bWJlciBvZiByZXBvcnRlZCB0b2tlbnMgKG9uZSBmb3IgdGhlICJ1bmV4cGVjdGVkIiwgb25lIHBlcgorICAgICAiZXhwZWN0ZWQiKS4gKi8KKyAgaW50IHl5Y291bnQgPSAwOworCisgIC8qIFRoZXJlIGFyZSBtYW55IHBvc3NpYmlsaXRpZXMgaGVyZSB0byBjb25zaWRlcjoKKyAgICAgLSBBc3N1bWUgWVlGQUlMIGlzIG5vdCB1c2VkLiAgSXQncyB0b28gZmxhd2VkIHRvIGNvbnNpZGVyLiAgU2VlCisgICAgICAgPGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9iaXNvbi1wYXRjaGVzLzIwMDktMTIvbXNnMDAwMjQuaHRtbD4KKyAgICAgICBmb3IgZGV0YWlscy4gIFlZRVJST1IgaXMgZmluZSBhcyBpdCBkb2VzIG5vdCBpbnZva2UgdGhpcworICAgICAgIGZ1bmN0aW9uLgorICAgICAtIElmIHRoaXMgc3RhdGUgaXMgYSBjb25zaXN0ZW50IHN0YXRlIHdpdGggYSBkZWZhdWx0IGFjdGlvbiwgdGhlbgorICAgICAgIHRoZSBvbmx5IHdheSB0aGlzIGZ1bmN0aW9uIHdhcyBpbnZva2VkIGlzIGlmIHRoZSBkZWZhdWx0IGFjdGlvbgorICAgICAgIGlzIGFuIGVycm9yIGFjdGlvbi4gIEluIHRoYXQgY2FzZSwgZG9uJ3QgY2hlY2sgZm9yIGV4cGVjdGVkCisgICAgICAgdG9rZW5zIGJlY2F1c2UgdGhlcmUgYXJlIG5vbmUuCisgICAgIC0gVGhlIG9ubHkgd2F5IHRoZXJlIGNhbiBiZSBubyBsb29rYWhlYWQgcHJlc2VudCAoaW4geXljaGFyKSBpcyBpZgorICAgICAgIHRoaXMgc3RhdGUgaXMgYSBjb25zaXN0ZW50IHN0YXRlIHdpdGggYSBkZWZhdWx0IGFjdGlvbi4gIFRodXMsCisgICAgICAgZGV0ZWN0aW5nIHRoZSBhYnNlbmNlIG9mIGEgbG9va2FoZWFkIGlzIHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lCisgICAgICAgdGhhdCB0aGVyZSBpcyBubyB1bmV4cGVjdGVkIG9yIGV4cGVjdGVkIHRva2VuIHRvIHJlcG9ydC4gIEluIHRoYXQKKyAgICAgICBjYXNlLCBqdXN0IHJlcG9ydCBhIHNpbXBsZSAic3ludGF4IGVycm9yIi4KKyAgICAgLSBEb24ndCBhc3N1bWUgdGhlcmUgaXNuJ3QgYSBsb29rYWhlYWQganVzdCBiZWNhdXNlIHRoaXMgc3RhdGUgaXMgYQorICAgICAgIGNvbnNpc3RlbnQgc3RhdGUgd2l0aCBhIGRlZmF1bHQgYWN0aW9uLiAgVGhlcmUgbWlnaHQgaGF2ZSBiZWVuIGEKKyAgICAgICBwcmV2aW91cyBpbmNvbnNpc3RlbnQgc3RhdGUsIGNvbnNpc3RlbnQgc3RhdGUgd2l0aCBhIG5vbi1kZWZhdWx0CisgICAgICAgYWN0aW9uLCBvciB1c2VyIHNlbWFudGljIGFjdGlvbiB0aGF0IG1hbmlwdWxhdGVkIHl5Y2hhci4KKyAgICAgLSBPZiBjb3Vyc2UsIHRoZSBleHBlY3RlZCB0b2tlbiBsaXN0IGRlcGVuZHMgb24gc3RhdGVzIHRvIGhhdmUKKyAgICAgICBjb3JyZWN0IGxvb2thaGVhZCBpbmZvcm1hdGlvbiwgYW5kIGl0IGRlcGVuZHMgb24gdGhlIHBhcnNlciBub3QKKyAgICAgICB0byBwZXJmb3JtIGV4dHJhIHJlZHVjdGlvbnMgYWZ0ZXIgZmV0Y2hpbmcgYSBsb29rYWhlYWQgZnJvbSB0aGUKKyAgICAgICBzY2FubmVyIGFuZCBiZWZvcmUgZGV0ZWN0aW5nIGEgc3ludGF4IGVycm9yLiAgVGh1cywgc3RhdGUgbWVyZ2luZworICAgICAgIChmcm9tIExBTFIgb3IgSUVMUikgYW5kIGRlZmF1bHQgcmVkdWN0aW9ucyBjb3JydXB0IHRoZSBleHBlY3RlZAorICAgICAgIHRva2VuIGxpc3QuICBIb3dldmVyLCB0aGUgbGlzdCBpcyBjb3JyZWN0IGZvciBjYW5vbmljYWwgTFIgd2l0aAorICAgICAgIG9uZSBleGNlcHRpb246IGl0IHdpbGwgc3RpbGwgY29udGFpbiBhbnkgdG9rZW4gdGhhdCB3aWxsIG5vdCBiZQorICAgICAgIGFjY2VwdGVkIGR1ZSB0byBhbiBlcnJvciBhY3Rpb24gaW4gYSBsYXRlciBzdGF0ZS4KKyAgKi8KKyAgaWYgKHl5dG9rZW4gIT0gWVlFTVBUWSkKKyAgICB7CisgICAgICBpbnQgeXluID0geXlwYWN0Wyp5eXNzcF07CisgICAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXRva2VuXTsKKyAgICAgIGlmICgheXlwYWN0X3ZhbHVlX2lzX2RlZmF1bHQgKHl5bikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCisgICAgICAgICAgICAgWVlDSEVDSy4gIEluIG90aGVyIHdvcmRzLCBza2lwIHRoZSBmaXJzdCAtWVlOIGFjdGlvbnMgZm9yCisgICAgICAgICAgICAgdGhpcyBzdGF0ZSBiZWNhdXNlIHRoZXkgYXJlIGRlZmF1bHQgYWN0aW9ucy4gICovCisgICAgICAgICAgaW50IHl5eGJlZ2luID0geXluIDwgMCA/IC15eW4gOiAwOworICAgICAgICAgIC8qIFN0YXkgd2l0aGluIGJvdW5kcyBvZiBib3RoIHl5Y2hlY2sgYW5kIHl5dG5hbWUuICAqLworICAgICAgICAgIGludCB5eWNoZWNrbGltID0gWVlMQVNUIC0geXluICsgMTsKKyAgICAgICAgICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7CisgICAgICAgICAgaW50IHl5eDsKKworICAgICAgICAgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCisgICAgICAgICAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IKKyAgICAgICAgICAgICAgICAmJiAheXl0YWJsZV92YWx1ZV9pc19lcnJvciAoeXl0YWJsZVt5eXggKyB5eW5dKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHl5Y291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICB5eXNpemUgPSB5eXNpemUwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFlZU0laRV9UIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXRuYW1lcnIgKFlZX05VTEwsIHl5dG5hbWVbeXl4XSk7CisgICAgICAgICAgICAgICAgICBpZiAoISAoeXlzaXplIDw9IHl5c2l6ZTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5eXNpemUxIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgICAgeXlzaXplID0geXlzaXplMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBzd2l0Y2ggKHl5Y291bnQpCisgICAgeworIyBkZWZpbmUgWVlDQVNFXyhOLCBTKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIE46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeXlmb3JtYXQgPSBTOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsKKyAgICAgIFlZQ0FTRV8oMCwgWVlfKCJzeW50YXggZXJyb3IiKSk7CisgICAgICBZWUNBU0VfKDEsIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIikpOworICAgICAgWVlDQVNFXygyLCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIikpOworICAgICAgWVlDQVNFXygzLCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIikpOworICAgICAgWVlDQVNFXyg0LCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIikpOworICAgICAgWVlDQVNFXyg1LCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIG9yICVzIikpOworIyB1bmRlZiBZWUNBU0VfCisgICAgfQorCisgIHsKKyAgICBZWVNJWkVfVCB5eXNpemUxID0geXlzaXplICsgeXlzdHJsZW4gKHl5Zm9ybWF0KTsKKyAgICBpZiAoISAoeXlzaXplIDw9IHl5c2l6ZTEgJiYgeXlzaXplMSA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pKQorICAgICAgcmV0dXJuIDI7CisgICAgeXlzaXplID0geXlzaXplMTsKKyAgfQorCisgIGlmICgqeXltc2dfYWxsb2MgPCB5eXNpemUpCisgICAgeworICAgICAgKnl5bXNnX2FsbG9jID0gMiAqIHl5c2l6ZTsKKyAgICAgIGlmICghICh5eXNpemUgPD0gKnl5bXNnX2FsbG9jCisgICAgICAgICAgICAgJiYgKnl5bXNnX2FsbG9jIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCisgICAgICAgICp5eW1zZ19hbGxvYyA9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBBdm9pZCBzcHJpbnRmLCBhcyB0aGF0IGluZnJpbmdlcyBvbiB0aGUgdXNlcidzIG5hbWUgc3BhY2UuCisgICAgIERvbid0IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGV2ZW4gaWYgdGhlIHRyYW5zbGF0aW9uCisgICAgIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCisgIHsKKyAgICBjaGFyICp5eXAgPSAqeXltc2c7CisgICAgaW50IHl5aSA9IDA7CisgICAgd2hpbGUgKCgqeXlwID0gKnl5Zm9ybWF0KSAhPSAnXDAnKQorICAgICAgaWYgKCp5eXAgPT0gJyUnICYmIHl5Zm9ybWF0WzFdID09ICdzJyAmJiB5eWkgPCB5eWNvdW50KQorICAgICAgICB7CisgICAgICAgICAgeXlwICs9IHl5dG5hbWVyciAoeXlwLCB5eWFyZ1t5eWkrK10pOworICAgICAgICAgIHl5Zm9ybWF0ICs9IDI7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHl5cCsrOworICAgICAgICAgIHl5Zm9ybWF0Kys7CisgICAgICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUmVsZWFzZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gdGhpcyBzeW1ib2wuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKkFSR1NVU0VEKi8KKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwLCBZWUxUWVBFICp5eWxvY2F0aW9ucCwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eWRlc3RydWN0ICh5eW1zZywgeXl0eXBlLCB5eXZhbHVlcCwgeXlsb2NhdGlvbnAsIHN0YXRlKQorICAgIGNvbnN0IGNoYXIgKnl5bXNnOworICAgIGludCB5eXR5cGU7CisgICAgWVlTVFlQRSAqeXl2YWx1ZXA7CisgICAgWVlMVFlQRSAqeXlsb2NhdGlvbnA7CisgICAgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlOworI2VuZGlmCit7CisgIFlZVVNFICh5eXZhbHVlcCk7CisgIFlZVVNFICh5eWxvY2F0aW9ucCk7CisgIFlZVVNFIChzdGF0ZSk7CisKKyAgaWYgKCF5eW1zZykKKyAgICB5eW1zZyA9ICJEZWxldGluZyI7CisgIFlZX1NZTUJPTF9QUklOVCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKTsKKworICBZWVVTRSAoeXl0eXBlKTsKK30KKworCisKKworLyotLS0tLS0tLS0tLgorfCB5eXBhcnNlLiAgfAorYC0tLS0tLS0tLS0qLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK2ludAoreXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSkKKyNlbHNlCitpbnQKK3l5cGFyc2UgKFlZUEFSU0VfUEFSQU0pCisgICAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyNlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQoraW50Cit5eXBhcnNlIChzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUpCisjZWxzZQoraW50Cit5eXBhcnNlIChzdGF0ZSkKKyAgICBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGU7CisjZW5kaWYKKyNlbmRpZgoreworLyogVGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLworaW50IHl5Y2hhcjsKKworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiA0MDcgPD0gX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXworLyogU3VwcHJlc3MgYW4gaW5jb3JyZWN0IGRpYWdub3N0aWMgYWJvdXQgeXlsdmFsIGJlaW5nIHVuaW5pdGlhbGl6ZWQuICAqLworIyBkZWZpbmUgWVlfSUdOT1JFX01BWUJFX1VOSU5JVElBTElaRURfQkVHSU4gXAorICAgIF9QcmFnbWEgKCJHQ0MgZGlhZ25vc3RpYyBwdXNoIikgXAorICAgIF9QcmFnbWEgKCJHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVd1bmluaXRpYWxpemVkXCIiKVwKKyAgICBfUHJhZ21hICgiR0NDIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XbWF5YmUtdW5pbml0aWFsaXplZFwiIikKKyMgZGVmaW5lIFlZX0lHTk9SRV9NQVlCRV9VTklOSVRJQUxJWkVEX0VORCBcCisgICAgX1ByYWdtYSAoIkdDQyBkaWFnbm9zdGljIHBvcCIpCisjZWxzZQorLyogRGVmYXVsdCB2YWx1ZSB1c2VkIGZvciBpbml0aWFsaXphdGlvbiwgZm9yIHBhY2lmeWluZyBvbGRlciBHQ0NzCisgICBvciBub24tR0NDIGNvbXBpbGVycy4gICovCitzdGF0aWMgWVlTVFlQRSB5eXZhbF9kZWZhdWx0OworIyBkZWZpbmUgWVlfSU5JVElBTF9WQUxVRShWYWx1ZSkgPSBWYWx1ZQorI2VuZGlmCitzdGF0aWMgWVlMVFlQRSB5eWxvY19kZWZhdWx0CisjIGlmIGRlZmluZWQgWVlMVFlQRV9JU19UUklWSUFMICYmIFlZTFRZUEVfSVNfVFJJVklBTAorICA9IHsgMSwgMSwgMSwgMSB9CisjIGVuZGlmCis7CisjaWZuZGVmIFlZX0lHTk9SRV9NQVlCRV9VTklOSVRJQUxJWkVEX0JFR0lOCisjIGRlZmluZSBZWV9JR05PUkVfTUFZQkVfVU5JTklUSUFMSVpFRF9CRUdJTgorIyBkZWZpbmUgWVlfSUdOT1JFX01BWUJFX1VOSU5JVElBTElaRURfRU5ECisjZW5kaWYKKyNpZm5kZWYgWVlfSU5JVElBTF9WQUxVRQorIyBkZWZpbmUgWVlfSU5JVElBTF9WQUxVRShWYWx1ZSkgLyogTm90aGluZy4gKi8KKyNlbmRpZgorCisvKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLworWVlTVFlQRSB5eWx2YWwgWVlfSU5JVElBTF9WQUxVRSh5eXZhbF9kZWZhdWx0KTsKKworLyogTG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLworWVlMVFlQRSB5eWxsb2MgPSB5eWxvY19kZWZhdWx0OworCisKKyAgICAvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLworICAgIGludCB5eW5lcnJzOworCisgICAgaW50IHl5c3RhdGU7CisgICAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCisgICAgaW50IHl5ZXJyc3RhdHVzOworCisgICAgLyogVGhlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6CisgICAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcy4KKyAgICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLgorICAgICAgIGB5eWxzJzogcmVsYXRlZCB0byBsb2NhdGlvbnMuCisKKyAgICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocm91Z2ggc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKKyAgICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KKworICAgIC8qIFRoZSBzdGF0ZSBzdGFjay4gICovCisgICAgeXl0eXBlX2ludDE2IHl5c3NhW1lZSU5JVERFUFRIXTsKKyAgICB5eXR5cGVfaW50MTYgKnl5c3M7CisgICAgeXl0eXBlX2ludDE2ICp5eXNzcDsKKworICAgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisgICAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CisgICAgWVlTVFlQRSAqeXl2czsKKyAgICBZWVNUWVBFICp5eXZzcDsKKworICAgIC8qIFRoZSBsb2NhdGlvbiBzdGFjay4gICovCisgICAgWVlMVFlQRSB5eWxzYVtZWUlOSVRERVBUSF07CisgICAgWVlMVFlQRSAqeXlsczsKKyAgICBZWUxUWVBFICp5eWxzcDsKKworICAgIC8qIFRoZSBsb2NhdGlvbnMgd2hlcmUgdGhlIGVycm9yIHN0YXJ0ZWQgYW5kIGVuZGVkLiAgKi8KKyAgICBZWUxUWVBFIHl5ZXJyb3JfcmFuZ2VbM107CisKKyAgICBZWVNJWkVfVCB5eXN0YWNrc2l6ZTsKKworICBpbnQgeXluOworICBpbnQgeXlyZXN1bHQ7CisgIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KKyAgaW50IHl5dG9rZW4gPSAwOworICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQorICAgICBhY3Rpb24gcm91dGluZXMuICAqLworICBZWVNUWVBFIHl5dmFsOworICBZWUxUWVBFIHl5bG9jOworCisjaWYgWVlFUlJPUl9WRVJCT1NFCisgIC8qIEJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZXMsIGFuZCBpdHMgYWxsb2NhdGVkIHNpemUuICAqLworICBjaGFyIHl5bXNnYnVmWzEyOF07CisgIGNoYXIgKnl5bXNnID0geXltc2didWY7CisgIFlZU0laRV9UIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOworI2VuZGlmCisKKyNkZWZpbmUgWVlQT1BTVEFDSyhOKSAgICh5eXZzcCAtPSAoTiksIHl5c3NwIC09IChOKSwgeXlsc3AgLT0gKE4pKQorCisgIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkIHJ1bGUuCisgICAgIEtlZXAgdG8gemVybyB3aGVuIG5vIHN5bWJvbCBzaG91bGQgYmUgcG9wcGVkLiAgKi8KKyAgaW50IHl5bGVuID0gMDsKKworICB5eXNzcCA9IHl5c3MgPSB5eXNzYTsKKyAgeXl2c3AgPSB5eXZzID0geXl2c2E7CisgIHl5bHNwID0geXlscyA9IHl5bHNhOworICB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7IC8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCisgIHl5bHNwWzBdID0geXlsbG9jOworICBnb3RvIHl5c2V0c3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB5eW5ld3N0YXRlOgorICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuICBTbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KKyAgeXlzc3ArKzsKKworIHl5c2V0c3RhdGU6CisgICp5eXNzcCA9IHl5c3RhdGU7CisKKyAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCisgICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOworCisjaWZkZWYgeXlvdmVyZmxvdworICAgICAgeworCS8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjay4gIFVzZSBjb3BpZXMgb2YKKwkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCisJICAgbWVtb3J5LiAgKi8KKwlZWVNUWVBFICp5eXZzMSA9IHl5dnM7CisJeXl0eXBlX2ludDE2ICp5eXNzMSA9IHl5c3M7CisJWVlMVFlQRSAqeXlsczEgPSB5eWxzOworCisJLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCisJICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICBUaGlzIHVzZWQgdG8gYmUgYQorCSAgIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywgYnV0IHRoYXQgbWlnaHQKKwkgICBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKwl5eW92ZXJmbG93IChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSwKKwkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAorCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisJCSAgICAmeXlsczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisKKwl5eWxzID0geXlsczE7CisJeXlzcyA9IHl5c3MxOworCXl5dnMgPSB5eXZzMTsKKyAgICAgIH0KKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKyAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisjIGVsc2UKKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKFlZTUFYREVQVEggPD0geXlzdGFja3NpemUpCisJZ290byB5eWV4aGF1c3RlZGxhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoWVlNQVhERVBUSCA8IHl5c3RhY2tzaXplKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOworCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KKwkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CisJaWYgKCEgeXlwdHIpCisJICBnb3RvIHl5ZXhoYXVzdGVkbGFiOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3NfYWxsb2MsIHl5c3MpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnNfYWxsb2MsIHl5dnMpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5bHNfYWxsb2MsIHl5bHMpOworIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQorCWlmICh5eXNzMSAhPSB5eXNzYSkKKwkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOworICAgICAgfQorIyBlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKKyAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7CisgICAgICB5eWxzcCA9IHl5bHMgKyB5eXNpemUgLSAxOworCisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOworCisgICAgICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKKwlZWUFCT1JUOworICAgIH0KKworICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOworCisgIGlmICh5eXN0YXRlID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyAgZ290byB5eWJhY2t1cDsKKworLyotLS0tLS0tLS0tLS4KK3wgeXliYWNrdXAuICB8CitgLS0tLS0tLS0tLS0qLworeXliYWNrdXA6CisKKyAgLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gIFJlYWQgYQorICAgICBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworCisgIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eXBhY3RfdmFsdWVfaXNfZGVmYXVsdCAoeXluKSkKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworCisgIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2thaGVhZCBzeW1ib2wuICAqLworICBpZiAoeXljaGFyID09IFlZRU1QVFkpCisgICAgeworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7CisgICAgICB5eWNoYXIgPSBZWUxFWDsKKyAgICB9CisKKyAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKyAgICB7CisgICAgICB5eWNoYXIgPSB5eXRva2VuID0gWVlFT0Y7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIFlZX1NZTUJPTF9QUklOVCAoIk5leHQgdG9rZW4gaXMiLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKyAgICB9CisKKyAgLyogSWYgdGhlIHByb3BlciBhY3Rpb24gb24gc2VlaW5nIHRva2VuIFlZVE9LRU4gaXMgdG8gcmVkdWNlIG9yIHRvCisgICAgIGRldGVjdCBhbiBlcnJvciwgdGFrZSB0aGF0IGFjdGlvbi4gICovCisgIHl5biArPSB5eXRva2VuOworICBpZiAoeXluIDwgMCB8fCBZWUxBU1QgPCB5eW4gfHwgeXljaGVja1t5eW5dICE9IHl5dG9rZW4pCisgICAgZ290byB5eWRlZmF1bHQ7CisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8PSAwKQorICAgIHsKKyAgICAgIGlmICh5eXRhYmxlX3ZhbHVlX2lzX2Vycm9yICh5eW4pKQorICAgICAgICBnb3RvIHl5ZXJybGFiOworICAgICAgeXluID0gLXl5bjsKKyAgICAgIGdvdG8geXlyZWR1Y2U7CisgICAgfQorCisgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKKyAgICAgc3RhdHVzLiAgKi8KKyAgaWYgKHl5ZXJyc3RhdHVzKQorICAgIHl5ZXJyc3RhdHVzLS07CisKKyAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCisgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisKKyAgLyogRGlzY2FyZCB0aGUgc2hpZnRlZCB0b2tlbi4gICovCisgIHl5Y2hhciA9IFlZRU1QVFk7CisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgWVlfSUdOT1JFX01BWUJFX1VOSU5JVElBTElaRURfQkVHSU4KKyAgKisreXl2c3AgPSB5eWx2YWw7CisgIFlZX0lHTk9SRV9NQVlCRV9VTklOSVRJQUxJWkVEX0VORAorICAqKyt5eWxzcCA9IHl5bGxvYzsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZGVmYXVsdCAtLSBkbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZGVmYXVsdDoKKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gMCkKKyAgICBnb3RvIHl5ZXJybGFiOworICBnb3RvIHl5cmVkdWNlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cmVkdWNlIC0tIERvIGEgcmVkdWN0aW9uLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5cmVkdWNlOgorICAvKiB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworICB5eWxlbiA9IHl5cjJbeXluXTsKKworICAvKiBJZiBZWUxFTiBpcyBub256ZXJvLCBpbXBsZW1lbnQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbjoKKyAgICAgYCQkID0gJDEnLgorCisgICAgIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNldHMgWVlWQUwgdG8gZ2FyYmFnZS4KKyAgICAgVGhpcyBiZWhhdmlvciBpcyB1bmRvY3VtZW50ZWQgYW5kIEJpc29uCisgICAgIHVzZXJzIHNob3VsZCBub3QgcmVseSB1cG9uIGl0LiAgQXNzaWduaW5nIHRvIFlZVkFMCisgICAgIHVuY29uZGl0aW9uYWxseSBtYWtlcyB0aGUgcGFyc2VyIGEgYml0IHNtYWxsZXIsIGFuZCBpdCBhdm9pZHMgYQorICAgICBHQ0Mgd2FybmluZyB0aGF0IFlZVkFMIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuICAqLworICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOworCisgIC8qIERlZmF1bHQgbG9jYXRpb24uICAqLworICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWxzcCAtIHl5bGVuKSwgeXlsZW4pOworICBZWV9SRURVQ0VfUFJJTlQgKHl5bik7CisgIHN3aXRjaCAoeXluKQorICAgIHsKKyAgICAgICAgY2FzZSAzOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI4OCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+cHJvZy0+VGFyZ2V0ICE9IEdMX1ZFUlRFWF9QUk9HUkFNX0FSQikgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCBmcmFnbWVudCBwcm9ncmFtIGhlYWRlciIpOworCisJICAgfQorCSAgIHN0YXRlLT5tb2RlID0gQVJCX3ZlcnRleDsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI5NiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+cHJvZy0+VGFyZ2V0ICE9IEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIHZlcnRleCBwcm9ncmFtIGhlYWRlciIpOworCSAgIH0KKwkgICBzdGF0ZS0+bW9kZSA9IEFSQl9mcmFnbWVudDsKKworCSAgIHN0YXRlLT5vcHRpb24uVGV4UmVjdCA9CisJICAgICAgKHN0YXRlLT5jdHgtPkV4dGVuc2lvbnMuTlZfdGV4dHVyZV9yZWN0YW5nbGUgIT0gR0xfRkFMU0UpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMzEyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaW50IHZhbGlkID0gMDsKKworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgdmFsaWQgPSBfbWVzYV9BUkJ2cF9wYXJzZV9vcHRpb24oc3RhdGUsICh5eXZzcFsoMikgLSAoMyldLnN0cmluZykpOworCSAgIH0gZWxzZSBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX2ZyYWdtZW50KSB7CisJICAgICAgdmFsaWQgPSBfbWVzYV9BUkJmcF9wYXJzZV9vcHRpb24oc3RhdGUsICh5eXZzcFsoMikgLSAoMyldLnN0cmluZykpOworCSAgIH0KKworCisJICAgZnJlZSgoeXl2c3BbKDIpIC0gKDMpXS5zdHJpbmcpKTsKKworCSAgIGlmICghdmFsaWQpIHsKKwkgICAgICBjb25zdCBjaGFyICpjb25zdCBlcnJfc3RyID0gKHN0YXRlLT5tb2RlID09IEFSQl92ZXJ0ZXgpCisJCSA/ICJpbnZhbGlkIEFSQiB2ZXJ0ZXggcHJvZ3JhbSBvcHRpb24iCisJCSA6ICJpbnZhbGlkIEFSQiBmcmFnbWVudCBwcm9ncmFtIG9wdGlvbiI7CisKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygyKSAtICgzKV0pLCBzdGF0ZSwgZXJyX3N0cik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMzQwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCh5eXZzcFsoMSkgLSAoMildLmluc3QpICE9IE5VTEwpIHsKKwkgICAgICBpZiAoc3RhdGUtPmluc3RfdGFpbCA9PSBOVUxMKSB7CisJCSBzdGF0ZS0+aW5zdF9oZWFkID0gKHl5dnNwWygxKSAtICgyKV0uaW5zdCk7CisJICAgICAgfSBlbHNlIHsKKwkJIHN0YXRlLT5pbnN0X3RhaWwtPm5leHQgPSAoeXl2c3BbKDEpIC0gKDIpXS5pbnN0KTsKKwkgICAgICB9CisKKwkgICAgICBzdGF0ZS0+aW5zdF90YWlsID0gKHl5dnNwWygxKSAtICgyKV0uaW5zdCk7CisJICAgICAgKHl5dnNwWygxKSAtICgyKV0uaW5zdCktPm5leHQgPSBOVUxMOworCisJICAgICAgc3RhdGUtPnByb2ctPk51bUluc3RydWN0aW9ucysrOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAzNTggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW5zdCkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnN0KTsKKwkgICBzdGF0ZS0+cHJvZy0+TnVtQWx1SW5zdHJ1Y3Rpb25zKys7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMzYzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmluc3QpID0gKHl5dnNwWygxKSAtICgxKV0uaW5zdCk7CisJICAgc3RhdGUtPnByb2ctPk51bVRleEluc3RydWN0aW9ucysrOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI0OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM4NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnN0KSA9IGFzbV9pbnN0cnVjdGlvbl9jdG9yKE9QQ09ERV9BUkwsICYgKHl5dnNwWygyKSAtICg0KV0uZHN0X3JlZyksICYgKHl5dnNwWyg0KSAtICg0KV0uc3JjX3JlZyksIE5VTEwsIE5VTEwpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM5MCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICgoeXl2c3BbKDEpIC0gKDQpXS50ZW1wX2luc3QpLk9wY29kZSA9PSBPUENPREVfRERZKQorCSAgICAgIHN0YXRlLT5mcmFnbWVudC5Vc2VzREZkeSA9IDE7CisJICAgKHl5dmFsLmluc3QpID0gYXNtX2luc3RydWN0aW9uX2NvcHlfY3RvcigmICh5eXZzcFsoMSkgLSAoNCldLnRlbXBfaW5zdCksICYgKHl5dnNwWygyKSAtICg0KV0uZHN0X3JlZyksICYgKHl5dnNwWyg0KSAtICg0KV0uc3JjX3JlZyksIE5VTEwsIE5VTEwpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI2OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM5OCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnN0KSA9IGFzbV9pbnN0cnVjdGlvbl9jb3B5X2N0b3IoJiAoeXl2c3BbKDEpIC0gKDQpXS50ZW1wX2luc3QpLCAmICh5eXZzcFsoMikgLSAoNCldLmRzdF9yZWcpLCAmICh5eXZzcFsoNCkgLSAoNCldLnNyY19yZWcpLCBOVUxMLCBOVUxMKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA0MDQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW5zdCkgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgKHl5dnNwWygxKSAtICg2KV0udGVtcF9pbnN0KSwgJiAoeXl2c3BbKDIpIC0gKDYpXS5kc3RfcmVnKSwgJiAoeXl2c3BbKDQpIC0gKDYpXS5zcmNfcmVnKSwgJiAoeXl2c3BbKDYpIC0gKDYpXS5zcmNfcmVnKSwgTlVMTCk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNDExICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmluc3QpID0gYXNtX2luc3RydWN0aW9uX2NvcHlfY3RvcigmICh5eXZzcFsoMSkgLSAoNildLnRlbXBfaW5zdCksICYgKHl5dnNwWygyKSAtICg2KV0uZHN0X3JlZyksICYgKHl5dnNwWyg0KSAtICg2KV0uc3JjX3JlZyksICYgKHl5dnNwWyg2KSAtICg2KV0uc3JjX3JlZyksIE5VTEwpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI5OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQxOCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnN0KSA9IGFzbV9pbnN0cnVjdGlvbl9jb3B5X2N0b3IoJiAoeXl2c3BbKDEpIC0gKDgpXS50ZW1wX2luc3QpLCAmICh5eXZzcFsoMikgLSAoOCldLmRzdF9yZWcpLCAmICh5eXZzcFsoNCkgLSAoOCldLnNyY19yZWcpLCAmICh5eXZzcFsoNikgLSAoOCldLnNyY19yZWcpLCAmICh5eXZzcFsoOCkgLSAoOCldLnNyY19yZWcpKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA0MjQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW5zdCkgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgKHl5dnNwWygxKSAtICg4KV0udGVtcF9pbnN0KSwgJiAoeXl2c3BbKDIpIC0gKDgpXS5kc3RfcmVnKSwgJiAoeXl2c3BbKDQpIC0gKDgpXS5zcmNfcmVnKSwgTlVMTCwgTlVMTCk7CisJICAgaWYgKCh5eXZhbC5pbnN0KSAhPSBOVUxMKSB7CisJICAgICAgY29uc3QgR0xiaXRmaWVsZCB0ZXhfbWFzayA9ICgxVSA8PCAoeXl2c3BbKDYpIC0gKDgpXS5pbnRlZ2VyKSk7CisJICAgICAgR0xiaXRmaWVsZCBzaGFkb3dfdGV4ID0gMDsKKwkgICAgICBHTGJpdGZpZWxkIHRhcmdldF9tYXNrID0gMDsKKworCisJICAgICAgKHl5dmFsLmluc3QpLT5CYXNlLlRleFNyY1VuaXQgPSAoeXl2c3BbKDYpIC0gKDgpXS5pbnRlZ2VyKTsKKworCSAgICAgIGlmICgoeXl2c3BbKDgpIC0gKDgpXS5pbnRlZ2VyKSA8IDApIHsKKwkJIHNoYWRvd190ZXggPSB0ZXhfbWFzazsKKworCQkgKHl5dmFsLmluc3QpLT5CYXNlLlRleFNyY1RhcmdldCA9IC0oeXl2c3BbKDgpIC0gKDgpXS5pbnRlZ2VyKTsKKwkJICh5eXZhbC5pbnN0KS0+QmFzZS5UZXhTaGFkb3cgPSAxOworCSAgICAgIH0gZWxzZSB7CisJCSAoeXl2YWwuaW5zdCktPkJhc2UuVGV4U3JjVGFyZ2V0ID0gKHl5dnNwWyg4KSAtICg4KV0uaW50ZWdlcik7CisJICAgICAgfQorCisJICAgICAgdGFyZ2V0X21hc2sgPSAoMVUgPDwgKHl5dmFsLmluc3QpLT5CYXNlLlRleFNyY1RhcmdldCk7CisKKwkgICAgICAvKiBJZiB0aGlzIHRleHR1cmUgdW5pdCB3YXMgcHJldmlvdXNseSBhY2Nlc3NlZCBhbmQgdGhhdCBhY2Nlc3MKKwkgICAgICAgKiBoYWQgYSBkaWZmZXJlbnQgdGV4dHVyZSB0YXJnZXQsIGdlbmVyYXRlIGFuIGVycm9yLgorCSAgICAgICAqCisJICAgICAgICogSWYgdGhpcyB0ZXh0dXJlIHVuaXQgd2FzIHByZXZpb3VzbHkgYWNjZXNzZWQgYW5kIHRoYXQgYWNjZXNzCisJICAgICAgICogaGFkIGEgZGlmZmVyZW50IHNoYWRvdyBtb2RlLCBnZW5lcmF0ZSBhbiBlcnJvci4KKwkgICAgICAgKi8KKwkgICAgICBpZiAoKHN0YXRlLT5wcm9nLT5UZXh0dXJlc1VzZWRbKHl5dnNwWyg2KSAtICg4KV0uaW50ZWdlcildICE9IDApCisJCSAgJiYgKChzdGF0ZS0+cHJvZy0+VGV4dHVyZXNVc2VkWyh5eXZzcFsoNikgLSAoOCldLmludGVnZXIpXSAhPSB0YXJnZXRfbWFzaykKKwkJICAgICAgfHwgKChzdGF0ZS0+cHJvZy0+U2hhZG93U2FtcGxlcnMgJiB0ZXhfbWFzaykKKwkJCSAgIT0gc2hhZG93X3RleCkpKSB7CisJCSB5eWVycm9yKCYgKHl5bHNwWyg4KSAtICg4KV0pLCBzdGF0ZSwKKwkJCSAibXVsdGlwbGUgdGFyZ2V0cyB1c2VkIG9uIG9uZSB0ZXh0dXJlIGltYWdlIHVuaXQiKTsKKwkJIFlZRVJST1I7CisJICAgICAgfQorCisKKwkgICAgICBzdGF0ZS0+cHJvZy0+VGV4dHVyZXNVc2VkWyh5eXZzcFsoNikgLSAoOCldLmludGVnZXIpXSB8PSB0YXJnZXRfbWFzazsKKwkgICAgICBzdGF0ZS0+cHJvZy0+U2hhZG93U2FtcGxlcnMgfD0gc2hhZG93X3RleDsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMzE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNDY4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmluc3QpID0gYXNtX2luc3RydWN0aW9uX2N0b3IoT1BDT0RFX0tJTCwgTlVMTCwgJiAoeXl2c3BbKDIpIC0gKDIpXS5zcmNfcmVnKSwgTlVMTCwgTlVMTCk7CisJICAgc3RhdGUtPmZyYWdtZW50LlVzZXNLaWxsID0gMTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA0NzMgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW5zdCkgPSBhc21faW5zdHJ1Y3Rpb25fY3RvcihPUENPREVfS0lMX05WLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkgICAoeXl2YWwuaW5zdCktPkJhc2UuRHN0UmVnLkNvbmRNYXNrID0gKHl5dnNwWygyKSAtICgyKV0uZHN0X3JlZykuQ29uZE1hc2s7CisJICAgKHl5dmFsLmluc3QpLT5CYXNlLkRzdFJlZy5Db25kU3dpenpsZSA9ICh5eXZzcFsoMikgLSAoMildLmRzdF9yZWcpLkNvbmRTd2l6emxlOworCSAgIHN0YXRlLT5mcmFnbWVudC5Vc2VzS2lsbCA9IDE7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMzM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNDgyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmluc3QpID0gYXNtX2luc3RydWN0aW9uX2NvcHlfY3RvcigmICh5eXZzcFsoMSkgLSAoMTIpXS50ZW1wX2luc3QpLCAmICh5eXZzcFsoMikgLSAoMTIpXS5kc3RfcmVnKSwgJiAoeXl2c3BbKDQpIC0gKDEyKV0uc3JjX3JlZyksICYgKHl5dnNwWyg2KSAtICgxMildLnNyY19yZWcpLCAmICh5eXZzcFsoOCkgLSAoMTIpXS5zcmNfcmVnKSk7CisJICAgaWYgKCh5eXZhbC5pbnN0KSAhPSBOVUxMKSB7CisJICAgICAgY29uc3QgR0xiaXRmaWVsZCB0ZXhfbWFzayA9ICgxVSA8PCAoeXl2c3BbKDEwKSAtICgxMildLmludGVnZXIpKTsKKwkgICAgICBHTGJpdGZpZWxkIHNoYWRvd190ZXggPSAwOworCSAgICAgIEdMYml0ZmllbGQgdGFyZ2V0X21hc2sgPSAwOworCisKKwkgICAgICAoeXl2YWwuaW5zdCktPkJhc2UuVGV4U3JjVW5pdCA9ICh5eXZzcFsoMTApIC0gKDEyKV0uaW50ZWdlcik7CisKKwkgICAgICBpZiAoKHl5dnNwWygxMikgLSAoMTIpXS5pbnRlZ2VyKSA8IDApIHsKKwkJIHNoYWRvd190ZXggPSB0ZXhfbWFzazsKKworCQkgKHl5dmFsLmluc3QpLT5CYXNlLlRleFNyY1RhcmdldCA9IC0oeXl2c3BbKDEyKSAtICgxMildLmludGVnZXIpOworCQkgKHl5dmFsLmluc3QpLT5CYXNlLlRleFNoYWRvdyA9IDE7CisJICAgICAgfSBlbHNlIHsKKwkJICh5eXZhbC5pbnN0KS0+QmFzZS5UZXhTcmNUYXJnZXQgPSAoeXl2c3BbKDEyKSAtICgxMildLmludGVnZXIpOworCSAgICAgIH0KKworCSAgICAgIHRhcmdldF9tYXNrID0gKDFVIDw8ICh5eXZhbC5pbnN0KS0+QmFzZS5UZXhTcmNUYXJnZXQpOworCisJICAgICAgLyogSWYgdGhpcyB0ZXh0dXJlIHVuaXQgd2FzIHByZXZpb3VzbHkgYWNjZXNzZWQgYW5kIHRoYXQgYWNjZXNzCisJICAgICAgICogaGFkIGEgZGlmZmVyZW50IHRleHR1cmUgdGFyZ2V0LCBnZW5lcmF0ZSBhbiBlcnJvci4KKwkgICAgICAgKgorCSAgICAgICAqIElmIHRoaXMgdGV4dHVyZSB1bml0IHdhcyBwcmV2aW91c2x5IGFjY2Vzc2VkIGFuZCB0aGF0IGFjY2VzcworCSAgICAgICAqIGhhZCBhIGRpZmZlcmVudCBzaGFkb3cgbW9kZSwgZ2VuZXJhdGUgYW4gZXJyb3IuCisJICAgICAgICovCisJICAgICAgaWYgKChzdGF0ZS0+cHJvZy0+VGV4dHVyZXNVc2VkWyh5eXZzcFsoMTApIC0gKDEyKV0uaW50ZWdlcildICE9IDApCisJCSAgJiYgKChzdGF0ZS0+cHJvZy0+VGV4dHVyZXNVc2VkWyh5eXZzcFsoMTApIC0gKDEyKV0uaW50ZWdlcildICE9IHRhcmdldF9tYXNrKQorCQkgICAgICB8fCAoKHN0YXRlLT5wcm9nLT5TaGFkb3dTYW1wbGVycyAmIHRleF9tYXNrKQorCQkJICAhPSBzaGFkb3dfdGV4KSkpIHsKKwkJIHl5ZXJyb3IoJiAoeXlsc3BbKDEyKSAtICgxMildKSwgc3RhdGUsCisJCQkgIm11bHRpcGxlIHRhcmdldHMgdXNlZCBvbiBvbmUgdGV4dHVyZSBpbWFnZSB1bml0Iik7CisJCSBZWUVSUk9SOworCSAgICAgIH0KKworCisJICAgICAgc3RhdGUtPnByb2ctPlRleHR1cmVzVXNlZFsoeXl2c3BbKDEwKSAtICgxMildLmludGVnZXIpXSB8PSB0YXJnZXRfbWFzazsKKwkgICAgICBzdGF0ZS0+cHJvZy0+U2hhZG93U2FtcGxlcnMgfD0gc2hhZG93X3RleDsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMzQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTI2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygyKSAtICgyKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMzU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTMxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IFRFWFRVUkVfMURfSU5ERVg7IH0KKyAgICBicmVhazsKKworICBjYXNlIDM2OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUzMiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyAoeXl2YWwuaW50ZWdlcikgPSBURVhUVVJFXzJEX0lOREVYOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA1MzMgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsgKHl5dmFsLmludGVnZXIpID0gVEVYVFVSRV8zRF9JTkRFWDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMzg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTM0ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IFRFWFRVUkVfQ1VCRV9JTkRFWDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMzk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTM1ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IFRFWFRVUkVfUkVDVF9JTkRFWDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTM2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IC1URVhUVVJFXzFEX0lOREVYOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA1MzcgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsgKHl5dmFsLmludGVnZXIpID0gLVRFWFRVUkVfMkRfSU5ERVg7IH0KKyAgICBicmVhazsKKworICBjYXNlIDQyOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUzOCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyAoeXl2YWwuaW50ZWdlcikgPSAtVEVYVFVSRV9SRUNUX0lOREVYOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA1MzkgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsgKHl5dmFsLmludGVnZXIpID0gVEVYVFVSRV8xRF9BUlJBWV9JTkRFWDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTQwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IFRFWFRVUkVfMkRfQVJSQVlfSU5ERVg7IH0KKyAgICBicmVhazsKKworICBjYXNlIDQ1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDU0MSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyAoeXl2YWwuaW50ZWdlcikgPSAtVEVYVFVSRV8xRF9BUlJBWV9JTkRFWDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNDY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTQyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IC1URVhUVVJFXzJEX0FSUkFZX0lOREVYOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0NzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA1NDYgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAvKiBGSVhNRTogSXMgdGhpcyBjb3JyZWN0PyAgU2hvdWxkIHRoZSBleHRlbmVkU3dpenpsZSBiZSBhcHBsaWVkCisJICAgICogRklYTUU6IHRvIHRoZSBleGlzdGluZyBzd2l6emxlPworCSAgICAqLworCSAgICh5eXZzcFsoNCkgLSAoNildLnNyY19yZWcpLkJhc2UuU3dpenpsZSA9ICh5eXZzcFsoNikgLSAoNildLnN3aXpfbWFzaykuc3dpenpsZTsKKwkgICAoeXl2c3BbKDQpIC0gKDYpXS5zcmNfcmVnKS5CYXNlLk5lZ2F0ZSA9ICh5eXZzcFsoNikgLSAoNildLnN3aXpfbWFzaykubWFzazsKKworCSAgICh5eXZhbC5pbnN0KSA9IGFzbV9pbnN0cnVjdGlvbl9jb3B5X2N0b3IoJiAoeXl2c3BbKDEpIC0gKDYpXS50ZW1wX2luc3QpLCAmICh5eXZzcFsoMikgLSAoNildLmRzdF9yZWcpLCAmICh5eXZzcFsoNCkgLSAoNildLnNyY19yZWcpLCBOVUxMLCBOVUxMKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0ODoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA1NTggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuc3JjX3JlZykgPSAoeXl2c3BbKDIpIC0gKDIpXS5zcmNfcmVnKTsKKworCSAgIGlmICgoeXl2c3BbKDEpIC0gKDIpXS5uZWdhdGUpKSB7CisJICAgICAgKHl5dmFsLnNyY19yZWcpLkJhc2UuTmVnYXRlID0gfih5eXZhbC5zcmNfcmVnKS5CYXNlLk5lZ2F0ZTsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNDk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTY2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnNyY19yZWcpID0gKHl5dnNwWygzKSAtICg0KV0uc3JjX3JlZyk7CisKKwkgICBpZiAoIXN0YXRlLT5vcHRpb24uTlZfZnJhZ21lbnQpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygyKSAtICg0KV0pLCBzdGF0ZSwgInVuZXhwZWN0ZWQgY2hhcmFjdGVyICd8JyIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgaWYgKCh5eXZzcFsoMSkgLSAoNCldLm5lZ2F0ZSkpIHsKKwkgICAgICAoeXl2YWwuc3JjX3JlZykuQmFzZS5OZWdhdGUgPSB+KHl5dmFsLnNyY19yZWcpLkJhc2UuTmVnYXRlOworCSAgIH0KKworCSAgICh5eXZhbC5zcmNfcmVnKS5CYXNlLkFicyA9IDE7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNTA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTgzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnNyY19yZWcpID0gKHl5dnNwWygxKSAtICgyKV0uc3JjX3JlZyk7CisKKwkgICAoeXl2YWwuc3JjX3JlZykuQmFzZS5Td2l6emxlID0gX21lc2FfY29tYmluZV9zd2l6emxlcygoeXl2YWwuc3JjX3JlZykuQmFzZS5Td2l6emxlLAorCQkJCQkJICAgICh5eXZzcFsoMikgLSAoMildLnN3aXpfbWFzaykuc3dpenpsZSk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNTE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNTkwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgdGVtcF9zeW07CisKKwkgICBpZiAoIXN0YXRlLT5vcHRpb24uTlZfZnJhZ21lbnQpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImV4cGVjdGVkIHNjYWxhciBzdWZmaXgiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIG1lbXNldCgmIHRlbXBfc3ltLCAwLCBzaXplb2YodGVtcF9zeW0pKTsKKwkgICB0ZW1wX3N5bS5wYXJhbV9iaW5kaW5nX2JlZ2luID0gfjA7CisJICAgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdGF0ZS0+cHJvZywgJiB0ZW1wX3N5bSwgJiAoeXl2c3BbKDEpIC0gKDEpXS52ZWN0b3IpLCBHTF9UUlVFKTsKKworCSAgIHNldF9zcmNfcmVnX3N3eigmICh5eXZhbC5zcmNfcmVnKSwgUFJPR1JBTV9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfc3ltLnBhcmFtX2JpbmRpbmdfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX3N5bS5wYXJhbV9iaW5kaW5nX3N3aXp6bGUpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDUyOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYwOSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5zcmNfcmVnKSA9ICh5eXZzcFsoMikgLSAoMyldLnNyY19yZWcpOworCisJICAgaWYgKCh5eXZzcFsoMSkgLSAoMyldLm5lZ2F0ZSkpIHsKKwkgICAgICAoeXl2YWwuc3JjX3JlZykuQmFzZS5OZWdhdGUgPSB+KHl5dmFsLnNyY19yZWcpLkJhc2UuTmVnYXRlOworCSAgIH0KKworCSAgICh5eXZhbC5zcmNfcmVnKS5CYXNlLlN3aXp6bGUgPSBfbWVzYV9jb21iaW5lX3N3aXp6bGVzKCh5eXZhbC5zcmNfcmVnKS5CYXNlLlN3aXp6bGUsCisJCQkJCQkgICAgKHl5dnNwWygzKSAtICgzKV0uc3dpel9tYXNrKS5zd2l6emxlKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1MzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA2MjAgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuc3JjX3JlZykgPSAoeXl2c3BbKDMpIC0gKDUpXS5zcmNfcmVnKTsKKworCSAgIGlmICghc3RhdGUtPm9wdGlvbi5OVl9mcmFnbWVudCkgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDIpIC0gKDUpXSksIHN0YXRlLCAidW5leHBlY3RlZCBjaGFyYWN0ZXIgJ3wnIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICBpZiAoKHl5dnNwWygxKSAtICg1KV0ubmVnYXRlKSkgeworCSAgICAgICh5eXZhbC5zcmNfcmVnKS5CYXNlLk5lZ2F0ZSA9IH4oeXl2YWwuc3JjX3JlZykuQmFzZS5OZWdhdGU7CisJICAgfQorCisJICAgKHl5dmFsLnNyY19yZWcpLkJhc2UuQWJzID0gMTsKKwkgICAoeXl2YWwuc3JjX3JlZykuQmFzZS5Td2l6emxlID0gX21lc2FfY29tYmluZV9zd2l6emxlcygoeXl2YWwuc3JjX3JlZykuQmFzZS5Td2l6emxlLAorCQkJCQkJICAgICh5eXZzcFsoNCkgLSAoNSldLnN3aXpfbWFzaykuc3dpenpsZSk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNTQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNjQwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmRzdF9yZWcpID0gKHl5dnNwWygxKSAtICgzKV0uZHN0X3JlZyk7CisJICAgKHl5dmFsLmRzdF9yZWcpLldyaXRlTWFzayA9ICh5eXZzcFsoMikgLSAoMyldLnN3aXpfbWFzaykubWFzazsKKwkgICAoeXl2YWwuZHN0X3JlZykuQ29uZE1hc2sgPSAoeXl2c3BbKDMpIC0gKDMpXS5kc3RfcmVnKS5Db25kTWFzazsKKwkgICAoeXl2YWwuZHN0X3JlZykuQ29uZFN3aXp6bGUgPSAoeXl2c3BbKDMpIC0gKDMpXS5kc3RfcmVnKS5Db25kU3dpenpsZTsKKworCSAgIGlmICgoeXl2YWwuZHN0X3JlZykuRmlsZSA9PSBQUk9HUkFNX09VVFBVVCkgeworCSAgICAgIC8qIFRlY2huaWNhbGx5IHNwZWFraW5nLCB0aGlzIHNob3VsZCBjaGVjayB0aGF0IGl0IGlzIGluCisJICAgICAgICogdmVydGV4IHByb2dyYW0gbW9kZS4gIEhvd2V2ZXIsIFBvc2l0aW9uSW52YXJpYW50IGNhbiBuZXZlciBiZQorCSAgICAgICAqIHNldCBpbiBmcmFnbWVudCBwcm9ncmFtIG1vZGUsIHNvIGl0IGlzIHNvbWV3aGF0IGlycmVsZXZhbnQuCisJICAgICAgICovCisJICAgICAgaWYgKHN0YXRlLT5vcHRpb24uUG9zaXRpb25JbnZhcmlhbnQKKwkgICAgICAgJiYgKCh5eXZhbC5kc3RfcmVnKS5JbmRleCA9PSBWQVJZSU5HX1NMT1RfUE9TKSkgeworCQkgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMyldKSwgc3RhdGUsICJwb3NpdGlvbi1pbnZhcmlhbnQgcHJvZ3JhbXMgY2Fubm90ICIKKwkJCSAid3JpdGUgcG9zaXRpb24iKTsKKwkJIFlZRVJST1I7CisJICAgICAgfQorCisJICAgICAgc3RhdGUtPnByb2ctPk91dHB1dHNXcml0dGVuIHw9IEJJVEZJRUxENjRfQklUKCh5eXZhbC5kc3RfcmVnKS5JbmRleCk7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDU1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY2NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIHNldF9kc3RfcmVnKCYgKHl5dmFsLmRzdF9yZWcpLCBQUk9HUkFNX0FERFJFU1MsIDApOworCSAgICh5eXZhbC5kc3RfcmVnKS5Xcml0ZU1hc2sgPSAoeXl2c3BbKDIpIC0gKDIpXS5zd2l6X21hc2spLm1hc2s7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNTY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNjcxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgY29uc3QgdW5zaWduZWQgeHl6d192YWxpZCA9CisJICAgICAgKCh5eXZzcFsoMSkgLSAoNyldLmV4dF9zd2l6emxlKS54eXp3X3ZhbGlkIDw8IDApCisJICAgICAgfCAoKHl5dnNwWygzKSAtICg3KV0uZXh0X3N3aXp6bGUpLnh5endfdmFsaWQgPDwgMSkKKwkgICAgICB8ICgoeXl2c3BbKDUpIC0gKDcpXS5leHRfc3dpenpsZSkueHl6d192YWxpZCA8PCAyKQorCSAgICAgIHwgKCh5eXZzcFsoNykgLSAoNyldLmV4dF9zd2l6emxlKS54eXp3X3ZhbGlkIDw8IDMpOworCSAgIGNvbnN0IHVuc2lnbmVkIHJnYmFfdmFsaWQgPQorCSAgICAgICgoeXl2c3BbKDEpIC0gKDcpXS5leHRfc3dpenpsZSkucmdiYV92YWxpZCA8PCAwKQorCSAgICAgIHwgKCh5eXZzcFsoMykgLSAoNyldLmV4dF9zd2l6emxlKS5yZ2JhX3ZhbGlkIDw8IDEpCisJICAgICAgfCAoKHl5dnNwWyg1KSAtICg3KV0uZXh0X3N3aXp6bGUpLnJnYmFfdmFsaWQgPDwgMikKKwkgICAgICB8ICgoeXl2c3BbKDcpIC0gKDcpXS5leHRfc3dpenpsZSkucmdiYV92YWxpZCA8PCAzKTsKKworCSAgIC8qIEFsbCBvZiB0aGUgc3dpenpsZSBjb21wb25lbnRzIGhhdmUgdG8gYmUgdmFsaWQgaW4gZWl0aGVyIFJHQkEKKwkgICAgKiBvciBYWVpXLiAgTm90ZSB0aGF0IDAgYW5kIDEgYXJlIHZhbGlkIGluIGJvdGgsIHNvIGJvdGggbWFza3MKKwkgICAgKiBjYW4gaGF2ZSBzb21lIGJpdHMgc2V0LgorCSAgICAqCisJICAgICogV2Ugc29tZXdoYXQgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjIGhlcmUuICBJdCB3b3VsZCBiZSByZWFsbHkgaGFyZAorCSAgICAqIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY29tcG9uZW50IGlzIHRoZSBlcnJvciwgYW5kIHRoZXJlIHByb2JhYmx5CisJICAgICogaXNuJ3QgYSBsb3Qgb2YgYmVuZWZpdC4KKwkgICAgKi8KKwkgICBpZiAoKHJnYmFfdmFsaWQgIT0gMHgwZikgJiYgKHh5endfdmFsaWQgIT0gMHgwZikpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICg3KV0pLCBzdGF0ZSwgImNhbm5vdCBjb21iaW5lIFJHQkEgYW5kIFhZWlcgc3dpenpsZSAiCisJCSAgICAgICJjb21wb25lbnRzIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAoeXl2YWwuc3dpel9tYXNrKS5zd2l6emxlID0gTUFLRV9TV0laWkxFNCgoeXl2c3BbKDEpIC0gKDcpXS5leHRfc3dpenpsZSkuc3d6LCAoeXl2c3BbKDMpIC0gKDcpXS5leHRfc3dpenpsZSkuc3d6LCAoeXl2c3BbKDUpIC0gKDcpXS5leHRfc3dpenpsZSkuc3d6LCAoeXl2c3BbKDcpIC0gKDcpXS5leHRfc3dpenpsZSkuc3d6KTsKKwkgICAoeXl2YWwuc3dpel9tYXNrKS5tYXNrID0gKCh5eXZzcFsoMSkgLSAoNyldLmV4dF9zd2l6emxlKS5uZWdhdGUpIHwgKCh5eXZzcFsoMykgLSAoNyldLmV4dF9zd2l6emxlKS5uZWdhdGUgPDwgMSkgfCAoKHl5dnNwWyg1KSAtICg3KV0uZXh0X3N3aXp6bGUpLm5lZ2F0ZSA8PCAyKQorCSAgICAgIHwgKCh5eXZzcFsoNykgLSAoNyldLmV4dF9zd2l6emxlKS5uZWdhdGUgPDwgMyk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNTc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNzA0ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmV4dF9zd2l6emxlKSA9ICh5eXZzcFsoMikgLSAoMildLmV4dF9zd2l6emxlKTsKKwkgICAoeXl2YWwuZXh0X3N3aXp6bGUpLm5lZ2F0ZSA9ICgoeXl2c3BbKDEpIC0gKDIpXS5uZWdhdGUpKSA/IDEgOiAwOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDU4OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDcxMSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICgoKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcikgIT0gMCkgJiYgKCh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpICE9IDEpKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIGV4dGVuZGVkIHN3aXp6bGUgc2VsZWN0b3IiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICh5eXZhbC5leHRfc3dpenpsZSkuc3d6ID0gKCh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpID09IDApID8gU1dJWlpMRV9aRVJPIDogU1dJWlpMRV9PTkU7CisgICAgICAgICAgICh5eXZhbC5leHRfc3dpenpsZSkubmVnYXRlID0gMDsKKworCSAgIC8qIDAgYW5kIDEgYXJlIHZhbGlkIGZvciBib3RoIFJHQkEgc3dpenpsZSBuYW1lcyBhbmQgWFlaVworCSAgICAqIHN3aXp6bGUgbmFtZXMuCisJICAgICovCisJICAgKHl5dmFsLmV4dF9zd2l6emxlKS54eXp3X3ZhbGlkID0gMTsKKwkgICAoeXl2YWwuZXh0X3N3aXp6bGUpLnJnYmFfdmFsaWQgPSAxOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDU5OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDcyNyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGNoYXIgczsKKworCSAgIGlmIChzdHJsZW4oKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSkgPiAxKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIGV4dGVuZGVkIHN3aXp6bGUgc2VsZWN0b3IiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIHMgPSAoeXl2c3BbKDEpIC0gKDEpXS5zdHJpbmcpWzBdOworCSAgIGZyZWUoKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSk7CisKKyAgICAgICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS5yZ2JhX3ZhbGlkID0gMDsKKyAgICAgICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS54eXp3X3ZhbGlkID0gMDsKKyAgICAgICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS5uZWdhdGUgPSAwOworCisJICAgc3dpdGNoIChzKSB7CisJICAgY2FzZSAneCc6CisJICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS5zd3ogPSBTV0laWkxFX1g7CisJICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS54eXp3X3ZhbGlkID0gMTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlICd5JzoKKwkgICAgICAoeXl2YWwuZXh0X3N3aXp6bGUpLnN3eiA9IFNXSVpaTEVfWTsKKwkgICAgICAoeXl2YWwuZXh0X3N3aXp6bGUpLnh5endfdmFsaWQgPSAxOworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgJ3onOgorCSAgICAgICh5eXZhbC5leHRfc3dpenpsZSkuc3d6ID0gU1dJWlpMRV9aOworCSAgICAgICh5eXZhbC5leHRfc3dpenpsZSkueHl6d192YWxpZCA9IDE7CisJICAgICAgYnJlYWs7CisJICAgY2FzZSAndyc6CisJICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS5zd3ogPSBTV0laWkxFX1c7CisJICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS54eXp3X3ZhbGlkID0gMTsKKwkgICAgICBicmVhazsKKworCSAgIGNhc2UgJ3InOgorCSAgICAgICh5eXZhbC5leHRfc3dpenpsZSkuc3d6ID0gU1dJWlpMRV9YOworCSAgICAgICh5eXZhbC5leHRfc3dpenpsZSkucmdiYV92YWxpZCA9IDE7CisJICAgICAgYnJlYWs7CisJICAgY2FzZSAnZyc6CisJICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS5zd3ogPSBTV0laWkxFX1k7CisJICAgICAgKHl5dmFsLmV4dF9zd2l6emxlKS5yZ2JhX3ZhbGlkID0gMTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlICdiJzoKKwkgICAgICAoeXl2YWwuZXh0X3N3aXp6bGUpLnN3eiA9IFNXSVpaTEVfWjsKKwkgICAgICAoeXl2YWwuZXh0X3N3aXp6bGUpLnJnYmFfdmFsaWQgPSAxOworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgJ2EnOgorCSAgICAgICh5eXZhbC5leHRfc3dpenpsZSkuc3d6ID0gU1dJWlpMRV9XOworCSAgICAgICh5eXZhbC5leHRfc3dpenpsZSkucmdiYV92YWxpZCA9IDE7CisJICAgICAgYnJlYWs7CisKKwkgICBkZWZhdWx0OgorCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCBleHRlbmRlZCBzd2l6emxlIHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICAgICBicmVhazsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNjA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgNzg2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgKmNvbnN0IHMgPSAoc3RydWN0IGFzbV9zeW1ib2wgKikKKwkgICAgICBfbWVzYV9zeW1ib2xfdGFibGVfZmluZF9zeW1ib2woc3RhdGUtPnN0LCAwLCAoeXl2c3BbKDEpIC0gKDEpXS5zdHJpbmcpKTsKKworCSAgIGZyZWUoKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSk7CisKKwkgICBpZiAocyA9PSBOVUxMKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIG9wZXJhbmQgdmFyaWFibGUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSBpZiAoKHMtPnR5cGUgIT0gYXRfcGFyYW0pICYmIChzLT50eXBlICE9IGF0X3RlbXApCisJCSAgICAgICYmIChzLT50eXBlICE9IGF0X2F0dHJpYikpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgb3BlcmFuZCB2YXJpYWJsZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIGlmICgocy0+dHlwZSA9PSBhdF9wYXJhbSkgJiYgcy0+cGFyYW1faXNfYXJyYXkpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgIm5vbi1hcnJheSBhY2Nlc3MgdG8gYXJyYXkgUEFSQU0iKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIGluaXRfc3JjX3JlZygmICh5eXZhbC5zcmNfcmVnKSk7CisJICAgc3dpdGNoIChzLT50eXBlKSB7CisJICAgY2FzZSBhdF90ZW1wOgorCSAgICAgIHNldF9zcmNfcmVnKCYgKHl5dmFsLnNyY19yZWcpLCBQUk9HUkFNX1RFTVBPUkFSWSwgcy0+dGVtcF9iaW5kaW5nKTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIGF0X3BhcmFtOgorICAgICAgICAgICAgICBzZXRfc3JjX3JlZ19zd3ooJiAoeXl2YWwuc3JjX3JlZyksIHMtPnBhcmFtX2JpbmRpbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhcmFtX2JpbmRpbmdfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wYXJhbV9iaW5kaW5nX3N3aXp6bGUpOworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgYXRfYXR0cmliOgorCSAgICAgIHNldF9zcmNfcmVnKCYgKHl5dmFsLnNyY19yZWcpLCBQUk9HUkFNX0lOUFVULCBzLT5hdHRyaWJfYmluZGluZyk7CisJICAgICAgc3RhdGUtPnByb2ctPklucHV0c1JlYWQgfD0gQklURklFTEQ2NF9CSVQoKHl5dmFsLnNyY19yZWcpLkJhc2UuSW5kZXgpOworCisJICAgICAgaWYgKCF2YWxpZGF0ZV9pbnB1dHMoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlKSkgeworCQkgWVlFUlJPUjsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisKKwkgICBkZWZhdWx0OgorCSAgICAgIFlZRVJST1I7CisJICAgICAgYnJlYWs7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDYxOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDgyOSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIHNldF9zcmNfcmVnKCYgKHl5dmFsLnNyY19yZWcpLCBQUk9HUkFNX0lOUFVULCAoeXl2c3BbKDEpIC0gKDEpXS5hdHRyaWIpKTsKKwkgICBzdGF0ZS0+cHJvZy0+SW5wdXRzUmVhZCB8PSBCSVRGSUVMRDY0X0JJVCgoeXl2YWwuc3JjX3JlZykuQmFzZS5JbmRleCk7CisKKwkgICBpZiAoIXZhbGlkYXRlX2lucHV0cygmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUpKSB7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNjI6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgODM4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCEgKHl5dnNwWygzKSAtICg0KV0uc3JjX3JlZykuQmFzZS5SZWxBZGRyCisJICAgICAgICYmICgodW5zaWduZWQpICh5eXZzcFsoMykgLSAoNCldLnNyY19yZWcpLkJhc2UuSW5kZXggPj0gKHl5dnNwWygxKSAtICg0KV0uc3ltKS0+cGFyYW1fYmluZGluZ19sZW5ndGgpKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMykgLSAoNCldKSwgc3RhdGUsICJvdXQgb2YgYm91bmRzIGFycmF5IGFjY2VzcyIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgaW5pdF9zcmNfcmVnKCYgKHl5dmFsLnNyY19yZWcpKTsKKwkgICAoeXl2YWwuc3JjX3JlZykuQmFzZS5GaWxlID0gKHl5dnNwWygxKSAtICg0KV0uc3ltKS0+cGFyYW1fYmluZGluZ190eXBlOworCisJICAgaWYgKCh5eXZzcFsoMykgLSAoNCldLnNyY19yZWcpLkJhc2UuUmVsQWRkcikgeworICAgICAgICAgICAgICBzdGF0ZS0+cHJvZy0+SW5kaXJlY3RSZWdpc3RlckZpbGVzIHw9ICgxIDw8ICh5eXZhbC5zcmNfcmVnKS5CYXNlLkZpbGUpOworCSAgICAgICh5eXZzcFsoMSkgLSAoNCldLnN5bSktPnBhcmFtX2FjY2Vzc2VkX2luZGlyZWN0bHkgPSAxOworCisJICAgICAgKHl5dmFsLnNyY19yZWcpLkJhc2UuUmVsQWRkciA9IDE7CisJICAgICAgKHl5dmFsLnNyY19yZWcpLkJhc2UuSW5kZXggPSAoeXl2c3BbKDMpIC0gKDQpXS5zcmNfcmVnKS5CYXNlLkluZGV4OworCSAgICAgICh5eXZhbC5zcmNfcmVnKS5TeW1ib2wgPSAoeXl2c3BbKDEpIC0gKDQpXS5zeW0pOworCSAgIH0gZWxzZSB7CisJICAgICAgKHl5dmFsLnNyY19yZWcpLkJhc2UuSW5kZXggPSAoeXl2c3BbKDEpIC0gKDQpXS5zeW0pLT5wYXJhbV9iaW5kaW5nX2JlZ2luICsgKHl5dnNwWygzKSAtICg0KV0uc3JjX3JlZykuQmFzZS5JbmRleDsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNjM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgODYwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisgICAgICAgICAgIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSA9ICgoeXl2c3BbKDEpIC0gKDEpXS50ZW1wX3N5bSkubmFtZSAhPSBOVUxMKSAKKwkgICAgICA/ICh5eXZzcFsoMSkgLSAoMSldLnRlbXBfc3ltKS5wYXJhbV9iaW5kaW5nX3R5cGUKKwkgICAgICA6IFBST0dSQU1fQ09OU1RBTlQ7CisgICAgICAgICAgIHNldF9zcmNfcmVnX3N3eigmICh5eXZhbC5zcmNfcmVnKSwgZmlsZSwgKHl5dnNwWygxKSAtICgxKV0udGVtcF9zeW0pLnBhcmFtX2JpbmRpbmdfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoeXl2c3BbKDEpIC0gKDEpXS50ZW1wX3N5bSkucGFyYW1fYmluZGluZ19zd2l6emxlKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2NDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA4NzAgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBzZXRfZHN0X3JlZygmICh5eXZhbC5kc3RfcmVnKSwgUFJPR1JBTV9PVVRQVVQsICh5eXZzcFsoMSkgLSAoMSldLnJlc3VsdCkpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDY1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDg3NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIHN0cnVjdCBhc21fc3ltYm9sICpjb25zdCBzID0gKHN0cnVjdCBhc21fc3ltYm9sICopCisJICAgICAgX21lc2Ffc3ltYm9sX3RhYmxlX2ZpbmRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSk7CisKKwkgICBmcmVlKCh5eXZzcFsoMSkgLSAoMSldLnN0cmluZykpOworCisJICAgaWYgKHMgPT0gTlVMTCkgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCBvcGVyYW5kIHZhcmlhYmxlIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgaWYgKChzLT50eXBlICE9IGF0X291dHB1dCkgJiYgKHMtPnR5cGUgIT0gYXRfdGVtcCkpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgb3BlcmFuZCB2YXJpYWJsZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgc3dpdGNoIChzLT50eXBlKSB7CisJICAgY2FzZSBhdF90ZW1wOgorCSAgICAgIHNldF9kc3RfcmVnKCYgKHl5dmFsLmRzdF9yZWcpLCBQUk9HUkFNX1RFTVBPUkFSWSwgcy0+dGVtcF9iaW5kaW5nKTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIGF0X291dHB1dDoKKwkgICAgICBzZXRfZHN0X3JlZygmICh5eXZhbC5kc3RfcmVnKSwgUFJPR1JBTV9PVVRQVVQsIHMtPm91dHB1dF9iaW5kaW5nKTsKKwkgICAgICBicmVhazsKKwkgICBkZWZhdWx0OgorCSAgICAgIHNldF9kc3RfcmVnKCYgKHl5dmFsLmRzdF9yZWcpLCBzLT5wYXJhbV9iaW5kaW5nX3R5cGUsIHMtPnBhcmFtX2JpbmRpbmdfYmVnaW4pOworCSAgICAgIGJyZWFrOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2NjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA5MDMgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqY29uc3QgcyA9IChzdHJ1Y3QgYXNtX3N5bWJvbCAqKQorCSAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbChzdGF0ZS0+c3QsIDAsICh5eXZzcFsoMSkgLSAoMSldLnN0cmluZykpOworCisJICAgZnJlZSgoeXl2c3BbKDEpIC0gKDEpXS5zdHJpbmcpKTsKKworCSAgIGlmIChzID09IE5VTEwpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgb3BlcmFuZCB2YXJpYWJsZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIGlmICgocy0+dHlwZSAhPSBhdF9wYXJhbSkgfHwgIXMtPnBhcmFtX2lzX2FycmF5KSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJhcnJheSBhY2Nlc3MgdG8gbm9uLVBBUkFNIHZhcmlhYmxlIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgICh5eXZhbC5zeW0pID0gczsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNjk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgOTI0ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaW5pdF9zcmNfcmVnKCYgKHl5dmFsLnNyY19yZWcpKTsKKwkgICAoeXl2YWwuc3JjX3JlZykuQmFzZS5JbmRleCA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDcwOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDkzMSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIC8qIEZJTklTSE1FOiBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgYWRkcmVzcyByZWdpc3RlcnMuCisJICAgICovCisJICAgLyogRklOSVNITUU6IEFkZCBzdXBwb3J0IGZvciA0LWNvbXBvbmVudCBhZGRyZXNzIHJlZ2lzdGVycy4KKwkgICAgKi8KKwkgICBpbml0X3NyY19yZWcoJiAoeXl2YWwuc3JjX3JlZykpOworCSAgICh5eXZhbC5zcmNfcmVnKS5CYXNlLlJlbEFkZHIgPSAxOworCSAgICh5eXZhbC5zcmNfcmVnKS5CYXNlLkluZGV4ID0gKHl5dnNwWygzKSAtICgzKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgNzE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgOTQyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDcyOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDk0MyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlZ2VyKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNzM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgOTQ0ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IC0oeXl2c3BbKDIpIC0gKDIpXS5pbnRlZ2VyKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgNzQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgOTQ4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCgoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA8IDApIHx8ICgoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA+IChzdGF0ZS0+bGltaXRzLT5NYXhBZGRyZXNzT2Zmc2V0IC0gMSkpKSB7CisgICAgICAgICAgICAgIGNoYXIgc1sxMDBdOworICAgICAgICAgICAgICBfbWVzYV9zbnByaW50ZihzLCBzaXplb2YocyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBhZGRyZXNzIG9mZnNldCB0b28gbGFyZ2UgKCVkKSIsICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpKTsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgcyk7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA5NjIgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoKCh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpIDwgMCkgfHwgKCh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpID4gc3RhdGUtPmxpbWl0cy0+TWF4QWRkcmVzc09mZnNldCkpIHsKKyAgICAgICAgICAgICAgY2hhciBzWzEwMF07CisgICAgICAgICAgICAgIF9tZXNhX3NucHJpbnRmKHMsIHNpemVvZihzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIGFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSAoJWQpIiwgKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcikpOworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCBzKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDc2OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDk3NiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIHN0cnVjdCBhc21fc3ltYm9sICpjb25zdCBzID0gKHN0cnVjdCBhc21fc3ltYm9sICopCisJICAgICAgX21lc2Ffc3ltYm9sX3RhYmxlX2ZpbmRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSk7CisKKwkgICBmcmVlKCh5eXZzcFsoMSkgLSAoMSldLnN0cmluZykpOworCisJICAgaWYgKHMgPT0gTlVMTCkgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCBhcnJheSBtZW1iZXIiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSBpZiAocy0+dHlwZSAhPSBhdF9hZGRyZXNzKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsCisJCSAgICAgICJpbnZhbGlkIHZhcmlhYmxlIGZvciBpbmRleGVkIGFycmF5IGFjY2VzcyIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICAoeXl2YWwuc3ltKSA9IHM7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDc3OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDk5NiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICgoeXl2c3BbKDEpIC0gKDEpXS5zd2l6X21hc2spLm1hc2sgIT0gV1JJVEVNQVNLX1gpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgYWRkcmVzcyBjb21wb25lbnQgc2VsZWN0b3IiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgKHl5dmFsLnN3aXpfbWFzaykgPSAoeXl2c3BbKDEpIC0gKDEpXS5zd2l6X21hc2spOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3ODoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMDA3ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCh5eXZzcFsoMSkgLSAoMSldLnN3aXpfbWFzaykubWFzayAhPSBXUklURU1BU0tfWCkgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLAorCQkgICAgICAiYWRkcmVzcyByZWdpc3RlciB3cml0ZSBtYXNrIG11c3QgYmUgXCIueFwiIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgICh5eXZhbC5zd2l6X21hc2spID0gKHl5dnNwWygxKSAtICgxKV0uc3dpel9tYXNrKTsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgODM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTAyMyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyAoeXl2YWwuc3dpel9tYXNrKS5zd2l6emxlID0gU1dJWlpMRV9OT09QOyAoeXl2YWwuc3dpel9tYXNrKS5tYXNrID0gV1JJVEVNQVNLX1hZWlc7IH0KKyAgICBicmVhazsKKworICBjYXNlIDg4OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEwMjcgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsgKHl5dmFsLnN3aXpfbWFzaykuc3dpenpsZSA9IFNXSVpaTEVfTk9PUDsgKHl5dmFsLnN3aXpfbWFzaykubWFzayA9IFdSSVRFTUFTS19YWVpXOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4OToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMDMxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmRzdF9yZWcpID0gKHl5dnNwWygyKSAtICgzKV0uZHN0X3JlZyk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgOTA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTAzNSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5kc3RfcmVnKSA9ICh5eXZzcFsoMikgLSAoMyldLmRzdF9yZWcpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDkxOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEwMzkgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuZHN0X3JlZykuQ29uZE1hc2sgPSBDT05EX1RSOworCSAgICh5eXZhbC5kc3RfcmVnKS5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5MjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMDQ2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmRzdF9yZWcpID0gKHl5dnNwWygxKSAtICgyKV0uZHN0X3JlZyk7CisJICAgKHl5dmFsLmRzdF9yZWcpLkNvbmRTd2l6emxlID0gKHl5dnNwWygyKSAtICgyKV0uc3dpel9tYXNrKS5zd2l6emxlOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDkzOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEwNTMgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuZHN0X3JlZykgPSAoeXl2c3BbKDEpIC0gKDIpXS5kc3RfcmVnKTsKKwkgICAoeXl2YWwuZHN0X3JlZykuQ29uZFN3aXp6bGUgPSAoeXl2c3BbKDIpIC0gKDIpXS5zd2l6X21hc2spLnN3aXp6bGU7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgOTQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTA2MCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGNvbnN0IGludCBjb25kID0gX21lc2FfcGFyc2VfY2MoKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSk7CisJICAgaWYgKChjb25kID09IDApIHx8ICgoeXl2c3BbKDEpIC0gKDEpXS5zdHJpbmcpWzJdICE9ICdcMCcpKSB7CisJICAgICAgY2hhciAqY29uc3QgZXJyX3N0ciA9CisJCSBtYWtlX2Vycm9yX3N0cmluZygiaW52YWxpZCBjb25kaXRpb24gY29kZSBcIiVzXCIiLCAoeXl2c3BbKDEpIC0gKDEpXS5zdHJpbmcpKTsKKworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAoZXJyX3N0ciAhPSBOVUxMKQorCQkgICAgICA/IGVycl9zdHIgOiAiaW52YWxpZCBjb25kaXRpb24gY29kZSIpOworCisJICAgICAgaWYgKGVycl9zdHIgIT0gTlVMTCkgeworCQkgZnJlZShlcnJfc3RyKTsKKwkgICAgICB9CisKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICh5eXZhbC5kc3RfcmVnKS5Db25kTWFzayA9IGNvbmQ7CisJICAgKHl5dmFsLmRzdF9yZWcpLkNvbmRTd2l6emxlID0gU1dJWlpMRV9OT09QOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDk1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEwODIgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBjb25zdCBpbnQgY29uZCA9IF9tZXNhX3BhcnNlX2NjKCh5eXZzcFsoMSkgLSAoMSldLnN0cmluZykpOworCSAgIGlmICgoY29uZCA9PSAwKSB8fCAoKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKVsyXSAhPSAnXDAnKSkgeworCSAgICAgIGNoYXIgKmNvbnN0IGVycl9zdHIgPQorCQkgbWFrZV9lcnJvcl9zdHJpbmcoImludmFsaWQgY29uZGl0aW9uIGNvZGUgXCIlc1wiIiwgKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSk7CisKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgKGVycl9zdHIgIT0gTlVMTCkKKwkJICAgICAgPyBlcnJfc3RyIDogImludmFsaWQgY29uZGl0aW9uIGNvZGUiKTsKKworCSAgICAgIGlmIChlcnJfc3RyICE9IE5VTEwpIHsKKwkJIGZyZWUoZXJyX3N0cik7CisJICAgICAgfQorCisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAoeXl2YWwuZHN0X3JlZykuQ29uZE1hc2sgPSBjb25kOworCSAgICh5eXZhbC5kc3RfcmVnKS5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDI6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTExMiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIHN0cnVjdCBhc21fc3ltYm9sICpjb25zdCBzID0KKwkgICAgICBkZWNsYXJlX3ZhcmlhYmxlKHN0YXRlLCAoeXl2c3BbKDIpIC0gKDQpXS5zdHJpbmcpLCBhdF9hdHRyaWIsICYgKHl5bHNwWygyKSAtICg0KV0pKTsKKworCSAgIGlmIChzID09IE5VTEwpIHsKKwkgICAgICBmcmVlKCh5eXZzcFsoMikgLSAoNCldLnN0cmluZykpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICBzLT5hdHRyaWJfYmluZGluZyA9ICh5eXZzcFsoNCkgLSAoNCldLmF0dHJpYik7CisJICAgICAgc3RhdGUtPklucHV0c0JvdW5kIHw9IEJJVEZJRUxENjRfQklUKHMtPmF0dHJpYl9iaW5kaW5nKTsKKworCSAgICAgIGlmICghdmFsaWRhdGVfaW5wdXRzKCYgKHl5bHNwWyg0KSAtICg0KV0pLCBzdGF0ZSkpIHsKKwkJIFlZRVJST1I7CisJICAgICAgfQorCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTEzMSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gKHl5dnNwWygyKSAtICgyKV0uYXR0cmliKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTEzNSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gKHl5dnNwWygyKSAtICgyKV0uYXR0cmliKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTE0MSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gVkVSVF9BVFRSSUJfUE9TOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDEwNjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMTQ1ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmF0dHJpYikgPSBWRVJUX0FUVFJJQl9XRUlHSFQ7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTA3OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExNDkgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuYXR0cmliKSA9IFZFUlRfQVRUUklCX05PUk1BTDsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTE1MyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gVkVSVF9BVFRSSUJfQ09MT1IwICsgKHl5dnNwWygyKSAtICgyKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTA5OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExNTcgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuYXR0cmliKSA9IFZFUlRfQVRUUklCX0ZPRzsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTE2MSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gVkVSVF9BVFRSSUJfVEVYMCArICh5eXZzcFsoMikgLSAoMildLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDExMToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMTY1ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoNCldKSwgc3RhdGUsICJHTF9BUkJfbWF0cml4X3BhbGV0dGUgbm90IHN1cHBvcnRlZCIpOworCSAgIFlZRVJST1I7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTEyOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExNzAgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuYXR0cmliKSA9IFZFUlRfQVRUUklCX0dFTkVSSUMwICsgKHl5dnNwWygzKSAtICg0KV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTEzOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExNzYgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoKHVuc2lnbmVkKSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA+PSBzdGF0ZS0+bGltaXRzLT5NYXhBdHRyaWJzKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIHZlcnRleCBhdHRyaWJ1dGUgcmVmZXJlbmNlIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTE5MCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gVkFSWUlOR19TTE9UX1BPUzsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTE5NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gVkFSWUlOR19TTE9UX0NPTDAgKyAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTE5OCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5hdHRyaWIpID0gVkFSWUlOR19TTE9UX0ZPR0M7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTIwOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEyMDIgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuYXR0cmliKSA9IFZBUllJTkdfU0xPVF9URVgwICsgKHl5dnNwWygyKSAtICgyKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTIzOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEyMTAgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqY29uc3QgcyA9CisJICAgICAgZGVjbGFyZV92YXJpYWJsZShzdGF0ZSwgKHl5dnNwWygyKSAtICgzKV0uc3RyaW5nKSwgYXRfcGFyYW0sICYgKHl5bHNwWygyKSAtICgzKV0pKTsKKworCSAgIGlmIChzID09IE5VTEwpIHsKKwkgICAgICBmcmVlKCh5eXZzcFsoMikgLSAoMyldLnN0cmluZykpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICBzLT5wYXJhbV9iaW5kaW5nX3R5cGUgPSAoeXl2c3BbKDMpIC0gKDMpXS50ZW1wX3N5bSkucGFyYW1fYmluZGluZ190eXBlOworCSAgICAgIHMtPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSAoeXl2c3BbKDMpIC0gKDMpXS50ZW1wX3N5bSkucGFyYW1fYmluZGluZ19iZWdpbjsKKwkgICAgICBzLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCA9ICh5eXZzcFsoMykgLSAoMyldLnRlbXBfc3ltKS5wYXJhbV9iaW5kaW5nX2xlbmd0aDsKKyAgICAgICAgICAgICAgcy0+cGFyYW1fYmluZGluZ19zd2l6emxlID0gKHl5dnNwWygzKSAtICgzKV0udGVtcF9zeW0pLnBhcmFtX2JpbmRpbmdfc3dpenpsZTsKKwkgICAgICBzLT5wYXJhbV9pc19hcnJheSA9IDA7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDEyNDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMjI4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCgoeXl2c3BbKDQpIC0gKDYpXS5pbnRlZ2VyKSAhPSAwKSAmJiAoKHVuc2lnbmVkKSAoeXl2c3BbKDQpIC0gKDYpXS5pbnRlZ2VyKSAhPSAoeXl2c3BbKDYpIC0gKDYpXS50ZW1wX3N5bSkucGFyYW1fYmluZGluZ19sZW5ndGgpKSB7CisJICAgICAgZnJlZSgoeXl2c3BbKDIpIC0gKDYpXS5zdHJpbmcpKTsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWyg0KSAtICg2KV0pLCBzdGF0ZSwgCisJCSAgICAgICJwYXJhbWV0ZXIgYXJyYXkgc2l6ZSBhbmQgbnVtYmVyIG9mIGJpbmRpbmdzIG11c3QgbWF0Y2giKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgc3RydWN0IGFzbV9zeW1ib2wgKmNvbnN0IHMgPQorCQkgZGVjbGFyZV92YXJpYWJsZShzdGF0ZSwgKHl5dnNwWygyKSAtICg2KV0uc3RyaW5nKSwgKHl5dnNwWyg2KSAtICg2KV0udGVtcF9zeW0pLnR5cGUsICYgKHl5bHNwWygyKSAtICg2KV0pKTsKKworCSAgICAgIGlmIChzID09IE5VTEwpIHsKKwkJIGZyZWUoKHl5dnNwWygyKSAtICg2KV0uc3RyaW5nKSk7CisJCSBZWUVSUk9SOworCSAgICAgIH0gZWxzZSB7CisJCSBzLT5wYXJhbV9iaW5kaW5nX3R5cGUgPSAoeXl2c3BbKDYpIC0gKDYpXS50ZW1wX3N5bSkucGFyYW1fYmluZGluZ190eXBlOworCQkgcy0+cGFyYW1fYmluZGluZ19iZWdpbiA9ICh5eXZzcFsoNikgLSAoNildLnRlbXBfc3ltKS5wYXJhbV9iaW5kaW5nX2JlZ2luOworCQkgcy0+cGFyYW1fYmluZGluZ19sZW5ndGggPSAoeXl2c3BbKDYpIC0gKDYpXS50ZW1wX3N5bSkucGFyYW1fYmluZGluZ19sZW5ndGg7CisgICAgICAgICAgICAgICAgIHMtPnBhcmFtX2JpbmRpbmdfc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKwkJIHMtPnBhcmFtX2lzX2FycmF5ID0gMTsKKwkgICAgICB9CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDEyNToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMjUzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gMDsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTI1NyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICgoKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcikgPCAxKSB8fCAoKHVuc2lnbmVkKSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA+IHN0YXRlLT5saW1pdHMtPk1heFBhcmFtZXRlcnMpKSB7CisgICAgICAgICAgICAgIGNoYXIgbXNnWzEwMF07CisgICAgICAgICAgICAgIF9tZXNhX3NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHBhcmFtZXRlciBhcnJheSBzaXplIChzaXplPSVkIG1heD0ldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSwgc3RhdGUtPmxpbWl0cy0+TWF4UGFyYW1ldGVycyk7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsIG1zZyk7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTI3MiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC50ZW1wX3N5bSkgPSAoeXl2c3BbKDIpIC0gKDIpXS50ZW1wX3N5bSk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTI4OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEyNzggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwudGVtcF9zeW0pID0gKHl5dnNwWygzKSAtICg0KV0udGVtcF9zeW0pOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDEzMDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMjg1ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dnNwWygxKSAtICgzKV0udGVtcF9zeW0pLnBhcmFtX2JpbmRpbmdfbGVuZ3RoICs9ICh5eXZzcFsoMykgLSAoMyldLnRlbXBfc3ltKS5wYXJhbV9iaW5kaW5nX2xlbmd0aDsKKwkgICAoeXl2YWwudGVtcF9zeW0pID0gKHl5dnNwWygxKSAtICgzKV0udGVtcF9zeW0pOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDEzMToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMjkyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgbWVtc2V0KCYgKHl5dmFsLnRlbXBfc3ltKSwgMCwgc2l6ZW9mKCh5eXZhbC50ZW1wX3N5bSkpKTsKKwkgICAoeXl2YWwudGVtcF9zeW0pLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3N0YXRlKHN0YXRlLT5wcm9nLCAmICh5eXZhbC50ZW1wX3N5bSksICh5eXZzcFsoMSkgLSAoMSldLnN0YXRlKSk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTMyOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEyOTggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBtZW1zZXQoJiAoeXl2YWwudGVtcF9zeW0pLCAwLCBzaXplb2YoKHl5dmFsLnRlbXBfc3ltKSkpOworCSAgICh5eXZhbC50ZW1wX3N5bSkucGFyYW1fYmluZGluZ19iZWdpbiA9IH4wOworCSAgIGluaXRpYWxpemVfc3ltYm9sX2Zyb21fcGFyYW0oc3RhdGUtPnByb2csICYgKHl5dmFsLnRlbXBfc3ltKSwgKHl5dnNwWygxKSAtICgxKV0uc3RhdGUpKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMzM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTMwNCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgmICh5eXZhbC50ZW1wX3N5bSksIDAsIHNpemVvZigoeXl2YWwudGVtcF9zeW0pKSk7CisJICAgKHl5dmFsLnRlbXBfc3ltKS5wYXJhbV9iaW5kaW5nX2JlZ2luID0gfjA7CisJICAgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdGF0ZS0+cHJvZywgJiAoeXl2YWwudGVtcF9zeW0pLCAmICh5eXZzcFsoMSkgLSAoMSldLnZlY3RvciksIEdMX1RSVUUpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDEzNDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMzEyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgbWVtc2V0KCYgKHl5dmFsLnRlbXBfc3ltKSwgMCwgc2l6ZW9mKCh5eXZhbC50ZW1wX3N5bSkpKTsKKwkgICAoeXl2YWwudGVtcF9zeW0pLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3N0YXRlKHN0YXRlLT5wcm9nLCAmICh5eXZhbC50ZW1wX3N5bSksICh5eXZzcFsoMSkgLSAoMSldLnN0YXRlKSk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTM1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEzMTggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBtZW1zZXQoJiAoeXl2YWwudGVtcF9zeW0pLCAwLCBzaXplb2YoKHl5dmFsLnRlbXBfc3ltKSkpOworCSAgICh5eXZhbC50ZW1wX3N5bSkucGFyYW1fYmluZGluZ19iZWdpbiA9IH4wOworCSAgIGluaXRpYWxpemVfc3ltYm9sX2Zyb21fcGFyYW0oc3RhdGUtPnByb2csICYgKHl5dmFsLnRlbXBfc3ltKSwgKHl5dnNwWygxKSAtICgxKV0uc3RhdGUpKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMzY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTMyNCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgmICh5eXZhbC50ZW1wX3N5bSksIDAsIHNpemVvZigoeXl2YWwudGVtcF9zeW0pKSk7CisJICAgKHl5dmFsLnRlbXBfc3ltKS5wYXJhbV9iaW5kaW5nX2JlZ2luID0gfjA7CisJICAgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdGF0ZS0+cHJvZywgJiAoeXl2YWwudGVtcF9zeW0pLCAmICh5eXZzcFsoMSkgLSAoMSldLnZlY3RvciksIEdMX1RSVUUpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDEzNzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMzMyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgbWVtc2V0KCYgKHl5dmFsLnRlbXBfc3ltKSwgMCwgc2l6ZW9mKCh5eXZhbC50ZW1wX3N5bSkpKTsKKwkgICAoeXl2YWwudGVtcF9zeW0pLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3N0YXRlKHN0YXRlLT5wcm9nLCAmICh5eXZhbC50ZW1wX3N5bSksICh5eXZzcFsoMSkgLSAoMSldLnN0YXRlKSk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTM4OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEzMzggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBtZW1zZXQoJiAoeXl2YWwudGVtcF9zeW0pLCAwLCBzaXplb2YoKHl5dmFsLnRlbXBfc3ltKSkpOworCSAgICh5eXZhbC50ZW1wX3N5bSkucGFyYW1fYmluZGluZ19iZWdpbiA9IH4wOworCSAgIGluaXRpYWxpemVfc3ltYm9sX2Zyb21fcGFyYW0oc3RhdGUtPnByb2csICYgKHl5dmFsLnRlbXBfc3ltKSwgKHl5dnNwWygxKSAtICgxKV0uc3RhdGUpKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMzk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM0NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgmICh5eXZhbC50ZW1wX3N5bSksIDAsIHNpemVvZigoeXl2YWwudGVtcF9zeW0pKSk7CisJICAgKHl5dmFsLnRlbXBfc3ltKS5wYXJhbV9iaW5kaW5nX2JlZ2luID0gfjA7CisJICAgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdGF0ZS0+cHJvZywgJiAoeXl2YWwudGVtcF9zeW0pLCAmICh5eXZzcFsoMSkgLSAoMSldLnZlY3RvciksIEdMX0ZBTFNFKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM1MSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygxKSAtICgxKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM1MiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDI6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM1NSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM1NiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM1NyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM1OCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM1OSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM2MCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM2MSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNDk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM2MiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM2MyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM2NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTI6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM2NSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyBtZW1jcHkoKHl5dmFsLnN0YXRlKSwgKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM2OSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgoeXl2YWwuc3RhdGUpLCAwLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSBTVEFURV9NQVRFUklBTDsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gKHl5dnNwWygyKSAtICgzKV0uaW50ZWdlcik7CisJICAgKHl5dmFsLnN0YXRlKVsyXSA9ICh5eXZzcFsoMykgLSAoMyldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE1NDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxMzc4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTU1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEzODIgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW50ZWdlcikgPSBTVEFURV9FTUlTU0lPTjsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM4NiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9IFNUQVRFX1NISU5JTkVTUzsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNTc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTM5MiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgoeXl2YWwuc3RhdGUpLCAwLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSBTVEFURV9MSUdIVDsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gKHl5dnNwWygzKSAtICg1KV0uaW50ZWdlcik7CisJICAgKHl5dmFsLnN0YXRlKVsyXSA9ICh5eXZzcFsoNSkgLSAoNSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE1ODoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNDAxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTU5OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0MDUgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW50ZWdlcikgPSBTVEFURV9QT1NJVElPTjsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTQwOSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICghc3RhdGUtPmN0eC0+RXh0ZW5zaW9ucy5FWFRfcG9pbnRfcGFyYW1ldGVycykgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfQVRURU5VQVRJT047CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTYxOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0MTggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDIpIC0gKDIpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjI6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTQyMiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9IFNUQVRFX0hBTEZfVkVDVE9SOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE2MzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNDI4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfU1BPVF9ESVJFQ1RJT047CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTY0OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0MzQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gKHl5dnNwWygyKSAtICgyKV0uc3RhdGUpWzBdOworCSAgICh5eXZhbC5zdGF0ZSlbMV0gPSAoeXl2c3BbKDIpIC0gKDIpXS5zdGF0ZSlbMV07CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTY1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0NDEgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBtZW1zZXQoKHl5dmFsLnN0YXRlKSwgMCwgc2l6ZW9mKCh5eXZhbC5zdGF0ZSkpKTsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gU1RBVEVfTElHSFRNT0RFTF9BTUJJRU5UOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE2NjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNDQ2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgbWVtc2V0KCh5eXZhbC5zdGF0ZSksIDAsIHNpemVvZigoeXl2YWwuc3RhdGUpKSk7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9IFNUQVRFX0xJR0hUTU9ERUxfU0NFTkVDT0xPUjsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gKHl5dnNwWygxKSAtICgyKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTY3OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0NTQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBtZW1zZXQoKHl5dmFsLnN0YXRlKSwgMCwgc2l6ZW9mKCh5eXZhbC5zdGF0ZSkpKTsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gU1RBVEVfTElHSFRQUk9EOworCSAgICh5eXZhbC5zdGF0ZSlbMV0gPSAoeXl2c3BbKDMpIC0gKDYpXS5pbnRlZ2VyKTsKKwkgICAoeXl2YWwuc3RhdGUpWzJdID0gKHl5dnNwWyg1KSAtICg2KV0uaW50ZWdlcik7CisJICAgKHl5dmFsLnN0YXRlKVszXSA9ICh5eXZzcFsoNikgLSAoNildLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE2OToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNDY2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgbWVtc2V0KCh5eXZhbC5zdGF0ZSksIDAsIHNpemVvZigoeXl2YWwuc3RhdGUpKSk7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9ICh5eXZzcFsoMykgLSAoMyldLmludGVnZXIpOworCSAgICh5eXZhbC5zdGF0ZSlbMV0gPSAoeXl2c3BbKDIpIC0gKDMpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNzA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTQ3NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9IFNUQVRFX1RFWEVOVl9DT0xPUjsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNzE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTQ4MCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9IFNUQVRFX0FNQklFTlQ7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTcyOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0ODQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW50ZWdlcikgPSBTVEFURV9ESUZGVVNFOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE3MzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNDg4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfU1BFQ1VMQVI7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTc0OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0OTQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoKHVuc2lnbmVkKSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA+PSBzdGF0ZS0+TWF4TGlnaHRzKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIGxpZ2h0IHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNzU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTUwNSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgoeXl2YWwuc3RhdGUpLCAwLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSBTVEFURV9URVhHRU47CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9ICh5eXZzcFsoMikgLSAoNCldLmludGVnZXIpOworCSAgICh5eXZhbC5zdGF0ZSlbMl0gPSAoeXl2c3BbKDMpIC0gKDQpXS5pbnRlZ2VyKSArICh5eXZzcFsoNCkgLSAoNCldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE3NjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTE0ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfVEVYR0VOX0VZRV9TOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE3NzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTE4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfVEVYR0VOX09CSkVDVF9TOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE3ODoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTIzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfVEVYR0VOX0VZRV9TIC0gU1RBVEVfVEVYR0VOX0VZRV9TOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE3OToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTI3ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfVEVYR0VOX0VZRV9UIC0gU1RBVEVfVEVYR0VOX0VZRV9TOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE4MDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTMxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfVEVYR0VOX0VZRV9SIC0gU1RBVEVfVEVYR0VOX0VZRV9TOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE4MToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTM1ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfVEVYR0VOX0VZRV9RIC0gU1RBVEVfVEVYR0VOX0VZRV9TOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE4MjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTQxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgbWVtc2V0KCh5eXZhbC5zdGF0ZSksIDAsIHNpemVvZigoeXl2YWwuc3RhdGUpKSk7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9ICh5eXZzcFsoMikgLSAoMildLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE4MzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTQ4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfRk9HX0NPTE9SOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE4NDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTUyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfRk9HX1BBUkFNUzsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTU1OCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgoeXl2YWwuc3RhdGUpLCAwLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSBTVEFURV9DTElQUExBTkU7CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9ICh5eXZzcFsoMykgLSAoNSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE4NjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTY2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCh1bnNpZ25lZCkgKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcikgPj0gc3RhdGUtPk1heENsaXBQbGFuZXMpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgY2xpcCBwbGFuZSBzZWxlY3RvciIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTg3OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1NzcgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBtZW1zZXQoKHl5dmFsLnN0YXRlKSwgMCwgc2l6ZW9mKCh5eXZhbC5zdGF0ZSkpKTsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gKHl5dnNwWygyKSAtICgyKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTg4OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1ODQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW50ZWdlcikgPSBTVEFURV9QT0lOVF9TSVpFOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE4OToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNTg4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfUE9JTlRfQVRURU5VQVRJT047CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTkwOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1OTQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gKHl5dnNwWygxKSAtICg1KV0uc3RhdGUpWzBdOworCSAgICh5eXZhbC5zdGF0ZSlbMV0gPSAoeXl2c3BbKDEpIC0gKDUpXS5zdGF0ZSlbMV07CisJICAgKHl5dmFsLnN0YXRlKVsyXSA9ICh5eXZzcFsoNCkgLSAoNSldLmludGVnZXIpOworCSAgICh5eXZhbC5zdGF0ZSlbM10gPSAoeXl2c3BbKDQpIC0gKDUpXS5pbnRlZ2VyKTsKKwkgICAoeXl2YWwuc3RhdGUpWzRdID0gKHl5dnNwWygxKSAtICg1KV0uc3RhdGUpWzJdOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE5MToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNjA0ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9ICh5eXZzcFsoMSkgLSAoMildLnN0YXRlKVswXTsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gKHl5dnNwWygxKSAtICgyKV0uc3RhdGUpWzFdOworCSAgICh5eXZhbC5zdGF0ZSlbMl0gPSAoeXl2c3BbKDIpIC0gKDIpXS5zdGF0ZSlbMl07CisJICAgKHl5dmFsLnN0YXRlKVszXSA9ICh5eXZzcFsoMikgLSAoMildLnN0YXRlKVszXTsKKwkgICAoeXl2YWwuc3RhdGUpWzRdID0gKHl5dnNwWygxKSAtICgyKV0uc3RhdGUpWzJdOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE5MjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNjE0ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnN0YXRlKVsyXSA9IDA7CisJICAgKHl5dmFsLnN0YXRlKVszXSA9IDM7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTkzOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE2MTkgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAvKiBJdCBzZWVtcyBsb2dpY2FsIHRoYXQgdGhlIG1hdHJpeCByb3cgcmFuZ2Ugc3BlY2lmaWVyIHdvdWxkIGhhdmUKKwkgICAgKiB0byBzcGVjaWZ5IGEgcmFuZ2Ugb3IgbW9yZSB0aGFuIG9uZSByb3cgKGkuZS4sICQ1ID4gJDMpLgorCSAgICAqIEhvd2V2ZXIsIHRoZSBBUkJfdmVydGV4X3Byb2dyYW0gc3BlYyBzYXlzICJhIHByb2dyYW0gd2lsbCBmYWlsCisJICAgICogdG8gbG9hZCBpZiA8YT4gaXMgZ3JlYXRlciB0aGFuIDxiPi4iICBUaGlzIG1lYW5zIHRoYXQgJDMgPT0gJDUKKwkgICAgKiBpcyB2YWxpZC4KKwkgICAgKi8KKwkgICBpZiAoKHl5dnNwWygzKSAtICg2KV0uaW50ZWdlcikgPiAoeXl2c3BbKDUpIC0gKDYpXS5pbnRlZ2VyKSkgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDMpIC0gKDYpXSksIHN0YXRlLCAiaW52YWxpZCBtYXRyaXggcm93IHJhbmdlIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAoeXl2YWwuc3RhdGUpWzJdID0gKHl5dnNwWygzKSAtICg2KV0uaW50ZWdlcik7CisJICAgKHl5dmFsLnN0YXRlKVszXSA9ICh5eXZzcFsoNSkgLSAoNildLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE5NDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNjM3ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9ICh5eXZzcFsoMikgLSAoMyldLnN0YXRlKVswXTsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gKHl5dnNwWygyKSAtICgzKV0uc3RhdGUpWzFdOworCSAgICh5eXZhbC5zdGF0ZSlbMl0gPSAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOTU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTY0NSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9IDA7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMTk2OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE2NDkgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOTc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTY1NSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9IFNUQVRFX01BVFJJWF9JTlZFUlNFOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDE5ODoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNjU5ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gU1RBVEVfTUFUUklYX1RSQU5TUE9TRTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOTk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTY2MyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9IFNUQVRFX01BVFJJWF9JTlZUUkFOUzsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMDA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTY2OSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICgoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA+IDMpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgbWF0cml4IHJvdyByZWZlcmVuY2UiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIwMToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNjgwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9IFNUQVRFX01PREVMVklFV19NQVRSSVg7CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9ICh5eXZzcFsoMikgLSAoMildLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIwMjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNjg1ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9IFNUQVRFX1BST0pFQ1RJT05fTUFUUklYOworCSAgICh5eXZhbC5zdGF0ZSlbMV0gPSAwOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIwMzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNjkwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9IFNUQVRFX01WUF9NQVRSSVg7CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9IDA7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjA0OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE2OTUgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gU1RBVEVfVEVYVFVSRV9NQVRSSVg7CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9ICh5eXZzcFsoMikgLSAoMildLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIwNToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNzAwICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoNCldKSwgc3RhdGUsICJHTF9BUkJfbWF0cml4X3BhbGV0dGUgbm90IHN1cHBvcnRlZCIpOworCSAgIFlZRVJST1I7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjA2OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3MDUgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gU1RBVEVfUFJPR1JBTV9NQVRSSVg7CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9ICh5eXZzcFsoMykgLSAoNCldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIwNzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNzEyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLmludGVnZXIpID0gMDsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMDg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTcxNiAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMikgLSAoMyldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIwOToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNzIxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgLyogU2luY2UgR0xfQVJCX3ZlcnRleF9ibGVuZCBpc24ndCBzdXBwb3J0ZWQsIG9ubHkgbW9kZWx2aWV3IG1hdHJpeAorCSAgICAqIHplcm8gaXMgdmFsaWQuCisJICAgICovCisJICAgaWYgKCh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpICE9IDApIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgbW9kZWx2aWV3IG1hdHJpeCBpbmRleCIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjEwOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3MzQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAvKiBTaW5jZSBHTF9BUkJfbWF0cml4X3BhbGV0dGUgaXNuJ3Qgc3VwcG9ydGVkLCBqdXN0IGxldCBhbnkgdmFsdWUKKwkgICAgKiB0aHJvdWdoIGhlcmUuICBUaGUgZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgbGF0ZXIuCisJICAgICovCisJICAgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjExOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3NDIgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoKHVuc2lnbmVkKSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA+PSBzdGF0ZS0+TWF4UHJvZ3JhbU1hdHJpY2VzKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gbWF0cml4IHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMTI6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTc1MyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgoeXl2YWwuc3RhdGUpLCAwLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSBTVEFURV9ERVBUSF9SQU5HRTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMTc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTc2NSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgoeXl2YWwuc3RhdGUpLCAwLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSBzdGF0ZS0+c3RhdGVfcGFyYW1fZW51bTsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gU1RBVEVfRU5WOworCSAgICh5eXZhbC5zdGF0ZSlbMl0gPSAoeXl2c3BbKDQpIC0gKDUpXS5zdGF0ZSlbMF07CisJICAgKHl5dmFsLnN0YXRlKVszXSA9ICh5eXZzcFsoNCkgLSAoNSldLnN0YXRlKVsxXTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMTg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTc3NSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjE5OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3ODAgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gKHl5dnNwWygxKSAtICgzKV0uaW50ZWdlcik7CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9ICh5eXZzcFsoMykgLSAoMyldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIyMDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxNzg3ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgbWVtc2V0KCh5eXZhbC5zdGF0ZSksIDAsIHNpemVvZigoeXl2YWwuc3RhdGUpKSk7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9IHN0YXRlLT5zdGF0ZV9wYXJhbV9lbnVtOworCSAgICh5eXZhbC5zdGF0ZSlbMV0gPSBTVEFURV9FTlY7CisJICAgKHl5dmFsLnN0YXRlKVsyXSA9ICh5eXZzcFsoNCkgLSAoNSldLmludGVnZXIpOworCSAgICh5eXZhbC5zdGF0ZSlbM10gPSAoeXl2c3BbKDQpIC0gKDUpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMjE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTc5NyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIG1lbXNldCgoeXl2YWwuc3RhdGUpLCAwLCBzaXplb2YoKHl5dmFsLnN0YXRlKSkpOworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSBzdGF0ZS0+c3RhdGVfcGFyYW1fZW51bTsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gU1RBVEVfTE9DQUw7CisJICAgKHl5dmFsLnN0YXRlKVsyXSA9ICh5eXZzcFsoNCkgLSAoNSldLnN0YXRlKVswXTsKKwkgICAoeXl2YWwuc3RhdGUpWzNdID0gKHl5dnNwWyg0KSAtICg1KV0uc3RhdGUpWzFdOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIyMjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxODA2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnN0YXRlKVswXSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCSAgICh5eXZhbC5zdGF0ZSlbMV0gPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMjM6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTgxMSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5zdGF0ZSlbMF0gPSAoeXl2c3BbKDEpIC0gKDMpXS5pbnRlZ2VyKTsKKwkgICAoeXl2YWwuc3RhdGUpWzFdID0gKHl5dnNwWygzKSAtICgzKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjI0OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE4MTggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBtZW1zZXQoKHl5dmFsLnN0YXRlKSwgMCwgc2l6ZW9mKCh5eXZhbC5zdGF0ZSkpKTsKKwkgICAoeXl2YWwuc3RhdGUpWzBdID0gc3RhdGUtPnN0YXRlX3BhcmFtX2VudW07CisJICAgKHl5dmFsLnN0YXRlKVsxXSA9IFNUQVRFX0xPQ0FMOworCSAgICh5eXZhbC5zdGF0ZSlbMl0gPSAoeXl2c3BbKDQpIC0gKDUpXS5pbnRlZ2VyKTsKKwkgICAoeXl2YWwuc3RhdGUpWzNdID0gKHl5dnNwWyg0KSAtICg1KV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjI1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE4MjggInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoKHVuc2lnbmVkKSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKSA+PSBzdGF0ZS0+bGltaXRzLT5NYXhFbnZQYXJhbXMpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgZW52aXJvbm1lbnQgcGFyYW1ldGVyIHJlZmVyZW5jZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCSAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIyNjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxODM4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCh1bnNpZ25lZCkgKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcikgPj0gc3RhdGUtPmxpbWl0cy0+TWF4TG9jYWxQYXJhbXMpIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgbG9jYWwgcGFyYW1ldGVyIHJlZmVyZW5jZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCSAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIzMToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxODUzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnZlY3RvcikuY291bnQgPSA0OworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMF0uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMV0uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMl0uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbM10uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIzMjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxODYzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnZlY3RvcikuY291bnQgPSAxOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMF0uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMV0uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMl0uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbM10uZiA9ICh5eXZzcFsoMSkgLSAoMSldLnJlYWwpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIzMzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxODcxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnZlY3RvcikuY291bnQgPSAxOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMF0uZiA9IChmbG9hdCkgKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVsxXS5mID0gKGZsb2F0KSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwkgICAoeXl2YWwudmVjdG9yKS5kYXRhWzJdLmYgPSAoZmxvYXQpICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbM10uZiA9IChmbG9hdCkgKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcik7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjM0OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE4ODEgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwudmVjdG9yKS5jb3VudCA9IDQ7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVswXS5mID0gKHl5dnNwWygyKSAtICgzKV0ucmVhbCk7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVsxXS5mID0gMC4wZjsKKwkgICAoeXl2YWwudmVjdG9yKS5kYXRhWzJdLmYgPSAwLjBmOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbM10uZiA9IDEuMGY7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjM1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE4ODkgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwudmVjdG9yKS5jb3VudCA9IDQ7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVswXS5mID0gKHl5dnNwWygyKSAtICg1KV0ucmVhbCk7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVsxXS5mID0gKHl5dnNwWyg0KSAtICg1KV0ucmVhbCk7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVsyXS5mID0gMC4wZjsKKwkgICAoeXl2YWwudmVjdG9yKS5kYXRhWzNdLmYgPSAxLjBmOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDIzNjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxODk4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnZlY3RvcikuY291bnQgPSA0OworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMF0uZiA9ICh5eXZzcFsoMikgLSAoNyldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMV0uZiA9ICh5eXZzcFsoNCkgLSAoNyldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbMl0uZiA9ICh5eXZzcFsoNikgLSAoNyldLnJlYWwpOworCSAgICh5eXZhbC52ZWN0b3IpLmRhdGFbM10uZiA9IDEuMGY7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjM3OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE5MDcgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwudmVjdG9yKS5jb3VudCA9IDQ7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVswXS5mID0gKHl5dnNwWygyKSAtICg5KV0ucmVhbCk7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVsxXS5mID0gKHl5dnNwWyg0KSAtICg5KV0ucmVhbCk7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVsyXS5mID0gKHl5dnNwWyg2KSAtICg5KV0ucmVhbCk7CisJICAgKHl5dmFsLnZlY3RvcikuZGF0YVszXS5mID0gKHl5dnNwWyg4KSAtICg5KV0ucmVhbCk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjM4OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE5MTcgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwucmVhbCkgPSAoKHl5dnNwWygxKSAtICgyKV0ubmVnYXRlKSkgPyAtKHl5dnNwWygyKSAtICgyKV0ucmVhbCkgOiAoeXl2c3BbKDIpIC0gKDIpXS5yZWFsKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMzk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTkyMSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5yZWFsKSA9IChmbG9hdCkoKCh5eXZzcFsoMSkgLSAoMildLm5lZ2F0ZSkpID8gLSh5eXZzcFsoMikgLSAoMildLmludGVnZXIpIDogKHl5dnNwWygyKSAtICgyKV0uaW50ZWdlcikpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI0MDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxOTI2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5uZWdhdGUpID0gRkFMU0U7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI0MToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxOTI3ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5uZWdhdGUpID0gVFJVRTsgIH0KKyAgICBicmVhazsKKworICBjYXNlIDI0MjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxOTI4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5uZWdhdGUpID0gRkFMU0U7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI0MzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxOTMxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMikgLSAoMildLmludGVnZXIpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNDU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTkzNSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIC8qIE5WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uIGRlZmluZXMgdGhlIHNpemUgcXVhbGlmaWVycyBpbiBhCisJICAgICogZmFpcmx5IGJyb2tlbiB3YXkuICAiU0hPUlQiIG9yICJMT05HIiBjYW4gb3B0aW9uYWxseSBiZSB1c2VkCisJICAgICogYmVmb3JlIFRFTVAgb3IgT1VUUFVULiAgSG93ZXZlciwgbmVpdGhlciBpcyBhIHJlc2VydmVkIHdvcmQhCisJICAgICogVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gcGFyc2UgaXQgYXMgYW4gaWRlbnRpZmllciwgdGhlbiBjaGVjaworCSAgICAqIHRvIG1ha2Ugc3VyZSBpdCdzIG9uZSBvZiB0aGUgdmFsaWQgdmFsdWVzLiAgKnNpZ2gqCisJICAgICoKKwkgICAgKiBJbiBhZGRpdGlvbiwgdGhlIGdyYW1tYXIgaW4gdGhlIGV4dGVuc2lvbiBzcGVjIGRvZXMgKm5vdCogYWxsb3cKKwkgICAgKiB0aGUgc2l6ZSBzcGVjaWZpZXIgdG8gYmUgb3B0aW9uYWwsIGJ1dCBhbGwga25vd24gaW1wbGVtZW50YXRpb25zCisJICAgICogZG8uCisJICAgICovCisJICAgaWYgKCFzdGF0ZS0+b3B0aW9uLk5WX2ZyYWdtZW50KSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJ1bmV4cGVjdGVkIElERU5USUZJRVIiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIGlmIChzdHJjbXAoIlNIT1JUIiwgKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSkgPT0gMCkgeworCSAgIH0gZWxzZSBpZiAoc3RyY21wKCJMT05HIiwgKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSkgPT0gMCkgeworCSAgIH0gZWxzZSB7CisJICAgICAgY2hhciAqY29uc3QgZXJyX3N0ciA9CisJCSBtYWtlX2Vycm9yX3N0cmluZygiaW52YWxpZCBzdG9yYWdlIHNpemUgc3BlY2lmaWVyIFwiJXNcIiIsCisJCQkJICAgKHl5dnNwWygxKSAtICgxKV0uc3RyaW5nKSk7CisKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgKGVycl9zdHIgIT0gTlVMTCkKKwkJICAgICAgPyBlcnJfc3RyIDogImludmFsaWQgc3RvcmFnZSBzaXplIHNwZWNpZmllciIpOworCisJICAgICAgaWYgKGVycl9zdHIgIT0gTlVMTCkgeworCQkgZnJlZShlcnJfc3RyKTsKKwkgICAgICB9CisKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNDY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTk2OSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI0NzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxOTczICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNDk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMTk3NyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICghZGVjbGFyZV92YXJpYWJsZShzdGF0ZSwgKHl5dnNwWygzKSAtICgzKV0uc3RyaW5nKSwgKHl5dnNwWygwKSAtICgzKV0uaW50ZWdlciksICYgKHl5bHNwWygzKSAtICgzKV0pKSkgeworCSAgICAgIGZyZWUoKHl5dnNwWygzKSAtICgzKV0uc3RyaW5nKSk7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjUwOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE5ODQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoIWRlY2xhcmVfdmFyaWFibGUoc3RhdGUsICh5eXZzcFsoMSkgLSAoMSldLnN0cmluZyksICh5eXZzcFsoMCkgLSAoMSldLmludGVnZXIpLCAmICh5eWxzcFsoMSkgLSAoMSldKSkpIHsKKwkgICAgICBmcmVlKCh5eXZzcFsoMSkgLSAoMSldLnN0cmluZykpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDI1MToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAxOTkzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgKmNvbnN0IHMgPQorCSAgICAgIGRlY2xhcmVfdmFyaWFibGUoc3RhdGUsICh5eXZzcFsoMykgLSAoNSldLnN0cmluZyksIGF0X291dHB1dCwgJiAoeXlsc3BbKDMpIC0gKDUpXSkpOworCisJICAgaWYgKHMgPT0gTlVMTCkgeworCSAgICAgIGZyZWUoKHl5dnNwWygzKSAtICg1KV0uc3RyaW5nKSk7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgIHMtPm91dHB1dF9iaW5kaW5nID0gKHl5dnNwWyg1KSAtICg1KV0ucmVzdWx0KTsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjUyOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIwMDcgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX3ZlcnRleCkgeworCSAgICAgICh5eXZhbC5yZXN1bHQpID0gVkFSWUlOR19TTE9UX1BPUzsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDIpIC0gKDIpXSksIHN0YXRlLCAiaW52YWxpZCBwcm9ncmFtIHJlc3VsdCBuYW1lIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjUzOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIwMTYgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX3ZlcnRleCkgeworCSAgICAgICh5eXZhbC5yZXN1bHQpID0gVkFSWUlOR19TTE9UX0ZPR0M7CisJICAgfSBlbHNlIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygyKSAtICgyKV0pLCBzdGF0ZSwgImludmFsaWQgcHJvZ3JhbSByZXN1bHQgbmFtZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDI1NDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMDI1ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgKHl5dmFsLnJlc3VsdCkgPSAoeXl2c3BbKDIpIC0gKDIpXS5yZXN1bHQpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI1NToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMDI5ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKHN0YXRlLT5tb2RlID09IEFSQl92ZXJ0ZXgpIHsKKwkgICAgICAoeXl2YWwucmVzdWx0KSA9IFZBUllJTkdfU0xPVF9QU0laOworCSAgIH0gZWxzZSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMikgLSAoMildKSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNTY6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjAzOCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgKHl5dmFsLnJlc3VsdCkgPSBWQVJZSU5HX1NMT1RfVEVYMCArICh5eXZzcFsoMykgLSAoMyldLmludGVnZXIpOworCSAgIH0gZWxzZSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMikgLSAoMyldKSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNTc6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjA0NyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfZnJhZ21lbnQpIHsKKwkgICAgICAoeXl2YWwucmVzdWx0KSA9IEZSQUdfUkVTVUxUX0RFUFRIOworCSAgIH0gZWxzZSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMikgLSAoMildKSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNTg6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjA1OCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgICh5eXZhbC5yZXN1bHQpID0gKHl5dnNwWygyKSAtICgzKV0uaW50ZWdlcikgKyAoeXl2c3BbKDMpIC0gKDMpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNTk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjA2NCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgKHl5dmFsLmludGVnZXIpID0gVkFSWUlOR19TTE9UX0NPTDA7CisJICAgfSBlbHNlIHsKKwkgICAgICBpZiAoc3RhdGUtPm9wdGlvbi5EcmF3QnVmZmVycykKKwkJICh5eXZhbC5pbnRlZ2VyKSA9IEZSQUdfUkVTVUxUX0RBVEEwOworCSAgICAgIGVsc2UKKwkJICh5eXZhbC5pbnRlZ2VyKSA9IEZSQUdfUkVTVUxUX0NPTE9SOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNjA6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjA3NSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMyldKSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgaWYgKCFzdGF0ZS0+b3B0aW9uLkRyYXdCdWZmZXJzKSB7CisJCSAvKiBGcm9tIHRoZSBBUkJfZHJhd19idWZmZXJzIHNwZWMgKHNhbWUgdGV4dCBleGlzdHMKKwkJICAqIGZvciBBVElfZHJhd19idWZmZXJzKToKKwkJICAqCisJCSAgKiAgICAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgYSBmcmFnbWVudAorCQkgICogICAgIHByb2dyYW0gdGhhdCBhdHRlbXB0cyB0byBiaW5kCisJCSAgKiAgICAgInJlc3VsdC5jb2xvcltuXSIgd2lsbCBmYWlsIHRvIGxvYWQsIGFuZCBvbmx5CisJCSAgKiAgICAgInJlc3VsdC5jb2xvciIgd2lsbCBiZSBhbGxvd2VkLgorCQkgICovCisJCSB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgzKV0pLCBzdGF0ZSwKKwkJCSAicmVzdWx0LmNvbG9yW10gdXNlZCB3aXRob3V0ICIKKwkJCSAiYE9QVElPTiBBUkJfZHJhd19idWZmZXJzJyBvciAiCisJCQkgImBPUFRJT04gQVRJX2RyYXdfYnVmZmVycyciKTsKKwkJIFlZRVJST1I7CisJICAgICAgfSBlbHNlIGlmICgoeXl2c3BbKDIpIC0gKDMpXS5pbnRlZ2VyKSA+PSBzdGF0ZS0+TWF4RHJhd0J1ZmZlcnMpIHsKKwkJIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDMpXSksIHN0YXRlLAorCQkJICJyZXN1bHQuY29sb3JbXSBleGNlZWRzIE1BWF9EUkFXX0JVRkZFUlNfQVJCIik7CisJCSBZWUVSUk9SOworCSAgICAgIH0KKwkgICAgICAoeXl2YWwuaW50ZWdlcikgPSBGUkFHX1JFU1VMVF9EQVRBMCArICh5eXZzcFsoMikgLSAoMyldLmludGVnZXIpOworCSAgIH0KKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNjE6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjEwMyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgKHl5dmFsLmludGVnZXIpID0gVkFSWUlOR19TTE9UX0NPTDA7CisJICAgfSBlbHNlIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgcHJvZ3JhbSByZXN1bHQgbmFtZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDI2MjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTEyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKHN0YXRlLT5tb2RlID09IEFSQl92ZXJ0ZXgpIHsKKwkgICAgICAoeXl2YWwuaW50ZWdlcikgPSBWQVJZSU5HX1NMT1RfQkZDMDsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCBwcm9ncmFtIHJlc3VsdCBuYW1lIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjYzOgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxMjMgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICAoeXl2YWwuaW50ZWdlcikgPSAwOyAKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNjQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjEyNyAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgKHl5dmFsLmludGVnZXIpID0gMDsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCBwcm9ncmFtIHJlc3VsdCBuYW1lIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjY1OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxMzYgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsKKwkgICBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX3ZlcnRleCkgeworCSAgICAgICh5eXZhbC5pbnRlZ2VyKSA9IDE7CisJICAgfSBlbHNlIHsKKwkgICAgICB5eWVycm9yKCYgKHl5bHNwWygxKSAtICgxKV0pLCBzdGF0ZSwgImludmFsaWQgcHJvZ3JhbSByZXN1bHQgbmFtZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCX0KKyAgICBicmVhazsKKworICBjYXNlIDI2NjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTQ2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI2NzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTQ3ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI2ODoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTQ4ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDE7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI2OToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTUxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI3MDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTUyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI3MToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTUzICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDE7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI3MjoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTU2ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9IDA7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI3MzoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTU3ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7ICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMikgLSAoMyldLmludGVnZXIpOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNzQ6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjE2MCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyAoeXl2YWwuaW50ZWdlcikgPSAwOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNzU6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjE2MSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeyAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDIpIC0gKDMpXS5pbnRlZ2VyKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjc2OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxNjQgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsgKHl5dmFsLmludGVnZXIpID0gMDsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjc3OgorLyogTGluZSAxNzg3IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxNjUgInByb2dyYW0vcHJvZ3JhbV9wYXJzZS55IgorICAgIHsgKHl5dmFsLmludGVnZXIpID0gKHl5dnNwWygyKSAtICgzKV0uaW50ZWdlcik7IH0KKyAgICBicmVhazsKKworICBjYXNlIDI3ODoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTY5ICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCh1bnNpZ25lZCkgKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcikgPj0gc3RhdGUtPk1heFRleHR1cmVDb29yZFVuaXRzKSB7CisJICAgICAgeXllcnJvcigmICh5eWxzcFsoMSkgLSAoMSldKSwgc3RhdGUsICJpbnZhbGlkIHRleHR1cmUgY29vcmRpbmF0ZSB1bml0IHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAoeXl2YWwuaW50ZWdlcikgPSAoeXl2c3BbKDEpIC0gKDEpXS5pbnRlZ2VyKTsKKwl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNzk6CisvKiBMaW5lIDE3ODcgb2YgeWFjYy5jICAqLworI2xpbmUgMjE4MCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisgICAgeworCSAgIGlmICgodW5zaWduZWQpICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpID49IHN0YXRlLT5NYXhUZXh0dXJlSW1hZ2VVbml0cykgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCB0ZXh0dXJlIGltYWdlIHVuaXQgc2VsZWN0b3IiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI4MDoKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMTkxICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgaWYgKCh1bnNpZ25lZCkgKHl5dnNwWygxKSAtICgxKV0uaW50ZWdlcikgPj0gc3RhdGUtPk1heFRleHR1cmVVbml0cykgeworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDEpIC0gKDEpXSksIHN0YXRlLCAiaW52YWxpZCB0ZXh0dXJlIHVuaXQgc2VsZWN0b3IiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICh5eXZhbC5pbnRlZ2VyKSA9ICh5eXZzcFsoMSkgLSAoMSldLmludGVnZXIpOworCX0KKyAgICBicmVhazsKKworICBjYXNlIDI4MToKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSAyMjAyICJwcm9ncmFtL3Byb2dyYW1fcGFyc2UueSIKKyAgICB7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgKmV4aXN0ID0gKHN0cnVjdCBhc21fc3ltYm9sICopCisJICAgICAgX21lc2Ffc3ltYm9sX3RhYmxlX2ZpbmRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgKHl5dnNwWygyKSAtICg0KV0uc3RyaW5nKSk7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgKnRhcmdldCA9IChzdHJ1Y3QgYXNtX3N5bWJvbCAqKQorCSAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbChzdGF0ZS0+c3QsIDAsICh5eXZzcFsoNCkgLSAoNCldLnN0cmluZykpOworCisJICAgZnJlZSgoeXl2c3BbKDQpIC0gKDQpXS5zdHJpbmcpKTsKKworCSAgIGlmIChleGlzdCAhPSBOVUxMKSB7CisJICAgICAgY2hhciBtWzEwMDBdOworCSAgICAgIF9tZXNhX3NucHJpbnRmKG0sIHNpemVvZihtKSwgInJlZGVjbGFyZWQgaWRlbnRpZmllcjogJXMiLCAoeXl2c3BbKDIpIC0gKDQpXS5zdHJpbmcpKTsKKwkgICAgICBmcmVlKCh5eXZzcFsoMikgLSAoNCldLnN0cmluZykpOworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDIpIC0gKDQpXSksIHN0YXRlLCBtKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IE5VTEwpIHsKKwkgICAgICBmcmVlKCh5eXZzcFsoMikgLSAoNCldLnN0cmluZykpOworCSAgICAgIHl5ZXJyb3IoJiAoeXlsc3BbKDQpIC0gKDQpXSksIHN0YXRlLAorCQkgICAgICAidW5kZWZpbmVkIHZhcmlhYmxlIGJpbmRpbmcgaW4gQUxJQVMgc3RhdGVtZW50Iik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9hZGRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgKHl5dnNwWygyKSAtICg0KV0uc3RyaW5nKSwgdGFyZ2V0KTsKKwkgICB9CisJfQorICAgIGJyZWFrOworCisKKy8qIExpbmUgMTc4NyBvZiB5YWNjLmMgICovCisjbGluZSA0ODU3ICIuL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZS50YWIuYyIKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgLyogVXNlciBzZW1hbnRpYyBhY3Rpb25zIHNvbWV0aW1lcyBhbHRlciB5eWNoYXIsIGFuZCB0aGF0IHJlcXVpcmVzCisgICAgIHRoYXQgeXl0b2tlbiBiZSB1cGRhdGVkIHdpdGggdGhlIG5ldyB0cmFuc2xhdGlvbi4gIFdlIHRha2UgdGhlCisgICAgIGFwcHJvYWNoIG9mIHRyYW5zbGF0aW5nIGltbWVkaWF0ZWx5IGJlZm9yZSBldmVyeSB1c2Ugb2YgeXl0b2tlbi4KKyAgICAgT25lIGFsdGVybmF0aXZlIGlzIHRyYW5zbGF0aW5nIGhlcmUgYWZ0ZXIgZXZlcnkgc2VtYW50aWMgYWN0aW9uLAorICAgICBidXQgdGhhdCB0cmFuc2xhdGlvbiB3b3VsZCBiZSBtaXNzZWQgaWYgdGhlIHNlbWFudGljIGFjdGlvbiBpbnZva2VzCisgICAgIFlZQUJPUlQsIFlZQUNDRVBULCBvciBZWUVSUk9SIGltbWVkaWF0ZWx5IGFmdGVyIGFsdGVyaW5nIHl5Y2hhciBvcgorICAgICBpZiBpdCBpbnZva2VzIFlZQkFDS1VQLiAgSW4gdGhlIGNhc2Ugb2YgWVlBQk9SVCBvciBZWUFDQ0VQVCwgYW4KKyAgICAgaW5jb3JyZWN0IGRlc3RydWN0b3IgbWlnaHQgdGhlbiBiZSBpbnZva2VkIGltbWVkaWF0ZWx5LiAgSW4gdGhlCisgICAgIGNhc2Ugb2YgWVlFUlJPUiBvciBZWUJBQ0tVUCwgc3Vic2VxdWVudCBwYXJzZXIgYWN0aW9ucyBtaWdodCBsZWFkCisgICAgIHRvIGFuIGluY29ycmVjdCBkZXN0cnVjdG9yIGNhbGwgb3IgdmVyYm9zZSBzeW50YXggZXJyb3IgbWVzc2FnZQorICAgICBiZWZvcmUgdGhlIGxvb2thaGVhZCBpcyB0cmFuc2xhdGVkLiAgKi8KKyAgWVlfU1lNQk9MX1BSSU5UICgiLT4gJCQgPSIsIHl5cjFbeXluXSwgJnl5dmFsLCAmeXlsb2MpOworCisgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKKyAgeXlsZW4gPSAwOworICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworCisgICorK3l5dnNwID0geXl2YWw7CisgICorK3l5bHNwID0geXlsb2M7CisKKyAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKKyAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCisgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVE9LRU5TXSArICp5eXNzcDsKKyAgaWYgKDAgPD0geXlzdGF0ZSAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVE9LRU5TXTsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWI6CisgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGxhdGVzdCBsb29rYWhlYWQgdHJhbnNsYXRpb24uICBTZWUgY29tbWVudHMgYXQKKyAgICAgdXNlciBzZW1hbnRpYyBhY3Rpb25zIGZvciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuICAqLworICB5eXRva2VuID0geXljaGFyID09IFlZRU1QVFkgPyBZWUVNUFRZIDogWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisKKyAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCisgIGlmICgheXllcnJzdGF0dXMpCisgICAgeworICAgICAgKyt5eW5lcnJzOworI2lmICEgWVlFUlJPUl9WRVJCT1NFCisgICAgICB5eWVycm9yICgmeXlsbG9jLCBzdGF0ZSwgWVlfKCJzeW50YXggZXJyb3IiKSk7CisjZWxzZQorIyBkZWZpbmUgWVlTWU5UQVhfRVJST1IgeXlzeW50YXhfZXJyb3IgKCZ5eW1zZ19hbGxvYywgJnl5bXNnLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlzc3AsIHl5dG9rZW4pCisgICAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKnl5bXNncCA9IFlZXygic3ludGF4IGVycm9yIik7CisgICAgICAgIGludCB5eXN5bnRheF9lcnJvcl9zdGF0dXM7CisgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IFlZU1lOVEFYX0VSUk9SOworICAgICAgICBpZiAoeXlzeW50YXhfZXJyb3Jfc3RhdHVzID09IDApCisgICAgICAgICAgeXltc2dwID0geXltc2c7CisgICAgICAgIGVsc2UgaWYgKHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9PSAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKKyAgICAgICAgICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CisgICAgICAgICAgICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5bXNnX2FsbG9jKTsKKyAgICAgICAgICAgIGlmICgheXltc2cpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5eW1zZyA9IHl5bXNnYnVmOworICAgICAgICAgICAgICAgIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOworICAgICAgICAgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IDI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IFlZU1lOVEFYX0VSUk9SOworICAgICAgICAgICAgICAgIHl5bXNncCA9IHl5bXNnOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB5eWVycm9yICgmeXlsbG9jLCBzdGF0ZSwgeXltc2dwKTsKKyAgICAgICAgaWYgKHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9PSAyKQorICAgICAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisgICAgICB9CisjIHVuZGVmIFlZU1lOVEFYX0VSUk9SCisjZW5kaWYKKyAgICB9CisKKyAgeXllcnJvcl9yYW5nZVsxXSA9IHl5bGxvYzsKKworICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuCisJIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKwl7CisJICAvKiBSZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQuICAqLworCSAgaWYgKHl5Y2hhciA9PSBZWUVPRikKKwkgICAgWVlBQk9SVDsKKwl9CisgICAgICBlbHNlCisJeworCSAgeXlkZXN0cnVjdCAoIkVycm9yOiBkaXNjYXJkaW5nIiwKKwkJICAgICAgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYywgc3RhdGUpOworCSAgeXljaGFyID0gWVlFTVBUWTsKKwl9CisgICAgfQorCisgIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvcgorICAgICB0b2tlbi4gICovCisgIGdvdG8geXllcnJsYWIxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycm9ybGFiIC0tIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IFlZRVJST1IuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJyb3JsYWI6CisKKyAgLyogUGFjaWZ5IGNvbXBpbGVycyBsaWtlIEdDQyB3aGVuIHRoZSB1c2VyIGNvZGUgbmV2ZXIgaW52b2tlcworICAgICBZWUVSUk9SIGFuZCB0aGUgbGFiZWwgeXllcnJvcmxhYiB0aGVyZWZvcmUgbmV2ZXIgYXBwZWFycyBpbiB1c2VyCisgICAgIGNvZGUuICAqLworICBpZiAoLypDT05TVENPTkQqLyAwKQorICAgICBnb3RvIHl5ZXJyb3JsYWI7CisKKyAgeXllcnJvcl9yYW5nZVsxXSA9IHl5bHNwWzEteXlsZW5dOworICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCisgICAgIHRoaXMgWVlFUlJPUi4gICovCisgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKKyAgeXlsZW4gPSAwOworICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworICB5eXN0YXRlID0gKnl5c3NwOworICBnb3RvIHl5ZXJybGFiMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiMSAtLSBjb21tb24gY29kZSBmb3IgYm90aCBzeW50YXggZXJyb3IgYW5kIFlZRVJST1IuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjE6CisgIHl5ZXJyc3RhdHVzID0gMzsJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzLiAgKi8KKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgICAgIGlmICgheXlwYWN0X3ZhbHVlX2lzX2RlZmF1bHQgKHl5bikpCisJeworCSAgeXluICs9IFlZVEVSUk9SOworCSAgaWYgKDAgPD0geXluICYmIHl5biA8PSBZWUxBU1QgJiYgeXljaGVja1t5eW5dID09IFlZVEVSUk9SKQorCSAgICB7CisJICAgICAgeXluID0geXl0YWJsZVt5eW5dOworCSAgICAgIGlmICgwIDwgeXluKQorCQlicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogUG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4uICAqLworICAgICAgaWYgKHl5c3NwID09IHl5c3MpCisJWVlBQk9SVDsKKworICAgICAgeXllcnJvcl9yYW5nZVsxXSA9ICp5eWxzcDsKKyAgICAgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogcG9wcGluZyIsCisJCSAgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCwgeXlsc3AsIHN0YXRlKTsKKyAgICAgIFlZUE9QU1RBQ0sgKDEpOworICAgICAgeXlzdGF0ZSA9ICp5eXNzcDsKKyAgICAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisgICAgfQorCisgIFlZX0lHTk9SRV9NQVlCRV9VTklOSVRJQUxJWkVEX0JFR0lOCisgICorK3l5dnNwID0geXlsdmFsOworICBZWV9JR05PUkVfTUFZQkVfVU5JTklUSUFMSVpFRF9FTkQKKworICB5eWVycm9yX3JhbmdlWzJdID0geXlsbG9jOworICAvKiBVc2luZyBZWUxMT0MgaXMgdGVtcHRpbmcsIGJ1dCB3b3VsZCBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mCisgICAgIHRoZSBsb29rYWhlYWQuICBZWUxPQyBpcyBhdmFpbGFibGUgdGhvdWdoLiAgKi8KKyAgWVlMTE9DX0RFRkFVTFQgKHl5bG9jLCB5eWVycm9yX3JhbmdlLCAyKTsKKyAgKisreXlsc3AgPSB5eWxvYzsKKworICAvKiBTaGlmdCB0aGUgZXJyb3IgdG9rZW4uICAqLworICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5c3Rvc1t5eW5dLCB5eXZzcCwgeXlsc3ApOworCisgIHl5c3RhdGUgPSB5eW47CisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5YWNjZXB0bGFiIC0tIFlZQUNDRVBUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWFjY2VwdGxhYjoKKyAgeXlyZXN1bHQgPSAwOworICBnb3RvIHl5cmV0dXJuOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFib3J0bGFiIC0tIFlZQUJPUlQgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWFib3J0bGFiOgorICB5eXJlc3VsdCA9IDE7CisgIGdvdG8geXlyZXR1cm47CisKKyNpZiAhZGVmaW5lZCB5eW92ZXJmbG93IHx8IFlZRVJST1JfVkVSQk9TRQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWV4aGF1c3RlZGxhYiAtLSBtZW1vcnkgZXhoYXVzdGlvbiBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlleGhhdXN0ZWRsYWI6CisgIHl5ZXJyb3IgKCZ5eWxsb2MsIHN0YXRlLCBZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7CisgIHl5cmVzdWx0ID0gMjsKKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyNlbmRpZgorCit5eXJldHVybjoKKyAgaWYgKHl5Y2hhciAhPSBZWUVNUFRZKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGxhdGVzdCBsb29rYWhlYWQgdHJhbnNsYXRpb24uICBTZWUgY29tbWVudHMgYXQKKyAgICAgICAgIHVzZXIgc2VtYW50aWMgYWN0aW9ucyBmb3Igd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCisgICAgICAgICAgICAgICAgICB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jLCBzdGF0ZSk7CisgICAgfQorICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCisgICAgIHRoaXMgWVlBQk9SVCBvciBZWUFDQ0VQVC4gICovCisgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKyAgd2hpbGUgKHl5c3NwICE9IHl5c3MpCisgICAgeworICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IHBvcHBpbmciLAorCQkgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCwgeXlsc3AsIHN0YXRlKTsKKyAgICAgIFlZUE9QU1RBQ0sgKDEpOworICAgIH0KKyNpZm5kZWYgeXlvdmVyZmxvdworICBpZiAoeXlzcyAhPSB5eXNzYSkKKyAgICBZWVNUQUNLX0ZSRUUgKHl5c3MpOworI2VuZGlmCisjaWYgWVlFUlJPUl9WRVJCT1NFCisgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKKyAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKKyNlbmRpZgorICAvKiBNYWtlIHN1cmUgWVlJRCBpcyB1c2VkLiAgKi8KKyAgcmV0dXJuIFlZSUQgKHl5cmVzdWx0KTsKK30KKworCisvKiBMaW5lIDIwNTAgb2YgeWFjYy5jICAqLworI2xpbmUgMjIzMSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisKKwordm9pZAorYXNtX2luc3RydWN0aW9uX3NldF9vcGVyYW5kcyhzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICppbnN0LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzAsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMxLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMikKK3sKKyAgIC8qIEluIHRoZSBjb3JlIEFSQiBleHRlbnNpb25zIG9ubHkgdGhlIEtJTCBpbnN0cnVjdGlvbiBkb2Vzbid0IGhhdmUgYQorICAgICogZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgICAgKi8KKyAgIGlmIChkc3QgPT0gTlVMTCkgeworICAgICAgaW5pdF9kc3RfcmVnKCYgaW5zdC0+QmFzZS5Ec3RSZWcpOworICAgfSBlbHNlIHsKKyAgICAgIGluc3QtPkJhc2UuRHN0UmVnID0gKmRzdDsKKyAgIH0KKworICAgLyogVGhlIG9ubHkgaW5zdHJ1Y3Rpb24gdGhhdCBkb2Vzbid0IGhhdmUgYW55IHNvdXJjZSByZWdpc3RlcnMgaXMgdGhlCisgICAgKiBjb25kaXRpb24tY29kZSBiYXNlZCBLSUwgaW5zdHJ1Y3Rpb24gYWRkZWQgYnkgTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24uCisgICAgKi8KKyAgIGlmIChzcmMwICE9IE5VTEwpIHsKKyAgICAgIGluc3QtPkJhc2UuU3JjUmVnWzBdID0gc3JjMC0+QmFzZTsKKyAgICAgIGluc3QtPlNyY1JlZ1swXSA9ICpzcmMwOworICAgfSBlbHNlIHsKKyAgICAgIGluaXRfc3JjX3JlZygmIGluc3QtPlNyY1JlZ1swXSk7CisgICB9CisKKyAgIGlmIChzcmMxICE9IE5VTEwpIHsKKyAgICAgIGluc3QtPkJhc2UuU3JjUmVnWzFdID0gc3JjMS0+QmFzZTsKKyAgICAgIGluc3QtPlNyY1JlZ1sxXSA9ICpzcmMxOworICAgfSBlbHNlIHsKKyAgICAgIGluaXRfc3JjX3JlZygmIGluc3QtPlNyY1JlZ1sxXSk7CisgICB9CisKKyAgIGlmIChzcmMyICE9IE5VTEwpIHsKKyAgICAgIGluc3QtPkJhc2UuU3JjUmVnWzJdID0gc3JjMi0+QmFzZTsKKyAgICAgIGluc3QtPlNyY1JlZ1syXSA9ICpzcmMyOworICAgfSBlbHNlIHsKKyAgICAgIGluaXRfc3JjX3JlZygmIGluc3QtPlNyY1JlZ1syXSk7CisgICB9Cit9CisKKworc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqCithc21faW5zdHJ1Y3Rpb25fY3RvcihnbF9pbnN0X29wY29kZSBvcCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMikKK3sKKyAgIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKmluc3QgPSBDQUxMT0NfU1RSVUNUKGFzbV9pbnN0cnVjdGlvbik7CisKKyAgIGlmIChpbnN0KSB7CisgICAgICBfbWVzYV9pbml0X2luc3RydWN0aW9ucygmIGluc3QtPkJhc2UsIDEpOworICAgICAgaW5zdC0+QmFzZS5PcGNvZGUgPSBvcDsKKworICAgICAgYXNtX2luc3RydWN0aW9uX3NldF9vcGVyYW5kcyhpbnN0LCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgfQorCisgICByZXR1cm4gaW5zdDsKK30KKworCitzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICoKK2FzbV9pbnN0cnVjdGlvbl9jb3B5X2N0b3IoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmJhc2UsCisJCQkgIGNvbnN0IHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciAqZHN0LAorCQkJICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMCwKKwkJCSAgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzEsCisJCQkgIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMyKQoreworICAgc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqaW5zdCA9IENBTExPQ19TVFJVQ1QoYXNtX2luc3RydWN0aW9uKTsKKworICAgaWYgKGluc3QpIHsKKyAgICAgIF9tZXNhX2luaXRfaW5zdHJ1Y3Rpb25zKCYgaW5zdC0+QmFzZSwgMSk7CisgICAgICBpbnN0LT5CYXNlLk9wY29kZSA9IGJhc2UtPk9wY29kZTsKKyAgICAgIGluc3QtPkJhc2UuQ29uZFVwZGF0ZSA9IGJhc2UtPkNvbmRVcGRhdGU7CisgICAgICBpbnN0LT5CYXNlLkNvbmREc3QgPSBiYXNlLT5Db25kRHN0OworICAgICAgaW5zdC0+QmFzZS5TYXR1cmF0ZU1vZGUgPSBiYXNlLT5TYXR1cmF0ZU1vZGU7CisgICAgICBpbnN0LT5CYXNlLlByZWNpc2lvbiA9IGJhc2UtPlByZWNpc2lvbjsKKworICAgICAgYXNtX2luc3RydWN0aW9uX3NldF9vcGVyYW5kcyhpbnN0LCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgfQorCisgICByZXR1cm4gaW5zdDsKK30KKworCit2b2lkCitpbml0X2RzdF9yZWcoc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyICpyKQoreworICAgbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOworICAgci0+RmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworICAgci0+V3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICByLT5Db25kTWFzayA9IENPTkRfVFI7CisgICByLT5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKK30KKworCisvKiogTGlrZSBpbml0X2RzdF9yZWcoKSBidXQgc2V0IHRoZSBGaWxlIGFuZCBJbmRleCBmaWVsZHMuICovCit2b2lkCitzZXRfZHN0X3JlZyhzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKnIsIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwgR0xpbnQgaW5kZXgpCit7CisgICBjb25zdCBHTGludCBtYXhJbmRleCA9IDEgPDwgSU5TVF9JTkRFWF9CSVRTOworICAgY29uc3QgR0xpbnQgbWluSW5kZXggPSAwOworICAgQVNTRVJUKGluZGV4ID49IG1pbkluZGV4KTsKKyAgICh2b2lkKSBtaW5JbmRleDsKKyAgIEFTU0VSVChpbmRleCA8PSBtYXhJbmRleCk7CisgICAodm9pZCkgbWF4SW5kZXg7CisgICBBU1NFUlQoZmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSB8fAorCSAgZmlsZSA9PSBQUk9HUkFNX0FERFJFU1MgfHwKKwkgIGZpbGUgPT0gUFJPR1JBTV9PVVRQVVQpOworICAgbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOworICAgci0+RmlsZSA9IGZpbGU7CisgICByLT5JbmRleCA9IGluZGV4OworICAgci0+V3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICByLT5Db25kTWFzayA9IENPTkRfVFI7CisgICByLT5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKK30KKworCit2b2lkCitpbml0X3NyY19yZWcoc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnIpCit7CisgICBtZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CisgICByLT5CYXNlLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKyAgIHItPkJhc2UuU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIHItPlN5bWJvbCA9IE5VTEw7Cit9CisKKworLyoqIExpa2UgaW5pdF9zcmNfcmVnKCkgYnV0IHNldCB0aGUgRmlsZSBhbmQgSW5kZXggZmllbGRzLgorICogXHJldHVybiBHTF9UUlVFIGlmIGEgdmFsaWQgc3JjIHJlZ2lzdGVyLCBHTF9GQUxTRSBvdGhlcndpc2UKKyAqLwordm9pZAorc2V0X3NyY19yZWcoc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnIsIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwgR0xpbnQgaW5kZXgpCit7CisgICBzZXRfc3JjX3JlZ19zd3oociwgZmlsZSwgaW5kZXgsIFNXSVpaTEVfWFlaVyk7Cit9CisKKwordm9pZAorc2V0X3NyY19yZWdfc3d6KHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpyLCBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIEdMaW50IGluZGV4LAorICAgICAgICAgICAgICAgIEdMdWludCBzd2l6emxlKQoreworICAgY29uc3QgR0xpbnQgbWF4SW5kZXggPSAoMSA8PCBJTlNUX0lOREVYX0JJVFMpIC0gMTsKKyAgIGNvbnN0IEdMaW50IG1pbkluZGV4ID0gLSgxIDw8IElOU1RfSU5ERVhfQklUUyk7CisgICBBU1NFUlQoZmlsZSA8IFBST0dSQU1fRklMRV9NQVgpOworICAgQVNTRVJUKGluZGV4ID49IG1pbkluZGV4KTsKKyAgICh2b2lkKSBtaW5JbmRleDsKKyAgIEFTU0VSVChpbmRleCA8PSBtYXhJbmRleCk7CisgICAodm9pZCkgbWF4SW5kZXg7CisgICBtZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CisgICByLT5CYXNlLkZpbGUgPSBmaWxlOworICAgci0+QmFzZS5JbmRleCA9IGluZGV4OworICAgci0+QmFzZS5Td2l6emxlID0gc3dpenpsZTsKKyAgIHItPlN5bWJvbCA9IE5VTEw7Cit9CisKKworLyoqCisgKiBWYWxpZGF0ZSB0aGUgc2V0IG9mIGlucHV0cyB1c2VkIGJ5IGEgcHJvZ3JhbQorICoKKyAqIFZhbGlkYXRlcyB0aGF0IGxlZ2FsIHNldHMgb2YgaW5wdXRzIGFyZSB1c2VkIGJ5IHRoZSBwcm9ncmFtLiAgSW4gdGhpcyBjYXNlCisgKiAidXNlZCIgaW5jbHVkZWQgYm90aCByZWFkaW5nIHRoZSBpbnB1dCBvciBiaW5kaW5nIHRoZSBpbnB1dCB0byBhIG5hbWUgdXNpbmcKKyAqIHRoZSBcYyBBVFRSSUIgY29tbWFuZC4KKyAqCisgKiBccmV0dXJuCisgKiBcYyBUUlVFIGlmIHRoZSBjb21iaW5hdGlvbiBvZiBpbnB1dHMgdXNlZCBpcyB2YWxpZCwgXGMgRkFMU0Ugb3RoZXJ3aXNlLgorICovCitpbnQKK3ZhbGlkYXRlX2lucHV0cyhzdHJ1Y3QgWVlMVFlQRSAqbG9jcCwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKQoreworICAgY29uc3QgR0xiaXRmaWVsZDY0IGlucHV0cyA9IHN0YXRlLT5wcm9nLT5JbnB1dHNSZWFkIHwgc3RhdGUtPklucHV0c0JvdW5kOworCisgICBpZiAoKChpbnB1dHMgJiBWRVJUX0JJVF9GRl9BTEwpICYgKGlucHV0cyA+PiBWRVJUX0FUVFJJQl9HRU5FUklDMCkpICE9IDApIHsKKyAgICAgIHl5ZXJyb3IobG9jcCwgc3RhdGUsICJpbGxlZ2FsIHVzZSBvZiBnZW5lcmljIGF0dHJpYnV0ZSBhbmQgbmFtZSBhdHRyaWJ1dGUiKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworCitzdHJ1Y3QgYXNtX3N5bWJvbCAqCitkZWNsYXJlX3ZhcmlhYmxlKHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSwgY2hhciAqbmFtZSwgZW51bSBhc21fdHlwZSB0LAorCQkgc3RydWN0IFlZTFRZUEUgKmxvY3ApCit7CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqcyA9IE5VTEw7CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqZXhpc3QgPSAoc3RydWN0IGFzbV9zeW1ib2wgKikKKyAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbChzdGF0ZS0+c3QsIDAsIG5hbWUpOworCisKKyAgIGlmIChleGlzdCAhPSBOVUxMKSB7CisgICAgICB5eWVycm9yKGxvY3AsIHN0YXRlLCAicmVkZWNsYXJlZCBpZGVudGlmaWVyIik7CisgICB9IGVsc2UgeworICAgICAgcyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFzbV9zeW1ib2wpKTsKKyAgICAgIHMtPm5hbWUgPSBuYW1lOworICAgICAgcy0+dHlwZSA9IHQ7CisKKyAgICAgIHN3aXRjaCAodCkgeworICAgICAgY2FzZSBhdF90ZW1wOgorCSBpZiAoc3RhdGUtPnByb2ctPk51bVRlbXBvcmFyaWVzID49IHN0YXRlLT5saW1pdHMtPk1heFRlbXBzKSB7CisJICAgIHl5ZXJyb3IobG9jcCwgc3RhdGUsICJ0b28gbWFueSB0ZW1wb3JhcmllcyBkZWNsYXJlZCIpOworCSAgICBmcmVlKHMpOworCSAgICByZXR1cm4gTlVMTDsKKwkgfQorCisJIHMtPnRlbXBfYmluZGluZyA9IHN0YXRlLT5wcm9nLT5OdW1UZW1wb3JhcmllczsKKwkgc3RhdGUtPnByb2ctPk51bVRlbXBvcmFyaWVzKys7CisJIGJyZWFrOworCisgICAgICBjYXNlIGF0X2FkZHJlc3M6CisJIGlmIChzdGF0ZS0+cHJvZy0+TnVtQWRkcmVzc1JlZ3MgPj0gc3RhdGUtPmxpbWl0cy0+TWF4QWRkcmVzc1JlZ3MpIHsKKwkgICAgeXllcnJvcihsb2NwLCBzdGF0ZSwgInRvbyBtYW55IGFkZHJlc3MgcmVnaXN0ZXJzIGRlY2xhcmVkIik7CisJICAgIGZyZWUocyk7CisJICAgIHJldHVybiBOVUxMOworCSB9CisKKwkgLyogRklOSVNITUU6IEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhZGRyZXNzIHJlZ2lzdGVycy4KKwkgICovCisJIHN0YXRlLT5wcm9nLT5OdW1BZGRyZXNzUmVncysrOworCSBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkgYnJlYWs7CisgICAgICB9CisKKyAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9hZGRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgcy0+bmFtZSwgcyk7CisgICAgICBzLT5uZXh0ID0gc3RhdGUtPnN5bTsKKyAgICAgIHN0YXRlLT5zeW0gPSBzOworICAgfQorCisgICByZXR1cm4gczsKK30KKworCitpbnQgYWRkX3N0YXRlX3JlZmVyZW5jZShzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1fbGlzdCwKKwkJCWNvbnN0IGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdKQoreworICAgY29uc3QgR0x1aW50IHNpemUgPSA0OyAvKiBYWFggZml4ICovCisgICBjaGFyICpuYW1lOworICAgR0xpbnQgaW5kZXg7CisKKyAgIG5hbWUgPSBfbWVzYV9wcm9ncmFtX3N0YXRlX3N0cmluZyh0b2tlbnMpOworICAgaW5kZXggPSBfbWVzYV9hZGRfcGFyYW1ldGVyKHBhcmFtX2xpc3QsIFBST0dSQU1fU1RBVEVfVkFSLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIEdMX05PTkUsIE5VTEwsIHRva2Vucyk7CisgICBwYXJhbV9saXN0LT5TdGF0ZUZsYWdzIHw9IF9tZXNhX3Byb2dyYW1fc3RhdGVfZmxhZ3ModG9rZW5zKTsKKworICAgLyogZnJlZSBuYW1lIHN0cmluZyBoZXJlIHNpbmNlIHdlIGR1cGxpY2F0ZWQgaXQgaW4gYWRkX3BhcmFtZXRlcigpICovCisgICBmcmVlKG5hbWUpOworCisgICByZXR1cm4gaW5kZXg7Cit9CisKKworaW50Citpbml0aWFsaXplX3N5bWJvbF9mcm9tX3N0YXRlKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorCQkJICAgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqcGFyYW1fdmFyLCAKKwkJCSAgICAgY29uc3QgZ2xfc3RhdGVfaW5kZXggdG9rZW5zW1NUQVRFX0xFTkdUSF0pCit7CisgICBpbnQgaWR4ID0gLTE7CisgICBnbF9zdGF0ZV9pbmRleCBzdGF0ZV90b2tlbnNbU1RBVEVfTEVOR1RIXTsKKworCisgICBtZW1jcHkoc3RhdGVfdG9rZW5zLCB0b2tlbnMsIHNpemVvZihzdGF0ZV90b2tlbnMpKTsKKworICAgcGFyYW1fdmFyLT50eXBlID0gYXRfcGFyYW07CisgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfdHlwZSA9IFBST0dSQU1fU1RBVEVfVkFSOworCisgICAvKiBJZiB3ZSBhcmUgYWRkaW5nIGEgU1RBVEVfTUFUUklYIHRoYXQgaGFzIG11bHRpcGxlIHJvd3MsIHdlIG5lZWQgdG8KKyAgICAqIHVucm9sbCBpdCBhbmQgY2FsbCBhZGRfc3RhdGVfcmVmZXJlbmNlKCkgZm9yIGVhY2ggcm93CisgICAgKi8KKyAgIGlmICgoc3RhdGVfdG9rZW5zWzBdID09IFNUQVRFX01PREVMVklFV19NQVRSSVggfHwKKwlzdGF0ZV90b2tlbnNbMF0gPT0gU1RBVEVfUFJPSkVDVElPTl9NQVRSSVggfHwKKwlzdGF0ZV90b2tlbnNbMF0gPT0gU1RBVEVfTVZQX01BVFJJWCB8fAorCXN0YXRlX3Rva2Vuc1swXSA9PSBTVEFURV9URVhUVVJFX01BVFJJWCB8fAorCXN0YXRlX3Rva2Vuc1swXSA9PSBTVEFURV9QUk9HUkFNX01BVFJJWCkKKyAgICAgICAmJiAoc3RhdGVfdG9rZW5zWzJdICE9IHN0YXRlX3Rva2Vuc1szXSkpIHsKKyAgICAgIGludCByb3c7CisgICAgICBjb25zdCBpbnQgZmlyc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzJdOworICAgICAgY29uc3QgaW50IGxhc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzNdOworCisgICAgICBmb3IgKHJvdyA9IGZpcnN0X3Jvdzsgcm93IDw9IGxhc3Rfcm93OyByb3crKykgeworCSBzdGF0ZV90b2tlbnNbMl0gPSBzdGF0ZV90b2tlbnNbM10gPSByb3c7CisKKwkgaWR4ID0gYWRkX3N0YXRlX3JlZmVyZW5jZShwcm9nLT5QYXJhbWV0ZXJzLCBzdGF0ZV90b2tlbnMpOworCSBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworCSAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSBpZHg7CisgICAgICAgICAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgICAgIH0KKworCSBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfbGVuZ3RoKys7CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIGlkeCA9IGFkZF9zdGF0ZV9yZWZlcmVuY2UocHJvZy0+UGFyYW1ldGVycywgc3RhdGVfdG9rZW5zKTsKKyAgICAgIGlmIChwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPT0gfjBVKSB7CisJIHBhcmFtX3Zhci0+cGFyYW1fYmluZGluZ19iZWdpbiA9IGlkeDsKKyAgICAgICAgIHBhcmFtX3Zhci0+cGFyYW1fYmluZGluZ19zd2l6emxlID0gU1dJWlpMRV9YWVpXOworICAgICAgfQorICAgICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCsrOworICAgfQorCisgICByZXR1cm4gaWR4OworfQorCisKK2ludAoraW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9wYXJhbShzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKwkJCSAgICAgc3RydWN0IGFzbV9zeW1ib2wgKnBhcmFtX3ZhciwgCisJCQkgICAgIGNvbnN0IGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdKQoreworICAgaW50IGlkeCA9IC0xOworICAgZ2xfc3RhdGVfaW5kZXggc3RhdGVfdG9rZW5zW1NUQVRFX0xFTkdUSF07CisKKworICAgbWVtY3B5KHN0YXRlX3Rva2VucywgdG9rZW5zLCBzaXplb2Yoc3RhdGVfdG9rZW5zKSk7CisKKyAgIGFzc2VydCgoc3RhdGVfdG9rZW5zWzBdID09IFNUQVRFX1ZFUlRFWF9QUk9HUkFNKQorCSAgfHwgKHN0YXRlX3Rva2Vuc1swXSA9PSBTVEFURV9GUkFHTUVOVF9QUk9HUkFNKSk7CisgICBhc3NlcnQoKHN0YXRlX3Rva2Vuc1sxXSA9PSBTVEFURV9FTlYpCisJICB8fCAoc3RhdGVfdG9rZW5zWzFdID09IFNUQVRFX0xPQ0FMKSk7CisKKyAgIC8qCisgICAgKiBUaGUgcGFyYW0gdHlwZSBpcyBTVEFURV9WQVIuICBUaGUgcHJvZ3JhbSBwYXJhbWV0ZXIgZW50cnkgd2lsbAorICAgICogZWZmZWN0aXZlbHkgYmUgYSBwb2ludGVyIGludG8gdGhlIExPQ0FMIG9yIEVOViBwYXJhbWV0ZXIgYXJyYXkuCisgICAgKi8KKyAgIHBhcmFtX3Zhci0+dHlwZSA9IGF0X3BhcmFtOworICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX3R5cGUgPSBQUk9HUkFNX1NUQVRFX1ZBUjsKKworICAgLyogSWYgd2UgYXJlIGFkZGluZyBhIFNUQVRFX0VOViBvciBTVEFURV9MT0NBTCB0aGF0IGhhcyBtdWx0aXBsZSBlbGVtZW50cywKKyAgICAqIHdlIG5lZWQgdG8gdW5yb2xsIGl0IGFuZCBjYWxsIGFkZF9zdGF0ZV9yZWZlcmVuY2UoKSBmb3IgZWFjaCByb3cKKyAgICAqLworICAgaWYgKHN0YXRlX3Rva2Vuc1syXSAhPSBzdGF0ZV90b2tlbnNbM10pIHsKKyAgICAgIGludCByb3c7CisgICAgICBjb25zdCBpbnQgZmlyc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzJdOworICAgICAgY29uc3QgaW50IGxhc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzNdOworCisgICAgICBmb3IgKHJvdyA9IGZpcnN0X3Jvdzsgcm93IDw9IGxhc3Rfcm93OyByb3crKykgeworCSBzdGF0ZV90b2tlbnNbMl0gPSBzdGF0ZV90b2tlbnNbM10gPSByb3c7CisKKwkgaWR4ID0gYWRkX3N0YXRlX3JlZmVyZW5jZShwcm9nLT5QYXJhbWV0ZXJzLCBzdGF0ZV90b2tlbnMpOworCSBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworCSAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSBpZHg7CisgICAgICAgICAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgICAgIH0KKwkgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCsrOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICBpZHggPSBhZGRfc3RhdGVfcmVmZXJlbmNlKHByb2ctPlBhcmFtZXRlcnMsIHN0YXRlX3Rva2Vucyk7CisgICAgICBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworCSBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSBpZHg7CisgICAgICAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgIH0KKyAgICAgIHBhcmFtX3Zhci0+cGFyYW1fYmluZGluZ19sZW5ndGgrKzsKKyAgIH0KKworICAgcmV0dXJuIGlkeDsKK30KKworCisvKioKKyAqIFB1dCBhIGZsb2F0L3ZlY3RvciBjb25zdGFudC9saXRlcmFsIGludG8gdGhlIHBhcmFtZXRlciBsaXN0LgorICogXHBhcmFtIHBhcmFtX3ZhciAgcmV0dXJucyBpbmZvIGFib3V0IHRoZSBwYXJhbWV0ZXIvY29uc3RhbnQncyBsb2NhdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgIGJpbmRpbmcsIHR5cGUsIGV0Yy4KKyAqIFxwYXJhbSB2ZWMgIHRoZSB2ZWN0b3IvY29uc3RhbnQgdG8gYWRkCisgKiBccGFyYW0gYWxsb3dTd2l6emxlICBpZiB0cnVlLCB0cnkgdG8gY29uc29saWRhdGUgY29uc3RhbnRzIHdoaWNoIG9ubHkgZGlmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICBieSBhIHN3aXp6bGUuICBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgd2hlbiBidWlsZGluZworICogICAgICAgICAgICAgICAgICAgICAgYXJyYXlzIG9mIGNvbnN0YW50cyB0aGF0IG1heSBiZSBpbmRleGVkIGluZGlyZWN0bHkuCisgKiBccmV0dXJuIGluZGV4IG9mIHRoZSBjb25zdGFudCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCisgKi8KK2ludAoraW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKwkJCSAgICAgc3RydWN0IGFzbV9zeW1ib2wgKnBhcmFtX3ZhciwgCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhc21fdmVjdG9yICp2ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBhbGxvd1N3aXp6bGUpCit7CisgICB1bnNpZ25lZCBzd2l6emxlOworICAgY29uc3QgaW50IGlkeCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHByb2ctPlBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjLT5kYXRhLCB2ZWMtPmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93U3dpenpsZSA/ICZzd2l6emxlIDogTlVMTCk7CisKKyAgIHBhcmFtX3Zhci0+dHlwZSA9IGF0X3BhcmFtOworICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX3R5cGUgPSBQUk9HUkFNX0NPTlNUQU5UOworCisgICBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworICAgICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID0gaWR4OworICAgICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX3N3aXp6bGUgPSBhbGxvd1N3aXp6bGUgPyBzd2l6emxlIDogU1dJWlpMRV9YWVpXOworICAgfQorICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCsrOworCisgICByZXR1cm4gaWR4OworfQorCisKK2NoYXIgKgorbWFrZV9lcnJvcl9zdHJpbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICBpbnQgbGVuZ3RoOworICAgY2hhciAqc3RyOworICAgdmFfbGlzdCBhcmdzOworCisKKyAgIC8qIENhbGwgdnNucHJpbnRmIG9uY2UgdG8gZGV0ZXJtaW5lIGhvdyBsYXJnZSB0aGUgZmluYWwgc3RyaW5nIGlzLiAgQ2FsbCBpdAorICAgICogYWdhaW4gdG8gZG8gdGhlIGFjdHVhbCBmb3JtYXR0aW5nLiAgZnJvbSB0aGUgdnNucHJpbnRmIG1hbnVhbCBwYWdlOgorICAgICoKKyAgICAqICAgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIG51bWJlciBvZgorICAgICogICAgY2hhcmFjdGVycyBwcmludGVkICAobm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJyB1c2VkIHRvIGVuZAorICAgICogICAgb3V0cHV0IHRvIHN0cmluZ3MpLgorICAgICovCisgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgbGVuZ3RoID0gMSArIHZzbnByaW50ZihOVUxMLCAwLCBmbXQsIGFyZ3MpOworICAgdmFfZW5kKGFyZ3MpOworCisgICBzdHIgPSBtYWxsb2MobGVuZ3RoKTsKKyAgIGlmIChzdHIpIHsKKyAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgICB2c25wcmludGYoc3RyLCBsZW5ndGgsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQoYXJncyk7CisgICB9CisKKyAgIHJldHVybiBzdHI7Cit9CisKKwordm9pZAoreXllcnJvcihZWUxUWVBFICpsb2NwLCBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKnMpCit7CisgICBjaGFyICplcnJfc3RyOworCisKKyAgIGVycl9zdHIgPSBtYWtlX2Vycm9yX3N0cmluZygiZ2xQcm9ncmFtU3RyaW5nQVJCKCVzKVxuIiwgcyk7CisgICBpZiAoZXJyX3N0cikgeworICAgICAgX21lc2FfZXJyb3Ioc3RhdGUtPmN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sICIlcyIsIGVycl9zdHIpOworICAgICAgZnJlZShlcnJfc3RyKTsKKyAgIH0KKworICAgZXJyX3N0ciA9IG1ha2VfZXJyb3Jfc3RyaW5nKCJsaW5lICV1LCBjaGFyICV1OiBlcnJvcjogJXNcbiIsCisJCQkgICAgICAgbG9jcC0+Zmlyc3RfbGluZSwgbG9jcC0+Zmlyc3RfY29sdW1uLCBzKTsKKyAgIF9tZXNhX3NldF9wcm9ncmFtX2Vycm9yKHN0YXRlLT5jdHgsIGxvY3AtPnBvc2l0aW9uLCBlcnJfc3RyKTsKKworICAgaWYgKGVycl9zdHIpIHsKKyAgICAgIGZyZWUoZXJyX3N0cik7CisgICB9Cit9CisKKworR0xib29sZWFuCitfbWVzYV9wYXJzZV9hcmJfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHVieXRlICpzdHIsCisJCQlHTHNpemVpIGxlbiwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKQoreworICAgc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqaW5zdDsKKyAgIHVuc2lnbmVkIGk7CisgICBHTHVieXRlICpzdHJ6OworICAgR0xib29sZWFuIHJlc3VsdCA9IEdMX0ZBTFNFOworICAgdm9pZCAqdGVtcDsKKyAgIHN0cnVjdCBhc21fc3ltYm9sICpzeW07CisKKyAgIHN0YXRlLT5jdHggPSBjdHg7CisgICBzdGF0ZS0+cHJvZy0+VGFyZ2V0ID0gdGFyZ2V0OworICAgc3RhdGUtPnByb2ctPlBhcmFtZXRlcnMgPSBfbWVzYV9uZXdfcGFyYW1ldGVyX2xpc3QoKTsKKworICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIHByb2dyYW0gc3RyaW5nIGFuZCBmb3JjZSBpdCB0byBiZSBOVUwtdGVybWluYXRlZC4KKyAgICAqLworICAgc3RyeiA9IChHTHVieXRlICopIG1hbGxvYyhsZW4gKyAxKTsKKyAgIGlmIChzdHJ6ID09IE5VTEwpIHsKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImdsUHJvZ3JhbVN0cmluZ0FSQiIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorICAgbWVtY3B5IChzdHJ6LCBzdHIsIGxlbik7CisgICBzdHJ6W2xlbl0gPSAnXDAnOworCisgICBzdGF0ZS0+cHJvZy0+U3RyaW5nID0gc3RyejsKKworICAgc3RhdGUtPnN0ID0gX21lc2Ffc3ltYm9sX3RhYmxlX2N0b3IoKTsKKworICAgc3RhdGUtPmxpbWl0cyA9ICh0YXJnZXQgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCKQorICAgICAgPyAmIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdCisgICAgICA6ICYgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXTsKKworICAgc3RhdGUtPk1heFRleHR1cmVJbWFnZVVuaXRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhUZXh0dXJlSW1hZ2VVbml0czsKKyAgIHN0YXRlLT5NYXhUZXh0dXJlQ29vcmRVbml0cyA9IGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHM7CisgICBzdGF0ZS0+TWF4VGV4dHVyZVVuaXRzID0gY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7CisgICBzdGF0ZS0+TWF4Q2xpcFBsYW5lcyA9IGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lczsKKyAgIHN0YXRlLT5NYXhMaWdodHMgPSBjdHgtPkNvbnN0Lk1heExpZ2h0czsKKyAgIHN0YXRlLT5NYXhQcm9ncmFtTWF0cmljZXMgPSBjdHgtPkNvbnN0Lk1heFByb2dyYW1NYXRyaWNlczsKKyAgIHN0YXRlLT5NYXhEcmF3QnVmZmVycyA9IGN0eC0+Q29uc3QuTWF4RHJhd0J1ZmZlcnM7CisKKyAgIHN0YXRlLT5zdGF0ZV9wYXJhbV9lbnVtID0gKHRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIpCisgICAgICA/IFNUQVRFX1ZFUlRFWF9QUk9HUkFNIDogU1RBVEVfRlJBR01FTlRfUFJPR1JBTTsKKworICAgX21lc2Ffc2V0X3Byb2dyYW1fZXJyb3IoY3R4LCAtMSwgTlVMTCk7CisKKyAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfY3RvcigmIHN0YXRlLT5zY2FubmVyLCBzdGF0ZSwgKGNvbnN0IGNoYXIgKikgc3RyLCBsZW4pOworICAgeXlwYXJzZShzdGF0ZSk7CisgICBfbWVzYV9wcm9ncmFtX2xleGVyX2R0b3Ioc3RhdGUtPnNjYW5uZXIpOworCisKKyAgIGlmIChjdHgtPlByb2dyYW0uRXJyb3JQb3MgIT0gLTEpIHsKKyAgICAgIGdvdG8gZXJyb3I7CisgICB9CisKKyAgIGlmICghIF9tZXNhX2xheW91dF9wYXJhbWV0ZXJzKHN0YXRlKSkgeworICAgICAgc3RydWN0IFlZTFRZUEUgbG9jOworCisgICAgICBsb2MuZmlyc3RfbGluZSA9IDA7CisgICAgICBsb2MuZmlyc3RfY29sdW1uID0gMDsKKyAgICAgIGxvYy5wb3NpdGlvbiA9IGxlbjsKKworICAgICAgeXllcnJvcigmIGxvYywgc3RhdGUsICJpbnZhbGlkIFBBUkFNIHVzYWdlIik7CisgICAgICBnb3RvIGVycm9yOworICAgfQorCisKKyAgIAorICAgLyogQWRkIG9uZSBpbnN0cnVjdGlvbiB0byBzdG9yZSB0aGUgIkVORCIgaW5zdHJ1Y3Rpb24uCisgICAgKi8KKyAgIHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnMgPQorICAgICAgX21lc2FfYWxsb2NfaW5zdHJ1Y3Rpb25zKHN0YXRlLT5wcm9nLT5OdW1JbnN0cnVjdGlvbnMgKyAxKTsKKworICAgaWYgKHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnMgPT0gTlVMTCkgeworICAgICAgZ290byBlcnJvcjsKKyAgIH0KKworICAgaW5zdCA9IHN0YXRlLT5pbnN0X2hlYWQ7CisgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICpjb25zdCB0ZW1wID0gaW5zdC0+bmV4dDsKKworICAgICAgc3RhdGUtPnByb2ctPkluc3RydWN0aW9uc1tpXSA9IGluc3QtPkJhc2U7CisgICAgICBpbnN0ID0gdGVtcDsKKyAgIH0KKworICAgLyogRmluYWxseSwgdGFnIG9uIGFuIE9QQ09ERV9FTkQgaW5zdHJ1Y3Rpb24gKi8KKyAgIHsKKyAgICAgIGNvbnN0IEdMdWludCBudW1JbnN0ID0gc3RhdGUtPnByb2ctPk51bUluc3RydWN0aW9uczsKKyAgICAgIF9tZXNhX2luaXRfaW5zdHJ1Y3Rpb25zKHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnMgKyBudW1JbnN0LCAxKTsKKyAgICAgIHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnNbbnVtSW5zdF0uT3Bjb2RlID0gT1BDT0RFX0VORDsKKyAgIH0KKyAgIHN0YXRlLT5wcm9nLT5OdW1JbnN0cnVjdGlvbnMrKzsKKworICAgc3RhdGUtPnByb2ctPk51bVBhcmFtZXRlcnMgPSBzdGF0ZS0+cHJvZy0+UGFyYW1ldGVycy0+TnVtUGFyYW1ldGVyczsKKyAgIHN0YXRlLT5wcm9nLT5OdW1BdHRyaWJ1dGVzID0gX21lc2FfYml0Y291bnRfNjQoc3RhdGUtPnByb2ctPklucHV0c1JlYWQpOworCisgICAvKgorICAgICogSW5pdGlhbGl6ZSBuYXRpdmUgY291bnRzIHRvIGxvZ2ljYWwgY291bnRzLiAgVGhlIGRldmljZSBkcml2ZXIgbWF5CisgICAgKiBjaGFuZ2UgdGhlbSBpZiBwcm9ncmFtIGlzIHRyYW5zbGF0ZWQgaW50byBhIGhhcmR3YXJlIHByb2dyYW0uCisgICAgKi8KKyAgIHN0YXRlLT5wcm9nLT5OdW1OYXRpdmVJbnN0cnVjdGlvbnMgPSBzdGF0ZS0+cHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOworICAgc3RhdGUtPnByb2ctPk51bU5hdGl2ZVRlbXBvcmFyaWVzID0gc3RhdGUtPnByb2ctPk51bVRlbXBvcmFyaWVzOworICAgc3RhdGUtPnByb2ctPk51bU5hdGl2ZVBhcmFtZXRlcnMgPSBzdGF0ZS0+cHJvZy0+TnVtUGFyYW1ldGVyczsKKyAgIHN0YXRlLT5wcm9nLT5OdW1OYXRpdmVBdHRyaWJ1dGVzID0gc3RhdGUtPnByb2ctPk51bUF0dHJpYnV0ZXM7CisgICBzdGF0ZS0+cHJvZy0+TnVtTmF0aXZlQWRkcmVzc1JlZ3MgPSBzdGF0ZS0+cHJvZy0+TnVtQWRkcmVzc1JlZ3M7CisKKyAgIHJlc3VsdCA9IEdMX1RSVUU7CisKK2Vycm9yOgorICAgZm9yIChpbnN0ID0gc3RhdGUtPmluc3RfaGVhZDsgaW5zdCAhPSBOVUxMOyBpbnN0ID0gdGVtcCkgeworICAgICAgdGVtcCA9IGluc3QtPm5leHQ7CisgICAgICBmcmVlKGluc3QpOworICAgfQorCisgICBzdGF0ZS0+aW5zdF9oZWFkID0gTlVMTDsKKyAgIHN0YXRlLT5pbnN0X3RhaWwgPSBOVUxMOworCisgICBmb3IgKHN5bSA9IHN0YXRlLT5zeW07IHN5bSAhPSBOVUxMOyBzeW0gPSB0ZW1wKSB7CisgICAgICB0ZW1wID0gc3ltLT5uZXh0OworCisgICAgICBmcmVlKCh2b2lkICopIHN5bS0+bmFtZSk7CisgICAgICBmcmVlKHN5bSk7CisgICB9CisgICBzdGF0ZS0+c3ltID0gTlVMTDsKKworICAgX21lc2Ffc3ltYm9sX3RhYmxlX2R0b3Ioc3RhdGUtPnN0KTsKKyAgIHN0YXRlLT5zdCA9IE5VTEw7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW1fcGFyc2UudGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiMWMxMAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZS50YWIuaApAQCAtMCwwICsxLDIyNSBAQAorLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNy4xMi00OTk2LiAgKi8KKworLyogQmlzb24gaW50ZXJmYWNlIGZvciBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCisgICAKKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucworICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKKyAgIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBzbyBsb25nIGFzIHRoYXQgd29yayBpc24ndCBpdHNlbGYgYQorICAgcGFyc2VyIGdlbmVyYXRvciB1c2luZyB0aGUgc2tlbGV0b24gb3IgYSBtb2RpZmllZCB2ZXJzaW9uIHRoZXJlb2YKKyAgIGFzIGEgcGFyc2VyIHNrZWxldG9uLiAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IG1vZGlmeSBvciByZWRpc3RyaWJ1dGUKKyAgIHRoZSBwYXJzZXIgc2tlbGV0b24gaXRzZWxmLCB5b3UgbWF5IChhdCB5b3VyIG9wdGlvbikgcmVtb3ZlIHRoaXMKKyAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZworICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgorICAgCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCisgICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCisKKyNpZm5kZWYgWVlfX01FU0FfUFJPR1JBTV9QUk9HUkFNX1BST0dSQU1fUEFSU0VfVEFCX0hfSU5DTFVERUQKKyMgZGVmaW5lIFlZX19NRVNBX1BST0dSQU1fUFJPR1JBTV9QUk9HUkFNX1BBUlNFX1RBQl9IX0lOQ0xVREVECisvKiBFbmFibGluZyB0cmFjZXMuICAqLworI2lmbmRlZiBZWURFQlVHCisjIGRlZmluZSBZWURFQlVHIDAKKyNlbmRpZgorI2lmIFlZREVCVUcKK2V4dGVybiBpbnQgX21lc2FfcHJvZ3JhbV9kZWJ1ZzsKKyNlbmRpZgorCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBBUkJ2cF8xMCA9IDI1OCwKKyAgICAgQVJCZnBfMTAgPSAyNTksCisgICAgIEFERFJFU1MgPSAyNjAsCisgICAgIEFMSUFTID0gMjYxLAorICAgICBBVFRSSUIgPSAyNjIsCisgICAgIE9QVElPTiA9IDI2MywKKyAgICAgT1VUUFVUID0gMjY0LAorICAgICBQQVJBTSA9IDI2NSwKKyAgICAgVEVNUCA9IDI2NiwKKyAgICAgRU5EID0gMjY3LAorICAgICBCSU5fT1AgPSAyNjgsCisgICAgIEJJTlNDX09QID0gMjY5LAorICAgICBTQU1QTEVfT1AgPSAyNzAsCisgICAgIFNDQUxBUl9PUCA9IDI3MSwKKyAgICAgVFJJX09QID0gMjcyLAorICAgICBWRUNUT1JfT1AgPSAyNzMsCisgICAgIEFSTCA9IDI3NCwKKyAgICAgS0lMID0gMjc1LAorICAgICBTV1ogPSAyNzYsCisgICAgIFRYRF9PUCA9IDI3NywKKyAgICAgSU5URUdFUiA9IDI3OCwKKyAgICAgUkVBTCA9IDI3OSwKKyAgICAgQU1CSUVOVCA9IDI4MCwKKyAgICAgQVRURU5VQVRJT04gPSAyODEsCisgICAgIEJBQ0sgPSAyODIsCisgICAgIENMSVAgPSAyODMsCisgICAgIENPTE9SID0gMjg0LAorICAgICBERVBUSCA9IDI4NSwKKyAgICAgRElGRlVTRSA9IDI4NiwKKyAgICAgRElSRUNUSU9OID0gMjg3LAorICAgICBFTUlTU0lPTiA9IDI4OCwKKyAgICAgRU5WID0gMjg5LAorICAgICBFWUUgPSAyOTAsCisgICAgIEZPRyA9IDI5MSwKKyAgICAgRk9HQ09PUkQgPSAyOTIsCisgICAgIEZSQUdNRU5UID0gMjkzLAorICAgICBGUk9OVCA9IDI5NCwKKyAgICAgSEFMRiA9IDI5NSwKKyAgICAgSU5WRVJTRSA9IDI5NiwKKyAgICAgSU5WVFJBTlMgPSAyOTcsCisgICAgIExJR0hUID0gMjk4LAorICAgICBMSUdIVE1PREVMID0gMjk5LAorICAgICBMSUdIVFBST0QgPSAzMDAsCisgICAgIExPQ0FMID0gMzAxLAorICAgICBNQVRFUklBTCA9IDMwMiwKKyAgICAgTUFUX1BST0dSQU0gPSAzMDMsCisgICAgIE1BVFJJWCA9IDMwNCwKKyAgICAgTUFUUklYSU5ERVggPSAzMDUsCisgICAgIE1PREVMVklFVyA9IDMwNiwKKyAgICAgTVZQID0gMzA3LAorICAgICBOT1JNQUwgPSAzMDgsCisgICAgIE9CSkVDVCA9IDMwOSwKKyAgICAgUEFMRVRURSA9IDMxMCwKKyAgICAgUEFSQU1TID0gMzExLAorICAgICBQTEFORSA9IDMxMiwKKyAgICAgUE9JTlRfVE9LID0gMzEzLAorICAgICBQT0lOVFNJWkUgPSAzMTQsCisgICAgIFBPU0lUSU9OID0gMzE1LAorICAgICBQUklNQVJZID0gMzE2LAorICAgICBQUk9HUkFNID0gMzE3LAorICAgICBQUk9KRUNUSU9OID0gMzE4LAorICAgICBSQU5HRSA9IDMxOSwKKyAgICAgUkVTVUxUID0gMzIwLAorICAgICBST1cgPSAzMjEsCisgICAgIFNDRU5FQ09MT1IgPSAzMjIsCisgICAgIFNFQ09OREFSWSA9IDMyMywKKyAgICAgU0hJTklORVNTID0gMzI0LAorICAgICBTSVpFX1RPSyA9IDMyNSwKKyAgICAgU1BFQ1VMQVIgPSAzMjYsCisgICAgIFNQT1QgPSAzMjcsCisgICAgIFNUQVRFID0gMzI4LAorICAgICBURVhDT09SRCA9IDMyOSwKKyAgICAgVEVYRU5WID0gMzMwLAorICAgICBURVhHRU4gPSAzMzEsCisgICAgIFRFWEdFTl9RID0gMzMyLAorICAgICBURVhHRU5fUiA9IDMzMywKKyAgICAgVEVYR0VOX1MgPSAzMzQsCisgICAgIFRFWEdFTl9UID0gMzM1LAorICAgICBURVhUVVJFID0gMzM2LAorICAgICBUUkFOU1BPU0UgPSAzMzcsCisgICAgIFRFWFRVUkVfVU5JVCA9IDMzOCwKKyAgICAgVEVYXzFEID0gMzM5LAorICAgICBURVhfMkQgPSAzNDAsCisgICAgIFRFWF8zRCA9IDM0MSwKKyAgICAgVEVYX0NVQkUgPSAzNDIsCisgICAgIFRFWF9SRUNUID0gMzQzLAorICAgICBURVhfU0hBRE9XMUQgPSAzNDQsCisgICAgIFRFWF9TSEFET1cyRCA9IDM0NSwKKyAgICAgVEVYX1NIQURPV1JFQ1QgPSAzNDYsCisgICAgIFRFWF9BUlJBWTFEID0gMzQ3LAorICAgICBURVhfQVJSQVkyRCA9IDM0OCwKKyAgICAgVEVYX0FSUkFZU0hBRE9XMUQgPSAzNDksCisgICAgIFRFWF9BUlJBWVNIQURPVzJEID0gMzUwLAorICAgICBWRVJURVggPSAzNTEsCisgICAgIFZUWEFUVFJJQiA9IDM1MiwKKyAgICAgV0VJR0hUID0gMzUzLAorICAgICBJREVOVElGSUVSID0gMzU0LAorICAgICBVU0VEX0lERU5USUZJRVIgPSAzNTUsCisgICAgIE1BU0s0ID0gMzU2LAorICAgICBNQVNLMyA9IDM1NywKKyAgICAgTUFTSzIgPSAzNTgsCisgICAgIE1BU0sxID0gMzU5LAorICAgICBTV0laWkxFID0gMzYwLAorICAgICBET1RfRE9UID0gMzYxLAorICAgICBET1QgPSAzNjIKKyAgIH07CisjZW5kaWYKKworCisjaWYgISBkZWZpbmVkIFlZU1RZUEUgJiYgISBkZWZpbmVkIFlZU1RZUEVfSVNfREVDTEFSRUQKK3R5cGVkZWYgdW5pb24gWVlTVFlQRQoreworLyogTGluZSAyMDUzIG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEyNCAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkiCisKKyAgIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKmluc3Q7CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqc3ltOworICAgc3RydWN0IGFzbV9zeW1ib2wgdGVtcF9zeW07CisgICBzdHJ1Y3QgYXNtX3N3aXp6bGVfbWFzayBzd2l6X21hc2s7CisgICBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciBzcmNfcmVnOworICAgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyIGRzdF9yZWc7CisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiB0ZW1wX2luc3Q7CisgICBjaGFyICpzdHJpbmc7CisgICB1bnNpZ25lZCByZXN1bHQ7CisgICB1bnNpZ25lZCBhdHRyaWI7CisgICBpbnQgaW50ZWdlcjsKKyAgIGZsb2F0IHJlYWw7CisgICBnbF9zdGF0ZV9pbmRleCBzdGF0ZVtTVEFURV9MRU5HVEhdOworICAgaW50IG5lZ2F0ZTsKKyAgIHN0cnVjdCBhc21fdmVjdG9yIHZlY3RvcjsKKyAgIGdsX2luc3Rfb3Bjb2RlIG9wY29kZTsKKworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIHN3ejsKKyAgICAgIHVuc2lnbmVkIHJnYmFfdmFsaWQ6MTsKKyAgICAgIHVuc2lnbmVkIHh5endfdmFsaWQ6MTsKKyAgICAgIHVuc2lnbmVkIG5lZ2F0ZToxOworICAgfSBleHRfc3dpenpsZTsKKworCisvKiBMaW5lIDIwNTMgb2YgeWFjYy5jICAqLworI2xpbmUgMTkxICIuL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZS50YWIuaCIKK30gWVlTVFlQRTsKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCisjIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIFlZTFRZUEUgJiYgISBkZWZpbmVkIFlZTFRZUEVfSVNfREVDTEFSRUQKK3R5cGVkZWYgc3RydWN0IFlZTFRZUEUKK3sKKyAgaW50IGZpcnN0X2xpbmU7CisgIGludCBmaXJzdF9jb2x1bW47CisgIGludCBsYXN0X2xpbmU7CisgIGludCBsYXN0X2NvbHVtbjsKK30gWVlMVFlQRTsKKyMgZGVmaW5lIHl5bHR5cGUgWVlMVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KKyMgZGVmaW5lIFlZTFRZUEVfSVNfREVDTEFSRUQgMQorIyBkZWZpbmUgWVlMVFlQRV9JU19UUklWSUFMIDEKKyNlbmRpZgorCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCitpbnQgX21lc2FfcHJvZ3JhbV9wYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSk7CisjZWxzZQoraW50IF9tZXNhX3Byb2dyYW1fcGFyc2UgKCk7CisjZW5kaWYKKyNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLworI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworaW50IF9tZXNhX3Byb2dyYW1fcGFyc2UgKHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSk7CisjZWxzZQoraW50IF9tZXNhX3Byb2dyYW1fcGFyc2UgKCk7CisjZW5kaWYKKyNlbmRpZiAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKworI2VuZGlmIC8qICFZWV9fTUVTQV9QUk9HUkFNX1BST0dSQU1fUFJPR1JBTV9QQVJTRV9UQUJfSF9JTkNMVURFRCAgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZS55IGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9ncmFtX3BhcnNlLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2NDc0MAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZS55CkBAIC0wLDAgKzEsMjgwOSBAQAorJXsKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgIm1haW4vaW1wb3J0cy5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ3JhbS5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyX2xheW91dC5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19zdGF0ZXZhcnMuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKKworI2luY2x1ZGUgInByb2dyYW0vc3ltYm9sX3RhYmxlLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9ncmFtX3BhcnNlci5oIgorCitleHRlcm4gdm9pZCAqeXlfc2Nhbl9zdHJpbmcoY2hhciAqKTsKK2V4dGVybiB2b2lkIHl5X2RlbGV0ZV9idWZmZXIodm9pZCAqKTsKKworc3RhdGljIHN0cnVjdCBhc21fc3ltYm9sICpkZWNsYXJlX3ZhcmlhYmxlKHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSwKKyAgICBjaGFyICpuYW1lLCBlbnVtIGFzbV90eXBlIHQsIHN0cnVjdCBZWUxUWVBFICpsb2NwKTsKKworc3RhdGljIGludCBhZGRfc3RhdGVfcmVmZXJlbmNlKHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbV9saXN0LAorICAgIGNvbnN0IGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdKTsKKworc3RhdGljIGludCBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3N0YXRlKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorICAgIHN0cnVjdCBhc21fc3ltYm9sICpwYXJhbV92YXIsIGNvbnN0IGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdKTsKKworc3RhdGljIGludCBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3BhcmFtKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorICAgIHN0cnVjdCBhc21fc3ltYm9sICpwYXJhbV92YXIsIGNvbnN0IGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdKTsKKworc3RhdGljIGludCBpbml0aWFsaXplX3N5bWJvbF9mcm9tX2NvbnN0KHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorICAgIHN0cnVjdCBhc21fc3ltYm9sICpwYXJhbV92YXIsIGNvbnN0IHN0cnVjdCBhc21fdmVjdG9yICp2ZWMsCisgICAgR0xib29sZWFuIGFsbG93U3dpenpsZSk7CisKK3N0YXRpYyBpbnQgeXlwYXJzZShzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUpOworCitzdGF0aWMgY2hhciAqbWFrZV9lcnJvcl9zdHJpbmcoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitzdGF0aWMgdm9pZCB5eWVycm9yKHN0cnVjdCBZWUxUWVBFICpsb2NwLCBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsCisgICAgY29uc3QgY2hhciAqcyk7CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfaW5wdXRzKHN0cnVjdCBZWUxUWVBFICpsb2NwLAorICAgIHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSk7CisKK3N0YXRpYyB2b2lkIGluaXRfZHN0X3JlZyhzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKnIpOworCitzdGF0aWMgdm9pZCBzZXRfZHN0X3JlZyhzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIEdMaW50IGluZGV4KTsKKworc3RhdGljIHZvaWQgaW5pdF9zcmNfcmVnKHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpyKTsKKworc3RhdGljIHZvaWQgc2V0X3NyY19yZWcoc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIEdMaW50IGluZGV4KTsKKworc3RhdGljIHZvaWQgc2V0X3NyY19yZWdfc3d6KHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwgR0xpbnQgaW5kZXgsIEdMdWludCBzd2l6emxlKTsKKworc3RhdGljIHZvaWQgYXNtX2luc3RydWN0aW9uX3NldF9vcGVyYW5kcyhzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICppbnN0LAorICAgIGNvbnN0IHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciAqZHN0LCBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMCwKKyAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMSwgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzIpOworCitzdGF0aWMgc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqYXNtX2luc3RydWN0aW9uX2N0b3IoZ2xfaW5zdF9vcGNvZGUgb3AsCisgICAgY29uc3Qgc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyICpkc3QsIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMwLAorICAgIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMxLCBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMik7CisKK3N0YXRpYyBzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICphc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKAorICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpiYXNlLCBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdCwKKyAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMCwgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzEsCisgICAgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzIpOworCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgVFJVRSAoIUZBTFNFKQorI2VuZGlmCisKKyNkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQkJXAorICAgZG8gewkJCQkJCQkJCVwKKyAgICAgIGlmIChOKSB7CQkJCQkJCVwKKwkgKEN1cnJlbnQpLmZpcnN0X2xpbmUgPSBZWVJIU0xPQyhSaHMsIDEpLmZpcnN0X2xpbmU7CQlcCisJIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSBZWVJIU0xPQyhSaHMsIDEpLmZpcnN0X2NvbHVtbjsJXAorCSAoQ3VycmVudCkucG9zaXRpb24gPSBZWVJIU0xPQyhSaHMsIDEpLnBvc2l0aW9uOwkJXAorCSAoQ3VycmVudCkubGFzdF9saW5lID0gWVlSSFNMT0MoUmhzLCBOKS5sYXN0X2xpbmU7CQlcCisJIChDdXJyZW50KS5sYXN0X2NvbHVtbiA9IFlZUkhTTE9DKFJocywgTikubGFzdF9jb2x1bW47CQlcCisgICAgICB9IGVsc2UgewkJCQkJCQkJXAorCSAoQ3VycmVudCkuZmlyc3RfbGluZSA9IFlZUkhTTE9DKFJocywgMCkubGFzdF9saW5lOwkJXAorCSAoQ3VycmVudCkubGFzdF9saW5lID0gKEN1cnJlbnQpLmZpcnN0X2xpbmU7CQkJXAorCSAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MoUmhzLCAwKS5sYXN0X2NvbHVtbjsJCVwKKwkgKEN1cnJlbnQpLmxhc3RfY29sdW1uID0gKEN1cnJlbnQpLmZpcnN0X2NvbHVtbjsJCVwKKwkgKEN1cnJlbnQpLnBvc2l0aW9uID0gWVlSSFNMT0MoUmhzLCAwKS5wb3NpdGlvbgkJCVwKKwkgICAgKyAoQ3VycmVudCkuZmlyc3RfY29sdW1uOwkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgIH0gd2hpbGUoMCkKKyV9CisKKyVwdXJlLXBhcnNlcgorJWxvY2F0aW9ucworJWxleC1wYXJhbSAgIHsgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlIH0KKyVwYXJzZS1wYXJhbSB7IHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSB9CislZXJyb3ItdmVyYm9zZQorCisldW5pb24geworICAgc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqaW5zdDsKKyAgIHN0cnVjdCBhc21fc3ltYm9sICpzeW07CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCB0ZW1wX3N5bTsKKyAgIHN0cnVjdCBhc21fc3dpenpsZV9tYXNrIHN3aXpfbWFzazsKKyAgIHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyIHNyY19yZWc7CisgICBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgZHN0X3JlZzsKKyAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uIHRlbXBfaW5zdDsKKyAgIGNoYXIgKnN0cmluZzsKKyAgIHVuc2lnbmVkIHJlc3VsdDsKKyAgIHVuc2lnbmVkIGF0dHJpYjsKKyAgIGludCBpbnRlZ2VyOworICAgZmxvYXQgcmVhbDsKKyAgIGdsX3N0YXRlX2luZGV4IHN0YXRlW1NUQVRFX0xFTkdUSF07CisgICBpbnQgbmVnYXRlOworICAgc3RydWN0IGFzbV92ZWN0b3IgdmVjdG9yOworICAgZ2xfaW5zdF9vcGNvZGUgb3Bjb2RlOworCisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgc3d6OworICAgICAgdW5zaWduZWQgcmdiYV92YWxpZDoxOworICAgICAgdW5zaWduZWQgeHl6d192YWxpZDoxOworICAgICAgdW5zaWduZWQgbmVnYXRlOjE7CisgICB9IGV4dF9zd2l6emxlOworfQorCisldG9rZW4gQVJCdnBfMTAgQVJCZnBfMTAKKworLyogVG9rZW5zIGZvciBhc3NlbWJsZXIgcHNldWRvLW9wcyAqLworJXRva2VuIDxpbnRlZ2VyPiBBRERSRVNTCisldG9rZW4gQUxJQVMgQVRUUklCCisldG9rZW4gT1BUSU9OIE9VVFBVVAorJXRva2VuIFBBUkFNCisldG9rZW4gPGludGVnZXI+IFRFTVAKKyV0b2tlbiBFTkQKKworIC8qIFRva2VucyBmb3IgaW5zdHJ1Y3Rpb25zICovCisldG9rZW4gPHRlbXBfaW5zdD4gQklOX09QIEJJTlNDX09QIFNBTVBMRV9PUCBTQ0FMQVJfT1AgVFJJX09QIFZFQ1RPUl9PUAorJXRva2VuIDx0ZW1wX2luc3Q+IEFSTCBLSUwgU1daIFRYRF9PUAorCisldG9rZW4gPGludGVnZXI+IElOVEVHRVIKKyV0b2tlbiA8cmVhbD4gUkVBTAorCisldG9rZW4gQU1CSUVOVCBBVFRFTlVBVElPTgorJXRva2VuIEJBQ0sKKyV0b2tlbiBDTElQIENPTE9SCisldG9rZW4gREVQVEggRElGRlVTRSBESVJFQ1RJT04KKyV0b2tlbiBFTUlTU0lPTiBFTlYgRVlFCisldG9rZW4gRk9HIEZPR0NPT1JEIEZSQUdNRU5UIEZST05UCisldG9rZW4gSEFMRgorJXRva2VuIElOVkVSU0UgSU5WVFJBTlMKKyV0b2tlbiBMSUdIVCBMSUdIVE1PREVMIExJR0hUUFJPRCBMT0NBTAorJXRva2VuIE1BVEVSSUFMIE1BVF9QUk9HUkFNIE1BVFJJWCBNQVRSSVhJTkRFWCBNT0RFTFZJRVcgTVZQCisldG9rZW4gTk9STUFMCisldG9rZW4gT0JKRUNUCisldG9rZW4gUEFMRVRURSBQQVJBTVMgUExBTkUgUE9JTlRfVE9LIFBPSU5UU0laRSBQT1NJVElPTiBQUklNQVJZIFBST0dSQU0gUFJPSkVDVElPTgorJXRva2VuIFJBTkdFIFJFU1VMVCBST1cKKyV0b2tlbiBTQ0VORUNPTE9SIFNFQ09OREFSWSBTSElOSU5FU1MgU0laRV9UT0sgU1BFQ1VMQVIgU1BPVCBTVEFURQorJXRva2VuIFRFWENPT1JEIFRFWEVOViBURVhHRU4gVEVYR0VOX1EgVEVYR0VOX1IgVEVYR0VOX1MgVEVYR0VOX1QgVEVYVFVSRSBUUkFOU1BPU0UKKyV0b2tlbiBURVhUVVJFX1VOSVQgVEVYXzFEIFRFWF8yRCBURVhfM0QgVEVYX0NVQkUgVEVYX1JFQ1QKKyV0b2tlbiBURVhfU0hBRE9XMUQgVEVYX1NIQURPVzJEIFRFWF9TSEFET1dSRUNUCisldG9rZW4gVEVYX0FSUkFZMUQgVEVYX0FSUkFZMkQgVEVYX0FSUkFZU0hBRE9XMUQgVEVYX0FSUkFZU0hBRE9XMkQgCisldG9rZW4gVkVSVEVYIFZUWEFUVFJJQgorJXRva2VuIFdFSUdIVAorCisldG9rZW4gPHN0cmluZz4gSURFTlRJRklFUiBVU0VEX0lERU5USUZJRVIKKyV0eXBlIDxzdHJpbmc+IHN0cmluZworJXRva2VuIDxzd2l6X21hc2s+IE1BU0s0IE1BU0szIE1BU0syIE1BU0sxIFNXSVpaTEUKKyV0b2tlbiBET1RfRE9UCisldG9rZW4gRE9UCisKKyV0eXBlIDxpbnN0PiBpbnN0cnVjdGlvbiBBTFVfaW5zdHJ1Y3Rpb24gVGV4SW5zdHJ1Y3Rpb24KKyV0eXBlIDxpbnN0PiBBUkxfaW5zdHJ1Y3Rpb24gVkVDVE9Sb3BfaW5zdHJ1Y3Rpb24KKyV0eXBlIDxpbnN0PiBTQ0FMQVJvcF9pbnN0cnVjdGlvbiBCSU5TQ29wX2luc3RydWN0aW9uIEJJTm9wX2luc3RydWN0aW9uCisldHlwZSA8aW5zdD4gVFJJb3BfaW5zdHJ1Y3Rpb24gVFhEX2luc3RydWN0aW9uIFNXWl9pbnN0cnVjdGlvbiBTQU1QTEVfaW5zdHJ1Y3Rpb24KKyV0eXBlIDxpbnN0PiBLSUxfaW5zdHJ1Y3Rpb24KKworJXR5cGUgPGRzdF9yZWc+IGRzdFJlZyBtYXNrZWREc3RSZWcgbWFza2VkQWRkclJlZworJXR5cGUgPHNyY19yZWc+IHNyY1JlZyBzY2FsYXJVc2Ugc2NhbGFyU3JjUmVnIHN3aXp6bGVTcmNSZWcKKyV0eXBlIDxzd2l6X21hc2s+IHNjYWxhclN1ZmZpeCBzd2l6emxlU3VmZml4IGV4dGVuZGVkU3dpenpsZQorJXR5cGUgPGV4dF9zd2l6emxlPiBleHRTd2l6Q29tcCBleHRTd2l6U2VsCisldHlwZSA8c3dpel9tYXNrPiBvcHRpb25hbE1hc2sKKworJXR5cGUgPHN5bT4gcHJvZ1BhcmFtQXJyYXkKKyV0eXBlIDxpbnRlZ2VyPiBhZGRyUmVnUmVsT2Zmc2V0IGFkZHJSZWdQb3NPZmZzZXQgYWRkclJlZ05lZ09mZnNldAorJXR5cGUgPHNyY19yZWc+IHByb2dQYXJhbUFycmF5TWVtIHByb2dQYXJhbUFycmF5QWJzIHByb2dQYXJhbUFycmF5UmVsCisldHlwZSA8c3ltPiBhZGRyUmVnCisldHlwZSA8c3dpel9tYXNrPiBhZGRyQ29tcG9uZW50IGFkZHJXcml0ZU1hc2sKKworJXR5cGUgPGRzdF9yZWc+IGNjTWFza1J1bGUgY2NUZXN0IGNjTWFza1J1bGUyIGNjVGVzdDIgb3B0aW9uYWxDY01hc2sKKworJXR5cGUgPHJlc3VsdD4gcmVzdWx0QmluZGluZyByZXN1bHRDb2xCaW5kaW5nCisldHlwZSA8aW50ZWdlcj4gb3B0RmFjZVR5cGUgb3B0Q29sb3JUeXBlCisldHlwZSA8aW50ZWdlcj4gb3B0UmVzdWx0RmFjZVR5cGUgb3B0UmVzdWx0Q29sb3JUeXBlCisKKyV0eXBlIDxpbnRlZ2VyPiBvcHRUZXhJbWFnZVVuaXROdW0gdGV4SW1hZ2VVbml0TnVtCisldHlwZSA8aW50ZWdlcj4gb3B0VGV4Q29vcmRVbml0TnVtIHRleENvb3JkVW5pdE51bQorJXR5cGUgPGludGVnZXI+IG9wdExlZ2FjeVRleFVuaXROdW0gbGVnYWN5VGV4VW5pdE51bQorJXR5cGUgPGludGVnZXI+IHRleEltYWdlVW5pdCB0ZXhUYXJnZXQKKyV0eXBlIDxpbnRlZ2VyPiB2dHhBdHRyaWJOdW0KKworJXR5cGUgPGF0dHJpYj4gYXR0cmliQmluZGluZyB2dHhBdHRyaWJJdGVtIGZyYWdBdHRyaWJJdGVtCisKKyV0eXBlIDx0ZW1wX3N5bT4gcGFyYW1TaW5nbGVJbml0IHBhcmFtU2luZ2xlSXRlbURlY2wKKyV0eXBlIDxpbnRlZ2VyPiBvcHRBcnJheVNpemUKKworJXR5cGUgPHN0YXRlPiBzdGF0ZVNpbmdsZUl0ZW0gc3RhdGVNdWx0aXBsZUl0ZW0KKyV0eXBlIDxzdGF0ZT4gc3RhdGVNYXRlcmlhbEl0ZW0KKyV0eXBlIDxzdGF0ZT4gc3RhdGVMaWdodEl0ZW0gc3RhdGVMaWdodE1vZGVsSXRlbSBzdGF0ZUxpZ2h0UHJvZEl0ZW0KKyV0eXBlIDxzdGF0ZT4gc3RhdGVUZXhHZW5JdGVtIHN0YXRlRm9nSXRlbSBzdGF0ZUNsaXBQbGFuZUl0ZW0gc3RhdGVQb2ludEl0ZW0KKyV0eXBlIDxzdGF0ZT4gc3RhdGVNYXRyaXhJdGVtIHN0YXRlTWF0cml4Um93IHN0YXRlTWF0cml4Um93cworJXR5cGUgPHN0YXRlPiBzdGF0ZVRleEVudkl0ZW0gc3RhdGVEZXB0aEl0ZW0KKworJXR5cGUgPHN0YXRlPiBzdGF0ZUxNb2RQcm9wZXJ0eQorJXR5cGUgPHN0YXRlPiBzdGF0ZU1hdHJpeE5hbWUgb3B0TWF0cml4Um93cworCisldHlwZSA8aW50ZWdlcj4gc3RhdGVNYXRQcm9wZXJ0eQorJXR5cGUgPGludGVnZXI+IHN0YXRlTGlnaHRQcm9wZXJ0eSBzdGF0ZVNwb3RQcm9wZXJ0eQorJXR5cGUgPGludGVnZXI+IHN0YXRlTGlnaHROdW1iZXIgc3RhdGVMUHJvZFByb3BlcnR5CisldHlwZSA8aW50ZWdlcj4gc3RhdGVUZXhHZW5UeXBlIHN0YXRlVGV4R2VuQ29vcmQKKyV0eXBlIDxpbnRlZ2VyPiBzdGF0ZVRleEVudlByb3BlcnR5CisldHlwZSA8aW50ZWdlcj4gc3RhdGVGb2dQcm9wZXJ0eQorJXR5cGUgPGludGVnZXI+IHN0YXRlQ2xpcFBsYW5lTnVtCisldHlwZSA8aW50ZWdlcj4gc3RhdGVQb2ludFByb3BlcnR5CisKKyV0eXBlIDxpbnRlZ2VyPiBzdGF0ZU9wdE1hdE1vZGlmaWVyIHN0YXRlTWF0TW9kaWZpZXIgc3RhdGVNYXRyaXhSb3dOdW0KKyV0eXBlIDxpbnRlZ2VyPiBzdGF0ZU9wdE1vZE1hdE51bSBzdGF0ZU1vZE1hdE51bSBzdGF0ZVBhbGV0dGVNYXROdW0gCisldHlwZSA8aW50ZWdlcj4gc3RhdGVQcm9ncmFtTWF0TnVtCisKKyV0eXBlIDxpbnRlZ2VyPiBhbWJEaWZmU3BlY1Byb3BlcnR5CisKKyV0eXBlIDxzdGF0ZT4gcHJvZ3JhbVNpbmdsZUl0ZW0gcHJvZ0VudlBhcmFtIHByb2dMb2NhbFBhcmFtCisldHlwZSA8c3RhdGU+IHByb2dyYW1NdWx0aXBsZUl0ZW0gcHJvZ0VudlBhcmFtcyBwcm9nTG9jYWxQYXJhbXMKKworJXR5cGUgPHRlbXBfc3ltPiBwYXJhbU11bHRpcGxlSW5pdCBwYXJhbU11bHRJbml0TGlzdCBwYXJhbU11bHRpcGxlSXRlbQorJXR5cGUgPHRlbXBfc3ltPiBwYXJhbVNpbmdsZUl0ZW1Vc2UKKworJXR5cGUgPGludGVnZXI+IHByb2dFbnZQYXJhbU51bSBwcm9nTG9jYWxQYXJhbU51bQorJXR5cGUgPHN0YXRlPiBwcm9nRW52UGFyYW1OdW1zIHByb2dMb2NhbFBhcmFtTnVtcworCisldHlwZSA8dmVjdG9yPiBwYXJhbUNvbnN0RGVjbCBwYXJhbUNvbnN0VXNlCisldHlwZSA8dmVjdG9yPiBwYXJhbUNvbnN0U2NhbGFyRGVjbCBwYXJhbUNvbnN0U2NhbGFyVXNlIHBhcmFtQ29uc3RWZWN0b3IKKyV0eXBlIDxyZWFsPiBzaWduZWRGbG9hdENvbnN0YW50CisldHlwZSA8bmVnYXRlPiBvcHRpb25hbFNpZ24KKworJXsKK2V4dGVybiBpbnQKK19tZXNhX3Byb2dyYW1fbGV4ZXJfbGV4KFlZU1RZUEUgKnl5bHZhbF9wYXJhbSwgWVlMVFlQRSAqeXlsbG9jX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqeXlzY2FubmVyKTsKKworc3RhdGljIGludAoreXlsZXgoWVlTVFlQRSAqeXlsdmFsX3BhcmFtLCBZWUxUWVBFICp5eWxsb2NfcGFyYW0sCisgICAgICBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gX21lc2FfcHJvZ3JhbV9sZXhlcl9sZXgoeXlsdmFsX3BhcmFtLCB5eWxsb2NfcGFyYW0sIHN0YXRlLT5zY2FubmVyKTsKK30KKyV9CisKKyUlCisKK3Byb2dyYW06IGxhbmd1YWdlIG9wdGlvblNlcXVlbmNlIHN0YXRlbWVudFNlcXVlbmNlIEVORAorCTsKKworbGFuZ3VhZ2U6IEFSQnZwXzEwCisJeworCSAgIGlmIChzdGF0ZS0+cHJvZy0+VGFyZ2V0ICE9IEdMX1ZFUlRFWF9QUk9HUkFNX0FSQikgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIGZyYWdtZW50IHByb2dyYW0gaGVhZGVyIik7CisKKwkgICB9CisJICAgc3RhdGUtPm1vZGUgPSBBUkJfdmVydGV4OworCX0KKwl8IEFSQmZwXzEwCisJeworCSAgIGlmIChzdGF0ZS0+cHJvZy0+VGFyZ2V0ICE9IEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCKSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImludmFsaWQgdmVydGV4IHByb2dyYW0gaGVhZGVyIik7CisJICAgfQorCSAgIHN0YXRlLT5tb2RlID0gQVJCX2ZyYWdtZW50OworCisJICAgc3RhdGUtPm9wdGlvbi5UZXhSZWN0ID0KKwkgICAgICAoc3RhdGUtPmN0eC0+RXh0ZW5zaW9ucy5OVl90ZXh0dXJlX3JlY3RhbmdsZSAhPSBHTF9GQUxTRSk7CisJfQorCTsKKworb3B0aW9uU2VxdWVuY2U6IG9wdGlvblNlcXVlbmNlIG9wdGlvbgorCXwKKwk7CisKK29wdGlvbjogT1BUSU9OIHN0cmluZyAnOycKKwl7CisJICAgaW50IHZhbGlkID0gMDsKKworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgdmFsaWQgPSBfbWVzYV9BUkJ2cF9wYXJzZV9vcHRpb24oc3RhdGUsICQyKTsKKwkgICB9IGVsc2UgaWYgKHN0YXRlLT5tb2RlID09IEFSQl9mcmFnbWVudCkgeworCSAgICAgIHZhbGlkID0gX21lc2FfQVJCZnBfcGFyc2Vfb3B0aW9uKHN0YXRlLCAkMik7CisJICAgfQorCisKKwkgICBmcmVlKCQyKTsKKworCSAgIGlmICghdmFsaWQpIHsKKwkgICAgICBjb25zdCBjaGFyICpjb25zdCBlcnJfc3RyID0gKHN0YXRlLT5tb2RlID09IEFSQl92ZXJ0ZXgpCisJCSA/ICJpbnZhbGlkIEFSQiB2ZXJ0ZXggcHJvZ3JhbSBvcHRpb24iCisJCSA6ICJpbnZhbGlkIEFSQiBmcmFnbWVudCBwcm9ncmFtIG9wdGlvbiI7CisKKwkgICAgICB5eWVycm9yKCYgQDIsIHN0YXRlLCBlcnJfc3RyKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisJOworCitzdGF0ZW1lbnRTZXF1ZW5jZTogc3RhdGVtZW50U2VxdWVuY2Ugc3RhdGVtZW50CisJfAorCTsKKworc3RhdGVtZW50OiBpbnN0cnVjdGlvbiAnOycKKwl7CisJICAgaWYgKCQxICE9IE5VTEwpIHsKKwkgICAgICBpZiAoc3RhdGUtPmluc3RfdGFpbCA9PSBOVUxMKSB7CisJCSBzdGF0ZS0+aW5zdF9oZWFkID0gJDE7CisJICAgICAgfSBlbHNlIHsKKwkJIHN0YXRlLT5pbnN0X3RhaWwtPm5leHQgPSAkMTsKKwkgICAgICB9CisKKwkgICAgICBzdGF0ZS0+aW5zdF90YWlsID0gJDE7CisJICAgICAgJDEtPm5leHQgPSBOVUxMOworCisJICAgICAgc3RhdGUtPnByb2ctPk51bUluc3RydWN0aW9ucysrOworCSAgIH0KKwl9CisJfCBuYW1pbmdTdGF0ZW1lbnQgJzsnCisJOworCitpbnN0cnVjdGlvbjogQUxVX2luc3RydWN0aW9uCisJeworCSAgICQkID0gJDE7CisJICAgc3RhdGUtPnByb2ctPk51bUFsdUluc3RydWN0aW9ucysrOworCX0KKwl8IFRleEluc3RydWN0aW9uCisJeworCSAgICQkID0gJDE7CisJICAgc3RhdGUtPnByb2ctPk51bVRleEluc3RydWN0aW9ucysrOworCX0KKwk7CisKK0FMVV9pbnN0cnVjdGlvbjogQVJMX2luc3RydWN0aW9uCisJfCBWRUNUT1JvcF9pbnN0cnVjdGlvbgorCXwgU0NBTEFSb3BfaW5zdHJ1Y3Rpb24KKwl8IEJJTlNDb3BfaW5zdHJ1Y3Rpb24KKwl8IEJJTm9wX2luc3RydWN0aW9uCisJfCBUUklvcF9pbnN0cnVjdGlvbgorCXwgU1daX2luc3RydWN0aW9uCisJOworCitUZXhJbnN0cnVjdGlvbjogU0FNUExFX2luc3RydWN0aW9uCisJfCBLSUxfaW5zdHJ1Y3Rpb24KKwl8IFRYRF9pbnN0cnVjdGlvbgorCTsKKworQVJMX2luc3RydWN0aW9uOiBBUkwgbWFza2VkQWRkclJlZyAnLCcgc2NhbGFyU3JjUmVnCisJeworCSAgICQkID0gYXNtX2luc3RydWN0aW9uX2N0b3IoT1BDT0RFX0FSTCwgJiAkMiwgJiAkNCwgTlVMTCwgTlVMTCk7CisJfQorCTsKKworVkVDVE9Sb3BfaW5zdHJ1Y3Rpb246IFZFQ1RPUl9PUCBtYXNrZWREc3RSZWcgJywnIHN3aXp6bGVTcmNSZWcKKwl7CisJICAgaWYgKCQxLk9wY29kZSA9PSBPUENPREVfRERZKQorCSAgICAgIHN0YXRlLT5mcmFnbWVudC5Vc2VzREZkeSA9IDE7CisJICAgJCQgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgJDEsICYgJDIsICYgJDQsIE5VTEwsIE5VTEwpOworCX0KKwk7CisKK1NDQUxBUm9wX2luc3RydWN0aW9uOiBTQ0FMQVJfT1AgbWFza2VkRHN0UmVnICcsJyBzY2FsYXJTcmNSZWcKKwl7CisJICAgJCQgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgJDEsICYgJDIsICYgJDQsIE5VTEwsIE5VTEwpOworCX0KKwk7CisKK0JJTlNDb3BfaW5zdHJ1Y3Rpb246IEJJTlNDX09QIG1hc2tlZERzdFJlZyAnLCcgc2NhbGFyU3JjUmVnICcsJyBzY2FsYXJTcmNSZWcKKwl7CisJICAgJCQgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgJDEsICYgJDIsICYgJDQsICYgJDYsIE5VTEwpOworCX0KKwk7CisKKworQklOb3BfaW5zdHJ1Y3Rpb246IEJJTl9PUCBtYXNrZWREc3RSZWcgJywnIHN3aXp6bGVTcmNSZWcgJywnIHN3aXp6bGVTcmNSZWcKKwl7CisJICAgJCQgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgJDEsICYgJDIsICYgJDQsICYgJDYsIE5VTEwpOworCX0KKwk7CisKK1RSSW9wX2luc3RydWN0aW9uOiBUUklfT1AgbWFza2VkRHN0UmVnICcsJworICAgICAgICAgICAgICAgICAgIHN3aXp6bGVTcmNSZWcgJywnIHN3aXp6bGVTcmNSZWcgJywnIHN3aXp6bGVTcmNSZWcKKwl7CisJICAgJCQgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgJDEsICYgJDIsICYgJDQsICYgJDYsICYgJDgpOworCX0KKwk7CisKK1NBTVBMRV9pbnN0cnVjdGlvbjogU0FNUExFX09QIG1hc2tlZERzdFJlZyAnLCcgc3dpenpsZVNyY1JlZyAnLCcgdGV4SW1hZ2VVbml0ICcsJyB0ZXhUYXJnZXQKKwl7CisJICAgJCQgPSBhc21faW5zdHJ1Y3Rpb25fY29weV9jdG9yKCYgJDEsICYgJDIsICYgJDQsIE5VTEwsIE5VTEwpOworCSAgIGlmICgkJCAhPSBOVUxMKSB7CisJICAgICAgY29uc3QgR0xiaXRmaWVsZCB0ZXhfbWFzayA9ICgxVSA8PCAkNik7CisJICAgICAgR0xiaXRmaWVsZCBzaGFkb3dfdGV4ID0gMDsKKwkgICAgICBHTGJpdGZpZWxkIHRhcmdldF9tYXNrID0gMDsKKworCisJICAgICAgJCQtPkJhc2UuVGV4U3JjVW5pdCA9ICQ2OworCisJICAgICAgaWYgKCQ4IDwgMCkgeworCQkgc2hhZG93X3RleCA9IHRleF9tYXNrOworCisJCSAkJC0+QmFzZS5UZXhTcmNUYXJnZXQgPSAtJDg7CisJCSAkJC0+QmFzZS5UZXhTaGFkb3cgPSAxOworCSAgICAgIH0gZWxzZSB7CisJCSAkJC0+QmFzZS5UZXhTcmNUYXJnZXQgPSAkODsKKwkgICAgICB9CisKKwkgICAgICB0YXJnZXRfbWFzayA9ICgxVSA8PCAkJC0+QmFzZS5UZXhTcmNUYXJnZXQpOworCisJICAgICAgLyogSWYgdGhpcyB0ZXh0dXJlIHVuaXQgd2FzIHByZXZpb3VzbHkgYWNjZXNzZWQgYW5kIHRoYXQgYWNjZXNzCisJICAgICAgICogaGFkIGEgZGlmZmVyZW50IHRleHR1cmUgdGFyZ2V0LCBnZW5lcmF0ZSBhbiBlcnJvci4KKwkgICAgICAgKgorCSAgICAgICAqIElmIHRoaXMgdGV4dHVyZSB1bml0IHdhcyBwcmV2aW91c2x5IGFjY2Vzc2VkIGFuZCB0aGF0IGFjY2VzcworCSAgICAgICAqIGhhZCBhIGRpZmZlcmVudCBzaGFkb3cgbW9kZSwgZ2VuZXJhdGUgYW4gZXJyb3IuCisJICAgICAgICovCisJICAgICAgaWYgKChzdGF0ZS0+cHJvZy0+VGV4dHVyZXNVc2VkWyQ2XSAhPSAwKQorCQkgICYmICgoc3RhdGUtPnByb2ctPlRleHR1cmVzVXNlZFskNl0gIT0gdGFyZ2V0X21hc2spCisJCSAgICAgIHx8ICgoc3RhdGUtPnByb2ctPlNoYWRvd1NhbXBsZXJzICYgdGV4X21hc2spCisJCQkgICE9IHNoYWRvd190ZXgpKSkgeworCQkgeXllcnJvcigmIEA4LCBzdGF0ZSwKKwkJCSAibXVsdGlwbGUgdGFyZ2V0cyB1c2VkIG9uIG9uZSB0ZXh0dXJlIGltYWdlIHVuaXQiKTsKKwkJIFlZRVJST1I7CisJICAgICAgfQorCisKKwkgICAgICBzdGF0ZS0+cHJvZy0+VGV4dHVyZXNVc2VkWyQ2XSB8PSB0YXJnZXRfbWFzazsKKwkgICAgICBzdGF0ZS0+cHJvZy0+U2hhZG93U2FtcGxlcnMgfD0gc2hhZG93X3RleDsKKwkgICB9CisJfQorCTsKKworS0lMX2luc3RydWN0aW9uOiBLSUwgc3dpenpsZVNyY1JlZworCXsKKwkgICAkJCA9IGFzbV9pbnN0cnVjdGlvbl9jdG9yKE9QQ09ERV9LSUwsIE5VTEwsICYgJDIsIE5VTEwsIE5VTEwpOworCSAgIHN0YXRlLT5mcmFnbWVudC5Vc2VzS2lsbCA9IDE7CisJfQorCXwgS0lMIGNjVGVzdAorCXsKKwkgICAkJCA9IGFzbV9pbnN0cnVjdGlvbl9jdG9yKE9QQ09ERV9LSUxfTlYsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCSAgICQkLT5CYXNlLkRzdFJlZy5Db25kTWFzayA9ICQyLkNvbmRNYXNrOworCSAgICQkLT5CYXNlLkRzdFJlZy5Db25kU3dpenpsZSA9ICQyLkNvbmRTd2l6emxlOworCSAgIHN0YXRlLT5mcmFnbWVudC5Vc2VzS2lsbCA9IDE7CisJfQorCTsKKworVFhEX2luc3RydWN0aW9uOiBUWERfT1AgbWFza2VkRHN0UmVnICcsJyBzd2l6emxlU3JjUmVnICcsJyBzd2l6emxlU3JjUmVnICcsJyBzd2l6emxlU3JjUmVnICcsJyB0ZXhJbWFnZVVuaXQgJywnIHRleFRhcmdldAorCXsKKwkgICAkJCA9IGFzbV9pbnN0cnVjdGlvbl9jb3B5X2N0b3IoJiAkMSwgJiAkMiwgJiAkNCwgJiAkNiwgJiAkOCk7CisJICAgaWYgKCQkICE9IE5VTEwpIHsKKwkgICAgICBjb25zdCBHTGJpdGZpZWxkIHRleF9tYXNrID0gKDFVIDw8ICQxMCk7CisJICAgICAgR0xiaXRmaWVsZCBzaGFkb3dfdGV4ID0gMDsKKwkgICAgICBHTGJpdGZpZWxkIHRhcmdldF9tYXNrID0gMDsKKworCisJICAgICAgJCQtPkJhc2UuVGV4U3JjVW5pdCA9ICQxMDsKKworCSAgICAgIGlmICgkMTIgPCAwKSB7CisJCSBzaGFkb3dfdGV4ID0gdGV4X21hc2s7CisKKwkJICQkLT5CYXNlLlRleFNyY1RhcmdldCA9IC0kMTI7CisJCSAkJC0+QmFzZS5UZXhTaGFkb3cgPSAxOworCSAgICAgIH0gZWxzZSB7CisJCSAkJC0+QmFzZS5UZXhTcmNUYXJnZXQgPSAkMTI7CisJICAgICAgfQorCisJICAgICAgdGFyZ2V0X21hc2sgPSAoMVUgPDwgJCQtPkJhc2UuVGV4U3JjVGFyZ2V0KTsKKworCSAgICAgIC8qIElmIHRoaXMgdGV4dHVyZSB1bml0IHdhcyBwcmV2aW91c2x5IGFjY2Vzc2VkIGFuZCB0aGF0IGFjY2VzcworCSAgICAgICAqIGhhZCBhIGRpZmZlcmVudCB0ZXh0dXJlIHRhcmdldCwgZ2VuZXJhdGUgYW4gZXJyb3IuCisJICAgICAgICoKKwkgICAgICAgKiBJZiB0aGlzIHRleHR1cmUgdW5pdCB3YXMgcHJldmlvdXNseSBhY2Nlc3NlZCBhbmQgdGhhdCBhY2Nlc3MKKwkgICAgICAgKiBoYWQgYSBkaWZmZXJlbnQgc2hhZG93IG1vZGUsIGdlbmVyYXRlIGFuIGVycm9yLgorCSAgICAgICAqLworCSAgICAgIGlmICgoc3RhdGUtPnByb2ctPlRleHR1cmVzVXNlZFskMTBdICE9IDApCisJCSAgJiYgKChzdGF0ZS0+cHJvZy0+VGV4dHVyZXNVc2VkWyQxMF0gIT0gdGFyZ2V0X21hc2spCisJCSAgICAgIHx8ICgoc3RhdGUtPnByb2ctPlNoYWRvd1NhbXBsZXJzICYgdGV4X21hc2spCisJCQkgICE9IHNoYWRvd190ZXgpKSkgeworCQkgeXllcnJvcigmIEAxMiwgc3RhdGUsCisJCQkgIm11bHRpcGxlIHRhcmdldHMgdXNlZCBvbiBvbmUgdGV4dHVyZSBpbWFnZSB1bml0Iik7CisJCSBZWUVSUk9SOworCSAgICAgIH0KKworCisJICAgICAgc3RhdGUtPnByb2ctPlRleHR1cmVzVXNlZFskMTBdIHw9IHRhcmdldF9tYXNrOworCSAgICAgIHN0YXRlLT5wcm9nLT5TaGFkb3dTYW1wbGVycyB8PSBzaGFkb3dfdGV4OworCSAgIH0KKwl9CisJOworCit0ZXhJbWFnZVVuaXQ6IFRFWFRVUkVfVU5JVCBvcHRUZXhJbWFnZVVuaXROdW0KKwl7CisJICAgJCQgPSAkMjsKKwl9CisJOworCit0ZXhUYXJnZXQ6IFRFWF8xRCAgeyAkJCA9IFRFWFRVUkVfMURfSU5ERVg7IH0KKwl8IFRFWF8yRCAgIHsgJCQgPSBURVhUVVJFXzJEX0lOREVYOyB9CisJfCBURVhfM0QgICB7ICQkID0gVEVYVFVSRV8zRF9JTkRFWDsgfQorCXwgVEVYX0NVQkUgeyAkJCA9IFRFWFRVUkVfQ1VCRV9JTkRFWDsgfQorCXwgVEVYX1JFQ1QgeyAkJCA9IFRFWFRVUkVfUkVDVF9JTkRFWDsgfQorCXwgVEVYX1NIQURPVzFEICAgeyAkJCA9IC1URVhUVVJFXzFEX0lOREVYOyB9CisJfCBURVhfU0hBRE9XMkQgICB7ICQkID0gLVRFWFRVUkVfMkRfSU5ERVg7IH0KKwl8IFRFWF9TSEFET1dSRUNUIHsgJCQgPSAtVEVYVFVSRV9SRUNUX0lOREVYOyB9CisJfCBURVhfQVJSQVkxRCAgICAgICAgIHsgJCQgPSBURVhUVVJFXzFEX0FSUkFZX0lOREVYOyB9CisJfCBURVhfQVJSQVkyRCAgICAgICAgIHsgJCQgPSBURVhUVVJFXzJEX0FSUkFZX0lOREVYOyB9CisJfCBURVhfQVJSQVlTSEFET1cxRCAgIHsgJCQgPSAtVEVYVFVSRV8xRF9BUlJBWV9JTkRFWDsgfQorCXwgVEVYX0FSUkFZU0hBRE9XMkQgICB7ICQkID0gLVRFWFRVUkVfMkRfQVJSQVlfSU5ERVg7IH0KKwk7CisKK1NXWl9pbnN0cnVjdGlvbjogU1daIG1hc2tlZERzdFJlZyAnLCcgc3JjUmVnICcsJyBleHRlbmRlZFN3aXp6bGUKKwl7CisJICAgLyogRklYTUU6IElzIHRoaXMgY29ycmVjdD8gIFNob3VsZCB0aGUgZXh0ZW5lZFN3aXp6bGUgYmUgYXBwbGllZAorCSAgICAqIEZJWE1FOiB0byB0aGUgZXhpc3Rpbmcgc3dpenpsZT8KKwkgICAgKi8KKwkgICAkNC5CYXNlLlN3aXp6bGUgPSAkNi5zd2l6emxlOworCSAgICQ0LkJhc2UuTmVnYXRlID0gJDYubWFzazsKKworCSAgICQkID0gYXNtX2luc3RydWN0aW9uX2NvcHlfY3RvcigmICQxLCAmICQyLCAmICQ0LCBOVUxMLCBOVUxMKTsKKwl9CisJOworCitzY2FsYXJTcmNSZWc6IG9wdGlvbmFsU2lnbiBzY2FsYXJVc2UKKwl7CisJICAgJCQgPSAkMjsKKworCSAgIGlmICgkMSkgeworCSAgICAgICQkLkJhc2UuTmVnYXRlID0gfiQkLkJhc2UuTmVnYXRlOworCSAgIH0KKwl9CisJfCBvcHRpb25hbFNpZ24gJ3wnIHNjYWxhclVzZSAnfCcKKwl7CisJICAgJCQgPSAkMzsKKworCSAgIGlmICghc3RhdGUtPm9wdGlvbi5OVl9mcmFnbWVudCkgeworCSAgICAgIHl5ZXJyb3IoJiBAMiwgc3RhdGUsICJ1bmV4cGVjdGVkIGNoYXJhY3RlciAnfCciKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIGlmICgkMSkgeworCSAgICAgICQkLkJhc2UuTmVnYXRlID0gfiQkLkJhc2UuTmVnYXRlOworCSAgIH0KKworCSAgICQkLkJhc2UuQWJzID0gMTsKKwl9CisJOworCitzY2FsYXJVc2U6ICBzcmNSZWcgc2NhbGFyU3VmZml4CisJeworCSAgICQkID0gJDE7CisKKwkgICAkJC5CYXNlLlN3aXp6bGUgPSBfbWVzYV9jb21iaW5lX3N3aXp6bGVzKCQkLkJhc2UuU3dpenpsZSwKKwkJCQkJCSAgICAkMi5zd2l6emxlKTsKKwl9CisJfCBwYXJhbUNvbnN0U2NhbGFyVXNlCisJeworCSAgIHN0cnVjdCBhc21fc3ltYm9sIHRlbXBfc3ltOworCisJICAgaWYgKCFzdGF0ZS0+b3B0aW9uLk5WX2ZyYWdtZW50KSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImV4cGVjdGVkIHNjYWxhciBzdWZmaXgiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIG1lbXNldCgmIHRlbXBfc3ltLCAwLCBzaXplb2YodGVtcF9zeW0pKTsKKwkgICB0ZW1wX3N5bS5wYXJhbV9iaW5kaW5nX2JlZ2luID0gfjA7CisJICAgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdGF0ZS0+cHJvZywgJiB0ZW1wX3N5bSwgJiAkMSwgR0xfVFJVRSk7CisKKwkgICBzZXRfc3JjX3JlZ19zd3ooJiAkJCwgUFJPR1JBTV9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfc3ltLnBhcmFtX2JpbmRpbmdfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX3N5bS5wYXJhbV9iaW5kaW5nX3N3aXp6bGUpOworCX0KKwk7CisKK3N3aXp6bGVTcmNSZWc6IG9wdGlvbmFsU2lnbiBzcmNSZWcgc3dpenpsZVN1ZmZpeAorCXsKKwkgICAkJCA9ICQyOworCisJICAgaWYgKCQxKSB7CisJICAgICAgJCQuQmFzZS5OZWdhdGUgPSB+JCQuQmFzZS5OZWdhdGU7CisJICAgfQorCisJICAgJCQuQmFzZS5Td2l6emxlID0gX21lc2FfY29tYmluZV9zd2l6emxlcygkJC5CYXNlLlN3aXp6bGUsCisJCQkJCQkgICAgJDMuc3dpenpsZSk7CisJfQorCXwgb3B0aW9uYWxTaWduICd8JyBzcmNSZWcgc3dpenpsZVN1ZmZpeCAnfCcKKwl7CisJICAgJCQgPSAkMzsKKworCSAgIGlmICghc3RhdGUtPm9wdGlvbi5OVl9mcmFnbWVudCkgeworCSAgICAgIHl5ZXJyb3IoJiBAMiwgc3RhdGUsICJ1bmV4cGVjdGVkIGNoYXJhY3RlciAnfCciKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIGlmICgkMSkgeworCSAgICAgICQkLkJhc2UuTmVnYXRlID0gfiQkLkJhc2UuTmVnYXRlOworCSAgIH0KKworCSAgICQkLkJhc2UuQWJzID0gMTsKKwkgICAkJC5CYXNlLlN3aXp6bGUgPSBfbWVzYV9jb21iaW5lX3N3aXp6bGVzKCQkLkJhc2UuU3dpenpsZSwKKwkJCQkJCSAgICAkNC5zd2l6emxlKTsKKwl9CisKKwk7CisKK21hc2tlZERzdFJlZzogZHN0UmVnIG9wdGlvbmFsTWFzayBvcHRpb25hbENjTWFzaworCXsKKwkgICAkJCA9ICQxOworCSAgICQkLldyaXRlTWFzayA9ICQyLm1hc2s7CisJICAgJCQuQ29uZE1hc2sgPSAkMy5Db25kTWFzazsKKwkgICAkJC5Db25kU3dpenpsZSA9ICQzLkNvbmRTd2l6emxlOworCisJICAgaWYgKCQkLkZpbGUgPT0gUFJPR1JBTV9PVVRQVVQpIHsKKwkgICAgICAvKiBUZWNobmljYWxseSBzcGVha2luZywgdGhpcyBzaG91bGQgY2hlY2sgdGhhdCBpdCBpcyBpbgorCSAgICAgICAqIHZlcnRleCBwcm9ncmFtIG1vZGUuICBIb3dldmVyLCBQb3NpdGlvbkludmFyaWFudCBjYW4gbmV2ZXIgYmUKKwkgICAgICAgKiBzZXQgaW4gZnJhZ21lbnQgcHJvZ3JhbSBtb2RlLCBzbyBpdCBpcyBzb21ld2hhdCBpcnJlbGV2YW50LgorCSAgICAgICAqLworCSAgICAgIGlmIChzdGF0ZS0+b3B0aW9uLlBvc2l0aW9uSW52YXJpYW50CisJICAgICAgICYmICgkJC5JbmRleCA9PSBWQVJZSU5HX1NMT1RfUE9TKSkgeworCQkgeXllcnJvcigmIEAxLCBzdGF0ZSwgInBvc2l0aW9uLWludmFyaWFudCBwcm9ncmFtcyBjYW5ub3QgIgorCQkJICJ3cml0ZSBwb3NpdGlvbiIpOworCQkgWVlFUlJPUjsKKwkgICAgICB9CisKKwkgICAgICBzdGF0ZS0+cHJvZy0+T3V0cHV0c1dyaXR0ZW4gfD0gQklURklFTEQ2NF9CSVQoJCQuSW5kZXgpOworCSAgIH0KKwl9CisJOworCittYXNrZWRBZGRyUmVnOiBhZGRyUmVnIGFkZHJXcml0ZU1hc2sKKwl7CisJICAgc2V0X2RzdF9yZWcoJiAkJCwgUFJPR1JBTV9BRERSRVNTLCAwKTsKKwkgICAkJC5Xcml0ZU1hc2sgPSAkMi5tYXNrOworCX0KKwk7CisKK2V4dGVuZGVkU3dpenpsZTogZXh0U3dpekNvbXAgJywnIGV4dFN3aXpDb21wICcsJyBleHRTd2l6Q29tcCAnLCcgZXh0U3dpekNvbXAKKwl7CisJICAgY29uc3QgdW5zaWduZWQgeHl6d192YWxpZCA9CisJICAgICAgKCQxLnh5endfdmFsaWQgPDwgMCkKKwkgICAgICB8ICgkMy54eXp3X3ZhbGlkIDw8IDEpCisJICAgICAgfCAoJDUueHl6d192YWxpZCA8PCAyKQorCSAgICAgIHwgKCQ3Lnh5endfdmFsaWQgPDwgMyk7CisJICAgY29uc3QgdW5zaWduZWQgcmdiYV92YWxpZCA9CisJICAgICAgKCQxLnJnYmFfdmFsaWQgPDwgMCkKKwkgICAgICB8ICgkMy5yZ2JhX3ZhbGlkIDw8IDEpCisJICAgICAgfCAoJDUucmdiYV92YWxpZCA8PCAyKQorCSAgICAgIHwgKCQ3LnJnYmFfdmFsaWQgPDwgMyk7CisKKwkgICAvKiBBbGwgb2YgdGhlIHN3aXp6bGUgY29tcG9uZW50cyBoYXZlIHRvIGJlIHZhbGlkIGluIGVpdGhlciBSR0JBCisJICAgICogb3IgWFlaVy4gIE5vdGUgdGhhdCAwIGFuZCAxIGFyZSB2YWxpZCBpbiBib3RoLCBzbyBib3RoIG1hc2tzCisJICAgICogY2FuIGhhdmUgc29tZSBiaXRzIHNldC4KKwkgICAgKgorCSAgICAqIFdlIHNvbWV3aGF0IGRldmlhdGUgZnJvbSB0aGUgc3BlYyBoZXJlLiAgSXQgd291bGQgYmUgcmVhbGx5IGhhcmQKKwkgICAgKiB0byBmaWd1cmUgb3V0IHdoaWNoIGNvbXBvbmVudCBpcyB0aGUgZXJyb3IsIGFuZCB0aGVyZSBwcm9iYWJseQorCSAgICAqIGlzbid0IGEgbG90IG9mIGJlbmVmaXQuCisJICAgICovCisJICAgaWYgKChyZ2JhX3ZhbGlkICE9IDB4MGYpICYmICh4eXp3X3ZhbGlkICE9IDB4MGYpKSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImNhbm5vdCBjb21iaW5lIFJHQkEgYW5kIFhZWlcgc3dpenpsZSAiCisJCSAgICAgICJjb21wb25lbnRzIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAkJC5zd2l6emxlID0gTUFLRV9TV0laWkxFNCgkMS5zd3osICQzLnN3eiwgJDUuc3d6LCAkNy5zd3opOworCSAgICQkLm1hc2sgPSAoJDEubmVnYXRlKSB8ICgkMy5uZWdhdGUgPDwgMSkgfCAoJDUubmVnYXRlIDw8IDIpCisJICAgICAgfCAoJDcubmVnYXRlIDw8IDMpOworCX0KKwk7CisKK2V4dFN3aXpDb21wOiBvcHRpb25hbFNpZ24gZXh0U3dpelNlbAorCXsKKwkgICAkJCA9ICQyOworCSAgICQkLm5lZ2F0ZSA9ICgkMSkgPyAxIDogMDsKKwl9CisJOworCitleHRTd2l6U2VsOiBJTlRFR0VSCisJeworCSAgIGlmICgoJDEgIT0gMCkgJiYgKCQxICE9IDEpKSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImludmFsaWQgZXh0ZW5kZWQgc3dpenpsZSBzZWxlY3RvciIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgJCQuc3d6ID0gKCQxID09IDApID8gU1dJWlpMRV9aRVJPIDogU1dJWlpMRV9PTkU7CisgICAgICAgICAgICQkLm5lZ2F0ZSA9IDA7CisKKwkgICAvKiAwIGFuZCAxIGFyZSB2YWxpZCBmb3IgYm90aCBSR0JBIHN3aXp6bGUgbmFtZXMgYW5kIFhZWlcKKwkgICAgKiBzd2l6emxlIG5hbWVzLgorCSAgICAqLworCSAgICQkLnh5endfdmFsaWQgPSAxOworCSAgICQkLnJnYmFfdmFsaWQgPSAxOworCX0KKwl8IHN0cmluZworCXsKKwkgICBjaGFyIHM7CisKKwkgICBpZiAoc3RybGVuKCQxKSA+IDEpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBleHRlbmRlZCBzd2l6emxlIHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICBzID0gJDFbMF07CisJICAgZnJlZSgkMSk7CisKKyAgICAgICAgICAgJCQucmdiYV92YWxpZCA9IDA7CisgICAgICAgICAgICQkLnh5endfdmFsaWQgPSAwOworICAgICAgICAgICAkJC5uZWdhdGUgPSAwOworCisJICAgc3dpdGNoIChzKSB7CisJICAgY2FzZSAneCc6CisJICAgICAgJCQuc3d6ID0gU1dJWlpMRV9YOworCSAgICAgICQkLnh5endfdmFsaWQgPSAxOworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgJ3knOgorCSAgICAgICQkLnN3eiA9IFNXSVpaTEVfWTsKKwkgICAgICAkJC54eXp3X3ZhbGlkID0gMTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlICd6JzoKKwkgICAgICAkJC5zd3ogPSBTV0laWkxFX1o7CisJICAgICAgJCQueHl6d192YWxpZCA9IDE7CisJICAgICAgYnJlYWs7CisJICAgY2FzZSAndyc6CisJICAgICAgJCQuc3d6ID0gU1dJWlpMRV9XOworCSAgICAgICQkLnh5endfdmFsaWQgPSAxOworCSAgICAgIGJyZWFrOworCisJICAgY2FzZSAncic6CisJICAgICAgJCQuc3d6ID0gU1dJWlpMRV9YOworCSAgICAgICQkLnJnYmFfdmFsaWQgPSAxOworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgJ2cnOgorCSAgICAgICQkLnN3eiA9IFNXSVpaTEVfWTsKKwkgICAgICAkJC5yZ2JhX3ZhbGlkID0gMTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlICdiJzoKKwkgICAgICAkJC5zd3ogPSBTV0laWkxFX1o7CisJICAgICAgJCQucmdiYV92YWxpZCA9IDE7CisJICAgICAgYnJlYWs7CisJICAgY2FzZSAnYSc6CisJICAgICAgJCQuc3d6ID0gU1dJWlpMRV9XOworCSAgICAgICQkLnJnYmFfdmFsaWQgPSAxOworCSAgICAgIGJyZWFrOworCisJICAgZGVmYXVsdDoKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBleHRlbmRlZCBzd2l6emxlIHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICAgICBicmVhazsKKwkgICB9CisJfQorCTsKKworc3JjUmVnOiBVU0VEX0lERU5USUZJRVIgLyogdGVtcG9yYXJ5UmVnIHwgcHJvZ1BhcmFtU2luZ2xlICovCisJeworCSAgIHN0cnVjdCBhc21fc3ltYm9sICpjb25zdCBzID0gKHN0cnVjdCBhc21fc3ltYm9sICopCisJICAgICAgX21lc2Ffc3ltYm9sX3RhYmxlX2ZpbmRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgJDEpOworCisJICAgZnJlZSgkMSk7CisKKwkgICBpZiAocyA9PSBOVUxMKSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImludmFsaWQgb3BlcmFuZCB2YXJpYWJsZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIGlmICgocy0+dHlwZSAhPSBhdF9wYXJhbSkgJiYgKHMtPnR5cGUgIT0gYXRfdGVtcCkKKwkJICAgICAgJiYgKHMtPnR5cGUgIT0gYXRfYXR0cmliKSkgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIG9wZXJhbmQgdmFyaWFibGUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSBpZiAoKHMtPnR5cGUgPT0gYXRfcGFyYW0pICYmIHMtPnBhcmFtX2lzX2FycmF5KSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgIm5vbi1hcnJheSBhY2Nlc3MgdG8gYXJyYXkgUEFSQU0iKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIGluaXRfc3JjX3JlZygmICQkKTsKKwkgICBzd2l0Y2ggKHMtPnR5cGUpIHsKKwkgICBjYXNlIGF0X3RlbXA6CisJICAgICAgc2V0X3NyY19yZWcoJiAkJCwgUFJPR1JBTV9URU1QT1JBUlksIHMtPnRlbXBfYmluZGluZyk7CisJICAgICAgYnJlYWs7CisJICAgY2FzZSBhdF9wYXJhbToKKyAgICAgICAgICAgICAgc2V0X3NyY19yZWdfc3d6KCYgJCQsIHMtPnBhcmFtX2JpbmRpbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhcmFtX2JpbmRpbmdfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wYXJhbV9iaW5kaW5nX3N3aXp6bGUpOworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgYXRfYXR0cmliOgorCSAgICAgIHNldF9zcmNfcmVnKCYgJCQsIFBST0dSQU1fSU5QVVQsIHMtPmF0dHJpYl9iaW5kaW5nKTsKKwkgICAgICBzdGF0ZS0+cHJvZy0+SW5wdXRzUmVhZCB8PSBCSVRGSUVMRDY0X0JJVCgkJC5CYXNlLkluZGV4KTsKKworCSAgICAgIGlmICghdmFsaWRhdGVfaW5wdXRzKCYgQDEsIHN0YXRlKSkgeworCQkgWVlFUlJPUjsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisKKwkgICBkZWZhdWx0OgorCSAgICAgIFlZRVJST1I7CisJICAgICAgYnJlYWs7CisJICAgfQorCX0KKwl8IGF0dHJpYkJpbmRpbmcKKwl7CisJICAgc2V0X3NyY19yZWcoJiAkJCwgUFJPR1JBTV9JTlBVVCwgJDEpOworCSAgIHN0YXRlLT5wcm9nLT5JbnB1dHNSZWFkIHw9IEJJVEZJRUxENjRfQklUKCQkLkJhc2UuSW5kZXgpOworCisJICAgaWYgKCF2YWxpZGF0ZV9pbnB1dHMoJiBAMSwgc3RhdGUpKSB7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorCXwgcHJvZ1BhcmFtQXJyYXkgJ1snIHByb2dQYXJhbUFycmF5TWVtICddJworCXsKKwkgICBpZiAoISAkMy5CYXNlLlJlbEFkZHIKKwkgICAgICAgJiYgKCh1bnNpZ25lZCkgJDMuQmFzZS5JbmRleCA+PSAkMS0+cGFyYW1fYmluZGluZ19sZW5ndGgpKSB7CisJICAgICAgeXllcnJvcigmIEAzLCBzdGF0ZSwgIm91dCBvZiBib3VuZHMgYXJyYXkgYWNjZXNzIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICBpbml0X3NyY19yZWcoJiAkJCk7CisJICAgJCQuQmFzZS5GaWxlID0gJDEtPnBhcmFtX2JpbmRpbmdfdHlwZTsKKworCSAgIGlmICgkMy5CYXNlLlJlbEFkZHIpIHsKKyAgICAgICAgICAgICAgc3RhdGUtPnByb2ctPkluZGlyZWN0UmVnaXN0ZXJGaWxlcyB8PSAoMSA8PCAkJC5CYXNlLkZpbGUpOworCSAgICAgICQxLT5wYXJhbV9hY2Nlc3NlZF9pbmRpcmVjdGx5ID0gMTsKKworCSAgICAgICQkLkJhc2UuUmVsQWRkciA9IDE7CisJICAgICAgJCQuQmFzZS5JbmRleCA9ICQzLkJhc2UuSW5kZXg7CisJICAgICAgJCQuU3ltYm9sID0gJDE7CisJICAgfSBlbHNlIHsKKwkgICAgICAkJC5CYXNlLkluZGV4ID0gJDEtPnBhcmFtX2JpbmRpbmdfYmVnaW4gKyAkMy5CYXNlLkluZGV4OworCSAgIH0KKwl9CisJfCBwYXJhbVNpbmdsZUl0ZW1Vc2UKKwl7CisgICAgICAgICAgIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSA9ICgkMS5uYW1lICE9IE5VTEwpIAorCSAgICAgID8gJDEucGFyYW1fYmluZGluZ190eXBlCisJICAgICAgOiBQUk9HUkFNX0NPTlNUQU5UOworICAgICAgICAgICBzZXRfc3JjX3JlZ19zd3ooJiAkJCwgZmlsZSwgJDEucGFyYW1fYmluZGluZ19iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICQxLnBhcmFtX2JpbmRpbmdfc3dpenpsZSk7CisJfQorCTsKKworZHN0UmVnOiByZXN1bHRCaW5kaW5nCisJeworCSAgIHNldF9kc3RfcmVnKCYgJCQsIFBST0dSQU1fT1VUUFVULCAkMSk7CisJfQorCXwgVVNFRF9JREVOVElGSUVSIC8qIHRlbXBvcmFyeVJlZyB8IHZlcnRleFJlc3VsdFJlZyAqLworCXsKKwkgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqY29uc3QgcyA9IChzdHJ1Y3QgYXNtX3N5bWJvbCAqKQorCSAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbChzdGF0ZS0+c3QsIDAsICQxKTsKKworCSAgIGZyZWUoJDEpOworCisJICAgaWYgKHMgPT0gTlVMTCkgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIG9wZXJhbmQgdmFyaWFibGUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSBpZiAoKHMtPnR5cGUgIT0gYXRfb3V0cHV0KSAmJiAocy0+dHlwZSAhPSBhdF90ZW1wKSkgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIG9wZXJhbmQgdmFyaWFibGUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgIHN3aXRjaCAocy0+dHlwZSkgeworCSAgIGNhc2UgYXRfdGVtcDoKKwkgICAgICBzZXRfZHN0X3JlZygmICQkLCBQUk9HUkFNX1RFTVBPUkFSWSwgcy0+dGVtcF9iaW5kaW5nKTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIGF0X291dHB1dDoKKwkgICAgICBzZXRfZHN0X3JlZygmICQkLCBQUk9HUkFNX09VVFBVVCwgcy0+b3V0cHV0X2JpbmRpbmcpOworCSAgICAgIGJyZWFrOworCSAgIGRlZmF1bHQ6CisJICAgICAgc2V0X2RzdF9yZWcoJiAkJCwgcy0+cGFyYW1fYmluZGluZ190eXBlLCBzLT5wYXJhbV9iaW5kaW5nX2JlZ2luKTsKKwkgICAgICBicmVhazsKKwkgICB9CisJfQorCTsKKworcHJvZ1BhcmFtQXJyYXk6IFVTRURfSURFTlRJRklFUgorCXsKKwkgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqY29uc3QgcyA9IChzdHJ1Y3QgYXNtX3N5bWJvbCAqKQorCSAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbChzdGF0ZS0+c3QsIDAsICQxKTsKKworCSAgIGZyZWUoJDEpOworCisJICAgaWYgKHMgPT0gTlVMTCkgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIG9wZXJhbmQgdmFyaWFibGUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSBpZiAoKHMtPnR5cGUgIT0gYXRfcGFyYW0pIHx8ICFzLT5wYXJhbV9pc19hcnJheSkgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJhcnJheSBhY2Nlc3MgdG8gbm9uLVBBUkFNIHZhcmlhYmxlIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgICQkID0gczsKKwkgICB9CisJfQorCTsKKworcHJvZ1BhcmFtQXJyYXlNZW06IHByb2dQYXJhbUFycmF5QWJzIHwgcHJvZ1BhcmFtQXJyYXlSZWw7CisKK3Byb2dQYXJhbUFycmF5QWJzOiBJTlRFR0VSCisJeworCSAgIGluaXRfc3JjX3JlZygmICQkKTsKKwkgICAkJC5CYXNlLkluZGV4ID0gJDE7CisJfQorCTsKKworcHJvZ1BhcmFtQXJyYXlSZWw6IGFkZHJSZWcgYWRkckNvbXBvbmVudCBhZGRyUmVnUmVsT2Zmc2V0CisJeworCSAgIC8qIEZJTklTSE1FOiBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgYWRkcmVzcyByZWdpc3RlcnMuCisJICAgICovCisJICAgLyogRklOSVNITUU6IEFkZCBzdXBwb3J0IGZvciA0LWNvbXBvbmVudCBhZGRyZXNzIHJlZ2lzdGVycy4KKwkgICAgKi8KKwkgICBpbml0X3NyY19yZWcoJiAkJCk7CisJICAgJCQuQmFzZS5SZWxBZGRyID0gMTsKKwkgICAkJC5CYXNlLkluZGV4ID0gJDM7CisJfQorCTsKKworYWRkclJlZ1JlbE9mZnNldDogICAgICAgICAgICAgIHsgJCQgPSAwOyB9CisJfCAnKycgYWRkclJlZ1Bvc09mZnNldCB7ICQkID0gJDI7IH0KKwl8ICctJyBhZGRyUmVnTmVnT2Zmc2V0IHsgJCQgPSAtJDI7IH0KKwk7CisKK2FkZHJSZWdQb3NPZmZzZXQ6IElOVEVHRVIKKwl7CisJICAgaWYgKCgkMSA8IDApIHx8ICgkMSA+IChzdGF0ZS0+bGltaXRzLT5NYXhBZGRyZXNzT2Zmc2V0IC0gMSkpKSB7CisgICAgICAgICAgICAgIGNoYXIgc1sxMDBdOworICAgICAgICAgICAgICBfbWVzYV9zbnByaW50ZihzLCBzaXplb2YocyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBhZGRyZXNzIG9mZnNldCB0b28gbGFyZ2UgKCVkKSIsICQxKTsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCBzKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgJCQgPSAkMTsKKwkgICB9CisJfQorCTsKKworYWRkclJlZ05lZ09mZnNldDogSU5URUdFUgorCXsKKwkgICBpZiAoKCQxIDwgMCkgfHwgKCQxID4gc3RhdGUtPmxpbWl0cy0+TWF4QWRkcmVzc09mZnNldCkpIHsKKyAgICAgICAgICAgICAgY2hhciBzWzEwMF07CisgICAgICAgICAgICAgIF9tZXNhX3NucHJpbnRmKHMsIHNpemVvZihzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIGFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSAoJWQpIiwgJDEpOworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsIHMpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICAkJCA9ICQxOworCSAgIH0KKwl9CisJOworCithZGRyUmVnOiBVU0VEX0lERU5USUZJRVIKKwl7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgKmNvbnN0IHMgPSAoc3RydWN0IGFzbV9zeW1ib2wgKikKKwkgICAgICBfbWVzYV9zeW1ib2xfdGFibGVfZmluZF9zeW1ib2woc3RhdGUtPnN0LCAwLCAkMSk7CisKKwkgICBmcmVlKCQxKTsKKworCSAgIGlmIChzID09IE5VTEwpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBhcnJheSBtZW1iZXIiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSBpZiAocy0+dHlwZSAhPSBhdF9hZGRyZXNzKSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwKKwkJICAgICAgImludmFsaWQgdmFyaWFibGUgZm9yIGluZGV4ZWQgYXJyYXkgYWNjZXNzIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgICQkID0gczsKKwkgICB9CisJfQorCTsKKworYWRkckNvbXBvbmVudDogTUFTSzEKKwl7CisJICAgaWYgKCQxLm1hc2sgIT0gV1JJVEVNQVNLX1gpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBhZGRyZXNzIGNvbXBvbmVudCBzZWxlY3RvciIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICAkJCA9ICQxOworCSAgIH0KKwl9CisJOworCithZGRyV3JpdGVNYXNrOiBNQVNLMQorCXsKKwkgICBpZiAoJDEubWFzayAhPSBXUklURU1BU0tfWCkgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsCisJCSAgICAgICJhZGRyZXNzIHJlZ2lzdGVyIHdyaXRlIG1hc2sgbXVzdCBiZSBcIi54XCIiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgJCQgPSAkMTsKKwkgICB9CisJfQorCTsKKworc2NhbGFyU3VmZml4OiBNQVNLMTsKKworc3dpenpsZVN1ZmZpeDogTUFTSzEKKwl8IE1BU0s0CisJfCBTV0laWkxFCisJfCAgICAgICAgICAgICAgeyAkJC5zd2l6emxlID0gU1dJWlpMRV9OT09QOyAkJC5tYXNrID0gV1JJVEVNQVNLX1hZWlc7IH0KKwk7CisKK29wdGlvbmFsTWFzazogTUFTSzQgfCBNQVNLMyB8IE1BU0syIHwgTUFTSzEgCisJfCAgICAgICAgICAgICAgeyAkJC5zd2l6emxlID0gU1dJWlpMRV9OT09QOyAkJC5tYXNrID0gV1JJVEVNQVNLX1hZWlc7IH0KKwk7CisKK29wdGlvbmFsQ2NNYXNrOiAnKCcgY2NUZXN0ICcpJworCXsKKwkgICAkJCA9ICQyOworCX0KKwl8ICcoJyBjY1Rlc3QyICcpJworCXsKKwkgICAkJCA9ICQyOworCX0KKwl8CisJeworCSAgICQkLkNvbmRNYXNrID0gQ09ORF9UUjsKKwkgICAkJC5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKwl9CisJOworCitjY1Rlc3Q6IGNjTWFza1J1bGUgc3dpenpsZVN1ZmZpeAorCXsKKwkgICAkJCA9ICQxOworCSAgICQkLkNvbmRTd2l6emxlID0gJDIuc3dpenpsZTsKKwl9CisJOworCitjY1Rlc3QyOiBjY01hc2tSdWxlMiBzd2l6emxlU3VmZml4CisJeworCSAgICQkID0gJDE7CisJICAgJCQuQ29uZFN3aXp6bGUgPSAkMi5zd2l6emxlOworCX0KKwk7CisKK2NjTWFza1J1bGU6IElERU5USUZJRVIKKwl7CisJICAgY29uc3QgaW50IGNvbmQgPSBfbWVzYV9wYXJzZV9jYygkMSk7CisJICAgaWYgKChjb25kID09IDApIHx8ICgkMVsyXSAhPSAnXDAnKSkgeworCSAgICAgIGNoYXIgKmNvbnN0IGVycl9zdHIgPQorCQkgbWFrZV9lcnJvcl9zdHJpbmcoImludmFsaWQgY29uZGl0aW9uIGNvZGUgXCIlc1wiIiwgJDEpOworCisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgKGVycl9zdHIgIT0gTlVMTCkKKwkJICAgICAgPyBlcnJfc3RyIDogImludmFsaWQgY29uZGl0aW9uIGNvZGUiKTsKKworCSAgICAgIGlmIChlcnJfc3RyICE9IE5VTEwpIHsKKwkJIGZyZWUoZXJyX3N0cik7CisJICAgICAgfQorCisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAkJC5Db25kTWFzayA9IGNvbmQ7CisJICAgJCQuQ29uZFN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisJfQorCTsKKworY2NNYXNrUnVsZTI6IFVTRURfSURFTlRJRklFUgorCXsKKwkgICBjb25zdCBpbnQgY29uZCA9IF9tZXNhX3BhcnNlX2NjKCQxKTsKKwkgICBpZiAoKGNvbmQgPT0gMCkgfHwgKCQxWzJdICE9ICdcMCcpKSB7CisJICAgICAgY2hhciAqY29uc3QgZXJyX3N0ciA9CisJCSBtYWtlX2Vycm9yX3N0cmluZygiaW52YWxpZCBjb25kaXRpb24gY29kZSBcIiVzXCIiLCAkMSk7CisKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAoZXJyX3N0ciAhPSBOVUxMKQorCQkgICAgICA/IGVycl9zdHIgOiAiaW52YWxpZCBjb25kaXRpb24gY29kZSIpOworCisJICAgICAgaWYgKGVycl9zdHIgIT0gTlVMTCkgeworCQkgZnJlZShlcnJfc3RyKTsKKwkgICAgICB9CisKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICQkLkNvbmRNYXNrID0gY29uZDsKKwkgICAkJC5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKwl9CisJOworCituYW1pbmdTdGF0ZW1lbnQ6IEFUVFJJQl9zdGF0ZW1lbnQKKwl8IFBBUkFNX3N0YXRlbWVudAorCXwgVEVNUF9zdGF0ZW1lbnQKKwl8IEFERFJFU1Nfc3RhdGVtZW50CisJfCBPVVRQVVRfc3RhdGVtZW50CisJfCBBTElBU19zdGF0ZW1lbnQKKwk7CisKK0FUVFJJQl9zdGF0ZW1lbnQ6IEFUVFJJQiBJREVOVElGSUVSICc9JyBhdHRyaWJCaW5kaW5nCisJeworCSAgIHN0cnVjdCBhc21fc3ltYm9sICpjb25zdCBzID0KKwkgICAgICBkZWNsYXJlX3ZhcmlhYmxlKHN0YXRlLCAkMiwgYXRfYXR0cmliLCAmIEAyKTsKKworCSAgIGlmIChzID09IE5VTEwpIHsKKwkgICAgICBmcmVlKCQyKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgcy0+YXR0cmliX2JpbmRpbmcgPSAkNDsKKwkgICAgICBzdGF0ZS0+SW5wdXRzQm91bmQgfD0gQklURklFTEQ2NF9CSVQocy0+YXR0cmliX2JpbmRpbmcpOworCisJICAgICAgaWYgKCF2YWxpZGF0ZV9pbnB1dHMoJiBANCwgc3RhdGUpKSB7CisJCSBZWUVSUk9SOworCSAgICAgIH0KKwkgICB9CisJfQorCTsKKworYXR0cmliQmluZGluZzogVkVSVEVYIHZ0eEF0dHJpYkl0ZW0KKwl7CisJICAgJCQgPSAkMjsKKwl9CisJfCBGUkFHTUVOVCBmcmFnQXR0cmliSXRlbQorCXsKKwkgICAkJCA9ICQyOworCX0KKwk7CisKK3Z0eEF0dHJpYkl0ZW06IFBPU0lUSU9OCisJeworCSAgICQkID0gVkVSVF9BVFRSSUJfUE9TOworCX0KKwl8IFdFSUdIVCB2dHhPcHRXZWlnaHROdW0KKwl7CisJICAgJCQgPSBWRVJUX0FUVFJJQl9XRUlHSFQ7CisJfQorCXwgTk9STUFMCisJeworCSAgICQkID0gVkVSVF9BVFRSSUJfTk9STUFMOworCX0KKwl8IENPTE9SIG9wdENvbG9yVHlwZQorCXsKKwkgICAkJCA9IFZFUlRfQVRUUklCX0NPTE9SMCArICQyOworCX0KKwl8IEZPR0NPT1JECisJeworCSAgICQkID0gVkVSVF9BVFRSSUJfRk9HOworCX0KKwl8IFRFWENPT1JEIG9wdFRleENvb3JkVW5pdE51bQorCXsKKwkgICAkJCA9IFZFUlRfQVRUUklCX1RFWDAgKyAkMjsKKwl9CisJfCBNQVRSSVhJTkRFWCAnWycgdnR4V2VpZ2h0TnVtICddJworCXsKKwkgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiR0xfQVJCX21hdHJpeF9wYWxldHRlIG5vdCBzdXBwb3J0ZWQiKTsKKwkgICBZWUVSUk9SOworCX0KKwl8IFZUWEFUVFJJQiAnWycgdnR4QXR0cmliTnVtICddJworCXsKKwkgICAkJCA9IFZFUlRfQVRUUklCX0dFTkVSSUMwICsgJDM7CisJfQorCTsKKwordnR4QXR0cmliTnVtOiBJTlRFR0VSCisJeworCSAgIGlmICgodW5zaWduZWQpICQxID49IHN0YXRlLT5saW1pdHMtPk1heEF0dHJpYnMpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCB2ZXJ0ZXggYXR0cmlidXRlIHJlZmVyZW5jZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgJCQgPSAkMTsKKwl9CisJOworCit2dHhPcHRXZWlnaHROdW06ICB8ICdbJyB2dHhXZWlnaHROdW0gJ10nOwordnR4V2VpZ2h0TnVtOiBJTlRFR0VSOworCitmcmFnQXR0cmliSXRlbTogUE9TSVRJT04KKwl7CisJICAgJCQgPSBWQVJZSU5HX1NMT1RfUE9TOworCX0KKwl8IENPTE9SIG9wdENvbG9yVHlwZQorCXsKKwkgICAkJCA9IFZBUllJTkdfU0xPVF9DT0wwICsgJDI7CisJfQorCXwgRk9HQ09PUkQKKwl7CisJICAgJCQgPSBWQVJZSU5HX1NMT1RfRk9HQzsKKwl9CisJfCBURVhDT09SRCBvcHRUZXhDb29yZFVuaXROdW0KKwl7CisJICAgJCQgPSBWQVJZSU5HX1NMT1RfVEVYMCArICQyOworCX0KKwk7CisKK1BBUkFNX3N0YXRlbWVudDogUEFSQU1fc2luZ2xlU3RtdCB8IFBBUkFNX211bHRpcGxlU3RtdDsKKworUEFSQU1fc2luZ2xlU3RtdDogUEFSQU0gSURFTlRJRklFUiBwYXJhbVNpbmdsZUluaXQKKwl7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgKmNvbnN0IHMgPQorCSAgICAgIGRlY2xhcmVfdmFyaWFibGUoc3RhdGUsICQyLCBhdF9wYXJhbSwgJiBAMik7CisKKwkgICBpZiAocyA9PSBOVUxMKSB7CisJICAgICAgZnJlZSgkMik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgeworCSAgICAgIHMtPnBhcmFtX2JpbmRpbmdfdHlwZSA9ICQzLnBhcmFtX2JpbmRpbmdfdHlwZTsKKwkgICAgICBzLT5wYXJhbV9iaW5kaW5nX2JlZ2luID0gJDMucGFyYW1fYmluZGluZ19iZWdpbjsKKwkgICAgICBzLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCA9ICQzLnBhcmFtX2JpbmRpbmdfbGVuZ3RoOworICAgICAgICAgICAgICBzLT5wYXJhbV9iaW5kaW5nX3N3aXp6bGUgPSAkMy5wYXJhbV9iaW5kaW5nX3N3aXp6bGU7CisJICAgICAgcy0+cGFyYW1faXNfYXJyYXkgPSAwOworCSAgIH0KKwl9CisJOworCitQQVJBTV9tdWx0aXBsZVN0bXQ6IFBBUkFNIElERU5USUZJRVIgJ1snIG9wdEFycmF5U2l6ZSAnXScgcGFyYW1NdWx0aXBsZUluaXQKKwl7CisJICAgaWYgKCgkNCAhPSAwKSAmJiAoKHVuc2lnbmVkKSAkNCAhPSAkNi5wYXJhbV9iaW5kaW5nX2xlbmd0aCkpIHsKKwkgICAgICBmcmVlKCQyKTsKKwkgICAgICB5eWVycm9yKCYgQDQsIHN0YXRlLCAKKwkJICAgICAgInBhcmFtZXRlciBhcnJheSBzaXplIGFuZCBudW1iZXIgb2YgYmluZGluZ3MgbXVzdCBtYXRjaCIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqY29uc3QgcyA9CisJCSBkZWNsYXJlX3ZhcmlhYmxlKHN0YXRlLCAkMiwgJDYudHlwZSwgJiBAMik7CisKKwkgICAgICBpZiAocyA9PSBOVUxMKSB7CisJCSBmcmVlKCQyKTsKKwkJIFlZRVJST1I7CisJICAgICAgfSBlbHNlIHsKKwkJIHMtPnBhcmFtX2JpbmRpbmdfdHlwZSA9ICQ2LnBhcmFtX2JpbmRpbmdfdHlwZTsKKwkJIHMtPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSAkNi5wYXJhbV9iaW5kaW5nX2JlZ2luOworCQkgcy0+cGFyYW1fYmluZGluZ19sZW5ndGggPSAkNi5wYXJhbV9iaW5kaW5nX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgcy0+cGFyYW1fYmluZGluZ19zd2l6emxlID0gU1dJWlpMRV9YWVpXOworCQkgcy0+cGFyYW1faXNfYXJyYXkgPSAxOworCSAgICAgIH0KKwkgICB9CisJfQorCTsKKworb3B0QXJyYXlTaXplOgorCXsKKwkgICAkJCA9IDA7CisJfQorCXwgSU5URUdFUgorICAgICAgICB7CisJICAgaWYgKCgkMSA8IDEpIHx8ICgodW5zaWduZWQpICQxID4gc3RhdGUtPmxpbWl0cy0+TWF4UGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgICAgY2hhciBtc2dbMTAwXTsKKyAgICAgICAgICAgICAgX21lc2Ffc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGFyYW1ldGVyIGFycmF5IHNpemUgKHNpemU9JWQgbWF4PSV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxLCBzdGF0ZS0+bGltaXRzLT5NYXhQYXJhbWV0ZXJzKTsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCBtc2cpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICAkJCA9ICQxOworCSAgIH0KKwl9CisJOworCitwYXJhbVNpbmdsZUluaXQ6ICc9JyBwYXJhbVNpbmdsZUl0ZW1EZWNsCisJeworCSAgICQkID0gJDI7CisJfQorCTsKKworcGFyYW1NdWx0aXBsZUluaXQ6ICc9JyAneycgcGFyYW1NdWx0SW5pdExpc3QgJ30nCisJeworCSAgICQkID0gJDM7CisJfQorCTsKKworcGFyYW1NdWx0SW5pdExpc3Q6IHBhcmFtTXVsdGlwbGVJdGVtCisJfCBwYXJhbU11bHRJbml0TGlzdCAnLCcgcGFyYW1NdWx0aXBsZUl0ZW0KKwl7CisJICAgJDEucGFyYW1fYmluZGluZ19sZW5ndGggKz0gJDMucGFyYW1fYmluZGluZ19sZW5ndGg7CisJICAgJCQgPSAkMTsKKwl9CisJOworCitwYXJhbVNpbmdsZUl0ZW1EZWNsOiBzdGF0ZVNpbmdsZUl0ZW0KKwl7CisJICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3N0YXRlKHN0YXRlLT5wcm9nLCAmICQkLCAkMSk7CisJfQorCXwgcHJvZ3JhbVNpbmdsZUl0ZW0KKwl7CisJICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3BhcmFtKHN0YXRlLT5wcm9nLCAmICQkLCAkMSk7CisJfQorCXwgcGFyYW1Db25zdERlY2wKKwl7CisJICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX2NvbnN0KHN0YXRlLT5wcm9nLCAmICQkLCAmICQxLCBHTF9UUlVFKTsKKwl9CisJOworCitwYXJhbVNpbmdsZUl0ZW1Vc2U6IHN0YXRlU2luZ2xlSXRlbQorCXsKKwkgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisJICAgJCQucGFyYW1fYmluZGluZ19iZWdpbiA9IH4wOworCSAgIGluaXRpYWxpemVfc3ltYm9sX2Zyb21fc3RhdGUoc3RhdGUtPnByb2csICYgJCQsICQxKTsKKwl9CisJfCBwcm9ncmFtU2luZ2xlSXRlbQorCXsKKwkgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisJICAgJCQucGFyYW1fYmluZGluZ19iZWdpbiA9IH4wOworCSAgIGluaXRpYWxpemVfc3ltYm9sX2Zyb21fcGFyYW0oc3RhdGUtPnByb2csICYgJCQsICQxKTsKKwl9CisJfCBwYXJhbUNvbnN0VXNlCisJeworCSAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKwkgICAkJC5wYXJhbV9iaW5kaW5nX2JlZ2luID0gfjA7CisJICAgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdGF0ZS0+cHJvZywgJiAkJCwgJiAkMSwgR0xfVFJVRSk7CisJfQorCTsKKworcGFyYW1NdWx0aXBsZUl0ZW06IHN0YXRlTXVsdGlwbGVJdGVtCisJeworCSAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKwkgICAkJC5wYXJhbV9iaW5kaW5nX2JlZ2luID0gfjA7CisJICAgaW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9zdGF0ZShzdGF0ZS0+cHJvZywgJiAkJCwgJDEpOworCX0KKwl8IHByb2dyYW1NdWx0aXBsZUl0ZW0KKwl7CisJICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX3BhcmFtKHN0YXRlLT5wcm9nLCAmICQkLCAkMSk7CisJfQorCXwgcGFyYW1Db25zdERlY2wKKwl7CisJICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkLnBhcmFtX2JpbmRpbmdfYmVnaW4gPSB+MDsKKwkgICBpbml0aWFsaXplX3N5bWJvbF9mcm9tX2NvbnN0KHN0YXRlLT5wcm9nLCAmICQkLCAmICQxLCBHTF9GQUxTRSk7CisJfQorCTsKKworc3RhdGVNdWx0aXBsZUl0ZW06IHN0YXRlU2luZ2xlSXRlbSAgICAgICAgeyBtZW1jcHkoJCQsICQxLCBzaXplb2YoJCQpKTsgfQorCXwgU1RBVEUgc3RhdGVNYXRyaXhSb3dzICAgICAgICAgICB7IG1lbWNweSgkJCwgJDIsIHNpemVvZigkJCkpOyB9CisJOworCitzdGF0ZVNpbmdsZUl0ZW06IFNUQVRFIHN0YXRlTWF0ZXJpYWxJdGVtICB7IG1lbWNweSgkJCwgJDIsIHNpemVvZigkJCkpOyB9CisJfCBTVEFURSBzdGF0ZUxpZ2h0SXRlbSAgICAgICAgICAgIHsgbWVtY3B5KCQkLCAkMiwgc2l6ZW9mKCQkKSk7IH0KKwl8IFNUQVRFIHN0YXRlTGlnaHRNb2RlbEl0ZW0gICAgICAgeyBtZW1jcHkoJCQsICQyLCBzaXplb2YoJCQpKTsgfQorCXwgU1RBVEUgc3RhdGVMaWdodFByb2RJdGVtICAgICAgICB7IG1lbWNweSgkJCwgJDIsIHNpemVvZigkJCkpOyB9CisJfCBTVEFURSBzdGF0ZVRleEdlbkl0ZW0gICAgICAgICAgIHsgbWVtY3B5KCQkLCAkMiwgc2l6ZW9mKCQkKSk7IH0KKwl8IFNUQVRFIHN0YXRlVGV4RW52SXRlbSAgICAgICAgICAgeyBtZW1jcHkoJCQsICQyLCBzaXplb2YoJCQpKTsgfQorCXwgU1RBVEUgc3RhdGVGb2dJdGVtICAgICAgICAgICAgICB7IG1lbWNweSgkJCwgJDIsIHNpemVvZigkJCkpOyB9CisJfCBTVEFURSBzdGF0ZUNsaXBQbGFuZUl0ZW0gICAgICAgIHsgbWVtY3B5KCQkLCAkMiwgc2l6ZW9mKCQkKSk7IH0KKwl8IFNUQVRFIHN0YXRlUG9pbnRJdGVtICAgICAgICAgICAgeyBtZW1jcHkoJCQsICQyLCBzaXplb2YoJCQpKTsgfQorCXwgU1RBVEUgc3RhdGVNYXRyaXhSb3cgICAgICAgICAgICB7IG1lbWNweSgkJCwgJDIsIHNpemVvZigkJCkpOyB9CisJfCBTVEFURSBzdGF0ZURlcHRoSXRlbSAgICAgICAgICAgIHsgbWVtY3B5KCQkLCAkMiwgc2l6ZW9mKCQkKSk7IH0KKwk7CisKK3N0YXRlTWF0ZXJpYWxJdGVtOiBNQVRFUklBTCBvcHRGYWNlVHlwZSBzdGF0ZU1hdFByb3BlcnR5CisJeworCSAgIG1lbXNldCgkJCwgMCwgc2l6ZW9mKCQkKSk7CisJICAgJCRbMF0gPSBTVEFURV9NQVRFUklBTDsKKwkgICAkJFsxXSA9ICQyOworCSAgICQkWzJdID0gJDM7CisJfQorCTsKKworc3RhdGVNYXRQcm9wZXJ0eTogYW1iRGlmZlNwZWNQcm9wZXJ0eQorCXsKKwkgICAkJCA9ICQxOworCX0KKwl8IEVNSVNTSU9OCisJeworCSAgICQkID0gU1RBVEVfRU1JU1NJT047CisJfQorCXwgU0hJTklORVNTCisJeworCSAgICQkID0gU1RBVEVfU0hJTklORVNTOworCX0KKwk7CisKK3N0YXRlTGlnaHRJdGVtOiBMSUdIVCAnWycgc3RhdGVMaWdodE51bWJlciAnXScgc3RhdGVMaWdodFByb3BlcnR5CisJeworCSAgIG1lbXNldCgkJCwgMCwgc2l6ZW9mKCQkKSk7CisJICAgJCRbMF0gPSBTVEFURV9MSUdIVDsKKwkgICAkJFsxXSA9ICQzOworCSAgICQkWzJdID0gJDU7CisJfQorCTsKKworc3RhdGVMaWdodFByb3BlcnR5OiBhbWJEaWZmU3BlY1Byb3BlcnR5CisJeworCSAgICQkID0gJDE7CisJfQorCXwgUE9TSVRJT04KKwl7CisJICAgJCQgPSBTVEFURV9QT1NJVElPTjsKKwl9CisJfCBBVFRFTlVBVElPTgorCXsKKwkgICBpZiAoIXN0YXRlLT5jdHgtPkV4dGVuc2lvbnMuRVhUX3BvaW50X3BhcmFtZXRlcnMpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgJCQgPSBTVEFURV9BVFRFTlVBVElPTjsKKwl9CisJfCBTUE9UIHN0YXRlU3BvdFByb3BlcnR5CisJeworCSAgICQkID0gJDI7CisJfQorCXwgSEFMRgorCXsKKwkgICAkJCA9IFNUQVRFX0hBTEZfVkVDVE9SOworCX0KKwk7CisKK3N0YXRlU3BvdFByb3BlcnR5OiBESVJFQ1RJT04KKwl7CisJICAgJCQgPSBTVEFURV9TUE9UX0RJUkVDVElPTjsKKwl9CisJOworCitzdGF0ZUxpZ2h0TW9kZWxJdGVtOiBMSUdIVE1PREVMIHN0YXRlTE1vZFByb3BlcnR5CisJeworCSAgICQkWzBdID0gJDJbMF07CisJICAgJCRbMV0gPSAkMlsxXTsKKwl9CisJOworCitzdGF0ZUxNb2RQcm9wZXJ0eTogQU1CSUVOVAorCXsKKwkgICBtZW1zZXQoJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkWzBdID0gU1RBVEVfTElHSFRNT0RFTF9BTUJJRU5UOworCX0KKwl8IG9wdEZhY2VUeXBlIFNDRU5FQ09MT1IKKwl7CisJICAgbWVtc2V0KCQkLCAwLCBzaXplb2YoJCQpKTsKKwkgICAkJFswXSA9IFNUQVRFX0xJR0hUTU9ERUxfU0NFTkVDT0xPUjsKKwkgICAkJFsxXSA9ICQxOworCX0KKwk7CisKK3N0YXRlTGlnaHRQcm9kSXRlbTogTElHSFRQUk9EICdbJyBzdGF0ZUxpZ2h0TnVtYmVyICddJyBvcHRGYWNlVHlwZSBzdGF0ZUxQcm9kUHJvcGVydHkKKwl7CisJICAgbWVtc2V0KCQkLCAwLCBzaXplb2YoJCQpKTsKKwkgICAkJFswXSA9IFNUQVRFX0xJR0hUUFJPRDsKKwkgICAkJFsxXSA9ICQzOworCSAgICQkWzJdID0gJDU7CisJICAgJCRbM10gPSAkNjsKKwl9CisJOworCitzdGF0ZUxQcm9kUHJvcGVydHk6IGFtYkRpZmZTcGVjUHJvcGVydHk7CisKK3N0YXRlVGV4RW52SXRlbTogVEVYRU5WIG9wdExlZ2FjeVRleFVuaXROdW0gc3RhdGVUZXhFbnZQcm9wZXJ0eQorCXsKKwkgICBtZW1zZXQoJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkWzBdID0gJDM7CisJICAgJCRbMV0gPSAkMjsKKwl9CisJOworCitzdGF0ZVRleEVudlByb3BlcnR5OiBDT0xPUgorCXsKKwkgICAkJCA9IFNUQVRFX1RFWEVOVl9DT0xPUjsKKwl9CisJOworCithbWJEaWZmU3BlY1Byb3BlcnR5OiBBTUJJRU5UCisJeworCSAgICQkID0gU1RBVEVfQU1CSUVOVDsKKwl9CisJfCBESUZGVVNFCisJeworCSAgICQkID0gU1RBVEVfRElGRlVTRTsKKwl9CisJfCBTUEVDVUxBUgorCXsKKwkgICAkJCA9IFNUQVRFX1NQRUNVTEFSOworCX0KKwk7CisKK3N0YXRlTGlnaHROdW1iZXI6IElOVEVHRVIKKwl7CisJICAgaWYgKCh1bnNpZ25lZCkgJDEgPj0gc3RhdGUtPk1heExpZ2h0cykgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIGxpZ2h0IHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAkJCA9ICQxOworCX0KKwk7CisKK3N0YXRlVGV4R2VuSXRlbTogVEVYR0VOIG9wdFRleENvb3JkVW5pdE51bSBzdGF0ZVRleEdlblR5cGUgc3RhdGVUZXhHZW5Db29yZAorCXsKKwkgICBtZW1zZXQoJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkWzBdID0gU1RBVEVfVEVYR0VOOworCSAgICQkWzFdID0gJDI7CisJICAgJCRbMl0gPSAkMyArICQ0OworCX0KKwk7CisKK3N0YXRlVGV4R2VuVHlwZTogRVlFCisJeworCSAgICQkID0gU1RBVEVfVEVYR0VOX0VZRV9TOworCX0KKwl8IE9CSkVDVAorCXsKKwkgICAkJCA9IFNUQVRFX1RFWEdFTl9PQkpFQ1RfUzsKKwl9CisJOworc3RhdGVUZXhHZW5Db29yZDogVEVYR0VOX1MKKwl7CisJICAgJCQgPSBTVEFURV9URVhHRU5fRVlFX1MgLSBTVEFURV9URVhHRU5fRVlFX1M7CisJfQorCXwgVEVYR0VOX1QKKwl7CisJICAgJCQgPSBTVEFURV9URVhHRU5fRVlFX1QgLSBTVEFURV9URVhHRU5fRVlFX1M7CisJfQorCXwgVEVYR0VOX1IKKwl7CisJICAgJCQgPSBTVEFURV9URVhHRU5fRVlFX1IgLSBTVEFURV9URVhHRU5fRVlFX1M7CisJfQorCXwgVEVYR0VOX1EKKwl7CisJICAgJCQgPSBTVEFURV9URVhHRU5fRVlFX1EgLSBTVEFURV9URVhHRU5fRVlFX1M7CisJfQorCTsKKworc3RhdGVGb2dJdGVtOiBGT0cgc3RhdGVGb2dQcm9wZXJ0eQorCXsKKwkgICBtZW1zZXQoJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkWzBdID0gJDI7CisJfQorCTsKKworc3RhdGVGb2dQcm9wZXJ0eTogQ09MT1IKKwl7CisJICAgJCQgPSBTVEFURV9GT0dfQ09MT1I7CisJfQorCXwgUEFSQU1TCisJeworCSAgICQkID0gU1RBVEVfRk9HX1BBUkFNUzsKKwl9CisJOworCitzdGF0ZUNsaXBQbGFuZUl0ZW06IENMSVAgJ1snIHN0YXRlQ2xpcFBsYW5lTnVtICddJyBQTEFORQorCXsKKwkgICBtZW1zZXQoJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkWzBdID0gU1RBVEVfQ0xJUFBMQU5FOworCSAgICQkWzFdID0gJDM7CisJfQorCTsKKworc3RhdGVDbGlwUGxhbmVOdW06IElOVEVHRVIKKwl7CisJICAgaWYgKCh1bnNpZ25lZCkgJDEgPj0gc3RhdGUtPk1heENsaXBQbGFuZXMpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBjbGlwIHBsYW5lIHNlbGVjdG9yIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisKKwkgICAkJCA9ICQxOworCX0KKwk7CisKK3N0YXRlUG9pbnRJdGVtOiBQT0lOVF9UT0sgc3RhdGVQb2ludFByb3BlcnR5CisJeworCSAgIG1lbXNldCgkJCwgMCwgc2l6ZW9mKCQkKSk7CisJICAgJCRbMF0gPSAkMjsKKwl9CisJOworCitzdGF0ZVBvaW50UHJvcGVydHk6IFNJWkVfVE9LCisJeworCSAgICQkID0gU1RBVEVfUE9JTlRfU0laRTsKKwl9CisJfCBBVFRFTlVBVElPTgorCXsKKwkgICAkJCA9IFNUQVRFX1BPSU5UX0FUVEVOVUFUSU9OOworCX0KKwk7CisKK3N0YXRlTWF0cml4Um93OiBzdGF0ZU1hdHJpeEl0ZW0gUk9XICdbJyBzdGF0ZU1hdHJpeFJvd051bSAnXScKKwl7CisJICAgJCRbMF0gPSAkMVswXTsKKwkgICAkJFsxXSA9ICQxWzFdOworCSAgICQkWzJdID0gJDQ7CisJICAgJCRbM10gPSAkNDsKKwkgICAkJFs0XSA9ICQxWzJdOworCX0KKwk7CisKK3N0YXRlTWF0cml4Um93czogc3RhdGVNYXRyaXhJdGVtIG9wdE1hdHJpeFJvd3MKKwl7CisJICAgJCRbMF0gPSAkMVswXTsKKwkgICAkJFsxXSA9ICQxWzFdOworCSAgICQkWzJdID0gJDJbMl07CisJICAgJCRbM10gPSAkMlszXTsKKwkgICAkJFs0XSA9ICQxWzJdOworCX0KKwk7CisKK29wdE1hdHJpeFJvd3M6CisJeworCSAgICQkWzJdID0gMDsKKwkgICAkJFszXSA9IDM7CisJfQorCXwgUk9XICdbJyBzdGF0ZU1hdHJpeFJvd051bSBET1RfRE9UIHN0YXRlTWF0cml4Um93TnVtICddJworCXsKKwkgICAvKiBJdCBzZWVtcyBsb2dpY2FsIHRoYXQgdGhlIG1hdHJpeCByb3cgcmFuZ2Ugc3BlY2lmaWVyIHdvdWxkIGhhdmUKKwkgICAgKiB0byBzcGVjaWZ5IGEgcmFuZ2Ugb3IgbW9yZSB0aGFuIG9uZSByb3cgKGkuZS4sICQ1ID4gJDMpLgorCSAgICAqIEhvd2V2ZXIsIHRoZSBBUkJfdmVydGV4X3Byb2dyYW0gc3BlYyBzYXlzICJhIHByb2dyYW0gd2lsbCBmYWlsCisJICAgICogdG8gbG9hZCBpZiA8YT4gaXMgZ3JlYXRlciB0aGFuIDxiPi4iICBUaGlzIG1lYW5zIHRoYXQgJDMgPT0gJDUKKwkgICAgKiBpcyB2YWxpZC4KKwkgICAgKi8KKwkgICBpZiAoJDMgPiAkNSkgeworCSAgICAgIHl5ZXJyb3IoJiBAMywgc3RhdGUsICJpbnZhbGlkIG1hdHJpeCByb3cgcmFuZ2UiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICQkWzJdID0gJDM7CisJICAgJCRbM10gPSAkNTsKKwl9CisJOworCitzdGF0ZU1hdHJpeEl0ZW06IE1BVFJJWCBzdGF0ZU1hdHJpeE5hbWUgc3RhdGVPcHRNYXRNb2RpZmllcgorCXsKKwkgICAkJFswXSA9ICQyWzBdOworCSAgICQkWzFdID0gJDJbMV07CisJICAgJCRbMl0gPSAkMzsKKwl9CisJOworCitzdGF0ZU9wdE1hdE1vZGlmaWVyOiAKKwl7CisJICAgJCQgPSAwOworCX0KKwl8IHN0YXRlTWF0TW9kaWZpZXIKKwl7CisJICAgJCQgPSAkMTsKKwl9CisJOworCitzdGF0ZU1hdE1vZGlmaWVyOiBJTlZFUlNFIAorCXsKKwkgICAkJCA9IFNUQVRFX01BVFJJWF9JTlZFUlNFOworCX0KKwl8IFRSQU5TUE9TRSAKKwl7CisJICAgJCQgPSBTVEFURV9NQVRSSVhfVFJBTlNQT1NFOworCX0KKwl8IElOVlRSQU5TCisJeworCSAgICQkID0gU1RBVEVfTUFUUklYX0lOVlRSQU5TOworCX0KKwk7CisKK3N0YXRlTWF0cml4Um93TnVtOiBJTlRFR0VSCisJeworCSAgIGlmICgkMSA+IDMpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBtYXRyaXggcm93IHJlZmVyZW5jZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgJCQgPSAkMTsKKwl9CisJOworCitzdGF0ZU1hdHJpeE5hbWU6IE1PREVMVklFVyBzdGF0ZU9wdE1vZE1hdE51bQorCXsKKwkgICAkJFswXSA9IFNUQVRFX01PREVMVklFV19NQVRSSVg7CisJICAgJCRbMV0gPSAkMjsKKwl9CisJfCBQUk9KRUNUSU9OCisJeworCSAgICQkWzBdID0gU1RBVEVfUFJPSkVDVElPTl9NQVRSSVg7CisJICAgJCRbMV0gPSAwOworCX0KKwl8IE1WUAorCXsKKwkgICAkJFswXSA9IFNUQVRFX01WUF9NQVRSSVg7CisJICAgJCRbMV0gPSAwOworCX0KKwl8IFRFWFRVUkUgb3B0VGV4Q29vcmRVbml0TnVtCisJeworCSAgICQkWzBdID0gU1RBVEVfVEVYVFVSRV9NQVRSSVg7CisJICAgJCRbMV0gPSAkMjsKKwl9CisJfCBQQUxFVFRFICdbJyBzdGF0ZVBhbGV0dGVNYXROdW0gJ10nCisJeworCSAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJHTF9BUkJfbWF0cml4X3BhbGV0dGUgbm90IHN1cHBvcnRlZCIpOworCSAgIFlZRVJST1I7CisJfQorCXwgTUFUX1BST0dSQU0gJ1snIHN0YXRlUHJvZ3JhbU1hdE51bSAnXScKKwl7CisJICAgJCRbMF0gPSBTVEFURV9QUk9HUkFNX01BVFJJWDsKKwkgICAkJFsxXSA9ICQzOworCX0KKwk7CisKK3N0YXRlT3B0TW9kTWF0TnVtOgorCXsKKwkgICAkJCA9IDA7CisJfQorCXwgJ1snIHN0YXRlTW9kTWF0TnVtICddJworCXsKKwkgICAkJCA9ICQyOworCX0KKwk7CitzdGF0ZU1vZE1hdE51bTogSU5URUdFUgorCXsKKwkgICAvKiBTaW5jZSBHTF9BUkJfdmVydGV4X2JsZW5kIGlzbid0IHN1cHBvcnRlZCwgb25seSBtb2RlbHZpZXcgbWF0cml4CisJICAgICogemVybyBpcyB2YWxpZC4KKwkgICAgKi8KKwkgICBpZiAoJDEgIT0gMCkgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIG1vZGVsdmlldyBtYXRyaXggaW5kZXgiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICQkID0gJDE7CisJfQorCTsKK3N0YXRlUGFsZXR0ZU1hdE51bTogSU5URUdFUgorCXsKKwkgICAvKiBTaW5jZSBHTF9BUkJfbWF0cml4X3BhbGV0dGUgaXNuJ3Qgc3VwcG9ydGVkLCBqdXN0IGxldCBhbnkgdmFsdWUKKwkgICAgKiB0aHJvdWdoIGhlcmUuICBUaGUgZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgbGF0ZXIuCisJICAgICovCisJICAgJCQgPSAkMTsKKwl9CisJOworc3RhdGVQcm9ncmFtTWF0TnVtOiBJTlRFR0VSCisJeworCSAgIGlmICgodW5zaWduZWQpICQxID49IHN0YXRlLT5NYXhQcm9ncmFtTWF0cmljZXMpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBwcm9ncmFtIG1hdHJpeCBzZWxlY3RvciIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgJCQgPSAkMTsKKwl9CisJOworCitzdGF0ZURlcHRoSXRlbTogREVQVEggUkFOR0UKKwl7CisJICAgbWVtc2V0KCQkLCAwLCBzaXplb2YoJCQpKTsKKwkgICAkJFswXSA9IFNUQVRFX0RFUFRIX1JBTkdFOworCX0KKwk7CisKKworcHJvZ3JhbVNpbmdsZUl0ZW06IHByb2dFbnZQYXJhbSB8IHByb2dMb2NhbFBhcmFtOworCitwcm9ncmFtTXVsdGlwbGVJdGVtOiBwcm9nRW52UGFyYW1zIHwgcHJvZ0xvY2FsUGFyYW1zOworCitwcm9nRW52UGFyYW1zOiBQUk9HUkFNIEVOViAnWycgcHJvZ0VudlBhcmFtTnVtcyAnXScKKwl7CisJICAgbWVtc2V0KCQkLCAwLCBzaXplb2YoJCQpKTsKKwkgICAkJFswXSA9IHN0YXRlLT5zdGF0ZV9wYXJhbV9lbnVtOworCSAgICQkWzFdID0gU1RBVEVfRU5WOworCSAgICQkWzJdID0gJDRbMF07CisJICAgJCRbM10gPSAkNFsxXTsKKwl9CisJOworCitwcm9nRW52UGFyYW1OdW1zOiBwcm9nRW52UGFyYW1OdW0KKwl7CisJICAgJCRbMF0gPSAkMTsKKwkgICAkJFsxXSA9ICQxOworCX0KKwl8IHByb2dFbnZQYXJhbU51bSBET1RfRE9UIHByb2dFbnZQYXJhbU51bQorCXsKKwkgICAkJFswXSA9ICQxOworCSAgICQkWzFdID0gJDM7CisJfQorCTsKKworcHJvZ0VudlBhcmFtOiBQUk9HUkFNIEVOViAnWycgcHJvZ0VudlBhcmFtTnVtICddJworCXsKKwkgICBtZW1zZXQoJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkWzBdID0gc3RhdGUtPnN0YXRlX3BhcmFtX2VudW07CisJICAgJCRbMV0gPSBTVEFURV9FTlY7CisJICAgJCRbMl0gPSAkNDsKKwkgICAkJFszXSA9ICQ0OworCX0KKwk7CisKK3Byb2dMb2NhbFBhcmFtczogUFJPR1JBTSBMT0NBTCAnWycgcHJvZ0xvY2FsUGFyYW1OdW1zICddJworCXsKKwkgICBtZW1zZXQoJCQsIDAsIHNpemVvZigkJCkpOworCSAgICQkWzBdID0gc3RhdGUtPnN0YXRlX3BhcmFtX2VudW07CisJICAgJCRbMV0gPSBTVEFURV9MT0NBTDsKKwkgICAkJFsyXSA9ICQ0WzBdOworCSAgICQkWzNdID0gJDRbMV07CisJfQorCitwcm9nTG9jYWxQYXJhbU51bXM6IHByb2dMb2NhbFBhcmFtTnVtCisJeworCSAgICQkWzBdID0gJDE7CisJICAgJCRbMV0gPSAkMTsKKwl9CisJfCBwcm9nTG9jYWxQYXJhbU51bSBET1RfRE9UIHByb2dMb2NhbFBhcmFtTnVtCisJeworCSAgICQkWzBdID0gJDE7CisJICAgJCRbMV0gPSAkMzsKKwl9CisJOworCitwcm9nTG9jYWxQYXJhbTogUFJPR1JBTSBMT0NBTCAnWycgcHJvZ0xvY2FsUGFyYW1OdW0gJ10nCisJeworCSAgIG1lbXNldCgkJCwgMCwgc2l6ZW9mKCQkKSk7CisJICAgJCRbMF0gPSBzdGF0ZS0+c3RhdGVfcGFyYW1fZW51bTsKKwkgICAkJFsxXSA9IFNUQVRFX0xPQ0FMOworCSAgICQkWzJdID0gJDQ7CisJICAgJCRbM10gPSAkNDsKKwl9CisJOworCitwcm9nRW52UGFyYW1OdW06IElOVEVHRVIKKwl7CisJICAgaWYgKCh1bnNpZ25lZCkgJDEgPj0gc3RhdGUtPmxpbWl0cy0+TWF4RW52UGFyYW1zKSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImludmFsaWQgZW52aXJvbm1lbnQgcGFyYW1ldGVyIHJlZmVyZW5jZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCSAgICQkID0gJDE7CisJfQorCTsKKworcHJvZ0xvY2FsUGFyYW1OdW06IElOVEVHRVIKKwl7CisJICAgaWYgKCh1bnNpZ25lZCkgJDEgPj0gc3RhdGUtPmxpbWl0cy0+TWF4TG9jYWxQYXJhbXMpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBsb2NhbCBwYXJhbWV0ZXIgcmVmZXJlbmNlIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJICAgJCQgPSAkMTsKKwl9CisJOworCisKKworcGFyYW1Db25zdERlY2w6IHBhcmFtQ29uc3RTY2FsYXJEZWNsIHwgcGFyYW1Db25zdFZlY3RvcjsKK3BhcmFtQ29uc3RVc2U6IHBhcmFtQ29uc3RTY2FsYXJVc2UgfCBwYXJhbUNvbnN0VmVjdG9yOworCitwYXJhbUNvbnN0U2NhbGFyRGVjbDogc2lnbmVkRmxvYXRDb25zdGFudAorCXsKKwkgICAkJC5jb3VudCA9IDQ7CisJICAgJCQuZGF0YVswXS5mID0gJDE7CisJICAgJCQuZGF0YVsxXS5mID0gJDE7CisJICAgJCQuZGF0YVsyXS5mID0gJDE7CisJICAgJCQuZGF0YVszXS5mID0gJDE7CisJfQorCTsKKworcGFyYW1Db25zdFNjYWxhclVzZTogUkVBTAorCXsKKwkgICAkJC5jb3VudCA9IDE7CisJICAgJCQuZGF0YVswXS5mID0gJDE7CisJICAgJCQuZGF0YVsxXS5mID0gJDE7CisJICAgJCQuZGF0YVsyXS5mID0gJDE7CisJICAgJCQuZGF0YVszXS5mID0gJDE7CisJfQorCXwgSU5URUdFUgorCXsKKwkgICAkJC5jb3VudCA9IDE7CisJICAgJCQuZGF0YVswXS5mID0gKGZsb2F0KSAkMTsKKwkgICAkJC5kYXRhWzFdLmYgPSAoZmxvYXQpICQxOworCSAgICQkLmRhdGFbMl0uZiA9IChmbG9hdCkgJDE7CisJICAgJCQuZGF0YVszXS5mID0gKGZsb2F0KSAkMTsKKwl9CisJOworCitwYXJhbUNvbnN0VmVjdG9yOiAneycgc2lnbmVkRmxvYXRDb25zdGFudCAnfScKKwl7CisJICAgJCQuY291bnQgPSA0OworCSAgICQkLmRhdGFbMF0uZiA9ICQyOworCSAgICQkLmRhdGFbMV0uZiA9IDAuMGY7CisJICAgJCQuZGF0YVsyXS5mID0gMC4wZjsKKwkgICAkJC5kYXRhWzNdLmYgPSAxLjBmOworCX0KKwl8ICd7JyBzaWduZWRGbG9hdENvbnN0YW50ICcsJyBzaWduZWRGbG9hdENvbnN0YW50ICd9JworCXsKKwkgICAkJC5jb3VudCA9IDQ7CisJICAgJCQuZGF0YVswXS5mID0gJDI7CisJICAgJCQuZGF0YVsxXS5mID0gJDQ7CisJICAgJCQuZGF0YVsyXS5mID0gMC4wZjsKKwkgICAkJC5kYXRhWzNdLmYgPSAxLjBmOworCX0KKwl8ICd7JyBzaWduZWRGbG9hdENvbnN0YW50ICcsJyBzaWduZWRGbG9hdENvbnN0YW50ICcsJworICAgICAgICAgICAgICBzaWduZWRGbG9hdENvbnN0YW50ICd9JworCXsKKwkgICAkJC5jb3VudCA9IDQ7CisJICAgJCQuZGF0YVswXS5mID0gJDI7CisJICAgJCQuZGF0YVsxXS5mID0gJDQ7CisJICAgJCQuZGF0YVsyXS5mID0gJDY7CisJICAgJCQuZGF0YVszXS5mID0gMS4wZjsKKwl9CisJfCAneycgc2lnbmVkRmxvYXRDb25zdGFudCAnLCcgc2lnbmVkRmxvYXRDb25zdGFudCAnLCcKKyAgICAgICAgICAgICAgc2lnbmVkRmxvYXRDb25zdGFudCAnLCcgc2lnbmVkRmxvYXRDb25zdGFudCAnfScKKwl7CisJICAgJCQuY291bnQgPSA0OworCSAgICQkLmRhdGFbMF0uZiA9ICQyOworCSAgICQkLmRhdGFbMV0uZiA9ICQ0OworCSAgICQkLmRhdGFbMl0uZiA9ICQ2OworCSAgICQkLmRhdGFbM10uZiA9ICQ4OworCX0KKwk7CisKK3NpZ25lZEZsb2F0Q29uc3RhbnQ6IG9wdGlvbmFsU2lnbiBSRUFMCisJeworCSAgICQkID0gKCQxKSA/IC0kMiA6ICQyOworCX0KKwl8IG9wdGlvbmFsU2lnbiBJTlRFR0VSCisJeworCSAgICQkID0gKGZsb2F0KSgoJDEpID8gLSQyIDogJDIpOworCX0KKwk7CisKK29wdGlvbmFsU2lnbjogJysnICAgICAgICB7ICQkID0gRkFMU0U7IH0KKwl8ICctJyAgICAgICAgICAgIHsgJCQgPSBUUlVFOyAgfQorCXwgICAgICAgICAgICAgICAgeyAkJCA9IEZBTFNFOyB9CisJOworCitURU1QX3N0YXRlbWVudDogb3B0VmFyU2l6ZSBURU1QIHsgJDxpbnRlZ2VyPiQgPSAkMjsgfSB2YXJOYW1lTGlzdAorCTsKKworb3B0VmFyU2l6ZTogc3RyaW5nCisJeworCSAgIC8qIE5WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uIGRlZmluZXMgdGhlIHNpemUgcXVhbGlmaWVycyBpbiBhCisJICAgICogZmFpcmx5IGJyb2tlbiB3YXkuICAiU0hPUlQiIG9yICJMT05HIiBjYW4gb3B0aW9uYWxseSBiZSB1c2VkCisJICAgICogYmVmb3JlIFRFTVAgb3IgT1VUUFVULiAgSG93ZXZlciwgbmVpdGhlciBpcyBhIHJlc2VydmVkIHdvcmQhCisJICAgICogVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gcGFyc2UgaXQgYXMgYW4gaWRlbnRpZmllciwgdGhlbiBjaGVjaworCSAgICAqIHRvIG1ha2Ugc3VyZSBpdCdzIG9uZSBvZiB0aGUgdmFsaWQgdmFsdWVzLiAgKnNpZ2gqCisJICAgICoKKwkgICAgKiBJbiBhZGRpdGlvbiwgdGhlIGdyYW1tYXIgaW4gdGhlIGV4dGVuc2lvbiBzcGVjIGRvZXMgKm5vdCogYWxsb3cKKwkgICAgKiB0aGUgc2l6ZSBzcGVjaWZpZXIgdG8gYmUgb3B0aW9uYWwsIGJ1dCBhbGwga25vd24gaW1wbGVtZW50YXRpb25zCisJICAgICogZG8uCisJICAgICovCisJICAgaWYgKCFzdGF0ZS0+b3B0aW9uLk5WX2ZyYWdtZW50KSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgInVuZXhwZWN0ZWQgSURFTlRJRklFUiIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgaWYgKHN0cmNtcCgiU0hPUlQiLCAkMSkgPT0gMCkgeworCSAgIH0gZWxzZSBpZiAoc3RyY21wKCJMT05HIiwgJDEpID09IDApIHsKKwkgICB9IGVsc2UgeworCSAgICAgIGNoYXIgKmNvbnN0IGVycl9zdHIgPQorCQkgbWFrZV9lcnJvcl9zdHJpbmcoImludmFsaWQgc3RvcmFnZSBzaXplIHNwZWNpZmllciBcIiVzXCIiLAorCQkJCSAgICQxKTsKKworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsIChlcnJfc3RyICE9IE5VTEwpCisJCSAgICAgID8gZXJyX3N0ciA6ICJpbnZhbGlkIHN0b3JhZ2Ugc2l6ZSBzcGVjaWZpZXIiKTsKKworCSAgICAgIGlmIChlcnJfc3RyICE9IE5VTEwpIHsKKwkJIGZyZWUoZXJyX3N0cik7CisJICAgICAgfQorCisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorCXwKKwl7CisJfQorCTsKKworQUREUkVTU19zdGF0ZW1lbnQ6IEFERFJFU1MgeyAkPGludGVnZXI+JCA9ICQxOyB9IHZhck5hbWVMaXN0CisJOworCit2YXJOYW1lTGlzdDogdmFyTmFtZUxpc3QgJywnIElERU5USUZJRVIKKwl7CisJICAgaWYgKCFkZWNsYXJlX3ZhcmlhYmxlKHN0YXRlLCAkMywgJDxpbnRlZ2VyPjAsICYgQDMpKSB7CisJICAgICAgZnJlZSgkMyk7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorCXwgSURFTlRJRklFUgorCXsKKwkgICBpZiAoIWRlY2xhcmVfdmFyaWFibGUoc3RhdGUsICQxLCAkPGludGVnZXI+MCwgJiBAMSkpIHsKKwkgICAgICBmcmVlKCQxKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisJOworCitPVVRQVVRfc3RhdGVtZW50OiBvcHRWYXJTaXplIE9VVFBVVCBJREVOVElGSUVSICc9JyByZXN1bHRCaW5kaW5nCisJeworCSAgIHN0cnVjdCBhc21fc3ltYm9sICpjb25zdCBzID0KKwkgICAgICBkZWNsYXJlX3ZhcmlhYmxlKHN0YXRlLCAkMywgYXRfb3V0cHV0LCAmIEAzKTsKKworCSAgIGlmIChzID09IE5VTEwpIHsKKwkgICAgICBmcmVlKCQzKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0gZWxzZSB7CisJICAgICAgcy0+b3V0cHV0X2JpbmRpbmcgPSAkNTsKKwkgICB9CisJfQorCTsKKworcmVzdWx0QmluZGluZzogUkVTVUxUIFBPU0lUSU9OCisJeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgJCQgPSBWQVJZSU5HX1NMT1RfUE9TOworCSAgIH0gZWxzZSB7CisJICAgICAgeXllcnJvcigmIEAyLCBzdGF0ZSwgImludmFsaWQgcHJvZ3JhbSByZXN1bHQgbmFtZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCX0KKwl8IFJFU1VMVCBGT0dDT09SRAorCXsKKwkgICBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX3ZlcnRleCkgeworCSAgICAgICQkID0gVkFSWUlOR19TTE9UX0ZPR0M7CisJICAgfSBlbHNlIHsKKwkgICAgICB5eWVycm9yKCYgQDIsIHN0YXRlLCAiaW52YWxpZCBwcm9ncmFtIHJlc3VsdCBuYW1lIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorCXwgUkVTVUxUIHJlc3VsdENvbEJpbmRpbmcKKwl7CisJICAgJCQgPSAkMjsKKwl9CisJfCBSRVNVTFQgUE9JTlRTSVpFCisJeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgJCQgPSBWQVJZSU5HX1NMT1RfUFNJWjsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiBAMiwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisJfCBSRVNVTFQgVEVYQ09PUkQgb3B0VGV4Q29vcmRVbml0TnVtCisJeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgJCQgPSBWQVJZSU5HX1NMT1RfVEVYMCArICQzOworCSAgIH0gZWxzZSB7CisJICAgICAgeXllcnJvcigmIEAyLCBzdGF0ZSwgImludmFsaWQgcHJvZ3JhbSByZXN1bHQgbmFtZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCX0KKwl8IFJFU1VMVCBERVBUSAorCXsKKwkgICBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX2ZyYWdtZW50KSB7CisJICAgICAgJCQgPSBGUkFHX1JFU1VMVF9ERVBUSDsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiBAMiwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisJOworCityZXN1bHRDb2xCaW5kaW5nOiBDT0xPUiBvcHRSZXN1bHRGYWNlVHlwZSBvcHRSZXN1bHRDb2xvclR5cGUKKwl7CisJICAgJCQgPSAkMiArICQzOworCX0KKwk7CisKK29wdFJlc3VsdEZhY2VUeXBlOgorCXsKKwkgICBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX3ZlcnRleCkgeworCSAgICAgICQkID0gVkFSWUlOR19TTE9UX0NPTDA7CisJICAgfSBlbHNlIHsKKwkgICAgICBpZiAoc3RhdGUtPm9wdGlvbi5EcmF3QnVmZmVycykKKwkJICQkID0gRlJBR19SRVNVTFRfREFUQTA7CisJICAgICAgZWxzZQorCQkgJCQgPSBGUkFHX1JFU1VMVF9DT0xPUjsKKwkgICB9CisJfQorCXwgJ1snIElOVEVHRVIgJ10nCisJeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImludmFsaWQgcHJvZ3JhbSByZXN1bHQgbmFtZSIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICBpZiAoIXN0YXRlLT5vcHRpb24uRHJhd0J1ZmZlcnMpIHsKKwkJIC8qIEZyb20gdGhlIEFSQl9kcmF3X2J1ZmZlcnMgc3BlYyAoc2FtZSB0ZXh0IGV4aXN0cworCQkgICogZm9yIEFUSV9kcmF3X2J1ZmZlcnMpOgorCQkgICoKKwkJICAqICAgICBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhIGZyYWdtZW50CisJCSAgKiAgICAgcHJvZ3JhbSB0aGF0IGF0dGVtcHRzIHRvIGJpbmQKKwkJICAqICAgICAicmVzdWx0LmNvbG9yW25dIiB3aWxsIGZhaWwgdG8gbG9hZCwgYW5kIG9ubHkKKwkJICAqICAgICAicmVzdWx0LmNvbG9yIiB3aWxsIGJlIGFsbG93ZWQuCisJCSAgKi8KKwkJIHl5ZXJyb3IoJiBAMSwgc3RhdGUsCisJCQkgInJlc3VsdC5jb2xvcltdIHVzZWQgd2l0aG91dCAiCisJCQkgImBPUFRJT04gQVJCX2RyYXdfYnVmZmVycycgb3IgIgorCQkJICJgT1BUSU9OIEFUSV9kcmF3X2J1ZmZlcnMnIik7CisJCSBZWUVSUk9SOworCSAgICAgIH0gZWxzZSBpZiAoJDIgPj0gc3RhdGUtPk1heERyYXdCdWZmZXJzKSB7CisJCSB5eWVycm9yKCYgQDEsIHN0YXRlLAorCQkJICJyZXN1bHQuY29sb3JbXSBleGNlZWRzIE1BWF9EUkFXX0JVRkZFUlNfQVJCIik7CisJCSBZWUVSUk9SOworCSAgICAgIH0KKwkgICAgICAkJCA9IEZSQUdfUkVTVUxUX0RBVEEwICsgJDI7CisJICAgfQorCX0KKwl8IEZST05UCisJeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgJCQgPSBWQVJZSU5HX1NMT1RfQ09MMDsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisJfCBCQUNLCisJeworCSAgIGlmIChzdGF0ZS0+bW9kZSA9PSBBUkJfdmVydGV4KSB7CisJICAgICAgJCQgPSBWQVJZSU5HX1NMT1RfQkZDMDsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisJOworCitvcHRSZXN1bHRDb2xvclR5cGU6CisJeworCSAgICQkID0gMDsgCisJfQorCXwgUFJJTUFSWQorCXsKKwkgICBpZiAoc3RhdGUtPm1vZGUgPT0gQVJCX3ZlcnRleCkgeworCSAgICAgICQkID0gMDsKKwkgICB9IGVsc2UgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIHByb2dyYW0gcmVzdWx0IG5hbWUiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKwl9CisJfCBTRUNPTkRBUlkKKwl7CisJICAgaWYgKHN0YXRlLT5tb2RlID09IEFSQl92ZXJ0ZXgpIHsKKwkgICAgICAkJCA9IDE7CisJICAgfSBlbHNlIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCBwcm9ncmFtIHJlc3VsdCBuYW1lIik7CisJICAgICAgWVlFUlJPUjsKKwkgICB9CisJfQorCTsKKworb3B0RmFjZVR5cGU6ICAgIHsgJCQgPSAwOyB9CisJfCBGUk9OVAl7ICQkID0gMDsgfQorCXwgQkFDSyAgeyAkJCA9IDE7IH0KKwk7CisKK29wdENvbG9yVHlwZTogICAgICAgeyAkJCA9IDA7IH0KKwl8IFBSSU1BUlkgICB7ICQkID0gMDsgfQorCXwgU0VDT05EQVJZIHsgJCQgPSAxOyB9CisJOworCitvcHRUZXhDb29yZFVuaXROdW06ICAgICAgICAgICAgICAgIHsgJCQgPSAwOyB9CisJfCAnWycgdGV4Q29vcmRVbml0TnVtICddJyAgeyAkJCA9ICQyOyB9CisJOworCitvcHRUZXhJbWFnZVVuaXROdW06ICAgICAgICAgICAgICAgIHsgJCQgPSAwOyB9CisJfCAnWycgdGV4SW1hZ2VVbml0TnVtICddJyAgeyAkJCA9ICQyOyB9CisJOworCitvcHRMZWdhY3lUZXhVbml0TnVtOiAgICAgICAgICAgICAgIHsgJCQgPSAwOyB9CisJfCAnWycgbGVnYWN5VGV4VW5pdE51bSAnXScgeyAkJCA9ICQyOyB9CisJOworCit0ZXhDb29yZFVuaXROdW06IElOVEVHRVIKKwl7CisJICAgaWYgKCh1bnNpZ25lZCkgJDEgPj0gc3RhdGUtPk1heFRleHR1cmVDb29yZFVuaXRzKSB7CisJICAgICAgeXllcnJvcigmIEAxLCBzdGF0ZSwgImludmFsaWQgdGV4dHVyZSBjb29yZGluYXRlIHVuaXQgc2VsZWN0b3IiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICQkID0gJDE7CisJfQorCTsKKwordGV4SW1hZ2VVbml0TnVtOiBJTlRFR0VSCisJeworCSAgIGlmICgodW5zaWduZWQpICQxID49IHN0YXRlLT5NYXhUZXh0dXJlSW1hZ2VVbml0cykgeworCSAgICAgIHl5ZXJyb3IoJiBAMSwgc3RhdGUsICJpbnZhbGlkIHRleHR1cmUgaW1hZ2UgdW5pdCBzZWxlY3RvciIpOworCSAgICAgIFlZRVJST1I7CisJICAgfQorCisJICAgJCQgPSAkMTsKKwl9CisJOworCitsZWdhY3lUZXhVbml0TnVtOiBJTlRFR0VSCisJeworCSAgIGlmICgodW5zaWduZWQpICQxID49IHN0YXRlLT5NYXhUZXh0dXJlVW5pdHMpIHsKKwkgICAgICB5eWVycm9yKCYgQDEsIHN0YXRlLCAiaW52YWxpZCB0ZXh0dXJlIHVuaXQgc2VsZWN0b3IiKTsKKwkgICAgICBZWUVSUk9SOworCSAgIH0KKworCSAgICQkID0gJDE7CisJfQorCTsKKworQUxJQVNfc3RhdGVtZW50OiBBTElBUyBJREVOVElGSUVSICc9JyBVU0VEX0lERU5USUZJRVIKKwl7CisJICAgc3RydWN0IGFzbV9zeW1ib2wgKmV4aXN0ID0gKHN0cnVjdCBhc21fc3ltYm9sICopCisJICAgICAgX21lc2Ffc3ltYm9sX3RhYmxlX2ZpbmRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgJDIpOworCSAgIHN0cnVjdCBhc21fc3ltYm9sICp0YXJnZXQgPSAoc3RydWN0IGFzbV9zeW1ib2wgKikKKwkgICAgICBfbWVzYV9zeW1ib2xfdGFibGVfZmluZF9zeW1ib2woc3RhdGUtPnN0LCAwLCAkNCk7CisKKwkgICBmcmVlKCQ0KTsKKworCSAgIGlmIChleGlzdCAhPSBOVUxMKSB7CisJICAgICAgY2hhciBtWzEwMDBdOworCSAgICAgIF9tZXNhX3NucHJpbnRmKG0sIHNpemVvZihtKSwgInJlZGVjbGFyZWQgaWRlbnRpZmllcjogJXMiLCAkMik7CisJICAgICAgZnJlZSgkMik7CisJICAgICAgeXllcnJvcigmIEAyLCBzdGF0ZSwgbSk7CisJICAgICAgWVlFUlJPUjsKKwkgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBOVUxMKSB7CisJICAgICAgZnJlZSgkMik7CisJICAgICAgeXllcnJvcigmIEA0LCBzdGF0ZSwKKwkJICAgICAgInVuZGVmaW5lZCB2YXJpYWJsZSBiaW5kaW5nIGluIEFMSUFTIHN0YXRlbWVudCIpOworCSAgICAgIFlZRVJST1I7CisJICAgfSBlbHNlIHsKKwkgICAgICBfbWVzYV9zeW1ib2xfdGFibGVfYWRkX3N5bWJvbChzdGF0ZS0+c3QsIDAsICQyLCB0YXJnZXQpOworCSAgIH0KKwl9CisJOworCitzdHJpbmc6IElERU5USUZJRVIKKwl8IFVTRURfSURFTlRJRklFUgorCTsKKworJSUKKwordm9pZAorYXNtX2luc3RydWN0aW9uX3NldF9vcGVyYW5kcyhzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICppbnN0LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzAsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMxLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMikKK3sKKyAgIC8qIEluIHRoZSBjb3JlIEFSQiBleHRlbnNpb25zIG9ubHkgdGhlIEtJTCBpbnN0cnVjdGlvbiBkb2Vzbid0IGhhdmUgYQorICAgICogZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgICAgKi8KKyAgIGlmIChkc3QgPT0gTlVMTCkgeworICAgICAgaW5pdF9kc3RfcmVnKCYgaW5zdC0+QmFzZS5Ec3RSZWcpOworICAgfSBlbHNlIHsKKyAgICAgIGluc3QtPkJhc2UuRHN0UmVnID0gKmRzdDsKKyAgIH0KKworICAgLyogVGhlIG9ubHkgaW5zdHJ1Y3Rpb24gdGhhdCBkb2Vzbid0IGhhdmUgYW55IHNvdXJjZSByZWdpc3RlcnMgaXMgdGhlCisgICAgKiBjb25kaXRpb24tY29kZSBiYXNlZCBLSUwgaW5zdHJ1Y3Rpb24gYWRkZWQgYnkgTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24uCisgICAgKi8KKyAgIGlmIChzcmMwICE9IE5VTEwpIHsKKyAgICAgIGluc3QtPkJhc2UuU3JjUmVnWzBdID0gc3JjMC0+QmFzZTsKKyAgICAgIGluc3QtPlNyY1JlZ1swXSA9ICpzcmMwOworICAgfSBlbHNlIHsKKyAgICAgIGluaXRfc3JjX3JlZygmIGluc3QtPlNyY1JlZ1swXSk7CisgICB9CisKKyAgIGlmIChzcmMxICE9IE5VTEwpIHsKKyAgICAgIGluc3QtPkJhc2UuU3JjUmVnWzFdID0gc3JjMS0+QmFzZTsKKyAgICAgIGluc3QtPlNyY1JlZ1sxXSA9ICpzcmMxOworICAgfSBlbHNlIHsKKyAgICAgIGluaXRfc3JjX3JlZygmIGluc3QtPlNyY1JlZ1sxXSk7CisgICB9CisKKyAgIGlmIChzcmMyICE9IE5VTEwpIHsKKyAgICAgIGluc3QtPkJhc2UuU3JjUmVnWzJdID0gc3JjMi0+QmFzZTsKKyAgICAgIGluc3QtPlNyY1JlZ1syXSA9ICpzcmMyOworICAgfSBlbHNlIHsKKyAgICAgIGluaXRfc3JjX3JlZygmIGluc3QtPlNyY1JlZ1syXSk7CisgICB9Cit9CisKKworc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqCithc21faW5zdHJ1Y3Rpb25fY3RvcihnbF9pbnN0X29wY29kZSBvcCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKmRzdCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMikKK3sKKyAgIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKmluc3QgPSBDQUxMT0NfU1RSVUNUKGFzbV9pbnN0cnVjdGlvbik7CisKKyAgIGlmIChpbnN0KSB7CisgICAgICBfbWVzYV9pbml0X2luc3RydWN0aW9ucygmIGluc3QtPkJhc2UsIDEpOworICAgICAgaW5zdC0+QmFzZS5PcGNvZGUgPSBvcDsKKworICAgICAgYXNtX2luc3RydWN0aW9uX3NldF9vcGVyYW5kcyhpbnN0LCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgfQorCisgICByZXR1cm4gaW5zdDsKK30KKworCitzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICoKK2FzbV9pbnN0cnVjdGlvbl9jb3B5X2N0b3IoY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmJhc2UsCisJCQkgIGNvbnN0IHN0cnVjdCBwcm9nX2RzdF9yZWdpc3RlciAqZHN0LAorCQkJICBjb25zdCBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciAqc3JjMCwKKwkJCSAgY29uc3Qgc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnNyYzEsCisJCQkgIGNvbnN0IHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpzcmMyKQoreworICAgc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqaW5zdCA9IENBTExPQ19TVFJVQ1QoYXNtX2luc3RydWN0aW9uKTsKKworICAgaWYgKGluc3QpIHsKKyAgICAgIF9tZXNhX2luaXRfaW5zdHJ1Y3Rpb25zKCYgaW5zdC0+QmFzZSwgMSk7CisgICAgICBpbnN0LT5CYXNlLk9wY29kZSA9IGJhc2UtPk9wY29kZTsKKyAgICAgIGluc3QtPkJhc2UuQ29uZFVwZGF0ZSA9IGJhc2UtPkNvbmRVcGRhdGU7CisgICAgICBpbnN0LT5CYXNlLkNvbmREc3QgPSBiYXNlLT5Db25kRHN0OworICAgICAgaW5zdC0+QmFzZS5TYXR1cmF0ZU1vZGUgPSBiYXNlLT5TYXR1cmF0ZU1vZGU7CisgICAgICBpbnN0LT5CYXNlLlByZWNpc2lvbiA9IGJhc2UtPlByZWNpc2lvbjsKKworICAgICAgYXNtX2luc3RydWN0aW9uX3NldF9vcGVyYW5kcyhpbnN0LCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgfQorCisgICByZXR1cm4gaW5zdDsKK30KKworCit2b2lkCitpbml0X2RzdF9yZWcoc3RydWN0IHByb2dfZHN0X3JlZ2lzdGVyICpyKQoreworICAgbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOworICAgci0+RmlsZSA9IFBST0dSQU1fVU5ERUZJTkVEOworICAgci0+V3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICByLT5Db25kTWFzayA9IENPTkRfVFI7CisgICByLT5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKK30KKworCisvKiogTGlrZSBpbml0X2RzdF9yZWcoKSBidXQgc2V0IHRoZSBGaWxlIGFuZCBJbmRleCBmaWVsZHMuICovCit2b2lkCitzZXRfZHN0X3JlZyhzdHJ1Y3QgcHJvZ19kc3RfcmVnaXN0ZXIgKnIsIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwgR0xpbnQgaW5kZXgpCit7CisgICBjb25zdCBHTGludCBtYXhJbmRleCA9IDEgPDwgSU5TVF9JTkRFWF9CSVRTOworICAgY29uc3QgR0xpbnQgbWluSW5kZXggPSAwOworICAgQVNTRVJUKGluZGV4ID49IG1pbkluZGV4KTsKKyAgICh2b2lkKSBtaW5JbmRleDsKKyAgIEFTU0VSVChpbmRleCA8PSBtYXhJbmRleCk7CisgICAodm9pZCkgbWF4SW5kZXg7CisgICBBU1NFUlQoZmlsZSA9PSBQUk9HUkFNX1RFTVBPUkFSWSB8fAorCSAgZmlsZSA9PSBQUk9HUkFNX0FERFJFU1MgfHwKKwkgIGZpbGUgPT0gUFJPR1JBTV9PVVRQVVQpOworICAgbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOworICAgci0+RmlsZSA9IGZpbGU7CisgICByLT5JbmRleCA9IGluZGV4OworICAgci0+V3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICByLT5Db25kTWFzayA9IENPTkRfVFI7CisgICByLT5Db25kU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKK30KKworCit2b2lkCitpbml0X3NyY19yZWcoc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnIpCit7CisgICBtZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CisgICByLT5CYXNlLkZpbGUgPSBQUk9HUkFNX1VOREVGSU5FRDsKKyAgIHItPkJhc2UuU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIHItPlN5bWJvbCA9IE5VTEw7Cit9CisKKworLyoqIExpa2UgaW5pdF9zcmNfcmVnKCkgYnV0IHNldCB0aGUgRmlsZSBhbmQgSW5kZXggZmllbGRzLgorICogXHJldHVybiBHTF9UUlVFIGlmIGEgdmFsaWQgc3JjIHJlZ2lzdGVyLCBHTF9GQUxTRSBvdGhlcndpc2UKKyAqLwordm9pZAorc2V0X3NyY19yZWcoc3RydWN0IGFzbV9zcmNfcmVnaXN0ZXIgKnIsIGdsX3JlZ2lzdGVyX2ZpbGUgZmlsZSwgR0xpbnQgaW5kZXgpCit7CisgICBzZXRfc3JjX3JlZ19zd3oociwgZmlsZSwgaW5kZXgsIFNXSVpaTEVfWFlaVyk7Cit9CisKKwordm9pZAorc2V0X3NyY19yZWdfc3d6KHN0cnVjdCBhc21fc3JjX3JlZ2lzdGVyICpyLCBnbF9yZWdpc3Rlcl9maWxlIGZpbGUsIEdMaW50IGluZGV4LAorICAgICAgICAgICAgICAgIEdMdWludCBzd2l6emxlKQoreworICAgY29uc3QgR0xpbnQgbWF4SW5kZXggPSAoMSA8PCBJTlNUX0lOREVYX0JJVFMpIC0gMTsKKyAgIGNvbnN0IEdMaW50IG1pbkluZGV4ID0gLSgxIDw8IElOU1RfSU5ERVhfQklUUyk7CisgICBBU1NFUlQoZmlsZSA8IFBST0dSQU1fRklMRV9NQVgpOworICAgQVNTRVJUKGluZGV4ID49IG1pbkluZGV4KTsKKyAgICh2b2lkKSBtaW5JbmRleDsKKyAgIEFTU0VSVChpbmRleCA8PSBtYXhJbmRleCk7CisgICAodm9pZCkgbWF4SW5kZXg7CisgICBtZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CisgICByLT5CYXNlLkZpbGUgPSBmaWxlOworICAgci0+QmFzZS5JbmRleCA9IGluZGV4OworICAgci0+QmFzZS5Td2l6emxlID0gc3dpenpsZTsKKyAgIHItPlN5bWJvbCA9IE5VTEw7Cit9CisKKworLyoqCisgKiBWYWxpZGF0ZSB0aGUgc2V0IG9mIGlucHV0cyB1c2VkIGJ5IGEgcHJvZ3JhbQorICoKKyAqIFZhbGlkYXRlcyB0aGF0IGxlZ2FsIHNldHMgb2YgaW5wdXRzIGFyZSB1c2VkIGJ5IHRoZSBwcm9ncmFtLiAgSW4gdGhpcyBjYXNlCisgKiAidXNlZCIgaW5jbHVkZWQgYm90aCByZWFkaW5nIHRoZSBpbnB1dCBvciBiaW5kaW5nIHRoZSBpbnB1dCB0byBhIG5hbWUgdXNpbmcKKyAqIHRoZSBcYyBBVFRSSUIgY29tbWFuZC4KKyAqCisgKiBccmV0dXJuCisgKiBcYyBUUlVFIGlmIHRoZSBjb21iaW5hdGlvbiBvZiBpbnB1dHMgdXNlZCBpcyB2YWxpZCwgXGMgRkFMU0Ugb3RoZXJ3aXNlLgorICovCitpbnQKK3ZhbGlkYXRlX2lucHV0cyhzdHJ1Y3QgWVlMVFlQRSAqbG9jcCwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKQoreworICAgY29uc3QgR0xiaXRmaWVsZDY0IGlucHV0cyA9IHN0YXRlLT5wcm9nLT5JbnB1dHNSZWFkIHwgc3RhdGUtPklucHV0c0JvdW5kOworCisgICBpZiAoKChpbnB1dHMgJiBWRVJUX0JJVF9GRl9BTEwpICYgKGlucHV0cyA+PiBWRVJUX0FUVFJJQl9HRU5FUklDMCkpICE9IDApIHsKKyAgICAgIHl5ZXJyb3IobG9jcCwgc3RhdGUsICJpbGxlZ2FsIHVzZSBvZiBnZW5lcmljIGF0dHJpYnV0ZSBhbmQgbmFtZSBhdHRyaWJ1dGUiKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworCitzdHJ1Y3QgYXNtX3N5bWJvbCAqCitkZWNsYXJlX3ZhcmlhYmxlKHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSwgY2hhciAqbmFtZSwgZW51bSBhc21fdHlwZSB0LAorCQkgc3RydWN0IFlZTFRZUEUgKmxvY3ApCit7CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqcyA9IE5VTEw7CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqZXhpc3QgPSAoc3RydWN0IGFzbV9zeW1ib2wgKikKKyAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbChzdGF0ZS0+c3QsIDAsIG5hbWUpOworCisKKyAgIGlmIChleGlzdCAhPSBOVUxMKSB7CisgICAgICB5eWVycm9yKGxvY3AsIHN0YXRlLCAicmVkZWNsYXJlZCBpZGVudGlmaWVyIik7CisgICB9IGVsc2UgeworICAgICAgcyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFzbV9zeW1ib2wpKTsKKyAgICAgIHMtPm5hbWUgPSBuYW1lOworICAgICAgcy0+dHlwZSA9IHQ7CisKKyAgICAgIHN3aXRjaCAodCkgeworICAgICAgY2FzZSBhdF90ZW1wOgorCSBpZiAoc3RhdGUtPnByb2ctPk51bVRlbXBvcmFyaWVzID49IHN0YXRlLT5saW1pdHMtPk1heFRlbXBzKSB7CisJICAgIHl5ZXJyb3IobG9jcCwgc3RhdGUsICJ0b28gbWFueSB0ZW1wb3JhcmllcyBkZWNsYXJlZCIpOworCSAgICBmcmVlKHMpOworCSAgICByZXR1cm4gTlVMTDsKKwkgfQorCisJIHMtPnRlbXBfYmluZGluZyA9IHN0YXRlLT5wcm9nLT5OdW1UZW1wb3JhcmllczsKKwkgc3RhdGUtPnByb2ctPk51bVRlbXBvcmFyaWVzKys7CisJIGJyZWFrOworCisgICAgICBjYXNlIGF0X2FkZHJlc3M6CisJIGlmIChzdGF0ZS0+cHJvZy0+TnVtQWRkcmVzc1JlZ3MgPj0gc3RhdGUtPmxpbWl0cy0+TWF4QWRkcmVzc1JlZ3MpIHsKKwkgICAgeXllcnJvcihsb2NwLCBzdGF0ZSwgInRvbyBtYW55IGFkZHJlc3MgcmVnaXN0ZXJzIGRlY2xhcmVkIik7CisJICAgIGZyZWUocyk7CisJICAgIHJldHVybiBOVUxMOworCSB9CisKKwkgLyogRklOSVNITUU6IEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhZGRyZXNzIHJlZ2lzdGVycy4KKwkgICovCisJIHN0YXRlLT5wcm9nLT5OdW1BZGRyZXNzUmVncysrOworCSBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkgYnJlYWs7CisgICAgICB9CisKKyAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9hZGRfc3ltYm9sKHN0YXRlLT5zdCwgMCwgcy0+bmFtZSwgcyk7CisgICAgICBzLT5uZXh0ID0gc3RhdGUtPnN5bTsKKyAgICAgIHN0YXRlLT5zeW0gPSBzOworICAgfQorCisgICByZXR1cm4gczsKK30KKworCitpbnQgYWRkX3N0YXRlX3JlZmVyZW5jZShzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqcGFyYW1fbGlzdCwKKwkJCWNvbnN0IGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdKQoreworICAgY29uc3QgR0x1aW50IHNpemUgPSA0OyAvKiBYWFggZml4ICovCisgICBjaGFyICpuYW1lOworICAgR0xpbnQgaW5kZXg7CisKKyAgIG5hbWUgPSBfbWVzYV9wcm9ncmFtX3N0YXRlX3N0cmluZyh0b2tlbnMpOworICAgaW5kZXggPSBfbWVzYV9hZGRfcGFyYW1ldGVyKHBhcmFtX2xpc3QsIFBST0dSQU1fU1RBVEVfVkFSLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIEdMX05PTkUsIE5VTEwsIHRva2Vucyk7CisgICBwYXJhbV9saXN0LT5TdGF0ZUZsYWdzIHw9IF9tZXNhX3Byb2dyYW1fc3RhdGVfZmxhZ3ModG9rZW5zKTsKKworICAgLyogZnJlZSBuYW1lIHN0cmluZyBoZXJlIHNpbmNlIHdlIGR1cGxpY2F0ZWQgaXQgaW4gYWRkX3BhcmFtZXRlcigpICovCisgICBmcmVlKG5hbWUpOworCisgICByZXR1cm4gaW5kZXg7Cit9CisKKworaW50Citpbml0aWFsaXplX3N5bWJvbF9mcm9tX3N0YXRlKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorCQkJICAgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqcGFyYW1fdmFyLCAKKwkJCSAgICAgY29uc3QgZ2xfc3RhdGVfaW5kZXggdG9rZW5zW1NUQVRFX0xFTkdUSF0pCit7CisgICBpbnQgaWR4ID0gLTE7CisgICBnbF9zdGF0ZV9pbmRleCBzdGF0ZV90b2tlbnNbU1RBVEVfTEVOR1RIXTsKKworCisgICBtZW1jcHkoc3RhdGVfdG9rZW5zLCB0b2tlbnMsIHNpemVvZihzdGF0ZV90b2tlbnMpKTsKKworICAgcGFyYW1fdmFyLT50eXBlID0gYXRfcGFyYW07CisgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfdHlwZSA9IFBST0dSQU1fU1RBVEVfVkFSOworCisgICAvKiBJZiB3ZSBhcmUgYWRkaW5nIGEgU1RBVEVfTUFUUklYIHRoYXQgaGFzIG11bHRpcGxlIHJvd3MsIHdlIG5lZWQgdG8KKyAgICAqIHVucm9sbCBpdCBhbmQgY2FsbCBhZGRfc3RhdGVfcmVmZXJlbmNlKCkgZm9yIGVhY2ggcm93CisgICAgKi8KKyAgIGlmICgoc3RhdGVfdG9rZW5zWzBdID09IFNUQVRFX01PREVMVklFV19NQVRSSVggfHwKKwlzdGF0ZV90b2tlbnNbMF0gPT0gU1RBVEVfUFJPSkVDVElPTl9NQVRSSVggfHwKKwlzdGF0ZV90b2tlbnNbMF0gPT0gU1RBVEVfTVZQX01BVFJJWCB8fAorCXN0YXRlX3Rva2Vuc1swXSA9PSBTVEFURV9URVhUVVJFX01BVFJJWCB8fAorCXN0YXRlX3Rva2Vuc1swXSA9PSBTVEFURV9QUk9HUkFNX01BVFJJWCkKKyAgICAgICAmJiAoc3RhdGVfdG9rZW5zWzJdICE9IHN0YXRlX3Rva2Vuc1szXSkpIHsKKyAgICAgIGludCByb3c7CisgICAgICBjb25zdCBpbnQgZmlyc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzJdOworICAgICAgY29uc3QgaW50IGxhc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzNdOworCisgICAgICBmb3IgKHJvdyA9IGZpcnN0X3Jvdzsgcm93IDw9IGxhc3Rfcm93OyByb3crKykgeworCSBzdGF0ZV90b2tlbnNbMl0gPSBzdGF0ZV90b2tlbnNbM10gPSByb3c7CisKKwkgaWR4ID0gYWRkX3N0YXRlX3JlZmVyZW5jZShwcm9nLT5QYXJhbWV0ZXJzLCBzdGF0ZV90b2tlbnMpOworCSBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworCSAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSBpZHg7CisgICAgICAgICAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgICAgIH0KKworCSBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfbGVuZ3RoKys7CisgICAgICB9CisgICB9CisgICBlbHNlIHsKKyAgICAgIGlkeCA9IGFkZF9zdGF0ZV9yZWZlcmVuY2UocHJvZy0+UGFyYW1ldGVycywgc3RhdGVfdG9rZW5zKTsKKyAgICAgIGlmIChwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPT0gfjBVKSB7CisJIHBhcmFtX3Zhci0+cGFyYW1fYmluZGluZ19iZWdpbiA9IGlkeDsKKyAgICAgICAgIHBhcmFtX3Zhci0+cGFyYW1fYmluZGluZ19zd2l6emxlID0gU1dJWlpMRV9YWVpXOworICAgICAgfQorICAgICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCsrOworICAgfQorCisgICByZXR1cm4gaWR4OworfQorCisKK2ludAoraW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9wYXJhbShzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKwkJCSAgICAgc3RydWN0IGFzbV9zeW1ib2wgKnBhcmFtX3ZhciwgCisJCQkgICAgIGNvbnN0IGdsX3N0YXRlX2luZGV4IHRva2Vuc1tTVEFURV9MRU5HVEhdKQoreworICAgaW50IGlkeCA9IC0xOworICAgZ2xfc3RhdGVfaW5kZXggc3RhdGVfdG9rZW5zW1NUQVRFX0xFTkdUSF07CisKKworICAgbWVtY3B5KHN0YXRlX3Rva2VucywgdG9rZW5zLCBzaXplb2Yoc3RhdGVfdG9rZW5zKSk7CisKKyAgIGFzc2VydCgoc3RhdGVfdG9rZW5zWzBdID09IFNUQVRFX1ZFUlRFWF9QUk9HUkFNKQorCSAgfHwgKHN0YXRlX3Rva2Vuc1swXSA9PSBTVEFURV9GUkFHTUVOVF9QUk9HUkFNKSk7CisgICBhc3NlcnQoKHN0YXRlX3Rva2Vuc1sxXSA9PSBTVEFURV9FTlYpCisJICB8fCAoc3RhdGVfdG9rZW5zWzFdID09IFNUQVRFX0xPQ0FMKSk7CisKKyAgIC8qCisgICAgKiBUaGUgcGFyYW0gdHlwZSBpcyBTVEFURV9WQVIuICBUaGUgcHJvZ3JhbSBwYXJhbWV0ZXIgZW50cnkgd2lsbAorICAgICogZWZmZWN0aXZlbHkgYmUgYSBwb2ludGVyIGludG8gdGhlIExPQ0FMIG9yIEVOViBwYXJhbWV0ZXIgYXJyYXkuCisgICAgKi8KKyAgIHBhcmFtX3Zhci0+dHlwZSA9IGF0X3BhcmFtOworICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX3R5cGUgPSBQUk9HUkFNX1NUQVRFX1ZBUjsKKworICAgLyogSWYgd2UgYXJlIGFkZGluZyBhIFNUQVRFX0VOViBvciBTVEFURV9MT0NBTCB0aGF0IGhhcyBtdWx0aXBsZSBlbGVtZW50cywKKyAgICAqIHdlIG5lZWQgdG8gdW5yb2xsIGl0IGFuZCBjYWxsIGFkZF9zdGF0ZV9yZWZlcmVuY2UoKSBmb3IgZWFjaCByb3cKKyAgICAqLworICAgaWYgKHN0YXRlX3Rva2Vuc1syXSAhPSBzdGF0ZV90b2tlbnNbM10pIHsKKyAgICAgIGludCByb3c7CisgICAgICBjb25zdCBpbnQgZmlyc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzJdOworICAgICAgY29uc3QgaW50IGxhc3Rfcm93ID0gc3RhdGVfdG9rZW5zWzNdOworCisgICAgICBmb3IgKHJvdyA9IGZpcnN0X3Jvdzsgcm93IDw9IGxhc3Rfcm93OyByb3crKykgeworCSBzdGF0ZV90b2tlbnNbMl0gPSBzdGF0ZV90b2tlbnNbM10gPSByb3c7CisKKwkgaWR4ID0gYWRkX3N0YXRlX3JlZmVyZW5jZShwcm9nLT5QYXJhbWV0ZXJzLCBzdGF0ZV90b2tlbnMpOworCSBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworCSAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSBpZHg7CisgICAgICAgICAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgICAgIH0KKwkgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCsrOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICBpZHggPSBhZGRfc3RhdGVfcmVmZXJlbmNlKHByb2ctPlBhcmFtZXRlcnMsIHN0YXRlX3Rva2Vucyk7CisgICAgICBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworCSBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfYmVnaW4gPSBpZHg7CisgICAgICAgICBwYXJhbV92YXItPnBhcmFtX2JpbmRpbmdfc3dpenpsZSA9IFNXSVpaTEVfWFlaVzsKKyAgICAgIH0KKyAgICAgIHBhcmFtX3Zhci0+cGFyYW1fYmluZGluZ19sZW5ndGgrKzsKKyAgIH0KKworICAgcmV0dXJuIGlkeDsKK30KKworCisvKioKKyAqIFB1dCBhIGZsb2F0L3ZlY3RvciBjb25zdGFudC9saXRlcmFsIGludG8gdGhlIHBhcmFtZXRlciBsaXN0LgorICogXHBhcmFtIHBhcmFtX3ZhciAgcmV0dXJucyBpbmZvIGFib3V0IHRoZSBwYXJhbWV0ZXIvY29uc3RhbnQncyBsb2NhdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgIGJpbmRpbmcsIHR5cGUsIGV0Yy4KKyAqIFxwYXJhbSB2ZWMgIHRoZSB2ZWN0b3IvY29uc3RhbnQgdG8gYWRkCisgKiBccGFyYW0gYWxsb3dTd2l6emxlICBpZiB0cnVlLCB0cnkgdG8gY29uc29saWRhdGUgY29uc3RhbnRzIHdoaWNoIG9ubHkgZGlmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICBieSBhIHN3aXp6bGUuICBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgd2hlbiBidWlsZGluZworICogICAgICAgICAgICAgICAgICAgICAgYXJyYXlzIG9mIGNvbnN0YW50cyB0aGF0IG1heSBiZSBpbmRleGVkIGluZGlyZWN0bHkuCisgKiBccmV0dXJuIGluZGV4IG9mIHRoZSBjb25zdGFudCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCisgKi8KK2ludAoraW5pdGlhbGl6ZV9zeW1ib2xfZnJvbV9jb25zdChzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKwkJCSAgICAgc3RydWN0IGFzbV9zeW1ib2wgKnBhcmFtX3ZhciwgCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhc21fdmVjdG9yICp2ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBhbGxvd1N3aXp6bGUpCit7CisgICB1bnNpZ25lZCBzd2l6emxlOworICAgY29uc3QgaW50IGlkeCA9IF9tZXNhX2FkZF91bm5hbWVkX2NvbnN0YW50KHByb2ctPlBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjLT5kYXRhLCB2ZWMtPmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93U3dpenpsZSA/ICZzd2l6emxlIDogTlVMTCk7CisKKyAgIHBhcmFtX3Zhci0+dHlwZSA9IGF0X3BhcmFtOworICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX3R5cGUgPSBQUk9HUkFNX0NPTlNUQU5UOworCisgICBpZiAocGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID09IH4wVSkgeworICAgICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2JlZ2luID0gaWR4OworICAgICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX3N3aXp6bGUgPSBhbGxvd1N3aXp6bGUgPyBzd2l6emxlIDogU1dJWlpMRV9YWVpXOworICAgfQorICAgcGFyYW1fdmFyLT5wYXJhbV9iaW5kaW5nX2xlbmd0aCsrOworCisgICByZXR1cm4gaWR4OworfQorCisKK2NoYXIgKgorbWFrZV9lcnJvcl9zdHJpbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICBpbnQgbGVuZ3RoOworICAgY2hhciAqc3RyOworICAgdmFfbGlzdCBhcmdzOworCisKKyAgIC8qIENhbGwgdnNucHJpbnRmIG9uY2UgdG8gZGV0ZXJtaW5lIGhvdyBsYXJnZSB0aGUgZmluYWwgc3RyaW5nIGlzLiAgQ2FsbCBpdAorICAgICogYWdhaW4gdG8gZG8gdGhlIGFjdHVhbCBmb3JtYXR0aW5nLiAgZnJvbSB0aGUgdnNucHJpbnRmIG1hbnVhbCBwYWdlOgorICAgICoKKyAgICAqICAgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIG51bWJlciBvZgorICAgICogICAgY2hhcmFjdGVycyBwcmludGVkICAobm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJyB1c2VkIHRvIGVuZAorICAgICogICAgb3V0cHV0IHRvIHN0cmluZ3MpLgorICAgICovCisgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgbGVuZ3RoID0gMSArIHZzbnByaW50ZihOVUxMLCAwLCBmbXQsIGFyZ3MpOworICAgdmFfZW5kKGFyZ3MpOworCisgICBzdHIgPSBtYWxsb2MobGVuZ3RoKTsKKyAgIGlmIChzdHIpIHsKKyAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgICB2c25wcmludGYoc3RyLCBsZW5ndGgsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQoYXJncyk7CisgICB9CisKKyAgIHJldHVybiBzdHI7Cit9CisKKwordm9pZAoreXllcnJvcihZWUxUWVBFICpsb2NwLCBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKnMpCit7CisgICBjaGFyICplcnJfc3RyOworCisKKyAgIGVycl9zdHIgPSBtYWtlX2Vycm9yX3N0cmluZygiZ2xQcm9ncmFtU3RyaW5nQVJCKCVzKVxuIiwgcyk7CisgICBpZiAoZXJyX3N0cikgeworICAgICAgX21lc2FfZXJyb3Ioc3RhdGUtPmN0eCwgR0xfSU5WQUxJRF9PUEVSQVRJT04sICIlcyIsIGVycl9zdHIpOworICAgICAgZnJlZShlcnJfc3RyKTsKKyAgIH0KKworICAgZXJyX3N0ciA9IG1ha2VfZXJyb3Jfc3RyaW5nKCJsaW5lICV1LCBjaGFyICV1OiBlcnJvcjogJXNcbiIsCisJCQkgICAgICAgbG9jcC0+Zmlyc3RfbGluZSwgbG9jcC0+Zmlyc3RfY29sdW1uLCBzKTsKKyAgIF9tZXNhX3NldF9wcm9ncmFtX2Vycm9yKHN0YXRlLT5jdHgsIGxvY3AtPnBvc2l0aW9uLCBlcnJfc3RyKTsKKworICAgaWYgKGVycl9zdHIpIHsKKyAgICAgIGZyZWUoZXJyX3N0cik7CisgICB9Cit9CisKKworR0xib29sZWFuCitfbWVzYV9wYXJzZV9hcmJfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHVieXRlICpzdHIsCisJCQlHTHNpemVpIGxlbiwgc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlKQoreworICAgc3RydWN0IGFzbV9pbnN0cnVjdGlvbiAqaW5zdDsKKyAgIHVuc2lnbmVkIGk7CisgICBHTHVieXRlICpzdHJ6OworICAgR0xib29sZWFuIHJlc3VsdCA9IEdMX0ZBTFNFOworICAgdm9pZCAqdGVtcDsKKyAgIHN0cnVjdCBhc21fc3ltYm9sICpzeW07CisKKyAgIHN0YXRlLT5jdHggPSBjdHg7CisgICBzdGF0ZS0+cHJvZy0+VGFyZ2V0ID0gdGFyZ2V0OworICAgc3RhdGUtPnByb2ctPlBhcmFtZXRlcnMgPSBfbWVzYV9uZXdfcGFyYW1ldGVyX2xpc3QoKTsKKworICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIHByb2dyYW0gc3RyaW5nIGFuZCBmb3JjZSBpdCB0byBiZSBOVUwtdGVybWluYXRlZC4KKyAgICAqLworICAgc3RyeiA9IChHTHVieXRlICopIG1hbGxvYyhsZW4gKyAxKTsKKyAgIGlmIChzdHJ6ID09IE5VTEwpIHsKKyAgICAgIF9tZXNhX2Vycm9yKGN0eCwgR0xfT1VUX09GX01FTU9SWSwgImdsUHJvZ3JhbVN0cmluZ0FSQiIpOworICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorICAgbWVtY3B5IChzdHJ6LCBzdHIsIGxlbik7CisgICBzdHJ6W2xlbl0gPSAnXDAnOworCisgICBzdGF0ZS0+cHJvZy0+U3RyaW5nID0gc3RyejsKKworICAgc3RhdGUtPnN0ID0gX21lc2Ffc3ltYm9sX3RhYmxlX2N0b3IoKTsKKworICAgc3RhdGUtPmxpbWl0cyA9ICh0YXJnZXQgPT0gR0xfVkVSVEVYX1BST0dSQU1fQVJCKQorICAgICAgPyAmIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdCisgICAgICA6ICYgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXTsKKworICAgc3RhdGUtPk1heFRleHR1cmVJbWFnZVVuaXRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhUZXh0dXJlSW1hZ2VVbml0czsKKyAgIHN0YXRlLT5NYXhUZXh0dXJlQ29vcmRVbml0cyA9IGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHM7CisgICBzdGF0ZS0+TWF4VGV4dHVyZVVuaXRzID0gY3R4LT5Db25zdC5NYXhUZXh0dXJlVW5pdHM7CisgICBzdGF0ZS0+TWF4Q2xpcFBsYW5lcyA9IGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lczsKKyAgIHN0YXRlLT5NYXhMaWdodHMgPSBjdHgtPkNvbnN0Lk1heExpZ2h0czsKKyAgIHN0YXRlLT5NYXhQcm9ncmFtTWF0cmljZXMgPSBjdHgtPkNvbnN0Lk1heFByb2dyYW1NYXRyaWNlczsKKyAgIHN0YXRlLT5NYXhEcmF3QnVmZmVycyA9IGN0eC0+Q29uc3QuTWF4RHJhd0J1ZmZlcnM7CisKKyAgIHN0YXRlLT5zdGF0ZV9wYXJhbV9lbnVtID0gKHRhcmdldCA9PSBHTF9WRVJURVhfUFJPR1JBTV9BUkIpCisgICAgICA/IFNUQVRFX1ZFUlRFWF9QUk9HUkFNIDogU1RBVEVfRlJBR01FTlRfUFJPR1JBTTsKKworICAgX21lc2Ffc2V0X3Byb2dyYW1fZXJyb3IoY3R4LCAtMSwgTlVMTCk7CisKKyAgIF9tZXNhX3Byb2dyYW1fbGV4ZXJfY3RvcigmIHN0YXRlLT5zY2FubmVyLCBzdGF0ZSwgKGNvbnN0IGNoYXIgKikgc3RyLCBsZW4pOworICAgeXlwYXJzZShzdGF0ZSk7CisgICBfbWVzYV9wcm9ncmFtX2xleGVyX2R0b3Ioc3RhdGUtPnNjYW5uZXIpOworCisKKyAgIGlmIChjdHgtPlByb2dyYW0uRXJyb3JQb3MgIT0gLTEpIHsKKyAgICAgIGdvdG8gZXJyb3I7CisgICB9CisKKyAgIGlmICghIF9tZXNhX2xheW91dF9wYXJhbWV0ZXJzKHN0YXRlKSkgeworICAgICAgc3RydWN0IFlZTFRZUEUgbG9jOworCisgICAgICBsb2MuZmlyc3RfbGluZSA9IDA7CisgICAgICBsb2MuZmlyc3RfY29sdW1uID0gMDsKKyAgICAgIGxvYy5wb3NpdGlvbiA9IGxlbjsKKworICAgICAgeXllcnJvcigmIGxvYywgc3RhdGUsICJpbnZhbGlkIFBBUkFNIHVzYWdlIik7CisgICAgICBnb3RvIGVycm9yOworICAgfQorCisKKyAgIAorICAgLyogQWRkIG9uZSBpbnN0cnVjdGlvbiB0byBzdG9yZSB0aGUgIkVORCIgaW5zdHJ1Y3Rpb24uCisgICAgKi8KKyAgIHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnMgPQorICAgICAgX21lc2FfYWxsb2NfaW5zdHJ1Y3Rpb25zKHN0YXRlLT5wcm9nLT5OdW1JbnN0cnVjdGlvbnMgKyAxKTsKKworICAgaWYgKHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnMgPT0gTlVMTCkgeworICAgICAgZ290byBlcnJvcjsKKyAgIH0KKworICAgaW5zdCA9IHN0YXRlLT5pbnN0X2hlYWQ7CisgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgYXNtX2luc3RydWN0aW9uICpjb25zdCB0ZW1wID0gaW5zdC0+bmV4dDsKKworICAgICAgc3RhdGUtPnByb2ctPkluc3RydWN0aW9uc1tpXSA9IGluc3QtPkJhc2U7CisgICAgICBpbnN0ID0gdGVtcDsKKyAgIH0KKworICAgLyogRmluYWxseSwgdGFnIG9uIGFuIE9QQ09ERV9FTkQgaW5zdHJ1Y3Rpb24gKi8KKyAgIHsKKyAgICAgIGNvbnN0IEdMdWludCBudW1JbnN0ID0gc3RhdGUtPnByb2ctPk51bUluc3RydWN0aW9uczsKKyAgICAgIF9tZXNhX2luaXRfaW5zdHJ1Y3Rpb25zKHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnMgKyBudW1JbnN0LCAxKTsKKyAgICAgIHN0YXRlLT5wcm9nLT5JbnN0cnVjdGlvbnNbbnVtSW5zdF0uT3Bjb2RlID0gT1BDT0RFX0VORDsKKyAgIH0KKyAgIHN0YXRlLT5wcm9nLT5OdW1JbnN0cnVjdGlvbnMrKzsKKworICAgc3RhdGUtPnByb2ctPk51bVBhcmFtZXRlcnMgPSBzdGF0ZS0+cHJvZy0+UGFyYW1ldGVycy0+TnVtUGFyYW1ldGVyczsKKyAgIHN0YXRlLT5wcm9nLT5OdW1BdHRyaWJ1dGVzID0gX21lc2FfYml0Y291bnRfNjQoc3RhdGUtPnByb2ctPklucHV0c1JlYWQpOworCisgICAvKgorICAgICogSW5pdGlhbGl6ZSBuYXRpdmUgY291bnRzIHRvIGxvZ2ljYWwgY291bnRzLiAgVGhlIGRldmljZSBkcml2ZXIgbWF5CisgICAgKiBjaGFuZ2UgdGhlbSBpZiBwcm9ncmFtIGlzIHRyYW5zbGF0ZWQgaW50byBhIGhhcmR3YXJlIHByb2dyYW0uCisgICAgKi8KKyAgIHN0YXRlLT5wcm9nLT5OdW1OYXRpdmVJbnN0cnVjdGlvbnMgPSBzdGF0ZS0+cHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOworICAgc3RhdGUtPnByb2ctPk51bU5hdGl2ZVRlbXBvcmFyaWVzID0gc3RhdGUtPnByb2ctPk51bVRlbXBvcmFyaWVzOworICAgc3RhdGUtPnByb2ctPk51bU5hdGl2ZVBhcmFtZXRlcnMgPSBzdGF0ZS0+cHJvZy0+TnVtUGFyYW1ldGVyczsKKyAgIHN0YXRlLT5wcm9nLT5OdW1OYXRpdmVBdHRyaWJ1dGVzID0gc3RhdGUtPnByb2ctPk51bUF0dHJpYnV0ZXM7CisgICBzdGF0ZS0+cHJvZy0+TnVtTmF0aXZlQWRkcmVzc1JlZ3MgPSBzdGF0ZS0+cHJvZy0+TnVtQWRkcmVzc1JlZ3M7CisKKyAgIHJlc3VsdCA9IEdMX1RSVUU7CisKK2Vycm9yOgorICAgZm9yIChpbnN0ID0gc3RhdGUtPmluc3RfaGVhZDsgaW5zdCAhPSBOVUxMOyBpbnN0ID0gdGVtcCkgeworICAgICAgdGVtcCA9IGluc3QtPm5leHQ7CisgICAgICBmcmVlKGluc3QpOworICAgfQorCisgICBzdGF0ZS0+aW5zdF9oZWFkID0gTlVMTDsKKyAgIHN0YXRlLT5pbnN0X3RhaWwgPSBOVUxMOworCisgICBmb3IgKHN5bSA9IHN0YXRlLT5zeW07IHN5bSAhPSBOVUxMOyBzeW0gPSB0ZW1wKSB7CisgICAgICB0ZW1wID0gc3ltLT5uZXh0OworCisgICAgICBmcmVlKCh2b2lkICopIHN5bS0+bmFtZSk7CisgICAgICBmcmVlKHN5bSk7CisgICB9CisgICBzdGF0ZS0+c3ltID0gTlVMTDsKKworICAgX21lc2Ffc3ltYm9sX3RhYmxlX2R0b3Ioc3RhdGUtPnN0KTsKKyAgIHN0YXRlLT5zdCA9IE5VTEw7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW1fcGFyc2VfZXh0cmEuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZV9leHRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTM2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3Byb2dyYW1fcGFyc2VfZXh0cmEuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgInByb2dfaW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJwcm9ncmFtX3BhcnNlci5oIgorCisKKy8qKgorICogRXh0cmEgYXNzZW1ibHktbGV2ZWwgcGFyc2VyIHJvdXRpbmVzCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworCitpbnQKK19tZXNhX3BhcnNlX2luc3RydWN0aW9uX3N1ZmZpeChjb25zdCBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgY29uc3QgY2hhciAqc3VmZml4LAorCQkJICAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KQoreworICAgaW5zdC0+Q29uZFVwZGF0ZSA9IDA7CisgICBpbnN0LT5Db25kRHN0ID0gMDsKKyAgIGluc3QtPlNhdHVyYXRlTW9kZSA9IFNBVFVSQVRFX09GRjsKKyAgIGluc3QtPlByZWNpc2lvbiA9IEZMT0FUMzI7CisKKworICAgLyogVGhlIGZpcnN0IHBvc3NpYmxlIHN1ZmZpeCBlbGVtZW50IGlzIHRoZSBwcmVjaXNpb24gc3BlY2lmaWVyIGZyb20KKyAgICAqIE5WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uLgorICAgICovCisgICBpZiAoc3RhdGUtPm9wdGlvbi5OVl9mcmFnbWVudCkgeworICAgICAgc3dpdGNoIChzdWZmaXhbMF0pIHsKKyAgICAgIGNhc2UgJ0gnOgorCSBpbnN0LT5QcmVjaXNpb24gPSBGTE9BVDE2OworCSBzdWZmaXgrKzsKKwkgYnJlYWs7CisgICAgICBjYXNlICdSJzoKKwkgaW5zdC0+UHJlY2lzaW9uID0gRkxPQVQzMjsKKwkgc3VmZml4Kys7CisJIGJyZWFrOworICAgICAgY2FzZSAnWCc6CisJIGluc3QtPlByZWNpc2lvbiA9IEZJWEVEMTI7CisJIHN1ZmZpeCsrOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGJyZWFrOworICAgICAgfQorICAgfQorCisgICAvKiBUaGUgbmV4dCBwb3NzaWJsZSBzdWZmaXggZWxlbWVudCBpcyB0aGUgY29uZGl0aW9uIGNvZGUgbW9kaWZpZXIgc2VsZWN0aW9uCisgICAgKiBmcm9tIE5WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uLgorICAgICovCisgICBpZiAoc3RhdGUtPm9wdGlvbi5OVl9mcmFnbWVudCkgeworICAgICAgaWYgKHN1ZmZpeFswXSA9PSAnQycpIHsKKwkgaW5zdC0+Q29uZFVwZGF0ZSA9IDE7CisJIHN1ZmZpeCsrOworICAgICAgfQorICAgfQorCisKKyAgIC8qIFRoZSBmaW5hbCBwb3NzaWJsZSBzdWZmaXggZWxlbWVudCBpcyB0aGUgc2F0dXJhdGlvbiBzZWxlY3RvciBmcm9tCisgICAgKiBBUkJfZnJhZ21lbnRfcHJvZ3JhbS4KKyAgICAqLworICAgaWYgKHN0YXRlLT5tb2RlID09IEFSQl9mcmFnbWVudCkgeworICAgICAgaWYgKHN0cmNtcChzdWZmaXgsICJfU0FUIikgPT0gMCkgeworCSBpbnN0LT5TYXR1cmF0ZU1vZGUgPSBTQVRVUkFURV9aRVJPX09ORTsKKwkgc3VmZml4ICs9IDQ7CisgICAgICB9CisgICB9CisKKworICAgLyogSXQgaXMgYW4gZXJyb3IgZm9yIGFsbCBvZiB0aGUgc3VmZml4IHN0cmluZyBub3QgdG8gYmUgY29uc3VtZWQuCisgICAgKi8KKyAgIHJldHVybiBzdWZmaXhbMF0gPT0gJ1wwJzsKK30KKworCitpbnQKK19tZXNhX3BhcnNlX2NjKGNvbnN0IGNoYXIgKnMpCit7CisgICBpbnQgY29uZCA9IDA7CisKKyAgIHN3aXRjaCAoc1swXSkgeworICAgY2FzZSAnRSc6CisgICAgICBpZiAoc1sxXSA9PSAnUScpIHsKKwkgY29uZCA9IENPTkRfRVE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSAnRic6CisgICAgICBpZiAoc1sxXSA9PSAnTCcpIHsKKwkgY29uZCA9IENPTkRfRkw7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSAnRyc6CisgICAgICBpZiAoc1sxXSA9PSAnRScpIHsKKwkgY29uZCA9IENPTkRfR0U7CisgICAgICB9IGVsc2UgaWYgKHNbMV0gPT0gJ1QnKSB7CisJIGNvbmQgPSBDT05EX0dUOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgJ0wnOgorICAgICAgaWYgKHNbMV0gPT0gJ0UnKSB7CisJIGNvbmQgPSBDT05EX0xFOworICAgICAgfSBlbHNlIGlmIChzWzFdID09ICdUJykgeworCSBjb25kID0gQ09ORF9MVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlICdOJzoKKyAgICAgIGlmIChzWzFdID09ICdFJykgeworCSBjb25kID0gQ09ORF9ORTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlICdUJzoKKyAgICAgIGlmIChzWzFdID09ICdSJykgeworCSBjb25kID0gQ09ORF9UUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiAoKGNvbmQgPT0gMCkgfHwgKHNbMl0gIT0gJ1wwJykpID8gMCA6IGNvbmQ7Cit9CisKKworaW50CitfbWVzYV9BUkJ2cF9wYXJzZV9vcHRpb24oc3RydWN0IGFzbV9wYXJzZXJfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpvcHRpb24pCit7CisgICBpZiAoc3RyY21wKG9wdGlvbiwgIkFSQl9wb3NpdGlvbl9pbnZhcmlhbnQiKSA9PSAwKSB7CisgICAgICBzdGF0ZS0+b3B0aW9uLlBvc2l0aW9uSW52YXJpYW50ID0gMTsKKyAgICAgIHJldHVybiAxOworICAgfQorCisgICByZXR1cm4gMDsKK30KKworCitpbnQKK19tZXNhX0FSQmZwX3BhcnNlX29wdGlvbihzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sKKyAgIC8qIEFsbCBvZiB0aGUgb3B0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIHN0YXJ0IHdpdGggIkFSQl8iLiAgVGhlIGNvZGUgaXMKKyAgICAqIGN1cnJlbnRseSBzdHJ1Y3R1cmVkIHdpdGggbmVzdGVkIGlmLXN0YXRlbWVudHMgYmVjYXVzZSBldmVudHVhbGx5IG9wdGlvbnMKKyAgICAqIHRoYXQgc3RhcnQgd2l0aCAiTlZfIiB3aWxsIGJlIHN1cHBvcnRlZC4gIFRoaXMgc3RydWN0dXJlIHdpbGwgcmVzdWx0IGluCisgICAgKiBsZXNzIGNodXJuIHdoZW4gdGhvc2Ugb3B0aW9ucyBhcmUgYWRkZWQuCisgICAgKi8KKyAgIGlmIChzdHJuY21wKG9wdGlvbiwgIkFSQl8iLCA0KSA9PSAwKSB7CisgICAgICAvKiBBZHZhbmNlIHRoZSBwb2ludGVyIHBhc3QgdGhlICJBUkJfIiBwcmVmaXguCisgICAgICAgKi8KKyAgICAgIG9wdGlvbiArPSA0OworCisKKyAgICAgIGlmIChzdHJuY21wKG9wdGlvbiwgImZvZ18iLCA0KSA9PSAwKSB7CisJIG9wdGlvbiArPSA0OworCisJIGlmIChzdGF0ZS0+b3B0aW9uLkZvZyA9PSBPUFRJT05fTk9ORSkgeworCSAgICBpZiAoc3RyY21wKG9wdGlvbiwgImV4cCIpID09IDApIHsKKwkgICAgICAgc3RhdGUtPm9wdGlvbi5Gb2cgPSBPUFRJT05fRk9HX0VYUDsKKwkgICAgICAgcmV0dXJuIDE7CisJICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGlvbiwgImV4cDIiKSA9PSAwKSB7CisJICAgICAgIHN0YXRlLT5vcHRpb24uRm9nID0gT1BUSU9OX0ZPR19FWFAyOworCSAgICAgICByZXR1cm4gMTsKKwkgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0aW9uLCAibGluZWFyIikgPT0gMCkgeworCSAgICAgICBzdGF0ZS0+b3B0aW9uLkZvZyA9IE9QVElPTl9GT0dfTElORUFSOworCSAgICAgICByZXR1cm4gMTsKKwkgICAgfQorCSB9CisKKwkgcmV0dXJuIDA7CisgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3B0aW9uLCAicHJlY2lzaW9uX2hpbnRfIiwgMTUpID09IDApIHsKKwkgb3B0aW9uICs9IDE1OworCisgICAgICAgICAvKiBUaGUgQVJCX2ZyYWdtZW50X3Byb2dyYW0gc3BlYywgMy4xMS40LjUuMiBzYXlzOgorICAgICAgICAgICoKKyAgICAgICAgICAqICJPbmx5IG9uZSBwcmVjaXNpb24gY29udHJvbCBvcHRpb24gbWF5IGJlIHNwZWNpZmllZCBieSBhbnkgZ2l2ZW4KKyAgICAgICAgICAqIGZyYWdtZW50IHByb2dyYW0uICBBIGZyYWdtZW50IHByb2dyYW0gdGhhdCBzcGVjaWZpZXMgYm90aCB0aGUKKyAgICAgICAgICAqICJBUkJfcHJlY2lzaW9uX2hpbnRfZmFzdGVzdCIgYW5kICJBUkJfcHJlY2lzaW9uX2hpbnRfbmljZXN0IgorICAgICAgICAgICogcHJvZ3JhbSBvcHRpb25zIHdpbGwgZmFpbCB0byBsb2FkLgorICAgICAgICAgICovCisKKyAgICAgICAgIGlmIChzdHJjbXAob3B0aW9uLCAibmljZXN0IikgPT0gMCAmJiBzdGF0ZS0+b3B0aW9uLlByZWNpc2lvbkhpbnQgIT0gT1BUSU9OX0ZBU1RFU1QpIHsKKyAgICAgICAgICAgIHN0YXRlLT5vcHRpb24uUHJlY2lzaW9uSGludCA9IE9QVElPTl9OSUNFU1Q7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGlvbiwgImZhc3Rlc3QiKSA9PSAwICYmIHN0YXRlLT5vcHRpb24uUHJlY2lzaW9uSGludCAhPSBPUFRJT05fTklDRVNUKSB7CisgICAgICAgICAgICBzdGF0ZS0+b3B0aW9uLlByZWNpc2lvbkhpbnQgPSBPUFRJT05fRkFTVEVTVDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorCisJIHJldHVybiAwOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0aW9uLCAiZHJhd19idWZmZXJzIikgPT0gMCkgeworCSAvKiBEb24ndCBuZWVkIHRvIGNoZWNrIGV4dGVuc2lvbiBhdmFpbGFiaWxpdHkgYmVjYXVzZSBhbGwgTWVzYS1iYXNlZAorCSAgKiBkcml2ZXJzIHN1cHBvcnQgR0xfQVJCX2RyYXdfYnVmZmVycy4KKwkgICovCisJIHN0YXRlLT5vcHRpb24uRHJhd0J1ZmZlcnMgPSAxOworCSByZXR1cm4gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGlvbiwgImZyYWdtZW50X3Byb2dyYW1fc2hhZG93IikgPT0gMCkgeworCSBpZiAoc3RhdGUtPmN0eC0+RXh0ZW5zaW9ucy5BUkJfZnJhZ21lbnRfcHJvZ3JhbV9zaGFkb3cpIHsKKwkgICAgc3RhdGUtPm9wdGlvbi5TaGFkb3cgPSAxOworCSAgICByZXR1cm4gMTsKKwkgfQorICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG9wdGlvbiwgImZyYWdtZW50X2Nvb3JkXyIsIDE1KSA9PSAwKSB7CisgICAgICAgICBvcHRpb24gKz0gMTU7CisgICAgICAgICBpZiAoc3RhdGUtPmN0eC0+RXh0ZW5zaW9ucy5BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAob3B0aW9uLCAib3JpZ2luX3VwcGVyX2xlZnQiKSA9PSAwKSB7CisgICAgICAgICAgICAgICBzdGF0ZS0+b3B0aW9uLk9yaWdpblVwcGVyTGVmdCA9IDE7CisgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChvcHRpb24sICJwaXhlbF9jZW50ZXJfaW50ZWdlciIpID09IDApIHsKKyAgICAgICAgICAgICAgIHN0YXRlLT5vcHRpb24uUGl4ZWxDZW50ZXJJbnRlZ2VyID0gMTsKKyAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfSBlbHNlIGlmIChzdHJuY21wKG9wdGlvbiwgIkFUSV8iLCA0KSA9PSAwKSB7CisgICAgICBvcHRpb24gKz0gNDsKKworICAgICAgaWYgKHN0cmNtcChvcHRpb24sICJkcmF3X2J1ZmZlcnMiKSA9PSAwKSB7CisJIC8qIERvbid0IG5lZWQgdG8gY2hlY2sgZXh0ZW5zaW9uIGF2YWlsYWJpbGl0eSBiZWNhdXNlIGFsbCBNZXNhLWJhc2VkCisJICAqIGRyaXZlcnMgc3VwcG9ydCBHTF9BVElfZHJhd19idWZmZXJzLgorCSAgKi8KKwkgc3RhdGUtPm9wdGlvbi5EcmF3QnVmZmVycyA9IDE7CisJIHJldHVybiAxOworICAgICAgfQorICAgfSBlbHNlIGlmIChzdHJuY21wKG9wdGlvbiwgIk5WX2ZyYWdtZW50X3Byb2dyYW0iLCAxOSkgPT0gMCkgeworICAgICAgb3B0aW9uICs9IDE5OworCisgICAgICAvKiBPdGhlciBOVl9mcmFnbWVudF9wcm9ncmFtIHN0cmluZ3MgbWF5IGJlIHN1cHBvcnRlZCBsYXRlci4KKyAgICAgICAqLworICAgICAgaWYgKG9wdGlvblswXSA9PSAnXDAnKSB7CisJIGlmIChzdGF0ZS0+Y3R4LT5FeHRlbnNpb25zLk5WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uKSB7CisJICAgIHN0YXRlLT5vcHRpb24uTlZfZnJhZ21lbnQgPSAxOworCSAgICByZXR1cm4gMTsKKwkgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZXIuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbV9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM2NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9ncmFtX3BhcnNlci5oCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAibWFpbi9jb25maWcuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiCisKK3N0cnVjdCBnbF9jb250ZXh0OworCitlbnVtIGFzbV90eXBlIHsKKyAgIGF0X25vbmUsCisgICBhdF9hZGRyZXNzLAorICAgYXRfYXR0cmliLAorICAgYXRfcGFyYW0sCisgICBhdF90ZW1wLAorICAgYXRfb3V0cHV0Cit9OworCitzdHJ1Y3QgYXNtX3N5bWJvbCB7CisgICBzdHJ1Y3QgYXNtX3N5bWJvbCAqbmV4dDsgICAgLyoqPCBMaXN0IGxpbmthZ2UgZm9yIGZyZWVpbmcuICovCisgICBjb25zdCBjaGFyICpuYW1lOworICAgZW51bSBhc21fdHlwZSB0eXBlOworICAgdW5zaWduZWQgYXR0cmliX2JpbmRpbmc7CisgICB1bnNpZ25lZCBvdXRwdXRfYmluZGluZzsgICAvKio8IE91dHB1dCAvIHJlc3VsdCByZWdpc3RlciBudW1iZXIuICovCisKKyAgIC8qKgorICAgICogT25lIG9mIFBST0dSQU1fU1RBVEVfVkFSIG9yIFBST0dSQU1fQ09OU1RBTlQuCisgICAgKi8KKyAgIHVuc2lnbmVkIHBhcmFtX2JpbmRpbmdfdHlwZTsKKworICAgLyoqIAorICAgICogT2Zmc2V0IGludG8gdGhlIHByb2dyYW1fcGFyYW1ldGVyX2xpc3Qgd2hlcmUgdGhlIHRva2VucyByZXByZXNlbnRpbmcgb3VyCisgICAgKiBib3VuZCBzdGF0ZSAob3IgY29uc3RhbnRzKSBzdGFydC4KKyAgICAqLworICAgdW5zaWduZWQgcGFyYW1fYmluZGluZ19iZWdpbjsKKworICAgLyoqCisgICAgKiBDb25zdGFudHMgcHV0IGludG8gdGhlIHBhcmFtZXRlciBsaXN0IG1heSBiZSBzd2l6emxlZC4gIFRoaXMKKyAgICAqIGZpZWxkIGNvbnRhaW4ncyB0aGUgc3ltYm9sJ3Mgc3dpenpsZS4gKFNXSVpaTEVfWC9ZL1ovVykKKyAgICAqLworICAgdW5zaWduZWQgcGFyYW1fYmluZGluZ19zd2l6emxlOworCisgICAvKiBUaGlzIGlzIGhvdyBtYW55IGVudHJpZXMgaW4gdGhlIHByb2dyYW1fcGFyYW1ldGVyX2xpc3Qgd2UgdGFrZSB1cAorICAgICogd2l0aCBvdXIgc3RhdGUgdG9rZW5zIG9yIGNvbnN0YW50cy4gTm90ZSB0aGF0IHRoaXMgaXMgX25vdF8gdGhlIHNhbWUgYXMKKyAgICAqIHRoZSBudW1iZXIgb2YgcGFyYW0gcmVnaXN0ZXJzIHdlIGV2ZW50dWFsbHkgdXNlLgorICAgICovCisgICB1bnNpZ25lZCBwYXJhbV9iaW5kaW5nX2xlbmd0aDsKKworICAgLyoqCisgICAgKiBJbmRleCBvZiB0aGUgdGVtcCByZWdpc3RlciBhc3NpZ25lZCB0byB0aGlzIHZhcmlhYmxlLgorICAgICovCisgICB1bnNpZ25lZCB0ZW1wX2JpbmRpbmc7CisKKyAgIC8qKgorICAgICogRmxhZyB3aGV0aGVyIG9yIG5vdCBhIFBBUkFNIGlzIGFuIGFycmF5CisgICAgKi8KKyAgIHVuc2lnbmVkIHBhcmFtX2lzX2FycmF5OjE7CisKKworICAgLyoqCisgICAgKiBGbGFnIHdoZXRoZXIgb3Igbm90IGEgUEFSQU0gYXJyYXkgaXMgYWNjZXNzZWQgaW5kaXJlY3RseQorICAgICovCisgICB1bnNpZ25lZCBwYXJhbV9hY2Nlc3NlZF9pbmRpcmVjdGx5OjE7CisKKworICAgLyoqCisgICAgKiBcYnJpZWYgSXMgZmlyc3QgcGFzcyBvZiBwYXJhbWV0ZXIgbGF5b3V0IGRvbmUgd2l0aCB0aGlzIHZhcmlhYmxlPworICAgICoKKyAgICAqIFRoZSBwYXJhbWV0ZXIgbGF5b3V0IHJvdXRpbmUgb3BlcmF0ZXMgaW4gdHdvIHBhc3Nlcy4gIFRoaXMgZmxhZyB0cmFja3MKKyAgICAqIHdoZXRoZXIgb3Igbm90IHRoZSBmaXJzdCBwYXNzIGhhcyBoYW5kbGVkIHRoaXMgdmFyaWFibGUuCisgICAgKgorICAgICogXHNhIF9tZXNhX2xheW91dF9wYXJhbWV0ZXJzCisgICAgKi8KKyAgIHVuc2lnbmVkIHBhc3MxX2RvbmU6MTsKK307CisKKworc3RydWN0IGFzbV92ZWN0b3IgeworICAgdW5zaWduZWQgY291bnQ7CisgICBnbF9jb25zdGFudF92YWx1ZSBkYXRhWzRdOworfTsKKworCitzdHJ1Y3QgYXNtX3N3aXp6bGVfbWFzayB7CisgICB1bnNpZ25lZCBzd2l6emxlOjEyOworICAgdW5zaWduZWQgbWFzazo0OworfTsKKworCitzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciB7CisgICBzdHJ1Y3QgcHJvZ19zcmNfcmVnaXN0ZXIgQmFzZTsKKworICAgLyoqCisgICAgKiBTeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGluZGlyZWN0IGFjY2VzcyB0byBwYXJhbWV0ZXIgYXJyYXlzLgorICAgICoKKyAgICAqIElmIFxjIEJhc2U6OlJlbEFkZHIgaXMgMSwgdGhpcyB3aWxsIHBvaW50IHRvIHRoZSBzeW1ib2wgZm9yIHRoZSBwYXJhbWV0ZXIKKyAgICAqIHRoYXQgaXMgYmVpbmcgZGVyZWZlcmVuY2VkLiAgRnVydGhlciwgXGMgQmFzZTo6SW5kZXggd2lsbCBiZSB0aGUgb2Zmc2V0CisgICAgKiBmcm9tIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIGJlaW5nIHVzZWQuCisgICAgKi8KKyAgIHN0cnVjdCBhc21fc3ltYm9sICpTeW1ib2w7Cit9OworCisKK3N0cnVjdCBhc21faW5zdHJ1Y3Rpb24geworICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gQmFzZTsKKyAgIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKm5leHQ7CisgICBzdHJ1Y3QgYXNtX3NyY19yZWdpc3RlciBTcmNSZWdbM107Cit9OworCisKK3N0cnVjdCBhc21fcGFyc2VyX3N0YXRlIHsKKyAgIHN0cnVjdCBnbF9jb250ZXh0ICpjdHg7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZzsKKworICAgLyoqCisgICAgKiBQZXItcHJvZ3JhbSB0YXJnZXQgbGltaXRzCisgICAgKi8KKyAgIHN0cnVjdCBnbF9wcm9ncmFtX2NvbnN0YW50cyAqbGltaXRzOworCisgICBzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlICpzdDsKKworICAgLyoqCisgICAgKiBMaW5rZWQgbGlzdCBvZiBzeW1ib2xzCisgICAgKgorICAgICogVGhpcyBsaXN0IGlzIFxiIG9ubHkgdXNlZCB3aGVuIGNsZWFuaW5nIHVwIGNvbXBpbGVyIHN0YXRlIGFuZCBmcmVlaW5nCisgICAgKiBtZW1vcnkuCisgICAgKi8KKyAgIHN0cnVjdCBhc21fc3ltYm9sICpzeW07CisKKyAgIC8qKgorICAgICogU3RhdGUgZm9yIHRoZSBsZXhlci4KKyAgICAqLworICAgdm9pZCAqc2Nhbm5lcjsKKworICAgLyoqCisgICAgKiBMaW5rZWQgbGlzdCBvZiBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIGR1cmluZyBwYXJzaW5nLgorICAgICovCisgICAvKkB7Ki8KKyAgIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKmluc3RfaGVhZDsKKyAgIHN0cnVjdCBhc21faW5zdHJ1Y3Rpb24gKmluc3RfdGFpbDsKKyAgIC8qQH0qLworCisKKyAgIC8qKgorICAgICogU2VsZWN0ZWQgbGltaXRzIGNvcGllZCBmcm9tIGdsX2NvbnN0YW50cworICAgICoKKyAgICAqIFRoZXNlIGFyZSBsaW1pdHMgZnJvbSB0aGUgR0wgY29udGV4dCwgYnV0IHZhcmlvdXMgYml0cyBpbiB0aGUgcHJvZ3JhbQorICAgICogbXVzdCBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGVzZSB2YWx1ZXMuCisgICAgKi8KKyAgIC8qQHsqLworICAgdW5zaWduZWQgTWF4VGV4dHVyZUNvb3JkVW5pdHM7CisgICB1bnNpZ25lZCBNYXhUZXh0dXJlSW1hZ2VVbml0czsKKyAgIHVuc2lnbmVkIE1heFRleHR1cmVVbml0czsKKyAgIHVuc2lnbmVkIE1heENsaXBQbGFuZXM7CisgICB1bnNpZ25lZCBNYXhMaWdodHM7CisgICB1bnNpZ25lZCBNYXhQcm9ncmFtTWF0cmljZXM7CisgICB1bnNpZ25lZCBNYXhEcmF3QnVmZmVyczsKKyAgIC8qQH0qLworCisgICAvKioKKyAgICAqIFZhbHVlIHRvIHVzZSBpbiBzdGF0ZSB2ZWN0b3IgYWNjZXNzb3JzIGZvciBlbnZpcm9ubWVudCBhbmQgbG9jYWwKKyAgICAqIHBhcmFtZXRlcnMKKyAgICAqLworICAgdW5zaWduZWQgc3RhdGVfcGFyYW1fZW51bTsKKworCisgICAvKioKKyAgICAqIElucHV0IGF0dHJpYnV0ZXMgYm91bmQgdG8gc3BlY2lmaWMgbmFtZXMKKyAgICAqCisgICAgKiBUaGlzIGlzIG9ubHkgbmVlZGVkIHNvIHRoYXQgZXJyb3JzIGNhbiBiZSBwcm9wZXJseSBwcm9kdWNlZCB3aGVuCisgICAgKiBtdWx0aXBsZSBBVFRSSUIgc3RhdGVtZW50cyBiaW5kIGlsbGVnYWwgY29tYmluYXRpb25zIG9mIHZlcnRleAorICAgICogYXR0cmlidXRlcy4KKyAgICAqLworICAgR0xiaXRmaWVsZDY0IElucHV0c0JvdW5kOworCisgICBlbnVtIHsKKyAgICAgIGludmFsaWRfbW9kZSA9IDAsCisgICAgICBBUkJfdmVydGV4LAorICAgICAgQVJCX2ZyYWdtZW50CisgICB9IG1vZGU7CisKKyAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBQb3NpdGlvbkludmFyaWFudDoxOworICAgICAgdW5zaWduZWQgRm9nOjI7CisgICAgICB1bnNpZ25lZCBQcmVjaXNpb25IaW50OjI7CisgICAgICB1bnNpZ25lZCBEcmF3QnVmZmVyczoxOworICAgICAgdW5zaWduZWQgU2hhZG93OjE7CisgICAgICB1bnNpZ25lZCBUZXhSZWN0OjE7CisgICAgICB1bnNpZ25lZCBUZXhBcnJheToxOworICAgICAgdW5zaWduZWQgTlZfZnJhZ21lbnQ6MTsKKyAgICAgIHVuc2lnbmVkIE9yaWdpblVwcGVyTGVmdDoxOworICAgICAgdW5zaWduZWQgUGl4ZWxDZW50ZXJJbnRlZ2VyOjE7CisgICB9IG9wdGlvbjsKKworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIFVzZXNLaWxsOjE7CisgICAgICB1bnNpZ25lZCBVc2VzREZkeToxOworICAgfSBmcmFnbWVudDsKK307CisKKyNkZWZpbmUgT1BUSU9OX05PTkUgICAgICAgIDAKKyNkZWZpbmUgT1BUSU9OX0ZPR19FWFAgICAgIDEKKyNkZWZpbmUgT1BUSU9OX0ZPR19FWFAyICAgIDIKKyNkZWZpbmUgT1BUSU9OX0ZPR19MSU5FQVIgIDMKKyNkZWZpbmUgT1BUSU9OX05JQ0VTVCAgICAgIDEKKyNkZWZpbmUgT1BUSU9OX0ZBU1RFU1QgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgWVlMVFlQRSB7CisgICBpbnQgZmlyc3RfbGluZTsKKyAgIGludCBmaXJzdF9jb2x1bW47CisgICBpbnQgbGFzdF9saW5lOworICAgaW50IGxhc3RfY29sdW1uOworICAgaW50IHBvc2l0aW9uOworfSBZWUxUWVBFOworCisjZGVmaW5lIFlZTFRZUEVfSVNfREVDTEFSRUQgMQorI2RlZmluZSBZWUxUWVBFX0lTX1RSSVZJQUwgMQorCisKK2V4dGVybiBHTGJvb2xlYW4gX21lc2FfcGFyc2VfYXJiX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0xlbnVtIHRhcmdldCwKKyAgICBjb25zdCBHTHVieXRlICpzdHIsIEdMc2l6ZWkgbGVuLCBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUpOworCisKKworLyogRnJvbSBwcm9ncmFtX2xleGVyLmwuICovCitleHRlcm4gdm9pZCBfbWVzYV9wcm9ncmFtX2xleGVyX2R0b3Iodm9pZCAqc2Nhbm5lcik7CisKK2V4dGVybiB2b2lkIF9tZXNhX3Byb2dyYW1fbGV4ZXJfY3Rvcih2b2lkICoqc2Nhbm5lciwKKyAgICBzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZywgc2l6ZV90IGxlbik7CisKKworLyoqCisgKlxuYW1lIEZyb20gcHJvZ3JhbV9wYXJzZV9leHRyYS5jCisgKi8KKy8qQHsqLworCisvKioKKyAqIFBhcnNlcyBhbmQgcHJvY2Vzc2VzIGFuIG9wdGlvbiBzdHJpbmcgdG8gYW4gQVJCIHZlcnRleCBwcm9ncmFtCisgKgorICogXHJldHVybgorICogTm9uLXplcm8gb24gc3VjY2VzcywgemVybyBvbiBmYWlsdXJlLgorICovCitleHRlcm4gaW50IF9tZXNhX0FSQnZwX3BhcnNlX29wdGlvbihzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsCisgICAgY29uc3QgY2hhciAqb3B0aW9uKTsKKworLyoqCisgKiBQYXJzZXMgYW5kIHByb2Nlc3NlcyBhbiBvcHRpb24gc3RyaW5nIHRvIGFuIEFSQiBmcmFnbWVudCBwcm9ncmFtCisgKgorICogXHJldHVybgorICogTm9uLXplcm8gb24gc3VjY2VzcywgemVybyBvbiBmYWlsdXJlLgorICovCitleHRlcm4gaW50IF9tZXNhX0FSQmZwX3BhcnNlX29wdGlvbihzdHJ1Y3QgYXNtX3BhcnNlcl9zdGF0ZSAqc3RhdGUsCisgICAgY29uc3QgY2hhciAqb3B0aW9uKTsKKworLyoqCisgKiBQYXJzZXMgYW5kIHByb2Nlc3NlcyBpbnN0cnVjdGlvbiBzdWZmaXhlcworICoKKyAqIEluc3RydWN0aW9uIHN1ZmZpeGVzLCBzdWNoIGFzIFxjIF9TQVQsIGFyZSBwcm9jZXNzZWQuICBUaGUgcmVsZXZhbnQgYml0cworICogYXJlIHNldCBpbiBcYyBpbnN0LiAgSWYgc3VmZml4ZXMgYXJlIGVuY291bnRlcmVkIHRoYXQgYXJlIGVpdGhlciBub3Qga25vd24KKyAqIG9yIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1vZGVzIGFuZCBvcHRpb25zIHNldCBpbiBcYyBzdGF0ZSwgemVybyB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBccmV0dXJuCisgKiBOb24temVybyBvbiBzdWNjZXNzLCB6ZXJvIG9uIGZhaWx1cmUuCisgKi8KK2V4dGVybiBpbnQgX21lc2FfcGFyc2VfaW5zdHJ1Y3Rpb25fc3VmZml4KGNvbnN0IHN0cnVjdCBhc21fcGFyc2VyX3N0YXRlICpzdGF0ZSwKKyAgICBjb25zdCBjaGFyICpzdWZmaXgsIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0KTsKKworLyoqCisgKiBQYXJzZXMgYSBjb25kaXRpb24gY29kZSBuYW1lCisgKgorICogVGhlIGNvbmRpdGlvbiBjb2RlIG5hbWVzIChlLmcuLCBcYyBMVCwgXGMgR1QsIFxjIE5FKSB3ZXJlIGFkZGVkIHRvIGFzc2VtYmx5CisgKiBzaGFkZXJzIHdpdGggdGhlIFxjIEdMX05WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uIGV4dGVuc2lvbi4gIFRoaXMgZnVuY3Rpb24KKyAqIGNvbnZlcnRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gb25lIG9mIHRoZSBcYyBDT05EXyBtYWNyb3MuCisgKgorICogXHJldHVybgorICogT25lIG9mIHRoZSBcYyBDT05EXyBtYWNyb3MgZGVmaW5lZCBpbiBwcm9nX2luc3RydWN0aW9uLmggb24gc3VjY2VzcyBvciB6ZXJvCisgKiBvbiBmYWlsdXJlLgorICovCitleHRlcm4gaW50IF9tZXNhX3BhcnNlX2NjKGNvbnN0IGNoYXIgKnMpOworCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbW9wdC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9ncmFtb3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhODgzMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbW9wdC5jCkBAIC0wLDAgKzEsNjgyIEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgIHByb2dyYW1vcHQuYyAKKyAqIFZlcnRleC9GcmFnbWVudCBwcm9ncmFtIG9wdGltaXphdGlvbnMgYW5kIHRyYW5zZm9ybWF0aW9ucyBmb3IgcHJvZ3JhbQorICogb3B0aW9ucywgZXRjLgorICoKKyAqIFxhdXRob3IgQnJpYW4gUGF1bAorICovCisKKworI2luY2x1ZGUgIm1haW4vZ2xoZWFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2NvbnRleHQuaCIKKyNpbmNsdWRlICJwcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgInByb2dfc3RhdGV2YXJzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS5oIgorI2luY2x1ZGUgInByb2dyYW1vcHQuaCIKKyNpbmNsdWRlICJwcm9nX2luc3RydWN0aW9uLmgiCisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluc2VydHMgaW5zdHJ1Y3Rpb25zIGZvciBjb29yZGluYXRlIG1vZGVsdmlldyAqIHByb2plY3Rpb24KKyAqIGludG8gYSB2ZXJ0ZXggcHJvZ3JhbS4KKyAqIE1heSBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgcG9zaXRpb25faW52YXJpYW50IG9wdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK19tZXNhX2luc2VydF9tdnBfZHA0X2NvZGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICp2cHJvZykKK3sKKyAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpuZXdJbnN0OworICAgY29uc3QgR0x1aW50IG9yaWdMZW4gPSB2cHJvZy0+QmFzZS5OdW1JbnN0cnVjdGlvbnM7CisgICBjb25zdCBHTHVpbnQgbmV3TGVuID0gb3JpZ0xlbiArIDQ7CisgICBHTHVpbnQgaTsKKworICAgLyoKKyAgICAqIFNldHVwIHN0YXRlIHJlZmVyZW5jZXMgZm9yIHRoZSBtb2RlbHZpZXcvcHJvamVjdGlvbiBtYXRyaXguCisgICAgKiBYWFggd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZXNlIHN0YXRlIHZhcnMgYXJlIGFscmVhZHkgZGVjbGFyZWQuCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCBnbF9zdGF0ZV9pbmRleCBtdnBTdGF0ZVs0XVtTVEFURV9MRU5HVEhdID0geworICAgICAgeyBTVEFURV9NVlBfTUFUUklYLCAwLCAwLCAwLCAwIH0sICAvKiBzdGF0ZS5tYXRyaXgubXZwLnJvd1swXSAqLworICAgICAgeyBTVEFURV9NVlBfTUFUUklYLCAwLCAxLCAxLCAwIH0sICAvKiBzdGF0ZS5tYXRyaXgubXZwLnJvd1sxXSAqLworICAgICAgeyBTVEFURV9NVlBfTUFUUklYLCAwLCAyLCAyLCAwIH0sICAvKiBzdGF0ZS5tYXRyaXgubXZwLnJvd1syXSAqLworICAgICAgeyBTVEFURV9NVlBfTUFUUklYLCAwLCAzLCAzLCAwIH0sICAvKiBzdGF0ZS5tYXRyaXgubXZwLnJvd1szXSAqLworICAgfTsKKyAgIEdMaW50IG12cFJlZls0XTsKKworICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgbXZwUmVmW2ldID0gX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZSh2cHJvZy0+QmFzZS5QYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnBTdGF0ZVtpXSk7CisgICB9CisKKyAgIC8qIEFsbG9jIHN0b3JhZ2UgZm9yIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIG5ld0luc3QgPSBfbWVzYV9hbGxvY19pbnN0cnVjdGlvbnMobmV3TGVuKTsKKyAgIGlmICghbmV3SW5zdCkgeworICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLAorICAgICAgICAgICAgICAgICAgImdsUHJvZ3JhbVN0cmluZyhpbnNlcnRpbmcgcG9zaXRpb25faW52YXJpYW50IGNvZGUpIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qCisgICAgKiBHZW5lcmF0ZWQgaW5zdHJ1Y3Rpb25zOgorICAgICogbmV3SW5zdFswXSA9IERQNCByZXN1bHQucG9zaXRpb24ueCwgbXZwLnJvd1swXSwgdmVydGV4LnBvc2l0aW9uOworICAgICogbmV3SW5zdFsxXSA9IERQNCByZXN1bHQucG9zaXRpb24ueSwgbXZwLnJvd1sxXSwgdmVydGV4LnBvc2l0aW9uOworICAgICogbmV3SW5zdFsyXSA9IERQNCByZXN1bHQucG9zaXRpb24ueiwgbXZwLnJvd1syXSwgdmVydGV4LnBvc2l0aW9uOworICAgICogbmV3SW5zdFszXSA9IERQNCByZXN1bHQucG9zaXRpb24udywgbXZwLnJvd1szXSwgdmVydGV4LnBvc2l0aW9uOworICAgICovCisgICBfbWVzYV9pbml0X2luc3RydWN0aW9ucyhuZXdJbnN0LCA0KTsKKyAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIG5ld0luc3RbaV0uT3Bjb2RlID0gT1BDT0RFX0RQNDsKKyAgICAgIG5ld0luc3RbaV0uRHN0UmVnLkZpbGUgPSBQUk9HUkFNX09VVFBVVDsKKyAgICAgIG5ld0luc3RbaV0uRHN0UmVnLkluZGV4ID0gVkFSWUlOR19TTE9UX1BPUzsKKyAgICAgIG5ld0luc3RbaV0uRHN0UmVnLldyaXRlTWFzayA9IChXUklURU1BU0tfWCA8PCBpKTsKKyAgICAgIG5ld0luc3RbaV0uU3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX1NUQVRFX1ZBUjsKKyAgICAgIG5ld0luc3RbaV0uU3JjUmVnWzBdLkluZGV4ID0gbXZwUmVmW2ldOworICAgICAgbmV3SW5zdFtpXS5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgICAgIG5ld0luc3RbaV0uU3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX0lOUFVUOworICAgICAgbmV3SW5zdFtpXS5TcmNSZWdbMV0uSW5kZXggPSBWRVJUX0FUVFJJQl9QT1M7CisgICAgICBuZXdJbnN0W2ldLlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworICAgfQorCisgICAvKiBBcHBlbmQgb3JpZ2luYWwgaW5zdHJ1Y3Rpb25zIGFmdGVyIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIF9tZXNhX2NvcHlfaW5zdHJ1Y3Rpb25zIChuZXdJbnN0ICsgNCwgdnByb2ctPkJhc2UuSW5zdHJ1Y3Rpb25zLCBvcmlnTGVuKTsKKworICAgLyogZnJlZSBvbGQgaW5zdHJ1Y3Rpb25zICovCisgICBfbWVzYV9mcmVlX2luc3RydWN0aW9ucyh2cHJvZy0+QmFzZS5JbnN0cnVjdGlvbnMsIG9yaWdMZW4pOworCisgICAvKiBpbnN0YWxsIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIHZwcm9nLT5CYXNlLkluc3RydWN0aW9ucyA9IG5ld0luc3Q7CisgICB2cHJvZy0+QmFzZS5OdW1JbnN0cnVjdGlvbnMgPSBuZXdMZW47CisgICB2cHJvZy0+QmFzZS5JbnB1dHNSZWFkIHw9IFZFUlRfQklUX1BPUzsKKyAgIHZwcm9nLT5CYXNlLk91dHB1dHNXcml0dGVuIHw9IEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9QT1MpOworfQorCisKK3N0YXRpYyB2b2lkCitfbWVzYV9pbnNlcnRfbXZwX21hZF9jb2RlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqdnByb2cpCit7CisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqbmV3SW5zdDsKKyAgIGNvbnN0IEdMdWludCBvcmlnTGVuID0gdnByb2ctPkJhc2UuTnVtSW5zdHJ1Y3Rpb25zOworICAgY29uc3QgR0x1aW50IG5ld0xlbiA9IG9yaWdMZW4gKyA0OworICAgR0x1aW50IGhwb3NUZW1wOworICAgR0x1aW50IGk7CisKKyAgIC8qCisgICAgKiBTZXR1cCBzdGF0ZSByZWZlcmVuY2VzIGZvciB0aGUgbW9kZWx2aWV3L3Byb2plY3Rpb24gbWF0cml4LgorICAgICogWFhYIHdlIHNob3VsZCBjaGVjayBpZiB0aGVzZSBzdGF0ZSB2YXJzIGFyZSBhbHJlYWR5IGRlY2xhcmVkLgorICAgICovCisgICBzdGF0aWMgY29uc3QgZ2xfc3RhdGVfaW5kZXggbXZwU3RhdGVbNF1bU1RBVEVfTEVOR1RIXSA9IHsKKyAgICAgIHsgU1RBVEVfTVZQX01BVFJJWCwgMCwgMCwgMCwgU1RBVEVfTUFUUklYX1RSQU5TUE9TRSB9LAorICAgICAgeyBTVEFURV9NVlBfTUFUUklYLCAwLCAxLCAxLCBTVEFURV9NQVRSSVhfVFJBTlNQT1NFIH0sCisgICAgICB7IFNUQVRFX01WUF9NQVRSSVgsIDAsIDIsIDIsIFNUQVRFX01BVFJJWF9UUkFOU1BPU0UgfSwKKyAgICAgIHsgU1RBVEVfTVZQX01BVFJJWCwgMCwgMywgMywgU1RBVEVfTUFUUklYX1RSQU5TUE9TRSB9LAorICAgfTsKKyAgIEdMaW50IG12cFJlZls0XTsKKworICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgbXZwUmVmW2ldID0gX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZSh2cHJvZy0+QmFzZS5QYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnBTdGF0ZVtpXSk7CisgICB9CisKKyAgIC8qIEFsbG9jIHN0b3JhZ2UgZm9yIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIG5ld0luc3QgPSBfbWVzYV9hbGxvY19pbnN0cnVjdGlvbnMobmV3TGVuKTsKKyAgIGlmICghbmV3SW5zdCkgeworICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLAorICAgICAgICAgICAgICAgICAgImdsUHJvZ3JhbVN0cmluZyhpbnNlcnRpbmcgcG9zaXRpb25faW52YXJpYW50IGNvZGUpIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIFRFTVAgaHBvc1RlbXA7ICovCisgICBocG9zVGVtcCA9IHZwcm9nLT5CYXNlLk51bVRlbXBvcmFyaWVzKys7CisKKyAgIC8qCisgICAgKiBHZW5lcmF0ZWQgaW5zdHJ1Y3Rpb25zOgorICAgICogICAgZW1pdF9vcDIocCwgT1BDT0RFX01VTCwgdG1wLCAwLCBzd2l6emxlMShzcmMsWCksIG1hdFswXSk7CisgICAgKiAgICBlbWl0X29wMyhwLCBPUENPREVfTUFELCB0bXAsIDAsIHN3aXp6bGUxKHNyYyxZKSwgbWF0WzFdLCB0bXApOworICAgICogICAgZW1pdF9vcDMocCwgT1BDT0RFX01BRCwgdG1wLCAwLCBzd2l6emxlMShzcmMsWiksIG1hdFsyXSwgdG1wKTsKKyAgICAqICAgIGVtaXRfb3AzKHAsIE9QQ09ERV9NQUQsIGRlc3QsIDAsIHN3aXp6bGUxKHNyYyxXKSwgbWF0WzNdLCB0bXApOworICAgICovCisgICBfbWVzYV9pbml0X2luc3RydWN0aW9ucyhuZXdJbnN0LCA0KTsKKworICAgbmV3SW5zdFswXS5PcGNvZGUgPSBPUENPREVfTVVMOworICAgbmV3SW5zdFswXS5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworICAgbmV3SW5zdFswXS5Ec3RSZWcuSW5kZXggPSBocG9zVGVtcDsKKyAgIG5ld0luc3RbMF0uRHN0UmVnLldyaXRlTWFzayA9IFdSSVRFTUFTS19YWVpXOworICAgbmV3SW5zdFswXS5TcmNSZWdbMF0uRmlsZSA9IFBST0dSQU1fSU5QVVQ7CisgICBuZXdJbnN0WzBdLlNyY1JlZ1swXS5JbmRleCA9IFZFUlRfQVRUUklCX1BPUzsKKyAgIG5ld0luc3RbMF0uU3JjUmVnWzBdLlN3aXp6bGUgPSBTV0laWkxFX1hYWFg7CisgICBuZXdJbnN0WzBdLlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9TVEFURV9WQVI7CisgICBuZXdJbnN0WzBdLlNyY1JlZ1sxXS5JbmRleCA9IG12cFJlZlswXTsKKyAgIG5ld0luc3RbMF0uU3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisKKyAgIGZvciAoaSA9IDE7IGkgPD0gMjsgaSsrKSB7CisgICAgICBuZXdJbnN0W2ldLk9wY29kZSA9IE9QQ09ERV9NQUQ7CisgICAgICBuZXdJbnN0W2ldLkRzdFJlZy5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisgICAgICBuZXdJbnN0W2ldLkRzdFJlZy5JbmRleCA9IGhwb3NUZW1wOworICAgICAgbmV3SW5zdFtpXS5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICAgICBuZXdJbnN0W2ldLlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9JTlBVVDsKKyAgICAgIG5ld0luc3RbaV0uU3JjUmVnWzBdLkluZGV4ID0gVkVSVF9BVFRSSUJfUE9TOworICAgICAgbmV3SW5zdFtpXS5TcmNSZWdbMF0uU3dpenpsZSA9IE1BS0VfU1dJWlpMRTQoaSxpLGksaSk7CisgICAgICBuZXdJbnN0W2ldLlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9TVEFURV9WQVI7CisgICAgICBuZXdJbnN0W2ldLlNyY1JlZ1sxXS5JbmRleCA9IG12cFJlZltpXTsKKyAgICAgIG5ld0luc3RbaV0uU3JjUmVnWzFdLlN3aXp6bGUgPSBTV0laWkxFX05PT1A7CisgICAgICBuZXdJbnN0W2ldLlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisgICAgICBuZXdJbnN0W2ldLlNyY1JlZ1syXS5JbmRleCA9IGhwb3NUZW1wOworICAgICAgbmV3SW5zdFsxXS5TcmNSZWdbMl0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIH0KKworICAgbmV3SW5zdFszXS5PcGNvZGUgPSBPUENPREVfTUFEOworICAgbmV3SW5zdFszXS5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fT1VUUFVUOworICAgbmV3SW5zdFszXS5Ec3RSZWcuSW5kZXggPSBWQVJZSU5HX1NMT1RfUE9TOworICAgbmV3SW5zdFszXS5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1hZWlc7CisgICBuZXdJbnN0WzNdLlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9JTlBVVDsKKyAgIG5ld0luc3RbM10uU3JjUmVnWzBdLkluZGV4ID0gVkVSVF9BVFRSSUJfUE9TOworICAgbmV3SW5zdFszXS5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfV1dXVzsKKyAgIG5ld0luc3RbM10uU3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1NUQVRFX1ZBUjsKKyAgIG5ld0luc3RbM10uU3JjUmVnWzFdLkluZGV4ID0gbXZwUmVmWzNdOworICAgbmV3SW5zdFszXS5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIG5ld0luc3RbM10uU3JjUmVnWzJdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKyAgIG5ld0luc3RbM10uU3JjUmVnWzJdLkluZGV4ID0gaHBvc1RlbXA7CisgICBuZXdJbnN0WzNdLlNyY1JlZ1syXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworCisKKyAgIC8qIEFwcGVuZCBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgYWZ0ZXIgbmV3IGluc3RydWN0aW9ucyAqLworICAgX21lc2FfY29weV9pbnN0cnVjdGlvbnMgKG5ld0luc3QgKyA0LCB2cHJvZy0+QmFzZS5JbnN0cnVjdGlvbnMsIG9yaWdMZW4pOworCisgICAvKiBmcmVlIG9sZCBpbnN0cnVjdGlvbnMgKi8KKyAgIF9tZXNhX2ZyZWVfaW5zdHJ1Y3Rpb25zKHZwcm9nLT5CYXNlLkluc3RydWN0aW9ucywgb3JpZ0xlbik7CisKKyAgIC8qIGluc3RhbGwgbmV3IGluc3RydWN0aW9ucyAqLworICAgdnByb2ctPkJhc2UuSW5zdHJ1Y3Rpb25zID0gbmV3SW5zdDsKKyAgIHZwcm9nLT5CYXNlLk51bUluc3RydWN0aW9ucyA9IG5ld0xlbjsKKyAgIHZwcm9nLT5CYXNlLklucHV0c1JlYWQgfD0gVkVSVF9CSVRfUE9TOworICAgdnByb2ctPkJhc2UuT3V0cHV0c1dyaXR0ZW4gfD0gQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX1BPUyk7Cit9CisKKwordm9pZAorX21lc2FfaW5zZXJ0X212cF9jb2RlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqdnByb2cpCit7CisgICBpZiAoY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbTUVTQV9TSEFERVJfVkVSVEVYXS5PcHRpbWl6ZUZvckFPUykKKyAgICAgIF9tZXNhX2luc2VydF9tdnBfZHA0X2NvZGUoIGN0eCwgdnByb2cgKTsKKyAgIGVsc2UKKyAgICAgIF9tZXNhX2luc2VydF9tdnBfbWFkX2NvZGUoIGN0eCwgdnByb2cgKTsKK30KKyAgICAgIAorCisKKworCisKKy8qKgorICogQXBwZW5kIGluc3RydWN0aW9ucyB0byBpbXBsZW1lbnQgZm9nCisgKgorICogVGhlIFxjIGZyYWdtZW50LmZvZ2Nvb3JkIGlucHV0IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgZm9nIGJsZW5kIGZhY3Rvci4KKyAqCisgKiBccGFyYW0gY3R4ICAgICAgVGhlIEdMIGNvbnRleHQKKyAqIFxwYXJhbSBmcHJvZyAgICBGcmFnbWVudCBwcm9ncmFtIHRoYXQgZm9nIGluc3RydWN0aW9ucyB3aWxsIGJlIGFwcGVuZGVkIHRvLgorICogXHBhcmFtIGZvZ19tb2RlIEZvZyBtb2RlLiAgT25lIG9mIFxjIEdMX0VYUCwgXGMgR0xfRVhQMiwgb3IgXGMgR0xfTElORUFSLgorICogXHBhcmFtIHNhdHVyYXRlIFRydWUgaWYgd3JpdGVzIHRvIGNvbG9yIG91dHB1dHMgc2hvdWxkIGJlIGNsYW1wZWQgdG8gWzAsIDFdCisgKgorICogXG5vdGUKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBcYyBWQVJZSU5HX0JJVF9GT0dDIGluIFxjIGZwcm9nLT5CYXNlLklucHV0c1JlYWQuCisgKgorICogXHRvZG8gV2l0aCBhIGxpdHRsZSB3b3JrLCB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGFkYXB0ZWQgdG8gYWRkIGZvZyBjb2RlCisgKiB0byB2ZXJ0ZXggcHJvZ3JhbXMgdG9vLgorICovCit2b2lkCitfbWVzYV9hcHBlbmRfZm9nX2NvZGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwcm9nLCBHTGVudW0gZm9nX21vZGUsCisJCSAgICAgIEdMYm9vbGVhbiBzYXR1cmF0ZSkKK3sKKyAgIHN0YXRpYyBjb25zdCBnbF9zdGF0ZV9pbmRleCBmb2dQU3RhdGVPcHRbU1RBVEVfTEVOR1RIXQorICAgICAgPSB7IFNUQVRFX0lOVEVSTkFMLCBTVEFURV9GT0dfUEFSQU1TX09QVElNSVpFRCwgMCwgMCwgMCB9OworICAgc3RhdGljIGNvbnN0IGdsX3N0YXRlX2luZGV4IGZvZ0NvbG9yU3RhdGVbU1RBVEVfTEVOR1RIXQorICAgICAgPSB7IFNUQVRFX0ZPR19DT0xPUiwgMCwgMCwgMCwgMH07CisgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqbmV3SW5zdCwgKmluc3Q7CisgICBjb25zdCBHTHVpbnQgb3JpZ0xlbiA9IGZwcm9nLT5CYXNlLk51bUluc3RydWN0aW9uczsKKyAgIGNvbnN0IEdMdWludCBuZXdMZW4gPSBvcmlnTGVuICsgNTsKKyAgIEdMdWludCBpOworICAgR0xpbnQgZm9nUFJlZk9wdCwgZm9nQ29sb3JSZWY7IC8qIHN0YXRlIHJlZmVyZW5jZXMgKi8KKyAgIEdMdWludCBjb2xvclRlbXAsIGZvZ0ZhY3RvclRlbXA7IC8qIHRlbXBvcmFyeSByZWdpc3RlcnNzICovCisKKyAgIGlmIChmb2dfbW9kZSA9PSBHTF9OT05FKSB7CisgICAgICBfbWVzYV9wcm9ibGVtKGN0eCwgIl9tZXNhX2FwcGVuZF9mb2dfY29kZSgpIGNhbGxlZCBmb3IgZnJhZ21lbnQgcHJvZ3JhbSIKKyAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGZvZ19tb2RlID09IEdMX05PTkUiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKCEoZnByb2ctPkJhc2UuT3V0cHV0c1dyaXR0ZW4gJiAoMSA8PCBGUkFHX1JFU1VMVF9DT0xPUikpKSB7CisgICAgICAvKiBwcm9ncmFtIGRvZXNuJ3Qgb3V0cHV0IGNvbG9yLCBzbyBub3RoaW5nIHRvIGRvICovCisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIEFsbG9jIHN0b3JhZ2UgZm9yIG5ldyBpbnN0cnVjdGlvbnMgKi8KKyAgIG5ld0luc3QgPSBfbWVzYV9hbGxvY19pbnN0cnVjdGlvbnMobmV3TGVuKTsKKyAgIGlmICghbmV3SW5zdCkgeworICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9PVVRfT0ZfTUVNT1JZLAorICAgICAgICAgICAgICAgICAgImdsUHJvZ3JhbVN0cmluZyhpbnNlcnRpbmcgZm9nX29wdGlvbiBjb2RlKSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBDb3B5IG9yaWcgaW5zdHJ1Y3Rpb25zIGludG8gbmV3IGluc3RydWN0aW9uIGJ1ZmZlciAqLworICAgX21lc2FfY29weV9pbnN0cnVjdGlvbnMobmV3SW5zdCwgZnByb2ctPkJhc2UuSW5zdHJ1Y3Rpb25zLCBvcmlnTGVuKTsKKworICAgLyogUEFSQU0gZm9nUGFyYW1zUmVmT3B0ID0gaW50ZXJuYWwgb3B0aW1pemVkIGZvZyBwYXJhbXM7ICovCisgICBmb2dQUmVmT3B0CisgICAgICA9IF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UoZnByb2ctPkJhc2UuUGFyYW1ldGVycywgZm9nUFN0YXRlT3B0KTsKKyAgIC8qIFBBUkFNIGZvZ0NvbG9yUmVmID0gc3RhdGUuZm9nLmNvbG9yOyAqLworICAgZm9nQ29sb3JSZWYKKyAgICAgID0gX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZShmcHJvZy0+QmFzZS5QYXJhbWV0ZXJzLCBmb2dDb2xvclN0YXRlKTsKKworICAgLyogVEVNUCBjb2xvclRlbXA7ICovCisgICBjb2xvclRlbXAgPSBmcHJvZy0+QmFzZS5OdW1UZW1wb3JhcmllcysrOworICAgLyogVEVNUCBmb2dGYWN0b3JUZW1wOyAqLworICAgZm9nRmFjdG9yVGVtcCA9IGZwcm9nLT5CYXNlLk51bVRlbXBvcmFyaWVzKys7CisKKyAgIC8qIFNjYW4gcHJvZ3JhbSB0byBmaW5kIHdoZXJlIHJlc3VsdC5jb2xvciBpcyB3cml0dGVuICovCisgICBpbnN0ID0gbmV3SW5zdDsKKyAgIGZvciAoaSA9IDA7IGkgPCBmcHJvZy0+QmFzZS5OdW1JbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfRU5EKQorICAgICAgICAgYnJlYWs7CisgICAgICBpZiAoaW5zdC0+RHN0UmVnLkZpbGUgPT0gUFJPR1JBTV9PVVRQVVQgJiYKKyAgICAgICAgICBpbnN0LT5Ec3RSZWcuSW5kZXggPT0gRlJBR19SRVNVTFRfQ09MT1IpIHsKKyAgICAgICAgIC8qIGNoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24gdG8gd3JpdGUgdG8gY29sb3JUZW1wIHcvIGNsYW1waW5nICovCisgICAgICAgICBpbnN0LT5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworICAgICAgICAgaW5zdC0+RHN0UmVnLkluZGV4ID0gY29sb3JUZW1wOworICAgICAgICAgaW5zdC0+U2F0dXJhdGVNb2RlID0gc2F0dXJhdGU7CisgICAgICAgICAvKiBkb24ndCBicmVhayAobWF5IGJlIHNldmVyYWwgd3JpdGVzIHRvIHJlc3VsdC5jb2xvcikgKi8KKyAgICAgIH0KKyAgICAgIGluc3QrKzsKKyAgIH0KKyAgIGFzc2VydChpbnN0LT5PcGNvZGUgPT0gT1BDT0RFX0VORCk7IC8qIHdlJ2xsIG92ZXJ3cml0ZSB0aGlzIGluc3QgKi8KKworICAgX21lc2FfaW5pdF9pbnN0cnVjdGlvbnMoaW5zdCwgNSk7CisKKyAgIC8qIGVtaXQgaW5zdHJ1Y3Rpb25zIHRvIGNvbXB1dGUgZm9nIGJsZW5kaW5nIGZhY3RvciAqLworICAgLyogdGhpcyBpcyBhbHdheXMgY2xhbXBlZCB0byBbMCwgMV0gcmVnYXJkbGVzcyBvZiBmcmFnbWVudCBjbGFtcGluZyAqLworICAgaWYgKGZvZ19tb2RlID09IEdMX0xJTkVBUikgeworICAgICAgLyogTUFEIGZvZ0ZhY3RvclRlbXAueCwgZnJhZ21lbnQuZm9nY29vcmQueCwgZm9nUFJlZk9wdC54LCBmb2dQUmVmT3B0Lnk7ICovCisgICAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTUFEOworICAgICAgaW5zdC0+RHN0UmVnLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKyAgICAgIGluc3QtPkRzdFJlZy5JbmRleCA9IGZvZ0ZhY3RvclRlbXA7CisgICAgICBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1g7CisgICAgICBpbnN0LT5TcmNSZWdbMF0uRmlsZSA9IFBST0dSQU1fSU5QVVQ7CisgICAgICBpbnN0LT5TcmNSZWdbMF0uSW5kZXggPSBWQVJZSU5HX1NMT1RfRk9HQzsKKyAgICAgIGluc3QtPlNyY1JlZ1swXS5Td2l6emxlID0gU1dJWlpMRV9YWFhYOworICAgICAgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX1NUQVRFX1ZBUjsKKyAgICAgIGluc3QtPlNyY1JlZ1sxXS5JbmRleCA9IGZvZ1BSZWZPcHQ7CisgICAgICBpbnN0LT5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfWFhYWDsKKyAgICAgIGluc3QtPlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9TVEFURV9WQVI7CisgICAgICBpbnN0LT5TcmNSZWdbMl0uSW5kZXggPSBmb2dQUmVmT3B0OworICAgICAgaW5zdC0+U3JjUmVnWzJdLlN3aXp6bGUgPSBTV0laWkxFX1lZWVk7CisgICAgICBpbnN0LT5TYXR1cmF0ZU1vZGUgPSBTQVRVUkFURV9aRVJPX09ORTsKKyAgICAgIGluc3QrKzsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgQVNTRVJUKGZvZ19tb2RlID09IEdMX0VYUCB8fCBmb2dfbW9kZSA9PSBHTF9FWFAyKTsKKyAgICAgIC8qIGZvZ1BSZWZPcHQueiA9IGQvbG4oMiksIGZvZ1BSZWZPcHQudyA9IGQvc3FydChsbigyKSAqLworICAgICAgLyogRVhQOiBNVUwgZm9nRmFjdG9yVGVtcC54LCBmb2dQUmVmT3B0LnosIGZyYWdtZW50LmZvZ2Nvb3JkLng7ICovCisgICAgICAvKiBFWFAyOiBNVUwgZm9nRmFjdG9yVGVtcC54LCBmb2dQUmVmT3B0LncsIGZyYWdtZW50LmZvZ2Nvb3JkLng7ICovCisgICAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfTVVMOworICAgICAgaW5zdC0+RHN0UmVnLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKyAgICAgIGluc3QtPkRzdFJlZy5JbmRleCA9IGZvZ0ZhY3RvclRlbXA7CisgICAgICBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1g7CisgICAgICBpbnN0LT5TcmNSZWdbMF0uRmlsZSA9IFBST0dSQU1fU1RBVEVfVkFSOworICAgICAgaW5zdC0+U3JjUmVnWzBdLkluZGV4ID0gZm9nUFJlZk9wdDsKKyAgICAgIGluc3QtPlNyY1JlZ1swXS5Td2l6emxlCisgICAgICAgICA9IChmb2dfbW9kZSA9PSBHTF9FWFApID8gU1dJWlpMRV9aWlpaIDogU1dJWlpMRV9XV1dXOworICAgICAgaW5zdC0+U3JjUmVnWzFdLkZpbGUgPSBQUk9HUkFNX0lOUFVUOworICAgICAgaW5zdC0+U3JjUmVnWzFdLkluZGV4ID0gVkFSWUlOR19TTE9UX0ZPR0M7CisgICAgICBpbnN0LT5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfWFhYWDsKKyAgICAgIGluc3QrKzsKKyAgICAgIGlmIChmb2dfbW9kZSA9PSBHTF9FWFAyKSB7CisgICAgICAgICAvKiBNVUwgZm9nRmFjdG9yVGVtcC54LCBmb2dGYWN0b3JUZW1wLngsIGZvZ0ZhY3RvclRlbXAueDsgKi8KKyAgICAgICAgIGluc3QtPk9wY29kZSA9IE9QQ09ERV9NVUw7CisgICAgICAgICBpbnN0LT5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworICAgICAgICAgaW5zdC0+RHN0UmVnLkluZGV4ID0gZm9nRmFjdG9yVGVtcDsKKyAgICAgICAgIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgPSBXUklURU1BU0tfWDsKKyAgICAgICAgIGluc3QtPlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisgICAgICAgICBpbnN0LT5TcmNSZWdbMF0uSW5kZXggPSBmb2dGYWN0b3JUZW1wOworICAgICAgICAgaW5zdC0+U3JjUmVnWzBdLlN3aXp6bGUgPSBTV0laWkxFX1hYWFg7CisgICAgICAgICBpbnN0LT5TcmNSZWdbMV0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworICAgICAgICAgaW5zdC0+U3JjUmVnWzFdLkluZGV4ID0gZm9nRmFjdG9yVGVtcDsKKyAgICAgICAgIGluc3QtPlNyY1JlZ1sxXS5Td2l6emxlID0gU1dJWlpMRV9YWFhYOworICAgICAgICAgaW5zdCsrOworICAgICAgfQorICAgICAgLyogRVgyX1NBVCBmb2dGYWN0b3JUZW1wLngsIC1mb2dGYWN0b3JUZW1wLng7ICovCisgICAgICBpbnN0LT5PcGNvZGUgPSBPUENPREVfRVgyOworICAgICAgaW5zdC0+RHN0UmVnLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKyAgICAgIGluc3QtPkRzdFJlZy5JbmRleCA9IGZvZ0ZhY3RvclRlbXA7CisgICAgICBpbnN0LT5Ec3RSZWcuV3JpdGVNYXNrID0gV1JJVEVNQVNLX1g7CisgICAgICBpbnN0LT5TcmNSZWdbMF0uRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworICAgICAgaW5zdC0+U3JjUmVnWzBdLkluZGV4ID0gZm9nRmFjdG9yVGVtcDsKKyAgICAgIGluc3QtPlNyY1JlZ1swXS5OZWdhdGUgPSBORUdBVEVfWFlaVzsKKyAgICAgIGluc3QtPlNyY1JlZ1swXS5Td2l6emxlID0gU1dJWlpMRV9YWFhYOworICAgICAgaW5zdC0+U2F0dXJhdGVNb2RlID0gU0FUVVJBVEVfWkVST19PTkU7CisgICAgICBpbnN0Kys7CisgICB9CisgICAvKiBMUlAgcmVzdWx0LmNvbG9yLnh5eiwgZm9nRmFjdG9yVGVtcC54eHh4LCBjb2xvclRlbXAsIGZvZ0NvbG9yUmVmOyAqLworICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX0xSUDsKKyAgIGluc3QtPkRzdFJlZy5GaWxlID0gUFJPR1JBTV9PVVRQVVQ7CisgICBpbnN0LT5Ec3RSZWcuSW5kZXggPSBGUkFHX1JFU1VMVF9DT0xPUjsKKyAgIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgPSBXUklURU1BU0tfWFlaOworICAgaW5zdC0+U3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKyAgIGluc3QtPlNyY1JlZ1swXS5JbmRleCA9IGZvZ0ZhY3RvclRlbXA7CisgICBpbnN0LT5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfWFhYWDsKKyAgIGluc3QtPlNyY1JlZ1sxXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisgICBpbnN0LT5TcmNSZWdbMV0uSW5kZXggPSBjb2xvclRlbXA7CisgICBpbnN0LT5TcmNSZWdbMV0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIGluc3QtPlNyY1JlZ1syXS5GaWxlID0gUFJPR1JBTV9TVEFURV9WQVI7CisgICBpbnN0LT5TcmNSZWdbMl0uSW5kZXggPSBmb2dDb2xvclJlZjsKKyAgIGluc3QtPlNyY1JlZ1syXS5Td2l6emxlID0gU1dJWlpMRV9OT09QOworICAgaW5zdCsrOworICAgLyogTU9WIHJlc3VsdC5jb2xvci53LCBjb2xvclRlbXAueDsgICMgY29weSBhbHBoYSAqLworICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKyAgIGluc3QtPkRzdFJlZy5GaWxlID0gUFJPR1JBTV9PVVRQVVQ7CisgICBpbnN0LT5Ec3RSZWcuSW5kZXggPSBGUkFHX1JFU1VMVF9DT0xPUjsKKyAgIGluc3QtPkRzdFJlZy5Xcml0ZU1hc2sgPSBXUklURU1BU0tfVzsKKyAgIGluc3QtPlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisgICBpbnN0LT5TcmNSZWdbMF0uSW5kZXggPSBjb2xvclRlbXA7CisgICBpbnN0LT5TcmNSZWdbMF0uU3dpenpsZSA9IFNXSVpaTEVfTk9PUDsKKyAgIGluc3QrKzsKKyAgIC8qIEVORDsgKi8KKyAgIGluc3QtPk9wY29kZSA9IE9QQ09ERV9FTkQ7CisgICBpbnN0Kys7CisKKyAgIC8qIGZyZWUgb2xkIGluc3RydWN0aW9ucyAqLworICAgX21lc2FfZnJlZV9pbnN0cnVjdGlvbnMoZnByb2ctPkJhc2UuSW5zdHJ1Y3Rpb25zLCBvcmlnTGVuKTsKKworICAgLyogaW5zdGFsbCBuZXcgaW5zdHJ1Y3Rpb25zICovCisgICBmcHJvZy0+QmFzZS5JbnN0cnVjdGlvbnMgPSBuZXdJbnN0OworICAgZnByb2ctPkJhc2UuTnVtSW5zdHJ1Y3Rpb25zID0gaW5zdCAtIG5ld0luc3Q7CisgICBmcHJvZy0+QmFzZS5JbnB1dHNSZWFkIHw9IFZBUllJTkdfQklUX0ZPR0M7CisgICBhc3NlcnQoZnByb2ctPkJhc2UuT3V0cHV0c1dyaXR0ZW4gJiAoMSA8PCBGUkFHX1JFU1VMVF9DT0xPUikpOworfQorCisKKworc3RhdGljIEdMYm9vbGVhbgoraXNfdGV4dHVyZV9pbnN0cnVjdGlvbihjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgIHN3aXRjaCAoaW5zdC0+T3Bjb2RlKSB7CisgICBjYXNlIE9QQ09ERV9URVg6CisgICBjYXNlIE9QQ09ERV9UWEI6CisgICBjYXNlIE9QQ09ERV9UWEQ6CisgICBjYXNlIE9QQ09ERV9UWEw6CisgICBjYXNlIE9QQ09ERV9UWFA6CisgICBjYXNlIE9QQ09ERV9UWFBfTlY6CisgICAgICByZXR1cm4gR0xfVFJVRTsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICB9Cit9CisgICAgICAKKworLyoqCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHRleHVyZSBpbmRpcmVjdGlvbnMgaW4gdGhlIGdpdmVuIHByb2dyYW0uCisgKiBUaGUgcHJvZ3JhbSdzIE51bVRleEluZGlyZWN0aW9ucyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQuCisgKiBTZWUgdGhlIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtIHNwZWMgKGlzc3VlIDI0KSBmb3IgZGV0YWlscy4KKyAqIFhYWCB3ZSBjb3VudCB0ZXh0dXJlIGluZGlyZWN0aW9ucyBpbiB0ZXhlbnZwcm9ncmFtLmMgKG1heWJlIHVzZSB0aGlzIGNvZGUKKyAqIGluc3RlYWQgYW5kIGVsc2V3aGVyZSkuCisgKi8KK3ZvaWQKK19tZXNhX2NvdW50X3RleHR1cmVfaW5kaXJlY3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgR0x1aW50IGluZGlyZWN0aW9ucyA9IDE7CisgICBHTGJpdGZpZWxkIHRlbXBzT3V0cHV0ID0gMHgwOworICAgR0xiaXRmaWVsZCBhbHVUZW1wcyA9IDB4MDsKKyAgIEdMdWludCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOyBpKyspIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gcHJvZy0+SW5zdHJ1Y3Rpb25zICsgaTsKKworICAgICAgaWYgKGlzX3RleHR1cmVfaW5zdHJ1Y3Rpb24oaW5zdCkpIHsKKyAgICAgICAgIGlmICgoKGluc3QtPlNyY1JlZ1swXS5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZKSAmJiAKKyAgICAgICAgICAgICAgKHRlbXBzT3V0cHV0ICYgKDEgPDwgaW5zdC0+U3JjUmVnWzBdLkluZGV4KSkpIHx8CisgICAgICAgICAgICAgKChpbnN0LT5PcGNvZGUgIT0gT1BDT0RFX0tJTCkgJiYKKyAgICAgICAgICAgICAgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZKSAmJiAKKyAgICAgICAgICAgICAgKGFsdVRlbXBzICYgKDEgPDwgaW5zdC0+RHN0UmVnLkluZGV4KSkpKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGluZGlyZWN0aW9ucysrOworICAgICAgICAgICAgICAgdGVtcHNPdXRwdXQgPSAweDA7CisgICAgICAgICAgICAgICBhbHVUZW1wcyA9IDB4MDsKKyAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgR0x1aW50IGo7CisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gUFJPR1JBTV9URU1QT1JBUlkpCisgICAgICAgICAgICAgICBhbHVUZW1wcyB8PSAoMSA8PCBpbnN0LT5TcmNSZWdbal0uSW5kZXgpOworICAgICAgICAgfQorICAgICAgICAgaWYgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZKQorICAgICAgICAgICAgYWx1VGVtcHMgfD0gKDEgPDwgaW5zdC0+RHN0UmVnLkluZGV4KTsKKyAgICAgIH0KKworICAgICAgaWYgKChpbnN0LT5PcGNvZGUgIT0gT1BDT0RFX0tJTCkgJiYgKGluc3QtPkRzdFJlZy5GaWxlID09IFBST0dSQU1fVEVNUE9SQVJZKSkKKyAgICAgICAgIHRlbXBzT3V0cHV0IHw9ICgxIDw8IGluc3QtPkRzdFJlZy5JbmRleCk7CisgICB9CisKKyAgIHByb2ctPk51bVRleEluZGlyZWN0aW9ucyA9IGluZGlyZWN0aW9uczsKK30KKworCisvKioKKyAqIENvdW50IG51bWJlciBvZiB0ZXh0dXJlIGluc3RydWN0aW9ucyBpbiBnaXZlbiBwcm9ncmFtIGFuZCB1cGRhdGUgdGhlCisgKiBwcm9ncmFtJ3MgTnVtVGV4SW5zdHJ1Y3Rpb25zIGZpZWxkLgorICovCit2b2lkCitfbWVzYV9jb3VudF90ZXh0dXJlX2luc3RydWN0aW9ucyhzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIEdMdWludCBpOworICAgcHJvZy0+TnVtVGV4SW5zdHJ1Y3Rpb25zID0gMDsKKyAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLT5OdW1JbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgcHJvZy0+TnVtVGV4SW5zdHJ1Y3Rpb25zICs9IGlzX3RleHR1cmVfaW5zdHJ1Y3Rpb24ocHJvZy0+SW5zdHJ1Y3Rpb25zICsgaSk7CisgICB9Cit9CisKKworLyoqCisgKiBTY2FuL3Jld3JpdGUgcHJvZ3JhbSB0byByZW1vdmUgcmVhZHMgb2YgY3VzdG9tIChvdXRwdXQpIHJlZ2lzdGVycy4KKyAqIFRoZSBwYXNzZWQgdHlwZSBoYXMgdG8gYmUgUFJPR1JBTV9PVVRQVVQuCisgKiBPbiBzb21lIGhhcmR3YXJlLCB0cnlpbmcgdG8gcmVhZCBhbiBvdXRwdXQgcmVnaXN0ZXIgY2F1c2VzIHRyb3VibGUuCisgKiBTbywgcmV3cml0ZSB0aGUgcHJvZ3JhbSB0byB1c2UgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIgaW4gdGhpcyBjYXNlLgorICovCit2b2lkCitfbWVzYV9yZW1vdmVfb3V0cHV0X3JlYWRzKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLCBnbF9yZWdpc3Rlcl9maWxlIHR5cGUpCit7CisgICBHTHVpbnQgaTsKKyAgIEdMaW50IG91dHB1dE1hcFtWQVJZSU5HX1NMT1RfTUFYXTsKKyAgIEdMdWludCBudW1WYXJ5aW5nUmVhZHMgPSAwOworICAgR0xib29sZWFuIHVzZWRUZW1wc1tNQVhfUFJPR1JBTV9URU1QU107CisgICBHTHVpbnQgZmlyc3RUZW1wID0gMDsKKworICAgX21lc2FfZmluZF91c2VkX3JlZ2lzdGVycyhwcm9nLCBQUk9HUkFNX1RFTVBPUkFSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZFRlbXBzLCBNQVhfUFJPR1JBTV9URU1QUyk7CisKKyAgIGFzc2VydCh0eXBlID09IFBST0dSQU1fT1VUUFVUKTsKKworICAgZm9yIChpID0gMDsgaSA8IFZBUllJTkdfU0xPVF9NQVg7IGkrKykKKyAgICAgIG91dHB1dE1hcFtpXSA9IC0xOworCisgICAvKiBsb29rIGZvciBpbnN0cnVjdGlvbnMgd2hpY2ggcmVhZCBmcm9tIHZhcnlpbmcgdmFycyAqLworICAgZm9yIChpID0gMDsgaSA8IHByb2ctPk51bUluc3RydWN0aW9uczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdCA9IHByb2ctPkluc3RydWN0aW9ucyArIGk7CisgICAgICBjb25zdCBHTHVpbnQgbnVtU3JjID0gX21lc2FfbnVtX2luc3Rfc3JjX3JlZ3MoaW5zdC0+T3Bjb2RlKTsKKyAgICAgIEdMdWludCBqOworICAgICAgZm9yIChqID0gMDsgaiA8IG51bVNyYzsgaisrKSB7CisgICAgICAgICBpZiAoaW5zdC0+U3JjUmVnW2pdLkZpbGUgPT0gdHlwZSkgeworICAgICAgICAgICAgLyogcmVwbGFjZSB0aGUgcmVhZCB3aXRoIGEgdGVtcCByZWcgKi8KKyAgICAgICAgICAgIGNvbnN0IEdMdWludCB2YXIgPSBpbnN0LT5TcmNSZWdbal0uSW5kZXg7CisgICAgICAgICAgICBpZiAob3V0cHV0TWFwW3Zhcl0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgIG51bVZhcnlpbmdSZWFkcysrOworICAgICAgICAgICAgICAgb3V0cHV0TWFwW3Zhcl0gPSBfbWVzYV9maW5kX2ZyZWVfcmVnaXN0ZXIodXNlZFRlbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BST0dSQU1fVEVNUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRlbXApOworICAgICAgICAgICAgICAgZmlyc3RUZW1wID0gb3V0cHV0TWFwW3Zhcl0gKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdC0+U3JjUmVnW2pdLkZpbGUgPSBQUk9HUkFNX1RFTVBPUkFSWTsKKyAgICAgICAgICAgIGluc3QtPlNyY1JlZ1tqXS5JbmRleCA9IG91dHB1dE1hcFt2YXJdOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBpZiAobnVtVmFyeWluZ1JlYWRzID09IDApCisgICAgICByZXR1cm47IC8qIG5vdGhpbmcgdG8gYmUgZG9uZSAqLworCisgICAvKiBsb29rIGZvciBpbnN0cnVjdGlvbnMgd2hpY2ggd3JpdGUgdG8gdGhlIHZhcnlpbmcgdmFycyBpZGVudGlmaWVkIGFib3ZlICovCisgICBmb3IgKGkgPSAwOyBpIDwgcHJvZy0+TnVtSW5zdHJ1Y3Rpb25zOyBpKyspIHsKKyAgICAgIHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICppbnN0ID0gcHJvZy0+SW5zdHJ1Y3Rpb25zICsgaTsKKyAgICAgIGlmIChpbnN0LT5Ec3RSZWcuRmlsZSA9PSB0eXBlICYmCisgICAgICAgICAgb3V0cHV0TWFwW2luc3QtPkRzdFJlZy5JbmRleF0gPj0gMCkgeworICAgICAgICAgLyogY2hhbmdlIGluc3QgdG8gd3JpdGUgdG8gdGhlIHRlbXAgcmVnLCBpbnN0ZWFkIG9mIHRoZSB2YXJ5aW5nICovCisgICAgICAgICBpbnN0LT5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fVEVNUE9SQVJZOworICAgICAgICAgaW5zdC0+RHN0UmVnLkluZGV4ID0gb3V0cHV0TWFwW2luc3QtPkRzdFJlZy5JbmRleF07CisgICAgICB9CisgICB9CisKKyAgIC8qIGluc2VydCBuZXcgaW5zdHJ1Y3Rpb25zIHRvIGNvcHkgdGhlIHRlbXAgdmFycyB0byB0aGUgdmFyeWluZyB2YXJzICovCisgICB7CisgICAgICBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqaW5zdDsKKyAgICAgIEdMaW50IGVuZFBvcywgdmFyOworCisgICAgICAvKiBMb29rIGZvciBFTkQgaW5zdHJ1Y3Rpb24gYW5kIGluc2VydCB0aGUgbmV3IHZhcnlpbmcgd3JpdGVzICovCisgICAgICBlbmRQb3MgPSAtMTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLT5OdW1JbnN0cnVjdGlvbnM7IGkrKykgeworICAgICAgICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3QgPSBwcm9nLT5JbnN0cnVjdGlvbnMgKyBpOworICAgICAgICAgaWYgKGluc3QtPk9wY29kZSA9PSBPUENPREVfRU5EKSB7CisgICAgICAgICAgICBlbmRQb3MgPSBpOworICAgICAgICAgICAgX21lc2FfaW5zZXJ0X2luc3RydWN0aW9ucyhwcm9nLCBpLCBudW1WYXJ5aW5nUmVhZHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFzc2VydChlbmRQb3MgPj0gMCk7CisKKyAgICAgIC8qIGluc2VydCBuZXcgTU9WIGluc3RydWN0aW9ucyBoZXJlICovCisgICAgICBpbnN0ID0gcHJvZy0+SW5zdHJ1Y3Rpb25zICsgZW5kUG9zOworICAgICAgZm9yICh2YXIgPSAwOyB2YXIgPCBWQVJZSU5HX1NMT1RfTUFYOyB2YXIrKykgeworICAgICAgICAgaWYgKG91dHB1dE1hcFt2YXJdID49IDApIHsKKyAgICAgICAgICAgIC8qIE1PViBWQVJbdmFyXSwgVEVNUFt0bXBdOyAqLworICAgICAgICAgICAgaW5zdC0+T3Bjb2RlID0gT1BDT0RFX01PVjsKKyAgICAgICAgICAgIGluc3QtPkRzdFJlZy5GaWxlID0gdHlwZTsKKyAgICAgICAgICAgIGluc3QtPkRzdFJlZy5JbmRleCA9IHZhcjsKKyAgICAgICAgICAgIGluc3QtPlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9URU1QT1JBUlk7CisgICAgICAgICAgICBpbnN0LT5TcmNSZWdbMF0uSW5kZXggPSBvdXRwdXRNYXBbdmFyXTsKKyAgICAgICAgICAgIGluc3QrKzsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworCisvKioKKyAqIE1ha2UgdGhlIGdpdmVuIGZyYWdtZW50IHByb2dyYW0gaW50byBhICJuby1vcCIgc2hhZGVyLgorICogQWN0dWFsbHksIGp1c3QgY29weSB0aGUgaW5jb21pbmcgZnJhZ21lbnQgY29sb3IgKG9yIHRleGNvb3JkKQorICogdG8gdGhlIG91dHB1dCBjb2xvci4KKyAqIFRoaXMgaXMgZm9yIGRlYnVnL3Rlc3QgcHVycG9zZXMuCisgKi8KK3ZvaWQKK19tZXNhX25vcF9mcmFnbWVudF9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpwcm9nKQoreworICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3Q7CisgICBHTHVpbnQgaW5wdXRBdHRyOworCisgICBpbnN0ID0gX21lc2FfYWxsb2NfaW5zdHJ1Y3Rpb25zKDIpOworICAgaWYgKCFpbnN0KSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJfbWVzYV9ub3BfZnJhZ21lbnRfcHJvZ3JhbSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBfbWVzYV9pbml0X2luc3RydWN0aW9ucyhpbnN0LCAyKTsKKworICAgaW5zdFswXS5PcGNvZGUgPSBPUENPREVfTU9WOworICAgaW5zdFswXS5Ec3RSZWcuRmlsZSA9IFBST0dSQU1fT1VUUFVUOworICAgaW5zdFswXS5Ec3RSZWcuSW5kZXggPSBGUkFHX1JFU1VMVF9DT0xPUjsKKyAgIGluc3RbMF0uU3JjUmVnWzBdLkZpbGUgPSBQUk9HUkFNX0lOUFVUOworICAgaWYgKHByb2ctPkJhc2UuSW5wdXRzUmVhZCAmIFZBUllJTkdfQklUX0NPTDApCisgICAgICBpbnB1dEF0dHIgPSBWQVJZSU5HX1NMT1RfQ09MMDsKKyAgIGVsc2UKKyAgICAgIGlucHV0QXR0ciA9IFZBUllJTkdfU0xPVF9URVgwOworICAgaW5zdFswXS5TcmNSZWdbMF0uSW5kZXggPSBpbnB1dEF0dHI7CisKKyAgIGluc3RbMV0uT3Bjb2RlID0gT1BDT0RFX0VORDsKKworICAgX21lc2FfZnJlZV9pbnN0cnVjdGlvbnMocHJvZy0+QmFzZS5JbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nLT5CYXNlLk51bUluc3RydWN0aW9ucyk7CisKKyAgIHByb2ctPkJhc2UuSW5zdHJ1Y3Rpb25zID0gaW5zdDsKKyAgIHByb2ctPkJhc2UuTnVtSW5zdHJ1Y3Rpb25zID0gMjsKKyAgIHByb2ctPkJhc2UuSW5wdXRzUmVhZCA9IEJJVEZJRUxENjRfQklUKGlucHV0QXR0cik7CisgICBwcm9nLT5CYXNlLk91dHB1dHNXcml0dGVuID0gQklURklFTEQ2NF9CSVQoRlJBR19SRVNVTFRfQ09MT1IpOworfQorCisKKy8qKgorICogXHNhIF9tZXNhX25vcF9mcmFnbWVudF9wcm9ncmFtCisgKiBSZXBsYWNlIHRoZSBnaXZlbiB2ZXJ0ZXggcHJvZ3JhbSB3aXRoIGEgIm5vLW9wIiBwcm9ncmFtIHRoYXQganVzdAorICogdHJhbnNmb3JtcyB2ZXJ0ZXggcG9zaXRpb24gYW5kIGVtaXRzIGNvbG9yLgorICovCit2b2lkCitfbWVzYV9ub3BfdmVydGV4X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwcm9nKQoreworICAgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmluc3Q7CisgICBHTHVpbnQgaW5wdXRBdHRyOworCisgICAvKgorICAgICogU3RhcnQgd2l0aCBhIHNpbXBsZSB2ZXJ0ZXggcHJvZ3JhbSB0aGF0IGVtaXRzIGNvbG9yLgorICAgICovCisgICBpbnN0ID0gX21lc2FfYWxsb2NfaW5zdHJ1Y3Rpb25zKDIpOworICAgaWYgKCFpbnN0KSB7CisgICAgICBfbWVzYV9lcnJvcihjdHgsIEdMX09VVF9PRl9NRU1PUlksICJfbWVzYV9ub3BfdmVydGV4X3Byb2dyYW0iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgX21lc2FfaW5pdF9pbnN0cnVjdGlvbnMoaW5zdCwgMik7CisKKyAgIGluc3RbMF0uT3Bjb2RlID0gT1BDT0RFX01PVjsKKyAgIGluc3RbMF0uRHN0UmVnLkZpbGUgPSBQUk9HUkFNX09VVFBVVDsKKyAgIGluc3RbMF0uRHN0UmVnLkluZGV4ID0gVkFSWUlOR19TTE9UX0NPTDA7CisgICBpbnN0WzBdLlNyY1JlZ1swXS5GaWxlID0gUFJPR1JBTV9JTlBVVDsKKyAgIGlmIChwcm9nLT5CYXNlLklucHV0c1JlYWQgJiBWRVJUX0JJVF9DT0xPUjApCisgICAgICBpbnB1dEF0dHIgPSBWRVJUX0FUVFJJQl9DT0xPUjA7CisgICBlbHNlCisgICAgICBpbnB1dEF0dHIgPSBWRVJUX0FUVFJJQl9URVgwOworICAgaW5zdFswXS5TcmNSZWdbMF0uSW5kZXggPSBpbnB1dEF0dHI7CisKKyAgIGluc3RbMV0uT3Bjb2RlID0gT1BDT0RFX0VORDsKKworICAgX21lc2FfZnJlZV9pbnN0cnVjdGlvbnMocHJvZy0+QmFzZS5JbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nLT5CYXNlLk51bUluc3RydWN0aW9ucyk7CisKKyAgIHByb2ctPkJhc2UuSW5zdHJ1Y3Rpb25zID0gaW5zdDsKKyAgIHByb2ctPkJhc2UuTnVtSW5zdHJ1Y3Rpb25zID0gMjsKKyAgIHByb2ctPkJhc2UuSW5wdXRzUmVhZCA9IEJJVEZJRUxENjRfQklUKGlucHV0QXR0cik7CisgICBwcm9nLT5CYXNlLk91dHB1dHNXcml0dGVuID0gQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0NPTDApOworCisgICAvKgorICAgICogTm93IGluc2VydCBjb2RlIHRvIGRvIHN0YW5kYXJkIG1vZGVsdmlldy9wcm9qZWN0aW9uIHRyYW5zZm9ybWF0aW9uLgorICAgICovCisgICBfbWVzYV9pbnNlcnRfbXZwX2NvZGUoY3R4LCBwcm9nKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbW9wdC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9wcm9ncmFtb3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcHJvZ3JhbW9wdC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIFBST0dSQU1PUFRfSAorI2RlZmluZSBQUk9HUkFNT1BUX0ggMQorCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKworZXh0ZXJuIHZvaWQKK19tZXNhX2luc2VydF9tdnBfY29kZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnZwcm9nKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2FwcGVuZF9mb2dfY29kZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnByb2csIEdMZW51bSBmb2dfbW9kZSwKKwkJICAgICAgR0xib29sZWFuIHNhdHVyYXRlKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2NvdW50X3RleHR1cmVfaW5kaXJlY3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX2NvdW50X3RleHR1cmVfaW5zdHJ1Y3Rpb25zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuIHZvaWQKK19tZXNhX3JlbW92ZV9vdXRwdXRfcmVhZHMoc3RydWN0IGdsX3Byb2dyYW0gKnByb2csIGdsX3JlZ2lzdGVyX2ZpbGUgdHlwZSk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9ub3BfZnJhZ21lbnRfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqcHJvZyk7CisKK2V4dGVybiB2b2lkCitfbWVzYV9ub3BfdmVydGV4X3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwcm9nKTsKKworCisjZW5kaWYgLyogUFJPR1JBTU9QVF9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3JlZ2lzdGVyX2FsbG9jYXRlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3JlZ2lzdGVyX2FsbG9jYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhYzY5MAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcmVnaXN0ZXJfYWxsb2NhdGUuYwpAQCAtMCwwICsxLDY3NiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisvKiogQGZpbGUgcmVnaXN0ZXJfYWxsb2NhdGUuYworICoKKyAqIEdyYXBoLWNvbG9yaW5nIHJlZ2lzdGVyIGFsbG9jYXRvci4KKyAqCisgKiBUaGUgYmFzaWMgaWRlYSBvZiBncmFwaCBjb2xvcmluZyBpcyB0byBtYWtlIGEgbm9kZSBpbiBhIGdyYXBoIGZvcgorICogZXZlcnkgdGhpbmcgdGhhdCBuZWVkcyBhIHJlZ2lzdGVyIChjb2xvcikgbnVtYmVyIGFzc2lnbmVkLCBhbmQgbWFrZQorICogZWRnZXMgaW4gdGhlIGdyYXBoIGJldHdlZW4gbm9kZXMgdGhhdCBpbnRlcmZlcmUgKGNhbid0IGJlIGFsbG9jYXRlZAorICogdG8gdGhlIHNhbWUgcmVnaXN0ZXIgYXQgdGhlIHNhbWUgdGltZSkuCisgKgorICogRHVyaW5nIHRoZSAic2ltcGxpZnkiIHByb2Nlc3MsIGFueSBhbnkgbm9kZSB3aXRoIGZld2VyIGVkZ2VzIHRoYW4KKyAqIHRoZXJlIGFyZSByZWdpc3RlcnMgbWVhbnMgdGhhdCB0aGF0IGVkZ2UgY2FuIGdldCBhc3NpZ25lZCBhCisgKiByZWdpc3RlciByZWdhcmRsZXNzIG9mIHdoYXQgaXRzIG5laWdoYm9ycyBjaG9vc2UsIHNvIHRoYXQgbm9kZSBpcworICogcHVzaGVkIG9uIGEgc3RhY2sgYW5kIHJlbW92ZWQgKHdpdGggaXRzIGVkZ2VzKSBmcm9tIHRoZSBncmFwaC4KKyAqIFRoYXQgbGlrZWx5IGNhdXNlcyBvdGhlciBub2RlcyB0byBiZWNvbWUgdHJpdmlhbGx5IGNvbG9yYWJsZSBhcyB3ZWxsLgorICoKKyAqIFRoZW4gZHVyaW5nIHRoZSAic2VsZWN0IiBwcm9jZXNzLCBub2RlcyBhcmUgcG9wcGVkIG9mZiBvZiB0aGF0CisgKiBzdGFjaywgdGhlaXIgZWRnZXMgcmVzdG9yZWQsIGFuZCBhc3NpZ25lZCBhIGNvbG9yIGRpZmZlcmVudCBmcm9tCisgKiB0aGVpciBuZWlnaGJvcnMuICBCZWNhdXNlIHRoZXkgd2VyZSBwdXNoZWQgb24gdGhlIHN0YWNrIG9ubHkgd2hlbgorICogdGhleSB3ZXJlIHRyaXZpYWxseSBjb2xvcmFibGUsIGFueSBjb2xvciBjaG9zZW4gd29uJ3QgaW50ZXJmZXJlCisgKiB3aXRoIHRoZSByZWdpc3RlcnMgdG8gYmUgcG9wcGVkIGxhdGVyLgorICoKKyAqIFRoZSBkb3duc2lkZSB0byBtb3N0IGdyYXBoIGNvbG9yaW5nIGlzIHRoYXQgcmVhbCBoYXJkd2FyZSBvZnRlbiBoYXMKKyAqIGxpbWl0YXRpb25zLCBsaWtlIHJlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgYWxsb2NhdGVkIHRvIGEgbm9kZSBpbgorICogcGFpcnMsIG9yIGFsaWduZWQgb24gc29tZSBib3VuZGFyeS4gIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cworICogdGhlIHBhcGVyICJSZXRhcmdldGFibGUgR3JhcGgtQ29sb3JpbmcgUmVnaXN0ZXIgQWxsb2NhdGlvbiBmb3IKKyAqIElycmVndWxhciBBcmNoaXRlY3R1cmVzIiBieSBKb2hhbiBSdW5lc29uIGFuZCBTdmVuLU9sb2YgTnlzdHLDtm0uCisgKgorICogSW4gdGhpcyBzeXN0ZW0sIHRoZXJlIGFyZSByZWdpc3RlciBjbGFzc2VzIGVhY2ggY29udGFpbmluZyB2YXJpb3VzCisgKiByZWdpc3RlcnMsIGFuZCByZWdpc3RlcnMgbWF5IGludGVyZmVyZSB3aXRoIG90aGVyIHJlZ2lzdGVycy4gIEZvcgorICogZXhhbXBsZSwgb25lIG1pZ2h0IGhhdmUgYSBjbGFzcyBvZiBiYXNlIHJlZ2lzdGVycywgYW5kIGEgY2xhc3Mgb2YKKyAqIGFsaWduZWQgcmVnaXN0ZXIgcGFpcnMgdGhhdCB3b3VsZCBlYWNoIGludGVyZmVyZSB3aXRoIHRoZWlyIHBhaXIgb2YKKyAqIHRoZSBiYXNlIHJlZ2lzdGVycy4gIEVhY2ggbm9kZSBoYXMgYSByZWdpc3RlciBjbGFzcyBpdCBuZWVkcyB0byBiZQorICogYXNzaWduZWQgdG8uICBEZWZpbmUgcChCKSB0byBiZSB0aGUgc2l6ZSBvZiByZWdpc3RlciBjbGFzcyBCLCBhbmQKKyAqIHEoQixDKSB0byBiZSB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBpbiBCIHRoYXQgdGhlIHdvcnN0IGNob2ljZQorICogcmVnaXN0ZXIgaW4gQyBjb3VsZCBjb25mbGljdCB3aXRoLiAgVGhlbiwgdGhpcyBzeXN0ZW0gcmVwbGFjZXMgdGhlCisgKiBiYXNpYyBncmFwaCBjb2xvcmluZyB0ZXN0IG9mICJmZXdlciBlZGdlcyBmcm9tIHRoaXMgbm9kZSB0aGFuIHRoZXJlCisgKiBhcmUgcmVnaXN0ZXJzIiB3aXRoICJGb3IgdGhpcyBub2RlIG9mIGNsYXNzIEIsIHRoZSBzdW0gb2YgcShCLEMpCisgKiBmb3IgZWFjaCBuZWlnaGJvciBub2RlIG9mIGNsYXNzIEMgaXMgbGVzcyB0aGFuIHBCIi4KKyAqCisgKiBBIG5pY2UgZmVhdHVyZSBvZiB0aGUgcHEgdGVzdCBpcyB0aGF0IHEoQixDKSBjYW4gYmUgY29tcHV0ZWQgb25jZQorICogdXAgZnJvbnQgYW5kIHN0b3JlZCBpbiBhIDItZGltZW5zaW9uYWwgYXJyYXksIHNvIHRoYXQgdGhlIGNvc3Qgb2YKKyAqIGNvbG9yaW5nIGEgbm9kZSBpcyBjb25zdGFudCB3aXRoIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzLiAgV2UgZG8KKyAqIHRoaXMgZHVyaW5nIHJhX3NldF9maW5hbGl6ZSgpLgorICovCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8cmFsbG9jLmg+CisKKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAibWFpbi9iaXRzZXQuaCIKKyNpbmNsdWRlICJyZWdpc3Rlcl9hbGxvY2F0ZS5oIgorCisjZGVmaW5lIE5PX1JFRyB+MAorCitzdHJ1Y3QgcmFfcmVnIHsKKyAgIEJJVFNFVF9XT1JEICpjb25mbGljdHM7CisgICB1bnNpZ25lZCBpbnQgKmNvbmZsaWN0X2xpc3Q7CisgICB1bnNpZ25lZCBpbnQgY29uZmxpY3RfbGlzdF9zaXplOworICAgdW5zaWduZWQgaW50IG51bV9jb25mbGljdHM7Cit9OworCitzdHJ1Y3QgcmFfcmVncyB7CisgICBzdHJ1Y3QgcmFfcmVnICpyZWdzOworICAgdW5zaWduZWQgaW50IGNvdW50OworCisgICBzdHJ1Y3QgcmFfY2xhc3MgKipjbGFzc2VzOworICAgdW5zaWduZWQgaW50IGNsYXNzX2NvdW50OworCisgICBib29sIHJvdW5kX3JvYmluOworfTsKKworc3RydWN0IHJhX2NsYXNzIHsKKyAgIC8qKgorICAgICogQml0c2V0IGluZGljYXRpbmcgd2hpY2ggcmVnaXN0ZXJzIGJlbG9uZyB0byB0aGlzIGNsYXNzLgorICAgICoKKyAgICAqIChJZiBiaXQgTiBpcyBzZXQsIHRoZW4gcmVnaXN0ZXIgTiBiZWxvbmdzIHRvIHRoaXMgY2xhc3MuKQorICAgICovCisgICBCSVRTRVRfV09SRCAqcmVnczsKKworICAgLyoqCisgICAgKiBwKEIpIGluIFJ1bmVzb24vTnlzdHLDtm0gcGFwZXIuCisgICAgKgorICAgICogVGhpcyBpcyAiaG93IG1hbnkgcmVncyBhcmUgaW4gdGhlIHNldC4iCisgICAgKi8KKyAgIHVuc2lnbmVkIGludCBwOworCisgICAvKioKKyAgICAqIHEoQixDKSAoaW5kZXhlZCBieSBDLCBCIGlzIHRoaXMgcmVnaXN0ZXIgY2xhc3MpIGluCisgICAgKiBSdW5lc29uL055c3Ryw7ZtIHBhcGVyLiAgVGhpcyBpcyAiaG93IG1hbnkgcmVnaXN0ZXJzIG9mIEIgY291bGQKKyAgICAqIHRoZSB3b3JzdCBjaG9pY2UgcmVnaXN0ZXIgZnJvbSBDIGNvbmZsaWN0IHdpdGgiLgorICAgICovCisgICB1bnNpZ25lZCBpbnQgKnE7Cit9OworCitzdHJ1Y3QgcmFfbm9kZSB7CisgICAvKiogQHsKKyAgICAqCisgICAgKiBMaXN0IG9mIHdoaWNoIG5vZGVzIHRoaXMgbm9kZSBpbnRlcmZlcmVzIHdpdGguICBUaGlzIHNob3VsZCBiZQorICAgICogc3ltbWV0cmljIHdpdGggdGhlIG90aGVyIG5vZGUuCisgICAgKi8KKyAgIEJJVFNFVF9XT1JEICphZGphY2VuY3k7CisgICB1bnNpZ25lZCBpbnQgKmFkamFjZW5jeV9saXN0OworICAgdW5zaWduZWQgaW50IGFkamFjZW5jeV9saXN0X3NpemU7CisgICB1bnNpZ25lZCBpbnQgYWRqYWNlbmN5X2NvdW50OworICAgLyoqIEB9ICovCisKKyAgIHVuc2lnbmVkIGludCBjbGFzczsKKworICAgLyogUmVnaXN0ZXIsIGlmIGFzc2lnbmVkLCBvciBOT19SRUcuICovCisgICB1bnNpZ25lZCBpbnQgcmVnOworCisgICAvKioKKyAgICAqIFNldCB3aGVuIHRoZSBub2RlIGlzIGluIHRoZSB0cml2aWFsbHkgY29sb3JhYmxlIHN0YWNrLiAgV2hlbgorICAgICogc2V0LCB0aGUgYWRqYWNlbmN5IHRvIHRoaXMgbm9kZSBpcyBpZ25vcmVkLCB0byBpbXBsZW1lbnQgdGhlCisgICAgKiAicmVtb3ZlIHRoZSBlZGdlIGZyb20gdGhlIGdyYXBoIiBpbiBzaW1wbGlmaWNhdGlvbiB3aXRob3V0CisgICAgKiBoYXZpbmcgdG8gYWN0dWFsbHkgbW9kaWZ5IHRoZSBhZGphY2VuY3lfbGlzdC4KKyAgICAqLworICAgYm9vbCBpbl9zdGFjazsKKworICAgLyogRm9yIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgbmVlZHMgcmVnaXN0ZXIgc3BpbGxpbmcsIHRoaXMgaXMgdGhlCisgICAgKiBhcHByb3hpbWF0ZSBjb3N0IG9mIHNwaWxsaW5nIHRoaXMgbm9kZS4KKyAgICAqLworICAgZmxvYXQgc3BpbGxfY29zdDsKK307CisKK3N0cnVjdCByYV9ncmFwaCB7CisgICBzdHJ1Y3QgcmFfcmVncyAqcmVnczsKKyAgIC8qKgorICAgICogdGhlIHZhcmlhYmxlcyB0aGF0IG5lZWQgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgICAqLworICAgc3RydWN0IHJhX25vZGUgKm5vZGVzOworICAgdW5zaWduZWQgaW50IGNvdW50OyAvKio8IGNvdW50IG9mIG5vZGVzLiAqLworCisgICB1bnNpZ25lZCBpbnQgKnN0YWNrOworICAgdW5zaWduZWQgaW50IHN0YWNrX2NvdW50OworCisgICAvKioKKyAgICAqIFRyYWNrcyB0aGUgc3RhcnQgb2YgdGhlIHNldCBvZiBvcHRpbWlzdGljYWxseS1jb2xvcmVkIHJlZ2lzdGVycyBpbiB0aGUKKyAgICAqIHN0YWNrLgorICAgICoKKyAgICAqIEFsb25nIHdpdGggYW55IHJlZ2lzdGVycyBub3QgaW4gdGhlIHN0YWNrIChpZiBvbmUgY2FsbGVkIHJhX3NpbXBsaWZ5KCkKKyAgICAqIGFuZCBkaWRuJ3QgZG8gb3B0aW1pc3RpYyBjb2xvcmluZyksIHRoZXNlIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBmb3IKKyAgICAqIHNwaWxsaW5nLgorICAgICovCisgICB1bnNpZ25lZCBpbnQgc3RhY2tfb3B0aW1pc3RpY19zdGFydDsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIHNldCBvZiByZWdpc3RlcnMgZm9yIHRoZSBhbGxvY2F0b3IuCisgKgorICogbWVtX2N0eCBpcyBhIHJhbGxvYyBjb250ZXh0IGZvciB0aGUgYWxsb2NhdG9yLiAgVGhlIHJlZyBzZXQgbWF5IGJlIGZyZWVkCisgKiB1c2luZyByYWxsb2NfZnJlZSgpLgorICovCitzdHJ1Y3QgcmFfcmVncyAqCityYV9hbGxvY19yZWdfc2V0KHZvaWQgKm1lbV9jdHgsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKyAgIHVuc2lnbmVkIGludCBpOworICAgc3RydWN0IHJhX3JlZ3MgKnJlZ3M7CisKKyAgIHJlZ3MgPSByemFsbG9jKG1lbV9jdHgsIHN0cnVjdCByYV9yZWdzKTsKKyAgIHJlZ3MtPmNvdW50ID0gY291bnQ7CisgICByZWdzLT5yZWdzID0gcnphbGxvY19hcnJheShyZWdzLCBzdHJ1Y3QgcmFfcmVnLCBjb3VudCk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICByZWdzLT5yZWdzW2ldLmNvbmZsaWN0cyA9IHJ6YWxsb2NfYXJyYXkocmVncy0+cmVncywgQklUU0VUX1dPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUU0VUX1dPUkRTKGNvdW50KSk7CisgICAgICBCSVRTRVRfU0VUKHJlZ3MtPnJlZ3NbaV0uY29uZmxpY3RzLCBpKTsKKworICAgICAgcmVncy0+cmVnc1tpXS5jb25mbGljdF9saXN0ID0gcmFsbG9jX2FycmF5KHJlZ3MtPnJlZ3MsIHVuc2lnbmVkIGludCwgNCk7CisgICAgICByZWdzLT5yZWdzW2ldLmNvbmZsaWN0X2xpc3Rfc2l6ZSA9IDQ7CisgICAgICByZWdzLT5yZWdzW2ldLmNvbmZsaWN0X2xpc3RbMF0gPSBpOworICAgICAgcmVncy0+cmVnc1tpXS5udW1fY29uZmxpY3RzID0gMTsKKyAgIH0KKworICAgcmV0dXJuIHJlZ3M7Cit9CisKKy8qKgorICogVGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBieSBkZWZhdWx0IHByZWZlcnMgdG8gYWxsb2NhdGUgbG93IHJlZ2lzdGVyIG51bWJlcnMsCisgKiBzaW5jZSBpdCB3YXMgd3JpdHRlbiBmb3IgaGFyZHdhcmUgKGdlbjQvNSBJbnRlbCkgdGhhdCBpcyBsaW1pdGVkIGluIGl0cworICogbXVsdGl0aHJlYWRlZG5lc3MgYnkgdGhlIG51bWJlciBvZiByZWdpc3RlcnMgdXNlZCBpbiBhIGdpdmVuIHNoYWRlci4KKyAqCisgKiBIb3dldmVyLCBmb3IgaGFyZHdhcmUgd2l0aG91dCB0aGF0IHJlc3RyaWN0aW9uLCBkZW5zZWx5IHBhY2tlZCByZWdpc3RlcgorICogYWxsb2NhdGlvbiBjYW4gcHV0IHNlcmlvdXMgY29uc3RyYWludHMgb24gaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4gIFRoaXMKKyAqIGZ1bmN0aW9uIHRlbGxzIHRoZSBhbGxvY2F0b3IgdG8gcm90YXRlIGFyb3VuZCB0aGUgcmVnaXN0ZXJzIGlmIHBvc3NpYmxlIGFzCisgKiBpdCBhbGxvY2F0ZXMgdGhlIG5vZGVzLgorICovCit2b2lkCityYV9zZXRfYWxsb2NhdGVfcm91bmRfcm9iaW4oc3RydWN0IHJhX3JlZ3MgKnJlZ3MpCit7CisgICByZWdzLT5yb3VuZF9yb2JpbiA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCityYV9hZGRfY29uZmxpY3RfbGlzdChzdHJ1Y3QgcmFfcmVncyAqcmVncywgdW5zaWduZWQgaW50IHIxLCB1bnNpZ25lZCBpbnQgcjIpCit7CisgICBzdHJ1Y3QgcmFfcmVnICpyZWcxID0gJnJlZ3MtPnJlZ3NbcjFdOworCisgICBpZiAocmVnMS0+Y29uZmxpY3RfbGlzdF9zaXplID09IHJlZzEtPm51bV9jb25mbGljdHMpIHsKKyAgICAgIHJlZzEtPmNvbmZsaWN0X2xpc3Rfc2l6ZSAqPSAyOworICAgICAgcmVnMS0+Y29uZmxpY3RfbGlzdCA9IHJlcmFsbG9jKHJlZ3MtPnJlZ3MsIHJlZzEtPmNvbmZsaWN0X2xpc3QsCisJCQkJICAgICB1bnNpZ25lZCBpbnQsIHJlZzEtPmNvbmZsaWN0X2xpc3Rfc2l6ZSk7CisgICB9CisgICByZWcxLT5jb25mbGljdF9saXN0W3JlZzEtPm51bV9jb25mbGljdHMrK10gPSByMjsKKyAgIEJJVFNFVF9TRVQocmVnMS0+Y29uZmxpY3RzLCByMik7Cit9CisKK3ZvaWQKK3JhX2FkZF9yZWdfY29uZmxpY3Qoc3RydWN0IHJhX3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCByMSwgdW5zaWduZWQgaW50IHIyKQoreworICAgaWYgKCFCSVRTRVRfVEVTVChyZWdzLT5yZWdzW3IxXS5jb25mbGljdHMsIHIyKSkgeworICAgICAgcmFfYWRkX2NvbmZsaWN0X2xpc3QocmVncywgcjEsIHIyKTsKKyAgICAgIHJhX2FkZF9jb25mbGljdF9saXN0KHJlZ3MsIHIyLCByMSk7CisgICB9Cit9CisKKy8qKgorICogQWRkcyBhIGNvbmZsaWN0IGJldHdlZW4gYmFzZV9yZWcgYW5kIHJlZywgYW5kIGFsc28gYmV0d2VlbiByZWcgYW5kCisgKiBhbnl0aGluZyB0aGF0IGJhc2VfcmVnIGNvbmZsaWN0cyB3aXRoLgorICoKKyAqIFRoaXMgY2FuIHNpbXBsaWZ5IGNvZGUgZm9yIHNldHRpbmcgdXAgbXVsdGlwbGUgcmVnaXN0ZXIgY2xhc3NlcworICogd2hpY2ggYXJlIGFnZ3JlZ2F0ZXMgb2Ygc29tZSBiYXNlIGhhcmR3YXJlIHJlZ2lzdGVycywgY29tcGFyZWQgdG8KKyAqIGV4cGxpY2l0bHkgdXNpbmcgcmFfYWRkX3JlZ19jb25mbGljdC4KKyAqLwordm9pZAorcmFfYWRkX3RyYW5zaXRpdmVfcmVnX2NvbmZsaWN0KHN0cnVjdCByYV9yZWdzICpyZWdzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBiYXNlX3JlZywgdW5zaWduZWQgaW50IHJlZykKK3sKKyAgIGludCBpOworCisgICByYV9hZGRfcmVnX2NvbmZsaWN0KHJlZ3MsIHJlZywgYmFzZV9yZWcpOworCisgICBmb3IgKGkgPSAwOyBpIDwgcmVncy0+cmVnc1tiYXNlX3JlZ10ubnVtX2NvbmZsaWN0czsgaSsrKSB7CisgICAgICByYV9hZGRfcmVnX2NvbmZsaWN0KHJlZ3MsIHJlZywgcmVncy0+cmVnc1tiYXNlX3JlZ10uY29uZmxpY3RfbGlzdFtpXSk7CisgICB9Cit9CisKK3Vuc2lnbmVkIGludAorcmFfYWxsb2NfcmVnX2NsYXNzKHN0cnVjdCByYV9yZWdzICpyZWdzKQoreworICAgc3RydWN0IHJhX2NsYXNzICpjbGFzczsKKworICAgcmVncy0+Y2xhc3NlcyA9IHJlcmFsbG9jKHJlZ3MtPnJlZ3MsIHJlZ3MtPmNsYXNzZXMsIHN0cnVjdCByYV9jbGFzcyAqLAorCQkJICAgIHJlZ3MtPmNsYXNzX2NvdW50ICsgMSk7CisKKyAgIGNsYXNzID0gcnphbGxvYyhyZWdzLCBzdHJ1Y3QgcmFfY2xhc3MpOworICAgcmVncy0+Y2xhc3Nlc1tyZWdzLT5jbGFzc19jb3VudF0gPSBjbGFzczsKKworICAgY2xhc3MtPnJlZ3MgPSByemFsbG9jX2FycmF5KGNsYXNzLCBCSVRTRVRfV09SRCwgQklUU0VUX1dPUkRTKHJlZ3MtPmNvdW50KSk7CisKKyAgIHJldHVybiByZWdzLT5jbGFzc19jb3VudCsrOworfQorCit2b2lkCityYV9jbGFzc19hZGRfcmVnKHN0cnVjdCByYV9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgYywgdW5zaWduZWQgaW50IHIpCit7CisgICBzdHJ1Y3QgcmFfY2xhc3MgKmNsYXNzID0gcmVncy0+Y2xhc3Nlc1tjXTsKKworICAgQklUU0VUX1NFVChjbGFzcy0+cmVncywgcik7CisgICBjbGFzcy0+cCsrOworfQorCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVnaXN0ZXIgYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3MuCisgKi8KK3N0YXRpYyBib29sCityZWdfYmVsb25nc190b19jbGFzcyh1bnNpZ25lZCBpbnQgciwgc3RydWN0IHJhX2NsYXNzICpjKQoreworICAgcmV0dXJuIEJJVFNFVF9URVNUKGMtPnJlZ3MsIHIpOworfQorCisvKioKKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCBjb25mbGljdHMgYW5kIHJlZ2lzdGVyIGNsYXNzZXMgaGF2ZSBiZWVuCisgKiBzZXQgdXAgYW5kIGJlZm9yZSB0aGUgcmVnaXN0ZXIgc2V0IGlzIHVzZWQgZm9yIGFsbG9jYXRpb24uCisgKiBUbyBhdm9pZCBjb3N0bHkgcSB2YWx1ZSBjb21wdXRhdGlvbiwgdXNlIHRoZSBxX3ZhbHVlcyBwYXJhbWF0ZXIKKyAqIHRvIHBhc3MgcHJlY29tcHV0ZWQgcSB2YWx1ZXMgdG8gdGhpcyBmdW5jdGlvbi4KKyAqLwordm9pZAorcmFfc2V0X2ZpbmFsaXplKHN0cnVjdCByYV9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgKipxX3ZhbHVlcykKK3sKKyAgIHVuc2lnbmVkIGludCBiLCBjOworCisgICBmb3IgKGIgPSAwOyBiIDwgcmVncy0+Y2xhc3NfY291bnQ7IGIrKykgeworICAgICAgcmVncy0+Y2xhc3Nlc1tiXS0+cSA9IHJhbGxvY19hcnJheShyZWdzLCB1bnNpZ25lZCBpbnQsIHJlZ3MtPmNsYXNzX2NvdW50KTsKKyAgIH0KKworICAgaWYgKHFfdmFsdWVzKSB7CisgICAgICBmb3IgKGIgPSAwOyBiIDwgcmVncy0+Y2xhc3NfY291bnQ7IGIrKykgeworICAgICAgICAgZm9yIChjID0gMDsgYyA8IHJlZ3MtPmNsYXNzX2NvdW50OyBjKyspIHsKKyAgICAgICAgICAgIHJlZ3MtPmNsYXNzZXNbYl0tPnFbY10gPSBxX3ZhbHVlc1tiXVtjXTsKKwkgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBDb21wdXRlLCBmb3IgZWFjaCBjbGFzcyBCIGFuZCBDLCBob3cgbWFueSByZWdzIG9mIEIgYW4KKyAgICAqIGFsbG9jYXRpb24gdG8gQyBjb3VsZCBjb25mbGljdCB3aXRoLgorICAgICovCisgICBmb3IgKGIgPSAwOyBiIDwgcmVncy0+Y2xhc3NfY291bnQ7IGIrKykgeworICAgICAgZm9yIChjID0gMDsgYyA8IHJlZ3MtPmNsYXNzX2NvdW50OyBjKyspIHsKKwkgdW5zaWduZWQgaW50IHJjOworCSBpbnQgbWF4X2NvbmZsaWN0cyA9IDA7CisKKwkgZm9yIChyYyA9IDA7IHJjIDwgcmVncy0+Y291bnQ7IHJjKyspIHsKKwkgICAgaW50IGNvbmZsaWN0cyA9IDA7CisJICAgIGludCBpOworCisgICAgICAgICAgICBpZiAoIXJlZ19iZWxvbmdzX3RvX2NsYXNzKHJjLCByZWdzLT5jbGFzc2VzW2NdKSkKKwkgICAgICAgY29udGludWU7CisKKwkgICAgZm9yIChpID0gMDsgaSA8IHJlZ3MtPnJlZ3NbcmNdLm51bV9jb25mbGljdHM7IGkrKykgeworCSAgICAgICB1bnNpZ25lZCBpbnQgcmIgPSByZWdzLT5yZWdzW3JjXS5jb25mbGljdF9saXN0W2ldOworCSAgICAgICBpZiAoQklUU0VUX1RFU1QocmVncy0+Y2xhc3Nlc1tiXS0+cmVncywgcmIpKQorCQkgIGNvbmZsaWN0cysrOworCSAgICB9CisJICAgIG1heF9jb25mbGljdHMgPSBNQVgyKG1heF9jb25mbGljdHMsIGNvbmZsaWN0cyk7CisJIH0KKwkgcmVncy0+Y2xhc3Nlc1tiXS0+cVtjXSA9IG1heF9jb25mbGljdHM7CisgICAgICB9CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCityYV9hZGRfbm9kZV9hZGphY2VuY3koc3RydWN0IHJhX2dyYXBoICpnLCB1bnNpZ25lZCBpbnQgbjEsIHVuc2lnbmVkIGludCBuMikKK3sKKyAgIEJJVFNFVF9TRVQoZy0+bm9kZXNbbjFdLmFkamFjZW5jeSwgbjIpOworCisgICBpZiAoZy0+bm9kZXNbbjFdLmFkamFjZW5jeV9jb3VudCA+PQorICAgICAgIGctPm5vZGVzW24xXS5hZGphY2VuY3lfbGlzdF9zaXplKSB7CisgICAgICBnLT5ub2Rlc1tuMV0uYWRqYWNlbmN5X2xpc3Rfc2l6ZSAqPSAyOworICAgICAgZy0+bm9kZXNbbjFdLmFkamFjZW5jeV9saXN0ID0gcmVyYWxsb2MoZywgZy0+bm9kZXNbbjFdLmFkamFjZW5jeV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+bm9kZXNbbjFdLmFkamFjZW5jeV9saXN0X3NpemUpOworICAgfQorCisgICBnLT5ub2Rlc1tuMV0uYWRqYWNlbmN5X2xpc3RbZy0+bm9kZXNbbjFdLmFkamFjZW5jeV9jb3VudF0gPSBuMjsKKyAgIGctPm5vZGVzW24xXS5hZGphY2VuY3lfY291bnQrKzsKK30KKworc3RydWN0IHJhX2dyYXBoICoKK3JhX2FsbG9jX2ludGVyZmVyZW5jZV9ncmFwaChzdHJ1Y3QgcmFfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGNvdW50KQoreworICAgc3RydWN0IHJhX2dyYXBoICpnOworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGcgPSByemFsbG9jKHJlZ3MsIHN0cnVjdCByYV9ncmFwaCk7CisgICBnLT5yZWdzID0gcmVnczsKKyAgIGctPm5vZGVzID0gcnphbGxvY19hcnJheShnLCBzdHJ1Y3QgcmFfbm9kZSwgY291bnQpOworICAgZy0+Y291bnQgPSBjb3VudDsKKworICAgZy0+c3RhY2sgPSByemFsbG9jX2FycmF5KGcsIHVuc2lnbmVkIGludCwgY291bnQpOworCisgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgaW50IGJpdHNldF9jb3VudCA9IEJJVFNFVF9XT1JEUyhjb3VudCk7CisgICAgICBnLT5ub2Rlc1tpXS5hZGphY2VuY3kgPSByemFsbG9jX2FycmF5KGcsIEJJVFNFVF9XT1JELCBiaXRzZXRfY291bnQpOworCisgICAgICBnLT5ub2Rlc1tpXS5hZGphY2VuY3lfbGlzdF9zaXplID0gNDsKKyAgICAgIGctPm5vZGVzW2ldLmFkamFjZW5jeV9saXN0ID0KKyAgICAgICAgIHJhbGxvY19hcnJheShnLCB1bnNpZ25lZCBpbnQsIGctPm5vZGVzW2ldLmFkamFjZW5jeV9saXN0X3NpemUpOworICAgICAgZy0+bm9kZXNbaV0uYWRqYWNlbmN5X2NvdW50ID0gMDsKKworICAgICAgcmFfYWRkX25vZGVfYWRqYWNlbmN5KGcsIGksIGkpOworICAgICAgZy0+bm9kZXNbaV0ucmVnID0gTk9fUkVHOworICAgfQorCisgICByZXR1cm4gZzsKK30KKwordm9pZAorcmFfc2V0X25vZGVfY2xhc3Moc3RydWN0IHJhX2dyYXBoICpnLAorCQkgIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgY2xhc3MpCit7CisgICBnLT5ub2Rlc1tuXS5jbGFzcyA9IGNsYXNzOworfQorCit2b2lkCityYV9hZGRfbm9kZV9pbnRlcmZlcmVuY2Uoc3RydWN0IHJhX2dyYXBoICpnLAorCQkJIHVuc2lnbmVkIGludCBuMSwgdW5zaWduZWQgaW50IG4yKQoreworICAgaWYgKCFCSVRTRVRfVEVTVChnLT5ub2Rlc1tuMV0uYWRqYWNlbmN5LCBuMikpIHsKKyAgICAgIHJhX2FkZF9ub2RlX2FkamFjZW5jeShnLCBuMSwgbjIpOworICAgICAgcmFfYWRkX25vZGVfYWRqYWNlbmN5KGcsIG4yLCBuMSk7CisgICB9Cit9CisKK3N0YXRpYyBib29sCitwcV90ZXN0KHN0cnVjdCByYV9ncmFwaCAqZywgdW5zaWduZWQgaW50IG4pCit7CisgICB1bnNpZ25lZCBpbnQgajsKKyAgIHVuc2lnbmVkIGludCBxID0gMDsKKyAgIGludCBuX2NsYXNzID0gZy0+bm9kZXNbbl0uY2xhc3M7CisKKyAgIGZvciAoaiA9IDA7IGogPCBnLT5ub2Rlc1tuXS5hZGphY2VuY3lfY291bnQ7IGorKykgeworICAgICAgdW5zaWduZWQgaW50IG4yID0gZy0+bm9kZXNbbl0uYWRqYWNlbmN5X2xpc3Rbal07CisgICAgICB1bnNpZ25lZCBpbnQgbjJfY2xhc3MgPSBnLT5ub2Rlc1tuMl0uY2xhc3M7CisKKyAgICAgIGlmIChuICE9IG4yICYmICFnLT5ub2Rlc1tuMl0uaW5fc3RhY2spIHsKKwkgcSArPSBnLT5yZWdzLT5jbGFzc2VzW25fY2xhc3NdLT5xW24yX2NsYXNzXTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHEgPCBnLT5yZWdzLT5jbGFzc2VzW25fY2xhc3NdLT5wOworfQorCisvKioKKyAqIFNpbXBsaWZpZXMgdGhlIGludGVyZmVyZW5jZSBncmFwaCBieSBwdXNoaW5nIGFsbAorICogdHJpdmlhbGx5LWNvbG9yYWJsZSBub2RlcyBpbnRvIGEgc3RhY2sgb2Ygbm9kZXMgdG8gYmUgY29sb3JlZCwKKyAqIHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgZ3JhcGgsIGFuZCByaW5zaW5nIGFuZCByZXBlYXRpbmcuCisgKgorICogUmV0dXJucyB0cnVlIGlmIGFsbCBub2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGguICBmYWxzZQorICogbWVhbnMgdGhhdCBlaXRoZXIgc3BpbGxpbmcgd2lsbCBiZSByZXF1aXJlZCwgb3Igb3B0aW1pc3RpYyBjb2xvcmluZworICogc2hvdWxkIGJlIGFwcGxpZWQuCisgKi8KK2Jvb2wKK3JhX3NpbXBsaWZ5KHN0cnVjdCByYV9ncmFwaCAqZykKK3sKKyAgIGJvb2wgcHJvZ3Jlc3MgPSB0cnVlOworICAgaW50IGk7CisKKyAgIHdoaWxlIChwcm9ncmVzcykgeworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgICAgZm9yIChpID0gZy0+Y291bnQgLSAxOyBpID49IDA7IGktLSkgeworCSBpZiAoZy0+bm9kZXNbaV0uaW5fc3RhY2sgfHwgZy0+bm9kZXNbaV0ucmVnICE9IE5PX1JFRykKKwkgICAgY29udGludWU7CisKKwkgaWYgKHBxX3Rlc3QoZywgaSkpIHsKKwkgICAgZy0+c3RhY2tbZy0+c3RhY2tfY291bnRdID0gaTsKKwkgICAgZy0+c3RhY2tfY291bnQrKzsKKwkgICAgZy0+bm9kZXNbaV0uaW5fc3RhY2sgPSB0cnVlOworCSAgICBwcm9ncmVzcyA9IHRydWU7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgZm9yIChpID0gMDsgaSA8IGctPmNvdW50OyBpKyspIHsKKyAgICAgIGlmICghZy0+bm9kZXNbaV0uaW5fc3RhY2sgJiYgZy0+bm9kZXNbaV0ucmVnID09IC0xKQorCSByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFBvcHMgbm9kZXMgZnJvbSB0aGUgc3RhY2sgYmFjayBpbnRvIHRoZSBncmFwaCwgY29sb3JpbmcgdGhlbSB3aXRoCisgKiByZWdpc3RlcnMgYXMgdGhleSBnby4KKyAqCisgKiBJZiBhbGwgbm9kZXMgd2VyZSB0cml2aWFsbHkgY29sb3JhYmxlLCB0aGVuIHRoaXMgbXVzdCBzdWNjZWVkLiAgSWYKKyAqIG5vdCAob3B0aW1pc3RpYyBjb2xvcmluZyksIHRoZW4gaXQgbWF5IHJldHVybiBmYWxzZTsKKyAqLworYm9vbAorcmFfc2VsZWN0KHN0cnVjdCByYV9ncmFwaCAqZykKK3sKKyAgIGludCBpOworICAgaW50IHN0YXJ0X3NlYXJjaF9yZWcgPSAwOworCisgICB3aGlsZSAoZy0+c3RhY2tfY291bnQgIT0gMCkgeworICAgICAgdW5zaWduZWQgaW50IHJpOworICAgICAgdW5zaWduZWQgaW50IHIgPSAtMTsKKyAgICAgIGludCBuID0gZy0+c3RhY2tbZy0+c3RhY2tfY291bnQgLSAxXTsKKyAgICAgIHN0cnVjdCByYV9jbGFzcyAqYyA9IGctPnJlZ3MtPmNsYXNzZXNbZy0+bm9kZXNbbl0uY2xhc3NdOworCisgICAgICAvKiBGaW5kIHRoZSBsb3dlc3QtbnVtYmVyZWQgcmVnIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGEgbWVtYmVyCisgICAgICAgKiBvZiB0aGUgZ3JhcGggYWRqYWNlbnQgdG8gdXMuCisgICAgICAgKi8KKyAgICAgIGZvciAocmkgPSAwOyByaSA8IGctPnJlZ3MtPmNvdW50OyByaSsrKSB7CisgICAgICAgICByID0gKHN0YXJ0X3NlYXJjaF9yZWcgKyByaSkgJSBnLT5yZWdzLT5jb3VudDsKKyAgICAgICAgIGlmICghcmVnX2JlbG9uZ3NfdG9fY2xhc3MociwgYykpCisJICAgIGNvbnRpbnVlOworCisJIC8qIENoZWNrIGlmIGFueSBvZiBvdXIgbmVpZ2hib3JzIGNvbmZsaWN0IHdpdGggdGhpcyByZWdpc3RlciBjaG9pY2UuICovCisJIGZvciAoaSA9IDA7IGkgPCBnLT5ub2Rlc1tuXS5hZGphY2VuY3lfY291bnQ7IGkrKykgeworCSAgICB1bnNpZ25lZCBpbnQgbjIgPSBnLT5ub2Rlc1tuXS5hZGphY2VuY3lfbGlzdFtpXTsKKworCSAgICBpZiAoIWctPm5vZGVzW24yXS5pbl9zdGFjayAmJgorCQlCSVRTRVRfVEVTVChnLT5yZWdzLT5yZWdzW3JdLmNvbmZsaWN0cywgZy0+bm9kZXNbbjJdLnJlZykpIHsKKwkgICAgICAgYnJlYWs7CisJICAgIH0KKwkgfQorCSBpZiAoaSA9PSBnLT5ub2Rlc1tuXS5hZGphY2VuY3lfY291bnQpCisJICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHJpID09IGctPnJlZ3MtPmNvdW50KQorCSByZXR1cm4gZmFsc2U7CisKKyAgICAgIGctPm5vZGVzW25dLnJlZyA9IHI7CisgICAgICBnLT5ub2Rlc1tuXS5pbl9zdGFjayA9IGZhbHNlOworICAgICAgZy0+c3RhY2tfY291bnQtLTsKKworICAgICAgaWYgKGctPnJlZ3MtPnJvdW5kX3JvYmluKQorICAgICAgICAgc3RhcnRfc2VhcmNoX3JlZyA9IHIgKyAxOworICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBPcHRpbWlzdGljIHJlZ2lzdGVyIGNvbG9yaW5nOiBKdXN0IHB1c2ggdGhlIHJlbWFpbmluZyBub2RlcworICogb24gdGhlIHN0YWNrLiAgVGhleSdsbCBiZSBjb2xvcmVkIGZpcnN0IGluIHJhX3NlbGVjdCgpLCBhbmQKKyAqIGlmIHRoZXkgc3VjY2VlZCB0aGVuIHRoZSBsb2NhbGx5LWNvbG9yYWJsZSBub2RlcyBhcmUgc3RpbGwKKyAqIGxvY2FsbHktY29sb3JhYmxlIGFuZCB0aGUgcmVzdCBvZiB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbgorICogd2lsbCBzdWNjZWVkLgorICovCit2b2lkCityYV9vcHRpbWlzdGljX2NvbG9yKHN0cnVjdCByYV9ncmFwaCAqZykKK3sKKyAgIHVuc2lnbmVkIGludCBpOworCisgICBnLT5zdGFja19vcHRpbWlzdGljX3N0YXJ0ID0gZy0+c3RhY2tfY291bnQ7CisgICBmb3IgKGkgPSAwOyBpIDwgZy0+Y291bnQ7IGkrKykgeworICAgICAgaWYgKGctPm5vZGVzW2ldLmluX3N0YWNrIHx8IGctPm5vZGVzW2ldLnJlZyAhPSBOT19SRUcpCisJIGNvbnRpbnVlOworCisgICAgICBnLT5zdGFja1tnLT5zdGFja19jb3VudF0gPSBpOworICAgICAgZy0+c3RhY2tfY291bnQrKzsKKyAgICAgIGctPm5vZGVzW2ldLmluX3N0YWNrID0gdHJ1ZTsKKyAgIH0KK30KKworYm9vbAorcmFfYWxsb2NhdGVfbm9fc3BpbGxzKHN0cnVjdCByYV9ncmFwaCAqZykKK3sKKyAgIGlmICghcmFfc2ltcGxpZnkoZykpIHsKKyAgICAgIHJhX29wdGltaXN0aWNfY29sb3IoZyk7CisgICB9CisgICByZXR1cm4gcmFfc2VsZWN0KGcpOworfQorCit1bnNpZ25lZCBpbnQKK3JhX2dldF9ub2RlX3JlZyhzdHJ1Y3QgcmFfZ3JhcGggKmcsIHVuc2lnbmVkIGludCBuKQoreworICAgcmV0dXJuIGctPm5vZGVzW25dLnJlZzsKK30KKworLyoqCisgKiBGb3JjZXMgYSBub2RlIHRvIGEgc3BlY2lmaWMgcmVnaXN0ZXIuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkCisgKiBjcmVhdGluZyBhIHJlZ2lzdGVyIGNsYXNzIGNvbnRhaW5pbmcgb25lIG5vZGUgd2hlbiBoYW5kbGluZyBkYXRhCisgKiB0aGF0IG11c3QgbGl2ZSBpbiBhIGZpeGVkIGxvY2F0aW9uIGFuZCBpcyBrbm93biB0byBub3QgY29uZmxpY3QKKyAqIHdpdGggb3RoZXIgZm9yY2VkIHJlZ2lzdGVyIGFzc2lnbm1lbnQgKGFzIGlzIGNvbW1vbiB3aXRoIHNoYWRlcgorICogaW5wdXQgZGF0YSkuICBUaGVzZSBub2RlcyBkbyBub3QgZW5kIHVwIGluIHRoZSBzdGFjayBkdXJpbmcKKyAqIHJhX3NpbXBsaWZ5KCksIGFuZCB0aHVzIGF0IHJhX3NlbGVjdCgpIHRpbWUgaXQgaXMgYXMgaWYgdGhleSB3ZXJlCisgKiB0aGUgZmlyc3QgcG9wcGVkIG9mZiB0aGUgc3RhY2sgYW5kIGFzc2lnbmVkIHRoZWlyIGZpeGVkIGxvY2F0aW9ucy4KKyAqIE5vZGVzIHRoYXQgdXNlIHRoaXMgZnVuY3Rpb24gZG8gbm90IG5lZWQgdG8gYmUgYXNzaWduZWQgYSByZWdpc3RlcgorICogY2xhc3MuCisgKgorICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJhX3NpbXBsaWZ5KCkuCisgKi8KK3ZvaWQKK3JhX3NldF9ub2RlX3JlZyhzdHJ1Y3QgcmFfZ3JhcGggKmcsIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgcmVnKQoreworICAgZy0+bm9kZXNbbl0ucmVnID0gcmVnOworICAgZy0+bm9kZXNbbl0uaW5fc3RhY2sgPSBmYWxzZTsKK30KKworc3RhdGljIGZsb2F0CityYV9nZXRfc3BpbGxfYmVuZWZpdChzdHJ1Y3QgcmFfZ3JhcGggKmcsIHVuc2lnbmVkIGludCBuKQoreworICAgaW50IGo7CisgICBmbG9hdCBiZW5lZml0ID0gMDsKKyAgIGludCBuX2NsYXNzID0gZy0+bm9kZXNbbl0uY2xhc3M7CisKKyAgIC8qIERlZmluZSB0aGUgYmVuZWZpdCBvZiBlbGltaW5hdGluZyBhbiBpbnRlcmZlcmVuY2UgYmV0d2VlbiBuLCBuMgorICAgICogdGhyb3VnaCBzcGlsbGluZyBhcyBxKEMsIEIpIC8gcChDKS4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUKKyAgICAqICJjb3VudCBudW1iZXIgb2YgZWRnZXMiIGFwcHJvYWNoIG9mIHRyYWRpdGlvbmFsIGdyYXBoIGNvbG9yaW5nLAorICAgICogYnV0IHRha2VzIGNsYXNzZXMgaW50byBhY2NvdW50LgorICAgICovCisgICBmb3IgKGogPSAwOyBqIDwgZy0+bm9kZXNbbl0uYWRqYWNlbmN5X2NvdW50OyBqKyspIHsKKyAgICAgIHVuc2lnbmVkIGludCBuMiA9IGctPm5vZGVzW25dLmFkamFjZW5jeV9saXN0W2pdOworICAgICAgaWYgKG4gIT0gbjIpIHsKKwkgdW5zaWduZWQgaW50IG4yX2NsYXNzID0gZy0+bm9kZXNbbjJdLmNsYXNzOworCSBiZW5lZml0ICs9ICgoZmxvYXQpZy0+cmVncy0+Y2xhc3Nlc1tuX2NsYXNzXS0+cVtuMl9jbGFzc10gLworCQkgICAgIGctPnJlZ3MtPmNsYXNzZXNbbl9jbGFzc10tPnApOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gYmVuZWZpdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgbm9kZSBudW1iZXIgdG8gYmUgc3BpbGxlZCBhY2NvcmRpbmcgdG8gdGhlIGNvc3QvYmVuZWZpdCB1c2luZworICogdGhlIHBxIHRlc3QsIG9yIC0xIGlmIHRoZXJlIGFyZSBubyBzcGlsbGFibGUgbm9kZXMuCisgKi8KK2ludAorcmFfZ2V0X2Jlc3Rfc3BpbGxfbm9kZShzdHJ1Y3QgcmFfZ3JhcGggKmcpCit7CisgICB1bnNpZ25lZCBpbnQgYmVzdF9ub2RlID0gLTE7CisgICBmbG9hdCBiZXN0X2JlbmVmaXQgPSAwLjA7CisgICB1bnNpZ25lZCBpbnQgbiwgaTsKKworICAgLyogRm9yIGFueSByZWdpc3RlcnMgbm90IGluIHRoZSBzdGFjayB0byBiZSBjb2xvcmVkLCBjb25zaWRlciB0aGVtIGZvcgorICAgICogc3BpbGxpbmcuICBUaGlzIHdpbGwgbW9zdGx5IGNvbGxlY3Qgbm9kZXMgdGhhdCB3ZXJlIGJlaW5nIG9wdGltaXN0YWxseQorICAgICogY29sb3JlZCBhcyBwYXJ0IG9mIHJhX2FsbG9jYXRlX25vX3NwaWxscygpIGlmIHdlIGRpZG4ndCBzdWNjZXNzZnVsbHkKKyAgICAqIG9wdGltaXN0aWNhbGx5IGNvbG9yLgorICAgICoKKyAgICAqIEl0IGFsc28gaW5jbHVkZXMgbm9kZXMgbm90IHRyaXZpYWxseSBjb2xvcmFibGUgYnkgcmFfc2ltcGxpZnkoKSBpZiBpdAorICAgICogd2FzIHVzZWQgZGlyZWN0bHkgaW5zdGVhZCBvZiBhcyBwYXJ0IG9mIHJhX2FsbG9jYXRlX25vX3NwaWxscygpLgorICAgICovCisgICBmb3IgKG4gPSAwOyBuIDwgZy0+Y291bnQ7IG4rKykgeworICAgICAgZmxvYXQgY29zdCA9IGctPm5vZGVzW25dLnNwaWxsX2Nvc3Q7CisgICAgICBmbG9hdCBiZW5lZml0OworCisgICAgICBpZiAoY29zdCA8PSAwLjApCisJIGNvbnRpbnVlOworCisgICAgICBpZiAoZy0+bm9kZXNbbl0uaW5fc3RhY2spCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgYmVuZWZpdCA9IHJhX2dldF9zcGlsbF9iZW5lZml0KGcsIG4pOworCisgICAgICBpZiAoYmVuZWZpdCAvIGNvc3QgPiBiZXN0X2JlbmVmaXQpIHsKKwkgYmVzdF9iZW5lZml0ID0gYmVuZWZpdCAvIGNvc3Q7CisJIGJlc3Rfbm9kZSA9IG47CisgICAgICB9CisgICB9CisKKyAgIC8qIEFsc28gY29uc2lkZXIgc3BpbGxpbmcgYW55IG5vZGVzIHRoYXQgd2VyZSBzZXQgdXAgdG8gYmUgb3B0aW1pc3RpY2FsbHkKKyAgICAqIGNvbG9yZWQgdGhhdCB3ZSBjb3VsZG4ndCBtYW5hZ2UgdG8gY29sb3IgaW4gcmFfc2VsZWN0KCkuCisgICAgKi8KKyAgIGZvciAoaSA9IGctPnN0YWNrX29wdGltaXN0aWNfc3RhcnQ7IGkgPCBnLT5zdGFja19jb3VudDsgaSsrKSB7CisgICAgICBmbG9hdCBjb3N0LCBiZW5lZml0OworCisgICAgICBuID0gZy0+c3RhY2tbaV07CisgICAgICBjb3N0ID0gZy0+bm9kZXNbbl0uc3BpbGxfY29zdDsKKworICAgICAgaWYgKGNvc3QgPD0gMC4wKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGJlbmVmaXQgPSByYV9nZXRfc3BpbGxfYmVuZWZpdChnLCBuKTsKKworICAgICAgaWYgKGJlbmVmaXQgLyBjb3N0ID4gYmVzdF9iZW5lZml0KSB7CisgICAgICAgICBiZXN0X2JlbmVmaXQgPSBiZW5lZml0IC8gY29zdDsKKyAgICAgICAgIGJlc3Rfbm9kZSA9IG47CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBiZXN0X25vZGU7Cit9CisKKy8qKgorICogT25seSBub2RlcyB3aXRoIGEgc3BpbGwgY29zdCBzZXQgKGNvc3QgIT0gMC4wKSB3aWxsIGJlIGNvbnNpZGVyZWQKKyAqIGZvciByZWdpc3RlciBzcGlsbGluZy4KKyAqLwordm9pZAorcmFfc2V0X25vZGVfc3BpbGxfY29zdChzdHJ1Y3QgcmFfZ3JhcGggKmcsIHVuc2lnbmVkIGludCBuLCBmbG9hdCBjb3N0KQoreworICAgZy0+bm9kZXNbbl0uc3BpbGxfY29zdCA9IGNvc3Q7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3JlZ2lzdGVyX2FsbG9jYXRlLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3JlZ2lzdGVyX2FsbG9jYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3ZGNmNwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vcmVnaXN0ZXJfYWxsb2NhdGUuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3N0cnVjdCByYV9jbGFzczsKK3N0cnVjdCByYV9yZWdzOworCisvKiBAeworICogUmVnaXN0ZXIgc2V0IHNldHVwLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGRvbmUgb25jZSBhdCBiYWNrZW5kIGluaXRpYWxpemFpb24sIGFzCisgKiByYV9zZXRfZmluYWxpemUgaXMgTyhyXjIqY14yKS4gIFRoZSByZWdpc3RlcnMgbWF5IGJlIHZpcnR1YWwKKyAqIHJlZ2lzdGVycywgc3VjaCBhcyBhbGlnbmVkIHJlZ2lzdGVyIHBhaXJzIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGUKKyAqIHR3byByZWFsIHJlZ2lzdGVycyBmcm9tIHdoaWNoIHRoZXkgYXJlIGNvbXBvc2VkLgorICovCitzdHJ1Y3QgcmFfcmVncyAqcmFfYWxsb2NfcmVnX3NldCh2b2lkICptZW1fY3R4LCB1bnNpZ25lZCBpbnQgY291bnQpOwordm9pZCByYV9zZXRfYWxsb2NhdGVfcm91bmRfcm9iaW4oc3RydWN0IHJhX3JlZ3MgKnJlZ3MpOwordW5zaWduZWQgaW50IHJhX2FsbG9jX3JlZ19jbGFzcyhzdHJ1Y3QgcmFfcmVncyAqcmVncyk7Cit2b2lkIHJhX2FkZF9yZWdfY29uZmxpY3Qoc3RydWN0IHJhX3JlZ3MgKnJlZ3MsCisJCQkgdW5zaWduZWQgaW50IHIxLCB1bnNpZ25lZCBpbnQgcjIpOwordm9pZCByYV9hZGRfdHJhbnNpdGl2ZV9yZWdfY29uZmxpY3Qoc3RydWN0IHJhX3JlZ3MgKnJlZ3MsCisJCQkJICAgIHVuc2lnbmVkIGludCBiYXNlX3JlZywgdW5zaWduZWQgaW50IHJlZyk7Cit2b2lkIHJhX2NsYXNzX2FkZF9yZWcoc3RydWN0IHJhX3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBjLCB1bnNpZ25lZCBpbnQgcmVnKTsKK3ZvaWQgcmFfc2V0X251bV9jb25mbGljdHMoc3RydWN0IHJhX3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBjbGFzc19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2xhc3NfYiwgdW5zaWduZWQgaW50IG51bV9jb25mbGljdHMpOwordm9pZCByYV9zZXRfZmluYWxpemUoc3RydWN0IHJhX3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCAqKmNvbmZsaWN0cyk7CisvKiogQH0gKi8KKworLyoqIEB7IEludGVyZmVyZW5jZSBncmFwaCBzZXR1cC4KKyAqCisgKiBFYWNoIGludGVyZmVyZW5jZSBncmFwaCBub2RlIGlzIGEgdmlydHVhbCB2YXJpYWJsZSBpbiB0aGUgSUwuICBJdAorICogaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmFfc2V0X25vZGVfY2xhc3MoKSBmb3IgdGhlIHZpcnR1YWwgdmFyaWFibGUsCisgKiBhbmQgY29tcHV0ZSBsaXZlIHJhbmdlcyBhbmQgcmFfbm9kZV9pbnRlcmZlcmUoKSBiZXR3ZWVuIGNvbmZsaWN0aW5nCisgKiBsaXZlIHJhbmdlcy4KKyAqLworc3RydWN0IHJhX2dyYXBoICpyYV9hbGxvY19pbnRlcmZlcmVuY2VfZ3JhcGgoc3RydWN0IHJhX3JlZ3MgKnJlZ3MsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKK3ZvaWQgcmFfc2V0X25vZGVfY2xhc3Moc3RydWN0IHJhX2dyYXBoICpnLCB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGMpOwordm9pZCByYV9hZGRfbm9kZV9pbnRlcmZlcmVuY2Uoc3RydWN0IHJhX2dyYXBoICpnLAorCQkJICAgICAgdW5zaWduZWQgaW50IG4xLCB1bnNpZ25lZCBpbnQgbjIpOworLyoqIEB9ICovCisKKy8qKiBAeyBHcmFwaC1jb2xvcmluZyByZWdpc3RlciBhbGxvY2F0aW9uICovCitib29sIHJhX3NpbXBsaWZ5KHN0cnVjdCByYV9ncmFwaCAqZyk7Cit2b2lkIHJhX29wdGltaXN0aWNfY29sb3Ioc3RydWN0IHJhX2dyYXBoICpnKTsKK2Jvb2wgcmFfc2VsZWN0KHN0cnVjdCByYV9ncmFwaCAqZyk7Citib29sIHJhX2FsbG9jYXRlX25vX3NwaWxscyhzdHJ1Y3QgcmFfZ3JhcGggKmcpOworCit1bnNpZ25lZCBpbnQgcmFfZ2V0X25vZGVfcmVnKHN0cnVjdCByYV9ncmFwaCAqZywgdW5zaWduZWQgaW50IG4pOwordm9pZCByYV9zZXRfbm9kZV9yZWcoc3RydWN0IHJhX2dyYXBoICogZywgdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCByZWcpOwordm9pZCByYV9zZXRfbm9kZV9zcGlsbF9jb3N0KHN0cnVjdCByYV9ncmFwaCAqZywgdW5zaWduZWQgaW50IG4sIGZsb2F0IGNvc3QpOworaW50IHJhX2dldF9iZXN0X3NwaWxsX25vZGUoc3RydWN0IHJhX2dyYXBoICpnKTsKKy8qKiBAfSAqLworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3NhbXBsZXIuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9zYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNkMjAyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9zYW1wbGVyLmNwcApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCAgVk13YXJlLCBJbmMuICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisvLyNpbmNsdWRlICIuLi9nbHNsL3Byb2dyYW0uaCIgLy8gTHVuYXJHIDogUmVtb3ZlZAorI2luY2x1ZGUgImxpbmtlci5oIiAvLyBMdW5hckcgOiBBREQKKyNpbmNsdWRlICJwcm9ncmFtL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJpcl91bmlmb3JtLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1haW4vY29tcGlsZXIuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dyYW0uaCIKK30KKworY2xhc3MgZ2V0X3NhbXBsZXJfbmFtZSA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvcgoreworcHVibGljOgorICAgZ2V0X3NhbXBsZXJfbmFtZShpcl9kZXJlZmVyZW5jZSAqbGFzdCwKKwkJICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW0pCisgICB7CisgICAgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICAgICB0aGlzLT5zaGFkZXJfcHJvZ3JhbSA9IHNoYWRlcl9wcm9ncmFtOworICAgICAgdGhpcy0+bmFtZSA9IE5VTEw7CisgICAgICB0aGlzLT5vZmZzZXQgPSAwOworICAgICAgdGhpcy0+bGFzdCA9IGxhc3Q7CisgICB9CisKKyAgIH5nZXRfc2FtcGxlcl9uYW1lKCkKKyAgIHsKKyAgICAgIHJhbGxvY19mcmVlKHRoaXMtPm1lbV9jdHgpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKKyAgIHsKKyAgICAgIHRoaXMtPm5hbWUgPSBpci0+dmFyLT5uYW1lOworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqaXIpCisgICB7CisgICAgICB0aGlzLT5uYW1lID0gcmFsbG9jX2FzcHJpbnRmKG1lbV9jdHgsICIlcy4lcyIsIG5hbWUsIGlyLT5maWVsZCk7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKQorICAgeworICAgICAgaXJfY29uc3RhbnQgKmluZGV4ID0gaXItPmFycmF5X2luZGV4LT5hc19jb25zdGFudCgpOworICAgICAgaW50IGk7CisKKyAgICAgIGlmIChpbmRleCkgeworCSBpID0gaW5kZXgtPnZhbHVlLmlbMF07CisgICAgICB9IGVsc2UgeworCSAvKiBHTFNMIDEuMTAgYW5kIDEuMjAgYWxsb3dlZCB2YXJpYWJsZSBzYW1wbGVyIGFycmF5IGluZGljZXMsCisJICAqIHdoaWxlIEdMU0wgMS4zMCByZXF1aXJlcyB0aGF0IHRoZSBhcnJheSBpbmRpY2VzIGJlCisJICAqIGNvbnN0YW50IGludGVnZXIgZXhwcmVzc2lvbnMuICBXZSBkb24ndCBleHBlY3QgYW55IGRyaXZlcgorCSAgKiB0byBhY3R1YWxseSB3b3JrIHdpdGggYSByZWFsbHkgdmFyaWFibGUgYXJyYXkgaW5kZXgsIHNvCisJICAqIGFsbCB0aGF0IHdvdWxkIHdvcmsgd291bGQgYmUgYW4gdW5yb2xsZWQgbG9vcCBjb3VudGVyIHRoYXQgZW5kcworCSAgKiB1cCBiZWluZyBjb25zdGFudCBhYm92ZS4KKwkgICovCisJIHJhbGxvY19zdHJjYXQoJnNoYWRlcl9wcm9ncmFtLT5JbmZvTG9nLAorCQkgICAgICAgIndhcm5pbmc6IFZhcmlhYmxlIHNhbXBsZXIgYXJyYXkgaW5kZXggdW5zdXBwb3J0ZWQuXG4iCisJCSAgICAgICAiVGhpcyBmZWF0dXJlIG9mIHRoZSBsYW5ndWFnZSB3YXMgcmVtb3ZlZCBpbiBHTFNMIDEuMjAgIgorCQkgICAgICAgImFuZCBpcyB1bmxpa2VseSB0byBiZSBzdXBwb3J0ZWQgZm9yIDEuMTAgaW4gTWVzYS5cbiIpOworCSBpID0gMDsKKyAgICAgIH0KKyAgICAgIGlmIChpciAhPSBsYXN0KSB7CisJIHRoaXMtPm5hbWUgPSByYWxsb2NfYXNwcmludGYobWVtX2N0eCwgIiVzWyVkXSIsIG5hbWUsIGkpOworICAgICAgfSBlbHNlIHsKKwkgb2Zmc2V0ID0gaTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZ3JhbTsKKyAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICB2b2lkICptZW1fY3R4OworICAgaW50IG9mZnNldDsKKyAgIGlyX2RlcmVmZXJlbmNlICpsYXN0OworfTsKKworCitleHRlcm4gIkMiIGludAorX21lc2FfZ2V0X3NhbXBsZXJfdW5pZm9ybV92YWx1ZShjbGFzcyBpcl9kZXJlZmVyZW5jZSAqc2FtcGxlciwKKwkJCQlzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9ncmFtLAorCQkJCWNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKQoreworICAgZ2V0X3NhbXBsZXJfbmFtZSBnZXRuYW1lKHNhbXBsZXIsIHNoYWRlcl9wcm9ncmFtKTsKKworICAgR0x1aW50IHNoYWRlciA9IF9tZXNhX3Byb2dyYW1fZW51bV90b19zaGFkZXJfc3RhZ2UocHJvZy0+VGFyZ2V0KTsKKworICAgc2FtcGxlci0+YWNjZXB0KCZnZXRuYW1lKTsKKworICAgdW5zaWduZWQgbG9jYXRpb247CisgICBpZiAoIXNoYWRlcl9wcm9ncmFtLT5Vbmlmb3JtSGFzaC0+Z2V0KGxvY2F0aW9uLCBnZXRuYW1lLm5hbWUpKSB7CisgICAgICBsaW5rZXJfZXJyb3Ioc2hhZGVyX3Byb2dyYW0sCisJCSAgICJmYWlsZWQgdG8gZmluZCBzYW1wbGVyIG5hbWVkICVzLlxuIiwgZ2V0bmFtZS5uYW1lKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBpZiAoIXNoYWRlcl9wcm9ncmFtLT5Vbmlmb3JtU3RvcmFnZVtsb2NhdGlvbl0uc2FtcGxlcltzaGFkZXJdLmFjdGl2ZSkgeworICAgICAgYXNzZXJ0KDAgJiYgImNhbm5vdCByZXR1cm4gYSBzYW1wbGVyIik7CisgICAgICBsaW5rZXJfZXJyb3Ioc2hhZGVyX3Byb2dyYW0sCisJCSAgICJjYW5ub3QgcmV0dXJuIGEgc2FtcGxlciBuYW1lZCAlcywgYmVjYXVzZSBpdCBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICJ1c2VkIGluIHRoaXMgc2hhZGVyIHN0YWdlLiBUaGlzIGlzIGEgZHJpdmVyIGJ1Zy5cbiIsCisgICAgICAgICAgICAgICAgICAgZ2V0bmFtZS5uYW1lKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICByZXR1cm4gc2hhZGVyX3Byb2dyYW0tPlVuaWZvcm1TdG9yYWdlW2xvY2F0aW9uXS5zYW1wbGVyW3NoYWRlcl0uaW5kZXggKworICAgICAgICAgIGdldG5hbWUub2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9zYW1wbGVyLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9wcm9ncmFtL3NhbXBsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQ2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9zYW1wbGVyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCAgVk13YXJlLCBJbmMuICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKK2ludAorX21lc2FfZ2V0X3NhbXBsZXJfdW5pZm9ybV92YWx1ZShjbGFzcyBpcl9kZXJlZmVyZW5jZSAqc2FtcGxlciwKKwkJCQlzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9ncmFtLAorCQkJCWNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vc3RyaW5nX3RvX3VpbnRfbWFwLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vc3RyaW5nX3RvX3VpbnRfbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE3M2FiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9zdHJpbmdfdG9fdWludF9tYXAuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHN0cmluZ190b191aW50X21hcC5jcHAKKyAqIFxicmllZiBEdW1iIHdyYXBwcnMgc28gdGhhdCBDIGNvZGUgY2FuIGNyZWF0ZSBhbmQgZGVzdHJveSBtYXBzLgorICoKKyAqIFxhdXRob3IgSWFuIFJvbWFuaWNrIDxpYW4uZC5yb21hbmlja0BpbnRlbC5jb20+CisgKi8KKyNpbmNsdWRlICJoYXNoX3RhYmxlLmgiCisKK2V4dGVybiAiQyIgc3RydWN0IHN0cmluZ190b191aW50X21hcCAqCitzdHJpbmdfdG9fdWludF9tYXBfY3RvcigpCit7CisgICByZXR1cm4gbmV3IHN0cmluZ190b191aW50X21hcDsKK30KKworZXh0ZXJuICJDIiB2b2lkCitzdHJpbmdfdG9fdWludF9tYXBfZHRvcihzdHJ1Y3Qgc3RyaW5nX3RvX3VpbnRfbWFwICptYXApCit7CisgICBkZWxldGUgbWFwOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9zeW1ib2xfdGFibGUuYyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vc3ltYm9sX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2Mjk3OAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vc3ltYm9sX3RhYmxlLmMKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAibWFpbi9pbXBvcnRzLmgiCisjaW5jbHVkZSAic3ltYm9sX3RhYmxlLmgiCisjaW5jbHVkZSAiaGFzaF90YWJsZS5oIgorCitzdHJ1Y3Qgc3ltYm9sIHsKKyAgICAvKioKKyAgICAgKiBMaW5rIHRvIHRoZSBuZXh0IHN5bWJvbCBpbiB0aGUgdGFibGUgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAgICoKKyAgICAgKiBUaGUgbGlua2VkIGxpc3Qgb2Ygc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgb3JkZXJlZCBieSBzY29wZQorICAgICAqIGZyb20gaW5uZXItbW9zdCB0byBvdXRlci1tb3N0LgorICAgICAqLworICAgIHN0cnVjdCBzeW1ib2wgKm5leHRfd2l0aF9zYW1lX25hbWU7CisKKworICAgIC8qKgorICAgICAqIExpbmsgdG8gdGhlIG5leHQgc3ltYm9sIGluIHRoZSB0YWJsZSB3aXRoIHRoZSBzYW1lIHNjb3BlCisgICAgICoKKyAgICAgKiBUaGUgbGlua2VkIGxpc3Qgb2Ygc3ltYm9scyB3aXRoIHRoZSBzYW1lIHNjb3BlIGlzIHVub3JkZXJlZC4gIFN5bWJvbHMKKyAgICAgKiBpbiB0aGlzIGxpc3QgbXkgaGF2ZSB1bmlxdWUgbmFtZXMuCisgICAgICovCisgICAgc3RydWN0IHN5bWJvbCAqbmV4dF93aXRoX3NhbWVfc2NvcGU7CisKKworICAgIC8qKgorICAgICAqIEhlYWRlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGxpc3Qgb2Ygc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUuCisgICAgICovCisgICAgc3RydWN0IHN5bWJvbF9oZWFkZXIgKmhkcjsKKworCisgICAgLyoqCisgICAgICogTmFtZSBzcGFjZSBvZiB0aGUgc3ltYm9sCisgICAgICoKKyAgICAgKiBOYW1lIHNwYWNlIGFyZSBhcmJpdHJhcnkgdXNlciBhc3NpZ25lZCBpbnRlZ2Vycy4gIE5vIHR3byBzeW1ib2xzIGNhbgorICAgICAqIGV4aXN0IGluIHRoZSBzYW1lIG5hbWUgc3BhY2UgYXQgdGhlIHNhbWUgc2NvcGUgbGV2ZWwuCisgICAgICovCisgICAgaW50IG5hbWVfc3BhY2U7CisKKyAgICAvKiogU2NvcGUgZGVwdGggd2hlcmUgdGhpcyBzeW1ib2wgd2FzIGRlZmluZWQuICovCisgICAgdW5zaWduZWQgZGVwdGg7CisKKyAgICAvKioKKyAgICAgKiBBcmJpdHJhcnkgdXNlciBzdXBwbGllZCBkYXRhLgorICAgICAqLworICAgIHZvaWQgKmRhdGE7Cit9OworCisKKy8qKgorICovCitzdHJ1Y3Qgc3ltYm9sX2hlYWRlciB7CisgICAgLyoqIExpbmthZ2UgaW4gbGlzdCBvZiBhbGwgaGVhZGVycyBpbiBhIGdpdmVuIHN5bWJvbCB0YWJsZS4gKi8KKyAgICBzdHJ1Y3Qgc3ltYm9sX2hlYWRlciAqbmV4dDsKKworICAgIC8qKiBTeW1ib2wgbmFtZS4gKi8KKyAgICBjaGFyICpuYW1lOworCisgICAgLyoqIExpbmtlZCBsaXN0IG9mIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lLiAqLworICAgIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHM7Cit9OworCisKKy8qKgorICogRWxlbWVudCBvZiB0aGUgc2NvcGUgc3RhY2suCisgKi8KK3N0cnVjdCBzY29wZV9sZXZlbCB7CisgICAgLyoqIExpbmsgdG8gbmV4dCAoaW5uZXIpIHNjb3BlIGxldmVsLiAqLworICAgIHN0cnVjdCBzY29wZV9sZXZlbCAqbmV4dDsKKyAgICAKKyAgICAvKiogTGlua2VkIGxpc3Qgb2Ygc3ltYm9scyB3aXRoIHRoZSBzYW1lIHNjb3BlLiAqLworICAgIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHM7Cit9OworCisKKy8qKgorICoKKyAqLworc3RydWN0IF9tZXNhX3N5bWJvbF90YWJsZSB7CisgICAgLyoqIEhhc2ggdGFibGUgY29udGFpbmluZyBhbGwgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlLiAqLworICAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKKworICAgIC8qKiBUb3Agb2Ygc2NvcGUgc3RhY2suICovCisgICAgc3RydWN0IHNjb3BlX2xldmVsICpjdXJyZW50X3Njb3BlOworCisgICAgLyoqIExpc3Qgb2YgYWxsIHN5bWJvbCBoZWFkZXJzIGluIHRoZSB0YWJsZS4gKi8KKyAgICBzdHJ1Y3Qgc3ltYm9sX2hlYWRlciAqaGRyOworCisgICAgLyoqIEN1cnJlbnQgc2NvcGUgZGVwdGguICovCisgICAgdW5zaWduZWQgZGVwdGg7Cit9OworCisKK3N0YXRpYyB2b2lkCitjaGVja19zeW1ib2xfdGFibGUoc3RydWN0IF9tZXNhX3N5bWJvbF90YWJsZSAqdGFibGUpCit7CisjaWYgIWRlZmluZWQoTkRFQlVHKQorICAgIHN0cnVjdCBzY29wZV9sZXZlbCAqc2NvcGU7CisKKyAgICBmb3IgKHNjb3BlID0gdGFibGUtPmN1cnJlbnRfc2NvcGU7IHNjb3BlICE9IE5VTEw7IHNjb3BlID0gc2NvcGUtPm5leHQpIHsKKyAgICAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworCisgICAgICAgIGZvciAoc3ltID0gc2NvcGUtPnN5bWJvbHMKKyAgICAgICAgICAgICA7IHN5bSAhPSBOVUxMCisgICAgICAgICAgICAgOyBzeW0gPSBzeW0tPm5leHRfd2l0aF9zYW1lX25hbWUpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzeW1ib2xfaGVhZGVyICpjb25zdCBoZHIgPSBzeW0tPmhkcjsKKyAgICAgICAgICAgIHN0cnVjdCBzeW1ib2wgKnN5bTI7CisKKyAgICAgICAgICAgIGZvciAoc3ltMiA9IGhkci0+c3ltYm9scworICAgICAgICAgICAgICAgICA7IHN5bTIgIT0gTlVMTAorICAgICAgICAgICAgICAgICA7IHN5bTIgPSBzeW0yLT5uZXh0X3dpdGhfc2FtZV9uYW1lKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHN5bTItPmhkciA9PSBoZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICAodm9pZCkgdGFibGU7CisjZW5kaWYgLyogIWRlZmluZWQoTkRFQlVHKSAqLworfQorCit2b2lkCitfbWVzYV9zeW1ib2xfdGFibGVfcG9wX3Njb3BlKHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKnRhYmxlKQoreworICAgIHN0cnVjdCBzY29wZV9sZXZlbCAqY29uc3Qgc2NvcGUgPSB0YWJsZS0+Y3VycmVudF9zY29wZTsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzY29wZS0+c3ltYm9sczsKKworICAgIHRhYmxlLT5jdXJyZW50X3Njb3BlID0gc2NvcGUtPm5leHQ7CisgICAgdGFibGUtPmRlcHRoLS07CisKKyAgICBmcmVlKHNjb3BlKTsKKworICAgIHdoaWxlIChzeW0gIT0gTlVMTCkgeworICAgICAgICBzdHJ1Y3Qgc3ltYm9sICpjb25zdCBuZXh0ID0gc3ltLT5uZXh0X3dpdGhfc2FtZV9zY29wZTsKKyAgICAgICAgc3RydWN0IHN5bWJvbF9oZWFkZXIgKmNvbnN0IGhkciA9IHN5bS0+aGRyOworCisgICAgICAgIGFzc2VydChoZHItPnN5bWJvbHMgPT0gc3ltKTsKKworICAgICAgICBoZHItPnN5bWJvbHMgPSBzeW0tPm5leHRfd2l0aF9zYW1lX25hbWU7CisKKyAgICAgICAgZnJlZShzeW0pOworCisgICAgICAgIHN5bSA9IG5leHQ7CisgICAgfQorCisgICAgY2hlY2tfc3ltYm9sX3RhYmxlKHRhYmxlKTsKK30KKworCit2b2lkCitfbWVzYV9zeW1ib2xfdGFibGVfcHVzaF9zY29wZShzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlICp0YWJsZSkKK3sKKyAgICBzdHJ1Y3Qgc2NvcGVfbGV2ZWwgKmNvbnN0IHNjb3BlID0gY2FsbG9jKDEsIHNpemVvZigqc2NvcGUpKTsKKyAgICAKKyAgICBzY29wZS0+bmV4dCA9IHRhYmxlLT5jdXJyZW50X3Njb3BlOworICAgIHRhYmxlLT5jdXJyZW50X3Njb3BlID0gc2NvcGU7CisgICAgdGFibGUtPmRlcHRoKys7Cit9CisKKworc3RhdGljIHN0cnVjdCBzeW1ib2xfaGVhZGVyICoKK2ZpbmRfc3ltYm9sKHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKnRhYmxlLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiAoc3RydWN0IHN5bWJvbF9oZWFkZXIgKikgaGFzaF90YWJsZV9maW5kKHRhYmxlLT5odCwgbmFtZSk7Cit9CisKKworLyoqCisgKiBEZXRlcm1pbmUgdGhlIHNjb3BlICJkaXN0YW5jZSIgb2YgYSBzeW1ib2wgZnJvbSB0aGUgY3VycmVudCBzY29wZQorICoKKyAqIFxyZXR1cm4KKyAqIEEgbm9uLW5lZ2F0aXZlIG51bWJlciBmb3IgdGhlIG51bWJlciBvZiBzY29wZXMgYmV0d2VlbiB0aGUgY3VycmVudCBzY29wZQorICogYW5kIHRoZSBzY29wZSB3aGVyZSBhIHN5bWJvbCB3YXMgZGVmaW5lZC4gIEEgdmFsdWUgb2YgemVybyBtZWFucyB0aGUgY3VycmVudAorICogc2NvcGUuICBBIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0LgorICovCitpbnQKK19tZXNhX3N5bWJvbF90YWJsZV9zeW1ib2xfc2NvcGUoc3RydWN0IF9tZXNhX3N5bWJvbF90YWJsZSAqdGFibGUsCisJCQkJaW50IG5hbWVfc3BhY2UsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3RydWN0IHN5bWJvbF9oZWFkZXIgKmNvbnN0IGhkciA9IGZpbmRfc3ltYm9sKHRhYmxlLCBuYW1lKTsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgICBpZiAoaGRyICE9IE5VTEwpIHsKKyAgICAgICBmb3IgKHN5bSA9IGhkci0+c3ltYm9sczsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bS0+bmV4dF93aXRoX3NhbWVfbmFtZSkgeworCSAgYXNzZXJ0KHN5bS0+aGRyID09IGhkcik7CisKKwkgIGlmICgobmFtZV9zcGFjZSA9PSAtMSkgfHwgKHN5bS0+bmFtZV9zcGFjZSA9PSBuYW1lX3NwYWNlKSkgeworCSAgICAgYXNzZXJ0KHN5bS0+ZGVwdGggPD0gdGFibGUtPmRlcHRoKTsKKwkgICAgIHJldHVybiBzeW0tPmRlcHRoIC0gdGFibGUtPmRlcHRoOworCSAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKwordm9pZCAqCitfbWVzYV9zeW1ib2xfdGFibGVfZmluZF9zeW1ib2woc3RydWN0IF9tZXNhX3N5bWJvbF90YWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hbWVfc3BhY2UsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3RydWN0IHN5bWJvbF9oZWFkZXIgKmNvbnN0IGhkciA9IGZpbmRfc3ltYm9sKHRhYmxlLCBuYW1lKTsKKworICAgIGlmIChoZHIgIT0gTlVMTCkgeworICAgICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKworICAgICAgICBmb3IgKHN5bSA9IGhkci0+c3ltYm9sczsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bS0+bmV4dF93aXRoX3NhbWVfbmFtZSkgeworICAgICAgICAgICAgYXNzZXJ0KHN5bS0+aGRyID09IGhkcik7CisKKyAgICAgICAgICAgIGlmICgobmFtZV9zcGFjZSA9PSAtMSkgfHwgKHN5bS0+bmFtZV9zcGFjZSA9PSBuYW1lX3NwYWNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzeW0tPmRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitpbnQKK19tZXNhX3N5bWJvbF90YWJsZV9hZGRfc3ltYm9sKHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hbWVfc3BhY2UsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkZWNsYXJhdGlvbikKK3sKKyAgICBzdHJ1Y3Qgc3ltYm9sX2hlYWRlciAqaGRyOworICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICAgIGNoZWNrX3N5bWJvbF90YWJsZSh0YWJsZSk7CisKKyAgICBoZHIgPSBmaW5kX3N5bWJvbCh0YWJsZSwgbmFtZSk7CisKKyAgICBjaGVja19zeW1ib2xfdGFibGUodGFibGUpOworCisgICAgaWYgKGhkciA9PSBOVUxMKSB7CisgICAgICAgaGRyID0gY2FsbG9jKDEsIHNpemVvZigqaGRyKSk7CisgICAgICAgaGRyLT5uYW1lID0gc3RyZHVwKG5hbWUpOworCisgICAgICAgaGFzaF90YWJsZV9pbnNlcnQodGFibGUtPmh0LCBoZHIsIGhkci0+bmFtZSk7CisgICAgICAgaGRyLT5uZXh0ID0gdGFibGUtPmhkcjsKKyAgICAgICB0YWJsZS0+aGRyID0gaGRyOworICAgIH0KKworICAgIGNoZWNrX3N5bWJvbF90YWJsZSh0YWJsZSk7CisKKyAgICAvKiBJZiB0aGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgbmFtZXNwYWNlIGF0IHRoaXMgc2NvcGUsIGl0IGNhbm5vdAorICAgICAqIGJlIGFkZGVkIHRvIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBmb3IgKHN5bSA9IGhkci0+c3ltYm9scworCSA7IChzeW0gIT0gTlVMTCkgJiYgKHN5bS0+bmFtZV9zcGFjZSAhPSBuYW1lX3NwYWNlKQorCSA7IHN5bSA9IHN5bS0+bmV4dF93aXRoX3NhbWVfbmFtZSkgeworICAgICAgIC8qIGVtcHR5ICovCisgICAgfQorCisgICAgaWYgKHN5bSAmJiAoc3ltLT5kZXB0aCA9PSB0YWJsZS0+ZGVwdGgpKQorICAgICAgIHJldHVybiAtMTsKKworICAgIHN5bSA9IGNhbGxvYygxLCBzaXplb2YoKnN5bSkpOworICAgIHN5bS0+bmV4dF93aXRoX3NhbWVfbmFtZSA9IGhkci0+c3ltYm9sczsKKyAgICBzeW0tPm5leHRfd2l0aF9zYW1lX3Njb3BlID0gdGFibGUtPmN1cnJlbnRfc2NvcGUtPnN5bWJvbHM7CisgICAgc3ltLT5oZHIgPSBoZHI7CisgICAgc3ltLT5uYW1lX3NwYWNlID0gbmFtZV9zcGFjZTsKKyAgICBzeW0tPmRhdGEgPSBkZWNsYXJhdGlvbjsKKyAgICBzeW0tPmRlcHRoID0gdGFibGUtPmRlcHRoOworCisgICAgYXNzZXJ0KHN5bS0+aGRyID09IGhkcik7CisKKyAgICBoZHItPnN5bWJvbHMgPSBzeW07CisgICAgdGFibGUtPmN1cnJlbnRfc2NvcGUtPnN5bWJvbHMgPSBzeW07CisKKyAgICBjaGVja19zeW1ib2xfdGFibGUodGFibGUpOworICAgIHJldHVybiAwOworfQorCisKK2ludAorX21lc2Ffc3ltYm9sX3RhYmxlX2FkZF9nbG9iYWxfc3ltYm9sKHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKnRhYmxlLAorCQkJCSAgICAgaW50IG5hbWVfc3BhY2UsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICB2b2lkICpkZWNsYXJhdGlvbikKK3sKKyAgICBzdHJ1Y3Qgc3ltYm9sX2hlYWRlciAqaGRyOworICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpjdXJyOworICAgIHN0cnVjdCBzY29wZV9sZXZlbCAqdG9wX3Njb3BlOworCisgICAgY2hlY2tfc3ltYm9sX3RhYmxlKHRhYmxlKTsKKworICAgIGhkciA9IGZpbmRfc3ltYm9sKHRhYmxlLCBuYW1lKTsKKworICAgIGNoZWNrX3N5bWJvbF90YWJsZSh0YWJsZSk7CisKKyAgICBpZiAoaGRyID09IE5VTEwpIHsKKyAgICAgICAgaGRyID0gY2FsbG9jKDEsIHNpemVvZigqaGRyKSk7CisgICAgICAgIGhkci0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKworICAgICAgICBoYXNoX3RhYmxlX2luc2VydCh0YWJsZS0+aHQsIGhkciwgaGRyLT5uYW1lKTsKKyAgICAgICAgaGRyLT5uZXh0ID0gdGFibGUtPmhkcjsKKyAgICAgICAgdGFibGUtPmhkciA9IGhkcjsKKyAgICB9CisKKyAgICBjaGVja19zeW1ib2xfdGFibGUodGFibGUpOworCisgICAgLyogSWYgdGhlIHN5bWJvbCBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG5hbWVzcGFjZSBhdCB0aGlzIHNjb3BlLCBpdCBjYW5ub3QKKyAgICAgKiBiZSBhZGRlZCB0byB0aGUgdGFibGUuCisgICAgICovCisgICAgZm9yIChzeW0gPSBoZHItPnN5bWJvbHMKKwkgOyAoc3ltICE9IE5VTEwpICYmIChzeW0tPm5hbWVfc3BhY2UgIT0gbmFtZV9zcGFjZSkKKwkgOyBzeW0gPSBzeW0tPm5leHRfd2l0aF9zYW1lX25hbWUpIHsKKyAgICAgICAvKiBlbXB0eSAqLworICAgIH0KKworICAgIGlmIChzeW0gJiYgc3ltLT5kZXB0aCA9PSAwKQorICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIEZpbmQgdGhlIHRvcC1sZXZlbCBzY29wZSAqLworICAgIGZvciAodG9wX3Njb3BlID0gdGFibGUtPmN1cnJlbnRfc2NvcGUKKwkgOyB0b3Bfc2NvcGUtPm5leHQgIT0gTlVMTAorCSA7IHRvcF9zY29wZSA9IHRvcF9zY29wZS0+bmV4dCkgeworICAgICAgIC8qIGVtcHR5ICovCisgICAgfQorCisgICAgc3ltID0gY2FsbG9jKDEsIHNpemVvZigqc3ltKSk7CisgICAgc3ltLT5uZXh0X3dpdGhfc2FtZV9zY29wZSA9IHRvcF9zY29wZS0+c3ltYm9sczsKKyAgICBzeW0tPmhkciA9IGhkcjsKKyAgICBzeW0tPm5hbWVfc3BhY2UgPSBuYW1lX3NwYWNlOworICAgIHN5bS0+ZGF0YSA9IGRlY2xhcmF0aW9uOworCisgICAgYXNzZXJ0KHN5bS0+aGRyID09IGhkcik7CisKKyAgICAvKiBTaW5jZSBuZXh0X3dpdGhfc2FtZV9uYW1lIGlzIG9yZGVyZWQgYnkgc2NvcGUsIHdlIG5lZWQgdG8gYXBwZW5kIHRoZQorICAgICAqIG5ldyBzeW1ib2wgdG8gdGhlIF9lbmRfIG9mIHRoZSBsaXN0LgorICAgICAqLworICAgIGlmIChoZHItPnN5bWJvbHMgPT0gTlVMTCkgeworICAgICAgIGhkci0+c3ltYm9scyA9IHN5bTsKKyAgICB9IGVsc2UgeworICAgICAgIGZvciAoY3VyciA9IGhkci0+c3ltYm9scworCSAgICA7IGN1cnItPm5leHRfd2l0aF9zYW1lX25hbWUgIT0gTlVMTAorCSAgICA7IGN1cnIgPSBjdXJyLT5uZXh0X3dpdGhfc2FtZV9uYW1lKSB7CisJICAvKiBlbXB0eSAqLworICAgICAgIH0KKyAgICAgICBjdXJyLT5uZXh0X3dpdGhfc2FtZV9uYW1lID0gc3ltOworICAgIH0KKyAgICB0b3Bfc2NvcGUtPnN5bWJvbHMgPSBzeW07CisKKyAgICBjaGVja19zeW1ib2xfdGFibGUodGFibGUpOworICAgIHJldHVybiAwOworfQorCisKKworc3RydWN0IF9tZXNhX3N5bWJvbF90YWJsZSAqCitfbWVzYV9zeW1ib2xfdGFibGVfY3Rvcih2b2lkKQoreworICAgIHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKnRhYmxlID0gY2FsbG9jKDEsIHNpemVvZigqdGFibGUpKTsKKworICAgIGlmICh0YWJsZSAhPSBOVUxMKSB7CisgICAgICAgdGFibGUtPmh0ID0gaGFzaF90YWJsZV9jdG9yKDMyLCBoYXNoX3RhYmxlX3N0cmluZ19oYXNoLAorCQkJCSAgIGhhc2hfdGFibGVfc3RyaW5nX2NvbXBhcmUpOworCisgICAgICAgX21lc2Ffc3ltYm9sX3RhYmxlX3B1c2hfc2NvcGUodGFibGUpOworICAgIH0KKworICAgIHJldHVybiB0YWJsZTsKK30KKworCit2b2lkCitfbWVzYV9zeW1ib2xfdGFibGVfZHRvcihzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlICp0YWJsZSkKK3sKKyAgIHN0cnVjdCBzeW1ib2xfaGVhZGVyICpoZHI7CisgICBzdHJ1Y3Qgc3ltYm9sX2hlYWRlciAqbmV4dDsKKworICAgd2hpbGUgKHRhYmxlLT5jdXJyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9wb3Bfc2NvcGUodGFibGUpOworICAgfQorCisgICBmb3IgKGhkciA9IHRhYmxlLT5oZHI7IGhkciAhPSBOVUxMOyBoZHIgPSBuZXh0KSB7CisgICAgICAgbmV4dCA9IGhkci0+bmV4dDsKKyAgICAgICBmcmVlKGhkci0+bmFtZSk7CisgICAgICAgZnJlZShoZHIpOworICAgfQorCisgICBoYXNoX3RhYmxlX2R0b3IodGFibGUtPmh0KTsKKyAgIGZyZWUodGFibGUpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvcHJvZ3JhbS9zeW1ib2xfdGFibGUuaCBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vc3ltYm9sX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyN2Y0NwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9tZXNhLXV0aWxzL3NyYy9tZXNhL3Byb2dyYW0vc3ltYm9sX3RhYmxlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIE1FU0FfU1lNQk9MX1RBQkxFX0gKKyNkZWZpbmUgTUVTQV9TWU1CT0xfVEFCTEVfSAorCitzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlOworCitleHRlcm4gdm9pZCBfbWVzYV9zeW1ib2xfdGFibGVfcHVzaF9zY29wZShzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlICp0YWJsZSk7CisKK2V4dGVybiB2b2lkIF9tZXNhX3N5bWJvbF90YWJsZV9wb3Bfc2NvcGUoc3RydWN0IF9tZXNhX3N5bWJvbF90YWJsZSAqdGFibGUpOworCitleHRlcm4gaW50IF9tZXNhX3N5bWJvbF90YWJsZV9hZGRfc3ltYm9sKHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKnN5bXRhYiwKKyAgICBpbnQgbmFtZV9zcGFjZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGVjbGFyYXRpb24pOworCitleHRlcm4gaW50IF9tZXNhX3N5bWJvbF90YWJsZV9hZGRfZ2xvYmFsX3N5bWJvbCgKKyAgICBzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlICpzeW10YWIsIGludCBuYW1lX3NwYWNlLCBjb25zdCBjaGFyICpuYW1lLAorICAgIHZvaWQgKmRlY2xhcmF0aW9uKTsKKworZXh0ZXJuIGludCBfbWVzYV9zeW1ib2xfdGFibGVfc3ltYm9sX3Njb3BlKHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKnRhYmxlLAorICAgIGludCBuYW1lX3NwYWNlLCBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgKl9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbCgKKyAgICBzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlICpzeW10YWIsIGludCBuYW1lX3NwYWNlLCBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHN0cnVjdCBfbWVzYV9zeW1ib2xfdGFibGUgKl9tZXNhX3N5bWJvbF90YWJsZV9jdG9yKHZvaWQpOworCitleHRlcm4gdm9pZCBfbWVzYV9zeW1ib2xfdGFibGVfZHRvcihzdHJ1Y3QgX21lc2Ffc3ltYm9sX3RhYmxlICopOworCisjZW5kaWYgLyogTUVTQV9TWU1CT0xfVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ibG9ycC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ibG9ycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTdhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2Jsb3JwLmgKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9taXBtYXBfdHJlZS5oIgorCitzdHJ1Y3QgYnJ3X2NvbnRleHQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZAorYnJ3X2Jsb3JwX2JsaXRfbWlwdHJlZXMoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKnNyY19tdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNyY19sZXZlbCwgdW5zaWduZWQgc3JjX2xheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICpkc3RfbXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBkc3RfbGV2ZWwsIHVuc2lnbmVkIGRzdF9sYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNyY194MCwgZmxvYXQgc3JjX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3JjX3gxLCBmbG9hdCBzcmNfeTEsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkc3RfeDAsIGZsb2F0IGRzdF95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRzdF94MSwgZmxvYXQgZHN0X3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZpbHRlciwgYm9vbCBtaXJyb3JfeCwgYm9vbCBtaXJyb3JfeSk7CisKK2Jvb2wKK2Jyd19ibG9ycF9jbGVhcl9jb2xvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiwKKyAgICAgICAgICAgICAgICAgICAgICBHTGJpdGZpZWxkIG1hc2ssIGJvb2wgcGFydGlhbF9jbGVhcik7CisKK3ZvaWQKK2Jyd19ibG9ycF9yZXNvbHZlX2NvbG9yKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworCisvKioKKyAqIEJpbmRpbmcgdGFibGUgaW5kaWNlcyB1c2VkIGJ5IEJMT1JQLgorICovCitlbnVtIHsKKyAgIEJSV19CTE9SUF9URVhUVVJFX0JJTkRJTkdfVEFCTEVfSU5ERVgsCisgICBCUldfQkxPUlBfUkVOREVSQlVGRkVSX0JJTkRJTkdfVEFCTEVfSU5ERVgsCisgICBCUldfQkxPUlBfTlVNX0JJTkRJTkdfVEFCTEVfRU5UUklFUworfTsKKworCitjbGFzcyBicndfYmxvcnBfbWlwX2luZm8KK3sKK3B1YmxpYzoKKyAgIGJyd19ibG9ycF9taXBfaW5mbygpOworCisgICB2b2lkIHNldChzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgdW5zaWduZWQgaW50IGxldmVsLCB1bnNpZ25lZCBpbnQgbGF5ZXIpOworCisgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10OworCisgICAvKioKKyAgICAqIFRoZSBtaXBsZXZlbCB0byB1c2UuCisgICAgKi8KKyAgIHVpbnQzMl90IGxldmVsOworCisgICAvKioKKyAgICAqIFRoZSAyRCBsYXllciB3aXRoaW4gdGhlIG1pcGxldmVsLiBDb21iaW5lZCwgbGV2ZWwgYW5kIGxheWVyIGRlZmluZSB0aGUKKyAgICAqIDJEIG1pcHRyZWUgc2xpY2UgdG8gdXNlLgorICAgICoKKyAgICAqIE5vdGU6IGlmIG10IGlzIGEgMkQgbXVsdGlzYW1wbGUgYXJyYXkgdGV4dHVyZSBvbiBHZW43KyB1c2luZworICAgICogSU5URUxfTVNBQV9MQVlPVVRfVU1TIG9yIElOVEVMX01TQUFfTEFZT1VUX0NNUywgbGF5ZXIgaXMgdGhlIHBoeXNpY2FsCisgICAgKiBsYXllciBob2xkaW5nIHNhbXBsZSAwLiAgU28sIGZvciBleGFtcGxlLCBpZiBtdC0+bnVtX3NhbXBsZXMgPT0gNCwgdGhlbgorICAgICogbG9naWNhbCBsYXllciBuIGNvcnJlc3BvbmRzIHRvIGxheWVyID09IDQqbi4KKyAgICAqLworICAgdWludDMyX3QgbGF5ZXI7CisKKyAgIC8qKgorICAgICogV2lkdGggb2YgdGhlIG1pcGxldmVsIHRvIGJlIHVzZWQuICBGb3Igc3VyZmFjZXMgdXNpbmcKKyAgICAqIElOVEVMX01TQUFfTEFZT1VUX0lNUywgdGhpcyBpcyBtZWFzdXJlZCBpbiBzYW1wbGVzLCBub3QgcGl4ZWxzLgorICAgICovCisgICB1aW50MzJfdCB3aWR0aDsKKworICAgLyoqCisgICAgKiBIZWlnaHQgb2YgdGhlIG1pcGxldmVsIHRvIGJlIHVzZWQuICBGb3Igc3VyZmFjZXMgdXNpbmcKKyAgICAqIElOVEVMX01TQUFfTEFZT1VUX0lNUywgdGhpcyBpcyBtZWFzdXJlZCBpbiBzYW1wbGVzLCBub3QgcGl4ZWxzLgorICAgICovCisgICB1aW50MzJfdCBoZWlnaHQ7CisKKyAgIC8qKgorICAgICogWCBvZmZzZXQgd2l0aGluIHRoZSBzdXJmYWNlIHRvIHRleHR1cmUgZnJvbSAob3IgcmVuZGVyIHRvKS4gIEZvcgorICAgICogc3VyZmFjZXMgdXNpbmcgSU5URUxfTVNBQV9MQVlPVVRfSU1TLCB0aGlzIGlzIG1lYXN1cmVkIGluIHNhbXBsZXMsIG5vdAorICAgICogcGl4ZWxzLgorICAgICovCisgICB1aW50MzJfdCB4X29mZnNldDsKKworICAgLyoqCisgICAgKiBZIG9mZnNldCB3aXRoaW4gdGhlIHN1cmZhY2UgdG8gdGV4dHVyZSBmcm9tIChvciByZW5kZXIgdG8pLiAgRm9yCisgICAgKiBzdXJmYWNlcyB1c2luZyBJTlRFTF9NU0FBX0xBWU9VVF9JTVMsIHRoaXMgaXMgbWVhc3VyZWQgaW4gc2FtcGxlcywgbm90CisgICAgKiBwaXhlbHMuCisgICAgKi8KKyAgIHVpbnQzMl90IHlfb2Zmc2V0OworfTsKKworY2xhc3MgYnJ3X2Jsb3JwX3N1cmZhY2VfaW5mbyA6IHB1YmxpYyBicndfYmxvcnBfbWlwX2luZm8KK3sKK3B1YmxpYzoKKyAgIGJyd19ibG9ycF9zdXJmYWNlX2luZm8oKTsKKworICAgdm9pZCBzZXQoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgdW5zaWduZWQgaW50IGxldmVsLCB1bnNpZ25lZCBpbnQgbGF5ZXIsCisgICAgICAgICAgICBib29sIGlzX3JlbmRlcl90YXJnZXQpOworCisgICB1aW50MzJfdCBjb21wdXRlX3RpbGVfb2Zmc2V0cyh1aW50MzJfdCAqdGlsZV94LCB1aW50MzJfdCAqdGlsZV95KSBjb25zdDsKKworICAgLyogU2V0dGluZyB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlcidzIGNvbnRlbnRzIGFyZSBXLXRpbGVkCisgICAgKiBzdGVuY2lsIGRhdGEsIGJ1dCB0aGUgc3VyZmFjZSBzdGF0ZSBzaG91bGQgYmUgc2V0IHVwIGZvciBZIHRpbGVkCisgICAgKiBNRVNBX0ZPUk1BVF9SX1VOT1JNOCBkYXRhICh0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHN1cmZhY2Ugc3RhdGVzIGRvbid0CisgICAgKiBzdXBwb3J0IFcgdGlsaW5nKS4KKyAgICAqCisgICAgKiBTaW5jZSBXIHRpbGVzIGFyZSA2NCBwaXhlbHMgd2lkZSBieSA2NCBwaXhlbHMgaGlnaCwgd2hlcmVhcyBZIHRpbGVzIG9mCisgICAgKiBNRVNBX0ZPUk1BVF9SX1VOT1JNOCBkYXRhIGFyZSAxMjggcGl4ZWxzIHdpZGUgYnkgMzIgcGl4ZWxzIGhpZ2gsIHRoZSB3aWR0aCBhbmQKKyAgICAqIHBpdGNoIHN0b3JlZCBpbiB0aGUgc3VyZmFjZSBzdGF0ZSB3aWxsIGJlIG11bHRpcGxpZWQgYnkgMiwgYW5kIHRoZQorICAgICogaGVpZ2h0IHdpbGwgYmUgaGFsdmVkLiAgQWxzbywgc2luY2UgVyBhbmQgWSB0aWxlcyBzdG9yZSB0aGVpciBkYXRhIGluIGEKKyAgICAqIGRpZmZlcmVudCBvcmRlciwgdGhlIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBiZSByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUKKyAgICAqIG9mIHRoZSB0aWxlIHNpemUsIHRvIGVuc3VyZSB0aGF0IHRoZSBXTSBwcm9ncmFtIGNhbiBhY2Nlc3MgdGhlIGZ1bGwKKyAgICAqIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJ1ZmZlci4KKyAgICAqLworICAgYm9vbCBtYXBfc3RlbmNpbF9hc195X3RpbGVkOworCisgICB1bnNpZ25lZCBudW1fc2FtcGxlczsKKworICAgLyogU2V0dGluZyB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHN1cmZhY2Ugc2hvdWxkIGJlIHNldCB1cCBpbgorICAgICogQVJZU1BDX0xPRDAgbW9kZS4gIElnbm9yZWQgcHJpb3IgdG8gR2VuNy4KKyAgICAqLworICAgYm9vbCBhcnJheV9zcGFjaW5nX2xvZDA7CisKKyAgIC8qKgorICAgICogRm9ybWF0IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBzZXR0aW5nIHVwIHRoZSBzdXJmYWNlIHN0YXRlIGZvciB0aGlzCisgICAgKiBzdXJmYWNlLiAgU2hvdWxkIGNvcnJlc3BvbmQgdG8gb25lIG9mIHRoZSBCUldfU1VSRkFDRUZPUk1BVF8qIGVudW1zLgorICAgICovCisgICB1aW50MzJfdCBicndfc3VyZmFjZWZvcm1hdDsKKworICAgLyoqCisgICAgKiBGb3IgTVNBQSBzdXJmYWNlcywgTVNBQSBsYXlvdXQgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHNldHRpbmcgdXAgdGhlCisgICAgKiBzdXJmYWNlIHN0YXRlIGZvciB0aGlzIHN1cmZhY2UuCisgICAgKi8KKyAgIGludGVsX21zYWFfbGF5b3V0IG1zYWFfbGF5b3V0OworfTsKKworCitzdHJ1Y3QgYnJ3X2Jsb3JwX2Nvb3JkX3RyYW5zZm9ybV9wYXJhbXMKK3sKKyAgIHZvaWQgc2V0dXAoR0xmbG9hdCBzcmMwLCBHTGZsb2F0IHNyYzEsIEdMZmxvYXQgZHN0MCwgR0xmbG9hdCBkc3QxLAorICAgICAgICAgICAgICBib29sIG1pcnJvcik7CisKKyAgIGZsb2F0IG11bHRpcGxpZXI7CisgICBmbG9hdCBvZmZzZXQ7Cit9OworCisKK3N0cnVjdCBicndfYmxvcnBfd21fcHVzaF9jb25zdGFudHMKK3sKKyAgIHVpbnQzMl90IGRzdF94MDsKKyAgIHVpbnQzMl90IGRzdF94MTsKKyAgIHVpbnQzMl90IGRzdF95MDsKKyAgIHVpbnQzMl90IGRzdF95MTsKKyAgIC8qIFRvcCByaWdodCBjb29yZGluYXRlcyBvZiB0aGUgcmVjdGFuZ3VsYXIgZ3JpZCB1c2VkIGZvciBzY2FsZWQgYmxpdHRpbmcgKi8KKyAgIGZsb2F0IHJlY3RfZ3JpZF94MTsKKyAgIGZsb2F0IHJlY3RfZ3JpZF95MTsKKyAgIGJyd19ibG9ycF9jb29yZF90cmFuc2Zvcm1fcGFyYW1zIHhfdHJhbnNmb3JtOworICAgYnJ3X2Jsb3JwX2Nvb3JkX3RyYW5zZm9ybV9wYXJhbXMgeV90cmFuc2Zvcm07CisgICAvKiBQYWQgb3V0IHRvIGFuIGludGVncmFsIG51bWJlciBvZiByZWdpc3RlcnMgKi8KKyAgIHVpbnQzMl90IHBhZFs2XTsKK307CisKKy8qIEV2ZXJ5IDMyIGJ5dGVzIG9mIHB1c2ggY29uc3RhbnQgZGF0YSBjb25zdGl0dXRlcyBvbmUgR0VOIHJlZ2lzdGVyLiAqLworY29uc3QgdW5zaWduZWQgaW50IEJSV19CTE9SUF9OVU1fUFVTSF9DT05TVF9SRUdTID0KKyAgIHNpemVvZihicndfYmxvcnBfd21fcHVzaF9jb25zdGFudHMpIC8gMzI7CisKK3N0cnVjdCBicndfYmxvcnBfcHJvZ19kYXRhCit7CisgICB1bnNpZ25lZCBpbnQgZmlyc3RfY3VyYmVfZ3JmOworCisgICAvKioKKyAgICAqIFRydWUgaWYgdGhlIFdNIHByb2dyYW0gc2hvdWxkIGJlIHJ1biBpbiBNU0RJU1BNT0RFX1BFUlNBTVBMRSB3aXRoIG1vcmUKKyAgICAqIHRoYW4gb25lIHNhbXBsZSBwZXIgcGl4ZWwuCisgICAgKi8KKyAgIGJvb2wgcGVyc2FtcGxlX21zYWFfZGlzcGF0Y2g7Cit9OworCisKK2VudW0gZ2VuN19mYXN0X2NsZWFyX29wIHsKKyAgIEdFTjdfRkFTVF9DTEVBUl9PUF9OT05FLAorICAgR0VON19GQVNUX0NMRUFSX09QX0ZBU1RfQ0xFQVIsCisgICBHRU43X0ZBU1RfQ0xFQVJfT1BfUkVTT0xWRSwKK307CisKKworY2xhc3MgYnJ3X2Jsb3JwX3BhcmFtcworeworcHVibGljOgorICAgYnJ3X2Jsb3JwX3BhcmFtcygpOworCisgICB2aXJ0dWFsIHVpbnQzMl90IGdldF93bV9wcm9nKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicndfYmxvcnBfcHJvZ19kYXRhICoqcHJvZ19kYXRhKSBjb25zdCA9IDA7CisKKyAgIHVpbnQzMl90IHgwOworICAgdWludDMyX3QgeTA7CisgICB1aW50MzJfdCB4MTsKKyAgIHVpbnQzMl90IHkxOworICAgYnJ3X2Jsb3JwX21pcF9pbmZvIGRlcHRoOworICAgdWludDMyX3QgZGVwdGhfZm9ybWF0OworICAgYnJ3X2Jsb3JwX3N1cmZhY2VfaW5mbyBzcmM7CisgICBicndfYmxvcnBfc3VyZmFjZV9pbmZvIGRzdDsKKyAgIGVudW0gZ2VuNl9oaXpfb3AgaGl6X29wOworICAgZW51bSBnZW43X2Zhc3RfY2xlYXJfb3AgZmFzdF9jbGVhcl9vcDsKKyAgIGJvb2wgdXNlX3dtX3Byb2c7CisgICBicndfYmxvcnBfd21fcHVzaF9jb25zdGFudHMgd21fcHVzaF9jb25zdHM7CisgICBib29sIGNvbG9yX3dyaXRlX2Rpc2FibGVbNF07Cit9OworCisKK3ZvaWQKK2Jyd19ibG9ycF9leGVjKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBjb25zdCBicndfYmxvcnBfcGFyYW1zICpwYXJhbXMpOworCisKKy8qKgorICogUGFyYW1ldGVycyBmb3IgYSBIaVogb3IgZGVwdGggcmVzb2x2ZSBvcGVyYXRpb24uCisgKgorICogRm9yIGFuIG92ZXJ2aWV3IG9mIEhpWiBvcHMsIHNlZSB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIG9mIHRoZSBTYW5keSBCcmlkZ2UKKyAqIFBSTSwgVm9sdW1lIDEsIFBhcnQgMjoKKyAqICAgLSA3LjUuMy4xIERlcHRoIEJ1ZmZlciBDbGVhcgorICogICAtIDcuNS4zLjIgRGVwdGggQnVmZmVyIFJlc29sdmUKKyAqICAgLSA3LjUuMy4zIEhpZXJhcmNoaWNhbCBEZXB0aCBCdWZmZXIgUmVzb2x2ZQorICovCitjbGFzcyBicndfaGl6X29wX3BhcmFtcyA6IHB1YmxpYyBicndfYmxvcnBfcGFyYW1zCit7CitwdWJsaWM6CisgICBicndfaGl6X29wX3BhcmFtcyhzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxldmVsLCB1bnNpZ25lZCBpbnQgbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICBnZW42X2hpel9vcCBvcCk7CisKKyAgIHZpcnR1YWwgdWludDMyX3QgZ2V0X3dtX3Byb2coc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyd19ibG9ycF9wcm9nX2RhdGEgKipwcm9nX2RhdGEpIGNvbnN0OworfTsKKworc3RydWN0IGJyd19ibG9ycF9ibGl0X3Byb2dfa2V5Cit7CisgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCBpbiB0aGUgc3VyZmFjZQorICAgICogc3RhdGUgZm9yIHRleHR1cmluZyBmcm9tLgorICAgICovCisgICB1bnNpZ25lZCB0ZXhfc2FtcGxlczsKKworICAgLyogTVNBQSBsYXlvdXQgdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIGluIHRoZSBzdXJmYWNlIHN0YXRlIGZvciB0ZXh0dXJpbmcKKyAgICAqIGZyb20uCisgICAgKi8KKyAgIGludGVsX21zYWFfbGF5b3V0IHRleF9sYXlvdXQ7CisKKyAgIC8qIEFjdHVhbCBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwgaW4gdGhlIHNvdXJjZSBpbWFnZS4gKi8KKyAgIHVuc2lnbmVkIHNyY19zYW1wbGVzOworCisgICAvKiBBY3R1YWwgTVNBQSBsYXlvdXQgdXNlZCBieSB0aGUgc291cmNlIGltYWdlLiAqLworICAgaW50ZWxfbXNhYV9sYXlvdXQgc3JjX2xheW91dDsKKworICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsIHRoYXQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgaW4gdGhlIHJlbmRlcgorICAgICogdGFyZ2V0LgorICAgICovCisgICB1bnNpZ25lZCBydF9zYW1wbGVzOworCisgICAvKiBNU0FBIGxheW91dCB0aGF0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4gdGhlIHJlbmRlciB0YXJnZXQuICovCisgICBpbnRlbF9tc2FhX2xheW91dCBydF9sYXlvdXQ7CisKKyAgIC8qIEFjdHVhbCBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwgaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlLiAqLworICAgdW5zaWduZWQgZHN0X3NhbXBsZXM7CisKKyAgIC8qIEFjdHVhbCBNU0FBIGxheW91dCB1c2VkIGJ5IHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4gKi8KKyAgIGludGVsX21zYWFfbGF5b3V0IGRzdF9sYXlvdXQ7CisKKyAgIC8qIFR5cGUgb2YgdGhlIGRhdGEgdG8gYmUgcmVhZCBmcm9tIHRoZSB0ZXh0dXJlIChvbmUgb2YKKyAgICAqIEJSV19SRUdJU1RFUl9UWVBFX3tVRCxELEZ9KS4KKyAgICAqLworICAgdW5zaWduZWQgdGV4dHVyZV9kYXRhX3R5cGU7CisKKyAgIC8qIFRydWUgaWYgdGhlIHNvdXJjZSBpbWFnZSBpcyBXIHRpbGVkLiAgSWYgdHJ1ZSwgdGhlIHN1cmZhY2Ugc3RhdGUgZm9yIHRoZQorICAgICogc291cmNlIGltYWdlIG11c3QgYmUgY29uZmlndXJlZCBhcyBZIHRpbGVkLCBhbmQgdGV4X3NhbXBsZXMgbXVzdCBiZSAwLgorICAgICovCisgICBib29sIHNyY190aWxlZF93OworCisgICAvKiBUcnVlIGlmIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBpcyBXIHRpbGVkLiAgSWYgdHJ1ZSwgdGhlIHN1cmZhY2Ugc3RhdGUKKyAgICAqIGZvciB0aGUgcmVuZGVyIHRhcmdldCBtdXN0IGJlIGNvbmZpZ3VyZWQgYXMgWSB0aWxlZCwgYW5kIHJ0X3NhbXBsZXMgbXVzdAorICAgICogYmUgMC4KKyAgICAqLworICAgYm9vbCBkc3RfdGlsZWRfdzsKKworICAgLyogVHJ1ZSBpZiBhbGwgc291cmNlIHNhbXBsZXMgc2hvdWxkIGJlIGJsZW5kZWQgdG9nZXRoZXIgdG8gcHJvZHVjZSBlYWNoCisgICAgKiBkZXN0aW5hdGlvbiBwaXhlbC4gIElmIHRydWUsIHNyY190aWxlZF93IG11c3QgYmUgZmFsc2UsIHRleF9zYW1wbGVzIG11c3QKKyAgICAqIGVxdWFsIHNyY19zYW1wbGVzLCBhbmQgdGV4X3NhbXBsZXMgbXVzdCBiZSBub256ZXJvLgorICAgICovCisgICBib29sIGJsZW5kOworCisgICAvKiBUcnVlIGlmIHRoZSByZWN0YW5nbGUgYmVpbmcgc2VudCB0aHJvdWdoIHRoZSByZW5kZXJpbmcgcGlwZWxpbmUgbWlnaHQgYmUKKyAgICAqIGxhcmdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUsIHNvIHRoZSBXTSBwcm9ncmFtIHNob3VsZCBraWxsIGFueQorICAgICogcGl4ZWxzIHRoYXQgYXJlIG91dHNpZGUgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZS4KKyAgICAqLworICAgYm9vbCB1c2Vfa2lsbDsKKworICAgLyoqCisgICAgKiBUcnVlIGlmIHRoZSBXTSBwcm9ncmFtIHNob3VsZCBiZSBydW4gaW4gTVNESVNQTU9ERV9QRVJTQU1QTEUgd2l0aCBtb3JlCisgICAgKiB0aGFuIG9uZSBzYW1wbGUgcGVyIHBpeGVsLgorICAgICovCisgICBib29sIHBlcnNhbXBsZV9tc2FhX2Rpc3BhdGNoOworCisgICAvKiBUcnVlIGZvciBzY2FsZWQgYmxpdHRpbmcuICovCisgICBib29sIGJsaXRfc2NhbGVkOworCisgICAvKiBTY2FsZSBmYWN0b3JzIGJldHdlZW4gdGhlIHBpeGVsIGdyaWQgYW5kIHRoZSBncmlkIG9mIHNhbXBsZXMuIFdlJ3JlCisgICAgKiB1c2luZyBncmlkIG9mIHNhbXBsZXMgZm9yIGJpbGluZWFyIGZpbGV0cmluZyBpbiBtdWx0aXNhbXBsZSBzY2FsZWQgYmxpdHMuCisgICAgKi8KKyAgIGZsb2F0IHhfc2NhbGU7CisgICBmbG9hdCB5X3NjYWxlOworCisgICAvKiBUcnVlIGZvciBibGl0cyB3aXRoIGZpbHRlciA9IEdMX0xJTkVBUi4gKi8KKyAgIGJvb2wgYmlsaW5lYXJfZmlsdGVyOworfTsKKworY2xhc3MgYnJ3X2Jsb3JwX2JsaXRfcGFyYW1zIDogcHVibGljIGJyd19ibG9ycF9wYXJhbXMKK3sKK3B1YmxpYzoKKyAgIGJyd19ibG9ycF9ibGl0X3BhcmFtcyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKnNyY19tdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzcmNfbGV2ZWwsIHVuc2lnbmVkIHNyY19sYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmRzdF9tdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBkc3RfbGV2ZWwsIHVuc2lnbmVkIGRzdF9sYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHNyY194MCwgR0xmbG9hdCBzcmNfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCBzcmNfeDEsIEdMZmxvYXQgc3JjX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgZHN0X3gwLCBHTGZsb2F0IGRzdF95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IGRzdF94MSwgR0xmbG9hdCBkc3RfeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZpbHRlciwgYm9vbCBtaXJyb3JfeCwgYm9vbCBtaXJyb3JfeSk7CisKKyAgIHZpcnR1YWwgdWludDMyX3QgZ2V0X3dtX3Byb2coc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyd19ibG9ycF9wcm9nX2RhdGEgKipwcm9nX2RhdGEpIGNvbnN0OworCitwcml2YXRlOgorICAgYnJ3X2Jsb3JwX2JsaXRfcHJvZ19rZXkgd21fcHJvZ19rZXk7Cit9OworCisvKioKKyAqIFxuYW1lIEJMT1JQIGludGVybmFscworICogXHsKKyAqCisgKiBVc2VkIGludGVybmFsbHkgYnkgZ2VuNl9ibG9ycF9leGVjKCkgYW5kIGdlbjdfYmxvcnBfZXhlYygpLgorICovCisKK3ZvaWQKK2dlbjZfYmxvcnBfaW5pdChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyk7CisKK3ZvaWQKK2dlbjZfYmxvcnBfZW1pdF9zdGF0ZV9iYXNlX2FkZHJlc3Moc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyd19ibG9ycF9wYXJhbXMgKnBhcmFtcyk7CisKK3ZvaWQKK2dlbjZfYmxvcnBfZW1pdF92ZXJ0aWNlcyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBicndfYmxvcnBfcGFyYW1zICpwYXJhbXMpOworCit1aW50MzJfdAorZ2VuNl9ibG9ycF9lbWl0X2JsZW5kX3N0YXRlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyd19ibG9ycF9wYXJhbXMgKnBhcmFtcyk7CisKK3VpbnQzMl90CitnZW42X2Jsb3JwX2VtaXRfY2Nfc3RhdGUoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJ3X2Jsb3JwX3BhcmFtcyAqcGFyYW1zKTsKKwordWludDMyX3QKK2dlbjZfYmxvcnBfZW1pdF93bV9jb25zdGFudHMoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyd19ibG9ycF9wYXJhbXMgKnBhcmFtcyk7CisKK3ZvaWQKK2dlbjZfYmxvcnBfZW1pdF92c19kaXNhYmxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJ3X2Jsb3JwX3BhcmFtcyAqcGFyYW1zKTsKKwordWludDMyX3QKK2dlbjZfYmxvcnBfZW1pdF9iaW5kaW5nX3RhYmxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJ3X2Jsb3JwX3BhcmFtcyAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd21fc3VyZl9vZmZzZXRfcmVuZGVyYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd21fc3VyZl9vZmZzZXRfdGV4dHVyZSk7CisKK3VpbnQzMl90CitnZW42X2Jsb3JwX2VtaXRfZGVwdGhfc3RlbmNpbF9zdGF0ZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyd19ibG9ycF9wYXJhbXMgKnBhcmFtcyk7CisKK3ZvaWQKK2dlbjZfYmxvcnBfZW1pdF9nc19kaXNhYmxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJ3X2Jsb3JwX3BhcmFtcyAqcGFyYW1zKTsKKwordm9pZAorZ2VuNl9ibG9ycF9lbWl0X2NsaXBfZGlzYWJsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJ3X2Jsb3JwX3BhcmFtcyAqcGFyYW1zKTsKKwordm9pZAorZ2VuNl9ibG9ycF9lbWl0X2RyYXdpbmdfcmVjdGFuZ2xlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyd19ibG9ycF9wYXJhbXMgKnBhcmFtcyk7CisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2Jsb3JwX2JsaXRfZXUuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ibG9ycF9ibGl0X2V1LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE4NDEzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ibG9ycF9ibGl0X2V1LmNwcApAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJnbHNsL3JhbGxvYy5oIgorI2luY2x1ZGUgImJyd19ibG9ycF9ibGl0X2V1LmgiCisjaW5jbHVkZSAiYnJ3X2Jsb3JwLmgiCisKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjpicndfYmxvcnBfZXVfZW1pdHRlcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKKyAgIDogYnJ3X2N0eCAoYnJ3KSwgbWVtX2N0eChyYWxsb2NfY29udGV4dChOVUxMKSksIGMocnphbGxvYyhtZW1fY3R4LCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUpKSwKKyAgICAgZ2VuZXJhdG9yKGJydywgYywgTlVMTCwgTlVMTCwgZmFsc2UpCit7Cit9CisKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjp+YnJ3X2Jsb3JwX2V1X2VtaXR0ZXIoKQoreworICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7Cit9CisKK2NvbnN0IHVuc2lnbmVkICoKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjpnZXRfcHJvZ3JhbSh1bnNpZ25lZCAqcHJvZ3JhbV9zaXplLCBGSUxFICpkdW1wX2ZpbGUpCit7CisgICBjb25zdCB1bnNpZ25lZCAqcmVzOworCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19CTE9SUCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTmF0aXZlIGNvZGUgZm9yIEJMT1JQIGJsaXQ6XG4iKTsKKyAgICAgIHJlcyA9IGdlbmVyYXRvci5nZW5lcmF0ZV9hc3NlbWJseShOVUxMLCAmaW5zdHMsIHByb2dyYW1fc2l6ZSwgZHVtcF9maWxlKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgIH0gZWxzZSB7CisgICAgICByZXMgPSBnZW5lcmF0b3IuZ2VuZXJhdGVfYXNzZW1ibHkoTlVMTCwgJmluc3RzLCBwcm9ncmFtX3NpemUpOworICAgfQorCisgICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEVtaXQgY29kZSB0aGF0IGtpbGxzIHBpeGVscyB3aG9zZSBYIGFuZCBZIGNvb3JkaW5hdGVzIGFyZSBvdXRzaWRlIHRoZQorICogYm91bmRhcnkgb2YgdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRoZSBwdXNoIGNvbnN0YW50cyAoZHN0X3gwLCBkc3RfeTAsCisgKiBkc3RfeDEsIGRzdF95MSkuCisgKi8KK3ZvaWQKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjplbWl0X2tpbGxfaWZfb3V0c2lkZV9yZWN0KGNvbnN0IHN0cnVjdCBicndfcmVnICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmZHN0X3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdF94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZkc3RfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmZHN0X3kxKQoreworICAgc3RydWN0IGJyd19yZWcgZjAgPSBicndfZmxhZ19yZWcoMCwgMCk7CisgICBzdHJ1Y3QgYnJ3X3JlZyBnMSA9IHJldHlwZShicndfdmVjMV9ncmYoMSwgNyksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKworICAgZW1pdF9jbXAoQlJXX0NPTkRJVElPTkFMX0dFLCB4LCBkc3RfeDApOworICAgZW1pdF9jbXAoQlJXX0NPTkRJVElPTkFMX0dFLCB5LCBkc3RfeTApLT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgIGVtaXRfY21wKEJSV19DT05ESVRJT05BTF9MLCB4LCBkc3RfeDEpLT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgIGVtaXRfY21wKEJSV19DT05ESVRJT05BTF9MLCB5LCBkc3RfeTEpLT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKworICAgZnNfaW5zdCAqaW5zdCA9IG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX0FORCwgZzEsIGYwLCBnMSk7CisgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgIGluc3RzLnB1c2hfdGFpbChpbnN0KTsKK30KKwordm9pZAorYnJ3X2Jsb3JwX2V1X2VtaXR0ZXI6OmVtaXRfdGV4dHVyZV9sb29rdXAoY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gb3Bjb2RlIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmFzZV9tcmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoKQoreworICAgZnNfaW5zdCAqaW5zdCA9IG5ldyAobWVtX2N0eCkgZnNfaW5zdChvcCwgZHN0LCBicndfbWVzc2FnZV9yZWcoYmFzZV9tcmYpKTsKKworICAgaW5zdC0+YmFzZV9tcmYgPSBiYXNlX21yZjsKKyAgIGluc3QtPm1sZW4gPSBtc2dfbGVuZ3RoOworICAgaW5zdC0+c2FtcGxlciA9IDA7CisgICBpbnN0LT5oZWFkZXJfcHJlc2VudCA9IGZhbHNlOworCisgICBpbnN0cy5wdXNoX3RhaWwoaW5zdCk7Cit9CisKK3ZvaWQKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjplbWl0X3JlbmRlcl90YXJnZXRfd3JpdGUoY29uc3Qgc3RydWN0IGJyd19yZWcgJnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19yZWdfbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2hlYWRlcikKK3sKKyAgIGZzX2luc3QgKmluc3QgPSBuZXcgKG1lbV9jdHgpIGZzX2luc3QoRlNfT1BDT0RFX0JMT1JQX0ZCX1dSSVRFKTsKKworICAgaW5zdC0+c3JjWzBdID0gc3JjMDsKKyAgIGluc3QtPmJhc2VfbXJmID0gbXNnX3JlZ19ucjsKKyAgIGluc3QtPm1sZW4gPSBtc2dfbGVuZ3RoOworICAgaW5zdC0+aGVhZGVyX3ByZXNlbnQgPSB1c2VfaGVhZGVyOworICAgaW5zdC0+dGFyZ2V0ID0gQlJXX0JMT1JQX1JFTkRFUkJVRkZFUl9CSU5ESU5HX1RBQkxFX0lOREVYOworCisgICBpbnN0cy5wdXNoX3RhaWwoaW5zdCk7Cit9CisKK3ZvaWQKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjplbWl0X3NjYXR0ZXJlZF93cml0ZShlbnVtIG9wY29kZSBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX3JlZ19uciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXNwYXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9oZWFkZXIpCit7CisgICBhc3NlcnQob3Bjb2RlID09IFNIQURFUl9PUENPREVfRFdPUkRfU0NBVFRFUkVEX1dSSVRFIHx8CisgICAgICAgICAgKGJyd19jdHgtPmdlbiA+PSA3ICYmIG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX0JZVEVfU0NBVFRFUkVEX1dSSVRFKSk7CisKKyAgIGZzX2luc3QgKmluc3QgPSBuZXcgKG1lbV9jdHgpIGZzX2luc3Qob3Bjb2RlKTsKKworICAgaW5zdC0+ZHN0ID0gYnJ3X3ZlY25fcmVnKGRpc3BhdGNoX3dpZHRoLAorICAgICAgICAgICBCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsIEJSV19BUkZfTlVMTCwgMCk7CisgICBpbnN0LT5zcmNbMF0gPSBzcmMwOworICAgaW5zdC0+YmFzZV9tcmYgPSBtc2dfcmVnX25yOworICAgaW5zdC0+bWxlbiA9IG1zZ19sZW5ndGg7CisgICBpbnN0LT5oZWFkZXJfcHJlc2VudCA9IHVzZV9oZWFkZXI7CisgICBpbnN0LT50YXJnZXQgPSBCUldfQkxPUlBfUkVOREVSQlVGRkVSX0JJTkRJTkdfVEFCTEVfSU5ERVg7CisKKyAgIGluc3RzLnB1c2hfdGFpbChpbnN0KTsKK30KKwordm9pZAorYnJ3X2Jsb3JwX2V1X2VtaXR0ZXI6OmVtaXRfc2NhdHRlcmVkX3JlYWQoY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gb3Bjb2RlIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX3JlZ19uciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzcGF0Y2hfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9oZWFkZXIpCit7CisgICBhc3NlcnQob3Bjb2RlID09IFNIQURFUl9PUENPREVfRFdPUkRfU0NBVFRFUkVEX1JFQUQgfHwKKyAgICAgICAgICAoYnJ3X2N0eC0+Z2VuID49IDcgJiYgb3Bjb2RlID09IFNIQURFUl9PUENPREVfQllURV9TQ0FUVEVSRURfUkVBRCkpOworCisgICBmc19pbnN0ICppbnN0ID0gbmV3IChtZW1fY3R4KSBmc19pbnN0KG9wY29kZSk7CisKKyAgIHN3aXRjaCAoZGlzcGF0Y2hfd2lkdGgpIHsKKyAgIGNhc2UgMToKKyAgIGRlZmF1bHQ6CisgICAgICAgaW5zdC0+ZHN0ID0gdmVjMShkc3QpOworICAgICAgIGJyZWFrOworICAgY2FzZSAyOgorICAgICAgIGluc3QtPmRzdCA9IHZlYzIoZHN0KTsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgNDoKKyAgICAgICBpbnN0LT5kc3QgPSB2ZWM0KGRzdCk7CisgICAgICAgYnJlYWs7CisgICBjYXNlIDg6CisgICAgICAgaW5zdC0+ZHN0ID0gdmVjOChkc3QpOworICAgICAgIGJyZWFrOworICAgY2FzZSAxNjoKKyAgICAgICBpbnN0LT5kc3QgPSB2ZWMxNihkc3QpOworICAgICAgIGJyZWFrOworICAgfQorCisgICBpbnN0LT5zcmNbMF0gPSBzcmMwOworICAgaW5zdC0+YmFzZV9tcmYgPSBtc2dfcmVnX25yOworICAgaW5zdC0+bWxlbiA9IG1zZ19sZW5ndGg7CisgICBpbnN0LT5oZWFkZXJfcHJlc2VudCA9IHVzZV9oZWFkZXI7CisgICBpbnN0LT50YXJnZXQgPSBCUldfQkxPUlBfVEVYVFVSRV9CSU5ESU5HX1RBQkxFX0lOREVYOworCisgICBpbnN0cy5wdXNoX3RhaWwoaW5zdCk7Cit9CisKK3ZvaWQKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjplbWl0X3VyYl93cml0ZV9lb3QodW5zaWduZWQgYmFzZV9tcmYpCit7CisgICBmc19pbnN0ICppbnN0ID0gbmV3IChtZW1fY3R4KSBmc19pbnN0KFZTX09QQ09ERV9VUkJfV1JJVEUpOworCisgICBpbnN0LT5iYXNlX21yZiA9IGJhc2VfbXJmOworICAgLyogaGVhZGVyIHdpbGwgYmUgYWRkZWQgYnkgZ2VuNl9yZXNvbHZlX2ltcGxpZWRfbW92ZSgpICovCisgICBpbnN0LT5tbGVuID0gMTsKKyAgIGluc3QtPmhlYWRlcl9wcmVzZW50ID0gdHJ1ZTsKKyAgIGluc3QtPmVvdCA9IHRydWU7CisKKyAgIGluc3RzLnB1c2hfdGFpbChpbnN0KTsKK30KKwordm9pZAorYnJ3X2Jsb3JwX2V1X2VtaXR0ZXI6OmVtaXRfY29tYmluZShlbnVtIG9wY29kZSBjb21iaW5lX29wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnNyY18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmc3JjXzIpCit7CisgICBhc3NlcnQoY29tYmluZV9vcGNvZGUgPT0gQlJXX09QQ09ERV9BREQgfHwgY29tYmluZV9vcGNvZGUgPT0gQlJXX09QQ09ERV9BVkcpOworCisgICBpbnN0cy5wdXNoX3RhaWwobmV3IChtZW1fY3R4KSBmc19pbnN0KGNvbWJpbmVfb3Bjb2RlLCBkc3QsIHNyY18xLCBzcmNfMikpOworfQorCitmc19pbnN0ICoKK2Jyd19ibG9ycF9ldV9lbWl0dGVyOjplbWl0X2NtcChpbnQgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnkpCit7CisgICBmc19pbnN0ICpjbXAgPSBuZXcgKG1lbV9jdHgpIGZzX2luc3QoQlJXX09QQ09ERV9DTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMTYoYnJ3X251bGxfcmVnKCkpLCB4LCB5KTsKKyAgIGNtcC0+Y29uZGl0aW9uYWxfbW9kID0gb3A7CisgICBpbnN0cy5wdXNoX3RhaWwoY21wKTsKKyAgIHJldHVybiBjbXA7Cit9CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfYmxvcnBfYmxpdF9ldS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ibG9ycF9ibGl0X2V1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzMjQzOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfYmxvcnBfYmxpdF9ldS5oCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBCUldfQkxPUlBfQkxJVF9FVV9ICisjZGVmaW5lIEJSV19CTE9SUF9CTElUX0VVX0gKKworI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCisjaW5jbHVkZSAiYnJ3X2ZzLmgiCisKK2NsYXNzIGJyd19ibG9ycF9ldV9lbWl0dGVyCit7Citwcm90ZWN0ZWQ6CisgICBleHBsaWNpdCBicndfYmxvcnBfZXVfZW1pdHRlcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyk7CisgICB+YnJ3X2Jsb3JwX2V1X2VtaXR0ZXIoKTsKKworICAgY29uc3QgdW5zaWduZWQgKmdldF9wcm9ncmFtKHVuc2lnbmVkICpwcm9ncmFtX3NpemUsIEZJTEUgKmR1bXBfZmlsZSk7CisKKyAgIHZvaWQgZW1pdF9raWxsX2lmX291dHNpZGVfcmVjdChjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmZHN0X3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZkc3RfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdF95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmZHN0X3kxKTsKKworICAgdm9pZCBlbWl0X3RleHR1cmVfbG9va3VwKGNvbnN0IHN0cnVjdCBicndfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBvcGNvZGUgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmFzZV9tcmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCk7CisKKyAgIHZvaWQgZW1pdF9yZW5kZXJfdGFyZ2V0X3dyaXRlKGNvbnN0IHN0cnVjdCBicndfcmVnICZzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX3JlZ19uciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9oZWFkZXIpOworCisgICB2b2lkIGVtaXRfc2NhdHRlcmVkX3dyaXRlKGVudW0gb3Bjb2RlIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19yZWdfbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXNwYXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfaGVhZGVyKTsKKworICAgdm9pZCBlbWl0X3NjYXR0ZXJlZF9yZWFkKGNvbnN0IHN0cnVjdCBicndfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBvcGNvZGUgb3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19yZWdfbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzcGF0Y2hfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfaGVhZGVyKTsKKworICAgdm9pZCBlbWl0X3VyYl93cml0ZV9lb3QodW5zaWduZWQgYmFzZV9tcmYpOworCisgICB2b2lkIGVtaXRfY29tYmluZShlbnVtIG9wY29kZSBjb21iaW5lX29wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmc3JjXzEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmc3JjXzIpOworCisgICBpbmxpbmUgdm9pZCBlbWl0X2NvbmRfbW92KGNvbnN0IHN0cnVjdCBicndfcmVnICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmc3JjKQorICAgeworICAgICAgZW1pdF9jbXAob3AsIHgsIHkpOworCisgICAgICBmc19pbnN0ICptdiA9IG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX01PViwgZHN0LCBzcmMpOworICAgICAgbXYtPnByZWRpY2F0ZSA9IEJSV19QUkVESUNBVEVfTk9STUFMOworICAgICAgaW5zdHMucHVzaF90YWlsKG12KTsKKyAgIH0KKworICAgaW5saW5lIHZvaWQgZW1pdF9pZl9lcV9tb3YoY29uc3Qgc3RydWN0IGJyd19yZWcgJngsIHVuc2lnbmVkIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmZHN0LCB1bnNpZ25lZCBzcmMpCisgICB7CisgICAgICBlbWl0X2NvbmRfbW92KHgsIGJyd19pbW1fZCh5KSwgQlJXX0NPTkRJVElPTkFMX0VRLCBkc3QsIGJyd19pbW1fZChzcmMpKTsKKyAgIH0KKworICAgaW5saW5lIHZvaWQgZW1pdF9scnAoY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmc3JjMykKKyAgIHsKKyAgICAgIGluc3RzLnB1c2hfdGFpbCgKKyAgICAgICAgIG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX0xSUCwgZHN0LCBzcmMxLCBzcmMyLCBzcmMzKSk7CisgICB9CisKKyAgIGlubGluZSB2b2lkIGVtaXRfbW92KGNvbnN0IHN0cnVjdCBicndfcmVnJiBkc3QsIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMpCisgICB7CisgICAgICBpbnN0cy5wdXNoX3RhaWwobmV3IChtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfTU9WLCBkc3QsIHNyYykpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X21vdl84KGNvbnN0IHN0cnVjdCBicndfcmVnJiBkc3QsIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMpCisgICB7CisgICAgICBmc19pbnN0ICptdiA9IG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX01PViwgZHN0LCBzcmMpOworICAgICAgbXYtPmZvcmNlX3VuY29tcHJlc3NlZCA9IHRydWU7CisgICAgICBpbnN0cy5wdXNoX3RhaWwobXYpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X2FuZChjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcmIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMikKKyAgIHsKKyAgICAgIGluc3RzLnB1c2hfdGFpbChuZXcgKG1lbV9jdHgpIGZzX2luc3QoQlJXX09QQ09ERV9BTkQsIGRzdCwgc3JjMSwgc3JjMikpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X2FkZChjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcmIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMikKKyAgIHsKKyAgICAgIGluc3RzLnB1c2hfdGFpbChuZXcgKG1lbV9jdHgpIGZzX2luc3QoQlJXX09QQ09ERV9BREQsIGRzdCwgc3JjMSwgc3JjMikpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X2FkZF84KGNvbnN0IHN0cnVjdCBicndfcmVnJiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMikKKyAgIHsKKyAgICAgIGZzX2luc3QgKmFkZCA9IG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX0FERCwgZHN0LCBzcmMxLCBzcmMyKTsKKyAgICAgIGFkZC0+Zm9yY2VfdW5jb21wcmVzc2VkID0gdHJ1ZTsKKyAgICAgIGluc3RzLnB1c2hfdGFpbChhZGQpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X211bChjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcmIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMikKKyAgIHsKKyAgICAgIGluc3RzLnB1c2hfdGFpbChuZXcgKG1lbV9jdHgpIGZzX2luc3QoQlJXX09QQ09ERV9NVUwsIGRzdCwgc3JjMSwgc3JjMikpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X211bF84KGNvbnN0IHN0cnVjdCBicndfcmVnJiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMikKKyAgIHsKKyAgICAgIGZzX2luc3QgKm11bCA9IG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX01VTCwgZHN0LCBzcmMxLCBzcmMyKTsKKyAgICAgIG11bC0+Zm9yY2VfdW5jb21wcmVzc2VkID0gdHJ1ZTsKKyAgICAgIGluc3RzLnB1c2hfdGFpbChtdWwpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X2lkaXYoY29uc3Qgc3RydWN0IGJyd19yZWcmIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMikKKyAgIHsKKyAgICAgIGZzX2luc3QgKmlkaXYgPSBuZXcgKG1lbV9jdHgpIGZzX2luc3QoU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQsIGRzdCwgc3JjMSwgc3JjMik7CisgICAgICBpbnN0cy5wdXNoX3RhaWwoaWRpdik7CisgICB9CisKKyAgIGlubGluZSB2b2lkIGVtaXRfaXJlbShjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMyKQorICAgeworICAgICAgZnNfaW5zdCAqaXJlbSA9IG5ldyAobWVtX2N0eCkgZnNfaW5zdChTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVIsIGRzdCwgc3JjMSwgc3JjMik7CisgICAgICBpbnN0cy5wdXNoX3RhaWwoaXJlbSk7CisgICB9CisKKyAgIGlubGluZSB2b2lkIGVtaXRfc2hyKGNvbnN0IHN0cnVjdCBicndfcmVnJiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMyKQorICAgeworICAgICAgaW5zdHMucHVzaF90YWlsKG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX1NIUiwgZHN0LCBzcmMxLCBzcmMyKSk7CisgICB9CisKKyAgIGlubGluZSB2b2lkIGVtaXRfc2hsKGNvbnN0IHN0cnVjdCBicndfcmVnJiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMyKQorICAgeworICAgICAgaW5zdHMucHVzaF90YWlsKG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX1NITCwgZHN0LCBzcmMxLCBzcmMyKSk7CisgICB9CisKKyAgIGlubGluZSB2b2lkIGVtaXRfb3IoY29uc3Qgc3RydWN0IGJyd19yZWcmIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcmIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMyKQorICAgeworICAgICAgaW5zdHMucHVzaF90YWlsKG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX09SLCBkc3QsIHNyYzEsIHNyYzIpKTsKKyAgIH0KKworICAgaW5saW5lIHZvaWQgZW1pdF9mcmMoY29uc3Qgc3RydWN0IGJyd19yZWcmIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnJiBzcmMpCisgICB7CisgICAgICBpbnN0cy5wdXNoX3RhaWwobmV3IChtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfRlJDLCBkc3QsIHNyYykpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X3JuZGQoY29uc3Qgc3RydWN0IGJyd19yZWcmIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyYgc3JjKQorICAgeworICAgICAgaW5zdHMucHVzaF90YWlsKG5ldyAobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX1JOREQsIGRzdCwgc3JjKSk7CisgICB9CisKKyAgIGlubGluZSB2b2lkIGVtaXRfY21wX2lmKGludCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnkpCisgICB7CisgICAgICBlbWl0X2NtcChvcCwgeCwgeSk7CisgICAgICBpbnN0cy5wdXNoX3RhaWwobmV3IChtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfSUYpKTsKKyAgIH0KKworICAgaW5saW5lIHZvaWQgZW1pdF9lbHNlKHZvaWQpCisgICB7CisgICAgICBpbnN0cy5wdXNoX3RhaWwobmV3IChtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfRUxTRSkpOworICAgfQorCisgICBpbmxpbmUgdm9pZCBlbWl0X2VuZGlmKHZvaWQpCisgICB7CisgICAgICBpbnN0cy5wdXNoX3RhaWwobmV3IChtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfRU5ESUYpKTsKKyAgIH0KKworcHJpdmF0ZToKKyAgIGZzX2luc3QgKmVtaXRfY21wKGludCBvcCwgY29uc3Qgc3RydWN0IGJyd19yZWcgJngsIGNvbnN0IHN0cnVjdCBicndfcmVnICZ5KTsKKworICAgc3RydWN0IGJyd19jb250ZXh0ICpicndfY3R4OworICAgdm9pZCAqbWVtX2N0eDsKKyAgIHN0cnVjdCBicndfd21fY29tcGlsZSAqYzsKKyAgIGV4ZWNfbGlzdCBpbnN0czsKKyAgIGZzX2dlbmVyYXRvciBnZW5lcmF0b3I7Cit9OworCisjZW5kaWYgLyogQlJXX0JMT1JQX0JMSVRfRVVfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19jZmcuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19jZmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjgxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2NmZy5jcHAKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqCisgKi8KKworI2luY2x1ZGUgImJyd19jZmcuaCIKKworLyoqIEBmaWxlIGJyd19jZmcuY3BwCisgKgorICogV2Fsa3MgdGhlIHNoYWRlciBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIGFuZCBjcmVhdGVzIGEgc2V0IG9mIGJhc2ljCisgKiBibG9ja3Mgd2l0aCBzdWNjZXNzb3IvcHJlZGVjZXNzb3IgZWRnZXMgY29ubmVjdGluZyB0aGVtLgorICovCisKK3N0YXRpYyBiYmxvY2tfdCAqCitwb3Bfc3RhY2soZXhlY19saXN0ICpsaXN0KQoreworICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilsaXN0LT5nZXRfdGFpbCgpOworICAgYmJsb2NrX3QgKmJsb2NrID0gbGluay0+YmxvY2s7CisgICBsaW5rLT5yZW1vdmUoKTsKKworICAgcmV0dXJuIGJsb2NrOworfQorCitiYmxvY2tfdDo6YmJsb2NrX3QoKSA6CisgICBzdGFydF9pcCgwKSwgZW5kX2lwKDApLCBibG9ja19udW0oMCkKK3sKKyAgIHN0YXJ0ID0gTlVMTDsKKyAgIGVuZCA9IE5VTEw7CisKKyAgIHBhcmVudHMubWFrZV9lbXB0eSgpOworICAgY2hpbGRyZW4ubWFrZV9lbXB0eSgpOworCisgICBpZl9pbnN0ID0gTlVMTDsKKyAgIGVsc2VfaW5zdCA9IE5VTEw7CisgICBlbmRpZl9pbnN0ID0gTlVMTDsKK30KKwordm9pZAorYmJsb2NrX3Q6OmFkZF9zdWNjZXNzb3Iodm9pZCAqbWVtX2N0eCwgYmJsb2NrX3QgKnN1Y2Nlc3NvcikKK3sKKyAgIHN1Y2Nlc3Nvci0+cGFyZW50cy5wdXNoX3RhaWwobmV3KG1lbV9jdHgpIGJibG9ja19saW5rKHRoaXMpKTsKKyAgIGNoaWxkcmVuLnB1c2hfdGFpbChuZXcobWVtX2N0eCkgYmJsb2NrX2xpbmsoc3VjY2Vzc29yKSk7Cit9CisKK3ZvaWQKK2JibG9ja190OjpkdW1wKGJhY2tlbmRfdmlzaXRvciAqdikKK3sKKyAgIGludCBpcCA9IHRoaXMtPnN0YXJ0X2lwOworICAgZm9yIChiYWNrZW5kX2luc3RydWN0aW9uICppbnN0ID0gKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKil0aGlzLT5zdGFydDsKKwlpbnN0ICE9IHRoaXMtPmVuZC0+bmV4dDsKKwlpbnN0ID0gKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKikgaW5zdC0+bmV4dCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlNWQ6ICIsIGlwKTsKKyAgICAgIHYtPmR1bXBfaW5zdHJ1Y3Rpb24oaW5zdCk7CisgICAgICBpcCsrOworICAgfQorfQorCitjZmdfdDo6Y2ZnX3QoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBtZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICBibG9ja19saXN0Lm1ha2VfZW1wdHkoKTsKKyAgIGJsb2NrcyA9IE5VTEw7CisgICBudW1fYmxvY2tzID0gMDsKKworICAgYmJsb2NrX3QgKmN1ciA9IE5VTEw7CisgICBpbnQgaXAgPSAwOworCisgICBiYmxvY2tfdCAqZW50cnkgPSBuZXdfYmxvY2soKTsKKyAgIGJibG9ja190ICpjdXJfaWYgPSBOVUxMOyAgICAvKio8IEJCIGVuZGluZyB3aXRoIElGLiAqLworICAgYmJsb2NrX3QgKmN1cl9lbHNlID0gTlVMTDsgIC8qKjwgQkIgZW5kaW5nIHdpdGggRUxTRS4gKi8KKyAgIGJibG9ja190ICpjdXJfZW5kaWYgPSBOVUxMOyAvKio8IEJCIHN0YXJ0aW5nIHdpdGggRU5ESUYuICovCisgICBiYmxvY2tfdCAqY3VyX2RvID0gTlVMTDsgICAgLyoqPCBCQiBlbmRpbmcgd2l0aCBETy4gKi8KKyAgIGJibG9ja190ICpjdXJfd2hpbGUgPSBOVUxMOyAvKio8IEJCIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBXSElMRS4gKi8KKyAgIGV4ZWNfbGlzdCBpZl9zdGFjaywgZWxzZV9zdGFjaywgZG9fc3RhY2ssIHdoaWxlX3N0YWNrOworICAgYmJsb2NrX3QgKm5leHQ7CisKKyAgIHNldF9uZXh0X2Jsb2NrKCZjdXIsIGVudHJ5LCBpcCk7CisKKyAgIGVudHJ5LT5zdGFydCA9IChiYWNrZW5kX2luc3RydWN0aW9uICopIGluc3RydWN0aW9ucy0+Z2V0X2hlYWQoKTsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsIGluc3RydWN0aW9ucykgeworICAgICAgYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCA9IChiYWNrZW5kX2luc3RydWN0aW9uICopbm9kZTsKKworICAgICAgY3VyLT5lbmQgPSBpbnN0OworCisgICAgICAvKiBzZXRfbmV4dF9ibG9jayB3YW50cyB0aGUgcG9zdC1pbmNyZW1lbnRlZCBpcCAqLworICAgICAgaXArKzsKKworICAgICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9JRjoKKwkgLyogUHVzaCBvdXIgaW5mb3JtYXRpb24gb250byBhIHN0YWNrIHNvIHdlIGNhbiByZWNvdmVyIGZyb20KKwkgICogbmVzdGVkIGlmcy4KKwkgICovCisJIGlmX3N0YWNrLnB1c2hfdGFpbChuZXcobWVtX2N0eCkgYmJsb2NrX2xpbmsoY3VyX2lmKSk7CisJIGVsc2Vfc3RhY2sucHVzaF90YWlsKG5ldyhtZW1fY3R4KSBiYmxvY2tfbGluayhjdXJfZWxzZSkpOworCisJIGN1cl9pZiA9IGN1cjsKKwkgY3VyX2Vsc2UgPSBOVUxMOworICAgICAgICAgY3VyX2VuZGlmID0gTlVMTDsKKworCSAvKiBTZXQgdXAgb3VyIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBibG9jaywgZnVsbCBvZiAidGhlbiIKKwkgICogaW5zdHJ1Y3Rpb25zLgorCSAgKi8KKwkgbmV4dCA9IG5ld19ibG9jaygpOworCSBuZXh0LT5zdGFydCA9IChiYWNrZW5kX2luc3RydWN0aW9uICopaW5zdC0+bmV4dDsKKwkgY3VyX2lmLT5hZGRfc3VjY2Vzc29yKG1lbV9jdHgsIG5leHQpOworCisJIHNldF9uZXh0X2Jsb2NrKCZjdXIsIG5leHQsIGlwKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTFNFOgorICAgICAgICAgY3VyX2Vsc2UgPSBjdXI7CisKKwkgbmV4dCA9IG5ld19ibG9jaygpOworCSBuZXh0LT5zdGFydCA9IChiYWNrZW5kX2luc3RydWN0aW9uICopaW5zdC0+bmV4dDsKKwkgY3VyX2lmLT5hZGRfc3VjY2Vzc29yKG1lbV9jdHgsIG5leHQpOworCisJIHNldF9uZXh0X2Jsb2NrKCZjdXIsIG5leHQsIGlwKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTkRJRjogeworICAgICAgICAgaWYgKGN1ci0+c3RhcnQgPT0gaW5zdCkgeworICAgICAgICAgICAgLyogTmV3IGJsb2NrIHdhcyBqdXN0IGNyZWF0ZWQ7IHVzZSBpdC4gKi8KKyAgICAgICAgICAgIGN1cl9lbmRpZiA9IGN1cjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJfZW5kaWYgPSBuZXdfYmxvY2soKTsKKyAgICAgICAgICAgIGN1cl9lbmRpZi0+c3RhcnQgPSBpbnN0OworCisgICAgICAgICAgICBjdXItPmVuZCA9IChiYWNrZW5kX2luc3RydWN0aW9uICopaW5zdC0+cHJldjsKKyAgICAgICAgICAgIGN1ci0+YWRkX3N1Y2Nlc3NvcihtZW1fY3R4LCBjdXJfZW5kaWYpOworCisgICAgICAgICAgICBzZXRfbmV4dF9ibG9jaygmY3VyLCBjdXJfZW5kaWYsIGlwIC0gMSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmVsc2VfaW5zdCA9IE5VTEw7CisgICAgICAgICBpZiAoY3VyX2Vsc2UpIHsKKyAgICAgICAgICAgIGVsc2VfaW5zdCA9IChiYWNrZW5kX2luc3RydWN0aW9uICopY3VyX2Vsc2UtPmVuZDsKKworICAgICAgICAgICAgY3VyX2Vsc2UtPmFkZF9zdWNjZXNzb3IobWVtX2N0eCwgY3VyX2VuZGlmKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJfaWYtPmFkZF9zdWNjZXNzb3IobWVtX2N0eCwgY3VyX2VuZGlmKTsKKyAgICAgICAgIH0KKworICAgICAgICAgYXNzZXJ0KGN1cl9pZi0+ZW5kLT5vcGNvZGUgPT0gQlJXX09QQ09ERV9JRik7CisgICAgICAgICBhc3NlcnQoIWVsc2VfaW5zdCB8fCBlbHNlX2luc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UpOworICAgICAgICAgYXNzZXJ0KGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX0VORElGKTsKKworICAgICAgICAgY3VyX2lmLT5pZl9pbnN0ID0gY3VyX2lmLT5lbmQ7CisgICAgICAgICBjdXJfaWYtPmVsc2VfaW5zdCA9IGVsc2VfaW5zdDsKKyAgICAgICAgIGN1cl9pZi0+ZW5kaWZfaW5zdCA9IGluc3Q7CisKKwkgaWYgKGN1cl9lbHNlKSB7CisgICAgICAgICAgICBjdXJfZWxzZS0+aWZfaW5zdCA9IGN1cl9pZi0+ZW5kOworICAgICAgICAgICAgY3VyX2Vsc2UtPmVsc2VfaW5zdCA9IGVsc2VfaW5zdDsKKyAgICAgICAgICAgIGN1cl9lbHNlLT5lbmRpZl9pbnN0ID0gaW5zdDsKKyAgICAgICAgIH0KKworICAgICAgICAgY3VyLT5pZl9pbnN0ID0gY3VyX2lmLT5lbmQ7CisgICAgICAgICBjdXItPmVsc2VfaW5zdCA9IGVsc2VfaW5zdDsKKyAgICAgICAgIGN1ci0+ZW5kaWZfaW5zdCA9IGluc3Q7CisKKwkgLyogUG9wIHRoZSBzdGFjayBzbyB3ZSdyZSBpbiB0aGUgcHJldmlvdXMgaWYvZWxzZS9lbmRpZiAqLworCSBjdXJfaWYgPSBwb3Bfc3RhY2soJmlmX3N0YWNrKTsKKwkgY3VyX2Vsc2UgPSBwb3Bfc3RhY2soJmVsc2Vfc3RhY2spOworCSBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQlJXX09QQ09ERV9ETzoKKwkgLyogUHVzaCBvdXIgaW5mb3JtYXRpb24gb250byBhIHN0YWNrIHNvIHdlIGNhbiByZWNvdmVyIGZyb20KKwkgICogbmVzdGVkIGxvb3BzLgorCSAgKi8KKwkgZG9fc3RhY2sucHVzaF90YWlsKG5ldyhtZW1fY3R4KSBiYmxvY2tfbGluayhjdXJfZG8pKTsKKwkgd2hpbGVfc3RhY2sucHVzaF90YWlsKG5ldyhtZW1fY3R4KSBiYmxvY2tfbGluayhjdXJfd2hpbGUpKTsKKworCSAvKiBTZXQgdXAgdGhlIGJsb2NrIGp1c3QgYWZ0ZXIgdGhlIHdoaWxlLiAgRG9uJ3Qga25vdyB3aGVuIGV4YWN0bHkKKwkgICogaXQgd2lsbCBzdGFydCwgeWV0LgorCSAgKi8KKwkgY3VyX3doaWxlID0gbmV3X2Jsb2NrKCk7CisKKwkgLyogU2V0IHVwIG91ciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYmxvY2ssIGZ1bGwgb2YgInRoZW4iCisJICAqIGluc3RydWN0aW9ucy4KKwkgICovCisJIG5leHQgPSBuZXdfYmxvY2soKTsKKwkgbmV4dC0+c3RhcnQgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKWluc3QtPm5leHQ7CisJIGN1ci0+YWRkX3N1Y2Nlc3NvcihtZW1fY3R4LCBuZXh0KTsKKwkgY3VyX2RvID0gbmV4dDsKKworCSBzZXRfbmV4dF9ibG9jaygmY3VyLCBuZXh0LCBpcCk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfQ09OVElOVUU6CisJIGN1ci0+YWRkX3N1Y2Nlc3NvcihtZW1fY3R4LCBjdXJfZG8pOworCisJIG5leHQgPSBuZXdfYmxvY2soKTsKKwkgbmV4dC0+c3RhcnQgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKWluc3QtPm5leHQ7CisJIGlmIChpbnN0LT5wcmVkaWNhdGUpCisJICAgIGN1ci0+YWRkX3N1Y2Nlc3NvcihtZW1fY3R4LCBuZXh0KTsKKworCSBzZXRfbmV4dF9ibG9jaygmY3VyLCBuZXh0LCBpcCk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfQlJFQUs6CisJIGN1ci0+YWRkX3N1Y2Nlc3NvcihtZW1fY3R4LCBjdXJfd2hpbGUpOworCisJIG5leHQgPSBuZXdfYmxvY2soKTsKKwkgbmV4dC0+c3RhcnQgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKWluc3QtPm5leHQ7CisJIGlmIChpbnN0LT5wcmVkaWNhdGUpCisJICAgIGN1ci0+YWRkX3N1Y2Nlc3NvcihtZW1fY3R4LCBuZXh0KTsKKworCSBzZXRfbmV4dF9ibG9jaygmY3VyLCBuZXh0LCBpcCk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfV0hJTEU6CisJIGN1cl93aGlsZS0+c3RhcnQgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKWluc3QtPm5leHQ7CisKKwkgY3VyLT5hZGRfc3VjY2Vzc29yKG1lbV9jdHgsIGN1cl9kbyk7CisJIHNldF9uZXh0X2Jsb2NrKCZjdXIsIGN1cl93aGlsZSwgaXApOworCisJIC8qIFBvcCB0aGUgc3RhY2sgc28gd2UncmUgaW4gdGhlIHByZXZpb3VzIGxvb3AgKi8KKwkgY3VyX2RvID0gcG9wX3N0YWNrKCZkb19zdGFjayk7CisJIGN1cl93aGlsZSA9IHBvcF9zdGFjaygmd2hpbGVfc3RhY2spOworCSBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGN1ci0+ZW5kX2lwID0gaXA7CisKKyAgIG1ha2VfYmxvY2tfYXJyYXkoKTsKK30KKworY2ZnX3Q6On5jZmdfdCgpCit7CisgICByYWxsb2NfZnJlZShtZW1fY3R4KTsKK30KKworYmJsb2NrX3QgKgorY2ZnX3Q6Om5ld19ibG9jaygpCit7CisgICBiYmxvY2tfdCAqYmxvY2sgPSBuZXcobWVtX2N0eCkgYmJsb2NrX3QoKTsKKworICAgcmV0dXJuIGJsb2NrOworfQorCit2b2lkCitjZmdfdDo6c2V0X25leHRfYmxvY2soYmJsb2NrX3QgKipjdXIsIGJibG9ja190ICpibG9jaywgaW50IGlwKQoreworICAgaWYgKCpjdXIpIHsKKyAgICAgIGFzc2VydCgoKmN1ciktPmVuZC0+bmV4dCA9PSBibG9jay0+c3RhcnQpOworICAgICAgKCpjdXIpLT5lbmRfaXAgPSBpcCAtIDE7CisgICB9CisKKyAgIGJsb2NrLT5zdGFydF9pcCA9IGlwOworICAgYmxvY2stPmJsb2NrX251bSA9IG51bV9ibG9ja3MrKzsKKyAgIGJsb2NrX2xpc3QucHVzaF90YWlsKG5ldyhtZW1fY3R4KSBiYmxvY2tfbGluayhibG9jaykpOworICAgKmN1ciA9IGJsb2NrOworfQorCit2b2lkCitjZmdfdDo6bWFrZV9ibG9ja19hcnJheSgpCit7CisgICBibG9ja3MgPSByYWxsb2NfYXJyYXkobWVtX2N0eCwgYmJsb2NrX3QgKiwgbnVtX2Jsb2Nrcyk7CisKKyAgIGludCBpID0gMDsKKyAgIGZvcmVhY2hfbGlzdChibG9ja19ub2RlLCAmYmxvY2tfbGlzdCkgeworICAgICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilibG9ja19ub2RlOworICAgICAgYmxvY2tzW2krK10gPSBsaW5rLT5ibG9jazsKKyAgIH0KKyAgIGFzc2VydChpID09IG51bV9ibG9ja3MpOworfQorCit2b2lkCitjZmdfdDo6ZHVtcChiYWNrZW5kX3Zpc2l0b3IgKnYpCit7CisgICBmb3IgKGludCBiID0gMDsgYiA8IHRoaXMtPm51bV9ibG9ja3M7IGIrKykgeworICAgICAgICBiYmxvY2tfdCAqYmxvY2sgPSB0aGlzLT5ibG9ja3NbYl07CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNUQVJUIEIlZCIsIGIpOworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsICZibG9jay0+cGFyZW50cykgeworICAgICAgICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilub2RlOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgPC1CJWQiLAorICAgICAgICAgICAgICAgICBsaW5rLT5ibG9jay0+YmxvY2tfbnVtKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgIGJsb2NrLT5kdW1wKHYpOworICAgICAgZnByaW50ZihzdGRlcnIsICJFTkQgQiVkIiwgYik7CisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmJsb2NrLT5jaGlsZHJlbikgeworICAgICAgICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilub2RlOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgLT5CJWQiLAorICAgICAgICAgICAgICAgICBsaW5rLT5ibG9jay0+YmxvY2tfbnVtKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfY2ZnLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDNlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2NmZy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqCisgKi8KKworI2luY2x1ZGUgImJyd19zaGFkZXIuaCIKKworY2xhc3MgYmJsb2NrX3Q7CisKK2NsYXNzIGJibG9ja19saW5rIDogcHVibGljIGV4ZWNfbm9kZSB7CitwdWJsaWM6CisgICBiYmxvY2tfbGluayhiYmxvY2tfdCAqYmxvY2spCisgICAgICA6IGJsb2NrKGJsb2NrKQorICAgeworICAgfQorCisgICBiYmxvY2tfdCAqYmxvY2s7Cit9OworCitjbGFzcyBiYmxvY2tfdCB7CitwdWJsaWM6CisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKGJibG9ja190KQorCisgICBiYmxvY2tfdCgpOworCisgICB2b2lkIGFkZF9zdWNjZXNzb3Iodm9pZCAqbWVtX2N0eCwgYmJsb2NrX3QgKnN1Y2Nlc3Nvcik7CisgICB2b2lkIGR1bXAoYmFja2VuZF92aXNpdG9yICp2KTsKKworICAgYmFja2VuZF9pbnN0cnVjdGlvbiAqc3RhcnQ7CisgICBiYWNrZW5kX2luc3RydWN0aW9uICplbmQ7CisKKyAgIGludCBzdGFydF9pcDsKKyAgIGludCBlbmRfaXA7CisKKyAgIGV4ZWNfbGlzdCBwYXJlbnRzOworICAgZXhlY19saXN0IGNoaWxkcmVuOworICAgaW50IGJsb2NrX251bTsKKworICAgLyogSWYgdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2sgZW5kcyBpbiBhbiBJRiwgRUxTRSwgb3IgRU5ESUYgaW5zdHJ1Y3Rpb24sCisgICAgKiB0aGVzZSBwb2ludGVycyB3aWxsIGhvbGQgdGhlIGxvY2F0aW9ucyBvZiB0aGUgb3RoZXIgYXNzb2NpYXRlZCBjb250cm9sCisgICAgKiBmbG93IGluc3RydWN0aW9ucy4KKyAgICAqCisgICAgKiBPdGhlcndpc2UgdGhleSBhcmUgTlVMTC4KKyAgICAqLworICAgYmFja2VuZF9pbnN0cnVjdGlvbiAqaWZfaW5zdDsKKyAgIGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmVsc2VfaW5zdDsKKyAgIGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmVuZGlmX2luc3Q7Cit9OworCitjbGFzcyBjZmdfdCB7CitwdWJsaWM6CisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKGNmZ190KQorCisgICBjZmdfdChleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7CisgICB+Y2ZnX3QoKTsKKworICAgYmJsb2NrX3QgKm5ld19ibG9jaygpOworICAgdm9pZCBzZXRfbmV4dF9ibG9jayhiYmxvY2tfdCAqKmN1ciwgYmJsb2NrX3QgKmJsb2NrLCBpbnQgaXApOworICAgdm9pZCBtYWtlX2Jsb2NrX2FycmF5KCk7CisKKyAgIHZvaWQgZHVtcChiYWNrZW5kX3Zpc2l0b3IgKnYpOworCisgICB2b2lkICptZW1fY3R4OworCisgICAvKiogT3JkZXJlZCBsaXN0IChieSBpcCkgb2YgYmFzaWMgYmxvY2tzICovCisgICBleGVjX2xpc3QgYmxvY2tfbGlzdDsKKyAgIGJibG9ja190ICoqYmxvY2tzOworICAgaW50IG51bV9ibG9ja3M7Cit9OwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19jb250ZXh0LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFjZWFhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19jb250ZXh0LmMKQEAgLTAsMCArMSwxNDYxIEBACisvKgorIENvcHlyaWdodCAyMDAzIFZNd2FyZSwgSW5jLgorIENvcHlyaWdodCAoQykgSW50ZWwgQ29ycC4gIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIEludGVsIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0bworIGRldmVsb3AgdGhpcyAzRCBkcml2ZXIuCisKKyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoKKyAgKiBBdXRob3JzOgorICAqICAgS2VpdGggV2hpdHdlbGwgPGtlaXRod0B2bXdhcmUuY29tPgorICAqLworCisKKyNpbmNsdWRlICJtYWluL2FwaV9leGVjLmgiCisjaW5jbHVkZSAibWFpbi9jb250ZXh0LmgiCisjaW5jbHVkZSAibWFpbi9mYm9iamVjdC5oIgorI2luY2x1ZGUgIm1haW4vaW1wb3J0cy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAibWFpbi9wb2ludHMuaCIKKyNpbmNsdWRlICJtYWluL3ZlcnNpb24uaCIKKyNpbmNsdWRlICJtYWluL3Z0eGZtdC5oIgorCisjaW5jbHVkZSAidmJvL3Zib19jb250ZXh0LmgiCisKKyNpbmNsdWRlICJkcml2ZXJzL2NvbW1vbi9kcml2ZXJmdW5jcy5oIgorI2luY2x1ZGUgImRyaXZlcnMvY29tbW9uL21ldGEuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfZGVmaW5lcy5oIgorI2luY2x1ZGUgImJyd19kcmF3LmgiCisjaW5jbHVkZSAiYnJ3X3N0YXRlLmgiCisKKyNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgorI2luY2x1ZGUgImludGVsX2J1ZmZlcl9vYmplY3RzLmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmZmVycy5oIgorI2luY2x1ZGUgImludGVsX2Ziby5oIgorI2luY2x1ZGUgImludGVsX21pcG1hcF90cmVlLmgiCisjaW5jbHVkZSAiaW50ZWxfcGl4ZWwuaCIKKyNpbmNsdWRlICJpbnRlbF9pbWFnZS5oIgorI2luY2x1ZGUgImludGVsX3RleC5oIgorI2luY2x1ZGUgImludGVsX3RleF9vYmouaCIKKworI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKKyNpbmNsdWRlICJ0bmwvdG5sLmgiCisjaW5jbHVkZSAidG5sL3RfcGlwZWxpbmUuaCIKKyNpbmNsdWRlICJnbHNsL3JhbGxvYy5oIgorCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2Rpc2tjYWNoZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNZXNhJ3MgRHJpdmVyIEZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNpemVfdAorYnJ3X3F1ZXJ5X3NhbXBsZXNfZm9yX2Zvcm1hdChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxGb3JtYXQsIGludCBzYW1wbGVzWzE2XSkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKKworICAgKHZvaWQpIHRhcmdldDsKKworICAgc3dpdGNoIChicnctPmdlbikgeworICAgY2FzZSA4OgorICAgICAgc2FtcGxlc1swXSA9IDg7CisgICAgICBzYW1wbGVzWzFdID0gNDsKKyAgICAgIHNhbXBsZXNbMl0gPSAyOworICAgICAgcmV0dXJuIDM7CisKKyAgIGNhc2UgNzoKKyAgICAgIHNhbXBsZXNbMF0gPSA4OworICAgICAgc2FtcGxlc1sxXSA9IDQ7CisgICAgICByZXR1cm4gMjsKKworICAgY2FzZSA2OgorICAgICAgc2FtcGxlc1swXSA9IDQ7CisgICAgICByZXR1cm4gMTsKKworICAgZGVmYXVsdDoKKyAgICAgIHNhbXBsZXNbMF0gPSAxOworICAgICAgcmV0dXJuIDE7CisgICB9Cit9CisKK2NvbnN0IGNoYXIgKmNvbnN0IGJyd192ZW5kb3Jfc3RyaW5nID0gIkludGVsIE9wZW4gU291cmNlIFRlY2hub2xvZ3kgQ2VudGVyIjsKKworY29uc3QgY2hhciAqCiticndfZ2V0X3JlbmRlcmVyX3N0cmluZyh1bnNpZ25lZCBkZXZpY2VJRCkKK3sKKyAgIGNvbnN0IGNoYXIgKmNoaXBzZXQ7CisgICBzdGF0aWMgY2hhciBidWZmZXJbMTI4XTsKKworICAgc3dpdGNoIChkZXZpY2VJRCkgeworI3VuZGVmIENISVBTRVQKKyNkZWZpbmUgQ0hJUFNFVChpZCwgc3ltYm9sLCBzdHIpIGNhc2UgaWQ6IGNoaXBzZXQgPSBzdHI7IGJyZWFrOworI2luY2x1ZGUgInBjaV9pZHMvaTk2NV9wY2lfaWRzLmgiCisgICBkZWZhdWx0OgorICAgICAgY2hpcHNldCA9ICJVbmtub3duIEludGVsIENoaXBzZXQiOworICAgICAgYnJlYWs7CisgICB9CisKKyAgICh2b2lkKSBkcmlHZXRSZW5kZXJlclN0cmluZyhidWZmZXIsIGNoaXBzZXQsIDApOworICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNvbnN0IEdMdWJ5dGUgKgoraW50ZWxHZXRTdHJpbmcoc3RydWN0IGdsX2NvbnRleHQgKiBjdHgsIEdMZW51bSBuYW1lKQoreworICAgY29uc3Qgc3RydWN0IGJyd19jb250ZXh0ICpjb25zdCBicncgPSBicndfY29udGV4dChjdHgpOworCisgICBzd2l0Y2ggKG5hbWUpIHsKKyAgIGNhc2UgR0xfVkVORE9SOgorICAgICAgcmV0dXJuIChHTHVieXRlICopIGJyd192ZW5kb3Jfc3RyaW5nOworCisgICBjYXNlIEdMX1JFTkRFUkVSOgorICAgICAgcmV0dXJuCisgICAgICAgICAoR0x1Ynl0ZSAqKSBicndfZ2V0X3JlbmRlcmVyX3N0cmluZyhicnctPmludGVsU2NyZWVuLT5kZXZpY2VJRCk7CisKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2ludGVsX3ZpZXdwb3J0KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGJyd19jb250ZXh0KGN0eCk7CisgICBfX0RSSWNvbnRleHQgKmRyaUNvbnRleHQgPSBicnctPmRyaUNvbnRleHQ7CisKKyAgIGlmIChfbWVzYV9pc193aW5zeXNfZmJvKGN0eC0+RHJhd0J1ZmZlcikpIHsKKyAgICAgIGRyaTJJbnZhbGlkYXRlRHJhd2FibGUoZHJpQ29udGV4dC0+ZHJpRHJhd2FibGVQcml2KTsKKyAgICAgIGRyaTJJbnZhbGlkYXRlRHJhd2FibGUoZHJpQ29udGV4dC0+ZHJpUmVhZGFibGVQcml2KTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2ludGVsSW52YWxpZGF0ZVN0YXRlKHN0cnVjdCBnbF9jb250ZXh0ICogY3R4LCBHTHVpbnQgbmV3X3N0YXRlKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dChjdHgpOworCisgICBpZiAoY3R4LT5zd3Jhc3RfY29udGV4dCkKKyAgICAgIF9zd3Jhc3RfSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKyAgIF92Ym9fSW52YWxpZGF0ZVN0YXRlKGN0eCwgbmV3X3N0YXRlKTsKKworICAgYnJ3LT5OZXdHTFN0YXRlIHw9IG5ld19zdGF0ZTsKK30KKworI2RlZmluZSBmbHVzaEZyb250KHNjcmVlbikgICAgICAoKHNjcmVlbiktPmltYWdlLmxvYWRlciA/IChzY3JlZW4pLT5pbWFnZS5sb2FkZXItPmZsdXNoRnJvbnRCdWZmZXIgOiAoc2NyZWVuKS0+ZHJpMi5sb2FkZXItPmZsdXNoRnJvbnRCdWZmZXIpCisKK3N0YXRpYyB2b2lkCitpbnRlbF9mbHVzaF9mcm9udChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dChjdHgpOworICAgX19EUkljb250ZXh0ICpkcmlDb250ZXh0ID0gYnJ3LT5kcmlDb250ZXh0OworICAgX19EUklkcmF3YWJsZSAqZHJpRHJhd2FibGUgPSBkcmlDb250ZXh0LT5kcmlEcmF3YWJsZVByaXY7CisgICBfX0RSSXNjcmVlbiAqY29uc3Qgc2NyZWVuID0gYnJ3LT5pbnRlbFNjcmVlbi0+ZHJpU2NyblByaXY7CisKKyAgIGlmIChicnctPmZyb250X2J1ZmZlcl9kaXJ0eSAmJiBfbWVzYV9pc193aW5zeXNfZmJvKGN0eC0+RHJhd0J1ZmZlcikpIHsKKyAgICAgIGlmIChmbHVzaEZyb250KHNjcmVlbikgJiYgZHJpRHJhd2FibGUgJiYKKyAgICAgICAgICBkcmlEcmF3YWJsZS0+bG9hZGVyUHJpdmF0ZSkgeworCisgICAgICAgICAvKiBSZXNvbHZlIGJlZm9yZSBmbHVzaGluZyBGQUtFX0ZST05UX0xFRlQgdG8gRlJPTlRfTEVGVC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBUaGlzIHBvdGVudGlhbGx5IHJlc29sdmVzIGJvdGggZnJvbnQgYW5kIGJhY2sgYnVmZmVyLiBJdAorICAgICAgICAgICogaXMgdW5uZWNlc3NhcnkgdG8gcmVzb2x2ZSB0aGUgYmFjaywgYnV0IGhhcm1zIG5vdGhpbmcgZXhjZXB0CisgICAgICAgICAgKiBwZXJmb3JtYW5jZS4gQW5kIG5vIG9uZSBjYXJlcyBhYm91dCBmcm9udC1idWZmZXIgcmVuZGVyCisgICAgICAgICAgKiBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAqLworICAgICAgICAgaW50ZWxfcmVzb2x2ZV9mb3JfZHJpMl9mbHVzaChicncsIGRyaURyYXdhYmxlKTsKKyAgICAgICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGJydyk7CisKKyAgICAgICAgIGZsdXNoRnJvbnQoc2NyZWVuKShkcmlEcmF3YWJsZSwgZHJpRHJhd2FibGUtPmxvYWRlclByaXZhdGUpOworCisgICAgICAgICAvKiBXZSBzZXQgdGhlIGRpcnR5IGJpdCBpbiBpbnRlbF9wcmVwYXJlX3JlbmRlcigpIGlmIHdlJ3JlCisgICAgICAgICAgKiBmcm9udCBidWZmZXIgcmVuZGVyaW5nIG9uY2Ugd2UgZ2V0IHRoZXJlLgorICAgICAgICAgICovCisgICAgICAgICBicnctPmZyb250X2J1ZmZlcl9kaXJ0eSA9IGZhbHNlOworICAgICAgfQorICAgfQorfQorCitzdGF0aWMgdm9pZAoraW50ZWxfZ2xGbHVzaChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dChjdHgpOworCisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChicncpOworICAgaW50ZWxfZmx1c2hfZnJvbnQoY3R4KTsKKyAgIGlmIChicndfaXNfZnJvbnRfYnVmZmVyX2RyYXdpbmcoY3R4LT5EcmF3QnVmZmVyKSkKKyAgICAgIGJydy0+bmVlZF90aHJvdHRsZSA9IHRydWU7Cit9CisKK3ZvaWQKK2ludGVsRmluaXNoKHN0cnVjdCBnbF9jb250ZXh0ICogY3R4KQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dChjdHgpOworCisgICBpbnRlbF9nbEZsdXNoKGN0eCk7CisKKyAgIGlmIChicnctPmJhdGNoLmxhc3RfYm8pCisgICAgICBkcm1faW50ZWxfYm9fd2FpdF9yZW5kZXJpbmcoYnJ3LT5iYXRjaC5sYXN0X2JvKTsKK30KKworc3RhdGljIHZvaWQKK2Jyd19pbml0X2RyaXZlcl9mdW5jdGlvbnMoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZF9mdW5jdGlvbl90YWJsZSAqZnVuY3Rpb25zKQoreworICAgX21lc2FfaW5pdF9kcml2ZXJfZnVuY3Rpb25zKGZ1bmN0aW9ucyk7CisKKyAgIC8qIEdMWCB1c2VzIERSSTIgaW52YWxpZGF0ZSBldmVudHMgdG8gaGFuZGxlIHdpbmRvdyByZXNpemluZy4KKyAgICAqIFVuZm9ydHVuYXRlbHksIEVHTCBkb2VzIG5vdCAtIGxpYkVHTCBpcyB3cml0dGVuIGluIFhDQiAobm90IFhsaWIpLAorICAgICogd2hpY2ggZG9lc24ndCBwcm92aWRlIGEgbWVjaGFuaXNtIGZvciBzbm9vcGluZyB0aGUgZXZlbnQgcXVldWVzLgorICAgICoKKyAgICAqIFNvIEVHTCBzdGlsbCByZWxpZXMgb24gdmlld3BvcnQgaGFja3MgdG8gaGFuZGxlIHdpbmRvdyByZXNpemluZy4KKyAgICAqIFRoaXMgc2hvdWxkIGdvIGF3YXkgd2l0aCBEUkkzMDAwLgorICAgICovCisgICBpZiAoIWJydy0+ZHJpQ29udGV4dC0+ZHJpU2NyZWVuUHJpdi0+ZHJpMi51c2VJbnZhbGlkYXRlKQorICAgICAgZnVuY3Rpb25zLT5WaWV3cG9ydCA9IGludGVsX3ZpZXdwb3J0OworCisgICBmdW5jdGlvbnMtPkZsdXNoID0gaW50ZWxfZ2xGbHVzaDsKKyAgIGZ1bmN0aW9ucy0+RmluaXNoID0gaW50ZWxGaW5pc2g7CisgICBmdW5jdGlvbnMtPkdldFN0cmluZyA9IGludGVsR2V0U3RyaW5nOworICAgZnVuY3Rpb25zLT5VcGRhdGVTdGF0ZSA9IGludGVsSW52YWxpZGF0ZVN0YXRlOworCisgICBpbnRlbEluaXRUZXh0dXJlRnVuY3MoZnVuY3Rpb25zKTsKKyAgIGludGVsSW5pdFRleHR1cmVJbWFnZUZ1bmNzKGZ1bmN0aW9ucyk7CisgICBpbnRlbEluaXRUZXh0dXJlU3ViSW1hZ2VGdW5jcyhmdW5jdGlvbnMpOworICAgaW50ZWxJbml0VGV4dHVyZUNvcHlJbWFnZUZ1bmNzKGZ1bmN0aW9ucyk7CisgICBpbnRlbEluaXRDbGVhckZ1bmNzKGZ1bmN0aW9ucyk7CisgICBpbnRlbEluaXRCdWZmZXJGdW5jcyhmdW5jdGlvbnMpOworICAgaW50ZWxJbml0UGl4ZWxGdW5jcyhmdW5jdGlvbnMpOworICAgaW50ZWxJbml0QnVmZmVyT2JqZWN0RnVuY3MoZnVuY3Rpb25zKTsKKyAgIGludGVsX2luaXRfc3luY29ial9mdW5jdGlvbnMoZnVuY3Rpb25zKTsKKyAgIGJyd19pbml0X29iamVjdF9wdXJnZWFibGVfZnVuY3Rpb25zKGZ1bmN0aW9ucyk7CisKKyAgIGJyd0luaXRGcmFnUHJvZ0Z1bmNzKCBmdW5jdGlvbnMgKTsKKyAgIGJyd19pbml0X2NvbW1vbl9xdWVyeW9ial9mdW5jdGlvbnMoZnVuY3Rpb25zKTsKKyAgIGlmIChicnctPmdlbiA+PSA2KQorICAgICAgZ2VuNl9pbml0X3F1ZXJ5b2JqX2Z1bmN0aW9ucyhmdW5jdGlvbnMpOworICAgZWxzZQorICAgICAgZ2VuNF9pbml0X3F1ZXJ5b2JqX2Z1bmN0aW9ucyhmdW5jdGlvbnMpOworCisgICBmdW5jdGlvbnMtPlF1ZXJ5U2FtcGxlc0ZvckZvcm1hdCA9IGJyd19xdWVyeV9zYW1wbGVzX2Zvcl9mb3JtYXQ7CisKKyAgIGZ1bmN0aW9ucy0+TmV3VHJhbnNmb3JtRmVlZGJhY2sgPSBicndfbmV3X3RyYW5zZm9ybV9mZWVkYmFjazsKKyAgIGZ1bmN0aW9ucy0+RGVsZXRlVHJhbnNmb3JtRmVlZGJhY2sgPSBicndfZGVsZXRlX3RyYW5zZm9ybV9mZWVkYmFjazsKKyAgIGZ1bmN0aW9ucy0+R2V0VHJhbnNmb3JtRmVlZGJhY2tWZXJ0ZXhDb3VudCA9CisgICAgICBicndfZ2V0X3RyYW5zZm9ybV9mZWVkYmFja192ZXJ0ZXhfY291bnQ7CisgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgZnVuY3Rpb25zLT5CZWdpblRyYW5zZm9ybUZlZWRiYWNrID0gZ2VuN19iZWdpbl90cmFuc2Zvcm1fZmVlZGJhY2s7CisgICAgICBmdW5jdGlvbnMtPkVuZFRyYW5zZm9ybUZlZWRiYWNrID0gZ2VuN19lbmRfdHJhbnNmb3JtX2ZlZWRiYWNrOworICAgICAgZnVuY3Rpb25zLT5QYXVzZVRyYW5zZm9ybUZlZWRiYWNrID0gZ2VuN19wYXVzZV90cmFuc2Zvcm1fZmVlZGJhY2s7CisgICAgICBmdW5jdGlvbnMtPlJlc3VtZVRyYW5zZm9ybUZlZWRiYWNrID0gZ2VuN19yZXN1bWVfdHJhbnNmb3JtX2ZlZWRiYWNrOworICAgfSBlbHNlIHsKKyAgICAgIGZ1bmN0aW9ucy0+QmVnaW5UcmFuc2Zvcm1GZWVkYmFjayA9IGJyd19iZWdpbl90cmFuc2Zvcm1fZmVlZGJhY2s7CisgICAgICBmdW5jdGlvbnMtPkVuZFRyYW5zZm9ybUZlZWRiYWNrID0gYnJ3X2VuZF90cmFuc2Zvcm1fZmVlZGJhY2s7CisgICB9CisKKyAgIGlmIChicnctPmdlbiA+PSA2KQorICAgICAgZnVuY3Rpb25zLT5HZXRTYW1wbGVQb3NpdGlvbiA9IGdlbjZfZ2V0X3NhbXBsZV9wb3NpdGlvbjsKK30KKworc3RhdGljIHZvaWQKK2Jyd19pbml0aWFsaXplX2NvbnRleHRfY29uc3RhbnRzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQoreworICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eCA9ICZicnctPmN0eDsKKworICAgdW5zaWduZWQgbWF4X3NhbXBsZXJzID0KKyAgICAgIGJydy0+Z2VuID49IDggfHwgYnJ3LT5pc19oYXN3ZWxsID8gQlJXX01BWF9URVhfVU5JVCA6IDE2OworCisgICBjdHgtPkNvbnN0LlF1ZXJ5Q291bnRlckJpdHMuVGltZXN0YW1wID0gMzY7CisKKyAgIGN0eC0+Q29uc3QuU3RyaXBUZXh0dXJlQm9yZGVyID0gdHJ1ZTsKKworICAgY3R4LT5Db25zdC5NYXhEdWFsU291cmNlRHJhd0J1ZmZlcnMgPSAxOworICAgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycyA9IEJSV19NQVhfRFJBV19CVUZGRVJTOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhUZXh0dXJlSW1hZ2VVbml0cyA9IG1heF9zYW1wbGVyczsKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHMgPSA4OyAvKiBNZXNhIGxpbWl0ICovCisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA9CisgICAgICBNSU4yKGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHMsCisgICAgICAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHMpOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSBtYXhfc2FtcGxlcnM7CisgICBpZiAoYnJ3LT5nZW4gPj0gNykKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSBtYXhfc2FtcGxlcnM7CisgICBlbHNlCisgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfR0VPTUVUUlldLk1heFRleHR1cmVJbWFnZVVuaXRzID0gMDsKKyAgIGlmIChnZXRlbnYoIklOVEVMX0NPTVBVVEVfU0hBREVSIikpIHsKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9DT01QVVRFXS5NYXhUZXh0dXJlSW1hZ2VVbml0cyA9IEJSV19NQVhfVEVYX1VOSVQ7CisgICAgICBjdHgtPkNvbnN0Lk1heFVuaWZvcm1CdWZmZXJCaW5kaW5ncyArPSAxMjsKKyAgIH0gZWxzZSB7CisgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfQ09NUFVURV0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSAwOworICAgfQorICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZFRleHR1cmVJbWFnZVVuaXRzID0KKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heFRleHR1cmVJbWFnZVVuaXRzICsKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHMgKworICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhUZXh0dXJlSW1hZ2VVbml0cyArCisgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfQ09NUFVURV0uTWF4VGV4dHVyZUltYWdlVW5pdHM7CisKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZUxldmVscyA9IDE0OyAvKiA4MTkyICovCisgICBpZiAoY3R4LT5Db25zdC5NYXhUZXh0dXJlTGV2ZWxzID4gTUFYX1RFWFRVUkVfTEVWRUxTKQorICAgICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlTGV2ZWxzID0gTUFYX1RFWFRVUkVfTEVWRUxTOworICAgY3R4LT5Db25zdC5NYXgzRFRleHR1cmVMZXZlbHMgPSAxMjsgLyogMjA0OCAqLworICAgY3R4LT5Db25zdC5NYXhDdWJlVGV4dHVyZUxldmVscyA9IDE0OyAvKiA4MTkyICovCisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVNYnl0ZXMgPSAxNTM2OworCisgICBpZiAoYnJ3LT5nZW4gPj0gNykKKyAgICAgIGN0eC0+Q29uc3QuTWF4QXJyYXlUZXh0dXJlTGF5ZXJzID0gMjA0ODsKKyAgIGVsc2UKKyAgICAgIGN0eC0+Q29uc3QuTWF4QXJyYXlUZXh0dXJlTGF5ZXJzID0gNTEyOworCisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVSZWN0U2l6ZSA9IDEgPDwgMTI7CisKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZU1heEFuaXNvdHJvcHkgPSAxNi4wOworCisgICBjdHgtPkNvbnN0Lk1heFJlbmRlcmJ1ZmZlclNpemUgPSA4MTkyOworCisgICAvKiBIYXJkd2FyZSBvbmx5IHN1cHBvcnRzIGEgbGltaXRlZCBudW1iZXIgb2YgdHJhbnNmb3JtIGZlZWRiYWNrIGJ1ZmZlcnMuCisgICAgKiBTbyB3ZSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBNZXNhIGRlZmF1bHQgKHdoaWNoIGlzIGJhc2VkIG9ubHkgb24gc29mdHdhcmUKKyAgICAqIGxpbWl0cykuCisgICAgKi8KKyAgIGN0eC0+Q29uc3QuTWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzID0gQlJXX01BWF9TT0xfQlVGRkVSUzsKKworICAgLyogT24gR2VuNiwgaW4gdGhlIHdvcnN0IGNhc2UsIHdlIHVzZSB1cCBvbmUgYmluZGluZyB0YWJsZSBlbnRyeSBwZXIKKyAgICAqIHRyYW5zZm9ybSBmZWVkYmFjayBjb21wb25lbnQgKHNlZSBjb21tZW50cyBhYm92ZSB0aGUgZGVmaW5pdGlvbiBvZgorICAgICogQlJXX01BWF9TT0xfQklORElOR1MsIGluIGJyd19jb250ZXh0LmgpLCBzbyB3ZSBuZWVkIHRvIGFkdmVydGlzZSBhIHZhbHVlCisgICAgKiBmb3IgTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTIGVxdWFsIHRvCisgICAgKiBCUldfTUFYX1NPTF9CSU5ESU5HUy4KKyAgICAqCisgICAgKiBJbiAic2VwYXJhdGUgY29tcG9uZW50cyIgbW9kZSwgd2UgbmVlZCB0byBkaXZpZGUgdGhpcyB2YWx1ZSBieQorICAgICogQlJXX01BWF9TT0xfQlVGRkVSUywgc28gdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mIGJpbmRpbmcgdGFibGUgZW50cmllcworICAgICogdXNlZCB1cCBieSBhbGwgYnVmZmVycyB3aWxsIG5vdCBleGNlZWQgQlJXX01BWF9TT0xfQklORElOR1MuCisgICAgKi8KKyAgIGN0eC0+Q29uc3QuTWF4VHJhbnNmb3JtRmVlZGJhY2tJbnRlcmxlYXZlZENvbXBvbmVudHMgPSBCUldfTUFYX1NPTF9CSU5ESU5HUzsKKyAgIGN0eC0+Q29uc3QuTWF4VHJhbnNmb3JtRmVlZGJhY2tTZXBhcmF0ZUNvbXBvbmVudHMgPQorICAgICAgQlJXX01BWF9TT0xfQklORElOR1MgLyBCUldfTUFYX1NPTF9CVUZGRVJTOworCisgICBjdHgtPkNvbnN0LkFsd2F5c1VzZUdldFRyYW5zZm9ybUZlZWRiYWNrVmVydGV4Q291bnQgPSB0cnVlOworCisgICBpbnQgbWF4X3NhbXBsZXM7CisgICBjb25zdCBpbnQgKm1zYWFfbW9kZXMgPSBpbnRlbF9zdXBwb3J0ZWRfbXNhYV9tb2RlcyhicnctPmludGVsU2NyZWVuKTsKKyAgIGNvbnN0IGludCBjbGFtcF9tYXhfc2FtcGxlcyA9CisgICAgICBkcmlRdWVyeU9wdGlvbmkoJmJydy0+b3B0aW9uQ2FjaGUsICJjbGFtcF9tYXhfc2FtcGxlcyIpOworCisgICBpZiAoY2xhbXBfbWF4X3NhbXBsZXMgPCAwKSB7CisgICAgICBtYXhfc2FtcGxlcyA9IG1zYWFfbW9kZXNbMF07CisgICB9IGVsc2UgeworICAgICAgLyogU2VsZWN0IHRoZSBsYXJnZXN0IHN1cHBvcnRlZCBNU0FBIG1vZGUgdGhhdCBkb2VzIG5vdCBleGNlZWQKKyAgICAgICAqIGNsYW1wX21heF9zYW1wbGVzLgorICAgICAgICovCisgICAgICBtYXhfc2FtcGxlcyA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgbXNhYV9tb2Rlc1tpXSAhPSAwOyArK2kpIHsKKyAgICAgICAgIGlmIChtc2FhX21vZGVzW2ldIDw9IGNsYW1wX21heF9zYW1wbGVzKSB7CisgICAgICAgICAgICBtYXhfc2FtcGxlcyA9IG1zYWFfbW9kZXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgY3R4LT5Db25zdC5NYXhTYW1wbGVzID0gbWF4X3NhbXBsZXM7CisgICBjdHgtPkNvbnN0Lk1heENvbG9yVGV4dHVyZVNhbXBsZXMgPSBtYXhfc2FtcGxlczsKKyAgIGN0eC0+Q29uc3QuTWF4RGVwdGhUZXh0dXJlU2FtcGxlcyA9IG1heF9zYW1wbGVzOworICAgY3R4LT5Db25zdC5NYXhJbnRlZ2VyU2FtcGxlcyA9IG1heF9zYW1wbGVzOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNykKKyAgICAgIGN0eC0+Q29uc3QuTWF4UHJvZ3JhbVRleHR1cmVHYXRoZXJDb21wb25lbnRzID0gNDsKKyAgIGVsc2UgaWYgKGJydy0+Z2VuID09IDYpCisgICAgICBjdHgtPkNvbnN0Lk1heFByb2dyYW1UZXh0dXJlR2F0aGVyQ29tcG9uZW50cyA9IDE7CisKKyAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoID0gMS4wOworICAgY3R4LT5Db25zdC5NaW5MaW5lV2lkdGhBQSA9IDEuMDsKKyAgIGN0eC0+Q29uc3QuTWF4TGluZVdpZHRoID0gNS4wOworICAgY3R4LT5Db25zdC5NYXhMaW5lV2lkdGhBQSA9IDUuMDsKKyAgIGN0eC0+Q29uc3QuTGluZVdpZHRoR3JhbnVsYXJpdHkgPSAwLjU7CisKKyAgIGN0eC0+Q29uc3QuTWluUG9pbnRTaXplID0gMS4wOworICAgY3R4LT5Db25zdC5NaW5Qb2ludFNpemVBQSA9IDEuMDsKKyAgIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplID0gMjU1LjA7CisgICBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZUFBID0gMjU1LjA7CisgICBjdHgtPkNvbnN0LlBvaW50U2l6ZUdyYW51bGFyaXR5ID0gMS4wOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNSB8fCBicnctPmlzX2c0eCkKKyAgICAgIGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lcyA9IDg7CisKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heE5hdGl2ZUluc3RydWN0aW9ucyA9IDE2ICogMTAyNDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heEFsdUluc3RydWN0aW9ucyA9IDA7CisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhUZXhJbnN0cnVjdGlvbnMgPSAwOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4VGV4SW5kaXJlY3Rpb25zID0gMDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heE5hdGl2ZUFsdUluc3RydWN0aW9ucyA9IDA7CisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhOYXRpdmVUZXhJbnN0cnVjdGlvbnMgPSAwOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4TmF0aXZlVGV4SW5kaXJlY3Rpb25zID0gMDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heE5hdGl2ZUF0dHJpYnMgPSAxNjsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heE5hdGl2ZVRlbXBzID0gMjU2OworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4TmF0aXZlQWRkcmVzc1JlZ3MgPSAxOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4TmF0aXZlUGFyYW1ldGVycyA9IDEwMjQ7CisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhFbnZQYXJhbXMgPQorICAgICAgTUlOMihjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhOYXRpdmVQYXJhbWV0ZXJzLAorCSAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heEVudlBhcmFtcyk7CisKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TmF0aXZlSW5zdHJ1Y3Rpb25zID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TmF0aXZlQWx1SW5zdHJ1Y3Rpb25zID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TmF0aXZlVGV4SW5zdHJ1Y3Rpb25zID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TmF0aXZlVGV4SW5kaXJlY3Rpb25zID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TmF0aXZlQXR0cmlicyA9IDEyOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhOYXRpdmVUZW1wcyA9IDI1NjsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4TmF0aXZlQWRkcmVzc1JlZ3MgPSAwOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhOYXRpdmVQYXJhbWV0ZXJzID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4RW52UGFyYW1zID0KKyAgICAgIE1JTjIoY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhOYXRpdmVQYXJhbWV0ZXJzLAorCSAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4RW52UGFyYW1zKTsKKworICAgLyogRnJhZ21lbnQgc2hhZGVycyB1c2UgcmVhbCwgMzItYml0IHR3b3MtY29tcGxlbWVudCBpbnRlZ2VycyBmb3IgYWxsCisgICAgKiBpbnRlZ2VyIHR5cGVzLgorICAgICovCisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLkxvd0ludC5SYW5nZU1pbiA9IDMxOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5Mb3dJbnQuUmFuZ2VNYXggPSAzMDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTG93SW50LlByZWNpc2lvbiA9IDA7CisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLkhpZ2hJbnQgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLkxvd0ludDsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWVkaXVtSW50ID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5Mb3dJbnQ7CisKKyAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heEF0b21pY0NvdW50ZXJzID0gTUFYX0FUT01JQ19DT1VOVEVSUzsKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heEF0b21pY0NvdW50ZXJzID0gTUFYX0FUT01JQ19DT1VOVEVSUzsKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4QXRvbWljQ291bnRlcnMgPSBNQVhfQVRPTUlDX0NPVU5URVJTOworICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0NPTVBVVEVdLk1heEF0b21pY0NvdW50ZXJzID0gTUFYX0FUT01JQ19DT1VOVEVSUzsKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4QXRvbWljQnVmZmVycyA9IEJSV19NQVhfQUJPOworICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4QXRvbWljQnVmZmVycyA9IEJSV19NQVhfQUJPOworICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhBdG9taWNCdWZmZXJzID0gQlJXX01BWF9BQk87CisgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfQ09NUFVURV0uTWF4QXRvbWljQnVmZmVycyA9IEJSV19NQVhfQUJPOworICAgICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZEF0b21pY0J1ZmZlcnMgPSAzICogQlJXX01BWF9BQk87CisgICB9CisKKyAgIC8qIEdlbjYgY29udmVydHMgcXVhZHMgdG8gcG9seWdvbiBpbiBiZWdpbm5pbmcgb2YgM0QgcGlwZWxpbmUsCisgICAgKiBidXQgd2UncmUgbm90IHN1cmUgaG93IGl0J3MgYWN0dWFsbHkgZG9uZSBmb3IgdmVydGV4IG9yZGVyLAorICAgICogdGhhdCBhZmZlY3QgcHJvdm9raW5nIHZlcnRleCBkZWNpc2lvbi4gQWx3YXlzIHVzZSBsYXN0IHZlcnRleAorICAgICogY29udmVudGlvbiBmb3IgcXVhZCBwcmltaXRpdmUgd2hpY2ggd29ya3MgYXMgZXhwZWN0ZWQgZm9yIG5vdy4KKyAgICAqLworICAgaWYgKGJydy0+Z2VuID49IDYpCisgICAgICBjdHgtPkNvbnN0LlF1YWRzRm9sbG93UHJvdm9raW5nVmVydGV4Q29udmVudGlvbiA9IGZhbHNlOworCisgICBjdHgtPkNvbnN0Lk5hdGl2ZUludGVnZXJzID0gdHJ1ZTsKKyAgIGN0eC0+Q29uc3QuVW5pZm9ybUJvb2xlYW5UcnVlID0gMTsKKworICAgLyogRnJvbSB0aGUgZ2VuNCBQUk0sIHZvbHVtZSA0IHBhZ2UgMTI3OgorICAgICoKKyAgICAqICAgICAiRm9yIFNVUkZUWVBFX0JVRkZFUiBub24tcmVuZGVydGFyZ2V0IHN1cmZhY2VzLCB0aGlzIGZpZWxkIHNwZWNpZmllcworICAgICogICAgICB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzdXJmYWNlLCBjb21wdXRlZCBpbgorICAgICogICAgICBzb2Z0d2FyZSBieSBhZGRpbmcgdGhlIHN1cmZhY2UgYmFzZSBhZGRyZXNzIHRvIHRoZSBieXRlIG9mZnNldCBvZgorICAgICogICAgICB0aGUgZWxlbWVudCBpbiB0aGUgYnVmZmVyLiIKKyAgICAqCisgICAgKiBIb3dldmVyLCB1bmFsaWduZWQgYWNjZXNzZXMgYXJlIHNsb3dlciwgc28gZW5mb3JjZSBidWZmZXIgYWxpZ25tZW50LgorICAgICovCisgICBjdHgtPkNvbnN0LlVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSAxNjsKKyAgIGN0eC0+Q29uc3QuVGV4dHVyZUJ1ZmZlck9mZnNldEFsaWdubWVudCA9IDE2OworCisgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgY3R4LT5Db25zdC5NYXhWYXJ5aW5nID0gMzI7CisgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhPdXRwdXRDb21wb25lbnRzID0gMTI4OworICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhJbnB1dENvbXBvbmVudHMgPSA2NDsKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4T3V0cHV0Q29tcG9uZW50cyA9IDEyODsKKyAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4SW5wdXRDb21wb25lbnRzID0gMTI4OworICAgfQorCisgICAvKiBXZSB3YW50IHRoZSBHTFNMIGNvbXBpbGVyIHRvIGVtaXQgY29kZSB0aGF0IHVzZXMgY29uZGl0aW9uIGNvZGVzICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBjdHgtPlNoYWRlckNvbXBpbGVyT3B0aW9uc1tpXS5NYXhJZkRlcHRoID0gYnJ3LT5nZW4gPCA2ID8gMTYgOiBVSU5UX01BWDsKKyAgICAgIGN0eC0+U2hhZGVyQ29tcGlsZXJPcHRpb25zW2ldLkVtaXRDb25kQ29kZXMgPSB0cnVlOworICAgICAgY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbaV0uRW1pdE5vTm9pc2UgPSB0cnVlOworICAgICAgY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbaV0uRW1pdE5vTWFpblJldHVybiA9IHRydWU7CisgICAgICBjdHgtPlNoYWRlckNvbXBpbGVyT3B0aW9uc1tpXS5FbWl0Tm9JbmRpcmVjdElucHV0ID0gdHJ1ZTsKKyAgICAgIGN0eC0+U2hhZGVyQ29tcGlsZXJPcHRpb25zW2ldLkVtaXROb0luZGlyZWN0T3V0cHV0ID0KKwkgKGkgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpOworICAgICAgY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbaV0uRW1pdE5vSW5kaXJlY3RUZW1wID0KKwkgKGkgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpOworICAgICAgY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbaV0uRW1pdE5vSW5kaXJlY3RVbmlmb3JtID0gZmFsc2U7CisgICAgICBjdHgtPlNoYWRlckNvbXBpbGVyT3B0aW9uc1tpXS5Mb3dlckNsaXBEaXN0YW5jZSA9IHRydWU7CisgICB9CisKKyAgIGN0eC0+U2hhZGVyQ29tcGlsZXJPcHRpb25zW01FU0FfU0hBREVSX1ZFUlRFWF0uT3B0aW1pemVGb3JBT1MgPSB0cnVlOworICAgY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbTUVTQV9TSEFERVJfR0VPTUVUUlldLk9wdGltaXplRm9yQU9TID0gdHJ1ZTsKKworICAgLyogQVJCX3ZpZXdwb3J0X2FycmF5ICovCisgICBpZiAoYnJ3LT5nZW4gPj0gNyAmJiAoY3R4LT5BUEkgPT0gQVBJX09QRU5HTF9DT1JFIHx8IGN0eC0+QVBJID09IEFQSV9WSykpIHsKKyAgICAgIGN0eC0+Q29uc3QuTWF4Vmlld3BvcnRzID0gR0VON19OVU1fVklFV1BPUlRTOworICAgICAgY3R4LT5Db25zdC5WaWV3cG9ydFN1YnBpeGVsQml0cyA9IDA7CisKKyAgICAgIC8qIENhc3QgdG8gZmxvYXQgYmVmb3JlIG5lZ2F0aW5nIGJlY2F1c2UgTWF4Vmlld3BvcnRXaWR0aCBpcyB1bnNpZ25lZC4KKyAgICAgICAqLworICAgICAgY3R4LT5Db25zdC5WaWV3cG9ydEJvdW5kcy5NaW4gPSAtKGZsb2F0KWN0eC0+Q29uc3QuTWF4Vmlld3BvcnRXaWR0aDsKKyAgICAgIGN0eC0+Q29uc3QuVmlld3BvcnRCb3VuZHMuTWF4ID0gY3R4LT5Db25zdC5NYXhWaWV3cG9ydFdpZHRoOworICAgfQorCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19EUkkpKSB7CisgICAgICBzd2l0Y2ggKGN0eC0+Q29uc3QuR2xhc3NNb2RlKSB7CisgICAgICBjYXNlIERSSV9DT05GX0dMQVNTX01PREVfTkVWRVI6ICAgICBmcHJpbnRmKHN0ZGVyciwgIkdsYXNzTW9kZSA9IG5ldmVyXG4iKTsgICAgIGJyZWFrOworICAgICAgY2FzZSBEUklfQ09ORl9HTEFTU19NT0RFX1dISVRFTElTVDogZnByaW50ZihzdGRlcnIsICJHbGFzc01vZGUgPSB3aGl0ZWxpc3RcbiIpOyBicmVhazsKKyAgICAgIGNhc2UgRFJJX0NPTkZfR0xBU1NfTU9ERV9BTFdBWVM6ICAgIGZwcmludGYoc3RkZXJyLCAiR2xhc3NNb2RlID0gYWx3YXlzXG4iKTsgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdsYXNzTW9kZSA9IHVua25vd25cbiIpOyAgIGJyZWFrOworICAgICAgfQorICAgfQorfQorCisvKioKKyAqIFByb2Nlc3MgZHJpY29uZiAoZHJpcmMpIG9wdGlvbnMsIHNldHRpbmcgYXBwcm9wcmlhdGUgY29udGV4dCBmbGFncy4KKyAqCisgKiBpbnRlbEluaXRFeHRlbnNpb25zIHN0aWxsIHBva2VzIGF0IG9wdGlvbkNhY2hlIGRpcmVjdGx5LCBpbiBvcmRlciB0bworICogYXZvaWQgYWR2ZXJ0aXNpbmcgdmFyaW91cyBleHRlbnNpb25zLiAgTm8gZmxhZ3MgYXJlIHNldCwgc28gaXQgbWFrZXMKKyAqIHNlbnNlIHRvIGNvbnRpbnVlIGRvaW5nIHRoYXQgdGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCiticndfcHJvY2Vzc19kcmljb25mX29wdGlvbnMoc3RydWN0IGJyd19jb250ZXh0ICpicncpCit7CisgICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gJmJydy0+Y3R4OworCisgICBkcmlPcHRpb25DYWNoZSAqb3B0aW9ucyA9ICZicnctPm9wdGlvbkNhY2hlOworICAgZHJpUGFyc2VDb25maWdGaWxlcyhvcHRpb25zLCAmYnJ3LT5pbnRlbFNjcmVlbi0+b3B0aW9uQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJydy0+ZHJpQ29udGV4dC0+ZHJpU2NyZWVuUHJpdi0+bXlOdW0sICJpOTY1Iik7CisKKyAgIGludCBib19yZXVzZV9tb2RlID0gZHJpUXVlcnlPcHRpb25pKG9wdGlvbnMsICJib19yZXVzZSIpOworICAgc3dpdGNoIChib19yZXVzZV9tb2RlKSB7CisgICBjYXNlIERSSV9DT05GX0JPX1JFVVNFX0RJU0FCTEVEOgorICAgICAgYnJlYWs7CisgICBjYXNlIERSSV9DT05GX0JPX1JFVVNFX0FMTDoKKyAgICAgIGludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3JldXNlKGJydy0+YnVmbWdyKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBpZiAoIWRyaVF1ZXJ5T3B0aW9uYihvcHRpb25zLCAiaGl6IikpIHsKKyAgICAgICBicnctPmhhc19oaXogPSBmYWxzZTsKKyAgICAgICAvKiBPbiBnZW42LCB5b3UgY2FuIG9ubHkgZG8gc2VwYXJhdGUgc3RlbmNpbCB3aXRoIEhJWi4gKi8KKyAgICAgICBpZiAoYnJ3LT5nZW4gPT0gNikKKyAgICAgICAgICBicnctPmhhc19zZXBhcmF0ZV9zdGVuY2lsID0gZmFsc2U7CisgICB9CisKKyAgIGlmIChkcmlRdWVyeU9wdGlvbmIob3B0aW9ucywgImFsd2F5c19mbHVzaF9iYXRjaCIpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImZsdXNoaW5nIGJhdGNoYnVmZmVyIGJlZm9yZS9hZnRlciBlYWNoIGRyYXcgY2FsbFxuIik7CisgICAgICBicnctPmFsd2F5c19mbHVzaF9iYXRjaCA9IHRydWU7CisgICB9CisKKyAgIGlmIChkcmlRdWVyeU9wdGlvbmIob3B0aW9ucywgImFsd2F5c19mbHVzaF9jYWNoZSIpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImZsdXNoaW5nIEdQVSBjYWNoZXMgYmVmb3JlL2FmdGVyIGVhY2ggZHJhdyBjYWxsXG4iKTsKKyAgICAgIGJydy0+YWx3YXlzX2ZsdXNoX2NhY2hlID0gdHJ1ZTsKKyAgIH0KKworICAgaWYgKGRyaVF1ZXJ5T3B0aW9uYihvcHRpb25zLCAiZGlzYWJsZV90aHJvdHRsaW5nIikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiZGlzYWJsaW5nIGZsdXNoIHRocm90dGxpbmdcbiIpOworICAgICAgYnJ3LT5kaXNhYmxlX3Rocm90dGxpbmcgPSB0cnVlOworICAgfQorCisgICBicnctPmRpc2FibGVfZGVyaXZhdGl2ZV9vcHRpbWl6YXRpb24gPQorICAgICAgZHJpUXVlcnlPcHRpb25iKCZicnctPm9wdGlvbkNhY2hlLCAiZGlzYWJsZV9kZXJpdmF0aXZlX29wdGltaXphdGlvbiIpOworCisgICBicnctPnByZWNvbXBpbGUgPSBkcmlRdWVyeU9wdGlvbmIoJmJydy0+b3B0aW9uQ2FjaGUsICJzaGFkZXJfcHJlY29tcGlsZSIpOworCisgICBjdHgtPkNvbnN0LkZvcmNlR0xTTEV4dGVuc2lvbnNXYXJuID0KKyAgICAgIGRyaVF1ZXJ5T3B0aW9uYihvcHRpb25zLCAiZm9yY2VfZ2xzbF9leHRlbnNpb25zX3dhcm4iKTsKKworICAgY3R4LT5Db25zdC5EaXNhYmxlR0xTTExpbmVDb250aW51YXRpb25zID0KKyAgICAgIGRyaVF1ZXJ5T3B0aW9uYihvcHRpb25zLCAiZGlzYWJsZV9nbHNsX2xpbmVfY29udGludWF0aW9ucyIpOworCisKKyAgIGN0eC0+Q29uc3QuR2xhc3NNb2RlID0gZHJpUXVlcnlPcHRpb25pKCZicnctPm9wdGlvbkNhY2hlLCAiZ2xhc3NfbW9kZSIpOworICAgY3R4LT5Db25zdC5HbGFzc0VuYWJsZVJlYXNzb2NpYXRpb24gPQorICAgICAgZHJpUXVlcnlPcHRpb25iKCZicnctPm9wdGlvbkNhY2hlLCAiZ2xhc3NfZW5hYmxlX3JlYXNzb2NpYXRpb24iKTsKKworCisgICBjb25zdCBpbnQgbXVsdGl0aHJlYWRfZ2xzbF9jb21waWxlciA9CisgICAgICBkcmlRdWVyeU9wdGlvbmkob3B0aW9ucywgIm11bHRpdGhyZWFkX2dsc2xfY29tcGlsZXIiKTsKKyAgIGlmIChtdWx0aXRocmVhZF9nbHNsX2NvbXBpbGVyID4gMCkgeworICAgICAgY29uc3QgaW50IG1heF90aHJlYWRzID0gKG11bHRpdGhyZWFkX2dsc2xfY29tcGlsZXIgPiAxKSA/CisgICAgICAgICBtdWx0aXRocmVhZF9nbHNsX2NvbXBpbGVyIDogMjsKKworICAgICAgX21lc2FfZW5hYmxlX2dsc2xfdGhyZWFkcG9vbChjdHgsIG1heF90aHJlYWRzKTsKKyAgICAgIGN0eC0+Q29uc3QuRGVmZXJDb21waWxlU2hhZGVyID0gR0xfVFJVRTsKKyAgICAgIGN0eC0+Q29uc3QuRGVmZXJMaW5rUHJvZ3JhbSA9IEdMX1RSVUU7CisgICB9CisKKworICAgaW50IG1heF9zaGFkZXJfY2FjaGVfc2l6ZSA9IDA7CisgICBtYXhfc2hhZGVyX2NhY2hlX3NpemUgPSBkcmlRdWVyeU9wdGlvbmkob3B0aW9ucywgIm1heF9zaGFkZXJfY2FjaGVfc2l6ZSIpOworICAgaWYgKG1heF9zaGFkZXJfY2FjaGVfc2l6ZSAhPSAwKQorICAgICAgY3R4LT5Db25zdC5NYXhTaGFkZXJDYWNoZVNpemUgPSAodW5zaWduZWQpIG1heF9zaGFkZXJfY2FjaGVfc2l6ZTsKKworICAgbWVzYV9wcm9ncmFtX2Rpc2tjYWNoZV9pbml0KGN0eCk7CisgICBtZXNhX3NoYWRlcl9kaXNrY2FjaGVfaW5pdChjdHgpOworfQorCitHTGJvb2xlYW4KK2Jyd0NyZWF0ZUNvbnRleHQoZ2xfYXBpIGFwaSwKKwkgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfY29uZmlnICptZXNhVmlzLAorCQkgX19EUkljb250ZXh0ICpkcmlDb250ZXh0UHJpdiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWFqb3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWlub3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5X3Jlc2V0LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqZHJpX2N0eF9lcnJvciwKKwkgICAgICAgICB2b2lkICpzaGFyZWRDb250ZXh0UHJpdmF0ZSkKK3sKKyAgIF9fRFJJc2NyZWVuICpzUHJpdiA9IGRyaUNvbnRleHRQcml2LT5kcmlTY3JlZW5Qcml2OworICAgc3RydWN0IGdsX2NvbnRleHQgKnNoYXJlQ3R4ID0gKHN0cnVjdCBnbF9jb250ZXh0ICopIHNoYXJlZENvbnRleHRQcml2YXRlOworICAgc3RydWN0IGludGVsX3NjcmVlbiAqc2NyZWVuID0gc1ByaXYtPmRyaXZlclByaXZhdGU7CisgICBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvICpkZXZpbmZvID0gc2NyZWVuLT5kZXZpbmZvOworICAgc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlIGZ1bmN0aW9uczsKKworICAgLyogT25seSBhbGxvdyB0aGUgX19EUklfQ1RYX0ZMQUdfUk9CVVNUX0JVRkZFUl9BQ0NFU1MgZmxhZyBpZiB0aGUga2VybmVsCisgICAgKiBwcm92aWRlcyB1cyB3aXRoIGNvbnRleHQgcmVzZXQgbm90aWZpY2F0aW9ucy4KKyAgICAqLworICAgdWludDMyX3QgYWxsb3dlZF9mbGFncyA9IF9fRFJJX0NUWF9GTEFHX0RFQlVHCisgICAgICB8IF9fRFJJX0NUWF9GTEFHX0ZPUldBUkRfQ09NUEFUSUJMRTsKKworICAgaWYgKHNjcmVlbi0+aGFzX2NvbnRleHRfcmVzZXRfbm90aWZpY2F0aW9uKQorICAgICAgYWxsb3dlZF9mbGFncyB8PSBfX0RSSV9DVFhfRkxBR19ST0JVU1RfQlVGRkVSX0FDQ0VTUzsKKworICAgaWYgKGZsYWdzICYgfmFsbG93ZWRfZmxhZ3MpIHsKKyAgICAgICpkcmlfY3R4X2Vycm9yID0gX19EUklfQ1RYX0VSUk9SX1VOS05PV05fRkxBRzsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSByemFsbG9jKE5VTEwsIHN0cnVjdCBicndfY29udGV4dCk7CisgICBpZiAoIWJydykgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZmFpbGVkIHRvIGFsbG9jIGNvbnRleHRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAqZHJpX2N0eF9lcnJvciA9IF9fRFJJX0NUWF9FUlJPUl9OT19NRU1PUlk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlID0gYnJ3OworICAgYnJ3LT5kcmlDb250ZXh0ID0gZHJpQ29udGV4dFByaXY7CisgICBicnctPmludGVsU2NyZWVuID0gc2NyZWVuOworICAgYnJ3LT5idWZtZ3IgPSBzY3JlZW4tPmJ1Zm1ncjsKKworICAgYnJ3LT5nZW4gPSBkZXZpbmZvLT5nZW47CisgICBicnctPmd0ID0gZGV2aW5mby0+Z3Q7CisgICBicnctPmlzX2c0eCA9IGRldmluZm8tPmlzX2c0eDsKKyAgIGJydy0+aXNfYmF5dHJhaWwgPSBkZXZpbmZvLT5pc19iYXl0cmFpbDsKKyAgIGJydy0+aXNfaGFzd2VsbCA9IGRldmluZm8tPmlzX2hhc3dlbGw7CisgICBicnctPmhhc19sbGMgPSBkZXZpbmZvLT5oYXNfbGxjOworICAgYnJ3LT5oYXNfaGl6ID0gZGV2aW5mby0+aGFzX2hpel9hbmRfc2VwYXJhdGVfc3RlbmNpbDsKKyAgIGJydy0+aGFzX3NlcGFyYXRlX3N0ZW5jaWwgPSBkZXZpbmZvLT5oYXNfaGl6X2FuZF9zZXBhcmF0ZV9zdGVuY2lsOworICAgYnJ3LT5oYXNfcGxuID0gZGV2aW5mby0+aGFzX3BsbjsKKyAgIGJydy0+aGFzX2NvbXByNCA9IGRldmluZm8tPmhhc19jb21wcjQ7CisgICBicnctPmhhc19zdXJmYWNlX3RpbGVfb2Zmc2V0ID0gZGV2aW5mby0+aGFzX3N1cmZhY2VfdGlsZV9vZmZzZXQ7CisgICBicnctPmhhc19uZWdhdGl2ZV9yaHdfYnVnID0gZGV2aW5mby0+aGFzX25lZ2F0aXZlX3Jod19idWc7CisgICBicnctPm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPQorICAgICAgZGV2aW5mby0+bmVlZHNfdW5saXRfY2VudHJvaWRfd29ya2Fyb3VuZDsKKworICAgYnJ3LT5tdXN0X3VzZV9zZXBhcmF0ZV9zdGVuY2lsID0gc2NyZWVuLT5od19tdXN0X3VzZV9zZXBhcmF0ZV9zdGVuY2lsOworICAgYnJ3LT5oYXNfc3dpenpsaW5nID0gc2NyZWVuLT5od19oYXNfc3dpenpsaW5nOworCisgICBicnctPnZzLmJhc2Uuc3RhZ2UgPSBNRVNBX1NIQURFUl9WRVJURVg7CisgICBicnctPmdzLmJhc2Uuc3RhZ2UgPSBNRVNBX1NIQURFUl9HRU9NRVRSWTsKKyAgIGJydy0+d20uYmFzZS5zdGFnZSA9IE1FU0FfU0hBREVSX0ZSQUdNRU5UOworICAgaWYgKGJydy0+Z2VuID49IDgpIHsKKyAgICAgIGdlbjhfaW5pdF92dGFibGVfc3VyZmFjZV9mdW5jdGlvbnMoYnJ3KTsKKyAgICAgIGdlbjdfaW5pdF92dGFibGVfc2FtcGxlcl9mdW5jdGlvbnMoYnJ3KTsKKyAgICAgIGJydy0+dnRibC5lbWl0X2RlcHRoX3N0ZW5jaWxfaGl6ID0gZ2VuOF9lbWl0X2RlcHRoX3N0ZW5jaWxfaGl6OworICAgfSBlbHNlIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICBnZW43X2luaXRfdnRhYmxlX3N1cmZhY2VfZnVuY3Rpb25zKGJydyk7CisgICAgICBnZW43X2luaXRfdnRhYmxlX3NhbXBsZXJfZnVuY3Rpb25zKGJydyk7CisgICAgICBicnctPnZ0YmwuZW1pdF9kZXB0aF9zdGVuY2lsX2hpeiA9IGdlbjdfZW1pdF9kZXB0aF9zdGVuY2lsX2hpejsKKyAgIH0gZWxzZSB7CisgICAgICBnZW40X2luaXRfdnRhYmxlX3N1cmZhY2VfZnVuY3Rpb25zKGJydyk7CisgICAgICBnZW40X2luaXRfdnRhYmxlX3NhbXBsZXJfZnVuY3Rpb25zKGJydyk7CisgICAgICBicnctPnZ0YmwuZW1pdF9kZXB0aF9zdGVuY2lsX2hpeiA9IGJyd19lbWl0X2RlcHRoX3N0ZW5jaWxfaGl6OworICAgfQorCisgICBicndfaW5pdF9kcml2ZXJfZnVuY3Rpb25zKGJydywgJmZ1bmN0aW9ucyk7CisKKyAgIGlmIChub3RpZnlfcmVzZXQpCisgICAgICBmdW5jdGlvbnMuR2V0R3JhcGhpY3NSZXNldFN0YXR1cyA9IGJyd19nZXRfZ3JhcGhpY3NfcmVzZXRfc3RhdHVzOworCisgICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gJmJydy0+Y3R4OworCisgICBpZiAoIV9tZXNhX2luaXRpYWxpemVfY29udGV4dChjdHgsIGFwaSwgbWVzYVZpcywgc2hhcmVDdHgsICZmdW5jdGlvbnMpKSB7CisgICAgICAqZHJpX2N0eF9lcnJvciA9IF9fRFJJX0NUWF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmYWlsZWQgdG8gaW5pdCBtZXNhIGNvbnRleHRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBpbnRlbERlc3Ryb3lDb250ZXh0KGRyaUNvbnRleHRQcml2KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgZHJpQ29udGV4dFNldEZsYWdzKGN0eCwgZmxhZ3MpOworCisgICAvKiBJbml0aWFsaXplIHRoZSBzb2Z0d2FyZSByYXN0ZXJpemVyIGFuZCBoZWxwZXIgbW9kdWxlcy4KKyAgICAqCisgICAgKiBBcyBvZiBHTCAzLjEgY29yZSwgdGhlIGdlbjQrIGRyaXZlciBkb2Vzbid0IG5lZWQgdGhlIHN3cmFzdCBjb250ZXh0IGZvcgorICAgICogc29mdHdhcmUgZmFsbGJhY2tzICh3aGljaCB3ZSBoYXZlIHRvIHN1cHBvcnQgb24gbGVnYWN5IEdMIHRvIGRvIHdlaXJkCisgICAgKiBnbERyYXdQaXhlbHMoKSwgZ2xCaXRtYXAoKSwgYW5kIG90aGVyIGZ1bmN0aW9ucykuCisgICAgKi8KKyAgIGlmIChhcGkgIT0gQVBJX09QRU5HTF9DT1JFICYmIGFwaSAhPSBBUElfT1BFTkdMRVMyKSB7CisgICAgICBfc3dyYXN0X0NyZWF0ZUNvbnRleHQoY3R4KTsKKyAgIH0KKworICAgX3Zib19DcmVhdGVDb250ZXh0KGN0eCk7CisgICBpZiAoY3R4LT5zd3Jhc3RfY29udGV4dCkgeworICAgICAgX3RubF9DcmVhdGVDb250ZXh0KGN0eCk7CisgICAgICBUTkxfQ09OVEVYVChjdHgpLT5Ecml2ZXIuUnVuUGlwZWxpbmUgPSBfdG5sX3J1bl9waXBlbGluZTsKKyAgICAgIF9zd3NldHVwX0NyZWF0ZUNvbnRleHQoY3R4KTsKKworICAgICAgLyogQ29uZmlndXJlIHN3cmFzdCB0byBtYXRjaCBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3M6ICovCisgICAgICBfc3dyYXN0X2FsbG93X3BpeGVsX2ZvZyhjdHgsIGZhbHNlKTsKKyAgICAgIF9zd3Jhc3RfYWxsb3dfdmVydGV4X2ZvZyhjdHgsIHRydWUpOworICAgfQorCisgICBfbWVzYV9tZXRhX2luaXQoY3R4KTsKKworICAgYnJ3X3Byb2Nlc3NfZHJpY29uZl9vcHRpb25zKGJydyk7CisgICBicndfcHJvY2Vzc19pbnRlbF9kZWJ1Z192YXJpYWJsZShicncpOworICAgYnJ3X2luaXRpYWxpemVfY29udGV4dF9jb25zdGFudHMoYnJ3KTsKKworICAgY3R4LT5Db25zdC5SZXNldFN0cmF0ZWd5ID0gbm90aWZ5X3Jlc2V0CisgICAgICA/IEdMX0xPU0VfQ09OVEVYVF9PTl9SRVNFVF9BUkIgOiBHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fQVJCOworCisgICAvKiBSZWluaXRpYWxpemUgdGhlIGNvbnRleHQgcG9pbnQgc3RhdGUuICBJdCBkZXBlbmRzIG9uIGN0eC0+Q29uc3QgdmFsdWVzLiAqLworICAgX21lc2FfaW5pdF9wb2ludChjdHgpOworCisgICBpbnRlbF9mYm9faW5pdChicncpOworCisgICBpbnRlbF9iYXRjaGJ1ZmZlcl9pbml0KGJydyk7CisKKyAgIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICAvKiBDcmVhdGUgYSBuZXcgaGFyZHdhcmUgY29udGV4dC4gIFVzaW5nIGEgaGFyZHdhcmUgY29udGV4dCBtZWFucyB0aGF0CisgICAgICAgKiBvdXIgR1BVIHN0YXRlIHdpbGwgYmUgc2F2ZWQvcmVzdG9yZWQgb24gY29udGV4dCBzd2l0Y2gsIGFsbG93aW5nIHVzCisgICAgICAgKiB0byBhc3N1bWUgdGhhdCB0aGUgR1BVIGlzIGluIHRoZSBzYW1lIHN0YXRlIHdlIGxlZnQgaXQgaW4uCisgICAgICAgKgorICAgICAgICogVGhpcyBpcyByZXF1aXJlZCBmb3IgdHJhbnNmb3JtIGZlZWRiYWNrIGJ1ZmZlciBvZmZzZXRzLCBxdWVyeSBvYmplY3RzLAorICAgICAgICogYW5kIGFsc28gYWxsb3dzIHVzIHRvIHJlZHVjZSBob3cgbXVjaCBzdGF0ZSB3ZSBoYXZlIHRvIGVtaXQuCisgICAgICAgKi8KKyAgICAgIGJydy0+aHdfY3R4ID0gZHJtX2ludGVsX2dlbV9jb250ZXh0X2NyZWF0ZShicnctPmJ1Zm1ncik7CisKKyAgICAgIGlmICghYnJ3LT5od19jdHgpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR2VuNisgcmVxdWlyZXMgS2VybmVsIDMuNiBvciBsYXRlci5cbiIpOworICAgICAgICAgaW50ZWxEZXN0cm95Q29udGV4dChkcmlDb250ZXh0UHJpdik7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisKKyAgIGJyd19pbml0X3N0YXRlKGJydyk7CisKKyAgIGludGVsSW5pdEV4dGVuc2lvbnMoY3R4KTsKKworICAgYnJ3X2luaXRfc3VyZmFjZV9mb3JtYXRzKGJydyk7CisKKyAgIGJydy0+bWF4X3ZzX3RocmVhZHMgPSBkZXZpbmZvLT5tYXhfdnNfdGhyZWFkczsKKyAgIGJydy0+bWF4X2dzX3RocmVhZHMgPSBkZXZpbmZvLT5tYXhfZ3NfdGhyZWFkczsKKyAgIGJydy0+bWF4X3dtX3RocmVhZHMgPSBkZXZpbmZvLT5tYXhfd21fdGhyZWFkczsKKyAgIGJydy0+dXJiLnNpemUgPSBkZXZpbmZvLT51cmIuc2l6ZTsKKyAgIGJydy0+dXJiLm1pbl92c19lbnRyaWVzID0gZGV2aW5mby0+dXJiLm1pbl92c19lbnRyaWVzOworICAgYnJ3LT51cmIubWF4X3ZzX2VudHJpZXMgPSBkZXZpbmZvLT51cmIubWF4X3ZzX2VudHJpZXM7CisgICBicnctPnVyYi5tYXhfZ3NfZW50cmllcyA9IGRldmluZm8tPnVyYi5tYXhfZ3NfZW50cmllczsKKworICAgLyogRXN0aW1hdGUgdGhlIHNpemUgb2YgdGhlIG1hcHBhYmxlIGFwZXJ0dXJlIGludG8gdGhlIEdUVC4gIFRoZXJlJ3MgYW4KKyAgICAqIGlvY3RsIHRvIGdldCB0aGUgd2hvbGUgR1RUIHNpemUsIGJ1dCBub3Qgb25lIHRvIGdldCB0aGUgbWFwcGFibGUgc3Vic2V0LgorICAgICogSXQgdHVybnMgb3V0IGl0J3MgYmFzaWNhbGx5IGFsd2F5cyAyNTZNQiwgdGhvdWdoIHNvbWUgYW5jaWVudCBoYXJkd2FyZQorICAgICogd2FzIHNtYWxsZXIuCisgICAgKi8KKyAgIHVpbnQzMl90IGd0dF9zaXplID0gMjU2ICogMTAyNCAqIDEwMjQ7CisKKyAgIC8qIFdlIGRvbid0IHdhbnQgdG8gbWFwIHR3byBvYmplY3RzIHN1Y2ggdGhhdCBhIG1lbWNweSBiZXR3ZWVuIHRoZW0gd291bGQKKyAgICAqIGp1c3QgZmF1bHQgb25lIG1hcHBpbmcgaW4gYW5kIHRoZW4gdGhlIG90aGVyIG92ZXIgYW5kIG92ZXIgZm9yZXZlci4gIFNvCisgICAgKiB3ZSB3b3VsZCBuZWVkIHRvIGRpdmlkZSB0aGUgR1RUIHNpemUgYnkgMi4gIEFkZGl0aW9uYWxseSwgc29tZSBHVFQgaXMKKyAgICAqIHRha2VuIHVwIGJ5IHRoaW5ncyBsaWtlIHRoZSBmcmFtZWJ1ZmZlciBhbmQgdGhlIHJpbmdidWZmZXIgYW5kIHN1Y2gsIHNvCisgICAgKiBiZSBtb3JlIGNvbnNlcnZhdGl2ZS4KKyAgICAqLworICAgYnJ3LT5tYXhfZ3R0X21hcF9vYmplY3Rfc2l6ZSA9IGd0dF9zaXplIC8gNDsKKworICAgaWYgKGJydy0+Z2VuID09IDYpCisgICAgICBicnctPnVyYi5nZW42X2dzX3ByZXZpb3VzbHlfYWN0aXZlID0gZmFsc2U7CisKKyAgIGJydy0+cHJpbV9yZXN0YXJ0LmluX3Byb2dyZXNzID0gZmFsc2U7CisgICBicnctPnByaW1fcmVzdGFydC5lbmFibGVfY3V0X2luZGV4ID0gZmFsc2U7CisgICBicnctPmdzLmVuYWJsZWQgPSBmYWxzZTsKKworICAgaWYgKGJydy0+Z2VuIDwgNikgeworICAgICAgYnJ3LT5jdXJiZS5sYXN0X2J1ZiA9IGNhbGxvYygxLCA0MDk2KTsKKyAgICAgIGJydy0+Y3VyYmUubmV4dF9idWYgPSBjYWxsb2MoMSwgNDA5Nik7CisgICB9CisKKyAgIGN0eC0+VmVydGV4UHJvZ3JhbS5fTWFpbnRhaW5UbmxQcm9ncmFtID0gdHJ1ZTsKKyAgIGN0eC0+RnJhZ21lbnRQcm9ncmFtLl9NYWludGFpblRleEVudlByb2dyYW0gPSB0cnVlOworCisgICBicndfZHJhd19pbml0KCBicncgKTsKKworICAgaWYgKChmbGFncyAmIF9fRFJJX0NUWF9GTEFHX0RFQlVHKSAhPSAwKSB7CisgICAgICAvKiBUdXJuIG9uIHNvbWUgZXh0cmEgR0xfQVJCX2RlYnVnX291dHB1dCBnZW5lcmF0aW9uLiAqLworICAgICAgYnJ3LT5wZXJmX2RlYnVnID0gdHJ1ZTsKKyAgIH0KKworICAgaWYgKChmbGFncyAmIF9fRFJJX0NUWF9GTEFHX1JPQlVTVF9CVUZGRVJfQUNDRVNTKSAhPSAwKQorICAgICAgY3R4LT5Db25zdC5Db250ZXh0RmxhZ3MgfD0gR0xfQ09OVEVYVF9GTEFHX1JPQlVTVF9BQ0NFU1NfQklUX0FSQjsKKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU0hBREVSX1RJTUUpCisgICAgICBicndfaW5pdF9zaGFkZXJfdGltZShicncpOworCisgICAvKiBicndfc2hhZGVyX3ByZWNvbXBpbGUgaXMgbm90IHRocmVhZC1zYWZlIHdoZW4gZGVidWcgZmxhZ3MgYXJlIHNldCAqLworICAgaWYgKGJydy0+cHJlY29tcGlsZSAmJiAoSU5URUxfREVCVUcgfHwgYnJ3LT5wZXJmX2RlYnVnKSkKKyAgICAgIGN0eC0+Q29uc3QuRGVmZXJMaW5rUHJvZ3JhbSA9IEdMX0ZBTFNFOworCisgICBfbWVzYV9jb21wdXRlX3ZlcnNpb24oY3R4KTsKKworICAgX21lc2FfaW5pdGlhbGl6ZV9kaXNwYXRjaF90YWJsZXMoY3R4KTsKKyAgIF9tZXNhX2luaXRpYWxpemVfdmJvX3Z0eGZtdChjdHgpOworCisgICBpZiAoY3R4LT5FeHRlbnNpb25zLkFNRF9wZXJmb3JtYW5jZV9tb25pdG9yKSB7CisgICAgICBicndfaW5pdF9wZXJmb3JtYW5jZV9tb25pdG9ycyhicncpOworICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAoraW50ZWxEZXN0cm95Q29udGV4dChfX0RSSWNvbnRleHQgKiBkcmlDb250ZXh0UHJpdikKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0KKyAgICAgIChzdHJ1Y3QgYnJ3X2NvbnRleHQgKikgZHJpQ29udGV4dFByaXYtPmRyaXZlclByaXZhdGU7CisgICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gJmJydy0+Y3R4OworCisgICBhc3NlcnQoYnJ3KTsgLyogc2hvdWxkIG5ldmVyIGJlIG51bGwgKi8KKyAgIGlmICghYnJ3KQorICAgICAgcmV0dXJuOworCisgICAvKiBEdW1wIGEgZmluYWwgQk1QIGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIGRvZXNuJ3QgY2FsbCBTd2FwQnVmZmVycyAqLworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfQVVCKSB7CisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChicncpOworICAgICAgYXViX2R1bXBfYm1wKCZicnctPmN0eCk7CisgICB9CisKKyAgIF9tZXNhX21ldGFfZnJlZSgmYnJ3LT5jdHgpOworCisgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TSEFERVJfVElNRSkgeworICAgICAgLyogRm9yY2UgYSByZXBvcnQuICovCisgICAgICBicnctPnNoYWRlcl90aW1lLnJlcG9ydF90aW1lID0gMDsKKworICAgICAgYnJ3X2NvbGxlY3RfYW5kX3JlcG9ydF9zaGFkZXJfdGltZShicncpOworICAgICAgYnJ3X2Rlc3Ryb3lfc2hhZGVyX3RpbWUoYnJ3KTsKKyAgIH0KKworICAgYnJ3X2Rlc3Ryb3lfc3RhdGUoYnJ3KTsKKyAgIGJyd19kcmF3X2Rlc3Ryb3koYnJ3KTsKKworICAgZHJtX2ludGVsX2JvX3VucmVmZXJlbmNlKGJydy0+Y3VyYmUuY3VyYmVfYm8pOworCisgICBmcmVlKGJydy0+Y3VyYmUubGFzdF9idWYpOworICAgZnJlZShicnctPmN1cmJlLm5leHRfYnVmKTsKKworICAgZHJtX2ludGVsX2dlbV9jb250ZXh0X2Rlc3Ryb3koYnJ3LT5od19jdHgpOworCisgICBpZiAoY3R4LT5zd3Jhc3RfY29udGV4dCkgeworICAgICAgX3N3c2V0dXBfRGVzdHJveUNvbnRleHQoJmJydy0+Y3R4KTsKKyAgICAgIF90bmxfRGVzdHJveUNvbnRleHQoJmJydy0+Y3R4KTsKKyAgIH0KKyAgIF92Ym9fRGVzdHJveUNvbnRleHQoJmJydy0+Y3R4KTsKKworICAgaWYgKGN0eC0+c3dyYXN0X2NvbnRleHQpCisgICAgICBfc3dyYXN0X0Rlc3Ryb3lDb250ZXh0KCZicnctPmN0eCk7CisKKyAgIGludGVsX2JhdGNoYnVmZmVyX2ZyZWUoYnJ3KTsKKworICAgZHJtX2ludGVsX2JvX3VucmVmZXJlbmNlKGJydy0+Zmlyc3RfcG9zdF9zd2FwYnVmZmVyc19iYXRjaCk7CisgICBicnctPmZpcnN0X3Bvc3Rfc3dhcGJ1ZmZlcnNfYmF0Y2ggPSBOVUxMOworCisgICBkcmlEZXN0cm95T3B0aW9uQ2FjaGUoJmJydy0+b3B0aW9uQ2FjaGUpOworCisgICAvKiBmcmVlIHRoZSBNZXNhIGNvbnRleHQgKi8KKyAgIF9tZXNhX2ZyZWVfY29udGV4dF9kYXRhKCZicnctPmN0eCk7CisKKyAgIHJhbGxvY19mcmVlKGJydyk7CisgICBkcmlDb250ZXh0UHJpdi0+ZHJpdmVyUHJpdmF0ZSA9IE5VTEw7Cit9CisKK0dMYm9vbGVhbgoraW50ZWxVbmJpbmRDb250ZXh0KF9fRFJJY29udGV4dCAqIGRyaUNvbnRleHRQcml2KQoreworICAgLyogVW5zZXQgY3VycmVudCBjb250ZXh0IGFuZCBkaXNwYXRoIHRhYmxlICovCisgICBfbWVzYV9tYWtlX2N1cnJlbnQoTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIEZpeGVzIHVwIHRoZSBjb250ZXh0IGZvciBHTEVTMjMgd2l0aCBvdXIgZGVmYXVsdC10by1zUkdCLWNhcGFibGUgYmVoYXZpb3IKKyAqIG9uIHdpbmRvdyBzeXN0ZW0gZnJhbWVidWZmZXJzLgorICoKKyAqIERlc2t0b3AgR0wgaXMgZmFpcmx5IHJlYXNvbmFibGUgaW4gaXRzIGhhbmRsaW5nIG9mIHNSR0I6IFlvdSBjYW4gYXNrIGlmCisgKiB5b3VyIHJlbmRlcmJ1ZmZlciBjYW4gZG8gc1JHQiBlbmNvZGUsIGFuZCB5b3UgY2FuIGZsaXAgYSBzd2l0Y2ggdGhhdCBkb2VzCisgKiBzUkdCIGVuY29kZSBpZiB0aGUgcmVuZGVyYnVmZmVyIGNhbiBoYW5kbGUgaXQuICBZb3UgY2FuIGFzayBzcGVjaWZpY2FsbHkKKyAqIGZvciBhIHZpc3VhbCB3aGVyZSB5b3UncmUgZ3VhcmFudGVlZCB0byBiZSBjYXBhYmxlLCBidXQgaXQgdHVybnMgb3V0IHRoYXQKKyAqIGV2ZXJ5b25lIGp1c3QgbWFrZXMgYWxsIHRoZWlyIEFSR0I4ODg4IHZpc3VhbHMgY2FwYWJsZSBhbmQgZG9lc24ndCBvZmZlcgorICogaW5jYXBhYmxlIG9uZXMsIGJlY2F1c2UgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBpbiByZXNvdXJjZXMKKyAqIHVzZWQuICBBcHBsaWNhdGlvbnMgdGh1cyBnZXQgYnVpbHQgdGhhdCBhY2NpZGVudGFsbHkgcmVseSBvbiB0aGUgZGVmYXVsdAorICogdmlzdWFsIGNob2ljZSBiZWluZyBzUkdCLCBzbyB3ZSBtYWtlIG91cnMgc1JHQiBjYXBhYmxlLiAgRXZlcnl0aGluZyBzb3VuZHMKKyAqIGdyZWF0Li4uCisgKgorICogQnV0IGZvciBHTEVTMi8zLCB0aGV5IGRlY2lkZWQgdGhhdCBpdCB3YXMgc2lsbHkgdG8gbm90IHR1cm4gb24gc1JHQiBlbmNvZGUKKyAqIGZvciBzUkdCIHJlbmRlcmJ1ZmZlcnMgeW91IG1hZGUgd2l0aCB0aGUgR0xfRVhUX3RleHR1cmVfc1JHQiBlcXVpdmFsZW50LgorICogU28gdGhleSByZW1vdmVkIHRoZSBlbmFibGUga25vYiBhbmQgbWFkZSBpdCAiaWYgdGhlIHJlbmRlcmJ1ZmZlciBpcyBzUkdCCisgKiBjYXBhYmxlLCBkbyBzUkdCIGVuY29kZSIuICBUaGVuLCBmb3IgeW91ciB3aW5kb3cgc3lzdGVtIHJlbmRlcmJ1ZmZlcnMsIHlvdQorICogY2FuIGFzayBmb3Igc1JHQiB2aXN1YWxzIGFuZCBnZXQgc1JHQiBlbmNvZGUsIG9yIG5vdCBhc2sgZm9yIHNSR0IgdmlzdWFscworICogYW5kIGdldCBubyBzUkdCIGVuY29kZSAoYXNzdW1pbmcgdGhhdCBib3RoIGtpbmRzIG9mIHZpc3VhbCBhcmUgYXZhaWxhYmxlKS4KKyAqIFRodXMgb3VyIGNob2ljZSB0byBzdXBwb3J0IHNSR0IgYnkgZGVmYXVsdCBvbiBvdXIgdmlzdWFscyBmb3IgZGVza3RvcCB3b3VsZAorICogcmVzdWx0IGluIGJyb2tlbiByZW5kZXJpbmcgb2YgR0xFUyBhcHBzIHRoYXQgYXJlbid0IGV4cGVjdGluZyBzUkdCIGVuY29kZS4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5LCByZW5kZXJidWZmZXIgc2V0dXAgaGFwcGVucyBiZWZvcmUgYSBjb250ZXh0IGlzIGNyZWF0ZWQuICBTbworICogaW4gaW50ZWxfc2NyZWVuLmMgd2UgYWx3YXlzIHNldCB1cCBzUkdCLCBhbmQgaGVyZSwgaWYgeW91J3JlIGEgR0xFUzIvMworICogY29udGV4dCAod2l0aG91dCBhbiBzUkdCIHZpc3VhbCwgdGhvdWdoIHdlIGRvbid0IGhhdmUgc1JHQiB2aXN1YWxzIGV4cG9zZWQKKyAqIHlldCksIHdlIGdvIHR1cm4gdGhhdCBiYWNrIG9mZiBiZWZvcmUgYW55b25lIGZpbmRzIG91dC4KKyAqLworc3RhdGljIHZvaWQKK2ludGVsX2dsZXMzX3NyZ2Jfd29ya2Fyb3VuZChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiKQoreworICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eCA9ICZicnctPmN0eDsKKworICAgaWYgKF9tZXNhX2lzX2Rlc2t0b3BfZ2woY3R4KSB8fCAhZmItPlZpc3VhbC5zUkdCQ2FwYWJsZSkKKyAgICAgIHJldHVybjsKKworICAgLyogU29tZSBkYXkgd2hlbiB3ZSBzdXBwb3J0IHRoZSBzUkdCIGNhcGFibGUgYml0IG9uIHZpc3VhbHMgYXZhaWxhYmxlIGZvcgorICAgICogR0xFUywgd2UnbGwgbmVlZCB0byByZXNwZWN0IHRoYXQgYW5kIG5vdCBkaXNhYmxlIHRoaW5ncyBoZXJlLgorICAgICovCisgICBmYi0+VmlzdWFsLnNSR0JDYXBhYmxlID0gZmFsc2U7CisgICBmb3IgKGludCBpID0gMDsgaSA8IEJVRkZFUl9DT1VOVDsgaSsrKSB7CisgICAgICBpZiAoZmItPkF0dGFjaG1lbnRbaV0uUmVuZGVyYnVmZmVyICYmCisgICAgICAgICAgZmItPkF0dGFjaG1lbnRbaV0uUmVuZGVyYnVmZmVyLT5Gb3JtYXQgPT0gTUVTQV9GT1JNQVRfQjhHOFI4QThfU1JHQikgeworICAgICAgICAgZmItPkF0dGFjaG1lbnRbaV0uUmVuZGVyYnVmZmVyLT5Gb3JtYXQgPSBNRVNBX0ZPUk1BVF9COEc4UjhBOF9VTk9STTsKKyAgICAgIH0KKyAgIH0KK30KKworR0xib29sZWFuCitpbnRlbE1ha2VDdXJyZW50KF9fRFJJY29udGV4dCAqIGRyaUNvbnRleHRQcml2LAorICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlICogZHJpRHJhd1ByaXYsCisgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGUgKiBkcmlSZWFkUHJpdikKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3OworICAgR0VUX0NVUlJFTlRfQ09OVEVYVChjdXJDdHgpOworCisgICBpZiAoZHJpQ29udGV4dFByaXYpCisgICAgICBicncgPSAoc3RydWN0IGJyd19jb250ZXh0ICopIGRyaUNvbnRleHRQcml2LT5kcml2ZXJQcml2YXRlOworICAgZWxzZQorICAgICAgYnJ3ID0gTlVMTDsKKworICAgLyogQWNjb3JkaW5nIHRvIHRoZSBnbFhNYWtlQ3VycmVudCgpIG1hbiBwYWdlOiAiUGVuZGluZyBjb21tYW5kcyB0bworICAgICogdGhlIHByZXZpb3VzIGNvbnRleHQsIGlmIGFueSwgYXJlIGZsdXNoZWQgYmVmb3JlIGl0IGlzIHJlbGVhc2VkLiIKKyAgICAqIEJ1dCBvbmx5IGZsdXNoIGlmIHdlJ3JlIGFjdHVhbGx5IGNoYW5naW5nIGNvbnRleHRzLgorICAgICovCisgICBpZiAoYnJ3X2NvbnRleHQoY3VyQ3R4KSAmJiBicndfY29udGV4dChjdXJDdHgpICE9IGJydykgeworICAgICAgX21lc2FfZmx1c2goY3VyQ3R4KTsKKyAgIH0KKworICAgaWYgKGRyaUNvbnRleHRQcml2KSB7CisgICAgICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gJmJydy0+Y3R4OworICAgICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiwgKnJlYWRGYjsKKworICAgICAgaWYgKGRyaURyYXdQcml2ID09IE5VTEwgJiYgZHJpUmVhZFByaXYgPT0gTlVMTCkgeworICAgICAgICAgZmIgPSBfbWVzYV9nZXRfaW5jb21wbGV0ZV9mcmFtZWJ1ZmZlcigpOworICAgICAgICAgcmVhZEZiID0gX21lc2FfZ2V0X2luY29tcGxldGVfZnJhbWVidWZmZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBmYiA9IGRyaURyYXdQcml2LT5kcml2ZXJQcml2YXRlOworICAgICAgICAgcmVhZEZiID0gZHJpUmVhZFByaXYtPmRyaXZlclByaXZhdGU7CisgICAgICAgICBkcmlDb250ZXh0UHJpdi0+ZHJpMi5kcmF3X3N0YW1wID0gZHJpRHJhd1ByaXYtPmRyaTIuc3RhbXAgLSAxOworICAgICAgICAgZHJpQ29udGV4dFByaXYtPmRyaTIucmVhZF9zdGFtcCA9IGRyaVJlYWRQcml2LT5kcmkyLnN0YW1wIC0gMTsKKyAgICAgIH0KKworICAgICAgLyogVGhlIHNSR0Igd29ya2Fyb3VuZCBjaGFuZ2VzIHRoZSByZW5kZXJidWZmZXIncyBmb3JtYXQuIFdlIG11c3QgY2hhbmdlCisgICAgICAgKiB0aGUgZm9ybWF0IGJlZm9yZSB0aGUgcmVuZGVyYnVmZmVyJ3MgbWlwdHJlZSBnZXQncyBhbGxvY2F0ZWQsIG90aGVyd2lzZQorICAgICAgICogdGhlIGZvcm1hdHMgb2YgdGhlIHJlbmRlcmJ1ZmZlciBhbmQgaXRzIG1pcHRyZWUgd2lsbCBkaWZmZXIuCisgICAgICAgKi8KKyAgICAgIGludGVsX2dsZXMzX3NyZ2Jfd29ya2Fyb3VuZChicncsIGZiKTsKKyAgICAgIGludGVsX2dsZXMzX3NyZ2Jfd29ya2Fyb3VuZChicncsIHJlYWRGYik7CisKKyAgICAgIC8qIElmIHRoZSBjb250ZXh0IHZpZXdwb3J0IGhhc24ndCBiZWVuIGluaXRpYWxpemVkLCBmb3JjZSBhIGNhbGwgb3V0IHRvCisgICAgICAgKiB0aGUgbG9hZGVyIHRvIGdldCBidWZmZXJzIHNvIHdlIGhhdmUgYSBkcmF3YWJsZSBzaXplIGZvciB0aGUgaW5pdGlhbAorICAgICAgICogdmlld3BvcnQuICovCisgICAgICBpZiAoIWJydy0+Y3R4LlZpZXdwb3J0SW5pdGlhbGl6ZWQpCisgICAgICAgICBpbnRlbF9wcmVwYXJlX3JlbmRlcihicncpOworCisgICAgICBfbWVzYV9tYWtlX2N1cnJlbnQoY3R4LCBmYiwgcmVhZEZiKTsKKyAgIH0gZWxzZSB7CisgICAgICBfbWVzYV9tYWtlX2N1cnJlbnQoTlVMTCwgTlVMTCwgTlVMTCk7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCit2b2lkCitpbnRlbF9yZXNvbHZlX2Zvcl9kcmkyX2ZsdXNoKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSkKK3sKKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIC8qIE1TQUEgYW5kIGZhc3QgY29sb3IgY2xlYXIgYXJlIG5vdCBzdXBwb3J0ZWQsIHNvIGRvbid0IHdhc3RlIHRpbWUKKyAgICAgICAqIGNoZWNraW5nIHdoZXRoZXIgYSByZXNvbHZlIGlzIG5lZWRlZC4KKyAgICAgICAqLworICAgICAgcmV0dXJuOworICAgfQorCisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gZHJhd2FibGUtPmRyaXZlclByaXZhdGU7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpyYjsKKworICAgLyogVXN1YWxseSwgb25seSB0aGUgYmFjayBidWZmZXIgd2lsbCBuZWVkIHRvIGJlIGRvd25zYW1wbGVkLiBIb3dldmVyLAorICAgICogdGhlIGZyb250IGJ1ZmZlciB3aWxsIGFsc28gbmVlZCBpdCBpZiB0aGUgdXNlciBoYXMgcmVuZGVyZWQgaW50byBpdC4KKyAgICAqLworICAgc3RhdGljIGNvbnN0IGdsX2J1ZmZlcl9pbmRleCBidWZmZXJzWzJdID0geworICAgICAgICAgQlVGRkVSX0JBQ0tfTEVGVCwKKyAgICAgICAgIEJVRkZFUl9GUk9OVF9MRUZULAorICAgfTsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIHJiID0gaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcihmYiwgYnVmZmVyc1tpXSk7CisgICAgICBpZiAocmIgPT0gTlVMTCB8fCByYi0+bXQgPT0gTlVMTCkKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKHJiLT5tdC0+bnVtX3NhbXBsZXMgPD0gMSkKKyAgICAgICAgIGludGVsX21pcHRyZWVfcmVzb2x2ZV9jb2xvcihicncsIHJiLT5tdCk7CisgICAgICBlbHNlCisgICAgICAgICBpbnRlbF9yZW5kZXJidWZmZXJfZG93bnNhbXBsZShicncsIHJiKTsKKyAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkCitpbnRlbF9iaXRzX3Blcl9waXhlbChjb25zdCBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpyYikKK3sKKyAgIHJldHVybiBfbWVzYV9nZXRfZm9ybWF0X2J5dGVzKGludGVsX3JiX2Zvcm1hdChyYikpICogODsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX3F1ZXJ5X2RyaTJfYnVmZmVycyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWJ1ZmZlciAqKmJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCk7CisKK3N0YXRpYyB2b2lkCitpbnRlbF9wcm9jZXNzX2RyaTJfYnVmZmVyKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19EUklidWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqcmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcl9uYW1lKTsKKworc3RhdGljIHZvaWQKK2ludGVsX3VwZGF0ZV9pbWFnZV9idWZmZXJzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSk7CisKK3N0YXRpYyB2b2lkCitpbnRlbF91cGRhdGVfZHJpMl9idWZmZXJzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSkKK3sKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBkcmF3YWJsZS0+ZHJpdmVyUHJpdmF0ZTsKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKnJiOworICAgX19EUklidWZmZXIgKmJ1ZmZlcnMgPSBOVUxMOworICAgaW50IGksIGNvdW50OworICAgY29uc3QgY2hhciAqcmVnaW9uX25hbWU7CisKKyAgIC8qIFNldCB0aGlzIHVwIGZyb250LCBzbyB0aGF0IGluIGNhc2Ugb3VyIGJ1ZmZlcnMgZ2V0IGludmFsaWRhdGVkCisgICAgKiB3aGlsZSB3ZSdyZSBnZXR0aW5nIG5ldyBidWZmZXJzLCB3ZSBkb24ndCBjbG9iYmVyIHRoZSBzdGFtcCBhbmQKKyAgICAqIHRodXMgaWdub3JlIHRoZSBpbnZhbGlkYXRlLiAqLworICAgZHJhd2FibGUtPmxhc3RTdGFtcCA9IGRyYXdhYmxlLT5kcmkyLnN0YW1wOworCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19EUkkpKQorICAgICAgZnByaW50ZihzdGRlcnIsICJlbnRlciAlcywgZHJhd2FibGUgJXBcbiIsIF9fZnVuY19fLCBkcmF3YWJsZSk7CisKKyAgIGludGVsX3F1ZXJ5X2RyaTJfYnVmZmVycyhicncsIGRyYXdhYmxlLCAmYnVmZmVycywgJmNvdW50KTsKKworICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICBzd2l0Y2ggKGJ1ZmZlcnNbaV0uYXR0YWNobWVudCkgeworICAgICAgIGNhc2UgX19EUklfQlVGRkVSX0ZST05UX0xFRlQ6CisgICAgICAgICAgIHJiID0gaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcihmYiwgQlVGRkVSX0ZST05UX0xFRlQpOworICAgICAgICAgICByZWdpb25fbmFtZSA9ICJkcmkyIGZyb250IGJ1ZmZlciI7CisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBfX0RSSV9CVUZGRVJfRkFLRV9GUk9OVF9MRUZUOgorICAgICAgICAgICByYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoZmIsIEJVRkZFUl9GUk9OVF9MRUZUKTsKKyAgICAgICAgICAgcmVnaW9uX25hbWUgPSAiZHJpMiBmYWtlIGZyb250IGJ1ZmZlciI7CisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBfX0RSSV9CVUZGRVJfQkFDS19MRUZUOgorICAgICAgICAgICByYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoZmIsIEJVRkZFUl9CQUNLX0xFRlQpOworICAgICAgICAgICByZWdpb25fbmFtZSA9ICJkcmkyIGJhY2sgYnVmZmVyIjsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIF9fRFJJX0JVRkZFUl9ERVBUSDoKKyAgICAgICBjYXNlIF9fRFJJX0JVRkZFUl9ISVo6CisgICAgICAgY2FzZSBfX0RSSV9CVUZGRVJfREVQVEhfU1RFTkNJTDoKKyAgICAgICBjYXNlIF9fRFJJX0JVRkZFUl9TVEVOQ0lMOgorICAgICAgIGNhc2UgX19EUklfQlVGRkVSX0FDQ1VNOgorICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICJ1bmhhbmRsZWQgYnVmZmVyIGF0dGFjaCBldmVudCwgYXR0YWNobWVudCB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0uYXR0YWNobWVudCk7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisKKyAgICAgICBpbnRlbF9wcm9jZXNzX2RyaTJfYnVmZmVyKGJydywgZHJhd2FibGUsICZidWZmZXJzW2ldLCByYiwgcmVnaW9uX25hbWUpOworICAgfQorCit9CisKK3ZvaWQKK2ludGVsX3VwZGF0ZV9yZW5kZXJidWZmZXJzKF9fRFJJY29udGV4dCAqY29udGV4dCwgX19EUklkcmF3YWJsZSAqZHJhd2FibGUpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGNvbnRleHQtPmRyaXZlclByaXZhdGU7CisgICBfX0RSSXNjcmVlbiAqc2NyZWVuID0gYnJ3LT5pbnRlbFNjcmVlbi0+ZHJpU2NyblByaXY7CisKKyAgIC8qIFNldCB0aGlzIHVwIGZyb250LCBzbyB0aGF0IGluIGNhc2Ugb3VyIGJ1ZmZlcnMgZ2V0IGludmFsaWRhdGVkCisgICAgKiB3aGlsZSB3ZSdyZSBnZXR0aW5nIG5ldyBidWZmZXJzLCB3ZSBkb24ndCBjbG9iYmVyIHRoZSBzdGFtcCBhbmQKKyAgICAqIHRodXMgaWdub3JlIHRoZSBpbnZhbGlkYXRlLiAqLworICAgZHJhd2FibGUtPmxhc3RTdGFtcCA9IGRyYXdhYmxlLT5kcmkyLnN0YW1wOworCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19EUkkpKQorICAgICAgZnByaW50ZihzdGRlcnIsICJlbnRlciAlcywgZHJhd2FibGUgJXBcbiIsIF9fZnVuY19fLCBkcmF3YWJsZSk7CisKKyAgIGlmIChzY3JlZW4tPmltYWdlLmxvYWRlcikKKyAgICAgIGludGVsX3VwZGF0ZV9pbWFnZV9idWZmZXJzKGJydywgZHJhd2FibGUpOworICAgZWxzZQorICAgICAgaW50ZWxfdXBkYXRlX2RyaTJfYnVmZmVycyhicncsIGRyYXdhYmxlKTsKKworICAgZHJpVXBkYXRlRnJhbWVidWZmZXJTaXplKCZicnctPmN0eCwgZHJhd2FibGUpOworfQorCisvKioKKyAqIGludGVsX3ByZXBhcmVfcmVuZGVyIHNob3VsZCBiZSBjYWxsZWQgYW55d2hlcmUgdGhhdCBjdXJlbnQgcmVhZC9kcmF3YnVmZmVyCisgKiBzdGF0ZSBpcyByZXF1aXJlZC4KKyAqLwordm9pZAoraW50ZWxfcHJlcGFyZV9yZW5kZXIoc3RydWN0IGJyd19jb250ZXh0ICpicncpCit7CisgICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gJmJydy0+Y3R4OworICAgX19EUkljb250ZXh0ICpkcmlDb250ZXh0ID0gYnJ3LT5kcmlDb250ZXh0OworICAgX19EUklkcmF3YWJsZSAqZHJhd2FibGU7CisKKyAgIGRyYXdhYmxlID0gZHJpQ29udGV4dC0+ZHJpRHJhd2FibGVQcml2OworICAgaWYgKGRyYXdhYmxlICYmIGRyYXdhYmxlLT5kcmkyLnN0YW1wICE9IGRyaUNvbnRleHQtPmRyaTIuZHJhd19zdGFtcCkgeworICAgICAgaWYgKGRyYXdhYmxlLT5sYXN0U3RhbXAgIT0gZHJhd2FibGUtPmRyaTIuc3RhbXApCisgICAgICAgICBpbnRlbF91cGRhdGVfcmVuZGVyYnVmZmVycyhkcmlDb250ZXh0LCBkcmF3YWJsZSk7CisgICAgICBkcmlDb250ZXh0LT5kcmkyLmRyYXdfc3RhbXAgPSBkcmF3YWJsZS0+ZHJpMi5zdGFtcDsKKyAgIH0KKworICAgZHJhd2FibGUgPSBkcmlDb250ZXh0LT5kcmlSZWFkYWJsZVByaXY7CisgICBpZiAoZHJhd2FibGUgJiYgZHJhd2FibGUtPmRyaTIuc3RhbXAgIT0gZHJpQ29udGV4dC0+ZHJpMi5yZWFkX3N0YW1wKSB7CisgICAgICBpZiAoZHJhd2FibGUtPmxhc3RTdGFtcCAhPSBkcmF3YWJsZS0+ZHJpMi5zdGFtcCkKKyAgICAgICAgIGludGVsX3VwZGF0ZV9yZW5kZXJidWZmZXJzKGRyaUNvbnRleHQsIGRyYXdhYmxlKTsKKyAgICAgIGRyaUNvbnRleHQtPmRyaTIucmVhZF9zdGFtcCA9IGRyYXdhYmxlLT5kcmkyLnN0YW1wOworICAgfQorCisgICAvKiBJZiB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRvIHRoZSBmcm9udCBidWZmZXIsIHRoZSByZW5kZXJpbmcKKyAgICAqIHRoYXQgd2lsbCBoYXBwZW4gbmV4dCB3aWxsIHByb2JhYmx5IGRpcnR5IHRoZSBmcm9udCBidWZmZXIuICBTbworICAgICogbWFyayBpdCBhcyBkaXJ0eSBoZXJlLgorICAgICovCisgICBpZiAoYnJ3X2lzX2Zyb250X2J1ZmZlcl9kcmF3aW5nKGN0eC0+RHJhd0J1ZmZlcikpCisgICAgICBicnctPmZyb250X2J1ZmZlcl9kaXJ0eSA9IHRydWU7CisKKyAgIC8qIFdhaXQgZm9yIHRoZSBzd2FwYnVmZmVycyBiZWZvcmUgdGhlIG9uZSB3ZSBqdXN0IGVtaXR0ZWQsIHNvIHdlCisgICAgKiBkb24ndCBnZXQgdG9vIG1hbnkgc3dhcHMgb3V0c3RhbmRpbmcgZm9yIGFwcHMgdGhhdCBhcmUgR1BVLWhlYXZ5CisgICAgKiBidXQgbm90IENQVS1oZWF2eS4KKyAgICAqCisgICAgKiBXZSdyZSB1c2luZyBpbnRlbERSSTJGbHVzaCAoY2FsbGVkIGZyb20gdGhlIGxvYWRlciBiZWZvcmUKKyAgICAqIHN3YXBidWZmZXIpIGFuZCBnbEZsdXNoIChmb3IgZnJvbnQgYnVmZmVyIHJlbmRlcmluZykgYXMgdGhlCisgICAgKiBpbmRpY2F0b3IgdGhhdCBhIGZyYW1lIGlzIGRvbmUgYW5kIHRoZW4gdGhyb3R0bGUgd2hlbiB3ZSBnZXQKKyAgICAqIGhlcmUgYXMgd2UgcHJlcGFyZSB0byByZW5kZXIgdGhlIG5leHQgZnJhbWUuICBBdCB0aGlzIHBvaW50IGZvcgorICAgICogcm91bmQgdHJpcHMgZm9yIHN3YXAvY29weSBhbmQgZ2V0dGluZyBuZXcgYnVmZmVycyBhcmUgZG9uZSBhbmQKKyAgICAqIHdlJ2xsIHNwZW5kIGxlc3MgdGltZSB3YWl0aW5nIG9uIHRoZSBHUFUuCisgICAgKgorICAgICogVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3QgaGF2ZSBhIGhhbmRsZSB0byB0aGUgYmF0Y2ggY29udGFpbmluZworICAgICogdGhlIHN3YXAsIGFuZCBnZXR0aW5nIG91ciBoYW5kcyBvbiB0aGF0IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdCwKKyAgICAqIHNvIHdlIGp1c3QgdXMgdGhlIGZpcnN0IGJhdGNoIHdlIGVtaXR0ZWQgYWZ0ZXIgdGhlIGxhc3Qgc3dhcC4KKyAgICAqLworICAgaWYgKGJydy0+bmVlZF90aHJvdHRsZSAmJiBicnctPmZpcnN0X3Bvc3Rfc3dhcGJ1ZmZlcnNfYmF0Y2gpIHsKKyAgICAgIGlmICghYnJ3LT5kaXNhYmxlX3Rocm90dGxpbmcpCisgICAgICAgICBkcm1faW50ZWxfYm9fd2FpdF9yZW5kZXJpbmcoYnJ3LT5maXJzdF9wb3N0X3N3YXBidWZmZXJzX2JhdGNoKTsKKyAgICAgIGRybV9pbnRlbF9ib191bnJlZmVyZW5jZShicnctPmZpcnN0X3Bvc3Rfc3dhcGJ1ZmZlcnNfYmF0Y2gpOworICAgICAgYnJ3LT5maXJzdF9wb3N0X3N3YXBidWZmZXJzX2JhdGNoID0gTlVMTDsKKyAgICAgIGJydy0+bmVlZF90aHJvdHRsZSA9IGZhbHNlOworICAgfQorfQorCisvKioKKyAqIFxicmllZiBRdWVyeSBEUkkyIHRvIG9idGFpbiBhIERSSWRyYXdhYmxlJ3MgYnVmZmVycy4KKyAqCisgKiBUbyBkZXRlcm1pbmUgd2hpY2ggRFJJIGJ1ZmZlcnMgdG8gcmVxdWVzdCwgZXhhbWluZSB0aGUgcmVuZGVyYnVmZmVycworICogYXR0YWNoZWQgdG8gdGhlIGRyYXdhYmxlJ3MgZnJhbWVidWZmZXIuIFRoZW4gcmVxdWVzdCB0aGUgYnVmZmVycyB3aXRoCisgKiBEUkkyR2V0QnVmZmVycygpIG9yIERSSTJHZXRCdWZmZXJzV2l0aEZvcm1hdCgpLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gaW50ZWxfdXBkYXRlX3JlbmRlcmJ1ZmZlcnMoKS4KKyAqCisgKiBccGFyYW0gZHJhd2FibGUgICAgICBEcmF3YWJsZSB3aG9zZSBidWZmZXJzIGFyZSBxdWVyaWVkLgorICogXHBhcmFtIGJ1ZmZlcnMgICAgICAgW291dF0gTGlzdCBvZiBidWZmZXJzIHJldHVybmVkIGJ5IERSSTIgcXVlcnkuCisgKiBccGFyYW0gYnVmZmVyX2NvdW50ICBbb3V0XSBOdW1iZXIgb2YgYnVmZmVycyByZXR1cm5lZC4KKyAqCisgKiBcc2VlIGludGVsX3VwZGF0ZV9yZW5kZXJidWZmZXJzKCkKKyAqIFxzZWUgRFJJMkdldEJ1ZmZlcnMoKQorICogXHNlZSBEUkkyR2V0QnVmZmVyc1dpdGhGb3JtYXQoKQorICovCitzdGF0aWMgdm9pZAoraW50ZWxfcXVlcnlfZHJpMl9idWZmZXJzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJYnVmZmVyICoqYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1ZmZlcl9jb3VudCkKK3sKKyAgIF9fRFJJc2NyZWVuICpzY3JlZW4gPSBicnctPmludGVsU2NyZWVuLT5kcmlTY3JuUHJpdjsKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBkcmF3YWJsZS0+ZHJpdmVyUHJpdmF0ZTsKKyAgIGludCBpID0gMDsKKyAgIHVuc2lnbmVkIGF0dGFjaG1lbnRzWzhdOworCisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpmcm9udF9yYjsKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKmJhY2tfcmI7CisKKyAgIGZyb250X3JiID0gaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcihmYiwgQlVGRkVSX0ZST05UX0xFRlQpOworICAgYmFja19yYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoZmIsIEJVRkZFUl9CQUNLX0xFRlQpOworCisgICBtZW1zZXQoYXR0YWNobWVudHMsIDAsIHNpemVvZihhdHRhY2htZW50cykpOworICAgaWYgKChicndfaXNfZnJvbnRfYnVmZmVyX2RyYXdpbmcoZmIpIHx8CisgICAgICAgIGJyd19pc19mcm9udF9idWZmZXJfcmVhZGluZyhmYikgfHwKKyAgICAgICAgIWJhY2tfcmIpICYmIGZyb250X3JiKSB7CisgICAgICAvKiBJZiBhIGZha2UgZnJvbnQgYnVmZmVyIGlzIGluIHVzZSwgdGhlbiBxdWVyeWluZyBmb3IKKyAgICAgICAqIF9fRFJJX0JVRkZFUl9GUk9OVF9MRUZUIHdpbGwgY2F1c2UgdGhlIHNlcnZlciB0byBjb3B5IHRoZSBpbWFnZSBmcm9tCisgICAgICAgKiB0aGUgcmVhbCBmcm9udCBidWZmZXIgdG8gdGhlIGZha2UgZnJvbnQgYnVmZmVyLiAgU28gYmVmb3JlIGRvaW5nIHRoZQorICAgICAgICogcXVlcnksIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCB0aGUgcGVuZGluZyBkcmF3aW5nIGhhcyBsYW5kZWQgaW4gdGhlCisgICAgICAgKiByZWFsIGZyb250IGJ1ZmZlci4KKyAgICAgICAqLworICAgICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goYnJ3KTsKKyAgICAgIGludGVsX2ZsdXNoX2Zyb250KCZicnctPmN0eCk7CisKKyAgICAgIGF0dGFjaG1lbnRzW2krK10gPSBfX0RSSV9CVUZGRVJfRlJPTlRfTEVGVDsKKyAgICAgIGF0dGFjaG1lbnRzW2krK10gPSBpbnRlbF9iaXRzX3Blcl9waXhlbChmcm9udF9yYik7CisgICB9IGVsc2UgaWYgKGZyb250X3JiICYmIGJydy0+ZnJvbnRfYnVmZmVyX2RpcnR5KSB7CisgICAgICAvKiBXZSBoYXZlIHBlbmRpbmcgZnJvbnQgYnVmZmVyIHJlbmRlcmluZywgYnV0IHdlIGFyZW4ndCBxdWVyeWluZyBmb3IgYQorICAgICAgICogZnJvbnQgYnVmZmVyLiAgSWYgdGhlIGZyb250IGJ1ZmZlciB3ZSBoYXZlIGlzIGEgZmFrZSBmcm9udCBidWZmZXIsCisgICAgICAgKiB0aGUgWCBzZXJ2ZXIgaXMgZ29pbmcgdG8gdGhyb3cgaXQgYXdheSB3aGVuIGl0IHByb2Nlc3NlcyB0aGUgcXVlcnkuCisgICAgICAgKiBTbyBiZWZvcmUgZG9pbmcgdGhlIHF1ZXJ5LCBtYWtlIHN1cmUgYWxsIHRoZSBwZW5kaW5nIGRyYXdpbmcgaGFzCisgICAgICAgKiBsYW5kZWQgaW4gdGhlIHJlYWwgZnJvbnQgYnVmZmVyLgorICAgICAgICovCisgICAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9mbHVzaChicncpOworICAgICAgaW50ZWxfZmx1c2hfZnJvbnQoJmJydy0+Y3R4KTsKKyAgIH0KKworICAgaWYgKGJhY2tfcmIpIHsKKyAgICAgIGF0dGFjaG1lbnRzW2krK10gPSBfX0RSSV9CVUZGRVJfQkFDS19MRUZUOworICAgICAgYXR0YWNobWVudHNbaSsrXSA9IGludGVsX2JpdHNfcGVyX3BpeGVsKGJhY2tfcmIpOworICAgfQorCisgICBhc3NlcnQoaSA8PSBBUlJBWV9TSVpFKGF0dGFjaG1lbnRzKSk7CisKKyAgICpidWZmZXJzID0gc2NyZWVuLT5kcmkyLmxvYWRlci0+Z2V0QnVmZmVyc1dpdGhGb3JtYXQoZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmF3YWJsZS0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdhYmxlLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cywgaSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUtPmxvYWRlclByaXZhdGUpOworfQorCisvKioKKyAqIFxicmllZiBBc3NpZ24gYSBEUkkgYnVmZmVyJ3MgRFJNIHJlZ2lvbiB0byBhIHJlbmRlcmJ1ZmZlci4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGludGVsX3VwZGF0ZV9yZW5kZXJidWZmZXJzKCkuCisgKgorICogXHBhciBOb3RlOgorICogICAgRFJJIGJ1ZmZlcnMgd2hvc2UgYXR0YWNobWVudCBwb2ludCBpcyBEUkkyQnVmZmVyU3RlbmNpbCBvcgorICogICAgRFJJMkJ1ZmZlckRlcHRoU3RlbmNpbCBhcmUgaGFuZGxlZCBhcyBzcGVjaWFsIGNhc2VzLgorICoKKyAqIFxwYXJhbSBidWZmZXJfbmFtZSBpcyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUsIHN1Y2ggYXMgImRyaTIgZnJvbnQgYnVmZmVyIiwKKyAqICAgICAgICB0aGF0IGlzIHBhc3NlZCB0byBkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUoKS4KKyAqCisgKiBcc2VlIGludGVsX3VwZGF0ZV9yZW5kZXJidWZmZXJzKCkKKyAqLworc3RhdGljIHZvaWQKK2ludGVsX3Byb2Nlc3NfZHJpMl9idWZmZXIoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWJ1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpyYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyX25hbWUpCit7CisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gZHJhd2FibGUtPmRyaXZlclByaXZhdGU7CisgICBkcm1faW50ZWxfYm8gKmJvOworCisgICBpZiAoIXJiKQorICAgICAgcmV0dXJuOworCisgICB1bnNpZ25lZCBudW1fc2FtcGxlcyA9IHJiLT5CYXNlLkJhc2UuTnVtU2FtcGxlczsKKworICAgLyogV2UgdHJ5IHRvIGF2b2lkIGNsb3NpbmcgYW5kIHJlb3BlbmluZyB0aGUgc2FtZSBCTyBuYW1lLCBiZWNhdXNlIHRoZSBmaXJzdAorICAgICogdXNlIG9mIGEgbWFwcGluZyBvZiB0aGUgYnVmZmVyIGludm9sdmVzIGEgYnVuY2ggb2YgcGFnZSBmYXVsdGluZyB3aGljaCBpcworICAgICogbW9kZXJhdGVseSBleHBlbnNpdmUuCisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbGFzdF9tdDsKKyAgIGlmIChudW1fc2FtcGxlcyA9PSAwKQorICAgICAgbGFzdF9tdCA9IHJiLT5tdDsKKyAgIGVsc2UKKyAgICAgIGxhc3RfbXQgPSByYi0+c2luZ2xlc2FtcGxlX210OworCisgICB1aW50MzJfdCBvbGRfbmFtZSA9IDA7CisgICBpZiAobGFzdF9tdCkgeworICAgICAgIC8qIFRoZSBibyBhbHJlYWR5IGhhcyBhIG5hbWUgYmVjYXVzZSB0aGUgbWlwdHJlZSB3YXMgY3JlYXRlZCBieSBhCisJKiBwcmV2aW91cyBjYWxsIHRvIGludGVsX3Byb2Nlc3NfZHJpMl9idWZmZXIoKS4gSWYgYSBibyBhbHJlYWR5IGhhcyBhCisJKiBuYW1lLCB0aGVuIGRybV9pbnRlbF9ib19mbGluaygpIGlzIGEgbG93LWNvc3QgZ2V0dGVyLiAgSXQgZG9lcyBub3QKKwkqIGNyZWF0ZSBhIG5ldyBuYW1lLgorCSovCisgICAgICBkcm1faW50ZWxfYm9fZmxpbmsobGFzdF9tdC0+Ym8sICZvbGRfbmFtZSk7CisgICB9CisKKyAgIGlmIChvbGRfbmFtZSA9PSBidWZmZXItPm5hbWUpCisgICAgICByZXR1cm47CisKKyAgIGlmICh1bmxpa2VseShJTlRFTF9ERUJVRyAmIERFQlVHX0RSSSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiYXR0YWNoaW5nIGJ1ZmZlciAlZCwgYXQgJWQsIGNwcCAlZCwgcGl0Y2ggJWRcbiIsCisgICAgICAgICAgICAgIGJ1ZmZlci0+bmFtZSwgYnVmZmVyLT5hdHRhY2htZW50LAorICAgICAgICAgICAgICBidWZmZXItPmNwcCwgYnVmZmVyLT5waXRjaCk7CisgICB9CisKKyAgIGludGVsX21pcHRyZWVfcmVsZWFzZSgmcmItPm10KTsKKyAgIGJvID0gZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9uYW1lKGJydy0+YnVmbWdyLCBidWZmZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bmFtZSk7CisgICBpZiAoIWJvKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIEJPIGZvciByZXR1cm5lZCBEUkkyIGJ1ZmZlciAiCisgICAgICAgICAgICAgICIoJWR4JWQsICVzLCBuYW1lZCAlZCkuXG4iCisgICAgICAgICAgICAgICJUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiB0aGUgWCBTZXJ2ZXIgdGhhdCB3aWxsIGxlYWQgdG8gYSAiCisgICAgICAgICAgICAgICJjcmFzaCBzb29uLlxuIiwKKyAgICAgICAgICAgICAgZHJhd2FibGUtPncsIGRyYXdhYmxlLT5oLCBidWZmZXJfbmFtZSwgYnVmZmVyLT5uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaW50ZWxfdXBkYXRlX3dpbnN5c19yZW5kZXJidWZmZXJfbWlwdHJlZShicncsIHJiLCBibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUtPncsIGRyYXdhYmxlLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnBpdGNoKTsKKworICAgaWYgKGJyd19pc19mcm9udF9idWZmZXJfZHJhd2luZyhmYikgJiYKKyAgICAgICAoYnVmZmVyLT5hdHRhY2htZW50ID09IF9fRFJJX0JVRkZFUl9GUk9OVF9MRUZUIHx8CisgICAgICAgIGJ1ZmZlci0+YXR0YWNobWVudCA9PSBfX0RSSV9CVUZGRVJfRkFLRV9GUk9OVF9MRUZUKSAmJgorICAgICAgIHJiLT5CYXNlLkJhc2UuTnVtU2FtcGxlcyA+IDEpIHsKKyAgICAgIGludGVsX3JlbmRlcmJ1ZmZlcl91cHNhbXBsZShicncsIHJiKTsKKyAgIH0KKworICAgYXNzZXJ0KHJiLT5tdCk7CisKKyAgIGRybV9pbnRlbF9ib191bnJlZmVyZW5jZShibyk7Cit9CisKKy8qKgorICogXGJyaWVmIFF1ZXJ5IERSSSBpbWFnZSBsb2FkZXIgdG8gb2J0YWluIGEgRFJJZHJhd2FibGUncyBidWZmZXJzLgorICoKKyAqIFRvIGRldGVybWluZSB3aGljaCBEUkkgYnVmZmVycyB0byByZXF1ZXN0LCBleGFtaW5lIHRoZSByZW5kZXJidWZmZXJzCisgKiBhdHRhY2hlZCB0byB0aGUgZHJhd2FibGUncyBmcmFtZWJ1ZmZlci4gVGhlbiByZXF1ZXN0IHRoZSBidWZmZXJzIGZyb20KKyAqIHRoZSBpbWFnZSBsb2FkZXIKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGludGVsX3VwZGF0ZV9yZW5kZXJidWZmZXJzKCkuCisgKgorICogXHBhcmFtIGRyYXdhYmxlICAgICAgRHJhd2FibGUgd2hvc2UgYnVmZmVycyBhcmUgcXVlcmllZC4KKyAqIFxwYXJhbSBidWZmZXJzICAgICAgIFtvdXRdIExpc3Qgb2YgYnVmZmVycyByZXR1cm5lZCBieSBEUkkyIHF1ZXJ5LgorICogXHBhcmFtIGJ1ZmZlcl9jb3VudCAgW291dF0gTnVtYmVyIG9mIGJ1ZmZlcnMgcmV0dXJuZWQuCisgKgorICogXHNlZSBpbnRlbF91cGRhdGVfcmVuZGVyYnVmZmVycygpCisgKi8KKworc3RhdGljIHZvaWQKK2ludGVsX3VwZGF0ZV9pbWFnZV9idWZmZXIoc3RydWN0IGJyd19jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19EUklkcmF3YWJsZSAqZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKnJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWltYWdlICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gX19EUklpbWFnZUJ1ZmZlck1hc2sgYnVmZmVyX3R5cGUpCit7CisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gZHJhd2FibGUtPmRyaXZlclByaXZhdGU7CisKKyAgIGlmICghcmIgfHwgIWJ1ZmZlci0+Ym8pCisgICAgICByZXR1cm47CisKKyAgIHVuc2lnbmVkIG51bV9zYW1wbGVzID0gcmItPkJhc2UuQmFzZS5OdW1TYW1wbGVzOworCisgICAvKiBDaGVjayBhbmQgc2VlIGlmIHdlJ3JlIGFscmVhZHkgYm91bmQgdG8gdGhlIHJpZ2h0CisgICAgKiBidWZmZXIgb2JqZWN0CisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbGFzdF9tdDsKKyAgIGlmIChudW1fc2FtcGxlcyA9PSAwKQorICAgICAgbGFzdF9tdCA9IHJiLT5tdDsKKyAgIGVsc2UKKyAgICAgIGxhc3RfbXQgPSByYi0+c2luZ2xlc2FtcGxlX210OworCisgICBpZiAobGFzdF9tdCAmJiBsYXN0X210LT5ibyA9PSBidWZmZXItPmJvKQorICAgICAgcmV0dXJuOworCisgICBpbnRlbF91cGRhdGVfd2luc3lzX3JlbmRlcmJ1ZmZlcl9taXB0cmVlKGludGVsLCByYiwgYnVmZmVyLT5ibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cGl0Y2gpOworCisgICBpZiAoYnJ3X2lzX2Zyb250X2J1ZmZlcl9kcmF3aW5nKGZiKSAmJgorICAgICAgIGJ1ZmZlcl90eXBlID09IF9fRFJJX0lNQUdFX0JVRkZFUl9GUk9OVCAmJgorICAgICAgIHJiLT5CYXNlLkJhc2UuTnVtU2FtcGxlcyA+IDEpIHsKKyAgICAgIGludGVsX3JlbmRlcmJ1ZmZlcl91cHNhbXBsZShpbnRlbCwgcmIpOworICAgfQorfQorCitzdGF0aWMgdm9pZAoraW50ZWxfdXBkYXRlX2ltYWdlX2J1ZmZlcnMoc3RydWN0IGJyd19jb250ZXh0ICpicncsIF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlKQoreworICAgc3RydWN0IGdsX2ZyYW1lYnVmZmVyICpmYiA9IGRyYXdhYmxlLT5kcml2ZXJQcml2YXRlOworICAgX19EUklzY3JlZW4gKnNjcmVlbiA9IGJydy0+aW50ZWxTY3JlZW4tPmRyaVNjcm5Qcml2OworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqZnJvbnRfcmI7CisgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICpiYWNrX3JiOworICAgc3RydWN0IF9fRFJJaW1hZ2VMaXN0IGltYWdlczsKKyAgIHVuc2lnbmVkIGludCBmb3JtYXQ7CisgICB1aW50MzJfdCBidWZmZXJfbWFzayA9IDA7CisKKyAgIGZyb250X3JiID0gaW50ZWxfZ2V0X3JlbmRlcmJ1ZmZlcihmYiwgQlVGRkVSX0ZST05UX0xFRlQpOworICAgYmFja19yYiA9IGludGVsX2dldF9yZW5kZXJidWZmZXIoZmIsIEJVRkZFUl9CQUNLX0xFRlQpOworCisgICBpZiAoYmFja19yYikKKyAgICAgIGZvcm1hdCA9IGludGVsX3JiX2Zvcm1hdChiYWNrX3JiKTsKKyAgIGVsc2UgaWYgKGZyb250X3JiKQorICAgICAgZm9ybWF0ID0gaW50ZWxfcmJfZm9ybWF0KGZyb250X3JiKTsKKyAgIGVsc2UKKyAgICAgIHJldHVybjsKKworICAgaWYgKGZyb250X3JiICYmIChicndfaXNfZnJvbnRfYnVmZmVyX2RyYXdpbmcoZmIpIHx8CisgICAgICAgICAgICAgICAgICAgIGJyd19pc19mcm9udF9idWZmZXJfcmVhZGluZyhmYikgfHwgIWJhY2tfcmIpKSB7CisgICAgICBidWZmZXJfbWFzayB8PSBfX0RSSV9JTUFHRV9CVUZGRVJfRlJPTlQ7CisgICB9CisKKyAgIGlmIChiYWNrX3JiKQorICAgICAgYnVmZmVyX21hc2sgfD0gX19EUklfSU1BR0VfQlVGRkVSX0JBQ0s7CisKKyAgICgqc2NyZWVuLT5pbWFnZS5sb2FkZXItPmdldEJ1ZmZlcnMpIChkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmlHTEZvcm1hdFRvSW1hZ2VGb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd2FibGUtPmRyaTIuc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUtPmxvYWRlclByaXZhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlcyk7CisKKyAgIGlmIChpbWFnZXMuaW1hZ2VfbWFzayAmIF9fRFJJX0lNQUdFX0JVRkZFUl9GUk9OVCkgeworICAgICAgZHJhd2FibGUtPncgPSBpbWFnZXMuZnJvbnQtPndpZHRoOworICAgICAgZHJhd2FibGUtPmggPSBpbWFnZXMuZnJvbnQtPmhlaWdodDsKKyAgICAgIGludGVsX3VwZGF0ZV9pbWFnZV9idWZmZXIoYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRfcmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5mcm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19EUklfSU1BR0VfQlVGRkVSX0ZST05UKTsKKyAgIH0KKyAgIGlmIChpbWFnZXMuaW1hZ2VfbWFzayAmIF9fRFJJX0lNQUdFX0JVRkZFUl9CQUNLKSB7CisgICAgICBkcmF3YWJsZS0+dyA9IGltYWdlcy5iYWNrLT53aWR0aDsKKyAgICAgIGRyYXdhYmxlLT5oID0gaW1hZ2VzLmJhY2stPmhlaWdodDsKKyAgICAgIGludGVsX3VwZGF0ZV9pbWFnZV9idWZmZXIoYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja19yYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJX0lNQUdFX0JVRkZFUl9CQUNLKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfY29udGV4dC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkNmExMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfY29udGV4dC5oCkBAIC0wLDAgKzEsMTI5MCBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIEludGVsIENvcnAuICAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBJbnRlbCBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8KKyBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgorCisgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qCisgICogQXV0aG9yczoKKyAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHdAdm13YXJlLmNvbT4KKyAgKi8KKworCisjaWZuZGVmIEJSV0NPTlRFWFRfSU5DCisjZGVmaW5lIEJSV0NPTlRFWFRfSU5DCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibWFpbi9pbXBvcnRzLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKy8vI2luY2x1ZGUgIm1haW4vbW0uaCIgIC8vIEx1bmFyRzogUmVtb3ZlCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJicndfc3RydWN0cy5oIgorCit0eXBlZGVmIHN0cnVjdCBkcm1faW50ZWxfYm8gZHJtX2ludGVsX2JvOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisjaW5jbHVkZSAiaW50ZWxfZGVidWcuaCIKKyNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKKy8vI2luY2x1ZGUgImludGVsX3RleF9vYmouaCIgLy8gTHVuYXJHOiBSZW1vdmUKKy8vI2luY2x1ZGUgImludGVsX3Jlc29sdmVfbWFwLmgiICAvLyBMdW5hckc6IFJlbW92ZQorCisvKiBHbG9zc2FyeToKKyAqCisgKiBVUkIgLSB1bmlmb3JtIHJlc291cmNlIGJ1ZmZlci4gIEEgbWlkLXNpemVkIGJ1ZmZlciB3aGljaCBpcworICogcGFydGl0aW9uZWQgYmV0d2VlbiB0aGUgZml4ZWQgZnVuY3Rpb24gdW5pdHMgYW5kIHVzZWQgZm9yIHBhc3NpbmcKKyAqIHZhbHVlcyAodmVydGljZXMsIHByaW1pdGl2ZXMsIGNvbnN0YW50cykgYmV0d2VlbiB0aGVtLgorICoKKyAqIENVUkJFIC0gY29uc3RhbnQgVVJCIGVudHJ5LiAgQW4gdXJiIHJlZ2lvbiAoZW50cnkpIHVzZWQgdG8gaG9sZAorICogY29uc3RhbnQgdmFsdWVzIHdoaWNoIHRoZSBmaXhlZCBmdW5jdGlvbiB1bml0cyBjYW4gYmUgaW5zdHJ1Y3RlZCB0bworICogcHJlbG9hZCBpbnRvIHRoZSBHUkYgd2hlbiBzcGF3bmluZyBhIHRocmVhZC4KKyAqCisgKiBWVUUgLSB2ZXJ0ZXggVVJCIGVudHJ5LiAgQW4gdXJiIGVudHJ5IGhvbGRpbmcgYSB2ZXJ0ZXggYW5kIHVzdWFsbHkKKyAqIGEgdmVydGV4IGhlYWRlci4gIFRoZSBoZWFkZXIgY29udGFpbnMgY29udHJvbCBpbmZvcm1hdGlvbiBhbmQKKyAqIHRoaW5ncyBsaWtlIHByaW1pdGl2ZSB0eXBlLCBCZWdpbi9lbmQgZmxhZ3MgYW5kIGNsaXAgY29kZXMuCisgKgorICogUFVFIC0gcHJpbWl0aXZlIFVSQiBlbnRyeS4gIEFuIHVyYiBlbnRyeSBwcm9kdWNlZCBieSB0aGUgc2V0dXAgKFNGKQorICogdW5pdCBob2xkaW5nIHJhc3Rlcml6YXRpb24gYW5kIGludGVycG9sYXRpb24gcGFyYW1ldGVycy4KKyAqCisgKiBHUkYgLSBnZW5lcmFsIHJlZ2lzdGVyIGZpbGUuICBPbmUgb2Ygc2V2ZXJhbCByZWdpc3RlciBmaWxlcworICogYWRkcmVzc2FibGUgYnkgcHJvZ3JhbW1lZCB0aHJlYWRzLiAgVGhlIGlucHV0cyAocjAsIHBheWxvYWQsIGN1cmJlLAorICogdXJiKSBvZiB0aGUgdGhyZWFkIGFyZSBwcmVsb2FkZWQgdG8gdGhpcyBhcmVhIGJlZm9yZSB0aGUgdGhyZWFkIGlzCisgKiBzcGF3bmVkLiAgVGhlIHJlZ2lzdGVycyBhcmUgaW5kaXZpZHVhbGx5IDggZHdvcmRzIHdpZGUgYW5kIHN1aXRhYmxlCisgKiBmb3IgZ2VuZXJhbCB1c2FnZS4gIFJlZ2lzdGVycyBob2xkaW5nIHRocmVhZCBpbnB1dCB2YWx1ZXMgYXJlIG5vdAorICogc3BlY2lhbCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgorICoKKyAqIE1SRiAtIG1lc3NhZ2UgcmVnaXN0ZXIgZmlsZS4gIFRocmVhZHMgY29tbXVuaWNhdGUgKGFuZCB0ZXJtaW5hdGUpCisgKiBieSBzZW5kaW5nIG1lc3NhZ2VzLiAgTWVzc2FnZSBwYXJhbWV0ZXJzIGFyZSBwbGFjZWQgaW4gY29udGlndW91cworICogTVJGIHJlZ2lzdGVycy4gIEFsbCBwcm9ncmFtIG91dHB1dCBpcyB2aWEgdGhlc2UgbWVzc2FnZXMuICBVUkIKKyAqIGVudHJpZXMgYXJlIHBvcHVsYXRlZCBieSBzZW5kaW5nIGEgbWVzc2FnZSB0byB0aGUgc2hhcmVkIFVSQgorICogZnVuY3Rpb24gY29udGFpbmluZyB0aGUgbmV3IGRhdGEsIHRvZ2V0aGVyIHdpdGggYSBjb250cm9sIHdvcmQsCisgKiBvZnRlbiBhbiB1bm1vZGlmaWVkIGNvcHkgb2YgUjAuCisgKgorICogUjAgLSBHUkYgcmVnaXN0ZXIgMC4gIFR5cGljYWxseSBob2xkcyBjb250cm9sIGluZm9ybWF0aW9uIHVzZWQgd2hlbgorICogc2VuZGluZyBtZXNzYWdlcyB0byBvdGhlciB0aHJlYWRzLgorICoKKyAqIEVVIG9yIEdFTjQgRVU6IFRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtbWFibGUgc3Vic3lzdGVtIG9mIHRoZQorICogaTk2NSBoYXJkd2FyZS4gIFRocmVhZHMgYXJlIGV4ZWN1dGVkIGJ5IHRoZSBFVSwgdGhlIHJlZ2lzdGVycworICogZGVzY3JpYmVkIGFib3ZlIGFyZSBwYXJ0IG9mIHRoZSBFVSBhcmNoaXRlY3R1cmUuCisgKgorICogRml4ZWQgZnVuY3Rpb24gdW5pdHM6CisgKgorICogQ1MgLSBDb21tYW5kIHN0cmVhbWVyLiAgTm90aW9uYWwgZmlyc3QgdW5pdCwgbGl0dGxlIHNvZnR3YXJlCisgKiBpbnRlcmFjdGlvbi4gIEhvbGRzIHRoZSBVUkIgZW50cmllcyB1c2VkIGZvciBjb25zdGFudCBkYXRhLCBpZSB0aGUKKyAqIENVUkJFcy4KKyAqCisgKiBWRi9WUyAtIFZlcnRleCBGZXRjaCAvIFZlcnRleCBTaGFkZXIuICBUaGUgZml4ZWQgZnVuY3Rpb24gcGFydCBvZgorICogdGhpcyB1bml0IGlzIHJlc3BvbnNpYmxlIGZvciBwdWxsaW5nIHZlcnRpY2VzIG91dCBvZiB2ZXJ0ZXggYnVmZmVycworICogaW4gdnJhbSBhbmQgaW5qZWN0aW5nIHRoZW0gaW50byB0aGUgcHJvY2Vzc2luZyBwaXBlIGFzIFZVRXMuICBJZgorICogZW5hYmxlZCwgaXQgZmlyc3QgcGFzc2VzIHRoZW0gdG8gYSBWUyB0aHJlYWQgd2hpY2ggaXMgYSBnb29kIHBsYWNlCisgKiBmb3IgdGhlIGRyaXZlciB0byBpbXBsZW1lbnQgYW55IGFjdGl2ZSB2ZXJ0ZXggc2hhZGVyLgorICoKKyAqIEdTIC0gR2VvbWV0cnkgU2hhZGVyLiAgVGhpcyBjb3JyZXNwb25kcyB0byBhIG5ldyBEWDEwIGNvbmNlcHQuICBJZgorICogZW5hYmxlZCwgaW5jb21pbmcgc3RyaXBzIGV0YyBhcmUgcGFzc2VkIHRvIEdTIHRocmVhZHMgaW4gaW5kaXZpZHVhbAorICogbGluZS90cmlhbmdsZS9wb2ludCB1bml0cy4gIFRoZSBHUyB0aHJlYWQgbWF5IHBlcmZvcm0gYXJiaXRyYXJ5CisgKiBjb21wdXRhdGlvbiBhbmQgZW1pdCB3aGF0ZXZlciBwcmltdGl2ZXMgd2l0aCB3aGF0ZXZlciB2ZXJ0aWNlcyBpdAorICogY2hvb3Nlcy4gIFRoaXMgbWFrZXMgR1MgYW4gZXhjZWxsZW50IHBsYWNlIHRvIGltcGxlbWVudCBHTCdzCisgKiB1bmZpbGxlZCBwb2x5Z29uIG1vZGVzLCB0aG91Z2ggb2YgY291cnNlIGl0IGlzIGNhcGFibGUgb2YgbXVjaAorICogbW9yZS4gIEFkZGl0aW9uYWxseSwgR1MgaXMgdXNlZCB0byB0cmFuc2xhdGUgYXdheSBwcmltaXRpdmVzIG5vdAorICogaGFuZGxlZCBieSBsYXR0ZXIgdW5pdHMsIGluY2x1ZGluZyBRdWFkcyBhbmQgTGluZWxvb3BzLgorICoKKyAqIENTIC0gQ2xpcHBlci4gIE1lc2EncyBjbGlwcGluZyBhbGdvcml0aG1zIGFyZSBpbXBvcnRlZCB0byBydW4gb24KKyAqIHRoaXMgdW5pdC4gIFRoZSBmaXhlZCBmdW5jdGlvbiBwYXJ0IHBlcmZvcm1zIGNsaXB0ZXN0aW5nIGFnYWluc3QKKyAqIHRoZSA2IGZpeGVkIGNsaXBwbGFuZXMgYW5kIG1ha2VzIGRlY2lzaW9ucyBvbiB3aGV0aGVyIG9yIG5vdCB0aGUKKyAqIGluY29taW5nIHByaW1pdGl2ZSBuZWVkcyB0byBiZSBwYXNzZWQgdG8gYSB0aHJlYWQgZm9yIGNsaXBwaW5nLgorICogVXNlciBjbGlwIHBsYW5lcyBhcmUgaGFuZGxlZCB2aWEgY29vcGVyYXRpb24gd2l0aCB0aGUgVlMgdGhyZWFkLgorICoKKyAqIFNGIC0gU3RyaXBzIEZhbnMgb3IgU2V0dXA6IFRyaWFuZ2xlcyBhcmUgcHJlcGFyZWQgZm9yCisgKiByYXN0ZXJpemF0aW9uLiAgSW50ZXJwb2xhdGlvbiBjb2VmZmljaWVudHMgYXJlIGNhbGN1bGF0ZWQuCisgKiBGbGF0c2hhZGluZyBhbmQgdHdvLXNpZGUgbGlnaHRpbmcgdXN1YWxseSBwZXJmb3JtZWQgaGVyZS4KKyAqCisgKiBXTSAtIFdpbmRvd2VyLiAgSW50ZXJwb2xhdGlvbiBvZiB2ZXJ0ZXggYXR0cmlidXRlcyBwZXJmb3JtZWQgaGVyZS4KKyAqIEZyYWdtZW50IHNoYWRlciBpbXBsZW1lbnRlZCBoZXJlLiAgU0lNRCBhc3BlY3RzIG9mIEVVIHRha2VuIGZ1bGwKKyAqIGFkdmFudGFnZSBvZiwgYXMgcGl4ZWxzIGFyZSBwcm9jZXNzZWQgaW4gYmxvY2tzIG9mIDE2LgorICoKKyAqIENDIC0gQ29sb3IgQ2FsY3VsYXRvci4gIE5vIEVVIHRocmVhZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdW5pdC4KKyAqIEhhbmRsZXMgYmxlbmRpbmcgYW5kIChwcmVzdW1hYmx5KSBkZXB0aCBhbmQgc3RlbmNpbCB0ZXN0aW5nLgorICovCisKKyNkZWZpbmUgQlJXX01BWF9DVVJCRSAgICAgICAgICAgICAgICAgICAgKDMyKjE2KQorCitzdHJ1Y3QgYnJ3X2NvbnRleHQ7CitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uOworc3RydWN0IGJyd192c19wcm9nX2tleTsKK3N0cnVjdCBicndfdmVjNF9wcm9nX2tleTsKK3N0cnVjdCBicndfd21fcHJvZ19rZXk7CitzdHJ1Y3QgYnJ3X3dtX3Byb2dfZGF0YTsKKworZW51bSBicndfc3RhdGVfaWQgeworICAgQlJXX1NUQVRFX1VSQl9GRU5DRSwKKyAgIEJSV19TVEFURV9GUkFHTUVOVF9QUk9HUkFNLAorICAgQlJXX1NUQVRFX0dFT01FVFJZX1BST0dSQU0sCisgICBCUldfU1RBVEVfVkVSVEVYX1BST0dSQU0sCisgICBCUldfU1RBVEVfQ1VSQkVfT0ZGU0VUUywKKyAgIEJSV19TVEFURV9SRURVQ0VEX1BSSU1JVElWRSwKKyAgIEJSV19TVEFURV9QUklNSVRJVkUsCisgICBCUldfU1RBVEVfQ09OVEVYVCwKKyAgIEJSV19TVEFURV9QU1AsCisgICBCUldfU1RBVEVfU1VSRkFDRVMsCisgICBCUldfU1RBVEVfVlNfQklORElOR19UQUJMRSwKKyAgIEJSV19TVEFURV9HU19CSU5ESU5HX1RBQkxFLAorICAgQlJXX1NUQVRFX1BTX0JJTkRJTkdfVEFCTEUsCisgICBCUldfU1RBVEVfSU5ESUNFUywKKyAgIEJSV19TVEFURV9WRVJUSUNFUywKKyAgIEJSV19TVEFURV9CQVRDSCwKKyAgIEJSV19TVEFURV9JTkRFWF9CVUZGRVIsCisgICBCUldfU1RBVEVfVlNfQ09OU1RCVUYsCisgICBCUldfU1RBVEVfR1NfQ09OU1RCVUYsCisgICBCUldfU1RBVEVfUFJPR1JBTV9DQUNIRSwKKyAgIEJSV19TVEFURV9TVEFURV9CQVNFX0FERFJFU1MsCisgICBCUldfU1RBVEVfVlVFX01BUF9WUywKKyAgIEJSV19TVEFURV9WVUVfTUFQX0dFT01fT1VULAorICAgQlJXX1NUQVRFX1RSQU5TRk9STV9GRUVEQkFDSywKKyAgIEJSV19TVEFURV9SQVNURVJJWkVSX0RJU0NBUkQsCisgICBCUldfU1RBVEVfU1RBVFNfV00sCisgICBCUldfU1RBVEVfVU5JRk9STV9CVUZGRVIsCisgICBCUldfU1RBVEVfQVRPTUlDX0JVRkZFUiwKKyAgIEJSV19TVEFURV9NRVRBX0lOX1BST0dSRVNTLAorICAgQlJXX1NUQVRFX0lOVEVSUE9MQVRJT05fTUFQLAorICAgQlJXX1NUQVRFX1BVU0hfQ09OU1RBTlRfQUxMT0NBVElPTiwKKyAgIEJSV19TVEFURV9OVU1fU0FNUExFUywKKyAgIEJSV19OVU1fU1RBVEVfQklUUworfTsKKworI2RlZmluZSBCUldfTkVXX1VSQl9GRU5DRSAgICAgICAgICAgICAgICgxIDw8IEJSV19TVEFURV9VUkJfRkVOQ0UpCisjZGVmaW5lIEJSV19ORVdfRlJBR01FTlRfUFJPR1JBTSAgICAgICAgKDEgPDwgQlJXX1NUQVRFX0ZSQUdNRU5UX1BST0dSQU0pCisjZGVmaW5lIEJSV19ORVdfR0VPTUVUUllfUFJPR1JBTSAgICAgICAgKDEgPDwgQlJXX1NUQVRFX0dFT01FVFJZX1BST0dSQU0pCisjZGVmaW5lIEJSV19ORVdfVkVSVEVYX1BST0dSQU0gICAgICAgICAgKDEgPDwgQlJXX1NUQVRFX1ZFUlRFWF9QUk9HUkFNKQorI2RlZmluZSBCUldfTkVXX0NVUkJFX09GRlNFVFMgICAgICAgICAgICgxIDw8IEJSV19TVEFURV9DVVJCRV9PRkZTRVRTKQorI2RlZmluZSBCUldfTkVXX1JFRFVDRURfUFJJTUlUSVZFICAgICAgICgxIDw8IEJSV19TVEFURV9SRURVQ0VEX1BSSU1JVElWRSkKKyNkZWZpbmUgQlJXX05FV19QUklNSVRJVkUgICAgICAgICAgICAgICAoMSA8PCBCUldfU1RBVEVfUFJJTUlUSVZFKQorI2RlZmluZSBCUldfTkVXX0NPTlRFWFQgICAgICAgICAgICAgICAgICgxIDw8IEJSV19TVEFURV9DT05URVhUKQorI2RlZmluZSBCUldfTkVXX1BTUCAgICAgICAgICAgICAgICAgICAgICgxIDw8IEJSV19TVEFURV9QU1ApCisjZGVmaW5lIEJSV19ORVdfU1VSRkFDRVMJCSgxIDw8IEJSV19TVEFURV9TVVJGQUNFUykKKyNkZWZpbmUgQlJXX05FV19WU19CSU5ESU5HX1RBQkxFCSgxIDw8IEJSV19TVEFURV9WU19CSU5ESU5HX1RBQkxFKQorI2RlZmluZSBCUldfTkVXX0dTX0JJTkRJTkdfVEFCTEUJKDEgPDwgQlJXX1NUQVRFX0dTX0JJTkRJTkdfVEFCTEUpCisjZGVmaW5lIEJSV19ORVdfUFNfQklORElOR19UQUJMRQkoMSA8PCBCUldfU1RBVEVfUFNfQklORElOR19UQUJMRSkKKyNkZWZpbmUgQlJXX05FV19JTkRJQ0VTCQkJKDEgPDwgQlJXX1NUQVRFX0lORElDRVMpCisjZGVmaW5lIEJSV19ORVdfVkVSVElDRVMJCSgxIDw8IEJSV19TVEFURV9WRVJUSUNFUykKKy8qKgorICogVXNlZCBmb3IgYW55IGJhdGNoIGVudHJ5IHdpdGggYSByZWxvY2F0ZWQgcG9pbnRlciB0aGF0IHdpbGwgYmUgdXNlZAorICogYnkgYW55IDNEIHJlbmRlcmluZy4KKyAqLworI2RlZmluZSBCUldfTkVXX0JBVENIICAgICAgICAgICAgICAgICAgKDEgPDwgQlJXX1NUQVRFX0JBVENIKQorLyoqIFxzZWUgYnJ3LnN0YXRlLmRlcHRoX3JlZ2lvbiAqLworI2RlZmluZSBCUldfTkVXX0lOREVYX0JVRkZFUiAgICAgICAgICAgKDEgPDwgQlJXX1NUQVRFX0lOREVYX0JVRkZFUikKKyNkZWZpbmUgQlJXX05FV19WU19DT05TVEJVRiAgICAgICAgICAgICgxIDw8IEJSV19TVEFURV9WU19DT05TVEJVRikKKyNkZWZpbmUgQlJXX05FV19HU19DT05TVEJVRiAgICAgICAgICAgICgxIDw8IEJSV19TVEFURV9HU19DT05TVEJVRikKKyNkZWZpbmUgQlJXX05FV19QUk9HUkFNX0NBQ0hFCQkoMSA8PCBCUldfU1RBVEVfUFJPR1JBTV9DQUNIRSkKKyNkZWZpbmUgQlJXX05FV19TVEFURV9CQVNFX0FERFJFU1MJKDEgPDwgQlJXX1NUQVRFX1NUQVRFX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgQlJXX05FV19WVUVfTUFQX1ZTCQkoMSA8PCBCUldfU1RBVEVfVlVFX01BUF9WUykKKyNkZWZpbmUgQlJXX05FV19WVUVfTUFQX0dFT01fT1VUCSgxIDw8IEJSV19TVEFURV9WVUVfTUFQX0dFT01fT1VUKQorI2RlZmluZSBCUldfTkVXX1RSQU5TRk9STV9GRUVEQkFDSwkoMSA8PCBCUldfU1RBVEVfVFJBTlNGT1JNX0ZFRURCQUNLKQorI2RlZmluZSBCUldfTkVXX1JBU1RFUklaRVJfRElTQ0FSRAkoMSA8PCBCUldfU1RBVEVfUkFTVEVSSVpFUl9ESVNDQVJEKQorI2RlZmluZSBCUldfTkVXX1NUQVRTX1dNCQkoMSA8PCBCUldfU1RBVEVfU1RBVFNfV00pCisjZGVmaW5lIEJSV19ORVdfVU5JRk9STV9CVUZGRVIgICAgICAgICAgKDEgPDwgQlJXX1NUQVRFX1VOSUZPUk1fQlVGRkVSKQorI2RlZmluZSBCUldfTkVXX0FUT01JQ19CVUZGRVIgICAgICAgICAgICgxIDw8IEJSV19TVEFURV9BVE9NSUNfQlVGRkVSKQorI2RlZmluZSBCUldfTkVXX01FVEFfSU5fUFJPR1JFU1MgICAgICAgICgxIDw8IEJSV19TVEFURV9NRVRBX0lOX1BST0dSRVNTKQorI2RlZmluZSBCUldfTkVXX0lOVEVSUE9MQVRJT05fTUFQICAgICAgICgxIDw8IEJSV19TVEFURV9JTlRFUlBPTEFUSU9OX01BUCkKKyNkZWZpbmUgQlJXX05FV19QVVNIX0NPTlNUQU5UX0FMTE9DQVRJT04gKDEgPDwgQlJXX1NUQVRFX1BVU0hfQ09OU1RBTlRfQUxMT0NBVElPTikKKyNkZWZpbmUgQlJXX05FV19OVU1fU0FNUExFUyAgICAgICAgICAgICAoMSA8PCBCUldfU1RBVEVfTlVNX1NBTVBMRVMpCisKK3N0cnVjdCBicndfc3RhdGVfZmxhZ3MgeworICAgLyoqIFN0YXRlIHVwZGF0ZSBmbGFncyBzaWduYWxsZWQgYnkgbWVzYSBpbnRlcm5hbHMgKi8KKyAgIEdMdWludCBtZXNhOworICAgLyoqCisgICAgKiBTdGF0ZSB1cGRhdGUgZmxhZ3Mgc2lnbmFsbGVkIGFzIHRoZSByZXN1bHQgb2YgYnJ3X3RyYWNrZWRfc3RhdGUgdXBkYXRlcworICAgICovCisgICBHTHVpbnQgYnJ3OworICAgLyoqIFN0YXRlIHVwZGF0ZSBmbGFncyBzaWduYWxsZWQgYnkgYnJ3X3N0YXRlX2NhY2hlLmMgc2VhcmNoZXMgKi8KKyAgIEdMdWludCBjYWNoZTsKK307CisKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfTUFTSwkJMHgwMDAwZmYwMAorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9OT1RZUEUJCSgwIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0JBVENICQkoMSA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9WRVJURVhfQlVGRkVSCSg1IDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFXzJEX01BUAkJKDYgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfQ1VCRV9NQVAJCSg3IDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX1ZPTFVNRV9NQVAJKDkgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfMURfTUFQCQkoMTAgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfQ09OU1RBTlRfQlVGRkVSCSgxMSA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9DT05TVEFOVF9VUkIJKDEyIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0lOREVYX0JVRkZFUgkoMTMgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfR0VORVJBTAkJKDE0IDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX1NVUkZBQ0UJCSgxNSA8PCA4KQorCisvKioKKyAqIHN0YXRlX3N0cnVjdF90eXBlIGVudW0gdmFsdWVzIGFyZSBlbmNvZGVkIHdpdGggdGhlIHRvcCAxNiBiaXRzIHJlcHJlc2VudGluZworICogdGhlIHR5cGUgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSAuYXViIGZpbGUsIGFuZCB0aGUgYm90dG9tIDE2IGJpdHMKKyAqIHJlcHJlc2VudGluZyB0aGUgc3VidHlwZS4gIFRoaXMgbWFjcm8gcGVyZm9ybXMgdGhlIGVuY29kaW5nLgorICovCisjZGVmaW5lIEVOQ09ERV9TU19UWVBFKHR5cGUsIHN1YnR5cGUpICgoKHR5cGUpIDw8IDE2KSB8IChzdWJ0eXBlKSkKKworZW51bSBzdGF0ZV9zdHJ1Y3RfdHlwZSB7CisgICBBVUJfVFJBQ0VfVlNfU1RBVEUgPQkJCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDEpLAorICAgQVVCX1RSQUNFX0dTX1NUQVRFID0JCQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCAyKSwKKyAgIEFVQl9UUkFDRV9DTElQX1NUQVRFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDMpLAorICAgQVVCX1RSQUNFX1NGX1NUQVRFID0JCQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCA0KSwKKyAgIEFVQl9UUkFDRV9XTV9TVEFURSA9CQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgNSksCisgICBBVUJfVFJBQ0VfQ0NfU1RBVEUgPQkJCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDYpLAorICAgQVVCX1RSQUNFX0NMSVBfVlBfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgNyksCisgICBBVUJfVFJBQ0VfU0ZfVlBfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgOCksCisgICBBVUJfVFJBQ0VfQ0NfVlBfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHg5KSwKKyAgIEFVQl9UUkFDRV9TQU1QTEVSX1NUQVRFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4YSksCisgICBBVUJfVFJBQ0VfS0VSTkVMX0lOU1RSVUNUSU9OUyA9CUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4YiksCisgICBBVUJfVFJBQ0VfU0NSQVRDSF9TUEFDRSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCAweGMpLAorICAgQVVCX1RSQUNFX1NBTVBMRVJfREVGQVVMVF9DT0xPUiA9ICAgIEVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4ZCksCisKKyAgIEFVQl9UUkFDRV9TQ0lTU09SX1NUQVRFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4MTUpLAorICAgQVVCX1RSQUNFX0JMRU5EX1NUQVRFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4MTYpLAorICAgQVVCX1RSQUNFX0RFUFRIX1NURU5DSUxfU1RBVEUgPQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCAweDE3KSwKKworICAgQVVCX1RSQUNFX1ZFUlRFWF9CVUZGRVIgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfVkVSVEVYX0JVRkZFUiwgMCksCisgICBBVUJfVFJBQ0VfQklORElOR19UQUJMRSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9TVVJGQUNFLCAweDEwMCksCisgICBBVUJfVFJBQ0VfU1VSRkFDRV9TVEFURSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9TVVJGQUNFLCAweDIwMCksCisgICBBVUJfVFJBQ0VfVlNfQ09OU1RBTlRTID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0NPTlNUQU5UX0JVRkZFUiwgMCksCisgICBBVUJfVFJBQ0VfV01fQ09OU1RBTlRTID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0NPTlNUQU5UX0JVRkZFUiwgMSksCit9OworCisvKioKKyAqIERlY29kZSBhIHN0YXRlX3N0cnVjdF90eXBlIHZhbHVlIHRvIGRldGVybWluZSB0aGUgdHlwZSB0aGF0IHNob3VsZCBiZQorICogc3RvcmVkIGluIHRoZSAuYXViIGZpbGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgQVVCX1RSQUNFX1RZUEUoZW51bSBzdGF0ZV9zdHJ1Y3RfdHlwZSBzc190eXBlKQoreworICAgcmV0dXJuIChzc190eXBlICYgMHhGRkZGMDAwMCkgPj4gMTY7Cit9CisKKy8qKgorICogRGVjb2RlIGEgc3RhdGVfc3RydWN0X3R5cGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBzdWJ0eXBlIHRoYXQgc2hvdWxkIGJlCisgKiBzdG9yZWQgaW4gdGhlIC5hdWIgZmlsZS4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBBVUJfVFJBQ0VfU1VCVFlQRShlbnVtIHN0YXRlX3N0cnVjdF90eXBlIHNzX3R5cGUpCit7CisgICByZXR1cm4gc3NfdHlwZSAmIDB4RkZGRjsKK30KKworLyoqIFN1YmNsYXNzIG9mIE1lc2EgdmVydGV4IHByb2dyYW0gKi8KK3N0cnVjdCBicndfdmVydGV4X3Byb2dyYW0geworICAgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtIHByb2dyYW07CisgICBHTHVpbnQgaWQ7Cit9OworCisKKy8qKiBTdWJjbGFzcyBvZiBNZXNhIGdlb21ldHJ5IHByb2dyYW0gKi8KK3N0cnVjdCBicndfZ2VvbWV0cnlfcHJvZ3JhbSB7CisgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSBwcm9ncmFtOworICAgdW5zaWduZWQgaWQ7ICAvKio8IHNlcmlhbCBuby4gdG8gaWRlbnRpZnkgZ2VvbSBwcm9ncywgbmV2ZXIgcmUtdXNlZCAqLworfTsKKworCisvKiogU3ViY2xhc3Mgb2YgTWVzYSBmcmFnbWVudCBwcm9ncmFtICovCitzdHJ1Y3QgYnJ3X2ZyYWdtZW50X3Byb2dyYW0geworICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gcHJvZ3JhbTsKKyAgIEdMdWludCBpZDsgIC8qKjwgc2VyaWFsIG5vLiB0byBpZGVudGlmeSBmcmFnIHByb2dzLCBuZXZlciByZS11c2VkICovCit9OworCisKKy8qKiBTdWJjbGFzcyBvZiBNZXNhIGNvbXB1dGUgcHJvZ3JhbSAqLworc3RydWN0IGJyd19jb21wdXRlX3Byb2dyYW0geworICAgc3RydWN0IGdsX2NvbXB1dGVfcHJvZ3JhbSBwcm9ncmFtOworICAgdW5zaWduZWQgaWQ7ICAvKio8IHNlcmlhbCBuby4gdG8gaWRlbnRpZnkgY29tcHV0ZSBwcm9ncywgbmV2ZXIgcmUtdXNlZCAqLworfTsKKworCitzdHJ1Y3QgYnJ3X3NoYWRlciB7CisgICBzdHJ1Y3QgZ2xfc2hhZGVyIGJhc2U7CisKKyAgIGJvb2wgY29tcGlsZWRfb25jZTsKK307CisKKy8qIE5vdGU6IElmIGFkZGluZyBmaWVsZHMgdGhhdCBuZWVkIGFueXRoaW5nIGJlc2lkZXMgYSBub3JtYWwgbWVtY21wKCkgZm9yCisgKiBjb21wYXJpbmcgdGhlbSwgYmUgc3VyZSB0byBnbyBmaXggYnJ3X3N0YWdlX3Byb2dfZGF0YV9jb21wYXJlKCkuCisgKi8KK3N0cnVjdCBicndfc3RhZ2VfcHJvZ19kYXRhIHsKKyAgIHN0cnVjdCB7CisgICAgICAvKiogc2l6ZSBvZiBvdXIgYmluZGluZyB0YWJsZS4gKi8KKyAgICAgIHVpbnQzMl90IHNpemVfYnl0ZXM7CisKKyAgICAgIC8qKiBAeworICAgICAgICogc3VyZmFjZSBpbmRpY2VzIGZvciB0aGUgdmFyaW91cyBncm91cHMgb2Ygc3VyZmFjZXMKKyAgICAgICAqLworICAgICAgdWludDMyX3QgcHVsbF9jb25zdGFudHNfc3RhcnQ7CisgICAgICB1aW50MzJfdCB0ZXh0dXJlX3N0YXJ0OworICAgICAgdWludDMyX3QgZ2F0aGVyX3RleHR1cmVfc3RhcnQ7CisgICAgICB1aW50MzJfdCB1Ym9fc3RhcnQ7CisgICAgICB1aW50MzJfdCBhYm9fc3RhcnQ7CisgICAgICB1aW50MzJfdCBzaGFkZXJfdGltZV9zdGFydDsKKyAgICAgIC8qKiBAfSAqLworICAgfSBiaW5kaW5nX3RhYmxlOworCisgICBHTHVpbnQgbnJfcGFyYW1zOyAgICAgICAvKio8IG51bWJlciBvZiBmbG9hdCBwYXJhbXMvY29uc3RhbnRzICovCisgICBHTHVpbnQgbnJfcHVsbF9wYXJhbXM7CisKKyAgIC8qIFBvaW50ZXJzIHRvIHRyYWNrZWQgdmFsdWVzIChvbmx5IHZhbGlkIG9uY2UKKyAgICAqIF9tZXNhX2xvYWRfc3RhdGVfcGFyYW1ldGVycyBoYXMgYmVlbiBjYWxsZWQgYXQgcnVudGltZSkuCisgICAgKgorICAgICogVGhlc2UgbXVzdCBiZSB0aGUgbGFzdCBmaWVsZHMgb2YgdGhlIHN0cnVjdCAoc2VlCisgICAgKiBicndfc3RhZ2VfcHJvZ19kYXRhX2NvbXBhcmUoKSkuCisgICAgKi8KKyAgIGNvbnN0IGZsb2F0ICoqcGFyYW07CisgICBjb25zdCBmbG9hdCAqKnB1bGxfcGFyYW07Cit9OworCisvKiBEYXRhIGFib3V0IGEgcGFydGljdWxhciBhdHRlbXB0IHRvIGNvbXBpbGUgYSBwcm9ncmFtLiAgTm90ZSB0aGF0CisgKiB0aGVyZSBjYW4gYmUgbWFueSBvZiB0aGVzZSwgZWFjaCBpbiBhIGRpZmZlcmVudCBHTCBzdGF0ZQorICogY29ycmVzcG9uZGluZyB0byBhIGRpZmZlcmVudCBicndfd21fcHJvZ19rZXkgc3RydWN0LCB3aXRoIGRpZmZlcmVudAorICogY29tcGlsZWQgcHJvZ3JhbXMuCisgKgorICogTm90ZTogYnJ3X3dtX3Byb2dfZGF0YV9jb21wYXJlKCkgbXVzdCBiZSB1cGRhdGVkIHdoZW4gYWRkaW5nIGZpZWxkcyB0byB0aGlzCisgKiBzdHJ1Y3QhCisgKi8KK3N0cnVjdCBicndfd21fcHJvZ19kYXRhIHsKKyAgIHN0cnVjdCBicndfc3RhZ2VfcHJvZ19kYXRhIGJhc2U7CisKKyAgIEdMdWludCBjdXJiX3JlYWRfbGVuZ3RoOworICAgR0x1aW50IG51bV92YXJ5aW5nX2lucHV0czsKKworICAgR0x1aW50IGZpcnN0X2N1cmJlX2dyZjsKKyAgIEdMdWludCBmaXJzdF9jdXJiZV9ncmZfMTY7CisgICBHTHVpbnQgcmVnX2Jsb2NrczsKKyAgIEdMdWludCByZWdfYmxvY2tzXzE2OworICAgR0x1aW50IHRvdGFsX3NjcmF0Y2g7CisKKyAgIHN0cnVjdCB7CisgICAgICAvKiogQHsKKyAgICAgICAqIHN1cmZhY2UgaW5kaWNlcyB0aGUgV00tc3BlY2lmaWMgc3VyZmFjZXMKKyAgICAgICAqLworICAgICAgdWludDMyX3QgcmVuZGVyX3RhcmdldF9zdGFydDsKKyAgICAgIC8qKiBAfSAqLworICAgfSBiaW5kaW5nX3RhYmxlOworCisgICBib29sIGR1YWxfc3JjX2JsZW5kOworICAgYm9vbCB1c2VzX3Bvc19vZmZzZXQ7CisgICBib29sIHVzZXNfb21hc2s7CisgICB1aW50MzJfdCBwcm9nX29mZnNldF8xNjsKKworICAgLyoqCisgICAgKiBNYXNrIG9mIHdoaWNoIGludGVycG9sYXRpb24gbW9kZXMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXIuCisgICAgKiBVc2VkIGluIGhhcmR3YXJlIHNldHVwIG9uIGdlbjYrLgorICAgICovCisgICB1aW50MzJfdCBiYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXM7CisKKyAgIC8qKgorICAgICogTWFwIGZyb20gZ2xfdmFyeWluZ19zbG90IHRvIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIEZTIHNldHVwIGRhdGEKKyAgICAqIHBheWxvYWQgd2hlcmUgdGhlIHZhcnlpbmcncyBhdHRyaWJ1dGUgdmVydGV4IGRlbHRhcyBzaG91bGQgYmUgZGVsaXZlcmVkLgorICAgICogRm9yIHZhcnlpbmcgc2xvdHMgdGhhdCBhcmUgbm90IHVzZWQgYnkgdGhlIEZTLCB0aGUgdmFsdWUgaXMgLTEuCisgICAgKi8KKyAgIGludCB1cmJfc2V0dXBbVkFSWUlOR19TTE9UX01BWF07Cit9OworCisvKioKKyAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBpOTY1LXNwZWNpZmljIHZlcnRleCByZXN1bHRzIHRoYXQgZG9uJ3QgY29ycmVzcG9uZAorICogZXhhY3RseSB0byBhbnkgZWxlbWVudCBvZiBnbF92YXJ5aW5nX3Nsb3QuICBUaGUgdmFsdWVzIG9mIHRoaXMgZW51bSBhcmUKKyAqIGFzc2lnbmVkIHN1Y2ggdGhhdCB0aGV5IGRvbid0IGNvbmZsaWN0IHdpdGggZ2xfdmFyeWluZ19zbG90LgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgIEJSV19WQVJZSU5HX1NMT1RfTkRDID0gVkFSWUlOR19TTE9UX01BWCwKKyAgIEJSV19WQVJZSU5HX1NMT1RfUEFELAorICAgLyoqCisgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIG5vdCBhIHZhcnlpbmcgYnV0IGp1c3QgYSBwbGFjZWhvbGRlciB0aGF0CisgICAgKiBjb21waWxlX3NmX3Byb2coKSBpbnNlcnRzIGludG8gaXRzIFZVRSBtYXAgdG8gY2F1c2UgdGhlIGdsX1BvaW50Q29vcmQKKyAgICAqIGJ1aWx0aW4gdmFyaWFibGUgdG8gYmUgY29tcGlsZWQgY29ycmVjdGx5LiBzZWUgY29tcGlsZV9zZl9wcm9nKCkgZm9yCisgICAgKiBtb3JlIGluZm8uCisgICAgKi8KKyAgIEJSV19WQVJZSU5HX1NMT1RfUE5UQywKKyAgIEJSV19WQVJZSU5HX1NMT1RfQ09VTlQKK30gYnJ3X3Zhcnlpbmdfc2xvdDsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHJlY29yZGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGdsX3Zhcnlpbmdfc2xvdCBlbnVtCisgKiBhbmQgInNsb3RzIiB3aXRoaW4gdGhlIHZlcnRleCBVUkIgZW50cnkgKFZVRSkuICBBICJzbG90IiBpcyBkZWZpbmVkIGFzIGEKKyAqIHNpbmdsZSBvY3Rhd29yZCB3aXRoaW4gdGhlIFZVRSAoMTI4IGJpdHMpLgorICoKKyAqIE5vdGUgdGhhdCBlYWNoIEJSVyByZWdpc3RlciBjb250YWlucyAyNTYgYml0cyAoMiBvY3Rhd29yZHMpLCBzbyB3aGVuCisgKiBhY2Nlc3NpbmcgdGhlIFZVRSBpbiBVUkJfTk9TV0laWkxFIG1vZGUsIGVhY2ggcmVnaXN0ZXIgY29ycmVzcG9uZHMgdG8gdHdvCisgKiBjb25zZWN1dGl2ZSBWVUUgc2xvdHMuICBXaGVuIGFjY2Vzc2luZyB0aGUgVlVFIGluIFVSQl9JTlRFUkxFQVZFRCBtb2RlIChhcworICogaW4gYSB2ZXJ0ZXggc2hhZGVyKSwgZWFjaCByZWdpc3RlciBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBWVUUgc2xvdCwgc2luY2UKKyAqIGl0IGNvbnRhaW5zIGRhdGEgZm9yIHR3byBzZXBhcmF0ZSB2ZXJ0aWNlcy4KKyAqLworc3RydWN0IGJyd192dWVfbWFwIHsKKyAgIC8qKgorICAgICogQml0ZmllbGQgcmVwcmVzZW50aW5nIGFsbCB2YXJ5aW5nIHNsb3RzIHRoYXQgYXJlIChhKSBzdG9yZWQgaW4gdGhpcyBWVUUKKyAgICAqIG1hcCwgYW5kIChiKSBhY3R1YWxseSB3cml0dGVuIGJ5IHRoZSBzaGFkZXIuICBEb2VzIG5vdCBpbmNsdWRlIGFueSBvZgorICAgICogdGhlIGFkZGl0aW9uYWwgdmFyeWluZyBzbG90cyBkZWZpbmVkIGluIGJyd192YXJ5aW5nX3Nsb3QuCisgICAgKi8KKyAgIEdMYml0ZmllbGQ2NCBzbG90c192YWxpZDsKKworICAgLyoqCisgICAgKiBNYXAgZnJvbSBnbF92YXJ5aW5nX3Nsb3QgdmFsdWUgdG8gVlVFIHNsb3QuICBGb3IgZ2xfdmFyeWluZ19zbG90cyB0aGF0IGFyZQorICAgICogbm90IHN0b3JlZCBpbiBhIHNsb3QgKGJlY2F1c2UgdGhleSBhcmUgbm90IHdyaXR0ZW4sIG9yIGJlY2F1c2UKKyAgICAqIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBpcyBhcHBsaWVkIGJlZm9yZSBzdG9yaW5nIHRoZW0gaW4gdGhlIFZVRSksIHRoZQorICAgICogdmFsdWUgaXMgLTEuCisgICAgKi8KKyAgIHNpZ25lZCBjaGFyIHZhcnlpbmdfdG9fc2xvdFtCUldfVkFSWUlOR19TTE9UX0NPVU5UXTsKKworICAgLyoqCisgICAgKiBNYXAgZnJvbSBWVUUgc2xvdCB0byBnbF92YXJ5aW5nX3Nsb3QgdmFsdWUuICBGb3Igc2xvdHMgdGhhdCBkbyBub3QKKyAgICAqIGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8gYSBnbF92YXJ5aW5nX3Nsb3QsIHRoZSB2YWx1ZSBjb21lcyBmcm9tCisgICAgKiBicndfdmFyeWluZ19zbG90LgorICAgICoKKyAgICAqIEZvciBzbG90cyB0aGF0IGFyZSBub3QgaW4gdXNlLCB0aGUgdmFsdWUgaXMgQlJXX1ZBUllJTkdfU0xPVF9DT1VOVCAodGhpcworICAgICogc2ltcGxpZmllcyBjb2RlIHRoYXQgdXNlcyB0aGUgdmFsdWUgc3RvcmVkIGluIHNsb3RfdG9fdmFyeWluZyB0bworICAgICogY3JlYXRlIGEgYml0IG1hc2spLgorICAgICovCisgICBzaWduZWQgY2hhciBzbG90X3RvX3ZhcnlpbmdbQlJXX1ZBUllJTkdfU0xPVF9DT1VOVF07CisKKyAgIC8qKgorICAgICogVG90YWwgbnVtYmVyIG9mIFZVRSBzbG90cyBpbiB1c2UKKyAgICAqLworICAgaW50IG51bV9zbG90czsKK307CisKKy8qKgorICogQ29udmVydCBhIFZVRSBzbG90IG51bWJlciBpbnRvIGEgYnl0ZSBvZmZzZXQgd2l0aGluIHRoZSBWVUUuCisgKi8KK3N0YXRpYyBpbmxpbmUgR0x1aW50IGJyd192dWVfc2xvdF90b19vZmZzZXQoR0x1aW50IHNsb3QpCit7CisgICByZXR1cm4gMTYqc2xvdDsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgdmVydGV4IG91dHB1dCAoYnJ3X3Zhcnlpbmdfc2xvdCkgaW50byBhIGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUKKyAqIFZVRS4KKyAqLworc3RhdGljIGlubGluZSBHTHVpbnQgYnJ3X3ZhcnlpbmdfdG9fb2Zmc2V0KHN0cnVjdCBicndfdnVlX21hcCAqdnVlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgdmFyeWluZykKK3sKKyAgIHJldHVybiBicndfdnVlX3Nsb3RfdG9fb2Zmc2V0KHZ1ZV9tYXAtPnZhcnlpbmdfdG9fc2xvdFt2YXJ5aW5nXSk7Cit9CisKK3ZvaWQgYnJ3X2NvbXB1dGVfdnVlX21hcChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgc3RydWN0IGJyd192dWVfbWFwICp2dWVfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMYml0ZmllbGQ2NCBzbG90c192YWxpZCk7CisKKworLyoqCisgKiBCaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggZnJhZ21lbnQgc2hhZGVyIGlucHV0cyByZXByZXNlbnQgdmFyeWluZ3MgKGFuZAorICogaGVuY2UgaGF2ZSB0byBiZSBkZWxpdmVyZWQgdG8gdGhlIGZyYWdtZW50IHNoYWRlciBieSB0aGUgU0YvU0JFIHN0YWdlKS4KKyAqLworI2RlZmluZSBCUldfRlNfVkFSWUlOR19JTlBVVF9NQVNLIFwKKyAgIChCSVRGSUVMRDY0X1JBTkdFKDAsIFZBUllJTkdfU0xPVF9NQVgpICYgXAorICAgIH5WQVJZSU5HX0JJVF9QT1MgJiB+VkFSWUlOR19CSVRfRkFDRSkKKworCisvKgorICogTWFwcGluZyBvZiBWVUUgbWFwIHNsb3RzIHRvIGludGVycG9sYXRpb24gbW9kZXMuCisgKi8KK3N0cnVjdCBpbnRlcnBvbGF0aW9uX21vZGVfbWFwIHsKKyAgIHVuc2lnbmVkIGNoYXIgbW9kZVtCUldfVkFSWUlOR19TTE9UX0NPVU5UXTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBicndfYW55X2ZsYXRfdmFyeWluZ3Moc3RydWN0IGludGVycG9sYXRpb25fbW9kZV9tYXAgKm1hcCkKK3sKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlJXX1ZBUllJTkdfU0xPVF9DT1VOVDsgaSsrKQorICAgICAgaWYgKG1hcC0+bW9kZVtpXSA9PSBJTlRFUlBfUVVBTElGSUVSX0ZMQVQpCisgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYnJ3X2FueV9ub3BlcnNwZWN0aXZlX3ZhcnlpbmdzKHN0cnVjdCBpbnRlcnBvbGF0aW9uX21vZGVfbWFwICptYXApCit7CisgICBmb3IgKGludCBpID0gMDsgaSA8IEJSV19WQVJZSU5HX1NMT1RfQ09VTlQ7IGkrKykKKyAgICAgIGlmIChtYXAtPm1vZGVbaV0gPT0gSU5URVJQX1FVQUxJRklFUl9OT1BFUlNQRUNUSVZFKQorICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgIHJldHVybiBmYWxzZTsKK30KKworCitzdHJ1Y3QgYnJ3X3NmX3Byb2dfZGF0YSB7CisgICBHTHVpbnQgdXJiX3JlYWRfbGVuZ3RoOworICAgR0x1aW50IHRvdGFsX2dyZjsKKworICAgLyogRWFjaCB2ZXJ0ZXggbWF5IGhhdmUgdXAgdG8gMTIgYXR0cmlidXRlcywgNCBjb21wb25lbnRzIGVhY2gsCisgICAgKiBleGNlcHQgV1BPUyB3aGljaCByZXF1aXJlcyBvbmx5IDIuICAoMTEqNCArIDIpID09IDQ0ID09PiAxMQorICAgICogcm93cy4KKyAgICAqCisgICAgKiBBY3R1YWxseSB3ZSB1c2UgNCBmb3IgZWFjaCwgc28gY2FsbCBpdCAxMiByb3dzLgorICAgICovCisgICBHTHVpbnQgdXJiX2VudHJ5X3NpemU7Cit9OworCisKKy8qKgorICogV2UgYWx3YXlzIHByb2dyYW0gU0YgdG8gc3RhcnQgcmVhZGluZyBhdCBhbiBvZmZzZXQgb2YgMSAoMiB2YXJ5aW5nIHNsb3RzKQorICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZlcnRleCBVUkIgZW50cnkuICBUaGlzIGNhdXNlcyBpdCB0byBza2lwOgorICogLSBWQVJZSU5HX1NMT1RfUFNJWiBhbmQgQlJXX1ZBUllJTkdfU0xPVF9OREMgb24gZ2VuNC01CisgKiAtIFZBUllJTkdfU0xPVF9QU0laIGFuZCBWQVJZSU5HX1NMT1RfUE9TIG9uIGdlbjYrCisgKi8KKyNkZWZpbmUgQlJXX1NGX1VSQl9FTlRSWV9SRUFEX09GRlNFVCAxCisKKworc3RydWN0IGJyd19jbGlwX3Byb2dfZGF0YSB7CisgICBHTHVpbnQgY3VyYl9yZWFkX2xlbmd0aDsJLyogdXNlciBwbGFuZXM/ICovCisgICBHTHVpbnQgY2xpcF9tb2RlOworICAgR0x1aW50IHVyYl9yZWFkX2xlbmd0aDsKKyAgIEdMdWludCB0b3RhbF9ncmY7Cit9OworCitzdHJ1Y3QgYnJ3X2ZmX2dzX3Byb2dfZGF0YSB7CisgICBHTHVpbnQgdXJiX3JlYWRfbGVuZ3RoOworICAgR0x1aW50IHRvdGFsX2dyZjsKKworICAgLyoqCisgICAgKiBHZW42IHRyYW5zZm9ybSBmZWVkYmFjazogQW1vdW50IGJ5IHdoaWNoIHRoZSBzdHJlYW1pbmcgdmVydGV4IGJ1ZmZlcgorICAgICogaW5kaWNlcyBzaG91bGQgYmUgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBHUyBpcyBpbnZva2VkLgorICAgICovCisgICB1bnNpZ25lZCBzdmJpX3Bvc3RpbmNyZW1lbnRfdmFsdWU7Cit9OworCisKKy8qIE5vdGU6IGJyd192ZWM0X3Byb2dfZGF0YV9jb21wYXJlKCkgbXVzdCBiZSB1cGRhdGVkIHdoZW4gYWRkaW5nIGZpZWxkcyB0bworICogdGhpcyBzdHJ1Y3QhCisgKi8KK3N0cnVjdCBicndfdmVjNF9wcm9nX2RhdGEgeworICAgc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEgYmFzZTsKKyAgIHN0cnVjdCBicndfdnVlX21hcCB2dWVfbWFwOworCisgICAvKioKKyAgICAqIFJlZ2lzdGVyIHdoZXJlIHRoZSB0aHJlYWQgZXhwZWN0cyB0byBmaW5kIGlucHV0IGRhdGEgZnJvbSB0aGUgVVJCCisgICAgKiAodHlwaWNhbGx5IHVuaWZvcm1zLCBmb2xsb3dlZCBieSBwZXItdmVydGV4IGlucHV0cykuCisgICAgKi8KKyAgIHVuc2lnbmVkIGRpc3BhdGNoX2dyZl9zdGFydF9yZWc7CisKKyAgIEdMdWludCBjdXJiX3JlYWRfbGVuZ3RoOworICAgR0x1aW50IHVyYl9yZWFkX2xlbmd0aDsKKyAgIEdMdWludCB0b3RhbF9ncmY7CisgICBHTHVpbnQgdG90YWxfc2NyYXRjaDsKKworICAgLyogVXNlZCBmb3IgY2FsY3VsYXRpbmcgdXJiIHBhcnRpdGlvbnMuICBJbiB0aGUgVlMsIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlCisgICAgKiBVUkIgZW50cnkgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHRvIHRoZSB0aHJlYWQuICBJbiB0aGUgR1MsIHRoaXMKKyAgICAqIGlzIHRoZSBzaXplIG9mIHRoZSBVUkIgZW50cnkgdXNlZCBmb3Igb3V0cHV0LgorICAgICovCisgICBHTHVpbnQgdXJiX2VudHJ5X3NpemU7Cit9OworCisKKy8qIE5vdGU6IGJyd192c19wcm9nX2RhdGFfY29tcGFyZSgpIG11c3QgYmUgdXBkYXRlZCB3aGVuIGFkZGluZyBmaWVsZHMgdG8gdGhpcworICogc3RydWN0IQorICovCitzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSB7CisgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19kYXRhIGJhc2U7CisKKyAgIEdMYml0ZmllbGQ2NCBpbnB1dHNfcmVhZDsKKworICAgYm9vbCB1c2VzX3ZlcnRleGlkOworICAgYm9vbCB1c2VzX2luc3RhbmNlaWQ7Cit9OworCisKKy8qIE5vdGU6IGJyd19nc19wcm9nX2RhdGFfY29tcGFyZSgpIG11c3QgYmUgdXBkYXRlZCB3aGVuIGFkZGluZyBmaWVsZHMgdG8KKyAqIHRoaXMgc3RydWN0IQorICovCitzdHJ1Y3QgYnJ3X2dzX3Byb2dfZGF0YQoreworICAgc3RydWN0IGJyd192ZWM0X3Byb2dfZGF0YSBiYXNlOworCisgICAvKioKKyAgICAqIFNpemUgb2YgYW4gb3V0cHV0IHZlcnRleCwgbWVhc3VyZWQgaW4gSFdPUkRTICgzMiBieXRlcykuCisgICAgKi8KKyAgIHVuc2lnbmVkIG91dHB1dF92ZXJ0ZXhfc2l6ZV9od29yZHM7CisKKyAgIHVuc2lnbmVkIG91dHB1dF90b3BvbG9neTsKKworICAgLyoqCisgICAgKiBTaXplIG9mIHRoZSBjb250cm9sIGRhdGEgKGN1dCBiaXRzIG9yIFN0cmVhbUlEIGJpdHMpLCBpbiBod29yZHMgKDMyCisgICAgKiBieXRlcykuICAwIGlmIHRoZXJlIGlzIG5vIGNvbnRyb2wgZGF0YS4KKyAgICAqLworICAgdW5zaWduZWQgY29udHJvbF9kYXRhX2hlYWRlcl9zaXplX2h3b3JkczsKKworICAgLyoqCisgICAgKiBGb3JtYXQgb2YgdGhlIGNvbnRyb2wgZGF0YSAoZWl0aGVyIEdFTjdfR1NfQ09OVFJPTF9EQVRBX0ZPUk1BVF9HU0NUTF9TSUQKKyAgICAqIGlmIHRoZSBjb250cm9sIGRhdGEgaXMgU3RyZWFtSUQgYml0cywgb3IKKyAgICAqIEdFTjdfR1NfQ09OVFJPTF9EQVRBX0ZPUk1BVF9HU0NUTF9DVVQgaWYgdGhlIGNvbnRyb2wgZGF0YSBpcyBjdXQgYml0cykuCisgICAgKiBJZ25vcmVkIGlmIGNvbnRyb2xfZGF0YV9oZWFkZXJfc2l6ZSBpcyAwLgorICAgICovCisgICB1bnNpZ25lZCBjb250cm9sX2RhdGFfZm9ybWF0OworCisgICBib29sIGluY2x1ZGVfcHJpbWl0aXZlX2lkOworCisgICBpbnQgaW52b2NhdGlvbnM7CisKKyAgIC8qKgorICAgICogVHJ1ZSBpZiB0aGUgdGhyZWFkIHNob3VsZCBiZSBkaXNwYXRjaGVkIGluIERVQUxfSU5TVEFOQ0UgbW9kZSwgZmFsc2UgaWYKKyAgICAqIGl0IHNob3VsZCBiZSBkaXNwYXRjaGVkIGluIERVQUxfT0JKRUNUIG1vZGUuCisgICAgKi8KKyAgIGJvb2wgZHVhbF9pbnN0YW5jZWRfZGlzcGF0Y2g7Cit9OworCisvKiogTnVtYmVyIG9mIHRleHR1cmUgc2FtcGxlciB1bml0cyAqLworI2RlZmluZSBCUldfTUFYX1RFWF9VTklUIDMyCisKKy8qKiBNYXggbnVtYmVyIG9mIHJlbmRlciB0YXJnZXRzIGluIGEgc2hhZGVyICovCisjZGVmaW5lIEJSV19NQVhfRFJBV19CVUZGRVJTIDgKKworLyoqIE1heCBudW1iZXIgb2YgYXRvbWljIGNvdW50ZXIgYnVmZmVyIG9iamVjdHMgaW4gYSBzaGFkZXIgKi8KKyNkZWZpbmUgQlJXX01BWF9BQk8gMTYKKworLyoqCisgKiBNYXggbnVtYmVyIG9mIGJpbmRpbmcgdGFibGUgZW50cmllcyB1c2VkIGZvciBzdHJlYW0gb3V0cHV0LgorICoKKyAqIEZyb20gdGhlIE9wZW5HTCAzLjAgc3BlYywgdGFibGUgNi40NCAoVHJhbnNmb3JtIEZlZWRiYWNrIFN0YXRlKSwgdGhlCisgKiBtaW5pbXVtIHZhbHVlIG9mIE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUyBpcyA2NC4KKyAqCisgKiBPbiBHZW42LCB0aGUgc2l6ZSBvZiB0cmFuc2Zvcm0gZmVlZGJhY2sgZGF0YSBpcyBsaW1pdGVkIG5vdCBieSB0aGUgbnVtYmVyCisgKiBvZiBjb21wb25lbnRzIGJ1dCBieSB0aGUgbnVtYmVyIG9mIGJpbmRpbmcgdGFibGUgZW50cmllcyB3ZSBzZXQgYXNpZGUuICBXZQorICogdXNlIG9uZSBiaW5kaW5nIHRhYmxlIGVudHJ5IGZvciBhIGZsb2F0LCBvbmUgZW50cnkgZm9yIGEgdmVjdG9yLCBhbmQgb25lCisgKiBlbnRyeSBwZXIgbWF0cml4IGNvbHVtbi4gIFNpbmNlIHRoZSBvbmx5IHdheSB3ZSBjYW4gY29tbXVuaWNhdGUgb3VyCisgKiB0cmFuc2Zvcm0gZmVlZGJhY2sgY2FwYWJpbGl0aWVzIHRvIHRoZSBjbGllbnQgaXMgdmlhCisgKiBNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0NPTVBPTkVOVFMsIHdlIG5lZWQgdG8gcGxhbiBmb3IgdGhlCisgKiB3b3JzdCBjYXNlLCBpbiB3aGljaCBhbGwgdGhlIHZhcnlpbmdzIGFyZSBmbG9hdHMsIHNvIHdlIHVzZSB1cCBvbmUgYmluZGluZworICogdGFibGUgZW50cnkgcGVyIGNvbXBvbmVudC4gIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHNldCBhc2lkZSBhdCBsZWFzdCA2NAorICogYmluZGluZyB0YWJsZSBlbnRyaWVzIGZvciB1c2UgYnkgdHJhbnNmb3JtIGZlZWRiYWNrLgorICoKKyAqIE5vdGU6IHNpbmNlIHdlIGRvbid0IGN1cnJlbnRseSBwYWNrIHZhcnlpbmdzLCBpdCBpcyBjdXJyZW50bHkgaW1wb3NzaWJsZQorICogZm9yIHRoZSBjbGllbnQgdG8gYWN0dWFsbHkgdXNlIHVwIGFsbCBvZiB0aGVzZSBiaW5kaW5nIHRhYmxlIGVudHJpZXMtLWlmCisgKiBhbGwgb2YgdGhlaXIgdmFyeWluZ3Mgd2VyZSBmbG9hdHMsIHRoZXkgd291bGQgcnVuIG91dCBvZiB2YXJ5aW5nIHNsb3RzIGFuZAorICogZmFpbCB0byBsaW5rLiAgQnV0IHRoYXQncyBhIGJ1Zywgc28gaXQgc2VlbXMgcHJ1ZGVudCB0byBnbyBhaGVhZCBhbmQKKyAqIGFsbG9jYXRlIHRoZSBudW1iZXIgb2YgYmluZGluZyB0YWJsZSBlbnRyaWVzIHdlIHdpbGwgbmVlZCBvbmNlIHRoZSBidWcgaXMKKyAqIGZpeGVkLgorICovCisjZGVmaW5lIEJSV19NQVhfU09MX0JJTkRJTkdTIDY0CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBhY3R1YWwgYnVmZmVycyB1c2VkIGZvciBzdHJlYW0gb3V0cHV0ICovCisjZGVmaW5lIEJSV19NQVhfU09MX0JVRkZFUlMgNAorCisjZGVmaW5lIEJSV19NQVhfU1VSRkFDRVMgICAoQlJXX01BWF9EUkFXX0JVRkZFUlMgKyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX01BWF9URVhfVU5JVCAqIDIgKyAvKiBub3JtYWwsIGdhdGhlciAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgKyAvKiB1Ym8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX01BWF9BQk8gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAvKiBzaGFkZXIgdGltZSwgcHVsbCBjb25zdGFudHMgKi8pCisKKyNkZWZpbmUgU1VSRl9JTkRFWF9HRU42X1NPTF9CSU5ESU5HKHQpICh0KQorI2RlZmluZSBCUldfTUFYX0dFTjZfR1NfU1VSRkFDRVMgICAgICAgU1VSRl9JTkRFWF9HRU42X1NPTF9CSU5ESU5HKEJSV19NQVhfU09MX0JJTkRJTkdTKQorCisvKioKKyAqIFN0cmlkZSBpbiBieXRlcyBiZXR3ZWVuIHNoYWRlcl90aW1lIGVudHJpZXMuCisgKgorICogV2Ugc2VwYXJhdGUgZW50cmllcyBieSBhIGNhY2hlbGluZSB0byByZWR1Y2UgdHJhZmZpYyBiZXR3ZWVuIEVVcyB3cml0aW5nIHRvCisgKiBkaWZmZXJlbnQgZW50cmllcy4KKyAqLworI2RlZmluZSBTSEFERVJfVElNRV9TVFJJREUgNjQKKworZW51bSBicndfY2FjaGVfaWQgeworICAgQlJXX0NDX1ZQLAorICAgQlJXX0NDX1VOSVQsCisgICBCUldfV01fUFJPRywKKyAgIEJSV19CTE9SUF9CTElUX1BST0csCisgICBCUldfQkxPUlBfQ09OU1RfQ09MT1JfUFJPRywKKyAgIEJSV19TQU1QTEVSLAorICAgQlJXX1dNX1VOSVQsCisgICBCUldfU0ZfUFJPRywKKyAgIEJSV19TRl9WUCwKKyAgIEJSV19TRl9VTklULCAvKiBzY2lzc29yIHN0YXRlIG9uIGdlbjYgKi8KKyAgIEJSV19WU19VTklULAorICAgQlJXX1ZTX1BST0csCisgICBCUldfRkZfR1NfVU5JVCwKKyAgIEJSV19GRl9HU19QUk9HLAorICAgQlJXX0dTX1BST0csCisgICBCUldfQ0xJUF9WUCwKKyAgIEJSV19DTElQX1VOSVQsCisgICBCUldfQ0xJUF9QUk9HLAorCisgICBCUldfTUFYX0NBQ0hFCit9OworCitzdHJ1Y3QgYnJ3X2NhY2hlX2l0ZW0geworICAgLyoqCisgICAgKiBFZmZlY3RpdmVseSBwYXJ0IG9mIHRoZSBrZXksIGNhY2hlX2lkIGlkZW50aWZpZXMgd2hhdCBraW5kIG9mIHN0YXRlCisgICAgKiBidWZmZXIgaXMgaW52b2x2ZWQsIGFuZCBhbHNvIHdoaWNoIGJydy0+c3RhdGUuZGlydHkuY2FjaGUgZmxhZyBzaG91bGQKKyAgICAqIGJlIHNldCB3aGVuIHRoaXMgY2FjaGUgaXRlbSBpcyBjaG9zZW4uCisgICAgKi8KKyAgIGVudW0gYnJ3X2NhY2hlX2lkIGNhY2hlX2lkOworICAgLyoqIDMyLWJpdCBoYXNoIG9mIHRoZSBrZXkgZGF0YSAqLworICAgR0x1aW50IGhhc2g7CisgICBHTHVpbnQga2V5X3NpemU7CQkvKiBmb3IgdmFyaWFibGUtc2l6ZWQga2V5cyAqLworICAgR0x1aW50IGF1eF9zaXplOworICAgY29uc3Qgdm9pZCAqa2V5OworCisgICB1aW50MzJfdCBvZmZzZXQ7CisgICB1aW50MzJfdCBzaXplOworCisgICBzdHJ1Y3QgYnJ3X2NhY2hlX2l0ZW0gKm5leHQ7Cit9OworCisKK3R5cGVkZWYgYm9vbCAoKmNhY2hlX2F1eF9jb21wYXJlX2Z1bmMpKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwordHlwZWRlZiB2b2lkICgqY2FjaGVfYXV4X2ZyZWVfZnVuYykoY29uc3Qgdm9pZCAqYXV4KTsKKworc3RydWN0IGJyd19jYWNoZSB7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydzsKKworICAgc3RydWN0IGJyd19jYWNoZV9pdGVtICoqaXRlbXM7CisgICBkcm1faW50ZWxfYm8gKmJvOworICAgR0x1aW50IHNpemUsIG5faXRlbXM7CisKKyAgIHVpbnQzMl90IG5leHRfb2Zmc2V0OworICAgYm9vbCBib191c2VkX2J5X2dwdTsKKworICAgLyoqCisgICAgKiBPcHRpb25hbCBmdW5jdGlvbnMgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBwcm9nX2RhdGEgZm9yIGEgbmV3CisgICAgKiBjYWNoZSBpdGVtIG1hdGNoZXMgYW4gZXhpc3RpbmcgY2FjaGUgaXRlbSAoaW4gY2FzZSB0aGVyZSdzIHJlbGV2YW50IGRhdGEKKyAgICAqIG91dHNpZGUgb2YgdGhlIHByb2dfZGF0YSkuICBJZiBOVUxMLCBhIHBsYWluIG1lbWNtcCBpcyBkb25lLgorICAgICovCisgICBjYWNoZV9hdXhfY29tcGFyZV9mdW5jIGF1eF9jb21wYXJlW0JSV19NQVhfQ0FDSEVdOworICAgLyoqIE9wdGlvbmFsIGZ1bmN0aW9ucyBmb3IgZnJlZWluZyBvdGhlciBwb2ludGVycyBhdHRhY2hlZCB0byBhIHByb2dfZGF0YS4gKi8KKyAgIGNhY2hlX2F1eF9mcmVlX2Z1bmMgYXV4X2ZyZWVbQlJXX01BWF9DQUNIRV07Cit9OworCisKKy8qIENvbnNpZGVyZWQgYWRkaW5nIGEgbWVtYmVyIHRvIHRoaXMgc3RydWN0IHRvIGRvY3VtZW50IHdoaWNoIGZsYWdzCisgKiBhbiB1cGRhdGUgbWlnaHQgcmFpc2Ugc28gdGhhdCBvcmRlcmluZyBvZiB0aGUgc3RhdGUgYXRvbXMgY2FuIGJlCisgKiBjaGVja2VkIG9yIGRlcml2ZWQgYXQgcnVudGltZS4gIERyb3BwZWQgdGhlIGlkZWEgaW4gZmF2b3Igb2YgaGF2aW5nCisgKiBhIGRlYnVnIG1vZGUgd2hlcmUgdGhlIHN0YXRlIGlzIG1vbml0b3JlZCBmb3IgZmxhZ3Mgd2hpY2ggYXJlCisgKiByYWlzZWQgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB0ZXN0ZWQgYWdhaW5zdC4KKyAqLworc3RydWN0IGJyd190cmFja2VkX3N0YXRlIHsKKyAgIHN0cnVjdCBicndfc3RhdGVfZmxhZ3MgZGlydHk7CisgICB2b2lkICgqZW1pdCkoIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ICk7Cit9OworCitlbnVtIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHsKKyAgIFNUX05PTkUsCisgICBTVF9WUywKKyAgIFNUX1ZTX1dSSVRURU4sCisgICBTVF9WU19SRVNFVCwKKyAgIFNUX0dTLAorICAgU1RfR1NfV1JJVFRFTiwKKyAgIFNUX0dTX1JFU0VULAorICAgU1RfRlM4LAorICAgU1RfRlM4X1dSSVRURU4sCisgICBTVF9GUzhfUkVTRVQsCisgICBTVF9GUzE2LAorICAgU1RfRlMxNl9XUklUVEVOLAorICAgU1RfRlMxNl9SRVNFVCwKK307CisKKy8qIEZsYWdzIGZvciBicnctPnN0YXRlLmNhY2hlLgorICovCisjZGVmaW5lIENBQ0hFX05FV19DQ19WUCAgICAgICAgICAgICAgICAgICgxPDxCUldfQ0NfVlApCisjZGVmaW5lIENBQ0hFX05FV19DQ19VTklUICAgICAgICAgICAgICAgICgxPDxCUldfQ0NfVU5JVCkKKyNkZWZpbmUgQ0FDSEVfTkVXX1dNX1BST0cgICAgICAgICAgICAgICAgKDE8PEJSV19XTV9QUk9HKQorI2RlZmluZSBDQUNIRV9ORVdfQkxPUlBfQkxJVF9QUk9HICAgICAgICAoMTw8QlJXX0JMT1JQX0JMSVRfUFJPRykKKyNkZWZpbmUgQ0FDSEVfTkVXX0JMT1JQX0NPTlNUX0NPTE9SX1BST0cgKDE8PEJSV19CTE9SUF9DT05TVF9DT0xPUl9QUk9HKQorI2RlZmluZSBDQUNIRV9ORVdfU0FNUExFUiAgICAgICAgICAgICAgICAoMTw8QlJXX1NBTVBMRVIpCisjZGVmaW5lIENBQ0hFX05FV19XTV9VTklUICAgICAgICAgICAgICAgICgxPDxCUldfV01fVU5JVCkKKyNkZWZpbmUgQ0FDSEVfTkVXX1NGX1BST0cgICAgICAgICAgICAgICAgKDE8PEJSV19TRl9QUk9HKQorI2RlZmluZSBDQUNIRV9ORVdfU0ZfVlAgICAgICAgICAgICAgICAgICAoMTw8QlJXX1NGX1ZQKQorI2RlZmluZSBDQUNIRV9ORVdfU0ZfVU5JVCAgICAgICAgICAgICAgICAoMTw8QlJXX1NGX1VOSVQpCisjZGVmaW5lIENBQ0hFX05FV19WU19VTklUICAgICAgICAgICAgICAgICgxPDxCUldfVlNfVU5JVCkKKyNkZWZpbmUgQ0FDSEVfTkVXX1ZTX1BST0cgICAgICAgICAgICAgICAgKDE8PEJSV19WU19QUk9HKQorI2RlZmluZSBDQUNIRV9ORVdfRkZfR1NfVU5JVCAgICAgICAgICAgICAoMTw8QlJXX0ZGX0dTX1VOSVQpCisjZGVmaW5lIENBQ0hFX05FV19GRl9HU19QUk9HICAgICAgICAgICAgICgxPDxCUldfRkZfR1NfUFJPRykKKyNkZWZpbmUgQ0FDSEVfTkVXX0dTX1BST0cgICAgICAgICAgICAgICAgKDE8PEJSV19HU19QUk9HKQorI2RlZmluZSBDQUNIRV9ORVdfQ0xJUF9WUCAgICAgICAgICAgICAgICAoMTw8QlJXX0NMSVBfVlApCisjZGVmaW5lIENBQ0hFX05FV19DTElQX1VOSVQgICAgICAgICAgICAgICgxPDxCUldfQ0xJUF9VTklUKQorI2RlZmluZSBDQUNIRV9ORVdfQ0xJUF9QUk9HICAgICAgICAgICAgICAoMTw8QlJXX0NMSVBfUFJPRykKKworc3RydWN0IGJyd192ZXJ0ZXhfYnVmZmVyIHsKKyAgIC8qKiBCdWZmZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVwbG9hZGVkIHZlcnRleCBkYXRhICovCisgICBkcm1faW50ZWxfYm8gKmJvOworICAgdWludDMyX3Qgb2Zmc2V0OworICAgLyoqIEJ5dGUgc3RyaWRlIGJldHdlZW4gZWxlbWVudHMgaW4gdGhlIHVwbG9hZGVkIGFycmF5ICovCisgICBHTHVpbnQgc3RyaWRlOworICAgR0x1aW50IHN0ZXBfcmF0ZTsKK307CitzdHJ1Y3QgYnJ3X3ZlcnRleF9lbGVtZW50IHsKKyAgIGNvbnN0IHN0cnVjdCBnbF9jbGllbnRfYXJyYXkgKmdsYXJyYXk7CisKKyAgIGludCBidWZmZXI7CisKKyAgIC8qKiBPZmZzZXQgb2YgdGhlIGZpcnN0IGVsZW1lbnQgd2l0aGluIHRoZSBidWZmZXIgb2JqZWN0ICovCisgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworfTsKKworCisKKworCisKKy8qKgorICogRGF0YSBzaGFyZWQgYmV0d2VlbiBlYWNoIHByb2dyYW1tYWJsZSBzdGFnZSBpbiB0aGUgcGlwZWxpbmUgKHZzLCBncywgYW5kCisgKiB3bSkuCisgKi8KK3N0cnVjdCBicndfc3RhZ2Vfc3RhdGUKK3sKKyAgIGdsX3NoYWRlcl9zdGFnZSBzdGFnZTsKKyAgIHN0cnVjdCBicndfc3RhZ2VfcHJvZ19kYXRhICpwcm9nX2RhdGE7CisKKyAgIC8qKgorICAgICogT3B0aW9uYWwgc2NyYXRjaCBidWZmZXIgdXNlZCB0byBzdG9yZSBzcGlsbGVkIHJlZ2lzdGVyIHZhbHVlcyBhbmQKKyAgICAqIHZhcmlhYmx5LWluZGV4ZWQgR1JGIGFycmF5cy4KKyAgICAqLworICAgZHJtX2ludGVsX2JvICpzY3JhdGNoX2JvOworCisgICAvKiogT2Zmc2V0IGluIHRoZSBwcm9ncmFtIGNhY2hlIHRvIHRoZSBwcm9ncmFtICovCisgICB1aW50MzJfdCBwcm9nX29mZnNldDsKKworICAgLyoqIE9mZnNldCBpbiB0aGUgYmF0Y2hidWZmZXIgdG8gR2VuNC01IHBpcGVsaW5lZCBzdGF0ZSAoVlMvV00vR1NfU1RBVEUpLiAqLworICAgdWludDMyX3Qgc3RhdGVfb2Zmc2V0OworCisgICB1aW50MzJfdCBwdXNoX2NvbnN0X29mZnNldDsgLyogT2Zmc2V0IGluIHRoZSBiYXRjaGJ1ZmZlciAqLworICAgaW50IHB1c2hfY29uc3Rfc2l6ZTsgLyogaW4gMjU2LWJpdCByZWdpc3RlciBpbmNyZW1lbnRzICovCisKKyAgIC8qIEJpbmRpbmcgdGFibGU6IHBvaW50ZXJzIHRvIFNVUkZBQ0VfU1RBVEUgZW50cmllcy4gKi8KKyAgIHVpbnQzMl90IGJpbmRfYm9fb2Zmc2V0OworICAgdWludDMyX3Qgc3VyZl9vZmZzZXRbQlJXX01BWF9TVVJGQUNFU107CisKKyAgIC8qKiBTQU1QTEVSX1NUQVRFIGNvdW50IGFuZCB0YWJsZSBvZmZzZXQgKi8KKyAgIHVpbnQzMl90IHNhbXBsZXJfY291bnQ7CisgICB1aW50MzJfdCBzYW1wbGVyX29mZnNldDsKKworICAgLyoqIE9mZnNldHMgaW4gdGhlIGJhdGNoIHRvIHNhbXBsZXIgZGVmYXVsdCBjb2xvcnMgKHRleHR1cmUgYm9yZGVyIGNvbG9yKSAqLworICAgdWludDMyX3Qgc2RjX29mZnNldFtCUldfTUFYX1RFWF9VTklUXTsKK307CisKKworLyoqCisgKiBicndfY29udGV4dCBpcyBkZXJpdmVkIGZyb20gZ2xfY29udGV4dC4KKyAqLworc3RydWN0IGJyd19jb250ZXh0Cit7CisgICAgLy8gTHVuYXJHOiAgTm90ZSwgdGhpcyBpcyBvdXIgc3RyaXBwZWQgZG93biBnbF9jb250ZXh0CisgICBzdHJ1Y3QgZ2xfY29udGV4dCBjdHg7IC8qKjwgYmFzZSBjbGFzcywgbXVzdCBiZSBmaXJzdCBmaWVsZCAqLworCisgICBHTHVpbnQgc3RhdHNfd207CisKKyAgIGJvb2wgZGlzYWJsZV9kZXJpdmF0aXZlX29wdGltaXphdGlvbjsKKworICAgR0x1aW50IHByaW1pdGl2ZTsgLyoqPCBIYXJkd2FyZSBwcmltaXRpdmUsIHN1Y2ggYXMgXzNEUFJJTV9UUklMSVNULiAqLworCisgICBHTGVudW0gcmVkdWNlZF9wcmltaXRpdmU7CisKKyAgIC8qKgorICAgICogU2V0IGlmIHdlJ3JlIGVpdGhlciBhIGRlYnVnIGNvbnRleHQgb3IgdGhlIElOVEVMX0RFQlVHPXBlcmYgZW52aXJvbm1lbnQKKyAgICAqIHZhcmlhYmxlIGlzIHNldCwgdGhpcyBpcyB0aGUgZmxhZyBpbmRpY2F0aW5nIHRvIGRvIGV4cGVuc2l2ZSB3b3JrIHRoYXQKKyAgICAqIG1pZ2h0IGxlYWQgdG8gYSBwZXJmX2RlYnVnKCkgY2FsbC4KKyAgICAqLworICAgYm9vbCBwZXJmX2RlYnVnOworCisgICBpbnQgZ2VuOworICAgaW50IGd0OworCisgICBib29sIGlzX2c0eDsKKyAgIGJvb2wgaXNfYmF5dHJhaWw7CisgICBib29sIGlzX2hhc3dlbGw7CisKKyAgIGJvb2wgaGFzX2xsYzsKKyAgIGJvb2wgaGFzX2NvbXByNDsKKyAgIGJvb2wgaGFzX25lZ2F0aXZlX3Jod19idWc7CisgICBib29sIGhhc19wbG47CisKKyAgIC8qKgorICAgICogU29tZSB2ZXJzaW9ucyBvZiBHZW4gaGFyZHdhcmUgZG9uJ3QgZG8gY2VudHJvaWQgaW50ZXJwb2xhdGlvbiBjb3JyZWN0bHkKKyAgICAqIG9uIHVubGl0IHBpeGVscywgY2F1c2luZyBpbmNvcnJlY3QgdmFsdWVzIGZvciBkZXJpdmF0aXZlcyBuZWFyIHRyaWFuZ2xlCisgICAgKiBlZGdlcy4gIEVuYWJsaW5nIHRoaXMgZmxhZyBjYXVzZXMgdGhlIGZyYWdtZW50IHNoYWRlciB0byB1c2UKKyAgICAqIG5vbi1jZW50cm9pZCBpbnRlcnBvbGF0aW9uIGZvciB1bmxpdCBwaXhlbHMsIGF0IHRoZSBleHBlbnNlIG9mIHR3byBleHRyYQorICAgICogZnJhZ21lbnQgc2hhZGVyIGluc3RydWN0aW9ucy4KKyAgICAqLworICAgYm9vbCBuZWVkc191bmxpdF9jZW50cm9pZF93b3JrYXJvdW5kOworCisKKyAgIHN0cnVjdCB7CisgICAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9lbGVtZW50IGlucHV0c1tWRVJUX0FUVFJJQl9NQVhdOworICAgICAgc3RydWN0IGJyd192ZXJ0ZXhfYnVmZmVyIGJ1ZmZlcnNbVkVSVF9BVFRSSUJfTUFYXTsKKworICAgICAgc3RydWN0IGJyd192ZXJ0ZXhfZWxlbWVudCAqZW5hYmxlZFtWRVJUX0FUVFJJQl9NQVhdOworICAgICAgR0x1aW50IG5yX2VuYWJsZWQ7CisgICAgICBHTHVpbnQgbnJfYnVmZmVyczsKKworICAgICAgLyogU3VtbWFyeSBvZiBzaXplIGFuZCB2YXJ5aW5nIG9mIGFjdGl2ZSBhcnJheXMsIHNvIHdlIGNhbiBjaGVjaworICAgICAgICogZm9yIGNoYW5nZXMgdG8gdGhpcyBzdGF0ZToKKyAgICAgICAqLworICAgICAgdW5zaWduZWQgaW50IG1pbl9pbmRleCwgbWF4X2luZGV4OworCisgICAgICAvKiBPZmZzZXQgZnJvbSBzdGFydCBvZiB2ZXJ0ZXggYnVmZmVyIHNvIHdlIGNhbiBhdm9pZCByZWRlZmluaW5nCisgICAgICAgKiB0aGUgc2FtZSBWQiBwYWNrZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X3ZlcnRleF9iaWFzOworICAgfSB2YjsKKworICAgc3RydWN0IHsKKyAgICAgIC8qKgorICAgICAgICogSW5kZXggYnVmZmVyIGZvciB0aGlzIGRyYXdfcHJpbXMgY2FsbC4KKyAgICAgICAqCisgICAgICAgKiBVcGRhdGVzIGFyZSBzaWduYWxlZCBieSBCUldfTkVXX0lORElDRVMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHN0cnVjdCBfbWVzYV9pbmRleF9idWZmZXIgKmliOworCisgICAgICAvKiBVcGRhdGVzIGFyZSBzaWduYWxlZCBieSBCUldfTkVXX0lOREVYX0JVRkZFUi4gKi8KKyAgICAgIGRybV9pbnRlbF9ibyAqYm87CisgICAgICBHTHVpbnQgdHlwZTsKKworICAgICAgLyogT2Zmc2V0IHRvIGluZGV4IGJ1ZmZlciBpbmRleCB0byB1c2UgaW4gQ01EXzNEX1BSSU0gc28gdGhhdCB3ZSBjYW4KKyAgICAgICAqIGF2b2lkIHJlLXVwbG9hZGluZyB0aGUgSUIgcGFja2V0IG92ZXIgYW5kIG92ZXIgaWYgd2UncmUgYWN0dWFsbHkKKyAgICAgICAqIHJlZmVyZW5jaW5nIHRoZSBzYW1lIGluZGV4IGJ1ZmZlci4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X3ZlcnRleF9vZmZzZXQ7CisgICB9IGliOworCisgICAvKiBBY3RpdmUgdmVydGV4IHByb2dyYW06CisgICAgKi8KKyAgIGNvbnN0IHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqdmVydGV4X3Byb2dyYW07CisgICBjb25zdCBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqZ2VvbWV0cnlfcHJvZ3JhbTsKKyAgIGNvbnN0IHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcmFnbWVudF9wcm9ncmFtOworCisgICAvKioKKyAgICAqIFBsYXRmb3JtIHNwZWNpZmljIGNvbnN0YW50cyBjb250YWluaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzCisgICAgKiBmb3IgZWFjaCBwaXBlbGluZSBzdGFnZS4KKyAgICAqLworICAgaW50IG1heF92c190aHJlYWRzOworICAgaW50IG1heF9nc190aHJlYWRzOworICAgaW50IG1heF93bV90aHJlYWRzOworCisgICAvKiBCUldfTkVXX1VSQl9BTExPQ0FUSU9OUzoKKyAgICAqLworICAgc3RydWN0IHsKKyAgICAgIEdMdWludCB2c2l6ZTsJCS8qIHZlcnRleCBzaXplIHBsdXMgaGVhZGVyIGluIHVyYiByZWdpc3RlcnMgKi8KKyAgICAgIEdMdWludCBjc2l6ZTsJCS8qIGNvbnN0YW50IGJ1ZmZlciBzaXplIGluIHVyYiByZWdpc3RlcnMgKi8KKyAgICAgIEdMdWludCBzZnNpemU7CQkvKiBzZXR1cCBkYXRhIHNpemUgaW4gdXJiIHJlZ2lzdGVycyAqLworCisgICAgICBib29sIGNvbnN0cmFpbmVkOworCisgICAgICBHTHVpbnQgbWluX3ZzX2VudHJpZXM7ICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIFZTIGVudHJpZXMgKi8KKyAgICAgIEdMdWludCBtYXhfdnNfZW50cmllczsJLyogTWF4aW11bSBudW1iZXIgb2YgVlMgZW50cmllcyAqLworICAgICAgR0x1aW50IG1heF9nc19lbnRyaWVzOwkvKiBNYXhpbXVtIG51bWJlciBvZiBHUyBlbnRyaWVzICovCisKKyAgICAgIEdMdWludCBucl92c19lbnRyaWVzOworICAgICAgR0x1aW50IG5yX2dzX2VudHJpZXM7CisgICAgICBHTHVpbnQgbnJfY2xpcF9lbnRyaWVzOworICAgICAgR0x1aW50IG5yX3NmX2VudHJpZXM7CisgICAgICBHTHVpbnQgbnJfY3NfZW50cmllczsKKworICAgICAgR0x1aW50IHZzX3N0YXJ0OworICAgICAgR0x1aW50IGdzX3N0YXJ0OworICAgICAgR0x1aW50IGNsaXBfc3RhcnQ7CisgICAgICBHTHVpbnQgc2Zfc3RhcnQ7CisgICAgICBHTHVpbnQgY3Nfc3RhcnQ7CisgICAgICBHTHVpbnQgc2l6ZTsgLyogSGFyZHdhcmUgVVJCIHNpemUsIGluIEtCLiAqLworCisgICAgICAvKiBnZW42OiBUcnVlIGlmIHRoZSBtb3N0IHJlY2VudGx5IHNlbnQgXzNEU1RBVEVfVVJCIG1lc3NhZ2UgYWxsb2NhdGVkCisgICAgICAgKiBVUkIgc3BhY2UgZm9yIHRoZSBHUy4KKyAgICAgICAqLworICAgICAgYm9vbCBnZW42X2dzX3ByZXZpb3VzbHlfYWN0aXZlOworICAgfSB1cmI7CisKKworICAgLyogQlJXX05FV19DVVJCRV9PRkZTRVRTOgorICAgICovCisgICBzdHJ1Y3QgeworICAgICAgR0x1aW50IHdtX3N0YXJ0OyAgLyoqPCBwb3Mgb2YgZmlyc3Qgd20gY29uc3QgaW4gQ1VSQkUgYnVmZmVyICovCisgICAgICBHTHVpbnQgd21fc2l6ZTsgICAvKio8IG51bWJlciBvZiBmbG9hdFs0XSBjb25zdHMsIG11bHRpcGxlIG9mIDE2ICovCisgICAgICBHTHVpbnQgY2xpcF9zdGFydDsKKyAgICAgIEdMdWludCBjbGlwX3NpemU7CisgICAgICBHTHVpbnQgdnNfc3RhcnQ7CisgICAgICBHTHVpbnQgdnNfc2l6ZTsKKyAgICAgIEdMdWludCB0b3RhbF9zaXplOworCisgICAgICBkcm1faW50ZWxfYm8gKmN1cmJlX2JvOworICAgICAgLyoqIE9mZnNldCB3aXRoaW4gY3VyYmVfYm8gb2Ygc3BhY2UgZm9yIGN1cnJlbnQgY3VyYmUgZW50cnkgKi8KKyAgICAgIEdMdWludCBjdXJiZV9vZmZzZXQ7CisgICAgICAvKiogT2Zmc2V0IHdpdGhpbiBjdXJiZV9ibyBvZiBzcGFjZSBmb3IgbmV4dCBjdXJiZSBlbnRyeSAqLworICAgICAgR0x1aW50IGN1cmJlX25leHRfb2Zmc2V0OworCisgICAgICAvKioKKyAgICAgICAqIENvcHkgb2YgdGhlIGxhc3Qgc2V0IG9mIENVUkJFcyB1cGxvYWRlZC4gIEZyZXF1ZW50bHkgd2UnbGwgZW5kIHVwCisgICAgICAgKiBpbiBicndfY3VyYmUuYyB3aXRoIHRoZSBzYW1lIHNldCBvZiBjb25zdGFudCBkYXRhIHRvIGJlIHVwbG9hZGVkLAorICAgICAgICogc28gd2UnZCByYXRoZXIgbm90IHVwbG9hZCBuZXcgY29uc3RhbnRzIGluIHRoYXQgY2FzZSAoaXQgY2FuIGNhdXNlCisgICAgICAgKiBhIHBpcGVsaW5lIGJ1YmJsZSBzaW5jZSBvbmx5IHVwIHRvIDQgY2FuIGJlIHBpcGVsaW5lZCBhdCBhIHRpbWUpLgorICAgICAgICovCisgICAgICBHTGZsb2F0ICpsYXN0X2J1ZjsKKyAgICAgIC8qKgorICAgICAgICogQWxsb2NhdGlvbiBmb3Igd2hlcmUgdG8gY2FsY3VsYXRlIHRoZSBuZXh0IHNldCBvZiBDVVJCRXMuCisgICAgICAgKiBJdCdzIGEgaG90IGVub3VnaCBwYXRoIHRoYXQgbWFsbG9jL2ZyZWUgb2YgdGhhdCBkYXRhIG1hdHRlcnMuCisgICAgICAgKi8KKyAgICAgIEdMZmxvYXQgKm5leHRfYnVmOworICAgICAgR0x1aW50IGxhc3RfYnVmc3o7CisgICB9IGN1cmJlOworCisgICAvKioKKyAgICAqIExheW91dCBvZiB2ZXJ0ZXggZGF0YSBleGl0aW5nIHRoZSB2ZXJ0ZXggc2hhZGVyLgorICAgICoKKyAgICAqIEJSV19ORVdfVlVFX01BUF9WUyBpcyBmbGFnZ2VkIHdoZW4gdGhpcyBWVUUgbWFwIGNoYW5nZXMuCisgICAgKi8KKyAgIHN0cnVjdCBicndfdnVlX21hcCB2dWVfbWFwX3ZzOworCisgICAvKioKKyAgICAqIExheW91dCBvZiB2ZXJ0ZXggZGF0YSBleGl0aW5nIHRoZSBnZW9tZXRyeSBwb3J0aW9uIG9mIHRoZSBwaXBsZWluZS4KKyAgICAqIFRoaXMgY29tZXMgZnJvbSB0aGUgZ2VvbWV0cnkgc2hhZGVyIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBmcm9tIHRoZQorICAgICogdmVydGV4IHNoYWRlci4KKyAgICAqCisgICAgKiBCUldfTkVXX1ZVRV9NQVBfR0VPTV9PVVQgaXMgZmxhZ2dlZCB3aGVuIHRoZSBWVUUgbWFwIGNoYW5nZXMuCisgICAgKi8KKyAgIHN0cnVjdCBicndfdnVlX21hcCB2dWVfbWFwX2dlb21fb3V0OworCisgICBzdHJ1Y3QgeworICAgICAgc3RydWN0IGJyd19zdGFnZV9zdGF0ZSBiYXNlOworICAgICAgc3RydWN0IGJyd192c19wcm9nX2RhdGEgKnByb2dfZGF0YTsKKyAgIH0gdnM7CisKKyAgIHN0cnVjdCB7CisgICAgICBzdHJ1Y3QgYnJ3X3N0YWdlX3N0YXRlIGJhc2U7CisgICAgICBzdHJ1Y3QgYnJ3X2dzX3Byb2dfZGF0YSAqcHJvZ19kYXRhOworCisgICAgICAvKioKKyAgICAgICAqIFRydWUgaWYgdGhlIDNEU1RBVEVfR1MgY29tbWFuZCBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgdG8gdGhlIDNECisgICAgICAgKiBwaXBlbGluZSBlbmFibGVkIHRoZSBHUzsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBib29sIGVuYWJsZWQ7CisgICB9IGdzOworCisgICBzdHJ1Y3QgeworICAgICAgc3RydWN0IGJyd19mZl9nc19wcm9nX2RhdGEgKnByb2dfZGF0YTsKKworICAgICAgYm9vbCBwcm9nX2FjdGl2ZTsKKyAgICAgIC8qKiBPZmZzZXQgaW4gdGhlIHByb2dyYW0gY2FjaGUgdG8gdGhlIENMSVAgcHJvZ3JhbSBwcmUtZ2VuNiAqLworICAgICAgdWludDMyX3QgcHJvZ19vZmZzZXQ7CisgICAgICB1aW50MzJfdCBzdGF0ZV9vZmZzZXQ7CisKKyAgICAgIHVpbnQzMl90IGJpbmRfYm9fb2Zmc2V0OworICAgICAgdWludDMyX3Qgc3VyZl9vZmZzZXRbQlJXX01BWF9HRU42X0dTX1NVUkZBQ0VTXTsKKyAgIH0gZmZfZ3M7CisKKyAgIHN0cnVjdCB7CisgICAgICBzdHJ1Y3QgYnJ3X2NsaXBfcHJvZ19kYXRhICpwcm9nX2RhdGE7CisKKyAgICAgIC8qKiBPZmZzZXQgaW4gdGhlIHByb2dyYW0gY2FjaGUgdG8gdGhlIENMSVAgcHJvZ3JhbSBwcmUtZ2VuNiAqLworICAgICAgdWludDMyX3QgcHJvZ19vZmZzZXQ7CisKKyAgICAgIC8qIE9mZnNldCBpbiB0aGUgYmF0Y2ggdG8gdGhlIENMSVAgc3RhdGUgb24gcHJlLWdlbjYuICovCisgICAgICB1aW50MzJfdCBzdGF0ZV9vZmZzZXQ7CisKKyAgICAgIC8qIEFzIG9mIGdlbjYsIHRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgYmF0Y2ggdG8gdGhlIENMSVAgVlAsCisgICAgICAgKiBpbnN0ZWFkIG9mIHZwX2JvLgorICAgICAgICovCisgICAgICB1aW50MzJfdCB2cF9vZmZzZXQ7CisgICB9IGNsaXA7CisKKworICAgc3RydWN0IHsKKyAgICAgIHN0cnVjdCBicndfc2ZfcHJvZ19kYXRhICpwcm9nX2RhdGE7CisKKyAgICAgIC8qKiBPZmZzZXQgaW4gdGhlIHByb2dyYW0gY2FjaGUgdG8gdGhlIENMSVAgcHJvZ3JhbSBwcmUtZ2VuNiAqLworICAgICAgdWludDMyX3QgcHJvZ19vZmZzZXQ7CisgICAgICB1aW50MzJfdCBzdGF0ZV9vZmZzZXQ7CisgICAgICB1aW50MzJfdCB2cF9vZmZzZXQ7CisgICB9IHNmOworCisgICBzdHJ1Y3QgeworICAgICAgc3RydWN0IGJyd19zdGFnZV9zdGF0ZSBiYXNlOworICAgICAgc3RydWN0IGJyd193bV9wcm9nX2RhdGEgKnByb2dfZGF0YTsKKworICAgICAgR0x1aW50IHJlbmRlcl9zdXJmOworCisgICAgICAvKioKKyAgICAgICAqIEJ1ZmZlciBvYmplY3QgdXNlZCBpbiBwbGFjZSBvZiBtdWx0aXNhbXBsZWQgbnVsbCByZW5kZXIgdGFyZ2V0cyBvbgorICAgICAgICogR2VuNi4gIFNlZSBicndfdXBkYXRlX251bGxfcmVuZGVyYnVmZmVyX3N1cmZhY2UoKS4KKyAgICAgICAqLworICAgICAgZHJtX2ludGVsX2JvICptdWx0aXNhbXBsZWRfbnVsbF9yZW5kZXJfdGFyZ2V0X2JvOworICAgfSB3bTsKKworCisgICBzdHJ1Y3QgeworICAgICAgdWludDMyX3Qgc3RhdGVfb2Zmc2V0OworICAgICAgdWludDMyX3QgYmxlbmRfc3RhdGVfb2Zmc2V0OworICAgICAgdWludDMyX3QgZGVwdGhfc3RlbmNpbF9zdGF0ZV9vZmZzZXQ7CisgICAgICB1aW50MzJfdCB2cF9vZmZzZXQ7CisgICB9IGNjOworCisKKyAgIGludCBudW1fYXRvbXM7CisgICBjb25zdCBzdHJ1Y3QgYnJ3X3RyYWNrZWRfc3RhdGUgKiphdG9tczsKKworICAgc3RydWN0IHsKKyAgICAgIC8vZHJtX2ludGVsX2JvICpibzsgLy8gTHVuYXJHOiBSZW1vdmUKKyAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqKnNoYWRlcl9wcm9ncmFtczsKKyAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICoqcHJvZ3JhbXM7CisgICAgICBlbnVtIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlICp0eXBlczsKKyAgICAgIHVpbnQ2NF90ICpjdW11bGF0aXZlOworICAgICAgaW50IG51bV9lbnRyaWVzOworICAgICAgaW50IG1heF9lbnRyaWVzOworICAgICAgZG91YmxlIHJlcG9ydF90aW1lOworICAgfSBzaGFkZXJfdGltZTsKKworICAgc3RydWN0IGludGVsX3NjcmVlbiAqaW50ZWxTY3JlZW47CisKKyAgIC8vIEx1bmFyRyA6IEFERAorICAgLy8gR2l2ZSB1cyBhIHBsYWNlIHRvIHN0b3JlIG91ciBjb21waWxlIHJlc3VsdHMKKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2c7Cit9OworCisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYnJ3X3Byb2dyYW0uYworICovCit2b2lkIGJyd0luaXRGcmFnUHJvZ0Z1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApOworCitpbnQgYnJ3X2dldF9zY3JhdGNoX3NpemUoaW50IHNpemUpOwordm9pZCBicndfZ2V0X3NjcmF0Y2hfYm8oc3RydWN0IGJyd19jb250ZXh0ICpicncsCisJCQlkcm1faW50ZWxfYm8gKipzY3JhdGNoX2JvLCBpbnQgc2l6ZSk7Cit2b2lkIGJyd19pbml0X3NoYWRlcl90aW1lKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KTsKK2ludCBicndfZ2V0X3NoYWRlcl90aW1lX2luZGV4KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzaGFkZXJfdGltZV9zaGFkZXJfdHlwZSB0eXBlKTsKK3ZvaWQgYnJ3X2NvbGxlY3RfYW5kX3JlcG9ydF9zaGFkZXJfdGltZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyk7Cit2b2lkIGJyd19kZXN0cm95X3NoYWRlcl90aW1lKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KTsKKworLyogYnJ3X3VyYi5jCisgKi8KK3ZvaWQgYnJ3X3VwbG9hZF91cmJfZmVuY2Uoc3RydWN0IGJyd19jb250ZXh0ICpicncpOworCisvKiBicndfY3VyYmUuYworICovCit2b2lkIGJyd191cGxvYWRfY3NfdXJiX3N0YXRlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KTsKKworLyogYnJ3X2ZzX3JlZ19hbGxvY2F0ZS5jcHAKKyAqLwordm9pZCBicndfZnNfYWxsb2NfcmVnX3NldHMoc3RydWN0IGludGVsX3NjcmVlbiAqc2NyZWVuKTsKKworLyogYnJ3X3ZlYzRfcmVnX2FsbG9jYXRlLmNwcCAqLwordm9pZCBicndfdmVjNF9hbGxvY19yZWdfc2V0KHN0cnVjdCBpbnRlbF9zY3JlZW4gKnNjcmVlbik7CisKKy8qIGJyd19kaXNhc20uYyAqLworaW50IGJyd19kaXNhc20gKEZJTEUgKmZpbGUsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc3QsIGludCBnZW4pOworCisvKiBicndfdnMuYyAqLworZ2xfY2xpcF9wbGFuZSAqYnJ3X3NlbGVjdF9jbGlwX3BsYW5lcyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKworLyogaW50ZWxfZXh0ZW5zaW9ucy5jICovCitleHRlcm4gdm9pZCBpbnRlbEluaXRFeHRlbnNpb25zKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5saW5lIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgVGhlc2UgYXJlIGJldHRlci10eXBlZCB0aGFuIHRoZQorICogbWFjcm9zIHVzZWQgcHJldmlvdXNseToKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X2NvbnRleHQgKgorYnJ3X2NvbnRleHQoIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggKQoreworICAgcmV0dXJuIChzdHJ1Y3QgYnJ3X2NvbnRleHQgKiljdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSAqCiticndfdmVydGV4X3Byb2dyYW0oc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwKQoreworICAgcmV0dXJuIChzdHJ1Y3QgYnJ3X3ZlcnRleF9wcm9ncmFtICopIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSAqCiticndfdmVydGV4X3Byb2dyYW1fY29uc3QoY29uc3Qgc3RydWN0IGdsX3ZlcnRleF9wcm9ncmFtICpwKQoreworICAgcmV0dXJuIChjb25zdCBzdHJ1Y3QgYnJ3X3ZlcnRleF9wcm9ncmFtICopIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19nZW9tZXRyeV9wcm9ncmFtICoKK2Jyd19nZW9tZXRyeV9wcm9ncmFtKHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICpwKQoreworICAgcmV0dXJuIChzdHJ1Y3QgYnJ3X2dlb21ldHJ5X3Byb2dyYW0gKikgcDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X2ZyYWdtZW50X3Byb2dyYW0gKgorYnJ3X2ZyYWdtZW50X3Byb2dyYW0oc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKnApCit7CisgICByZXR1cm4gKHN0cnVjdCBicndfZnJhZ21lbnRfcHJvZ3JhbSAqKSBwOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBicndfZnJhZ21lbnRfcHJvZ3JhbSAqCiticndfZnJhZ21lbnRfcHJvZ3JhbV9jb25zdChjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqcCkKK3sKKyAgIHJldHVybiAoY29uc3Qgc3RydWN0IGJyd19mcmFnbWVudF9wcm9ncmFtICopIHA7Cit9CisKKy8qKgorICogUHJlLWdlbjYsIHRoZSByZWdpc3RlciBmaWxlIG9mIHRoZSBFVXMgd2FzIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMsCisgKiBhbmQgZWFjaCB0aHJlYWQgdXNlZCBzb21lIHN1YnNldCBhbGxvY2F0ZWQgb24gYSAxNi1yZWdpc3RlciBibG9jaworICogZ3JhbnVsYXJpdHkuICBUaGUgdW5pdCBzdGF0ZXMgd2FudGVkIHRoZXNlIGJsb2NrIGNvdW50cy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2Jyd19yZWdpc3Rlcl9ibG9ja3MoaW50IHJlZ19jb3VudCkKK3sKKyAgIHJldHVybiBBTElHTihyZWdfY291bnQsIDE2KSAvIDE2IC0gMTsKK30KKworCitib29sIGJyd19kb19jdWJlbWFwX25vcm1hbGl6ZShzdHJ1Y3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBicndfbG93ZXJfdGV4dHVyZV9ncmFkaWVudHMoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworYm9vbCBicndfZG9fbG93ZXJfdW5ub3JtYWxpemVkX29mZnNldChzdHJ1Y3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCitzdHJ1Y3Qgb3Bjb2RlX2Rlc2MgeworICAgIGNoYXIgICAgKm5hbWU7CisgICAgaW50CSAgICBuc3JjOworICAgIGludAkgICAgbmRzdDsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb3Bjb2RlX2Rlc2Mgb3Bjb2RlX2Rlc2NzWzEyOF07CitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IGNvbmRpdGlvbmFsX21vZGlmaWVyWzE2XTsKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcm9tIGxpbnV4IGtlcm5lbCBpMzg2IGhlYWRlciBmaWxlcywgY29wZXMgd2l0aCBvZGQgc2l6ZXMgYmV0dGVyCisgKiB0aGFuIENPUFlfRFdPUkRTIHdvdWxkOgorICogWFhYIFB1dCB0aGlzIGluIHNyYy9tZXNhL21haW4vaW1wb3J0cy5oID8/PworICovCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIGlubGluZSB2b2lkICogX19tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCit7CisgICBpbnQgZDAsIGQxLCBkMjsKKyAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorICAgICAgInJlcCA7IG1vdnNsXG5cdCIKKyAgICAgICJ0ZXN0YiAkMiwlYjRcblx0IgorICAgICAgImplIDFmXG5cdCIKKyAgICAgICJtb3Zzd1xuIgorICAgICAgIjE6XHR0ZXN0YiAkMSwlYjRcblx0IgorICAgICAgImplIDJmXG5cdCIKKyAgICAgICJtb3ZzYlxuIgorICAgICAgIjI6IgorICAgICAgOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZTIiAoZDIpCisgICAgICA6IjAiIChuLzQpLCAicSIgKG4pLCIxIiAoKGxvbmcpIHRvKSwiMiIgKChsb25nKSBmcm9tKQorICAgICAgOiAibWVtb3J5Iik7CisgICByZXR1cm4gKHRvKTsKK30KKyNlbHNlCisjZGVmaW5lIF9fbWVtY3B5KGEsYixjKSBtZW1jcHkoYSxiLGMpCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2N1YmVtYXBfbm9ybWFsaXplLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfY3ViZW1hcF9ub3JtYWxpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTcxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2N1YmVtYXBfbm9ybWFsaXplLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgYnJ3X2N1YmVtYXBfbm9ybWFsaXplLmNwcAorICoKKyAqIElSIGxvd2VyIHBhc3MgdG8gcGVyZm9ybSB0aGUgbm9ybWFsaXphdGlvbiBvZiB0aGUgY3ViZW1hcCBjb29yZGluYXRlcyB0bworICogaGF2ZSB0aGUgbGFyZ2VzdCBtYWduaXR1ZGUgY29tcG9uZW50IGJlIC0xLjAgb3IgMS4wLgorICoKKyAqIFxhdXRob3IgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqLworCisjaW5jbHVkZSAiZ2xzbC9nbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAiZ2xzbC9pci5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5oIiAvKiBGb3IgV1JJVEVNQVNLXyogKi8KKworY2xhc3MgYnJ3X2N1YmVtYXBfbm9ybWFsaXplX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgYnJ3X2N1YmVtYXBfbm9ybWFsaXplX3Zpc2l0b3IoKQorICAgeworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfdGV4dHVyZSAqaXIpOworCisgICBib29sIHByb2dyZXNzOworfTsKKworaXJfdmlzaXRvcl9zdGF0dXMKK2Jyd19jdWJlbWFwX25vcm1hbGl6ZV92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl90ZXh0dXJlICppcikKK3sKKyAgIGlmIChpci0+c2FtcGxlci0+dHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSAhPSBHTFNMX1NBTVBMRVJfRElNX0NVQkUpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGlmICghaXItPmNvb3JkaW5hdGUpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KGlyKTsKKworICAgaXJfdmFyaWFibGUgKnZhciA9IG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShpci0+Y29vcmRpbmF0ZS0+dHlwZSwKKwkJCQkJICAgICAgICJjb29yZGluYXRlIiwgaXJfdmFyX2F1dG8pOworICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZSh2YXIpOworICAgaXJfZGVyZWZlcmVuY2UgKmRlcmVmID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICBpcl9hc3NpZ25tZW50ICphc3NpZ24gPSBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChkZXJlZiwgaXItPmNvb3JkaW5hdGUsCisJCQkJCQkgICAgICBOVUxMKTsKKyAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKKworICAgZGVyZWYgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKyAgIGlyX3J2YWx1ZSAqc3dpejAgPSBuZXcobWVtX2N0eCkgaXJfc3dpenpsZShkZXJlZiwgMCwgMCwgMCwgMCwgMSk7CisgICBkZXJlZiA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgaXJfcnZhbHVlICpzd2l6MSA9IG5ldyhtZW1fY3R4KSBpcl9zd2l6emxlKGRlcmVmLCAxLCAwLCAwLCAwLCAxKTsKKyAgIGRlcmVmID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICBpcl9ydmFsdWUgKnN3aXoyID0gbmV3KG1lbV9jdHgpIGlyX3N3aXp6bGUoZGVyZWYsIDIsIDAsIDAsIDAsIDEpOworCisgICBzd2l6MCA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfYWJzLCBzd2l6MC0+dHlwZSwgc3dpejAsIE5VTEwpOworICAgc3dpejEgPSBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2Ficywgc3dpejEtPnR5cGUsIHN3aXoxLCBOVUxMKTsKKyAgIHN3aXoyID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9hYnMsIHN3aXoyLT50eXBlLCBzd2l6MiwgTlVMTCk7CisKKyAgIGlyX2V4cHJlc3Npb24gKmV4cHI7CisgICBleHByID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbWF4LAorCQkJCSAgICAgZ2xzbF90eXBlOjpmbG9hdF90eXBlLAorCQkJCSAgICAgc3dpejAsIHN3aXoxKTsKKworICAgZXhwciA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX21heCwKKwkJCQkgICAgIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwKKwkJCQkgICAgIGV4cHIsIHN3aXoyKTsKKworICAgZXhwciA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfcmNwLAorCQkJCSAgICAgZ2xzbF90eXBlOjpmbG9hdF90eXBlLAorCQkJCSAgICAgZXhwciwgTlVMTCk7CisKKyAgIC8qIGNvb3JkaW5hdGUueHl6ICo9IGV4cHIgKi8KKyAgIGFzc2lnbiA9IG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KAorICAgICAgbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhciksCisgICAgICBuZXcobWVtX2N0eCkgaXJfc3dpenpsZSgKKyAgICAgICAgIG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX211bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyLT5jb29yZGluYXRlLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByKSwKKyAgICAgICAgIDAsIDEsIDIsIDAsIDMpKTsKKyAgIGFzc2lnbi0+d3JpdGVfbWFzayA9IFdSSVRFTUFTS19YWVo7CisgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGFzc2lnbik7CisgICBpci0+Y29vcmRpbmF0ZSA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworCisgICBwcm9ncmVzcyA9IHRydWU7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2V4dGVybiAiQyIgeworCitib29sCiticndfZG9fY3ViZW1hcF9ub3JtYWxpemUoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBicndfY3ViZW1hcF9ub3JtYWxpemVfdmlzaXRvciB2OworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KKworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZWFkX2NvbnRyb2xfZmxvdy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2RlYWRfY29udHJvbF9mbG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2EzZTViCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZWFkX2NvbnRyb2xfZmxvdy5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKiBAZmlsZSBicndfZGVhZF9jb250cm9sX2Zsb3cuY3BwCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGRlYWQgY29udHJvbCBmbG93IGVsaW1pbmF0aW9uIG9wdGltaXphdGlvbiBwYXNzLgorICovCisKKyNpbmNsdWRlICJicndfc2hhZGVyLmgiCisjaW5jbHVkZSAiYnJ3X2NmZy5oIgorCisvKiBMb29rIGZvciBhbmQgZWxpbWluYXRlIGRlYWQgY29udHJvbCBmbG93OgorICoKKyAqICAgLSBpZi9lbmRpZgorICogICAtIGlmL2Vsc2UvZW5kaWYKKyAqLworYm9vbAorZGVhZF9jb250cm9sX2Zsb3dfZWxpbWluYXRlKGJhY2tlbmRfdmlzaXRvciAqdikKK3sKKyAgIGJvb2wgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgY2ZnX3QgY2ZnKCZ2LT5pbnN0cnVjdGlvbnMpOworCisgICBmb3IgKGludCBiID0gMDsgYiA8IGNmZy5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgIGJibG9ja190ICpibG9jayA9IGNmZy5ibG9ja3NbYl07CisgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICAgIC8qIEVORElGIGluc3RydWN0aW9ucywgYnkgZGVmaW5pdGlvbiwgY2FuIG9ubHkgYmUgZm91bmQgYXQgdGhlIHN0YXJ0IG9mCisgICAgICAgKiBiYXNpYyBibG9ja3MuCisgICAgICAgKi8KKyAgICAgIGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmVuZGlmX2luc3QgPSBibG9jay0+c3RhcnQ7CisgICAgICBpZiAoZW5kaWZfaW5zdC0+b3Bjb2RlICE9IEJSV19PUENPREVfRU5ESUYpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgYmFja2VuZF9pbnN0cnVjdGlvbiAqaWZfaW5zdCA9IE5VTEwsICplbHNlX2luc3QgPSBOVUxMOworICAgICAgYmFja2VuZF9pbnN0cnVjdGlvbiAqcHJldl9pbnN0ID0gKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKikgZW5kaWZfaW5zdC0+cHJldjsKKyAgICAgIGlmIChwcmV2X2luc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX0lGKSB7CisgICAgICAgICBpZl9pbnN0ID0gcHJldl9pbnN0OworICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChwcmV2X2luc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UpIHsKKyAgICAgICAgIGVsc2VfaW5zdCA9IHByZXZfaW5zdDsKKworICAgICAgICAgcHJldl9pbnN0ID0gKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKikgcHJldl9pbnN0LT5wcmV2OworICAgICAgICAgaWYgKHByZXZfaW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfSUYpIHsKKyAgICAgICAgICAgIGlmX2luc3QgPSBwcmV2X2luc3Q7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgaWZfaW5zdC0+cmVtb3ZlKCk7CisgICAgICAgICBpZiAoZWxzZV9pbnN0KQorICAgICAgICAgICAgZWxzZV9pbnN0LT5yZW1vdmUoKTsKKyAgICAgICAgIGVuZGlmX2luc3QtPnJlbW92ZSgpOworICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgfQorICAgfQorCisgICBpZiAocHJvZ3Jlc3MpCisgICAgICB2LT5pbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZGVhZF9jb250cm9sX2Zsb3cuaCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZGVhZF9jb250cm9sX2Zsb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E0ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZWFkX2NvbnRyb2xfZmxvdy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYnJ3X3NoYWRlci5oIgorCitib29sIGRlYWRfY29udHJvbF9mbG93X2VsaW1pbmF0ZShiYWNrZW5kX3Zpc2l0b3IgKnYpOwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZWZpbmVzLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzRmODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZWZpbmVzLmgKQEAgLTAsMCArMSwyMjIzIEBACisvKgorIENvcHlyaWdodCAoQykgSW50ZWwgQ29ycC4gIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIEludGVsIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0bworIGRldmVsb3AgdGhpcyAzRCBkcml2ZXIuCisKKyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoKKyAgKiBBdXRob3JzOgorICAqICAgS2VpdGggV2hpdHdlbGwgPGtlaXRod0B2bXdhcmUuY29tPgorICAqLworCisjZGVmaW5lIElOVEVMX01BU0soaGlnaCwgbG93KSAoKCgxPDwoKGhpZ2gpLShsb3cpKzEpKS0xKTw8KGxvdykpCisvKiBVc2luZyB0aGUgR05VIHN0YXRlbWVudCBleHByZXNzaW9uIGV4dGVuc2lvbiAqLworI2RlZmluZSBTRVRfRklFTEQodmFsdWUsIGZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdWludDMyX3QgZmllbGR2YWwgPSAodmFsdWUpIDw8IGZpZWxkICMjIF9TSElGVDsgICAgICAgICAgICAgICAgICAgXAorICAgICAgYXNzZXJ0KChmaWVsZHZhbCAmIH4gZmllbGQgIyMgX01BU0spID09IDApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZmllbGR2YWwgJiBmaWVsZCAjIyBfTUFTSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSkKKworI2RlZmluZSBHRVRfRklFTEQod29yZCwgZmllbGQpICgoKHdvcmQpICAmIGZpZWxkICMjIF9NQVNLKSA+PiBmaWVsZCAjIyBfU0hJRlQpCisKKyNpZm5kZWYgQlJXX0RFRklORVNfSAorI2RlZmluZSBCUldfREVGSU5FU19ICisKKy8qIDNEIHN0YXRlOgorICovCisjZGVmaW5lIENNRF8zRF9QUklNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YjAwIC8qIDNEUFJJTUlUSVZFICovCisvKiBEVzAgKi8KKyMgZGVmaW5lIEdFTjRfM0RQUklNX1RPUE9MT0dZX1RZUEVfU0hJRlQgICAgICAgICAgICAxMAorIyBkZWZpbmUgR0VONF8zRFBSSU1fVkVSVEVYQlVGRkVSX0FDQ0VTU19TRVFVRU5USUFMICgwIDw8IDE1KQorIyBkZWZpbmUgR0VONF8zRFBSSU1fVkVSVEVYQlVGRkVSX0FDQ0VTU19SQU5ET00gICAgICgxIDw8IDE1KQorIyBkZWZpbmUgR0VON18zRFBSSU1fSU5ESVJFQ1RfUEFSQU1FVEVSX0VOQUJMRSAgICAgICgxIDw8IDEwKQorLyogRFcxICovCisjIGRlZmluZSBHRU43XzNEUFJJTV9WRVJURVhCVUZGRVJfQUNDRVNTX1NFUVVFTlRJQUwgKDAgPDwgOCkKKyMgZGVmaW5lIEdFTjdfM0RQUklNX1ZFUlRFWEJVRkZFUl9BQ0NFU1NfUkFORE9NICAgICAoMSA8PCA4KQorCisjZGVmaW5lIF8zRFBSSU1fUE9JTlRMSVNUICAgICAgICAgMHgwMQorI2RlZmluZSBfM0RQUklNX0xJTkVMSVNUICAgICAgICAgIDB4MDIKKyNkZWZpbmUgXzNEUFJJTV9MSU5FU1RSSVAgICAgICAgICAweDAzCisjZGVmaW5lIF8zRFBSSU1fVFJJTElTVCAgICAgICAgICAgMHgwNAorI2RlZmluZSBfM0RQUklNX1RSSVNUUklQICAgICAgICAgIDB4MDUKKyNkZWZpbmUgXzNEUFJJTV9UUklGQU4gICAgICAgICAgICAweDA2CisjZGVmaW5lIF8zRFBSSU1fUVVBRExJU1QgICAgICAgICAgMHgwNworI2RlZmluZSBfM0RQUklNX1FVQURTVFJJUCAgICAgICAgIDB4MDgKKyNkZWZpbmUgXzNEUFJJTV9MSU5FTElTVF9BREogICAgICAweDA5CisjZGVmaW5lIF8zRFBSSU1fTElORVNUUklQX0FESiAgICAgMHgwQQorI2RlZmluZSBfM0RQUklNX1RSSUxJU1RfQURKICAgICAgIDB4MEIKKyNkZWZpbmUgXzNEUFJJTV9UUklTVFJJUF9BREogICAgICAweDBDCisjZGVmaW5lIF8zRFBSSU1fVFJJU1RSSVBfUkVWRVJTRSAgMHgwRAorI2RlZmluZSBfM0RQUklNX1BPTFlHT04gICAgICAgICAgIDB4MEUKKyNkZWZpbmUgXzNEUFJJTV9SRUNUTElTVCAgICAgICAgICAweDBGCisjZGVmaW5lIF8zRFBSSU1fTElORUxPT1AgICAgICAgICAgMHgxMAorI2RlZmluZSBfM0RQUklNX1BPSU5UTElTVF9CRiAgICAgIDB4MTEKKyNkZWZpbmUgXzNEUFJJTV9MSU5FU1RSSVBfQ09OVCAgICAweDEyCisjZGVmaW5lIF8zRFBSSU1fTElORVNUUklQX0JGICAgICAgMHgxMworI2RlZmluZSBfM0RQUklNX0xJTkVTVFJJUF9DT05UX0JGIDB4MTQKKyNkZWZpbmUgXzNEUFJJTV9UUklGQU5fTk9TVElQUExFICAweDE1CisKKyNkZWZpbmUgQlJXX0FOSVNPUkFUSU9fMiAgICAgMAorI2RlZmluZSBCUldfQU5JU09SQVRJT180ICAgICAxCisjZGVmaW5lIEJSV19BTklTT1JBVElPXzYgICAgIDIKKyNkZWZpbmUgQlJXX0FOSVNPUkFUSU9fOCAgICAgMworI2RlZmluZSBCUldfQU5JU09SQVRJT18xMCAgICA0CisjZGVmaW5lIEJSV19BTklTT1JBVElPXzEyICAgIDUKKyNkZWZpbmUgQlJXX0FOSVNPUkFUSU9fMTQgICAgNgorI2RlZmluZSBCUldfQU5JU09SQVRJT18xNiAgICA3CisKKyNkZWZpbmUgQlJXX0JMRU5ERkFDVE9SX09ORSAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIEJSV19CTEVOREZBQ1RPUl9TUkNfQ09MT1IgICAgICAgICAgIDB4MgorI2RlZmluZSBCUldfQkxFTkRGQUNUT1JfU1JDX0FMUEhBICAgICAgICAgICAweDMKKyNkZWZpbmUgQlJXX0JMRU5ERkFDVE9SX0RTVF9BTFBIQSAgICAgICAgICAgMHg0CisjZGVmaW5lIEJSV19CTEVOREZBQ1RPUl9EU1RfQ09MT1IgICAgICAgICAgIDB4NQorI2RlZmluZSBCUldfQkxFTkRGQUNUT1JfU1JDX0FMUEhBX1NBVFVSQVRFICAweDYKKyNkZWZpbmUgQlJXX0JMRU5ERkFDVE9SX0NPTlNUX0NPTE9SICAgICAgICAgMHg3CisjZGVmaW5lIEJSV19CTEVOREZBQ1RPUl9DT05TVF9BTFBIQSAgICAgICAgIDB4OAorI2RlZmluZSBCUldfQkxFTkRGQUNUT1JfU1JDMV9DT0xPUiAgICAgICAgICAweDkKKyNkZWZpbmUgQlJXX0JMRU5ERkFDVE9SX1NSQzFfQUxQSEEgICAgICAgICAgMHgwQQorI2RlZmluZSBCUldfQkxFTkRGQUNUT1JfWkVSTyAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEJSV19CTEVOREZBQ1RPUl9JTlZfU1JDX0NPTE9SICAgICAgIDB4MTIKKyNkZWZpbmUgQlJXX0JMRU5ERkFDVE9SX0lOVl9TUkNfQUxQSEEgICAgICAgMHgxMworI2RlZmluZSBCUldfQkxFTkRGQUNUT1JfSU5WX0RTVF9BTFBIQSAgICAgICAweDE0CisjZGVmaW5lIEJSV19CTEVOREZBQ1RPUl9JTlZfRFNUX0NPTE9SICAgICAgIDB4MTUKKyNkZWZpbmUgQlJXX0JMRU5ERkFDVE9SX0lOVl9DT05TVF9DT0xPUiAgICAgMHgxNworI2RlZmluZSBCUldfQkxFTkRGQUNUT1JfSU5WX0NPTlNUX0FMUEhBICAgICAweDE4CisjZGVmaW5lIEJSV19CTEVOREZBQ1RPUl9JTlZfU1JDMV9DT0xPUiAgICAgIDB4MTkKKyNkZWZpbmUgQlJXX0JMRU5ERkFDVE9SX0lOVl9TUkMxX0FMUEhBICAgICAgMHgxQQorCisjZGVmaW5lIEJSV19CTEVOREZVTkNUSU9OX0FERCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlJXX0JMRU5ERlVOQ1RJT05fU1VCVFJBQ1QgICAgICAgICAgMQorI2RlZmluZSBCUldfQkxFTkRGVU5DVElPTl9SRVZFUlNFX1NVQlRSQUNUICAyCisjZGVmaW5lIEJSV19CTEVOREZVTkNUSU9OX01JTiAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlJXX0JMRU5ERlVOQ1RJT05fTUFYICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEJSV19BTFBIQVRFU1RfRk9STUFUX1VOT1JNOCAgICAgICAgIDAKKyNkZWZpbmUgQlJXX0FMUEhBVEVTVF9GT1JNQVRfRkxPQVQzMiAgICAgICAgMQorCisjZGVmaW5lIEJSV19DSFJPTUFLRVlfS0lMTF9PTl9BTllfTUFUQ0ggIDAKKyNkZWZpbmUgQlJXX0NIUk9NQUtFWV9SRVBMQUNFX0JMQUNLICAgICAgMQorCisjZGVmaW5lIEJSV19DTElQX0FQSV9PR0wgICAgIDAKKyNkZWZpbmUgQlJXX0NMSVBfQVBJX0RYICAgICAgMQorCisjZGVmaW5lIEJSV19DTElQTU9ERV9OT1JNQUwgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlJXX0NMSVBNT0RFX0NMSVBfQUxMICAgICAgICAgICAgMQorI2RlZmluZSBCUldfQ0xJUE1PREVfQ0xJUF9OT05fUkVKRUNURUQgICAyCisjZGVmaW5lIEJSV19DTElQTU9ERV9SRUpFQ1RfQUxMICAgICAgICAgIDMKKyNkZWZpbmUgQlJXX0NMSVBNT0RFX0FDQ0VQVF9BTEwgICAgICAgICAgNAorI2RlZmluZSBCUldfQ0xJUE1PREVfS0VSTkVMX0NMSVAgICAgICAgICA1CisKKyNkZWZpbmUgQlJXX0NMSVBfTkRDU1BBQ0UgICAgIDAKKyNkZWZpbmUgQlJXX0NMSVBfU0NSRUVOU1BBQ0UgIDEKKworI2RlZmluZSBCUldfQ09NUEFSRUZVTkNUSU9OX0FMV0FZUyAgICAgICAwCisjZGVmaW5lIEJSV19DT01QQVJFRlVOQ1RJT05fTkVWRVIgICAgICAgIDEKKyNkZWZpbmUgQlJXX0NPTVBBUkVGVU5DVElPTl9MRVNTICAgICAgICAgMgorI2RlZmluZSBCUldfQ09NUEFSRUZVTkNUSU9OX0VRVUFMICAgICAgICAzCisjZGVmaW5lIEJSV19DT01QQVJFRlVOQ1RJT05fTEVRVUFMICAgICAgIDQKKyNkZWZpbmUgQlJXX0NPTVBBUkVGVU5DVElPTl9HUkVBVEVSICAgICAgNQorI2RlZmluZSBCUldfQ09NUEFSRUZVTkNUSU9OX05PVEVRVUFMICAgICA2CisjZGVmaW5lIEJSV19DT01QQVJFRlVOQ1RJT05fR0VRVUFMICAgICAgIDcKKworI2RlZmluZSBCUldfQ09WRVJBR0VfUElYRUxTX0hBTEYgICAgIDAKKyNkZWZpbmUgQlJXX0NPVkVSQUdFX1BJWEVMU18xICAgICAgICAxCisjZGVmaW5lIEJSV19DT1ZFUkFHRV9QSVhFTFNfMiAgICAgICAgMgorI2RlZmluZSBCUldfQ09WRVJBR0VfUElYRUxTXzQgICAgICAgIDMKKworI2RlZmluZSBCUldfQ1VMTE1PREVfQk9USCAgICAgICAgMAorI2RlZmluZSBCUldfQ1VMTE1PREVfTk9ORSAgICAgICAgMQorI2RlZmluZSBCUldfQ1VMTE1PREVfRlJPTlQgICAgICAgMgorI2RlZmluZSBCUldfQ1VMTE1PREVfQkFDSyAgICAgICAgMworCisjZGVmaW5lIEJSV19ERUZBVUxUQ09MT1JfUjhHOEI4QThfVU5PUk0gICAgICAwCisjZGVmaW5lIEJSV19ERUZBVUxUQ09MT1JfUjMyRzMyQjMyQTMyX0ZMT0FUICAxCisKKyNkZWZpbmUgQlJXX0RFUFRIRk9STUFUX0QzMl9GTE9BVF9TOFgyNF9VSU5UICAgICAwCisjZGVmaW5lIEJSV19ERVBUSEZPUk1BVF9EMzJfRkxPQVQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCUldfREVQVEhGT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQgICAgICAgIDIKKyNkZWZpbmUgQlJXX0RFUFRIRk9STUFUX0QyNF9VTk9STV9YOF9VSU5UICAgICAgICAzIC8qIEdFTjUgKi8KKyNkZWZpbmUgQlJXX0RFUFRIRk9STUFUX0QxNl9VTk9STSAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQlJXX0ZMT0FUSU5HX1BPSU5UX0lFRUVfNzU0ICAgICAgICAwCisjZGVmaW5lIEJSV19GTE9BVElOR19QT0lOVF9OT05fSUVFRV83NTQgICAgMQorCisjZGVmaW5lIEJSV19GUk9OVFdJTkRJTkdfQ1cgICAgICAwCisjZGVmaW5lIEJSV19GUk9OVFdJTkRJTkdfQ0NXICAgICAxCisKKyNkZWZpbmUgQlJXX1NQUklURV9QT0lOVF9FTkFCTEUgIDE2CisKKyNkZWZpbmUgQlJXX0NVVF9JTkRFWF9FTkFCTEUgICAgICgxIDw8IDEwKQorCisjZGVmaW5lIEJSV19JTkRFWF9CWVRFICAgICAwCisjZGVmaW5lIEJSV19JTkRFWF9XT1JEICAgICAxCisjZGVmaW5lIEJSV19JTkRFWF9EV09SRCAgICAyCisKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9DTEVBUiAgICAgICAgICAgIDAKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9OT1IgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9BTkRfSU5WRVJURUQgICAgIDIKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9DT1BZX0lOVkVSVEVEICAgIDMKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9BTkRfUkVWRVJTRSAgICAgIDQKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9JTlZFUlQgICAgICAgICAgIDUKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9YT1IgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9OQU5EICAgICAgICAgICAgIDcKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9BTkQgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9FUVVJViAgICAgICAgICAgIDkKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9OT09QICAgICAgICAgICAgIDEwCisjZGVmaW5lIEJSV19MT0dJQ09QRlVOQ1RJT05fT1JfSU5WRVJURUQgICAgICAxMQorI2RlZmluZSBCUldfTE9HSUNPUEZVTkNUSU9OX0NPUFkgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQlJXX0xPR0lDT1BGVU5DVElPTl9PUl9SRVZFUlNFICAgICAgIDEzCisjZGVmaW5lIEJSV19MT0dJQ09QRlVOQ1RJT05fT1IgICAgICAgICAgICAgICAxNAorI2RlZmluZSBCUldfTE9HSUNPUEZVTkNUSU9OX1NFVCAgICAgICAgICAgICAgMTUKKworI2RlZmluZSBCUldfTUFQRklMVEVSX05FQVJFU1QgICAgICAgIDB4MAorI2RlZmluZSBCUldfTUFQRklMVEVSX0xJTkVBUiAgICAgICAgIDB4MQorI2RlZmluZSBCUldfTUFQRklMVEVSX0FOSVNPVFJPUElDICAgIDB4MgorCisjZGVmaW5lIEJSV19NSVBGSUxURVJfTk9ORSAgICAgICAgMAorI2RlZmluZSBCUldfTUlQRklMVEVSX05FQVJFU1QgICAgIDEKKyNkZWZpbmUgQlJXX01JUEZJTFRFUl9MSU5FQVIgICAgICAzCisKKyNkZWZpbmUgQlJXX0FERFJFU1NfUk9VTkRJTkdfRU5BQkxFX1VfTUFHCTB4MjAKKyNkZWZpbmUgQlJXX0FERFJFU1NfUk9VTkRJTkdfRU5BQkxFX1VfTUlOCTB4MTAKKyNkZWZpbmUgQlJXX0FERFJFU1NfUk9VTkRJTkdfRU5BQkxFX1ZfTUFHCTB4MDgKKyNkZWZpbmUgQlJXX0FERFJFU1NfUk9VTkRJTkdfRU5BQkxFX1ZfTUlOCTB4MDQKKyNkZWZpbmUgQlJXX0FERFJFU1NfUk9VTkRJTkdfRU5BQkxFX1JfTUFHCTB4MDIKKyNkZWZpbmUgQlJXX0FERFJFU1NfUk9VTkRJTkdfRU5BQkxFX1JfTUlOCTB4MDEKKworI2RlZmluZSBCUldfUE9MWUdPTl9GUk9OVF9GQUNJTkcgICAgIDAKKyNkZWZpbmUgQlJXX1BPTFlHT05fQkFDS19GQUNJTkcgICAgICAxCisKKyNkZWZpbmUgQlJXX1BSRUZJTFRFUl9BTFdBWVMgICAgIDB4MAorI2RlZmluZSBCUldfUFJFRklMVEVSX05FVkVSICAgICAgMHgxCisjZGVmaW5lIEJSV19QUkVGSUxURVJfTEVTUyAgICAgICAweDIKKyNkZWZpbmUgQlJXX1BSRUZJTFRFUl9FUVVBTCAgICAgIDB4MworI2RlZmluZSBCUldfUFJFRklMVEVSX0xFUVVBTCAgICAgMHg0CisjZGVmaW5lIEJSV19QUkVGSUxURVJfR1JFQVRFUiAgICAweDUKKyNkZWZpbmUgQlJXX1BSRUZJTFRFUl9OT1RFUVVBTCAgIDB4NgorI2RlZmluZSBCUldfUFJFRklMVEVSX0dFUVVBTCAgICAgMHg3CisKKyNkZWZpbmUgQlJXX1BST1ZPS0lOR19WRVJURVhfMCAgICAwCisjZGVmaW5lIEJSV19QUk9WT0tJTkdfVkVSVEVYXzEgICAgMQorI2RlZmluZSBCUldfUFJPVk9LSU5HX1ZFUlRFWF8yICAgIDIKKworI2RlZmluZSBCUldfUkFTVFJVTEVfVVBQRVJfTEVGVCAgMAorI2RlZmluZSBCUldfUkFTVFJVTEVfVVBQRVJfUklHSFQgMQorLyogVGhlc2UgYXJlIGxpc3RlZCBhcyAiUmVzZXJ2ZWQsIGJ1dCBub3Qgc2VlbiBhcyB1c2VmdWwiCisgKiBpbiBJbnRlbCBkb2N1bWVudGF0aW9uIChwYWdlIDIxMiwgIlBvaW50IFJhc3Rlcml6YXRpb24gUnVsZSIsCisgKiBzZWN0aW9uIDcuNCAiU0YgUGlwZWxpbmUgU3RhdGUgU3VtbWFyeSIsIG9mIGRvY3VtZW50CisgKiAiSW50ZWzCriA5NjUgRXhwcmVzcyBDaGlwc2V0IEZhbWlseSBhbmQgSW50ZWzCriBHMzUgRXhwcmVzcworICogQ2hpcHNldCBHcmFwaGljcyBDb250cm9sbGVyIFByb2dyYW1tZXIncyBSZWZlcmVuY2UgTWFudWFsLAorICogVm9sdW1lIDI6IDNEL01lZGlhIiwgUmV2aXNpb24gMS4wYiBhcyBvZiBKYW51YXJ5IDIwMDgsCisgKiBhdmFpbGFibGUgYXQKKyAqICAgICBodHRwOi8vaW50ZWxsaW51eGdyYXBoaWNzLm9yZy9kb2N1bWVudGF0aW9uLmh0bWwKKyAqIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZykuCisgKgorICogVGhlc2UgYXBwZWFyIHRvIGJlIHN1cHBvcnRlZCBvbiBhdCBsZWFzdCBzb21lCisgKiBpOTY1LWZhbWlseSBkZXZpY2VzLCBhbmQgdGhlIEJSV19SQVNUUlVMRV9MT1dFUl9SSUdIVAorICogaXMgdXNlZnVsIHdoZW4gdXNpbmcgT3BlbkdMIHRvIHJlbmRlciB0byBhIEZCTworICogKHdoaWNoIGhhcyB0aGUgcGl4ZWwgY29vcmRpbmF0ZSBZIG9yaWVudGF0aW9uIGludmVydGVkCisgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIG5vcm1hbCBPcGVuR0wgcGl4ZWwgY29vcmRpbmF0ZSBzeXN0ZW0pLgorICovCisjZGVmaW5lIEJSV19SQVNUUlVMRV9MT1dFUl9MRUZUICAyCisjZGVmaW5lIEJSV19SQVNUUlVMRV9MT1dFUl9SSUdIVCAzCisKKyNkZWZpbmUgQlJXX1JFTkRFUlRBUkdFVF9DTEFNUFJBTkdFX1VOT1JNICAgIDAKKyNkZWZpbmUgQlJXX1JFTkRFUlRBUkdFVF9DTEFNUFJBTkdFX1NOT1JNICAgIDEKKyNkZWZpbmUgQlJXX1JFTkRFUlRBUkdFVF9DTEFNUFJBTkdFX0ZPUk1BVCAgIDIKKworI2RlZmluZSBCUldfU1RFTkNJTE9QX0tFRVAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJSV19TVEVOQ0lMT1BfWkVSTyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlJXX1NURU5DSUxPUF9SRVBMQUNFICAgICAgICAgICAgMgorI2RlZmluZSBCUldfU1RFTkNJTE9QX0lOQ1JTQVQgICAgICAgICAgICAzCisjZGVmaW5lIEJSV19TVEVOQ0lMT1BfREVDUlNBVCAgICAgICAgICAgIDQKKyNkZWZpbmUgQlJXX1NURU5DSUxPUF9JTkNSICAgICAgICAgICAgICAgNQorI2RlZmluZSBCUldfU1RFTkNJTE9QX0RFQ1IgICAgICAgICAgICAgICA2CisjZGVmaW5lIEJSV19TVEVOQ0lMT1BfSU5WRVJUICAgICAgICAgICAgIDcKKworLyogU3VyZmFjZSBzdGF0ZSBEVzAgKi8KKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0lTX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1ZBTElHTl80ICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1ZBTElHTl84ICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCAxNikKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1ZBTElHTl8xNiAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAxNikKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0hBTElHTl80ICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0hBTElHTl84ICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCAxNCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0hBTElHTl8xNiAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAxNCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1RJTElOR19OT05FICAgICAgICAgICAgICAgICAgICAoMCA8PCAxMikKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1RJTElOR19XICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1RJTElOR19YICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCAxMikKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1RJTElOR19ZICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAxMikKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfUkNfUkVBRF9XUklURQkoMSA8PCA4KQorI2RlZmluZSBCUldfU1VSRkFDRV9NSVBMQVlPVVRfU0hJRlQJMTAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfTUlQTUFQTEFZT1VUX0JFTE9XICAgMAorI2RlZmluZSBCUldfU1VSRkFDRV9NSVBNQVBMQVlPVVRfUklHSFQgICAxCisjZGVmaW5lIEJSV19TVVJGQUNFX0NVQkVGQUNFX0VOQUJMRVMJMHgzZgorI2RlZmluZSBCUldfU1VSRkFDRV9CTEVORF9FTkFCTEVECSgxIDw8IDEzKQorI2RlZmluZSBCUldfU1VSRkFDRV9XUklURURJU0FCTEVfQl9TSElGVAkxNAorI2RlZmluZSBCUldfU1VSRkFDRV9XUklURURJU0FCTEVfR19TSElGVAkxNQorI2RlZmluZSBCUldfU1VSRkFDRV9XUklURURJU0FCTEVfUl9TSElGVAkxNgorI2RlZmluZSBCUldfU1VSRkFDRV9XUklURURJU0FCTEVfQV9TSElGVAkxNworCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMkIzMkEzMl9GTE9BVCAgICAgICAgICAgICAweDAwMAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVCAgICAgICAgICAgICAgMHgwMDEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQgICAgICAgICAgICAgIDB4MDAyCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMkIzMkEzMl9VTk9STSAgICAgICAgICAgICAweDAwMworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJCMzJBMzJfU05PUk0gICAgICAgICAgICAgMHgwMDQKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjY0RzY0X0ZMT0FUICAgICAgICAgICAgICAgICAgIDB4MDA1CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMkIzMlgzMl9GTE9BVCAgICAgICAgICAgICAweDAwNgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJCMzJBMzJfU1NDQUxFRCAgICAgICAgICAgMHgwMDcKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyRzMyQjMyQTMyX1VTQ0FMRUQgICAgICAgICAgIDB4MDA4CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMkIzMkEzMl9TRklYRUQgICAgICAgICAgICAweDAyMAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SNjRHNjRfUEFTU1RIUlUgICAgICAgICAgICAgICAgMHgwMjEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyRzMyQjMyX0ZMT0FUICAgICAgICAgICAgICAgIDB4MDQwCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMkIzMl9TSU5UICAgICAgICAgICAgICAgICAweDA0MQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJCMzJfVUlOVCAgICAgICAgICAgICAgICAgMHgwNDIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyRzMyQjMyX1VOT1JNICAgICAgICAgICAgICAgIDB4MDQzCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMkIzMl9TTk9STSAgICAgICAgICAgICAgICAweDA0NAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJCMzJfU1NDQUxFRCAgICAgICAgICAgICAgMHgwNDUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyRzMyQjMyX1VTQ0FMRUQgICAgICAgICAgICAgIDB4MDQ2CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMkIzMl9TRklYRUQgICAgICAgICAgICAgICAweDA1MAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk0gICAgICAgICAgICAgMHgwODAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNICAgICAgICAgICAgIDB4MDgxCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UICAgICAgICAgICAgICAweDA4MgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZCMTZBMTZfVUlOVCAgICAgICAgICAgICAgMHgwODMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2QjE2QTE2X0ZMT0FUICAgICAgICAgICAgIDB4MDg0CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMl9GTE9BVCAgICAgICAgICAgICAgICAgICAweDA4NQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJfU0lOVCAgICAgICAgICAgICAgICAgICAgMHgwODYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyRzMyX1VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDg3CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMl9GTE9BVF9YOFgyNF9UWVBFTEVTUyAgICAgICAweDA4OAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9YMzJfVFlQRUxFU1NfRzhYMjRfVUlOVCAgICAgICAgMHgwODkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfTDMyQTMyX0ZMT0FUICAgICAgICAgICAgICAgICAgIDB4MDhBCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMl9VTk9STSAgICAgICAgICAgICAgICAgICAweDA4QgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJfU05PUk0gICAgICAgICAgICAgICAgICAgMHgwOEMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjY0X0ZMT0FUICAgICAgICAgICAgICAgICAgICAgIDB4MDhECisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNkcxNkIxNlgxNl9VTk9STSAgICAgICAgICAgICAweDA4RQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZCMTZYMTZfRkxPQVQgICAgICAgICAgICAgMHgwOEYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQTMyWDMyX0ZMT0FUICAgICAgICAgICAgICAgICAgIDB4MDkwCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0wzMlgzMl9GTE9BVCAgICAgICAgICAgICAgICAgICAweDA5MQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9JMzJYMzJfRkxPQVQgICAgICAgICAgICAgICAgICAgMHgwOTIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2QjE2QTE2X1NTQ0FMRUQgICAgICAgICAgIDB4MDkzCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNkcxNkIxNkExNl9VU0NBTEVEICAgICAgICAgICAweDA5NAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJfU1NDQUxFRCAgICAgICAgICAgICAgICAgMHgwOTUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyRzMyX1VTQ0FMRUQgICAgICAgICAgICAgICAgIDB4MDk2CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMkczMl9GTE9BVF9MRCAgICAgICAgICAgICAgICAweDA5NworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJHMzJfU0ZJWEVEICAgICAgICAgICAgICAgICAgMHgwQTAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjY0X1BBU1NUSFJVICAgICAgICAgICAgICAgICAgIDB4MEExCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0I4RzhSOEE4X1VOT1JNICAgICAgICAgICAgICAgICAweDBDMAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9COEc4UjhBOF9VTk9STV9TUkdCICAgICAgICAgICAgMHgwQzEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk0gICAgICAgICAgICAgIDB4MEMyCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNX1NSR0IgICAgICAgICAweDBDMworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTBHMTBCMTBBMl9VSU5UICAgICAgICAgICAgICAgMHgwQzQKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjEwRzEwQjEwX1NOT1JNX0EyX1VOT1JNICAgICAgIDB4MEM1CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4RzhCOEE4X1VOT1JNICAgICAgICAgICAgICAgICAweDBDNworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOEc4QjhBOF9VTk9STV9TUkdCICAgICAgICAgICAgMHgwQzgKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOEI4QThfU05PUk0gICAgICAgICAgICAgICAgIDB4MEM5CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4RzhCOEE4X1NJTlQgICAgICAgICAgICAgICAgICAweDBDQQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOEc4QjhBOF9VSU5UICAgICAgICAgICAgICAgICAgMHgwQ0IKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2X1VOT1JNICAgICAgICAgICAgICAgICAgIDB4MENDCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNkcxNl9TTk9STSAgICAgICAgICAgICAgICAgICAweDBDRAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZfU0lOVCAgICAgICAgICAgICAgICAgICAgMHgwQ0UKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2X1VJTlQgICAgICAgICAgICAgICAgICAgIDB4MENGCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNkcxNl9GTE9BVCAgICAgICAgICAgICAgICAgICAweDBEMAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CMTBHMTBSMTBBMl9VTk9STSAgICAgICAgICAgICAgMHgwRDEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQjEwRzEwUjEwQTJfVU5PUk1fU1JHQiAgICAgICAgIDB4MEQyCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxMUcxMUIxMF9GTE9BVCAgICAgICAgICAgICAgICAweDBEMworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJfU0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwRDYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyX1VJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMl9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAweDBEOAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMjRfVU5PUk1fWDhfVFlQRUxFU1MgICAgICAgICAgMHgwRDkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfWDI0X1RZUEVMRVNTX0c4X1VJTlQgICAgICAgICAgIDB4MERBCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0wxNkExNl9VTk9STSAgICAgICAgICAgICAgICAgICAweDBERgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9JMjRYOF9VTk9STSAgICAgICAgICAgICAgICAgICAgMHgwRTAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfTDI0WDhfVU5PUk0gICAgICAgICAgICAgICAgICAgIDB4MEUxCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0EyNFg4X1VOT1JNICAgICAgICAgICAgICAgICAgICAweDBFMgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9JMzJfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgMHgwRTMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfTDMyX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgIDB4MEU0CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0EzMl9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAweDBFNQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9COEc4UjhYOF9VTk9STSAgICAgICAgICAgICAgICAgMHgwRTkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQjhHOFI4WDhfVU5PUk1fU1JHQiAgICAgICAgICAgIDB4MEVBCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4RzhCOFg4X1VOT1JNICAgICAgICAgICAgICAgICAweDBFQgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOEc4QjhYOF9VTk9STV9TUkdCICAgICAgICAgICAgMHgwRUMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjlHOUI5RTVfU0hBUkVERVhQICAgICAgICAgICAgIDB4MEVECisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0IxMEcxMFIxMFgyX1VOT1JNICAgICAgICAgICAgICAweDBFRQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9MMTZBMTZfRkxPQVQgICAgICAgICAgICAgICAgICAgMHgwRjAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjMyX1VOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4MEYxCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMl9TTk9STSAgICAgICAgICAgICAgICAgICAgICAweDBGMgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTBHMTBCMTBYMl9VU0NBTEVEICAgICAgICAgICAgMHgwRjMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOEI4QThfU1NDQUxFRCAgICAgICAgICAgICAgIDB4MEY0CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4RzhCOEE4X1VTQ0FMRUQgICAgICAgICAgICAgICAweDBGNQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZfU1NDQUxFRCAgICAgICAgICAgICAgICAgMHgwRjYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2X1VTQ0FMRUQgICAgICAgICAgICAgICAgIDB4MEY3CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMl9TU0NBTEVEICAgICAgICAgICAgICAgICAgICAweDBGOAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMzJfVVNDQUxFRCAgICAgICAgICAgICAgICAgICAgMHgwRjkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQjVHNlI1X1VOT1JNICAgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0I1RzZSNV9VTk9STV9TUkdCICAgICAgICAgICAgICAweDEwMQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CNUc1UjVBMV9VTk9STSAgICAgICAgICAgICAgICAgMHgxMDIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQjVHNVI1QTFfVU5PUk1fU1JHQiAgICAgICAgICAgIDB4MTAzCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0I0RzRSNEE0X1VOT1JNICAgICAgICAgICAgICAgICAweDEwNAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CNEc0UjRBNF9VTk9STV9TUkdCICAgICAgICAgICAgMHgxMDUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOF9VTk9STSAgICAgICAgICAgICAgICAgICAgIDB4MTA2CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4RzhfU05PUk0gICAgICAgICAgICAgICAgICAgICAweDEwNworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOEc4X1NJTlQgICAgICAgICAgICAgICAgICAgICAgMHgxMDgKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOF9VSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MTA5CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNl9VTk9STSAgICAgICAgICAgICAgICAgICAgICAweDEwQQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZfU05PUk0gICAgICAgICAgICAgICAgICAgICAgMHgxMEIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2X1NJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MTBDCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNl9VSU5UICAgICAgICAgICAgICAgICAgICAgICAweDEwRAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgMHgxMEUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQThQOF9VTk9STV9QQUxFVFRFMCAgICAgICAgICAgIDB4MTBGCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0E4UDhfVU5PUk1fUEFMRVRURTEgICAgICAgICAgICAweDExMAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9JMTZfVU5PUk0gICAgICAgICAgICAgICAgICAgICAgMHgxMTEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfTDE2X1VOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4MTEyCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0ExNl9VTk9STSAgICAgICAgICAgICAgICAgICAgICAweDExMworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9MOEE4X1VOT1JNICAgICAgICAgICAgICAgICAgICAgMHgxMTQKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfSTE2X0ZMT0FUICAgICAgICAgICAgICAgICAgICAgIDB4MTE1CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0wxNl9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAweDExNgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9BMTZfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgMHgxMTcKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfTDhBOF9VTk9STV9TUkdCICAgICAgICAgICAgICAgIDB4MTE4CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I1RzVfU05PUk1fQjZfVU5PUk0gICAgICAgICAgICAweDExOQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CNUc1UjVYMV9VTk9STSAgICAgICAgICAgICAgICAgMHgxMUEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQjVHNVI1WDFfVU5PUk1fU1JHQiAgICAgICAgICAgIDB4MTFCCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4RzhfU1NDQUxFRCAgICAgICAgICAgICAgICAgICAweDExQworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOEc4X1VTQ0FMRUQgICAgICAgICAgICAgICAgICAgMHgxMUQKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2X1NTQ0FMRUQgICAgICAgICAgICAgICAgICAgIDB4MTFFCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNl9VU0NBTEVEICAgICAgICAgICAgICAgICAgICAweDExRgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9QOEE4X1VOT1JNX1BBTEVUVEUwICAgICAgICAgICAgMHgxMjIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUDhBOF9VTk9STV9QQUxFVFRFMSAgICAgICAgICAgIDB4MTIzCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0ExQjVHNVI1X1VOT1JNICAgICAgICAgICAgICAgICAweDEyNAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9BNEI0RzRSNF9VTk9STSAgICAgICAgICAgICAgICAgMHgxMjUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfTDhBOF9VSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MTI2CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0w4QThfU0lOVCAgICAgICAgICAgICAgICAgICAgICAweDEyNworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOF9VTk9STSAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhfU05PUk0gICAgICAgICAgICAgICAgICAgICAgIDB4MTQxCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4X1NJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDE0MgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOF9VSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQThfVU5PUk0gICAgICAgICAgICAgICAgICAgICAgIDB4MTQ0CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0k4X1VOT1JNICAgICAgICAgICAgICAgICAgICAgICAweDE0NQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9MOF9VTk9STSAgICAgICAgICAgICAgICAgICAgICAgMHgxNDYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUDRBNF9VTk9STSAgICAgICAgICAgICAgICAgICAgIDB4MTQ3CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0E0UDRfVU5PUk0gICAgICAgICAgICAgICAgICAgICAweDE0OAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOF9TU0NBTEVEICAgICAgICAgICAgICAgICAgICAgMHgxNDkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhfVVNDQUxFRCAgICAgICAgICAgICAgICAgICAgIDB4MTRBCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1A4X1VOT1JNX1BBTEVUVEUwICAgICAgICAgICAgICAweDE0QgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9MOF9VTk9STV9TUkdCICAgICAgICAgICAgICAgICAgMHgxNEMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUDhfVU5PUk1fUEFMRVRURTEgICAgICAgICAgICAgIDB4MTRECisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1A0QTRfVU5PUk1fUEFMRVRURTEgICAgICAgICAgICAweDE0RQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9BNFA0X1VOT1JNX1BBTEVUVEUxICAgICAgICAgICAgMHgxNEYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfWThfU05PUk0gICAgICAgICAgICAgICAgICAgICAgIDB4MTUwCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0w4X1VJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDE1MgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9MOF9TSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfSThfVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTU0CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0k4X1NJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDE1NQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9EWFQxX1JHQl9TUkdCICAgICAgICAgICAgICAgICAgMHgxODAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjFfVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgxCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1lDUkNCX05PUk1BTCAgICAgICAgICAgICAgICAgICAweDE4MgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9ZQ1JDQl9TV0FQVVZZICAgICAgICAgICAgICAgICAgMHgxODMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUDJfVU5PUk1fUEFMRVRURTAgICAgICAgICAgICAgIDB4MTg0CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1AyX1VOT1JNX1BBTEVUVEUxICAgICAgICAgICAgICAweDE4NQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CQzFfVU5PUk0gICAgICAgICAgICAgICAgICAgICAgMHgxODYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQkMyX1VOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4MTg3CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0JDM19VTk9STSAgICAgICAgICAgICAgICAgICAgICAweDE4OAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CQzRfVU5PUk0gICAgICAgICAgICAgICAgICAgICAgMHgxODkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQkM1X1VOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4MThBCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0JDMV9VTk9STV9TUkdCICAgICAgICAgICAgICAgICAweDE4QgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CQzJfVU5PUk1fU1JHQiAgICAgICAgICAgICAgICAgMHgxOEMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQkMzX1VOT1JNX1NSR0IgICAgICAgICAgICAgICAgIDB4MThECisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX01PTk84ICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4RQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9ZQ1JDQl9TV0FQVVYgICAgICAgICAgICAgICAgICAgMHgxOEYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfWUNSQ0JfU1dBUFkgICAgICAgICAgICAgICAgICAgIDB4MTkwCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0RYVDFfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDE5MQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9GWFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOEI4X1VOT1JNICAgICAgICAgICAgICAgICAgIDB4MTkzCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I4RzhCOF9TTk9STSAgICAgICAgICAgICAgICAgICAweDE5NAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOEc4QjhfU1NDQUxFRCAgICAgICAgICAgICAgICAgMHgxOTUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOEI4X1VTQ0FMRUQgICAgICAgICAgICAgICAgIDB4MTk2CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1I2NEc2NEI2NEE2NF9GTE9BVCAgICAgICAgICAgICAweDE5NworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SNjRHNjRCNjRfRkxPQVQgICAgICAgICAgICAgICAgMHgxOTgKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQkM0X1NOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4MTk5CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0JDNV9TTk9STSAgICAgICAgICAgICAgICAgICAgICAweDE5QQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZCMTZfRkxPQVQgICAgICAgICAgICAgICAgMHgxOUIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2QjE2X1VOT1JNICAgICAgICAgICAgICAgIDB4MTlDCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxNkcxNkIxNl9TTk9STSAgICAgICAgICAgICAgICAweDE5RAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRCAgICAgICAgICAgICAgMHgxOUUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQgICAgICAgICAgICAgIDB4MTlGCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0JDNkhfU0YxNiAgICAgICAgICAgICAgICAgICAgICAweDFBMQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CQzdfVU5PUk0gICAgICAgICAgICAgICAgICAgICAgMHgxQTIKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQkM3X1VOT1JNX1NSR0IgICAgICAgICAgICAgICAgIDB4MUEzCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0JDNkhfVUYxNiAgICAgICAgICAgICAgICAgICAgICAweDFBNAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9QTEFOQVJfNDIwXzggICAgICAgICAgICAgICAgICAgMHgxQTUKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOEI4X1VOT1JNX1NSR0IgICAgICAgICAgICAgIDB4MUE4CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0VUQzFfUkdCOCAgICAgICAgICAgICAgICAgICAgICAweDFBOQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9FVEMyX1JHQjggICAgICAgICAgICAgICAgICAgICAgMHgxQUEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfRUFDX1IxMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MUFCCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0VBQ19SRzExICAgICAgICAgICAgICAgICAgICAgICAweDFBQworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9FQUNfU0lHTkVEX1IxMSAgICAgICAgICAgICAgICAgMHgxQUQKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfRUFDX1NJR05FRF9SRzExICAgICAgICAgICAgICAgIDB4MUFFCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0VUQzJfU1JHQjggICAgICAgICAgICAgICAgICAgICAweDFBRgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTZHMTZCMTZfVUlOVCAgICAgICAgICAgICAgICAgMHgxQjAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjE2RzE2QjE2X1NJTlQgICAgICAgICAgICAgICAgIDB4MUIxCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IzMl9TRklYRUQgICAgICAgICAgICAgICAgICAgICAweDFCMgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTBHMTBCMTBBMl9TTk9STSAgICAgICAgICAgICAgMHgxQjMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjEwRzEwQjEwQTJfVVNDQUxFRCAgICAgICAgICAgIDB4MUI0CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1IxMEcxMEIxMEEyX1NTQ0FMRUQgICAgICAgICAgICAweDFCNQorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SMTBHMTBCMTBBMl9TSU5UICAgICAgICAgICAgICAgMHgxQjYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQjEwRzEwUjEwQTJfU05PUk0gICAgICAgICAgICAgIDB4MUI3CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0IxMEcxMFIxMEEyX1VTQ0FMRUQgICAgICAgICAgICAweDFCOAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9CMTBHMTBSMTBBMl9TU0NBTEVEICAgICAgICAgICAgMHgxQjkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfQjEwRzEwUjEwQTJfVUlOVCAgICAgICAgICAgICAgIDB4MUJBCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0IxMEcxMFIxMEEyX1NJTlQgICAgICAgICAgICAgICAweDFCQgorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SNjRHNjRCNjRBNjRfUEFTU1RIUlUgICAgICAgICAgMHgxQkMKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjY0RzY0QjY0X1BBU1NUSFJVICAgICAgICAgICAgIDB4MUJECisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0VUQzJfUkdCOF9QVEEgICAgICAgICAgICAgICAgICAweDFDMAorI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9FVEMyX1NSR0I4X1BUQSAgICAgICAgICAgICAgICAgMHgxQzEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfRVRDMl9FQUNfUkdCQTggICAgICAgICAgICAgICAgIDB4MUMyCisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX0VUQzJfRUFDX1NSR0I4X0E4ICAgICAgICAgICAgICAweDFDMworI2RlZmluZSBCUldfU1VSRkFDRUZPUk1BVF9SOEc4QjhfVUlOVCAgICAgICAgICAgICAgICAgICAgMHgxQzgKKyNkZWZpbmUgQlJXX1NVUkZBQ0VGT1JNQVRfUjhHOEI4X1NJTlQgICAgICAgICAgICAgICAgICAgIDB4MUM5CisjZGVmaW5lIEJSV19TVVJGQUNFRk9STUFUX1JBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRgorI2RlZmluZSBCUldfU1VSRkFDRV9GT1JNQVRfU0hJRlQJMTgKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfRk9STUFUX01BU0sJCUlOVEVMX01BU0soMjYsIDE4KQorCisjZGVmaW5lIEJSV19TVVJGQUNFUkVUVVJORk9STUFUX0ZMT0FUMzIgIDAKKyNkZWZpbmUgQlJXX1NVUkZBQ0VSRVRVUk5GT1JNQVRfUzEgICAgICAgMQorCisjZGVmaW5lIEJSV19TVVJGQUNFX1RZUEVfU0hJRlQJCTI5CisjZGVmaW5lIEJSV19TVVJGQUNFX1RZUEVfTUFTSwkJSU5URUxfTUFTSygzMSwgMjkpCisjZGVmaW5lIEJSV19TVVJGQUNFXzFEICAgICAgMAorI2RlZmluZSBCUldfU1VSRkFDRV8yRCAgICAgIDEKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfM0QgICAgICAyCisjZGVmaW5lIEJSV19TVVJGQUNFX0NVQkUgICAgMworI2RlZmluZSBCUldfU1VSRkFDRV9CVUZGRVIgIDQKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfTlVMTCAgICA3CisKKyNkZWZpbmUgR0VON19TVVJGQUNFX0lTX0FSUkFZICAgICAgICAgICAoMSA8PCAyOCkKKyNkZWZpbmUgR0VON19TVVJGQUNFX1ZBTElHTl8yICAgICAgICAgICAoMCA8PCAxNikKKyNkZWZpbmUgR0VON19TVVJGQUNFX1ZBTElHTl80ICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgR0VON19TVVJGQUNFX0hBTElHTl80ICAgICAgICAgICAoMCA8PCAxNSkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0hBTElHTl84ICAgICAgICAgICAoMSA8PCAxNSkKKyNkZWZpbmUgR0VON19TVVJGQUNFX1RJTElOR19OT05FICAgICAgICAoMCA8PCAxMykKKyNkZWZpbmUgR0VON19TVVJGQUNFX1RJTElOR19YICAgICAgICAgICAoMiA8PCAxMykKKyNkZWZpbmUgR0VON19TVVJGQUNFX1RJTElOR19ZICAgICAgICAgICAoMyA8PCAxMykKKyNkZWZpbmUgR0VON19TVVJGQUNFX0FSWVNQQ19GVUxMCSgwIDw8IDEwKQorI2RlZmluZSBHRU43X1NVUkZBQ0VfQVJZU1BDX0xPRDAJKDEgPDwgMTApCisKKy8qIFN1cmZhY2Ugc3RhdGUgRFcwICovCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9NT0NTX1NISUZUICAgICAgICAgMjQKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX01PQ1NfTUFTSyAgICAgICAgICBJTlRFTF9NQVNLKDMwLCAyNCkKKworLyogU3VyZmFjZSBzdGF0ZSBEVzIgKi8KKyNkZWZpbmUgQlJXX1NVUkZBQ0VfSEVJR0hUX1NISUZUCTE5CisjZGVmaW5lIEJSV19TVVJGQUNFX0hFSUdIVF9NQVNLCQlJTlRFTF9NQVNLKDMxLCAxOSkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfV0lEVEhfU0hJRlQJCTYKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfV0lEVEhfTUFTSwkJSU5URUxfTUFTSygxOCwgNikKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfTE9EX1NISUZUCQkyCisjZGVmaW5lIEJSV19TVVJGQUNFX0xPRF9NQVNLCQlJTlRFTF9NQVNLKDUsIDIpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9IRUlHSFRfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgR0VON19TVVJGQUNFX0hFSUdIVF9NQVNLICAgICAgICBJTlRFTF9NQVNLKDI5LCAxNikKKyNkZWZpbmUgR0VON19TVVJGQUNFX1dJRFRIX1NISUZUICAgICAgICAwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9XSURUSF9NQVNLICAgICAgICAgSU5URUxfTUFTSygxMywgMCkKKworLyogU3VyZmFjZSBzdGF0ZSBEVzMgKi8KKyNkZWZpbmUgQlJXX1NVUkZBQ0VfREVQVEhfU0hJRlQJCTIxCisjZGVmaW5lIEJSV19TVVJGQUNFX0RFUFRIX01BU0sJCUlOVEVMX01BU0soMzEsIDIxKQorI2RlZmluZSBCUldfU1VSRkFDRV9QSVRDSF9TSElGVAkJMworI2RlZmluZSBCUldfU1VSRkFDRV9QSVRDSF9NQVNLCQlJTlRFTF9NQVNLKDE5LCAzKQorI2RlZmluZSBCUldfU1VSRkFDRV9USUxFRAkJKDEgPDwgMSkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfVElMRURfWQkJKDEgPDwgMCkKKworLyogU3VyZmFjZSBzdGF0ZSBEVzQgKi8KKyNkZWZpbmUgQlJXX1NVUkZBQ0VfTUlOX0xPRF9TSElGVAkyOAorI2RlZmluZSBCUldfU1VSRkFDRV9NSU5fTE9EX01BU0sJSU5URUxfTUFTSygzMSwgMjgpCisjZGVmaW5lIEJSV19TVVJGQUNFX01VTFRJU0FNUExFQ09VTlRfMSAgKDAgPDwgNCkKKyNkZWZpbmUgQlJXX1NVUkZBQ0VfTVVMVElTQU1QTEVDT1VOVF80ICAoMiA8PCA0KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfTVVMVElTQU1QTEVDT1VOVF8xICAgICAgICAgKDAgPDwgMykKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX01VTFRJU0FNUExFQ09VTlRfMiAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9NVUxUSVNBTVBMRUNPVU5UXzQgICAgICAgICAoMiA8PCAzKQorI2RlZmluZSBHRU43X1NVUkZBQ0VfTVVMVElTQU1QTEVDT1VOVF84ICAgICAgICAgKDMgPDwgMykKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX01VTFRJU0FNUExFQ09VTlRfMTYgICAgICAgICg0IDw8IDMpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9NU0ZNVF9NU1MgICAgICAgICAgICAgICAgICAoMCA8PCA2KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfTVNGTVRfREVQVEhfU1RFTkNJTCAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgR0VON19TVVJGQUNFX01JTl9BUlJBWV9FTEVNRU5UX1NISUZUCTE4CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9NSU5fQVJSQVlfRUxFTUVOVF9NQVNLICAgICBJTlRFTF9NQVNLKDI4LCAxOCkKKyNkZWZpbmUgR0VON19TVVJGQUNFX1JFTkRFUl9UQVJHRVRfVklFV19FWFRFTlRfU0hJRlQJNworI2RlZmluZSBHRU43X1NVUkZBQ0VfUkVOREVSX1RBUkdFVF9WSUVXX0VYVEVOVF9NQVNLICAgSU5URUxfTUFTSygxNywgNykKKworLyogU3VyZmFjZSBzdGF0ZSBEVzUgKi8KKyNkZWZpbmUgQlJXX1NVUkZBQ0VfWF9PRkZTRVRfU0hJRlQJCTI1CisjZGVmaW5lIEJSV19TVVJGQUNFX1hfT0ZGU0VUX01BU0sJCUlOVEVMX01BU0soMzEsIDI1KQorI2RlZmluZSBCUldfU1VSRkFDRV9WRVJUSUNBTF9BTElHTl9FTkFCTEUJKDEgPDwgMjQpCisjZGVmaW5lIEJSV19TVVJGQUNFX1lfT0ZGU0VUX1NISUZUCQkyMAorI2RlZmluZSBCUldfU1VSRkFDRV9ZX09GRlNFVF9NQVNLCQlJTlRFTF9NQVNLKDIzLCAyMCkKKyNkZWZpbmUgR0VON19TVVJGQUNFX01JTl9MT0RfU0hJRlQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgR0VON19TVVJGQUNFX01JTl9MT0RfTUFTSyAgICAgICAgICAgICAgIElOVEVMX01BU0soNywgNCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX1lfT0ZGU0VUX1NISUZUCQkyMQorI2RlZmluZSBHRU44X1NVUkZBQ0VfWV9PRkZTRVRfTUFTSwkJSU5URUxfTUFTSygyMywgMjEpCisKKyNkZWZpbmUgR0VON19TVVJGQUNFX01PQ1NfU0hJRlQgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9NT0NTX01BU0sgICAgICAgICAgICAgICAgICBJTlRFTF9NQVNLKDE5LCAxNikKKworLyogU3VyZmFjZSBzdGF0ZSBEVzYgKi8KKyNkZWZpbmUgR0VON19TVVJGQUNFX01DU19FTkFCTEUgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9NQ1NfUElUQ0hfU0hJRlQgICAgICAgICAgICAzCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9NQ1NfUElUQ0hfTUFTSyAgICAgICAgICAgICBJTlRFTF9NQVNLKDExLCAzKQorI2RlZmluZSBHRU44X1NVUkZBQ0VfQVVYX1FQSVRDSF9TSElGVCAgICAgICAgICAgMTYKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0FVWF9RUElUQ0hfTUFTSyAgICAgICAgICAgIElOVEVMX01BU0soMzAsIDE2KQorI2RlZmluZSBHRU44X1NVUkZBQ0VfQVVYX1BJVENIX1NISUZUICAgICAgICAgICAgMworI2RlZmluZSBHRU44X1NVUkZBQ0VfQVVYX1BJVENIX01BU0sgICAgICAgICAgICAgSU5URUxfTUFTSygxMSwgMykKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0FVWF9NT0RFX01BU0sgICAgICAgICAgICAgIElOVEVMX01BU0soMiwgMCkKKworI2RlZmluZSBHRU44X1NVUkZBQ0VfQVVYX01PREVfTk9ORSAgICAgICAgICAgICAgMAorI2RlZmluZSBHRU44X1NVUkZBQ0VfQVVYX01PREVfTUNTICAgICAgICAgICAgICAgMQorI2RlZmluZSBHRU44X1NVUkZBQ0VfQVVYX01PREVfQVBQRU5EICAgICAgICAgICAgMgorI2RlZmluZSBHRU44X1NVUkZBQ0VfQVVYX01PREVfSElaICAgICAgICAgICAgICAgMworCisvKiBTdXJmYWNlIHN0YXRlIERXNyAqLworI2RlZmluZSBHRU43X1NVUkZBQ0VfQ0xFQVJfQ09MT1JfU0hJRlQJCTI4CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9TQ1NfUl9TSElGVCAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBHRU43X1NVUkZBQ0VfU0NTX1JfTUFTSyAgICAgICAgICAgICAgICAgSU5URUxfTUFTSygyNywgMjUpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9TQ1NfR19TSElGVCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBHRU43X1NVUkZBQ0VfU0NTX0dfTUFTSyAgICAgICAgICAgICAgICAgSU5URUxfTUFTSygyNCwgMjIpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9TQ1NfQl9TSElGVCAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBHRU43X1NVUkZBQ0VfU0NTX0JfTUFTSyAgICAgICAgICAgICAgICAgSU5URUxfTUFTSygyMSwgMTkpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9TQ1NfQV9TSElGVCAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBHRU43X1NVUkZBQ0VfU0NTX0FfTUFTSyAgICAgICAgICAgICAgICAgSU5URUxfTUFTSygxOCwgMTYpCisKKy8qIFRoZSBhY3R1YWwgc3dpenpsZSB2YWx1ZXMvd2hhdCBjaGFubmVsIHRvIHVzZSAqLworI2RlZmluZSBIU1dfU0NTX1pFUk8gICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhTV19TQ1NfT05FICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSFNXX1NDU19SRUQgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBIU1dfU0NTX0dSRUVOICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEhTV19TQ1NfQkxVRSAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSFNXX1NDU19BTFBIQSAgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIEJSV19URVhDT09SRE1PREVfV1JBUCAgICAgICAgICAgIDAKKyNkZWZpbmUgQlJXX1RFWENPT1JETU9ERV9NSVJST1IgICAgICAgICAgMQorI2RlZmluZSBCUldfVEVYQ09PUkRNT0RFX0NMQU1QICAgICAgICAgICAyCisjZGVmaW5lIEJSV19URVhDT09SRE1PREVfQ1VCRSAgICAgICAgICAgIDMKKyNkZWZpbmUgQlJXX1RFWENPT1JETU9ERV9DTEFNUF9CT1JERVIgICAgNAorI2RlZmluZSBCUldfVEVYQ09PUkRNT0RFX01JUlJPUl9PTkNFICAgICA1CisjZGVmaW5lIEdFTjhfVEVYQ09PUkRNT0RFX0hBTEZfQk9SREVSICAgIDYKKworI2RlZmluZSBCUldfVEhSRUFEX1BSSU9SSVRZX05PUk1BTCAgIDAKKyNkZWZpbmUgQlJXX1RIUkVBRF9QUklPUklUWV9ISUdIICAgICAxCisKKyNkZWZpbmUgQlJXX1RJTEVXQUxLX1hNQUpPUiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCUldfVElMRVdBTEtfWU1BSk9SICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQlJXX1ZFUlRFWF9TVUJQSVhFTF9QUkVDSVNJT05fOEJJVFMgIDAKKyNkZWZpbmUgQlJXX1ZFUlRFWF9TVUJQSVhFTF9QUkVDSVNJT05fNEJJVFMgIDEKKworLyogRXhlY3V0aW9uIFVuaXQgKEVVKSBkZWZpbmVzCisgKi8KKworI2RlZmluZSBCUldfQUxJR05fMSAgIDAKKyNkZWZpbmUgQlJXX0FMSUdOXzE2ICAxCisKKyNkZWZpbmUgQlJXX0FERFJFU1NfRElSRUNUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCUldfQUREUkVTU19SRUdJU1RFUl9JTkRJUkVDVF9SRUdJU1RFUiAgICAxCisKKyNkZWZpbmUgQlJXX0NIQU5ORUxfWCAgICAgMAorI2RlZmluZSBCUldfQ0hBTk5FTF9ZICAgICAxCisjZGVmaW5lIEJSV19DSEFOTkVMX1ogICAgIDIKKyNkZWZpbmUgQlJXX0NIQU5ORUxfVyAgICAgMworCitlbnVtIGJyd19jb21wcmVzc2lvbiB7CisgICBCUldfQ09NUFJFU1NJT05fTk9ORSAgICAgICA9IDAsCisgICBCUldfQ09NUFJFU1NJT05fMk5ESEFMRiAgICA9IDEsCisgICBCUldfQ09NUFJFU1NJT05fQ09NUFJFU1NFRCA9IDIsCit9OworCisjZGVmaW5lIEdFTjZfQ09NUFJFU1NJT05fMVEJCTAKKyNkZWZpbmUgR0VONl9DT01QUkVTU0lPTl8yUQkJMQorI2RlZmluZSBHRU42X0NPTVBSRVNTSU9OXzNRCQkyCisjZGVmaW5lIEdFTjZfQ09NUFJFU1NJT05fNFEJCTMKKyNkZWZpbmUgR0VONl9DT01QUkVTU0lPTl8xSAkJMAorI2RlZmluZSBHRU42X0NPTVBSRVNTSU9OXzJICQkyCisKKyNkZWZpbmUgQlJXX0NPTkRJVElPTkFMX05PTkUgIDAKKyNkZWZpbmUgQlJXX0NPTkRJVElPTkFMX1ogICAgIDEKKyNkZWZpbmUgQlJXX0NPTkRJVElPTkFMX05aICAgIDIKKyNkZWZpbmUgQlJXX0NPTkRJVElPTkFMX0VRICAgIDEJLyogWiAqLworI2RlZmluZSBCUldfQ09ORElUSU9OQUxfTkVRICAgMgkvKiBOWiAqLworI2RlZmluZSBCUldfQ09ORElUSU9OQUxfRyAgICAgMworI2RlZmluZSBCUldfQ09ORElUSU9OQUxfR0UgICAgNAorI2RlZmluZSBCUldfQ09ORElUSU9OQUxfTCAgICAgNQorI2RlZmluZSBCUldfQ09ORElUSU9OQUxfTEUgICAgNgorI2RlZmluZSBCUldfQ09ORElUSU9OQUxfUiAgICAgNworI2RlZmluZSBCUldfQ09ORElUSU9OQUxfTyAgICAgOAorI2RlZmluZSBCUldfQ09ORElUSU9OQUxfVSAgICAgOQorCisjZGVmaW5lIEJSV19ERUJVR19OT05FICAgICAgICAwCisjZGVmaW5lIEJSV19ERUJVR19CUkVBS1BPSU5UICAxCisKKyNkZWZpbmUgQlJXX0RFUEVOREVOQ1lfTk9STUFMICAgICAgICAgMAorI2RlZmluZSBCUldfREVQRU5ERU5DWV9OT1RDTEVBUkVEICAgICAxCisjZGVmaW5lIEJSV19ERVBFTkRFTkNZX05PVENIRUNLRUQgICAgIDIKKyNkZWZpbmUgQlJXX0RFUEVOREVOQ1lfRElTQUJMRSAgICAgICAgMworCisjZGVmaW5lIEJSV19FWEVDVVRFXzEgICAgIDAKKyNkZWZpbmUgQlJXX0VYRUNVVEVfMiAgICAgMQorI2RlZmluZSBCUldfRVhFQ1VURV80ICAgICAyCisjZGVmaW5lIEJSV19FWEVDVVRFXzggICAgIDMKKyNkZWZpbmUgQlJXX0VYRUNVVEVfMTYgICAgNAorI2RlZmluZSBCUldfRVhFQ1VURV8zMiAgICA1CisKKyNkZWZpbmUgQlJXX0hPUklaT05UQUxfU1RSSURFXzAgICAwCisjZGVmaW5lIEJSV19IT1JJWk9OVEFMX1NUUklERV8xICAgMQorI2RlZmluZSBCUldfSE9SSVpPTlRBTF9TVFJJREVfMiAgIDIKKyNkZWZpbmUgQlJXX0hPUklaT05UQUxfU1RSSURFXzQgICAzCisKKyNkZWZpbmUgQlJXX0lOU1RSVUNUSU9OX05PUk1BTCAgICAwCisjZGVmaW5lIEJSV19JTlNUUlVDVElPTl9TQVRVUkFURSAgMQorCisjZGVmaW5lIEJSV19NQVNLX0VOQUJMRSAgIDAKKyNkZWZpbmUgQlJXX01BU0tfRElTQUJMRSAgMQorCisvKiogQHsKKyAqCisgKiBHZW42IGhhcyByZXBsYWNlZCAibWFzayBlbmFibGUvZGlzYWJsZSIgd2l0aCBXRUN0cmwsIHdoaWNoIGlzCisgKiBlZmZlY3RpdmVseSB0aGUgc2FtZSBidXQgbXVjaCBzaW1wbGVyIHRvIHRoaW5rIGFib3V0LiAgTm93LCB0aGVyZQorICogYXJlIHR3byBjb250cmlidXRvcnMgQU5EZWQgdG9nZXRoZXIgdG8gd2hldGhlciBjaGFubmVscyBhcmUKKyAqIGV4ZWN1dGVkOiBUaGUgcHJlZGljYXRpb24gb24gdGhlIGluc3RydWN0aW9uLCBhbmQgdGhlIGNoYW5uZWwgd3JpdGUKKyAqIGVuYWJsZS4KKyAqLworLyoqCisgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlLiAgSXQgbWVhbnMgdGhhdCBhIGNoYW5uZWwncyB3cml0ZSBlbmFibGUgaXMgc2V0CisgKiBpZiB0aGUgcGVyLWNoYW5uZWwgSVAgaXMgcG9pbnRpbmcgYXQgdGhpcyBpbnN0cnVjdGlvbi4KKyAqLworI2RlZmluZSBCUldfV0VfTk9STUFMCQkwCisvKioKKyAqIFRoaXMgaXMgdXNlZCBsaWtlIEJSV19NQVNLX0RJU0FCTEUsIGFuZCBjYXVzZXMgYWxsIGNoYW5uZWxzIHRvIGhhdmUKKyAqIHRoZWlyIHdyaXRlIGVuYWJsZSBzZXQuICBOb3RlIHRoYXQgcHJlZGljYXRpb24gc3RpbGwgY29udHJpYnV0ZXMgdG8KKyAqIHdoZXRoZXIgdGhlIGNoYW5uZWwgYWN0dWFsbHkgZ2V0cyB3cml0dGVuLgorICovCisjZGVmaW5lIEJSV19XRV9BTEwJCTEKKy8qKiBAfSAqLworCitlbnVtIG9wY29kZSB7CisgICAvKiBUaGVzZSBhcmUgdGhlIGFjdHVhbCBoYXJkd2FyZSBvcGNvZGVzLiAqLworICAgQlJXX09QQ09ERV9NT1YgPQkxLAorICAgQlJXX09QQ09ERV9TRUwgPQkyLAorICAgQlJXX09QQ09ERV9OT1QgPQk0LAorICAgQlJXX09QQ09ERV9BTkQgPQk1LAorICAgQlJXX09QQ09ERV9PUiA9CTYsCisgICBCUldfT1BDT0RFX1hPUiA9CTcsCisgICBCUldfT1BDT0RFX1NIUiA9CTgsCisgICBCUldfT1BDT0RFX1NITCA9CTksCisgICBCUldfT1BDT0RFX0FTUiA9CTEyLAorICAgQlJXX09QQ09ERV9DTVAgPQkxNiwKKyAgIEJSV19PUENPREVfQ01QTiA9CTE3LAorICAgQlJXX09QQ09ERV9GMzJUTzE2ID0gMTksCisgICBCUldfT1BDT0RFX0YxNlRPMzIgPSAyMCwKKyAgIEJSV19PUENPREVfQkZSRVYgPQkyMywKKyAgIEJSV19PUENPREVfQkZFID0JMjQsCisgICBCUldfT1BDT0RFX0JGSTEgPQkyNSwKKyAgIEJSV19PUENPREVfQkZJMiA9CTI2LAorICAgQlJXX09QQ09ERV9KTVBJID0JMzIsCisgICBCUldfT1BDT0RFX0lGID0JMzQsCisgICBCUldfT1BDT0RFX0lGRiA9CTM1LAorICAgQlJXX09QQ09ERV9FTFNFID0JMzYsCisgICBCUldfT1BDT0RFX0VORElGID0JMzcsCisgICBCUldfT1BDT0RFX0RPID0JMzgsCisgICBCUldfT1BDT0RFX1dISUxFID0JMzksCisgICBCUldfT1BDT0RFX0JSRUFLID0JNDAsCisgICBCUldfT1BDT0RFX0NPTlRJTlVFID0gNDEsCisgICBCUldfT1BDT0RFX0hBTFQgPQk0MiwKKyAgIEJSV19PUENPREVfTVNBVkUgPQk0NCwKKyAgIEJSV19PUENPREVfTVJFU1RPUkUgPSA0NSwKKyAgIEJSV19PUENPREVfUFVTSCA9CTQ2LAorICAgQlJXX09QQ09ERV9QT1AgPQk0NywKKyAgIEJSV19PUENPREVfV0FJVCA9CTQ4LAorICAgQlJXX09QQ09ERV9TRU5EID0JNDksCisgICBCUldfT1BDT0RFX1NFTkRDID0JNTAsCisgICBCUldfT1BDT0RFX01BVEggPQk1NiwKKyAgIEJSV19PUENPREVfQUREID0JNjQsCisgICBCUldfT1BDT0RFX01VTCA9CTY1LAorICAgQlJXX09QQ09ERV9BVkcgPQk2NiwKKyAgIEJSV19PUENPREVfRlJDID0JNjcsCisgICBCUldfT1BDT0RFX1JORFUgPQk2OCwKKyAgIEJSV19PUENPREVfUk5ERCA9CTY5LAorICAgQlJXX09QQ09ERV9STkRFID0JNzAsCisgICBCUldfT1BDT0RFX1JORFogPQk3MSwKKyAgIEJSV19PUENPREVfTUFDID0JNzIsCisgICBCUldfT1BDT0RFX01BQ0ggPQk3MywKKyAgIEJSV19PUENPREVfTFpEID0JNzQsCisgICBCUldfT1BDT0RFX0ZCSCA9CTc1LAorICAgQlJXX09QQ09ERV9GQkwgPQk3NiwKKyAgIEJSV19PUENPREVfQ0JJVCA9CTc3LAorICAgQlJXX09QQ09ERV9BRERDID0JNzgsCisgICBCUldfT1BDT0RFX1NVQkIgPQk3OSwKKyAgIEJSV19PUENPREVfU0FEMiA9CTgwLAorICAgQlJXX09QQ09ERV9TQURBMiA9CTgxLAorICAgQlJXX09QQ09ERV9EUDQgPQk4NCwKKyAgIEJSV19PUENPREVfRFBIID0JODUsCisgICBCUldfT1BDT0RFX0RQMyA9CTg2LAorICAgQlJXX09QQ09ERV9EUDIgPQk4NywKKyAgIEJSV19PUENPREVfTElORSA9CTg5LAorICAgQlJXX09QQ09ERV9QTE4gPQk5MCwKKyAgIEJSV19PUENPREVfTUFEID0JOTEsCisgICBCUldfT1BDT0RFX0xSUCA9CTkyLAorICAgQlJXX09QQ09ERV9OT1AgPQkxMjYsCisKKyAgIC8qIFRoZXNlIGFyZSBjb21waWxlciBiYWNrZW5kIG9wY29kZXMgdGhhdCBnZXQgdHJhbnNsYXRlZCBpbnRvIG90aGVyCisgICAgKiBpbnN0cnVjdGlvbnMuCisgICAgKi8KKyAgIEZTX09QQ09ERV9GQl9XUklURSA9IDEyOCwKKyAgIEZTX09QQ09ERV9CTE9SUF9GQl9XUklURSwKKyAgIFNIQURFUl9PUENPREVfUkNQLAorICAgU0hBREVSX09QQ09ERV9SU1EsCisgICBTSEFERVJfT1BDT0RFX1NRUlQsCisgICBTSEFERVJfT1BDT0RFX0VYUDIsCisgICBTSEFERVJfT1BDT0RFX0xPRzIsCisgICBTSEFERVJfT1BDT0RFX1BPVywKKyAgIFNIQURFUl9PUENPREVfSU5UX1FVT1RJRU5ULAorICAgU0hBREVSX09QQ09ERV9JTlRfUkVNQUlOREVSLAorICAgU0hBREVSX09QQ09ERV9TSU4sCisgICBTSEFERVJfT1BDT0RFX0NPUywKKworICAgU0hBREVSX09QQ09ERV9URVgsCisgICBTSEFERVJfT1BDT0RFX1RYRCwKKyAgIFNIQURFUl9PUENPREVfVFhGLAorICAgU0hBREVSX09QQ09ERV9UWEwsCisgICBTSEFERVJfT1BDT0RFX1RYUywKKyAgIEZTX09QQ09ERV9UWEIsCisgICBTSEFERVJfT1BDT0RFX1RYRl9DTVMsCisgICBTSEFERVJfT1BDT0RFX1RYRl9VTVMsCisgICBTSEFERVJfT1BDT0RFX1RYRl9NQ1MsCisgICBTSEFERVJfT1BDT0RFX0xPRCwKKyAgIFNIQURFUl9PUENPREVfVEc0LAorICAgU0hBREVSX09QQ09ERV9URzRfT0ZGU0VULAorCisgICAgLy8gTHVuYXJHIDogVE9ETyAtIHNoYWRlciB0aW1lPz8KKy8vICAgU0hBREVSX09QQ09ERV9TSEFERVJfVElNRV9BREQsCisKKyAgIFNIQURFUl9PUENPREVfVU5UWVBFRF9BVE9NSUMsCisgICBTSEFERVJfT1BDT0RFX1VOVFlQRURfU1VSRkFDRV9SRUFELAorCisgICBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9SRUFELAorICAgU0hBREVSX09QQ09ERV9HRU40X1NDUkFUQ0hfV1JJVEUsCisgICBTSEFERVJfT1BDT0RFX0dFTjdfU0NSQVRDSF9SRUFELAorCisgICBTSEFERVJfT1BDT0RFX0RXT1JEX1NDQVRURVJFRF9XUklURSwKKyAgIFNIQURFUl9PUENPREVfQllURV9TQ0FUVEVSRURfV1JJVEUsCisgICBTSEFERVJfT1BDT0RFX0RXT1JEX1NDQVRURVJFRF9SRUFELAorICAgU0hBREVSX09QQ09ERV9CWVRFX1NDQVRURVJFRF9SRUFELAorCisgICBGU19PUENPREVfRERYLAorICAgRlNfT1BDT0RFX0REWSwKKyAgIEZTX09QQ09ERV9QSVhFTF9YLAorICAgRlNfT1BDT0RFX1BJWEVMX1ksCisgICBGU19PUENPREVfQ0lOVEVSUCwKKyAgIEZTX09QQ09ERV9MSU5URVJQLAorICAgRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FELAorICAgRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FEX0dFTjcsCisgICBGU19PUENPREVfVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQUQsCisgICBGU19PUENPREVfVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQURfR0VONywKKyAgIEZTX09QQ09ERV9NT1ZfRElTUEFUQ0hfVE9fRkxBR1MsCisgICBGU19PUENPREVfRElTQ0FSRF9KVU1QLAorICAgRlNfT1BDT0RFX1NFVF9PTUFTSywKKyAgIEZTX09QQ09ERV9TRVRfU0FNUExFX0lELAorICAgRlNfT1BDT0RFX1NFVF9TSU1ENFgyX09GRlNFVCwKKyAgIEZTX09QQ09ERV9QQUNLX0hBTEZfMngxNl9TUExJVCwKKyAgIEZTX09QQ09ERV9VTlBBQ0tfSEFMRl8yeDE2X1NQTElUX1gsCisgICBGU19PUENPREVfVU5QQUNLX0hBTEZfMngxNl9TUExJVF9ZLAorICAgRlNfT1BDT0RFX1BMQUNFSE9MREVSX0hBTFQsCisKKyAgIFZTX09QQ09ERV9VUkJfV1JJVEUsCisgICBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FELAorICAgVlNfT1BDT0RFX1BVTExfQ09OU1RBTlRfTE9BRF9HRU43LAorICAgVlNfT1BDT0RFX1VOUEFDS19GTEFHU19TSU1ENFgyLAorCisgICAvKioKKyAgICAqIFdyaXRlIGdlb21ldHJ5IHNoYWRlciBvdXRwdXQgZGF0YSB0byB0aGUgVVJCLgorICAgICoKKyAgICAqIFVubGlrZSBWU19PUENPREVfVVJCX1dSSVRFLCB0aGlzIG9wY29kZSBkb2Vzbid0IGRvIGFuIGltcGxpZWQgbW92ZSBmcm9tCisgICAgKiBSMCB0byB0aGUgZmlyc3QgTVJGLiAgVGhpcyBhbGxvd3MgdGhlIGdlb21ldHJ5IHNoYWRlciB0byBvdmVycmlkZSB0aGUKKyAgICAqICJTbG90IHswLDF9IE9mZnNldCIgZmllbGRzIGluIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAqLworICAgR1NfT1BDT0RFX1VSQl9XUklURSwKKworICAgLyoqCisgICAgKiBUZXJtaW5hdGUgdGhlIGdlb21ldHJ5IHNoYWRlciB0aHJlYWQgYnkgZG9pbmcgYW4gZW1wdHkgVVJCIHdyaXRlLgorICAgICoKKyAgICAqIFRoaXMgb3Bjb2RlIGRvZXNuJ3QgZG8gYW4gaW1wbGllZCBtb3ZlIGZyb20gUjAgdG8gdGhlIGZpcnN0IE1SRi4gIFRoaXMKKyAgICAqIGFsbG93cyB0aGUgZ2VvbWV0cnkgc2hhZGVyIHRvIG92ZXJyaWRlIHRoZSAiR1MgTnVtYmVyIG9mIE91dHB1dCBWZXJ0aWNlcworICAgICogZm9yIFNsb3QgezAsMX0iIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgKi8KKyAgIEdTX09QQ09ERV9USFJFQURfRU5ELAorCisgICAvKioKKyAgICAqIFNldCB0aGUgIlNsb3QgezAsMX0gT2Zmc2V0IiBmaWVsZHMgb2YgYSBVUkJfV1JJVEUgbWVzc2FnZSBoZWFkZXIuCisgICAgKgorICAgICogLSBkc3QgaXMgdGhlIE1SRiBjb250YWluaW5nIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAqCisgICAgKiAtIHNyYzAueCBpbmRpY2F0ZXMgd2hpY2ggcG9ydGlvbiBvZiB0aGUgVVJCIHNob3VsZCBiZSB3cml0dGVuIHRvIChlLmcuIGEKKyAgICAqICAgdmVydGV4IG51bWJlcikKKyAgICAqCisgICAgKiAtIHNyYzEgaXMgYW4gaW1tZWRpYXRlIG11bHRpcGxpZXIgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHNyYzAKKyAgICAqICAgKGUuZy4gdGhlIHNpemUgb2YgYSBzaW5nbGUgdmVydGV4IGluIHRoZSBVUkIpLgorICAgICoKKyAgICAqIE5vdGU6IHRoZSBoYXJkd2FyZSB3aWxsIGFwcGx5IHRoaXMgb2Zmc2V0ICppbiBhZGRpdGlvbiB0byogdGhlIG9mZnNldCBpbgorICAgICogdmVjNF9pbnN0cnVjdGlvbjo6b2Zmc2V0LgorICAgICovCisgICBHU19PUENPREVfU0VUX1dSSVRFX09GRlNFVCwKKworICAgLyoqCisgICAgKiBTZXQgdGhlICJHUyBOdW1iZXIgb2YgT3V0cHV0IFZlcnRpY2VzIGZvciBTbG90IHswLDF9IiBmaWVsZHMgb2YgYQorICAgICogVVJCX1dSSVRFIG1lc3NhZ2UgaGVhZGVyLgorICAgICoKKyAgICAqIC0gZHN0IGlzIHRoZSBNUkYgY29udGFpbmluZyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgKgorICAgICogLSBzcmMwLnggaXMgdGhlIHZlcnRleCBjb3VudC4gIFRoZSB1cHBlciAxNiBiaXRzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAqLworICAgR1NfT1BDT0RFX1NFVF9WRVJURVhfQ09VTlQsCisKKyAgIC8qKgorICAgICogU2V0IERXT1JEIDIgb2YgZHN0IHRvIHRoZSBpbW1lZGlhdGUgdmFsdWUgaW4gc3JjLiAgVXNlZCBieSBnZW9tZXRyeQorICAgICogc2hhZGVycyB0byBpbml0aWFsaXplIERXT1JEIDIgb2YgUjAsIHdoaWNoIG5lZWRzIHRvIGJlIDAgaW4gb3JkZXIgZm9yCisgICAgKiBzY3JhdGNoIHJlYWRzIGFuZCB3cml0ZXMgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuCisgICAgKi8KKyAgIEdTX09QQ09ERV9TRVRfRFdPUkRfMl9JTU1FRCwKKworICAgLyoqCisgICAgKiBQcmVwYXJlIHRoZSBkc3QgcmVnaXN0ZXIgZm9yIHN0b3JhZ2UgaW4gdGhlICJDaGFubmVsIE1hc2siIGZpZWxkcyBvZiBhCisgICAgKiBVUkJfV1JJVEUgbWVzc2FnZSBoZWFkZXIuCisgICAgKgorICAgICogRFdPUkQgNCBvZiBkc3QgaXMgc2hpZnRlZCBsZWZ0IGJ5IDQgYml0cywgc28gdGhhdCBsYXRlciwKKyAgICAqIEdTX09QQ09ERV9TRVRfQ0hBTk5FTF9NQVNLUyBjYW4gT1IgRFdPUkRzIDAgYW5kIDQgdG9nZXRoZXIgdG8gZm9ybSB0aGUKKyAgICAqIGZpbmFsIGNoYW5uZWwgbWFzay4KKyAgICAqCisgICAgKiBOb3RlOiBzaW5jZSBHU19PUENPREVfU0VUX0NIQU5ORUxfTUFTS1MgT1JzIERXT1JEcyAwIGFuZCA0IHRvZ2V0aGVyIHRvCisgICAgKiBmb3JtIHRoZSBmaW5hbCBjaGFubmVsIG1hc2ssIERXT1JEcyAwIGFuZCA0IG9mIHRoZSBkc3QgcmVnaXN0ZXIgbXVzdCBub3QKKyAgICAqIGhhdmUgYW55IGV4dHJhbmVvdXMgYml0cyBzZXQgcHJpb3IgdG8gZXhlY3V0aW9uIG9mIHRoaXMgb3Bjb2RlICh0aGF0IGlzLAorICAgICogdGhleSBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDB4MCB0byAweGYpLgorICAgICovCisgICBHU19PUENPREVfUFJFUEFSRV9DSEFOTkVMX01BU0tTLAorCisgICAvKioKKyAgICAqIFNldCB0aGUgIkNoYW5uZWwgTWFzayIgZmllbGRzIG9mIGEgVVJCX1dSSVRFIG1lc3NhZ2UgaGVhZGVyLgorICAgICoKKyAgICAqIC0gZHN0IGlzIHRoZSBNUkYgY29udGFpbmluZyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgKgorICAgICogLSBzcmMueCBpcyB0aGUgY2hhbm5lbCBtYXNrLCBhcyBwcmVwYXJlZCBieQorICAgICogICBHU19PUENPREVfUFJFUEFSRV9DSEFOTkVMX01BU0tTLiAgRFdPUkRzIDAgYW5kIDQgYXJlIE9SJ2VkIHRvZ2V0aGVyIHRvCisgICAgKiAgIGZvcm0gdGhlIGZpbmFsIGNoYW5uZWwgbWFzay4KKyAgICAqLworICAgR1NfT1BDT0RFX1NFVF9DSEFOTkVMX01BU0tTLAorCisgICAvKioKKyAgICAqIEdldCB0aGUgIkluc3RhbmNlIElEIiBmaWVsZHMgZnJvbSB0aGUgcGF5bG9hZC4KKyAgICAqCisgICAgKiAtIGRzdCBpcyB0aGUgR1JGIGZvciBnbF9JbnZvY2F0aW9uSUQuCisgICAgKi8KKyAgIEdTX09QQ09ERV9HRVRfSU5TVEFOQ0VfSUQsCit9OworCitlbnVtIGJyd191cmJfd3JpdGVfZmxhZ3MgeworICAgQlJXX1VSQl9XUklURV9OT19GTEFHUyA9IDAsCisKKyAgIC8qKgorICAgICogQ2F1c2VzIGEgbmV3IFVSQiBlbnRyeSB0byBiZSBhbGxvY2F0ZWQsIGFuZCBpdHMgYWRkcmVzcyBzdG9yZWQgaW4gdGhlCisgICAgKiBkZXN0aW5hdGlvbiByZWdpc3RlciAoZ2VuIDwgNykuCisgICAgKi8KKyAgIEJSV19VUkJfV1JJVEVfQUxMT0NBVEUgPSAweDEsCisKKyAgIC8qKgorICAgICogQ2F1c2VzIHRoZSBjdXJyZW50IFVSQiBlbnRyeSB0byBiZSBkZWFsbG9jYXRlZCAoZ2VuIDwgNykuCisgICAgKi8KKyAgIEJSV19VUkJfV1JJVEVfVU5VU0VEID0gMHgyLAorCisgICAvKioKKyAgICAqIENhdXNlcyB0aGUgdGhyZWFkIHRvIHRlcm1pbmF0ZS4KKyAgICAqLworICAgQlJXX1VSQl9XUklURV9FT1QgPSAweDQsCisKKyAgIC8qKgorICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGdpdmVuIFVSQiBlbnRyeSBpcyBjb21wbGV0ZSwgYW5kIG1heSBiZSBzZW50IGZ1cnRoZXIKKyAgICAqIGRvd24gdGhlIDNEIHBpcGVsaW5lIChnZW4gPCA3KS4KKyAgICAqLworICAgQlJXX1VSQl9XUklURV9DT01QTEVURSA9IDB4OCwKKworICAgLyoqCisgICAgKiBJbmRpY2F0ZXMgdGhhdCBhbiBhZGRpdGlvbmFsIG9mZnNldCAod2hpY2ggbWF5IGJlIGRpZmZlcmVudCBmb3IgdGhlIHR3bworICAgICogdmVjNCBzbG90cykgaXMgc3RvcmVkIGluIHRoZSBtZXNzYWdlIGhlYWRlciAoZ2VuID09IDcpLgorICAgICovCisgICBCUldfVVJCX1dSSVRFX1BFUl9TTE9UX09GRlNFVCA9IDB4MTAsCisKKyAgIC8qKgorICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNoYW5uZWwgbWFza3MgaW4gdGhlIFVSQl9XUklURSBtZXNzYWdlIGhlYWRlciBzaG91bGQKKyAgICAqIG5vdCBiZSBvdmVycmlkZGVuIHRvIDB4ZmYgKGdlbiA9PSA3KS4KKyAgICAqLworICAgQlJXX1VSQl9XUklURV9VU0VfQ0hBTk5FTF9NQVNLUyA9IDB4MjAsCisKKyAgIC8qKgorICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIFVSQiB1c2luZyB0aGUKKyAgICAqIFVSQl9XUklURV9PV09SRCBtZXNzYWdlIHJhdGhlciB0aGFuIFVSQl9XUklURV9IV09SRCAoZ2VuID09IDcpLiAgVGhpcworICAgICogY2F1c2VzIG9mZnNldHMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgbXVsdGlwbGVzIG9mIGFuIE9XT1JEIGluc3RlYWQgb2YgYW4KKyAgICAqIEhXT1JELCBhbmQgb25seSBhbGxvd3Mgb25lIE9XT1JEIHRvIGJlIHdyaXR0ZW4uCisgICAgKi8KKyAgIEJSV19VUkJfV1JJVEVfT1dPUkQgPSAweDQwLAorCisgICAvKioKKyAgICAqIENvbnZlbmllbnQgY29tYmluYXRpb24gb2YgZmxhZ3M6IGVuZCB0aGUgdGhyZWFkIHdoaWxlIHNpbXVsdGFuZW91c2x5CisgICAgKiBtYXJraW5nIHRoZSBnaXZlbiBVUkIgZW50cnkgYXMgY29tcGxldGUuCisgICAgKi8KKyAgIEJSV19VUkJfV1JJVEVfRU9UX0NPTVBMRVRFID0gQlJXX1VSQl9XUklURV9FT1QgfCBCUldfVVJCX1dSSVRFX0NPTVBMRVRFLAorCisgICAvKioKKyAgICAqIENvbnZlbmllbnQgY29tYmluYXRpb24gb2YgZmxhZ3M6IG1hcmsgdGhlIGdpdmVuIFVSQiBlbnRyeSBhcyBjb21wbGV0ZQorICAgICogYW5kIHNpbXVsdGFuZW91c2x5IGFsbG9jYXRlIGEgbmV3IG9uZS4KKyAgICAqLworICAgQlJXX1VSQl9XUklURV9BTExPQ0FURV9DT01QTEVURSA9CisgICAgICBCUldfVVJCX1dSSVRFX0FMTE9DQVRFIHwgQlJXX1VSQl9XUklURV9DT01QTEVURSwKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworLyoqCisgKiBBbGxvdyBicndfdXJiX3dyaXRlX2ZsYWdzIGVudW1zIHRvIGJlIE9SZWQgdG9nZXRoZXIuCisgKi8KK2lubGluZSBicndfdXJiX3dyaXRlX2ZsYWdzCitvcGVyYXRvcnwoYnJ3X3VyYl93cml0ZV9mbGFncyB4LCBicndfdXJiX3dyaXRlX2ZsYWdzIHkpCit7CisgICByZXR1cm4gc3RhdGljX2Nhc3Q8YnJ3X3VyYl93cml0ZV9mbGFncz4oc3RhdGljX2Nhc3Q8aW50Pih4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih5KSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBCUldfUFJFRElDQVRFX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBCUldfUFJFRElDQVRFX05PUk1BTCAgICAgICAgICAgMQorI2RlZmluZSBCUldfUFJFRElDQVRFX0FMSUdOMV9BTllWICAgICAgICAgICAgIDIKKyNkZWZpbmUgQlJXX1BSRURJQ0FURV9BTElHTjFfQUxMViAgICAgICAgICAgICAzCisjZGVmaW5lIEJSV19QUkVESUNBVEVfQUxJR04xX0FOWTJIICAgICAgICAgICAgNAorI2RlZmluZSBCUldfUFJFRElDQVRFX0FMSUdOMV9BTEwySCAgICAgICAgICAgIDUKKyNkZWZpbmUgQlJXX1BSRURJQ0FURV9BTElHTjFfQU5ZNEggICAgICAgICAgICA2CisjZGVmaW5lIEJSV19QUkVESUNBVEVfQUxJR04xX0FMTDRIICAgICAgICAgICAgNworI2RlZmluZSBCUldfUFJFRElDQVRFX0FMSUdOMV9BTlk4SCAgICAgICAgICAgIDgKKyNkZWZpbmUgQlJXX1BSRURJQ0FURV9BTElHTjFfQUxMOEggICAgICAgICAgICA5CisjZGVmaW5lIEJSV19QUkVESUNBVEVfQUxJR04xX0FOWTE2SCAgICAgICAgICAgMTAKKyNkZWZpbmUgQlJXX1BSRURJQ0FURV9BTElHTjFfQUxMMTZIICAgICAgICAgICAxMQorI2RlZmluZSBCUldfUFJFRElDQVRFX0FMSUdOMTZfUkVQTElDQVRFX1ggICAgIDIKKyNkZWZpbmUgQlJXX1BSRURJQ0FURV9BTElHTjE2X1JFUExJQ0FURV9ZICAgICAzCisjZGVmaW5lIEJSV19QUkVESUNBVEVfQUxJR04xNl9SRVBMSUNBVEVfWiAgICAgNAorI2RlZmluZSBCUldfUFJFRElDQVRFX0FMSUdOMTZfUkVQTElDQVRFX1cgICAgIDUKKyNkZWZpbmUgQlJXX1BSRURJQ0FURV9BTElHTjE2X0FOWTRIICAgICAgICAgICA2CisjZGVmaW5lIEJSV19QUkVESUNBVEVfQUxJR04xNl9BTEw0SCAgICAgICAgICAgNworCisjZGVmaW5lIEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSAgICAwCisjZGVmaW5lIEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUgICAgICAgICAxCisjZGVmaW5lIEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUgICAgICAgICAyCisjZGVmaW5lIEJSV19JTU1FRElBVEVfVkFMVUUgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQlJXX0hXX1JFR19UWVBFX1VEICAwCisjZGVmaW5lIEJSV19IV19SRUdfVFlQRV9EICAgMQorI2RlZmluZSBCUldfSFdfUkVHX1RZUEVfVVcgIDIKKyNkZWZpbmUgQlJXX0hXX1JFR19UWVBFX1cgICAzCisjZGVmaW5lIEJSV19IV19SRUdfVFlQRV9GICAgNworI2RlZmluZSBHRU44X0hXX1JFR19UWVBFX1VRIDgKKyNkZWZpbmUgR0VOOF9IV19SRUdfVFlQRV9RICA5CisKKyNkZWZpbmUgQlJXX0hXX1JFR19OT05fSU1NX1RZUEVfVUIgIDQKKyNkZWZpbmUgQlJXX0hXX1JFR19OT05fSU1NX1RZUEVfQiAgIDUKKyNkZWZpbmUgR0VON19IV19SRUdfTk9OX0lNTV9UWVBFX0RGIDYKKyNkZWZpbmUgR0VOOF9IV19SRUdfTk9OX0lNTV9UWVBFX0hGIDEwCisKKyNkZWZpbmUgQlJXX0hXX1JFR19JTU1fVFlQRV9VViAgNCAvKiBHZW42KyBwYWNrZWQgdW5zaWduZWQgaW1tZWRpYXRlIHZlY3RvciAqLworI2RlZmluZSBCUldfSFdfUkVHX0lNTV9UWVBFX1ZGICA1IC8qIHBhY2tlZCBmbG9hdCBpbW1lZGlhdGUgdmVjdG9yICovCisjZGVmaW5lIEJSV19IV19SRUdfSU1NX1RZUEVfViAgIDYgLyogcGFja2VkIGludCBpbW0uIHZlY3RvcjsgdXdvcmQgZGVzdCBvbmx5ICovCisjZGVmaW5lIEdFTjhfSFdfUkVHX0lNTV9UWVBFX0RGIDEwCisjZGVmaW5lIEdFTjhfSFdfUkVHX0lNTV9UWVBFX0hGIDExCisKKy8qIFNOQiBhZGRzIDMtc3JjIGluc3RydWN0aW9ucyAoTUFEIGFuZCBMUlApIHRoYXQgb25seSBvcGVyYXRlIG9uIGZsb2F0cywgc28KKyAqIHRoZSB0eXBlcyB3ZXJlIGltcGxpZWQuIElWQiBhZGRzIEJGRSBhbmQgQkZJMiB0aGF0IG9wZXJhdGUgb24gZG91Ymxld29yZHMKKyAqIGFuZCB1bnNpZ25lZCBkb3VibGV3b3Jkcywgc28gYSBuZXcgZmllbGQgaXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIGRhM3NyYworICogc3RydWN0IChwYXJ0IG9mIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24uYml0czEgaW4gYnJ3X3N0cnVjdHMuaCkgdG8gc2VsZWN0CisgKiBkc3QgYW5kIHNoYXJlZC1zcmMgdHlwZXMuIFRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCBmcm9tIEJSV19SRUdJU1RFUl9UWVBFXyouCisgKi8KKyNkZWZpbmUgQlJXXzNTUkNfVFlQRV9GICAwCisjZGVmaW5lIEJSV18zU1JDX1RZUEVfRCAgMQorI2RlZmluZSBCUldfM1NSQ19UWVBFX1VEIDIKKyNkZWZpbmUgQlJXXzNTUkNfVFlQRV9ERiAzCisKKyNkZWZpbmUgQlJXX0FSRl9OVUxMICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCUldfQVJGX0FERFJFU1MgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJSV19BUkZfQUNDVU1VTEFUT1IgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQlJXX0FSRl9GTEFHICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBCUldfQVJGX01BU0sgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEJSV19BUkZfTUFTS19TVEFDSyAgICAgICAgICAgIDB4NTAKKyNkZWZpbmUgQlJXX0FSRl9NQVNLX1NUQUNLX0RFUFRIICAgICAgMHg2MAorI2RlZmluZSBCUldfQVJGX1NUQVRFICAgICAgICAgICAgICAgICAweDcwCisjZGVmaW5lIEJSV19BUkZfQ09OVFJPTCAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQlJXX0FSRl9OT1RJRklDQVRJT05fQ09VTlQgICAgMHg5MAorI2RlZmluZSBCUldfQVJGX0lQICAgICAgICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIEJSV19BUkZfVERSICAgICAgICAgICAgICAgICAgIDB4QjAKKyNkZWZpbmUgQlJXX0FSRl9USU1FU1RBTVAgICAgICAgICAgICAgMHhDMAorCisjZGVmaW5lIEJSV19NUkZfQ09NUFI0CQkJKDEgPDwgNykKKworI2RlZmluZSBCUldfQU1BU0sgICAwCisjZGVmaW5lIEJSV19JTUFTSyAgIDEKKyNkZWZpbmUgQlJXX0xNQVNLICAgMgorI2RlZmluZSBCUldfQ01BU0sgICAzCisKKworCisjZGVmaW5lIEJSV19USFJFQURfTk9STUFMICAgICAwCisjZGVmaW5lIEJSV19USFJFQURfQVRPTUlDICAgICAxCisjZGVmaW5lIEJSV19USFJFQURfU1dJVENIICAgICAyCisKKyNkZWZpbmUgQlJXX1ZFUlRJQ0FMX1NUUklERV8wICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJSV19WRVJUSUNBTF9TVFJJREVfMSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCUldfVkVSVElDQUxfU1RSSURFXzIgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQlJXX1ZFUlRJQ0FMX1NUUklERV80ICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJSV19WRVJUSUNBTF9TVFJJREVfOCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBCUldfVkVSVElDQUxfU1RSSURFXzE2ICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQlJXX1ZFUlRJQ0FMX1NUUklERV8zMiAgICAgICAgICAgICAgICA2CisjZGVmaW5lIEJSV19WRVJUSUNBTF9TVFJJREVfNjQgICAgICAgICAgICAgICAgNworI2RlZmluZSBCUldfVkVSVElDQUxfU1RSSURFXzEyOCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQlJXX1ZFUlRJQ0FMX1NUUklERV8yNTYgICAgICAgICAgICAgICA5CisjZGVmaW5lIEJSV19WRVJUSUNBTF9TVFJJREVfT05FX0RJTUVOU0lPTkFMICAgMHhGCisKKyNkZWZpbmUgQlJXX1dJRFRIXzEgICAgICAgMAorI2RlZmluZSBCUldfV0lEVEhfMiAgICAgICAxCisjZGVmaW5lIEJSV19XSURUSF80ICAgICAgIDIKKyNkZWZpbmUgQlJXX1dJRFRIXzggICAgICAgMworI2RlZmluZSBCUldfV0lEVEhfMTYgICAgICA0CisKKyNkZWZpbmUgQlJXX1NUQVRFTEVTU19CVUZGRVJfQk9VTkRBUllfMUsgICAgICAwCisjZGVmaW5lIEJSV19TVEFURUxFU1NfQlVGRkVSX0JPVU5EQVJZXzJLICAgICAgMQorI2RlZmluZSBCUldfU1RBVEVMRVNTX0JVRkZFUl9CT1VOREFSWV80SyAgICAgIDIKKyNkZWZpbmUgQlJXX1NUQVRFTEVTU19CVUZGRVJfQk9VTkRBUllfOEsgICAgICAzCisjZGVmaW5lIEJSV19TVEFURUxFU1NfQlVGRkVSX0JPVU5EQVJZXzE2SyAgICAgNAorI2RlZmluZSBCUldfU1RBVEVMRVNTX0JVRkZFUl9CT1VOREFSWV8zMksgICAgIDUKKyNkZWZpbmUgQlJXX1NUQVRFTEVTU19CVUZGRVJfQk9VTkRBUllfNjRLICAgICA2CisjZGVmaW5lIEJSV19TVEFURUxFU1NfQlVGRkVSX0JPVU5EQVJZXzEyOEsgICAgNworI2RlZmluZSBCUldfU1RBVEVMRVNTX0JVRkZFUl9CT1VOREFSWV8yNTZLICAgIDgKKyNkZWZpbmUgQlJXX1NUQVRFTEVTU19CVUZGRVJfQk9VTkRBUllfNTEySyAgICA5CisjZGVmaW5lIEJSV19TVEFURUxFU1NfQlVGRkVSX0JPVU5EQVJZXzFNICAgICAgMTAKKyNkZWZpbmUgQlJXX1NUQVRFTEVTU19CVUZGRVJfQk9VTkRBUllfMk0gICAgICAxMQorCisjZGVmaW5lIEJSV19QT0xZR09OX0ZBQ0lOR19GUk9OVCAgICAgIDAKKyNkZWZpbmUgQlJXX1BPTFlHT05fRkFDSU5HX0JBQ0sgICAgICAgMQorCisvKioKKyAqIE1lc3NhZ2UgdGFyZ2V0OiBTaGFyZWQgRnVuY3Rpb24gSUQgZm9yIHdoZXJlIHRvIFNFTkQgYSBtZXNzYWdlLgorICoKKyAqIFRoZXNlIGFyZSBlbnVtZXJhdGVkIGluIHRoZSBJU0EgcmVmZXJlbmNlIHVuZGVyICJzZW5kIC0gU2VuZCBNZXNzYWdlIi4KKyAqIEluIHBhcnRpY3VsYXIsIHNlZSB0aGUgZm9sbG93aW5nIHRhYmxlczoKKyAqIC0gRzQ1IFBSTSwgVm9sdW1lIDQsIFRhYmxlIDE0LTE1ICJNZXNzYWdlIERlc2NyaXB0b3IgRGVmaW5pdGlvbiIKKyAqIC0gU2FuZHlicmlkZ2UgUFJNLCBWb2x1bWUgNCBQYXJ0IDIsIFRhYmxlIDgtMTYgIkV4dGVuZGVkIE1lc3NhZ2UgRGVzY3JpcHRvciIKKyAqIC0gSXZ5YnJpZGdlIFBSTSwgVm9sdW1lIDEgUGFydCAxLCBzZWN0aW9uIDMuMi43ICJHUEUgRnVuY3Rpb24gSURzIgorICovCitlbnVtIGJyd19tZXNzYWdlX3RhcmdldCB7CisgICBCUldfU0ZJRF9OVUxMICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgQlJXX1NGSURfTUFUSCAgICAgICAgICAgICAgICAgICAgID0gMSwgLyogT25seSB2YWxpZCBvbiBHZW40LTUgKi8KKyAgIEJSV19TRklEX1NBTVBMRVIgICAgICAgICAgICAgICAgICA9IDIsCisgICBCUldfU0ZJRF9NRVNTQUdFX0dBVEVXQVkgICAgICAgICAgPSAzLAorICAgQlJXX1NGSURfREFUQVBPUlRfUkVBRCAgICAgICAgICAgID0gNCwKKyAgIEJSV19TRklEX0RBVEFQT1JUX1dSSVRFICAgICAgICAgICA9IDUsCisgICBCUldfU0ZJRF9VUkIgICAgICAgICAgICAgICAgICAgICAgPSA2LAorICAgQlJXX1NGSURfVEhSRUFEX1NQQVdORVIgICAgICAgICAgID0gNywKKyAgIEJSV19TRklEX1ZNRSAgICAgICAgICAgICAgICAgICAgICA9IDgsCisKKyAgIEdFTjZfU0ZJRF9EQVRBUE9SVF9TQU1QTEVSX0NBQ0hFICA9IDQsCisgICBHRU42X1NGSURfREFUQVBPUlRfUkVOREVSX0NBQ0hFICAgPSA1LAorICAgR0VONl9TRklEX0RBVEFQT1JUX0NPTlNUQU5UX0NBQ0hFID0gOSwKKworICAgR0VON19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEUgICAgID0gMTAsCisgICBHRU43X1NGSURfUElYRUxfSU5URVJQT0xBVE9SICAgICAgPSAxMSwKKyAgIEhTV19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEVfMSAgICA9IDEyLAorICAgSFNXX1NGSURfQ1JFICAgICAgICAgICAgICAgICAgICAgID0gMTMsCit9OworCisjZGVmaW5lIEdFTjdfTUVTU0FHRV9UQVJHRVRfRFBfREFUQV9DQUNIRSAgICAgMTAKKworI2RlZmluZSBCUldfU0FNUExFUl9SRVRVUk5fRk9STUFUX0ZMT0FUMzIgICAgIDAKKyNkZWZpbmUgQlJXX1NBTVBMRVJfUkVUVVJOX0ZPUk1BVF9VSU5UMzIgICAgICAyCisjZGVmaW5lIEJSV19TQU1QTEVSX1JFVFVSTl9GT1JNQVRfU0lOVDMyICAgICAgMworCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDhfU0FNUExFICAgICAgICAgICAgICAwCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDE2X1NBTVBMRSAgICAgICAgICAgICAwCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDE2X1NBTVBMRV9CSUFTICAgICAgICAwCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDhfS0lMTFBJWCAgICAgICAgICAgICAxCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDRYMl9TQU1QTEVfTE9EICAgICAgICAxCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDE2X1NBTVBMRV9MT0QgICAgICAgICAxCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDRYMl9TQU1QTEVfR1JBRElFTlRTICAyCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDhfU0FNUExFX0dSQURJRU5UUyAgICAyCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDRYMl9TQU1QTEVfQ09NUEFSRSAgICAwCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDE2X1NBTVBMRV9DT01QQVJFICAgICAyCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDhfU0FNUExFX0JJQVNfQ09NUEFSRSAwCisjZGVmaW5lIEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDRYMl9TQU1QTEVfTE9EX0NPTVBBUkUgMQorI2RlZmluZSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQ4X1NBTVBMRV9MT0RfQ09NUEFSRSAgMQorI2RlZmluZSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQ0WDJfUkVTSU5GTyAgICAgICAgICAgMgorI2RlZmluZSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQxNl9SRVNJTkZPICAgICAgICAgICAgMgorI2RlZmluZSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQ0WDJfTEQgICAgICAgICAgICAgICAgMworI2RlZmluZSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQ4X0xEICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQxNl9MRCAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRSAgICAgICAgICAgICAgMAorI2RlZmluZSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfQklBUyAgICAgICAgIDEKKyNkZWZpbmUgR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xPRCAgICAgICAgICAyCisjZGVmaW5lIEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9DT01QQVJFICAgICAgMworI2RlZmluZSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfREVSSVZTICAgICAgIDQKKyNkZWZpbmUgR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0JJQVNfQ09NUEFSRSA1CisjZGVmaW5lIEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MT0RfQ09NUEFSRSAgNgorI2RlZmluZSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTEQgICAgICAgICAgIDcKKyNkZWZpbmUgR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0dBVEhFUjQgICAgICA4CisjZGVmaW5lIEdFTjVfU0FNUExFUl9NRVNTQUdFX0xPRCAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfUkVTSU5GTyAgICAgIDEwCisjZGVmaW5lIEdFTjdfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9HQVRIRVI0X0MgICAgMTYKKyNkZWZpbmUgR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0dBVEhFUjRfUE8gICAxNworI2RlZmluZSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfR0FUSEVSNF9QT19DIDE4CisjZGVmaW5lIEhTV19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0RFUklWX0NPTVBBUkUgMjAKKyNkZWZpbmUgR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xEX01DUyAgICAgICAyOQorI2RlZmluZSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTEQyRE1TICAgICAgIDMwCisjZGVmaW5lIEdFTjdfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MRDJEU1MgICAgICAgMzEKKworLyogZm9yIEdFTjUgb25seSAqLworI2RlZmluZSBCUldfU0FNUExFUl9TSU1EX01PREVfU0lNRDRYMiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJSV19TQU1QTEVSX1NJTURfTU9ERV9TSU1EOCAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQxNiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCUldfU0FNUExFUl9TSU1EX01PREVfU0lNRDMyXzY0ICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQlJXX0RBVEFQT1JUX09XT1JEX0JMT0NLXzFfT1dPUkRMT1cgICAwCisjZGVmaW5lIEJSV19EQVRBUE9SVF9PV09SRF9CTE9DS18xX09XT1JESElHSCAgMQorI2RlZmluZSBCUldfREFUQVBPUlRfT1dPUkRfQkxPQ0tfMl9PV09SRFMgICAgIDIKKyNkZWZpbmUgQlJXX0RBVEFQT1JUX09XT1JEX0JMT0NLXzRfT1dPUkRTICAgICAzCisjZGVmaW5lIEJSV19EQVRBUE9SVF9PV09SRF9CTE9DS184X09XT1JEUyAgICAgNAorCisjZGVmaW5lIEJSV19EQVRBUE9SVF9PV09SRF9EVUFMX0JMT0NLXzFPV09SRCAgICAgMAorI2RlZmluZSBCUldfREFUQVBPUlRfT1dPUkRfRFVBTF9CTE9DS180T1dPUkRTICAgIDIKKworI2RlZmluZSBCUldfREFUQVBPUlRfRFdPUkRfU0NBVFRFUkVEX0JMT0NLXzhEV09SRFMgICAyCisjZGVmaW5lIEJSV19EQVRBUE9SVF9EV09SRF9TQ0FUVEVSRURfQkxPQ0tfMTZEV09SRFMgIDMKKworLyogVGhpcyBvbmUgc3RheXMgdGhlIHNhbWUgYWNyb3NzIGdlbmVyYXRpb25zLiAqLworI2RlZmluZSBCUldfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX0JMT0NLX1JFQUQgICAgICAgICAgMAorLyogR0VONCAqLworI2RlZmluZSBCUldfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX0RVQUxfQkxPQ0tfUkVBRCAgICAgMQorI2RlZmluZSBCUldfREFUQVBPUlRfUkVBRF9NRVNTQUdFX01FRElBX0JMT0NLX1JFQUQgICAgICAgICAgMgorI2RlZmluZSBCUldfREFUQVBPUlRfUkVBRF9NRVNTQUdFX0RXT1JEX1NDQVRURVJFRF9SRUFEICAgICAgMworLyogRzQ1LCBHRU41ICovCisjZGVmaW5lIEc0NV9EQVRBUE9SVF9SRUFEX01FU1NBR0VfUkVOREVSX1VOT1JNX1JFQUQJICAgIDEKKyNkZWZpbmUgRzQ1X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1JFQUQgICAgIDIKKyNkZWZpbmUgRzQ1X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9BVkNfTE9PUF9GSUxURVJfUkVBRAkgICAgMworI2RlZmluZSBHNDVfREFUQVBPUlRfUkVBRF9NRVNTQUdFX01FRElBX0JMT0NLX1JFQUQgICAgICAgICAgNAorI2RlZmluZSBHNDVfREFUQVBPUlRfUkVBRF9NRVNTQUdFX0RXT1JEX1NDQVRURVJFRF9SRUFEICAgICAgNgorLyogR0VONiAqLworI2RlZmluZSBHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9SRU5ERVJfVU5PUk1fUkVBRAkgICAgMQorI2RlZmluZSBHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1JFQUQgICAgIDIKKyNkZWZpbmUgR0VONl9EQVRBUE9SVF9SRUFEX01FU1NBR0VfTUVESUFfQkxPQ0tfUkVBRCAgICAgICAgICA0CisjZGVmaW5lIEdFTjZfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX1VOQUxJR05fQkxPQ0tfUkVBRCAgNQorI2RlZmluZSBHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9EV09SRF9TQ0FUVEVSRURfUkVBRCAgICAgIDYKKworI2RlZmluZSBCUldfREFUQVBPUlRfUkVBRF9UQVJHRVRfREFUQV9DQUNIRSAgICAgIDAKKyNkZWZpbmUgQlJXX0RBVEFQT1JUX1JFQURfVEFSR0VUX1JFTkRFUl9DQUNIRSAgICAxCisjZGVmaW5lIEJSV19EQVRBUE9SVF9SRUFEX1RBUkdFVF9TQU1QTEVSX0NBQ0hFICAgMgorCisjZGVmaW5lIEJSV19EQVRBUE9SVF9SRU5ERVJfVEFSR0VUX1dSSVRFX1NJTUQxNl9TSU5HTEVfU09VUkNFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlJXX0RBVEFQT1JUX1JFTkRFUl9UQVJHRVRfV1JJVEVfU0lNRDE2X1NJTkdMRV9TT1VSQ0VfUkVQTElDQVRFRCAgICAgMQorI2RlZmluZSBCUldfREFUQVBPUlRfUkVOREVSX1RBUkdFVF9XUklURV9TSU1EOF9EVUFMX1NPVVJDRV9TVUJTUEFOMDEgICAgICAgICAyCisjZGVmaW5lIEJSV19EQVRBUE9SVF9SRU5ERVJfVEFSR0VUX1dSSVRFX1NJTUQ4X0RVQUxfU09VUkNFX1NVQlNQQU4yMyAgICAgICAgIDMKKyNkZWZpbmUgQlJXX0RBVEFQT1JUX1JFTkRFUl9UQVJHRVRfV1JJVEVfU0lNRDhfU0lOR0xFX1NPVVJDRV9TVUJTUEFOMDEgICAgICAgNAorCisjZGVmaW5lIEJSV19EQVRBUE9SVF9XUklURV9NRVNTQUdFX09XT1JEX0JMT0NLX1dSSVRFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlJXX0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfT1dPUkRfRFVBTF9CTE9DS19XUklURSAgICAgICAgICAgMQorI2RlZmluZSBCUldfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9NRURJQV9CTE9DS19XUklURSAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJSV19EQVRBUE9SVF9XUklURV9NRVNTQUdFX0RXT1JEX1NDQVRURVJFRF9XUklURSAgICAgICAgICAgIDMKKyNkZWZpbmUgQlJXX0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfUkVOREVSX1RBUkdFVF9XUklURSAgICAgICAgICAgICAgNAorI2RlZmluZSBCUldfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9TVFJFQU1FRF9WRVJURVhfQlVGRkVSX1dSSVRFICAgICA1CisjZGVmaW5lIEJSV19EQVRBUE9SVF9XUklURV9NRVNTQUdFX0ZMVVNIX1JFTkRFUl9DQUNIRSAgICAgICAgICAgICAgIDcKKworLyogR0VONiAqLworI2RlZmluZSBHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfRFdPUkRfQVRPTUlDX1dSSVRFICAgICAgICAgICAgICA3CisjZGVmaW5lIEdFTjZfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9PV09SRF9CTE9DS19XUklURSAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgR0VONl9EQVRBUE9SVF9XUklURV9NRVNTQUdFX09XT1JEX0RVQUxfQkxPQ0tfV1JJVEUgICAgICAgICAgOQorI2RlZmluZSBHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfTUVESUFfQkxPQ0tfV1JJVEUgICAgICAgICAgICAgICAxMAorI2RlZmluZSBHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfRFdPUkRfU0NBVFRFUkVEX1dSSVRFICAgICAgICAgICAxMQorI2RlZmluZSBHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfUkVOREVSX1RBUkdFVF9XUklURSAgICAgICAgICAgICAxMgorI2RlZmluZSBHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfU1RSRUFNRURfVkJfV1JJVEUgICAgICAgICAgICAgICAxMworI2RlZmluZSBHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfUkVOREVSX1RBUkdFVF9VTk9STV9XUklURSAgICAgICAxNAorCisvKiBHRU43ICovCisjZGVmaW5lIEdFTjdfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1dSSVRFICAgICAgICAgIDEwCisjZGVmaW5lIEdFTjdfREFUQVBPUlRfRENfT1dPUkRfQkxPQ0tfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0VON19EQVRBUE9SVF9EQ19VTkFMSUdORURfT1dPUkRfQkxPQ0tfUkVBRCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHRU43X0RBVEFQT1JUX0RDX09XT1JEX0RVQUxfQkxPQ0tfUkVBRCAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEdFTjdfREFUQVBPUlRfRENfRFdPUkRfU0NBVFRFUkVEX1JFQUQgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgR0VON19EQVRBUE9SVF9EQ19CWVRFX1NDQVRURVJFRF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBHRU43X0RBVEFQT1JUX0RDX1VOVFlQRURfU1VSRkFDRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEdFTjdfREFUQVBPUlRfRENfVU5UWVBFRF9BVE9NSUNfT1AgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgR0VON19EQVRBUE9SVF9EQ19NRU1PUllfRkVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBHRU43X0RBVEFQT1JUX0RDX09XT1JEX0JMT0NLX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEdFTjdfREFUQVBPUlRfRENfT1dPUkRfRFVBTF9CTE9DS19XUklURSAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEdFTjdfREFUQVBPUlRfRENfRFdPUkRfU0NBVFRFUkVEX1dSSVRFICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIEdFTjdfREFUQVBPUlRfRENfQllURV9TQ0FUVEVSRURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEdFTjdfREFUQVBPUlRfRENfVU5UWVBFRF9TVVJGQUNFX1dSSVRFICAgICAgICAgICAgICAgICAgICAgIDEzCisKKyNkZWZpbmUgR0VON19EQVRBUE9SVF9TQ1JBVENIX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgxIDw8IDE4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDE3KSkKKyNkZWZpbmUgR0VON19EQVRBUE9SVF9TQ1JBVENIX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgxIDw8IDE4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE3KSkKKyNkZWZpbmUgR0VON19EQVRBUE9SVF9TQ1JBVENIX05VTV9SRUdTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTIKKworLyogSFNXICovCisjZGVmaW5lIEhTV19EQVRBUE9SVF9EQ19QT1JUMF9PV09SRF9CTE9DS19SRUFEICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQwX1VOQUxJR05FRF9PV09SRF9CTE9DS19SRUFEICAgICAgICAgICAgMQorI2RlZmluZSBIU1dfREFUQVBPUlRfRENfUE9SVDBfT1dPUkRfRFVBTF9CTE9DS19SRUFEICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEhTV19EQVRBUE9SVF9EQ19QT1JUMF9EV09SRF9TQ0FUVEVSRURfUkVBRCAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQwX0JZVEVfU0NBVFRFUkVEX1JFQUQgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBIU1dfREFUQVBPUlRfRENfUE9SVDBfTUVNT1JZX0ZFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEhTV19EQVRBUE9SVF9EQ19QT1JUMF9PV09SRF9CTE9DS19XUklURSAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQwX09XT1JEX0RVQUxfQkxPQ0tfV1JJVEUgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQwX0RXT1JEX1NDQVRURVJFRF9XUklURSAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQwX0JZVEVfU0NBVFRFUkVEX1dSSVRFICAgICAgICAgICAgICAgICAgMTIKKworI2RlZmluZSBIU1dfREFUQVBPUlRfRENfUE9SVDFfVU5UWVBFRF9TVVJGQUNFX1JFQUQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEhTV19EQVRBUE9SVF9EQ19QT1JUMV9VTlRZUEVEX0FUT01JQ19PUCAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1VOVFlQRURfQVRPTUlDX09QX1NJTUQ0WDIgICAgICAgICAgICAgMworI2RlZmluZSBIU1dfREFUQVBPUlRfRENfUE9SVDFfTUVESUFfQkxPQ0tfUkVBRCAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEhTV19EQVRBUE9SVF9EQ19QT1JUMV9UWVBFRF9TVVJGQUNFX1JFQUQgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1RZUEVEX0FUT01JQ19PUCAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBIU1dfREFUQVBPUlRfRENfUE9SVDFfVFlQRURfQVRPTUlDX09QX1NJTUQ0WDIgICAgICAgICAgICAgICA3CisjZGVmaW5lIEhTV19EQVRBUE9SVF9EQ19QT1JUMV9VTlRZUEVEX1NVUkZBQ0VfV1JJVEUgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX01FRElBX0JMT0NLX1dSSVRFICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX0FUT01JQ19DT1VOVEVSX09QICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX0FUT01JQ19DT1VOVEVSX09QX1NJTUQ0WDIgICAgICAgICAgICAgMTIKKyNkZWZpbmUgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1RZUEVEX1NVUkZBQ0VfV1JJVEUgICAgICAgICAgICAgICAgICAgMTMKKworLyogZGF0YXBvcnQgYXRvbWljIG9wZXJhdGlvbnMuICovCisjZGVmaW5lIEJSV19BT1BfQU5EICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlJXX0FPUF9PUiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCUldfQU9QX1hPUiAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJSV19BT1BfTU9WICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQlJXX0FPUF9JTkMgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCUldfQU9QX0RFQyAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIEJSV19BT1BfQUREICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQlJXX0FPUF9TVUIgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBCUldfQU9QX1JFVlNVQiAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEJSV19BT1BfSU1BWCAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEJSV19BT1BfSU1JTiAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIEJSV19BT1BfVU1BWCAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEJSV19BT1BfVU1JTiAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIEJSV19BT1BfQ01QV1IgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIEJSV19BT1BfUFJFREVDICAgICAgICAgICAgICAgIDE1CisKKyNkZWZpbmUgQlJXX01BVEhfRlVOQ1RJT05fSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCUldfTUFUSF9GVU5DVElPTl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJSV19NQVRIX0ZVTkNUSU9OX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlJXX01BVEhfRlVOQ1RJT05fU1FSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBCUldfTUFUSF9GVU5DVElPTl9SU1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJSV19NQVRIX0ZVTkNUSU9OX1NJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlJXX01BVEhfRlVOQ1RJT05fQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBCUldfTUFUSF9GVU5DVElPTl9TSU5DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC8qIGdlbjQsIGdlbjUgKi8KKyNkZWZpbmUgQlJXX01BVEhfRlVOQ1RJT05fRkRJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAvKiBnZW42KyAqLworI2RlZmluZSBCUldfTUFUSF9GVU5DVElPTl9QT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBCUldfTUFUSF9GVU5DVElPTl9JTlRfRElWX1FVT1RJRU5UX0FORF9SRU1BSU5ERVIgICAxMQorI2RlZmluZSBCUldfTUFUSF9GVU5DVElPTl9JTlRfRElWX1FVT1RJRU5UICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBCUldfTUFUSF9GVU5DVElPTl9JTlRfRElWX1JFTUFJTkRFUiAgICAgICAgICAgICAgICAxMworI2RlZmluZSBHRU44X01BVEhfRlVOQ1RJT05fSU5WTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBHRU44X01BVEhfRlVOQ1RJT05fUlNRUlRNICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisjZGVmaW5lIEJSV19NQVRIX0lOVEVHRVJfVU5TSUdORUQgICAgIDAKKyNkZWZpbmUgQlJXX01BVEhfSU5URUdFUl9TSUdORUQgICAgICAgMQorCisjZGVmaW5lIEJSV19NQVRIX1BSRUNJU0lPTl9GVUxMICAgICAgICAwCisjZGVmaW5lIEJSV19NQVRIX1BSRUNJU0lPTl9QQVJUSUFMICAgICAxCisKKyNkZWZpbmUgQlJXX01BVEhfU0FUVVJBVEVfTk9ORSAgICAgICAgIDAKKyNkZWZpbmUgQlJXX01BVEhfU0FUVVJBVEVfU0FUVVJBVEUgICAgIDEKKworI2RlZmluZSBCUldfTUFUSF9EQVRBX1ZFQ1RPUiAgMAorI2RlZmluZSBCUldfTUFUSF9EQVRBX1NDQUxBUiAgMQorCisjZGVmaW5lIEJSV19VUkJfT1BDT0RFX1dSSVRFX0hXT1JEICAwCisjZGVmaW5lIEJSV19VUkJfT1BDT0RFX1dSSVRFX09XT1JEICAxCisKKyNkZWZpbmUgQlJXX1VSQl9TV0laWkxFX05PTkUgICAgICAgICAgMAorI2RlZmluZSBCUldfVVJCX1NXSVpaTEVfSU5URVJMRUFWRSAgICAxCisjZGVmaW5lIEJSV19VUkJfU1dJWlpMRV9UUkFOU1BPU0UgICAgIDIKKworI2RlZmluZSBCUldfU0NSQVRDSF9TUEFDRV9TSVpFXzFLICAgICAwCisjZGVmaW5lIEJSV19TQ1JBVENIX1NQQUNFX1NJWkVfMksgICAgIDEKKyNkZWZpbmUgQlJXX1NDUkFUQ0hfU1BBQ0VfU0laRV80SyAgICAgMgorI2RlZmluZSBCUldfU0NSQVRDSF9TUEFDRV9TSVpFXzhLICAgICAzCisjZGVmaW5lIEJSV19TQ1JBVENIX1NQQUNFX1NJWkVfMTZLICAgIDQKKyNkZWZpbmUgQlJXX1NDUkFUQ0hfU1BBQ0VfU0laRV8zMksgICAgNQorI2RlZmluZSBCUldfU0NSQVRDSF9TUEFDRV9TSVpFXzY0SyAgICA2CisjZGVmaW5lIEJSV19TQ1JBVENIX1NQQUNFX1NJWkVfMTI4SyAgIDcKKyNkZWZpbmUgQlJXX1NDUkFUQ0hfU1BBQ0VfU0laRV8yNTZLICAgOAorI2RlZmluZSBCUldfU0NSQVRDSF9TUEFDRV9TSVpFXzUxMksgICA5CisjZGVmaW5lIEJSV19TQ1JBVENIX1NQQUNFX1NJWkVfMU0gICAgIDEwCisjZGVmaW5lIEJSV19TQ1JBVENIX1NQQUNFX1NJWkVfMk0gICAgIDExCisKKworI2RlZmluZSBDTURfVVJCX0ZFTkNFICAgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgQ01EX0NTX1VSQl9TVEFURSAgICAgICAgICAgICAgMHg2MDAxCisjZGVmaW5lIENNRF9DT05TVF9CVUZGRVIgICAgICAgICAgICAgIDB4NjAwMgorCisjZGVmaW5lIENNRF9TVEFURV9CQVNFX0FERFJFU1MgICAgICAgIDB4NjEwMQorI2RlZmluZSBDTURfU1RBVEVfU0lQICAgICAgICAgICAgICAgICAweDYxMDIKKyNkZWZpbmUgQ01EX1BJUEVMSU5FX1NFTEVDVF85NjUgICAgICAgMHg2MTA0CisjZGVmaW5lIENNRF9QSVBFTElORV9TRUxFQ1RfR000NSAgICAgIDB4NjkwNAorCisjZGVmaW5lIF8zRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUwkJMHg3ODAwCisjZGVmaW5lIF8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMJCTB4NzgwMQorIyBkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX01PRElGWV9WUwkoMSA8PCA4KQorIyBkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX01PRElGWV9HUwkoMSA8PCA5KQorIyBkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX01PRElGWV9QUwkoMSA8PCAxMikKKworI2RlZmluZSBfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX1ZTCTB4NzgyNiAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0hTCTB4NzgyNyAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0RTCTB4NzgyOCAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0dTCTB4NzgyOSAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX1BTCTB4NzgyQSAvKiBHRU43KyAqLworCisjZGVmaW5lIF8zRFNUQVRFX1NBTVBMRVJfU1RBVEVfUE9JTlRFUlMJCTB4NzgwMiAvKiBHRU42KyAqLworIyBkZWZpbmUgUFNfU0FNUExFUl9TVEFURV9DSEFOR0UJCQkJKDEgPDwgMTIpCisjIGRlZmluZSBHU19TQU1QTEVSX1NUQVRFX0NIQU5HRQkJCQkoMSA8PCA5KQorIyBkZWZpbmUgVlNfU0FNUExFUl9TVEFURV9DSEFOR0UJCQkJKDEgPDwgOCkKKy8qIERXMTogVlMgKi8KKy8qIERXMjogR1MgKi8KKy8qIERXMzogUFMgKi8KKworI2RlZmluZSBfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX1ZTCTB4NzgyQiAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX0dTCTB4NzgyRSAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX1BTCTB4NzgyRiAvKiBHRU43KyAqLworCisjZGVmaW5lIF8zRFNUQVRFX1ZFUlRFWF9CVUZGRVJTICAgICAgIDB4NzgwOAorIyBkZWZpbmUgQlJXX1ZCMF9JTkRFWF9TSElGVAkJMjcKKyMgZGVmaW5lIEdFTjZfVkIwX0lOREVYX1NISUZUCQkyNgorIyBkZWZpbmUgQlJXX1ZCMF9BQ0NFU1NfVkVSVEVYREFUQQkoMCA8PCAyNikKKyMgZGVmaW5lIEJSV19WQjBfQUNDRVNTX0lOU1RBTkNFREFUQQkoMSA8PCAyNikKKyMgZGVmaW5lIEdFTjZfVkIwX0FDQ0VTU19WRVJURVhEQVRBCSgwIDw8IDIwKQorIyBkZWZpbmUgR0VONl9WQjBfQUNDRVNTX0lOU1RBTkNFREFUQQkoMSA8PCAyMCkKKyMgZGVmaW5lIEdFTjdfVkIwX0FERFJFU1NfTU9ESUZZRU5BQkxFICAoMSA8PCAxNCkKKyMgZGVmaW5lIEJSV19WQjBfUElUQ0hfU0hJRlQJCTAKKworI2RlZmluZSBfM0RTVEFURV9WRVJURVhfRUxFTUVOVFMgICAgICAweDc4MDkKKyMgZGVmaW5lIEJSV19WRTBfSU5ERVhfU0hJRlQJCTI3CisjIGRlZmluZSBHRU42X1ZFMF9JTkRFWF9TSElGVAkJMjYKKyMgZGVmaW5lIEJSV19WRTBfRk9STUFUX1NISUZUCQkxNgorIyBkZWZpbmUgQlJXX1ZFMF9WQUxJRAkJCSgxIDw8IDI2KQorIyBkZWZpbmUgR0VONl9WRTBfVkFMSUQJCQkoMSA8PCAyNSkKKyMgZGVmaW5lIEdFTjZfVkUwX0VER0VfRkxBR19FTkFCTEUJKDEgPDwgMTUpCisjIGRlZmluZSBCUldfVkUwX1NSQ19PRkZTRVRfU0hJRlQJMAorIyBkZWZpbmUgQlJXX1ZFMV9DT01QT05FTlRfTk9TVE9SRQkwCisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV9TUkMJMQorIyBkZWZpbmUgQlJXX1ZFMV9DT01QT05FTlRfU1RPUkVfMAkyCisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV8xX0ZMVAkzCisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV8xX0lOVAk0CisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF9TVE9SRV9WSUQJNQorIyBkZWZpbmUgQlJXX1ZFMV9DT01QT05FTlRfU1RPUkVfSUlECTYKKyMgZGVmaW5lIEJSV19WRTFfQ09NUE9ORU5UX1NUT1JFX1BJRAk3CisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF8wX1NISUZUCTI4CisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF8xX1NISUZUCTI0CisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF8yX1NISUZUCTIwCisjIGRlZmluZSBCUldfVkUxX0NPTVBPTkVOVF8zX1NISUZUCTE2CisjIGRlZmluZSBCUldfVkUxX0RTVF9PRkZTRVRfU0hJRlQJMAorCisjZGVmaW5lIENNRF9JTkRFWF9CVUZGRVIgICAgICAgICAgICAgIDB4NzgwYQorI2RlZmluZSBHRU40XzNEU1RBVEVfVkZfU1RBVElTVElDUwkJMHg3ODBiCisjZGVmaW5lIEdNNDVfM0RTVEFURV9WRl9TVEFUSVNUSUNTCQkweDY4MGIKKyNkZWZpbmUgXzNEU1RBVEVfQ0NfU1RBVEVfUE9JTlRFUlMJCTB4NzgwZSAvKiBHRU42KyAqLworI2RlZmluZSBfM0RTVEFURV9CTEVORF9TVEFURV9QT0lOVEVSUwkJMHg3ODI0IC8qIEdFTjcrICovCisjZGVmaW5lIF8zRFNUQVRFX0RFUFRIX1NURU5DSUxfU1RBVEVfUE9JTlRFUlMJMHg3ODI1IC8qIEdFTjcrICovCisKKyNkZWZpbmUgXzNEU1RBVEVfVVJCCQkJCTB4NzgwNSAvKiBHRU42ICovCisjIGRlZmluZSBHRU42X1VSQl9WU19TSVpFX1NISUZUCQkJCTE2CisjIGRlZmluZSBHRU42X1VSQl9WU19FTlRSSUVTX1NISUZUCQkJMAorIyBkZWZpbmUgR0VONl9VUkJfR1NfRU5UUklFU19TSElGVAkJCTgKKyMgZGVmaW5lIEdFTjZfVVJCX0dTX1NJWkVfU0hJRlQJCQkJMAorCisjZGVmaW5lIF8zRFNUQVRFX1ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDc4MGMgLyogR0VONy41KyAqLworI2RlZmluZSBIU1dfQ1VUX0lOREVYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQorCisjZGVmaW5lIF8zRFNUQVRFX1ZGX0lOU1RBTkNJTkcgICAgICAgICAgICAgICAgICAweDc4NDkgLyogR0VOOCsgKi8KKyMgZGVmaW5lIEdFTjhfVkZfSU5TVEFOQ0lOR19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKworI2RlZmluZSBfM0RTVEFURV9WRl9TR1ZTICAgICAgICAgICAgICAgICAgICAgICAgMHg3ODRhIC8qIEdFTjgrICovCisjIGRlZmluZSBHRU44X1NHVlNfRU5BQkxFX0lOU1RBTkNFX0lEICAgICAgICAgICAgICAgICAgICgxIDw8IDMxKQorIyBkZWZpbmUgR0VOOF9TR1ZTX0lOU1RBTkNFX0lEX0NPTVBPTkVOVF9TSElGVCAgICAgICAgICAyOQorIyBkZWZpbmUgR0VOOF9TR1ZTX0lOU1RBTkNFX0lEX0VMRU1FTlRfT0ZGU0VUX1NISUZUICAgICAxNgorIyBkZWZpbmUgR0VOOF9TR1ZTX0VOQUJMRV9WRVJURVhfSUQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkKKyMgZGVmaW5lIEdFTjhfU0dWU19WRVJURVhfSURfQ09NUE9ORU5UX1NISUZUICAgICAgICAgICAgMTMKKyMgZGVmaW5lIEdFTjhfU0dWU19WRVJURVhfSURfRUxFTUVOVF9PRkZTRVRfU0hJRlQgICAgICAgMAorCisjZGVmaW5lIF8zRFNUQVRFX1ZGX1RPUE9MT0dZICAgICAgICAgICAgICAgICAgICAweDc4NGIgLyogR0VOOCsgKi8KKworI2RlZmluZSBfM0RTVEFURV9XTV9DSFJPTUFLRVkJCQkweDc4NGMgLyogR0VOOCsgKi8KKworI2RlZmluZSBfM0RTVEFURV9VUkJfVlMgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ODMwIC8qIEdFTjcrICovCisjZGVmaW5lIF8zRFNUQVRFX1VSQl9IUyAgICAgICAgICAgICAgICAgICAgICAgICAweDc4MzEgLyogR0VONysgKi8KKyNkZWZpbmUgXzNEU1RBVEVfVVJCX0RTICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzgzMiAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9VUkJfR1MgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ODMzIC8qIEdFTjcrICovCisjIGRlZmluZSBHRU43X1VSQl9FTlRSWV9TSVpFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE2CisjIGRlZmluZSBHRU43X1VSQl9TVEFSVElOR19BRERSRVNTX1NISUZUICAgICAgICAgICAgICAgIDI1CisKKy8qICJHUyBVUkIgRW50cnkgQWxsb2NhdGlvbiBTaXplIiBpcyBhIFU5LTEgZmllbGQsIHNvIHRoZSBtYXhpbXVtIGdzX3NpemUKKyAqIGlzIDJeOSwgb3IgNTEyLiAgSXQncyBjb3VudGVkIGluIG11bHRpcGxlcyBvZiA2NCBieXRlcy4KKyAqLworI2RlZmluZSBHRU43X01BWF9HU19VUkJfRU5UUllfU0laRV9CWVRFUwkJKDUxMio2NCkKKworI2RlZmluZSBfM0RTVEFURV9QVVNIX0NPTlNUQU5UX0FMTE9DX1ZTICAgICAgICAgMHg3OTEyIC8qIEdFTjcrICovCisjZGVmaW5lIF8zRFNUQVRFX1BVU0hfQ09OU1RBTlRfQUxMT0NfR1MgICAgICAgICAweDc5MTUgLyogR0VONysgKi8KKyNkZWZpbmUgXzNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19QUyAgICAgICAgIDB4NzkxNiAvKiBHRU43KyAqLworIyBkZWZpbmUgR0VON19QVVNIX0NPTlNUQU5UX0JVRkZFUl9PRkZTRVRfU0hJRlQgICAgICAgICAxNgorCisjZGVmaW5lIF8zRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTCTB4NzgwZCAvKiBHRU42KyAqLworIyBkZWZpbmUgR0VONl9DQ19WSUVXUE9SVF9NT0RJRlkJCQkoMSA8PCAxMikKKyMgZGVmaW5lIEdFTjZfU0ZfVklFV1BPUlRfTU9ESUZZCQkJKDEgPDwgMTEpCisjIGRlZmluZSBHRU42X0NMSVBfVklFV1BPUlRfTU9ESUZZCQkJKDEgPDwgMTApCisjIGRlZmluZSBHRU43X05VTV9WSUVXUE9SVFMJCQkJMTYKKworI2RlZmluZSBfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19DQwkweDc4MjMgLyogR0VONysgKi8KKyNkZWZpbmUgXzNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlNfU0ZfQ0wJMHg3ODIxIC8qIEdFTjcrICovCisKKyNkZWZpbmUgXzNEU1RBVEVfU0NJU1NPUl9TVEFURV9QT0lOVEVSUwkJMHg3ODBmIC8qIEdFTjYrICovCisKKyNkZWZpbmUgXzNEU1RBVEVfVlMJCQkJMHg3ODEwIC8qIEdFTjYrICovCisvKiBEVzIgKi8KKyMgZGVmaW5lIEdFTjZfVlNfU1BGX01PREUJCQkJKDEgPDwgMzEpCisjIGRlZmluZSBHRU42X1ZTX1ZFQ1RPUl9NQVNLX0VOQUJMRQkJCSgxIDw8IDMwKQorIyBkZWZpbmUgR0VONl9WU19TQU1QTEVSX0NPVU5UX1NISUZUCQkJMjcKKyMgZGVmaW5lIEdFTjZfVlNfQklORElOR19UQUJMRV9FTlRSWV9DT1VOVF9TSElGVAkxOAorIyBkZWZpbmUgR0VONl9WU19GTE9BVElOR19QT0lOVF9NT0RFX0lFRUVfNzU0CQkoMCA8PCAxNikKKyMgZGVmaW5lIEdFTjZfVlNfRkxPQVRJTkdfUE9JTlRfTU9ERV9BTFQJCSgxIDw8IDE2KQorLyogRFc0ICovCisjIGRlZmluZSBHRU42X1ZTX0RJU1BBVENIX1NUQVJUX0dSRl9TSElGVAkJMjAKKyMgZGVmaW5lIEdFTjZfVlNfVVJCX1JFQURfTEVOR1RIX1NISUZUCQkJMTEKKyMgZGVmaW5lIEdFTjZfVlNfVVJCX0VOVFJZX1JFQURfT0ZGU0VUX1NISUZUCQk0CisvKiBEVzUgKi8KKyMgZGVmaW5lIEdFTjZfVlNfTUFYX1RIUkVBRFNfU0hJRlQJCQkyNQorIyBkZWZpbmUgSFNXX1ZTX01BWF9USFJFQURTX1NISUZUCQkJMjMKKyMgZGVmaW5lIEdFTjZfVlNfU1RBVElTVElDU19FTkFCTEUJCQkoMSA8PCAxMCkKKyMgZGVmaW5lIEdFTjZfVlNfQ0FDSEVfRElTQUJMRQkJCQkoMSA8PCAxKQorIyBkZWZpbmUgR0VONl9WU19FTkFCTEUJCQkJCSgxIDw8IDApCisvKiBHZW44KyBEVzggKi8KKyMgZGVmaW5lIEdFTjhfVlNfVVJCX0VOVFJZX09VVFBVVF9PRkZTRVRfU0hJRlQgICAgICAgICAgMjEKKyMgZGVmaW5lIEdFTjhfVlNfVVJCX09VVFBVVF9MRU5HVEhfU0hJRlQgICAgICAgICAgICAgICAgMTYKKyMgZGVmaW5lIEdFTjhfVlNfVVNFUl9DTElQX0RJU1RBTkNFX1NISUZUICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIF8zRFNUQVRFX0dTCQkgICAgICAJCTB4NzgxMSAvKiBHRU42KyAqLworLyogRFcyICovCisjIGRlZmluZSBHRU42X0dTX1NQRl9NT0RFCQkJCSgxIDw8IDMxKQorIyBkZWZpbmUgR0VONl9HU19WRUNUT1JfTUFTS19FTkFCTEUJCQkoMSA8PCAzMCkKKyMgZGVmaW5lIEdFTjZfR1NfU0FNUExFUl9DT1VOVF9TSElGVAkJCTI3CisjIGRlZmluZSBHRU42X0dTX0JJTkRJTkdfVEFCTEVfRU5UUllfQ09VTlRfU0hJRlQJMTgKKyMgZGVmaW5lIEdFTjZfR1NfRkxPQVRJTkdfUE9JTlRfTU9ERV9JRUVFXzc1NAkJKDAgPDwgMTYpCisjIGRlZmluZSBHRU42X0dTX0ZMT0FUSU5HX1BPSU5UX01PREVfQUxUCQkoMSA8PCAxNikKKy8qIERXNCAqLworIyBkZWZpbmUgR0VON19HU19PVVRQVVRfVkVSVEVYX1NJWkVfU0hJRlQJCTIzCisjIGRlZmluZSBHRU43X0dTX09VVFBVVF9UT1BPTE9HWV9TSElGVAkJCTE3CisjIGRlZmluZSBHRU42X0dTX1VSQl9SRUFEX0xFTkdUSF9TSElGVAkJCTExCisjIGRlZmluZSBHRU43X0dTX0lOQ0xVREVfVkVSVEVYX0hBTkRMRVMJCSAgICAgICAgKDEgPDwgMTApCisjIGRlZmluZSBHRU42X0dTX1VSQl9FTlRSWV9SRUFEX09GRlNFVF9TSElGVAkJNAorIyBkZWZpbmUgR0VONl9HU19ESVNQQVRDSF9TVEFSVF9HUkZfU0hJRlQJCTAKKy8qIERXNSAqLworIyBkZWZpbmUgR0VONl9HU19NQVhfVEhSRUFEU19TSElGVAkJCTI1CisjIGRlZmluZSBIU1dfR1NfTUFYX1RIUkVBRFNfU0hJRlQJCQkyNAorIyBkZWZpbmUgSVZCX0dTX0NPTlRST0xfREFUQV9GT1JNQVRfU0hJRlQJCTI0CisjIGRlZmluZSBHRU43X0dTX0NPTlRST0xfREFUQV9GT1JNQVRfR1NDVExfQ1VUCQkwCisjIGRlZmluZSBHRU43X0dTX0NPTlRST0xfREFUQV9GT1JNQVRfR1NDVExfU0lECQkxCisjIGRlZmluZSBHRU43X0dTX0NPTlRST0xfREFUQV9IRUFERVJfU0laRV9TSElGVAkJMjAKKyMgZGVmaW5lIEdFTjdfR1NfSU5TVEFOQ0VfQ09OVFJPTF9TSElGVAkJCTE1CisjIGRlZmluZSBHRU43X0dTX0RJU1BBVENIX01PREVfU0lOR0xFCQkJKDAgPDwgMTEpCisjIGRlZmluZSBHRU43X0dTX0RJU1BBVENIX01PREVfRFVBTF9JTlNUQU5DRQkJKDEgPDwgMTEpCisjIGRlZmluZSBHRU43X0dTX0RJU1BBVENIX01PREVfRFVBTF9PQkpFQ1QJCSgyIDw8IDExKQorIyBkZWZpbmUgR0VONl9HU19TVEFUSVNUSUNTX0VOQUJMRQkJCSgxIDw8IDEwKQorIyBkZWZpbmUgR0VONl9HU19TT19TVEFUSVNUSUNTX0VOQUJMRQkJCSgxIDw8IDkpCisjIGRlZmluZSBHRU42X0dTX1JFTkRFUklOR19FTkFCTEUJCQkoMSA8PCA4KQorIyBkZWZpbmUgR0VON19HU19JTkNMVURFX1BSSU1JVElWRV9JRAkJCSgxIDw8IDQpCisjIGRlZmluZSBHRU43X0dTX1JFT1JERVJfVFJBSUxJTkcJCQkoMSA8PCAyKQorIyBkZWZpbmUgR0VON19HU19FTkFCTEUJCQkJCSgxIDw8IDApCisvKiBEVzYgKi8KKyMgZGVmaW5lIEhTV19HU19DT05UUk9MX0RBVEFfRk9STUFUX1NISUZUCQkzMQorIyBkZWZpbmUgR0VONl9HU19SRU9SREVSCQkJCSgxIDw8IDMwKQorIyBkZWZpbmUgR0VONl9HU19ESVNDQVJEX0FESkFDRU5DWQkJCSgxIDw8IDI5KQorIyBkZWZpbmUgR0VONl9HU19TVkJJX1BBWUxPQURfRU5BQkxFCQkJKDEgPDwgMjgpCisjIGRlZmluZSBHRU42X0dTX1NWQklfUE9TVElOQ1JFTUVOVF9FTkFCTEUJCSgxIDw8IDI3KQorIyBkZWZpbmUgR0VONl9HU19TVkJJX1BPU1RJTkNSRU1FTlRfVkFMVUVfU0hJRlQJCTE2CisjIGRlZmluZSBHRU42X0dTX1NWQklfUE9TVElOQ1JFTUVOVF9WQUxVRV9NQVNLCQlJTlRFTF9NQVNLKDI1LCAxNikKKyMgZGVmaW5lIEdFTjZfR1NfRU5BQkxFCQkJCQkoMSA8PCAxNSkKKworLyogR2VuOCsgRFc5ICovCisjIGRlZmluZSBHRU44X0dTX1VSQl9FTlRSWV9PVVRQVVRfT0ZGU0VUX1NISUZUICAgICAgICAgIDIxCisjIGRlZmluZSBHRU44X0dTX1VSQl9PVVRQVVRfTEVOR1RIX1NISUZUICAgICAgICAgICAgICAgIDE2CisjIGRlZmluZSBHRU44X0dTX1VTRVJfQ0xJUF9ESVNUQU5DRV9TSElGVCAgICAgICAgICAgICAgIDgKKworIyBkZWZpbmUgQlJXX0dTX0VER0VfSU5ESUNBVE9SXzAJCQkoMSA8PCA4KQorIyBkZWZpbmUgQlJXX0dTX0VER0VfSU5ESUNBVE9SXzEJCQkoMSA8PCA5KQorCisvKiBHUyBUaHJlYWQgUGF5bG9hZAorICovCisvKiBSMCAqLworIyBkZWZpbmUgR0VON19HU19QQVlMT0FEX0lOU1RBTkNFX0lEX1NISUZUCQkyNworCisvKiAzRFNUQVRFX0dTICJPdXRwdXQgVmVydGV4IFNpemUiIGhhcyBhbiBlZmZlY3RpdmUgbWF4aW11bSBvZiA2Mi4gIEl0J3MKKyAqIGNvdW50ZWQgaW4gbXVsdGlwbGVzIG9mIDE2IGJ5dGVzLgorICovCisjZGVmaW5lIEdFTjdfTUFYX0dTX09VVFBVVF9WRVJURVhfU0laRV9CWVRFUwkJKDYyKjE2KQorCisjZGVmaW5lIF8zRFNUQVRFX0hTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDc4MUIgLyogR0VONysgKi8KKyNkZWZpbmUgXzNEU1RBVEVfVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzgxQyAvKiBHRU43KyAqLworI2RlZmluZSBfM0RTVEFURV9EUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ODFEIC8qIEdFTjcrICovCisKKyNkZWZpbmUgXzNEU1RBVEVfQ0xJUAkJCQkweDc4MTIgLyogR0VONisgKi8KKy8qIERXMSAqLworIyBkZWZpbmUgR0VON19DTElQX1dJTkRJTkdfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCAyMCkKKyMgZGVmaW5lIEdFTjdfQ0xJUF9XSU5ESU5HX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjApCisjIGRlZmluZSBHRU43X0NMSVBfVkVSVEVYX1NVQlBJWEVMX1BSRUNJU0lPTl84ICAgICAgICAgICgwIDw8IDE5KQorIyBkZWZpbmUgR0VON19DTElQX1ZFUlRFWF9TVUJQSVhFTF9QUkVDSVNJT05fNCAgICAgICAgICAoMSA8PCAxOSkKKyMgZGVmaW5lIEdFTjdfQ0xJUF9FQVJMWV9DVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTgpCisjIGRlZmluZSBHRU43X0NMSVBfQ1VMTE1PREVfQk9USCAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDE2KQorIyBkZWZpbmUgR0VON19DTElQX0NVTExNT0RFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgZGVmaW5lIEdFTjdfQ0xJUF9DVUxMTU9ERV9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgKDIgPDwgMTYpCisjIGRlZmluZSBHRU43X0NMSVBfQ1VMTE1PREVfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICgzIDw8IDE2KQorIyBkZWZpbmUgR0VONl9DTElQX1NUQVRJU1RJQ1NfRU5BQkxFCQkJKDEgPDwgMTApCisvKioKKyAqIEp1c3QgZG9lcyBjaGVhcCBjdWxsaW5nIGJhc2VkIG9uIHRoZSBjbGlwIGRpc3RhbmNlLiAgQml0cyBtdXN0IGJlCisgKiBkaXNqb2ludCB3aXRoIFVTRVJfQ0xJUF9DTElQX0RJU1RBTkNFIGJpdHMuCisgKi8KKyMgZGVmaW5lIEdFTjZfVVNFUl9DTElQX0NVTExfRElTVEFOQ0VTX1NISUZUCQkwCisvKiBEVzIgKi8KKyMgZGVmaW5lIEdFTjZfQ0xJUF9FTkFCTEUJCQkJKDEgPDwgMzEpCisjIGRlZmluZSBHRU42X0NMSVBfQVBJX09HTAkJCQkoMCA8PCAzMCkKKyMgZGVmaW5lIEdFTjZfQ0xJUF9BUElfRDNECQkJCSgxIDw8IDMwKQorIyBkZWZpbmUgR0VONl9DTElQX1hZX1RFU1QJCQkJKDEgPDwgMjgpCisjIGRlZmluZSBHRU42X0NMSVBfWl9URVNUCQkJCSgxIDw8IDI3KQorIyBkZWZpbmUgR0VONl9DTElQX0dCX1RFU1QJCQkJKDEgPDwgMjYpCisvKiogOC1iaXQgZmllbGQgb2Ygd2hpY2ggdXNlciBjbGlwIGRpc3RhbmNlcyB0byBjbGlwIGFnYWluc3QuICovCisjIGRlZmluZSBHRU42X1VTRVJfQ0xJUF9DTElQX0RJU1RBTkNFU19TSElGVAkJMTYKKyMgZGVmaW5lIEdFTjZfQ0xJUF9NT0RFX05PUk1BTAkJCQkoMCA8PCAxMykKKyMgZGVmaW5lIEdFTjZfQ0xJUF9NT0RFX1JFSkVDVF9BTEwJCQkoMyA8PCAxMykKKyMgZGVmaW5lIEdFTjZfQ0xJUF9NT0RFX0FDQ0VQVF9BTEwJCQkoNCA8PCAxMykKKyMgZGVmaW5lIEdFTjZfQ0xJUF9QRVJTUEVDVElWRV9ESVZJREVfRElTQUJMRQkJKDEgPDwgOSkKKyMgZGVmaW5lIEdFTjZfQ0xJUF9OT05fUEVSU1BFQ1RJVkVfQkFSWUNFTlRSSUNfRU5BQkxFCSgxIDw8IDgpCisjIGRlZmluZSBHRU42X0NMSVBfVFJJX1BST1ZPS0VfU0hJRlQJCQk0CisjIGRlZmluZSBHRU42X0NMSVBfTElORV9QUk9WT0tFX1NISUZUCQkJMgorIyBkZWZpbmUgR0VONl9DTElQX1RSSUZBTl9QUk9WT0tFX1NISUZUCQkJMAorLyogRFczICovCisjIGRlZmluZSBHRU42X0NMSVBfTUlOX1BPSU5UX1dJRFRIX1NISUZUCQkxNworIyBkZWZpbmUgR0VONl9DTElQX01BWF9QT0lOVF9XSURUSF9TSElGVAkJNgorIyBkZWZpbmUgR0VONl9DTElQX0ZPUkNFX1pFUk9fUlRBSU5ERVgJCQkoMSA8PCA1KQorIyBkZWZpbmUgR0VONl9DTElQX01BWF9WUF9JTkRFWF9NQVNLCQkJSU5URUxfTUFTSygzLCAwKQorCisjZGVmaW5lIF8zRFNUQVRFX1NGCQkJCTB4NzgxMyAvKiBHRU42KyAqLworLyogRFcxIChmb3IgZ2VuNikgKi8KKyMgZGVmaW5lIEdFTjZfU0ZfTlVNX09VVFBVVFNfU0hJRlQJCQkyMgorIyBkZWZpbmUgR0VONl9TRl9TV0laWkxFX0VOQUJMRQkJCQkoMSA8PCAyMSkKKyMgZGVmaW5lIEdFTjZfU0ZfUE9JTlRfU1BSSVRFX1VQUEVSTEVGVAkJCSgwIDw8IDIwKQorIyBkZWZpbmUgR0VONl9TRl9QT0lOVF9TUFJJVEVfTE9XRVJMRUZUCQkJKDEgPDwgMjApCisjIGRlZmluZSBHRU42X1NGX1VSQl9FTlRSWV9SRUFEX0xFTkdUSF9TSElGVAkJMTEKKyMgZGVmaW5lIEdFTjZfU0ZfVVJCX0VOVFJZX1JFQURfT0ZGU0VUX1NISUZUCQk0CisvKiBEVzIgKi8KKyMgZGVmaW5lIEdFTjZfU0ZfTEVHQUNZX0dMT0JBTF9ERVBUSF9CSUFTCQkoMSA8PCAxMSkKKyMgZGVmaW5lIEdFTjZfU0ZfU1RBVElTVElDU19FTkFCTEUJCQkoMSA8PCAxMCkKKyMgZGVmaW5lIEdFTjZfU0ZfR0xPQkFMX0RFUFRIX09GRlNFVF9TT0xJRAkJKDEgPDwgOSkKKyMgZGVmaW5lIEdFTjZfU0ZfR0xPQkFMX0RFUFRIX09GRlNFVF9XSVJFRlJBTUUJCSgxIDw8IDgpCisjIGRlZmluZSBHRU42X1NGX0dMT0JBTF9ERVBUSF9PRkZTRVRfUE9JTlQJCSgxIDw8IDcpCisjIGRlZmluZSBHRU42X1NGX0ZST05UX1NPTElECQkJCSgwIDw8IDUpCisjIGRlZmluZSBHRU42X1NGX0ZST05UX1dJUkVGUkFNRQkJCSgxIDw8IDUpCisjIGRlZmluZSBHRU42X1NGX0ZST05UX1BPSU5UCQkJCSgyIDw8IDUpCisjIGRlZmluZSBHRU42X1NGX0JBQ0tfU09MSUQJCQkJKDAgPDwgMykKKyMgZGVmaW5lIEdFTjZfU0ZfQkFDS19XSVJFRlJBTUUJCQkJKDEgPDwgMykKKyMgZGVmaW5lIEdFTjZfU0ZfQkFDS19QT0lOVAkJCQkoMiA8PCAzKQorIyBkZWZpbmUgR0VONl9TRl9WSUVXUE9SVF9UUkFOU0ZPUk1fRU5BQkxFCQkoMSA8PCAxKQorIyBkZWZpbmUgR0VONl9TRl9XSU5ESU5HX0NDVwkJCQkoMSA8PCAwKQorLyogRFczICovCisjIGRlZmluZSBHRU42X1NGX0xJTkVfQUFfRU5BQkxFCQkJCSgxIDw8IDMxKQorIyBkZWZpbmUgR0VONl9TRl9DVUxMX0JPVEgJCQkJKDAgPDwgMjkpCisjIGRlZmluZSBHRU42X1NGX0NVTExfTk9ORQkJCQkoMSA8PCAyOSkKKyMgZGVmaW5lIEdFTjZfU0ZfQ1VMTF9GUk9OVAkJCQkoMiA8PCAyOSkKKyMgZGVmaW5lIEdFTjZfU0ZfQ1VMTF9CQUNLCQkJCSgzIDw8IDI5KQorIyBkZWZpbmUgR0VONl9TRl9MSU5FX1dJRFRIX1NISUZUCQkJMTggLyogVTMuNyAqLworIyBkZWZpbmUgR0VONl9TRl9MSU5FX0VORF9DQVBfV0lEVEhfMF81CQkJKDAgPDwgMTYpCisjIGRlZmluZSBHRU42X1NGX0xJTkVfRU5EX0NBUF9XSURUSF8xXzAJCQkoMSA8PCAxNikKKyMgZGVmaW5lIEdFTjZfU0ZfTElORV9FTkRfQ0FQX1dJRFRIXzJfMAkJCSgyIDw8IDE2KQorIyBkZWZpbmUgR0VONl9TRl9MSU5FX0VORF9DQVBfV0lEVEhfNF8wCQkJKDMgPDwgMTYpCisjIGRlZmluZSBHRU42X1NGX1NDSVNTT1JfRU5BQkxFCQkJCSgxIDw8IDExKQorIyBkZWZpbmUgR0VONl9TRl9NU1JBU1RfT0ZGX1BJWEVMCQkJKDAgPDwgOCkKKyMgZGVmaW5lIEdFTjZfU0ZfTVNSQVNUX09GRl9QQVRURVJOCQkJKDEgPDwgOCkKKyMgZGVmaW5lIEdFTjZfU0ZfTVNSQVNUX09OX1BJWEVMCQkJKDIgPDwgOCkKKyMgZGVmaW5lIEdFTjZfU0ZfTVNSQVNUX09OX1BBVFRFUk4JCQkoMyA8PCA4KQorLyogRFc0ICovCisjIGRlZmluZSBHRU42X1NGX1RSSV9QUk9WT0tFX1NISUZUCQkJMjkKKyMgZGVmaW5lIEdFTjZfU0ZfTElORV9QUk9WT0tFX1NISUZUCQkJMjcKKyMgZGVmaW5lIEdFTjZfU0ZfVFJJRkFOX1BST1ZPS0VfU0hJRlQJCQkyNQorIyBkZWZpbmUgR0VONl9TRl9MSU5FX0FBX01PREVfTUFOSEFUVEFOCQkJKDAgPDwgMTQpCisjIGRlZmluZSBHRU42X1NGX0xJTkVfQUFfTU9ERV9UUlVFCQkJKDEgPDwgMTQpCisjIGRlZmluZSBHRU42X1NGX1ZFUlRFWF9TVUJQSVhFTF84QklUUwkJCSgwIDw8IDEyKQorIyBkZWZpbmUgR0VONl9TRl9WRVJURVhfU1VCUElYRUxfNEJJVFMJCQkoMSA8PCAxMikKKyMgZGVmaW5lIEdFTjZfU0ZfVVNFX1NUQVRFX1BPSU5UX1dJRFRICQkJKDEgPDwgMTEpCisjIGRlZmluZSBHRU42X1NGX1BPSU5UX1dJRFRIX1NISUZUCQkJMCAvKiBVOC4zICovCisvKiBEVzU6IGRlcHRoIG9mZnNldCBjb25zdGFudCAqLworLyogRFc2OiBkZXB0aCBvZmZzZXQgc2NhbGUgKi8KKy8qIERXNzogZGVwdGggb2Zmc2V0IGNsYW1wICovCisvKiBEVzggKi8KKyMgZGVmaW5lIEFUVFJJQlVURV8xX09WRVJSSURFX1cJCQkJKDEgPDwgMzEpCisjIGRlZmluZSBBVFRSSUJVVEVfMV9PVkVSUklERV9aCQkJCSgxIDw8IDMwKQorIyBkZWZpbmUgQVRUUklCVVRFXzFfT1ZFUlJJREVfWQkJCQkoMSA8PCAyOSkKKyMgZGVmaW5lIEFUVFJJQlVURV8xX09WRVJSSURFX1gJCQkJKDEgPDwgMjgpCisjIGRlZmluZSBBVFRSSUJVVEVfMV9DT05TVF9TT1VSQ0VfU0hJRlQJCQkyNQorIyBkZWZpbmUgQVRUUklCVVRFXzFfU1dJWlpMRV9TSElGVAkJCTIyCisjIGRlZmluZSBBVFRSSUJVVEVfMV9TT1VSQ0VfU0hJRlQJCQkxNgorIyBkZWZpbmUgQVRUUklCVVRFXzBfT1ZFUlJJREVfVwkJCQkoMSA8PCAxNSkKKyMgZGVmaW5lIEFUVFJJQlVURV8wX09WRVJSSURFX1oJCQkJKDEgPDwgMTQpCisjIGRlZmluZSBBVFRSSUJVVEVfMF9PVkVSUklERV9ZCQkJCSgxIDw8IDEzKQorIyBkZWZpbmUgQVRUUklCVVRFXzBfT1ZFUlJJREVfWAkJCQkoMSA8PCAxMikKKyMgZGVmaW5lIEFUVFJJQlVURV8wX0NPTlNUX1NPVVJDRV9TSElGVAkJCTkKKyMgIGRlZmluZSBBVFRSSUJVVEVfQ09OU1RfMDAwMAkJCQkwCisjICBkZWZpbmUgQVRUUklCVVRFX0NPTlNUXzAwMDFfRkxPQVQJCQkxCisjICBkZWZpbmUgQVRUUklCVVRFX0NPTlNUXzExMTFfRkxPQVQJCQkyCisjICBkZWZpbmUgQVRUUklCVVRFX0NPTlNUX1BSSU1fSUQJCQkzCisjIGRlZmluZSBBVFRSSUJVVEVfMF9TV0laWkxFX1NISUZUCQkJNgorIyBkZWZpbmUgQVRUUklCVVRFXzBfU09VUkNFX1NISUZUCQkJMAorCisjIGRlZmluZSBBVFRSSUJVVEVfU1dJWlpMRV9JTlBVVEFUVFIgICAgICAgICAgICAgICAgICAgIDAKKyMgZGVmaW5lIEFUVFJJQlVURV9TV0laWkxFX0lOUFVUQVRUUl9GQUNJTkcgICAgICAgICAgICAgMQorIyBkZWZpbmUgQVRUUklCVVRFX1NXSVpaTEVfSU5QVVRBVFRSX1cgICAgICAgICAgICAgICAgICAyCisjIGRlZmluZSBBVFRSSUJVVEVfU1dJWlpMRV9JTlBVVEFUVFJfRkFDSU5HX1cgICAgICAgICAgIDMKKyMgZGVmaW5lIEFUVFJJQlVURV9TV0laWkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBEVzE2OiBQb2ludCBzcHJpdGUgdGV4dHVyZSBjb29yZGluYXRlIGVuYWJsZXMgKi8KKy8qIERXMTc6IENvbnN0YW50IGludGVycG9sYXRpb24gZW5hYmxlcyAqLworLyogRFcxODogYXR0ciAwLTcgd3JhcCBzaG9ydGVzdCBlbmFibGVzICovCisvKiBEVzE5OiBhdHRyIDgtMTYgd3JhcCBzaG9ydGVzdCBlbmFibGVzICovCisKKy8qIE9uIEdFTjcsIG1hbnkgZmllbGRzIG9mIDNEU1RBVEVfU0Ygd2VyZSBzcGxpdCBvdXQgaW50byBhIG5ldyBjb21tYW5kOgorICogM0RTVEFURV9TQkUuICBUaGUgcmVtYWluaW5nIGZpZWxkcyBsaXZlIGluIGRpZmZlcmVudCBEV29yZHMsIGJ1dCByZXRhaW4KKyAqIHRoZSBzYW1lIGJpdC1vZmZzZXQuICBUaGUgb25seSBuZXcgZmllbGQ6CisgKi8KKy8qIEdFTjcvRFcxOiAqLworIyBkZWZpbmUgR0VON19TRl9ERVBUSF9CVUZGRVJfU1VSRkFDRV9GT1JNQVRfU0hJRlQJMTIKKy8qIEdFTjcvRFcyOiAqLworIyBkZWZpbmUgSFNXX1NGX0xJTkVfU1RJUFBMRV9FTkFCTEUJCQkoMSA8PCAxNCkKKworIyBkZWZpbmUgR0VOOF9TRl9TTU9PVEhfUE9JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMykKKworI2RlZmluZSBfM0RTVEFURV9TQkUJCQkJMHg3ODFGIC8qIEdFTjcrICovCisvKiBEVzEgKi8KKyMgZGVmaW5lIEdFTjhfU0JFX0ZPUkNFX1VSQl9FTlRSWV9SRUFEX0xFTkdUSCAgICAgICAgICAgKDEgPDwgMjkpCisjIGRlZmluZSBHRU44X1NCRV9GT1JDRV9VUkJfRU5UUllfUkVBRF9PRkZTRVQgICAgICAgICAgICgxIDw8IDI4KQorIyBkZWZpbmUgR0VON19TQkVfU1dJWlpMRV9DT05UUk9MX01PREUJCQkoMSA8PCAyOCkKKyMgZGVmaW5lIEdFTjdfU0JFX05VTV9PVVRQVVRTX1NISUZUCQkJMjIKKyMgZGVmaW5lIEdFTjdfU0JFX1NXSVpaTEVfRU5BQkxFCQkJKDEgPDwgMjEpCisjIGRlZmluZSBHRU43X1NCRV9QT0lOVF9TUFJJVEVfTE9XRVJMRUZUCQkoMSA8PCAyMCkKKyMgZGVmaW5lIEdFTjdfU0JFX1VSQl9FTlRSWV9SRUFEX0xFTkdUSF9TSElGVAkJMTEKKyMgZGVmaW5lIEdFTjdfU0JFX1VSQl9FTlRSWV9SRUFEX09GRlNFVF9TSElGVAkJNAorIyBkZWZpbmUgR0VOOF9TQkVfVVJCX0VOVFJZX1JFQURfT0ZGU0VUX1NISUZUCQk1CisvKiBEVzItOTogQXR0cmlidXRlIHNldHVwIChzYW1lIGFzIERXOC0xNSBvZiBnZW42IF8zRFNUQVRFX1NGKSAqLworLyogRFcxMDogUG9pbnQgc3ByaXRlIHRleHR1cmUgY29vcmRpbmF0ZSBlbmFibGVzICovCisvKiBEVzExOiBDb25zdGFudCBpbnRlcnBvbGF0aW9uIGVuYWJsZXMgKi8KKy8qIERXMTI6IGF0dHIgMC03IHdyYXAgc2hvcnRlc3QgZW5hYmxlcyAqLworLyogRFcxMzogYXR0ciA4LTE2IHdyYXAgc2hvcnRlc3QgZW5hYmxlcyAqLworCisjZGVmaW5lIF8zRFNUQVRFX1NCRV9TV0laICAgICAgICAgICAgICAgICAgICAgICAweDc4NTEgLyogR0VOOCsgKi8KKworI2RlZmluZSBfM0RTVEFURV9SQVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ODUwIC8qIEdFTjgrICovCisvKiBEVzEgKi8KKyMgZGVmaW5lIEdFTjhfUkFTVEVSX0ZST05UX1dJTkRJTkdfQ0NXICAgICAgICAgICAgICAgICAgKDEgPDwgMjEpCisjIGRlZmluZSBHRU44X1JBU1RFUl9DVUxMX0JPVEggICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDE2KQorIyBkZWZpbmUgR0VOOF9SQVNURVJfQ1VMTF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgZGVmaW5lIEdFTjhfUkFTVEVSX0NVTExfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPDwgMTYpCisjIGRlZmluZSBHRU44X1JBU1RFUl9DVUxMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICgzIDw8IDE2KQorIyBkZWZpbmUgR0VOOF9SQVNURVJfU01PT1RIX1BPSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCAxMykKKyMgZGVmaW5lIEdFTjhfUkFTVEVSX0FQSV9NVUxUSVNBTVBMRV9FTkFCTEUgICAgICAgICAgICAgKDEgPDwgMTIpCisjIGRlZmluZSBHRU44X1JBU1RFUl9MSU5FX0FBX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjIGRlZmluZSBHRU44X1JBU1RFUl9TQ0lTU09SX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjIGRlZmluZSBHRU44X1JBU1RFUl9WSUVXUE9SVF9aX0NMSVBfVEVTVF9FTkFCTEUgICAgICAgICgxIDw8IDApCisKKy8qIEdlbjggQkxFTkRfU1RBVEUgKi8KKy8qIERXMCAqLworI2RlZmluZSBHRU44X0JMRU5EX0FMUEhBX1RPX0NPVkVSQUdFX0VOQUJMRSAgICAgICAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgR0VOOF9CTEVORF9JTkRFUEVOREVOVF9BTFBIQV9CTEVORF9FTkFCTEUgICAgICAgKDEgPDwgMzApCisjZGVmaW5lIEdFTjhfQkxFTkRfQUxQSEFfVE9fT05FX0VOQUJMRSAgICAgICAgICAgICAgICAgICgxIDw8IDI5KQorI2RlZmluZSBHRU44X0JMRU5EX0FMUEhBX1RPX0NPVkVSQUdFX0RJVEhFUl9FTkFCTEUgICAgICAoMSA8PCAyOCkKKyNkZWZpbmUgR0VOOF9CTEVORF9BTFBIQV9URVNUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjcpCisjZGVmaW5lIEdFTjhfQkxFTkRfQUxQSEFfVEVTVF9GVU5DVElPTl9NQVNLICAgICAgICAgICAgIElOVEVMX01BU0soMjYsIDI0KQorI2RlZmluZSBHRU44X0JMRU5EX0FMUEhBX1RFU1RfRlVOQ1RJT05fU0hJRlQgICAgICAgICAgICAyNAorI2RlZmluZSBHRU44X0JMRU5EX0NPTE9SX0RJVEhFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyNkZWZpbmUgR0VOOF9CTEVORF9YX0RJVEhFUl9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgSU5URUxfTUFTSygyMiwgMjEpCisjZGVmaW5lIEdFTjhfQkxFTkRfWF9ESVRIRVJfT0ZGU0VUX1NISUZUICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEdFTjhfQkxFTkRfWV9ESVRIRVJfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgIElOVEVMX01BU0soMjAsIDE5KQorI2RlZmluZSBHRU44X0JMRU5EX1lfRElUSEVSX09GRlNFVF9TSElGVCAgICAgICAgICAgICAgICAxOQorLyogRFcxICsgMm4gKi8KKyNkZWZpbmUgR0VOOF9CTEVORF9DT0xPUl9CVUZGRVJfQkxFTkRfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMzEpCisjZGVmaW5lIEdFTjhfQkxFTkRfU1JDX0JMRU5EX0ZBQ1RPUl9NQVNLICAgICAgICAgICAgICAgIElOVEVMX01BU0soMzAsIDI2KQorI2RlZmluZSBHRU44X0JMRU5EX1NSQ19CTEVORF9GQUNUT1JfU0hJRlQgICAgICAgICAgICAgICAyNgorI2RlZmluZSBHRU44X0JMRU5EX0RTVF9CTEVORF9GQUNUT1JfTUFTSyAgICAgICAgICAgICAgICBJTlRFTF9NQVNLKDI1LCAyMSkKKyNkZWZpbmUgR0VOOF9CTEVORF9EU1RfQkxFTkRfRkFDVE9SX1NISUZUICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgR0VOOF9CTEVORF9DT0xPUl9CTEVORF9GVU5DVElPTl9NQVNLICAgICAgICAgICAgSU5URUxfTUFTSygyMCwgMTgpCisjZGVmaW5lIEdFTjhfQkxFTkRfQ09MT1JfQkxFTkRfRlVOQ1RJT05fU0hJRlQgICAgICAgICAgIDE4CisjZGVmaW5lIEdFTjhfQkxFTkRfU1JDX0FMUEhBX0JMRU5EX0ZBQ1RPUl9NQVNLICAgICAgICAgIElOVEVMX01BU0soMTcsIDEzKQorI2RlZmluZSBHRU44X0JMRU5EX1NSQ19BTFBIQV9CTEVORF9GQUNUT1JfU0hJRlQgICAgICAgICAxMworI2RlZmluZSBHRU44X0JMRU5EX0RTVF9BTFBIQV9CTEVORF9GQUNUT1JfTUFTSyAgICAgICAgICBJTlRFTF9NQVNLKDEyLCA4KQorI2RlZmluZSBHRU44X0JMRU5EX0RTVF9BTFBIQV9CTEVORF9GQUNUT1JfU0hJRlQgICAgICAgICA4CisjZGVmaW5lIEdFTjhfQkxFTkRfQUxQSEFfQkxFTkRfRlVOQ1RJT05fTUFTSyAgICAgICAgICAgIElOVEVMX01BU0soNywgNSkKKyNkZWZpbmUgR0VOOF9CTEVORF9BTFBIQV9CTEVORF9GVU5DVElPTl9TSElGVCAgICAgICAgICAgNQorI2RlZmluZSBHRU44X0JMRU5EX1dSSVRFX0RJU0FCTEVfQUxQSEEgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBHRU44X0JMRU5EX1dSSVRFX0RJU0FCTEVfUkVEICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBHRU44X0JMRU5EX1dSSVRFX0RJU0FCTEVfR1JFRU4gICAgICAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBHRU44X0JMRU5EX1dSSVRFX0RJU0FCTEVfQkxVRSAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorLyogRFcxICsgMm4gKyAxICovCisjZGVmaW5lIEdFTjhfQkxFTkRfTE9HSUNfT1BfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMxKQorI2RlZmluZSBHRU44X0JMRU5EX0xPR0lDX09QX0ZVTkNUSU9OX01BU0sgICAgICAgICAgICAgICBJTlRFTF9NQVNLKDMwLCAyNykKKyNkZWZpbmUgR0VOOF9CTEVORF9MT0dJQ19PUF9GVU5DVElPTl9TSElGVCAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgR0VOOF9CTEVORF9QUkVfQkxFTkRfU1JDX09OTFlfQ0xBTVBfRU5BQkxFICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgR0VOOF9CTEVORF9DT0xPUl9DTEFNUF9SQU5HRV9SVEZPUk1BVCAgICAgICAgICAgKDIgPDwgMikKKyNkZWZpbmUgR0VOOF9CTEVORF9QUkVfQkxFTkRfQ09MT1JfQ0xBTVBfRU5BQkxFICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgR0VOOF9CTEVORF9QT1NUX0JMRU5EX0NPTE9SX0NMQU1QX0VOQUJMRSAgICAgICAgKDEgPDwgMCkKKworI2RlZmluZSBfM0RTVEFURV9XTV9IWl9PUCAgICAgICAgICAgICAgICAgICAgICAgMHg3ODUyIC8qIEdFTjgrICovCisvKiBEVzEgKi8KKyMgZGVmaW5lIEdFTjhfV01fSFpfU1RFTkNJTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMzEpCisjIGRlZmluZSBHRU44X1dNX0haX0RFUFRIX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMwKQorIyBkZWZpbmUgR0VOOF9XTV9IWl9ERVBUSF9SRVNPTFZFICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKKyMgZGVmaW5lIEdFTjhfV01fSFpfSElaX1JFU09MVkUgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjcpCisjIGRlZmluZSBHRU44X1dNX0haX1BJWEVMX09GRlNFVF9FTkFCTEUgICAgICAgICAgICAgICAgICgxIDw8IDI2KQorIyBkZWZpbmUgR0VOOF9XTV9IWl9GVUxMX1NVUkZBQ0VfREVQVEhfQ0xFQVIgICAgICAgICAgICAoMSA8PCAyNSkKKyMgZGVmaW5lIEdFTjhfV01fSFpfU1RFTkNJTF9DTEVBUl9WQUxVRV9NQVNLICAgICAgICAgICAgSU5URUxfTUFTSygyMywgMTYpCisjIGRlZmluZSBHRU44X1dNX0haX1NURU5DSUxfQ0xFQVJfVkFMVUVfU0hJRlQgICAgICAgICAgIDE2CisjIGRlZmluZSBHRU44X1dNX0haX05VTV9TQU1QTEVTX01BU0sgICAgICAgICAgICAgICAgICAgIElOVEVMX01BU0soMTUsIDEzKQorIyBkZWZpbmUgR0VOOF9XTV9IWl9OVU1fU0FNUExFU19TSElGVCAgICAgICAgICAgICAgICAgICAxMworLyogRFcyICovCisjIGRlZmluZSBHRU44X1dNX0haX0NMRUFSX1JFQ1RBTkdMRV9ZX01JTl9NQVNLICAgICAgICAgIElOVEVMX01BU0soMzEsIDE2KQorIyBkZWZpbmUgR0VOOF9XTV9IWl9DTEVBUl9SRUNUQU5HTEVfWV9NSU5fU0hJRlQgICAgICAgICAxNgorIyBkZWZpbmUgR0VOOF9XTV9IWl9DTEVBUl9SRUNUQU5HTEVfWF9NSU5fTUFTSyAgICAgICAgICBJTlRFTF9NQVNLKDE1LCAwKQorIyBkZWZpbmUgR0VOOF9XTV9IWl9DTEVBUl9SRUNUQU5HTEVfWF9NSU5fU0hJRlQgICAgICAgICAwCisvKiBEVzMgKi8KKyMgZGVmaW5lIEdFTjhfV01fSFpfQ0xFQVJfUkVDVEFOR0xFX1lfTUFYX01BU0sgICAgICAgICAgSU5URUxfTUFTSygzMSwgMTYpCisjIGRlZmluZSBHRU44X1dNX0haX0NMRUFSX1JFQ1RBTkdMRV9ZX01BWF9TSElGVCAgICAgICAgIDE2CisjIGRlZmluZSBHRU44X1dNX0haX0NMRUFSX1JFQ1RBTkdMRV9YX01BWF9NQVNLICAgICAgICAgIElOVEVMX01BU0soMTUsIDApCisjIGRlZmluZSBHRU44X1dNX0haX0NMRUFSX1JFQ1RBTkdMRV9YX01BWF9TSElGVCAgICAgICAgIDAKKy8qIERXNCAqLworIyBkZWZpbmUgR0VOOF9XTV9IWl9TQU1QTEVfTUFTS19NQVNLICAgICAgICAgICAgICAgICAgICBJTlRFTF9NQVNLKDE1LCAwKQorIyBkZWZpbmUgR0VOOF9XTV9IWl9TQU1QTEVfTUFTS19TSElGVCAgICAgICAgICAgICAgICAgICAwCisKKworI2RlZmluZSBfM0RTVEFURV9QU19CTEVORCAgICAgICAgICAgICAgICAgICAgICAgMHg3ODREIC8qIEdFTjgrICovCisvKiBEVzEgKi8KKyMgZGVmaW5lIEdFTjhfUFNfQkxFTkRfQUxQSEFfVE9fQ09WRVJBR0VfRU5BQkxFICAgICAgICAgKDEgPDwgMzEpCisjIGRlZmluZSBHRU44X1BTX0JMRU5EX0hBU19XUklURUFCTEVfUlQgICAgICAgICAgICAgICAgICgxIDw8IDMwKQorIyBkZWZpbmUgR0VOOF9QU19CTEVORF9DT0xPUl9CVUZGRVJfQkxFTkRfRU5BQkxFICAgICAgICAoMSA8PCAyOSkKKyMgZGVmaW5lIEdFTjhfUFNfQkxFTkRfU1JDX0FMUEhBX0JMRU5EX0ZBQ1RPUl9NQVNLICAgICAgSU5URUxfTUFTSygyOCwgMjQpCisjIGRlZmluZSBHRU44X1BTX0JMRU5EX1NSQ19BTFBIQV9CTEVORF9GQUNUT1JfU0hJRlQgICAgIDI0CisjIGRlZmluZSBHRU44X1BTX0JMRU5EX0RTVF9BTFBIQV9CTEVORF9GQUNUT1JfTUFTSyAgICAgIElOVEVMX01BU0soMjMsIDE5KQorIyBkZWZpbmUgR0VOOF9QU19CTEVORF9EU1RfQUxQSEFfQkxFTkRfRkFDVE9SX1NISUZUICAgICAxOQorIyBkZWZpbmUgR0VOOF9QU19CTEVORF9TUkNfQkxFTkRfRkFDVE9SX01BU0sgICAgICAgICAgICBJTlRFTF9NQVNLKDE4LCAxNCkKKyMgZGVmaW5lIEdFTjhfUFNfQkxFTkRfU1JDX0JMRU5EX0ZBQ1RPUl9TSElGVCAgICAgICAgICAgMTQKKyMgZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFNUX0JMRU5EX0ZBQ1RPUl9NQVNLICAgICAgICAgICAgSU5URUxfTUFTSygxMywgOSkKKyMgZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFNUX0JMRU5EX0ZBQ1RPUl9TSElGVCAgICAgICAgICAgOQorIyBkZWZpbmUgR0VOOF9QU19CTEVORF9BTFBIQV9URVNUX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCA4KQorIyBkZWZpbmUgR0VOOF9QU19CTEVORF9JTkRFUEVOREVOVF9BTFBIQV9CTEVORF9FTkFCTEUgICAoMSA8PCA3KQorCisjZGVmaW5lIF8zRFNUQVRFX1dNX0RFUFRIX1NURU5DSUwgICAgICAgICAgICAgICAweDc4NEUgLyogR0VOOCsgKi8KKy8qIERXMSAqLworIyBkZWZpbmUgR0VOOF9XTV9EU19TVEVOQ0lMX0ZBSUxfT1BfU0hJRlQgICAgICAgICAgICAgICAyOQorIyBkZWZpbmUgR0VOOF9XTV9EU19aX0ZBSUxfT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyNgorIyBkZWZpbmUgR0VOOF9XTV9EU19aX1BBU1NfT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyMworIyBkZWZpbmUgR0VOOF9XTV9EU19CRl9TVEVOQ0lMX0ZVTkNfU0hJRlQgICAgICAgICAgICAgICAyMAorIyBkZWZpbmUgR0VOOF9XTV9EU19CRl9TVEVOQ0lMX0ZBSUxfT1BfU0hJRlQgICAgICAgICAgICAxNworIyBkZWZpbmUgR0VOOF9XTV9EU19CRl9aX0ZBSUxfT1BfU0hJRlQgICAgICAgICAgICAgICAgICAxNAorIyBkZWZpbmUgR0VOOF9XTV9EU19CRl9aX1BBU1NfT1BfU0hJRlQgICAgICAgICAgICAgICAgICAxMQorIyBkZWZpbmUgR0VOOF9XTV9EU19TVEVOQ0lMX0ZVTkNfU0hJRlQgICAgICAgICAgICAgICAgICA4CisjIGRlZmluZSBHRU44X1dNX0RTX0RFUFRIX0ZVTkNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDUKKyMgZGVmaW5lIEdFTjhfV01fRFNfRE9VQkxFX1NJREVEX1NURU5DSUxfRU5BQkxFICAgICAgICAgKDEgPDwgNCkKKyMgZGVmaW5lIEdFTjhfV01fRFNfU1RFTkNJTF9URVNUX0VOQUJMRSAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyMgZGVmaW5lIEdFTjhfV01fRFNfU1RFTkNJTF9CVUZGRVJfV1JJVEVfRU5BQkxFICAgICAgICAgKDEgPDwgMikKKyMgZGVmaW5lIEdFTjhfV01fRFNfREVQVEhfVEVTVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyMgZGVmaW5lIEdFTjhfV01fRFNfREVQVEhfQlVGRkVSX1dSSVRFX0VOQUJMRSAgICAgICAgICAgKDEgPDwgMCkKKy8qIERXMiAqLworIyBkZWZpbmUgR0VOOF9XTV9EU19TVEVOQ0lMX1RFU1RfTUFTS19NQVNLICAgICAgICAgICAgICBJTlRFTF9NQVNLKDMxLCAyNCkKKyMgZGVmaW5lIEdFTjhfV01fRFNfU1RFTkNJTF9URVNUX01BU0tfU0hJRlQgICAgICAgICAgICAgMjQKKyMgZGVmaW5lIEdFTjhfV01fRFNfU1RFTkNJTF9XUklURV9NQVNLX01BU0sgICAgICAgICAgICAgSU5URUxfTUFTSygyMywgMTYpCisjIGRlZmluZSBHRU44X1dNX0RTX1NURU5DSUxfV1JJVEVfTUFTS19TSElGVCAgICAgICAgICAgIDE2CisjIGRlZmluZSBHRU44X1dNX0RTX0JGX1NURU5DSUxfVEVTVF9NQVNLX01BU0sgICAgICAgICAgIElOVEVMX01BU0soMTUsIDgpCisjIGRlZmluZSBHRU44X1dNX0RTX0JGX1NURU5DSUxfVEVTVF9NQVNLX1NISUZUICAgICAgICAgIDgKKyMgZGVmaW5lIEdFTjhfV01fRFNfQkZfU1RFTkNJTF9XUklURV9NQVNLX01BU0sgICAgICAgICAgSU5URUxfTUFTSyg3LCAwKQorIyBkZWZpbmUgR0VOOF9XTV9EU19CRl9TVEVOQ0lMX1dSSVRFX01BU0tfU0hJRlQgICAgICAgICAwCisKKyNkZWZpbmUgXzNEU1RBVEVfUFNfRVhUUkEgICAgICAgICAgICAgICAgICAgICAgIDB4Nzg0RiAvKiBHRU44KyAqLworLyogRFcxICovCisjIGRlZmluZSBHRU44X1BTWF9QSVhFTF9TSEFERVJfVkFMSUQgICAgICAgICAgICAgICAgICAgICgxIDw8IDMxKQorIyBkZWZpbmUgR0VOOF9QU1hfUElYRUxfU0hBREVSX05PX1JUX1dSSVRFICAgICAgICAgICAgICAoMSA8PCAzMCkKKyMgZGVmaW5lIEdFTjhfUFNYX09NQVNLX1RPX1JFTkRFUl9UQVJHRVQgICAgICAgICAgICAgICAgKDEgPDwgMjkpCisjIGRlZmluZSBHRU44X1BTWF9LSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI4KQorIyBkZWZpbmUgR0VOOF9QU1hfUFNDREVQVEhfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCAyNikKKyMgZGVmaW5lIEdFTjhfUFNYX1BTQ0RFUFRIX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjYpCisjIGRlZmluZSBHRU44X1BTWF9QU0NERVBUSF9PTl9HRSAgICAgICAgICAgICAgICAgICAgICAgICgyIDw8IDI2KQorIyBkZWZpbmUgR0VOOF9QU1hfUFNDREVQVEhfT05fTEUgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCAyNikKKyMgZGVmaW5lIEdFTjhfUFNYX0ZPUkNFX0NPTVBVVEVEX0RFUFRIICAgICAgICAgICAgICAgICAgKDEgPDwgMjUpCisjIGRlZmluZSBHRU44X1BTWF9VU0VTX1NPVVJDRV9ERVBUSCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI0KQorIyBkZWZpbmUgR0VOOF9QU1hfVVNFU19TT1VSQ0VfVyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgZGVmaW5lIEdFTjhfUFNYX0FUVFJJQlVURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyMgZGVmaW5lIEdFTjhfUFNYX1NIQURFUl9ESVNBQkxFU19BTFBIQV9UT19DT1ZFUkFHRSAgICAgKDEgPDwgNykKKyMgZGVmaW5lIEdFTjhfUFNYX1NIQURFUl9JU19QRVJfU0FNUExFICAgICAgICAgICAgICAgICAgKDEgPDwgNikKKyMgZGVmaW5lIEdFTjhfUFNYX1NIQURFUl9DT01QVVRFU19TVEVOQ0lMICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMgZGVmaW5lIEdFTjhfUFNYX1NIQURFUl9IQVNfVUFWICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyMgZGVmaW5lIEdFTjhfUFNYX1NIQURFUl9VU0VTX0lOUFVUX0NPVkVSQUdFX01BU0sgICAgICAgKDEgPDwgMSkKKworZW51bSBicndfd21fYmFyeWNlbnRyaWNfaW50ZXJwX21vZGUgeworICAgQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDCQk9IDAsCisgICBCUldfV01fUEVSU1BFQ1RJVkVfQ0VOVFJPSURfQkFSWUNFTlRSSUMJPSAxLAorICAgQlJXX1dNX1BFUlNQRUNUSVZFX1NBTVBMRV9CQVJZQ0VOVFJJQwk9IDIsCisgICBCUldfV01fTk9OUEVSU1BFQ1RJVkVfUElYRUxfQkFSWUNFTlRSSUMJPSAzLAorICAgQlJXX1dNX05PTlBFUlNQRUNUSVZFX0NFTlRST0lEX0JBUllDRU5UUklDCT0gNCwKKyAgIEJSV19XTV9OT05QRVJTUEVDVElWRV9TQU1QTEVfQkFSWUNFTlRSSUMJPSA1LAorICAgQlJXX1dNX0JBUllDRU5UUklDX0lOVEVSUF9NT0RFX0NPVU5UICA9IDYKK307CisjZGVmaW5lIEJSV19XTV9OT05QRVJTUEVDVElWRV9CQVJZQ0VOVFJJQ19CSVRTIFwKKyAgICgoMSA8PCBCUldfV01fTk9OUEVSU1BFQ1RJVkVfUElYRUxfQkFSWUNFTlRSSUMpIHwgXAorICAgICgxIDw8IEJSV19XTV9OT05QRVJTUEVDVElWRV9DRU5UUk9JRF9CQVJZQ0VOVFJJQykgfCBcCisgICAgKDEgPDwgQlJXX1dNX05PTlBFUlNQRUNUSVZFX1NBTVBMRV9CQVJZQ0VOVFJJQykpCisKKyNkZWZpbmUgXzNEU1RBVEVfV00JCQkJMHg3ODE0IC8qIEdFTjYrICovCisvKiBEVzE6IGtlcm5lbCBwb2ludGVyICovCisvKiBEVzIgKi8KKyMgZGVmaW5lIEdFTjZfV01fU1BGX01PREUJCQkJKDEgPDwgMzEpCisjIGRlZmluZSBHRU42X1dNX1ZFQ1RPUl9NQVNLX0VOQUJMRQkJCSgxIDw8IDMwKQorIyBkZWZpbmUgR0VONl9XTV9TQU1QTEVSX0NPVU5UX1NISUZUCQkJMjcKKyMgZGVmaW5lIEdFTjZfV01fQklORElOR19UQUJMRV9FTlRSWV9DT1VOVF9TSElGVAkxOAorIyBkZWZpbmUgR0VONl9XTV9GTE9BVElOR19QT0lOVF9NT0RFX0lFRUVfNzU0CQkoMCA8PCAxNikKKyMgZGVmaW5lIEdFTjZfV01fRkxPQVRJTkdfUE9JTlRfTU9ERV9BTFQJCSgxIDw8IDE2KQorLyogRFczOiBzY3JhdGNoIHNwYWNlICovCisvKiBEVzQgKi8KKyMgZGVmaW5lIEdFTjZfV01fU1RBVElTVElDU19FTkFCTEUJCQkoMSA8PCAzMSkKKyMgZGVmaW5lIEdFTjZfV01fREVQVEhfQ0xFQVIJCQkJKDEgPDwgMzApCisjIGRlZmluZSBHRU42X1dNX0RFUFRIX1JFU09MVkUJCQkJKDEgPDwgMjgpCisjIGRlZmluZSBHRU42X1dNX0hJRVJBUkNISUNBTF9ERVBUSF9SRVNPTFZFCQkoMSA8PCAyNykKKyMgZGVmaW5lIEdFTjZfV01fRElTUEFUQ0hfU1RBUlRfR1JGX1NISUZUXzAJCTE2CisjIGRlZmluZSBHRU42X1dNX0RJU1BBVENIX1NUQVJUX0dSRl9TSElGVF8xCQk4CisjIGRlZmluZSBHRU42X1dNX0RJU1BBVENIX1NUQVJUX0dSRl9TSElGVF8yCQkwCisvKiBEVzUgKi8KKyMgZGVmaW5lIEdFTjZfV01fTUFYX1RIUkVBRFNfU0hJRlQJCQkyNQorIyBkZWZpbmUgR0VONl9XTV9LSUxMX0VOQUJMRQkJCQkoMSA8PCAyMikKKyMgZGVmaW5lIEdFTjZfV01fQ09NUFVURURfREVQVEgJCQkJKDEgPDwgMjEpCisjIGRlZmluZSBHRU42X1dNX1VTRVNfU09VUkNFX0RFUFRICQkJKDEgPDwgMjApCisjIGRlZmluZSBHRU42X1dNX0RJU1BBVENIX0VOQUJMRQkJCSgxIDw8IDE5KQorIyBkZWZpbmUgR0VONl9XTV9MSU5FX0VORF9DQVBfQUFfV0lEVEhfMF81CQkoMCA8PCAxNikKKyMgZGVmaW5lIEdFTjZfV01fTElORV9FTkRfQ0FQX0FBX1dJRFRIXzFfMAkJKDEgPDwgMTYpCisjIGRlZmluZSBHRU42X1dNX0xJTkVfRU5EX0NBUF9BQV9XSURUSF8yXzAJCSgyIDw8IDE2KQorIyBkZWZpbmUgR0VONl9XTV9MSU5FX0VORF9DQVBfQUFfV0lEVEhfNF8wCQkoMyA8PCAxNikKKyMgZGVmaW5lIEdFTjZfV01fTElORV9BQV9XSURUSF8wXzUJCQkoMCA8PCAxNCkKKyMgZGVmaW5lIEdFTjZfV01fTElORV9BQV9XSURUSF8xXzAJCQkoMSA8PCAxNCkKKyMgZGVmaW5lIEdFTjZfV01fTElORV9BQV9XSURUSF8yXzAJCQkoMiA8PCAxNCkKKyMgZGVmaW5lIEdFTjZfV01fTElORV9BQV9XSURUSF80XzAJCQkoMyA8PCAxNCkKKyMgZGVmaW5lIEdFTjZfV01fUE9MWUdPTl9TVElQUExFX0VOQUJMRQkJCSgxIDw8IDEzKQorIyBkZWZpbmUgR0VONl9XTV9MSU5FX1NUSVBQTEVfRU5BQkxFCQkJKDEgPDwgMTEpCisjIGRlZmluZSBHRU42X1dNX09NQVNLX1RPX1JFTkRFUl9UQVJHRVQJCQkoMSA8PCA5KQorIyBkZWZpbmUgR0VONl9XTV9VU0VTX1NPVVJDRV9XCQkJCSgxIDw8IDgpCisjIGRlZmluZSBHRU42X1dNX0RVQUxfU09VUkNFX0JMRU5EX0VOQUJMRQkJKDEgPDwgNykKKyMgZGVmaW5lIEdFTjZfV01fMzJfRElTUEFUQ0hfRU5BQkxFCQkJKDEgPDwgMikKKyMgZGVmaW5lIEdFTjZfV01fMTZfRElTUEFUQ0hfRU5BQkxFCQkJKDEgPDwgMSkKKyMgZGVmaW5lIEdFTjZfV01fOF9ESVNQQVRDSF9FTkFCTEUJCQkoMSA8PCAwKQorLyogRFc2ICovCisjIGRlZmluZSBHRU42X1dNX05VTV9TRl9PVVRQVVRTX1NISUZUCQkJMjAKKyMgZGVmaW5lIEdFTjZfV01fUE9TT0ZGU0VUX05PTkUJCQkJKDAgPDwgMTgpCisjIGRlZmluZSBHRU42X1dNX1BPU09GRlNFVF9DRU5UUk9JRAkJCSgyIDw8IDE4KQorIyBkZWZpbmUgR0VONl9XTV9QT1NPRkZTRVRfU0FNUExFCQkJKDMgPDwgMTgpCisjIGRlZmluZSBHRU42X1dNX1BPU0lUSU9OX1pXX1BJWEVMCQkJKDAgPDwgMTYpCisjIGRlZmluZSBHRU42X1dNX1BPU0lUSU9OX1pXX0NFTlRST0lECQkJKDIgPDwgMTYpCisjIGRlZmluZSBHRU42X1dNX1BPU0lUSU9OX1pXX1NBTVBMRQkJCSgzIDw8IDE2KQorIyBkZWZpbmUgR0VONl9XTV9OT05QRVJTUEVDVElWRV9TQU1QTEVfQkFSWUNFTlRSSUMJKDEgPDwgMTUpCisjIGRlZmluZSBHRU42X1dNX05PTlBFUlNQRUNUSVZFX0NFTlRST0lEX0JBUllDRU5UUklDCSgxIDw8IDE0KQorIyBkZWZpbmUgR0VONl9XTV9OT05QRVJTUEVDVElWRV9QSVhFTF9CQVJZQ0VOVFJJQwkoMSA8PCAxMykKKyMgZGVmaW5lIEdFTjZfV01fUEVSU1BFQ1RJVkVfU0FNUExFX0JBUllDRU5UUklDCQkoMSA8PCAxMikKKyMgZGVmaW5lIEdFTjZfV01fUEVSU1BFQ1RJVkVfQ0VOVFJPSURfQkFSWUNFTlRSSUMJKDEgPDwgMTEpCisjIGRlZmluZSBHRU42X1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDCQkoMSA8PCAxMCkKKyMgZGVmaW5lIEdFTjZfV01fQkFSWUNFTlRSSUNfSU5URVJQT0xBVElPTl9NT0RFX1NISUZUICAgMTAKKyMgZGVmaW5lIEdFTjZfV01fUE9JTlRfUkFTVFJVTEVfVVBQRVJfUklHSFQJCSgxIDw8IDkpCisjIGRlZmluZSBHRU42X1dNX01TUkFTVF9PRkZfUElYRUwJCQkoMCA8PCAxKQorIyBkZWZpbmUgR0VONl9XTV9NU1JBU1RfT0ZGX1BBVFRFUk4JCQkoMSA8PCAxKQorIyBkZWZpbmUgR0VONl9XTV9NU1JBU1RfT05fUElYRUwJCQkoMiA8PCAxKQorIyBkZWZpbmUgR0VONl9XTV9NU1JBU1RfT05fUEFUVEVSTgkJCSgzIDw8IDEpCisjIGRlZmluZSBHRU42X1dNX01TRElTUE1PREVfUEVSU0FNUExFCQkJKDAgPDwgMCkKKyMgZGVmaW5lIEdFTjZfV01fTVNESVNQTU9ERV9QRVJQSVhFTAkJCSgxIDw8IDApCisvKiBEVzc6IGtlcm5lbCAxIHBvaW50ZXIgKi8KKy8qIERXODoga2VybmVsIDIgcG9pbnRlciAqLworCisjZGVmaW5lIF8zRFNUQVRFX0NPTlNUQU5UX1ZTCQkgICAgICAweDc4MTUgLyogR0VONisgKi8KKyNkZWZpbmUgXzNEU1RBVEVfQ09OU1RBTlRfR1MJCSAgICAgIDB4NzgxNiAvKiBHRU42KyAqLworI2RlZmluZSBfM0RTVEFURV9DT05TVEFOVF9QUwkJICAgICAgMHg3ODE3IC8qIEdFTjYrICovCisjIGRlZmluZSBHRU42X0NPTlNUQU5UX0JVRkZFUl8zX0VOQUJMRQkJCSgxIDw8IDE1KQorIyBkZWZpbmUgR0VONl9DT05TVEFOVF9CVUZGRVJfMl9FTkFCTEUJCQkoMSA8PCAxNCkKKyMgZGVmaW5lIEdFTjZfQ09OU1RBTlRfQlVGRkVSXzFfRU5BQkxFCQkJKDEgPDwgMTMpCisjIGRlZmluZSBHRU42X0NPTlNUQU5UX0JVRkZFUl8wX0VOQUJMRQkJCSgxIDw8IDEyKQorCisjZGVmaW5lIF8zRFNUQVRFX0NPTlNUQU5UX0hTICAgICAgICAgICAgICAgICAgMHg3ODE5IC8qIEdFTjcrICovCisjZGVmaW5lIF8zRFNUQVRFX0NPTlNUQU5UX0RTICAgICAgICAgICAgICAgICAgMHg3ODFBIC8qIEdFTjcrICovCisKKyNkZWZpbmUgXzNEU1RBVEVfU1RSRUFNT1VUICAgICAgICAgICAgICAgICAgICAweDc4MWUgLyogR0VONysgKi8KKy8qIERXMSAqLworIyBkZWZpbmUgU09fRlVOQ1RJT05fRU5BQkxFCQkJCSgxIDw8IDMxKQorIyBkZWZpbmUgU09fUkVOREVSSU5HX0RJU0FCTEUJCQkJKDEgPDwgMzApCisvKiBUaGlzIHNlbGVjdHMgd2hpY2ggaW5jb21pbmcgcmVuZGVyaW5nIHN0cmVhbSBnb2VzIGRvd24gdGhlIHBpcGVsaW5lLiAgVGhlCisgKiByZW5kZXJpbmcgc3RyZWFtIGlzIDAgaWYgbm90IGRlZmluZWQgYnkgc3BlY2lhbCBjYXNlcyBpbiB0aGUgR1Mgc3RhdGUuCisgKi8KKyMgZGVmaW5lIFNPX1JFTkRFUl9TVFJFQU1fU0VMRUNUX1NISUZUCQkJMjcKKyMgZGVmaW5lIFNPX1JFTkRFUl9TVFJFQU1fU0VMRUNUX01BU0sJCQlJTlRFTF9NQVNLKDI4LCAyNykKKy8qIENvbnRyb2xzIHJlb3JkZXJpbmcgb2YgVFJJU1RSSVBfKiBlbGVtZW50cyBpbiBzdHJlYW0gb3V0cHV0IChub3QgcmVuZGVyaW5nKS4KKyAqLworIyBkZWZpbmUgU09fUkVPUkRFUl9UUkFJTElORwkJCQkoMSA8PCAyNikKKy8qIENvbnRyb2xzIFNPX05VTV9QUklNU19XUklUVEVOXyogYW5kIFNPX1BSSU1fU1RPUkFHRV8qICovCisjIGRlZmluZSBTT19TVEFUSVNUSUNTX0VOQUJMRQkJCQkoMSA8PCAyNSkKKyMgZGVmaW5lIFNPX0JVRkZFUl9FTkFCTEUobikJCQkJKDEgPDwgKDggKyAobikpKQorLyogRFcyICovCisjIGRlZmluZSBTT19TVFJFQU1fM19WRVJURVhfUkVBRF9PRkZTRVRfU0hJRlQJCTI5CisjIGRlZmluZSBTT19TVFJFQU1fM19WRVJURVhfUkVBRF9PRkZTRVRfTUFTSwkJSU5URUxfTUFTSygyOSwgMjkpCisjIGRlZmluZSBTT19TVFJFQU1fM19WRVJURVhfUkVBRF9MRU5HVEhfU0hJRlQJCTI0CisjIGRlZmluZSBTT19TVFJFQU1fM19WRVJURVhfUkVBRF9MRU5HVEhfTUFTSwkJSU5URUxfTUFTSygyOCwgMjQpCisjIGRlZmluZSBTT19TVFJFQU1fMl9WRVJURVhfUkVBRF9PRkZTRVRfU0hJRlQJCTIxCisjIGRlZmluZSBTT19TVFJFQU1fMl9WRVJURVhfUkVBRF9PRkZTRVRfTUFTSwkJSU5URUxfTUFTSygyMSwgMjEpCisjIGRlZmluZSBTT19TVFJFQU1fMl9WRVJURVhfUkVBRF9MRU5HVEhfU0hJRlQJCTE2CisjIGRlZmluZSBTT19TVFJFQU1fMl9WRVJURVhfUkVBRF9MRU5HVEhfTUFTSwkJSU5URUxfTUFTSygyMCwgMTYpCisjIGRlZmluZSBTT19TVFJFQU1fMV9WRVJURVhfUkVBRF9PRkZTRVRfU0hJRlQJCTEzCisjIGRlZmluZSBTT19TVFJFQU1fMV9WRVJURVhfUkVBRF9PRkZTRVRfTUFTSwkJSU5URUxfTUFTSygxMywgMTMpCisjIGRlZmluZSBTT19TVFJFQU1fMV9WRVJURVhfUkVBRF9MRU5HVEhfU0hJRlQJCTgKKyMgZGVmaW5lIFNPX1NUUkVBTV8xX1ZFUlRFWF9SRUFEX0xFTkdUSF9NQVNLCQlJTlRFTF9NQVNLKDEyLCA4KQorIyBkZWZpbmUgU09fU1RSRUFNXzBfVkVSVEVYX1JFQURfT0ZGU0VUX1NISUZUCQk1CisjIGRlZmluZSBTT19TVFJFQU1fMF9WRVJURVhfUkVBRF9PRkZTRVRfTUFTSwkJSU5URUxfTUFTSyg1LCA1KQorIyBkZWZpbmUgU09fU1RSRUFNXzBfVkVSVEVYX1JFQURfTEVOR1RIX1NISUZUCQkwCisjIGRlZmluZSBTT19TVFJFQU1fMF9WRVJURVhfUkVBRF9MRU5HVEhfTUFTSwkJSU5URUxfTUFTSyg0LCAwKQorCisvKiAzRFNUQVRFX1dNIGZvciBHZW43ICovCisvKiBEVzEgKi8KKyMgZGVmaW5lIEdFTjdfV01fU1RBVElTVElDU19FTkFCTEUJCQkoMSA8PCAzMSkKKyMgZGVmaW5lIEdFTjdfV01fREVQVEhfQ0xFQVIJCQkJKDEgPDwgMzApCisjIGRlZmluZSBHRU43X1dNX0RJU1BBVENIX0VOQUJMRQkJCSgxIDw8IDI5KQorIyBkZWZpbmUgR0VON19XTV9ERVBUSF9SRVNPTFZFCQkJCSgxIDw8IDI4KQorIyBkZWZpbmUgR0VON19XTV9ISUVSQVJDSElDQUxfREVQVEhfUkVTT0xWRQkJKDEgPDwgMjcpCisjIGRlZmluZSBHRU43X1dNX0tJTExfRU5BQkxFCQkJCSgxIDw8IDI1KQorIyBkZWZpbmUgR0VON19XTV9QU0NERVBUSF9PRkYJCQkgICAgICAgICgwIDw8IDIzKQorIyBkZWZpbmUgR0VON19XTV9QU0NERVBUSF9PTgkJCSAgICAgICAgKDEgPDwgMjMpCisjIGRlZmluZSBHRU43X1dNX1BTQ0RFUFRIX09OX0dFCQkJICAgICAgICAoMiA8PCAyMykKKyMgZGVmaW5lIEdFTjdfV01fUFNDREVQVEhfT05fTEUJCQkgICAgICAgICgzIDw8IDIzKQorIyBkZWZpbmUgR0VON19XTV9VU0VTX1NPVVJDRV9ERVBUSAkJCSgxIDw8IDIwKQorIyBkZWZpbmUgR0VON19XTV9VU0VTX1NPVVJDRV9XCQkJICAgICAgICAoMSA8PCAxOSkKKyMgZGVmaW5lIEdFTjdfV01fUE9TSVRJT05fWldfUElYRUwJCQkoMCA8PCAxNykKKyMgZGVmaW5lIEdFTjdfV01fUE9TSVRJT05fWldfQ0VOVFJPSUQJCQkoMiA8PCAxNykKKyMgZGVmaW5lIEdFTjdfV01fUE9TSVRJT05fWldfU0FNUExFCQkJKDMgPDwgMTcpCisjIGRlZmluZSBHRU43X1dNX0JBUllDRU5UUklDX0lOVEVSUE9MQVRJT05fTU9ERV9TSElGVCAgIDExCisjIGRlZmluZSBHRU43X1dNX1VTRVNfSU5QVVRfQ09WRVJBR0VfTUFTSwkgICAgICAgICgxIDw8IDEwKQorIyBkZWZpbmUgR0VON19XTV9MSU5FX0VORF9DQVBfQUFfV0lEVEhfMF81CQkoMCA8PCA4KQorIyBkZWZpbmUgR0VON19XTV9MSU5FX0VORF9DQVBfQUFfV0lEVEhfMV8wCQkoMSA8PCA4KQorIyBkZWZpbmUgR0VON19XTV9MSU5FX0VORF9DQVBfQUFfV0lEVEhfMl8wCQkoMiA8PCA4KQorIyBkZWZpbmUgR0VON19XTV9MSU5FX0VORF9DQVBfQUFfV0lEVEhfNF8wCQkoMyA8PCA4KQorIyBkZWZpbmUgR0VON19XTV9MSU5FX0FBX1dJRFRIXzBfNQkJCSgwIDw8IDYpCisjIGRlZmluZSBHRU43X1dNX0xJTkVfQUFfV0lEVEhfMV8wCQkJKDEgPDwgNikKKyMgZGVmaW5lIEdFTjdfV01fTElORV9BQV9XSURUSF8yXzAJCQkoMiA8PCA2KQorIyBkZWZpbmUgR0VON19XTV9MSU5FX0FBX1dJRFRIXzRfMAkJCSgzIDw8IDYpCisjIGRlZmluZSBHRU43X1dNX1BPTFlHT05fU1RJUFBMRV9FTkFCTEUJCQkoMSA8PCA0KQorIyBkZWZpbmUgR0VON19XTV9MSU5FX1NUSVBQTEVfRU5BQkxFCQkJKDEgPDwgMykKKyMgZGVmaW5lIEdFTjdfV01fUE9JTlRfUkFTVFJVTEVfVVBQRVJfUklHSFQJCSgxIDw8IDIpCisjIGRlZmluZSBHRU43X1dNX01TUkFTVF9PRkZfUElYRUwJCQkoMCA8PCAwKQorIyBkZWZpbmUgR0VON19XTV9NU1JBU1RfT0ZGX1BBVFRFUk4JCQkoMSA8PCAwKQorIyBkZWZpbmUgR0VON19XTV9NU1JBU1RfT05fUElYRUwJCQkoMiA8PCAwKQorIyBkZWZpbmUgR0VON19XTV9NU1JBU1RfT05fUEFUVEVSTgkJCSgzIDw8IDApCisvKiBEVzIgKi8KKyMgZGVmaW5lIEdFTjdfV01fTVNESVNQTU9ERV9QRVJTQU1QTEUJCQkoMCA8PCAzMSkKKyMgZGVmaW5lIEdFTjdfV01fTVNESVNQTU9ERV9QRVJQSVhFTAkJCSgxIDw8IDMxKQorCisjZGVmaW5lIF8zRFNUQVRFX1BTCQkJCTB4NzgyMCAvKiBHRU43KyAqLworLyogRFcxOiBrZXJuZWwgcG9pbnRlciAqLworLyogRFcyICovCisjIGRlZmluZSBHRU43X1BTX1NQRl9NT0RFCQkJCSgxIDw8IDMxKQorIyBkZWZpbmUgR0VON19QU19WRUNUT1JfTUFTS19FTkFCTEUJCQkoMSA8PCAzMCkKKyMgZGVmaW5lIEdFTjdfUFNfU0FNUExFUl9DT1VOVF9TSElGVAkJCTI3CisjIGRlZmluZSBHRU43X1BTX0JJTkRJTkdfVEFCTEVfRU5UUllfQ09VTlRfU0hJRlQJMTgKKyMgZGVmaW5lIEdFTjdfUFNfRkxPQVRJTkdfUE9JTlRfTU9ERV9JRUVFXzc1NAkJKDAgPDwgMTYpCisjIGRlZmluZSBHRU43X1BTX0ZMT0FUSU5HX1BPSU5UX01PREVfQUxUCQkoMSA8PCAxNikKKy8qIERXMzogc2NyYXRjaCBzcGFjZSAqLworLyogRFc0ICovCisjIGRlZmluZSBJVkJfUFNfTUFYX1RIUkVBRFNfU0hJRlQJCQkyNAorIyBkZWZpbmUgSFNXX1BTX01BWF9USFJFQURTX1NISUZUCQkJMjMKKyMgZGVmaW5lIEhTV19QU19TQU1QTEVfTUFTS19TSElGVAkJICAgICAgICAxMgorIyBkZWZpbmUgSFNXX1BTX1NBTVBMRV9NQVNLX01BU0sJCQlJTlRFTF9NQVNLKDE5LCAxMikKKyMgZGVmaW5lIEdFTjdfUFNfUFVTSF9DT05TVEFOVF9FTkFCTEUJCSAgICAgICAgKDEgPDwgMTEpCisjIGRlZmluZSBHRU43X1BTX0FUVFJJQlVURV9FTkFCTEUJCSAgICAgICAgKDEgPDwgMTApCisjIGRlZmluZSBHRU43X1BTX09NQVNLX1RPX1JFTkRFUl9UQVJHRVQJCQkoMSA8PCA5KQorIyBkZWZpbmUgR0VON19QU19SRU5ERVJfVEFSR0VUX0ZBU1RfQ0xFQVJfRU5BQkxFCSgxIDw8IDgpCisjIGRlZmluZSBHRU43X1BTX0RVQUxfU09VUkNFX0JMRU5EX0VOQUJMRQkJKDEgPDwgNykKKyMgZGVmaW5lIEdFTjdfUFNfUkVOREVSX1RBUkdFVF9SRVNPTFZFX0VOQUJMRQkJKDEgPDwgNikKKyMgZGVmaW5lIEdFTjdfUFNfUE9TT0ZGU0VUX05PTkUJCQkJKDAgPDwgMykKKyMgZGVmaW5lIEdFTjdfUFNfUE9TT0ZGU0VUX0NFTlRST0lECQkJKDIgPDwgMykKKyMgZGVmaW5lIEdFTjdfUFNfUE9TT0ZGU0VUX1NBTVBMRQkJCSgzIDw8IDMpCisjIGRlZmluZSBHRU43X1BTXzMyX0RJU1BBVENIX0VOQUJMRQkJCSgxIDw8IDIpCisjIGRlZmluZSBHRU43X1BTXzE2X0RJU1BBVENIX0VOQUJMRQkJCSgxIDw8IDEpCisjIGRlZmluZSBHRU43X1BTXzhfRElTUEFUQ0hfRU5BQkxFCQkJKDEgPDwgMCkKKy8qIERXNSAqLworIyBkZWZpbmUgR0VON19QU19ESVNQQVRDSF9TVEFSVF9HUkZfU0hJRlRfMAkJMTYKKyMgZGVmaW5lIEdFTjdfUFNfRElTUEFUQ0hfU1RBUlRfR1JGX1NISUZUXzEJCTgKKyMgZGVmaW5lIEdFTjdfUFNfRElTUEFUQ0hfU1RBUlRfR1JGX1NISUZUXzIJCTAKKy8qIERXNjoga2VybmVsIDEgcG9pbnRlciAqLworLyogRFc3OiBrZXJuZWwgMiBwb2ludGVyICovCisKKyNkZWZpbmUgXzNEU1RBVEVfU0FNUExFX01BU0sJCQkweDc4MTggLyogR0VONisgKi8KKworI2RlZmluZSBfM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRQkJMHg3OTAwCisjZGVmaW5lIF8zRFNUQVRFX0JMRU5EX0NPTlNUQU5UX0NPTE9SCQkweDc5MDEKKyNkZWZpbmUgXzNEU1RBVEVfQ0hST01BX0tFWQkJCTB4NzkwNAorI2RlZmluZSBfM0RTVEFURV9ERVBUSF9CVUZGRVIJCQkweDc5MDUgLyogR0VONC02ICovCisjZGVmaW5lIF8zRFNUQVRFX1BPTFlfU1RJUFBMRV9PRkZTRVQJCTB4NzkwNgorI2RlZmluZSBfM0RTVEFURV9QT0xZX1NUSVBQTEVfUEFUVEVSTgkJMHg3OTA3CisjZGVmaW5lIF8zRFNUQVRFX0xJTkVfU1RJUFBMRV9QQVRURVJOCQkweDc5MDgKKyNkZWZpbmUgXzNEU1RBVEVfR0xPQkFMX0RFUFRIX09GRlNFVF9DTEFNUAkweDc5MDkKKyNkZWZpbmUgXzNEU1RBVEVfQUFfTElORV9QQVJBTUVURVJTCQkweDc5MGEgLyogRzQ1KyAqLworCisjZGVmaW5lIF8zRFNUQVRFX0dTX1NWQl9JTkRFWAkJCTB4NzkwYiAvKiBDVEcrICovCisvKiBEVzEgKi8KKyMgZGVmaW5lIFNWQl9JTkRFWF9TSElGVAkJCQkyOQorIyBkZWZpbmUgU1ZCX0xPQURfSU5URVJOQUxfVkVSVEVYX0NPVU5UCQkJKDEgPDwgMCkgLyogU05CKyAqLworLyogRFcyOiBTVkIgaW5kZXggKi8KKy8qIERXMzogU1ZCIG1heGltdW0gaW5kZXggKi8KKworI2RlZmluZSBfM0RTVEFURV9NVUxUSVNBTVBMRQkJCTB4NzkwZCAvKiBHRU42KyAqLworI2RlZmluZSBHRU44XzNEU1RBVEVfTVVMVElTQU1QTEUJCTB4NzgwZCAvKiBHRU44KyAqLworLyogRFcxICovCisjIGRlZmluZSBNU19QSVhFTF9MT0NBVElPTl9DRU5URVIJCQkoMCA8PCA0KQorIyBkZWZpbmUgTVNfUElYRUxfTE9DQVRJT05fVVBQRVJfTEVGVAkJCSgxIDw8IDQpCisjIGRlZmluZSBNU19OVU1TQU1QTEVTXzEJCQkJKDAgPDwgMSkKKyMgZGVmaW5lIE1TX05VTVNBTVBMRVNfMgkJCQkoMSA8PCAxKQorIyBkZWZpbmUgTVNfTlVNU0FNUExFU180CQkJCSgyIDw8IDEpCisjIGRlZmluZSBNU19OVU1TQU1QTEVTXzgJCQkJKDMgPDwgMSkKKyMgZGVmaW5lIE1TX05VTVNBTVBMRVNfMTYJCQkJKDQgPDwgMSkKKworI2RlZmluZSBfM0RTVEFURV9TQU1QTEVfUEFUVEVSTiAgICAgICAgICAgICAgICAgMHg3OTFjCisKKyNkZWZpbmUgXzNEU1RBVEVfU1RFTkNJTF9CVUZGRVIJCQkweDc5MGUgLyogSUxLLCBTTkIgKi8KKyNkZWZpbmUgXzNEU1RBVEVfSElFUl9ERVBUSF9CVUZGRVIJCTB4NzkwZiAvKiBJTEssIFNOQiAqLworCisjZGVmaW5lIEdFTjdfM0RTVEFURV9DTEVBUl9QQVJBTVMJCTB4NzgwNAorI2RlZmluZSBHRU43XzNEU1RBVEVfREVQVEhfQlVGRkVSCQkweDc4MDUKKyNkZWZpbmUgR0VON18zRFNUQVRFX1NURU5DSUxfQlVGRkVSCQkweDc4MDYKKyMgZGVmaW5lIEhTV19TVEVOQ0lMX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMzEpCisjZGVmaW5lIEdFTjdfM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUgkJMHg3ODA3CisKKyNkZWZpbmUgXzNEU1RBVEVfQ0xFQVJfUEFSQU1TCQkJMHg3OTEwIC8qIElMSywgU05CICovCisjIGRlZmluZSBHRU41X0RFUFRIX0NMRUFSX1ZBTElECQkJCSgxIDw8IDE1KQorLyogRFcxOiBkZXB0aCBjbGVhciB2YWx1ZSAqLworLyogRFcyICovCisjIGRlZmluZSBHRU43X0RFUFRIX0NMRUFSX1ZBTElECQkJCSgxIDw8IDApCisKKyNkZWZpbmUgXzNEU1RBVEVfU09fREVDTF9MSVNUCQkJMHg3OTE3IC8qIEdFTjcrICovCisvKiBEVzEgKi8KKyMgZGVmaW5lIFNPX1NUUkVBTV9UT19CVUZGRVJfU0VMRUNUU18zX1NISUZUCQkxMgorIyBkZWZpbmUgU09fU1RSRUFNX1RPX0JVRkZFUl9TRUxFQ1RTXzNfTUFTSwkJSU5URUxfTUFTSygxNSwgMTIpCisjIGRlZmluZSBTT19TVFJFQU1fVE9fQlVGRkVSX1NFTEVDVFNfMl9TSElGVAkJOAorIyBkZWZpbmUgU09fU1RSRUFNX1RPX0JVRkZFUl9TRUxFQ1RTXzJfTUFTSwkJSU5URUxfTUFTSygxMSwgOCkKKyMgZGVmaW5lIFNPX1NUUkVBTV9UT19CVUZGRVJfU0VMRUNUU18xX1NISUZUCQk0CisjIGRlZmluZSBTT19TVFJFQU1fVE9fQlVGRkVSX1NFTEVDVFNfMV9NQVNLCQlJTlRFTF9NQVNLKDcsIDQpCisjIGRlZmluZSBTT19TVFJFQU1fVE9fQlVGRkVSX1NFTEVDVFNfMF9TSElGVAkJMAorIyBkZWZpbmUgU09fU1RSRUFNX1RPX0JVRkZFUl9TRUxFQ1RTXzBfTUFTSwkJSU5URUxfTUFTSygzLCAwKQorLyogRFcyICovCisjIGRlZmluZSBTT19OVU1fRU5UUklFU18zX1NISUZUCQkJCTI0CisjIGRlZmluZSBTT19OVU1fRU5UUklFU18zX01BU0sJCQkJSU5URUxfTUFTSygzMSwgMjQpCisjIGRlZmluZSBTT19OVU1fRU5UUklFU18yX1NISUZUCQkJCTE2CisjIGRlZmluZSBTT19OVU1fRU5UUklFU18yX01BU0sJCQkJSU5URUxfTUFTSygyMywgMTYpCisjIGRlZmluZSBTT19OVU1fRU5UUklFU18xX1NISUZUCQkJCTgKKyMgZGVmaW5lIFNPX05VTV9FTlRSSUVTXzFfTUFTSwkJCQlJTlRFTF9NQVNLKDE1LCA4KQorIyBkZWZpbmUgU09fTlVNX0VOVFJJRVNfMF9TSElGVAkJCQkwCisjIGRlZmluZSBTT19OVU1fRU5UUklFU18wX01BU0sJCQkJSU5URUxfTUFTSyg3LCAwKQorCisvKiBTT19ERUNMIERXMCAqLworIyBkZWZpbmUgU09fREVDTF9PVVRQVVRfQlVGRkVSX1NMT1RfU0hJRlQJCTEyCisjIGRlZmluZSBTT19ERUNMX09VVFBVVF9CVUZGRVJfU0xPVF9NQVNLCQlJTlRFTF9NQVNLKDEzLCAxMikKKyMgZGVmaW5lIFNPX0RFQ0xfSE9MRV9GTEFHCQkJCSgxIDw8IDExKQorIyBkZWZpbmUgU09fREVDTF9SRUdJU1RFUl9JTkRFWF9TSElGVAkJCTQKKyMgZGVmaW5lIFNPX0RFQ0xfUkVHSVNURVJfSU5ERVhfTUFTSwkJCUlOVEVMX01BU0soOSwgNCkKKyMgZGVmaW5lIFNPX0RFQ0xfQ09NUE9ORU5UX01BU0tfU0hJRlQJCQkwCisjIGRlZmluZSBTT19ERUNMX0NPTVBPTkVOVF9NQVNLX01BU0sJCQlJTlRFTF9NQVNLKDMsIDApCisKKyNkZWZpbmUgXzNEU1RBVEVfU09fQlVGRkVSICAgICAgICAgICAgICAgICAgICAweDc5MTggLyogR0VONysgKi8KKy8qIERXMSAqLworIyBkZWZpbmUgR0VOOF9TT19CVUZGRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzMSkKKyMgZGVmaW5lIFNPX0JVRkZFUl9JTkRFWF9TSElGVAkJCQkyOQorIyBkZWZpbmUgU09fQlVGRkVSX0lOREVYX01BU0sJCQkJSU5URUxfTUFTSygzMCwgMjkpCisjIGRlZmluZSBHRU44X1NPX0JVRkZFUl9PRkZTRVRfV1JJVEVfRU5BQkxFICAgICAgICAgICAgICgxIDw8IDIxKQorIyBkZWZpbmUgR0VOOF9TT19CVUZGRVJfT0ZGU0VUX0FERFJFU1NfRU5BQkxFICAgICAgICAgICAoMSA8PCAyMCkKKyMgZGVmaW5lIFNPX0JVRkZFUl9QSVRDSF9TSElGVAkJCQkwCisjIGRlZmluZSBTT19CVUZGRVJfUElUQ0hfTUFTSwkJCQlJTlRFTF9NQVNLKDExLCAwKQorLyogRFcyOiBzdGFydCBhZGRyZXNzICovCisvKiBEVzM6IGVuZCBhZGRyZXNzLiAqLworCisjZGVmaW5lIENNRF9NSV9GTFVTSCAgICAgICAgICAgICAgICAgIDB4MDIwMAorCisjIGRlZmluZSBCTFRfWF9TSElGVAkJCQkJMAorIyBkZWZpbmUgQkxUX1hfTUFTSwkJCQkJSU5URUxfTUFTSygxNSwgMCkKKyMgZGVmaW5lIEJMVF9ZX1NISUZUCQkJCQkxNgorIyBkZWZpbmUgQkxUX1lfTUFTSwkJCQkJSU5URUxfTUFTSygzMSwgMTYpCisKKyNkZWZpbmUgR0VONV9NSV9SRVBPUlRfUEVSRl9DT1VOVCAoKDB4MjYgPDwgMjMpIHwgKDMgLSAyKSkKKy8qIERXMCAqLworIyBkZWZpbmUgR0VONV9NSV9DT1VOVEVSX1NFVF8wICAgICAgKDAgPDwgNikKKyMgZGVmaW5lIEdFTjVfTUlfQ09VTlRFUl9TRVRfMSAgICAgICgxIDw8IDYpCisvKiBEVzEgKi8KKyMgZGVmaW5lIE1JX0NPVU5URVJfQUREUkVTU19HVFQgICAgICgxIDw8IDApCisvKiBEVzI6IGEgdXNlci1kZWZpbmVkIHJlcG9ydCBJRCAod3JpdHRlbiB0byB0aGUgYnVmZmVyIGJ1dCBjYW4gYmUgYW55dGhpbmcpICovCisKKyNkZWZpbmUgR0VONl9NSV9SRVBPUlRfUEVSRl9DT1VOVCAoKDB4MjggPDwgMjMpIHwgKDMgLSAyKSkKKworLyogQml0ZmllbGRzIGZvciB0aGUgVVJCX1dSSVRFIG1lc3NhZ2UsIERXMiBvZiBtZXNzYWdlIGhlYWRlcjogKi8KKyNkZWZpbmUgVVJCX1dSSVRFX1BSSU1fRU5ECQkweDEKKyNkZWZpbmUgVVJCX1dSSVRFX1BSSU1fU1RBUlQJCTB4MgorI2RlZmluZSBVUkJfV1JJVEVfUFJJTV9UWVBFX1NISUZUCTIKKworCisvKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgY2FuIGJlIGFkZHJlc3NlZCB1c2luZyBhIGJpbmRpbmcgdGFibGUKKyAqIHBvaW50ZXIgb2YgdHlwZSBTVVJGVFlQRV9CVUZGRVIKKyAqLworI2RlZmluZSBCUldfTUFYX05VTV9CVUZGRVJfRU5UUklFUwkoMSA8PCAyNykKKworLyogTWVtb3J5IE9iamVjdCBDb250cm9sIFN0YXRlOgorICogU3BlY2lmeWluZyB6ZXJvIGZvciBMMyBtZWFucyAidW5jYWNoZWQgaW4gTDMiLCBhdCBsZWFzdCBvbiBIYXN3ZWxsCisgKiBhbmQgQmF5dHJhaWwsIHNpbmNlIHRoZXJlIGFyZSBubyBQVEUgZmxhZ3MgZm9yIHNldHRpbmcgTDMgY2FjaGVhYmlsaXR5LgorICogT24gSXZ5YnJpZGdlLCB0aGUgUFRFcyBkbyBoYXZlIGEgY2FjaGUtaW4tTDMgYml0LCBzbyBzZXR0aW5nIE1PQ1MgdG8gMAorICogbWF5IHN0aWxsIHJlc3BlY3QgdGhhdC4KKyAqLworI2RlZmluZSBHRU43X01PQ1NfTDMgICAgICAgICAgICAgICAgICAgIDEKKworLyogSXZ5YnJpZGdlIG9ubHk6IGNhY2hlIGluIExMQy4KKyAqIFNwZWNpZnlpbmcgemVybyBoZXJlIG1lYW5zIHRvIHVzZSB0aGUgUFRFIHZhbHVlcyBzZXQgYnkgdGhlIGtlcm5lbDsKKyAqIG5vbi16ZXJvIG92ZXJyaWRlcyB0aGUgUFRFIHZhbHVlcy4KKyAqLworI2RlZmluZSBJVkJfTU9DU19MTEMgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisKKy8qIEJheXRyYWlsIG9ubHk6IHNub29wIGluIENQVSBjYWNoZSAqLworI2RlZmluZSBCWVRfTU9DU19TTk9PUCAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisKKy8qIEhhc3dlbGwgb25seTogTExDL2VMTEMgY29udHJvbHMgKHdyaXRlLWJhY2sgb3IgdW5jYWNoZWQpLgorICogU3BlY2lmeWluZyB6ZXJvIGhlcmUgbWVhbnMgdG8gdXNlIHRoZSBQVEUgdmFsdWVzIHNldCBieSB0aGUga2VybmVsLAorICogd2hpY2ggaXMgdXNlZnVsIHNpbmNlIGl0IG9mZmVycyBhZGRpdGlvbmFsIGNvbnRyb2wgKHdyaXRlLXRocm91Z2gKKyAqIGNhY2hlaW5nIGFuZCBhZ2UpLiAgTm9uLXplcm8gb3ZlcnJpZGVzIHRoZSBQVEUgdmFsdWVzLgorICovCisjZGVmaW5lIEhTV19NT0NTX1VDX0xMQ19VQ19FTExDICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgSFNXX01PQ1NfV0JfTExDX1dCX0VMTEMgICAgICAgICAoMiA8PCAxKQorI2RlZmluZSBIU1dfTU9DU19VQ19MTENfV0JfRUxMQyAgICAgICAgICgzIDw8IDEpCisKKy8qIEJyb2Fkd2VsbDogd3JpdGUtYmFjayBvciB3cml0ZS10aHJvdWdoOyBhbHdheXMgdXNlIGFsbCB0aGUgY2FjaGVzLiAqLworI2RlZmluZSBCRFdfTU9DU19XQiAweDc4CisjZGVmaW5lIEJEV19NT0NTX1dUIDB4NTgKKworI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2RldmljZV9pbmZvLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2RldmljZV9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2ZTEzYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZGV2aWNlX2luZm8uYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImJyd19kZXZpY2VfaW5mby5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJyd19kZXZpY2VfaW5mbyBicndfZGV2aWNlX2luZm9faTk2NSA9IHsKKyAgIC5nZW4gPSA0LAorICAgLmhhc19uZWdhdGl2ZV9yaHdfYnVnID0gdHJ1ZSwKKyAgIC5uZWVkc191bmxpdF9jZW50cm9pZF93b3JrYXJvdW5kID0gdHJ1ZSwKKyAgIC5tYXhfdnNfdGhyZWFkcyA9IDE2LAorICAgLm1heF9nc190aHJlYWRzID0gMiwKKyAgIC5tYXhfd21fdGhyZWFkcyA9IDggKiA0LAorICAgLnVyYiA9IHsKKyAgICAgIC5zaXplID0gMjU2LAorICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvIGJyd19kZXZpY2VfaW5mb19nNHggPSB7CisgICAuZ2VuID0gNCwKKyAgIC5oYXNfcGxuID0gdHJ1ZSwKKyAgIC5oYXNfY29tcHI0ID0gdHJ1ZSwKKyAgIC5oYXNfc3VyZmFjZV90aWxlX29mZnNldCA9IHRydWUsCisgICAubmVlZHNfdW5saXRfY2VudHJvaWRfd29ya2Fyb3VuZCA9IHRydWUsCisgICAuaXNfZzR4ID0gdHJ1ZSwKKyAgIC5tYXhfdnNfdGhyZWFkcyA9IDMyLAorICAgLm1heF9nc190aHJlYWRzID0gMiwKKyAgIC5tYXhfd21fdGhyZWFkcyA9IDEwICogNSwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDM4NCwKKyAgIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJyd19kZXZpY2VfaW5mbyBicndfZGV2aWNlX2luZm9faWxrID0geworICAgLmdlbiA9IDUsCisgICAuaGFzX3BsbiA9IHRydWUsCisgICAuaGFzX2NvbXByNCA9IHRydWUsCisgICAuaGFzX3N1cmZhY2VfdGlsZV9vZmZzZXQgPSB0cnVlLAorICAgLm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPSB0cnVlLAorICAgLm1heF92c190aHJlYWRzID0gNzIsCisgICAubWF4X2dzX3RocmVhZHMgPSAzMiwKKyAgIC5tYXhfd21fdGhyZWFkcyA9IDEyICogNiwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDEwMjQsCisgICB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBicndfZGV2aWNlX2luZm8gYnJ3X2RldmljZV9pbmZvX3NuYl9ndDEgPSB7CisgICAuZ2VuID0gNiwKKyAgIC5ndCA9IDEsCisgICAuaGFzX2hpel9hbmRfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAuaGFzX2xsYyA9IHRydWUsCisgICAuaGFzX3BsbiA9IHRydWUsCisgICAuaGFzX3N1cmZhY2VfdGlsZV9vZmZzZXQgPSB0cnVlLAorICAgLm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPSB0cnVlLAorICAgLm1heF92c190aHJlYWRzID0gMjQsCisgICAubWF4X2dzX3RocmVhZHMgPSAyMSwgLyogY29uc2VydmF0aXZlOyAyNCBpZiByZW5kZXJpbmcgZGlzYWJsZWQuICovCisgICAubWF4X3dtX3RocmVhZHMgPSA0MCwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDMyLAorICAgICAgLm1pbl92c19lbnRyaWVzID0gMjQsCisgICAgICAubWF4X3ZzX2VudHJpZXMgPSAyNTYsCisgICAgICAubWF4X2dzX2VudHJpZXMgPSAyNTYsCisgICB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBicndfZGV2aWNlX2luZm8gYnJ3X2RldmljZV9pbmZvX3NuYl9ndDIgPSB7CisgICAuZ2VuID0gNiwKKyAgIC5ndCA9IDIsCisgICAuaGFzX2hpel9hbmRfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAuaGFzX2xsYyA9IHRydWUsCisgICAuaGFzX3BsbiA9IHRydWUsCisgICAuaGFzX3N1cmZhY2VfdGlsZV9vZmZzZXQgPSB0cnVlLAorICAgLm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPSB0cnVlLAorICAgLm1heF92c190aHJlYWRzID0gNjAsCisgICAubWF4X2dzX3RocmVhZHMgPSA2MCwKKyAgIC5tYXhfd21fdGhyZWFkcyA9IDgwLAorICAgLnVyYiA9IHsKKyAgICAgIC5zaXplID0gNjQsCisgICAgICAubWluX3ZzX2VudHJpZXMgPSAyNCwKKyAgICAgIC5tYXhfdnNfZW50cmllcyA9IDI1NiwKKyAgICAgIC5tYXhfZ3NfZW50cmllcyA9IDI1NiwKKyAgIH0sCit9OworCisvLyNkZWZpbmUgR0VON19GRUFUVVJFUworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJyd19kZXZpY2VfaW5mbyBicndfZGV2aWNlX2luZm9faXZiX2d0MSA9IHsKKyAgICAuZ2VuID0gNywKKyAgICAuaGFzX2hpel9hbmRfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAgLm11c3RfdXNlX3NlcGFyYXRlX3N0ZW5jaWwgPSB0cnVlLAorICAgIC5oYXNfbGxjID0gdHJ1ZSwKKyAgICAuaGFzX3BsbiA9IHRydWUsCisgICAgLmhhc19zdXJmYWNlX3RpbGVfb2Zmc2V0ID0gdHJ1ZSwKKyAgICAubmVlZHNfdW5saXRfY2VudHJvaWRfd29ya2Fyb3VuZCA9IHRydWUsCisgICAgLmlzX2l2eWJyaWRnZSA9IHRydWUsCisgICAgLmd0ID0gMSwKKyAgIC5tYXhfdnNfdGhyZWFkcyA9IDM2LAorICAgLm1heF9nc190aHJlYWRzID0gMzYsCisgICAubWF4X3dtX3RocmVhZHMgPSA0OCwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDEyOCwKKyAgICAgIC5taW5fdnNfZW50cmllcyA9IDMyLAorICAgICAgLm1heF92c19lbnRyaWVzID0gNTEyLAorICAgICAgLm1heF9nc19lbnRyaWVzID0gMTkyLAorICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvIGJyd19kZXZpY2VfaW5mb19pdmJfZ3QyID0geworICAgIC5nZW4gPSA3LAorICAgIC5oYXNfaGl6X2FuZF9zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZSwKKyAgICAubXVzdF91c2Vfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAgLmhhc19wbG4gPSB0cnVlLAorICAgIC5oYXNfc3VyZmFjZV90aWxlX29mZnNldCA9IHRydWUsCisgICAgLm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPSB0cnVlLAorICAgIC5pc19pdnlicmlkZ2UgPSB0cnVlLCAuZ3QgPSAyLAorICAgLmhhc19sbGMgPSBmYWxzZSwKKyAgIC5tYXhfdnNfdGhyZWFkcyA9IDEyOCwKKyAgIC5tYXhfZ3NfdGhyZWFkcyA9IDEyOCwKKyAgIC5tYXhfd21fdGhyZWFkcyA9IDE3MiwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDI1NiwKKyAgICAgIC5taW5fdnNfZW50cmllcyA9IDMyLAorICAgICAgLm1heF92c19lbnRyaWVzID0gNzA0LAorICAgICAgLm1heF9nc19lbnRyaWVzID0gMzIwLAorICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvIGJyd19kZXZpY2VfaW5mb19ieXQgPSB7CisgICAgLmdlbiA9IDcsCisgICAgLmhhc19oaXpfYW5kX3NlcGFyYXRlX3N0ZW5jaWwgPSB0cnVlLAorICAgIC5tdXN0X3VzZV9zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZSwKKyAgICAuaGFzX3BsbiA9IHRydWUsCisgICAgLmhhc19zdXJmYWNlX3RpbGVfb2Zmc2V0ID0gdHJ1ZSwKKyAgICAubmVlZHNfdW5saXRfY2VudHJvaWRfd29ya2Fyb3VuZCA9IHRydWUsCisgICAgLmlzX2JheXRyYWlsID0gdHJ1ZSwgLmd0ID0gMSwKKyAgIC5oYXNfbGxjID0gZmFsc2UsCisgICAubWF4X3ZzX3RocmVhZHMgPSAzNiwKKyAgIC5tYXhfZ3NfdGhyZWFkcyA9IDM2LAorICAgLm1heF93bV90aHJlYWRzID0gNDgsCisgICAudXJiID0geworICAgICAgLnNpemUgPSAxMjgsCisgICAgICAubWluX3ZzX2VudHJpZXMgPSAzMiwKKyAgICAgIC5tYXhfdnNfZW50cmllcyA9IDUxMiwKKyAgICAgIC5tYXhfZ3NfZW50cmllcyA9IDE5MiwKKyAgIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJyd19kZXZpY2VfaW5mbyBicndfZGV2aWNlX2luZm9faHN3X2d0MSA9IHsKKyAgICAuZ2VuID0gNywKKyAgICAuaGFzX2hpel9hbmRfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAgLm11c3RfdXNlX3NlcGFyYXRlX3N0ZW5jaWwgPSB0cnVlLAorICAgIC5oYXNfbGxjID0gdHJ1ZSwKKyAgICAuaGFzX3BsbiA9IHRydWUsCisgICAgLmhhc19zdXJmYWNlX3RpbGVfb2Zmc2V0ID0gdHJ1ZSwKKyAgICAubmVlZHNfdW5saXRfY2VudHJvaWRfd29ya2Fyb3VuZCA9IHRydWUsCisgICAgLmlzX2hhc3dlbGwgPSB0cnVlLCAuZ3QgPSAxLAorICAgLm1heF92c190aHJlYWRzID0gNzAsCisgICAubWF4X2dzX3RocmVhZHMgPSA3MCwKKyAgIC5tYXhfd21fdGhyZWFkcyA9IDEwMiwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDEyOCwKKyAgICAgIC5taW5fdnNfZW50cmllcyA9IDMyLAorICAgICAgLm1heF92c19lbnRyaWVzID0gNjQwLAorICAgICAgLm1heF9nc19lbnRyaWVzID0gMjU2LAorICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvIGJyd19kZXZpY2VfaW5mb19oc3dfZ3QyID0geworICAgIC5nZW4gPSA3LAorICAgIC5oYXNfaGl6X2FuZF9zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZSwKKyAgICAubXVzdF91c2Vfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAgLmhhc19sbGMgPSB0cnVlLAorICAgIC5oYXNfcGxuID0gdHJ1ZSwKKyAgICAuaGFzX3N1cmZhY2VfdGlsZV9vZmZzZXQgPSB0cnVlLAorICAgIC5uZWVkc191bmxpdF9jZW50cm9pZF93b3JrYXJvdW5kID0gdHJ1ZSwKKyAgICAuaXNfaGFzd2VsbCA9IHRydWUsIC5ndCA9IDIsCisgICAubWF4X3ZzX3RocmVhZHMgPSAyODAsCisgICAubWF4X2dzX3RocmVhZHMgPSAyNTYsCisgICAubWF4X3dtX3RocmVhZHMgPSAyMDQsCisgICAudXJiID0geworICAgICAgLnNpemUgPSAyNTYsCisgICAgICAubWluX3ZzX2VudHJpZXMgPSA2NCwKKyAgICAgIC5tYXhfdnNfZW50cmllcyA9IDE2NjQsCisgICAgICAubWF4X2dzX2VudHJpZXMgPSA2NDAsCisgICB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBicndfZGV2aWNlX2luZm8gYnJ3X2RldmljZV9pbmZvX2hzd19ndDMgPSB7CisgICAgLmdlbiA9IDcsCisgICAgLmhhc19oaXpfYW5kX3NlcGFyYXRlX3N0ZW5jaWwgPSB0cnVlLAorICAgIC5tdXN0X3VzZV9zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZSwKKyAgICAuaGFzX2xsYyA9IHRydWUsCisgICAgLmhhc19wbG4gPSB0cnVlLAorICAgIC5oYXNfc3VyZmFjZV90aWxlX29mZnNldCA9IHRydWUsCisgICAgLm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPSB0cnVlLAorICAgIC5pc19oYXN3ZWxsID0gdHJ1ZSwgLmd0ID0gMywKKyAgIC5tYXhfdnNfdGhyZWFkcyA9IDI4MCwKKyAgIC5tYXhfZ3NfdGhyZWFkcyA9IDI1NiwKKyAgIC5tYXhfd21fdGhyZWFkcyA9IDQwOCwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDUxMiwKKyAgICAgIC5taW5fdnNfZW50cmllcyA9IDY0LAorICAgICAgLm1heF92c19lbnRyaWVzID0gMTY2NCwKKyAgICAgIC5tYXhfZ3NfZW50cmllcyA9IDY0MCwKKyAgIH0sCit9OworCisvLyNkZWZpbmUgR0VOOF9GRUFUVVJFUworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJyd19kZXZpY2VfaW5mbyBicndfZGV2aWNlX2luZm9fYmR3X2d0MSA9IHsKKyAgICAuZ2VuID0gOCwKKyAgICAuaGFzX2hpel9hbmRfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAgLm11c3RfdXNlX3NlcGFyYXRlX3N0ZW5jaWwgPSB0cnVlLAorICAgIC5oYXNfbGxjID0gdHJ1ZSwKKyAgICAuaGFzX3BsbiA9IHRydWUsCisgICAgLm1heF92c190aHJlYWRzID0gNTA0LAorICAgIC5tYXhfZ3NfdGhyZWFkcyA9IDUwNCwKKyAgICAubWF4X3dtX3RocmVhZHMgPSAzODQsCisgICAgLmd0ID0gMSwKKyAgIC51cmIgPSB7CisgICAgICAuc2l6ZSA9IDE5MiwKKyAgICAgIC5taW5fdnNfZW50cmllcyA9IDY0LAorICAgICAgLm1heF92c19lbnRyaWVzID0gMjU2MCwKKyAgICAgIC5tYXhfZ3NfZW50cmllcyA9IDk2MCwKKyAgIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvIGJyd19kZXZpY2VfaW5mb19iZHdfZ3QyID0geworICAgIC5nZW4gPSA4LAorICAgIC5oYXNfaGl6X2FuZF9zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZSwKKyAgICAubXVzdF91c2Vfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWUsCisgICAgLmhhc19sbGMgPSB0cnVlLAorICAgIC5oYXNfcGxuID0gdHJ1ZSwKKyAgICAubWF4X3ZzX3RocmVhZHMgPSA1MDQsCisgICAgLm1heF9nc190aHJlYWRzID0gNTA0LAorICAgIC5tYXhfd21fdGhyZWFkcyA9IDM4NCwKKyAgICAuZ3QgPSAyLAorICAgLnVyYiA9IHsKKyAgICAgIC5zaXplID0gMzg0LAorICAgICAgLm1pbl92c19lbnRyaWVzID0gNjQsCisgICAgICAubWF4X3ZzX2VudHJpZXMgPSAyNTYwLAorICAgICAgLm1heF9nc19lbnRyaWVzID0gOTYwLAorICAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBicndfZGV2aWNlX2luZm8gYnJ3X2RldmljZV9pbmZvX2Jkd19ndDMgPSB7CisgICAgLmdlbiA9IDgsCisgICAgLmhhc19oaXpfYW5kX3NlcGFyYXRlX3N0ZW5jaWwgPSB0cnVlLAorICAgIC5tdXN0X3VzZV9zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZSwKKyAgICAuaGFzX2xsYyA9IHRydWUsCisgICAgLmhhc19wbG4gPSB0cnVlLAorICAgIC5tYXhfdnNfdGhyZWFkcyA9IDUwNCwKKyAgICAubWF4X2dzX3RocmVhZHMgPSA1MDQsCisgICAgLm1heF93bV90aHJlYWRzID0gMzg0LAorICAgIC5ndCA9IDMsCisgICAudXJiID0geworICAgICAgLnNpemUgPSAzODQsCisgICAgICAubWluX3ZzX2VudHJpZXMgPSA2NCwKKyAgICAgIC5tYXhfdnNfZW50cmllcyA9IDI1NjAsCisgICAgICAubWF4X2dzX2VudHJpZXMgPSA5NjAsCisgICB9Cit9OworCisvKiBUaHJlYWQgY291bnRzIGFuZCBVUkIgbGltaXRzIGFyZSBwbGFjZWhvbGRlcnMsIGFuZCBtYXkgbm90IGJlIGFjY3VyYXRlLgorICogVGhlc2Ugd2VyZSBjb3BpZWQgZnJvbSBIYXN3ZWxsIEdUMSwgYWJvdmUuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvIGJyd19kZXZpY2VfaW5mb19jaHYgPSB7CisgICAgLmdlbiA9IDgsCisgICAgLmhhc19oaXpfYW5kX3NlcGFyYXRlX3N0ZW5jaWwgPSB0cnVlLAorICAgIC5tdXN0X3VzZV9zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZSwKKyAgICAuaGFzX3BsbiA9IHRydWUsCisgICAgLmlzX2NoZXJyeXZpZXcgPSAxLCAuZ3QgPSAxLAorICAgLmhhc19sbGMgPSBmYWxzZSwKKyAgIC5tYXhfdnNfdGhyZWFkcyA9IDcwLAorICAgLm1heF9nc190aHJlYWRzID0gNzAsCisgICAubWF4X3dtX3RocmVhZHMgPSAxMDIsCisgICAudXJiID0geworICAgICAgLnNpemUgPSAxMjgsCisgICAgICAubWluX3ZzX2VudHJpZXMgPSA2NCwKKyAgICAgIC5tYXhfdnNfZW50cmllcyA9IDY0MCwKKyAgICAgIC5tYXhfZ3NfZW50cmllcyA9IDI1NiwKKyAgIH0KK307CisKK2NvbnN0IHN0cnVjdCBicndfZGV2aWNlX2luZm8gKgorYnJ3X2dldF9kZXZpY2VfaW5mbyhpbnQgZGV2aWQpCit7CisgICBzd2l0Y2ggKGRldmlkKSB7CisjdW5kZWYgQ0hJUFNFVAorI2RlZmluZSBDSElQU0VUKGlkLCBmYW1pbHksIG5hbWUpIGNhc2UgaWQ6IHJldHVybiAmYnJ3X2RldmljZV9pbmZvXyMjZmFtaWx5OworI2luY2x1ZGUgInBjaV9pZHMvaTk2NV9wY2lfaWRzLmgiCisgICBkZWZhdWx0OgorICAgICAgZnByaW50ZihzdGRlcnIsICJpOTY1X2RyaS5zbyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAweCV4IFBDSSBJRC5cbiIsIGRldmlkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZXZpY2VfaW5mby5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZXZpY2VfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDZiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2RldmljZV9pbmZvLmgKQEAgLTAsMCArMSw4MSBAQAorIC8qCisgICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAgKgorICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAgKgorICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgICogU29mdHdhcmUuCisgICoKKyAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgICogSU4gVEhFIFNPRlRXQVJFLgorICAqCisgICovCisKKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworc3RydWN0IGJyd19kZXZpY2VfaW5mbworeworICAgaW50IGdlbjsgLyoqPCBHZW5lcmF0aW9uIG51bWJlcjogNCwgNSwgNiwgNywgLi4uICovCisgICBpbnQgZ3Q7CisKKyAgIGJvb2wgaXNfZzR4OworICAgYm9vbCBpc19pdnlicmlkZ2U7CisgICBib29sIGlzX2JheXRyYWlsOworICAgYm9vbCBpc19oYXN3ZWxsOworICAgYm9vbCBpc19jaGVycnl2aWV3OworCisgICBib29sIGhhc19oaXpfYW5kX3NlcGFyYXRlX3N0ZW5jaWw7CisgICBib29sIG11c3RfdXNlX3NlcGFyYXRlX3N0ZW5jaWw7CisKKyAgIGJvb2wgaGFzX2xsYzsKKworICAgYm9vbCBoYXNfcGxuOworICAgYm9vbCBoYXNfY29tcHI0OworICAgYm9vbCBoYXNfc3VyZmFjZV90aWxlX29mZnNldDsKKworICAgLyoqCisgICAgKiBRdWlya3M6CisgICAgKiAgQHsKKyAgICAqLworICAgYm9vbCBoYXNfbmVnYXRpdmVfcmh3X2J1ZzsKKworICAgLyoqCisgICAgKiBTb21lIHZlcnNpb25zIG9mIEdlbiBoYXJkd2FyZSBkb24ndCBkbyBjZW50cm9pZCBpbnRlcnBvbGF0aW9uIGNvcnJlY3RseQorICAgICogb24gdW5saXQgcGl4ZWxzLCBjYXVzaW5nIGluY29ycmVjdCB2YWx1ZXMgZm9yIGRlcml2YXRpdmVzIG5lYXIgdHJpYW5nbGUKKyAgICAqIGVkZ2VzLiAgRW5hYmxpbmcgdGhpcyBmbGFnIGNhdXNlcyB0aGUgZnJhZ21lbnQgc2hhZGVyIHRvIHVzZQorICAgICogbm9uLWNlbnRyb2lkIGludGVycG9sYXRpb24gZm9yIHVubGl0IHBpeGVscywgYXQgdGhlIGV4cGVuc2Ugb2YgdHdvIGV4dHJhCisgICAgKiBmcmFnbWVudCBzaGFkZXIgaW5zdHJ1Y3Rpb25zLgorICAgICovCisgICBib29sIG5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQ7CisgICAvKiogQH0gKi8KKworICAgLyoqCisgICAgKiBHUFUgTGltaXRzOgorICAgICogIEB7CisgICAgKi8KKyAgIHVuc2lnbmVkIG1heF92c190aHJlYWRzOworICAgdW5zaWduZWQgbWF4X2dzX3RocmVhZHM7CisgICB1bnNpZ25lZCBtYXhfd21fdGhyZWFkczsKKworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIHNpemU7CisgICAgICB1bnNpZ25lZCBtaW5fdnNfZW50cmllczsKKyAgICAgIHVuc2lnbmVkIG1heF92c19lbnRyaWVzOworICAgICAgdW5zaWduZWQgbWF4X2dzX2VudHJpZXM7CisgICB9IHVyYjsKKyAgIC8qKiBAfSAqLworfTsKKworY29uc3Qgc3RydWN0IGJyd19kZXZpY2VfaW5mbyAqYnJ3X2dldF9kZXZpY2VfaW5mbyhpbnQgZGV2aWQpOwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19kaXNhc20uYyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZGlzYXNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0MTcyYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZGlzYXNtLmMKQEAgLTAsMCArMSwxNDY2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDggS2VpdGggUGFja2FyZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfZGVmaW5lcy5oIgorCitjb25zdCBzdHJ1Y3Qgb3Bjb2RlX2Rlc2Mgb3Bjb2RlX2Rlc2NzWzEyOF0gPSB7CisgICAgW0JSV19PUENPREVfTU9WXSA9IHsgLm5hbWUgPSAibW92IiwgLm5zcmMgPSAxLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9GUkNdID0geyAubmFtZSA9ICJmcmMiLCAubnNyYyA9IDEsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX1JORFVdID0geyAubmFtZSA9ICJybmR1IiwgLm5zcmMgPSAxLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9STkREXSA9IHsgLm5hbWUgPSAicm5kZCIsIC5uc3JjID0gMSwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfUk5ERV0gPSB7IC5uYW1lID0gInJuZGUiLCAubnNyYyA9IDEsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX1JORFpdID0geyAubmFtZSA9ICJybmR6IiwgLm5zcmMgPSAxLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9OT1RdID0geyAubmFtZSA9ICJub3QiLCAubnNyYyA9IDEsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX0xaRF0gPSB7IC5uYW1lID0gImx6ZCIsIC5uc3JjID0gMSwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfRjMyVE8xNl0gPSB7IC5uYW1lID0gImYzMnRvMTYiLCAubnNyYyA9IDEsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX0YxNlRPMzJdID0geyAubmFtZSA9ICJmMTZ0bzMyIiwgLm5zcmMgPSAxLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9CRlJFVl0gPSB7IC5uYW1lID0gImJmcmV2IiwgLm5zcmMgPSAxLCAubmRzdCA9IDF9LAorICAgIFtCUldfT1BDT0RFX0ZCSF0gPSB7IC5uYW1lID0gImZiaCIsIC5uc3JjID0gMSwgLm5kc3QgPSAxfSwKKyAgICBbQlJXX09QQ09ERV9GQkxdID0geyAubmFtZSA9ICJmYmwiLCAubnNyYyA9IDEsIC5uZHN0ID0gMX0sCisgICAgW0JSV19PUENPREVfQ0JJVF0gPSB7IC5uYW1lID0gImNiaXQiLCAubnNyYyA9IDEsIC5uZHN0ID0gMX0sCisKKyAgICBbQlJXX09QQ09ERV9NVUxdID0geyAubmFtZSA9ICJtdWwiLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX01BQ10gPSB7IC5uYW1lID0gIm1hYyIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfTUFDSF0gPSB7IC5uYW1lID0gIm1hY2giLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX0xJTkVdID0geyAubmFtZSA9ICJsaW5lIiwgLm5zcmMgPSAyLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9QTE5dID0geyAubmFtZSA9ICJwbG4iLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX01BRF0gPSB7IC5uYW1lID0gIm1hZCIsIC5uc3JjID0gMywgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfTFJQXSA9IHsgLm5hbWUgPSAibHJwIiwgLm5zcmMgPSAzLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9TQUQyXSA9IHsgLm5hbWUgPSAic2FkMiIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfU0FEQTJdID0geyAubmFtZSA9ICJzYWRhMiIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfRFA0XSA9IHsgLm5hbWUgPSAiZHA0IiwgLm5zcmMgPSAyLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9EUEhdID0geyAubmFtZSA9ICJkcGgiLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX0RQM10gPSB7IC5uYW1lID0gImRwMyIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfRFAyXSA9IHsgLm5hbWUgPSAiZHAyIiwgLm5zcmMgPSAyLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9NQVRIXSA9IHsgLm5hbWUgPSAibWF0aCIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisKKyAgICBbQlJXX09QQ09ERV9BVkddID0geyAubmFtZSA9ICJhdmciLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX0FERF0gPSB7IC5uYW1lID0gImFkZCIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfU0VMXSA9IHsgLm5hbWUgPSAic2VsIiwgLm5zcmMgPSAyLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9BTkRdID0geyAubmFtZSA9ICJhbmQiLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX09SXSA9IHsgLm5hbWUgPSAib3IiLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX1hPUl0gPSB7IC5uYW1lID0gInhvciIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfU0hSXSA9IHsgLm5hbWUgPSAic2hyIiwgLm5zcmMgPSAyLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9TSExdID0geyAubmFtZSA9ICJzaGwiLCAubnNyYyA9IDIsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX0FTUl0gPSB7IC5uYW1lID0gImFzciIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfQ01QXSA9IHsgLm5hbWUgPSAiY21wIiwgLm5zcmMgPSAyLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9DTVBOXSA9IHsgLm5hbWUgPSAiY21wbiIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfQkZFXSA9IHsgLm5hbWUgPSAiYmZlIiwgLm5zcmMgPSAzLCAubmRzdCA9IDF9LAorICAgIFtCUldfT1BDT0RFX0JGSTFdID0geyAubmFtZSA9ICJiZmkxIiwgLm5zcmMgPSAyLCAubmRzdCA9IDF9LAorICAgIFtCUldfT1BDT0RFX0JGSTJdID0geyAubmFtZSA9ICJiZmkyIiwgLm5zcmMgPSAzLCAubmRzdCA9IDF9LAorICAgIFtCUldfT1BDT0RFX0FERENdID0geyAubmFtZSA9ICJhZGRjIiwgLm5zcmMgPSAyLCAubmRzdCA9IDF9LAorICAgIFtCUldfT1BDT0RFX1NVQkJdID0geyAubmFtZSA9ICJzdWJiIiwgLm5zcmMgPSAyLCAubmRzdCA9IDF9LAorCisgICAgW0JSV19PUENPREVfU0VORF0gPSB7IC5uYW1lID0gInNlbmQiLCAubnNyYyA9IDEsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX1NFTkRDXSA9IHsgLm5hbWUgPSAic2VuZGMiLCAubnNyYyA9IDEsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX05PUF0gPSB7IC5uYW1lID0gIm5vcCIsIC5uc3JjID0gMCwgLm5kc3QgPSAwIH0sCisgICAgW0JSV19PUENPREVfSk1QSV0gPSB7IC5uYW1lID0gImptcGkiLCAubnNyYyA9IDAsIC5uZHN0ID0gMCB9LAorICAgIFtCUldfT1BDT0RFX0lGXSA9IHsgLm5hbWUgPSAiaWYiLCAubnNyYyA9IDIsIC5uZHN0ID0gMCB9LAorICAgIFtCUldfT1BDT0RFX0lGRl0gPSB7IC5uYW1lID0gImlmZiIsIC5uc3JjID0gMiwgLm5kc3QgPSAxIH0sCisgICAgW0JSV19PUENPREVfV0hJTEVdID0geyAubmFtZSA9ICJ3aGlsZSIsIC5uc3JjID0gMiwgLm5kc3QgPSAwIH0sCisgICAgW0JSV19PUENPREVfRUxTRV0gPSB7IC5uYW1lID0gImVsc2UiLCAubnNyYyA9IDIsIC5uZHN0ID0gMCB9LAorICAgIFtCUldfT1BDT0RFX0JSRUFLXSA9IHsgLm5hbWUgPSAiYnJlYWsiLCAubnNyYyA9IDIsIC5uZHN0ID0gMCB9LAorICAgIFtCUldfT1BDT0RFX0NPTlRJTlVFXSA9IHsgLm5hbWUgPSAiY29udCIsIC5uc3JjID0gMSwgLm5kc3QgPSAwIH0sCisgICAgW0JSV19PUENPREVfSEFMVF0gPSB7IC5uYW1lID0gImhhbHQiLCAubnNyYyA9IDEsIC5uZHN0ID0gMCB9LAorICAgIFtCUldfT1BDT0RFX01TQVZFXSA9IHsgLm5hbWUgPSAibXNhdmUiLCAubnNyYyA9IDEsIC5uZHN0ID0gMSB9LAorICAgIFtCUldfT1BDT0RFX1BVU0hdID0geyAubmFtZSA9ICJwdXNoIiwgLm5zcmMgPSAxLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9NUkVTVE9SRV0gPSB7IC5uYW1lID0gIm1yZXN0IiwgLm5zcmMgPSAxLCAubmRzdCA9IDEgfSwKKyAgICBbQlJXX09QQ09ERV9QT1BdID0geyAubmFtZSA9ICJwb3AiLCAubnNyYyA9IDIsIC5uZHN0ID0gMCB9LAorICAgIFtCUldfT1BDT0RFX1dBSVRdID0geyAubmFtZSA9ICJ3YWl0IiwgLm5zcmMgPSAxLCAubmRzdCA9IDAgfSwKKyAgICBbQlJXX09QQ09ERV9ET10gPSB7IC5uYW1lID0gImRvIiwgLm5zcmMgPSAwLCAubmRzdCA9IDAgfSwKKyAgICBbQlJXX09QQ09ERV9FTkRJRl0gPSB7IC5uYW1lID0gImVuZGlmIiwgLm5zcmMgPSAyLCAubmRzdCA9IDAgfSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IG9wY29kZV9kZXNjICpvcGNvZGUgPSBvcGNvZGVfZGVzY3M7CisKK2NvbnN0IGNoYXIgKiBjb25zdCBjb25kaXRpb25hbF9tb2RpZmllclsxNl0gPSB7CisgICAgW0JSV19DT05ESVRJT05BTF9OT05FXSA9ICIiLAorICAgIFtCUldfQ09ORElUSU9OQUxfWl0gPSAiLmUiLAorICAgIFtCUldfQ09ORElUSU9OQUxfTlpdID0gIi5uZSIsCisgICAgW0JSV19DT05ESVRJT05BTF9HXSA9ICIuZyIsCisgICAgW0JSV19DT05ESVRJT05BTF9HRV0gPSAiLmdlIiwKKyAgICBbQlJXX0NPTkRJVElPTkFMX0xdID0gIi5sIiwKKyAgICBbQlJXX0NPTkRJVElPTkFMX0xFXSA9ICIubGUiLAorICAgIFtCUldfQ09ORElUSU9OQUxfUl0gPSAiLnIiLAorICAgIFtCUldfQ09ORElUSU9OQUxfT10gPSAiLm8iLAorICAgIFtCUldfQ09ORElUSU9OQUxfVV0gPSAiLnUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuZWdhdGVbMl0gPSB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gIi0iLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfYWJzWzJdID0geworICAgIFswXSA9ICIiLAorICAgIFsxXSA9ICIoYWJzKSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZlcnRfc3RyaWRlWzE2XSA9IHsKKyAgICBbMF0gPSAiMCIsCisgICAgWzFdID0gIjEiLAorICAgIFsyXSA9ICIyIiwKKyAgICBbM10gPSAiNCIsCisgICAgWzRdID0gIjgiLAorICAgIFs1XSA9ICIxNiIsCisgICAgWzZdID0gIjMyIiwKKyAgICBbMTVdID0gIlZ4SCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdpZHRoWzhdID0geworICAgIFswXSA9ICIxIiwKKyAgICBbMV0gPSAiMiIsCisgICAgWzJdID0gIjQiLAorICAgIFszXSA9ICI4IiwKKyAgICBbNF0gPSAiMTYiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBob3Jpel9zdHJpZGVbNF0gPSB7CisgICAgWzBdID0gIjAiLAorICAgIFsxXSA9ICIxIiwKKyAgICBbMl0gPSAiMiIsCisgICAgWzNdID0gIjQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNoYW5fc2VsWzRdID0geworICAgIFswXSA9ICJ4IiwKKyAgICBbMV0gPSAieSIsCisgICAgWzJdID0gInoiLAorICAgIFszXSA9ICJ3IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVidWdfY3RybFsyXSA9IHsKKyAgICBbMF0gPSAiIiwKKyAgICBbMV0gPSAiLmJyZWFrcG9pbnQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNhdHVyYXRlWzJdID0geworICAgIFswXSA9ICIiLAorICAgIFsxXSA9ICIuc2F0IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhY2N3clsyXSA9IHsKKyAgICBbMF0gPSAiIiwKKyAgICBbMV0gPSAiQWNjV3JFbmFibGUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdlY3RybFsyXSA9IHsKKyAgICBbMF0gPSAiV0Vfbm9ybWFsIiwKKyAgICBbMV0gPSAiV0VfYWxsIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleGVjX3NpemVbOF0gPSB7CisgICAgWzBdID0gIjEiLAorICAgIFsxXSA9ICIyIiwKKyAgICBbMl0gPSAiNCIsCisgICAgWzNdID0gIjgiLAorICAgIFs0XSA9ICIxNiIsCisgICAgWzVdID0gIjMyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcmVkX2ludlsyXSA9IHsKKyAgICBbMF0gPSAiKyIsCisgICAgWzFdID0gIi0iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByZWRfY3RybF9hbGlnbjE2WzE2XSA9IHsKKyAgICBbMV0gPSAiIiwKKyAgICBbMl0gPSAiLngiLAorICAgIFszXSA9ICIueSIsCisgICAgWzRdID0gIi56IiwKKyAgICBbNV0gPSAiLnciLAorICAgIFs2XSA9ICIuYW55NGgiLAorICAgIFs3XSA9ICIuYWxsNGgiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcmVkX2N0cmxfYWxpZ24xWzE2XSA9IHsKKyAgICBbMV0gPSAiIiwKKyAgICBbMl0gPSAiLmFueXYiLAorICAgIFszXSA9ICIuYWxsdiIsCisgICAgWzRdID0gIi5hbnkyaCIsCisgICAgWzVdID0gIi5hbGwyaCIsCisgICAgWzZdID0gIi5hbnk0aCIsCisgICAgWzddID0gIi5hbGw0aCIsCisgICAgWzhdID0gIi5hbnk4aCIsCisgICAgWzldID0gIi5hbGw4aCIsCisgICAgWzEwXSA9ICIuYW55MTZoIiwKKyAgICBbMTFdID0gIi5hbGwxNmgiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfY3RybFs0XSA9IHsKKyAgICBbMF0gPSAiIiwKKyAgICBbMl0gPSAic3dpdGNoIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb21wcl9jdHJsWzRdID0geworICAgIFswXSA9ICIiLAorICAgIFsxXSA9ICJzZWNoYWxmIiwKKyAgICBbMl0gPSAiY29tcHIiLAorICAgIFszXSA9ICJjb21wcjQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXBfY3RybFs0XSA9IHsKKyAgICBbMF0gPSAiIiwKKyAgICBbMV0gPSAiTm9ERENsciIsCisgICAgWzJdID0gIk5vRERDaGsiLAorICAgIFszXSA9ICJOb0REQ2xyLE5vRERDaGsiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXNrX2N0cmxbNF0gPSB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gIm5vbWFzayIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFjY2Vzc19tb2RlWzJdID0geworICAgIFswXSA9ICJhbGlnbjEiLAorICAgIFsxXSA9ICJhbGlnbjE2IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVnX2VuY29kaW5nWzhdID0geworICAgIFswXSA9ICJVRCIsCisgICAgWzFdID0gIkQiLAorICAgIFsyXSA9ICJVVyIsCisgICAgWzNdID0gIlciLAorICAgIFs0XSA9ICJVQiIsCisgICAgWzVdID0gIkIiLAorICAgIFs3XSA9ICJGIgorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IHRocmVlX3NvdXJjZV9yZWdfZW5jb2RpbmdbXSA9IHsKKyAgIFtCUldfM1NSQ19UWVBFX0ZdICA9ICJGIiwKKyAgIFtCUldfM1NSQ19UWVBFX0RdICA9ICJEIiwKKyAgIFtCUldfM1NSQ19UWVBFX1VEXSA9ICJVRCIsCit9OworCitjb25zdCBpbnQgcmVnX3R5cGVfc2l6ZVs4XSA9IHsKKyAgICBbMF0gPSA0LAorICAgIFsxXSA9IDQsCisgICAgWzJdID0gMiwKKyAgICBbM10gPSAyLAorICAgIFs0XSA9IDEsCisgICAgWzVdID0gMSwKKyAgICBbN10gPSA0Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJlZ19maWxlWzRdID0geworICAgIFswXSA9ICJBIiwKKyAgICBbMV0gPSAiZyIsCisgICAgWzJdID0gIm0iLAorICAgIFszXSA9ICJpbW0iLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3cml0ZW1hc2tbMTZdID0geworICAgIFsweDBdID0gIi4iLAorICAgIFsweDFdID0gIi54IiwKKyAgICBbMHgyXSA9ICIueSIsCisgICAgWzB4M10gPSAiLnh5IiwKKyAgICBbMHg0XSA9ICIueiIsCisgICAgWzB4NV0gPSAiLnh6IiwKKyAgICBbMHg2XSA9ICIueXoiLAorICAgIFsweDddID0gIi54eXoiLAorICAgIFsweDhdID0gIi53IiwKKyAgICBbMHg5XSA9ICIueHciLAorICAgIFsweGFdID0gIi55dyIsCisgICAgWzB4Yl0gPSAiLnh5dyIsCisgICAgWzB4Y10gPSAiLnp3IiwKKyAgICBbMHhkXSA9ICIueHp3IiwKKyAgICBbMHhlXSA9ICIueXp3IiwKKyAgICBbMHhmXSA9ICIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbmRfb2ZfdGhyZWFkWzJdID0geworICAgIFswXSA9ICIiLAorICAgIFsxXSA9ICJFT1QiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhcmdldF9mdW5jdGlvblsxNl0gPSB7CisgICAgW0JSV19TRklEX05VTExdID0gIm51bGwiLAorICAgIFtCUldfU0ZJRF9NQVRIXSA9ICJtYXRoIiwKKyAgICBbQlJXX1NGSURfU0FNUExFUl0gPSAic2FtcGxlciIsCisgICAgW0JSV19TRklEX01FU1NBR0VfR0FURVdBWV0gPSAiZ2F0ZXdheSIsCisgICAgW0JSV19TRklEX0RBVEFQT1JUX1JFQURdID0gInJlYWQiLAorICAgIFtCUldfU0ZJRF9EQVRBUE9SVF9XUklURV0gPSAid3JpdGUiLAorICAgIFtCUldfU0ZJRF9VUkJdID0gInVyYiIsCisgICAgW0JSV19TRklEX1RIUkVBRF9TUEFXTkVSXSA9ICJ0aHJlYWRfc3Bhd25lciIsCisgICAgW0JSV19TRklEX1ZNRV0gPSAidm1lIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGFyZ2V0X2Z1bmN0aW9uX2dlbjZbMTZdID0geworICAgIFtCUldfU0ZJRF9OVUxMXSA9ICJudWxsIiwKKyAgICBbQlJXX1NGSURfTUFUSF0gPSAibWF0aCIsCisgICAgW0JSV19TRklEX1NBTVBMRVJdID0gInNhbXBsZXIiLAorICAgIFtCUldfU0ZJRF9NRVNTQUdFX0dBVEVXQVldID0gImdhdGV3YXkiLAorICAgIFtCUldfU0ZJRF9VUkJdID0gInVyYiIsCisgICAgW0JSV19TRklEX1RIUkVBRF9TUEFXTkVSXSA9ICJ0aHJlYWRfc3Bhd25lciIsCisgICAgW0dFTjZfU0ZJRF9EQVRBUE9SVF9TQU1QTEVSX0NBQ0hFXSA9ICJzYW1wbGVyIiwKKyAgICBbR0VONl9TRklEX0RBVEFQT1JUX1JFTkRFUl9DQUNIRV0gPSAicmVuZGVyIiwKKyAgICBbR0VONl9TRklEX0RBVEFQT1JUX0NPTlNUQU5UX0NBQ0hFXSA9ICJjb25zdCIsCisgICAgW0dFTjdfU0ZJRF9EQVRBUE9SVF9EQVRBX0NBQ0hFXSA9ICJkYXRhIiwKKyAgICBbR0VON19TRklEX1BJWEVMX0lOVEVSUE9MQVRPUl0gPSAicGl4ZWwgaW50ZXJwIiwKKyAgICBbSFNXX1NGSURfREFUQVBPUlRfREFUQV9DQUNIRV8xXSA9ICJkcCBkYXRhIDEiLAorICAgIFtIU1dfU0ZJRF9DUkVdID0gImNyZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRwX3JjX21zZ190eXBlX2dlbjZbMTZdID0geworICAgIFtCUldfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX0JMT0NLX1JFQURdID0gIk9XT1JEIGJsb2NrIHJlYWQiLAorICAgIFtHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9SRU5ERVJfVU5PUk1fUkVBRF0gPSAiUlQgVU5PUk0gcmVhZCIsCisgICAgW0dFTjZfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX0RVQUxfQkxPQ0tfUkVBRF0gPSAiT1dPUkQgZHVhbCBibG9jayByZWFkIiwKKyAgICBbR0VONl9EQVRBUE9SVF9SRUFEX01FU1NBR0VfTUVESUFfQkxPQ0tfUkVBRF0gPSAibWVkaWEgYmxvY2sgcmVhZCIsCisgICAgW0dFTjZfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX1VOQUxJR05fQkxPQ0tfUkVBRF0gPSAiT1dPUkQgdW5hbGlnbmVkIGJsb2NrIHJlYWQiLAorICAgIFtHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9EV09SRF9TQ0FUVEVSRURfUkVBRF0gPSAiRFdPUkQgc2NhdHRlcmVkIHJlYWQiLAorICAgIFtHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfRFdPUkRfQVRPTUlDX1dSSVRFXSA9ICJEV09SRCBhdG9taWMgd3JpdGUiLAorICAgIFtHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfT1dPUkRfQkxPQ0tfV1JJVEVdID0gIk9XT1JEIGJsb2NrIHdyaXRlIiwKKyAgICBbR0VONl9EQVRBUE9SVF9XUklURV9NRVNTQUdFX09XT1JEX0RVQUxfQkxPQ0tfV1JJVEVdID0gIk9XT1JEIGR1YWwgYmxvY2sgd3JpdGUiLAorICAgIFtHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfTUVESUFfQkxPQ0tfV1JJVEVdID0gIm1lZGlhIGJsb2NrIHdyaXRlIiwKKyAgICBbR0VONl9EQVRBUE9SVF9XUklURV9NRVNTQUdFX0RXT1JEX1NDQVRURVJFRF9XUklURV0gPSAiRFdPUkQgc2NhdHRlcmVkIHdyaXRlIiwKKyAgICBbR0VONl9EQVRBUE9SVF9XUklURV9NRVNTQUdFX1JFTkRFUl9UQVJHRVRfV1JJVEVdID0gIlJUIHdyaXRlIiwKKyAgICBbR0VONl9EQVRBUE9SVF9XUklURV9NRVNTQUdFX1NUUkVBTUVEX1ZCX1dSSVRFXSA9ICJzdHJlYW1lZCBWQiB3cml0ZSIsCisgICAgW0dFTjZfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9SRU5ERVJfVEFSR0VUX1VOT1JNX1dSSVRFXSA9ICJSVCBVTk9STWMgd3JpdGUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRwX2RjMF9tc2dfdHlwZV9nZW43WzE2XSA9IHsKKyAgICBbR0VON19EQVRBUE9SVF9EQ19PV09SRF9CTE9DS19SRUFEXSA9ICJEQyBPV09SRCBibG9jayByZWFkIiwKKyAgICBbR0VON19EQVRBUE9SVF9EQ19VTkFMSUdORURfT1dPUkRfQkxPQ0tfUkVBRF0gPSAiREMgdW5hbGlnbmVkIE9XT1JEIGJsb2NrIHJlYWQiLAorICAgIFtHRU43X0RBVEFQT1JUX0RDX09XT1JEX0RVQUxfQkxPQ0tfUkVBRF0gPSAiREMgT1dPUkQgZHVhbCBibG9jayByZWFkIiwKKyAgICBbR0VON19EQVRBUE9SVF9EQ19EV09SRF9TQ0FUVEVSRURfUkVBRF0gPSAiREMgRFdPUkQgc2NhdHRlcmVkIHJlYWQiLAorICAgIFtHRU43X0RBVEFQT1JUX0RDX0JZVEVfU0NBVFRFUkVEX1JFQURdID0gIkRDIGJ5dGUgc2NhdHRlcmVkIHJlYWQiLAorICAgIFtHRU43X0RBVEFQT1JUX0RDX1VOVFlQRURfQVRPTUlDX09QXSA9ICJEQyB1bnR5cGVkIGF0b21pYyIsCisgICAgW0dFTjdfREFUQVBPUlRfRENfTUVNT1JZX0ZFTkNFXSA9ICJEQyBtZmVuY2UiLAorICAgIFtHRU43X0RBVEFQT1JUX0RDX09XT1JEX0JMT0NLX1dSSVRFXSA9ICJEQyBPV09SRCBibG9jayB3cml0ZSIsCisgICAgW0dFTjdfREFUQVBPUlRfRENfT1dPUkRfRFVBTF9CTE9DS19XUklURV0gPSAiREMgT1dPUkQgZHVhbCBibG9jayB3cml0ZSIsCisgICAgW0dFTjdfREFUQVBPUlRfRENfRFdPUkRfU0NBVFRFUkVEX1dSSVRFXSA9ICJEQyBEV09SRCBzY2F0dGVyZCB3cml0ZSIsCisgICAgW0dFTjdfREFUQVBPUlRfRENfQllURV9TQ0FUVEVSRURfV1JJVEVdID0gIkRDIGJ5dGUgc2NhdHRlcmVkIHdyaXRlIiwKKyAgICBbR0VON19EQVRBUE9SVF9EQ19VTlRZUEVEX1NVUkZBQ0VfV1JJVEVdID0gIkRDIHVudHlwZWQgc3VyZmFjZSB3cml0ZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZHBfZGMxX21zZ190eXBlX2hzd1sxNl0gPSB7CisgICAgW0hTV19EQVRBUE9SVF9EQ19QT1JUMV9VTlRZUEVEX1NVUkZBQ0VfUkVBRF0gPSAidW50eXBlZCBzdXJmYWNlIHJlYWQiLAorICAgIFtIU1dfREFUQVBPUlRfRENfUE9SVDFfVU5UWVBFRF9BVE9NSUNfT1BdID0gIkRDIHVudHlwZWQgYXRvbWljIG9wIiwKKyAgICBbSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1VOVFlQRURfQVRPTUlDX09QX1NJTUQ0WDJdID0gIkRDIHVudHlwZWQgNHgyIGF0b21pYyBvcCIsCisgICAgW0hTV19EQVRBUE9SVF9EQ19QT1JUMV9NRURJQV9CTE9DS19SRUFEXSA9ICJEQyBtZWRpYSBibG9jayByZWFkIiwKKyAgICBbSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1RZUEVEX1NVUkZBQ0VfUkVBRF0gPSAiREMgdHlwZWQgc3VyZmFjZSByZWFkIiwKKyAgICBbSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1RZUEVEX0FUT01JQ19PUF0gPSAiREMgdHlwZWQgYXRvbWljIiwKKyAgICBbSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1RZUEVEX0FUT01JQ19PUF9TSU1ENFgyXSA9ICJEQyB0eXBlZCA0eDIgYXRvbWljIG9wIiwKKyAgICBbSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1VOVFlQRURfU1VSRkFDRV9XUklURV0gPSAiREMgdW50eXBlZCBzdXJmYWNlIHdyaXRlIiwKKyAgICBbSFNXX0RBVEFQT1JUX0RDX1BPUlQxX01FRElBX0JMT0NLX1dSSVRFXSA9ICJEQyBtZWRpYSBibG9jayB3cml0ZSIsCisgICAgW0hTV19EQVRBUE9SVF9EQ19QT1JUMV9BVE9NSUNfQ09VTlRFUl9PUF0gPSAiREMgYXRvbWljIGNvdW50ZXIgb3AiLAorICAgIFtIU1dfREFUQVBPUlRfRENfUE9SVDFfQVRPTUlDX0NPVU5URVJfT1BfU0lNRDRYMl0gPSAiREMgNHgyIGF0b21pYyBjb3VudGVyIG9wIiwKKyAgICBbSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1RZUEVEX1NVUkZBQ0VfV1JJVEVdID0gIkRDIHR5cGVkIHN1cmZhY2Ugd3JpdGUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhb3BbMTZdID0geworICAgW0JSV19BT1BfQU5EXSA9ICJhbmQiLAorICAgW0JSV19BT1BfT1JdID0gIm9yIiwKKyAgIFtCUldfQU9QX1hPUl0gPSAieG9yIiwKKyAgIFtCUldfQU9QX01PVl0gPSAibW92IiwKKyAgIFtCUldfQU9QX0lOQ10gPSAiaW5jIiwKKyAgIFtCUldfQU9QX0RFQ10gPSAiZGVjIiwKKyAgIFtCUldfQU9QX0FERF0gPSAiYWRkIiwKKyAgIFtCUldfQU9QX1NVQl0gPSAic3ViIiwKKyAgIFtCUldfQU9QX1JFVlNVQl0gPSAicmV2c3ViIiwKKyAgIFtCUldfQU9QX0lNQVhdID0gImltYXgiLAorICAgW0JSV19BT1BfSU1JTl0gPSAiaW1pbiIsCisgICBbQlJXX0FPUF9VTUFYXSA9ICJ1bWF4IiwKKyAgIFtCUldfQU9QX1VNSU5dID0gInVtaW4iLAorICAgW0JSV19BT1BfQ01QV1JdID0gImNtcHdyIiwKKyAgIFtCUldfQU9QX1BSRURFQ10gPSAicHJlZGVjIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF0aF9mdW5jdGlvblsxNl0gPSB7CisgICAgW0JSV19NQVRIX0ZVTkNUSU9OX0lOVl0gPSAiaW52IiwKKyAgICBbQlJXX01BVEhfRlVOQ1RJT05fTE9HXSA9ICJsb2ciLAorICAgIFtCUldfTUFUSF9GVU5DVElPTl9FWFBdID0gImV4cCIsCisgICAgW0JSV19NQVRIX0ZVTkNUSU9OX1NRUlRdID0gInNxcnQiLAorICAgIFtCUldfTUFUSF9GVU5DVElPTl9SU1FdID0gInJzcSIsCisgICAgW0JSV19NQVRIX0ZVTkNUSU9OX1NJTl0gPSAic2luIiwKKyAgICBbQlJXX01BVEhfRlVOQ1RJT05fQ09TXSA9ICJjb3MiLAorICAgIFtCUldfTUFUSF9GVU5DVElPTl9TSU5DT1NdID0gInNpbmNvcyIsCisgICAgW0JSV19NQVRIX0ZVTkNUSU9OX0ZESVZdID0gImZkaXYiLAorICAgIFtCUldfTUFUSF9GVU5DVElPTl9QT1ddID0gInBvdyIsCisgICAgW0JSV19NQVRIX0ZVTkNUSU9OX0lOVF9ESVZfUVVPVElFTlRfQU5EX1JFTUFJTkRFUl0gPSAiaW50ZGl2bW9kIiwKKyAgICBbQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9RVU9USUVOVF0gPSAiaW50ZGl2IiwKKyAgICBbQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9SRU1BSU5ERVJdID0gImludG1vZCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1hdGhfc2F0dXJhdGVbMl0gPSB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gInNhdCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF0aF9zaWduZWRbMl0gPSB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gInNpZ25lZCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF0aF9zY2FsYXJbMl0gPSB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gInNjYWxhciIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF0aF9wcmVjaXNpb25bMl0gPSB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gInBhcnRpYWxfcHJlY2lzaW9uIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1cmJfb3Bjb2RlWzJdID0geworICAgIFswXSA9ICJ1cmJfd3JpdGUiLAorICAgIFsxXSA9ICJmZl9zeW5jIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXJiX3N3aXp6bGVbNF0gPSB7CisgICAgW0JSV19VUkJfU1dJWlpMRV9OT05FXSA9ICIiLAorICAgIFtCUldfVVJCX1NXSVpaTEVfSU5URVJMRUFWRV0gPSAiaW50ZXJsZWF2ZSIsCisgICAgW0JSV19VUkJfU1dJWlpMRV9UUkFOU1BPU0VdID0gInRyYW5zcG9zZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVyYl9hbGxvY2F0ZVsyXSA9IHsKKyAgICBbMF0gPSAiIiwKKyAgICBbMV0gPSAiYWxsb2NhdGUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVyYl91c2VkWzJdID0geworICAgIFswXSA9ICIiLAorICAgIFsxXSA9ICJ1c2VkIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1cmJfY29tcGxldGVbMl0gPSB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gImNvbXBsZXRlIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYW1wbGVyX3RhcmdldF9mb3JtYXRbNF0gPSB7CisgICAgWzBdID0gIkYiLAorICAgIFsyXSA9ICJVRCIsCisgICAgWzNdID0gIkQiCit9OworCisKK3N0YXRpYyBpbnQgY29sdW1uOworCitzdGF0aWMgaW50IHN0cmluZyAoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqc3RyaW5nKQoreworICAgIGZwdXRzIChzdHJpbmcsIGZpbGUpOworICAgIGNvbHVtbiArPSBzdHJsZW4gKHN0cmluZyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9ybWF0IChGSUxFICpmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICBjaGFyICAgIGJ1ZlsxMDI0XTsKKyAgICB2YV9saXN0CWFyZ3M7CisgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisKKyAgICB2c25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpIC0gMSwgZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQgKGFyZ3MpOworICAgIHN0cmluZyAoZiwgYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXdsaW5lIChGSUxFICpmKQoreworICAgIHB1dGMgKCdcbicsIGYpOworICAgIGNvbHVtbiA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFkIChGSUxFICpmLCBpbnQgYykKK3sKKyAgICBkbworCXN0cmluZyAoZiwgIiAiKTsKKyAgICB3aGlsZSAoY29sdW1uIDwgYyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbCAoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IGN0cmxbXSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaWQsIGludCAqc3BhY2UpCit7CisgICAgaWYgKCFjdHJsW2lkXSkgeworCWZwcmludGYgKGZpbGUsICIqKiogaW52YWxpZCAlcyB2YWx1ZSAlZCAiLAorCQkgbmFtZSwgaWQpOworCXJldHVybiAxOworICAgIH0KKyAgICBpZiAoY3RybFtpZF1bMF0pCisgICAgeworCWlmIChzcGFjZSAmJiAqc3BhY2UpCisJICAgIHN0cmluZyAoZmlsZSwgIiAiKTsKKwlzdHJpbmcgKGZpbGUsIGN0cmxbaWRdKTsKKwlpZiAoc3BhY2UpCisJICAgICpzcGFjZSA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X29wY29kZSAoRklMRSAqZmlsZSwgaW50IGlkKQoreworICAgIGlmICghb3Bjb2RlW2lkXS5uYW1lKSB7CisJZm9ybWF0IChmaWxlLCAiKioqIGludmFsaWQgb3Bjb2RlIHZhbHVlICVkICIsIGlkKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgc3RyaW5nIChmaWxlLCBvcGNvZGVbaWRdLm5hbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlZyAoRklMRSAqZmlsZSwgdW5zaWduZWQgX3JlZ19maWxlLCB1bnNpZ25lZCBfcmVnX25yKQoreworICAgIGludAllcnIgPSAwOworCisgICAgLyogQ2xlYXIgdGhlIENvbXByNCBpbnN0cnVjdGlvbiBjb21wcmVzc2lvbiBiaXQuICovCisgICAgaWYgKF9yZWdfZmlsZSA9PSBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFKQorICAgICAgIF9yZWdfbnIgJj0gfigxIDw8IDcpOworCisgICAgaWYgKF9yZWdfZmlsZSA9PSBCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUpIHsKKwlzd2l0Y2ggKF9yZWdfbnIgJiAweGYwKSB7CisJY2FzZSBCUldfQVJGX05VTEw6CisJICAgIHN0cmluZyAoZmlsZSwgIm51bGwiKTsKKwkgICAgcmV0dXJuIC0xOworCWNhc2UgQlJXX0FSRl9BRERSRVNTOgorCSAgICBmb3JtYXQgKGZpbGUsICJhJWQiLCBfcmVnX25yICYgMHgwZik7CisJICAgIGJyZWFrOworCWNhc2UgQlJXX0FSRl9BQ0NVTVVMQVRPUjoKKwkgICAgZm9ybWF0IChmaWxlLCAiYWNjJWQiLCBfcmVnX25yICYgMHgwZik7CisJICAgIGJyZWFrOworCWNhc2UgQlJXX0FSRl9GTEFHOgorCSAgICBmb3JtYXQgKGZpbGUsICJmJWQiLCBfcmVnX25yICYgMHgwZik7CisJICAgIGJyZWFrOworCWNhc2UgQlJXX0FSRl9NQVNLOgorCSAgICBmb3JtYXQgKGZpbGUsICJtYXNrJWQiLCBfcmVnX25yICYgMHgwZik7CisJICAgIGJyZWFrOworCWNhc2UgQlJXX0FSRl9NQVNLX1NUQUNLOgorCSAgICBmb3JtYXQgKGZpbGUsICJtc2QlZCIsIF9yZWdfbnIgJiAweDBmKTsKKwkgICAgYnJlYWs7CisJY2FzZSBCUldfQVJGX1NUQVRFOgorCSAgICBmb3JtYXQgKGZpbGUsICJzciVkIiwgX3JlZ19uciAmIDB4MGYpOworCSAgICBicmVhazsKKwljYXNlIEJSV19BUkZfQ09OVFJPTDoKKwkgICAgZm9ybWF0IChmaWxlLCAiY3IlZCIsIF9yZWdfbnIgJiAweDBmKTsKKwkgICAgYnJlYWs7CisJY2FzZSBCUldfQVJGX05PVElGSUNBVElPTl9DT1VOVDoKKwkgICAgZm9ybWF0IChmaWxlLCAibiVkIiwgX3JlZ19uciAmIDB4MGYpOworCSAgICBicmVhazsKKwljYXNlIEJSV19BUkZfSVA6CisJICAgIHN0cmluZyAoZmlsZSwgImlwIik7CisJICAgIHJldHVybiAtMTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgZm9ybWF0IChmaWxlLCAiQVJGJWQiLCBfcmVnX25yKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CisJZXJyICB8PSBjb250cm9sIChmaWxlLCAic3JjIHJlZyBmaWxlIiwgcmVnX2ZpbGUsIF9yZWdfZmlsZSwgTlVMTCk7CisJZm9ybWF0IChmaWxlLCAiJWQiLCBfcmVnX25yKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkZXN0IChGSUxFICpmaWxlLCBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnN0KQoreworICAgIGludAllcnIgPSAwOworCisgICAgaWYgKGluc3QtPmhlYWRlci5hY2Nlc3NfbW9kZSA9PSBCUldfQUxJR05fMSkKKyAgICB7CisJaWYgKGluc3QtPmJpdHMxLmRhMS5kZXN0X2FkZHJlc3NfbW9kZSA9PSBCUldfQUREUkVTU19ESVJFQ1QpCisJeworCSAgICBlcnIgfD0gcmVnIChmaWxlLCBpbnN0LT5iaXRzMS5kYTEuZGVzdF9yZWdfZmlsZSwgaW5zdC0+Yml0czEuZGExLmRlc3RfcmVnX25yKTsKKwkgICAgaWYgKGVyciA9PSAtMSkKKwkJcmV0dXJuIDA7CisJICAgIGlmIChpbnN0LT5iaXRzMS5kYTEuZGVzdF9zdWJyZWdfbnIpCisJCWZvcm1hdCAoZmlsZSwgIi4lZCIsIGluc3QtPmJpdHMxLmRhMS5kZXN0X3N1YnJlZ19uciAvCisJCQkJICAgICByZWdfdHlwZV9zaXplW2luc3QtPmJpdHMxLmRhMS5kZXN0X3JlZ190eXBlXSk7CisJICAgIHN0cmluZyAoZmlsZSwgIjwiKTsKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJob3JpeiBzdHJpZGUiLCBob3Jpel9zdHJpZGUsIGluc3QtPmJpdHMxLmRhMS5kZXN0X2hvcml6X3N0cmlkZSwgTlVMTCk7CisJICAgIHN0cmluZyAoZmlsZSwgIj4iKTsKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJkZXN0IHJlZyBlbmNvZGluZyIsIHJlZ19lbmNvZGluZywgaW5zdC0+Yml0czEuZGExLmRlc3RfcmVnX3R5cGUsIE5VTEwpOworCX0KKwllbHNlCisJeworCSAgICBzdHJpbmcgKGZpbGUsICJnW2EwIik7CisJICAgIGlmIChpbnN0LT5iaXRzMS5pYTEuZGVzdF9zdWJyZWdfbnIpCisJCWZvcm1hdCAoZmlsZSwgIi4lZCIsIGluc3QtPmJpdHMxLmlhMS5kZXN0X3N1YnJlZ19uciAvCisJCQkJCXJlZ190eXBlX3NpemVbaW5zdC0+Yml0czEuaWExLmRlc3RfcmVnX3R5cGVdKTsKKwkgICAgaWYgKGluc3QtPmJpdHMxLmlhMS5kZXN0X2luZGlyZWN0X29mZnNldCkKKwkJZm9ybWF0IChmaWxlLCAiICVkIiwgaW5zdC0+Yml0czEuaWExLmRlc3RfaW5kaXJlY3Rfb2Zmc2V0KTsKKwkgICAgc3RyaW5nIChmaWxlLCAiXTwiKTsKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJob3JpeiBzdHJpZGUiLCBob3Jpel9zdHJpZGUsIGluc3QtPmJpdHMxLmlhMS5kZXN0X2hvcml6X3N0cmlkZSwgTlVMTCk7CisJICAgIHN0cmluZyAoZmlsZSwgIj4iKTsKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJkZXN0IHJlZyBlbmNvZGluZyIsIHJlZ19lbmNvZGluZywgaW5zdC0+Yml0czEuaWExLmRlc3RfcmVnX3R5cGUsIE5VTEwpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoaW5zdC0+Yml0czEuZGExNi5kZXN0X2FkZHJlc3NfbW9kZSA9PSBCUldfQUREUkVTU19ESVJFQ1QpCisJeworCSAgICBlcnIgfD0gcmVnIChmaWxlLCBpbnN0LT5iaXRzMS5kYTE2LmRlc3RfcmVnX2ZpbGUsIGluc3QtPmJpdHMxLmRhMTYuZGVzdF9yZWdfbnIpOworCSAgICBpZiAoZXJyID09IC0xKQorCQlyZXR1cm4gMDsKKwkgICAgaWYgKGluc3QtPmJpdHMxLmRhMTYuZGVzdF9zdWJyZWdfbnIpCisJCWZvcm1hdCAoZmlsZSwgIi4lZCIsIGluc3QtPmJpdHMxLmRhMTYuZGVzdF9zdWJyZWdfbnIgLworCQkJCSAgICAgcmVnX3R5cGVfc2l6ZVtpbnN0LT5iaXRzMS5kYTE2LmRlc3RfcmVnX3R5cGVdKTsKKwkgICAgc3RyaW5nIChmaWxlLCAiPDE+Iik7CisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAid3JpdGVtYXNrIiwgd3JpdGVtYXNrLCBpbnN0LT5iaXRzMS5kYTE2LmRlc3Rfd3JpdGVtYXNrLCBOVUxMKTsKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJkZXN0IHJlZyBlbmNvZGluZyIsIHJlZ19lbmNvZGluZywgaW5zdC0+Yml0czEuZGExNi5kZXN0X3JlZ190eXBlLCBOVUxMKTsKKwl9CisJZWxzZQorCXsKKwkgICAgZXJyID0gMTsKKwkgICAgc3RyaW5nIChmaWxlLCAiSW5kaXJlY3QgYWxpZ24xNiBhZGRyZXNzIG1vZGUgbm90IHN1cHBvcnRlZCIpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZXN0XzNzcmMgKEZJTEUgKmZpbGUsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgaW50CWVyciA9IDA7CisgICAgdWludDMyX3QgcmVnX2ZpbGU7CisKKyAgICBpZiAoaW5zdC0+Yml0czEuZGEzc3JjLmRlc3RfcmVnX2ZpbGUpCisgICAgICAgcmVnX2ZpbGUgPSBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFOworICAgIGVsc2UKKyAgICAgICByZWdfZmlsZSA9IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEU7CisKKyAgICBlcnIgfD0gcmVnIChmaWxlLCByZWdfZmlsZSwgaW5zdC0+Yml0czEuZGEzc3JjLmRlc3RfcmVnX25yKTsKKyAgICBpZiAoZXJyID09IC0xKQorICAgICAgIHJldHVybiAwOworICAgIGlmIChpbnN0LT5iaXRzMS5kYTNzcmMuZGVzdF9zdWJyZWdfbnIpCisgICAgICAgZm9ybWF0IChmaWxlLCAiLiVkIiwgaW5zdC0+Yml0czEuZGEzc3JjLmRlc3Rfc3VicmVnX25yKTsKKyAgICBzdHJpbmcgKGZpbGUsICI8MT4iKTsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgIndyaXRlbWFzayIsIHdyaXRlbWFzaywgaW5zdC0+Yml0czEuZGEzc3JjLmRlc3Rfd3JpdGVtYXNrLCBOVUxMKTsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgImRlc3QgcmVnIGVuY29kaW5nIiwgdGhyZWVfc291cmNlX3JlZ19lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgaW5zdC0+Yml0czEuZGEzc3JjLmRzdF90eXBlLCBOVUxMKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNyY19hbGlnbjFfcmVnaW9uIChGSUxFICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgX3ZlcnRfc3RyaWRlLCB1bnNpZ25lZCBfd2lkdGgsIHVuc2lnbmVkIF9ob3Jpel9zdHJpZGUpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgc3RyaW5nIChmaWxlLCAiPCIpOworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAidmVydCBzdHJpZGUiLCB2ZXJ0X3N0cmlkZSwgX3ZlcnRfc3RyaWRlLCBOVUxMKTsKKyAgICBzdHJpbmcgKGZpbGUsICIsIik7CisgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJ3aWR0aCIsIHdpZHRoLCBfd2lkdGgsIE5VTEwpOworICAgIHN0cmluZyAoZmlsZSwgIiwiKTsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgImhvcml6X3N0cmlkZSIsIGhvcml6X3N0cmlkZSwgX2hvcml6X3N0cmlkZSwgTlVMTCk7CisgICAgc3RyaW5nIChmaWxlLCAiPiIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3JjX2RhMSAoRklMRSAqZmlsZSwgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgX3JlZ19maWxlLAorCQkgICAgdW5zaWduZWQgX3ZlcnRfc3RyaWRlLCB1bnNpZ25lZCBfd2lkdGgsIHVuc2lnbmVkIF9ob3Jpel9zdHJpZGUsCisJCSAgICB1bnNpZ25lZCByZWdfbnVtLCB1bnNpZ25lZCBzdWJfcmVnX251bSwgdW5zaWduZWQgX19hYnMsIHVuc2lnbmVkIF9uZWdhdGUpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJuZWdhdGUiLCBuZWdhdGUsIF9uZWdhdGUsIE5VTEwpOworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAiYWJzIiwgX2FicywgX19hYnMsIE5VTEwpOworCisgICAgZXJyIHw9IHJlZyAoZmlsZSwgX3JlZ19maWxlLCByZWdfbnVtKTsKKyAgICBpZiAoZXJyID09IC0xKQorCXJldHVybiAwOworICAgIGlmIChzdWJfcmVnX251bSkKKwlmb3JtYXQgKGZpbGUsICIuJWQiLCBzdWJfcmVnX251bSAvIHJlZ190eXBlX3NpemVbdHlwZV0pOyAvKiB1c2UgZm9ybWFsIHN0eWxlIGxpa2Ugc3BlYyAqLworICAgIHNyY19hbGlnbjFfcmVnaW9uIChmaWxlLCBfdmVydF9zdHJpZGUsIF93aWR0aCwgX2hvcml6X3N0cmlkZSk7CisgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJzcmMgcmVnIGVuY29kaW5nIiwgcmVnX2VuY29kaW5nLCB0eXBlLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNyY19pYTEgKEZJTEUgKmZpbGUsCisJCSAgICB1bnNpZ25lZCB0eXBlLAorCQkgICAgdW5zaWduZWQgX3JlZ19maWxlLAorCQkgICAgaW50IF9hZGRyX2ltbSwKKwkJICAgIHVuc2lnbmVkIF9hZGRyX3N1YnJlZ19uciwKKwkJICAgIHVuc2lnbmVkIF9uZWdhdGUsCisJCSAgICB1bnNpZ25lZCBfX2FicywKKwkJICAgIHVuc2lnbmVkIF9hZGRyX21vZGUsCisJCSAgICB1bnNpZ25lZCBfaG9yaXpfc3RyaWRlLAorCQkgICAgdW5zaWduZWQgX3dpZHRoLAorCQkgICAgdW5zaWduZWQgX3ZlcnRfc3RyaWRlKQoreworICAgIGludCBlcnIgPSAwOworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAibmVnYXRlIiwgbmVnYXRlLCBfbmVnYXRlLCBOVUxMKTsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgImFicyIsIF9hYnMsIF9fYWJzLCBOVUxMKTsKKworICAgIHN0cmluZyAoZmlsZSwgImdbYTAiKTsKKyAgICBpZiAoX2FkZHJfc3VicmVnX25yKQorCWZvcm1hdCAoZmlsZSwgIi4lZCIsIF9hZGRyX3N1YnJlZ19ucik7CisgICAgaWYgKF9hZGRyX2ltbSkKKwlmb3JtYXQgKGZpbGUsICIgJWQiLCBfYWRkcl9pbW0pOworICAgIHN0cmluZyAoZmlsZSwgIl0iKTsKKyAgICBzcmNfYWxpZ24xX3JlZ2lvbiAoZmlsZSwgX3ZlcnRfc3RyaWRlLCBfd2lkdGgsIF9ob3Jpel9zdHJpZGUpOworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAic3JjIHJlZyBlbmNvZGluZyIsIHJlZ19lbmNvZGluZywgdHlwZSwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzcmNfZGExNiAoRklMRSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBfcmVnX3R5cGUsCisJCSAgICAgdW5zaWduZWQgX3JlZ19maWxlLAorCQkgICAgIHVuc2lnbmVkIF92ZXJ0X3N0cmlkZSwKKwkJICAgICB1bnNpZ25lZCBfcmVnX25yLAorCQkgICAgIHVuc2lnbmVkIF9zdWJyZWdfbnIsCisJCSAgICAgdW5zaWduZWQgX19hYnMsCisJCSAgICAgdW5zaWduZWQgX25lZ2F0ZSwKKwkJICAgICB1bnNpZ25lZCBzd3pfeCwKKwkJICAgICB1bnNpZ25lZCBzd3pfeSwKKwkJICAgICB1bnNpZ25lZCBzd3pfeiwKKwkJICAgICB1bnNpZ25lZCBzd3pfdykKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgIm5lZ2F0ZSIsIG5lZ2F0ZSwgX25lZ2F0ZSwgTlVMTCk7CisgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJhYnMiLCBfYWJzLCBfX2FicywgTlVMTCk7CisKKyAgICBlcnIgfD0gcmVnIChmaWxlLCBfcmVnX2ZpbGUsIF9yZWdfbnIpOworICAgIGlmIChlcnIgPT0gLTEpCisJcmV0dXJuIDA7CisgICAgaWYgKF9zdWJyZWdfbnIpCisJLyogYml0NCBmb3Igc3VicmVnIG51bWJlciBieXRlIGFkZHJlc3NpbmcuIE1ha2UgdGhpcyBzYW1lIG1lYW5pbmcgYXMKKwkgICBpbiBkYTEgY2FzZSwgc28gb3V0cHV0IGxvb2tzIGNvbnNpc3RlbnQuICovCisJZm9ybWF0IChmaWxlLCAiLiVkIiwgMTYgLyByZWdfdHlwZV9zaXplW19yZWdfdHlwZV0pOworICAgIHN0cmluZyAoZmlsZSwgIjwiKTsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgInZlcnQgc3RyaWRlIiwgdmVydF9zdHJpZGUsIF92ZXJ0X3N0cmlkZSwgTlVMTCk7CisgICAgc3RyaW5nIChmaWxlLCAiLDQsMT4iKTsKKyAgICAvKgorICAgICAqIFRocmVlIGtpbmRzIG9mIHN3aXp6bGUgZGlzcGxheToKKyAgICAgKiAgaWRlbnRpdHkgLSBub3RoaW5nIHByaW50ZWQKKyAgICAgKiAgMS0+YWxsCSAtIHByaW50IHRoZSBzaW5nbGUgY2hhbm5lbAorICAgICAqICAxLT4xICAgICAtIHByaW50IHRoZSBtYXBwaW5nCisgICAgICovCisgICAgaWYgKHN3el94ID09IEJSV19DSEFOTkVMX1ggJiYKKwlzd3pfeSA9PSBCUldfQ0hBTk5FTF9ZICYmCisJc3d6X3ogPT0gQlJXX0NIQU5ORUxfWiAmJgorCXN3el93ID09IEJSV19DSEFOTkVMX1cpCisgICAgeworCTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3d6X3ggPT0gc3d6X3kgJiYgc3d6X3ggPT0gc3d6X3ogJiYgc3d6X3ggPT0gc3d6X3cpCisgICAgeworCXN0cmluZyAoZmlsZSwgIi4iKTsKKwllcnIgfD0gY29udHJvbCAoZmlsZSwgImNoYW5uZWwgc2VsZWN0IiwgY2hhbl9zZWwsIHN3el94LCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzdHJpbmcgKGZpbGUsICIuIik7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJjaGFubmVsIHNlbGVjdCIsIGNoYW5fc2VsLCBzd3pfeCwgTlVMTCk7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJjaGFubmVsIHNlbGVjdCIsIGNoYW5fc2VsLCBzd3pfeSwgTlVMTCk7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJjaGFubmVsIHNlbGVjdCIsIGNoYW5fc2VsLCBzd3pfeiwgTlVMTCk7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJjaGFubmVsIHNlbGVjdCIsIGNoYW5fc2VsLCBzd3pfdywgTlVMTCk7CisgICAgfQorICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAic3JjIGRhMTYgcmVnIHR5cGUiLCByZWdfZW5jb2RpbmcsIF9yZWdfdHlwZSwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzcmMwXzNzcmMgKEZJTEUgKmZpbGUsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgdW5zaWduZWQgc3d6X3ggPSAoaW5zdC0+Yml0czIuZGEzc3JjLnNyYzBfc3dpenpsZSA+PiAwKSAmIDB4MzsKKyAgICB1bnNpZ25lZCBzd3pfeSA9IChpbnN0LT5iaXRzMi5kYTNzcmMuc3JjMF9zd2l6emxlID4+IDIpICYgMHgzOworICAgIHVuc2lnbmVkIHN3el96ID0gKGluc3QtPmJpdHMyLmRhM3NyYy5zcmMwX3N3aXp6bGUgPj4gNCkgJiAweDM7CisgICAgdW5zaWduZWQgc3d6X3cgPSAoaW5zdC0+Yml0czIuZGEzc3JjLnNyYzBfc3dpenpsZSA+PiA2KSAmIDB4MzsKKworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAibmVnYXRlIiwgbmVnYXRlLCBpbnN0LT5iaXRzMS5kYTNzcmMuc3JjMF9uZWdhdGUsIE5VTEwpOworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAiYWJzIiwgX2FicywgaW5zdC0+Yml0czEuZGEzc3JjLnNyYzBfYWJzLCBOVUxMKTsKKworICAgIGVyciB8PSByZWcgKGZpbGUsIEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUsIGluc3QtPmJpdHMyLmRhM3NyYy5zcmMwX3JlZ19ucik7CisgICAgaWYgKGVyciA9PSAtMSkKKwlyZXR1cm4gMDsKKyAgICBpZiAoaW5zdC0+Yml0czIuZGEzc3JjLnNyYzBfc3VicmVnX25yKQorCWZvcm1hdCAoZmlsZSwgIi4lZCIsIGluc3QtPmJpdHMyLmRhM3NyYy5zcmMwX3N1YnJlZ19ucik7CisgICAgaWYgKGluc3QtPmJpdHMyLmRhM3NyYy5zcmMwX3JlcF9jdHJsKQorICAgICAgIHN0cmluZyAoZmlsZSwgIjwwLDEsMD4iKTsKKyAgICBlbHNlCisgICAgICAgc3RyaW5nIChmaWxlLCAiPDQsNCwxPiIpOworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAic3JjIGRhMTYgcmVnIHR5cGUiLCB0aHJlZV9zb3VyY2VfcmVnX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBpbnN0LT5iaXRzMS5kYTNzcmMuc3JjX3R5cGUsIE5VTEwpOworICAgIC8qCisgICAgICogVGhyZWUga2luZHMgb2Ygc3dpenpsZSBkaXNwbGF5OgorICAgICAqICBpZGVudGl0eSAtIG5vdGhpbmcgcHJpbnRlZAorICAgICAqICAxLT5hbGwJIC0gcHJpbnQgdGhlIHNpbmdsZSBjaGFubmVsCisgICAgICogIDEtPjEgICAgIC0gcHJpbnQgdGhlIG1hcHBpbmcKKyAgICAgKi8KKyAgICBpZiAoc3d6X3ggPT0gQlJXX0NIQU5ORUxfWCAmJgorCXN3el95ID09IEJSV19DSEFOTkVMX1kgJiYKKwlzd3pfeiA9PSBCUldfQ0hBTk5FTF9aICYmCisJc3d6X3cgPT0gQlJXX0NIQU5ORUxfVykKKyAgICB7CisJOworICAgIH0KKyAgICBlbHNlIGlmIChzd3pfeCA9PSBzd3pfeSAmJiBzd3pfeCA9PSBzd3pfeiAmJiBzd3pfeCA9PSBzd3pfdykKKyAgICB7CisJc3RyaW5nIChmaWxlLCAiLiIpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3gsIE5VTEwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXN0cmluZyAoZmlsZSwgIi4iKTsKKwllcnIgfD0gY29udHJvbCAoZmlsZSwgImNoYW5uZWwgc2VsZWN0IiwgY2hhbl9zZWwsIHN3el94LCBOVUxMKTsKKwllcnIgfD0gY29udHJvbCAoZmlsZSwgImNoYW5uZWwgc2VsZWN0IiwgY2hhbl9zZWwsIHN3el95LCBOVUxMKTsKKwllcnIgfD0gY29udHJvbCAoZmlsZSwgImNoYW5uZWwgc2VsZWN0IiwgY2hhbl9zZWwsIHN3el96LCBOVUxMKTsKKwllcnIgfD0gY29udHJvbCAoZmlsZSwgImNoYW5uZWwgc2VsZWN0IiwgY2hhbl9zZWwsIHN3el93LCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzcmMxXzNzcmMgKEZJTEUgKmZpbGUsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgdW5zaWduZWQgc3d6X3ggPSAoaW5zdC0+Yml0czIuZGEzc3JjLnNyYzFfc3dpenpsZSA+PiAwKSAmIDB4MzsKKyAgICB1bnNpZ25lZCBzd3pfeSA9IChpbnN0LT5iaXRzMi5kYTNzcmMuc3JjMV9zd2l6emxlID4+IDIpICYgMHgzOworICAgIHVuc2lnbmVkIHN3el96ID0gKGluc3QtPmJpdHMyLmRhM3NyYy5zcmMxX3N3aXp6bGUgPj4gNCkgJiAweDM7CisgICAgdW5zaWduZWQgc3d6X3cgPSAoaW5zdC0+Yml0czIuZGEzc3JjLnNyYzFfc3dpenpsZSA+PiA2KSAmIDB4MzsKKyAgICB1bnNpZ25lZCBzcmMxX3N1YnJlZ19uciA9IChpbnN0LT5iaXRzMi5kYTNzcmMuc3JjMV9zdWJyZWdfbnJfbG93IHwKKwkJCSAgICAgKGluc3QtPmJpdHMzLmRhM3NyYy5zcmMxX3N1YnJlZ19ucl9oaWdoIDw8IDIpKTsKKworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAibmVnYXRlIiwgbmVnYXRlLCBpbnN0LT5iaXRzMS5kYTNzcmMuc3JjMV9uZWdhdGUsCisJCSAgICBOVUxMKTsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgImFicyIsIF9hYnMsIGluc3QtPmJpdHMxLmRhM3NyYy5zcmMxX2FicywgTlVMTCk7CisKKyAgICBlcnIgfD0gcmVnIChmaWxlLCBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLAorCQlpbnN0LT5iaXRzMy5kYTNzcmMuc3JjMV9yZWdfbnIpOworICAgIGlmIChlcnIgPT0gLTEpCisJcmV0dXJuIDA7CisgICAgaWYgKHNyYzFfc3VicmVnX25yKQorCWZvcm1hdCAoZmlsZSwgIi4lZCIsIHNyYzFfc3VicmVnX25yKTsKKyAgICBpZiAoaW5zdC0+Yml0czIuZGEzc3JjLnNyYzFfcmVwX2N0cmwpCisgICAgICAgc3RyaW5nIChmaWxlLCAiPDAsMSwwPiIpOworICAgIGVsc2UKKyAgICAgICBzdHJpbmcgKGZpbGUsICI8NCw0LDE+Iik7CisgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJzcmMgZGExNiByZWcgdHlwZSIsIHRocmVlX3NvdXJjZV9yZWdfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIGluc3QtPmJpdHMxLmRhM3NyYy5zcmNfdHlwZSwgTlVMTCk7CisgICAgLyoKKyAgICAgKiBUaHJlZSBraW5kcyBvZiBzd2l6emxlIGRpc3BsYXk6CisgICAgICogIGlkZW50aXR5IC0gbm90aGluZyBwcmludGVkCisgICAgICogIDEtPmFsbAkgLSBwcmludCB0aGUgc2luZ2xlIGNoYW5uZWwKKyAgICAgKiAgMS0+MSAgICAgLSBwcmludCB0aGUgbWFwcGluZworICAgICAqLworICAgIGlmIChzd3pfeCA9PSBCUldfQ0hBTk5FTF9YICYmCisJc3d6X3kgPT0gQlJXX0NIQU5ORUxfWSAmJgorCXN3el96ID09IEJSV19DSEFOTkVMX1ogJiYKKwlzd3pfdyA9PSBCUldfQ0hBTk5FTF9XKQorICAgIHsKKwk7CisgICAgfQorICAgIGVsc2UgaWYgKHN3el94ID09IHN3el95ICYmIHN3el94ID09IHN3el96ICYmIHN3el94ID09IHN3el93KQorICAgIHsKKwlzdHJpbmcgKGZpbGUsICIuIik7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJjaGFubmVsIHNlbGVjdCIsIGNoYW5fc2VsLCBzd3pfeCwgTlVMTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc3RyaW5nIChmaWxlLCAiLiIpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3gsIE5VTEwpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3ksIE5VTEwpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3osIE5VTEwpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3csIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgc3JjMl8zc3JjIChGSUxFICpmaWxlLCBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnN0KQoreworICAgIGludCBlcnIgPSAwOworICAgIHVuc2lnbmVkIHN3el94ID0gKGluc3QtPmJpdHMzLmRhM3NyYy5zcmMyX3N3aXp6bGUgPj4gMCkgJiAweDM7CisgICAgdW5zaWduZWQgc3d6X3kgPSAoaW5zdC0+Yml0czMuZGEzc3JjLnNyYzJfc3dpenpsZSA+PiAyKSAmIDB4MzsKKyAgICB1bnNpZ25lZCBzd3pfeiA9IChpbnN0LT5iaXRzMy5kYTNzcmMuc3JjMl9zd2l6emxlID4+IDQpICYgMHgzOworICAgIHVuc2lnbmVkIHN3el93ID0gKGluc3QtPmJpdHMzLmRhM3NyYy5zcmMyX3N3aXp6bGUgPj4gNikgJiAweDM7CisKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgIm5lZ2F0ZSIsIG5lZ2F0ZSwgaW5zdC0+Yml0czEuZGEzc3JjLnNyYzJfbmVnYXRlLAorCQkgICAgTlVMTCk7CisgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJhYnMiLCBfYWJzLCBpbnN0LT5iaXRzMS5kYTNzcmMuc3JjMl9hYnMsIE5VTEwpOworCisgICAgZXJyIHw9IHJlZyAoZmlsZSwgQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSwKKwkJaW5zdC0+Yml0czMuZGEzc3JjLnNyYzJfcmVnX25yKTsKKyAgICBpZiAoZXJyID09IC0xKQorCXJldHVybiAwOworICAgIGlmIChpbnN0LT5iaXRzMy5kYTNzcmMuc3JjMl9zdWJyZWdfbnIpCisJZm9ybWF0IChmaWxlLCAiLiVkIiwgaW5zdC0+Yml0czMuZGEzc3JjLnNyYzJfc3VicmVnX25yKTsKKyAgICBpZiAoaW5zdC0+Yml0czMuZGEzc3JjLnNyYzJfcmVwX2N0cmwpCisgICAgICAgc3RyaW5nIChmaWxlLCAiPDAsMSwwPiIpOworICAgIGVsc2UKKyAgICAgICBzdHJpbmcgKGZpbGUsICI8NCw0LDE+Iik7CisgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJzcmMgZGExNiByZWcgdHlwZSIsIHRocmVlX3NvdXJjZV9yZWdfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIGluc3QtPmJpdHMxLmRhM3NyYy5zcmNfdHlwZSwgTlVMTCk7CisgICAgLyoKKyAgICAgKiBUaHJlZSBraW5kcyBvZiBzd2l6emxlIGRpc3BsYXk6CisgICAgICogIGlkZW50aXR5IC0gbm90aGluZyBwcmludGVkCisgICAgICogIDEtPmFsbAkgLSBwcmludCB0aGUgc2luZ2xlIGNoYW5uZWwKKyAgICAgKiAgMS0+MSAgICAgLSBwcmludCB0aGUgbWFwcGluZworICAgICAqLworICAgIGlmIChzd3pfeCA9PSBCUldfQ0hBTk5FTF9YICYmCisJc3d6X3kgPT0gQlJXX0NIQU5ORUxfWSAmJgorCXN3el96ID09IEJSV19DSEFOTkVMX1ogJiYKKwlzd3pfdyA9PSBCUldfQ0hBTk5FTF9XKQorICAgIHsKKwk7CisgICAgfQorICAgIGVsc2UgaWYgKHN3el94ID09IHN3el95ICYmIHN3el94ID09IHN3el96ICYmIHN3el94ID09IHN3el93KQorICAgIHsKKwlzdHJpbmcgKGZpbGUsICIuIik7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJjaGFubmVsIHNlbGVjdCIsIGNoYW5fc2VsLCBzd3pfeCwgTlVMTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc3RyaW5nIChmaWxlLCAiLiIpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3gsIE5VTEwpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3ksIE5VTEwpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3osIE5VTEwpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiY2hhbm5lbCBzZWxlY3QiLCBjaGFuX3NlbCwgc3d6X3csIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGltbSAoRklMRSAqZmlsZSwgdW5zaWduZWQgdHlwZSwgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zdCkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQlJXX0hXX1JFR19UWVBFX1VEOgorCWZvcm1hdCAoZmlsZSwgIjB4JTA4eFVEIiwgaW5zdC0+Yml0czMudWQpOworCWJyZWFrOworICAgIGNhc2UgQlJXX0hXX1JFR19UWVBFX0Q6CisJZm9ybWF0IChmaWxlLCAiJWREIiwgaW5zdC0+Yml0czMuZCk7CisJYnJlYWs7CisgICAgY2FzZSBCUldfSFdfUkVHX1RZUEVfVVc6CisJZm9ybWF0IChmaWxlLCAiMHglMDR4VVciLCAodWludDE2X3QpIGluc3QtPmJpdHMzLnVkKTsKKwlicmVhazsKKyAgICBjYXNlIEJSV19IV19SRUdfVFlQRV9XOgorCWZvcm1hdCAoZmlsZSwgIiVkVyIsIChpbnQxNl90KSBpbnN0LT5iaXRzMy5kKTsKKwlicmVhazsKKyAgICBjYXNlIEJSV19IV19SRUdfSU1NX1RZUEVfVVY6CisJZm9ybWF0IChmaWxlLCAiMHglMDh4VVYiLCBpbnN0LT5iaXRzMy51ZCk7CisJYnJlYWs7CisgICAgY2FzZSBCUldfSFdfUkVHX0lNTV9UWVBFX1ZGOgorCWZvcm1hdCAoZmlsZSwgIlZlY3RvciBGbG9hdCIpOworCWJyZWFrOworICAgIGNhc2UgQlJXX0hXX1JFR19JTU1fVFlQRV9WOgorCWZvcm1hdCAoZmlsZSwgIjB4JTA4eFYiLCBpbnN0LT5iaXRzMy51ZCk7CisJYnJlYWs7CisgICAgY2FzZSBCUldfSFdfUkVHX1RZUEVfRjoKKwlmb3JtYXQgKGZpbGUsICIlLWdGIiwgaW5zdC0+Yml0czMuZik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNyYzAgKEZJTEUgKmZpbGUsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICAgaWYgKGluc3QtPmJpdHMxLmRhMS5zcmMwX3JlZ19maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUpCisJcmV0dXJuIGltbSAoZmlsZSwgaW5zdC0+Yml0czEuZGExLnNyYzBfcmVnX3R5cGUsCisJCSAgICBpbnN0KTsKKyAgICBlbHNlIGlmIChpbnN0LT5oZWFkZXIuYWNjZXNzX21vZGUgPT0gQlJXX0FMSUdOXzEpCisgICAgeworCWlmIChpbnN0LT5iaXRzMi5kYTEuc3JjMF9hZGRyZXNzX21vZGUgPT0gQlJXX0FERFJFU1NfRElSRUNUKQorCXsKKwkgICAgcmV0dXJuIHNyY19kYTEgKGZpbGUsCisJCQkgICAgaW5zdC0+Yml0czEuZGExLnNyYzBfcmVnX3R5cGUsCisJCQkgICAgaW5zdC0+Yml0czEuZGExLnNyYzBfcmVnX2ZpbGUsCisJCQkgICAgaW5zdC0+Yml0czIuZGExLnNyYzBfdmVydF9zdHJpZGUsCisJCQkgICAgaW5zdC0+Yml0czIuZGExLnNyYzBfd2lkdGgsCisJCQkgICAgaW5zdC0+Yml0czIuZGExLnNyYzBfaG9yaXpfc3RyaWRlLAorCQkJICAgIGluc3QtPmJpdHMyLmRhMS5zcmMwX3JlZ19uciwKKwkJCSAgICBpbnN0LT5iaXRzMi5kYTEuc3JjMF9zdWJyZWdfbnIsCisJCQkgICAgaW5zdC0+Yml0czIuZGExLnNyYzBfYWJzLAorCQkJICAgIGluc3QtPmJpdHMyLmRhMS5zcmMwX25lZ2F0ZSk7CisJfQorCWVsc2UKKwl7CisJICAgIHJldHVybiBzcmNfaWExIChmaWxlLAorCQkJICAgIGluc3QtPmJpdHMxLmlhMS5zcmMwX3JlZ190eXBlLAorCQkJICAgIGluc3QtPmJpdHMxLmlhMS5zcmMwX3JlZ19maWxlLAorCQkJICAgIGluc3QtPmJpdHMyLmlhMS5zcmMwX2luZGlyZWN0X29mZnNldCwKKwkJCSAgICBpbnN0LT5iaXRzMi5pYTEuc3JjMF9zdWJyZWdfbnIsCisJCQkgICAgaW5zdC0+Yml0czIuaWExLnNyYzBfbmVnYXRlLAorCQkJICAgIGluc3QtPmJpdHMyLmlhMS5zcmMwX2FicywKKwkJCSAgICBpbnN0LT5iaXRzMi5pYTEuc3JjMF9hZGRyZXNzX21vZGUsCisJCQkgICAgaW5zdC0+Yml0czIuaWExLnNyYzBfaG9yaXpfc3RyaWRlLAorCQkJICAgIGluc3QtPmJpdHMyLmlhMS5zcmMwX3dpZHRoLAorCQkJICAgIGluc3QtPmJpdHMyLmlhMS5zcmMwX3ZlcnRfc3RyaWRlKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKGluc3QtPmJpdHMyLmRhMTYuc3JjMF9hZGRyZXNzX21vZGUgPT0gQlJXX0FERFJFU1NfRElSRUNUKQorCXsKKwkgICAgcmV0dXJuIHNyY19kYTE2IChmaWxlLAorCQkJICAgICBpbnN0LT5iaXRzMS5kYTE2LnNyYzBfcmVnX3R5cGUsCisJCQkgICAgIGluc3QtPmJpdHMxLmRhMTYuc3JjMF9yZWdfZmlsZSwKKwkJCSAgICAgaW5zdC0+Yml0czIuZGExNi5zcmMwX3ZlcnRfc3RyaWRlLAorCQkJICAgICBpbnN0LT5iaXRzMi5kYTE2LnNyYzBfcmVnX25yLAorCQkJICAgICBpbnN0LT5iaXRzMi5kYTE2LnNyYzBfc3VicmVnX25yLAorCQkJICAgICBpbnN0LT5iaXRzMi5kYTE2LnNyYzBfYWJzLAorCQkJICAgICBpbnN0LT5iaXRzMi5kYTE2LnNyYzBfbmVnYXRlLAorCQkJICAgICBpbnN0LT5iaXRzMi5kYTE2LnNyYzBfc3d6X3gsCisJCQkgICAgIGluc3QtPmJpdHMyLmRhMTYuc3JjMF9zd3pfeSwKKwkJCSAgICAgaW5zdC0+Yml0czIuZGExNi5zcmMwX3N3el96LAorCQkJICAgICBpbnN0LT5iaXRzMi5kYTE2LnNyYzBfc3d6X3cpOworCX0KKwllbHNlCisJeworCSAgICBzdHJpbmcgKGZpbGUsICJJbmRpcmVjdCBhbGlnbjE2IGFkZHJlc3MgbW9kZSBub3Qgc3VwcG9ydGVkIik7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc3JjMSAoRklMRSAqZmlsZSwgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgICBpZiAoaW5zdC0+Yml0czEuZGExLnNyYzFfcmVnX2ZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSkKKwlyZXR1cm4gaW1tIChmaWxlLCBpbnN0LT5iaXRzMS5kYTEuc3JjMV9yZWdfdHlwZSwKKwkJICAgIGluc3QpOworICAgIGVsc2UgaWYgKGluc3QtPmhlYWRlci5hY2Nlc3NfbW9kZSA9PSBCUldfQUxJR05fMSkKKyAgICB7CisJaWYgKGluc3QtPmJpdHMzLmRhMS5zcmMxX2FkZHJlc3NfbW9kZSA9PSBCUldfQUREUkVTU19ESVJFQ1QpCisJeworCSAgICByZXR1cm4gc3JjX2RhMSAoZmlsZSwKKwkJCSAgICBpbnN0LT5iaXRzMS5kYTEuc3JjMV9yZWdfdHlwZSwKKwkJCSAgICBpbnN0LT5iaXRzMS5kYTEuc3JjMV9yZWdfZmlsZSwKKwkJCSAgICBpbnN0LT5iaXRzMy5kYTEuc3JjMV92ZXJ0X3N0cmlkZSwKKwkJCSAgICBpbnN0LT5iaXRzMy5kYTEuc3JjMV93aWR0aCwKKwkJCSAgICBpbnN0LT5iaXRzMy5kYTEuc3JjMV9ob3Jpel9zdHJpZGUsCisJCQkgICAgaW5zdC0+Yml0czMuZGExLnNyYzFfcmVnX25yLAorCQkJICAgIGluc3QtPmJpdHMzLmRhMS5zcmMxX3N1YnJlZ19uciwKKwkJCSAgICBpbnN0LT5iaXRzMy5kYTEuc3JjMV9hYnMsCisJCQkgICAgaW5zdC0+Yml0czMuZGExLnNyYzFfbmVnYXRlKTsKKwl9CisJZWxzZQorCXsKKwkgICAgcmV0dXJuIHNyY19pYTEgKGZpbGUsCisJCQkgICAgaW5zdC0+Yml0czEuaWExLnNyYzFfcmVnX3R5cGUsCisJCQkgICAgaW5zdC0+Yml0czEuaWExLnNyYzFfcmVnX2ZpbGUsCisJCQkgICAgaW5zdC0+Yml0czMuaWExLnNyYzFfaW5kaXJlY3Rfb2Zmc2V0LAorCQkJICAgIGluc3QtPmJpdHMzLmlhMS5zcmMxX3N1YnJlZ19uciwKKwkJCSAgICBpbnN0LT5iaXRzMy5pYTEuc3JjMV9uZWdhdGUsCisJCQkgICAgaW5zdC0+Yml0czMuaWExLnNyYzFfYWJzLAorCQkJICAgIGluc3QtPmJpdHMzLmlhMS5zcmMxX2FkZHJlc3NfbW9kZSwKKwkJCSAgICBpbnN0LT5iaXRzMy5pYTEuc3JjMV9ob3Jpel9zdHJpZGUsCisJCQkgICAgaW5zdC0+Yml0czMuaWExLnNyYzFfd2lkdGgsCisJCQkgICAgaW5zdC0+Yml0czMuaWExLnNyYzFfdmVydF9zdHJpZGUpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoaW5zdC0+Yml0czMuZGExNi5zcmMxX2FkZHJlc3NfbW9kZSA9PSBCUldfQUREUkVTU19ESVJFQ1QpCisJeworCSAgICByZXR1cm4gc3JjX2RhMTYgKGZpbGUsCisJCQkgICAgIGluc3QtPmJpdHMxLmRhMTYuc3JjMV9yZWdfdHlwZSwKKwkJCSAgICAgaW5zdC0+Yml0czEuZGExNi5zcmMxX3JlZ19maWxlLAorCQkJICAgICBpbnN0LT5iaXRzMy5kYTE2LnNyYzFfdmVydF9zdHJpZGUsCisJCQkgICAgIGluc3QtPmJpdHMzLmRhMTYuc3JjMV9yZWdfbnIsCisJCQkgICAgIGluc3QtPmJpdHMzLmRhMTYuc3JjMV9zdWJyZWdfbnIsCisJCQkgICAgIGluc3QtPmJpdHMzLmRhMTYuc3JjMV9hYnMsCisJCQkgICAgIGluc3QtPmJpdHMzLmRhMTYuc3JjMV9uZWdhdGUsCisJCQkgICAgIGluc3QtPmJpdHMzLmRhMTYuc3JjMV9zd3pfeCwKKwkJCSAgICAgaW5zdC0+Yml0czMuZGExNi5zcmMxX3N3el95LAorCQkJICAgICBpbnN0LT5iaXRzMy5kYTE2LnNyYzFfc3d6X3osCisJCQkgICAgIGluc3QtPmJpdHMzLmRhMTYuc3JjMV9zd3pfdyk7CisJfQorCWVsc2UKKwl7CisJICAgIHN0cmluZyAoZmlsZSwgIkluZGlyZWN0IGFsaWduMTYgYWRkcmVzcyBtb2RlIG5vdCBzdXBwb3J0ZWQiKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KK30KKworc3RhdGljIGludCBxdHJfY3RybChGSUxFICpmaWxlLCBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnN0KQoreworICAgIGludCBxdHJfY3RsID0gaW5zdC0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2w7CisgICAgaW50IGV4ZWNfc2l6ZSA9IDEgPDwgaW5zdC0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplOworCisgICAgaWYgKGV4ZWNfc2l6ZSA9PSA4KSB7CisJc3dpdGNoIChxdHJfY3RsKSB7CisJY2FzZSAwOgorCSAgICBzdHJpbmcgKGZpbGUsICIgMVEiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBzdHJpbmcgKGZpbGUsICIgMlEiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBzdHJpbmcgKGZpbGUsICIgM1EiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBzdHJpbmcgKGZpbGUsICIgNFEiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gZWxzZSBpZiAoZXhlY19zaXplID09IDE2KXsKKwlpZiAocXRyX2N0bCA8IDIpCisJICAgIHN0cmluZyAoZmlsZSwgIiAxSCIpOworCWVsc2UKKwkgICAgc3RyaW5nIChmaWxlLCAiIDJIIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYnJ3X2Rpc2FzbSAoRklMRSAqZmlsZSwgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zdCwgaW50IGdlbikKK3sKKyAgICBpbnQJZXJyID0gMDsKKyAgICBpbnQgc3BhY2UgPSAwOworCisgICAgaWYgKGluc3QtPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCkgeworCXN0cmluZyAoZmlsZSwgIigiKTsKKwllcnIgfD0gY29udHJvbCAoZmlsZSwgInByZWRpY2F0ZSBpbnZlcnNlIiwgcHJlZF9pbnYsIGluc3QtPmhlYWRlci5wcmVkaWNhdGVfaW52ZXJzZSwgTlVMTCk7CisJZm9ybWF0IChmaWxlLCAiZiVkIiwgZ2VuID49IDcgPyBpbnN0LT5iaXRzMi5kYTEuZmxhZ19yZWdfbnIgOiAwKTsKKwlpZiAoaW5zdC0+Yml0czIuZGExLmZsYWdfc3VicmVnX25yKQorCSAgICBmb3JtYXQgKGZpbGUsICIuJWQiLCBpbnN0LT5iaXRzMi5kYTEuZmxhZ19zdWJyZWdfbnIpOworCWlmIChpbnN0LT5oZWFkZXIuYWNjZXNzX21vZGUgPT0gQlJXX0FMSUdOXzEpCisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAicHJlZGljYXRlIGNvbnRyb2wgYWxpZ24xIiwgcHJlZF9jdHJsX2FsaWduMSwKKwkJCSAgICBpbnN0LT5oZWFkZXIucHJlZGljYXRlX2NvbnRyb2wsIE5VTEwpOworCWVsc2UKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJwcmVkaWNhdGUgY29udHJvbCBhbGlnbjE2IiwgcHJlZF9jdHJsX2FsaWduMTYsCisJCQkgICAgaW5zdC0+aGVhZGVyLnByZWRpY2F0ZV9jb250cm9sLCBOVUxMKTsKKwlzdHJpbmcgKGZpbGUsICIpICIpOworICAgIH0KKworICAgIGVyciB8PSBwcmludF9vcGNvZGUgKGZpbGUsIGluc3QtPmhlYWRlci5vcGNvZGUpOworICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAic2F0dXJhdGUiLCBzYXR1cmF0ZSwgaW5zdC0+aGVhZGVyLnNhdHVyYXRlLCBOVUxMKTsKKyAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgImRlYnVnIGNvbnRyb2wiLCBkZWJ1Z19jdHJsLCBpbnN0LT5oZWFkZXIuZGVidWdfY29udHJvbCwgTlVMTCk7CisKKyAgICBpZiAoaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX01BVEgpIHsKKwlzdHJpbmcgKGZpbGUsICIgIik7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJmdW5jdGlvbiIsIG1hdGhfZnVuY3Rpb24sCisJCQlpbnN0LT5oZWFkZXIuZGVzdHJlZ19fY29uZGl0aW9uYWxtb2QsIE5VTEwpOworICAgIH0gZWxzZSBpZiAoaW5zdC0+aGVhZGVyLm9wY29kZSAhPSBCUldfT1BDT0RFX1NFTkQgJiYKKwkgICAgICAgaW5zdC0+aGVhZGVyLm9wY29kZSAhPSBCUldfT1BDT0RFX1NFTkRDKSB7CisJZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJjb25kaXRpb25hbCBtb2RpZmllciIsIGNvbmRpdGlvbmFsX21vZGlmaWVyLAorCQkJaW5zdC0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kLCBOVUxMKTsKKworICAgICAgICAvKiBJZiB3ZSdyZSB1c2luZyB0aGUgY29uZGl0aW9uYWwgbW9kaWZpZXIsIHByaW50IHdoaWNoIGZsYWdzIHJlZyBpcworICAgICAgICAgKiB1c2VkIGZvciBpdC4gIE5vdGUgdGhhdCBvbiBnZW42KywgdGhlIGVtYmVkZGVkLWNvbmRpdGlvbiBTRUwgYW5kCisgICAgICAgICAqIGNvbnRyb2wgZmxvdyBkb2Vzbid0IHVwZGF0ZSBmbGFncy4KKyAgICAgICAgICovCisJaWYgKGluc3QtPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCAmJgorICAgICAgICAgICAgKGdlbiA8IDYgfHwgKGluc3QtPmhlYWRlci5vcGNvZGUgIT0gQlJXX09QQ09ERV9TRUwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5oZWFkZXIub3Bjb2RlICE9IEJSV19PUENPREVfSUYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5oZWFkZXIub3Bjb2RlICE9IEJSV19PUENPREVfV0hJTEUpKSkgeworCSAgICBmb3JtYXQgKGZpbGUsICIuZiVkIiwgZ2VuID49IDcgPyBpbnN0LT5iaXRzMi5kYTEuZmxhZ19yZWdfbnIgOiAwKTsKKwkgICAgaWYgKGluc3QtPmJpdHMyLmRhMS5mbGFnX3N1YnJlZ19ucikKKwkJZm9ybWF0IChmaWxlLCAiLiVkIiwgaW5zdC0+Yml0czIuZGExLmZsYWdfc3VicmVnX25yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnN0LT5oZWFkZXIub3Bjb2RlICE9IEJSV19PUENPREVfTk9QKSB7CisJc3RyaW5nIChmaWxlLCAiKCIpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiZXhlY3V0aW9uIHNpemUiLCBleGVjX3NpemUsIGluc3QtPmhlYWRlci5leGVjdXRpb25fc2l6ZSwgTlVMTCk7CisJc3RyaW5nIChmaWxlLCAiKSIpOworICAgIH0KKworICAgIGlmIChpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfU0VORCAmJiBnZW4gPCA2KQorCWZvcm1hdCAoZmlsZSwgIiAlZCIsIGluc3QtPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCk7CisKKyAgICBpZiAob3Bjb2RlW2luc3QtPmhlYWRlci5vcGNvZGVdLm5zcmMgPT0gMykgeworICAgICAgIHBhZCAoZmlsZSwgMTYpOworICAgICAgIGVyciB8PSBkZXN0XzNzcmMgKGZpbGUsIGluc3QpOworCisgICAgICAgcGFkIChmaWxlLCAzMik7CisgICAgICAgZXJyIHw9IHNyYzBfM3NyYyAoZmlsZSwgaW5zdCk7CisKKyAgICAgICBwYWQgKGZpbGUsIDQ4KTsKKyAgICAgICBlcnIgfD0gc3JjMV8zc3JjIChmaWxlLCBpbnN0KTsKKworICAgICAgIHBhZCAoZmlsZSwgNjQpOworICAgICAgIGVyciB8PSBzcmMyXzNzcmMgKGZpbGUsIGluc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgaWYgKG9wY29kZVtpbnN0LT5oZWFkZXIub3Bjb2RlXS5uZHN0ID4gMCkgeworCSAgcGFkIChmaWxlLCAxNik7CisJICBlcnIgfD0gZGVzdCAoZmlsZSwgaW5zdCk7CisgICAgICAgfSBlbHNlIGlmIChnZW4gPT0gNyAmJiAoaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UgfHwKKwkJCSAgICAgICBpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfRU5ESUYgfHwKKwkJCSAgICAgICBpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfV0hJTEUpKSB7CisJICBmb3JtYXQgKGZpbGUsICIgJWQiLCBpbnN0LT5iaXRzMy5icmVha19jb250LmppcCk7CisgICAgICAgfSBlbHNlIGlmIChnZW4gPT0gNiAmJiAoaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0lGIHx8CisJCQkgICAgICAgaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UgfHwKKwkJCSAgICAgICBpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfRU5ESUYgfHwKKwkJCSAgICAgICBpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfV0hJTEUpKSB7CisJICBmb3JtYXQgKGZpbGUsICIgJWQiLCBpbnN0LT5iaXRzMS5icmFuY2hfZ2VuNi5qdW1wX2NvdW50KTsKKyAgICAgICB9IGVsc2UgaWYgKChnZW4gPj0gNiAmJiAoaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0JSRUFLIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9DT05USU5VRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfSEFMVCkpIHx8CisgICAgICAgICAgICAgICAgICAoZ2VuID09IDcgJiYgaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0lGKSkgeworCSAgZm9ybWF0IChmaWxlLCAiICVkICVkIiwgaW5zdC0+Yml0czMuYnJlYWtfY29udC51aXAsIGluc3QtPmJpdHMzLmJyZWFrX2NvbnQuamlwKTsKKyAgICAgICB9IGVsc2UgaWYgKGluc3QtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9KTVBJKSB7CisJICBmb3JtYXQgKGZpbGUsICIgJWQiLCBpbnN0LT5iaXRzMy5kKTsKKyAgICAgICB9CisKKyAgICAgICBpZiAob3Bjb2RlW2luc3QtPmhlYWRlci5vcGNvZGVdLm5zcmMgPiAwKSB7CisJICBwYWQgKGZpbGUsIDMyKTsKKwkgIGVyciB8PSBzcmMwIChmaWxlLCBpbnN0KTsKKyAgICAgICB9CisgICAgICAgaWYgKG9wY29kZVtpbnN0LT5oZWFkZXIub3Bjb2RlXS5uc3JjID4gMSkgeworCSAgcGFkIChmaWxlLCA0OCk7CisJICBlcnIgfD0gc3JjMSAoZmlsZSwgaW5zdCk7CisgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfU0VORCB8fAorCWluc3QtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9TRU5EQykgeworCWVudW0gYnJ3X21lc3NhZ2VfdGFyZ2V0IHRhcmdldDsKKworCWlmIChnZW4gPj0gNikKKwkgICAgdGFyZ2V0ID0gaW5zdC0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kOworCWVsc2UgaWYgKGdlbiA9PSA1KQorCSAgICB0YXJnZXQgPSBpbnN0LT5iaXRzMi5zZW5kX2dlbjUuc2ZpZDsKKwllbHNlCisJICAgIHRhcmdldCA9IGluc3QtPmJpdHMzLmdlbmVyaWMubXNnX3RhcmdldDsKKworCW5ld2xpbmUgKGZpbGUpOworCXBhZCAoZmlsZSwgMTYpOworCXNwYWNlID0gMDsKKworCWlmIChnZW4gPj0gNikgeworCSAgIGVyciB8PSBjb250cm9sIChmaWxlLCAidGFyZ2V0IGZ1bmN0aW9uIiwgdGFyZ2V0X2Z1bmN0aW9uX2dlbjYsCisJCQkgICB0YXJnZXQsICZzcGFjZSk7CisJfSBlbHNlIHsKKwkgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgInRhcmdldCBmdW5jdGlvbiIsIHRhcmdldF9mdW5jdGlvbiwKKwkJCSAgIHRhcmdldCwgJnNwYWNlKTsKKwl9CisKKwlzd2l0Y2ggKHRhcmdldCkgeworCWNhc2UgQlJXX1NGSURfTUFUSDoKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJtYXRoIGZ1bmN0aW9uIiwgbWF0aF9mdW5jdGlvbiwKKwkJCSAgICBpbnN0LT5iaXRzMy5tYXRoLmZ1bmN0aW9uLCAmc3BhY2UpOworCSAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgIm1hdGggc2F0dXJhdGUiLCBtYXRoX3NhdHVyYXRlLAorCQkJICAgIGluc3QtPmJpdHMzLm1hdGguc2F0dXJhdGUsICZzcGFjZSk7CisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAibWF0aCBzaWduZWQiLCBtYXRoX3NpZ25lZCwKKwkJCSAgICBpbnN0LT5iaXRzMy5tYXRoLmludF90eXBlLCAmc3BhY2UpOworCSAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgIm1hdGggc2NhbGFyIiwgbWF0aF9zY2FsYXIsCisJCQkgICAgaW5zdC0+Yml0czMubWF0aC5kYXRhX3R5cGUsICZzcGFjZSk7CisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAibWF0aCBwcmVjaXNpb24iLCBtYXRoX3ByZWNpc2lvbiwKKwkJCSAgICBpbnN0LT5iaXRzMy5tYXRoLnByZWNpc2lvbiwgJnNwYWNlKTsKKwkgICAgYnJlYWs7CisJY2FzZSBCUldfU0ZJRF9TQU1QTEVSOgorCSAgICBpZiAoZ2VuID49IDcpIHsKKwkJZm9ybWF0IChmaWxlLCAiICglZCwgJWQsICVkLCAlZCkiLAorCQkJaW5zdC0+Yml0czMuc2FtcGxlcl9nZW43LmJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQlpbnN0LT5iaXRzMy5zYW1wbGVyX2dlbjcuc2FtcGxlciwKKwkJCWluc3QtPmJpdHMzLnNhbXBsZXJfZ2VuNy5tc2dfdHlwZSwKKwkJCWluc3QtPmJpdHMzLnNhbXBsZXJfZ2VuNy5zaW1kX21vZGUpOworCSAgICB9IGVsc2UgaWYgKGdlbiA+PSA1KSB7CisJCWZvcm1hdCAoZmlsZSwgIiAoJWQsICVkLCAlZCwgJWQpIiwKKwkJCWluc3QtPmJpdHMzLnNhbXBsZXJfZ2VuNS5iaW5kaW5nX3RhYmxlX2luZGV4LAorCQkJaW5zdC0+Yml0czMuc2FtcGxlcl9nZW41LnNhbXBsZXIsCisJCQlpbnN0LT5iaXRzMy5zYW1wbGVyX2dlbjUubXNnX3R5cGUsCisJCQlpbnN0LT5iaXRzMy5zYW1wbGVyX2dlbjUuc2ltZF9tb2RlKTsKKwkgICAgfSBlbHNlIGlmICgwIC8qIEZJTklTSE1FOiBpc19nNHggKi8pIHsKKwkJZm9ybWF0IChmaWxlLCAiICglZCwgJWQpIiwKKwkJCWluc3QtPmJpdHMzLnNhbXBsZXJfZzR4LmJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQlpbnN0LT5iaXRzMy5zYW1wbGVyX2c0eC5zYW1wbGVyKTsKKwkgICAgfSBlbHNlIHsKKwkJZm9ybWF0IChmaWxlLCAiICglZCwgJWQsICIsCisJCQlpbnN0LT5iaXRzMy5zYW1wbGVyLmJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQlpbnN0LT5iaXRzMy5zYW1wbGVyLnNhbXBsZXIpOworCQllcnIgfD0gY29udHJvbCAoZmlsZSwgInNhbXBsZXIgdGFyZ2V0IGZvcm1hdCIsCisJCQkJc2FtcGxlcl90YXJnZXRfZm9ybWF0LAorCQkJCWluc3QtPmJpdHMzLnNhbXBsZXIucmV0dXJuX2Zvcm1hdCwgTlVMTCk7CisJCXN0cmluZyAoZmlsZSwgIikiKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIEJSV19TRklEX0RBVEFQT1JUX1JFQUQ6CisJICAgIGlmIChnZW4gPj0gNikgeworCQlmb3JtYXQgKGZpbGUsICIgKCVkLCAlZCwgJWQsICVkKSIsCisJCQlpbnN0LT5iaXRzMy5nZW42X2RwLmJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQlpbnN0LT5iaXRzMy5nZW42X2RwLm1zZ19jb250cm9sLAorCQkJaW5zdC0+Yml0czMuZ2VuNl9kcC5tc2dfdHlwZSwKKwkJCWluc3QtPmJpdHMzLmdlbjZfZHAuc2VuZF9jb21taXRfbXNnKTsKKwkgICAgfSBlbHNlIGlmIChnZW4gPj0gNSAvKiBGSU5JU0hNRTogfHwgaXNfZzR4ICovKSB7CisJCWZvcm1hdCAoZmlsZSwgIiAoJWQsICVkLCAlZCkiLAorCQkJaW5zdC0+Yml0czMuZHBfcmVhZF9nZW41LmJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQlpbnN0LT5iaXRzMy5kcF9yZWFkX2dlbjUubXNnX2NvbnRyb2wsCisJCQlpbnN0LT5iaXRzMy5kcF9yZWFkX2dlbjUubXNnX3R5cGUpOworCSAgICB9IGVsc2UgeworCQlmb3JtYXQgKGZpbGUsICIgKCVkLCAlZCwgJWQpIiwKKwkJCWluc3QtPmJpdHMzLmRwX3JlYWQuYmluZGluZ190YWJsZV9pbmRleCwKKwkJCWluc3QtPmJpdHMzLmRwX3JlYWQubXNnX2NvbnRyb2wsCisJCQlpbnN0LT5iaXRzMy5kcF9yZWFkLm1zZ190eXBlKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgQlJXX1NGSURfREFUQVBPUlRfV1JJVEU6CisJICAgIGlmIChnZW4gPj0gNykgeworCQlmb3JtYXQgKGZpbGUsICIgKCIpOworCisJCWVyciB8PSBjb250cm9sIChmaWxlLCAiRFAgcmMgbWVzc2FnZSB0eXBlIiwKKwkJCQlkcF9yY19tc2dfdHlwZV9nZW42LAorCQkJCWluc3QtPmJpdHMzLmdlbjdfZHAubXNnX3R5cGUsICZzcGFjZSk7CisKKwkJZm9ybWF0IChmaWxlLCAiLCAlZCwgJWQsICVkKSIsCisJCQlpbnN0LT5iaXRzMy5nZW43X2RwLmJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQlpbnN0LT5iaXRzMy5nZW43X2RwLm1zZ19jb250cm9sLAorCQkJaW5zdC0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSk7CisJICAgIH0gZWxzZSBpZiAoZ2VuID09IDYpIHsKKwkJZm9ybWF0IChmaWxlLCAiICgiKTsKKworCQllcnIgfD0gY29udHJvbCAoZmlsZSwgIkRQIHJjIG1lc3NhZ2UgdHlwZSIsCisJCQkJZHBfcmNfbXNnX3R5cGVfZ2VuNiwKKwkJCQlpbnN0LT5iaXRzMy5nZW42X2RwLm1zZ190eXBlLCAmc3BhY2UpOworCisJCWZvcm1hdCAoZmlsZSwgIiwgJWQsICVkLCAlZCwgJWQpIiwKKwkJCWluc3QtPmJpdHMzLmdlbjZfZHAuYmluZGluZ190YWJsZV9pbmRleCwKKwkJCWluc3QtPmJpdHMzLmdlbjZfZHAubXNnX2NvbnRyb2wsCisJCQlpbnN0LT5iaXRzMy5nZW42X2RwLm1zZ190eXBlLAorCQkJaW5zdC0+Yml0czMuZ2VuNl9kcC5zZW5kX2NvbW1pdF9tc2cpOworCSAgICB9IGVsc2UgeworCQlmb3JtYXQgKGZpbGUsICIgKCVkLCAlZCwgJWQsICVkKSIsCisJCQlpbnN0LT5iaXRzMy5kcF93cml0ZS5iaW5kaW5nX3RhYmxlX2luZGV4LAorCQkJKGluc3QtPmJpdHMzLmRwX3dyaXRlLmxhc3RfcmVuZGVyX3RhcmdldCA8PCAzKSB8CisJCQlpbnN0LT5iaXRzMy5kcF93cml0ZS5tc2dfY29udHJvbCwKKwkJCWluc3QtPmJpdHMzLmRwX3dyaXRlLm1zZ190eXBlLAorCQkJaW5zdC0+Yml0czMuZHBfd3JpdGUuc2VuZF9jb21taXRfbXNnKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgQlJXX1NGSURfVVJCOgorCSAgICBpZiAoZ2VuID49IDUpIHsKKwkJZm9ybWF0IChmaWxlLCAiICVkIiwgaW5zdC0+Yml0czMudXJiX2dlbjUub2Zmc2V0KTsKKwkgICAgfSBlbHNlIHsKKwkJZm9ybWF0IChmaWxlLCAiICVkIiwgaW5zdC0+Yml0czMudXJiLm9mZnNldCk7CisJICAgIH0KKworCSAgICBzcGFjZSA9IDE7CisJICAgIGlmIChnZW4gPj0gNSkgeworCQllcnIgfD0gY29udHJvbCAoZmlsZSwgInVyYiBvcGNvZGUiLCB1cmJfb3Bjb2RlLAorCQkJCWluc3QtPmJpdHMzLnVyYl9nZW41Lm9wY29kZSwgJnNwYWNlKTsKKwkgICAgfQorCSAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgInVyYiBzd2l6emxlIiwgdXJiX3N3aXp6bGUsCisJCQkgICAgaW5zdC0+Yml0czMudXJiLnN3aXp6bGVfY29udHJvbCwgJnNwYWNlKTsKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJ1cmIgYWxsb2NhdGUiLCB1cmJfYWxsb2NhdGUsCisJCQkgICAgaW5zdC0+Yml0czMudXJiLmFsbG9jYXRlLCAmc3BhY2UpOworCSAgICBlcnIgfD0gY29udHJvbCAoZmlsZSwgInVyYiB1c2VkIiwgdXJiX3VzZWQsCisJCQkgICAgaW5zdC0+Yml0czMudXJiLnVzZWQsICZzcGFjZSk7CisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAidXJiIGNvbXBsZXRlIiwgdXJiX2NvbXBsZXRlLAorCQkJICAgIGluc3QtPmJpdHMzLnVyYi5jb21wbGV0ZSwgJnNwYWNlKTsKKwkgICAgYnJlYWs7CisJY2FzZSBCUldfU0ZJRF9USFJFQURfU1BBV05FUjoKKwkgICAgYnJlYWs7CisJY2FzZSBHRU43X1NGSURfREFUQVBPUlRfREFUQV9DQUNIRToKKyAgICAgICAgICAgaWYgKGdlbiA+PSA3KSB7CisgICAgICAgICAgICAgIGZvcm1hdCAoZmlsZSwgIiAoIik7CisKKyAgICAgICAgICAgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJEUCBEQzAgbWVzc2FnZSB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwX2RjMF9tc2dfdHlwZV9nZW43LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSwgJnNwYWNlKTsKKworICAgICAgICAgICAgICBmb3JtYXQgKGZpbGUsICIsICVkLCAiLCBpbnN0LT5iaXRzMy5nZW43X2RwLmJpbmRpbmdfdGFibGVfaW5kZXgpOworCisgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdC0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSkgeworICAgICAgICAgICAgICBjYXNlIEdFTjdfREFUQVBPUlRfRENfVU5UWVBFRF9BVE9NSUNfT1A6CisgICAgICAgICAgICAgICAgIGNvbnRyb2wgKGZpbGUsICJhdG9taWMgb3AiLCBhb3AsIGluc3QtPmJpdHMzLnVkID4+IDggJiAweGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICBmb3JtYXQgKGZpbGUsICIlZCIsIGluc3QtPmJpdHMzLmdlbjdfZHAubXNnX2NvbnRyb2wpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGZvcm1hdCAoZmlsZSwgIikiKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKworCWNhc2UgSFNXX1NGSURfREFUQVBPUlRfREFUQV9DQUNIRV8xOgorCSAgICBpZiAoZ2VuID49IDcpIHsKKwkJZm9ybWF0IChmaWxlLCAiICgiKTsKKworCQllcnIgfD0gY29udHJvbCAoZmlsZSwgIkRQIERDMSBtZXNzYWdlIHR5cGUiLAorCQkJCWRwX2RjMV9tc2dfdHlwZV9oc3csCisJCQkJaW5zdC0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSwgJnNwYWNlKTsKKworCQlmb3JtYXQgKGZpbGUsICIsICVkLCAiLAorCQkJaW5zdC0+Yml0czMuZ2VuN19kcC5iaW5kaW5nX3RhYmxlX2luZGV4KTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdC0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1VOVFlQRURfQVRPTUlDX09QOgorICAgICAgICAgICAgICAgIGNhc2UgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1VOVFlQRURfQVRPTUlDX09QX1NJTUQ0WDI6CisgICAgICAgICAgICAgICAgY2FzZSBIU1dfREFUQVBPUlRfRENfUE9SVDFfVFlQRURfQVRPTUlDX09QOgorICAgICAgICAgICAgICAgIGNhc2UgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1RZUEVEX0FUT01JQ19PUF9TSU1ENFgyOgorICAgICAgICAgICAgICAgIGNhc2UgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX0FUT01JQ19DT1VOVEVSX09QOgorICAgICAgICAgICAgICAgIGNhc2UgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX0FUT01JQ19DT1VOVEVSX09QX1NJTUQ0WDI6CisgICAgICAgICAgICAgICAgICAgY29udHJvbCAoZmlsZSwgImF0b21pYyBvcCIsIGFvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5iaXRzMy51ZCA+PiA4ICYgMHhmLCAmc3BhY2UpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgZm9ybWF0IChmaWxlLCAiJWQiLCBpbnN0LT5iaXRzMy5nZW43X2RwLm1zZ19jb250cm9sKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9ybWF0IChmaWxlLCAiKSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKworCWRlZmF1bHQ6CisJICAgIGZvcm1hdCAoZmlsZSwgInVuc3VwcG9ydGVkIHRhcmdldCAlZCIsIHRhcmdldCk7CisJICAgIGJyZWFrOworCX0KKwlpZiAoc3BhY2UpCisJICAgIHN0cmluZyAoZmlsZSwgIiAiKTsKKwlpZiAoZ2VuID49IDUpIHsKKwkgICBmb3JtYXQgKGZpbGUsICJtbGVuICVkIiwKKwkJICAgaW5zdC0+Yml0czMuZ2VuZXJpY19nZW41Lm1zZ19sZW5ndGgpOworCSAgIGZvcm1hdCAoZmlsZSwgIiBybGVuICVkIiwKKwkJICAgaW5zdC0+Yml0czMuZ2VuZXJpY19nZW41LnJlc3BvbnNlX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkgICBmb3JtYXQgKGZpbGUsICJtbGVuICVkIiwKKwkJICAgaW5zdC0+Yml0czMuZ2VuZXJpYy5tc2dfbGVuZ3RoKTsKKwkgICBmb3JtYXQgKGZpbGUsICIgcmxlbiAlZCIsCisJCSAgIGluc3QtPmJpdHMzLmdlbmVyaWMucmVzcG9uc2VfbGVuZ3RoKTsKKwl9CisgICAgfQorICAgIHBhZCAoZmlsZSwgNjQpOworICAgIGlmIChpbnN0LT5oZWFkZXIub3Bjb2RlICE9IEJSV19PUENPREVfTk9QKSB7CisJc3RyaW5nIChmaWxlLCAieyIpOworCXNwYWNlID0gMTsKKwllcnIgfD0gY29udHJvbChmaWxlLCAiYWNjZXNzIG1vZGUiLCBhY2Nlc3NfbW9kZSwgaW5zdC0+aGVhZGVyLmFjY2Vzc19tb2RlLCAmc3BhY2UpOworCWlmIChnZW4gPj0gNikKKwkgICAgZXJyIHw9IGNvbnRyb2wgKGZpbGUsICJ3cml0ZSBlbmFibGUgY29udHJvbCIsIHdlY3RybCwgaW5zdC0+aGVhZGVyLm1hc2tfY29udHJvbCwgJnNwYWNlKTsKKwllbHNlCisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAibWFzayBjb250cm9sIiwgbWFza19jdHJsLCBpbnN0LT5oZWFkZXIubWFza19jb250cm9sLCAmc3BhY2UpOworCWVyciB8PSBjb250cm9sIChmaWxlLCAiZGVwZW5kZW5jeSBjb250cm9sIiwgZGVwX2N0cmwsIGluc3QtPmhlYWRlci5kZXBlbmRlbmN5X2NvbnRyb2wsICZzcGFjZSk7CisKKwlpZiAoZ2VuID49IDYpCisJICAgIGVyciB8PSBxdHJfY3RybCAoZmlsZSwgaW5zdCk7CisJZWxzZSB7CisJICAgIGlmIChpbnN0LT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9PSBCUldfQ09NUFJFU1NJT05fQ09NUFJFU1NFRCAmJgorCQlvcGNvZGVbaW5zdC0+aGVhZGVyLm9wY29kZV0ubmRzdCA+IDAgJiYKKwkJaW5zdC0+Yml0czEuZGExLmRlc3RfcmVnX2ZpbGUgPT0gQlJXX01FU1NBR0VfUkVHSVNURVJfRklMRSAmJgorCQlpbnN0LT5iaXRzMS5kYTEuZGVzdF9yZWdfbnIgJiAoMSA8PCA3KSkgeworCQlmb3JtYXQgKGZpbGUsICIgY29tcHI0Iik7CisJICAgIH0gZWxzZSB7CisJCWVyciB8PSBjb250cm9sIChmaWxlLCAiY29tcHJlc3Npb24gY29udHJvbCIsIGNvbXByX2N0cmwsCisJCQkJaW5zdC0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wsICZzcGFjZSk7CisJICAgIH0KKwl9CisKKwllcnIgfD0gY29udHJvbCAoZmlsZSwgInRocmVhZCBjb250cm9sIiwgdGhyZWFkX2N0cmwsIGluc3QtPmhlYWRlci50aHJlYWRfY29udHJvbCwgJnNwYWNlKTsKKwlpZiAoZ2VuID49IDYpCisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAiYWNjIHdyaXRlIGNvbnRyb2wiLCBhY2N3ciwgaW5zdC0+aGVhZGVyLmFjY193cl9jb250cm9sLCAmc3BhY2UpOworCWlmIChpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfU0VORCB8fAorCSAgICBpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfU0VOREMpCisJICAgIGVyciB8PSBjb250cm9sIChmaWxlLCAiZW5kIG9mIHRocmVhZCIsIGVuZF9vZl90aHJlYWQsCisJCQkgICAgaW5zdC0+Yml0czMuZ2VuZXJpYy5lbmRfb2ZfdGhyZWFkLCAmc3BhY2UpOworCWlmIChzcGFjZSkKKwkgICAgc3RyaW5nIChmaWxlLCAiICIpOworCXN0cmluZyAoZmlsZSwgIn0iKTsKKyAgICB9CisgICAgc3RyaW5nIChmaWxlLCAiOyIpOworICAgIG5ld2xpbmUgKGZpbGUpOworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2V1LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2V1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4NDAyOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZXUuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIEludGVsIENvcnAuICAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBJbnRlbCBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8KKyBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgorCisgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qCisgICogQXV0aG9yczoKKyAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHdAdm13YXJlLmNvbT4KKyAgKi8KKworCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfZGVmaW5lcy5oIgorI2luY2x1ZGUgImJyd19ldS5oIgorCisjaW5jbHVkZSAiZ2xzbC9yYWxsb2MuaCIKKworLyoqCisgKiBDb252ZXJ0cyBhIEJSV19SRUdJU1RFUl9UWVBFXyogZW51bSB0byBhIHNob3J0IHN0cmluZyAoRiwgVUQsIGFuZCBzbyBvbikuCisgKgorICogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiByZWdfZW5jb2RpbmcgZnJvbSBicndfZGlzYXNtLmMgaW4gdGhhdCBpdCBvcGVyYXRlcworICogb24gdGhlIGFic3RyYWN0IGVudW0gdmFsdWVzLCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJhdGlvbi1zcGVjaWZpYyBlbmNvZGluZy4KKyAqLworY29uc3QgY2hhciAqCiticndfcmVnX3R5cGVfbGV0dGVycyh1bnNpZ25lZCB0eXBlKQoreworICAgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsKKyAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9VRF0gPSAiVUQiLAorICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX0RdICA9ICJEIiwKKyAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9VV10gPSAiVVciLAorICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1ddICA9ICJXIiwKKyAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9GXSAgPSAiRiIsCisgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVUJdID0gIlVCIiwKKyAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9CXSAgPSAiQiIsCisgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVVZdID0gIlVWIiwKKyAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9WXSAgPSAiViIsCisgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVkZdID0gIlZGIiwKKyAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9ERl0gPSAiREYiLAorICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX0hGXSA9ICJIRiIsCisgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVVFdID0gIlVRIiwKKyAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9RXSAgPSAiUSIsCisgICB9OworICAgYXNzZXJ0KHR5cGUgPD0gQlJXX1JFR0lTVEVSX1RZUEVfVVEpOworICAgcmV0dXJuIG5hbWVzW3R5cGVdOworfQorCisvKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbmFsIG1vZCBmb3Igc3dhcHBpbmcgc3JjMCBhbmQKKyAqIHNyYzEgaW4gZS5nLiBDTVAuCisgKi8KK3VpbnQzMl90Citicndfc3dhcF9jbW9kKHVpbnQzMl90IGNtb2QpCit7CisgICBzd2l0Y2ggKGNtb2QpIHsKKyAgIGNhc2UgQlJXX0NPTkRJVElPTkFMX1o6CisgICBjYXNlIEJSV19DT05ESVRJT05BTF9OWjoKKyAgICAgIHJldHVybiBjbW9kOworICAgY2FzZSBCUldfQ09ORElUSU9OQUxfRzoKKyAgICAgIHJldHVybiBCUldfQ09ORElUSU9OQUxfTDsKKyAgIGNhc2UgQlJXX0NPTkRJVElPTkFMX0dFOgorICAgICAgcmV0dXJuIEJSV19DT05ESVRJT05BTF9MRTsKKyAgIGNhc2UgQlJXX0NPTkRJVElPTkFMX0w6CisgICAgICByZXR1cm4gQlJXX0NPTkRJVElPTkFMX0c7CisgICBjYXNlIEJSV19DT05ESVRJT05BTF9MRToKKyAgICAgIHJldHVybiBCUldfQ09ORElUSU9OQUxfR0U7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIH4wOworICAgfQorfQorCisKKy8qIEhvdyBkb2VzIHByZWRpY2F0ZSBjb250cm9sIHdvcmsgd2hlbiBleGVjdXRpb25fc2l6ZSAhPSA4PyAgRG8gSQorICogbmVlZCB0byB0ZXN0L3NldCBmb3IgMHhmZmZmIHdoZW4gZXhlY3V0aW9uX3NpemUgaXMgMTY/CisgKi8KK3ZvaWQgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbF9mbGFnX3ZhbHVlKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHVuc2lnbmVkIHZhbHVlICkKK3sKKyAgIHAtPmN1cnJlbnQtPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IEJSV19QUkVESUNBVEVfTk9ORTsKKworICAgaWYgKHZhbHVlICE9IDB4ZmYpIHsKKyAgICAgIGlmICh2YWx1ZSAhPSBwLT5mbGFnX3ZhbHVlKSB7CisJIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisJIGJyd19NT1YocCwgYnJ3X2ZsYWdfcmVnKDAsIDApLCBicndfaW1tX3V3KHZhbHVlKSk7CisJIHAtPmZsYWdfdmFsdWUgPSB2YWx1ZTsKKwkgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworICAgICAgfQorCisgICAgICBwLT5jdXJyZW50LT5oZWFkZXIucHJlZGljYXRlX2NvbnRyb2wgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgIH0KK30KKwordm9pZCBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHVuc2lnbmVkIHBjICkKK3sKKyAgIHAtPmN1cnJlbnQtPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IHBjOworfQorCit2b2lkIGJyd19zZXRfcHJlZGljYXRlX2ludmVyc2Uoc3RydWN0IGJyd19jb21waWxlICpwLCBib29sIHByZWRpY2F0ZV9pbnZlcnNlKQoreworICAgcC0+Y3VycmVudC0+aGVhZGVyLnByZWRpY2F0ZV9pbnZlcnNlID0gcHJlZGljYXRlX2ludmVyc2U7Cit9CisKK3ZvaWQgYnJ3X3NldF9jb25kaXRpb25hbG1vZCggc3RydWN0IGJyd19jb21waWxlICpwLCB1bnNpZ25lZCBjb25kaXRpb25hbCApCit7CisgICBwLT5jdXJyZW50LT5oZWFkZXIuZGVzdHJlZ19fY29uZGl0aW9uYWxtb2QgPSBjb25kaXRpb25hbDsKK30KKwordm9pZCBicndfc2V0X2ZsYWdfcmVnKHN0cnVjdCBicndfY29tcGlsZSAqcCwgaW50IHJlZywgaW50IHN1YnJlZykKK3sKKyAgIHAtPmN1cnJlbnQtPmJpdHMyLmRhMS5mbGFnX3JlZ19uciA9IHJlZzsKKyAgIHAtPmN1cnJlbnQtPmJpdHMyLmRhMS5mbGFnX3N1YnJlZ19uciA9IHN1YnJlZzsKK30KKwordm9pZCBicndfc2V0X2FjY2Vzc19tb2RlKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHVuc2lnbmVkIGFjY2Vzc19tb2RlICkKK3sKKyAgIHAtPmN1cnJlbnQtPmhlYWRlci5hY2Nlc3NfbW9kZSA9IGFjY2Vzc19tb2RlOworfQorCit2b2lkCiticndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2woc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJICAgIGVudW0gYnJ3X2NvbXByZXNzaW9uIGNvbXByZXNzaW9uX2NvbnRyb2wpCit7CisgICBwLT5jb21wcmVzc2VkID0gKGNvbXByZXNzaW9uX2NvbnRyb2wgPT0gQlJXX0NPTVBSRVNTSU9OX0NPTVBSRVNTRUQpOworCisgICBpZiAocC0+YnJ3LT5nZW4gPj0gNikgeworICAgICAgLyogU2luY2Ugd2UgZG9uJ3QgdXNlIHRoZSBTSU1EMzIgc3VwcG9ydCBpbiBnZW42LCB3ZSB0cmFuc2xhdGUKKyAgICAgICAqIHRoZSBwcmUtZ2VuNiBjb21wcmVzc2lvbiBjb250cm9sIGhlcmUuCisgICAgICAgKi8KKyAgICAgIHN3aXRjaCAoY29tcHJlc3Npb25fY29udHJvbCkgeworICAgICAgY2FzZSBCUldfQ09NUFJFU1NJT05fTk9ORToKKwkgLyogVGhpcyBpcyB0aGUgInVzZSB0aGUgZmlyc3Qgc2V0IG9mIGJpdHMgb2YgZG1hc2svdm1hc2svYXJmCisJICAqIGFjY29yZGluZyB0byBleGVjc2l6ZSIgb3B0aW9uLgorCSAgKi8KKwkgcC0+Y3VycmVudC0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBHRU42X0NPTVBSRVNTSU9OXzFROworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX0NPTVBSRVNTSU9OXzJOREhBTEY6CisJIC8qIEZvciBTSU1EOCwgdGhpcyBpcyAidXNlIHRoZSBzZWNvbmQgc2V0IG9mIDggYml0cy4iICovCisJIHAtPmN1cnJlbnQtPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gR0VONl9DT01QUkVTU0lPTl8yUTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19DT01QUkVTU0lPTl9DT01QUkVTU0VEOgorCSAvKiBGb3IgU0lNRDE2IGluc3RydWN0aW9uIGNvbXByZXNzaW9uLCB1c2UgdGhlIGZpcnN0IHNldCBvZiAxNiBiaXRzCisJICAqIHNpbmNlIHdlIGRvbid0IGRvIFNJTUQzMiBkaXNwYXRjaC4KKwkgICovCisJIHAtPmN1cnJlbnQtPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gR0VONl9DT01QUkVTU0lPTl8xSDsKKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworCSBwLT5jdXJyZW50LT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9IEdFTjZfQ09NUFJFU1NJT05fMUg7CisJIGJyZWFrOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIHAtPmN1cnJlbnQtPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gY29tcHJlc3Npb25fY29udHJvbDsKKyAgIH0KK30KKwordm9pZCBicndfc2V0X21hc2tfY29udHJvbCggc3RydWN0IGJyd19jb21waWxlICpwLCB1bnNpZ25lZCB2YWx1ZSApCit7CisgICBwLT5jdXJyZW50LT5oZWFkZXIubWFza19jb250cm9sID0gdmFsdWU7Cit9CisKK3ZvaWQgYnJ3X3NldF9zYXR1cmF0ZSggc3RydWN0IGJyd19jb21waWxlICpwLCBib29sIGVuYWJsZSApCit7CisgICBwLT5jdXJyZW50LT5oZWFkZXIuc2F0dXJhdGUgPSBlbmFibGU7Cit9CisKK3ZvaWQgYnJ3X3NldF9hY2Nfd3JpdGVfY29udHJvbChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHVuc2lnbmVkIHZhbHVlKQoreworICAgaWYgKHAtPmJydy0+Z2VuID49IDYpCisgICAgICBwLT5jdXJyZW50LT5oZWFkZXIuYWNjX3dyX2NvbnRyb2wgPSB2YWx1ZTsKK30KKwordm9pZCBicndfcHVzaF9pbnNuX3N0YXRlKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgKQoreworICAgYXNzZXJ0KHAtPmN1cnJlbnQgIT0gJnAtPnN0YWNrW0JSV19FVV9NQVhfSU5TTl9TVEFDSy0xXSk7CisgICBtZW1jcHkocC0+Y3VycmVudCsxLCBwLT5jdXJyZW50LCBzaXplb2Yoc3RydWN0IGJyd19pbnN0cnVjdGlvbikpOworICAgcC0+Y29tcHJlc3NlZF9zdGFja1twLT5jdXJyZW50IC0gcC0+c3RhY2tdID0gcC0+Y29tcHJlc3NlZDsKKyAgIHAtPmN1cnJlbnQrKzsKK30KKwordm9pZCBicndfcG9wX2luc25fc3RhdGUoIHN0cnVjdCBicndfY29tcGlsZSAqcCApCit7CisgICBhc3NlcnQocC0+Y3VycmVudCAhPSBwLT5zdGFjayk7CisgICBwLT5jdXJyZW50LS07CisgICBwLT5jb21wcmVzc2VkID0gcC0+Y29tcHJlc3NlZF9zdGFja1twLT5jdXJyZW50IC0gcC0+c3RhY2tdOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit2b2lkCiticndfaW5pdF9jb21waWxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHZvaWQgKm1lbV9jdHgpCit7CisgICBtZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisKKyAgIHAtPmJydyA9IGJydzsKKyAgIC8qCisgICAgKiBTZXQgdGhlIGluaXRpYWwgaW5zdHJ1Y3Rpb24gc3RvcmUgYXJyYXkgc2l6ZSB0byAxMDI0LCBpZiBmb3VuZCB0aGF0CisgICAgKiBpc24ndCBlbm91Z2gsIHRoZW4gaXQgd2lsbCBkb3VibGUgdGhlIHN0b3JlIHNpemUgYXQgYnJ3X25leHRfaW5zbigpCisgICAgKiB1bnRpbCBvdXQgb2YgbWVtb3J5LgorICAgICovCisgICBwLT5zdG9yZV9zaXplID0gMTAyNDsKKyAgIHAtPnN0b3JlID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uLCBwLT5zdG9yZV9zaXplKTsKKyAgIHAtPm5yX2luc24gPSAwOworICAgcC0+Y3VycmVudCA9IHAtPnN0YWNrOworICAgcC0+Y29tcHJlc3NlZCA9IGZhbHNlOworICAgbWVtc2V0KHAtPmN1cnJlbnQsIDAsIHNpemVvZihwLT5jdXJyZW50WzBdKSk7CisKKyAgIHAtPm1lbV9jdHggPSBtZW1fY3R4OworCisgICAvKiBTb21lIGRlZmF1bHRzPworICAgICovCisgICBicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19FTkFCTEUpOyAvKiB3aGF0IGRvZXMgdGhpcyBkbz8gKi8KKyAgIGJyd19zZXRfc2F0dXJhdGUocCwgMCk7CisgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbF9mbGFnX3ZhbHVlKHAsIDB4ZmYpOworCisgICAvKiBTZXQgdXAgY29udHJvbCBmbG93IHN0YWNrICovCisgICBwLT5pZl9zdGFja19kZXB0aCA9IDA7CisgICBwLT5pZl9zdGFja19hcnJheV9zaXplID0gMTY7CisgICBwLT5pZl9zdGFjayA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgaW50LCBwLT5pZl9zdGFja19hcnJheV9zaXplKTsKKworICAgcC0+bG9vcF9zdGFja19kZXB0aCA9IDA7CisgICBwLT5sb29wX3N0YWNrX2FycmF5X3NpemUgPSAxNjsKKyAgIHAtPmxvb3Bfc3RhY2sgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgcC0+bG9vcF9zdGFja19hcnJheV9zaXplKTsKKyAgIHAtPmlmX2RlcHRoX2luX2xvb3AgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgcC0+bG9vcF9zdGFja19hcnJheV9zaXplKTsKKworICAgYnJ3X2luaXRfY29tcGFjdGlvbl90YWJsZXMoYnJ3KTsKK30KKworCitjb25zdCB1bnNpZ25lZCAqYnJ3X2dldF9wcm9ncmFtKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCQkgICAgICAgdW5zaWduZWQgKnN6ICkKK3sKKyAgIGJyd19jb21wYWN0X2luc3RydWN0aW9ucyhwKTsKKworICAgKnN6ID0gcC0+bmV4dF9pbnNuX29mZnNldDsKKyAgIHJldHVybiAoY29uc3QgdW5zaWduZWQgKilwLT5zdG9yZTsKK30KKwordm9pZAorYnJ3X2R1bXBfY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIEZJTEUgKm91dCwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICB2b2lkICpzdG9yZSA9IHAtPnN0b3JlOworICAgYm9vbCBkdW1wX2hleCA9IGZhbHNlOworCisgICBmb3IgKGludCBvZmZzZXQgPSBzdGFydDsgb2Zmc2V0IDwgZW5kOykgeworICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IHN0b3JlICsgb2Zmc2V0OworICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiB1bmNvbXBhY3RlZDsKKyAgICAgIGZwcmludGYob3V0LCAiMHglMDh4OiAiLCBvZmZzZXQpOworCisgICAgICBpZiAoaW5zbi0+aGVhZGVyLmNtcHRfY29udHJvbCkgeworCSBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKmNvbXBhY3RlZCA9ICh2b2lkICopaW5zbjsKKwkgaWYgKGR1bXBfaGV4KSB7CisJICAgIGZwcmludGYob3V0LCAiMHglMDh4IDB4JTA4eCAgICAgICAgICAgICAgICAgICAgICAgIiwKKwkJICAgICgodWludDMyX3QgKilpbnNuKVsxXSwKKwkJICAgICgodWludDMyX3QgKilpbnNuKVswXSk7CisJIH0KKworCSBicndfdW5jb21wYWN0X2luc3RydWN0aW9uKGJydywgJnVuY29tcGFjdGVkLCBjb21wYWN0ZWQpOworCSBpbnNuID0gJnVuY29tcGFjdGVkOworCSBvZmZzZXQgKz0gODsKKyAgICAgIH0gZWxzZSB7CisJIGlmIChkdW1wX2hleCkgeworCSAgICBmcHJpbnRmKG91dCwgIjB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAiLAorCQkgICAgKCh1aW50MzJfdCAqKWluc24pWzNdLAorCQkgICAgKCh1aW50MzJfdCAqKWluc24pWzJdLAorCQkgICAgKCh1aW50MzJfdCAqKWluc24pWzFdLAorCQkgICAgKCh1aW50MzJfdCAqKWluc24pWzBdKTsKKwkgfQorCSBvZmZzZXQgKz0gMTY7CisgICAgICB9CisKKyAgICAgIGJyd19kaXNhc20ob3V0LCBpbnNuLCBwLT5icnctPmdlbik7CisgICB9Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2V1LmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2V1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjNjhmZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZXUuaApAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIEludGVsIENvcnAuICAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBJbnRlbCBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8KKyBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgorCisgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qCisgICogQXV0aG9yczoKKyAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHdAdm13YXJlLmNvbT4KKyAgKi8KKworCisjaWZuZGVmIEJSV19FVV9ICisjZGVmaW5lIEJSV19FVV9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSAiYnJ3X3N0cnVjdHMuaCIKKyNpbmNsdWRlICJicndfZGVmaW5lcy5oIgorI2luY2x1ZGUgImJyd19yZWcuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfaW5zdHJ1Y3Rpb24uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEJSV19FVV9NQVhfSU5TTl9TVEFDSyA1CisKK3N0cnVjdCBicndfY29tcGlsZSB7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpzdG9yZTsKKyAgIGludCBzdG9yZV9zaXplOworICAgdW5zaWduZWQgbnJfaW5zbjsKKyAgIHVuc2lnbmVkIGludCBuZXh0X2luc25fb2Zmc2V0OworCisgICB2b2lkICptZW1fY3R4OworCisgICAvKiBBbGxvdyBjbGllbnRzIHRvIHB1c2gvcG9wIGluc3RydWN0aW9uIHN0YXRlOgorICAgICovCisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uIHN0YWNrW0JSV19FVV9NQVhfSU5TTl9TVEFDS107CisgICBib29sIGNvbXByZXNzZWRfc3RhY2tbQlJXX0VVX01BWF9JTlNOX1NUQUNLXTsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmN1cnJlbnQ7CisKKyAgIHVuc2lnbmVkIGZsYWdfdmFsdWU7CisgICBib29sIHNpbmdsZV9wcm9ncmFtX2Zsb3c7CisgICBib29sIGNvbXByZXNzZWQ7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydzsKKworICAgLyogQ29udHJvbCBmbG93IHN0YWNrczoKKyAgICAqIC0gaWZfc3RhY2sgY29udGFpbnMgSUYgYW5kIEVMU0UgaW5zdHJ1Y3Rpb25zIHdoaWNoIG11c3QgYmUgcGF0Y2hlZAorICAgICogICAoYW5kIHBvcHBlZCkgb25jZSB0aGUgbWF0Y2hpbmcgRU5ESUYgaW5zdHJ1Y3Rpb24gaXMgZW5jb3VudGVyZWQuCisgICAgKgorICAgICogICBKdXN0IHN0b3JlIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyKGFuIGluZGV4KS4KKyAgICAqLworICAgaW50ICppZl9zdGFjazsKKyAgIGludCBpZl9zdGFja19kZXB0aDsKKyAgIGludCBpZl9zdGFja19hcnJheV9zaXplOworCisgICAvKioKKyAgICAqIGxvb3Bfc3RhY2sgY29udGFpbnMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXJzIG9mIHRoZSBzdGFydHMgb2YgbG9vcHMgd2hpY2gKKyAgICAqIG11c3QgYmUgcGF0Y2hlZCAoYW5kIHBvcHBlZCkgb25jZSB0aGUgbWF0Y2hpbmcgV0hJTEUgaW5zdHJ1Y3Rpb24gaXMKKyAgICAqIGVuY291bnRlcmVkLgorICAgICovCisgICBpbnQgKmxvb3Bfc3RhY2s7CisgICAvKioKKyAgICAqIHByZS1nZW42LCB0aGUgQlJFQUsgYW5kIENPTlQgaW5zdHJ1Y3Rpb25zIGhhZCB0byB0ZWxsIGhvdyBtYW55IElGL0VORElGCisgICAgKiBibG9ja3MgdGhleSB3ZXJlIHBvcHBpbmcgb3V0IG9mLCB0byBmaXggdXAgdGhlIG1hc2sgc3RhY2suICBUaGlzIHRyYWNrcworICAgICogdGhlIElGL0VORElGIG5lc3RpbmcgaW4gZWFjaCBjdXJyZW50IG5lc3RlZCBsb29wIGxldmVsLgorICAgICovCisgICBpbnQgKmlmX2RlcHRoX2luX2xvb3A7CisgICBpbnQgbG9vcF9zdGFja19kZXB0aDsKKyAgIGludCBsb29wX3N0YWNrX2FycmF5X3NpemU7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmN1cnJlbnRfaW5zbiggc3RydWN0IGJyd19jb21waWxlICpwKQoreworICAgcmV0dXJuICZwLT5zdG9yZVtwLT5ucl9pbnNuXTsKK30KKwordm9pZCBicndfcG9wX2luc25fc3RhdGUoIHN0cnVjdCBicndfY29tcGlsZSAqcCApOwordm9pZCBicndfcHVzaF9pbnNuX3N0YXRlKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAgKTsKK3ZvaWQgYnJ3X3NldF9tYXNrX2NvbnRyb2woIHN0cnVjdCBicndfY29tcGlsZSAqcCwgdW5zaWduZWQgdmFsdWUgKTsKK3ZvaWQgYnJ3X3NldF9zYXR1cmF0ZSggc3RydWN0IGJyd19jb21waWxlICpwLCBib29sIGVuYWJsZSApOwordm9pZCBicndfc2V0X2FjY2Vzc19tb2RlKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHVuc2lnbmVkIGFjY2Vzc19tb2RlICk7Cit2b2lkIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIGVudW0gYnJ3X2NvbXByZXNzaW9uIGMpOwordm9pZCBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sX2ZsYWdfdmFsdWUoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgdW5zaWduZWQgdmFsdWUgKTsKK3ZvaWQgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbCggc3RydWN0IGJyd19jb21waWxlICpwLCB1bnNpZ25lZCBwYyApOwordm9pZCBicndfc2V0X3ByZWRpY2F0ZV9pbnZlcnNlKHN0cnVjdCBicndfY29tcGlsZSAqcCwgYm9vbCBwcmVkaWNhdGVfaW52ZXJzZSk7Cit2b2lkIGJyd19zZXRfY29uZGl0aW9uYWxtb2QoIHN0cnVjdCBicndfY29tcGlsZSAqcCwgdW5zaWduZWQgY29uZGl0aW9uYWwgKTsKK3ZvaWQgYnJ3X3NldF9mbGFnX3JlZyhzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIGludCByZWcsIGludCBzdWJyZWcpOwordm9pZCBicndfc2V0X2FjY193cml0ZV9jb250cm9sKHN0cnVjdCBicndfY29tcGlsZSAqcCwgdW5zaWduZWQgdmFsdWUpOworCit2b2lkIGJyd19pbml0X2NvbXBpbGUoc3RydWN0IGJyd19jb250ZXh0ICosIHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJICAgICAgdm9pZCAqbWVtX2N0eCk7Cit2b2lkIGJyd19kdW1wX2NvbXBpbGUoc3RydWN0IGJyd19jb21waWxlICpwLCBGSUxFICpvdXQsIGludCBzdGFydCwgaW50IGVuZCk7Citjb25zdCB1bnNpZ25lZCAqYnJ3X2dldF9wcm9ncmFtKCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHVuc2lnbmVkICpzeiApOworCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfbmV4dF9pbnNuKHN0cnVjdCBicndfY29tcGlsZSAqcCwgdW5zaWduZWQgb3Bjb2RlKTsKK3ZvaWQgYnJ3X3NldF9kZXN0KHN0cnVjdCBicndfY29tcGlsZSAqcCwgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKwkJICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0KTsKK3ZvaWQgYnJ3X3NldF9zcmMwKHN0cnVjdCBicndfY29tcGlsZSAqcCwgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKwkJICBzdHJ1Y3QgYnJ3X3JlZyByZWcpOworCit2b2lkIGdlbjZfcmVzb2x2ZV9pbXBsaWVkX21vdmUoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJICAgICAgIHN0cnVjdCBicndfcmVnICpzcmMsCisJCQkgICAgICAgdW5zaWduZWQgbXNnX3JlZ19ucik7CisKKy8qIEhlbHBlcnMgZm9yIHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zOgorICovCisjZGVmaW5lIEFMVTEoT1ApCQkJCQlcCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfIyNPUChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCVwKKwkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAkJCVwKKwkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwKTsKKworI2RlZmluZSBBTFUyKE9QKQkJCQkJXAorc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3XyMjT1Aoc3RydWN0IGJyd19jb21waWxlICpwLAlcCisJICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwJCQlcCisJICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwJCQlcCisJICAgICAgc3RydWN0IGJyd19yZWcgc3JjMSk7CisKKyNkZWZpbmUgQUxVMyhPUCkJCQkJCVwKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd18jI09QKHN0cnVjdCBicndfY29tcGlsZSAqcCwJXAorCSAgICAgIHN0cnVjdCBicndfcmVnIGRlc3QsCQkJXAorCSAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCQkJXAorCSAgICAgIHN0cnVjdCBicndfcmVnIHNyYzEsCQkJXAorCSAgICAgIHN0cnVjdCBicndfcmVnIHNyYzIpOworCisjZGVmaW5lIFJPVU5EKE9QKSBcCit2b2lkIGJyd18jI09QKHN0cnVjdCBicndfY29tcGlsZSAqcCwgc3RydWN0IGJyd19yZWcgZGVzdCwgc3RydWN0IGJyd19yZWcgc3JjMCk7CisKK0FMVTEoTU9WKQorQUxVMihTRUwpCitBTFUxKE5PVCkKK0FMVTIoQU5EKQorQUxVMihPUikKK0FMVTIoWE9SKQorQUxVMihTSFIpCitBTFUyKFNITCkKK0FMVTIoQVNSKQorQUxVMShGMzJUTzE2KQorQUxVMShGMTZUTzMyKQorQUxVMihKTVBJKQorQUxVMihBREQpCitBTFUyKEFWRykKK0FMVTIoTVVMKQorQUxVMShGUkMpCitBTFUxKFJOREQpCitBTFUyKE1BQykKK0FMVTIoTUFDSCkKK0FMVTEoTFpEKQorQUxVMihEUDQpCitBTFUyKERQSCkKK0FMVTIoRFAzKQorQUxVMihEUDIpCitBTFUyKExJTkUpCitBTFUyKFBMTikKK0FMVTMoTUFEKQorQUxVMyhMUlApCitBTFUxKEJGUkVWKQorQUxVMyhCRkUpCitBTFUyKEJGSTEpCitBTFUzKEJGSTIpCitBTFUxKEZCSCkKK0FMVTEoRkJMKQorQUxVMShDQklUKQorQUxVMihBRERDKQorQUxVMihTVUJCKQorQUxVMihNQUMpCisKK1JPVU5EKFJORFopCitST1VORChSTkRFKQorCisjdW5kZWYgQUxVMQorI3VuZGVmIEFMVTIKKyN1bmRlZiBBTFUzCisjdW5kZWYgUk9VTkQKKworCisvKiBIZWxwZXJzIGZvciBTRU5EIGluc3RydWN0aW9uOgorICovCit2b2lkIGJyd19zZXRfc2FtcGxlcl9tZXNzYWdlKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGVhZGVyX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpbWRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmV0dXJuX2Zvcm1hdCk7CisKK3ZvaWQgYnJ3X3NldF9kcF9yZWFkX21lc3NhZ2Uoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2luZGV4LAorCQkJICAgICB1bnNpZ25lZCBtc2dfY29udHJvbCwKKwkJCSAgICAgdW5zaWduZWQgbXNnX3R5cGUsCisJCQkgICAgIHVuc2lnbmVkIHRhcmdldF9jYWNoZSwKKwkJCSAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWFkZXJfcHJlc2VudCwKKwkJCSAgICAgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoKTsKKwordm9pZCBicndfc2V0X2RwX3dyaXRlX21lc3NhZ2Uoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQkgICAgICB1bnNpZ25lZCBtc2dfY29udHJvbCwKKwkJCSAgICAgIHVuc2lnbmVkIG1zZ190eXBlLAorCQkJICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKwkJCSAgICAgIGJvb2wgaGVhZGVyX3ByZXNlbnQsCisJCQkgICAgICB1bnNpZ25lZCBsYXN0X3JlbmRlcl90YXJnZXQsCisJCQkgICAgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgsCisJCQkgICAgICB1bnNpZ25lZCBlbmRfb2ZfdGhyZWFkLAorCQkJICAgICAgdW5zaWduZWQgc2VuZF9jb21taXRfbXNnKTsKKwordm9pZCBicndfdXJiX1dSSVRFKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkJICAgdW5zaWduZWQgbXNnX3JlZ19uciwKKwkJICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgICBlbnVtIGJyd191cmJfd3JpdGVfZmxhZ3MgZmxhZ3MsCisJCSAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisJCSAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKwkJICAgdW5zaWduZWQgb2Zmc2V0LAorCQkgICB1bnNpZ25lZCBzd2l6emxlKTsKKwordm9pZCBicndfZmZfc3luYyhzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCSAgIHN0cnVjdCBicndfcmVnIGRlc3QsCisJCSAgIHVuc2lnbmVkIG1zZ19yZWdfbnIsCisJCSAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisJCSAgIGJvb2wgYWxsb2NhdGUsCisJCSAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKwkJICAgYm9vbCBlb3QpOworCit2b2lkIGJyd19zdmJfd3JpdGUoc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRlc3QsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX3JlZ19uciwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgYm9vbCAgIHNlbmRfY29tbWl0X21zZyk7CisKK3ZvaWQgYnJ3X2ZiX1dSSVRFKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJICBpbnQgZGlzcGF0Y2hfd2lkdGgsCisJCSAgIHVuc2lnbmVkIG1zZ19yZWdfbnIsCisJCSAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisJCSAgIHVuc2lnbmVkIG1zZ19jb250cm9sLAorCQkgICB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2luZGV4LAorCQkgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorCQkgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgsCisJCSAgIGJvb2wgZW90LAorCQkgICBib29sIGhlYWRlcl9wcmVzZW50KTsKKwordm9pZCBicndfU0FNUExFKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJc3RydWN0IGJyd19yZWcgZGVzdCwKKwkJdW5zaWduZWQgbXNnX3JlZ19uciwKKwkJc3RydWN0IGJyd19yZWcgc3JjMCwKKwkJdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleCwKKwkJdW5zaWduZWQgc2FtcGxlciwKKwkJdW5zaWduZWQgbXNnX3R5cGUsCisJCXVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKwkJdW5zaWduZWQgbXNnX2xlbmd0aCwKKwkJdW5zaWduZWQgaGVhZGVyX3ByZXNlbnQsCisJCXVuc2lnbmVkIHNpbWRfbW9kZSwKKwkJdW5zaWduZWQgcmV0dXJuX2Zvcm1hdCk7CisKK3ZvaWQgYnJ3X21hdGgoIHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkgICAgICAgdW5zaWduZWQgZnVuY3Rpb24sCisJICAgICAgIHVuc2lnbmVkIG1zZ19yZWdfbnIsCisJICAgICAgIHN0cnVjdCBicndfcmVnIHNyYywKKwkgICAgICAgdW5zaWduZWQgZGF0YV90eXBlLAorCSAgICAgICB1bnNpZ25lZCBwcmVjaXNpb24gKTsKKwordm9pZCBicndfbWF0aDIoc3RydWN0IGJyd19jb21waWxlICpwLAorCSAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCSAgICAgICB1bnNpZ25lZCBmdW5jdGlvbiwKKwkgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKwkgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMSk7CisKK3ZvaWQgYnJ3X293b3JkX2Jsb2NrX3JlYWQoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCQkJICBzdHJ1Y3QgYnJ3X3JlZyBtcmYsCisJCQkgIHVpbnQzMl90IG9mZnNldCwKKwkJCSAgdWludDMyX3QgYmluZF90YWJsZV9pbmRleCk7CisKK3ZvaWQgYnJ3X293b3JkX2Jsb2NrX3JlYWRfc2NyYXRjaChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCQkJICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCQkJCSAgc3RydWN0IGJyd19yZWcgbXJmLAorCQkJCSAgaW50IG51bV9yZWdzLAorCQkJCSAgdW5zaWduZWQgb2Zmc2V0KTsKKwordm9pZCBicndfb3dvcmRfYmxvY2tfd3JpdGVfc2NyYXRjaChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCQkJICAgc3RydWN0IGJyd19yZWcgbXJmLAorCQkJCSAgIGludCBudW1fcmVncywKKwkJCQkgICB1bnNpZ25lZCBvZmZzZXQpOworCit2b2lkIGdlbjdfYmxvY2tfcmVhZF9zY3JhdGNoKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9yZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQpOworCit2b2lkIGJyd19zaGFkZXJfdGltZV9hZGQoc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VyZl9pbmRleCk7CisKKy8qIElmL2Vsc2UvZW5kaWYuICBXb3JrcyBieSBtYW5pcHVsYXRpbmcgdGhlIGV4ZWN1dGlvbiBmbGFncyBvbiBlYWNoCisgKiBjaGFubmVsLgorICovCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfSUYoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJICAgICAgIHVuc2lnbmVkIGV4ZWN1dGVfc2l6ZSk7CitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpnZW42X0lGKHN0cnVjdCBicndfY29tcGlsZSAqcCwgdWludDMyX3QgY29uZGl0aW9uYWwsCisJCQkJc3RydWN0IGJyd19yZWcgc3JjMCwgc3RydWN0IGJyd19yZWcgc3JjMSk7CisKK3ZvaWQgYnJ3X0VMU0Uoc3RydWN0IGJyd19jb21waWxlICpwKTsKK3ZvaWQgYnJ3X0VORElGKHN0cnVjdCBicndfY29tcGlsZSAqcCk7CisKKy8qIERPL1dISUxFIGxvb3BzOgorICovCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfRE8oc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJICAgICAgIHVuc2lnbmVkIGV4ZWN1dGVfc2l6ZSk7CisKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19XSElMRShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApOworCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfQlJFQUsoc3RydWN0IGJyd19jb21waWxlICpwKTsKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19DT05UKHN0cnVjdCBicndfY29tcGlsZSAqcCk7CitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpnZW42X0NPTlQoc3RydWN0IGJyd19jb21waWxlICpwKTsKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmdlbjZfSEFMVChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApOworLyogRm9yd2FyZCBqdW1wczoKKyAqLwordm9pZCBicndfbGFuZF9md2RfanVtcChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIGludCBqbXBfaW5zbl9pZHgpOworCisKKwordm9pZCBicndfTk9QKHN0cnVjdCBicndfY29tcGlsZSAqcCk7CisKK3ZvaWQgYnJ3X1dBSVQoc3RydWN0IGJyd19jb21waWxlICpwKTsKKworLyogU3BlY2lhbCBjYXNlOiB0aGVyZSBpcyBuZXZlciBhIGRlc3RpbmF0aW9uLCBleGVjdXRpb24gc2l6ZSB3aWxsIGJlCisgKiB0YWtlbiBmcm9tIHNyYzA6CisgKi8KK3ZvaWQgYnJ3X0NNUChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCSAgICAgdW5zaWduZWQgY29uZGl0aW9uYWwsCisJICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorCSAgICAgc3RydWN0IGJyd19yZWcgc3JjMSk7CisKK3ZvaWQKK2Jyd191bnR5cGVkX2F0b21pYyhzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBtcmYsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYXRvbWljX29wLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJpbmRfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgpOworCit2b2lkCiticndfdW50eXBlZF9zdXJmYWNlX3JlYWQoc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgbXJmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJpbmRfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgpOworCit2b2lkCiticndfc2NhdHRlcmVkX3dyaXRlKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgbXJmLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBiaW5kX3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBib29sIGhlYWRlcl9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgICBib29sIGluX2R3b3Jkcyk7CisKK3ZvaWQKK2Jyd19zY2F0dGVyZWRfcmVhZChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBtcmYsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZF90YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIGJvb2wgaGVhZGVyX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9kd29yZHMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJyd19ldV91dGlsLmM6CisgKi8KKwordm9pZCBicndfY29weV9pbmRpcmVjdF90b19pbmRpcmVjdChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCQkJICAgc3RydWN0IGJyd19pbmRpcmVjdCBkc3RfcHRyLAorCQkJCSAgIHN0cnVjdCBicndfaW5kaXJlY3Qgc3JjX3B0ciwKKwkJCQkgICB1bnNpZ25lZCBjb3VudCk7CisKK3ZvaWQgYnJ3X2NvcHlfZnJvbV9pbmRpcmVjdChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCQkgICAgc3RydWN0IGJyd19yZWcgZHN0LAorCQkJICAgIHN0cnVjdCBicndfaW5kaXJlY3QgcHRyLAorCQkJICAgIHVuc2lnbmVkIGNvdW50KTsKKwordm9pZCBicndfY29weTQoc3RydWN0IGJyd19jb21waWxlICpwLAorCSAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJICAgICAgIHN0cnVjdCBicndfcmVnIHNyYywKKwkgICAgICAgdW5zaWduZWQgY291bnQpOworCit2b2lkIGJyd19jb3B5OChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkgICAgICAgc3RydWN0IGJyd19yZWcgc3JjLAorCSAgICAgICB1bnNpZ25lZCBjb3VudCk7CisKK3ZvaWQgYnJ3X21hdGhfaW52ZXJ0KCBzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCSAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkJICAgICAgc3RydWN0IGJyd19yZWcgc3JjKTsKKwordm9pZCBicndfc2V0X3NyYzEoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24sCisJCSAgc3RydWN0IGJyd19yZWcgcmVnKTsKKwordm9pZCBicndfc2V0X3VpcF9qaXAoc3RydWN0IGJyd19jb21waWxlICpwKTsKKwordWludDMyX3QgYnJ3X3N3YXBfY21vZCh1aW50MzJfdCBjbW9kKTsKKworLyogYnJ3X2V1X2NvbXBhY3QuYyAqLwordm9pZCBicndfaW5pdF9jb21wYWN0aW9uX3RhYmxlcyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyk7Cit2b2lkIGJyd19jb21wYWN0X2luc3RydWN0aW9ucyhzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApOwordm9pZCBicndfdW5jb21wYWN0X2luc3RydWN0aW9uKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkJICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmRzdCwKKwkJCSAgICAgICBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKnNyYyk7Citib29sIGJyd190cnlfY29tcGFjdF9pbnN0cnVjdGlvbihzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnNyYyk7CisKK3ZvaWQgYnJ3X2RlYnVnX2NvbXBhY3RfdW5jb21wYWN0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkJCSBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpvcmlnLAorCQkJCSBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICp1bmNvbXBhY3RlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ldV9jb21wYWN0LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2V1X2NvbXBhY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjdkYTljCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ldV9jb21wYWN0LmMKQEAgLTAsMCArMSw4MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKiogQGZpbGUgYnJ3X2V1X2NvbXBhY3QuYworICoKKyAqIEluc3RydWN0aW9uIGNvbXBhY3Rpb24gaXMgYSBmZWF0dXJlIG9mIGdtNDUgYW5kIG5ld2VyIGhhcmR3YXJlIHRoYXQgYWxsb3dzCisgKiBmb3IgYSBzbWFsbGVyIGluc3RydWN0aW9uIGVuY29kaW5nLgorICoKKyAqIFRoZSBpbnN0cnVjdGlvbiBjYWNoZSBpcyBvbiB0aGUgb3JkZXIgb2YgMzJLQiwgYW5kIG1hbnkgcHJvZ3JhbXMgZ2VuZXJhdGUKKyAqIGZhciBtb3JlIGluc3RydWN0aW9ucyB0aGFuIHRoYXQuICBUaGUgaW5zdHJ1Y3Rpb24gY2FjaGUgaXMgYnVpbHQgdG8gYmFyZWx5CisgKiBrZWVwIHVwIHdpdGggaW5zdHJ1Y3Rpb24gZGlzcGF0Y2ggYWJhaWxpdHkgaW4gY2FjaGUgaGl0IGNhc2VzIC0tIEwxCisgKiBpbnN0cnVjdGlvbiBjYWNoZSBtaXNzZXMgdGhhdCBzdGlsbCBoaXQgaW4gdGhlIG5leHQgbGV2ZWwgY291bGQgbGltaXQKKyAqIHRocm91Z2hwdXQgYnkgYXJvdW5kIDUwJS4KKyAqCisgKiBUaGUgaWRlYSBvZiBpbnN0cnVjdGlvbiBjb21wYWN0aW9uIGlzIHRoYXQgbW9zdCBpbnN0cnVjdGlvbnMgdXNlIGEgdGlueQorICogc3Vic2V0IG9mIHRoZSBHUFUgZnVuY3Rpb25hbGl0eSwgc28gd2UgY2FuIGVuY29kZSB3aGF0IHdvdWxkIGJlIGEgMTYgYnl0ZQorICogaW5zdHJ1Y3Rpb24gaW4gOCBieXRlcyB1c2luZyBzb21lIGxvb2t1cCB0YWJsZXMgZm9yIHZhcmlvdXMgZmllbGRzLgorICovCisKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd19ldS5oIgorCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRyA6IEFERAorCitzdGF0aWMgY29uc3QgdWludDMyX3QgZ2VuNl9jb250cm9sX2luZGV4X3RhYmxlWzMyXSA9IHsKKyAgIDBiMDAwMDAwMDAwMDAwMDAwMDAsCisgICAwYjAxMDAwMDAwMDAwMDAwMDAwLAorICAgMGIwMDExMDAwMDAwMDAwMDAwMCwKKyAgIDBiMDAwMDAwMDAxMDAwMDAwMDAsCisgICAwYjAwMDEwMDAwMDAwMDAwMDAwLAorICAgMGIwMDAwMTAwMDEwMDAwMDAwMCwKKyAgIDBiMDAwMDAwMDAxMDAwMDAwMTAsCisgICAwYjAwMDAwMDAwMDAwMDAwMDEwLAorICAgMGIwMTAwMDAwMDEwMDAwMDAwMCwKKyAgIDBiMDEwMTAwMDAwMDAwMDAwMDAsCisgICAwYjEwMTEwMDAwMDAwMDAwMDAwLAorICAgMGIwMDEwMDAwMDAwMDAwMDAwMCwKKyAgIDBiMTEwMTAwMDAwMDAwMDAwMDAsCisgICAwYjExMDAwMDAwMDAwMDAwMDAwLAorICAgMGIwMTAwMTAwMDEwMDAwMDAwMCwKKyAgIDBiMDEwMDAwMDAwMDAwMDEwMDAsCisgICAwYjAxMDAwMDAwMDAwMDAwMTAwLAorICAgMGIwMDAwMDAwMDAwMDAwMTAwMCwKKyAgIDBiMDAwMDAwMDAwMDAwMDAxMDAsCisgICAwYjAwMTExMDAwMTAwMDAwMDAwLAorICAgMGIwMDAwMTAwMDEwMDAwMDAxMCwKKyAgIDBiMDAxMTAwMDAxMDAwMDAwMDAsCisgICAwYjAwMTEwMDAwMDAwMDAwMDAxLAorICAgMGIwMDEwMDAwMDAwMDAwMDAwMSwKKyAgIDBiMDAxMTAwMDAwMDAwMDAwMTAsCisgICAwYjAwMTEwMDAwMDAwMDAwMTAxLAorICAgMGIwMDExMDAwMDAwMDAwMTAwMSwKKyAgIDBiMDAxMTAwMDAwMDAwMTAwMDAsCisgICAwYjAwMTEwMDAwMDAwMDAwMDExLAorICAgMGIwMDExMDAwMDAwMDAwMDEwMCwKKyAgIDBiMDAxMTAwMDAxMDAwMDEwMDAsCisgICAwYjAwMTAwMDAwMDAwMDAxMDAxCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgZ2VuNl9kYXRhdHlwZV90YWJsZVszMl0gPSB7CisgICAwYjAwMTAwMTExMDAwMDAwMDAwMCwKKyAgIDBiMDAxMDAwMTEwMDAwMTAwMDAwLAorICAgMGIwMDEwMDExMTAwMDAwMDAwMDEsCisgICAwYjAwMTAwMDAwMDAwMTEwMDAwMCwKKyAgIDBiMDAxMDEwMTEwMTAwMTAxMDAxLAorICAgMGIwMDEwMDAwMDAxMTAxMDExMDEsCisgICAwYjAwMTEwMDAxMTAwMDEwMTEwMCwKKyAgIDBiMDAxMDExMTEwMTEwMTAxMTAxLAorICAgMGIwMDEwMDAwMDAxMTExMDExMDAsCisgICAwYjAwMTAwMDAwMDAwMTEwMDAwMSwKKyAgIDBiMDAxMDAwMTEwMDEwMTAwMTAxLAorICAgMGIwMDEwMDAwMDAwMDEwMDAwMDEsCisgICAwYjAwMTAwMDAwMTAwMDExMDAwMSwKKyAgIDBiMDAxMDAwMDAxMDAwMTAxMDAxLAorICAgMGIwMDEwMDAwMDAwMDAxMDAwMDAsCisgICAwYjAwMTAwMDAwMTAwMDExMDAxMCwKKyAgIDBiMDAxMDEwMDEwMTAwMTAxMDAxLAorICAgMGIwMDEwMTEwMTAwMTAxMDAxMDEsCisgICAwYjAwMTAwMDAwMDExMDEwMDEwMSwKKyAgIDBiMDAxMTAwMDExMDAwMTAxMDAxLAorICAgMGIwMDEwMTEwMTEwMDAxMDExMDAsCisgICAwYjAwMTAxMTAxMDExMDEwMDEwMSwKKyAgIDBiMDAxMDExMTEwMTEwMTAwMTAxLAorICAgMGIwMDExMTEwMTExMTAxMTExMDEsCisgICAwYjAwMTExMTAxMTExMDExMTEwMCwKKyAgIDBiMDAxMTExMDExMTEwMTExMTAxLAorICAgMGIwMDExMTEwMTExMTAwMTExMDEsCisgICAwYjAwMTExMTAxMTExMDExMTExMCwKKyAgIDBiMDAxMDAwMDAwMDAwMTAwMDAxLAorICAgMGIwMDEwMDAwMDAwMDAxMDAwMTAsCisgICAwYjAwMTAwMTExMTExMTAxMTEwMSwKKyAgIDBiMDAxMDAwMDAxMTEwMTExMTEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGdlbjZfc3VicmVnX3RhYmxlWzMyXSA9IHsKKyAgIDBiMDAwMDAwMDAwMDAwMDAwLAorICAgMGIwMDAwMDAwMDAwMDAxMDAsCisgICAwYjAwMDAwMDExMDAwMDAwMCwKKyAgIDBiMTExMDAwMDAwMDAwMDAwLAorICAgMGIwMTExMTAwMDAwMDEwMDAsCisgICAwYjAwMDAxMDAwMDAwMDAwMCwKKyAgIDBiMDAwMDAwMDAwMDEwMDAwLAorICAgMGIwMDAxMTAwMDAwMDExMDAsCisgICAwYjAwMTAwMDAwMDAwMDAwMCwKKyAgIDBiMDAwMDAxMDAwMDAwMDAwLAorICAgMGIwMDAwMDEwMTAwMTAxMDAsCisgICAwYjAwMDAwMDAwMTAxMDExMCwKKyAgIDBiMDEwMDAwMDAwMDAwMDAwLAorICAgMGIxMTAwMDAwMDAwMDAwMDAsCisgICAwYjAwMDEwMDAwMDAwMDAwMCwKKyAgIDBiMDAwMDAwMDEwMDAwMDAwLAorICAgMGIwMDAwMDAwMDAwMDEwMDAsCisgICAwYjEwMDAwMDAwMDAwMDAwMCwKKyAgIDBiMDAwMDAxMDEwMDAwMDAwLAorICAgMGIwMDEwMTAwMDAwMDAwMDAsCisgICAwYjAwMTEwMDAwMDAwMDAwMCwKKyAgIDBiMDAwMDAwMDAxMDEwMTAwLAorICAgMGIxMDExMDEwMTAwMTAxMDAsCisgICAwYjAxMDEwMDAwMDAwMDAwMCwKKyAgIDBiMDAwMDAwMDEwMDAxMTExLAorICAgMGIwMTEwMDAwMDAwMDAwMDAsCisgICAwYjExMTExMDAwMDAwMDAwMCwKKyAgIDBiMTAxMDAwMDAwMDAwMDAwLAorICAgMGIwMDAwMDAwMDAwMDExMTEsCisgICAwYjAwMDEwMDAxMDAwMTExMSwKKyAgIDBiMDAxMDAwMDEwMDAxMTExLAorICAgMGIwMDAxMTAwMDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ2VuNl9zcmNfaW5kZXhfdGFibGVbMzJdID0geworICAgMGIwMDAwMDAwMDAwMDAsCisgICAwYjAxMDExMDAwMTAwMCwKKyAgIDBiMDEwMDAxMTAxMDAwLAorICAgMGIwMDEwMDAxMDEwMDAsCisgICAwYjAxMTAxMDAxMDAwMCwKKyAgIDBiMDAwMTAwMTAwMDAwLAorICAgMGIwMTAwMDExMDExMDAsCisgICAwYjAxMDEwMTExMDAwMCwKKyAgIDBiMDExMDAxMTExMDAwLAorICAgMGIwMDExMDAxMDEwMDAsCisgICAwYjAxMDExMDAwMTEwMCwKKyAgIDBiMDAxMDAwMTAwMDAwLAorICAgMGIwMTAxMTAwMDEwMTAsCisgICAwYjAwMDAwMDAwMDAxMCwKKyAgIDBiMDEwMTAxMDEwMDAwLAorICAgMGIwMTAxMDExMDEwMDAsCisgICAwYjExMTEwMTAwMTEwMCwKKyAgIDBiMTExMTAwMTAxMTAwLAorICAgMGIwMTEwMDExMTAwMDAsCisgICAwYjAxMDExMDAwMTAwMSwKKyAgIDBiMDEwMTAxMDExMDAwLAorICAgMGIwMDExMDEwMDEwMDAsCisgICAwYjAxMDAwMDEwMTEwMCwKKyAgIDBiMDEwMDAwMDAwMDAwLAorICAgMGIwMDExMDExMTAwMDAsCisgICAwYjAwMTEwMDAxMDAwMCwKKyAgIDBiMDAxMTAwMDAwMDAwLAorICAgMGIwMTAwMDExMDEwMTAsCisgICAwYjAwMTEwMTExMTAwMCwKKyAgIDBiMDAwMDAxMTEwMDAwLAorICAgMGIwMDExMDAxMDAwMDAsCisgICAwYjAwMTEwMTAxMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBnZW43X2NvbnRyb2xfaW5kZXhfdGFibGVbMzJdID0geworICAgMGIwMDAwMDAwMDAwMDAwMDAwMDEwLAorICAgMGIwMDAwMTAwMDAwMDAwMDAwMDAwLAorICAgMGIwMDAwMTAwMDAwMDAwMDAwMDAxLAorICAgMGIwMDAwMTAwMDAwMDAwMDAwMDEwLAorICAgMGIwMDAwMTAwMDAwMDAwMDAwMDExLAorICAgMGIwMDAwMTAwMDAwMDAwMDAwMTAwLAorICAgMGIwMDAwMTAwMDAwMDAwMDAwMTAxLAorICAgMGIwMDAwMTAwMDAwMDAwMDAwMTExLAorICAgMGIwMDAwMTAwMDAwMDAwMDAxMDAwLAorICAgMGIwMDAwMTAwMDAwMDAwMDAxMDAxLAorICAgMGIwMDAwMTAwMDAwMDAwMDAxMTAxLAorICAgMGIwMDAwMTEwMDAwMDAwMDAwMDAwLAorICAgMGIwMDAwMTEwMDAwMDAwMDAwMDAxLAorICAgMGIwMDAwMTEwMDAwMDAwMDAwMDEwLAorICAgMGIwMDAwMTEwMDAwMDAwMDAwMDExLAorICAgMGIwMDAwMTEwMDAwMDAwMDAwMTAwLAorICAgMGIwMDAwMTEwMDAwMDAwMDAwMTAxLAorICAgMGIwMDAwMTEwMDAwMDAwMDAwMTExLAorICAgMGIwMDAwMTEwMDAwMDAwMDAxMDAxLAorICAgMGIwMDAwMTEwMDAwMDAwMDAxMTAxLAorICAgMGIwMDAwMTEwMDAwMDAwMDEwMDAwLAorICAgMGIwMDAwMTEwMDAwMTAwMDAwMDAwLAorICAgMGIwMDAxMDAwMDAwMDAwMDAwMDAwLAorICAgMGIwMDAxMDAwMDAwMDAwMDAwMDEwLAorICAgMGIwMDAxMDAwMDAwMDAwMDAwMTAwLAorICAgMGIwMDAxMDAwMDAwMTAwMDAwMDAwLAorICAgMGIwMDEwMTEwMDAwMDAwMDAwMDAwLAorICAgMGIwMDEwMTEwMDAwMDAwMDEwMDAwLAorICAgMGIwMDExMDAwMDAwMDAwMDAwMDAwLAorICAgMGIwMDExMDAwMDAwMTAwMDAwMDAwLAorICAgMGIwMTAxMDAwMDAwMDAwMDAwMDAwLAorICAgMGIwMTAxMDAwMDAwMTAwMDAwMDAwCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgZ2VuN19kYXRhdHlwZV90YWJsZVszMl0gPSB7CisgICAwYjAwMTAwMDAwMDAwMDAwMDAwMSwKKyAgIDBiMDAxMDAwMDAwMDAwMTAwMDAwLAorICAgMGIwMDEwMDAwMDAwMDAxMDAwMDEsCisgICAwYjAwMTAwMDAwMDAwMTEwMDAwMSwKKyAgIDBiMDAxMDAwMDAwMDEwMTExMTAxLAorICAgMGIwMDEwMDAwMDEwMTExMTExMDEsCisgICAwYjAwMTAwMDAwMTExMDEwMDAwMSwKKyAgIDBiMDAxMDAwMDAxMTEwMTAwMTAxLAorICAgMGIwMDEwMDAwMDExMTAxMTExMDEsCisgICAwYjAwMTAwMDAxMDAwMDEwMDAwMSwKKyAgIDBiMDAxMDAwMTEwMDAwMTAwMDAwLAorICAgMGIwMDEwMDAxMTAwMDAxMDAwMDEsCisgICAwYjAwMTAwMTAxMDAxMDEwMDEwMSwKKyAgIDBiMDAxMDAxMTEwMDEwMTAwMTAwLAorICAgMGIwMDEwMDExMTAwMTAxMDAxMDEsCisgICAwYjAwMTExMTAwMTExMDExMTEwMSwKKyAgIDBiMDAxMTExMDExMTEwMDExMTAxLAorICAgMGIwMDExMTEwMTExMTAxMTExMDAsCisgICAwYjAwMTExMTAxMTExMDExMTEwMSwKKyAgIDBiMDAxMTExMTExMTEwMTExMTAwLAorICAgMGIwMDAwMDAwMDEwMDAwMDExMDAsCisgICAwYjAwMTAwMDAwMDAwMDExMTEwMSwKKyAgIDBiMDAxMDAwMDAwMDEwMTAwMTAxLAorICAgMGIwMDEwMDAwMTAwMDAxMDAwMDAsCisgICAwYjAwMTAwMTAxMDAxMDEwMDEwMCwKKyAgIDBiMDAxMDAxMTEwMDEwMDAwMTAwLAorICAgMGIwMDEwMTAwMTAxMDAwMDEwMDEsCisgICAwYjAwMTEwMTExMTExMDExMTEwMSwKKyAgIDBiMDAxMTExMTExMTEwMTExMTAxLAorICAgMGIwMDEwMTExMTAxMTAxMDExMDAsCisgICAwYjAwMTAxMDAxMDEwMDEwMTAwMCwKKyAgIDBiMDAxMDEwMTEwMTAwMTAxMDAwCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ2VuN19zdWJyZWdfdGFibGVbMzJdID0geworICAgMGIwMDAwMDAwMDAwMDAwMDAsCisgICAwYjAwMDAwMDAwMDAwMDAwMSwKKyAgIDBiMDAwMDAwMDAwMDAxMDAwLAorICAgMGIwMDAwMDAwMDAwMDExMTEsCisgICAwYjAwMDAwMDAwMDAxMDAwMCwKKyAgIDBiMDAwMDAwMDEwMDAwMDAwLAorICAgMGIwMDAwMDAxMDAwMDAwMDAsCisgICAwYjAwMDAwMDExMDAwMDAwMCwKKyAgIDBiMDAwMDAxMDAwMDAwMDAwLAorICAgMGIwMDAwMDEwMDAwMTAwMDAsCisgICAwYjAwMDAxMDEwMDAwMDAwMCwKKyAgIDBiMDAxMDAwMDAwMDAwMDAwLAorICAgMGIwMDEwMDAwMDAwMDAwMDEsCisgICAwYjAwMTAwMDAxMDAwMDAwMSwKKyAgIDBiMDAxMDAwMDEwMDAwMDEwLAorICAgMGIwMDEwMDAwMTAwMDAwMTEsCisgICAwYjAwMTAwMDAxMDAwMDEwMCwKKyAgIDBiMDAxMDAwMDEwMDAwMTExLAorICAgMGIwMDEwMDAwMTAwMDEwMDAsCisgICAwYjAwMTAwMDAxMDAwMTExMCwKKyAgIDBiMDAxMDAwMDEwMDAxMTExLAorICAgMGIwMDEwMDAxMTAwMDAwMDAsCisgICAwYjAwMTAwMDExMTEwMTAwMCwKKyAgIDBiMDEwMDAwMDAwMDAwMDAwLAorICAgMGIwMTAwMDAxMTAwMDAwMDAsCisgICAwYjAxMTAwMDAwMDAwMDAwMCwKKyAgIDBiMDExMTEwMDEwMDAwMTExLAorICAgMGIxMDAwMDAwMDAwMDAwMDAsCisgICAwYjEwMTAwMDAwMDAwMDAwMCwKKyAgIDBiMTEwMDAwMDAwMDAwMDAwLAorICAgMGIxMTEwMDAwMDAwMDAwMDAsCisgICAwYjExMTAwMDAwMDAxMTEwMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGdlbjdfc3JjX2luZGV4X3RhYmxlWzMyXSA9IHsKKyAgIDBiMDAwMDAwMDAwMDAwLAorICAgMGIwMDAwMDAwMDAwMTAsCisgICAwYjAwMDAwMDAxMDAwMCwKKyAgIDBiMDAwMDAwMDEwMDEwLAorICAgMGIwMDAwMDAwMTEwMDAsCisgICAwYjAwMDAwMDEwMDAwMCwKKyAgIDBiMDAwMDAwMTAxMDAwLAorICAgMGIwMDAwMDEwMDEwMDAsCisgICAwYjAwMDAwMTAxMDAwMCwKKyAgIDBiMDAwMDAxMTEwMDAwLAorICAgMGIwMDAwMDExMTEwMDAsCisgICAwYjAwMTEwMDAwMDAwMCwKKyAgIDBiMDAxMTAwMDAwMDEwLAorICAgMGIwMDExMDAwMDEwMDAsCisgICAwYjAwMTEwMDAxMDAwMCwKKyAgIDBiMDAxMTAwMDEwMDEwLAorICAgMGIwMDExMDAxMDAwMDAsCisgICAwYjAwMTEwMDEwMTAwMCwKKyAgIDBiMDAxMTAwMTExMDAwLAorICAgMGIwMDExMDEwMDAwMDAsCisgICAwYjAwMTEwMTAwMDAxMCwKKyAgIDBiMDAxMTAxMDAxMDAwLAorICAgMGIwMDExMDEwMTAwMDAsCisgICAwYjAwMTEwMTEwMDAwMCwKKyAgIDBiMDAxMTAxMTAxMDAwLAorICAgMGIwMDExMDExMTAwMDAsCisgICAwYjAwMTEwMTExMDAwMSwKKyAgIDBiMDAxMTAxMTExMDAwLAorICAgMGIwMTAwMDExMDEwMDAsCisgICAwYjAxMDAwMTEwMTAwMSwKKyAgIDBiMDEwMDAxMTAxMDEwLAorICAgMGIwMTAxMTAwMDEwMDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCAqY29udHJvbF9pbmRleF90YWJsZTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCAqZGF0YXR5cGVfdGFibGU7CitzdGF0aWMgY29uc3QgdWludDE2X3QgKnN1YnJlZ190YWJsZTsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCAqc3JjX2luZGV4X3RhYmxlOworCitzdGF0aWMgYm9vbAorc2V0X2NvbnRyb2xfaW5kZXgoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKmRzdCwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnNyYykKK3sKKyAgIHVpbnQzMl90ICpzcmNfdTMyID0gKHVpbnQzMl90ICopc3JjOworICAgdWludDMyX3QgdW5jb21wYWN0ZWQgPSAwOworCisgICB1bmNvbXBhY3RlZCB8PSAoKHNyY191MzJbMF0gPj4gOCkgJiAweGZmZmYpIDw8IDA7CisgICB1bmNvbXBhY3RlZCB8PSAoKHNyY191MzJbMF0gPj4gMzEpICYgMHgxKSA8PCAxNjsKKyAgIC8qIE9uIGdlbjcsIHRoZSBmbGFnIHJlZ2lzdGVyIG51bWJlciBnZXRzIGludGVncmF0ZWQgaW50byB0aGUgY29udHJvbAorICAgICogaW5kZXguCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA+PSA3KQorICAgICAgdW5jb21wYWN0ZWQgfD0gKChzcmNfdTMyWzJdID4+IDI1KSAmIDB4MykgPDwgMTc7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgaWYgKGNvbnRyb2xfaW5kZXhfdGFibGVbaV0gPT0gdW5jb21wYWN0ZWQpIHsKKwkgZHN0LT5kdzAuY29udHJvbF9pbmRleCA9IGk7CisJIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sCitzZXRfZGF0YXR5cGVfaW5kZXgoc3RydWN0IGJyd19jb21wYWN0X2luc3RydWN0aW9uICpkc3QsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqc3JjKQoreworICAgdWludDMyX3QgdW5jb21wYWN0ZWQgPSAwOworCisgICB1bmNvbXBhY3RlZCB8PSBzcmMtPmJpdHMxLnVkICYgMHg3ZmZmOworICAgdW5jb21wYWN0ZWQgfD0gKHNyYy0+Yml0czEudWQgPj4gMjkpIDw8IDE1OworCisgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgIGlmIChkYXRhdHlwZV90YWJsZVtpXSA9PSB1bmNvbXBhY3RlZCkgeworCSBkc3QtPmR3MC5kYXRhX3R5cGVfaW5kZXggPSBpOworCSByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbAorc2V0X3N1YnJlZ19pbmRleChzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKmRzdCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqc3JjKQoreworICAgdWludDE2X3QgdW5jb21wYWN0ZWQgPSAwOworCisgICB1bmNvbXBhY3RlZCB8PSBzcmMtPmJpdHMxLmRhMS5kZXN0X3N1YnJlZ19uciA8PCAwOworICAgdW5jb21wYWN0ZWQgfD0gc3JjLT5iaXRzMi5kYTEuc3JjMF9zdWJyZWdfbnIgPDwgNTsKKyAgIHVuY29tcGFjdGVkIHw9IHNyYy0+Yml0czMuZGExLnNyYzFfc3VicmVnX25yIDw8IDEwOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgIGlmIChzdWJyZWdfdGFibGVbaV0gPT0gdW5jb21wYWN0ZWQpIHsKKwkgZHN0LT5kdzAuc3ViX3JlZ19pbmRleCA9IGk7CisJIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sCitnZXRfc3JjX2luZGV4KHVpbnQxNl90IHVuY29tcGFjdGVkLAorICAgICAgICAgICAgICB1aW50MTZfdCAqY29tcGFjdGVkKQoreworICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICBpZiAoc3JjX2luZGV4X3RhYmxlW2ldID09IHVuY29tcGFjdGVkKSB7CisJICpjb21wYWN0ZWQgPSBpOworCSByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbAorc2V0X3NyYzBfaW5kZXgoc3RydWN0IGJyd19jb21wYWN0X2luc3RydWN0aW9uICpkc3QsCisgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpzcmMpCit7CisgICB1aW50MTZfdCBjb21wYWN0ZWQsIHVuY29tcGFjdGVkID0gMDsKKworICAgdW5jb21wYWN0ZWQgfD0gKHNyYy0+Yml0czIudWQgPj4gMTMpICYgMHhmZmY7CisKKyAgIGlmICghZ2V0X3NyY19pbmRleCh1bmNvbXBhY3RlZCwgJmNvbXBhY3RlZCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGRzdC0+ZHcwLnNyYzBfaW5kZXggPSBjb21wYWN0ZWQgJiAweDM7CisgICBkc3QtPmR3MS5zcmMwX2luZGV4ID0gY29tcGFjdGVkID4+IDI7CisKKyAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAorc2V0X3NyYzFfaW5kZXgoc3RydWN0IGJyd19jb21wYWN0X2luc3RydWN0aW9uICpkc3QsCisgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpzcmMpCit7CisgICB1aW50MTZfdCBjb21wYWN0ZWQsIHVuY29tcGFjdGVkID0gMDsKKworICAgdW5jb21wYWN0ZWQgfD0gKHNyYy0+Yml0czMudWQgPj4gMTMpICYgMHhmZmY7CisKKyAgIGlmICghZ2V0X3NyY19pbmRleCh1bmNvbXBhY3RlZCwgJmNvbXBhY3RlZCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGRzdC0+ZHcxLnNyYzFfaW5kZXggPSBjb21wYWN0ZWQ7CisKKyAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFRyaWVzIHRvIGNvbXBhY3QgaW5zdHJ1Y3Rpb24gc3JjIGludG8gZHN0LgorICoKKyAqIEl0IGRvZXNuJ3QgbW9kaWZ5IGRzdCB1bmxlc3Mgc3JjIGlzIGNvbXBhY3RhYmxlLCB3aGljaCBpcyByZWxpZWQgb24gYnkKKyAqIGJyd19jb21wYWN0X2luc3RydWN0aW9ucygpLgorICovCitib29sCiticndfdHJ5X2NvbXBhY3RfaW5zdHJ1Y3Rpb24oc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfY29tcGFjdF9pbnN0cnVjdGlvbiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnNyYykKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgc3RydWN0IGJyd19jb21wYWN0X2luc3RydWN0aW9uIHRlbXA7CisKKyAgIGlmIChzcmMtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9JRiB8fAorICAgICAgIHNyYy0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UgfHwKKyAgICAgICBzcmMtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9FTkRJRiB8fAorICAgICAgIHNyYy0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0hBTFQgfHwKKyAgICAgICBzcmMtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9ETyB8fAorICAgICAgIHNyYy0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX1dISUxFKSB7CisgICAgICAvKiBGSU5JU0hNRTogVGhlIGZpeHVwIGNvZGUgYmVsb3csIGFuZCBicndfc2V0X3VpcF9qaXAgYW5kIGZyaWVuZHMsIG5lZWRzCisgICAgICAgKiB0byBiZSBhYmxlIHRvIGhhbmRsZSBjb21wYWN0ZWQgZmxvdyBjb250cm9sIGluc3RydWN0aW9ucy4uCisgICAgICAgKi8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgLyogRklOSVNITUU6IGltbWVkaWF0ZXMgKi8KKyAgIGlmIChzcmMtPmJpdHMxLmRhMS5zcmMwX3JlZ19maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgfHwKKyAgICAgICBzcmMtPmJpdHMxLmRhMS5zcmMxX3JlZ19maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIG1lbXNldCgmdGVtcCwgMCwgc2l6ZW9mKHRlbXApKTsKKworICAgdGVtcC5kdzAub3Bjb2RlID0gc3JjLT5oZWFkZXIub3Bjb2RlOworICAgdGVtcC5kdzAuZGVidWdfY29udHJvbCA9IHNyYy0+aGVhZGVyLmRlYnVnX2NvbnRyb2w7CisgICBpZiAoIXNldF9jb250cm9sX2luZGV4KGJydywgJnRlbXAsIHNyYykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICBpZiAoIXNldF9kYXRhdHlwZV9pbmRleCgmdGVtcCwgc3JjKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIGlmICghc2V0X3N1YnJlZ19pbmRleCgmdGVtcCwgc3JjKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIHRlbXAuZHcwLmFjY193cl9jb250cm9sID0gc3JjLT5oZWFkZXIuYWNjX3dyX2NvbnRyb2w7CisgICB0ZW1wLmR3MC5jb25kaXRpb25hbG1vZCA9IHNyYy0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kOworICAgaWYgKGJydy0+Z2VuIDw9IDYpCisgICAgICB0ZW1wLmR3MC5mbGFnX3N1YnJlZ19uciA9IHNyYy0+Yml0czIuZGExLmZsYWdfc3VicmVnX25yOworICAgdGVtcC5kdzAuY21wdF9jdHJsID0gMTsKKyAgIGlmICghc2V0X3NyYzBfaW5kZXgoJnRlbXAsIHNyYykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICBpZiAoIXNldF9zcmMxX2luZGV4KCZ0ZW1wLCBzcmMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgdGVtcC5kdzEuZHN0X3JlZ19uciA9IHNyYy0+Yml0czEuZGExLmRlc3RfcmVnX25yOworICAgdGVtcC5kdzEuc3JjMF9yZWdfbnIgPSBzcmMtPmJpdHMyLmRhMS5zcmMwX3JlZ19ucjsKKyAgIHRlbXAuZHcxLnNyYzFfcmVnX25yID0gc3JjLT5iaXRzMy5kYTEuc3JjMV9yZWdfbnI7CisKKyAgICpkc3QgPSB0ZW1wOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK3NldF91bmNvbXBhY3RlZF9jb250cm9sKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19jb21wYWN0X2luc3RydWN0aW9uICpzcmMpCit7CisgICB1aW50MzJfdCAqZHN0X3UzMiA9ICh1aW50MzJfdCAqKWRzdDsKKyAgIHVpbnQzMl90IHVuY29tcGFjdGVkID0gY29udHJvbF9pbmRleF90YWJsZVtzcmMtPmR3MC5jb250cm9sX2luZGV4XTsKKworICAgZHN0X3UzMlswXSB8PSAoKHVuY29tcGFjdGVkID4+IDApICYgMHhmZmZmKSA8PCA4OworICAgZHN0X3UzMlswXSB8PSAoKHVuY29tcGFjdGVkID4+IDE2KSAmIDB4MSkgPDwgMzE7CisKKyAgIGlmIChicnctPmdlbiA+PSA3KQorICAgICAgZHN0X3UzMlsyXSB8PSAoKHVuY29tcGFjdGVkID4+IDE3KSAmIDB4MykgPDwgMjU7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdW5jb21wYWN0ZWRfZGF0YXR5cGUoc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfY29tcGFjdF9pbnN0cnVjdGlvbiAqc3JjKQoreworICAgdWludDMyX3QgdW5jb21wYWN0ZWQgPSBkYXRhdHlwZV90YWJsZVtzcmMtPmR3MC5kYXRhX3R5cGVfaW5kZXhdOworCisgICBkc3QtPmJpdHMxLnVkICY9IH4oMHg3IDw8IDI5KTsKKyAgIGRzdC0+Yml0czEudWQgfD0gKCh1bmNvbXBhY3RlZCA+PiAxNSkgJiAweDcpIDw8IDI5OworICAgZHN0LT5iaXRzMS51ZCAmPSB+MHg3ZmZmOworICAgZHN0LT5iaXRzMS51ZCB8PSB1bmNvbXBhY3RlZCAmIDB4N2ZmZjsKK30KKworc3RhdGljIHZvaWQKK3NldF91bmNvbXBhY3RlZF9zdWJyZWcoc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKnNyYykKK3sKKyAgIHVpbnQxNl90IHVuY29tcGFjdGVkID0gc3VicmVnX3RhYmxlW3NyYy0+ZHcwLnN1Yl9yZWdfaW5kZXhdOworCisgICBkc3QtPmJpdHMxLmRhMS5kZXN0X3N1YnJlZ19uciA9ICh1bmNvbXBhY3RlZCA+PiAwKSAgJiAweDFmOworICAgZHN0LT5iaXRzMi5kYTEuc3JjMF9zdWJyZWdfbnIgPSAodW5jb21wYWN0ZWQgPj4gNSkgICYgMHgxZjsKKyAgIGRzdC0+Yml0czMuZGExLnNyYzFfc3VicmVnX25yID0gKHVuY29tcGFjdGVkID4+IDEwKSAmIDB4MWY7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdW5jb21wYWN0ZWRfc3JjMChzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKnNyYykKK3sKKyAgIHVpbnQzMl90IGNvbXBhY3RlZCA9IHNyYy0+ZHcwLnNyYzBfaW5kZXggfCBzcmMtPmR3MS5zcmMwX2luZGV4IDw8IDI7CisgICB1aW50MTZfdCB1bmNvbXBhY3RlZCA9IHNyY19pbmRleF90YWJsZVtjb21wYWN0ZWRdOworCisgICBkc3QtPmJpdHMyLnVkIHw9IHVuY29tcGFjdGVkIDw8IDEzOworfQorCitzdGF0aWMgdm9pZAorc2V0X3VuY29tcGFjdGVkX3NyYzEoc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19jb21wYWN0X2luc3RydWN0aW9uICpzcmMpCit7CisgICB1aW50MTZfdCB1bmNvbXBhY3RlZCA9IHNyY19pbmRleF90YWJsZVtzcmMtPmR3MS5zcmMxX2luZGV4XTsKKworICAgZHN0LT5iaXRzMy51ZCB8PSB1bmNvbXBhY3RlZCA8PCAxMzsKK30KKwordm9pZAorYnJ3X3VuY29tcGFjdF9pbnN0cnVjdGlvbihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKnNyYykKK3sKKyAgIG1lbXNldChkc3QsIDAsIHNpemVvZigqZHN0KSk7CisKKyAgIGRzdC0+aGVhZGVyLm9wY29kZSA9IHNyYy0+ZHcwLm9wY29kZTsKKyAgIGRzdC0+aGVhZGVyLmRlYnVnX2NvbnRyb2wgPSBzcmMtPmR3MC5kZWJ1Z19jb250cm9sOworCisgICBzZXRfdW5jb21wYWN0ZWRfY29udHJvbChicncsIGRzdCwgc3JjKTsKKyAgIHNldF91bmNvbXBhY3RlZF9kYXRhdHlwZShkc3QsIHNyYyk7CisgICBzZXRfdW5jb21wYWN0ZWRfc3VicmVnKGRzdCwgc3JjKTsKKyAgIGRzdC0+aGVhZGVyLmFjY193cl9jb250cm9sID0gc3JjLT5kdzAuYWNjX3dyX2NvbnRyb2w7CisgICBkc3QtPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCA9IHNyYy0+ZHcwLmNvbmRpdGlvbmFsbW9kOworICAgaWYgKGJydy0+Z2VuIDw9IDYpCisgICAgICBkc3QtPmJpdHMyLmRhMS5mbGFnX3N1YnJlZ19uciA9IHNyYy0+ZHcwLmZsYWdfc3VicmVnX25yOworICAgc2V0X3VuY29tcGFjdGVkX3NyYzAoZHN0LCBzcmMpOworICAgc2V0X3VuY29tcGFjdGVkX3NyYzEoZHN0LCBzcmMpOworICAgZHN0LT5iaXRzMS5kYTEuZGVzdF9yZWdfbnIgPSBzcmMtPmR3MS5kc3RfcmVnX25yOworICAgZHN0LT5iaXRzMi5kYTEuc3JjMF9yZWdfbnIgPSBzcmMtPmR3MS5zcmMwX3JlZ19ucjsKKyAgIGRzdC0+Yml0czMuZGExLnNyYzFfcmVnX25yID0gc3JjLT5kdzEuc3JjMV9yZWdfbnI7Cit9CisKK3ZvaWQgYnJ3X2RlYnVnX2NvbXBhY3RfdW5jb21wYWN0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnVuY29tcGFjdGVkKQoreworICAgZnByaW50ZihzdGRlcnIsICJJbnN0cnVjdGlvbiBjb21wYWN0L3VuY29tcGFjdCBjaGFuZ2VkIChnZW4lZCk6XG4iLAorICAgICAgICAgICBicnctPmdlbik7CisKKyAgIGZwcmludGYoc3RkZXJyLCAiICBiZWZvcmU6ICIpOworICAgYnJ3X2Rpc2FzbShzdGRlcnIsIG9yaWcsIGJydy0+Z2VuKTsKKworICAgZnByaW50ZihzdGRlcnIsICIgIGFmdGVyOiAgIik7CisgICBicndfZGlzYXNtKHN0ZGVyciwgdW5jb21wYWN0ZWQsIGJydy0+Z2VuKTsKKworICAgdWludDMyX3QgKmJlZm9yZV9iaXRzID0gKHVpbnQzMl90ICopb3JpZzsKKyAgIHVpbnQzMl90ICphZnRlcl9iaXRzID0gKHVpbnQzMl90ICopdW5jb21wYWN0ZWQ7CisgICBmcHJpbnRmKHN0ZGVyciwgIiAgY2hhbmdlZCBiaXRzOlxuIik7CisgICBmb3IgKGludCBpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICB1aW50MzJfdCBiZWZvcmUgPSBiZWZvcmVfYml0c1tpIC8gMzJdICYgKDEgPDwgKGkgJiAzMSkpOworICAgICAgdWludDMyX3QgYWZ0ZXIgPSBhZnRlcl9iaXRzW2kgLyAzMl0gJiAoMSA8PCAoaSAmIDMxKSk7CisKKyAgICAgIGlmIChiZWZvcmUgIT0gYWZ0ZXIpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBiaXQgJWQsICVzIHRvICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICBiZWZvcmUgPyAic2V0IiA6ICJ1bnNldCIsCisgICAgICAgICAgICAgICAgIGFmdGVyID8gInNldCIgOiAidW5zZXQiKTsKKyAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIGludAorY29tcGFjdGVkX2JldHdlZW4oaW50IG9sZF9pcCwgaW50IG9sZF90YXJnZXRfaXAsIGludCAqY29tcGFjdGVkX2NvdW50cykKK3sKKyAgIGludCB0aGlzX2NvbXBhY3RlZF9jb3VudCA9IGNvbXBhY3RlZF9jb3VudHNbb2xkX2lwXTsKKyAgIGludCB0YXJnZXRfY29tcGFjdGVkX2NvdW50ID0gY29tcGFjdGVkX2NvdW50c1tvbGRfdGFyZ2V0X2lwXTsKKyAgIHJldHVybiB0YXJnZXRfY29tcGFjdGVkX2NvdW50IC0gdGhpc19jb21wYWN0ZWRfY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfdWlwX2ppcChzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuLCBpbnQgdGhpc19vbGRfaXAsCisgICAgICAgICAgICAgICBpbnQgKmNvbXBhY3RlZF9jb3VudHMpCit7CisgICBpbnQgdGFyZ2V0X29sZF9pcDsKKworICAgdGFyZ2V0X29sZF9pcCA9IHRoaXNfb2xkX2lwICsgaW5zbi0+Yml0czMuYnJlYWtfY29udC5qaXA7CisgICBpbnNuLT5iaXRzMy5icmVha19jb250LmppcCAtPSBjb21wYWN0ZWRfYmV0d2Vlbih0aGlzX29sZF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9vbGRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWRfY291bnRzKTsKKworICAgdGFyZ2V0X29sZF9pcCA9IHRoaXNfb2xkX2lwICsgaW5zbi0+Yml0czMuYnJlYWtfY29udC51aXA7CisgICBpbnNuLT5iaXRzMy5icmVha19jb250LnVpcCAtPSBjb21wYWN0ZWRfYmV0d2Vlbih0aGlzX29sZF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9vbGRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWRfY291bnRzKTsKK30KKwordm9pZAorYnJ3X2luaXRfY29tcGFjdGlvbl90YWJsZXMoc3RydWN0IGJyd19jb250ZXh0ICpicncpCit7CisgICBhc3NlcnQoZ2VuNl9jb250cm9sX2luZGV4X3RhYmxlW0FSUkFZX1NJWkUoZ2VuNl9jb250cm9sX2luZGV4X3RhYmxlKSAtIDFdICE9IDApOworICAgYXNzZXJ0KGdlbjZfZGF0YXR5cGVfdGFibGVbQVJSQVlfU0laRShnZW42X2RhdGF0eXBlX3RhYmxlKSAtIDFdICE9IDApOworICAgYXNzZXJ0KGdlbjZfc3VicmVnX3RhYmxlW0FSUkFZX1NJWkUoZ2VuNl9zdWJyZWdfdGFibGUpIC0gMV0gIT0gMCk7CisgICBhc3NlcnQoZ2VuNl9zcmNfaW5kZXhfdGFibGVbQVJSQVlfU0laRShnZW42X3NyY19pbmRleF90YWJsZSkgLSAxXSAhPSAwKTsKKyAgIGFzc2VydChnZW43X2NvbnRyb2xfaW5kZXhfdGFibGVbQVJSQVlfU0laRShnZW42X2NvbnRyb2xfaW5kZXhfdGFibGUpIC0gMV0gIT0gMCk7CisgICBhc3NlcnQoZ2VuN19kYXRhdHlwZV90YWJsZVtBUlJBWV9TSVpFKGdlbjZfZGF0YXR5cGVfdGFibGUpIC0gMV0gIT0gMCk7CisgICBhc3NlcnQoZ2VuN19zdWJyZWdfdGFibGVbQVJSQVlfU0laRShnZW42X3N1YnJlZ190YWJsZSkgLSAxXSAhPSAwKTsKKyAgIGFzc2VydChnZW43X3NyY19pbmRleF90YWJsZVtBUlJBWV9TSVpFKGdlbjZfc3JjX2luZGV4X3RhYmxlKSAtIDFdICE9IDApOworCisgICBzd2l0Y2ggKGJydy0+Z2VuKSB7CisgICBjYXNlIDc6CisgICAgICBjb250cm9sX2luZGV4X3RhYmxlID0gZ2VuN19jb250cm9sX2luZGV4X3RhYmxlOworICAgICAgZGF0YXR5cGVfdGFibGUgPSBnZW43X2RhdGF0eXBlX3RhYmxlOworICAgICAgc3VicmVnX3RhYmxlID0gZ2VuN19zdWJyZWdfdGFibGU7CisgICAgICBzcmNfaW5kZXhfdGFibGUgPSBnZW43X3NyY19pbmRleF90YWJsZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSA2OgorICAgICAgY29udHJvbF9pbmRleF90YWJsZSA9IGdlbjZfY29udHJvbF9pbmRleF90YWJsZTsKKyAgICAgIGRhdGF0eXBlX3RhYmxlID0gZ2VuNl9kYXRhdHlwZV90YWJsZTsKKyAgICAgIHN1YnJlZ190YWJsZSA9IGdlbjZfc3VicmVnX3RhYmxlOworICAgICAgc3JjX2luZGV4X3RhYmxlID0gZ2VuNl9zcmNfaW5kZXhfdGFibGU7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgICB9Cit9CisKK3ZvaWQKK2Jyd19jb21wYWN0X2luc3RydWN0aW9ucyhzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHZvaWQgKnN0b3JlID0gcC0+c3RvcmU7CisgICAvKiBGb3IgYW4gaW5zdHJ1Y3Rpb24gYXQgYnl0ZSBvZmZzZXQgOCppIGJlZm9yZSBjb21wYWN0aW9uLCB0aGlzIGlzIHRoZSBudW1iZXIKKyAgICAqIG9mIGNvbXBhY3RlZCBpbnN0cnVjdGlvbnMgdGhhdCBwcmVjZWRlZCBpdC4KKyAgICAqLworICAgaW50IGNvbXBhY3RlZF9jb3VudHNbcC0+bmV4dF9pbnNuX29mZnNldCAvIDhdOworICAgLyogRm9yIGFuIGluc3RydWN0aW9uIGF0IGJ5dGUgb2Zmc2V0IDgqaSBhZnRlciBjb21wYWN0aW9uLCB0aGlzIGlzIHRoZQorICAgICogOC1ieXRlIG9mZnNldCBpdCB3YXMgYXQgYmVmb3JlIGNvbXBhY3Rpb24uCisgICAgKi8KKyAgIGludCBvbGRfaXBbcC0+bmV4dF9pbnNuX29mZnNldCAvIDhdOworCisgICBpZiAoYnJ3LT5nZW4gPCA2KQorICAgICAgcmV0dXJuOworCisgICBpbnQgc3JjX29mZnNldDsKKyAgIGludCBvZmZzZXQgPSAwOworICAgaW50IGNvbXBhY3RlZF9jb3VudCA9IDA7CisgICBmb3IgKHNyY19vZmZzZXQgPSAwOyBzcmNfb2Zmc2V0IDwgcC0+bnJfaW5zbiAqIDE2OykgeworICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqc3JjID0gc3RvcmUgKyBzcmNfb2Zmc2V0OworICAgICAgdm9pZCAqZHN0ID0gc3RvcmUgKyBvZmZzZXQ7CisKKyAgICAgIG9sZF9pcFtvZmZzZXQgLyA4XSA9IHNyY19vZmZzZXQgLyA4OworICAgICAgY29tcGFjdGVkX2NvdW50c1tzcmNfb2Zmc2V0IC8gOF0gPSBjb21wYWN0ZWRfY291bnQ7CisKKyAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gc2F2ZWQgPSAqc3JjOworCisgICAgICBpZiAoIXNyYy0+aGVhZGVyLmNtcHRfY29udHJvbCAmJgorICAgICAgICAgIGJyd190cnlfY29tcGFjdF9pbnN0cnVjdGlvbihwLCBkc3QsIHNyYykpIHsKKyAgICAgICAgIGNvbXBhY3RlZF9jb3VudCsrOworCisgICAgICAgICBpZiAoSU5URUxfREVCVUcpIHsKKyAgICAgICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gdW5jb21wYWN0ZWQ7CisgICAgICAgICAgICBicndfdW5jb21wYWN0X2luc3RydWN0aW9uKGJydywgJnVuY29tcGFjdGVkLCBkc3QpOworICAgICAgICAgICAgaWYgKG1lbWNtcCgmc2F2ZWQsICZ1bmNvbXBhY3RlZCwgc2l6ZW9mKHVuY29tcGFjdGVkKSkpIHsKKyAgICAgICAgICAgICAgIGJyd19kZWJ1Z19jb21wYWN0X3VuY29tcGFjdChicncsICZzYXZlZCwgJnVuY29tcGFjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgb2Zmc2V0ICs9IDg7CisgICAgICAgICBzcmNfb2Zmc2V0ICs9IDE2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGludCBzaXplID0gc3JjLT5oZWFkZXIuY21wdF9jb250cm9sID8gOCA6IDE2OworCisgICAgICAgICAvKiBJdCBhcHBlYXJzIHRoYXQgdGhlIGVuZCBvZiB0aHJlYWQgU0VORCBpbnN0cnVjdGlvbiBuZWVkcyB0byBiZQorICAgICAgICAgICogYWxpZ25lZCwgb3IgdGhlIEdQVSBoYW5ncy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKChzcmMtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9TRU5EIHx8CisgICAgICAgICAgICAgIHNyYy0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX1NFTkRDKSAmJgorICAgICAgICAgICAgIHNyYy0+Yml0czMuZ2VuZXJpYy5lbmRfb2ZfdGhyZWFkICYmCisgICAgICAgICAgICAgKG9mZnNldCAmIDgpICE9IDApIHsKKyAgICAgICAgICAgIHN0cnVjdCBicndfY29tcGFjdF9pbnN0cnVjdGlvbiAqYWxpZ24gPSBzdG9yZSArIG9mZnNldDsKKyAgICAgICAgICAgIG1lbXNldChhbGlnbiwgMCwgc2l6ZW9mKCphbGlnbikpOworICAgICAgICAgICAgYWxpZ24tPmR3MC5vcGNvZGUgPSBCUldfT1BDT0RFX05PUDsKKyAgICAgICAgICAgIGFsaWduLT5kdzAuY21wdF9jdHJsID0gMTsKKyAgICAgICAgICAgIG9mZnNldCArPSA4OworICAgICAgICAgICAgb2xkX2lwW29mZnNldCAvIDhdID0gc3JjX29mZnNldCAvIDg7CisgICAgICAgICAgICBkc3QgPSBzdG9yZSArIG9mZnNldDsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogSWYgd2UgZGlkbid0IGNvbXBhY3QgdGhpcyBpbnN0cnVjdGlvbiwgd2UgbmVlZCB0byBtb3ZlIGl0IGRvd24gaW50bworICAgICAgICAgICogcGxhY2UuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChvZmZzZXQgIT0gc3JjX29mZnNldCkgeworICAgICAgICAgICAgbWVtbW92ZShkc3QsIHNyYywgc2l6ZSk7CisgICAgICAgICB9CisgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgIHNyY19vZmZzZXQgKz0gc2l6ZTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogRml4IHVwIGNvbnRyb2wgZmxvdyBvZmZzZXRzLiAqLworICAgcC0+bmV4dF9pbnNuX29mZnNldCA9IG9mZnNldDsKKyAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcC0+bmV4dF9pbnNuX29mZnNldDspIHsKKyAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBzdG9yZSArIG9mZnNldDsKKyAgICAgIGludCB0aGlzX29sZF9pcCA9IG9sZF9pcFtvZmZzZXQgLyA4XTsKKyAgICAgIGludCB0aGlzX2NvbXBhY3RlZF9jb3VudCA9IGNvbXBhY3RlZF9jb3VudHNbdGhpc19vbGRfaXBdOworICAgICAgaW50IHRhcmdldF9vbGRfaXAsIHRhcmdldF9jb21wYWN0ZWRfY291bnQ7CisKKyAgICAgIHN3aXRjaCAoaW5zbi0+aGVhZGVyLm9wY29kZSkgeworICAgICAgY2FzZSBCUldfT1BDT0RFX0JSRUFLOgorICAgICAgY2FzZSBCUldfT1BDT0RFX0NPTlRJTlVFOgorICAgICAgY2FzZSBCUldfT1BDT0RFX0hBTFQ6CisgICAgICAgICB1cGRhdGVfdWlwX2ppcChpbnNuLCB0aGlzX29sZF9pcCwgY29tcGFjdGVkX2NvdW50cyk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0lGOgorICAgICAgY2FzZSBCUldfT1BDT0RFX0VMU0U6CisgICAgICBjYXNlIEJSV19PUENPREVfRU5ESUY6CisgICAgICBjYXNlIEJSV19PUENPREVfV0hJTEU6CisgICAgICAgICBpZiAoYnJ3LT5nZW4gPT0gNikgeworICAgICAgICAgICAgdGFyZ2V0X29sZF9pcCA9IHRoaXNfb2xkX2lwICsgaW5zbi0+Yml0czEuYnJhbmNoX2dlbjYuanVtcF9jb3VudDsKKyAgICAgICAgICAgIHRhcmdldF9jb21wYWN0ZWRfY291bnQgPSBjb21wYWN0ZWRfY291bnRzW3RhcmdldF9vbGRfaXBdOworICAgICAgICAgICAgaW5zbi0+Yml0czEuYnJhbmNoX2dlbjYuanVtcF9jb3VudCAtPSAodGFyZ2V0X2NvbXBhY3RlZF9jb3VudCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbXBhY3RlZF9jb3VudCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBkYXRlX3VpcF9qaXAoaW5zbiwgdGhpc19vbGRfaXAsIGNvbXBhY3RlZF9jb3VudHMpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChpbnNuLT5oZWFkZXIuY21wdF9jb250cm9sKSB7CisgICAgICAgICBvZmZzZXQgKz0gODsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBvZmZzZXQgKz0gMTY7CisgICAgICB9CisgICB9CisKKyAgIC8qIHAtPm5yX2luc24gaXMgY291bnRpbmcgdGhlIG51bWJlciBvZiB1bmNvbXBhY3RlZCBpbnN0cnVjdGlvbnMgc3RpbGwsIHNvCisgICAgKiBkaXZpZGUuICBXZSBkbyB3YW50IHRvIGJlIHN1cmUgdGhlcmUncyBhIHZhbGlkIGluc3RydWN0aW9uIGluIGFueQorICAgICogYWxpZ25tZW50IHBhZGRpbmcsIHNvIHRoYXQgdGhlIG5leHQgY29tcHJlc3Npb24gcGFzcyAoZm9yIHRoZSBGUyA4LzE2CisgICAgKiBjb21waWxlIHBhc3NlcykgcGFyc2VzIGNvcnJlY3RseS4KKyAgICAqLworICAgaWYgKHAtPm5leHRfaW5zbl9vZmZzZXQgJiA4KSB7CisgICAgICBzdHJ1Y3QgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb24gKmFsaWduID0gc3RvcmUgKyBvZmZzZXQ7CisgICAgICBtZW1zZXQoYWxpZ24sIDAsIHNpemVvZigqYWxpZ24pKTsKKyAgICAgIGFsaWduLT5kdzAub3Bjb2RlID0gQlJXX09QQ09ERV9OT1A7CisgICAgICBhbGlnbi0+ZHcwLmNtcHRfY3RybCA9IDE7CisgICAgICBwLT5uZXh0X2luc25fb2Zmc2V0ICs9IDg7CisgICB9CisgICBwLT5ucl9pbnNuID0gcC0+bmV4dF9pbnNuX29mZnNldCAvIDE2OworCisgICBpZiAoMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJkdW1waW5nIGNvbXBhY3RlZCBwcm9ncmFtXG4iKTsKKyAgICAgIGJyd19kdW1wX2NvbXBpbGUocCwgc3RkZXJyLCAwLCBwLT5uZXh0X2luc25fb2Zmc2V0KTsKKworICAgICAgaW50IGNtcCA9IDA7CisgICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHAtPm5leHRfaW5zbl9vZmZzZXQ7KSB7CisgICAgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gc3RvcmUgKyBvZmZzZXQ7CisKKyAgICAgICAgIGlmIChpbnNuLT5oZWFkZXIuY21wdF9jb250cm9sKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gODsKKyAgICAgICAgICAgIGNtcCsrOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJWRiLyVkYiBzYXZlZCAoJWQlJSlcbiIsIGNtcCAqIDgsIG9mZnNldCArIGNtcCAqIDgsCisgICAgICAgICAgICAgIGNtcCAqIDggKiAxMDAgLyAob2Zmc2V0ICsgY21wICogOCkpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ldV9lbWl0LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2V1X2VtaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWI1NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19ldV9lbWl0LmMKQEAgLTAsMCArMSwyODUzIEBACisvKgorIENvcHlyaWdodCAoQykgSW50ZWwgQ29ycC4gIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIEludGVsIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0bworIGRldmVsb3AgdGhpcyAzRCBkcml2ZXIuCisKKyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoKKyAgKiBBdXRob3JzOgorICAqICAgS2VpdGggV2hpdHdlbGwgPGtlaXRod0B2bXdhcmUuY29tPgorICAqLworCisKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd19kZWZpbmVzLmgiCisjaW5jbHVkZSAiYnJ3X2V1LmgiCisKKyNpbmNsdWRlICJnbHNsL3JhbGxvYy5oIgorCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRyA6IEFERAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVybmFsIGhlbHBlciBmb3IgY29uc3RydWN0aW5nIGluc3RydWN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGd1ZXNzX2V4ZWN1dGlvbl9zaXplKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCQkgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKwkJCQkgc3RydWN0IGJyd19yZWcgcmVnKQoreworICAgaWYgKHJlZy53aWR0aCA9PSBCUldfV0lEVEhfOCAmJiBwLT5jb21wcmVzc2VkKQorICAgICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gQlJXX0VYRUNVVEVfMTY7CisgICBlbHNlCisgICAgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSByZWcud2lkdGg7CS8qIG5vdGUgLSBkZWZpbml0aW9ucyBhcmUgY29tcGF0aWJsZSAqLworfQorCisKKy8qKgorICogUHJpb3IgdG8gU2FuZHlicmlkZ2UsIHRoZSBTRU5EIGluc3RydWN0aW9uIGFjY2VwdGVkIG5vbi1NUkYgc291cmNlCisgKiByZWdpc3RlcnMsIGltcGxpY2l0bHkgbW92aW5nIHRoZSBvcGVyYW5kIHRvIGEgbWVzc2FnZSByZWdpc3Rlci4KKyAqCisgKiBPbiBTYW5keWJyaWRnZSwgdGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZQorICogZXhwbGljaXQgbW92ZTsgaXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZW1pdHRpbmcgYSBTRU5EIGluc3RydWN0aW9uLgorICovCit2b2lkCitnZW42X3Jlc29sdmVfaW1wbGllZF9tb3ZlKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCSAgc3RydWN0IGJyd19yZWcgKnNyYywKKwkJCSAgdW5zaWduZWQgbXNnX3JlZ19ucikKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgaWYgKGJydy0+Z2VuIDwgNikKKyAgICAgIHJldHVybjsKKworICAgaWYgKHNyYy0+ZmlsZSA9PSBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFKQorICAgICAgcmV0dXJuOworCisgICBpZiAoc3JjLT5maWxlICE9IEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSB8fCBzcmMtPm5yICE9IEJSV19BUkZfTlVMTCkgeworICAgICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgICAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgICAgIGJyd19NT1YocCwgcmV0eXBlKGJyd19tZXNzYWdlX3JlZyhtc2dfcmVnX25yKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLAorCSAgICAgIHJldHlwZSgqc3JjLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworICAgfQorICAgKnNyYyA9IGJyd19tZXNzYWdlX3JlZyhtc2dfcmVnX25yKTsKK30KKworc3RhdGljIHZvaWQKK2dlbjdfY29udmVydF9tcmZfdG9fZ3JmKHN0cnVjdCBicndfY29tcGlsZSAqcCwgc3RydWN0IGJyd19yZWcgKnJlZykKK3sKKyAgIC8qIEZyb20gdGhlIEl2eWJyaWRnZSBQUk0sIFZvbHVtZSA0IFBhcnQgMywgcGFnZSAyMTggKCJzZW5kIik6CisgICAgKiAiVGhlIHNlbmQgd2l0aCBFT1Qgc2hvdWxkIHVzZSByZWdpc3RlciBzcGFjZSBSMTEyLVIxMjcgZm9yIDxzcmM+LiBUaGlzIGlzCisgICAgKiAgdG8gZW5hYmxlIGxvYWRpbmcgb2YgYSBuZXcgdGhyZWFkIGludG8gdGhlIHNhbWUgc2xvdCB3aGlsZSB0aGUgbWVzc2FnZQorICAgICogIHdpdGggRU9UIGZvciBjdXJyZW50IHRocmVhZCBpcyBwZW5kaW5nIGRpc3BhdGNoLiIKKyAgICAqCisgICAgKiBTaW5jZSB3ZSdyZSBwcmV0ZW5kaW5nIHRvIGhhdmUgMTYgTVJGcyBhbnl3YXksIHdlIG1heSBhcyB3ZWxsIHVzZSB0aGUKKyAgICAqIHJlZ2lzdGVycyByZXF1aXJlZCBmb3IgbWVzc2FnZXMgd2l0aCBFT1QuCisgICAgKi8KKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgaWYgKGJydy0+Z2VuID09IDcgJiYgcmVnLT5maWxlID09IEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUpIHsKKyAgICAgIHJlZy0+ZmlsZSA9IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEU7CisgICAgICByZWctPm5yICs9IEdFTjdfTVJGX0hBQ0tfU1RBUlQ7CisgICB9Cit9CisKKy8qKgorICogQ29udmVydCBhIGJyd19yZWdfdHlwZSBlbnVtZXJhdGlvbiB2YWx1ZSBpbnRvIHRoZSBoYXJkd2FyZSByZXByZXNlbnRhdGlvbi4KKyAqCisgKiBUaGUgaGFyZHdhcmUgZW5jb2RpbmcgbWF5IGRlcGVuZCBvbiB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhbiBpbW1lZGlhdGUuCisgKi8KK3Vuc2lnbmVkCiticndfcmVnX3R5cGVfdG9faHdfdHlwZShjb25zdCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gYnJ3X3JlZ190eXBlIHR5cGUsIHVuc2lnbmVkIGZpbGUpCit7CisgICBpZiAoZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFKSB7CisgICAgICBzdGF0aWMgY29uc3QgaW50IGltbV9od190eXBlc1tdID0geworICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1VEXSA9IEJSV19IV19SRUdfVFlQRV9VRCwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9EXSAgPSBCUldfSFdfUkVHX1RZUEVfRCwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9VV10gPSBCUldfSFdfUkVHX1RZUEVfVVcsCisgICAgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfV10gID0gQlJXX0hXX1JFR19UWVBFX1csCisgICAgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfRl0gID0gQlJXX0hXX1JFR19UWVBFX0YsCisgICAgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVUJdID0gLTEsCisgICAgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfQl0gID0gLTEsCisgICAgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVVZdID0gQlJXX0hXX1JFR19JTU1fVFlQRV9VViwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9WRl0gPSBCUldfSFdfUkVHX0lNTV9UWVBFX1ZGLAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1ZdICA9IEJSV19IV19SRUdfSU1NX1RZUEVfViwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9ERl0gPSBHRU44X0hXX1JFR19JTU1fVFlQRV9ERiwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9IRl0gPSBHRU44X0hXX1JFR19JTU1fVFlQRV9IRiwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9VUV0gPSBHRU44X0hXX1JFR19UWVBFX1VRLAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1FdICA9IEdFTjhfSFdfUkVHX1RZUEVfUSwKKyAgICAgIH07CisgICAgICBhc3NlcnQodHlwZSA8IEFSUkFZX1NJWkUoaW1tX2h3X3R5cGVzKSk7CisgICAgICBhc3NlcnQoaW1tX2h3X3R5cGVzW3R5cGVdICE9IC0xKTsKKyAgICAgIGFzc2VydChicnctPmdlbiA+PSA4IHx8IHR5cGUgPCBCUldfUkVHSVNURVJfVFlQRV9ERik7CisgICAgICByZXR1cm4gaW1tX2h3X3R5cGVzW3R5cGVdOworICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vbi1pbW1lZGlhdGUgcmVnaXN0ZXJzICovCisgICAgICBzdGF0aWMgY29uc3QgaW50IGh3X3R5cGVzW10gPSB7CisgICAgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVURdID0gQlJXX0hXX1JFR19UWVBFX1VELAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX0RdICA9IEJSV19IV19SRUdfVFlQRV9ELAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1VXXSA9IEJSV19IV19SRUdfVFlQRV9VVywKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9XXSAgPSBCUldfSFdfUkVHX1RZUEVfVywKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9VQl0gPSBCUldfSFdfUkVHX05PTl9JTU1fVFlQRV9VQiwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9CXSAgPSBCUldfSFdfUkVHX05PTl9JTU1fVFlQRV9CLAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX0ZdICA9IEJSV19IV19SRUdfVFlQRV9GLAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1VWXSA9IC0xLAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1ZGXSA9IC0xLAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX1ZdICA9IC0xLAorICAgICAgICAgW0JSV19SRUdJU1RFUl9UWVBFX0RGXSA9IEdFTjdfSFdfUkVHX05PTl9JTU1fVFlQRV9ERiwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9IRl0gPSBHRU44X0hXX1JFR19OT05fSU1NX1RZUEVfSEYsCisgICAgICAgICBbQlJXX1JFR0lTVEVSX1RZUEVfVVFdID0gR0VOOF9IV19SRUdfVFlQRV9VUSwKKyAgICAgICAgIFtCUldfUkVHSVNURVJfVFlQRV9RXSAgPSBHRU44X0hXX1JFR19UWVBFX1EsCisgICAgICB9OworICAgICAgYXNzZXJ0KHR5cGUgPCBBUlJBWV9TSVpFKGh3X3R5cGVzKSk7CisgICAgICBhc3NlcnQoaHdfdHlwZXNbdHlwZV0gIT0gLTEpOworICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcgfHwgdHlwZSA8IEJSV19SRUdJU1RFUl9UWVBFX0RGKTsKKyAgICAgIGFzc2VydChicnctPmdlbiA+PSA4IHx8IHR5cGUgPCBCUldfUkVHSVNURVJfVFlQRV9IRik7CisgICAgICByZXR1cm4gaHdfdHlwZXNbdHlwZV07CisgICB9Cit9CisKK3ZvaWQKK2Jyd19zZXRfZGVzdChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24sCisJICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0KQoreworICAgaWYgKGRlc3QuZmlsZSAhPSBCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUgJiYKKyAgICAgICBkZXN0LmZpbGUgIT0gQlJXX01FU1NBR0VfUkVHSVNURVJfRklMRSkKKyAgICAgIGFzc2VydChkZXN0Lm5yIDwgMTI4KTsKKworICAgZ2VuN19jb252ZXJ0X21yZl90b19ncmYocCwgJmRlc3QpOworCisgICBpbnNuLT5iaXRzMS5kYTEuZGVzdF9yZWdfZmlsZSA9IGRlc3QuZmlsZTsKKyAgIGluc24tPmJpdHMxLmRhMS5kZXN0X3JlZ190eXBlID0KKyAgICAgIGJyd19yZWdfdHlwZV90b19od190eXBlKHAtPmJydywgZGVzdC50eXBlLCBkZXN0LmZpbGUpOworICAgaW5zbi0+Yml0czEuZGExLmRlc3RfYWRkcmVzc19tb2RlID0gZGVzdC5hZGRyZXNzX21vZGU7CisKKyAgIGlmIChkZXN0LmFkZHJlc3NfbW9kZSA9PSBCUldfQUREUkVTU19ESVJFQ1QpIHsKKyAgICAgIGluc24tPmJpdHMxLmRhMS5kZXN0X3JlZ19uciA9IGRlc3QubnI7CisKKyAgICAgIGlmIChpbnNuLT5oZWFkZXIuYWNjZXNzX21vZGUgPT0gQlJXX0FMSUdOXzEpIHsKKwkgaW5zbi0+Yml0czEuZGExLmRlc3Rfc3VicmVnX25yID0gZGVzdC5zdWJucjsKKwkgaWYgKGRlc3QuaHN0cmlkZSA9PSBCUldfSE9SSVpPTlRBTF9TVFJJREVfMCkKKwkgICAgZGVzdC5oc3RyaWRlID0gQlJXX0hPUklaT05UQUxfU1RSSURFXzE7CisJIGluc24tPmJpdHMxLmRhMS5kZXN0X2hvcml6X3N0cmlkZSA9IGRlc3QuaHN0cmlkZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCSBpbnNuLT5iaXRzMS5kYTE2LmRlc3Rfc3VicmVnX25yID0gZGVzdC5zdWJuciAvIDE2OworCSBpbnNuLT5iaXRzMS5kYTE2LmRlc3Rfd3JpdGVtYXNrID0gZGVzdC5kdzEuYml0cy53cml0ZW1hc2s7CisgICAgICAgICBpZiAoZGVzdC5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUgfHwKKyAgICAgICAgICAgICBkZXN0LmZpbGUgPT0gQlJXX01FU1NBR0VfUkVHSVNURVJfRklMRSkgeworICAgICAgICAgICAgYXNzZXJ0KGRlc3QuZHcxLmJpdHMud3JpdGVtYXNrICE9IDApOworICAgICAgICAgfQorCSAvKiBGcm9tIHRoZSBJdnlicmlkZ2UgUFJNLCBWb2wgNCwgUGFydCAzLCBTZWN0aW9uIDUuMi40LjE6CisJICAqICAgIEFsdGhvdWdoIERzdC5Ib3J6U3RyaWRlIGlzIGEgZG9uJ3QgY2FyZSBmb3IgQWxpZ24xNiwgSFcgbmVlZHMKKwkgICogICAgdGhpcyB0byBiZSBwcm9ncmFtbWVkIGFzICIwMSIuCisJICAqLworCSBpbnNuLT5iaXRzMS5kYTE2LmRlc3RfaG9yaXpfc3RyaWRlID0gMTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgeworICAgICAgaW5zbi0+Yml0czEuaWExLmRlc3Rfc3VicmVnX25yID0gZGVzdC5zdWJucjsKKworICAgICAgLyogVGhlc2UgYXJlIGRpZmZlcmVudCBzaXplcyBpbiBhbGlnbjEgdnMgYWxpZ24xNjoKKyAgICAgICAqLworICAgICAgaWYgKGluc24tPmhlYWRlci5hY2Nlc3NfbW9kZSA9PSBCUldfQUxJR05fMSkgeworCSBpbnNuLT5iaXRzMS5pYTEuZGVzdF9pbmRpcmVjdF9vZmZzZXQgPSBkZXN0LmR3MS5iaXRzLmluZGlyZWN0X29mZnNldDsKKwkgaWYgKGRlc3QuaHN0cmlkZSA9PSBCUldfSE9SSVpPTlRBTF9TVFJJREVfMCkKKwkgICAgZGVzdC5oc3RyaWRlID0gQlJXX0hPUklaT05UQUxfU1RSSURFXzE7CisJIGluc24tPmJpdHMxLmlhMS5kZXN0X2hvcml6X3N0cmlkZSA9IGRlc3QuaHN0cmlkZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCSBpbnNuLT5iaXRzMS5pYTE2LmRlc3RfaW5kaXJlY3Rfb2Zmc2V0ID0gZGVzdC5kdzEuYml0cy5pbmRpcmVjdF9vZmZzZXQ7CisJIC8qIGV2ZW4gaWdub3JlZCBpbiBkYTE2LCBzdGlsbCBuZWVkIHRvIHNldCBhcyAnMDEnICovCisJIGluc24tPmJpdHMxLmlhMTYuZGVzdF9ob3Jpel9zdHJpZGUgPSAxOworICAgICAgfQorICAgfQorCisgICAvKiBORVc6IFNldCB0aGUgZXhlY3V0aW9uIHNpemUgYmFzZWQgb24gZGVzdC53aWR0aCBhbmQKKyAgICAqIGluc24tPmNvbXByZXNzaW9uX2NvbnRyb2w6CisgICAgKi8KKyAgIGd1ZXNzX2V4ZWN1dGlvbl9zaXplKHAsIGluc24sIGRlc3QpOworfQorCitleHRlcm4gaW50IHJlZ190eXBlX3NpemVbXTsKKworc3RhdGljIHZvaWQKK3ZhbGlkYXRlX3JlZyhzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuLCBzdHJ1Y3QgYnJ3X3JlZyByZWcpCit7CisgICBpbnQgaHN0cmlkZV9mb3JfcmVnW10gPSB7MCwgMSwgMiwgNH07CisgICBpbnQgdnN0cmlkZV9mb3JfcmVnW10gPSB7MCwgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4LCAyNTZ9OworICAgaW50IHdpZHRoX2Zvcl9yZWdbXSA9IHsxLCAyLCA0LCA4LCAxNn07CisgICBpbnQgZXhlY3NpemVfZm9yX3JlZ1tdID0gezEsIDIsIDQsIDgsIDE2fTsKKyAgIGludCB3aWR0aCwgaHN0cmlkZSwgdnN0cmlkZSwgZXhlY3NpemU7CisKKyAgIGlmIChyZWcuZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFKSB7CisgICAgICAvKiAzLjMuNjogUmVnaW9uIFBhcmFtZXRlcnMuICBSZXN0cmljdGlvbjogSW1tZWRpYXRlIHZlY3RvcnMKKyAgICAgICAqIG1lYW4gdGhlIGRlc3RpbmF0aW9uIGhhcyB0byBiZSAxMjgtYml0IGFsaWduZWQgYW5kIHRoZQorICAgICAgICogZGVzdGluYXRpb24gaG9yaXogc3RyaWRlIGhhcyB0byBiZSBhIHdvcmQuCisgICAgICAgKi8KKyAgICAgIGlmIChyZWcudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9WKSB7CisJIGFzc2VydChoc3RyaWRlX2Zvcl9yZWdbaW5zbi0+Yml0czEuZGExLmRlc3RfaG9yaXpfc3RyaWRlXSAqCisJCXJlZ190eXBlX3NpemVbaW5zbi0+Yml0czEuZGExLmRlc3RfcmVnX3R5cGVdID09IDIpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChyZWcuZmlsZSA9PSBCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUgJiYKKyAgICAgICByZWcuZmlsZSA9PSBCUldfQVJGX05VTEwpCisgICAgICByZXR1cm47CisKKyAgIGFzc2VydChyZWcuaHN0cmlkZSA+PSAwICYmIHJlZy5oc3RyaWRlIDwgRWxlbWVudHMoaHN0cmlkZV9mb3JfcmVnKSk7CisgICBoc3RyaWRlID0gaHN0cmlkZV9mb3JfcmVnW3JlZy5oc3RyaWRlXTsKKworICAgaWYgKHJlZy52c3RyaWRlID09IDB4ZikgeworICAgICAgdnN0cmlkZSA9IC0xOworICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChyZWcudnN0cmlkZSA+PSAwICYmIHJlZy52c3RyaWRlIDwgRWxlbWVudHModnN0cmlkZV9mb3JfcmVnKSk7CisgICAgICB2c3RyaWRlID0gdnN0cmlkZV9mb3JfcmVnW3JlZy52c3RyaWRlXTsKKyAgIH0KKworICAgYXNzZXJ0KHJlZy53aWR0aCA+PSAwICYmIHJlZy53aWR0aCA8IEVsZW1lbnRzKHdpZHRoX2Zvcl9yZWcpKTsKKyAgIHdpZHRoID0gd2lkdGhfZm9yX3JlZ1tyZWcud2lkdGhdOworCisgICBhc3NlcnQoaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID49IDAgJiYKKwkgIGluc24tPmhlYWRlci5leGVjdXRpb25fc2l6ZSA8IEVsZW1lbnRzKGV4ZWNzaXplX2Zvcl9yZWcpKTsKKyAgIGV4ZWNzaXplID0gZXhlY3NpemVfZm9yX3JlZ1tpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemVdOworCisgICAvKiBSZXN0cmljdGlvbnMgZnJvbSAzLjMuMTA6IFJlZ2lzdGVyIFJlZ2lvbiBSZXN0cmljdGlvbnMuICovCisgICAvKiAzLiAqLworICAgYXNzZXJ0KGV4ZWNzaXplID49IHdpZHRoKTsKKworICAgLyogNC4gKi8KKyAgIGlmIChleGVjc2l6ZSA9PSB3aWR0aCAmJiBoc3RyaWRlICE9IDApIHsKKyAgICAgIGFzc2VydCh2c3RyaWRlID09IC0xIHx8IHZzdHJpZGUgPT0gd2lkdGggKiBoc3RyaWRlKTsKKyAgIH0KKworICAgLyogNS4gKi8KKyAgIGlmIChleGVjc2l6ZSA9PSB3aWR0aCAmJiBoc3RyaWRlID09IDApIHsKKyAgICAgIC8qIG5vIHJlc3RyaWN0aW9uIG9uIHZzdHJpZGUuICovCisgICB9CisKKyAgIC8qIDYuICovCisgICBpZiAod2lkdGggPT0gMSkgeworICAgICAgYXNzZXJ0KGhzdHJpZGUgPT0gMCk7CisgICB9CisKKyAgIC8qIDcuICovCisgICBpZiAoZXhlY3NpemUgPT0gMSAmJiB3aWR0aCA9PSAxKSB7CisgICAgICBhc3NlcnQoaHN0cmlkZSA9PSAwKTsKKyAgICAgIGFzc2VydCh2c3RyaWRlID09IDApOworICAgfQorCisgICAvKiA4LiAqLworICAgaWYgKHZzdHJpZGUgPT0gMCAmJiBoc3RyaWRlID09IDApIHsKKyAgICAgIGFzc2VydCh3aWR0aCA9PSAxKTsKKyAgIH0KKworICAgLyogMTAuIENoZWNrIGRlc3RpbmF0aW9uIGlzc3Vlcy4gKi8KK30KKwordm9pZAorYnJ3X3NldF9zcmMwKHN0cnVjdCBicndfY29tcGlsZSAqcCwgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKwkgICAgIHN0cnVjdCBicndfcmVnIHJlZykKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworCisgICBpZiAocmVnLnR5cGUgIT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFKQorICAgICAgYXNzZXJ0KHJlZy5uciA8IDEyOCk7CisKKyAgIGdlbjdfY29udmVydF9tcmZfdG9fZ3JmKHAsICZyZWcpOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNiAmJiAoaW5zbi0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX1NFTkQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc24tPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9TRU5EQykpIHsKKyAgICAgIC8qIEFueSBzb3VyY2UgbW9kaWZpZXJzIG9yIHJlZ2lvbnMgd2lsbCBiZSBpZ25vcmVkLCBzaW5jZSB0aGlzIGp1c3QKKyAgICAgICAqIGlkZW50aWZpZXMgdGhlIE1SRi9HUkYgdG8gc3RhcnQgcmVhZGluZyB0aGUgbWVzc2FnZSBjb250ZW50cyBmcm9tLgorICAgICAgICogQ2hlY2sgZm9yIHNvbWUgbGlrZWx5IGZhaWx1cmVzLgorICAgICAgICovCisgICAgICBhc3NlcnQoIXJlZy5uZWdhdGUpOworICAgICAgYXNzZXJ0KCFyZWcuYWJzKTsKKyAgICAgIGFzc2VydChyZWcuYWRkcmVzc19tb2RlID09IEJSV19BRERSRVNTX0RJUkVDVCk7CisgICB9CisKKyAgIHZhbGlkYXRlX3JlZyhpbnNuLCByZWcpOworCisgICBpbnNuLT5iaXRzMS5kYTEuc3JjMF9yZWdfZmlsZSA9IHJlZy5maWxlOworICAgaW5zbi0+Yml0czEuZGExLnNyYzBfcmVnX3R5cGUgPQorICAgICAgYnJ3X3JlZ190eXBlX3RvX2h3X3R5cGUoYnJ3LCByZWcudHlwZSwgcmVnLmZpbGUpOworICAgaW5zbi0+Yml0czIuZGExLnNyYzBfYWJzID0gcmVnLmFiczsKKyAgIGluc24tPmJpdHMyLmRhMS5zcmMwX25lZ2F0ZSA9IHJlZy5uZWdhdGU7CisgICBpbnNuLT5iaXRzMi5kYTEuc3JjMF9hZGRyZXNzX21vZGUgPSByZWcuYWRkcmVzc19tb2RlOworCisgICBpZiAocmVnLmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSkgeworICAgICAgaW5zbi0+Yml0czMudWQgPSByZWcuZHcxLnVkOworCisgICAgICAvKiBSZXF1aXJlZCB0byBzZXQgc29tZSBmaWVsZHMgaW4gc3JjMSBhcyB3ZWxsOgorICAgICAgICovCisgICAgICBpbnNuLT5iaXRzMS5kYTEuc3JjMV9yZWdfZmlsZSA9IDA7IC8qIGFyZiAqLworICAgICAgaW5zbi0+Yml0czEuZGExLnNyYzFfcmVnX3R5cGUgPSBpbnNuLT5iaXRzMS5kYTEuc3JjMF9yZWdfdHlwZTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmIChyZWcuYWRkcmVzc19tb2RlID09IEJSV19BRERSRVNTX0RJUkVDVCkgeworCSBpZiAoaW5zbi0+aGVhZGVyLmFjY2Vzc19tb2RlID09IEJSV19BTElHTl8xKSB7CisJICAgIGluc24tPmJpdHMyLmRhMS5zcmMwX3N1YnJlZ19uciA9IHJlZy5zdWJucjsKKwkgICAgaW5zbi0+Yml0czIuZGExLnNyYzBfcmVnX25yID0gcmVnLm5yOworCSB9CisJIGVsc2UgeworCSAgICBpbnNuLT5iaXRzMi5kYTE2LnNyYzBfc3VicmVnX25yID0gcmVnLnN1Ym5yIC8gMTY7CisJICAgIGluc24tPmJpdHMyLmRhMTYuc3JjMF9yZWdfbnIgPSByZWcubnI7CisJIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCSBpbnNuLT5iaXRzMi5pYTEuc3JjMF9zdWJyZWdfbnIgPSByZWcuc3VibnI7CisKKwkgaWYgKGluc24tPmhlYWRlci5hY2Nlc3NfbW9kZSA9PSBCUldfQUxJR05fMSkgeworCSAgICBpbnNuLT5iaXRzMi5pYTEuc3JjMF9pbmRpcmVjdF9vZmZzZXQgPSByZWcuZHcxLmJpdHMuaW5kaXJlY3Rfb2Zmc2V0OworCSB9CisJIGVsc2UgeworCSAgICBpbnNuLT5iaXRzMi5pYTE2LnNyYzBfc3VicmVnX25yID0gcmVnLmR3MS5iaXRzLmluZGlyZWN0X29mZnNldDsKKwkgfQorICAgICAgfQorCisgICAgICBpZiAoaW5zbi0+aGVhZGVyLmFjY2Vzc19tb2RlID09IEJSV19BTElHTl8xKSB7CisJIGlmIChyZWcud2lkdGggPT0gQlJXX1dJRFRIXzEgJiYKKwkgICAgIGluc24tPmhlYWRlci5leGVjdXRpb25fc2l6ZSA9PSBCUldfRVhFQ1VURV8xKSB7CisJICAgIGluc24tPmJpdHMyLmRhMS5zcmMwX2hvcml6X3N0cmlkZSA9IEJSV19IT1JJWk9OVEFMX1NUUklERV8wOworCSAgICBpbnNuLT5iaXRzMi5kYTEuc3JjMF93aWR0aCA9IEJSV19XSURUSF8xOworCSAgICBpbnNuLT5iaXRzMi5kYTEuc3JjMF92ZXJ0X3N0cmlkZSA9IEJSV19WRVJUSUNBTF9TVFJJREVfMDsKKwkgfQorCSBlbHNlIHsKKwkgICAgaW5zbi0+Yml0czIuZGExLnNyYzBfaG9yaXpfc3RyaWRlID0gcmVnLmhzdHJpZGU7CisJICAgIGluc24tPmJpdHMyLmRhMS5zcmMwX3dpZHRoID0gcmVnLndpZHRoOworCSAgICBpbnNuLT5iaXRzMi5kYTEuc3JjMF92ZXJ0X3N0cmlkZSA9IHJlZy52c3RyaWRlOworCSB9CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgaW5zbi0+Yml0czIuZGExNi5zcmMwX3N3el94ID0gQlJXX0dFVF9TV1oocmVnLmR3MS5iaXRzLnN3aXp6bGUsIEJSV19DSEFOTkVMX1gpOworCSBpbnNuLT5iaXRzMi5kYTE2LnNyYzBfc3d6X3kgPSBCUldfR0VUX1NXWihyZWcuZHcxLmJpdHMuc3dpenpsZSwgQlJXX0NIQU5ORUxfWSk7CisJIGluc24tPmJpdHMyLmRhMTYuc3JjMF9zd3pfeiA9IEJSV19HRVRfU1daKHJlZy5kdzEuYml0cy5zd2l6emxlLCBCUldfQ0hBTk5FTF9aKTsKKwkgaW5zbi0+Yml0czIuZGExNi5zcmMwX3N3el93ID0gQlJXX0dFVF9TV1oocmVnLmR3MS5iaXRzLnN3aXp6bGUsIEJSV19DSEFOTkVMX1cpOworCisJIC8qIFRoaXMgaXMgYW4gb2RkaXR5IG9mIHRoZSBmYWN0IHdlJ3JlIHVzaW5nIHRoZSBzYW1lCisJICAqIGRlc2NyaXB0aW9ucyBmb3IgcmVnaXN0ZXJzIGluIGFsaWduXzE2IGFzIGFsaWduXzE6CisJICAqLworCSBpZiAocmVnLnZzdHJpZGUgPT0gQlJXX1ZFUlRJQ0FMX1NUUklERV84KQorCSAgICBpbnNuLT5iaXRzMi5kYTE2LnNyYzBfdmVydF9zdHJpZGUgPSBCUldfVkVSVElDQUxfU1RSSURFXzQ7CisJIGVsc2UKKwkgICAgaW5zbi0+Yml0czIuZGExNi5zcmMwX3ZlcnRfc3RyaWRlID0gcmVnLnZzdHJpZGU7CisgICAgICB9CisgICB9Cit9CisKKwordm9pZCBicndfc2V0X3NyYzEoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24sCisJCSAgc3RydWN0IGJyd19yZWcgcmVnKQoreworICAgYXNzZXJ0KHJlZy5maWxlICE9IEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUpOworCisgICBpZiAocmVnLnR5cGUgIT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFKQorICAgICAgYXNzZXJ0KHJlZy5uciA8IDEyOCk7CisKKyAgIGdlbjdfY29udmVydF9tcmZfdG9fZ3JmKHAsICZyZWcpOworCisgICB2YWxpZGF0ZV9yZWcoaW5zbiwgcmVnKTsKKworICAgaW5zbi0+Yml0czEuZGExLnNyYzFfcmVnX2ZpbGUgPSByZWcuZmlsZTsKKyAgIGluc24tPmJpdHMxLmRhMS5zcmMxX3JlZ190eXBlID0KKyAgICAgIGJyd19yZWdfdHlwZV90b19od190eXBlKHAtPmJydywgcmVnLnR5cGUsIHJlZy5maWxlKTsKKyAgIGluc24tPmJpdHMzLmRhMS5zcmMxX2FicyA9IHJlZy5hYnM7CisgICBpbnNuLT5iaXRzMy5kYTEuc3JjMV9uZWdhdGUgPSByZWcubmVnYXRlOworCisgICAvKiBPbmx5IHNyYzEgY2FuIGJlIGltbWVkaWF0ZSBpbiB0d28tYXJndW1lbnQgaW5zdHJ1Y3Rpb25zLgorICAgICovCisgICBhc3NlcnQoaW5zbi0+Yml0czEuZGExLnNyYzBfcmVnX2ZpbGUgIT0gQlJXX0lNTUVESUFURV9WQUxVRSk7CisKKyAgIGlmIChyZWcuZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFKSB7CisgICAgICBpbnNuLT5iaXRzMy51ZCA9IHJlZy5kdzEudWQ7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBoYXJkd2FyZSByZXN0cmljdGlvbiwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgbGlmdGVkCisgICAgICAgKiBpbiB0aGUgZnV0dXJlOgorICAgICAgICovCisgICAgICBhc3NlcnQgKHJlZy5hZGRyZXNzX21vZGUgPT0gQlJXX0FERFJFU1NfRElSRUNUKTsKKyAgICAgIC8qIGFzc2VydCAocmVnLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7ICovCisKKyAgICAgIGlmIChpbnNuLT5oZWFkZXIuYWNjZXNzX21vZGUgPT0gQlJXX0FMSUdOXzEpIHsKKwkgaW5zbi0+Yml0czMuZGExLnNyYzFfc3VicmVnX25yID0gcmVnLnN1Ym5yOworCSBpbnNuLT5iaXRzMy5kYTEuc3JjMV9yZWdfbnIgPSByZWcubnI7CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgaW5zbi0+Yml0czMuZGExNi5zcmMxX3N1YnJlZ19uciA9IHJlZy5zdWJuciAvIDE2OworCSBpbnNuLT5iaXRzMy5kYTE2LnNyYzFfcmVnX25yID0gcmVnLm5yOworICAgICAgfQorCisgICAgICBpZiAoaW5zbi0+aGVhZGVyLmFjY2Vzc19tb2RlID09IEJSV19BTElHTl8xKSB7CisJIGlmIChyZWcud2lkdGggPT0gQlJXX1dJRFRIXzEgJiYKKwkgICAgIGluc24tPmhlYWRlci5leGVjdXRpb25fc2l6ZSA9PSBCUldfRVhFQ1VURV8xKSB7CisJICAgIGluc24tPmJpdHMzLmRhMS5zcmMxX2hvcml6X3N0cmlkZSA9IEJSV19IT1JJWk9OVEFMX1NUUklERV8wOworCSAgICBpbnNuLT5iaXRzMy5kYTEuc3JjMV93aWR0aCA9IEJSV19XSURUSF8xOworCSAgICBpbnNuLT5iaXRzMy5kYTEuc3JjMV92ZXJ0X3N0cmlkZSA9IEJSV19WRVJUSUNBTF9TVFJJREVfMDsKKwkgfQorCSBlbHNlIHsKKwkgICAgaW5zbi0+Yml0czMuZGExLnNyYzFfaG9yaXpfc3RyaWRlID0gcmVnLmhzdHJpZGU7CisJICAgIGluc24tPmJpdHMzLmRhMS5zcmMxX3dpZHRoID0gcmVnLndpZHRoOworCSAgICBpbnNuLT5iaXRzMy5kYTEuc3JjMV92ZXJ0X3N0cmlkZSA9IHJlZy52c3RyaWRlOworCSB9CisgICAgICB9CisgICAgICBlbHNlIHsKKwkgaW5zbi0+Yml0czMuZGExNi5zcmMxX3N3el94ID0gQlJXX0dFVF9TV1oocmVnLmR3MS5iaXRzLnN3aXp6bGUsIEJSV19DSEFOTkVMX1gpOworCSBpbnNuLT5iaXRzMy5kYTE2LnNyYzFfc3d6X3kgPSBCUldfR0VUX1NXWihyZWcuZHcxLmJpdHMuc3dpenpsZSwgQlJXX0NIQU5ORUxfWSk7CisJIGluc24tPmJpdHMzLmRhMTYuc3JjMV9zd3pfeiA9IEJSV19HRVRfU1daKHJlZy5kdzEuYml0cy5zd2l6emxlLCBCUldfQ0hBTk5FTF9aKTsKKwkgaW5zbi0+Yml0czMuZGExNi5zcmMxX3N3el93ID0gQlJXX0dFVF9TV1oocmVnLmR3MS5iaXRzLnN3aXp6bGUsIEJSV19DSEFOTkVMX1cpOworCisJIC8qIFRoaXMgaXMgYW4gb2RkaXR5IG9mIHRoZSBmYWN0IHdlJ3JlIHVzaW5nIHRoZSBzYW1lCisJICAqIGRlc2NyaXB0aW9ucyBmb3IgcmVnaXN0ZXJzIGluIGFsaWduXzE2IGFzIGFsaWduXzE6CisJICAqLworCSBpZiAocmVnLnZzdHJpZGUgPT0gQlJXX1ZFUlRJQ0FMX1NUUklERV84KQorCSAgICBpbnNuLT5iaXRzMy5kYTE2LnNyYzFfdmVydF9zdHJpZGUgPSBCUldfVkVSVElDQUxfU1RSSURFXzQ7CisJIGVsc2UKKwkgICAgaW5zbi0+Yml0czMuZGExNi5zcmMxX3ZlcnRfc3RyaWRlID0gcmVnLnZzdHJpZGU7CisgICAgICB9CisgICB9Cit9CisKKy8qKgorICogU2V0IHRoZSBNZXNzYWdlIERlc2NyaXB0b3IgYW5kIEV4dGVuZGVkIE1lc3NhZ2UgRGVzY3JpcHRvciBmaWVsZHMKKyAqIGZvciBTRU5EIG1lc3NhZ2VzLgorICoKKyAqIFxub3RlIFRoaXMgemVyb2VzIG91dCB0aGUgRnVuY3Rpb24gQ29udHJvbCBiaXRzLCBzbyBpdCBtdXN0IGJlIGNhbGxlZAorICogICAgICAgXGIgYmVmb3JlIGZpbGxpbmcgb3V0IGFueSBtZXNzYWdlLXNwZWNpZmljIGRhdGEuICBDYWxsZXJzIGNhbgorICogICAgICAgY2hvb3NlIG5vdCB0byBmaWxsIGluIGlycmVsZXZhbnQgYml0czsgdGhleSB3aWxsIGJlIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkCiticndfc2V0X21lc3NhZ2VfZGVzY3JpcHRvcihzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCQkgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnN0LAorCQkJICAgZW51bSBicndfbWVzc2FnZV90YXJnZXQgc2ZpZCwKKwkJCSAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisJCQkgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgsCisJCQkgICBib29sIGhlYWRlcl9wcmVzZW50LAorCQkJICAgYm9vbCBlbmRfb2ZfdGhyZWFkKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisKKyAgIGJyd19zZXRfc3JjMShwLCBpbnN0LCBicndfaW1tX2QoMCkpOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNSkgeworICAgICAgaW5zdC0+Yml0czMuZ2VuZXJpY19nZW41LmhlYWRlcl9wcmVzZW50ID0gaGVhZGVyX3ByZXNlbnQ7CisgICAgICBpbnN0LT5iaXRzMy5nZW5lcmljX2dlbjUucmVzcG9uc2VfbGVuZ3RoID0gcmVzcG9uc2VfbGVuZ3RoOworICAgICAgaW5zdC0+Yml0czMuZ2VuZXJpY19nZW41Lm1zZ19sZW5ndGggPSBtc2dfbGVuZ3RoOworICAgICAgaW5zdC0+Yml0czMuZ2VuZXJpY19nZW41LmVuZF9vZl90aHJlYWQgPSBlbmRfb2ZfdGhyZWFkOworCisgICAgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworCSAvKiBPbiBHZW42KyBNZXNzYWdlIHRhcmdldC9TRklEIGdvZXMgaW4gYml0cyAyNzoyNCBvZiB0aGUgaGVhZGVyICovCisJIGluc3QtPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCA9IHNmaWQ7CisgICAgICB9IGVsc2UgeworCSAvKiBTZXQgRXh0ZW5kZWQgTWVzc2FnZSBEZXNjcmlwdG9yIChleF9kZXNjKSAqLworCSBpbnN0LT5iaXRzMi5zZW5kX2dlbjUuc2ZpZCA9IHNmaWQ7CisJIGluc3QtPmJpdHMyLnNlbmRfZ2VuNS5lbmRfb2ZfdGhyZWFkID0gZW5kX29mX3RocmVhZDsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBpbnN0LT5iaXRzMy5nZW5lcmljLnJlc3BvbnNlX2xlbmd0aCA9IHJlc3BvbnNlX2xlbmd0aDsKKyAgICAgIGluc3QtPmJpdHMzLmdlbmVyaWMubXNnX2xlbmd0aCA9IG1zZ19sZW5ndGg7CisgICAgICBpbnN0LT5iaXRzMy5nZW5lcmljLm1zZ190YXJnZXQgPSBzZmlkOworICAgICAgaW5zdC0+Yml0czMuZ2VuZXJpYy5lbmRfb2ZfdGhyZWFkID0gZW5kX29mX3RocmVhZDsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgYnJ3X3NldF9tYXRoX21lc3NhZ2UoIHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCQkgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24sCisJCQkJICB1bnNpZ25lZCBmdW5jdGlvbiwKKwkJCQkgIHVuc2lnbmVkIGludGVnZXJfdHlwZSwKKwkJCQkgIGJvb2wgbG93X3ByZWNpc2lvbiwKKwkJCQkgIHVuc2lnbmVkIGRhdGFUeXBlICkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgdW5zaWduZWQgbXNnX2xlbmd0aDsKKyAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDsKKworICAgLyogSW5mZXIgbWVzc2FnZSBsZW5ndGggZnJvbSB0aGUgZnVuY3Rpb24gKi8KKyAgIHN3aXRjaCAoZnVuY3Rpb24pIHsKKyAgIGNhc2UgQlJXX01BVEhfRlVOQ1RJT05fUE9XOgorICAgY2FzZSBCUldfTUFUSF9GVU5DVElPTl9JTlRfRElWX1FVT1RJRU5UOgorICAgY2FzZSBCUldfTUFUSF9GVU5DVElPTl9JTlRfRElWX1JFTUFJTkRFUjoKKyAgIGNhc2UgQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9RVU9USUVOVF9BTkRfUkVNQUlOREVSOgorICAgICAgbXNnX2xlbmd0aCA9IDI7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBtc2dfbGVuZ3RoID0gMTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICAvKiBJbmZlciByZXNwb25zZSBsZW5ndGggZnJvbSB0aGUgZnVuY3Rpb24gKi8KKyAgIHN3aXRjaCAoZnVuY3Rpb24pIHsKKyAgIGNhc2UgQlJXX01BVEhfRlVOQ1RJT05fU0lOQ09TOgorICAgY2FzZSBCUldfTUFUSF9GVU5DVElPTl9JTlRfRElWX1FVT1RJRU5UX0FORF9SRU1BSU5ERVI6CisgICAgICByZXNwb25zZV9sZW5ndGggPSAyOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgcmVzcG9uc2VfbGVuZ3RoID0gMTsKKyAgICAgIGJyZWFrOworICAgfQorCisKKyAgIGJyd19zZXRfbWVzc2FnZV9kZXNjcmlwdG9yKHAsIGluc24sIEJSV19TRklEX01BVEgsCisJCQkgICAgICBtc2dfbGVuZ3RoLCByZXNwb25zZV9sZW5ndGgsIGZhbHNlLCBmYWxzZSk7CisgICBpZiAoYnJ3LT5nZW4gPT0gNSkgeworICAgICAgaW5zbi0+Yml0czMubWF0aF9nZW41LmZ1bmN0aW9uID0gZnVuY3Rpb247CisgICAgICBpbnNuLT5iaXRzMy5tYXRoX2dlbjUuaW50X3R5cGUgPSBpbnRlZ2VyX3R5cGU7CisgICAgICBpbnNuLT5iaXRzMy5tYXRoX2dlbjUucHJlY2lzaW9uID0gbG93X3ByZWNpc2lvbjsKKyAgICAgIGluc24tPmJpdHMzLm1hdGhfZ2VuNS5zYXR1cmF0ZSA9IGluc24tPmhlYWRlci5zYXR1cmF0ZTsKKyAgICAgIGluc24tPmJpdHMzLm1hdGhfZ2VuNS5kYXRhX3R5cGUgPSBkYXRhVHlwZTsKKyAgICAgIGluc24tPmJpdHMzLm1hdGhfZ2VuNS5zbmFwc2hvdCA9IDA7CisgICB9IGVsc2UgeworICAgICAgaW5zbi0+Yml0czMubWF0aC5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgICAgaW5zbi0+Yml0czMubWF0aC5pbnRfdHlwZSA9IGludGVnZXJfdHlwZTsKKyAgICAgIGluc24tPmJpdHMzLm1hdGgucHJlY2lzaW9uID0gbG93X3ByZWNpc2lvbjsKKyAgICAgIGluc24tPmJpdHMzLm1hdGguc2F0dXJhdGUgPSBpbnNuLT5oZWFkZXIuc2F0dXJhdGU7CisgICAgICBpbnNuLT5iaXRzMy5tYXRoLmRhdGFfdHlwZSA9IGRhdGFUeXBlOworICAgfQorICAgaW5zbi0+aGVhZGVyLnNhdHVyYXRlID0gMDsKK30KKworCitzdGF0aWMgdm9pZCBicndfc2V0X2ZmX3N5bmNfbWVzc2FnZShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCQkJICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24sCisJCQkJICAgIGJvb2wgYWxsb2NhdGUsCisJCQkJICAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKwkJCQkgICAgYm9vbCBlbmRfb2ZfdGhyZWFkKQoreworICAgYnJ3X3NldF9tZXNzYWdlX2Rlc2NyaXB0b3IocCwgaW5zbiwgQlJXX1NGSURfVVJCLAorCQkJICAgICAgMSwgcmVzcG9uc2VfbGVuZ3RoLCB0cnVlLCBlbmRfb2ZfdGhyZWFkKTsKKyAgIGluc24tPmJpdHMzLnVyYl9nZW41Lm9wY29kZSA9IDE7IC8qIEZGX1NZTkMgKi8KKyAgIGluc24tPmJpdHMzLnVyYl9nZW41Lm9mZnNldCA9IDA7IC8qIE5vdCB1c2VkIGJ5IEZGX1NZTkMgKi8KKyAgIGluc24tPmJpdHMzLnVyYl9nZW41LnN3aXp6bGVfY29udHJvbCA9IDA7IC8qIE5vdCB1c2VkIGJ5IEZGX1NZTkMgKi8KKyAgIGluc24tPmJpdHMzLnVyYl9nZW41LmFsbG9jYXRlID0gYWxsb2NhdGU7CisgICBpbnNuLT5iaXRzMy51cmJfZ2VuNS51c2VkID0gMDsgLyogTm90IHVzZWQgYnkgRkZfU1lOQyAqLworICAgaW5zbi0+Yml0czMudXJiX2dlbjUuY29tcGxldGUgPSAwOyAvKiBOb3QgdXNlZCBieSBGRl9TWU5DICovCit9CisKK3N0YXRpYyB2b2lkIGJyd19zZXRfdXJiX21lc3NhZ2UoIHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCQkgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gYnJ3X3VyYl93cml0ZV9mbGFncyBmbGFncywKKwkJCQkgdW5zaWduZWQgbXNnX2xlbmd0aCwKKwkJCQkgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoLAorCQkJCSB1bnNpZ25lZCBvZmZzZXQsCisJCQkJIHVuc2lnbmVkIHN3aXp6bGVfY29udHJvbCApCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKworICAgYnJ3X3NldF9tZXNzYWdlX2Rlc2NyaXB0b3IocCwgaW5zbiwgQlJXX1NGSURfVVJCLAorCQkJICAgICAgbXNnX2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBCUldfVVJCX1dSSVRFX0VPVCk7CisgICBpZiAoYnJ3LT5nZW4gPT0gNykgeworICAgICAgaWYgKGZsYWdzICYgQlJXX1VSQl9XUklURV9PV09SRCkgeworICAgICAgICAgYXNzZXJ0KG1zZ19sZW5ndGggPT0gMik7IC8qIGhlYWRlciArIG9uZSBPV09SRCBvZiBkYXRhICovCisgICAgICAgICBpbnNuLT5iaXRzMy51cmJfZ2VuNy5vcGNvZGUgPSBCUldfVVJCX09QQ09ERV9XUklURV9PV09SRDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpbnNuLT5iaXRzMy51cmJfZ2VuNy5vcGNvZGUgPSBCUldfVVJCX09QQ09ERV9XUklURV9IV09SRDsKKyAgICAgIH0KKyAgICAgIGluc24tPmJpdHMzLnVyYl9nZW43Lm9mZnNldCA9IG9mZnNldDsKKyAgICAgIGFzc2VydChzd2l6emxlX2NvbnRyb2wgIT0gQlJXX1VSQl9TV0laWkxFX1RSQU5TUE9TRSk7CisgICAgICBpbnNuLT5iaXRzMy51cmJfZ2VuNy5zd2l6emxlX2NvbnRyb2wgPSBzd2l6emxlX2NvbnRyb2w7CisgICAgICBpbnNuLT5iaXRzMy51cmJfZ2VuNy5wZXJfc2xvdF9vZmZzZXQgPQorICAgICAgICAgZmxhZ3MgJiBCUldfVVJCX1dSSVRFX1BFUl9TTE9UX09GRlNFVCA/IDEgOiAwOworICAgICAgaW5zbi0+Yml0czMudXJiX2dlbjcuY29tcGxldGUgPSBmbGFncyAmIEJSV19VUkJfV1JJVEVfQ09NUExFVEUgPyAxIDogMDsKKyAgIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPj0gNSkgeworICAgICAgaW5zbi0+Yml0czMudXJiX2dlbjUub3Bjb2RlID0gMDsJLyogVVJCX1dSSVRFICovCisgICAgICBpbnNuLT5iaXRzMy51cmJfZ2VuNS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICBpbnNuLT5iaXRzMy51cmJfZ2VuNS5zd2l6emxlX2NvbnRyb2wgPSBzd2l6emxlX2NvbnRyb2w7CisgICAgICBpbnNuLT5iaXRzMy51cmJfZ2VuNS5hbGxvY2F0ZSA9IGZsYWdzICYgQlJXX1VSQl9XUklURV9BTExPQ0FURSA/IDEgOiAwOworICAgICAgaW5zbi0+Yml0czMudXJiX2dlbjUudXNlZCA9IGZsYWdzICYgQlJXX1VSQl9XUklURV9VTlVTRUQgPyAwIDogMTsKKyAgICAgIGluc24tPmJpdHMzLnVyYl9nZW41LmNvbXBsZXRlID0gZmxhZ3MgJiBCUldfVVJCX1dSSVRFX0NPTVBMRVRFID8gMSA6IDA7CisgICB9IGVsc2UgeworICAgICAgaW5zbi0+Yml0czMudXJiLm9wY29kZSA9IDA7CS8qID8gKi8KKyAgICAgIGluc24tPmJpdHMzLnVyYi5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICBpbnNuLT5iaXRzMy51cmIuc3dpenpsZV9jb250cm9sID0gc3dpenpsZV9jb250cm9sOworICAgICAgaW5zbi0+Yml0czMudXJiLmFsbG9jYXRlID0gZmxhZ3MgJiBCUldfVVJCX1dSSVRFX0FMTE9DQVRFID8gMSA6IDA7CisgICAgICBpbnNuLT5iaXRzMy51cmIudXNlZCA9IGZsYWdzICYgQlJXX1VSQl9XUklURV9VTlVTRUQgPyAwIDogMTsKKyAgICAgIGluc24tPmJpdHMzLnVyYi5jb21wbGV0ZSA9IGZsYWdzICYgQlJXX1VSQl9XUklURV9DT01QTEVURSA/IDEgOiAwOworICAgfQorfQorCit2b2lkCiticndfc2V0X2RwX3dyaXRlX21lc3NhZ2Uoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24sCisJCQkgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleCwKKwkJCSB1bnNpZ25lZCBtc2dfY29udHJvbCwKKwkJCSB1bnNpZ25lZCBtc2dfdHlwZSwKKwkJCSB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorCQkJIGJvb2wgaGVhZGVyX3ByZXNlbnQsCisJCQkgdW5zaWduZWQgbGFzdF9yZW5kZXJfdGFyZ2V0LAorCQkJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKwkJCSB1bnNpZ25lZCBlbmRfb2ZfdGhyZWFkLAorCQkJIHVuc2lnbmVkIHNlbmRfY29tbWl0X21zZykKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgdW5zaWduZWQgc2ZpZDsKKworICAgaWYgKGJydy0+Z2VuID49IDcpIHsKKyAgICAgIC8qIFVzZSB0aGUgUmVuZGVyIENhY2hlIGZvciBSVCB3cml0ZXM7IG90aGVyd2lzZSB1c2UgdGhlIERhdGEgQ2FjaGUgKi8KKyAgICAgIGlmIChtc2dfdHlwZSA9PSBHRU42X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfUkVOREVSX1RBUkdFVF9XUklURSkKKwkgc2ZpZCA9IEdFTjZfU0ZJRF9EQVRBUE9SVF9SRU5ERVJfQ0FDSEU7CisgICAgICBlbHNlCisJIHNmaWQgPSBHRU43X1NGSURfREFUQVBPUlRfREFUQV9DQUNIRTsKKyAgIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPT0gNikgeworICAgICAgLyogVXNlIHRoZSByZW5kZXIgY2FjaGUgZm9yIGFsbCB3cml0ZSBtZXNzYWdlcy4gKi8KKyAgICAgIHNmaWQgPSBHRU42X1NGSURfREFUQVBPUlRfUkVOREVSX0NBQ0hFOworICAgfSBlbHNlIHsKKyAgICAgIHNmaWQgPSBCUldfU0ZJRF9EQVRBUE9SVF9XUklURTsKKyAgIH0KKworICAgYnJ3X3NldF9tZXNzYWdlX2Rlc2NyaXB0b3IocCwgaW5zbiwgc2ZpZCwgbXNnX2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoLAorCQkJICAgICAgaGVhZGVyX3ByZXNlbnQsIGVuZF9vZl90aHJlYWQpOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgaW5zbi0+Yml0czMuZ2VuN19kcC5iaW5kaW5nX3RhYmxlX2luZGV4ID0gYmluZGluZ190YWJsZV9pbmRleDsKKyAgICAgIGluc24tPmJpdHMzLmdlbjdfZHAubXNnX2NvbnRyb2wgPSBtc2dfY29udHJvbDsKKyAgICAgIGluc24tPmJpdHMzLmdlbjdfZHAubGFzdF9yZW5kZXJfdGFyZ2V0ID0gbGFzdF9yZW5kZXJfdGFyZ2V0OworICAgICAgaW5zbi0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgfSBlbHNlIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLmJpbmRpbmdfdGFibGVfaW5kZXggPSBiaW5kaW5nX3RhYmxlX2luZGV4OworICAgICAgaW5zbi0+Yml0czMuZ2VuNl9kcC5tc2dfY29udHJvbCA9IG1zZ19jb250cm9sOworICAgICAgaW5zbi0+Yml0czMuZ2VuNl9kcC5sYXN0X3JlbmRlcl90YXJnZXQgPSBsYXN0X3JlbmRlcl90YXJnZXQ7CisgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLm1zZ190eXBlID0gbXNnX3R5cGU7CisgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLnNlbmRfY29tbWl0X21zZyA9IHNlbmRfY29tbWl0X21zZzsKKyAgIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPT0gNSkgeworICAgICAgaW5zbi0+Yml0czMuZHBfd3JpdGVfZ2VuNS5iaW5kaW5nX3RhYmxlX2luZGV4ID0gYmluZGluZ190YWJsZV9pbmRleDsKKyAgICAgIGluc24tPmJpdHMzLmRwX3dyaXRlX2dlbjUubXNnX2NvbnRyb2wgPSBtc2dfY29udHJvbDsKKyAgICAgIGluc24tPmJpdHMzLmRwX3dyaXRlX2dlbjUubGFzdF9yZW5kZXJfdGFyZ2V0ID0gbGFzdF9yZW5kZXJfdGFyZ2V0OworICAgICAgaW5zbi0+Yml0czMuZHBfd3JpdGVfZ2VuNS5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgICAgaW5zbi0+Yml0czMuZHBfd3JpdGVfZ2VuNS5zZW5kX2NvbW1pdF9tc2cgPSBzZW5kX2NvbW1pdF9tc2c7CisgICB9IGVsc2UgeworICAgICAgaW5zbi0+Yml0czMuZHBfd3JpdGUuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRpbmdfdGFibGVfaW5kZXg7CisgICAgICBpbnNuLT5iaXRzMy5kcF93cml0ZS5tc2dfY29udHJvbCA9IG1zZ19jb250cm9sOworICAgICAgaW5zbi0+Yml0czMuZHBfd3JpdGUubGFzdF9yZW5kZXJfdGFyZ2V0ID0gbGFzdF9yZW5kZXJfdGFyZ2V0OworICAgICAgaW5zbi0+Yml0czMuZHBfd3JpdGUubXNnX3R5cGUgPSBtc2dfdHlwZTsKKyAgICAgIGluc24tPmJpdHMzLmRwX3dyaXRlLnNlbmRfY29tbWl0X21zZyA9IHNlbmRfY29tbWl0X21zZzsKKyAgIH0KK30KKwordm9pZAorYnJ3X3NldF9kcF9yZWFkX21lc3NhZ2Uoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQl1bnNpZ25lZCBtc2dfY29udHJvbCwKKwkJCXVuc2lnbmVkIG1zZ190eXBlLAorCQkJdW5zaWduZWQgdGFyZ2V0X2NhY2hlLAorCQkJdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVhZGVyX3ByZXNlbnQsCisJCQl1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHVuc2lnbmVkIHNmaWQ7CisKKyAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICBzZmlkID0gR0VON19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEU7CisgICB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKyAgICAgIGlmICh0YXJnZXRfY2FjaGUgPT0gQlJXX0RBVEFQT1JUX1JFQURfVEFSR0VUX1JFTkRFUl9DQUNIRSkKKwkgc2ZpZCA9IEdFTjZfU0ZJRF9EQVRBUE9SVF9SRU5ERVJfQ0FDSEU7CisgICAgICBlbHNlCisJIHNmaWQgPSBHRU42X1NGSURfREFUQVBPUlRfU0FNUExFUl9DQUNIRTsKKyAgIH0gZWxzZSB7CisgICAgICBzZmlkID0gQlJXX1NGSURfREFUQVBPUlRfUkVBRDsKKyAgIH0KKworICAgYnJ3X3NldF9tZXNzYWdlX2Rlc2NyaXB0b3IocCwgaW5zbiwgc2ZpZCwgbXNnX2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoLAorCQkJICAgICAgaGVhZGVyX3ByZXNlbnQsIGZhbHNlKTsKKworICAgaWYgKGJydy0+Z2VuID49IDcpIHsKKyAgICAgIGluc24tPmJpdHMzLmdlbjdfZHAuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRpbmdfdGFibGVfaW5kZXg7CisgICAgICBpbnNuLT5iaXRzMy5nZW43X2RwLm1zZ19jb250cm9sID0gbXNnX2NvbnRyb2w7CisgICAgICBpbnNuLT5iaXRzMy5nZW43X2RwLmxhc3RfcmVuZGVyX3RhcmdldCA9IDA7CisgICAgICBpbnNuLT5iaXRzMy5nZW43X2RwLm1zZ190eXBlID0gbXNnX3R5cGU7CisgICB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKyAgICAgIGluc24tPmJpdHMzLmdlbjZfZHAuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRpbmdfdGFibGVfaW5kZXg7CisgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLm1zZ19jb250cm9sID0gbXNnX2NvbnRyb2w7CisgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLmxhc3RfcmVuZGVyX3RhcmdldCA9IDA7CisgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLm1zZ190eXBlID0gbXNnX3R5cGU7CisgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLnNlbmRfY29tbWl0X21zZyA9IDA7CisgICB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDUpIHsKKyAgICAgIGluc24tPmJpdHMzLmRwX3JlYWRfZ2VuNS5iaW5kaW5nX3RhYmxlX2luZGV4ID0gYmluZGluZ190YWJsZV9pbmRleDsKKyAgICAgIGluc24tPmJpdHMzLmRwX3JlYWRfZ2VuNS5tc2dfY29udHJvbCA9IG1zZ19jb250cm9sOworICAgICAgaW5zbi0+Yml0czMuZHBfcmVhZF9nZW41Lm1zZ190eXBlID0gbXNnX3R5cGU7CisgICAgICBpbnNuLT5iaXRzMy5kcF9yZWFkX2dlbjUudGFyZ2V0X2NhY2hlID0gdGFyZ2V0X2NhY2hlOworICAgfSBlbHNlIGlmIChicnctPmlzX2c0eCkgeworICAgICAgaW5zbi0+Yml0czMuZHBfcmVhZF9nNHguYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRpbmdfdGFibGVfaW5kZXg7IC8qMDo3Ki8KKyAgICAgIGluc24tPmJpdHMzLmRwX3JlYWRfZzR4Lm1zZ19jb250cm9sID0gbXNnX2NvbnRyb2w7ICAvKjg6MTAqLworICAgICAgaW5zbi0+Yml0czMuZHBfcmVhZF9nNHgubXNnX3R5cGUgPSBtc2dfdHlwZTsgIC8qMTE6MTMqLworICAgICAgaW5zbi0+Yml0czMuZHBfcmVhZF9nNHgudGFyZ2V0X2NhY2hlID0gdGFyZ2V0X2NhY2hlOyAgLyoxNDoxNSovCisgICB9IGVsc2UgeworICAgICAgaW5zbi0+Yml0czMuZHBfcmVhZC5iaW5kaW5nX3RhYmxlX2luZGV4ID0gYmluZGluZ190YWJsZV9pbmRleDsgLyowOjcqLworICAgICAgaW5zbi0+Yml0czMuZHBfcmVhZC5tc2dfY29udHJvbCA9IG1zZ19jb250cm9sOyAgLyo4OjExKi8KKyAgICAgIGluc24tPmJpdHMzLmRwX3JlYWQubXNnX3R5cGUgPSBtc2dfdHlwZTsgIC8qMTI6MTMqLworICAgICAgaW5zbi0+Yml0czMuZHBfcmVhZC50YXJnZXRfY2FjaGUgPSB0YXJnZXRfY2FjaGU7ICAvKjE0OjE1Ki8KKyAgIH0KK30KKwordm9pZAorYnJ3X3NldF9zYW1wbGVyX21lc3NhZ2Uoc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGVhZGVyX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaW1kX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXR1cm5fZm9ybWF0KQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisKKyAgIGJyd19zZXRfbWVzc2FnZV9kZXNjcmlwdG9yKHAsIGluc24sIEJSV19TRklEX1NBTVBMRVIsIG1zZ19sZW5ndGgsCisJCQkgICAgICByZXNwb25zZV9sZW5ndGgsIGhlYWRlcl9wcmVzZW50LCBmYWxzZSk7CisKKyAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2dlbjcuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRpbmdfdGFibGVfaW5kZXg7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2dlbjcuc2FtcGxlciA9IHNhbXBsZXI7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2dlbjcubXNnX3R5cGUgPSBtc2dfdHlwZTsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXJfZ2VuNy5zaW1kX21vZGUgPSBzaW1kX21vZGU7CisgICB9IGVsc2UgaWYgKGJydy0+Z2VuID49IDUpIHsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXJfZ2VuNS5iaW5kaW5nX3RhYmxlX2luZGV4ID0gYmluZGluZ190YWJsZV9pbmRleDsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXJfZ2VuNS5zYW1wbGVyID0gc2FtcGxlcjsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXJfZ2VuNS5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgICAgaW5zbi0+Yml0czMuc2FtcGxlcl9nZW41LnNpbWRfbW9kZSA9IHNpbWRfbW9kZTsKKyAgIH0gZWxzZSBpZiAoYnJ3LT5pc19nNHgpIHsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXJfZzR4LmJpbmRpbmdfdGFibGVfaW5kZXggPSBiaW5kaW5nX3RhYmxlX2luZGV4OworICAgICAgaW5zbi0+Yml0czMuc2FtcGxlcl9nNHguc2FtcGxlciA9IHNhbXBsZXI7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyX2c0eC5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgfSBlbHNlIHsKKyAgICAgIGluc24tPmJpdHMzLnNhbXBsZXIuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRpbmdfdGFibGVfaW5kZXg7CisgICAgICBpbnNuLT5iaXRzMy5zYW1wbGVyLnNhbXBsZXIgPSBzYW1wbGVyOworICAgICAgaW5zbi0+Yml0czMuc2FtcGxlci5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgICAgaW5zbi0+Yml0czMuc2FtcGxlci5yZXR1cm5fZm9ybWF0ID0gcmV0dXJuX2Zvcm1hdDsKKyAgIH0KK30KKworCisjZGVmaW5lIG5leHRfaW5zbiBicndfbmV4dF9pbnNuCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICoKK2Jyd19uZXh0X2luc24oc3RydWN0IGJyd19jb21waWxlICpwLCB1bnNpZ25lZCBvcGNvZGUpCit7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuOworCisgICBpZiAocC0+bnJfaW5zbiArIDEgPiBwLT5zdG9yZV9zaXplKSB7CisgICAgICBpZiAoMCkgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNyZXNpbmcgdGhlIHN0b3JlIHNpemUgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgIHAtPnN0b3JlX3NpemUgPDwgMSk7CisgICAgICB9CisgICAgICBwLT5zdG9yZV9zaXplIDw8PSAxOworICAgICAgcC0+c3RvcmUgPSByZXJhbGxvYyhwLT5tZW1fY3R4LCBwLT5zdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiwgcC0+c3RvcmVfc2l6ZSk7CisgICAgICBpZiAoIXAtPnN0b3JlKQorICAgICAgICAgYXNzZXJ0KCEicmVhbGxvYyBldSBzdG9yZSBtZW1lb3J5IGZhaWxlZCIpOworICAgfQorCisgICBwLT5uZXh0X2luc25fb2Zmc2V0ICs9IDE2OworICAgaW5zbiA9ICZwLT5zdG9yZVtwLT5ucl9pbnNuKytdOworICAgbWVtY3B5KGluc24sIHAtPmN1cnJlbnQsIHNpemVvZigqaW5zbikpOworCisgICAvKiBSZXNldCB0aGlzIG9uZS1zaG90IGZsYWc6CisgICAgKi8KKworICAgaWYgKHAtPmN1cnJlbnQtPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCkgeworICAgICAgcC0+Y3VycmVudC0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gMDsKKyAgICAgIHAtPmN1cnJlbnQtPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IEJSV19QUkVESUNBVEVfTk9STUFMOworICAgfQorCisgICBpbnNuLT5oZWFkZXIub3Bjb2RlID0gb3Bjb2RlOworICAgcmV0dXJuIGluc247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfYWx1MSggc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJCQkgdW5zaWduZWQgb3Bjb2RlLAorCQkJCQkgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkJCQkJIHN0cnVjdCBicndfcmVnIHNyYyApCit7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gbmV4dF9pbnNuKHAsIG9wY29kZSk7CisgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgZGVzdCk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgc3JjKTsKKyAgIHJldHVybiBpbnNuOworfQorCitzdGF0aWMgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3X2FsdTIoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkJCQl1bnNpZ25lZCBvcGNvZGUsCisJCQkJCXN0cnVjdCBicndfcmVnIGRlc3QsCisJCQkJCXN0cnVjdCBicndfcmVnIHNyYzAsCisJCQkJCXN0cnVjdCBicndfcmVnIHNyYzEgKQoreworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IG5leHRfaW5zbihwLCBvcGNvZGUpOworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIGRlc3QpOworICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHNyYzApOworICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIHNyYzEpOworICAgcmV0dXJuIGluc247Cit9CisKK3N0YXRpYyBpbnQKK2dldF8zc3JjX3N1YnJlZ19ucihzdHJ1Y3QgYnJ3X3JlZyByZWcpCit7CisgICBpZiAocmVnLnZzdHJpZGUgPT0gQlJXX1ZFUlRJQ0FMX1NUUklERV8wKSB7CisgICAgICBhc3NlcnQoYnJ3X2lzX3NpbmdsZV92YWx1ZV9zd2l6emxlKHJlZy5kdzEuYml0cy5zd2l6emxlKSk7CisgICAgICByZXR1cm4gcmVnLnN1Ym5yIC8gNCArIEJSV19HRVRfU1daKHJlZy5kdzEuYml0cy5zd2l6emxlLCAwKTsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcmVnLnN1Ym5yIC8gNDsKKyAgIH0KK30KKworc3RhdGljIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19hbHUzKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCQkJdW5zaWduZWQgb3Bjb2RlLAorCQkJCQlzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCQkJCQlzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorCQkJCQlzdHJ1Y3QgYnJ3X3JlZyBzcmMxLAorCQkJCQlzdHJ1Y3QgYnJ3X3JlZyBzcmMyKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gbmV4dF9pbnNuKHAsIG9wY29kZSk7CisKKyAgIGdlbjdfY29udmVydF9tcmZfdG9fZ3JmKHAsICZkZXN0KTsKKworICAgYXNzZXJ0KGluc24tPmhlYWRlci5hY2Nlc3NfbW9kZSA9PSBCUldfQUxJR05fMTYpOworCisgICBhc3NlcnQoZGVzdC5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUgfHwKKwkgIGRlc3QuZmlsZSA9PSBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFKTsKKyAgIGFzc2VydChkZXN0Lm5yIDwgMTI4KTsKKyAgIGFzc2VydChkZXN0LmFkZHJlc3NfbW9kZSA9PSBCUldfQUREUkVTU19ESVJFQ1QpOworICAgYXNzZXJ0KGRlc3QudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GIHx8CisgICAgICAgICAgZGVzdC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0QgfHwKKyAgICAgICAgICBkZXN0LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgaW5zbi0+Yml0czEuZGEzc3JjLmRlc3RfcmVnX2ZpbGUgPSAoZGVzdC5maWxlID09IEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUpOworICAgaW5zbi0+Yml0czEuZGEzc3JjLmRlc3RfcmVnX25yID0gZGVzdC5ucjsKKyAgIGluc24tPmJpdHMxLmRhM3NyYy5kZXN0X3N1YnJlZ19uciA9IGRlc3Quc3VibnIgLyAxNjsKKyAgIGluc24tPmJpdHMxLmRhM3NyYy5kZXN0X3dyaXRlbWFzayA9IGRlc3QuZHcxLmJpdHMud3JpdGVtYXNrOworICAgZ3Vlc3NfZXhlY3V0aW9uX3NpemUocCwgaW5zbiwgZGVzdCk7CisKKyAgIGFzc2VydChzcmMwLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7CisgICBhc3NlcnQoc3JjMC5hZGRyZXNzX21vZGUgPT0gQlJXX0FERFJFU1NfRElSRUNUKTsKKyAgIGFzc2VydChzcmMwLm5yIDwgMTI4KTsKKyAgIGluc24tPmJpdHMyLmRhM3NyYy5zcmMwX3N3aXp6bGUgPSBzcmMwLmR3MS5iaXRzLnN3aXp6bGU7CisgICBpbnNuLT5iaXRzMi5kYTNzcmMuc3JjMF9zdWJyZWdfbnIgPSBnZXRfM3NyY19zdWJyZWdfbnIoc3JjMCk7CisgICBpbnNuLT5iaXRzMi5kYTNzcmMuc3JjMF9yZWdfbnIgPSBzcmMwLm5yOworICAgaW5zbi0+Yml0czEuZGEzc3JjLnNyYzBfYWJzID0gc3JjMC5hYnM7CisgICBpbnNuLT5iaXRzMS5kYTNzcmMuc3JjMF9uZWdhdGUgPSBzcmMwLm5lZ2F0ZTsKKyAgIGluc24tPmJpdHMyLmRhM3NyYy5zcmMwX3JlcF9jdHJsID0gc3JjMC52c3RyaWRlID09IEJSV19WRVJUSUNBTF9TVFJJREVfMDsKKworICAgYXNzZXJ0KHNyYzEuZmlsZSA9PSBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFKTsKKyAgIGFzc2VydChzcmMxLmFkZHJlc3NfbW9kZSA9PSBCUldfQUREUkVTU19ESVJFQ1QpOworICAgYXNzZXJ0KHNyYzEubnIgPCAxMjgpOworICAgaW5zbi0+Yml0czIuZGEzc3JjLnNyYzFfc3dpenpsZSA9IHNyYzEuZHcxLmJpdHMuc3dpenpsZTsKKyAgIGluc24tPmJpdHMyLmRhM3NyYy5zcmMxX3N1YnJlZ19ucl9sb3cgPSBnZXRfM3NyY19zdWJyZWdfbnIoc3JjMSkgJiAweDM7CisgICBpbnNuLT5iaXRzMy5kYTNzcmMuc3JjMV9zdWJyZWdfbnJfaGlnaCA9IGdldF8zc3JjX3N1YnJlZ19ucihzcmMxKSA+PiAyOworICAgaW5zbi0+Yml0czIuZGEzc3JjLnNyYzFfcmVwX2N0cmwgPSBzcmMxLnZzdHJpZGUgPT0gQlJXX1ZFUlRJQ0FMX1NUUklERV8wOworICAgaW5zbi0+Yml0czMuZGEzc3JjLnNyYzFfcmVnX25yID0gc3JjMS5ucjsKKyAgIGluc24tPmJpdHMxLmRhM3NyYy5zcmMxX2FicyA9IHNyYzEuYWJzOworICAgaW5zbi0+Yml0czEuZGEzc3JjLnNyYzFfbmVnYXRlID0gc3JjMS5uZWdhdGU7CisKKyAgIGFzc2VydChzcmMyLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7CisgICBhc3NlcnQoc3JjMi5hZGRyZXNzX21vZGUgPT0gQlJXX0FERFJFU1NfRElSRUNUKTsKKyAgIGFzc2VydChzcmMyLm5yIDwgMTI4KTsKKyAgIGluc24tPmJpdHMzLmRhM3NyYy5zcmMyX3N3aXp6bGUgPSBzcmMyLmR3MS5iaXRzLnN3aXp6bGU7CisgICBpbnNuLT5iaXRzMy5kYTNzcmMuc3JjMl9zdWJyZWdfbnIgPSBnZXRfM3NyY19zdWJyZWdfbnIoc3JjMik7CisgICBpbnNuLT5iaXRzMy5kYTNzcmMuc3JjMl9yZXBfY3RybCA9IHNyYzIudnN0cmlkZSA9PSBCUldfVkVSVElDQUxfU1RSSURFXzA7CisgICBpbnNuLT5iaXRzMy5kYTNzcmMuc3JjMl9yZWdfbnIgPSBzcmMyLm5yOworICAgaW5zbi0+Yml0czEuZGEzc3JjLnNyYzJfYWJzID0gc3JjMi5hYnM7CisgICBpbnNuLT5iaXRzMS5kYTNzcmMuc3JjMl9uZWdhdGUgPSBzcmMyLm5lZ2F0ZTsKKworICAgaWYgKGJydy0+Z2VuID49IDcpIHsKKyAgICAgIC8qIFNldCBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIGJhc2VkIG9uIGRlc3QudHlwZSwKKyAgICAgICAqIGlnbm9yaW5nIHRoZSBzb3VyY2UgcmVnaXN0ZXIgdHlwZXMuICBUaGUgTUFEIGFuZCBMUlAgZW1pdHRlcnMgZW5zdXJlCisgICAgICAgKiB0aGF0IGFsbCBmb3VyIHR5cGVzIGFyZSBmbG9hdC4gIFRoZSBCRkUgYW5kIEJGSTIgZW1pdHRlcnMsIGhvd2V2ZXIsCisgICAgICAgKiBtYXkgc2VuZCB1cyBtaXhlZCBEIGFuZCBVRCB0eXBlcyBhbmQgd2FudCB1cyB0byBpZ25vcmUgdGhhdCBhbmQgdXNlCisgICAgICAgKiB0aGUgZGVzdGluYXRpb24gdHlwZS4KKyAgICAgICAqLworICAgICAgc3dpdGNoIChkZXN0LnR5cGUpIHsKKyAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRjoKKyAgICAgICAgIGluc24tPmJpdHMxLmRhM3NyYy5zcmNfdHlwZSA9IEJSV18zU1JDX1RZUEVfRjsKKyAgICAgICAgIGluc24tPmJpdHMxLmRhM3NyYy5kc3RfdHlwZSA9IEJSV18zU1JDX1RZUEVfRjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9EOgorICAgICAgICAgaW5zbi0+Yml0czEuZGEzc3JjLnNyY190eXBlID0gQlJXXzNTUkNfVFlQRV9EOworICAgICAgICAgaW5zbi0+Yml0czEuZGEzc3JjLmRzdF90eXBlID0gQlJXXzNTUkNfVFlQRV9EOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX1VEOgorICAgICAgICAgaW5zbi0+Yml0czEuZGEzc3JjLnNyY190eXBlID0gQlJXXzNTUkNfVFlQRV9VRDsKKyAgICAgICAgIGluc24tPmJpdHMxLmRhM3NyYy5kc3RfdHlwZSA9IEJSV18zU1JDX1RZUEVfVUQ7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGluc247Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb252ZW5pZW5jZSByb3V0aW5lcy4KKyAqLworI2RlZmluZSBBTFUxKE9QKQkJCQkJXAorc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3XyMjT1Aoc3RydWN0IGJyd19jb21waWxlICpwLAlcCisJICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwJCQlcCisJICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCkgICAJCQlcCit7CQkJCQkJCVwKKyAgIHJldHVybiBicndfYWx1MShwLCBCUldfT1BDT0RFXyMjT1AsIGRlc3QsIHNyYzApOyAgICAJXAorfQorCisjZGVmaW5lIEFMVTIoT1ApCQkJCQlcCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfIyNPUChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCVwKKwkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAkJCVwKKwkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAkJCVwKKwkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKSAgIAkJCVwKK3sJCQkJCQkJXAorICAgcmV0dXJuIGJyd19hbHUyKHAsIEJSV19PUENPREVfIyNPUCwgZGVzdCwgc3JjMCwgc3JjMSk7CVwKK30KKworI2RlZmluZSBBTFUzKE9QKQkJCQkJXAorc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3XyMjT1Aoc3RydWN0IGJyd19jb21waWxlICpwLAlcCisJICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwJCQlcCisJICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwJCQlcCisJICAgICAgc3RydWN0IGJyd19yZWcgc3JjMSwJCQlcCisJICAgICAgc3RydWN0IGJyd19yZWcgc3JjMikgICAJCQlcCit7CQkJCQkJCVwKKyAgIHJldHVybiBicndfYWx1MyhwLCBCUldfT1BDT0RFXyMjT1AsIGRlc3QsIHNyYzAsIHNyYzEsIHNyYzIpOwlcCit9CisKKyNkZWZpbmUgQUxVM0YoT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfIyNPUChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMikgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBhc3NlcnQoZGVzdC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0YpOyAgICAgICAgICAgICAgICAgICAgXAorICAgYXNzZXJ0KHNyYzAudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgIGFzc2VydChzcmMxLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRik7ICAgICAgICAgICAgICAgICAgICBcCisgICBhc3NlcnQoc3JjMi50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0YpOyAgICAgICAgICAgICAgICAgICAgXAorICAgcmV0dXJuIGJyd19hbHUzKHAsIEJSV19PUENPREVfIyNPUCwgZGVzdCwgc3JjMCwgc3JjMSwgc3JjMik7IFwKK30KKworLyogUm91bmRpbmcgb3BlcmF0aW9ucyAob3RoZXIgdGhhbiBSTkREKSByZXF1aXJlIHR3byBpbnN0cnVjdGlvbnMgLSB0aGUgZmlyc3QKKyAqIHN0b3JlcyBhIHJvdW5kZWQgdmFsdWUgKHBvc3NpYmx5IHRoZSB3cm9uZyB3YXkpIGluIHRoZSBkZXN0IHJlZ2lzdGVyLCBidXQKKyAqIGFsc28gc2V0cyBhIHBlci1jaGFubmVsICJpbmNyZW1lbnQgYml0IiBpbiB0aGUgZmxhZyByZWdpc3Rlci4gIEEgcHJlZGljYXRlZAorICogYWRkIG9mIDEuMCBmaXhlcyBkZXN0IHRvIGNvbnRhaW4gdGhlIGRlc2lyZWQgcmVzdWx0LgorICoKKyAqIFNhbmR5YnJpZGdlIGFuZCBsYXRlciBhcHBlYXIgdG8gcm91bmQgY29ycmVjdGx5IHdpdGhvdXQgYW4gQURELgorICovCisjZGVmaW5lIFJPVU5EKE9QKQkJCQkJCQkgICAgICBcCit2b2lkIGJyd18jI09QKHN0cnVjdCBicndfY29tcGlsZSAqcCwJCQkJCSAgICAgIFwKKwkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAkJCQkJICAgICAgXAorCSAgICAgIHN0cnVjdCBicndfcmVnIHNyYykJCQkJCSAgICAgIFwKK3sJCQkJCQkJCQkgICAgICBcCisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpybmQsICphZGQ7CQkJCQkgICAgICBcCisgICBybmQgPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV8jI09QKTsJCQkJCSAgICAgIFwKKyAgIGJyd19zZXRfZGVzdChwLCBybmQsIGRlc3QpOwkJCQkJCSAgICAgIFwKKyAgIGJyd19zZXRfc3JjMChwLCBybmQsIHNyYyk7CQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgaWYgKHAtPmJydy0+Z2VuIDwgNikgewkJCQkJCSAgICAgIFwKKyAgICAgIC8qIHR1cm4gb24gcm91bmQtaW5jcmVtZW50cyAqLwkJCQkJICAgICAgXAorICAgICAgcm5kLT5oZWFkZXIuZGVzdHJlZ19fY29uZGl0aW9uYWxtb2QgPSBCUldfQ09ORElUSU9OQUxfUjsJCSAgICAgIFwKKyAgICAgIGFkZCA9IGJyd19BREQocCwgZGVzdCwgZGVzdCwgYnJ3X2ltbV9mKDEuMGYpKTsJCQkgICAgICBcCisgICAgICBhZGQtPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IEJSV19QUkVESUNBVEVfTk9STUFMOwkJICAgICAgXAorICAgfQkJCQkJCQkJCSAgICAgIFwKK30KKworCitBTFUxKE1PVikKK0FMVTIoU0VMKQorQUxVMShOT1QpCitBTFUyKEFORCkKK0FMVTIoT1IpCitBTFUyKFhPUikKK0FMVTIoU0hSKQorQUxVMihTSEwpCitBTFUyKEFTUikKK0FMVTEoRjMyVE8xNikKK0FMVTEoRjE2VE8zMikKK0FMVTEoRlJDKQorQUxVMShSTkREKQorQUxVMihNQUMpCitBTFUyKE1BQ0gpCitBTFUxKExaRCkKK0FMVTIoRFA0KQorQUxVMihEUEgpCitBTFUyKERQMykKK0FMVTIoRFAyKQorQUxVMihMSU5FKQorQUxVMihQTE4pCitBTFUzRihNQUQpCitBTFUzRihMUlApCitBTFUxKEJGUkVWKQorQUxVMyhCRkUpCitBTFUyKEJGSTEpCitBTFUzKEJGSTIpCitBTFUxKEZCSCkKK0FMVTEoRkJMKQorQUxVMShDQklUKQorQUxVMihBRERDKQorQUxVMihTVUJCKQorCitST1VORChSTkRaKQorUk9VTkQoUk5ERSkKKworCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfQUREKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCQlzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCQkJCXN0cnVjdCBicndfcmVnIHNyYzAsCisJCQkJc3RydWN0IGJyd19yZWcgc3JjMSkKK3sKKyAgIC8qIDYuMi4yOiBhZGQgKi8KKyAgIGlmIChzcmMwLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRiB8fAorICAgICAgIChzcmMwLmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorCXNyYzAudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9WRikpIHsKKyAgICAgIGFzc2VydChzcmMxLnR5cGUgIT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgYXNzZXJ0KHNyYzEudHlwZSAhPSBCUldfUkVHSVNURVJfVFlQRV9EKTsKKyAgIH0KKworICAgaWYgKHNyYzEudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GIHx8CisgICAgICAgKHNyYzEuZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFICYmCisJc3JjMS50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1ZGKSkgeworICAgICAgYXNzZXJ0KHNyYzAudHlwZSAhPSBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICBhc3NlcnQoc3JjMC50eXBlICE9IEJSV19SRUdJU1RFUl9UWVBFX0QpOworICAgfQorCisgICByZXR1cm4gYnJ3X2FsdTIocCwgQlJXX09QQ09ERV9BREQsIGRlc3QsIHNyYzAsIHNyYzEpOworfQorCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfQVZHKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMSkKK3sKKyAgIGFzc2VydChkZXN0LnR5cGUgPT0gc3JjMC50eXBlKTsKKyAgIGFzc2VydChzcmMwLnR5cGUgPT0gc3JjMS50eXBlKTsKKyAgIHN3aXRjaCAoc3JjMC50eXBlKSB7CisgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX0I6CisgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX1VCOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9XOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9VVzoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRDoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVUQ6CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJCYWQgdHlwZSBmb3IgYnJ3X0FWRyIpOworICAgfQorCisgICByZXR1cm4gYnJ3X2FsdTIocCwgQlJXX09QQ09ERV9BVkcsIGRlc3QsIHNyYzAsIHNyYzEpOworfQorCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfTVVMKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCQlzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCQkJCXN0cnVjdCBicndfcmVnIHNyYzAsCisJCQkJc3RydWN0IGJyd19yZWcgc3JjMSkKK3sKKyAgIC8qIDYuMzIuMzg6IG11bCAqLworICAgaWYgKHNyYzAudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9EIHx8CisgICAgICAgc3JjMC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEIHx8CisgICAgICAgc3JjMS50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0QgfHwKKyAgICAgICBzcmMxLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpIHsKKyAgICAgIGFzc2VydChkZXN0LnR5cGUgIT0gQlJXX1JFR0lTVEVSX1RZUEVfRik7CisgICB9CisKKyAgIGlmIChzcmMwLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRiB8fAorICAgICAgIChzcmMwLmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorCXNyYzAudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9WRikpIHsKKyAgICAgIGFzc2VydChzcmMxLnR5cGUgIT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgYXNzZXJ0KHNyYzEudHlwZSAhPSBCUldfUkVHSVNURVJfVFlQRV9EKTsKKyAgIH0KKworICAgaWYgKHNyYzEudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GIHx8CisgICAgICAgKHNyYzEuZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFICYmCisJc3JjMS50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1ZGKSkgeworICAgICAgYXNzZXJ0KHNyYzAudHlwZSAhPSBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICBhc3NlcnQoc3JjMC50eXBlICE9IEJSV19SRUdJU1RFUl9UWVBFX0QpOworICAgfQorCisgICBhc3NlcnQoc3JjMC5maWxlICE9IEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSB8fAorCSAgc3JjMC5uciAhPSBCUldfQVJGX0FDQ1VNVUxBVE9SKTsKKyAgIGFzc2VydChzcmMxLmZpbGUgIT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFIHx8CisJICBzcmMxLm5yICE9IEJSV19BUkZfQUNDVU1VTEFUT1IpOworCisgICByZXR1cm4gYnJ3X2FsdTIocCwgQlJXX09QQ09ERV9NVUwsIGRlc3QsIHNyYzAsIHNyYzEpOworfQorCisKK3ZvaWQgYnJ3X05PUChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApCit7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfTk9QKTsKKyAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCByZXR5cGUoYnJ3X3ZlYzRfZ3JmKDAsMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgcmV0eXBlKGJyd192ZWM0X2dyZigwLDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIGJyd19pbW1fdWQoMHgwKSk7Cit9CisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb21wYXJpc29ucywgaWYvZWxzZS9lbmRpZgorICovCisKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19KTVBJKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMSkKK3sKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBicndfYWx1MihwLCBCUldfT1BDT0RFX0pNUEksIGRlc3QsIHNyYzAsIHNyYzEpOworCisgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSAxOworICAgaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKyAgIGluc24tPmhlYWRlci5tYXNrX2NvbnRyb2wgPSBCUldfTUFTS19ESVNBQkxFOworCisgICBwLT5jdXJyZW50LT5oZWFkZXIucHJlZGljYXRlX2NvbnRyb2wgPSBCUldfUFJFRElDQVRFX05PTkU7CisKKyAgIHJldHVybiBpbnNuOworfQorCitzdGF0aWMgdm9pZAorcHVzaF9pZl9zdGFjayhzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICBwLT5pZl9zdGFja1twLT5pZl9zdGFja19kZXB0aF0gPSBpbnN0IC0gcC0+c3RvcmU7CisKKyAgIHAtPmlmX3N0YWNrX2RlcHRoKys7CisgICBpZiAocC0+aWZfc3RhY2tfYXJyYXlfc2l6ZSA8PSBwLT5pZl9zdGFja19kZXB0aCkgeworICAgICAgcC0+aWZfc3RhY2tfYXJyYXlfc2l6ZSAqPSAyOworICAgICAgcC0+aWZfc3RhY2sgPSByZXJhbGxvYyhwLT5tZW1fY3R4LCBwLT5pZl9zdGFjaywgaW50LAorCQkJICAgICBwLT5pZl9zdGFja19hcnJheV9zaXplKTsKKyAgIH0KK30KKworc3RhdGljIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKgorcG9wX2lmX3N0YWNrKHN0cnVjdCBicndfY29tcGlsZSAqcCkKK3sKKyAgIHAtPmlmX3N0YWNrX2RlcHRoLS07CisgICByZXR1cm4gJnAtPnN0b3JlW3AtPmlmX3N0YWNrW3AtPmlmX3N0YWNrX2RlcHRoXV07Cit9CisKK3N0YXRpYyB2b2lkCitwdXNoX2xvb3Bfc3RhY2soc3RydWN0IGJyd19jb21waWxlICpwLCBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnN0KQoreworICAgaWYgKHAtPmxvb3Bfc3RhY2tfYXJyYXlfc2l6ZSA8IHAtPmxvb3Bfc3RhY2tfZGVwdGgpIHsKKyAgICAgIHAtPmxvb3Bfc3RhY2tfYXJyYXlfc2l6ZSAqPSAyOworICAgICAgcC0+bG9vcF9zdGFjayA9IHJlcmFsbG9jKHAtPm1lbV9jdHgsIHAtPmxvb3Bfc3RhY2ssIGludCwKKwkJCSAgICAgICBwLT5sb29wX3N0YWNrX2FycmF5X3NpemUpOworICAgICAgcC0+aWZfZGVwdGhfaW5fbG9vcCA9IHJlcmFsbG9jKHAtPm1lbV9jdHgsIHAtPmlmX2RlcHRoX2luX2xvb3AsIGludCwKKwkJCQkgICAgIHAtPmxvb3Bfc3RhY2tfYXJyYXlfc2l6ZSk7CisgICB9CisKKyAgIHAtPmxvb3Bfc3RhY2tbcC0+bG9vcF9zdGFja19kZXB0aF0gPSBpbnN0IC0gcC0+c3RvcmU7CisgICBwLT5sb29wX3N0YWNrX2RlcHRoKys7CisgICBwLT5pZl9kZXB0aF9pbl9sb29wW3AtPmxvb3Bfc3RhY2tfZGVwdGhdID0gMDsKK30KKworc3RhdGljIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKgorZ2V0X2lubmVyX2RvX2luc24oc3RydWN0IGJyd19jb21waWxlICpwKQoreworICAgcmV0dXJuICZwLT5zdG9yZVtwLT5sb29wX3N0YWNrW3AtPmxvb3Bfc3RhY2tfZGVwdGggLSAxXV07Cit9CisKKy8qIEVVIHRha2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBmbGFnIHJlZ2lzdGVyIGFuZCBwdXNoZXMgaXQgb250byBzb21lCisgKiBzb3J0IG9mIGEgc3RhY2sgKHByZXN1bWFibHkgbWVyZ2luZyB3aXRoIGFueSBmbGFnIHZhbHVlIGFscmVhZHkgb24KKyAqIHRoZSBzdGFjaykuICBXaXRoaW4gYW4gaWYgYmxvY2ssIHRoZSBmbGFncyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaworICogY29udHJvbCBleGVjdXRpb24gb24gZWFjaCBjaGFubmVsIG9mIHRoZSB1bml0LCBlZy4gb24gZWFjaCBvZiB0aGUKKyAqIDE2IHBpeGVsIHZhbHVlcyBpbiBvdXIgd20gcHJvZ3JhbXMuCisgKgorICogV2hlbiB0aGUgbWF0Y2hpbmcgJ2Vsc2UnIGluc3RydWN0aW9uIGlzIHJlYWNoZWQgKHByZXN1bWFibHkgYnkKKyAqIGNvdW50ZG93biBvZiB0aGUgaW5zdHJ1Y3Rpb24gY291bnQgcGF0Y2hlZCBpbiBieSBvdXIgRUxTRS9FTkRJRgorICogZnVuY3Rpb25zKSwgdGhlIHJlbGV2YW50IGZsYWdzIGFyZSBpbnZlcnRlZC4KKyAqCisgKiBXaGVuIHRoZSBtYXRjaGluZyAnZW5kaWYnIGluc3RydWN0aW9uIGlzIHJlYWNoZWQsIHRoZSBmbGFncyBhcmUKKyAqIHBvcHBlZCBvZmYuICBJZiB0aGUgc3RhY2sgaXMgbm93IGVtcHR5LCBub3JtYWwgZXhlY3V0aW9uIHJlc3VtZXMuCisgKi8KK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKgorYnJ3X0lGKHN0cnVjdCBicndfY29tcGlsZSAqcCwgdW5zaWduZWQgZXhlY3V0ZV9zaXplKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuOworCisgICBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfSUYpOworCisgICAvKiBPdmVycmlkZSB0aGUgZGVmYXVsdHMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb246CisgICAgKi8KKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBicndfaXBfcmVnKCkpOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIGJyd19pcF9yZWcoKSk7CisgICAgICBicndfc2V0X3NyYzEocCwgaW5zbiwgYnJ3X2ltbV9kKDB4MCkpOworICAgfSBlbHNlIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgYnJ3X2ltbV93KDApKTsKKyAgICAgIGluc24tPmJpdHMxLmJyYW5jaF9nZW42Lmp1bXBfY291bnQgPSAwOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHZlYzEocmV0eXBlKGJyd19udWxsX3JlZygpLCBCUldfUkVHSVNURVJfVFlQRV9EKSkpOworICAgICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIHZlYzEocmV0eXBlKGJyd19udWxsX3JlZygpLCBCUldfUkVHSVNURVJfVFlQRV9EKSkpOworICAgfSBlbHNlIHsKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCB2ZWMxKHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpKTsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCB2ZWMxKHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpKTsKKyAgICAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX3VkKDApKTsKKyAgICAgIGluc24tPmJpdHMzLmJyZWFrX2NvbnQuamlwID0gMDsKKyAgICAgIGluc24tPmJpdHMzLmJyZWFrX2NvbnQudWlwID0gMDsKKyAgIH0KKworICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gZXhlY3V0ZV9zaXplOworICAgaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKyAgIGluc24tPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IEJSV19QUkVESUNBVEVfTk9STUFMOworICAgaW5zbi0+aGVhZGVyLm1hc2tfY29udHJvbCA9IEJSV19NQVNLX0VOQUJMRTsKKyAgIGlmICghcC0+c2luZ2xlX3Byb2dyYW1fZmxvdykKKyAgICAgIGluc24tPmhlYWRlci50aHJlYWRfY29udHJvbCA9IEJSV19USFJFQURfU1dJVENIOworCisgICBwLT5jdXJyZW50LT5oZWFkZXIucHJlZGljYXRlX2NvbnRyb2wgPSBCUldfUFJFRElDQVRFX05PTkU7CisKKyAgIHB1c2hfaWZfc3RhY2socCwgaW5zbik7CisgICBwLT5pZl9kZXB0aF9pbl9sb29wW3AtPmxvb3Bfc3RhY2tfZGVwdGhdKys7CisgICByZXR1cm4gaW5zbjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGdlbjYtc3R5bGUgSUYgaW5zdHJ1Y3Rpb25zIHdpdGggYW4KKyAqIGVtYmVkZGVkIGNvbXBhcmlzb24gKGNvbmRpdGlvbmFsIG1vZGlmaWVyKS4gIEl0IGlzIG5vdCB1c2VkIG9uIGdlbjcuCisgKi8KK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKgorZ2VuNl9JRihzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIHVpbnQzMl90IGNvbmRpdGlvbmFsLAorCXN0cnVjdCBicndfcmVnIHNyYzAsIHN0cnVjdCBicndfcmVnIHNyYzEpCit7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuOworCisgICBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfSUYpOworCisgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgYnJ3X2ltbV93KDApKTsKKyAgIGlmIChwLT5jb21wcmVzc2VkKSB7CisgICAgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSBCUldfRVhFQ1VURV8xNjsKKyAgIH0gZWxzZSB7CisgICAgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSBCUldfRVhFQ1VURV84OworICAgfQorICAgaW5zbi0+Yml0czEuYnJhbmNoX2dlbjYuanVtcF9jb3VudCA9IDA7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgc3JjMCk7CisgICBicndfc2V0X3NyYzEocCwgaW5zbiwgc3JjMSk7CisKKyAgIGFzc2VydChpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9PSBCUldfQ09NUFJFU1NJT05fTk9ORSk7CisgICBhc3NlcnQoaW5zbi0+aGVhZGVyLnByZWRpY2F0ZV9jb250cm9sID09IEJSV19QUkVESUNBVEVfTk9ORSk7CisgICBpbnNuLT5oZWFkZXIuZGVzdHJlZ19fY29uZGl0aW9uYWxtb2QgPSBjb25kaXRpb25hbDsKKworICAgaWYgKCFwLT5zaW5nbGVfcHJvZ3JhbV9mbG93KQorICAgICAgaW5zbi0+aGVhZGVyLnRocmVhZF9jb250cm9sID0gQlJXX1RIUkVBRF9TV0lUQ0g7CisKKyAgIHB1c2hfaWZfc3RhY2socCwgaW5zbik7CisgICByZXR1cm4gaW5zbjsKK30KKworLyoqCisgKiBJbiBzaW5nbGUtcHJvZ3JhbS1mbG93IChTUEYpIG1vZGUsIGNvbnZlcnQgSUYgYW5kIEVMU0UgaW50byBBRERzLgorICovCitzdGF0aWMgdm9pZAorY29udmVydF9JRl9FTFNFX3RvX0FERChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCSAgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppZl9pbnN0LAorCQkgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZWxzZV9pbnN0KQoreworICAgLyogVGhlIG5leHQgaW5zdHJ1Y3Rpb24gKHdoZXJlIHRoZSBFTkRJRiB3b3VsZCBiZSwgaWYgaXQgZXhpc3RlZCkgKi8KKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKm5leHRfaW5zdCA9ICZwLT5zdG9yZVtwLT5ucl9pbnNuXTsKKworICAgYXNzZXJ0KHAtPnNpbmdsZV9wcm9ncmFtX2Zsb3cpOworICAgYXNzZXJ0KGlmX2luc3QgIT0gTlVMTCAmJiBpZl9pbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfSUYpOworICAgYXNzZXJ0KGVsc2VfaW5zdCA9PSBOVUxMIHx8IGVsc2VfaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UpOworICAgYXNzZXJ0KGlmX2luc3QtPmhlYWRlci5leGVjdXRpb25fc2l6ZSA9PSBCUldfRVhFQ1VURV8xKTsKKworICAgLyogQ29udmVydCBJRiB0byBhbiBBREQgaW5zdHJ1Y3Rpb24gdGhhdCBtb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlcgorICAgICogdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIHRoZSBFTFNFIGJsb2NrLiAgSWYgdGhlcmUgaXMgbm8gRUxTRQorICAgICogYmxvY2ssIHBvaW50IHRvIHdoZXJlIEVORElGIHdvdWxkIGJlLiAgUmV2ZXJzZSB0aGUgcHJlZGljYXRlLgorICAgICoKKyAgICAqIFRoZXJlJ3Mgbm8gbmVlZCB0byBleGVjdXRlIGFuIEVORElGIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55CisgICAgKiBzdGFjayBvcGVyYXRpb25zLCBhbmQgaWYgd2UncmUgY3VycmVudGx5IGV4ZWN1dGluZywgd2UganVzdCB3YW50IHRvCisgICAgKiBjb250aW51ZSBub3JtYWxseS4KKyAgICAqLworICAgaWZfaW5zdC0+aGVhZGVyLm9wY29kZSA9IEJSV19PUENPREVfQUREOworICAgaWZfaW5zdC0+aGVhZGVyLnByZWRpY2F0ZV9pbnZlcnNlID0gMTsKKworICAgaWYgKGVsc2VfaW5zdCAhPSBOVUxMKSB7CisgICAgICAvKiBDb252ZXJ0IEVMU0UgdG8gYW4gQUREIGluc3RydWN0aW9uIHRoYXQgcG9pbnRzIHdoZXJlIHRoZSBFTkRJRgorICAgICAgICogd291bGQgYmUuCisgICAgICAgKi8KKyAgICAgIGVsc2VfaW5zdC0+aGVhZGVyLm9wY29kZSA9IEJSV19PUENPREVfQUREOworCisgICAgICBpZl9pbnN0LT5iaXRzMy51ZCA9IChlbHNlX2luc3QgLSBpZl9pbnN0ICsgMSkgKiAxNjsKKyAgICAgIGVsc2VfaW5zdC0+Yml0czMudWQgPSAobmV4dF9pbnN0IC0gZWxzZV9pbnN0KSAqIDE2OworICAgfSBlbHNlIHsKKyAgICAgIGlmX2luc3QtPmJpdHMzLnVkID0gKG5leHRfaW5zdCAtIGlmX2luc3QpICogMTY7CisgICB9Cit9CisKKy8qKgorICogUGF0Y2ggSUYgYW5kIEVMU0UgaW5zdHJ1Y3Rpb25zIHdpdGggYXBwcm9wcmlhdGUganVtcCB0YXJnZXRzLgorICovCitzdGF0aWMgdm9pZAorcGF0Y2hfSUZfRUxTRShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaWZfaW5zdCwKKwkgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICplbHNlX2luc3QsCisJICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZW5kaWZfaW5zdCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworCisgICAvKiBXZSBzaG91bGRuJ3QgYmUgcGF0Y2hpbmcgSUYgYW5kIEVMU0UgaW5zdHJ1Y3Rpb25zIGluIHNpbmdsZSBwcm9ncmFtIGZsb3cKKyAgICAqIG1vZGUgd2hlbiBnZW4gPCA2LCBiZWNhdXNlIGluIHNpbmdsZSBwcm9ncmFtIGZsb3cgbW9kZSBvbiB0aG9zZQorICAgICogcGxhdGZvcm1zLCB3ZSBjb252ZXJ0IGZsb3cgY29udHJvbCBpbnN0cnVjdGlvbnMgdG8gY29uZGl0aW9uYWwgQUREcyB0aGF0CisgICAgKiBvcGVyYXRlIG9uIElQIChzZWUgYnJ3X0VORElGKS4KKyAgICAqCisgICAgKiBIb3dldmVyLCBvbiBHZW42LCB3cml0aW5nIHRvIElQIGRvZXNuJ3Qgd29yayBpbiBzaW5nbGUgcHJvZ3JhbSBmbG93IG1vZGUKKyAgICAqIChzZWUgdGhlIFNhbmR5QnJpZGdlIFBSTSwgVm9sdW1lIDQgcGFydCAyLCBwNzk6ICJXaGVuIFNQRiBpcyBPTiwgSVAgbWF5CisgICAgKiBub3QgYmUgdXBkYXRlZCBieSBub24tZmxvdyBjb250cm9sIGluc3RydWN0aW9ucy4iKS4gIEFuZCBvbiBsYXRlcgorICAgICogcGxhdGZvcm1zLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBiZW5lZml0IHRvIGNvbnZlcnRpbmcgY29udHJvbCBmbG93CisgICAgKiBpbnN0cnVjdGlvbnMgdG8gY29uZGl0aW9uYWwgQUREcy4gIFNvIHdlIGRvIHBhdGNoIElGIGFuZCBFTFNFCisgICAgKiBpbnN0cnVjdGlvbnMgaW4gc2luZ2xlIHByb2dyYW0gZmxvdyBtb2RlIG9uIHRob3NlIHBsYXRmb3Jtcy4KKyAgICAqLworICAgaWYgKGJydy0+Z2VuIDwgNikKKyAgICAgIGFzc2VydCghcC0+c2luZ2xlX3Byb2dyYW1fZmxvdyk7CisKKyAgIGFzc2VydChpZl9pbnN0ICE9IE5VTEwgJiYgaWZfaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0lGKTsKKyAgIGFzc2VydChlbmRpZl9pbnN0ICE9IE5VTEwpOworICAgYXNzZXJ0KGVsc2VfaW5zdCA9PSBOVUxMIHx8IGVsc2VfaW5zdC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UpOworCisgICB1bnNpZ25lZCBiciA9IDE7CisgICAvKiBKdW1wIGNvdW50IGlzIGZvciA2NGJpdCBkYXRhIGNodW5rIGVhY2gsIHNvIG9uZSAxMjhiaXQgaW5zdHJ1Y3Rpb24KKyAgICAqIHJlcXVpcmVzIDIgY2h1bmtzLgorICAgICovCisgICBpZiAoYnJ3LT5nZW4gPj0gNSkKKyAgICAgIGJyID0gMjsKKworICAgYXNzZXJ0KGVuZGlmX2luc3QtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9FTkRJRik7CisgICBlbmRpZl9pbnN0LT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSBpZl9pbnN0LT5oZWFkZXIuZXhlY3V0aW9uX3NpemU7CisKKyAgIGlmIChlbHNlX2luc3QgPT0gTlVMTCkgeworICAgICAgLyogUGF0Y2ggSUYgLT4gRU5ESUYgKi8KKyAgICAgIGlmIChicnctPmdlbiA8IDYpIHsKKwkgLyogVHVybiBpdCBpbnRvIGFuIElGRiwgd2hpY2ggbWVhbnMgbm8gbWFzayBzdGFjayBvcGVyYXRpb25zIGZvcgorCSAgKiBhbGwtZmFsc2UgYW5kIGp1bXBpbmcgcGFzdCB0aGUgRU5ESUYuCisJICAqLworCSBpZl9pbnN0LT5oZWFkZXIub3Bjb2RlID0gQlJXX09QQ09ERV9JRkY7CisJIGlmX2luc3QtPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9IGJyICogKGVuZGlmX2luc3QgLSBpZl9pbnN0ICsgMSk7CisJIGlmX2luc3QtPmJpdHMzLmlmX2Vsc2UucG9wX2NvdW50ID0gMDsKKwkgaWZfaW5zdC0+Yml0czMuaWZfZWxzZS5wYWQwID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPT0gNikgeworCSAvKiBBcyBvZiBnZW42LCB0aGVyZSBpcyBubyBJRkYgYW5kIElGIG11c3QgcG9pbnQgdG8gdGhlIEVORElGLiAqLworCSBpZl9pbnN0LT5iaXRzMS5icmFuY2hfZ2VuNi5qdW1wX2NvdW50ID0gYnIgKiAoZW5kaWZfaW5zdCAtIGlmX2luc3QpOworICAgICAgfSBlbHNlIHsKKwkgaWZfaW5zdC0+Yml0czMuYnJlYWtfY29udC51aXAgPSBiciAqIChlbmRpZl9pbnN0IC0gaWZfaW5zdCk7CisJIGlmX2luc3QtPmJpdHMzLmJyZWFrX2NvbnQuamlwID0gYnIgKiAoZW5kaWZfaW5zdCAtIGlmX2luc3QpOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGVsc2VfaW5zdC0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gaWZfaW5zdC0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplOworCisgICAgICAvKiBQYXRjaCBJRiAtPiBFTFNFICovCisgICAgICBpZiAoYnJ3LT5nZW4gPCA2KSB7CisJIGlmX2luc3QtPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9IGJyICogKGVsc2VfaW5zdCAtIGlmX2luc3QpOworCSBpZl9pbnN0LT5iaXRzMy5pZl9lbHNlLnBvcF9jb3VudCA9IDA7CisJIGlmX2luc3QtPmJpdHMzLmlmX2Vsc2UucGFkMCA9IDA7CisgICAgICB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKwkgaWZfaW5zdC0+Yml0czEuYnJhbmNoX2dlbjYuanVtcF9jb3VudCA9IGJyICogKGVsc2VfaW5zdCAtIGlmX2luc3QgKyAxKTsKKyAgICAgIH0KKworICAgICAgLyogUGF0Y2ggRUxTRSAtPiBFTkRJRiAqLworICAgICAgaWYgKGJydy0+Z2VuIDwgNikgeworCSAvKiBCUldfT1BDT0RFX0VMU0UgcHJlLWdlbjYgc2hvdWxkIHBvaW50IGp1c3QgcGFzdCB0aGUKKwkgICogbWF0Y2hpbmcgRU5ESUYuCisJICAqLworCSBlbHNlX2luc3QtPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9IGJyKihlbmRpZl9pbnN0IC0gZWxzZV9pbnN0ICsgMSk7CisJIGVsc2VfaW5zdC0+Yml0czMuaWZfZWxzZS5wb3BfY291bnQgPSAxOworCSBlbHNlX2luc3QtPmJpdHMzLmlmX2Vsc2UucGFkMCA9IDA7CisgICAgICB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKwkgLyogQlJXX09QQ09ERV9FTFNFIG9uIGdlbjYgc2hvdWxkIHBvaW50IHRvIHRoZSBtYXRjaGluZyBFTkRJRi4gKi8KKwkgZWxzZV9pbnN0LT5iaXRzMS5icmFuY2hfZ2VuNi5qdW1wX2NvdW50ID0gYnIqKGVuZGlmX2luc3QgLSBlbHNlX2luc3QpOworICAgICAgfSBlbHNlIHsKKwkgLyogVGhlIElGIGluc3RydWN0aW9uJ3MgSklQIHNob3VsZCBwb2ludCBqdXN0IHBhc3QgdGhlIEVMU0UgKi8KKwkgaWZfaW5zdC0+Yml0czMuYnJlYWtfY29udC5qaXAgPSBiciAqIChlbHNlX2luc3QgLSBpZl9pbnN0ICsgMSk7CisJIC8qIFRoZSBJRiBpbnN0cnVjdGlvbidzIFVJUCBhbmQgRUxTRSdzIEpJUCBzaG91bGQgcG9pbnQgdG8gRU5ESUYgKi8KKwkgaWZfaW5zdC0+Yml0czMuYnJlYWtfY29udC51aXAgPSBiciAqIChlbmRpZl9pbnN0IC0gaWZfaW5zdCk7CisJIGVsc2VfaW5zdC0+Yml0czMuYnJlYWtfY29udC5qaXAgPSBiciAqIChlbmRpZl9pbnN0IC0gZWxzZV9pbnN0KTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZAorYnJ3X0VMU0Uoc3RydWN0IGJyd19jb21waWxlICpwKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuOworCisgICBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfRUxTRSk7CisKKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBicndfaXBfcmVnKCkpOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIGJyd19pcF9yZWcoKSk7CisgICAgICBicndfc2V0X3NyYzEocCwgaW5zbiwgYnJ3X2ltbV9kKDB4MCkpOworICAgfSBlbHNlIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgYnJ3X2ltbV93KDApKTsKKyAgICAgIGluc24tPmJpdHMxLmJyYW5jaF9nZW42Lmp1bXBfY291bnQgPSAwOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgfSBlbHNlIHsKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCByZXR5cGUoYnJ3X251bGxfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCByZXR5cGUoYnJ3X251bGxfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKyAgICAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX3VkKDApKTsKKyAgICAgIGluc24tPmJpdHMzLmJyZWFrX2NvbnQuamlwID0gMDsKKyAgICAgIGluc24tPmJpdHMzLmJyZWFrX2NvbnQudWlwID0gMDsKKyAgIH0KKworICAgaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKyAgIGluc24tPmhlYWRlci5tYXNrX2NvbnRyb2wgPSBCUldfTUFTS19FTkFCTEU7CisgICBpZiAoIXAtPnNpbmdsZV9wcm9ncmFtX2Zsb3cpCisgICAgICBpbnNuLT5oZWFkZXIudGhyZWFkX2NvbnRyb2wgPSBCUldfVEhSRUFEX1NXSVRDSDsKKworICAgcHVzaF9pZl9zdGFjayhwLCBpbnNuKTsKK30KKwordm9pZAorYnJ3X0VORElGKHN0cnVjdCBicndfY29tcGlsZSAqcCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IE5VTEw7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICplbHNlX2luc3QgPSBOVUxMOworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaWZfaW5zdCA9IE5VTEw7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICp0bXA7CisgICBib29sIGVtaXRfZW5kaWYgPSB0cnVlOworCisgICAvKiBJbiBzaW5nbGUgcHJvZ3JhbSBmbG93IG1vZGUsIHdlIGNhbiBleHByZXNzIElGIGFuZCBFTFNFIGluc3RydWN0aW9ucworICAgICogZXF1aXZhbGVudGx5IGFzIEFERCBpbnN0cnVjdGlvbnMgdGhhdCBvcGVyYXRlIG9uIElQLiAgT24gcGxhdGZvcm1zIHByaW9yCisgICAgKiB0byBHZW42LCBmbG93IGNvbnRyb2wgaW5zdHJ1Y3Rpb25zIGNhdXNlIGFuIGltcGxpZWQgdGhyZWFkIHN3aXRjaCwgc28KKyAgICAqIHRoaXMgaXMgYSBzaWduaWZpY2FudCBzYXZpbmdzLgorICAgICoKKyAgICAqIEhvd2V2ZXIsIG9uIEdlbjYsIHdyaXRpbmcgdG8gSVAgZG9lc24ndCB3b3JrIGluIHNpbmdsZSBwcm9ncmFtIGZsb3cgbW9kZQorICAgICogKHNlZSB0aGUgU2FuZHlCcmlkZ2UgUFJNLCBWb2x1bWUgNCBwYXJ0IDIsIHA3OTogIldoZW4gU1BGIGlzIE9OLCBJUCBtYXkKKyAgICAqIG5vdCBiZSB1cGRhdGVkIGJ5IG5vbi1mbG93IGNvbnRyb2wgaW5zdHJ1Y3Rpb25zLiIpLiAgQW5kIG9uIGxhdGVyCisgICAgKiBwbGF0Zm9ybXMsIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGJlbmVmaXQgdG8gY29udmVydGluZyBjb250cm9sIGZsb3cKKyAgICAqIGluc3RydWN0aW9ucyB0byBjb25kaXRpb25hbCBBRERzLiAgU28gd2Ugb25seSBkbyB0aGlzIHRyaWNrIG9uIEdlbjQgYW5kCisgICAgKiBHZW41LgorICAgICovCisgICBpZiAoYnJ3LT5nZW4gPCA2ICYmIHAtPnNpbmdsZV9wcm9ncmFtX2Zsb3cpCisgICAgICBlbWl0X2VuZGlmID0gZmFsc2U7CisKKyAgIC8qCisgICAgKiBBIHNpbmdsZSBuZXh0X2luc24oKSBtYXkgY2hhbmdlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gc3RvcmUKKyAgICAqIG1lbW9yeShwLT5zdG9yZSksIHNvIGNhbGwgaXQgZmlyc3QgYmVmb3JlIHJlZmVyZW5jaW5nIHRoZSBpbnN0cnVjdGlvbgorICAgICogc3RvcmUgcG9pbnRlciBmcm9tIGFuIGluZGV4CisgICAgKi8KKyAgIGlmIChlbWl0X2VuZGlmKQorICAgICAgaW5zbiA9IG5leHRfaW5zbihwLCBCUldfT1BDT0RFX0VORElGKTsKKworICAgLyogUG9wIHRoZSBJRiBhbmQgKG9wdGlvbmFsKSBFTFNFIGluc3RydWN0aW9ucyBmcm9tIHRoZSBzdGFjayAqLworICAgcC0+aWZfZGVwdGhfaW5fbG9vcFtwLT5sb29wX3N0YWNrX2RlcHRoXS0tOworICAgdG1wID0gcG9wX2lmX3N0YWNrKHApOworICAgaWYgKHRtcC0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0VMU0UpIHsKKyAgICAgIGVsc2VfaW5zdCA9IHRtcDsKKyAgICAgIHRtcCA9IHBvcF9pZl9zdGFjayhwKTsKKyAgIH0KKyAgIGlmX2luc3QgPSB0bXA7CisKKyAgIGlmICghZW1pdF9lbmRpZikgeworICAgICAgLyogRU5ESUYgaXMgdXNlbGVzczsgZG9uJ3QgYm90aGVyIGVtaXR0aW5nIGl0LiAqLworICAgICAgY29udmVydF9JRl9FTFNFX3RvX0FERChwLCBpZl9pbnN0LCBlbHNlX2luc3QpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoYnJ3LT5nZW4gPCA2KSB7CisgICAgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgcmV0eXBlKGJyd192ZWM0X2dyZigwLDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShicndfdmVjNF9ncmYoMCwwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKyAgICAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX2QoMHgwKSk7CisgICB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBicndfaW1tX3coMCkpOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgfSBlbHNlIHsKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCByZXR5cGUoYnJ3X251bGxfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCByZXR5cGUoYnJ3X251bGxfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKyAgICAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX3VkKDApKTsKKyAgIH0KKworICAgaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKyAgIGluc24tPmhlYWRlci5tYXNrX2NvbnRyb2wgPSBCUldfTUFTS19FTkFCTEU7CisgICBpbnNuLT5oZWFkZXIudGhyZWFkX2NvbnRyb2wgPSBCUldfVEhSRUFEX1NXSVRDSDsKKworICAgLyogQWxzbyBwb3AgaXRlbSBvZmYgdGhlIHN0YWNrIGluIHRoZSBlbmRpZiBpbnN0cnVjdGlvbjogKi8KKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIGluc24tPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9IDA7CisgICAgICBpbnNuLT5iaXRzMy5pZl9lbHNlLnBvcF9jb3VudCA9IDE7CisgICAgICBpbnNuLT5iaXRzMy5pZl9lbHNlLnBhZDAgPSAwOworICAgfSBlbHNlIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICBpbnNuLT5iaXRzMS5icmFuY2hfZ2VuNi5qdW1wX2NvdW50ID0gMjsKKyAgIH0gZWxzZSB7CisgICAgICBpbnNuLT5iaXRzMy5icmVha19jb250LmppcCA9IDI7CisgICB9CisgICBwYXRjaF9JRl9FTFNFKHAsIGlmX2luc3QsIGVsc2VfaW5zdCwgaW5zbik7Cit9CisKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19CUkVBSyhzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc247CisKKyAgIGluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9CUkVBSyk7CisgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIGJyd19pbW1fZCgweDApKTsKKyAgIH0gZWxzZSB7CisgICAgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgYnJ3X2lwX3JlZygpKTsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBicndfaXBfcmVnKCkpOworICAgICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIGJyd19pbW1fZCgweDApKTsKKyAgICAgIGluc24tPmJpdHMzLmlmX2Vsc2UucGFkMCA9IDA7CisgICAgICBpbnNuLT5iaXRzMy5pZl9lbHNlLnBvcF9jb3VudCA9IHAtPmlmX2RlcHRoX2luX2xvb3BbcC0+bG9vcF9zdGFja19kZXB0aF07CisgICB9CisgICBpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9IEJSV19DT01QUkVTU0lPTl9OT05FOworICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gQlJXX0VYRUNVVEVfODsKKworICAgcmV0dXJuIGluc247Cit9CisKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmdlbjZfQ09OVChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApCit7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuOworCisgICBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfQ09OVElOVUUpOworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIGJyd19pcF9yZWcoKSk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgYnJ3X2lwX3JlZygpKTsKKyAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX2QoMHgwKSk7CisKKyAgIGluc24tPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gQlJXX0NPTVBSRVNTSU9OX05PTkU7CisgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSBCUldfRVhFQ1VURV84OworICAgcmV0dXJuIGluc247Cit9CisKK3N0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19DT05UKHN0cnVjdCBicndfY29tcGlsZSAqcCkKK3sKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc247CisgICBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfQ09OVElOVUUpOworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIGJyd19pcF9yZWcoKSk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgYnJ3X2lwX3JlZygpKTsKKyAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX2QoMHgwKSk7CisgICBpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9IEJSV19DT01QUkVTU0lPTl9OT05FOworICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gQlJXX0VYRUNVVEVfODsKKyAgIC8qIGluc24tPmhlYWRlci5tYXNrX2NvbnRyb2wgPSBCUldfTUFTS19ESVNBQkxFOyAqLworICAgaW5zbi0+Yml0czMuaWZfZWxzZS5wYWQwID0gMDsKKyAgIGluc24tPmJpdHMzLmlmX2Vsc2UucG9wX2NvdW50ID0gcC0+aWZfZGVwdGhfaW5fbG9vcFtwLT5sb29wX3N0YWNrX2RlcHRoXTsKKyAgIHJldHVybiBpbnNuOworfQorCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpnZW42X0hBTFQoc3RydWN0IGJyd19jb21waWxlICpwKQoreworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbjsKKworICAgaW5zbiA9IG5leHRfaW5zbihwLCBCUldfT1BDT0RFX0hBTFQpOworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIGJyd19pbW1fZCgweDApKTsgLyogVUlQIGFuZCBKSVAsIHVwZGF0ZWQgbGF0ZXIuICovCisKKyAgIGlmIChwLT5jb21wcmVzc2VkKSB7CisgICAgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSBCUldfRVhFQ1VURV8xNjsKKyAgIH0gZWxzZSB7CisgICAgICBpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9IEJSV19DT01QUkVTU0lPTl9OT05FOworICAgICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gQlJXX0VYRUNVVEVfODsKKyAgIH0KKyAgIHJldHVybiBpbnNuOworfQorCisvKiBETy9XSElMRSBsb29wOgorICoKKyAqIFRoZSBETy9XSElMRSBpcyBqdXN0IGFuIHVudGVybWluYXRlZCBsb29wIC0tIGJyZWFrIG9yIGNvbnRpbnVlIGFyZQorICogdXNlZCBmb3IgY29udHJvbCB3aXRoaW4gdGhlIGxvb3AuICBXZSBoYXZlIGEgZmV3IHdheXMgdGhleSBjYW4gYmUKKyAqIGRvbmUuCisgKgorICogRm9yIHVuaWZvcm0gY29udHJvbCBmbG93LCB0aGUgV0hJTEUgaXMganVzdCBhIGp1bXAsIHNvIEFERCBpcCwgaXAsCisgKiBqaXAgYW5kIG5vIERPIGluc3RydWN0aW9uLgorICoKKyAqIEZvciBub24tdW5pZm9ybSBjb250cm9sIGZsb3cgcHJlLWdlbjYsIHRoZXJlJ3MgYSBETyBpbnN0cnVjdGlvbiB0bworICogcHVzaCB0aGUgbWFzaywgYW5kIGEgV0hJTEUgdG8ganVtcCBiYWNrLCBhbmQgQlJFQUsgdG8gZ2V0IG91dCBhbmQKKyAqIHBvcCB0aGUgbWFzay4KKyAqCisgKiBGb3IgZ2VuNiwgdGhlcmUncyBubyBtb3JlIG1hc2sgc3RhY2ssIHNvIG5vIG5lZWQgZm9yIERPLiAgV0hJTEUKKyAqIGp1c3QgcG9pbnRzIGJhY2sgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIHRoZSBsb29wLgorICovCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpicndfRE8oc3RydWN0IGJyd19jb21waWxlICpwLCB1bnNpZ25lZCBleGVjdXRlX3NpemUpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKworICAgaWYgKGJydy0+Z2VuID49IDYgfHwgcC0+c2luZ2xlX3Byb2dyYW1fZmxvdykgeworICAgICAgcHVzaF9sb29wX3N0YWNrKHAsICZwLT5zdG9yZVtwLT5ucl9pbnNuXSk7CisgICAgICByZXR1cm4gJnAtPnN0b3JlW3AtPm5yX2luc25dOworICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9ETyk7CisKKyAgICAgIHB1c2hfbG9vcF9zdGFjayhwLCBpbnNuKTsKKworICAgICAgLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZvciB0aGlzIGluc3RydWN0aW9uOgorICAgICAgICovCisgICAgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgYnJ3X251bGxfcmVnKCkpOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIGJyd19udWxsX3JlZygpKTsKKyAgICAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfbnVsbF9yZWcoKSk7CisKKyAgICAgIGluc24tPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gQlJXX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICBpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPSBleGVjdXRlX3NpemU7CisgICAgICBpbnNuLT5oZWFkZXIucHJlZGljYXRlX2NvbnRyb2wgPSBCUldfUFJFRElDQVRFX05PTkU7CisgICAgICAvKiBpbnNuLT5oZWFkZXIubWFza19jb250cm9sID0gQlJXX01BU0tfRU5BQkxFOyAqLworICAgICAgLyogaW5zbi0+aGVhZGVyLm1hc2tfY29udHJvbCA9IEJSV19NQVNLX0RJU0FCTEU7ICovCisKKyAgICAgIHJldHVybiBpbnNuOworICAgfQorfQorCisvKioKKyAqIEZvciBwcmUtZ2VuNiwgd2UgcGF0Y2ggQlJFQUsvQ09OVCBpbnN0cnVjdGlvbnMgdG8gcG9pbnQgYXQgdGhlIFdISUxFCisgKiBpbnN0cnVjdGlvbiBoZXJlLgorICoKKyAqIEZvciBnZW42Kywgc2VlIGJyd19zZXRfdWlwX2ppcCgpLCB3aGljaCBkb2Vzbid0IGNhcmUgc28gbXVjaCBhYm91dCB0aGUgbG9vcAorICogbmVzdGluZywgc2luY2UgaXQgY2FuIGFsd2F5cyBqdXN0IHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrL2N1cnJlbnQgbG9vcC4KKyAqLworc3RhdGljIHZvaWQKK2Jyd19wYXRjaF9icmVha19jb250KHN0cnVjdCBicndfY29tcGlsZSAqcCwgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqd2hpbGVfaW5zdCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqZG9faW5zdCA9IGdldF9pbm5lcl9kb19pbnNuKHApOworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zdDsKKyAgIGludCBiciA9IChicnctPmdlbiA9PSA1KSA/IDIgOiAxOworCisgICBmb3IgKGluc3QgPSB3aGlsZV9pbnN0IC0gMTsgaW5zdCAhPSBkb19pbnN0OyBpbnN0LS0pIHsKKyAgICAgIC8qIElmIHRoZSBqdW1wIGNvdW50IGlzICE9IDAsIHRoYXQgbWVhbnMgdGhhdCB0aGlzIGluc3RydWN0aW9uIGhhcyBhbHJlYWR5CisgICAgICAgKiBiZWVuIHBhdGNoZWQgYmVjYXVzZSBpdCdzIHBhcnQgb2YgYSBsb29wIGluc2lkZSBvZiB0aGUgb25lIHdlJ3JlCisgICAgICAgKiBwYXRjaGluZy4KKyAgICAgICAqLworICAgICAgaWYgKGluc3QtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9CUkVBSyAmJgorCSAgaW5zdC0+Yml0czMuaWZfZWxzZS5qdW1wX2NvdW50ID09IDApIHsKKwkgaW5zdC0+Yml0czMuaWZfZWxzZS5qdW1wX2NvdW50ID0gYnIgKiAoKHdoaWxlX2luc3QgLSBpbnN0KSArIDEpOworICAgICAgfSBlbHNlIGlmIChpbnN0LT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfQ09OVElOVUUgJiYKKwkJIGluc3QtPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9PSAwKSB7CisJIGluc3QtPmJpdHMzLmlmX2Vsc2UuanVtcF9jb3VudCA9IGJyICogKHdoaWxlX2luc3QgLSBpbnN0KTsKKyAgICAgIH0KKyAgIH0KK30KKworc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqYnJ3X1dISUxFKHN0cnVjdCBicndfY29tcGlsZSAqcCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwgKmRvX2luc247CisgICB1bnNpZ25lZCBiciA9IDE7CisKKyAgIGlmIChicnctPmdlbiA+PSA1KQorICAgICAgYnIgPSAyOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgaW5zbiA9IG5leHRfaW5zbihwLCBCUldfT1BDT0RFX1dISUxFKTsKKyAgICAgIGRvX2luc24gPSBnZXRfaW5uZXJfZG9faW5zbihwKTsKKworICAgICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgICAgYnJ3X3NldF9zcmMxKHAsIGluc24sIGJyd19pbW1fdWQoMCkpOworICAgICAgaW5zbi0+Yml0czMuYnJlYWtfY29udC5qaXAgPSBiciAqIChkb19pbnNuIC0gaW5zbik7CisKKyAgICAgIGluc24tPmhlYWRlci5leGVjdXRpb25fc2l6ZSA9IEJSV19FWEVDVVRFXzg7CisgICB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKyAgICAgIGluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9XSElMRSk7CisgICAgICBkb19pbnNuID0gZ2V0X2lubmVyX2RvX2luc24ocCk7CisKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBicndfaW1tX3coMCkpOworICAgICAgaW5zbi0+Yml0czEuYnJhbmNoX2dlbjYuanVtcF9jb3VudCA9IGJyICogKGRvX2luc24gLSBpbnNuKTsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCByZXR5cGUoYnJ3X251bGxfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKyAgICAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCByZXR5cGUoYnJ3X251bGxfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKworICAgICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gQlJXX0VYRUNVVEVfODsKKyAgIH0gZWxzZSB7CisgICAgICBpZiAocC0+c2luZ2xlX3Byb2dyYW1fZmxvdykgeworCSBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfQUREKTsKKyAgICAgICAgIGRvX2luc24gPSBnZXRfaW5uZXJfZG9faW5zbihwKTsKKworCSBicndfc2V0X2Rlc3QocCwgaW5zbiwgYnJ3X2lwX3JlZygpKTsKKwkgYnJ3X3NldF9zcmMwKHAsIGluc24sIGJyd19pcF9yZWcoKSk7CisJIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX2QoKGRvX2luc24gLSBpbnNuKSAqIDE2KSk7CisJIGluc24tPmhlYWRlci5leGVjdXRpb25fc2l6ZSA9IEJSV19FWEVDVVRFXzE7CisgICAgICB9IGVsc2UgeworCSBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfV0hJTEUpOworICAgICAgICAgZG9faW5zbiA9IGdldF9pbm5lcl9kb19pbnNuKHApOworCisJIGFzc2VydChkb19pbnNuLT5oZWFkZXIub3Bjb2RlID09IEJSV19PUENPREVfRE8pOworCisJIGJyd19zZXRfZGVzdChwLCBpbnNuLCBicndfaXBfcmVnKCkpOworCSBicndfc2V0X3NyYzAocCwgaW5zbiwgYnJ3X2lwX3JlZygpKTsKKwkgYnJ3X3NldF9zcmMxKHAsIGluc24sIGJyd19pbW1fZCgwKSk7CisKKwkgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gZG9faW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplOworCSBpbnNuLT5iaXRzMy5pZl9lbHNlLmp1bXBfY291bnQgPSBiciAqIChkb19pbnNuIC0gaW5zbiArIDEpOworCSBpbnNuLT5iaXRzMy5pZl9lbHNlLnBvcF9jb3VudCA9IDA7CisJIGluc24tPmJpdHMzLmlmX2Vsc2UucGFkMCA9IDA7CisKKwkgYnJ3X3BhdGNoX2JyZWFrX2NvbnQocCwgaW5zbik7CisgICAgICB9CisgICB9CisgICBpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCA9IEJSV19DT01QUkVTU0lPTl9OT05FOworICAgcC0+Y3VycmVudC0+aGVhZGVyLnByZWRpY2F0ZV9jb250cm9sID0gQlJXX1BSRURJQ0FURV9OT05FOworCisgICBwLT5sb29wX3N0YWNrX2RlcHRoLS07CisKKyAgIHJldHVybiBpbnNuOworfQorCisKKy8qIEZPUldBUkQgSlVNUFM6CisgKi8KK3ZvaWQgYnJ3X2xhbmRfZndkX2p1bXAoc3RydWN0IGJyd19jb21waWxlICpwLCBpbnQgam1wX2luc25faWR4KQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpqbXBfaW5zbiA9ICZwLT5zdG9yZVtqbXBfaW5zbl9pZHhdOworICAgdW5zaWduZWQgam1waSA9IDE7CisKKyAgIGlmIChicnctPmdlbiA+PSA1KQorICAgICAgam1waSA9IDI7CisKKyAgIGFzc2VydChqbXBfaW5zbi0+aGVhZGVyLm9wY29kZSA9PSBCUldfT1BDT0RFX0pNUEkpOworICAgYXNzZXJ0KGptcF9pbnNuLT5iaXRzMS5kYTEuc3JjMV9yZWdfZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFKTsKKworICAgam1wX2luc24tPmJpdHMzLnVkID0gam1waSAqIChwLT5ucl9pbnNuIC0gam1wX2luc25faWR4IC0gMSk7Cit9CisKKworCisvKiBUbyBpbnRlZ3JhdGUgd2l0aCB0aGUgYWJvdmUsIGl0IG1ha2VzIHNlbnNlIHRoYXQgdGhlIGNvbXBhcmlzb24KKyAqIGluc3RydWN0aW9uIHNob3VsZCBwb3B1bGF0ZSB0aGUgZmxhZyByZWdpc3Rlci4gIEl0IG1pZ2h0IGJlIHNpbXBsZXIKKyAqIGp1c3QgdG8gdXNlIHRoZSBmbGFnIHJlZyBmb3IgbW9zdCBXTSB0YXNrcz8KKyAqLwordm9pZCBicndfQ01QKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkgICAgIHN0cnVjdCBicndfcmVnIGRlc3QsCisJICAgICB1bnNpZ25lZCBjb25kaXRpb25hbCwKKwkgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisJICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfQ01QKTsKKworICAgaW5zbi0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gY29uZGl0aW9uYWw7CisgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgZGVzdCk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgc3JjMCk7CisgICBicndfc2V0X3NyYzEocCwgaW5zbiwgc3JjMSk7CisKKy8qICAgIGd1ZXNzX2V4ZWN1dGlvbl9zaXplKGluc24sIHNyYzApOyAqLworCisKKyAgIC8qIE1ha2UgaXQgc28gdGhhdCBmdXR1cmUgaW5zdHJ1Y3Rpb25zIHdpbGwgdXNlIHRoZSBjb21wdXRlZCBmbGFnCisgICAgKiB2YWx1ZSB1bnRpbCBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sX2ZsYWdfdmFsdWUoKSBpcyBjYWxsZWQKKyAgICAqIGFnYWluLgorICAgICovCisgICBpZiAoZGVzdC5maWxlID09IEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSAmJgorICAgICAgIGRlc3QubnIgPT0gMCkgeworICAgICAgcC0+Y3VycmVudC0+aGVhZGVyLnByZWRpY2F0ZV9jb250cm9sID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICAgICBwLT5mbGFnX3ZhbHVlID0gMHhmZjsKKyAgIH0KKworICAgLyogSXRlbSBXYUNNUEluc3ROdWxsRHN0Rm9yY2VzVGhyZWFkU3dpdGNoIGluIHRoZSBIYXN3ZWxsIEJzcGVjIHdvcmthcm91bmRzCisgICAgKiBwYWdlIHNheXM6CisgICAgKiAgICAiQW55IENNUCBpbnN0cnVjdGlvbiB3aXRoIGEgbnVsbCBkZXN0aW5hdGlvbiBtdXN0IHVzZSBhIHtzd2l0Y2h9LiIKKyAgICAqCisgICAgKiBJdCBhbHNvIGFwcGxpZXMgdG8gb3RoZXIgR2VuNyBwbGF0Zm9ybXMgKElWQiwgQllUKSBldmVuIHRob3VnaCBpdCBpc24ndAorICAgICogbWVudGlvbmVkIG9uIHRoZWlyIHdvcmstYXJvdW5kcyBwYWdlcy4KKyAgICAqLworICAgaWYgKGJydy0+Z2VuID09IDcpIHsKKyAgICAgIGlmIChkZXN0LmZpbGUgPT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFICYmCisgICAgICAgICAgZGVzdC5uciA9PSBCUldfQVJGX05VTEwpIHsKKyAgICAgICAgIGluc24tPmhlYWRlci50aHJlYWRfY29udHJvbCA9IEJSV19USFJFQURfU1dJVENIOworICAgICAgfQorICAgfQorfQorCisvKiBJc3N1ZSAnd2FpdCcgaW5zdHJ1Y3Rpb24gZm9yIG4xLCBob3N0IGNvdWxkIHByb2dyYW0gTU1JTworICAgdG8gd2FrZSB1cCB0aHJlYWQuICovCit2b2lkIGJyd19XQUlUIChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnApCit7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfV0FJVCk7CisgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMgPSBicndfbm90aWZpY2F0aW9uXzFfcmVnKCk7CisKKyAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBzcmMpOworICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHNyYyk7CisgICBicndfc2V0X3NyYzEocCwgaW5zbiwgYnJ3X251bGxfcmVnKCkpOworICAgaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID0gMDsgLyogbXVzdCAqLworICAgaW5zbi0+aGVhZGVyLnByZWRpY2F0ZV9jb250cm9sID0gMDsKKyAgIGluc24tPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhlbHBlcnMgZm9yIHRoZSB2YXJpb3VzIFNFTkQgbWVzc2FnZSB0eXBlczoKKyAqLworCisvKiogRXh0ZW5kZWQgbWF0aCBmdW5jdGlvbiwgZmxvYXRbOF0uCisgKi8KK3ZvaWQgYnJ3X21hdGgoIHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkgICAgICAgdW5zaWduZWQgZnVuY3Rpb24sCisJICAgICAgIHVuc2lnbmVkIG1zZ19yZWdfbnIsCisJICAgICAgIHN0cnVjdCBicndfcmVnIHNyYywKKwkgICAgICAgdW5zaWduZWQgZGF0YV90eXBlLAorCSAgICAgICB1bnNpZ25lZCBwcmVjaXNpb24gKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisKKyAgIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfTUFUSCk7CisKKyAgICAgIGFzc2VydChkZXN0LmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSB8fAorICAgICAgICAgICAgIChicnctPmdlbiA+PSA3ICYmIGRlc3QuZmlsZSA9PSBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFKSk7CisgICAgICBhc3NlcnQoc3JjLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7CisKKyAgICAgIGFzc2VydChkZXN0LmhzdHJpZGUgPT0gQlJXX0hPUklaT05UQUxfU1RSSURFXzEpOworICAgICAgaWYgKGJydy0+Z2VuID09IDYpCisJIGFzc2VydChzcmMuaHN0cmlkZSA9PSBCUldfSE9SSVpPTlRBTF9TVFJJREVfMSk7CisKKyAgICAgIC8qIFNvdXJjZSBtb2RpZmllcnMgYXJlIGlnbm9yZWQgZm9yIGV4dGVuZGVkIG1hdGggaW5zdHJ1Y3Rpb25zIG9uIEdlbjYuICovCisgICAgICBpZiAoYnJ3LT5nZW4gPT0gNikgeworCSBhc3NlcnQoIXNyYy5uZWdhdGUpOworCSBhc3NlcnQoIXNyYy5hYnMpOworICAgICAgfQorCisgICAgICBpZiAoZnVuY3Rpb24gPT0gQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9RVU9USUVOVCB8fAorCSAgZnVuY3Rpb24gPT0gQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9SRU1BSU5ERVIgfHwKKwkgIGZ1bmN0aW9uID09IEJSV19NQVRIX0ZVTkNUSU9OX0lOVF9ESVZfUVVPVElFTlRfQU5EX1JFTUFJTkRFUikgeworCSBhc3NlcnQoc3JjLnR5cGUgIT0gQlJXX1JFR0lTVEVSX1RZUEVfRik7CisgICAgICB9IGVsc2UgeworCSBhc3NlcnQoc3JjLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRik7CisgICAgICB9CisKKyAgICAgIC8qIE1hdGggaXMgdGhlIHNhbWUgSVNBIGZvcm1hdCBhcyBvdGhlciBvcGNvZGVzLCBleGNlcHQgdGhhdCBDb25kTW9kaWZpZXIKKyAgICAgICAqIGJlY29tZXMgRkNbMzowXSBhbmQgVGhyZWFkQ3RybCBiZWNvbWVzIEZDWzU6NF0uCisgICAgICAgKi8KKyAgICAgIGluc24tPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCA9IGZ1bmN0aW9uOworCisgICAgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgZGVzdCk7CisgICAgICBicndfc2V0X3NyYzAocCwgaW5zbiwgc3JjKTsKKyAgICAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfbnVsbF9yZWcoKSk7CisgICB9IGVsc2UgeworICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IG5leHRfaW5zbihwLCBCUldfT1BDT0RFX1NFTkQpOworCisgICAgICAvKiBFeGFtcGxlIGNvZGUgZG9lc24ndCBzZXQgcHJlZGljYXRlX2NvbnRyb2wgZm9yIHNlbmQKKyAgICAgICAqIGluc3RydWN0aW9ucy4KKyAgICAgICAqLworICAgICAgaW5zbi0+aGVhZGVyLnByZWRpY2F0ZV9jb250cm9sID0gMDsKKyAgICAgIGluc24tPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCA9IG1zZ19yZWdfbnI7CisKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBkZXN0KTsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBzcmMpOworICAgICAgYnJ3X3NldF9tYXRoX21lc3NhZ2UocCwKKwkJCSAgIGluc24sCisJCQkgICBmdW5jdGlvbiwKKwkJCSAgIHNyYy50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0QsCisJCQkgICBwcmVjaXNpb24sCisJCQkgICBkYXRhX3R5cGUpOworICAgfQorfQorCisvKiogRXh0ZW5kZWQgbWF0aCBmdW5jdGlvbiwgZmxvYXRbOF0uCisgKi8KK3ZvaWQgYnJ3X21hdGgyKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkgICAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkgICAgICAgdW5zaWduZWQgZnVuY3Rpb24sCisJICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisJICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzEpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9NQVRIKTsKKworICAgYXNzZXJ0KGRlc3QuZmlsZSA9PSBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFIHx8CisgICAgICAgICAgKGJydy0+Z2VuID49IDcgJiYgZGVzdC5maWxlID09IEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUpKTsKKyAgIGFzc2VydChzcmMwLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7CisgICBhc3NlcnQoc3JjMS5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpOworCisgICBhc3NlcnQoZGVzdC5oc3RyaWRlID09IEJSV19IT1JJWk9OVEFMX1NUUklERV8xKTsKKyAgIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICBhc3NlcnQoc3JjMC5oc3RyaWRlID09IEJSV19IT1JJWk9OVEFMX1NUUklERV8xKTsKKyAgICAgIGFzc2VydChzcmMxLmhzdHJpZGUgPT0gQlJXX0hPUklaT05UQUxfU1RSSURFXzEpOworICAgfQorCisgICBpZiAoZnVuY3Rpb24gPT0gQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9RVU9USUVOVCB8fAorICAgICAgIGZ1bmN0aW9uID09IEJSV19NQVRIX0ZVTkNUSU9OX0lOVF9ESVZfUkVNQUlOREVSIHx8CisgICAgICAgZnVuY3Rpb24gPT0gQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9RVU9USUVOVF9BTkRfUkVNQUlOREVSKSB7CisgICAgICBhc3NlcnQoc3JjMC50eXBlICE9IEJSV19SRUdJU1RFUl9UWVBFX0YpOworICAgICAgYXNzZXJ0KHNyYzEudHlwZSAhPSBCUldfUkVHSVNURVJfVFlQRV9GKTsKKyAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoc3JjMC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0YpOworICAgICAgYXNzZXJ0KHNyYzEudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GKTsKKyAgIH0KKworICAgLyogU291cmNlIG1vZGlmaWVycyBhcmUgaWdub3JlZCBmb3IgZXh0ZW5kZWQgbWF0aCBpbnN0cnVjdGlvbnMgb24gR2VuNi4gKi8KKyAgIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICBhc3NlcnQoIXNyYzAubmVnYXRlKTsKKyAgICAgIGFzc2VydCghc3JjMC5hYnMpOworICAgICAgYXNzZXJ0KCFzcmMxLm5lZ2F0ZSk7CisgICAgICBhc3NlcnQoIXNyYzEuYWJzKTsKKyAgIH0KKworICAgLyogTWF0aCBpcyB0aGUgc2FtZSBJU0EgZm9ybWF0IGFzIG90aGVyIG9wY29kZXMsIGV4Y2VwdCB0aGF0IENvbmRNb2RpZmllcgorICAgICogYmVjb21lcyBGQ1szOjBdIGFuZCBUaHJlYWRDdHJsIGJlY29tZXMgRkNbNTo0XS4KKyAgICAqLworICAgaW5zbi0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gZnVuY3Rpb247CisKKyAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBkZXN0KTsKKyAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBzcmMwKTsKKyAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBzcmMxKTsKK30KKworCisvKioKKyAqIFdyaXRlIGEgYmxvY2sgb2YgT1dPUkRzIChoYWxmIGEgR1JGIGVhY2gpIGZyb20gdGhlIHNjcmF0Y2ggYnVmZmVyLAorICogdXNpbmcgYSBjb25zdGFudCBvZmZzZXQgcGVyIGNoYW5uZWwuCisgKgorICogVGhlIG9mZnNldCBtdXN0IGJlIGFsaWduZWQgdG8gb3dvcmQgc2l6ZSAoMTYgYnl0ZXMpLiAgVXNlZCBmb3IKKyAqIHJlZ2lzdGVyIHNwaWxsaW5nLgorICovCit2b2lkIGJyd19vd29yZF9ibG9ja193cml0ZV9zY3JhdGNoKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCQkgICBzdHJ1Y3QgYnJ3X3JlZyBtcmYsCisJCQkJICAgaW50IG51bV9yZWdzLAorCQkJCSAgIHVuc2lnbmVkIG9mZnNldCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgdWludDMyX3QgbXNnX2NvbnRyb2wsIG1zZ190eXBlOworICAgaW50IG1sZW47CisKKyAgIGlmIChicnctPmdlbiA+PSA2KQorICAgICAgb2Zmc2V0IC89IDE2OworCisgICBtcmYgPSByZXR5cGUobXJmLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisKKyAgIGlmIChudW1fcmVncyA9PSAxKSB7CisgICAgICBtc2dfY29udHJvbCA9IEJSV19EQVRBUE9SVF9PV09SRF9CTE9DS18yX09XT1JEUzsKKyAgICAgIG1sZW4gPSAyOworICAgfSBlbHNlIHsKKyAgICAgIG1zZ19jb250cm9sID0gQlJXX0RBVEFQT1JUX09XT1JEX0JMT0NLXzRfT1dPUkRTOworICAgICAgbWxlbiA9IDM7CisgICB9CisKKyAgIC8qIFNldCB1cCB0aGUgbWVzc2FnZSBoZWFkZXIuICBUaGlzIGlzIGcwLCB3aXRoIGcwLjIgZmlsbGVkIHdpdGgKKyAgICAqIHRoZSBvZmZzZXQuICBXZSBkb24ndCB3YW50IHRvIGxlYXZlIG91ciBvZmZzZXQgYXJvdW5kIGluIGcwIG9yCisgICAgKiBpdCdsbCBzY3JldyB1cCB0ZXh0dXJlIHNhbXBsZXMsIHNvIHNldCBpdCB1cCBpbnNpZGUgdGhlIG1lc3NhZ2UKKyAgICAqIHJlZy4KKyAgICAqLworICAgeworICAgICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgICAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKworICAgICAgYnJ3X01PVihwLCBtcmYsIHJldHlwZShicndfdmVjOF9ncmYoMCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisKKyAgICAgIC8qIHNldCBtZXNzYWdlIGhlYWRlciBnbG9iYWwgb2Zmc2V0IGZpZWxkIChyZWcgMCwgZWxlbWVudCAyKSAqLworICAgICAgYnJ3X01PVihwLAorCSAgICAgIHJldHlwZShicndfdmVjMV9yZWcoQlJXX01FU1NBR0VfUkVHSVNURVJfRklMRSwKKwkJCQkgIG1yZi5uciwKKwkJCQkgIDIpLCBCUldfUkVHSVNURVJfVFlQRV9VRCksCisJICAgICAgYnJ3X2ltbV91ZChvZmZzZXQpKTsKKworICAgICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworICAgfQorCisgICB7CisgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0OworICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IG5leHRfaW5zbihwLCBCUldfT1BDT0RFX1NFTkQpOworICAgICAgaW50IHNlbmRfY29tbWl0X21zZzsKKyAgICAgIHN0cnVjdCBicndfcmVnIHNyY19oZWFkZXIgPSByZXR5cGUoYnJ3X3ZlYzhfZ3JmKDAsIDApLAorCQkJCQkgQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworCisgICAgICBpZiAoaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgIT0gQlJXX0NPTVBSRVNTSU9OX05PTkUpIHsKKwkgaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKwkgc3JjX2hlYWRlciA9IHZlYzE2KHNyY19oZWFkZXIpOworICAgICAgfQorICAgICAgYXNzZXJ0KGluc24tPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9PSBCUldfUFJFRElDQVRFX05PTkUpOworICAgICAgaW5zbi0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gbXJmLm5yOworCisgICAgICAvKiBVbnRpbCBnZW42LCB3cml0ZXMgZm9sbG93ZWQgYnkgcmVhZHMgZnJvbSB0aGUgc2FtZSBsb2NhdGlvbgorICAgICAgICogYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIG9yZGVyZWQgdW5sZXNzIHdyaXRlX2NvbW1pdCBpcyBzZXQuCisgICAgICAgKiBJZiBzZXQsIHRoZW4gYSBuby1vcCB3cml0ZSBpcyBpc3N1ZWQgdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgKiByZWdpc3RlciB0byBzZXQgYSBkZXBlbmRlbmN5LCBhbmQgYSByZWFkIGZyb20gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgKiBjYW4gYmUgdXNlZCB0byBlbnN1cmUgdGhlIG9yZGVyaW5nLgorICAgICAgICoKKyAgICAgICAqIEZvciBnZW42LCBvbmx5IHdyaXRlcyBiZXR3ZWVuIGRpZmZlcmVudCB0aHJlYWRzIG5lZWQgb3JkZXJpbmcKKyAgICAgICAqIHByb3RlY3Rpb24uICBPdXIgdXNlIG9mIERQIHdyaXRlcyBpcyBhbGwgYWJvdXQgcmVnaXN0ZXIKKyAgICAgICAqIHNwaWxsaW5nIHdpdGhpbiBhIHRocmVhZC4KKyAgICAgICAqLworICAgICAgaWYgKGJydy0+Z2VuID49IDYpIHsKKwkgZGVzdCA9IHJldHlwZSh2ZWMxNihicndfbnVsbF9yZWcoKSksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKwkgc2VuZF9jb21taXRfbXNnID0gMDsKKyAgICAgIH0gZWxzZSB7CisJIGRlc3QgPSBzcmNfaGVhZGVyOworCSBzZW5kX2NvbW1pdF9tc2cgPSAxOworICAgICAgfQorCisgICAgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgZGVzdCk7CisgICAgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworCSBicndfc2V0X3NyYzAocCwgaW5zbiwgbXJmKTsKKyAgICAgIH0gZWxzZSB7CisJIGJyd19zZXRfc3JjMChwLCBpbnNuLCBicndfbnVsbF9yZWcoKSk7CisgICAgICB9CisKKyAgICAgIGlmIChicnctPmdlbiA+PSA2KQorCSBtc2dfdHlwZSA9IEdFTjZfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9PV09SRF9CTE9DS19XUklURTsKKyAgICAgIGVsc2UKKwkgbXNnX3R5cGUgPSBCUldfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9PV09SRF9CTE9DS19XUklURTsKKworICAgICAgYnJ3X3NldF9kcF93cml0ZV9tZXNzYWdlKHAsCisJCQkgICAgICAgaW5zbiwKKwkJCSAgICAgICAyNTUsIC8qIGJpbmRpbmcgdGFibGUgaW5kZXggKDI1NT1zdGF0ZWxlc3MpICovCisJCQkgICAgICAgbXNnX2NvbnRyb2wsCisJCQkgICAgICAgbXNnX3R5cGUsCisJCQkgICAgICAgbWxlbiwKKwkJCSAgICAgICB0cnVlLCAvKiBoZWFkZXJfcHJlc2VudCAqLworCQkJICAgICAgIDAsIC8qIG5vdCBhIHJlbmRlciB0YXJnZXQgKi8KKwkJCSAgICAgICBzZW5kX2NvbW1pdF9tc2csIC8qIHJlc3BvbnNlX2xlbmd0aCAqLworCQkJICAgICAgIDAsIC8qIGVvdCAqLworCQkJICAgICAgIHNlbmRfY29tbWl0X21zZyk7CisgICB9Cit9CisKKworLyoqCisgKiBSZWFkIGEgYmxvY2sgb2Ygb3dvcmRzIChoYWxmIGEgR1JGIGVhY2gpIGZyb20gdGhlIHNjcmF0Y2ggYnVmZmVyCisgKiB1c2luZyBhIGNvbnN0YW50IGluZGV4IHBlciBjaGFubmVsLgorICoKKyAqIE9mZnNldCBtdXN0IGJlIGFsaWduZWQgdG8gb3dvcmQgc2l6ZSAoMTYgYnl0ZXMpLiAgVXNlZCBmb3IgcmVnaXN0ZXIKKyAqIHNwaWxsaW5nLgorICovCit2b2lkCiticndfb3dvcmRfYmxvY2tfcmVhZF9zY3JhdGNoKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCSAgICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkJCSAgICAgc3RydWN0IGJyd19yZWcgbXJmLAorCQkJICAgICBpbnQgbnVtX3JlZ3MsCisJCQkgICAgIHVuc2lnbmVkIG9mZnNldCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgdWludDMyX3QgbXNnX2NvbnRyb2w7CisgICBpbnQgcmxlbjsKKworICAgaWYgKGJydy0+Z2VuID49IDYpCisgICAgICBvZmZzZXQgLz0gMTY7CisKKyAgIG1yZiA9IHJldHlwZShtcmYsIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgIGRlc3QgPSByZXR5cGUoZGVzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworCisgICBpZiAobnVtX3JlZ3MgPT0gMSkgeworICAgICAgbXNnX2NvbnRyb2wgPSBCUldfREFUQVBPUlRfT1dPUkRfQkxPQ0tfMl9PV09SRFM7CisgICAgICBybGVuID0gMTsKKyAgIH0gZWxzZSB7CisgICAgICBtc2dfY29udHJvbCA9IEJSV19EQVRBUE9SVF9PV09SRF9CTE9DS180X09XT1JEUzsKKyAgICAgIHJsZW4gPSAyOworICAgfQorCisgICB7CisgICAgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgICAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworCisgICAgICBicndfTU9WKHAsIG1yZiwgcmV0eXBlKGJyd192ZWM4X2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKworICAgICAgLyogc2V0IG1lc3NhZ2UgaGVhZGVyIGdsb2JhbCBvZmZzZXQgZmllbGQgKHJlZyAwLCBlbGVtZW50IDIpICovCisgICAgICBicndfTU9WKHAsCisJICAgICAgcmV0eXBlKGJyd192ZWMxX3JlZyhCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFLAorCQkJCSAgbXJmLm5yLAorCQkJCSAgMiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwKKwkgICAgICBicndfaW1tX3VkKG9mZnNldCkpOworCisgICAgICBicndfcG9wX2luc25fc3RhdGUocCk7CisgICB9CisKKyAgIHsKKyAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKworICAgICAgYXNzZXJ0KGluc24tPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9PSAwKTsKKyAgICAgIGluc24tPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gQlJXX0NPTVBSRVNTSU9OX05PTkU7CisgICAgICBpbnNuLT5oZWFkZXIuZGVzdHJlZ19fY29uZGl0aW9uYWxtb2QgPSBtcmYubnI7CisKKyAgICAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBkZXN0KTsJLyogVVc/ICovCisgICAgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworCSBicndfc2V0X3NyYzAocCwgaW5zbiwgbXJmKTsKKyAgICAgIH0gZWxzZSB7CisJIGJyd19zZXRfc3JjMChwLCBpbnNuLCBicndfbnVsbF9yZWcoKSk7CisgICAgICB9CisKKyAgICAgIGJyd19zZXRfZHBfcmVhZF9tZXNzYWdlKHAsCisJCQkgICAgICBpbnNuLAorCQkJICAgICAgMjU1LCAvKiBiaW5kaW5nIHRhYmxlIGluZGV4ICgyNTU9c3RhdGVsZXNzKSAqLworCQkJICAgICAgbXNnX2NvbnRyb2wsCisJCQkgICAgICBCUldfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX0JMT0NLX1JFQUQsIC8qIG1zZ190eXBlICovCisJCQkgICAgICBCUldfREFUQVBPUlRfUkVBRF9UQVJHRVRfUkVOREVSX0NBQ0hFLAorCQkJICAgICAgMSwgLyogbXNnX2xlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLyogaGVhZGVyX3ByZXNlbnQgKi8KKwkJCSAgICAgIHJsZW4pOworICAgfQorfQorCit2b2lkCitnZW43X2Jsb2NrX3JlYWRfc2NyYXRjaChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9yZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb2Zmc2V0KQoreworICAgZGVzdCA9IHJldHlwZShkZXN0LCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CisKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKworICAgYXNzZXJ0KGluc24tPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9PSBCUldfUFJFRElDQVRFX05PTkUpOworICAgaW5zbi0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIGRlc3QpOworCisgICAvKiBUaGUgSFcgcmVxdWlyZXMgdGhhdCB0aGUgaGVhZGVyIGlzIHByZXNlbnQ7IHRoaXMgaXMgdG8gZ2V0IHRoZSBnMC41CisgICAgKiBzY3JhdGNoIG9mZnNldC4KKyAgICAqLworICAgYm9vbCBoZWFkZXJfcHJlc2VudCA9IHRydWU7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgYnJ3X3ZlYzhfZ3JmKDAsIDApKTsKKworICAgYnJ3X3NldF9tZXNzYWdlX2Rlc2NyaXB0b3IocCwgaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjdfU0ZJRF9EQVRBUE9SVF9EQVRBX0NBQ0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbWxlbjoganVzdCBnMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3JlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAgaW5zbi0+Yml0czMudWQgfD0gR0VON19EQVRBUE9SVF9TQ1JBVENIX1JFQUQ7CisKKyAgIGFzc2VydChudW1fcmVncyA9PSAxIHx8IG51bV9yZWdzID09IDIgfHwgbnVtX3JlZ3MgPT0gNCk7CisgICBpbnNuLT5iaXRzMy51ZCB8PSAobnVtX3JlZ3MgLSAxKSA8PCBHRU43X0RBVEFQT1JUX1NDUkFUQ0hfTlVNX1JFR1NfU0hJRlQ7CisKKyAgIC8qIEFjY29yZGluZyB0byB0aGUgZG9jcywgb2Zmc2V0IGlzICJBIDEyLWJpdCBIV29yZCBvZmZzZXQgaW50byB0aGUgbWVtb3J5CisgICAgKiBJbW1lZGlhdGUgTWVtb3J5IGJ1ZmZlciBhcyBzcGVjaWZpZWQgYnkgYmluZGluZyB0YWJsZSAweEZGLiIgIEFuIEhXT1JECisgICAgKiBpcyAzMiBieXRlcywgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgc2l6ZSBvZiBhIHJlZ2lzdGVyLgorICAgICovCisgICBvZmZzZXQgLz0gUkVHX1NJWkU7CisgICBhc3NlcnQob2Zmc2V0IDwgKDEgPDwgMTIpKTsKKyAgIGluc24tPmJpdHMzLnVkIHw9IG9mZnNldDsKK30KKworLyoqCisgKiBSZWFkIGEgZmxvYXRbNF0gdmVjdG9yIGZyb20gdGhlIGRhdGEgcG9ydCBEYXRhIENhY2hlIChjb25zdCBidWZmZXIpLgorICogTG9jYXRpb24gKGluIGJ1ZmZlcikgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYuCisgKiBVc2VkIGZvciBmZXRjaGluZyBzaGFkZXIgY29uc3RhbnRzLgorICovCit2b2lkIGJyd19vd29yZF9ibG9ja19yZWFkKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJCSAgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkJCSAgc3RydWN0IGJyd19yZWcgbXJmLAorCQkJICB1aW50MzJfdCBvZmZzZXQsCisJCQkgIHVpbnQzMl90IGJpbmRfdGFibGVfaW5kZXgpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKworICAgLyogT24gbmV3ZXIgaGFyZHdhcmUsIG9mZnNldCBpcyBpbiB1bml0cyBvZiBvd29yZHMuICovCisgICBpZiAoYnJ3LT5nZW4gPj0gNikKKyAgICAgIG9mZnNldCAvPSAxNjsKKworICAgbXJmID0gcmV0eXBlKG1yZiwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworCisgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworCisgICBicndfTU9WKHAsIG1yZiwgcmV0eXBlKGJyd192ZWM4X2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKworICAgLyogc2V0IG1lc3NhZ2UgaGVhZGVyIGdsb2JhbCBvZmZzZXQgZmllbGQgKHJlZyAwLCBlbGVtZW50IDIpICovCisgICBicndfTU9WKHAsCisJICAgcmV0eXBlKGJyd192ZWMxX3JlZyhCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFLAorCQkJICAgICAgIG1yZi5uciwKKwkJCSAgICAgICAyKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLAorCSAgIGJyd19pbW1fdWQob2Zmc2V0KSk7CisKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKyAgIGluc24tPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCA9IG1yZi5ucjsKKworICAgLyogY2FzdCBkZXN0IHRvIGEgdXdvcmRbOF0gdmVjdG9yICovCisgICBkZXN0ID0gcmV0eXBlKHZlYzgoZGVzdCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIGRlc3QpOworICAgaWYgKGJydy0+Z2VuID49IDYpIHsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBtcmYpOworICAgfSBlbHNlIHsKKyAgICAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBicndfbnVsbF9yZWcoKSk7CisgICB9CisKKyAgIGJyd19zZXRfZHBfcmVhZF9tZXNzYWdlKHAsCisJCQkgICBpbnNuLAorCQkJICAgYmluZF90YWJsZV9pbmRleCwKKwkJCSAgIEJSV19EQVRBUE9SVF9PV09SRF9CTE9DS18xX09XT1JETE9XLAorCQkJICAgQlJXX0RBVEFQT1JUX1JFQURfTUVTU0FHRV9PV09SRF9CTE9DS19SRUFELAorCQkJICAgQlJXX0RBVEFQT1JUX1JFQURfVEFSR0VUX0RBVEFfQ0FDSEUsCisJCQkgICAxLCAvKiBtc2dfbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvKiBoZWFkZXJfcHJlc2VudCAqLworCQkJICAgMSk7IC8qIHJlc3BvbnNlX2xlbmd0aCAoMSByZWcsIDIgb3dvcmRzISkgKi8KKworICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworfQorCisKK3ZvaWQgYnJ3X2ZiX1dSSVRFKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJICBpbnQgZGlzcGF0Y2hfd2lkdGgsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfcmVnX25yLAorICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19jb250cm9sLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICBib29sIGVvdCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgaGVhZGVyX3ByZXNlbnQpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc247CisgICB1bnNpZ25lZCBtc2dfdHlwZTsKKyAgIHN0cnVjdCBicndfcmVnIGRlc3Q7CisKKyAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSAxNikKKyAgICAgIGRlc3QgPSByZXR5cGUodmVjMTYoYnJ3X251bGxfcmVnKCkpLCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CisgICBlbHNlCisgICAgICBkZXN0ID0gcmV0eXBlKHZlYzgoYnJ3X251bGxfcmVnKCkpLCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CisKKyAgIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICBpbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfU0VOREMpOworICAgfSBlbHNlIHsKKyAgICAgIGluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKyAgIH0KKyAgIGluc24tPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gQlJXX0NPTVBSRVNTSU9OX05PTkU7CisKKyAgIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICAvKiBoZWFkZXJsZXNzIHZlcnNpb24sIGp1c3Qgc3VibWl0IGNvbG9yIHBheWxvYWQgKi8KKyAgICAgIHNyYzAgPSBicndfbWVzc2FnZV9yZWcobXNnX3JlZ19ucik7CisKKyAgICAgIG1zZ190eXBlID0gR0VONl9EQVRBUE9SVF9XUklURV9NRVNTQUdFX1JFTkRFUl9UQVJHRVRfV1JJVEU7CisgICB9IGVsc2UgeworICAgICAgaW5zbi0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gbXNnX3JlZ19ucjsKKworICAgICAgbXNnX3R5cGUgPSBCUldfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9SRU5ERVJfVEFSR0VUX1dSSVRFOworICAgfQorCisgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgZGVzdCk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgc3JjMCk7CisgICBicndfc2V0X2RwX3dyaXRlX21lc3NhZ2UocCwKKwkJCSAgICBpbnNuLAorCQkJICAgIGJpbmRpbmdfdGFibGVfaW5kZXgsCisJCQkgICAgbXNnX2NvbnRyb2wsCisJCQkgICAgbXNnX3R5cGUsCisJCQkgICAgbXNnX2xlbmd0aCwKKwkJCSAgICBoZWFkZXJfcHJlc2VudCwKKwkJCSAgICBlb3QsIC8qIGxhc3QgcmVuZGVyIHRhcmdldCB3cml0ZSAqLworCQkJICAgIHJlc3BvbnNlX2xlbmd0aCwKKwkJCSAgICBlb3QsCisJCQkgICAgMCAvKiBzZW5kX2NvbW1pdF9tc2cgKi8pOworfQorCisKKy8qKgorICogVGV4dHVyZSBzYW1wbGUgaW5zdHJ1Y3Rpb24uCisgKiBOb3RlOiB0aGUgbXNnX3R5cGUgcGx1cyBtc2dfbGVuZ3RoIHZhbHVlcyBkZXRlcm1pbmUgZXhhY3RseSB3aGF0IGtpbmQKKyAqIG9mIHNhbXBsaW5nIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuICBTZWUgdm9sdW1lIDQsIHBhZ2UgMTYxIG9mIGRvY3MuCisgKi8KK3ZvaWQgYnJ3X1NBTVBMRShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisJCXN0cnVjdCBicndfcmVnIGRlc3QsCisJCXVuc2lnbmVkIG1zZ19yZWdfbnIsCisJCXN0cnVjdCBicndfcmVnIHNyYzAsCisJCXVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXgsCisJCXVuc2lnbmVkIHNhbXBsZXIsCisJCXVuc2lnbmVkIG1zZ190eXBlLAorCQl1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgsCisJCXVuc2lnbmVkIG1zZ19sZW5ndGgsCisJCXVuc2lnbmVkIGhlYWRlcl9wcmVzZW50LAorCQl1bnNpZ25lZCBzaW1kX21vZGUsCisJCXVuc2lnbmVkIHJldHVybl9mb3JtYXQpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc247CisKKyAgIGlmIChtc2dfcmVnX25yICE9IC0xKQorICAgICAgZ2VuNl9yZXNvbHZlX2ltcGxpZWRfbW92ZShwLCAmc3JjMCwgbXNnX3JlZ19ucik7CisKKyAgIGluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKyAgIGluc24tPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IDA7IC8qIFhYWCAqLworCisgICAvKiBGcm9tIHRoZSA5NjUgUFJNICh2b2x1bWUgNCwgcGFydCAxLCBzZWN0aW9uIDE0LjIuNDEpOgorICAgICoKKyAgICAqICAgICJJbnN0cnVjdGlvbiBjb21wcmVzc2lvbiBpcyBub3QgYWxsb3dlZCBmb3IgdGhpcyBpbnN0cnVjdGlvbiAodGhhdAorICAgICogICAgIGlzLCBzZW5kKS4gVGhlIGhhcmR3YXJlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiB0aGlzIGluc3RydWN0aW9uIGlzCisgICAgKiAgICAgc2V0IGFzIGNvbXByZXNzZWQuIEhvd2V2ZXIsIGNvbXByZXNzIGNvbnRyb2wgY2FuIGJlIHNldCB0byAiU2VjSGFsZiIKKyAgICAqICAgICB0byBhZmZlY3QgdGhlIEVNYXNrIGdlbmVyYXRpb24uIgorICAgICoKKyAgICAqIE5vIHNpbWlsYXIgd29yZGluZyBpcyBmb3VuZCBpbiBsYXRlciBQUk1zLCBidXQgdGhlcmUgYXJlIGV4YW1wbGVzCisgICAgKiB1dGlsaXppbmcgc2VuZCB3aXRoIFNlY0hhbGYuICBNb3JlIGltcG9ydGFudGx5LCBTSU1EOCBzYW1wbGVyIG1lc3NhZ2VzCisgICAgKiBhcmUgYWxsb3dlZCBpbiBTSU1EMTYgbW9kZSBhbmQgdGhleSBjb3VsZCBub3Qgd29yayB3aXRob3V0IFNlY0hhbGYuICBGb3IKKyAgICAqIHRoZXNlIHJlYXNvbnMsIHdlIGFsbG93IEJSV19DT01QUkVTU0lPTl8yTkRIQUxGIGhlcmUuCisgICAgKi8KKyAgIGlmIChpbnNuLT5oZWFkZXIuY29tcHJlc3Npb25fY29udHJvbCAhPSBCUldfQ09NUFJFU1NJT05fMk5ESEFMRikKKyAgICAgIGluc24tPmhlYWRlci5jb21wcmVzc2lvbl9jb250cm9sID0gQlJXX0NPTVBSRVNTSU9OX05PTkU7CisKKyAgIGlmIChicnctPmdlbiA8IDYpCisgICAgICBpbnNuLT5oZWFkZXIuZGVzdHJlZ19fY29uZGl0aW9uYWxtb2QgPSBtc2dfcmVnX25yOworCisgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgZGVzdCk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgc3JjMCk7CisgICBicndfc2V0X3NhbXBsZXJfbWVzc2FnZShwLCBpbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ190YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbWRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl9mb3JtYXQpOworfQorCisvKiBBbGwgdGhlc2UgdmFyaWFibGVzIGFyZSBwcmV0dHkgY29uZnVzaW5nIC0gd2UgbWlnaHQgYmUgYmV0dGVyIG9mZgorICogdXNpbmcgYml0bWFza3MgYW5kIG1hY3JvcyBmb3IgdGhpcywgaW4gdGhlIG9sZCBzdHlsZS4gIE9yIHBlcmhhcHMKKyAqIGp1c3QgaGF2aW5nIHRoZSBjYWxsZXIgaW5zdGFudGlhdGUgdGhlIGZpZWxkcyBpbiBkd29yZDMgaXRzZWxmLgorICovCit2b2lkIGJyd191cmJfV1JJVEUoc3RydWN0IGJyd19jb21waWxlICpwLAorCQkgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorCQkgICB1bnNpZ25lZCBtc2dfcmVnX25yLAorCQkgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgIGVudW0gYnJ3X3VyYl93cml0ZV9mbGFncyBmbGFncywKKwkJICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKwkJICAgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoLAorCQkgICB1bnNpZ25lZCBvZmZzZXQsCisJCSAgIHVuc2lnbmVkIHN3aXp6bGUpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc247CisKKyAgIGdlbjZfcmVzb2x2ZV9pbXBsaWVkX21vdmUocCwgJnNyYzAsIG1zZ19yZWdfbnIpOworCisgICBpZiAoYnJ3LT5nZW4gPT0gNyAmJiAhKGZsYWdzICYgQlJXX1VSQl9XUklURV9VU0VfQ0hBTk5FTF9NQVNLUykpIHsKKyAgICAgIC8qIEVuYWJsZSBDaGFubmVsIE1hc2tzIGluIHRoZSBVUkJfV1JJVEVfSFdPUkQgbWVzc2FnZSBoZWFkZXIgKi8KKyAgICAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICAgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKyAgICAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgICAgYnJ3X09SKHAsIHJldHlwZShicndfdmVjMV9yZWcoQlJXX01FU1NBR0VfUkVHSVNURVJfRklMRSwgbXNnX3JlZ19uciwgNSksCisJCSAgICAgICBCUldfUkVHSVNURVJfVFlQRV9VRCksCisJICAgICAgICByZXR5cGUoYnJ3X3ZlYzFfZ3JmKDAsIDUpLCBCUldfUkVHSVNURVJfVFlQRV9VRCksCisJCWJyd19pbW1fdWQoMHhmZjAwKSk7CisgICAgICBicndfcG9wX2luc25fc3RhdGUocCk7CisgICB9CisKKyAgIGluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKworICAgYXNzZXJ0KG1zZ19sZW5ndGggPCBCUldfTUFYX01SRik7CisKKyAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBkZXN0KTsKKyAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBzcmMwKTsKKyAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX2QoMCkpOworCisgICBpZiAoYnJ3LT5nZW4gPCA2KQorICAgICAgaW5zbi0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gbXNnX3JlZ19ucjsKKworICAgYnJ3X3NldF91cmJfbWVzc2FnZShwLAorCQkgICAgICAgaW5zbiwKKwkJICAgICAgIGZsYWdzLAorCQkgICAgICAgbXNnX2xlbmd0aCwKKwkJICAgICAgIHJlc3BvbnNlX2xlbmd0aCwKKwkJICAgICAgIG9mZnNldCwKKwkJICAgICAgIHN3aXp6bGUpOworfQorCitzdGF0aWMgaW50CituZXh0X2lwKHN0cnVjdCBicndfY29tcGlsZSAqcCwgaW50IGlwKQoreworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9ICh2b2lkICopcC0+c3RvcmUgKyBpcDsKKworICAgaWYgKGluc24tPmhlYWRlci5jbXB0X2NvbnRyb2wpCisgICAgICByZXR1cm4gaXAgKyA4OworICAgZWxzZQorICAgICAgcmV0dXJuIGlwICsgMTY7Cit9CisKK3N0YXRpYyBpbnQKK2Jyd19maW5kX25leHRfYmxvY2tfZW5kKHN0cnVjdCBicndfY29tcGlsZSAqcCwgaW50IHN0YXJ0KQoreworICAgaW50IGlwOworICAgdm9pZCAqc3RvcmUgPSBwLT5zdG9yZTsKKworICAgZm9yIChpcCA9IG5leHRfaXAocCwgc3RhcnQpOyBpcCA8IHAtPm5leHRfaW5zbl9vZmZzZXQ7IGlwID0gbmV4dF9pcChwLCBpcCkpIHsKKyAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBzdG9yZSArIGlwOworCisgICAgICBzd2l0Y2ggKGluc24tPmhlYWRlci5vcGNvZGUpIHsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTkRJRjoKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTFNFOgorICAgICAgY2FzZSBCUldfT1BDT0RFX1dISUxFOgorICAgICAgY2FzZSBCUldfT1BDT0RFX0hBTFQ6CisJIHJldHVybiBpcDsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZXJlIGlzIG5vIERPIGluc3RydWN0aW9uIG9uIGdlbjYsIHNvIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgbG9vcAorICogd2UgaGF2ZSB0byBzZWUgaWYgdGhlIGxvb3AgaXMganVtcGluZyBiYWNrIGJlZm9yZSBvdXIgc3RhcnQKKyAqIGluc3RydWN0aW9uLgorICovCitzdGF0aWMgaW50CiticndfZmluZF9sb29wX2VuZChzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsIGludCBzdGFydCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgaW50IGlwOworICAgaW50IHNjYWxlID0gODsKKyAgIHZvaWQgKnN0b3JlID0gcC0+c3RvcmU7CisKKyAgIC8qIEFsd2F5cyBzdGFydCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gKHN1Y2ggYXMgYSBXSElMRSkgd2UncmUgdHJ5aW5nIHRvIGZpeAorICAgICogdXAuCisgICAgKi8KKyAgIGZvciAoaXAgPSBuZXh0X2lwKHAsIHN0YXJ0KTsgaXAgPCBwLT5uZXh0X2luc25fb2Zmc2V0OyBpcCA9IG5leHRfaXAocCwgaXApKSB7CisgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gc3RvcmUgKyBpcDsKKworICAgICAgaWYgKGluc24tPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9XSElMRSkgeworCSBpbnQgamlwID0gYnJ3LT5nZW4gPT0gNiA/IGluc24tPmJpdHMxLmJyYW5jaF9nZW42Lmp1bXBfY291bnQKKwkJCQkgICA6IGluc24tPmJpdHMzLmJyZWFrX2NvbnQuamlwOworCSBpZiAoaXAgKyBqaXAgKiBzY2FsZSA8PSBzdGFydCkKKwkgICAgcmV0dXJuIGlwOworICAgICAgfQorICAgfQorICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgIHJldHVybiBzdGFydDsKK30KKworLyogQWZ0ZXIgcHJvZ3JhbSBnZW5lcmF0aW9uLCBnbyBiYWNrIGFuZCB1cGRhdGUgdGhlIFVJUCBhbmQgSklQIG9mCisgKiBCUkVBSywgQ09OVCwgYW5kIEhBTFQgaW5zdHJ1Y3Rpb25zIHRvIHRoZWlyIGNvcnJlY3QgbG9jYXRpb25zLgorICovCit2b2lkCiticndfc2V0X3VpcF9qaXAoc3RydWN0IGJyd19jb21waWxlICpwKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICBpbnQgaXA7CisgICBpbnQgc2NhbGUgPSA4OworICAgdm9pZCAqc3RvcmUgPSBwLT5zdG9yZTsKKworICAgaWYgKGJydy0+Z2VuIDwgNikKKyAgICAgIHJldHVybjsKKworICAgZm9yIChpcCA9IDA7IGlwIDwgcC0+bmV4dF9pbnNuX29mZnNldDsgaXAgPSBuZXh0X2lwKHAsIGlwKSkgeworICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IHN0b3JlICsgaXA7CisKKyAgICAgIGlmIChpbnNuLT5oZWFkZXIuY21wdF9jb250cm9sKSB7CisJIC8qIEZpeHVwcyBmb3IgY29tcGFjdGVkIEJSRUFLL0NPTlRJTlVFIG5vdCBzdXBwb3J0ZWQgeWV0LiAqLworCSBhc3NlcnQoaW5zbi0+aGVhZGVyLm9wY29kZSAhPSBCUldfT1BDT0RFX0JSRUFLICYmCisJCWluc24tPmhlYWRlci5vcGNvZGUgIT0gQlJXX09QQ09ERV9DT05USU5VRSAmJgorCQlpbnNuLT5oZWFkZXIub3Bjb2RlICE9IEJSV19PUENPREVfSEFMVCk7CisJIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpbnQgYmxvY2tfZW5kX2lwID0gYnJ3X2ZpbmRfbmV4dF9ibG9ja19lbmQocCwgaXApOworICAgICAgc3dpdGNoIChpbnNuLT5oZWFkZXIub3Bjb2RlKSB7CisgICAgICBjYXNlIEJSV19PUENPREVfQlJFQUs6CisgICAgICAgICBhc3NlcnQoYmxvY2tfZW5kX2lwICE9IDApOworCSBpbnNuLT5iaXRzMy5icmVha19jb250LmppcCA9IChibG9ja19lbmRfaXAgLSBpcCkgLyBzY2FsZTsKKwkgLyogR2VuNyBVSVAgcG9pbnRzIHRvIFdISUxFOyBHZW42IHBvaW50cyBqdXN0IGFmdGVyIGl0ICovCisJIGluc24tPmJpdHMzLmJyZWFrX2NvbnQudWlwID0KKwkgICAgKGJyd19maW5kX2xvb3BfZW5kKHAsIGlwKSAtIGlwICsKKyAgICAgICAgICAgICAoYnJ3LT5nZW4gPT0gNiA/IDE2IDogMCkpIC8gc2NhbGU7CisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0NPTlRJTlVFOgorICAgICAgICAgYXNzZXJ0KGJsb2NrX2VuZF9pcCAhPSAwKTsKKwkgaW5zbi0+Yml0czMuYnJlYWtfY29udC5qaXAgPSAoYmxvY2tfZW5kX2lwIC0gaXApIC8gc2NhbGU7CisJIGluc24tPmJpdHMzLmJyZWFrX2NvbnQudWlwID0KKyAgICAgICAgICAgIChicndfZmluZF9sb29wX2VuZChwLCBpcCkgLSBpcCkgLyBzY2FsZTsKKworCSBhc3NlcnQoaW5zbi0+Yml0czMuYnJlYWtfY29udC51aXAgIT0gMCk7CisJIGFzc2VydChpbnNuLT5iaXRzMy5icmVha19jb250LmppcCAhPSAwKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTkRJRjoKKyAgICAgICAgIGlmIChibG9ja19lbmRfaXAgPT0gMCkKKyAgICAgICAgICAgIGluc24tPmJpdHMzLmJyZWFrX2NvbnQuamlwID0gMjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluc24tPmJpdHMzLmJyZWFrX2NvbnQuamlwID0gKGJsb2NrX2VuZF9pcCAtIGlwKSAvIHNjYWxlOworCSBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0hBTFQ6CisJIC8qIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0gKHZvbHVtZSA0LCBwYXJ0IDIsIHNlY3Rpb24gOC4zLjE5KToKKwkgICoKKwkgICogICAgIkluIGNhc2Ugb2YgdGhlIGhhbHQgaW5zdHJ1Y3Rpb24gbm90IGluc2lkZSBhbnkgY29uZGl0aW9uYWwKKwkgICogICAgIGNvZGUgYmxvY2ssIHRoZSB2YWx1ZSBvZiA8SklQPiBhbmQgPFVJUD4gc2hvdWxkIGJlIHRoZQorCSAgKiAgICAgc2FtZS4gSW4gY2FzZSBvZiB0aGUgaGFsdCBpbnN0cnVjdGlvbiBpbnNpZGUgY29uZGl0aW9uYWwgY29kZQorCSAgKiAgICAgYmxvY2ssIHRoZSA8VUlQPiBzaG91bGQgYmUgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSwgYW5kIHRoZQorCSAgKiAgICAgPEpJUD4gc2hvdWxkIGJlIGVuZCBvZiB0aGUgbW9zdCBpbm5lciBjb25kaXRpb25hbCBjb2RlIGJsb2NrLiIKKwkgICoKKwkgICogVGhlIHVpcCB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBieSB3aG9ldmVyIHNldCB1cCB0aGUKKwkgICogaW5zdHJ1Y3Rpb24uCisJICAqLworCSBpZiAoYmxvY2tfZW5kX2lwID09IDApIHsKKwkgICAgaW5zbi0+Yml0czMuYnJlYWtfY29udC5qaXAgPSBpbnNuLT5iaXRzMy5icmVha19jb250LnVpcDsKKwkgfSBlbHNlIHsKKwkgICAgaW5zbi0+Yml0czMuYnJlYWtfY29udC5qaXAgPSAoYmxvY2tfZW5kX2lwIC0gaXApIC8gc2NhbGU7CisJIH0KKwkgYXNzZXJ0KGluc24tPmJpdHMzLmJyZWFrX2NvbnQudWlwICE9IDApOworCSBhc3NlcnQoaW5zbi0+Yml0czMuYnJlYWtfY29udC5qaXAgIT0gMCk7CisJIGJyZWFrOworICAgICAgfQorICAgfQorfQorCit2b2lkIGJyd19mZl9zeW5jKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKwkJICAgc3RydWN0IGJyd19yZWcgZGVzdCwKKwkJICAgdW5zaWduZWQgbXNnX3JlZ19uciwKKwkJICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKwkJICAgYm9vbCBhbGxvY2F0ZSwKKwkJICAgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoLAorCQkgICBib29sIGVvdCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcC0+YnJ3OworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbjsKKworICAgZ2VuNl9yZXNvbHZlX2ltcGxpZWRfbW92ZShwLCAmc3JjMCwgbXNnX3JlZ19ucik7CisKKyAgIGluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKyAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBkZXN0KTsKKyAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBzcmMwKTsKKyAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX2QoMCkpOworCisgICBpZiAoYnJ3LT5nZW4gPCA2KQorICAgICAgaW5zbi0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gbXNnX3JlZ19ucjsKKworICAgYnJ3X3NldF9mZl9zeW5jX21lc3NhZ2UocCwKKwkJCSAgIGluc24sCisJCQkgICBhbGxvY2F0ZSwKKwkJCSAgIHJlc3BvbnNlX2xlbmd0aCwKKwkJCSAgIGVvdCk7Cit9CisKKy8qKgorICogRW1pdCB0aGUgU0VORCBpbnN0cnVjdGlvbiBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgc3RyZWFtIG91dHB1dCBkYXRhIG9uIEdlbjYKKyAqIChmb3IgdHJhbnNmb3JtIGZlZWRiYWNrKS4KKyAqCisgKiBJZiBzZW5kX2NvbW1pdF9tc2cgaXMgdHJ1ZSwgdGhpcyBpcyB0aGUgbGFzdCBwaWVjZSBvZiBzdHJlYW0gb3V0cHV0IGRhdGEKKyAqIGZyb20gdGhpcyB0aHJlYWQsIHNvIHNlbmQgdGhlIGRhdGEgYXMgYSBjb21taXR0ZWQgd3JpdGUuICBBY2NvcmRpbmcgdG8gdGhlCisgKiBTYW5keSBCcmlkZ2UgUFJNICh2b2x1bWUgMiBwYXJ0IDEsIHNlY3Rpb24gNC41LjEpOgorICoKKyAqICAgIlByaW9yIHRvIEVuZCBvZiBUaHJlYWQgd2l0aCBhIFVSQl9XUklURSwgdGhlIGtlcm5lbCBtdXN0IGVuc3VyZSBhbGwKKyAqICAgd3JpdGVzIGFyZSBjb21wbGV0ZSBieSBzZW5kaW5nIHRoZSBmaW5hbCB3cml0ZSBhcyBhIGNvbW1pdHRlZCB3cml0ZS4iCisgKi8KK3ZvaWQKK2Jyd19zdmJfd3JpdGUoc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfcmVnX25yLAorICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICBib29sICAgc2VuZF9jb21taXRfbXNnKQoreworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbjsKKworICAgZ2VuNl9yZXNvbHZlX2ltcGxpZWRfbW92ZShwLCAmc3JjMCwgbXNnX3JlZ19ucik7CisKKyAgIGluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKyAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCBkZXN0KTsKKyAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBzcmMwKTsKKyAgIGJyd19zZXRfc3JjMShwLCBpbnNuLCBicndfaW1tX2QoMCkpOworICAgYnJ3X3NldF9kcF93cml0ZV9tZXNzYWdlKHAsIGluc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ190YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtc2dfY29udHJvbDogaWdub3JlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9TVFJFQU1FRF9WQl9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKiBtc2dfbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLyogaGVhZGVyX3ByZXNlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBsYXN0X3JlbmRlcl90YXJnZXQ6IGlnbm9yZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvbW1pdF9tc2csIC8qIHJlc3BvbnNlX2xlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGVuZF9vZl90aHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvbW1pdF9tc2cpOyAvKiBzZW5kX2NvbW1pdF9tc2cgKi8KK30KKworc3RhdGljIHZvaWQKK2Jyd19zZXRfZHBfdW50eXBlZF9hdG9taWNfbWVzc2FnZShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhdG9taWNfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZF90YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlYWRlcl9wcmVzZW50KQoreworICAgaWYgKHAtPmJydy0+aXNfaGFzd2VsbCkgeworICAgICAgYnJ3X3NldF9tZXNzYWdlX2Rlc2NyaXB0b3IocCwgaW5zbiwgSFNXX1NGSURfREFUQVBPUlRfREFUQV9DQUNIRV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3ByZXNlbnQsIGZhbHNlKTsKKworCisgICAgICBpZiAoaW5zbi0+aGVhZGVyLmFjY2Vzc19tb2RlID09IEJSV19BTElHTl8xKSB7CisgICAgICAgICBpZiAoaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplICE9IEJSV19FWEVDVVRFXzE2KQorICAgICAgICAgICAgaW5zbi0+Yml0czMudWQgfD0gMSA8PCAxMjsgLyogU0lNRDggbW9kZSAqLworCisgICAgICAgICBpbnNuLT5iaXRzMy5nZW43X2RwLm1zZ190eXBlID0KKyAgICAgICAgICAgIEhTV19EQVRBUE9SVF9EQ19QT1JUMV9VTlRZUEVEX0FUT01JQ19PUDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpbnNuLT5iaXRzMy5nZW43X2RwLm1zZ190eXBlID0KKyAgICAgICAgICAgIEhTV19EQVRBUE9SVF9EQ19QT1JUMV9VTlRZUEVEX0FUT01JQ19PUF9TSU1ENFgyOworICAgICAgfQorCisgICB9IGVsc2UgeworICAgICAgYnJ3X3NldF9tZXNzYWdlX2Rlc2NyaXB0b3IocCwgaW5zbiwgR0VON19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfbGVuZ3RoLCByZXNwb25zZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfcHJlc2VudCwgZmFsc2UpOworCisgICAgICBpbnNuLT5iaXRzMy5nZW43X2RwLm1zZ190eXBlID0gR0VON19EQVRBUE9SVF9EQ19VTlRZUEVEX0FUT01JQ19PUDsKKworICAgICAgaWYgKGluc24tPmhlYWRlci5leGVjdXRpb25fc2l6ZSAhPSBCUldfRVhFQ1VURV8xNikKKyAgICAgICAgIGluc24tPmJpdHMzLnVkIHw9IDEgPDwgMTI7IC8qIFNJTUQ4IG1vZGUgKi8KKyAgIH0KKworICAgaWYgKHJlc3BvbnNlX2xlbmd0aCkKKyAgICAgIGluc24tPmJpdHMzLnVkIHw9IDEgPDwgMTM7IC8qIFJldHVybiBkYXRhIGV4cGVjdGVkICovCisKKyAgIGluc24tPmJpdHMzLmdlbjdfZHAuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRfdGFibGVfaW5kZXg7CisgICBpbnNuLT5iaXRzMy51ZCB8PSBhdG9taWNfb3AgPDwgODsKK30KKwordm9pZAorYnJ3X3VudHlwZWRfYXRvbWljKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG1yZiwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhdG9taWNfb3AsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZF90YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCkgeworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IGJyd19uZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIHJldHlwZShkZXN0LCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShtcmYsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICBicndfc2V0X3NyYzEocCwgaW5zbiwgYnJ3X2ltbV9kKDApKTsKKyAgIGJyd19zZXRfZHBfdW50eXBlZF9hdG9taWNfbWVzc2FnZSgKKyAgICAgIHAsIGluc24sIGF0b21pY19vcCwgYmluZF90YWJsZV9pbmRleCwgbXNnX2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoLAorICAgICAgaW5zbi0+aGVhZGVyLmFjY2Vzc19tb2RlID09IEJSV19BTElHTl8xKTsKK30KKworc3RhdGljIHZvaWQKK2Jyd19zZXRfZHBfdW50eXBlZF9zdXJmYWNlX3JlYWRfbWVzc2FnZShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBiaW5kX3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVhZGVyX3ByZXNlbnQpCit7CisgICBjb25zdCB1bnNpZ25lZCBkaXNwYXRjaF93aWR0aCA9CisgICAgICAoaW5zbi0+aGVhZGVyLmV4ZWN1dGlvbl9zaXplID09IEJSV19FWEVDVVRFXzE2ID8gMTYgOiA4KTsKKyAgIGNvbnN0IHVuc2lnbmVkIG51bV9jaGFubmVscyA9IHJlc3BvbnNlX2xlbmd0aCAvIChkaXNwYXRjaF93aWR0aCAvIDgpOworCisgICBpZiAocC0+YnJ3LT5pc19oYXN3ZWxsKSB7CisgICAgICBicndfc2V0X21lc3NhZ2VfZGVzY3JpcHRvcihwLCBpbnNuLCBIU1dfU0ZJRF9EQVRBUE9SVF9EQVRBX0NBQ0hFXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfbGVuZ3RoLCByZXNwb25zZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfcHJlc2VudCwgZmFsc2UpOworCisgICAgICBpbnNuLT5iaXRzMy5nZW43X2RwLm1zZ190eXBlID0gSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1VOVFlQRURfU1VSRkFDRV9SRUFEOworICAgfSBlbHNlIHsKKyAgICAgIGJyd19zZXRfbWVzc2FnZV9kZXNjcmlwdG9yKHAsIGluc24sIEdFTjdfU0ZJRF9EQVRBUE9SVF9EQVRBX0NBQ0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3ByZXNlbnQsIGZhbHNlKTsKKworICAgICAgaW5zbi0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSA9IEdFTjdfREFUQVBPUlRfRENfVU5UWVBFRF9TVVJGQUNFX1JFQUQ7CisgICB9CisKKyAgIGlmIChpbnNuLT5oZWFkZXIuYWNjZXNzX21vZGUgPT0gQlJXX0FMSUdOXzEpIHsKKyAgICAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSAxNikKKyAgICAgICAgIGluc24tPmJpdHMzLnVkIHw9IDEgPDwgMTI7IC8qIFNJTUQxNiBtb2RlICovCisgICAgICBlbHNlCisgICAgICAgICBpbnNuLT5iaXRzMy51ZCB8PSAyIDw8IDEyOyAvKiBTSU1EOCBtb2RlICovCisgICB9CisKKyAgIGluc24tPmJpdHMzLmdlbjdfZHAuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRfdGFibGVfaW5kZXg7CisKKyAgIC8qIFNldCBtYXNrIG9mIDMyLWJpdCBjaGFubmVscyB0byBkcm9wLiAqLworICAgaW5zbi0+Yml0czMudWQgfD0gKDB4ZiAmICgweGYgPDwgbnVtX2NoYW5uZWxzKSkgPDwgODsKK30KKwordm9pZAorYnJ3X3VudHlwZWRfc3VyZmFjZV9yZWFkKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG1yZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBiaW5kX3RhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoKQoreworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiA9IG5leHRfaW5zbihwLCBCUldfT1BDT0RFX1NFTkQpOworCisgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgcmV0eXBlKGRlc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICBicndfc2V0X3NyYzAocCwgaW5zbiwgcmV0eXBlKG1yZiwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKyAgIGJyd19zZXRfZHBfdW50eXBlZF9zdXJmYWNlX3JlYWRfbWVzc2FnZSgKKyAgICAgIHAsIGluc24sIGJpbmRfdGFibGVfaW5kZXgsIG1zZ19sZW5ndGgsIHJlc3BvbnNlX2xlbmd0aCwKKyAgICAgIGluc24tPmhlYWRlci5hY2Nlc3NfbW9kZSA9PSBCUldfQUxJR05fMSk7Cit9CisKK3N0YXRpYyB2b2lkCiticndfc2NhdHRlcmVkX29wKHN0cnVjdCBicndfY29tcGlsZSAqcCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqaW5zbiwKKyAgICAgICAgICAgICAgICAgYm9vbCByZWFkLCBib29sIGluX2R3b3JkcykKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgICB1aW50MzJfdCBzaW1kX21vZGU7CisKKyAgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgICBpbnQgbXNnX3R5cGU7CisKKyAgICAgICAgaWYgKHJlYWQpIHsKKyAgICAgICAgICAgIG1zZ190eXBlID0gKGluX2R3b3JkcykgPworICAgICAgICAgICAgICAgIEdFTjdfREFUQVBPUlRfRENfRFdPUkRfU0NBVFRFUkVEX1JFQUQgOgorICAgICAgICAgICAgICAgIEdFTjdfREFUQVBPUlRfRENfQllURV9TQ0FUVEVSRURfUkVBRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZ190eXBlID0gKGluX2R3b3JkcykgPworICAgICAgICAgICAgICAgIEdFTjdfREFUQVBPUlRfRENfRFdPUkRfU0NBVFRFUkVEX1dSSVRFIDoKKyAgICAgICAgICAgICAgICBHRU43X0RBVEFQT1JUX0RDX0JZVEVfU0NBVFRFUkVEX1dSSVRFOworICAgICAgICB9CisKKyAgICAgICAgaW5zbi0+Yml0czMuZ2VuN19kcC5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChpbl9kd29yZHMpOworCisgICAgICAgIGlmIChyZWFkKSB7CisgICAgICAgICAgICBpbnNuLT5iaXRzMy5nZW42X2RwLm1zZ190eXBlID0KKyAgICAgICAgICAgICAgICBHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9EV09SRF9TQ0FUVEVSRURfUkVBRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluc24tPmJpdHMzLmdlbjZfZHAubXNnX3R5cGUgPQorICAgICAgICAgICAgICAgIEdFTjZfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9EV09SRF9TQ0FUVEVSRURfV1JJVEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5fZHdvcmRzKSB7CisgICAgICAgIHNpbWRfbW9kZSA9IChpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPT0gQlJXX0VYRUNVVEVfMTYpID8KKyAgICAgICAgICAgICgweDMgPDwgOCkgOiAoMHgyIDw8IDgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpbWRfbW9kZSA9IChpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPT0gQlJXX0VYRUNVVEVfMTYpID8KKyAgICAgICAgICAgICgweDEgPDwgOCkgOiAoMHgwIDw8IDgpOworICAgIH0KKworICAgIGluc24tPmJpdHMzLnVkIHw9IHNpbWRfbW9kZTsKK30KKwordm9pZAorYnJ3X3NjYXR0ZXJlZF93cml0ZShzdHJ1Y3QgYnJ3X2NvbXBpbGUgKnAsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRlc3QsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG1yZiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZF90YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWFkZXJfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9kd29yZHMpCit7CisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IHAtPmJydzsKKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBuZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKyAgIGVudW0gYnJ3X21lc3NhZ2VfdGFyZ2V0IHNmaWQ7CisKKyAgIGJyd19zZXRfZGVzdChwLCBpbnNuLCByZXR5cGUoZGVzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKyAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCByZXR5cGUobXJmLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNykKKyAgICAgICBzZmlkID0gR0VON19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEU7CisgICBlbHNlCisgICAgICAgc2ZpZCA9IEdFTjZfU0ZJRF9EQVRBUE9SVF9SRU5ERVJfQ0FDSEU7CisKKyAgIGJyd19zZXRfbWVzc2FnZV9kZXNjcmlwdG9yKHAsIGluc24sIHNmaWQsIG1zZ19sZW5ndGgsIDAsCisgICAgICAgICAgIGhlYWRlcl9wcmVzZW50LCBmYWxzZSk7CisgICBicndfc2NhdHRlcmVkX29wKHAsIGluc24sIGZhbHNlLCBpbl9kd29yZHMpOworCisgICBpbnNuLT5iaXRzMy5nZW42X2RwLmJpbmRpbmdfdGFibGVfaW5kZXggPSBiaW5kX3RhYmxlX2luZGV4OworfQorCit2b2lkCiticndfc2NhdHRlcmVkX3JlYWQoc3RydWN0IGJyd19jb21waWxlICpwLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRlc3QsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgbXJmLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJpbmRfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXNnX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBib29sIGhlYWRlcl9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fZHdvcmRzKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICppbnNuID0gbmV4dF9pbnNuKHAsIEJSV19PUENPREVfU0VORCk7CisgICBlbnVtIGJyd19tZXNzYWdlX3RhcmdldCBzZmlkOworICAgdW5zaWduZWQgcmxlbjsKKworICAgYnJ3X3NldF9kZXN0KHAsIGluc24sIHJldHlwZShkZXN0LCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgYnJ3X3NldF9zcmMwKHAsIGluc24sIHJldHlwZShtcmYsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisKKyAgIGlmIChicnctPmdlbiA+PSA3KQorICAgICAgIHNmaWQgPSBHRU43X1NGSURfREFUQVBPUlRfREFUQV9DQUNIRTsKKyAgIGVsc2UKKyAgICAgICBzZmlkID0gR0VONl9TRklEX0RBVEFQT1JUX1JFTkRFUl9DQUNIRTsKKworICAgcmxlbiA9IChpbnNuLT5oZWFkZXIuZXhlY3V0aW9uX3NpemUgPT0gQlJXX0VYRUNVVEVfMTYpID8gMiA6IDE7CisKKyAgIGJyd19zZXRfbWVzc2FnZV9kZXNjcmlwdG9yKHAsIGluc24sIHNmaWQsIG1zZ19sZW5ndGgsIHJsZW4sCisgICAgICAgICAgIGhlYWRlcl9wcmVzZW50LCBmYWxzZSk7CisgICBicndfc2NhdHRlcmVkX29wKHAsIGluc24sIHRydWUsIGluX2R3b3Jkcyk7CisKKyAgIGluc24tPmJpdHMzLmdlbjZfZHAuYmluZGluZ190YWJsZV9pbmRleCA9IGJpbmRfdGFibGVfaW5kZXg7Cit9CisKKy8vIEx1bmFyRyA6IFRPRE8gLSBzaGFkZXIgdGltZT8/CisvKioKKyAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgZ2VuZXJhdGVkIGFzIGEgc2luZ2xlLWNoYW5uZWwgYWxpZ24xIGluc3RydWN0aW9uIGJ5CisgKiBib3RoIHRoZSBWUyBhbmQgRlMgc3RhZ2VzIHdoZW4gdXNpbmcgSU5URUxfREVCVUc9c2hhZGVyX3RpbWUuCisgKgorICogV2UgY2FuJ3QgdXNlIHRoZSB0eXBlZCBhdG9taWMgb3AgaW4gdGhlIEZTIGJlY2F1c2UgdGhhdCBoYXMgdGhlIGV4ZWN1dGlvbgorICogbWFzayBBTkRlZCB3aXRoIHRoZSBwaXhlbCBtYXNrLCBidXQgd2UganVzdCB3YW50IHRvIHdyaXRlIHRoZSBvbmUgZHdvcmQgZm9yCisgKiBhbGwgdGhlIHBpeGVscy4KKyAqCisgKiBXZSBkb24ndCB1c2UgdGhlIFNJTUQ0eDIgYXRvbWljIG9wcyBpbiB0aGUgVlMgYmVjYXVzZSB3YW50IHRvIGp1c3Qgd3JpdGUKKyAqIG9uZSB1MzIuICBTbyB3ZSB1c2UgdGhlIHNhbWUgdW50eXBlZCBhdG9taWMgd3JpdGUgbWVzc2FnZSBhcyB0aGUgcGl4ZWwKKyAqIHNoYWRlci4KKyAqCisgKiBUaGUgdW50eXBlZCBhdG9taWMgb3BlcmF0aW9uIHJlcXVpcmVzIGEgQlVGRkVSIHN1cmZhY2UgdHlwZSB3aXRoIFJBVworICogZm9ybWF0LCBhbmQgaXMgb25seSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIGxlZ2FjeSBEQVRBX0NBQ0hFIGRhdGFwb3J0CisgKiBtZXNzYWdlcy4KKyAqLworLy92b2lkIGJyd19zaGFkZXJfdGltZV9hZGQoc3RydWN0IGJyd19jb21waWxlICpwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgcGF5bG9hZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1cmZfaW5kZXgpCisvL3sKKy8vICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBwLT5icnc7CisvLyAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKworLy8gICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworLy8gICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKy8vICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgQlJXX01BU0tfRElTQUJMRSk7CisvLyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnNlbmQgPSBicndfbmV4dF9pbnNuKHAsIEJSV19PUENPREVfU0VORCk7CisvLyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKworLy8gICAvKiBXZSB1c2UgYnJ3X3ZlYzFfcmVnIGFuZCB1bm1hc2tlZCBiZWNhdXNlIHdlIHdhbnQgdG8gaW5jcmVtZW50IHRoZSBnaXZlbgorLy8gICAgKiBvZmZzZXQgb25seSBvbmNlLgorLy8gICAgKi8KKy8vICAgYnJ3X3NldF9kZXN0KHAsIHNlbmQsIGJyd192ZWMxX3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX0FSRl9OVUxMLCAwKSk7CisvLyAgIGJyd19zZXRfc3JjMChwLCBzZW5kLCBicndfdmVjMV9yZWcocGF5bG9hZC5maWxlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQubnIsIDApKTsKKy8vICAgYnJ3X3NldF9kcF91bnR5cGVkX2F0b21pY19tZXNzYWdlKHAsIHNlbmQsIEJSV19BT1BfQURELCBzdXJmX2luZGV4LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAvKiBtZXNzYWdlIGxlbmd0aCAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogcmVzcG9uc2UgbGVuZ3RoICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaGVhZGVyIHByZXNlbnQgKi8pOworLy99CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzc2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzLmNwcApAQCAtMCwwICsxLDMzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKiogQGZpbGUgYnJ3X2ZzLmNwcAorICoKKyAqIFRoaXMgZmlsZSBkcml2ZXMgdGhlIEdMU0wgSVIgLT4gTElSIHRyYW5zbGF0aW9uLCBjb250YWlucyB0aGUKKyAqIG9wdGltaXphdGlvbnMgb24gdGhlIExJUiwgYW5kIGRyaXZlcyB0aGUgZ2VuZXJhdGlvbiBvZiBuYXRpdmUgY29kZQorICogZnJvbSB0aGUgTElSLgorICovCisKK2V4dGVybiAiQyIgeworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJtYWluL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgImljZC11dGlscy5oIgorI2luY2x1ZGUgIm1haW4vc2hhZGVyb2JqLmgiCisvLyNpbmNsdWRlICJtYWluL2Zib2JqZWN0LmgiICAvLyBMdW5hckc6IFJlbW92ZQorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcHJpbnQuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3JlZ2lzdGVyX2FsbG9jYXRlLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9zYW1wbGVyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfZXUuaCIKKyNpbmNsdWRlICJicndfd20uaCIKK30KKyNpbmNsdWRlICJicndfZnMuaCIKKyNpbmNsdWRlICJicndfZGVhZF9jb250cm9sX2Zsb3cuaCIKKyNpbmNsdWRlICJtYWluL3VuaWZvcm1zLmgiCisjaW5jbHVkZSAiYnJ3X2ZzX2xpdmVfdmFyaWFibGVzLmgiCisjaW5jbHVkZSAiZ2xzbC9nbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAiZ2xzbC9nbHNsX3BhcnNlcl9leHRyYXMuaCIKKwordm9pZAorZnNfaW5zdDo6aW5pdCgpCit7CisgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICB0aGlzLT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTk9ORTsKKworICAgdGhpcy0+ZHN0ID0gcmVnX3VuZGVmOworICAgdGhpcy0+c3JjWzBdID0gcmVnX3VuZGVmOworICAgdGhpcy0+c3JjWzFdID0gcmVnX3VuZGVmOworICAgdGhpcy0+c3JjWzJdID0gcmVnX3VuZGVmOworCisgICAvKiBUaGlzIHdpbGwgYmUgdGhlIGNhc2UgZm9yIGFsbW9zdCBhbGwgaW5zdHJ1Y3Rpb25zLiAqLworICAgdGhpcy0+cmVnc193cml0dGVuID0gMTsKKworICAgdGhpcy0+d3JpdGVzX2FjY3VtdWxhdG9yID0gZmFsc2U7Cit9CisKK2ZzX2luc3Q6OmZzX2luc3QoKQoreworICAgaW5pdCgpOworICAgdGhpcy0+b3Bjb2RlID0gQlJXX09QQ09ERV9OT1A7Cit9CisKK2ZzX2luc3Q6OmZzX2luc3QoZW51bSBvcGNvZGUgb3Bjb2RlKQoreworICAgaW5pdCgpOworICAgdGhpcy0+b3Bjb2RlID0gb3Bjb2RlOworfQorCitmc19pbnN0Ojpmc19pbnN0KGVudW0gb3Bjb2RlIG9wY29kZSwgZnNfcmVnIGRzdCkKK3sKKyAgIGluaXQoKTsKKyAgIHRoaXMtPm9wY29kZSA9IG9wY29kZTsKKyAgIHRoaXMtPmRzdCA9IGRzdDsKKworICAgaWYgKGRzdC5maWxlID09IEdSRikKKyAgICAgIGFzc2VydChkc3QucmVnX29mZnNldCA+PSAwKTsKK30KKworZnNfaW5zdDo6ZnNfaW5zdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwKQoreworICAgaW5pdCgpOworICAgdGhpcy0+b3Bjb2RlID0gb3Bjb2RlOworICAgdGhpcy0+ZHN0ID0gZHN0OworICAgdGhpcy0+c3JjWzBdID0gc3JjMDsKKworICAgaWYgKGRzdC5maWxlID09IEdSRikKKyAgICAgIGFzc2VydChkc3QucmVnX29mZnNldCA+PSAwKTsKKyAgIGlmIChzcmNbMF0uZmlsZSA9PSBHUkYpCisgICAgICBhc3NlcnQoc3JjWzBdLnJlZ19vZmZzZXQgPj0gMCk7Cit9CisKK2ZzX2luc3Q6OmZzX2luc3QoZW51bSBvcGNvZGUgb3Bjb2RlLCBmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpCit7CisgICBpbml0KCk7CisgICB0aGlzLT5vcGNvZGUgPSBvcGNvZGU7CisgICB0aGlzLT5kc3QgPSBkc3Q7CisgICB0aGlzLT5zcmNbMF0gPSBzcmMwOworICAgdGhpcy0+c3JjWzFdID0gc3JjMTsKKworICAgaWYgKGRzdC5maWxlID09IEdSRikKKyAgICAgIGFzc2VydChkc3QucmVnX29mZnNldCA+PSAwKTsKKyAgIGlmIChzcmNbMF0uZmlsZSA9PSBHUkYpCisgICAgICBhc3NlcnQoc3JjWzBdLnJlZ19vZmZzZXQgPj0gMCk7CisgICBpZiAoc3JjWzFdLmZpbGUgPT0gR1JGKQorICAgICAgYXNzZXJ0KHNyY1sxXS5yZWdfb2Zmc2V0ID49IDApOworfQorCitmc19pbnN0Ojpmc19pbnN0KGVudW0gb3Bjb2RlIG9wY29kZSwgZnNfcmVnIGRzdCwKKwkJIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSwgZnNfcmVnIHNyYzIpCit7CisgICBpbml0KCk7CisgICB0aGlzLT5vcGNvZGUgPSBvcGNvZGU7CisgICB0aGlzLT5kc3QgPSBkc3Q7CisgICB0aGlzLT5zcmNbMF0gPSBzcmMwOworICAgdGhpcy0+c3JjWzFdID0gc3JjMTsKKyAgIHRoaXMtPnNyY1syXSA9IHNyYzI7CisKKyAgIGlmIChkc3QuZmlsZSA9PSBHUkYpCisgICAgICBhc3NlcnQoZHN0LnJlZ19vZmZzZXQgPj0gMCk7CisgICBpZiAoc3JjWzBdLmZpbGUgPT0gR1JGKQorICAgICAgYXNzZXJ0KHNyY1swXS5yZWdfb2Zmc2V0ID49IDApOworICAgaWYgKHNyY1sxXS5maWxlID09IEdSRikKKyAgICAgIGFzc2VydChzcmNbMV0ucmVnX29mZnNldCA+PSAwKTsKKyAgIGlmIChzcmNbMl0uZmlsZSA9PSBHUkYpCisgICAgICBhc3NlcnQoc3JjWzJdLnJlZ19vZmZzZXQgPj0gMCk7Cit9CisKKyNkZWZpbmUgQUxVMShvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGZzX2luc3QgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGZzX3Zpc2l0b3I6Om9wKGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFXyMjb3AsIGRzdCwgc3JjMCk7ICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSBBTFUyKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZnNfaW5zdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZnNfdmlzaXRvcjo6b3AoZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxKSAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfIyNvcCwgZHN0LCBzcmMwLCBzcmMxKTsgICAgXAorICAgfQorCisjZGVmaW5lIEFMVTJfQUNDKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBmc19pbnN0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBmc192aXNpdG9yOjpvcChmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpICAgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmc19pbnN0ICppbnN0ID0gbmV3KG1lbV9jdHgpIGZzX2luc3QoQlJXX09QQ09ERV8jI29wLCBkc3QsIHNyYzAsIHNyYzEpO1wKKyAgICAgIGluc3QtPndyaXRlc19hY2N1bXVsYXRvciA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBpbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSBBTFUzKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZnNfaW5zdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZnNfdmlzaXRvcjo6b3AoZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxLCBmc19yZWcgc3JjMikgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfIyNvcCwgZHN0LCBzcmMwLCBzcmMxLCBzcmMyKTtcCisgICB9CisKK0FMVTEoTk9UKQorQUxVMShNT1YpCitBTFUxKEZSQykKK0FMVTEoUk5ERCkKK0FMVTEoUk5ERSkKK0FMVTEoUk5EWikKK0FMVTIoQUREKQorQUxVMihNVUwpCitBTFUyX0FDQyhNQUNIKQorQUxVMihBTkQpCitBTFUyKE9SKQorQUxVMihYT1IpCitBTFUyKFNITCkKK0FMVTIoU0hSKQorQUxVMihBU1IpCitBTFUzKExSUCkKK0FMVTEoQkZSRVYpCitBTFUzKEJGRSkKK0FMVTIoQkZJMSkKK0FMVTMoQkZJMikKK0FMVTEoRkJIKQorQUxVMShGQkwpCitBTFUxKENCSVQpCitBTFUzKE1BRCkKK0FMVTJfQUNDKEFEREMpCitBTFUyX0FDQyhTVUJCKQorQUxVMihTRUwpCitBTFUyKE1BQykKKworLyoqIEdlbjQgcHJlZGljYXRlZCBJRi4gKi8KK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6SUYodWludDMyX3QgcHJlZGljYXRlKQoreworICAgZnNfaW5zdCAqaW5zdCA9IG5ldyhtZW1fY3R4KSBmc19pbnN0KEJSV19PUENPREVfSUYpOworICAgaW5zdC0+cHJlZGljYXRlID0gcHJlZGljYXRlOworICAgcmV0dXJuIGluc3Q7Cit9CisKKy8qKiBHZW42IElGIHdpdGggZW1iZWRkZWQgY29tcGFyaXNvbi4gKi8KK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6SUYoZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxLCB1aW50MzJfdCBjb25kaXRpb24pCit7CisgICBhc3NlcnQoYnJ3LT5nZW4gPT0gNik7CisgICBmc19pbnN0ICppbnN0ID0gbmV3KG1lbV9jdHgpIGZzX2luc3QoQlJXX09QQ09ERV9JRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfbnVsbF9kLCBzcmMwLCBzcmMxKTsKKyAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IGNvbmRpdGlvbjsKKyAgIHJldHVybiBpbnN0OworfQorCisvKioKKyAqIENNUDogU2V0cyB0aGUgbG93IGJpdCBvZiB0aGUgZGVzdGluYXRpb24gY2hhbm5lbHMgd2l0aCB0aGUgcmVzdWx0CisgKiBvZiB0aGUgY29tcGFyaXNvbiwgd2hpbGUgdGhlIHVwcGVyIGJpdHMgYXJlIHVuZGVmaW5lZCwgYW5kIHVwZGF0ZXMKKyAqIHRoZSBmbGFnIHJlZ2lzdGVyIHdpdGggdGhlIHBhY2tlZCAxNiBiaXRzIG9mIHRoZSByZXN1bHQuCisgKi8KK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6Q01QKGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSwgdWludDMyX3QgY29uZGl0aW9uKQoreworICAgZnNfaW5zdCAqaW5zdDsKKworICAgLyogVGFrZSB0aGUgaW5zdHJ1Y3Rpb246CisgICAgKgorICAgICogQ01QIG51bGw8ZD4gc3JjMDxmPiBzcmMxPGY+CisgICAgKgorICAgICogT3JpZ2luYWwgZ2VuNCBkb2VzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZGVzdGluYXRpb24gdHlwZSBiZWZvcmUKKyAgICAqIGNvbXBhcmlzb24sIHByb2R1Y2luZyBnYXJiYWdlIHJlc3VsdHMgZm9yIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb25zLgorICAgICogZ2VuNSBkb2VzIHRoZSBjb21wYXJpc29uIG9uIHRoZSBleGVjdXRpb24gdHlwZSAocmVzb2x2ZWQgc291cmNlIHR5cGVzKSwKKyAgICAqIHNvIGRzdCB0eXBlIGRvZXNuJ3QgbWF0dGVyLiAgZ2VuNiBkb2VzIGNvbXBhcmlzb24gYW5kIHRoZW4gdXNlcyB0aGUKKyAgICAqIHJlc3VsdCBhcyBpZiBpdCB3YXMgdGhlIGRzdCB0eXBlIHdpdGggbm8gY29udmVyc2lvbiwgd2hpY2ggaGFwcGVucyB0bworICAgICogbW9zdGx5IHdvcmsgb3V0IGZvciBmbG9hdC1pbnRlcnByZXRlZC1hcy1pbnQgc2luY2Ugb3VyIGNvbXBhcmlzb25zIGFyZQorICAgICogZm9yID4wLCA9MCwgPDAuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA9PSA0KSB7CisgICAgICBkc3QudHlwZSA9IHNyYzAudHlwZTsKKyAgICAgIGlmIChkc3QuZmlsZSA9PSBIV19SRUcpCisJIGRzdC5maXhlZF9od19yZWcudHlwZSA9IGRzdC50eXBlOworICAgfQorCisgICByZXNvbHZlX3VkX25lZ2F0ZSgmc3JjMCk7CisgICByZXNvbHZlX3VkX25lZ2F0ZSgmc3JjMSk7CisKKyAgIGluc3QgPSBuZXcobWVtX2N0eCkgZnNfaW5zdChCUldfT1BDT0RFX0NNUCwgZHN0LCBzcmMwLCBzcmMxKTsKKyAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IGNvbmRpdGlvbjsKKworICAgcmV0dXJuIGluc3Q7Cit9CisKK2V4ZWNfbGlzdAorZnNfdmlzaXRvcjo6VkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQUQoY29uc3QgZnNfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmc19yZWcgJnN1cmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmc19yZWcgJnZhcnlpbmdfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29uc3Rfb2Zmc2V0KQoreworICAgZXhlY19saXN0IGluc3RydWN0aW9uczsKKyAgIGZzX2luc3QgKmluc3Q7CisKKyAgIC8qIFdlIGhhdmUgb3VyIGNvbnN0YW50IHN1cmZhY2UgdXNlIGEgcGl0Y2ggb2YgNCBieXRlcywgc28gb3VyIGluZGV4IGNhbgorICAgICogYmUgYW55IGNvbXBvbmVudCBvZiBhIHZlY3RvciwgYW5kIHRoZW4gd2UgbG9hZCA0IGNvbnRpZ3VvdXMKKyAgICAqIGNvbXBvbmVudHMgc3RhcnRpbmcgZnJvbSB0aGF0LgorICAgICoKKyAgICAqIFdlIGJyZWFrIGRvd24gdGhlIGNvbnN0X29mZnNldCB0byBhIHBvcnRpb24gYWRkZWQgdG8gdGhlIHZhcmlhYmxlCisgICAgKiBvZmZzZXQgYW5kIGEgcG9ydGlvbiBkb25lIHVzaW5nIHJlZ19vZmZzZXQsIHdoaWNoIG1lYW5zIHRoYXQgaWYgeW91CisgICAgKiBoYXZlIEdMU0wgdXNpbmcgc29tZXRoaW5nIGxpa2UgInVuaWZvcm0gdmVjNCBhWzIwXTsgZ2xfRnJhZ0NvbG9yID0KKyAgICAqIGFbaV0iLCB3ZSdsbCB0ZW1wb3JhcmlseSBnZW5lcmF0ZSA0IHZlYzQgbG9hZHMgZnJvbSBvZmZzZXQgaSAqIDQsIGFuZAorICAgICogQ1NFIGNhbiBsYXRlciBub3RpY2UgdGhhdCB0aG9zZSBsb2FkcyBhcmUgYWxsIHRoZSBzYW1lIGFuZCBlbGltaW5hdGUKKyAgICAqIHRoZSByZWR1bmRhbnQgb25lcy4KKyAgICAqLworICAgZnNfcmVnIHZlYzRfb2Zmc2V0ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6aW50X3R5cGUpOworICAgaW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChBREQodmVjNF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJ5aW5nX29mZnNldCwgY29uc3Rfb2Zmc2V0ICYgfjMpKTsKKworICAgaW50IHNjYWxlID0gMTsKKyAgIGlmIChicnctPmdlbiA9PSA0ICYmIGRpc3BhdGNoX3dpZHRoID09IDgpIHsKKyAgICAgIC8qIFByZS1nZW41LCB3ZSBjYW4gZWl0aGVyIHVzZSBhIFNJTUQ4IG1lc3NhZ2UgdGhhdCByZXF1aXJlcyAoaGVhZGVyLAorICAgICAgICogdSwgdiwgcikgYXMgcGFyYW1ldGVycywgb3Igd2UgY2FuIGp1c3QgdXNlIHRoZSBTSU1EMTYgbWVzc2FnZQorICAgICAgICogY29uc2lzdGluZyBvZiAoaGVhZGVyLCB1KS4gIFdlIGNob29zZSB0aGUgc2Vjb25kLCBhdCB0aGUgY29zdCBvZiBhCisgICAgICAgKiBsb25nZXIgcmV0dXJuIGxlbmd0aC4KKyAgICAgICAqLworICAgICAgc2NhbGUgPSAyOworICAgfQorCisgICBlbnVtIG9wY29kZSBvcDsKKyAgIGlmIChicnctPmdlbiA+PSA3KQorICAgICAgb3AgPSBGU19PUENPREVfVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQURfR0VONzsKKyAgIGVsc2UKKyAgICAgIG9wID0gRlNfT1BDT0RFX1ZBUllJTkdfUFVMTF9DT05TVEFOVF9MT0FEOworICAgZnNfcmVnIHZlYzRfcmVzdWx0ID0gZnNfcmVnKEdSRiwgdmlydHVhbF9ncmZfYWxsb2MoNCAqIHNjYWxlKSwgZHN0LnR5cGUpOworICAgaW5zdCA9IG5ldyhtZW1fY3R4KSBmc19pbnN0KG9wLCB2ZWM0X3Jlc3VsdCwgc3VyZl9pbmRleCwgdmVjNF9vZmZzZXQpOworICAgaW5zdC0+cmVnc193cml0dGVuID0gNCAqIHNjYWxlOworICAgaW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChpbnN0KTsKKworICAgaWYgKGJydy0+Z2VuIDwgNykgeworICAgICAgaW5zdC0+YmFzZV9tcmYgPSAxMzsKKyAgICAgIGluc3QtPmhlYWRlcl9wcmVzZW50ID0gdHJ1ZTsKKyAgICAgIGlmIChicnctPmdlbiA9PSA0KQorICAgICAgICAgaW5zdC0+bWxlbiA9IDM7CisgICAgICBlbHNlCisgICAgICAgICBpbnN0LT5tbGVuID0gMSArIGRpc3BhdGNoX3dpZHRoIC8gODsKKyAgIH0KKworICAgdmVjNF9yZXN1bHQucmVnX29mZnNldCArPSAoY29uc3Rfb2Zmc2V0ICYgMykgKiBzY2FsZTsKKyAgIGluc3RydWN0aW9ucy5wdXNoX3RhaWwoTU9WKGRzdCwgdmVjNF9yZXN1bHQpKTsKKworICAgcmV0dXJuIGluc3RydWN0aW9uczsKK30KKworLyoqCisgKiBBIGhlbHBlciBmb3IgTU9WIGdlbmVyYXRpb24gZm9yIGZpeGluZyB1cCBicm9rZW4gaGFyZHdhcmUgU0VORCBkZXBlbmRlbmN5CisgKiBoYW5kbGluZy4KKyAqLworZnNfaW5zdCAqCitmc192aXNpdG9yOjpERVBfUkVTT0xWRV9NT1YoaW50IGdyZikKK3sKKyAgIGZzX2luc3QgKmluc3QgPSBNT1YoYnJ3X251bGxfcmVnKCksIGZzX3JlZyhHUkYsIGdyZiwgQlJXX1JFR0lTVEVSX1RZUEVfRikpOworCisgICBpbnN0LT5pciA9IE5VTEw7CisgICBpbnN0LT5hbm5vdGF0aW9uID0gInNlbmQgZGVwZW5kZW5jeSByZXNvbHZlIjsKKworICAgLyogVGhlIGNhbGxlciBhbHdheXMgd2FudHMgdW5jb21wcmVzc2VkIHRvIGVtaXQgdGhlIG1pbmltYWwgZXh0cmEKKyAgICAqIGRlcGVuZGVuY2llcywgYW5kIHRvIGF2b2lkIGhhdmluZyB0byBkZWFsIHdpdGggYWxpZ25pbmcgaXRzIHJlZ3MgdG8gMi4KKyAgICAqLworICAgaW5zdC0+Zm9yY2VfdW5jb21wcmVzc2VkID0gdHJ1ZTsKKworICAgcmV0dXJuIGluc3Q7Cit9CisKK2Jvb2wKK2ZzX2luc3Q6OmVxdWFscyhmc19pbnN0ICppbnN0KSBjb25zdAoreworICAgcmV0dXJuIChvcGNvZGUgPT0gaW5zdC0+b3Bjb2RlICYmCisgICAgICAgICAgIGRzdC5lcXVhbHMoaW5zdC0+ZHN0KSAmJgorICAgICAgICAgICBzcmNbMF0uZXF1YWxzKGluc3QtPnNyY1swXSkgJiYKKyAgICAgICAgICAgc3JjWzFdLmVxdWFscyhpbnN0LT5zcmNbMV0pICYmCisgICAgICAgICAgIHNyY1syXS5lcXVhbHMoaW5zdC0+c3JjWzJdKSAmJgorICAgICAgICAgICBzYXR1cmF0ZSA9PSBpbnN0LT5zYXR1cmF0ZSAmJgorICAgICAgICAgICBwcmVkaWNhdGUgPT0gaW5zdC0+cHJlZGljYXRlICYmCisgICAgICAgICAgIGNvbmRpdGlvbmFsX21vZCA9PSBpbnN0LT5jb25kaXRpb25hbF9tb2QgJiYKKyAgICAgICAgICAgbWxlbiA9PSBpbnN0LT5tbGVuICYmCisgICAgICAgICAgIGJhc2VfbXJmID09IGluc3QtPmJhc2VfbXJmICYmCisgICAgICAgICAgIHNhbXBsZXIgPT0gaW5zdC0+c2FtcGxlciAmJgorICAgICAgICAgICB0YXJnZXQgPT0gaW5zdC0+dGFyZ2V0ICYmCisgICAgICAgICAgIGVvdCA9PSBpbnN0LT5lb3QgJiYKKyAgICAgICAgICAgaGVhZGVyX3ByZXNlbnQgPT0gaW5zdC0+aGVhZGVyX3ByZXNlbnQgJiYKKyAgICAgICAgICAgc2hhZG93X2NvbXBhcmUgPT0gaW5zdC0+c2hhZG93X2NvbXBhcmUgJiYKKyAgICAgICAgICAgb2Zmc2V0ID09IGluc3QtPm9mZnNldCk7Cit9CisKK2Jvb2wKK2ZzX2luc3Q6Om92ZXJ3cml0ZXNfcmVnKGNvbnN0IGZzX3JlZyAmcmVnKSBjb25zdAoreworICAgcmV0dXJuIChyZWcuZmlsZSA9PSBkc3QuZmlsZSAmJgorICAgICAgICAgICByZWcucmVnID09IGRzdC5yZWcgJiYKKyAgICAgICAgICAgcmVnLnJlZ19vZmZzZXQgPj0gZHN0LnJlZ19vZmZzZXQgICYmCisgICAgICAgICAgIHJlZy5yZWdfb2Zmc2V0IDwgZHN0LnJlZ19vZmZzZXQgKyByZWdzX3dyaXR0ZW4pOworfQorCitib29sCitmc19pbnN0Ojppc19zZW5kX2Zyb21fZ3JmKCkgY29uc3QKK3sKKyAgIHJldHVybiAob3Bjb2RlID09IEZTX09QQ09ERV9WQVJZSU5HX1BVTExfQ09OU1RBTlRfTE9BRF9HRU43IHx8CisgICAgICAgICAgIC8vIEx1bmFyRyA6IFRPRE8gLSBzaGFkZXIgdGltZT8/CisgICAgICAgICAgIC8vb3Bjb2RlID09IFNIQURFUl9PUENPREVfU0hBREVSX1RJTUVfQUREIHx8CisgICAgICAgICAgIChvcGNvZGUgPT0gRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FEICYmCisgICAgICAgICAgICBzcmNbMV0uZmlsZSA9PSBHUkYpIHx8CisgICAgICAgICAgIChpc190ZXgoKSAmJiBzcmNbMF0uZmlsZSA9PSBHUkYpKTsKK30KKworYm9vbAorZnNfdmlzaXRvcjo6Y2FuX2RvX3NvdXJjZV9tb2RzKGZzX2luc3QgKmluc3QpCit7CisgICBpZiAoYnJ3LT5nZW4gPT0gNiAmJiBpbnN0LT5pc19tYXRoKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmIChpbnN0LT5pc19zZW5kX2Zyb21fZ3JmKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICghaW5zdC0+Y2FuX2RvX3NvdXJjZV9tb2RzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHJldHVybiB0cnVlOworfQorCit2b2lkCitmc19yZWc6OmluaXQoKQoreworICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgc3RyaWRlID0gMTsKK30KKworLyoqIEdlbmVyaWMgdW5zZXQgcmVnaXN0ZXIgY29uc3RydWN0b3IuICovCitmc19yZWc6OmZzX3JlZygpCit7CisgICBpbml0KCk7CisgICB0aGlzLT5maWxlID0gQkFEX0ZJTEU7Cit9CisKKy8qKiBJbW1lZGlhdGUgdmFsdWUgY29uc3RydWN0b3IuICovCitmc19yZWc6OmZzX3JlZyhmbG9hdCBmKQoreworICAgaW5pdCgpOworICAgdGhpcy0+ZmlsZSA9IElNTTsKKyAgIHRoaXMtPnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9GOworICAgdGhpcy0+aW1tLmYgPSBmOworfQorCisvKiogSW1tZWRpYXRlIHZhbHVlIGNvbnN0cnVjdG9yLiAqLworZnNfcmVnOjpmc19yZWcoaW50MzJfdCBpKQoreworICAgaW5pdCgpOworICAgdGhpcy0+ZmlsZSA9IElNTTsKKyAgIHRoaXMtPnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9EOworICAgdGhpcy0+aW1tLmkgPSBpOworfQorCisvKiogSW1tZWRpYXRlIHZhbHVlIGNvbnN0cnVjdG9yLiAqLworZnNfcmVnOjpmc19yZWcodWludDMyX3QgdSkKK3sKKyAgIGluaXQoKTsKKyAgIHRoaXMtPmZpbGUgPSBJTU07CisgICB0aGlzLT50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVUQ7CisgICB0aGlzLT5pbW0udSA9IHU7Cit9CisKKy8qKiBGaXhlZCBicndfcmVnLiAqLworZnNfcmVnOjpmc19yZWcoc3RydWN0IGJyd19yZWcgZml4ZWRfaHdfcmVnKQoreworICAgaW5pdCgpOworICAgdGhpcy0+ZmlsZSA9IEhXX1JFRzsKKyAgIHRoaXMtPmZpeGVkX2h3X3JlZyA9IGZpeGVkX2h3X3JlZzsKKyAgIHRoaXMtPnR5cGUgPSBmaXhlZF9od19yZWcudHlwZTsKK30KKworYm9vbAorZnNfcmVnOjplcXVhbHMoY29uc3QgZnNfcmVnICZyKSBjb25zdAoreworICAgcmV0dXJuIChmaWxlID09IHIuZmlsZSAmJgorICAgICAgICAgICByZWcgPT0gci5yZWcgJiYKKyAgICAgICAgICAgcmVnX29mZnNldCA9PSByLnJlZ19vZmZzZXQgJiYKKyAgICAgICAgICAgc3VicmVnX29mZnNldCA9PSByLnN1YnJlZ19vZmZzZXQgJiYKKyAgICAgICAgICAgdHlwZSA9PSByLnR5cGUgJiYKKyAgICAgICAgICAgbmVnYXRlID09IHIubmVnYXRlICYmCisgICAgICAgICAgIGFicyA9PSByLmFicyAmJgorICAgICAgICAgICAhcmVsYWRkciAmJiAhci5yZWxhZGRyICYmCisgICAgICAgICAgIG1lbWNtcCgmZml4ZWRfaHdfcmVnLCAmci5maXhlZF9od19yZWcsCisgICAgICAgICAgICAgICAgICBzaXplb2YoZml4ZWRfaHdfcmVnKSkgPT0gMCAmJgorICAgICAgICAgICBzdHJpZGUgPT0gci5zdHJpZGUgJiYKKyAgICAgICAgICAgaW1tLnUgPT0gci5pbW0udSk7Cit9CisKK2ZzX3JlZyAmCitmc19yZWc6OmFwcGx5X3N0cmlkZSh1bnNpZ25lZCBzdHJpZGUpCit7CisgICBhc3NlcnQoKHRoaXMtPnN0cmlkZSAqIHN0cmlkZSkgPD0gNCAmJgorICAgICAgICAgIChpc19wb3dlcl9vZl90d28oc3RyaWRlKSB8fCBzdHJpZGUgPT0gMCkgJiYKKyAgICAgICAgICBmaWxlICE9IEhXX1JFRyAmJiBmaWxlICE9IElNTSk7CisgICB0aGlzLT5zdHJpZGUgKj0gc3RyaWRlOworICAgcmV0dXJuICp0aGlzOworfQorCitmc19yZWcgJgorZnNfcmVnOjpzZXRfc21lYXIodW5zaWduZWQgc3VicmVnKQoreworICAgYXNzZXJ0KGZpbGUgIT0gSFdfUkVHICYmIGZpbGUgIT0gSU1NKTsKKyAgIHN1YnJlZ19vZmZzZXQgPSBzdWJyZWcgKiB0eXBlX3N6KHR5cGUpOworICAgc3RyaWRlID0gMDsKKyAgIHJldHVybiAqdGhpczsKK30KKworYm9vbAorZnNfcmVnOjppc19jb250aWd1b3VzKCkgY29uc3QKK3sKKyAgIHJldHVybiBzdHJpZGUgPT0gMTsKK30KKworYm9vbAorZnNfcmVnOjppc196ZXJvKCkgY29uc3QKK3sKKyAgIGlmIChmaWxlICE9IElNTSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRiA/IGltbS5mID09IDAuMCA6IGltbS5pID09IDA7Cit9CisKK2Jvb2wKK2ZzX3JlZzo6aXNfb25lKCkgY29uc3QKK3sKKyAgIGlmIChmaWxlICE9IElNTSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRiA/IGltbS5mID09IDEuMCA6IGltbS5pID09IDE7Cit9CisKK2Jvb2wKK2ZzX3JlZzo6aXNfbnVsbCgpIGNvbnN0Cit7CisgICByZXR1cm4gZmlsZSA9PSBIV19SRUcgJiYKKyAgICAgICAgICBmaXhlZF9od19yZWcuZmlsZSA9PSBCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUgJiYKKyAgICAgICAgICBmaXhlZF9od19yZWcubnIgPT0gQlJXX0FSRl9OVUxMOworfQorCitib29sCitmc19yZWc6OmlzX3ZhbGlkXzNzcmMoKSBjb25zdAoreworICAgcmV0dXJuIGZpbGUgPT0gR1JGIHx8IGZpbGUgPT0gVU5JRk9STTsKK30KKworYm9vbAorZnNfcmVnOjppc19hY2N1bXVsYXRvcigpIGNvbnN0Cit7CisgICByZXR1cm4gZmlsZSA9PSBIV19SRUcgJiYKKyAgICAgICAgICBmaXhlZF9od19yZWcuZmlsZSA9PSBCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUgJiYKKyAgICAgICAgICBmaXhlZF9od19yZWcubnIgPT0gQlJXX0FSRl9BQ0NVTVVMQVRPUjsKK30KKworaW50Citmc192aXNpdG9yOjp0eXBlX3NpemUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHVuc2lnbmVkIGludCBzaXplLCBpOworCisgICBzd2l0Y2ggKHR5cGUtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIHJldHVybiB0eXBlLT5jb21wb25lbnRzKCk7CisgICBjYXNlIEdMU0xfVFlQRV9BUlJBWToKKyAgICAgIHJldHVybiB0eXBlX3NpemUodHlwZS0+ZmllbGRzLmFycmF5KSAqIHR5cGUtPmxlbmd0aDsKKyAgIGNhc2UgR0xTTF9UWVBFX1NUUlVDVDoKKyAgICAgIHNpemUgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IHR5cGUtPmxlbmd0aDsgaSsrKSB7CisJIHNpemUgKz0gdHlwZV9zaXplKHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSk7CisgICAgICB9CisgICAgICByZXR1cm4gc2l6ZTsKKyAgIGNhc2UgR0xTTF9UWVBFX1NBTVBMRVI6CisgICAgICAvKiBTYW1wbGVycyB0YWtlIHVwIG5vIHJlZ2lzdGVyIHNwYWNlLCBzaW5jZSB0aGV5J3JlIGJha2VkIGluIGF0CisgICAgICAgKiBsaW5rIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHJldHVybiAwOworICAgY2FzZSBHTFNMX1RZUEVfQVRPTUlDX1VJTlQ6CisgICAgICByZXR1cm4gMDsKKyAgIGNhc2UgR0xTTF9UWVBFX0lNQUdFOgorICAgY2FzZSBHTFNMX1RZUEVfVk9JRDoKKyAgIGNhc2UgR0xTTF9UWVBFX0VSUk9SOgorICAgY2FzZSBHTFNMX1RZUEVfSU5URVJGQUNFOgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gMDsKK30KKworCitmc19yZWcKK2ZzX3Zpc2l0b3I6OmdldF90aW1lc3RhbXAoKQoreworICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworCisgICBmc19yZWcgdHMgPSBmc19yZWcocmV0eXBlKGJyd192ZWMxX3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfQVJGX1RJTUVTVEFNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworCisgICBmc19yZWcgZHN0ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKworICAgZnNfaW5zdCAqbW92ID0gZW1pdChNT1YoZHN0LCB0cykpOworICAgLyogV2Ugd2FudCB0byByZWFkIHRoZSAzIGZpZWxkcyB3ZSBjYXJlIGFib3V0IChtb3N0bHkgZmllbGQgMCwgYnV0IGFsc28gMikKKyAgICAqIGV2ZW4gaWYgaXQncyBub3QgZW5hYmxlZCBpbiB0aGUgZGlzcGF0Y2guCisgICAgKi8KKyAgIG1vdi0+Zm9yY2Vfd3JpdGVtYXNrX2FsbCA9IHRydWU7CisgICBtb3YtPmZvcmNlX3VuY29tcHJlc3NlZCA9IHRydWU7CisKKyAgIC8qIFRoZSBjYWxsZXIgd2FudHMgdGhlIGxvdyAzMiBiaXRzIG9mIHRoZSB0aW1lc3RhbXAuICBTaW5jZSBpdCdzIHJ1bm5pbmcKKyAgICAqIGF0IHRoZSBHUFUgY2xvY2sgcmF0ZSBvZiB+MS4yZ2h6LCBpdCB3aWxsIHJvbGwgb3ZlciBldmVyeSB+MyBzZWNvbmRzLAorICAgICogd2hpY2ggaXMgcGxlbnR5IG9mIHRpbWUgZm9yIG91ciBwdXJwb3Nlcy4gIEl0IGlzIGlkZW50aWNhbCBhY3Jvc3MgdGhlCisgICAgKiBFVXMsIGJ1dCBzaW5jZSBpdCdzIHRyYWNraW5nIEdQVSBjb3JlIHNwZWVkIGl0IHdpbGwgaW5jcmVtZW50IGF0IGEKKyAgICAqIHZhcnlpbmcgcmF0ZSBhcyByZW5kZXIgUC1zdGF0ZXMgY2hhbmdlLgorICAgICoKKyAgICAqIFRoZSBjYWxsZXIgY291bGQgYWxzbyBjaGVjayBpZiByZW5kZXIgUC1zdGF0ZXMgaGF2ZSBjaGFuZ2VkIChvciBhbnl0aGluZworICAgICogZWxzZSB0aGF0IG1pZ2h0IGRpc3J1cHQgdGltaW5nKSBieSBzZXR0aW5nIHNtZWFyIHRvIDIgYW5kIGNoZWNraW5nIGlmCisgICAgKiB0aGF0IGZpZWxkIGlzICE9IDAuCisgICAgKi8KKyAgIGRzdC5zZXRfc21lYXIoMCk7CisKKyAgIHJldHVybiBkc3Q7Cit9CisKKy8vIEx1bmFyRzogVE9ETyAtIHN1cHBvcnQgc2hhZGVyIHRpbWU/CisvL3ZvaWQKKy8vZnNfdmlzaXRvcjo6ZW1pdF9zaGFkZXJfdGltZV9iZWdpbigpCisvL3sKKy8vICAgY3VycmVudF9hbm5vdGF0aW9uID0gInNoYWRlciB0aW1lIHN0YXJ0IjsKKy8vICAgc2hhZGVyX3N0YXJ0X3RpbWUgPSBnZXRfdGltZXN0YW1wKCk7CisvL30KKworLy92b2lkCisvL2ZzX3Zpc2l0b3I6OmVtaXRfc2hhZGVyX3RpbWVfZW5kKCkKKy8veworLy8gICBjdXJyZW50X2Fubm90YXRpb24gPSAic2hhZGVyIHRpbWUgZW5kIjsKKworLy8gICBlbnVtIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHR5cGUsIHdyaXR0ZW5fdHlwZSwgcmVzZXRfdHlwZTsKKy8vICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDgpIHsKKy8vICAgICAgdHlwZSA9IFNUX0ZTODsKKy8vICAgICAgd3JpdHRlbl90eXBlID0gU1RfRlM4X1dSSVRURU47CisvLyAgICAgIHJlc2V0X3R5cGUgPSBTVF9GUzhfUkVTRVQ7CisvLyAgIH0gZWxzZSB7CisvLyAgICAgIGFzc2VydChkaXNwYXRjaF93aWR0aCA9PSAxNik7CisvLyAgICAgIHR5cGUgPSBTVF9GUzE2OworLy8gICAgICB3cml0dGVuX3R5cGUgPSBTVF9GUzE2X1dSSVRURU47CisvLyAgICAgIHJlc2V0X3R5cGUgPSBTVF9GUzE2X1JFU0VUOworLy8gICB9CisKKy8vICAgZnNfcmVnIHNoYWRlcl9lbmRfdGltZSA9IGdldF90aW1lc3RhbXAoKTsKKworLy8gICAvKiBDaGVjayB0aGF0IHRoZXJlIHdlcmVuJ3QgYW55IHRpbWVzdGFtcCByZXNldCBldmVudHMgKGFzc3VtaW5nIHRoZXNlCisvLyAgICAqIHdlcmUgdGhlIG9ubHkgdHdvIHRpbWVzdGFtcCByZWFkcyB0aGF0IGhhcHBlbmVkKS4KKy8vICAgICovCisvLyAgIGZzX3JlZyByZXNldCA9IHNoYWRlcl9lbmRfdGltZTsKKy8vICAgcmVzZXQuc2V0X3NtZWFyKDIpOworLy8gICBmc19pbnN0ICp0ZXN0ID0gZW1pdChBTkQocmVnX251bGxfZCwgcmVzZXQsIGZzX3JlZygxdSkpKTsKKy8vICAgdGVzdC0+Y29uZGl0aW9uYWxfbW9kID0gQlJXX0NPTkRJVElPTkFMX1o7CisvLyAgIGVtaXQoSUYoQlJXX1BSRURJQ0FURV9OT1JNQUwpKTsKKworLy8gICBwdXNoX2ZvcmNlX3VuY29tcHJlc3NlZCgpOworLy8gICBmc19yZWcgc3RhcnQgPSBzaGFkZXJfc3RhcnRfdGltZTsKKy8vICAgc3RhcnQubmVnYXRlID0gdHJ1ZTsKKy8vICAgZnNfcmVnIGRpZmYgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworLy8gICBlbWl0KEFERChkaWZmLCBzdGFydCwgc2hhZGVyX2VuZF90aW1lKSk7CisKKy8vICAgLyogSWYgdGhlcmUgd2VyZSBubyBpbnN0cnVjdGlvbnMgYmV0d2VlbiB0aGUgdHdvIHRpbWVzdGFtcCBnZXRzLCB0aGUgZGlmZgorLy8gICAgKiBpcyAyIGN5Y2xlcy4gIFJlbW92ZSB0aGF0IG92ZXJoZWFkLCBzbyBJIGNhbiBmb3JnZXQgYWJvdXQgdGhhdCB3aGVuCisvLyAgICAqIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIHRpbWUgdGFrZW4gZm9yIHNpbmdsZSBpbnN0cnVjdGlvbnMuCisvLyAgICAqLworLy8gICBlbWl0KEFERChkaWZmLCBkaWZmLCBmc19yZWcoLTJ1KSkpOworCisvLyAgIGVtaXRfc2hhZGVyX3RpbWVfd3JpdGUodHlwZSwgZGlmZik7CisvLyAgIGVtaXRfc2hhZGVyX3RpbWVfd3JpdGUod3JpdHRlbl90eXBlLCBmc19yZWcoMXUpKTsKKy8vICAgZW1pdChCUldfT1BDT0RFX0VMU0UpOworLy8gICBlbWl0X3NoYWRlcl90aW1lX3dyaXRlKHJlc2V0X3R5cGUsIGZzX3JlZygxdSkpOworLy8gICBlbWl0KEJSV19PUENPREVfRU5ESUYpOworCisvLyAgIHBvcF9mb3JjZV91bmNvbXByZXNzZWQoKTsKKy8vfQorCisvL3ZvaWQKKy8vZnNfdmlzaXRvcjo6ZW1pdF9zaGFkZXJfdGltZV93cml0ZShlbnVtIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHR5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIHZhbHVlKQorLy97CisvLyAgIGludCBzaGFkZXJfdGltZV9pbmRleCA9CisvLyAgICAgIGJyd19nZXRfc2hhZGVyX3RpbWVfaW5kZXgoYnJ3LCBzaGFkZXJfcHJvZywgJmZwLT5CYXNlLCB0eXBlKTsKKy8vICAgZnNfcmVnIG9mZnNldCA9IGZzX3JlZyhzaGFkZXJfdGltZV9pbmRleCAqIFNIQURFUl9USU1FX1NUUklERSk7CisKKy8vICAgZnNfcmVnIHBheWxvYWQ7CisvLyAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSA4KQorLy8gICAgICBwYXlsb2FkID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dXZlYzJfdHlwZSk7CisvLyAgIGVsc2UKKy8vICAgICAgcGF5bG9hZCA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisKKy8vICAgZW1pdChuZXcobWVtX2N0eCkgZnNfaW5zdChTSEFERVJfT1BDT0RFX1NIQURFUl9USU1FX0FERCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcoKSwgcGF5bG9hZCwgb2Zmc2V0LCB2YWx1ZSkpOworLy99CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZmYWlsKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKK3sKKyAgIGNoYXIgKm1zZzsKKworICAgaWYgKGZhaWxlZCkKKyAgICAgIHJldHVybjsKKworICAgZmFpbGVkID0gdHJ1ZTsKKworICAgbXNnID0gcmFsbG9jX3Zhc3ByaW50ZihtZW1fY3R4LCBmb3JtYXQsIHZhKTsKKyAgIG1zZyA9IHJhbGxvY19hc3ByaW50ZihtZW1fY3R4LCAiRlMgY29tcGlsZSBmYWlsZWQ6ICVzXG4iLCBtc2cpOworCisgICB0aGlzLT5mYWlsX21zZyA9IG1zZzsKKworICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfV00pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCAgbXNnKTsKKyAgIH0KK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZmFpbChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgIHZhX2xpc3QgdmE7CisKKyAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgdmZhaWwoZm9ybWF0LCB2YSk7CisgICB2YV9lbmQodmEpOworfQorCisvKioKKyAqIE1hcmsgdGhpcyBwcm9ncmFtIGFzIGltcG9zc2libGUgdG8gY29tcGlsZSBpbiBTSU1EMTYgbW9kZS4KKyAqCisgKiBEdXJpbmcgdGhlIFNJTUQ4IGNvbXBpbGUgKHdoaWNoIGhhcHBlbnMgZmlyc3QpLCB3ZSBjYW4gZGV0ZWN0IGFuZCBmbGFnCisgKiB0aGluZ3MgdGhhdCBhcmUgdW5zdXBwb3J0ZWQgaW4gU0lNRDE2IG1vZGUsIHNvIHRoZSBjb21waWxlciBjYW4gc2tpcAorICogdGhlIFNJTUQxNiBjb21waWxlIGFsdG9nZXRoZXIuCisgKgorICogRHVyaW5nIGEgU0lNRDE2IGNvbXBpbGUgKGlmIG9uZSBoYXBwZW5zIGFueXdheSksIHRoaXMganVzdCBjYWxscyBmYWlsKCkuCisgKi8KK3ZvaWQKK2ZzX3Zpc2l0b3I6Om5vMTYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICB2YV9saXN0IHZhOworCisgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKworICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICB2ZmFpbChmb3JtYXQsIHZhKTsKKyAgIH0gZWxzZSB7CisgICAgICBzaW1kMTZfdW5zdXBwb3J0ZWQgPSB0cnVlOworCisgICAgICBpZiAoYnJ3LT5wZXJmX2RlYnVnKSB7CisgICAgICAgICBpZiAobm8xNl9tc2cpCisgICAgICAgICAgICByYWxsb2NfdmFzcHJpbnRmX2FwcGVuZCgmbm8xNl9tc2csIGZvcm1hdCwgdmEpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbm8xNl9tc2cgPSByYWxsb2NfdmFzcHJpbnRmKG1lbV9jdHgsIGZvcm1hdCwgdmEpOworICAgICAgfQorICAgfQorCisgICB2YV9lbmQodmEpOworfQorCitmc19pbnN0ICoKK2ZzX3Zpc2l0b3I6OmVtaXQoZW51bSBvcGNvZGUgb3Bjb2RlKQoreworICAgcmV0dXJuIGVtaXQobmV3KG1lbV9jdHgpIGZzX2luc3Qob3Bjb2RlKSk7Cit9CisKK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6ZW1pdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QpCit7CisgICByZXR1cm4gZW1pdChuZXcobWVtX2N0eCkgZnNfaW5zdChvcGNvZGUsIGRzdCkpOworfQorCitmc19pbnN0ICoKK2ZzX3Zpc2l0b3I6OmVtaXQoZW51bSBvcGNvZGUgb3Bjb2RlLCBmc19yZWcgZHN0LCBmc19yZWcgc3JjMCkKK3sKKyAgIHJldHVybiBlbWl0KG5ldyhtZW1fY3R4KSBmc19pbnN0KG9wY29kZSwgZHN0LCBzcmMwKSk7Cit9CisKK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6ZW1pdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSkKK3sKKyAgIHJldHVybiBlbWl0KG5ldyhtZW1fY3R4KSBmc19pbnN0KG9wY29kZSwgZHN0LCBzcmMwLCBzcmMxKSk7Cit9CisKK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6ZW1pdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QsCisgICAgICAgICAgICAgICAgIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSwgZnNfcmVnIHNyYzIpCit7CisgICByZXR1cm4gZW1pdChuZXcobWVtX2N0eCkgZnNfaW5zdChvcGNvZGUsIGRzdCwgc3JjMCwgc3JjMSwgc3JjMikpOworfQorCit2b2lkCitmc192aXNpdG9yOjpwdXNoX2ZvcmNlX3VuY29tcHJlc3NlZCgpCit7CisgICBmb3JjZV91bmNvbXByZXNzZWRfc3RhY2srKzsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6cG9wX2ZvcmNlX3VuY29tcHJlc3NlZCgpCit7CisgICBmb3JjZV91bmNvbXByZXNzZWRfc3RhY2stLTsKKyAgIGFzc2VydChmb3JjZV91bmNvbXByZXNzZWRfc3RhY2sgPj0gMCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYSBmbGFnIHRoYXQgbWVhbnMgaXQgd29uJ3QKKyAqIHVwZGF0ZSBhbiBlbnRpcmUgZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgKgorICogRm9yIGV4YW1wbGUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiBhbmQgbGl2ZSB2YXJpYWJsZSBhbmFseXNpcyB3YW50IHRvIGtub3cKKyAqIHdoZW4gYSB3cml0ZSB0byBhIHZhcmlhYmxlIHNjcmVlbnMgb2ZmIGFueSBwcmVjZWRpbmcgdmFsdWVzIHRoYXQgd2VyZSBpbgorICogaXQuCisgKi8KK2Jvb2wKK2ZzX2luc3Q6OmlzX3BhcnRpYWxfd3JpdGUoKSBjb25zdAoreworICAgcmV0dXJuICgodGhpcy0+cHJlZGljYXRlICYmIHRoaXMtPm9wY29kZSAhPSBCUldfT1BDT0RFX1NFTCkgfHwKKyAgICAgICAgICAgdGhpcy0+Zm9yY2VfdW5jb21wcmVzc2VkIHx8CisgICAgICAgICAgIHRoaXMtPmZvcmNlX3NlY2hhbGYgfHwgIXRoaXMtPmRzdC5pc19jb250aWd1b3VzKCkpOworfQorCitpbnQKK2ZzX2luc3Q6OnJlZ3NfcmVhZChmc192aXNpdG9yICp2LCBpbnQgYXJnKSBjb25zdAoreworICAgaWYgKGlzX3RleCgpICYmIGFyZyA9PSAwICYmIHNyY1swXS5maWxlID09IEdSRikgeworICAgICAgaWYgKHYtPmRpc3BhdGNoX3dpZHRoID09IDE2KQorCSByZXR1cm4gKG1sZW4gKyAxKSAvIDI7CisgICAgICBlbHNlCisJIHJldHVybiBtbGVuOworICAgfQorICAgcmV0dXJuIDE7Cit9CisKK2Jvb2wKK2ZzX2luc3Q6OnJlYWRzX2ZsYWcoKSBjb25zdAoreworICAgcmV0dXJuIHByZWRpY2F0ZTsKK30KKworYm9vbAorZnNfaW5zdDo6d3JpdGVzX2ZsYWcoKSBjb25zdAoreworICAgcmV0dXJuIChjb25kaXRpb25hbF9tb2QgJiYgb3Bjb2RlICE9IEJSV19PUENPREVfU0VMKSB8fAorICAgICAgICAgIG9wY29kZSA9PSBGU19PUENPREVfTU9WX0RJU1BBVENIX1RPX0ZMQUdTOworfQorCisvKioKKyAqIFJldHVybnMgaG93IG1hbnkgTVJGcyBhbiBGUyBvcGNvZGUgd2lsbCB3cml0ZSBvdmVyLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgMCBvciAxIGltcGxpZWQgd3JpdGVzIGluIGFuIGFjdHVhbCBnZW4KKyAqIGluc3RydWN0aW9uIC0tIHRoZSBGUyBvcGNvZGVzIG9mdGVuIGdlbmVyYXRlIE1PVnMgaW4gYWRkaXRpb24uCisgKi8KK2ludAorZnNfdmlzaXRvcjo6aW1wbGllZF9tcmZfd3JpdGVzKGZzX2luc3QgKmluc3QpCit7CisgICBpZiAoaW5zdC0+bWxlbiA9PSAwKQorICAgICAgcmV0dXJuIDA7CisKKyAgIGlmIChpbnN0LT5iYXNlX21yZiA9PSAtMSkKKyAgICAgIHJldHVybiAwOworCisgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgY2FzZSBTSEFERVJfT1BDT0RFX1JDUDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9SU1E6CisgICBjYXNlIFNIQURFUl9PUENPREVfU1FSVDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9FWFAyOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0xPRzI6CisgICBjYXNlIFNIQURFUl9PUENPREVfU0lOOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0NPUzoKKyAgICAgIHJldHVybiAxICogZGlzcGF0Y2hfd2lkdGggLyA4OworICAgY2FzZSBTSEFERVJfT1BDT0RFX1BPVzoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1JFTUFJTkRFUjoKKyAgICAgIHJldHVybiAyICogZGlzcGF0Y2hfd2lkdGggLyA4OworICAgY2FzZSBTSEFERVJfT1BDT0RFX1RFWDoKKyAgIGNhc2UgRlNfT1BDT0RFX1RYQjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhGOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRl9DTVM6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhGX01DUzoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9URzQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfVEc0X09GRlNFVDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEw6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhTOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0xPRDoKKyAgICAgIHJldHVybiAxOworICAgY2FzZSBGU19PUENPREVfRkJfV1JJVEU6CisgICAgICByZXR1cm4gMjsKKyAgIGNhc2UgRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FEOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9SRUFEOgorICAgICAgcmV0dXJuIDE7CisgICBjYXNlIEZTX09QQ09ERV9WQVJZSU5HX1BVTExfQ09OU1RBTlRfTE9BRDoKKyAgICAgIHJldHVybiBpbnN0LT5tbGVuOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9XUklURToKKyAgICAgIHJldHVybiAyOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1VOVFlQRURfQVRPTUlDOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1VOVFlQRURfU1VSRkFDRV9SRUFEOgorICAgICAgcmV0dXJuIDA7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgICAgIHJldHVybiBpbnN0LT5tbGVuOworICAgfQorfQorCitpbnQKK2ZzX3Zpc2l0b3I6OnZpcnR1YWxfZ3JmX2FsbG9jKGludCBzaXplKQoreworICAgaWYgKHZpcnR1YWxfZ3JmX2FycmF5X3NpemUgPD0gdmlydHVhbF9ncmZfY291bnQpIHsKKyAgICAgIGlmICh2aXJ0dWFsX2dyZl9hcnJheV9zaXplID09IDApCisJIHZpcnR1YWxfZ3JmX2FycmF5X3NpemUgPSAxNjsKKyAgICAgIGVsc2UKKwkgdmlydHVhbF9ncmZfYXJyYXlfc2l6ZSAqPSAyOworICAgICAgdmlydHVhbF9ncmZfc2l6ZXMgPSByZXJhbGxvYyhtZW1fY3R4LCB2aXJ0dWFsX2dyZl9zaXplcywgaW50LAorCQkJCSAgIHZpcnR1YWxfZ3JmX2FycmF5X3NpemUpOworICAgfQorICAgdmlydHVhbF9ncmZfc2l6ZXNbdmlydHVhbF9ncmZfY291bnRdID0gc2l6ZTsKKyAgIHJldHVybiB2aXJ0dWFsX2dyZl9jb3VudCsrOworfQorCisvKiogRml4ZWQgSFcgcmVnIGNvbnN0cnVjdG9yLiAqLworZnNfcmVnOjpmc19yZWcoZW51bSByZWdpc3Rlcl9maWxlIGZpbGUsIGludCByZWcpCit7CisgICBpbml0KCk7CisgICB0aGlzLT5maWxlID0gZmlsZTsKKyAgIHRoaXMtPnJlZyA9IHJlZzsKKyAgIHRoaXMtPnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9GOworfQorCisvKiogRml4ZWQgSFcgcmVnIGNvbnN0cnVjdG9yLiAqLworZnNfcmVnOjpmc19yZWcoZW51bSByZWdpc3Rlcl9maWxlIGZpbGUsIGludCByZWcsIHVpbnQzMl90IHR5cGUpCit7CisgICBpbml0KCk7CisgICB0aGlzLT5maWxlID0gZmlsZTsKKyAgIHRoaXMtPnJlZyA9IHJlZzsKKyAgIHRoaXMtPnR5cGUgPSB0eXBlOworfQorCisvKiogQXV0b21hdGljIHJlZyBjb25zdHJ1Y3Rvci4gKi8KK2ZzX3JlZzo6ZnNfcmVnKGNsYXNzIGZzX3Zpc2l0b3IgKnYsIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpbml0KCk7CisKKyAgIHRoaXMtPmZpbGUgPSBHUkY7CisgICB0aGlzLT5yZWcgPSB2LT52aXJ0dWFsX2dyZl9hbGxvYyh2LT50eXBlX3NpemUodHlwZSkpOworICAgdGhpcy0+cmVnX29mZnNldCA9IDA7CisgICB0aGlzLT50eXBlID0gYnJ3X3R5cGVfZm9yX2Jhc2VfdHlwZSh0eXBlKTsKK30KKworZnNfcmVnICoKK2ZzX3Zpc2l0b3I6OnZhcmlhYmxlX3N0b3JhZ2UoaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIHJldHVybiAoZnNfcmVnICopaGFzaF90YWJsZV9maW5kKHRoaXMtPnZhcmlhYmxlX2h0LCB2YXIpOworfQorCit2b2lkCitpbXBvcnRfdW5pZm9ybXNfY2FsbGJhY2soY29uc3Qgdm9pZCAqa2V5LAorCQkJIHZvaWQgKmRhdGEsCisJCQkgdm9pZCAqY2xvc3VyZSkKK3sKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpkc3RfaHQgPSAoc3RydWN0IGhhc2hfdGFibGUgKiljbG9zdXJlOworICAgY29uc3QgZnNfcmVnICpyZWcgPSAoY29uc3QgZnNfcmVnICopZGF0YTsKKworICAgaWYgKHJlZy0+ZmlsZSAhPSBVTklGT1JNKQorICAgICAgcmV0dXJuOworCisgICBoYXNoX3RhYmxlX2luc2VydChkc3RfaHQsIGRhdGEsIGtleSk7Cit9CisKKy8qIEZvciBTSU1EMTYsIHdlIG5lZWQgdG8gZm9sbG93IGZyb20gdGhlIHVuaWZvcm0gc2V0dXAgb2YgU0lNRDggZGlzcGF0Y2guCisgKiBUaGlzIGJyaW5ncyBpbiB0aG9zZSB1bmlmb3JtIGRlZmluaXRpb25zCisgKi8KK3ZvaWQKK2ZzX3Zpc2l0b3I6OmltcG9ydF91bmlmb3Jtcyhmc192aXNpdG9yICp2KQoreworICAgaGFzaF90YWJsZV9jYWxsX2ZvcmVhY2godi0+dmFyaWFibGVfaHQsCisJCQkgICBpbXBvcnRfdW5pZm9ybXNfY2FsbGJhY2ssCisJCQkgICB2YXJpYWJsZV9odCk7CisgICB0aGlzLT5wdXNoX2NvbnN0YW50X2xvYyA9IHYtPnB1c2hfY29uc3RhbnRfbG9jOworICAgdGhpcy0+cHVsbF9jb25zdGFudF9sb2MgPSB2LT5wdWxsX2NvbnN0YW50X2xvYzsKKyAgIHRoaXMtPnVuaWZvcm1zID0gdi0+dW5pZm9ybXM7CisgICB0aGlzLT5wYXJhbV9zaXplID0gdi0+cGFyYW1fc2l6ZTsKK30KKworLyogT3VyIHN1cHBvcnQgZm9yIHVuaWZvcm1zIGlzIHBpZ2d5LWJhY2tlZCBvbiB0aGUgc3RydWN0CisgKiBnbF9mcmFnbWVudF9wcm9ncmFtLCBiZWNhdXNlIHRoYXQncyB3aGVyZSB0aGUgdmFsdWVzIGFjdHVhbGx5CisgKiBnZXQgc3RvcmVkLCByYXRoZXIgdGhhbiBpbiBzb21lIGdsb2JhbCBnbF9zaGFkZXJfcHJvZ3JhbSB1bmlmb3JtCisgKiBzdG9yZS4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6c2V0dXBfdW5pZm9ybV92YWx1ZXMoaXJfdmFyaWFibGUgKmlyKQoreworICAgaW50IG5hbWVsZW4gPSBzdHJsZW4oaXItPm5hbWUpOworCisgICAvKiBUaGUgZGF0YSBmb3Igb3VyIChub24tYnVpbHRpbikgdW5pZm9ybXMgaXMgc3RvcmVkIGluIGEgc2VyaWVzIG9mCisgICAgKiBnbF91bmlmb3JtX2RyaXZlcl9zdG9yYWdlIHN0cnVjdHMgZm9yIGVhY2ggc3ViY29tcG9uZW50IHRoYXQKKyAgICAqIGdsR2V0VW5pZm9ybUxvY2F0aW9uKCkgY291bGQgbmFtZS4gIFdlIGtub3cgaXQncyBiZWVuIHNldCB1cCBpbiB0aGUgc2FtZQorICAgICogb3JkZXIgd2UnZCB3YWxrIHRoZSB0eXBlLCBzbyB3YWxrIHRoZSBsaXN0IG9mIHN0b3JhZ2UgYW5kIGZpbmQgYW55dGhpbmcKKyAgICAqIHdpdGggb3VyIG5hbWUsIG9yIHRoZSBwcmVmaXggb2YgYSBjb21wb25lbnQgdGhhdCBzdGFydHMgd2l0aCBvdXIgbmFtZS4KKyAgICAqLworICAgdW5zaWduZWQgcGFyYW1zX2JlZm9yZSA9IHVuaWZvcm1zOworICAgZm9yICh1bnNpZ25lZCB1ID0gMDsgdSA8IHNoYWRlcl9wcm9nLT5OdW1Vc2VyVW5pZm9ybVN0b3JhZ2U7IHUrKykgeworICAgICAgc3RydWN0IGdsX3VuaWZvcm1fc3RvcmFnZSAqc3RvcmFnZSA9ICZzaGFkZXJfcHJvZy0+VW5pZm9ybVN0b3JhZ2VbdV07CisKKyAgICAgIGlmIChzdHJuY21wKGlyLT5uYW1lLCBzdG9yYWdlLT5uYW1lLCBuYW1lbGVuKSAhPSAwIHx8CisgICAgICAgICAgKHN0b3JhZ2UtPm5hbWVbbmFtZWxlbl0gIT0gMCAmJgorICAgICAgICAgICBzdG9yYWdlLT5uYW1lW25hbWVsZW5dICE9ICcuJyAmJgorICAgICAgICAgICBzdG9yYWdlLT5uYW1lW25hbWVsZW5dICE9ICdbJykpIHsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB1bnNpZ25lZCBzbG90cyA9IHN0b3JhZ2UtPnR5cGUtPmNvbXBvbmVudF9zbG90cygpOworICAgICAgaWYgKHN0b3JhZ2UtPmFycmF5X2VsZW1lbnRzKQorICAgICAgICAgc2xvdHMgKj0gc3RvcmFnZS0+YXJyYXlfZWxlbWVudHM7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzbG90czsgaSsrKSB7CisgICAgICAgICBzdGFnZV9wcm9nX2RhdGEtPnBhcmFtW3VuaWZvcm1zKytdID0gJnN0b3JhZ2UtPnN0b3JhZ2VbaV0uZjsKKyAgICAgIH0KKyAgIH0KKworICAgLyogTWFrZSBzdXJlIHdlIGFjdHVhbGx5IGluaXRpYWxpemVkIHRoZSByaWdodCBhbW91bnQgb2Ygc3R1ZmYgaGVyZS4gKi8KKyAgIGFzc2VydChwYXJhbXNfYmVmb3JlICsgaXItPnR5cGUtPmNvbXBvbmVudF9zbG90cygpID09IHVuaWZvcm1zKTsKKyAgICh2b2lkKXBhcmFtc19iZWZvcmU7Cit9CisKKworLyogT3VyIHN1cHBvcnQgZm9yIGJ1aWx0aW4gdW5pZm9ybXMgaXMgZXZlbiBzY2FyaWVyIHRoYW4gbm9uLWJ1aWx0aW4uCisgKiBJdCBzaXRzIG9uIHRvcCBvZiB0aGUgUFJPR19TVEFURV9WQVIgcGFyYW1ldGVycyB0aGF0IGFyZQorICogYXV0b21hdGljYWxseSB1cGRhdGVkIGZyb20gR0wgY29udGV4dCBzdGF0ZS4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6c2V0dXBfYnVpbHRpbl91bmlmb3JtX3ZhbHVlcyhpcl92YXJpYWJsZSAqaXIpCit7CisgICBjb25zdCBpcl9zdGF0ZV9zbG90ICpjb25zdCBzbG90cyA9IGlyLT5zdGF0ZV9zbG90czsKKyAgIGFzc2VydChpci0+c3RhdGVfc2xvdHMgIT0gTlVMTCk7CisKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXItPm51bV9zdGF0ZV9zbG90czsgaSsrKSB7CisgICAgICAvKiBUaGlzIHN0YXRlIHJlZmVyZW5jZSBoYXMgYWxyZWFkeSBiZWVuIHNldHVwIGJ5IGlyX3RvX21lc2EsIGJ1dCB3ZSdsbAorICAgICAgICogZ2V0IHRoZSBzYW1lIGluZGV4IGJhY2sgaGVyZS4KKyAgICAgICAqLworICAgICAgaW50IGluZGV4ID0gX21lc2FfYWRkX3N0YXRlX3JlZmVyZW5jZSh0aGlzLT5mcC0+QmFzZS5QYXJhbWV0ZXJzLAorCQkJCQkgICAgKGdsX3N0YXRlX2luZGV4ICopc2xvdHNbaV0udG9rZW5zKTsKKworICAgICAgLyogQWRkIGVhY2ggb2YgdGhlIHVuaXF1ZSBzd2l6emxlcyBvZiB0aGUgZWxlbWVudCBhcyBhIHBhcmFtZXRlci4KKyAgICAgICAqIFRoaXMnbGwgZW5kIHVwIG1hdGNoaW5nIHRoZSBleHBlY3RlZCBsYXlvdXQgb2YgdGhlCisgICAgICAgKiBhcnJheS9tYXRyaXgvc3RydWN0dXJlIHdlJ3JlIHRyeWluZyB0byBmaWxsIGluLgorICAgICAgICovCisgICAgICBpbnQgbGFzdF9zd2l6ID0gLTE7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IDQ7IGorKykgeworCSBpbnQgc3dpeiA9IEdFVF9TV1ooc2xvdHNbaV0uc3dpenpsZSwgaik7CisJIGlmIChzd2l6ID09IGxhc3Rfc3dpeikKKwkgICAgYnJlYWs7CisJIGxhc3Rfc3dpeiA9IHN3aXo7CisKKyAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+cGFyYW1bdW5pZm9ybXMrK10gPQorICAgICAgICAgICAgJmZwLT5CYXNlLlBhcmFtZXRlcnMtPlBhcmFtZXRlclZhbHVlc1tpbmRleF1bc3dpel0uZjsKKyAgICAgIH0KKyAgIH0KK30KKworZnNfcmVnICoKK2ZzX3Zpc2l0b3I6OmVtaXRfZnJhZ2Nvb3JkX2ludGVycG9sYXRpb24oaXJfdmFyaWFibGUgKmlyKQoreworICAgZnNfcmVnICpyZWcgPSBuZXcodGhpcy0+bWVtX2N0eCkgZnNfcmVnKHRoaXMsIGlyLT50eXBlKTsKKyAgIGZzX3JlZyB3cG9zID0gKnJlZzsKKyAgIGJvb2wgZmxpcCA9ICFpci0+ZGF0YS5vcmlnaW5fdXBwZXJfbGVmdDsKKworICAgLyogZ2xfRnJhZ0Nvb3JkLnggKi8KKyAgIGlmIChpci0+ZGF0YS5waXhlbF9jZW50ZXJfaW50ZWdlcikgeworICAgICAgZW1pdChNT1Yod3BvcywgdGhpcy0+cGl4ZWxfeCkpOworICAgfSBlbHNlIHsKKyAgICAgIGVtaXQoQUREKHdwb3MsIHRoaXMtPnBpeGVsX3gsIGZzX3JlZygwLjVmKSkpOworICAgfQorICAgd3Bvcy5yZWdfb2Zmc2V0Kys7CisKKyAgIC8qIGdsX0ZyYWdDb29yZC55ICovCisgICBpZiAoIWZsaXAgJiYgaXItPmRhdGEucGl4ZWxfY2VudGVyX2ludGVnZXIpIHsKKyAgICAgIGVtaXQoTU9WKHdwb3MsIHRoaXMtPnBpeGVsX3kpKTsKKyAgIH0gZWxzZSB7CisgICAgICBmc19yZWcgcGl4ZWxfeSA9IHRoaXMtPnBpeGVsX3k7CisgICAgICBmbG9hdCBvZmZzZXQgPSAoaXItPmRhdGEucGl4ZWxfY2VudGVyX2ludGVnZXIgPyAwLjAgOiAwLjUpOworCisgICAgICBpZiAoZmxpcCkgeworCSBwaXhlbF95Lm5lZ2F0ZSA9IHRydWU7CisJIG9mZnNldCArPSBjLT5rZXkuZHJhd2FibGVfaGVpZ2h0IC0gMS4wOworICAgICAgfQorCisgICAgICBlbWl0KEFERCh3cG9zLCBwaXhlbF95LCBmc19yZWcob2Zmc2V0KSkpOworICAgfQorICAgd3Bvcy5yZWdfb2Zmc2V0Kys7CisKKyAgIC8qIGdsX0ZyYWdDb29yZC56ICovCisgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgZW1pdChNT1Yod3BvcywgZnNfcmVnKGJyd192ZWM4X2dyZihjLT5zb3VyY2VfZGVwdGhfcmVnLCAwKSkpKTsKKyAgIH0gZWxzZSB7CisgICAgICBlbWl0KEZTX09QQ09ERV9MSU5URVJQLCB3cG9zLAorICAgICAgICAgICB0aGlzLT5kZWx0YV94W0JSV19XTV9QRVJTUEVDVElWRV9QSVhFTF9CQVJZQ0VOVFJJQ10sCisgICAgICAgICAgIHRoaXMtPmRlbHRhX3lbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXSwKKyAgICAgICAgICAgaW50ZXJwX3JlZyhWQVJZSU5HX1NMT1RfUE9TLCAyKSk7CisgICB9CisgICB3cG9zLnJlZ19vZmZzZXQrKzsKKworICAgLyogZ2xfRnJhZ0Nvb3JkLnc6IEFscmVhZHkgc2V0IHVwIGluIGVtaXRfaW50ZXJwb2xhdGlvbiAqLworICAgZW1pdChCUldfT1BDT0RFX01PViwgd3BvcywgdGhpcy0+d3Bvc193KTsKKworICAgcmV0dXJuIHJlZzsKK30KKworZnNfaW5zdCAqCitmc192aXNpdG9yOjplbWl0X2xpbnRlcnAoY29uc3QgZnNfcmVnICZhdHRyLCBjb25zdCBmc19yZWcgJmludGVycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnbHNsX2ludGVycF9xdWFsaWZpZXIgaW50ZXJwb2xhdGlvbl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2VudHJvaWQsIGJvb2wgaXNfc2FtcGxlKQoreworICAgYnJ3X3dtX2JhcnljZW50cmljX2ludGVycF9tb2RlIGJhcnljb29yZF9tb2RlOworICAgaWYgKGJydy0+Z2VuID49IDYpIHsKKyAgICAgIGlmIChpc19jZW50cm9pZCkgeworICAgICAgICAgaWYgKGludGVycG9sYXRpb25fbW9kZSA9PSBJTlRFUlBfUVVBTElGSUVSX1NNT09USCkKKyAgICAgICAgICAgIGJhcnljb29yZF9tb2RlID0gQlJXX1dNX1BFUlNQRUNUSVZFX0NFTlRST0lEX0JBUllDRU5UUklDOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFyeWNvb3JkX21vZGUgPSBCUldfV01fTk9OUEVSU1BFQ1RJVkVfQ0VOVFJPSURfQkFSWUNFTlRSSUM7CisgICAgICB9IGVsc2UgaWYgKGlzX3NhbXBsZSkgeworICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uX21vZGUgPT0gSU5URVJQX1FVQUxJRklFUl9TTU9PVEgpCisgICAgICAgICAgICBiYXJ5Y29vcmRfbW9kZSA9IEJSV19XTV9QRVJTUEVDVElWRV9TQU1QTEVfQkFSWUNFTlRSSUM7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBiYXJ5Y29vcmRfbW9kZSA9IEJSV19XTV9OT05QRVJTUEVDVElWRV9TQU1QTEVfQkFSWUNFTlRSSUM7CisgICAgICB9IGVsc2UgeworICAgICAgICAgaWYgKGludGVycG9sYXRpb25fbW9kZSA9PSBJTlRFUlBfUVVBTElGSUVSX1NNT09USCkKKyAgICAgICAgICAgIGJhcnljb29yZF9tb2RlID0gQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFyeWNvb3JkX21vZGUgPSBCUldfV01fTk9OUEVSU1BFQ1RJVkVfUElYRUxfQkFSWUNFTlRSSUM7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgLyogT24gSXJvbmxha2UgYW5kIGJlbG93LCB0aGVyZSBpcyBvbmx5IG9uZSBpbnRlcnBvbGF0aW9uIG1vZGUuCisgICAgICAgKiBDZW50cm9pZCBpbnRlcnBvbGF0aW9uIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyBvbiB0aGlzIGhhcmR3YXJlIC0tCisgICAgICAgKiB0aGVyZSBpcyBubyBtdWx0aXNhbXBsaW5nLgorICAgICAgICovCisgICAgICBiYXJ5Y29vcmRfbW9kZSA9IEJSV19XTV9QRVJTUEVDVElWRV9QSVhFTF9CQVJZQ0VOVFJJQzsKKyAgIH0KKyAgIHJldHVybiBlbWl0KEZTX09QQ09ERV9MSU5URVJQLCBhdHRyLAorICAgICAgICAgICAgICAgdGhpcy0+ZGVsdGFfeFtiYXJ5Y29vcmRfbW9kZV0sCisgICAgICAgICAgICAgICB0aGlzLT5kZWx0YV95W2Jhcnljb29yZF9tb2RlXSwgaW50ZXJwKTsKK30KKworZnNfcmVnICoKK2ZzX3Zpc2l0b3I6OmVtaXRfZ2VuZXJhbF9pbnRlcnBvbGF0aW9uKGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIGZzX3JlZyAqcmVnID0gbmV3KHRoaXMtPm1lbV9jdHgpIGZzX3JlZyh0aGlzLCBpci0+dHlwZSk7CisgICByZWctPnR5cGUgPSBicndfdHlwZV9mb3JfYmFzZV90eXBlKGlyLT50eXBlLT5nZXRfc2NhbGFyX3R5cGUoKSk7CisgICBmc19yZWcgYXR0ciA9ICpyZWc7CisKKyAgIHVuc2lnbmVkIGludCBhcnJheV9lbGVtZW50czsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZTsKKworICAgaWYgKGlyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICBhcnJheV9lbGVtZW50cyA9IGlyLT50eXBlLT5sZW5ndGg7CisgICAgICBpZiAoYXJyYXlfZWxlbWVudHMgPT0gMCkgeworCSBmYWlsKCJkZXJlZmVyZW5jZWQgYXJyYXkgJyVzJyBoYXMgbGVuZ3RoIDBcbiIsIGlyLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBpci0+dHlwZS0+ZmllbGRzLmFycmF5OworICAgfSBlbHNlIHsKKyAgICAgIGFycmF5X2VsZW1lbnRzID0gMTsKKyAgICAgIHR5cGUgPSBpci0+dHlwZTsKKyAgIH0KKworICAgZ2xzbF9pbnRlcnBfcXVhbGlmaWVyIGludGVycG9sYXRpb25fbW9kZSA9CisgICAgICBpci0+ZGV0ZXJtaW5lX2ludGVycG9sYXRpb25fbW9kZShjLT5rZXkuZmxhdF9zaGFkZSk7CisKKyAgIGludCBsb2NhdGlvbiA9IGlyLT5kYXRhLmxvY2F0aW9uOworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBhcnJheV9lbGVtZW50czsgaSsrKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IHR5cGUtPm1hdHJpeF9jb2x1bW5zOyBqKyspIHsKKwkgaWYgKGMtPnByb2dfZGF0YS51cmJfc2V0dXBbbG9jYXRpb25dID09IC0xKSB7CisJICAgIC8qIElmIHRoZXJlJ3Mgbm8gaW5jb21pbmcgc2V0dXAgZGF0YSBmb3IgdGhpcyBzbG90LCBkb24ndAorCSAgICAgKiBlbWl0IGludGVycG9sYXRpb24gZm9yIGl0LgorCSAgICAgKi8KKwkgICAgYXR0ci5yZWdfb2Zmc2V0ICs9IHR5cGUtPnZlY3Rvcl9lbGVtZW50czsKKwkgICAgbG9jYXRpb24rKzsKKwkgICAgY29udGludWU7CisJIH0KKworCSBpZiAoaW50ZXJwb2xhdGlvbl9tb2RlID09IElOVEVSUF9RVUFMSUZJRVJfRkxBVCkgeworCSAgICAvKiBDb25zdGFudCBpbnRlcnBvbGF0aW9uIChmbGF0IHNoYWRpbmcpIGNhc2UuIFRoZSBTRiBoYXMKKwkgICAgICogaGFuZGVkIHVzIGRlZmluZWQgdmFsdWVzIGluIG9ubHkgdGhlIGNvbnN0YW50IG9mZnNldAorCSAgICAgKiBmaWVsZCBvZiB0aGUgc2V0dXAgcmVnLgorCSAgICAgKi8KKwkgICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCB0eXBlLT52ZWN0b3JfZWxlbWVudHM7IGsrKykgeworCSAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbnRlcnAgPSBpbnRlcnBfcmVnKGxvY2F0aW9uLCBrKTsKKwkgICAgICAgaW50ZXJwID0gc3Vib2Zmc2V0KGludGVycCwgMyk7CisgICAgICAgICAgICAgICBpbnRlcnAudHlwZSA9IHJlZy0+dHlwZTsKKwkgICAgICAgZW1pdChGU19PUENPREVfQ0lOVEVSUCwgYXR0ciwgZnNfcmVnKGludGVycCkpOworCSAgICAgICBhdHRyLnJlZ19vZmZzZXQrKzsKKwkgICAgfQorCSB9IGVsc2UgeworCSAgICAvKiBTbW9vdGgvbm9wZXJzcGVjdGl2ZSBpbnRlcnBvbGF0aW9uIGNhc2UuICovCisJICAgIGZvciAodW5zaWduZWQgaW50IGsgPSAwOyBrIDwgdHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBrKyspIHsKKyAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGludGVycCA9IGludGVycF9yZWcobG9jYXRpb24sIGspOworICAgICAgICAgICAgICAgZW1pdF9saW50ZXJwKGF0dHIsIGZzX3JlZyhpbnRlcnApLCBpbnRlcnBvbGF0aW9uX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXItPmRhdGEuY2VudHJvaWQgJiYgIWMtPmtleS5wZXJzYW1wbGVfc2hhZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+ZGF0YS5zYW1wbGUgfHwgYy0+a2V5LnBlcnNhbXBsZV9zaGFkaW5nKTsKKyAgICAgICAgICAgICAgIGlmIChicnctPm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgJiYgaXItPmRhdGEuY2VudHJvaWQpIHsKKyAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcGl4ZWwvc2FtcGxlIG1hc2sgaW50byBmMCBzbyB0aGF0IHdlIGtub3cKKyAgICAgICAgICAgICAgICAgICAqIHdoaWNoIHBpeGVscyBhcmUgbGl0LiAgVGhlbiwgZm9yIGVhY2ggY2hhbm5lbCB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgKiB1bmxpdCwgcmVwbGFjZSB0aGUgY2VudHJvaWQgZGF0YSB3aXRoIG5vbi1jZW50cm9pZAorICAgICAgICAgICAgICAgICAgICogZGF0YS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgZW1pdChGU19PUENPREVfTU9WX0RJU1BBVENIX1RPX0ZMQUdTKTsKKyAgICAgICAgICAgICAgICAgIGZzX2luc3QgKmluc3QgPSBlbWl0X2xpbnRlcnAoYXR0ciwgZnNfcmVnKGludGVycCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb25fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgIGluc3QtPnByZWRpY2F0ZSA9IEJSV19QUkVESUNBVEVfTk9STUFMOworICAgICAgICAgICAgICAgICAgaW5zdC0+cHJlZGljYXRlX2ludmVyc2UgPSB0cnVlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKGJydy0+Z2VuIDwgNiAmJiBpbnRlcnBvbGF0aW9uX21vZGUgPT0gSU5URVJQX1FVQUxJRklFUl9TTU9PVEgpIHsKKyAgICAgICAgICAgICAgICAgIGVtaXQoQlJXX09QQ09ERV9NVUwsIGF0dHIsIGF0dHIsIHRoaXMtPnBpeGVsX3cpOworICAgICAgICAgICAgICAgfQorCSAgICAgICBhdHRyLnJlZ19vZmZzZXQrKzsKKwkgICAgfQorCisJIH0KKwkgbG9jYXRpb24rKzsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHJlZzsKK30KKworZnNfcmVnICoKK2ZzX3Zpc2l0b3I6OmVtaXRfZnJvbnRmYWNpbmdfaW50ZXJwb2xhdGlvbihpcl92YXJpYWJsZSAqaXIpCit7CisgICBmc19yZWcgKnJlZyA9IG5ldyh0aGlzLT5tZW1fY3R4KSBmc19yZWcodGhpcywgaXItPnR5cGUpOworCisgICAvKiBUaGUgZnJvbnRmYWNpbmcgY29tZXMgaW4gYXMgYSBiaXQgaW4gdGhlIHRocmVhZCBwYXlsb2FkLiAqLworICAgaWYgKGJydy0+Z2VuID49IDYpIHsKKyAgICAgIGVtaXQoQlJXX09QQ09ERV9BU1IsICpyZWcsCisJICAgZnNfcmVnKHJldHlwZShicndfdmVjMV9ncmYoMCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX0QpKSwKKwkgICBmc19yZWcoMTUpKTsKKyAgICAgIGVtaXQoQlJXX09QQ09ERV9OT1QsICpyZWcsICpyZWcpOworICAgICAgZW1pdChCUldfT1BDT0RFX0FORCwgKnJlZywgKnJlZywgZnNfcmVnKDEpKTsKKyAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3QgYnJ3X3JlZyByMV82dWQgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKDEsIDYpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAvKiBiaXQgMzEgaXMgInByaW1pdGl2ZSBpcyBiYWNrIGZhY2UiLCBzbyBjaGVja2luZyA8ICgxIDw8IDMxKSBnaXZlcworICAgICAgICogdXMgZnJvbnQgZmFjZQorICAgICAgICovCisgICAgICBlbWl0KENNUCgqcmVnLCBmc19yZWcocjFfNnVkKSwgZnNfcmVnKDF1IDw8IDMxKSwgQlJXX0NPTkRJVElPTkFMX0wpKTsKKyAgICAgIGVtaXQoQlJXX09QQ09ERV9BTkQsICpyZWcsICpyZWcsIGZzX3JlZygxdSkpOworICAgfQorCisgICByZXR1cm4gcmVnOworfQorCit2b2lkCitmc192aXNpdG9yOjpjb21wdXRlX3NhbXBsZV9wb3NpdGlvbihmc19yZWcgZHN0LCBmc19yZWcgaW50X3NhbXBsZV9wb3MpCit7CisgICBhc3NlcnQoZHN0LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRik7CisKKyAgIGlmIChjLT5rZXkuY29tcHV0ZV9wb3Nfb2Zmc2V0KSB7CisgICAgICAvKiBDb252ZXJ0IGludF9zYW1wbGVfcG9zIHRvIGZsb2F0aW5nIHBvaW50ICovCisgICAgICBlbWl0KE1PVihkc3QsIGludF9zYW1wbGVfcG9zKSk7CisgICAgICAvKiBTY2FsZSB0byB0aGUgcmFuZ2UgWzAsIDFdICovCisgICAgICBlbWl0KE1VTChkc3QsIGRzdCwgZnNfcmVnKDEgLyAxNi4wZikpKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogRnJvbSBBUkJfc2FtcGxlX3NoYWRpbmcgc3BlY2lmaWNhdGlvbjoKKyAgICAgICAqICJXaGVuIHJlbmRlcmluZyB0byBhIG5vbi1tdWx0aXNhbXBsZSBidWZmZXIsIG9yIGlmIG11bHRpc2FtcGxlCisgICAgICAgKiAgcmFzdGVyaXphdGlvbiBpcyBkaXNhYmxlZCwgZ2xfU2FtcGxlUG9zaXRpb24gd2lsbCBhbHdheXMgYmUKKyAgICAgICAqICAoMC41LCAwLjUpLgorICAgICAgICovCisgICAgICBlbWl0KE1PVihkc3QsIGZzX3JlZygwLjVmKSkpOworICAgfQorfQorCitmc19yZWcgKgorZnNfdmlzaXRvcjo6ZW1pdF9zYW1wbGVwb3Nfc2V0dXAoaXJfdmFyaWFibGUgKmlyKQoreworICAgYXNzZXJ0KGJydy0+Z2VuID49IDYpOworICAgYXNzZXJ0KGlyLT50eXBlID09IGdsc2xfdHlwZTo6dmVjMl90eXBlKTsKKworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gImNvbXB1dGUgc2FtcGxlIHBvc2l0aW9uIjsKKyAgIGZzX3JlZyAqcmVnID0gbmV3KHRoaXMtPm1lbV9jdHgpIGZzX3JlZyh0aGlzLCBpci0+dHlwZSk7CisgICBmc19yZWcgcG9zID0gKnJlZzsKKyAgIGZzX3JlZyBpbnRfc2FtcGxlX3ggPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjppbnRfdHlwZSk7CisgICBmc19yZWcgaW50X3NhbXBsZV95ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6aW50X3R5cGUpOworCisgICAvKiBXTSB3aWxsIGJlIHJ1biBpbiBNU0RJU1BNT0RFX1BFUlNBTVBMRS4gU28sIG9ubHkgb25lIG9mIFNJTUQ4IG9yIFNJTUQxNgorICAgICogbW9kZSB3aWxsIGJlIGVuYWJsZWQuCisgICAgKgorICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSAzNDQ6CisgICAgKiBSMzEuMTowICAgICAgICAgUG9zaXRpb24gT2Zmc2V0IFgvWSBmb3IgU2xvdFszOjBdCisgICAgKiBSMzEuMzoyICAgICAgICAgUG9zaXRpb24gT2Zmc2V0IFgvWSBmb3IgU2xvdFs3OjRdCisgICAgKiAuLi4uLgorICAgICoKKyAgICAqIFRoZSBYLCBZIHNhbXBsZSBwb3NpdGlvbnMgY29tZSBpbiBhcyBieXRlcyBpbiAgdGhyZWFkIHBheWxvYWQuIFNvLCByZWFkCisgICAgKiB0aGUgcG9zaXRpb25zIHVzaW5nIHZzdHJpZGU9MTYsIHdpZHRoPTgsIGhzdHJpZGU9Mi4KKyAgICAqLworICAgc3RydWN0IGJyd19yZWcgc2FtcGxlX3Bvc19yZWcgPQorICAgICAgc3RyaWRlKHJldHlwZShicndfdmVjMV9ncmYoYy0+c2FtcGxlX3Bvc19yZWcsIDApLAorICAgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9CKSwgMTYsIDgsIDIpOworCisgICBmc19pbnN0ICppbnN0ID0gZW1pdChNT1YoaW50X3NhbXBsZV94LCBmc19yZWcoc2FtcGxlX3Bvc19yZWcpKSk7CisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpIHsKKyAgICAgIGluc3QtPmZvcmNlX3VuY29tcHJlc3NlZCA9IHRydWU7CisgICAgICBpbnN0ID0gZW1pdChNT1YoaGFsZihpbnRfc2FtcGxlX3gsIDEpLAorICAgICAgICAgICAgICAgICAgICAgIGZzX3JlZyhzdWJvZmZzZXQoc2FtcGxlX3Bvc19yZWcsIDE2KSkpKTsKKyAgICAgIGluc3QtPmZvcmNlX3NlY2hhbGYgPSB0cnVlOworICAgfQorICAgLyogQ29tcHV0ZSBnbF9TYW1wbGVQb3NpdGlvbi54ICovCisgICBjb21wdXRlX3NhbXBsZV9wb3NpdGlvbihwb3MsIGludF9zYW1wbGVfeCk7CisgICBwb3MucmVnX29mZnNldCsrOworICAgaW5zdCA9IGVtaXQoTU9WKGludF9zYW1wbGVfeSwgZnNfcmVnKHN1Ym9mZnNldChzYW1wbGVfcG9zX3JlZywgMSkpKSk7CisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpIHsKKyAgICAgIGluc3QtPmZvcmNlX3VuY29tcHJlc3NlZCA9IHRydWU7CisgICAgICBpbnN0ID0gZW1pdChNT1YoaGFsZihpbnRfc2FtcGxlX3ksIDEpLAorICAgICAgICAgICAgICAgICAgICAgIGZzX3JlZyhzdWJvZmZzZXQoc2FtcGxlX3Bvc19yZWcsIDE3KSkpKTsKKyAgICAgIGluc3QtPmZvcmNlX3NlY2hhbGYgPSB0cnVlOworICAgfQorICAgLyogQ29tcHV0ZSBnbF9TYW1wbGVQb3NpdGlvbi55ICovCisgICBjb21wdXRlX3NhbXBsZV9wb3NpdGlvbihwb3MsIGludF9zYW1wbGVfeSk7CisgICByZXR1cm4gcmVnOworfQorCitmc19yZWcgKgorZnNfdmlzaXRvcjo6ZW1pdF9zYW1wbGVpZF9zZXR1cChpcl92YXJpYWJsZSAqaXIpCit7CisgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNik7CisKKyAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9ICJjb21wdXRlIHNhbXBsZSBpZCI7CisgICBmc19yZWcgKnJlZyA9IG5ldyh0aGlzLT5tZW1fY3R4KSBmc19yZWcodGhpcywgaXItPnR5cGUpOworCisgICBpZiAoYy0+a2V5LmNvbXB1dGVfc2FtcGxlX2lkKSB7CisgICAgICBmc19yZWcgdDEgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjppbnRfdHlwZSk7CisgICAgICBmc19yZWcgdDIgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjppbnRfdHlwZSk7CisgICAgICB0Mi50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVVc7CisKKyAgICAgIC8qIFRoZSBQUyB3aWxsIGJlIHJ1biBpbiBNU0RJU1BNT0RFX1BFUlNBTVBMRS4gRm9yIGV4YW1wbGUgd2l0aAorICAgICAgICogOHggbXVsdGlzYW1wbGluZywgc3Vic3BhbiAwIHdpbGwgcmVwcmVzZW50IHNhbXBsZSBOICh3aGVyZSBOCisgICAgICAgKiBpcyAwLCAyLCA0IG9yIDYpLCBzdWJzcGFuIDEgd2lsbCByZXByZXNlbnQgc2FtcGxlIDEsIDMsIDUgb3IKKyAgICAgICAqIDcuIFdlIGNhbiBmaW5kIHRoZSB2YWx1ZSBvZiBOIGJ5IGxvb2tpbmcgYXQgUjAuMCBiaXRzIDc6NgorICAgICAgICogKCJTdGFydGluZyBTYW1wbGUgUGFpciBJbmRleCAoU1NQSSkiKSBhbmQgbXVsdGlwbHlpbmcgYnkgdHdvCisgICAgICAgKiAoc2luY2Ugc2FtcGxlcyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiBwYWlycykuIFRoYXQgaXMsIHdlCisgICAgICAgKiBjb21wdXRlIDIqKChSMC4wICYgMHhjMCkgPj4gNikgPT0gKFIwLjAgJiAweGMwKSA+PiA1LiBUaGVuCisgICAgICAgKiB3ZSBuZWVkIHRvIGFkZCBOIHRvIHRoZSBzZXF1ZW5jZSAoMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSkgaW4KKyAgICAgICAqIGNhc2Ugb2YgU0lNRDggYW5kIHNlcXVlbmNlICgwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLAorICAgICAgICogMiwgMywgMywgMywgMykgaW4gY2FzZSBvZiBTSU1EMTYuIFdlIGNvbXB1dGUgdGhpcyBzZXF1ZW5jZSBieQorICAgICAgICogcG9wdWxhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB3aXRoIHRoZSBzZXF1ZW5jZSAoMCwgMSwgMiwgMyksCisgICAgICAgKiBhbmQgdGhlbiByZWFkaW5nIGZyb20gaXQgdXNpbmcgdnN0cmlkZT0xLCB3aWR0aD00LCBoc3RyaWRlPTAuCisgICAgICAgKiBUaGVzZSBjb21wdXRhdGlvbnMgaG9sZCBnb29kIGZvciA0eCBtdWx0aXNhbXBsaW5nIGFzIHdlbGwuCisgICAgICAgKgorICAgICAgICogRm9yIDJ4IE1TQUEgYW5kIFNJTUQxNiwgd2Ugd2FudCB0byB1c2UgdGhlIHNlcXVlbmNlICgwLCAxLCAwLCAxKToKKyAgICAgICAqIHRoZSBmaXJzdCBmb3VyIHNsb3RzIGFyZSBzYW1wbGUgMCBvZiBzdWJzcGFuIDA7IHRoZSBuZXh0IGZvdXIKKyAgICAgICAqIGFyZSBzYW1wbGUgMSBvZiBzdWJzcGFuIDA7IHRoZSB0aGlyZCBncm91cCBpcyBzYW1wbGUgMCBvZgorICAgICAgICogc3Vic3BhbiAxLCBhbmQgZmluYWxseSBzYW1wbGUgMSBvZiBzdWJzcGFuIDEuCisgICAgICAgKi8KKyAgICAgIGZzX2luc3QgKmluc3Q7CisgICAgICBpbnN0ID0gZW1pdChCUldfT1BDT0RFX0FORCwgdDEsCisgICAgICAgICAgICAgICAgICBmc19yZWcocmV0eXBlKGJyd192ZWMxX2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKSwKKyAgICAgICAgICAgICAgICAgIGZzX3JlZygweGMwKSk7CisgICAgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgICAgIGluc3QgPSBlbWl0KEJSV19PUENPREVfU0hSLCB0MSwgdDEsIGZzX3JlZyg1KSk7CisgICAgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgICAgIC8qIFRoaXMgd29ya3MgZm9yIGJvdGggU0lNRDggYW5kIFNJTUQxNiAqLworICAgICAgaW5zdCA9IGVtaXQoTU9WKHQyLCBicndfaW1tX3YoYy0+a2V5LnBlcnNhbXBsZV8yeCA/IDB4MTAxMCA6IDB4MzIxMCkpKTsKKyAgICAgIGluc3QtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworICAgICAgLyogVGhpcyBzcGVjaWFsIGluc3RydWN0aW9uIHRha2VzIGNhcmUgb2Ygc2V0dGluZyB2c3RyaWRlPTEsCisgICAgICAgKiB3aWR0aD00LCBoc3RyaWRlPTAgb2YgdDIgZHVyaW5nIGFuIEFERCBpbnN0cnVjdGlvbi4KKyAgICAgICAqLworICAgICAgZW1pdChGU19PUENPREVfU0VUX1NBTVBMRV9JRCwgKnJlZywgdDEsIHQyKTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBBcyBwZXIgR0xfQVJCX3NhbXBsZV9zaGFkaW5nIHNwZWNpZmljYXRpb246CisgICAgICAgKiAiV2hlbiByZW5kZXJpbmcgdG8gYSBub24tbXVsdGlzYW1wbGUgYnVmZmVyLCBvciBpZiBtdWx0aXNhbXBsZQorICAgICAgICogIHJhc3Rlcml6YXRpb24gaXMgZGlzYWJsZWQsIGdsX1NhbXBsZUlEIHdpbGwgYWx3YXlzIGJlIHplcm8uIgorICAgICAgICovCisgICAgICBlbWl0KEJSV19PUENPREVfTU9WLCAqcmVnLCBmc19yZWcoMCkpOworICAgfQorCisgICByZXR1cm4gcmVnOworfQorCitmc19yZWcgKgorZnNfdmlzaXRvcjo6ZW1pdF9zYW1wbGVtYXNraW5fc2V0dXAoaXJfdmFyaWFibGUgKmlyKQoreworICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gImNvbXB1dGUgZ2xfU2FtcGxlTWFza0luIjsKKyAgIGZzX3JlZyAqcmVnID0gbmV3KHRoaXMtPm1lbV9jdHgpIGZzX3JlZyh0aGlzLCBpci0+dHlwZSk7CisgICBlbWl0KE1PVigqcmVnLCBmc19yZWcocmV0eXBlKGJyd192ZWM4X2dyZihjLT5zYW1wbGVfbWFza19yZWcsIDApLCBCUldfUkVHSVNURVJfVFlQRV9EKSkpKTsKKyAgIHJldHVybiByZWc7Cit9CisKK2ZzX3JlZworZnNfdmlzaXRvcjo6Zml4X21hdGhfb3BlcmFuZChmc19yZWcgc3JjKQoreworICAgLyogQ2FuJ3QgZG8gaHN0cmlkZSA9PSAwIGFyZ3Mgb24gZ2VuNiBtYXRoLCBzbyBleHBhbmQgaXQgb3V0LiBXZQorICAgICogbWlnaHQgYmUgYWJsZSB0byBkbyBiZXR0ZXIgYnkgZG9pbmcgZXhlY3NpemUgPSAxIG1hdGggYW5kIHRoZW4KKyAgICAqIGV4cGFuZGluZyB0aGF0IHJlc3VsdCBvdXQsIGJ1dCB3ZSB3b3VsZCBuZWVkIHRvIGJlIGNhcmVmdWwgd2l0aAorICAgICogbWFza2luZy4KKyAgICAqCisgICAgKiBUaGUgaGFyZHdhcmUgaWdub3JlcyBzb3VyY2UgbW9kaWZpZXJzIChuZWdhdGUgYW5kIGFicykgb24gbWF0aAorICAgICogaW5zdHJ1Y3Rpb25zLCBzbyB3ZSBhbHNvIG1vdmUgdG8gYSB0ZW1wIHRvIHNldCB0aG9zZSB1cC4KKyAgICAqLworICAgaWYgKGJydy0+Z2VuID09IDYgJiYgc3JjLmZpbGUgIT0gVU5JRk9STSAmJiBzcmMuZmlsZSAhPSBJTU0gJiYKKyAgICAgICAhc3JjLmFicyAmJiAhc3JjLm5lZ2F0ZSkKKyAgICAgIHJldHVybiBzcmM7CisKKyAgIC8qIEdlbjcgcmVsYXhlcyBtb3N0IG9mIHRoZSBhYm92ZSByZXN0cmljdGlvbnMsIGJ1dCBzdGlsbCBjYW4ndCB1c2UgSU1NCisgICAgKiBvcGVyYW5kcyB0byBtYXRoCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA+PSA3ICYmIHNyYy5maWxlICE9IElNTSkKKyAgICAgIHJldHVybiBzcmM7CisKKyAgIGZzX3JlZyBleHBhbmRlZCA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworICAgZXhwYW5kZWQudHlwZSA9IHNyYy50eXBlOworICAgZW1pdChCUldfT1BDT0RFX01PViwgZXhwYW5kZWQsIHNyYyk7CisgICByZXR1cm4gZXhwYW5kZWQ7Cit9CisKK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6ZW1pdF9tYXRoKGVudW0gb3Bjb2RlIG9wY29kZSwgZnNfcmVnIGRzdCwgZnNfcmVnIHNyYykKK3sKKyAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICBjYXNlIFNIQURFUl9PUENPREVfUkNQOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1JTUToKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TUVJUOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0VYUDI6CisgICBjYXNlIFNIQURFUl9PUENPREVfTE9HMjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TSU46CisgICBjYXNlIFNIQURFUl9PUENPREVfQ09TOgorICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IGJhZCBtYXRoIG9wY29kZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIC8qIENhbid0IGRvIGhzdHJpZGUgPT0gMCBhcmdzIHRvIGdlbjYgbWF0aCwgc28gZXhwYW5kIGl0IG91dC4gIFdlCisgICAgKiBtaWdodCBiZSBhYmxlIHRvIGRvIGJldHRlciBieSBkb2luZyBleGVjc2l6ZSA9IDEgbWF0aCBhbmQgdGhlbgorICAgICogZXhwYW5kaW5nIHRoYXQgcmVzdWx0IG91dCwgYnV0IHdlIHdvdWxkIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoCisgICAgKiBtYXNraW5nLgorICAgICoKKyAgICAqIEdlbiA2IGhhcmR3YXJlIGlnbm9yZXMgc291cmNlIG1vZGlmaWVycyAobmVnYXRlIGFuZCBhYnMpIG9uIG1hdGgKKyAgICAqIGluc3RydWN0aW9ucywgc28gd2UgYWxzbyBtb3ZlIHRvIGEgdGVtcCB0byBzZXQgdGhvc2UgdXAuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA9PSA2IHx8IGJydy0+Z2VuID09IDcpCisgICAgICBzcmMgPSBmaXhfbWF0aF9vcGVyYW5kKHNyYyk7CisKKyAgIGZzX2luc3QgKmluc3QgPSBlbWl0KG9wY29kZSwgZHN0LCBzcmMpOworCisgICBpZiAoYnJ3LT5nZW4gPCA2KSB7CisgICAgICBpbnN0LT5iYXNlX21yZiA9IDI7CisgICAgICBpbnN0LT5tbGVuID0gZGlzcGF0Y2hfd2lkdGggLyA4OworICAgfQorCisgICByZXR1cm4gaW5zdDsKK30KKworZnNfaW5zdCAqCitmc192aXNpdG9yOjplbWl0X21hdGgoZW51bSBvcGNvZGUgb3Bjb2RlLCBmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpCit7CisgICBpbnQgYmFzZV9tcmYgPSAyOworICAgZnNfaW5zdCAqaW5zdDsKKworICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1JFTUFJTkRFUjoKKyAgICAgIGlmIChicnctPmdlbiA+PSA3KQorCSBubzE2KCJTSU1EMTYgSU5URElWIHVuc3VwcG9ydGVkXG4iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1BPVzoKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiB1bnN1cHBvcnRlZCBiaW5hcnkgbWF0aCBvcGNvZGUuIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKGJydy0+Z2VuID49IDgpIHsKKyAgICAgIGluc3QgPSBlbWl0KG9wY29kZSwgZHN0LCBzcmMwLCBzcmMxKTsKKyAgIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgc3JjMCA9IGZpeF9tYXRoX29wZXJhbmQoc3JjMCk7CisgICAgICBzcmMxID0gZml4X21hdGhfb3BlcmFuZChzcmMxKTsKKworICAgICAgaW5zdCA9IGVtaXQob3Bjb2RlLCBkc3QsIHNyYzAsIHNyYzEpOworICAgfSBlbHNlIHsKKyAgICAgIC8qIEZyb20gdGhlIElyb25sYWtlIFBSTSwgVm9sdW1lIDQsIFBhcnQgMSwgU2VjdGlvbiA2LjEuMTMKKyAgICAgICAqICJNZXNzYWdlIFBheWxvYWQiOgorICAgICAgICoKKyAgICAgICAqICJPcGVyYW5kMFs3XS4gIEZvciB0aGUgSU5UIERJViBmdW5jdGlvbnMsIHRoaXMgb3BlcmFuZCBpcyB0aGUKKyAgICAgICAqICBkZW5vbWluYXRvci4iCisgICAgICAgKiAgLi4uCisgICAgICAgKiAiT3BlcmFuZDFbN10uICBGb3IgdGhlIElOVCBESVYgZnVuY3Rpb25zLCB0aGlzIG9wZXJhbmQgaXMgdGhlCisgICAgICAgKiAgbnVtZXJhdG9yLiIKKyAgICAgICAqLworICAgICAgYm9vbCBpc19pbnRfZGl2ID0gb3Bjb2RlICE9IFNIQURFUl9PUENPREVfUE9XOworICAgICAgZnNfcmVnICZvcDAgPSBpc19pbnRfZGl2ID8gc3JjMSA6IHNyYzA7CisgICAgICBmc19yZWcgJm9wMSA9IGlzX2ludF9kaXYgPyBzcmMwIDogc3JjMTsKKworICAgICAgZW1pdChCUldfT1BDT0RFX01PViwgZnNfcmVnKE1SRiwgYmFzZV9tcmYgKyAxLCBvcDEudHlwZSksIG9wMSk7CisgICAgICBpbnN0ID0gZW1pdChvcGNvZGUsIGRzdCwgb3AwLCByZWdfbnVsbF9mKTsKKworICAgICAgaW5zdC0+YmFzZV9tcmYgPSBiYXNlX21yZjsKKyAgICAgIGluc3QtPm1sZW4gPSAyICogZGlzcGF0Y2hfd2lkdGggLyA4OworICAgfQorICAgcmV0dXJuIGluc3Q7Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmFzc2lnbl9jdXJiX3NldHVwKCkKK3sKKyAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSA4KSB7CisgICAgICBjLT5wcm9nX2RhdGEuZmlyc3RfY3VyYmVfZ3JmID0gYy0+bnJfcGF5bG9hZF9yZWdzOworICAgfSBlbHNlIHsKKyAgICAgIGMtPnByb2dfZGF0YS5maXJzdF9jdXJiZV9ncmZfMTYgPSBjLT5ucl9wYXlsb2FkX3JlZ3M7CisgICB9CisKKyAgIGMtPnByb2dfZGF0YS5jdXJiX3JlYWRfbGVuZ3RoID0gQUxJR04oc3RhZ2VfcHJvZ19kYXRhLT5ucl9wYXJhbXMsIDgpIC8gODsKKworICAgLyogTWFwIHRoZSBvZmZzZXRzIGluIHRoZSBVTklGT1JNIGZpbGUgdG8gZml4ZWQgSFcgcmVncy4gKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gVU5JRk9STSkgeworICAgICAgICAgICAgaW50IHVuaWZvcm1fbnIgPSBpbnN0LT5zcmNbaV0ucmVnICsgaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQ7CisgICAgICAgICAgICBpbnQgY29uc3RhbnRfbnI7CisgICAgICAgICAgICBpZiAodW5pZm9ybV9uciA+PSAwICYmIHVuaWZvcm1fbnIgPCAoaW50KSB1bmlmb3JtcykgeworICAgICAgICAgICAgICAgY29uc3RhbnRfbnIgPSBwdXNoX2NvbnN0YW50X2xvY1t1bmlmb3JtX25yXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAvKiBTZWN0aW9uIDUuMTEgb2YgdGhlIE9wZW5HTCA0LjEgc3BlYyBzYXlzOgorICAgICAgICAgICAgICAgICogIk91dC1vZi1ib3VuZHMgcmVhZHMgcmV0dXJuIHVuZGVmaW5lZCB2YWx1ZXMsIHdoaWNoIGluY2x1ZGUKKyAgICAgICAgICAgICAgICAqICB2YWx1ZXMgZnJvbSBvdGhlciB2YXJpYWJsZXMgb2YgdGhlIGFjdGl2ZSBwcm9ncmFtIG9yIHplcm8uIgorICAgICAgICAgICAgICAgICogSnVzdCByZXR1cm4gdGhlIGZpcnN0IHB1c2ggY29uc3RhbnQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGNvbnN0YW50X25yID0gMDsKKyAgICAgICAgICAgIH0KKworCSAgICBzdHJ1Y3QgYnJ3X3JlZyBicndfcmVnID0gYnJ3X3ZlYzFfZ3JmKGMtPm5yX3BheWxvYWRfcmVncyArCisJCQkJCQkgIGNvbnN0YW50X25yIC8gOCwKKwkJCQkJCSAgY29uc3RhbnRfbnIgJSA4KTsKKworCSAgICBpbnN0LT5zcmNbaV0uZmlsZSA9IEhXX1JFRzsKKwkgICAgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZyA9IGJ5dGVfb2Zmc2V0KAorICAgICAgICAgICAgICAgcmV0eXBlKGJyd19yZWcsIGluc3QtPnNyY1tpXS50eXBlKSwKKyAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5zdWJyZWdfb2Zmc2V0KTsKKwkgfQorICAgICAgfQorICAgfQorfQorCit2b2lkCitmc192aXNpdG9yOjpjYWxjdWxhdGVfdXJiX3NldHVwKCkKK3sKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgVkFSWUlOR19TTE9UX01BWDsgaSsrKSB7CisgICAgICBjLT5wcm9nX2RhdGEudXJiX3NldHVwW2ldID0gLTE7CisgICB9CisKKyAgIGludCB1cmJfbmV4dCA9IDA7CisgICAvKiBGaWd1cmUgb3V0IHdoZXJlIGVhY2ggb2YgdGhlIGluY29taW5nIHNldHVwIGF0dHJpYnV0ZXMgbGFuZHMuICovCisgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgaWYgKF9tZXNhX2JpdGNvdW50XzY0KGZwLT5CYXNlLklucHV0c1JlYWQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19GU19WQVJZSU5HX0lOUFVUX01BU0spIDw9IDE2KSB7CisgICAgICAgICAvKiBUaGUgU0YvU0JFIHBpcGVsaW5lIHN0YWdlIGNhbiBkbyBhcmJpdHJhcnkgcmVhcnJhbmdlbWVudCBvZiB0aGUKKyAgICAgICAgICAqIGZpcnN0IDE2IHZhcnlpbmcgaW5wdXRzLCBzbyB3ZSBjYW4gcHV0IHRoZW0gd2hlcmV2ZXIgd2Ugd2FudC4KKyAgICAgICAgICAqIEp1c3QgcHV0IHRoZW0gaW4gb3JkZXIuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IChhKSBpbnB1dHMgbm90IHVzZWQgYnkgdGhlCisgICAgICAgICAgKiBmcmFnbWVudCBzaGFkZXIgd29uJ3QgdGFrZSB1cCB2YWx1YWJsZSByZWdpc3RlciBzcGFjZSwgYW5kIChiKSB3ZQorICAgICAgICAgICogd29uJ3QgaGF2ZSB0byByZWNvbXBpbGUgdGhlIGZyYWdtZW50IHNoYWRlciBpZiBpdCBnZXRzIHBhaXJlZCB3aXRoCisgICAgICAgICAgKiBhIGRpZmZlcmVudCB2ZXJ0ZXggKG9yIGdlb21ldHJ5KSBzaGFkZXIuCisgICAgICAgICAgKi8KKyAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgVkFSWUlOR19TTE9UX01BWDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnAtPkJhc2UuSW5wdXRzUmVhZCAmIEJSV19GU19WQVJZSU5HX0lOUFVUX01BU0sgJgorICAgICAgICAgICAgICAgIEJJVEZJRUxENjRfQklUKGkpKSB7CisgICAgICAgICAgICAgICBjLT5wcm9nX2RhdGEudXJiX3NldHVwW2ldID0gdXJiX25leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAvKiBXZSBoYXZlIGVub3VnaCBpbnB1dCB2YXJ5aW5ncyB0aGF0IHRoZSBTRi9TQkUgcGlwZWxpbmUgc3RhZ2UgY2FuJ3QKKyAgICAgICAgICAqIGFyYml0cmFyaWx5IHJlYXJyYW5nZSB0aGVtIHRvIHN1aXQgb3VyIHdoaW07IHdlIGhhdmUgdG8gcHV0IHRoZW0KKyAgICAgICAgICAqIGluIGFuIG9yZGVyIHRoYXQgbWF0Y2hlcyB0aGUgb3V0cHV0IG9mIHRoZSBwcmV2aW91cyBwaXBlbGluZSBzdGFnZQorICAgICAgICAgICogKGdlb21ldHJ5IG9yIHZlcnRleCBzaGFkZXIpLgorICAgICAgICAgICovCisgICAgICAgICBzdHJ1Y3QgYnJ3X3Z1ZV9tYXAgcHJldl9zdGFnZV92dWVfbWFwOworICAgICAgICAgYnJ3X2NvbXB1dGVfdnVlX21hcChicncsICZwcmV2X3N0YWdlX3Z1ZV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmtleS5pbnB1dF9zbG90c192YWxpZCk7CisgICAgICAgICBpbnQgZmlyc3Rfc2xvdCA9IDIgKiBCUldfU0ZfVVJCX0VOVFJZX1JFQURfT0ZGU0VUOworICAgICAgICAgYXNzZXJ0KHByZXZfc3RhZ2VfdnVlX21hcC5udW1fc2xvdHMgPD0gZmlyc3Rfc2xvdCArIDMyKTsKKyAgICAgICAgIGZvciAoaW50IHNsb3QgPSBmaXJzdF9zbG90OyBzbG90IDwgcHJldl9zdGFnZV92dWVfbWFwLm51bV9zbG90czsKKyAgICAgICAgICAgICAgc2xvdCsrKSB7CisgICAgICAgICAgICBpbnQgdmFyeWluZyA9IHByZXZfc3RhZ2VfdnVlX21hcC5zbG90X3RvX3Zhcnlpbmdbc2xvdF07CisgICAgICAgICAgICAvKiBOb3RlIHRoYXQgdmFyeWluZyA9PSBCUldfVkFSWUlOR19TTE9UX0NPVU5UIHdoZW4gYSBzbG90IGlzCisgICAgICAgICAgICAgKiB1bnVzZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh2YXJ5aW5nICE9IEJSV19WQVJZSU5HX1NMT1RfQ09VTlQgJiYKKyAgICAgICAgICAgICAgICAoZnAtPkJhc2UuSW5wdXRzUmVhZCAmIEJSV19GU19WQVJZSU5HX0lOUFVUX01BU0sgJgorICAgICAgICAgICAgICAgICBCSVRGSUVMRDY0X0JJVCh2YXJ5aW5nKSkpIHsKKyAgICAgICAgICAgICAgIGMtPnByb2dfZGF0YS51cmJfc2V0dXBbdmFyeWluZ10gPSBzbG90IC0gZmlyc3Rfc2xvdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIHVyYl9uZXh0ID0gcHJldl9zdGFnZV92dWVfbWFwLm51bV9zbG90cyAtIGZpcnN0X3Nsb3Q7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgLyogRklOSVNITUU6IFRoZSBzZiBkb2Vzbid0IG1hcCBWUy0+RlMgaW5wdXRzIGZvciB1cyB2ZXJ5IHdlbGwuICovCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IFZBUllJTkdfU0xPVF9NQVg7IGkrKykgeworICAgICAgICAgLyogUG9pbnQgc2l6ZSBpcyBwYWNrZWQgaW50byB0aGUgaGVhZGVyLCBub3QgYXMgYSBnZW5lcmFsIGF0dHJpYnV0ZSAqLworICAgICAgICAgaWYgKGkgPT0gVkFSWUlOR19TTE9UX1BTSVopCisgICAgICAgICAgICBjb250aW51ZTsKKworCSBpZiAoYy0+a2V5LmlucHV0X3Nsb3RzX3ZhbGlkICYgQklURklFTEQ2NF9CSVQoaSkpIHsKKwkJLyogVGhlIGJhY2sgY29sb3Igc2xvdCBpcyBza2lwcGVkIHdoZW4gdGhlIGZyb250IGNvbG9yIGlzCisJCSAqIGFsc28gd3JpdHRlbiB0by4gIEluIGFkZGl0aW9uLCBzb21lIHNsb3RzIGNhbiBiZQorCQkgKiB3cml0dGVuIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIGFuZCBub3QgcmVhZCBpbiB0aGUKKwkJICogZnJhZ21lbnQgc2hhZGVyLiAgU28gdGhlIHJlZ2lzdGVyIG51bWJlciBtdXN0IGFsd2F5cyBiZQorCQkgKiBpbmNyZW1lbnRlZCwgbWFwcGVkIG9yIG5vdC4KKwkJICovCisJCWlmIChfbWVzYV92YXJ5aW5nX3Nsb3RfaW5fZnMoKGdsX3Zhcnlpbmdfc2xvdCkgaSkpCisJCSAgIGMtPnByb2dfZGF0YS51cmJfc2V0dXBbaV0gPSB1cmJfbmV4dDsKKwkJCXVyYl9uZXh0Kys7CisJIH0KKwkgIH0KKworICAgICAgLyoKKyAgICAgICAqIEl0J3MgYSBGUyBvbmx5IGF0dHJpYnV0ZSwgYW5kIHdlIGRpZCBpbnRlcnBvbGF0aW9uIGZvciB0aGlzIGF0dHJpYnV0ZQorICAgICAgICogaW4gU0YgdGhyZWFkLiBTbywgY291bnQgaXQgaGVyZSwgdG9vLgorICAgICAgICoKKyAgICAgICAqIFNlZSBjb21waWxlX3NmX3Byb2coKSBmb3IgbW9yZSBpbmZvLgorICAgICAgICovCisgICAgICBpZiAoZnAtPkJhc2UuSW5wdXRzUmVhZCAmIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9QTlRDKSkKKyAgICAgICAgIGMtPnByb2dfZGF0YS51cmJfc2V0dXBbVkFSWUlOR19TTE9UX1BOVENdID0gdXJiX25leHQrKzsKKyAgIH0KKworICAgYy0+cHJvZ19kYXRhLm51bV92YXJ5aW5nX2lucHV0cyA9IHVyYl9uZXh0OworfQorCit2b2lkCitmc192aXNpdG9yOjphc3NpZ25fdXJiX3NldHVwKCkKK3sKKyAgIGludCB1cmJfc3RhcnQgPSBjLT5ucl9wYXlsb2FkX3JlZ3MgKyBjLT5wcm9nX2RhdGEuY3VyYl9yZWFkX2xlbmd0aDsKKworICAgLyogT2Zmc2V0IGFsbCB0aGUgdXJiX3NldHVwW10gaW5kZXggYnkgdGhlIGFjdHVhbCBwb3NpdGlvbiBvZiB0aGUKKyAgICAqIHNldHVwIHJlZ3MsIG5vdyB0aGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY29uc3RhbnRzIGhhcyBiZWVuIGNob3Nlbi4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKW5vZGU7CisKKyAgICAgIGlmIChpbnN0LT5vcGNvZGUgPT0gRlNfT1BDT0RFX0xJTlRFUlApIHsKKwkgYXNzZXJ0KGluc3QtPnNyY1syXS5maWxlID09IEhXX1JFRyk7CisJIGluc3QtPnNyY1syXS5maXhlZF9od19yZWcubnIgKz0gdXJiX3N0YXJ0OworICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+b3Bjb2RlID09IEZTX09QQ09ERV9DSU5URVJQKSB7CisJIGFzc2VydChpbnN0LT5zcmNbMF0uZmlsZSA9PSBIV19SRUcpOworCSBpbnN0LT5zcmNbMF0uZml4ZWRfaHdfcmVnLm5yICs9IHVyYl9zdGFydDsKKyAgICAgIH0KKyAgIH0KKworICAgLyogRWFjaCBhdHRyaWJ1dGUgaXMgNCBzZXR1cCBjaGFubmVscywgZWFjaCBvZiB3aGljaCBpcyBoYWxmIGEgcmVnLiAqLworICAgdGhpcy0+Zmlyc3Rfbm9uX3BheWxvYWRfZ3JmID0KKyAgICAgIHVyYl9zdGFydCArIGMtPnByb2dfZGF0YS5udW1fdmFyeWluZ19pbnB1dHMgKiAyOworfQorCisvKioKKyAqIFNwbGl0IGxhcmdlIHZpcnR1YWwgR1JGcyBpbnRvIHNlcGFyYXRlIGNvbXBvbmVudHMgaWYgd2UgY2FuLgorICoKKyAqIFRoaXMgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgd2l0aCB3aGF0IGJyd19mc192ZWN0b3Jfc3BsaXR0aW5nIGRvZXMsCisgKiBidXQgdGhhdCdzIHJlYWxseSBjb25zZXJ2YXRpdmUgYmVjYXVzZSBpdCdzIGFmcmFpZCBvZiBkb2luZworICogc3BsaXR0aW5nIHRoYXQgZG9lc24ndCByZXN1bHQgaW4gcmVhbCBwcm9ncmVzcyBhZnRlciB0aGUgcmVzdCBvZgorICogdGhlIG9wdGltaXphdGlvbiBwaGFzZXMsIHdoaWNoIHdvdWxkIGNhdXNlIGluZmluaXRlIGxvb3BpbmcgaW4KKyAqIG9wdGltaXphdGlvbi4gIFdlIGNhbiBkbyBpdCBvbmNlIGhlcmUsIHNhZmVseS4gIFRoaXMgYWxzbyBoYXMgdGhlCisgKiBvcHBvcnR1bml0eSB0byBzcGxpdCBpbnRlcnBvbGF0ZWQgdmFsdWVzLCBvciBtYXliZSBldmVuIHVuaWZvcm1zLAorICogd2hpY2ggd2UgZG9uJ3QgaGF2ZSBhdCB0aGUgSVIgbGV2ZWwuCisgKgorICogV2Ugd2FudCB0byBzcGxpdCwgYmVjYXVzZSB2aXJ0dWFsIEdSRnMgYXJlIHdoYXQgd2UgcmVnaXN0ZXIKKyAqIGFsbG9jYXRlIGFuZCBzcGlsbCAoZHVlIHRvIGNvbnRpZ3VvdXNuZXNzIHJlcXVpcmVtZW50cyBmb3Igc29tZQorICogaW5zdHJ1Y3Rpb25zKSwgYW5kIHRoZXkncmUgd2hhdCB3ZSBuYXR1cmFsbHkgZ2VuZXJhdGUgaW4gdGhlCisgKiBjb2RlZ2VuIHByb2Nlc3MsIGJ1dCBtb3N0IHZpcnR1YWwgR1JGcyBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJlCisgKiBjb250aWd1b3VzIHNldHMgb2YgR1JGcy4gIElmIHdlIHNwbGl0LCB3ZSdsbCBlbmQgdXAgd2l0aCByZWR1Y2VkCisgKiBsaXZlIGludGVydmFscyBhbmQgYmV0dGVyIGRlYWQgY29kZSBlbGltaW5hdGlvbiBhbmQgY29hbGVzY2luZy4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6c3BsaXRfdmlydHVhbF9ncmZzKCkKK3sKKyAgIGludCBudW1fdmFycyA9IHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50OworICAgYm9vbCBzcGxpdF9ncmZbbnVtX3ZhcnNdOworICAgaW50IG5ld192aXJ0dWFsX2dyZltudW1fdmFyc107CisKKyAgIC8qIFRyeSB0byBzcGxpdCBhbnl0aGluZyA+IDAgc2l6ZWQuICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV92YXJzOyBpKyspIHsKKyAgICAgIGlmICh0aGlzLT52aXJ0dWFsX2dyZl9zaXplc1tpXSAhPSAxKQorCSBzcGxpdF9ncmZbaV0gPSB0cnVlOworICAgICAgZWxzZQorCSBzcGxpdF9ncmZbaV0gPSBmYWxzZTsKKyAgIH0KKworICAgaWYgKGJydy0+aGFzX3BsbiAmJgorICAgICAgIHRoaXMtPmRlbHRhX3hbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXS5maWxlID09IEdSRikgeworICAgICAgLyogUExOIG9wY29kZXMgcmVseSBvbiB0aGUgZGVsdGFfeHkgYmVpbmcgY29udGlndW91cy4gIFdlIG9ubHkgaGF2ZSB0bworICAgICAgICogY2hlY2sgdGhpcyBmb3IgQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDLCBiZWNhdXNlIHByaW9yIHRvCisgICAgICAgKiBHZW42LCB0aGF0IHdhcyB0aGUgb25seSBzdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBtb2RlLCBhbmQgc2luY2UgR2VuNiwKKyAgICAgICAqIGRlbHRhX3ggYW5kIGRlbHRhX3kgYXJlIGluIGZpeGVkIGhhcmR3YXJlIHJlZ2lzdGVycy4KKyAgICAgICAqLworICAgICAgc3BsaXRfZ3JmW3RoaXMtPmRlbHRhX3hbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXS5yZWddID0KKyAgICAgICAgIGZhbHNlOworICAgfQorCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgLyogSWYgdGhlcmUncyBhIFNFTkQgbWVzc2FnZSB0aGF0IHJlcXVpcmVzIGNvbnRpZ3VvdXMgZGVzdGluYXRpb24KKyAgICAgICAqIHJlZ2lzdGVycywgbm8gc3BsaXR0aW5nIGlzIGFsbG93ZWQuCisgICAgICAgKi8KKyAgICAgIGlmIChpbnN0LT5yZWdzX3dyaXR0ZW4gPiAxKSB7CisJIHNwbGl0X2dyZltpbnN0LT5kc3QucmVnXSA9IGZhbHNlOworICAgICAgfQorCisgICAgICAvKiBJZiB3ZSdyZSBzZW5kaW5nIGZyb20gYSBHUkYsIGRvbid0IHNwbGl0IGl0LCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CisgICAgICAgKiB0aGUgc2VuZCBpcyByZWFkaW5nIHRoZSB3aG9sZSB0aGluZy4KKyAgICAgICAqLworICAgICAgaWYgKGluc3QtPmlzX3NlbmRfZnJvbV9ncmYoKSkgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgICAgICAgIHNwbGl0X2dyZltpbnN0LT5zcmNbaV0ucmVnXSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBBbGxvY2F0ZSBuZXcgc3BhY2UgZm9yIHNwbGl0IHJlZ3MuICBOb3RlIHRoYXQgdGhlIHZpcnR1YWwKKyAgICAqIG51bWJlcnMgd2lsbCBiZSBjb250aWd1b3VzLgorICAgICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV92YXJzOyBpKyspIHsKKyAgICAgIGlmIChzcGxpdF9ncmZbaV0pIHsKKwkgbmV3X3ZpcnR1YWxfZ3JmW2ldID0gdmlydHVhbF9ncmZfYWxsb2MoMSk7CisJIGZvciAoaW50IGogPSAyOyBqIDwgdGhpcy0+dmlydHVhbF9ncmZfc2l6ZXNbaV07IGorKykgeworCSAgICBpbnQgcmVnID0gdmlydHVhbF9ncmZfYWxsb2MoMSk7CisJICAgIGFzc2VydChyZWcgPT0gbmV3X3ZpcnR1YWxfZ3JmW2ldICsgaiAtIDEpOworCSAgICAodm9pZCkgcmVnOworCSB9CisJIHRoaXMtPnZpcnR1YWxfZ3JmX3NpemVzW2ldID0gMTsKKyAgICAgIH0KKyAgIH0KKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKW5vZGU7CisKKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYgJiYKKwkgIHNwbGl0X2dyZltpbnN0LT5kc3QucmVnXSAmJgorCSAgaW5zdC0+ZHN0LnJlZ19vZmZzZXQgIT0gMCkgeworCSBpbnN0LT5kc3QucmVnID0gKG5ld192aXJ0dWFsX2dyZltpbnN0LT5kc3QucmVnXSArCisJCQkgIGluc3QtPmRzdC5yZWdfb2Zmc2V0IC0gMSk7CisJIGluc3QtPmRzdC5yZWdfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYgJiYKKwkgICAgIHNwbGl0X2dyZltpbnN0LT5zcmNbaV0ucmVnXSAmJgorCSAgICAgaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQgIT0gMCkgeworCSAgICBpbnN0LT5zcmNbaV0ucmVnID0gKG5ld192aXJ0dWFsX2dyZltpbnN0LT5zcmNbaV0ucmVnXSArCisJCQkJaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQgLSAxKTsKKwkgICAgaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQgPSAwOworCSB9CisgICAgICB9CisgICB9CisgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7Cit9CisKKy8qKgorICogUmVtb3ZlIHVudXNlZCB2aXJ0dWFsIEdSRnMgYW5kIGNvbXBhY3QgdGhlIHZpcnR1YWxfZ3JmXyogYXJyYXlzLgorICoKKyAqIER1cmluZyBjb2RlIGdlbmVyYXRpb24sIHdlIGNyZWF0ZSB0b25zIG9mIHRlbXBvcmFyeSB2YXJpYWJsZXMsIG1hbnkgb2YKKyAqIHdoaWNoIGdldCBpbW1lZGlhdGVseSBraWxsZWQgYW5kIGFyZSBuZXZlciB1c2VkIGFnYWluLiAgWWV0LCBpbiBsYXRlcgorICogb3B0aW1pemF0aW9uIGFuZCBhbmFseXNpcyBwYXNzZXMsIHN1Y2ggYXMgY29tcHV0ZV9saXZlX2ludGVydmFscywgd2UgbmVlZAorICogdG8gbG9vcCBvdmVyIGFsbCB0aGUgdmlydHVhbCBHUkZzLiAgQ29tcGFjdGluZyB0aGVtIGNhbiBzYXZlIGEgbG90IG9mCisgKiBvdmVyaGVhZC4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6Y29tcGFjdF92aXJ0dWFsX2dyZnMoKQoreworICAgLyogTWFyayB3aGljaCB2aXJ0dWFsIEdSRnMgYXJlIHVzZWQsIGFuZCBjb3VudCBob3cgbWFueS4gKi8KKyAgIGludCByZW1hcF90YWJsZVt0aGlzLT52aXJ0dWFsX2dyZl9jb3VudF07CisgICBtZW1zZXQocmVtYXBfdGFibGUsIC0xLCBzaXplb2YocmVtYXBfdGFibGUpKTsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGNvbnN0IGZzX2luc3QgKmluc3QgPSAoY29uc3QgZnNfaW5zdCAqKSBub2RlOworCisgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKQorICAgICAgICAgcmVtYXBfdGFibGVbaW5zdC0+ZHN0LnJlZ10gPSAwOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlID09IEdSRikKKyAgICAgICAgICAgIHJlbWFwX3RhYmxlW2luc3QtPnNyY1tpXS5yZWddID0gMDsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSW4gYWRkaXRpb24gdG8gcmVnaXN0ZXJzIHVzZWQgaW4gaW5zdHJ1Y3Rpb25zLCBmc192aXNpdG9yIGtlZXBzCisgICAgKiBkaXJlY3QgcmVmZXJlbmNlcyB0byBjZXJ0YWluIHNwZWNpYWwgdmFsdWVzIHdoaWNoIG11c3QgYmUgcGF0Y2hlZDoKKyAgICAqLworICAgc3RydWN0IHsKKyAgICAgIGZzX3JlZyAqcmVnOworICAgICAgdW5zaWduZWQgY291bnQ7CisgICB9IHNwZWNpYWxbXSA9IHsKKyAgICAgIHsgJmZyYWdfZGVwdGgsIDEgfSwKKyAgICAgIHsgJnBpeGVsX3gsIDEgfSwKKyAgICAgIHsgJnBpeGVsX3ksIDEgfSwKKyAgICAgIHsgJnBpeGVsX3csIDEgfSwKKyAgICAgIHsgJndwb3NfdywgMSB9LAorICAgICAgeyAmZHVhbF9zcmNfb3V0cHV0LCAxIH0sCisgICAgICB7IG91dHB1dHMsIEFSUkFZX1NJWkUob3V0cHV0cykgfSwKKyAgICAgIHsgZGVsdGFfeCwgQVJSQVlfU0laRShkZWx0YV94KSB9LAorICAgICAgeyBkZWx0YV95LCBBUlJBWV9TSVpFKGRlbHRhX3kpIH0sCisgICAgICB7ICZzYW1wbGVfbWFzaywgMSB9LAorICAgICAgeyAmc2hhZGVyX3N0YXJ0X3RpbWUsIDEgfSwKKyAgIH07CisKKyAgIC8qIFRyZWF0IGFsbCBzcGVjaWFsIHZhbHVlcyBhcyB1c2VkLCB0byBiZSBjb25zZXJ2YXRpdmUgKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNwZWNpYWwpOyBpKyspIHsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBzcGVjaWFsW2ldLmNvdW50OyBqKyspIHsKKyAgICAgICAgIGlmIChzcGVjaWFsW2ldLnJlZ1tqXS5maWxlID09IEdSRikKKyAgICAgICAgICAgIHJlbWFwX3RhYmxlW3NwZWNpYWxbaV0ucmVnW2pdLnJlZ10gPSAwOworICAgICAgfQorICAgfQorCisgICAvKiBDb21wYWN0IHRoZSBHUkYgYXJyYXlzLiAqLworICAgaW50IG5ld19pbmRleCA9IDA7CisgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50OyBpKyspIHsKKyAgICAgIGlmIChyZW1hcF90YWJsZVtpXSAhPSAtMSkgeworICAgICAgICAgcmVtYXBfdGFibGVbaV0gPSBuZXdfaW5kZXg7CisgICAgICAgICB2aXJ0dWFsX2dyZl9zaXplc1tuZXdfaW5kZXhdID0gdmlydHVhbF9ncmZfc2l6ZXNbaV07CisgICAgICAgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisgICAgICAgICArK25ld19pbmRleDsKKyAgICAgIH0KKyAgIH0KKworICAgdGhpcy0+dmlydHVhbF9ncmZfY291bnQgPSBuZXdfaW5kZXg7CisKKyAgIC8qIFBhdGNoIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHVzZSB0aGUgbmV3bHkgcmVudW1iZXJlZCByZWdpc3RlcnMgKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKikgbm9kZTsKKworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikKKyAgICAgICAgIGluc3QtPmRzdC5yZWcgPSByZW1hcF90YWJsZVtpbnN0LT5kc3QucmVnXTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpCisgICAgICAgICAgICBpbnN0LT5zcmNbaV0ucmVnID0gcmVtYXBfdGFibGVbaW5zdC0+c3JjW2ldLnJlZ107CisgICAgICB9CisgICB9CisKKyAgIC8qIFBhdGNoIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBzcGVjaWFsIHZhbHVlcyAqLworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3BlY2lhbCk7IGkrKykgeworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHNwZWNpYWxbaV0uY291bnQ7IGorKykgeworICAgICAgICAgZnNfcmVnICpyZWcgPSAmc3BlY2lhbFtpXS5yZWdbal07CisgICAgICAgICBpZiAocmVnLT5maWxlID09IEdSRiAmJiByZW1hcF90YWJsZVtyZWctPnJlZ10gIT0gLTEpCisgICAgICAgICAgICByZWctPnJlZyA9IHJlbWFwX3RhYmxlW3JlZy0+cmVnXTsKKyAgICAgIH0KKyAgIH0KK30KKworLyoKKyAqIEltcGxlbWVudHMgYXJyYXkgYWNjZXNzIG9mIHVuaWZvcm1zIGJ5IGluc2VydGluZyBhCisgKiBQVUxMX0NPTlNUQU5UX0xPQUQgaW5zdHJ1Y3Rpb24uCisgKgorICogVW5saWtlIHRlbXBvcmFyeSBHUkYgYXJyYXkgYWNjZXNzICh3aGVyZSB3ZSBkb24ndCBzdXBwb3J0IGl0IGR1ZSB0bworICogdGhlIGRpZmZpY3VsdHkgb2YgZG9pbmcgcmVsYXRpdmUgYWRkcmVzc2luZyBvbiBpbnN0cnVjdGlvbgorICogZGVzdGluYXRpb25zKSwgd2UgY291bGQgcG90ZW50aWFsbHkgZG8gYXJyYXkgYWNjZXNzIG9mIHVuaWZvcm1zCisgKiB0aGF0IHdlcmUgbG9hZGVkIGluIEdSRiBzcGFjZSBhcyBwdXNoIGNvbnN0YW50cy4gIEluIHJlYWwtd29ybGQKKyAqIHVzYWdlIHdlJ3ZlIHNlZW4sIHRob3VnaCwgdGhlIGFycmF5cyBiZWluZyB1c2VkIGFyZSBhbHdheXMgbGFyZ2VyCisgKiB0aGFuIHdlIGNvdWxkIGxvYWQgYXMgcHVzaCBjb25zdGFudHMsIHNvIGp1c3QgYWx3YXlzIG1vdmUgYWxsCisgKiB1bmlmb3JtIGFycmF5IGFjY2VzcyBvdXQgdG8gYSBwdWxsIGNvbnN0YW50IGJ1ZmZlci4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6bW92ZV91bmlmb3JtX2FycmF5X2FjY2Vzc190b19wdWxsX2NvbnN0YW50cygpCit7CisgICBpZiAoZGlzcGF0Y2hfd2lkdGggIT0gOCkKKyAgICAgIHJldHVybjsKKworICAgcHVsbF9jb25zdGFudF9sb2MgPSByYWxsb2NfYXJyYXkobWVtX2N0eCwgaW50LCB1bmlmb3Jtcyk7CisKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdW5pZm9ybXM7IGkrKykgeworICAgICAgcHVsbF9jb25zdGFudF9sb2NbaV0gPSAtMTsKKyAgIH0KKworICAgLyogV2FsayB0aHJvdWdoIGFuZCBmaW5kIGFycmF5IGFjY2VzcyBvZiB1bmlmb3Jtcy4gIFB1dCBhIGNvcHkgb2YgdGhhdAorICAgICogdW5pZm9ybSBpbiB0aGUgcHVsbCBjb25zdGFudCBidWZmZXIuCisgICAgKgorICAgICogTm90ZSB0aGF0IHdlIGRvbid0IG1vdmUgY29uc3RhbnQtaW5kZXhlZCBhY2Nlc3NlcyB0byBhcnJheXMuICBObworICAgICogdGVzdGluZyBoYXMgYmVlbiBkb25lIG9mIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb2YgdGhpcyBjaG9pY2UuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKW5vZGU7CisKKyAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IFVOSUZPUk0gfHwgIWluc3QtPnNyY1tpXS5yZWxhZGRyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGludCB1bmlmb3JtID0gaW5zdC0+c3JjW2ldLnJlZzsKKworICAgICAgICAgLyogSWYgdGhpcyBhcnJheSBpc24ndCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHB1bGwgY29uc3RhbnQgYnVmZmVyLAorICAgICAgICAgICogYWRkIGl0LgorICAgICAgICAgICovCisgICAgICAgICBpZiAocHVsbF9jb25zdGFudF9sb2NbdW5pZm9ybV0gPT0gLTEpIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICoqdmFsdWVzID0gJnN0YWdlX3Byb2dfZGF0YS0+cGFyYW1bdW5pZm9ybV07CisKKyAgICAgICAgICAgIGFzc2VydChwYXJhbV9zaXplW3VuaWZvcm1dKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbV9zaXplW3VuaWZvcm1dOyBqKyspIHsKKyAgICAgICAgICAgICAgIHB1bGxfY29uc3RhbnRfbG9jW3VuaWZvcm0gKyBqXSA9IHN0YWdlX3Byb2dfZGF0YS0+bnJfcHVsbF9wYXJhbXM7CisKKyAgICAgICAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+cHVsbF9wYXJhbVtzdGFnZV9wcm9nX2RhdGEtPm5yX3B1bGxfcGFyYW1zKytdID0KKyAgICAgICAgICAgICAgICAgIHZhbHVlc1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworLyoqCisgKiBBc3NpZ24gVU5JRk9STSBmaWxlIHJlZ2lzdGVycyB0byBlaXRoZXIgcHVzaCBjb25zdGFudHMgb3IgcHVsbCBjb25zdGFudHMuCisgKgorICogV2UgYWxsb3cgYSBmcmFnbWVudCBzaGFkZXIgdG8gaGF2ZSBtb3JlIHRoYW4gdGhlIHNwZWNpZmllZCBtaW5pbXVtCisgKiBtYXhpbXVtIG51bWJlciBvZiBmcmFnbWVudCBzaGFkZXIgdW5pZm9ybSBjb21wb25lbnRzICg2NCkuICBJZgorICogdGhlcmUgYXJlIHRvbyBtYW55IG9mIHRoZXNlLCB0aGV5J2QgZmlsbCB1cCBhbGwgb2YgcmVnaXN0ZXIgc3BhY2UuCisgKiBTbywgdGhpcyB3aWxsIHB1c2ggc29tZSBvZiB0aGVtIG91dCB0byB0aGUgcHVsbCBjb25zdGFudCBidWZmZXIgYW5kCisgKiB1cGRhdGUgdGhlIHByb2dyYW0gdG8gbG9hZCB0aGVtLgorICovCit2b2lkCitmc192aXNpdG9yOjphc3NpZ25fY29uc3RhbnRfbG9jYXRpb25zKCkKK3sKKyAgIC8qIE9ubHkgdGhlIGZpcnN0IGNvbXBpbGUgKFNJTUQ4IG1vZGUpIGdldHMgdG8gZGVjaWRlIG9uIGxvY2F0aW9ucy4gKi8KKyAgIGlmIChkaXNwYXRjaF93aWR0aCAhPSA4KQorICAgICAgcmV0dXJuOworCisgICAvKiBGaW5kIHdoaWNoIFVOSUZPUk0gcmVnaXN0ZXJzIGFyZSBzdGlsbCBpbiB1c2UuICovCisgICBib29sIGlzX2xpdmVbdW5pZm9ybXNdOworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB1bmlmb3JtczsgaSsrKSB7CisgICAgICBpc19saXZlW2ldID0gZmFsc2U7CisgICB9CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKikgbm9kZTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSAhPSBVTklGT1JNKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGludCBjb25zdGFudF9uciA9IGluc3QtPnNyY1tpXS5yZWcgKyBpbnN0LT5zcmNbaV0ucmVnX29mZnNldDsKKyAgICAgICAgIGlmIChjb25zdGFudF9uciA+PSAwICYmIGNvbnN0YW50X25yIDwgKGludCkgdW5pZm9ybXMpCisgICAgICAgICAgICBpc19saXZlW2NvbnN0YW50X25yXSA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIC8qIE9ubHkgYWxsb3cgMTYgcmVnaXN0ZXJzICgxMjggdW5pZm9ybSBjb21wb25lbnRzKSBhcyBwdXNoIGNvbnN0YW50cy4KKyAgICAqCisgICAgKiBKdXN0IGRlbW90ZSB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgV2UgY291bGQgcHJvYmFibHkgZG8gYmV0dGVyCisgICAgKiBoZXJlLCBkZW1vdGluZyB0aGluZ3MgdGhhdCBhcmUgcmFyZWx5IHVzZWQgaW4gdGhlIHByb2dyYW0gZmlyc3QuCisgICAgKi8KKyAgIC8vIEx1bmFyRyA6IFRPRE8gLSB0dXJuaW5nIG9mZiBwdXNoIGNvbnN0YW50cyBmb3IgYnJpbmcgdXAKKyAgIHVuc2lnbmVkIGludCBtYXhfcHVzaF9jb21wb25lbnRzID0gMDsvLzE2ICogODsKKyAgIHVuc2lnbmVkIGludCBudW1fcHVzaF9jb25zdGFudHMgPSAwOworCisgICBwdXNoX2NvbnN0YW50X2xvYyA9IHJhbGxvY19hcnJheShtZW1fY3R4LCBpbnQsIHVuaWZvcm1zKTsKKworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB1bmlmb3JtczsgaSsrKSB7CisgICAgICBpZiAoIWlzX2xpdmVbaV0gfHwgcHVsbF9jb25zdGFudF9sb2NbaV0gIT0gLTEpIHsKKyAgICAgICAgIC8qIFRoaXMgVU5JRk9STSByZWdpc3RlciBpcyBlaXRoZXIgZGVhZCwgb3IgaGFzIGFscmVhZHkgYmVlbiBkZW1vdGVkCisgICAgICAgICAgKiB0byBhIHB1bGwgY29uc3QuICBNYXJrIGl0IGFzIG5vIGxvbmdlciBsaXZpbmcgaW4gdGhlIHBhcmFtW10gYXJyYXkuCisgICAgICAgICAgKi8KKyAgICAgICAgIHB1c2hfY29uc3RhbnRfbG9jW2ldID0gLTE7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKG51bV9wdXNoX2NvbnN0YW50cyA8IG1heF9wdXNoX2NvbXBvbmVudHMpIHsKKyAgICAgICAgIC8qIFJldGFpbiBhcyBhIHB1c2ggY29uc3RhbnQuICBSZWNvcmQgdGhlIGxvY2F0aW9uIGluIHRoZSBwYXJhbXNbXQorICAgICAgICAgICogYXJyYXkuCisgICAgICAgICAgKi8KKyAgICAgICAgIHB1c2hfY29uc3RhbnRfbG9jW2ldID0gbnVtX3B1c2hfY29uc3RhbnRzKys7CisgICAgICB9IGVsc2UgeworICAgICAgICAgLyogRGVtb3RlIHRvIGEgcHVsbCBjb25zdGFudC4gKi8KKyAgICAgICAgIHB1c2hfY29uc3RhbnRfbG9jW2ldID0gLTE7CisKKyAgICAgICAgIGludCBwdWxsX2luZGV4ID0gc3RhZ2VfcHJvZ19kYXRhLT5ucl9wdWxsX3BhcmFtcysrOworICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5wdWxsX3BhcmFtW3B1bGxfaW5kZXhdID0gc3RhZ2VfcHJvZ19kYXRhLT5wYXJhbVtpXTsKKyAgICAgICAgIHB1bGxfY29uc3RhbnRfbG9jW2ldID0gcHVsbF9pbmRleDsKKyAgICAgIH0KKyAgIH0KKworICAgc3RhZ2VfcHJvZ19kYXRhLT5ucl9wYXJhbXMgPSBudW1fcHVzaF9jb25zdGFudHM7CisKKyAgIC8qIFVwIHVudGlsIG5vdywgdGhlIHBhcmFtW10gYXJyYXkgaGFzIGJlZW4gaW5kZXhlZCBieSByZWcgKyByZWdfb2Zmc2V0CisgICAgKiBvZiBVTklGT1JNIHJlZ2lzdGVycy4gIENvbmRlbnNlIGl0IHRvIG9ubHkgY29udGFpbiB0aGUgdW5pZm9ybXMgd2UKKyAgICAqIGNob3NlIHRvIHVwbG9hZCBhcyBwdXNoIGNvbnN0YW50cy4KKyAgICAqLworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB1bmlmb3JtczsgaSsrKSB7CisgICAgICBpbnQgcmVtYXBwZWQgPSBwdXNoX2NvbnN0YW50X2xvY1tpXTsKKworICAgICAgaWYgKHJlbWFwcGVkID09IC0xKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGFzc2VydChyZW1hcHBlZCA8PSAoaW50KWkpOworICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5wYXJhbVtyZW1hcHBlZF0gPSBzdGFnZV9wcm9nX2RhdGEtPnBhcmFtW2ldOworICAgfQorfQorCisvKioKKyAqIFJlcGxhY2UgVU5JRk9STSByZWdpc3RlciBmaWxlIGFjY2VzcyB3aXRoIGVpdGhlciBVTklGT1JNX1BVTExfQ09OU1RBTlRfTE9BRAorICogb3IgVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQUQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGxvYWQgdmFsdWVzIGludG8gVkdSRnMuCisgKi8KK3ZvaWQKK2ZzX3Zpc2l0b3I6OmRlbW90ZV9wdWxsX2NvbnN0YW50cygpCit7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IFVOSUZPUk0pCisJICAgIGNvbnRpbnVlOworCisgICAgICAgICBpbnQgcHVsbF9pbmRleCA9IHB1bGxfY29uc3RhbnRfbG9jW2luc3QtPnNyY1tpXS5yZWcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5zcmNbaV0ucmVnX29mZnNldF07CisgICAgICAgICBpZiAocHVsbF9pbmRleCA9PSAtMSkKKwkgICAgY29udGludWU7CisKKyAgICAgICAgIC8qIFNldCB1cCB0aGUgYW5ub3RhdGlvbiB0cmFja2luZyBmb3IgbmV3IGdlbmVyYXRlZCBpbnN0cnVjdGlvbnMuICovCisgICAgICAgICBiYXNlX2lyID0gaW5zdC0+aXI7CisgICAgICAgICBjdXJyZW50X2Fubm90YXRpb24gPSBpbnN0LT5hbm5vdGF0aW9uOworCisgICAgICAgICBmc19yZWcgc3VyZl9pbmRleChzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUucHVsbF9jb25zdGFudHNfc3RhcnQpOworICAgICAgICAgZnNfcmVnIGRzdCA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworCisgICAgICAgICAvKiBHZW5lcmF0ZSBhIHB1bGwgbG9hZCBpbnRvIGRzdC4gKi8KKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0ucmVsYWRkcikgeworICAgICAgICAgICAgZXhlY19saXN0IGxpc3QgPSBWQVJZSU5HX1BVTExfQ09OU1RBTlRfTE9BRChkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnN0LT5zcmNbaV0ucmVsYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVsbF9pbmRleCk7CisgICAgICAgICAgICBpbnN0LT5pbnNlcnRfYmVmb3JlKCZsaXN0KTsKKyAgICAgICAgICAgIGluc3QtPnNyY1tpXS5yZWxhZGRyID0gTlVMTDsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmc19yZWcgb2Zmc2V0ID0gZnNfcmVnKCh1bnNpZ25lZCkocHVsbF9pbmRleCAqIDQpICYgfjE1KTsKKyAgICAgICAgICAgIGZzX2luc3QgKnB1bGwgPQorICAgICAgICAgICAgICAgbmV3KG1lbV9jdHgpIGZzX2luc3QoRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzdXJmX2luZGV4LCBvZmZzZXQpOworICAgICAgICAgICAgaW5zdC0+aW5zZXJ0X2JlZm9yZShwdWxsKTsKKyAgICAgICAgICAgIGluc3QtPnNyY1tpXS5zZXRfc21lYXIocHVsbF9pbmRleCAmIDMpOworICAgICAgICAgfQorCisgICAgICAgICAvKiBSZXdyaXRlIHRoZSBpbnN0cnVjdGlvbiB0byB1c2UgdGhlIHRlbXBvcmFyeSBWR1JGLiAqLworICAgICAgICAgaW5zdC0+c3JjW2ldLmZpbGUgPSBHUkY7CisgICAgICAgICBpbnN0LT5zcmNbaV0ucmVnID0gZHN0LnJlZzsKKyAgICAgICAgIGluc3QtPnNyY1tpXS5yZWdfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgIH0KKyAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKK30KKworYm9vbAorZnNfdmlzaXRvcjo6b3B0X2FsZ2VicmFpYygpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworCisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgICAgY2FzZSBCUldfT1BDT0RFX01VTDoKKwkgaWYgKGluc3QtPnNyY1sxXS5maWxlICE9IElNTSkKKwkgICAgY29udGludWU7CisKKwkgLyogYSAqIDEuMCA9IGEgKi8KKwkgaWYgKGluc3QtPnNyY1sxXS5pc19vbmUoKSkgeworCSAgICBpbnN0LT5vcGNvZGUgPSBCUldfT1BDT0RFX01PVjsKKwkgICAgaW5zdC0+c3JjWzFdID0gcmVnX3VuZGVmOworCSAgICBwcm9ncmVzcyA9IHRydWU7CisJICAgIGJyZWFrOworCSB9CisKKyAgICAgICAgIC8qIGEgKiAwLjAgPSAwLjAgKi8KKyAgICAgICAgIGlmIChpbnN0LT5zcmNbMV0uaXNfemVybygpKSB7CisgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPSBCUldfT1BDT0RFX01PVjsKKyAgICAgICAgICAgIGluc3QtPnNyY1swXSA9IGluc3QtPnNyY1sxXTsKKyAgICAgICAgICAgIGluc3QtPnNyY1sxXSA9IHJlZ191bmRlZjsKKyAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0FERDoKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbMV0uZmlsZSAhPSBJTU0pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgLyogYSArIDAuMCA9IGEgKi8KKyAgICAgICAgIGlmIChpbnN0LT5zcmNbMV0uaXNfemVybygpKSB7CisgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPSBCUldfT1BDT0RFX01PVjsKKyAgICAgICAgICAgIGluc3QtPnNyY1sxXSA9IHJlZ191bmRlZjsKKyAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfT1I6CisgICAgICAgICBpZiAoaW5zdC0+c3JjWzBdLmVxdWFscyhpbnN0LT5zcmNbMV0pKSB7CisgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPSBCUldfT1BDT0RFX01PVjsKKyAgICAgICAgICAgIGluc3QtPnNyY1sxXSA9IHJlZ191bmRlZjsKKyAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfTFJQOgorICAgICAgICAgaWYgKGluc3QtPnNyY1sxXS5lcXVhbHMoaW5zdC0+c3JjWzJdKSkgeworICAgICAgICAgICAgaW5zdC0+b3Bjb2RlID0gQlJXX09QQ09ERV9NT1Y7CisgICAgICAgICAgICBpbnN0LT5zcmNbMF0gPSBpbnN0LT5zcmNbMV07CisgICAgICAgICAgICBpbnN0LT5zcmNbMV0gPSByZWdfdW5kZWY7CisgICAgICAgICAgICBpbnN0LT5zcmNbMl0gPSByZWdfdW5kZWY7CisgICAgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1NFTDoKKyAgICAgICAgIGlmIChpbnN0LT5zYXR1cmF0ZSAmJiBpbnN0LT5zcmNbMV0uZmlsZSA9PSBJTU0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaW5zdC0+Y29uZGl0aW9uYWxfbW9kKSB7CisgICAgICAgICAgICBjYXNlIEJSV19DT05ESVRJT05BTF9MRToKKyAgICAgICAgICAgIGNhc2UgQlJXX0NPTkRJVElPTkFMX0w6CisgICAgICAgICAgICAgICBzd2l0Y2ggKGluc3QtPnNyY1sxXS50eXBlKSB7CisgICAgICAgICAgICAgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX0Y6CisgICAgICAgICAgICAgICAgICBpZiAoaW5zdC0+c3JjWzFdLmltbS5mID49IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgIGluc3QtPm9wY29kZSA9IEJSV19PUENPREVfTU9WOworICAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjWzFdID0gcmVnX3VuZGVmOworICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlJXX0NPTkRJVElPTkFMX0dFOgorICAgICAgICAgICAgY2FzZSBCUldfQ09ORElUSU9OQUxfRzoKKyAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdC0+c3JjWzFdLnR5cGUpIHsKKyAgICAgICAgICAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRjoKKyAgICAgICAgICAgICAgICAgIGlmIChpbnN0LT5zcmNbMV0uaW1tLmYgPD0gMC4wZikgeworICAgICAgICAgICAgICAgICAgICAgaW5zdC0+b3Bjb2RlID0gQlJXX09QQ09ERV9NT1Y7CisgICAgICAgICAgICAgICAgICAgICBpbnN0LT5zcmNbMV0gPSByZWdfdW5kZWY7CisgICAgICAgICAgICAgICAgICAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHByb2dyZXNzOworfQorCitib29sCitmc192aXNpdG9yOjpjb21wdXRlX3RvX21yZigpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisgICBpbnQgbmV4dF9pcCA9IDA7CisKKyAgIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpOworCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworCisgICAgICBpbnQgaXAgPSBuZXh0X2lwOworICAgICAgbmV4dF9pcCsrOworCisgICAgICBpZiAoaW5zdC0+b3Bjb2RlICE9IEJSV19PUENPREVfTU9WIHx8CisJICBpbnN0LT5pc19wYXJ0aWFsX3dyaXRlKCkgfHwKKwkgIGluc3QtPmRzdC5maWxlICE9IE1SRiB8fCBpbnN0LT5zcmNbMF0uZmlsZSAhPSBHUkYgfHwKKwkgIGluc3QtPmRzdC50eXBlICE9IGluc3QtPnNyY1swXS50eXBlIHx8CisJICBpbnN0LT5zcmNbMF0uYWJzIHx8IGluc3QtPnNyY1swXS5uZWdhdGUgfHwKKyAgICAgICAgICAhaW5zdC0+c3JjWzBdLmlzX2NvbnRpZ3VvdXMoKSB8fAorICAgICAgICAgIGluc3QtPnNyY1swXS5zdWJyZWdfb2Zmc2V0KQorCSBjb250aW51ZTsKKworICAgICAgLyogV29yayBvdXQgd2hpY2ggaGFyZHdhcmUgTVJGIHJlZ2lzdGVycyBhcmUgd3JpdHRlbiBieSB0aGlzCisgICAgICAgKiBpbnN0cnVjdGlvbi4KKyAgICAgICAqLworICAgICAgaW50IG1yZl9sb3cgPSBpbnN0LT5kc3QucmVnICYgfkJSV19NUkZfQ09NUFI0OworICAgICAgaW50IG1yZl9oaWdoOworICAgICAgaWYgKGluc3QtPmRzdC5yZWcgJiBCUldfTVJGX0NPTVBSNCkgeworCSBtcmZfaGlnaCA9IG1yZl9sb3cgKyA0OworICAgICAgfSBlbHNlIGlmIChkaXNwYXRjaF93aWR0aCA9PSAxNiAmJgorCQkgKCFpbnN0LT5mb3JjZV91bmNvbXByZXNzZWQgJiYgIWluc3QtPmZvcmNlX3NlY2hhbGYpKSB7CisJIG1yZl9oaWdoID0gbXJmX2xvdyArIDE7CisgICAgICB9IGVsc2UgeworCSBtcmZfaGlnaCA9IG1yZl9sb3c7CisgICAgICB9CisKKyAgICAgIC8qIENhbid0IGNvbXB1dGUtdG8tTVJGIHRoaXMgR1JGIGlmIHNvbWVvbmUgZWxzZSB3YXMgZ29pbmcgdG8KKyAgICAgICAqIHJlYWQgaXQgbGF0ZXIuCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLT52aXJ0dWFsX2dyZl9lbmRbaW5zdC0+c3JjWzBdLnJlZ10gPiBpcCkKKwkgY29udGludWU7CisKKyAgICAgIC8qIEZvdW5kIGEgbW92ZSBvZiBhIEdSRiB0byBhIE1SRi4gIExldCdzIHNlZSBpZiB3ZSBjYW4gZ28KKyAgICAgICAqIHJld3JpdGUgdGhlIHRoaW5nIHRoYXQgbWFkZSB0aGlzIEdSRiB0byB3cml0ZSBpbnRvIHRoZSBNUkYuCisgICAgICAgKi8KKyAgICAgIGZzX2luc3QgKnNjYW5faW5zdDsKKyAgICAgIGZvciAoc2Nhbl9pbnN0ID0gKGZzX2luc3QgKilpbnN0LT5wcmV2OworCSAgIHNjYW5faW5zdC0+cHJldiAhPSBOVUxMOworCSAgIHNjYW5faW5zdCA9IChmc19pbnN0ICopc2Nhbl9pbnN0LT5wcmV2KSB7CisJIGlmIChzY2FuX2luc3QtPmRzdC5maWxlID09IEdSRiAmJgorCSAgICAgc2Nhbl9pbnN0LT5kc3QucmVnID09IGluc3QtPnNyY1swXS5yZWcpIHsKKwkgICAgLyogRm91bmQgdGhlIGxhc3QgdGhpbmcgdG8gd3JpdGUgb3VyIHJlZyB3ZSB3YW50IHRvIHR1cm4KKwkgICAgICogaW50byBhIGNvbXB1dGUtdG8tTVJGLgorCSAgICAgKi8KKworCSAgICAvKiBJZiB0aGlzIG9uZSBpbnN0cnVjdGlvbiBkaWRuJ3QgcG9wdWxhdGUgYWxsIHRoZQorCSAgICAgKiBjaGFubmVscywgYmFpbC4gIFdlIG1pZ2h0IGJlIGFibGUgdG8gcmV3cml0ZSBldmVyeXRoaW5nCisJICAgICAqIHRoYXQgd3JpdGVzIHRoYXQgcmVnLCBidXQgaXQgd291bGQgcmVxdWlyZSBzbWFydGVyCisJICAgICAqIHRyYWNraW5nIHRvIGRlbGF5IHRoZSByZXdyaXRpbmcgdW50aWwgY29tcGxldGUgc3VjY2Vzcy4KKwkgICAgICovCisJICAgIGlmIChzY2FuX2luc3QtPmlzX3BhcnRpYWxfd3JpdGUoKSkKKwkgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIFRoaW5ncyByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSByZWdpc3RlciB3b3VsZCBuZWVkIHVzIHRvCisgICAgICAgICAgICAgKiB1bmRlcnN0YW5kIGNvYWxlc2Npbmcgb3V0IG1vcmUgdGhhbiBvbmUgTU9WIGF0IGEgdGltZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHNjYW5faW5zdC0+cmVnc193cml0dGVuID4gMSkKKyAgICAgICAgICAgICAgIGJyZWFrOworCisJICAgIC8qIFNFTkQgaW5zdHJ1Y3Rpb25zIGNhbid0IGhhdmUgTVJGIGFzIGEgZGVzdGluYXRpb24uICovCisJICAgIGlmIChzY2FuX2luc3QtPm1sZW4pCisJICAgICAgIGJyZWFrOworCisJICAgIGlmIChicnctPmdlbiA9PSA2KSB7CisJICAgICAgIC8qIGdlbjYgbWF0aCBpbnN0cnVjdGlvbnMgbXVzdCBoYXZlIHRoZSBkZXN0aW5hdGlvbiBiZQorCQkqIEdSRiwgc28gbm8gY29tcHV0ZS10by1NUkYgZm9yIHRoZW0uCisJCSovCisJICAgICAgIGlmIChzY2FuX2luc3QtPmlzX21hdGgoKSkgeworCQkgIGJyZWFrOworCSAgICAgICB9CisJICAgIH0KKworCSAgICBpZiAoc2Nhbl9pbnN0LT5kc3QucmVnX29mZnNldCA9PSBpbnN0LT5zcmNbMF0ucmVnX29mZnNldCkgeworCSAgICAgICAvKiBGb3VuZCB0aGUgY3JlYXRvciBvZiBvdXIgTVJGJ3Mgc291cmNlIHZhbHVlLiAqLworCSAgICAgICBzY2FuX2luc3QtPmRzdC5maWxlID0gTVJGOworCSAgICAgICBzY2FuX2luc3QtPmRzdC5yZWcgPSBpbnN0LT5kc3QucmVnOworCSAgICAgICBzY2FuX2luc3QtPnNhdHVyYXRlIHw9IGluc3QtPnNhdHVyYXRlOworCSAgICAgICBpbnN0LT5yZW1vdmUoKTsKKwkgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSAgICB9CisJICAgIGJyZWFrOworCSB9CisKKwkgLyogV2UgZG9uJ3QgaGFuZGxlIGNvbnRyb2wgZmxvdyBoZXJlLiAgTW9zdCBjb21wdXRhdGlvbiBvZgorCSAgKiB2YWx1ZXMgdGhhdCBlbmQgdXAgaW4gTVJGcyBhcmUgc2hvcnRseSBiZWZvcmUgdGhlIE1SRgorCSAgKiB3cml0ZSBhbnl3YXkuCisJICAqLworCSBpZiAoc2Nhbl9pbnN0LT5pc19jb250cm9sX2Zsb3coKSAmJiBzY2FuX2luc3QtPm9wY29kZSAhPSBCUldfT1BDT0RFX0lGKQorCSAgICBicmVhazsKKworCSAvKiBZb3UgY2FuJ3QgcmVhZCBmcm9tIGFuIE1SRiwgc28gaWYgc29tZW9uZSBlbHNlIHJlYWRzIG91cgorCSAgKiBNUkYncyBzb3VyY2UgR1JGIHRoYXQgd2Ugd2FudGVkIHRvIHJld3JpdGUsIHRoYXQgc3RvcHMgdXMuCisJICAqLworCSBib29sIGludGVyZmVyZWQgPSBmYWxzZTsKKwkgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkgICAgaWYgKHNjYW5faW5zdC0+c3JjW2ldLmZpbGUgPT0gR1JGICYmCisJCXNjYW5faW5zdC0+c3JjW2ldLnJlZyA9PSBpbnN0LT5zcmNbMF0ucmVnICYmCisJCXNjYW5faW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQgPT0gaW5zdC0+c3JjWzBdLnJlZ19vZmZzZXQpIHsKKwkgICAgICAgaW50ZXJmZXJlZCA9IHRydWU7CisJICAgIH0KKwkgfQorCSBpZiAoaW50ZXJmZXJlZCkKKwkgICAgYnJlYWs7CisKKwkgaWYgKHNjYW5faW5zdC0+ZHN0LmZpbGUgPT0gTVJGKSB7CisJICAgIC8qIElmIHNvbWVib2R5IGVsc2Ugd3JpdGVzIG91ciBNUkYgaGVyZSwgd2UgY2FuJ3QKKwkgICAgICogY29tcHV0ZS10by1NUkYgYmVmb3JlIHRoYXQuCisJICAgICAqLworCSAgICBpbnQgc2Nhbl9tcmZfbG93ID0gc2Nhbl9pbnN0LT5kc3QucmVnICYgfkJSV19NUkZfQ09NUFI0OworCSAgICBpbnQgc2Nhbl9tcmZfaGlnaDsKKworCSAgICBpZiAoc2Nhbl9pbnN0LT5kc3QucmVnICYgQlJXX01SRl9DT01QUjQpIHsKKwkgICAgICAgc2Nhbl9tcmZfaGlnaCA9IHNjYW5fbXJmX2xvdyArIDQ7CisJICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYgJiYKKwkJICAgICAgICghc2Nhbl9pbnN0LT5mb3JjZV91bmNvbXByZXNzZWQgJiYKKwkJCSFzY2FuX2luc3QtPmZvcmNlX3NlY2hhbGYpKSB7CisJICAgICAgIHNjYW5fbXJmX2hpZ2ggPSBzY2FuX21yZl9sb3cgKyAxOworCSAgICB9IGVsc2UgeworCSAgICAgICBzY2FuX21yZl9oaWdoID0gc2Nhbl9tcmZfbG93OworCSAgICB9CisKKwkgICAgaWYgKG1yZl9sb3cgPT0gc2Nhbl9tcmZfbG93IHx8CisJCW1yZl9sb3cgPT0gc2Nhbl9tcmZfaGlnaCB8fAorCQltcmZfaGlnaCA9PSBzY2FuX21yZl9sb3cgfHwKKwkJbXJmX2hpZ2ggPT0gc2Nhbl9tcmZfaGlnaCkgeworCSAgICAgICBicmVhazsKKwkgICAgfQorCSB9CisKKwkgaWYgKHNjYW5faW5zdC0+bWxlbiA+IDAgJiYgc2Nhbl9pbnN0LT5iYXNlX21yZiAhPSAtMSkgeworCSAgICAvKiBGb3VuZCBhIFNFTkQgaW5zdHJ1Y3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlcmUgYXJlCisJICAgICAqIGxpdmUgdmFsdWVzIGluIE1SRnMgZnJvbSBiYXNlX21yZiB0byBiYXNlX21yZiArCisJICAgICAqIHNjYW5faW5zdC0+bWxlbiAtIDEuICBEb24ndCBnbyBwdXNoaW5nIG91ciBNUkYgd3JpdGUgdXAKKwkgICAgICogYWJvdmUgaXQuCisJICAgICAqLworCSAgICBpZiAobXJmX2xvdyA+PSBzY2FuX2luc3QtPmJhc2VfbXJmICYmCisJCW1yZl9sb3cgPCBzY2FuX2luc3QtPmJhc2VfbXJmICsgc2Nhbl9pbnN0LT5tbGVuKSB7CisJICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGlmIChtcmZfaGlnaCA+PSBzY2FuX2luc3QtPmJhc2VfbXJmICYmCisJCW1yZl9oaWdoIDwgc2Nhbl9pbnN0LT5iYXNlX21yZiArIHNjYW5faW5zdC0+bWxlbikgeworCSAgICAgICBicmVhazsKKwkgICAgfQorCSB9CisgICAgICB9CisgICB9CisKKyAgIGlmIChwcm9ncmVzcykKKyAgICAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKworICAgcmV0dXJuIHByb2dyZXNzOworfQorCisvKioKKyAqIFdhbGtzIHRocm91Z2ggYmFzaWMgYmxvY2tzLCBsb29raW5nIGZvciByZXBlYXRlZCBNUkYgd3JpdGVzIGFuZAorICogcmVtb3ZpbmcgdGhlIGxhdGVyIG9uZXMuCisgKi8KK2Jvb2wKK2ZzX3Zpc2l0b3I6OnJlbW92ZV9kdXBsaWNhdGVfbXJmX3dyaXRlcygpCit7CisgICBmc19pbnN0ICpsYXN0X21yZl9tb3ZlWzE2XTsKKyAgIGJvb2wgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgLyogTmVlZCB0byB1cGRhdGUgdGhlIE1SRiB0cmFja2luZyBmb3IgY29tcHJlc3NlZCBpbnN0cnVjdGlvbnMuICovCisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIG1lbXNldChsYXN0X21yZl9tb3ZlLCAwLCBzaXplb2YobGFzdF9tcmZfbW92ZSkpOworCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworCisgICAgICBpZiAoaW5zdC0+aXNfY29udHJvbF9mbG93KCkpIHsKKwkgbWVtc2V0KGxhc3RfbXJmX21vdmUsIDAsIHNpemVvZihsYXN0X21yZl9tb3ZlKSk7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9NT1YgJiYKKwkgIGluc3QtPmRzdC5maWxlID09IE1SRikgeworCSBmc19pbnN0ICpwcmV2X2luc3QgPSBsYXN0X21yZl9tb3ZlW2luc3QtPmRzdC5yZWddOworCSBpZiAocHJldl9pbnN0ICYmIGluc3QtPmVxdWFscyhwcmV2X2luc3QpKSB7CisJICAgIGluc3QtPnJlbW92ZSgpOworCSAgICBwcm9ncmVzcyA9IHRydWU7CisJICAgIGNvbnRpbnVlOworCSB9CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIG91dCB0aGUgbGFzdC13cml0ZSByZWNvcmRzIGZvciBNUkZzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbi4gKi8KKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBNUkYpIHsKKwkgbGFzdF9tcmZfbW92ZVtpbnN0LT5kc3QucmVnXSA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5tbGVuID4gMCAmJiBpbnN0LT5iYXNlX21yZiAhPSAtMSkgeworCSAvKiBGb3VuZCBhIFNFTkQgaW5zdHJ1Y3Rpb24sIHdoaWNoIHdpbGwgaW5jbHVkZSB0d28gb3IgZmV3ZXIKKwkgICogaW1wbGllZCBNUkYgd3JpdGVzLiAgV2UgY291bGQgZG8gYmV0dGVyIGhlcmUuCisJICAqLworCSBmb3IgKGludCBpID0gMDsgaSA8IGltcGxpZWRfbXJmX3dyaXRlcyhpbnN0KTsgaSsrKSB7CisJICAgIGxhc3RfbXJmX21vdmVbaW5zdC0+YmFzZV9tcmYgKyBpXSA9IE5VTEw7CisJIH0KKyAgICAgIH0KKworICAgICAgLyogQ2xlYXIgb3V0IGFueSBNUkYgbW92ZSByZWNvcmRzIHdob3NlIHNvdXJjZXMgZ290IG92ZXJ3cml0dGVuLiAqLworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikgeworCSBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IEVsZW1lbnRzKGxhc3RfbXJmX21vdmUpOyBpKyspIHsKKwkgICAgaWYgKGxhc3RfbXJmX21vdmVbaV0gJiYKKwkJbGFzdF9tcmZfbW92ZVtpXS0+c3JjWzBdLnJlZyA9PSBpbnN0LT5kc3QucmVnKSB7CisJICAgICAgIGxhc3RfbXJmX21vdmVbaV0gPSBOVUxMOworCSAgICB9CisJIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX01PViAmJgorCSAgaW5zdC0+ZHN0LmZpbGUgPT0gTVJGICYmCisJICBpbnN0LT5zcmNbMF0uZmlsZSA9PSBHUkYgJiYKKwkgICFpbnN0LT5pc19wYXJ0aWFsX3dyaXRlKCkpIHsKKwkgbGFzdF9tcmZfbW92ZVtpbnN0LT5kc3QucmVnXSA9IGluc3Q7CisgICAgICB9CisgICB9CisKKyAgIGlmIChwcm9ncmVzcykKKyAgICAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKworICAgcmV0dXJuIHByb2dyZXNzOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfZGVwc19mb3JfaW5zdF9zcmMoZnNfaW5zdCAqaW5zdCwgaW50IGRpc3BhdGNoX3dpZHRoLCBib29sICpkZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X2dyZiwgaW50IGdyZl9sZW4pCit7CisgICBib29sIGluc3Rfc2ltZDE2ID0gKGRpc3BhdGNoX3dpZHRoID4gOCAmJgorICAgICAgICAgICAgICAgICAgICAgICAhaW5zdC0+Zm9yY2VfdW5jb21wcmVzc2VkICYmCisgICAgICAgICAgICAgICAgICAgICAgICFpbnN0LT5mb3JjZV9zZWNoYWxmKTsKKworICAgLyogQ2xlYXIgdGhlIGZsYWcgZm9yIHJlZ2lzdGVycyB0aGF0IGFjdHVhbGx5IGdvdCByZWFkIChhcyBleHBlY3RlZCkuICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgaW50IGdyZjsKKyAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGdyZiA9IGluc3QtPnNyY1tpXS5yZWc7CisgICAgICB9IGVsc2UgaWYgKGluc3QtPnNyY1tpXS5maWxlID09IEhXX1JFRyAmJgorICAgICAgICAgICAgICAgICBpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSkgeworICAgICAgICAgZ3JmID0gaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5ucjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGdyZiA+PSBmaXJzdF9ncmYgJiYKKyAgICAgICAgICBncmYgPCBmaXJzdF9ncmYgKyBncmZfbGVuKSB7CisgICAgICAgICBkZXBzW2dyZiAtIGZpcnN0X2dyZl0gPSBmYWxzZTsKKyAgICAgICAgIGlmIChpbnN0X3NpbWQxNikKKyAgICAgICAgICAgIGRlcHNbZ3JmIC0gZmlyc3RfZ3JmICsgMV0gPSBmYWxzZTsKKyAgICAgIH0KKyAgIH0KK30KKworLyoqCisgKiBJbXBsZW1lbnRzIHRoaXMgd29ya2Fyb3VuZCBmb3IgdGhlIG9yaWdpbmFsIDk2NToKKyAqCisgKiAgICAgIltEZXZCVywgRGV2Q0xdIEltcGxlbWVudGF0aW9uIFJlc3RyaWN0aW9uczogQXMgdGhlIGhhcmR3YXJlIGRvZXMgbm90CisgKiAgICAgIGNoZWNrIGZvciBwb3N0IGRlc3RpbmF0aW9uIGRlcGVuZGVuY2llcyBvbiB0aGlzIGluc3RydWN0aW9uLCBzb2Z0d2FyZQorICogICAgICBtdXN0IGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIGRlc3RpbmF0aW9uIGhhemFyZCBmb3IgdGhlIGNhc2Ugb2Yg4oCYd3JpdGUKKyAqICAgICAgZm9sbG93ZWQgYnkgYSBwb3N0ZWQgd3JpdGXigJkgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgorICoKKyAqICAgICAgMS4gbW92IHIzIDAKKyAqICAgICAgMi4gc2VuZCByMy54eSA8cmVzdCBvZiBzZW5kIGluc3RydWN0aW9uPgorICogICAgICAzLiBtb3YgcjIgcjMKKyAqCisgKiAgICAgIER1ZSB0byBubyBwb3N0LWRlc3RpbmF0aW9uIGRlcGVuZGVuY3kgY2hlY2sgb24gdGhlIOKAmHNlbmTigJksIHRoZSBhYm92ZQorICogICAgICBjb2RlIHNlcXVlbmNlIGNvdWxkIGhhdmUgdHdvIGluc3RydWN0aW9ucyAoMSBhbmQgMikgaW4gZmxpZ2h0IGF0IHRoZQorICogICAgICBzYW1lIHRpbWUgdGhhdCBib3RoIGNvbnNpZGVyIOKAmHIz4oCZIGFzIHRoZSB0YXJnZXQgb2YgdGhlaXIgZmluYWwgd3JpdGVzLgorICovCit2b2lkCitmc192aXNpdG9yOjppbnNlcnRfZ2VuNF9wcmVfc2VuZF9kZXBlbmRlbmN5X3dvcmthcm91bmRzKGZzX2luc3QgKmluc3QpCit7CisgICBpbnQgcmVnX3NpemUgPSBkaXNwYXRjaF93aWR0aCAvIDg7CisgICBpbnQgd3JpdGVfbGVuID0gaW5zdC0+cmVnc193cml0dGVuICogcmVnX3NpemU7CisgICBpbnQgZmlyc3Rfd3JpdGVfZ3JmID0gaW5zdC0+ZHN0LnJlZzsKKyAgIGJvb2wgbmVlZHNfZGVwW0JSV19NQVhfTVJGXTsKKyAgIGFzc2VydCh3cml0ZV9sZW4gPCAoaW50KXNpemVvZihuZWVkc19kZXApIC0gMSk7CisKKyAgIG1lbXNldChuZWVkc19kZXAsIGZhbHNlLCBzaXplb2YobmVlZHNfZGVwKSk7CisgICBtZW1zZXQobmVlZHNfZGVwLCB0cnVlLCB3cml0ZV9sZW4pOworCisgICBjbGVhcl9kZXBzX2Zvcl9pbnN0X3NyYyhpbnN0LCBkaXNwYXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzX2RlcCwgZmlyc3Rfd3JpdGVfZ3JmLCB3cml0ZV9sZW4pOworCisgICAvKiBXYWxrIGJhY2t3YXJkcyBsb29raW5nIGZvciB3cml0ZXMgdG8gcmVnaXN0ZXJzIHdlJ3JlIHdyaXRpbmcgd2hpY2gKKyAgICAqIGFyZW4ndCByZWFkIHNpbmNlIGJlaW5nIHdyaXR0ZW4uICBJZiB3ZSBoaXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtLAorICAgICogd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIGRlcGVuZGVuY2llcyBvbiBlbnRyeSB0byB0aGUKKyAgICAqIHByb2dyYW0uCisgICAgKi8KKyAgIGZvciAoZnNfaW5zdCAqc2Nhbl9pbnN0ID0gKGZzX2luc3QgKilpbnN0LT5wcmV2OworICAgICAgICAhc2Nhbl9pbnN0LT5pc19oZWFkX3NlbnRpbmVsKCk7CisgICAgICAgIHNjYW5faW5zdCA9IChmc19pbnN0ICopc2Nhbl9pbnN0LT5wcmV2KSB7CisKKyAgICAgIC8qIElmIHdlIGhpdCBjb250cm9sIGZsb3csIGFzc3VtZSB0aGF0IHRoZXJlICphcmUqIG91dHN0YW5kaW5nCisgICAgICAgKiBkZXBlbmRlbmNpZXMsIGFuZCBmb3JjZSB0aGVpciBjbGVhbnVwIGJlZm9yZSBvdXIgaW5zdHJ1Y3Rpb24uCisgICAgICAgKi8KKyAgICAgIGlmIChzY2FuX2luc3QtPmlzX2NvbnRyb2xfZmxvdygpKSB7CisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyaXRlX2xlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmVlZHNfZGVwW2ldKSB7CisgICAgICAgICAgICAgICBpbnN0LT5pbnNlcnRfYmVmb3JlKERFUF9SRVNPTFZFX01PVihmaXJzdF93cml0ZV9ncmYgKyBpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGJvb2wgc2Nhbl9pbnN0X3NpbWQxNiA9IChkaXNwYXRjaF93aWR0aCA+IDggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2Nhbl9pbnN0LT5mb3JjZV91bmNvbXByZXNzZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2Nhbl9pbnN0LT5mb3JjZV9zZWNoYWxmKTsKKworICAgICAgLyogV2UgaW5zZXJ0IG91ciByZWFkcyBhcyBsYXRlIGFzIHBvc3NpYmxlIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYW55CisgICAgICAgKiBpbnN0cnVjdGlvbiBidXQgYSBNT1YgdGhhdCBtaWdodCBoYXZlIGxlZnQgdXMgYW4gb3V0c3RhbmRpbmcKKyAgICAgICAqIGRlcGVuZGVuY3kgaGFzIG1vcmUgbGF0ZW5jeSB0aGFuIGEgTU9WLgorICAgICAgICovCisgICAgICBpZiAoc2Nhbl9pbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Nhbl9pbnN0LT5yZWdzX3dyaXR0ZW47IGkrKykgeworICAgICAgICAgICAgaW50IHJlZyA9IHNjYW5faW5zdC0+ZHN0LnJlZyArIGkgKiByZWdfc2l6ZTsKKworICAgICAgICAgICAgaWYgKHJlZyA+PSBmaXJzdF93cml0ZV9ncmYgJiYKKyAgICAgICAgICAgICAgICByZWcgPCBmaXJzdF93cml0ZV9ncmYgKyB3cml0ZV9sZW4gJiYKKyAgICAgICAgICAgICAgICBuZWVkc19kZXBbcmVnIC0gZmlyc3Rfd3JpdGVfZ3JmXSkgeworICAgICAgICAgICAgICAgaW5zdC0+aW5zZXJ0X2JlZm9yZShERVBfUkVTT0xWRV9NT1YocmVnKSk7CisgICAgICAgICAgICAgICBuZWVkc19kZXBbcmVnIC0gZmlyc3Rfd3JpdGVfZ3JmXSA9IGZhbHNlOworICAgICAgICAgICAgICAgaWYgKHNjYW5faW5zdF9zaW1kMTYpCisgICAgICAgICAgICAgICAgICBuZWVkc19kZXBbcmVnIC0gZmlyc3Rfd3JpdGVfZ3JmICsgMV0gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ2xlYXIgdGhlIGZsYWcgZm9yIHJlZ2lzdGVycyB0aGF0IGFjdHVhbGx5IGdvdCByZWFkIChhcyBleHBlY3RlZCkuICovCisgICAgICBjbGVhcl9kZXBzX2Zvcl9pbnN0X3NyYyhzY2FuX2luc3QsIGRpc3BhdGNoX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNfZGVwLCBmaXJzdF93cml0ZV9ncmYsIHdyaXRlX2xlbik7CisKKyAgICAgIC8qIENvbnRpbnVlIHRoZSBsb29wIG9ubHkgaWYgd2UgaGF2ZW4ndCByZXNvbHZlZCBhbGwgdGhlIGRlcGVuZGVuY2llcyAqLworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd3JpdGVfbGVuOyBpKyspIHsKKyAgICAgICAgIGlmIChuZWVkc19kZXBbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChpID09IHdyaXRlX2xlbikKKyAgICAgICAgIHJldHVybjsKKyAgIH0KK30KKworLyoqCisgKiBJbXBsZW1lbnRzIHRoaXMgd29ya2Fyb3VuZCBmb3IgdGhlIG9yaWdpbmFsIDk2NToKKyAqCisgKiAgICAgIltEZXZCVywgRGV2Q0xdIEVycmF0YTogQSBkZXN0aW5hdGlvbiByZWdpc3RlciBmcm9tIGEgc2VuZCBjYW4gbm90IGJlCisgKiAgICAgIHVzZWQgYXMgYSBkZXN0aW5hdGlvbiByZWdpc3RlciB1bnRpbCBhZnRlciBpdCBoYXMgYmVlbiBzb3VyY2VkIGJ5IGFuCisgKiAgICAgIGluc3RydWN0aW9uIHdpdGggYSBkaWZmZXJlbnQgZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgKi8KK3ZvaWQKK2ZzX3Zpc2l0b3I6Omluc2VydF9nZW40X3Bvc3Rfc2VuZF9kZXBlbmRlbmN5X3dvcmthcm91bmRzKGZzX2luc3QgKmluc3QpCit7CisgICBpbnQgd3JpdGVfbGVuID0gaW5zdC0+cmVnc193cml0dGVuICogZGlzcGF0Y2hfd2lkdGggLyA4OworICAgaW50IGZpcnN0X3dyaXRlX2dyZiA9IGluc3QtPmRzdC5yZWc7CisgICBib29sIG5lZWRzX2RlcFtCUldfTUFYX01SRl07CisgICBhc3NlcnQod3JpdGVfbGVuIDwgKGludClzaXplb2YobmVlZHNfZGVwKSAtIDEpOworCisgICBtZW1zZXQobmVlZHNfZGVwLCBmYWxzZSwgc2l6ZW9mKG5lZWRzX2RlcCkpOworICAgbWVtc2V0KG5lZWRzX2RlcCwgdHJ1ZSwgd3JpdGVfbGVuKTsKKyAgIC8qIFdhbGsgZm9yd2FyZHMgbG9va2luZyBmb3Igd3JpdGVzIHRvIHJlZ2lzdGVycyB3ZSdyZSB3cml0aW5nIHdoaWNoIGFyZW4ndAorICAgICogcmVhZCBiZWZvcmUgYmVpbmcgd3JpdHRlbi4KKyAgICAqLworICAgZm9yIChmc19pbnN0ICpzY2FuX2luc3QgPSAoZnNfaW5zdCAqKWluc3QtPm5leHQ7CisgICAgICAgICFzY2FuX2luc3QtPmlzX3RhaWxfc2VudGluZWwoKTsKKyAgICAgICAgc2Nhbl9pbnN0ID0gKGZzX2luc3QgKilzY2FuX2luc3QtPm5leHQpIHsKKyAgICAgIC8qIElmIHdlIGhpdCBjb250cm9sIGZsb3csIGZvcmNlIHJlc29sdmUgYWxsIHJlbWFpbmluZyBkZXBlbmRlbmNpZXMuICovCisgICAgICBpZiAoc2Nhbl9pbnN0LT5pc19jb250cm9sX2Zsb3coKSkgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cml0ZV9sZW47IGkrKykgeworICAgICAgICAgICAgaWYgKG5lZWRzX2RlcFtpXSkKKyAgICAgICAgICAgICAgIHNjYW5faW5zdC0+aW5zZXJ0X2JlZm9yZShERVBfUkVTT0xWRV9NT1YoZmlyc3Rfd3JpdGVfZ3JmICsgaSkpOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvKiBDbGVhciB0aGUgZmxhZyBmb3IgcmVnaXN0ZXJzIHRoYXQgYWN0dWFsbHkgZ290IHJlYWQgKGFzIGV4cGVjdGVkKS4gKi8KKyAgICAgIGNsZWFyX2RlcHNfZm9yX2luc3Rfc3JjKHNjYW5faW5zdCwgZGlzcGF0Y2hfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc19kZXAsIGZpcnN0X3dyaXRlX2dyZiwgd3JpdGVfbGVuKTsKKworICAgICAgLyogV2UgaW5zZXJ0IG91ciByZWFkcyBhcyBsYXRlIGFzIHBvc3NpYmxlIHNpbmNlIHRoZXkncmUgcmVhZGluZyB0aGUKKyAgICAgICAqIHJlc3VsdCBvZiBhIFNFTkQsIHdoaWNoIGhhcyBtYXNzaXZlIGxhdGVuY3kuCisgICAgICAgKi8KKyAgICAgIGlmIChzY2FuX2luc3QtPmRzdC5maWxlID09IEdSRiAmJgorICAgICAgICAgIHNjYW5faW5zdC0+ZHN0LnJlZyA+PSBmaXJzdF93cml0ZV9ncmYgJiYKKyAgICAgICAgICBzY2FuX2luc3QtPmRzdC5yZWcgPCBmaXJzdF93cml0ZV9ncmYgKyB3cml0ZV9sZW4gJiYKKyAgICAgICAgICBuZWVkc19kZXBbc2Nhbl9pbnN0LT5kc3QucmVnIC0gZmlyc3Rfd3JpdGVfZ3JmXSkgeworICAgICAgICAgc2Nhbl9pbnN0LT5pbnNlcnRfYmVmb3JlKERFUF9SRVNPTFZFX01PVihzY2FuX2luc3QtPmRzdC5yZWcpKTsKKyAgICAgICAgIG5lZWRzX2RlcFtzY2FuX2luc3QtPmRzdC5yZWcgLSBmaXJzdF93cml0ZV9ncmZdID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8qIENvbnRpbnVlIHRoZSBsb29wIG9ubHkgaWYgd2UgaGF2ZW4ndCByZXNvbHZlZCBhbGwgdGhlIGRlcGVuZGVuY2llcyAqLworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd3JpdGVfbGVuOyBpKyspIHsKKyAgICAgICAgIGlmIChuZWVkc19kZXBbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChpID09IHdyaXRlX2xlbikKKyAgICAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogSWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0sIHJlc29sdmUgYWxsIHJlbWFpbmluZyBkZXBlbmRlbmNpZXMgb3V0CisgICAgKiBvZiBwYXJhbm9pYS4KKyAgICAqLworICAgZnNfaW5zdCAqbGFzdF9pbnN0ID0gKGZzX2luc3QgKil0aGlzLT5pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKyAgIGFzc2VydChsYXN0X2luc3QtPmVvdCk7CisgICBmb3IgKGludCBpID0gMDsgaSA8IHdyaXRlX2xlbjsgaSsrKSB7CisgICAgICBpZiAobmVlZHNfZGVwW2ldKQorICAgICAgICAgbGFzdF9pbnN0LT5pbnNlcnRfYmVmb3JlKERFUF9SRVNPTFZFX01PVihmaXJzdF93cml0ZV9ncmYgKyBpKSk7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6Omluc2VydF9nZW40X3NlbmRfZGVwZW5kZW5jeV93b3JrYXJvdW5kcygpCit7CisgICBpZiAoYnJ3LT5nZW4gIT0gNCB8fCBicnctPmlzX2c0eCkKKyAgICAgIHJldHVybjsKKworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworCisgICAvKiBOb3RlIHRoYXQgd2UncmUgZG9uZSB3aXRoIHJlZ2lzdGVyIGFsbG9jYXRpb24sIHNvIEdSRiBmc19yZWdzIGFsd2F5cworICAgICogaGF2ZSBhIC5yZWdfb2Zmc2V0IG9mIDAuCisgICAgKi8KKworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgaWYgKGluc3QtPm1sZW4gIT0gMCAmJiBpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGluc2VydF9nZW40X3ByZV9zZW5kX2RlcGVuZGVuY3lfd29ya2Fyb3VuZHMoaW5zdCk7CisgICAgICAgICBpbnNlcnRfZ2VuNF9wb3N0X3NlbmRfZGVwZW5kZW5jeV93b3JrYXJvdW5kcyhpbnN0KTsKKyAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHByb2dyZXNzKQorICAgICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworfQorCisvKioKKyAqIFR1cm5zIHRoZSBnZW5lcmljIGV4cHJlc3Npb24tc3R5bGUgdW5pZm9ybSBwdWxsIGNvbnN0YW50IGxvYWQgaW5zdHJ1Y3Rpb24KKyAqIGludG8gYSBoYXJkd2FyZS1zcGVjaWZpYyBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zIGZvciBsb2FkaW5nIGEgcHVsbAorICogY29uc3RhbnQuCisgKgorICogVGhlIGV4cHJlc3Npb24gc3R5bGUgYWxsb3dzIHRoZSBDU0UgcGFzcyBiZWZvcmUgdGhpcyB0byBvcHRpbWl6ZSBvdXQKKyAqIHJlcGVhdGVkIGxvYWRzIGZyb20gdGhlIHNhbWUgb2Zmc2V0LCBhbmQgZ2l2ZXMgdGhlIHByZS1yZWdpc3Rlci1hbGxvY2F0aW9uCisgKiBzY2hlZHVsaW5nIGZ1bGwgZmxleGliaWxpdHksIHdoaWxlIHRoZSBjb252ZXJzaW9uIHRvIG5hdGl2ZSBpbnN0cnVjdGlvbnMKKyAqIGFsbG93cyB0aGUgcG9zdC1yZWdpc3Rlci1hbGxvY2F0aW9uIHNjaGVkdWxlciB0aGUgYmVzdCBpbmZvcm1hdGlvbgorICogcG9zc2libGUuCisgKgorICogTm90ZSB0aGF0IGV4ZWN1dGlvbiBtYXNraW5nIGZvciBzZXR0aW5nIHVwIHB1bGwgY29uc3RhbnQgbG9hZHMgaXMgc3BlY2lhbDoKKyAqIHRoZSBjaGFubmVscyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBhcmUgdW5yZWxhdGVkIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbgorICogbWFzaywgc2luY2UgYSBsYXRlciBpbnN0cnVjdGlvbiB3aWxsIHVzZSBvbmUgb2YgdGhlIHJlc3VsdCBjaGFubmVscyBhcyBhCisgKiBzb3VyY2Ugb3BlcmFuZCBmb3IgYWxsIDggb3IgMTYgb2YgaXRzIGNoYW5uZWxzLgorICovCit2b2lkCitmc192aXNpdG9yOjpsb3dlcl91bmlmb3JtX3B1bGxfY29uc3RhbnRfbG9hZHMoKQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKW5vZGU7CisKKyAgICAgIGlmIChpbnN0LT5vcGNvZGUgIT0gRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FEKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICAgICAvKiBUaGUgb2Zmc2V0IGFyZyBiZWZvcmUgd2FzIGEgdmVjNC1hbGlnbmVkIGJ5dGUgb2Zmc2V0LiAgV2UgbmVlZCB0bworICAgICAgICAgICogdHVybiBpdCBpbnRvIGEgZHdvcmQgb2Zmc2V0LgorICAgICAgICAgICovCisgICAgICAgICBmc19yZWcgY29uc3Rfb2Zmc2V0X3JlZyA9IGluc3QtPnNyY1sxXTsKKyAgICAgICAgIGFzc2VydChjb25zdF9vZmZzZXRfcmVnLmZpbGUgPT0gSU1NICYmCisgICAgICAgICAgICAgICAgY29uc3Rfb2Zmc2V0X3JlZy50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgIGNvbnN0X29mZnNldF9yZWcuaW1tLnUgLz0gNDsKKyAgICAgICAgIGZzX3JlZyBwYXlsb2FkID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKworICAgICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBnb2luZyB0byBiZSBhIE1PViwgYnV0IHNpbmNlIG9ubHkgdGhlIGZpcnN0IGR3b3JkCisgICAgICAgICAgKiBpcyBhY2Nlc3NlZCwgd2UgaGF2ZSBhIHNwZWNpYWwgb3Bjb2RlIHRvIGRvIGp1c3QgdGhhdCBvbmUuICBOb3RlCisgICAgICAgICAgKiB0aGF0IHRoaXMgbmVlZHMgdG8gYmUgYW4gb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSBjb25zaWRlcmVkIGEgZGVmCisgICAgICAgICAgKiBieSBsaXZlIHZhcmlhYmxlIGFuYWx5c2lzLCBvciByZWdpc3RlciBhbGxvY2F0aW9uIHdpbGwgZXhwbG9kZS4KKyAgICAgICAgICAqLworICAgICAgICAgZnNfaW5zdCAqc2V0dXAgPSBuZXcobWVtX2N0eCkgZnNfaW5zdChGU19PUENPREVfU0VUX1NJTUQ0WDJfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLCBjb25zdF9vZmZzZXRfcmVnKTsKKyAgICAgICAgIHNldHVwLT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKworICAgICAgICAgc2V0dXAtPmlyID0gaW5zdC0+aXI7CisgICAgICAgICBzZXR1cC0+YW5ub3RhdGlvbiA9IGluc3QtPmFubm90YXRpb247CisgICAgICAgICBpbnN0LT5pbnNlcnRfYmVmb3JlKHNldHVwKTsKKworICAgICAgICAgLyogU2ltaWxhcmx5LCB0aGlzIHdpbGwgb25seSBwb3B1bGF0ZSB0aGUgZmlyc3QgNCBjaGFubmVscyBvZiB0aGUKKyAgICAgICAgICAqIHJlc3VsdCByZWdpc3RlciAoc2luY2Ugd2Ugb25seSB1c2Ugc21lYXIgdmFsdWVzIGZyb20gMC0zKSwgYnV0IHdlCisgICAgICAgICAgKiBkb24ndCB0ZWxsIHRoZSBvcHRpbWl6ZXIuCisgICAgICAgICAgKi8KKyAgICAgICAgIGluc3QtPm9wY29kZSA9IEZTX09QQ09ERV9VTklGT1JNX1BVTExfQ09OU1RBTlRfTE9BRF9HRU43OworICAgICAgICAgaW5zdC0+c3JjWzFdID0gcGF5bG9hZDsKKworICAgICAgICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIEJlZm9yZSByZWdpc3RlciBhbGxvY2F0aW9uLCB3ZSBkaWRuJ3QgdGVsbCB0aGUgc2NoZWR1bGVyIGFib3V0IHRoZQorICAgICAgICAgICogTVJGIHdlIHVzZS4gIFdlIGtub3cgaXQncyBzYWZlIHRvIHVzZSB0aGlzIE1SRiBiZWNhdXNlIG5vdGhpbmcKKyAgICAgICAgICAqIGVsc2UgZG9lcyBleGNlcHQgZm9yIHJlZ2lzdGVyIHNwaWxsL3Vuc3BpbGwsIHdoaWNoIGdlbmVyYXRlcyBhbmQKKyAgICAgICAgICAqIHVzZXMgaXRzIE1SRiB3aXRoaW4gYSBzaW5nbGUgSVIgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgKi8KKyAgICAgICAgIGluc3QtPmJhc2VfbXJmID0gMTQ7CisgICAgICAgICBpbnN0LT5tbGVuID0gMTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZHVtcF9pbnN0cnVjdGlvbnMoKQoreworICAgY2FsY3VsYXRlX3JlZ2lzdGVyX3ByZXNzdXJlKCk7CisKKyAgIGludCBpcCA9IDAsIG1heF9wcmVzc3VyZSA9IDAsIGluZGVudCA9IDA7OworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIG1heF9wcmVzc3VyZSA9IE1BWDIobWF4X3ByZXNzdXJlLCByZWdzX2xpdmVfYXRfaXBbaXBdKTsKKworICAgICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9ETzogICAgCisgICAgICBjYXNlIEJSV19PUENPREVfSUY6ICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0VMU0U6ICAKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTkRJRjogLS1pbmRlbnQ7IGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1dISUxFOiAtLWluZGVudDsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKworICAgICAgZnByaW50ZihzdGRlcnIsICJ7JTNkfSAlNGQ6ICIsIHJlZ3NfbGl2ZV9hdF9pcFtpcF0sIGlwKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxpbmRlbnQqNDsgKytpKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIik7CisKKyAgICAgIGR1bXBfaW5zdHJ1Y3Rpb24oaW5zdCwgc3RkZXJyKTsKKyAgICAgICsraXA7CisKKyAgICAgIHN3aXRjaCAoaW5zdC0+b3Bjb2RlKSB7CisgICAgICBjYXNlIEJSV19PUENPREVfRE86ICAgIAorICAgICAgY2FzZSBCUldfT1BDT0RFX0lGOiAgICAKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTFNFOiAgKytpbmRlbnQ7IGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1dISUxFOiAKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9FTkRJRjogYnJlYWs7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIGZwcmludGYoc3RkZXJyLCAiTWF4aW11bSAlM2QgcmVnaXN0ZXJzIGxpdmUgYXQgb25jZS5cbiIsIG1heF9wcmVzc3VyZSk7Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqYmVfaW5zdCkKK3sKKyAgIGR1bXBfaW5zdHJ1Y3Rpb24oYmVfaW5zdCwgc3RkZXJyKTsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZHVtcF9pbnN0cnVjdGlvbihiYWNrZW5kX2luc3RydWN0aW9uICpiZV9pbnN0LCBGSUxFICpmaWxlKQoreworICAgY2hhciBidWZmWzI1Nl07CisgICBkdW1wX2luc3RydWN0aW9uKGJlX2luc3QsIGJ1ZmYpOworCisgICBmcHJpbnRmKGZpbGUsICIlcyIsIGJ1ZmYpOworCisgICBmcHJpbnRmKGZpbGUsICJcbiIpOworfQorCit2b2lkCitmc192aXNpdG9yOjpkdW1wX2luc3RydWN0aW9uKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmJlX2luc3QsIGNoYXIqIHN0cmluZykKK3sKKyAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKWJlX2luc3Q7CisKKyAgIGlmIChpbnN0LT5wcmVkaWNhdGUpIHsKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiglY2YwLiVkKSAiLAorICAgICAgICAgICAgIGluc3QtPnByZWRpY2F0ZV9pbnZlcnNlID8gJy0nIDogJysnLAorICAgICAgICAgICAgIGluc3QtPmZsYWdfc3VicmVnKTsKKyAgIH0KKworICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiJXMiLCBicndfaW5zdHJ1Y3Rpb25fbmFtZShpbnN0LT5vcGNvZGUpKTsKKyAgIGlmIChpbnN0LT5zYXR1cmF0ZSkKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIi5zYXQiKTsKKyAgIGlmIChpbnN0LT5jb25kaXRpb25hbF9tb2QpIHsKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiVzIiwgY29uZGl0aW9uYWxfbW9kaWZpZXJbaW5zdC0+Y29uZGl0aW9uYWxfbW9kXSk7CisgICAgICBpZiAoIWluc3QtPnByZWRpY2F0ZSAmJgorICAgICAgICAgIChicnctPmdlbiA8IDUgfHwgKGluc3QtPm9wY29kZSAhPSBCUldfT1BDT0RFX1NFTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+b3Bjb2RlICE9IEJSV19PUENPREVfSUYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPm9wY29kZSAhPSBCUldfT1BDT0RFX1dISUxFKSkpIHsKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIi5mMC4lZCIsIGluc3QtPmZsYWdfc3VicmVnKTsKKyAgICAgIH0KKyAgIH0KKyAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiAiKTsKKworCisgICBzd2l0Y2ggKGluc3QtPmRzdC5maWxlKSB7CisgICBjYXNlIEdSRjoKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgInZncmYlZCIsIGluc3QtPmRzdC5yZWcpOworICAgICAgaWYgKHZpcnR1YWxfZ3JmX3NpemVzW2luc3QtPmRzdC5yZWddICE9IDEgfHwKKyAgICAgICAgICBpbnN0LT5kc3Quc3VicmVnX29mZnNldCkKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIislZC4lZCIsCisgICAgICAgICAgICAgICAgIGluc3QtPmRzdC5yZWdfb2Zmc2V0LCBpbnN0LT5kc3Quc3VicmVnX29mZnNldCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgTVJGOgorICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAibSVkIiwgaW5zdC0+ZHN0LnJlZyk7CisgICAgICBicmVhazsKKyAgIGNhc2UgQkFEX0ZJTEU6CisgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIobnVsbCkiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBVTklGT1JNOgorICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiKioqdSVkKioqIiwgaW5zdC0+ZHN0LnJlZyArIGluc3QtPmRzdC5yZWdfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBIV19SRUc6CisgICAgICBpZiAoaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5maWxlID09IEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSkgeworICAgICAgICAgc3dpdGNoIChpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLm5yKSB7CisgICAgICAgICBjYXNlIEJSV19BUkZfTlVMTDoKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIm51bGwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCUldfQVJGX0FERFJFU1M6CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJhMC4lZCIsIGluc3QtPmRzdC5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEJSV19BUkZfQUNDVU1VTEFUT1I6CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJhY2MlZCIsIGluc3QtPmRzdC5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEJSV19BUkZfRkxBRzoKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgImYlZC4lZCIsIGluc3QtPmRzdC5maXhlZF9od19yZWcubnIgJiAweGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPmRzdC5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiYXJmJWQuJWQiLCBpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLm5yICYgMHhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPmRzdC5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiaHdfcmVnJWQiLCBpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLm5yKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLnN1Ym5yKQorICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiKyVkIiwgaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICI/Pz8iKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiOiVzLCAiLCBicndfcmVnX3R5cGVfbGV0dGVycyhpbnN0LT5kc3QudHlwZSkpOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IDMgJiYgaW5zdC0+c3JjW2ldLmZpbGUgIT0gQkFEX0ZJTEU7IGkrKykgeworICAgICAgaWYgKGluc3QtPnNyY1tpXS5uZWdhdGUpCisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICItIik7CisgICAgICBpZiAoaW5zdC0+c3JjW2ldLmFicykKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgInwiKTsKKyAgICAgIHN3aXRjaCAoaW5zdC0+c3JjW2ldLmZpbGUpIHsKKyAgICAgIGNhc2UgR1JGOgorICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAidmdyZiVkIiwgaW5zdC0+c3JjW2ldLnJlZyk7CisgICAgICAgICBpZiAodmlydHVhbF9ncmZfc2l6ZXNbaW5zdC0+c3JjW2ldLnJlZ10gIT0gMSB8fAorICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5zdWJyZWdfb2Zmc2V0KQorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiKyVkLiVkIiwgaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5zdWJyZWdfb2Zmc2V0KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNUkY6CisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIqKiptJWQqKioiLCBpbnN0LT5zcmNbaV0ucmVnKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVTklGT1JNOgorICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAidSVkIiwgaW5zdC0+c3JjW2ldLnJlZyArIGluc3QtPnNyY1tpXS5yZWdfb2Zmc2V0KTsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0ucmVsYWRkcikgeworICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiK3JlbGFkZHIiKTsKKyAgICAgICAgIH0gZWxzZSBpZiAodmlydHVhbF9ncmZfc2l6ZXNbaW5zdC0+c3JjW2ldLnJlZ10gIT0gMSB8fAorICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5zdWJyZWdfb2Zmc2V0KSB7CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIrJWQuJWQiLCBpbnN0LT5zcmNbaV0ucmVnX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLnN1YnJlZ19vZmZzZXQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJBRF9GSUxFOgorICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiKG51bGwpIik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSU1NOgorICAgICAgICAgc3dpdGNoIChpbnN0LT5zcmNbaV0udHlwZSkgeworICAgICAgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9GOgorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiJWZmIiwgaW5zdC0+c3JjW2ldLmltbS5mKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9EOgorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiJWRkIiwgaW5zdC0+c3JjW2ldLmltbS5pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9VRDoKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiV1dSIsIGluc3QtPnNyY1tpXS5pbW0udSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICI/Pz8iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhXX1JFRzoKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLm5lZ2F0ZSkKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIi0iKTsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLmFicykKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgInwiKTsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLmZpbGUgPT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcubnIpIHsKKyAgICAgICAgICAgIGNhc2UgQlJXX0FSRl9OVUxMOgorICAgICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAibnVsbCIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJSV19BUkZfQUREUkVTUzoKKyAgICAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgImEwLiVkIiwgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlJXX0FSRl9BQ0NVTVVMQVRPUjoKKyAgICAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgImFjYyVkIiwgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlJXX0FSRl9GTEFHOgorICAgICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiZiVkLiVkIiwgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5uciAmIDB4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJhcmYlZC4lZCIsIGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcubnIgJiAweGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJod19yZWclZCIsIGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcubnIpOworICAgICAgICAgfQorICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcuc3VibnIpCisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIrJWQiLCBpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLnN1Ym5yKTsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLmFicykKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgInwiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIj8/PyIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaW5zdC0+c3JjW2ldLmFicykKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgInwiKTsKKworICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IElNTSkgeworICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiOiVzIiwgYnJ3X3JlZ190eXBlX2xldHRlcnMoaW5zdC0+c3JjW2ldLnR5cGUpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCAyICYmIGluc3QtPnNyY1tpICsgMV0uZmlsZSAhPSBCQURfRklMRSkKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiwgIik7CisgICB9CisKKyAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiAiKTsKKworICAgaWYgKGluc3QtPmZvcmNlX3VuY29tcHJlc3NlZCkKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIjFzdGhhbGYgIik7CisKKyAgIGlmIChpbnN0LT5mb3JjZV9zZWNoYWxmKQorICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiMm5kaGFsZiAiKTsKK30KKworCisvKioKKyAqIFBvc3NpYmx5IHJldHVybnMgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBzZXQgdXAgQHBhcmFtIHJlZy4KKyAqCisgKiBTb21ldGltZXMgd2Ugd2FudCB0byB0YWtlIHRoZSByZXN1bHQgb2Ygc29tZSBleHByZXNzaW9uL3ZhcmlhYmxlCisgKiBkZXJlZmVyZW5jZSB0cmVlIGFuZCByZXdyaXRlIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0aW5nIHRoZSByZXN1bHQKKyAqIG9mIHRoZSB0cmVlLiAgV2hlbiBwcm9jZXNzaW5nIHRoZSB0cmVlLCB3ZSBrbm93IHRoYXQgdGhlCisgKiBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIGFyZSBhbGwgd3JpdGluZyB0ZW1wb3JhcmllcyB0aGF0IGFyZSBkZWFkCisgKiBvdXRzaWRlIG9mIHRoaXMgdHJlZS4gIFNvLCBpZiB3ZSBoYXZlIHNvbWUgaW5zdHJ1Y3Rpb25zIHRoYXQgd3JpdGUKKyAqIGEgdGVtcG9yYXJ5LCB3ZSdyZSBmcmVlIHRvIHBvaW50IHRoYXQgdGVtcCB3cml0ZSBzb21ld2hlcmUgZWxzZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQKKyAqIG9ubHkgcmVnIC0tIGl0IG1pZ2h0IGJlIHRoZSBzaXplPTQgZGVzdGluYXRpb24gb2YgYSB0ZXh0dXJlIGluc3RydWN0aW9uLgorICovCitmc19pbnN0ICoKK2ZzX3Zpc2l0b3I6OmdldF9pbnN0cnVjdGlvbl9nZW5lcmF0aW5nX3JlZyhmc19pbnN0ICpzdGFydCwKKwkJCQkJICAgZnNfaW5zdCAqZW5kLAorCQkJCQkgICBjb25zdCBmc19yZWcgJnJlZykKK3sKKyAgIGlmIChlbmQgPT0gc3RhcnQgfHwKKyAgICAgICBlbmQtPmlzX3BhcnRpYWxfd3JpdGUoKSB8fAorICAgICAgIHJlZy5yZWxhZGRyIHx8CisgICAgICAgIXJlZy5lcXVhbHMoZW5kLT5kc3QpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZW5kOworICAgfQorfQorCit2b2lkCitmc192aXNpdG9yOjpzZXR1cF9wYXlsb2FkX2dlbjYoKQoreworICAgYm9vbCB1c2VzX2RlcHRoID0KKyAgICAgIChmcC0+QmFzZS5JbnB1dHNSZWFkICYgKDEgPDwgVkFSWUlOR19TTE9UX1BPUykpICE9IDA7CisgICB1bnNpZ25lZCBiYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMgPSBjLT5wcm9nX2RhdGEuYmFyeWNlbnRyaWNfaW50ZXJwX21vZGVzOworCisgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNik7CisKKyAgIC8qIFIwLTE6IG1hc2tzLCBwaXhlbCBYL1kgY29vcmRpbmF0ZXMuICovCisgICBjLT5ucl9wYXlsb2FkX3JlZ3MgPSAyOworICAgLyogUjI6IG9ubHkgZm9yIDMyLXBpeGVsIGRpc3BhdGNoLiovCisKKyAgIC8qIFIzLTI2OiBiYXJ5Y2VudHJpYyBpbnRlcnBvbGF0aW9uIGNvb3JkaW5hdGVzLiAgVGhlc2UgYXBwZWFyIGluIHRoZQorICAgICogc2FtZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBicndfd21fYmFyeWNlbnRyaWNfaW50ZXJwX21vZGUKKyAgICAqIGVudW0uICBFYWNoIHNldCBvZiBjb29yZGluYXRlcyBvY2N1cGllcyAyIHJlZ2lzdGVycyBpZiBkaXNwYXRjaCB3aWR0aAorICAgICogPT0gOCBhbmQgNCByZWdpc3RlcnMgaWYgZGlzcGF0Y2ggd2lkdGggPT0gMTYuICBDb29yZGluYXRlcyBvbmx5CisgICAgKiBhcHBlYXIgaWYgdGhleSB3ZXJlIGVuYWJsZWQgdXNpbmcgdGhlICJCYXJ5Y2VudHJpYyBJbnRlcnBvbGF0aW9uCisgICAgKiBNb2RlIiBiaXRzIGluIFdNX1NUQVRFLgorICAgICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IEJSV19XTV9CQVJZQ0VOVFJJQ19JTlRFUlBfTU9ERV9DT1VOVDsgKytpKSB7CisgICAgICBpZiAoYmFyeWNlbnRyaWNfaW50ZXJwX21vZGVzICYgKDEgPDwgaSkpIHsKKyAgICAgICAgIGMtPmJhcnljZW50cmljX2Nvb3JkX3JlZ1tpXSA9IGMtPm5yX3BheWxvYWRfcmVnczsKKyAgICAgICAgIGMtPm5yX3BheWxvYWRfcmVncyArPSAyOworICAgICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICAgICAgICBjLT5ucl9wYXlsb2FkX3JlZ3MgKz0gMjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogUjI3OiBpbnRlcnBvbGF0ZWQgZGVwdGggaWYgdXNlcyBzb3VyY2UgZGVwdGggKi8KKyAgIGlmICh1c2VzX2RlcHRoKSB7CisgICAgICBjLT5zb3VyY2VfZGVwdGhfcmVnID0gYy0+bnJfcGF5bG9hZF9yZWdzOworICAgICAgYy0+bnJfcGF5bG9hZF9yZWdzKys7CisgICAgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpIHsKKyAgICAgICAgIC8qIFIyODogaW50ZXJwb2xhdGVkIGRlcHRoIGlmIG5vdCBTSU1EOC4gKi8KKyAgICAgICAgIGMtPm5yX3BheWxvYWRfcmVncysrOworICAgICAgfQorICAgfQorICAgLyogUjI5OiBpbnRlcnBvbGF0ZWQgVyBzZXQgaWYgR0VONl9XTV9VU0VTX1NPVVJDRV9XLiAqLworICAgaWYgKHVzZXNfZGVwdGgpIHsKKyAgICAgIGMtPnNvdXJjZV93X3JlZyA9IGMtPm5yX3BheWxvYWRfcmVnczsKKyAgICAgIGMtPm5yX3BheWxvYWRfcmVncysrOworICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICAgICAvKiBSMzA6IGludGVycG9sYXRlZCBXIGlmIG5vdCBTSU1EOC4gKi8KKyAgICAgICAgIGMtPm5yX3BheWxvYWRfcmVncysrOworICAgICAgfQorICAgfQorCisgICBjLT5wcm9nX2RhdGEudXNlc19wb3Nfb2Zmc2V0ID0gYy0+a2V5LmNvbXB1dGVfcG9zX29mZnNldDsKKyAgIC8qIFIzMTogTVNBQSBwb3NpdGlvbiBvZmZzZXRzLiAqLworICAgaWYgKGMtPnByb2dfZGF0YS51c2VzX3Bvc19vZmZzZXQpIHsKKyAgICAgIGMtPnNhbXBsZV9wb3NfcmVnID0gYy0+bnJfcGF5bG9hZF9yZWdzOworICAgICAgYy0+bnJfcGF5bG9hZF9yZWdzKys7CisgICB9CisKKyAgIC8qIFIzMjogTVNBQSBpbnB1dCBjb3ZlcmFnZSBtYXNrICovCisgICBpZiAoZnAtPkJhc2UuU3lzdGVtVmFsdWVzUmVhZCAmIFNZU1RFTV9CSVRfU0FNUExFX01BU0tfSU4pIHsKKyAgICAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgICAgIGMtPnNhbXBsZV9tYXNrX3JlZyA9IGMtPm5yX3BheWxvYWRfcmVnczsKKyAgICAgIGMtPm5yX3BheWxvYWRfcmVncysrOworICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICAgICAvKiBSMzM6IGlucHV0IGNvdmVyYWdlIG1hc2sgaWYgbm90IFNJTUQ4LiAqLworICAgICAgICAgYy0+bnJfcGF5bG9hZF9yZWdzKys7CisgICAgICB9CisgICB9CisKKyAgIC8qIFIzNC06IGJhcnkgZm9yIDMyLXBpeGVsLiAqLworICAgLyogUjU4LTU5OiBpbnRlcnAgVyBmb3IgMzItcGl4ZWwuICovCisKKyAgIGlmIChmcC0+QmFzZS5PdXRwdXRzV3JpdHRlbiAmIEJJVEZJRUxENjRfQklUKEZSQUdfUkVTVUxUX0RFUFRIKSkgeworICAgICAgYy0+c291cmNlX2RlcHRoX3RvX3JlbmRlcl90YXJnZXQgPSB0cnVlOworICAgfQorfQorCit2b2lkCitmc192aXNpdG9yOjphc3NpZ25fYmluZGluZ190YWJsZV9vZmZzZXRzKCkKK3sKKyAgIHVpbnQzMl90IG5leHRfYmluZGluZ190YWJsZV9vZmZzZXQgPSAwOworCisgICAvKiBJZiB0aGVyZSBhcmUgbm8gY29sb3IgcmVnaW9ucywgd2Ugc3RpbGwgcGVyZm9ybSBhbiBGQiB3cml0ZSB0byBhIG51bGwKKyAgICAqIHJlbmRlcmJ1ZmZlciwgd2hpY2ggd2UgcGxhY2UgYXQgc3VyZmFjZSBpbmRleCAwLgorICAgICovCisgICBjLT5wcm9nX2RhdGEuYmluZGluZ190YWJsZS5yZW5kZXJfdGFyZ2V0X3N0YXJ0ID0gbmV4dF9iaW5kaW5nX3RhYmxlX29mZnNldDsKKyAgIG5leHRfYmluZGluZ190YWJsZV9vZmZzZXQgKz0gTUFYMihjLT5rZXkubnJfY29sb3JfcmVnaW9ucywgMSk7CisKKyAgIGFzc2lnbl9jb21tb25fYmluZGluZ190YWJsZV9vZmZzZXRzKG5leHRfYmluZGluZ190YWJsZV9vZmZzZXQpOworfQorCitpbnQKK2ZzX3Zpc2l0b3I6OmNhbGN1bGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZShpbnQgZXh0cmEpCit7CisgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisgICBjYWxjdWxhdGVfbGl2ZV9pbnRlcnZhbHMoZXh0cmEpOworCisgICBpbnQgbnVtX2luc3RydWN0aW9ucyA9IDA7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgKytudW1faW5zdHJ1Y3Rpb25zOworICAgfQorCisgICByZWdzX2xpdmVfYXRfaXAgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgbnVtX2luc3RydWN0aW9ucyk7CisKKyAgIGludCBwcmVzc3VyZSA9IDA7CisKKyAgIGZvciAoaW50IHJlZyA9IDA7IHJlZyA8IHZpcnR1YWxfZ3JmX2NvdW50OyByZWcrKykgeworICAgICAgZm9yIChpbnQgaXAgPSB2aXJ0dWFsX2dyZl9zdGFydFtyZWddOyBpcCA8PSB2aXJ0dWFsX2dyZl9lbmRbcmVnXTsgaXArKykgeworICAgICAgICAgcmVnc19saXZlX2F0X2lwW2lwXSArPSB2aXJ0dWFsX2dyZl9zaXplc1tyZWddOworICAgICAgICAgcHJlc3N1cmUgPSBNQVgyKHByZXNzdXJlLCByZWdzX2xpdmVfYXRfaXBbaXBdKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHByZXNzdXJlOworfQorCisvKioKKyAqIExvb2sgZm9yIHJlcGVhdGVkIEZTX09QQ09ERV9NT1ZfRElTUEFUQ0hfVE9fRkxBR1MgYW5kIGRyb3AgdGhlIGxhdGVyIG9uZXMuCisgKgorICogVGhlIG5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgZW5kcyB1cCBwcm9kdWNpbmcgb25lIG9mIHRoZXNlIHBlcgorICogY2hhbm5lbCBvZiBjZW50cm9pZCBpbnB1dCwgc28gaXQncyBnb29kIHRvIGNsZWFuIHRoZW0gdXAuCisgKgorICogQW4gYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgbm90aGluZyBldmVyIG1vZGlmaWVzIHRoZSBkaXNwYXRjaGVkIHBpeGVscworICogdmFsdWUgdGhhdCBGU19PUENPREVfTU9WX0RJU1BBVENIX1RPX0ZMQUdTIHJlYWRzIGZyb20sIGJ1dCB0aGUgaGFyZHdhcmUKKyAqIGRpY3RhdGVzIHRoYXQgYW55d2F5LgorICovCit2b2lkCitmc192aXNpdG9yOjpvcHRfZHJvcF9yZWR1bmRhbnRfbW92X3RvX2ZsYWdzKCkKK3sKKyAgIGJvb2wgZmxhZ19tb3ZfZm91bmRbMl0gPSB7ZmFsc2V9OworCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworCisgICAgICBpZiAoaW5zdC0+aXNfY29udHJvbF9mbG93KCkpIHsKKyAgICAgICAgIG1lbXNldChmbGFnX21vdl9mb3VuZCwgMCwgc2l6ZW9mKGZsYWdfbW92X2ZvdW5kKSk7CisgICAgICB9IGVsc2UgaWYgKGluc3QtPm9wY29kZSA9PSBGU19PUENPREVfTU9WX0RJU1BBVENIX1RPX0ZMQUdTKSB7CisgICAgICAgICBpZiAoIWZsYWdfbW92X2ZvdW5kW2luc3QtPmZsYWdfc3VicmVnXSkKKyAgICAgICAgICAgIGZsYWdfbW92X2ZvdW5kW2luc3QtPmZsYWdfc3VicmVnXSA9IHRydWU7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnN0LT5yZW1vdmUoKTsKKyAgICAgIH0gZWxzZSBpZiAoaW5zdC0+d3JpdGVzX2ZsYWcoKSkgeworICAgICAgICAgZmxhZ19tb3ZfZm91bmRbaW5zdC0+ZmxhZ19zdWJyZWddID0gZmFsc2U7CisgICAgICB9CisgICB9Cit9CisKK2Jvb2wKK2ZzX3Zpc2l0b3I6OnJ1bigpCit7CisgICBzYW5pdHlfcGFyYW1fY291bnQgPSBmcC0+QmFzZS5QYXJhbWV0ZXJzLT5OdW1QYXJhbWV0ZXJzOworICAgYm9vbCBhbGxvY2F0ZWRfd2l0aG91dF9zcGlsbHM7CisKKyAgIGFzc2lnbl9iaW5kaW5nX3RhYmxlX29mZnNldHMoKTsKKworLy8gICBpZiAoYnJ3LT5nZW4gPj0gNikKKyAgICAgIGFzc2VydChicnctPmdlbiA+PSA2KTsKKyAgICAgIHNldHVwX3BheWxvYWRfZ2VuNigpOworLy8gICBlbHNlCisvLyAgICAgIHNldHVwX3BheWxvYWRfZ2VuNCgpOworCisgICBpZiAoMCkgeworICAgICAgZW1pdF9kdW1teV9mcygpOworICAgfSBlbHNlIHsKKy8vICAgICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU0hBREVSX1RJTUUpCisvLyAgICAgICAgIGVtaXRfc2hhZGVyX3RpbWVfYmVnaW4oKTsKKworCisgICAgICAgY2FsY3VsYXRlX3VyYl9zZXR1cCgpOworICAgICAgaWYgKGZwLT5CYXNlLklucHV0c1JlYWQgPiAwKSB7CisgICAgICAgICBpZiAoYnJ3LT5nZW4gPCA2KQorICAgICAgICAgICAgZW1pdF9pbnRlcnBvbGF0aW9uX3NldHVwX2dlbjQoKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVtaXRfaW50ZXJwb2xhdGlvbl9zZXR1cF9nZW42KCk7CisgICAgICB9CisKKyAgICAgIC8qIFdlIGhhbmRsZSBkaXNjYXJkcyBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzdGlsbC1saXZlIHBpeGVscyBpbiBmMC4xLgorICAgICAgICogSW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBkaXNwYXRjaGVkIHBpeGVscy4KKyAgICAgICAqLworICAgICAgaWYgKGZwLT5Vc2VzS2lsbCB8fCBjLT5rZXkuYWxwaGFfdGVzdF9mdW5jKSB7CisgICAgICAgICBmc19pbnN0ICpkaXNjYXJkX2luaXQgPSBlbWl0KEZTX09QQ09ERV9NT1ZfRElTUEFUQ0hfVE9fRkxBR1MpOworICAgICAgICAgZGlzY2FyZF9pbml0LT5mbGFnX3N1YnJlZyA9IDE7CisgICAgICB9CisKKyAgICAgIC8qIEdlbmVyYXRlIEZTIElSIGZvciBtYWluKCkuICAodGhlIHZpc2l0b3Igb25seSBkZXNjZW5kcyBpbnRvCisgICAgICAgKiBmdW5jdGlvbnMgY2FsbGVkICJtYWluIikuCisgICAgICAgKi8KKy8vICAgICAgaWYgKHNoYWRlcikgeworICAgICAgICAgYXNzZXJ0KHNoYWRlcik7CisgICAgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgJipzaGFkZXItPmJhc2UuaXIpIHsKKyAgICAgICAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKW5vZGU7CisgICAgICAgICAgICBiYXNlX2lyID0gaXI7CisgICAgICAgICAgICB0aGlzLT5yZXN1bHQgPSByZWdfdW5kZWY7CisgICAgICAgICAgICBpci0+YWNjZXB0KHRoaXMpOworICAgICAgICAgfQorLy8gICAgICB9IGVsc2UgeworLy8gICAgICAgICBlbWl0X2ZyYWdtZW50X3Byb2dyYW1fY29kZSgpOworLy8gICAgICB9CisgICAgICBiYXNlX2lyID0gTlVMTDsKKyAgICAgIGlmIChmYWlsZWQpCisJIHJldHVybiBmYWxzZTsKKworICAgICAgZW1pdChGU19PUENPREVfUExBQ0VIT0xERVJfSEFMVCk7CisKKyAgICAgIGlmIChjLT5rZXkuYWxwaGFfdGVzdF9mdW5jKQorICAgICAgICAgZW1pdF9hbHBoYV90ZXN0KCk7CisKKyAgICAgIGVtaXRfZmJfd3JpdGVzKCk7CisKKyAgICAgIHNwbGl0X3ZpcnR1YWxfZ3JmcygpOworCisgICAgICBtb3ZlX3VuaWZvcm1fYXJyYXlfYWNjZXNzX3RvX3B1bGxfY29uc3RhbnRzKCk7CisgICAgICBhc3NpZ25fY29uc3RhbnRfbG9jYXRpb25zKCk7CisgICAgICBkZW1vdGVfcHVsbF9jb25zdGFudHMoKTsKKworICAgICAgb3B0X2Ryb3BfcmVkdW5kYW50X21vdl90b19mbGFncygpOworCisgICAgICBib29sIHByb2dyZXNzOworICAgICAgZG8geworCSBwcm9ncmVzcyA9IGZhbHNlOworCisgICAgICAgICBjb21wYWN0X3ZpcnR1YWxfZ3JmcygpOworCisJIHByb2dyZXNzID0gcmVtb3ZlX2R1cGxpY2F0ZV9tcmZfd3JpdGVzKCkgfHwgcHJvZ3Jlc3M7CisKKwkgcHJvZ3Jlc3MgPSBvcHRfYWxnZWJyYWljKCkgfHwgcHJvZ3Jlc3M7CisJIHByb2dyZXNzID0gb3B0X2NzZSgpIHx8IHByb2dyZXNzOworCSBwcm9ncmVzcyA9IG9wdF9jb3B5X3Byb3BhZ2F0ZSgpIHx8IHByb2dyZXNzOworICAgICAgICAgcHJvZ3Jlc3MgPSBvcHRfcGVlcGhvbGVfcHJlZGljYXRlZF9icmVhaygpIHx8IHByb2dyZXNzOworICAgICAgICAgcHJvZ3Jlc3MgPSBkZWFkX2NvZGVfZWxpbWluYXRlKCkgfHwgcHJvZ3Jlc3M7CisgICAgICAgICBwcm9ncmVzcyA9IG9wdF9wZWVwaG9sZV9zZWwoKSB8fCBwcm9ncmVzczsKKyAgICAgICAgIHByb2dyZXNzID0gZGVhZF9jb250cm9sX2Zsb3dfZWxpbWluYXRlKHRoaXMpIHx8IHByb2dyZXNzOworICAgICAgICAgcHJvZ3Jlc3MgPSBvcHRfc2F0dXJhdGVfcHJvcGFnYXRpb24oKSB8fCBwcm9ncmVzczsKKyAgICAgICAgIHByb2dyZXNzID0gcmVnaXN0ZXJfY29hbGVzY2UoKSB8fCBwcm9ncmVzczsKKwkgcHJvZ3Jlc3MgPSBjb21wdXRlX3RvX21yZigpIHx8IHByb2dyZXNzOworICAgICAgfSB3aGlsZSAocHJvZ3Jlc3MpOworCisgICAgICBsb3dlcl91bmlmb3JtX3B1bGxfY29uc3RhbnRfbG9hZHMoKTsKKworICAgICAgYXNzaWduX2N1cmJfc2V0dXAoKTsKKyAgICAgIGFzc2lnbl91cmJfc2V0dXAoKTsKKworICAgICAgc3RhdGljIGNvbnN0IGVudW0gaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyX21vZGUgcHJlX21vZGVzX2dsYXNzeVtdID0geworICAgICAgICAgU0NIRURVTEVfUFJFX0lQU19CVV9ISSwKKyAgICAgICAgIFNDSEVEVUxFX1BSRV9JUFNfQlVfTUgsCisgICAgICAgICBTQ0hFRFVMRV9QUkVfSVBTX0JVX01ELAorICAgICAgICAgU0NIRURVTEVfUFJFX0lQU19CVV9NTCwKKyAgICAgICAgIFNDSEVEVUxFX1BSRV9JUFNfQlVfTE8sCisgICAgICB9OworCisgICAgICB1bnNpZ25lZCBwcmVfbW9kZV9jb3VudCA9IDA7CisgICAgICBjb25zdCBlbnVtIGluc3RydWN0aW9uX3NjaGVkdWxlcl9tb2RlKiBwcmVfbW9kZXMgPSAwOworICAgICAgCisgICAgICBwcmVfbW9kZXMgPSBwcmVfbW9kZXNfZ2xhc3N5OworICAgICAgcHJlX21vZGVfY291bnQgPSBBUlJBWV9TSVpFKHByZV9tb2Rlc19nbGFzc3kpOworCisgICAgICAvKiBUcnkgZWFjaCBzY2hlZHVsaW5nIGhldXJpc3RpYyB0byBzZWUgaWYgaXQgY2FuIHN1Y2Nlc3NmdWxseSByZWdpc3RlcgorICAgICAgICogYWxsb2NhdGUgd2l0aG91dCBzcGlsbGluZy4gIFRoZXkgc2hvdWxkIGJlIG9yZGVyZWQgYnkgZGVjcmVhc2luZworICAgICAgICogcGVyZm9ybWFuY2UgYnV0IGluY3JlYXNpbmcgbGlrZWxpaG9vZCBvZiBhbGxvY2F0aW5nLgorICAgICAgICovCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJlX21vZGVfY291bnQ7IGkrKykgeworICAgICAgICAgZXN0aW1hdGVkX2Nsb2NrcyA9IHNjaGVkdWxlX2luc3RydWN0aW9ucyhwcmVfbW9kZXNbaV0pOworCisgICAgICAgICBpZiAoMCkgeworICAgICAgICAgICAgYXNzaWduX3JlZ3NfdHJpdmlhbCgpOworICAgICAgICAgICAgYWxsb2NhdGVkX3dpdGhvdXRfc3BpbGxzID0gdHJ1ZTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbGxvY2F0ZWRfd2l0aG91dF9zcGlsbHMgPSBhc3NpZ25fcmVncyhmYWxzZSk7CisgICAgICAgICB9CisgICAgICAgICBpZiAoYWxsb2NhdGVkX3dpdGhvdXRfc3BpbGxzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghYWxsb2NhdGVkX3dpdGhvdXRfc3BpbGxzKSB7CisgICAgICAgICAvKiBXZSBhc3N1bWUgdGhhdCBhbnkgc3BpbGxpbmcgaXMgd29yc2UgdGhhbiBqdXN0IGRyb3BwaW5nIGJhY2sgdG8KKyAgICAgICAgICAqIFNJTUQ4LiAgVGhlcmUncyBwcm9iYWJseSBhY3R1YWxseSBzb21lIGludGVybWVkaWF0ZSBwb2ludCB3aGVyZQorICAgICAgICAgICogU0lNRDE2IHdpdGggYSBjb3VwbGUgb2Ygc3BpbGxzIGlzIHN0aWxsIGJldHRlci4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsdXJlIHRvIHJlZ2lzdGVyIGFsbG9jYXRlLiAgUmVkdWNlIG51bWJlciBvZiAiCisgICAgICAgICAgICAgICAgICJsaXZlIHNjYWxhciB2YWx1ZXMgdG8gYXZvaWQgdGhpcy4iKTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogU2luY2Ugd2UncmUgb3V0IG9mIGhldXJpc3RpY3MsIGp1c3QgZ28gc3BpbGwgcmVnaXN0ZXJzIHVudGlsIHdlCisgICAgICAgICAgKiBnZXQgYW4gYWxsb2NhdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICAgd2hpbGUgKCFhc3NpZ25fcmVncyh0cnVlKSkgeworICAgICAgICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgYXNzZXJ0KGZvcmNlX3VuY29tcHJlc3NlZF9zdGFjayA9PSAwKTsKKworICAgLyogVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgYWxsIG9wdGltaXphdGlvbiBhbmQgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgc2luY2UKKyAgICAqIGl0IGluc2VydHMgZGVhZCBjb2RlIHRoYXQgaGFwcGVucyB0byBoYXZlIHNpZGUgZWZmZWN0cywgYW5kIGl0IGRvZXMKKyAgICAqIHNvIGJhc2VkIG9uIHRoZSBhY3R1YWwgcGh5c2ljYWwgcmVnaXN0ZXJzIGluIHVzZS4KKyAgICAqLworICAgaW5zZXJ0X2dlbjRfc2VuZF9kZXBlbmRlbmN5X3dvcmthcm91bmRzKCk7CisKKyAgIGlmIChmYWlsZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICghYWxsb2NhdGVkX3dpdGhvdXRfc3BpbGxzKQorICAgICAgc2NoZWR1bGVfaW5zdHJ1Y3Rpb25zKFNDSEVEVUxFX1BPU1QpOworCisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gOCkKKyAgICAgIGMtPnByb2dfZGF0YS5yZWdfYmxvY2tzID0gYnJ3X3JlZ2lzdGVyX2Jsb2NrcyhncmZfdXNlZCk7CisgICBlbHNlCisgICAgICBjLT5wcm9nX2RhdGEucmVnX2Jsb2Nrc18xNiA9IGJyd19yZWdpc3Rlcl9ibG9ja3MoZ3JmX3VzZWQpOworCisgICAvKiBJZiBhbnkgc3RhdGUgcGFyYW1ldGVycyB3ZXJlIGFwcGVuZGVkLCB0aGVuIFBhcmFtZXRlclZhbHVlcyBjb3VsZCBoYXZlCisgICAgKiBiZWVuIHJlYWxsb2NlZCwgaW4gd2hpY2ggY2FzZSB0aGUgZHJpdmVyIHVuaWZvcm0gc3RvcmFnZSBzZXQgdXAgYnkKKyAgICAqIF9tZXNhX2Fzc29jaWF0ZV91bmlmb3JtX3N0b3JhZ2UoKSB3b3VsZCBwb2ludCB0byBmcmVlZCBtZW1vcnkuICBNYWtlCisgICAgKiBzdXJlIHRoYXQgZGlkbid0IGhhcHBlbi4KKyAgICAqLworICAgYXNzZXJ0KHNhbml0eV9wYXJhbV9jb3VudCA9PSBmcC0+QmFzZS5QYXJhbWV0ZXJzLT5OdW1QYXJhbWV0ZXJzKTsKKworICAgcmV0dXJuICFmYWlsZWQ7Cit9CisKK2NvbnN0IHVuc2lnbmVkICoKK2Jyd193bV9mc19lbWl0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMsCisgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCisgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICB1bnNpZ25lZCAqZmluYWxfYXNzZW1ibHlfc2l6ZSkKK3sKKy8vICAgYm9vbCBzdGFydF9idXN5ID0gZmFsc2U7CisvLyAgIGRvdWJsZSBzdGFydF90aW1lID0gMDsKKworLy8gICBpZiAodW5saWtlbHkoYnJ3LT5wZXJmX2RlYnVnKSkgeworLy8gICAgICBzdGFydF9idXN5ID0gKGJydy0+YmF0Y2gubGFzdF9ibyAmJgorLy8gICAgICAgICAgICAgICAgICAgIGRybV9pbnRlbF9ib19idXN5KGJydy0+YmF0Y2gubGFzdF9ibykpOworLy8gICAgICBzdGFydF90aW1lID0gZ2V0X3RpbWUoKTsKKy8vICAgfQorCisgICBzdHJ1Y3QgYnJ3X3NoYWRlciAqc2hhZGVyID0gTlVMTDsKKyAgIGlmIChwcm9nKQorICAgICAgc2hhZGVyID0gKGJyd19zaGFkZXIgKikgcHJvZy0+X0xpbmtlZFNoYWRlcnNbTUVTQV9TSEFERVJfRlJBR01FTlRdOworCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19XTSkpCisgICAgICBicndfZHVtcF9pcihicncsICJmcmFnbWVudCIsIHByb2csICZzaGFkZXItPmJhc2UsICZmcC0+QmFzZSk7CisKKyAgIC8qIE5vdyB0aGUgbWFpbiBldmVudDogVmlzaXQgdGhlIHNoYWRlciBJUiBhbmQgZ2VuZXJhdGUgb3VyIEZTIElSIGZvciBpdC4KKyAgICAqLworICAgZnNfdmlzaXRvciB2KGJydywgYywgcHJvZywgZnAsIDgpOworICAgaWYgKCF2LnJ1bigpKSB7CisgICAgICBpZiAocHJvZykgeworICAgICAgICAgcHJvZy0+TGlua1N0YXR1cyA9IGZhbHNlOworICAgICAgICAgcmFsbG9jX3N0cmNhdCgmcHJvZy0+SW5mb0xvZywgdi5mYWlsX21zZyk7CisgICAgICB9CisKKyAgICAgIF9tZXNhX3Byb2JsZW0oTlVMTCwgIkZhaWxlZCB0byBjb21waWxlIGZyYWdtZW50IHNoYWRlcjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHYuZmFpbF9tc2cpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgZXhlY19saXN0ICpzaW1kMTZfaW5zdHJ1Y3Rpb25zID0gTlVMTDsKKyAgIGZzX3Zpc2l0b3IgdjIoYnJ3LCBjLCBwcm9nLCBmcCwgMTYpOworICAgaWYgKGJydy0+Z2VuID49IDUgJiYgbGlrZWx5KCEoSU5URUxfREVCVUcgJiBERUJVR19OTzE2KSkpIHsKKyAgICAgIGlmICghdi5zaW1kMTZfdW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgIC8qIFRyeSBhIFNJTUQxNiBjb21waWxlICovCisgICAgICAgICB2Mi5pbXBvcnRfdW5pZm9ybXMoJnYpOworICAgICAgICAgaWYgKCF2Mi5ydW4oKSkgeworICAgICAgICAgICAgcGVyZl9kZWJ1ZygiU0lNRDE2IHNoYWRlciBmYWlsZWQgdG8gY29tcGlsZSwgZmFsbGluZyBiYWNrIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlNJTUQ4IGF0IGEgMTAtMjAlJSBwZXJmb3JtYW5jZSBjb3N0OiAlcyIsIHYyLmZhaWxfbXNnKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2Ugc2ltZDE2IHVubGVzcyBpdCBsb29rcyBzb21lIHJhdGlvIHdvcnNlIHRoYW4gc2ltZDgKKyAgICAgICAgICAgIGlmICgodjIuZXN0aW1hdGVkX2Nsb2NrcyAqIDcgLyA4KSA8IHYuZXN0aW1hdGVkX2Nsb2NrcykKKyAgICAgICAgICAgICAgIHNpbWQxNl9pbnN0cnVjdGlvbnMgPSAmdjIuaW5zdHJ1Y3Rpb25zOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHBlcmZfZGVidWcoIlNJTUQxNiBzaGFkZXIgdW5zdXBwb3J0ZWQsIGZhbGxpbmcgYmFjayB0byAiCisgICAgICAgICAgICAgICAgICAgICJTSU1EOCBhdCBhIDEwLTIwJSUgcGVyZm9ybWFuY2UgY29zdDogJXMiLCB2Lm5vMTZfbXNnKTsKKyAgICAgIH0KKyAgIH0KKworICAgY29uc3QgdW5zaWduZWQgKmFzc2VtYmx5ID0gTlVMTDsKKyAgIC8vIEx1bmFyRyA6IFRPRE8gLSBHZW44IHN1cHBvcnQKKy8vICAgaWYgKGJydy0+Z2VuID49IDgpIHsKKy8vICAgICAgZ2VuOF9mc19nZW5lcmF0b3IgZyhicncsIGMsIHByb2csIGZwLCB2LmRvX2R1YWxfc3JjKTsKKy8vICAgICAgYXNzZW1ibHkgPSBnLmdlbmVyYXRlX2Fzc2VtYmx5KCZ2Lmluc3RydWN0aW9ucywgc2ltZDE2X2luc3RydWN0aW9ucywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2Fzc2VtYmx5X3NpemUpOworLy8gICB9IGVsc2UgeworICAgICAgZnNfZ2VuZXJhdG9yIGcoYnJ3LCBjLCBwcm9nLCBmcCwgdi5kb19kdWFsX3NyYyk7CisgICAgICBhc3NlbWJseSA9IGcuZ2VuZXJhdGVfYXNzZW1ibHkoJnYuaW5zdHJ1Y3Rpb25zLCBzaW1kMTZfaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2Fzc2VtYmx5X3NpemUpOworLy8gICB9CisKKy8vICAgaWYgKHVubGlrZWx5KGJydy0+cGVyZl9kZWJ1ZykgJiYgc2hhZGVyKSB7CisvLyAgICAgIGlmIChzaGFkZXItPmNvbXBpbGVkX29uY2UpCisvLyAgICAgICAgIGJyd193bV9kZWJ1Z19yZWNvbXBpbGUoYnJ3LCBwcm9nLCAmYy0+a2V5KTsKKy8vICAgICAgc2hhZGVyLT5jb21waWxlZF9vbmNlID0gdHJ1ZTsKKworLy8gICAgICBpZiAoc3RhcnRfYnVzeSAmJiAhZHJtX2ludGVsX2JvX2J1c3koYnJ3LT5iYXRjaC5sYXN0X2JvKSkgeworLy8gICAgICAgICBwZXJmX2RlYnVnKCJGUyBjb21waWxlIHRvb2sgJS4wM2YgbXMgYW5kIHN0YWxsZWQgdGhlIEdQVVxuIiwKKy8vICAgICAgICAgICAgICAgICAgICAoZ2V0X3RpbWUoKSAtIHN0YXJ0X3RpbWUpICogMTAwMCk7CisvLyAgICAgIH0KKy8vICAgfQorCisgICByZXR1cm4gYXNzZW1ibHk7Cit9CisKK2Jvb2wKK2Jyd19mc19wcmVjb21waWxlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKKyAgIGNvbnN0IHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW1fcHJlY29tcGlsZV9rZXkgKnByZV9rZXkgPQorICAgICAgYnJ3X3NoYWRlcl9wcm9ncmFtX2dldF9wcmVjb21waWxlX2tleShwcm9nKTsKKyAgIHN0cnVjdCBicndfd21fcHJvZ19rZXkga2V5OworCisgICBpZiAoIXByb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0ZSQUdNRU5UXSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSAoc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKikKKyAgICAgIHByb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0ZSQUdNRU5UXS0+UHJvZ3JhbTsKKyAgIHN0cnVjdCBicndfZnJhZ21lbnRfcHJvZ3JhbSAqYmZwID0gYnJ3X2ZyYWdtZW50X3Byb2dyYW0oZnApOworICAgYm9vbCBwcm9ncmFtX3VzZXNfZGZkeSA9IGZwLT5Vc2VzREZkeTsKKworICAgbWVtc2V0KCZrZXksIDAsIHNpemVvZihrZXkpKTsKKworICAgaWYgKGJydy0+Z2VuIDwgNikgeworICAgICAgaWYgKGZwLT5Vc2VzS2lsbCkKKyAgICAgICAgIGtleS5pel9sb29rdXAgfD0gSVpfUFNfS0lMTF9BTFBIQVRFU1RfQklUOworCisgICAgICBpZiAoZnAtPkJhc2UuT3V0cHV0c1dyaXR0ZW4gJiBCSVRGSUVMRDY0X0JJVChGUkFHX1JFU1VMVF9ERVBUSCkpCisgICAgICAgICBrZXkuaXpfbG9va3VwIHw9IElaX1BTX0NPTVBVVEVTX0RFUFRIX0JJVDsKKworICAgICAgLyogSnVzdCBhc3N1bWUgZGVwdGggdGVzdGluZy4gKi8KKyAgICAgIGtleS5pel9sb29rdXAgfD0gSVpfREVQVEhfVEVTVF9FTkFCTEVfQklUOworICAgICAga2V5Lml6X2xvb2t1cCB8PSBJWl9ERVBUSF9XUklURV9FTkFCTEVfQklUOworICAgfQorCisgICBpZiAoYnJ3LT5nZW4gPCA2IHx8IF9tZXNhX2JpdGNvdW50XzY0KGZwLT5CYXNlLklucHV0c1JlYWQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfRlNfVkFSWUlOR19JTlBVVF9NQVNLKSA+IDE2KQorICAgICAga2V5LmlucHV0X3Nsb3RzX3ZhbGlkID0gZnAtPkJhc2UuSW5wdXRzUmVhZCB8IFZBUllJTkdfQklUX1BPUzsKKworICAga2V5LmNsYW1wX2ZyYWdtZW50X2NvbG9yID0gY3R4LT5BUEkgPT0gQVBJX09QRU5HTF9DT01QQVQ7CisKKyAgIHVuc2lnbmVkIHNhbXBsZXJfY291bnQgPSBfbWVzYV9mbHMoZnAtPkJhc2UuU2FtcGxlcnNVc2VkKTsKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzYW1wbGVyX2NvdW50OyBpKyspIHsKKyAgICAgIGlmIChmcC0+QmFzZS5TaGFkb3dTYW1wbGVycyAmICgxIDw8IGkpKSB7CisgICAgICAgICAvKiBBc3N1bWUgREVQVEhfVEVYVFVSRV9NT0RFIGlzIHRoZSBkZWZhdWx0OiBYLCBYLCBYLCAxICovCisgICAgICAgICBrZXkudGV4LnN3aXp6bGVzW2ldID0KKyAgICAgICAgICAgIE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9PTkUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIENvbG9yIHNhbXBsZXI6IGFzc3VtZSBubyBzd2l6emxpbmcuICovCisgICAgICAgICBrZXkudGV4LnN3aXp6bGVzW2ldID0gU1dJWlpMRV9YWVpXOworICAgICAgfQorICAgfQorCisgICBpZiAoZnAtPkJhc2UuSW5wdXRzUmVhZCAmIFZBUllJTkdfQklUX1BPUykgeworICAgICAga2V5LmRyYXdhYmxlX2hlaWdodCA9IHByZV9rZXktPmZib19oZWlnaHQ7CisgICB9CisKKyAgIGtleS5ucl9jb2xvcl9yZWdpb25zID0gX21lc2FfYml0Y291bnRfNjQoZnAtPkJhc2UuT3V0cHV0c1dyaXR0ZW4gJgorICAgICAgICAgfihCSVRGSUVMRDY0X0JJVChGUkFHX1JFU1VMVF9ERVBUSCkgfAorICAgICAgICAgQklURklFTEQ2NF9CSVQoRlJBR19SRVNVTFRfU0FNUExFX01BU0spKSk7CisKKyAgIGlmICgoZnAtPkJhc2UuSW5wdXRzUmVhZCAmIFZBUllJTkdfQklUX1BPUykgfHwgcHJvZ3JhbV91c2VzX2RmZHkpIHsKKyAgICAgIGtleS5yZW5kZXJfdG9fZmJvID0gcHJlX2tleS0+aXNfdXNlcl9mYm8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Lm5yX2NvbG9yX3JlZ2lvbnMgPiAxOworICAgfQorCisgICAvKiBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UIGlzIGFsbW9zdCBhbHdheXMgR0xfRE9OVF9DQVJFLiAgVGhlCisgICAgKiBxdWFsaXR5IG9mIHRoZSBkZXJpdmF0aXZlcyBpcyBsaWtlbHkgdG8gYmUgZGV0ZXJtaW5lZCBieSB0aGUgZHJpY29uZgorICAgICogb3B0aW9uLgorICAgICovCisgICBrZXkuaGlnaF9xdWFsaXR5X2Rlcml2YXRpdmVzID0gYnJ3LT5kaXNhYmxlX2Rlcml2YXRpdmVfb3B0aW1pemF0aW9uOworCisgICBrZXkucHJvZ3JhbV9zdHJpbmdfaWQgPSBiZnAtPmlkOworCisgICBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmM7CisKKyAgIGMgPSBicndfd21faW5pdF9jb21waWxlKGJydywgcHJvZywgYmZwLCAma2V5KTsKKyAgIGlmICghYykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKCFicndfd21fZG9fY29tcGlsZShicncsIGMpKSB7CisgICAgICBicndfd21fY2xlYXJfY29tcGlsZShicncsIGMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICAvLyBSYXRoZXIgdGhhbiBkZWZlciBvciB1cGxvYWQgdG8gY2FjaGUsIGhhbmQgb2ZmCisgICAvLyB0aGUgY29tcGlsZSByZXN1bHRzIGJhY2sgdG8gdGhlIGJyd19jb250ZXh0CisgICBicndfc2hhZGVyX3Byb2dyYW1fc2F2ZV93bV9jb21waWxlKGJydy0+c2hhZGVyX3Byb2csIGMpOworCisgICAvLyBwb3B1bGF0ZSBzb21lIG90aGVyIGZpZWxkcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGhhcHBlbiBhdCBkcmF3IHRpbWUKKyAgIGJydy0+d20uYmFzZS5zYW1wbGVyX2NvdW50ID0gX21lc2FfZmxzKGZwLT5CYXNlLlNhbXBsZXJzVXNlZCk7CisgICAvLyBPdGhlcnM/ICAuLi4KKworICAgYnJ3X3dtX2NsZWFyX2NvbXBpbGUoYnJ3LCBjKTsKKworICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1NDU4OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnMuaApAQCAtMCwwICsxLDc5NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImJyd19zaGFkZXIuaCIKKworZXh0ZXJuICJDIiB7CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAibWFpbi9zaGFkZXJvYmouaCIKKyNpbmNsdWRlICJtYWluL3VuaWZvcm1zLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3BhcmFtZXRlci5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wcmludC5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19vcHRpbWl6ZS5oIgorI2luY2x1ZGUgInByb2dyYW0vcmVnaXN0ZXJfYWxsb2NhdGUuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3NhbXBsZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd19ldS5oIgorI2luY2x1ZGUgImJyd193bS5oIgorI2luY2x1ZGUgImJyd19zaGFkZXIuaCIKK30KKyNpbmNsdWRlICJnZW44X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgImdsc2wvZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImdsc2wvaXIuaCIKKworI2RlZmluZSBNQVhfU0FNUExFUl9NRVNTQUdFX1NJWkUgMTEKKworY2xhc3MgYmJsb2NrX3Q7CituYW1lc3BhY2UgeworICAgc3RydWN0IGFjcF9lbnRyeTsKK30KKworbmFtZXNwYWNlIGJydyB7CisgICBjbGFzcyBmc19saXZlX3ZhcmlhYmxlczsKK30KKworY2xhc3MgaWdyYXBoX3Q7CisKK2NsYXNzIGZzX3JlZyB7CitwdWJsaWM6CisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKGZzX3JlZykKKworICAgdm9pZCBpbml0KCk7CisKKyAgIGZzX3JlZygpOworICAgZnNfcmVnKGZsb2F0IGYpOworICAgZnNfcmVnKGludDMyX3QgaSk7CisgICBmc19yZWcodWludDMyX3QgdSk7CisgICBmc19yZWcoc3RydWN0IGJyd19yZWcgZml4ZWRfaHdfcmVnKTsKKyAgIGZzX3JlZyhlbnVtIHJlZ2lzdGVyX2ZpbGUgZmlsZSwgaW50IHJlZyk7CisgICBmc19yZWcoZW51bSByZWdpc3Rlcl9maWxlIGZpbGUsIGludCByZWcsIHVpbnQzMl90IHR5cGUpOworICAgZnNfcmVnKGNsYXNzIGZzX3Zpc2l0b3IgKnYsIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUpOworCisgICBib29sIGVxdWFscyhjb25zdCBmc19yZWcgJnIpIGNvbnN0OworICAgYm9vbCBpc196ZXJvKCkgY29uc3Q7CisgICBib29sIGlzX29uZSgpIGNvbnN0OworICAgYm9vbCBpc19udWxsKCkgY29uc3Q7CisgICBib29sIGlzX3ZhbGlkXzNzcmMoKSBjb25zdDsKKyAgIGJvb2wgaXNfY29udGlndW91cygpIGNvbnN0OworICAgYm9vbCBpc19hY2N1bXVsYXRvcigpIGNvbnN0OworCisgICBmc19yZWcgJmFwcGx5X3N0cmlkZSh1bnNpZ25lZCBzdHJpZGUpOworICAgLyoqIFNtZWFyIGEgY2hhbm5lbCBvZiB0aGUgcmVnIHRvIGFsbCBjaGFubmVscy4gKi8KKyAgIGZzX3JlZyAmc2V0X3NtZWFyKHVuc2lnbmVkIHN1YnJlZyk7CisKKyAgIC8qKiBSZWdpc3RlciBmaWxlOiBHUkYsIE1SRiwgSU1NLiAqLworICAgZW51bSByZWdpc3Rlcl9maWxlIGZpbGU7CisgICAvKiogUmVnaXN0ZXIgdHlwZS4gIEJSV19SRUdJU1RFUl9UWVBFXyogKi8KKyAgIHVpbnQ4X3QgdHlwZTsKKyAgIC8qKgorICAgICogUmVnaXN0ZXIgbnVtYmVyLiAgRm9yIE1SRiwgaXQncyB0aGUgaGFyZHdhcmUgcmVnaXN0ZXIuICBGb3IKKyAgICAqIEdSRiwgaXQncyBhIHZpcnR1YWwgcmVnaXN0ZXIgbnVtYmVyIHVudGlsIHJlZ2lzdGVyIGFsbG9jYXRpb24KKyAgICAqLworICAgdWludDE2X3QgcmVnOworICAgLyoqCisgICAgKiBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGNvbnRpZ3VvdXMgcmVnaXN0ZXIgYmxvY2suCisgICAgKgorICAgICogRm9yIHByZS1yZWdpc3Rlci1hbGxvY2F0aW9uIEdSRnMsIHRoaXMgaXMgaW4gdW5pdHMgb2YgYSBmbG9hdCBwZXIgcGl4ZWwKKyAgICAqICgxIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBTSU1EOCBtb2RlLCBvciAyIHJlZ2lzdGVycyBmb3IgU0lNRDE2IG1vZGUpLgorICAgICogRm9yIHVuaWZvcm1zLCB0aGlzIGlzIGluIHVuaXRzIG9mIDEgZmxvYXQuCisgICAgKi8KKyAgIGludCByZWdfb2Zmc2V0OworICAgLyoqCisgICAgKiBPZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyLiAgVmFsdWVzIHVwIHRvIGEKKyAgICAqIGJhY2tlbmRfcmVnOjpyZWdfb2Zmc2V0IHVuaXQgYXJlIHZhbGlkLgorICAgICovCisgICBpbnQgc3VicmVnX29mZnNldDsKKworICAgLyoqIFZhbHVlIGZvciBmaWxlID09IElNTSAqLworICAgdW5pb24geworICAgICAgaW50MzJfdCBpOworICAgICAgdWludDMyX3QgdTsKKyAgICAgIGZsb2F0IGY7CisgICB9IGltbTsKKworICAgc3RydWN0IGJyd19yZWcgZml4ZWRfaHdfcmVnOworCisgICBmc19yZWcgKnJlbGFkZHI7CisKKyAgIGJvb2wgbmVnYXRlOworICAgYm9vbCBhYnM7CisKKyAgIC8qKiBSZWdpc3RlciByZWdpb24gaG9yaXpvbnRhbCBzdHJpZGUgKi8KKyAgIHVpbnQ4X3Qgc3RyaWRlOworfTsKKworc3RhdGljIGlubGluZSBmc19yZWcKK3JldHlwZShmc19yZWcgcmVnLCB1bnNpZ25lZCB0eXBlKQoreworICAgcmVnLmZpeGVkX2h3X3JlZy50eXBlID0gcmVnLnR5cGUgPSB0eXBlOworICAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGlubGluZSBmc19yZWcKK29mZnNldChmc19yZWcgcmVnLCB1bnNpZ25lZCBkZWx0YSkKK3sKKyAgIGFzc2VydChkZWx0YSA9PSAwIHx8IChyZWcuZmlsZSAhPSBIV19SRUcgJiYgcmVnLmZpbGUgIT0gSU1NKSk7CisgICByZWcucmVnX29mZnNldCArPSBkZWx0YTsKKyAgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgZnNfcmVnCitieXRlX29mZnNldChmc19yZWcgcmVnLCB1bnNpZ25lZCBkZWx0YSkKK3sKKyAgIGFzc2VydChkZWx0YSA9PSAwIHx8IChyZWcuZmlsZSAhPSBIV19SRUcgJiYgcmVnLmZpbGUgIT0gSU1NKSk7CisgICByZWcuc3VicmVnX29mZnNldCArPSBkZWx0YTsKKyAgIHJldHVybiByZWc7Cit9CisKKy8qKgorICogR2V0IGVpdGhlciBvZiB0aGUgOC1jb21wb25lbnQgaGFsdmVzIG9mIGEgMTYtY29tcG9uZW50IHJlZ2lzdGVyLgorICoKKyAqIE5vdGU6IHRoaXMgYWxzbyB3b3JrcyBpZiBcYyByZWcgcmVwcmVzZW50cyBhIFNJTUQxNiBwYWlyIG9mIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGlubGluZSBmc19yZWcKK2hhbGYoY29uc3QgZnNfcmVnICZyZWcsIHVuc2lnbmVkIGlkeCkKK3sKKyAgIGFzc2VydChpZHggPCAyKTsKKyAgIGFzc2VydChpZHggPT0gMCB8fCAocmVnLmZpbGUgIT0gSFdfUkVHICYmIHJlZy5maWxlICE9IElNTSkpOworICAgcmV0dXJuIGJ5dGVfb2Zmc2V0KHJlZywgOCAqIGlkeCAqIHJlZy5zdHJpZGUgKiB0eXBlX3N6KHJlZy50eXBlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBmc19yZWcgcmVnX3VuZGVmOworc3RhdGljIGNvbnN0IGZzX3JlZyByZWdfbnVsbF9mKHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRikpOworc3RhdGljIGNvbnN0IGZzX3JlZyByZWdfbnVsbF9kKHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworc3RhdGljIGNvbnN0IGZzX3JlZyByZWdfbnVsbF91ZChyZXR5cGUoYnJ3X251bGxfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisKK2NsYXNzIGlwX3JlY29yZCA6IHB1YmxpYyBleGVjX25vZGUgeworcHVibGljOgorICAgREVDTEFSRV9SQUxMT0NfQ1hYX09QRVJBVE9SUyhpcF9yZWNvcmQpCisKKyAgIGlwX3JlY29yZChpbnQgaXApCisgICB7CisgICAgICB0aGlzLT5pcCA9IGlwOworICAgfQorCisgICBpbnQgaXA7Cit9OworCitjbGFzcyBmc19pbnN0IDogcHVibGljIGJhY2tlbmRfaW5zdHJ1Y3Rpb24geworcHVibGljOgorICAgREVDTEFSRV9SQUxMT0NfQ1hYX09QRVJBVE9SUyhmc19pbnN0KQorCisgICB2b2lkIGluaXQoKTsKKworICAgZnNfaW5zdCgpOworICAgZnNfaW5zdChlbnVtIG9wY29kZSBvcGNvZGUpOworICAgZnNfaW5zdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QpOworICAgZnNfaW5zdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwKTsKKyAgIGZzX2luc3QoZW51bSBvcGNvZGUgb3Bjb2RlLCBmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgZnNfaW5zdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QsCisgICAgICAgICAgIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSxmc19yZWcgc3JjMik7CisKKyAgIGJvb2wgZXF1YWxzKGZzX2luc3QgKmluc3QpIGNvbnN0OworICAgYm9vbCBvdmVyd3JpdGVzX3JlZyhjb25zdCBmc19yZWcgJnJlZykgY29uc3Q7CisgICBib29sIGlzX3NlbmRfZnJvbV9ncmYoKSBjb25zdDsKKyAgIGJvb2wgaXNfcGFydGlhbF93cml0ZSgpIGNvbnN0OworICAgaW50IHJlZ3NfcmVhZChmc192aXNpdG9yICp2LCBpbnQgYXJnKSBjb25zdDsKKworICAgYm9vbCByZWFkc19mbGFnKCkgY29uc3Q7CisgICBib29sIHdyaXRlc19mbGFnKCkgY29uc3Q7CisKKyAgIGZzX3JlZyBkc3Q7CisgICBmc19yZWcgc3JjWzNdOworCisgICAvKiogQHsKKyAgICAqIEFubm90YXRpb24gZm9yIHRoZSBnZW5lcmF0ZWQgSVIuICBPbmUgb2YgdGhlIHR3byBjYW4gYmUgc2V0LgorICAgICovCisgICBjb25zdCB2b2lkICppcjsKKyAgIGNvbnN0IGNoYXIgKmFubm90YXRpb247CisgICAvKiogQH0gKi8KKworICAgdWludDMyX3QgdGV4dHVyZV9vZmZzZXQ7IC8qKjwgVGV4dHVyZSBvZmZzZXQgYml0ZmllbGQgKi8KKyAgIHVpbnQzMl90IG9mZnNldDsgLyogc3BpbGwvdW5zcGlsbCBvZmZzZXQgKi8KKworICAgdWludDhfdCBjb25kaXRpb25hbF9tb2Q7IC8qKjwgQlJXX0NPTkRJVElPTkFMXyogKi8KKworICAgLyogQ2hvb3NlcyB3aGljaCBmbGFnIHN1YnJlZ2lzdGVyIChmMC4wIG9yIGYwLjEpIGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsCisgICAgKiBtb2QgYW5kIHByZWRpY2F0aW9uLgorICAgICovCisgICB1aW50OF90IGZsYWdfc3VicmVnOworCisgICB1aW50OF90IG1sZW47IC8qKjwgU0VORCBtZXNzYWdlIGxlbmd0aCAqLworICAgdWludDhfdCByZWdzX3dyaXR0ZW47IC8qKjwgTnVtYmVyIG9mIHZncmZzIHdyaXR0ZW4gYnkgYSBTRU5EIG1lc3NhZ2UsIG9yIDEgKi8KKyAgIGludDhfdCBiYXNlX21yZjsgLyoqPCBGaXJzdCBNUkYgaW4gdGhlIFNFTkQgbWVzc2FnZSwgaWYgbWxlbiBpcyBub256ZXJvLiAqLworICAgdWludDhfdCBzYW1wbGVyOworICAgdWludDhfdCB0YXJnZXQ7IC8qKjwgTVJUIHRhcmdldC4gKi8KKyAgIGJvb2wgc2F0dXJhdGU6MTsKKyAgIGJvb2wgZW90OjE7CisgICBib29sIGhlYWRlcl9wcmVzZW50OjE7CisgICBib29sIHNoYWRvd19jb21wYXJlOjE7CisgICBib29sIGZvcmNlX3VuY29tcHJlc3NlZDoxOworICAgYm9vbCBmb3JjZV9zZWNoYWxmOjE7CisgICBib29sIGZvcmNlX3dyaXRlbWFza19hbGw6MTsKK307CisKKy8qKgorICogVGhlIGZyYWdtZW50IHNoYWRlciBmcm9udC1lbmQuCisgKgorICogVHJhbnNsYXRlcyBlaXRoZXIgR0xTTCBJUiBvciBNZXNhIElSIChmb3IgQVJCX2ZyYWdtZW50X3Byb2dyYW0pIGludG8gRlMgSVIuCisgKi8KK2NsYXNzIGZzX3Zpc2l0b3IgOiBwdWJsaWMgYmFja2VuZF92aXNpdG9yCit7CitwdWJsaWM6CisKKyAgIGZzX3Zpc2l0b3Ioc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgIHN0cnVjdCBicndfd21fY29tcGlsZSAqYywKKyAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAorICAgICAgICAgICAgICB1bnNpZ25lZCBkaXNwYXRjaF93aWR0aCk7CisgICB+ZnNfdmlzaXRvcigpOworCisgICBmc19yZWcgKnZhcmlhYmxlX3N0b3JhZ2UoaXJfdmFyaWFibGUgKnZhcik7CisgICBpbnQgdmlydHVhbF9ncmZfYWxsb2MoaW50IHNpemUpOworICAgdm9pZCBpbXBvcnRfdW5pZm9ybXMoZnNfdmlzaXRvciAqdik7CisKKyAgIHZvaWQgdmlzaXQoaXJfdmFyaWFibGUgKmlyKTsKKyAgIHZvaWQgdmlzaXQoaXJfYXNzaWdubWVudCAqaXIpOworICAgdm9pZCB2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqaXIpOworICAgdm9pZCB2aXNpdChpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmlyKTsKKyAgIHZvaWQgdmlzaXQoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKTsKKyAgIHZvaWQgdmlzaXQoaXJfZXhwcmVzc2lvbiAqaXIpOworICAgdm9pZCB2aXNpdChpcl90ZXh0dXJlICppcik7CisgICB2b2lkIHZpc2l0KGlyX2lmICppcik7CisgICB2b2lkIHZpc2l0KGlyX2NvbnN0YW50ICppcik7CisgICB2b2lkIHZpc2l0KGlyX3N3aXp6bGUgKmlyKTsKKyAgIHZvaWQgdmlzaXQoaXJfcmV0dXJuICppcik7CisgICB2b2lkIHZpc2l0KGlyX2xvb3AgKmlyKTsKKyAgIHZvaWQgdmlzaXQoaXJfbG9vcF9qdW1wICppcik7CisgICB2b2lkIHZpc2l0KGlyX2Rpc2NhcmQgKmlyKTsKKyAgIHZvaWQgdmlzaXQoaXJfY2FsbCAqaXIpOworICAgdm9pZCB2aXNpdChpcl9mdW5jdGlvbiAqaXIpOworICAgdm9pZCB2aXNpdChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKTsKKyAgIHZvaWQgdmlzaXQoaXJfZW1pdF92ZXJ0ZXggKik7CisgICB2b2lkIHZpc2l0KGlyX2VuZF9wcmltaXRpdmUgKik7CisKKyAgIHVpbnQzMl90IGdhdGhlcl9jaGFubmVsKGlyX3RleHR1cmUgKmlyLCBpbnQgc2FtcGxlcik7CisgICB2b2lkIHN3aXp6bGVfcmVzdWx0KGlyX3RleHR1cmUgKmlyLCBmc19yZWcgb3JpZ192YWwsIGludCBzYW1wbGVyKTsKKworICAgYm9vbCBjYW5fZG9fc291cmNlX21vZHMoZnNfaW5zdCAqaW5zdCk7CisKKyAgIGZzX2luc3QgKmVtaXQoZnNfaW5zdCAqaW5zdCk7CisgICB2b2lkIGVtaXQoZXhlY19saXN0IGxpc3QpOworCisgICBmc19pbnN0ICplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSk7CisgICBmc19pbnN0ICplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSwgZnNfcmVnIGRzdCk7CisgICBmc19pbnN0ICplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSwgZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzApOworICAgZnNfaW5zdCAqZW1pdChlbnVtIG9wY29kZSBvcGNvZGUsIGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSk7CisgICBmc19pbnN0ICplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSwgZnNfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxLCBmc19yZWcgc3JjMik7CisKKyAgIGZzX2luc3QgKk1PVihmc19yZWcgZHN0LCBmc19yZWcgc3JjKTsKKyAgIGZzX2luc3QgKk5PVChmc19yZWcgZHN0LCBmc19yZWcgc3JjKTsKKyAgIGZzX2luc3QgKlJOREQoZnNfcmVnIGRzdCwgZnNfcmVnIHNyYyk7CisgICBmc19pbnN0ICpSTkRFKGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMpOworICAgZnNfaW5zdCAqUk5EWihmc19yZWcgZHN0LCBmc19yZWcgc3JjKTsKKyAgIGZzX2luc3QgKkZSQyhmc19yZWcgZHN0LCBmc19yZWcgc3JjKTsKKyAgIGZzX2luc3QgKkFERChmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgZnNfaW5zdCAqTVVMKGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSk7CisgICBmc19pbnN0ICpNQUNIKGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSk7CisgICBmc19pbnN0ICpNQUMoZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxKTsKKyAgIGZzX2luc3QgKlNITChmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgZnNfaW5zdCAqU0hSKGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSk7CisgICBmc19pbnN0ICpBU1IoZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxKTsKKyAgIGZzX2luc3QgKkFORChmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgZnNfaW5zdCAqT1IoZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxKTsKKyAgIGZzX2luc3QgKlhPUihmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgZnNfaW5zdCAqSUYodWludDMyX3QgcHJlZGljYXRlKTsKKyAgIGZzX2luc3QgKklGKGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSwgdWludDMyX3QgY29uZGl0aW9uKTsKKyAgIGZzX2luc3QgKkNNUChmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEsCisgICAgICAgICAgICAgICAgdWludDMyX3QgY29uZGl0aW9uKTsKKyAgIGZzX2luc3QgKkxSUChmc19yZWcgZHN0LCBmc19yZWcgYSwgZnNfcmVnIHksIGZzX3JlZyB4KTsKKyAgIGZzX2luc3QgKkRFUF9SRVNPTFZFX01PVihpbnQgZ3JmKTsKKyAgIGZzX2luc3QgKkJGUkVWKGZzX3JlZyBkc3QsIGZzX3JlZyB2YWx1ZSk7CisgICBmc19pbnN0ICpCRkUoZnNfcmVnIGRzdCwgZnNfcmVnIGJpdHMsIGZzX3JlZyBvZmZzZXQsIGZzX3JlZyB2YWx1ZSk7CisgICBmc19pbnN0ICpCRkkxKGZzX3JlZyBkc3QsIGZzX3JlZyBiaXRzLCBmc19yZWcgb2Zmc2V0KTsKKyAgIGZzX2luc3QgKkJGSTIoZnNfcmVnIGRzdCwgZnNfcmVnIGJmaTFfZHN0LCBmc19yZWcgaW5zZXJ0LCBmc19yZWcgYmFzZSk7CisgICBmc19pbnN0ICpGQkgoZnNfcmVnIGRzdCwgZnNfcmVnIHZhbHVlKTsKKyAgIGZzX2luc3QgKkZCTChmc19yZWcgZHN0LCBmc19yZWcgdmFsdWUpOworICAgZnNfaW5zdCAqQ0JJVChmc19yZWcgZHN0LCBmc19yZWcgdmFsdWUpOworICAgZnNfaW5zdCAqTUFEKGZzX3JlZyBkc3QsIGZzX3JlZyBjLCBmc19yZWcgYiwgZnNfcmVnIGEpOworICAgZnNfaW5zdCAqQUREQyhmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgZnNfaW5zdCAqU1VCQihmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgZnNfaW5zdCAqU0VMKGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwLCBmc19yZWcgc3JjMSk7CisKKyAgIGludCB0eXBlX3NpemUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSk7CisgICBmc19pbnN0ICpnZXRfaW5zdHJ1Y3Rpb25fZ2VuZXJhdGluZ19yZWcoZnNfaW5zdCAqc3RhcnQsCisJCQkJCSAgIGZzX2luc3QgKmVuZCwKKwkJCQkJICAgY29uc3QgZnNfcmVnICZyZWcpOworCisgICBleGVjX2xpc3QgVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQUQoY29uc3QgZnNfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnNfcmVnICZzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzX3JlZyAmdmFyeWluZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29uc3Rfb2Zmc2V0KTsKKworICAgYm9vbCBydW4oKTsKKyAgIHZvaWQgYXNzaWduX2JpbmRpbmdfdGFibGVfb2Zmc2V0cygpOworICAgdm9pZCBzZXR1cF9wYXlsb2FkX2dlbjQoKTsKKyAgIHZvaWQgc2V0dXBfcGF5bG9hZF9nZW42KCk7CisgICB2b2lkIGFzc2lnbl9jdXJiX3NldHVwKCk7CisgICB2b2lkIGNhbGN1bGF0ZV91cmJfc2V0dXAoKTsKKyAgIHZvaWQgYXNzaWduX3VyYl9zZXR1cCgpOworICAgYm9vbCBhc3NpZ25fcmVncyhib29sIGFsbG93X3NwaWxsaW5nKTsKKyAgIGJvb2wgYXNzaWduX3JlZ3NfZ2xhc3N5KGJvb2wgYWxsb3dfc3BpbGxpbmcpOworICAgdm9pZCBhc3NpZ25fcmVnc190cml2aWFsKCk7CisgICB2b2lkIGdldF91c2VkX21yZnMoYm9vbCAqbXJmX3VzZWQpOworICAgdm9pZCBzZXR1cF9wYXlsb2FkX2ludGVyZmVyZW5jZShpbnQqIHBheWxvYWRfbGFzdF91c2VfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbXJmX2ZpcnN0X3VzZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBheWxvYWRfcmVnX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJmX25vZGVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9wYXlsb2FkX25vZGUpOworICAgdm9pZCBjaG9vc2Vfc3BpbGxfcmVnKGZsb2F0KiBzcGlsbF9jb3N0cywgYm9vbCogbm9fc3BpbGwpOworICAgaW50IGNob29zZV9zcGlsbF9yZWcoaWdyYXBoX3QmIGcpOworICAgdm9pZCBzcGlsbF9yZWcoaW50IHNwaWxsX3JlZyk7CisgICB2b2lkIHNwbGl0X3ZpcnR1YWxfZ3JmcygpOworICAgdm9pZCBjb21wYWN0X3ZpcnR1YWxfZ3JmcygpOworICAgdm9pZCBtb3ZlX3VuaWZvcm1fYXJyYXlfYWNjZXNzX3RvX3B1bGxfY29uc3RhbnRzKCk7CisgICB2b2lkIGFzc2lnbl9jb25zdGFudF9sb2NhdGlvbnMoKTsKKyAgIHZvaWQgZGVtb3RlX3B1bGxfY29uc3RhbnRzKCk7CisgICB2b2lkIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKyAgIHZvaWQgY2FsY3VsYXRlX2xpdmVfaW50ZXJ2YWxzKGludCBleHRyYSA9IDApOworICAgaW50IGNhbGN1bGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZShpbnQgZXh0cmEgPSAwKTsKKyAgIGJvb2wgb3B0X2FsZ2VicmFpYygpOworICAgYm9vbCBvcHRfY3NlKCk7CisgICBib29sIG9wdF9jc2VfbG9jYWwoYmJsb2NrX3QgKmJsb2NrLCBleGVjX2xpc3QgKmFlYik7CisgICBib29sIG9wdF9jb3B5X3Byb3BhZ2F0ZSgpOworICAgYm9vbCB0cnlfY29weV9wcm9wYWdhdGUoZnNfaW5zdCAqaW5zdCwgaW50IGFyZywgYWNwX2VudHJ5ICplbnRyeSk7CisgICBib29sIG9wdF9jb3B5X3Byb3BhZ2F0ZV9sb2NhbCh2b2lkICptZW1fY3R4LCBiYmxvY2tfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjX2xpc3QgKmFjcCk7CisgICB2b2lkIG9wdF9kcm9wX3JlZHVuZGFudF9tb3ZfdG9fZmxhZ3MoKTsKKyAgIGJvb2wgcmVnaXN0ZXJfY29hbGVzY2UoKTsKKyAgIGJvb2wgY29tcHV0ZV90b19tcmYoKTsKKyAgIGJvb2wgZGVhZF9jb2RlX2VsaW1pbmF0ZSgpOworICAgYm9vbCByZW1vdmVfZHVwbGljYXRlX21yZl93cml0ZXMoKTsKKyAgIGJvb2wgdmlydHVhbF9ncmZfaW50ZXJmZXJlcyhpbnQgYSwgaW50IGIpOworICAgaW50ICBsaXZlX2luX2NvdW50KGludCBibG9ja19udW0pIGNvbnN0OworICAgaW50ICBsaXZlX291dF9jb3VudChpbnQgYmxvY2tfbnVtKSBjb25zdDsKKyAgIGludCBzY2hlZHVsZV9pbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyX21vZGUgbW9kZSk7CisgICB2b2lkIGluc2VydF9nZW40X3NlbmRfZGVwZW5kZW5jeV93b3JrYXJvdW5kcygpOworICAgdm9pZCBpbnNlcnRfZ2VuNF9wcmVfc2VuZF9kZXBlbmRlbmN5X3dvcmthcm91bmRzKGZzX2luc3QgKmluc3QpOworICAgdm9pZCBpbnNlcnRfZ2VuNF9wb3N0X3NlbmRfZGVwZW5kZW5jeV93b3JrYXJvdW5kcyhmc19pbnN0ICppbnN0KTsKKyAgIHZvaWQgdmZhaWwoY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFyZ3MpOworICAgdm9pZCBmYWlsKGNvbnN0IGNoYXIgKm1zZywgLi4uKTsKKyAgIHZvaWQgbm8xNihjb25zdCBjaGFyICptc2csIC4uLik7CisgICB2b2lkIGxvd2VyX3VuaWZvcm1fcHVsbF9jb25zdGFudF9sb2FkcygpOworCisgICB2b2lkIHB1c2hfZm9yY2VfdW5jb21wcmVzc2VkKCk7CisgICB2b2lkIHBvcF9mb3JjZV91bmNvbXByZXNzZWQoKTsKKworICAgdm9pZCBlbWl0X2R1bW15X2ZzKCk7CisgICBmc19yZWcgKmVtaXRfZnJhZ2Nvb3JkX2ludGVycG9sYXRpb24oaXJfdmFyaWFibGUgKmlyKTsKKyAgIGZzX2luc3QgKmVtaXRfbGludGVycChjb25zdCBmc19yZWcgJmF0dHIsIGNvbnN0IGZzX3JlZyAmaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdsc2xfaW50ZXJwX3F1YWxpZmllciBpbnRlcnBvbGF0aW9uX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jZW50cm9pZCwgYm9vbCBpc19zYW1wbGUpOworICAgZnNfcmVnICplbWl0X2Zyb250ZmFjaW5nX2ludGVycG9sYXRpb24oaXJfdmFyaWFibGUgKmlyKTsKKyAgIGZzX3JlZyAqZW1pdF9zYW1wbGVwb3Nfc2V0dXAoaXJfdmFyaWFibGUgKmlyKTsKKyAgIGZzX3JlZyAqZW1pdF9zYW1wbGVpZF9zZXR1cChpcl92YXJpYWJsZSAqaXIpOworICAgZnNfcmVnICplbWl0X3NhbXBsZW1hc2tpbl9zZXR1cChpcl92YXJpYWJsZSAqaXIpOworICAgZnNfcmVnICplbWl0X2dlbmVyYWxfaW50ZXJwb2xhdGlvbihpcl92YXJpYWJsZSAqaXIpOworICAgdm9pZCBlbWl0X2ludGVycG9sYXRpb25fc2V0dXBfZ2VuNCgpOworICAgdm9pZCBlbWl0X2ludGVycG9sYXRpb25fc2V0dXBfZ2VuNigpOworICAgdm9pZCBjb21wdXRlX3NhbXBsZV9wb3NpdGlvbihmc19yZWcgZHN0LCBmc19yZWcgaW50X3NhbXBsZV9wb3MpOworICAgZnNfcmVnIHJlc2NhbGVfdGV4Y29vcmQoaXJfdGV4dHVyZSAqaXIsIGZzX3JlZyBjb29yZGluYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZWN0LCBpbnQgc2FtcGxlciwgaW50IHRleHVuaXQpOworICAgZnNfaW5zdCAqZW1pdF90ZXh0dXJlX2dlbjQoaXJfdGV4dHVyZSAqaXIsIGZzX3JlZyBkc3QsIGZzX3JlZyBjb29yZGluYXRlLAorCQkJICAgICAgZnNfcmVnIHNoYWRvd19jb21wLCBmc19yZWcgbG9kLCBmc19yZWcgbG9kMik7CisgICBmc19pbnN0ICplbWl0X3RleHR1cmVfZ2VuNShpcl90ZXh0dXJlICppciwgZnNfcmVnIGRzdCwgZnNfcmVnIGNvb3JkaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgc2hhZG93X2NvbXAsIGZzX3JlZyBsb2QsIGZzX3JlZyBsb2QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIHNhbXBsZV9pbmRleCk7CisgICBmc19pbnN0ICplbWl0X3RleHR1cmVfZ2VuNyhpcl90ZXh0dXJlICppciwgZnNfcmVnIGRzdCwgZnNfcmVnIGNvb3JkaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgc2hhZG93X2NvbXAsIGZzX3JlZyBsb2QsIGZzX3JlZyBsb2QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIHNhbXBsZV9pbmRleCwgZnNfcmVnIG1jcywgaW50IHNhbXBsZXIpOworICAgZnNfcmVnIGVtaXRfbWNzX2ZldGNoKGlyX3RleHR1cmUgKmlyLCBmc19yZWcgY29vcmRpbmF0ZSwgaW50IHNhbXBsZXIpOworICAgdm9pZCBlbWl0X2dlbjZfZ2F0aGVyX3dhKHVpbnQ4X3Qgd2EsIGZzX3JlZyBkc3QpOworICAgZnNfcmVnIGZpeF9tYXRoX29wZXJhbmQoZnNfcmVnIHNyYyk7CisgICBmc19pbnN0ICplbWl0X21hdGgoZW51bSBvcGNvZGUgb3AsIGZzX3JlZyBkc3QsIGZzX3JlZyBzcmMwKTsKKyAgIGZzX2luc3QgKmVtaXRfbWF0aChlbnVtIG9wY29kZSBvcCwgZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxKTsKKyAgIHZvaWQgZW1pdF9scnAoY29uc3QgZnNfcmVnICZkc3QsIGNvbnN0IGZzX3JlZyAmeCwgY29uc3QgZnNfcmVnICZ5LAorICAgICAgICAgICAgICAgICBjb25zdCBmc19yZWcgJmEpOworICAgdm9pZCBlbWl0X21pbm1heCh1aW50MzJfdCBjb25kaXRpb25hbG1vZCwgY29uc3QgZnNfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzX3JlZyAmc3JjMCwgY29uc3QgZnNfcmVnICZzcmMxKTsKKyAgIGJvb2wgdHJ5X2VtaXRfc2F0dXJhdGUoaXJfZXhwcmVzc2lvbiAqaXIpOworICAgYm9vbCB0cnlfZW1pdF9tYWQoaXJfZXhwcmVzc2lvbiAqaXIpOworICAgdm9pZCB0cnlfcmVwbGFjZV93aXRoX3NlbCgpOworICAgYm9vbCBvcHRfcGVlcGhvbGVfc2VsKCk7CisgICBib29sIG9wdF9wZWVwaG9sZV9wcmVkaWNhdGVkX2JyZWFrKCk7CisgICBib29sIG9wdF9zYXR1cmF0ZV9wcm9wYWdhdGlvbigpOworICAgdm9pZCBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyX3J2YWx1ZSAqY29uZGl0aW9uKTsKKyAgIHZvaWQgZW1pdF9pZl9nZW42KGlyX2lmICppcik7CisgICB2b2lkIGVtaXRfdW5zcGlsbChmc19pbnN0ICppbnN0LCBmc19yZWcgcmVnLCB1aW50MzJfdCBzcGlsbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOworCisgICB2b2lkIGVtaXRfZnJhZ21lbnRfcHJvZ3JhbV9jb2RlKCk7CisgICB2b2lkIHNldHVwX2ZwX3JlZ3MoKTsKKyAgIGZzX3JlZyBnZXRfZnBfc3JjX3JlZyhjb25zdCBwcm9nX3NyY19yZWdpc3RlciAqc3JjKTsKKyAgIGZzX3JlZyBnZXRfZnBfZHN0X3JlZyhjb25zdCBwcm9nX2RzdF9yZWdpc3RlciAqZHN0KTsKKyAgIHZvaWQgZW1pdF9mcF9hbHUxKGVudW0gb3Bjb2RlIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpmcGksCisgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LCBmc19yZWcgc3JjKTsKKyAgIHZvaWQgZW1pdF9mcF9hbHUyKGVudW0gb3Bjb2RlIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcm9nX2luc3RydWN0aW9uICpmcGksCisgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworICAgdm9pZCBlbWl0X2ZwX3NjYWxhcl93cml0ZShjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqZnBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LCBmc19yZWcgc3JjKTsKKyAgIHZvaWQgZW1pdF9mcF9zY2FsYXJfbWF0aChlbnVtIG9wY29kZSBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmZwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LCBmc19yZWcgc3JjKTsKKworICAgdm9pZCBlbWl0X2ZwX21pbm1heChjb25zdCBzdHJ1Y3QgcHJvZ19pbnN0cnVjdGlvbiAqZnBpLAorICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LCBmc19yZWcgc3JjMCwgZnNfcmVnIHNyYzEpOworCisgICB2b2lkIGVtaXRfZnBfc29wKHVpbnQzMl90IGNvbmRpdGlvbmFsX21vZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByb2dfaW5zdHJ1Y3Rpb24gKmZwaSwKKyAgICAgICAgICAgICAgICAgICAgZnNfcmVnIGRzdCwgZnNfcmVnIHNyYzAsIGZzX3JlZyBzcmMxLCBmc19yZWcgb25lKTsKKworICAgdm9pZCBlbWl0X2NvbG9yX3dyaXRlKGludCB0YXJnZXQsIGludCBpbmRleCwgaW50IGZpcnN0X2NvbG9yX21yZik7CisgICB2b2lkIGVtaXRfYWxwaGFfdGVzdCgpOworICAgdm9pZCBlbWl0X2ZiX3dyaXRlcygpOworCisgICB2b2lkIGVtaXRfc2hhZGVyX3RpbWVfYmVnaW4oKTsKKyAgIHZvaWQgZW1pdF9zaGFkZXJfdGltZV9lbmQoKTsKKyAgIHZvaWQgZW1pdF9zaGFkZXJfdGltZV93cml0ZShlbnVtIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIHZhbHVlKTsKKworICAgdm9pZCBlbWl0X3VudHlwZWRfYXRvbWljKHVuc2lnbmVkIGF0b21pY19vcCwgdW5zaWduZWQgc3VyZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LCBmc19yZWcgb2Zmc2V0LCBmc19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgc3JjMSk7CisKKyAgIHZvaWQgZW1pdF91bnR5cGVkX3N1cmZhY2VfcmVhZCh1bnNpZ25lZCBzdXJmX2luZGV4LCBmc19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX3JlZyBvZmZzZXQpOworCisgICBib29sIHRyeV9yZXdyaXRlX3Joc190b19kc3QoaXJfYXNzaWdubWVudCAqaXIsCisJCQkgICAgICAgZnNfcmVnIGRzdCwKKwkJCSAgICAgICBmc19yZWcgc3JjLAorCQkJICAgICAgIGZzX2luc3QgKnByZV9yaHNfaW5zdCwKKwkJCSAgICAgICBmc19pbnN0ICpsYXN0X3Joc19pbnN0KTsKKyAgIHZvaWQgZW1pdF9hc3NpZ25tZW50X3dyaXRlcyhmc19yZWcgJmwsIGZzX3JlZyAmciwKKwkJCSAgICAgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGJvb2wgcHJlZGljYXRlZCk7CisgICB2b2lkIHJlc29sdmVfdWRfbmVnYXRlKGZzX3JlZyAqcmVnKTsKKyAgIHZvaWQgcmVzb2x2ZV9ib29sX2NvbXBhcmlzb24oaXJfcnZhbHVlICpydmFsdWUsIGZzX3JlZyAqcmVnKTsKKworICAgZnNfcmVnIGdldF90aW1lc3RhbXAoKTsKKworICAgc3RydWN0IGJyd19yZWcgaW50ZXJwX3JlZyhpbnQgbG9jYXRpb24sIGludCBjaGFubmVsKTsKKyAgIHZvaWQgc2V0dXBfdW5pZm9ybV92YWx1ZXMoaXJfdmFyaWFibGUgKmlyKTsKKyAgIHZvaWQgc2V0dXBfYnVpbHRpbl91bmlmb3JtX3ZhbHVlcyhpcl92YXJpYWJsZSAqaXIpOworICAgaW50IGltcGxpZWRfbXJmX3dyaXRlcyhmc19pbnN0ICppbnN0KTsKKworICAgdmlydHVhbCB2b2lkIGR1bXBfaW5zdHJ1Y3Rpb25zKCk7CisgICB2b2lkIGR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCk7CisgICB2b2lkIGR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCwgRklMRSAqZmlsZSk7CisgICB2b2lkIGR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCwgY2hhciogc3RyaW5nKTsKKworICAgdm9pZCB2aXNpdF9hdG9taWNfY291bnRlcl9pbnRyaW5zaWMoaXJfY2FsbCAqaXIpOworCisgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnA7CisgICBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmM7CisgICB1bnNpZ25lZCBpbnQgc2FuaXR5X3BhcmFtX2NvdW50OworCisgICBpbnQgKnBhcmFtX3NpemU7CisKKyAgIGludCAqdmlydHVhbF9ncmZfc2l6ZXM7CisgICBpbnQgdmlydHVhbF9ncmZfY291bnQ7CisgICBpbnQgdmlydHVhbF9ncmZfYXJyYXlfc2l6ZTsKKyAgIGludCAqdmlydHVhbF9ncmZfc3RhcnQ7CisgICBpbnQgKnZpcnR1YWxfZ3JmX2VuZDsKKyAgIGJydzo6ZnNfbGl2ZV92YXJpYWJsZXMgKmxpdmVfaW50ZXJ2YWxzOworCisgICBpbnQgKnJlZ3NfbGl2ZV9hdF9pcDsKKworICAgLyoqIE51bWJlciBvZiB1bmlmb3JtIHZhcmlhYmxlIGNvbXBvbmVudHMgdmlzaXRlZC4gKi8KKyAgIHVuc2lnbmVkIHVuaWZvcm1zOworCisgICBpbnQgZXN0aW1hdGVkX2Nsb2NrczsKKworICAgLyoqCisgICAgKiBBcnJheSBtYXBwaW5nIFVOSUZPUk0gcmVnaXN0ZXIgbnVtYmVycyB0byB0aGUgcHVsbCBwYXJhbWV0ZXIgaW5kZXgsCisgICAgKiBvciAtMSBpZiB0aGlzIHVuaWZvcm0gcmVnaXN0ZXIgaXNuJ3QgYmVpbmcgdXBsb2FkZWQgYXMgYSBwdWxsIGNvbnN0YW50LgorICAgICovCisgICBpbnQgKnB1bGxfY29uc3RhbnRfbG9jOworCisgICAvKioKKyAgICAqIEFycmF5IG1hcHBpbmcgVU5JRk9STSByZWdpc3RlciBudW1iZXJzIHRvIHRoZSBwdXNoIHBhcmFtZXRlciBpbmRleCwKKyAgICAqIG9yIC0xIGlmIHRoaXMgdW5pZm9ybSByZWdpc3RlciBpc24ndCBiZWluZyB1cGxvYWRlZCBhcyBhIHB1c2ggY29uc3RhbnQuCisgICAgKi8KKyAgIGludCAqcHVzaF9jb25zdGFudF9sb2M7CisKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9odDsKKyAgIGZzX3JlZyBmcmFnX2RlcHRoOworICAgZnNfcmVnIHNhbXBsZV9tYXNrOworICAgZnNfcmVnIG91dHB1dHNbQlJXX01BWF9EUkFXX0JVRkZFUlNdOworICAgdW5zaWduZWQgb3V0cHV0X2NvbXBvbmVudHNbQlJXX01BWF9EUkFXX0JVRkZFUlNdOworICAgZnNfcmVnIGR1YWxfc3JjX291dHB1dDsKKyAgIGJvb2wgZG9fZHVhbF9zcmM7CisgICBpbnQgZmlyc3Rfbm9uX3BheWxvYWRfZ3JmOworICAgLyoqIEVpdGhlciBCUldfTUFYX0dSRiBvciBHRU43X01SRl9IQUNLX1NUQVJUICovCisgICBpbnQgbWF4X2dyZjsKKworICAgZnNfcmVnICpmcF90ZW1wX3JlZ3M7CisgICBmc19yZWcgKmZwX2lucHV0X3JlZ3M7CisKKyAgIC8qKiBAeyBkZWJ1ZyBhbm5vdGF0aW9uIGluZm8gKi8KKyAgIGNvbnN0IGNoYXIgKmN1cnJlbnRfYW5ub3RhdGlvbjsKKyAgIGNvbnN0IHZvaWQgKmJhc2VfaXI7CisgICAvKiogQH0gKi8KKworICAgYm9vbCBmYWlsZWQ7CisgICBjaGFyICpmYWlsX21zZzsKKyAgIGJvb2wgc2ltZDE2X3Vuc3VwcG9ydGVkOworICAgY2hhciAqbm8xNl9tc2c7CisKKyAgIC8qIFJlc3VsdCBvZiBsYXN0IHZpc2l0KCkgbWV0aG9kLiAqLworICAgZnNfcmVnIHJlc3VsdDsKKworICAgZnNfcmVnIHBpeGVsX3g7CisgICBmc19yZWcgcGl4ZWxfeTsKKyAgIGZzX3JlZyB3cG9zX3c7CisgICBmc19yZWcgcGl4ZWxfdzsKKyAgIGZzX3JlZyBkZWx0YV94W0JSV19XTV9CQVJZQ0VOVFJJQ19JTlRFUlBfTU9ERV9DT1VOVF07CisgICBmc19yZWcgZGVsdGFfeVtCUldfV01fQkFSWUNFTlRSSUNfSU5URVJQX01PREVfQ09VTlRdOworICAgZnNfcmVnIHNoYWRlcl9zdGFydF90aW1lOworCisgICBpbnQgZ3JmX3VzZWQ7CisgICBib29sIHNwaWxsZWRfYW55X3JlZ2lzdGVyczsKKworICAgY29uc3QgdW5zaWduZWQgZGlzcGF0Y2hfd2lkdGg7IC8qKjwgOCBvciAxNiAqLworCisgICBpbnQgZm9yY2VfdW5jb21wcmVzc2VkX3N0YWNrOworfTsKKworLyoqCisgKiBUaGUgZnJhZ21lbnQgc2hhZGVyIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIFRyYW5zbGF0ZXMgRlMgSVIgdG8gYWN0dWFsIGk5NjUgYXNzZW1ibHkgY29kZS4KKyAqLworY2xhc3MgZnNfZ2VuZXJhdG9yCit7CitwdWJsaWM6CisgICBmc19nZW5lcmF0b3Ioc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCisgICAgICAgICAgICAgICAgYm9vbCBkdWFsX3NvdXJjZV9vdXRwdXQpOworICAgfmZzX2dlbmVyYXRvcigpOworCisgICBjb25zdCB1bnNpZ25lZCAqZ2VuZXJhdGVfYXNzZW1ibHkoZXhlY19saXN0ICpzaW1kOF9pbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY19saXN0ICpzaW1kMTZfaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICphc3NlbWJseV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKmR1bXBfZmlsZSA9IE5VTEwpOworCitwcml2YXRlOgorICAgdm9pZCBnZW5lcmF0ZV9jb2RlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBGSUxFICpkdW1wX2ZpbGUpOworICAgdm9pZCBnZW5lcmF0ZV9mYl93cml0ZShmc19pbnN0ICppbnN0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfYmxvcnBfZmJfd3JpdGUoZnNfaW5zdCAqaW5zdCk7CisgICB2b2lkIGdlbmVyYXRlX3BpeGVsX3h5KHN0cnVjdCBicndfcmVnIGRzdCwgYm9vbCBpc194KTsKKyAgIHZvaWQgZ2VuZXJhdGVfbGludGVycChmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgc3RydWN0IGJyd19yZWcgKnNyYyk7CisgICB2b2lkIGdlbmVyYXRlX3RleChmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX21hdGgxX2dlbjcoZnNfaW5zdCAqaW5zdCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICAgc3RydWN0IGJyd19yZWcgc3JjKTsKKyAgIHZvaWQgZ2VuZXJhdGVfbWF0aDJfZ2VuNyhmc19pbnN0ICppbnN0LAorCQkJICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorCQkJICAgIHN0cnVjdCBicndfcmVnIHNyYzEpOworICAgdm9pZCBnZW5lcmF0ZV9tYXRoMV9nZW42KGZzX2luc3QgKmluc3QsCisJCQkgICAgc3RydWN0IGJyd19yZWcgZHN0LAorCQkJICAgIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX21hdGgyX2dlbjYoZnNfaW5zdCAqaW5zdCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKTsKKyAgIHZvaWQgZ2VuZXJhdGVfbWF0aF9nZW40KGZzX2luc3QgKmluc3QsCisJCQkgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOworICAgdm9pZCBnZW5lcmF0ZV9tYXRoX2c0NShmc19pbnN0ICppbnN0LAorCQkJICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX2RkeChmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX2RkeShmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHN0cnVjdCBicndfcmVnIHNyYywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVnYXRlX3ZhbHVlKTsKKyAgIHZvaWQgZ2VuZXJhdGVfc2NyYXRjaF93cml0ZShmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOworICAgdm9pZCBnZW5lcmF0ZV9zY3JhdGNoX3JlYWQoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfc2NyYXRjaF9yZWFkX2dlbjcoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfdW5pZm9ybV9wdWxsX2NvbnN0YW50X2xvYWQoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfdW5pZm9ybV9wdWxsX2NvbnN0YW50X2xvYWRfZ2VuNyhmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG9mZnNldCk7CisgICB2b2lkIGdlbmVyYXRlX3ZhcnlpbmdfcHVsbF9jb25zdGFudF9sb2FkKGZzX2luc3QgKmluc3QsIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG9mZnNldCk7CisgICB2b2lkIGdlbmVyYXRlX3ZhcnlpbmdfcHVsbF9jb25zdGFudF9sb2FkX2dlbjcoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfbW92X2Rpc3BhdGNoX3RvX2ZsYWdzKGZzX2luc3QgKmluc3QpOworCisgICB2b2lkIGdlbmVyYXRlX3NldF9vbWFzayhmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc2FtcGxlX21hc2spOworCisgICB2b2lkIGdlbmVyYXRlX3NldF9zYW1wbGVfaWQoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKTsKKworICAgdm9pZCBnZW5lcmF0ZV9zZXRfc2ltZDR4Ml9vZmZzZXQoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG9mZnNldCk7CisgICB2b2lkIGdlbmVyYXRlX2Rpc2NhcmRfanVtcChmc19pbnN0ICppbnN0KTsKKworICAgdm9pZCBnZW5lcmF0ZV9wYWNrX2hhbGZfMngxNl9zcGxpdChmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHkpOworICAgdm9pZCBnZW5lcmF0ZV91bnBhY2tfaGFsZl8yeDE2X3NwbGl0KGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYyk7CisKKyAgIHZvaWQgZ2VuZXJhdGVfc2hhZGVyX3RpbWVfYWRkKGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgdmFsdWUpOworCisgICB2b2lkIGdlbmVyYXRlX3VudHlwZWRfYXRvbWljKGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgYXRvbWljX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzdXJmX2luZGV4KTsKKworICAgdm9pZCBnZW5lcmF0ZV91bnR5cGVkX3N1cmZhY2VfcmVhZChmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHN1cmZfaW5kZXgpOworCisgICB2b2lkIGdlbmVyYXRlX3NjYXR0ZXJlZF93cml0ZShmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZzcmMpOworCisgICB2b2lkIGdlbmVyYXRlX3NjYXR0ZXJlZF9yZWFkKGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfcmVnICZzcmMpOworCisgICB2b2lkIHBhdGNoX2Rpc2NhcmRfanVtcHNfdG9fZmJfd3JpdGVzKCk7CisKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3OworICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eDsKKworICAgc3RydWN0IGJyd19jb21waWxlICpwOworICAgc3RydWN0IGJyd193bV9jb21waWxlICpjOworCisgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2c7CisgICBjb25zdCBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnA7CisKKyAgIHVuc2lnbmVkIGRpc3BhdGNoX3dpZHRoOyAvKio8IDggb3IgMTYgKi8KKworICAgZXhlY19saXN0IGRpc2NhcmRfaGFsdF9wYXRjaGVzOworICAgYm9vbCBkdWFsX3NvdXJjZV9vdXRwdXQ7CisgICB2b2lkICptZW1fY3R4OworfTsKKworLyoqCisgKiBUaGUgZnJhZ21lbnQgc2hhZGVyIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIFRyYW5zbGF0ZXMgRlMgSVIgdG8gYWN0dWFsIGk5NjUgYXNzZW1ibHkgY29kZS4KKyAqLworY2xhc3MgZ2VuOF9mc19nZW5lcmF0b3IgOiBwdWJsaWMgZ2VuOF9nZW5lcmF0b3IKK3sKK3B1YmxpYzoKKyAgIGdlbjhfZnNfZ2VuZXJhdG9yKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkdWFsX3NvdXJjZV9vdXRwdXQpOworICAgfmdlbjhfZnNfZ2VuZXJhdG9yKCk7CisKKyAgIGNvbnN0IHVuc2lnbmVkICpnZW5lcmF0ZV9hc3NlbWJseShleGVjX2xpc3QgKnNpbWQ4X2luc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjX2xpc3QgKnNpbWQxNl9pbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmFzc2VtYmx5X3NpemUpOworCitwcml2YXRlOgorICAgdm9pZCBnZW5lcmF0ZV9jb2RlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKKyAgIHZvaWQgZ2VuZXJhdGVfZmJfd3JpdGUoZnNfaW5zdCAqaW5zdCk7CisgICB2b2lkIGdlbmVyYXRlX2xpbnRlcnAoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnICpzcmMpOworICAgdm9pZCBnZW5lcmF0ZV90ZXgoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0LCBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOworICAgdm9pZCBnZW5lcmF0ZV9tYXRoMShmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX21hdGgyKGZzX2luc3QgKmluc3QsIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwgc3RydWN0IGJyd19yZWcgc3JjMSk7CisgICB2b2lkIGdlbmVyYXRlX2RkeChmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX2RkeShmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QsIHN0cnVjdCBicndfcmVnIHNyYywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVnYXRlX3ZhbHVlKTsKKyAgIHZvaWQgZ2VuZXJhdGVfc2NyYXRjaF93cml0ZShmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOworICAgdm9pZCBnZW5lcmF0ZV9zY3JhdGNoX3JlYWQoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfc2NyYXRjaF9yZWFkX2dlbjcoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfdW5pZm9ybV9wdWxsX2NvbnN0YW50X2xvYWQoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfdmFyeWluZ19wdWxsX2NvbnN0YW50X2xvYWQoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfbW92X2Rpc3BhdGNoX3RvX2ZsYWdzKGZzX2luc3QgKmlyKTsKKyAgIHZvaWQgZ2VuZXJhdGVfc2V0X29tYXNrKGZzX2luc3QgKmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc2FtcGxlX21hc2spOworICAgdm9pZCBnZW5lcmF0ZV9zZXRfc2FtcGxlX2lkKGZzX2luc3QgKmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzEpOworICAgdm9pZCBnZW5lcmF0ZV9zZXRfc2ltZDR4Ml9vZmZzZXQoZnNfaW5zdCAqaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBvZmZzZXQpOworICAgdm9pZCBnZW5lcmF0ZV9wYWNrX2hhbGZfMngxNl9zcGxpdChmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHkpOworICAgdm9pZCBnZW5lcmF0ZV91bnBhY2tfaGFsZl8yeDE2X3NwbGl0KGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX3VudHlwZWRfYXRvbWljKGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgYXRvbWljX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzdXJmX2luZGV4KTsKKworICAgdm9pZCBnZW5lcmF0ZV91bnR5cGVkX3N1cmZhY2VfcmVhZChmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHN1cmZfaW5kZXgpOworICAgdm9pZCBnZW5lcmF0ZV9kaXNjYXJkX2p1bXAoZnNfaW5zdCAqaXIpOworCisgICB2b2lkIHBhdGNoX2Rpc2NhcmRfanVtcHNfdG9fZmJfd3JpdGVzKCk7CisKKyAgIHN0cnVjdCBicndfd21fY29tcGlsZSAqYzsKKyAgIGNvbnN0IHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcDsKKworICAgdW5zaWduZWQgZGlzcGF0Y2hfd2lkdGg7IC8qKiA4IG9yIDE2ICovCisKKyAgIGJvb2wgZHVhbF9zb3VyY2Vfb3V0cHV0OworCisgICBleGVjX2xpc3QgZGlzY2FyZF9oYWx0X3BhdGNoZXM7Cit9OworCitib29sIGJyd19kb19jaGFubmVsX2V4cHJlc3Npb25zKHN0cnVjdCBleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGJyd19kb192ZWN0b3Jfc3BsaXR0aW5nKHN0cnVjdCBleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7Citib29sIGJyd19mc19wcmVjb21waWxlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyk7CisKK3N0cnVjdCBicndfcmVnIGJyd19yZWdfZnJvbV9mc19yZWcoZnNfcmVnICpyZWcpOwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19jaGFubmVsX2V4cHJlc3Npb25zLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfY2hhbm5lbF9leHByZXNzaW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiYmQzNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfY2hhbm5lbF9leHByZXNzaW9ucy5jcHAKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGJyd193bV9jaGFubmVsX2V4cHJlc3Npb25zLmNwcAorICoKKyAqIEJyZWFrcyB2ZWN0b3Igb3BlcmF0aW9ucyBkb3duIGludG8gb3BlcmF0aW9ucyBvbiBlYWNoIGNvbXBvbmVudC4KKyAqCisgKiBUaGUgOTY1IGZyYWdtZW50IHNoYWRlciByZWNlaXZlcyA4IG9yIDE2IHBpeGVscyBhdCBhIHRpbWUsIHNvIGVhY2gKKyAqIGNoYW5uZWwgb2YgYSB2ZWN0b3IgaXMgbGFpZCBvdXQgYXMgMSBvciAyIDgtZmxvYXQgcmVnaXN0ZXJzLiAgRWFjaAorICogQUxVIG9wZXJhdGlvbiBvcGVyYXRlcyBvbiBvbmUgb2YgdGhvc2UgY2hhbm5lbCByZWdpc3RlcnMuICBBcyBhCisgKiByZXN1bHQsIHRoZXJlIGlzIG5vIHZhbHVlIHRvIHRoZSA5NjUgZnJhZ21lbnQgc2hhZGVyIGluIHRyYWNraW5nCisgKiAidmVjdG9yIiBleHByZXNzaW9ucyBpbiB0aGUgc2Vuc2Ugb2YgR0xTTCBmcmFnbWVudCBzaGFkZXJzLCB3aGVuCisgKiBkb2luZyBhIGNoYW5uZWwgYXQgYSB0aW1lIG1heSBoZWxwIGluIGNvbnN0YW50IGZvbGRpbmcsIGFsZ2VicmFpYworICogc2ltcGxpZmljYXRpb24sIGFuZCByZWR1Y2luZyB0aGUgbGl2ZW5lc3Mgb2YgY2hhbm5lbCByZWdpc3RlcnMuCisgKgorICogVGhlIGV4Y2VwdGlvbiB0byB0aGUgZGVzaXJlIHRvIGJyZWFrIGV2ZXJ5dGhpbmcgZG93biB0byBmbG9hdHMgaXMKKyAqIHRleHR1cmluZy4gIFRoZSB0ZXh0dXJlIHNhbXBsZXIgcmV0dXJucyBhIHdyaXRlbWFza2VkIG1hc2tlZAorICogNC84LXJlZ2lzdGVyIHNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHRleHR1cmUgdmFsdWVzLiAgV2UgZG9uJ3Qgd2FudAorICogdG8gZGlzcGF0Y2ggdG8gdGhlIHNhbXBsZXIgc2VwYXJhdGVseSBmb3IgZWFjaCBjaGFubmVsIHdlIG5lZWQsIHNvCisgKiB3ZSBkbyByZXRhaW4gdGhlIHZlY3RvciB0eXBlcyBpbiB0aGF0IGNhc2UuCisgKi8KKworZXh0ZXJuICJDIiB7CisvLyNpbmNsdWRlICJtYWluL2NvcmUuaCIgLy8gTHVuYXJHIDogUmVtb3ZlZAorI2luY2x1ZGUgImJyd193bS5oIgorfQorI2luY2x1ZGUgImdsc2wvaXIuaCIKKyNpbmNsdWRlICJnbHNsL2lyX2V4cHJlc3Npb25fZmxhdHRlbmluZy5oIgorI2luY2x1ZGUgImdsc2wvZ2xzbF90eXBlcy5oIgorCitjbGFzcyBpcl9jaGFubmVsX2V4cHJlc3Npb25zX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfY2hhbm5lbF9leHByZXNzaW9uc192aXNpdG9yKCkKKyAgIHsKKyAgICAgIHRoaXMtPnByb2dyZXNzID0gZmFsc2U7CisgICAgICB0aGlzLT5tZW1fY3R4ID0gTlVMTDsKKyAgIH0KKworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqKTsKKworICAgaXJfcnZhbHVlICpnZXRfZWxlbWVudChpcl92YXJpYWJsZSAqdmFyLCB1bnNpZ25lZCBpbnQgZWxlbWVudCk7CisgICB2b2lkIGFzc2lnbihpcl9hc3NpZ25tZW50ICppciwgaW50IGVsZW0sIGlyX3J2YWx1ZSAqdmFsKTsKKworICAgYm9vbCBwcm9ncmVzczsKKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCitzdGF0aWMgYm9vbAorY2hhbm5lbF9leHByZXNzaW9uc19wcmVkaWNhdGUoaXJfaW5zdHJ1Y3Rpb24gKmlyKQoreworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IGlyLT5hc19leHByZXNzaW9uKCk7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgaWYgKCFleHByKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBmb3IgKGkgPSAwOyBpIDwgZXhwci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKyAgICAgIGlmIChleHByLT5vcGVyYW5kc1tpXS0+dHlwZS0+aXNfdmVjdG9yKCkpCisJIHJldHVybiB0cnVlOworICAgfQorCisgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK2Jyd19kb19jaGFubmVsX2V4cHJlc3Npb25zKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaXJfY2hhbm5lbF9leHByZXNzaW9uc192aXNpdG9yIHY7CisKKyAgIC8qIFB1bGwgb3V0IGFueSBtYXRyaXggZXhwcmVzc2lvbiB0byBhIHNlcGFyYXRlIGFzc2lnbm1lbnQgdG8gYQorICAgICogdGVtcC4gIFRoaXMgd2lsbCBtYWtlIG91ciBoYW5kbGluZyBvZiB0aGUgYnJlYWtkb3duIHRvCisgICAgKiBvcGVyYXRpb25zIG9uIHRoZSBtYXRyaXgncyB2ZWN0b3IgY29tcG9uZW50cyBtdWNoIGVhc2llci4KKyAgICAqLworICAgZG9fZXhwcmVzc2lvbl9mbGF0dGVuaW5nKGluc3RydWN0aW9ucywgY2hhbm5lbF9leHByZXNzaW9uc19wcmVkaWNhdGUpOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KKworaXJfcnZhbHVlICoKK2lyX2NoYW5uZWxfZXhwcmVzc2lvbnNfdmlzaXRvcjo6Z2V0X2VsZW1lbnQoaXJfdmFyaWFibGUgKnZhciwgdW5zaWduZWQgaW50IGVsZW0pCit7CisgICBpcl9kZXJlZmVyZW5jZSAqZGVyZWY7CisKKyAgIGlmICh2YXItPnR5cGUtPmlzX3NjYWxhcigpKQorICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworCisgICBhc3NlcnQoZWxlbSA8IHZhci0+dHlwZS0+Y29tcG9uZW50cygpKTsKKyAgIGRlcmVmID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX3N3aXp6bGUoZGVyZWYsIGVsZW0sIDAsIDAsIDAsIDEpOworfQorCit2b2lkCitpcl9jaGFubmVsX2V4cHJlc3Npb25zX3Zpc2l0b3I6OmFzc2lnbihpcl9hc3NpZ25tZW50ICppciwgaW50IGVsZW0sIGlyX3J2YWx1ZSAqdmFsKQoreworICAgaXJfZGVyZWZlcmVuY2UgKmxocyA9IGlyLT5saHMtPmNsb25lKG1lbV9jdHgsIE5VTEwpOworICAgaXJfYXNzaWdubWVudCAqYXNzaWduOworCisgICAvKiBUaGlzIGFzc2lnbi1vZi1leHByZXNzaW9uIHNob3VsZCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZQorICAgICogZXhwcmVzc2lvbiBmbGF0dGVuaW5nIHZpc2l0b3IgKHNpbmNlIHdlIG5ldmVyIHNob3J0IGNpcmNpdCB0bworICAgICogbm90IGZsYXR0ZW4sIGV2ZW4gZm9yIHBsYWluIGFzc2lnbm1lbnRzIG9mIHZhcmlhYmxlcyksIHNvIHRoZQorICAgICogd3JpdGVtYXNrIGlzIGFsd2F5cyBmdWxsLgorICAgICovCisgICBhc3NlcnQoaXItPndyaXRlX21hc2sgPT0gKDEgPDwgaXItPmxocy0+dHlwZS0+Y29tcG9uZW50cygpKSAtIDEpOworCisgICBhc3NpZ24gPSBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChsaHMsIHZhbCwgTlVMTCwgKDEgPDwgZWxlbSkpOworICAgaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NoYW5uZWxfZXhwcmVzc2lvbnNfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpcl9leHByZXNzaW9uICpleHByID0gaXItPnJocy0+YXNfZXhwcmVzc2lvbigpOworICAgYm9vbCBmb3VuZF92ZWN0b3IgPSBmYWxzZTsKKyAgIHVuc2lnbmVkIGludCBpLCB2ZWN0b3JfZWxlbWVudHMgPSAxOworICAgaXJfdmFyaWFibGUgKm9wX3ZhclszXTsKKworICAgaWYgKCFleHByKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICBpZiAoIXRoaXMtPm1lbV9jdHgpCisgICAgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX3BhcmVudChpcik7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBleHByLT5nZXRfbnVtX29wZXJhbmRzKCk7IGkrKykgeworICAgICAgaWYgKGV4cHItPm9wZXJhbmRzW2ldLT50eXBlLT5pc192ZWN0b3IoKSkgeworCSBmb3VuZF92ZWN0b3IgPSB0cnVlOworCSB2ZWN0b3JfZWxlbWVudHMgPSBleHByLT5vcGVyYW5kc1tpXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOworCSBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIGlmICghZm91bmRfdmVjdG9yKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICAvKiBTdG9yZSB0aGUgZXhwcmVzc2lvbiBvcGVyYW5kcyBpbiB0ZW1wcyBzbyB3ZSBjYW4gdXNlIHRoZW0KKyAgICAqIG11bHRpcGxlIHRpbWVzLgorICAgICovCisgICBmb3IgKGkgPSAwOyBpIDwgZXhwci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKyAgICAgIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbjsKKyAgICAgIGlyX2RlcmVmZXJlbmNlICpkZXJlZjsKKworICAgICAgYXNzZXJ0KCFleHByLT5vcGVyYW5kc1tpXS0+dHlwZS0+aXNfbWF0cml4KCkpOworCisgICAgICBvcF92YXJbaV0gPSBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZXhwci0+b3BlcmFuZHNbaV0tPnR5cGUsCisJCQkJCSAgICJjaGFubmVsX2V4cHJlc3Npb25zIiwKKwkJCQkJICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICBpci0+aW5zZXJ0X2JlZm9yZShvcF92YXJbaV0pOworCisgICAgICBkZXJlZiA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShvcF92YXJbaV0pOworICAgICAgYXNzaWduID0gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQoZGVyZWYsCisJCQkJCSAgZXhwci0+b3BlcmFuZHNbaV0sCisJCQkJCSAgTlVMTCk7CisgICAgICBpci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworICAgfQorCisgICBjb25zdCBnbHNsX3R5cGUgKmVsZW1lbnRfdHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKGlyLT5saHMtPnR5cGUtPmJhc2VfdHlwZSwKKwkJCQkJCQkgICAxLCAxKTsKKworICAgLyogT0ssIHRpbWUgdG8gYnJlYWsgZG93biB0aGlzIHZlY3RvciBvcGVyYXRpb24uICovCisgICBzd2l0Y2ggKGV4cHItPm9wZXJhdGlvbikgeworICAgY2FzZSBpcl91bm9wX2JpdF9ub3Q6CisgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OgorICAgY2FzZSBpcl91bm9wX25lZzoKKyAgIGNhc2UgaXJfdW5vcF9hYnM6CisgICBjYXNlIGlyX3Vub3Bfc2lnbjoKKyAgIGNhc2UgaXJfdW5vcF9yY3A6CisgICBjYXNlIGlyX3Vub3BfcnNxOgorICAgY2FzZSBpcl91bm9wX3NxcnQ6CisgICBjYXNlIGlyX3Vub3BfZXhwOgorICAgY2FzZSBpcl91bm9wX2xvZzoKKyAgIGNhc2UgaXJfdW5vcF9leHAyOgorICAgY2FzZSBpcl91bm9wX2xvZzI6CisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF9pMmY6CisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF9mMmk6CisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF9mMnU6CisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF91MmY6CisgICBjYXNlIGlyX3Vub3BfaTJ1OgorICAgY2FzZSBpcl91bm9wX3UyaToKKyAgIGNhc2UgaXJfdW5vcF9mMmk6CisgICBjYXNlIGlyX3Vub3BfZjJ1OgorICAgY2FzZSBpcl91bm9wX2kyZjoKKyAgIGNhc2UgaXJfdW5vcF9mMmI6CisgICBjYXNlIGlyX3Vub3BfYjJmOgorICAgY2FzZSBpcl91bm9wX2kyYjoKKyAgIGNhc2UgaXJfdW5vcF9iMmk6CisgICBjYXNlIGlyX3Vub3BfdTJmOgorICAgY2FzZSBpcl91bm9wX3RydW5jOgorICAgY2FzZSBpcl91bm9wX2NlaWw6CisgICBjYXNlIGlyX3Vub3BfZmxvb3I6CisgICBjYXNlIGlyX3Vub3BfZnJhY3Q6CisgICBjYXNlIGlyX3Vub3Bfcm91bmRfZXZlbjoKKyAgIGNhc2UgaXJfdW5vcF9zaW46CisgICBjYXNlIGlyX3Vub3BfY29zOgorICAgY2FzZSBpcl91bm9wX3Npbl9yZWR1Y2VkOgorICAgY2FzZSBpcl91bm9wX2Nvc19yZWR1Y2VkOgorICAgY2FzZSBpcl91bm9wX2RGZHg6CisgICBjYXNlIGlyX3Vub3BfZEZkeToKKyAgIGNhc2UgaXJfdW5vcF9iaXRmaWVsZF9yZXZlcnNlOgorICAgY2FzZSBpcl91bm9wX2JpdF9jb3VudDoKKyAgIGNhc2UgaXJfdW5vcF9maW5kX21zYjoKKyAgIGNhc2UgaXJfdW5vcF9maW5kX2xzYjoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBpcl9ydmFsdWUgKm9wMCA9IGdldF9lbGVtZW50KG9wX3ZhclswXSwgaSk7CisKKwkgYXNzaWduKGlyLCBpLCBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihleHByLT5vcGVyYXRpb24sCisJCQkJCQkgIGVsZW1lbnRfdHlwZSwKKwkJCQkJCSAgb3AwLAorCQkJCQkJICBOVUxMKSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9hZGQ6CisgICBjYXNlIGlyX2Jpbm9wX3N1YjoKKyAgIGNhc2UgaXJfYmlub3BfbXVsOgorICAgY2FzZSBpcl9iaW5vcF9pbXVsX2hpZ2g6CisgICBjYXNlIGlyX2Jpbm9wX2RpdjoKKyAgIGNhc2UgaXJfYmlub3BfY2Fycnk6CisgICBjYXNlIGlyX2Jpbm9wX2JvcnJvdzoKKyAgIGNhc2UgaXJfYmlub3BfbW9kOgorICAgY2FzZSBpcl9iaW5vcF9taW46CisgICBjYXNlIGlyX2Jpbm9wX21heDoKKyAgIGNhc2UgaXJfYmlub3BfcG93OgorICAgY2FzZSBpcl9iaW5vcF9sc2hpZnQ6CisgICBjYXNlIGlyX2Jpbm9wX3JzaGlmdDoKKyAgIGNhc2UgaXJfYmlub3BfYml0X2FuZDoKKyAgIGNhc2UgaXJfYmlub3BfYml0X3hvcjoKKyAgIGNhc2UgaXJfYmlub3BfYml0X29yOgorICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgY2FzZSBpcl9iaW5vcF9ncmVhdGVyOgorICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX25lcXVhbDoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBpcl9ydmFsdWUgKm9wMCA9IGdldF9lbGVtZW50KG9wX3ZhclswXSwgaSk7CisJIGlyX3J2YWx1ZSAqb3AxID0gZ2V0X2VsZW1lbnQob3BfdmFyWzFdLCBpKTsKKworCSBhc3NpZ24oaXIsIGksIG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGV4cHItPm9wZXJhdGlvbiwKKwkJCQkJCSAgZWxlbWVudF90eXBlLAorCQkJCQkJICBvcDAsCisJCQkJCQkgIG9wMSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9hbnk6IHsKKyAgICAgIGlyX2V4cHJlc3Npb24gKnRlbXA7CisgICAgICB0ZW1wID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbG9naWNfb3IsCisJCQkJCWVsZW1lbnRfdHlwZSwKKwkJCQkJZ2V0X2VsZW1lbnQob3BfdmFyWzBdLCAwKSwKKwkJCQkJZ2V0X2VsZW1lbnQob3BfdmFyWzBdLCAxKSk7CisKKyAgICAgIGZvciAoaSA9IDI7IGkgPCB2ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSB0ZW1wID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbG9naWNfb3IsCisJCQkJCSAgIGVsZW1lbnRfdHlwZSwKKwkJCQkJICAgZ2V0X2VsZW1lbnQob3BfdmFyWzBdLCBpKSwKKwkJCQkJICAgdGVtcCk7CisgICAgICB9CisgICAgICBhc3NpZ24oaXIsIDAsIHRlbXApOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfYmlub3BfZG90OiB7CisgICAgICBpcl9leHByZXNzaW9uICpsYXN0ID0gTlVMTDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBpcl9ydmFsdWUgKm9wMCA9IGdldF9lbGVtZW50KG9wX3ZhclswXSwgaSk7CisJIGlyX3J2YWx1ZSAqb3AxID0gZ2V0X2VsZW1lbnQob3BfdmFyWzFdLCBpKTsKKwkgaXJfZXhwcmVzc2lvbiAqdGVtcDsKKworCSB0ZW1wID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbXVsLAorCQkJCQkgICBlbGVtZW50X3R5cGUsCisJCQkJCSAgIG9wMCwKKwkJCQkJICAgb3AxKTsKKwkgaWYgKGxhc3QpIHsKKwkgICAgbGFzdCA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX2FkZCwKKwkJCQkJICAgICAgZWxlbWVudF90eXBlLAorCQkJCQkgICAgICB0ZW1wLAorCQkJCQkgICAgICBsYXN0KTsKKwkgfSBlbHNlIHsKKwkgICAgbGFzdCA9IHRlbXA7CisJIH0KKyAgICAgIH0KKyAgICAgIGFzc2lnbihpciwgMCwgbGFzdCk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBpcl9iaW5vcF9sb2dpY19hbmQ6CisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX3hvcjoKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfb3I6CisgICAgICBpci0+ZnByaW50KHN0ZGVycik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogZXhwcmVzc2lvbiBvcGVyYXRlcyBvbiBzY2FsYXJzIG9ubHkiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9hbGxfZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2FueV9uZXF1YWw6IHsKKyAgICAgIGlyX2V4cHJlc3Npb24gKmxhc3QgPSBOVUxMOworICAgICAgZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIGlyX3J2YWx1ZSAqb3AwID0gZ2V0X2VsZW1lbnQob3BfdmFyWzBdLCBpKTsKKwkgaXJfcnZhbHVlICpvcDEgPSBnZXRfZWxlbWVudChvcF92YXJbMV0sIGkpOworCSBpcl9leHByZXNzaW9uICp0ZW1wOworCSBpcl9leHByZXNzaW9uX29wZXJhdGlvbiBqb2luOworCisJIGlmIChleHByLT5vcGVyYXRpb24gPT0gaXJfYmlub3BfYWxsX2VxdWFsKQorCSAgICBqb2luID0gaXJfYmlub3BfbG9naWNfYW5kOworCSBlbHNlCisJICAgIGpvaW4gPSBpcl9iaW5vcF9sb2dpY19vcjsKKworCSB0ZW1wID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oZXhwci0+b3BlcmF0aW9uLAorCQkJCQkgICBlbGVtZW50X3R5cGUsCisJCQkJCSAgIG9wMCwKKwkJCQkJICAgb3AxKTsKKwkgaWYgKGxhc3QpIHsKKwkgICAgbGFzdCA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGpvaW4sCisJCQkJCSAgICAgIGVsZW1lbnRfdHlwZSwKKwkJCQkJICAgICAgdGVtcCwKKwkJCQkJICAgICAgbGFzdCk7CisJIH0gZWxzZSB7CisJICAgIGxhc3QgPSB0ZW1wOworCSB9CisgICAgICB9CisgICAgICBhc3NpZ24oaXIsIDAsIGxhc3QpOworICAgICAgYnJlYWs7CisgICB9CisgICBjYXNlIGlyX3Vub3Bfbm9pc2U6CisgICAgICBhc3NlcnQoISJub2lzZSBzaG91bGQgaGF2ZSBiZWVuIGJyb2tlbiBkb3duIHRvIGZ1bmN0aW9uIGNhbGwiKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2JmbTogeworICAgICAgLyogRG9lcyBub3QgbmVlZCB0byBiZSBzY2FsYXJpemVkLCBzaW5jZSBpdHMgcmVzdWx0IHdpbGwgYmUgaWRlbnRpY2FsCisgICAgICAgKiBmb3IgYWxsIGNoYW5uZWxzLgorICAgICAgICovCisgICAgICBpcl9ydmFsdWUgKm9wMCA9IGdldF9lbGVtZW50KG9wX3ZhclswXSwgMCk7CisgICAgICBpcl9ydmFsdWUgKm9wMSA9IGdldF9lbGVtZW50KG9wX3ZhclsxXSwgMCk7CisKKyAgICAgIGFzc2lnbihpciwgMCwgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oZXhwci0+b3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AxKSk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBpcl9iaW5vcF91Ym9fbG9hZDoKKyAgICAgIGFzc2VydCghIm5vdCB5ZXQgc3VwcG9ydGVkIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF9mbWE6CisgICBjYXNlIGlyX3RyaW9wX2xycDoKKyAgIGNhc2UgaXJfdHJpb3BfY3NlbDoKKyAgIGNhc2UgaXJfdHJpb3BfYml0ZmllbGRfZXh0cmFjdDoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBpcl9ydmFsdWUgKm9wMCA9IGdldF9lbGVtZW50KG9wX3ZhclswXSwgaSk7CisJIGlyX3J2YWx1ZSAqb3AxID0gZ2V0X2VsZW1lbnQob3BfdmFyWzFdLCBpKTsKKwkgaXJfcnZhbHVlICpvcDIgPSBnZXRfZWxlbWVudChvcF92YXJbMl0sIGkpOworCisJIGFzc2lnbihpciwgaSwgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oZXhwci0+b3BlcmF0aW9uLAorCQkJCQkJICBlbGVtZW50X3R5cGUsCisJCQkJCQkgIG9wMCwKKwkJCQkJCSAgb3AxLAorCQkJCQkJICBvcDIpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2JmaTogeworICAgICAgLyogT25seSBhIHNpbmdsZSBCRk0gaXMgbmVlZGVkIGZvciBtdWx0aXBsZSBCRklzLiAqLworICAgICAgaXJfcnZhbHVlICpvcDAgPSBnZXRfZWxlbWVudChvcF92YXJbMF0sIDApOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgIGlyX3J2YWx1ZSAqb3AxID0gZ2V0X2VsZW1lbnQob3BfdmFyWzFdLCBpKTsKKyAgICAgICAgIGlyX3J2YWx1ZSAqb3AyID0gZ2V0X2VsZW1lbnQob3BfdmFyWzJdLCBpKTsKKworICAgICAgICAgYXNzaWduKGlyLCBpLCBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihleHByLT5vcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AwLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcDIpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGlyX3Vub3BfcGFja19zbm9ybV8yeDE2OgorICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fNHg4OgorICAgY2FzZSBpcl91bm9wX3BhY2tfdW5vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Vub3JtXzR4ODoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX2hhbGZfMngxNjoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfc25vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfc25vcm1fNHg4OgorICAgY2FzZSBpcl91bm9wX3VucGFja191bm9ybV8yeDE2OgorICAgY2FzZSBpcl91bm9wX3VucGFja191bm9ybV80eDg6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNjoKKyAgIGNhc2UgaXJfYmlub3BfbGRleHA6CisgICBjYXNlIGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0OgorICAgY2FzZSBpcl90cmlvcF92ZWN0b3JfaW5zZXJ0OgorICAgY2FzZSBpcl9xdWFkb3BfYml0ZmllbGRfaW5zZXJ0OgorICAgY2FzZSBpcl9xdWFkb3BfdmVjdG9yOgorICAgICAgYXNzZXJ0KCEic2hvdWxkIGhhdmUgYmVlbiBsb3dlcmVkIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTZfc3BsaXRfeDoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3k6CisgICBjYXNlIGlyX2Jpbm9wX3BhY2tfaGFsZl8yeDE2X3NwbGl0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IGV4cHJlc3Npb24gb3BlcmF0ZXMgb24gc2NhbGFycyBvbmx5Iik7CisgICAgICBicmVhazsKKyAgIH0KKworICAgaXItPnJlbW92ZSgpOworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2NvcHlfcHJvcGFnYXRpb24uY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19jb3B5X3Byb3BhZ2F0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE0OWM4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19jb3B5X3Byb3BhZ2F0aW9uLmNwcApAQCAtMCwwICsxLDYzMiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKiBAZmlsZSBicndfZnNfY29weV9wcm9wYWdhdGlvbi5jcHAKKyAqCisgKiBTdXBwb3J0IGZvciBnbG9iYWwgY29weSBwcm9wYWdhdGlvbiBpbiB0d28gcGFzc2VzOiBBIGxvY2FsIHBhc3MgdGhhdCBkb2VzCisgKiBpbnRyYS1ibG9jayBjb3B5IChhbmQgY29uc3RhbnQpIHByb3BhZ2F0aW9uLCBhbmQgYSBnbG9iYWwgcGFzcyB0aGF0IHVzZXMKKyAqIGRhdGFmbG93IGFuYWx5c2lzIG9uIHRoZSBjb3BpZXMgYXZhaWxhYmxlIGF0IHRoZSBlbmQgb2YgZWFjaCBibG9jayB0byByZS1kbworICogbG9jYWwgY29weSBwcm9wYWdhdGlvbiB3aXRoIG1vcmUgY29waWVzIGF2YWlsYWJsZS4KKyAqCisgKiBTZWUgTXVjaG5pY2sncyBBZHZhbmNlZCBDb21waWxlciBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uLCBzZWN0aW9uCisgKiAxMi41IChwMzU2KS4KKyAqLworCisjZGVmaW5lIEFDUF9IQVNIX1NJWkUgMTYKKworI2luY2x1ZGUgIm1haW4vYml0c2V0LmgiCisjaW5jbHVkZSAiYnJ3X2ZzLmgiCisjaW5jbHVkZSAiYnJ3X2NmZy5oIgorCituYW1lc3BhY2UgeyAvKiBhdm9pZCBjb25mbGljdCB3aXRoIG9wdF9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzICovCitzdHJ1Y3QgYWNwX2VudHJ5IDogcHVibGljIGV4ZWNfbm9kZSB7CisgICBmc19yZWcgZHN0OworICAgZnNfcmVnIHNyYzsKK307CisKK3N0cnVjdCBibG9ja19kYXRhIHsKKyAgIC8qKgorICAgICogV2hpY2ggZW50cmllcyBpbiB0aGUgZnNfY29weV9wcm9wX2RhdGFmbG93IGFjcCB0YWJsZSBhcmUgbGl2ZSBhdCB0aGUKKyAgICAqIHN0YXJ0IG9mIHRoaXMgYmxvY2suICBUaGlzIGlzIHRoZSB1c2VmdWwgb3V0cHV0IG9mIHRoZSBhbmFseXNpcywgc2luY2UKKyAgICAqIGl0IGxldHMgdXMgcGx1ZyB0aG9zZSBpbnRvIHRoZSBsb2NhbCBjb3B5IHByb3BhZ2F0aW9uIG9uIHRoZSBzZWNvbmQKKyAgICAqIHBhc3MuCisgICAgKi8KKyAgIEJJVFNFVF9XT1JEICpsaXZlaW47CisKKyAgIC8qKgorICAgICogV2hpY2ggZW50cmllcyBpbiB0aGUgZnNfY29weV9wcm9wX2RhdGFmbG93IGFjcCB0YWJsZSBhcmUgbGl2ZSBhdCB0aGUgZW5kCisgICAgKiBvZiB0aGlzIGJsb2NrLiAgVGhpcyBpcyBkb25lIGluIGluaXRpYWwgc2V0dXAgZnJvbSB0aGUgcGVyLWJsb2NrIGFjcHMKKyAgICAqIHJldHVybmVkIGJ5IHRoZSBmaXJzdCBsb2NhbCBjb3B5IHByb3AgcGFzcy4KKyAgICAqLworICAgQklUU0VUX1dPUkQgKmxpdmVvdXQ7CisKKyAgIC8qKgorICAgICogV2hpY2ggZW50cmllcyBpbiB0aGUgZnNfY29weV9wcm9wX2RhdGFmbG93IGFjcCB0YWJsZSBhcmUgZ2VuZXJhdGVkIGJ5CisgICAgKiBpbnN0cnVjdGlvbnMgaW4gdGhpcyBibG9jayB3aGljaCByZWFjaCB0aGUgZW5kIG9mIHRoZSBibG9jayB3aXRob3V0CisgICAgKiBiZWluZyBraWxsZWQuCisgICAgKi8KKyAgIEJJVFNFVF9XT1JEICpjb3B5OworCisgICAvKioKKyAgICAqIFdoaWNoIGVudHJpZXMgaW4gdGhlIGZzX2NvcHlfcHJvcF9kYXRhZmxvdyBhY3AgdGFibGUgYXJlIGtpbGxlZCBvdmVyIHRoZQorICAgICogY291cnNlIG9mIHRoaXMgYmxvY2suCisgICAgKi8KKyAgIEJJVFNFVF9XT1JEICpraWxsOworfTsKKworY2xhc3MgZnNfY29weV9wcm9wX2RhdGFmbG93Cit7CitwdWJsaWM6CisgICBmc19jb3B5X3Byb3BfZGF0YWZsb3codm9pZCAqbWVtX2N0eCwgY2ZnX3QgKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBleGVjX2xpc3QgKm91dF9hY3BbQUNQX0hBU0hfU0laRV0pOworCisgICB2b2lkIHNldHVwX2luaXRpYWxfdmFsdWVzKCk7CisgICB2b2lkIHJ1bigpOworCisgICB2b2lkIGR1bXBfYmxvY2tfZGF0YSgpIGNvbnN0OworCisgICB2b2lkICptZW1fY3R4OworICAgY2ZnX3QgKmNmZzsKKworICAgYWNwX2VudHJ5ICoqYWNwOworICAgaW50IG51bV9hY3A7CisgICBpbnQgYml0c2V0X3dvcmRzOworCisgIHN0cnVjdCBibG9ja19kYXRhICpiZDsKK307Cit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworZnNfY29weV9wcm9wX2RhdGFmbG93Ojpmc19jb3B5X3Byb3BfZGF0YWZsb3codm9pZCAqbWVtX2N0eCwgY2ZnX3QgKmNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNfbGlzdCAqb3V0X2FjcFtBQ1BfSEFTSF9TSVpFXSkKKyAgIDogbWVtX2N0eChtZW1fY3R4KSwgY2ZnKGNmZykKK3sKKyAgIGJkID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBzdHJ1Y3QgYmxvY2tfZGF0YSwgY2ZnLT5udW1fYmxvY2tzKTsKKworICAgbnVtX2FjcCA9IDA7CisgICBmb3IgKGludCBiID0gMDsgYiA8IGNmZy0+bnVtX2Jsb2NrczsgYisrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFDUF9IQVNIX1NJWkU7IGkrKykgeworICAgICAgICAgZm9yZWFjaF9saXN0KGVudHJ5X25vZGUsICZvdXRfYWNwW2JdW2ldKSB7CisgICAgICAgICAgICBudW1fYWNwKys7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGFjcCA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgc3RydWN0IGFjcF9lbnRyeSAqLCBudW1fYWNwKTsKKworICAgYml0c2V0X3dvcmRzID0gQklUU0VUX1dPUkRTKG51bV9hY3ApOworCisgICBpbnQgbmV4dF9hY3AgPSAwOworICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjZmctPm51bV9ibG9ja3M7IGIrKykgeworICAgICAgYmRbYl0ubGl2ZWluID0gcnphbGxvY19hcnJheShiZCwgQklUU0VUX1dPUkQsIGJpdHNldF93b3Jkcyk7CisgICAgICBiZFtiXS5saXZlb3V0ID0gcnphbGxvY19hcnJheShiZCwgQklUU0VUX1dPUkQsIGJpdHNldF93b3Jkcyk7CisgICAgICBiZFtiXS5jb3B5ID0gcnphbGxvY19hcnJheShiZCwgQklUU0VUX1dPUkQsIGJpdHNldF93b3Jkcyk7CisgICAgICBiZFtiXS5raWxsID0gcnphbGxvY19hcnJheShiZCwgQklUU0VUX1dPUkQsIGJpdHNldF93b3Jkcyk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQUNQX0hBU0hfU0laRTsgaSsrKSB7CisgICAgICAgICBmb3JlYWNoX2xpc3QoZW50cnlfbm9kZSwgJm91dF9hY3BbYl1baV0pIHsKKyAgICAgICAgICAgIGFjcF9lbnRyeSAqZW50cnkgPSAoYWNwX2VudHJ5ICopZW50cnlfbm9kZTsKKworICAgICAgICAgICAgYWNwW25leHRfYWNwXSA9IGVudHJ5OworCisgICAgICAgICAgICAvKiBvcHRfY29weV9wcm9wYWdhdGVfbG9jYWwgcG9wdWxhdGVzIG91dF9hY3Agd2l0aCBjb3BpZXMgY3JlYXRlZAorICAgICAgICAgICAgICogaW4gYSBibG9jayB3aGljaCBhcmUgc3RpbGwgbGl2ZSBhdCB0aGUgZW5kIG9mIHRoZSBibG9jay4gIFRoaXMKKyAgICAgICAgICAgICAqIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50IGluIHRoZSBDT1BZIHNldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQklUU0VUX1NFVChiZFtiXS5jb3B5LCBuZXh0X2FjcCk7CisKKyAgICAgICAgICAgIG5leHRfYWNwKys7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGFzc2VydChuZXh0X2FjcCA9PSBudW1fYWNwKTsKKworICAgc2V0dXBfaW5pdGlhbF92YWx1ZXMoKTsKKyAgIHJ1bigpOworfQorCisvKioKKyAqIFNldCB1cCBpbml0aWFsIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZGF0YSBmbG93IHNldHMsIHByaW9yIHRvIHJ1bm5pbmcKKyAqIHRoZSBmaXhlZC1wb2ludCBhbGdvcml0aG0uCisgKi8KK3ZvaWQKK2ZzX2NvcHlfcHJvcF9kYXRhZmxvdzo6c2V0dXBfaW5pdGlhbF92YWx1ZXMoKQoreworICAgLyogSW5pdGlhbGl6ZSB0aGUgQ09QWSBhbmQgS0lMTCBzZXRzLiAqLworICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjZmctPm51bV9ibG9ja3M7IGIrKykgeworICAgICAgYmJsb2NrX3QgKmJsb2NrID0gY2ZnLT5ibG9ja3NbYl07CisKKyAgICAgIGZvciAoZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopYmxvY2stPnN0YXJ0OworICAgICAgICAgICBpbnN0ICE9IGJsb2NrLT5lbmQtPm5leHQ7CisgICAgICAgICAgIGluc3QgPSAoZnNfaW5zdCAqKWluc3QtPm5leHQpIHsKKyAgICAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSAhPSBHUkYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgLyogTWFyayBBQ1AgZW50cmllcyB3aGljaCBhcmUga2lsbGVkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uICovCisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hY3A7IGkrKykgeworICAgICAgICAgICAgaWYgKGluc3QtPm92ZXJ3cml0ZXNfcmVnKGFjcFtpXS0+ZHN0KSB8fAorICAgICAgICAgICAgICAgIGluc3QtPm92ZXJ3cml0ZXNfcmVnKGFjcFtpXS0+c3JjKSkgeworICAgICAgICAgICAgICAgQklUU0VUX1NFVChiZFtiXS5raWxsLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogUG9wdWxhdGUgdGhlIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgbGl2ZWluIGFuZCBsaXZlb3V0IHNldHMuICBGb3IgdGhlCisgICAgKiBibG9jayBhdCB0aGUgc3RhcnQgb2YgdGhlIHByb2dyYW0sIGxpdmVpbiA9IDAgYW5kIGxpdmVvdXQgPSBjb3B5LgorICAgICogRm9yIHRoZSBvdGhlcnMsIHNldCBsaXZlb3V0IHRvIDAgKHRoZSBlbXB0eSBzZXQpIGFuZCBsaXZlaW4gdG8gfjAKKyAgICAqICh0aGUgdW5pdmVyc2FsIHNldCkuCisgICAgKi8KKyAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLT5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgIGJibG9ja190ICpibG9jayA9IGNmZy0+YmxvY2tzW2JdOworICAgICAgaWYgKGJsb2NrLT5wYXJlbnRzLmlzX2VtcHR5KCkpIHsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYml0c2V0X3dvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIGJkW2JdLmxpdmVpbltpXSA9IDB1OworICAgICAgICAgICAgYmRbYl0ubGl2ZW91dFtpXSA9IGJkW2JdLmNvcHlbaV07CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzZXRfd29yZHM7IGkrKykgeworICAgICAgICAgICAgYmRbYl0ubGl2ZW91dFtpXSA9IDB1OworICAgICAgICAgICAgYmRbYl0ubGl2ZWluW2ldID0gfjB1OworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisvKioKKyAqIFdhbGsgdGhlIHNldCBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIGJsb2NrLCBtYXJraW5nIHdoaWNoIGVudHJpZXMgaW4gdGhlIGFjcAorICogYXJlIGtpbGxlZCBieSB0aGUgYmxvY2suCisgKi8KK3ZvaWQKK2ZzX2NvcHlfcHJvcF9kYXRhZmxvdzo6cnVuKCkKK3sKKyAgIGJvb2wgcHJvZ3Jlc3M7CisKKyAgIGRvIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisKKyAgICAgIC8qIFVwZGF0ZSBsaXZlb3V0IGZvciBhbGwgYmxvY2tzLiAqLworICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjZmctPm51bV9ibG9ja3M7IGIrKykgeworICAgICAgICAgaWYgKGNmZy0+YmxvY2tzW2JdLT5wYXJlbnRzLmlzX2VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzZXRfd29yZHM7IGkrKykgeworICAgICAgICAgICAgY29uc3QgQklUU0VUX1dPUkQgb2xkX2xpdmVvdXQgPSBiZFtiXS5saXZlb3V0W2ldOworCisgICAgICAgICAgICBiZFtiXS5saXZlb3V0W2ldID0KKyAgICAgICAgICAgICAgIGJkW2JdLmNvcHlbaV0gfCAoYmRbYl0ubGl2ZWluW2ldICYgfmJkW2JdLmtpbGxbaV0pOworCisgICAgICAgICAgICBpZiAob2xkX2xpdmVvdXQgIT0gYmRbYl0ubGl2ZW91dFtpXSkKKyAgICAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogVXBkYXRlIGxpdmVpbiBmb3IgYWxsIGJsb2Nrcy4gIElmIGEgY29weSBpcyBsaXZlIG91dCBvZiBhbGwgcGFyZW50CisgICAgICAgKiBibG9ja3MsIGl0J3MgbGl2ZSBjb21pbmcgaW4gdG8gdGhpcyBibG9jay4KKyAgICAgICAqLworICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjZmctPm51bV9ibG9ja3M7IGIrKykgeworICAgICAgICAgaWYgKGNmZy0+YmxvY2tzW2JdLT5wYXJlbnRzLmlzX2VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzZXRfd29yZHM7IGkrKykgeworICAgICAgICAgICAgY29uc3QgQklUU0VUX1dPUkQgb2xkX2xpdmVpbiA9IGJkW2JdLmxpdmVpbltpXTsKKworICAgICAgICAgICAgYmRbYl0ubGl2ZWluW2ldID0gfjB1OworICAgICAgICAgICAgZm9yZWFjaF9saXN0KGJsb2NrX25vZGUsICZjZmctPmJsb2Nrc1tiXS0+cGFyZW50cykgeworICAgICAgICAgICAgICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilibG9ja19ub2RlOworICAgICAgICAgICAgICAgYmJsb2NrX3QgKmJsb2NrID0gbGluay0+YmxvY2s7CisgICAgICAgICAgICAgICBiZFtiXS5saXZlaW5baV0gJj0gYmRbYmxvY2stPmJsb2NrX251bV0ubGl2ZW91dFtpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9sZF9saXZlaW4gIT0gYmRbYl0ubGl2ZWluW2ldKQorICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgfQorICAgICAgfQorICAgfSB3aGlsZSAocHJvZ3Jlc3MpOworfQorCit2b2lkCitmc19jb3B5X3Byb3BfZGF0YWZsb3c6OmR1bXBfYmxvY2tfZGF0YSgpIGNvbnN0Cit7CisgICBmb3IgKGludCBiID0gMDsgYiA8IGNmZy0+bnVtX2Jsb2NrczsgYisrKSB7CisgICAgICBiYmxvY2tfdCAqYmxvY2sgPSBjZmctPmJsb2Nrc1tiXTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQmxvY2sgJWQgWyVkLCAlZF0gKHBhcmVudHMgIiwgYmxvY2stPmJsb2NrX251bSwKKyAgICAgICAgICAgICBibG9jay0+c3RhcnRfaXAsIGJsb2NrLT5lbmRfaXApOworICAgICAgZm9yZWFjaF9saXN0KGJsb2NrX25vZGUsICZibG9jay0+cGFyZW50cykgeworICAgICAgICAgYmJsb2NrX3QgKnBhcmVudCA9ICgoYmJsb2NrX2xpbmsgKikgYmxvY2tfbm9kZSktPmJsb2NrOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZCAiLCBwYXJlbnQtPmJsb2NrX251bSk7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIik6XG4iKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIGxpdmVpbiA9IDB4Iik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpdHNldF93b3JkczsgaSsrKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlMDh4IiwgYmRbYl0ubGl2ZWluW2ldKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiLCBsaXZlb3V0ID0gMHgiKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYml0c2V0X3dvcmRzOyBpKyspCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUwOHgiLCBiZFtiXS5saXZlb3V0W2ldKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiLFxuICAgICAgIGNvcHkgICA9IDB4Iik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpdHNldF93b3JkczsgaSsrKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlMDh4IiwgYmRbYl0uY29weVtpXSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiwga2lsbCAgICA9IDB4Iik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpdHNldF93b3JkczsgaSsrKQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlMDh4IiwgYmRbYl0ua2lsbFtpXSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICB9Cit9CisKK3N0YXRpYyBib29sCitpc19sb2dpY19vcChlbnVtIG9wY29kZSBvcGNvZGUpCit7CisgICByZXR1cm4gKG9wY29kZSA9PSBCUldfT1BDT0RFX0FORCB8fAorICAgICAgICAgICBvcGNvZGUgPT0gQlJXX09QQ09ERV9PUiAgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IEJSV19PUENPREVfWE9SIHx8CisgICAgICAgICAgIG9wY29kZSA9PSBCUldfT1BDT0RFX05PVCk7Cit9CisKK2Jvb2wKK2ZzX3Zpc2l0b3I6OnRyeV9jb3B5X3Byb3BhZ2F0ZShmc19pbnN0ICppbnN0LCBpbnQgYXJnLCBhY3BfZW50cnkgKmVudHJ5KQoreworICAgaWYgKGVudHJ5LT5zcmMuZmlsZSA9PSBJTU0pCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIEJhaWwgaWYgaW5zdCBpcyByZWFkaW5nIG1vcmUgdGhhbiBlbnRyeSBpcyB3cml0aW5nLiAqLworICAgaWYgKChpbnN0LT5yZWdzX3JlYWQodGhpcywgYXJnKSAqIGluc3QtPnNyY1thcmddLnN0cmlkZSAqCisgICAgICAgIHR5cGVfc3ooaW5zdC0+c3JjW2FyZ10udHlwZSkpID4gdHlwZV9zeihlbnRyeS0+ZHN0LnR5cGUpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoaW5zdC0+c3JjW2FyZ10uZmlsZSAhPSBlbnRyeS0+ZHN0LmZpbGUgfHwKKyAgICAgICBpbnN0LT5zcmNbYXJnXS5yZWcgIT0gZW50cnktPmRzdC5yZWcgfHwKKyAgICAgICBpbnN0LT5zcmNbYXJnXS5yZWdfb2Zmc2V0ICE9IGVudHJ5LT5kc3QucmVnX29mZnNldCB8fAorICAgICAgIGluc3QtPnNyY1thcmddLnN1YnJlZ19vZmZzZXQgIT0gZW50cnktPmRzdC5zdWJyZWdfb2Zmc2V0KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIC8qIFNlZSByZXNvbHZlX3VkX25lZ2F0ZSgpIGFuZCBjb21tZW50IGluIGJyd19mc19lbWl0LmNwcC4gKi8KKyAgIGlmIChpbnN0LT5jb25kaXRpb25hbF9tb2QgJiYKKyAgICAgICBpbnN0LT5zcmNbYXJnXS50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEICYmCisgICAgICAgZW50cnktPnNyYy5uZWdhdGUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGJvb2wgaGFzX3NvdXJjZV9tb2RpZmllcnMgPSBlbnRyeS0+c3JjLmFicyB8fCBlbnRyeS0+c3JjLm5lZ2F0ZTsKKworICAgaWYgKChoYXNfc291cmNlX21vZGlmaWVycyB8fCBlbnRyeS0+c3JjLmZpbGUgPT0gVU5JRk9STSB8fAorICAgICAgICAhZW50cnktPnNyYy5pc19jb250aWd1b3VzKCkpICYmCisgICAgICAgIWNhbl9kb19zb3VyY2VfbW9kcyhpbnN0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgLyogQmFpbCBpZiB0aGUgcmVzdWx0IG9mIGNvbXBvc2luZyBib3RoIHN0cmlkZXMgd291bGQgZXhjZWVkIHRoZQorICAgICogaGFyZHdhcmUgbGltaXQuCisgICAgKi8KKyAgIGlmIChlbnRyeS0+c3JjLnN0cmlkZSAqIGluc3QtPnNyY1thcmddLnN0cmlkZSA+IDQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIEJhaWwgaWYgdGhlIHJlc3VsdCBvZiBjb21wb3NpbmcgYm90aCBzdHJpZGVzIGNhbm5vdCBiZSBleHByZXNzZWQKKyAgICAqIGFzIGFub3RoZXIgc3RyaWRlLiBUaGlzIGF2b2lkcywgZm9yIGV4YW1wbGUsIHRyeWluZyB0byB0cmFuc2Zvcm0KKyAgICAqIHRoaXM6CisgICAgKgorICAgICogICAgIE1PViAoOCkgclg8MT5VRCByWTwwOzEsMD5VRAorICAgICogICAgIEZPTyAoOCkgLi4uICAgICByWDw4OzgsMT5VVworICAgICoKKyAgICAqIGludG8gdGhpczoKKyAgICAqCisgICAgKiAgICAgRk9PICg4KSAuLi4gICAgIHJZPDA7MSwwPlVXCisgICAgKgorICAgICogV2hpY2ggd291bGQgaGF2ZSBkaWZmZXJlbnQgc2VtYW50aWNzLgorICAgICovCisgICBpZiAoZW50cnktPnNyYy5zdHJpZGUgIT0gMSAmJgorICAgICAgIChpbnN0LT5zcmNbYXJnXS5zdHJpZGUgKgorICAgICAgICB0eXBlX3N6KGluc3QtPnNyY1thcmddLnR5cGUpKSAlIHR5cGVfc3ooZW50cnktPnNyYy50eXBlKSAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoaGFzX3NvdXJjZV9tb2RpZmllcnMgJiYgZW50cnktPmRzdC50eXBlICE9IGluc3QtPnNyY1thcmddLnR5cGUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmIChicnctPmdlbiA+PSA4ICYmIChlbnRyeS0+c3JjLm5lZ2F0ZSB8fCBlbnRyeS0+c3JjLmFicykgJiYKKyAgICAgICBpc19sb2dpY19vcChpbnN0LT5vcGNvZGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGluc3QtPnNyY1thcmddLmZpbGUgPSBlbnRyeS0+c3JjLmZpbGU7CisgICBpbnN0LT5zcmNbYXJnXS5yZWcgPSBlbnRyeS0+c3JjLnJlZzsKKyAgIGluc3QtPnNyY1thcmddLnJlZ19vZmZzZXQgPSBlbnRyeS0+c3JjLnJlZ19vZmZzZXQ7CisgICBpbnN0LT5zcmNbYXJnXS5zdWJyZWdfb2Zmc2V0ID0gZW50cnktPnNyYy5zdWJyZWdfb2Zmc2V0OworICAgaW5zdC0+c3JjW2FyZ10uc3RyaWRlICo9IGVudHJ5LT5zcmMuc3RyaWRlOworCisgICBpZiAoIWluc3QtPnNyY1thcmddLmFicykgeworICAgICAgaW5zdC0+c3JjW2FyZ10uYWJzID0gZW50cnktPnNyYy5hYnM7CisgICAgICBpbnN0LT5zcmNbYXJnXS5uZWdhdGUgXj0gZW50cnktPnNyYy5uZWdhdGU7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBib29sCit0cnlfY29uc3RhbnRfcHJvcGFnYXRlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICBhY3BfZW50cnkgKmVudHJ5KQoreworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworCisgICBpZiAoZW50cnktPnNyYy5maWxlICE9IElNTSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gZW50cnktPmRzdC5maWxlIHx8CisgICAgICAgICAgaW5zdC0+c3JjW2ldLnJlZyAhPSBlbnRyeS0+ZHN0LnJlZyB8fAorICAgICAgICAgIGluc3QtPnNyY1tpXS5yZWdfb2Zmc2V0ICE9IGVudHJ5LT5kc3QucmVnX29mZnNldCB8fAorICAgICAgICAgIGluc3QtPnNyY1tpXS5zdWJyZWdfb2Zmc2V0ICE9IGVudHJ5LT5kc3Quc3VicmVnX29mZnNldCB8fAorICAgICAgICAgIGluc3QtPnNyY1tpXS50eXBlICE9IGVudHJ5LT5kc3QudHlwZSB8fAorICAgICAgICAgIGluc3QtPnNyY1tpXS5zdHJpZGUgPiAxKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIC8qIERvbid0IGJvdGhlciB3aXRoIGNhc2VzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiB0YWtlbiBjYXJlIG9mIGJ5IHRoZQorICAgICAgICogR0xTTCBjb21waWxlcidzIGNvbnN0YW50IGZvbGRpbmcgcGFzcy4KKyAgICAgICAqLworICAgICAgaWYgKGluc3QtPnNyY1tpXS5uZWdhdGUgfHwgaW5zdC0+c3JjW2ldLmFicykKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgICAgY2FzZSBCUldfT1BDT0RFX01PVjoKKyAgICAgICAgIGluc3QtPnNyY1tpXSA9IGVudHJ5LT5zcmM7CisgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1BPVzoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQ6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1JFTUFJTkRFUjoKKyAgICAgICAgIGlmIChicnctPmdlbiA8IDgpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICBjYXNlIEJSV19PUENPREVfQkZJMToKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9BU1I6CisgICAgICBjYXNlIEJSV19PUENPREVfU0hMOgorICAgICAgY2FzZSBCUldfT1BDT0RFX1NIUjoKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9TVUJCOgorICAgICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICAgICAgaW5zdC0+c3JjW2ldID0gZW50cnktPnNyYzsKKyAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfTUFDSDoKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9NVUw6CisgICAgICBjYXNlIEJSV19PUENPREVfQUREOgorICAgICAgY2FzZSBCUldfT1BDT0RFX09SOgorICAgICAgY2FzZSBCUldfT1BDT0RFX0FORDoKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9YT1I6CisgICAgICBjYXNlIEJSV19PUENPREVfQUREQzoKKyAgICAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgIGluc3QtPnNyY1tpXSA9IGVudHJ5LT5zcmM7CisgICAgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCAmJiBpbnN0LT5zcmNbMV0uZmlsZSAhPSBJTU0pIHsKKyAgICAgICAgICAgIC8qIEZpdCB0aGlzIGNvbnN0YW50IGluIGJ5IGNvbW11dGluZyB0aGUgb3BlcmFuZHMuCisgICAgICAgICAgICAgKiBFeGNlcHRpb246IHdlIGNhbid0IGRvIHRoaXMgZm9yIDMyLWJpdCBpbnRlZ2VyIE1VTC9NQUNICisgICAgICAgICAgICAgKiBiZWNhdXNlIGl0J3MgYXN5bW1ldHJpYy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChpbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9NVUwgfHwKKyAgICAgICAgICAgICAgICAgaW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfTUFDSCkgJiYKKyAgICAgICAgICAgICAgICAoaW5zdC0+c3JjWzFdLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRCB8fAorICAgICAgICAgICAgICAgICBpbnN0LT5zcmNbMV0udHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCkpCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGluc3QtPnNyY1swXSA9IGluc3QtPnNyY1sxXTsKKyAgICAgICAgICAgIGluc3QtPnNyY1sxXSA9IGVudHJ5LT5zcmM7CisgICAgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0NNUDoKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9JRjoKKyAgICAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgIGluc3QtPnNyY1tpXSA9IGVudHJ5LT5zcmM7CisgICAgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCAmJiBpbnN0LT5zcmNbMV0uZmlsZSAhPSBJTU0pIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld19jbW9kOworCisgICAgICAgICAgICBuZXdfY21vZCA9IGJyd19zd2FwX2Ntb2QoaW5zdC0+Y29uZGl0aW9uYWxfbW9kKTsKKyAgICAgICAgICAgIGlmIChuZXdfY21vZCAhPSB+MHUpIHsKKyAgICAgICAgICAgICAgIC8qIEZpdCB0aGlzIGNvbnN0YW50IGluIGJ5IHN3YXBwaW5nIHRoZSBvcGVyYW5kcyBhbmQKKyAgICAgICAgICAgICAgICAqIGZsaXBwaW5nIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGluc3QtPnNyY1swXSA9IGluc3QtPnNyY1sxXTsKKyAgICAgICAgICAgICAgIGluc3QtPnNyY1sxXSA9IGVudHJ5LT5zcmM7CisgICAgICAgICAgICAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBuZXdfY21vZDsKKyAgICAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfU0VMOgorICAgICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICAgICAgaW5zdC0+c3JjW2ldID0gZW50cnktPnNyYzsKKyAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwICYmIGluc3QtPnNyY1sxXS5maWxlICE9IElNTSkgeworICAgICAgICAgICAgaW5zdC0+c3JjWzBdID0gaW5zdC0+c3JjWzFdOworICAgICAgICAgICAgaW5zdC0+c3JjWzFdID0gZW50cnktPnNyYzsKKworICAgICAgICAgICAgLyogSWYgdGhpcyB3YXMgcHJlZGljYXRlZCwgZmxpcHBpbmcgb3BlcmFuZHMgbWVhbnMKKyAgICAgICAgICAgICAqIHdlIGFsc28gbmVlZCB0byBmbGlwIHRoZSBwcmVkaWNhdGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpbnN0LT5jb25kaXRpb25hbF9tb2QgPT0gQlJXX0NPTkRJVElPTkFMX05PTkUpIHsKKyAgICAgICAgICAgICAgIGluc3QtPnByZWRpY2F0ZV9pbnZlcnNlID0KKyAgICAgICAgICAgICAgICAgICFpbnN0LT5wcmVkaWNhdGVfaW52ZXJzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNIQURFUl9PUENPREVfUkNQOgorICAgICAgICAgLyogVGhlIGhhcmR3YXJlIGRvZXNuJ3QgZG8gbWF0aCBvbiBpbW1lZGlhdGUgdmFsdWVzCisgICAgICAgICAgKiAoYmVjYXVzZSB3aHkgYXJlIHlvdSBkb2luZyB0aGF0LCBzZXJpb3VzbHk/KSwgYnV0CisgICAgICAgICAgKiB0aGUgY29ycmVjdCBhbnN3ZXIgaXMgdG8ganVzdCBjb25zdGFudCBmb2xkIGl0CisgICAgICAgICAgKiBhbnl3YXkuCisgICAgICAgICAgKi8KKyAgICAgICAgIGFzc2VydChpID09IDApOworICAgICAgICAgaWYgKGluc3QtPnNyY1swXS5pbW0uZiAhPSAwLjBmKSB7CisgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPSBCUldfT1BDT0RFX01PVjsKKyAgICAgICAgICAgIGluc3QtPnNyY1swXSA9IGVudHJ5LT5zcmM7CisgICAgICAgICAgICBpbnN0LT5zcmNbMF0uaW1tLmYgPSAxLjBmIC8gaW5zdC0+c3JjWzBdLmltbS5mOworICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FEOgorICAgICAgICAgaW5zdC0+c3JjW2ldID0gZW50cnktPnNyYzsKKyAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KKworc3RhdGljIGJvb2wKK2Nhbl9wcm9wYWdhdGVfZnJvbShmc19pbnN0ICppbnN0KQoreworICAgcmV0dXJuIChpbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9NT1YgJiYKKyAgICAgICAgICAgaW5zdC0+ZHN0LmZpbGUgPT0gR1JGICYmCisgICAgICAgICAgICgoaW5zdC0+c3JjWzBdLmZpbGUgPT0gR1JGICYmCisgICAgICAgICAgICAgKGluc3QtPnNyY1swXS5yZWcgIT0gaW5zdC0+ZHN0LnJlZyB8fAorICAgICAgICAgICAgICBpbnN0LT5zcmNbMF0ucmVnX29mZnNldCAhPSBpbnN0LT5kc3QucmVnX29mZnNldCkpIHx8CisgICAgICAgICAgICBpbnN0LT5zcmNbMF0uZmlsZSA9PSBVTklGT1JNIHx8CisgICAgICAgICAgICBpbnN0LT5zcmNbMF0uZmlsZSA9PSBJTU0pICYmCisgICAgICAgICAgIGluc3QtPnNyY1swXS50eXBlID09IGluc3QtPmRzdC50eXBlICYmCisgICAgICAgICAgICFpbnN0LT5zYXR1cmF0ZSAmJgorICAgICAgICAgICAhaW5zdC0+aXNfcGFydGlhbF93cml0ZSgpKTsKK30KKworLyogV2Fsa3MgYSBiYXNpYyBibG9jayBhbmQgZG9lcyBjb3B5IHByb3BhZ2F0aW9uIG9uIGl0IHVzaW5nIHRoZSBhY3AKKyAqIGxpc3QuCisgKi8KK2Jvb2wKK2ZzX3Zpc2l0b3I6Om9wdF9jb3B5X3Byb3BhZ2F0ZV9sb2NhbCh2b2lkICpjb3B5X3Byb3BfY3R4LCBiYmxvY2tfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY19saXN0ICphY3ApCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGZvciAoZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopYmxvY2stPnN0YXJ0OworCWluc3QgIT0gYmxvY2stPmVuZC0+bmV4dDsKKwlpbnN0ID0gKGZzX2luc3QgKilpbnN0LT5uZXh0KSB7CisKKyAgICAgIC8qIFRyeSBwcm9wYWdhdGluZyBpbnRvIHRoaXMgaW5zdHJ1Y3Rpb24uICovCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IEdSRikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICBmb3JlYWNoX2xpc3QoZW50cnlfbm9kZSwgJmFjcFtpbnN0LT5zcmNbaV0ucmVnICUgQUNQX0hBU0hfU0laRV0pIHsKKyAgICAgICAgICAgIGFjcF9lbnRyeSAqZW50cnkgPSAoYWNwX2VudHJ5ICopZW50cnlfbm9kZTsKKworICAgICAgICAgICAgaWYgKHRyeV9jb25zdGFudF9wcm9wYWdhdGUoYnJ3LCBpbnN0LCBlbnRyeSkpCisgICAgICAgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICh0cnlfY29weV9wcm9wYWdhdGUoaW5zdCwgaSwgZW50cnkpKQorICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBraWxsIHRoZSBkZXN0aW5hdGlvbiBmcm9tIHRoZSBBQ1AgKi8KKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKwkgZm9yZWFjaF9saXN0X3NhZmUoZW50cnlfbm9kZSwgJmFjcFtpbnN0LT5kc3QucmVnICUgQUNQX0hBU0hfU0laRV0pIHsKKwkgICAgYWNwX2VudHJ5ICplbnRyeSA9IChhY3BfZW50cnkgKillbnRyeV9ub2RlOworCisJICAgIGlmIChpbnN0LT5vdmVyd3JpdGVzX3JlZyhlbnRyeS0+ZHN0KSkgeworCSAgICAgICBlbnRyeS0+cmVtb3ZlKCk7CisJICAgIH0KKwkgfQorCisgICAgICAgICAvKiBPb3BzLCB3ZSBvbmx5IGhhdmUgdGhlIGNoYWluaW5nIGhhc2ggYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uLCBub3QKKyAgICAgICAgICAqIHRoZSBzb3VyY2UsIHNvIHdhbGsgYWNyb3NzIHRoZSBlbnRpcmUgdGFibGUuCisgICAgICAgICAgKi8KKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQUNQX0hBU0hfU0laRTsgaSsrKSB7CisgICAgICAgICAgICBmb3JlYWNoX2xpc3Rfc2FmZShlbnRyeV9ub2RlLCAmYWNwW2ldKSB7CisgICAgICAgICAgICAgICBhY3BfZW50cnkgKmVudHJ5ID0gKGFjcF9lbnRyeSAqKWVudHJ5X25vZGU7CisgICAgICAgICAgICAgICBpZiAoaW5zdC0+b3ZlcndyaXRlc19yZWcoZW50cnktPnNyYykpCisgICAgICAgICAgICAgICAgICBlbnRyeS0+cmVtb3ZlKCk7CisgICAgICAgICAgICB9CisJIH0KKyAgICAgIH0KKworICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbidzIHNvdXJjZSBjb3VsZCBwb3RlbnRpYWxseSBiZSBmb2xkZWQgaW50byB0aGUKKyAgICAgICAqIG9wZXJhbmQgb2YgYW5vdGhlciBpbnN0cnVjdGlvbiwgYWRkIGl0IHRvIHRoZSBBQ1AuCisgICAgICAgKi8KKyAgICAgIGlmIChjYW5fcHJvcGFnYXRlX2Zyb20oaW5zdCkpIHsKKwkgYWNwX2VudHJ5ICplbnRyeSA9IHJhbGxvYyhjb3B5X3Byb3BfY3R4LCBhY3BfZW50cnkpOworCSBlbnRyeS0+ZHN0ID0gaW5zdC0+ZHN0OworCSBlbnRyeS0+c3JjID0gaW5zdC0+c3JjWzBdOworCSBhY3BbZW50cnktPmRzdC5yZWcgJSBBQ1BfSEFTSF9TSVpFXS5wdXNoX3RhaWwoZW50cnkpOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK2Jvb2wKK2ZzX3Zpc2l0b3I6Om9wdF9jb3B5X3Byb3BhZ2F0ZSgpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisgICB2b2lkICpjb3B5X3Byb3BfY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICBjZmdfdCBjZmcoJmluc3RydWN0aW9ucyk7CisgICBleGVjX2xpc3QgKm91dF9hY3BbY2ZnLm51bV9ibG9ja3NdOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZmcubnVtX2Jsb2NrczsgaSsrKQorICAgICAgb3V0X2FjcFtpXSA9IG5ldyBleGVjX2xpc3QgW0FDUF9IQVNIX1NJWkVdOworCisgICAvKiBGaXJzdCwgd2FsayB0aHJvdWdoIGVhY2ggYmxvY2sgZG9pbmcgbG9jYWwgY29weSBwcm9wYWdhdGlvbiBhbmQgZ2V0dGluZworICAgICogdGhlIHNldCBvZiBjb3BpZXMgYXZhaWxhYmxlIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorICAgICovCisgICBmb3IgKGludCBiID0gMDsgYiA8IGNmZy5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgIGJibG9ja190ICpibG9jayA9IGNmZy5ibG9ja3NbYl07CisKKyAgICAgIHByb2dyZXNzID0gb3B0X2NvcHlfcHJvcGFnYXRlX2xvY2FsKGNvcHlfcHJvcF9jdHgsIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2FjcFtiXSkgfHwgcHJvZ3Jlc3M7CisgICB9CisKKyAgIC8qIERvIGRhdGFmbG93IGFuYWx5c2lzIGZvciB0aG9zZSBhdmFpbGFibGUgY29waWVzLiAqLworICAgZnNfY29weV9wcm9wX2RhdGFmbG93IGRhdGFmbG93KGNvcHlfcHJvcF9jdHgsICZjZmcsIG91dF9hY3ApOworCisgICAvKiBOZXh0LCByZS1ydW4gbG9jYWwgY29weSBwcm9wYWdhdGlvbiwgdGhpcyB0aW1lIHdpdGggdGhlIHNldCBvZiBjb3BpZXMKKyAgICAqIHByb3ZpZGVkIGJ5IHRoZSBkYXRhZmxvdyBhbmFseXNpcyBhdmFpbGFibGUgYXQgdGhlIHN0YXJ0IG9mIGEgYmxvY2suCisgICAgKi8KKyAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLm51bV9ibG9ja3M7IGIrKykgeworICAgICAgYmJsb2NrX3QgKmJsb2NrID0gY2ZnLmJsb2Nrc1tiXTsKKyAgICAgIGV4ZWNfbGlzdCBpbl9hY3BbQUNQX0hBU0hfU0laRV07CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YWZsb3cubnVtX2FjcDsgaSsrKSB7CisgICAgICAgICBpZiAoQklUU0VUX1RFU1QoZGF0YWZsb3cuYmRbYl0ubGl2ZWluLCBpKSkgeworICAgICAgICAgICAgc3RydWN0IGFjcF9lbnRyeSAqZW50cnkgPSBkYXRhZmxvdy5hY3BbaV07CisgICAgICAgICAgICBpbl9hY3BbZW50cnktPmRzdC5yZWcgJSBBQ1BfSEFTSF9TSVpFXS5wdXNoX3RhaWwoZW50cnkpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBwcm9ncmVzcyA9IG9wdF9jb3B5X3Byb3BhZ2F0ZV9sb2NhbChjb3B5X3Byb3BfY3R4LCBibG9jaywgaW5fYWNwKSB8fCBwcm9ncmVzczsKKyAgIH0KKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZmcubnVtX2Jsb2NrczsgaSsrKQorICAgICAgZGVsZXRlIFtdIG91dF9hY3BbaV07CisgICByYWxsb2NfZnJlZShjb3B5X3Byb3BfY3R4KTsKKworICAgaWYgKHByb2dyZXNzKQorICAgICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2NzZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2NzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2MTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfY3NlLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJicndfZnMuaCIKKyNpbmNsdWRlICJicndfY2ZnLmgiCisKKy8qKiBAZmlsZSBicndfZnNfY3NlLmNwcAorICoKKyAqIFN1cHBvcnQgZm9yIGxvY2FsIGNvbW1vbiBzdWJleHByZXNzaW9uIGVsaW1pbmF0aW9uLgorICoKKyAqIFNlZSBNdWNobmljaydzIEFkdmFuY2VkIENvbXBpbGVyIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24sIHNlY3Rpb24KKyAqIDEzLjEgKHAzNzgpLgorICovCisKK25hbWVzcGFjZSB7CitzdHJ1Y3QgYWViX2VudHJ5IDogcHVibGljIGV4ZWNfbm9kZSB7CisgICAvKiogVGhlIGluc3RydWN0aW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSBleHByZXNzaW9uIHZhbHVlLiAqLworICAgZnNfaW5zdCAqZ2VuZXJhdG9yOworCisgICAvKiogVGhlIHRlbXBvcmFyeSB3aGVyZSB0aGUgdmFsdWUgaXMgc3RvcmVkLiAqLworICAgZnNfcmVnIHRtcDsKK307Cit9CisKK3N0YXRpYyBib29sCitpc19leHByZXNzaW9uKGNvbnN0IGZzX2luc3QgKmNvbnN0IGluc3QpCit7CisgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgY2FzZSBCUldfT1BDT0RFX1NFTDoKKyAgIGNhc2UgQlJXX09QQ09ERV9OT1Q6CisgICBjYXNlIEJSV19PUENPREVfQU5EOgorICAgY2FzZSBCUldfT1BDT0RFX09SOgorICAgY2FzZSBCUldfT1BDT0RFX1hPUjoKKyAgIGNhc2UgQlJXX09QQ09ERV9TSFI6CisgICBjYXNlIEJSV19PUENPREVfU0hMOgorICAgY2FzZSBCUldfT1BDT0RFX0FTUjoKKyAgIGNhc2UgQlJXX09QQ09ERV9DTVA6CisgICBjYXNlIEJSV19PUENPREVfQ01QTjoKKyAgIGNhc2UgQlJXX09QQ09ERV9BREQ6CisgICBjYXNlIEJSV19PUENPREVfTVVMOgorICAgY2FzZSBCUldfT1BDT0RFX0ZSQzoKKyAgIGNhc2UgQlJXX09QQ09ERV9STkRVOgorICAgY2FzZSBCUldfT1BDT0RFX1JOREQ6CisgICBjYXNlIEJSV19PUENPREVfUk5ERToKKyAgIGNhc2UgQlJXX09QQ09ERV9STkRaOgorICAgY2FzZSBCUldfT1BDT0RFX0xJTkU6CisgICBjYXNlIEJSV19PUENPREVfUExOOgorICAgY2FzZSBCUldfT1BDT0RFX01BRDoKKyAgIGNhc2UgQlJXX09QQ09ERV9MUlA6CisgICBjYXNlIEZTX09QQ09ERV9VTklGT1JNX1BVTExfQ09OU1RBTlRfTE9BRDoKKyAgIGNhc2UgRlNfT1BDT0RFX1ZBUllJTkdfUFVMTF9DT05TVEFOVF9MT0FEX0dFTjc6CisgICBjYXNlIEZTX09QQ09ERV9WQVJZSU5HX1BVTExfQ09OU1RBTlRfTE9BRDoKKyAgIGNhc2UgRlNfT1BDT0RFX0NJTlRFUlA6CisgICBjYXNlIEZTX09QQ09ERV9MSU5URVJQOgorICAgICAgcmV0dXJuIHRydWU7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitzdGF0aWMgYm9vbAoraXNfZXhwcmVzc2lvbl9jb21tdXRhdGl2ZShlbnVtIG9wY29kZSBvcCkKK3sKKyAgIHN3aXRjaCAob3ApIHsKKyAgIGNhc2UgQlJXX09QQ09ERV9BTkQ6CisgICBjYXNlIEJSV19PUENPREVfT1I6CisgICBjYXNlIEJSV19PUENPREVfWE9SOgorICAgY2FzZSBCUldfT1BDT0RFX0FERDoKKyAgIGNhc2UgQlJXX09QQ09ERV9NVUw6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9CisKK3N0YXRpYyBib29sCitvcGVyYW5kc19tYXRjaChlbnVtIG9wY29kZSBvcCwgZnNfcmVnICp4cywgZnNfcmVnICp5cykKK3sKKyAgIGlmICghaXNfZXhwcmVzc2lvbl9jb21tdXRhdGl2ZShvcCkpIHsKKyAgICAgIHJldHVybiB4c1swXS5lcXVhbHMoeXNbMF0pICYmIHhzWzFdLmVxdWFscyh5c1sxXSkgJiYgeHNbMl0uZXF1YWxzKHlzWzJdKTsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKHhzWzBdLmVxdWFscyh5c1swXSkgJiYgeHNbMV0uZXF1YWxzKHlzWzFdKSkgfHwKKyAgICAgICAgICAgICAoeHNbMV0uZXF1YWxzKHlzWzBdKSAmJiB4c1swXS5lcXVhbHMoeXNbMV0pKTsKKyAgIH0KK30KKworc3RhdGljIGJvb2wKK2luc3RydWN0aW9uc19tYXRjaChmc19pbnN0ICphLCBmc19pbnN0ICpiKQoreworICAgcmV0dXJuIGEtPm9wY29kZSA9PSBiLT5vcGNvZGUgJiYKKyAgICAgICAgICBhLT5zYXR1cmF0ZSA9PSBiLT5zYXR1cmF0ZSAmJgorICAgICAgICAgIGEtPnByZWRpY2F0ZSA9PSBiLT5wcmVkaWNhdGUgJiYKKyAgICAgICAgICBhLT5wcmVkaWNhdGVfaW52ZXJzZSA9PSBiLT5wcmVkaWNhdGVfaW52ZXJzZSAmJgorICAgICAgICAgIGEtPmNvbmRpdGlvbmFsX21vZCA9PSBiLT5jb25kaXRpb25hbF9tb2QgJiYKKyAgICAgICAgICBhLT5kc3QudHlwZSA9PSBiLT5kc3QudHlwZSAmJgorICAgICAgICAgIG9wZXJhbmRzX21hdGNoKGEtPm9wY29kZSwgYS0+c3JjLCBiLT5zcmMpOworfQorCitib29sCitmc192aXNpdG9yOjpvcHRfY3NlX2xvY2FsKGJibG9ja190ICpibG9jaywgZXhlY19saXN0ICphZWIpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIHZvaWQgKmNzZV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKworICAgaW50IGlwID0gYmxvY2stPnN0YXJ0X2lwOworICAgZm9yIChmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilibG9jay0+c3RhcnQ7CisJaW5zdCAhPSBibG9jay0+ZW5kLT5uZXh0OworCWluc3QgPSAoZnNfaW5zdCAqKSBpbnN0LT5uZXh0KSB7CisKKyAgICAgIC8qIFNraXAgc29tZSBjYXNlcy4gKi8KKyAgICAgIGlmIChpc19leHByZXNzaW9uKGluc3QpICYmICFpbnN0LT5pc19wYXJ0aWFsX3dyaXRlKCkgJiYKKyAgICAgICAgICAoaW5zdC0+ZHN0LmZpbGUgIT0gSFdfUkVHIHx8IGluc3QtPmRzdC5pc19udWxsKCkpKQorICAgICAgeworCSBib29sIGZvdW5kID0gZmFsc2U7CisKKwkgYWViX2VudHJ5ICplbnRyeTsKKwkgZm9yZWFjaF9saXN0KGVudHJ5X25vZGUsIGFlYikgeworCSAgICBlbnRyeSA9IChhZWJfZW50cnkgKikgZW50cnlfbm9kZTsKKworCSAgICAvKiBNYXRjaCBjdXJyZW50IGluc3RydWN0aW9uJ3MgZXhwcmVzc2lvbiBhZ2FpbnN0IHRob3NlIGluIEFFQi4gKi8KKwkgICAgaWYgKGluc3RydWN0aW9uc19tYXRjaChpbnN0LCBlbnRyeS0+Z2VuZXJhdG9yKSkgeworCSAgICAgICBmb3VuZCA9IHRydWU7CisJICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgICAgICAgYnJlYWs7CisJICAgIH0KKwkgfQorCisJIGlmICghZm91bmQpIHsKKwkgICAgLyogT3VyIGZpcnN0IHNpZ2h0aW5nIG9mIHRoaXMgZXhwcmVzc2lvbi4gIENyZWF0ZSBhbiBlbnRyeS4gKi8KKwkgICAgYWViX2VudHJ5ICplbnRyeSA9IHJhbGxvYyhjc2VfY3R4LCBhZWJfZW50cnkpOworCSAgICBlbnRyeS0+dG1wID0gcmVnX3VuZGVmOworCSAgICBlbnRyeS0+Z2VuZXJhdG9yID0gaW5zdDsKKwkgICAgYWViLT5wdXNoX3RhaWwoZW50cnkpOworCSB9IGVsc2UgeworCSAgICAvKiBUaGlzIGlzIGF0IGxlYXN0IG91ciBzZWNvbmQgc2lnaHRpbmcgb2YgdGhpcyBleHByZXNzaW9uLgorCSAgICAgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdGVtcG9yYXJ5IGFscmVhZHksIG1ha2Ugb25lLgorCSAgICAgKi8KKwkgICAgYm9vbCBub19leGlzdGluZ190ZW1wID0gZW50cnktPnRtcC5maWxlID09IEJBRF9GSUxFOworCSAgICBpZiAobm9fZXhpc3RpbmdfdGVtcCAmJiAhZW50cnktPmdlbmVyYXRvci0+ZHN0LmlzX251bGwoKSkgeworICAgICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSBlbnRyeS0+Z2VuZXJhdG9yLT5yZWdzX3dyaXR0ZW47CisKKyAgICAgICAgICAgICAgIGZzX3JlZyBvcmlnX2RzdCA9IGVudHJ5LT5nZW5lcmF0b3ItPmRzdDsKKyAgICAgICAgICAgICAgIGZzX3JlZyB0bXAgPSBmc19yZWcoR1JGLCB2aXJ0dWFsX2dyZl9hbGxvYyh3cml0dGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ19kc3QudHlwZSk7CisgICAgICAgICAgICAgICBlbnRyeS0+dG1wID0gdG1wOworICAgICAgICAgICAgICAgZW50cnktPmdlbmVyYXRvci0+ZHN0ID0gdG1wOworCisgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyaXR0ZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgZnNfaW5zdCAqY29weSA9IE1PVihvcmlnX2RzdCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgIGNvcHktPmZvcmNlX3dyaXRlbWFza19hbGwgPQorICAgICAgICAgICAgICAgICAgICAgZW50cnktPmdlbmVyYXRvci0+Zm9yY2Vfd3JpdGVtYXNrX2FsbDsKKyAgICAgICAgICAgICAgICAgIGVudHJ5LT5nZW5lcmF0b3ItPmluc2VydF9hZnRlcihjb3B5KTsKKworICAgICAgICAgICAgICAgICAgb3JpZ19kc3QucmVnX29mZnNldCsrOworICAgICAgICAgICAgICAgICAgdG1wLnJlZ19vZmZzZXQrKzsKKyAgICAgICAgICAgICAgIH0KKwkgICAgfQorCisJICAgIC8qIGRlc3QgPC0gdGVtcCAqLworICAgICAgICAgICAgaWYgKCFpbnN0LT5kc3QuaXNfbnVsbCgpKSB7CisgICAgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IGluc3QtPnJlZ3Nfd3JpdHRlbjsKKyAgICAgICAgICAgICAgIGFzc2VydCh3cml0dGVuID09IGVudHJ5LT5nZW5lcmF0b3ItPnJlZ3Nfd3JpdHRlbik7CisgICAgICAgICAgICAgICBhc3NlcnQoaW5zdC0+ZHN0LnR5cGUgPT0gZW50cnktPnRtcC50eXBlKTsKKyAgICAgICAgICAgICAgIGZzX3JlZyBkc3QgPSBpbnN0LT5kc3Q7CisgICAgICAgICAgICAgICBmc19yZWcgdG1wID0gZW50cnktPnRtcDsKKyAgICAgICAgICAgICAgIGZzX2luc3QgKmNvcHkgPSBOVUxMOworICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cml0dGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIGNvcHkgPSBNT1YoZHN0LCB0bXApOworICAgICAgICAgICAgICAgICAgY29weS0+Zm9yY2Vfd3JpdGVtYXNrX2FsbCA9IGluc3QtPmZvcmNlX3dyaXRlbWFza19hbGw7CisgICAgICAgICAgICAgICAgICBpbnN0LT5pbnNlcnRfYmVmb3JlKGNvcHkpOworCisgICAgICAgICAgICAgICAgICBkc3QucmVnX29mZnNldCsrOworICAgICAgICAgICAgICAgICAgdG1wLnJlZ19vZmZzZXQrKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2V0IG91ciBpdGVyYXRvciBzbyB0aGF0IG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wIGluc3QtPm5leHQKKyAgICAgICAgICAgICAqIHdpbGwgZ2V0IHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgYmFzaWMgYmxvY2sgYWZ0ZXIgdGhlIG9uZSB3ZSd2ZQorICAgICAgICAgICAgICogcmVtb3ZlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZnNfaW5zdCAqcHJldiA9IChmc19pbnN0ICopaW5zdC0+cHJldjsKKworICAgICAgICAgICAgaW5zdC0+cmVtb3ZlKCk7CisKKwkgICAgLyogQXBwZW5kaW5nIGFuIGluc3RydWN0aW9uIG1heSBoYXZlIGNoYW5nZWQgb3VyIGJibG9jayBlbmQuICovCisJICAgIGlmIChpbnN0ID09IGJsb2NrLT5lbmQpIHsKKwkgICAgICAgYmxvY2stPmVuZCA9IHByZXY7CisJICAgIH0KKworICAgICAgICAgICAgaW5zdCA9IHByZXY7CisJIH0KKyAgICAgIH0KKworICAgICAgZm9yZWFjaF9saXN0X3NhZmUoZW50cnlfbm9kZSwgYWViKSB7CisJIGFlYl9lbnRyeSAqZW50cnkgPSAoYWViX2VudHJ5ICopZW50cnlfbm9kZTsKKworICAgICAgICAgLyogS2lsbCBhbGwgQUVCIGVudHJpZXMgdGhhdCB3cml0ZSBhIGRpZmZlcmVudCB2YWx1ZSB0byBvciByZWFkIGZyb20KKyAgICAgICAgICAqIHRoZSBmbGFnIHJlZ2lzdGVyIGlmIHdlIGp1c3Qgd3JvdGUgaXQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChpbnN0LT53cml0ZXNfZmxhZygpKSB7CisgICAgICAgICAgICBpZiAoZW50cnktPmdlbmVyYXRvci0+cmVhZHNfZmxhZygpIHx8CisgICAgICAgICAgICAgICAgKGVudHJ5LT5nZW5lcmF0b3ItPndyaXRlc19mbGFnKCkgJiYKKyAgICAgICAgICAgICAgICAgIWluc3RydWN0aW9uc19tYXRjaChpbnN0LCBlbnRyeS0+Z2VuZXJhdG9yKSkpIHsKKyAgICAgICAgICAgICAgIGVudHJ5LT5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgIHJhbGxvY19mcmVlKGVudHJ5KTsKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisJIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBmc19yZWcgKnNyY19yZWcgPSAmZW50cnktPmdlbmVyYXRvci0+c3JjW2ldOworCisgICAgICAgICAgICAvKiBLaWxsIGFsbCBBRUIgZW50cmllcyB0aGF0IHVzZSB0aGUgZGVzdGluYXRpb24gd2UganVzdAorICAgICAgICAgICAgICogb3Zlcndyb3RlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoaW5zdC0+b3ZlcndyaXRlc19yZWcoZW50cnktPmdlbmVyYXRvci0+c3JjW2ldKSkgeworCSAgICAgICBlbnRyeS0+cmVtb3ZlKCk7CisJICAgICAgIHJhbGxvY19mcmVlKGVudHJ5KTsKKwkgICAgICAgYnJlYWs7CisJICAgIH0KKworICAgICAgICAgICAgLyogS2lsbCBhbnkgQUVCIGVudHJpZXMgdXNpbmcgcmVnaXN0ZXJzIHRoYXQgZG9uJ3QgZ2V0IHJldXNlZCBhbnkKKyAgICAgICAgICAgICAqIG1vcmUgLS0gYSBzdXJlIHNpZ24gdGhleSdsbCBmYWlsIG9wZXJhbmRzX21hdGNoKCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzcmNfcmVnLT5maWxlID09IEdSRiAmJiB2aXJ0dWFsX2dyZl9lbmRbc3JjX3JlZy0+cmVnXSA8IGlwKSB7CisgICAgICAgICAgICAgICBlbnRyeS0+cmVtb3ZlKCk7CisgICAgICAgICAgICAgICByYWxsb2NfZnJlZShlbnRyeSk7CisJICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCSB9CisgICAgICB9CisKKyAgICAgIGlwKys7CisgICB9CisKKyAgIHJhbGxvY19mcmVlKGNzZV9jdHgpOworCisgICBpZiAocHJvZ3Jlc3MpCisgICAgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KKworYm9vbAorZnNfdmlzaXRvcjo6b3B0X2NzZSgpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpOworCisgICBjZmdfdCBjZmcoJmluc3RydWN0aW9ucyk7CisKKyAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLm51bV9ibG9ja3M7IGIrKykgeworICAgICAgYmJsb2NrX3QgKmJsb2NrID0gY2ZnLmJsb2Nrc1tiXTsKKyAgICAgIGV4ZWNfbGlzdCBhZWI7CisKKyAgICAgIHByb2dyZXNzID0gb3B0X2NzZV9sb2NhbChibG9jaywgJmFlYikgfHwgcHJvZ3Jlc3M7CisgICB9CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfZGVhZF9jb2RlX2VsaW1pbmF0ZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2RlYWRfY29kZV9lbGltaW5hdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWNlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2RlYWRfY29kZV9lbGltaW5hdGUuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImJyd19mcy5oIgorI2luY2x1ZGUgImJyd19mc19saXZlX3ZhcmlhYmxlcy5oIgorI2luY2x1ZGUgImJyd19jZmcuaCIKKworLyoqIEBmaWxlIGJyd19mc19kZWFkX2NvZGVfZWxpbWluYXRlLmNwcAorICoKKyAqIERhdGFmbG93LWF3YXJlIGRlYWQgY29kZSBlbGltaW5hdGlvbi4KKyAqCisgKiBXYWxrcyB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBmcm9tIHRoZSBib3R0b20sIHJlbW92aW5nIGluc3RydWN0aW9ucyB0aGF0CisgKiBoYXZlIHJlc3VsdHMgdGhhdCBib3RoIGFyZW4ndCB1c2VkIGluIGxhdGVyIGJsb2NrcyBhbmQgaGF2ZW4ndCBiZWVuIHJlYWQKKyAqIHlldCBpbiB0aGUgdGFpbCBlbmQgb2YgdGhpcyBibG9jay4KKyAqLworCitib29sCitmc192aXNpdG9yOjpkZWFkX2NvZGVfZWxpbWluYXRlKCkKK3sKKyAgIGJvb2wgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgY2ZnX3QgY2ZnKCZpbnN0cnVjdGlvbnMpOworCisgICBjYWxjdWxhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKworICAgaW50IG51bV92YXJzID0gbGl2ZV9pbnRlcnZhbHMtPm51bV92YXJzOworICAgQklUU0VUX1dPUkQgKmxpdmUgPSByYWxsb2NfYXJyYXkoTlVMTCwgQklUU0VUX1dPUkQsIEJJVFNFVF9XT1JEUyhudW1fdmFycykpOworCisgICBmb3IgKGludCBiID0gMDsgYiA8IGNmZy5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgIGJibG9ja190ICpibG9jayA9IGNmZy5ibG9ja3NbYl07CisgICAgICBtZW1jcHkobGl2ZSwgbGl2ZV9pbnRlcnZhbHMtPmJkW2JdLmxpdmVvdXQsCisgICAgICAgICAgICAgc2l6ZW9mKEJJVFNFVF9XT1JEKSAqIEJJVFNFVF9XT1JEUyhudW1fdmFycykpOworCisgICAgICBmb3IgKGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKWJsb2NrLT5lbmQ7CisgICAgICAgICAgIGluc3QgIT0gYmxvY2stPnN0YXJ0LT5wcmV2OworICAgICAgICAgICBpbnN0ID0gKGZzX2luc3QgKilpbnN0LT5wcmV2KSB7CisgICAgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGICYmCisgICAgICAgICAgICAgIWluc3QtPmhhc19zaWRlX2VmZmVjdHMoKSAmJgorICAgICAgICAgICAgICFpbnN0LT53cml0ZXNfZmxhZygpKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdF9saXZlID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChpbnN0LT5yZWdzX3dyaXR0ZW4gPT0gMSkgeworICAgICAgICAgICAgICAgaW50IHZhciA9IGxpdmVfaW50ZXJ2YWxzLT52YXJfZnJvbV9yZWcoJmluc3QtPmRzdCk7CisgICAgICAgICAgICAgICByZXN1bHRfbGl2ZSA9IEJJVFNFVF9URVNUKGxpdmUsIHZhcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgaW50IHZhciA9IGxpdmVfaW50ZXJ2YWxzLT52YXJfZnJvbV92Z3JmW2luc3QtPmRzdC5yZWddOworICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0LT5yZWdzX3dyaXR0ZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgcmVzdWx0X2xpdmUgPSByZXN1bHRfbGl2ZSB8fCBCSVRTRVRfVEVTVChsaXZlLCB2YXIgKyBpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFyZXN1bHRfbGl2ZSkgeworICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworCisgICAgICAgICAgICAgICBpZiAoaW5zdC0+d3JpdGVzX2FjY3VtdWxhdG9yKSB7CisgICAgICAgICAgICAgICAgICBpbnN0LT5kc3QgPSBmc19yZWcocmV0eXBlKGJyd19udWxsX3JlZygpLCBpbnN0LT5kc3QudHlwZSkpOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGluc3QtPm9wY29kZSA9IEJSV19PUENPREVfTk9QOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgICAgIGlmICghaW5zdC0+aXNfcGFydGlhbF93cml0ZSgpKSB7CisgICAgICAgICAgICAgICBpbnQgdmFyID0gbGl2ZV9pbnRlcnZhbHMtPnZhcl9mcm9tX3ZncmZbaW5zdC0+ZHN0LnJlZ107CisgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3QtPnJlZ3Nfd3JpdHRlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICBCSVRTRVRfQ0xFQVIobGl2ZSwgdmFyICsgaW5zdC0+ZHN0LnJlZ19vZmZzZXQgKyBpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgICAgICAgIGludCB2YXIgPSBsaXZlX2ludGVydmFscy0+dmFyX2Zyb21fdmdyZltpbnN0LT5zcmNbaV0ucmVnXTsKKworICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnN0LT5yZWdzX3JlYWQodGhpcywgaSk7IGorKykgeworICAgICAgICAgICAgICAgICAgQklUU0VUX1NFVChsaXZlLCB2YXIgKyBpbnN0LT5zcmNbaV0ucmVnX29mZnNldCArIGopOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByYWxsb2NfZnJlZShsaXZlKTsKKworICAgaWYgKHByb2dyZXNzKSB7CisgICAgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworCisgICAgICAgICBpZiAoaW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfTk9QKSB7CisgICAgICAgICAgICBpbnN0LT5yZW1vdmUoKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworICAgfQorCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2dlbmVyYXRvci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2dlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlZmRhOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfZ2VuZXJhdG9yLmNwcApAQCAtMCwwICsxLDE5MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKiogQGZpbGUgYnJ3X2ZzX2dlbmVyYXRvci5jcHAKKyAqCisgKiBUaGlzIGZpbGUgc3VwcG9ydHMgZ2VuZXJhdGluZyBjb2RlIGZyb20gdGhlIEZTIExJUiB0byB0aGUgYWN0dWFsCisgKiBuYXRpdmUgaW5zdHJ1Y3Rpb25zLgorICovCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfZXUuaCIKK30gLyogZXh0ZXJuICJDIiAqLworCisjaW5jbHVkZSAiYnJ3X2ZzLmgiCisjaW5jbHVkZSAiYnJ3X2NmZy5oIgorCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRzogQURECisKK2ZzX2dlbmVyYXRvcjo6ZnNfZ2VuZXJhdG9yKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKmZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkdWFsX3NvdXJjZV9vdXRwdXQpCisKKyAgIDogYnJ3KGJydyksIGMoYyksIHByb2cocHJvZyksIGZwKGZwKSwgZHVhbF9zb3VyY2Vfb3V0cHV0KGR1YWxfc291cmNlX291dHB1dCkKK3sKKyAgIGN0eCA9ICZicnctPmN0eDsKKworICAgbWVtX2N0eCA9IGM7CisKKyAgIHAgPSByemFsbG9jKG1lbV9jdHgsIHN0cnVjdCBicndfY29tcGlsZSk7CisgICBicndfaW5pdF9jb21waWxlKGJydywgcCwgbWVtX2N0eCk7Cit9CisKK2ZzX2dlbmVyYXRvcjo6fmZzX2dlbmVyYXRvcigpCit7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6cGF0Y2hfZGlzY2FyZF9qdW1wc190b19mYl93cml0ZXMoKQoreworICAgaWYgKGJydy0+Z2VuIDwgNiB8fCB0aGlzLT5kaXNjYXJkX2hhbHRfcGF0Y2hlcy5pc19lbXB0eSgpKQorICAgICAgcmV0dXJuOworCisgICAvKiBUaGVyZSBpcyBhIHNvbWV3aGF0IHN0cmFuZ2UgdW5kb2N1bWVudGVkIHJlcXVpcmVtZW50IG9mIHVzaW5nCisgICAgKiBIQUxULCBhY2NvcmRpbmcgdG8gdGhlIHNpbXVsYXRvci4gIElmIHNvbWUgY2hhbm5lbCBoYXMgSEFMVGVkIHRvCisgICAgKiBhIHBhcnRpY3VsYXIgVUlQLCB0aGVuIGJ5IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0sIGV2ZXJ5IGNoYW5uZWwKKyAgICAqIG11c3QgaGF2ZSBIQUxUZWQgdG8gdGhhdCBVSVAuICBGdXJ0aGVybW9yZSwgdGhlIHRyYWNraW5nIGlzIGEKKyAgICAqIHN0YWNrLCBzbyB5b3UgY2FuJ3QgZG8gdGhlIGZpbmFsIGhhbHQgb2YgYSBVSVAgYWZ0ZXIgc3RhcnRpbmcKKyAgICAqIGhhbHRpbmcgdG8gYSBuZXcgVUlQLgorICAgICoKKyAgICAqIFN5bXB0b21zIG9mIG5vdCBlbWl0dGluZyB0aGlzIGluc3RydWN0aW9uIG9uIGFjdHVhbCBoYXJkd2FyZQorICAgICogaW5jbHVkZWQgR1BVIGhhbmdzIGFuZCBzcGFya2x5IHJlbmRlcmluZyBvbiB0aGUgcGlnbGl0IGRpc2NhcmQKKyAgICAqIHRlc3RzLgorICAgICovCisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpsYXN0X2hhbHQgPSBnZW42X0hBTFQocCk7CisgICBsYXN0X2hhbHQtPmJpdHMzLmJyZWFrX2NvbnQudWlwID0gMjsKKyAgIGxhc3RfaGFsdC0+Yml0czMuYnJlYWtfY29udC5qaXAgPSAyOworCisgICBpbnQgaXAgPSBwLT5ucl9pbnNuOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmRpc2NhcmRfaGFsdF9wYXRjaGVzKSB7CisgICAgICBpcF9yZWNvcmQgKnBhdGNoX2lwID0gKGlwX3JlY29yZCAqKW5vZGU7CisgICAgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpwYXRjaCA9ICZwLT5zdG9yZVtwYXRjaF9pcC0+aXBdOworCisgICAgICBhc3NlcnQocGF0Y2gtPmhlYWRlci5vcGNvZGUgPT0gQlJXX09QQ09ERV9IQUxUKTsKKyAgICAgIC8qIEhBTFQgdGFrZXMgYSBoYWxmLWluc3RydWN0aW9uIGRpc3RhbmNlIGZyb20gdGhlIHByZS1pbmNyZW1lbnRlZCBJUC4gKi8KKyAgICAgIHBhdGNoLT5iaXRzMy5icmVha19jb250LnVpcCA9IChpcCAtIHBhdGNoX2lwLT5pcCkgKiAyOworICAgfQorCisgICB0aGlzLT5kaXNjYXJkX2hhbHRfcGF0Y2hlcy5tYWtlX2VtcHR5KCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2NhdHRlcmVkX3dyaXRlKGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnNyYykKK3sKKyAgICBicndfc2NhdHRlcmVkX3dyaXRlKHAsCisgICAgICAgICAgICBkc3QsCisgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICBpbnN0LT50YXJnZXQsCisgICAgICAgICAgICBpbnN0LT5tbGVuLAorICAgICAgICAgICAgaW5zdC0+aGVhZGVyX3ByZXNlbnQsCisgICAgICAgICAgICAoaW5zdC0+b3Bjb2RlID09IFNIQURFUl9PUENPREVfRFdPUkRfU0NBVFRFUkVEX1dSSVRFKSk7CisKKyAgIGJyd19tYXJrX3N1cmZhY2VfdXNlZCgmYy0+cHJvZ19kYXRhLmJhc2UsIGluc3QtPnRhcmdldCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2NhdHRlcmVkX3JlYWQoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgJnNyYykKK3sKKyAgICBicndfc2NhdHRlcmVkX3JlYWQocCwKKyAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgIGluc3QtPnRhcmdldCwKKyAgICAgICAgICAgIGluc3QtPm1sZW4sCisgICAgICAgICAgICBpbnN0LT5oZWFkZXJfcHJlc2VudCwKKyAgICAgICAgICAgIChpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9EV09SRF9TQ0FUVEVSRURfUkVBRCkpOworCisgICBicndfbWFya19zdXJmYWNlX3VzZWQoJmMtPnByb2dfZGF0YS5iYXNlLCBpbnN0LT50YXJnZXQpOworfQorCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX2ZiX3dyaXRlKGZzX2luc3QgKmluc3QpCit7CisgICBib29sIGVvdCA9IGluc3QtPmVvdDsKKyAgIHN0cnVjdCBicndfcmVnIGltcGxpZWRfaGVhZGVyOworICAgdWludDMyX3QgbXNnX2NvbnRyb2w7CisKKyAgIC8qIEhlYWRlciBpcyAyIHJlZ3MsIGcwIGFuZCBnMSBhcmUgdGhlIGNvbnRlbnRzLiBnMCB3aWxsIGJlIGltcGxpZWQKKyAgICAqIG1vdmUsIGhlcmUncyBnMS4KKyAgICAqLworICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKworICAgaWYgKGluc3QtPmhlYWRlcl9wcmVzZW50KSB7CisgICAgICAvKiBPbiBIU1csIHRoZSBHUFUgd2lsbCB1c2UgdGhlIHByZWRpY2F0ZSBvbiBTRU5EQywgdW5sZXNzIHRoZSBoZWFkZXIgaXMKKyAgICAgICAqIHByZXNlbnQuCisgICAgICAgKi8KKyAgICAgIGlmICgoZnAgJiYgZnAtPlVzZXNLaWxsKSB8fCBjLT5rZXkuYWxwaGFfdGVzdF9mdW5jKSB7CisgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBwaXhlbF9tYXNrOworCisgICAgICAgICBpZiAoYnJ3LT5nZW4gPj0gNikKKyAgICAgICAgICAgIHBpeGVsX21hc2sgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKDEsIDcpLCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwaXhlbF9tYXNrID0gcmV0eXBlKGJyd192ZWMxX2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworCisgICAgICAgICBicndfTU9WKHAsIHBpeGVsX21hc2ssIGJyd19mbGFnX3JlZygwLCAxKSk7CisgICAgICB9CisKKyAgICAgIGlmIChicnctPmdlbiA+PSA2KSB7CisJIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fQ09NUFJFU1NFRCk7CisJIGJyd19NT1YocCwKKwkJIHJldHlwZShicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYpLCBCUldfUkVHSVNURVJfVFlQRV9VRCksCisJCSByZXR5cGUoYnJ3X3ZlYzhfZ3JmKDAsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworCSBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworCisgICAgICAgICBpZiAoaW5zdC0+dGFyZ2V0ID4gMCAmJiBjLT5rZXkucmVwbGljYXRlX2FscGhhKSB7CisgICAgICAgICAgICAvKiBTZXQgIlNvdXJjZTAgQWxwaGEgUHJlc2VudCB0byBSZW5kZXJUYXJnZXQiIGJpdCBpbiBtZXNzYWdlCisgICAgICAgICAgICAgKiBoZWFkZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJyd19PUihwLAorCQkgICB2ZWMxKHJldHlwZShicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYpLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpLAorCQkgICB2ZWMxKHJldHlwZShicndfdmVjOF9ncmYoMCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSksCisJCSAgIGJyd19pbW1fdWQoMHgxIDw8IDExKSk7CisgICAgICAgICB9CisKKwkgaWYgKGluc3QtPnRhcmdldCA+IDApIHsKKwkgICAgLyogU2V0IHRoZSByZW5kZXIgdGFyZ2V0IGluZGV4IGZvciBjaG9vc2luZyBCTEVORF9TVEFURS4gKi8KKwkgICAgYnJ3X01PVihwLCByZXR5cGUoYnJ3X3ZlYzFfcmVnKEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUsCisJCQkJCSAgIGluc3QtPmJhc2VfbXJmLCAyKSwKKwkJCSAgICAgIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwKKwkJICAgIGJyd19pbW1fdWQoaW5zdC0+dGFyZ2V0KSk7CisJIH0KKworCSBpbXBsaWVkX2hlYWRlciA9IGJyd19udWxsX3JlZygpOworICAgICAgfSBlbHNlIHsKKwkgaW1wbGllZF9oZWFkZXIgPSByZXR5cGUoYnJ3X3ZlYzhfZ3JmKDAsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CisKKwkgYnJ3X01PVihwLAorCQkgYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmICsgMSksCisJCSBicndfdmVjOF9ncmYoMSwgMCkpOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGltcGxpZWRfaGVhZGVyID0gYnJ3X251bGxfcmVnKCk7CisgICB9CisKKyAgIGlmICh0aGlzLT5kdWFsX3NvdXJjZV9vdXRwdXQpCisgICAgICBtc2dfY29udHJvbCA9IEJSV19EQVRBUE9SVF9SRU5ERVJfVEFSR0VUX1dSSVRFX1NJTUQ4X0RVQUxfU09VUkNFX1NVQlNQQU4wMTsKKyAgIGVsc2UgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KQorICAgICAgbXNnX2NvbnRyb2wgPSBCUldfREFUQVBPUlRfUkVOREVSX1RBUkdFVF9XUklURV9TSU1EMTZfU0lOR0xFX1NPVVJDRTsKKyAgIGVsc2UKKyAgICAgIG1zZ19jb250cm9sID0gQlJXX0RBVEFQT1JUX1JFTkRFUl9UQVJHRVRfV1JJVEVfU0lNRDhfU0lOR0xFX1NPVVJDRV9TVUJTUEFOMDE7CisKKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKworICAgdWludDMyX3Qgc3VyZl9pbmRleCA9CisgICAgICBjLT5wcm9nX2RhdGEuYmluZGluZ190YWJsZS5yZW5kZXJfdGFyZ2V0X3N0YXJ0ICsgaW5zdC0+dGFyZ2V0OworICAgYnJ3X2ZiX1dSSVRFKHAsCisJCWRpc3BhdGNoX3dpZHRoLAorCQlpbnN0LT5iYXNlX21yZiwKKwkJaW1wbGllZF9oZWFkZXIsCisJCW1zZ19jb250cm9sLAorCQlzdXJmX2luZGV4LAorCQlpbnN0LT5tbGVuLAorCQkwLAorCQllb3QsCisJCWluc3QtPmhlYWRlcl9wcmVzZW50KTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZjLT5wcm9nX2RhdGEuYmFzZSwgc3VyZl9pbmRleCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYmxvcnBfZmJfd3JpdGUoZnNfaW5zdCAqaW5zdCkKK3sKKyAgIGJyd19mYl9XUklURShwLAorICAgICAgICAgICAgICAgIDE2IC8qIGRpc3BhdGNoX3dpZHRoICovLAorICAgICAgICAgICAgICAgIGluc3QtPmJhc2VfbXJmLAorICAgICAgICAgICAgICAgIGJyd19yZWdfZnJvbV9mc19yZWcoJmluc3QtPnNyY1swXSksCisgICAgICAgICAgICAgICAgQlJXX0RBVEFQT1JUX1JFTkRFUl9UQVJHRVRfV1JJVEVfU0lNRDE2X1NJTkdMRV9TT1VSQ0UsCisgICAgICAgICAgICAgICAgaW5zdC0+dGFyZ2V0LAorICAgICAgICAgICAgICAgIGluc3QtPm1sZW4sCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgIGluc3QtPmhlYWRlcl9wcmVzZW50KTsKK30KKworLyogQ29tcHV0ZXMgdGhlIGludGVnZXIgcGl4ZWwgeCx5IHZhbHVlcyBmcm9tIHRoZSBvcmlnaW4uCisgKgorICogVGhpcyBpcyB0aGUgYmFzaXMgb2YgZ2xfRnJhZ0Nvb3JkIGNvbXB1dGF0aW9uLCBidXQgaXMgYWxzbyB1c2VkCisgKiBwcmUtZ2VuNiBmb3IgY29tcHV0aW5nIHRoZSBkZWx0YXMgZnJvbSB2MCBmb3IgY29tcHV0aW5nCisgKiBpbnRlcnBvbGF0aW9uLgorICovCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX3BpeGVsX3h5KHN0cnVjdCBicndfcmVnIGRzdCwgYm9vbCBpc194KQoreworICAgc3RydWN0IGJyd19yZWcgZzFfdXcgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKDEsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VVyk7CisgICBzdHJ1Y3QgYnJ3X3JlZyBzcmM7CisgICBzdHJ1Y3QgYnJ3X3JlZyBkZWx0YXM7CisKKyAgIGlmIChpc194KSB7CisgICAgICBzcmMgPSBzdHJpZGUoc3Vib2Zmc2V0KGcxX3V3LCA0KSwgMiwgNCwgMCk7CisgICAgICBkZWx0YXMgPSBicndfaW1tX3YoMHgxMDEwMTAxMCk7CisgICB9IGVsc2UgeworICAgICAgc3JjID0gc3RyaWRlKHN1Ym9mZnNldChnMV91dywgNSksIDIsIDQsIDApOworICAgICAgZGVsdGFzID0gYnJ3X2ltbV92KDB4MTEwMDExMDApOworICAgfQorCisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpIHsKKyAgICAgIGRzdCA9IHZlYzE2KGRzdCk7CisgICB9CisKKyAgIC8qIFdlIGRvIHRoaXMgU0lNRDggb3IgU0lNRDE2LCBidXQgc2luY2UgdGhlIGRlc3RpbmF0aW9uIGlzIFVXIHdlCisgICAgKiBkb24ndCBkbyBjb21wcmVzc2lvbiBpbiB0aGUgU0lNRDE2IGNhc2UuCisgICAgKi8KKyAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworICAgYnJ3X0FERChwLCBkc3QsIHNyYywgZGVsdGFzKTsKKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9saW50ZXJwKGZzX2luc3QgKmluc3QsCisJCQkgICAgIHN0cnVjdCBicndfcmVnIGRzdCwgc3RydWN0IGJyd19yZWcgKnNyYykKK3sKKyAgIHN0cnVjdCBicndfcmVnIGRlbHRhX3ggPSBzcmNbMF07CisgICBzdHJ1Y3QgYnJ3X3JlZyBkZWx0YV95ID0gc3JjWzFdOworICAgc3RydWN0IGJyd19yZWcgaW50ZXJwID0gc3JjWzJdOworCisgICBpZiAoYnJ3LT5oYXNfcGxuICYmCisgICAgICAgZGVsdGFfeS5uciA9PSBkZWx0YV94Lm5yICsgMSAmJgorICAgICAgIChicnctPmdlbiA+PSA2IHx8IChkZWx0YV94Lm5yICYgMSkgPT0gMCkpIHsKKyAgICAgIGJyd19QTE4ocCwgZHN0LCBpbnRlcnAsIGRlbHRhX3gpOworICAgfSBlbHNlIHsKKyAgICAgIGJyd19MSU5FKHAsIGJyd19udWxsX3JlZygpLCBpbnRlcnAsIGRlbHRhX3gpOworICAgICAgYnJ3X01BQyhwLCBkc3QsIHN1Ym9mZnNldChpbnRlcnAsIDEpLCBkZWx0YV95KTsKKyAgIH0KK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYXRoMV9nZW43KGZzX2luc3QgKmluc3QsCisJCQkgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkJCSAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCkKK3sKKyAgIGFzc2VydChpbnN0LT5tbGVuID09IDApOworICAgYnJ3X21hdGgocCwgZHN0LAorCSAgICBicndfbWF0aF9mdW5jdGlvbihpbnN0LT5vcGNvZGUpLAorCSAgICAwLCBzcmMwLAorCSAgICBCUldfTUFUSF9EQVRBX1ZFQ1RPUiwKKwkgICAgQlJXX01BVEhfUFJFQ0lTSU9OX0ZVTEwpOworfQorCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX21hdGgyX2dlbjcoZnNfaW5zdCAqaW5zdCwKKwkJCSAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorCQkJICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorCQkJICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKQoreworICAgYXNzZXJ0KGluc3QtPm1sZW4gPT0gMCk7CisgICBicndfbWF0aDIocCwgZHN0LCBicndfbWF0aF9mdW5jdGlvbihpbnN0LT5vcGNvZGUpLCBzcmMwLCBzcmMxKTsKK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYXRoMV9nZW42KGZzX2luc3QgKmluc3QsCisJCQkgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkJCSAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCkKK3sKKyAgIGludCBvcCA9IGJyd19tYXRoX2Z1bmN0aW9uKGluc3QtPm9wY29kZSk7CisKKyAgIGFzc2VydChpbnN0LT5tbGVuID09IDApOworCisgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworICAgYnJ3X21hdGgocCwgZHN0LAorCSAgICBvcCwKKwkgICAgMCwgc3JjMCwKKwkgICAgQlJXX01BVEhfREFUQV9WRUNUT1IsCisJICAgIEJSV19NQVRIX1BSRUNJU0lPTl9GVUxMKTsKKworICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OXzJOREhBTEYpOworICAgICAgYnJ3X21hdGgocCwgc2VjaGFsZihkc3QpLAorCSAgICAgICBvcCwKKwkgICAgICAgMCwgc2VjaGFsZihzcmMwKSwKKwkgICAgICAgQlJXX01BVEhfREFUQV9WRUNUT1IsCisJICAgICAgIEJSV19NQVRIX1BSRUNJU0lPTl9GVUxMKTsKKyAgICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fQ09NUFJFU1NFRCk7CisgICB9Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbWF0aDJfZ2VuNihmc19pbnN0ICppbnN0LAorCQkJICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisJCQkgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzEpCit7CisgICBpbnQgb3AgPSBicndfbWF0aF9mdW5jdGlvbihpbnN0LT5vcGNvZGUpOworCisgICBhc3NlcnQoaW5zdC0+bWxlbiA9PSAwKTsKKworICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgIGJyd19tYXRoMihwLCBkc3QsIG9wLCBzcmMwLCBzcmMxKTsKKworICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OXzJOREhBTEYpOworICAgICAgYnJ3X21hdGgyKHAsIHNlY2hhbGYoZHN0KSwgb3AsIHNlY2hhbGYoc3JjMCksIHNlY2hhbGYoc3JjMSkpOworICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9DT01QUkVTU0VEKTsKKyAgIH0KK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYXRoX2dlbjQoZnNfaW5zdCAqaW5zdCwKKwkJCSAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICAgICAgc3RydWN0IGJyd19yZWcgc3JjKQoreworICAgaW50IG9wID0gYnJ3X21hdGhfZnVuY3Rpb24oaW5zdC0+b3Bjb2RlKTsKKworICAgYXNzZXJ0KGluc3QtPm1sZW4gPj0gMSk7CisKKyAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fTk9ORSk7CisgICBicndfbWF0aChwLCBkc3QsCisJICAgIG9wLAorCSAgICBpbnN0LT5iYXNlX21yZiwgc3JjLAorCSAgICBCUldfTUFUSF9EQVRBX1ZFQ1RPUiwKKwkgICAgQlJXX01BVEhfUFJFQ0lTSU9OX0ZVTEwpOworCisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpIHsKKyAgICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fMk5ESEFMRik7CisgICAgICBicndfbWF0aChwLCBzZWNoYWxmKGRzdCksCisJICAgICAgIG9wLAorCSAgICAgICBpbnN0LT5iYXNlX21yZiArIDEsIHNlY2hhbGYoc3JjKSwKKwkgICAgICAgQlJXX01BVEhfREFUQV9WRUNUT1IsCisJICAgICAgIEJSV19NQVRIX1BSRUNJU0lPTl9GVUxMKTsKKworICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9DT01QUkVTU0VEKTsKKyAgIH0KK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYXRoX2c0NShmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYykKK3sKKyAgIGlmIChpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9QT1cgfHwKKyAgICAgICBpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQgfHwKKyAgICAgICBpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9JTlRfUkVNQUlOREVSKSB7CisgICAgICBnZW5lcmF0ZV9tYXRoX2dlbjQoaW5zdCwgZHN0LCBzcmMpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpbnQgb3AgPSBicndfbWF0aF9mdW5jdGlvbihpbnN0LT5vcGNvZGUpOworCisgICBhc3NlcnQoaW5zdC0+bWxlbiA+PSAxKTsKKworICAgYnJ3X21hdGgocCwgZHN0LAorICAgICAgICAgICAgb3AsCisgICAgICAgICAgICBpbnN0LT5iYXNlX21yZiwgc3JjLAorICAgICAgICAgICAgQlJXX01BVEhfREFUQV9WRUNUT1IsCisgICAgICAgICAgICBCUldfTUFUSF9QUkVDSVNJT05fRlVMTCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdGV4KGZzX2luc3QgKmluc3QsIHN0cnVjdCBicndfcmVnIGRzdCwgc3RydWN0IGJyd19yZWcgc3JjKQoreworICAgaW50IG1zZ190eXBlID0gLTE7CisgICBpbnQgcmxlbiA9IDQ7CisgICB1aW50MzJfdCBzaW1kX21vZGUgPSBCUldfU0FNUExFUl9TSU1EX01PREVfU0lNRDg7CisgICB1aW50MzJfdCByZXR1cm5fZm9ybWF0OworCisgICBzd2l0Y2ggKGRzdC50eXBlKSB7CisgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX0Q6CisgICAgICByZXR1cm5fZm9ybWF0ID0gQlJXX1NBTVBMRVJfUkVUVVJOX0ZPUk1BVF9TSU5UMzI7CisgICAgICBicmVhazsKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVUQ6CisgICAgICByZXR1cm5fZm9ybWF0ID0gQlJXX1NBTVBMRVJfUkVUVVJOX0ZPUk1BVF9VSU5UMzI7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm5fZm9ybWF0ID0gQlJXX1NBTVBMRVJfUkVUVVJOX0ZPUk1BVF9GTE9BVDMyOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSAxNiAmJgorICAgICAgIWluc3QtPmZvcmNlX3VuY29tcHJlc3NlZCAmJiAhaW5zdC0+Zm9yY2Vfc2VjaGFsZikKKyAgICAgIHNpbWRfbW9kZSA9IEJSV19TQU1QTEVSX1NJTURfTU9ERV9TSU1EMTY7CisKKyAgIGlmIChicnctPmdlbiA+PSA1KSB7CisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RFWDoKKwkgaWYgKGluc3QtPnNoYWRvd19jb21wYXJlKSB7CisJICAgIG1zZ190eXBlID0gR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0NPTVBBUkU7CisJIH0gZWxzZSB7CisJICAgIG1zZ190eXBlID0gR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFOworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSBGU19PUENPREVfVFhCOgorCSBpZiAoaW5zdC0+c2hhZG93X2NvbXBhcmUpIHsKKwkgICAgbXNnX3R5cGUgPSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfQklBU19DT01QQVJFOworCSB9IGVsc2UgeworCSAgICBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9CSUFTOworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYTDoKKwkgaWYgKGluc3QtPnNoYWRvd19jb21wYXJlKSB7CisJICAgIG1zZ190eXBlID0gR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xPRF9DT01QQVJFOworCSB9IGVsc2UgeworCSAgICBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MT0Q7CisJIH0KKwkgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhTOgorCSBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9SRVNJTkZPOworCSBicmVhazsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEQ6CisgICAgICAgICBpZiAoaW5zdC0+c2hhZG93X2NvbXBhcmUpIHsKKyAgICAgICAgICAgIC8qIEdlbjcuNSsuICBPdGhlcndpc2UsIGxvd2VyZWQgYnkgYnJ3X2xvd2VyX3RleHR1cmVfZ3JhZGllbnRzKCkuICovCisgICAgICAgICAgICBhc3NlcnQoYnJ3LT5pc19oYXN3ZWxsKTsKKyAgICAgICAgICAgIG1zZ190eXBlID0gSFNXX1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfREVSSVZfQ09NUEFSRTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9ERVJJVlM7CisgICAgICAgICB9CisJIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRjoKKwkgbXNnX3R5cGUgPSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTEQ7CisJIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRl9DTVM6CisgICAgICAgICBpZiAoYnJ3LT5nZW4gPj0gNykKKyAgICAgICAgICAgIG1zZ190eXBlID0gR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xEMkRNUzsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1zZ190eXBlID0gR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xEOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhGX1VNUzoKKyAgICAgICAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgICAgICAgIG1zZ190eXBlID0gR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xEMkRTUzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRl9NQ1M6CisgICAgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAgICBtc2dfdHlwZSA9IEdFTjdfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MRF9NQ1M7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9MT0Q6CisgICAgICAgICBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX0xPRDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RHNDoKKyAgICAgICAgIGlmIChpbnN0LT5zaGFkb3dfY29tcGFyZSkgeworICAgICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfR0FUSEVSNF9DOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChicnctPmdlbiA+PSA2KTsKKyAgICAgICAgICAgIG1zZ190eXBlID0gR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0dBVEhFUjQ7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9URzRfT0ZGU0VUOgorICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgICAgaWYgKGluc3QtPnNoYWRvd19jb21wYXJlKSB7CisgICAgICAgICAgICBtc2dfdHlwZSA9IEdFTjdfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9HQVRIRVI0X1BPX0M7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfR0FUSEVSNF9QTzsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9URVg6CisJIC8qIE5vdGUgdGhhdCBHNDUgYW5kIG9sZGVyIGRldGVybWluZXMgc2hhZG93IGNvbXBhcmUgYW5kIGRpc3BhdGNoIHdpZHRoCisJICAqIGZyb20gbWVzc2FnZSBsZW5ndGggZm9yIG1vc3QgbWVzc2FnZXMuCisJICAqLworCSBhc3NlcnQoZGlzcGF0Y2hfd2lkdGggPT0gOCk7CisJIG1zZ190eXBlID0gQlJXX1NBTVBMRVJfTUVTU0FHRV9TSU1EOF9TQU1QTEU7CisJIGlmIChpbnN0LT5zaGFkb3dfY29tcGFyZSkgeworCSAgICBhc3NlcnQoaW5zdC0+bWxlbiA9PSA2KTsKKwkgfSBlbHNlIHsKKwkgICAgYXNzZXJ0KGluc3QtPm1sZW4gPD0gNCk7CisJIH0KKwkgYnJlYWs7CisgICAgICBjYXNlIEZTX09QQ09ERV9UWEI6CisJIGlmIChpbnN0LT5zaGFkb3dfY29tcGFyZSkgeworCSAgICBhc3NlcnQoaW5zdC0+bWxlbiA9PSA2KTsKKwkgICAgbXNnX3R5cGUgPSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQ4X1NBTVBMRV9CSUFTX0NPTVBBUkU7CisJIH0gZWxzZSB7CisJICAgIGFzc2VydChpbnN0LT5tbGVuID09IDkpOworCSAgICBtc2dfdHlwZSA9IEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDE2X1NBTVBMRV9CSUFTOworCSAgICBzaW1kX21vZGUgPSBCUldfU0FNUExFUl9TSU1EX01PREVfU0lNRDE2OworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYTDoKKwkgaWYgKGluc3QtPnNoYWRvd19jb21wYXJlKSB7CisJICAgIGFzc2VydChpbnN0LT5tbGVuID09IDYpOworCSAgICBtc2dfdHlwZSA9IEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDhfU0FNUExFX0xPRF9DT01QQVJFOworCSB9IGVsc2UgeworCSAgICBhc3NlcnQoaW5zdC0+bWxlbiA9PSA5KTsKKwkgICAgbXNnX3R5cGUgPSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQxNl9TQU1QTEVfTE9EOworCSAgICBzaW1kX21vZGUgPSBCUldfU0FNUExFUl9TSU1EX01PREVfU0lNRDE2OworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRDoKKwkgLyogVGhlcmUgaXMgbm8gc2FtcGxlX2RfYyBtZXNzYWdlOyBjb21wYXJpc29ucyBhcmUgZG9uZSBtYW51YWxseSAqLworCSBhc3NlcnQoaW5zdC0+bWxlbiA9PSA3IHx8IGluc3QtPm1sZW4gPT0gMTApOworCSBtc2dfdHlwZSA9IEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDhfU0FNUExFX0dSQURJRU5UUzsKKwkgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhGOgorCSBhc3NlcnQoaW5zdC0+bWxlbiA9PSA5KTsKKwkgbXNnX3R5cGUgPSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQxNl9MRDsKKwkgc2ltZF9tb2RlID0gQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQxNjsKKwkgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhTOgorCSBhc3NlcnQoaW5zdC0+bWxlbiA9PSAzKTsKKwkgbXNnX3R5cGUgPSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQxNl9SRVNJTkZPOworCSBzaW1kX21vZGUgPSBCUldfU0FNUExFUl9TSU1EX01PREVfU0lNRDE2OworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisJIGJyZWFrOworICAgICAgfQorICAgfQorICAgYXNzZXJ0KG1zZ190eXBlICE9IC0xKTsKKworICAgaWYgKHNpbWRfbW9kZSA9PSBCUldfU0FNUExFUl9TSU1EX01PREVfU0lNRDE2KSB7CisgICAgICBybGVuID0gODsKKyAgICAgIGRzdCA9IHZlYzE2KGRzdCk7CisgICB9CisKKyAgIGlmIChicnctPmdlbiA+PSA3ICYmIGluc3QtPmhlYWRlcl9wcmVzZW50ICYmIGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICAvKiBUaGUgc2VuZC1mcm9tLUdSRiBmb3IgU0lNRDE2IHRleHR1cmluZyB3aXRoIGEgaGVhZGVyIGhhcyBhbiBleHRyYQorICAgICAgICogaGFyZHdhcmUgcmVnaXN0ZXIgYWxsb2NhdGVkIHRvIGl0LCB3aGljaCB3ZSBuZWVkIHRvIHNraXAgb3ZlciAoc2luY2UKKyAgICAgICAqIG91ciBjb29yZGluYXRlcyBpbiB0aGUgcGF5bG9hZCBhcmUgaW4gdGhlIGV2ZW4tbnVtYmVyZWQgcmVnaXN0ZXJzLAorICAgICAgICogYW5kIHRoZSBoZWFkZXIgY29tZXMgcmlnaHQgYmVmb3JlIHRoZSBmaXJzdCBvbmUpLgorICAgICAgICovCisgICAgICBhc3NlcnQoc3JjLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSk7CisgICAgICBzcmMubnIrKzsKKyAgIH0KKworICAgLyogTG9hZCB0aGUgbWVzc2FnZSBoZWFkZXIgaWYgcHJlc2VudC4gIElmIHRoZXJlJ3MgYSB0ZXh0dXJlIG9mZnNldCwKKyAgICAqIHdlIG5lZWQgdG8gc2V0IGl0IHVwIGV4cGxpY2l0bHkgYW5kIGxvYWQgdGhlIG9mZnNldCBiaXRmaWVsZC4KKyAgICAqIE90aGVyd2lzZSwgd2UgY2FuIHVzZSBhbiBpbXBsaWVkIG1vdmUgZnJvbSBnMCB0byB0aGUgZmlyc3QgbWVzc2FnZSByZWcuCisgICAgKi8KKyAgIGlmIChpbnN0LT5oZWFkZXJfcHJlc2VudCkgeworICAgICAgaWYgKGJydy0+Z2VuIDwgNiAmJiAhaW5zdC0+dGV4dHVyZV9vZmZzZXQpIHsKKyAgICAgICAgIC8qIFNldCB1cCBhbiBpbXBsaWVkIG1vdmUgZnJvbSBnMCB0byB0aGUgTVJGLiAqLworICAgICAgICAgc3JjID0gcmV0eXBlKGJyd192ZWM4X2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHN0cnVjdCBicndfcmVnIGhlYWRlcl9yZWc7CisKKyAgICAgICAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICAgICAgICBoZWFkZXJfcmVnID0gc3JjOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChpbnN0LT5iYXNlX21yZiAhPSAtMSk7CisgICAgICAgICAgICBoZWFkZXJfcmVnID0gYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmKTsKKyAgICAgICAgIH0KKworICAgICAgICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgICAgICAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgICAgICAgIC8qIEV4cGxpY2l0bHkgc2V0IHVwIHRoZSBtZXNzYWdlIGhlYWRlciBieSBjb3B5aW5nIGcwIHRvIHRoZSBNUkYuICovCisgICAgICAgICBicndfTU9WKHAsIGhlYWRlcl9yZWcsIGJyd192ZWM4X2dyZigwLCAwKSk7CisKKyAgICAgICAgIGlmIChpbnN0LT50ZXh0dXJlX29mZnNldCkgeworICAgICAgICAgICAgLyogU2V0IHRoZSBvZmZzZXQgYml0cyBpbiBEV29yZCAyLiAqLworICAgICAgICAgICAgYnJ3X01PVihwLCBnZXRfZWxlbWVudF91ZChoZWFkZXJfcmVnLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYnJ3X2ltbV91ZChpbnN0LT50ZXh0dXJlX29mZnNldCkpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoaW5zdC0+c2FtcGxlciA+PSAxNikgeworICAgICAgICAgICAgLyogVGhlICJTYW1wbGVyIEluZGV4IiBmaWVsZCBjYW4gb25seSBzdG9yZSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxNS4KKyAgICAgICAgICAgICAqIEhvd2V2ZXIsIHdlIGNhbiBhZGQgYW4gb2Zmc2V0IHRvIHRoZSAiU2FtcGxlciBTdGF0ZSBQb2ludGVyIgorICAgICAgICAgICAgICogZmllbGQsIGVmZmVjdGl2ZWx5IHNlbGVjdGluZyBhIGRpZmZlcmVudCBzZXQgb2YgMTYgc2FtcGxlcnMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlICJTYW1wbGVyIFN0YXRlIFBvaW50ZXIiIG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gYSAzMi1ieXRlCisgICAgICAgICAgICAgKiBvZmZzZXQsIGFuZCBlYWNoIHNhbXBsZXIgc3RhdGUgaXMgb25seSAxNi1ieXRlcywgc28gd2UgY2FuJ3QKKyAgICAgICAgICAgICAqIGV4Y2x1c2l2ZWx5IHVzZSB0aGUgb2Zmc2V0IC0gd2UgaGF2ZSB0byB1c2UgYm90aC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNzZXJ0KGJydy0+aXNfaGFzd2VsbCk7IC8qIGZpZWxkIG9ubHkgZXhpc3RzIG9uIEhhc3dlbGwgKi8KKyAgICAgICAgICAgIGJyd19BREQocCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X2VsZW1lbnRfdWQoaGVhZGVyX3JlZywgMyksCisgICAgICAgICAgICAgICAgICAgIGdldF9lbGVtZW50X3VkKGJyd192ZWM4X2dyZigwLCAwKSwgMyksCisgICAgICAgICAgICAgICAgICAgIGJyd19pbW1fdWQoMTYgKiAoaW5zdC0+c2FtcGxlciAvIDE2KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdlbjdfc2FtcGxlcl9zdGF0ZSkpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKyAgICAgIH0KKyAgIH0KKworICAgdWludDMyX3Qgc3VyZmFjZV9pbmRleCA9ICgoaW5zdC0+b3Bjb2RlID09IFNIQURFUl9PUENPREVfVEc0IHx8CisgICAgICBpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9URzRfT0ZGU0VUKQorICAgICAgPyBjLT5wcm9nX2RhdGEuYmFzZS5iaW5kaW5nX3RhYmxlLmdhdGhlcl90ZXh0dXJlX3N0YXJ0CisgICAgICA6IGMtPnByb2dfZGF0YS5iYXNlLmJpbmRpbmdfdGFibGUudGV4dHVyZV9zdGFydCkgKyBpbnN0LT5zYW1wbGVyOworCisgICBicndfU0FNUExFKHAsCisJICAgICAgcmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLAorCSAgICAgIGluc3QtPmJhc2VfbXJmLAorCSAgICAgIHNyYywKKyAgICAgICAgICAgICAgc3VyZmFjZV9pbmRleCwKKwkgICAgICBpbnN0LT5zYW1wbGVyICUgMTYsCisJICAgICAgbXNnX3R5cGUsCisJICAgICAgcmxlbiwKKwkgICAgICBpbnN0LT5tbGVuLAorCSAgICAgIGluc3QtPmhlYWRlcl9wcmVzZW50LAorCSAgICAgIHNpbWRfbW9kZSwKKwkgICAgICByZXR1cm5fZm9ybWF0KTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZjLT5wcm9nX2RhdGEuYmFzZSwgc3VyZmFjZV9pbmRleCk7Cit9CisKKworLyogRm9yIE9QQ09ERV9ERFggYW5kIE9QQ09ERV9ERFksIHBlciBjaGFubmVsIG9mIG91dHB1dCB3ZSd2ZSBnb3QgaW5wdXQKKyAqIGxvb2tpbmcgbGlrZToKKyAqCisgKiBhcmcwOiBzczAudGwgc3MwLnRyIHNzMC5ibCBzczAuYnIgc3MxLnRsIHNzMS50ciBzczEuYmwgc3MxLmJyCisgKgorICogSWRlYWxseSwgd2Ugd2FudCB0byBwcm9kdWNlOgorICoKKyAqICAgICAgICAgICBERFggICAgICAgICAgICAgICAgICAgICBERFkKKyAqIGRzdDogKHNzMC50ciAtIHNzMC50bCkgICAgIChzczAudGwgLSBzczAuYmwpCisgKiAgICAgIChzczAudHIgLSBzczAudGwpICAgICAoc3MwLnRyIC0gc3MwLmJyKQorICogICAgICAoc3MwLmJyIC0gc3MwLmJsKSAgICAgKHNzMC50bCAtIHNzMC5ibCkKKyAqICAgICAgKHNzMC5iciAtIHNzMC5ibCkgICAgIChzczAudHIgLSBzczAuYnIpCisgKiAgICAgIChzczEudHIgLSBzczEudGwpICAgICAoc3MxLnRsIC0gc3MxLmJsKQorICogICAgICAoc3MxLnRyIC0gc3MxLnRsKSAgICAgKHNzMS50ciAtIHNzMS5icikKKyAqICAgICAgKHNzMS5iciAtIHNzMS5ibCkgICAgIChzczEudGwgLSBzczEuYmwpCisgKiAgICAgIChzczEuYnIgLSBzczEuYmwpICAgICAoc3MxLnRyIC0gc3MxLmJyKQorICoKKyAqIGFuZCBhZGQgYW5vdGhlciBzZXQgb2YgdHdvIG1vcmUgc3Vic3BhbnMgaWYgaW4gMTYtcGl4ZWwgZGlzcGF0Y2ggbW9kZS4KKyAqCisgKiBGb3IgRERYLCBpdCBlbmRzIHVwIGJlaW5nIGVhc3k6IHdpZHRoID0gMiwgaG9yaXo9MCBnZXRzIHVzIHRoZSBzYW1lIHJlc3VsdAorICogZm9yIGVhY2ggcGFpciwgYW5kIHZlcnRzdHJpZGUgPSAyIGp1bXBzIHVzIDIgZWxlbWVudHMgYWZ0ZXIgcHJvY2Vzc2luZyBhCisgKiBwYWlyLiAgQnV0IHRoZSBpZGVhbCBhcHByb3hpbWF0aW9uIG1heSBpbXBvc2UgYSBodWdlIHBlcmZvcm1hbmNlIGNvc3Qgb24KKyAqIHNhbXBsZV9kLiAgT24gYXQgbGVhc3QgSGFzd2VsbCwgc2FtcGxlX2QgaW5zdHJ1Y3Rpb24gZG9lcyBzb21lCisgKiBvcHRpbWl6YXRpb25zIGlmIHRoZSBzYW1lIExPRCBpcyB1c2VkIGZvciBhbGwgcGl4ZWxzIGluIHRoZSBzdWJzcGFuLgorICoKKyAqIEZvciBERFksIHdlIG5lZWQgdG8gdXNlIEFMSUdOMTYgbW9kZSBzaW5jZSBpdCdzIGNhcGFibGUgb2YgZG9pbmcgdGhlCisgKiBhcHByb3ByaWF0ZSBzd2l6emxpbmcuCisgKi8KK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGR4KGZzX2luc3QgKmluc3QsIHN0cnVjdCBicndfcmVnIGRzdCwgc3RydWN0IGJyd19yZWcgc3JjKQoreworICAgdW5zaWduZWQgdnN0cmlkZSwgd2lkdGg7CisKKyAgIGlmIChjLT5rZXkuaGlnaF9xdWFsaXR5X2Rlcml2YXRpdmVzKSB7CisgICAgICAvKiBwcm9kdWNlIGFjY3VyYXRlIGRlcml2YXRpdmVzICovCisgICAgICB2c3RyaWRlID0gQlJXX1ZFUlRJQ0FMX1NUUklERV8yOworICAgICAgd2lkdGggPSBCUldfV0lEVEhfMjsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyogcmVwbGljYXRlIHRoZSBkZXJpdmF0aXZlIGF0IHRoZSB0b3AtbGVmdCBwaXhlbCB0byBvdGhlciBwaXhlbHMgKi8KKyAgICAgIHZzdHJpZGUgPSBCUldfVkVSVElDQUxfU1RSSURFXzQ7CisgICAgICB3aWR0aCA9IEJSV19XSURUSF80OworICAgfQorCisgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwID0gYnJ3X3JlZyhzcmMuZmlsZSwgc3JjLm5yLCAxLAorCQkJCSBCUldfUkVHSVNURVJfVFlQRV9GLAorCQkJCSB2c3RyaWRlLAorCQkJCSB3aWR0aCwKKwkJCQkgQlJXX0hPUklaT05UQUxfU1RSSURFXzAsCisJCQkJIEJSV19TV0laWkxFX1hZWlcsIFdSSVRFTUFTS19YWVpXKTsKKyAgIHN0cnVjdCBicndfcmVnIHNyYzEgPSBicndfcmVnKHNyYy5maWxlLCBzcmMubnIsIDAsCisJCQkJIEJSV19SRUdJU1RFUl9UWVBFX0YsCisJCQkJIHZzdHJpZGUsCisJCQkJIHdpZHRoLAorCQkJCSBCUldfSE9SSVpPTlRBTF9TVFJJREVfMCwKKwkJCQkgQlJXX1NXSVpaTEVfWFlaVywgV1JJVEVNQVNLX1hZWlcpOworICAgYnJ3X0FERChwLCBkc3QsIHNyYzAsIG5lZ2F0ZShzcmMxKSk7Cit9CisKKy8qIFRoZSBuZWdhdGVfdmFsdWUgYm9vbGVhbiBpcyB1c2VkIHRvIG5lZ2F0ZSB0aGUgZGVyaXZhdGl2ZSBjb21wdXRhdGlvbiBmb3IKKyAqIEZCT3MsIHNpbmNlIHRoZXkgcGxhY2UgdGhlIG9yaWdpbiBhdCB0aGUgdXBwZXIgbGVmdCBpbnN0ZWFkIG9mIHRoZSBsb3dlcgorICogbGVmdC4KKyAqLwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZHkoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0LCBzdHJ1Y3QgYnJ3X3JlZyBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWdhdGVfdmFsdWUpCit7CisgICBpZiAoYy0+a2V5LmhpZ2hfcXVhbGl0eV9kZXJpdmF0aXZlcykgeworICAgICAgLyogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMywgc2VjdGlvbiAzLjMuOSAoUmVnaXN0ZXIKKyAgICAgICAqIFJlZ2lvbiBSZXN0cmljdGlvbnMpOgorICAgICAgICoKKyAgICAgICAqICAgICBJbiBBbGlnbjE2IGFjY2VzcyBtb2RlLCBTSU1EMTYgaXMgbm90IGFsbG93ZWQgZm9yIERXIG9wZXJhdGlvbnMKKyAgICAgICAqICAgICBhbmQgU0lNRDggaXMgbm90IGFsbG93ZWQgZm9yIERGIG9wZXJhdGlvbnMuCisgICAgICAgKgorICAgICAgICogSW4gdGhpcyBjb250ZXh0LCAiRFcgb3BlcmF0aW9ucyIgbWVhbnMgIm9wZXJhdGlvbnMgYWN0aW5nIG9uIDMyLWJpdAorICAgICAgICogdmFsdWVzIiwgc28gaXQgaW5jbHVkZXMgb3BlcmF0aW9ucyBvbiBmbG9hdHMuCisgICAgICAgKgorICAgICAgICogR2VuNCBoYXMgYSBzaW1pbGFyIHJlc3RyaWN0aW9uLiAgRnJvbSB0aGUgaTk2NSBQUk0sIHNlY3Rpb24gMTEuNS4zCisgICAgICAgKiAoSW5zdHJ1Y3Rpb24gQ29tcHJlc3Npb24gLT4gUnVsZXMgYW5kIFJlc3RyaWN0aW9ucyk6CisgICAgICAgKgorICAgICAgICogICAgIEEgY29tcHJlc3NlZCBpbnN0cnVjdGlvbiBtdXN0IGJlIGluIEFsaWduMSBhY2Nlc3MgbW9kZS4gQWxpZ24xNgorICAgICAgICogICAgIG1vZGUgaW5zdHJ1Y3Rpb25zIGNhbm5vdCBiZSBjb21wcmVzc2VkLgorICAgICAgICoKKyAgICAgICAqIFNpbWlsYXIgdGV4dCBleGlzdHMgaW4gdGhlIGc0NSBQUk0uCisgICAgICAgKgorICAgICAgICogT24gdGhlc2UgcGxhdGZvcm1zLCBpZiB3ZSdyZSBidWlsZGluZyBhIFNJTUQxNiBzaGFkZXIsIHdlIG5lZWQgdG8KKyAgICAgICAqIG1hbnVhbGx5IHVucm9sbCB0byBhIHBhaXIgb2YgU0lNRDggaW5zdHJ1Y3Rpb25zLgorICAgICAgICovCisgICAgICBib29sIHVucm9sbF90b19zaW1kOCA9CisgICAgICAgICAoZGlzcGF0Y2hfd2lkdGggPT0gMTYgJiYKKyAgICAgICAgICAoYnJ3LT5nZW4gPT0gNCB8fCAoYnJ3LT5nZW4gPT0gNyAmJiAhYnJ3LT5pc19oYXN3ZWxsKSkpOworCisgICAgICAvKiBwcm9kdWNlIGFjY3VyYXRlIGRlcml2YXRpdmVzICovCisgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwID0gYnJ3X3JlZyhzcmMuZmlsZSwgc3JjLm5yLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1JFR0lTVEVSX1RZUEVfRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19WRVJUSUNBTF9TVFJJREVfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19XSURUSF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX0hPUklaT05UQUxfU1RSSURFXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfU1dJWlpMRV9YWVhZLCBXUklURU1BU0tfWFlaVyk7CisgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxID0gYnJ3X3JlZyhzcmMuZmlsZSwgc3JjLm5yLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1JFR0lTVEVSX1RZUEVfRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19WRVJUSUNBTF9TVFJJREVfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19XSURUSF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX0hPUklaT05UQUxfU1RSSURFXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfU1dJWlpMRV9aV1pXLCBXUklURU1BU0tfWFlaVyk7CisgICAgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgICAgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMTYpOworICAgICAgaWYgKHVucm9sbF90b19zaW1kOCkKKyAgICAgICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fTk9ORSk7CisgICAgICBpZiAobmVnYXRlX3ZhbHVlKQorICAgICAgICAgYnJ3X0FERChwLCBkc3QsIHNyYzEsIG5lZ2F0ZShzcmMwKSk7CisgICAgICBlbHNlCisgICAgICAgICBicndfQUREKHAsIGRzdCwgc3JjMCwgbmVnYXRlKHNyYzEpKTsKKyAgICAgIGlmICh1bnJvbGxfdG9fc2ltZDgpIHsKKyAgICAgICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fMk5ESEFMRik7CisgICAgICAgICBzcmMwID0gc2VjaGFsZihzcmMwKTsKKyAgICAgICAgIHNyYzEgPSBzZWNoYWxmKHNyYzEpOworICAgICAgICAgZHN0ID0gc2VjaGFsZihkc3QpOworICAgICAgICAgaWYgKG5lZ2F0ZV92YWx1ZSkKKyAgICAgICAgICAgIGJyd19BREQocCwgZHN0LCBzcmMxLCBuZWdhdGUoc3JjMCkpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJ3X0FERChwLCBkc3QsIHNyYzAsIG5lZ2F0ZShzcmMxKSk7CisgICAgICB9CisgICAgICBicndfcG9wX2luc25fc3RhdGUocCk7CisgICB9IGVsc2UgeworICAgICAgLyogcmVwbGljYXRlIHRoZSBkZXJpdmF0aXZlIGF0IHRoZSB0b3AtbGVmdCBwaXhlbCB0byBvdGhlciBwaXhlbHMgKi8KKyAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAgPSBicndfcmVnKHNyYy5maWxlLCBzcmMubnIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1ZFUlRJQ0FMX1NUUklERV80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1dJRFRIXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfSE9SSVpPTlRBTF9TVFJJREVfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19TV0laWkxFX1hZWlcsIFdSSVRFTUFTS19YWVpXKTsKKyAgICAgIHN0cnVjdCBicndfcmVnIHNyYzEgPSBicndfcmVnKHNyYy5maWxlLCBzcmMubnIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1ZFUlRJQ0FMX1NUUklERV80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1dJRFRIXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfSE9SSVpPTlRBTF9TVFJJREVfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19TV0laWkxFX1hZWlcsIFdSSVRFTUFTS19YWVpXKTsKKyAgICAgIGlmIChuZWdhdGVfdmFsdWUpCisgICAgICAgICBicndfQUREKHAsIGRzdCwgc3JjMSwgbmVnYXRlKHNyYzApKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGJyd19BREQocCwgZHN0LCBzcmMwLCBuZWdhdGUoc3JjMSkpOworICAgfQorfQorCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rpc2NhcmRfanVtcChmc19pbnN0ICppbnN0KQoreworICAgYXNzZXJ0KGJydy0+Z2VuID49IDYpOworCisgICAvKiBUaGlzIEhBTFQgd2lsbCBiZSBwYXRjaGVkIHVwIGF0IEZCIHdyaXRlIHRpbWUgdG8gcG9pbnQgVUlQIGF0IHRoZSBlbmQgb2YKKyAgICAqIHRoZSBwcm9ncmFtLCBhbmQgYXQgYnJ3X3VpcF9qaXAoKSBKSVAgd2lsbCBiZSBzZXQgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAqIGN1cnJlbnQgYmxvY2sgKG9yIHRoZSBwcm9ncmFtKS4KKyAgICAqLworICAgdGhpcy0+ZGlzY2FyZF9oYWx0X3BhdGNoZXMucHVzaF90YWlsKG5ldyhtZW1fY3R4KSBpcF9yZWNvcmQocC0+bnJfaW5zbikpOworCisgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgQlJXX01BU0tfRElTQUJMRSk7CisgICBnZW42X0hBTFQocCk7CisgICBicndfcG9wX2luc25fc3RhdGUocCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2NyYXRjaF93cml0ZShmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBzcmMpCit7CisgICBhc3NlcnQoaW5zdC0+bWxlbiAhPSAwKTsKKworICAgYnJ3X01PVihwLAorCSAgIHJldHlwZShicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYgKyAxKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLAorCSAgIHJldHlwZShzcmMsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICBicndfb3dvcmRfYmxvY2tfd3JpdGVfc2NyYXRjaChwLCBicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hfd2lkdGggLyA4LCBpbnN0LT5vZmZzZXQpOworfQorCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NjcmF0Y2hfcmVhZChmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QpCit7CisgICBhc3NlcnQoaW5zdC0+bWxlbiAhPSAwKTsKKworICAgYnJ3X293b3JkX2Jsb2NrX3JlYWRfc2NyYXRjaChwLCBkc3QsIGJyd19tZXNzYWdlX3JlZyhpbnN0LT5iYXNlX21yZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoX3dpZHRoIC8gOCwgaW5zdC0+b2Zmc2V0KTsKK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zY3JhdGNoX3JlYWRfZ2VuNyhmc19pbnN0ICppbnN0LCBzdHJ1Y3QgYnJ3X3JlZyBkc3QpCit7CisgICBnZW43X2Jsb2NrX3JlYWRfc2NyYXRjaChwLCBkc3QsIGRpc3BhdGNoX3dpZHRoIC8gOCwgaW5zdC0+b2Zmc2V0KTsKK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlmb3JtX3B1bGxfY29uc3RhbnRfbG9hZChmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBvZmZzZXQpCit7CisgICBhc3NlcnQoaW5zdC0+bWxlbiAhPSAwKTsKKworICAgYXNzZXJ0KGluZGV4LmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorCSAgaW5kZXgudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICB1aW50MzJfdCBzdXJmX2luZGV4ID0gaW5kZXguZHcxLnVkOworCisgICBhc3NlcnQob2Zmc2V0LmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorCSAgb2Zmc2V0LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgdWludDMyX3QgcmVhZF9vZmZzZXQgPSBvZmZzZXQuZHcxLnVkOworCisgICBicndfb3dvcmRfYmxvY2tfcmVhZChwLCBkc3QsIGJyd19tZXNzYWdlX3JlZyhpbnN0LT5iYXNlX21yZiksCisJCQlyZWFkX29mZnNldCwgc3VyZl9pbmRleCk7CisKKyAgIGJyd19tYXJrX3N1cmZhY2VfdXNlZCgmYy0+cHJvZ19kYXRhLmJhc2UsIHN1cmZfaW5kZXgpOworfQorCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaWZvcm1fcHVsbF9jb25zdGFudF9sb2FkX2dlbjcoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0KQoreworICAgYXNzZXJ0KGluc3QtPm1sZW4gPT0gMCk7CisKKyAgIGFzc2VydChpbmRleC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKwkgIGluZGV4LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgdWludDMyX3Qgc3VyZl9pbmRleCA9IGluZGV4LmR3MS51ZDsKKworICAgYXNzZXJ0KG9mZnNldC5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpOworICAgLyogUmVmZXJlbmNlIGp1c3QgdGhlIGR3b3JkIHdlIG5lZWQsIHRvIGF2b2lkIGFuZ2VyaW5nIHZhbGlkYXRlX3JlZygpLiAqLworICAgb2Zmc2V0ID0gYnJ3X3ZlYzFfZ3JmKG9mZnNldC5uciwgMCk7CisKKyAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgQlJXX01BU0tfRElTQUJMRSk7CisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpzZW5kID0gYnJ3X25leHRfaW5zbihwLCBCUldfT1BDT0RFX1NFTkQpOworICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworCisgICAvKiBXZSB1c2UgdGhlIFNJTUQ0eDIgbW9kZSBiZWNhdXNlIHdlIHdhbnQgdG8gZW5kIHVwIHdpdGggNCBjb21wb25lbnRzIGluCisgICAgKiB0aGUgZGVzdGluYXRpb24gbG9hZGVkIGNvbnNlY3V0aXZlbHkgZnJvbSB0aGUgc2FtZSBvZmZzZXQgKHdoaWNoIGFwcGVhcnMKKyAgICAqIGluIHRoZSBmaXJzdCBjb21wb25lbnQsIGFuZCB0aGUgcmVzdCBhcmUgaWdub3JlZCkuCisgICAgKi8KKyAgIGRzdC53aWR0aCA9IEJSV19XSURUSF80OworICAgYnJ3X3NldF9kZXN0KHAsIHNlbmQsIGRzdCk7CisgICBicndfc2V0X3NyYzAocCwgc2VuZCwgb2Zmc2V0KTsKKyAgIGJyd19zZXRfc2FtcGxlcl9tZXNzYWdlKHAsIHNlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogTEQgbWVzc2FnZSBpZ25vcmVzIHNhbXBsZXIgdW5pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogcmxlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbWxlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIG5vIGhlYWRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQ0WDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZjLT5wcm9nX2RhdGEuYmFzZSwgc3VyZl9pbmRleCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdmFyeWluZ19wdWxsX2NvbnN0YW50X2xvYWQoZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0KQoreworICAgYXNzZXJ0KGJydy0+Z2VuIDwgNyk7IC8qIFNob3VsZCB1c2UgdGhlIGdlbjcgdmFyaWFudC4gKi8KKyAgIGFzc2VydChpbnN0LT5oZWFkZXJfcHJlc2VudCk7CisgICBhc3NlcnQoaW5zdC0+bWxlbik7CisKKyAgIGFzc2VydChpbmRleC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKwkgIGluZGV4LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgdWludDMyX3Qgc3VyZl9pbmRleCA9IGluZGV4LmR3MS51ZDsKKworICAgdWludDMyX3Qgc2ltZF9tb2RlLCBybGVuLCBtc2dfdHlwZTsKKyAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSAxNikgeworICAgICAgc2ltZF9tb2RlID0gQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQxNjsKKyAgICAgIHJsZW4gPSA4OworICAgfSBlbHNlIHsKKyAgICAgIHNpbWRfbW9kZSA9IEJSV19TQU1QTEVSX1NJTURfTU9ERV9TSU1EODsKKyAgICAgIHJsZW4gPSA0OworICAgfQorCisgICBpZiAoYnJ3LT5nZW4gPj0gNSkKKyAgICAgIG1zZ190eXBlID0gR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xEOworICAgZWxzZSB7CisgICAgICAvKiBXZSBhbHdheXMgdXNlIHRoZSBTSU1EMTYgbWVzc2FnZSBzbyB0aGF0IHdlIG9ubHkgaGF2ZSB0byBsb2FkIFUsIGFuZAorICAgICAgICogbm90IFYgb3IgUi4KKyAgICAgICAqLworICAgICAgbXNnX3R5cGUgPSBCUldfU0FNUExFUl9NRVNTQUdFX1NJTUQxNl9MRDsKKyAgICAgIGFzc2VydChpbnN0LT5tbGVuID09IDMpOworICAgICAgYXNzZXJ0KGluc3QtPnJlZ3Nfd3JpdHRlbiA9PSA4KTsKKyAgICAgIHJsZW4gPSA4OworICAgICAgc2ltZF9tb2RlID0gQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQxNjsKKyAgIH0KKworICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0X21yZiA9IHJldHlwZShicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1JFR0lTVEVSX1RZUEVfRCk7CisgICBicndfTU9WKHAsIG9mZnNldF9tcmYsIG9mZnNldCk7CisKKyAgIHN0cnVjdCBicndfcmVnIGhlYWRlciA9IGJyd192ZWM4X2dyZigwLCAwKTsKKyAgIGdlbjZfcmVzb2x2ZV9pbXBsaWVkX21vdmUocCwgJmhlYWRlciwgaW5zdC0+YmFzZV9tcmYpOworCisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpzZW5kID0gYnJ3X25leHRfaW5zbihwLCBCUldfT1BDT0RFX1NFTkQpOworICAgc2VuZC0+aGVhZGVyLmNvbXByZXNzaW9uX2NvbnRyb2wgPSBCUldfQ09NUFJFU1NJT05fTk9ORTsKKyAgIGJyd19zZXRfZGVzdChwLCBzZW5kLCByZXR5cGUoZHN0LCBCUldfUkVHSVNURVJfVFlQRV9VVykpOworICAgYnJ3X3NldF9zcmMwKHAsIHNlbmQsIGhlYWRlcik7CisgICBpZiAoYnJ3LT5nZW4gPCA2KQorICAgICAgc2VuZC0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gaW5zdC0+YmFzZV9tcmY7CisKKyAgIC8qIE91ciBzdXJmYWNlIGlzIHNldCB1cCBhcyBmbG9hdHMsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBhY3R1YWwgZGF0YSBpcworICAgICogc3RvcmVkIGluIGl0LgorICAgICovCisgICB1aW50MzJfdCByZXR1cm5fZm9ybWF0ID0gQlJXX1NBTVBMRVJfUkVUVVJOX0ZPUk1BVF9GTE9BVDMyOworICAgYnJ3X3NldF9zYW1wbGVyX21lc3NhZ2UocCwgc2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBzYW1wbGVyICh1bnVzZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5tbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+aGVhZGVyX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1kX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fZm9ybWF0KTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZjLT5wcm9nX2RhdGEuYmFzZSwgc3VyZl9pbmRleCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdmFyeWluZ19wdWxsX2NvbnN0YW50X2xvYWRfZ2VuNyhmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBvZmZzZXQpCit7CisgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAvKiBWYXJ5aW5nLW9mZnNldCBwdWxsIGNvbnN0YW50IGxvYWRzIGFyZSB0cmVhdGVkIGFzIGEgbm9ybWFsIGV4cHJlc3Npb24gb24KKyAgICAqIGdlbjcsIHNvIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlbmQgbWVzc2FnZSBpcyBoaWRkZW4gYXQgdGhlIElSIGxldmVsLgorICAgICovCisgICBhc3NlcnQoIWluc3QtPmhlYWRlcl9wcmVzZW50KTsKKyAgIGFzc2VydCghaW5zdC0+bWxlbik7CisKKyAgIGFzc2VydChpbmRleC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKwkgIGluZGV4LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgdWludDMyX3Qgc3VyZl9pbmRleCA9IGluZGV4LmR3MS51ZDsKKworICAgdWludDMyX3Qgc2ltZF9tb2RlLCBybGVuLCBtbGVuOworICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICBtbGVuID0gMjsKKyAgICAgIHJsZW4gPSA4OworICAgICAgc2ltZF9tb2RlID0gQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQxNjsKKyAgIH0gZWxzZSB7CisgICAgICBtbGVuID0gMTsKKyAgICAgIHJsZW4gPSA0OworICAgICAgc2ltZF9tb2RlID0gQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQ4OworICAgfQorCisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpzZW5kID0gYnJ3X25leHRfaW5zbihwLCBCUldfT1BDT0RFX1NFTkQpOworICAgYnJ3X3NldF9kZXN0KHAsIHNlbmQsIGRzdCk7CisgICBicndfc2V0X3NyYzAocCwgc2VuZCwgb2Zmc2V0KTsKKyAgIGJyd19zZXRfc2FtcGxlcl9tZXNzYWdlKHAsIHNlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogTEQgbWVzc2FnZSBpZ25vcmVzIHNhbXBsZXIgdW5pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyogbm8gaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1kX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZjLT5wcm9nX2RhdGEuYmFzZSwgc3VyZl9pbmRleCk7Cit9CisKKy8qKgorICogQ2F1c2UgdGhlIGN1cnJlbnQgcGl4ZWwvc2FtcGxlIG1hc2sgKGZyb20gUjEuNyBiaXRzIDE1OjApIHRvIGJlIHRyYW5zZmVycmVkCisgKiBpbnRvIHRoZSBmbGFncyByZWdpc3RlciAoZjAuMCkuCisgKgorICogVXNlZCBvbmx5IG9uIEdlbjYgYW5kIGFib3ZlLgorICovCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX21vdl9kaXNwYXRjaF90b19mbGFncyhmc19pbnN0ICppbnN0KQoreworICAgc3RydWN0IGJyd19yZWcgZmxhZ3MgPSBicndfZmxhZ19yZWcoMCwgaW5zdC0+ZmxhZ19zdWJyZWcpOworICAgc3RydWN0IGJyd19yZWcgZGlzcGF0Y2hfbWFzazsKKworICAgaWYgKGJydy0+Z2VuID49IDYpCisgICAgICBkaXNwYXRjaF9tYXNrID0gcmV0eXBlKGJyd192ZWMxX2dyZigxLCA3KSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworICAgZWxzZQorICAgICAgZGlzcGF0Y2hfbWFzayA9IHJldHlwZShicndfdmVjMV9ncmYoMCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKworICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgYnJ3X01PVihwLCBmbGFncywgZGlzcGF0Y2hfbWFzayk7CisgICBicndfcG9wX2luc25fc3RhdGUocCk7Cit9CisKKworc3RhdGljIHVpbnQzMl90IGJyd19maWxlX2Zyb21fcmVnKGZzX3JlZyAqcmVnKQoreworICAgc3dpdGNoIChyZWctPmZpbGUpIHsKKyAgIGNhc2UgR1JGOgorICAgICAgcmV0dXJuIEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEU7CisgICBjYXNlIE1SRjoKKyAgICAgIHJldHVybiBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFOworICAgY2FzZSBJTU06CisgICAgICByZXR1cm4gQlJXX0lNTUVESUFURV9WQUxVRTsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworICAgICAgcmV0dXJuIEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEU7CisgICB9Cit9CisKK3N0cnVjdCBicndfcmVnCiticndfcmVnX2Zyb21fZnNfcmVnKGZzX3JlZyAqcmVnKQoreworICAgc3RydWN0IGJyd19yZWcgYnJ3X3JlZzsKKworICAgc3dpdGNoIChyZWctPmZpbGUpIHsKKyAgIGNhc2UgR1JGOgorICAgY2FzZSBNUkY6CisgICAgICBpZiAocmVnLT5zdHJpZGUgPT0gMCkgeworICAgICAgICAgYnJ3X3JlZyA9IGJyd192ZWMxX3JlZyhicndfZmlsZV9mcm9tX3JlZyhyZWcpLCByZWctPnJlZywgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgYnJ3X3JlZyA9IGJyd192ZWM4X3JlZyhicndfZmlsZV9mcm9tX3JlZyhyZWcpLCByZWctPnJlZywgMCk7CisgICAgICAgICBicndfcmVnID0gc3RyaWRlKGJyd19yZWcsIDggKiByZWctPnN0cmlkZSwgOCwgcmVnLT5zdHJpZGUpOworICAgICAgfQorCisgICAgICBicndfcmVnID0gcmV0eXBlKGJyd19yZWcsIHJlZy0+dHlwZSk7CisgICAgICBicndfcmVnID0gYnl0ZV9vZmZzZXQoYnJ3X3JlZywgcmVnLT5zdWJyZWdfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBJTU06CisgICAgICBzd2l0Y2ggKHJlZy0+dHlwZSkgeworICAgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9GOgorCSBicndfcmVnID0gYnJ3X2ltbV9mKHJlZy0+aW1tLmYpOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRDoKKwkgYnJ3X3JlZyA9IGJyd19pbW1fZChyZWctPmltbS5pKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX1VEOgorCSBicndfcmVnID0gYnJ3X2ltbV91ZChyZWctPmltbS51KTsKKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworCSBicndfcmVnID0gYnJ3X251bGxfcmVnKCk7CisJIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEhXX1JFRzoKKyAgICAgIGFzc2VydChyZWctPnR5cGUgPT0gcmVnLT5maXhlZF9od19yZWcudHlwZSk7CisgICAgICBicndfcmVnID0gcmVnLT5maXhlZF9od19yZWc7CisgICAgICBicmVhazsKKyAgIGNhc2UgQkFEX0ZJTEU6CisgICAgICAvKiBQcm9iYWJseSB1bnVzZWQuICovCisgICAgICBicndfcmVnID0gYnJ3X251bGxfcmVnKCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgVU5JRk9STToKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICAgICBicndfcmVnID0gYnJ3X251bGxfcmVnKCk7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworICAgICAgYnJ3X3JlZyA9IGJyd19udWxsX3JlZygpOworICAgICAgYnJlYWs7CisgICB9CisgICBpZiAocmVnLT5hYnMpCisgICAgICBicndfcmVnID0gYnJ3X2FicyhicndfcmVnKTsKKyAgIGlmIChyZWctPm5lZ2F0ZSkKKyAgICAgIGJyd19yZWcgPSBuZWdhdGUoYnJ3X3JlZyk7CisKKyAgIHJldHVybiBicndfcmVnOworfQorCisvKioKKyAqIFNldHMgdGhlIGZpcnN0IHdvcmQgb2YgYSB2Z3JmIGZvciBnZW43KyBzaW1kNHgyIHVuaWZvcm0gcHVsbCBjb25zdGFudAorICogc2FtcGxlciBMRCBtZXNzYWdlcy4KKyAqCisgKiBXZSBkb24ndCB3YW50IHRvIGJha2UgaXQgaW50byB0aGUgc2VuZCBtZXNzYWdlJ3MgY29kZSBnZW5lcmF0aW9uIGJlY2F1c2UKKyAqIHRoYXQgbWVhbnMgd2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIHNjaGVkdWxlIHRoZSBpbnN0cnVjdGlvbnMuCisgKi8KK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2V0X3NpbWQ0eDJfb2Zmc2V0KGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyB2YWx1ZSkKK3sKKyAgIGFzc2VydCh2YWx1ZS5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUpOworCisgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgYnJ3X01PVihwLCByZXR5cGUoYnJ3X3ZlYzFfcmVnKGRzdC5maWxlLCBkc3QubnIsIDApLCB2YWx1ZS50eXBlKSwgdmFsdWUpOworICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworfQorCisvKiBTZXRzIHZzdHJpZGU9MTYsIHdpZHRoPTgsIGhzdHJpZGU9MiBvciB2c3RyaWRlPTAsIHdpZHRoPTEsIGhzdHJpZGU9MAorICogKHdoZW4gbWFzayBpcyBwYXNzZWQgYXMgYSB1bmlmb3JtKSBvZiByZWdpc3RlciBtYXNrIGJlZm9yZSBtb3ZpbmcgaXQKKyAqIHRvIHJlZ2lzdGVyIGRzdC4KKyAqLwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXRfb21hc2soZnNfaW5zdCAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG1hc2spCit7CisgICBib29sIHN0cmlkZV84XzhfMSA9CisgICAgKG1hc2sudnN0cmlkZSA9PSBCUldfVkVSVElDQUxfU1RSSURFXzggJiYKKyAgICAgbWFzay53aWR0aCA9PSBCUldfV0lEVEhfOCAmJgorICAgICBtYXNrLmhzdHJpZGUgPT0gQlJXX0hPUklaT05UQUxfU1RSSURFXzEpOworCisgICBib29sIHN0cmlkZV8wXzFfMCA9CisgICAgKG1hc2sudnN0cmlkZSA9PSBCUldfVkVSVElDQUxfU1RSSURFXzAgJiYKKyAgICAgbWFzay53aWR0aCA9PSBCUldfV0lEVEhfMSAmJgorICAgICBtYXNrLmhzdHJpZGUgPT0gQlJXX0hPUklaT05UQUxfU1RSSURFXzApOworCisgICBhc3NlcnQoc3RyaWRlXzhfOF8xIHx8IHN0cmlkZV8wXzFfMCk7CisgICBhc3NlcnQoZHN0LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworCisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpCisgICAgICBkc3QgPSB2ZWMxNihkc3QpOworICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fTk9ORSk7CisgICBicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19ESVNBQkxFKTsKKworICAgaWYgKHN0cmlkZV84XzhfMSkgeworICAgICAgYnJ3X01PVihwLCBkc3QsIHJldHlwZShzdHJpZGUobWFzaywgMTYsIDgsIDIpLCBkc3QudHlwZSkpOworICAgfSBlbHNlIGlmIChzdHJpZGVfMF8xXzApIHsKKyAgICAgIGJyd19NT1YocCwgZHN0LCByZXR5cGUobWFzaywgZHN0LnR5cGUpKTsKKyAgIH0KKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKK30KKworLyogU2V0cyB2c3RyaWRlPTEsIHdpZHRoPTQsIGhzdHJpZGU9MCBvZiByZWdpc3RlciBzcmMxIGR1cmluZworICogdGhlIEFERCBpbnN0cnVjdGlvbi4KKyAqLwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXRfc2FtcGxlX2lkKGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMSkKK3sKKyAgIGFzc2VydChkc3QudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9EIHx8CisgICAgICAgICAgZHN0LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgYXNzZXJ0KHNyYzAudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9EIHx8CisgICAgICAgICAgc3JjMC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fTk9ORSk7CisgICBicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19ESVNBQkxFKTsKKyAgIHN0cnVjdCBicndfcmVnIHJlZyA9IHJldHlwZShzdHJpZGUoc3JjMSwgMSwgNCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKyAgIGJyd19BREQocCwgZHN0LCBzcmMwLCByZWcpOworICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KQorICAgICAgYnJ3X0FERChwLCBvZmZzZXQoZHN0LCAxKSwgb2Zmc2V0KHNyYzAsIDEpLCBzdWJvZmZzZXQocmVnLCAyKSk7CisgICBicndfcG9wX2luc25fc3RhdGUocCk7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSByZWdpc3RlcidzIGRhdGEgdHlwZSBmcm9tIFVEIHRvIFcsIGRvdWJsaW5nIHRoZSBzdHJpZGVzIGluIG9yZGVyCisgKiB0byBjb21wZW5zYXRlIGZvciBoYWx2aW5nIHRoZSBkYXRhIHR5cGUgd2lkdGguCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnJ3X3JlZwordWRfcmVnX3RvX3coc3RydWN0IGJyd19yZWcgcikKK3sKKyAgIGFzc2VydChyLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgci50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVzsKKworICAgLyogVGhlIEJSV18qX1NUUklERSBlbnVtcyBhcmUgZGVmaW5lZCBzbyB0aGF0IGluY3JlbWVudGluZyB0aGUgZmllbGQKKyAgICAqIGRvdWJsZXMgdGhlIHJlYWwgc3RyaWRlLgorICAgICovCisgICBpZiAoci5oc3RyaWRlICE9IDApCisgICAgICArK3IuaHN0cmlkZTsKKyAgIGlmIChyLnZzdHJpZGUgIT0gMCkKKyAgICAgICsrci52c3RyaWRlOworCisgICByZXR1cm4gcjsKK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wYWNrX2hhbGZfMngxNl9zcGxpdChmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHkpCit7CisgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICBhc3NlcnQoZHN0LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgYXNzZXJ0KHgudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GKTsKKyAgIGFzc2VydCh5LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRik7CisKKyAgIC8qIEZyb20gdGhlIEl2eWJyaWRnZSBQUk0sIFZvbDQsIFBhcnQzLCBTZWN0aW9uIDYuMjcgZjMydG8xNjoKKyAgICAqCisgICAgKiAgIEJlY2F1c2UgdGhpcyBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGEgMTYtYml0IGZsb2F0aW5nLXBvaW50IHR5cGUsCisgICAgKiAgIHRoZSBkZXN0aW5hdGlvbiBkYXRhIHR5cGUgbXVzdCBiZSBXb3JkIChXKS4KKyAgICAqCisgICAgKiAgIFRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIERXb3JkLWFsaWduZWQgYW5kIHNwZWNpZnkgYSBob3Jpem9udGFsIHN0cmlkZQorICAgICogICAoSG9yelN0cmlkZSkgb2YgMi4gVGhlIDE2LWJpdCByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSBsb3dlciB3b3JkIG9mCisgICAgKiAgIGVhY2ggZGVzdGluYXRpb24gY2hhbm5lbCBhbmQgdGhlIHVwcGVyIHdvcmQgaXMgbm90IG1vZGlmaWVkLgorICAgICovCisgICBzdHJ1Y3QgYnJ3X3JlZyBkc3RfdyA9IHVkX3JlZ190b193KGRzdCk7CisKKyAgIC8qIEdpdmUgZWFjaCAzMi1iaXQgY2hhbm5lbCBvZiBkc3QgdGhlIGZvcm0gYmVsb3cgLCB3aGVyZSAiLiIgbWVhbnMKKyAgICAqIHVuY2hhbmdlZC4KKyAgICAqICAgMHguLi4uaGhoaAorICAgICovCisgICBicndfRjMyVE8xNihwLCBkc3RfdywgeSk7CisKKyAgIC8qIE5vdyB0aGUgZm9ybToKKyAgICAqICAgMHhoaGhoMDAwMAorICAgICovCisgICBicndfU0hMKHAsIGRzdCwgZHN0LCBicndfaW1tX3VkKDE2dSkpOworCisgICAvKiBBbmQsIGZpbmFsbHkgdGhlIGZvcm0gb2YgcGFja0hhbGYyeDE2J3Mgb3V0cHV0OgorICAgICogICAweGhoaGhsbGxsCisgICAgKi8KKyAgIGJyd19GMzJUTzE2KHAsIGRzdF93LCB4KTsKK30KKwordm9pZAorZnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bnBhY2tfaGFsZl8yeDE2X3NwbGl0KGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYykKK3sKKyAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgIGFzc2VydChkc3QudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GKTsKKyAgIGFzc2VydChzcmMudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisKKyAgIC8qIEZyb20gdGhlIEl2eWJyaWRnZSBQUk0sIFZvbDQsIFBhcnQzLCBTZWN0aW9uIDYuMjYgZjE2dG8zMjoKKyAgICAqCisgICAgKiAgIEJlY2F1c2UgdGhpcyBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGEgMTYtYml0IGZsb2F0aW5nLXBvaW50IHR5cGUsCisgICAgKiAgIHRoZSBzb3VyY2UgZGF0YSB0eXBlIG11c3QgYmUgV29yZCAoVykuIFRoZSBkZXN0aW5hdGlvbiB0eXBlIG11c3QgYmUKKyAgICAqICAgRiAoRmxvYXQpLgorICAgICovCisgICBzdHJ1Y3QgYnJ3X3JlZyBzcmNfdyA9IHVkX3JlZ190b193KHNyYyk7CisKKyAgIC8qIEVhY2ggY2hhbm5lbCBvZiBzcmMgaGFzIHRoZSBmb3JtIG9mIHVucGFja0hhbGYyeDE2J3MgaW5wdXQ6IDB4aGhoaGxsbGwuCisgICAgKiBGb3IgdGhlIFkgY2FzZSwgd2Ugd2lzaCB0byBhY2Nlc3Mgb25seSB0aGUgdXBwZXIgd29yZDsgdGhlcmVmb3JlCisgICAgKiBhIDE2LWJpdCBzdWJyZWdpc3RlciBvZmZzZXQgaXMgbmVlZGVkLgorICAgICovCisgICBhc3NlcnQoaW5zdC0+b3Bjb2RlID09IEZTX09QQ09ERV9VTlBBQ0tfSEFMRl8yeDE2X1NQTElUX1ggfHwKKyAgICAgICAgICBpbnN0LT5vcGNvZGUgPT0gRlNfT1BDT0RFX1VOUEFDS19IQUxGXzJ4MTZfU1BMSVRfWSk7CisgICBpZiAoaW5zdC0+b3Bjb2RlID09IEZTX09QQ09ERV9VTlBBQ0tfSEFMRl8yeDE2X1NQTElUX1kpCisgICAgICBzcmNfdy5zdWJuciArPSAyOworCisgICBicndfRjE2VE8zMihwLCBkc3QsIHNyY193KTsKK30KKworLy8gTHVuYXJHIDogVE9ETyAtIHNoYWRlciB0aW1lPz8KKy8vdm9pZAorLy9mc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NoYWRlcl90aW1lX2FkZChmc19pbnN0ICppbnN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBwYXlsb2FkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBvZmZzZXQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHZhbHVlKQorLy97CisvLyAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKy8vICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKy8vICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgdHJ1ZSk7CisKKy8vICAgYXNzZXJ0KHBheWxvYWQuZmlsZSA9PSBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFKTsKKy8vICAgc3RydWN0IGJyd19yZWcgcGF5bG9hZF9vZmZzZXQgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKHBheWxvYWQubnIsIDApLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQudHlwZSk7CisvLyAgIHN0cnVjdCBicndfcmVnIHBheWxvYWRfdmFsdWUgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKHBheWxvYWQubnIgKyAxLCAwKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50eXBlKTsKKworLy8gICBhc3NlcnQob2Zmc2V0LmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSk7CisvLyAgIGlmICh2YWx1ZS5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpIHsKKy8vICAgICAgdmFsdWUud2lkdGggPSBCUldfV0lEVEhfMTsKKy8vICAgICAgdmFsdWUuaHN0cmlkZSA9IEJSV19IT1JJWk9OVEFMX1NUUklERV8wOworLy8gICAgICB2YWx1ZS52c3RyaWRlID0gQlJXX1ZFUlRJQ0FMX1NUUklERV8wOworLy8gICB9IGVsc2UgeworLy8gICAgICBhc3NlcnQodmFsdWUuZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFKTsKKy8vICAgfQorCisvLyAgIC8qIFRyeWluZyB0byBkZWFsIHdpdGggc2V0dXAgb2YgdGhlIHBhcmFtcyBmcm9tIHRoZSBJUiBpcyBjcmF6eSBpbiB0aGUgRlM4CisvLyAgICAqIGNhc2UsIGFuZCB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBzcXVlZXppbmcgZXZlcnkgYml0IG9mIHBlcmZvcm1hbmNlCisvLyAgICAqIG91dCBvZiB0aGlzIHBhdGgsIHNvIHdlIGp1c3QgZW1pdCB0aGUgTU9WcyBmcm9tIGhlcmUuCisvLyAgICAqLworLy8gICBicndfTU9WKHAsIHBheWxvYWRfb2Zmc2V0LCBvZmZzZXQpOworLy8gICBicndfTU9WKHAsIHBheWxvYWRfdmFsdWUsIHZhbHVlKTsKKy8vICAgYnJ3X3NoYWRlcl90aW1lX2FkZChwLCBwYXlsb2FkLAorLy8gICAgICAgICAgICAgICAgICAgICAgIGMtPnByb2dfZGF0YS5iYXNlLmJpbmRpbmdfdGFibGUuc2hhZGVyX3RpbWVfc3RhcnQpOworLy8gICBicndfcG9wX2luc25fc3RhdGUocCk7CisKKy8vICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZjLT5wcm9nX2RhdGEuYmFzZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnByb2dfZGF0YS5iYXNlLmJpbmRpbmdfdGFibGUuc2hhZGVyX3RpbWVfc3RhcnQpOworLy99CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW50eXBlZF9hdG9taWMoZnNfaW5zdCAqaW5zdCwgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhdG9taWNfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHN1cmZfaW5kZXgpCit7CisgICBhc3NlcnQoYXRvbWljX29wLmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorICAgICAgICAgIGF0b21pY19vcC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEICYmCisgICAgICAgICAgc3VyZl9pbmRleC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKwkgIHN1cmZfaW5kZXgudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisKKyAgIGJyd191bnR5cGVkX2F0b21pYyhwLCBkc3QsIGJyd19tZXNzYWdlX3JlZyhpbnN0LT5iYXNlX21yZiksCisgICAgICAgICAgICAgICAgICAgICAgYXRvbWljX29wLmR3MS51ZCwgc3VyZl9pbmRleC5kdzEudWQsCisgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+bWxlbiwgZGlzcGF0Y2hfd2lkdGggLyA4KTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZjLT5wcm9nX2RhdGEuYmFzZSwgc3VyZl9pbmRleC5kdzEudWQpOworfQorCit2b2lkCitmc19nZW5lcmF0b3I6OmdlbmVyYXRlX3VudHlwZWRfc3VyZmFjZV9yZWFkKGZzX2luc3QgKmluc3QsIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3VyZl9pbmRleCkKK3sKKyAgIGFzc2VydChzdXJmX2luZGV4LmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorCSAgc3VyZl9pbmRleC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgYnJ3X3VudHlwZWRfc3VyZmFjZV9yZWFkKHAsIGRzdCwgYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmX2luZGV4LmR3MS51ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5tbGVuLCBkaXNwYXRjaF93aWR0aCAvIDgpOworCisgICBicndfbWFya19zdXJmYWNlX3VzZWQoJmMtPnByb2dfZGF0YS5iYXNlLCBzdXJmX2luZGV4LmR3MS51ZCk7Cit9CisKK3ZvaWQKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29kZShleGVjX2xpc3QgKmluc3RydWN0aW9ucywgRklMRSAqZHVtcF9maWxlKQoreworICAgaW50IGxhc3RfbmF0aXZlX2luc25fb2Zmc2V0ID0gcC0+bmV4dF9pbnNuX29mZnNldDsKKyAgIGNvbnN0IGNoYXIgKmxhc3RfYW5ub3RhdGlvbl9zdHJpbmcgPSBOVUxMOworICAgY29uc3Qgdm9pZCAqbGFzdF9hbm5vdGF0aW9uX2lyID0gTlVMTDsKKworICAgaWYgKHVubGlrZWx5KElOVEVMX0RFQlVHICYgREVCVUdfV00pKSB7CisgICAgICBpZiAocHJvZykgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICJOYXRpdmUgY29kZSBmb3IgJXMgZnJhZ21lbnQgc2hhZGVyICVkIChTSU1EJWQgZGlzcGF0Y2gpOlxuIiwKKyAgICAgICAgICAgICAgICAgcHJvZy0+TGFiZWwgPyBwcm9nLT5MYWJlbCA6ICJ1bm5hbWVkIiwKKyAgICAgICAgICAgICAgICAgcHJvZy0+TmFtZSwgZGlzcGF0Y2hfd2lkdGgpOworICAgICAgfSBlbHNlIGlmIChmcCkgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICJOYXRpdmUgY29kZSBmb3IgZnJhZ21lbnQgcHJvZ3JhbSAlZCAoU0lNRCVkIGRpc3BhdGNoKTpcbiIsCisgICAgICAgICAgICAgICAgIGZwLT5CYXNlLklkLCBkaXNwYXRjaF93aWR0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJOYXRpdmUgY29kZSBmb3IgYmxvcnAgcHJvZ3JhbSAoU0lNRCVkIGRpc3BhdGNoKTpcbiIsCisgICAgICAgICAgICAgICAgIGRpc3BhdGNoX3dpZHRoKTsKKyAgICAgIH0KKyAgIH0KKworICAgY2ZnX3QgKmNmZyA9IE5VTEw7CisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19XTSkpCisgICAgICBjZmcgPSBuZXcobWVtX2N0eCkgY2ZnX3QoaW5zdHJ1Y3Rpb25zKTsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsIGluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKyAgICAgIHN0cnVjdCBicndfcmVnIHNyY1szXSwgZHN0OworCisgICAgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19XTSkpIHsKKwkgZm9yZWFjaF9saXN0KG5vZGUsICZjZmctPmJsb2NrX2xpc3QpIHsKKwkgICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilub2RlOworCSAgICBiYmxvY2tfdCAqYmxvY2sgPSBsaW5rLT5ibG9jazsKKworCSAgICBpZiAoYmxvY2stPnN0YXJ0ID09IGluc3QpIHsKKwkgICAgICAgZnByaW50ZihzdGRlcnIsICIgICBTVEFSVCBCJWQiLCBibG9jay0+YmxvY2tfbnVtKTsKKwkgICAgICAgZm9yZWFjaF9saXN0KHByZWRlY2Vzc29yX25vZGUsICZibG9jay0+cGFyZW50cykgeworCQkgIGJibG9ja19saW5rICpwcmVkZWNlc3Nvcl9saW5rID0KKwkJICAgICAoYmJsb2NrX2xpbmsgKilwcmVkZWNlc3Nvcl9ub2RlOworCQkgIGJibG9ja190ICpwcmVkZWNlc3Nvcl9ibG9jayA9IHByZWRlY2Vzc29yX2xpbmstPmJsb2NrOworCQkgIGZwcmludGYoc3RkZXJyLCAiIDwtQiVkIiwgcHJlZGVjZXNzb3JfYmxvY2stPmJsb2NrX251bSk7CisJICAgICAgIH0KKwkgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworCSAgICB9CisJIH0KKworCSBpZiAobGFzdF9hbm5vdGF0aW9uX2lyICE9IGluc3QtPmlyKSB7CisJICAgIGxhc3RfYW5ub3RhdGlvbl9pciA9IGluc3QtPmlyOworCSAgICBpZiAobGFzdF9hbm5vdGF0aW9uX2lyKSB7CisJICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgIik7CisvLyAgICAgICAgICAgICAgIGlmIChwcm9nKQorICAgICAgICAgICAgICAgICAgYXNzZXJ0KHByb2cpOworICAgICAgICAgICAgICAgICAgKChpcl9pbnN0cnVjdGlvbiAqKWluc3QtPmlyKS0+ZnByaW50KHN0ZGVycik7CisvLyAgICAgICAgICAgICAgIGVsc2UgeworLy8gICAgICAgICAgICAgICAgICBjb25zdCBwcm9nX2luc3RydWN0aW9uICpmcGk7CisvLyAgICAgICAgICAgICAgICAgIGZwaSA9IChjb25zdCBwcm9nX2luc3RydWN0aW9uICopaW5zdC0+aXI7CisvLyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQ6ICIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZnBpIC0gKGZwID8gZnAtPkJhc2UuSW5zdHJ1Y3Rpb25zIDogMCkpKTsKKy8vICAgICAgICAgICAgICAgICAgX21lc2FfZnByaW50X2luc3RydWN0aW9uX29wdChzdGRlcnIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFBST0dfUFJJTlRfREVCVUcsIE5VTEwpOworLy8gICAgICAgICAgICAgICB9CisJICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwkgICAgfQorCSB9CisJIGlmIChsYXN0X2Fubm90YXRpb25fc3RyaW5nICE9IGluc3QtPmFubm90YXRpb24pIHsKKwkgICAgbGFzdF9hbm5vdGF0aW9uX3N0cmluZyA9IGluc3QtPmFubm90YXRpb247CisJICAgIGlmIChsYXN0X2Fubm90YXRpb25fc3RyaW5nKQorCSAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICVzXG4iLCBsYXN0X2Fubm90YXRpb25fc3RyaW5nKTsKKwkgfQorICAgICAgfQorCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCSBzcmNbaV0gPSBicndfcmVnX2Zyb21fZnNfcmVnKCZpbnN0LT5zcmNbaV0pOworCisJIC8qIFRoZSBhY2N1bXVsYXRvciByZXN1bHQgYXBwZWFycyB0byBnZXQgdXNlZCBmb3IgdGhlCisJICAqIGNvbmRpdGlvbmFsIG1vZGlmaWVyIGdlbmVyYXRpb24uICBXaGVuIG5lZ2F0aW5nIGEgVUQKKwkgICogdmFsdWUsIHRoZXJlIGlzIGEgMzNyZCBiaXQgZ2VuZXJhdGVkIGZvciB0aGUgc2lnbiBpbiB0aGUKKwkgICogYWNjdW11bGF0b3IgdmFsdWUsIHNvIG5vdyB5b3UgY2FuJ3QgY2hlY2ssIGZvciBleGFtcGxlLAorCSAgKiBlcXVhbGl0eSB3aXRoIGEgMzItYml0IHZhbHVlLiAgU2VlIHBpZ2xpdCBmcy1vcC1uZWctdXZlYzQuCisJICAqLworCSBhc3NlcnQoIWluc3QtPmNvbmRpdGlvbmFsX21vZCB8fAorCQlpbnN0LT5zcmNbaV0udHlwZSAhPSBCUldfUkVHSVNURVJfVFlQRV9VRCB8fAorCQkhaW5zdC0+c3JjW2ldLm5lZ2F0ZSk7CisgICAgICB9CisgICAgICBkc3QgPSBicndfcmVnX2Zyb21fZnNfcmVnKCZpbnN0LT5kc3QpOworCisgICAgICBicndfc2V0X2NvbmRpdGlvbmFsbW9kKHAsIGluc3QtPmNvbmRpdGlvbmFsX21vZCk7CisgICAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIGluc3QtPnByZWRpY2F0ZSk7CisgICAgICBicndfc2V0X3ByZWRpY2F0ZV9pbnZlcnNlKHAsIGluc3QtPnByZWRpY2F0ZV9pbnZlcnNlKTsKKyAgICAgIGJyd19zZXRfZmxhZ19yZWcocCwgMCwgaW5zdC0+ZmxhZ19zdWJyZWcpOworICAgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCBpbnN0LT5zYXR1cmF0ZSk7CisgICAgICBicndfc2V0X21hc2tfY29udHJvbChwLCBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsKTsKKyAgICAgIGJyd19zZXRfYWNjX3dyaXRlX2NvbnRyb2wocCwgaW5zdC0+d3JpdGVzX2FjY3VtdWxhdG9yKTsKKworICAgICAgaWYgKGluc3QtPmZvcmNlX3VuY29tcHJlc3NlZCB8fCBkaXNwYXRjaF93aWR0aCA9PSA4KSB7CisJIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fTk9ORSk7CisgICAgICB9IGVsc2UgaWYgKGluc3QtPmZvcmNlX3NlY2hhbGYpIHsKKwkgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl8yTkRIQUxGKTsKKyAgICAgIH0gZWxzZSB7CisJIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fQ09NUFJFU1NFRCk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoaW5zdC0+b3Bjb2RlKSB7CisgICAgICBjYXNlIEJSV19PUENPREVfTU9WOgorCSBicndfTU9WKHAsIGRzdCwgc3JjWzBdKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfQUREOgorCSBicndfQUREKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9NVUw6CisJIGJyd19NVUwocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0FWRzoKKwkgYnJ3X0FWRyhwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfTUFDSDoKKwkgYnJ3X01BQ0gocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfTUFEOgorICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDYpOworCSBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xNik7CisgICAgICAgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYgJiYgIWJydy0+aXNfaGFzd2VsbCkgeworCSAgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworCSAgICBicndfTUFEKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSk7CisJICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fMk5ESEFMRik7CisJICAgIGJyd19NQUQocCwgc2VjaGFsZihkc3QpLCBzZWNoYWxmKHNyY1swXSksIHNlY2hhbGYoc3JjWzFdKSwgc2VjaGFsZihzcmNbMl0pKTsKKwkgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9DT01QUkVTU0VEKTsKKwkgfSBlbHNlIHsKKwkgICAgYnJ3X01BRChwLCBkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworCSB9CisJIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzEpOworCSBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0xSUDoKKyAgICAgICAgIGFzc2VydChicnctPmdlbiA+PSA2KTsKKwkgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMTYpOworICAgICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2ICYmICFicnctPmlzX2hhc3dlbGwpIHsKKwkgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKwkgICAgYnJ3X0xSUChwLCBkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworCSAgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OXzJOREhBTEYpOworCSAgICBicndfTFJQKHAsIHNlY2hhbGYoZHN0KSwgc2VjaGFsZihzcmNbMF0pLCBzZWNoYWxmKHNyY1sxXSksIHNlY2hhbGYoc3JjWzJdKSk7CisJICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fQ09NUFJFU1NFRCk7CisJIH0gZWxzZSB7CisJICAgIGJyd19MUlAocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdKTsKKwkgfQorCSBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9GUkM6CisJIGJyd19GUkMocCwgZHN0LCBzcmNbMF0pOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9STkREOgorCSBicndfUk5ERChwLCBkc3QsIHNyY1swXSk7CisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1JOREU6CisJIGJyd19STkRFKHAsIGRzdCwgc3JjWzBdKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfUk5EWjoKKwkgYnJ3X1JORFoocCwgZHN0LCBzcmNbMF0pOworCSBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0FORDoKKwkgYnJ3X0FORChwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfT1I6CisJIGJyd19PUihwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfWE9SOgorCSBicndfWE9SKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9OT1Q6CisJIGJyd19OT1QocCwgZHN0LCBzcmNbMF0pOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9BU1I6CisJIGJyd19BU1IocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1NIUjoKKwkgYnJ3X1NIUihwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfU0hMOgorCSBicndfU0hMKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9GMzJUTzE2OgorICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgICAgYnJ3X0YzMlRPMTYocCwgZHN0LCBzcmNbMF0pOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfRjE2VE8zMjoKKyAgICAgICAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgICAgICAgIGJyd19GMTZUTzMyKHAsIGRzdCwgc3JjWzBdKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0NNUDoKKwkgYnJ3X0NNUChwLCBkc3QsIGluc3QtPmNvbmRpdGlvbmFsX21vZCwgc3JjWzBdLCBzcmNbMV0pOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9TRUw6CisJIGJyd19TRUwocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0JGUkVWOgorICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgICAgLyogQkZSRVYgb25seSBzdXBwb3J0cyBVRCB0eXBlIGZvciBzcmMgYW5kIGRzdC4gKi8KKyAgICAgICAgIGJyd19CRlJFVihwLCByZXR5cGUoZHN0LCBCUldfUkVHSVNURVJfVFlQRV9VRCksCisgICAgICAgICAgICAgICAgICAgICAgcmV0eXBlKHNyY1swXSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0ZCSDoKKyAgICAgICAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgICAgICAgIC8qIEZCSCBvbmx5IHN1cHBvcnRzIFVEIHR5cGUgZm9yIGRzdC4gKi8KKyAgICAgICAgIGJyd19GQkgocCwgcmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBzcmNbMF0pOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJSV19PUENPREVfRkJMOgorICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgICAgLyogRkJMIG9ubHkgc3VwcG9ydHMgVUQgdHlwZSBmb3IgZHN0LiAqLworICAgICAgICAgYnJ3X0ZCTChwLCByZXR5cGUoZHN0LCBCUldfUkVHSVNURVJfVFlQRV9VRCksIHNyY1swXSk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9DQklUOgorICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgICAgLyogQ0JJVCBvbmx5IHN1cHBvcnRzIFVEIHR5cGUgZm9yIGRzdC4gKi8KKyAgICAgICAgIGJyd19DQklUKHAsIHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwgc3JjWzBdKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0FEREM6CisgICAgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAgICBicndfQUREQyhwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1NVQkI6CisgICAgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAgICBicndfU1VCQihwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX01BQzoKKyAgICAgICAgIGJyd19NQUMocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0JGRToKKyAgICAgICAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgICAgICAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzE2KTsKKyAgICAgICAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSAxNiAmJiAhYnJ3LT5pc19oYXN3ZWxsKSB7CisgICAgICAgICAgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworICAgICAgICAgICAgYnJ3X0JGRShwLCBkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworICAgICAgICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl8yTkRIQUxGKTsKKyAgICAgICAgICAgIGJyd19CRkUocCwgc2VjaGFsZihkc3QpLCBzZWNoYWxmKHNyY1swXSksIHNlY2hhbGYoc3JjWzFdKSwgc2VjaGFsZihzcmNbMl0pKTsKKyAgICAgICAgICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fQ09NUFJFU1NFRCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJ3X0JGRShwLCBkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworICAgICAgICAgfQorICAgICAgICAgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0JGSTE6CisgICAgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAgICAvKiBUaGUgSGFzd2VsbCBXYUZvcmNlU0lNRDhGb3JCRklJbnN0cnVjdGlvbiB3b3JrYXJvdW5kIHNheXMgdGhhdCB3ZQorICAgICAgICAgICogc2hvdWxkCisgICAgICAgICAgKgorICAgICAgICAgICogICAgIkZvcmNlIEJGSSBpbnN0cnVjdGlvbnMgdG8gYmUgZXhlY3V0ZWQgYWx3YXlzIGluIFNJTUQ4LiIKKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2ICYmIGJydy0+aXNfaGFzd2VsbCkgeworICAgICAgICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9OT05FKTsKKyAgICAgICAgICAgIGJyd19CRkkxKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl8yTkRIQUxGKTsKKyAgICAgICAgICAgIGJyd19CRkkxKHAsIHNlY2hhbGYoZHN0KSwgc2VjaGFsZihzcmNbMF0pLCBzZWNoYWxmKHNyY1sxXSkpOworICAgICAgICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9DT01QUkVTU0VEKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicndfQkZJMShwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0JGSTI6CisgICAgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xNik7CisgICAgICAgICAvKiBUaGUgSGFzd2VsbCBXYUZvcmNlU0lNRDhGb3JCRklJbnN0cnVjdGlvbiB3b3JrYXJvdW5kIHNheXMgdGhhdCB3ZQorICAgICAgICAgICogc2hvdWxkCisgICAgICAgICAgKgorICAgICAgICAgICogICAgIkZvcmNlIEJGSSBpbnN0cnVjdGlvbnMgdG8gYmUgZXhlY3V0ZWQgYWx3YXlzIGluIFNJTUQ4LiIKKyAgICAgICAgICAqCisgICAgICAgICAgKiBPdGhlcndpc2Ugd2Ugd291bGQgYmUgYWJsZSB0byBlbWl0IGNvbXByZXNzZWQgaW5zdHJ1Y3Rpb25zIGxpa2Ugd2UKKyAgICAgICAgICAqIGRvIGZvciB0aGUgb3RoZXIgdGhyZWUtc291cmNlIGluc3RydWN0aW9ucy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisgICAgICAgICAgICBicndfc2V0X2NvbXByZXNzaW9uX2NvbnRyb2wocCwgQlJXX0NPTVBSRVNTSU9OX05PTkUpOworICAgICAgICAgICAgYnJ3X0JGSTIocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdKTsKKyAgICAgICAgICAgIGJyd19zZXRfY29tcHJlc3Npb25fY29udHJvbChwLCBCUldfQ09NUFJFU1NJT05fMk5ESEFMRik7CisgICAgICAgICAgICBicndfQkZJMihwLCBzZWNoYWxmKGRzdCksIHNlY2hhbGYoc3JjWzBdKSwgc2VjaGFsZihzcmNbMV0pLCBzZWNoYWxmKHNyY1syXSkpOworICAgICAgICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9DT01QUkVTU0VEKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicndfQkZJMihwLCBkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworICAgICAgICAgfQorICAgICAgICAgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0lGOgorCSBpZiAoaW5zdC0+c3JjWzBdLmZpbGUgIT0gQkFEX0ZJTEUpIHsKKwkgICAgLyogVGhlIGluc3RydWN0aW9uIGhhcyBhbiBlbWJlZGRlZCBjb21wYXJlIChvbmx5IGFsbG93ZWQgb24gZ2VuNikgKi8KKwkgICAgYXNzZXJ0KGJydy0+Z2VuID09IDYpOworCSAgICBnZW42X0lGKHAsIGluc3QtPmNvbmRpdGlvbmFsX21vZCwgc3JjWzBdLCBzcmNbMV0pOworCSB9IGVsc2UgeworCSAgICBicndfSUYocCwgZGlzcGF0Y2hfd2lkdGggPT0gMTYgPyBCUldfRVhFQ1VURV8xNiA6IEJSV19FWEVDVVRFXzgpOworCSB9CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfRUxTRToKKwkgYnJ3X0VMU0UocCk7CisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0VORElGOgorCSBicndfRU5ESUYocCk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfRE86CisJIGJyd19ETyhwLCBCUldfRVhFQ1VURV84KTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9CUkVBSzoKKwkgYnJ3X0JSRUFLKHApOworCSBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisJIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX0NPTlRJTlVFOgorCSAvKiBGSU5JU0hNRTogV2UgbmVlZCB0byB3cml0ZSB0aGUgbG9vcCBpbnN0cnVjdGlvbiBzdXBwb3J0IHN0aWxsLiAqLworCSBpZiAoYnJ3LT5nZW4gPj0gNikKKwkgICAgZ2VuNl9DT05UKHApOworCSBlbHNlCisJICAgIGJyd19DT05UKHApOworCSBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfV0hJTEU6CisJIGJyd19XSElMRShwKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9SQ1A6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfUlNROgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1NRUlQ6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfRVhQMjoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9MT0cyOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1NJTjoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9DT1M6CisJIGlmIChicnctPmdlbiA+PSA3KSB7CisJICAgIGdlbmVyYXRlX21hdGgxX2dlbjcoaW5zdCwgZHN0LCBzcmNbMF0pOworCSB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKwkgICAgZ2VuZXJhdGVfbWF0aDFfZ2VuNihpbnN0LCBkc3QsIHNyY1swXSk7CisJIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPT0gNSB8fCBicnctPmlzX2c0eCkgeworCSAgICBnZW5lcmF0ZV9tYXRoX2c0NShpbnN0LCBkc3QsIHNyY1swXSk7CisJIH0gZWxzZSB7CisJICAgIGdlbmVyYXRlX21hdGhfZ2VuNChpbnN0LCBkc3QsIHNyY1swXSk7CisJIH0KKwkgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1FVT1RJRU5UOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVI6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfUE9XOgorCSBpZiAoYnJ3LT5nZW4gPj0gNykgeworCSAgICBnZW5lcmF0ZV9tYXRoMl9nZW43KGluc3QsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworCSB9IGVsc2UgaWYgKGJydy0+Z2VuID09IDYpIHsKKwkgICAgZ2VuZXJhdGVfbWF0aDJfZ2VuNihpbnN0LCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKwkgfSBlbHNlIHsKKwkgICAgZ2VuZXJhdGVfbWF0aF9nZW40KGluc3QsIGRzdCwgc3JjWzBdKTsKKwkgfQorCSBicmVhazsKKyAgICAgIGNhc2UgRlNfT1BDT0RFX1BJWEVMX1g6CisJIGdlbmVyYXRlX3BpeGVsX3h5KGRzdCwgdHJ1ZSk7CisJIGJyZWFrOworICAgICAgY2FzZSBGU19PUENPREVfUElYRUxfWToKKwkgZ2VuZXJhdGVfcGl4ZWxfeHkoZHN0LCBmYWxzZSk7CisJIGJyZWFrOworICAgICAgY2FzZSBGU19PUENPREVfQ0lOVEVSUDoKKwkgYnJ3X01PVihwLCBkc3QsIHNyY1swXSk7CisJIGJyZWFrOworICAgICAgY2FzZSBGU19PUENPREVfTElOVEVSUDoKKwkgZ2VuZXJhdGVfbGludGVycChpbnN0LCBkc3QsIHNyYyk7CisJIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RFWDoKKyAgICAgIGNhc2UgRlNfT1BDT0RFX1RYQjoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEQ6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhGOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRl9DTVM6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhGX1VNUzoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfTUNTOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYTDoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWFM6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfTE9EOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RHNDoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9URzRfT0ZGU0VUOgorCSBnZW5lcmF0ZV90ZXgoaW5zdCwgZHN0LCBzcmNbMF0pOworCSBicmVhazsKKyAgICAgIGNhc2UgRlNfT1BDT0RFX0REWDoKKwkgZ2VuZXJhdGVfZGR4KGluc3QsIGRzdCwgc3JjWzBdKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEZTX09QQ09ERV9ERFk6CisgICAgICAgICAvKiBNYWtlIHN1cmUgZnAtPlVzZXNERmR5IGZsYWcgZ290IHNldCAob3RoZXJ3aXNlIHRoZXJlJ3Mgbm8KKyAgICAgICAgICAqIGd1YXJhbnRlZSB0aGF0IGMtPmtleS5yZW5kZXJfdG9fZmJvIGlzIHNldCkuCisgICAgICAgICAgKi8KKyAgICAgICAgIGFzc2VydChmcC0+VXNlc0RGZHkpOworCSBnZW5lcmF0ZV9kZHkoaW5zdCwgZHN0LCBzcmNbMF0sIGMtPmtleS5yZW5kZXJfdG9fZmJvKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9HRU40X1NDUkFUQ0hfV1JJVEU6CisJIGdlbmVyYXRlX3NjcmF0Y2hfd3JpdGUoaW5zdCwgc3JjWzBdKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9HRU40X1NDUkFUQ0hfUkVBRDoKKwkgZ2VuZXJhdGVfc2NyYXRjaF9yZWFkKGluc3QsIGRzdCk7CisJIGJyZWFrOworCisgICAgICBjYXNlIFNIQURFUl9PUENPREVfR0VON19TQ1JBVENIX1JFQUQ6CisJIGdlbmVyYXRlX3NjcmF0Y2hfcmVhZF9nZW43KGluc3QsIGRzdCk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEZTX09QQ09ERV9VTklGT1JNX1BVTExfQ09OU1RBTlRfTE9BRDoKKwkgZ2VuZXJhdGVfdW5pZm9ybV9wdWxsX2NvbnN0YW50X2xvYWQoaW5zdCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisJIGJyZWFrOworCisgICAgICBjYXNlIEZTX09QQ09ERV9VTklGT1JNX1BVTExfQ09OU1RBTlRfTE9BRF9HRU43OgorCSBnZW5lcmF0ZV91bmlmb3JtX3B1bGxfY29uc3RhbnRfbG9hZF9nZW43KGluc3QsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworCSBicmVhazsKKworICAgICAgY2FzZSBGU19PUENPREVfVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQUQ6CisJIGdlbmVyYXRlX3ZhcnlpbmdfcHVsbF9jb25zdGFudF9sb2FkKGluc3QsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworCSBicmVhazsKKworICAgICAgY2FzZSBGU19PUENPREVfVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQURfR0VONzoKKwkgZ2VuZXJhdGVfdmFyeWluZ19wdWxsX2NvbnN0YW50X2xvYWRfZ2VuNyhpbnN0LCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgRlNfT1BDT0RFX0ZCX1dSSVRFOgorCSBnZW5lcmF0ZV9mYl93cml0ZShpbnN0KTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgRlNfT1BDT0RFX0JMT1JQX0ZCX1dSSVRFOgorCSBnZW5lcmF0ZV9ibG9ycF9mYl93cml0ZShpbnN0KTsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgRlNfT1BDT0RFX01PVl9ESVNQQVRDSF9UT19GTEFHUzoKKyAgICAgICAgIGdlbmVyYXRlX21vdl9kaXNwYXRjaF90b19mbGFncyhpbnN0KTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZTX09QQ09ERV9ESVNDQVJEX0pVTVA6CisgICAgICAgICBnZW5lcmF0ZV9kaXNjYXJkX2p1bXAoaW5zdCk7CisgICAgICAgICBicmVhazsKKworLy8gTHVuYXJHIDogVE9ETyAtIHNoYWRlciB0aW1lPz8KKy8vICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1NIQURFUl9USU1FX0FERDoKKy8vICAgICAgICAgZ2VuZXJhdGVfc2hhZGVyX3RpbWVfYWRkKGluc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworLy8gICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1VOVFlQRURfQVRPTUlDOgorICAgICAgICAgZ2VuZXJhdGVfdW50eXBlZF9hdG9taWMoaW5zdCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1VOVFlQRURfU1VSRkFDRV9SRUFEOgorICAgICAgICAgZ2VuZXJhdGVfdW50eXBlZF9zdXJmYWNlX3JlYWQoaW5zdCwgZHN0LCBzcmNbMF0pOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRlNfT1BDT0RFX1NFVF9TSU1ENFgyX09GRlNFVDoKKyAgICAgICAgIGdlbmVyYXRlX3NldF9zaW1kNHgyX29mZnNldChpbnN0LCBkc3QsIHNyY1swXSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGU19PUENPREVfU0VUX09NQVNLOgorICAgICAgICAgZ2VuZXJhdGVfc2V0X29tYXNrKGluc3QsIGRzdCwgc3JjWzBdKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZTX09QQ09ERV9TRVRfU0FNUExFX0lEOgorICAgICAgICAgZ2VuZXJhdGVfc2V0X3NhbXBsZV9pZChpbnN0LCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZTX09QQ09ERV9QQUNLX0hBTEZfMngxNl9TUExJVDoKKyAgICAgICAgICBnZW5lcmF0ZV9wYWNrX2hhbGZfMngxNl9zcGxpdChpbnN0LCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGU19PUENPREVfVU5QQUNLX0hBTEZfMngxNl9TUExJVF9YOgorICAgICAgY2FzZSBGU19PUENPREVfVU5QQUNLX0hBTEZfMngxNl9TUExJVF9ZOgorICAgICAgICAgZ2VuZXJhdGVfdW5wYWNrX2hhbGZfMngxNl9zcGxpdChpbnN0LCBkc3QsIHNyY1swXSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGU19PUENPREVfUExBQ0VIT0xERVJfSEFMVDoKKyAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHRoZSBmaW5hbCBIQUxUIG5lZWRzIHRvIGJlIGluc2VydGVkIGlmCisgICAgICAgICAgKiB3ZSd2ZSBlbWl0dGVkIGFueSBkaXNjYXJkcy4gIElmIG5vdCwgdGhpcyB3aWxsIGVtaXQgbm8gY29kZS4KKyAgICAgICAgICAqLworICAgICAgICAgcGF0Y2hfZGlzY2FyZF9qdW1wc190b19mYl93cml0ZXMoKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNIQURFUl9PUENPREVfRFdPUkRfU0NBVFRFUkVEX1dSSVRFOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX0JZVEVfU0NBVFRFUkVEX1dSSVRFOgorICAgICAgICAgZ2VuZXJhdGVfc2NhdHRlcmVkX3dyaXRlKGluc3QsIGRzdCwgc3JjWzBdKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX0RXT1JEX1NDQVRURVJFRF9SRUFEOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX0JZVEVfU0NBVFRFUkVEX1JFQUQ6CisgICAgICAgICBnZW5lcmF0ZV9zY2F0dGVyZWRfcmVhZChpbnN0LCBkc3QsIHNyY1swXSk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVlNfT1BDT0RFX1VSQl9XUklURToKKyAgICAgICAgIGJyd191cmJfV1JJVEUocCwKKyAgICAgICAgICAgICAgICAgYnJ3X251bGxfcmVnKCksIC8qIGRlc3QgKi8KKyAgICAgICAgICAgICAgICAgaW5zdC0+YmFzZV9tcmYsIC8qIHN0YXJ0aW5nIG1yZiByZWcgbnIgKi8KKyAgICAgICAgICAgICAgICAgYnJ3X3ZlYzhfZ3JmKDAsIDApLCAvKiBzcmMgKi8KKyAgICAgICAgICAgICAgICAgKGluc3QtPmVvdCkgPyBCUldfVVJCX1dSSVRFX0VPVF9DT01QTEVURSA6IEJSV19VUkJfV1JJVEVfTk9fRkxBR1MsCisgICAgICAgICAgICAgICAgIGluc3QtPm1sZW4sCisgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgIGluc3QtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgQlJXX1VSQl9TV0laWkxFX0lOVEVSTEVBVkUpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJIGlmIChpbnN0LT5vcGNvZGUgPCAoaW50KSBBUlJBWV9TSVpFKG9wY29kZV9kZXNjcykpIHsKKwkgICAgX21lc2FfcHJvYmxlbShjdHgsICJVbnN1cHBvcnRlZCBvcGNvZGUgYCVzJyBpbiBGUyIsCisJCQkgIG9wY29kZV9kZXNjc1tpbnN0LT5vcGNvZGVdLm5hbWUpOworCSB9IGVsc2UgeworCSAgICBfbWVzYV9wcm9ibGVtKGN0eCwgIlVuc3VwcG9ydGVkIG9wY29kZSAlZCBpbiBGUyIsIGluc3QtPm9wY29kZSk7CisJIH0KKwkgYWJvcnQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHVubGlrZWx5KElOVEVMX0RFQlVHICYgREVCVUdfV00pKSB7CisJIGJyd19kdW1wX2NvbXBpbGUocCwgc3RkZXJyLAorCQkJICBsYXN0X25hdGl2ZV9pbnNuX29mZnNldCwgcC0+bmV4dF9pbnNuX29mZnNldCk7CisKKwkgZm9yZWFjaF9saXN0KG5vZGUsICZjZmctPmJsb2NrX2xpc3QpIHsKKwkgICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilub2RlOworCSAgICBiYmxvY2tfdCAqYmxvY2sgPSBsaW5rLT5ibG9jazsKKworCSAgICBpZiAoYmxvY2stPmVuZCA9PSBpbnN0KSB7CisJICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgRU5EIEIlZCIsIGJsb2NrLT5ibG9ja19udW0pOworCSAgICAgICBmb3JlYWNoX2xpc3Qoc3VjY2Vzc29yX25vZGUsICZibG9jay0+Y2hpbGRyZW4pIHsKKwkJICBiYmxvY2tfbGluayAqc3VjY2Vzc29yX2xpbmsgPQorCQkgICAgIChiYmxvY2tfbGluayAqKXN1Y2Nlc3Nvcl9ub2RlOworCQkgIGJibG9ja190ICpzdWNjZXNzb3JfYmxvY2sgPSBzdWNjZXNzb3JfbGluay0+YmxvY2s7CisJCSAgZnByaW50ZihzdGRlcnIsICIgLT5CJWQiLCBzdWNjZXNzb3JfYmxvY2stPmJsb2NrX251bSk7CisJICAgICAgIH0KKwkgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworCSAgICB9CisJIH0KKyAgICAgIH0KKworICAgICAgbGFzdF9uYXRpdmVfaW5zbl9vZmZzZXQgPSBwLT5uZXh0X2luc25fb2Zmc2V0OworICAgfQorCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19XTSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgIH0KKworICAgYnJ3X3NldF91aXBfamlwKHApOworCisgICAvKiBPSywgd2hpbGUgdGhlIElOVEVMX0RFQlVHPXdtIGFib3ZlIGlzIHZlcnkgbmljZSBmb3IgZGVidWdnaW5nIEZTCisgICAgKiBlbWl0IGlzc3VlcywgaXQgZG9lc24ndCBnZXQgdGhlIGp1bXAgZGlzdGFuY2VzIGludG8gdGhlIG91dHB1dCwKKyAgICAqIHdoaWNoIGlzIG9mdGVuIHNvbWV0aGluZyB3ZSB3YW50IHRvIGRlYnVnLiAgU28gdGhpcyBpcyBoZXJlIGluCisgICAgKiBjYXNlIHlvdSdyZSBkb2luZyB0aGF0LgorICAgICovCisgICBpZiAoZHVtcF9maWxlKSB7CisgICAgICBicndfZHVtcF9jb21waWxlKHAsIGR1bXBfZmlsZSwgMCwgcC0+bmV4dF9pbnNuX29mZnNldCk7CisgICB9Cit9CisKK2NvbnN0IHVuc2lnbmVkICoKK2ZzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzZW1ibHkoZXhlY19saXN0ICpzaW1kOF9pbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNfbGlzdCAqc2ltZDE2X2luc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmFzc2VtYmx5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKmR1bXBfZmlsZSkKK3sKKyAgIGFzc2VydChzaW1kOF9pbnN0cnVjdGlvbnMgfHwgc2ltZDE2X2luc3RydWN0aW9ucyk7CisKKyAgIGlmIChzaW1kOF9pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGRpc3BhdGNoX3dpZHRoID0gODsKKyAgICAgIGdlbmVyYXRlX2NvZGUoc2ltZDhfaW5zdHJ1Y3Rpb25zLCBkdW1wX2ZpbGUpOworICAgfQorCisgICBpZiAoc2ltZDE2X2luc3RydWN0aW9ucykgeworICAgICAgLyogV2UgaGF2ZSB0byBkbyBhIGNvbXBhY3Rpb24gcGFzcyBub3csIG9yIHRoZSBvbmUgYXQgdGhlIGVuZCBvZgorICAgICAgICogZXhlY3V0aW9uIHdpbGwgc3F1YXNoIGRvd24gd2hlcmUgb3VyIHByb2dfb2Zmc2V0IHN0YXJ0IG5lZWRzCisgICAgICAgKiB0byBiZS4KKyAgICAgICAqLworICAgICAgYnJ3X2NvbXBhY3RfaW5zdHJ1Y3Rpb25zKHApOworCisgICAgICAvKiBhbGlnbiB0byA2NCBieXRlIGJvdW5kYXJ5LiAqLworICAgICAgd2hpbGUgKChwLT5ucl9pbnNuICogc2l6ZW9mKHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24pKSAlIDY0KSB7CisgICAgICAgICBicndfTk9QKHApOworICAgICAgfQorCisgICAgICAvKiBTYXZlIG9mZiB0aGUgc3RhcnQgb2YgdGhpcyBTSU1EMTYgcHJvZ3JhbSAqLworICAgICAgYy0+cHJvZ19kYXRhLnByb2dfb2Zmc2V0XzE2ID0gcC0+bnJfaW5zbiAqIHNpemVvZihzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uKTsKKworICAgICAgYnJ3X3NldF9jb21wcmVzc2lvbl9jb250cm9sKHAsIEJSV19DT01QUkVTU0lPTl9DT01QUkVTU0VEKTsKKworICAgICAgZGlzcGF0Y2hfd2lkdGggPSAxNjsKKyAgICAgIGdlbmVyYXRlX2NvZGUoc2ltZDE2X2luc3RydWN0aW9ucywgZHVtcF9maWxlKTsKKyAgIH0KKworICAgcmV0dXJuIGJyd19nZXRfcHJvZ3JhbShwLCBhc3NlbWJseV9zaXplKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfbGl2ZV92YXJpYWJsZXMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19saXZlX3ZhcmlhYmxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1ZmEzOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfbGl2ZV92YXJpYWJsZXMuY3BwCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNpbmNsdWRlICJicndfY2ZnLmgiCisjaW5jbHVkZSAiYnJ3X2ZzX2xpdmVfdmFyaWFibGVzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBicnc7CisKKyNkZWZpbmUgTUFYX0lOU1RSVUNUSU9OICgxIDw8IDMwKQorCisvKiogQGZpbGUgYnJ3X2ZzX2xpdmVfdmFyaWFibGVzLmNwcAorICoKKyAqIFN1cHBvcnQgZm9yIGNhbGN1bGF0aW5nIGxpdmVuZXNzIGluZm9ybWF0aW9uIGFib3V0IHZpcnR1YWwgR1JGcy4KKyAqCisgKiBUaGlzIHByb2R1Y2VzIGEgbGl2ZSBpbnRlcnZhbCBmb3IgZWFjaCB3aG9sZSB2aXJ0dWFsIEdSRi4gIFdlIGNvdWxkCisgKiBjaG9vc2UgdG8gZXhwb3NlIHBlci1jb21wb25lbnQgbGl2ZSBpbnRlcnZhbHMgZm9yIFZHUkZzIG9mIHNpemUgPiAxLAorICogYnV0IHdlIGN1cnJlbnRseSBkbyBub3QuICBJdCBpcyBlYXNpZXIgZm9yIHRoZSBjb25zdW1lcnMgb2YgdGhpcworICogaW5mb3JtYXRpb24gdG8gd29yayB3aXRoIHdob2xlIFZHUkZzLgorICoKKyAqIEhvd2V2ZXIsIHdlIGludGVybmFsbHkgdHJhY2sgdXNlL2RlZiBpbmZvcm1hdGlvbiBhdCB0aGUgcGVyLWNvbXBvbmVudAorICogKHJlZ19vZmZzZXQpIGxldmVsIGZvciBncmVhdGVyIGFjY3VyYWN5LiAgTGFyZ2UgVkdSRnMgbWF5IGJlIGFjY2Vzc2VkCisgKiBwaWVjZW1lYWwgb3ZlciBtYW55IChwb3NzaWJseSBub24tYWRqYWNlbnQpIGluc3RydWN0aW9ucy4gIEluIHRoaXMgY2FzZSwKKyAqIGV4YW1pbmluZyBhIHNpbmdsZSBpbnN0cnVjdGlvbiBpcyBpbnN1ZmZpY2llbnQgdG8gZGVjaWRlIHdoZXRoZXIgYSB3aG9sZQorICogVkdSRiBpcyB1bHRpbWF0ZWx5IHVzZWQgb3IgZGVmaW5lZC4gIFRyYWNraW5nIGluZGl2aWR1YWwgY29tcG9uZW50cworICogYWxsb3dzIHVzIHRvIGVhc2lseSBhc3NlbWJsZSB0aGlzIGluZm9ybWF0aW9uLgorICoKKyAqIFNlZSBNdWNobmljaydzIEFkdmFuY2VkIENvbXBpbGVyIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24sIHNlY3Rpb24KKyAqIDE0LjEgKHA0NDQpLgorICovCisKK3ZvaWQKK2ZzX2xpdmVfdmFyaWFibGVzOjpzZXR1cF9vbmVfcmVhZChiYmxvY2tfdCAqYmxvY2ssIGZzX2luc3QgKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlwLCBmc19yZWcgcmVnKQoreworICAgaW50IHZhciA9IHZhcl9mcm9tX3ZncmZbcmVnLnJlZ10gKyByZWcucmVnX29mZnNldDsKKyAgIGFzc2VydCh2YXIgPCBudW1fdmFycyk7CisKKyAgIC8qIEluIG1vc3QgY2FzZXMsIGEgcmVnaXN0ZXIgY2FuIGJlIHdyaXR0ZW4gb3ZlciBzYWZlbHkgYnkgdGhlCisgICAgKiBzYW1lIGluc3RydWN0aW9uIHRoYXQgaXMgaXRzIGxhc3QgdXNlLiAgRm9yIGEgc2luZ2xlCisgICAgKiBpbnN0cnVjdGlvbiwgdGhlIHNvdXJjZXMgYXJlIGRlcmVmZXJlbmNlZCBiZWZvcmUgd3JpdGluZyBvZiB0aGUKKyAgICAqIGRlc3RpbmF0aW9uIHN0YXJ0cyAobmF0dXJhbGx5KS4gIFRoaXMgZ2V0cyBtb3JlIGNvbXBsaWNhdGVkIGZvcgorICAgICogc2ltZDE2LCBiZWNhdXNlIHRoZSBpbnN0cnVjdGlvbjoKKyAgICAqCisgICAgKiBhZGQoMTYpICAgICAgZzQ8MT5GICAgICAgZzQ8OCw4LDE+RiAgIGc2PDgsOCwxPkYKKyAgICAqCisgICAgKiBpcyBhY3R1YWxseSBkZWNvZGVkIGluIGhhcmR3YXJlIGFzOgorICAgICoKKyAgICAqIGFkZCg4KSAgICAgICBnNDwxPkYgICAgICBnNDw4LDgsMT5GICAgZzY8OCw4LDE+RgorICAgICogYWRkKDgpICAgICAgIGc1PDE+RiAgICAgIGc1PDgsOCwxPkYgICBnNzw4LDgsMT5GCisgICAgKgorICAgICogV2hpY2ggaXMgc2FmZS4gIEhvd2V2ZXIsIGlmIHdlIGhhdmUgdW5pZm9ybSBhY2Nlc3NlcworICAgICogaGFwcGVuaW5nLCB3ZSBnZXQgaW50byB0cm91YmxlOgorICAgICoKKyAgICAqIGFkZCg4KSAgICAgICBnNDwxPkYgICAgICBnNDwwLDEsMD5GICAgZzY8OCw4LDE+RgorICAgICogYWRkKDgpICAgICAgIGc1PDE+RiAgICAgIGc0PDAsMSwwPkYgICBnNzw4LDgsMT5GCisgICAgKgorICAgICogTm93IG91ciBkZXN0aW5hdGlvbiBmb3IgdGhlIGZpcnN0IGluc3RydWN0aW9uIG92ZXJ3cm90ZSB0aGUKKyAgICAqIHNlY29uZCBpbnN0cnVjdGlvbidzIHNyYzAsIGFuZCB3ZSBnZXQgZ2FyYmFnZSBmb3IgdGhvc2UgOAorICAgICogcGl4ZWxzLiAgVGhlcmUncyBhIHNpbWlsYXIgaXNzdWUgZm9yIHRoZSBwcmUtZ2VuNgorICAgICogcGl4ZWxfeC9waXhlbF95LCB3aGljaCBhcmUgcmVnaXN0ZXJzIG9mIDE2LWJpdCB2YWx1ZXMgYW5kIHRodXMKKyAgICAqIHdvdWxkIGdldCBzdG9tcGVkIGJ5IHRoZSBmaXJzdCBkZWNvZGUgYXMgd2VsbC4KKyAgICAqLworICAgaW50IGVuZF9pcCA9IGlwOworICAgaWYgKHYtPmRpc3BhdGNoX3dpZHRoID09IDE2ICYmIChyZWcuc3RyaWRlID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVVcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VQiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9CKSkgeworICAgICAgZW5kX2lwKys7CisgICB9CisKKyAgIHN0YXJ0W3Zhcl0gPSBNSU4yKHN0YXJ0W3Zhcl0sIGlwKTsKKyAgIGVuZFt2YXJdID0gTUFYMihlbmRbdmFyXSwgZW5kX2lwKTsKKworICAgLyogVGhlIHVzZVtdIGJpdHNldCBtYXJrcyB3aGVuIHRoZSBibG9jayBtYWtlcyB1c2Ugb2YgYSB2YXJpYWJsZSAoVkdSRgorICAgICogY2hhbm5lbCkgd2l0aG91dCBoYXZpbmcgY29tcGxldGVseSBkZWZpbmVkIHRoYXQgdmFyaWFibGUgd2l0aGluIHRoZQorICAgICogYmxvY2suCisgICAgKi8KKyAgIGlmICghQklUU0VUX1RFU1QoYmRbYmxvY2stPmJsb2NrX251bV0uZGVmLCB2YXIpKQorICAgICAgQklUU0VUX1NFVChiZFtibG9jay0+YmxvY2tfbnVtXS51c2UsIHZhcik7Cit9CisKK3ZvaWQKK2ZzX2xpdmVfdmFyaWFibGVzOjpzZXR1cF9vbmVfd3JpdGUoYmJsb2NrX3QgKmJsb2NrLCBmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXAsIGZzX3JlZyByZWcpCit7CisgICBpbnQgdmFyID0gdmFyX2Zyb21fdmdyZltyZWcucmVnXSArIHJlZy5yZWdfb2Zmc2V0OworICAgYXNzZXJ0KHZhciA8IG51bV92YXJzKTsKKworICAgc3RhcnRbdmFyXSA9IE1JTjIoc3RhcnRbdmFyXSwgaXApOworICAgZW5kW3Zhcl0gPSBNQVgyKGVuZFt2YXJdLCBpcCk7CisKKyAgIC8qIFRoZSBkZWZbXSBiaXRzZXQgbWFya3Mgd2hlbiBhbiBpbml0aWFsaXphdGlvbiBpbiBhIGJsb2NrIGNvbXBsZXRlbHkKKyAgICAqIHNjcmVlbnMgb2ZmIHByZXZpb3VzIHVwZGF0ZXMgb2YgdGhhdCB2YXJpYWJsZSAoVkdSRiBjaGFubmVsKS4KKyAgICAqLworICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRiAmJiAhaW5zdC0+aXNfcGFydGlhbF93cml0ZSgpKSB7CisgICAgICBpZiAoIUJJVFNFVF9URVNUKGJkW2Jsb2NrLT5ibG9ja19udW1dLnVzZSwgdmFyKSkKKyAgICAgICAgIEJJVFNFVF9TRVQoYmRbYmxvY2stPmJsb2NrX251bV0uZGVmLCB2YXIpOworICAgfQorfQorCisvKioKKyAqIFNldHMgdXAgdGhlIHVzZVtdIGFuZCBkZWZbXSBiaXRzZXRzLgorICoKKyAqIFRoZSBiYXNpYy1ibG9jay1sZXZlbCBsaXZlIHZhcmlhYmxlIGFuYWx5c2lzIG5lZWRzIHRvIGtub3cgd2hpY2gKKyAqIHZhcmlhYmxlcyBnZXQgdXNlZCBiZWZvcmUgdGhleSdyZSBjb21wbGV0ZWx5IGRlZmluZWQsIGFuZCB3aGljaAorICogdmFyaWFibGVzIGFyZSBjb21wbGV0ZWx5IGRlZmluZWQgYmVmb3JlIHRoZXkncmUgdXNlZC4KKyAqCisgKiBUaGVzZSBhcmUgdHJhY2tlZCBhdCB0aGUgcGVyLWNvbXBvbmVudCBsZXZlbCwgcmF0aGVyIHRoYW4gd2hvbGUgVkdSRnMuCisgKi8KK3ZvaWQKK2ZzX2xpdmVfdmFyaWFibGVzOjpzZXR1cF9kZWZfdXNlKCkKK3sKKyAgIGludCBpcCA9IDA7CisKKyAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLT5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgIGJibG9ja190ICpibG9jayA9IGNmZy0+YmxvY2tzW2JdOworCisgICAgICBhc3NlcnQoaXAgPT0gYmxvY2stPnN0YXJ0X2lwKTsKKyAgICAgIGlmIChiID4gMCkKKwkgYXNzZXJ0KGNmZy0+YmxvY2tzW2IgLSAxXS0+ZW5kX2lwID09IGlwIC0gMSk7CisKKyAgICAgIGZvciAoZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopYmxvY2stPnN0YXJ0OworCSAgIGluc3QgIT0gYmxvY2stPmVuZC0+bmV4dDsKKwkgICBpbnN0ID0gKGZzX2luc3QgKilpbnN0LT5uZXh0KSB7CisKKwkgLyogU2V0IHVzZVtdIGZvciB0aGlzIGluc3RydWN0aW9uICovCisJIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBmc19yZWcgcmVnID0gaW5zdC0+c3JjW2ldOworCisgICAgICAgICAgICBpZiAocmVnLmZpbGUgIT0gR1JGKQorICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5zdC0+cmVnc19yZWFkKHYsIGkpOyBqKyspIHsKKyAgICAgICAgICAgICAgIHNldHVwX29uZV9yZWFkKGJsb2NrLCBpbnN0LCBpcCwgcmVnKTsKKyAgICAgICAgICAgICAgIHJlZy5yZWdfb2Zmc2V0Kys7CisgICAgICAgICAgICB9CisJIH0KKworICAgICAgICAgLyogU2V0IGRlZltdIGZvciB0aGlzIGluc3RydWN0aW9uICovCisgICAgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKSB7CisgICAgICAgICAgICBmc19yZWcgcmVnID0gaW5zdC0+ZHN0OworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnN0LT5yZWdzX3dyaXR0ZW47IGorKykgeworICAgICAgICAgICAgICAgc2V0dXBfb25lX3dyaXRlKGJsb2NrLCBpbnN0LCBpcCwgcmVnKTsKKyAgICAgICAgICAgICAgIHJlZy5yZWdfb2Zmc2V0Kys7CisgICAgICAgICAgICB9CisJIH0KKworCSBpcCsrOworICAgICAgfQorICAgfQorfQorCisvKioKKyAqIFRoZSBhbGdvcml0aG0gaW5jcmVtZW50YWxseSBzZXRzIGJpdHMgaW4gbGl2ZW91dCBhbmQgbGl2ZWluLAorICogcHJvcGFnYXRpbmcgaXQgdGhyb3VnaCBjb250cm9sIGZsb3cuICBJdCB3aWxsIGV2ZW50dWFsbHkgdGVybWluYXRlCisgKiBiZWNhdXNlIGl0IG9ubHkgZXZlciBhZGRzIGJpdHMsIGFuZCBzdG9wcyB3aGVuIG5vIGJpdHMgYXJlIGFkZGVkIGluCisgKiBhIHBhc3MuCisgKi8KK3ZvaWQKK2ZzX2xpdmVfdmFyaWFibGVzOjpjb21wdXRlX2xpdmVfdmFyaWFibGVzKCkKK3sKKyAgIGJvb2wgY29udCA9IHRydWU7CisKKyAgIHdoaWxlIChjb250KSB7CisgICAgICBjb250ID0gZmFsc2U7CisKKyAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLT5udW1fYmxvY2tzOyBiKyspIHsKKwkgLyogVXBkYXRlIGxpdmVpbiAqLworCSBmb3IgKGludCBpID0gMDsgaSA8IGJpdHNldF93b3JkczsgaSsrKSB7CisgICAgICAgICAgICBCSVRTRVRfV09SRCBuZXdfbGl2ZWluID0gKGJkW2JdLnVzZVtpXSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZFtiXS5saXZlb3V0W2ldICYgfmJkW2JdLmRlZltpXSkpOworCSAgICBpZiAobmV3X2xpdmVpbiAmIH5iZFtiXS5saXZlaW5baV0pIHsKKyAgICAgICAgICAgICAgIGJkW2JdLmxpdmVpbltpXSB8PSBuZXdfbGl2ZWluOworICAgICAgICAgICAgICAgY29udCA9IHRydWU7CisJICAgIH0KKwkgfQorCisJIC8qIFVwZGF0ZSBsaXZlb3V0ICovCisJIGZvcmVhY2hfbGlzdChibG9ja19ub2RlLCAmY2ZnLT5ibG9ja3NbYl0tPmNoaWxkcmVuKSB7CisJICAgIGJibG9ja19saW5rICpsaW5rID0gKGJibG9ja19saW5rICopYmxvY2tfbm9kZTsKKwkgICAgYmJsb2NrX3QgKmJsb2NrID0gbGluay0+YmxvY2s7CisKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzZXRfd29yZHM7IGkrKykgeworICAgICAgICAgICAgICAgQklUU0VUX1dPUkQgbmV3X2xpdmVvdXQgPSAoYmRbYmxvY2stPmJsb2NrX251bV0ubGl2ZWluW2ldICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5iZFtiXS5saXZlb3V0W2ldKTsKKyAgICAgICAgICAgICAgIGlmIChuZXdfbGl2ZW91dCkgeworICAgICAgICAgICAgICAgICAgYmRbYl0ubGl2ZW91dFtpXSB8PSBuZXdfbGl2ZW91dDsKKyAgICAgICAgICAgICAgICAgIGNvbnQgPSB0cnVlOworICAgICAgICAgICAgICAgfQorCSAgICB9CisJIH0KKyAgICAgIH0KKyAgIH0KK30KKworLyoqCisgKiBFeHRlbmQgdGhlIHN0YXJ0L2VuZCByYW5nZXMgZm9yIGVhY2ggdmFyaWFibGUgdG8gYWNjb3VudCBmb3IgdGhlCisgKiBuZXcgaW5mb3JtYXRpb24gY2FsY3VsYXRlZCBmcm9tIGNvbnRyb2wgZmxvdy4KKyAqLwordm9pZAorZnNfbGl2ZV92YXJpYWJsZXM6OmNvbXB1dGVfc3RhcnRfZW5kKCkKK3sKKyAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLT5udW1fYmxvY2tzOyBiKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3ZhcnM7IGkrKykgeworCSBpZiAoQklUU0VUX1RFU1QoYmRbYl0ubGl2ZWluLCBpKSkgeworCSAgICBzdGFydFtpXSA9IE1JTjIoc3RhcnRbaV0sIGNmZy0+YmxvY2tzW2JdLT5zdGFydF9pcCk7CisJICAgIGVuZFtpXSA9IE1BWDIoZW5kW2ldLCBjZmctPmJsb2Nrc1tiXS0+c3RhcnRfaXApOworCSB9CisKKwkgaWYgKEJJVFNFVF9URVNUKGJkW2JdLmxpdmVvdXQsIGkpKSB7CisJICAgIHN0YXJ0W2ldID0gTUlOMihzdGFydFtpXSwgY2ZnLT5ibG9ja3NbYl0tPmVuZF9pcCk7CisJICAgIGVuZFtpXSA9IE1BWDIoZW5kW2ldLCBjZmctPmJsb2Nrc1tiXS0+ZW5kX2lwKTsKKwkgfQorCisgICAgICB9CisgICB9Cit9CisKK2ludAorZnNfbGl2ZV92YXJpYWJsZXM6OnZhcl9mcm9tX3JlZyhmc19yZWcgKnJlZykKK3sKKyAgIHJldHVybiB2YXJfZnJvbV92Z3JmW3JlZy0+cmVnXSArIHJlZy0+cmVnX29mZnNldDsKK30KKworZnNfbGl2ZV92YXJpYWJsZXM6OmZzX2xpdmVfdmFyaWFibGVzKGZzX3Zpc2l0b3IgKnYsIGNmZ190ICpjZmcpCisgICA6IHYodiksIGNmZyhjZmcpCit7CisgICBtZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisKKyAgIG51bV92Z3JmcyA9IHYtPnZpcnR1YWxfZ3JmX2NvdW50OworICAgbnVtX3ZhcnMgPSAwOworICAgdmFyX2Zyb21fdmdyZiA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgaW50LCBudW1fdmdyZnMpOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdmdyZnM7IGkrKykgeworICAgICAgdmFyX2Zyb21fdmdyZltpXSA9IG51bV92YXJzOworICAgICAgbnVtX3ZhcnMgKz0gdi0+dmlydHVhbF9ncmZfc2l6ZXNbaV07CisgICB9CisKKyAgIHZncmZfZnJvbV92YXIgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgbnVtX3ZhcnMpOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdmdyZnM7IGkrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2LT52aXJ0dWFsX2dyZl9zaXplc1tpXTsgaisrKSB7CisgICAgICAgICB2Z3JmX2Zyb21fdmFyW3Zhcl9mcm9tX3ZncmZbaV0gKyBqXSA9IGk7CisgICAgICB9CisgICB9CisKKyAgIHN0YXJ0ID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgbnVtX3ZhcnMpOworICAgZW5kID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBpbnQsIG51bV92YXJzKTsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3ZhcnM7IGkrKykgeworICAgICAgc3RhcnRbaV0gPSBNQVhfSU5TVFJVQ1RJT047CisgICAgICBlbmRbaV0gPSAtMTsKKyAgIH0KKworICAgYmQgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIHN0cnVjdCBibG9ja19kYXRhLCBjZmctPm51bV9ibG9ja3MpOworICAgYmxvY2tzID0gY2ZnLT5udW1fYmxvY2tzOworCisgICBiaXRzZXRfd29yZHMgPSBCSVRTRVRfV09SRFMobnVtX3ZhcnMpOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjZmctPm51bV9ibG9ja3M7IGkrKykgeworICAgICAgYmRbaV0uZGVmID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBCSVRTRVRfV09SRCwgYml0c2V0X3dvcmRzKTsKKyAgICAgIGJkW2ldLnVzZSA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgQklUU0VUX1dPUkQsIGJpdHNldF93b3Jkcyk7CisgICAgICBiZFtpXS5saXZlaW4gPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIEJJVFNFVF9XT1JELCBiaXRzZXRfd29yZHMpOworICAgICAgYmRbaV0ubGl2ZW91dCA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgQklUU0VUX1dPUkQsIGJpdHNldF93b3Jkcyk7CisgICB9CisKKyAgIHNldHVwX2RlZl91c2UoKTsKKyAgIGNvbXB1dGVfbGl2ZV92YXJpYWJsZXMoKTsKKyAgIGNvbXB1dGVfc3RhcnRfZW5kKCk7Cit9CisKK2ZzX2xpdmVfdmFyaWFibGVzOjp+ZnNfbGl2ZV92YXJpYWJsZXMoKQoreworICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKQoreworICAgcmFsbG9jX2ZyZWUobGl2ZV9pbnRlcnZhbHMpOworICAgbGl2ZV9pbnRlcnZhbHMgPSBOVUxMOworfQorCisvKioKKyAqIENvbXB1dGUgdGhlIGxpdmUgaW50ZXJ2YWxzIGZvciBlYWNoIHZpcnR1YWwgR1JGLgorICoKKyAqIFRoaXMgdXNlcyB0aGUgcGVyLWNvbXBvbmVudCB1c2UvZGVmIGRhdGEsIGJ1dCBjb21iaW5lcyBpdCB0byBwcm9kdWNlCisgKiBpbmZvcm1hdGlvbiBhYm91dCB3aG9sZSBWR1JGcy4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6Y2FsY3VsYXRlX2xpdmVfaW50ZXJ2YWxzKGludCBwYXlsb2FkKQoreworICAgaWYgKHRoaXMtPmxpdmVfaW50ZXJ2YWxzKQorICAgICAgcmV0dXJuOworCisgICBpbnQgbnVtX3ZncmZzID0gdGhpcy0+dmlydHVhbF9ncmZfY291bnQgKyBwYXlsb2FkOworICAgcmFsbG9jX2ZyZWUodGhpcy0+dmlydHVhbF9ncmZfc3RhcnQpOworICAgcmFsbG9jX2ZyZWUodGhpcy0+dmlydHVhbF9ncmZfZW5kKTsKKyAgIHZpcnR1YWxfZ3JmX3N0YXJ0ID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgbnVtX3ZncmZzKTsKKyAgIHZpcnR1YWxfZ3JmX2VuZCA9IHJhbGxvY19hcnJheShtZW1fY3R4LCBpbnQsIG51bV92Z3Jmcyk7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3ZncmZzOyBpKyspIHsKKyAgICAgIHZpcnR1YWxfZ3JmX3N0YXJ0W2ldID0gTUFYX0lOU1RSVUNUSU9OOworICAgICAgdmlydHVhbF9ncmZfZW5kW2ldID0gLTE7CisgICB9CisKKyAgIGNmZ190IGNmZygmaW5zdHJ1Y3Rpb25zKTsKKyAgIHRoaXMtPmxpdmVfaW50ZXJ2YWxzID0gbmV3KG1lbV9jdHgpIGZzX2xpdmVfdmFyaWFibGVzKHRoaXMsICZjZmcpOworCisgICAvKiBNZXJnZSB0aGUgcGVyLWNvbXBvbmVudCBsaXZlIHJhbmdlcyB0byB3aG9sZSBWR1JGIGxpdmUgcmFuZ2VzLiAqLworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXZlX2ludGVydmFscy0+bnVtX3ZhcnM7IGkrKykgeworICAgICAgaW50IHZncmYgPSBsaXZlX2ludGVydmFscy0+dmdyZl9mcm9tX3ZhcltpXTsKKyAgICAgIHZpcnR1YWxfZ3JmX3N0YXJ0W3ZncmZdID0gTUlOMih2aXJ0dWFsX2dyZl9zdGFydFt2Z3JmXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlX2ludGVydmFscy0+c3RhcnRbaV0pOworICAgICAgdmlydHVhbF9ncmZfZW5kW3ZncmZdID0gTUFYMih2aXJ0dWFsX2dyZl9lbmRbdmdyZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVfaW50ZXJ2YWxzLT5lbmRbaV0pOworICAgfQorfQorCitib29sCitmc19saXZlX3ZhcmlhYmxlczo6dmFyc19pbnRlcmZlcmUoaW50IGEsIGludCBiKQoreworICAgcmV0dXJuICEoZW5kW2JdIDw9IHN0YXJ0W2FdIHx8CisgICAgICAgICAgICBlbmRbYV0gPD0gc3RhcnRbYl0pOworfQorCitib29sCitmc192aXNpdG9yOjp2aXJ0dWFsX2dyZl9pbnRlcmZlcmVzKGludCBhLCBpbnQgYikKK3sKKyAgIHJldHVybiAhKHZpcnR1YWxfZ3JmX2VuZFthXSA8PSB2aXJ0dWFsX2dyZl9zdGFydFtiXSB8fAorICAgICAgICAgICAgdmlydHVhbF9ncmZfZW5kW2JdIDw9IHZpcnR1YWxfZ3JmX3N0YXJ0W2FdKTsKK30KKworaW50Citmc192aXNpdG9yOjpsaXZlX2luX2NvdW50KGludCBibG9ja19udW0pIGNvbnN0Cit7CisgICBpbnQgY291bnQgPSAwOworCisgICBhc3NlcnQodGhpcy0+bGl2ZV9pbnRlcnZhbHMpOworICAgYXNzZXJ0KHRoaXMtPmxpdmVfaW50ZXJ2YWxzLT5iZCk7CisgICBhc3NlcnQoYmxvY2tfbnVtIDwgdGhpcy0+bGl2ZV9pbnRlcnZhbHMtPmJsb2Nrcyk7CisKKyAgIC8qIENvdW50IG51bWJlciBvZiBsaXZlIGlucyBmb3IgZWFjaCBibG9jayAqLworICAgZm9yIChpbnQgaT0wOyBpPHRoaXMtPmxpdmVfaW50ZXJ2YWxzLT5iaXRzZXRfd29yZHM7ICsraSkKKyAgICAgIGNvdW50ICs9IF9tZXNhX2JpdGNvdW50KHRoaXMtPmxpdmVfaW50ZXJ2YWxzLT5iZFtibG9ja19udW1dLmxpdmVpbltpXSk7CisKKyAgIHJldHVybiBjb3VudDsKK30KKworaW50Citmc192aXNpdG9yOjpsaXZlX291dF9jb3VudChpbnQgYmxvY2tfbnVtKSBjb25zdAoreworICAgaW50IGNvdW50ID0gMDsKKworICAgYXNzZXJ0KHRoaXMtPmxpdmVfaW50ZXJ2YWxzKTsKKyAgIGFzc2VydCh0aGlzLT5saXZlX2ludGVydmFscy0+YmQpOworICAgYXNzZXJ0KGJsb2NrX251bSA8IHRoaXMtPmxpdmVfaW50ZXJ2YWxzLT5ibG9ja3MpOworCisgICAvKiBDb3VudCBudW1iZXIgb2YgbGl2ZSBpbnMgZm9yIGVhY2ggYmxvY2sgKi8KKyAgIGZvciAoaW50IGk9MDsgaTx0aGlzLT5saXZlX2ludGVydmFscy0+Yml0c2V0X3dvcmRzOyArK2kpCisgICAgICBjb3VudCArPSBfbWVzYV9iaXRjb3VudCh0aGlzLT5saXZlX2ludGVydmFscy0+YmRbYmxvY2tfbnVtXS5saXZlb3V0W2ldKTsKKworICAgc3RhdGljIGNvbnN0IGJvb2wgZGVidWcgPSBmYWxzZTsKKworICAgaWYgKGRlYnVnKSB7CisgICAgICBpbnQgY291bnQgPSAwOworICAgICAgZnByaW50ZihzdGRlcnIsICJCbG9jayAlZCBvdXQ6ICIsIGJsb2NrX251bSk7CisgICAgICBmb3IgKGludCB2YXI9MDsgdmFyPHRoaXMtPmxpdmVfaW50ZXJ2YWxzLT5udW1fdmFyczsgKyt2YXIpCisgICAgICAgICBpZiAoQklUU0VUX1RFU1QodGhpcy0+bGl2ZV9pbnRlcnZhbHMtPmJkW2Jsb2NrX251bV0ubGl2ZW91dCwgdmFyKSkgeworICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidmFyJWQ9dmdyZiVkICIsIHZhciwgdGhpcy0+bGl2ZV9pbnRlcnZhbHMtPnZncmZfZnJvbV92YXJbdmFyXSk7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICh0b3RhbD0lZClcbiIsIGNvdW50KTsKKyAgIH0KKworICAgcmV0dXJuIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19saXZlX3ZhcmlhYmxlcy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19saXZlX3ZhcmlhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWFkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX2xpdmVfdmFyaWFibGVzLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqCisgKi8KKworI2luY2x1ZGUgImJyd19mcy5oIgorI2luY2x1ZGUgIm1haW4vYml0c2V0LmgiCisKK2NsYXNzIGNmZ190OworCituYW1lc3BhY2UgYnJ3IHsKKworc3RydWN0IGJsb2NrX2RhdGEgeworICAgLyoqCisgICAgKiBXaGljaCB2YXJpYWJsZXMgYXJlIGRlZmluZWQgYmVmb3JlIGJlaW5nIHVzZWQgaW4gdGhlIGJsb2NrLgorICAgICoKKyAgICAqIE5vdGUgdGhhdCBmb3Igb3VyIHB1cnBvc2VzLCAiZGVmaW5lZCIgbWVhbnMgdW5jb25kaXRpb25hbGx5LCBjb21wbGV0ZWx5CisgICAgKiBkZWZpbmVkLgorICAgICovCisgICBCSVRTRVRfV09SRCAqZGVmOworCisgICAvKioKKyAgICAqIFdoaWNoIHZhcmlhYmxlcyBhcmUgdXNlZCBiZWZvcmUgYmVpbmcgZGVmaW5lZCBpbiB0aGUgYmxvY2suCisgICAgKi8KKyAgIEJJVFNFVF9XT1JEICp1c2U7CisKKyAgIC8qKiBXaGljaCBkZWZzIHJlYWNoIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgYmxvY2suICovCisgICBCSVRTRVRfV09SRCAqbGl2ZWluOworCisgICAvKiogV2hpY2ggZGVmcyByZWFjaCB0aGUgZXhpdCBwb2ludCBvZiB0aGUgYmxvY2suICovCisgICBCSVRTRVRfV09SRCAqbGl2ZW91dDsKK307CisKK2NsYXNzIGZzX2xpdmVfdmFyaWFibGVzIHsKK3B1YmxpYzoKKyAgIERFQ0xBUkVfUkFMTE9DX0NYWF9PUEVSQVRPUlMoZnNfbGl2ZV92YXJpYWJsZXMpCisKKyAgIGZzX2xpdmVfdmFyaWFibGVzKGZzX3Zpc2l0b3IgKnYsIGNmZ190ICpjZmcpOworICAgfmZzX2xpdmVfdmFyaWFibGVzKCk7CisKKyAgIHZvaWQgc2V0dXBfZGVmX3VzZSgpOworICAgdm9pZCBzZXR1cF9vbmVfcmVhZChiYmxvY2tfdCAqYmxvY2ssIGZzX2luc3QgKmluc3QsIGludCBpcCwgZnNfcmVnIHJlZyk7CisgICB2b2lkIHNldHVwX29uZV93cml0ZShiYmxvY2tfdCAqYmxvY2ssIGZzX2luc3QgKmluc3QsIGludCBpcCwgZnNfcmVnIHJlZyk7CisgICB2b2lkIGNvbXB1dGVfbGl2ZV92YXJpYWJsZXMoKTsKKyAgIHZvaWQgY29tcHV0ZV9zdGFydF9lbmQoKTsKKworICAgYm9vbCB2YXJzX2ludGVyZmVyZShpbnQgYSwgaW50IGIpOworICAgaW50IHZhcl9mcm9tX3JlZyhmc19yZWcgKnJlZyk7CisKKyAgIGZzX3Zpc2l0b3IgKnY7CisgICBjZmdfdCAqY2ZnOworICAgdm9pZCAqbWVtX2N0eDsKKworICAgLyoqIE1hcCBmcm9tIHZpcnR1YWwgR1JGIG51bWJlciB0byBpbmRleCBpbiBibG9ja19kYXRhIGFycmF5cy4gKi8KKyAgIGludCAqdmFyX2Zyb21fdmdyZjsKKworICAgLyoqCisgICAgKiBNYXAgZnJvbSBhbnkgaW5kZXggaW4gYmxvY2tfZGF0YSB0byB0aGUgdmlydHVhbCBHUkYgY29udGFpbmluZyBpdC4KKyAgICAqCisgICAgKiBGb3IgdmlydHVhbF9ncmZfc2l6ZXMgb2YgWzEsIDIsIDNdLCB2Z3JmX2Zyb21fdmFyIHdvdWxkIGNvbnRhaW4KKyAgICAqIFswLCAxLCAxLCAyLCAyLCAyXS4KKyAgICAqLworICAgaW50ICp2Z3JmX2Zyb21fdmFyOworCisgICBpbnQgbnVtX3ZhcnM7CisgICBpbnQgbnVtX3ZncmZzOworICAgaW50IGJpdHNldF93b3JkczsKKyAgIGludCBibG9ja3M7CisKKyAgIC8qKiBAeworICAgICogRmluYWwgY29tcHV0ZWQgbGl2ZSByYW5nZXMgZm9yIGVhY2ggdmFyIChlYWNoIGNvbXBvbmVudCBvZiBlYWNoIHZpcnR1YWwKKyAgICAqIEdSRikuCisgICAgKi8KKyAgIGludCAqc3RhcnQ7CisgICBpbnQgKmVuZDsKKyAgIC8qKiBAfSAqLworCisgICAvKiogUGVyLWJhc2ljLWJsb2NrIGluZm9ybWF0aW9uIG9uIGxpdmUgdmFyaWFibGVzICovCisgICBzdHJ1Y3QgYmxvY2tfZGF0YSAqYmQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBicncgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfcGVlcGhvbGVfcHJlZGljYXRlZF9icmVhay5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3BlZXBob2xlX3ByZWRpY2F0ZWRfYnJlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGEyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3BlZXBob2xlX3ByZWRpY2F0ZWRfYnJlYWsuY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYnJ3X2ZzLmgiCisjaW5jbHVkZSAiYnJ3X2NmZy5oIgorCisvKiogQGZpbGUgYnJ3X2ZzX3BlZXBob2xlX3ByZWRpY2F0ZWRfYnJlYWsuY3BwCisgKgorICogTG9vcHMgYXJlIG9mdGVuIHN0cnVjdHVyZWQgYXMKKyAqCisgKiBsb29wOgorICogICAgQ01QLmYwCisgKiAgICAoK2YwKSBJRgorICogICAgQlJFQUsKKyAqICAgIEVORElGCisgKiAgICAuLi4KKyAqICAgIFdISUxFIGxvb3AKKyAqCisgKiBUaGlzIHBlZXBob2xlIHBhc3MgcmVtb3ZlcyB0aGUgSUYgYW5kIEVORElGIGluc3RydWN0aW9ucyBhbmQgcHJlZGljYXRlcyB0aGUKKyAqIEJSRUFLLCBkcm9wcGluZyB0d28gaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGxvb3AgYm9keS4KKyAqLworCitib29sCitmc192aXNpdG9yOjpvcHRfcGVlcGhvbGVfcHJlZGljYXRlZF9icmVhaygpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGNmZ190IGNmZygmaW5zdHJ1Y3Rpb25zKTsKKworICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjZmcubnVtX2Jsb2NrczsgYisrKSB7CisgICAgICBiYmxvY2tfdCAqYmxvY2sgPSBjZmcuYmxvY2tzW2JdOworCisgICAgICAvKiBCUkVBSyBhbmQgQ09OVElOVUUgaW5zdHJ1Y3Rpb25zLCBieSBkZWZpbml0aW9uLCBjYW4gb25seSBiZSBmb3VuZCBhdAorICAgICAgICogdGhlIGVuZHMgb2YgYmFzaWMgYmxvY2tzLgorICAgICAgICovCisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKikgYmxvY2stPmVuZDsKKyAgICAgIGlmIChpbnN0LT5vcGNvZGUgIT0gQlJXX09QQ09ERV9CUkVBSyAmJiBpbnN0LT5vcGNvZGUgIT0gQlJXX09QQ09ERV9DT05USU5VRSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmc19pbnN0ICppZl9pbnN0ID0gKGZzX2luc3QgKikgaW5zdC0+cHJldjsKKyAgICAgIGlmIChpZl9pbnN0LT5vcGNvZGUgIT0gQlJXX09QQ09ERV9JRikKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmc19pbnN0ICplbmRpZl9pbnN0ID0gKGZzX2luc3QgKikgaW5zdC0+bmV4dDsKKyAgICAgIGlmIChlbmRpZl9pbnN0LT5vcGNvZGUgIT0gQlJXX09QQ09ERV9FTkRJRikKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBGb3IgU2FuZHlicmlkZ2Ugd2l0aCBJRiB3aXRoIGVtYmVkZGVkIGNvbXBhcmlzb24gd2UgbmVlZCB0byBlbWl0IGFuCisgICAgICAgKiBpbnN0cnVjdGlvbiB0byBzZXQgdGhlIGZsYWcgcmVnaXN0ZXIuCisgICAgICAgKi8KKyAgICAgIGlmIChicnctPmdlbiA9PSA2ICYmIGlmX2luc3QtPmNvbmRpdGlvbmFsX21vZCkgeworICAgICAgICAgZnNfaW5zdCAqY21wX2luc3QgPSBDTVAocmVnX251bGxfZCwgaWZfaW5zdC0+c3JjWzBdLCBpZl9pbnN0LT5zcmNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9pbnN0LT5jb25kaXRpb25hbF9tb2QpOworICAgICAgICAgaWZfaW5zdC0+aW5zZXJ0X2JlZm9yZShjbXBfaW5zdCk7CisgICAgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBpZl9pbnN0LT5wcmVkaWNhdGU7CisgICAgICAgICBpbnN0LT5wcmVkaWNhdGVfaW52ZXJzZSA9IGlmX2luc3QtPnByZWRpY2F0ZV9pbnZlcnNlOworICAgICAgfQorCisgICAgICBpZl9pbnN0LT5yZW1vdmUoKTsKKyAgICAgIGVuZGlmX2luc3QtPnJlbW92ZSgpOworCisgICAgICAvKiBCeSByZW1vdmluZyB0aGUgRU5ESUYgaW5zdHJ1Y3Rpb24gd2UgcmVtb3ZlZCBhIGJhc2ljIGJsb2NrLiBTa2lwIG92ZXIKKyAgICAgICAqIGl0IGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgICAgKi8KKyAgICAgIGIrKzsKKworICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgfQorCisgICBpZiAocHJvZ3Jlc3MpCisgICAgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfcmVnX2FsbG9jYXRlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfcmVnX2FsbG9jYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjllYjliCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19yZWdfYWxsb2NhdGUuY3BwCkBAIC0wLDAgKzEsODE4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNCBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNpbmNsdWRlICJicndfZnMuaCIKKyNpbmNsdWRlICJnbHNsL2dsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJnbHNsL2lyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImdsc2wvZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRyA6IEFERAorCitzdGF0aWMgY29uc3QgYm9vbCBkZWJ1ZyA9IGZhbHNlOworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisKK2NsYXNzIGlncmFwaF9ub2RlX3QgeworcHVibGljOgorICAgaWdyYXBoX25vZGVfdChpbnQgbm9kZV9jb3VudCkgOiBjb2xvcigtMSksIHNpemUoMSksIHNwaWxsQ29zdCgtMS4wZikKKyAgIHsKKyAgICAgIGVkZ2VzLnJlc2VydmUoMTYpOworICAgfQorCisgICB2b2lkIGFkZEVkZ2UoaW50IGkpIHsgZWRnZXMucHVzaF9iYWNrKGkpOyB9CisgICBpbnQgIGdldEVkZ2UoaW50IHApIGNvbnN0IHsgcmV0dXJuIGVkZ2VzW3BdOyB9CisgICBpbnQgIGdldENvbG9yKCkgY29uc3QgeyByZXR1cm4gY29sb3I7IH0KKyAgIHZvaWQgc2V0Q29sb3IoaW50IGMpIHsgY29sb3IgPSBjOyB9CisgICBpbnQgIGdldEVkZ2VDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGVkZ2VzLnNpemUoKTsgfQorICAgdm9pZCBzZXRTaXplKGludCBzKSB7IHNpemUgPSBzOyB9CisgICBpbnQgIGdldFNpemUoKSBjb25zdCB7IHJldHVybiBzaXplOyB9CisgICB2b2lkIHNldFNwaWxsQ29zdChmbG9hdCBjKSB7IHNwaWxsQ29zdCA9IGM7IH0KKyAgIGZsb2F0IGdldFNwaWxsQ29zdCgpIGNvbnN0IHsgcmV0dXJuIHNwaWxsQ29zdDsgfQorCisgICBib29sIGludGVyZmVyZXNXaXRoKGludCBuKSBjb25zdCB7IHJldHVybiBzdGQ6OmZpbmQoZWRnZXMuYmVnaW4oKSwgZWRnZXMuZW5kKCksIG4pICE9IGVkZ2VzLmVuZCgpOyB9CisKKyAgIHZvaWQgZHVtcEVkZ2VzKCkgY29uc3QgeworICAgICAgZm9yIChpbnQgZT0wOyBlPGludChlZGdlcy5zaXplKCkpOyArK2UpCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlZCIsIGVkZ2VzW2VdKTsKKyAgIH0KKworcHJpdmF0ZToKKyAgIHN0ZDo6dmVjdG9yPGludD4gZWRnZXM7CisgICBpbnQgICBjb2xvcjsKKyAgIGludCAgIGVkZ2VDb3VudDsKKyAgIGludCAgIHNpemU7CisgICBmbG9hdCBzcGlsbENvc3Q7Cit9OworCitjbGFzcyBpZ3JhcGhfdCB7CitwdWJsaWM6CisgICBzdGF0aWMgY29uc3QgaW50IG1heF9yZWdfY291bnQgPSAxMjg7IC8vIG1heCByZWdpc3RlcnMgd2UgY2FuIGV2ZXIgYWxsb2NhdGUKKworICAgaWdyYXBoX3QoaW50IG5vZGVfY291bnQsIGludCBwaHlzX2NvdW50LAorICAgICAgICAgICAgaW50IHZpcnR1YWxfZ3JmX2NvdW50LCBpbnQqIHZpcnR1YWxfZ3JmX3NpemVzKSA6CisgICAgICB0b0NvbG9yKG5vZGVfY291bnQpLAorICAgICAgbm9kZXMobm9kZV9jb3VudCwgaWdyYXBoX25vZGVfdChub2RlX2NvdW50KSksCisgICAgICBwaHlzX2NvdW50KHBoeXNfY291bnQpLAorICAgICAgdmlydHVhbF9ncmZfY291bnQodmlydHVhbF9ncmZfY291bnQpLAorICAgICAgZmFpbF9ub2RlKC0xKQorICAgeworICAgICAgYXNzZXJ0KHBoeXNfY291bnQgPD0gbWF4X3JlZ19jb3VudCk7CisKKyAgICAgIGZvciAoaW50IG49MDsgbjx2aXJ0dWFsX2dyZl9jb3VudDsgKytuKQorICAgICAgICAgbm9kZXNbbl0uc2V0U2l6ZSh2aXJ0dWFsX2dyZl9zaXplc1tuXSk7CisgICB9CisKKyAgIHZvaWQgZHVtcEdyYXBoKCkgY29uc3QgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSQTogaWdyYXBoOlxuIik7CisgICAgICBmb3IgKGludCBuPTA7IG48aW50KG5vZGVzLnNpemUoKSk7ICsrbikgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJSQTogTm9kZSAlM2QgLT4lM2Q6Iiwgbiwgbm9kZXNbbl0uZ2V0Q29sb3IoKSk7CisgICAgICAgICBub2Rlc1tuXS5kdW1wRWRnZXMoKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgIH0KKyAgIH0KKworICAgdm9pZCBhZGRJbnRlcmZlcmVuY2UoaW50IGksIGludCBqKSB7CisgICAgICBhc3NlcnQoaSAhPSBqKTsKKyAgICAgIG5vZGVzW2ldLmFkZEVkZ2Uoaik7CisgICAgICBub2Rlc1tqXS5hZGRFZGdlKGkpOworICAgfQorCisgICBpbnQgIGdldENvbG9yKGludCBpKSBjb25zdCB7IHJldHVybiBub2Rlc1tpXS5nZXRDb2xvcigpOyB9CisgICB2b2lkIHNldENvbG9yKGludCBpLCBpbnQgY29sb3IpIHsgbm9kZXNbaV0uc2V0Q29sb3IoY29sb3IpOyB9CisKKyAgIHZvaWQgc2V0U3BpbGxDb3N0KGludCBpLCBmbG9hdCBjKSB7IG5vZGVzW2ldLnNldFNwaWxsQ29zdChjKTsgfQorCisgICBpbnQgZ2V0QmVzdFNwaWxsTm9kZSgpIGNvbnN0OworCisgICBzdHJ1Y3Qgc29ydGVyIHsKKyAgICAgIHNvcnRlcihjb25zdCBpZ3JhcGhfdCYgZykgOiBnKGcpIHsgfQorCisgICAgICBib29sIG9wZXJhdG9yKCkoaW50IGksIGludCBqKSBjb25zdCB7CisgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGcubm9kZXNbaV0uZ2V0U2l6ZSgpICE9IGcubm9kZXNbal0uZ2V0U2l6ZSgpID8KKyAgICAgICAgICAgICAgICAgIGcubm9kZXNbaV0uZ2V0U2l6ZSgpID4gZy5ub2Rlc1tqXS5nZXRTaXplKCkgOgorICAgICAgICAgICAgZy5ub2Rlc1tpXS5nZXRFZGdlQ291bnQoKSAhPSBnLm5vZGVzW2pdLmdldEVkZ2VDb3VudCgpID8KKyAgICAgICAgICAgICAgICAgIGcubm9kZXNbaV0uZ2V0RWRnZUNvdW50KCkgPiBnLm5vZGVzW2pdLmdldEVkZ2VDb3VudCgpIDoKKyAgICAgICAgICAgIGkgPCBqOworICAgICAgfQorCisgICAgICBjb25zdCBpZ3JhcGhfdCYgZzsKKyAgIH07CisKKyAgIGJvb2wgY29sb3JOb2RlKGludCBuLCBzdGQ6OmJpdHNldDxtYXhfcmVnX2NvdW50PiYgdXNlZCkgeworICAgICAgLy8gVHJpdmlhbCByZXR1cm4gaWYgYWxyZWFkeSBjb2xvcmVkCisgICAgICBpZiAobm9kZXNbbl0uZ2V0Q29sb3IoKSA+PSAwKQorICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIHVzZWQucmVzZXQoKTsKKworICAgICAgLy8gUGxhY2UgaW50ZXJmZXJpbmcgbm9kZXMKKyAgICAgIGZvciAoaW50IGU9MDsgZTxub2Rlc1tuXS5nZXRFZGdlQ291bnQoKTsgKytlKSB7CisgICAgICAgICBjb25zdCBpbnQgbjIgICAgPSBub2Rlc1tuXS5nZXRFZGdlKGUpOworICAgICAgICAgY29uc3QgaW50IGNvbG9yID0gbm9kZXNbbjJdLmdldENvbG9yKCk7CisgICAgICAgICBpZiAoY29sb3IgPj0gMCkKKyAgICAgICAgICAgIGZvciAoaW50IHM9MDsgczxub2Rlc1tuMl0uZ2V0U2l6ZSgpOyArK3MpCisgICAgICAgICAgICAgICB1c2VkLnNldChjb2xvcitzKTsKKyAgICAgIH0KKworICAgICAgLy8gRmluZCBjb2xvciBmb3IgdGhpcyBub2RlCisgICAgICBpbnQgYzsKKyAgICAgIGludCBhdmFpbD0wOworICAgICAgZm9yIChjPTA7IGM8cGh5c19jb3VudDsgKytjKSB7CisgICAgICAgICBpZiAodXNlZC50ZXN0KGMpKQorICAgICAgICAgICAgYXZhaWw9MDsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmICgrK2F2YWlsID49IG5vZGVzW25dLmdldFNpemUoKSkKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoYXZhaWwgPCBub2Rlc1tuXS5nZXRTaXplKCkpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIG5vZGVzW25dLnNldENvbG9yKGMgKyAxIC0gbm9kZXNbbl0uZ2V0U2l6ZSgpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBib29sIGNvbG9yR3JhcGgoKSB7CisgICAgICBmb3IgKGludCBuPTA7IG48aW50KG5vZGVzLnNpemUoKSk7ICsrbikKKyAgICAgICAgIHRvQ29sb3Jbbl0gPSBuOworCisgICAgICBzdGQ6OnNvcnQodG9Db2xvci5iZWdpbigpLCB0b0NvbG9yLmVuZCgpLCBzb3J0ZXIoKnRoaXMpKTsKKworICAgICAgc3RkOjpiaXRzZXQ8bWF4X3JlZ19jb3VudD4gdXNlZDsKKworICAgICAgZm9yIChpbnQgbj0wOyBuPGludCh0b0NvbG9yLnNpemUoKSk7ICsrbikgeworICAgICAgICAgaWYgKCFjb2xvck5vZGUodG9Db2xvcltuXSwgdXNlZCkpIHsKKyAgICAgICAgICAgIGZhaWxfbm9kZSA9IHRvQ29sb3Jbbl07CisKKyAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJSQTogZmFpbDogbm9kZT0lZCwgc2l6ZT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9Db2xvcltuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNbdG9Db2xvcltuXV0uZ2V0U2l6ZSgpKTsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUkE6IE1hcDogIik7CisgICAgICAgICAgICAgICBmb3IgKGludCB4PTA7IHg8aW50KHVzZWQuc2l6ZSgpKTsgKyt4KQorICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHVzZWRbeF0gPyAiWCIgOiAiLiIpOworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCitwcml2YXRlOgorICAgZmxvYXQgZ2V0U3BpbGxCZW5lZml0KGludCBuKSBjb25zdDsKKworICAgc3RkOjp2ZWN0b3I8aW50PiB0b0NvbG9yOworICAgc3RkOjp2ZWN0b3I8aWdyYXBoX25vZGVfdD4gbm9kZXM7CisgICBpbnQgcGh5c19jb3VudDsKKyAgIGludCB2aXJ0dWFsX2dyZl9jb3VudDsKKyAgIGludCBmYWlsX25vZGU7Cit9OworCitmbG9hdCBpZ3JhcGhfdDo6Z2V0U3BpbGxCZW5lZml0KGludCBuKSBjb25zdAoreworICAgZmxvYXQgYmVuZWZpdCA9IDA7CisKKyAgIGZvciAoaW50IGUgPSAwOyBlIDwgbm9kZXNbbl0uZ2V0RWRnZUNvdW50KCk7IGUrKykgeworICAgICAgaW50IG4yID0gbm9kZXNbbl0uZ2V0RWRnZShlKTsKKworICAgICAgaWYgKG4gIT0gbjIpCisgICAgICAgICBiZW5lZml0ICs9IG5vZGVzW24yXS5nZXRTaXplKCk7CisgICB9CisKKyAgIHJldHVybiBiZW5lZml0OworfQorCitpbnQgaWdyYXBoX3Q6OmdldEJlc3RTcGlsbE5vZGUoKSBjb25zdAoreworICAgdW5zaWduZWQgaW50IGJlc3Rfbm9kZSA9IC0xOworICAgZmxvYXQgYmVzdF9iZW5lZml0ID0gMC4wOworCisgICBmb3IgKGludCBuID0gMDsgbiA8IHZpcnR1YWxfZ3JmX2NvdW50OyBuKyspIHsKKyAgICAgIGNvbnN0IGZsb2F0IGNvc3QgPSBub2Rlc1tuXS5nZXRTcGlsbENvc3QoKTsKKworICAgICAgaWYgKGNvc3QgPD0gMC4wKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGNvbnN0IGZsb2F0IGJlbmVmaXQgPSBnZXRTcGlsbEJlbmVmaXQobik7CisKKyAgICAgIGlmIChiZW5lZml0IC8gY29zdCA+IGJlc3RfYmVuZWZpdCkgeworICAgICAgICAgYmVzdF9iZW5lZml0ID0gYmVuZWZpdCAvIGNvc3Q7CisgICAgICAgICBiZXN0X25vZGUgPSBuOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gYmVzdF9ub2RlOworfQorCisKK3N0YXRpYyB2b2lkCithc3NpZ25fcmVnKGludCAqcmVnX2h3X2xvY2F0aW9ucywgZnNfcmVnICpyZWcsIGludCByZWdfd2lkdGgpCit7CisgICBpZiAocmVnLT5maWxlID09IEdSRikgeworICAgICAgYXNzZXJ0KHJlZy0+cmVnX29mZnNldCA+PSAwKTsKKyAgICAgIGFzc2VydChyZWdfaHdfbG9jYXRpb25zW3JlZy0+cmVnXSA+PSAwKTsKKworICAgICAgcmVnLT5yZWcgPSByZWdfaHdfbG9jYXRpb25zW3JlZy0+cmVnXSArIHJlZy0+cmVnX29mZnNldCAqIHJlZ193aWR0aDsKKyAgICAgIHJlZy0+cmVnX29mZnNldCA9IDA7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmFzc2lnbl9yZWdzX3RyaXZpYWwoKQoreworICAgaW50IGh3X3JlZ19tYXBwaW5nW3RoaXMtPnZpcnR1YWxfZ3JmX2NvdW50ICsgMV07CisgICBpbnQgaTsKKyAgIGludCByZWdfd2lkdGggPSBkaXNwYXRjaF93aWR0aCAvIDg7CisKKyAgIC8qIE5vdGUgdGhhdCBjb21wcmVzc2VkIGluc3RydWN0aW9ucyByZXF1aXJlIGFsaWdubWVudCB0byAyIHJlZ2lzdGVycy4gKi8KKyAgIGh3X3JlZ19tYXBwaW5nWzBdID0gQUxJR04odGhpcy0+Zmlyc3Rfbm9uX3BheWxvYWRfZ3JmLCByZWdfd2lkdGgpOworICAgZm9yIChpID0gMTsgaSA8PSB0aGlzLT52aXJ0dWFsX2dyZl9jb3VudDsgaSsrKSB7CisgICAgICBod19yZWdfbWFwcGluZ1tpXSA9IChod19yZWdfbWFwcGluZ1tpIC0gMV0gKworCQkJICAgdGhpcy0+dmlydHVhbF9ncmZfc2l6ZXNbaSAtIDFdICogcmVnX3dpZHRoKTsKKyAgIH0KKyAgIHRoaXMtPmdyZl91c2VkID0gaHdfcmVnX21hcHBpbmdbdGhpcy0+dmlydHVhbF9ncmZfY291bnRdOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgYXNzaWduX3JlZyhod19yZWdfbWFwcGluZywgJmluc3QtPmRzdCwgcmVnX3dpZHRoKTsKKyAgICAgIGFzc2lnbl9yZWcoaHdfcmVnX21hcHBpbmcsICZpbnN0LT5zcmNbMF0sIHJlZ193aWR0aCk7CisgICAgICBhc3NpZ25fcmVnKGh3X3JlZ19tYXBwaW5nLCAmaW5zdC0+c3JjWzFdLCByZWdfd2lkdGgpOworICAgICAgYXNzaWduX3JlZyhod19yZWdfbWFwcGluZywgJmluc3QtPnNyY1syXSwgcmVnX3dpZHRoKTsKKyAgIH0KKworICAgaWYgKHRoaXMtPmdyZl91c2VkID49IG1heF9ncmYpIHsKKyAgICAgIGZhaWwoIlJhbiBvdXQgb2YgcmVncyBvbiB0cml2aWFsIGFsbG9jYXRvciAoJWQvJWQpXG4iLAorCSAgIHRoaXMtPmdyZl91c2VkLCBtYXhfZ3JmKTsKKyAgIH0KKworfQorCitpbnQKK2NvdW50X3RvX2xvb3BfZW5kKGZzX2luc3QgKmRvX2luc3QpCit7CisgICBpbnQgZGVwdGggPSAxOworICAgaW50IGlwID0gMTsKKyAgIGZvciAoZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopZG9faW5zdC0+bmV4dDsKKyAgICAgICAgZGVwdGggPiAwOworICAgICAgICBpbnN0ID0gKGZzX2luc3QgKilpbnN0LT5uZXh0KSB7CisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgICAgY2FzZSBCUldfT1BDT0RFX0RPOgorICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1dISUxFOgorICAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaXArKzsKKyAgIH0KKyAgIHJldHVybiBpcDsKK30KKworLyoqCisgKiBTZXRzIHVwIGludGVyZmVyZW5jZSBiZXR3ZWVuIHRocmVhZCBwYXlsb2FkIHJlZ2lzdGVycyBhbmQgdGhlIHZpcnR1YWwgR1JGcworICogdG8gYmUgYWxsb2NhdGVkIGZvciBwcm9ncmFtIHRlbXBvcmFyaWVzLgorICoKKyAqIFdlIHdhbnQgdG8gYmUgYWJsZSB0byByZWFsbG9jYXRlIHRoZSBwYXlsb2FkIGZvciBvdXIgdmlydHVhbCBHUkZzLCBub3RhYmx5CisgKiBiZWNhdXNlIHRoZSBzZXR1cCBjb2VmZmljaWVudHMgZm9yIGEgZnVsbCBzZXQgb2YgMTYgRlMgaW5wdXRzIHRha2VzIHVwIDggb2YKKyAqIG91ciAxMjggcmVnaXN0ZXJzLgorICoKKyAqIFRoZSBsYXlvdXQgb2YgdGhlIHBheWxvYWQgcmVnaXN0ZXJzIGlzOgorICoKKyAqIDAuLm5yX3BheWxvYWRfcmVncy0xOiBmaXhlZCBmdW5jdGlvbiBzZXR1cCAoaW5jbHVkaW5nIGJhcnkgY29vcmRpbmF0ZXMpLgorICogbnJfcGF5bG9hZF9yZWdzLi5ucl9wYXlsb2FkX3JlZ3MrY3VyYl9yZWFkX2xlbmdoLTE6IHVuaWZvcm0gZGF0YQorICogbnJfcGF5bG9hZF9yZWdzK2N1cmJfcmVhZF9sZW5naC4uZmlyc3Rfbm9uX3BheWxvYWRfZ3JmLTE6IHNldHVwIGNvZWZmaWNpZW50cy4KKyAqCisgKiBBbmQgd2UgaGF2ZSBwYXlsb2FkX25vZGVfY291bnQgbm9kZXMgY292ZXJpbmcgdGhlc2UgcmVnaXN0ZXJzIGluIG9yZGVyCisgKiAobm90ZSB0aGF0IGluIFNJTUQxNiwgYSBub2RlIGlzIHR3byByZWdpc3RlcnMpLgorICovCit2b2lkCitmc192aXNpdG9yOjpzZXR1cF9wYXlsb2FkX2ludGVyZmVyZW5jZShpbnQqIHBheWxvYWRfbGFzdF91c2VfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1yZl9maXJzdF91c2VfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZF9ub2RlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZl9ub2RlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X3BheWxvYWRfbm9kZSkKK3sKKyAgIGludCByZWdfd2lkdGggPSBkaXNwYXRjaF93aWR0aCAvIDg7CisgICBpbnQgbG9vcF9kZXB0aCA9IDA7CisgICBpbnQgbG9vcF9lbmRfaXAgPSAwOworICAgaW50IGxvb3Bfc3RhcnRfaXAgPSAwOworCisgICBtZW1zZXQocGF5bG9hZF9sYXN0X3VzZV9pcCwgMCwgcGF5bG9hZF9ub2RlX2NvdW50ICogc2l6ZW9mKGludCkpOworCisgICBpZiAobXJmX2ZpcnN0X3VzZV9pcCkgeworICAgICAgZm9yIChpbnQgaT0wOyBpPG1yZl9ub2RlX2NvdW50OyArK2kpCisgICAgICAgICBtcmZfZmlyc3RfdXNlX2lwW2ldID0gLTE7CisgICB9CisKKyAgIGludCBpcCA9IDA7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9ETzoKKyAgICAgICAgIGxvb3BfZGVwdGgrKzsKKworICAgICAgICAgLyogU2luY2UgcGF5bG9hZCByZWdzIGFyZSBkZWZmZWQgb25seSBhdCB0aGUgc3RhcnQgb2YgdGhlIHNoYWRlcgorICAgICAgICAgICogZXhlY3V0aW9uLCBhbnkgdXNlcyBvZiB0aGUgcGF5bG9hZCB3aXRoaW4gYSBsb29wIG1lYW4gdGhlIGxpdmUKKyAgICAgICAgICAqIGludGVydmFsIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgb3V0ZXJtb3N0IGxvb3AuICBGaW5kIHRoZSBpcCBvZgorICAgICAgICAgICogdGhlIGVuZCBub3cuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChsb29wX2RlcHRoID09IDEpIHsKKyAgICAgICAgICAgIGxvb3Bfc3RhcnRfaXAgPSBpcDsKKyAgICAgICAgICAgIGxvb3BfZW5kX2lwID0gaXAgKyBjb3VudF90b19sb29wX2VuZChpbnN0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCUldfT1BDT0RFX1dISUxFOgorICAgICAgICAgbG9vcF9kZXB0aC0tOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGludCB1c2VfaXA7CisgICAgICBpbnQgbXJmX2lwOworICAgICAgaWYgKGxvb3BfZGVwdGggPiAwKSB7CisgICAgICAgICB1c2VfaXAgPSBsb29wX2VuZF9pcDsKKyAgICAgICAgIG1yZl9pcCA9IGxvb3Bfc3RhcnRfaXA7CisgICAgICB9IGVsc2UgeworICAgICAgICAgdXNlX2lwID0gaXA7CisgICAgICAgICBtcmZfaXAgPSBpcDsKKyAgICAgIH0KKworICAgICAgLyogTm90ZSB0aGF0IFVOSUZPUk0gYXJncyBoYXZlIGJlZW4gdHVybmVkIGludG8gRklYRURfSFdfUkVHIGJ5CisgICAgICAgKiBhc3NpZ25fY3VyYmVfc2V0dXAoKSwgYW5kIGludGVycG9sYXRpb24gdXNlcyBmaXhlZCBoYXJkd2FyZSByZWdzIGZyb20KKyAgICAgICAqIHRoZSBzdGFydCAoc2VlIGludGVycF9yZWcoKSkuCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gSFdfUkVHICYmCisgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpIHsKKyAgICAgICAgICAgIGludCBub2RlX25yID0gaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5uciAvIHJlZ193aWR0aDsKKyAgICAgICAgICAgIGlmIChub2RlX25yID49IHBheWxvYWRfbm9kZV9jb3VudCkKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBwYXlsb2FkX2xhc3RfdXNlX2lwW25vZGVfbnJdID0gdXNlX2lwOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobXJmX2ZpcnN0X3VzZV9pcCkgeworICAgICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IE1SRikgeworICAgICAgICAgICAgY29uc3QgaW50IHJlZyA9IGluc3QtPmRzdC5yZWcgJiB+QlJXX01SRl9DT01QUjQ7CisgICAgICAgICAgICBtcmZfZmlyc3RfdXNlX2lwW3JlZ10gPSBtcmZfaXA7CisgICAgICAgICAgICBpZiAocmVnX3dpZHRoID09IDIpIHsKKyAgICAgICAgICAgICAgIGlmIChpbnN0LT5kc3QucmVnICYgQlJXX01SRl9DT01QUjQpIHsKKyAgICAgICAgICAgICAgICAgIG1yZl9maXJzdF91c2VfaXBbcmVnICsgNF0gPSBtcmZfaXA7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbXJmX2ZpcnN0X3VzZV9pcFtyZWcgKyAxXSA9IG1yZl9pcDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGluc3QtPm1sZW4gPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcGxpZWRfbXJmX3dyaXRlcyhpbnN0KTsgaSsrKSB7CisgICAgICAgICAgICAgICBtcmZfZmlyc3RfdXNlX2lwW2luc3QtPmJhc2VfbXJmICsgaV0gPSBtcmZfaXA7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbnMgd2hpY2ggaGF2ZSBleHRyYSBpbXBsaWVkIHJlZ2lzdGVycyB1c2VkLiAqLworICAgICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgICAgIGNhc2UgRlNfT1BDT0RFX0ZCX1dSSVRFOgorICAgICAgICAgLyogV2UgY291bGQgb21pdCB0aGlzIGZvciB0aGUgIWluc3QtPmhlYWRlcl9wcmVzZW50IGNhc2UsIGV4Y2VwdCB0aGF0CisgICAgICAgICAgKiB0aGUgc2ltdWxhdG9yIGFwcGFyZW50bHkgaW5jb3JyZWN0bHkgcmVhZHMgZnJvbSBnMC9nMSBpbnN0ZWFkIG9mCisgICAgICAgICAgKiBzaWRlYmFuZC4gIEl0IGFsc28gcmVhbGx5IGZyZWFrcyBvdXQgZHJpdmVyIGRldmVsb3BlcnMgdG8gc2VlIGcwCisgICAgICAgICAgKiB1c2VkIGluIHVudXN1YWwgcGxhY2VzLCBzbyBqdXN0IGFsd2F5cyByZXNlcnZlIGl0LgorICAgICAgICAgICovCisgICAgICAgICBwYXlsb2FkX2xhc3RfdXNlX2lwWzAgLyByZWdfd2lkdGhdID0gdXNlX2lwOworICAgICAgICAgcGF5bG9hZF9sYXN0X3VzZV9pcFsxIC8gcmVnX3dpZHRoXSA9IHVzZV9pcDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZTX09QQ09ERV9MSU5URVJQOgorICAgICAgICAgLyogT24gZ2VuNisgaW4gU0lNRDE2LCB0aGVyZSBhcmUgNCBhZGphY2VudCByZWdpc3RlcnMgKHNvIDIgbm9kZXMpCisgICAgICAgICAgKiB1c2VkIGJ5IFBMTidzIHNvdXJjaW5nIG9mIHRoZSBkZWx0YXMsIHdoaWxlIHdlIGxpc3Qgb25seSB0aGUgZmlyc3QKKyAgICAgICAgICAqIHR3byBpbiB0aGUgYXJndW1lbnRzICgxIG5vZGUpLiAgUHJlLWdlbjYsIHRoZSBkZWx0YXMgYXJlIGNvbXB1dGVkCisgICAgICAgICAgKiBpbiBub3JtYWwgVkdSRnMuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICAgICAgICBpbnQgZGVsdGFfeF9hcmcgPSAwOworICAgICAgICAgICAgaWYgKGluc3QtPnNyY1tkZWx0YV94X2FyZ10uZmlsZSA9PSBIV19SRUcgJiYKKyAgICAgICAgICAgICAgICBpbnN0LT5zcmNbZGVsdGFfeF9hcmddLmZpeGVkX2h3X3JlZy5maWxlID09CisgICAgICAgICAgICAgICAgQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSkgeworICAgICAgICAgICAgICAgaW50IHNlY2hhbGZfbm9kZSA9IChpbnN0LT5zcmNbZGVsdGFfeF9hcmddLmZpeGVkX2h3X3JlZy5uciAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ193aWR0aCkgKyAxOworICAgICAgICAgICAgICAgYXNzZXJ0KHNlY2hhbGZfbm9kZSA8IHBheWxvYWRfbm9kZV9jb3VudCk7CisgICAgICAgICAgICAgICBwYXlsb2FkX2xhc3RfdXNlX2lwW3NlY2hhbGZfbm9kZV0gPSB1c2VfaXA7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpcCsrOworICAgfQorfQorCisvKioKKyAqIFNldHMgdGhlIG1yZl91c2VkIGFycmF5IHRvIGluZGljYXRlIHdoaWNoIE1SRnMgYXJlIHVzZWQgYnkgdGhlIHNoYWRlciBJUgorICoKKyAqIFRoaXMgaXMgdXNlZCBpbiBhc3NpZ25fcmVncygpIHRvIGRlY2lkZSB3aGljaCBvZiB0aGUgR1JGcyB0aGF0IHdlIHVzZSBhcworICogTVJGcyBvbiBnZW43IGdldCBub3JtYWxseSByZWdpc3RlciBhbGxvY2F0ZWQsIGFuZCBpbiByZWdpc3RlciBzcGlsbGluZyB0bworICogc2VlIGlmIHdlIGNhbiBhY3R1YWxseSB1c2UgTVJGcyB0byBkbyBzcGlsbHMgd2l0aG91dCBvdmVyd3JpdGluZyBub3JtYWwgTVJGCisgKiBjb250ZW50cy4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6Z2V0X3VzZWRfbXJmcyhib29sICptcmZfdXNlZCkKK3sKKyAgIGludCByZWdfd2lkdGggPSBkaXNwYXRjaF93aWR0aCAvIDg7CisKKyAgIG1lbXNldChtcmZfdXNlZCwgMCwgQlJXX01BWF9NUkYgKiBzaXplb2YoYm9vbCkpOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IE1SRikgeworICAgICAgICAgaW50IHJlZyA9IGluc3QtPmRzdC5yZWcgJiB+QlJXX01SRl9DT01QUjQ7CisgICAgICAgICBtcmZfdXNlZFtyZWddID0gdHJ1ZTsKKyAgICAgICAgIGlmIChyZWdfd2lkdGggPT0gMikgeworICAgICAgICAgICAgaWYgKGluc3QtPmRzdC5yZWcgJiBCUldfTVJGX0NPTVBSNCkgeworICAgICAgICAgICAgICAgbXJmX3VzZWRbcmVnICsgNF0gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIG1yZl91c2VkW3JlZyArIDFdID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPm1sZW4gPiAwKSB7CisJIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wbGllZF9tcmZfd3JpdGVzKGluc3QpOyBpKyspIHsKKyAgICAgICAgICAgIG1yZl91c2VkW2luc3QtPmJhc2VfbXJmICsgaV0gPSB0cnVlOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCitib29sCitmc192aXNpdG9yOjphc3NpZ25fcmVncyhib29sIGFsbG93X3NwaWxsaW5nKQoreworICAgLyogTW9zdCBvZiB0aGlzIGFsbG9jYXRpb24gd2FzIHdyaXR0ZW4gZm9yIGEgcmVnX3dpZHRoIG9mIDEKKyAgICAqIChkaXNwYXRjaF93aWR0aCA9PSA4KS4gIEluIGV4dGVuZGluZyB0byBTSU1EMTYsIHRoZSBjb2RlIHdhcworICAgICogbGVmdCBpbiBwbGFjZSBhbmQgaXQgd2FzIGNvbnZlcnRlZCB0byBoYXZlIHRoZSBoYXJkd2FyZQorICAgICogcmVnaXN0ZXJzIGl0J3MgYWxsb2NhdGluZyBiZSBjb250aWd1b3VzIHBoeXNpY2FsIHBhaXJzIG9mIHJlZ3MKKyAgICAqIGZvciByZWdfd2lkdGggPT0gMi4KKyAgICAqLworICAgaW50IHJlZ193aWR0aCA9IGRpc3BhdGNoX3dpZHRoIC8gODsKKyAgIGludCBwYXlsb2FkX25vZGVfY291bnQgPSAoQUxJR04odGhpcy0+Zmlyc3Rfbm9uX3BheWxvYWRfZ3JmLCByZWdfd2lkdGgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfd2lkdGgpOworCisgICBpbnQgbm9kZV9jb3VudCA9IHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50OworICAgaW50IGZpcnN0X3BheWxvYWRfbm9kZSA9IG5vZGVfY291bnQ7CisgICBub2RlX2NvdW50ICs9IHBheWxvYWRfbm9kZV9jb3VudDsKKyAgIGludCBmaXJzdF9tcmZfaGFja19ub2RlID0gbm9kZV9jb3VudDsKKyAgIGludCBtcmZfaGFja19ub2RlX2NvdW50ID0gMDsKKyAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICBtcmZfaGFja19ub2RlX2NvdW50ID0gQlJXX01BWF9HUkYgLSBHRU43X01SRl9IQUNLX1NUQVJUOworICAgICAgbm9kZV9jb3VudCArPSBtcmZfaGFja19ub2RlX2NvdW50OworICAgfQorCisgICBpbnQgaHdfcmVnX21hcHBpbmdbbm9kZV9jb3VudF07CisgICBpbnQgbXJmX2ZpcnN0X3VzZV9pcFttcmZfaGFja19ub2RlX2NvdW50XTsKKyAgIGludCBwYXlsb2FkX2xhc3RfdXNlX2lwW3BheWxvYWRfbm9kZV9jb3VudF07CisgICBpbnQgZXh0cmFfcmVncyA9IG5vZGVfY291bnQgLSB2aXJ0dWFsX2dyZl9jb3VudDsKKworICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworICAgY2FsY3VsYXRlX2xpdmVfaW50ZXJ2YWxzKGV4dHJhX3JlZ3MpOworCisgICBjb25zdCBpbnQgaW5jb21pbmdfcHJlc3N1cmUgPSBkZWJ1ZyA/IGNhbGN1bGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZShleHRyYV9yZWdzKSA6IDA7CisKKyAgIHNldHVwX3BheWxvYWRfaW50ZXJmZXJlbmNlKHBheWxvYWRfbGFzdF91c2VfaXAsIG1yZl9maXJzdF91c2VfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX25vZGVfY291bnQsIG1yZl9oYWNrX25vZGVfY291bnQsIGZpcnN0X3BheWxvYWRfbm9kZSk7CisKKyAgIGlncmFwaF90IGlncmFwaChub2RlX2NvdW50LCBCUldfTUFYX0dSRiAvIHJlZ193aWR0aCwgdmlydHVhbF9ncmZfY291bnQsIHZpcnR1YWxfZ3JmX3NpemVzKTsKKworICAgaWYgKGRlYnVnKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJBOiB3aWR0aD0lZCwgaW5jb21pbmcgcHJlc3N1cmU9JWRcbiIsIHJlZ193aWR0aCwgaW5jb21pbmdfcHJlc3N1cmUpOworICAgfQorCisgICAvLyBTZXQgcGF5bG9hZCBpbnRlcmZlcmVuY2VzCisgICBmb3IgKGludCBpID0gMDsgaSA8IHBheWxvYWRfbm9kZV9jb3VudDsgaSsrKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50OyBqKyspCisgICAgICAgICBpZiAodGhpcy0+dmlydHVhbF9ncmZfc3RhcnRbal0gPD0gcGF5bG9hZF9sYXN0X3VzZV9pcFtpXSkKKyAgICAgICAgICAgIGlncmFwaC5hZGRJbnRlcmZlcmVuY2UoZmlyc3RfcGF5bG9hZF9ub2RlICsgaSwgaik7CisKKyAgICAgIGlncmFwaC5zZXRDb2xvcihmaXJzdF9wYXlsb2FkX25vZGUgKyBpLCBpKTsKKyAgIH0KKworICAgLy8gU2V0IG5vZGUgaW50ZXJmZXJlbmNlcworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlX2NvdW50OyBpKyspCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgIGlmICh2aXJ0dWFsX2dyZl9pbnRlcmZlcmVzKGksIGopIHx8CisgICAgICAgICAgICAgKHZpcnR1YWxfZ3JmX2VuZFtpXSA9PSB2aXJ0dWFsX2dyZl9zdGFydFtpXSB8fAorICAgICAgICAgICAgICB2aXJ0dWFsX2dyZl9lbmRbal0gPT0gdmlydHVhbF9ncmZfc3RhcnRbal0pKQorICAgICAgICAgICAgaWdyYXBoLmFkZEludGVyZmVyZW5jZShpLCBqKTsKKworICAgLy8gU2V0IE1SRiBpbnRlcmZlcmVuY2VzCisgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtcmZfaGFja19ub2RlX2NvdW50OyBpKyspIHsKKyAgICAgICAgIGlmIChtcmZfZmlyc3RfdXNlX2lwW2ldID49IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGhpcy0+dmlydHVhbF9ncmZfY291bnQ7IGorKykKKyAgICAgICAgICAgICAgIGlmICh0aGlzLT52aXJ0dWFsX2dyZl9lbmRbal0gPj0gbXJmX2ZpcnN0X3VzZV9pcFtpXSkKKyAgICAgICAgICAgICAgICAgIGlncmFwaC5hZGRJbnRlcmZlcmVuY2UoZmlyc3RfbXJmX2hhY2tfbm9kZSArIGksIGopOworCisgICAgICAgICAgICBpZ3JhcGguc2V0Q29sb3IoZmlyc3RfbXJmX2hhY2tfbm9kZSArIGksIChHRU43X01SRl9IQUNLX1NUQVJUICsgaSkgLyByZWdfd2lkdGgpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBpZiAoIWlncmFwaC5jb2xvckdyYXBoKCkpIHsKKyAgICAgIC8qIEZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlcnMuICBTcGlsbCBhIHJlZywgYW5kIHRoZSBjYWxsZXIgd2lsbAorICAgICAgICogbG9vcCBiYWNrIGludG8gaGVyZSB0byB0cnkgYWdhaW4uICovCisKKyAgICAgIGlmIChhbGxvd19zcGlsbGluZykgeworICAgICAgICAgY29uc3QgaW50IHJlZyA9IGNob29zZV9zcGlsbF9yZWcoaWdyYXBoKTsKKworICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJBOiBzcGlsbDogcmVnPSVkLCBzaXplPSVkXG4iLCByZWcsIHZpcnR1YWxfZ3JmX3NpemVzW3JlZ10pOworICAgICAgICAgICAgLy8gZnByaW50ZihzdGRlcnIsICJSQTogcHJlLXNwaWxsXG4iKTsKKyAgICAgICAgICAgIC8vIGR1bXBfaW5zdHJ1Y3Rpb25zKCk7CisgICAgICAgICAgICAvLyBmcHJpbnRmKHN0ZGVyciwgIlJBOiBwb3N0LXNwaWxsXG4iKTsKKyAgICAgICAgICAgIC8vIGR1bXBfaW5zdHJ1Y3Rpb25zKCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChyZWcgPT0gLTEpIHsKKyAgICAgICAgICAgIGZhaWwoIm5vIHJlZ2lzdGVyIHRvIHNwaWxsOlxuIik7CisgICAgICAgICAgICBkdW1wX2luc3RydWN0aW9ucygpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwaWxsX3JlZyhyZWcpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIC8qIEdldCB0aGUgY2hvc2VuIHZpcnR1YWwgcmVnaXN0ZXJzIGZvciBlYWNoIG5vZGUsIGFuZCBtYXAgdmlydHVhbAorICAgICogcmVncyBpbiB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBiYWNrIGRvd24gdG8gcmVhbCBoYXJkd2FyZSByZWcKKyAgICAqIG51bWJlcnMuCisgICAgKi8KKyAgIHRoaXMtPmdyZl91c2VkID0gcGF5bG9hZF9ub2RlX2NvdW50ICogcmVnX3dpZHRoOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52aXJ0dWFsX2dyZl9jb3VudDsgaSsrKSB7CisgICAgICBod19yZWdfbWFwcGluZ1tpXSA9IGlncmFwaC5nZXRDb2xvcihpKSAqIHJlZ193aWR0aDsKKworICAgICAgLy8gZnByaW50ZihzdGRlcnIsICJSQTogdmdyZiVkIC0+ICVkXG4iLCBpLCBod19yZWdfbWFwcGluZ1tpXSk7CisgICAgICAKKyAgICAgIHRoaXMtPmdyZl91c2VkID0gTUFYMih0aGlzLT5ncmZfdXNlZCwKKyAgICAgICAgCQkgICAgaHdfcmVnX21hcHBpbmdbaV0gKyB0aGlzLT52aXJ0dWFsX2dyZl9zaXplc1tpXSAqIHJlZ193aWR0aCk7CisgICB9CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworCisgICAgICBhc3NpZ25fcmVnKGh3X3JlZ19tYXBwaW5nLCAmaW5zdC0+ZHN0LCAgICByZWdfd2lkdGgpOworICAgICAgYXNzaWduX3JlZyhod19yZWdfbWFwcGluZywgJmluc3QtPnNyY1swXSwgcmVnX3dpZHRoKTsKKyAgICAgIGFzc2lnbl9yZWcoaHdfcmVnX21hcHBpbmcsICZpbnN0LT5zcmNbMV0sIHJlZ193aWR0aCk7CisgICAgICBhc3NpZ25fcmVnKGh3X3JlZ19tYXBwaW5nLCAmaW5zdC0+c3JjWzJdLCByZWdfd2lkdGgpOworICAgfQorCisgICBpZiAoZGVidWcgfHwgdW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19XTSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUkE6IHN1Y2Nlc3NcbiIpOworICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZW1pdF91bnNwaWxsKGZzX2luc3QgKmluc3QsIGZzX3JlZyBkc3QsIHVpbnQzMl90IHNwaWxsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpCit7CisgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIC8qIFRoZSBnZW43IGRlc2NyaXB0b3ItYmFzZWQgb2Zmc2V0IGlzIDEyIGJpdHMgb2YgSFdPUkQgdW5pdHMuICovCisgICAgICBib29sIGdlbjdfcmVhZCA9IGJydy0+Z2VuID49IDcgJiYgc3BpbGxfb2Zmc2V0IDwgKDEgPDwgMTIpICogUkVHX1NJWkU7CisKKyAgICAgIGZzX2luc3QgKnVuc3BpbGxfaW5zdCA9CisgICAgICAgICBuZXcobWVtX2N0eCkgZnNfaW5zdChnZW43X3JlYWQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBREVSX09QQ09ERV9HRU43X1NDUkFUQ0hfUkVBRCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0KTsKKyAgICAgIHVuc3BpbGxfaW5zdC0+b2Zmc2V0ID0gc3BpbGxfb2Zmc2V0OworICAgICAgdW5zcGlsbF9pbnN0LT5pciA9IGluc3QtPmlyOworICAgICAgdW5zcGlsbF9pbnN0LT5hbm5vdGF0aW9uID0gaW5zdC0+YW5ub3RhdGlvbjsKKworICAgICAgaWYgKCFnZW43X3JlYWQpIHsKKyAgICAgICAgIHVuc3BpbGxfaW5zdC0+YmFzZV9tcmYgPSAxNDsKKyAgICAgICAgIHVuc3BpbGxfaW5zdC0+bWxlbiA9IDE7IC8qIGhlYWRlciBjb250YWlucyBvZmZzZXQgKi8KKyAgICAgIH0KKyAgICAgIGluc3QtPmluc2VydF9iZWZvcmUodW5zcGlsbF9pbnN0KTsKKworICAgICAgZHN0LnJlZ19vZmZzZXQrKzsKKyAgICAgIHNwaWxsX29mZnNldCArPSBkaXNwYXRjaF93aWR0aCAqIHNpemVvZihmbG9hdCk7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmNob29zZV9zcGlsbF9yZWcoZmxvYXQqIHNwaWxsX2Nvc3RzLCBib29sKiBub19zcGlsbCkKK3sKKyAgIGZsb2F0IGxvb3Bfc2NhbGUgPSAxLjA7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dmlydHVhbF9ncmZfY291bnQ7IGkrKykgeworICAgICAgc3BpbGxfY29zdHNbaV0gPSAwLjA7CisgICAgICBub19zcGlsbFtpXSA9IGZhbHNlOworICAgfQorCisgICAvKiBDYWxjdWxhdGUgY29zdHMgZm9yIHNwaWxsaW5nIG5vZGVzLiAgQ2FsbCBpdCBhIGNvc3Qgb2YgMSBwZXIKKyAgICAqIHNwaWxsL3Vuc3BpbGwgd2UnbGwgaGF2ZSB0byBkbywgYW5kIGd1ZXNzIHRoYXQgdGhlIGluc2lkZXMgb2YKKyAgICAqIGxvb3BzIHJ1biAxMCB0aW1lcy4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKW5vZGU7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKwkgICAgc3BpbGxfY29zdHNbaW5zdC0+c3JjW2ldLnJlZ10gKz0gbG9vcF9zY2FsZTsKKworICAgICAgICAgICAgLyogUmVnaXN0ZXIgc3BpbGxpbmcgbG9naWMgYXNzdW1lcyBmdWxsLXdpZHRoIHJlZ2lzdGVyczsgc21lYXJlZAorICAgICAgICAgICAgICogcmVnaXN0ZXJzIGhhdmUgYSB3aWR0aCBvZiAxIHNvIGlmIHdlIHRyeSB0byBzcGlsbCB0aGVtIHdlJ2xsCisgICAgICAgICAgICAgKiBnZW5lcmF0ZSBpbnZhbGlkIGFzc2VtYmx5LiAgVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIGJlY2F1c2UKKyAgICAgICAgICAgICAqIHNtZWFyZWQgcmVnaXN0ZXJzIGFyZSBvbmx5IHVzZWQgYXMgc2hvcnQtdGVybSB0ZW1wb3JhcmllcyB3aGVuCisgICAgICAgICAgICAgKiBsb2FkaW5nIHB1bGwgY29uc3RhbnRzLCBzbyBzcGlsbGluZyB0aGVtIGlzIHVubGlrZWx5IHRvIHJlZHVjZQorICAgICAgICAgICAgICogcmVnaXN0ZXIgcHJlc3N1cmUgYW55aG93LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIWluc3QtPnNyY1tpXS5pc19jb250aWd1b3VzKCkpIHsKKyAgICAgICAgICAgICAgIG5vX3NwaWxsW2luc3QtPnNyY1tpXS5yZWddID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwkgfQorICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKSB7CisJIHNwaWxsX2Nvc3RzW2luc3QtPmRzdC5yZWddICs9IGluc3QtPnJlZ3Nfd3JpdHRlbiAqIGxvb3Bfc2NhbGU7CisKKyAgICAgICAgIGlmICghaW5zdC0+ZHN0LmlzX2NvbnRpZ3VvdXMoKSkgeworICAgICAgICAgICAgbm9fc3BpbGxbaW5zdC0+ZHN0LnJlZ10gPSB0cnVlOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworCisgICAgICBjYXNlIEJSV19PUENPREVfRE86CisJIGxvb3Bfc2NhbGUgKj0gMTA7CisJIGJyZWFrOworCisgICAgICBjYXNlIEJSV19PUENPREVfV0hJTEU6CisJIGxvb3Bfc2NhbGUgLz0gMTA7CisJIGJyZWFrOworCisgICAgICBjYXNlIFNIQURFUl9PUENPREVfR0VONF9TQ1JBVENIX1dSSVRFOgorCSBpZiAoaW5zdC0+c3JjWzBdLmZpbGUgPT0gR1JGKQorCSAgICBub19zcGlsbFtpbnN0LT5zcmNbMF0ucmVnXSA9IHRydWU7CisJIGJyZWFrOworCisgICAgICBjYXNlIFNIQURFUl9PUENPREVfR0VONF9TQ1JBVENIX1JFQUQ6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfR0VON19TQ1JBVENIX1JFQUQ6CisJIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpCisJICAgIG5vX3NwaWxsW2luc3QtPmRzdC5yZWddID0gdHJ1ZTsKKwkgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJIGJyZWFrOworICAgICAgfQorICAgfQorfQorCitpbnQKK2ZzX3Zpc2l0b3I6OmNob29zZV9zcGlsbF9yZWcoaWdyYXBoX3QmIGcpCit7CisgICBmbG9hdCBzcGlsbF9jb3N0c1t0aGlzLT52aXJ0dWFsX2dyZl9jb3VudF07CisgICBib29sIG5vX3NwaWxsW3RoaXMtPnZpcnR1YWxfZ3JmX2NvdW50XTsKKworICAgY2hvb3NlX3NwaWxsX3JlZyhzcGlsbF9jb3N0cywgbm9fc3BpbGwpOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50OyBpKyspIHsKKyAgICAgIGlmICghbm9fc3BpbGxbaV0pCisgICAgICAgICBnLnNldFNwaWxsQ29zdChpLCBzcGlsbF9jb3N0c1tpXSk7CisgICB9CisKKyAgIHJldHVybiBnLmdldEJlc3RTcGlsbE5vZGUoKTsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6c3BpbGxfcmVnKGludCBzcGlsbF9yZWcpCit7CisgICBpbnQgcmVnX3NpemUgPSBkaXNwYXRjaF93aWR0aCAqIHNpemVvZihmbG9hdCk7CisgICBpbnQgc2l6ZSA9IHZpcnR1YWxfZ3JmX3NpemVzW3NwaWxsX3JlZ107CisgICB1bnNpZ25lZCBpbnQgc3BpbGxfb2Zmc2V0ID0gYy0+bGFzdF9zY3JhdGNoOworICAgYXNzZXJ0KEFMSUdOKHNwaWxsX29mZnNldCwgMTYpID09IHNwaWxsX29mZnNldCk7IC8qIG93b3JkIHJlYWQvd3JpdGUgcmVxLiAqLworICAgaW50IHNwaWxsX2Jhc2VfbXJmID0gZGlzcGF0Y2hfd2lkdGggPiA4ID8gMTMgOiAxNDsKKworICAgLyogU3BpbGxzIG1heSB1c2UgTVJGcyAxMy0xNSBpbiB0aGUgU0lNRDE2IGNhc2UuICBPdXIgdGV4dHVyaW5nIGlzIGRvbmUKKyAgICAqIHVzaW5nIHVwIHRvIDExIE1SRnMgc3RhcnRpbmcgZnJvbSBlaXRoZXIgbTEgb3IgbTIsIGFuZCBmYiB3cml0ZXMgY2FuIHVzZQorICAgICogdXAgdG8gbTEzIChnZW42KyBzaW1kMTY6IDIgaGVhZGVyICsgOCBjb2xvciArIDIgc3JjMGFscGhhICsgMiBvbWFzaykgb3IKKyAgICAqIG0xNSAoZ2VuNC01IHNpbWQxNjogMiBoZWFkZXIgKyA4IGNvbG9yICsgMSBhYWRzICsgMiBzcmMgZGVwdGggKyAyIGRzdAorICAgICogZGVwdGgpLCBzdGFydGluZyBmcm9tIG0xLiAgSW4gc3VtbWFyeTogV2UgbWF5IG5vdCBiZSBhYmxlIHRvIHNwaWxsIGluCisgICAgKiBTSU1EMTYgbW9kZSwgYmVjYXVzZSB3ZSdkIHN0b21wIHRoZSBGQiB3cml0ZXMuCisgICAgKi8KKyAgIGlmICghc3BpbGxlZF9hbnlfcmVnaXN0ZXJzKSB7CisgICAgICBib29sIG1yZl91c2VkW0JSV19NQVhfTVJGXTsKKyAgICAgIGdldF91c2VkX21yZnMobXJmX3VzZWQpOworCisgICAgICBmb3IgKGludCBpID0gc3BpbGxfYmFzZV9tcmY7IGkgPCBCUldfTUFYX01SRjsgaSsrKSB7CisgICAgICAgICBpZiAobXJmX3VzZWRbaV0pIHsKKyAgICAgICAgICAgIGZhaWwoIlJlZ2lzdGVyIHNwaWxsaW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCBtJWQgdXNlZCIsIGkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3BpbGxlZF9hbnlfcmVnaXN0ZXJzID0gdHJ1ZTsKKyAgIH0KKworICAgYy0+bGFzdF9zY3JhdGNoICs9IHNpemUgKiByZWdfc2l6ZTsKKworICAgLyogR2VuZXJhdGUgc3BpbGwvdW5zcGlsbCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBvYmplY3RzIGJlaW5nCisgICAgKiBzcGlsbGVkLiAgUmlnaHQgbm93LCB3ZSBzcGlsbCBvciB1bnNwaWxsIHRoZSB3aG9sZSB0aGluZyB0byBhCisgICAgKiB2aXJ0dWFsIGdyZiBvZiB0aGUgc2FtZSBzaXplLiAgRm9yIG1vc3QgaW5zdHJ1Y3Rpb25zLCB0aG91Z2gsIHdlCisgICAgKiBjb3VsZCBqdXN0IHNwaWxsL3Vuc3BpbGwgdGhlIEdSRiBiZWluZyBhY2Nlc3NlZC4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKW5vZGU7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYgJiYKKwkgICAgIGluc3QtPnNyY1tpXS5yZWcgPT0gc3BpbGxfcmVnKSB7CisgICAgICAgICAgICBpbnQgcmVnc19yZWFkID0gaW5zdC0+cmVnc19yZWFkKHRoaXMsIGkpOworICAgICAgICAgICAgaW50IHN1YnNldF9zcGlsbF9vZmZzZXQgPSAoc3BpbGxfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19zaXplICogaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQpOworICAgICAgICAgICAgZnNfcmVnIHVuc3BpbGxfZHN0KEdSRiwgdmlydHVhbF9ncmZfYWxsb2MocmVnc19yZWFkKSk7CisKKyAgICAgICAgICAgIGluc3QtPnNyY1tpXS5yZWcgPSB1bnNwaWxsX2RzdC5yZWc7CisgICAgICAgICAgICBpbnN0LT5zcmNbaV0ucmVnX29mZnNldCA9IDA7CisKKyAgICAgICAgICAgIGVtaXRfdW5zcGlsbChpbnN0LCB1bnNwaWxsX2RzdCwgc3Vic2V0X3NwaWxsX29mZnNldCwgcmVnc19yZWFkKTsKKwkgfQorICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGICYmCisJICBpbnN0LT5kc3QucmVnID09IHNwaWxsX3JlZykgeworICAgICAgICAgaW50IHN1YnNldF9zcGlsbF9vZmZzZXQgPSAoc3BpbGxfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19zaXplICogaW5zdC0+ZHN0LnJlZ19vZmZzZXQpOworICAgICAgICAgZnNfcmVnIHNwaWxsX3NyYyhHUkYsIHZpcnR1YWxfZ3JmX2FsbG9jKGluc3QtPnJlZ3Nfd3JpdHRlbikpOworCisgICAgICAgICBpbnN0LT5kc3QucmVnID0gc3BpbGxfc3JjLnJlZzsKKyAgICAgICAgIGluc3QtPmRzdC5yZWdfb2Zmc2V0ID0gMDsKKworCSAvKiBJZiBvdXIgd3JpdGUgaXMgZ29pbmcgdG8gYWZmZWN0IGp1c3QgcGFydCBvZiB0aGUKKyAgICAgICAgICAqIGluc3QtPnJlZ3Nfd3JpdHRlbigpLCB0aGVuIHdlIG5lZWQgdG8gdW5zcGlsbCB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgICAqIHNpbmNlIHdlIHdyaXRlIGJhY2sgb3V0IGFsbCBvZiB0aGUgcmVnc193cml0dGVuKCkuCisJICAqLworCSBpZiAoaW5zdC0+cHJlZGljYXRlIHx8IGluc3QtPmZvcmNlX3VuY29tcHJlc3NlZCB8fAorICAgICAgICAgICAgIGluc3QtPmZvcmNlX3NlY2hhbGYgfHwgaW5zdC0+ZHN0LnN1YnJlZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIGVtaXRfdW5zcGlsbChpbnN0LCBzcGlsbF9zcmMsIHN1YnNldF9zcGlsbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+cmVnc193cml0dGVuKTsKKwkgfQorCisJIGZvciAoaW50IGNoYW4gPSAwOyBjaGFuIDwgaW5zdC0+cmVnc193cml0dGVuOyBjaGFuKyspIHsKKwkgICAgZnNfaW5zdCAqc3BpbGxfaW5zdCA9CisgICAgICAgICAgICAgICBuZXcobWVtX2N0eCkgZnNfaW5zdChTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19udWxsX2YsIHNwaWxsX3NyYyk7CisJICAgIHNwaWxsX3NyYy5yZWdfb2Zmc2V0Kys7CisJICAgIHNwaWxsX2luc3QtPm9mZnNldCA9IHN1YnNldF9zcGlsbF9vZmZzZXQgKyBjaGFuICogcmVnX3NpemU7CisJICAgIHNwaWxsX2luc3QtPmlyID0gaW5zdC0+aXI7CisJICAgIHNwaWxsX2luc3QtPmFubm90YXRpb24gPSBpbnN0LT5hbm5vdGF0aW9uOworCSAgICBzcGlsbF9pbnN0LT5tbGVuID0gMSArIGRpc3BhdGNoX3dpZHRoIC8gODsgLyogaGVhZGVyLCB2YWx1ZSAqLworCSAgICBzcGlsbF9pbnN0LT5iYXNlX21yZiA9IHNwaWxsX2Jhc2VfbXJmOworCSAgICBpbnN0LT5pbnNlcnRfYWZ0ZXIoc3BpbGxfaW5zdCk7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19yZWdpc3Rlcl9jb2FsZXNjZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3JlZ2lzdGVyX2NvYWxlc2NlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI2NzJmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19yZWdpc3Rlcl9jb2FsZXNjZS5jcHAKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKiogQGZpbGUgYnJ3X2ZzX3JlZ2lzdGVyX2NvYWxlc2NlLmNwcAorICoKKyAqIEltcGxlbWVudHMgcmVnaXN0ZXIgY29hbGVzY2luZzogQ2hlY2tzIGlmIHRoZSB0d28gcmVnaXN0ZXJzIGludm9sdmVkIGluIGEKKyAqIHJhdyBtb3ZlIGRvbid0IGludGVyZmVyZSwgaW4gd2hpY2ggY2FzZSB0aGV5IGNhbiBib3RoIGJlIHN0b3JlZCBpbiB0aGUgc2FtZQorICogcGxhY2UgYW5kIHRoZSBNT1YgcmVtb3ZlZC4KKyAqCisgKiBUbyBkbyB0aGlzLCBhbGwgdXNlcyBvZiB0aGUgc291cmNlIG9mIHRoZSBNT1YgaW4gdGhlIHNoYWRlciBhcmUgcmVwbGFjZWQKKyAqIHdpdGggdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBNT1YuIEZvciBleGFtcGxlOgorICoKKyAqIGFkZCB2Z3JmMzpGLCB2Z3JmMTpGLCB2Z3JmMjpGCisgKiBtb3YgdmdyZjQ6RiwgdmdyZjM6RgorICogbXVsIHZncmY1OkYsIHZncmY1OkYsIHZncmY0OkYKKyAqCisgKiBiZWNvbWVzCisgKgorICogYWRkIHZncmY0OkYsIHZncmYxOkYsIHZncmYyOkYKKyAqIG11bCB2Z3JmNTpGLCB2Z3JmNTpGLCB2Z3JmNDpGCisgKi8KKworI2luY2x1ZGUgImJyd19mcy5oIgorI2luY2x1ZGUgImJyd19mc19saXZlX3ZhcmlhYmxlcy5oIgorCitzdGF0aWMgYm9vbAoraXNfbm9wX21vdihjb25zdCBmc19pbnN0ICppbnN0KQoreworICAgaWYgKGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX01PVikgeworICAgICAgcmV0dXJuIGluc3QtPmRzdC5lcXVhbHMoaW5zdC0+c3JjWzBdKTsKKyAgIH0KKworICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbAoraXNfY29hbGVzY2VfY2FuZGlkYXRlKGNvbnN0IGZzX2luc3QgKmluc3QsIGNvbnN0IGludCAqdmlydHVhbF9ncmZfc2l6ZXMpCit7CisgICBpZiAoaW5zdC0+b3Bjb2RlICE9IEJSV19PUENPREVfTU9WIHx8CisgICAgICAgaW5zdC0+aXNfcGFydGlhbF93cml0ZSgpIHx8CisgICAgICAgaW5zdC0+c2F0dXJhdGUgfHwKKyAgICAgICBpbnN0LT5zcmNbMF0uZmlsZSAhPSBHUkYgfHwKKyAgICAgICBpbnN0LT5zcmNbMF0ubmVnYXRlIHx8CisgICAgICAgaW5zdC0+c3JjWzBdLmFicyB8fAorICAgICAgICFpbnN0LT5zcmNbMF0uaXNfY29udGlndW91cygpIHx8CisgICAgICAgaW5zdC0+ZHN0LmZpbGUgIT0gR1JGIHx8CisgICAgICAgaW5zdC0+ZHN0LnR5cGUgIT0gaW5zdC0+c3JjWzBdLnR5cGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgaWYgKHZpcnR1YWxfZ3JmX3NpemVzW2luc3QtPnNyY1swXS5yZWddID4KKyAgICAgICB2aXJ0dWFsX2dyZl9zaXplc1tpbnN0LT5kc3QucmVnXSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitjYW5fY29hbGVzY2VfdmFycyhicnc6OmZzX2xpdmVfdmFyaWFibGVzICpsaXZlX2ludGVydmFscywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBjb25zdCBmc19pbnN0ICppbnN0LAorICAgICAgICAgICAgICAgICAgaW50IHZhcl90bywgaW50IHZhcl9mcm9tKQoreworICAgaWYgKCFsaXZlX2ludGVydmFscy0+dmFyc19pbnRlcmZlcmUodmFyX2Zyb20sIHZhcl90bykpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgLyogV2Uga25vdyB0aGF0IHRoZSBsaXZlIHJhbmdlcyBvZiBBICh2YXJfZnJvbSkgYW5kIEIgKHZhcl90bykKKyAgICAqIGludGVyZmVyZSBiZWNhdXNlIG9mIHRoZSAtPnZhcnNfaW50ZXJmZXJlKCkgY2FsbCBhYm92ZS4gSWYgdGhlIGVuZAorICAgICogb2YgQidzIGxpdmUgcmFuZ2UgaXMgYWZ0ZXIgdGhlIGVuZCBvZiBBJ3MgcmFuZ2UsIHRoZW4gd2Uga25vdyB0d28KKyAgICAqIHRoaW5nczoKKyAgICAqICAtIHRoZSBzdGFydCBvZiBCJ3MgbGl2ZSByYW5nZSBtdXN0IGJlIGluIEEncyBsaXZlIHJhbmdlIChzaW5jZSB3ZQorICAgICogICAgYWxyZWFkeSBrbm93IHRoZSB0d28gcmFuZ2VzIGludGVyZmVyZSwgdGhpcyBpcyB0aGUgb25seSByZW1haW5pbmcKKyAgICAqICAgIHBvc3NpYmlsaXR5KQorICAgICogIC0gdGhlIGludGVyZmVyZW5jZSBpc24ndCBvZiB0aGUgZm9ybSB3ZSdyZSBsb29raW5nIGZvciAod2hlcmUgQiBpcworICAgICogICAgZW50aXJlbHkgaW5zaWRlIEEpCisgICAgKi8KKyAgIGlmIChsaXZlX2ludGVydmFscy0+ZW5kW3Zhcl90b10gPiBsaXZlX2ludGVydmFscy0+ZW5kW3Zhcl9mcm9tXSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaW50IHNjYW5faXAgPSAtMTsKKworICAgZm9yZWFjaF9saXN0KG4sIGluc3RydWN0aW9ucykgeworICAgICAgZnNfaW5zdCAqc2Nhbl9pbnN0ID0gKGZzX2luc3QgKiluOworICAgICAgc2Nhbl9pcCsrOworCisgICAgICBpZiAoc2Nhbl9pbnN0LT5pc19jb250cm9sX2Zsb3coKSkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKHNjYW5faXAgPD0gbGl2ZV9pbnRlcnZhbHMtPnN0YXJ0W3Zhcl90b10pCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKHNjYW5faXAgPiBsaXZlX2ludGVydmFscy0+ZW5kW3Zhcl90b10pCisgICAgICAgICBicmVhazsKKworICAgICAgaWYgKHNjYW5faW5zdC0+ZHN0LmVxdWFscyhpbnN0LT5kc3QpIHx8CisgICAgICAgICAgc2Nhbl9pbnN0LT5kc3QuZXF1YWxzKGluc3QtPnNyY1swXSkpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitib29sCitmc192aXNpdG9yOjpyZWdpc3Rlcl9jb2FsZXNjZSgpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpOworCisgICBpbnQgc3JjX3NpemUgPSAwOworICAgaW50IGNoYW5uZWxzX3JlbWFpbmluZyA9IDA7CisgICBpbnQgcmVnX2Zyb20gPSAtMSwgcmVnX3RvID0gLTE7CisgICBpbnQgcmVnX3RvX29mZnNldFtNQVhfU0FNUExFUl9NRVNTQUdFX1NJWkVdOworICAgZnNfaW5zdCAqbW92W01BWF9TQU1QTEVSX01FU1NBR0VfU0laRV07CisgICBpbnQgdmFyX3RvW01BWF9TQU1QTEVSX01FU1NBR0VfU0laRV07CisgICBpbnQgdmFyX2Zyb21bTUFYX1NBTVBMRVJfTUVTU0FHRV9TSVpFXTsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKW5vZGU7CisKKyAgICAgIGlmICghaXNfY29hbGVzY2VfY2FuZGlkYXRlKGluc3QsIHZpcnR1YWxfZ3JmX3NpemVzKSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoaXNfbm9wX21vdihpbnN0KSkgeworICAgICAgICAgaW5zdC0+b3Bjb2RlID0gQlJXX09QQ09ERV9OT1A7CisgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlZ19mcm9tICE9IGluc3QtPnNyY1swXS5yZWcpIHsKKyAgICAgICAgIHJlZ19mcm9tID0gaW5zdC0+c3JjWzBdLnJlZzsKKworICAgICAgICAgc3JjX3NpemUgPSB2aXJ0dWFsX2dyZl9zaXplc1tpbnN0LT5zcmNbMF0ucmVnXTsKKyAgICAgICAgIGFzc2VydChzcmNfc2l6ZSA8PSBNQVhfU0FNUExFUl9NRVNTQUdFX1NJWkUpOworCisgICAgICAgICBjaGFubmVsc19yZW1haW5pbmcgPSBzcmNfc2l6ZTsKKyAgICAgICAgIG1lbXNldChtb3YsIDAsIHNpemVvZihtb3YpKTsKKworICAgICAgICAgcmVnX3RvID0gaW5zdC0+ZHN0LnJlZzsKKyAgICAgIH0KKworICAgICAgaWYgKHJlZ190byAhPSBpbnN0LT5kc3QucmVnKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBpbnN0LT5zcmNbMF0ucmVnX29mZnNldDsKKyAgICAgIHJlZ190b19vZmZzZXRbb2Zmc2V0XSA9IGluc3QtPmRzdC5yZWdfb2Zmc2V0OworICAgICAgbW92W29mZnNldF0gPSBpbnN0OworICAgICAgY2hhbm5lbHNfcmVtYWluaW5nLS07CisKKyAgICAgIGlmIChjaGFubmVsc19yZW1haW5pbmcpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgYm9vbCBjYW5fY29hbGVzY2UgPSB0cnVlOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKSB7CisgICAgICAgICB2YXJfdG9baV0gPSBsaXZlX2ludGVydmFscy0+dmFyX2Zyb21fdmdyZltyZWdfdG9dICsgcmVnX3RvX29mZnNldFtpXTsKKyAgICAgICAgIHZhcl9mcm9tW2ldID0gbGl2ZV9pbnRlcnZhbHMtPnZhcl9mcm9tX3ZncmZbcmVnX2Zyb21dICsgaTsKKworICAgICAgICAgaWYgKCFjYW5fY29hbGVzY2VfdmFycyhsaXZlX2ludGVydmFscywgJmluc3RydWN0aW9ucywgaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3RvW2ldLCB2YXJfZnJvbVtpXSkpIHsKKyAgICAgICAgICAgIGNhbl9jb2FsZXNjZSA9IGZhbHNlOworICAgICAgICAgICAgcmVnX2Zyb20gPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIWNhbl9jb2FsZXNjZSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBwcm9ncmVzcyA9IHRydWU7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykgeworICAgICAgICAgaWYgKG1vdltpXSkgeworICAgICAgICAgICAgbW92W2ldLT5vcGNvZGUgPSBCUldfT1BDT0RFX05PUDsKKyAgICAgICAgICAgIG1vdltpXS0+Y29uZGl0aW9uYWxfbW9kID0gQlJXX0NPTkRJVElPTkFMX05PTkU7CisgICAgICAgICAgICBtb3ZbaV0tPmRzdCA9IHJlZ191bmRlZjsKKyAgICAgICAgICAgIG1vdltpXS0+c3JjWzBdID0gcmVnX3VuZGVmOworICAgICAgICAgICAgbW92W2ldLT5zcmNbMV0gPSByZWdfdW5kZWY7CisgICAgICAgICAgICBtb3ZbaV0tPnNyY1syXSA9IHJlZ191bmRlZjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgIGZzX2luc3QgKnNjYW5faW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobW92W2ldKSB7CisgICAgICAgICAgICAgICBpZiAoc2Nhbl9pbnN0LT5kc3QuZmlsZSA9PSBHUkYgJiYKKyAgICAgICAgICAgICAgICAgICBzY2FuX2luc3QtPmRzdC5yZWcgPT0gcmVnX2Zyb20gJiYKKyAgICAgICAgICAgICAgICAgICBzY2FuX2luc3QtPmRzdC5yZWdfb2Zmc2V0ID09IGkpIHsKKyAgICAgICAgICAgICAgICAgIHNjYW5faW5zdC0+ZHN0LnJlZyA9IHJlZ190bzsKKyAgICAgICAgICAgICAgICAgIHNjYW5faW5zdC0+ZHN0LnJlZ19vZmZzZXQgPSByZWdfdG9fb2Zmc2V0W2ldOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgIGlmIChzY2FuX2luc3QtPnNyY1tqXS5maWxlID09IEdSRiAmJgorICAgICAgICAgICAgICAgICAgICAgIHNjYW5faW5zdC0+c3JjW2pdLnJlZyA9PSByZWdfZnJvbSAmJgorICAgICAgICAgICAgICAgICAgICAgIHNjYW5faW5zdC0+c3JjW2pdLnJlZ19vZmZzZXQgPT0gaSkgeworICAgICAgICAgICAgICAgICAgICAgc2Nhbl9pbnN0LT5zcmNbal0ucmVnID0gcmVnX3RvOworICAgICAgICAgICAgICAgICAgICAgc2Nhbl9pbnN0LT5zcmNbal0ucmVnX29mZnNldCA9IHJlZ190b19vZmZzZXRbaV07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykgeworICAgICAgICAgbGl2ZV9pbnRlcnZhbHMtPnN0YXJ0W3Zhcl90b1tpXV0gPQorICAgICAgICAgICAgTUlOMihsaXZlX2ludGVydmFscy0+c3RhcnRbdmFyX3RvW2ldXSwKKyAgICAgICAgICAgICAgICAgbGl2ZV9pbnRlcnZhbHMtPnN0YXJ0W3Zhcl9mcm9tW2ldXSk7CisgICAgICAgICBsaXZlX2ludGVydmFscy0+ZW5kW3Zhcl90b1tpXV0gPQorICAgICAgICAgICAgTUFYMihsaXZlX2ludGVydmFscy0+ZW5kW3Zhcl90b1tpXV0sCisgICAgICAgICAgICAgICAgIGxpdmVfaW50ZXJ2YWxzLT5lbmRbdmFyX2Zyb21baV1dKTsKKyAgICAgIH0KKyAgICAgIHJlZ19mcm9tID0gLTE7CisgICB9CisKKyAgIGlmIChwcm9ncmVzcykgeworICAgICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbm9kZTsKKworICAgICAgICAgaWYgKGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX05PUCkgeworICAgICAgICAgICAgaW5zdC0+cmVtb3ZlKCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKyAgIH0KKworICAgcmV0dXJuIHByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19zYXR1cmF0ZV9wcm9wYWdhdGlvbi5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3NhdHVyYXRlX3Byb3BhZ2F0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU2Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19zYXR1cmF0ZV9wcm9wYWdhdGlvbi5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYnJ3X2ZzLmgiCisjaW5jbHVkZSAiYnJ3X2ZzX2xpdmVfdmFyaWFibGVzLmgiCisjaW5jbHVkZSAiYnJ3X2NmZy5oIgorCisvKiogQGZpbGUgYnJ3X2ZzX3NhdHVyYXRlX3Byb3BhZ2F0aW9uLmNwcAorICovCisKK3N0YXRpYyBib29sCitvcHRfc2F0dXJhdGVfcHJvcGFnYXRpb25fbG9jYWwoZnNfdmlzaXRvciAqdiwgYmJsb2NrX3QgKmJsb2NrKQoreworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworICAgaW50IGlwID0gYmxvY2stPnN0YXJ0X2lwIC0gMTsKKworICAgZm9yIChmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilibG9jay0+c3RhcnQ7CisgICAgICAgIGluc3QgIT0gYmxvY2stPmVuZC0+bmV4dDsKKyAgICAgICAgaW5zdCA9IChmc19pbnN0ICopIGluc3QtPm5leHQpIHsKKyAgICAgIGlwKys7CisKKyAgICAgIGlmIChpbnN0LT5vcGNvZGUgIT0gQlJXX09QQ09ERV9NT1YgfHwKKyAgICAgICAgICBpbnN0LT5kc3QuZmlsZSAhPSBHUkYgfHwKKyAgICAgICAgICBpbnN0LT5zcmNbMF0uZmlsZSAhPSBHUkYgfHwKKyAgICAgICAgICBpbnN0LT5zcmNbMF0uYWJzIHx8CisgICAgICAgICAgaW5zdC0+c3JjWzBdLm5lZ2F0ZSB8fAorICAgICAgICAgICFpbnN0LT5zYXR1cmF0ZSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpbnQgc3JjX3ZhciA9IHYtPmxpdmVfaW50ZXJ2YWxzLT52YXJfZnJvbV9yZWcoJmluc3QtPnNyY1swXSk7CisgICAgICBpbnQgc3JjX2VuZF9pcCA9IHYtPmxpdmVfaW50ZXJ2YWxzLT5lbmRbc3JjX3Zhcl07CisgICAgICBpZiAoc3JjX2VuZF9pcCA+IGlwICYmICFpbnN0LT5kc3QuZXF1YWxzKGluc3QtPnNyY1swXSkpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgaW50IHNjYW5faXAgPSBpcDsKKyAgICAgIGJvb2wgaW50ZXJmZXJlZCA9IGZhbHNlOworICAgICAgZm9yIChmc19pbnN0ICpzY2FuX2luc3QgPSAoZnNfaW5zdCAqKSBpbnN0LT5wcmV2OworICAgICAgICAgICBzY2FuX2luc3QgIT0gYmxvY2stPnN0YXJ0LT5wcmV2OworICAgICAgICAgICBzY2FuX2luc3QgPSAoZnNfaW5zdCAqKSBzY2FuX2luc3QtPnByZXYpIHsKKyAgICAgICAgIHNjYW5faXAtLTsKKworICAgICAgICAgaWYgKHNjYW5faW5zdC0+ZHN0LmZpbGUgPT0gR1JGICYmCisgICAgICAgICAgICAgc2Nhbl9pbnN0LT5kc3QucmVnID09IGluc3QtPnNyY1swXS5yZWcgJiYKKyAgICAgICAgICAgICBzY2FuX2luc3QtPmRzdC5yZWdfb2Zmc2V0ID09IGluc3QtPnNyY1swXS5yZWdfb2Zmc2V0ICYmCisgICAgICAgICAgICAgIXNjYW5faW5zdC0+aXNfcGFydGlhbF93cml0ZSgpKSB7CisgICAgICAgICAgICBpZiAoc2Nhbl9pbnN0LT5jYW5fZG9fc2F0dXJhdGUoKSkgeworICAgICAgICAgICAgICAgc2Nhbl9pbnN0LT5zYXR1cmF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICBpbnN0LT5zYXR1cmF0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNjYW5faW5zdC0+c3JjW2ldLmZpbGUgPT0gR1JGICYmCisgICAgICAgICAgICAgICAgc2Nhbl9pbnN0LT5zcmNbaV0ucmVnID09IGluc3QtPnNyY1swXS5yZWcgJiYKKyAgICAgICAgICAgICAgICBzY2FuX2luc3QtPnNyY1tpXS5yZWdfb2Zmc2V0ID09IGluc3QtPnNyY1swXS5yZWdfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICBpbnRlcmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBpZiAoaW50ZXJmZXJlZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK2Jvb2wKK2ZzX3Zpc2l0b3I6Om9wdF9zYXR1cmF0ZV9wcm9wYWdhdGlvbigpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpOworCisgICBjZmdfdCBjZmcoJmluc3RydWN0aW9ucyk7CisKKyAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLm51bV9ibG9ja3M7IGIrKykgeworICAgICAgcHJvZ3Jlc3MgPSBvcHRfc2F0dXJhdGVfcHJvcGFnYXRpb25fbG9jYWwodGhpcywgY2ZnLmJsb2Nrc1tiXSkKKyAgICAgICAgICAgICAgICAgfHwgcHJvZ3Jlc3M7CisgICB9CisKKyAgIGlmIChwcm9ncmVzcykKKyAgICAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKworICAgcmV0dXJuIHByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19zZWxfcGVlcGhvbGUuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19mc19zZWxfcGVlcGhvbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMGJlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3NlbF9wZWVwaG9sZS5jcHAKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYnJ3X2ZzLmgiCisjaW5jbHVkZSAiYnJ3X2NmZy5oIgorCisvKiogQGZpbGUgYnJ3X2ZzX3NlbF9wZWVwaG9sZS5jcHAKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG9wdF9wZWVwaG9sZV9zZWwoKSBvcHRpbWl6YXRpb24gcGFzcyB0aGF0IHJlcGxhY2VzCisgKiBNT1YgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIGluIHRoZSAidGhlbiIgYW5kICJlbHNlIiBib2RpZXMgb2YKKyAqIGFuIGlmIHN0YXRlbWVudCB3aXRoIFNFTCBpbnN0cnVjdGlvbnMuCisgKi8KKworLyogRm91ciBNT1ZzIHNlZW1zIHRvIGJlIHByZXR0eSB0eXBpY2FsLCBzbyBJIHBpY2tlZCB0aGUgbmV4dCBwb3dlciBvZiB0d28gaW4KKyAqIHRoZSBob3BlcyB0aGF0IGl0IHdvdWxkIGhhbmRsZSBhbG1vc3QgYW55dGhpbmcgcG9zc2libGUgaW4gYSBzaW5nbGUKKyAqIHBhc3MuCisgKi8KKyNkZWZpbmUgTUFYX01PVlMgOCAvKio8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBNT1ZzIHRvIGF0dGVtcHQgdG8gbWF0Y2guICovCisKKy8qKgorICogU2NhbnMgZm9yd2FyZHMgZnJvbSBhbiBJRiBjb3VudGluZyBjb25zZWN1dGl2ZSBNT1YgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICogInRoZW4iIGFuZCAiZWxzZSIgYmxvY2tzIG9mIHRoZSBpZiBzdGF0ZW1lbnQuCisgKgorICogQSBwb2ludGVyIHRvIHRoZSBmc19pbnN0KiBmb3IgSUYgaXMgcGFzc2VkIGFzIHRoZSA8aWZfaW5zdD4gYXJndW1lbnQuIFRoZQorICogZnVuY3Rpb24gc3RvcmVzIHBvaW50ZXJzIHRvIHRoZSBNT1YgaW5zdHJ1Y3Rpb25zIGluIHRoZSA8dGhlbl9tb3Y+IGFuZAorICogPGVsc2VfbW92PiBhcnJheXMuCisgKgorICogXHJldHVybiB0aGUgbWluaW11bSBudW1iZXIgb2YgTU9WcyBmb3VuZCBpbiB0aGUgdHdvIGJyYW5jaGVzIG9yIHplcm8gaWYKKyAqICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQuCisgKgorICogRS5nLjoKKyAqICAgICAgICAgICAgICAgICAgSUYgLi4uCisgKiAgICB0aGVuX21vdlswXSA9IE1PViBnNCwgLi4uCisgKiAgICB0aGVuX21vdlsxXSA9IE1PViBnNSwgLi4uCisgKiAgICB0aGVuX21vdlsyXSA9IE1PViBnNiwgLi4uCisgKiAgICAgICAgICAgICAgICAgIEVMU0UgLi4uCisgKiAgICBlbHNlX21vdlswXSA9IE1PViBnNCwgLi4uCisgKiAgICBlbHNlX21vdlsxXSA9IE1PViBnNSwgLi4uCisgKiAgICBlbHNlX21vdlsyXSA9IE1PViBnNywgLi4uCisgKiAgICAgICAgICAgICAgICAgIEVORElGCisgKiAgICByZXR1cm5zIDMuCisgKi8KK3N0YXRpYyBpbnQKK2NvdW50X21vdnNfZnJvbV9pZihmc19pbnN0ICp0aGVuX21vdltNQVhfTU9WU10sIGZzX2luc3QgKmVsc2VfbW92W01BWF9NT1ZTXSwKKyAgICAgICAgICAgICAgICAgICBmc19pbnN0ICppZl9pbnN0LCBmc19pbnN0ICplbHNlX2luc3QpCit7CisgICBmc19pbnN0ICptID0gaWZfaW5zdDsKKworICAgYXNzZXJ0KG0tPm9wY29kZSA9PSBCUldfT1BDT0RFX0lGKTsKKyAgIG0gPSAoZnNfaW5zdCAqKSBtLT5uZXh0OworCisgICBpbnQgdGhlbl9tb3ZzID0gMDsKKyAgIHdoaWxlICh0aGVuX21vdnMgPCBNQVhfTU9WUyAmJiBtLT5vcGNvZGUgPT0gQlJXX09QQ09ERV9NT1YpIHsKKyAgICAgIHRoZW5fbW92W3RoZW5fbW92c10gPSBtOworICAgICAgbSA9IChmc19pbnN0ICopIG0tPm5leHQ7CisgICAgICB0aGVuX21vdnMrKzsKKyAgIH0KKworICAgbSA9IChmc19pbnN0ICopIGVsc2VfaW5zdC0+bmV4dDsKKworICAgaW50IGVsc2VfbW92cyA9IDA7CisgICB3aGlsZSAoZWxzZV9tb3ZzIDwgTUFYX01PVlMgJiYgbS0+b3Bjb2RlID09IEJSV19PUENPREVfTU9WKSB7CisgICAgICBlbHNlX21vdltlbHNlX21vdnNdID0gbTsKKyAgICAgIG0gPSAoZnNfaW5zdCAqKSBtLT5uZXh0OworICAgICAgZWxzZV9tb3ZzKys7CisgICB9CisKKyAgIHJldHVybiBNSU4yKHRoZW5fbW92cywgZWxzZV9tb3ZzKTsKK30KKworLyoqCisgKiBUcnkgdG8gcmVwbGFjZSBJRi9NT1YrL0VMU0UvTU9WKy9FTkRJRiB3aXRoIFNFTC4KKyAqCisgKiBNYW55IEdMU0wgc2hhZGVycyBjb250YWluIHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKKyAqCisgKiAgICB4ID0gY29uZGl0aW9uID8gZm9vIDogYmFyCisgKgorICogb3IKKyAqCisgKiAgICBpZiAoLi4uKSBhLnh5encgPSBmb28ueHl6dzsKKyAqICAgIGVsc2UgICAgIGEueHl6dyA9IGJhci54eXp3OworICoKKyAqIFRoZSBjb21waWxlciBlbWl0cyBhbiBpcl9pZiB0cmVlIGZvciB0aGlzLCBzaW5jZSBlYWNoIHN1YmV4cHJlc3Npb24gbWlnaHQgYmUKKyAqIGEgY29tcGxleCB0cmVlIHRoYXQgY291bGQgaGF2ZSBzaWRlLWVmZmVjdHMgb3Igc2hvcnQtY2lyY3VpdCBsb2dpYy4KKyAqCisgKiBIb3dldmVyLCB0aGUgY29tbW9uIGNhc2UgaXMgdG8gc2ltcGx5IHNlbGVjdCBvbmUgb2YgdHdvIGNvbnN0YW50cyBvcgorICogdmFyaWFibGUgdmFsdWVzLS0td2hpY2ggaXMgZXhhY3RseSB3aGF0IFNFTCBpcyBmb3IuICBJbiB0aGlzIGNhc2UsIHRoZQorICogYXNzZW1ibHkgbG9va3MgbGlrZToKKyAqCisgKiAgICAoK2YwKSBJRgorICogICAgTU9WIGRzdCBzcmMwCisgKiAgICAuLi4KKyAqICAgIEVMU0UKKyAqICAgIE1PViBkc3Qgc3JjMQorICogICAgLi4uCisgKiAgICBFTkRJRgorICoKKyAqIHdoZXJlIGVhY2ggcGFpciBvZiBNT1ZzIHRvIGEgY29tbW9uIGRlc3RpbmF0aW9uIGFuZCBjYW4gYmUgZWFzaWx5IHRyYW5zbGF0ZWQKKyAqIGludG8KKyAqCisgKiAgICAoK2YwKSBTRUwgZHN0IHNyYzAgc3JjMQorICoKKyAqIElmIHNyYzAgaXMgYW4gaW1tZWRpYXRlIHZhbHVlLCB3ZSBwcm9tb3RlIGl0IHRvIGEgdGVtcG9yYXJ5IEdSRi4KKyAqLworYm9vbAorZnNfdmlzaXRvcjo6b3B0X3BlZXBob2xlX3NlbCgpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGNmZ190IGNmZygmaW5zdHJ1Y3Rpb25zKTsKKworICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjZmcubnVtX2Jsb2NrczsgYisrKSB7CisgICAgICBiYmxvY2tfdCAqYmxvY2sgPSBjZmcuYmxvY2tzW2JdOworCisgICAgICAvKiBJRiBpbnN0cnVjdGlvbnMsIGJ5IGRlZmluaXRpb24sIGNhbiBvbmx5IGJlIGZvdW5kIGF0IHRoZSBlbmRzIG9mCisgICAgICAgKiBiYXNpYyBibG9ja3MuCisgICAgICAgKi8KKyAgICAgIGZzX2luc3QgKmlmX2luc3QgPSAoZnNfaW5zdCAqKSBibG9jay0+ZW5kOworICAgICAgaWYgKGlmX2luc3QtPm9wY29kZSAhPSBCUldfT1BDT0RFX0lGKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICghYmxvY2stPmVsc2VfaW5zdCkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmc19pbnN0ICplbHNlX2luc3QgPSAoZnNfaW5zdCAqKSBibG9jay0+ZWxzZV9pbnN0OworICAgICAgYXNzZXJ0KGVsc2VfaW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfRUxTRSk7CisKKyAgICAgIGZzX2luc3QgKmVsc2VfbW92W01BWF9NT1ZTXSA9IHsgTlVMTCB9OworICAgICAgZnNfaW5zdCAqdGhlbl9tb3ZbTUFYX01PVlNdID0geyBOVUxMIH07CisKKyAgICAgIGludCBtb3ZzID0gY291bnRfbW92c19mcm9tX2lmKHRoZW5fbW92LCBlbHNlX21vdiwgaWZfaW5zdCwgZWxzZV9pbnN0KTsKKworICAgICAgaWYgKG1vdnMgPT0gMCkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmc19pbnN0ICpzZWxfaW5zdFtNQVhfTU9WU10gPSB7IE5VTEwgfTsKKyAgICAgIGZzX2luc3QgKm1vdl9pbW1faW5zdFtNQVhfTU9WU10gPSB7IE5VTEwgfTsKKworICAgICAgLyogR2VuZXJhdGUgU0VMIGluc3RydWN0aW9ucyBmb3IgcGFpcnMgb2YgTU9WcyB0byBhIGNvbW1vbiBkZXN0aW5hdGlvbi4gKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW92czsgaSsrKSB7CisgICAgICAgICBpZiAoIXRoZW5fbW92W2ldIHx8ICFlbHNlX21vdltpXSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBNT1ZzIGFyZSB0aGUgcmlnaHQgZm9ybS4gKi8KKyAgICAgICAgIGlmICghdGhlbl9tb3ZbaV0tPmRzdC5lcXVhbHMoZWxzZV9tb3ZbaV0tPmRzdCkgfHwKKyAgICAgICAgICAgICB0aGVuX21vdltpXS0+aXNfcGFydGlhbF93cml0ZSgpIHx8CisgICAgICAgICAgICAgZWxzZV9tb3ZbaV0tPmlzX3BhcnRpYWxfd3JpdGUoKSkgeworICAgICAgICAgICAgbW92cyA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogQ2hlY2sgdGhhdCBzb3VyY2UgdHlwZXMgZm9yIG1vdiBvcGVyYXRpb25zIG1hdGNoLiAqLworICAgICAgICAgaWYgKHRoZW5fbW92W2ldLT5zcmNbMF0udHlwZSAhPSBlbHNlX21vdltpXS0+c3JjWzBdLnR5cGUpIHsKKyAgICAgICAgICAgIG1vdnMgPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICghdGhlbl9tb3ZbaV0tPnNyY1swXS5lcXVhbHMoZWxzZV9tb3ZbaV0tPnNyY1swXSkpIHsKKyAgICAgICAgICAgIC8qIE9ubHkgdGhlIGxhc3Qgc291cmNlIHJlZ2lzdGVyIGNhbiBiZSBhIGNvbnN0YW50LCBzbyBpZiB0aGUgTU9WCisgICAgICAgICAgICAgKiBpbiB0aGUgInRoZW4iIGNsYXVzZSB1c2VzIGEgY29uc3RhbnQsIHdlIG5lZWQgdG8gcHV0IGl0IGluIGEKKyAgICAgICAgICAgICAqIHRlbXBvcmFyeS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZnNfcmVnIHNyYzAodGhlbl9tb3ZbaV0tPnNyY1swXSk7CisgICAgICAgICAgICBpZiAoc3JjMC5maWxlID09IElNTSkgeworICAgICAgICAgICAgICAgc3JjMCA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworICAgICAgICAgICAgICAgc3JjMC50eXBlID0gdGhlbl9tb3ZbaV0tPnNyY1swXS50eXBlOworICAgICAgICAgICAgICAgbW92X2ltbV9pbnN0W2ldID0gTU9WKHNyYzAsIHRoZW5fbW92W2ldLT5zcmNbMF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZWxfaW5zdFtpXSA9IFNFTCh0aGVuX21vdltpXS0+ZHN0LCBzcmMwLCBlbHNlX21vdltpXS0+c3JjWzBdKTsKKworICAgICAgICAgICAgaWYgKGJydy0+Z2VuID09IDYgJiYgaWZfaW5zdC0+Y29uZGl0aW9uYWxfbW9kKSB7CisgICAgICAgICAgICAgICAvKiBGb3IgU2FuZHlicmlkZ2Ugd2l0aCBJRiB3aXRoIGVtYmVkZGVkIGNvbXBhcmlzb24gKi8KKyAgICAgICAgICAgICAgIHNlbF9pbnN0W2ldLT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAvKiBTZXBhcmF0ZSBDTVAgYW5kIElGIGluc3RydWN0aW9ucyAqLworICAgICAgICAgICAgICAgc2VsX2luc3RbaV0tPnByZWRpY2F0ZSA9IGlmX2luc3QtPnByZWRpY2F0ZTsKKyAgICAgICAgICAgICAgIHNlbF9pbnN0W2ldLT5wcmVkaWNhdGVfaW52ZXJzZSA9IGlmX2luc3QtPnByZWRpY2F0ZV9pbnZlcnNlOworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbF9pbnN0W2ldID0gTU9WKHRoZW5fbW92W2ldLT5kc3QsIHRoZW5fbW92W2ldLT5zcmNbMF0pOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobW92cyA9PSAwKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIC8qIEVtaXQgYSBDTVAgaWYgb3VyIElGIHVzZWQgdGhlIGVtYmVkZGVkIGNvbXBhcmlzb24gKi8KKyAgICAgIGlmIChicnctPmdlbiA9PSA2ICYmIGlmX2luc3QtPmNvbmRpdGlvbmFsX21vZCkgeworICAgICAgICAgZnNfaW5zdCAqY21wX2luc3QgPSBDTVAocmVnX251bGxfZCwgaWZfaW5zdC0+c3JjWzBdLCBpZl9pbnN0LT5zcmNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9pbnN0LT5jb25kaXRpb25hbF9tb2QpOworICAgICAgICAgaWZfaW5zdC0+aW5zZXJ0X2JlZm9yZShjbXBfaW5zdCk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW92czsgaSsrKSB7CisgICAgICAgICBpZiAobW92X2ltbV9pbnN0W2ldKQorICAgICAgICAgICAgaWZfaW5zdC0+aW5zZXJ0X2JlZm9yZShtb3ZfaW1tX2luc3RbaV0pOworICAgICAgICAgaWZfaW5zdC0+aW5zZXJ0X2JlZm9yZShzZWxfaW5zdFtpXSk7CisKKyAgICAgICAgIHRoZW5fbW92W2ldLT5yZW1vdmUoKTsKKyAgICAgICAgIGVsc2VfbW92W2ldLT5yZW1vdmUoKTsKKyAgICAgIH0KKworICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgfQorCisgICBpZiAocHJvZ3Jlc3MpCisgICAgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfdmVjdG9yX3NwbGl0dGluZy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3ZlY3Rvcl9zcGxpdHRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjdmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3ZlY3Rvcl9zcGxpdHRpbmcuY3BwCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBicndfd21fdmVjdG9yX3NwbGl0dGluZy5jcHAKKyAqCisgKiBJZiBhIHZlY3RvciBpcyBvbmx5IGV2ZXIgcmVmZXJlbmNlZCBieSBpdHMgY29tcG9uZW50cywgdGhlbgorICogc3BsaXQgdGhvc2UgY29tcG9uZW50cyBvdXQgdG8gaW5kaXZpZHVhbCB2YXJpYWJsZXMgc28gdGhleSBjYW4gYmUKKyAqIGhhbmRsZWQgbm9ybWFsbHkgYnkgb3RoZXIgb3B0aW1pemF0aW9uIHBhc3Nlcy4KKyAqCisgKiBUaGlzIHNraXBzIHZlY3RvcnMgaW4gdW5pZm9ybXMgYW5kIHZhcnlpbmdzLCB3aGljaCBuZWVkIHRvIGJlCisgKiBhY2Nlc3NpYmxlIGFzIHZlY3RvcnMgZm9yIHRoZWlyIGFjY2VzcyBieSB0aGUgR0wuICBBbHNvLCB2ZWN0b3IKKyAqIHJlc3VsdHMgb2Ygbm9uLXZhcmlhYmxlLWRlcmVmcyBpbiBhc3NpZ25tZW50cyBhcmVuJ3QgaGFuZGxlZAorICogYmVjYXVzZSB0byBkbyBzbyB3ZSB3b3VsZCBoYXZlIHRvIHN0b3JlIHRoZSB2ZWN0b3IgcmVzdWx0IHRvIGEKKyAqIHRlbXBvcmFyeSBpbiBvcmRlciB0byB1bmxvYWQgZWFjaCBjaGFubmVsLCBhbmQgdG8gZG8gc28gd291bGQganVzdAorICogbG9vcCB1cyBiYWNrIHRvIHdoZXJlIHdlIHN0YXJ0ZWQuICBGb3IgdGhlIDk2NSwgdGhpcyBpcyBleGFjdGx5IHRoZQorICogYmVoYXZpb3Igd2Ugd2FudCBmb3IgdGhlIHJlc3VsdHMgb2YgdGV4dHVyZSBsb29rdXBzLCBidXQgcHJvYmFibHkgbm90IGZvcgorICovCisKK2V4dGVybiAiQyIgeworLy8jaW5jbHVkZSAibWFpbi9jb3JlLmgiIC8vIEx1bmFyRyA6IFJlbW92ZWQKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorfQorI2luY2x1ZGUgImdsc2wvaXIuaCIKKyNpbmNsdWRlICJnbHNsL2lyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJnbHNsL2lyX3J2YWx1ZV92aXNpdG9yLmgiCisjaW5jbHVkZSAiZ2xzbC9nbHNsX3R5cGVzLmgiCisKK3N0YXRpYyBib29sIGRlYnVnID0gZmFsc2U7CisKK2NsYXNzIHZhcmlhYmxlX2VudHJ5IDogcHVibGljIGV4ZWNfbm9kZQoreworcHVibGljOgorICAgdmFyaWFibGVfZW50cnkoaXJfdmFyaWFibGUgKnZhcikKKyAgIHsKKyAgICAgIHRoaXMtPnZhciA9IHZhcjsKKyAgICAgIHRoaXMtPndob2xlX3ZlY3Rvcl9hY2Nlc3MgPSAwOworICAgICAgdGhpcy0+bWVtX2N0eCA9IE5VTEw7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICp2YXI7IC8qIFRoZSBrZXk6IHRoZSB2YXJpYWJsZSdzIHBvaW50ZXIuICovCisKKyAgIC8qKiBOdW1iZXIgb2YgdGltZXMgdGhlIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQsIGluY2x1ZGluZyBhc3NpZ25tZW50cy4gKi8KKyAgIHVuc2lnbmVkIHdob2xlX3ZlY3Rvcl9hY2Nlc3M7CisKKyAgIGlyX3ZhcmlhYmxlICpjb21wb25lbnRzWzRdOworCisgICAvKiogcmFsbG9jX3BhcmVudCh0aGlzLT52YXIpIC0tIHRoZSBzaGFkZXIncyByYWxsb2MgY29udGV4dC4gKi8KKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCitjbGFzcyBpcl92ZWN0b3JfcmVmZXJlbmNlX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfdmVjdG9yX3JlZmVyZW5jZV92aXNpdG9yKHZvaWQpCisgICB7CisgICAgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICAgICB0aGlzLT52YXJpYWJsZV9saXN0Lm1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgfmlyX3ZlY3Rvcl9yZWZlcmVuY2VfdmlzaXRvcih2b2lkKQorICAgeworICAgICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfdmFyaWFibGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9zd2l6emxlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKik7CisKKyAgIHZhcmlhYmxlX2VudHJ5ICpnZXRfdmFyaWFibGVfZW50cnkoaXJfdmFyaWFibGUgKnZhcik7CisKKyAgIC8qIExpc3Qgb2YgdmFyaWFibGVfZW50cnkgKi8KKyAgIGV4ZWNfbGlzdCB2YXJpYWJsZV9saXN0OworCisgICB2b2lkICptZW1fY3R4OworfTsKKwordmFyaWFibGVfZW50cnkgKgoraXJfdmVjdG9yX3JlZmVyZW5jZV92aXNpdG9yOjpnZXRfdmFyaWFibGVfZW50cnkoaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGFzc2VydCh2YXIpOworCisgICBpZiAoIXZhci0+dHlwZS0+aXNfdmVjdG9yKCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgc3dpdGNoICh2YXItPmRhdGEubW9kZSkgeworICAgY2FzZSBpcl92YXJfdW5pZm9ybToKKyAgIGNhc2UgaXJfdmFyX3NoYWRlcl9pbjoKKyAgIGNhc2UgaXJfdmFyX3NoYWRlcl9vdXQ6CisgICBjYXNlIGlyX3Zhcl9zeXN0ZW1fdmFsdWU6CisgICBjYXNlIGlyX3Zhcl9mdW5jdGlvbl9pbjoKKyAgIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX291dDoKKyAgIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX2lub3V0OgorICAgICAgLyogQ2FuJ3Qgc3BsaXQgdmFyeWluZ3Mgb3IgdW5pZm9ybXMuICBGdW5jdGlvbiBpbi9vdXRzIHdvbid0IGdldCBzcGxpdAorICAgICAgICogZWl0aGVyLgorICAgICAgICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgIGNhc2UgaXJfdmFyX2F1dG86CisgICBjYXNlIGlyX3Zhcl90ZW1wb3Jhcnk6CisgICAgICBicmVhazsKKyAgIH0KKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT52YXJpYWJsZV9saXN0KSB7CisgICAgICB2YXJpYWJsZV9lbnRyeSAqZW50cnkgPSAodmFyaWFibGVfZW50cnkgKilub2RlOworICAgICAgaWYgKGVudHJ5LT52YXIgPT0gdmFyKQorCSByZXR1cm4gZW50cnk7CisgICB9CisKKyAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9IG5ldyhtZW1fY3R4KSB2YXJpYWJsZV9lbnRyeSh2YXIpOworICAgdGhpcy0+dmFyaWFibGVfbGlzdC5wdXNoX3RhaWwoZW50cnkpOworICAgcmV0dXJuIGVudHJ5OworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWN0b3JfcmVmZXJlbmNlX3Zpc2l0b3I6OnZpc2l0KGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIC8qIE1ha2Ugc3VyZSBzcGxpdHRpbmcgbG9va3MgYXQgc3BsaXR0aW5nIHRoaXMgdmFyaWFibGUgKi8KKyAgICh2b2lkKXRoaXMtPmdldF92YXJpYWJsZV9lbnRyeShpcik7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY3Rvcl9yZWZlcmVuY2VfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQoreworICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IGlyLT52YXI7CisgICB2YXJpYWJsZV9lbnRyeSAqZW50cnkgPSB0aGlzLT5nZXRfdmFyaWFibGVfZW50cnkodmFyKTsKKworICAgaWYgKGVudHJ5KQorICAgICAgZW50cnktPndob2xlX3ZlY3Rvcl9hY2Nlc3MrKzsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjdG9yX3JlZmVyZW5jZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9zd2l6emxlICppcikKK3sKKyAgIC8qIERvbid0IGRlc2NlbmQgaW50byBhIHZlY3RvciBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSBiZWxvdy4gKi8KKyAgIGlmIChpci0+dmFsLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpICYmIGlyLT50eXBlLT5pc19zY2FsYXIoKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjdG9yX3JlZmVyZW5jZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGlmIChpci0+bGhzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpICYmCisgICAgICAgaXItPnJocy0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKSAmJgorICAgICAgICFpci0+Y29uZGl0aW9uKSB7CisgICAgICAvKiBXZSdsbCBzcGxpdCBjb3BpZXMgb2YgYSB2ZWN0b3IgdG8gY29waWVzIG9mIGNoYW5uZWxzLCBzbyBkb24ndAorICAgICAgICogZGVzY2VuZCB0byB0aGUgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGVzLgorICAgICAgICovCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7CisgICB9CisgICBpZiAoaXItPmxocy0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKSAmJgorICAgICAgIGlzX3Bvd2VyX29mX3R3byhpci0+d3JpdGVfbWFzaykgJiYKKyAgICAgICAhaXItPmNvbmRpdGlvbikgeworICAgICAgLyogSWYgd2UncmUgd3JpdGluZyBqdXN0IGEgY2hhbm5lbCwgdGhlbiBjaGFubmVsLXNwbGl0dGluZyB0aGUgTEhTIGlzIE9LLgorICAgICAgICovCisgICAgICBpci0+cmhzLT5hY2NlcHQodGhpcyk7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7CisgICB9CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWN0b3JfcmVmZXJlbmNlX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqaXIpCit7CisgICAvKiBXZSBkb24ndCB3YW50IHRvIGRlc2NlbmQgaW50byB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQKKyAgICAqIHNwbGl0IHRoZW0sIHNvIGp1c3QgYWNjZXB0IHRoZSBib2R5IGhlcmUuCisgICAgKi8KKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5ib2R5KTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworY2xhc3MgaXJfdmVjdG9yX3NwbGl0dGluZ192aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX3ZlY3Rvcl9zcGxpdHRpbmdfdmlzaXRvcihleGVjX2xpc3QgKnZhcnMpCisgICB7CisgICAgICB0aGlzLT52YXJpYWJsZV9saXN0ID0gdmFyczsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICopOworCisgICB2b2lkIGhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKTsKKyAgIHZhcmlhYmxlX2VudHJ5ICpnZXRfc3BsaXR0aW5nX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpOworCisgICBleGVjX2xpc3QgKnZhcmlhYmxlX2xpc3Q7Cit9OworCit2YXJpYWJsZV9lbnRyeSAqCitpcl92ZWN0b3Jfc3BsaXR0aW5nX3Zpc2l0b3I6OmdldF9zcGxpdHRpbmdfZW50cnkoaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGFzc2VydCh2YXIpOworCisgICBpZiAoIXZhci0+dHlwZS0+aXNfdmVjdG9yKCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsICYqdGhpcy0+dmFyaWFibGVfbGlzdCkgeworICAgICAgdmFyaWFibGVfZW50cnkgKmVudHJ5ID0gKHZhcmlhYmxlX2VudHJ5ICopbm9kZTsKKyAgICAgIGlmIChlbnRyeS0+dmFyID09IHZhcikgeworCSByZXR1cm4gZW50cnk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorCit2b2lkCitpcl92ZWN0b3Jfc3BsaXR0aW5nX3Zpc2l0b3I6OmhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKQoreworICAgaWYgKCEqcnZhbHVlKQorICAgICAgcmV0dXJuOworCisgICBpcl9zd2l6emxlICpzd2l6ID0gKCpydmFsdWUpLT5hc19zd2l6emxlKCk7CisgICBpZiAoIXN3aXogfHwgIXN3aXotPnR5cGUtPmlzX3NjYWxhcigpKQorICAgICAgcmV0dXJuOworCisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdmFyID0gc3dpei0+dmFsLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaWYgKCFkZXJlZl92YXIpCisgICAgICByZXR1cm47CisKKyAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9IGdldF9zcGxpdHRpbmdfZW50cnkoZGVyZWZfdmFyLT52YXIpOworICAgaWYgKCFlbnRyeSkKKyAgICAgIHJldHVybjsKKworICAgaXJfdmFyaWFibGUgKnZhciA9IGVudHJ5LT5jb21wb25lbnRzW3N3aXotPm1hc2sueF07CisgICAqcnZhbHVlID0gbmV3KGVudHJ5LT5tZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjdG9yX3NwbGl0dGluZ192aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpsaHNfZGVyZWYgPSBpci0+bGhzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnJoc19kZXJlZiA9IGlyLT5yaHMtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICB2YXJpYWJsZV9lbnRyeSAqbGhzID0gbGhzX2RlcmVmID8gZ2V0X3NwbGl0dGluZ19lbnRyeShsaHNfZGVyZWYtPnZhcikgOiBOVUxMOworICAgdmFyaWFibGVfZW50cnkgKnJocyA9IHJoc19kZXJlZiA/IGdldF9zcGxpdHRpbmdfZW50cnkocmhzX2RlcmVmLT52YXIpIDogTlVMTDsKKworICAgaWYgKGxoc19kZXJlZiAmJiByaHNfZGVyZWYgJiYgKGxocyB8fCByaHMpICYmICFpci0+Y29uZGl0aW9uKSB7CisgICAgICB1bnNpZ25lZCBpbnQgcmhzX2NoYW4gPSAwOworCisgICAgICAvKiBTdHJhaWdodCBhc3NpZ25tZW50IG9mIHZlY3RvciB2YXJpYWJsZXMuICovCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGlyLT5saHMtPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIGlyX2RlcmVmZXJlbmNlICpuZXdfbGhzOworCSBpcl9ydmFsdWUgKm5ld19yaHM7CisJIHZvaWQgKm1lbV9jdHggPSBsaHMgPyBsaHMtPm1lbV9jdHggOiByaHMtPm1lbV9jdHg7CisJIHVuc2lnbmVkIGludCB3cml0ZW1hc2s7CisKKwkgaWYgKCEoaXItPndyaXRlX21hc2sgJiAoMSA8PCBpKSkpCisJICAgIGNvbnRpbnVlOworCisJIGlmIChsaHMpIHsKKwkgICAgbmV3X2xocyA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShsaHMtPmNvbXBvbmVudHNbaV0pOworCSAgICB3cml0ZW1hc2sgPSAxOworCSB9IGVsc2UgeworCSAgICBuZXdfbGhzID0gaXItPmxocy0+Y2xvbmUobWVtX2N0eCwgTlVMTCk7CisJICAgIHdyaXRlbWFzayA9IDEgPDwgaTsKKwkgfQorCisJIGlmIChyaHMpIHsKKwkgICAgbmV3X3JocyA9CisJICAgICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShyaHMtPmNvbXBvbmVudHNbcmhzX2NoYW5dKTsKKwkgfSBlbHNlIHsKKwkgICAgbmV3X3JocyA9IG5ldyhtZW1fY3R4KSBpcl9zd2l6emxlKGlyLT5yaHMtPmNsb25lKG1lbV9jdHgsIE5VTEwpLAorCQkJCQkgICAgICByaHNfY2hhbiwgMCwgMCwgMCwgMSk7CisJIH0KKworCSBpci0+aW5zZXJ0X2JlZm9yZShuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChuZXdfbGhzLAorCQkJCQkJICAgICAgbmV3X3JocywKKwkJCQkJCSAgICAgIE5VTEwsIHdyaXRlbWFzaykpOworCisJIHJoc19jaGFuKys7CisgICAgICB9CisgICAgICBpci0+cmVtb3ZlKCk7CisgICB9IGVsc2UgaWYgKGxocykgeworICAgICAgdm9pZCAqbWVtX2N0eCA9IGxocy0+bWVtX2N0eDsKKyAgICAgIGludCBlbGVtID0gLTE7CisKKyAgICAgIHN3aXRjaCAoaXItPndyaXRlX21hc2spIHsKKyAgICAgIGNhc2UgKDEgPDwgMCk6CisJIGVsZW0gPSAwOworCSBicmVhazsKKyAgICAgIGNhc2UgKDEgPDwgMSk6CisJIGVsZW0gPSAxOworCSBicmVhazsKKyAgICAgIGNhc2UgKDEgPDwgMik6CisJIGVsZW0gPSAyOworCSBicmVhazsKKyAgICAgIGNhc2UgKDEgPDwgMyk6CisJIGVsZW0gPSAzOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGlyLT5mcHJpbnQoc3RkZXJyKTsKKwkgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IG5vbi1jaGFubmVsd2lzZSBkZXJlZmVyZW5jZSBvZiBMSFMuIik7CisgICAgICB9CisKKyAgICAgIGlyLT5saHMgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUobGhzLT5jb21wb25lbnRzW2VsZW1dKTsKKyAgICAgIGlyLT53cml0ZV9tYXNrID0gKDEgPDwgMCk7CisKKyAgICAgIGhhbmRsZV9ydmFsdWUoJmlyLT5yaHMpOworICAgfSBlbHNlIHsKKyAgICAgIGhhbmRsZV9ydmFsdWUoJmlyLT5yaHMpOworICAgfQorCisgICBoYW5kbGVfcnZhbHVlKCZpci0+Y29uZGl0aW9uKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitib29sCiticndfZG9fdmVjdG9yX3NwbGl0dGluZyhleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX3ZlY3Rvcl9yZWZlcmVuY2VfdmlzaXRvciByZWZzOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZyZWZzLCBpbnN0cnVjdGlvbnMpOworCisgICAvKiBUcmltIG91dCB2YXJpYWJsZXMgd2UgY2FuJ3Qgc3BsaXQuICovCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCAmcmVmcy52YXJpYWJsZV9saXN0KSB7CisgICAgICB2YXJpYWJsZV9lbnRyeSAqZW50cnkgPSAodmFyaWFibGVfZW50cnkgKilub2RlOworCisgICAgICBpZiAoZGVidWcpIHsKKwkgZnByaW50ZihzdGRlcnIsICJ2ZWN0b3IgJXNAJXA6IHdob2xlX2FjY2VzcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgZW50cnktPnZhci0+bmFtZSwgKHZvaWQgKikgZW50cnktPnZhciwKKyAgICAgICAgICAgICAgICAgZW50cnktPndob2xlX3ZlY3Rvcl9hY2Nlc3MpOworICAgICAgfQorCisgICAgICBpZiAoZW50cnktPndob2xlX3ZlY3Rvcl9hY2Nlc3MpIHsKKwkgZW50cnktPnJlbW92ZSgpOworICAgICAgfQorICAgfQorCisgICBpZiAocmVmcy52YXJpYWJsZV9saXN0LmlzX2VtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKworICAgLyogUmVwbGFjZSB0aGUgZGVjbHMgb2YgdGhlIHZlY3RvcnMgdG8gYmUgc3BsaXQgd2l0aCB0aGVpciBzcGxpdAorICAgICogY29tcG9uZW50cy4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZyZWZzLnZhcmlhYmxlX2xpc3QpIHsKKyAgICAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9ICh2YXJpYWJsZV9lbnRyeSAqKW5vZGU7CisgICAgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlOworICAgICAgdHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKGVudHJ5LT52YXItPnR5cGUtPmJhc2VfdHlwZSwgMSwgMSk7CisKKyAgICAgIGVudHJ5LT5tZW1fY3R4ID0gcmFsbG9jX3BhcmVudChlbnRyeS0+dmFyKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBlbnRyeS0+dmFyLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBjb25zdCBjaGFyICpuYW1lID0gcmFsbG9jX2FzcHJpbnRmKG1lbV9jdHgsICIlc18lYyIsCisJCQkJCSAgICBlbnRyeS0+dmFyLT5uYW1lLAorCQkJCQkgICAgInh5enciW2ldKTsKKworCSBlbnRyeS0+Y29tcG9uZW50c1tpXSA9IG5ldyhlbnRyeS0+bWVtX2N0eCkgaXJfdmFyaWFibGUodHlwZSwgbmFtZSwKKwkJCQkJCQkJaXJfdmFyX3RlbXBvcmFyeSk7CisJIGVudHJ5LT52YXItPmluc2VydF9iZWZvcmUoZW50cnktPmNvbXBvbmVudHNbaV0pOworICAgICAgfQorCisgICAgICBlbnRyeS0+dmFyLT5yZW1vdmUoKTsKKyAgIH0KKworICAgaXJfdmVjdG9yX3NwbGl0dGluZ192aXNpdG9yIHNwbGl0KCZyZWZzLnZhcmlhYmxlX2xpc3QpOworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmc3BsaXQsIGluc3RydWN0aW9ucyk7CisKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworCisgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfZnNfdmlzaXRvci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3Zpc2l0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNmMyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2ZzX3Zpc2l0b3IuY3BwCkBAIC0wLDAgKzEsMzAyMiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKiBAZmlsZSBicndfZnNfdmlzaXRvci5jcHAKKyAqCisgKiBUaGlzIGZpbGUgc3VwcG9ydHMgZ2VuZXJhdGluZyB0aGUgRlMgTElSIGZyb20gdGhlIEdMU0wgSVIuICBUaGUgTElSCisgKiBtYWtlcyBpdCBlYXNpZXIgdG8gZG8gYmFja2VuZC1zcGVjaWZpYyBvcHRpbWl6YXRpb25zIHRoYW4gZG9pbmcgc28KKyAqIGluIHRoZSBHTFNMIElSIG9yIGluIHRoZSBuYXRpdmUgY29kZS4KKyAqLworZXh0ZXJuICJDIiB7CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAibWFpbi9zaGFkZXJvYmouaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3ByaW50LmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX29wdGltaXplLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9yZWdpc3Rlcl9hbGxvY2F0ZS5oIgorI2luY2x1ZGUgInByb2dyYW0vc2FtcGxlci5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCisjaW5jbHVkZSAiYnJ3X2V1LmgiCisjaW5jbHVkZSAiYnJ3X3dtLmgiCit9CisjaW5jbHVkZSAiYnJ3X2ZzLmgiCisjaW5jbHVkZSAibWFpbi91bmlmb3Jtcy5oIgorI2luY2x1ZGUgImdsc2wvZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImdsc2wvaXJfb3B0aW1pemF0aW9uLmgiCisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZpc2l0KGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIGZzX3JlZyAqcmVnID0gTlVMTDsKKworICAgaWYgKHZhcmlhYmxlX3N0b3JhZ2UoaXIpKQorICAgICAgcmV0dXJuOworCisgICBpZiAoaXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKSB7CisgICAgICBpZiAoIXN0cmNtcChpci0+bmFtZSwgImdsX0ZyYWdDb29yZCIpKSB7CisJIHJlZyA9IGVtaXRfZnJhZ2Nvb3JkX2ludGVycG9sYXRpb24oaXIpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGlyLT5uYW1lLCAiZ2xfRnJvbnRGYWNpbmciKSkgeworCSByZWcgPSBlbWl0X2Zyb250ZmFjaW5nX2ludGVycG9sYXRpb24oaXIpOworICAgICAgfSBlbHNlIHsKKwkgcmVnID0gZW1pdF9nZW5lcmFsX2ludGVycG9sYXRpb24oaXIpOworICAgICAgfQorICAgICAgYXNzZXJ0KHJlZyk7CisgICAgICBoYXNoX3RhYmxlX2luc2VydCh0aGlzLT52YXJpYWJsZV9odCwgcmVnLCBpcik7CisgICAgICByZXR1cm47CisgICB9IGVsc2UgaWYgKGlyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9vdXQpIHsKKyAgICAgIHJlZyA9IG5ldyh0aGlzLT5tZW1fY3R4KSBmc19yZWcodGhpcywgaXItPnR5cGUpOworCisgICAgICBpZiAoaXItPmRhdGEuaW5kZXggPiAwKSB7CisJIGFzc2VydChpci0+ZGF0YS5sb2NhdGlvbiA9PSBGUkFHX1JFU1VMVF9EQVRBMCk7CisJIGFzc2VydChpci0+ZGF0YS5pbmRleCA9PSAxKTsKKwkgdGhpcy0+ZHVhbF9zcmNfb3V0cHV0ID0gKnJlZzsKKyAgICAgICAgIHRoaXMtPmRvX2R1YWxfc3JjID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXItPmRhdGEubG9jYXRpb24gPT0gRlJBR19SRVNVTFRfQ09MT1IpIHsKKwkgLyogV3JpdGluZyBnbF9GcmFnQ29sb3Igb3V0cHV0cyB0byBhbGwgY29sb3IgcmVnaW9ucy4gKi8KKwkgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBNQVgyKGMtPmtleS5ucl9jb2xvcl9yZWdpb25zLCAxKTsgaSsrKSB7CisJICAgIHRoaXMtPm91dHB1dHNbaV0gPSAqcmVnOworCSAgICB0aGlzLT5vdXRwdXRfY29tcG9uZW50c1tpXSA9IDQ7CisJIH0KKyAgICAgIH0gZWxzZSBpZiAoaXItPmRhdGEubG9jYXRpb24gPT0gRlJBR19SRVNVTFRfREVQVEgpIHsKKwkgdGhpcy0+ZnJhZ19kZXB0aCA9ICpyZWc7CisgICAgICB9IGVsc2UgaWYgKGlyLT5kYXRhLmxvY2F0aW9uID09IEZSQUdfUkVTVUxUX1NBTVBMRV9NQVNLKSB7CisgICAgICAgICB0aGlzLT5zYW1wbGVfbWFzayA9ICpyZWc7CisgICAgICB9IGVsc2UgeworCSAvKiBnbF9GcmFnRGF0YSBvciBhIHVzZXItZGVmaW5lZCBGUyBvdXRwdXQgKi8KKwkgYXNzZXJ0KGlyLT5kYXRhLmxvY2F0aW9uID49IEZSQUdfUkVTVUxUX0RBVEEwICYmCisJCWlyLT5kYXRhLmxvY2F0aW9uIDwgRlJBR19SRVNVTFRfREFUQTAgKyBCUldfTUFYX0RSQVdfQlVGRkVSUyk7CisKKwkgaW50IHZlY3Rvcl9lbGVtZW50cyA9CisJICAgIGlyLT50eXBlLT5pc19hcnJheSgpID8gaXItPnR5cGUtPmZpZWxkcy5hcnJheS0+dmVjdG9yX2VsZW1lbnRzCisJCQkJIDogaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsKKworCSAvKiBHZW5lcmFsIGNvbG9yIG91dHB1dC4gKi8KKwkgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBNQVgyKDEsIGlyLT50eXBlLT5sZW5ndGgpOyBpKyspIHsKKwkgICAgaW50IG91dHB1dCA9IGlyLT5kYXRhLmxvY2F0aW9uIC0gRlJBR19SRVNVTFRfREFUQTAgKyBpOworCSAgICB0aGlzLT5vdXRwdXRzW291dHB1dF0gPSAqcmVnOworCSAgICB0aGlzLT5vdXRwdXRzW291dHB1dF0ucmVnX29mZnNldCArPSB2ZWN0b3JfZWxlbWVudHMgKiBpOworCSAgICB0aGlzLT5vdXRwdXRfY29tcG9uZW50c1tvdXRwdXRdID0gdmVjdG9yX2VsZW1lbnRzOworCSB9CisgICAgICB9CisgICB9IGVsc2UgaWYgKGlyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3VuaWZvcm0pIHsKKyAgICAgIGludCBwYXJhbV9pbmRleCA9IHVuaWZvcm1zOworCisgICAgICAvKiBUaGFua3MgdG8gdGhlIGxvd2VyX3Vib19yZWZlcmVuY2UgcGFzcywgd2Ugd2lsbCBzZWUgb25seQorICAgICAgICogaXJfYmlub3BfdWJvX2xvYWQgZXhwcmVzc2lvbnMgYW5kIG5vdCBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSBmb3IgVUJPCisgICAgICAgKiB2YXJpYWJsZXMsIHNvIG5vIG5lZWQgZm9yIHRoZW0gdG8gYmUgaW4gdmFyaWFibGVfaHQuCisgICAgICAgKgorICAgICAgICogQXRvbWljIGNvdW50ZXJzIHRha2Ugbm8gdW5pZm9ybSBzdG9yYWdlLCBubyBuZWVkIHRvIGRvCisgICAgICAgKiBhbnl0aGluZyBoZXJlLgorICAgICAgICovCisgICAgICBpZiAoaXItPmlzX2luX3VuaWZvcm1fYmxvY2soKSB8fCBpci0+dHlwZS0+Y29udGFpbnNfYXRvbWljKCkpCisgICAgICAgICByZXR1cm47CisKKyAgICAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSAxNikgeworCSBpZiAoIXZhcmlhYmxlX3N0b3JhZ2UoaXIpKSB7CisJICAgIGZhaWwoIkZhaWxlZCB0byBmaW5kIHVuaWZvcm0gJyVzJyBpbiBTSU1EMTZcbiIsIGlyLT5uYW1lKTsKKwkgfQorCSByZXR1cm47CisgICAgICB9CisKKyAgICAgIHBhcmFtX3NpemVbcGFyYW1faW5kZXhdID0gdHlwZV9zaXplKGlyLT50eXBlKTsKKyAgICAgIGlmICghc3RybmNtcChpci0+bmFtZSwgImdsXyIsIDMpKSB7CisJIHNldHVwX2J1aWx0aW5fdW5pZm9ybV92YWx1ZXMoaXIpOworICAgICAgfSBlbHNlIHsKKwkgc2V0dXBfdW5pZm9ybV92YWx1ZXMoaXIpOworICAgICAgfQorCisgICAgICByZWcgPSBuZXcodGhpcy0+bWVtX2N0eCkgZnNfcmVnKFVOSUZPUk0sIHBhcmFtX2luZGV4KTsKKyAgICAgIHJlZy0+dHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUoaXItPnR5cGUpOworCisgICB9IGVsc2UgaWYgKGlyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3N5c3RlbV92YWx1ZSkgeworICAgICAgaWYgKGlyLT5kYXRhLmxvY2F0aW9uID09IFNZU1RFTV9WQUxVRV9TQU1QTEVfUE9TKSB7CisJIHJlZyA9IGVtaXRfc2FtcGxlcG9zX3NldHVwKGlyKTsKKyAgICAgIH0gZWxzZSBpZiAoaXItPmRhdGEubG9jYXRpb24gPT0gU1lTVEVNX1ZBTFVFX1NBTVBMRV9JRCkgeworCSByZWcgPSBlbWl0X3NhbXBsZWlkX3NldHVwKGlyKTsKKyAgICAgIH0gZWxzZSBpZiAoaXItPmRhdGEubG9jYXRpb24gPT0gU1lTVEVNX1ZBTFVFX1NBTVBMRV9NQVNLX0lOKSB7CisgICAgICAgICByZWcgPSBlbWl0X3NhbXBsZW1hc2tpbl9zZXR1cChpcik7CisgICAgICB9CisgICB9CisKKyAgIGlmICghcmVnKQorICAgICAgcmVnID0gbmV3KHRoaXMtPm1lbV9jdHgpIGZzX3JlZyh0aGlzLCBpci0+dHlwZSk7CisKKyAgIGhhc2hfdGFibGVfaW5zZXJ0KHRoaXMtPnZhcmlhYmxlX2h0LCByZWcsIGlyKTsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQoreworICAgZnNfcmVnICpyZWcgPSB2YXJpYWJsZV9zdG9yYWdlKGlyLT52YXIpOworICAgdGhpcy0+cmVzdWx0ID0gKnJlZzsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICppcikKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqc3RydWN0X3R5cGUgPSBpci0+cmVjb3JkLT50eXBlOworCisgICBpci0+cmVjb3JkLT5hY2NlcHQodGhpcyk7CisKKyAgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzdHJ1Y3RfdHlwZS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAoc3RydWN0X3R5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSwgaXItPmZpZWxkKSA9PSAwKQorCSBicmVhazsKKyAgICAgIG9mZnNldCArPSB0eXBlX3NpemUoc3RydWN0X3R5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSk7CisgICB9CisgICB0aGlzLT5yZXN1bHQucmVnX29mZnNldCArPSBvZmZzZXQ7CisgICB0aGlzLT5yZXN1bHQudHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUoaXItPnR5cGUpOworfQorCit2b2lkCitmc192aXNpdG9yOjp2aXNpdChpcl9kZXJlZmVyZW5jZV9hcnJheSAqaXIpCit7CisgICBpcl9jb25zdGFudCAqY29uc3RhbnRfaW5kZXg7CisgICBmc19yZWcgc3JjOworICAgaW50IGVsZW1lbnRfc2l6ZSA9IHR5cGVfc2l6ZShpci0+dHlwZSk7CisKKyAgIGNvbnN0YW50X2luZGV4ID0gaXItPmFycmF5X2luZGV4LT5hc19jb25zdGFudCgpOworCisgICBpci0+YXJyYXktPmFjY2VwdCh0aGlzKTsKKyAgIHNyYyA9IHRoaXMtPnJlc3VsdDsKKyAgIHNyYy50eXBlID0gYnJ3X3R5cGVfZm9yX2Jhc2VfdHlwZShpci0+dHlwZSk7CisKKyAgIGlmIChjb25zdGFudF9pbmRleCkgeworICAgICAgYXNzZXJ0KHNyYy5maWxlID09IFVOSUZPUk0gfHwgc3JjLmZpbGUgPT0gR1JGKTsKKyAgICAgIHNyYy5yZWdfb2Zmc2V0ICs9IGNvbnN0YW50X2luZGV4LT52YWx1ZS5pWzBdICogZWxlbWVudF9zaXplOworICAgfSBlbHNlIHsKKyAgICAgIC8qIFZhcmlhYmxlIGluZGV4IGFycmF5IGRlcmVmZXJlbmNlLiAgV2UgYXR0YWNoIHRoZSB2YXJpYWJsZSBpbmRleAorICAgICAgICogY29tcG9uZW50IHRvIHRoZSByZWcgYXMgYSBwb2ludGVyIHRvIGEgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUKKyAgICAgICAqIG9mZnNldC4gIEN1cnJlbnRseSBvbmx5IHVuaWZvcm0gYXJyYXlzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBwYXRjaCwKKyAgICAgICAqIGFuZCB0aGF0IHJlbGFkZHIgcG9pbnRlciBpcyByZXNvbHZlZCBieQorICAgICAgICogbW92ZV91bmlmb3JtX2FycmF5X2FjY2Vzc190b19wdWxsX2NvbnN0YW50cygpLiAgQWxsIG90aGVyIGFycmF5IHR5cGVzCisgICAgICAgKiBhcmUgbG93ZXJlZCBieSBsb3dlcl92YXJpYWJsZV9pbmRleF90b19jb25kX2Fzc2lnbigpLgorICAgICAgICovCisgICAgICBpci0+YXJyYXlfaW5kZXgtPmFjY2VwdCh0aGlzKTsKKworICAgICAgZnNfcmVnIGluZGV4X3JlZzsKKyAgICAgIGluZGV4X3JlZyA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmludF90eXBlKTsKKyAgICAgIGVtaXQoQlJXX09QQ09ERV9NVUwsIGluZGV4X3JlZywgdGhpcy0+cmVzdWx0LCBmc19yZWcoZWxlbWVudF9zaXplKSk7CisKKyAgICAgIGlmIChzcmMucmVsYWRkcikgeworICAgICAgICAgZW1pdChCUldfT1BDT0RFX0FERCwgaW5kZXhfcmVnLCAqc3JjLnJlbGFkZHIsIGluZGV4X3JlZyk7CisgICAgICB9CisKKyAgICAgIHNyYy5yZWxhZGRyID0gcmFsbG9jKG1lbV9jdHgsIGZzX3JlZyk7CisgICAgICBtZW1jcHkoc3JjLnJlbGFkZHIsICZpbmRleF9yZWcsIHNpemVvZihpbmRleF9yZWcpKTsKKyAgIH0KKyAgIHRoaXMtPnJlc3VsdCA9IHNyYzsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZW1pdF9scnAoY29uc3QgZnNfcmVnICZkc3QsIGNvbnN0IGZzX3JlZyAmeCwgY29uc3QgZnNfcmVnICZ5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnNfcmVnICZhKQoreworICAgaWYgKGJydy0+Z2VuIDwgNiB8fAorICAgICAgICF4LmlzX3ZhbGlkXzNzcmMoKSB8fAorICAgICAgICF5LmlzX3ZhbGlkXzNzcmMoKSB8fAorICAgICAgICFhLmlzX3ZhbGlkXzNzcmMoKSkgeworICAgICAgLyogV2UgY2FuJ3QgdXNlIHRoZSBMUlAgaW5zdHJ1Y3Rpb24uICBFbWl0IHgqKDEtYSkgKyB5KmEuICovCisgICAgICBmc19yZWcgeV90aW1lc19hICAgICAgICAgICA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworICAgICAgZnNfcmVnIG9uZV9taW51c19hICAgICAgICAgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgICAgIGZzX3JlZyB4X3RpbWVzX29uZV9taW51c19hID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisKKyAgICAgIGVtaXQoTVVMKHlfdGltZXNfYSwgeSwgYSkpOworCisgICAgICBmc19yZWcgbmVnYXRpdmVfYSA9IGE7CisgICAgICBuZWdhdGl2ZV9hLm5lZ2F0ZSA9ICFhLm5lZ2F0ZTsKKyAgICAgIGVtaXQoQUREKG9uZV9taW51c19hLCBuZWdhdGl2ZV9hLCBmc19yZWcoMS4wZikpKTsKKyAgICAgIGVtaXQoTVVMKHhfdGltZXNfb25lX21pbnVzX2EsIHgsIG9uZV9taW51c19hKSk7CisKKyAgICAgIGVtaXQoQUREKGRzdCwgeF90aW1lc19vbmVfbWludXNfYSwgeV90aW1lc19hKSk7CisgICB9IGVsc2UgeworICAgICAgLyogVGhlIExSUCBpbnN0cnVjdGlvbiBhY3R1YWxseSBkb2VzIG9wMSAqIG9wMCArIG9wMiAqICgxIC0gb3AwKSwgc28KKyAgICAgICAqIHdlIG5lZWQgdG8gcmVvcmRlciB0aGUgb3BlcmFuZHMuCisgICAgICAgKi8KKyAgICAgIGVtaXQoTFJQKGRzdCwgYSwgeSwgeCkpOworICAgfQorfQorCit2b2lkCitmc192aXNpdG9yOjplbWl0X21pbm1heCh1aW50MzJfdCBjb25kaXRpb25hbG1vZCwgY29uc3QgZnNfcmVnICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmc19yZWcgJnNyYzAsIGNvbnN0IGZzX3JlZyAmc3JjMSkKK3sKKyAgIGZzX2luc3QgKmluc3Q7CisKKyAgIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICBpbnN0ID0gZW1pdChCUldfT1BDT0RFX1NFTCwgZHN0LCBzcmMwLCBzcmMxKTsKKyAgICAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IGNvbmRpdGlvbmFsbW9kOworICAgfSBlbHNlIHsKKyAgICAgIGVtaXQoQ01QKHJlZ19udWxsX2QsIHNyYzAsIHNyYzEsIGNvbmRpdGlvbmFsbW9kKSk7CisKKyAgICAgIGluc3QgPSBlbWl0KEJSV19PUENPREVfU0VMLCBkc3QsIHNyYzAsIHNyYzEpOworICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICB9Cit9CisKKy8qIEluc3RydWN0aW9uIHNlbGVjdGlvbjogUHJvZHVjZSBhIE1PVi5zYXQgaW5zdGVhZCBvZgorICogTUlOKE1BWCh2YWwsIDApLCAxKSB3aGVuIHBvc3NpYmxlLgorICovCitib29sCitmc192aXNpdG9yOjp0cnlfZW1pdF9zYXR1cmF0ZShpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlyX3J2YWx1ZSAqc2F0X3ZhbCA9IGlyLT5hc19ydmFsdWVfdG9fc2F0dXJhdGUoKTsKKworICAgaWYgKCFzYXRfdmFsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBmc19pbnN0ICpwcmVfaW5zdCA9IChmc19pbnN0ICopIHRoaXMtPmluc3RydWN0aW9ucy5nZXRfdGFpbCgpOworCisgICBzYXRfdmFsLT5hY2NlcHQodGhpcyk7CisgICBmc19yZWcgc3JjID0gdGhpcy0+cmVzdWx0OworCisgICBmc19pbnN0ICpsYXN0X2luc3QgPSAoZnNfaW5zdCAqKSB0aGlzLT5pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZnJvbSBvdXIgYWNjZXB0KCkgZGlkbid0IGdlbmVyYXRlIG91cgorICAgICogc3JjLCBnZW5lcmF0ZSBhIHNhdHVyYXRlZCBNT1YKKyAgICAqLworICAgZnNfaW5zdCAqbW9kaWZ5ID0gZ2V0X2luc3RydWN0aW9uX2dlbmVyYXRpbmdfcmVnKHByZV9pbnN0LCBsYXN0X2luc3QsIHNyYyk7CisgICBpZiAoIW1vZGlmeSB8fCBtb2RpZnktPnJlZ3Nfd3JpdHRlbiAhPSAxKSB7CisgICAgICB0aGlzLT5yZXN1bHQgPSBmc19yZWcodGhpcywgaXItPnR5cGUpOworICAgICAgZnNfaW5zdCAqaW5zdCA9IGVtaXQoTU9WKHRoaXMtPnJlc3VsdCwgc3JjKSk7CisgICAgICBpbnN0LT5zYXR1cmF0ZSA9IHRydWU7CisgICB9IGVsc2UgeworICAgICAgbW9kaWZ5LT5zYXR1cmF0ZSA9IHRydWU7CisgICAgICB0aGlzLT5yZXN1bHQgPSBzcmM7CisgICB9CisKKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2ZzX3Zpc2l0b3I6OnRyeV9lbWl0X21hZChpcl9leHByZXNzaW9uICppcikKK3sKKyAgIC8qIDMtc3JjIGluc3RydWN0aW9ucyB3ZXJlIGludHJvZHVjZWQgaW4gZ2VuNi4gKi8KKyAgIGlmIChicnctPmdlbiA8IDYpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIE1BRCBjYW4gb25seSBoYW5kbGUgZmxvYXRpbmctcG9pbnQgZGF0YS4gKi8KKyAgIGlmIChpci0+dHlwZSAhPSBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlyX3J2YWx1ZSAqbm9ubXVsID0gaXItPm9wZXJhbmRzWzFdOworICAgaXJfZXhwcmVzc2lvbiAqbXVsID0gaXItPm9wZXJhbmRzWzBdLT5hc19leHByZXNzaW9uKCk7CisKKyAgIGlmICghbXVsIHx8IG11bC0+b3BlcmF0aW9uICE9IGlyX2Jpbm9wX211bCkgeworICAgICAgbm9ubXVsID0gaXItPm9wZXJhbmRzWzBdOworICAgICAgbXVsID0gaXItPm9wZXJhbmRzWzFdLT5hc19leHByZXNzaW9uKCk7CisKKyAgICAgIGlmICghbXVsIHx8IG11bC0+b3BlcmF0aW9uICE9IGlyX2Jpbm9wX211bCkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgaWYgKG5vbm11bC0+YXNfY29uc3RhbnQoKSB8fAorICAgICAgIG11bC0+b3BlcmFuZHNbMF0tPmFzX2NvbnN0YW50KCkgfHwKKyAgICAgICBtdWwtPm9wZXJhbmRzWzFdLT5hc19jb25zdGFudCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBub25tdWwtPmFjY2VwdCh0aGlzKTsKKyAgIGZzX3JlZyBzcmMwID0gdGhpcy0+cmVzdWx0OworCisgICBtdWwtPm9wZXJhbmRzWzBdLT5hY2NlcHQodGhpcyk7CisgICBmc19yZWcgc3JjMSA9IHRoaXMtPnJlc3VsdDsKKworICAgbXVsLT5vcGVyYW5kc1sxXS0+YWNjZXB0KHRoaXMpOworICAgZnNfcmVnIHNyYzIgPSB0aGlzLT5yZXN1bHQ7CisKKyAgIHRoaXMtPnJlc3VsdCA9IGZzX3JlZyh0aGlzLCBpci0+dHlwZSk7CisgICBlbWl0KEJSV19PUENPREVfTUFELCB0aGlzLT5yZXN1bHQsIHNyYzAsIHNyYzEsIHNyYzIpOworCisgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6dmlzaXQoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICB1bnNpZ25lZCBpbnQgb3BlcmFuZDsKKyAgIGZzX3JlZyBvcFszXSwgdGVtcDsKKyAgIGZzX2luc3QgKmluc3Q7CisKKyAgIGFzc2VydChpci0+Z2V0X251bV9vcGVyYW5kcygpIDw9IDMpOworCisgICBpZiAodHJ5X2VtaXRfc2F0dXJhdGUoaXIpKQorICAgICAgcmV0dXJuOworICAgaWYgKGlyLT5vcGVyYXRpb24gPT0gaXJfYmlub3BfYWRkKSB7CisgICAgICBpZiAodHJ5X2VtaXRfbWFkKGlyKSkKKwkgcmV0dXJuOworICAgfQorCisgICBmb3IgKG9wZXJhbmQgPSAwOyBvcGVyYW5kIDwgaXItPmdldF9udW1fb3BlcmFuZHMoKTsgb3BlcmFuZCsrKSB7CisgICAgICBpci0+b3BlcmFuZHNbb3BlcmFuZF0tPmFjY2VwdCh0aGlzKTsKKyAgICAgIGlmICh0aGlzLT5yZXN1bHQuZmlsZSA9PSBCQURfRklMRSkgeworCSBmYWlsKCJGYWlsZWQgdG8gZ2V0IHRyZWUgZm9yIGV4cHJlc3Npb24gb3BlcmFuZDpcbiIpOworCSBpci0+b3BlcmFuZHNbb3BlcmFuZF0tPmZwcmludChzdGRlcnIpOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgfQorICAgICAgYXNzZXJ0KHRoaXMtPnJlc3VsdC5pc192YWxpZF8zc3JjKCkpOworICAgICAgb3Bbb3BlcmFuZF0gPSB0aGlzLT5yZXN1bHQ7CisKKyAgICAgIC8qIE1hdHJpeCBleHByZXNzaW9uIG9wZXJhbmRzIHNob3VsZCBoYXZlIGJlZW4gYnJva2VuIGRvd24gdG8gdmVjdG9yCisgICAgICAgKiBvcGVyYXRpb25zIGFscmVhZHkuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCghaXItPm9wZXJhbmRzW29wZXJhbmRdLT50eXBlLT5pc19tYXRyaXgoKSk7CisgICAgICAvKiBBbmQgdGhlbiB0aG9zZSB2ZWN0b3Igb3BlcmFuZHMgc2hvdWxkIGhhdmUgYmVlbiBicm9rZW4gZG93biB0byBzY2FsYXIuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCghaXItPm9wZXJhbmRzW29wZXJhbmRdLT50eXBlLT5pc192ZWN0b3IoKSk7CisgICB9CisKKyAgIC8qIFN0b3JhZ2UgZm9yIG91ciByZXN1bHQuICBJZiBvdXIgcmVzdWx0IGdvZXMgaW50byBhbiBhc3NpZ25tZW50LCBpdCB3aWxsCisgICAgKiBqdXN0IGdldCBjb3B5LXByb3BhZ2F0ZWQgb3V0LCBzbyBubyB3b3JyaWVzLgorICAgICovCisgICB0aGlzLT5yZXN1bHQgPSBmc19yZWcodGhpcywgaXItPnR5cGUpOworCisgICBzd2l0Y2ggKGlyLT5vcGVyYXRpb24pIHsKKyAgIGNhc2UgaXJfdW5vcF9sb2dpY19ub3Q6CisgICAgICAvKiBOb3RlIHRoYXQgQlJXX09QQ09ERV9OT1QgaXMgbm90IGFwcHJvcHJpYXRlIGhlcmUsIHNpbmNlIGl0IGlzCisgICAgICAgKiBvbmVzIGNvbXBsZW1lbnQgb2YgdGhlIHdob2xlIHJlZ2lzdGVyLCBub3QganVzdCBiaXQgMC4KKyAgICAgICAqLworICAgICAgZW1pdChYT1IodGhpcy0+cmVzdWx0LCBvcFswXSwgZnNfcmVnKDEpKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9uZWc6CisgICAgICBvcFswXS5uZWdhdGUgPSAhb3BbMF0ubmVnYXRlOworICAgICAgZW1pdChNT1YodGhpcy0+cmVzdWx0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfYWJzOgorICAgICAgb3BbMF0uYWJzID0gdHJ1ZTsKKyAgICAgIG9wWzBdLm5lZ2F0ZSA9IGZhbHNlOworICAgICAgZW1pdChNT1YodGhpcy0+cmVzdWx0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3Bfc2lnbjoKKyAgICAgIGlmIChpci0+dHlwZS0+aXNfZmxvYXQoKSkgeworICAgICAgICAgLyogQU5EKHZhbCwgMHg4MDAwMDAwMCkgZ2l2ZXMgdGhlIHNpZ24gYml0LgorICAgICAgICAgICoKKyAgICAgICAgICAqIFByZWRpY2F0ZWQgT1IgT1JzIDEuMCAoMHgzZjgwMDAwMCkgd2l0aCB0aGUgc2lnbiBiaXQgaWYgdmFsIGlzIG5vdAorICAgICAgICAgICogemVyby4KKyAgICAgICAgICAqLworICAgICAgICAgZW1pdChDTVAocmVnX251bGxfZiwgb3BbMF0sIGZzX3JlZygwLjBmKSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisKKyAgICAgICAgIG9wWzBdLnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9VRDsKKyAgICAgICAgIHRoaXMtPnJlc3VsdC50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVUQ7CisgICAgICAgICBlbWl0KEFORCh0aGlzLT5yZXN1bHQsIG9wWzBdLCBmc19yZWcoMHg4MDAwMDAwMHUpKSk7CisKKyAgICAgICAgIGluc3QgPSBlbWl0KE9SKHRoaXMtPnJlc3VsdCwgdGhpcy0+cmVzdWx0LCBmc19yZWcoMHgzZjgwMDAwMHUpKSk7CisgICAgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKworICAgICAgICAgdGhpcy0+cmVzdWx0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9GOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qICBBU1IodmFsLCAzMSkgLT4gbmVnYXRpdmUgdmFsIGdlbmVyYXRlcyAweGZmZmZmZmZmIChzaWduZWQgLTEpLgorICAgICAgICAgICogICAgICAgICAgICAgICAtPiBub24tbmVnYXRpdmUgdmFsIGdlbmVyYXRlcyAweDAwMDAwMDAwLgorICAgICAgICAgICogIFByZWRpY2F0ZWQgT1Igc2V0cyAxIGlmIHZhbCBpcyBwb3NpdGl2ZS4KKyAgICAgICAgICAqLworICAgICAgICAgZW1pdChDTVAocmVnX251bGxfZCwgb3BbMF0sIGZzX3JlZygwKSwgQlJXX0NPTkRJVElPTkFMX0cpKTsKKworICAgICAgICAgZW1pdChBU1IodGhpcy0+cmVzdWx0LCBvcFswXSwgZnNfcmVnKDMxKSkpOworCisgICAgICAgICBpbnN0ID0gZW1pdChPUih0aGlzLT5yZXN1bHQsIHRoaXMtPnJlc3VsdCwgZnNfcmVnKDEpKSk7CisgICAgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3JjcDoKKyAgICAgIGVtaXRfbWF0aChTSEFERVJfT1BDT0RFX1JDUCwgdGhpcy0+cmVzdWx0LCBvcFswXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2V4cDI6CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9FWFAyLCB0aGlzLT5yZXN1bHQsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2xvZzI6CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9MT0cyLCB0aGlzLT5yZXN1bHQsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2V4cDoKKyAgIGNhc2UgaXJfdW5vcF9sb2c6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgaXJfZXhwbG9nX3RvX2V4cGxvZzIiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3NpbjoKKyAgIGNhc2UgaXJfdW5vcF9zaW5fcmVkdWNlZDoKKyAgICAgIGVtaXRfbWF0aChTSEFERVJfT1BDT0RFX1NJTiwgdGhpcy0+cmVzdWx0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9jb3M6CisgICBjYXNlIGlyX3Vub3BfY29zX3JlZHVjZWQ6CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9DT1MsIHRoaXMtPnJlc3VsdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9kRmR4OgorICAgICAgZW1pdChGU19PUENPREVfRERYLCB0aGlzLT5yZXN1bHQsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2RGZHk6CisgICAgICBlbWl0KEZTX09QQ09ERV9ERFksIHRoaXMtPnJlc3VsdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfYWRkOgorICAgICAgZW1pdChBREQodGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9zdWI6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgaXJfc3ViX3RvX2FkZF9uZWciKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX211bDoKKyAgICAgIGlmIChicnctPmdlbiA8IDggJiYgaXItPnR5cGUtPmlzX2ludGVnZXIoKSkgeworCSAvKiBGb3IgaW50ZWdlciBtdWx0aXBsaWNhdGlvbiwgdGhlIE1VTCB1c2VzIHRoZSBsb3cgMTYgYml0cworCSAgKiBvZiBvbmUgb2YgdGhlIG9wZXJhbmRzIChzcmMwIG9uIGdlbjYsIHNyYzEgb24gZ2VuNykuICBUaGUKKwkgICogTUFDSCBhY2N1bXVsYXRlcyBpbiB0aGUgY29udHJpYnV0aW9uIG9mIHRoZSB1cHBlciAxNiBiaXRzCisJICAqIG9mIHRoYXQgb3BlcmFuZC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGlyLT5vcGVyYW5kc1swXS0+aXNfdWludDE2X2NvbnN0YW50KCkpIHsKKyAgICAgICAgICAgIGlmIChicnctPmdlbiA8IDcpCisgICAgICAgICAgICAgICBlbWl0KE1VTCh0aGlzLT5yZXN1bHQsIG9wWzBdLCBvcFsxXSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZW1pdChNVUwodGhpcy0+cmVzdWx0LCBvcFsxXSwgb3BbMF0pKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoaXItPm9wZXJhbmRzWzFdLT5pc191aW50MTZfY29uc3RhbnQoKSkgeworICAgICAgICAgICAgaWYgKGJydy0+Z2VuIDwgNykKKyAgICAgICAgICAgICAgIGVtaXQoTVVMKHRoaXMtPnJlc3VsdCwgb3BbMV0sIG9wWzBdKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBlbWl0KE1VTCh0aGlzLT5yZXN1bHQsIG9wWzBdLCBvcFsxXSkpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChicnctPmdlbiA+PSA3KQorICAgICAgICAgICAgICAgbm8xNigiU0lNRDE2IGV4cGxpY2l0IGFjY3VtdWxhdG9yIG9wZXJhbmRzIHVuc3VwcG9ydGVkXG4iKTsKKworICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgYWNjID0gcmV0eXBlKGJyd19hY2NfcmVnKCksIHRoaXMtPnJlc3VsdC50eXBlKTsKKworICAgICAgICAgICAgZW1pdChNVUwoYWNjLCBvcFswXSwgb3BbMV0pKTsKKyAgICAgICAgICAgIGVtaXQoTUFDSChyZWdfbnVsbF9kLCBvcFswXSwgb3BbMV0pKTsKKyAgICAgICAgICAgIGVtaXQoTU9WKHRoaXMtPnJlc3VsdCwgZnNfcmVnKGFjYykpKTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisJIGVtaXQoTVVMKHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfaW11bF9oaWdoOiB7CisgICAgICBpZiAoYnJ3LT5nZW4gPj0gNykKKyAgICAgICAgIG5vMTYoIlNJTUQxNiBleHBsaWNpdCBhY2N1bXVsYXRvciBvcGVyYW5kcyB1bnN1cHBvcnRlZFxuIik7CisKKyAgICAgIHN0cnVjdCBicndfcmVnIGFjYyA9IHJldHlwZShicndfYWNjX3JlZygpLCB0aGlzLT5yZXN1bHQudHlwZSk7CisKKyAgICAgIGVtaXQoTVVMKGFjYywgb3BbMF0sIG9wWzFdKSk7CisgICAgICBlbWl0KE1BQ0godGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgY2FzZSBpcl9iaW5vcF9kaXY6CisgICAgICAvKiBGbG9hdGluZyBwb2ludCBzaG91bGQgYmUgbG93ZXJlZCBieSBESVZfVE9fTVVMX1JDUCBpbiB0aGUgY29tcGlsZXIuICovCisgICAgICBhc3NlcnQoaXItPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQsIHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9jYXJyeTogeworICAgICAgaWYgKGJydy0+Z2VuID49IDcpCisgICAgICAgICBubzE2KCJTSU1EMTYgZXhwbGljaXQgYWNjdW11bGF0b3Igb3BlcmFuZHMgdW5zdXBwb3J0ZWRcbiIpOworCisgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhY2MgPSByZXR5cGUoYnJ3X2FjY19yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworCisgICAgICBlbWl0KEFEREMocmVnX251bGxfdWQsIG9wWzBdLCBvcFsxXSkpOworICAgICAgZW1pdChNT1YodGhpcy0+cmVzdWx0LCBmc19yZWcoYWNjKSkpOworICAgICAgYnJlYWs7CisgICB9CisgICBjYXNlIGlyX2Jpbm9wX2JvcnJvdzogeworICAgICAgaWYgKGJydy0+Z2VuID49IDcpCisgICAgICAgICBubzE2KCJTSU1EMTYgZXhwbGljaXQgYWNjdW11bGF0b3Igb3BlcmFuZHMgdW5zdXBwb3J0ZWRcbiIpOworCisgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhY2MgPSByZXR5cGUoYnJ3X2FjY19yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworCisgICAgICBlbWl0KFNVQkIocmVnX251bGxfdWQsIG9wWzBdLCBvcFsxXSkpOworICAgICAgZW1pdChNT1YodGhpcy0+cmVzdWx0LCBmc19yZWcoYWNjKSkpOworICAgICAgYnJlYWs7CisgICB9CisgICBjYXNlIGlyX2Jpbm9wX21vZDoKKyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHNob3VsZCBiZSBsb3dlcmVkIGJ5IE1PRF9UT19GUkFDVCBpbiB0aGUgY29tcGlsZXIuICovCisgICAgICBhc3NlcnQoaXItPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9JTlRfUkVNQUlOREVSLCB0aGlzLT5yZXN1bHQsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgY2FzZSBpcl9iaW5vcF9ncmVhdGVyOgorICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2FsbF9lcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfbmVxdWFsOgorICAgY2FzZSBpcl9iaW5vcF9hbnlfbmVxdWFsOgorICAgICAgcmVzb2x2ZV9ib29sX2NvbXBhcmlzb24oaXItPm9wZXJhbmRzWzBdLCAmb3BbMF0pOworICAgICAgcmVzb2x2ZV9ib29sX2NvbXBhcmlzb24oaXItPm9wZXJhbmRzWzFdLCAmb3BbMV0pOworCisgICAgICBlbWl0KENNUCh0aGlzLT5yZXN1bHQsIG9wWzBdLCBvcFsxXSwKKyAgICAgICAgICAgICAgIGJyd19jb25kaXRpb25hbF9mb3JfY29tcGFyaXNvbihpci0+b3BlcmF0aW9uKSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfeG9yOgorICAgICAgZW1pdChYT1IodGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX29yOgorICAgICAgZW1pdChPUih0aGlzLT5yZXN1bHQsIG9wWzBdLCBvcFsxXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfYW5kOgorICAgICAgZW1pdChBTkQodGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2RvdDoKKyAgIGNhc2UgaXJfdW5vcF9hbnk6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgYnJ3X2ZzX2NoYW5uZWxfZXhwcmVzc2lvbnMiKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfbm9pc2U6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbG93ZXJfbm9pc2UiKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3F1YWRvcF92ZWN0b3I6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbG93ZXJfcXVhZG9wX3ZlY3RvciIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfdmVjdG9yX2V4dHJhY3Q6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbG93ZXJfdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduKCkiKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQ6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbG93ZXJfdmVjdG9yX2luc2VydCgpIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sZGV4cDoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiBzaG91bGQgYmUgaGFuZGxlZCBieSBsZGV4cF90b19hcml0aCgpIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3NxcnQ6CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9TUVJULCB0aGlzLT5yZXN1bHQsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfcnNxOgorICAgICAgZW1pdF9tYXRoKFNIQURFUl9PUENPREVfUlNRLCB0aGlzLT5yZXN1bHQsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF9pMmY6CisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF91MmY6CisgICAgICBvcFswXS50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfRjsKKyAgICAgIHRoaXMtPnJlc3VsdCA9IG9wWzBdOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfaTJ1OgorICAgY2FzZSBpcl91bm9wX2JpdGNhc3RfZjJ1OgorICAgICAgb3BbMF0udHlwZSA9IEJSV19SRUdJU1RFUl9UWVBFX1VEOworICAgICAgdGhpcy0+cmVzdWx0ID0gb3BbMF07CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF91Mmk6CisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF9mMmk6CisgICAgICBvcFswXS50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfRDsKKyAgICAgIHRoaXMtPnJlc3VsdCA9IG9wWzBdOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfaTJmOgorICAgY2FzZSBpcl91bm9wX3UyZjoKKyAgIGNhc2UgaXJfdW5vcF9mMmk6CisgICBjYXNlIGlyX3Vub3BfZjJ1OgorICAgICAgZW1pdChNT1YodGhpcy0+cmVzdWx0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9iMmk6CisgICAgICBlbWl0KEFORCh0aGlzLT5yZXN1bHQsIG9wWzBdLCBmc19yZWcoMSkpKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2IyZjoKKyAgICAgIHRlbXAgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjppbnRfdHlwZSk7CisgICAgICBlbWl0KEFORCh0ZW1wLCBvcFswXSwgZnNfcmVnKDEpKSk7CisgICAgICBlbWl0KE1PVih0aGlzLT5yZXN1bHQsIHRlbXApKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfZjJiOgorICAgICAgZW1pdChDTVAodGhpcy0+cmVzdWx0LCBvcFswXSwgZnNfcmVnKDAuMGYpLCBCUldfQ09ORElUSU9OQUxfTlopKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2kyYjoKKyAgICAgIGVtaXQoQ01QKHRoaXMtPnJlc3VsdCwgb3BbMF0sIGZzX3JlZygwKSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3RydW5jOgorICAgICAgZW1pdChSTkRaKHRoaXMtPnJlc3VsdCwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2NlaWw6CisgICAgICBvcFswXS5uZWdhdGUgPSAhb3BbMF0ubmVnYXRlOworICAgICAgZW1pdChSTkREKHRoaXMtPnJlc3VsdCwgb3BbMF0pKTsKKyAgICAgIHRoaXMtPnJlc3VsdC5uZWdhdGUgPSB0cnVlOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZmxvb3I6CisgICAgICBlbWl0KFJOREQodGhpcy0+cmVzdWx0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZnJhY3Q6CisgICAgICBlbWl0KEZSQyh0aGlzLT5yZXN1bHQsIG9wWzBdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9yb3VuZF9ldmVuOgorICAgICAgZW1pdChSTkRFKHRoaXMtPnJlc3VsdCwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX21pbjoKKyAgIGNhc2UgaXJfYmlub3BfbWF4OgorICAgICAgcmVzb2x2ZV91ZF9uZWdhdGUoJm9wWzBdKTsKKyAgICAgIHJlc29sdmVfdWRfbmVnYXRlKCZvcFsxXSk7CisgICAgICBlbWl0X21pbm1heChpci0+b3BlcmF0aW9uID09IGlyX2Jpbm9wX21pbiA/CisgICAgICAgICAgICAgICAgICBCUldfQ09ORElUSU9OQUxfTCA6IEJSV19DT05ESVRJT05BTF9HRSwKKyAgICAgICAgICAgICAgICAgIHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Nub3JtXzR4ODoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Vub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfcGFja191bm9ybV80eDg6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Nub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Nub3JtXzR4ODoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfdW5vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfdW5vcm1fNHg4OgorICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfcGFja19oYWxmXzJ4MTY6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbG93ZXJfcGFja2luZ19idWlsdGlucyIpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNl9zcGxpdF94OgorICAgICAgZW1pdChGU19PUENPREVfVU5QQUNLX0hBTEZfMngxNl9TUExJVF9YLCB0aGlzLT5yZXN1bHQsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTZfc3BsaXRfeToKKyAgICAgIGVtaXQoRlNfT1BDT0RFX1VOUEFDS19IQUxGXzJ4MTZfU1BMSVRfWSwgdGhpcy0+cmVzdWx0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfcG93OgorICAgICAgZW1pdF9tYXRoKFNIQURFUl9PUENPREVfUE9XLCB0aGlzLT5yZXN1bHQsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2JpdGZpZWxkX3JldmVyc2U6CisgICAgICBlbWl0KEJGUkVWKHRoaXMtPnJlc3VsdCwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2JpdF9jb3VudDoKKyAgICAgIGVtaXQoQ0JJVCh0aGlzLT5yZXN1bHQsIG9wWzBdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9maW5kX21zYjoKKyAgICAgIHRlbXAgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgZW1pdChGQkgodGVtcCwgb3BbMF0pKTsKKworICAgICAgLyogRkJIIGNvdW50cyBmcm9tIHRoZSBNU0Igc2lkZSwgd2hpbGUgR0xTTCdzIGZpbmRNU0IoKSB3YW50cyB0aGUgY291bnQKKyAgICAgICAqIGZyb20gdGhlIExTQiBzaWRlLiBJZiBGQkggZGlkbid0IHJldHVybiBhbiBlcnJvciAoMHhGRkZGRkZGRiksIHRoZW4KKyAgICAgICAqIHN1YnRyYWN0IHRoZSByZXN1bHQgZnJvbSAzMSB0byBjb252ZXJ0IHRoZSBNU0IgY291bnQgaW50byBhbiBMU0IgY291bnQuCisgICAgICAgKi8KKworICAgICAgLyogRkJIIG9ubHkgc3VwcG9ydHMgVUQgdHlwZSBmb3IgZHN0LCBzbyB1c2UgYSBNT1YgdG8gY29udmVydCBVRCB0byBELiAqLworICAgICAgZW1pdChNT1YodGhpcy0+cmVzdWx0LCB0ZW1wKSk7CisgICAgICBlbWl0KENNUChyZWdfbnVsbF9kLCB0aGlzLT5yZXN1bHQsIGZzX3JlZygtMSksIEJSV19DT05ESVRJT05BTF9OWikpOworCisgICAgICB0ZW1wLm5lZ2F0ZSA9IHRydWU7CisgICAgICBpbnN0ID0gZW1pdChBREQodGhpcy0+cmVzdWx0LCB0ZW1wLCBmc19yZWcoMzEpKSk7CisgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2ZpbmRfbHNiOgorICAgICAgZW1pdChGQkwodGhpcy0+cmVzdWx0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3RyaW9wX2JpdGZpZWxkX2V4dHJhY3Q6CisgICAgICAvKiBOb3RlIHRoYXQgdGhlIGluc3RydWN0aW9uJ3MgYXJndW1lbnQgb3JkZXIgaXMgcmV2ZXJzZWQgZnJvbSBHTFNMCisgICAgICAgKiBhbmQgdGhlIElSLgorICAgICAgICovCisgICAgICBlbWl0KEJGRSh0aGlzLT5yZXN1bHQsIG9wWzJdLCBvcFsxXSwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9iZm06CisgICAgICBlbWl0KEJGSTEodGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90cmlvcF9iZmk6CisgICAgICBlbWl0KEJGSTIodGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0sIG9wWzJdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfcXVhZG9wX2JpdGZpZWxkX2luc2VydDoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiBzaG91bGQgYmUgaGFuZGxlZCBieSAiCisgICAgICAgICAgICAgICJsb3dlcl9pbnN0cnVjdGlvbnM6OmJpdGZpZWxkX2luc2VydF90b19iZm1fYmZpIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2JpdF9ub3Q6CisgICAgICBlbWl0KE5PVCh0aGlzLT5yZXN1bHQsIG9wWzBdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfYml0X2FuZDoKKyAgICAgIGVtaXQoQU5EKHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfYml0X3hvcjoKKyAgICAgIGVtaXQoWE9SKHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfYml0X29yOgorICAgICAgZW1pdChPUih0aGlzLT5yZXN1bHQsIG9wWzBdLCBvcFsxXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbHNoaWZ0OgorICAgICAgZW1pdChTSEwodGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX3JzaGlmdDoKKyAgICAgIGlmIChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpCisJIGVtaXQoQVNSKHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBlbHNlCisJIGVtaXQoU0hSKHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfcGFja19oYWxmXzJ4MTZfc3BsaXQ6CisgICAgICBlbWl0KEZTX09QQ09ERV9QQUNLX0hBTEZfMngxNl9TUExJVCwgdGhpcy0+cmVzdWx0LCBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX3Vib19sb2FkOiB7CisgICAgICAvKiBUaGlzIElSIG5vZGUgdGFrZXMgYSBjb25zdGFudCB1bmlmb3JtIGJsb2NrIGFuZCBhIGNvbnN0YW50IG9yCisgICAgICAgKiB2YXJpYWJsZSBieXRlIG9mZnNldCB3aXRoaW4gdGhlIGJsb2NrIGFuZCBsb2FkcyBhIHZlY3RvciBmcm9tIHRoYXQuCisgICAgICAgKi8KKyAgICAgIGlyX2NvbnN0YW50ICp1bmlmb3JtX2Jsb2NrID0gaXItPm9wZXJhbmRzWzBdLT5hc19jb25zdGFudCgpOworICAgICAgaXJfY29uc3RhbnQgKmNvbnN0X29mZnNldCA9IGlyLT5vcGVyYW5kc1sxXS0+YXNfY29uc3RhbnQoKTsKKyAgICAgIGZzX3JlZyBzdXJmX2luZGV4ID0gZnNfcmVnKGMtPnByb2dfZGF0YS5iYXNlLmJpbmRpbmdfdGFibGUudWJvX3N0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1fYmxvY2stPnZhbHVlLnVbMF0pOworICAgICAgaWYgKGNvbnN0X29mZnNldCkgeworICAgICAgICAgZnNfcmVnIHBhY2tlZF9jb25zdHMgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgICAgICAgIHBhY2tlZF9jb25zdHMudHlwZSA9IHJlc3VsdC50eXBlOworCisgICAgICAgICBmc19yZWcgY29uc3Rfb2Zmc2V0X3JlZyA9IGZzX3JlZyhjb25zdF9vZmZzZXQtPnZhbHVlLnVbMF0gJiB+MTUpOworICAgICAgICAgZW1pdChuZXcobWVtX2N0eCkgZnNfaW5zdChGU19PUENPREVfVU5JRk9STV9QVUxMX0NPTlNUQU5UX0xPQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZF9jb25zdHMsIHN1cmZfaW5kZXgsIGNvbnN0X29mZnNldF9yZWcpKTsKKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIHBhY2tlZF9jb25zdHMuc2V0X3NtZWFyKGNvbnN0X29mZnNldC0+dmFsdWUudVswXSAlIDE2IC8gNCArIGkpOworCisgICAgICAgICAgICAvKiBUaGUgc3RkMTQwIHBhY2tpbmcgcnVsZXMgZG9uJ3QgYWxsb3cgdmVjdG9ycyB0byBjcm9zcyAxNi1ieXRlCisgICAgICAgICAgICAgKiBib3VuZGFyaWVzLCBhbmQgYSByZWcgaXMgMzIgYnl0ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydChwYWNrZWRfY29uc3RzLnN1YnJlZ19vZmZzZXQgPCAzMik7CisKKyAgICAgICAgICAgIC8qIFVCTyBib29scyBhcmUgYW55IG5vbnplcm8gdmFsdWUuICBXZSBjb25zaWRlciBib29scyB0byBiZQorICAgICAgICAgICAgICogdmFsdWVzIHdpdGggdGhlIGxvdyBiaXQgc2V0IHRvIDEuICBDb252ZXJ0IHRoZW0gdXNpbmcgQ01QLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQk9PTCkgeworICAgICAgICAgICAgICAgZW1pdChDTVAocmVzdWx0LCBwYWNrZWRfY29uc3RzLCBmc19yZWcoMHUpLCBCUldfQ09ORElUSU9OQUxfTlopKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBlbWl0KE1PVihyZXN1bHQsIHBhY2tlZF9jb25zdHMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0LnJlZ19vZmZzZXQrKzsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAvKiBUdXJuIHRoZSBieXRlIG9mZnNldCBpbnRvIGEgZHdvcmQgb2Zmc2V0LiAqLworICAgICAgICAgZnNfcmVnIGJhc2Vfb2Zmc2V0ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6aW50X3R5cGUpOworICAgICAgICAgZW1pdChTSFIoYmFzZV9vZmZzZXQsIG9wWzFdLCBmc19yZWcoMikpKTsKKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIGVtaXQoVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQUQocmVzdWx0LCBzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX29mZnNldCwgaSkpOworCisgICAgICAgICAgICBpZiAoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQk9PTCkKKyAgICAgICAgICAgICAgIGVtaXQoQ01QKHJlc3VsdCwgcmVzdWx0LCBmc19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworCisgICAgICAgICAgICByZXN1bHQucmVnX29mZnNldCsrOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHQucmVnX29mZnNldCA9IDA7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBpcl90cmlvcF9mbWE6CisgICAgICAvKiBOb3RlIHRoYXQgdGhlIGluc3RydWN0aW9uJ3MgYXJndW1lbnQgb3JkZXIgaXMgcmV2ZXJzZWQgZnJvbSBHTFNMCisgICAgICAgKiBhbmQgdGhlIElSLgorICAgICAgICovCisgICAgICBlbWl0KE1BRCh0aGlzLT5yZXN1bHQsIG9wWzJdLCBvcFsxXSwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2xycDoKKyAgICAgIGVtaXRfbHJwKHRoaXMtPnJlc3VsdCwgb3BbMF0sIG9wWzFdLCBvcFsyXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF9jc2VsOgorICAgICAgZW1pdChDTVAocmVnX251bGxfZCwgb3BbMF0sIGZzX3JlZygwKSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisgICAgICBpbnN0ID0gZW1pdChCUldfT1BDT0RFX1NFTCwgdGhpcy0+cmVzdWx0LCBvcFsxXSwgb3BbMl0pOworICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICAgICBicmVhazsKKyAgIH0KK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZW1pdF9hc3NpZ25tZW50X3dyaXRlcyhmc19yZWcgJmwsIGZzX3JlZyAmciwKKwkJCQkgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGJvb2wgcHJlZGljYXRlZCkKK3sKKyAgIHN3aXRjaCAodHlwZS0+YmFzZV90eXBlKSB7CisgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0eXBlLT5jb21wb25lbnRzKCk7IGkrKykgeworCSBsLnR5cGUgPSBicndfdHlwZV9mb3JfYmFzZV90eXBlKHR5cGUpOworCSByLnR5cGUgPSBicndfdHlwZV9mb3JfYmFzZV90eXBlKHR5cGUpOworCisJIGlmIChwcmVkaWNhdGVkIHx8ICFsLmVxdWFscyhyKSkgeworCSAgICBmc19pbnN0ICppbnN0ID0gZW1pdChNT1YobCwgcikpOworCSAgICBpbnN0LT5wcmVkaWNhdGUgPSBwcmVkaWNhdGVkID8gQlJXX1BSRURJQ0FURV9OT1JNQUwgOiBCUldfUFJFRElDQVRFX05PTkU7CisJIH0KKworCSBsLnJlZ19vZmZzZXQrKzsKKwkgci5yZWdfb2Zmc2V0Kys7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xTTF9UWVBFX0FSUkFZOgorICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0eXBlLT5sZW5ndGg7IGkrKykgeworCSBlbWl0X2Fzc2lnbm1lbnRfd3JpdGVzKGwsIHIsIHR5cGUtPmZpZWxkcy5hcnJheSwgcHJlZGljYXRlZCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOgorICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0eXBlLT5sZW5ndGg7IGkrKykgeworCSBlbWl0X2Fzc2lnbm1lbnRfd3JpdGVzKGwsIHIsIHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSwKKwkJCQlwcmVkaWNhdGVkKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdMU0xfVFlQRV9TQU1QTEVSOgorICAgY2FzZSBHTFNMX1RZUEVfSU1BR0U6CisgICBjYXNlIEdMU0xfVFlQRV9BVE9NSUNfVUlOVDoKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICBjYXNlIEdMU0xfVFlQRV9JTlRFUkZBQ0U6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworICAgICAgYnJlYWs7CisgICB9Cit9CisKKy8qIElmIHRoZSBSSFMgcHJvY2Vzc2luZyByZXN1bHRlZCBpbiBhbiBpbnN0cnVjdGlvbiBnZW5lcmF0aW5nIGEKKyAqIHRlbXBvcmFyeSB2YWx1ZSwgYW5kIGl0IHdvdWxkIGJlIGVhc3kgdG8gcmV3cml0ZSB0aGUgaW5zdHJ1Y3Rpb24gdG8KKyAqIGdlbmVyYXRlIGl0cyByZXN1bHQgcmlnaHQgaW50byB0aGUgTEhTIGluc3RlYWQsIGRvIHNvLiAgVGhpcyBlbmRzCisgKiB1cCByZWxpYWJseSByZW1vdmluZyBpbnN0cnVjdGlvbnMgd2hlcmUgaXQgY2FuIGJlIHRyaWNreSB0byBkbyBzbworICogbGF0ZXIgd2l0aG91dCByZWFsIFVEIGNoYWluIGluZm9ybWF0aW9uLgorICovCitib29sCitmc192aXNpdG9yOjp0cnlfcmV3cml0ZV9yaHNfdG9fZHN0KGlyX2Fzc2lnbm1lbnQgKmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19pbnN0ICpwcmVfcmhzX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX2luc3QgKmxhc3RfcmhzX2luc3QpCit7CisgICAvKiBPbmx5IGF0dGVtcHQgaWYgd2UncmUgZG9pbmcgYSBkaXJlY3QgYXNzaWdubWVudC4gKi8KKyAgIGlmIChpci0+Y29uZGl0aW9uIHx8CisgICAgICAgIShpci0+bGhzLT50eXBlLT5pc19zY2FsYXIoKSB8fAorICAgICAgICAoaXItPmxocy0+dHlwZS0+aXNfdmVjdG9yKCkgJiYKKyAgICAgICAgIGlyLT53cml0ZV9tYXNrID09ICgxIDw8IGlyLT5saHMtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgLSAxKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIE1ha2Ugc3VyZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgb3VyIHNvdXJjZSByZWcuICovCisgICBmc19pbnN0ICptb2RpZnkgPSBnZXRfaW5zdHJ1Y3Rpb25fZ2VuZXJhdGluZ19yZWcocHJlX3Joc19pbnN0LAorCQkJCQkJICAgIGxhc3RfcmhzX2luc3QsCisJCQkJCQkgICAgc3JjKTsKKyAgIGlmICghbW9kaWZ5KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBJZiBsYXN0X3Joc19pbnN0IHdyb3RlIGEgZGlmZmVyZW50IG51bWJlciBvZiBjb21wb25lbnRzIHRoYW4gb3VyIExIUywKKyAgICAqIHdlIGNhbid0IHNhZmVseSByZXdyaXRlIGl0LgorICAgICovCisgICBpZiAodmlydHVhbF9ncmZfc2l6ZXNbZHN0LnJlZ10gIT0gbW9kaWZ5LT5yZWdzX3dyaXR0ZW4pCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIFN1Y2Nlc3MhICBSZXdyaXRlIHRoZSBpbnN0cnVjdGlvbi4gKi8KKyAgIG1vZGlmeS0+ZHN0ID0gZHN0OworCisgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6dmlzaXQoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBmc19yZWcgbCwgcjsKKyAgIGZzX2luc3QgKmluc3Q7CisKKyAgIC8qIEZJTklTSE1FOiBhcnJheXMgb24gdGhlIGxocyAqLworICAgaXItPmxocy0+YWNjZXB0KHRoaXMpOworICAgbCA9IHRoaXMtPnJlc3VsdDsKKworICAgZnNfaW5zdCAqcHJlX3Joc19pbnN0ID0gKGZzX2luc3QgKikgdGhpcy0+aW5zdHJ1Y3Rpb25zLmdldF90YWlsKCk7CisKKyAgIGlyLT5yaHMtPmFjY2VwdCh0aGlzKTsKKyAgIHIgPSB0aGlzLT5yZXN1bHQ7CisKKyAgIGZzX2luc3QgKmxhc3RfcmhzX2luc3QgPSAoZnNfaW5zdCAqKSB0aGlzLT5pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgYXNzZXJ0KGwuZmlsZSAhPSBCQURfRklMRSk7CisgICBhc3NlcnQoci5maWxlICE9IEJBRF9GSUxFKTsKKworICAgaWYgKHRyeV9yZXdyaXRlX3Joc190b19kc3QoaXIsIGwsIHIsIHByZV9yaHNfaW5zdCwgbGFzdF9yaHNfaW5zdCkpCisgICAgICByZXR1cm47CisKKyAgIGlmIChpci0+Y29uZGl0aW9uKSB7CisgICAgICBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyLT5jb25kaXRpb24pOworICAgfQorCisgICBpZiAoaXItPmxocy0+dHlwZS0+aXNfc2NhbGFyKCkgfHwKKyAgICAgICBpci0+bGhzLT50eXBlLT5pc192ZWN0b3IoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpci0+bGhzLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBpZiAoaXItPndyaXRlX21hc2sgJiAoMSA8PCBpKSkgeworCSAgICBpbnN0ID0gZW1pdChNT1YobCwgcikpOworCSAgICBpZiAoaXItPmNvbmRpdGlvbikKKwkgICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisJICAgIHIucmVnX29mZnNldCsrOworCSB9CisJIGwucmVnX29mZnNldCsrOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGVtaXRfYXNzaWdubWVudF93cml0ZXMobCwgciwgaXItPmxocy0+dHlwZSwgaXItPmNvbmRpdGlvbiAhPSBOVUxMKTsKKyAgIH0KK30KKworZnNfaW5zdCAqCitmc192aXNpdG9yOjplbWl0X3RleHR1cmVfZ2VuNChpcl90ZXh0dXJlICppciwgZnNfcmVnIGRzdCwgZnNfcmVnIGNvb3JkaW5hdGUsCisJCQkgICAgICBmc19yZWcgc2hhZG93X2MsIGZzX3JlZyBsb2QsIGZzX3JlZyBkUGR5KQoreworICAgaW50IG1sZW47CisgICBpbnQgYmFzZV9tcmYgPSAxOworICAgYm9vbCBzaW1kMTYgPSBmYWxzZTsKKyAgIGZzX3JlZyBvcmlnX2RzdDsKKworICAgLyogZzAgaGVhZGVyLiAqLworICAgbWxlbiA9IDE7CisKKyAgIGlmIChpci0+c2hhZG93X2NvbXBhcml0b3IpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXItPmNvb3JkaW5hdGUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiArIGkpLCBjb29yZGluYXRlKSk7CisJIGNvb3JkaW5hdGUucmVnX29mZnNldCsrOworICAgICAgfQorCisgICAgICAvKiBnZW40J3MgU0lNRDggc2FtcGxlciBhbHdheXMgaGFzIHRoZSBzbG90cyBmb3IgdSx2LHIgcHJlc2VudC4KKyAgICAgICAqIHRoZSB1bnVzZWQgc2xvdHMgbXVzdCBiZSB6ZXJvZWQuCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSBpci0+Y29vcmRpbmF0ZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4gKyBpKSwgZnNfcmVnKDAuMGYpKSk7CisgICAgICB9CisgICAgICBtbGVuICs9IDM7CisKKyAgICAgIGlmIChpci0+b3AgPT0gaXJfdGV4KSB7CisJIC8qIFRoZXJlJ3Mgbm8gcGxhaW4gc2hhZG93IGNvbXBhcmUgbWVzc2FnZSwgc28gd2UgdXNlIHNoYWRvdworCSAgKiBjb21wYXJlIHdpdGggYSBiaWFzIG9mIDAuMC4KKwkgICovCisJIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiksIGZzX3JlZygwLjBmKSkpOworCSBtbGVuKys7CisgICAgICB9IGVsc2UgaWYgKGlyLT5vcCA9PSBpcl90eGIgfHwgaXItPm9wID09IGlyX3R4bCkgeworCSBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4pLCBsb2QpKTsKKwkgbWxlbisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICB9CisKKyAgICAgIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiksIHNoYWRvd19jKSk7CisgICAgICBtbGVuKys7CisgICB9IGVsc2UgaWYgKGlyLT5vcCA9PSBpcl90ZXgpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXItPmNvb3JkaW5hdGUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiArIGkpLCBjb29yZGluYXRlKSk7CisJIGNvb3JkaW5hdGUucmVnX29mZnNldCsrOworICAgICAgfQorICAgICAgLyogemVybyB0aGUgb3RoZXJzLiAqLworICAgICAgZm9yIChpbnQgaSA9IGlyLT5jb29yZGluYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGk8MzsgaSsrKSB7CisgICAgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4gKyBpKSwgZnNfcmVnKDAuMGYpKSk7CisgICAgICB9CisgICAgICAvKiBnZW40J3MgU0lNRDggc2FtcGxlciBhbHdheXMgaGFzIHRoZSBzbG90cyBmb3IgdSx2LHIgcHJlc2VudC4gKi8KKyAgICAgIG1sZW4gKz0gMzsKKyAgIH0gZWxzZSBpZiAoaXItPm9wID09IGlyX3R4ZCkgeworICAgICAgZnNfcmVnICZkUGR4ID0gbG9kOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlyLT5jb29yZGluYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4gKyBpKSwgY29vcmRpbmF0ZSkpOworCSBjb29yZGluYXRlLnJlZ19vZmZzZXQrKzsKKyAgICAgIH0KKyAgICAgIC8qIHRoZSBzbG90cyBmb3IgdSBhbmQgdiBhcmUgYWx3YXlzIHByZXNlbnQsIGJ1dCByIGlzIG9wdGlvbmFsICovCisgICAgICBtbGVuICs9IE1BWDIoaXItPmNvb3JkaW5hdGUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cywgMik7CisKKyAgICAgIC8qICBQICAgPSB1LCB2LCByCisgICAgICAgKiBkUGR4ID0gZHVkeCwgZHZkeCwgZHJkeAorICAgICAgICogZFBkeSA9IGR1ZHksIGR2ZHksIGRyZHkKKyAgICAgICAqCisgICAgICAgKiAxLWFyZzogRG9lcyBub3QgZXhpc3QuCisgICAgICAgKgorICAgICAgICogMi1hcmc6IGR1ZHggICBkdmR4ICAgZHVkeSAgIGR2ZHkKKyAgICAgICAqICAgICAgICBkUGR4LnggZFBkeC55IGRQZHkueCBkUGR5LnkKKyAgICAgICAqICAgICAgICBtNCAgICAgbTUgICAgIG02ICAgICBtNworICAgICAgICoKKyAgICAgICAqIDMtYXJnOiBkdWR4ICAgZHZkeCAgIGRyZHggICBkdWR5ICAgZHZkeSAgIGRyZHkKKyAgICAgICAqICAgICAgICBkUGR4LnggZFBkeC55IGRQZHgueiBkUGR5LnggZFBkeS55IGRQZHkuegorICAgICAgICogICAgICAgIG01ICAgICBtNiAgICAgbTcgICAgIG04ICAgICBtOSAgICAgbTEwCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXItPmxvZF9pbmZvLmdyYWQuZFBkeC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKwkgZW1pdChNT1YoZnNfcmVnKE1SRiwgYmFzZV9tcmYgKyBtbGVuKSwgZFBkeCkpOworCSBkUGR4LnJlZ19vZmZzZXQrKzsKKyAgICAgIH0KKyAgICAgIG1sZW4gKz0gTUFYMihpci0+bG9kX2luZm8uZ3JhZC5kUGR4LT50eXBlLT52ZWN0b3JfZWxlbWVudHMsIDIpOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlyLT5sb2RfaW5mby5ncmFkLmRQZHktPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiksIGRQZHkpKTsKKwkgZFBkeS5yZWdfb2Zmc2V0Kys7CisgICAgICB9CisgICAgICBtbGVuICs9IE1BWDIoaXItPmxvZF9pbmZvLmdyYWQuZFBkeS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzLCAyKTsKKyAgIH0gZWxzZSBpZiAoaXItPm9wID09IGlyX3R4cykgeworICAgICAgLyogVGhlcmUncyBubyBTSU1EOCByZXNpbmZvIG1lc3NhZ2Ugb24gR2VuNC4gIFVzZSBTSU1EMTYgaW5zdGVhZC4gKi8KKyAgICAgIHNpbWQxNiA9IHRydWU7CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4sIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwgbG9kKSk7CisgICAgICBtbGVuICs9IDI7CisgICB9IGVsc2UgeworICAgICAgLyogT2ggam95LiAgZ2VuNCBkb2Vzbid0IGhhdmUgU0lNRDggbm9uLXNoYWRvdy1jb21wYXJlIGJpYXMvbG9kCisgICAgICAgKiBpbnN0cnVjdGlvbnMuICBXZSdsbCBuZWVkIHRvIGRvIFNJTUQxNiBoZXJlLgorICAgICAgICovCisgICAgICBzaW1kMTYgPSB0cnVlOworICAgICAgYXNzZXJ0KGlyLT5vcCA9PSBpcl90eGIgfHwgaXItPm9wID09IGlyX3R4bCB8fCBpci0+b3AgPT0gaXJfdHhmKTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpci0+Y29vcmRpbmF0ZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKwkgZW1pdChNT1YoZnNfcmVnKE1SRiwgYmFzZV9tcmYgKyBtbGVuICsgaSAqIDIsIGNvb3JkaW5hdGUudHlwZSksCisgICAgICAgICAgICAgICAgICBjb29yZGluYXRlKSk7CisJIGNvb3JkaW5hdGUucmVnX29mZnNldCsrOworICAgICAgfQorCisgICAgICAvKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHUvdi9yIHdpdGggMC4wLiAgRW1waXJpY2FsbHksIHRoaXMgc2VlbXMgdG8KKyAgICAgICAqIGJlIG5lY2Vzc2FyeSBmb3IgVFhGIChsZCksIGJ1dCBzZWVtcyB3aXNlIHRvIGRvIGZvciBhbGwgbWVzc2FnZXMuCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSBpci0+Y29vcmRpbmF0ZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpIDwgMzsgaSsrKSB7CisJIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiArIGkgKiAyKSwgZnNfcmVnKDAuMGYpKSk7CisgICAgICB9CisKKyAgICAgIC8qIGxvZC9iaWFzIGFwcGVhcnMgYWZ0ZXIgdS92L3IuICovCisgICAgICBtbGVuICs9IDY7CisKKyAgICAgIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiwgbG9kLnR5cGUpLCBsb2QpKTsKKyAgICAgIG1sZW4rKzsKKworICAgICAgLyogVGhlIHVudXNlZCB1cHBlciBoYWxmLiAqLworICAgICAgbWxlbisrOworICAgfQorCisgICBpZiAoc2ltZDE2KSB7CisgICAgICAvKiBOb3csIHNpbmNlIHdlJ3JlIGRvaW5nIHNpbWQxNiwgdGhlIHJldHVybiBpcyAyIGludGVybGVhdmVkCisgICAgICAgKiB2ZWM0cyB3aGVyZSB0aGUgb2RkLWluZGV4ZWQgb25lcyBhcmUganVuay4gV2UnbGwgbmVlZCB0byBtb3ZlCisgICAgICAgKiB0aGlzIHdlaXJkbmVzcyBhcm91bmQgdG8gdGhlIGV4cGVjdGVkIGxheW91dC4KKyAgICAgICAqLworICAgICAgb3JpZ19kc3QgPSBkc3Q7CisgICAgICBkc3QgPSBmc19yZWcoR1JGLCB2aXJ0dWFsX2dyZl9hbGxvYyg4KSwKKyAgICAgICAgICAgICAgICAgICAoYnJ3LT5pc19nNHggPworICAgICAgICAgICAgICAgICAgICBicndfdHlwZV9mb3JfYmFzZV90eXBlKGlyLT50eXBlKSA6CisgICAgICAgICAgICAgICAgICAgIEJSV19SRUdJU1RFUl9UWVBFX0YpKTsKKyAgIH0KKworICAgZnNfaW5zdCAqaW5zdCA9IE5VTEw7CisgICBzd2l0Y2ggKGlyLT5vcCkgeworICAgY2FzZSBpcl90ZXg6CisgICAgICBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RFWCwgZHN0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGI6CisgICAgICBpbnN0ID0gZW1pdChGU19PUENPREVfVFhCLCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4bDoKKyAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhMLCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4ZDoKKyAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhELCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4czoKKyAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhTLCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4ZjoKKyAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhGLCBkc3QpOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgZmFpbCgidW5yZWNvZ25pemVkIHRleHR1cmUgb3Bjb2RlIik7CisgICB9CisgICBpbnN0LT5iYXNlX21yZiA9IGJhc2VfbXJmOworICAgaW5zdC0+bWxlbiA9IG1sZW47CisgICBpbnN0LT5oZWFkZXJfcHJlc2VudCA9IHRydWU7CisgICBpbnN0LT5yZWdzX3dyaXR0ZW4gPSBzaW1kMTYgPyA4IDogNDsKKworICAgaWYgKHNpbWQxNikgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkgZW1pdChNT1Yob3JpZ19kc3QsIGRzdCkpOworCSBvcmlnX2RzdC5yZWdfb2Zmc2V0Kys7CisJIGRzdC5yZWdfb2Zmc2V0ICs9IDI7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBpbnN0OworfQorCisvKiBnZW41J3Mgc2FtcGxlciBoYXMgc2xvdHMgZm9yIHUsIHYsIHIsIGFycmF5IGluZGV4LCB0aGVuIG9wdGlvbmFsCisgKiBwYXJhbWV0ZXJzIGxpa2Ugc2hhZG93IGNvbXBhcml0b3Igb3IgTE9EIGJpYXMuICBJZiBvcHRpb25hbAorICogcGFyYW1ldGVycyBhcmVuJ3QgcHJlc2VudCwgdGhvc2UgYmFzZSBzbG90cyBhcmUgb3B0aW9uYWwgYW5kIGRvbid0CisgKiBuZWVkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBtZXNzYWdlLgorICoKKyAqIFdlIGRvbid0IGZpbGwgaW4gdGhlIHVubmVjZXNzYXJ5IHNsb3RzIHJlZ2FyZGxlc3MsIHdoaWNoIG1heSBsb29rCisgKiBzdXJwcmlzaW5nIGluIHRoZSBkaXNhc3NlbWJseS4KKyAqLworZnNfaW5zdCAqCitmc192aXNpdG9yOjplbWl0X3RleHR1cmVfZ2VuNShpcl90ZXh0dXJlICppciwgZnNfcmVnIGRzdCwgZnNfcmVnIGNvb3JkaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgc2hhZG93X2MsIGZzX3JlZyBsb2QsIGZzX3JlZyBsb2QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIHNhbXBsZV9pbmRleCkKK3sKKyAgIGludCBtbGVuID0gMDsKKyAgIGludCBiYXNlX21yZiA9IDI7CisgICBpbnQgcmVnX3dpZHRoID0gZGlzcGF0Y2hfd2lkdGggLyA4OworICAgYm9vbCBoZWFkZXJfcHJlc2VudCA9IGZhbHNlOworICAgY29uc3QgaW50IHZlY3Rvcl9lbGVtZW50cyA9CisgICAgICBpci0+Y29vcmRpbmF0ZSA/IGlyLT5jb29yZGluYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHMgOiAwOworCisgICBpZiAoaXItPm9mZnNldCkgeworICAgICAgLyogVGhlIG9mZnNldHMgc2V0IHVwIGJ5IHRoZSBpcl90ZXh0dXJlIHZpc2l0b3IgYXJlIGluIHRoZQorICAgICAgICogbTEgaGVhZGVyLCBzbyB3ZSBjYW4ndCBnbyBoZWFkZXJsZXNzLgorICAgICAgICovCisgICAgICBoZWFkZXJfcHJlc2VudCA9IHRydWU7CisgICAgICBtbGVuKys7CisgICAgICBiYXNlX21yZi0tOworICAgfQorCisgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4gKyBpICogcmVnX3dpZHRoLCBjb29yZGluYXRlLnR5cGUpLAorICAgICAgICAgICAgICAgY29vcmRpbmF0ZSkpOworICAgICAgY29vcmRpbmF0ZS5yZWdfb2Zmc2V0Kys7CisgICB9CisgICBtbGVuICs9IHZlY3Rvcl9lbGVtZW50cyAqIHJlZ193aWR0aDsKKworICAgaWYgKGlyLT5zaGFkb3dfY29tcGFyaXRvcikgeworICAgICAgbWxlbiA9IE1BWDIobWxlbiwgaGVhZGVyX3ByZXNlbnQgKyA0ICogcmVnX3dpZHRoKTsKKworICAgICAgZW1pdChNT1YoZnNfcmVnKE1SRiwgYmFzZV9tcmYgKyBtbGVuKSwgc2hhZG93X2MpKTsKKyAgICAgIG1sZW4gKz0gcmVnX3dpZHRoOworICAgfQorCisgICBmc19pbnN0ICppbnN0ID0gTlVMTDsKKyAgIHN3aXRjaCAoaXItPm9wKSB7CisgICBjYXNlIGlyX3RleDoKKyAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVEVYLCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4YjoKKyAgICAgIG1sZW4gPSBNQVgyKG1sZW4sIGhlYWRlcl9wcmVzZW50ICsgNCAqIHJlZ193aWR0aCk7CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4pLCBsb2QpKTsKKyAgICAgIG1sZW4gKz0gcmVnX3dpZHRoOworCisgICAgICBpbnN0ID0gZW1pdChGU19PUENPREVfVFhCLCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4bDoKKyAgICAgIG1sZW4gPSBNQVgyKG1sZW4sIGhlYWRlcl9wcmVzZW50ICsgNCAqIHJlZ193aWR0aCk7CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4pLCBsb2QpKTsKKyAgICAgIG1sZW4gKz0gcmVnX3dpZHRoOworCisgICAgICBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYTCwgZHN0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6IHsKKyAgICAgIG1sZW4gPSBNQVgyKG1sZW4sIGhlYWRlcl9wcmVzZW50ICsgNCAqIHJlZ193aWR0aCk7IC8qIHNraXAgb3ZlciAnYWknICovCisKKyAgICAgIC8qKgorICAgICAgICogIFAgICA9ICB1LCAgICB2LCAgICByCisgICAgICAgKiBkUGR4ID0gZHVkeCwgZHZkeCwgZHJkeAorICAgICAgICogZFBkeSA9IGR1ZHksIGR2ZHksIGRyZHkKKyAgICAgICAqCisgICAgICAgKiBMb2FkIHVwIHRoZXNlIHZhbHVlczoKKyAgICAgICAqIC0gZHVkeCAgIGR1ZHkgICBkdmR4ICAgZHZkeSAgIGRyZHggICBkcmR5CisgICAgICAgKiAtIGRQZHgueCBkUGR5LnggZFBkeC55IGRQZHkueSBkUGR4LnogZFBkeS56CisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXItPmxvZF9pbmZvLmdyYWQuZFBkeC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKwkgZW1pdChNT1YoZnNfcmVnKE1SRiwgYmFzZV9tcmYgKyBtbGVuKSwgbG9kKSk7CisJIGxvZC5yZWdfb2Zmc2V0Kys7CisJIG1sZW4gKz0gcmVnX3dpZHRoOworCisJIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiksIGxvZDIpKTsKKwkgbG9kMi5yZWdfb2Zmc2V0Kys7CisJIG1sZW4gKz0gcmVnX3dpZHRoOworICAgICAgfQorCisgICAgICBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYRCwgZHN0KTsKKyAgICAgIGJyZWFrOworICAgfQorICAgY2FzZSBpcl90eHM6CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4sIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwgbG9kKSk7CisgICAgICBtbGVuICs9IHJlZ193aWR0aDsKKyAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhTLCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3F1ZXJ5X2xldmVsczoKKyAgICAgIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBmc19yZWcoMHUpKSk7CisgICAgICBtbGVuICs9IHJlZ193aWR0aDsKKyAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhTLCBkc3QpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4ZjoKKyAgICAgIG1sZW4gPSBoZWFkZXJfcHJlc2VudCArIDQgKiByZWdfd2lkdGg7CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBiYXNlX21yZiArIG1sZW4gLSByZWdfd2lkdGgsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwgbG9kKSk7CisgICAgICBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYRiwgZHN0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGZfbXM6CisgICAgICBtbGVuID0gaGVhZGVyX3ByZXNlbnQgKyA0ICogcmVnX3dpZHRoOworCisgICAgICAvKiBsb2QgKi8KKyAgICAgIGVtaXQoTU9WKGZzX3JlZyhNUkYsIGJhc2VfbXJmICsgbWxlbiAtIHJlZ193aWR0aCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBmc19yZWcoMCkpKTsKKyAgICAgIC8qIHNhbXBsZSBpbmRleCAqLworICAgICAgZW1pdChNT1YoZnNfcmVnKE1SRiwgYmFzZV9tcmYgKyBtbGVuLCBCUldfUkVHSVNURVJfVFlQRV9VRCksIHNhbXBsZV9pbmRleCkpOworICAgICAgbWxlbiArPSByZWdfd2lkdGg7CisgICAgICBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYRl9DTVMsIGRzdCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfbG9kOgorICAgICAgaW5zdCA9IGVtaXQoU0hBREVSX09QQ09ERV9MT0QsIGRzdCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdGc0OgorICAgICAgaW5zdCA9IGVtaXQoU0hBREVSX09QQ09ERV9URzQsIGRzdCk7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBmYWlsKCJ1bnJlY29nbml6ZWQgdGV4dHVyZSBvcGNvZGUiKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgaW5zdC0+YmFzZV9tcmYgPSBiYXNlX21yZjsKKyAgIGluc3QtPm1sZW4gPSBtbGVuOworICAgaW5zdC0+aGVhZGVyX3ByZXNlbnQgPSBoZWFkZXJfcHJlc2VudDsKKyAgIGluc3QtPnJlZ3Nfd3JpdHRlbiA9IDQ7CisKKyAgIGlmIChtbGVuID4gTUFYX1NBTVBMRVJfTUVTU0FHRV9TSVpFKSB7CisgICAgICBmYWlsKCJNZXNzYWdlIGxlbmd0aCA+IiBTVFJJTkdJRlkoTUFYX1NBTVBMRVJfTUVTU0FHRV9TSVpFKQorICAgICAgICAgICAiIGRpc2FsbG93ZWQgYnkgaGFyZHdhcmVcbiIpOworICAgfQorCisgICByZXR1cm4gaW5zdDsKK30KKworZnNfaW5zdCAqCitmc192aXNpdG9yOjplbWl0X3RleHR1cmVfZ2VuNyhpcl90ZXh0dXJlICppciwgZnNfcmVnIGRzdCwgZnNfcmVnIGNvb3JkaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgc2hhZG93X2MsIGZzX3JlZyBsb2QsIGZzX3JlZyBsb2QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIHNhbXBsZV9pbmRleCwgZnNfcmVnIG1jcywgaW50IHNhbXBsZXIpCit7CisgICBpbnQgcmVnX3dpZHRoID0gZGlzcGF0Y2hfd2lkdGggLyA4OworICAgYm9vbCBoZWFkZXJfcHJlc2VudCA9IGZhbHNlOworCisgICBmc19yZWcgcGF5bG9hZCA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworICAgZnNfcmVnIG5leHQgPSBwYXlsb2FkOworCisgICBpZiAoaXItPm9wID09IGlyX3RnNCB8fCAoaXItPm9mZnNldCAmJiBpci0+b3AgIT0gaXJfdHhmKSB8fCBzYW1wbGVyID49IDE2KSB7CisgICAgICAvKiBGb3IgZ2VuZXJhbCB0ZXh0dXJlIG9mZnNldHMgKG5vIHR4ZiB3b3JrYXJvdW5kKSwgd2UgbmVlZCBhIGhlYWRlciB0bworICAgICAgICogcHV0IHRoZW0gaW4uICBOb3RlIHRoYXQgZm9yIFNJTUQxNiB3ZSdyZSBtYWtpbmcgc3BhY2UgZm9yIHR3byBhY3R1YWwKKyAgICAgICAqIGhhcmR3YXJlIHJlZ2lzdGVycyBoZXJlLCBzbyB0aGUgZW1pdCB3aWxsIGhhdmUgdG8gZml4IHVwIGZvciB0aGlzLgorICAgICAgICoKKyAgICAgICAqICogaXI0X3RnNCBuZWVkcyB0byBwbGFjZSBpdHMgY2hhbm5lbCBzZWxlY3QgaW4gdGhlIGhlYWRlciwKKyAgICAgICAqIGZvciBpbnRlcmFjdGlvbiB3aXRoIEFSQl90ZXh0dXJlX3N3aXp6bGUKKyAgICAgICAqCisgICAgICAgKiBUaGUgc2FtcGxlciBpbmRleCBpcyBvbmx5IDQtYml0cywgc28gZm9yIGxhcmdlciBzYW1wbGVyIG51bWJlcnMgd2UKKyAgICAgICAqIG5lZWQgdG8gb2Zmc2V0IHRoZSBTYW1wbGVyIFN0YXRlIFBvaW50ZXIgaW4gdGhlIGhlYWRlci4KKyAgICAgICAqLworICAgICAgaGVhZGVyX3ByZXNlbnQgPSB0cnVlOworICAgICAgbmV4dC5yZWdfb2Zmc2V0Kys7CisgICB9CisKKyAgIGlmIChpci0+c2hhZG93X2NvbXBhcml0b3IpIHsKKyAgICAgIGVtaXQoTU9WKG5leHQsIHNoYWRvd19jKSk7CisgICAgICBuZXh0LnJlZ19vZmZzZXQrKzsKKyAgIH0KKworICAgYm9vbCBoYXNfbm9uY29uc3RhbnRfb2Zmc2V0ID0gaXItPm9mZnNldCAmJiAhaXItPm9mZnNldC0+YXNfY29uc3RhbnQoKTsKKyAgIGJvb2wgY29vcmRpbmF0ZV9kb25lID0gZmFsc2U7CisKKyAgIC8qIFNldCB1cCB0aGUgTE9EIGluZm8gKi8KKyAgIHN3aXRjaCAoaXItPm9wKSB7CisgICBjYXNlIGlyX3RleDoKKyAgIGNhc2UgaXJfbG9kOgorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4YjoKKyAgICAgIGVtaXQoTU9WKG5leHQsIGxvZCkpOworICAgICAgbmV4dC5yZWdfb2Zmc2V0Kys7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhsOgorICAgICAgZW1pdChNT1YobmV4dCwgbG9kKSk7CisgICAgICBuZXh0LnJlZ19vZmZzZXQrKzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6IHsKKyAgICAgIG5vMTYoIkdlbjcgZG9lcyBub3Qgc3VwcG9ydCBzYW1wbGVfZC9zYW1wbGVfZF9jIGluIFNJTUQxNiBtb2RlLiIpOworCisgICAgICAvKiBMb2FkIGRQZHggYW5kIHRoZSBjb29yZGluYXRlIHRvZ2V0aGVyOgorICAgICAgICogW2hkcl0sIFtyZWZdLCB4LCBkUGR4LngsIGRQZHkueCwgeSwgZFBkeC55LCBkUGR5LnksIHosIGRQZHgueiwgZFBkeS56CisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXItPmNvb3JkaW5hdGUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisJIGVtaXQoTU9WKG5leHQsIGNvb3JkaW5hdGUpKTsKKwkgY29vcmRpbmF0ZS5yZWdfb2Zmc2V0Kys7CisJIG5leHQucmVnX29mZnNldCsrOworCisgICAgICAgICAvKiBGb3IgY3ViZSBtYXAgYXJyYXksIHRoZSBjb29yZGluYXRlIGlzICh1LHYscixhaSkgYnV0IHRoZXJlIGFyZQorICAgICAgICAgICogb25seSBkZXJpdmF0aXZlcyBmb3IgKHUsIHYsIHIpLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoaSA8IGlyLT5sb2RfaW5mby5ncmFkLmRQZHgtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgeworICAgICAgICAgICAgZW1pdChNT1YobmV4dCwgbG9kKSk7CisgICAgICAgICAgICBsb2QucmVnX29mZnNldCsrOworICAgICAgICAgICAgbmV4dC5yZWdfb2Zmc2V0Kys7CisKKyAgICAgICAgICAgIGVtaXQoTU9WKG5leHQsIGxvZDIpKTsKKyAgICAgICAgICAgIGxvZDIucmVnX29mZnNldCsrOworICAgICAgICAgICAgbmV4dC5yZWdfb2Zmc2V0Kys7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvb3JkaW5hdGVfZG9uZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgIH0KKyAgIGNhc2UgaXJfdHhzOgorICAgICAgZW1pdChNT1YocmV0eXBlKG5leHQsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwgbG9kKSk7CisgICAgICBuZXh0LnJlZ19vZmZzZXQrKzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9xdWVyeV9sZXZlbHM6CisgICAgICBlbWl0KE1PVihyZXR5cGUobmV4dCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBmc19yZWcoMHUpKSk7CisgICAgICBuZXh0LnJlZ19vZmZzZXQrKzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGY6CisgICAgICAvKiBVbmZvcnR1bmF0ZWx5LCB0aGUgcGFyYW1ldGVycyBmb3IgTEQgYXJlIGludGVybWl4ZWQ6IHUsIGxvZCwgdiwgci4gKi8KKyAgICAgIGVtaXQoTU9WKHJldHlwZShuZXh0LCBCUldfUkVHSVNURVJfVFlQRV9EKSwgY29vcmRpbmF0ZSkpOworICAgICAgY29vcmRpbmF0ZS5yZWdfb2Zmc2V0Kys7CisgICAgICBuZXh0LnJlZ19vZmZzZXQrKzsKKworICAgICAgZW1pdChNT1YocmV0eXBlKG5leHQsIEJSV19SRUdJU1RFUl9UWVBFX0QpLCBsb2QpKTsKKyAgICAgIG5leHQucmVnX29mZnNldCsrOworCisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGlyLT5jb29yZGluYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworCSBlbWl0KE1PVihyZXR5cGUobmV4dCwgQlJXX1JFR0lTVEVSX1RZUEVfRCksIGNvb3JkaW5hdGUpKTsKKwkgY29vcmRpbmF0ZS5yZWdfb2Zmc2V0Kys7CisJIG5leHQucmVnX29mZnNldCsrOworICAgICAgfQorCisgICAgICBjb29yZGluYXRlX2RvbmUgPSB0cnVlOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4Zl9tczoKKyAgICAgIGVtaXQoTU9WKHJldHlwZShuZXh0LCBCUldfUkVHSVNURVJfVFlQRV9VRCksIHNhbXBsZV9pbmRleCkpOworICAgICAgbmV4dC5yZWdfb2Zmc2V0Kys7CisKKyAgICAgIC8qIGRhdGEgZnJvbSB0aGUgbXVsdGlzYW1wbGUgY29udHJvbCBzdXJmYWNlICovCisgICAgICBlbWl0KE1PVihyZXR5cGUobmV4dCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBtY3MpKTsKKyAgICAgIG5leHQucmVnX29mZnNldCsrOworCisgICAgICAvKiB0aGVyZSBpcyBubyBvZmZzZXR0aW5nIGZvciB0aGlzIG1lc3NhZ2U7IGp1c3QgY29weSBpbiB0aGUgaW50ZWdlcgorICAgICAgICogdGV4dHVyZSBjb29yZGluYXRlcworICAgICAgICovCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlyLT5jb29yZGluYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgICAgZW1pdChNT1YocmV0eXBlKG5leHQsIEJSV19SRUdJU1RFUl9UWVBFX0QpLCBjb29yZGluYXRlKSk7CisgICAgICAgICBjb29yZGluYXRlLnJlZ19vZmZzZXQrKzsKKyAgICAgICAgIG5leHQucmVnX29mZnNldCsrOworICAgICAgfQorCisgICAgICBjb29yZGluYXRlX2RvbmUgPSB0cnVlOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3RnNDoKKyAgICAgIGlmIChoYXNfbm9uY29uc3RhbnRfb2Zmc2V0KSB7CisgICAgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKQorICAgICAgICAgICAgbm8xNigiR2VuNyBkb2VzIG5vdCBzdXBwb3J0IGdhdGhlcjRfcG9fYyBpbiBTSU1EMTYgbW9kZS4iKTsKKworICAgICAgICAgLyogTW9yZSBjcmF6eSBpbnRlcm1peGluZyAqLworICAgICAgICAgaXItPm9mZnNldC0+YWNjZXB0KHRoaXMpOworICAgICAgICAgZnNfcmVnIG9mZnNldF92YWx1ZSA9IHRoaXMtPnJlc3VsdDsKKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsgLyogdSwgdiAqLworICAgICAgICAgICAgZW1pdChNT1YobmV4dCwgY29vcmRpbmF0ZSkpOworICAgICAgICAgICAgY29vcmRpbmF0ZS5yZWdfb2Zmc2V0Kys7CisgICAgICAgICAgICBuZXh0LnJlZ19vZmZzZXQrKzsKKyAgICAgICAgIH0KKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsgLyogb2ZmdSwgb2ZmdiAqLworICAgICAgICAgICAgZW1pdChNT1YocmV0eXBlKG5leHQsIEJSV19SRUdJU1RFUl9UWVBFX0QpLCBvZmZzZXRfdmFsdWUpKTsKKyAgICAgICAgICAgIG9mZnNldF92YWx1ZS5yZWdfb2Zmc2V0Kys7CisgICAgICAgICAgICBuZXh0LnJlZ19vZmZzZXQrKzsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGlyLT5jb29yZGluYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHMgPT0gMykgeyAvKiByIGlmIHByZXNlbnQgKi8KKyAgICAgICAgICAgIGVtaXQoTU9WKG5leHQsIGNvb3JkaW5hdGUpKTsKKyAgICAgICAgICAgIGNvb3JkaW5hdGUucmVnX29mZnNldCsrOworICAgICAgICAgICAgbmV4dC5yZWdfb2Zmc2V0Kys7CisgICAgICAgICB9CisKKyAgICAgICAgIGNvb3JkaW5hdGVfZG9uZSA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgLyogU2V0IHVwIHRoZSBjb29yZGluYXRlIChleGNlcHQgZm9yIGNhc2VzIHdoZXJlIGl0IHdhcyBkb25lIGFib3ZlKSAqLworICAgaWYgKGlyLT5jb29yZGluYXRlICYmICFjb29yZGluYXRlX2RvbmUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXItPmNvb3JkaW5hdGUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICAgICBlbWl0KE1PVihuZXh0LCBjb29yZGluYXRlKSk7CisgICAgICAgICBjb29yZGluYXRlLnJlZ19vZmZzZXQrKzsKKyAgICAgICAgIG5leHQucmVnX29mZnNldCsrOworICAgICAgfQorICAgfQorCisgICAvKiBHZW5lcmF0ZSB0aGUgU0VORCAqLworICAgZnNfaW5zdCAqaW5zdCA9IE5VTEw7CisgICBzd2l0Y2ggKGlyLT5vcCkgeworICAgY2FzZSBpcl90ZXg6IGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVEVYLCBkc3QsIHBheWxvYWQpOyBicmVhazsKKyAgIGNhc2UgaXJfdHhiOiBpbnN0ID0gZW1pdChGU19PUENPREVfVFhCLCBkc3QsIHBheWxvYWQpOyBicmVhazsKKyAgIGNhc2UgaXJfdHhsOiBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYTCwgZHN0LCBwYXlsb2FkKTsgYnJlYWs7CisgICBjYXNlIGlyX3R4ZDogaW5zdCA9IGVtaXQoU0hBREVSX09QQ09ERV9UWEQsIGRzdCwgcGF5bG9hZCk7IGJyZWFrOworICAgY2FzZSBpcl90eGY6IGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhGLCBkc3QsIHBheWxvYWQpOyBicmVhazsKKyAgIGNhc2UgaXJfdHhmX21zOiBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYRl9DTVMsIGRzdCwgcGF5bG9hZCk7IGJyZWFrOworICAgY2FzZSBpcl90eHM6IGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVFhTLCBkc3QsIHBheWxvYWQpOyBicmVhazsKKyAgIGNhc2UgaXJfcXVlcnlfbGV2ZWxzOiBpbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYUywgZHN0LCBwYXlsb2FkKTsgYnJlYWs7CisgICBjYXNlIGlyX2xvZDogaW5zdCA9IGVtaXQoU0hBREVSX09QQ09ERV9MT0QsIGRzdCwgcGF5bG9hZCk7IGJyZWFrOworICAgY2FzZSBpcl90ZzQ6CisgICAgICBpZiAoaGFzX25vbmNvbnN0YW50X29mZnNldCkKKyAgICAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVEc0X09GRlNFVCwgZHN0LCBwYXlsb2FkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGluc3QgPSBlbWl0KFNIQURFUl9PUENPREVfVEc0LCBkc3QsIHBheWxvYWQpOworICAgICAgYnJlYWs7CisgICB9CisgICBpbnN0LT5iYXNlX21yZiA9IC0xOworICAgaWYgKHJlZ193aWR0aCA9PSAyKQorICAgICAgaW5zdC0+bWxlbiA9IG5leHQucmVnX29mZnNldCAqIHJlZ193aWR0aCAtIGhlYWRlcl9wcmVzZW50OworICAgZWxzZQorICAgICAgaW5zdC0+bWxlbiA9IG5leHQucmVnX29mZnNldCAqIHJlZ193aWR0aDsKKyAgIGluc3QtPmhlYWRlcl9wcmVzZW50ID0gaGVhZGVyX3ByZXNlbnQ7CisgICBpbnN0LT5yZWdzX3dyaXR0ZW4gPSA0OworCisgICB2aXJ0dWFsX2dyZl9zaXplc1twYXlsb2FkLnJlZ10gPSBuZXh0LnJlZ19vZmZzZXQ7CisgICBpZiAoaW5zdC0+bWxlbiA+IE1BWF9TQU1QTEVSX01FU1NBR0VfU0laRSkgeworICAgICAgZmFpbCgiTWVzc2FnZSBsZW5ndGggPiIgU1RSSU5HSUZZKE1BWF9TQU1QTEVSX01FU1NBR0VfU0laRSkKKyAgICAgICAgICAgIiBkaXNhbGxvd2VkIGJ5IGhhcmR3YXJlXG4iKTsKKyAgIH0KKworICAgcmV0dXJuIGluc3Q7Cit9CisKK2ZzX3JlZworZnNfdmlzaXRvcjo6cmVzY2FsZV90ZXhjb29yZChpcl90ZXh0dXJlICppciwgZnNfcmVnIGNvb3JkaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVjdCwgaW50IHNhbXBsZXIsIGludCB0ZXh1bml0KQoreworICAgZnNfaW5zdCAqaW5zdCA9IE5VTEw7CisgICBib29sIG5lZWRzX2dsX2NsYW1wID0gdHJ1ZTsKKyAgIGZzX3JlZyBzY2FsZV94LCBzY2FsZV95OworCisgICAvKiBUaGUgOTY1IHJlcXVpcmVzIHRoZSBFVSB0byBkbyB0aGUgbm9ybWFsaXphdGlvbiBvZiBHTCByZWN0YW5nbGUKKyAgICAqIHRleHR1cmUgY29vcmRpbmF0ZXMuICBXZSB1c2UgdGhlIHByb2dyYW0gcGFyYW1ldGVyIHN0YXRlCisgICAgKiB0cmFja2luZyB0byBnZXQgdGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICovCisgICBpZiAoaXNfcmVjdCAmJgorICAgICAgIChicnctPmdlbiA8IDYgfHwKKwkoYnJ3LT5nZW4gPj0gNiAmJiAoYy0+a2V5LnRleC5nbF9jbGFtcF9tYXNrWzBdICYgKDEgPDwgc2FtcGxlcikgfHwKKwkJCSAgICAgYy0+a2V5LnRleC5nbF9jbGFtcF9tYXNrWzFdICYgKDEgPDwgc2FtcGxlcikpKSkpIHsKKyAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcl9saXN0ICpwYXJhbXMgPSBwcm9nLT5QYXJhbWV0ZXJzOworICAgICAgaW50IHRva2Vuc1tTVEFURV9MRU5HVEhdID0geworCSBTVEFURV9JTlRFUk5BTCwKKwkgU1RBVEVfVEVYUkVDVF9TQ0FMRSwKKwkgdGV4dW5pdCwKKwkgMCwKKwkgMAorICAgICAgfTsKKworICAgICAgbm8xNigicmVjdGFuZ2xlIHNjYWxlIHVuaWZvcm0gc2V0dXAgbm90IHN1cHBvcnRlZCBvbiBTSU1EMTZcbiIpOworICAgICAgaWYgKGRpc3BhdGNoX3dpZHRoID09IDE2KSB7CisJIHJldHVybiBjb29yZGluYXRlOworICAgICAgfQorCisgICAgICBHTHVpbnQgaW5kZXggPSBfbWVzYV9hZGRfc3RhdGVfcmVmZXJlbmNlKHBhcmFtcywKKwkJCQkJICAgICAgIChnbF9zdGF0ZV9pbmRleCAqKXRva2Vucyk7CisgICAgICAvKiBUcnkgdG8gZmluZCBleGlzdGluZyBjb3BpZXMgb2YgdGhlIHRleHJlY3Qgc2NhbGUgdW5pZm9ybXMuICovCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdW5pZm9ybXM7IGkrKykgeworICAgICAgICAgaWYgKHN0YWdlX3Byb2dfZGF0YS0+cGFyYW1baV0gPT0KKyAgICAgICAgICAgICAmcHJvZy0+UGFyYW1ldGVycy0+UGFyYW1ldGVyVmFsdWVzW2luZGV4XVswXS5mKSB7CisgICAgICAgICAgICBzY2FsZV94ID0gZnNfcmVnKFVOSUZPUk0sIGkpOworICAgICAgICAgICAgc2NhbGVfeSA9IGZzX3JlZyhVTklGT1JNLCBpICsgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogSWYgd2UgZGlkbid0IGFscmVhZHkgc2V0IHRoZW0gdXAsIGRvIHNvIG5vdy4gKi8KKyAgICAgIGlmIChzY2FsZV94LmZpbGUgPT0gQkFEX0ZJTEUpIHsKKyAgICAgICAgIHNjYWxlX3ggPSBmc19yZWcoVU5JRk9STSwgdW5pZm9ybXMpOworICAgICAgICAgc2NhbGVfeSA9IGZzX3JlZyhVTklGT1JNLCB1bmlmb3JtcyArIDEpOworCisgICAgICAgICBzdGFnZV9wcm9nX2RhdGEtPnBhcmFtW3VuaWZvcm1zKytdID0KKyAgICAgICAgICAgICZwcm9nLT5QYXJhbWV0ZXJzLT5QYXJhbWV0ZXJWYWx1ZXNbaW5kZXhdWzBdLmY7CisgICAgICAgICBzdGFnZV9wcm9nX2RhdGEtPnBhcmFtW3VuaWZvcm1zKytdID0KKyAgICAgICAgICAgICZwcm9nLT5QYXJhbWV0ZXJzLT5QYXJhbWV0ZXJWYWx1ZXNbaW5kZXhdWzFdLmY7CisgICAgICB9CisgICB9CisKKyAgIC8qIFRoZSA5NjUgcmVxdWlyZXMgdGhlIEVVIHRvIGRvIHRoZSBub3JtYWxpemF0aW9uIG9mIEdMIHJlY3RhbmdsZQorICAgICogdGV4dHVyZSBjb29yZGluYXRlcy4gIFdlIHVzZSB0aGUgcHJvZ3JhbSBwYXJhbWV0ZXIgc3RhdGUKKyAgICAqIHRyYWNraW5nIHRvIGdldCB0aGUgc2NhbGluZyBmYWN0b3IuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA8IDYgJiYgaXNfcmVjdCkgeworICAgICAgZnNfcmVnIGRzdCA9IGZzX3JlZyh0aGlzLCBpci0+Y29vcmRpbmF0ZS0+dHlwZSk7CisgICAgICBmc19yZWcgc3JjID0gY29vcmRpbmF0ZTsKKyAgICAgIGNvb3JkaW5hdGUgPSBkc3Q7CisKKyAgICAgIGVtaXQoTVVMKGRzdCwgc3JjLCBzY2FsZV94KSk7CisgICAgICBkc3QucmVnX29mZnNldCsrOworICAgICAgc3JjLnJlZ19vZmZzZXQrKzsKKyAgICAgIGVtaXQoTVVMKGRzdCwgc3JjLCBzY2FsZV95KSk7CisgICB9IGVsc2UgaWYgKGlzX3JlY3QpIHsKKyAgICAgIC8qIE9uIGdlbjYrLCB0aGUgc2FtcGxlciBoYW5kbGVzIHRoZSByZWN0YW5nbGUgY29vcmRpbmF0ZXMKKyAgICAgICAqIG5hdGl2ZWx5LCB3aXRob3V0IG5lZWRpbmcgcmVzY2FsaW5nLiAgQnV0IHRoYXQgbWVhbnMgd2UgaGF2ZQorICAgICAgICogdG8gZG8gR0xfQ0xBTVAgY2xhbXBpbmcgYXQgdGhlIFswLCB3aWR0aF0sIFswLCBoZWlnaHRdIHNjYWxlLAorICAgICAgICogbm90IFswLCAxXSBsaWtlIHRoZSBkZWZhdWx0IGNhc2UgYmVsb3cuCisgICAgICAgKi8KKyAgICAgIG5lZWRzX2dsX2NsYW1wID0gZmFsc2U7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJIGlmIChjLT5rZXkudGV4LmdsX2NsYW1wX21hc2tbaV0gJiAoMSA8PCBzYW1wbGVyKSkgeworCSAgICBmc19yZWcgY2hhbiA9IGNvb3JkaW5hdGU7CisJICAgIGNoYW4ucmVnX29mZnNldCArPSBpOworCisJICAgIGluc3QgPSBlbWl0KEJSV19PUENPREVfU0VMLCBjaGFuLCBjaGFuLCBmc19yZWcoMC4wZikpOworCSAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfRzsKKworCSAgICAvKiBPdXIgcGFyYW1ldGVyIGNvbWVzIGluIGFzIDEuMC93aWR0aCBvciAxLjAvaGVpZ2h0LAorCSAgICAgKiBiZWNhdXNlIHRoYXQncyB3aGF0IHBlb3BsZSBub3JtYWxseSB3YW50IGZvciBkb2luZworCSAgICAgKiB0ZXh0dXJlIHJlY3RhbmdsZSBoYW5kbGluZy4gIFdlIG5lZWQgd2lkdGggb3IgaGVpZ2h0CisJICAgICAqIGZvciBjbGFtcGluZywgYnV0IHdlIGRvbid0IGNhcmUgZW5vdWdoIHRvIG1ha2UgYSBuZXcKKwkgICAgICogcGFyYW1ldGVyIHR5cGUsIHNvIGp1c3QgaW52ZXJ0IGJhY2suCisJICAgICAqLworCSAgICBmc19yZWcgbGltaXQgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKwkgICAgZW1pdChNT1YobGltaXQsIGkgPT0gMCA/IHNjYWxlX3ggOiBzY2FsZV95KSk7CisJICAgIGVtaXQoU0hBREVSX09QQ09ERV9SQ1AsIGxpbWl0LCBsaW1pdCk7CisKKwkgICAgaW5zdCA9IGVtaXQoQlJXX09QQ09ERV9TRUwsIGNoYW4sIGNoYW4sIGxpbWl0KTsKKwkgICAgaW5zdC0+Y29uZGl0aW9uYWxfbW9kID0gQlJXX0NPTkRJVElPTkFMX0w7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGlyLT5jb29yZGluYXRlICYmIG5lZWRzX2dsX2NsYW1wKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsKKwkgICBpIDwgTUlOMihpci0+Y29vcmRpbmF0ZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzLCAzKTsgaSsrKSB7CisJIGlmIChjLT5rZXkudGV4LmdsX2NsYW1wX21hc2tbaV0gJiAoMSA8PCBzYW1wbGVyKSkgeworCSAgICBmc19yZWcgY2hhbiA9IGNvb3JkaW5hdGU7CisJICAgIGNoYW4ucmVnX29mZnNldCArPSBpOworCisJICAgIGZzX2luc3QgKmluc3QgPSBlbWl0KE1PVihjaGFuLCBjaGFuKSk7CisJICAgIGluc3QtPnNhdHVyYXRlID0gdHJ1ZTsKKwkgfQorICAgICAgfQorICAgfQorICAgcmV0dXJuIGNvb3JkaW5hdGU7Cit9CisKKy8qIFNhbXBsZSBmcm9tIHRoZSBNQ1Mgc3VyZmFjZSBhdHRhY2hlZCB0byB0aGlzIG11bHRpc2FtcGxlIHRleHR1cmUuICovCitmc19yZWcKK2ZzX3Zpc2l0b3I6OmVtaXRfbWNzX2ZldGNoKGlyX3RleHR1cmUgKmlyLCBmc19yZWcgY29vcmRpbmF0ZSwgaW50IHNhbXBsZXIpCit7CisgICBpbnQgcmVnX3dpZHRoID0gZGlzcGF0Y2hfd2lkdGggLyA4OworICAgZnNfcmVnIHBheWxvYWQgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgIGZzX3JlZyBkZXN0ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSk7CisgICBmc19yZWcgbmV4dCA9IHBheWxvYWQ7CisKKyAgIC8qIHBhcmFtZXRlcnMgYXJlOiB1LCB2LCByLCBsb2Q7IG1pc3NpbmcgcGFyYW1ldGVycyBhcmUgdHJlYXRlZCBhcyB6ZXJvICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IGlyLT5jb29yZGluYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgZW1pdChNT1YocmV0eXBlKG5leHQsIEJSV19SRUdJU1RFUl9UWVBFX0QpLCBjb29yZGluYXRlKSk7CisgICAgICBjb29yZGluYXRlLnJlZ19vZmZzZXQrKzsKKyAgICAgIG5leHQucmVnX29mZnNldCsrOworICAgfQorCisgICBmc19pbnN0ICppbnN0ID0gZW1pdChTSEFERVJfT1BDT0RFX1RYRl9NQ1MsIGRlc3QsIHBheWxvYWQpOworICAgdmlydHVhbF9ncmZfc2l6ZXNbcGF5bG9hZC5yZWddID0gbmV4dC5yZWdfb2Zmc2V0OworICAgaW5zdC0+YmFzZV9tcmYgPSAtMTsKKyAgIGluc3QtPm1sZW4gPSBuZXh0LnJlZ19vZmZzZXQgKiByZWdfd2lkdGg7CisgICBpbnN0LT5oZWFkZXJfcHJlc2VudCA9IGZhbHNlOworICAgaW5zdC0+cmVnc193cml0dGVuID0gNDsgLyogd2Ugb25seSBjYXJlIGFib3V0IG9uZSByZWcgb2YgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidXQgdGhlIHNhbXBsZXIgYWx3YXlzIHdyaXRlcyA0LzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgaW5zdC0+c2FtcGxlciA9IHNhbXBsZXI7CisKKyAgIHJldHVybiBkZXN0OworfQorCit2b2lkCitmc192aXNpdG9yOjp2aXNpdChpcl90ZXh0dXJlICppcikKK3sKKyAgIGZzX2luc3QgKmluc3QgPSBOVUxMOworCisgICBpbnQgc2FtcGxlciA9IF9tZXNhX2dldF9zYW1wbGVyX3VuaWZvcm1fdmFsdWUoaXItPnNhbXBsZXIsIHNoYWRlcl9wcm9nLCBwcm9nKTsKKworICAgLyogRklOSVNITUU6IFdlJ3JlIGZhaWxpbmcgdG8gcmVjb21waWxlIG91ciBwcm9ncmFtcyB3aGVuIHRoZSBzYW1wbGVyIGlzCisgICAgKiB1cGRhdGVkLiAgVGhpcyBvbmx5IG1hdHRlcnMgZm9yIHRoZSB0ZXh0dXJlIHJlY3RhbmdsZSBzY2FsZSBwYXJhbWV0ZXJzCisgICAgKiAocHJlLWdlbjYsIG9yIGdlbjYrIHdpdGggR0xfQ0xBTVApLgorICAgICovCisKKyAgIGludCB0ZXh1bml0ID0gcHJvZy0+U2FtcGxlclVuaXRzW3NhbXBsZXJdOworCisgICBpZiAoaXItPm9wID09IGlyX3RnNCkgeworICAgICAgLyogV2hlbiB0ZzQgaXMgdXNlZCB3aXRoIHRoZSBkZWdlbmVyYXRlIFpFUk8vT05FIHN3aXp6bGVzLCBkb24ndCBib3RoZXIKKyAgICAgICAqIGVtaXR0aW5nIGFueXRoaW5nIG90aGVyIHRoYW4gc2V0dGluZyB1cCB0aGUgY29uc3RhbnQgcmVzdWx0LgorICAgICAgICovCisgICAgICBpcl9jb25zdGFudCAqY2hhbiA9IGlyLT5sb2RfaW5mby5jb21wb25lbnQtPmFzX2NvbnN0YW50KCk7CisgICAgICBpbnQgc3dpeiA9IEdFVF9TV1ooYy0+a2V5LnRleC5zd2l6emxlc1tzYW1wbGVyXSwgY2hhbi0+dmFsdWUuaVswXSk7CisgICAgICBpZiAoc3dpeiA9PSBTV0laWkxFX1pFUk8gfHwgc3dpeiA9PSBTV0laWkxFX09ORSkgeworCisgICAgICAgICBmc19yZWcgcmVzID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgICAgICAgIHRoaXMtPnJlc3VsdCA9IHJlczsKKworICAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgZW1pdChNT1YocmVzLCBmc19yZWcoc3dpeiA9PSBTV0laWkxFX1pFUk8gPyAwLjBmIDogMS4wZikpKTsKKyAgICAgICAgICAgIHJlcy5yZWdfb2Zmc2V0Kys7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIC8qIFNob3VsZCBiZSBsb3dlcmVkIGJ5IGRvX2xvd2VyX3RleHR1cmVfcHJvamVjdGlvbiAqLworICAgYXNzZXJ0KCFpci0+cHJvamVjdG9yKTsKKworICAgLyogU2hvdWxkIGJlIGxvd2VyZWQgKi8KKyAgIGFzc2VydCghaXItPm9mZnNldCB8fCAhaXItPm9mZnNldC0+dHlwZS0+aXNfYXJyYXkoKSk7CisKKyAgIC8qIEdlbmVyYXRlIGNvZGUgdG8gY29tcHV0ZSBhbGwgdGhlIHN1YmV4cHJlc3Npb24gdHJlZXMuICBUaGlzIGhhcyB0byBiZQorICAgICogZG9uZSBiZWZvcmUgbG9hZGluZyBhbnkgdmFsdWVzIGludG8gTVJGcyBmb3IgdGhlIHNhbXBsZXIgbWVzc2FnZSBzaW5jZQorICAgICogZ2VuZXJhdGluZyB0aGVzZSB2YWx1ZXMgbWF5IGludm9sdmUgU0VORCBtZXNzYWdlcyB0aGF0IG5lZWQgdGhlIE1SRnMuCisgICAgKi8KKyAgIGZzX3JlZyBjb29yZGluYXRlOworICAgaWYgKGlyLT5jb29yZGluYXRlKSB7CisgICAgICBpci0+Y29vcmRpbmF0ZS0+YWNjZXB0KHRoaXMpOworCisgICAgICBjb29yZGluYXRlID0gcmVzY2FsZV90ZXhjb29yZChpciwgdGhpcy0+cmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXItPnNhbXBsZXItPnR5cGUtPnNhbXBsZXJfZGltZW5zaW9uYWxpdHkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsIHRleHVuaXQpOworICAgfQorCisgICBmc19yZWcgc2hhZG93X2NvbXBhcml0b3I7CisgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKSB7CisgICAgICBpci0+c2hhZG93X2NvbXBhcml0b3ItPmFjY2VwdCh0aGlzKTsKKyAgICAgIHNoYWRvd19jb21wYXJpdG9yID0gdGhpcy0+cmVzdWx0OworICAgfQorCisgICBmc19yZWcgbG9kLCBsb2QyLCBzYW1wbGVfaW5kZXgsIG1jczsKKyAgIHN3aXRjaCAoaXItPm9wKSB7CisgICBjYXNlIGlyX3RleDoKKyAgIGNhc2UgaXJfbG9kOgorICAgY2FzZSBpcl90ZzQ6CisgICBjYXNlIGlyX3F1ZXJ5X2xldmVsczoKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGI6CisgICAgICBpci0+bG9kX2luZm8uYmlhcy0+YWNjZXB0KHRoaXMpOworICAgICAgbG9kID0gdGhpcy0+cmVzdWx0OworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4ZDoKKyAgICAgIGlyLT5sb2RfaW5mby5ncmFkLmRQZHgtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGxvZCA9IHRoaXMtPnJlc3VsdDsKKworICAgICAgaXItPmxvZF9pbmZvLmdyYWQuZFBkeS0+YWNjZXB0KHRoaXMpOworICAgICAgbG9kMiA9IHRoaXMtPnJlc3VsdDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGY6CisgICBjYXNlIGlyX3R4bDoKKyAgIGNhc2UgaXJfdHhzOgorICAgICAgaXItPmxvZF9pbmZvLmxvZC0+YWNjZXB0KHRoaXMpOworICAgICAgbG9kID0gdGhpcy0+cmVzdWx0OworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4Zl9tczoKKyAgICAgIGlyLT5sb2RfaW5mby5zYW1wbGVfaW5kZXgtPmFjY2VwdCh0aGlzKTsKKyAgICAgIHNhbXBsZV9pbmRleCA9IHRoaXMtPnJlc3VsdDsKKworICAgICAgaWYgKGJydy0+Z2VuID49IDcgJiYgYy0+a2V5LnRleC5jb21wcmVzc2VkX211bHRpc2FtcGxlX2xheW91dF9tYXNrICYgKDE8PHNhbXBsZXIpKQorICAgICAgICAgbWNzID0gZW1pdF9tY3NfZmV0Y2goaXIsIGNvb3JkaW5hdGUsIHNhbXBsZXIpOworICAgICAgZWxzZQorICAgICAgICAgbWNzID0gZnNfcmVnKDB1KTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIlVucmVjb2duaXplZCB0ZXh0dXJlIG9wY29kZSIpOworICAgfTsKKworICAgLyogV3JpdGVtYXNraW5nIGRvZXNuJ3QgZWxpbWluYXRlIGNoYW5uZWxzIG9uIFNJTUQ4IHRleHR1cmUKKyAgICAqIHNhbXBsZXMsIHNvIGRvbid0IHdvcnJ5IGFib3V0IHRoZW0uCisgICAgKi8KKyAgIGZzX3JlZyBkc3QgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoaXItPnR5cGUtPmJhc2VfdHlwZSwgNCwgMSkpOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgaW5zdCA9IGVtaXRfdGV4dHVyZV9nZW43KGlyLCBkc3QsIGNvb3JkaW5hdGUsIHNoYWRvd19jb21wYXJpdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZCwgbG9kMiwgc2FtcGxlX2luZGV4LCBtY3MsIHNhbXBsZXIpOworICAgfSBlbHNlIGlmIChicnctPmdlbiA+PSA1KSB7CisgICAgICBpbnN0ID0gZW1pdF90ZXh0dXJlX2dlbjUoaXIsIGRzdCwgY29vcmRpbmF0ZSwgc2hhZG93X2NvbXBhcml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9kLCBsb2QyLCBzYW1wbGVfaW5kZXgpOworICAgfSBlbHNlIHsKKyAgICAgIGluc3QgPSBlbWl0X3RleHR1cmVfZ2VuNChpciwgZHN0LCBjb29yZGluYXRlLCBzaGFkb3dfY29tcGFyaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2QsIGxvZDIpOworICAgfQorCisgICBpZiAoaXItPm9mZnNldCAhPSBOVUxMICYmIGlyLT5vcCAhPSBpcl90eGYpCisgICAgICBpbnN0LT50ZXh0dXJlX29mZnNldCA9IGJyd190ZXh0dXJlX29mZnNldChjdHgsIGlyLT5vZmZzZXQtPmFzX2NvbnN0YW50KCkpOworCisgICBpZiAoaXItPm9wID09IGlyX3RnNCkKKyAgICAgIGluc3QtPnRleHR1cmVfb2Zmc2V0IHw9IGdhdGhlcl9jaGFubmVsKGlyLCBzYW1wbGVyKSA8PCAxNjsgLy8gTTAuMjoxNi0xNworCisgICBpbnN0LT5zYW1wbGVyID0gc2FtcGxlcjsKKworICAgaWYgKGlyLT5zaGFkb3dfY29tcGFyaXRvcikKKyAgICAgIGluc3QtPnNoYWRvd19jb21wYXJlID0gdHJ1ZTsKKworICAgLyogZml4dXAgI2xheWVycyBmb3IgY3ViZSBtYXAgYXJyYXlzICovCisgICBpZiAoaXItPm9wID09IGlyX3R4cykgeworICAgICAgZ2xzbF90eXBlIGNvbnN0ICp0eXBlID0gaXItPnNhbXBsZXItPnR5cGU7CisgICAgICBpZiAodHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSA9PSBHTFNMX1NBTVBMRVJfRElNX0NVQkUgJiYKKyAgICAgICAgICB0eXBlLT5zYW1wbGVyX2FycmF5KSB7CisgICAgICAgICBmc19yZWcgZGVwdGggPSBkc3Q7CisgICAgICAgICBkZXB0aC5yZWdfb2Zmc2V0ID0gMjsKKyAgICAgICAgIGVtaXRfbWF0aChTSEFERVJfT1BDT0RFX0lOVF9RVU9USUVOVCwgZGVwdGgsIGRlcHRoLCBmc19yZWcoNikpOworICAgICAgfQorICAgfQorCisgICBpZiAoYnJ3LT5nZW4gPT0gNiAmJiBpci0+b3AgPT0gaXJfdGc0KSB7CisgICAgICBlbWl0X2dlbjZfZ2F0aGVyX3dhKGMtPmtleS50ZXguZ2VuNl9nYXRoZXJfd2Fbc2FtcGxlcl0sIGRzdCk7CisgICB9CisKKyAgIHN3aXp6bGVfcmVzdWx0KGlyLCBkc3QsIHNhbXBsZXIpOworfQorCisvKioKKyAqIEFwcGx5IHdvcmthcm91bmRzIGZvciBHZW42IGdhdGhlciB3aXRoIFVJTlQvU0lOVAorICovCit2b2lkCitmc192aXNpdG9yOjplbWl0X2dlbjZfZ2F0aGVyX3dhKHVpbnQ4X3Qgd2EsIGZzX3JlZyBkc3QpCit7CisgICBpZiAoIXdhKQorICAgICAgcmV0dXJuOworCisgICBpbnQgd2lkdGggPSAod2EgJiBXQV84QklUKSA/IDggOiAxNjsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIGZzX3JlZyBkc3RfZiA9IHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX0YpOworICAgICAgLyogQ29udmVydCBmcm9tIFVOT1JNIHRvIFVJTlQgKi8KKyAgICAgIGVtaXQoTVVMKGRzdF9mLCBkc3RfZiwgZnNfcmVnKChmbG9hdCkoKDEgPDwgd2lkdGgpIC0gMSkpKSk7CisgICAgICBlbWl0KE1PVihkc3QsIGRzdF9mKSk7CisKKyAgICAgIGlmICh3YSAmIFdBX1NJR04pIHsKKyAgICAgICAgIC8qIFJlaW50ZXJwcmV0IHRoZSBVSU5UIHZhbHVlIGFzIGEgc2lnbmVkIElOVCB2YWx1ZSBieQorICAgICAgICAgICogc2hpZnRpbmcgdGhlIHNpZ24gYml0IGludG8gcGxhY2UsIHRoZW4gc2hpZnRpbmcgYmFjaworICAgICAgICAgICogcHJlc2VydmluZyBzaWduLgorICAgICAgICAgICovCisgICAgICAgICBlbWl0KFNITChkc3QsIGRzdCwgZnNfcmVnKDMyIC0gd2lkdGgpKSk7CisgICAgICAgICBlbWl0KEFTUihkc3QsIGRzdCwgZnNfcmVnKDMyIC0gd2lkdGgpKSk7CisgICAgICB9CisKKyAgICAgIGRzdC5yZWdfb2Zmc2V0Kys7CisgICB9Cit9CisKKy8qKgorICogU2V0IHVwIHRoZSBnYXRoZXIgY2hhbm5lbCBiYXNlZCBvbiB0aGUgc3dpenpsZSwgZm9yIGdhdGhlcjQuCisgKi8KK3VpbnQzMl90Citmc192aXNpdG9yOjpnYXRoZXJfY2hhbm5lbChpcl90ZXh0dXJlICppciwgaW50IHNhbXBsZXIpCit7CisgICBpcl9jb25zdGFudCAqY2hhbiA9IGlyLT5sb2RfaW5mby5jb21wb25lbnQtPmFzX2NvbnN0YW50KCk7CisgICBpbnQgc3dpeiA9IEdFVF9TV1ooYy0+a2V5LnRleC5zd2l6emxlc1tzYW1wbGVyXSwgY2hhbi0+dmFsdWUuaVswXSk7CisgICBzd2l0Y2ggKHN3aXopIHsKKyAgICAgIGNhc2UgU1dJWlpMRV9YOiByZXR1cm4gMDsKKyAgICAgIGNhc2UgU1dJWlpMRV9ZOgorICAgICAgICAgLyogZ2F0aGVyNCBzYW1wbGVyIGlzIGJyb2tlbiBmb3IgZ3JlZW4gY2hhbm5lbCBvbiBSRzMyRiAtLQorICAgICAgICAgICogd2UgbXVzdCBhc2sgZm9yIGJsdWUgaW5zdGVhZC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGMtPmtleS50ZXguZ2F0aGVyX2NoYW5uZWxfcXVpcmtfbWFzayAmICgxPDxzYW1wbGVyKSkKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICBjYXNlIFNXSVpaTEVfWjogcmV0dXJuIDI7CisgICAgICBjYXNlIFNXSVpaTEVfVzogcmV0dXJuIDM7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgYXNzZXJ0KCEiTm90IHJlYWNoZWQiKTsgLyogemVybywgb25lIHN3aXp6bGVzIGhhbmRsZWQgYWxyZWFkeSAqLworICAgICAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKKy8qKgorICogU3dpenpsZSB0aGUgcmVzdWx0IG9mIGEgdGV4dHVyZSByZXN1bHQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IKKyAqIEVYVF90ZXh0dXJlX3N3aXp6bGUgYXMgd2VsbCBhcyBERVBUSF9URVhUVVJFX01PREUgZm9yIHNoYWRvdyBjb21wYXJpc29ucy4KKyAqLwordm9pZAorZnNfdmlzaXRvcjo6c3dpenpsZV9yZXN1bHQoaXJfdGV4dHVyZSAqaXIsIGZzX3JlZyBvcmlnX3ZhbCwgaW50IHNhbXBsZXIpCit7CisgICBpZiAoaXItPm9wID09IGlyX3F1ZXJ5X2xldmVscykgeworICAgICAgLyogIyBsZXZlbHMgaXMgaW4gLncgKi8KKyAgICAgIG9yaWdfdmFsLnJlZ19vZmZzZXQgKz0gMzsKKyAgICAgIHRoaXMtPnJlc3VsdCA9IG9yaWdfdmFsOworICAgICAgcmV0dXJuOworICAgfQorCisgICB0aGlzLT5yZXN1bHQgPSBvcmlnX3ZhbDsKKworICAgLyogdHhzLGxvZCBkb24ndCBhY3R1YWxseSBzYW1wbGUgdGhlIHRleHR1cmUsIHNvIHN3aXp6bGluZyB0aGUgcmVzdWx0CisgICAgKiBtYWtlcyBubyBzZW5zZS4KKyAgICAqLworICAgaWYgKGlyLT5vcCA9PSBpcl90eHMgfHwgaXItPm9wID09IGlyX2xvZCB8fCBpci0+b3AgPT0gaXJfdGc0KQorICAgICAgcmV0dXJuOworCisgICBpZiAoaXItPnR5cGUgPT0gZ2xzbF90eXBlOjpmbG9hdF90eXBlKSB7CisgICAgICAvKiBJZ25vcmUgREVQVEhfVEVYVFVSRV9NT0RFIHN3aXp6bGluZy4gKi8KKyAgICAgIGFzc2VydChpci0+c2FtcGxlci0+dHlwZS0+c2FtcGxlcl9zaGFkb3cpOworICAgfSBlbHNlIGlmIChjLT5rZXkudGV4LnN3aXp6bGVzW3NhbXBsZXJdICE9IFNXSVpaTEVfTk9PUCkgeworICAgICAgZnNfcmVnIHN3aXp6bGVkX3Jlc3VsdCA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJIGludCBzd2l6ID0gR0VUX1NXWihjLT5rZXkudGV4LnN3aXp6bGVzW3NhbXBsZXJdLCBpKTsKKwkgZnNfcmVnIGwgPSBzd2l6emxlZF9yZXN1bHQ7CisJIGwucmVnX29mZnNldCArPSBpOworCisJIGlmIChzd2l6ID09IFNXSVpaTEVfWkVSTykgeworCSAgICBlbWl0KE1PVihsLCBmc19yZWcoMC4wZikpKTsKKwkgfSBlbHNlIGlmIChzd2l6ID09IFNXSVpaTEVfT05FKSB7CisJICAgIGVtaXQoTU9WKGwsIGZzX3JlZygxLjBmKSkpOworCSB9IGVsc2UgeworCSAgICBmc19yZWcgciA9IG9yaWdfdmFsOworCSAgICByLnJlZ19vZmZzZXQgKz0gR0VUX1NXWihjLT5rZXkudGV4LnN3aXp6bGVzW3NhbXBsZXJdLCBpKTsKKwkgICAgZW1pdChNT1YobCwgcikpOworCSB9CisgICAgICB9CisgICAgICB0aGlzLT5yZXN1bHQgPSBzd2l6emxlZF9yZXN1bHQ7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZpc2l0KGlyX3N3aXp6bGUgKmlyKQoreworICAgaXItPnZhbC0+YWNjZXB0KHRoaXMpOworICAgZnNfcmVnIHZhbCA9IHRoaXMtPnJlc3VsdDsKKworICAgaWYgKGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMgPT0gMSkgeworICAgICAgdGhpcy0+cmVzdWx0LnJlZ19vZmZzZXQgKz0gaXItPm1hc2sueDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZnNfcmVnIHJlc3VsdCA9IGZzX3JlZyh0aGlzLCBpci0+dHlwZSk7CisgICB0aGlzLT5yZXN1bHQgPSByZXN1bHQ7CisKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICBmc19yZWcgY2hhbm5lbCA9IHZhbDsKKyAgICAgIGludCBzd2l6ID0gMDsKKworICAgICAgc3dpdGNoIChpKSB7CisgICAgICBjYXNlIDA6CisJIHN3aXogPSBpci0+bWFzay54OworCSBicmVhazsKKyAgICAgIGNhc2UgMToKKwkgc3dpeiA9IGlyLT5tYXNrLnk7CisJIGJyZWFrOworICAgICAgY2FzZSAyOgorCSBzd2l6ID0gaXItPm1hc2suejsKKwkgYnJlYWs7CisgICAgICBjYXNlIDM6CisJIHN3aXogPSBpci0+bWFzay53OworCSBicmVhazsKKyAgICAgIH0KKworICAgICAgY2hhbm5lbC5yZWdfb2Zmc2V0ICs9IHN3aXo7CisgICAgICBlbWl0KE1PVihyZXN1bHQsIGNoYW5uZWwpKTsKKyAgICAgIHJlc3VsdC5yZWdfb2Zmc2V0Kys7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZpc2l0KGlyX2Rpc2NhcmQgKmlyKQoreworICAgYXNzZXJ0KGlyLT5jb25kaXRpb24gPT0gTlVMTCk7IC8qIEZJTklTSE1FICovCisKKyAgIC8qIFdlIHRyYWNrIG91ciBkaXNjYXJkZWQgcGl4ZWxzIGluIGYwLjEuICBCeSBwcmVkaWNhdGluZyBvbiBpdCwgd2UgY2FuCisgICAgKiB1cGRhdGUganVzdCB0aGUgZmxhZyBiaXRzIHRoYXQgYXJlbid0IHlldCBkaXNjYXJkZWQuICBCeSBlbWl0dGluZyBhCisgICAgKiBDTVAgb2YgZzAgIT0gZzAsIGFsbCBvdXIgY3VycmVudGx5IGV4ZWN1dGluZyBjaGFubmVscyB3aWxsIGdldCB0dXJuZWQKKyAgICAqIG9mZi4KKyAgICAqLworICAgZnNfcmVnIHNvbWVfcmVnID0gZnNfcmVnKHJldHlwZShicndfdmVjOF9ncmYoMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19SRUdJU1RFUl9UWVBFX1VXKSk7CisgICBmc19pbnN0ICpjbXAgPSBlbWl0KENNUChyZWdfbnVsbF9mLCBzb21lX3JlZywgc29tZV9yZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfQ09ORElUSU9OQUxfTlopKTsKKyAgIGNtcC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICBjbXAtPmZsYWdfc3VicmVnID0gMTsKKworICAgaWYgKGJydy0+Z2VuID49IDYpIHsKKyAgICAgIC8qIEZvciBwZXJmb3JtYW5jZSwgYWZ0ZXIgYSBkaXNjYXJkLCBqdW1wIHRvIHRoZSBlbmQgb2YgdGhlIHNoYWRlci4KKyAgICAgICAqIE9ubHkganVtcCBpZiBhbGwgcmVsZXZhbnQgY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2NhcmRlZC4KKyAgICAgICAqLworICAgICAgZnNfaW5zdCAqZGlzY2FyZF9qdW1wID0gZW1pdChGU19PUENPREVfRElTQ0FSRF9KVU1QKTsKKyAgICAgIGRpc2NhcmRfanVtcC0+ZmxhZ19zdWJyZWcgPSAxOworCisgICAgICBkaXNjYXJkX2p1bXAtPnByZWRpY2F0ZSA9IChkaXNwYXRjaF93aWR0aCA9PSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJSV19QUkVESUNBVEVfQUxJR04xX0FOWThICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQlJXX1BSRURJQ0FURV9BTElHTjFfQU5ZMTZIOworICAgICAgZGlzY2FyZF9qdW1wLT5wcmVkaWNhdGVfaW52ZXJzZSA9IHRydWU7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZpc2l0KGlyX2NvbnN0YW50ICppcikKK3sKKyAgIC8qIFNldCB0aGlzLT5yZXN1bHQgdG8gcmVnIGF0IHRoZSBib3R0b20gb2YgdGhlIGZ1bmN0aW9uIGJlY2F1c2Ugc29tZSBjb2RlCisgICAgKiBwYXRocyB3aWxsIGNhdXNlIHRoaXMgdmlzaXRvciB0byBiZSBhcHBsaWVkIHRvIG90aGVyIGZpZWxkcy4gIFRoaXMgd2lsbAorICAgICogY2F1c2UgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGlzLT5yZXN1bHQgdG8gYmUgbW9kaWZpZWQuCisgICAgKgorICAgICogTWFrZSByZWcgY29uc3RhbnQgc28gdGhhdCBpdCBkb2Vzbid0IGdldCBhY2NpZGVudGFsbHkgbW9kaWZpZWQgYWxvbmcgdGhlCisgICAgKiB3YXkuICBZZXMsIEkgYWN0dWFsbHkgaGFkIHRoaXMgcHJvYmxlbS4gOigKKyAgICAqLworICAgY29uc3QgZnNfcmVnIHJlZyh0aGlzLCBpci0+dHlwZSk7CisgICBmc19yZWcgZHN0X3JlZyA9IHJlZzsKKworICAgaWYgKGlyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBzaXplID0gdHlwZV9zaXplKGlyLT50eXBlLT5maWVsZHMuYXJyYXkpOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXItPnR5cGUtPmxlbmd0aDsgaSsrKSB7CisJIGlyLT5hcnJheV9lbGVtZW50c1tpXS0+YWNjZXB0KHRoaXMpOworCSBmc19yZWcgc3JjX3JlZyA9IHRoaXMtPnJlc3VsdDsKKworCSBkc3RfcmVnLnR5cGUgPSBzcmNfcmVnLnR5cGU7CisJIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKwkgICAgZW1pdChNT1YoZHN0X3JlZywgc3JjX3JlZykpOworCSAgICBzcmNfcmVnLnJlZ19vZmZzZXQrKzsKKwkgICAgZHN0X3JlZy5yZWdfb2Zmc2V0Kys7CisJIH0KKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAoaXItPnR5cGUtPmlzX3JlY29yZCgpKSB7CisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmlyLT5jb21wb25lbnRzKSB7CisJIGlyX2NvbnN0YW50ICpjb25zdCBmaWVsZCA9IChpcl9jb25zdGFudCAqKSBub2RlOworCSBjb25zdCB1bnNpZ25lZCBzaXplID0gdHlwZV9zaXplKGZpZWxkLT50eXBlKTsKKworCSBmaWVsZC0+YWNjZXB0KHRoaXMpOworCSBmc19yZWcgc3JjX3JlZyA9IHRoaXMtPnJlc3VsdDsKKworCSBkc3RfcmVnLnR5cGUgPSBzcmNfcmVnLnR5cGU7CisJIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKwkgICAgZW1pdChNT1YoZHN0X3JlZywgc3JjX3JlZykpOworCSAgICBzcmNfcmVnLnJlZ19vZmZzZXQrKzsKKwkgICAgZHN0X3JlZy5yZWdfb2Zmc2V0Kys7CisJIH0KKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBzaXplID0gdHlwZV9zaXplKGlyLT50eXBlKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCSBzd2l0Y2ggKGlyLT50eXBlLT5iYXNlX3R5cGUpIHsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGVtaXQoTU9WKGRzdF9yZWcsIGZzX3JlZyhpci0+dmFsdWUuZltpXSkpKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGVtaXQoTU9WKGRzdF9yZWcsIGZzX3JlZyhpci0+dmFsdWUudVtpXSkpKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZW1pdChNT1YoZHN0X3JlZywgZnNfcmVnKGlyLT52YWx1ZS5pW2ldKSkpOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgICAgZW1pdChNT1YoZHN0X3JlZywgZnNfcmVnKChpbnQpaXItPnZhbHVlLmJbaV0pKSk7CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoISJOb24tZmxvYXQvdWludC9pbnQvYm9vbCBjb25zdGFudCIpOworCSB9CisJIGRzdF9yZWcucmVnX29mZnNldCsrOworICAgICAgfQorICAgfQorCisgICB0aGlzLT5yZXN1bHQgPSByZWc7Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmVtaXRfYm9vbF90b19jb25kX2NvZGUoaXJfcnZhbHVlICppcikKK3sKKyAgIGlyX2V4cHJlc3Npb24gKmV4cHIgPSBpci0+YXNfZXhwcmVzc2lvbigpOworCisgICBpZiAoZXhwciAmJgorICAgICAgIGV4cHItPm9wZXJhdGlvbiAhPSBpcl9iaW5vcF9sb2dpY19hbmQgJiYKKyAgICAgICBleHByLT5vcGVyYXRpb24gIT0gaXJfYmlub3BfbG9naWNfb3IgJiYKKyAgICAgICBleHByLT5vcGVyYXRpb24gIT0gaXJfYmlub3BfbG9naWNfeG9yICYmCisgICAgICAgZXhwci0+b3BlcmF0aW9uICE9IGlyX3RyaW9wX2NzZWwpIHsKKyAgICAgIGZzX3JlZyBvcFsyXTsKKyAgICAgIGZzX2luc3QgKmluc3Q7CisKKyAgICAgIGFzc2VydChleHByLT5nZXRfbnVtX29wZXJhbmRzKCkgPD0gMik7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGV4cHItPmdldF9udW1fb3BlcmFuZHMoKTsgaSsrKSB7CisJIGFzc2VydChleHByLT5vcGVyYW5kc1tpXS0+dHlwZS0+aXNfc2NhbGFyKCkpOworCisJIGV4cHItPm9wZXJhbmRzW2ldLT5hY2NlcHQodGhpcyk7CisJIG9wW2ldID0gdGhpcy0+cmVzdWx0OworCisJIHJlc29sdmVfdWRfbmVnYXRlKCZvcFtpXSk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZXhwci0+b3BlcmF0aW9uKSB7CisgICAgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OgorCSBpbnN0ID0gZW1pdChBTkQocmVnX251bGxfZCwgb3BbMF0sIGZzX3JlZygxKSkpOworCSBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfWjsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgaXJfdW5vcF9mMmI6CisJIGlmIChicnctPmdlbiA+PSA2KSB7CisJICAgIGVtaXQoQ01QKHJlZ19udWxsX2QsIG9wWzBdLCBmc19yZWcoMC4wZiksIEJSV19DT05ESVRJT05BTF9OWikpOworCSB9IGVsc2UgeworCSAgICBpbnN0ID0gZW1pdChNT1YocmVnX251bGxfZiwgb3BbMF0pKTsKKyAgICAgICAgICAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IEJSV19DT05ESVRJT05BTF9OWjsKKwkgfQorCSBicmVhazsKKworICAgICAgY2FzZSBpcl91bm9wX2kyYjoKKwkgaWYgKGJydy0+Z2VuID49IDYpIHsKKwkgICAgZW1pdChDTVAocmVnX251bGxfZCwgb3BbMF0sIGZzX3JlZygwKSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisJIH0gZWxzZSB7CisJICAgIGluc3QgPSBlbWl0KE1PVihyZWdfbnVsbF9kLCBvcFswXSkpOworICAgICAgICAgICAgaW5zdC0+Y29uZGl0aW9uYWxfbW9kID0gQlJXX0NPTkRJVElPTkFMX05aOworCSB9CisJIGJyZWFrOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICAgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgICAgIGNhc2UgaXJfYmlub3BfbGVzczoKKyAgICAgIGNhc2UgaXJfYmlub3BfbGVxdWFsOgorICAgICAgY2FzZSBpcl9iaW5vcF9lcXVhbDoKKyAgICAgIGNhc2UgaXJfYmlub3BfYWxsX2VxdWFsOgorICAgICAgY2FzZSBpcl9iaW5vcF9uZXF1YWw6CisgICAgICBjYXNlIGlyX2Jpbm9wX2FueV9uZXF1YWw6CisJIHJlc29sdmVfYm9vbF9jb21wYXJpc29uKGV4cHItPm9wZXJhbmRzWzBdLCAmb3BbMF0pOworCSByZXNvbHZlX2Jvb2xfY29tcGFyaXNvbihleHByLT5vcGVyYW5kc1sxXSwgJm9wWzFdKTsKKworCSBlbWl0KENNUChyZWdfbnVsbF9kLCBvcFswXSwgb3BbMV0sCisgICAgICAgICAgICAgICAgICBicndfY29uZGl0aW9uYWxfZm9yX2NvbXBhcmlzb24oZXhwci0+b3BlcmF0aW9uKSkpOworCSBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKwkgZmFpbCgiYmFkIGNvbmQgY29kZVxuIik7CisJIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICBpci0+YWNjZXB0KHRoaXMpOworCisgICBmc19pbnN0ICppbnN0ID0gZW1pdChBTkQocmVnX251bGxfZCwgdGhpcy0+cmVzdWx0LCBmc19yZWcoMSkpKTsKKyAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IEJSV19DT05ESVRJT05BTF9OWjsKK30KKworLyoqCisgKiBFbWl0IGEgZ2VuNiBJRiBzdGF0ZW1lbnQgd2l0aCB0aGUgY29tcGFyaXNvbiBmb2xkZWQgaW50byB0aGUgSUYKKyAqIGluc3RydWN0aW9uLgorICovCit2b2lkCitmc192aXNpdG9yOjplbWl0X2lmX2dlbjYoaXJfaWYgKmlyKQoreworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IGlyLT5jb25kaXRpb24tPmFzX2V4cHJlc3Npb24oKTsKKworICAgaWYgKGV4cHIpIHsKKyAgICAgIGZzX3JlZyBvcFsyXTsKKyAgICAgIGZzX2luc3QgKmluc3Q7CisgICAgICBmc19yZWcgdGVtcDsKKworICAgICAgYXNzZXJ0KGV4cHItPmdldF9udW1fb3BlcmFuZHMoKSA8PSAyKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZXhwci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKwkgYXNzZXJ0KGV4cHItPm9wZXJhbmRzW2ldLT50eXBlLT5pc19zY2FsYXIoKSk7CisKKwkgZXhwci0+b3BlcmFuZHNbaV0tPmFjY2VwdCh0aGlzKTsKKwkgb3BbaV0gPSB0aGlzLT5yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZXhwci0+b3BlcmF0aW9uKSB7CisgICAgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OgorICAgICAgY2FzZSBpcl9iaW5vcF9sb2dpY194b3I6CisgICAgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX29yOgorICAgICAgY2FzZSBpcl9iaW5vcF9sb2dpY19hbmQ6CisgICAgICAgICAvKiBGb3Igb3BlcmF0aW9ucyBvbiBib29sIGFyZ3VtZW50cywgb25seSB0aGUgbG93IGJpdCBvZiB0aGUgYm9vbCBpcworICAgICAgICAgICogdmFsaWQsIGFuZCB0aGUgb3RoZXJzIGFyZSB1bmRlZmluZWQuICBGYWxsIGJhY2sgdG8gdGhlIGNvbmRpdGlvbgorICAgICAgICAgICogY29kZSBwYXRoLgorICAgICAgICAgICovCisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpcl91bm9wX2YyYjoKKwkgaW5zdCA9IGVtaXQoQlJXX09QQ09ERV9JRiwgcmVnX251bGxfZiwgb3BbMF0sIGZzX3JlZygwKSk7CisJIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IEJSV19DT05ESVRJT05BTF9OWjsKKwkgcmV0dXJuOworCisgICAgICBjYXNlIGlyX3Vub3BfaTJiOgorCSBlbWl0KElGKG9wWzBdLCBmc19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworCSByZXR1cm47CisKKyAgICAgIGNhc2UgaXJfYmlub3BfZ3JlYXRlcjoKKyAgICAgIGNhc2UgaXJfYmlub3BfZ2VxdWFsOgorICAgICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisgICAgICBjYXNlIGlyX2Jpbm9wX2VxdWFsOgorICAgICAgY2FzZSBpcl9iaW5vcF9hbGxfZXF1YWw6CisgICAgICBjYXNlIGlyX2Jpbm9wX25lcXVhbDoKKyAgICAgIGNhc2UgaXJfYmlub3BfYW55X25lcXVhbDoKKwkgcmVzb2x2ZV9ib29sX2NvbXBhcmlzb24oZXhwci0+b3BlcmFuZHNbMF0sICZvcFswXSk7CisJIHJlc29sdmVfYm9vbF9jb21wYXJpc29uKGV4cHItPm9wZXJhbmRzWzFdLCAmb3BbMV0pOworCisJIGVtaXQoSUYob3BbMF0sIG9wWzFdLAorICAgICAgICAgICAgICAgICBicndfY29uZGl0aW9uYWxfZm9yX2NvbXBhcmlzb24oZXhwci0+b3BlcmF0aW9uKSkpOworCSByZXR1cm47CisgICAgICBkZWZhdWx0OgorCSBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworCSBlbWl0KElGKG9wWzBdLCBmc19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworCSBmYWlsKCJiYWQgY29uZGl0aW9uXG4iKTsKKwkgcmV0dXJuOworICAgICAgfQorICAgfQorCisgICBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyLT5jb25kaXRpb24pOworICAgZnNfaW5zdCAqaW5zdCA9IGVtaXQoQlJXX09QQ09ERV9JRik7CisgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKK30KKworLyoqCisgKiBUcnkgdG8gcmVwbGFjZSBJRi9NT1YvRUxTRS9NT1YvRU5ESUYgd2l0aCBTRUwuCisgKgorICogTWFueSBHTFNMIHNoYWRlcnMgY29udGFpbiB0aGUgZm9sbG93aW5nIHBhdHRlcm46CisgKgorICogICAgeCA9IGNvbmRpdGlvbiA/IGZvbyA6IGJhcgorICoKKyAqIFRoZSBjb21waWxlciBlbWl0cyBhbiBpcl9pZiB0cmVlIGZvciB0aGlzLCBzaW5jZSBlYWNoIHN1YmV4cHJlc3Npb24gbWlnaHQgYmUKKyAqIGEgY29tcGxleCB0cmVlIHRoYXQgY291bGQgaGF2ZSBzaWRlLWVmZmVjdHMgb3Igc2hvcnQtY2lyY3VpdCBsb2dpYy4KKyAqCisgKiBIb3dldmVyLCB0aGUgY29tbW9uIGNhc2UgaXMgdG8gc2ltcGx5IHNlbGVjdCBvbmUgb2YgdHdvIGNvbnN0YW50cyBvcgorICogdmFyaWFibGUgdmFsdWVzLS0td2hpY2ggaXMgZXhhY3RseSB3aGF0IFNFTCBpcyBmb3IuICBJbiB0aGlzIGNhc2UsIHRoZQorICogYXNzZW1ibHkgbG9va3MgbGlrZToKKyAqCisgKiAgICAoK2YwKSBJRgorICogICAgTU9WIGRzdCBzcmMwCisgKiAgICBFTFNFCisgKiAgICBNT1YgZHN0IHNyYzEKKyAqICAgIEVORElGCisgKgorICogd2hpY2ggY2FuIGJlIGVhc2lseSB0cmFuc2xhdGVkIGludG86CisgKgorICogICAgKCtmMCkgU0VMIGRzdCBzcmMwIHNyYzEKKyAqCisgKiBJZiBzcmMwIGlzIGFuIGltbWVkaWF0ZSB2YWx1ZSwgd2UgcHJvbW90ZSBpdCB0byBhIHRlbXBvcmFyeSBHUkYuCisgKi8KK3ZvaWQKK2ZzX3Zpc2l0b3I6OnRyeV9yZXBsYWNlX3dpdGhfc2VsKCkKK3sKKyAgIGZzX2luc3QgKmVuZGlmX2luc3QgPSAoZnNfaW5zdCAqKSBpbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKyAgIGFzc2VydChlbmRpZl9pbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9FTkRJRik7CisKKyAgIC8qIFBhdHRlcm4gbWF0Y2ggaW4gcmV2ZXJzZTogSUYsIE1PViwgRUxTRSwgTU9WLCBFTkRJRi4gKi8KKyAgIGludCBvcGNvZGVzW10gPSB7CisgICAgICBCUldfT1BDT0RFX0lGLCBCUldfT1BDT0RFX01PViwgQlJXX09QQ09ERV9FTFNFLCBCUldfT1BDT0RFX01PViwKKyAgIH07CisKKyAgIGZzX2luc3QgKm1hdGNoID0gKGZzX2luc3QgKikgZW5kaWZfaW5zdC0+cHJldjsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBpZiAobWF0Y2gtPmlzX2hlYWRfc2VudGluZWwoKSB8fCBtYXRjaC0+b3Bjb2RlICE9IG9wY29kZXNbNC1pLTFdKQorICAgICAgICAgcmV0dXJuOworICAgICAgbWF0Y2ggPSAoZnNfaW5zdCAqKSBtYXRjaC0+cHJldjsKKyAgIH0KKworICAgLyogVGhlIG9wY29kZXMgbWF0Y2g7IGl0IGxvb2tzIGxpa2UgdGhlIHJpZ2h0IHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucy4gKi8KKyAgIGZzX2luc3QgKmVsc2VfbW92ID0gKGZzX2luc3QgKikgZW5kaWZfaW5zdC0+cHJldjsKKyAgIGZzX2luc3QgKnRoZW5fbW92ID0gKGZzX2luc3QgKikgZWxzZV9tb3YtPnByZXYtPnByZXY7CisgICBmc19pbnN0ICppZl9pbnN0ID0gKGZzX2luc3QgKikgdGhlbl9tb3YtPnByZXY7CisKKyAgIC8qIENoZWNrIHRoYXQgdGhlIE1PVnMgYXJlIHRoZSByaWdodCBmb3JtLiAqLworICAgaWYgKHRoZW5fbW92LT5kc3QuZXF1YWxzKGVsc2VfbW92LT5kc3QpICYmCisgICAgICAgIXRoZW5fbW92LT5pc19wYXJ0aWFsX3dyaXRlKCkgJiYKKyAgICAgICAhZWxzZV9tb3YtPmlzX3BhcnRpYWxfd3JpdGUoKSkgeworCisgICAgICAvKiBSZW1vdmUgdGhlIG1hdGNoZWQgaW5zdHJ1Y3Rpb25zOyB3ZSdsbCBlbWl0IGEgU0VMIHRvIHJlcGxhY2UgdGhlbS4gKi8KKyAgICAgIHdoaWxlICghaWZfaW5zdC0+bmV4dC0+aXNfdGFpbF9zZW50aW5lbCgpKQorICAgICAgICAgaWZfaW5zdC0+bmV4dC0+cmVtb3ZlKCk7CisgICAgICBpZl9pbnN0LT5yZW1vdmUoKTsKKworICAgICAgLyogT25seSB0aGUgbGFzdCBzb3VyY2UgcmVnaXN0ZXIgY2FuIGJlIGEgY29uc3RhbnQsIHNvIGlmIHRoZSBNT1YgaW4KKyAgICAgICAqIHRoZSAidGhlbiIgY2xhdXNlIHVzZXMgYSBjb25zdGFudCwgd2UgbmVlZCB0byBwdXQgaXQgaW4gYSB0ZW1wb3JhcnkuCisgICAgICAgKi8KKyAgICAgIGZzX3JlZyBzcmMwKHRoZW5fbW92LT5zcmNbMF0pOworICAgICAgaWYgKHNyYzAuZmlsZSA9PSBJTU0pIHsKKyAgICAgICAgIHNyYzAgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgICAgICAgIHNyYzAudHlwZSA9IHRoZW5fbW92LT5zcmNbMF0udHlwZTsKKyAgICAgICAgIGVtaXQoTU9WKHNyYzAsIHRoZW5fbW92LT5zcmNbMF0pKTsKKyAgICAgIH0KKworICAgICAgZnNfaW5zdCAqc2VsOworICAgICAgaWYgKGlmX2luc3QtPmNvbmRpdGlvbmFsX21vZCkgeworICAgICAgICAgLyogU2FuZHlicmlkZ2Utc3BlY2lmaWMgSUYgd2l0aCBlbWJlZGRlZCBjb21wYXJpc29uICovCisgICAgICAgICBlbWl0KENNUChyZWdfbnVsbF9kLCBpZl9pbnN0LT5zcmNbMF0sIGlmX2luc3QtPnNyY1sxXSwKKyAgICAgICAgICAgICAgICAgIGlmX2luc3QtPmNvbmRpdGlvbmFsX21vZCkpOworICAgICAgICAgc2VsID0gZW1pdChCUldfT1BDT0RFX1NFTCwgdGhlbl9tb3YtPmRzdCwgc3JjMCwgZWxzZV9tb3YtPnNyY1swXSk7CisgICAgICAgICBzZWwtPnByZWRpY2F0ZSA9IEJSV19QUkVESUNBVEVfTk9STUFMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIFNlcGFyYXRlIENNUCBhbmQgSUYgaW5zdHJ1Y3Rpb25zICovCisgICAgICAgICBzZWwgPSBlbWl0KEJSV19PUENPREVfU0VMLCB0aGVuX21vdi0+ZHN0LCBzcmMwLCBlbHNlX21vdi0+c3JjWzBdKTsKKyAgICAgICAgIHNlbC0+cHJlZGljYXRlID0gaWZfaW5zdC0+cHJlZGljYXRlOworICAgICAgICAgc2VsLT5wcmVkaWNhdGVfaW52ZXJzZSA9IGlmX2luc3QtPnByZWRpY2F0ZV9pbnZlcnNlOworICAgICAgfQorICAgfQorfQorCit2b2lkCitmc192aXNpdG9yOjp2aXNpdChpcl9pZiAqaXIpCit7CisgICBpZiAoYnJ3LT5nZW4gPCA2KSB7CisgICAgICBubzE2KCJDYW4ndCBzdXBwb3J0IChub24tdW5pZm9ybSkgY29udHJvbCBmbG93IG9uIFNJTUQxNlxuIik7CisgICB9CisKKyAgIC8qIERvbid0IHBvaW50IHRoZSBhbm5vdGF0aW9uIGF0IHRoZSBpZiBzdGF0ZW1lbnQsIGJlY2F1c2UgdGhlbiBpdCBwbHVzCisgICAgKiB0aGUgdGhlbiBhbmQgZWxzZSBibG9ja3MgZ2V0IHByaW50ZWQuCisgICAgKi8KKyAgIHRoaXMtPmJhc2VfaXIgPSBpci0+Y29uZGl0aW9uOworCisgICBpZiAoYnJ3LT5nZW4gPT0gNikgeworICAgICAgZW1pdF9pZl9nZW42KGlyKTsKKyAgIH0gZWxzZSB7CisgICAgICBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyLT5jb25kaXRpb24pOworCisgICAgICBlbWl0KElGKEJSV19QUkVESUNBVEVfTk9STUFMKSk7CisgICB9CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmaXItPnRoZW5faW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKilub2RlOworICAgICAgdGhpcy0+YmFzZV9pciA9IGlyOworCisgICAgICBpci0+YWNjZXB0KHRoaXMpOworICAgfQorCisgICBpZiAoIWlyLT5lbHNlX2luc3RydWN0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICBlbWl0KEJSV19PUENPREVfRUxTRSk7CisKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCAmaXItPmVsc2VfaW5zdHJ1Y3Rpb25zKSB7CisJIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKW5vZGU7CisJIHRoaXMtPmJhc2VfaXIgPSBpcjsKKworCSBpci0+YWNjZXB0KHRoaXMpOworICAgICAgfQorICAgfQorCisgICBlbWl0KEJSV19PUENPREVfRU5ESUYpOworCisgICB0cnlfcmVwbGFjZV93aXRoX3NlbCgpOworfQorCit2b2lkCitmc192aXNpdG9yOjp2aXNpdChpcl9sb29wICppcikKK3sKKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIG5vMTYoIkNhbid0IHN1cHBvcnQgKG5vbi11bmlmb3JtKSBjb250cm9sIGZsb3cgb24gU0lNRDE2XG4iKTsKKyAgIH0KKworICAgdGhpcy0+YmFzZV9pciA9IE5VTEw7CisgICBlbWl0KEJSV19PUENPREVfRE8pOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmlyLT5ib2R5X2luc3RydWN0aW9ucykgeworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmlyID0gKGlyX2luc3RydWN0aW9uICopbm9kZTsKKworICAgICAgdGhpcy0+YmFzZV9pciA9IGlyOworICAgICAgaXItPmFjY2VwdCh0aGlzKTsKKyAgIH0KKworICAgdGhpcy0+YmFzZV9pciA9IE5VTEw7CisgICBlbWl0KEJSV19PUENPREVfV0hJTEUpOworfQorCit2b2lkCitmc192aXNpdG9yOjp2aXNpdChpcl9sb29wX2p1bXAgKmlyKQoreworICAgc3dpdGNoIChpci0+bW9kZSkgeworICAgY2FzZSBpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWs6CisgICAgICBlbWl0KEJSV19PUENPREVfQlJFQUspOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2xvb3BfanVtcDo6anVtcF9jb250aW51ZToKKyAgICAgIGVtaXQoQlJXX09QQ09ERV9DT05USU5VRSk7CisgICAgICBicmVhazsKKyAgIH0KK30KKwordm9pZAorZnNfdmlzaXRvcjo6dmlzaXRfYXRvbWljX2NvdW50ZXJfaW50cmluc2ljKGlyX2NhbGwgKmlyKQoreworICAgaXJfZGVyZWZlcmVuY2UgKmRlcmVmID0gc3RhdGljX2Nhc3Q8aXJfZGVyZWZlcmVuY2UgKj4oCisgICAgICBpci0+YWN0dWFsX3BhcmFtZXRlcnMuZ2V0X2hlYWQoKSk7CisgICBpcl92YXJpYWJsZSAqbG9jYXRpb24gPSBkZXJlZi0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworICAgdW5zaWduZWQgc3VyZl9pbmRleCA9IChjLT5wcm9nX2RhdGEuYmFzZS5iaW5kaW5nX3RhYmxlLmFib19zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLT5kYXRhLmF0b21pYy5idWZmZXJfaW5kZXgpOworCisgICAvKiBDYWxjdWxhdGUgdGhlIHN1cmZhY2Ugb2Zmc2V0ICovCisgICBmc19yZWcgb2Zmc2V0KHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpkZXJlZl9hcnJheSA9IGRlcmVmLT5hc19kZXJlZmVyZW5jZV9hcnJheSgpOworCisgICBpZiAoZGVyZWZfYXJyYXkpIHsKKyAgICAgIGRlcmVmX2FycmF5LT5hcnJheV9pbmRleC0+YWNjZXB0KHRoaXMpOworCisgICAgICBmc19yZWcgdG1wKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIGVtaXQoTVVMKHRtcCwgdGhpcy0+cmVzdWx0LCBBVE9NSUNfQ09VTlRFUl9TSVpFKSk7CisgICAgICBlbWl0KEFERChvZmZzZXQsIHRtcCwgbG9jYXRpb24tPmRhdGEuYXRvbWljLm9mZnNldCkpOworICAgfSBlbHNlIHsKKyAgICAgIG9mZnNldCA9IGxvY2F0aW9uLT5kYXRhLmF0b21pYy5vZmZzZXQ7CisgICB9CisKKyAgIC8qIEVtaXQgdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KKyAgIGNvbnN0IGNoYXIgKmNhbGxlZSA9IGlyLT5jYWxsZWUtPmZ1bmN0aW9uX25hbWUoKTsKKyAgIGlyLT5yZXR1cm5fZGVyZWYtPmFjY2VwdCh0aGlzKTsKKyAgIGZzX3JlZyBkc3QgPSB0aGlzLT5yZXN1bHQ7CisKKyAgIGlmICghc3RyY21wKCJfX2ludHJpbnNpY19hdG9taWNfcmVhZCIsIGNhbGxlZSkpIHsKKyAgICAgIGVtaXRfdW50eXBlZF9zdXJmYWNlX3JlYWQoc3VyZl9pbmRleCwgZHN0LCBvZmZzZXQpOworCisgICB9IGVsc2UgaWYgKCFzdHJjbXAoIl9faW50cmluc2ljX2F0b21pY19pbmNyZW1lbnQiLCBjYWxsZWUpKSB7CisgICAgICBlbWl0X3VudHlwZWRfYXRvbWljKEJSV19BT1BfSU5DLCBzdXJmX2luZGV4LCBkc3QsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnKCksIGZzX3JlZygpKTsKKworICAgfSBlbHNlIGlmICghc3RyY21wKCJfX2ludHJpbnNpY19hdG9taWNfcHJlZGVjcmVtZW50IiwgY2FsbGVlKSkgeworICAgICAgZW1pdF91bnR5cGVkX2F0b21pYyhCUldfQU9QX1BSRURFQywgc3VyZl9pbmRleCwgZHN0LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX3JlZygpLCBmc19yZWcoKSk7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZpc2l0KGlyX2NhbGwgKmlyKQoreworICAgY29uc3QgY2hhciAqY2FsbGVlID0gaXItPmNhbGxlZS0+ZnVuY3Rpb25fbmFtZSgpOworCisgICBpZiAoIXN0cmNtcCgiX19pbnRyaW5zaWNfYXRvbWljX3JlYWQiLCBjYWxsZWUpIHx8CisgICAgICAgIXN0cmNtcCgiX19pbnRyaW5zaWNfYXRvbWljX2luY3JlbWVudCIsIGNhbGxlZSkgfHwKKyAgICAgICAhc3RyY21wKCJfX2ludHJpbnNpY19hdG9taWNfcHJlZGVjcmVtZW50IiwgY2FsbGVlKSkgeworICAgICAgdmlzaXRfYXRvbWljX2NvdW50ZXJfaW50cmluc2ljKGlyKTsKKyAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoISJVbnN1cHBvcnRlZCBpbnRyaW5zaWMuIik7CisgICB9Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZpc2l0KGlyX3JldHVybiAqaXIpCit7CisgICBhc3NlcnQoISJGSU5JU0hNRSIpOworfQorCit2b2lkCitmc192aXNpdG9yOjp2aXNpdChpcl9mdW5jdGlvbiAqaXIpCit7CisgICAvKiBJZ25vcmUgZnVuY3Rpb24gYm9kaWVzIG90aGVyIHRoYW4gbWFpbigpIC0tIHdlIHNob3VsZG4ndCBzZWUgY2FsbHMgdG8KKyAgICAqIHRoZW0gc2luY2UgdGhleSBzaG91bGQgYWxsIGJlIGlubGluZWQgYmVmb3JlIHdlIGdldCB0byBpcl90b19tZXNhLgorICAgICovCisgICBpZiAoc3RyY21wKGlyLT5uYW1lLCAibWFpbiIpID09IDApIHsKKyAgICAgIGNvbnN0IGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnOworICAgICAgZXhlY19saXN0IGVtcHR5OworCisgICAgICBzaWcgPSBpci0+bWF0Y2hpbmdfc2lnbmF0dXJlKE5VTEwsICZlbXB0eSk7CisKKyAgICAgIGFzc2VydChzaWcpOworCisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnNpZy0+Ym9keSkgeworCSBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKilub2RlOworCSB0aGlzLT5iYXNlX2lyID0gaXI7CisKKwkgaXItPmFjY2VwdCh0aGlzKTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZAorZnNfdmlzaXRvcjo6dmlzaXQoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICppcikKK3sKKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICAodm9pZClpcjsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6dmlzaXQoaXJfZW1pdF92ZXJ0ZXggKikKK3sKKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OnZpc2l0KGlyX2VuZF9wcmltaXRpdmUgKikKK3sKKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmVtaXRfdW50eXBlZF9hdG9taWModW5zaWduZWQgYXRvbWljX29wLCB1bnNpZ25lZCBzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19yZWcgZHN0LCBmc19yZWcgb2Zmc2V0LCBmc19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIHNyYzEpCit7CisgICBjb25zdCB1bnNpZ25lZCBvcGVyYW5kX2xlbiA9IGRpc3BhdGNoX3dpZHRoIC8gODsKKyAgIHVuc2lnbmVkIG1sZW4gPSAwOworCisgICAvKiBJbml0aWFsaXplIHRoZSBzYW1wbGUgbWFzayBpbiB0aGUgbWVzc2FnZSBoZWFkZXIuICovCisgICBlbWl0KE1PVihicndfdXZlY19tcmYoOCwgbWxlbiwgMCksIGZzX3JlZygwdSkpKQorICAgICAgLT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKworICAgaWYgKGZwLT5Vc2VzS2lsbCkgeworICAgICAgZW1pdChNT1YoYnJ3X3V2ZWNfbXJmKDEsIG1sZW4sIDcpLCBicndfZmxhZ19yZWcoMCwgMSkpKQorICAgICAgICAgLT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgIH0gZWxzZSB7CisgICAgICBlbWl0KE1PVihicndfdXZlY19tcmYoMSwgbWxlbiwgNyksCisgICAgICAgICAgICAgICByZXR5cGUoYnJ3X3ZlYzFfZ3JmKDEsIDcpLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpKQorICAgICAgICAgLT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgIH0KKworICAgbWxlbisrOworCisgICAvKiBTZXQgdGhlIGF0b21pYyBvcGVyYXRpb24gb2Zmc2V0LiAqLworICAgZW1pdChNT1YoYnJ3X3V2ZWNfbXJmKGRpc3BhdGNoX3dpZHRoLCBtbGVuLCAwKSwgb2Zmc2V0KSk7CisgICBtbGVuICs9IG9wZXJhbmRfbGVuOworCisgICAvKiBTZXQgdGhlIGF0b21pYyBvcGVyYXRpb24gYXJndW1lbnRzLiAqLworICAgaWYgKHNyYzAuZmlsZSAhPSBCQURfRklMRSkgeworICAgICAgZW1pdChNT1YoYnJ3X3V2ZWNfbXJmKGRpc3BhdGNoX3dpZHRoLCBtbGVuLCAwKSwgc3JjMCkpOworICAgICAgbWxlbiArPSBvcGVyYW5kX2xlbjsKKyAgIH0KKworICAgaWYgKHNyYzEuZmlsZSAhPSBCQURfRklMRSkgeworICAgICAgZW1pdChNT1YoYnJ3X3V2ZWNfbXJmKGRpc3BhdGNoX3dpZHRoLCBtbGVuLCAwKSwgc3JjMSkpOworICAgICAgbWxlbiArPSBvcGVyYW5kX2xlbjsKKyAgIH0KKworICAgLyogRW1pdCB0aGUgaW5zdHJ1Y3Rpb24uICovCisgICBmc19pbnN0ICppbnN0ID0gbmV3KG1lbV9jdHgpIGZzX2luc3QoU0hBREVSX09QQ09ERV9VTlRZUEVEX0FUT01JQywgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19vcCwgc3VyZl9pbmRleCk7CisgICBpbnN0LT5iYXNlX21yZiA9IDA7CisgICBpbnN0LT5tbGVuID0gbWxlbjsKKyAgIGluc3QtPmhlYWRlcl9wcmVzZW50ID0gdHJ1ZTsKKyAgIGVtaXQoaW5zdCk7Cit9CisKK3ZvaWQKK2ZzX3Zpc2l0b3I6OmVtaXRfdW50eXBlZF9zdXJmYWNlX3JlYWQodW5zaWduZWQgc3VyZl9pbmRleCwgZnNfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfcmVnIG9mZnNldCkKK3sKKyAgIGNvbnN0IHVuc2lnbmVkIG9wZXJhbmRfbGVuID0gZGlzcGF0Y2hfd2lkdGggLyA4OworICAgdW5zaWduZWQgbWxlbiA9IDA7CisKKyAgIC8qIEluaXRpYWxpemUgdGhlIHNhbXBsZSBtYXNrIGluIHRoZSBtZXNzYWdlIGhlYWRlci4gKi8KKyAgIGVtaXQoTU9WKGJyd191dmVjX21yZig4LCBtbGVuLCAwKSwgZnNfcmVnKDB1KSkpCisgICAgICAtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworCisgICBpZiAoZnAtPlVzZXNLaWxsKSB7CisgICAgICBlbWl0KE1PVihicndfdXZlY19tcmYoMSwgbWxlbiwgNyksIGJyd19mbGFnX3JlZygwLCAxKSkpCisgICAgICAgICAtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworICAgfSBlbHNlIHsKKyAgICAgIGVtaXQoTU9WKGJyd191dmVjX21yZigxLCBtbGVuLCA3KSwKKyAgICAgICAgICAgICAgIHJldHlwZShicndfdmVjMV9ncmYoMSwgNyksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSkpCisgICAgICAgICAtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworICAgfQorCisgICBtbGVuKys7CisKKyAgIC8qIFNldCB0aGUgc3VyZmFjZSByZWFkIG9mZnNldC4gKi8KKyAgIGVtaXQoTU9WKGJyd191dmVjX21yZihkaXNwYXRjaF93aWR0aCwgbWxlbiwgMCksIG9mZnNldCkpOworICAgbWxlbiArPSBvcGVyYW5kX2xlbjsKKworICAgLyogRW1pdCB0aGUgaW5zdHJ1Y3Rpb24uICovCisgICBmc19pbnN0ICppbnN0ID0gbmV3KG1lbV9jdHgpCisgICAgICBmc19pbnN0KFNIQURFUl9PUENPREVfVU5UWVBFRF9TVVJGQUNFX1JFQUQsIGRzdCwgc3VyZl9pbmRleCk7CisgICBpbnN0LT5iYXNlX21yZiA9IDA7CisgICBpbnN0LT5tbGVuID0gbWxlbjsKKyAgIGluc3QtPmhlYWRlcl9wcmVzZW50ID0gdHJ1ZTsKKyAgIGVtaXQoaW5zdCk7Cit9CisKK2ZzX2luc3QgKgorZnNfdmlzaXRvcjo6ZW1pdChmc19pbnN0ICppbnN0KQoreworICAgaWYgKGZvcmNlX3VuY29tcHJlc3NlZF9zdGFjayA+IDApCisgICAgICBpbnN0LT5mb3JjZV91bmNvbXByZXNzZWQgPSB0cnVlOworCisgICBpbnN0LT5hbm5vdGF0aW9uID0gdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uOworICAgaW5zdC0+aXIgPSB0aGlzLT5iYXNlX2lyOworCisgICB0aGlzLT5pbnN0cnVjdGlvbnMucHVzaF90YWlsKGluc3QpOworCisgICByZXR1cm4gaW5zdDsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZW1pdChleGVjX2xpc3QgbGlzdCkKK3sKKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsICZsaXN0KSB7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKilub2RlOworICAgICAgaW5zdC0+cmVtb3ZlKCk7CisgICAgICBlbWl0KGluc3QpOworICAgfQorfQorCisvKiogRW1pdHMgYSBkdW1teSBmcmFnbWVudCBzaGFkZXIgY29uc2lzdGluZyBvZiBtYWdlbnRhIGZvciBicmluZ3VwIHB1cnBvc2VzLiAqLwordm9pZAorZnNfdmlzaXRvcjo6ZW1pdF9kdW1teV9mcygpCit7CisgICBpbnQgcmVnX3dpZHRoID0gZGlzcGF0Y2hfd2lkdGggLyA4OworCisgICAvKiBFdmVyeW9uZSdzIGZhdm9yaXRlIGNvbG9yLiAqLworICAgZW1pdChNT1YoZnNfcmVnKE1SRiwgMiArIDAgKiByZWdfd2lkdGgpLCBmc19yZWcoMS4wZikpKTsKKyAgIGVtaXQoTU9WKGZzX3JlZyhNUkYsIDIgKyAxICogcmVnX3dpZHRoKSwgZnNfcmVnKDAuMGYpKSk7CisgICBlbWl0KE1PVihmc19yZWcoTVJGLCAyICsgMiAqIHJlZ193aWR0aCksIGZzX3JlZygxLjBmKSkpOworICAgZW1pdChNT1YoZnNfcmVnKE1SRiwgMiArIDMgKiByZWdfd2lkdGgpLCBmc19yZWcoMC4wZikpKTsKKworICAgZnNfaW5zdCAqd3JpdGU7CisgICB3cml0ZSA9IGVtaXQoRlNfT1BDT0RFX0ZCX1dSSVRFLCBmc19yZWcoMCksIGZzX3JlZygwKSk7CisgICB3cml0ZS0+YmFzZV9tcmYgPSAyOworICAgd3JpdGUtPm1sZW4gPSA0ICogcmVnX3dpZHRoOworICAgd3JpdGUtPmVvdCA9IHRydWU7Cit9CisKKy8qIFRoZSByZWdpc3RlciBsb2NhdGlvbiBoZXJlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgVVJCCisgKiBkYXRhLiAgSXQgd2lsbCBnZXQgYWRqdXN0ZWQgdG8gYmUgYSByZWFsIGxvY2F0aW9uIGJlZm9yZQorICogZ2VuZXJhdGVfY29kZSgpIHRpbWUuCisgKi8KK3N0cnVjdCBicndfcmVnCitmc192aXNpdG9yOjppbnRlcnBfcmVnKGludCBsb2NhdGlvbiwgaW50IGNoYW5uZWwpCit7CisgICBpbnQgcmVnbnIgPSBjLT5wcm9nX2RhdGEudXJiX3NldHVwW2xvY2F0aW9uXSAqIDIgKyBjaGFubmVsIC8gMjsKKyAgIGludCBzdHJpZGUgPSAoY2hhbm5lbCAmIDEpICogNDsKKworICAgYXNzZXJ0KGMtPnByb2dfZGF0YS51cmJfc2V0dXBbbG9jYXRpb25dICE9IC0xKTsKKworICAgcmV0dXJuIGJyd192ZWMxX2dyZihyZWduciwgc3RyaWRlKTsKK30KKworLyoqIEVtaXRzIHRoZSBpbnRlcnBvbGF0aW9uIGZvciB0aGUgdmFyeWluZyBpbnB1dHMuICovCit2b2lkCitmc192aXNpdG9yOjplbWl0X2ludGVycG9sYXRpb25fc2V0dXBfZ2VuNCgpCit7CisgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSAiY29tcHV0ZSBwaXhlbCBjZW50ZXJzIjsKKyAgIHRoaXMtPnBpeGVsX3ggPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgdGhpcy0+cGl4ZWxfeSA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICB0aGlzLT5waXhlbF94LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9VVzsKKyAgIHRoaXMtPnBpeGVsX3kudHlwZSA9IEJSV19SRUdJU1RFUl9UWVBFX1VXOworCisgICBlbWl0KEZTX09QQ09ERV9QSVhFTF9YLCB0aGlzLT5waXhlbF94KTsKKyAgIGVtaXQoRlNfT1BDT0RFX1BJWEVMX1ksIHRoaXMtPnBpeGVsX3kpOworCisgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSAiY29tcHV0ZSBwaXhlbCBkZWx0YXMgZnJvbSB2MCI7CisgICBpZiAoYnJ3LT5oYXNfcGxuKSB7CisgICAgICB0aGlzLT5kZWx0YV94W0JSV19XTV9QRVJTUEVDVElWRV9QSVhFTF9CQVJZQ0VOVFJJQ10gPQorICAgICAgICAgZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjMl90eXBlKTsKKyAgICAgIHRoaXMtPmRlbHRhX3lbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXSA9CisgICAgICAgICB0aGlzLT5kZWx0YV94W0JSV19XTV9QRVJTUEVDVElWRV9QSVhFTF9CQVJZQ0VOVFJJQ107CisgICAgICB0aGlzLT5kZWx0YV95W0JSV19XTV9QRVJTUEVDVElWRV9QSVhFTF9CQVJZQ0VOVFJJQ10ucmVnX29mZnNldCsrOworICAgfSBlbHNlIHsKKyAgICAgIHRoaXMtPmRlbHRhX3hbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXSA9CisgICAgICAgICBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgICAgIHRoaXMtPmRlbHRhX3lbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXSA9CisgICAgICAgICBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgIH0KKyAgIGVtaXQoQUREKHRoaXMtPmRlbHRhX3hbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXSwKKyAgICAgICAgICAgIHRoaXMtPnBpeGVsX3gsIGZzX3JlZyhuZWdhdGUoYnJ3X3ZlYzFfZ3JmKDEsIDApKSkpKTsKKyAgIGVtaXQoQUREKHRoaXMtPmRlbHRhX3lbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXSwKKyAgICAgICAgICAgIHRoaXMtPnBpeGVsX3ksIGZzX3JlZyhuZWdhdGUoYnJ3X3ZlYzFfZ3JmKDEsIDEpKSkpKTsKKworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gImNvbXB1dGUgcG9zLncgYW5kIDEvcG9zLnciOworICAgLyogQ29tcHV0ZSB3cG9zLncuICBJdCdzIGFsd2F5cyBpbiBvdXIgc2V0dXAsIHNpbmNlIGl0J3MgbmVlZGVkIHRvCisgICAgKiBpbnRlcnBvbGF0ZSB0aGUgb3RoZXIgYXR0cmlidXRlcy4KKyAgICAqLworICAgdGhpcy0+d3Bvc193ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisgICBlbWl0KEZTX09QQ09ERV9MSU5URVJQLCB3cG9zX3csCisgICAgICAgIHRoaXMtPmRlbHRhX3hbQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDXSwKKyAgICAgICAgdGhpcy0+ZGVsdGFfeVtCUldfV01fUEVSU1BFQ1RJVkVfUElYRUxfQkFSWUNFTlRSSUNdLAorCWludGVycF9yZWcoVkFSWUlOR19TTE9UX1BPUywgMykpOworICAgLyogQ29tcHV0ZSB0aGUgcGl4ZWwgMS9XIHZhbHVlIGZyb20gd3Bvcy53LiAqLworICAgdGhpcy0+cGl4ZWxfdyA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworICAgZW1pdF9tYXRoKFNIQURFUl9PUENPREVfUkNQLCB0aGlzLT5waXhlbF93LCB3cG9zX3cpOworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gTlVMTDsKK30KKworLyoqIEVtaXRzIHRoZSBpbnRlcnBvbGF0aW9uIGZvciB0aGUgdmFyeWluZyBpbnB1dHMuICovCit2b2lkCitmc192aXNpdG9yOjplbWl0X2ludGVycG9sYXRpb25fc2V0dXBfZ2VuNigpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBnMV91dyA9IHJldHlwZShicndfdmVjMV9ncmYoMSwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKworICAgLyogSWYgdGhlIHBpeGVsIGNlbnRlcnMgZW5kIHVwIHVzZWQsIHRoZSBzZXR1cCBpcyB0aGUgc2FtZSBhcyBmb3IgZ2VuNC4gKi8KKyAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9ICJjb21wdXRlIHBpeGVsIGNlbnRlcnMiOworICAgZnNfcmVnIGludF9waXhlbF94ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgIGZzX3JlZyBpbnRfcGl4ZWxfeSA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICBpbnRfcGl4ZWxfeC50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVVc7CisgICBpbnRfcGl4ZWxfeS50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVVc7CisgICBlbWl0KEFERChpbnRfcGl4ZWxfeCwKKyAgICAgICAgICAgIGZzX3JlZyhzdHJpZGUoc3Vib2Zmc2V0KGcxX3V3LCA0KSwgMiwgNCwgMCkpLAorICAgICAgICAgICAgZnNfcmVnKGJyd19pbW1fdigweDEwMTAxMDEwKSkpKTsKKyAgIGVtaXQoQUREKGludF9waXhlbF95LAorICAgICAgICAgICAgZnNfcmVnKHN0cmlkZShzdWJvZmZzZXQoZzFfdXcsIDUpLCAyLCA0LCAwKSksCisgICAgICAgICAgICBmc19yZWcoYnJ3X2ltbV92KDB4MTEwMDExMDApKSkpOworCisgICAvKiBBcyBvZiBnZW42LCB3ZSBjYW4gbm8gbG9uZ2VyIG1peCBmbG9hdCBhbmQgaW50IHNvdXJjZXMuICBXZSBoYXZlCisgICAgKiB0byB0dXJuIHRoZSBpbnRlZ2VyIHBpeGVsIGNlbnRlcnMgaW50byBmbG9hdHMgZm9yIHRoZWlyIGFjdHVhbAorICAgICogdXNlLgorICAgICovCisgICB0aGlzLT5waXhlbF94ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisgICB0aGlzLT5waXhlbF95ID0gZnNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisgICBlbWl0KE1PVih0aGlzLT5waXhlbF94LCBpbnRfcGl4ZWxfeCkpOworICAgZW1pdChNT1YodGhpcy0+cGl4ZWxfeSwgaW50X3BpeGVsX3kpKTsKKworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gImNvbXB1dGUgcG9zLnciOworICAgdGhpcy0+cGl4ZWxfdyA9IGZzX3JlZyhicndfdmVjOF9ncmYoYy0+c291cmNlX3dfcmVnLCAwKSk7CisgICB0aGlzLT53cG9zX3cgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgIGVtaXRfbWF0aChTSEFERVJfT1BDT0RFX1JDUCwgdGhpcy0+d3Bvc193LCB0aGlzLT5waXhlbF93KTsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCUldfV01fQkFSWUNFTlRSSUNfSU5URVJQX01PREVfQ09VTlQ7ICsraSkgeworICAgICAgdWludDhfdCByZWcgPSBjLT5iYXJ5Y2VudHJpY19jb29yZF9yZWdbaV07CisgICAgICB0aGlzLT5kZWx0YV94W2ldID0gZnNfcmVnKGJyd192ZWM4X2dyZihyZWcsIDApKTsKKyAgICAgIHRoaXMtPmRlbHRhX3lbaV0gPSBmc19yZWcoYnJ3X3ZlYzhfZ3JmKHJlZyArIDEsIDApKTsKKyAgIH0KKworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gTlVMTDsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZW1pdF9jb2xvcl93cml0ZShpbnQgdGFyZ2V0LCBpbnQgaW5kZXgsIGludCBmaXJzdF9jb2xvcl9tcmYpCit7CisgICBpbnQgcmVnX3dpZHRoID0gZGlzcGF0Y2hfd2lkdGggLyA4OworICAgZnNfaW5zdCAqaW5zdDsKKyAgIGZzX3JlZyBjb2xvciA9IG91dHB1dHNbdGFyZ2V0XTsKKyAgIGZzX3JlZyBtcmY7CisKKyAgIC8qIElmIHRoZXJlJ3Mgbm8gY29sb3IgZGF0YSB0byBiZSB3cml0dGVuLCBza2lwIGl0LiAqLworICAgaWYgKGNvbG9yLmZpbGUgPT0gQkFEX0ZJTEUpCisgICAgICByZXR1cm47CisKKyAgIGNvbG9yLnJlZ19vZmZzZXQgKz0gaW5kZXg7CisKKyAgIGlmIChkaXNwYXRjaF93aWR0aCA9PSA4IHx8IGJydy0+Z2VuID49IDYpIHsKKyAgICAgIC8qIFNJTUQ4IHdyaXRlIGxvb2tzIGxpa2U6CisgICAgICAgKiBtICsgMDogcjAKKyAgICAgICAqIG0gKyAxOiByMQorICAgICAgICogbSArIDI6IGcwCisgICAgICAgKiBtICsgMzogZzEKKyAgICAgICAqCisgICAgICAgKiBnZW42IFNJTUQxNiBEUCB3cml0ZSBsb29rcyBsaWtlOgorICAgICAgICogbSArIDA6IHIwCisgICAgICAgKiBtICsgMTogcjEKKyAgICAgICAqIG0gKyAyOiBnMAorICAgICAgICogbSArIDM6IGcxCisgICAgICAgKiBtICsgNDogYjAKKyAgICAgICAqIG0gKyA1OiBiMQorICAgICAgICogbSArIDY6IGEwCisgICAgICAgKiBtICsgNzogYTEKKyAgICAgICAqLworICAgICAgaW5zdCA9IGVtaXQoTU9WKGZzX3JlZyhNUkYsIGZpcnN0X2NvbG9yX21yZiArIGluZGV4ICogcmVnX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb2xvcikpOworICAgICAgaW5zdC0+c2F0dXJhdGUgPSBjLT5rZXkuY2xhbXBfZnJhZ21lbnRfY29sb3I7CisgICB9IGVsc2UgeworICAgICAgLyogcHJlLWdlbjYgU0lNRDE2IHNpbmdsZSBzb3VyY2UgRFAgd3JpdGUgbG9va3MgbGlrZToKKyAgICAgICAqIG0gKyAwOiByMAorICAgICAgICogbSArIDE6IGcwCisgICAgICAgKiBtICsgMjogYjAKKyAgICAgICAqIG0gKyAzOiBhMAorICAgICAgICogbSArIDQ6IHIxCisgICAgICAgKiBtICsgNTogZzEKKyAgICAgICAqIG0gKyA2OiBiMQorICAgICAgICogbSArIDc6IGExCisgICAgICAgKi8KKyAgICAgIGlmIChicnctPmhhc19jb21wcjQpIHsKKwkgLyogQnkgc2V0dGluZyB0aGUgaGlnaCBiaXQgb2YgdGhlIE1SRiByZWdpc3RlciBudW1iZXIsIHdlCisJICAqIGluZGljYXRlIHRoYXQgd2Ugd2FudCBDT01QUjQgbW9kZSAtIGluc3RlYWQgb2YgZG9pbmcgdGhlCisJICAqIHVzdWFsIGRlc3RpbmF0aW9uICsgMSBmb3IgdGhlIHNlY29uZCBoYWxmIHdlIGdldAorCSAgKiBkZXN0aW5hdGlvbiArIDQuCisJICAqLworCSBpbnN0ID0gZW1pdChNT1YoZnNfcmVnKE1SRiwgQlJXX01SRl9DT01QUjQgKyBmaXJzdF9jb2xvcl9tcmYgKyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IudHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IpKTsKKwkgaW5zdC0+c2F0dXJhdGUgPSBjLT5rZXkuY2xhbXBfZnJhZ21lbnRfY29sb3I7CisgICAgICB9IGVsc2UgeworCSBwdXNoX2ZvcmNlX3VuY29tcHJlc3NlZCgpOworCSBpbnN0ID0gZW1pdChNT1YoZnNfcmVnKE1SRiwgZmlyc3RfY29sb3JfbXJmICsgaW5kZXgsIGNvbG9yLnR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yKSk7CisJIGluc3QtPnNhdHVyYXRlID0gYy0+a2V5LmNsYW1wX2ZyYWdtZW50X2NvbG9yOworCSBwb3BfZm9yY2VfdW5jb21wcmVzc2VkKCk7CisKKwkgaW5zdCA9IGVtaXQoTU9WKGZzX3JlZyhNUkYsIGZpcnN0X2NvbG9yX21yZiArIGluZGV4ICsgNCwgY29sb3IudHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFsZihjb2xvciwgMSkpKTsKKwkgaW5zdC0+Zm9yY2Vfc2VjaGFsZiA9IHRydWU7CisJIGluc3QtPnNhdHVyYXRlID0gYy0+a2V5LmNsYW1wX2ZyYWdtZW50X2NvbG9yOworICAgICAgfQorICAgfQorfQorCitzdGF0aWMgaW50Citjb25kX2Zvcl9hbHBoYV9mdW5jKEdMZW51bSBmdW5jKQoreworICAgc3dpdGNoKGZ1bmMpIHsKKyAgICAgIGNhc2UgR0xfR1JFQVRFUjoKKyAgICAgICAgIHJldHVybiBCUldfQ09ORElUSU9OQUxfRzsKKyAgICAgIGNhc2UgR0xfR0VRVUFMOgorICAgICAgICAgcmV0dXJuIEJSV19DT05ESVRJT05BTF9HRTsKKyAgICAgIGNhc2UgR0xfTEVTUzoKKyAgICAgICAgIHJldHVybiBCUldfQ09ORElUSU9OQUxfTDsKKyAgICAgIGNhc2UgR0xfTEVRVUFMOgorICAgICAgICAgcmV0dXJuIEJSV19DT05ESVRJT05BTF9MRTsKKyAgICAgIGNhc2UgR0xfRVFVQUw6CisgICAgICAgICByZXR1cm4gQlJXX0NPTkRJVElPTkFMX0VROworICAgICAgY2FzZSBHTF9OT1RFUVVBTDoKKyAgICAgICAgIHJldHVybiBCUldfQ09ORElUSU9OQUxfTkVROworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFzc2VydCghIk5vdCByZWFjaGVkIik7CisgICAgICAgICByZXR1cm4gMDsKKyAgIH0KK30KKworLyoqCisgKiBBbHBoYSB0ZXN0IHN1cHBvcnQgZm9yIHdoZW4gd2UgY29tcGlsZSBpdCBpbnRvIHRoZSBzaGFkZXIgaW5zdGVhZAorICogb2YgdXNpbmcgdGhlIG5vcm1hbCBmaXhlZC1mdW5jdGlvbiBhbHBoYSB0ZXN0LgorICovCit2b2lkCitmc192aXNpdG9yOjplbWl0X2FscGhhX3Rlc3QoKQoreworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gIkFscGhhIHRlc3QiOworCisgICBmc19pbnN0ICpjbXA7CisgICBpZiAoYy0+a2V5LmFscGhhX3Rlc3RfZnVuYyA9PSBHTF9BTFdBWVMpCisgICAgICByZXR1cm47CisKKyAgIGlmIChjLT5rZXkuYWxwaGFfdGVzdF9mdW5jID09IEdMX05FVkVSKSB7CisgICAgICAvKiBmMC4xID0gMCAqLworICAgICAgZnNfcmVnIHNvbWVfcmVnID0gZnNfcmVnKHJldHlwZShicndfdmVjOF9ncmYoMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19SRUdJU1RFUl9UWVBFX1VXKSk7CisgICAgICBjbXAgPSBlbWl0KENNUChyZWdfbnVsbF9mLCBzb21lX3JlZywgc29tZV9yZWcsCisgICAgICAgICAgICAgICAgICAgICBCUldfQ09ORElUSU9OQUxfTkVRKSk7CisgICB9IGVsc2UgeworICAgICAgLyogUlQwIGFscGhhICovCisgICAgICBmc19yZWcgY29sb3IgPSBvdXRwdXRzWzBdOworICAgICAgY29sb3IucmVnX29mZnNldCArPSAzOworCisgICAgICAvKiBmMC4xICY9IGZ1bmMoY29sb3IsIHJlZikgKi8KKyAgICAgIGNtcCA9IGVtaXQoQ01QKHJlZ19udWxsX2YsIGNvbG9yLCBmc19yZWcoYy0+a2V5LmFscGhhX3Rlc3RfcmVmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbmRfZm9yX2FscGhhX2Z1bmMoYy0+a2V5LmFscGhhX3Rlc3RfZnVuYykpKTsKKyAgIH0KKyAgIGNtcC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICBjbXAtPmZsYWdfc3VicmVnID0gMTsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6ZW1pdF9mYl93cml0ZXMoKQoreworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gIkZCIHdyaXRlIGhlYWRlciI7CisgICBib29sIGhlYWRlcl9wcmVzZW50ID0gdHJ1ZTsKKyAgIC8qIFdlIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgbWVzc2FnZSBsZW5ndGggb2YgdXAgdG8gMTUsIHNvIHdlIGhhdmUgdG8gc2V0CisgICAgKiBiYXNlX21yZiB0byBlaXRoZXIgMCBvciAxIGluIG9yZGVyIHRvIGZpdCBpbiBtMC4ubTE1LgorICAgICovCisgICBpbnQgYmFzZV9tcmYgPSAxOworICAgaW50IG5yID0gYmFzZV9tcmY7CisgICBpbnQgcmVnX3dpZHRoID0gZGlzcGF0Y2hfd2lkdGggLyA4OworICAgYm9vbCBzcmMwX2FscGhhX3RvX3JlbmRlcl90YXJnZXQgPSBmYWxzZTsKKworICAgaWYgKGRvX2R1YWxfc3JjKSB7CisgICAgICBubzE2KCJHTF9BUkJfYmxlbmRfZnVuY19leHRlbmRlZCBub3QgeWV0IHN1cHBvcnRlZCBpbiBTSU1EMTYuIik7CisgICAgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYpCisgICAgICAgICBkb19kdWFsX3NyYyA9IGZhbHNlOworICAgfQorCisgICAvKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCwgcGFnZSAxOTg6CisgICAgKgorICAgICogICAgICJEaXNwYXRjaGVkIFBpeGVsIEVuYWJsZXMuIE9uZSBiaXQgcGVyIHBpeGVsIGluZGljYXRpbmcKKyAgICAqICAgICAgd2hpY2ggcGl4ZWxzIHdlcmUgb3JpZ2luYWxseSBlbmFibGVkIHdoZW4gdGhlIHRocmVhZCB3YXMKKyAgICAqICAgICAgZGlzcGF0Y2hlZC4gVGhpcyBmaWVsZCBpcyBvbmx5IHJlcXVpcmVkIGZvciB0aGUgZW5kLW9mLQorICAgICogICAgICB0aHJlYWQgbWVzc2FnZSBhbmQgb24gYWxsIGR1YWwtc291cmNlIG1lc3NhZ2VzLiIKKyAgICAqLworICAgaWYgKGJydy0+Z2VuID49IDYgJiYKKyAgICAgICAoYnJ3LT5pc19oYXN3ZWxsIHx8IGJydy0+Z2VuID49IDggfHwgIXRoaXMtPmZwLT5Vc2VzS2lsbCkgJiYKKyAgICAgICAhZG9fZHVhbF9zcmMgJiYKKyAgICAgICBjLT5rZXkubnJfY29sb3JfcmVnaW9ucyA9PSAxKSB7CisgICAgICBoZWFkZXJfcHJlc2VudCA9IGZhbHNlOworICAgfQorCisgICBpZiAoaGVhZGVyX3ByZXNlbnQpIHsKKyAgICAgIHNyYzBfYWxwaGFfdG9fcmVuZGVyX3RhcmdldCA9IGJydy0+Z2VuID49IDYgJiYKKwkJCQkgICAgIWRvX2R1YWxfc3JjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5rZXkucmVwbGljYXRlX2FscGhhOworICAgICAgLyogbTIsIG0zIGhlYWRlciAqLworICAgICAgbnIgKz0gMjsKKyAgIH0KKworICAgaWYgKGMtPmFhX2Rlc3Rfc3RlbmNpbF9yZWcpIHsKKyAgICAgIHB1c2hfZm9yY2VfdW5jb21wcmVzc2VkKCk7CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBucisrKSwKKyAgICAgICAgICAgICAgIGZzX3JlZyhicndfdmVjOF9ncmYoYy0+YWFfZGVzdF9zdGVuY2lsX3JlZywgMCkpKSk7CisgICAgICBwb3BfZm9yY2VfdW5jb21wcmVzc2VkKCk7CisgICB9CisKKyAgIGMtPnByb2dfZGF0YS51c2VzX29tYXNrID0KKyAgICAgIGZwLT5CYXNlLk91dHB1dHNXcml0dGVuICYgQklURklFTEQ2NF9CSVQoRlJBR19SRVNVTFRfU0FNUExFX01BU0spOworICAgaWYoYy0+cHJvZ19kYXRhLnVzZXNfb21hc2spIHsKKyAgICAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9ICJGQiB3cml0ZSBvTWFzayI7CisgICAgICBhc3NlcnQodGhpcy0+c2FtcGxlX21hc2suZmlsZSAhPSBCQURfRklMRSk7CisgICAgICAvKiBIYW5kIG92ZXIgZ2xfU2FtcGxlTWFzay4gT25seSBsb3dlciAxNiBiaXRzIGFyZSByZWxldmFudC4gKi8KKyAgICAgIGVtaXQoRlNfT1BDT0RFX1NFVF9PTUFTSywgZnNfcmVnKE1SRiwgbnIsIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwgdGhpcy0+c2FtcGxlX21hc2spOworICAgICAgbnIgKz0gMTsKKyAgIH0KKworICAgLyogUmVzZXJ2ZSBzcGFjZSBmb3IgY29sb3IuIEl0J2xsIGJlIGZpbGxlZCBpbiBwZXIgTVJUIGJlbG93LiAqLworICAgaW50IGNvbG9yX21yZiA9IG5yOworICAgbnIgKz0gNCAqIHJlZ193aWR0aDsKKyAgIGlmIChkb19kdWFsX3NyYykKKyAgICAgIG5yICs9IDQ7CisgICBpZiAoc3JjMF9hbHBoYV90b19yZW5kZXJfdGFyZ2V0KQorICAgICAgbnIgKz0gcmVnX3dpZHRoOworCisgICBpZiAoYy0+c291cmNlX2RlcHRoX3RvX3JlbmRlcl90YXJnZXQpIHsKKyAgICAgIGlmIChicnctPmdlbiA9PSA2KSB7CisJIC8qIEZvciBvdXRwdXR0aW5nIG9EZXB0aCBvbiBnZW42LCBTSU1EOCB3cml0ZXMgaGF2ZSB0byBiZQorCSAgKiB1c2VkLiAgVGhpcyB3b3VsZCByZXF1aXJlIFNJTUQ4IG1vdmVzIG9mIGVhY2ggaGFsZiB0bworCSAgKiBtZXNzYWdlIHJlZ3MsIGtpbmQgb2YgbGlrZSBwcmUtZ2VuNSBTSU1EMTYgRkIgd3JpdGVzLgorCSAgKiBKdXN0IGJhaWwgb24gZG9pbmcgc28gZm9yIG5vdy4KKwkgICovCisJIG5vMTYoIk1pc3Npbmcgc3VwcG9ydCBmb3Igc2ltZDE2IGRlcHRoIHdyaXRlcyBvbiBnZW42XG4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKHByb2ctPk91dHB1dHNXcml0dGVuICYgQklURklFTEQ2NF9CSVQoRlJBR19SRVNVTFRfREVQVEgpKSB7CisJIC8qIEhhbmQgb3ZlciBnbF9GcmFnRGVwdGguICovCisJIGFzc2VydCh0aGlzLT5mcmFnX2RlcHRoLmZpbGUgIT0gQkFEX0ZJTEUpOworCSBlbWl0KE1PVihmc19yZWcoTVJGLCBuciksIHRoaXMtPmZyYWdfZGVwdGgpKTsKKyAgICAgIH0gZWxzZSB7CisJIC8qIFBhc3MgdGhyb3VnaCB0aGUgcGF5bG9hZCBkZXB0aC4gKi8KKwkgZW1pdChNT1YoZnNfcmVnKE1SRiwgbnIpLAorICAgICAgICAgICAgICAgICAgZnNfcmVnKGJyd192ZWM4X2dyZihjLT5zb3VyY2VfZGVwdGhfcmVnLCAwKSkpKTsKKyAgICAgIH0KKyAgICAgIG5yICs9IHJlZ193aWR0aDsKKyAgIH0KKworICAgaWYgKGMtPmRlc3RfZGVwdGhfcmVnKSB7CisgICAgICBlbWl0KE1PVihmc19yZWcoTVJGLCBuciksCisgICAgICAgICAgICAgICBmc19yZWcoYnJ3X3ZlYzhfZ3JmKGMtPmRlc3RfZGVwdGhfcmVnLCAwKSkpKTsKKyAgICAgIG5yICs9IHJlZ193aWR0aDsKKyAgIH0KKworICAgaWYgKGRvX2R1YWxfc3JjKSB7CisgICAgICBmc19yZWcgc3JjMCA9IHRoaXMtPm91dHB1dHNbMF07CisgICAgICBmc19yZWcgc3JjMSA9IHRoaXMtPmR1YWxfc3JjX291dHB1dDsKKworICAgICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gcmFsbG9jX2FzcHJpbnRmKHRoaXMtPm1lbV9jdHgsCisJCQkJCQkgIkZCIHdyaXRlIHNyYzAiKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJIGZzX2luc3QgKmluc3QgPSBlbWl0KE1PVihmc19yZWcoTVJGLCBjb2xvcl9tcmYgKyBpLCBzcmMwLnR5cGUpLCBzcmMwKSk7CisJIHNyYzAucmVnX29mZnNldCsrOworCSBpbnN0LT5zYXR1cmF0ZSA9IGMtPmtleS5jbGFtcF9mcmFnbWVudF9jb2xvcjsKKyAgICAgIH0KKworICAgICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gcmFsbG9jX2FzcHJpbnRmKHRoaXMtPm1lbV9jdHgsCisJCQkJCQkgIkZCIHdyaXRlIHNyYzEiKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJIGZzX2luc3QgKmluc3QgPSBlbWl0KE1PVihmc19yZWcoTVJGLCBjb2xvcl9tcmYgKyA0ICsgaSwgc3JjMS50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxKSk7CisJIHNyYzEucmVnX29mZnNldCsrOworCSBpbnN0LT5zYXR1cmF0ZSA9IGMtPmtleS5jbGFtcF9mcmFnbWVudF9jb2xvcjsKKyAgICAgIH0KKworLy8gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TSEFERVJfVElNRSkKKy8vICAgICAgICAgZW1pdF9zaGFkZXJfdGltZV9lbmQoKTsKKworICAgICAgZnNfaW5zdCAqaW5zdCA9IGVtaXQoRlNfT1BDT0RFX0ZCX1dSSVRFKTsKKyAgICAgIGluc3QtPnRhcmdldCA9IDA7CisgICAgICBpbnN0LT5iYXNlX21yZiA9IGJhc2VfbXJmOworICAgICAgaW5zdC0+bWxlbiA9IG5yIC0gYmFzZV9tcmY7CisgICAgICBpbnN0LT5lb3QgPSB0cnVlOworICAgICAgaW5zdC0+aGVhZGVyX3ByZXNlbnQgPSBoZWFkZXJfcHJlc2VudDsKKyAgICAgIGlmICgoYnJ3LT5nZW4gPj0gOCB8fCBicnctPmlzX2hhc3dlbGwpICYmIGZwLT5Vc2VzS2lsbCkgeworICAgICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICAgICAgICBpbnN0LT5mbGFnX3N1YnJlZyA9IDE7CisgICAgICB9CisKKyAgICAgIGMtPnByb2dfZGF0YS5kdWFsX3NyY19ibGVuZCA9IHRydWU7CisgICAgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSBOVUxMOworICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3IgKGludCB0YXJnZXQgPSAwOyB0YXJnZXQgPCBjLT5rZXkubnJfY29sb3JfcmVnaW9uczsgdGFyZ2V0KyspIHsKKyAgICAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9IHJhbGxvY19hc3ByaW50Zih0aGlzLT5tZW1fY3R4LAorCQkJCQkJICJGQiB3cml0ZSB0YXJnZXQgJWQiLAorCQkJCQkJIHRhcmdldCk7CisgICAgICAvKiBJZiBzcmMwX2FscGhhX3RvX3JlbmRlcl90YXJnZXQgaXMgdHJ1ZSwgaW5jbHVkZSBzb3VyY2UgemVybyBhbHBoYQorICAgICAgICogZGF0YSBpbiBSZW5kZXJUYXJnZXRXcml0ZSBtZXNzYWdlIGZvciB0YXJnZXRzID4gMC4KKyAgICAgICAqLworICAgICAgaW50IHdyaXRlX2NvbG9yX21yZiA9IGNvbG9yX21yZjsKKyAgICAgIGlmIChzcmMwX2FscGhhX3RvX3JlbmRlcl90YXJnZXQgJiYgdGFyZ2V0ICE9IDApIHsKKyAgICAgICAgIGZzX2luc3QgKmluc3Q7CisgICAgICAgICBmc19yZWcgY29sb3IgPSBvdXRwdXRzWzBdOworICAgICAgICAgY29sb3IucmVnX29mZnNldCArPSAzOworCisgICAgICAgICBpbnN0ID0gZW1pdChNT1YoZnNfcmVnKE1SRiwgd3JpdGVfY29sb3JfbXJmLCBjb2xvci50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcikpOworICAgICAgICAgaW5zdC0+c2F0dXJhdGUgPSBjLT5rZXkuY2xhbXBfZnJhZ21lbnRfY29sb3I7CisgICAgICAgICB3cml0ZV9jb2xvcl9tcmYgPSBjb2xvcl9tcmYgKyByZWdfd2lkdGg7CisgICAgICB9CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0aGlzLT5vdXRwdXRfY29tcG9uZW50c1t0YXJnZXRdOyBpKyspCisgICAgICAgICBlbWl0X2NvbG9yX3dyaXRlKHRhcmdldCwgaSwgd3JpdGVfY29sb3JfbXJmKTsKKworICAgICAgYm9vbCBlb3QgPSBmYWxzZTsKKyAgICAgIGlmICh0YXJnZXQgPT0gYy0+a2V5Lm5yX2NvbG9yX3JlZ2lvbnMgLSAxKSB7CisgICAgICAgICBlb3QgPSB0cnVlOworCisvLyAgICAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NIQURFUl9USU1FKQorLy8gICAgICAgICAgICBlbWl0X3NoYWRlcl90aW1lX2VuZCgpOworICAgICAgfQorCisgICAgICBmc19pbnN0ICppbnN0ID0gZW1pdChGU19PUENPREVfRkJfV1JJVEUpOworICAgICAgaW5zdC0+dGFyZ2V0ID0gdGFyZ2V0OworICAgICAgaW5zdC0+YmFzZV9tcmYgPSBiYXNlX21yZjsKKyAgICAgIGlmIChzcmMwX2FscGhhX3RvX3JlbmRlcl90YXJnZXQgJiYgdGFyZ2V0ID09IDApCisgICAgICAgICBpbnN0LT5tbGVuID0gbnIgLSBiYXNlX21yZiAtIHJlZ193aWR0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgIGluc3QtPm1sZW4gPSBuciAtIGJhc2VfbXJmOworICAgICAgaW5zdC0+ZW90ID0gZW90OworICAgICAgaW5zdC0+aGVhZGVyX3ByZXNlbnQgPSBoZWFkZXJfcHJlc2VudDsKKyAgICAgIGlmICgoYnJ3LT5nZW4gPj0gOCB8fCBicnctPmlzX2hhc3dlbGwpICYmIGZwLT5Vc2VzS2lsbCkgeworICAgICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICAgICAgICBpbnN0LT5mbGFnX3N1YnJlZyA9IDE7CisgICAgICB9CisgICB9CisKKyAgIGlmIChjLT5rZXkubnJfY29sb3JfcmVnaW9ucyA9PSAwKSB7CisgICAgICAvKiBFdmVuIGlmIHRoZXJlJ3Mgbm8gY29sb3IgYnVmZmVycyBlbmFibGVkLCB3ZSBzdGlsbCBuZWVkIHRvIHNlbmQKKyAgICAgICAqIGFscGhhIG91dCB0aGUgcGlwZWxpbmUgdG8gb3VyIG51bGwgcmVuZGVyYnVmZmVyIHRvIHN1cHBvcnQKKyAgICAgICAqIGFscGhhLXRlc3RpbmcsIGFscGhhLXRvLWNvdmVyYWdlLCBhbmQgc28gb24uCisgICAgICAgKi8KKyAgICAgIGVtaXRfY29sb3Jfd3JpdGUoMCwgMywgY29sb3JfbXJmKTsKKworLy8gICAgICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TSEFERVJfVElNRSkKKy8vICAgICAgICAgZW1pdF9zaGFkZXJfdGltZV9lbmQoKTsKKworICAgICAgZnNfaW5zdCAqaW5zdCA9IGVtaXQoRlNfT1BDT0RFX0ZCX1dSSVRFKTsKKyAgICAgIGluc3QtPmJhc2VfbXJmID0gYmFzZV9tcmY7CisgICAgICBpbnN0LT5tbGVuID0gbnIgLSBiYXNlX21yZjsKKyAgICAgIGluc3QtPmVvdCA9IHRydWU7CisgICAgICBpbnN0LT5oZWFkZXJfcHJlc2VudCA9IGhlYWRlcl9wcmVzZW50OworICAgICAgaWYgKChicnctPmdlbiA+PSA4IHx8IGJydy0+aXNfaGFzd2VsbCkgJiYgZnAtPlVzZXNLaWxsKSB7CisgICAgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgICAgICAgIGluc3QtPmZsYWdfc3VicmVnID0gMTsKKyAgICAgIH0KKyAgIH0KKworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gTlVMTDsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6cmVzb2x2ZV91ZF9uZWdhdGUoZnNfcmVnICpyZWcpCit7CisgICBpZiAocmVnLT50eXBlICE9IEJSV19SRUdJU1RFUl9UWVBFX1VEIHx8CisgICAgICAgIXJlZy0+bmVnYXRlKQorICAgICAgcmV0dXJuOworCisgICBmc19yZWcgdGVtcCA9IGZzX3JlZyh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICBlbWl0KE1PVih0ZW1wLCAqcmVnKSk7CisgICAqcmVnID0gdGVtcDsKK30KKwordm9pZAorZnNfdmlzaXRvcjo6cmVzb2x2ZV9ib29sX2NvbXBhcmlzb24oaXJfcnZhbHVlICpydmFsdWUsIGZzX3JlZyAqcmVnKQoreworICAgaWYgKHJ2YWx1ZS0+dHlwZSAhPSBnbHNsX3R5cGU6OmJvb2xfdHlwZSkKKyAgICAgIHJldHVybjsKKworICAgZnNfcmVnIHRlbXAgPSBmc19yZWcodGhpcywgZ2xzbF90eXBlOjpib29sX3R5cGUpOworICAgZW1pdChBTkQodGVtcCwgKnJlZywgZnNfcmVnKDEpKSk7CisgICAqcmVnID0gdGVtcDsKK30KKworZnNfdmlzaXRvcjo6ZnNfdmlzaXRvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRpc3BhdGNoX3dpZHRoKQorICAgOiBiYWNrZW5kX3Zpc2l0b3IoYnJ3LCBzaGFkZXJfcHJvZywgJmZwLT5CYXNlLCAmYy0+cHJvZ19kYXRhLmJhc2UsCisgICAgICAgICAgICAgICAgICAgICBNRVNBX1NIQURFUl9GUkFHTUVOVCksCisgICAgIGRpc3BhdGNoX3dpZHRoKGRpc3BhdGNoX3dpZHRoKQoreworICAgdGhpcy0+YyA9IGM7CisgICB0aGlzLT5mcCA9IGZwOworICAgdGhpcy0+bWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworICAgdGhpcy0+ZmFpbGVkID0gZmFsc2U7CisgICB0aGlzLT5zaW1kMTZfdW5zdXBwb3J0ZWQgPSBmYWxzZTsKKyAgIHRoaXMtPm5vMTZfbXNnID0gTlVMTDsKKyAgIHRoaXMtPnZhcmlhYmxlX2h0ID0gaGFzaF90YWJsZV9jdG9yKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3RhYmxlX3BvaW50ZXJfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKTsKKworICAgbWVtc2V0KHRoaXMtPm91dHB1dHMsIDAsIHNpemVvZih0aGlzLT5vdXRwdXRzKSk7CisgICBtZW1zZXQodGhpcy0+b3V0cHV0X2NvbXBvbmVudHMsIDAsIHNpemVvZih0aGlzLT5vdXRwdXRfY29tcG9uZW50cykpOworICAgdGhpcy0+Zmlyc3Rfbm9uX3BheWxvYWRfZ3JmID0gMDsKKyAgIHRoaXMtPm1heF9ncmYgPSBicnctPmdlbiA+PSA3ID8gR0VON19NUkZfSEFDS19TVEFSVCA6IEJSV19NQVhfR1JGOworCisgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSBOVUxMOworICAgdGhpcy0+YmFzZV9pciA9IE5VTEw7CisKKyAgIHRoaXMtPnZpcnR1YWxfZ3JmX3NpemVzID0gTlVMTDsKKyAgIHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50ID0gMDsKKyAgIHRoaXMtPnZpcnR1YWxfZ3JmX2FycmF5X3NpemUgPSAwOworICAgdGhpcy0+dmlydHVhbF9ncmZfc3RhcnQgPSBOVUxMOworICAgdGhpcy0+dmlydHVhbF9ncmZfZW5kID0gTlVMTDsKKyAgIHRoaXMtPmxpdmVfaW50ZXJ2YWxzID0gTlVMTDsKKyAgIHRoaXMtPnJlZ3NfbGl2ZV9hdF9pcCA9IE5VTEw7CisKKyAgIHRoaXMtPnVuaWZvcm1zID0gMDsKKyAgIHRoaXMtPnB1bGxfY29uc3RhbnRfbG9jID0gTlVMTDsKKyAgIHRoaXMtPnB1c2hfY29uc3RhbnRfbG9jID0gTlVMTDsKKworICAgdGhpcy0+Zm9yY2VfdW5jb21wcmVzc2VkX3N0YWNrID0gMDsKKworICAgdGhpcy0+c3BpbGxlZF9hbnlfcmVnaXN0ZXJzID0gZmFsc2U7CisgICB0aGlzLT5kb19kdWFsX3NyYyA9IGZhbHNlOworCisgICBpZiAoZGlzcGF0Y2hfd2lkdGggPT0gOCkKKyAgICAgIHRoaXMtPnBhcmFtX3NpemUgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgc3RhZ2VfcHJvZ19kYXRhLT5ucl9wYXJhbXMpOworfQorCitmc192aXNpdG9yOjp+ZnNfdmlzaXRvcigpCit7CisgICByYWxsb2NfZnJlZSh0aGlzLT5tZW1fY3R4KTsKKyAgIGhhc2hfdGFibGVfZHRvcih0aGlzLT52YXJpYWJsZV9odCk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2xvd2VyX3RleHR1cmVfZ3JhZGllbnRzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfbG93ZXJfdGV4dHVyZV9ncmFkaWVudHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODlhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2xvd2VyX3RleHR1cmVfZ3JhZGllbnRzLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgYnJ3X2xvd2VyX3RleHR1cmVfZ3JhZGllbnRzLmNwcAorICovCisKKyNpbmNsdWRlICJnbHNsL2lyLmgiCisjaW5jbHVkZSAiZ2xzbC9pcl9idWlsZGVyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGlyX2J1aWxkZXI7CisKK2NsYXNzIGxvd2VyX3RleHR1cmVfZ3JhZF92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxvd2VyX3RleHR1cmVfZ3JhZF92aXNpdG9yKGJvb2wgaGFzX3NhbXBsZV9kX2MpCisgICAgICA6IGhhc19zYW1wbGVfZF9jKGhhc19zYW1wbGVfZF9jKQorICAgeworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfdGV4dHVyZSAqaXIpOworCisKKyAgIGJvb2wgcHJvZ3Jlc3M7CisgICBib29sIGhhc19zYW1wbGVfZF9jOworCitwcml2YXRlOgorICAgdm9pZCBlbWl0KGlyX3ZhcmlhYmxlICosIGlyX3J2YWx1ZSAqKTsKK307CisKKy8qKgorICogRW1pdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHRvIGluaXRpYWxpemUgaXQuCisgKi8KK3ZvaWQKK2xvd2VyX3RleHR1cmVfZ3JhZF92aXNpdG9yOjplbWl0KGlyX3ZhcmlhYmxlICp2YXIsIGlyX3J2YWx1ZSAqdmFsdWUpCit7CisgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKHZhcik7CisgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGFzc2lnbih2YXIsIHZhbHVlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBnbHNsX3R5cGUgKgordHhzX3R5cGUoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgdW5zaWduZWQgZGltczsKKyAgIHN3aXRjaCAodHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSkgeworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzFEOgorICAgICAgZGltcyA9IDE7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xTTF9TQU1QTEVSX0RJTV8yRDoKKyAgIGNhc2UgR0xTTF9TQU1QTEVSX0RJTV9SRUNUOgorICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNX0NVQkU6CisgICAgICBkaW1zID0gMjsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzNEOgorICAgICAgZGltcyA9IDM7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlOiBpbnZhbGlkIHNhbXBsZXIgZGltZW5zaW9uYWxpdHkiKTsKKyAgICAgIGRpbXMgPSAyOworICAgfQorCisgICBpZiAodHlwZS0+c2FtcGxlcl9hcnJheSkKKyAgICAgIGRpbXMrKzsKKworICAgcmV0dXJuIGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9JTlQsIGRpbXMsIDEpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworbG93ZXJfdGV4dHVyZV9ncmFkX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX3RleHR1cmUgKmlyKQoreworICAgLyogT25seSBsb3dlciB0ZXh0dXJlR3JhZCB3aXRoIHNoYWRvdyBzYW1wbGVycyAqLworICAgaWYgKGlyLT5vcCAhPSBpcl90eGQgfHwgIWlyLT5zaGFkb3dfY29tcGFyaXRvcikKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgLyogTG93ZXIgdGV4dHVyZUdyYWQoKSB3aXRoIHNhbXBsZXJDdWJlU2hhZG93IGV2ZW4gaWYgd2UgaGF2ZSB0aGUgc2FtcGxlX2RfYworICAgICogbWVzc2FnZS4gIEdMU0wgcHJvdmlkZXMgZ3JhZGllbnRzIGZvciB0aGUgJ3InIGNvb3JkaW5hdGUuICBVbmZvcnR1bmF0ZWx5OgorICAgICoKKyAgICAqIEZyb20gdGhlIEl2eWJyaWRnZSBQUk0sIFZvbHVtZSA0LCBQYXJ0IDEsIHNhbXBsZV9kIG1lc3NhZ2UgZGVzY3JpcHRpb246CisgICAgKiAiVGhlIHIgY29vcmRpbmF0ZSBjb250YWlucyB0aGUgZmFjZWlkLCBhbmQgdGhlIHIgZ3JhZGllbnRzIGFyZSBpZ25vcmVkCisgICAgKiAgYnkgaGFyZHdhcmUuIgorICAgICoKKyAgICAqIFdlIGxpa2VseSBuZWVkIHRvIGRvIGEgc2ltaWxhciB0cmVhdG1lbnQgZm9yIHNhbXBsZXJDdWJlIGFuZAorICAgICogc2FtcGxlckN1YmVBcnJheSwgYnV0IHdlIGhhdmUgaW5zdWZmaWNpZW50IHRlc3RpbmcgZm9yIHRoYXQgYXQgdGhlIG1vbWVudC4KKyAgICAqLworICAgYm9vbCBuZWVkX2xvd2VyaW5nID0gIWhhc19zYW1wbGVfZF9jIHx8CisgICAgICBpci0+c2FtcGxlci0+dHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSA9PSBHTFNMX1NBTVBMRVJfRElNX0NVQkU7CisKKyAgIGlmICghbmVlZF9sb3dlcmluZykKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICBjb25zdCBnbHNsX3R5cGUgKmdyYWRfdHlwZSA9IGlyLT5sb2RfaW5mby5ncmFkLmRQZHgtPnR5cGU7CisKKyAgIC8qIFVzZSB0ZXh0dXJlU2l6ZSgpIHRvIGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBMT0QgMDsgc3dpenpsZSBhd2F5CisgICAgKiB0aGUgZGVwdGgvbnVtYmVyIG9mIGFycmF5IHNsaWNlcy4KKyAgICAqLworICAgaXJfdGV4dHVyZSAqdHhzID0gbmV3KG1lbV9jdHgpIGlyX3RleHR1cmUoaXJfdHhzKTsKKyAgIHR4cy0+c2V0X3NhbXBsZXIoaXItPnNhbXBsZXItPmNsb25lKG1lbV9jdHgsIE5VTEwpLAorCQkgICAgdHhzX3R5cGUoaXItPnNhbXBsZXItPnR5cGUpKTsKKyAgIHR4cy0+bG9kX2luZm8ubG9kID0gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KDApOworICAgaXJfdmFyaWFibGUgKnNpemUgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGdyYWRfdHlwZSwgInNpemUiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGlmIChpci0+c2FtcGxlci0+dHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSA9PSBHTFNMX1NBTVBMRVJfRElNX0NVQkUpIHsKKyAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoc2l6ZSk7CisgICAgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGFzc2lnbihzaXplLCBleHByKGlyX3Vub3BfaTJmLCB0eHMpLCBXUklURU1BU0tfWFkpKTsKKyAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKHNpemUsIG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudCgxLjBmKSwgV1JJVEVNQVNLX1opKTsKKyAgIH0gZWxzZSB7CisgICAgICBlbWl0KHNpemUsIGV4cHIoaXJfdW5vcF9pMmYsCisgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZV9mb3Jfc2l6ZSh0eHMsIGdyYWRfdHlwZS0+dmVjdG9yX2VsZW1lbnRzKSkpOworICAgfQorCisgICAvKiBTY2FsZSB0aGUgZ3JhZGllbnRzIGJ5IHdpZHRoIGFuZCBoZWlnaHQuICBFZmZlY3RpdmVseSwgdGhlIGluY29taW5nCisgICAgKiBncmFkaWVudHMgYXJlIHMnKHgseSksIHQnKHgseSksIGFuZCByJyh4LHkpIGZyb20gZXF1YXRpb24gMy4xOSBpbiB0aGUKKyAgICAqIEdMIDMuMCBzcGVjOyB3ZSB3YW50IHUnKHgseSksIHdoaWNoIGlzIHdfdCAqIHMnKHgseSkuCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICpkUGR4ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShncmFkX3R5cGUsICJkUGR4IiwgaXJfdmFyX3RlbXBvcmFyeSk7CisgICBlbWl0KGRQZHgsIG11bChzaXplLCBpci0+bG9kX2luZm8uZ3JhZC5kUGR4KSk7CisKKyAgIGlyX3ZhcmlhYmxlICpkUGR5ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShncmFkX3R5cGUsICJkUGR5IiwgaXJfdmFyX3RlbXBvcmFyeSk7CisgICBlbWl0KGRQZHksIG11bChzaXplLCBpci0+bG9kX2luZm8uZ3JhZC5kUGR5KSk7CisKKyAgIC8qIENhbGN1bGF0ZSByaG8gZnJvbSBlcXVhdGlvbiAzLjIwIG9mIHRoZSBHTCAzLjAgc3BlY2lmaWNhdGlvbi4gKi8KKyAgIGlyX3J2YWx1ZSAqcmhvOworICAgaWYgKGRQZHgtPnR5cGUtPmlzX3NjYWxhcigpKSB7CisgICAgICByaG8gPSBleHByKGlyX2Jpbm9wX21heCwgZXhwcihpcl91bm9wX2FicywgZFBkeCksCisJCQkgICAgICAgZXhwcihpcl91bm9wX2FicywgZFBkeSkpOworICAgfSBlbHNlIHsKKyAgICAgIHJobyA9IGV4cHIoaXJfYmlub3BfbWF4LCBleHByKGlyX3Vub3Bfc3FydCwgZG90KGRQZHgsIGRQZHgpKSwKKwkJCSAgICAgICBleHByKGlyX3Vub3Bfc3FydCwgZG90KGRQZHksIGRQZHkpKSk7CisgICB9CisKKyAgIC8qIGxhbWJkYV9iYXNlID0gbG9nMihyaG8pLiAgV2UncmUgaWdub3JpbmcgR0wgc3RhdGUgYmlhc2VzIGZvciBub3cuICovCisgICBpci0+b3AgPSBpcl90eGw7CisgICBpci0+bG9kX2luZm8ubG9kID0gZXhwcihpcl91bm9wX2xvZzIsIHJobyk7CisKKyAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworZXh0ZXJuICJDIiB7CisKK2Jvb2wKK2Jyd19sb3dlcl90ZXh0dXJlX2dyYWRpZW50cyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBib29sIGhhc19zYW1wbGVfZF9jID0gYnJ3LT5nZW4gPj0gOCB8fCBicnctPmlzX2hhc3dlbGw7CisgICBsb3dlcl90ZXh0dXJlX2dyYWRfdmlzaXRvciB2KGhhc19zYW1wbGVfZF9jKTsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CisKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfbG93ZXJfdW5ub3JtYWxpemVkX29mZnNldC5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2xvd2VyX3Vubm9ybWFsaXplZF9vZmZzZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWQ3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2xvd2VyX3Vubm9ybWFsaXplZF9vZmZzZXQuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBicndfbG93ZXJfdW5ub3JtYWxpemVkX29mZnNldC5jcHAKKyAqCisgKiBJUiBsb3dlciBwYXNzIHRvIGNvbnZlcnQgYSB0ZXh0dXJlIG9mZnNldCBpbnRvIGFuIGFkanVzdGVkIGNvb3JkaW5hdGUsCisgKiBmb3IgdXNlIHdpdGggdW5ub3JtYWxpemVkIGNvb3JkaW5hdGVzLiBBdCBsZWFzdCB0aGUgZ2F0aGVyNCogbWVzc2FnZXMKKyAqIG9uIEl2eWJyaWRnZSBhbmQgSGFzd2VsbCBtYWtlIGEgbWVzcyB3aXRoIG5vbnplcm8gb2Zmc2V0cy4KKyAqCisgKiBcYXV0aG9yIENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqLworCisjaW5jbHVkZSAiZ2xzbC9nbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAiZ2xzbC9pci5oIgorI2luY2x1ZGUgImdsc2wvaXJfYnVpbGRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgaXJfYnVpbGRlcjsKKworY2xhc3MgYnJ3X2xvd2VyX3Vubm9ybWFsaXplZF9vZmZzZXRfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBicndfbG93ZXJfdW5ub3JtYWxpemVkX29mZnNldF92aXNpdG9yKCkKKyAgIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisgICB9CisKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX3RleHR1cmUgKmlyKTsKKworICAgYm9vbCBwcm9ncmVzczsKK307CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCiticndfbG93ZXJfdW5ub3JtYWxpemVkX29mZnNldF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl90ZXh0dXJlICppcikKK3sKKyAgIGlmICghaXItPm9mZnNldCkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaWYgKGlyLT5vcCA9PSBpcl90ZzQgfHwgaXItPm9wID09IGlyX3RleCkgeworICAgICAgaWYgKGlyLT5zYW1wbGVyLT50eXBlLT5zYW1wbGVyX2RpbWVuc2lvbmFsaXR5ICE9IEdMU0xfU0FNUExFUl9ESU1fUkVDVCkKKyAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKyAgIGVsc2UgaWYgKGlyLT5vcCAhPSBpcl90eGYpIHsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICBpZiAoaXItPm9wID09IGlyX3R4ZikgeworICAgICAgaXJfdmFyaWFibGUgKnZhciA9IG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShpci0+Y29vcmRpbmF0ZS0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb3JkaW5hdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUodmFyKTsKKyAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKHZhciwgaXItPmNvb3JkaW5hdGUpKTsKKyAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKHZhciwKKyAgICAgICAgICAgICAgIGFkZChzd2l6emxlX2Zvcl9zaXplKHZhciwgaXItPm9mZnNldC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKSwgaXItPm9mZnNldCksCisgICAgICAgICAgICAgICAoMSA8PCBpci0+b2Zmc2V0LT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIC0gMSkpOworCisgICAgICBpci0+Y29vcmRpbmF0ZSA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgfSBlbHNlIHsKKyAgICAgIGlyLT5jb29yZGluYXRlID0gYWRkKGlyLT5jb29yZGluYXRlLCBpMmYoaXItPm9mZnNldCkpOworICAgfQorCisgICBpci0+b2Zmc2V0ID0gTlVMTDsKKworICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitleHRlcm4gIkMiIHsKKworYm9vbAorYnJ3X2RvX2xvd2VyX3Vubm9ybWFsaXplZF9vZmZzZXQoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBicndfbG93ZXJfdW5ub3JtYWxpemVkX29mZnNldF92aXNpdG9yIHY7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7CisKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQorCit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3Byb2dyYW0uYyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfcHJvZ3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmM5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3Byb2dyYW0uYwpAQCAtMCwwICsxLDYwNiBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIEludGVsIENvcnAuICAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBJbnRlbCBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8KKyBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgorCisgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qCisgICogQXV0aG9yczoKKyAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHdAdm13YXJlLmNvbT4KKyAgKi8KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL2VudW1zLmgiCisvLyNpbmNsdWRlICJtYWluL3NoYWRlcm9iai5oIiAvLyBMdW5hckc6IFJlbW92ZQorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcHJpbnQuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dyYW0uaCIKKy8vI2luY2x1ZGUgInByb2dyYW0vcHJvZ3JhbW9wdC5oIiAvLyBMdW5hckc6IFJlbW92ZQorLy8jaW5jbHVkZSAidG5sL3RubC5oIiAvLyBMdW5hckc6IFJlbW92ZQorI2luY2x1ZGUgImdsc2wvcmFsbG9jLmgiCisjaW5jbHVkZSAiZ2xzbC9pci5oIgorCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfd20uaCIKKworc3RhdGljIHVuc2lnbmVkCitnZXRfbmV3X3Byb2dyYW1faWQoc3RydWN0IGludGVsX3NjcmVlbiAqc2NyZWVuKQoreworICAgdW5zaWduZWQgaWQgPSBzY3JlZW4tPnByb2dyYW1faWQrKzsKKworICAgcmV0dXJuIGlkOworfQorCisvL3N0YXRpYyB2b2lkIGJyd0JpbmRQcm9ncmFtKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorLy8JCQkgICAgR0xlbnVtIHRhcmdldCwKKy8vCQkJICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nICkKKy8veworLy8gICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGJyd19jb250ZXh0KGN0eCk7CisKKy8vICAgc3dpdGNoICh0YXJnZXQpIHsKKy8vICAgY2FzZSBHTF9WRVJURVhfUFJPR1JBTV9BUkI6CisvLyAgICAgIGJydy0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfVkVSVEVYX1BST0dSQU07CisvLyAgICAgIGJyZWFrOworLy8gICBjYXNlIE1FU0FfR0VPTUVUUllfUFJPR1JBTToKKy8vICAgICAgYnJ3LT5zdGF0ZS5kaXJ0eS5icncgfD0gQlJXX05FV19HRU9NRVRSWV9QUk9HUkFNOworLy8gICAgICBicmVhazsKKy8vICAgY2FzZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQjoKKy8vICAgICAgYnJ3LT5zdGF0ZS5kaXJ0eS5icncgfD0gQlJXX05FV19GUkFHTUVOVF9QUk9HUkFNOworLy8gICAgICBicmVhazsKKy8vICAgfQorLy99CisKK3N0cnVjdCBnbF9wcm9ncmFtICpicndOZXdQcm9ncmFtKCBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGlkICkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKKworICAgc3dpdGNoICh0YXJnZXQpIHsKKyAgIGNhc2UgR0xfVkVSVEVYX1BST0dSQU1fQVJCOiB7CisgICAgICAgc3RydWN0IGJyd192ZXJ0ZXhfcHJvZ3JhbSAqcHJvZyA9IENBTExPQ19TVFJVQ1QoYnJ3X3ZlcnRleF9wcm9ncmFtKTsKKyAgICAgICBpZiAocHJvZykgeworICAgICAgICAgICBwcm9nLT5pZCA9IGdldF9uZXdfcHJvZ3JhbV9pZChicnctPmludGVsU2NyZWVuKTsKKworICAgICAgICAgICByZXR1cm4gX21lc2FfaW5pdF92ZXJ0ZXhfcHJvZ3JhbSggY3R4LCAmcHJvZy0+cHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgaWQgKTsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgY2FzZSBNRVNBX0dFT01FVFJZX1BST0dSQU06IHsKKyAgICAgIHN0cnVjdCBicndfZ2VvbWV0cnlfcHJvZ3JhbSAqcHJvZyA9IENBTExPQ19TVFJVQ1QoYnJ3X2dlb21ldHJ5X3Byb2dyYW0pOworICAgICAgaWYgKHByb2cpIHsKKyAgICAgICAgIHByb2ctPmlkID0gZ2V0X25ld19wcm9ncmFtX2lkKGJydy0+aW50ZWxTY3JlZW4pOworCisgICAgICAgICByZXR1cm4gX21lc2FfaW5pdF9nZW9tZXRyeV9wcm9ncmFtKGN0eCwgJnByb2ctPnByb2dyYW0sIHRhcmdldCwgaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgfQorCisgICBjYXNlIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCOiB7CisgICAgICBzdHJ1Y3QgYnJ3X2ZyYWdtZW50X3Byb2dyYW0gKnByb2cgPSBDQUxMT0NfU1RSVUNUKGJyd19mcmFnbWVudF9wcm9ncmFtKTsKKyAgICAgIGlmIChwcm9nKSB7CisgICAgIHByb2ctPmlkID0gZ2V0X25ld19wcm9ncmFtX2lkKGJydy0+aW50ZWxTY3JlZW4pOworCisgICAgIHJldHVybiBfbWVzYV9pbml0X2ZyYWdtZW50X3Byb2dyYW0oIGN0eCwgJnByb2ctPnByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBpZCApOworICAgICAgfQorICAgICAgZWxzZQorICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworLy8gICBjYXNlIEdMX0NPTVBVVEVfUFJPR1JBTV9OVjogeworLy8gICAgICBzdHJ1Y3QgYnJ3X2NvbXB1dGVfcHJvZ3JhbSAqcHJvZyA9IENBTExPQ19TVFJVQ1QoYnJ3X2NvbXB1dGVfcHJvZ3JhbSk7CisvLyAgICAgIGlmIChwcm9nKSB7CisvLyAgICAgICAgIHByb2ctPmlkID0gZ2V0X25ld19wcm9ncmFtX2lkKGJydy0+aW50ZWxTY3JlZW4pOworCisvLyAgICAgICAgIHJldHVybiBfbWVzYV9pbml0X2NvbXB1dGVfcHJvZ3JhbShjdHgsICZwcm9nLT5wcm9ncmFtLCB0YXJnZXQsIGlkKTsKKy8vICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgcmV0dXJuIE5VTEw7CisvLyAgICAgIH0KKy8vICAgfQorCisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiVW5zdXBwb3J0ZWQgdGFyZ2V0IGluIGJyd05ld1Byb2dyYW0oKSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9Cit9CisKK3ZvaWQgYnJ3RGVsZXRlUHJvZ3JhbSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nICkKK3sKKyAgIF9tZXNhX2RlbGV0ZV9wcm9ncmFtKCBjdHgsIHByb2cgKTsKK30KKworCisvLyBMdW5hckcgOiBSZW1vdmUgLSBNb3N0IG9mIHRoaXMgaXMgc2hhZGVyIHRpbWUgcmVsYXRlZCwgbWF5IHR1cm4gYmFjayBvbiBsYXRlcgorCisvL3N0YXRpYyBHTGJvb2xlYW4KKy8vYnJ3SXNQcm9ncmFtTmF0aXZlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisvLwkJICAgR0xlbnVtIHRhcmdldCwKKy8vCQkgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKKy8veworLy8gICByZXR1cm4gdHJ1ZTsKKy8vfQorCisvL3N0YXRpYyBHTGJvb2xlYW4KKy8vYnJ3UHJvZ3JhbVN0cmluZ05vdGlmeShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorLy8JCSAgICAgICBHTGVudW0gdGFyZ2V0LAorLy8JCSAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZykKKy8veworLy8gICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGJyd19jb250ZXh0KGN0eCk7CisKKy8vICAgc3dpdGNoICh0YXJnZXQpIHsKKy8vICAgY2FzZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQjogeworLy8gICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnByb2cgPSAoc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKikgcHJvZzsKKy8vICAgICAgc3RydWN0IGJyd19mcmFnbWVudF9wcm9ncmFtICpuZXdGUCA9IGJyd19mcmFnbWVudF9wcm9ncmFtKGZwcm9nKTsKKy8vICAgICAgY29uc3Qgc3RydWN0IGJyd19mcmFnbWVudF9wcm9ncmFtICpjdXJGUCA9CisvLyAgICAgICAgIGJyd19mcmFnbWVudF9wcm9ncmFtX2NvbnN0KGJydy0+ZnJhZ21lbnRfcHJvZ3JhbSk7CisKKy8vICAgICAgaWYgKG5ld0ZQID09IGN1ckZQKQorLy8JIGJydy0+c3RhdGUuZGlydHkuYnJ3IHw9IEJSV19ORVdfRlJBR01FTlRfUFJPR1JBTTsKKy8vICAgICAgbmV3RlAtPmlkID0gZ2V0X25ld19wcm9ncmFtX2lkKGJydy0+aW50ZWxTY3JlZW4pOworLy8gICAgICBicmVhazsKKy8vICAgfQorLy8gICBjYXNlIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQjogeworLy8gICAgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnZwcm9nID0gKHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqKSBwcm9nOworLy8gICAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9wcm9ncmFtICpuZXdWUCA9IGJyd192ZXJ0ZXhfcHJvZ3JhbSh2cHJvZyk7CisvLyAgICAgIGNvbnN0IHN0cnVjdCBicndfdmVydGV4X3Byb2dyYW0gKmN1clZQID0KKy8vICAgICAgICAgYnJ3X3ZlcnRleF9wcm9ncmFtX2NvbnN0KGJydy0+dmVydGV4X3Byb2dyYW0pOworCisvLyAgICAgIGlmIChuZXdWUCA9PSBjdXJWUCkKKy8vCSBicnctPnN0YXRlLmRpcnR5LmJydyB8PSBCUldfTkVXX1ZFUlRFWF9QUk9HUkFNOworLy8gICAgICBpZiAobmV3VlAtPnByb2dyYW0uSXNQb3NpdGlvbkludmFyaWFudCkgeworLy8JIF9tZXNhX2luc2VydF9tdnBfY29kZShjdHgsICZuZXdWUC0+cHJvZ3JhbSk7CisvLyAgICAgIH0KKy8vICAgICAgbmV3VlAtPmlkID0gZ2V0X25ld19wcm9ncmFtX2lkKGJydy0+aW50ZWxTY3JlZW4pOworCisvLyAgICAgIC8qIEFsc28gdGVsbCB0bmwgYWJvdXQgaXQ6CisvLyAgICAgICAqLworLy8gICAgICBfdG5sX3Byb2dyYW1fc3RyaW5nKGN0eCwgdGFyZ2V0LCBwcm9nKTsKKy8vICAgICAgYnJlYWs7CisvLyAgIH0KKy8vICAgZGVmYXVsdDoKKy8vICAgICAgLyoKKy8vICAgICAgICogZHJpdmVyLT5Qcm9ncmFtU3RyaW5nTm90aWZ5IGlzIG9ubHkgY2FsbGVkIGZvciBBUkIgcHJvZ3JhbXMsIGZpeGVkCisvLyAgICAgICAqIGZ1bmN0aW9uIHZlcnRleCBwcm9ncmFtcywgYW5kIGlyX3RvX21lc2EgKHdoaWNoIGlzbid0IHVzZWQgYnkgdGhlCisvLyAgICAgICAqIGk5NjUgYmFjay1lbmQpLiAgVGhlcmVmb3JlLCBldmVuIGFmdGVyIGdlb21ldHJ5IHNoYWRlcnMgYXJlIGFkZGVkLAorLy8gICAgICAgKiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGV2ZXIgYmUgY2FsbGVkIHdpdGggYSB0YXJnZXQgb2YKKy8vICAgICAgICogR0xfVkVSVEVYX1BST0dSQU1fQVJCIG9yIEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCLgorLy8gICAgICAgKi8KKy8vICAgICAgYXNzZXJ0KCEiVW5leHBlY3RlZCB0YXJnZXQgaW4gYnJ3UHJvZ3JhbVN0cmluZ05vdGlmeSIpOworLy8gICAgICBicmVhazsKKy8vICAgfQorCisvLyAgIGJyd19hZGRfdGV4cmVjdF9wYXJhbXMocHJvZyk7CisKKy8vICAgcmV0dXJuIHRydWU7CisvL30KKworLy92b2lkCisvL2Jyd19hZGRfdGV4cmVjdF9wYXJhbXMoc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCisvL3sKKy8vICAgZm9yIChpbnQgdGV4dW5pdCA9IDA7IHRleHVuaXQgPCBCUldfTUFYX1RFWF9VTklUOyB0ZXh1bml0KyspIHsKKy8vICAgICAgaWYgKCEocHJvZy0+VGV4dHVyZXNVc2VkW3RleHVuaXRdICYgKDEgPDwgVEVYVFVSRV9SRUNUX0lOREVYKSkpCisvLyAgICAgICAgIGNvbnRpbnVlOworCisvLyAgICAgIGludCB0b2tlbnNbU1RBVEVfTEVOR1RIXSA9IHsKKy8vICAgICAgICAgU1RBVEVfSU5URVJOQUwsCisvLyAgICAgICAgIFNUQVRFX1RFWFJFQ1RfU0NBTEUsCisvLyAgICAgICAgIHRleHVuaXQsCisvLyAgICAgICAgIDAsCisvLyAgICAgICAgIDAKKy8vICAgICAgfTsKKworLy8gICAgICBfbWVzYV9hZGRfc3RhdGVfcmVmZXJlbmNlKHByb2ctPlBhcmFtZXRlcnMsIChnbF9zdGF0ZV9pbmRleCAqKXRva2Vucyk7CisvLyAgIH0KKy8vfQorCisvKiBQZXItdGhyZWFkIHNjcmF0Y2ggc3BhY2UgaXMgYSBwb3dlci1vZi10d28gbXVsdGlwbGUgb2YgMUtCLiAqLworaW50CiticndfZ2V0X3NjcmF0Y2hfc2l6ZShpbnQgc2l6ZSkKK3sKKyAgIGludCBpOworCisgICBmb3IgKGkgPSAxMDI0OyBpIDwgc2l6ZTsgaSAqPSAyKQorICAgICAgOworCisgICByZXR1cm4gaTsKK30KKworLy92b2lkCisvL2Jyd19nZXRfc2NyYXRjaF9ibyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKy8vCQkgICBkcm1faW50ZWxfYm8gKipzY3JhdGNoX2JvLCBpbnQgc2l6ZSkKKy8veworLy8gICBkcm1faW50ZWxfYm8gKm9sZF9ibyA9ICpzY3JhdGNoX2JvOworCisvLyAgIGlmIChvbGRfYm8gJiYgb2xkX2JvLT5zaXplIDwgc2l6ZSkgeworLy8gICAgICBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2Uob2xkX2JvKTsKKy8vICAgICAgb2xkX2JvID0gTlVMTDsKKy8vICAgfQorCisvLyAgIGlmICghb2xkX2JvKSB7CisvLyAgICAgICpzY3JhdGNoX2JvID0gZHJtX2ludGVsX2JvX2FsbG9jKGJydy0+YnVmbWdyLCAic2NyYXRjaCBibyIsIHNpemUsIDQwOTYpOworLy8gICB9CisvL30KKworLy92b2lkIGJyd0luaXRGcmFnUHJvZ0Z1bmNzKCBzdHJ1Y3QgZGRfZnVuY3Rpb25fdGFibGUgKmZ1bmN0aW9ucyApCisvL3sKKy8vICAgYXNzZXJ0KGZ1bmN0aW9ucy0+UHJvZ3JhbVN0cmluZ05vdGlmeSA9PSBfdG5sX3Byb2dyYW1fc3RyaW5nKTsKKworLy8gICBmdW5jdGlvbnMtPkJpbmRQcm9ncmFtID0gYnJ3QmluZFByb2dyYW07CisvLyAgIGZ1bmN0aW9ucy0+TmV3UHJvZ3JhbSA9IGJyd05ld1Byb2dyYW07CisvLyAgIGZ1bmN0aW9ucy0+RGVsZXRlUHJvZ3JhbSA9IGJyd0RlbGV0ZVByb2dyYW07CisvLyAgIGZ1bmN0aW9ucy0+SXNQcm9ncmFtTmF0aXZlID0gYnJ3SXNQcm9ncmFtTmF0aXZlOworLy8gICBmdW5jdGlvbnMtPlByb2dyYW1TdHJpbmdOb3RpZnkgPSBicndQcm9ncmFtU3RyaW5nTm90aWZ5OworCisvLyAgIGZ1bmN0aW9ucy0+TmV3U2hhZGVyID0gYnJ3X25ld19zaGFkZXI7CisvLyAgIGZ1bmN0aW9ucy0+TmV3U2hhZGVyUHJvZ3JhbSA9IGJyd19uZXdfc2hhZGVyX3Byb2dyYW07CisvLyAgIGZ1bmN0aW9ucy0+TGlua1NoYWRlciA9IGJyd19saW5rX3NoYWRlcjsKKy8vICAgZnVuY3Rpb25zLT5Ob3RpZnlMaW5rU2hhZGVyID0gYnJ3X25vdGlmeV9saW5rX3NoYWRlcjsKKy8vfQorCisvL3ZvaWQKKy8vYnJ3X2luaXRfc2hhZGVyX3RpbWUoc3RydWN0IGJyd19jb250ZXh0ICpicncpCisvL3sKKy8vICAgY29uc3QgaW50IG1heF9lbnRyaWVzID0gODE5MjsKKy8vICAgYnJ3LT5zaGFkZXJfdGltZS5ibyA9IGRybV9pbnRlbF9ib19hbGxvYyhicnctPmJ1Zm1nciwgInNoYWRlciB0aW1lIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZW50cmllcyAqIFNIQURFUl9USU1FX1NUUklERSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2KTsKKy8vICAgYnJ3LT5zaGFkZXJfdGltZS5zaGFkZXJfcHJvZ3JhbXMgPSByemFsbG9jX2FycmF5KGJydywgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICosCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZW50cmllcyk7CisvLyAgIGJydy0+c2hhZGVyX3RpbWUucHJvZ3JhbXMgPSByemFsbG9jX2FycmF5KGJydywgc3RydWN0IGdsX3Byb2dyYW0gKiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2VudHJpZXMpOworLy8gICBicnctPnNoYWRlcl90aW1lLnR5cGVzID0gcnphbGxvY19hcnJheShicncsIGVudW0gc2hhZGVyX3RpbWVfc2hhZGVyX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9lbnRyaWVzKTsKKy8vICAgYnJ3LT5zaGFkZXJfdGltZS5jdW11bGF0aXZlID0gcnphbGxvY19hcnJheShicncsIHVpbnQ2NF90LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9lbnRyaWVzKTsKKy8vICAgYnJ3LT5zaGFkZXJfdGltZS5tYXhfZW50cmllcyA9IG1heF9lbnRyaWVzOworLy99CisKKy8vc3RhdGljIGludAorLy9jb21wYXJlX3RpbWUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKKy8veworLy8gICB1aW50NjRfdCAqIGNvbnN0ICphX3ZhbCA9IGE7CisvLyAgIHVpbnQ2NF90ICogY29uc3QgKmJfdmFsID0gYjsKKworLy8gICAvKiBXZSBkb24ndCBqdXN0IHN1YnRyYWN0IGJlY2F1c2Ugd2UncmUgdHVybmluZyB0aGUgdmFsdWUgdG8gYW4gaW50LiAqLworLy8gICBpZiAoKiphX3ZhbCA8ICoqYl92YWwpCisvLyAgICAgIHJldHVybiAtMTsKKy8vICAgZWxzZSBpZiAoKiphX3ZhbCA9PSAqKmJfdmFsKQorLy8gICAgICByZXR1cm4gMDsKKy8vICAgZWxzZQorLy8gICAgICByZXR1cm4gMTsKKy8vfQorCisvL3N0YXRpYyB2b2lkCisvL2dldF93cml0dGVuX2FuZF9yZXNldChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgaW50IGksCisvLyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqd3JpdHRlbiwgdWludDY0X3QgKnJlc2V0KQorLy97CisvLyAgIGVudW0gc2hhZGVyX3RpbWVfc2hhZGVyX3R5cGUgdHlwZSA9IGJydy0+c2hhZGVyX3RpbWUudHlwZXNbaV07CisvLyAgIGFzc2VydCh0eXBlID09IFNUX1ZTIHx8IHR5cGUgPT0gU1RfR1MgfHwgdHlwZSA9PSBTVF9GUzggfHwgdHlwZSA9PSBTVF9GUzE2KTsKKworLy8gICAvKiBGaW5kIHdoZXJlIHdlIHJlY29yZGVkIHdyaXR0ZW4gYW5kIHJlc2V0LiAqLworLy8gICBpbnQgd2ksIHJpOworCisvLyAgIGZvciAod2kgPSBpOyBicnctPnNoYWRlcl90aW1lLnR5cGVzW3dpXSAhPSB0eXBlICsgMTsgd2krKykKKy8vICAgICAgOworCisvLyAgIGZvciAocmkgPSBpOyBicnctPnNoYWRlcl90aW1lLnR5cGVzW3JpXSAhPSB0eXBlICsgMjsgcmkrKykKKy8vICAgICAgOworCisvLyAgICp3cml0dGVuID0gYnJ3LT5zaGFkZXJfdGltZS5jdW11bGF0aXZlW3dpXTsKKy8vICAgKnJlc2V0ID0gYnJ3LT5zaGFkZXJfdGltZS5jdW11bGF0aXZlW3JpXTsKKy8vfQorCisvL3N0YXRpYyB2b2lkCisvL3ByaW50X3NoYWRlcl90aW1lX2xpbmUoY29uc3QgY2hhciAqc3RhZ2UsIGNvbnN0IGNoYXIgKm5hbWUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYWRlcl9udW0sIHVpbnQ2NF90IHRpbWUsIHVpbnQ2NF90IHRvdGFsKQorLy97CisvLyAgIGZwcmludGYoc3RkZXJyLCAiJS02cyUtMThzIiwgc3RhZ2UsIG5hbWUpOworCisvLyAgIGlmIChzaGFkZXJfbnVtICE9IC0xKQorLy8gICAgICBmcHJpbnRmKHN0ZGVyciwgIiU0ZDogIiwgc2hhZGVyX251bSk7CisvLyAgIGVsc2UKKy8vICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgOiAiKTsKKworLy8gICBmcHJpbnRmKHN0ZGVyciwgIiUxNmxsZCAoJTcuMmYgR2N5Y2xlcykgICAgICAlNC4xZiUlXG4iLAorLy8gICAgICAgICAgIChsb25nIGxvbmcpdGltZSwKKy8vICAgICAgICAgICAoZG91YmxlKXRpbWUgLyAxMDAwMDAwMDAwLjAsCisvLyAgICAgICAgICAgKGRvdWJsZSl0aW1lIC8gdG90YWwgKiAxMDAuMCk7CisvL30KKworLy9zdGF0aWMgdm9pZAorLy9icndfcmVwb3J0X3NoYWRlcl90aW1lKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQorLy97CisvLyAgIGlmICghYnJ3LT5zaGFkZXJfdGltZS5ibyB8fCAhYnJ3LT5zaGFkZXJfdGltZS5udW1fZW50cmllcykKKy8vICAgICAgcmV0dXJuOworCisvLyAgIHVpbnQ2NF90IHNjYWxlZFticnctPnNoYWRlcl90aW1lLm51bV9lbnRyaWVzXTsKKy8vICAgdWludDY0X3QgKnNvcnRlZFticnctPnNoYWRlcl90aW1lLm51bV9lbnRyaWVzXTsKKy8vICAgdWludDY0X3QgdG90YWxfYnlfdHlwZVtTVF9GUzE2ICsgMV07CisvLyAgIG1lbXNldCh0b3RhbF9ieV90eXBlLCAwLCBzaXplb2YodG90YWxfYnlfdHlwZSkpOworLy8gICBkb3VibGUgdG90YWwgPSAwOworLy8gICBmb3IgKGludCBpID0gMDsgaSA8IGJydy0+c2hhZGVyX3RpbWUubnVtX2VudHJpZXM7IGkrKykgeworLy8gICAgICB1aW50NjRfdCB3cml0dGVuID0gMCwgcmVzZXQgPSAwOworLy8gICAgICBlbnVtIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHR5cGUgPSBicnctPnNoYWRlcl90aW1lLnR5cGVzW2ldOworCisvLyAgICAgIHNvcnRlZFtpXSA9ICZzY2FsZWRbaV07CisKKy8vICAgICAgc3dpdGNoICh0eXBlKSB7CisvLyAgICAgIGNhc2UgU1RfVlNfV1JJVFRFTjoKKy8vICAgICAgY2FzZSBTVF9WU19SRVNFVDoKKy8vICAgICAgY2FzZSBTVF9HU19XUklUVEVOOgorLy8gICAgICBjYXNlIFNUX0dTX1JFU0VUOgorLy8gICAgICBjYXNlIFNUX0ZTOF9XUklUVEVOOgorLy8gICAgICBjYXNlIFNUX0ZTOF9SRVNFVDoKKy8vICAgICAgY2FzZSBTVF9GUzE2X1dSSVRURU46CisvLyAgICAgIGNhc2UgU1RfRlMxNl9SRVNFVDoKKy8vICAgICAgICAgLyogV2UnbGwgaGFuZGxlIHRoZXNlIHdoZW4gYWxvbmcgd2l0aCB0aGUgdGltZS4gKi8KKy8vICAgICAgICAgc2NhbGVkW2ldID0gMDsKKy8vICAgICAgICAgY29udGludWU7CisKKy8vICAgICAgY2FzZSBTVF9WUzoKKy8vICAgICAgY2FzZSBTVF9HUzoKKy8vICAgICAgY2FzZSBTVF9GUzg6CisvLyAgICAgIGNhc2UgU1RfRlMxNjoKKy8vICAgICAgICAgZ2V0X3dyaXR0ZW5fYW5kX3Jlc2V0KGJydywgaSwgJndyaXR0ZW4sICZyZXNldCk7CisvLyAgICAgICAgIGJyZWFrOworCisvLyAgICAgIGRlZmF1bHQ6CisvLyAgICAgICAgIC8qIEkgc29tZXRpbWVzIHdhbnQgdG8gcHJpbnQgdGhpbmdzIHRoYXQgYXJlbid0IHRoZSAzIHNoYWRlciB0aW1lcy4KKy8vICAgICAgICAgICogSnVzdCBwcmludCB0aGUgc3VtIGluIHRoYXQgY2FzZS4KKy8vICAgICAgICAgICovCisvLyAgICAgICAgIHdyaXR0ZW4gPSAxOworLy8gICAgICAgICByZXNldCA9IDA7CisvLyAgICAgICAgIGJyZWFrOworLy8gICAgICB9CisKKy8vICAgICAgdWludDY0X3QgdGltZSA9IGJydy0+c2hhZGVyX3RpbWUuY3VtdWxhdGl2ZVtpXTsKKy8vICAgICAgaWYgKHdyaXR0ZW4pIHsKKy8vICAgICAgICAgc2NhbGVkW2ldID0gdGltZSAvIHdyaXR0ZW4gKiAod3JpdHRlbiArIHJlc2V0KTsKKy8vICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgc2NhbGVkW2ldID0gdGltZTsKKy8vICAgICAgfQorCisvLyAgICAgIHN3aXRjaCAodHlwZSkgeworLy8gICAgICBjYXNlIFNUX1ZTOgorLy8gICAgICBjYXNlIFNUX0dTOgorLy8gICAgICBjYXNlIFNUX0ZTODoKKy8vICAgICAgY2FzZSBTVF9GUzE2OgorLy8gICAgICAgICB0b3RhbF9ieV90eXBlW3R5cGVdICs9IHNjYWxlZFtpXTsKKy8vICAgICAgICAgYnJlYWs7CisvLyAgICAgIGRlZmF1bHQ6CisvLyAgICAgICAgIGJyZWFrOworLy8gICAgICB9CisKKy8vICAgICAgdG90YWwgKz0gc2NhbGVkW2ldOworLy8gICB9CisKKy8vICAgaWYgKHRvdGFsID09IDApIHsKKy8vICAgICAgZnByaW50ZihzdGRlcnIsICJObyBzaGFkZXIgdGltZSBjb2xsZWN0ZWQgeWV0XG4iKTsKKy8vICAgICAgcmV0dXJuOworLy8gICB9CisKKy8vICAgcXNvcnQoc29ydGVkLCBicnctPnNoYWRlcl90aW1lLm51bV9lbnRyaWVzLCBzaXplb2Yoc29ydGVkWzBdKSwgY29tcGFyZV90aW1lKTsKKworLy8gICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisvLyAgIGZwcmludGYoc3RkZXJyLCAidHlwZSAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgIGN5Y2xlcyBzcGVudCAgICAgICAgICAgICAgICAgICAlJSBvZiB0b3RhbFxuIik7CisvLyAgIGZvciAoaW50IHMgPSAwOyBzIDwgYnJ3LT5zaGFkZXJfdGltZS5udW1fZW50cmllczsgcysrKSB7CisvLyAgICAgIGNvbnN0IGNoYXIgKnNoYWRlcl9uYW1lOworLy8gICAgICBjb25zdCBjaGFyICpzdGFnZTsKKy8vICAgICAgLyogV29yayBiYWNrIGZyb20gdGhlIHNvcnRlZCBwb2ludGVycyB0aW1lcyB0byBhIHRpbWUgdG8gcHJpbnQuICovCisvLyAgICAgIGludCBpID0gc29ydGVkW3NdIC0gc2NhbGVkOworLy8gICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cgPSBicnctPnNoYWRlcl90aW1lLnNoYWRlcl9wcm9ncmFtc1tpXTsKKworLy8gICAgICBpZiAoc2NhbGVkW2ldID09IDApCisvLyAgICAgICAgIGNvbnRpbnVlOworCisvLyAgICAgIGludCBzaGFkZXJfbnVtID0gLTE7CisvLyAgICAgIGlmIChwcm9nKSB7CisvLyAgICAgICAgIHNoYWRlcl9udW0gPSBwcm9nLT5OYW1lOworCisvLyAgICAgICAgIC8qIFRoZSBmaXhlZCBmdW5jdGlvbiBmcmFnbWVudCBzaGFkZXIgZ2VuZXJhdGVzIEdMU0wgSVIgd2l0aCBhIE5hbWUKKy8vICAgICAgICAgICogb2YgMCwgYW5kIG5vdGhpbmcgZWxzZSBkb2VzLgorLy8gICAgICAgICAgKi8KKy8vICAgICAgICAgaWYgKHByb2ctPkxhYmVsKSB7CisvLyAgICAgICAgICAgIHNoYWRlcl9uYW1lID0gcHJvZy0+TGFiZWw7CisvLyAgICAgICAgIH0gZWxzZSBpZiAoc2hhZGVyX251bSA9PSAwICYmCisvLyAgICAgICAgICAgICAoYnJ3LT5zaGFkZXJfdGltZS50eXBlc1tpXSA9PSBTVF9GUzggfHwKKy8vICAgICAgICAgICAgICBicnctPnNoYWRlcl90aW1lLnR5cGVzW2ldID09IFNUX0ZTMTYpKSB7CisvLyAgICAgICAgICAgIHNoYWRlcl9uYW1lID0gImZmIjsKKy8vICAgICAgICAgICAgc2hhZGVyX251bSA9IC0xOworLy8gICAgICAgICB9IGVsc2UgeworLy8gICAgICAgICAgICBzaGFkZXJfbmFtZSA9ICJnbHNsIjsKKy8vICAgICAgICAgfQorLy8gICAgICB9IGVsc2UgaWYgKGJydy0+c2hhZGVyX3RpbWUucHJvZ3JhbXNbaV0pIHsKKy8vICAgICAgICAgc2hhZGVyX251bSA9IGJydy0+c2hhZGVyX3RpbWUucHJvZ3JhbXNbaV0tPklkOworLy8gICAgICAgICBpZiAoc2hhZGVyX251bSA9PSAwKSB7CisvLyAgICAgICAgICAgIHNoYWRlcl9uYW1lID0gImZmIjsKKy8vICAgICAgICAgICAgc2hhZGVyX251bSA9IC0xOworLy8gICAgICAgICB9IGVsc2UgeworLy8gICAgICAgICAgICBzaGFkZXJfbmFtZSA9ICJwcm9nIjsKKy8vICAgICAgICAgfQorLy8gICAgICB9IGVsc2UgeworLy8gICAgICAgICBzaGFkZXJfbmFtZSA9ICJvdGhlciI7CisvLyAgICAgIH0KKworLy8gICAgICBzd2l0Y2ggKGJydy0+c2hhZGVyX3RpbWUudHlwZXNbaV0pIHsKKy8vICAgICAgY2FzZSBTVF9WUzoKKy8vICAgICAgICAgc3RhZ2UgPSAidnMiOworLy8gICAgICAgICBicmVhazsKKy8vICAgICAgY2FzZSBTVF9HUzoKKy8vICAgICAgICAgc3RhZ2UgPSAiZ3MiOworLy8gICAgICAgICBicmVhazsKKy8vICAgICAgY2FzZSBTVF9GUzg6CisvLyAgICAgICAgIHN0YWdlID0gImZzOCI7CisvLyAgICAgICAgIGJyZWFrOworLy8gICAgICBjYXNlIFNUX0ZTMTY6CisvLyAgICAgICAgIHN0YWdlID0gImZzMTYiOworLy8gICAgICAgICBicmVhazsKKy8vICAgICAgZGVmYXVsdDoKKy8vICAgICAgICAgc3RhZ2UgPSAib3RoZXIiOworLy8gICAgICAgICBicmVhazsKKy8vICAgICAgfQorCisvLyAgICAgIHByaW50X3NoYWRlcl90aW1lX2xpbmUoc3RhZ2UsIHNoYWRlcl9uYW1lLCBzaGFkZXJfbnVtLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZFtpXSwgdG90YWwpOworLy8gICB9CisKKy8vICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworLy8gICBwcmludF9zaGFkZXJfdGltZV9saW5lKCJ0b3RhbCIsICJ2cyIsIC0xLCB0b3RhbF9ieV90eXBlW1NUX1ZTXSwgdG90YWwpOworLy8gICBwcmludF9zaGFkZXJfdGltZV9saW5lKCJ0b3RhbCIsICJncyIsIC0xLCB0b3RhbF9ieV90eXBlW1NUX0dTXSwgdG90YWwpOworLy8gICBwcmludF9zaGFkZXJfdGltZV9saW5lKCJ0b3RhbCIsICJmczgiLCAtMSwgdG90YWxfYnlfdHlwZVtTVF9GUzhdLCB0b3RhbCk7CisvLyAgIHByaW50X3NoYWRlcl90aW1lX2xpbmUoInRvdGFsIiwgImZzMTYiLCAtMSwgdG90YWxfYnlfdHlwZVtTVF9GUzE2XSwgdG90YWwpOworLy99CisKKy8vc3RhdGljIHZvaWQKKy8vYnJ3X2NvbGxlY3Rfc2hhZGVyX3RpbWUoc3RydWN0IGJyd19jb250ZXh0ICpicncpCisvL3sKKy8vICAgaWYgKCFicnctPnNoYWRlcl90aW1lLmJvKQorLy8gICAgICByZXR1cm47CisKKy8vICAgLyogVGhpcyBwcm9iYWJseSBzdGFsbHMgb24gdGhlIGxhc3QgcmVuZGVyaW5nLiAgV2UgY291bGQgZml4IHRoYXQgYnkKKy8vICAgICogZGVsYXlpbmcgcmVhZGluZyB0aGUgcmVwb3J0cywgYnV0IGl0IGRvZXNuJ3QgbG9vayBsaWtlIGl0J3MgYSBiaWcKKy8vICAgICogb3ZlcmhlYWQgY29tcGFyZWQgdG8gdGhlIGNvc3Qgb2YgdHJhY2tpbmcgdGhlIHRpbWUgaW4gdGhlIGZpcnN0IHBsYWNlLgorLy8gICAgKi8KKy8vICAgZHJtX2ludGVsX2JvX21hcChicnctPnNoYWRlcl90aW1lLmJvLCB0cnVlKTsKKworLy8gICB1aW50MzJfdCAqdGltZXMgPSBicnctPnNoYWRlcl90aW1lLmJvLT52aXJ0dWFsOworCisvLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnJ3LT5zaGFkZXJfdGltZS5udW1fZW50cmllczsgaSsrKSB7CisvLyAgICAgIGJydy0+c2hhZGVyX3RpbWUuY3VtdWxhdGl2ZVtpXSArPSB0aW1lc1tpICogU0hBREVSX1RJTUVfU1RSSURFIC8gNF07CisvLyAgIH0KKworLy8gICAvKiBaZXJvIHRoZSBCTyBvdXQgdG8gY2xlYXIgaXQgb3V0IGZvciBvdXIgbmV4dCBjb2xsZWN0aW9uLgorLy8gICAgKi8KKy8vICAgbWVtc2V0KHRpbWVzLCAwLCBicnctPnNoYWRlcl90aW1lLmJvLT5zaXplKTsKKy8vICAgZHJtX2ludGVsX2JvX3VubWFwKGJydy0+c2hhZGVyX3RpbWUuYm8pOworLy99CisKKy8vdm9pZAorLy9icndfY29sbGVjdF9hbmRfcmVwb3J0X3NoYWRlcl90aW1lKHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQorLy97CisvLyAgIGJyd19jb2xsZWN0X3NoYWRlcl90aW1lKGJydyk7CisKKy8vICAgaWYgKGJydy0+c2hhZGVyX3RpbWUucmVwb3J0X3RpbWUgPT0gMCB8fAorLy8gICAgICAgZ2V0X3RpbWUoKSAtIGJydy0+c2hhZGVyX3RpbWUucmVwb3J0X3RpbWUgPj0gMS4wKSB7CisvLyAgICAgIGJyd19yZXBvcnRfc2hhZGVyX3RpbWUoYnJ3KTsKKy8vICAgICAgYnJ3LT5zaGFkZXJfdGltZS5yZXBvcnRfdGltZSA9IGdldF90aW1lKCk7CisvLyAgIH0KKy8vfQorCisvLy8qKgorLy8gKiBDaG9vc2VzIGFuIGluZGV4IGluIHRoZSBzaGFkZXJfdGltZSBidWZmZXIgYW5kIHNldHMgdXAgdHJhY2tpbmcgaW5mb3JtYXRpb24KKy8vICogZm9yIG91ciBwcmludG91dHMuCisvLyAqCisvLyAqIE5vdGUgdGhhdCB0aGlzIGhvbGRzIG9uIHRvIHJlZmVyZW5jZXMgdG8gdGhlIHVuZGVybHlpbmcgcHJvZ3JhbXMsIHdoaWNoIG1heQorLy8gKiBjaGFuZ2UgdGhlaXIgbGlmZXRpbWVzIGNvbXBhcmVkIHRvIG5vcm1hbCBvcGVyYXRpb24uCisvLyAqLworLy9pbnQKKy8vYnJ3X2dldF9zaGFkZXJfdGltZV9pbmRleChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2hhZGVyX3RpbWVfc2hhZGVyX3R5cGUgdHlwZSkKKy8veworLy8gICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gJmJydy0+Y3R4OworCisvLyAgIGludCBzaGFkZXJfdGltZV9pbmRleCA9IGJydy0+c2hhZGVyX3RpbWUubnVtX2VudHJpZXMrKzsKKy8vICAgYXNzZXJ0KHNoYWRlcl90aW1lX2luZGV4IDwgYnJ3LT5zaGFkZXJfdGltZS5tYXhfZW50cmllcyk7CisvLyAgIGJydy0+c2hhZGVyX3RpbWUudHlwZXNbc2hhZGVyX3RpbWVfaW5kZXhdID0gdHlwZTsKKworLy8gICBfbWVzYV9yZWZlcmVuY2Vfc2hhZGVyX3Byb2dyYW0oY3R4LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJydy0+c2hhZGVyX3RpbWUuc2hhZGVyX3Byb2dyYW1zW3NoYWRlcl90aW1lX2luZGV4XSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl9wcm9nKTsKKworLy8gICBfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShjdHgsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICZicnctPnNoYWRlcl90aW1lLnByb2dyYW1zW3NoYWRlcl90aW1lX2luZGV4XSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZyk7CisKKy8vICAgcmV0dXJuIHNoYWRlcl90aW1lX2luZGV4OworLy99CisKKy8vdm9pZAorLy9icndfZGVzdHJveV9zaGFkZXJfdGltZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydykKKy8veworLy8gICBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoYnJ3LT5zaGFkZXJfdGltZS5ibyk7CisvLyAgIGJydy0+c2hhZGVyX3RpbWUuYm8gPSBOVUxMOworLy99CisKK3ZvaWQKK2Jyd19tYXJrX3N1cmZhY2VfdXNlZChzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSAqcHJvZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN1cmZfaW5kZXgpCit7CisgICBhc3NlcnQoc3VyZl9pbmRleCA8IEJSV19NQVhfU1VSRkFDRVMpOworCisgICBwcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUuc2l6ZV9ieXRlcyA9CisgICAgICBNQVgyKHByb2dfZGF0YS0+YmluZGluZ190YWJsZS5zaXplX2J5dGVzLCAoc3VyZl9pbmRleCArIDEpICogNCk7Cit9CisKK2Jvb2wKK2Jyd19zdGFnZV9wcm9nX2RhdGFfY29tcGFyZShjb25zdCBzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSAqYikKK3sKKyAgIC8qIENvbXBhcmUgYWxsIHRoZSBzdHJ1Y3QgdXAgdG8gdGhlIHBvaW50ZXJzLiAqLworICAgaWYgKG1lbWNtcChhLCBiLCBvZmZzZXRvZihzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSwgcGFyYW0pKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKG1lbWNtcChhLT5wYXJhbSwgYi0+cGFyYW0sIGEtPm5yX3BhcmFtcyAqIHNpemVvZih2b2lkICopKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKG1lbWNtcChhLT5wdWxsX3BhcmFtLCBiLT5wdWxsX3BhcmFtLCBhLT5ucl9wdWxsX3BhcmFtcyAqIHNpemVvZih2b2lkICopKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK2Jyd19zdGFnZV9wcm9nX2RhdGFfZnJlZShjb25zdCB2b2lkICpwKQoreworICAgc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEgKnByb2dfZGF0YSA9IChzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSAqKXA7CisKKyAgIHJhbGxvY19mcmVlKHByb2dfZGF0YS0+cGFyYW0pOworICAgcmFsbG9jX2ZyZWUocHJvZ19kYXRhLT5wdWxsX3BhcmFtKTsKK30KKwordm9pZAorYnJ3X2R1bXBfaXIoc3RydWN0IGJyd19jb250ZXh0ICpicncsIGNvbnN0IGNoYXIgKnN0YWdlLAorICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisvLyAgIGlmIChzaGFkZXJfcHJvZykgeworICAgICBhc3NlcnQoc2hhZGVyX3Byb2cpOworICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICJHTFNMIElSIGZvciBuYXRpdmUgJXMgc2hhZGVyICVkOlxuIiwgc3RhZ2UsIHNoYWRlcl9wcm9nLT5OYW1lKTsKKyAgICAgIF9tZXNhX3ByaW50X2lyKHN0ZGVyciwgc2hhZGVyLT5pciwgTlVMTCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuXG4iKTsKKy8vICAgfSBlbHNlIHsKKy8vICAgICAgZnByaW50ZihzdGRlcnIsICJBUkJfJXNfcHJvZ3JhbSAlZCBpciBmb3IgbmF0aXZlICVzIHNoYWRlclxuIiwKKy8vICAgICAgICAgICAgICBzdGFnZSwgcHJvZy0+SWQsIHN0YWdlKTsKKy8vICAgICAgX21lc2FfcHJpbnRfcHJvZ3JhbShwcm9nKTsKKy8vICAgfQorfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19wcm9ncmFtLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RkYzMyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19wcm9ncmFtLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEJSV19QUk9HUkFNX0gKKyNkZWZpbmUgQlJXX1BST0dSQU1fSAorCitlbnVtIGdlbjZfZ2F0aGVyX3NhbXBsZXJfd2EgeworICAgV0FfU0lHTiA9IDEsICAgICAgLyogd2hldGhlciB3ZSBuZWVkIHRvIHNpZ24gZXh0ZW5kICovCisgICBXQV84QklUID0gMiwgICAgICAvKiBpZiB3ZSBoYXZlIGFuIDhiaXQgZm9ybWF0IG5lZWRpbmcgd2EgKi8KKyAgIFdBXzE2QklUID0gNCwgICAgIC8qIGlmIHdlIGhhdmUgYSAxNmJpdCBmb3JtYXQgbmVlZGluZyB3YSAqLworfTsKKworLyoqCisgKiBTYW1wbGVyIGluZm9ybWF0aW9uIG5lZWRlZCBieSBWUywgV00sIGFuZCBHUyBwcm9ncmFtIGNhY2hlIGtleXMuCisgKi8KK3N0cnVjdCBicndfc2FtcGxlcl9wcm9nX2tleV9kYXRhIHsKKyAgIC8qKgorICAgICogRVhUX3RleHR1cmVfc3dpenpsZSBhbmQgREVQVEhfVEVYVFVSRV9NT0RFIHN3aXp6bGVzLgorICAgICovCisgICB1aW50MTZfdCBzd2l6emxlc1tNQVhfU0FNUExFUlNdOworCisgICB1aW50MzJfdCBnbF9jbGFtcF9tYXNrWzNdOworCisgICAvKioKKyAgICAqIEZvciBSRzMyRiwgZ2F0aGVyNCdzIGNoYW5uZWwgc2VsZWN0IGlzIGJyb2tlbi4KKyAgICAqLworICAgdWludDMyX3QgZ2F0aGVyX2NoYW5uZWxfcXVpcmtfbWFzazsKKworICAgLyoqCisgICAgKiBXaGV0aGVyIHRoaXMgc2FtcGxlciB1c2VzIHRoZSBjb21wcmVzc2VkIG11bHRpc2FtcGxlIHN1cmZhY2UgbGF5b3V0LgorICAgICovCisgICB1aW50MzJfdCBjb21wcmVzc2VkX211bHRpc2FtcGxlX2xheW91dF9tYXNrOworCisgICAvKioKKyAgICAqIEZvciBTYW5keWJyaWRnZSwgd2hpY2ggc2hhZGVyIHcvYSB3ZSBuZWVkIGZvciBnYXRoZXIgcXVpcmtzLgorICAgICovCisgICB1aW50OF90IGdlbjZfZ2F0aGVyX3dhW01BWF9TQU1QTEVSU107Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3ZvaWQgYnJ3X3BvcHVsYXRlX3NhbXBsZXJfcHJvZ19rZXlfZGF0YShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkJCSAgICAgICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcl9jb3VudCwKKwkJCQkgICAgICAgIHN0cnVjdCBicndfc2FtcGxlcl9wcm9nX2tleV9kYXRhICprZXkpOworYm9vbCBicndfZGVidWdfcmVjb21waWxlX3NhbXBsZXJfa2V5KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfc2FtcGxlcl9wcm9nX2tleV9kYXRhICpvbGRfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfc2FtcGxlcl9wcm9nX2tleV9kYXRhICprZXkpOwordm9pZCBicndfYWRkX3RleHJlY3RfcGFyYW1zKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKwordm9pZAorYnJ3X21hcmtfc3VyZmFjZV91c2VkKHN0cnVjdCBicndfc3RhZ2VfcHJvZ19kYXRhICpwcm9nX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3VyZl9pbmRleCk7CisKK2Jvb2wKK2Jyd19zdGFnZV9wcm9nX2RhdGFfY29tcGFyZShjb25zdCBzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSAqYik7CisKK3ZvaWQKK2Jyd19zdGFnZV9wcm9nX2RhdGFfZnJlZShjb25zdCB2b2lkICpwcm9nX2RhdGEpOworCit2b2lkCiticndfZHVtcF9pcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywgY29uc3QgY2hhciAqc3RhZ2UsCisgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyLCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyk7CisKKy8vIEx1bmFyRyA6IEFERAorc3RydWN0IGdsX3Byb2dyYW0gKmJyd05ld1Byb2dyYW0oIHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGlkICk7CisKK3ZvaWQgYnJ3RGVsZXRlUHJvZ3JhbSggc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfcmVnLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzBhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3JlZy5oCkBAIC0wLDAgKzEsODkxIEBACisvKgorIENvcHlyaWdodCAoQykgSW50ZWwgQ29ycC4gIDIwMDYuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIEludGVsIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0bworIGRldmVsb3AgdGhpcyAzRCBkcml2ZXIuCisKKyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoKKyAgKiBBdXRob3JzOgorICAqICAgS2VpdGggV2hpdHdlbGwgPGtlaXRod0B2bXdhcmUuY29tPgorICAqLworCisvKiogQGZpbGUgYnJ3X3JlZy5oCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgc3RydWN0IGJyd19yZWcsIHdoaWNoIGlzIG91ciByZXByZXNlbnRhdGlvbiBmb3IgRVUKKyAqIHJlZ2lzdGVycy4gIFRoZXkncmUgbm90IGEgaGFyZHdhcmUgc3BlY2lmaWMgZm9ybWF0LCBqdXN0IGFuIGFic3RyYWN0aW9uCisgKiB0aGF0IGludGVuZHMgdG8gY2FwdHVyZSB0aGUgZnVsbCBmbGV4aWJpbGl0eSBvZiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLgorICoKKyAqIFRoZSBicndfZXVfZW1pdC5jIGxheWVyJ3MgYnJ3X3NldF9kZXN0L2Jyd19zZXRfc3JjWzAxXSBmdW5jdGlvbnMgZW5jb2RlCisgKiB0aGUgYWJzdHJhY3QgYnJ3X3JlZyB0eXBlIGludG8gdGhlIGFjdHVhbCBoYXJkd2FyZSBpbnN0cnVjdGlvbiBlbmNvZGluZy4KKyAqLworCisjaWZuZGVmIEJSV19SRUdfSAorI2RlZmluZSBCUldfUkVHX0gKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlICJtYWluL2ltcG9ydHMuaCIKKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiYnJ3X2RlZmluZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogTnVtYmVyIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKFZTLCBXTSwgZXRjKSAqLworI2RlZmluZSBCUldfTUFYX0dSRiAxMjgKKworLyoqCisgKiBGaXJzdCBHUkYgdXNlZCBmb3IgdGhlIE1SRiBoYWNrLgorICoKKyAqIE9uIGdlbjcsIE1SRnMgYXJlIG5vIGxvbmdlciB1c2VkLCBhbmQgY29udGlndW91cyBHUkZzIGFyZSB1c2VkIGluc3RlYWQuICBXZQorICogaGF2ZW4ndCBjb252ZXJ0ZWQgb3VyIGNvbXBpbGVyIHRvIGJlIGF3YXJlIG9mIHRoaXMsIHNvIGl0IGFza3MgZm9yIE1SRnMgYW5kCisgKiBicndfZXVfZW1pdC5jIHF1aWV0bHkgY29udmVydHMgdGhlbSB0byBiZSBhY2Nlc3NlcyBvZiB0aGUgdG9wIEdSRnMuICBUaGUKKyAqIHJlZ2lzdGVyIGFsbG9jYXRvcnMgaGF2ZSB0byBiZSBjYXJlZnVsIG9mIHRoaXMgdG8gYXZvaWQgY29ycnVwdGluZyB0aGUgIk1SRiJzCisgKiB3aXRoIGFjdHVhbCBHUkYgYWxsb2NhdGlvbnMuCisgKi8KKyNkZWZpbmUgR0VON19NUkZfSEFDS19TVEFSVCAxMTIKKworLyoqIE51bWJlciBvZiBtZXNzYWdlIHJlZ2lzdGVyIGZpbGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJSV19NQVhfTVJGIDE2CisKKyNkZWZpbmUgQlJXX1NXSVpaTEU0KGEsYixjLGQpICgoKGEpPDwwKSB8ICgoYik8PDIpIHwgKChjKTw8NCkgfCAoKGQpPDw2KSkKKyNkZWZpbmUgQlJXX0dFVF9TV1ooc3d6LCBpZHgpICgoKHN3eikgPj4gKChpZHgpKjIpKSAmIDB4MykKKworI2RlZmluZSBCUldfU1dJWlpMRV9OT09QICAgICAgQlJXX1NXSVpaTEU0KDAsMSwyLDMpCisjZGVmaW5lIEJSV19TV0laWkxFX1hZWlcgICAgICBCUldfU1dJWlpMRTQoMCwxLDIsMykKKyNkZWZpbmUgQlJXX1NXSVpaTEVfWFhYWCAgICAgIEJSV19TV0laWkxFNCgwLDAsMCwwKQorI2RlZmluZSBCUldfU1dJWlpMRV9ZWVlZICAgICAgQlJXX1NXSVpaTEU0KDEsMSwxLDEpCisjZGVmaW5lIEJSV19TV0laWkxFX1paWlogICAgICBCUldfU1dJWlpMRTQoMiwyLDIsMikKKyNkZWZpbmUgQlJXX1NXSVpaTEVfV1dXVyAgICAgIEJSV19TV0laWkxFNCgzLDMsMywzKQorI2RlZmluZSBCUldfU1dJWlpMRV9YWVhZICAgICAgQlJXX1NXSVpaTEU0KDAsMSwwLDEpCisjZGVmaW5lIEJSV19TV0laWkxFX1laWFcgICAgICBCUldfU1dJWlpMRTQoMSwyLDAsMykKKyNkZWZpbmUgQlJXX1NXSVpaTEVfWlhZVyAgICAgIEJSV19TV0laWkxFNCgyLDAsMSwzKQorI2RlZmluZSBCUldfU1dJWlpMRV9aV1pXICAgICAgQlJXX1NXSVpaTEU0KDIsMywyLDMpCisKK3N0YXRpYyBpbmxpbmUgYm9vbAorYnJ3X2lzX3NpbmdsZV92YWx1ZV9zd2l6emxlKGludCBzd2l6KQoreworICAgcmV0dXJuIChzd2l6ID09IEJSV19TV0laWkxFX1hYWFggfHwKKyAgICAgICAgICAgc3dpeiA9PSBCUldfU1dJWlpMRV9ZWVlZIHx8CisgICAgICAgICAgIHN3aXogPT0gQlJXX1NXSVpaTEVfWlpaWiB8fAorICAgICAgICAgICBzd2l6ID09IEJSV19TV0laWkxFX1dXV1cpOworfQorCitlbnVtIFBBQ0tFRCBicndfcmVnX3R5cGUgeworICAgQlJXX1JFR0lTVEVSX1RZUEVfVUQgPSAwLAorICAgQlJXX1JFR0lTVEVSX1RZUEVfRCwKKyAgIEJSV19SRUdJU1RFUl9UWVBFX1VXLAorICAgQlJXX1JFR0lTVEVSX1RZUEVfVywKKyAgIEJSV19SRUdJU1RFUl9UWVBFX0YsCisKKyAgIC8qKiBOb24taW1tZWRpYXRlcyBvbmx5OiBAeyAqLworICAgQlJXX1JFR0lTVEVSX1RZUEVfVUIsCisgICBCUldfUkVHSVNURVJfVFlQRV9CLAorICAgLyoqIEB9ICovCisKKyAgIC8qKiBJbW1lZGlhdGVzIG9ubHk6IEB7ICovCisgICBCUldfUkVHSVNURVJfVFlQRV9VViwKKyAgIEJSV19SRUdJU1RFUl9UWVBFX1YsCisgICBCUldfUkVHSVNURVJfVFlQRV9WRiwKKyAgIC8qKiBAfSAqLworCisgICBCUldfUkVHSVNURVJfVFlQRV9ERiwgLyogR2VuNysgKG5vIGltbWVkaWF0ZXMgdW50aWwgR2VuOCspICovCisKKyAgIC8qIEdlbjgrICovCisgICBCUldfUkVHSVNURVJfVFlQRV9IRiwKKyAgIEJSV19SRUdJU1RFUl9UWVBFX1VRLAorICAgQlJXX1JFR0lTVEVSX1RZUEVfUSwKK307CisKK3Vuc2lnbmVkIGJyd19yZWdfdHlwZV90b19od190eXBlKGNvbnN0IHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBicndfcmVnX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlsZSk7Citjb25zdCBjaGFyICpicndfcmVnX3R5cGVfbGV0dGVycyh1bnNpZ25lZCBicndfcmVnX3R5cGUpOworCisjZGVmaW5lIFJFR19TSVpFICg4KjQpCisKKy8qIFRoZXNlIGFyZW4ndCBoYXJkd2FyZSBzdHJ1Y3RzLCBqdXN0IHNvbWV0aGluZyB1c2VmdWwgZm9yIHVzIHRvIHBhc3MgYXJvdW5kOgorICoKKyAqIEFsaWduMSBvcGVyYXRpb24gaGFzIGEgbG90IG9mIGNvbnRyb2wgb3ZlciBpbnB1dCByYW5nZXMuICBVc2VkIGluCisgKiBXTSBwcm9ncmFtcyB0byBpbXBsZW1lbnQgc2hhZGVycyBkZWNvbXBvc2VkIGludG8gImNoYW5uZWwgc2VyaWFsIgorICogb3IgInN0cnVjdHVyZSBvZiBhcnJheSIgZm9ybToKKyAqLworc3RydWN0IGJyd19yZWcgeworICAgdW5zaWduZWQgdHlwZTo0OworICAgdW5zaWduZWQgZmlsZToyOworICAgdW5zaWduZWQgbnI6ODsKKyAgIHVuc2lnbmVkIHN1Ym5yOjU7ICAgICAgICAgICAgICAvKiA6MSBpbiBhbGlnbjE2ICovCisgICB1bnNpZ25lZCBuZWdhdGU6MTsgICAgICAgICAgICAgLyogc291cmNlIG9ubHkgKi8KKyAgIHVuc2lnbmVkIGFiczoxOyAgICAgICAgICAgICAgICAvKiBzb3VyY2Ugb25seSAqLworICAgdW5zaWduZWQgdnN0cmlkZTo0OyAgICAgICAgICAgIC8qIHNvdXJjZSBvbmx5ICovCisgICB1bnNpZ25lZCB3aWR0aDozOyAgICAgICAgICAgICAgLyogc3JjIG9ubHksIGFsaWduMSBvbmx5ICovCisgICB1bnNpZ25lZCBoc3RyaWRlOjI7ICAgICAgICAgICAgLyogYWxpZ24xIG9ubHkgKi8KKyAgIHVuc2lnbmVkIGFkZHJlc3NfbW9kZToxOyAgICAgICAvKiByZWxhdGl2ZSBhZGRyZXNzaW5nLCBob3BlZnVsbHkhICovCisgICB1bnNpZ25lZCBwYWQwOjE7CisKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CisgICAgICAgICB1bnNpZ25lZCBzd2l6emxlOjg7ICAgICAgLyogc3JjIG9ubHksIGFsaWduMTYgb25seSAqLworICAgICAgICAgdW5zaWduZWQgd3JpdGVtYXNrOjQ7ICAgIC8qIGRlc3Qgb25seSwgYWxpZ24xNiBvbmx5ICovCisgICAgICAgICBpbnQgIGluZGlyZWN0X29mZnNldDoxMDsgLyogcmVsYXRpdmUgYWRkcmVzc2luZyBvZmZzZXQgKi8KKyAgICAgICAgIHVuc2lnbmVkIHBhZDE6MTA7ICAgICAgICAvKiB0d28gZHdvcmRzIHRvdGFsICovCisgICAgICB9IGJpdHM7CisKKyAgICAgIGZsb2F0IGY7CisgICAgICBpbnQgICBkOworICAgICAgdW5zaWduZWQgdWQ7CisgICB9IGR3MTsKK307CisKKworc3RydWN0IGJyd19pbmRpcmVjdCB7CisgICB1bnNpZ25lZCBhZGRyX3N1Ym5yOjQ7CisgICBpbnQgYWRkcl9vZmZzZXQ6MTA7CisgICB1bnNpZ25lZCBwYWQ6MTg7Cit9OworCisKK3N0YXRpYyBpbmxpbmUgaW50Cit0eXBlX3N6KHVuc2lnbmVkIHR5cGUpCit7CisgICBzd2l0Y2godHlwZSkgeworICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9VRDoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRDoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRjoKKyAgICAgIHJldHVybiA0OworICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9VVzoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVzoKKyAgICAgIHJldHVybiAyOworICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9VQjoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfQjoKKyAgICAgIHJldHVybiAxOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK3R5cGVfaXNfc2lnbmVkKHVuc2lnbmVkIHR5cGUpCit7CisgICBzd2l0Y2godHlwZSkgeworICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9EOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9XOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9GOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9COgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9WOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9WRjoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfREY6CisgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX0hGOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9ROgorICAgICAgcmV0dXJuIHRydWU7CisKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVUQ6CisgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX1VXOgorICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9VQjoKKyAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVVY6CisgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX1VROgorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiVW5yZWFjaGFibGUuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgYnJ3X3JlZy4KKyAqIFxwYXJhbSBmaWxlICAgICAgb25lIG9mIHRoZSBCUldfeF9SRUdJU1RFUl9GSUxFIHZhbHVlcworICogXHBhcmFtIG5yICAgICAgICByZWdpc3RlciBudW1iZXIvaW5kZXgKKyAqIFxwYXJhbSBzdWJuciAgICAgcmVnaXN0ZXIgc3ViIG51bWJlcgorICogXHBhcmFtIHR5cGUgICAgICBvbmUgb2YgQlJXX1JFR0lTVEVSX1RZUEVfeAorICogXHBhcmFtIHZzdHJpZGUgICBvbmUgb2YgQlJXX1ZFUlRJQ0FMX1NUUklERV94CisgKiBccGFyYW0gd2lkdGggICAgIG9uZSBvZiBCUldfV0lEVEhfeAorICogXHBhcmFtIGhzdHJpZGUgICBvbmUgb2YgQlJXX0hPUklaT05UQUxfU1RSSURFX3gKKyAqIFxwYXJhbSBzd2l6emxlICAgb25lIG9mIEJSV19TV0laWkxFX3gKKyAqIFxwYXJhbSB3cml0ZW1hc2sgV1JJVEVNQVNLX1gvWS9aL1cgYml0ZmllbGQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X3JlZyh1bnNpZ25lZCBmaWxlLAorICAgICAgICB1bnNpZ25lZCBuciwKKyAgICAgICAgdW5zaWduZWQgc3VibnIsCisgICAgICAgIHVuc2lnbmVkIHR5cGUsCisgICAgICAgIHVuc2lnbmVkIHZzdHJpZGUsCisgICAgICAgIHVuc2lnbmVkIHdpZHRoLAorICAgICAgICB1bnNpZ25lZCBoc3RyaWRlLAorICAgICAgICB1bnNpZ25lZCBzd2l6emxlLAorICAgICAgICB1bnNpZ25lZCB3cml0ZW1hc2spCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyByZWc7CisgICBpZiAoZmlsZSA9PSBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFKQorICAgICAgYXNzZXJ0KG5yIDwgQlJXX01BWF9HUkYpOworICAgZWxzZSBpZiAoZmlsZSA9PSBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFKQorICAgICAgYXNzZXJ0KChuciAmIH4oMSA8PCA3KSkgPCBCUldfTUFYX01SRik7CisgICBlbHNlIGlmIChmaWxlID09IEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSkKKyAgICAgIGFzc2VydChuciA8PSBCUldfQVJGX1RJTUVTVEFNUCk7CisKKyAgIHJlZy50eXBlID0gdHlwZTsKKyAgIHJlZy5maWxlID0gZmlsZTsKKyAgIHJlZy5uciA9IG5yOworICAgcmVnLnN1Ym5yID0gc3VibnIgKiB0eXBlX3N6KHR5cGUpOworICAgcmVnLm5lZ2F0ZSA9IDA7CisgICByZWcuYWJzID0gMDsKKyAgIHJlZy52c3RyaWRlID0gdnN0cmlkZTsKKyAgIHJlZy53aWR0aCA9IHdpZHRoOworICAgcmVnLmhzdHJpZGUgPSBoc3RyaWRlOworICAgcmVnLmFkZHJlc3NfbW9kZSA9IEJSV19BRERSRVNTX0RJUkVDVDsKKyAgIHJlZy5wYWQwID0gMDsKKworICAgLyogQ291bGQgZG8gYmV0dGVyOiBJZiB0aGUgcmVnIGlzIHI1LjM8MDsxLDA+LCB3ZSBwcm9iYWJseSB3YW50IHRvCisgICAgKiBzZXQgc3dpenpsZSBhbmQgd3JpdGVtYXNrIHRvIFcsIGFzIHRoZSBsb3dlciBiaXRzIG9mIHN1Ym5yIHdpbGwKKyAgICAqIGJlIGxvc3Qgd2hlbiBjb252ZXJ0ZWQgdG8gYWxpZ24xNi4gIFRoaXMgaXMgcHJvYmFibHkgdG9vIG11Y2ggdG8KKyAgICAqIGtlZXAgdHJhY2sgb2YgYXMgeW91J2Qgd2FudCBpdCBhZGp1c3RlZCBieSBzdWJvZmZzZXQoKSwgZXRjLgorICAgICogUGVyaGFwcyBmaXggdXAgd2hlbiBjb252ZXJ0aW5nIHRvIGFsaWduMTY/CisgICAgKi8KKyAgIHJlZy5kdzEuYml0cy5zd2l6emxlID0gc3dpenpsZTsKKyAgIHJlZy5kdzEuYml0cy53cml0ZW1hc2sgPSB3cml0ZW1hc2s7CisgICByZWcuZHcxLmJpdHMuaW5kaXJlY3Rfb2Zmc2V0ID0gMDsKKyAgIHJlZy5kdzEuYml0cy5wYWQxID0gMDsKKyAgIHJldHVybiByZWc7Cit9CisKKy8qKiBDb25zdHJ1Y3QgZmxvYXRbMTZdIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdmVjMTZfcmVnKHVuc2lnbmVkIGZpbGUsIHVuc2lnbmVkIG5yLCB1bnNpZ25lZCBzdWJucikKK3sKKyAgIHJldHVybiBicndfcmVnKGZpbGUsCisgICAgICAgICAgICAgICAgICBuciwKKyAgICAgICAgICAgICAgICAgIHN1Ym5yLAorICAgICAgICAgICAgICAgICAgQlJXX1JFR0lTVEVSX1RZUEVfRiwKKyAgICAgICAgICAgICAgICAgIEJSV19WRVJUSUNBTF9TVFJJREVfMTYsCisgICAgICAgICAgICAgICAgICBCUldfV0lEVEhfMTYsCisgICAgICAgICAgICAgICAgICBCUldfSE9SSVpPTlRBTF9TVFJJREVfMSwKKyAgICAgICAgICAgICAgICAgIEJSV19TV0laWkxFX1hZWlcsCisgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWFlaVyk7Cit9CisKKy8qKiBDb25zdHJ1Y3QgZmxvYXRbOF0gcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd192ZWM4X3JlZyh1bnNpZ25lZCBmaWxlLCB1bnNpZ25lZCBuciwgdW5zaWduZWQgc3VibnIpCit7CisgICByZXR1cm4gYnJ3X3JlZyhmaWxlLAorICAgICAgICAgICAgICAgICAgbnIsCisgICAgICAgICAgICAgICAgICBzdWJuciwKKyAgICAgICAgICAgICAgICAgIEJSV19SRUdJU1RFUl9UWVBFX0YsCisgICAgICAgICAgICAgICAgICBCUldfVkVSVElDQUxfU1RSSURFXzgsCisgICAgICAgICAgICAgICAgICBCUldfV0lEVEhfOCwKKyAgICAgICAgICAgICAgICAgIEJSV19IT1JJWk9OVEFMX1NUUklERV8xLAorICAgICAgICAgICAgICAgICAgQlJXX1NXSVpaTEVfWFlaVywKKyAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19YWVpXKTsKK30KKworLyoqIENvbnN0cnVjdCBmbG9hdFs0XSByZWdpc3RlciAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X3ZlYzRfcmVnKHVuc2lnbmVkIGZpbGUsIHVuc2lnbmVkIG5yLCB1bnNpZ25lZCBzdWJucikKK3sKKyAgIHJldHVybiBicndfcmVnKGZpbGUsCisgICAgICAgICAgICAgICAgICBuciwKKyAgICAgICAgICAgICAgICAgIHN1Ym5yLAorICAgICAgICAgICAgICAgICAgQlJXX1JFR0lTVEVSX1RZUEVfRiwKKyAgICAgICAgICAgICAgICAgIEJSV19WRVJUSUNBTF9TVFJJREVfNCwKKyAgICAgICAgICAgICAgICAgIEJSV19XSURUSF80LAorICAgICAgICAgICAgICAgICAgQlJXX0hPUklaT05UQUxfU1RSSURFXzEsCisgICAgICAgICAgICAgICAgICBCUldfU1dJWlpMRV9YWVpXLAorICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1hZWlcpOworfQorCisvKiogQ29uc3RydWN0IGZsb2F0WzJdIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdmVjMl9yZWcodW5zaWduZWQgZmlsZSwgdW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIGJyd19yZWcoZmlsZSwKKyAgICAgICAgICAgICAgICAgIG5yLAorICAgICAgICAgICAgICAgICAgc3VibnIsCisgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9GLAorICAgICAgICAgICAgICAgICAgQlJXX1ZFUlRJQ0FMX1NUUklERV8yLAorICAgICAgICAgICAgICAgICAgQlJXX1dJRFRIXzIsCisgICAgICAgICAgICAgICAgICBCUldfSE9SSVpPTlRBTF9TVFJJREVfMSwKKyAgICAgICAgICAgICAgICAgIEJSV19TV0laWkxFX1hZWFksCisgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWFkpOworfQorCisvKiogQ29uc3RydWN0IGZsb2F0WzFdIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdmVjMV9yZWcodW5zaWduZWQgZmlsZSwgdW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIGJyd19yZWcoZmlsZSwKKyAgICAgICAgICAgICAgICAgIG5yLAorICAgICAgICAgICAgICAgICAgc3VibnIsCisgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9GLAorICAgICAgICAgICAgICAgICAgQlJXX1ZFUlRJQ0FMX1NUUklERV8wLAorICAgICAgICAgICAgICAgICAgQlJXX1dJRFRIXzEsCisgICAgICAgICAgICAgICAgICBCUldfSE9SSVpPTlRBTF9TVFJJREVfMCwKKyAgICAgICAgICAgICAgICAgIEJSV19TV0laWkxFX1hYWFgsCisgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd192ZWNuX3JlZyh1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgZmlsZSwgdW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgc3dpdGNoICh3aWR0aCkgeworICAgY2FzZSAxOgorICAgICAgcmV0dXJuIGJyd192ZWMxX3JlZyhmaWxlLCBuciwgc3VibnIpOworICAgY2FzZSAyOgorICAgICAgcmV0dXJuIGJyd192ZWMyX3JlZyhmaWxlLCBuciwgc3VibnIpOworICAgY2FzZSA0OgorICAgICAgcmV0dXJuIGJyd192ZWM0X3JlZyhmaWxlLCBuciwgc3VibnIpOworICAgY2FzZSA4OgorICAgICAgcmV0dXJuIGJyd192ZWM4X3JlZyhmaWxlLCBuciwgc3VibnIpOworICAgY2FzZSAxNjoKKyAgICAgIHJldHVybiBicndfdmVjMTZfcmVnKGZpbGUsIG5yLCBzdWJucik7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiSW52YWxpZCByZWdpc3RlciB3aWR0aCIpOworICAgfQorICAgdW5yZWFjaGFibGUoKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworcmV0eXBlKHN0cnVjdCBicndfcmVnIHJlZywgdW5zaWduZWQgdHlwZSkKK3sKKyAgIHJlZy50eXBlID0gdHlwZTsKKyAgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK3NlY2hhbGYoc3RydWN0IGJyd19yZWcgcmVnKQoreworICAgaWYgKHJlZy52c3RyaWRlKQorICAgICAgcmVnLm5yKys7CisgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitzdWJvZmZzZXQoc3RydWN0IGJyd19yZWcgcmVnLCB1bnNpZ25lZCBkZWx0YSkKK3sKKyAgIHJlZy5zdWJuciArPSBkZWx0YSAqIHR5cGVfc3oocmVnLnR5cGUpOworICAgcmV0dXJuIHJlZzsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitvZmZzZXQoc3RydWN0IGJyd19yZWcgcmVnLCB1bnNpZ25lZCBkZWx0YSkKK3sKKyAgIHJlZy5uciArPSBkZWx0YTsKKyAgIHJldHVybiByZWc7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnl0ZV9vZmZzZXQoc3RydWN0IGJyd19yZWcgcmVnLCB1bnNpZ25lZCBieXRlcykKK3sKKyAgIHVuc2lnbmVkIG5ld29mZnNldCA9IHJlZy5uciAqIFJFR19TSVpFICsgcmVnLnN1Ym5yICsgYnl0ZXM7CisgICByZWcubnIgPSBuZXdvZmZzZXQgLyBSRUdfU0laRTsKKyAgIHJlZy5zdWJuciA9IG5ld29mZnNldCAlIFJFR19TSVpFOworICAgcmV0dXJuIHJlZzsKK30KKworCisvKiogQ29uc3RydWN0IHVuc2lnbmVkIHdvcmRbMTZdIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdXcxNl9yZWcodW5zaWduZWQgZmlsZSwgdW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIHN1Ym9mZnNldChyZXR5cGUoYnJ3X3ZlYzE2X3JlZyhmaWxlLCBuciwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwgc3VibnIpOworfQorCisvKiogQ29uc3RydWN0IHVuc2lnbmVkIHdvcmRbOF0gcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd191dzhfcmVnKHVuc2lnbmVkIGZpbGUsIHVuc2lnbmVkIG5yLCB1bnNpZ25lZCBzdWJucikKK3sKKyAgIHJldHVybiBzdWJvZmZzZXQocmV0eXBlKGJyd192ZWM4X3JlZyhmaWxlLCBuciwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwgc3VibnIpOworfQorCisvKiogQ29uc3RydWN0IHVuc2lnbmVkIHdvcmRbMV0gcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd191dzFfcmVnKHVuc2lnbmVkIGZpbGUsIHVuc2lnbmVkIG5yLCB1bnNpZ25lZCBzdWJucikKK3sKKyAgIHJldHVybiBzdWJvZmZzZXQocmV0eXBlKGJyd192ZWMxX3JlZyhmaWxlLCBuciwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKSwgc3VibnIpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfaW1tX3JlZyh1bnNpZ25lZCB0eXBlKQoreworICAgcmV0dXJuIGJyd19yZWcoQlJXX0lNTUVESUFURV9WQUxVRSwKKyAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgIEJSV19WRVJUSUNBTF9TVFJJREVfMCwKKyAgICAgICAgICAgICAgICAgIEJSV19XSURUSF8xLAorICAgICAgICAgICAgICAgICAgQlJXX0hPUklaT05UQUxfU1RSSURFXzAsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgMCk7Cit9CisKKy8qKiBDb25zdHJ1Y3QgZmxvYXQgaW1tZWRpYXRlIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfaW1tX2YoZmxvYXQgZikKK3sKKyAgIHN0cnVjdCBicndfcmVnIGltbSA9IGJyd19pbW1fcmVnKEJSV19SRUdJU1RFUl9UWVBFX0YpOworICAgaW1tLmR3MS5mID0gZjsKKyAgIHJldHVybiBpbW07Cit9CisKKy8qKiBDb25zdHJ1Y3QgaW50ZWdlciBpbW1lZGlhdGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19pbW1fZChpbnQgZCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIGltbSA9IGJyd19pbW1fcmVnKEJSV19SRUdJU1RFUl9UWVBFX0QpOworICAgaW1tLmR3MS5kID0gZDsKKyAgIHJldHVybiBpbW07Cit9CisKKy8qKiBDb25zdHJ1Y3QgdWludCBpbW1lZGlhdGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19pbW1fdWQodW5zaWduZWQgdWQpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBpbW0gPSBicndfaW1tX3JlZyhCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICBpbW0uZHcxLnVkID0gdWQ7CisgICByZXR1cm4gaW1tOworfQorCisvKiogQ29uc3RydWN0IHVzaG9ydCBpbW1lZGlhdGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19pbW1fdXcodWludDE2X3QgdXcpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBpbW0gPSBicndfaW1tX3JlZyhCUldfUkVHSVNURVJfVFlQRV9VVyk7CisgICBpbW0uZHcxLnVkID0gdXcgfCAodXcgPDwgMTYpOworICAgcmV0dXJuIGltbTsKK30KKworLyoqIENvbnN0cnVjdCBzaG9ydCBpbW1lZGlhdGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19pbW1fdyhpbnQxNl90IHcpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBpbW0gPSBicndfaW1tX3JlZyhCUldfUkVHSVNURVJfVFlQRV9XKTsKKyAgIGltbS5kdzEuZCA9IHcgfCAodyA8PCAxNik7CisgICByZXR1cm4gaW1tOworfQorCisvKiBicndfaW1tX2IgYW5kIGJyd19pbW1fdWIgYXJlbid0IHN1cHBvcnRlZCBieSBoYXJkd2FyZSAtIHRoZSB0eXBlCisgKiBudW1iZXJzIGFsaWFzIHdpdGggX1YgYW5kIF9WRiBiZWxvdzoKKyAqLworCisvKiogQ29uc3RydWN0IHZlY3RvciBvZiBlaWdodCBzaWduZWQgaGFsZi1ieXRlIHZhbHVlcyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X2ltbV92KHVuc2lnbmVkIHYpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBpbW0gPSBicndfaW1tX3JlZyhCUldfUkVHSVNURVJfVFlQRV9WKTsKKyAgIGltbS52c3RyaWRlID0gQlJXX1ZFUlRJQ0FMX1NUUklERV8wOworICAgaW1tLndpZHRoID0gQlJXX1dJRFRIXzg7CisgICBpbW0uaHN0cmlkZSA9IEJSV19IT1JJWk9OVEFMX1NUUklERV8xOworICAgaW1tLmR3MS51ZCA9IHY7CisgICByZXR1cm4gaW1tOworfQorCisvKiogQ29uc3RydWN0IHZlY3RvciBvZiBmb3VyIDgtYml0IGZsb2F0IHZhbHVlcyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X2ltbV92Zih1bnNpZ25lZCB2KQoreworICAgc3RydWN0IGJyd19yZWcgaW1tID0gYnJ3X2ltbV9yZWcoQlJXX1JFR0lTVEVSX1RZUEVfVkYpOworICAgaW1tLnZzdHJpZGUgPSBCUldfVkVSVElDQUxfU1RSSURFXzA7CisgICBpbW0ud2lkdGggPSBCUldfV0lEVEhfNDsKKyAgIGltbS5oc3RyaWRlID0gQlJXX0hPUklaT05UQUxfU1RSSURFXzE7CisgICBpbW0uZHcxLnVkID0gdjsKKyAgIHJldHVybiBpbW07Cit9CisKKy8qKgorICogQ29udmVydCBhbiBpbnRlZ2VyIGludG8gYSAicmVzdHJpY3RlZCIgOC1iaXQgZmxvYXQsIHVzZWQgaW4gdmVjdG9yCisgKiBpbW1lZGlhdGVzLiAgVGhlIDgtYml0IGZsb2F0aW5nIHBvaW50IGZvcm1hdCBoYXMgYSBzaWduIGJpdCwgYW4KKyAqIGV4Y2Vzcy0zIDMtYml0IGV4cG9uZW50LCBhbmQgYSA0LWJpdCBtYW50aXNzYS4gIEFsbCBpbnRlZ2VyIHZhbHVlcworICogZnJvbSAtMzEgdG8gMzEgY2FuIGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdAoraW50X3RvX2Zsb2F0OChpbnQgeCkKK3sKKyAgIGlmICh4ID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgfSBlbHNlIGlmICh4IDwgMCkgeworICAgICAgcmV0dXJuIDEgPDwgNyB8IGludF90b19mbG9hdDgoLXgpOworICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGV4cG9uZW50ID0gX21lc2FfbG9nYmFzZTIoeCk7CisgICAgICBjb25zdCB1bnNpZ25lZCBtYW50aXNzYSA9ICh4IC0gKDEgPDwgZXhwb25lbnQpKSA8PCAoNCAtIGV4cG9uZW50KTsKKyAgICAgIGFzc2VydChleHBvbmVudCA8PSA0KTsKKyAgICAgIHJldHVybiAoZXhwb25lbnQgKyAzKSA8PCA0IHwgbWFudGlzc2E7CisgICB9Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgZmxvYXRpbmctcG9pbnQgcGFja2VkIHZlY3RvciBpbW1lZGlhdGUgZnJvbSBpdHMgaW50ZWdlcgorICogdmFsdWVzLiBcc2EgaW50X3RvX2Zsb2F0OCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19pbW1fdmY0KGludCB2MCwgaW50IHYxLCBpbnQgdjIsIGludCB2MykKK3sKKyAgIHJldHVybiBicndfaW1tX3ZmKChpbnRfdG9fZmxvYXQ4KHYwKSA8PCAwKSB8CisgICAgICAgICAgICAgICAgICAgICAoaW50X3RvX2Zsb2F0OCh2MSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgKGludF90b19mbG9hdDgodjIpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAoaW50X3RvX2Zsb2F0OCh2MykgPDwgMjQpKTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfYWRkcmVzcyhzdHJ1Y3QgYnJ3X3JlZyByZWcpCit7CisgICByZXR1cm4gYnJ3X2ltbV91dyhyZWcubnIgKiBSRUdfU0laRSArIHJlZy5zdWJucik7Cit9CisKKy8qKiBDb25zdHJ1Y3QgZmxvYXRbMV0gZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdmVjMV9ncmYodW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIGJyd192ZWMxX3JlZyhCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLCBuciwgc3VibnIpOworfQorCisvKiogQ29uc3RydWN0IGZsb2F0WzJdIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X3ZlYzJfZ3JmKHVuc2lnbmVkIG5yLCB1bnNpZ25lZCBzdWJucikKK3sKKyAgIHJldHVybiBicndfdmVjMl9yZWcoQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSwgbnIsIHN1Ym5yKTsKK30KKworLyoqIENvbnN0cnVjdCBmbG9hdFs0XSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd192ZWM0X2dyZih1bnNpZ25lZCBuciwgdW5zaWduZWQgc3VibnIpCit7CisgICByZXR1cm4gYnJ3X3ZlYzRfcmVnKEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUsIG5yLCBzdWJucik7Cit9CisKKy8qKiBDb25zdHJ1Y3QgZmxvYXRbOF0gZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdmVjOF9ncmYodW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIGJyd192ZWM4X3JlZyhCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLCBuciwgc3VibnIpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd191dzhfZ3JmKHVuc2lnbmVkIG5yLCB1bnNpZ25lZCBzdWJucikKK3sKKyAgIHJldHVybiBicndfdXc4X3JlZyhCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLCBuciwgc3VibnIpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdXcxNl9ncmYodW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIGJyd191dzE2X3JlZyhCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFLCBuciwgc3VibnIpOworfQorCisKKy8qKiBDb25zdHJ1Y3QgbnVsbCByZWdpc3RlciAodXN1YWxseSB1c2VkIGZvciBzZXR0aW5nIGNvbmRpdGlvbiBjb2RlcykgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19udWxsX3JlZyh2b2lkKQoreworICAgcmV0dXJuIGJyd192ZWM4X3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsIEJSV19BUkZfTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19hZGRyZXNzX3JlZyh1bnNpZ25lZCBzdWJucikKK3sKKyAgIHJldHVybiBicndfdXcxX3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsIEJSV19BUkZfQUREUkVTUywgc3VibnIpOworfQorCisvKiBJZi9lbHNlIGluc3RydWN0aW9ucyBicmVhayBpbiBhbGlnbjE2IG1vZGUgaWYgd3JpdGVtYXNrICYgc3dpenpsZQorICogYXJlbid0IHh5encuICBUaGlzIGdvZXMgYWdhaW5zdCB0aGUgY29udmVudGlvbiBmb3Igb3RoZXIgc2NhbGFyCisgKiByZWdzOgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfaXBfcmVnKHZvaWQpCit7CisgICByZXR1cm4gYnJ3X3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsCisgICAgICAgICAgICAgICAgICBCUldfQVJGX0lQLAorICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgIEJSV19SRUdJU1RFUl9UWVBFX1VELAorICAgICAgICAgICAgICAgICAgQlJXX1ZFUlRJQ0FMX1NUUklERV80LCAvKiA/ICovCisgICAgICAgICAgICAgICAgICBCUldfV0lEVEhfMSwKKyAgICAgICAgICAgICAgICAgIEJSV19IT1JJWk9OVEFMX1NUUklERV8wLAorICAgICAgICAgICAgICAgICAgQlJXX1NXSVpaTEVfWFlaVywgLyogTk9URSEgKi8KKyAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19YWVpXKTsgLyogTk9URSEgKi8KK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X2FjY19yZWcodm9pZCkKK3sKKyAgIHJldHVybiBicndfdmVjOF9yZWcoQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFLCBCUldfQVJGX0FDQ1VNVUxBVE9SLCAwKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X25vdGlmaWNhdGlvbl8xX3JlZyh2b2lkKQoreworCisgICByZXR1cm4gYnJ3X3JlZyhCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUsCisgICAgICAgICAgICAgICAgICBCUldfQVJGX05PVElGSUNBVElPTl9DT1VOVCwKKyAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9VRCwKKyAgICAgICAgICAgICAgICAgIEJSV19WRVJUSUNBTF9TVFJJREVfMCwKKyAgICAgICAgICAgICAgICAgIEJSV19XSURUSF8xLAorICAgICAgICAgICAgICAgICAgQlJXX0hPUklaT05UQUxfU1RSSURFXzAsCisgICAgICAgICAgICAgICAgICBCUldfU1dJWlpMRV9YWFhYLAorICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1gpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19mbGFnX3JlZyhpbnQgcmVnLCBpbnQgc3VicmVnKQoreworICAgcmV0dXJuIGJyd191dzFfcmVnKEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICBCUldfQVJGX0ZMQUcgKyByZWcsIHN1YnJlZyk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X21hc2tfcmVnKHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIGJyd191dzFfcmVnKEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSwgQlJXX0FSRl9NQVNLLCBzdWJucik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19tZXNzYWdlX3JlZyh1bnNpZ25lZCBucikKK3sKKyAgIGFzc2VydCgobnIgJiB+KDEgPDwgNykpIDwgQlJXX01BWF9NUkYpOworICAgcmV0dXJuIGJyd192ZWM4X3JlZyhCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFLCBuciwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd191dmVjX21yZih1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgbnIsIHVuc2lnbmVkIHN1Ym5yKQoreworICAgcmV0dXJuIHJldHlwZShicndfdmVjbl9yZWcod2lkdGgsIEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUsIG5yLCBzdWJuciksCisgICAgICAgICAgICAgICAgIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKK30KKworLyogVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGNhbGxlZCB3aXRoIGEgbnVtZXJpYyBjb25zdGFudCBhcmd1bWVudCwgc28KKyAqIG1ha2UgdGhpbmdzIGVhc3kgdG8gZXZhbHVhdGUgYXQgY29tcGlsZSB0aW1lOgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGN2dCh1bnNpZ25lZCB2YWwpCit7CisgICBzd2l0Y2ggKHZhbCkgeworICAgY2FzZSAwOiByZXR1cm4gMDsKKyAgIGNhc2UgMTogcmV0dXJuIDE7CisgICBjYXNlIDI6IHJldHVybiAyOworICAgY2FzZSA0OiByZXR1cm4gMzsKKyAgIGNhc2UgODogcmV0dXJuIDQ7CisgICBjYXNlIDE2OiByZXR1cm4gNTsKKyAgIGNhc2UgMzI6IHJldHVybiA2OworICAgfQorICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK3N0cmlkZShzdHJ1Y3QgYnJ3X3JlZyByZWcsIHVuc2lnbmVkIHZzdHJpZGUsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoc3RyaWRlKQoreworICAgcmVnLnZzdHJpZGUgPSBjdnQodnN0cmlkZSk7CisgICByZWcud2lkdGggPSBjdnQod2lkdGgpIC0gMTsKKyAgIHJlZy5oc3RyaWRlID0gY3Z0KGhzdHJpZGUpOworICAgcmV0dXJuIHJlZzsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCit2ZWMxNihzdHJ1Y3QgYnJ3X3JlZyByZWcpCit7CisgICByZXR1cm4gc3RyaWRlKHJlZywgMTYsMTYsMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK3ZlYzgoc3RydWN0IGJyd19yZWcgcmVnKQoreworICAgcmV0dXJuIHN0cmlkZShyZWcsIDgsOCwxKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZwordmVjNChzdHJ1Y3QgYnJ3X3JlZyByZWcpCit7CisgICByZXR1cm4gc3RyaWRlKHJlZywgNCw0LDEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCit2ZWMyKHN0cnVjdCBicndfcmVnIHJlZykKK3sKKyAgIHJldHVybiBzdHJpZGUocmVnLCAyLDIsMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK3ZlYzEoc3RydWN0IGJyd19yZWcgcmVnKQoreworICAgcmV0dXJuIHN0cmlkZShyZWcsIDAsMSwwKTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitnZXRfZWxlbWVudChzdHJ1Y3QgYnJ3X3JlZyByZWcsIHVuc2lnbmVkIGVsdCkKK3sKKyAgIHJldHVybiB2ZWMxKHN1Ym9mZnNldChyZWcsIGVsdCkpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitnZXRfZWxlbWVudF91ZChzdHJ1Y3QgYnJ3X3JlZyByZWcsIHVuc2lnbmVkIGVsdCkKK3sKKyAgIHJldHVybiB2ZWMxKHN1Ym9mZnNldChyZXR5cGUocmVnLCBCUldfUkVHSVNURVJfVFlQRV9VRCksIGVsdCkpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitnZXRfZWxlbWVudF9kKHN0cnVjdCBicndfcmVnIHJlZywgdW5zaWduZWQgZWx0KQoreworICAgcmV0dXJuIHZlYzEoc3Vib2Zmc2V0KHJldHlwZShyZWcsIEJSV19SRUdJU1RFUl9UWVBFX0QpLCBlbHQpKTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfc3dpenpsZShzdHJ1Y3QgYnJ3X3JlZyByZWcsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIHVuc2lnbmVkIHosIHVuc2lnbmVkIHcpCit7CisgICBhc3NlcnQocmVnLmZpbGUgIT0gQlJXX0lNTUVESUFURV9WQUxVRSk7CisKKyAgIHJlZy5kdzEuYml0cy5zd2l6emxlID0gQlJXX1NXSVpaTEU0KEJSV19HRVRfU1daKHJlZy5kdzEuYml0cy5zd2l6emxlLCB4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19HRVRfU1daKHJlZy5kdzEuYml0cy5zd2l6emxlLCB5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19HRVRfU1daKHJlZy5kdzEuYml0cy5zd2l6emxlLCB6KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19HRVRfU1daKHJlZy5kdzEuYml0cy5zd2l6emxlLCB3KSk7CisgICByZXR1cm4gcmVnOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2Jyd19zd2l6emxlMShzdHJ1Y3QgYnJ3X3JlZyByZWcsIHVuc2lnbmVkIHgpCit7CisgICByZXR1cm4gYnJ3X3N3aXp6bGUocmVnLCB4LCB4LCB4LCB4KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYnJ3X3dyaXRlbWFzayhzdHJ1Y3QgYnJ3X3JlZyByZWcsIHVuc2lnbmVkIG1hc2spCit7CisgICBhc3NlcnQocmVnLmZpbGUgIT0gQlJXX0lNTUVESUFURV9WQUxVRSk7CisgICByZWcuZHcxLmJpdHMud3JpdGVtYXNrICY9IG1hc2s7CisgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfc2V0X3dyaXRlbWFzayhzdHJ1Y3QgYnJ3X3JlZyByZWcsIHVuc2lnbmVkIG1hc2spCit7CisgICBhc3NlcnQocmVnLmZpbGUgIT0gQlJXX0lNTUVESUFURV9WQUxVRSk7CisgICByZWcuZHcxLmJpdHMud3JpdGVtYXNrID0gbWFzazsKKyAgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK25lZ2F0ZShzdHJ1Y3QgYnJ3X3JlZyByZWcpCit7CisgICByZWcubmVnYXRlIF49IDE7CisgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfYWJzKHN0cnVjdCBicndfcmVnIHJlZykKK3sKKyAgIHJlZy5hYnMgPSAxOworICAgcmVnLm5lZ2F0ZSA9IDA7CisgICByZXR1cm4gcmVnOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdmVjNF9pbmRpcmVjdCh1bnNpZ25lZCBzdWJuciwgaW50IG9mZnNldCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIHJlZyA9ICBicndfdmVjNF9ncmYoMCwgMCk7CisgICByZWcuc3VibnIgPSBzdWJucjsKKyAgIHJlZy5hZGRyZXNzX21vZGUgPSBCUldfQUREUkVTU19SRUdJU1RFUl9JTkRJUkVDVF9SRUdJU1RFUjsKKyAgIHJlZy5kdzEuYml0cy5pbmRpcmVjdF9vZmZzZXQgPSBvZmZzZXQ7CisgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCiticndfdmVjMV9pbmRpcmVjdCh1bnNpZ25lZCBzdWJuciwgaW50IG9mZnNldCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIHJlZyA9ICBicndfdmVjMV9ncmYoMCwgMCk7CisgICByZWcuc3VibnIgPSBzdWJucjsKKyAgIHJlZy5hZGRyZXNzX21vZGUgPSBCUldfQUREUkVTU19SRUdJU1RFUl9JTkRJUkVDVF9SRUdJU1RFUjsKKyAgIHJlZy5kdzEuYml0cy5pbmRpcmVjdF9vZmZzZXQgPSBvZmZzZXQ7CisgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitkZXJlZl80ZihzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgaW50IG9mZnNldCkKK3sKKyAgIHJldHVybiBicndfdmVjNF9pbmRpcmVjdChwdHIuYWRkcl9zdWJuciwgcHRyLmFkZHJfb2Zmc2V0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworZGVyZWZfMWYoc3RydWN0IGJyd19pbmRpcmVjdCBwdHIsIGludCBvZmZzZXQpCit7CisgICByZXR1cm4gYnJ3X3ZlYzFfaW5kaXJlY3QocHRyLmFkZHJfc3VibnIsIHB0ci5hZGRyX29mZnNldCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19yZWcKK2RlcmVmXzRiKHN0cnVjdCBicndfaW5kaXJlY3QgcHRyLCBpbnQgb2Zmc2V0KQoreworICAgcmV0dXJuIHJldHlwZShkZXJlZl80ZihwdHIsIG9mZnNldCksIEJSV19SRUdJU1RFUl9UWVBFX0IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitkZXJlZl8xdXcoc3RydWN0IGJyd19pbmRpcmVjdCBwdHIsIGludCBvZmZzZXQpCit7CisgICByZXR1cm4gcmV0eXBlKGRlcmVmXzFmKHB0ciwgb2Zmc2V0KSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfcmVnCitkZXJlZl8xZChzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgaW50IG9mZnNldCkKK3sKKyAgIHJldHVybiByZXR5cGUoZGVyZWZfMWYocHRyLCBvZmZzZXQpLCBCUldfUkVHSVNURVJfVFlQRV9EKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworZGVyZWZfMXVkKHN0cnVjdCBicndfaW5kaXJlY3QgcHRyLCBpbnQgb2Zmc2V0KQoreworICAgcmV0dXJuIHJldHlwZShkZXJlZl8xZihwdHIsIG9mZnNldCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworZ2V0X2FkZHJfcmVnKHN0cnVjdCBicndfaW5kaXJlY3QgcHRyKQoreworICAgcmV0dXJuIGJyd19hZGRyZXNzX3JlZyhwdHIuYWRkcl9zdWJucik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19pbmRpcmVjdAorYnJ3X2luZGlyZWN0X29mZnNldChzdHJ1Y3QgYnJ3X2luZGlyZWN0IHB0ciwgaW50IG9mZnNldCkKK3sKKyAgIHB0ci5hZGRyX29mZnNldCArPSBvZmZzZXQ7CisgICByZXR1cm4gcHRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicndfaW5kaXJlY3QKK2Jyd19pbmRpcmVjdCh1bnNpZ25lZCBhZGRyX3N1Ym5yLCBpbnQgb2Zmc2V0KQoreworICAgc3RydWN0IGJyd19pbmRpcmVjdCBwdHI7CisgICBwdHIuYWRkcl9zdWJuciA9IGFkZHJfc3VibnI7CisgICBwdHIuYWRkcl9vZmZzZXQgPSBvZmZzZXQ7CisgICBwdHIucGFkID0gMDsKKyAgIHJldHVybiBwdHI7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19zY2hlZHVsZV9pbnN0cnVjdGlvbnMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd19zY2hlZHVsZV9pbnN0cnVjdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNDY1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3NjaGVkdWxlX2luc3RydWN0aW9ucy5jcHAKQEAgLTAsMCArMSwyMzYwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNCBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNpbmNsdWRlICJicndfZnMuaCIKKyNpbmNsdWRlICJicndfdmVjNC5oIgorI2luY2x1ZGUgImdsc2wvZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImdsc2wvaXJfb3B0aW1pemF0aW9uLmgiCisKKyNpbmNsdWRlICJicndfZnNfbGl2ZV92YXJpYWJsZXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2UgYnJ3OworCisvKiogQGZpbGUgYnJ3X2ZzX3NjaGVkdWxlX2luc3RydWN0aW9ucy5jcHAKKyAqCisgKiBMaXN0IHNjaGVkdWxpbmcgb2YgRlMgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIFRoZSBiYXNpYyBtb2RlbCBvZiB0aGUgbGlzdCBzY2hlZHVsZXIgaXMgdG8gdGFrZSBhIGJhc2ljIGJsb2NrLAorICogY29tcHV0ZSBhIERBRyBvZiB0aGUgZGVwZW5kZW5jaWVzIChSQVcgb3JkZXJpbmcgd2l0aCBsYXRlbmN5LCBXQVcKKyAqIG9yZGVyaW5nIHdpdGggbGF0ZW5jeSwgV0FSIG9yZGVyaW5nKSwgYW5kIG1ha2UgYSBsaXN0IG9mIHRoZSBEQUcgaGVhZHMuCisgKiBIZXVyaXN0aWNhbGx5IHBpY2sgYSBEQUcgaGVhZCwgdGhlbiBwdXQgYWxsIHRoZSBjaGlsZHJlbiB0aGF0IGFyZQorICogbm93IERBRyBoZWFkcyBpbnRvIHRoZSBsaXN0IG9mIHRoaW5ncyB0byBzY2hlZHVsZS4KKyAqCisgKiBUaGUgaGV1cmlzdGljIGlzIHRoZSBpbXBvcnRhbnQgcGFydC4gIFdlJ3JlIHRyeWluZyB0byBiZSBjaGVhcCwKKyAqIHNpbmNlIGFjdHVhbGx5IGNvbXB1dGluZyB0aGUgb3B0aW1hbCBzY2hlZHVsaW5nIGlzIE5QIGNvbXBsZXRlLgorICogV2hhdCB3ZSBkbyBpcyB0cmFjayBhICJjdXJyZW50IGNsb2NrIi4gIFdoZW4gd2Ugc2NoZWR1bGUgYSBub2RlLCB3ZQorICogdXBkYXRlIHRoZSBlYXJsaWVzdC11bmJsb2NrZWQgY2xvY2sgdGltZSBvZiBpdHMgY2hpbGRyZW4sIGFuZAorICogaW5jcmVtZW50IHRoZSBjbG9jay4gIFRoZW4sIHdoZW4gdHJ5aW5nIHRvIHNjaGVkdWxlLCB3ZSBqdXN0IHBpY2sKKyAqIHRoZSBlYXJsaWVzdC11bmJsb2NrZWQgaW5zdHJ1Y3Rpb24gdG8gc2NoZWR1bGUuCisgKgorICogTm90ZSB0aGF0IG9mdGVuIHRoZXJlIHdpbGwgYmUgbWFueSB0aGluZ3Mgd2hpY2ggY291bGQgZXhlY3V0ZQorICogaW1tZWRpYXRlbHksIGFuZCB0aGVyZSBhcmUgYSByYW5nZSBvZiBoZXVyaXN0aWMgb3B0aW9ucyB0byBjaG9vc2UKKyAqIGZyb20gaW4gcGlja2luZyBhbW9uZyB0aG9zZS4KKyAqLworCitzdGF0aWMgY29uc3QgYm9vbCBkZWJ1ZyA9IGZhbHNlOworc3RhdGljIGNvbnN0IGJvb2wgZGV0YWlsX2RlYnVnID0gZmFsc2U7CisjZGVmaW5lIFVTRV9HUkFQSFZJWiAwCisKK2NsYXNzIGluc3RydWN0aW9uX3NjaGVkdWxlcjsKKworbmFtZXNwYWNlIHsKKyAgIGJvb2wgdXNlX2lwcyhpbnQgbW9kZSkKKyAgIHsKKyAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX1REX0hJOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX1REX0xPOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0xJTUlUOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0xPOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01MOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01EOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01IOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0hJOgorICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCisgICBib29sIHVzZV9idShpbnQgbW9kZSkKKyAgIHsKKyAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0xJTUlUOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0xPOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01MOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01EOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01IOgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0hJOgorICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCisgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBjbGFtcDAxKFQgdikgeyByZXR1cm4gc3RkOjptYXgoc3RkOjptaW4odiwgVCgxKSksIFQoLTEuMCkpOyB9CisgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBsZXJwKFQgeCwgVCB5LCBUIGEpIHsgcmV0dXJuIHggKiAoVCgxKSAtIGEpICsgeSAqIGE7IH0KKworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKworY2xhc3Mgc2NoZWR1bGVfbm9kZSA6IHB1YmxpYyBleGVjX25vZGUKK3sKK3B1YmxpYzoKKyAgIHNjaGVkdWxlX25vZGUoYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCwgaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyICpzY2hlZCk7CisgICB2b2lkIHNldF9sYXRlbmN5X2dlbjQoKTsKKyAgIHZvaWQgc2V0X2xhdGVuY3lfZ2VuNyhib29sIGlzX2hhc3dlbGwpOworCisgICBiYWNrZW5kX2luc3RydWN0aW9uICppbnN0OworICAgc2NoZWR1bGVfbm9kZSAqKmNoaWxkcmVuOworICAgaW50ICpjaGlsZF9sYXRlbmN5OworICAgaW50ICpjaGlsZF9wbGF0ZW5jeTsKKyAgIGludCBjaGlsZF9jb3VudDsKKyAgIGludCBwYXJlbnRfY291bnQ7CisgICBpbnQgY2hpbGRfYXJyYXlfc2l6ZTsKKyAgIGludCB1bmJsb2NrZWRfdGltZTsKKyAgIGludCB1bmJsb2NrZWRfcHRpbWU7CisgICBpbnQgbGF0ZW5jeTsKKyAgIGludCBwbGF0ZW5jeTsJLy8gUGh5c2ljYWwgbGF0ZW5jeQorICAgYm9vbCBjcml0aWNhbF9wYXRoOworCisgICAvKioKKyAgICAqIFdoaWNoIGl0ZXJhdGlvbiBvZiBwdXNoaW5nIGdyb3VwcyBvZiBjaGlsZHJlbiBvbnRvIHRoZSBjYW5kaWRhdGVzIGxpc3QKKyAgICAqIHRoaXMgbm9kZSB3YXMgYSBwYXJ0IG9mLgorICAgICovCisgICB1bnNpZ25lZCBjYW5kX2dlbmVyYXRpb247CisKKyAgIC8qKgorICAgICogVGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBpbnN0cnVjdGlvbidzIGxhdGVuY3kgcGx1cyB0aGUgbWF4aW11bSBkZWxheSBvZgorICAgICogaXRzIGNoaWxkcmVuLCBvciBqdXN0IHRoZSBpc3N1ZV90aW1lIGlmIGl0J3MgYSBsZWFmIG5vZGUuCisgICAgKi8KKyAgIGludCBkZWxheTsKK307CisKK3ZvaWQKK3NjaGVkdWxlX25vZGU6OnNldF9sYXRlbmN5X2dlbjQoKQoreworICAgaW50IGNoYW5zID0gODsKKyAgIGludCBtYXRoX2xhdGVuY3kgPSAyMjsKKworICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9SQ1A6CisgICAgICB0aGlzLT5sYXRlbmN5ID0gMSAqIGNoYW5zICogbWF0aF9sYXRlbmN5OworICAgICAgYnJlYWs7CisgICBjYXNlIFNIQURFUl9PUENPREVfUlNROgorICAgICAgdGhpcy0+bGF0ZW5jeSA9IDIgKiBjaGFucyAqIG1hdGhfbGF0ZW5jeTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9RVU9USUVOVDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TUVJUOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0xPRzI6CisgICAgICAvKiBmdWxsIHByZWNpc2lvbiBsb2cuICBwYXJ0aWFsIGlzIDIuICovCisgICAgICB0aGlzLT5sYXRlbmN5ID0gMyAqIGNoYW5zICogbWF0aF9sYXRlbmN5OworICAgICAgYnJlYWs7CisgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1JFTUFJTkRFUjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9FWFAyOgorICAgICAgLyogZnVsbCBwcmVjaXNpb24uICBwYXJ0aWFsIGlzIDMsIHNhbWUgdGhyb3VnaHB1dC4gKi8KKyAgICAgIHRoaXMtPmxhdGVuY3kgPSA0ICogY2hhbnMgKiBtYXRoX2xhdGVuY3k7CisgICAgICBicmVhazsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9QT1c6CisgICAgICB0aGlzLT5sYXRlbmN5ID0gOCAqIGNoYW5zICogbWF0aF9sYXRlbmN5OworICAgICAgYnJlYWs7CisgICBjYXNlIFNIQURFUl9PUENPREVfU0lOOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0NPUzoKKyAgICAgIC8qIG1pbmltdW0gbGF0ZW5jeSwgbWF4IGlzIDEyIHJvdW5kcy4gKi8KKyAgICAgIHRoaXMtPmxhdGVuY3kgPSA1ICogY2hhbnMgKiBtYXRoX2xhdGVuY3k7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICB0aGlzLT5sYXRlbmN5ID0gMjsKKyAgICAgIGJyZWFrOworICAgfQorICAgdGhpcy0+cGxhdGVuY3kgPSB0aGlzLT5sYXRlbmN5OworfQorCit2b2lkCitzY2hlZHVsZV9ub2RlOjpzZXRfbGF0ZW5jeV9nZW43KGJvb2wgaXNfaGFzd2VsbCkKK3sKKyAgIHN3aXRjaCAoaW5zdC0+b3Bjb2RlKSB7CisgICBjYXNlIEJSV19PUENPREVfTUFEOgorICAgICAgLyogMiBjeWNsZXMKKyAgICAgICAqICAoc2luY2UgdGhlIGxhc3QgdHdvIHNyYyBvcGVyYW5kcyBhcmUgaW4gZGlmZmVyZW50IHJlZ2lzdGVyIGJhbmtzKToKKyAgICAgICAqIG1hZCg4KSBnNDwxPkYgZzIuMjw0LDQsMT5GLnggIGcyPDQsNCwxPkYueCBnMy4xPDQsNCwxPkYueCB7IGFsaWduMTYgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKgorICAgICAgICogMyBjeWNsZXMgb24gSVZCLCA0IG9uIEhTVworICAgICAgICogIChzaW5jZSB0aGUgbGFzdCB0d28gc3JjIG9wZXJhbmRzIGFyZSBpbiB0aGUgc2FtZSByZWdpc3RlciBiYW5rKToKKyAgICAgICAqIG1hZCg4KSBnNDwxPkYgZzIuMjw0LDQsMT5GLnggIGcyPDQsNCwxPkYueCBnMi4xPDQsNCwxPkYueCB7IGFsaWduMTYgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKgorICAgICAgICogMTggY3ljbGVzIG9uIElWQiwgMTYgb24gSFNXCisgICAgICAgKiAgKHNpbmNlIHRoZSBsYXN0IHR3byBzcmMgb3BlcmFuZHMgYXJlIGluIGRpZmZlcmVudCByZWdpc3RlciBiYW5rcyk6CisgICAgICAgKiBtYWQoOCkgZzQ8MT5GIGcyLjI8NCw0LDE+Ri54ICBnMjw0LDQsMT5GLnggZzMuMTw0LDQsMT5GLnggeyBhbGlnbjE2IFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpIG51bGwgICBnNDw0LDUsMT5GICAgICAgICAgICAgICAgICAgICAgeyBhbGlnbjE2IFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIDIwIGN5Y2xlcyBvbiBJVkIsIDE4IG9uIEhTVworICAgICAgICogIChzaW5jZSB0aGUgbGFzdCB0d28gc3JjIG9wZXJhbmRzIGFyZSBpbiB0aGUgc2FtZSByZWdpc3RlciBiYW5rKToKKyAgICAgICAqIG1hZCg4KSBnNDwxPkYgZzIuMjw0LDQsMT5GLnggIGcyPDQsNCwxPkYueCBnMi4xPDQsNCwxPkYueCB7IGFsaWduMTYgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKiBtb3YoOCkgbnVsbCAgIGc0PDQsNCwxPkYgICAgICAgICAgICAgICAgICAgICB7IGFsaWduMTYgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKi8KKworICAgICAgLyogT3VyIHJlZ2lzdGVyIGFsbG9jYXRvciBkb2Vzbid0IGtub3cgYWJvdXQgcmVnaXN0ZXIgYmFua3MsIHNvIHVzZSB0aGUKKyAgICAgICAqIGhpZ2hlciBsYXRlbmN5LgorICAgICAgICovCisgICAgICBsYXRlbmN5ID0gaXNfaGFzd2VsbCA/IDE2IDogMTg7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0xSUDoKKyAgICAgIC8qIDIgY3ljbGVzCisgICAgICAgKiAgKHNpbmNlIHRoZSBsYXN0IHR3byBzcmMgb3BlcmFuZHMgYXJlIGluIGRpZmZlcmVudCByZWdpc3RlciBiYW5rcyk6CisgICAgICAgKiBscnAoOCkgZzQ8MT5GIGcyLjI8NCw0LDE+Ri54ICBnMjw0LDQsMT5GLnggZzMuMTw0LDQsMT5GLnggeyBhbGlnbjE2IFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIDMgY3ljbGVzIG9uIElWQiwgNCBvbiBIU1cKKyAgICAgICAqICAoc2luY2UgdGhlIGxhc3QgdHdvIHNyYyBvcGVyYW5kcyBhcmUgaW4gdGhlIHNhbWUgcmVnaXN0ZXIgYmFuayk6CisgICAgICAgKiBscnAoOCkgZzQ8MT5GIGcyLjI8NCw0LDE+Ri54ICBnMjw0LDQsMT5GLnggZzIuMTw0LDQsMT5GLnggeyBhbGlnbjE2IFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIDE2IGN5Y2xlcyBvbiBJVkIsIDE0IG9uIEhTVworICAgICAgICogIChzaW5jZSB0aGUgbGFzdCB0d28gc3JjIG9wZXJhbmRzIGFyZSBpbiBkaWZmZXJlbnQgcmVnaXN0ZXIgYmFua3MpOgorICAgICAgICogbHJwKDgpIGc0PDE+RiBnMi4yPDQsNCwxPkYueCAgZzI8NCw0LDE+Ri54IGczLjE8NCw0LDE+Ri54IHsgYWxpZ24xNiBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIG1vdig4KSBudWxsICAgZzQ8NCw0LDE+RiAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xNiBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqCisgICAgICAgKiAxNiBjeWNsZXMKKyAgICAgICAqICAoc2luY2UgdGhlIGxhc3QgdHdvIHNyYyBvcGVyYW5kcyBhcmUgaW4gdGhlIHNhbWUgcmVnaXN0ZXIgYmFuayk6CisgICAgICAgKiBscnAoOCkgZzQ8MT5GIGcyLjI8NCw0LDE+Ri54ICBnMjw0LDQsMT5GLnggZzIuMTw0LDQsMT5GLnggeyBhbGlnbjE2IFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpIG51bGwgICBnNDw0LDQsMT5GICAgICAgICAgICAgICAgICAgICAgeyBhbGlnbjE2IFdFX25vcm1hbCAxUSB9OworICAgICAgICovCisKKyAgICAgIC8qIE91ciByZWdpc3RlciBhbGxvY2F0b3IgZG9lc24ndCBrbm93IGFib3V0IHJlZ2lzdGVyIGJhbmtzLCBzbyB1c2UgdGhlCisgICAgICAgKiBoaWdoZXIgbGF0ZW5jeS4KKyAgICAgICAqLworICAgICAgbGF0ZW5jeSA9IDE0OworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9SQ1A6CisgICBjYXNlIFNIQURFUl9PUENPREVfUlNROgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1NRUlQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfTE9HMjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9FWFAyOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1NJTjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9DT1M6CisgICAgICAvKiAyIGN5Y2xlczoKKyAgICAgICAqIG1hdGggaW52KDgpIGc0PDE+RiBnMjwwLDEsMD5GICAgICAgbnVsbCAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqCisgICAgICAgKiAxOCBjeWNsZXM6CisgICAgICAgKiBtYXRoIGludig4KSBnNDwxPkYgZzI8MCwxLDA+RiAgICAgIG51bGwgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKiBtb3YoOCkgICAgICBudWxsICAgZzQ8OCw4LDE+RiAgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKgorICAgICAgICogU2FtZSBmb3IgZXhwMiwgbG9nMiwgcnNxLCBzcXJ0LCBzaW4sIGNvcy4KKyAgICAgICAqLworICAgICAgbGF0ZW5jeSA9IGlzX2hhc3dlbGwgPyAxNCA6IDE2OworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9QT1c6CisgICAgICAvKiAyIGN5Y2xlczoKKyAgICAgICAqIG1hdGggcG93KDgpIGc0PDE+RiBnMjwwLDEsMD5GICAgZzIuMTwwLDEsMD5GICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqCisgICAgICAgKiAyNiBjeWNsZXM6CisgICAgICAgKiBtYXRoIHBvdyg4KSBnNDwxPkYgZzI8MCwxLDA+RiAgIGcyLjE8MCwxLDA+RiAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKiBtb3YoOCkgICAgICBudWxsICAgZzQ8OCw4LDE+RiAgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKi8KKyAgICAgIGxhdGVuY3kgPSBpc19oYXN3ZWxsID8gMjIgOiAyNDsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfVEVYOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEY6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhMOgorICAgICAgLyogMTggY3ljbGVzOgorICAgICAgICogbW92KDgpICBnMTE1PDE+RiAgIDBGICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpICBnMTE0PDE+RiAgIDBGICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogc2VuZCg4KSBnNDwxPlVXICAgIGcxMTQ8OCw4LDE+RgorICAgICAgICogICBzYW1wbGVyICgxMCwgMCwgMCwgMSkgbWxlbiAyIHJsZW4gNCAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIDY5NyArLy00OSBjeWNsZXMgKG1pbiA2MTAsIG49MjYpOgorICAgICAgICogbW92KDgpICBnMTE1PDE+RiAgIDBGICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpICBnMTE0PDE+RiAgIDBGICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogc2VuZCg4KSBnNDwxPlVXICAgIGcxMTQ8OCw4LDE+RgorICAgICAgICogICBzYW1wbGVyICgxMCwgMCwgMCwgMSkgbWxlbiAyIHJsZW4gNCAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpICBudWxsICAgICAgIGc0PDgsOCwxPkYgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIFNvIHRoZSBsYXRlbmN5IG9uIG91ciBmaXJzdCB0ZXh0dXJlIGxvYWQgb2YgdGhlIGJhdGNoYnVmZmVyIHRha2VzCisgICAgICAgKiB+NzAwIGN5Y2xlcywgc2luY2UgdGhlIGNhY2hlcyBhcmUgY29sZCBhdCB0aGF0IHBvaW50LgorICAgICAgICoKKyAgICAgICAqIDg0MCArLy0gOTIgY3ljbGVzIChtaW4gNzIwLCBuPTI1KToKKyAgICAgICAqIG1vdig4KSAgZzExNTwxPkYgICAwRiAgICAgICAgICAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIG1vdig4KSAgZzExNDwxPkYgICAwRiAgICAgICAgICAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIHNlbmQoOCkgZzQ8MT5VVyAgICBnMTE0PDgsOCwxPkYKKyAgICAgICAqICAgc2FtcGxlciAoMTAsIDAsIDAsIDEpIG1sZW4gMiBybGVuIDQgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIG1vdig4KSAgbnVsbCAgICAgICBnNDw4LDgsMT5GICAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIHNlbmQoOCkgZzQ8MT5VVyAgICBnMTE0PDgsOCwxPkYKKyAgICAgICAqICAgc2FtcGxlciAoMTAsIDAsIDAsIDEpIG1sZW4gMiBybGVuIDQgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIG1vdig4KSAgbnVsbCAgICAgICBnNDw4LDgsMT5GICAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqCisgICAgICAgKiBPbiB0aGUgc2Vjb25kIGxvYWQsIGl0IHRha2VzIGp1c3QgYW4gZXh0cmEgfjE0MCBjeWNsZXMsIGFuZCBhZnRlcgorICAgICAgICogYWNjb3VudGluZyBmb3IgdGhlIDE0IGN5Y2xlcyBvZiB0aGUgTU9WJ3MgbGF0ZW5jeSwgdGhhdCBtYWtlcyB+MTMwLgorICAgICAgICoKKyAgICAgICAqIDY4MyArLy0gNDkgY3ljbGVzIChtaW4gPSA2MDIsIG49NDcpOgorICAgICAgICogbW92KDgpICBnMTE1PDE+RiAgIDBGICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpICBnMTE0PDE+RiAgIDBGICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogc2VuZCg4KSBnNDwxPlVXICAgIGcxMTQ8OCw4LDE+RgorICAgICAgICogICBzYW1wbGVyICgxMCwgMCwgMCwgMSkgbWxlbiAyIHJsZW4gNCAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogc2VuZCg4KSBnNTA8MT5VVyAgIGcxMTQ8OCw4LDE+RgorICAgICAgICogICBzYW1wbGVyICgxMCwgMCwgMCwgMSkgbWxlbiAyIHJsZW4gNCAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpICBudWxsICAgICAgIGc0PDgsOCwxPkYgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIFRoZSB1bml0IGFwcGVhcnMgdG8gYmUgcGlwZWxpbmVkLCBzaW5jZSB0aGlzIG1hdGNoZXMgdXAgd2l0aCB0aGUKKyAgICAgICAqIGNhY2hlLWNvbGQgY2FzZSwgZGVzcGl0ZSB0aGVyZSBiZWluZyB0d28gbG9hZHMgaGVyZS4gIElmIHlvdSByZXBsYWNlCisgICAgICAgKiB0aGUgZzQgaW4gdGhlIE1PViB0byBudWxsIHdpdGggZzUwLCBpdCdzIHN0aWxsIDY5MyArLy0gNTIgKG49MzkpLgorICAgICAgICoKKyAgICAgICAqIFNvLCB0YWtlIHNvbWUgbnVtYmVyIGJldHdlZW4gdGhlIGNhY2hlLWhvdCAxNDAgY3ljbGVzIGFuZCB0aGUKKyAgICAgICAqIGNhY2hlLWNvbGQgNzAwIGN5Y2xlcy4gIE5vIHBhcnRpY3VsYXIgdHVuaW5nIHdhcyBkb25lIG9uIHRoaXMuCisgICAgICAgKgorICAgICAgICogSSBoYXZlbid0IGRvbmUgc2lnbmlmaWNhbnQgdGVzdGluZyBvZiB0aGUgbm9uLVRFWCBvcGNvZGVzLiAgVFhMIGF0CisgICAgICAgKiBsZWFzdCBsb29rZWQgYWJvdXQgdGhlIHNhbWUgYXMgVEVYLgorICAgICAgICovCisgICAgICBsYXRlbmN5ID0gMjAwOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWFM6CisgICAgICAvKiBUZXN0aW5nIHRleHR1cmVTaXplKHNhbXBsZXIyRCwgMCksIG9uZSBsb2FkIHdhcyA0MjAgKy8tIDQxCisgICAgICAgKiBjeWNsZXMgKG49MTUpOgorICAgICAgICogbW92KDgpICAgZzExNDwxPlVEICAwRCAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogc2VuZCg4KSAgZzY8MT5VVyAgICBnMTE0PDgsOCwxPkYKKyAgICAgICAqICAgc2FtcGxlciAoMTAsIDAsIDEwLCAxKSBtbGVuIDEgcmxlbiA0ICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIG1vdigxNikgIGc2PDE+RiAgICAgZzY8OCw4LDE+RCAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqCisgICAgICAgKgorICAgICAgICogVHdvIGxvYWRzIHdhcyA1MzUgKy8tIDMwIGN5Y2xlcyAobj0xOSk6CisgICAgICAgKiBtb3YoMTYpICAgZzExNDwxPlVEICAwRCAgICAgICAgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFIIH07CisgICAgICAgKiBzZW5kKDE2KSAgZzY8MT5VVyAgICBnMTE0PDgsOCwxPkYKKyAgICAgICAqICAgc2FtcGxlciAoMTAsIDAsIDEwLCAyKSBtbGVuIDIgcmxlbiA4ICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMUggfTsKKyAgICAgICAqIG1vdigxNikgICBnMTE0PDE+VUQgIDBEICAgICAgICAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMUggfTsKKyAgICAgICAqIG1vdigxNikgICBnNjwxPkYgICAgIGc2PDgsOCwxPkQgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMUggfTsKKyAgICAgICAqIHNlbmQoMTYpICBnODwxPlVXICAgIGcxMTQ8OCw4LDE+RgorICAgICAgICogICBzYW1wbGVyICgxMCwgMCwgMTAsIDIpIG1sZW4gMiBybGVuIDggICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxSCB9OworICAgICAgICogbW92KDE2KSAgIGc4PDE+RiAgICAgZzg8OCw4LDE+RCAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxSCB9OworICAgICAgICogYWRkKDE2KSAgIGc2PDE+RiAgICAgZzY8OCw4LDE+RiAgIGc4PDgsOCwxPkYgIHsgYWxpZ24xIFdFX25vcm1hbCAxSCB9OworICAgICAgICoKKyAgICAgICAqIFNpbmNlIHRoZSBvbmx5IGNhY2hlcyB0aGF0IHNob3VsZCBtYXR0ZXIgYXJlIGp1c3QgdGhlCisgICAgICAgKiBpbnN0cnVjdGlvbi9zdGF0ZSBjYWNoZSBjb250YWluaW5nIHRoZSBzdXJmYWNlIHN0YXRlLCBhc3N1bWUgdGhhdCB3ZQorICAgICAgICogYWx3YXlzIGhhdmUgaG90IGNhY2hlcy4KKyAgICAgICAqLworICAgICAgbGF0ZW5jeSA9IDEwMDsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEZTX09QQ09ERV9WQVJZSU5HX1BVTExfQ09OU1RBTlRfTE9BRDoKKyAgIGNhc2UgRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FEOgorICAgY2FzZSBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEOgorICAgICAgLyogdGVzdGluZyB1c2luZyB2YXJ5aW5nLWluZGV4IHB1bGwgY29uc3RhbnRzOgorICAgICAgICoKKyAgICAgICAqIDE2IGN5Y2xlczoKKyAgICAgICAqIG1vdig4KSAgZzQ8MT5EICBnMi4xPDAsMSwwPkYgICAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIHNlbmQoOCkgZzQ8MT5GICBnNDw4LDgsMT5ECisgICAgICAgKiAgIGRhdGEgKDksIDIsIDMpIG1sZW4gMSBybGVuIDEgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKgorICAgICAgICogfjQ4MCBjeWNsZXM6CisgICAgICAgKiBtb3YoOCkgIGc0PDE+RCAgZzIuMTwwLDEsMD5GICAgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKiBzZW5kKDgpIGc0PDE+RiAgZzQ8OCw4LDE+RAorICAgICAgICogICBkYXRhICg5LCAyLCAzKSBtbGVuIDEgcmxlbiAxICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogbW92KDgpICBudWxsICAgIGc0PDgsOCwxPkYgICAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIH42MjAgY3ljbGVzOgorICAgICAgICogbW92KDgpICBnNDwxPkQgIGcyLjE8MCwxLDA+RiAgICAgICAgICAgICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogc2VuZCg4KSBnNDwxPkYgIGc0PDgsOCwxPkQKKyAgICAgICAqICAgZGF0YSAoOSwgMiwgMykgbWxlbiAxIHJsZW4gMSAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIG1vdig4KSAgbnVsbCAgICBnNDw4LDgsMT5GICAgICAgICAgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIHNlbmQoOCkgZzQ8MT5GICBnNDw4LDgsMT5ECisgICAgICAgKiAgIGRhdGEgKDksIDIsIDMpIG1sZW4gMSBybGVuIDEgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKiBtb3YoOCkgIG51bGwgICAgZzQ8OCw4LDE+RiAgICAgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKgorICAgICAgICogU28sIGlmIGl0J3MgY2FjaGUtaG90LCBpdCdzIGFib3V0IDE0MC4gIElmIGl0J3MgY2FjaGUgY29sZCwgaXQncworICAgICAgICogYWJvdXQgNDYwLiAgV2UgZXhwZWN0IHRvIG1vc3RseSBiZSBjYWNoZSBob3QsIHNvIHBpY2sgc29tZXRoaW5nIG1vcmUKKyAgICAgICAqIGluIHRoYXQgZGlyZWN0aW9uLgorICAgICAgICovCisgICAgICBsYXRlbmN5ID0gMjAwOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9HRU43X1NDUkFUQ0hfUkVBRDoKKyAgICAgIC8qIFRlc3RpbmcgYSBsb2FkIGZyb20gb2Zmc2V0IDAsIHRoYXQgaGFkIGJlZW4gcHJldmlvdXNseSB3cml0dGVuOgorICAgICAgICoKKyAgICAgICAqIHNlbmQoOCkgZzExNDwxPlVXIGcwPDgsOCwxPkYgZGF0YSAoMCwgMCwgMCkgbWxlbiAxIHJsZW4gMSB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqIG1vdig4KSAgbnVsbCAgICAgIGcxMTQ8OCw4LDE+RiB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqCisgICAgICAgKiBUaGUgY3ljbGVzIHNwZW50IHNlZW1lZCB0byBiZSBncm91cGVkIGFyb3VuZCA0MC01MCAoYXMgbG93IGFzIDM4KSwKKyAgICAgICAqIHRoZW4gYXJvdW5kIDE0MC4gIFByZXN1bWFibHkgdGhpcyBpcyBjYWNoZSBoaXQgdnMgbWlzcy4KKyAgICAgICAqLworICAgICAgbGF0ZW5jeSA9IDUwOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9VTlRZUEVEX0FUT01JQzoKKyAgICAgIC8qIFRlc3QgY29kZToKKyAgICAgICAqICAgbW92KDgpICAgIGcxMTI8MT51ZCAgICAgICAweDAwMDAwMDAwdWQgICAgICAgeyBhbGlnbjEgV0VfYWxsIDFRIH07CisgICAgICAgKiAgIG1vdigxKSAgICBnMTEyLjc8MT51ZCAgICAgZzEuNzwwLDEsMD51ZCAgICAgIHsgYWxpZ24xIFdFX2FsbCB9OworICAgICAgICogICBtb3YoOCkgICAgZzExMzwxPnVkICAgICAgIDB4MDAwMDAwMDB1ZCAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqICAgc2VuZCg4KSAgIGc0PDE+dWQgICAgICAgICBnMTEyPDgsOCwxPnVkCisgICAgICAgKiAgICAgICAgICAgICBkYXRhICgzOCwgNSwgNikgbWxlbiAyIHJsZW4gMSAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICoKKyAgICAgICAqIFJ1bm5pbmcgaXQgMTAwIHRpbWVzIGFzIGZyYWdtZW50IHNoYWRlciBvbiBhIDEyOHgxMjggcXVhZAorICAgICAgICogZ2l2ZXMgYW4gYXZlcmFnZSBsYXRlbmN5IG9mIDEzODY3IGN5Y2xlcyBwZXIgYXRvbWljIG9wLAorICAgICAgICogc3RhbmRhcmQgZGV2aWF0aW9uIDMlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYSByYXRoZXIKKyAgICAgICAqIHBlc3NpbWlzdGljIGVzdGltYXRlLCB0aGUgYWN0dWFsIGxhdGVuY3kgaW4gY2FzZXMgd2l0aCBmZXcKKyAgICAgICAqIGNvbGxpc2lvbnMgYmV0d2VlbiB0aHJlYWRzIGFuZCBmYXZvcmFibGUgcGlwZWxpbmluZyBoYXMgYmVlbgorICAgICAgICogc2VlbiB0byBiZSByZWR1Y2VkIGJ5IGEgZmFjdG9yIG9mIDEwMC4KKyAgICAgICAqLworICAgICAgbGF0ZW5jeSA9IDE0MDAwOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9VTlRZUEVEX1NVUkZBQ0VfUkVBRDoKKyAgICAgIC8qIFRlc3QgY29kZToKKyAgICAgICAqICAgbW92KDgpICAgIGcxMTI8MT5VRCAgICAgICAweDAwMDAwMDAwVUQgICAgICAgeyBhbGlnbjEgV0VfYWxsIDFRIH07CisgICAgICAgKiAgIG1vdigxKSAgICBnMTEyLjc8MT5VRCAgICAgZzEuNzwwLDEsMD5VRCAgICAgIHsgYWxpZ24xIFdFX2FsbCB9OworICAgICAgICogICBtb3YoOCkgICAgZzExMzwxPlVEICAgICAgIDB4MDAwMDAwMDBVRCAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqICAgc2VuZCg4KSAgIGc0PDE+VUQgICAgICAgICBnMTEyPDgsOCwxPlVECisgICAgICAgKiAgICAgICAgICAgICBkYXRhICgzOCwgNiwgNSkgbWxlbiAyIHJsZW4gMSAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogICAuCisgICAgICAgKiAgIC4gW3JlcGVhdHMgOCB0aW1lc10KKyAgICAgICAqICAgLgorICAgICAgICogICBtb3YoOCkgICAgZzExMjwxPlVEICAgICAgIDB4MDAwMDAwMDBVRCAgICAgICB7IGFsaWduMSBXRV9hbGwgMVEgfTsKKyAgICAgICAqICAgbW92KDEpICAgIGcxMTIuNzwxPlVEICAgICBnMS43PDAsMSwwPlVEICAgICAgeyBhbGlnbjEgV0VfYWxsIH07CisgICAgICAgKiAgIG1vdig4KSAgICBnMTEzPDE+VUQgICAgICAgMHgwMDAwMDAwMFVEICAgICAgIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9OworICAgICAgICogICBzZW5kKDgpICAgZzQ8MT5VRCAgICAgICAgIGcxMTI8OCw4LDE+VUQKKyAgICAgICAqICAgICAgICAgICAgIGRhdGEgKDM4LCA2LCA1KSBtbGVuIDIgcmxlbiAxICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKgorICAgICAgICogUnVubmluZyBpdCAxMDAgdGltZXMgYXMgZnJhZ21lbnQgc2hhZGVyIG9uIGEgMTI4eDEyOCBxdWFkCisgICAgICAgKiBnaXZlcyBhbiBhdmVyYWdlIGxhdGVuY3kgb2YgNTgzIGN5Y2xlcyBwZXIgc3VyZmFjZSByZWFkLAorICAgICAgICogc3RhbmRhcmQgZGV2aWF0aW9uIDAuOSUuCisgICAgICAgKi8KKyAgICAgIGxhdGVuY3kgPSBpc19oYXN3ZWxsID8gMzAwIDogNjAwOworICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICAvKiAyIGN5Y2xlczoKKyAgICAgICAqIG11bCg4KSBnNDwxPkYgZzI8MCwxLDA+RiAgICAgIDAuNUYgICAgICAgICAgICB7IGFsaWduMSBXRV9ub3JtYWwgMVEgfTsKKyAgICAgICAqCisgICAgICAgKiAxNiBjeWNsZXM6CisgICAgICAgKiBtdWwoOCkgZzQ8MT5GIGcyPDAsMSwwPkYgICAgICAwLjVGICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKiBtb3YoOCkgbnVsbCAgIGc0PDgsOCwxPkYgICAgICAgICAgICAgICAgICAgICAgeyBhbGlnbjEgV0Vfbm9ybWFsIDFRIH07CisgICAgICAgKi8KKyAgICAgIGxhdGVuY3kgPSAxNDsKKyAgICAgIGJyZWFrOworICAgfQorICAgcGxhdGVuY3kgPSBsYXRlbmN5OworfQorCitjbGFzcyBpbnN0cnVjdGlvbl9zY2hlZHVsZXIgeworcHVibGljOgorICAgaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyKGJhY2tlbmRfdmlzaXRvciAqdiwgaW50IGdyZl9jb3VudCwgaW50IGFsbG9jYXRhYmxlX2dyZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyX21vZGUgbW9kZSkKKyAgIHsKKyAgICAgIHRoaXMtPmJ2ID0gdjsKKyAgICAgIHRoaXMtPm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgICAgIHRoaXMtPmdyZl9jb3VudCA9IGdyZl9jb3VudDsKKyAgICAgIHRoaXMtPmFsbG9jYXRhYmxlX2dyZnMgPSBhbGxvY2F0YWJsZV9ncmZzOworICAgICAgdGhpcy0+aW5zdHJ1Y3Rpb25zLm1ha2VfZW1wdHkoKTsKKyAgICAgIHRoaXMtPmluc3RydWN0aW9uc190b19zY2hlZHVsZSA9IDA7CisgICAgICB0aGlzLT5wb3N0X3JlZ19hbGxvYyA9IChtb2RlID09IFNDSEVEVUxFX1BPU1QpOworICAgICAgdGhpcy0+bW9kZSA9IG1vZGU7CisgICAgICB0aGlzLT50aW1lID0gMDsKKyAgICAgIHRoaXMtPnB0aW1lID0gMDsKKyAgICAgIHRoaXMtPnByZXZpb3VzX2Nob3NlbiA9IE5VTEw7CisgICAgICB0aGlzLT5ibG9ja19udW0gPSAwOworCisgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgIGNhc2UgU0NIRURVTEVfUFJFX0lQU19URF9ISTogICAgdGhpcy0+cHJlc3N1cmVfcGFuaWNfdGhyZXNob2xkID0gMC45MGY7IGJyZWFrOworICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX1REX0xPOiAgICB0aGlzLT5wcmVzc3VyZV9wYW5pY190aHJlc2hvbGQgPSAwLjUwZjsgYnJlYWs7CisgICAgICBjYXNlIFNDSEVEVUxFX1BSRV9JUFNfQlVfSEk6ICAgIHRoaXMtPnByZXNzdXJlX3BhbmljX3RocmVzaG9sZCA9IDAuOTBmOyBicmVhazsKKyAgICAgIGNhc2UgU0NIRURVTEVfUFJFX0lQU19CVV9NSDogICAgdGhpcy0+cHJlc3N1cmVfcGFuaWNfdGhyZXNob2xkID0gMC43NWY7IGJyZWFrOworICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01EOiAgICB0aGlzLT5wcmVzc3VyZV9wYW5pY190aHJlc2hvbGQgPSAwLjY1ZjsgYnJlYWs7CisgICAgICBjYXNlIFNDSEVEVUxFX1BSRV9JUFNfQlVfTUw6ICAgIHRoaXMtPnByZXNzdXJlX3BhbmljX3RocmVzaG9sZCA9IDAuNTVmOyBicmVhazsKKyAgICAgIGNhc2UgU0NIRURVTEVfUFJFX0lQU19CVV9MTzogICAgdGhpcy0+cHJlc3N1cmVfcGFuaWNfdGhyZXNob2xkID0gMC40NWY7IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHRoaXMtPnByZXNzdXJlX3BhbmljX3RocmVzaG9sZCA9IDAuNmY7CisgICAgICB9CisKKyAgICAgIGlmICghcG9zdF9yZWdfYWxsb2MpIHsKKyAgICAgICAgIHRoaXMtPnJlbWFpbmluZ19ncmZfdXNlcyA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgaW50LCBncmZfY291bnQpOworICAgICAgICAgdGhpcy0+Z3JmX2FjdGl2ZSA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgYm9vbCwgZ3JmX2NvdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICB0aGlzLT5yZW1haW5pbmdfZ3JmX3VzZXMgPSBOVUxMOworICAgICAgICAgdGhpcy0+Z3JmX2FjdGl2ZSA9IE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIH5pbnN0cnVjdGlvbl9zY2hlZHVsZXIoKQorICAgeworICAgICAgcmFsbG9jX2ZyZWUodGhpcy0+bWVtX2N0eCk7CisgICB9CisgICB2b2lkIGFkZF9iYXJyaWVyX2RlcHMoYm9vbCBidSwgc2NoZWR1bGVfbm9kZSAqbik7CisgICB2b2lkIGFkZF9kZXAoYm9vbCBidSwgc2NoZWR1bGVfbm9kZSAqYmVmb3JlLCBzY2hlZHVsZV9ub2RlICphZnRlciwgaW50IGxhdGVuY3ksIGludCBwbGF0ZW5jeSk7CisgICB2b2lkIGFkZF9kZXAoYm9vbCBidSwgc2NoZWR1bGVfbm9kZSAqYmVmb3JlLCBzY2hlZHVsZV9ub2RlICphZnRlcik7CisKKyAgIHZvaWQgcnVuX3RkKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKKyAgIHZvaWQgcnVuX2J1KGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKKyAgIHZvaWQgYWRkX2luc3QoYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCk7CisgICB2b2lkIGNvbXB1dGVfZGVsYXkoc2NoZWR1bGVfbm9kZSAqbm9kZSk7CisjaWYgVVNFX0dSQVBIVklaCisgICB2b2lkIGZpbmRfY3JpdGljYWxfcGF0aChzY2hlZHVsZV9ub2RlICpub2RlKTsKKyNlbmRpZiAvLyBVU0VfR1JBUEhWSVoKKyAgIHZpcnR1YWwgdm9pZCBjYWxjdWxhdGVfZGVwcyhib29sIGJ1KSA9IDA7CisgICB2aXJ0dWFsIHNjaGVkdWxlX25vZGUgKmNob29zZV9pbnN0cnVjdGlvbl90b19zY2hlZHVsZV90ZCgpID0gMDsKKyAgIHZpcnR1YWwgc2NoZWR1bGVfbm9kZSAqY2hvb3NlX2luc3RydWN0aW9uX3RvX3NjaGVkdWxlX2J1KCkgPSAwOworCisgICAvKioKKyAgICAqIFJldHVybnMgaG93IG1hbnkgY3ljbGVzIGl0IHRha2VzIHRoZSBpbnN0cnVjdGlvbiB0byBpc3N1ZS4KKyAgICAqCisgICAgKiBJbnN0cnVjdGlvbnMgaW4gZ2VuIGhhcmR3YXJlIGFyZSBoYW5kbGVkIG9uZSBzaW1kNCB2ZWN0b3IgYXQgYSB0aW1lLAorICAgICogd2l0aCAxIGN5Y2xlIHBlciB2ZWN0b3IgZGlzcGF0Y2hlZC4gIFRodXMgU0lNRDggcGl4ZWwgc2hhZGVycyB0YWtlIDIKKyAgICAqIGN5Y2xlcyB0byBkaXNwYXRjaCBhbmQgU0lNRDE2IChjb21wcmVzc2VkKSBpbnN0cnVjdGlvbnMgdGFrZSA0LgorICAgICovCisgICB2aXJ0dWFsIGludCBpc3N1ZV90aW1lKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QpID0gMDsKKworICAgdmlydHVhbCB2b2lkIGNvdW50X3JlbWFpbmluZ19ncmZfdXNlcyhiYWNrZW5kX2luc3RydWN0aW9uICppbnN0KSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgdXBkYXRlX3JlZ2lzdGVyX3ByZXNzdXJlKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QsIGJvb2wgIGJ1KSA9IDA7CisgICB2aXJ0dWFsIGZsb2F0IGdldF9yZWdpc3Rlcl9wcmVzc3VyZV9iZW5lZml0KGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QsIGJvb2wgYnUpID0gMDsKKyAgIHZpcnR1YWwgYm9vbCBpc19wYXJ0aWFsbHlfc2NoZWR1bGVkKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QpID0gMDsKKyAgIHZpcnR1YWwgYm9vbCBjb25zdW1lc19kc3QoYmFja2VuZF9pbnN0cnVjdGlvbiAqcHJldiwgYmFja2VuZF9pbnN0cnVjdGlvbiAqY3VycikgPSAwOworCisgICB2b2lkIHNjaGVkdWxlX2luc3RydWN0aW9uc190ZChiYWNrZW5kX2luc3RydWN0aW9uICpuZXh0X2Jsb2NrX2hlYWRlciwgaW50IGxpdmVfaW5zKTsKKyAgIHZvaWQgc2NoZWR1bGVfaW5zdHJ1Y3Rpb25zX2J1KGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKm5leHRfYmxvY2tfaGVhZGVyLCBpbnQgbGl2ZV9vdXRzKTsKKworICAgdm9pZCAqbWVtX2N0eDsKKworICAgYm9vbCBwb3N0X3JlZ19hbGxvYzsKKyAgIGludCBpbnN0cnVjdGlvbnNfdG9fc2NoZWR1bGU7CisgICBpbnQgZ3JmX2NvdW50OworICAgaW50IGFsbG9jYXRhYmxlX2dyZnM7CisgICBpbnQgdGltZTsKKyAgIGludCBwdGltZTsKKyAgIGV4ZWNfbGlzdCBpbnN0cnVjdGlvbnM7CisgICBiYWNrZW5kX3Zpc2l0b3IgKmJ2OworCisgICBmbG9hdCBjdXJyZW50X2Jsb2NrX3ByZXNzdXJlOworICAgZmxvYXQgcHJlc3N1cmVfcGFuaWNfdGhyZXNob2xkOworICAgaW50IGJsb2NrX251bTsKKworICAgaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyX21vZGUgbW9kZTsKKworICAgLy8gVGhlIHByZXZpb3VzbHkgc2NoZWR1bGVkIG5vZGUsIG9yIE5VTEwgaWYgbm9uZQorICAgc2NoZWR1bGVfbm9kZSAqcHJldmlvdXNfY2hvc2VuOworCisgICAvKioKKyAgICAqIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgbGVmdCB0byBzY2hlZHVsZSB0aGF0IHJlZmVyZW5jZSBlYWNoIHZncmYuCisgICAgKgorICAgICogVXNlZCBzbyB0aGF0IHdlIGNhbiBwcmVmZXIgc2NoZWR1bGluZyBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGVuZCB0aGUKKyAgICAqIGxpdmUgaW50ZXJ2YWxzIG9mIG11bHRpcGxlIHZhcmlhYmxlcywgdG8gcmVkdWNlIHJlZ2lzdGVyIHByZXNzdXJlLgorICAgICovCisgICBpbnQgKnJlbWFpbmluZ19ncmZfdXNlczsKKworICAgLyoqCisgICAgKiBUcmFja3Mgd2hldGhlciBlYWNoIFZHUkYgaGFzIGhhZCBhbiBpbnN0cnVjdGlvbiBzY2hlZHVsZWQgdGhhdCB1c2VzIGl0LgorICAgICoKKyAgICAqIFRoaXMgaXMgdXNlZCB0byBlc3RpbWF0ZSB3aGV0aGVyIHNjaGVkdWxpbmcgYSBuZXcgaW5zdHJ1Y3Rpb24gd2lsbAorICAgICogaW5jcmVhc2UgcmVnaXN0ZXIgcHJlc3N1cmUuCisgICAgKi8KKyAgIGJvb2wgKmdyZl9hY3RpdmU7Cit9OworCitjbGFzcyBmc19pbnN0cnVjdGlvbl9zY2hlZHVsZXIgOiBwdWJsaWMgaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyCit7CitwdWJsaWM6CisgICBmc19pbnN0cnVjdGlvbl9zY2hlZHVsZXIoZnNfdmlzaXRvciAqdiwgaW50IGdyZl9jb3VudCwgaW50IGFsbG9jYXRhYmxlX2dyZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyX21vZGUgbW9kZSk7CisgICB2b2lkIGNhbGN1bGF0ZV9kZXBzKGJvb2wgYnUpOworICAgYm9vbCBjb25mbGljdChmc19yZWcgKnIwLCBpbnQgbjAsIGZzX3JlZyAqcjEsIGludCBuMSk7CisgICBib29sIGlzX2NvbXByZXNzZWQoZnNfaW5zdCAqaW5zdCk7CisgICBzY2hlZHVsZV9ub2RlICpjaG9vc2VfaW5zdHJ1Y3Rpb25fdG9fc2NoZWR1bGVfdGQoKTsKKyAgIHNjaGVkdWxlX25vZGUgKmNob29zZV9pbnN0cnVjdGlvbl90b19zY2hlZHVsZV9idSgpOworICAgc2NoZWR1bGVfbm9kZSAqY2hvb3NlX2luc3RydWN0aW9uX3RvX3NjaGVkdWxlX2NsYXNzaWMoKTsKKyAgIGludCBpc3N1ZV90aW1lKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QpOworICAgZnNfdmlzaXRvciAqdjsKKworICAgdm9pZCBjb3VudF9yZW1haW5pbmdfZ3JmX3VzZXMoYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCk7CisgICB2b2lkIHVwZGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZShiYWNrZW5kX2luc3RydWN0aW9uICppbnN0LCBib29sIGJ1KTsKKyAgIGZsb2F0IGdldF9yZWdpc3Rlcl9wcmVzc3VyZV9iZW5lZml0KGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QsIGJvb2wgYnUpOworICAgYm9vbCBpc19wYXJ0aWFsbHlfc2NoZWR1bGVkKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QpOworICAgYm9vbCBjb25zdW1lc19kc3QoYmFja2VuZF9pbnN0cnVjdGlvbiAqcHJldiwgYmFja2VuZF9pbnN0cnVjdGlvbiAqY3Vycik7Cit9OworCitmc19pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OmZzX2luc3RydWN0aW9uX3NjaGVkdWxlcihmc192aXNpdG9yICp2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZl9jb3VudCwgaW50IGFsbG9jYXRhYmxlX2dyZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl9zY2hlZHVsZXJfbW9kZSBtb2RlKQorICAgOiBpbnN0cnVjdGlvbl9zY2hlZHVsZXIodiwgZ3JmX2NvdW50LCBhbGxvY2F0YWJsZV9ncmZzLCBtb2RlKSwKKyAgICAgdih2KQoreworfQorCit2b2lkCitmc19pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OmNvdW50X3JlbWFpbmluZ19ncmZfdXNlcyhiYWNrZW5kX2luc3RydWN0aW9uICpiZSkKK3sKKyAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKWJlOworCisgICBpZiAoIXJlbWFpbmluZ19ncmZfdXNlcykKKyAgICAgIHJldHVybjsKKworICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikKKyAgICAgIHJlbWFpbmluZ19ncmZfdXNlc1tpbnN0LT5kc3QucmVnXSsrOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IEdSRikKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICByZW1haW5pbmdfZ3JmX3VzZXNbaW5zdC0+c3JjW2ldLnJlZ10rKzsKKyAgIH0KK30KKwordm9pZAorZnNfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjp1cGRhdGVfcmVnaXN0ZXJfcHJlc3N1cmUoYmFja2VuZF9pbnN0cnVjdGlvbiAqYmUsIGJvb2wgYnUpCit7CisgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKiliZTsKKworICAgaWYgKCFyZW1haW5pbmdfZ3JmX3VzZXMpCisgICAgICByZXR1cm47CisKKyAgIGN1cnJlbnRfYmxvY2tfcHJlc3N1cmUgLT0gZ2V0X3JlZ2lzdGVyX3ByZXNzdXJlX2JlbmVmaXQoYmUsIGJ1KTsKKworICAgaWYgKGJ1KSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlID09IEdSRikgeworICAgICAgICAgICAgcmVtYWluaW5nX2dyZl91c2VzW2luc3QtPnNyY1tpXS5yZWddLS07CisgICAgICAgICAgICBncmZfYWN0aXZlW2luc3QtPnNyY1tpXS5yZWddID0gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikgeworICAgICAgICAgZ3JmX2FjdGl2ZVtpbnN0LT5kc3QucmVnXSA9IGZhbHNlOworICAgICAgICAgcmVtYWluaW5nX2dyZl91c2VzW2luc3QtPmRzdC5yZWddLS07CisgICAgICB9CisKKyAgIH0gZWxzZSB7CisgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKSB7CisgICAgICAgICByZW1haW5pbmdfZ3JmX3VzZXNbaW5zdC0+ZHN0LnJlZ10tLTsKKyAgICAgICAgIGdyZl9hY3RpdmVbaW5zdC0+ZHN0LnJlZ10gPSB0cnVlOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlID09IEdSRikgeworICAgICAgICAgICAgcmVtYWluaW5nX2dyZl91c2VzW2luc3QtPnNyY1tpXS5yZWddLS07CisgICAgICAgICAgICBncmZfYWN0aXZlW2luc3QtPnNyY1tpXS5yZWddID0gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworYm9vbAorZnNfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjppc19wYXJ0aWFsbHlfc2NoZWR1bGVkKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmJlKQoreworICAgLyogTG9vayBmb3IgcGFydGlhbCB3cml0ZXMgdG8gcmVnaXN0ZXIgZ3JvdXBzLCBiZWNhdXNlIHdlJ2xsIHByZWZlcgorICAgICAgc2NoZWR1bGluZyB3aG9sZSBncm91cHMgd2hlcmUgcG9zc2libGUgKi8KKworICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopYmU7CisgICBpbnQgcmVtYWluaW5nID0gcmVtYWluaW5nX2dyZl91c2VzW2luc3QtPmRzdC5yZWddOworCisgICBpZiAoZ3JmX2FjdGl2ZVtpbnN0LT5kc3QucmVnXSAmJiByZW1haW5pbmcgPCA0KSB7CisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmluc3RydWN0aW9ucykgeworICAgICAgICAgc2NoZWR1bGVfbm9kZSAqbiA9IChzY2hlZHVsZV9ub2RlICopbm9kZTsKKworICAgICAgICAgaWYgKCgoZnNfaW5zdCopbi0+aW5zdCktPmRzdC5yZWcgPT0gaW5zdC0+ZHN0LnJlZykKKyAgICAgICAgICAgIC0tcmVtYWluaW5nOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gcmVtYWluaW5nIDwgcmVtYWluaW5nX2dyZl91c2VzW2luc3QtPmRzdC5yZWddOworfQorCitib29sCitmc19pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OmNvbnN1bWVzX2RzdChiYWNrZW5kX2luc3RydWN0aW9uICpwcmV2LCBiYWNrZW5kX2luc3RydWN0aW9uICpjdXJyKQoreworICAgaWYgKCFwcmV2IHwgIWN1cnIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGZzX2luc3QgKmZzX3ByZXYgPSAoZnNfaW5zdCAqKXByZXY7CisgICBmc19pbnN0ICpmc19jdXJyID0gKGZzX2luc3QgKiljdXJyOworCisgICBpZiAoZnNfcHJldi0+ZHN0LmZpbGUgIT0gR1JGKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgaWYgKGZzX2N1cnItPnNyY1tpXS5maWxlID09IEdSRiAmJiBmc19jdXJyLT5zcmNbaV0ucmVnID09IGZzX3ByZXYtPmRzdC5yZWcpCisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0gICAKKworICAgcmV0dXJuIGZhbHNlOworfQorCitmbG9hdAorZnNfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjpnZXRfcmVnaXN0ZXJfcHJlc3N1cmVfYmVuZWZpdChiYWNrZW5kX2luc3RydWN0aW9uICpiZSwgYm9vbCBidSkKK3sKKyAgIGZzX2luc3QgKmluc3QgPSAoZnNfaW5zdCAqKWJlOworICAgZmxvYXQgYmVuZWZpdCA9IDAuMGY7CisKKyAgIGlmICh1c2VfaXBzKG1vZGUpKQorICAgICAgaWYgKGluc3QtPm9wY29kZSA9PSBGU19PUENPREVfTElOVEVSUCB8fCBpbnN0LT5vcGNvZGUgPT0gRlNfT1BDT0RFX0NJTlRFUlApCisgICAgICAgICByZXR1cm4gLTAuNWY7CisKKyAgIGlmIChidSkgeworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikgeworICAgICAgICAgaWYgKHJlbWFpbmluZ19ncmZfdXNlc1tpbnN0LT5kc3QucmVnXSA9PSAxKQorICAgICAgICAgICAgYmVuZWZpdCArPSB2LT52aXJ0dWFsX2dyZl9zaXplc1tpbnN0LT5kc3QucmVnXTsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSAhPSBHUkYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgaWYgKCFncmZfYWN0aXZlW2luc3QtPnNyY1tpXS5yZWddKQorICAgICAgICAgICAgYmVuZWZpdCAtPSB2LT52aXJ0dWFsX2dyZl9zaXplc1tpbnN0LT5zcmNbaV0ucmVnXTsKKyAgICAgIH0KKworICAgfSBlbHNlIHsKKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGlmIChyZW1haW5pbmdfZ3JmX3VzZXNbaW5zdC0+ZHN0LnJlZ10gPT0gMSkKKyAgICAgICAgICAgIGJlbmVmaXQgKz0gdi0+dmlydHVhbF9ncmZfc2l6ZXNbaW5zdC0+ZHN0LnJlZ107CisgICAgICAgICBpZiAoIWdyZl9hY3RpdmVbaW5zdC0+ZHN0LnJlZ10pCisgICAgICAgICAgICBiZW5lZml0IC09IHYtPnZpcnR1YWxfZ3JmX3NpemVzW2luc3QtPmRzdC5yZWddOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IEdSRikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICBpZiAocmVtYWluaW5nX2dyZl91c2VzW2luc3QtPnNyY1tpXS5yZWddID09IDEpCisgICAgICAgICAgICBiZW5lZml0ICs9IHYtPnZpcnR1YWxfZ3JmX3NpemVzW2luc3QtPnNyY1tpXS5yZWddOworICAgICAgICAgaWYgKCFncmZfYWN0aXZlW2luc3QtPnNyY1tpXS5yZWddKQorICAgICAgICAgICAgYmVuZWZpdCAtPSB2LT52aXJ0dWFsX2dyZl9zaXplc1tpbnN0LT5zcmNbaV0ucmVnXTsKKyAgICAgIH0KKyAgIH0KKyAgICAgIAorICAgcmV0dXJuIGJlbmVmaXQ7Cit9CisKK2NsYXNzIHZlYzRfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyIDogcHVibGljIGluc3RydWN0aW9uX3NjaGVkdWxlcgoreworcHVibGljOgorICAgdmVjNF9pbnN0cnVjdGlvbl9zY2hlZHVsZXIodmVjNF92aXNpdG9yICp2LCBpbnQgZ3JmX2NvdW50LCBpbnQgYWxsb2NhdGFibGVfZ3JmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3NjaGVkdWxlcl9tb2RlIG1vZGUpOworICAgdm9pZCBjYWxjdWxhdGVfZGVwcyhib29sIGJ1KTsKKyAgIHNjaGVkdWxlX25vZGUgKmNob29zZV9pbnN0cnVjdGlvbl90b19zY2hlZHVsZV90ZCgpOworICAgc2NoZWR1bGVfbm9kZSAqY2hvb3NlX2luc3RydWN0aW9uX3RvX3NjaGVkdWxlX2J1KCk7CisgICBpbnQgaXNzdWVfdGltZShiYWNrZW5kX2luc3RydWN0aW9uICppbnN0KTsKKyAgIHZlYzRfdmlzaXRvciAqdjsKKworICAgdm9pZCBjb3VudF9yZW1haW5pbmdfZ3JmX3VzZXMoYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCk7CisgICB2b2lkIHVwZGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZShiYWNrZW5kX2luc3RydWN0aW9uICppbnN0LCBib29sIGJ1KTsKKyAgIGZsb2F0IGdldF9yZWdpc3Rlcl9wcmVzc3VyZV9iZW5lZml0KGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QsIGJvb2wgYnUpOworICAgYm9vbCBpc19wYXJ0aWFsbHlfc2NoZWR1bGVkKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QpIHsgcmV0dXJuIGZhbHNlOyB9CisgICBib29sIGNvbnN1bWVzX2RzdChiYWNrZW5kX2luc3RydWN0aW9uICpwcmV2LCBiYWNrZW5kX2luc3RydWN0aW9uICpjdXJyKSB7IHJldHVybiBmYWxzZTsgfQorfTsKKwordmVjNF9pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OnZlYzRfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyKHZlYzRfdmlzaXRvciAqdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JmX2NvdW50LCBpbnQgYWxsb2NhdGFibGVfZ3JmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl9zY2hlZHVsZXJfbW9kZSBtb2RlKQorICAgOiBpbnN0cnVjdGlvbl9zY2hlZHVsZXIodiwgZ3JmX2NvdW50LCBhbGxvY2F0YWJsZV9ncmZzLCBtb2RlKSwKKyAgICAgdih2KQoreworfQorCit2b2lkCit2ZWM0X2luc3RydWN0aW9uX3NjaGVkdWxlcjo6Y291bnRfcmVtYWluaW5nX2dyZl91c2VzKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmJlKQoreworfQorCit2b2lkCit2ZWM0X2luc3RydWN0aW9uX3NjaGVkdWxlcjo6dXBkYXRlX3JlZ2lzdGVyX3ByZXNzdXJlKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmJlLCBib29sIGJ1KQoreworfQorCitmbG9hdAordmVjNF9pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OmdldF9yZWdpc3Rlcl9wcmVzc3VyZV9iZW5lZml0KGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmJlLCBib29sIGJ1KQoreworICAgcmV0dXJuIDAuMGY7Cit9CisKK3NjaGVkdWxlX25vZGU6OnNjaGVkdWxlX25vZGUoYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyICpzY2hlZCkKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gc2NoZWQtPmJ2LT5icnc7CisKKyAgIHRoaXMtPmluc3QgPSBpbnN0OworICAgdGhpcy0+Y2hpbGRfYXJyYXlfc2l6ZSA9IDA7CisgICB0aGlzLT5jaGlsZHJlbiA9IE5VTEw7CisgICB0aGlzLT5jaGlsZF9sYXRlbmN5ID0gTlVMTDsKKyAgIHRoaXMtPmNoaWxkX3BsYXRlbmN5ID0gTlVMTDsKKyAgIHRoaXMtPmNoaWxkX2NvdW50ID0gMDsKKyAgIHRoaXMtPmNyaXRpY2FsX3BhdGggPSBmYWxzZTsKKyAgIHRoaXMtPnBhcmVudF9jb3VudCA9IDA7CisgICB0aGlzLT51bmJsb2NrZWRfdGltZSA9IDA7CisgICB0aGlzLT51bmJsb2NrZWRfcHRpbWUgPSAwOworICAgdGhpcy0+Y2FuZF9nZW5lcmF0aW9uID0gMDsKKyAgIHRoaXMtPmRlbGF5ID0gMDsKKworICAgLyogV2UgY2FuJ3QgbWVhc3VyZSBHZW42IHRpbWluZ3MgZGlyZWN0bHkgYnV0IGV4cGVjdCB0aGVtIHRvIGJlIG11Y2gKKyAgICAqIGNsb3NlciB0byBHZW43IHRoYW4gR2VuNC4KKyAgICAqLworICAgaWYgKGJydy0+Z2VuID49IDYpCisgICAgICBzZXRfbGF0ZW5jeV9nZW43KGJydy0+aXNfaGFzd2VsbCk7CisgICBlbHNlCisgICAgICBzZXRfbGF0ZW5jeV9nZW40KCk7CisKKyAgIC8vIEVzdGltYXRlIG9mIGF2ZXJhZ2UgdGhyZWFkIGNvdmVyYWdlLiAgVGhyZWFkcyBtaWdodCBiZSBtb3JlIGVmZmVjdGl2ZSBpbgorICAgLy8gbWFueSBjYXNlcywgYnV0IHRoZXJlIGFyZSBhbHNvIGNhY2hlIG1pc3NlcyBhbmQgb3RoZXIgaGlnaCBsYXRlbmN5CisgICAvLyBldmVudHMuCisgICBzdGF0aWMgY29uc3QgaW50IGh3X3RocmVhZF9jb3VudCA9IDI7CisKKyAgIHRoaXMtPmxhdGVuY3kgPSB0aGlzLT5sYXRlbmN5IC8gaHdfdGhyZWFkX2NvdW50OworICAgdGhpcy0+bGF0ZW5jeSA9ICh0aGlzLT5sYXRlbmN5IDwgMSkgPyAxIDogdGhpcy0+bGF0ZW5jeTsKKyAgIHRoaXMtPnBsYXRlbmN5ID0gdGhpcy0+bGF0ZW5jeTsgCisKKyAgIGlmICghc2NoZWQtPnBvc3RfcmVnX2FsbG9jKQkvLyBPdmVyd3JpdGUgInNjaGVkdWxpbmciIGxhdGVuY3kgb25seQorICAgICB0aGlzLT5sYXRlbmN5ID0gMTsKK30KKwordm9pZAoraW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjphZGRfaW5zdChiYWNrZW5kX2luc3RydWN0aW9uICppbnN0KQoreworICAgc2NoZWR1bGVfbm9kZSAqbiA9IG5ldyhtZW1fY3R4KSBzY2hlZHVsZV9ub2RlKGluc3QsIHRoaXMpOworCisgICBhc3NlcnQoIWluc3QtPmlzX2hlYWRfc2VudGluZWwoKSk7CisgICBhc3NlcnQoIWluc3QtPmlzX3RhaWxfc2VudGluZWwoKSk7CisKKyAgIHRoaXMtPmluc3RydWN0aW9uc190b19zY2hlZHVsZSsrOworCisgICBpbnN0LT5yZW1vdmUoKTsKKyAgIGluc3RydWN0aW9ucy5wdXNoX3RhaWwobik7Cit9CisKKyNpZiBVU0VfR1JBUEhWSVoKKy8qKiBDYWxjdWxhdGUgY3JpdGljYWwgcGF0aC4gKi8KK3ZvaWQKK2luc3RydWN0aW9uX3NjaGVkdWxlcjo6ZmluZF9jcml0aWNhbF9wYXRoKHNjaGVkdWxlX25vZGUgKm4pCit7CisgICBpZiAoIW4gfHwgIW4tPmNoaWxkX2NvdW50KQorICAgICAgcmV0dXJuOworCisgICBkbyB7CisgICAgICBpbnQgZGVsYXkgPSAtNjU1MzU7CisgICAgICBzY2hlZHVsZV9ub2RlICpuZXh0ID0gMDsKKworICAgICAgbi0+Y3JpdGljYWxfcGF0aCA9IHRydWU7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbi0+Y2hpbGRfY291bnQ7IGkrKykgeworICAgICAgICAgaWYgKG4tPmNoaWxkcmVuW2ldLT5kZWxheSA+IGRlbGF5KSB7CisgICAgICAgICAgICBuZXh0ID0gbi0+Y2hpbGRyZW5baV07CisgICAgICAgICAgICBkZWxheSA9IG4tPmNoaWxkcmVuW2ldLT5kZWxheTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgbiA9IG5leHQ7CisgICB9IHdoaWxlIChuKTsKK30KKyNlbmRpZiAvLyBVU0VfR1JBUEhWSVoKKworLyoqIFJlY3Vyc2l2ZSBjb21wdXRhdGlvbiBvZiB0aGUgZGVsYXkgbWVtYmVyIG9mIGEgbm9kZS4gKi8KK3ZvaWQKK2luc3RydWN0aW9uX3NjaGVkdWxlcjo6Y29tcHV0ZV9kZWxheShzY2hlZHVsZV9ub2RlICpuKQoreworICAgaWYgKCFuLT5jaGlsZF9jb3VudCkgeworICAgICAgbi0+ZGVsYXkgPSBpc3N1ZV90aW1lKG4tPmluc3QpOworICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbi0+Y2hpbGRfY291bnQ7IGkrKykgeworICAgICAgICAgaWYgKCFuLT5jaGlsZHJlbltpXS0+ZGVsYXkpCisgICAgICAgICAgICBjb21wdXRlX2RlbGF5KG4tPmNoaWxkcmVuW2ldKTsKKworICAgICAgICAgbi0+ZGVsYXkgPSBNQVgyKG4tPmRlbGF5LCBuLT5wbGF0ZW5jeSArIG4tPmNoaWxkcmVuW2ldLT5kZWxheSk7CisgICAgICB9CisgICB9Cit9CisKKy8qKgorICogQWRkIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBpbnN0cnVjdGlvbiBub2Rlcy4KKyAqCisgKiBUaGUgQGFmdGVyIG5vZGUgd2lsbCBiZSBzY2hlZHVsZWQgYWZ0ZXIgQGJlZm9yZS4gIFdlIHdpbGwgdHJ5IHRvCisgKiBzY2hlZHVsZSBpdCBAbGF0ZW5jeSBjeWNsZXMgYWZ0ZXIgQGJlZm9yZSwgYnV0IG5vIGd1YXJhbnRlZXMgdGhlcmUuCisgKi8KK3ZvaWQKK2luc3RydWN0aW9uX3NjaGVkdWxlcjo6YWRkX2RlcChib29sIGJ1LCBzY2hlZHVsZV9ub2RlICpiZWZvcmUsIHNjaGVkdWxlX25vZGUgKmFmdGVyLAorCQkJICAgICAgIGludCBsYXRlbmN5LCBpbnQgcGxhdGVuY3kpCit7CisgICBpZiAoIWJlZm9yZSB8fCAhYWZ0ZXIpCisgICAgICByZXR1cm47CisKKyAgIGFzc2VydChiZWZvcmUgIT0gYWZ0ZXIpOworCisgICBpZiAoYnUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWZ0ZXItPmNoaWxkX2NvdW50OyBpKyspIHsKKyAgICAgICAgIGlmIChhZnRlci0+Y2hpbGRyZW5baV0gPT0gYmVmb3JlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChhZnRlci0+Y2hpbGRfYXJyYXlfc2l6ZSA8PSBhZnRlci0+Y2hpbGRfY291bnQpIHsKKyAgICAgICAgIGlmIChhZnRlci0+Y2hpbGRfYXJyYXlfc2l6ZSA8IDE2KQorICAgICAgICAgICAgYWZ0ZXItPmNoaWxkX2FycmF5X3NpemUgPSAxNjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFmdGVyLT5jaGlsZF9hcnJheV9zaXplICo9IDI7CisKKyAgICAgICAgIGFmdGVyLT5jaGlsZHJlbiA9IHJlcmFsbG9jKG1lbV9jdHgsIGFmdGVyLT5jaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZV9ub2RlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPmNoaWxkX2FycmF5X3NpemUpOworCisgICAgICAgICBhZnRlci0+Y2hpbGRfbGF0ZW5jeSA9IHJlcmFsbG9jKG1lbV9jdHgsIGFmdGVyLT5jaGlsZF9sYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGFmdGVyLT5jaGlsZF9hcnJheV9zaXplKTsKKyAgICAgICAgIGFmdGVyLT5jaGlsZF9wbGF0ZW5jeSA9IHJlcmFsbG9jKG1lbV9jdHgsIGFmdGVyLT5jaGlsZF9wbGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgYWZ0ZXItPmNoaWxkX2FycmF5X3NpemUpOworICAgICAgfQorCisgICAgICBhZnRlci0+Y2hpbGRyZW5bYWZ0ZXItPmNoaWxkX2NvdW50XSA9IGJlZm9yZTsKKyAgICAgIGFmdGVyLT5jaGlsZF9sYXRlbmN5W2FmdGVyLT5jaGlsZF9jb3VudF0gPSBsYXRlbmN5OworICAgICAgYWZ0ZXItPmNoaWxkX3BsYXRlbmN5W2FmdGVyLT5jaGlsZF9jb3VudF0gPSBwbGF0ZW5jeTsKKyAgICAgIGFmdGVyLT5jaGlsZF9jb3VudCsrOworICAgICAgYmVmb3JlLT5wYXJlbnRfY291bnQrKzsKKyAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJlZm9yZS0+Y2hpbGRfY291bnQ7IGkrKykgeworICAgICAgICAgaWYgKGJlZm9yZS0+Y2hpbGRyZW5baV0gPT0gYWZ0ZXIpIHsKKyAgICAgICAgICAgIGJlZm9yZS0+Y2hpbGRfbGF0ZW5jeVtpXSA9IE1BWDIoYmVmb3JlLT5jaGlsZF9sYXRlbmN5W2ldLCBsYXRlbmN5KTsKKyAgICAgICAgICAgIGJlZm9yZS0+Y2hpbGRfcGxhdGVuY3lbaV0gPSBNQVgyKGJlZm9yZS0+Y2hpbGRfcGxhdGVuY3lbaV0sIHBsYXRlbmN5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGJlZm9yZS0+Y2hpbGRfYXJyYXlfc2l6ZSA8PSBiZWZvcmUtPmNoaWxkX2NvdW50KSB7CisgICAgICAgICBpZiAoYmVmb3JlLT5jaGlsZF9hcnJheV9zaXplIDwgMTYpCisgICAgICAgICAgICBiZWZvcmUtPmNoaWxkX2FycmF5X3NpemUgPSAxNjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJlZm9yZS0+Y2hpbGRfYXJyYXlfc2l6ZSAqPSAyOworCisgICAgICAgICBiZWZvcmUtPmNoaWxkcmVuID0gcmVyYWxsb2MobWVtX2N0eCwgYmVmb3JlLT5jaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZV9ub2RlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlLT5jaGlsZF9hcnJheV9zaXplKTsKKyAgICAgICAgIGJlZm9yZS0+Y2hpbGRfbGF0ZW5jeSA9IHJlcmFsbG9jKG1lbV9jdHgsIGJlZm9yZS0+Y2hpbGRfbGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgYmVmb3JlLT5jaGlsZF9hcnJheV9zaXplKTsKKyAgICAgICAgIGJlZm9yZS0+Y2hpbGRfcGxhdGVuY3kgPSByZXJhbGxvYyhtZW1fY3R4LCBiZWZvcmUtPmNoaWxkX3BsYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgYmVmb3JlLT5jaGlsZF9hcnJheV9zaXplKTsKKyAgICAgIH0KKworICAgICAgYmVmb3JlLT5jaGlsZHJlbltiZWZvcmUtPmNoaWxkX2NvdW50XSA9IGFmdGVyOworICAgICAgYmVmb3JlLT5jaGlsZF9sYXRlbmN5W2JlZm9yZS0+Y2hpbGRfY291bnRdID0gbGF0ZW5jeTsKKyAgICAgIGJlZm9yZS0+Y2hpbGRfcGxhdGVuY3lbYmVmb3JlLT5jaGlsZF9jb3VudF0gPSBwbGF0ZW5jeTsKKyAgICAgIGJlZm9yZS0+Y2hpbGRfY291bnQrKzsKKyAgICAgIGFmdGVyLT5wYXJlbnRfY291bnQrKzsKKyAgIH0KK30KKwordm9pZAoraW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjphZGRfZGVwKGJvb2wgYnUsIHNjaGVkdWxlX25vZGUgKmJlZm9yZSwgc2NoZWR1bGVfbm9kZSAqYWZ0ZXIpCit7CisgICBpZiAoIWJlZm9yZSkKKyAgICAgIHJldHVybjsKKworICAgYWRkX2RlcChidSwgYmVmb3JlLCBhZnRlciwgYmVmb3JlLT5sYXRlbmN5LCBiZWZvcmUtPnBsYXRlbmN5KTsKK30KKworLyoqCisgKiBTb21ldGltZXMgd2UgcmVhbGx5IHdhbnQgdGhpcyBub2RlIHRvIGV4ZWN1dGUgYWZ0ZXIgZXZlcnl0aGluZyB0aGF0CisgKiB3YXMgYmVmb3JlIGl0IGFuZCBiZWZvcmUgZXZlcnl0aGluZyB0aGF0IGZvbGxvd2VkIGl0LiAgVGhpcyBhZGRzCisgKiB0aGUgZGVwcyB0byBkbyBzby4KKyAqLwordm9pZAoraW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjphZGRfYmFycmllcl9kZXBzKGJvb2wgYnUsIHNjaGVkdWxlX25vZGUgKm4pCit7CisgICBzY2hlZHVsZV9ub2RlICpwcmV2ID0gKHNjaGVkdWxlX25vZGUgKiluLT5wcmV2OworICAgc2NoZWR1bGVfbm9kZSAqbmV4dCA9IChzY2hlZHVsZV9ub2RlICopbi0+bmV4dDsKKworICAgaWYgKHByZXYpIHsKKyAgICAgIHdoaWxlICghcHJldi0+aXNfaGVhZF9zZW50aW5lbCgpKSB7CisJIGFkZF9kZXAoYnUsIHByZXYsIG4sIDAsIDApOworCSBwcmV2ID0gKHNjaGVkdWxlX25vZGUgKilwcmV2LT5wcmV2OworICAgICAgfQorICAgfQorCisgICBpZiAobmV4dCkgeworICAgICAgd2hpbGUgKCFuZXh0LT5pc190YWlsX3NlbnRpbmVsKCkpIHsKKwkgYWRkX2RlcChidSwgbiwgbmV4dCwgMCwgMCk7CisJIG5leHQgPSAoc2NoZWR1bGVfbm9kZSAqKW5leHQtPm5leHQ7CisgICAgICB9CisgICB9Cit9CisKKy8qIGluc3RydWN0aW9uIHNjaGVkdWxpbmcgbmVlZHMgdG8gYmUgYXdhcmUgb2Ygd2hlbiBhbiBNUkYgd3JpdGUKKyAqIGFjdHVhbGx5IHdyaXRlcyAyIE1SRnMuCisgKi8KK2Jvb2wKK2ZzX2luc3RydWN0aW9uX3NjaGVkdWxlcjo6aXNfY29tcHJlc3NlZChmc19pbnN0ICppbnN0KQoreworICAgcmV0dXJuICh2LT5kaXNwYXRjaF93aWR0aCA9PSAxNiAmJgorCSAgICFpbnN0LT5mb3JjZV91bmNvbXByZXNzZWQgJiYKKwkgICAhaW5zdC0+Zm9yY2Vfc2VjaGFsZik7Cit9CisKK2Jvb2wgZnNfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjpjb25mbGljdChmc19yZWcgKnIwLCBpbnQgbjAsIGZzX3JlZyAqcjEsIGludCBuMSkKK3sKKyAgIGNvbnN0IGludCByMF9zdGFydCA9IHIwLT5yZWcgKyByMC0+cmVnX29mZnNldCArIDA7CisgICBjb25zdCBpbnQgcjBfZW5kICAgPSByMC0+cmVnICsgcjAtPnJlZ19vZmZzZXQgKyBuMDsKKyAgIGNvbnN0IGludCByMV9zdGFydCA9IHIxLT5yZWcgKyByMS0+cmVnX29mZnNldCArIDA7CisgICBjb25zdCBpbnQgcjFfZW5kICAgPSByMS0+cmVnICsgcjEtPnJlZ19vZmZzZXQgKyBuMTsKKworICAgcmV0dXJuICEocjBfZW5kIDwgcjFfc3RhcnQgfHwgcjBfc3RhcnQgPiByMV9lbmQpOworfQorCisKK3ZvaWQKK2ZzX2luc3RydWN0aW9uX3NjaGVkdWxlcjo6Y2FsY3VsYXRlX2RlcHMoYm9vbCBidSkKK3sKKyAgIGNvbnN0IGJvb2wgZ2VuNnBsdXMgPSB2LT5icnctPmdlbiA+PSA2OworCisgICAvKiBQcmUtcmVnaXN0ZXItYWxsb2NhdGlvbiwgdGhpcyB0cmFja3MgdGhlIGxhc3Qgd3JpdGUgcGVyIFZHUkYgKHNvCisgICAgKiBkaWZmZXJlbnQgcmVnX29mZnNldHMgd2l0aGluIGl0IGNhbiBpbnRlcmZlcmUgd2hlbiB0aGV5IHNob3VsZG4ndCkuCisgICAgKiBBZnRlciByZWdpc3RlciBhbGxvY2F0aW9uLCByZWdfb2Zmc2V0cyBhcmUgZ29uZSBhbmQgd2UgdHJhY2sgaW5kaXZpZHVhbAorICAgICogR1JGIHJlZ2lzdGVycy4KKyAgICAqLworICAgc2NoZWR1bGVfbm9kZSAqbGFzdF9ncmZfd3JpdGVbZ3JmX2NvdW50XTsKKyAgIHNjaGVkdWxlX25vZGUgKmxhc3RfbXJmX3dyaXRlW0JSV19NQVhfTVJGXTsKKyAgIHNjaGVkdWxlX25vZGUgKmxhc3RfY29uZGl0aW9uYWxfbW9kWzJdID0geyBOVUxMLCBOVUxMIH07CisgICBzY2hlZHVsZV9ub2RlICpsYXN0X2FjY3VtdWxhdG9yX3dyaXRlID0gTlVMTDsKKyAgIC8qIEZpeGVkIEhXIHJlZ2lzdGVycyBhcmUgYXNzdW1lZCB0byBiZSBzZXBhcmF0ZSBmcm9tIHRoZSB2aXJ0dWFsCisgICAgKiBHUkZzLCBzbyB0aGV5IGNhbiBiZSB0cmFja2VkIHNlcGFyYXRlbHkuICBXZSBkb24ndCByZWFsbHkgd3JpdGUKKyAgICAqIHRvIGZpeGVkIEdSRnMgbXVjaCwgc28gZG9uJ3QgYm90aGVyIHRyYWNraW5nIHRoZW0gb24gYSBtb3JlCisgICAgKiBncmFudWxhciBsZXZlbC4KKyAgICAqLworICAgc2NoZWR1bGVfbm9kZSAqbGFzdF9maXhlZF9ncmZfd3JpdGUgPSBOVUxMOworICAgaW50IHJlZ193aWR0aCA9IHYtPmRpc3BhdGNoX3dpZHRoIC8gODsKKworICAgLyogVGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWx3YXlzIG5lZWRzIHRvIHN0aWxsIGJlIHRoZSBsYXN0CisgICAgKiBpbnN0cnVjdGlvbi4gIEVpdGhlciBpdCdzIGZsb3cgY29udHJvbCAoSUYsIEVMU0UsIEVORElGLCBETywKKyAgICAqIFdISUxFKSBhbmQgc2NoZWR1bGluZyBvdGhlciB0aGluZ3MgYWZ0ZXIgaXQgd291bGQgZGlzdHVyYiB0aGUKKyAgICAqIGJhc2ljIGJsb2NrLCBvciBpdCdzIEZCX1dSSVRFIGFuZCB3ZSBzaG91bGQgZG8gYSBiZXR0ZXIgam9iIGF0CisgICAgKiBkZWFkIGNvZGUgZWxpbWluYXRpb24gYW55d2F5LgorICAgICovCisgICBzY2hlZHVsZV9ub2RlICpsYXN0ID0gKHNjaGVkdWxlX25vZGUgKilpbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKyAgIGFkZF9iYXJyaWVyX2RlcHMoYnUsIGxhc3QpOworCisgICBtZW1zZXQobGFzdF9ncmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X2dyZl93cml0ZSkpOworICAgbWVtc2V0KGxhc3RfbXJmX3dyaXRlLCAwLCBzaXplb2YobGFzdF9tcmZfd3JpdGUpKTsKKworICAgLyogdG9wLXRvLWJvdHRvbSBkZXBlbmRlbmNpZXM6IFJBVyBhbmQgV0FXLiAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZpbnN0cnVjdGlvbnMpIHsKKyAgICAgIHNjaGVkdWxlX25vZGUgKm4gPSAoc2NoZWR1bGVfbm9kZSAqKW5vZGU7CisgICAgICBmc19pbnN0ICppbnN0ID0gKGZzX2luc3QgKiluLT5pbnN0OworCisgICAgICBpZiAoaW5zdC0+b3Bjb2RlID09IEZTX09QQ09ERV9QTEFDRUhPTERFUl9IQUxUIHx8CisgICAgICAgICBpbnN0LT5oYXNfc2lkZV9lZmZlY3RzKCkpCisgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKworICAgICAgLyogcmVhZC1hZnRlci13cml0ZSBkZXBzLiAqLworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgICAgIGlmIChwb3N0X3JlZ19hbGxvYykgeworICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByZWdfd2lkdGggKiBpbnN0LT5yZWdzX3JlYWQodiwgaSk7IHIrKykKKyAgICAgICAgICAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWcgKyByXSwgbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZzX2luc3QqIHdyaXRlciA9IGxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWddID8KKyAgICAgICAgICAgICAgICAgICAgKGZzX2luc3QqKWxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWddLT5pbnN0IDogMDsKKyAgICAgICAgICAgICAgICBmc19pbnN0KiByZWFkZXIgPSAoZnNfaW5zdCopbi0+aW5zdDsKKworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgJiYgd3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAvLyBMdW5hckcgVE9ETzogRml4IGFuZCByZS1lbmFibGUgY29tcG9uZW50LWxldmVsIGRlcGVuZGVuY2UgYW5hbHlzaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gV2l0aCB0aGUgY29tbWVudGVkIGxvZ2ljLCBkZXBlbmRlbmNpZXMgYXJlIG5vdCByZWNvcmRlZCBpZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgZGlkIG5vdCBpbmNsdWRlIHRoZSBjdXJyZW50IHNvdXJjZSBjb21wb25lbnRzLiBUaGlzIG1pc3NlcyBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSB3cml0ZSBwcmVjZWRpbmcgdGhlIGxhc3QgZGlkIGluY2x1ZGUgdGhlIGN1cnJlbnQgc291cmNlIGNvbXBvbmVudHMuCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjb25mbGljdCgmd3JpdGVyLT5kc3QsICAgIHdyaXRlci0+cmVnc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAmcmVhZGVyLT5zcmNbaV0sIHJlYWRlci0+cmVnc19yZWFkKHYsIGkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWddLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gSFdfUkVHICYmCisgICAgICAgICAgICAgICAgICAgIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLmZpbGUgPT0KKyAgICAgICAgICAgICAgICAgICAgIEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpKSB7CisgICAgICAgICAgICBpZiAocG9zdF9yZWdfYWxsb2MpIHsKKyAgICAgICAgICAgICAgIGludCBzaXplID0gcmVnX3dpZHRoOworICAgICAgICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcudnN0cmlkZSA9PSBCUldfVkVSVElDQUxfU1RSSURFXzApCisgICAgICAgICAgICAgICAgICBzaXplID0gMTsKKyAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgc2l6ZTsgcisrKQorICAgICAgICAgICAgICAgICAgYWRkX2RlcChidSwgbGFzdF9ncmZfd3JpdGVbaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5uciArIHJdLCBuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2ZpeGVkX2dyZl93cml0ZSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgaWYgKGluc3QtPnNyY1tpXS5pc19hY2N1bXVsYXRvcigpICYmIGdlbjZwbHVzKSB7CisgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gQkFEX0ZJTEUgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpbGUgIT0gSU1NICYmCisgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5maWxlICE9IFVOSUZPUk0gJiYKKyAgICAgICAgICAgICAgICAgICAgKGluc3QtPnNyY1tpXS5maWxlICE9IEhXX1JFRyB8fAorICAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5maWxlICE9IElNTSkpIHsKKyAgICAgICAgICAgIGFzc2VydChpbnN0LT5zcmNbaV0uZmlsZSAhPSBNUkYpOworICAgICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5iYXNlX21yZiAhPSAtMSkgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0LT5tbGVuOyBpKyspIHsKKyAgICAgICAgICAgIC8qIEl0IGxvb2tzIGxpa2UgdGhlIE1SRiByZWdzIGFyZSByZWxlYXNlZCBpbiB0aGUgc2VuZAorICAgICAgICAgICAgICogaW5zdHJ1Y3Rpb24gb25jZSBpdCdzIHNlbnQsIG5vdCB3aGVuIHRoZSByZXN1bHQgY29tZXMKKyAgICAgICAgICAgICAqIGJhY2suCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfbXJmX3dyaXRlW2luc3QtPmJhc2VfbXJmICsgaV0sIG4pOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+cmVhZHNfZmxhZygpKSB7CisgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2NvbmRpdGlvbmFsX21vZFtpbnN0LT5mbGFnX3N1YnJlZ10sIG4pOworICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+cmVhZHNfYWNjdW11bGF0b3JfaW1wbGljaXRseSgpKSB7CisgICAgICAgICBpZiAoZ2VuNnBsdXMpIHsKKyAgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHdyaXRlLWFmdGVyLXdyaXRlIGRlcHMuICovCisgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKSB7CisgICAgICAgICBpZiAocG9zdF9yZWdfYWxsb2MpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgaW5zdC0+cmVnc193cml0dGVuICogcmVnX3dpZHRoOyByKyspIHsKKyAgICAgICAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfZ3JmX3dyaXRlW2luc3QtPmRzdC5yZWcgKyByXSwgbik7CisgICAgICAgICAgICAgICBsYXN0X2dyZl93cml0ZVtpbnN0LT5kc3QucmVnICsgcl0gPSBuOworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfZ3JmX3dyaXRlW2luc3QtPmRzdC5yZWddLCBuKTsKKyAgICAgICAgICAgIGxhc3RfZ3JmX3dyaXRlW2luc3QtPmRzdC5yZWddID0gbjsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gTVJGKSB7CisgICAgICAgICBpbnQgcmVnID0gaW5zdC0+ZHN0LnJlZyAmIH5CUldfTVJGX0NPTVBSNDsKKworICAgICAgICAgYWRkX2RlcChidSwgbGFzdF9tcmZfd3JpdGVbcmVnXSwgbik7CisgICAgICAgICBsYXN0X21yZl93cml0ZVtyZWddID0gbjsKKyAgICAgICAgIGlmIChpc19jb21wcmVzc2VkKGluc3QpKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+ZHN0LnJlZyAmIEJSV19NUkZfQ09NUFI0KQorICAgICAgICAgICAgICAgcmVnICs9IDQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICByZWcrKzsKKyAgICAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfbXJmX3dyaXRlW3JlZ10sIG4pOworICAgICAgICAgICAgbGFzdF9tcmZfd3JpdGVbcmVnXSA9IG47CisgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGluc3QtPmRzdC5maWxlID09IEhXX1JFRyAmJgorICAgICAgICAgICAgICAgICBpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSkgeworICAgICAgICAgaWYgKHBvc3RfcmVnX2FsbG9jKSB7CisgICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHJlZ193aWR0aDsgcisrKQorICAgICAgICAgICAgICAgbGFzdF9ncmZfd3JpdGVbaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5uciArIHJdID0gbjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsYXN0X2ZpeGVkX2dyZl93cml0ZSA9IG47CisgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGluc3QtPmRzdC5pc19hY2N1bXVsYXRvcigpICYmIGdlbjZwbHVzKSB7CisgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgIGxhc3RfYWNjdW11bGF0b3Jfd3JpdGUgPSBuOworICAgICAgfSBlbHNlIGlmIChpbnN0LT5kc3QuZmlsZSAhPSBCQURfRklMRSkgeworICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5tbGVuID4gMCAmJiBpbnN0LT5iYXNlX21yZiAhPSAtMSkgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LT5pbXBsaWVkX21yZl93cml0ZXMoaW5zdCk7IGkrKykgeworICAgICAgICAgICAgYWRkX2RlcChidSwgbGFzdF9tcmZfd3JpdGVbaW5zdC0+YmFzZV9tcmYgKyBpXSwgbik7CisgICAgICAgICAgICBsYXN0X21yZl93cml0ZVtpbnN0LT5iYXNlX21yZiArIGldID0gbjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPndyaXRlc19mbGFnKCkpIHsKKyAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfY29uZGl0aW9uYWxfbW9kW2luc3QtPmZsYWdfc3VicmVnXSwgbiwgMCwgMCk7CisgICAgICAgICBsYXN0X2NvbmRpdGlvbmFsX21vZFtpbnN0LT5mbGFnX3N1YnJlZ10gPSBuOworICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+d3JpdGVzX2FjY3VtdWxhdG9yKSB7CisgICAgICAgICBpZiAoZ2VuNnBsdXMpIHsKKyAgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgICAgICBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlID0gbjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogYm90dG9tLXRvLXRvcCBkZXBlbmRlbmNpZXM6IFdBUiAqLworICAgbWVtc2V0KGxhc3RfZ3JmX3dyaXRlLCAwLCBzaXplb2YobGFzdF9ncmZfd3JpdGUpKTsKKyAgIG1lbXNldChsYXN0X21yZl93cml0ZSwgMCwgc2l6ZW9mKGxhc3RfbXJmX3dyaXRlKSk7CisgICBtZW1zZXQobGFzdF9jb25kaXRpb25hbF9tb2QsIDAsIHNpemVvZihsYXN0X2NvbmRpdGlvbmFsX21vZCkpOworICAgbGFzdF9hY2N1bXVsYXRvcl93cml0ZSA9IE5VTEw7CisgICBsYXN0X2ZpeGVkX2dyZl93cml0ZSA9IE5VTEw7CisKKyAgIGV4ZWNfbm9kZSAqbm9kZTsKKyAgIGV4ZWNfbm9kZSAqcHJldjsKKyAgIGZvciAobm9kZSA9IGluc3RydWN0aW9ucy5nZXRfdGFpbCgpLCBwcmV2ID0gbm9kZS0+cHJldjsKKyAgICAgICAgIW5vZGUtPmlzX2hlYWRfc2VudGluZWwoKTsKKyAgICAgICAgbm9kZSA9IHByZXYsIHByZXYgPSBub2RlLT5wcmV2KSB7CisgICAgICBzY2hlZHVsZV9ub2RlICpuID0gKHNjaGVkdWxlX25vZGUgKilub2RlOworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbi0+aW5zdDsKKworICAgICAgLyogd3JpdGUtYWZ0ZXItcmVhZCBkZXBzLiAqLworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgICAgIGlmIChwb3N0X3JlZ19hbGxvYykgeworICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByZWdfd2lkdGggKiBpbnN0LT5yZWdzX3JlYWQodiwgaSk7IHIrKykKKyAgICAgICAgICAgICAgICAgIGFkZF9kZXAoYnUsIG4sIGxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWcgKyByXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZzX2luc3QqIHdyaXRlciA9IGxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWddID8KKyAgICAgICAgICAgICAgICAgICAgKGZzX2luc3QqKWxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWddLT5pbnN0IDogMDsKKyAgICAgICAgICAgICAgICBmc19pbnN0KiByZWFkZXIgPSAoZnNfaW5zdCopbi0+aW5zdDsKKworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgJiYgd3JpdGVyKQorICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmxpY3QoJndyaXRlci0+ZHN0LCAgICB3cml0ZXItPnJlZ3Nfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXItPnNyY1tpXSwgcmVhZGVyLT5yZWdzX3JlYWQodiwgaSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RlcChidSwgbiwgbGFzdF9ncmZfd3JpdGVbaW5zdC0+c3JjW2ldLnJlZ10pOworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBIV19SRUcgJiYKKyAgICAgICAgICAgICAgICAgICAgKGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcuZmlsZSA9PQorICAgICAgICAgICAgICAgICAgICAgQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSkpIHsKKyAgICAgICAgICAgIGlmIChwb3N0X3JlZ19hbGxvYykgeworICAgICAgICAgICAgICAgaW50IHNpemUgPSByZWdfd2lkdGg7CisgICAgICAgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy52c3RyaWRlID09IEJSV19WRVJUSUNBTF9TVFJJREVfMCkKKyAgICAgICAgICAgICAgICAgIHNpemUgPSAxOworICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBzaXplOyByKyspCisgICAgICAgICAgICAgICAgICBhZGRfZGVwKGJ1LCBuLCBsYXN0X2dyZl93cml0ZVtpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLm5yICsgcl0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIGFkZF9kZXAoYnUsIG4sIGxhc3RfZml4ZWRfZ3JmX3dyaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSBpZiAoaW5zdC0+c3JjW2ldLmlzX2FjY3VtdWxhdG9yKCkgJiYgZ2VuNnBsdXMpIHsKKyAgICAgICAgICAgIGFkZF9kZXAoYnUsIG4sIGxhc3RfYWNjdW11bGF0b3Jfd3JpdGUpOworICAgICAgICAgfSBlbHNlIGlmIChpbnN0LT5zcmNbaV0uZmlsZSAhPSBCQURfRklMRSAmJgorICAgICAgICAgICAgICAgICAgICBpbnN0LT5zcmNbaV0uZmlsZSAhPSBJTU0gJiYKKyAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpbGUgIT0gVU5JRk9STSAmJgorICAgICAgICAgICAgICAgICAgICAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gSFdfUkVHIHx8CisgICAgICAgICAgICAgICAgICAgICBpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLmZpbGUgIT0gSU1NKSkgeworICAgICAgICAgICAgYXNzZXJ0KGluc3QtPnNyY1tpXS5maWxlICE9IE1SRik7CisgICAgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPmJhc2VfbXJmICE9IC0xKSB7CisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3QtPm1sZW47IGkrKykgeworICAgICAgICAgICAgLyogSXQgbG9va3MgbGlrZSB0aGUgTVJGIHJlZ3MgYXJlIHJlbGVhc2VkIGluIHRoZSBzZW5kCisgICAgICAgICAgICAgKiBpbnN0cnVjdGlvbiBvbmNlIGl0J3Mgc2VudCwgbm90IHdoZW4gdGhlIHJlc3VsdCBjb21lcworICAgICAgICAgICAgICogYmFjay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYWRkX2RlcChidSwgbiwgbGFzdF9tcmZfd3JpdGVbaW5zdC0+YmFzZV9tcmYgKyBpXSwgMiwgMik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5yZWFkc19mbGFnKCkpIHsKKyAgICAgICAgIGFkZF9kZXAoYnUsIG4sIGxhc3RfY29uZGl0aW9uYWxfbW9kW2luc3QtPmZsYWdfc3VicmVnXSk7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5yZWFkc19hY2N1bXVsYXRvcl9pbXBsaWNpdGx5KCkpIHsKKyAgICAgICAgIGlmIChnZW42cGx1cykgeworICAgICAgICAgICAgYWRkX2RlcChidSwgbiwgbGFzdF9hY2N1bXVsYXRvcl93cml0ZSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgdGhpbmdzIHRoaXMgaW5zdHJ1Y3Rpb24gd3JvdGUsIHNvIGVhcmxpZXIgcmVhZHMKKyAgICAgICAqIGNhbiBtYXJrIHRoaXMgYXMgV0FSIGRlcGVuZGVuY3kuCisgICAgICAgKi8KKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGlmIChwb3N0X3JlZ19hbGxvYykgeworICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBpbnN0LT5yZWdzX3dyaXR0ZW4gKiByZWdfd2lkdGg7IHIrKykKKyAgICAgICAgICAgICAgIGxhc3RfZ3JmX3dyaXRlW2luc3QtPmRzdC5yZWcgKyByXSA9IG47CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGFzdF9ncmZfd3JpdGVbaW5zdC0+ZHN0LnJlZ10gPSBuOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBNUkYpIHsKKyAgICAgICAgIGludCByZWcgPSBpbnN0LT5kc3QucmVnICYgfkJSV19NUkZfQ09NUFI0OworCisgICAgICAgICBsYXN0X21yZl93cml0ZVtyZWddID0gbjsKKworICAgICAgICAgaWYgKGlzX2NvbXByZXNzZWQoaW5zdCkpIHsKKyAgICAgICAgICAgIGlmIChpbnN0LT5kc3QucmVnICYgQlJXX01SRl9DT01QUjQpCisgICAgICAgICAgICAgICByZWcgKz0gNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJlZysrOworCisgICAgICAgICAgICBsYXN0X21yZl93cml0ZVtyZWddID0gbjsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gSFdfUkVHICYmCisgICAgICAgICAgICAgICAgIGluc3QtPmRzdC5maXhlZF9od19yZWcuZmlsZSA9PSBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFKSB7CisgICAgICAgICBpZiAocG9zdF9yZWdfYWxsb2MpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgcmVnX3dpZHRoOyByKyspCisgICAgICAgICAgICAgICBsYXN0X2dyZl93cml0ZVtpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLm5yICsgcl0gPSBuOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxhc3RfZml4ZWRfZ3JmX3dyaXRlID0gbjsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LmlzX2FjY3VtdWxhdG9yKCkgJiYgZ2VuNnBsdXMpIHsKKyAgICAgICAgIGxhc3RfYWNjdW11bGF0b3Jfd3JpdGUgPSBuOworICAgICAgfSBlbHNlIGlmIChpbnN0LT5kc3QuZmlsZSAhPSBCQURfRklMRSkgeworICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5tbGVuID4gMCAmJiBpbnN0LT5iYXNlX21yZiAhPSAtMSkgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LT5pbXBsaWVkX21yZl93cml0ZXMoaW5zdCk7IGkrKykgeworICAgICAgICAgICAgbGFzdF9tcmZfd3JpdGVbaW5zdC0+YmFzZV9tcmYgKyBpXSA9IG47CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT53cml0ZXNfZmxhZygpKSB7CisgICAgICAgICBsYXN0X2NvbmRpdGlvbmFsX21vZFtpbnN0LT5mbGFnX3N1YnJlZ10gPSBuOworICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+d3JpdGVzX2FjY3VtdWxhdG9yKSB7CisgICAgICAgICBpZiAoZ2VuNnBsdXMpIHsKKyAgICAgICAgICAgIGxhc3RfYWNjdW11bGF0b3Jfd3JpdGUgPSBuOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZF9iYXJyaWVyX2RlcHMoYnUsIG4pOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCit2b2lkCit2ZWM0X2luc3RydWN0aW9uX3NjaGVkdWxlcjo6Y2FsY3VsYXRlX2RlcHMoYm9vbCBidSkKK3sKKyAgIGNvbnN0IGJvb2wgZ2VuNnBsdXMgPSB2LT5icnctPmdlbiA+PSA2OworCisgICBzY2hlZHVsZV9ub2RlICpsYXN0X2dyZl93cml0ZVtncmZfY291bnRdOworICAgc2NoZWR1bGVfbm9kZSAqbGFzdF9tcmZfd3JpdGVbQlJXX01BWF9NUkZdOworICAgc2NoZWR1bGVfbm9kZSAqbGFzdF9jb25kaXRpb25hbF9tb2QgPSBOVUxMOworICAgc2NoZWR1bGVfbm9kZSAqbGFzdF9hY2N1bXVsYXRvcl93cml0ZSA9IE5VTEw7CisgICAvKiBGaXhlZCBIVyByZWdpc3RlcnMgYXJlIGFzc3VtZWQgdG8gYmUgc2VwYXJhdGUgZnJvbSB0aGUgdmlydHVhbAorICAgICogR1JGcywgc28gdGhleSBjYW4gYmUgdHJhY2tlZCBzZXBhcmF0ZWx5LiAgV2UgZG9uJ3QgcmVhbGx5IHdyaXRlCisgICAgKiB0byBmaXhlZCBHUkZzIG11Y2gsIHNvIGRvbid0IGJvdGhlciB0cmFja2luZyB0aGVtIG9uIGEgbW9yZQorICAgICogZ3JhbnVsYXIgbGV2ZWwuCisgICAgKi8KKyAgIHNjaGVkdWxlX25vZGUgKmxhc3RfZml4ZWRfZ3JmX3dyaXRlID0gTlVMTDsKKworICAgLyogVGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWx3YXlzIG5lZWRzIHRvIHN0aWxsIGJlIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAgICogRWl0aGVyIGl0J3MgZmxvdyBjb250cm9sIChJRiwgRUxTRSwgRU5ESUYsIERPLCBXSElMRSkgYW5kIHNjaGVkdWxpbmcKKyAgICAqIG90aGVyIHRoaW5ncyBhZnRlciBpdCB3b3VsZCBkaXN0dXJiIHRoZSBiYXNpYyBibG9jaywgb3IgaXQncyB0aGUgRU9UCisgICAgKiBVUkJfV1JJVEUgYW5kIHdlIHNob3VsZCBkbyBhIGJldHRlciBqb2IgYXQgZGVhZCBjb2RlIGVsaW1pbmF0aW5nCisgICAgKiBhbnl0aGluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBzY2hlZHVsZWQgYWZ0ZXIgaXQuCisgICAgKi8KKyAgIHNjaGVkdWxlX25vZGUgKmxhc3QgPSAoc2NoZWR1bGVfbm9kZSAqKWluc3RydWN0aW9ucy5nZXRfdGFpbCgpOworICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbGFzdCk7CisKKyAgIG1lbXNldChsYXN0X2dyZl93cml0ZSwgMCwgc2l6ZW9mKGxhc3RfZ3JmX3dyaXRlKSk7CisgICBtZW1zZXQobGFzdF9tcmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X21yZl93cml0ZSkpOworCisgICAvKiB0b3AtdG8tYm90dG9tIGRlcGVuZGVuY2llczogUkFXIGFuZCBXQVcuICovCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmluc3RydWN0aW9ucykgeworICAgICAgc2NoZWR1bGVfbm9kZSAqbiA9IChzY2hlZHVsZV9ub2RlICopbm9kZTsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW4tPmluc3Q7CisKKyAgICAgIGlmIChpbnN0LT5oYXNfc2lkZV9lZmZlY3RzKCkpCisgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKworICAgICAgLyogcmVhZC1hZnRlci13cml0ZSBkZXBzLiAqLworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfZ3JmX3dyaXRlW2luc3QtPnNyY1tpXS5yZWddLCBuKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gSFdfUkVHICYmCisgICAgICAgICAgICAgICAgICAgIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLmZpbGUgPT0KKyAgICAgICAgICAgICAgICAgICAgIEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpKSB7CisgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2ZpeGVkX2dyZl93cml0ZSwgbik7CisgICAgICAgICB9IGVsc2UgaWYgKGluc3QtPnNyY1tpXS5pc19hY2N1bXVsYXRvcigpICYmIGdlbjZwbHVzKSB7CisgICAgICAgICAgICBhc3NlcnQobGFzdF9hY2N1bXVsYXRvcl93cml0ZSk7CisgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gQkFEX0ZJTEUgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpbGUgIT0gSU1NICYmCisgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5maWxlICE9IFVOSUZPUk0pIHsKKyAgICAgICAgICAgIC8qIE5vIHJlYWRzIGZyb20gTVJGLCBhbmQgQVRUUiBpcyBhbHJlYWR5IHRyYW5zbGF0ZWQgYXdheSAqLworICAgICAgICAgICAgYXNzZXJ0KGluc3QtPnNyY1tpXS5maWxlICE9IE1SRiAmJgorICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5maWxlICE9IEFUVFIpOworICAgICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdC0+bWxlbjsgaSsrKSB7CisgICAgICAgICAvKiBJdCBsb29rcyBsaWtlIHRoZSBNUkYgcmVncyBhcmUgcmVsZWFzZWQgaW4gdGhlIHNlbmQKKyAgICAgICAgICAqIGluc3RydWN0aW9uIG9uY2UgaXQncyBzZW50LCBub3Qgd2hlbiB0aGUgcmVzdWx0IGNvbWVzCisgICAgICAgICAgKiBiYWNrLgorICAgICAgICAgICovCisgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X21yZl93cml0ZVtpbnN0LT5iYXNlX21yZiArIGldLCBuKTsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPnJlYWRzX2ZsYWcoKSkgeworICAgICAgICAgYXNzZXJ0KGxhc3RfY29uZGl0aW9uYWxfbW9kKTsKKyAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfY29uZGl0aW9uYWxfbW9kLCBuKTsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPnJlYWRzX2FjY3VtdWxhdG9yX2ltcGxpY2l0bHkoKSkgeworICAgICAgICAgaWYgKGdlbjZwbHVzKSB7CisgICAgICAgICAgICBhc3NlcnQobGFzdF9hY2N1bXVsYXRvcl93cml0ZSk7CisgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogd3JpdGUtYWZ0ZXItd3JpdGUgZGVwcy4gKi8KKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfZ3JmX3dyaXRlW2luc3QtPmRzdC5yZWddLCBuKTsKKyAgICAgICAgIGxhc3RfZ3JmX3dyaXRlW2luc3QtPmRzdC5yZWddID0gbjsKKyAgICAgIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gTVJGKSB7CisgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X21yZl93cml0ZVtpbnN0LT5kc3QucmVnXSwgbik7CisgICAgICAgICBsYXN0X21yZl93cml0ZVtpbnN0LT5kc3QucmVnXSA9IG47CisgICAgIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gSFdfUkVHICYmCisgICAgICAgICAgICAgICAgIGluc3QtPmRzdC5maXhlZF9od19yZWcuZmlsZSA9PSBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFKSB7CisgICAgICAgICBsYXN0X2ZpeGVkX2dyZl93cml0ZSA9IG47CisgICAgICB9IGVsc2UgaWYgKGluc3QtPmRzdC5pc19hY2N1bXVsYXRvcigpICYmIGdlbjZwbHVzKSB7CisgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgIGxhc3RfYWNjdW11bGF0b3Jfd3JpdGUgPSBuOworICAgICAgfSBlbHNlIGlmIChpbnN0LT5kc3QuZmlsZSAhPSBCQURfRklMRSkgeworICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5tbGVuID4gMCkgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LT5pbXBsaWVkX21yZl93cml0ZXMoaW5zdCk7IGkrKykgeworICAgICAgICAgICAgYWRkX2RlcChidSwgbGFzdF9tcmZfd3JpdGVbaW5zdC0+YmFzZV9tcmYgKyBpXSwgbik7CisgICAgICAgICAgICBsYXN0X21yZl93cml0ZVtpbnN0LT5iYXNlX21yZiArIGldID0gbjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPndyaXRlc19mbGFnKCkpIHsKKyAgICAgICAgIGFkZF9kZXAoYnUsIGxhc3RfY29uZGl0aW9uYWxfbW9kLCBuLCAwLCAwKTsKKyAgICAgICAgIGxhc3RfY29uZGl0aW9uYWxfbW9kID0gbjsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPndyaXRlc19hY2N1bXVsYXRvcikgeworICAgICAgICAgaWYgKGdlbjZwbHVzKSB7CisgICAgICAgICAgICBhZGRfZGVwKGJ1LCBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlLCBuKTsKKyAgICAgICAgICAgIGxhc3RfYWNjdW11bGF0b3Jfd3JpdGUgPSBuOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZF9iYXJyaWVyX2RlcHMoYnUsIG4pOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBib3R0b20tdG8tdG9wIGRlcGVuZGVuY2llczogV0FSICovCisgICBtZW1zZXQobGFzdF9ncmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X2dyZl93cml0ZSkpOworICAgbWVtc2V0KGxhc3RfbXJmX3dyaXRlLCAwLCBzaXplb2YobGFzdF9tcmZfd3JpdGUpKTsKKyAgIGxhc3RfY29uZGl0aW9uYWxfbW9kID0gTlVMTDsKKyAgIGxhc3RfYWNjdW11bGF0b3Jfd3JpdGUgPSBOVUxMOworICAgbGFzdF9maXhlZF9ncmZfd3JpdGUgPSBOVUxMOworCisgICBleGVjX25vZGUgKm5vZGU7CisgICBleGVjX25vZGUgKnByZXY7CisgICBmb3IgKG5vZGUgPSBpbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKSwgcHJldiA9IG5vZGUtPnByZXY7CisgICAgICAgICFub2RlLT5pc19oZWFkX3NlbnRpbmVsKCk7CisgICAgICAgIG5vZGUgPSBwcmV2LCBwcmV2ID0gbm9kZS0+cHJldikgeworICAgICAgc2NoZWR1bGVfbm9kZSAqbiA9IChzY2hlZHVsZV9ub2RlICopbm9kZTsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW4tPmluc3Q7CisKKyAgICAgIC8qIHdyaXRlLWFmdGVyLXJlYWQgZGVwcy4gKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gR1JGKSB7CisgICAgICAgICAgICBhZGRfZGVwKGJ1LCBuLCBsYXN0X2dyZl93cml0ZVtpbnN0LT5zcmNbaV0ucmVnXSk7CisgICAgICAgICB9IGVsc2UgaWYgKGluc3QtPnNyY1tpXS5maWxlID09IEhXX1JFRyAmJgorICAgICAgICAgICAgICAgICAgICAoaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5maWxlID09CisgICAgICAgICAgICAgICAgICAgICBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFKSkgeworICAgICAgICAgICAgYWRkX2RlcChidSwgbiwgbGFzdF9maXhlZF9ncmZfd3JpdGUpOworICAgICAgICAgfSBlbHNlIGlmIChpbnN0LT5zcmNbaV0uaXNfYWNjdW11bGF0b3IoKSAmJiBnZW42cGx1cykgeworICAgICAgICAgICAgYWRkX2RlcChidSwgbiwgbGFzdF9hY2N1bXVsYXRvcl93cml0ZSk7CisgICAgICAgICB9IGVsc2UgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IEJBRF9GSUxFICYmCisgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5maWxlICE9IElNTSAmJgorICAgICAgICAgICAgICAgICAgICBpbnN0LT5zcmNbaV0uZmlsZSAhPSBVTklGT1JNKSB7CisgICAgICAgICAgICBhc3NlcnQoaW5zdC0+c3JjW2ldLmZpbGUgIT0gTVJGICYmCisgICAgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLmZpbGUgIT0gQVRUUik7CisgICAgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0LT5tbGVuOyBpKyspIHsKKyAgICAgICAgIC8qIEl0IGxvb2tzIGxpa2UgdGhlIE1SRiByZWdzIGFyZSByZWxlYXNlZCBpbiB0aGUgc2VuZAorICAgICAgICAgICogaW5zdHJ1Y3Rpb24gb25jZSBpdCdzIHNlbnQsIG5vdCB3aGVuIHRoZSByZXN1bHQgY29tZXMKKyAgICAgICAgICAqIGJhY2suCisgICAgICAgICAgKi8KKyAgICAgICAgIGFkZF9kZXAoYnUsIG4sIGxhc3RfbXJmX3dyaXRlW2luc3QtPmJhc2VfbXJmICsgaV0sIDIsIDIpOworICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+cmVhZHNfZmxhZygpKSB7CisgICAgICAgICBhZGRfZGVwKGJ1LCBuLCBsYXN0X2NvbmRpdGlvbmFsX21vZCk7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5yZWFkc19hY2N1bXVsYXRvcl9pbXBsaWNpdGx5KCkpIHsKKyAgICAgICAgIGlmIChnZW42cGx1cykgeworICAgICAgICAgICAgYWRkX2RlcChidSwgbiwgbGFzdF9hY2N1bXVsYXRvcl93cml0ZSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkX2JhcnJpZXJfZGVwcyhidSwgbik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgdGhpbmdzIHRoaXMgaW5zdHJ1Y3Rpb24gd3JvdGUsIHNvIGVhcmxpZXIgcmVhZHMKKyAgICAgICAqIGNhbiBtYXJrIHRoaXMgYXMgV0FSIGRlcGVuZGVuY3kuCisgICAgICAgKi8KKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGxhc3RfZ3JmX3dyaXRlW2luc3QtPmRzdC5yZWddID0gbjsKKyAgICAgIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gTVJGKSB7CisgICAgICAgICBsYXN0X21yZl93cml0ZVtpbnN0LT5kc3QucmVnXSA9IG47CisgICAgICB9IGVsc2UgaWYgKGluc3QtPmRzdC5maWxlID09IEhXX1JFRyAmJgorICAgICAgICAgICAgICAgICBpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLmZpbGUgPT0gQlJXX0dFTkVSQUxfUkVHSVNURVJfRklMRSkgeworICAgICAgICAgbGFzdF9maXhlZF9ncmZfd3JpdGUgPSBuOworICAgICAgfSBlbHNlIGlmIChpbnN0LT5kc3QuaXNfYWNjdW11bGF0b3IoKSAmJiBnZW42cGx1cykgeworICAgICAgICAgbGFzdF9hY2N1bXVsYXRvcl93cml0ZSA9IG47CisgICAgICB9IGVsc2UgaWYgKGluc3QtPmRzdC5maWxlICE9IEJBRF9GSUxFKSB7CisgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPm1sZW4gPiAwKSB7CisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYtPmltcGxpZWRfbXJmX3dyaXRlcyhpbnN0KTsgaSsrKSB7CisgICAgICAgICAgICBsYXN0X21yZl93cml0ZVtpbnN0LT5iYXNlX21yZiArIGldID0gbjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPndyaXRlc19mbGFnKCkpIHsKKyAgICAgICAgIGxhc3RfY29uZGl0aW9uYWxfbW9kID0gbjsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPndyaXRlc19hY2N1bXVsYXRvcikgeworICAgICAgICAgaWYgKGdlbjZwbHVzKSB7CisgICAgICAgICAgICBsYXN0X2FjY3VtdWxhdG9yX3dyaXRlID0gbjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRfYmFycmllcl9kZXBzKGJ1LCBuKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworc2NoZWR1bGVfbm9kZSAqCitmc19pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OmNob29zZV9pbnN0cnVjdGlvbl90b19zY2hlZHVsZV9jbGFzc2ljKCkKK3sKKyAgIHNjaGVkdWxlX25vZGUgKmNob3NlbiA9IE5VTEw7CisKKyAgIGlmIChtb2RlID09IFNDSEVEVUxFX1BSRSB8fCBtb2RlID09IFNDSEVEVUxFX1BPU1QpIHsKKyAgICAgIGludCBjaG9zZW5fdGltZSA9IDA7CisKKyAgICAgIC8qIE9mIHRoZSBpbnN0cnVjdGlvbnMgcmVhZHkgdG8gZXhlY3V0ZSBvciB0aGUgY2xvc2VzdCB0bworICAgICAgICogYmVpbmcgcmVhZHksIGNob29zZSB0aGUgb2xkZXN0IG9uZS4KKyAgICAgICAqLworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsICZpbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgIHNjaGVkdWxlX25vZGUgKm4gPSAoc2NoZWR1bGVfbm9kZSAqKW5vZGU7CisKKyAgICAgICAgIGlmICghY2hvc2VuIHx8IG4tPnVuYmxvY2tlZF90aW1lIDwgY2hvc2VuX3RpbWUpIHsKKyAgICAgICAgICAgIGNob3NlbiA9IG47CisgICAgICAgICAgICBjaG9zZW5fdGltZSA9IG4tPnVuYmxvY2tlZF90aW1lOworICAgICAgICAgfQorICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIC8qIEJlZm9yZSByZWdpc3RlciBhbGxvY2F0aW9uLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBsYXRlbmNpZXMgb2YKKyAgICAgICAqIGluc3RydWN0aW9ucy4gIEFsbCB3ZSBjYXJlIGFib3V0IGlzIHJlZHVjaW5nIGxpdmUgaW50ZXJ2YWxzIG9mCisgICAgICAgKiB2YXJpYWJsZXMgc28gdGhhdCB3ZSBjYW4gYXZvaWQgcmVnaXN0ZXIgc3BpbGxpbmcsIG9yIGdldCBTSU1EMTYKKyAgICAgICAqIHNoYWRlcnMgd2hpY2ggbmF0dXJhbGx5IGRvIGEgYmV0dGVyIGpvYiBvZiBoaWRpbmcgaW5zdHJ1Y3Rpb24KKyAgICAgICAqIGxhdGVuY3kuCisgICAgICAgKi8KKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCAmaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICBzY2hlZHVsZV9ub2RlICpuID0gKHNjaGVkdWxlX25vZGUgKilub2RlOworICAgICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbi0+aW5zdDsKKworICAgICAgICAgaWYgKCFjaG9zZW4pIHsKKyAgICAgICAgICAgIGNob3NlbiA9IG47CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogTW9zdCBpbXBvcnRhbnQ6IElmIHdlIGNhbiBkZWZpbml0ZWx5IHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZSwgZG8KKyAgICAgICAgICAqIHNvIGltbWVkaWF0ZWx5LgorICAgICAgICAgICovCisgICAgICAgICBmbG9hdCByZWdpc3Rlcl9wcmVzc3VyZV9iZW5lZml0ID0gZ2V0X3JlZ2lzdGVyX3ByZXNzdXJlX2JlbmVmaXQobi0+aW5zdCwgZmFsc2UpOworICAgICAgICAgZmxvYXQgY2hvc2VuX3JlZ2lzdGVyX3ByZXNzdXJlX2JlbmVmaXQgPQorICAgICAgICAgICAgZ2V0X3JlZ2lzdGVyX3ByZXNzdXJlX2JlbmVmaXQoY2hvc2VuLT5pbnN0LCBmYWxzZSk7CisKKyAgICAgICAgIGlmIChyZWdpc3Rlcl9wcmVzc3VyZV9iZW5lZml0ID4gMCAmJgorICAgICAgICAgICAgIHJlZ2lzdGVyX3ByZXNzdXJlX2JlbmVmaXQgPiBjaG9zZW5fcmVnaXN0ZXJfcHJlc3N1cmVfYmVuZWZpdCkgeworICAgICAgICAgICAgY2hvc2VuID0gbjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfSBlbHNlIGlmIChjaG9zZW5fcmVnaXN0ZXJfcHJlc3N1cmVfYmVuZWZpdCA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgKHJlZ2lzdGVyX3ByZXNzdXJlX2JlbmVmaXQgPAorICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JlZ2lzdGVyX3ByZXNzdXJlX2JlbmVmaXQpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKG1vZGUgPT0gU0NIRURVTEVfUFJFX0xJRk8pIHsKKyAgICAgICAgICAgIC8qIFByZWZlciBpbnN0cnVjdGlvbnMgdGhhdCByZWNlbnRseSBiZWNhbWUgYXZhaWxhYmxlIGZvcgorICAgICAgICAgICAgICogc2NoZWR1bGluZy4gIFRoZXNlIGFyZSB0aGUgdGhpbmdzIHRoYXQgYXJlIG1vc3QgbGlrZWx5IHRvCisgICAgICAgICAgICAgKiAoZXZlbnR1YWxseSkgbWFrZSBhIHZhcmlhYmxlIGRlYWQgYW5kIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZS4KKyAgICAgICAgICAgICAqIFR5cGljYWwgcmVnaXN0ZXIgcHJlc3N1cmUgZXN0aW1hdGVzIGRvbid0IHdvcmsgZm9yIHVzIGJlY2F1c2UKKyAgICAgICAgICAgICAqIG1vc3Qgb2Ygb3VyIHByZXNzdXJlIGNvbWVzIGZyb20gdGV4dHVyaW5nLCB3aGVyZSBubyBzaW5nbGUKKyAgICAgICAgICAgICAqIGluc3RydWN0aW9uIHRvIHNjaGVkdWxlIHdpbGwgbWFrZSBhIHZlYzQgdmFsdWUgZGVhZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG4tPmNhbmRfZ2VuZXJhdGlvbiA+IGNob3Nlbi0+Y2FuZF9nZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICBjaG9zZW4gPSBuOworICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4tPmNhbmRfZ2VuZXJhdGlvbiA8IGNob3Nlbi0+Y2FuZF9nZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogT24gTVJGLXVzaW5nIGNoaXBzLCBwcmVmZXIgbm9uLVNFTkQgaW5zdHJ1Y3Rpb25zLiAgSWYgd2UgZG9uJ3QKKyAgICAgICAgICAgICAqIGRvIHRoaXMsIHRoZW4gYmVjYXVzZSB3ZSBwcmVmZXIgaW5zdHJ1Y3Rpb25zIHRoYXQganVzdCBiZWNhbWUKKyAgICAgICAgICAgICAqIGNhbmRpZGF0ZXMsIHdlJ2xsIGVuZCB1cCBpbiBhIHBhdHRlcm4gb2Ygc2NoZWR1bGluZyBhIFNFTkQsCisgICAgICAgICAgICAgKiB0aGVuIHRoZSBNUkZzIGZvciB0aGUgbmV4dCBTRU5ELCB0aGVuIHRoZSBuZXh0IFNFTkQsIHRoZW4gdGhlCisgICAgICAgICAgICAgKiBNUkZzLCBldGMuLCB3aXRob3V0IGV2ZXIgY29uc3VtaW5nIHRoZSByZXN1bHRzIG9mIGEgc2VuZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHYtPmJydy0+Z2VuIDwgNykgeworICAgICAgICAgICAgICAgZnNfaW5zdCAqY2hvc2VuX2luc3QgPSAoZnNfaW5zdCAqKWNob3Nlbi0+aW5zdDsKKworICAgICAgICAgICAgICAgLyogV2UgdXNlIHJlZ3Nfd3JpdHRlbiA+IDEgYXMgb3VyIHRlc3QgZm9yIHRoZSBraW5kIG9mIHNlbmQKKyAgICAgICAgICAgICAgICAqIGluc3RydWN0aW9uIHRvIGF2b2lkIC0tIG9ubHkgc2VuZHMgZ2VuZXJhdGUgbWFueSByZWdzLCBhbmQgYQorICAgICAgICAgICAgICAgICogc2luZ2xlLXJlc3VsdCBzZW5kIGlzIHByb2JhYmx5IGFjdHVhbGx5IHJlZHVjaW5nIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgKiBwcmVzc3VyZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKGluc3QtPnJlZ3Nfd3JpdHRlbiA8PSAxICYmIGNob3Nlbl9pbnN0LT5yZWdzX3dyaXR0ZW4gPiAxKSB7CisgICAgICAgICAgICAgICAgICBjaG9zZW4gPSBuOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3QtPnJlZ3Nfd3JpdHRlbiA+IGNob3Nlbl9pbnN0LT5yZWdzX3dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICAvKiBGb3IgaW5zdHJ1Y3Rpb25zIHB1c2hlZCBvbiB0aGUgY2FuZHMgbGlzdCBhdCB0aGUgc2FtZSB0aW1lLCBwcmVmZXIKKyAgICAgICAgICAqIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBkZWxheSB0byB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtLiAgVGhpcyBpcworICAgICAgICAgICogbW9zdCBsaWtlbHkgdG8gaGF2ZSBpdHMgdmFsdWVzIGFibGUgdG8gYmUgY29uc3VtZWQgZmlyc3QgKHN1Y2ggYXMKKyAgICAgICAgICAqIGZvciBhIGxhcmdlIHRyZWUgb2YgbG93ZXJlZCB1Ym8gbG9hZHMsIHdoaWNoIGFwcGVhciByZXZlcnNlZCBpbgorICAgICAgICAgICogdGhlIGluc3RydWN0aW9uIHN0cmVhbSB3aXRoIHJlc3BlY3QgdG8gd2hlbiB0aGV5IGNhbiBiZSBjb25zdW1lZCkuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChuLT5kZWxheSA+IGNob3Nlbi0+ZGVsYXkpIHsKKyAgICAgICAgICAgIGNob3NlbiA9IG47CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0gZWxzZSBpZiAobi0+ZGVsYXkgPCBjaG9zZW4tPmRlbGF5KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogSWYgYWxsIG90aGVyIG1ldHJpY3MgYXJlIGVxdWFsLCB3ZSBwcmVmZXIgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluCisgICAgICAgICAgKiB0aGUgbGlzdCAocHJvZ3JhbSBleGVjdXRpb24pLgorICAgICAgICAgICovCisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBjaG9zZW47Cit9CisKK3NjaGVkdWxlX25vZGUgKgorZnNfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjpjaG9vc2VfaW5zdHJ1Y3Rpb25fdG9fc2NoZWR1bGVfdGQoKQoreworICAgaWYgKCF1c2VfaXBzKG1vZGUpKQorICAgICAgcmV0dXJuIGNob29zZV9pbnN0cnVjdGlvbl90b19zY2hlZHVsZV9jbGFzc2ljKCk7CisKKyAgIHNjaGVkdWxlX25vZGUgKmNob3NlbiA9IE5VTEw7CisgICBzY2hlZHVsZV9ub2RlICpmaXJzdCA9IE5VTEw7CisKKyAgIGNvbnN0IGZsb2F0IGRhdGFfcHJlc3N1cmVfZnJhY3Rpb24gID0gY3VycmVudF9ibG9ja19wcmVzc3VyZSAvIGFsbG9jYXRhYmxlX2dyZnM7CisgICBjb25zdCBib29sICBkYXRhX3ByZXNzdXJlX3BhbmljID0gZGF0YV9wcmVzc3VyZV9mcmFjdGlvbiA+IHByZXNzdXJlX3BhbmljX3RocmVzaG9sZDsKKyAgIGZsb2F0IGNob3Nlbl93ZWlnaHQgPSAtMWUxMGY7CisKKyAgIGludCBjaG9zZW5fdGltZSA9IDA7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBzY2hlZHVsZV9ub2RlICpuID0gKHNjaGVkdWxlX25vZGUgKilub2RlOworICAgICAgaWYgKCFjaG9zZW4pCisgICAgICAgICBjaG9zZW4gPSBuOworCisgICAgICBpZiAoIWZpcnN0KQorICAgICAgICAgZmlyc3QgPSBuOworCisgICAgICBpZiAodXNlX2lwcyhtb2RlKSkgeworICAgICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbi0+aW5zdDsKKworICAgICAgICAgY29uc3QgYm9vbCBwYXJ0aWFsbHlfc2NoZWR1bGVkID0gaXNfcGFydGlhbGx5X3NjaGVkdWxlZChpbnN0KTsKKyAgICAgICAgIGNvbnN0IGZsb2F0IHByZXNzdXJlX3JlZHVjdGlvbiA9IGdldF9yZWdpc3Rlcl9wcmVzc3VyZV9iZW5lZml0KGluc3QsIGZhbHNlKTsKKworICAgICAgICAgLy8gV2VpZ2h0aW5nIGZhY3RvcnMsIGNsYW1wZWQgdG8gWy0xLi4xXQorICAgICAgICAgY29uc3QgZmxvYXQgbGF0ZW5jeV9mYWN0b3IgICAgID0gY2xhbXAwMShuLT5wbGF0ZW5jeSAvIDI1LjBmKTsKKyAgICAgICAgIGNvbnN0IGZsb2F0IHByZXNzdXJlX2ZhY3RvciAgICA9IGNsYW1wMDEocHJlc3N1cmVfcmVkdWN0aW9uIC8gNC4wZik7CisgICAgICAgICBjb25zdCBmbG9hdCBwYXJ0aWFsX2ZhY3RvciAgICAgPSBwYXJ0aWFsbHlfc2NoZWR1bGVkID8gMS4wZiA6IDAuMGY7CisgICAgICAgICBjb25zdCBmbG9hdCBsb2NhbGl0eV9mYWN0b3IgICAgPSAocHJldmlvdXNfY2hvc2VuICYmIGNvbnN1bWVzX2RzdChwcmV2aW91c19jaG9zZW4tPmluc3QsIGluc3QpKSA/IDEuMGYgOiAwLjBmOworICAgICAgICAgY29uc3QgZmxvYXQgZ2VuZXJhdGlvbl9mYWN0b3IgID0gY2xhbXAwMSgobi0+Y2FuZF9nZW5lcmF0aW9uIC0gZmlyc3QtPmNhbmRfZ2VuZXJhdGlvbikgLyAyMC4wZik7CisgICAgICAgICBjb25zdCBmbG9hdCBkZWxheV9mYWN0b3IgICAgICAgPSBjbGFtcDAxKChuLT5kZWxheSAtIGZpcnN0LT5kZWxheSkgLyAxMDAuMGYpOworICAgICAgICAgY29uc3QgZmxvYXQgdW5ibG9ja2VkX2ZhY3RvciAgID0gY2xhbXAwMSgobi0+dW5ibG9ja2VkX3B0aW1lIC0gcHRpbWUpIC8gMjAuMGYpOworCisgICAgICAgICBmbG9hdCB3ZWlnaHQ7CisKKyAgICAgICAgIGlmIChkYXRhX3ByZXNzdXJlX3BhbmljKSB7CisgICAgICAgICAgICB3ZWlnaHQgPQorICAgICAgICAgICAgICAgbGF0ZW5jeV9mYWN0b3IgICAgICogLTEwMC4wZiArCisgICAgICAgICAgICAgICBwcmVzc3VyZV9mYWN0b3IgICAgKiAgIDIwLjBmICArCisgICAgICAgICAgICAgICBwYXJ0aWFsX2ZhY3RvciAgICAgKiAgIDIwLjBmICArCisgICAgICAgICAgICAgICBsb2NhbGl0eV9mYWN0b3IgICAgKiAgICAxLjBmICArCisgICAgICAgICAgICAgICBnZW5lcmF0aW9uX2ZhY3RvciAgKiAgIDEwLjBmICArCisgICAgICAgICAgICAgICBkZWxheV9mYWN0b3IgICAgICAgKiAgICAwLjBmICArCisgICAgICAgICAgICAgICB1bmJsb2NrZWRfZmFjdG9yICAgKiAgIDEwLjBmICArCisgICAgICAgICAgICAgICAwLjBmOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdlaWdodCA9CisgICAgICAgICAgICAgICBkZWxheV9mYWN0b3IgICAgICAgKiAgNTAwLjBmICsKKyAgICAgICAgICAgICAgIHVuYmxvY2tlZF9mYWN0b3IgICAqIC0yMDAuMGYgKworICAgICAgICAgICAgICAgbGF0ZW5jeV9mYWN0b3IgICAgICogIDEwMC4wZiArCisgICAgICAgICAgICAgICAwLjBmOworCisgICAgICAgICB9CisKKyAgICAgICAgIGlmICh3ZWlnaHQgPiBjaG9zZW5fd2VpZ2h0KSB7CisgICAgICAgICAgICBjaG9zZW5fd2VpZ2h0ID0gd2VpZ2h0OworICAgICAgICAgICAgY2hvc2VuID0gbjsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhY3RvcnM6IFc9JTcuMmY6ICU1LjJmICU1LjJmICVzOiAiLAorICAgICAgICAgICAgICAgICAgICB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGRlbGF5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgdW5ibG9ja2VkX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9wcmVzc3VyZV9wYW5pYyA/ICIhIiA6ICIiKTsKKyAgICAgICAgICAgIGJ2LT5kdW1wX2luc3RydWN0aW9uKGluc3QpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsgLy8gbm90IG1vZGUgPT0gU0NIRURVTEVfUFJFX0lQUworICAgICAgICAgaWYgKG4tPnVuYmxvY2tlZF90aW1lIDwgY2hvc2VuX3RpbWUpIHsKKyAgICAgICAgICAgIGNob3NlbiA9IG47CisgICAgICAgICAgICBjaG9zZW5fdGltZSA9IG4tPnVuYmxvY2tlZF90aW1lOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gY2hvc2VuOworfQorCitzY2hlZHVsZV9ub2RlICoKK2ZzX2luc3RydWN0aW9uX3NjaGVkdWxlcjo6Y2hvb3NlX2luc3RydWN0aW9uX3RvX3NjaGVkdWxlX2J1KCkKK3sKKyAgIHNjaGVkdWxlX25vZGUgKmNob3NlbiA9IE5VTEw7CisgICBzY2hlZHVsZV9ub2RlICpmaXJzdCA9IE5VTEw7CisgICBmbG9hdCBjaG9zZW5fd2VpZ2h0ID0gLTFlMTA7CisKKyAgIGNvbnN0IGJvb2wgZGF0YV9wcmVzc3VyZV9wYW5pYyA9IGN1cnJlbnRfYmxvY2tfcHJlc3N1cmUgPiAoYWxsb2NhdGFibGVfZ3JmcyAqIHByZXNzdXJlX3BhbmljX3RocmVzaG9sZCk7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBzY2hlZHVsZV9ub2RlICpuID0gKHNjaGVkdWxlX25vZGUgKilub2RlOworICAgICAgZnNfaW5zdCAqaW5zdCA9IChmc19pbnN0ICopbi0+aW5zdDsKKworICAgICAgaWYgKCFmaXJzdCkKKyAgICAgICAgIGZpcnN0ID0gbjsKKworICAgICAgaWYgKCFjaG9zZW4pCisgICAgICAgICBjaG9zZW4gPSBuOworCisgICAgICBjb25zdCBmbG9hdCBwcmVzc3VyZV9yZWR1Y3Rpb24gPSBnZXRfcmVnaXN0ZXJfcHJlc3N1cmVfYmVuZWZpdChpbnN0LCB0cnVlKTsKKworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikKKyAgICAgICAgIGFzc2VydChpbnN0LT5kc3QucmVnIDwgdi0+dmlydHVhbF9ncmZfY291bnQpOworCisgICAgICBjb25zdCBmbG9hdCBsaWZldGltZV9mYWN0b3IgICAgPSAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKSA/CisgICAgICAgICBjbGFtcDAxKCh2LT52aXJ0dWFsX2dyZl9lbmRbaW5zdC0+ZHN0LnJlZ10gLSB2LT52aXJ0dWFsX2dyZl9zdGFydFtpbnN0LT5kc3QucmVnXSkgLyAyMDAuMGYpIDogMC4wZjsKKyAgICAgIGNvbnN0IGZsb2F0IHByZXNzdXJlX2ZhY3RvciAgICA9IGNsYW1wMDEocHJlc3N1cmVfcmVkdWN0aW9uIC8gNC4wZik7CisgICAgICBjb25zdCBmbG9hdCBkZWxheV9mYWN0b3IgICAgICAgPSBjbGFtcDAxKChuLT5kZWxheSAtIGZpcnN0LT5kZWxheSkgLyAxMDAuMGYpOworICAgICAgY29uc3QgZmxvYXQgcGFyZW50X2ZhY3RvciAgICAgID0gY2xhbXAwMShuLT5wYXJlbnRfY291bnQgLyAyMC4wZik7CisgICAgICBjb25zdCBmbG9hdCBwYXJ0aWFsX2ZhY3RvciAgICAgPSBpbnN0LT5kc3QuZmlsZSA9PSBHUkYgPyBjbGFtcDAxKHJlbWFpbmluZ19ncmZfdXNlc1tpbnN0LT5kc3QucmVnXSAvIDQuMCkgOiAwLjBmOworICAgICAgY29uc3QgZmxvYXQgdW5ibG9ja2VkX2ZhY3RvciAgID0gY2xhbXAwMSgobi0+dW5ibG9ja2VkX3B0aW1lIC0gcHRpbWUpIC8gMjAuMGYpOworICAgICAgY29uc3QgZmxvYXQgcGFuaWNfZmFjdG9yICAgICAgID0gKChjdXJyZW50X2Jsb2NrX3ByZXNzdXJlIC8gZmxvYXQoYWxsb2NhdGFibGVfZ3JmcyAqIHByZXNzdXJlX3BhbmljX3RocmVzaG9sZCkpIC0gMS4wZikgLworICAgICAgICAgKDEuMGYgLSBwcmVzc3VyZV9wYW5pY190aHJlc2hvbGQpOworICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0X2ZhY3RvciAgICAgID0gKGluc3QtPnNyY1swXS5maWxlID09IEdSRikgPyBpbnN0LT5zcmNbMF0ucmVnX29mZnNldCA6IDAuMGY7CisKKyAgICAgIGZsb2F0IHdlaWdodCA9IDAuMGY7CisKKyAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0xJTUlUOgorICAgICAgICAgd2VpZ2h0ID0KKyAgICAgICAgICAgIGxpZmV0aW1lX2ZhY3RvciAqICAgMTAwLjBmOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNDSEVEVUxFX1BSRV9JUFNfQlVfSEk6ICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX01IOiAgICAvLyAuLi4KKyAgICAgIGNhc2UgU0NIRURVTEVfUFJFX0lQU19CVV9NRDogICAgLy8gLi4uCisgICAgICBjYXNlIFNDSEVEVUxFX1BSRV9JUFNfQlVfTUw6ICAgIC8vIC4uLgorICAgICAgY2FzZSBTQ0hFRFVMRV9QUkVfSVBTX0JVX0xPOgorICAgICAgICAgaWYgKGRhdGFfcHJlc3N1cmVfcGFuaWMpIHsKKyAgICAgICAgICAgIHdlaWdodCA9CisgICAgICAgICAgICAgICBwcmVzc3VyZV9mYWN0b3IgICogICBsZXJwKDUwLjBmLCAxMDAuMGYsIHBhbmljX2ZhY3RvcikgKworICAgICAgICAgICAgICAgdW5ibG9ja2VkX2ZhY3RvciAqICAgbGVycCgtNzAuMGYsIC01MC4wZiwgcGFuaWNfZmFjdG9yKSArCisgICAgICAgICAgICAgICBkZWxheV9mYWN0b3IgICAgICogICBsZXJwKDUwLjBmLCAyMC4wZiwgcGFuaWNfZmFjdG9yKSArCisgICAgICAgICAgICAgICBsaWZldGltZV9mYWN0b3IgICogICAgMTAuMGYgKworICAgICAgICAgICAgICAgb2Zmc2V0X2ZhY3RvciAgICAqICAgICA1LjBmICsKKyAgICAgICAgICAgICAgIDAuMDsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3ZWlnaHQgPQorICAgICAgICAgICAgICAgZGVsYXlfZmFjdG9yICAgICAqICAgIDUwLjBmICsKKyAgICAgICAgICAgICAgIHVuYmxvY2tlZF9mYWN0b3IgKiAgIC03MC4wZiArCisgICAgICAgICAgICAgICBwYXJ0aWFsX2ZhY3RvciAgICogICAgNTAuMGYgKworICAgICAgICAgICAgICAgcHJlc3N1cmVfZmFjdG9yICAqICAgICA1LjBmICsKKyAgICAgICAgICAgICAgIG9mZnNldF9mYWN0b3IgICAgKiAgICAgNS4wZiArCisgICAgICAgICAgICAgICAwLjA7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgIHdlaWdodCA9IGxpZmV0aW1lX2ZhY3RvciAqICAgMTAwLjBmOworICAgICAgfQorCisgICAgICBpZiAoZGVidWcgJiYgZGV0YWlsX2RlYnVnKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJVIGZhY3RvcnM6IFc9JTcuMmY6IEQ9JTUuMmYgTD0lNS4yZiBQPSU1LjJmIHBhcmVudHM9JTUuMmYgUGFydD0lNS4yZjogIiwKKyAgICAgICAgICAgICAgICAgd2VpZ2h0LAorICAgICAgICAgICAgICAgICBkZWxheV9mYWN0b3IsCisgICAgICAgICAgICAgICAgIGxpZmV0aW1lX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgcHJlc3N1cmVfZmFjdG9yLAorICAgICAgICAgICAgICAgICBwYXJlbnRfZmFjdG9yLAorICAgICAgICAgICAgICAgICBwYXJ0aWFsX2ZhY3Rvcik7CisgICAgICAgICBidi0+ZHVtcF9pbnN0cnVjdGlvbihpbnN0KTsKKyAgICAgIH0KKworICAgICAgaWYgKHdlaWdodCA+PSBjaG9zZW5fd2VpZ2h0KSB7CisgICAgICAgICBjaG9zZW5fd2VpZ2h0ID0gd2VpZ2h0OworICAgICAgICAgY2hvc2VuID0gbjsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIChzY2hlZHVsZV9ub2RlKiljaG9zZW47Cit9CisKK3NjaGVkdWxlX25vZGUgKgordmVjNF9pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OmNob29zZV9pbnN0cnVjdGlvbl90b19zY2hlZHVsZV9idSgpCit7CisgICByZXR1cm4gY2hvb3NlX2luc3RydWN0aW9uX3RvX3NjaGVkdWxlX3RkKCk7ICAgLy8gVE9ETzogLi4uCit9CisKK3NjaGVkdWxlX25vZGUgKgordmVjNF9pbnN0cnVjdGlvbl9zY2hlZHVsZXI6OmNob29zZV9pbnN0cnVjdGlvbl90b19zY2hlZHVsZV90ZCgpCit7CisgICBzY2hlZHVsZV9ub2RlICpjaG9zZW4gPSBOVUxMOworICAgaW50IGNob3Nlbl90aW1lID0gMDsKKworICAgLyogT2YgdGhlIGluc3RydWN0aW9ucyByZWFkeSB0byBleGVjdXRlIG9yIHRoZSBjbG9zZXN0IHRvIGJlaW5nIHJlYWR5LAorICAgICogY2hvb3NlIHRoZSBvbGRlc3Qgb25lLgorICAgICovCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmluc3RydWN0aW9ucykgeworICAgICAgc2NoZWR1bGVfbm9kZSAqbiA9IChzY2hlZHVsZV9ub2RlICopbm9kZTsKKworICAgICAgaWYgKCFjaG9zZW4gfHwgbi0+dW5ibG9ja2VkX3RpbWUgPCBjaG9zZW5fdGltZSkgeworICAgICAgICAgY2hvc2VuID0gbjsKKyAgICAgICAgIGNob3Nlbl90aW1lID0gbi0+dW5ibG9ja2VkX3RpbWU7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBjaG9zZW47Cit9CisKK2ludAorZnNfaW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjppc3N1ZV90aW1lKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICBpZiAoaXNfY29tcHJlc3NlZCgoZnNfaW5zdCAqKWluc3QpKQorICAgICAgcmV0dXJuIDQ7CisgICBlbHNlCisgICAgICByZXR1cm4gMjsKK30KKworaW50Cit2ZWM0X2luc3RydWN0aW9uX3NjaGVkdWxlcjo6aXNzdWVfdGltZShiYWNrZW5kX2luc3RydWN0aW9uICppbnN0KQoreworICAgLyogV2UgYWx3YXlzIGV4ZWN1dGUgYXMgdHdvIHZlYzRzIGluIHBhcmFsbGVsLiAqLworICAgcmV0dXJuIDI7Cit9CisKK3ZvaWQKK2luc3RydWN0aW9uX3NjaGVkdWxlcjo6c2NoZWR1bGVfaW5zdHJ1Y3Rpb25zX2J1KGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKm5leHRfYmxvY2tfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpdmVfb3V0cHV0cykKK3sKKyAgIC8qIFJlbW92ZSBub24tREFHIGhlYWRzIGZyb20gdGhlIGxpc3QuICovCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCAmaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBzY2hlZHVsZV9ub2RlICpuID0gKHNjaGVkdWxlX25vZGUgKilub2RlOworICAgICAgaWYgKG4tPnBhcmVudF9jb3VudCAhPSAwKSB7CisgICAgICAgICBuLT5yZW1vdmUoKTsKKyAgICAgIH0KKyAgIH0KKworICAgcHJldmlvdXNfY2hvc2VuID0gTlVMTDsKKyAgIHVuc2lnbmVkIGNhbmRfZ2VuZXJhdGlvbiA9IDE7CisgICB3aGlsZSAoIWluc3RydWN0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICBzY2hlZHVsZV9ub2RlICpjaG9zZW4gPSBjaG9vc2VfaW5zdHJ1Y3Rpb25fdG9fc2NoZWR1bGVfYnUoKTsKKworICAgICAgYXNzZXJ0KGNob3Nlbik7CisgICAgICBjaG9zZW4tPnJlbW92ZSgpOworCisgICAgICBpZiAoIXByZXZpb3VzX2Nob3NlbikKKyAgICAgICAgIG5leHRfYmxvY2tfaGVhZGVyLT5pbnNlcnRfYmVmb3JlKGNob3Nlbi0+aW5zdCk7CisgICAgICBlbHNlCisgICAgICAgICBwcmV2aW91c19jaG9zZW4tPmluc3QtPmluc2VydF9iZWZvcmUoY2hvc2VuLT5pbnN0KTsKKworICAgICAgaW5zdHJ1Y3Rpb25zX3RvX3NjaGVkdWxlLS07CisgICAgICBwcmV2aW91c19jaG9zZW4gPSBjaG9zZW47CisKKyAgICAgIHVwZGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZShjaG9zZW4tPmluc3QsIHRydWUpOworICAgICAgCisgICAgICAvKiBVcGRhdGUgdGhlIGNsb2NrIGZvciBob3cgc29vbiBhbiBpbnN0cnVjdGlvbiBjb3VsZCBzdGFydCBhZnRlciB0aGUKKyAgICAgICAqIGNob3NlbiBvbmUuCisgICAgICAgKi8KKyAgICAgIHRpbWUgKz0gaXNzdWVfdGltZShjaG9zZW4tPmluc3QpOworICAgICAgcHRpbWUgKz0gaXNzdWVfdGltZShjaG9zZW4tPmluc3QpOworCisgICAgICAvKiBJZiB3ZSBleHBlY3RlZCBhIGRlbGF5IGZvciBzY2hlZHVsaW5nLCB0aGVuIGJ1bXAgdGhlIGNsb2NrIHRvIHJlZmxlY3QKKyAgICAgICAqIHRoYXQgYXMgd2VsbC4gIEluIHJlYWxpdHksIHRoZSBoYXJkd2FyZSB3aWxsIHN3aXRjaCB0byBhbm90aGVyCisgICAgICAgKiBoeXBlcnRocmVhZCBhbmQgbWF5IG5vdCByZXR1cm4gdG8gZGlzcGF0Y2hpbmcgb3VyIHRocmVhZCBmb3IgYSB3aGlsZQorICAgICAgICogZXZlbiBhZnRlciB3ZSdyZSB1bmJsb2NrZWQuCisgICAgICAgKi8KKyAgICAgIHRpbWUgPSBNQVgyKHRpbWUsIGNob3Nlbi0+dW5ibG9ja2VkX3RpbWUpOworICAgICAgcHRpbWUgPSBNQVgyKHB0aW1lLCBjaG9zZW4tPnVuYmxvY2tlZF9wdGltZSk7CisgICAgICAKKyAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgY29uc3QgYm9vbCBkYXRhX3ByZXNzdXJlX3BhbmljID0gY3VycmVudF9ibG9ja19wcmVzc3VyZSA+IChhbGxvY2F0YWJsZV9ncmZzICogcHJlc3N1cmVfcGFuaWNfdGhyZXNob2xkKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQlU6IGNsb2NrICVkLCBwcmVzc3VyZSAlLjJmJXMsIHNjaGVkdWxlZDogIiwKKyAgICAgICAgICAgICAgICAgcHRpbWUsCisgICAgICAgICAgICAgICAgIGN1cnJlbnRfYmxvY2tfcHJlc3N1cmUsCisgICAgICAgICAgICAgICAgIGRhdGFfcHJlc3N1cmVfcGFuaWMgPyAiKCEpIiA6ICIiKTsKKyAgICAgICAgIGJ2LT5kdW1wX2luc3RydWN0aW9uKGNob3Nlbi0+aW5zdCk7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyB0aGF0IHdlJ3ZlIHNjaGVkdWxlZCBhIG5ldyBpbnN0cnVjdGlvbiwgc29tZSBvZiBpdHMKKyAgICAgICAqIGNoaWxkcmVuIGNhbiBiZSBwcm9tb3RlZCB0byB0aGUgbGlzdCBvZiBpbnN0cnVjdGlvbnMgcmVhZHkgdG8KKyAgICAgICAqIGJlIHNjaGVkdWxlZC4gIFVwZGF0ZSB0aGUgY2hpbGRyZW4ncyB1bmJsb2NrZWQgdGltZSBmb3IgdGhpcworICAgICAgICogREFHIGVkZ2UgYXMgd2UgZG8gc28uCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSBjaG9zZW4tPmNoaWxkX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgIHNjaGVkdWxlX25vZGUgKmNoaWxkID0gY2hvc2VuLT5jaGlsZHJlbltpXTsKKworICAgICAgICAgY2hpbGQtPnVuYmxvY2tlZF90aW1lID0gTUFYMihjaGlsZC0+dW5ibG9ja2VkX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgKyBjaG9zZW4tPmNoaWxkX2xhdGVuY3lbaV0pOworICAgICAgICAgY2hpbGQtPnVuYmxvY2tlZF9wdGltZSA9IE1BWDIoY2hpbGQtPnVuYmxvY2tlZF9wdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRpbWUgKyBjaG9zZW4tPmNoaWxkX3BsYXRlbmN5W2ldKTsKKworICAgICAgICAgaWYgKGRlYnVnICYmIGRldGFpbF9kZWJ1ZykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcdGNoaWxkICVkLCAlZCBwYXJlbnRzOiAiLCBpLCBjaGlsZC0+cGFyZW50X2NvdW50KTsKKyAgICAgICAgICAgIGJ2LT5kdW1wX2luc3RydWN0aW9uKGNoaWxkLT5pbnN0KTsKKyAgICAgICAgIH0KKworICAgICAgICAgY2hpbGQtPmNhbmRfZ2VuZXJhdGlvbiA9IGNhbmRfZ2VuZXJhdGlvbjsKKyAgICAgICAgIGNoaWxkLT5wYXJlbnRfY291bnQtLTsKKyAgICAgICAgIGlmIChjaGlsZC0+cGFyZW50X2NvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyAmJiBkZXRhaWxfZGVidWcpIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHRcdG5vdyBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2hfaGVhZChjaGlsZCk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBjYW5kX2dlbmVyYXRpb24rKzsKKyAgIH0KK30KKwordm9pZAoraW5zdHJ1Y3Rpb25fc2NoZWR1bGVyOjpzY2hlZHVsZV9pbnN0cnVjdGlvbnNfdGQoYmFja2VuZF9pbnN0cnVjdGlvbiAqbmV4dF9ibG9ja19oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGl2ZV9pbnB1dHMpCit7CisgICB0aW1lID0gMDsKKworICAgLyogUmVtb3ZlIG5vbi1EQUcgaGVhZHMgZnJvbSB0aGUgbGlzdC4gKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsICZpbnN0cnVjdGlvbnMpIHsKKyAgICAgIHNjaGVkdWxlX25vZGUgKm4gPSAoc2NoZWR1bGVfbm9kZSAqKW5vZGU7CisgICAgICBpZiAobi0+cGFyZW50X2NvdW50ICE9IDApCisgICAgICAgICBuLT5yZW1vdmUoKTsKKyAgIH0KKworICAgcHJldmlvdXNfY2hvc2VuID0gTlVMTDsKKyAgIHVuc2lnbmVkIGNhbmRfZ2VuZXJhdGlvbiA9IDE7CisgICB3aGlsZSAoIWluc3RydWN0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICBzY2hlZHVsZV9ub2RlICpjaG9zZW4gPSBjaG9vc2VfaW5zdHJ1Y3Rpb25fdG9fc2NoZWR1bGVfdGQoKTsKKyAgICAgIHByZXZpb3VzX2Nob3NlbiA9IGNob3NlbjsKKworICAgICAgLyogU2NoZWR1bGUgdGhpcyBpbnN0cnVjdGlvbi4gKi8KKyAgICAgIGFzc2VydChjaG9zZW4pOworICAgICAgY2hvc2VuLT5yZW1vdmUoKTsKKyAgICAgIG5leHRfYmxvY2tfaGVhZGVyLT5pbnNlcnRfYmVmb3JlKGNob3Nlbi0+aW5zdCk7CisgICAgICBpbnN0cnVjdGlvbnNfdG9fc2NoZWR1bGUtLTsKKyAgICAgIHVwZGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZShjaG9zZW4tPmluc3QsIGZhbHNlKTsKKworICAgICAgLyogVXBkYXRlIHRoZSBjbG9jayBmb3IgaG93IHNvb24gYW4gaW5zdHJ1Y3Rpb24gY291bGQgc3RhcnQgYWZ0ZXIgdGhlCisgICAgICAgKiBjaG9zZW4gb25lLgorICAgICAgICovCisgICAgICB0aW1lICs9IGlzc3VlX3RpbWUoY2hvc2VuLT5pbnN0KTsKKyAgICAgIHB0aW1lICs9IGlzc3VlX3RpbWUoY2hvc2VuLT5pbnN0KTsKKworICAgICAgLyogSWYgd2UgZXhwZWN0ZWQgYSBkZWxheSBmb3Igc2NoZWR1bGluZywgdGhlbiBidW1wIHRoZSBjbG9jayB0byByZWZsZWN0CisgICAgICAgKiB0aGF0IGFzIHdlbGwuICBJbiByZWFsaXR5LCB0aGUgaGFyZHdhcmUgd2lsbCBzd2l0Y2ggdG8gYW5vdGhlcgorICAgICAgICogaHlwZXJ0aHJlYWQgYW5kIG1heSBub3QgcmV0dXJuIHRvIGRpc3BhdGNoaW5nIG91ciB0aHJlYWQgZm9yIGEgd2hpbGUKKyAgICAgICAqIGV2ZW4gYWZ0ZXIgd2UncmUgdW5ibG9ja2VkLgorICAgICAgICovCisgICAgICB0aW1lID0gTUFYMih0aW1lLCBjaG9zZW4tPnVuYmxvY2tlZF90aW1lKTsKKyAgICAgIHB0aW1lID0gTUFYMihwdGltZSwgY2hvc2VuLT51bmJsb2NrZWRfcHRpbWUpOworCisgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgIGNvbnN0IGJvb2wgZGF0YV9wcmVzc3VyZV9wYW5pYyA9IGN1cnJlbnRfYmxvY2tfcHJlc3N1cmUgPiAoYWxsb2NhdGFibGVfZ3JmcyAqIHByZXNzdXJlX3BhbmljX3RocmVzaG9sZCk7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNsb2NrICVkLCBwcmVzc3VyZSAlLjJmJXMsIHNjaGVkdWxlZDogIiwKKyAgICAgICAgICAgICAgICAgcHRpbWUsCisgICAgICAgICAgICAgICAgIGN1cnJlbnRfYmxvY2tfcHJlc3N1cmUsCisgICAgICAgICAgICAgICAgIGRhdGFfcHJlc3N1cmVfcGFuaWMgPyAiKCEpIiA6ICIiKTsKKyAgICAgICAgIGJ2LT5kdW1wX2luc3RydWN0aW9uKGNob3Nlbi0+aW5zdCk7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyB0aGF0IHdlJ3ZlIHNjaGVkdWxlZCBhIG5ldyBpbnN0cnVjdGlvbiwgc29tZSBvZiBpdHMKKyAgICAgICAqIGNoaWxkcmVuIGNhbiBiZSBwcm9tb3RlZCB0byB0aGUgbGlzdCBvZiBpbnN0cnVjdGlvbnMgcmVhZHkgdG8KKyAgICAgICAqIGJlIHNjaGVkdWxlZC4gIFVwZGF0ZSB0aGUgY2hpbGRyZW4ncyB1bmJsb2NrZWQgdGltZSBmb3IgdGhpcworICAgICAgICogREFHIGVkZ2UgYXMgd2UgZG8gc28uCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSBjaG9zZW4tPmNoaWxkX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgIHNjaGVkdWxlX25vZGUgKmNoaWxkID0gY2hvc2VuLT5jaGlsZHJlbltpXTsKKworICAgICAgICAgY2hpbGQtPnVuYmxvY2tlZF90aW1lID0gTUFYMihjaGlsZC0+dW5ibG9ja2VkX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgKyBjaG9zZW4tPmNoaWxkX2xhdGVuY3lbaV0pOworICAgICAgICAgY2hpbGQtPnVuYmxvY2tlZF9wdGltZSA9IE1BWDIoY2hpbGQtPnVuYmxvY2tlZF9wdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRpbWUgKyBjaG9zZW4tPmNoaWxkX3BsYXRlbmN5W2ldKTsKKworICAgICAgICAgaWYgKGRlYnVnICYmIGRldGFpbF9kZWJ1ZykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcdGNoaWxkICVkLCAlZCBwYXJlbnRzOiAiLCBpLCBjaGlsZC0+cGFyZW50X2NvdW50KTsKKyAgICAgICAgICAgIGJ2LT5kdW1wX2luc3RydWN0aW9uKGNoaWxkLT5pbnN0KTsKKyAgICAgICAgIH0KKworICAgICAgICAgY2hpbGQtPmNhbmRfZ2VuZXJhdGlvbiA9IGNhbmRfZ2VuZXJhdGlvbjsKKyAgICAgICAgIGNoaWxkLT5wYXJlbnRfY291bnQtLTsKKyAgICAgICAgIGlmIChjaGlsZC0+cGFyZW50X2NvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyAmJiBkZXRhaWxfZGVidWcpIHsKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHRcdG5vdyBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2hfaGVhZChjaGlsZCk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBjYW5kX2dlbmVyYXRpb24rKzsKKworICAgICAgLyogU2hhcmVkIHJlc291cmNlOiB0aGUgbWF0aGJveC4gIFRoZXJlJ3Mgb25lIG1hdGhib3ggcGVyIEVVIG9uIEdlbjYrCisgICAgICAgKiBidXQgaXQncyBtb3JlIGxpbWl0ZWQgcHJlLWdlbjYsIHNvIGlmIHdlIHNlbmQgc29tZXRoaW5nIG9mZiB0byBpdCB0aGVuCisgICAgICAgKiB0aGUgbmV4dCBtYXRoIGluc3RydWN0aW9uIGlzbid0IGdvaW5nIHRvIG1ha2UgcHJvZ3Jlc3MgdW50aWwgdGhlIGZpcnN0CisgICAgICAgKiBpcyBkb25lLgorICAgICAgICovCisgICAgICBpZiAoY2hvc2VuLT5pbnN0LT5pc19tYXRoKCkpIHsKKyAgICAgICAgIGZvcmVhY2hfbGlzdChub2RlLCAmaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBzY2hlZHVsZV9ub2RlICpuID0gKHNjaGVkdWxlX25vZGUgKilub2RlOworCisgICAgICAgICAgICBpZiAobi0+aW5zdC0+aXNfbWF0aCgpKSB7CisgICAgICAgICAgICAgICBuLT51bmJsb2NrZWRfdGltZSA9IE1BWDIobi0+dW5ibG9ja2VkX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSArIGNob3Nlbi0+bGF0ZW5jeSk7CisgICAgICAgICAgICAgICBuLT51bmJsb2NrZWRfcHRpbWUgPSBNQVgyKG4tPnVuYmxvY2tlZF9wdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGltZSArIGNob3Nlbi0+cGxhdGVuY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBhc3NlcnQoaW5zdHJ1Y3Rpb25zX3RvX3NjaGVkdWxlID09IDApOworfQorCit2b2lkCitpbnN0cnVjdGlvbl9zY2hlZHVsZXI6OnJ1bl9idShleGVjX2xpc3QgKmFsbF9pbnN0cnVjdGlvbnMpCit7CisgICAvLyBPdGhlcndpc2UsIHdlIHNob3VsZCB3YW50IHRvIGF0dGVtcHQgYSBwcmVzc3VyZSBsaW1pdGluZyBwYXNzIHRvIHNxdWVlemUgZG93biBwcmVzc3VyZS4KKyAgIC8vIFdlIHdpbGwgbWFrZSBhIGJvdHRvbSB1cCAoQlUpIHBhc3MgZm9yIHRoaXMgcHVycG9zZS4KKworICAgLy8gRmlyc3QsIGNyZWF0ZSBhIHJldmVyc2Ugc2NoZWR1bGUuICBUaGlzIGlzIGEgaGFjayB0byBmaXQgaW50byB0aGUgY3VycnJlbnRseQorICAgLy8gYXZhaWxhYmxlIHN0cnVjdHVyZXMuCisgICAKKyAgIGluc3RydWN0aW9uc190b19zY2hlZHVsZSA9IDA7CisgICBwdGltZSA9IDA7CisgICB0aW1lID0gMDsKKworICAgYmFja2VuZF9pbnN0cnVjdGlvbiAqbmV4dF9ibG9ja19oZWFkZXIgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKWFsbF9pbnN0cnVjdGlvbnMtPmhlYWQ7CisKKyAgIGlmIChkZWJ1ZykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJcbkluc3RydWN0aW9ucyBiZWZvcmUgc2NoZWR1bGluZyAocmVnX2FsbG9jICVkKVxuIiwKKyAgICAgICAgICAgICAgcG9zdF9yZWdfYWxsb2MpOworICAgICAgYnYtPmR1bXBfaW5zdHJ1Y3Rpb25zKCk7CisgICB9CisKKyAgIC8qIFBvcHVsYXRlIHRoZSByZW1haW5pbmcgR1JGIHVzZXMgYXJyYXkgdG8gaW1wcm92ZSB0aGUgcHJlLXJlZ2FsbG9jCisgICAgKiBzY2hlZHVsaW5nLgorICAgICovCisgICBpZiAocmVtYWluaW5nX2dyZl91c2VzKSB7CisgICAgICBmb3IgKGludCB4PTA7IHg8Z3JmX2NvdW50OyArK3gpIHsKKyAgICAgICAgIHJlbWFpbmluZ19ncmZfdXNlc1t4XSA9IDA7CisgICAgICB9CisgICB9CisKKyAgIGJsb2NrX251bSA9IDA7CisgICB3aGlsZSAoIW5leHRfYmxvY2tfaGVhZGVyLT5pc190YWlsX3NlbnRpbmVsKCkpIHsKKyAgICAgIGludCBibG9ja19wb3MgPSAwOworICAgICAgLyogQWRkIHRoaW5ncyB0byBiZSBzY2hlZHVsZWQgdW50aWwgd2UgZ2V0IHRvIGEgbmV3IEJCLiAqLworICAgICAgd2hpbGUgKCFuZXh0X2Jsb2NrX2hlYWRlci0+aXNfdGFpbF9zZW50aW5lbCgpKSB7CisgICAgICAgICBiYWNrZW5kX2luc3RydWN0aW9uICppbnN0ID0gbmV4dF9ibG9ja19oZWFkZXI7CisgICAgICAgICBuZXh0X2Jsb2NrX2hlYWRlciA9IChiYWNrZW5kX2luc3RydWN0aW9uICopbmV4dF9ibG9ja19oZWFkZXItPm5leHQ7CisKKyAgICAgICAgIGNvdW50X3JlbWFpbmluZ19ncmZfdXNlcyhpbnN0KTsKKworICAgICAgICAgYWRkX2luc3QoaW5zdCk7CisKKyAgICAgICAgIC8vIEluIENGRyBjcmVhdGlvbiwgZW5kaWZzIGNhbiBiZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiBhIGJsb2NrLgorICAgICAgICAgLy8gVGhpcyBtaXJyb3JzIHRoZSBsb2dpYyBpbiBjZmdfdDo6Y2ZnX3QuCisgICAgICAgICBpZiAoaW5zdC0+aXNfY29udHJvbF9mbG93KCkgJiYKKyAgICAgICAgICAgICAhKGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX0VORElGICYmIGJsb2NrX3BvcyA9PSAwKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgKytibG9ja19wb3M7CisgICAgICB9CisKKyAgICAgIGNhbGN1bGF0ZV9kZXBzKHRydWUpOworCisgICAgICAvLyBVcGRhdGUgR1JGIHNldHMKKyAgICAgIGZvciAoaW50IGdyZj0wOyBncmY8Z3JmX2NvdW50OyArK2dyZikgeworICAgICAgICAgZ3JmX2FjdGl2ZVtncmZdID0gQklUU0VUX1RFU1QoKChmc192aXNpdG9yKilidiktPmxpdmVfaW50ZXJ2YWxzLT5iZFtibG9ja19udW1dLmxpdmVvdXQsIGdyZik7CisgICAgICB9CisKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCAmaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICBzY2hlZHVsZV9ub2RlICpuID0gKHNjaGVkdWxlX25vZGUgKilub2RlOworICAgICAgICAgY29tcHV0ZV9kZWxheShuKTsKKyAgICAgIH0KKworICAgICAgLy8gQ291bnQgb2YgbGl2ZSBvdXRwdXRzIGZyb20gdGhlIGJsb2NrLgorICAgICAgY29uc3QgaW50IGxpdmVfb3V0cyA9IGJ2LT5saXZlX291dF9jb3VudChibG9ja19udW0pOworICAgICAgY3VycmVudF9ibG9ja19wcmVzc3VyZSA9IGxpdmVfb3V0czsKKworICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJVOiBibG9jazogJWQ6IGxpdmUgb3V0cyA9ICVkLCBsaXZlIGlucyA9ICVkXG4iLCBibG9ja19udW0sIGxpdmVfb3V0cywKKyAgICAgICAgICAgICAgICAgYnYtPmxpdmVfaW5fY291bnQoYmxvY2tfbnVtKSk7CisgICAgICB9CisKKyAgICAgIC8vIFNjaGVkdWxlIHRoaXMgYmxvY2sgQlUKKyAgICAgIHNjaGVkdWxlX2luc3RydWN0aW9uc19idShuZXh0X2Jsb2NrX2hlYWRlciwgbGl2ZV9vdXRzKTsKKworICAgICAgYmxvY2tfbnVtKys7CisgICB9Cit9CisKKyNpZiBVU0VfR1JBUEhWSVoKK3ZvaWQKK2R1bXBfZG90KGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBiYWNrZW5kX3Zpc2l0b3IqIGJ2LCBpbnQgYmxvY2tudW0sIGludCBwYXJ0KQoreworICAgaWYgKHBhcnQgPT0gMCkgeworICAgICAgRklMRSogZnAgPSBmb3BlbigiL3RtcC9ibG9ja2dyYXBoLmd2IiwgInciKTsKKworICAgICAgaWYgKCFmcCkKKyAgICAgICAgIHJldHVybjsKKworICAgICAgZnByaW50ZihmcCwgImRpZ3JhcGggYmxvY2tzIHtcbiIpOworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgRklMRSogZnAgPSBmb3BlbigiL3RtcC9ibG9ja2dyYXBoLmd2IiwgImEiKTsKKyAgIGlmICghZnApCisgICAgICByZXR1cm47CisKKyAgIGlmIChwYXJ0ID09IDEpIHsKKyAgICAgIGNoYXIgbmFtZTBbNTEyXTsKKyAgICAgIGNoYXIgbmFtZTFbNTEyXTsKKyAgICAgIGNoYXIgaW5zdHRleHRbNTEyXTsKKworICAgICAgaW50IGlwID0gMDsKKworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsIGluc3RydWN0aW9ucykgeworICAgICAgICAgc2NoZWR1bGVfbm9kZSAqbiA9IChzY2hlZHVsZV9ub2RlICopbm9kZTsKKyAgICAgICAgIGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKW4tPmluc3Q7CisKKyAgICAgICAgIGNvbnN0IGJvb2wgaXN0eCA9CisgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9URVggfHwKKyAgICAgICAgICAgIGluc3QtPm9wY29kZSA9PSBTSEFERVJfT1BDT0RFX1RYRCB8fAorICAgICAgICAgICAgaW5zdC0+b3Bjb2RlID09IFNIQURFUl9PUENPREVfVFhGIHx8CisgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9UWEw7CisKKyAgICAgICAgIGluc3R0ZXh0WzBdID0gJ1wwJzsKKyAgICAgICAgIGJ2LT5kdW1wX2luc3RydWN0aW9uKGluc3QsIGluc3R0ZXh0KTsKKworICAgICAgICAgc3ByaW50ZihuYW1lMCwgIm5vZGVfMHglMDhseCBbc2hhcGU9cmVjdGFuZ2xlLCBsYWJlbD08PFRBQkxFIEJPUkRFUj1cIjBcIj48VFI+PFREIENPTFNQQU49XCI0XCI+PEZPTlQgJXMgUE9JTlQtU0laRT1cIjEwXCI+JXM8L0ZPTlQ+PC9URD48L1RSPjxUUj48VEQ+RD0lZDwvVEQ+PFREPkw9JWQ8L1REPjxURD5QPSVkPC9URD48VEQ+Qz0lZDwvVEQ+PC9UUj48L1RBQkxFPj4lc107IiwKKyAgICAgICAgICAgICAgICAgKGxvbmcpbiwKKyAgICAgICAgICAgICAgICAgaXN0eCA/ICIgQ09MT1I9XCJibHVlXCIiIDogIiIsCisgICAgICAgICAgICAgICAgIGluc3R0ZXh0LCAvLyBicndfaW5zdHJ1Y3Rpb25fbmFtZShpbnN0LT5vcGNvZGUpLAorICAgICAgICAgICAgICAgICBuLT5kZWxheSwKKyAgICAgICAgICAgICAgICAgbi0+cGxhdGVuY3ksCisgICAgICAgICAgICAgICAgIG4tPnBhcmVudF9jb3VudCwKKyAgICAgICAgICAgICAgICAgbi0+Y2hpbGRfY291bnQsCisgICAgICAgICAgICAgICAgIChuLT5wYXJlbnRfY291bnQgPT0gMCA/ICIsIGNvbG9yPXllbGxvdyIgOiAiIikpOworCisgICAgICAgICAgICAgICAgIC8vIChpc3R4ID8gIiwgZm9udGNvbG9yPXJlZCIgOiAiIikpOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgIGZwcmludGYoZnAsICIgICVzXG4iLCBuYW1lMCk7CisgICAgICB9CisKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgIHNjaGVkdWxlX25vZGUgKm4gPSAoc2NoZWR1bGVfbm9kZSAqKW5vZGU7CisKKyAgICAgICAgIHNwcmludGYobmFtZTAsICJub2RlXzB4JTA4bHgiLCAobG9uZyluKTsKKworICAgICAgICAgaW50IG1heF9kZWxheSA9IC02NTUzNTsKKyAgICAgICAgIGludCBjcml0aWNhbF9jaGlsZCA9IDA7CisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4tPmNoaWxkX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHNjaGVkdWxlX25vZGUgKmNuID0gKHNjaGVkdWxlX25vZGUgKiluLT5jaGlsZHJlbltpXTsKKworICAgICAgICAgICAgaWYgKGNuLT5kZWxheSA+IG1heF9kZWxheSkgeworICAgICAgICAgICAgICAgbWF4X2RlbGF5ID0gY24tPmRlbGF5OworICAgICAgICAgICAgICAgY3JpdGljYWxfY2hpbGQgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4tPmNoaWxkX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHNjaGVkdWxlX25vZGUgKmNuID0gKHNjaGVkdWxlX25vZGUgKiluLT5jaGlsZHJlbltpXTsKKyAgICAgICAgIAorICAgICAgICAgICAgc3ByaW50ZihuYW1lMSwgIm5vZGVfMHglMDhseCIsIChsb25nKWNuKTsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICIgICVzIC0+ICVzIFtjb2xvcj0lc10lcztcbiIsIG5hbWUwLCBuYW1lMSwKKyAgICAgICAgICAgICAgICAgICAgKG4tPmNyaXRpY2FsX3BhdGggJiYgaSA9PSBjcml0aWNhbF9jaGlsZCA/ICJyZWQiIDoKKyAgICAgICAgICAgICAgICAgICAgIG4tPmNoaWxkX2xhdGVuY3lbaV0gPT0gMCA/ICJncmVlbiIgOgorICAgICAgICAgICAgICAgICAgICAgbi0+cGxhdGVuY3kgPiA4ID8gImJsdWUiIDogImJsYWNrIiksCisgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgICAgICAgIH0KKworICAgICAgICAgKytpcDsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHBhcnQgPT0gMikgeworICAgICAgZnByaW50ZihmcCwgIn1cbiIpOworICAgfQorCisgICBmY2xvc2UoZnApOworfQorI2VuZGlmIC8vIFVTRV9HUkFQSFZJWgorCit2b2lkCitpbnN0cnVjdGlvbl9zY2hlZHVsZXI6OnJ1bl90ZChleGVjX2xpc3QgKmFsbF9pbnN0cnVjdGlvbnMpCit7CisgICBiYWNrZW5kX2luc3RydWN0aW9uICpuZXh0X2Jsb2NrX2hlYWRlciA9CisgICAgICAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKWFsbF9pbnN0cnVjdGlvbnMtPmhlYWQ7CisKKyAgIGlmIChkZWJ1ZyAmJiBkZXRhaWxfZGVidWcpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5JbnN0cnVjdGlvbnMgYmVmb3JlIHNjaGVkdWxpbmcgKHJlZ19hbGxvYyAlZClcbiIsCisgICAgICAgICAgICAgIHBvc3RfcmVnX2FsbG9jKTsKKyAgICAgIGJ2LT5kdW1wX2luc3RydWN0aW9ucygpOworICAgfQorCisgICAvKiBQb3B1bGF0ZSB0aGUgcmVtYWluaW5nIEdSRiB1c2VzIGFycmF5IHRvIGltcHJvdmUgdGhlIHByZS1yZWdhbGxvYworICAgICogc2NoZWR1bGluZy4KKyAgICAqLworICAgaWYgKHJlbWFpbmluZ19ncmZfdXNlcykgeworICAgICAgZm9yIChpbnQgeD0wOyB4PGdyZl9jb3VudDsgKyt4KSB7CisgICAgICAgICByZW1haW5pbmdfZ3JmX3VzZXNbeF0gPSAwOworICAgICAgICAgZ3JmX2FjdGl2ZVt4XSA9IGZhbHNlOworICAgICAgfQorCisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgYWxsX2luc3RydWN0aW9ucykgeworICAgICAgICAgY291bnRfcmVtYWluaW5nX2dyZl91c2VzKChiYWNrZW5kX2luc3RydWN0aW9uICopbm9kZSk7CisgICAgICB9CisgICB9CisKKyAgIGJsb2NrX251bSA9IDA7CisKKyNpZiBVU0VfR1JBUEhWSVoKKyAgIGR1bXBfZG90KCZpbnN0cnVjdGlvbnMsIGJ2LCBibG9ja19udW0sIDApOworI2VuZGlmCisKKyAgIHdoaWxlICghbmV4dF9ibG9ja19oZWFkZXItPmlzX3RhaWxfc2VudGluZWwoKSkgeworICAgICAgLyogQWRkIHRoaW5ncyB0byBiZSBzY2hlZHVsZWQgdW50aWwgd2UgZ2V0IHRvIGEgbmV3IEJCLiAqLworCisgICAgICBpbnQgYmxvY2tfcG9zID0gMDsKKyAgICAgIHdoaWxlICghbmV4dF9ibG9ja19oZWFkZXItPmlzX3RhaWxfc2VudGluZWwoKSkgeworICAgICAgICAgYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCA9IG5leHRfYmxvY2tfaGVhZGVyOworICAgICAgICAgbmV4dF9ibG9ja19oZWFkZXIgPSAoYmFja2VuZF9pbnN0cnVjdGlvbiAqKW5leHRfYmxvY2tfaGVhZGVyLT5uZXh0OworCisgICAgICAgICBhZGRfaW5zdChpbnN0KTsKKworICAgICAgICAgaWYgKHVzZV9pcHMobW9kZSkpIHsKKyAgICAgICAgICAgIC8vIEluIENGRyBjcmVhdGlvbiwgZW5kaWZzIGNhbiBiZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiBhIGJsb2NrLgorICAgICAgICAgICAgLy8gVGhpcyBtaXJyb3JzIHRoZSBsb2dpYyBpbiBjZmdfdDo6Y2ZnX3QuCisgICAgICAgICAgICBpZiAoaW5zdC0+aXNfY29udHJvbF9mbG93KCkgJiYKKyAgICAgICAgICAgICAgICAhKGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX0VORElGICYmIGJsb2NrX3BvcyA9PSAwKSkKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbnN0LT5pc19jb250cm9sX2Zsb3coKSkKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICArK2Jsb2NrX3BvczsKKyAgICAgIH0KKworICAgICAgY2FsY3VsYXRlX2RlcHMoZmFsc2UpOworCisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmluc3RydWN0aW9ucykgeworICAgICAgICAgc2NoZWR1bGVfbm9kZSAqbiA9IChzY2hlZHVsZV9ub2RlICopbm9kZTsKKyAgICAgICAgIGNvbXB1dGVfZGVsYXkobik7CisgICAgICB9CisKKyNpZiBVU0VfR1JBUEhWSVoKKyAgICAgIGZpbmRfY3JpdGljYWxfcGF0aCgoc2NoZWR1bGVfbm9kZSopaW5zdHJ1Y3Rpb25zLmhlYWQpOworICAgICAgZHVtcF9kb3QoJmluc3RydWN0aW9ucywgYnYsIGJsb2NrX251bSwgMSk7CisjZW5kaWYKKworICAgICAgLy8gQ291bnQgb2YgbGl2ZSBpbnB1dHMgdG8gdGhlIGJsb2NrLgorICAgICAgaW50IGxpdmVfaW5zID0gMDsKKworICAgICAgaWYgKHVzZV9pcHMobW9kZSkpIHsKKyAgICAgICAgIGxpdmVfaW5zID0gYnYtPmxpdmVfaW5fY291bnQoYmxvY2tfbnVtKTsKKyAgICAgICAgIGN1cnJlbnRfYmxvY2tfcHJlc3N1cmUgPSBsaXZlX2luczsKKyAgICAgIH0KKworICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJsb2NrOiAlZDogbGl2ZSBpbnMgPSAlZCwgbGl2ZSBvdXRzID0gJWRcbiIsIGJsb2NrX251bSwKKyAgICAgICAgICAgICAgICAgbGl2ZV9pbnMsIGJ2LT5saXZlX291dF9jb3VudChibG9ja19udW0pKTsKKworICAgICAgfQorICAgICAgCisgICAgICBzY2hlZHVsZV9pbnN0cnVjdGlvbnNfdGQobmV4dF9ibG9ja19oZWFkZXIsIGxpdmVfaW5zKTsKKworICAgICAgYmxvY2tfbnVtKys7CisgICB9CisKKyNpZiBVU0VfR1JBUEhWSVoKKyAgIGR1bXBfZG90KCZpbnN0cnVjdGlvbnMsIGJ2LCBibG9ja19udW0sIDIpOworI2VuZGlmCit9CisKK2ludAorZnNfdmlzaXRvcjo6c2NoZWR1bGVfaW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uX3NjaGVkdWxlcl9tb2RlIG1vZGUpCit7CisgICBpbnQgZ3JmX2NvdW50OworICAgaWYgKG1vZGUgPT0gU0NIRURVTEVfUE9TVCkKKyAgICAgIGdyZl9jb3VudCA9IGdyZl91c2VkOworICAgZWxzZQorICAgICAgZ3JmX2NvdW50ID0gdmlydHVhbF9ncmZfY291bnQ7CisKKyAgIGNvbnN0IGludCBpbl9wcmVzc3VyZSA9IGNhbGN1bGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZSgpOworCisgICAvLyBJbiBTSU1EMTYsIGVhY2ggY2hhbm5lbCByZXF1aXJlcyAyIHJlZ2lzdGVycy4KKyAgIGNvbnN0IGludCBhbGxvY2F0YWJsZV9ncmZzID0gKGRpc3BhdGNoX3dpZHRoID09IDE2KSA/IChtYXhfZ3JmIC8gMikgOiBtYXhfZ3JmOworCisgICBmc19pbnN0cnVjdGlvbl9zY2hlZHVsZXIgc2NoZWQodGhpcywgZ3JmX2NvdW50LCBhbGxvY2F0YWJsZV9ncmZzLCBtb2RlKTsKKworICAgLy8gTW92ZSBpbnRlcnBvbGF0aW9ucyBjbG9zZSB0byB0aGVpciB1c2VzLCB0byBkZWNyZWFzZSByZWdpc3RlciBwcmVzc3VyZQorICAgLy8gYXQgdGhlIHBvdGVudGlhbCBjb3N0IG9mIGNvbXB1dGUgdGltZS4gIFVzdWFsbHkgdGhpcyBpcyBhIHdpbiwgYnV0CisgICAvLyBjZXJ0YWlubHkgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXBwcm9hY2ggaXMgaW5kaWNhdGVkLgorICAgLy8gc2NoZWQubW92ZV9pbnRlcnBzKCZpbnN0cnVjdGlvbnMpOworCisgICBpZiAodXNlX2J1KG1vZGUpKQorICAgICAgc2NoZWQucnVuX2J1KCZpbnN0cnVjdGlvbnMpOworICAgZWxzZQorICAgICAgc2NoZWQucnVuX3RkKCZpbnN0cnVjdGlvbnMpOworCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19XTSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGluX3ByZXNzdXJlPSVkLCBsaW1pdD0lZCwgb3V0IHByZXNzdXJlPSVkLCBwYW5pYz0lLjJmXG4iLAorICAgICAgICAgICAgICB1c2VfYnUobW9kZSkgPyAiQlUiIDogIlREIiwKKyAgICAgICAgICAgICAgaW5fcHJlc3N1cmUsIGFsbG9jYXRhYmxlX2dyZnMsIGNhbGN1bGF0ZV9yZWdpc3Rlcl9wcmVzc3VyZSgpLCBzY2hlZC5wcmVzc3VyZV9wYW5pY190aHJlc2hvbGQpOworICAgICAgZnByaW50ZihzdGRlcnIsICJmcyVkIGVzdGltYXRlZCBleGVjdXRpb24gdGltZTogJWQgY3ljbGVzXG4iLAorICAgICAgICAgICAgICBkaXNwYXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgc2NoZWQucHRpbWUgKiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYgPyAxIDogMikpOworICAgfQorCisgICBpZiAoZGVidWcpIHsKKyAgICAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKyAgICAgIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpOworCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuSW5zdHJ1Y3Rpb25zIGFmdGVyIHNjaGVkdWxpbmcgKHJlZ19hbGxvYylcbiIpOworICAgICAgZHVtcF9pbnN0cnVjdGlvbnMoKTsKKyAgIH0KKworICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworCisgICByZXR1cm4gc2NoZWQucHRpbWUgKiAoZGlzcGF0Y2hfd2lkdGggPT0gMTYgPyAxIDogMik7Cit9CisKK2ludAordmVjNF92aXNpdG9yOjpvcHRfc2NoZWR1bGVfaW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uX3NjaGVkdWxlcl9tb2RlIG1vZGUpCit7CisgICB2ZWM0X2luc3RydWN0aW9uX3NjaGVkdWxlciBzY2hlZCh0aGlzLCBwcm9nX2RhdGEtPnRvdGFsX2dyZiwgbWF4X2dyZiwgbW9kZSk7CisKKyAgIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpOworICAgc2NoZWQucnVuX3RkKCZpbnN0cnVjdGlvbnMpOworCisgICBpZiAodW5saWtlbHkoZGVidWdfZmxhZykpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidmVjNCBlc3RpbWF0ZWQgZXhlY3V0aW9uIHRpbWU6ICVkIGN5Y2xlc1xuIiwgc2NoZWQucHRpbWUpOworICAgfQorCisgICBpZiAoZGVidWcpIHsKKyAgICAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKyAgICAgIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpOworCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuSW5zdHJ1Y3Rpb25zIGFmdGVyIHNjaGVkdWxpbmcgKHJlZ19hbGxvYylcbiIpOworICAgICAgZHVtcF9pbnN0cnVjdGlvbnMoKTsKKyAgIH0KKworICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworCisgICByZXR1cm4gc2NoZWQucHRpbWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3NoYWRlci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3NoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzOTdlOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfc2hhZGVyLmNwcApAQCAtMCwwICsxLDEwNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCit9CisjaW5jbHVkZSAiYnJ3X3NoYWRlci5oIgorI2luY2x1ZGUgImJyd192cy5oIgorI2luY2x1ZGUgImJyd192ZWM0X2dzLmgiCisjaW5jbHVkZSAiYnJ3X3ZlYzRfZ3NfdmlzaXRvci5oIgorI2luY2x1ZGUgImJyd19mcy5oIgorI2luY2x1ZGUgImdsc2wvaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAiZ2xzbC9nbHNsX3BhcnNlcl9leHRyYXMuaCIKKy8vI2luY2x1ZGUgIm1haW4vZmJvYmplY3QuaCIgIC8vIEx1bmFyRzogUmVtb3ZlCisvLyNpbmNsdWRlICJtYWluL3NoYWRlcmFwaS5oIiAvLyBMdW5hckc6IFJlbW92ZQorI2luY2x1ZGUgIm1haW4vc2hhZGVyb2JqLmgiICAgLy8gTHVuYXJHOiBBREQKKyNpbmNsdWRlICJwcm9ncmFtL2hhc2hfdGFibGUuaCIgLy8gTHVuYXJHOiBBREQKKyNpbmNsdWRlICJpY2QtdXRpbHMuaCIgICAgICAgIC8vIEx1bmFyRzogQURECisKK3N0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0geworICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtIGJhc2U7CisKKyAgIHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW1fcHJlY29tcGlsZV9rZXkgcHJlX2tleTsKKworICAgR0xiaXRmaWVsZCBzYXZlZDsKKworICAgc3RydWN0IHsKKyAgICAgIHN0cnVjdCBicndfdnNfcHJvZ19rZXkga2V5OworICAgICAgc3RydWN0IGJyd192c19wcm9nX2RhdGEgZGF0YTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkICpwcm9ncmFtOworICAgICAgdW5zaWduZWQgcHJvZ3JhbV9zaXplOworICAgfSB2czsKKworICAgc3RydWN0IHsKKyAgICAgIHN0cnVjdCBicndfZ3NfcHJvZ19rZXkga2V5OworICAgICAgc3RydWN0IGJyd19nc19wcm9nX2RhdGEgZGF0YTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkICpwcm9ncmFtOworICAgICAgdW5zaWduZWQgcHJvZ3JhbV9zaXplOworICAgfSBnczsKKworICAgc3RydWN0IHsKKyAgICAgIHN0cnVjdCBicndfd21fcHJvZ19rZXkga2V5OworICAgICAgc3RydWN0IGJyd193bV9wcm9nX2RhdGEgZGF0YTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkICpwcm9ncmFtOworICAgICAgdW5zaWduZWQgcHJvZ3JhbV9zaXplOworICAgfSB3bTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqCiticndfc2hhZGVyX3Byb2dyYW0oc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgcmV0dXJuIChzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICopIHByb2c7Cit9CisKKy8vIEx1bmFyRyA6IEFERCAtIFRoZXNlIGV4cG9zZSByZXN1bHRzIG9mIHRoZSBzaGFkZXIgY29tcGlsZS4gIFRoZXJlIG1heQorLy8gICAgICAgICAgICAgICAgYmUgYW5vdGhlciB3YXkgdG8gZ2V0IHRoaXMgZGF0YSwgcmV2aXNpdCB0aGlzIHRoZW4uCisKK3N0cnVjdCBicndfd21fcHJvZ19kYXRhICpnZXRfd21fcHJvZ19kYXRhKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKmJyd19wcm9nID0gKHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKikgcHJvZzsKKyAgIHJldHVybiAmYnJ3X3Byb2ctPndtLmRhdGE7Cit9CisKK2NvbnN0IHVuc2lnbmVkICpnZXRfd21fcHJvZ3JhbShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCit7CisgICAgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqYnJ3X3Byb2cgPSAoc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqKSBwcm9nOworICAgIHJldHVybiBicndfcHJvZy0+d20ucHJvZ3JhbTsKK30KKwordW5zaWduZWQgZ2V0X3dtX3Byb2dyYW1fc2l6ZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCit7CisgICAgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqYnJ3X3Byb2cgPSAoc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqKSBwcm9nOworICAgIHJldHVybiBicndfcHJvZy0+d20ucHJvZ3JhbV9zaXplOworfQorCitzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSAqZ2V0X3ZzX3Byb2dfZGF0YShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCit7CisgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpicndfcHJvZyA9IChzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICopIHByb2c7CisgICByZXR1cm4gJmJyd19wcm9nLT52cy5kYXRhOworfQorCitjb25zdCB1bnNpZ25lZCAqZ2V0X3ZzX3Byb2dyYW0oc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgIHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKmJyd19wcm9nID0gKHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKikgcHJvZzsKKyAgICByZXR1cm4gYnJ3X3Byb2ctPnZzLnByb2dyYW07Cit9CisKK3Vuc2lnbmVkIGdldF92c19wcm9ncmFtX3NpemUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgIHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKmJyd19wcm9nID0gKHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKikgcHJvZzsKKyAgICByZXR1cm4gYnJ3X3Byb2ctPnZzLnByb2dyYW1fc2l6ZTsKK30KKworc3RydWN0IGJyd19nc19wcm9nX2RhdGEgKmdldF9nc19wcm9nX2RhdGEoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqYnJ3X3Byb2cgPSAoc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqKSBwcm9nOworICAgcmV0dXJuICZicndfcHJvZy0+Z3MuZGF0YTsKK30KKworY29uc3QgdW5zaWduZWQgKmdldF9nc19wcm9ncmFtKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpicndfcHJvZyA9IChzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICopIHByb2c7CisgICAgcmV0dXJuIGJyd19wcm9nLT5ncy5wcm9ncmFtOworfQorCit1bnNpZ25lZCBnZXRfZ3NfcHJvZ3JhbV9zaXplKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpicndfcHJvZyA9IChzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICopIHByb2c7CisgICAgcmV0dXJuIGJyd19wcm9nLT5ncy5wcm9ncmFtX3NpemU7Cit9CisKK3N0cnVjdCBnbF9zaGFkZXIgKgorYnJ3X25ld19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUsIEdMdWludCB0eXBlKQoreworICAgc3RydWN0IGJyd19zaGFkZXIgKnNoYWRlcjsKKworICAgc2hhZGVyID0gcnphbGxvYyhOVUxMLCBzdHJ1Y3QgYnJ3X3NoYWRlcik7CisgICBpZiAoc2hhZGVyKSB7CisgICAgICBzaGFkZXItPmJhc2UuVHlwZSA9IHR5cGU7CisgICAgICBzaGFkZXItPmJhc2UuU3RhZ2UgPSBfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2UodHlwZSk7CisgICAgICBzaGFkZXItPmJhc2UuTmFtZSA9IG5hbWU7CisgICAgICAvLyBMdW5hckc6IFJlbW92ZWQKKyAgICAgIC8vX21lc2FfaW5pdF9zaGFkZXIoY3R4LCAmc2hhZGVyLT5iYXNlKTsKKyAgIH0KKworICAgcmV0dXJuICZzaGFkZXItPmJhc2U7Cit9CisKK3N0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqCiticndfbmV3X3NoYWRlcl9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBuYW1lKQoreworICAgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqcHJvZyA9IHJ6YWxsb2MoTlVMTCwgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSk7CisgICBpZiAocHJvZykgeworICAgICAgcHJvZy0+YmFzZS5OYW1lID0gbmFtZTsKKyAgICAgIC8vIEx1bmFyRzogQUREIC0gaW5saW5lIHRoZSBjb250ZW50cyBvZiB0aGlzIGZ1bmN0aW9uIHRvIGF2b2lkCisgICAgICAvLyAgICAgICAgICAgICAgIGJyaW5naW5nIGluIHNoYWRlcm9iai5jCisgICAgICAvL19tZXNhX2luaXRfc2hhZGVyX3Byb2dyYW0oY3R4LCAmcHJvZy0+YmFzZSk7CisgICAgICBwcm9nLT5iYXNlLlR5cGUgPSBHTF9TSEFERVJfUFJPR1JBTV9NRVNBOworICAgICAgLy8gTHVuYXJHOiBSZW1vdmUgLSBWSyBkb2VzIG5vdCB1c2UgcmVmZXJlbmNlIGNvdW50cworICAgICAgLy8gcHJvZy0+YmFzZS5SZWZDb3VudCA9IDE7CisKKyAgICAgIHByb2ctPmJhc2UuQXR0cmlidXRlQmluZGluZ3MgPSBuZXcgc3RyaW5nX3RvX3VpbnRfbWFwOworICAgICAgcHJvZy0+YmFzZS5GcmFnRGF0YUJpbmRpbmdzID0gbmV3IHN0cmluZ190b191aW50X21hcDsKKyAgICAgIHByb2ctPmJhc2UuRnJhZ0RhdGFJbmRleEJpbmRpbmdzID0gbmV3IHN0cmluZ190b191aW50X21hcDsKKworICAgICAgcHJvZy0+YmFzZS5HZW9tLlZlcnRpY2VzT3V0ID0gMDsKKyAgICAgIHByb2ctPmJhc2UuR2VvbS5JbnB1dFR5cGUgPSBHTF9UUklBTkdMRVM7CisgICAgICBwcm9nLT5iYXNlLkdlb20uT3V0cHV0VHlwZSA9IEdMX1RSSUFOR0xFX1NUUklQOworCisgICAgICBwcm9nLT5iYXNlLlRyYW5zZm9ybUZlZWRiYWNrLkJ1ZmZlck1vZGUgPSBHTF9JTlRFUkxFQVZFRF9BVFRSSUJTOworCisgICAgICBwcm9nLT5iYXNlLkluZm9Mb2cgPSByYWxsb2Nfc3RyZHVwKHByb2csICIiKTsKKyAgIH0KKyAgIHJldHVybiAmcHJvZy0+YmFzZTsKK30KKwordm9pZAorYnJ3X25vdGlmeV9saW5rX3NoYWRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoUHJvZykKK3sKKy8vICAgaWYgKGJydy0+cHJlY29tcGlsZSkgeworLy8gICAgICBwcm9nLT5wcmVfa2V5LmZib19oZWlnaHQgPSBjdHgtPkRyYXdCdWZmZXItPkhlaWdodDsKKy8vICAgICAgcHJvZy0+cHJlX2tleS5pc191c2VyX2ZibyA9IF9tZXNhX2lzX3VzZXJfZmJvKGN0eC0+RHJhd0J1ZmZlcik7CisvLyAgIH0KK30KKworY29uc3Qgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbV9wcmVjb21waWxlX2tleSAqCiticndfc2hhZGVyX3Byb2dyYW1fZ2V0X3ByZWNvbXBpbGVfa2V5KHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2cpCit7CisgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpwcm9nID0gYnJ3X3NoYWRlcl9wcm9ncmFtKHNoYWRlcl9wcm9nKTsKKyAgIHJldHVybiAmcHJvZy0+cHJlX2tleTsKK30KKwordm9pZAorYnJ3X3NoYWRlcl9wcm9ncmFtX3NhdmVfdnNfY29tcGlsZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3ZzX2NvbXBpbGUgKmMpCit7CisgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpwcm9nID0gYnJ3X3NoYWRlcl9wcm9ncmFtKHNoYWRlcl9wcm9nKTsKKworICAgbWVtY3B5KCZwcm9nLT52cy5rZXksICZjLT5rZXksIHNpemVvZihwcm9nLT52cy5rZXkpKTsKKyAgIG1lbWNweSgmcHJvZy0+dnMuZGF0YSwgJmMtPnByb2dfZGF0YSwgc2l6ZW9mKHByb2ctPnZzLmRhdGEpKTsKKyAgIHByb2ctPnZzLnByb2dyYW0gPSBjLT5iYXNlLnByb2dyYW07CisgICBwcm9nLT52cy5wcm9ncmFtX3NpemUgPSBjLT5iYXNlLnByb2dyYW1fc2l6ZTsKKyAgIHJhbGxvY19zdGVhbChzaGFkZXJfcHJvZywgKHZvaWQgKikgYy0+YmFzZS5wcm9ncmFtKTsKKworICAgcHJvZy0+c2F2ZWQgfD0gMSA8PCBCUldfVlNfUFJPRzsKK30KKwordm9pZAorYnJ3X3NoYWRlcl9wcm9ncmFtX3NhdmVfZ3NfY29tcGlsZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X2dzX2NvbXBpbGUgKmMpCit7CisgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpwcm9nID0gYnJ3X3NoYWRlcl9wcm9ncmFtKHNoYWRlcl9wcm9nKTsKKworICAgbWVtY3B5KCZwcm9nLT5ncy5rZXksICZjLT5rZXksIHNpemVvZihwcm9nLT5ncy5rZXkpKTsKKyAgIG1lbWNweSgmcHJvZy0+Z3MuZGF0YSwgJmMtPnByb2dfZGF0YSwgc2l6ZW9mKHByb2ctPmdzLmRhdGEpKTsKKyAgIHByb2ctPmdzLnByb2dyYW0gPSBjLT5iYXNlLnByb2dyYW07CisgICBwcm9nLT5ncy5wcm9ncmFtX3NpemUgPSBjLT5iYXNlLnByb2dyYW1fc2l6ZTsKKyAgIHJhbGxvY19zdGVhbChzaGFkZXJfcHJvZywgKHZvaWQgKikgYy0+YmFzZS5wcm9ncmFtKTsKKworICAgcHJvZy0+c2F2ZWQgfD0gMSA8PCBCUldfR1NfUFJPRzsKK30KKwordm9pZAorYnJ3X3NoYWRlcl9wcm9ncmFtX3NhdmVfd21fY29tcGlsZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpCit7CisgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpwcm9nID0gYnJ3X3NoYWRlcl9wcm9ncmFtKHNoYWRlcl9wcm9nKTsKKworICAgbWVtY3B5KCZwcm9nLT53bS5rZXksICZjLT5rZXksIHNpemVvZihwcm9nLT53bS5rZXkpKTsKKyAgIG1lbWNweSgmcHJvZy0+d20uZGF0YSwgJmMtPnByb2dfZGF0YSwgc2l6ZW9mKHByb2ctPndtLmRhdGEpKTsKKyAgIHByb2ctPndtLnByb2dyYW0gPSBjLT5wcm9ncmFtOworICAgcHJvZy0+d20ucHJvZ3JhbV9zaXplID0gYy0+cHJvZ3JhbV9zaXplOworICAgcmFsbG9jX3N0ZWFsKHNoYWRlcl9wcm9nLCAodm9pZCAqKSBjLT5wcm9ncmFtKTsKKworICAgcHJvZy0+c2F2ZWQgfD0gMSA8PCBCUldfV01fUFJPRzsKK30KKworYm9vbAorYnJ3X3NoYWRlcl9wcm9ncmFtX3Jlc3RvcmVfdnNfY29tcGlsZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZzX2NvbXBpbGUgKmMpCit7CisgICBzdHJ1Y3QgYnJ3X3NoYWRlcl9wcm9ncmFtICpwcm9nID0gYnJ3X3NoYWRlcl9wcm9ncmFtKHNoYWRlcl9wcm9nKTsKKworICAgaWYgKCEocHJvZy0+c2F2ZWQgJiAoMSA8PCBCUldfVlNfUFJPRykpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBwcm9nLT5zYXZlZCAmPSB+KDEgPDwgQlJXX1ZTX1BST0cpOworCisgICBpZiAobWVtY21wKCZjLT5rZXksICZwcm9nLT52cy5rZXksIHNpemVvZihwcm9nLT52cy5rZXkpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgbWVtY3B5KCZjLT5wcm9nX2RhdGEsICZwcm9nLT52cy5kYXRhLCBzaXplb2YocHJvZy0+dnMuZGF0YSkpOworICAgYy0+YmFzZS5wcm9ncmFtID0gcHJvZy0+dnMucHJvZ3JhbTsKKyAgIGMtPmJhc2UucHJvZ3JhbV9zaXplID0gcHJvZy0+dnMucHJvZ3JhbV9zaXplOworICAgcmFsbG9jX3N0ZWFsKGMtPmJhc2UubWVtX2N0eCwgKHZvaWQgKikgYy0+YmFzZS5wcm9ncmFtKTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2Jyd19zaGFkZXJfcHJvZ3JhbV9yZXN0b3JlX2dzX2NvbXBpbGUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19nc19jb21waWxlICpjKQoreworICAgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbSAqcHJvZyA9IGJyd19zaGFkZXJfcHJvZ3JhbShzaGFkZXJfcHJvZyk7CisKKyAgIGlmICghKHByb2ctPnNhdmVkICYgKDEgPDwgQlJXX0dTX1BST0cpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcHJvZy0+c2F2ZWQgJj0gfigxIDw8IEJSV19HU19QUk9HKTsKKworICAgaWYgKG1lbWNtcCgmYy0+a2V5LCAmcHJvZy0+Z3Mua2V5LCBzaXplb2YocHJvZy0+Z3Mua2V5KSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIG1lbWNweSgmYy0+cHJvZ19kYXRhLCAmcHJvZy0+Z3MuZGF0YSwgc2l6ZW9mKHByb2ctPmdzLmRhdGEpKTsKKyAgIGMtPmJhc2UucHJvZ3JhbSA9IHByb2ctPmdzLnByb2dyYW07CisgICBjLT5iYXNlLnByb2dyYW1fc2l6ZSA9IHByb2ctPmdzLnByb2dyYW1fc2l6ZTsKKyAgIHJhbGxvY19zdGVhbChjLT5iYXNlLm1lbV9jdHgsICh2b2lkICopIGMtPmJhc2UucHJvZ3JhbSk7CisKKyAgIHJldHVybiB0cnVlOworfQorCitib29sCiticndfc2hhZGVyX3Byb2dyYW1fcmVzdG9yZV93bV9jb21waWxlKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfd21fY29tcGlsZSAqYykKK3sKKyAgIHN0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKnByb2cgPSBicndfc2hhZGVyX3Byb2dyYW0oc2hhZGVyX3Byb2cpOworCisgICBpZiAoIShwcm9nLT5zYXZlZCAmICgxIDw8IEJSV19XTV9QUk9HKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHByb2ctPnNhdmVkICY9IH4oMSA8PCBCUldfV01fUFJPRyk7CisKKyAgIGlmIChtZW1jbXAoJmMtPmtleSwgJnByb2ctPndtLmtleSwgc2l6ZW9mKHByb2ctPndtLmtleSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBtZW1jcHkoJmMtPnByb2dfZGF0YSwgJnByb2ctPndtLmRhdGEsIHNpemVvZihwcm9nLT53bS5kYXRhKSk7CisgICBjLT5wcm9ncmFtID0gcHJvZy0+d20ucHJvZ3JhbTsKKyAgIGMtPnByb2dyYW1fc2l6ZSA9IHByb2ctPndtLnByb2dyYW1fc2l6ZTsKKyAgIHJhbGxvY19zdGVhbChjLCAodm9pZCAqKSBjLT5wcm9ncmFtKTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUGVyZm9ybXMgYSBjb21waWxlIG9mIHRoZSBzaGFkZXIgc3RhZ2VzIGV2ZW4gd2hlbiB3ZSBkb24ndCBrbm93CisgKiB3aGF0IG5vbi1vcnRob2dvbmFsIHN0YXRlIHdpbGwgYmUgc2V0LCBpbiB0aGUgaG9wZSB0aGF0IGl0IHJlZmxlY3RzCisgKiB0aGUgZXZlbnR1YWwgTk9TIHVzZWQsIGFuZCB0aHVzIGFsbG93cyB1cyB0byBwcm9kdWNlIGxpbmsgZmFpbHVyZXMuCisgKi8KK3N0YXRpYyBib29sCiticndfc2hhZGVyX3ByZWNvbXBpbGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgc3dpdGNoKHByb2ctPlR5cGUpIHsKKyAgIGNhc2UgTUVTQV9TSEFERVJfRlJBR01FTlQ6CisgICAgICAgaWYgKCFicndfZnNfcHJlY29tcGlsZShjdHgsIHByb2cpKQorICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgTUVTQV9TSEFERVJfR0VPTUVUUlk6CisgICAgICAgaWYgKCFicndfZ3NfcHJlY29tcGlsZShjdHgsIHByb2cpKQorICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgIGlmICghYnJ3X3ZzX3ByZWNvbXBpbGUoY3R4LCBwcm9nKSkKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICBhc3NlcnQoMCk7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorYnJ3X2xvd2VyX3BhY2tpbmdfYnVpbHRpbnMoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXJfc3RhZ2Ugc2hhZGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjX2xpc3QgKmlyKQoreworICAgaW50IG9wcyA9IExPV0VSX1BBQ0tfU05PUk1fMngxNgorICAgICAgICAgICB8IExPV0VSX1VOUEFDS19TTk9STV8yeDE2CisgICAgICAgICAgIHwgTE9XRVJfUEFDS19VTk9STV8yeDE2CisgICAgICAgICAgIHwgTE9XRVJfVU5QQUNLX1VOT1JNXzJ4MTYKKyAgICAgICAgICAgfCBMT1dFUl9QQUNLX1NOT1JNXzR4OAorICAgICAgICAgICB8IExPV0VSX1VOUEFDS19TTk9STV80eDgKKyAgICAgICAgICAgfCBMT1dFUl9QQUNLX1VOT1JNXzR4OAorICAgICAgICAgICB8IExPV0VSX1VOUEFDS19VTk9STV80eDg7CisKKyAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICAvKiBHZW43IGludHJvZHVjZWQgdGhlIGYzMnRvMTYgYW5kIGYxNnRvMzIgaW5zdHJ1Y3Rpb25zLCB3aGljaCBjYW4gYmUKKyAgICAgICAqIHVzZWQgdG8gZXhlY3V0ZSBwYWNrSGFsZjJ4MTYgYW5kIHVucGFja0hhbGYyeDE2LiBGb3IgQU9TIGNvZGUsIG5vCisgICAgICAgKiBsb3dlcmluZyBpcyBuZWVkZWQuIEZvciBTT0EgY29kZSwgdGhlIEhhbGYyeDE2IG9wcyBtdXN0IGJlCisgICAgICAgKiBzY2FsYXJpemVkLgorICAgICAgICovCisgICAgICBpZiAoc2hhZGVyX3R5cGUgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpIHsKKyAgICAgICAgIG9wcyB8PSBMT1dFUl9QQUNLX0hBTEZfMngxNl9UT19TUExJVAorICAgICAgICAgICAgIHwgIExPV0VSX1VOUEFDS19IQUxGXzJ4MTZfVE9fU1BMSVQ7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgb3BzIHw9IExPV0VSX1BBQ0tfSEFMRl8yeDE2CisgICAgICAgICAgfCAgTE9XRVJfVU5QQUNLX0hBTEZfMngxNjsKKyAgIH0KKworICAgbG93ZXJfcGFja2luZ19idWlsdGlucyhpciwgb3BzKTsKK30KKworLyoqCisgKiBDb3B5IHByb2dyYW0tc3BlY2lmaWMgZGF0YSBnZW5lcmF0ZWQgYnkgbGlua2luZyBmcm9tIHRoZSBnbF9zaGFkZXJfcHJvZ3JhbQorICogb2JqZWN0IHRvIGEgc3BlY2lmaWMgZ2xfcHJvZ3JhbSBvYmplY3QuCisgKgorICogQnJvdWdodCBvdmVyIGZyb20gc2hhZGVyYXBpLmMKKyAqLwordm9pZCBtZXNhX2NvcHlfbGlua2VkX3Byb2dyYW1fZGF0YShnbF9zaGFkZXJfc3RhZ2UgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqZHN0KQoreworICAgc3dpdGNoICh0eXBlKSB7CisgICBjYXNlIE1FU0FfU0hBREVSX1ZFUlRFWDoKKyAgICAgIGRzdC0+VXNlc0NsaXBEaXN0YW5jZU91dCA9IHNyYy0+VmVydC5Vc2VzQ2xpcERpc3RhbmNlOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0dFT01FVFJZOiB7CisgICAgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqZHN0X2dwID0gKHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICopIGRzdDsKKyAgICAgIGRzdF9ncC0+VmVydGljZXNJbiA9IHNyYy0+R2VvbS5WZXJ0aWNlc0luOworICAgICAgZHN0X2dwLT5WZXJ0aWNlc091dCA9IHNyYy0+R2VvbS5WZXJ0aWNlc091dDsKKyAgICAgIGRzdF9ncC0+SW52b2NhdGlvbnMgPSBzcmMtPkdlb20uSW52b2NhdGlvbnM7CisgICAgICBkc3RfZ3AtPklucHV0VHlwZSA9IHNyYy0+R2VvbS5JbnB1dFR5cGU7CisgICAgICBkc3RfZ3AtPk91dHB1dFR5cGUgPSBzcmMtPkdlb20uT3V0cHV0VHlwZTsKKyAgICAgIGRzdC0+VXNlc0NsaXBEaXN0YW5jZU91dCA9IHNyYy0+R2VvbS5Vc2VzQ2xpcERpc3RhbmNlOworICAgICAgZHN0X2dwLT5Vc2VzRW5kUHJpbWl0aXZlID0gc3JjLT5HZW9tLlVzZXNFbmRQcmltaXRpdmU7CisgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgTUVTQV9TSEFERVJfQ09NUFVURTogeworICAgICAgc3RydWN0IGdsX2NvbXB1dGVfcHJvZ3JhbSAqZHN0X2NwID0gKHN0cnVjdCBnbF9jb21wdXRlX3Byb2dyYW0gKikgZHN0OworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgZHN0X2NwLT5Mb2NhbFNpemVbaV0gPSBzcmMtPkNvbXAuTG9jYWxTaXplW2ldOworICAgfQorICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICB9Cit9CisKKworLy8gTHVuYXJHIDogQUREIC0gV2UgcmVkaWQgaW5kZW50aW5nIGZvciB0aGlzIHdob2xlIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcmVhZGFibGUKK0dMYm9vbGVhbgorYnJ3X2xpbmtfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hQcm9nKQoreworICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKKyAgICB1bnNpZ25lZCBpbnQgc3RhZ2U7CisKKyAgICBmb3IgKHN0YWdlID0gMDsgc3RhZ2UgPCBBUlJBWV9TSVpFKHNoUHJvZy0+X0xpbmtlZFNoYWRlcnMpOyBzdGFnZSsrKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucyAqb3B0aW9ucyA9CisgICAgICAgICAgICAgICAgJmN0eC0+U2hhZGVyQ29tcGlsZXJPcHRpb25zW3N0YWdlXTsKKyAgICAgICAgc3RydWN0IGJyd19zaGFkZXIgKnNoYWRlciA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCBicndfc2hhZGVyICopc2hQcm9nLT5fTGlua2VkU2hhZGVyc1tzdGFnZV07CisKKyAgICAgICAgaWYgKCFzaGFkZXIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZyA9CisgICAgICAgICAgICAgICAgLy8gTHVuYXJHIDogQ2FsbCB0aGUgZnVuY3Rpb24gZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAvLyAgICAgY3R4LT5Ecml2ZXIuTmV3UHJvZ3JhbShjdHgsIF9tZXNhX3NoYWRlcl9zdGFnZV90b19wcm9ncmFtKHN0YWdlKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyLT5iYXNlLk5hbWUpOworICAgICAgICAgICAgICAgIGJyd05ld1Byb2dyYW0oY3R4LCBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fcHJvZ3JhbShzdGFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXItPmJhc2UuTmFtZSk7CisgICAgICAgIGlmICghcHJvZykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcHJvZy0+UGFyYW1ldGVycyA9IF9tZXNhX25ld19wYXJhbWV0ZXJfbGlzdCgpOworCisgICAgICAgIG1lc2FfY29weV9saW5rZWRfcHJvZ3JhbV9kYXRhKChnbF9zaGFkZXJfc3RhZ2UpIHN0YWdlLCBzaFByb2csIHByb2cpOworCisgICAgICAgIGJvb2wgcHJvZ3Jlc3M7CisKKyAgICAgICAgLyogbG93ZXJfcGFja2luZ19idWlsdGlucygpIGluc2VydHMgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMsIHNvIGl0CisgICAgICAgICAqIG11c3QgcHJlY2VkZSBsb3dlcl9pbnN0cnVjdGlvbnMoKS4KKyAgICAgICAgICovCisgICAgICAgIGJyd19sb3dlcl9wYWNraW5nX2J1aWx0aW5zKGJydywgKGdsX3NoYWRlcl9zdGFnZSkgc3RhZ2UsIHNoYWRlci0+YmFzZS5pcik7CisgICAgICAgIGRvX21hdF9vcF90b192ZWMoc2hhZGVyLT5iYXNlLmlyKTsKKyAgICAgICAgY29uc3QgaW50IGJpdGZpZWxkX2luc2VydCA9IGJydy0+Z2VuID49IDcKKyAgICAgICAgICAgICAgICA/IEJJVEZJRUxEX0lOU0VSVF9UT19CRk1fQkZJCisgICAgICAgICAgICAgICAgOiAwOworICAgICAgICBsb3dlcl9pbnN0cnVjdGlvbnMoc2hhZGVyLT5iYXNlLmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EX1RPX0ZSQUNUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVl9UT19NVUxfUkNQIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9UT19BRERfTkVHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUF9UT19FWFAyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19UT19MT0cyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGZpZWxkX2luc2VydCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREVYUF9UT19BUklUSCk7CisKKyAgICAgICAgLyogUHJlLWdlbjYgSFcgY2FuIG9ubHkgbmVzdCBpZi1zdGF0ZW1lbnRzIDE2IGRlZXAuICBCZXlvbmQgdGhpcywKKyAgICAgICAgICogaWYtc3RhdGVtZW50cyBuZWVkIHRvIGJlIGZsYXR0ZW5lZC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChicnctPmdlbiA8IDYpCisgICAgICAgICAgICBsb3dlcl9pZl90b19jb25kX2Fzc2lnbihzaGFkZXItPmJhc2UuaXIsIDE2KTsKKworICAgICAgICBkb19sb3dlcl90ZXh0dXJlX3Byb2plY3Rpb24oc2hhZGVyLT5iYXNlLmlyKTsKKyAgICAgICAgYnJ3X2xvd2VyX3RleHR1cmVfZ3JhZGllbnRzKGJydywgc2hhZGVyLT5iYXNlLmlyKTsKKyAgICAgICAgZG9fdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduKHNoYWRlci0+YmFzZS5pcik7CisgICAgICAgIGxvd2VyX3ZlY3Rvcl9pbnNlcnQoc2hhZGVyLT5iYXNlLmlyLCB0cnVlKTsKKyAgICAgICAgYnJ3X2RvX2N1YmVtYXBfbm9ybWFsaXplKHNoYWRlci0+YmFzZS5pcik7CisgICAgICAgIGxvd2VyX29mZnNldF9hcnJheXMoc2hhZGVyLT5iYXNlLmlyKTsKKyAgICAgICAgYnJ3X2RvX2xvd2VyX3Vubm9ybWFsaXplZF9vZmZzZXQoc2hhZGVyLT5iYXNlLmlyKTsKKyAgICAgICAgbG93ZXJfbm9pc2Uoc2hhZGVyLT5iYXNlLmlyKTsKKyAgICAgICAgbG93ZXJfcXVhZG9wX3ZlY3RvcihzaGFkZXItPmJhc2UuaXIsIGZhbHNlKTsKKworICAgICAgICBib29sIGxvd2VyZWRfdmFyaWFibGVfaW5kZXhpbmcgPQorICAgICAgICAgICAgICAgIGxvd2VyX3ZhcmlhYmxlX2luZGV4X3RvX2NvbmRfYXNzaWduKHNoYWRlci0+YmFzZS5pciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLT5FbWl0Tm9JbmRpcmVjdElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMtPkVtaXROb0luZGlyZWN0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMtPkVtaXROb0luZGlyZWN0VGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLT5FbWl0Tm9JbmRpcmVjdFVuaWZvcm0pOworCisgICAgICAgIGlmICh1bmxpa2VseShicnctPnBlcmZfZGVidWcgJiYgbG93ZXJlZF92YXJpYWJsZV9pbmRleGluZykpIHsKKyAgICAgICAgICAgIHBlcmZfZGVidWcoIlVuc3VwcG9ydGVkIGZvcm0gb2YgdmFyaWFibGUgaW5kZXhpbmcgaW4gRlM7IGZhbGxpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAiYmFjayB0byB2ZXJ5IGluZWZmaWNpZW50IGNvZGUgZ2VuZXJhdGlvblxuIik7CisgICAgICAgIH0KKworICAgICAgICBsb3dlcl91Ym9fcmVmZXJlbmNlKCZzaGFkZXItPmJhc2UsIHNoYWRlci0+YmFzZS5pcik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UKSB7CisgICAgICAgICAgICAgICAgYnJ3X2RvX2NoYW5uZWxfZXhwcmVzc2lvbnMoc2hhZGVyLT5iYXNlLmlyKTsKKyAgICAgICAgICAgICAgICBicndfZG9fdmVjdG9yX3NwbGl0dGluZyhzaGFkZXItPmJhc2UuaXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9ncmVzcyA9IGRvX2xvd2VyX2p1bXBzKHNoYWRlci0+YmFzZS5pciwgdHJ1ZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLyogbWFpbiByZXR1cm4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIGNvbnRpbnVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGxvb3BzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgcHJvZ3Jlc3M7CisKKyAgICAgICAgICAgIHByb2dyZXNzID0gZG9fY29tbW9uX29wdGltaXphdGlvbihzaGFkZXItPmJhc2UuaXIsIHRydWUsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgY3R4LT5Db25zdC5OYXRpdmVJbnRlZ2VycykKKyAgICAgICAgICAgICAgICAgICAgfHwgcHJvZ3Jlc3M7CisgICAgICAgIH0gd2hpbGUgKHByb2dyZXNzKTsKKworICAgICAgICAvKiBNYWtlIGEgcGFzcyBvdmVyIHRoZSBJUiB0byBhZGQgc3RhdGUgcmVmZXJlbmNlcyBmb3IgYW55IGJ1aWx0LWluCisgICAgICAgICAgKiB1bmlmb3JtcyB0aGF0IGFyZSB1c2VkLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBub3cgKGR1cmluZyBsaW5raW5nKS4KKyAgICAgICAgICAqIENvZGUgZ2VuZXJhdGlvbiBkb2Vzbid0IGhhcHBlbiB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGlzIHNoYWRlciBpcworICAgICAgICAgICogdXNlZCBmb3IgcmVuZGVyaW5nLiAgV2FpdGluZyB1bnRpbCB0aGVuIHRvIGdlbmVyYXRlIHRoZSBwYXJhbWV0ZXJzIGlzCisgICAgICAgICAgKiB0b28gbGF0ZS4gIEF0IHRoYXQgcG9pbnQsIHRoZSB2YWx1ZXMgZm9yIHRoZSBidWlsdC1pbiB1bmlmb3JtcyB3b24ndAorICAgICAgICAgICogZ2V0IHNlbnQgdG8gdGhlIHNoYWRlci4KKyAgICAgICAgICAqLworICAgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgc2hhZGVyLT5iYXNlLmlyKSB7CisgICAgICAgICAgICBpcl92YXJpYWJsZSAqdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworICAgICAgICAgICAgaWYgKCh2YXIgPT0gTlVMTCkgfHwgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl91bmlmb3JtKQorICAgICAgICAgICAgICAgICAgICB8fCAoc3RybmNtcCh2YXItPm5hbWUsICJnbF8iLCAzKSAhPSAwKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY29uc3QgaXJfc3RhdGVfc2xvdCAqY29uc3Qgc2xvdHMgPSB2YXItPnN0YXRlX3Nsb3RzOworICAgICAgICAgICAgYXNzZXJ0KHZhci0+c3RhdGVfc2xvdHMgIT0gTlVMTCk7CisKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdmFyLT5udW1fc3RhdGVfc2xvdHM7IGkrKykgeworICAgICAgICAgICAgICAgIF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UocHJvZy0+UGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnbF9zdGF0ZV9pbmRleCAqKSBzbG90c1tpXS50b2tlbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsaWRhdGVfaXJfdHJlZShzaGFkZXItPmJhc2UuaXIpOworCisgICAgICAgIGRvX3NldF9wcm9ncmFtX2lub3V0cyhzaGFkZXItPmJhc2UuaXIsIHByb2csIHNoYWRlci0+YmFzZS5TdGFnZSk7CisKKyAgICAgICAgcHJvZy0+U2FtcGxlcnNVc2VkID0gc2hhZGVyLT5iYXNlLmFjdGl2ZV9zYW1wbGVyczsKKworICAgICAgICBfbWVzYV91cGRhdGVfc2hhZGVyX3RleHR1cmVzX3VzZWQoc2hQcm9nLCBwcm9nKTsKKworICAgICAgICBfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShjdHgsICZzaGFkZXItPmJhc2UuUHJvZ3JhbSwgcHJvZyk7CisKKyAgICAgICAgLy8gTHVuYXJHIDogVE9ETyAtIHJlY3RhbmdsZSBzdXBwb3J0CisgICAgICAgIC8vICAgICAgYnJ3X2FkZF90ZXhyZWN0X3BhcmFtcyhwcm9nKTsKKworICAgICAgICAvKiBUaGlzIGhhcyB0byBiZSBkb25lIGxhc3QuICBBbnkgb3BlcmF0aW9uIHRoYXQgY2FuIGNhdXNlCisgICAgICAgICAqIHByb2ctPlBhcmFtZXRlclZhbHVlcyB0byBnZXQgcmVhbGxvY2F0ZWQgKGUuZy4sIGFueXRoaW5nIHRoYXQgYWRkcyBhCisgICAgICAgICAqIHByb2dyYW0gY29uc3RhbnQpIGhhcyB0byBoYXBwZW4gYmVmb3JlIGNyZWF0aW5nIHRoaXMgbGlua2FnZS4KKyAgICAgICAgICovCisgICAgICAgIC8vIEx1bmFyRyA6IFRPRE8gLSB1bmlmb3JtIHN1cHBvcnQKKyAgICAgICAgLy8gICAgICBfbWVzYV9hc3NvY2lhdGVfdW5pZm9ybV9zdG9yYWdlKGN0eCwgc2hQcm9nLCBwcm9nLT5QYXJhbWV0ZXJzKTsKKworICAgICAgICBfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShjdHgsICZwcm9nLCBOVUxMKTsKKworICAgICAgICBpZiAoY3R4LT5HbHNsRmxhZ3MgJiBHTFNMX0RVTVApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR0xTTCBJUiBmb3IgbGlua2VkICVzIHByb2dyYW0gJWQ6XG4iLAorICAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKHNoYWRlci0+YmFzZS5TdGFnZSksCisgICAgICAgICAgICAgICAgICAgIHNoUHJvZy0+TmFtZSk7CisgICAgICAgICAgICBfbWVzYV9wcmludF9pcihzdGRlcnIsIHNoYWRlci0+YmFzZS5pciwgTlVMTCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGN0eC0+R2xzbEZsYWdzICYgR0xTTF9EVU1QKSAmJiBzaFByb2ctPk5hbWUgIT0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hQcm9nLT5OdW1TaGFkZXJzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9zaGFkZXIgKnNoID0gc2hQcm9nLT5TaGFkZXJzW2ldOworICAgICAgICAgICAgaWYgKCFzaCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHTFNMICVzIHNoYWRlciAlZCBzb3VyY2UgZm9yIGxpbmtlZCBwcm9ncmFtICVkOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhzaC0+U3RhZ2UpLAorICAgICAgICAgICAgICAgICAgICBpLCBzaFByb2ctPk5hbWUpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHNoLT5Tb3VyY2UpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFicndfc2hhZGVyX3ByZWNvbXBpbGUoY3R4LCBzaFByb2cpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitpbnQKK2Jyd190eXBlX2Zvcl9iYXNlX3R5cGUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHN3aXRjaCAodHlwZS0+YmFzZV90eXBlKSB7CisgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBCUldfUkVHSVNURVJfVFlQRV9GOworICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIHJldHVybiBCUldfUkVHSVNURVJfVFlQRV9EOworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgICAgIHJldHVybiBCUldfUkVHSVNURVJfVFlQRV9VRDsKKyAgIGNhc2UgR0xTTF9UWVBFX0FSUkFZOgorICAgICAgcmV0dXJuIGJyd190eXBlX2Zvcl9iYXNlX3R5cGUodHlwZS0+ZmllbGRzLmFycmF5KTsKKyAgIGNhc2UgR0xTTF9UWVBFX1NUUlVDVDoKKyAgIGNhc2UgR0xTTF9UWVBFX1NBTVBMRVI6CisgICBjYXNlIEdMU0xfVFlQRV9BVE9NSUNfVUlOVDoKKyAgICAgIC8qIFRoZXNlIHNob3VsZCBiZSBvdmVycmlkZGVuIHdpdGggdGhlIHR5cGUgb2YgdGhlIG1lbWJlciB3aGVuCisgICAgICAgKiBkZXJlZmVyZW5jZWQgaW50by4gIEJSV19SRUdJU1RFUl9UWVBFX1VEIHNlZW1zIGxpa2UgYSBsaWtlbHkKKyAgICAgICAqIHdheSB0byB0cmlwIHVwIGlmIHdlIGRvbid0LgorICAgICAgICovCisgICAgICByZXR1cm4gQlJXX1JFR0lTVEVSX1RZUEVfVUQ7CisgICBjYXNlIEdMU0xfVFlQRV9JTUFHRToKKyAgICAgIHJldHVybiBCUldfUkVHSVNURVJfVFlQRV9VRDsKKyAgIGNhc2UgR0xTTF9UWVBFX1ZPSUQ6CisgICBjYXNlIEdMU0xfVFlQRV9FUlJPUjoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVEVSRkFDRToKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIEJSV19SRUdJU1RFUl9UWVBFX0Y7Cit9CisKK3VpbnQzMl90CiticndfY29uZGl0aW9uYWxfZm9yX2NvbXBhcmlzb24odW5zaWduZWQgaW50IG9wKQoreworICAgc3dpdGNoIChvcCkgeworICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgICAgcmV0dXJuIEJSV19DT05ESVRJT05BTF9MOworICAgY2FzZSBpcl9iaW5vcF9ncmVhdGVyOgorICAgICAgcmV0dXJuIEJSV19DT05ESVRJT05BTF9HOworICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisgICAgICByZXR1cm4gQlJXX0NPTkRJVElPTkFMX0xFOworICAgY2FzZSBpcl9iaW5vcF9nZXF1YWw6CisgICAgICByZXR1cm4gQlJXX0NPTkRJVElPTkFMX0dFOworICAgY2FzZSBpcl9iaW5vcF9lcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfYWxsX2VxdWFsOiAvKiBzYW1lIGFzIGVxdWFsIGZvciBzY2FsYXJzICovCisgICAgICByZXR1cm4gQlJXX0NPTkRJVElPTkFMX1o7CisgICBjYXNlIGlyX2Jpbm9wX25lcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfYW55X25lcXVhbDogLyogc2FtZSBhcyBuZXF1YWwgZm9yIHNjYWxhcnMgKi8KKyAgICAgIHJldHVybiBCUldfQ09ORElUSU9OQUxfTlo7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IGJhZCBvcGVyYXRpb24gZm9yIGNvbXBhcmlzb24iKTsKKyAgICAgIHJldHVybiBCUldfQ09ORElUSU9OQUxfTlo7CisgICB9Cit9CisKK3VpbnQzMl90CiticndfbWF0aF9mdW5jdGlvbihlbnVtIG9wY29kZSBvcCkKK3sKKyAgIHN3aXRjaCAob3ApIHsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9SQ1A6CisgICAgICByZXR1cm4gQlJXX01BVEhfRlVOQ1RJT05fSU5WOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1JTUToKKyAgICAgIHJldHVybiBCUldfTUFUSF9GVU5DVElPTl9SU1E7CisgICBjYXNlIFNIQURFUl9PUENPREVfU1FSVDoKKyAgICAgIHJldHVybiBCUldfTUFUSF9GVU5DVElPTl9TUVJUOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0VYUDI6CisgICAgICByZXR1cm4gQlJXX01BVEhfRlVOQ1RJT05fRVhQOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0xPRzI6CisgICAgICByZXR1cm4gQlJXX01BVEhfRlVOQ1RJT05fTE9HOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1BPVzoKKyAgICAgIHJldHVybiBCUldfTUFUSF9GVU5DVElPTl9QT1c7CisgICBjYXNlIFNIQURFUl9PUENPREVfU0lOOgorICAgICAgcmV0dXJuIEJSV19NQVRIX0ZVTkNUSU9OX1NJTjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9DT1M6CisgICAgICByZXR1cm4gQlJXX01BVEhfRlVOQ1RJT05fQ09TOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9RVU9USUVOVDoKKyAgICAgIHJldHVybiBCUldfTUFUSF9GVU5DVElPTl9JTlRfRElWX1FVT1RJRU5UOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVI6CisgICAgICByZXR1cm4gQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9SRU1BSU5ERVI7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IHVua25vd24gbWF0aCBmdW5jdGlvbiIpOworICAgICAgcmV0dXJuIDA7CisgICB9Cit9CisKK3VpbnQzMl90CiticndfdGV4dHVyZV9vZmZzZXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgaXJfY29uc3RhbnQgKm9mZnNldCkKK3sKKyAgIC8qIElmIHRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBHTF9BUkJfZ3B1X3NoYWRlcjUsIHRoZSBvZmZzZXQKKyAgICAqIG11c3QgYmUgY29uc3RhbnQuCisgICAgKi8KKyAgIGFzc2VydChvZmZzZXQgIT0gTlVMTCB8fCBjdHgtPkV4dGVuc2lvbnMuQVJCX2dwdV9zaGFkZXI1KTsKKworICAgaWYgKCFvZmZzZXQpIHJldHVybiAwOyAgLyogbm9uY29uc3RhbnQgb2Zmc2V0OyBjYWxsZXIgd2lsbCBoYW5kbGUgaXQuICovCisKKyAgIHNpZ25lZCBjaGFyIG9mZnNldHNbM107CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb2Zmc2V0LT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykKKyAgICAgIG9mZnNldHNbaV0gPSAoc2lnbmVkIGNoYXIpIG9mZnNldC0+dmFsdWUuaVtpXTsKKworICAgLyogQ29tYmluZSBhbGwgdGhyZWUgb2Zmc2V0cyBpbnRvIGEgc2luZ2xlIHVuc2lnbmVkIGR3b3JkOgorICAgICoKKyAgICAqICAgIGJpdHMgMTE6OCAtIFUgT2Zmc2V0IChYIGNvbXBvbmVudCkKKyAgICAqICAgIGJpdHMgIDc6NCAtIFYgT2Zmc2V0IChZIGNvbXBvbmVudCkKKyAgICAqICAgIGJpdHMgIDM6MCAtIFIgT2Zmc2V0IChaIGNvbXBvbmVudCkKKyAgICAqLworICAgdW5zaWduZWQgb2Zmc2V0X2JpdHMgPSAwOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9mZnNldC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIHNoaWZ0ID0gNCAqICgyIC0gaSk7CisgICAgICBvZmZzZXRfYml0cyB8PSAob2Zmc2V0c1tpXSA8PCBzaGlmdCkgJiAoMHhGIDw8IHNoaWZ0KTsKKyAgIH0KKyAgIHJldHVybiBvZmZzZXRfYml0czsKK30KKworY29uc3QgY2hhciAqCiticndfaW5zdHJ1Y3Rpb25fbmFtZShlbnVtIG9wY29kZSBvcCkKK3sKKyAgIGNoYXIgKmZhbGxiYWNrOworCisgICBpZiAob3AgPCBBUlJBWV9TSVpFKG9wY29kZV9kZXNjcykgJiYgb3Bjb2RlX2Rlc2NzW29wXS5uYW1lKQorICAgICAgcmV0dXJuIG9wY29kZV9kZXNjc1tvcF0ubmFtZTsKKworICAgc3dpdGNoIChvcCkgeworICAgY2FzZSBGU19PUENPREVfRkJfV1JJVEU6CisgICAgICByZXR1cm4gImZiX3dyaXRlIjsKKyAgIGNhc2UgRlNfT1BDT0RFX0JMT1JQX0ZCX1dSSVRFOgorICAgICAgcmV0dXJuICJibG9ycF9mYl93cml0ZSI7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9SQ1A6CisgICAgICByZXR1cm4gInJjcCI7CisgICBjYXNlIFNIQURFUl9PUENPREVfUlNROgorICAgICAgcmV0dXJuICJyc3EiOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1NRUlQ6CisgICAgICByZXR1cm4gInNxcnQiOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0VYUDI6CisgICAgICByZXR1cm4gImV4cDIiOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0xPRzI6CisgICAgICByZXR1cm4gImxvZzIiOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1BPVzoKKyAgICAgIHJldHVybiAicG93IjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQ6CisgICAgICByZXR1cm4gImludF9xdW90IjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9JTlRfUkVNQUlOREVSOgorICAgICAgcmV0dXJuICJpbnRfcmVtIjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TSU46CisgICAgICByZXR1cm4gInNpbiI7CisgICBjYXNlIFNIQURFUl9PUENPREVfQ09TOgorICAgICAgcmV0dXJuICJjb3MiOworCisgICBjYXNlIFNIQURFUl9PUENPREVfVEVYOgorICAgICAgcmV0dXJuICJ0ZXgiOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRDoKKyAgICAgIHJldHVybiAidHhkIjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEY6CisgICAgICByZXR1cm4gInR4ZiI7CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhMOgorICAgICAgcmV0dXJuICJ0eGwiOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYUzoKKyAgICAgIHJldHVybiAidHhzIjsKKyAgIGNhc2UgRlNfT1BDT0RFX1RYQjoKKyAgICAgIHJldHVybiAidHhiIjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfQ01TOgorICAgICAgcmV0dXJuICJ0eGZfY21zIjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfVU1TOgorICAgICAgcmV0dXJuICJ0eGZfdW1zIjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfTUNTOgorICAgICAgcmV0dXJuICJ0eGZfbWNzIjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9URzQ6CisgICAgICByZXR1cm4gInRnNCI7CisgICBjYXNlIFNIQURFUl9PUENPREVfVEc0X09GRlNFVDoKKyAgICAgIHJldHVybiAidGc0X29mZnNldCI7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9HRU40X1NDUkFUQ0hfUkVBRDoKKyAgICAgIHJldHVybiAiZ2VuNF9zY3JhdGNoX3JlYWQiOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9XUklURToKKyAgICAgIHJldHVybiAiZ2VuNF9zY3JhdGNoX3dyaXRlIjsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9HRU43X1NDUkFUQ0hfUkVBRDoKKyAgICAgIHJldHVybiAiZ2VuN19zY3JhdGNoX3JlYWQiOworCisgICBjYXNlIEZTX09QQ09ERV9ERFg6CisgICAgICByZXR1cm4gImRkeCI7CisgICBjYXNlIEZTX09QQ09ERV9ERFk6CisgICAgICByZXR1cm4gImRkeSI7CisKKyAgIGNhc2UgRlNfT1BDT0RFX1BJWEVMX1g6CisgICAgICByZXR1cm4gInBpeGVsX3giOworICAgY2FzZSBGU19PUENPREVfUElYRUxfWToKKyAgICAgIHJldHVybiAicGl4ZWxfeSI7CisKKyAgIGNhc2UgRlNfT1BDT0RFX0NJTlRFUlA6CisgICAgICByZXR1cm4gImNpbnRlcnAiOworICAgY2FzZSBGU19PUENPREVfTElOVEVSUDoKKyAgICAgIHJldHVybiAibGludGVycCI7CisKKyAgIGNhc2UgRlNfT1BDT0RFX1VOSUZPUk1fUFVMTF9DT05TVEFOVF9MT0FEOgorICAgICAgcmV0dXJuICJ1bmlmb3JtX3B1bGxfY29uc3QiOworICAgY2FzZSBGU19PUENPREVfVU5JRk9STV9QVUxMX0NPTlNUQU5UX0xPQURfR0VONzoKKyAgICAgIHJldHVybiAidW5pZm9ybV9wdWxsX2NvbnN0X2dlbjciOworICAgY2FzZSBGU19PUENPREVfVkFSWUlOR19QVUxMX0NPTlNUQU5UX0xPQUQ6CisgICAgICByZXR1cm4gInZhcnlpbmdfcHVsbF9jb25zdCI7CisgICBjYXNlIEZTX09QQ09ERV9WQVJZSU5HX1BVTExfQ09OU1RBTlRfTE9BRF9HRU43OgorICAgICAgcmV0dXJuICJ2YXJ5aW5nX3B1bGxfY29uc3RfZ2VuNyI7CisKKyAgIGNhc2UgRlNfT1BDT0RFX01PVl9ESVNQQVRDSF9UT19GTEFHUzoKKyAgICAgIHJldHVybiAibW92X2Rpc3BhdGNoX3RvX2ZsYWdzIjsKKyAgIGNhc2UgRlNfT1BDT0RFX0RJU0NBUkRfSlVNUDoKKyAgICAgIHJldHVybiAiZGlzY2FyZF9qdW1wIjsKKworICAgY2FzZSBGU19PUENPREVfU0VUX1NJTUQ0WDJfT0ZGU0VUOgorICAgICAgcmV0dXJuICJzZXRfc2ltZDR4Ml9vZmZzZXQiOworCisgICBjYXNlIEZTX09QQ09ERV9QQUNLX0hBTEZfMngxNl9TUExJVDoKKyAgICAgIHJldHVybiAicGFja19oYWxmXzJ4MTZfc3BsaXQiOworICAgY2FzZSBGU19PUENPREVfVU5QQUNLX0hBTEZfMngxNl9TUExJVF9YOgorICAgICAgcmV0dXJuICJ1bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3giOworICAgY2FzZSBGU19PUENPREVfVU5QQUNLX0hBTEZfMngxNl9TUExJVF9ZOgorICAgICAgcmV0dXJuICJ1bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3kiOworCisgICBjYXNlIEZTX09QQ09ERV9QTEFDRUhPTERFUl9IQUxUOgorICAgICAgcmV0dXJuICJwbGFjZWhvbGRlcl9oYWx0IjsKKworICAgY2FzZSBWU19PUENPREVfVVJCX1dSSVRFOgorICAgICAgcmV0dXJuICJ2c191cmJfd3JpdGUiOworICAgY2FzZSBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEOgorICAgICAgcmV0dXJuICJwdWxsX2NvbnN0YW50X2xvYWQiOworICAgY2FzZSBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEX0dFTjc6CisgICAgICByZXR1cm4gInB1bGxfY29uc3RhbnRfbG9hZF9nZW43IjsKKyAgIGNhc2UgVlNfT1BDT0RFX1VOUEFDS19GTEFHU19TSU1ENFgyOgorICAgICAgcmV0dXJuICJ1bnBhY2tfZmxhZ3Nfc2ltZDR4MiI7CisKKyAgIGNhc2UgR1NfT1BDT0RFX1VSQl9XUklURToKKyAgICAgIHJldHVybiAiZ3NfdXJiX3dyaXRlIjsKKyAgIGNhc2UgR1NfT1BDT0RFX1RIUkVBRF9FTkQ6CisgICAgICByZXR1cm4gImdzX3RocmVhZF9lbmQiOworICAgY2FzZSBHU19PUENPREVfU0VUX1dSSVRFX09GRlNFVDoKKyAgICAgIHJldHVybiAic2V0X3dyaXRlX29mZnNldCI7CisgICBjYXNlIEdTX09QQ09ERV9TRVRfVkVSVEVYX0NPVU5UOgorICAgICAgcmV0dXJuICJzZXRfdmVydGV4X2NvdW50IjsKKyAgIGNhc2UgR1NfT1BDT0RFX1NFVF9EV09SRF8yX0lNTUVEOgorICAgICAgcmV0dXJuICJzZXRfZHdvcmRfMl9pbW1lZCI7CisgICBjYXNlIEdTX09QQ09ERV9QUkVQQVJFX0NIQU5ORUxfTUFTS1M6CisgICAgICByZXR1cm4gInByZXBhcmVfY2hhbm5lbF9tYXNrcyI7CisgICBjYXNlIEdTX09QQ09ERV9TRVRfQ0hBTk5FTF9NQVNLUzoKKyAgICAgIHJldHVybiAic2V0X2NoYW5uZWxfbWFza3MiOworICAgY2FzZSBHU19PUENPREVfR0VUX0lOU1RBTkNFX0lEOgorICAgICAgcmV0dXJuICJnZXRfaW5zdGFuY2VfaWQiOworCisgICBkZWZhdWx0OgorICAgICAgLyogWWVzLCB0aGlzIGxlYWtzLiAgSXQncyBpbiBkZWJ1ZyBjb2RlLCBpdCBzaG91bGQgbmV2ZXIgb2NjdXIsIGFuZCBpZgorICAgICAgICogaXQgZG9lcywgeW91IHNob3VsZCBqdXN0IGFkZCB0aGUgY2FzZSB0byB0aGUgbGlzdCBhYm92ZS4KKyAgICAgICAqLworICAgICAgaW50IFVfQVNTRVJUX09OTFkgcmV0dmFsID0gYXNwcmludGYoJmZhbGxiYWNrLCAib3AlZCIsIG9wKTsKKyAgICAgIGFzc2VydChyZXR2YWwgIT0gLTEpOworICAgICAgcmV0dXJuIGZhbGxiYWNrOworICAgfQorfQorCitiYWNrZW5kX3Zpc2l0b3I6OmJhY2tlbmRfdmlzaXRvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfc3RhZ2VfcHJvZ19kYXRhICpzdGFnZV9wcm9nX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXJfc3RhZ2Ugc3RhZ2UpCisgICA6IGJydyhicncpLAorICAgICBjdHgoJmJydy0+Y3R4KSwKKyAgICAgc2hhZGVyKHNoYWRlcl9wcm9nID8KKyAgICAgICAgKHN0cnVjdCBicndfc2hhZGVyICopc2hhZGVyX3Byb2ctPl9MaW5rZWRTaGFkZXJzW3N0YWdlXSA6IE5VTEwpLAorICAgICBzaGFkZXJfcHJvZyhzaGFkZXJfcHJvZyksCisgICAgIHByb2cocHJvZyksCisgICAgIHN0YWdlX3Byb2dfZGF0YShzdGFnZV9wcm9nX2RhdGEpCit7Cit9CisKK2Jvb2wKK2JhY2tlbmRfaW5zdHJ1Y3Rpb246OmlzX3RleCgpIGNvbnN0Cit7CisgICByZXR1cm4gKG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX1RFWCB8fAorICAgICAgICAgICBvcGNvZGUgPT0gRlNfT1BDT0RFX1RYQiB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9UWEQgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IFNIQURFUl9PUENPREVfVFhGIHx8CisgICAgICAgICAgIG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX1RYRl9DTVMgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IFNIQURFUl9PUENPREVfVFhGX1VNUyB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9UWEZfTUNTIHx8CisgICAgICAgICAgIG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX1RYTCB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9UWFMgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IFNIQURFUl9PUENPREVfTE9EIHx8CisgICAgICAgICAgIG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX1RHNCB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9URzRfT0ZGU0VUKTsKK30KKworYm9vbAorYmFja2VuZF9pbnN0cnVjdGlvbjo6aXNfbWF0aCgpIGNvbnN0Cit7CisgICByZXR1cm4gKG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX1JDUCB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9SU1EgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IFNIQURFUl9PUENPREVfU1FSVCB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9FWFAyIHx8CisgICAgICAgICAgIG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX0xPRzIgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IFNIQURFUl9PUENPREVfU0lOIHx8CisgICAgICAgICAgIG9wY29kZSA9PSBTSEFERVJfT1BDT0RFX0NPUyB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IFNIQURFUl9PUENPREVfSU5UX1JFTUFJTkRFUiB8fAorICAgICAgICAgICBvcGNvZGUgPT0gU0hBREVSX09QQ09ERV9QT1cpOworfQorCitib29sCitiYWNrZW5kX2luc3RydWN0aW9uOjppc19jb250cm9sX2Zsb3coKSBjb25zdAoreworICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgIGNhc2UgQlJXX09QQ09ERV9ETzoKKyAgIGNhc2UgQlJXX09QQ09ERV9XSElMRToKKyAgIGNhc2UgQlJXX09QQ09ERV9JRjoKKyAgIGNhc2UgQlJXX09QQ09ERV9FTFNFOgorICAgY2FzZSBCUldfT1BDT0RFX0VORElGOgorICAgY2FzZSBCUldfT1BDT0RFX0JSRUFLOgorICAgY2FzZSBCUldfT1BDT0RFX0NPTlRJTlVFOgorICAgICAgcmV0dXJuIHRydWU7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitib29sCitiYWNrZW5kX2luc3RydWN0aW9uOjpjYW5fZG9fc291cmNlX21vZHMoKSBjb25zdAoreworICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgIGNhc2UgQlJXX09QQ09ERV9BRERDOgorICAgY2FzZSBCUldfT1BDT0RFX0JGRToKKyAgIGNhc2UgQlJXX09QQ09ERV9CRkkxOgorICAgY2FzZSBCUldfT1BDT0RFX0JGSTI6CisgICBjYXNlIEJSV19PUENPREVfQkZSRVY6CisgICBjYXNlIEJSV19PUENPREVfQ0JJVDoKKyAgIGNhc2UgQlJXX09QQ09ERV9GQkg6CisgICBjYXNlIEJSV19PUENPREVfRkJMOgorICAgY2FzZSBCUldfT1BDT0RFX1NVQkI6CisgICAgICByZXR1cm4gZmFsc2U7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRydWU7CisgICB9Cit9CisKK2Jvb2wKK2JhY2tlbmRfaW5zdHJ1Y3Rpb246OmNhbl9kb19zYXR1cmF0ZSgpIGNvbnN0Cit7CisgICBzd2l0Y2ggKG9wY29kZSkgeworICAgY2FzZSBCUldfT1BDT0RFX0FERDoKKyAgIGNhc2UgQlJXX09QQ09ERV9BU1I6CisgICBjYXNlIEJSV19PUENPREVfQVZHOgorICAgY2FzZSBCUldfT1BDT0RFX0RQMjoKKyAgIGNhc2UgQlJXX09QQ09ERV9EUDM6CisgICBjYXNlIEJSV19PUENPREVfRFA0OgorICAgY2FzZSBCUldfT1BDT0RFX0RQSDoKKyAgIGNhc2UgQlJXX09QQ09ERV9GMTZUTzMyOgorICAgY2FzZSBCUldfT1BDT0RFX0YzMlRPMTY6CisgICBjYXNlIEJSV19PUENPREVfTElORToKKyAgIGNhc2UgQlJXX09QQ09ERV9MUlA6CisgICBjYXNlIEJSV19PUENPREVfTUFDOgorICAgY2FzZSBCUldfT1BDT0RFX01BQ0g6CisgICBjYXNlIEJSV19PUENPREVfTUFEOgorICAgY2FzZSBCUldfT1BDT0RFX01BVEg6CisgICBjYXNlIEJSV19PUENPREVfTU9WOgorICAgY2FzZSBCUldfT1BDT0RFX01VTDoKKyAgIGNhc2UgQlJXX09QQ09ERV9QTE46CisgICBjYXNlIEJSV19PUENPREVfUk5ERDoKKyAgIGNhc2UgQlJXX09QQ09ERV9STkRFOgorICAgY2FzZSBCUldfT1BDT0RFX1JORFU6CisgICBjYXNlIEJSV19PUENPREVfUk5EWjoKKyAgIGNhc2UgQlJXX09QQ09ERV9TRUw6CisgICBjYXNlIEJSV19PUENPREVfU0hMOgorICAgY2FzZSBCUldfT1BDT0RFX1NIUjoKKyAgIGNhc2UgRlNfT1BDT0RFX0xJTlRFUlA6CisgICBjYXNlIFNIQURFUl9PUENPREVfQ09TOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0VYUDI6CisgICBjYXNlIFNIQURFUl9PUENPREVfTE9HMjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9QT1c6CisgICBjYXNlIFNIQURFUl9PUENPREVfUkNQOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1JTUToKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TSU46CisgICBjYXNlIFNIQURFUl9PUENPREVfU1FSVDoKKyAgICAgIHJldHVybiB0cnVlOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KKworYm9vbAorYmFja2VuZF9pbnN0cnVjdGlvbjo6cmVhZHNfYWNjdW11bGF0b3JfaW1wbGljaXRseSgpIGNvbnN0Cit7CisgICBzd2l0Y2ggKG9wY29kZSkgeworICAgY2FzZSBCUldfT1BDT0RFX01BQzoKKyAgIGNhc2UgQlJXX09QQ09ERV9NQUNIOgorICAgY2FzZSBCUldfT1BDT0RFX1NBREEyOgorICAgICAgcmV0dXJuIHRydWU7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitib29sCitiYWNrZW5kX2luc3RydWN0aW9uOjpoYXNfc2lkZV9lZmZlY3RzKCkgY29uc3QKK3sKKyAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICBjYXNlIFNIQURFUl9PUENPREVfVU5UWVBFRF9BVE9NSUM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9CisKK3ZvaWQKK2JhY2tlbmRfdmlzaXRvcjo6ZHVtcF9pbnN0cnVjdGlvbnMoKQoreworICAgaW50IGlwID0gMDsKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICBiYWNrZW5kX2luc3RydWN0aW9uICppbnN0ID0gKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKilub2RlOworICAgICAgZnByaW50ZihzdGRlcnIsICIlZDogIiwgaXArKyk7CisgICAgICBkdW1wX2luc3RydWN0aW9uKGluc3QpOworICAgfQorfQorCisKKy8qKgorICogU2V0cyB1cCB0aGUgc3RhcnRpbmcgb2Zmc2V0cyBmb3IgdGhlIGdyb3VwcyBvZiBiaW5kaW5nIHRhYmxlIGVudHJpZXMKKyAqIGNvbW1vbmcgdG8gYWxsIHBpcGVsaW5lIHN0YWdlcy4KKyAqCisgKiBVbnVzZWQgZ3JvdXBzIGFyZSBpbml0aWFsaXplZCB0byAweGQwZDBkMGQwIHRvIG1ha2UgaXQgb2J2aW91cyB0aGF0IHRoZXkncmUKKyAqIHVudXNlZCBidXQgYWxzbyBtYWtlIHN1cmUgdGhhdCBhZGRpdGlvbiBvZiBzbWFsbCBvZmZzZXRzIHRvIHRoZW0gd2lsbAorICogdHJpZ2dlciBzb21lIG9mIG91ciBhc3NlcnRzIHRoYXQgc3VyZmFjZSBpbmRpY2VzIGFyZSA8IEJSV19NQVhfU1VSRkFDRVMuCisgKi8KK3ZvaWQKK2JhY2tlbmRfdmlzaXRvcjo6YXNzaWduX2NvbW1vbl9iaW5kaW5nX3RhYmxlX29mZnNldHModWludDMyX3QgbmV4dF9iaW5kaW5nX3RhYmxlX29mZnNldCkKK3sKKyAgIGludCBudW1fdGV4dHVyZXMgPSBfbWVzYV9mbHMocHJvZy0+U2FtcGxlcnNVc2VkKTsKKworICAgc3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnRleHR1cmVfc3RhcnQgPSBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0OworICAgbmV4dF9iaW5kaW5nX3RhYmxlX29mZnNldCArPSBudW1fdGV4dHVyZXM7CisKKyAgIGlmIChzaGFkZXIpIHsKKyAgICAgIHN0YWdlX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS51Ym9fc3RhcnQgPSBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0OworICAgICAgbmV4dF9iaW5kaW5nX3RhYmxlX29mZnNldCArPSBzaGFkZXItPmJhc2UuTnVtVW5pZm9ybUJsb2NrczsKKyAgIH0gZWxzZSB7CisgICAgICBzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUudWJvX3N0YXJ0ID0gMHhkMGQwZDBkMDsKKyAgIH0KKworLy8gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19TSEFERVJfVElNRSkgeworLy8gICAgICBzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUuc2hhZGVyX3RpbWVfc3RhcnQgPSBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0OworLy8gICAgICBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0Kys7CisvLyAgIH0gZWxzZSB7CisgICAgICBzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUuc2hhZGVyX3RpbWVfc3RhcnQgPSAweGQwZDBkMGQwOworLy8gICB9CisKKyAgIGlmIChwcm9nLT5Vc2VzR2F0aGVyKSB7CisgICAgICBpZiAoYnJ3LT5nZW4gPj0gOCkgeworICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLmdhdGhlcl90ZXh0dXJlX3N0YXJ0ID0KKyAgICAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS50ZXh0dXJlX3N0YXJ0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS5nYXRoZXJfdGV4dHVyZV9zdGFydCA9IG5leHRfYmluZGluZ190YWJsZV9vZmZzZXQ7CisgICAgICAgICBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0ICs9IG51bV90ZXh0dXJlczsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUuZ2F0aGVyX3RleHR1cmVfc3RhcnQgPSAweGQwZDBkMGQwOworICAgfQorCisgICBpZiAoc2hhZGVyX3Byb2cgJiYgc2hhZGVyX3Byb2ctPk51bUF0b21pY0J1ZmZlcnMpIHsKKyAgICAgIHN0YWdlX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS5hYm9fc3RhcnQgPSBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0OworICAgICAgbmV4dF9iaW5kaW5nX3RhYmxlX29mZnNldCArPSBzaGFkZXJfcHJvZy0+TnVtQXRvbWljQnVmZmVyczsKKyAgIH0gZWxzZSB7CisgICAgICBzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUuYWJvX3N0YXJ0ID0gMHhkMGQwZDBkMDsKKyAgIH0KKworICAgLyogVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSB1c2VkIGRlcGVuZGluZyBvbiBob3cgdGhlIGNvbXBpbGUgZ29lcy4gKi8KKyAgIHN0YWdlX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS5wdWxsX2NvbnN0YW50c19zdGFydCA9IG5leHRfYmluZGluZ190YWJsZV9vZmZzZXQ7CisgICBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0Kys7CisKKyAgIGFzc2VydChuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0IDw9IEJSV19NQVhfU1VSRkFDRVMpOworCisgICAvKiBwcm9nX2RhdGEtPmJhc2UuYmluZGluZ190YWJsZS5zaXplIHdpbGwgYmUgc2V0IGJ5IGJyd19tYXJrX3N1cmZhY2VfdXNlZC4gKi8KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfc2hhZGVyLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3NoYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDZlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3NoYWRlci5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImJyd19kZWZpbmVzLmgiCisjaW5jbHVkZSAibWFpbi9jb21waWxlci5oIgorI2luY2x1ZGUgImdsc2wvaXIuaCIKKworI3ByYWdtYSBvbmNlCisKK2VudW0gUEFDS0VEIHJlZ2lzdGVyX2ZpbGUgeworICAgQkFEX0ZJTEUsCisgICBHUkYsCisgICBNUkYsCisgICBJTU0sCisgICBIV19SRUcsIC8qIGEgc3RydWN0IGJyd19yZWcgKi8KKyAgIEFUVFIsCisgICBVTklGT1JNLCAvKiBwcm9nX2RhdGEtPnBhcmFtc1tyZWddICovCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKKworY2xhc3MgYmFja2VuZF9pbnN0cnVjdGlvbiA6IHB1YmxpYyBleGVjX25vZGUgeworcHVibGljOgorICAgYm9vbCBpc190ZXgoKSBjb25zdDsKKyAgIGJvb2wgaXNfbWF0aCgpIGNvbnN0OworICAgYm9vbCBpc19jb250cm9sX2Zsb3coKSBjb25zdDsKKyAgIGJvb2wgY2FuX2RvX3NvdXJjZV9tb2RzKCkgY29uc3Q7CisgICBib29sIGNhbl9kb19zYXR1cmF0ZSgpIGNvbnN0OworICAgYm9vbCByZWFkc19hY2N1bXVsYXRvcl9pbXBsaWNpdGx5KCkgY29uc3Q7CisKKyAgIC8qKgorICAgICogVHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHdyaXRpbmcgdG8KKyAgICAqIGl0cyBkZXN0aW5hdGlvbiByZWdpc3RlcnMuICBZb3UgYXJlIGV4cGVjdGVkIG5vdCB0byByZW9yZGVyIG9yCisgICAgKiBvcHRpbWl6ZSB0aGVzZSBvdXQgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKyAgICAqLworICAgYm9vbCBoYXNfc2lkZV9lZmZlY3RzKCkgY29uc3Q7CisKKyAgIGVudW0gb3Bjb2RlIG9wY29kZTsgLyogQlJXX09QQ09ERV8qIG9yIEZTX09QQ09ERV8qICovCisKKyAgIHVpbnQ4X3QgcHJlZGljYXRlOworICAgYm9vbCBwcmVkaWNhdGVfaW52ZXJzZTsKKyAgIGJvb2wgd3JpdGVzX2FjY3VtdWxhdG9yOyAvKio8IGluc3RydWN0aW9uIGltcGxpY2l0bHkgd3JpdGVzIGFjY3VtdWxhdG9yICovCit9OworCitlbnVtIGluc3RydWN0aW9uX3NjaGVkdWxlcl9tb2RlIHsKKyAgIFNDSEVEVUxFX1BSRV9JUFNfVERfSEksCisgICBTQ0hFRFVMRV9QUkVfSVBTX1REX0xPLAorICAgU0NIRURVTEVfUFJFX0lQU19CVV9MSU1JVCwKKyAgIFNDSEVEVUxFX1BSRV9JUFNfQlVfTE8sCisgICBTQ0hFRFVMRV9QUkVfSVBTX0JVX01MLAorICAgU0NIRURVTEVfUFJFX0lQU19CVV9NRCwKKyAgIFNDSEVEVUxFX1BSRV9JUFNfQlVfTUgsCisgICBTQ0hFRFVMRV9QUkVfSVBTX0JVX0hJLAorICAgU0NIRURVTEVfUFJFLAorICAgU0NIRURVTEVfUFJFX05PTl9MSUZPLAorICAgU0NIRURVTEVfUFJFX0xJRk8sCisgICBTQ0hFRFVMRV9QT1NULAorfTsKKworY2xhc3MgYmFja2VuZF92aXNpdG9yIDogcHVibGljIGlyX3Zpc2l0b3IgeworcHJvdGVjdGVkOgorCisgICBiYWNrZW5kX3Zpc2l0b3Ioc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3N0YWdlX3Byb2dfZGF0YSAqc3RhZ2VfcHJvZ19kYXRhLAorICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlcl9zdGFnZSBzdGFnZSk7CisKK3B1YmxpYzoKKworICAgc3RydWN0IGJyd19jb250ZXh0ICogY29uc3QgYnJ3OworICAgc3RydWN0IGdsX2NvbnRleHQgKiBjb25zdCBjdHg7CisgICBzdHJ1Y3QgYnJ3X3NoYWRlciAqIGNvbnN0IHNoYWRlcjsKKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqIGNvbnN0IHNoYWRlcl9wcm9nOworICAgc3RydWN0IGdsX3Byb2dyYW0gKiBjb25zdCBwcm9nOworICAgc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEgKiBjb25zdCBzdGFnZV9wcm9nX2RhdGE7CisKKyAgIC8qKiByYWxsb2MgY29udGV4dCBmb3IgdGVtcG9yYXJ5IGRhdGEgdXNlZCBkdXJpbmcgY29tcGlsZSAqLworICAgdm9pZCAqbWVtX2N0eDsKKworICAgLyoqCisgICAgKiBMaXN0IG9mIGVpdGhlciBmc19pbnN0IG9yIHZlYzRfaW5zdHJ1Y3Rpb24gKGluaGVyaXRpbmcgZnJvbQorICAgICogYmFja2VuZF9pbnN0cnVjdGlvbikKKyAgICAqLworICAgZXhlY19saXN0IGluc3RydWN0aW9uczsKKworICAgdmlydHVhbCB2b2lkIGR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCkgPSAwOworICAgdmlydHVhbCB2b2lkIGR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCwgRklMRSAqZmlsZSkgPSAwOworICAgdmlydHVhbCB2b2lkIGR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqaW5zdCwgY2hhciogc3RyaW5nKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgZHVtcF9pbnN0cnVjdGlvbnMoKTsKKworICAgdm9pZCBhc3NpZ25fY29tbW9uX2JpbmRpbmdfdGFibGVfb2Zmc2V0cyh1aW50MzJfdCBuZXh0X2JpbmRpbmdfdGFibGVfb2Zmc2V0KTsKKworICAgdmlydHVhbCB2b2lkIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKSA9IDA7CisgICB2aXJ0dWFsIGludCBsaXZlX2luX2NvdW50KGludCBibG9ja19udW0pIGNvbnN0ID0gMDsKKyAgIHZpcnR1YWwgaW50IGxpdmVfb3V0X2NvdW50KGludCBibG9ja19udW0pIGNvbnN0ID0gMDsKK307CisKK3VpbnQzMl90IGJyd190ZXh0dXJlX29mZnNldChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBpcl9jb25zdGFudCAqb2Zmc2V0KTsKKworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKK2ludCBicndfdHlwZV9mb3JfYmFzZV90eXBlKGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUpOwordWludDMyX3QgYnJ3X2NvbmRpdGlvbmFsX2Zvcl9jb21wYXJpc29uKHVuc2lnbmVkIGludCBvcCk7Cit1aW50MzJfdCBicndfbWF0aF9mdW5jdGlvbihlbnVtIG9wY29kZSBvcCk7Citjb25zdCBjaGFyICpicndfaW5zdHJ1Y3Rpb25fbmFtZShlbnVtIG9wY29kZSBvcCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbV9wcmVjb21waWxlX2tleSB7CisgICB1bnNpZ25lZCBmYm9faGVpZ2h0OworICAgYm9vbCBpc191c2VyX2ZibzsKK307CisKK3N0cnVjdCBicndfdnNfY29tcGlsZTsKK3N0cnVjdCBicndfZ3NfY29tcGlsZTsKK3N0cnVjdCBicndfd21fY29tcGlsZTsKKworY29uc3Qgc3RydWN0IGJyd19zaGFkZXJfcHJvZ3JhbV9wcmVjb21waWxlX2tleSAqCiticndfc2hhZGVyX3Byb2dyYW1fZ2V0X3ByZWNvbXBpbGVfa2V5KHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2cpOworCit2b2lkCiticndfc2hhZGVyX3Byb2dyYW1fc2F2ZV92c19jb21waWxlKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfdnNfY29tcGlsZSAqYyk7CisKK3ZvaWQKK2Jyd19zaGFkZXJfcHJvZ3JhbV9zYXZlX2dzX2NvbXBpbGUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19nc19jb21waWxlICpjKTsKKwordm9pZAorYnJ3X3NoYWRlcl9wcm9ncmFtX3NhdmVfd21fY29tcGlsZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpOworCitib29sCiticndfc2hhZGVyX3Byb2dyYW1fcmVzdG9yZV92c19jb21waWxlKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfdnNfY29tcGlsZSAqYyk7CisKK2Jvb2wKK2Jyd19zaGFkZXJfcHJvZ3JhbV9yZXN0b3JlX2dzX2NvbXBpbGUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19nc19jb21waWxlICpjKTsKKworYm9vbAorYnJ3X3NoYWRlcl9wcm9ncmFtX3Jlc3RvcmVfd21fY29tcGlsZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpOworCisvLyBMdW5hckcgOiBBREQKKy8vIEV4cG9zaW5nIHNvbWUgZnVuY3Rpb25zIHRoYXQgd2VyZSBhYnN0cmFjdGVkIGF3YXksIHdvdWxkIGJlIGdvb2QgdG8gcHV0IHRoZW0gYmFjaworc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpicndfbmV3X3NoYWRlcl9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBuYW1lKTsKK3N0cnVjdCBicndfc2hhZGVyX3Byb2dyYW0gKmdldF9icndfc2hhZGVyX3Byb2dyYW0oc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK0dMYm9vbGVhbiBicndfbGlua19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3N0cnVjdCBicndfd21fcHJvZ19kYXRhICpnZXRfd21fcHJvZ19kYXRhKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyk7Citjb25zdCB1bnNpZ25lZCAqZ2V0X3dtX3Byb2dyYW0oc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3Vuc2lnbmVkIGdldF93bV9wcm9ncmFtX3NpemUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3N0cnVjdCBicndfdnNfcHJvZ19kYXRhICpnZXRfdnNfcHJvZ19kYXRhKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyk7Citjb25zdCB1bnNpZ25lZCAqZ2V0X3ZzX3Byb2dyYW0oc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3Vuc2lnbmVkIGdldF92c19wcm9ncmFtX3NpemUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3N0cnVjdCBicndfZ3NfcHJvZ19kYXRhICpnZXRfZ3NfcHJvZ19kYXRhKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyk7Citjb25zdCB1bnNpZ25lZCAqZ2V0X2dzX3Byb2dyYW0oc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3Vuc2lnbmVkIGdldF9nc19wcm9ncmFtX3NpemUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3N0cnVjdHMuaCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfc3RydWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmM3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3N0cnVjdHMuaApAQCAtMCwwICsxLDE0NDMgQEAKKy8qCisgQ29weXJpZ2h0IChDKSBJbnRlbCBDb3JwLiAgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgSW50ZWwgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvCisgZGV2ZWxvcCB0aGlzIDNEIGRyaXZlci4KKworIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKgorICAqIEF1dGhvcnM6CisgICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGh3QHZtd2FyZS5jb20+CisgICovCisKKworI2lmbmRlZiBCUldfU1RSVUNUU19ICisjZGVmaW5lIEJSV19TVFJVQ1RTX0gKKworc3RydWN0IGJyd191cmJfZmVuY2UKK3sKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgbGVuZ3RoOjg7CisgICAgICB1bnNpZ25lZCB2c19yZWFsbG9jOjE7CisgICAgICB1bnNpZ25lZCBnc19yZWFsbG9jOjE7CisgICAgICB1bnNpZ25lZCBjbHBfcmVhbGxvYzoxOworICAgICAgdW5zaWduZWQgc2ZfcmVhbGxvYzoxOworICAgICAgdW5zaWduZWQgdmZlX3JlYWxsb2M6MTsKKyAgICAgIHVuc2lnbmVkIGNzX3JlYWxsb2M6MTsKKyAgICAgIHVuc2lnbmVkIHBhZDoyOworICAgICAgdW5zaWduZWQgb3Bjb2RlOjE2OworICAgfSBoZWFkZXI7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgdnNfZmVuY2U6MTA7CisgICAgICB1bnNpZ25lZCBnc19mZW5jZToxMDsKKyAgICAgIHVuc2lnbmVkIGNscF9mZW5jZToxMDsKKyAgICAgIHVuc2lnbmVkIHBhZDoyOworICAgfSBiaXRzMDsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBzZl9mZW5jZToxMDsKKyAgICAgIHVuc2lnbmVkIHZmX2ZlbmNlOjEwOworICAgICAgdW5zaWduZWQgY3NfZmVuY2U6MTE7CisgICAgICB1bnNpZ25lZCBwYWQ6MTsKKyAgIH0gYml0czE7Cit9OworCisvKiBTdGF0ZSBzdHJ1Y3RzIGZvciB0aGUgdmFyaW91cyBmaXhlZCBmdW5jdGlvbiB1bml0czoKKyAqLworCisKK3N0cnVjdCB0aHJlYWQwCit7CisgICB1bnNpZ25lZCBwYWQwOjE7CisgICB1bnNpZ25lZCBncmZfcmVnX2NvdW50OjM7CisgICB1bnNpZ25lZCBwYWQxOjI7CisgICB1bnNpZ25lZCBrZXJuZWxfc3RhcnRfcG9pbnRlcjoyNjsgLyogT2Zmc2V0IGZyb20gR0VORVJBTF9TVEFURV9CQVNFICovCit9OworCitzdHJ1Y3QgdGhyZWFkMQoreworICAgdW5zaWduZWQgZXh0X2hhbHRfZXhjZXB0aW9uX2VuYWJsZToxOworICAgdW5zaWduZWQgc3dfZXhjZXB0aW9uX2VuYWJsZToxOworICAgdW5zaWduZWQgbWFza19zdGFja19leGNlcHRpb25fZW5hYmxlOjE7CisgICB1bnNpZ25lZCB0aW1lb3V0X2V4Y2VwdGlvbl9lbmFibGU6MTsKKyAgIHVuc2lnbmVkIGlsbGVnYWxfb3BfZXhjZXB0aW9uX2VuYWJsZToxOworICAgdW5zaWduZWQgcGFkMDozOworICAgdW5zaWduZWQgZGVwdGhfY29lZl91cmJfcmVhZF9vZmZzZXQ6NjsJLyogV00gb25seSAqLworICAgdW5zaWduZWQgcGFkMToyOworICAgdW5zaWduZWQgZmxvYXRpbmdfcG9pbnRfbW9kZToxOworICAgdW5zaWduZWQgdGhyZWFkX3ByaW9yaXR5OjE7CisgICB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2VudHJ5X2NvdW50Ojg7CisgICB1bnNpZ25lZCBwYWQzOjU7CisgICB1bnNpZ25lZCBzaW5nbGVfcHJvZ3JhbV9mbG93OjE7Cit9OworCitzdHJ1Y3QgdGhyZWFkMgoreworICAgdW5zaWduZWQgcGVyX3RocmVhZF9zY3JhdGNoX3NwYWNlOjQ7CisgICB1bnNpZ25lZCBwYWQwOjY7CisgICB1bnNpZ25lZCBzY3JhdGNoX3NwYWNlX2Jhc2VfcG9pbnRlcjoyMjsKK307CisKKworc3RydWN0IHRocmVhZDMKK3sKKyAgIHVuc2lnbmVkIGRpc3BhdGNoX2dyZl9zdGFydF9yZWc6NDsKKyAgIHVuc2lnbmVkIHVyYl9lbnRyeV9yZWFkX29mZnNldDo2OworICAgdW5zaWduZWQgcGFkMDoxOworICAgdW5zaWduZWQgdXJiX2VudHJ5X3JlYWRfbGVuZ3RoOjY7CisgICB1bnNpZ25lZCBwYWQxOjE7CisgICB1bnNpZ25lZCBjb25zdF91cmJfZW50cnlfcmVhZF9vZmZzZXQ6NjsKKyAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgIHVuc2lnbmVkIGNvbnN0X3VyYl9lbnRyeV9yZWFkX2xlbmd0aDo2OworICAgdW5zaWduZWQgcGFkMzoxOworfTsKKworCisKK3N0cnVjdCBicndfY2xpcF91bml0X3N0YXRlCit7CisgICBzdHJ1Y3QgdGhyZWFkMCB0aHJlYWQwOworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBwYWQwOjc7CisgICAgICB1bnNpZ25lZCBzd19leGNlcHRpb25fZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBwYWQxOjM7CisgICAgICB1bnNpZ25lZCBtYXNrX3N0YWNrX2V4Y2VwdGlvbl9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgICAgIHVuc2lnbmVkIGlsbGVnYWxfb3BfZXhjZXB0aW9uX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgcGFkMzoyOworICAgICAgdW5zaWduZWQgZmxvYXRpbmdfcG9pbnRfbW9kZToxOworICAgICAgdW5zaWduZWQgdGhyZWFkX3ByaW9yaXR5OjE7CisgICAgICB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2VudHJ5X2NvdW50Ojg7CisgICAgICB1bnNpZ25lZCBwYWQ0OjU7CisgICAgICB1bnNpZ25lZCBzaW5nbGVfcHJvZ3JhbV9mbG93OjE7CisgICB9IHRocmVhZDE7CisKKyAgIHN0cnVjdCB0aHJlYWQyIHRocmVhZDI7CisgICBzdHJ1Y3QgdGhyZWFkMyB0aHJlYWQzOworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIHBhZDA6OTsKKyAgICAgIHVuc2lnbmVkIGdzX291dHB1dF9zdGF0czoxOyAvKiBub3QgYWx3YXlzICovCisgICAgICB1bnNpZ25lZCBzdGF0c19lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIG5yX3VyYl9lbnRyaWVzOjc7CisgICAgICB1bnNpZ25lZCBwYWQxOjE7CisgICAgICB1bnNpZ25lZCB1cmJfZW50cnlfYWxsb2NhdGlvbl9zaXplOjU7CisgICAgICB1bnNpZ25lZCBwYWQyOjE7CisgICAgICB1bnNpZ25lZCBtYXhfdGhyZWFkczo1OyAJLyogbWF5IGJlIGxlc3MgKi8KKyAgICAgIHVuc2lnbmVkIHBhZDM6MjsKKyAgIH0gdGhyZWFkNDsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBwYWQwOjEzOworICAgICAgdW5zaWduZWQgY2xpcF9tb2RlOjM7CisgICAgICB1bnNpZ25lZCB1c2VyY2xpcF9lbmFibGVfZmxhZ3M6ODsKKyAgICAgIHVuc2lnbmVkIHVzZXJjbGlwX211c3RfY2xpcDoxOworICAgICAgdW5zaWduZWQgbmVnYXRpdmVfd19jbGlwX3Rlc3Q6MTsKKyAgICAgIHVuc2lnbmVkIGd1YXJkX2JhbmRfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCB2aWV3cG9ydF96X2NsaXBfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCB2aWV3cG9ydF94eV9jbGlwX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgdmVydGV4X3Bvc2l0aW9uX3NwYWNlOjE7CisgICAgICB1bnNpZ25lZCBhcGlfbW9kZToxOworICAgICAgdW5zaWduZWQgcGFkMjoxOworICAgfSBjbGlwNTsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBwYWQwOjU7CisgICAgICB1bnNpZ25lZCBjbGlwcGVyX3ZpZXdwb3J0X3N0YXRlX3B0cjoyNzsKKyAgIH0gY2xpcDY7CisKKworICAgZmxvYXQgdmlld3BvcnRfeG1pbjsKKyAgIGZsb2F0IHZpZXdwb3J0X3htYXg7CisgICBmbG9hdCB2aWV3cG9ydF95bWluOworICAgZmxvYXQgdmlld3BvcnRfeW1heDsKK307CisKK3N0cnVjdCBnZW42X2JsZW5kX3N0YXRlCit7CisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgZGVzdF9ibGVuZF9mYWN0b3I6NTsKKyAgICAgIHVuc2lnbmVkIHNvdXJjZV9ibGVuZF9mYWN0b3I6NTsKKyAgICAgIHVuc2lnbmVkIHBhZDM6MTsKKyAgICAgIHVuc2lnbmVkIGJsZW5kX2Z1bmM6MzsKKyAgICAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgICAgIHVuc2lnbmVkIGlhX2Rlc3RfYmxlbmRfZmFjdG9yOjU7CisgICAgICB1bnNpZ25lZCBpYV9zb3VyY2VfYmxlbmRfZmFjdG9yOjU7CisgICAgICB1bnNpZ25lZCBwYWQxOjE7CisgICAgICB1bnNpZ25lZCBpYV9ibGVuZF9mdW5jOjM7CisgICAgICB1bnNpZ25lZCBwYWQwOjE7CisgICAgICB1bnNpZ25lZCBpYV9ibGVuZF9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIGJsZW5kX2VuYWJsZToxOworICAgfSBibGVuZDA7CisKKyAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBwb3N0X2JsZW5kX2NsYW1wX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgcHJlX2JsZW5kX2NsYW1wX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgY2xhbXBfcmFuZ2U6MjsKKyAgICAgIHVuc2lnbmVkIHBhZDA6NDsKKyAgICAgIHVuc2lnbmVkIHhfZGl0aGVyX29mZnNldDoyOworICAgICAgdW5zaWduZWQgeV9kaXRoZXJfb2Zmc2V0OjI7CisgICAgICB1bnNpZ25lZCBkaXRoZXJfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBhbHBoYV90ZXN0X2Z1bmM6MzsKKyAgICAgIHVuc2lnbmVkIGFscGhhX3Rlc3RfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBwYWQxOjE7CisgICAgICB1bnNpZ25lZCBsb2dpY19vcF9mdW5jOjQ7CisgICAgICB1bnNpZ25lZCBsb2dpY19vcF9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgICAgIHVuc2lnbmVkIHdyaXRlX2Rpc2FibGVfYjoxOworICAgICAgdW5zaWduZWQgd3JpdGVfZGlzYWJsZV9nOjE7CisgICAgICB1bnNpZ25lZCB3cml0ZV9kaXNhYmxlX3I6MTsKKyAgICAgIHVuc2lnbmVkIHdyaXRlX2Rpc2FibGVfYToxOworICAgICAgdW5zaWduZWQgcGFkMzoxOworICAgICAgdW5zaWduZWQgYWxwaGFfdG9fY292ZXJhZ2VfZGl0aGVyOjE7CisgICAgICB1bnNpZ25lZCBhbHBoYV90b19vbmU6MTsKKyAgICAgIHVuc2lnbmVkIGFscGhhX3RvX2NvdmVyYWdlOjE7CisgICB9IGJsZW5kMTsKK307CisKK3N0cnVjdCBnZW42X2NvbG9yX2NhbGNfc3RhdGUKK3sKKyAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBhbHBoYV90ZXN0X2Zvcm1hdDoxOworICAgICAgdW5zaWduZWQgcGFkMDoxNDsKKyAgICAgIHVuc2lnbmVkIHJvdW5kX2Rpc2FibGU6MTsKKyAgICAgIHVuc2lnbmVkIGJmX3N0ZW5jaWxfcmVmOjg7CisgICAgICB1bnNpZ25lZCBzdGVuY2lsX3JlZjo4OworICAgfSBjYzA7CisKKyAgIHVuaW9uIHsKKyAgICAgIGZsb2F0IGFscGhhX3JlZl9mOworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgdWk6ODsKKwkgdW5zaWduZWQgcGFkMDoyNDsKKyAgICAgIH0gYWxwaGFfcmVmX2ZpOworICAgfSBjYzE7CisKKyAgIGZsb2F0IGNvbnN0YW50X3I7CisgICBmbG9hdCBjb25zdGFudF9nOworICAgZmxvYXQgY29uc3RhbnRfYjsKKyAgIGZsb2F0IGNvbnN0YW50X2E7Cit9OworCitzdHJ1Y3QgZ2VuNl9kZXB0aF9zdGVuY2lsX3N0YXRlCit7CisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgcGFkMDozOworICAgICAgdW5zaWduZWQgYmZfc3RlbmNpbF9wYXNzX2RlcHRoX3Bhc3Nfb3A6MzsKKyAgICAgIHVuc2lnbmVkIGJmX3N0ZW5jaWxfcGFzc19kZXB0aF9mYWlsX29wOjM7CisgICAgICB1bnNpZ25lZCBiZl9zdGVuY2lsX2ZhaWxfb3A6MzsKKyAgICAgIHVuc2lnbmVkIGJmX3N0ZW5jaWxfZnVuYzozOworICAgICAgdW5zaWduZWQgYmZfc3RlbmNpbF9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIHBhZDE6MjsKKyAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfd3JpdGVfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBzdGVuY2lsX3Bhc3NfZGVwdGhfcGFzc19vcDozOworICAgICAgdW5zaWduZWQgc3RlbmNpbF9wYXNzX2RlcHRoX2ZhaWxfb3A6MzsKKyAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfZmFpbF9vcDozOworICAgICAgdW5zaWduZWQgc3RlbmNpbF9mdW5jOjM7CisgICAgICB1bnNpZ25lZCBzdGVuY2lsX2VuYWJsZToxOworICAgfSBkczA7CisKKyAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBiZl9zdGVuY2lsX3dyaXRlX21hc2s6ODsKKyAgICAgIHVuc2lnbmVkIGJmX3N0ZW5jaWxfdGVzdF9tYXNrOjg7CisgICAgICB1bnNpZ25lZCBzdGVuY2lsX3dyaXRlX21hc2s6ODsKKyAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfdGVzdF9tYXNrOjg7CisgICB9IGRzMTsKKworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIHBhZDA6MjY7CisgICAgICB1bnNpZ25lZCBkZXB0aF93cml0ZV9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIGRlcHRoX3Rlc3RfZnVuYzozOworICAgICAgdW5zaWduZWQgcGFkMToxOworICAgICAgdW5zaWduZWQgZGVwdGhfdGVzdF9lbmFibGU6MTsKKyAgIH0gZHMyOworfTsKKworc3RydWN0IGJyd19jY191bml0X3N0YXRlCit7CisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIHBhZDA6MzsKKyAgICAgIHVuc2lnbmVkIGJmX3N0ZW5jaWxfcGFzc19kZXB0aF9wYXNzX29wOjM7CisgICAgICB1bnNpZ25lZCBiZl9zdGVuY2lsX3Bhc3NfZGVwdGhfZmFpbF9vcDozOworICAgICAgdW5zaWduZWQgYmZfc3RlbmNpbF9mYWlsX29wOjM7CisgICAgICB1bnNpZ25lZCBiZl9zdGVuY2lsX2Z1bmM6MzsKKyAgICAgIHVuc2lnbmVkIGJmX3N0ZW5jaWxfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBwYWQxOjI7CisgICAgICB1bnNpZ25lZCBzdGVuY2lsX3dyaXRlX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgc3RlbmNpbF9wYXNzX2RlcHRoX3Bhc3Nfb3A6MzsKKyAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfcGFzc19kZXB0aF9mYWlsX29wOjM7CisgICAgICB1bnNpZ25lZCBzdGVuY2lsX2ZhaWxfb3A6MzsKKyAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfZnVuYzozOworICAgICAgdW5zaWduZWQgc3RlbmNpbF9lbmFibGU6MTsKKyAgIH0gY2MwOworCisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgYmZfc3RlbmNpbF9yZWY6ODsKKyAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfd3JpdGVfbWFzazo4OworICAgICAgdW5zaWduZWQgc3RlbmNpbF90ZXN0X21hc2s6ODsKKyAgICAgIHVuc2lnbmVkIHN0ZW5jaWxfcmVmOjg7CisgICB9IGNjMTsKKworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGxvZ2ljb3BfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBwYWQwOjEwOworICAgICAgdW5zaWduZWQgZGVwdGhfd3JpdGVfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBkZXB0aF90ZXN0X2Z1bmN0aW9uOjM7CisgICAgICB1bnNpZ25lZCBkZXB0aF90ZXN0OjE7CisgICAgICB1bnNpZ25lZCBiZl9zdGVuY2lsX3dyaXRlX21hc2s6ODsKKyAgICAgIHVuc2lnbmVkIGJmX3N0ZW5jaWxfdGVzdF9tYXNrOjg7CisgICB9IGNjMjsKKworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIHBhZDA6ODsKKyAgICAgIHVuc2lnbmVkIGFscGhhX3Rlc3RfZnVuYzozOworICAgICAgdW5zaWduZWQgYWxwaGFfdGVzdDoxOworICAgICAgdW5zaWduZWQgYmxlbmRfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBpYV9ibGVuZF9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIHBhZDE6MTsKKyAgICAgIHVuc2lnbmVkIGFscGhhX3Rlc3RfZm9ybWF0OjE7CisgICAgICB1bnNpZ25lZCBwYWQyOjE2OworICAgfSBjYzM7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgcGFkMDo1OworICAgICAgdW5zaWduZWQgY2Nfdmlld3BvcnRfc3RhdGVfb2Zmc2V0OjI3OyAvKiBPZmZzZXQgZnJvbSBHRU5FUkFMX1NUQVRFX0JBU0UgKi8KKyAgIH0gY2M0OworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIHBhZDA6MjsKKyAgICAgIHVuc2lnbmVkIGlhX2Rlc3RfYmxlbmRfZmFjdG9yOjU7CisgICAgICB1bnNpZ25lZCBpYV9zcmNfYmxlbmRfZmFjdG9yOjU7CisgICAgICB1bnNpZ25lZCBpYV9ibGVuZF9mdW5jdGlvbjozOworICAgICAgdW5zaWduZWQgc3RhdGlzdGljc19lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIGxvZ2ljb3BfZnVuYzo0OworICAgICAgdW5zaWduZWQgcGFkMToxMTsKKyAgICAgIHVuc2lnbmVkIGRpdGhlcl9lbmFibGU6MTsKKyAgIH0gY2M1OworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGNsYW1wX3Bvc3RfYWxwaGFfYmxlbmQ6MTsKKyAgICAgIHVuc2lnbmVkIGNsYW1wX3ByZV9hbHBoYV9ibGVuZDoxOworICAgICAgdW5zaWduZWQgY2xhbXBfcmFuZ2U6MjsKKyAgICAgIHVuc2lnbmVkIHBhZDA6MTE7CisgICAgICB1bnNpZ25lZCB5X2RpdGhlcl9vZmZzZXQ6MjsKKyAgICAgIHVuc2lnbmVkIHhfZGl0aGVyX29mZnNldDoyOworICAgICAgdW5zaWduZWQgZGVzdF9ibGVuZF9mYWN0b3I6NTsKKyAgICAgIHVuc2lnbmVkIHNyY19ibGVuZF9mYWN0b3I6NTsKKyAgICAgIHVuc2lnbmVkIGJsZW5kX2Z1bmN0aW9uOjM7CisgICB9IGNjNjsKKworICAgc3RydWN0IHsKKyAgICAgIHVuaW9uIHsKKwkgZmxvYXQgZjsKKwkgdWludDhfdCB1Yls0XTsKKyAgICAgIH0gYWxwaGFfcmVmOworICAgfSBjYzc7Cit9OworCitzdHJ1Y3QgYnJ3X3NmX3VuaXRfc3RhdGUKK3sKKyAgIHN0cnVjdCB0aHJlYWQwIHRocmVhZDA7CisgICBzdHJ1Y3QgdGhyZWFkMSB0aHJlYWQxOworICAgc3RydWN0IHRocmVhZDIgdGhyZWFkMjsKKyAgIHN0cnVjdCB0aHJlYWQzIHRocmVhZDM7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgcGFkMDoxMDsKKyAgICAgIHVuc2lnbmVkIHN0YXRzX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgbnJfdXJiX2VudHJpZXM6NzsKKyAgICAgIHVuc2lnbmVkIHBhZDE6MTsKKyAgICAgIHVuc2lnbmVkIHVyYl9lbnRyeV9hbGxvY2F0aW9uX3NpemU6NTsKKyAgICAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgICAgIHVuc2lnbmVkIG1heF90aHJlYWRzOjY7CisgICAgICB1bnNpZ25lZCBwYWQzOjE7CisgICB9IHRocmVhZDQ7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgZnJvbnRfd2luZGluZzoxOworICAgICAgdW5zaWduZWQgdmlld3BvcnRfdHJhbnNmb3JtOjE7CisgICAgICB1bnNpZ25lZCBwYWQwOjM7CisgICAgICB1bnNpZ25lZCBzZl92aWV3cG9ydF9zdGF0ZV9vZmZzZXQ6Mjc7IC8qIE9mZnNldCBmcm9tIEdFTkVSQUxfU1RBVEVfQkFTRSAqLworICAgfSBzZjU7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgcGFkMDo5OworICAgICAgdW5zaWduZWQgZGVzdF9vcmdfdmJpYXM6NDsKKyAgICAgIHVuc2lnbmVkIGRlc3Rfb3JnX2hiaWFzOjQ7CisgICAgICB1bnNpZ25lZCBzY2lzc29yOjE7CisgICAgICB1bnNpZ25lZCBkaXNhYmxlXzJ4Ml90cmlmaWx0ZXI6MTsKKyAgICAgIHVuc2lnbmVkIGRpc2FibGVfemVyb19waXhfdHJpZmlsdGVyOjE7CisgICAgICB1bnNpZ25lZCBwb2ludF9yYXN0X3J1bGU6MjsKKyAgICAgIHVuc2lnbmVkIGxpbmVfZW5kY2FwX2FhX3JlZ2lvbl93aWR0aDoyOworICAgICAgdW5zaWduZWQgbGluZV93aWR0aDo0OworICAgICAgdW5zaWduZWQgZmFzdF9zY2lzc29yX2Rpc2FibGU6MTsKKyAgICAgIHVuc2lnbmVkIGN1bGxfbW9kZToyOworICAgICAgdW5zaWduZWQgYWFfZW5hYmxlOjE7CisgICB9IHNmNjsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBwb2ludF9zaXplOjExOworICAgICAgdW5zaWduZWQgdXNlX3BvaW50X3NpemVfc3RhdGU6MTsKKyAgICAgIHVuc2lnbmVkIHN1YnBpeGVsX3ByZWNpc2lvbjoxOworICAgICAgdW5zaWduZWQgc3ByaXRlX3BvaW50OjE7CisgICAgICB1bnNpZ25lZCBwYWQwOjEwOworICAgICAgdW5zaWduZWQgYWFfbGluZV9kaXN0YW5jZV9tb2RlOjE7CisgICAgICB1bnNpZ25lZCB0cmlmYW5fcHY6MjsKKyAgICAgIHVuc2lnbmVkIGxpbmVzdHJpcF9wdjoyOworICAgICAgdW5zaWduZWQgdHJpc3RyaXBfcHY6MjsKKyAgICAgIHVuc2lnbmVkIGxpbmVfbGFzdF9waXhlbF9lbmFibGU6MTsKKyAgIH0gc2Y3OworCit9OworCitzdHJ1Y3QgZ2VuNl9zY2lzc29yX3JlY3QKK3sKKyAgIHVuc2lnbmVkIHhtaW46MTY7CisgICB1bnNpZ25lZCB5bWluOjE2OworICAgdW5zaWduZWQgeG1heDoxNjsKKyAgIHVuc2lnbmVkIHltYXg6MTY7Cit9OworCitzdHJ1Y3QgYnJ3X2dzX3VuaXRfc3RhdGUKK3sKKyAgIHN0cnVjdCB0aHJlYWQwIHRocmVhZDA7CisgICBzdHJ1Y3QgdGhyZWFkMSB0aHJlYWQxOworICAgc3RydWN0IHRocmVhZDIgdGhyZWFkMjsKKyAgIHN0cnVjdCB0aHJlYWQzIHRocmVhZDM7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgcGFkMDo4OworICAgICAgdW5zaWduZWQgcmVuZGVyaW5nX2VuYWJsZToxOyAvKiBmb3IgSXJvbmxha2UgKi8KKyAgICAgIHVuc2lnbmVkIHBhZDQ6MTsKKyAgICAgIHVuc2lnbmVkIHN0YXRzX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgbnJfdXJiX2VudHJpZXM6NzsKKyAgICAgIHVuc2lnbmVkIHBhZDE6MTsKKyAgICAgIHVuc2lnbmVkIHVyYl9lbnRyeV9hbGxvY2F0aW9uX3NpemU6NTsKKyAgICAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgICAgIHVuc2lnbmVkIG1heF90aHJlYWRzOjU7CisgICAgICB1bnNpZ25lZCBwYWQzOjI7CisgICB9IHRocmVhZDQ7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgc2FtcGxlcl9jb3VudDozOworICAgICAgdW5zaWduZWQgcGFkMDoyOworICAgICAgdW5zaWduZWQgc2FtcGxlcl9zdGF0ZV9wb2ludGVyOjI3OworICAgfSBnczU7CisKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBtYXhfdnBfaW5kZXg6NDsKKyAgICAgIHVuc2lnbmVkIHBhZDA6MTI7CisgICAgICB1bnNpZ25lZCBzdmJpX3Bvc3RfaW5jX3ZhbHVlOjEwOworICAgICAgdW5zaWduZWQgcGFkMToxOworICAgICAgdW5zaWduZWQgc3ZiaV9wb3N0X2luY19lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIHN2YmlfcGF5bG9hZDoxOworICAgICAgdW5zaWduZWQgZGlzY2FyZF9hZGphY2VueToxOworICAgICAgdW5zaWduZWQgcmVvcmRlcl9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgIH0gZ3M2OworfTsKKworCitzdHJ1Y3QgYnJ3X3ZzX3VuaXRfc3RhdGUKK3sKKyAgIHN0cnVjdCB0aHJlYWQwIHRocmVhZDA7CisgICBzdHJ1Y3QgdGhyZWFkMSB0aHJlYWQxOworICAgc3RydWN0IHRocmVhZDIgdGhyZWFkMjsKKyAgIHN0cnVjdCB0aHJlYWQzIHRocmVhZDM7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgcGFkMDoxMDsKKyAgICAgIHVuc2lnbmVkIHN0YXRzX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgbnJfdXJiX2VudHJpZXM6NzsKKyAgICAgIHVuc2lnbmVkIHBhZDE6MTsKKyAgICAgIHVuc2lnbmVkIHVyYl9lbnRyeV9hbGxvY2F0aW9uX3NpemU6NTsKKyAgICAgIHVuc2lnbmVkIHBhZDI6MTsKKyAgICAgIHVuc2lnbmVkIG1heF90aHJlYWRzOjY7CisgICAgICB1bnNpZ25lZCBwYWQzOjE7CisgICB9IHRocmVhZDQ7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgc2FtcGxlcl9jb3VudDozOworICAgICAgdW5zaWduZWQgcGFkMDoyOworICAgICAgdW5zaWduZWQgc2FtcGxlcl9zdGF0ZV9wb2ludGVyOjI3OworICAgfSB2czU7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgdnNfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCB2ZXJ0X2NhY2hlX2Rpc2FibGU6MTsKKyAgICAgIHVuc2lnbmVkIHBhZDA6MzA7CisgICB9IHZzNjsKK307CisKKworc3RydWN0IGJyd193bV91bml0X3N0YXRlCit7CisgICBzdHJ1Y3QgdGhyZWFkMCB0aHJlYWQwOworICAgc3RydWN0IHRocmVhZDEgdGhyZWFkMTsKKyAgIHN0cnVjdCB0aHJlYWQyIHRocmVhZDI7CisgICBzdHJ1Y3QgdGhyZWFkMyB0aHJlYWQzOworCisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgc3RhdHNfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBkZXB0aF9idWZmZXJfY2xlYXI6MTsKKyAgICAgIHVuc2lnbmVkIHNhbXBsZXJfY291bnQ6MzsKKyAgICAgIHVuc2lnbmVkIHNhbXBsZXJfc3RhdGVfcG9pbnRlcjoyNzsKKyAgIH0gd200OworCisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGVuYWJsZV84X3BpeDoxOworICAgICAgdW5zaWduZWQgZW5hYmxlXzE2X3BpeDoxOworICAgICAgdW5zaWduZWQgZW5hYmxlXzMyX3BpeDoxOworICAgICAgdW5zaWduZWQgZW5hYmxlX2Nvbl8zMl9waXg6MTsKKyAgICAgIHVuc2lnbmVkIGVuYWJsZV9jb25fNjRfcGl4OjE7CisgICAgICB1bnNpZ25lZCBwYWQwOjE7CisKKyAgICAgIC8qIFRoZXNlIG5leHQgZm91ciBiaXRzIGFyZSBmb3IgSXJvbmxha2UrICovCisgICAgICB1bnNpZ25lZCBmYXN0X3NwYW5fY292ZXJhZ2VfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBkZXB0aF9idWZmZXJfY2xlYXI6MTsKKyAgICAgIHVuc2lnbmVkIGRlcHRoX2J1ZmZlcl9yZXNvbHZlX2VuYWJsZToxOworICAgICAgdW5zaWduZWQgaGllcmFyY2hpY2FsX2RlcHRoX2J1ZmZlcl9yZXNvbHZlX2VuYWJsZToxOworCisgICAgICB1bnNpZ25lZCBsZWdhY3lfZ2xvYmFsX2RlcHRoX2JpYXM6MTsKKyAgICAgIHVuc2lnbmVkIGxpbmVfc3RpcHBsZToxOworICAgICAgdW5zaWduZWQgZGVwdGhfb2Zmc2V0OjE7CisgICAgICB1bnNpZ25lZCBwb2x5Z29uX3N0aXBwbGU6MTsKKyAgICAgIHVuc2lnbmVkIGxpbmVfYWFfcmVnaW9uX3dpZHRoOjI7CisgICAgICB1bnNpZ25lZCBsaW5lX2VuZGNhcF9hYV9yZWdpb25fd2lkdGg6MjsKKyAgICAgIHVuc2lnbmVkIGVhcmx5X2RlcHRoX3Rlc3Q6MTsKKyAgICAgIHVuc2lnbmVkIHRocmVhZF9kaXNwYXRjaF9lbmFibGU6MTsKKyAgICAgIHVuc2lnbmVkIHByb2dyYW1fdXNlc19kZXB0aDoxOworICAgICAgdW5zaWduZWQgcHJvZ3JhbV9jb21wdXRlc19kZXB0aDoxOworICAgICAgdW5zaWduZWQgcHJvZ3JhbV91c2VzX2tpbGxwaXhlbDoxOworICAgICAgdW5zaWduZWQgbGVnYWN5X2xpbmVfcmFzdDogMTsKKyAgICAgIHVuc2lnbmVkIHRyYW5zcG9zZWRfdXJiX3JlYWRfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBtYXhfdGhyZWFkczo3OworICAgfSB3bTU7CisKKyAgIGZsb2F0IGdsb2JhbF9kZXB0aF9vZmZzZXRfY29uc3RhbnQ7CisgICBmbG9hdCBnbG9iYWxfZGVwdGhfb2Zmc2V0X3NjYWxlOworCisgICAvKiBmb3IgSXJvbmxha2Ugb25seSAqLworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIHBhZDA6MTsKKyAgICAgIHVuc2lnbmVkIGdyZl9yZWdfY291bnRfMTozOworICAgICAgdW5zaWduZWQgcGFkMToyOworICAgICAgdW5zaWduZWQga2VybmVsX3N0YXJ0X3BvaW50ZXJfMToyNjsKKyAgIH0gd204OworCisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgcGFkMDoxOworICAgICAgdW5zaWduZWQgZ3JmX3JlZ19jb3VudF8yOjM7CisgICAgICB1bnNpZ25lZCBwYWQxOjI7CisgICAgICB1bnNpZ25lZCBrZXJuZWxfc3RhcnRfcG9pbnRlcl8yOjI2OworICAgfSB3bTk7CisKKyAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBwYWQwOjE7CisgICAgICB1bnNpZ25lZCBncmZfcmVnX2NvdW50XzM6MzsKKyAgICAgIHVuc2lnbmVkIHBhZDE6MjsKKyAgICAgIHVuc2lnbmVkIGtlcm5lbF9zdGFydF9wb2ludGVyXzM6MjY7CisgICB9IHdtMTA7Cit9OworCitzdHJ1Y3QgYnJ3X3NhbXBsZXJfZGVmYXVsdF9jb2xvciB7CisgICBmbG9hdCBjb2xvcls0XTsKK307CisKK3N0cnVjdCBnZW41X3NhbXBsZXJfZGVmYXVsdF9jb2xvciB7CisgICB1aW50OF90IHViWzRdOworICAgZmxvYXQgZls0XTsKKyAgIHVpbnQxNl90IGhmWzRdOworICAgdWludDE2X3QgdXNbNF07CisgICBpbnQxNl90IHNbNF07CisgICB1aW50OF90IGJbNF07Cit9OworCitzdHJ1Y3QgYnJ3X3NhbXBsZXJfc3RhdGUKK3sKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBzaGFkb3dfZnVuY3Rpb246MzsKKyAgICAgIHVuc2lnbmVkIGxvZF9iaWFzOjExOworICAgICAgdW5zaWduZWQgbWluX2ZpbHRlcjozOworICAgICAgdW5zaWduZWQgbWFnX2ZpbHRlcjozOworICAgICAgdW5zaWduZWQgbWlwX2ZpbHRlcjoyOworICAgICAgdW5zaWduZWQgYmFzZV9sZXZlbDo1OworICAgICAgdW5zaWduZWQgbWluX21hZ19uZXE6MTsKKyAgICAgIHVuc2lnbmVkIGxvZF9wcmVjbGFtcDoxOworICAgICAgdW5zaWduZWQgZGVmYXVsdF9jb2xvcl9tb2RlOjE7CisgICAgICB1bnNpZ25lZCBwYWQwOjE7CisgICAgICB1bnNpZ25lZCBkaXNhYmxlOjE7CisgICB9IHNzMDsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCByX3dyYXBfbW9kZTozOworICAgICAgdW5zaWduZWQgdF93cmFwX21vZGU6MzsKKyAgICAgIHVuc2lnbmVkIHNfd3JhcF9tb2RlOjM7CisgICAgICB1bnNpZ25lZCBjdWJlX2NvbnRyb2xfbW9kZToxOworICAgICAgdW5zaWduZWQgcGFkOjI7CisgICAgICB1bnNpZ25lZCBtYXhfbG9kOjEwOworICAgICAgdW5zaWduZWQgbWluX2xvZDoxMDsKKyAgIH0gc3MxOworCisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgcGFkOjU7CisgICAgICB1bnNpZ25lZCBkZWZhdWx0X2NvbG9yX3BvaW50ZXI6Mjc7CisgICB9IHNzMjsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBub25fbm9ybWFsaXplZF9jb29yZDoxOworICAgICAgdW5zaWduZWQgcGFkOjEyOworICAgICAgdW5zaWduZWQgYWRkcmVzc19yb3VuZDo2OworICAgICAgdW5zaWduZWQgbWF4X2FuaXNvOjM7CisgICAgICB1bnNpZ25lZCBjaHJvbWFfa2V5X21vZGU6MTsKKyAgICAgIHVuc2lnbmVkIGNocm9tYV9rZXlfaW5kZXg6MjsKKyAgICAgIHVuc2lnbmVkIGNocm9tYV9rZXlfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBtb25vY2hyb21lX2ZpbHRlcl93aWR0aDozOworICAgICAgdW5zaWduZWQgbW9ub2Nocm9tZV9maWx0ZXJfaGVpZ2h0OjM7CisgICB9IHNzMzsKK307CisKK3N0cnVjdCBnZW43X3NhbXBsZXJfc3RhdGUKK3sKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgYW5pc29fYWxnb3JpdGhtOjE7CisgICAgICB1bnNpZ25lZCBsb2RfYmlhczoxMzsKKyAgICAgIHVuc2lnbmVkIG1pbl9maWx0ZXI6MzsKKyAgICAgIHVuc2lnbmVkIG1hZ19maWx0ZXI6MzsKKyAgICAgIHVuc2lnbmVkIG1pcF9maWx0ZXI6MjsKKyAgICAgIHVuc2lnbmVkIGJhc2VfbGV2ZWw6NTsKKyAgICAgIHVuc2lnbmVkIHBhZDE6MTsKKyAgICAgIHVuc2lnbmVkIGxvZF9wcmVjbGFtcDoxOworICAgICAgdW5zaWduZWQgZGVmYXVsdF9jb2xvcl9tb2RlOjE7CisgICAgICB1bnNpZ25lZCBwYWQwOjE7CisgICAgICB1bnNpZ25lZCBkaXNhYmxlOjE7CisgICB9IHNzMDsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCBjdWJlX2NvbnRyb2xfbW9kZToxOworICAgICAgdW5zaWduZWQgc2hhZG93X2Z1bmN0aW9uOjM7CisgICAgICB1bnNpZ25lZCBwYWQ6NDsKKyAgICAgIHVuc2lnbmVkIG1heF9sb2Q6MTI7CisgICAgICB1bnNpZ25lZCBtaW5fbG9kOjEyOworICAgfSBzczE7CisKKyAgIHN0cnVjdAorICAgeworICAgICAgdW5zaWduZWQgcGFkOjU7CisgICAgICB1bnNpZ25lZCBkZWZhdWx0X2NvbG9yX3BvaW50ZXI6Mjc7CisgICB9IHNzMjsKKworICAgc3RydWN0CisgICB7CisgICAgICB1bnNpZ25lZCByX3dyYXBfbW9kZTozOworICAgICAgdW5zaWduZWQgdF93cmFwX21vZGU6MzsKKyAgICAgIHVuc2lnbmVkIHNfd3JhcF9tb2RlOjM7CisgICAgICB1bnNpZ25lZCBwYWQ6MTsKKyAgICAgIHVuc2lnbmVkIG5vbl9ub3JtYWxpemVkX2Nvb3JkOjE7CisgICAgICB1bnNpZ25lZCB0cmlsaW5lYXJfcXVhbGl0eToyOworICAgICAgdW5zaWduZWQgYWRkcmVzc19yb3VuZDo2OworICAgICAgdW5zaWduZWQgbWF4X2FuaXNvOjM7CisgICAgICB1bnNpZ25lZCBjaHJvbWFfa2V5X21vZGU6MTsKKyAgICAgIHVuc2lnbmVkIGNocm9tYV9rZXlfaW5kZXg6MjsKKyAgICAgIHVuc2lnbmVkIGNocm9tYV9rZXlfZW5hYmxlOjE7CisgICAgICB1bnNpZ25lZCBwYWQwOjY7CisgICB9IHNzMzsKK307CisKK3N0cnVjdCBicndfY2xpcHBlcl92aWV3cG9ydAoreworICAgZmxvYXQgeG1pbjsKKyAgIGZsb2F0IHhtYXg7CisgICBmbG9hdCB5bWluOworICAgZmxvYXQgeW1heDsKK307CisKK3N0cnVjdCBicndfY2Nfdmlld3BvcnQKK3sKKyAgIGZsb2F0IG1pbl9kZXB0aDsKKyAgIGZsb2F0IG1heF9kZXB0aDsKK307CisKK3N0cnVjdCBicndfc2Zfdmlld3BvcnQKK3sKKyAgIHN0cnVjdCB7CisgICAgICBmbG9hdCBtMDA7CisgICAgICBmbG9hdCBtMTE7CisgICAgICBmbG9hdCBtMjI7CisgICAgICBmbG9hdCBtMzA7CisgICAgICBmbG9hdCBtMzE7CisgICAgICBmbG9hdCBtMzI7CisgICB9IHZpZXdwb3J0OworCisgICAvKiBzY2lzc29yIGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUgKi8KKyAgIHN0cnVjdCB7CisgICAgICBpbnQxNl90IHhtaW47CisgICAgICBpbnQxNl90IHltaW47CisgICAgICBpbnQxNl90IHhtYXg7CisgICAgICBpbnQxNl90IHltYXg7CisgICB9IHNjaXNzb3I7Cit9OworCitzdHJ1Y3QgZ2VuNl9zZl92aWV3cG9ydCB7CisgICBmbG9hdCBtMDA7CisgICBmbG9hdCBtMTE7CisgICBmbG9hdCBtMjI7CisgICBmbG9hdCBtMzA7CisgICBmbG9hdCBtMzE7CisgICBmbG9hdCBtMzI7Cit9OworCitzdHJ1Y3QgZ2VuN19zZl9jbGlwX3ZpZXdwb3J0IHsKKyAgIHN0cnVjdCB7CisgICAgICBmbG9hdCBtMDA7CisgICAgICBmbG9hdCBtMTE7CisgICAgICBmbG9hdCBtMjI7CisgICAgICBmbG9hdCBtMzA7CisgICAgICBmbG9hdCBtMzE7CisgICAgICBmbG9hdCBtMzI7CisgICB9IHZpZXdwb3J0OworCisgICB1bnNpZ25lZCBwYWQwWzJdOworCisgICBzdHJ1Y3QgeworICAgICAgZmxvYXQgeG1pbjsKKyAgICAgIGZsb2F0IHhtYXg7CisgICAgICBmbG9hdCB5bWluOworICAgICAgZmxvYXQgeW1heDsKKyAgIH0gZ3VhcmRiYW5kOworCisgICBmbG9hdCBwYWQxWzRdOworfTsKKworc3RydWN0IGJyd191cmJfaW1tZWRpYXRlIHsKKyAgIHVuc2lnbmVkIG9wY29kZTo0OworICAgdW5zaWduZWQgb2Zmc2V0OjY7CisgICB1bnNpZ25lZCBzd2l6emxlX2NvbnRyb2w6MjsKKyAgIHVuc2lnbmVkIHBhZDoxOworICAgdW5zaWduZWQgYWxsb2NhdGU6MTsKKyAgIHVuc2lnbmVkIHVzZWQ6MTsKKyAgIHVuc2lnbmVkIGNvbXBsZXRlOjE7CisgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGg6NDsKKyAgIHVuc2lnbmVkIG1zZ19sZW5ndGg6NDsKKyAgIHVuc2lnbmVkIG1zZ190YXJnZXQ6NDsKKyAgIHVuc2lnbmVkIHBhZDE6MzsKKyAgIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKK307CisKKy8qIEluc3RydWN0aW9uIGZvcm1hdCBmb3IgdGhlIGV4ZWN1dGlvbiB1bml0czoKKyAqLworCitzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uCit7CisgICBzdHJ1Y3QKKyAgIHsKKyAgICAgIHVuc2lnbmVkIG9wY29kZTo3OworICAgICAgdW5zaWduZWQgcGFkOjE7CisgICAgICB1bnNpZ25lZCBhY2Nlc3NfbW9kZToxOworICAgICAgdW5zaWduZWQgbWFza19jb250cm9sOjE7CisgICAgICB1bnNpZ25lZCBkZXBlbmRlbmN5X2NvbnRyb2w6MjsKKyAgICAgIHVuc2lnbmVkIGNvbXByZXNzaW9uX2NvbnRyb2w6MjsgLyogZ2VuNjogcXVhcnRlciBjb250cm9sICovCisgICAgICB1bnNpZ25lZCB0aHJlYWRfY29udHJvbDoyOworICAgICAgdW5zaWduZWQgcHJlZGljYXRlX2NvbnRyb2w6NDsKKyAgICAgIHVuc2lnbmVkIHByZWRpY2F0ZV9pbnZlcnNlOjE7CisgICAgICB1bnNpZ25lZCBleGVjdXRpb25fc2l6ZTozOworICAgICAgLyoqCisgICAgICAgKiBDb25kaXRpb25hbCBNb2RpZmllciBmb3IgbW9zdCBpbnN0cnVjdGlvbnMuICBPbiBHZW42KywgdGhpcyBpcyBhbHNvCisgICAgICAgKiB1c2VkIGZvciB0aGUgU0VORCBpbnN0cnVjdGlvbidzIE1lc3NhZ2UgVGFyZ2V0L1NGSUQuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kOjQ7CisgICAgICB1bnNpZ25lZCBhY2Nfd3JfY29udHJvbDoxOworICAgICAgdW5zaWduZWQgY21wdF9jb250cm9sOjE7CisgICAgICB1bnNpZ25lZCBkZWJ1Z19jb250cm9sOjE7CisgICAgICB1bnNpZ25lZCBzYXR1cmF0ZToxOworICAgfSBoZWFkZXI7CisKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBkZXN0X3JlZ19maWxlOjI7CisJIHVuc2lnbmVkIGRlc3RfcmVnX3R5cGU6MzsKKwkgdW5zaWduZWQgc3JjMF9yZWdfZmlsZToyOworCSB1bnNpZ25lZCBzcmMwX3JlZ190eXBlOjM7CisJIHVuc2lnbmVkIHNyYzFfcmVnX2ZpbGU6MjsKKwkgdW5zaWduZWQgc3JjMV9yZWdfdHlwZTozOworICAgICAgICAgdW5zaWduZWQgbmliY3RybDoxOyAvKiBnZW43KyAqLworCSB1bnNpZ25lZCBkZXN0X3N1YnJlZ19ucjo1OworCSB1bnNpZ25lZCBkZXN0X3JlZ19ucjo4OworCSB1bnNpZ25lZCBkZXN0X2hvcml6X3N0cmlkZToyOworCSB1bnNpZ25lZCBkZXN0X2FkZHJlc3NfbW9kZToxOworICAgICAgfSBkYTE7CisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBkZXN0X3JlZ19maWxlOjI7CisJIHVuc2lnbmVkIGRlc3RfcmVnX3R5cGU6MzsKKwkgdW5zaWduZWQgc3JjMF9yZWdfZmlsZToyOworCSB1bnNpZ25lZCBzcmMwX3JlZ190eXBlOjM7CisJIHVuc2lnbmVkIHNyYzFfcmVnX2ZpbGU6MjsgICAgICAgIC8qIDB4MDAwMDBjMDAgKi8KKwkgdW5zaWduZWQgc3JjMV9yZWdfdHlwZTozOyAgICAgICAgLyogMHgwMDAwNzAwMCAqLworICAgICAgICAgdW5zaWduZWQgbmliY3RybDoxOyAvKiBnZW43KyAqLworCSBpbnQgZGVzdF9pbmRpcmVjdF9vZmZzZXQ6MTA7CS8qIG9mZnNldCBhZ2FpbnN0IHRoZSBkZXJlZidkIGFkZHJlc3MgcmVnICovCisJIHVuc2lnbmVkIGRlc3Rfc3VicmVnX25yOjM7IC8qIHN1Ym5yIGZvciB0aGUgYWRkcmVzcyByZWcgYTAueCAqLworCSB1bnNpZ25lZCBkZXN0X2hvcml6X3N0cmlkZToyOworCSB1bnNpZ25lZCBkZXN0X2FkZHJlc3NfbW9kZToxOworICAgICAgfSBpYTE7CisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBkZXN0X3JlZ19maWxlOjI7CisJIHVuc2lnbmVkIGRlc3RfcmVnX3R5cGU6MzsKKwkgdW5zaWduZWQgc3JjMF9yZWdfZmlsZToyOworCSB1bnNpZ25lZCBzcmMwX3JlZ190eXBlOjM7CisJIHVuc2lnbmVkIHNyYzFfcmVnX2ZpbGU6MjsKKwkgdW5zaWduZWQgc3JjMV9yZWdfdHlwZTozOworICAgICAgICAgdW5zaWduZWQgbmliY3RybDoxOyAvKiBnZW43KyAqLworCSB1bnNpZ25lZCBkZXN0X3dyaXRlbWFzazo0OworCSB1bnNpZ25lZCBkZXN0X3N1YnJlZ19ucjoxOworCSB1bnNpZ25lZCBkZXN0X3JlZ19ucjo4OworCSB1bnNpZ25lZCBkZXN0X2hvcml6X3N0cmlkZToyOworCSB1bnNpZ25lZCBkZXN0X2FkZHJlc3NfbW9kZToxOworICAgICAgfSBkYTE2OworCisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKwkgdW5zaWduZWQgZGVzdF9yZWdfZmlsZToyOworCSB1bnNpZ25lZCBkZXN0X3JlZ190eXBlOjM7CisJIHVuc2lnbmVkIHNyYzBfcmVnX2ZpbGU6MjsKKwkgdW5zaWduZWQgc3JjMF9yZWdfdHlwZTozOworICAgICAgICAgdW5zaWduZWQgc3JjMV9yZWdfZmlsZToyOworICAgICAgICAgdW5zaWduZWQgc3JjMV9yZWdfdHlwZTozOworICAgICAgICAgdW5zaWduZWQgbmliY3RybDoxOyAvKiBnZW43KyAqLworCSB1bnNpZ25lZCBkZXN0X3dyaXRlbWFzazo0OworCSBpbnQgZGVzdF9pbmRpcmVjdF9vZmZzZXQ6NjsKKwkgdW5zaWduZWQgZGVzdF9zdWJyZWdfbnI6MzsKKwkgdW5zaWduZWQgZGVzdF9ob3Jpel9zdHJpZGU6MjsKKwkgdW5zaWduZWQgZGVzdF9hZGRyZXNzX21vZGU6MTsKKyAgICAgIH0gaWExNjsKKworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgZGVzdF9yZWdfZmlsZToyOworCSB1bnNpZ25lZCBkZXN0X3JlZ190eXBlOjM7CisJIHVuc2lnbmVkIHNyYzBfcmVnX2ZpbGU6MjsKKwkgdW5zaWduZWQgc3JjMF9yZWdfdHlwZTozOworCSB1bnNpZ25lZCBzcmMxX3JlZ19maWxlOjI7CisJIHVuc2lnbmVkIHNyYzFfcmVnX3R5cGU6MzsKKwkgdW5zaWduZWQgcGFkOjE7CisKKwkgaW50IGp1bXBfY291bnQ6MTY7CisgICAgICB9IGJyYW5jaF9nZW42OworCisgICAgICBzdHJ1Y3QgeworICAgICAgICAgdW5zaWduZWQgZGVzdF9yZWdfZmlsZToxOyAvKiBnZW42LCBub3QgZ2VuNysgKi8KKwkgdW5zaWduZWQgZmxhZ19zdWJyZWdfbnVtOjE7CisgICAgICAgICB1bnNpZ25lZCBmbGFnX3JlZ19ucjoxOyAvKiBnZW43KyAqLworICAgICAgICAgdW5zaWduZWQgcGFkMDoxOworCSB1bnNpZ25lZCBzcmMwX2FiczoxOworCSB1bnNpZ25lZCBzcmMwX25lZ2F0ZToxOworCSB1bnNpZ25lZCBzcmMxX2FiczoxOworCSB1bnNpZ25lZCBzcmMxX25lZ2F0ZToxOworCSB1bnNpZ25lZCBzcmMyX2FiczoxOworCSB1bnNpZ25lZCBzcmMyX25lZ2F0ZToxOworICAgICAgICAgdW5zaWduZWQgc3JjX3R5cGU6MjsgLyogZ2VuNysgKi8KKyAgICAgICAgIHVuc2lnbmVkIGRzdF90eXBlOjI7IC8qIGdlbjcrICovCisgICAgICAgICB1bnNpZ25lZCBwYWQxOjE7CisgICAgICAgICB1bnNpZ25lZCBuaWJjdHJsOjE7IC8qIGdlbjcrICovCisgICAgICAgICB1bnNpZ25lZCBwYWQyOjE7CisJIHVuc2lnbmVkIGRlc3Rfd3JpdGVtYXNrOjQ7CisJIHVuc2lnbmVkIGRlc3Rfc3VicmVnX25yOjM7CisJIHVuc2lnbmVkIGRlc3RfcmVnX25yOjg7CisgICAgICB9IGRhM3NyYzsKKworICAgICAgdWludDMyX3QgdWQ7CisgICB9IGJpdHMxOworCisKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBzcmMwX3N1YnJlZ19ucjo1OworCSB1bnNpZ25lZCBzcmMwX3JlZ19ucjo4OworCSB1bnNpZ25lZCBzcmMwX2FiczoxOworCSB1bnNpZ25lZCBzcmMwX25lZ2F0ZToxOworCSB1bnNpZ25lZCBzcmMwX2FkZHJlc3NfbW9kZToxOworCSB1bnNpZ25lZCBzcmMwX2hvcml6X3N0cmlkZToyOworCSB1bnNpZ25lZCBzcmMwX3dpZHRoOjM7CisJIHVuc2lnbmVkIHNyYzBfdmVydF9zdHJpZGU6NDsKKwkgdW5zaWduZWQgZmxhZ19zdWJyZWdfbnI6MTsKKyAgICAgICAgIHVuc2lnbmVkIGZsYWdfcmVnX25yOjE7IC8qIGdlbjcrICovCisJIHVuc2lnbmVkIHBhZDo1OworICAgICAgfSBkYTE7CisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSBpbnQgc3JjMF9pbmRpcmVjdF9vZmZzZXQ6MTA7CisJIHVuc2lnbmVkIHNyYzBfc3VicmVnX25yOjM7CisJIHVuc2lnbmVkIHNyYzBfYWJzOjE7CisJIHVuc2lnbmVkIHNyYzBfbmVnYXRlOjE7CisJIHVuc2lnbmVkIHNyYzBfYWRkcmVzc19tb2RlOjE7CisJIHVuc2lnbmVkIHNyYzBfaG9yaXpfc3RyaWRlOjI7CisJIHVuc2lnbmVkIHNyYzBfd2lkdGg6MzsKKwkgdW5zaWduZWQgc3JjMF92ZXJ0X3N0cmlkZTo0OworCSB1bnNpZ25lZCBmbGFnX3N1YnJlZ19ucjoxOworICAgICAgICAgdW5zaWduZWQgZmxhZ19yZWdfbnI6MTsgLyogZ2VuNysgKi8KKwkgdW5zaWduZWQgcGFkOjU7CisgICAgICB9IGlhMTsKKworICAgICAgc3RydWN0CisgICAgICB7CisJIHVuc2lnbmVkIHNyYzBfc3d6X3g6MjsKKwkgdW5zaWduZWQgc3JjMF9zd3pfeToyOworCSB1bnNpZ25lZCBzcmMwX3N1YnJlZ19ucjoxOworCSB1bnNpZ25lZCBzcmMwX3JlZ19ucjo4OworCSB1bnNpZ25lZCBzcmMwX2FiczoxOworCSB1bnNpZ25lZCBzcmMwX25lZ2F0ZToxOworCSB1bnNpZ25lZCBzcmMwX2FkZHJlc3NfbW9kZToxOworCSB1bnNpZ25lZCBzcmMwX3N3el96OjI7CisJIHVuc2lnbmVkIHNyYzBfc3d6X3c6MjsKKwkgdW5zaWduZWQgcGFkMDoxOworCSB1bnNpZ25lZCBzcmMwX3ZlcnRfc3RyaWRlOjQ7CisJIHVuc2lnbmVkIGZsYWdfc3VicmVnX25yOjE7CisgICAgICAgICB1bnNpZ25lZCBmbGFnX3JlZ19ucjoxOyAvKiBnZW43KyAqLworCSB1bnNpZ25lZCBwYWQxOjU7CisgICAgICB9IGRhMTY7CisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBzcmMwX3N3el94OjI7CisJIHVuc2lnbmVkIHNyYzBfc3d6X3k6MjsKKwkgaW50IHNyYzBfaW5kaXJlY3Rfb2Zmc2V0OjY7CisJIHVuc2lnbmVkIHNyYzBfc3VicmVnX25yOjM7CisJIHVuc2lnbmVkIHNyYzBfYWJzOjE7CisJIHVuc2lnbmVkIHNyYzBfbmVnYXRlOjE7CisJIHVuc2lnbmVkIHNyYzBfYWRkcmVzc19tb2RlOjE7CisJIHVuc2lnbmVkIHNyYzBfc3d6X3o6MjsKKwkgdW5zaWduZWQgc3JjMF9zd3pfdzoyOworCSB1bnNpZ25lZCBwYWQwOjE7CisJIHVuc2lnbmVkIHNyYzBfdmVydF9zdHJpZGU6NDsKKwkgdW5zaWduZWQgZmxhZ19zdWJyZWdfbnI6MTsKKyAgICAgICAgIHVuc2lnbmVkIGZsYWdfcmVnX25yOjE7IC8qIGdlbjcrICovCisJIHVuc2lnbmVkIHBhZDE6NTsKKyAgICAgIH0gaWExNjsKKworICAgICAgLyogRXh0ZW5kZWQgTWVzc2FnZSBEZXNjcmlwdG9yIGZvciBJcm9ubGFrZSAoR2VuNSkgU0VORCBpbnN0cnVjdGlvbi4KKyAgICAgICAqCisgICAgICAgKiBEb2VzIG5vdCBhcHBseSB0byBHZW42Ky4gIFRoZSBTRklEL21lc3NhZ2UgdGFyZ2V0IG1vdmVkIHRvIGJpdHMKKyAgICAgICAqIDI3OjI0IG9mIHRoZSBoZWFkZXIgKGRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kKTsgRU9UIGlzIGluIGJpdHMzLgorICAgICAgICovCisgICAgICAgc3RydWN0CisgICAgICAgeworICAgICAgICAgICB1bnNpZ25lZCBwYWQ6MjY7CisgICAgICAgICAgIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgICAgICAgdW5zaWduZWQgcGFkMToxOworICAgICAgICAgICB1bnNpZ25lZCBzZmlkOjQ7CisgICAgICAgfSBzZW5kX2dlbjU7ICAvKiBmb3IgSXJvbmxha2Ugb25seSAqLworCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBzcmMwX3JlcF9jdHJsOjE7CisJIHVuc2lnbmVkIHNyYzBfc3dpenpsZTo4OworCSB1bnNpZ25lZCBzcmMwX3N1YnJlZ19ucjozOworCSB1bnNpZ25lZCBzcmMwX3JlZ19ucjo4OworCSB1bnNpZ25lZCBwYWQwOjE7CisJIHVuc2lnbmVkIHNyYzFfcmVwX2N0cmw6MTsKKwkgdW5zaWduZWQgc3JjMV9zd2l6emxlOjg7CisJIHVuc2lnbmVkIHNyYzFfc3VicmVnX25yX2xvdzoyOworICAgICAgfSBkYTNzcmM7CisKKyAgICAgIHVpbnQzMl90IHVkOworICAgfSBiaXRzMjsKKworICAgdW5pb24KKyAgIHsKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBzcmMxX3N1YnJlZ19ucjo1OworCSB1bnNpZ25lZCBzcmMxX3JlZ19ucjo4OworCSB1bnNpZ25lZCBzcmMxX2FiczoxOworCSB1bnNpZ25lZCBzcmMxX25lZ2F0ZToxOworCSB1bnNpZ25lZCBzcmMxX2FkZHJlc3NfbW9kZToxOworCSB1bnNpZ25lZCBzcmMxX2hvcml6X3N0cmlkZToyOworCSB1bnNpZ25lZCBzcmMxX3dpZHRoOjM7CisJIHVuc2lnbmVkIHNyYzFfdmVydF9zdHJpZGU6NDsKKwkgdW5zaWduZWQgcGFkMDo3OworICAgICAgfSBkYTE7CisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBzcmMxX3N3el94OjI7CisJIHVuc2lnbmVkIHNyYzFfc3d6X3k6MjsKKwkgdW5zaWduZWQgc3JjMV9zdWJyZWdfbnI6MTsKKwkgdW5zaWduZWQgc3JjMV9yZWdfbnI6ODsKKwkgdW5zaWduZWQgc3JjMV9hYnM6MTsKKwkgdW5zaWduZWQgc3JjMV9uZWdhdGU6MTsKKwkgdW5zaWduZWQgc3JjMV9hZGRyZXNzX21vZGU6MTsKKwkgdW5zaWduZWQgc3JjMV9zd3pfejoyOworCSB1bnNpZ25lZCBzcmMxX3N3el93OjI7CisJIHVuc2lnbmVkIHBhZDE6MTsKKwkgdW5zaWduZWQgc3JjMV92ZXJ0X3N0cmlkZTo0OworCSB1bnNpZ25lZCBwYWQyOjc7CisgICAgICB9IGRhMTY7CisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSBpbnQgIHNyYzFfaW5kaXJlY3Rfb2Zmc2V0OjEwOworCSB1bnNpZ25lZCBzcmMxX3N1YnJlZ19ucjozOworCSB1bnNpZ25lZCBzcmMxX2FiczoxOworCSB1bnNpZ25lZCBzcmMxX25lZ2F0ZToxOworCSB1bnNpZ25lZCBzcmMxX2FkZHJlc3NfbW9kZToxOworCSB1bnNpZ25lZCBzcmMxX2hvcml6X3N0cmlkZToyOworCSB1bnNpZ25lZCBzcmMxX3dpZHRoOjM7CisJIHVuc2lnbmVkIHNyYzFfdmVydF9zdHJpZGU6NDsKKwkgdW5zaWduZWQgcGFkMTo3OworICAgICAgfSBpYTE7CisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSB1bnNpZ25lZCBzcmMxX3N3el94OjI7CisJIHVuc2lnbmVkIHNyYzFfc3d6X3k6MjsKKwkgaW50ICBzcmMxX2luZGlyZWN0X29mZnNldDo2OworCSB1bnNpZ25lZCBzcmMxX3N1YnJlZ19ucjozOworCSB1bnNpZ25lZCBzcmMxX2FiczoxOworCSB1bnNpZ25lZCBzcmMxX25lZ2F0ZToxOworCSB1bnNpZ25lZCBwYWQwOjE7CisJIHVuc2lnbmVkIHNyYzFfc3d6X3o6MjsKKwkgdW5zaWduZWQgc3JjMV9zd3pfdzoyOworCSB1bnNpZ25lZCBwYWQxOjE7CisJIHVuc2lnbmVkIHNyYzFfdmVydF9zdHJpZGU6NDsKKwkgdW5zaWduZWQgcGFkMjo3OworICAgICAgfSBpYTE2OworCisKKyAgICAgIHN0cnVjdAorICAgICAgeworCSBpbnQgIGp1bXBfY291bnQ6MTY7CS8qIG5vdGU6IHNpZ25lZCAqLworCSB1bnNpZ25lZCAgcG9wX2NvdW50OjQ7CisJIHVuc2lnbmVkICBwYWQwOjEyOworICAgICAgfSBpZl9lbHNlOworCisgICAgICAvKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgZ2VuNyBJRi9FTFNFIGluc3RydWN0aW9ucyAqLworICAgICAgc3RydWN0CisgICAgICB7CisJIC8qIFNpZ25lZCBqdW1wIGRpc3RhbmNlIHRvIHRoZSBpcCB0byBqdW1wIHRvIGlmIGFsbCBjaGFubmVscworCSAgKiBhcmUgZGlzYWJsZWQgYWZ0ZXIgdGhlIGJyZWFrIG9yIGNvbnRpbnVlLiAgSXQgc2hvdWxkIHBvaW50CisJICAqIHRvIHRoZSBlbmQgb2YgdGhlIGlubmVybW9zdCBjb250cm9sIGZsb3cgYmxvY2ssIGFzIHRoYXQncworCSAgKiB3aGVyZSBzb21lIGNoYW5uZWwgY291bGQgZ2V0IHJlLWVuYWJsZWQuCisJICAqLworCSBpbnQgamlwOjE2OworCisJIC8qIFNpZ25lZCBqdW1wIGRpc3RhbmNlIHRvIHRoZSBsb2NhdGlvbiB0byByZXN1bWUgZXhlY3V0aW9uCisJICAqIG9mIHRoaXMgY2hhbm5lbCBpZiBpdCdzIGVuYWJsZWQgZm9yIHRoZSBicmVhayBvciBjb250aW51ZS4KKwkgICovCisJIGludCB1aXA6MTY7CisgICAgICB9IGJyZWFrX2NvbnQ7CisKKyAgICAgIC8qKgorICAgICAgICogXGRlZmdyb3VwIFNFTkQgaW5zdHJ1Y3Rpb25zIC8gTWVzc2FnZSBEZXNjcmlwdG9ycworICAgICAgICoKKyAgICAgICAqIEB7CisgICAgICAgKi8KKworICAgICAgLyoqCisgICAgICAgKiBHZW5lcmljIE1lc3NhZ2UgRGVzY3JpcHRvciBmb3IgR2VuNCBTRU5EIGluc3RydWN0aW9ucy4gIFRoZSBzdHJ1Y3RzCisgICAgICAgKiBiZWxvdyBleHBhbmQgZnVuY3Rpb25fY29udHJvbCB0byBzb21ldGhpbmcgc3BlY2lmaWMgZm9yIHRoZWlyCisgICAgICAgKiBtZXNzYWdlLiAgRHVlIHRvIHN0cnVjdCBwYWNraW5nIGlzc3VlcywgdGhleSBkdXBsaWNhdGUgdGhlc2UgYml0cy4KKyAgICAgICAqCisgICAgICAgKiBTZWUgdGhlIEc0NSBQUk0sIFZvbHVtZSA0LCBUYWJsZSAxNC0xNS4KKyAgICAgICAqLworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgZnVuY3Rpb25fY29udHJvbDoxNjsKKwkgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIG1zZ19sZW5ndGg6NDsKKwkgdW5zaWduZWQgbXNnX3RhcmdldDo0OworCSB1bnNpZ25lZCBwYWQxOjM7CisJIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgIH0gZ2VuZXJpYzsKKworICAgICAgLyoqCisgICAgICAgKiBHZW5lcmljIE1lc3NhZ2UgRGVzY3JpcHRvciBmb3IgR2VuNS03IFNFTkQgaW5zdHJ1Y3Rpb25zLgorICAgICAgICoKKyAgICAgICAqIFNlZSB0aGUgU2FuZHlicmlkZ2UgUFJNLCBWb2x1bWUgMiBQYXJ0IDIsIFRhYmxlIDgtMTUuICAoU2FkbHksIG1vc3QKKyAgICAgICAqIG9mIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgU0VORCBpbnN0cnVjdGlvbiBpcyBtaXNzaW5nIGZyb20gdGhlIHB1YmxpYworICAgICAgICogSXJvbmxha2UgUFJNLikKKyAgICAgICAqCisgICAgICAgKiBUaGUgdGFibGUgY2xhaW1zIHRoYXQgYml0IDMxIGlzIHJlc2VydmVkL01CWiBvbiBHZW42KywgYnV0IGl0IGxpZXMuCisgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIFNFTkQgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRpb246CisgICAgICAgKiAiVGhlIE1TYiBvZiB0aGUgbWVzc2FnZSBkZXNjcmlwdGlvbiwgdGhlIEVPVCBmaWVsZCwgYWx3YXlzIGNvbWVzIGZyb20KKyAgICAgICAqICBiaXQgMTI3IG9mIHRoZSBpbnN0cnVjdGlvbiB3b3JkIi4uLndoaWNoIGlzIGJpdCAzMSBvZiB0aGlzIGZpZWxkLgorICAgICAgICovCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBmdW5jdGlvbl9jb250cm9sOjE5OworCSB1bnNpZ25lZCBoZWFkZXJfcHJlc2VudDoxOworCSB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGg6NTsKKwkgdW5zaWduZWQgbXNnX2xlbmd0aDo0OworCSB1bnNpZ25lZCBwYWQxOjI7CisJIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgIH0gZ2VuZXJpY19nZW41OworCisgICAgICAvKiogRzQ1IFBSTSwgVm9sdW1lIDQsIFNlY3Rpb24gNi4xLjEuMSAqLworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgZnVuY3Rpb246NDsKKwkgdW5zaWduZWQgaW50X3R5cGU6MTsKKwkgdW5zaWduZWQgcHJlY2lzaW9uOjE7CisJIHVuc2lnbmVkIHNhdHVyYXRlOjE7CisJIHVuc2lnbmVkIGRhdGFfdHlwZToxOworCSB1bnNpZ25lZCBwYWQwOjg7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo0OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIG1zZ190YXJnZXQ6NDsKKwkgdW5zaWduZWQgcGFkMTozOworCSB1bnNpZ25lZCBlbmRfb2ZfdGhyZWFkOjE7CisgICAgICB9IG1hdGg7CisKKyAgICAgIC8qKiBJcm9ubGFrZSBQUk0sIFZvbHVtZSA0IFBhcnQgMSwgU2VjdGlvbiA2LjEuMS4xICovCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBmdW5jdGlvbjo0OworCSB1bnNpZ25lZCBpbnRfdHlwZToxOworCSB1bnNpZ25lZCBwcmVjaXNpb246MTsKKwkgdW5zaWduZWQgc2F0dXJhdGU6MTsKKwkgdW5zaWduZWQgZGF0YV90eXBlOjE7CisJIHVuc2lnbmVkIHNuYXBzaG90OjE7CisJIHVuc2lnbmVkIHBhZDA6MTA7CisJIHVuc2lnbmVkIGhlYWRlcl9wcmVzZW50OjE7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo1OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIHBhZDE6MjsKKwkgdW5zaWduZWQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSBtYXRoX2dlbjU7CisKKyAgICAgIC8qKiBHNDUgUFJNLCBWb2x1bWUgNCwgU2VjdGlvbiA0LjguMS4xLjEgW0RldkJXXSBhbmQgW0RldkNMXSAqLworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleDo4OworCSB1bnNpZ25lZCBzYW1wbGVyOjQ7CisJIHVuc2lnbmVkIHJldHVybl9mb3JtYXQ6MjsKKwkgdW5zaWduZWQgbXNnX3R5cGU6MjsKKwkgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIG1zZ19sZW5ndGg6NDsKKwkgdW5zaWduZWQgbXNnX3RhcmdldDo0OworCSB1bnNpZ25lZCBwYWQxOjM7CisJIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgIH0gc2FtcGxlcjsKKworICAgICAgLyoqIEc0NSBQUk0sIFZvbHVtZSA0LCBTZWN0aW9uIDQuOC4xLjEuMiBbRGV2Q1RHXSAqLworICAgICAgc3RydWN0IHsKKyAgICAgICAgIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXg6ODsKKyAgICAgICAgIHVuc2lnbmVkIHNhbXBsZXI6NDsKKyAgICAgICAgIHVuc2lnbmVkIG1zZ190eXBlOjQ7CisgICAgICAgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGg6NDsKKyAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGg6NDsKKyAgICAgICAgIHVuc2lnbmVkIG1zZ190YXJnZXQ6NDsKKyAgICAgICAgIHVuc2lnbmVkIHBhZDE6MzsKKyAgICAgICAgIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgIH0gc2FtcGxlcl9nNHg7CisKKyAgICAgIC8qKiBJcm9ubGFrZSBQUk0sIFZvbHVtZSA0IFBhcnQgMSwgU2VjdGlvbiA0LjExLjEuMS4zICovCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2luZGV4Ojg7CisJIHVuc2lnbmVkIHNhbXBsZXI6NDsKKwkgdW5zaWduZWQgbXNnX3R5cGU6NDsKKwkgdW5zaWduZWQgc2ltZF9tb2RlOjI7CisJIHVuc2lnbmVkIHBhZDA6MTsKKwkgdW5zaWduZWQgaGVhZGVyX3ByZXNlbnQ6MTsKKwkgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoOjU7CisJIHVuc2lnbmVkIG1zZ19sZW5ndGg6NDsKKwkgdW5zaWduZWQgcGFkMToyOworCSB1bnNpZ25lZCBlbmRfb2ZfdGhyZWFkOjE7CisgICAgICB9IHNhbXBsZXJfZ2VuNTsKKworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleDo4OworCSB1bnNpZ25lZCBzYW1wbGVyOjQ7CisJIHVuc2lnbmVkIG1zZ190eXBlOjU7CisJIHVuc2lnbmVkIHNpbWRfbW9kZToyOworCSB1bnNpZ25lZCBoZWFkZXJfcHJlc2VudDoxOworCSB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGg6NTsKKwkgdW5zaWduZWQgbXNnX2xlbmd0aDo0OworCSB1bnNpZ25lZCBwYWQxOjI7CisJIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgIH0gc2FtcGxlcl9nZW43OworCisgICAgICBzdHJ1Y3QgYnJ3X3VyYl9pbW1lZGlhdGUgdXJiOworCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBvcGNvZGU6NDsKKwkgdW5zaWduZWQgb2Zmc2V0OjY7CisJIHVuc2lnbmVkIHN3aXp6bGVfY29udHJvbDoyOworCSB1bnNpZ25lZCBwYWQ6MTsKKwkgdW5zaWduZWQgYWxsb2NhdGU6MTsKKwkgdW5zaWduZWQgdXNlZDoxOworCSB1bnNpZ25lZCBjb21wbGV0ZToxOworCSB1bnNpZ25lZCBwYWQwOjM7CisJIHVuc2lnbmVkIGhlYWRlcl9wcmVzZW50OjE7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo1OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIHBhZDE6MjsKKwkgdW5zaWduZWQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSB1cmJfZ2VuNTsKKworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgb3Bjb2RlOjM7CisJIHVuc2lnbmVkIG9mZnNldDoxMTsKKwkgdW5zaWduZWQgc3dpenpsZV9jb250cm9sOjE7CisJIHVuc2lnbmVkIGNvbXBsZXRlOjE7CisJIHVuc2lnbmVkIHBlcl9zbG90X29mZnNldDoxOworCSB1bnNpZ25lZCBwYWQwOjI7CisJIHVuc2lnbmVkIGhlYWRlcl9wcmVzZW50OjE7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo1OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIHBhZDE6MjsKKwkgdW5zaWduZWQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSB1cmJfZ2VuNzsKKworICAgICAgLyoqIDk2NSBQUk0sIFZvbHVtZSA0LCBTZWN0aW9uIDUuMTAuMS4xOiBNZXNzYWdlIERlc2NyaXB0b3IgKi8KKyAgICAgIHN0cnVjdCB7CisJIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXg6ODsKKwkgdW5zaWduZWQgbXNnX2NvbnRyb2w6NDsKKwkgdW5zaWduZWQgbXNnX3R5cGU6MjsKKwkgdW5zaWduZWQgdGFyZ2V0X2NhY2hlOjI7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo0OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIG1zZ190YXJnZXQ6NDsKKwkgdW5zaWduZWQgcGFkMTozOworCSB1bnNpZ25lZCBlbmRfb2ZfdGhyZWFkOjE7CisgICAgICB9IGRwX3JlYWQ7CisKKyAgICAgIC8qKiBHNDUgUFJNLCBWb2x1bWUgNCwgU2VjdGlvbiA1LjEwLjEuMS4yICovCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2luZGV4Ojg7CisJIHVuc2lnbmVkIG1zZ19jb250cm9sOjM7CisJIHVuc2lnbmVkIG1zZ190eXBlOjM7CisJIHVuc2lnbmVkIHRhcmdldF9jYWNoZToyOworCSB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGg6NDsKKwkgdW5zaWduZWQgbXNnX2xlbmd0aDo0OworCSB1bnNpZ25lZCBtc2dfdGFyZ2V0OjQ7CisJIHVuc2lnbmVkIHBhZDE6MzsKKwkgdW5zaWduZWQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSBkcF9yZWFkX2c0eDsKKworICAgICAgLyoqIElyb25sYWtlIFBSTSwgVm9sdW1lIDQgUGFydCAxLCBTZWN0aW9uIDUuMTAuMi4xLjIuICovCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBiaW5kaW5nX3RhYmxlX2luZGV4Ojg7CisJIHVuc2lnbmVkIG1zZ19jb250cm9sOjM7CisJIHVuc2lnbmVkIG1zZ190eXBlOjM7CisJIHVuc2lnbmVkIHRhcmdldF9jYWNoZToyOworCSB1bnNpZ25lZCBwYWQwOjM7CisJIHVuc2lnbmVkIGhlYWRlcl9wcmVzZW50OjE7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo1OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIHBhZDE6MjsKKwkgdW5zaWduZWQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSBkcF9yZWFkX2dlbjU7CisKKyAgICAgIC8qKiBHNDUgUFJNLCBWb2x1bWUgNCwgU2VjdGlvbiA1LjEwLjEuMS4yLiAgRm9yIGJvdGggR2VuNCBhbmQgRzQ1LiAqLworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleDo4OworCSB1bnNpZ25lZCBtc2dfY29udHJvbDozOworCSB1bnNpZ25lZCBsYXN0X3JlbmRlcl90YXJnZXQ6MTsKKwkgdW5zaWduZWQgbXNnX3R5cGU6MzsKKwkgdW5zaWduZWQgc2VuZF9jb21taXRfbXNnOjE7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo0OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIG1zZ190YXJnZXQ6NDsKKwkgdW5zaWduZWQgcGFkMTozOworCSB1bnNpZ25lZCBlbmRfb2ZfdGhyZWFkOjE7CisgICAgICB9IGRwX3dyaXRlOworCisgICAgICAvKiogSXJvbmxha2UgUFJNLCBWb2x1bWUgNCBQYXJ0IDEsIFNlY3Rpb24gNS4xMC4yLjEuMi4gKi8KKyAgICAgIHN0cnVjdCB7CisJIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXg6ODsKKwkgdW5zaWduZWQgbXNnX2NvbnRyb2w6MzsKKwkgdW5zaWduZWQgbGFzdF9yZW5kZXJfdGFyZ2V0OjE7CisJIHVuc2lnbmVkIG1zZ190eXBlOjM7CisJIHVuc2lnbmVkIHNlbmRfY29tbWl0X21zZzoxOworCSB1bnNpZ25lZCBwYWQwOjM7CisJIHVuc2lnbmVkIGhlYWRlcl9wcmVzZW50OjE7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo1OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIHBhZDE6MjsKKwkgdW5zaWduZWQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSBkcF93cml0ZV9nZW41OworCisgICAgICAvKioKKyAgICAgICAqIE1lc3NhZ2UgZm9yIHRoZSBTYW5keWJyaWRnZSBTYW1wbGVyIENhY2hlIG9yIENvbnN0YW50IENhY2hlIERhdGEgUG9ydC4KKyAgICAgICAqCisgICAgICAgKiBTZWUgdGhlIFNhbmR5YnJpZGdlIFBSTSwgVm9sdW1lIDQgUGFydCAxLCBTZWN0aW9uIDMuOS4yLjEuMS4KKyAgICAgICAqKi8KKyAgICAgIHN0cnVjdCB7CisJIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXg6ODsKKwkgdW5zaWduZWQgbXNnX2NvbnRyb2w6NTsKKwkgdW5zaWduZWQgbXNnX3R5cGU6MzsKKwkgdW5zaWduZWQgcGFkMDozOworCSB1bnNpZ25lZCBoZWFkZXJfcHJlc2VudDoxOworCSB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGg6NTsKKwkgdW5zaWduZWQgbXNnX2xlbmd0aDo0OworCSB1bnNpZ25lZCBwYWQxOjI7CisJIHVuc2lnbmVkIGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgIH0gZ2VuNl9kcF9zYW1wbGVyX2NvbnN0X2NhY2hlOworCisgICAgICAvKioKKyAgICAgICAqIE1lc3NhZ2UgZm9yIHRoZSBTYW5keWJyaWRnZSBSZW5kZXIgQ2FjaGUgRGF0YSBQb3J0LgorICAgICAgICoKKyAgICAgICAqIE1vc3QgZmllbGRzIGFyZSBkZWZpbmVkIGluIHRoZSBTYW5keWJyaWRnZSBQUk0sIFZvbHVtZSA0IFBhcnQgMSwKKyAgICAgICAqIFNlY3Rpb24gMy45LjIuMS4xOiBNZXNzYWdlIERlc2NyaXB0b3IuCisgICAgICAgKgorICAgICAgICogIlNsb3QgR3JvdXAgU2VsZWN0IiBhbmQgIkxhc3QgUmVuZGVyIFRhcmdldCIgYXJlIHBhcnQgb2YgdGhlCisgICAgICAgKiA1LWJpdCBtZXNzYWdlIGNvbnRyb2wgZm9yIFJlbmRlciBUYXJnZXQgV3JpdGUgbWVzc2FnZXMuICBTZWUKKyAgICAgICAqIFNlY3Rpb24gMy45LjkuMi4xIG9mIHRoZSBzYW1lIHZvbHVtZS4KKyAgICAgICAqLworICAgICAgc3RydWN0IHsKKwkgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleDo4OworCSB1bnNpZ25lZCBtc2dfY29udHJvbDozOworCSB1bnNpZ25lZCBzbG90X2dyb3VwX3NlbGVjdDoxOworCSB1bnNpZ25lZCBsYXN0X3JlbmRlcl90YXJnZXQ6MTsKKwkgdW5zaWduZWQgbXNnX3R5cGU6NDsKKwkgdW5zaWduZWQgc2VuZF9jb21taXRfbXNnOjE7CisJIHVuc2lnbmVkIHBhZDA6MTsKKwkgdW5zaWduZWQgaGVhZGVyX3ByZXNlbnQ6MTsKKwkgdW5zaWduZWQgcmVzcG9uc2VfbGVuZ3RoOjU7CisJIHVuc2lnbmVkIG1zZ19sZW5ndGg6NDsKKwkgdW5zaWduZWQgcGFkMToyOworCSB1bnNpZ25lZCBlbmRfb2ZfdGhyZWFkOjE7CisgICAgICB9IGdlbjZfZHA7CisKKyAgICAgIC8qKgorICAgICAgICogTWVzc2FnZSBmb3IgYW55IG9mIHRoZSBHZW43IERhdGEgUG9ydCBjYWNoZXMuCisgICAgICAgKgorICAgICAgICogTW9zdCBmaWVsZHMgYXJlIGRlZmluZWQgaW4gdGhlIEl2eWJyaWRnZSBQUk0sIFZvbHVtZSA0IFBhcnQgMSwKKyAgICAgICAqIHNlY3Rpb24gMy45LjIuMS4xICJNZXNzYWdlIERlc2NyaXB0b3IiLiAgT25jZSBhZ2FpbiwgIlNsb3QgR3JvdXAKKyAgICAgICAqIFNlbGVjdCIgYW5kICJMYXN0IFJlbmRlciBUYXJnZXQiIGFyZSBwYXJ0IG9mIHRoZSA2LWJpdCBtZXNzYWdlCisgICAgICAgKiBjb250cm9sIGZvciBSZW5kZXIgVGFyZ2V0IFdyaXRlcyAoc2VjdGlvbiAzLjkuMTEuMikuCisgICAgICAgKi8KKyAgICAgIHN0cnVjdCB7CisJIHVuc2lnbmVkIGJpbmRpbmdfdGFibGVfaW5kZXg6ODsKKwkgdW5zaWduZWQgbXNnX2NvbnRyb2w6MzsKKwkgdW5zaWduZWQgc2xvdF9ncm91cF9zZWxlY3Q6MTsKKwkgdW5zaWduZWQgbGFzdF9yZW5kZXJfdGFyZ2V0OjE7CisJIHVuc2lnbmVkIG1zZ19jb250cm9sX3BhZDoxOworCSB1bnNpZ25lZCBtc2dfdHlwZTo0OworCSB1bnNpZ25lZCBwYWQxOjE7CisJIHVuc2lnbmVkIGhlYWRlcl9wcmVzZW50OjE7CisJIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aDo1OworCSB1bnNpZ25lZCBtc2dfbGVuZ3RoOjQ7CisJIHVuc2lnbmVkIHBhZDI6MjsKKwkgdW5zaWduZWQgZW5kX29mX3RocmVhZDoxOworICAgICAgfSBnZW43X2RwOworCisgICAgICAvKioKKyAgICAgICAqIE1lc3NhZ2UgZm9yIHRoZSBHZW43IFBpeGVsIEludGVycG9sYXRvci4KKyAgICAgICAqCisgICAgICAgKiBEZWZpbmVkIGluIHRoZSBJdnlicmlkZ2UgUFJNLCBWb2x1bWUgNCBQYXJ0IDIsCisgICAgICAgKiBzZWN0aW9uIDQuMS4xLjEuCisgICAgICAgKi8KKyAgICAgIHN0cnVjdCB7CisgICAgICAgICBHTHVpbnQgbXNnX2RhdGE6ODsKKyAgICAgICAgIEdMdWludCBwYWQxOjM7CisgICAgICAgICBHTHVpbnQgc2xvdF9ncm91cDoxOworICAgICAgICAgR0x1aW50IG1zZ190eXBlOjI7CisgICAgICAgICBHTHVpbnQgaW50ZXJwb2xhdGlvbl9tb2RlOjE7CisgICAgICAgICBHTHVpbnQgcGFkMjoxOworICAgICAgICAgR0x1aW50IHNpbWRfbW9kZToxOworICAgICAgICAgR0x1aW50IHBhZDM6MTsKKyAgICAgICAgIEdMdWludCByZXNwb25zZV9sZW5ndGg6NTsKKyAgICAgICAgIEdMdWludCBtc2dfbGVuZ3RoOjQ7CisgICAgICAgICBHTHVpbnQgcGFkNDoyOworICAgICAgICAgR0x1aW50IGVuZF9vZl90aHJlYWQ6MTsKKyAgICAgIH0gZ2VuN19waTsKKyAgICAgIC8qKiBAfSAqLworCisgICAgICBzdHJ1Y3QgeworCSB1bnNpZ25lZCBzcmMxX3N1YnJlZ19ucl9oaWdoOjE7CisJIHVuc2lnbmVkIHNyYzFfcmVnX25yOjg7CisJIHVuc2lnbmVkIHBhZDA6MTsKKwkgdW5zaWduZWQgc3JjMl9yZXBfY3RybDoxOworCSB1bnNpZ25lZCBzcmMyX3N3aXp6bGU6ODsKKwkgdW5zaWduZWQgc3JjMl9zdWJyZWdfbnI6MzsKKwkgdW5zaWduZWQgc3JjMl9yZWdfbnI6ODsKKwkgdW5zaWduZWQgcGFkMToyOworICAgICAgfSBkYTNzcmM7CisKKyAgICAgIGludCBkOworICAgICAgdW5zaWduZWQgdWQ7CisgICAgICBmbG9hdCBmOworICAgfSBiaXRzMzsKK307CisKK3N0cnVjdCBicndfY29tcGFjdF9pbnN0cnVjdGlvbiB7CisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgb3Bjb2RlOjc7ICAgICAgICAgIC8qICAwLSA2ICovCisgICAgICB1bnNpZ25lZCBkZWJ1Z19jb250cm9sOjE7ICAgLyogIDctIDcgKi8KKyAgICAgIHVuc2lnbmVkIGNvbnRyb2xfaW5kZXg6NTsgICAvKiAgOC0xMiAqLworICAgICAgdW5zaWduZWQgZGF0YV90eXBlX2luZGV4OjU7IC8qIDEzLTE3ICovCisgICAgICB1bnNpZ25lZCBzdWJfcmVnX2luZGV4OjU7ICAgLyogMTgtMjIgKi8KKyAgICAgIHVuc2lnbmVkIGFjY193cl9jb250cm9sOjE7ICAvKiAyMy0yMyAqLworICAgICAgdW5zaWduZWQgY29uZGl0aW9uYWxtb2Q6NDsgIC8qIDI0LTI3ICovCisgICAgICB1bnNpZ25lZCBmbGFnX3N1YnJlZ19ucjoxOyAgICAgLyogMjgtMjggKi8KKyAgICAgIHVuc2lnbmVkIGNtcHRfY3RybDoxOyAgICAgICAvKiAyOS0yOSAqLworICAgICAgdW5zaWduZWQgc3JjMF9pbmRleDoyOyAgICAgIC8qIDMwLTMxICovCisgICB9IGR3MDsKKworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIHNyYzBfaW5kZXg6MzsgIC8qIDMyLTI0ICovCisgICAgICB1bnNpZ25lZCBzcmMxX2luZGV4OjU7ICAvKiAzNS0zOSAqLworICAgICAgdW5zaWduZWQgZHN0X3JlZ19ucjo4OyAgLyogNDAtNDcgKi8KKyAgICAgIHVuc2lnbmVkIHNyYzBfcmVnX25yOjg7IC8qIDQ4LTU1ICovCisgICAgICB1bnNpZ25lZCBzcmMxX3JlZ19ucjo4OyAvKiA1Ni02MyAqLworICAgfSBkdzE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNC5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDc4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzQuY3BwCkBAIC0wLDAgKzEsMTkwMiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDExIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJicndfdmVjNC5oIgorI2luY2x1ZGUgImJyd19jZmcuaCIKKyNpbmNsdWRlICJicndfdnMuaCIKKyNpbmNsdWRlICJicndfZGVhZF9jb250cm9sX2Zsb3cuaCIKKyNpbmNsdWRlICJnbHNsL2dsc2xfcGFyc2VyX2V4dHJhcy5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgIm1haW4vc2hhZGVyb2JqLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3ByaW50LmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3BhcmFtZXRlci5oIgorfQorCisjZGVmaW5lIE1BWF9JTlNUUlVDVElPTiAoMSA8PCAzMCkKKwordXNpbmcgbmFtZXNwYWNlIGJydzsKKworbmFtZXNwYWNlIGJydyB7CisKKy8qKgorICogQ29tbW9uIGhlbHBlciBmb3IgY29uc3RydWN0aW5nIHN3aXp6bGVzLiAgV2hlbiBvbmx5IGEgc3Vic2V0IG9mCisgKiBjaGFubmVscyBvZiBhIHZlYzQgYXJlIHVzZWQsIHdlIGRvbid0IHdhbnQgdG8gcmVmZXJlbmNlIHRoZSBvdGhlcgorICogY2hhbm5lbHMsIGFzIHRoYXQgd2lsbCB0ZWxsIG9wdGltaXphdGlvbiBwYXNzZXMgdGhhdCB0aG9zZSBvdGhlcgorICogY2hhbm5lbHMgYXJlIHVzZWQuCisgKi8KK3Vuc2lnbmVkCitzd2l6emxlX2Zvcl9zaXplKGludCBzaXplKQoreworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNpemVfc3dpenpsZXNbNF0gPSB7CisgICAgICBCUldfU1dJWlpMRTQoU1dJWlpMRV9YLCBTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YKSwKKyAgICAgIEJSV19TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWSwgU1dJWlpMRV9ZLCBTV0laWkxFX1kpLAorICAgICAgQlJXX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCBTV0laWkxFX1osIFNXSVpaTEVfWiksCisgICAgICBCUldfU1dJWlpMRTQoU1dJWlpMRV9YLCBTV0laWkxFX1ksIFNXSVpaTEVfWiwgU1dJWlpMRV9XKSwKKyAgIH07CisKKyAgIGFzc2VydCgoc2l6ZSA+PSAxKSAmJiAoc2l6ZSA8PSA0KSk7CisgICByZXR1cm4gc2l6ZV9zd2l6emxlc1tzaXplIC0gMV07Cit9CisKK3ZvaWQKK3NyY19yZWc6OmluaXQoKQoreworICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworCisgICB0aGlzLT5maWxlID0gQkFEX0ZJTEU7Cit9CisKK3NyY19yZWc6OnNyY19yZWcocmVnaXN0ZXJfZmlsZSBmaWxlLCBpbnQgcmVnLCBjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpbml0KCk7CisKKyAgIHRoaXMtPmZpbGUgPSBmaWxlOworICAgdGhpcy0+cmVnID0gcmVnOworICAgaWYgKHR5cGUgJiYgKHR5cGUtPmlzX3NjYWxhcigpIHx8IHR5cGUtPmlzX3ZlY3RvcigpIHx8IHR5cGUtPmlzX21hdHJpeCgpKSkKKyAgICAgIHRoaXMtPnN3aXp6bGUgPSBzd2l6emxlX2Zvcl9zaXplKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICBlbHNlCisgICAgICB0aGlzLT5zd2l6emxlID0gQlJXX1NXSVpaTEVfWFlaVzsKK30KKworLyoqIEdlbmVyaWMgdW5zZXQgcmVnaXN0ZXIgY29uc3RydWN0b3IuICovCitzcmNfcmVnOjpzcmNfcmVnKCkKK3sKKyAgIGluaXQoKTsKK30KKworc3JjX3JlZzo6c3JjX3JlZyhmbG9hdCBmKQoreworICAgaW5pdCgpOworCisgICB0aGlzLT5maWxlID0gSU1NOworICAgdGhpcy0+dHlwZSA9IEJSV19SRUdJU1RFUl9UWVBFX0Y7CisgICB0aGlzLT5pbW0uZiA9IGY7Cit9CisKK3NyY19yZWc6OnNyY19yZWcodWludDMyX3QgdSkKK3sKKyAgIGluaXQoKTsKKworICAgdGhpcy0+ZmlsZSA9IElNTTsKKyAgIHRoaXMtPnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9VRDsKKyAgIHRoaXMtPmltbS51ID0gdTsKK30KKworc3JjX3JlZzo6c3JjX3JlZyhpbnQzMl90IGkpCit7CisgICBpbml0KCk7CisKKyAgIHRoaXMtPmZpbGUgPSBJTU07CisgICB0aGlzLT50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfRDsKKyAgIHRoaXMtPmltbS5pID0gaTsKK30KKworc3JjX3JlZzo6c3JjX3JlZyhzdHJ1Y3QgYnJ3X3JlZyByZWcpCit7CisgICBpbml0KCk7CisKKyAgIHRoaXMtPmZpbGUgPSBIV19SRUc7CisgICB0aGlzLT5maXhlZF9od19yZWcgPSByZWc7CisgICB0aGlzLT50eXBlID0gcmVnLnR5cGU7Cit9CisKK3NyY19yZWc6OnNyY19yZWcoZHN0X3JlZyByZWcpCit7CisgICBpbml0KCk7CisKKyAgIHRoaXMtPmZpbGUgPSByZWcuZmlsZTsKKyAgIHRoaXMtPnJlZyA9IHJlZy5yZWc7CisgICB0aGlzLT5yZWdfb2Zmc2V0ID0gcmVnLnJlZ19vZmZzZXQ7CisgICB0aGlzLT50eXBlID0gcmVnLnR5cGU7CisgICB0aGlzLT5yZWxhZGRyID0gcmVnLnJlbGFkZHI7CisgICB0aGlzLT5maXhlZF9od19yZWcgPSByZWcuZml4ZWRfaHdfcmVnOworCisgICBpbnQgc3dpenpsZXNbNF07CisgICBpbnQgbmV4dF9jaGFuID0gMDsKKyAgIGludCBsYXN0ID0gMDsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIGlmICghKHJlZy53cml0ZW1hc2sgJiAoMSA8PCBpKSkpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgc3dpenpsZXNbbmV4dF9jaGFuKytdID0gbGFzdCA9IGk7CisgICB9CisKKyAgIGZvciAoOyBuZXh0X2NoYW4gPCA0OyBuZXh0X2NoYW4rKykgeworICAgICAgc3dpenpsZXNbbmV4dF9jaGFuXSA9IGxhc3Q7CisgICB9CisKKyAgIHRoaXMtPnN3aXp6bGUgPSBCUldfU1dJWlpMRTQoc3dpenpsZXNbMF0sIHN3aXp6bGVzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlc1syXSwgc3dpenpsZXNbM10pOworfQorCitib29sCitzcmNfcmVnOjppc19hY2N1bXVsYXRvcigpIGNvbnN0Cit7CisgICByZXR1cm4gZmlsZSA9PSBIV19SRUcgJiYKKyAgICAgICAgICBmaXhlZF9od19yZWcuZmlsZSA9PSBCUldfQVJDSElURUNUVVJFX1JFR0lTVEVSX0ZJTEUgJiYKKyAgICAgICAgICBmaXhlZF9od19yZWcubnIgPT0gQlJXX0FSRl9BQ0NVTVVMQVRPUjsKK30KKworCit2b2lkCitkc3RfcmVnOjppbml0KCkKK3sKKyAgIG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKKyAgIHRoaXMtPmZpbGUgPSBCQURfRklMRTsKKyAgIHRoaXMtPndyaXRlbWFzayA9IFdSSVRFTUFTS19YWVpXOworfQorCitkc3RfcmVnOjpkc3RfcmVnKCkKK3sKKyAgIGluaXQoKTsKK30KKworZHN0X3JlZzo6ZHN0X3JlZyhyZWdpc3Rlcl9maWxlIGZpbGUsIGludCByZWcpCit7CisgICBpbml0KCk7CisKKyAgIHRoaXMtPmZpbGUgPSBmaWxlOworICAgdGhpcy0+cmVnID0gcmVnOworfQorCitkc3RfcmVnOjpkc3RfcmVnKHJlZ2lzdGVyX2ZpbGUgZmlsZSwgaW50IHJlZywgY29uc3QgZ2xzbF90eXBlICp0eXBlLAorICAgICAgICAgICAgICAgICBpbnQgd3JpdGVtYXNrKQoreworICAgaW5pdCgpOworCisgICB0aGlzLT5maWxlID0gZmlsZTsKKyAgIHRoaXMtPnJlZyA9IHJlZzsKKyAgIHRoaXMtPnR5cGUgPSBicndfdHlwZV9mb3JfYmFzZV90eXBlKHR5cGUpOworICAgdGhpcy0+d3JpdGVtYXNrID0gd3JpdGVtYXNrOworfQorCitkc3RfcmVnOjpkc3RfcmVnKHN0cnVjdCBicndfcmVnIHJlZykKK3sKKyAgIGluaXQoKTsKKworICAgdGhpcy0+ZmlsZSA9IEhXX1JFRzsKKyAgIHRoaXMtPmZpeGVkX2h3X3JlZyA9IHJlZzsKKyAgIHRoaXMtPnR5cGUgPSByZWcudHlwZTsKK30KKworZHN0X3JlZzo6ZHN0X3JlZyhzcmNfcmVnIHJlZykKK3sKKyAgIGluaXQoKTsKKworICAgdGhpcy0+ZmlsZSA9IHJlZy5maWxlOworICAgdGhpcy0+cmVnID0gcmVnLnJlZzsKKyAgIHRoaXMtPnJlZ19vZmZzZXQgPSByZWcucmVnX29mZnNldDsKKyAgIHRoaXMtPnR5cGUgPSByZWcudHlwZTsKKyAgIC8qIEhvdyBzaG91bGQgd2UgZG8gd3JpdGVtYXNraW5nIHdoZW4gY29udmVydGluZyBmcm9tIGEgc3JjX3JlZz8gIEl0IHNlZW1zCisgICAgKiBwcmV0dHkgb2J2aW91cyB0aGF0IGZvciBzcmMueHh4eCB0aGUgY2FsbGVyIHdhbnRzIHRvIHdyaXRlIHRvIHNyYy54LCBidXQKKyAgICAqIHdoYXQgYWJvdXQgZm9yIHNyYy53eD8gIEp1c3Qgc3BlY2lhbC1jYXNlIHNyYy54eHh4IGZvciBub3cuCisgICAgKi8KKyAgIGlmIChyZWcuc3dpenpsZSA9PSBCUldfU1dJWlpMRV9YWFhYKQorICAgICAgdGhpcy0+d3JpdGVtYXNrID0gV1JJVEVNQVNLX1g7CisgICBlbHNlCisgICAgICB0aGlzLT53cml0ZW1hc2sgPSBXUklURU1BU0tfWFlaVzsKKyAgIHRoaXMtPnJlbGFkZHIgPSByZWcucmVsYWRkcjsKKyAgIHRoaXMtPmZpeGVkX2h3X3JlZyA9IHJlZy5maXhlZF9od19yZWc7Cit9CisKK2Jvb2wKK2RzdF9yZWc6OmlzX251bGwoKSBjb25zdAoreworICAgcmV0dXJuIGZpbGUgPT0gSFdfUkVHICYmCisgICAgICAgICAgZml4ZWRfaHdfcmVnLmZpbGUgPT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFICYmCisgICAgICAgICAgZml4ZWRfaHdfcmVnLm5yID09IEJSV19BUkZfTlVMTDsKK30KKworYm9vbAorZHN0X3JlZzo6aXNfYWNjdW11bGF0b3IoKSBjb25zdAoreworICAgcmV0dXJuIGZpbGUgPT0gSFdfUkVHICYmCisgICAgICAgICAgZml4ZWRfaHdfcmVnLmZpbGUgPT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFICYmCisgICAgICAgICAgZml4ZWRfaHdfcmVnLm5yID09IEJSV19BUkZfQUNDVU1VTEFUT1I7Cit9CisKK2Jvb2wKK3ZlYzRfaW5zdHJ1Y3Rpb246OmlzX3NlbmRfZnJvbV9ncmYoKQoreworICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgIC8vIEx1bmFyRyA6IFRPRE8gLSBzaGFkZXIgdGltZT8/CisgICAvL2Nhc2UgU0hBREVSX09QQ09ERV9TSEFERVJfVElNRV9BREQ6CisgICBjYXNlIFZTX09QQ09ERV9QVUxMX0NPTlNUQU5UX0xPQURfR0VONzoKKyAgICAgIHJldHVybiB0cnVlOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KKworYm9vbAordmVjNF92aXNpdG9yOjpjYW5fZG9fc291cmNlX21vZHModmVjNF9pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgIGlmIChicnctPmdlbiA9PSA2ICYmIGluc3QtPmlzX21hdGgoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKGluc3QtPmlzX3NlbmRfZnJvbV9ncmYoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKCFpbnN0LT5jYW5fZG9fc291cmNlX21vZHMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUmV0dXJucyBob3cgbWFueSBNUkZzIGFuIG9wY29kZSB3aWxsIHdyaXRlIG92ZXIuCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSAwIG9yIDEgaW1wbGllZCB3cml0ZXMgaW4gYW4gYWN0dWFsIGdlbgorICogaW5zdHJ1Y3Rpb24gLS0gdGhlIGdlbmVyYXRlXyogZnVuY3Rpb25zIGdlbmVyYXRlIGFkZGl0aW9uYWwgTU9WcworICogZm9yIHNldHVwLgorICovCitpbnQKK3ZlYzRfdmlzaXRvcjo6aW1wbGllZF9tcmZfd3JpdGVzKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICBpZiAoaW5zdC0+bWxlbiA9PSAwKQorICAgICAgcmV0dXJuIDA7CisKKyAgIHN3aXRjaCAoaW5zdC0+b3Bjb2RlKSB7CisgICBjYXNlIFNIQURFUl9PUENPREVfUkNQOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1JTUToKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TUVJUOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0VYUDI6CisgICBjYXNlIFNIQURFUl9PUENPREVfTE9HMjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TSU46CisgICBjYXNlIFNIQURFUl9PUENPREVfQ09TOgorICAgICAgcmV0dXJuIDE7CisgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1FVT1RJRU5UOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVI6CisgICBjYXNlIFNIQURFUl9PUENPREVfUE9XOgorICAgICAgcmV0dXJuIDI7CisgICBjYXNlIFZTX09QQ09ERV9VUkJfV1JJVEU6CisgICAgICByZXR1cm4gMTsKKyAgIGNhc2UgVlNfT1BDT0RFX1BVTExfQ09OU1RBTlRfTE9BRDoKKyAgICAgIHJldHVybiAyOworICAgY2FzZSBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9SRUFEOgorICAgICAgcmV0dXJuIDI7CisgICBjYXNlIFNIQURFUl9PUENPREVfR0VONF9TQ1JBVENIX1dSSVRFOgorICAgICAgcmV0dXJuIDM7CisgICBjYXNlIEdTX09QQ09ERV9VUkJfV1JJVEU6CisgICBjYXNlIEdTX09QQ09ERV9USFJFQURfRU5EOgorICAgICAgcmV0dXJuIDA7CisgICAvLyBMdW5hckcgOiBUT0RPIC0gc2hhZGVyIHRpbWU/PworLy8gICBjYXNlIFNIQURFUl9PUENPREVfU0hBREVSX1RJTUVfQUREOgorLy8gICAgICByZXR1cm4gMDsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9URVg6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhMOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEY6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhGX0NNUzoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfTUNTOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYUzoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9URzQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfVEc0X09GRlNFVDoKKyAgICAgIHJldHVybiBpbnN0LT5oZWFkZXJfcHJlc2VudCA/IDEgOiAwOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1VOVFlQRURfQVRPTUlDOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1VOVFlQRURfU1VSRkFDRV9SRUFEOgorICAgICAgcmV0dXJuIDA7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgICAgIHJldHVybiBpbnN0LT5tbGVuOworICAgfQorfQorCitib29sCitzcmNfcmVnOjplcXVhbHMoc3JjX3JlZyAqcikKK3sKKyAgIHJldHVybiAoZmlsZSA9PSByLT5maWxlICYmCisJICAgcmVnID09IHItPnJlZyAmJgorCSAgIHJlZ19vZmZzZXQgPT0gci0+cmVnX29mZnNldCAmJgorCSAgIHR5cGUgPT0gci0+dHlwZSAmJgorCSAgIG5lZ2F0ZSA9PSByLT5uZWdhdGUgJiYKKwkgICBhYnMgPT0gci0+YWJzICYmCisJICAgc3dpenpsZSA9PSByLT5zd2l6emxlICYmCisJICAgIXJlbGFkZHIgJiYgIXItPnJlbGFkZHIgJiYKKwkgICBtZW1jbXAoJmZpeGVkX2h3X3JlZywgJnItPmZpeGVkX2h3X3JlZywKKwkJICBzaXplb2YoZml4ZWRfaHdfcmVnKSkgPT0gMCAmJgorCSAgIGltbS51ID09IHItPmltbS51KTsKK30KKworc3RhdGljIGJvb2wKK3RyeV9lbGltaW5hdGVfaW5zdHJ1Y3Rpb24odmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwgaW50IG5ld193cml0ZW1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfY29udGV4dCAqYnJ3KQoreworICAgaWYgKGluc3QtPmhhc19zaWRlX2VmZmVjdHMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKG5ld193cml0ZW1hc2sgPT0gMCkgeworICAgICAgLyogRG9uJ3QgZGVhZCBjb2RlIGVsaW1pbmF0ZSBpbnN0cnVjdGlvbnMgdGhhdCB3cml0ZSB0byB0aGUKKyAgICAgICAqIGFjY3VtdWxhdG9yIGFzIGEgc2lkZS1lZmZlY3QuIEluc3RlYWQganVzdCBzZXQgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgKiB0byB0aGUgbnVsbCByZWdpc3RlciB0byBmcmVlIGl0LgorICAgICAgICovCisgICAgICBpZiAoaW5zdC0+d3JpdGVzX2FjY3VtdWxhdG9yIHx8IGluc3QtPndyaXRlc19mbGFnKCkpIHsKKyAgICAgICAgIGluc3QtPmRzdCA9IGRzdF9yZWcocmV0eXBlKGJyd19udWxsX3JlZygpLCBpbnN0LT5kc3QudHlwZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGluc3QtPnJlbW92ZSgpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0gZWxzZSBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAhPSBuZXdfd3JpdGVtYXNrKSB7CisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRl9DTVM6CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfR0VONF9TQ1JBVENIX1JFQUQ6CisgICAgICBjYXNlIFZTX09QQ09ERV9QVUxMX0NPTlNUQU5UX0xPQUQ6CisgICAgICBjYXNlIFZTX09QQ09ERV9QVUxMX0NPTlNUQU5UX0xPQURfR0VONzoKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIC8qIERvIG5vdCBzZXQgYSB3cml0ZW1hc2sgb24gR2VuNiBmb3IgbWF0aCBpbnN0cnVjdGlvbnMsIHRob3NlIGFyZQorICAgICAgICAgICogZXhlY3V0ZWQgdXNpbmcgYWxpZ24xIG1vZGUgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGEgZGVzdGluYXRpb24gbWFzay4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKCEoYnJ3LT5nZW4gPT0gNiAmJiBpbnN0LT5pc19tYXRoKCkpICYmICFpbnN0LT5pc190ZXgoKSkgeworICAgICAgICAgICAgaW5zdC0+ZHN0LndyaXRlbWFzayA9IG5ld193cml0ZW1hc2s7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNhbGN1bGF0ZV9saXZlX2ludGVydmFscygpIHRvIHJlbW92ZSB1bnVzZWQKKyAqIHdyaXRlcyB0byByZWdpc3RlcnMgLS0gcmVnaXN0ZXIgYWxsb2NhdGlvbiB3aWxsIGZhaWwgb3RoZXJ3aXNlCisgKiBiZWNhdXNlIHNvbWV0aGluZyBkZWZmZWQgYnV0IG5vdCB1c2VkIHdvbid0IGJlIGNvbnNpZGVyZWQgdG8KKyAqIGludGVyZmVyZSB3aXRoIG90aGVyIHJlZ3MuCisgKi8KK2Jvb2wKK3ZlYzRfdmlzaXRvcjo6ZGVhZF9jb2RlX2VsaW1pbmF0ZSgpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisgICBpbnQgcGMgPSAtMTsKKworICAgY2FsY3VsYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisKKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIHBjKys7CisKKyAgICAgIGJvb2wgaW5zdF93cml0ZXNfZmxhZyA9IGZhbHNlOworICAgICAgaWYgKGluc3QtPmRzdC5maWxlICE9IEdSRikgeworICAgICAgICAgaWYgKGluc3QtPmRzdC5pc19udWxsKCkgJiYgaW5zdC0+d3JpdGVzX2ZsYWcoKSkgeworICAgICAgICAgICAgaW5zdF93cml0ZXNfZmxhZyA9IHRydWU7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgIGludCB3cml0ZV9tYXNrID0gaW5zdC0+ZHN0LndyaXRlbWFzazsKKworICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspIHsKKyAgICAgICAgICAgIGlmICh3cml0ZV9tYXNrICYgKDEgPDwgYykpIHsKKyAgICAgICAgICAgICAgIGFzc2VydCh0aGlzLT52aXJ0dWFsX2dyZl9lbmRbaW5zdC0+ZHN0LnJlZyAqIDQgKyBjXSA+PSBwYyk7CisgICAgICAgICAgICAgICBpZiAodGhpcy0+dmlydHVhbF9ncmZfZW5kW2luc3QtPmRzdC5yZWcgKiA0ICsgY10gPT0gcGMpIHsKKyAgICAgICAgICAgICAgICAgIHdyaXRlX21hc2sgJj0gfigxIDw8IGMpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBwcm9ncmVzcyA9IHRyeV9lbGltaW5hdGVfaW5zdHJ1Y3Rpb24oaW5zdCwgd3JpdGVfbWFzaywgYnJ3KSB8fAorICAgICAgICAgICAgICAgICAgICBwcm9ncmVzczsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPnByZWRpY2F0ZSB8fCBpbnN0LT5wcmV2ID09IE5VTEwpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgaW50IGRlYWRfY2hhbm5lbHM7CisgICAgICBpZiAoaW5zdF93cml0ZXNfZmxhZykgeworLyogQXJiaXRyYXJpbHkgY2hvc2VuLCBvdGhlciB0aGFuIG5vdCBiZWluZyBhbiB4eXp3IHdyaXRlbWFzay4gKi8KKyNkZWZpbmUgRkxBR19XUklURU1BU0sgKDEgPDwgNSkKKyAgICAgICAgIGRlYWRfY2hhbm5lbHMgPSBpbnN0LT5yZWFkc19mbGFnKCkgPyAwIDogRkxBR19XUklURU1BU0s7CisgICAgICB9IGVsc2UgeworICAgICAgICAgZGVhZF9jaGFubmVscyA9IGluc3QtPmRzdC53cml0ZW1hc2s7CisKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gR1JGIHx8CisgICAgICAgICAgICAgICAgaW5zdC0+c3JjW2ldLnJlZyAhPSBpbnN0LT5kc3QucmVnKQorICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICAgICBpbnQgc3dpeiA9IEJSV19HRVRfU1daKGluc3QtPnNyY1tpXS5zd2l6emxlLCBqKTsKKyAgICAgICAgICAgICAgIGRlYWRfY2hhbm5lbHMgJj0gfigxIDw8IHN3aXopOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGV4ZWNfbm9kZSAqbm9kZSA9IGluc3QtPnByZXYsICpwcmV2ID0gbm9kZS0+cHJldjsKKyAgICAgICAgICAgcHJldiAhPSBOVUxMICYmIGRlYWRfY2hhbm5lbHMgIT0gMDsKKyAgICAgICAgICAgbm9kZSA9IHByZXYsIHByZXYgPSBwcmV2LT5wcmV2KSB7CisgICAgICAgICB2ZWM0X2luc3RydWN0aW9uICpzY2FuX2luc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAgKilub2RlOworCisgICAgICAgICBpZiAoc2Nhbl9pbnN0LT5pc19jb250cm9sX2Zsb3coKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBpZiAoaW5zdF93cml0ZXNfZmxhZykgeworICAgICAgICAgICAgaWYgKHNjYW5faW5zdC0+ZHN0LmlzX251bGwoKSAmJiBzY2FuX2luc3QtPndyaXRlc19mbGFnKCkpIHsKKyAgICAgICAgICAgICAgIHNjYW5faW5zdC0+cmVtb3ZlKCk7CisgICAgICAgICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Nhbl9pbnN0LT5yZWFkc19mbGFnKCkpIHsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gc2Nhbl9pbnN0LT5kc3QuZmlsZSAmJgorICAgICAgICAgICAgIGluc3QtPmRzdC5yZWcgPT0gc2Nhbl9pbnN0LT5kc3QucmVnICYmCisgICAgICAgICAgICAgaW5zdC0+ZHN0LnJlZ19vZmZzZXQgPT0gc2Nhbl9pbnN0LT5kc3QucmVnX29mZnNldCkgeworICAgICAgICAgICAgaW50IG5ld193cml0ZW1hc2sgPSBzY2FuX2luc3QtPmRzdC53cml0ZW1hc2sgJiB+ZGVhZF9jaGFubmVsczsKKworICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnlfZWxpbWluYXRlX2luc3RydWN0aW9uKHNjYW5faW5zdCwgbmV3X3dyaXRlbWFzaywgYnJ3KSB8fAorICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzczsKKyAgICAgICAgIH0KKworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzY2FuX2luc3QtPnNyY1tpXS5maWxlICE9IGluc3QtPmRzdC5maWxlIHx8CisgICAgICAgICAgICAgICAgc2Nhbl9pbnN0LT5zcmNbaV0ucmVnICE9IGluc3QtPmRzdC5yZWcpCisgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgICAgIGludCBzd2l6ID0gQlJXX0dFVF9TV1ooc2Nhbl9pbnN0LT5zcmNbaV0uc3dpenpsZSwgaik7CisgICAgICAgICAgICAgICBkZWFkX2NoYW5uZWxzICY9IH4oMSA8PCBzd2l6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHByb2dyZXNzKQorICAgICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6c3BsaXRfdW5pZm9ybV9yZWdpc3RlcnMoKQoreworICAgLyogUHJpb3IgdG8gdGhpcywgdW5pZm9ybXMgaGF2ZSBiZWVuIGluIGFuIGFycmF5IHNpemVkIGFjY29yZGluZyB0bworICAgICogdGhlIG51bWJlciBvZiB2ZWN0b3IgdW5pZm9ybXMgcHJlc2VudCwgc3BhcnNlbHkgZmlsbGVkIChzbyBhbgorICAgICogYWdncmVnYXRlIHJlc3VsdHMgaW4gcmVnIGluZGljZXMgYmVpbmcgc2tpcHBlZCBvdmVyKS4gIE5vdyB3ZSdyZQorICAgICogZ29pbmcgdG8gY3V0IHRob3NlIGFnZ3JlZ2F0ZXMgdXAgc28gZWFjaCAucmVnIGluZGV4IGlzIG9uZQorICAgICogdmVjdG9yLiAgVGhlIGdvYWwgaXMgdG8gbWFrZSBlbGltaW5hdGlvbiBvZiB1bnVzZWQgdW5pZm9ybQorICAgICogY29tcG9uZW50cyBlYXNpZXIgbGF0ZXIuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKilub2RlOworCisgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCAzOyBpKyspIHsKKwkgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IFVOSUZPUk0pCisJICAgIGNvbnRpbnVlOworCisJIGFzc2VydCghaW5zdC0+c3JjW2ldLnJlbGFkZHIpOworCisJIGluc3QtPnNyY1tpXS5yZWcgKz0gaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQ7CisJIGluc3QtPnNyY1tpXS5yZWdfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgIH0KKworICAgLyogVXBkYXRlIHRoYXQgZXZlcnl0aGluZyBpcyBub3cgdmVjdG9yLXNpemVkLiAqLworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmlmb3JtczsgaSsrKSB7CisgICAgICB0aGlzLT51bmlmb3JtX3NpemVbaV0gPSAxOworICAgfQorfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnBhY2tfdW5pZm9ybV9yZWdpc3RlcnMoKQoreworICAgYm9vbCB1bmlmb3JtX3VzZWRbdGhpcy0+dW5pZm9ybXNdOworICAgaW50IG5ld19sb2NbdGhpcy0+dW5pZm9ybXNdOworICAgaW50IG5ld19jaGFuW3RoaXMtPnVuaWZvcm1zXTsKKworICAgbWVtc2V0KHVuaWZvcm1fdXNlZCwgMCwgc2l6ZW9mKHVuaWZvcm1fdXNlZCkpOworICAgbWVtc2V0KG5ld19sb2MsIDAsIHNpemVvZihuZXdfbG9jKSk7CisgICBtZW1zZXQobmV3X2NoYW4sIDAsIHNpemVvZihuZXdfY2hhbikpOworCisgICAvKiBGaW5kIHdoaWNoIHVuaWZvcm0gdmVjdG9ycyBhcmUgYWN0dWFsbHkgdXNlZCBieSB0aGUgcHJvZ3JhbS4gIFdlCisgICAgKiBleHBlY3QgdW51c2VkIHZlY3RvciBlbGVtZW50cyB3aGVuIHdlJ3ZlIG1vdmVkIGFycmF5IGFjY2VzcyBvdXQKKyAgICAqIHRvIHB1bGwgY29uc3RhbnRzLCBhbmQgZnJvbSBzb21lIEdMU0wgY29kZSBnZW5lcmF0b3JzIGxpa2Ugd2luZS4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDM7IGkrKykgeworCSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gVU5JRk9STSkKKwkgICAgY29udGludWU7CisKKwkgdW5pZm9ybV91c2VkW2luc3QtPnNyY1tpXS5yZWddID0gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKworICAgaW50IG5ld191bmlmb3JtX2NvdW50ID0gMDsKKworICAgLyogTm93LCBmaWd1cmUgb3V0IGEgcGFja2luZyBvZiB0aGUgbGl2ZSB1bmlmb3JtIHZlY3RvcnMgaW50byBvdXIKKyAgICAqIHB1c2ggY29uc3RhbnRzLgorICAgICovCisgICBmb3IgKGludCBzcmMgPSAwOyBzcmMgPCB1bmlmb3Jtczsgc3JjKyspIHsKKyAgICAgIGFzc2VydChzcmMgPCB1bmlmb3JtX2FycmF5X3NpemUpOworICAgICAgaW50IHNpemUgPSB0aGlzLT51bmlmb3JtX3ZlY3Rvcl9zaXplW3NyY107CisKKyAgICAgIGlmICghdW5pZm9ybV91c2VkW3NyY10pIHsKKwkgdGhpcy0+dW5pZm9ybV92ZWN0b3Jfc2l6ZVtzcmNdID0gMDsKKwkgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGludCBkc3Q7CisgICAgICAvKiBGaW5kIHRoZSBsb3dlc3QgcGxhY2Ugd2UgY2FuIHNsb3QgdGhpcyB1bmlmb3JtIGluLiAqLworICAgICAgZm9yIChkc3QgPSAwOyBkc3QgPCBzcmM7IGRzdCsrKSB7CisJIGlmICh0aGlzLT51bmlmb3JtX3ZlY3Rvcl9zaXplW2RzdF0gKyBzaXplIDw9IDQpCisJICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoc3JjID09IGRzdCkgeworCSBuZXdfbG9jW3NyY10gPSBkc3Q7CisJIG5ld19jaGFuW3NyY10gPSAwOworICAgICAgfSBlbHNlIHsKKwkgbmV3X2xvY1tzcmNdID0gZHN0OworCSBuZXdfY2hhbltzcmNdID0gdGhpcy0+dW5pZm9ybV92ZWN0b3Jfc2l6ZVtkc3RdOworCisJIC8qIE1vdmUgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGRhdGEgKi8KKwkgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKwkgICAgc3RhZ2VfcHJvZ19kYXRhLT5wYXJhbVtkc3QgKiA0ICsgbmV3X2NoYW5bc3JjXSArIGpdID0KKwkgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5wYXJhbVtzcmMgKiA0ICsgal07CisJIH0KKworCSB0aGlzLT51bmlmb3JtX3ZlY3Rvcl9zaXplW2RzdF0gKz0gc2l6ZTsKKwkgdGhpcy0+dW5pZm9ybV92ZWN0b3Jfc2l6ZVtzcmNdID0gMDsKKyAgICAgIH0KKworICAgICAgbmV3X3VuaWZvcm1fY291bnQgPSBNQVgyKG5ld191bmlmb3JtX2NvdW50LCBkc3QgKyAxKTsKKyAgIH0KKworICAgdGhpcy0+dW5pZm9ybXMgPSBuZXdfdW5pZm9ybV9jb3VudDsKKworICAgLyogTm93LCB1cGRhdGUgdGhlIGluc3RydWN0aW9ucyBmb3Igb3VyIHJlcGFja2VkIHVuaWZvcm1zLiAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDM7IGkrKykgeworCSBpbnQgc3JjID0gaW5zdC0+c3JjW2ldLnJlZzsKKworCSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gVU5JRk9STSkKKwkgICAgY29udGludWU7CisKKwkgaW5zdC0+c3JjW2ldLnJlZyA9IG5ld19sb2Nbc3JjXTsKKworCSBpbnQgc3ggPSBCUldfR0VUX1NXWihpbnN0LT5zcmNbaV0uc3dpenpsZSwgMCkgKyBuZXdfY2hhbltzcmNdOworCSBpbnQgc3kgPSBCUldfR0VUX1NXWihpbnN0LT5zcmNbaV0uc3dpenpsZSwgMSkgKyBuZXdfY2hhbltzcmNdOworCSBpbnQgc3ogPSBCUldfR0VUX1NXWihpbnN0LT5zcmNbaV0uc3dpenpsZSwgMikgKyBuZXdfY2hhbltzcmNdOworCSBpbnQgc3cgPSBCUldfR0VUX1NXWihpbnN0LT5zcmNbaV0uc3dpenpsZSwgMykgKyBuZXdfY2hhbltzcmNdOworCSBpbnN0LT5zcmNbaV0uc3dpenpsZSA9IEJSV19TV0laWkxFNChzeCwgc3ksIHN6LCBzdyk7CisgICAgICB9CisgICB9Cit9CisKK2Jvb2wKK3NyY19yZWc6OmlzX3plcm8oKSBjb25zdAoreworICAgaWYgKGZpbGUgIT0gSU1NKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAodHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GKSB7CisgICAgICByZXR1cm4gaW1tLmYgPT0gMC4wOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBpbW0uaSA9PSAwOworICAgfQorfQorCitib29sCitzcmNfcmVnOjppc19vbmUoKSBjb25zdAoreworICAgaWYgKGZpbGUgIT0gSU1NKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAodHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GKSB7CisgICAgICByZXR1cm4gaW1tLmYgPT0gMS4wOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBpbW0uaSA9PSAxOworICAgfQorfQorCisvKioKKyAqIERvZXMgYWxnZWJyYWljIG9wdGltaXphdGlvbnMgKDAgKiBhID0gMCwgMSAqIGEgPSBhLCBhICsgMCA9IGEpLgorICoKKyAqIFdoaWxlIEdMU0wgSVIgYWxzbyBwZXJmb3JtcyB0aGlzIG9wdGltaXphdGlvbiwgd2UgZW5kIHVwIHdpdGggaXQgaW4KKyAqIG91ciBpbnN0cnVjdGlvbiBzdHJlYW0gZm9yIGEgY291cGxlIG9mIHJlYXNvbnMuICBPbmUgaXMgdGhhdCB3ZQorICogc29tZXRpbWVzIGdlbmVyYXRlIHNpbGx5IGluc3RydWN0aW9ucywgZm9yIGV4YW1wbGUgaW4gYXJyYXkgYWNjZXNzCisgKiB3aGVyZSB3ZSdsbCBnZW5lcmF0ZSAiQUREIG9mZnNldCwgaW5kZXgsIGJhc2UiIGV2ZW4gaWYgYmFzZSBpcyAwLgorICogVGhlIG90aGVyIGlzIHRoYXQgR0xTTCBJUidzIGNvbnN0YW50IHByb3BhZ2F0aW9uIGRvZXNuJ3QgdHJhY2sgdGhlCisgKiBjb21wb25lbnRzIG9mIGFnZ3JlZ2F0ZXMsIHNvIHNvbWUgVlMgcGF0dGVybnMgKGluaXRpYWxpemUgbWF0cml4IHRvCisgKiAwLCBhY2N1bXVsYXRlIGluIHZlcnRleCBibGVuZGluZyBmYWN0b3JzKSBlbmQgdXAgYnJlYWtpbmcgZG93biB0bworICogaW5zdHJ1Y3Rpb25zIGludm9sdmluZyAwLgorICovCitib29sCit2ZWM0X3Zpc2l0b3I6Om9wdF9hbGdlYnJhaWMoKQoreworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopbm9kZTsKKworICAgICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgICAgIGNhc2UgQlJXX09QQ09ERV9BREQ6CisJIGlmIChpbnN0LT5zcmNbMV0uaXNfemVybygpKSB7CisJICAgIGluc3QtPm9wY29kZSA9IEJSV19PUENPREVfTU9WOworCSAgICBpbnN0LT5zcmNbMV0gPSBzcmNfcmVnKCk7CisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfQorCSBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX01VTDoKKwkgaWYgKGluc3QtPnNyY1sxXS5pc196ZXJvKCkpIHsKKwkgICAgaW5zdC0+b3Bjb2RlID0gQlJXX09QQ09ERV9NT1Y7CisJICAgIHN3aXRjaCAoaW5zdC0+c3JjWzBdLnR5cGUpIHsKKwkgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9GOgorCSAgICAgICBpbnN0LT5zcmNbMF0gPSBzcmNfcmVnKDAuMGYpOworCSAgICAgICBicmVhazsKKwkgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9EOgorCSAgICAgICBpbnN0LT5zcmNbMF0gPSBzcmNfcmVnKDApOworCSAgICAgICBicmVhazsKKwkgICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9VRDoKKwkgICAgICAgaW5zdC0+c3JjWzBdID0gc3JjX3JlZygwdSk7CisJICAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworCSAgICAgICBpbnN0LT5zcmNbMF0gPSBzcmNfcmVnKDAuMGYpOworCSAgICAgICBicmVhazsKKwkgICAgfQorCSAgICBpbnN0LT5zcmNbMV0gPSBzcmNfcmVnKCk7CisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKwkgfSBlbHNlIGlmIChpbnN0LT5zcmNbMV0uaXNfb25lKCkpIHsKKwkgICAgaW5zdC0+b3Bjb2RlID0gQlJXX09QQ09ERV9NT1Y7CisJICAgIGluc3QtPnNyY1sxXSA9IHNyY19yZWcoKTsKKwkgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSB9CisJIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGlmIChwcm9ncmVzcykKKyAgICAgIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKworICAgcmV0dXJuIHByb2dyZXNzOworfQorCisvKioKKyAqIE9ubHkgYSBsaW1pdGVkIG51bWJlciBvZiBoYXJkd2FyZSByZWdpc3RlcnMgbWF5IGJlIHVzZWQgZm9yIHB1c2gKKyAqIGNvbnN0YW50cywgc28gdGhpcyB0dXJucyBhY2Nlc3MgdG8gdGhlIG92ZXJmbG93ZWQgY29uc3RhbnRzIGludG8KKyAqIHB1bGwgY29uc3RhbnRzLgorICovCit2b2lkCit2ZWM0X3Zpc2l0b3I6Om1vdmVfcHVzaF9jb25zdGFudHNfdG9fcHVsbF9jb25zdGFudHMoKQoreworICAgaW50IHB1bGxfY29uc3RhbnRfbG9jW3RoaXMtPnVuaWZvcm1zXTsKKworICAgLyogT25seSBhbGxvdyAzMiByZWdpc3RlcnMgKDI1NiB1bmlmb3JtIGNvbXBvbmVudHMpIGFzIHB1c2ggY29uc3RhbnRzLAorICAgICogd2hpY2ggaXMgdGhlIGxpbWl0IG9uIGdlbjYuCisgICAgKi8KKyAgIC8vIEx1bmFyRyA6IFRPRE8gLSB0dXJuaW5nIG9mZiBwdXNoIGNvbnN0YW50cyBmb3IgYnJpbmcgdXAKKyAgIGludCBtYXhfdW5pZm9ybV9jb21wb25lbnRzID0gMDsvLzMyICogODsKKyAgIGlmICh0aGlzLT51bmlmb3JtcyAqIDQgPD0gbWF4X3VuaWZvcm1fY29tcG9uZW50cykKKyAgICAgIHJldHVybjsKKworICAgLyogTWFrZSBzb21lIHNvcnQgb2YgY2hvaWNlIGFzIHRvIHdoaWNoIHVuaWZvcm1zIGdldCBzZW50IHRvIHB1bGwKKyAgICAqIGNvbnN0YW50cy4gIFdlIGNvdWxkIHBvdGVudGlhbGx5IGRvIHNvbWV0aGluZyBjbGV2ZXIgaGVyZSBsaWtlCisgICAgKiBsb29rIGZvciB0aGUgbW9zdCBpbmZyZXF1ZW50bHkgdXNlZCB1bmlmb3JtIHZlYzRzLCBidXQgbGVhdmUKKyAgICAqIHRoYXQgZm9yIGxhdGVyLgorICAgICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaWZvcm1zICogNDsgaSArPSA0KSB7CisgICAgICBwdWxsX2NvbnN0YW50X2xvY1tpIC8gNF0gPSAtMTsKKworICAgICAgaWYgKGkgPj0gbWF4X3VuaWZvcm1fY29tcG9uZW50cykgeworCSBjb25zdCBmbG9hdCAqKnZhbHVlcyA9ICZzdGFnZV9wcm9nX2RhdGEtPnBhcmFtW2ldOworCisJIC8qIFRyeSB0byBmaW5kIGFuIGV4aXN0aW5nIGNvcHkgb2YgdGhpcyB1bmlmb3JtIGluIHRoZSBwdWxsCisJICAqIGNvbnN0YW50cyBpZiBpdCB3YXMgcGFydCBvZiBhbiBhcnJheSBhY2Nlc3MgYWxyZWFkeS4KKwkgICovCisJIGZvciAodW5zaWduZWQgaW50IGogPSAwOyBqIDwgc3RhZ2VfcHJvZ19kYXRhLT5ucl9wdWxsX3BhcmFtczsgaiArPSA0KSB7CisJICAgIGludCBtYXRjaGVzOworCisJICAgIGZvciAobWF0Y2hlcyA9IDA7IG1hdGNoZXMgPCA0OyBtYXRjaGVzKyspIHsKKwkgICAgICAgaWYgKHN0YWdlX3Byb2dfZGF0YS0+cHVsbF9wYXJhbVtqICsgbWF0Y2hlc10gIT0gdmFsdWVzW21hdGNoZXNdKQorCQkgIGJyZWFrOworCSAgICB9CisKKwkgICAgaWYgKG1hdGNoZXMgPT0gNCkgeworCSAgICAgICBwdWxsX2NvbnN0YW50X2xvY1tpIC8gNF0gPSBqIC8gNDsKKwkgICAgICAgYnJlYWs7CisJICAgIH0KKwkgfQorCisJIGlmIChwdWxsX2NvbnN0YW50X2xvY1tpIC8gNF0gPT0gLTEpIHsKKwkgICAgYXNzZXJ0KHN0YWdlX3Byb2dfZGF0YS0+bnJfcHVsbF9wYXJhbXMgJSA0ID09IDApOworCSAgICBwdWxsX2NvbnN0YW50X2xvY1tpIC8gNF0gPSBzdGFnZV9wcm9nX2RhdGEtPm5yX3B1bGxfcGFyYW1zIC8gNDsKKworCSAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworCSAgICAgICBzdGFnZV9wcm9nX2RhdGEtPnB1bGxfcGFyYW1bc3RhZ2VfcHJvZ19kYXRhLT5ucl9wdWxsX3BhcmFtcysrXSA9CisgICAgICAgICAgICAgICAgICB2YWx1ZXNbal07CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQorCisgICAvKiBOb3cgYWN0dWFsbHkgcmV3cml0ZSB1c2FnZSBvZiB0aGUgdGhpbmdzIHdlJ3ZlIG1vdmVkIHRvIHB1bGwKKyAgICAqIGNvbnN0YW50cy4KKyAgICAqLworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopbm9kZTsKKworICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgMzsgaSsrKSB7CisJIGlmIChpbnN0LT5zcmNbaV0uZmlsZSAhPSBVTklGT1JNIHx8CisJICAgICBwdWxsX2NvbnN0YW50X2xvY1tpbnN0LT5zcmNbaV0ucmVnXSA9PSAtMSkKKwkgICAgY29udGludWU7CisKKwkgaW50IHVuaWZvcm0gPSBpbnN0LT5zcmNbaV0ucmVnOworCisJIGRzdF9yZWcgdGVtcCA9IGRzdF9yZWcodGhpcywgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworCisJIGVtaXRfcHVsbF9jb25zdGFudF9sb2FkKGluc3QsIHRlbXAsIGluc3QtPnNyY1tpXSwKKwkJCQkgcHVsbF9jb25zdGFudF9sb2NbdW5pZm9ybV0pOworCisJIGluc3QtPnNyY1tpXS5maWxlID0gdGVtcC5maWxlOworCSBpbnN0LT5zcmNbaV0ucmVnID0gdGVtcC5yZWc7CisJIGluc3QtPnNyY1tpXS5yZWdfb2Zmc2V0ID0gdGVtcC5yZWdfb2Zmc2V0OworCSBpbnN0LT5zcmNbaV0ucmVsYWRkciA9IE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIC8qIFJlcGFjayBwdXNoIGNvbnN0YW50cyB0byByZW1vdmUgdGhlIG5vdy11bnVzZWQgb25lcy4gKi8KKyAgIHBhY2tfdW5pZm9ybV9yZWdpc3RlcnMoKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBkZXBlbmRlbmN5IGNvbnRyb2wgZmllbGRzIG9uIGluc3RydWN0aW9ucyBhZnRlciByZWdpc3RlcgorICogYWxsb2NhdGlvbiBhbmQgYmVmb3JlIHRoZSBnZW5lcmF0b3IgaXMgcnVuLgorICoKKyAqIFdoZW4geW91IGhhdmUgYSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgbGlrZToKKyAqCisgKiBEUDQgdGVtcC54IHZlcnRleCB1bmlmb3JtWzBdCisgKiBEUDQgdGVtcC55IHZlcnRleCB1bmlmb3JtWzBdCisgKiBEUDQgdGVtcC56IHZlcnRleCB1bmlmb3JtWzBdCisgKiBEUDQgdGVtcC53IHZlcnRleCB1bmlmb3JtWzBdCisgKgorICogVGhlIGhhcmR3YXJlIGRvZXNuJ3Qga25vdyB0aGF0IGl0IGNhbiBhY3R1YWxseSBydW4gdGhlIGxhdGVyIGluc3RydWN0aW9ucworICogd2hpbGUgdGhlIHByZXZpb3VzIG9uZXMgYXJlIGluIGZsaWdodCwgcHJvZHVjaW5nIHN0YWxscy4gIEhvd2V2ZXIsIHdlIGhhdmUKKyAqIG1hbnVhbCBmaWVsZHMgd2UgY2FuIHNldCBpbiB0aGUgaW5zdHJ1Y3Rpb25zIHRoYXQgbGV0IGl0IGRvIHNvLgorICovCit2b2lkCit2ZWM0X3Zpc2l0b3I6Om9wdF9zZXRfZGVwZW5kZW5jeV9jb250cm9sKCkKK3sKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmxhc3RfZ3JmX3dyaXRlW0JSV19NQVhfR1JGXTsKKyAgIHVpbnQ4X3QgZ3JmX2NoYW5uZWxzX3dyaXR0ZW5bQlJXX01BWF9HUkZdOworICAgdmVjNF9pbnN0cnVjdGlvbiAqbGFzdF9tcmZfd3JpdGVbQlJXX01BWF9HUkZdOworICAgdWludDhfdCBtcmZfY2hhbm5lbHNfd3JpdHRlbltCUldfTUFYX0dSRl07CisKKyAgIGNmZ190IGNmZygmaW5zdHJ1Y3Rpb25zKTsKKworICAgYXNzZXJ0KHByb2dfZGF0YS0+dG90YWxfZ3JmIHx8CisgICAgICAgICAgISJNdXN0IGJlIGNhbGxlZCBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uIik7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2ZnLm51bV9ibG9ja3M7IGkrKykgeworICAgICAgYmJsb2NrX3QgKmJibG9jayA9IGNmZy5ibG9ja3NbaV07CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0OworCisgICAgICBtZW1zZXQobGFzdF9ncmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X2dyZl93cml0ZSkpOworICAgICAgbWVtc2V0KGxhc3RfbXJmX3dyaXRlLCAwLCBzaXplb2YobGFzdF9tcmZfd3JpdGUpKTsKKworICAgICAgZm9yIChpbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKiliYmxvY2stPnN0YXJ0OworICAgICAgICAgICBpbnN0ICE9ICh2ZWM0X2luc3RydWN0aW9uICopYmJsb2NrLT5lbmQtPm5leHQ7CisgICAgICAgICAgIGluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKWluc3QtPm5leHQpIHsKKyAgICAgICAgIC8qIElmIHdlIHJlYWQgZnJvbSBhIHJlZ2lzdGVyIHRoYXQgd2Ugd2VyZSBkb2luZyBkZXBlbmRlbmN5IGNvbnRyb2wKKyAgICAgICAgICAqIG9uLCBkb24ndCBkbyBkZXBlbmRlbmN5IGNvbnRyb2wgYWNyb3NzIHRoZSByZWFkLgorICAgICAgICAgICovCisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgaW50IHJlZyA9IGluc3QtPnNyY1tpXS5yZWcgKyBpbnN0LT5zcmNbaV0ucmVnX29mZnNldDsKKyAgICAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpIHsKKyAgICAgICAgICAgICAgIGxhc3RfZ3JmX3dyaXRlW3JlZ10gPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBIV19SRUcpIHsKKyAgICAgICAgICAgICAgIG1lbXNldChsYXN0X2dyZl93cml0ZSwgMCwgc2l6ZW9mKGxhc3RfZ3JmX3dyaXRlKSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChpbnN0LT5zcmNbaV0uZmlsZSAhPSBNUkYpOworICAgICAgICAgfQorCisgICAgICAgICAvKiBJbiB0aGUgcHJlc2VuY2Ugb2Ygc2VuZCBtZXNzYWdlcywgdG90YWxseSBpbnRlcnJ1cHQgZGVwZW5kZW5jeQorICAgICAgICAgICogY29udHJvbC4gIFRoZXkncmUgbG9uZyBlbm91Z2ggdGhhdCB0aGUgY2hhbmNlIG9mIGRlcGVuZGVuY3kKKyAgICAgICAgICAqIGNvbnRyb2wgYXJvdW5kIHRoZW0ganVzdCBkb2Vzbid0IG1hdHRlci4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKGluc3QtPm1sZW4pIHsKKyAgICAgICAgICAgIG1lbXNldChsYXN0X2dyZl93cml0ZSwgMCwgc2l6ZW9mKGxhc3RfZ3JmX3dyaXRlKSk7CisgICAgICAgICAgICBtZW1zZXQobGFzdF9tcmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X21yZl93cml0ZSkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIEl0IGxvb2tzIGxpa2Ugc2V0dGluZyBkZXBlbmRlbmN5IGNvbnRyb2wgb24gYSBwcmVkaWNhdGVkCisgICAgICAgICAgKiBpbnN0cnVjdGlvbiBoYW5ncyB0aGUgR1BVLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoaW5zdC0+cHJlZGljYXRlKSB7CisgICAgICAgICAgICBtZW1zZXQobGFzdF9ncmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X2dyZl93cml0ZSkpOworICAgICAgICAgICAgbWVtc2V0KGxhc3RfbXJmX3dyaXRlLCAwLCBzaXplb2YobGFzdF9tcmZfd3JpdGUpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorCisgICAgICAgICAvKiBEZXBlbmRlbmN5IGNvbnRyb2wgZG9lcyBub3Qgd29yayB3ZWxsIG92ZXIgbWF0aCBpbnN0cnVjdGlvbnMuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChpbnN0LT5pc19tYXRoKCkpIHsKKyAgICAgICAgICAgIG1lbXNldChsYXN0X2dyZl93cml0ZSwgMCwgc2l6ZW9mKGxhc3RfZ3JmX3dyaXRlKSk7CisgICAgICAgICAgICBtZW1zZXQobGFzdF9tcmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X21yZl93cml0ZSkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIE5vdywgc2VlIGlmIHdlIGNhbiBkbyBkZXBlbmRlbmN5IGNvbnRyb2wgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAqIGFnYWluc3QgYSBwcmV2aW91cyBvbmUgd3JpdGluZyB0byBpdHMgZGVzdGluYXRpb24uCisgICAgICAgICAgKi8KKyAgICAgICAgIGludCByZWcgPSBpbnN0LT5kc3QucmVnICsgaW5zdC0+ZHN0LnJlZ19vZmZzZXQ7CisgICAgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKSB7CisgICAgICAgICAgICBpZiAobGFzdF9ncmZfd3JpdGVbcmVnXSAmJgorICAgICAgICAgICAgICAgICEoaW5zdC0+ZHN0LndyaXRlbWFzayAmIGdyZl9jaGFubmVsc193cml0dGVuW3JlZ10pKSB7CisgICAgICAgICAgICAgICBsYXN0X2dyZl93cml0ZVtyZWddLT5ub19kZF9jbGVhciA9IHRydWU7CisgICAgICAgICAgICAgICBpbnN0LT5ub19kZF9jaGVjayA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgZ3JmX2NoYW5uZWxzX3dyaXR0ZW5bcmVnXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhc3RfZ3JmX3dyaXRlW3JlZ10gPSBpbnN0OworICAgICAgICAgICAgZ3JmX2NoYW5uZWxzX3dyaXR0ZW5bcmVnXSB8PSBpbnN0LT5kc3Qud3JpdGVtYXNrOworICAgICAgICAgfSBlbHNlIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBNUkYpIHsKKyAgICAgICAgICAgIGlmIChsYXN0X21yZl93cml0ZVtyZWddICYmCisgICAgICAgICAgICAgICAgIShpbnN0LT5kc3Qud3JpdGVtYXNrICYgbXJmX2NoYW5uZWxzX3dyaXR0ZW5bcmVnXSkpIHsKKyAgICAgICAgICAgICAgIGxhc3RfbXJmX3dyaXRlW3JlZ10tPm5vX2RkX2NsZWFyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgIGluc3QtPm5vX2RkX2NoZWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBtcmZfY2hhbm5lbHNfd3JpdHRlbltyZWddID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFzdF9tcmZfd3JpdGVbcmVnXSA9IGluc3Q7CisgICAgICAgICAgICBtcmZfY2hhbm5lbHNfd3JpdHRlbltyZWddIHw9IGluc3QtPmRzdC53cml0ZW1hc2s7CisgICAgICAgICB9IGVsc2UgaWYgKGluc3QtPmRzdC5yZWcgPT0gSFdfUkVHKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpCisgICAgICAgICAgICAgICBtZW1zZXQobGFzdF9ncmZfd3JpdGUsIDAsIHNpemVvZihsYXN0X2dyZl93cml0ZSkpOworICAgICAgICAgICAgaWYgKGluc3QtPmRzdC5maXhlZF9od19yZWcuZmlsZSA9PSBCUldfTUVTU0FHRV9SRUdJU1RFUl9GSUxFKQorICAgICAgICAgICAgICAgbWVtc2V0KGxhc3RfbXJmX3dyaXRlLCAwLCBzaXplb2YobGFzdF9tcmZfd3JpdGUpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworYm9vbAordmVjNF9pbnN0cnVjdGlvbjo6Y2FuX3Jlc3dpenpsZV9kc3QoaW50IGRzdF93cml0ZW1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3dpenpsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzd2l6emxlX21hc2spCit7CisgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIHNldHMgYW55dGhpbmcgbm90IHJlZmVyZW5jZWQgYnkgc3dpenpsZSwgdGhlbiB3ZSdkCisgICAgKiB0b3RhbGx5IGJyZWFrIGl0IHdoZW4gd2UgcmVzd2l6emxlLgorICAgICovCisgICBpZiAoZHN0LndyaXRlbWFzayAmIH5zd2l6emxlX21hc2spCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICBjYXNlIEJSV19PUENPREVfRFA0OgorICAgY2FzZSBCUldfT1BDT0RFX0RQMzoKKyAgIGNhc2UgQlJXX09QQ09ERV9EUDI6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGRlZmF1bHQ6CisgICAgICAvKiBDaGVjayBpZiB0aGVyZSBoYXBwZW5zIHRvIGJlIG5vIHJlc3dpenpsaW5nIHJlcXVpcmVkLiAqLworICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspIHsKKyAgICAgICAgIGludCBiaXQgPSAxIDw8IEJSV19HRVRfU1daKHN3aXp6bGUsIGMpOworICAgICAgICAgLyogU2tpcCBjb21wb25lbnRzIG9mIHRoZSBzd2l6emxlIG5vdCB1c2VkIGJ5IHRoZSBkc3QuICovCisgICAgICAgICBpZiAoIShkc3Rfd3JpdGVtYXNrICYgKDEgPDwgYykpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIC8qIFdlIGRvbid0IGRvIHRoZSByZXN3aXp6bGluZyB5ZXQsIHNvIGp1c3Qgc2FuaXR5IGNoZWNrIHRoYXQgd2UKKyAgICAgICAgICAqIGRvbid0IGhhdmUgdG8uCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChiaXQgIT0gKDEgPDwgYykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KK30KKworLyoqCisgKiBGb3IgYW55IGNoYW5uZWxzIGluIHRoZSBzd2l6emxlJ3Mgc291cmNlIHRoYXQgd2VyZSBwb3B1bGF0ZWQgYnkgdGhpcworICogaW5zdHJ1Y3Rpb24sIHJld3JpdGUgdGhlIGluc3RydWN0aW9uIHRvIHB1dCB0aGUgYXBwcm9wcmlhdGUgcmVzdWx0IGRpcmVjdGx5CisgKiBpbiB0aG9zZSBjaGFubmVscy4KKyAqCisgKiBlLmcuIGZvciBzd2l6emxlPXl5d3gsIE1VTCBhLnh5IGIgYyAtPiBNVUwgYS55eV94IGIueXkgei55eV94CisgKi8KK3ZvaWQKK3ZlYzRfaW5zdHJ1Y3Rpb246OnJlc3dpenpsZV9kc3QoaW50IGRzdF93cml0ZW1hc2ssIGludCBzd2l6emxlKQoreworICAgaW50IG5ld193cml0ZW1hc2sgPSAwOworCisgICBzd2l0Y2ggKG9wY29kZSkgeworICAgY2FzZSBCUldfT1BDT0RFX0RQNDoKKyAgIGNhc2UgQlJXX09QQ09ERV9EUDM6CisgICBjYXNlIEJSV19PUENPREVfRFAyOgorICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspIHsKKyAgICAgICAgIGludCBiaXQgPSAxIDw8IEJSV19HRVRfU1daKHN3aXp6bGUsIGMpOworICAgICAgICAgLyogU2tpcCBjb21wb25lbnRzIG9mIHRoZSBzd2l6emxlIG5vdCB1c2VkIGJ5IHRoZSBkc3QuICovCisgICAgICAgICBpZiAoIShkc3Rfd3JpdGVtYXNrICYgKDEgPDwgYykpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAvKiBJZiB3ZSB3ZXJlIHBvcHVsYXRpbmcgdGhpcyBjb21wb25lbnQsIHRoZW4gcG9wdWxhdGUgdGhlCisgICAgICAgICAgKiBjb3JyZXNwb25kaW5nIGNoYW5uZWwgb2YgdGhlIG5ldyBkc3QuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChkc3Qud3JpdGVtYXNrICYgYml0KQorICAgICAgICAgICAgbmV3X3dyaXRlbWFzayB8PSAoMSA8PCBjKTsKKyAgICAgIH0KKyAgICAgIGRzdC53cml0ZW1hc2sgPSBuZXdfd3JpdGVtYXNrOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspIHsKKyAgICAgICAgIC8qIFNraXAgY29tcG9uZW50cyBvZiB0aGUgc3dpenpsZSBub3QgdXNlZCBieSB0aGUgZHN0LiAqLworICAgICAgICAgaWYgKCEoZHN0X3dyaXRlbWFzayAmICgxIDw8IGMpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAvKiBXZSBkb24ndCBkbyB0aGUgcmVzd2l6emxpbmcgeWV0LCBzbyBqdXN0IHNhbml0eSBjaGVjayB0aGF0IHdlCisgICAgICAgICAgKiBkb24ndCBoYXZlIHRvLgorICAgICAgICAgICovCisgICAgICAgICBhc3NlcnQoKDEgPDwgQlJXX0dFVF9TV1ooc3dpenpsZSwgYykpID09ICgxIDw8IGMpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorfQorCisvKgorICogVHJpZXMgdG8gcmVkdWNlIGV4dHJhIE1PViBpbnN0cnVjdGlvbnMgYnkgdGFraW5nIHRlbXBvcmFyeSBHUkZzIHRoYXQgZ2V0CisgKiBqdXN0IHdyaXR0ZW4gYW5kIHRoZW4gTU9WZWQgaW50byBhbm90aGVyIHJlZyBhbmQgbWFraW5nIHRoZSBvcmlnaW5hbCB3cml0ZQorICogb2YgdGhlIEdSRiB3cml0ZSBkaXJlY3RseSB0byB0aGUgZmluYWwgZGVzdGluYXRpb24gaW5zdGVhZC4KKyAqLworYm9vbAordmVjNF92aXNpdG9yOjpvcHRfcmVnaXN0ZXJfY29hbGVzY2UoKQoreworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworICAgaW50IG5leHRfaXAgPSAwOworCisgICBjYWxjdWxhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopbm9kZTsKKworICAgICAgaW50IGlwID0gbmV4dF9pcDsKKyAgICAgIG5leHRfaXArKzsKKworICAgICAgaWYgKGluc3QtPm9wY29kZSAhPSBCUldfT1BDT0RFX01PViB8fAorICAgICAgICAgIChpbnN0LT5kc3QuZmlsZSAhPSBHUkYgJiYgaW5zdC0+ZHN0LmZpbGUgIT0gTVJGKSB8fAorCSAgaW5zdC0+cHJlZGljYXRlIHx8CisJICBpbnN0LT5zcmNbMF0uZmlsZSAhPSBHUkYgfHwKKwkgIGluc3QtPmRzdC50eXBlICE9IGluc3QtPnNyY1swXS50eXBlIHx8CisJICBpbnN0LT5zcmNbMF0uYWJzIHx8IGluc3QtPnNyY1swXS5uZWdhdGUgfHwgaW5zdC0+c3JjWzBdLnJlbGFkZHIpCisJIGNvbnRpbnVlOworCisgICAgICBib29sIHRvX21yZiA9IChpbnN0LT5kc3QuZmlsZSA9PSBNUkYpOworCisgICAgICAvKiBDYW4ndCBjb2FsZXNjZSB0aGlzIEdSRiBpZiBzb21lb25lIGVsc2Ugd2FzIGdvaW5nIHRvCisgICAgICAgKiByZWFkIGl0IGxhdGVyLgorICAgICAgICovCisgICAgICBpZiAodGhpcy0+dmlydHVhbF9ncmZfZW5kW2luc3QtPnNyY1swXS5yZWcgKiA0ICsgMF0gPiBpcCB8fAorICAgICAgICAgIHRoaXMtPnZpcnR1YWxfZ3JmX2VuZFtpbnN0LT5zcmNbMF0ucmVnICogNCArIDFdID4gaXAgfHwKKyAgICAgICAgICB0aGlzLT52aXJ0dWFsX2dyZl9lbmRbaW5zdC0+c3JjWzBdLnJlZyAqIDQgKyAyXSA+IGlwIHx8CisgICAgICAgICAgdGhpcy0+dmlydHVhbF9ncmZfZW5kW2luc3QtPnNyY1swXS5yZWcgKiA0ICsgM10gPiBpcCkKKwkgY29udGludWU7CisKKyAgICAgIC8qIFdlIG5lZWQgdG8gY2hlY2sgaW50ZXJmZXJlbmNlIHdpdGggdGhlIGZpbmFsIGRlc3RpbmF0aW9uIGJldHdlZW4gdGhpcworICAgICAgICogaW5zdHJ1Y3Rpb24gYW5kIHRoZSBlYXJsaWVzdCBpbnN0cnVjdGlvbiBpbnZvbHZlZCBpbiB3cml0aW5nIHRoZSBHUkYKKyAgICAgICAqIHdlJ3JlIGVsaW1pbmF0aW5nLiAgVG8gZG8gdGhhdCwga2VlcCB0cmFjayBvZiB3aGljaCBvZiBvdXIgc291cmNlCisgICAgICAgKiBjaGFubmVscyB3ZSd2ZSBzZWVuIGluaXRpYWxpemVkLgorICAgICAgICovCisgICAgICBib29sIGNoYW5zX25lZWRlZFs0XSA9IHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX07CisgICAgICBpbnQgY2hhbnNfcmVtYWluaW5nID0gMDsKKyAgICAgIGludCBzd2l6emxlX21hc2sgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkgaW50IGNoYW4gPSBCUldfR0VUX1NXWihpbnN0LT5zcmNbMF0uc3dpenpsZSwgaSk7CisKKwkgaWYgKCEoaW5zdC0+ZHN0LndyaXRlbWFzayAmICgxIDw8IGkpKSkKKwkgICAgY29udGludWU7CisKKyAgICAgICAgIHN3aXp6bGVfbWFzayB8PSAoMSA8PCBjaGFuKTsKKworCSBpZiAoIWNoYW5zX25lZWRlZFtjaGFuXSkgeworCSAgICBjaGFuc19uZWVkZWRbY2hhbl0gPSB0cnVlOworCSAgICBjaGFuc19yZW1haW5pbmcrKzsKKwkgfQorICAgICAgfQorCisgICAgICAvKiBOb3cgd2FsayB1cCB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIHRyeWluZyB0byBzZWUgaWYgd2UgY2FuIHJld3JpdGUKKyAgICAgICAqIGV2ZXJ5dGhpbmcgd3JpdGluZyB0byB0aGUgdGVtcG9yYXJ5IHRvIHdyaXRlIGludG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgKiBpbnN0ZWFkLgorICAgICAgICovCisgICAgICB2ZWM0X2luc3RydWN0aW9uICpzY2FuX2luc3Q7CisgICAgICBmb3IgKHNjYW5faW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopaW5zdC0+cHJldjsKKwkgICBzY2FuX2luc3QtPnByZXYgIT0gTlVMTDsKKwkgICBzY2FuX2luc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKXNjYW5faW5zdC0+cHJldikgeworCSBpZiAoc2Nhbl9pbnN0LT5kc3QuZmlsZSA9PSBHUkYgJiYKKwkgICAgIHNjYW5faW5zdC0+ZHN0LnJlZyA9PSBpbnN0LT5zcmNbMF0ucmVnICYmCisJICAgICBzY2FuX2luc3QtPmRzdC5yZWdfb2Zmc2V0ID09IGluc3QtPnNyY1swXS5yZWdfb2Zmc2V0KSB7CisgICAgICAgICAgICAvKiBGb3VuZCBzb21ldGhpbmcgd3JpdGluZyB0byB0aGUgcmVnIHdlIHdhbnQgdG8gY29hbGVzY2UgYXdheS4gKi8KKyAgICAgICAgICAgIGlmICh0b19tcmYpIHsKKyAgICAgICAgICAgICAgIC8qIFNFTkQgaW5zdHJ1Y3Rpb25zIGNhbid0IGhhdmUgTVJGIGFzIGEgZGVzdGluYXRpb24uICovCisgICAgICAgICAgICAgICBpZiAoc2Nhbl9pbnN0LT5tbGVuKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAvKiBnZW42IG1hdGggaW5zdHJ1Y3Rpb25zIG11c3QgaGF2ZSB0aGUgZGVzdGluYXRpb24gYmUKKyAgICAgICAgICAgICAgICAgICAqIEdSRiwgc28gbm8gY29tcHV0ZS10by1NUkYgZm9yIHRoZW0uCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzY2FuX2luc3QtPmlzX21hdGgoKSkgeworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHdlIGNhbid0IGhhbmRsZSB0aGUgc3dpenpsZSwgYmFpbC4gKi8KKyAgICAgICAgICAgIGlmICghc2Nhbl9pbnN0LT5jYW5fcmVzd2l6emxlX2RzdChpbnN0LT5kc3Qud3JpdGVtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1swXS5zd2l6emxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGVfbWFzaykpIHsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJICAgIC8qIE1hcmsgd2hpY2ggY2hhbm5lbHMgd2UgZm91bmQgdW5jb25kaXRpb25hbCB3cml0ZXMgZm9yLiAqLworCSAgICBpZiAoIXNjYW5faW5zdC0+cHJlZGljYXRlKSB7CisJICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCSAgaWYgKHNjYW5faW5zdC0+ZHN0LndyaXRlbWFzayAmICgxIDw8IGkpICYmCisJCSAgICAgIGNoYW5zX25lZWRlZFtpXSkgeworCQkgICAgIGNoYW5zX25lZWRlZFtpXSA9IGZhbHNlOworCQkgICAgIGNoYW5zX3JlbWFpbmluZy0tOworCQkgIH0KKwkgICAgICAgfQorCSAgICB9CisKKwkgICAgaWYgKGNoYW5zX3JlbWFpbmluZyA9PSAwKQorCSAgICAgICBicmVhazsKKwkgfQorCisJIC8qIFdlIGRvbid0IGhhbmRsZSBmbG93IGNvbnRyb2wgaGVyZS4gIE1vc3QgY29tcHV0YXRpb24gb2YgdmFsdWVzCisJICAqIHRoYXQgY291bGQgYmUgY29hbGVzY2VkIGhhcHBlbnMganVzdCBiZWZvcmUgdGhlaXIgdXNlLgorCSAgKi8KKwkgaWYgKHNjYW5faW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfRE8gfHwKKwkgICAgIHNjYW5faW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfV0hJTEUgfHwKKwkgICAgIHNjYW5faW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfRUxTRSB8fAorCSAgICAgc2Nhbl9pbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9FTkRJRikgeworCSAgICBicmVhazsKKwkgfQorCisgICAgICAgICAvKiBZb3UgY2FuJ3QgcmVhZCBmcm9tIGFuIE1SRiwgc28gaWYgc29tZW9uZSBlbHNlIHJlYWRzIG91ciBNUkYncworICAgICAgICAgICogc291cmNlIEdSRiB0aGF0IHdlIHdhbnRlZCB0byByZXdyaXRlLCB0aGF0IHN0b3BzIHVzLiAgSWYgaXQncyBhCisgICAgICAgICAgKiBHUkYgd2UncmUgdHJ5aW5nIHRvIGNvYWxlc2NlIHRvLCB3ZSBkb24ndCBhY3R1YWxseSBoYW5kbGUKKyAgICAgICAgICAqIHJld3JpdGluZyBzb3VyY2VzIHNvIGJhaWwgaW4gdGhhdCBjYXNlIGFzIHdlbGwuCisgICAgICAgICAgKi8KKwkgYm9vbCBpbnRlcmZlcmVkID0gZmFsc2U7CisJIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJICAgIGlmIChzY2FuX2luc3QtPnNyY1tpXS5maWxlID09IEdSRiAmJgorCQlzY2FuX2luc3QtPnNyY1tpXS5yZWcgPT0gaW5zdC0+c3JjWzBdLnJlZyAmJgorCQlzY2FuX2luc3QtPnNyY1tpXS5yZWdfb2Zmc2V0ID09IGluc3QtPnNyY1swXS5yZWdfb2Zmc2V0KSB7CisJICAgICAgIGludGVyZmVyZWQgPSB0cnVlOworCSAgICB9CisJIH0KKwkgaWYgKGludGVyZmVyZWQpCisJICAgIGJyZWFrOworCisgICAgICAgICAvKiBJZiBzb21lYm9keSBlbHNlIHdyaXRlcyBvdXIgZGVzdGluYXRpb24gaGVyZSwgd2UgY2FuJ3QgY29hbGVzY2UKKyAgICAgICAgICAqIGJlZm9yZSB0aGF0LgorICAgICAgICAgICovCisgICAgICAgICBpZiAoc2Nhbl9pbnN0LT5kc3QuZmlsZSA9PSBpbnN0LT5kc3QuZmlsZSAmJgorICAgICAgICAgICAgIHNjYW5faW5zdC0+ZHN0LnJlZyA9PSBpbnN0LT5kc3QucmVnKSB7CisJICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICAvKiBDaGVjayBmb3IgcmVhZHMgb2YgdGhlIHJlZ2lzdGVyIHdlJ3JlIHRyeWluZyB0byBjb2FsZXNjZSBpbnRvLiAgV2UKKyAgICAgICAgICAqIGNhbid0IGdvIHJld3JpdGluZyBpbnN0cnVjdGlvbnMgYWJvdmUgdGhhdCB0byBwdXQgc29tZSBvdGhlciB2YWx1ZQorICAgICAgICAgICogaW4gdGhlIHJlZ2lzdGVyIGluc3RlYWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICh0b19tcmYgJiYgc2Nhbl9pbnN0LT5tbGVuID4gMCkgeworICAgICAgICAgICAgaWYgKGluc3QtPmRzdC5yZWcgPj0gc2Nhbl9pbnN0LT5iYXNlX21yZiAmJgorICAgICAgICAgICAgICAgIGluc3QtPmRzdC5yZWcgPCBzY2FuX2luc3QtPmJhc2VfbXJmICsgc2Nhbl9pbnN0LT5tbGVuKSB7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgaWYgKHNjYW5faW5zdC0+c3JjW2ldLmZpbGUgPT0gaW5zdC0+ZHN0LmZpbGUgJiYKKyAgICAgICAgICAgICAgICAgICBzY2FuX2luc3QtPnNyY1tpXS5yZWcgPT0gaW5zdC0+ZHN0LnJlZyAmJgorICAgICAgICAgICAgICAgICAgIHNjYW5faW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQgPT0gaW5zdC0+c3JjWzBdLnJlZ19vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgIGludGVyZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludGVyZmVyZWQpCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNoYW5zX3JlbWFpbmluZyA9PSAwKSB7CisJIC8qIElmIHdlJ3ZlIG1hZGUgaXQgaGVyZSwgd2UgaGF2ZSBhbiBNT1Ygd2Ugd2FudCB0byBjb2FsZXNjZSBvdXQsIGFuZAorCSAgKiBhIHNjYW5faW5zdCBwb2ludGluZyB0byB0aGUgZWFybGllc3QgaW5zdHJ1Y3Rpb24gaW52b2x2ZWQgaW4KKwkgICogY29tcHV0aW5nIHRoZSB2YWx1ZS4gIE5vdyBnbyByZXdyaXRlIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0KKwkgICogYmV0d2VlbiB0aGUgdHdvLgorCSAgKi8KKworCSB3aGlsZSAoc2Nhbl9pbnN0ICE9IGluc3QpIHsKKwkgICAgaWYgKHNjYW5faW5zdC0+ZHN0LmZpbGUgPT0gR1JGICYmCisJCXNjYW5faW5zdC0+ZHN0LnJlZyA9PSBpbnN0LT5zcmNbMF0ucmVnICYmCisJCXNjYW5faW5zdC0+ZHN0LnJlZ19vZmZzZXQgPT0gaW5zdC0+c3JjWzBdLnJlZ19vZmZzZXQpIHsKKyAgICAgICAgICAgICAgIHNjYW5faW5zdC0+cmVzd2l6emxlX2RzdChpbnN0LT5kc3Qud3JpdGVtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1swXS5zd2l6emxlKTsKKwkgICAgICAgc2Nhbl9pbnN0LT5kc3QuZmlsZSA9IGluc3QtPmRzdC5maWxlOworCSAgICAgICBzY2FuX2luc3QtPmRzdC5yZWcgPSBpbnN0LT5kc3QucmVnOworCSAgICAgICBzY2FuX2luc3QtPmRzdC5yZWdfb2Zmc2V0ID0gaW5zdC0+ZHN0LnJlZ19vZmZzZXQ7CisJICAgICAgIHNjYW5faW5zdC0+c2F0dXJhdGUgfD0gaW5zdC0+c2F0dXJhdGU7CisJICAgIH0KKwkgICAgc2Nhbl9pbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKilzY2FuX2luc3QtPm5leHQ7CisJIH0KKwkgaW5zdC0+cmVtb3ZlKCk7CisJIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHByb2dyZXNzKQorICAgICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKKy8qKgorICogU3BsaXRzIHZpcnR1YWwgR1JGcyByZXF1ZXN0aW5nIG1vcmUgdGhhbiBvbmUgY29udGlndW91cyBwaHlzaWNhbCByZWdpc3Rlci4KKyAqCisgKiBXZSBpbml0aWFsbHkgY3JlYXRlIGxhcmdlIHZpcnR1YWwgR1JGcyBmb3IgdGVtcG9yYXJ5IHN0cnVjdHVyZXMsIGFycmF5cywKKyAqIGFuZCBtYXRyaWNlcywgc28gdGhhdCB0aGUgZGVyZWZlcmVuY2UgdmlzaXRvciBmdW5jdGlvbnMgY2FuIGFkZCByZWdfb2Zmc2V0cworICogdG8gd29yayB0aGVpciB3YXkgZG93biB0byB0aGUgYWN0dWFsIG1lbWJlciBiZWluZyBhY2Nlc3NlZC4gIEJ1dCB3aGVuIGl0CisgKiBjb21lcyB0byBvcHRpbWl6YXRpb24sIHdlJ2QgbGlrZSB0byB0cmVhdCBlYWNoIHJlZ2lzdGVyIGFzIGluZGl2aWR1YWwKKyAqIHN0b3JhZ2UgaWYgcG9zc2libGUuCisgKgorICogU28gZmFyLCB0aGUgb25seSB0aGluZyB0aGF0IG1pZ2h0IHByZXZlbnQgc3BsaXR0aW5nIGlzIGEgc2VuZCBtZXNzYWdlIGZyb20KKyAqIGEgR1JGIG9uIElWQi4KKyAqLwordm9pZAordmVjNF92aXNpdG9yOjpzcGxpdF92aXJ0dWFsX2dyZnMoKQoreworICAgaW50IG51bV92YXJzID0gdGhpcy0+dmlydHVhbF9ncmZfY291bnQ7CisgICBpbnQgbmV3X3ZpcnR1YWxfZ3JmW251bV92YXJzXTsKKyAgIGJvb2wgc3BsaXRfZ3JmW251bV92YXJzXTsKKworICAgbWVtc2V0KG5ld192aXJ0dWFsX2dyZiwgMCwgc2l6ZW9mKG5ld192aXJ0dWFsX2dyZikpOworCisgICAvKiBUcnkgdG8gc3BsaXQgYW55dGhpbmcgPiAwIHNpemVkLiAqLworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdmFyczsgaSsrKSB7CisgICAgICBzcGxpdF9ncmZbaV0gPSB0aGlzLT52aXJ0dWFsX2dyZl9zaXplc1tpXSAhPSAxOworICAgfQorCisgICAvKiBDaGVjayB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVnaXN0ZXJzIHdlJ3JlIHRyeWluZworICAgICogdG8gc3BsaXQuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKilub2RlOworCisgICAgICAvKiBJZiB0aGVyZSdzIGEgU0VORCBtZXNzYWdlIGxvYWRpbmcgZnJvbSBhIEdSRiBvbiBnZW43KywgaXQgbmVlZHMgdG8gYmUKKyAgICAgICAqIGNvbnRpZ3VvdXMuCisgICAgICAgKi8KKyAgICAgIGlmIChpbnN0LT5pc19zZW5kX2Zyb21fZ3JmKCkpIHsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gR1JGKSB7CisgICAgICAgICAgICAgICBzcGxpdF9ncmZbaW5zdC0+c3JjW2ldLnJlZ10gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogQWxsb2NhdGUgbmV3IHNwYWNlIGZvciBzcGxpdCByZWdzLiAgTm90ZSB0aGF0IHRoZSB2aXJ0dWFsCisgICAgKiBudW1iZXJzIHdpbGwgYmUgY29udGlndW91cy4KKyAgICAqLworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdmFyczsgaSsrKSB7CisgICAgICBpZiAoIXNwbGl0X2dyZltpXSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBuZXdfdmlydHVhbF9ncmZbaV0gPSB2aXJ0dWFsX2dyZl9hbGxvYygxKTsKKyAgICAgIGZvciAoaW50IGogPSAyOyBqIDwgdGhpcy0+dmlydHVhbF9ncmZfc2l6ZXNbaV07IGorKykgeworICAgICAgICAgaW50IHJlZyA9IHZpcnR1YWxfZ3JmX2FsbG9jKDEpOworICAgICAgICAgYXNzZXJ0KHJlZyA9PSBuZXdfdmlydHVhbF9ncmZbaV0gKyBqIC0gMSk7CisgICAgICAgICAodm9pZCkgcmVnOworICAgICAgfQorICAgICAgdGhpcy0+dmlydHVhbF9ncmZfc2l6ZXNbaV0gPSAxOworICAgfQorCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopbm9kZTsKKworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRiAmJiBzcGxpdF9ncmZbaW5zdC0+ZHN0LnJlZ10gJiYKKyAgICAgICAgICBpbnN0LT5kc3QucmVnX29mZnNldCAhPSAwKSB7CisgICAgICAgICBpbnN0LT5kc3QucmVnID0gKG5ld192aXJ0dWFsX2dyZltpbnN0LT5kc3QucmVnXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPmRzdC5yZWdfb2Zmc2V0IC0gMSk7CisgICAgICAgICBpbnN0LT5kc3QucmVnX29mZnNldCA9IDA7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlID09IEdSRiAmJiBzcGxpdF9ncmZbaW5zdC0+c3JjW2ldLnJlZ10gJiYKKyAgICAgICAgICAgICBpbnN0LT5zcmNbaV0ucmVnX29mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpbnN0LT5zcmNbaV0ucmVnID0gKG5ld192aXJ0dWFsX2dyZltpbnN0LT5zcmNbaV0ucmVnXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5yZWdfb2Zmc2V0IC0gMSk7CisgICAgICAgICAgICBpbnN0LT5zcmNbaV0ucmVnX29mZnNldCA9IDA7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6ZHVtcF9pbnN0cnVjdGlvbihiYWNrZW5kX2luc3RydWN0aW9uICpiZV9pbnN0KQoreworICAgZHVtcF9pbnN0cnVjdGlvbihiZV9pbnN0LCBzdGRlcnIpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmR1bXBfaW5zdHJ1Y3Rpb24oYmFja2VuZF9pbnN0cnVjdGlvbiAqYmVfaW5zdCwgRklMRSAqZmlsZSkKK3sKKyAgIGNoYXIgYnVmZlsyNTZdOworICAgZHVtcF9pbnN0cnVjdGlvbihiZV9pbnN0LCBidWZmKTsKKworICAgZnByaW50ZihmaWxlLCAiJXMiLCBidWZmKTsKKworICAgZnByaW50ZihmaWxlLCAiXG4iKTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjpkdW1wX2luc3RydWN0aW9uKGJhY2tlbmRfaW5zdHJ1Y3Rpb24gKmJlX2luc3QsIGNoYXIgKnN0cmluZykKK3sKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKWJlX2luc3Q7CisKKyAgIGlmIChpbnN0LT5wcmVkaWNhdGUpIHsKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiglY2YwKSAiLAorICAgICAgICAgICAgIGluc3QtPnByZWRpY2F0ZV9pbnZlcnNlID8gJy0nIDogJysnKTsKKyAgIH0KKworICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiJXMiLCBicndfaW5zdHJ1Y3Rpb25fbmFtZShpbnN0LT5vcGNvZGUpKTsKKyAgIGlmIChpbnN0LT5jb25kaXRpb25hbF9tb2QpIHsKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiVzIiwgY29uZGl0aW9uYWxfbW9kaWZpZXJbaW5zdC0+Y29uZGl0aW9uYWxfbW9kXSk7CisgICB9CisgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIgIik7CisKKyAgIHN3aXRjaCAoaW5zdC0+ZHN0LmZpbGUpIHsKKyAgIGNhc2UgR1JGOgorICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAidmdyZiVkLiVkIiwgaW5zdC0+ZHN0LnJlZywgaW5zdC0+ZHN0LnJlZ19vZmZzZXQpOworICAgICAgYnJlYWs7CisgICBjYXNlIE1SRjoKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIm0lZCIsIGluc3QtPmRzdC5yZWcpOworICAgICAgYnJlYWs7CisgICBjYXNlIEhXX1JFRzoKKyAgICAgIGlmIChpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLmZpbGUgPT0gQlJXX0FSQ0hJVEVDVFVSRV9SRUdJU1RFUl9GSUxFKSB7CisgICAgICAgICBzd2l0Y2ggKGluc3QtPmRzdC5maXhlZF9od19yZWcubnIpIHsKKyAgICAgICAgIGNhc2UgQlJXX0FSRl9OVUxMOgorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAibnVsbCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEJSV19BUkZfQUREUkVTUzoKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgImEwLiVkIiwgaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQlJXX0FSRl9BQ0NVTVVMQVRPUjoKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgImFjYyVkIiwgaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQlJXX0FSRl9GTEFHOgorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiZiVkLiVkIiwgaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5uciAmIDB4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJhcmYlZC4lZCIsIGluc3QtPmRzdC5maXhlZF9od19yZWcubnIgJiAweGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJod19yZWclZCIsIGluc3QtPmRzdC5maXhlZF9od19yZWcubnIpOworICAgICAgfQorICAgICAgaWYgKGluc3QtPmRzdC5maXhlZF9od19yZWcuc3VibnIpCisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIrJWQiLCBpbnN0LT5kc3QuZml4ZWRfaHdfcmVnLnN1Ym5yKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBCQURfRklMRToKKyAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIihudWxsKSIpOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiPz8/Iik7CisgICAgICBicmVhazsKKyAgIH0KKyAgIGlmIChpbnN0LT5kc3Qud3JpdGVtYXNrICE9IFdSSVRFTUFTS19YWVpXKSB7CisgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIuIik7CisgICAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmIDEpCisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJ4Iik7CisgICAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmIDIpCisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJ5Iik7CisgICAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmIDQpCisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJ6Iik7CisgICAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmIDgpCisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJ3Iik7CisgICB9CisgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICI6JXMsICIsIGJyd19yZWdfdHlwZV9sZXR0ZXJzKGluc3QtPmRzdC50eXBlKSk7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgMyAmJiBpbnN0LT5zcmNbaV0uZmlsZSAhPSBCQURfRklMRTsgaSsrKSB7CisgICAgICBpZiAoaW5zdC0+c3JjW2ldLm5lZ2F0ZSkKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIi0iKTsKKyAgICAgIGlmIChpbnN0LT5zcmNbaV0uYWJzKQorICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAifCIpOworICAgICAgc3dpdGNoIChpbnN0LT5zcmNbaV0uZmlsZSkgeworICAgICAgY2FzZSBHUkY6CisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJ2Z3JmJWQiLCBpbnN0LT5zcmNbaV0ucmVnKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBVFRSOgorICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiYXR0ciVkIiwgaW5zdC0+c3JjW2ldLnJlZyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVU5JRk9STToKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgInUlZCIsIGluc3QtPnNyY1tpXS5yZWcpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElNTToKKyAgICAgICAgIHN3aXRjaCAoaW5zdC0+c3JjW2ldLnR5cGUpIHsKKyAgICAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRjoKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiVmRiIsIGluc3QtPnNyY1tpXS5pbW0uZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRDoKKyAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiVkRCIsIGluc3QtPnNyY1tpXS5pbW0uaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVUQ6CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIldVUiLCBpbnN0LT5zcmNbaV0uaW1tLnUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiPz8/Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIV19SRUc6CisgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5uZWdhdGUpCisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICItIik7CisgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5hYnMpCisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJ8Iik7CisgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5maWxlID09IEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSkgeworICAgICAgICAgICAgc3dpdGNoIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLm5yKSB7CisgICAgICAgICAgICBjYXNlIEJSV19BUkZfTlVMTDoKKyAgICAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIm51bGwiKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCUldfQVJGX0FERFJFU1M6CisgICAgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJhMC4lZCIsIGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJSV19BUkZfQUNDVU1VTEFUT1I6CisgICAgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJhY2MlZCIsIGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJSV19BUkZfRkxBRzoKKyAgICAgICAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgImYlZC4lZCIsIGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcubnIgJiAweGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiYXJmJWQuJWQiLCBpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLm5yICYgMHhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPnNyY1tpXS5maXhlZF9od19yZWcuc3VibnIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiaHdfcmVnJWQiLCBpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLm5yKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZml4ZWRfaHdfcmVnLnN1Ym5yKQorICAgICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiKyVkIiwgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5zdWJucik7CisgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZy5hYnMpCisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICJ8Iik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQkFEX0ZJTEU6CisgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIobnVsbCkiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIj8/PyIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICh2aXJ0dWFsX2dyZl9zaXplc1tpbnN0LT5zcmNbaV0ucmVnXSAhPSAxKQorICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiLiVkIiwgaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQpOworCisgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gSU1NKSB7CisgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqY2hhbnNbNF0gPSB7IngiLCAieSIsICJ6IiwgIncifTsKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIi4iKTsKKyAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICBzdHJpbmcgKz0gc3ByaW50ZihzdHJpbmcsICIlcyIsIGNoYW5zW0JSV19HRVRfU1daKGluc3QtPnNyY1tpXS5zd2l6emxlLCBjKV0pOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaW5zdC0+c3JjW2ldLmFicykKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgInwiKTsKKworICAgICAgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IElNTSkgeworICAgICAgICAgc3RyaW5nICs9IHNwcmludGYoc3RyaW5nLCAiOiVzIiwgYnJ3X3JlZ190eXBlX2xldHRlcnMoaW5zdC0+c3JjW2ldLnR5cGUpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPCAyICYmIGluc3QtPnNyY1tpICsgMV0uZmlsZSAhPSBCQURfRklMRSkKKyAgICAgICAgIHN0cmluZyArPSBzcHJpbnRmKHN0cmluZywgIiwgIik7CisgICB9Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnJ3X3JlZworYXR0cmlidXRlX3RvX2h3X3JlZyhpbnQgYXR0ciwgYm9vbCBpbnRlcmxlYXZlZCkKK3sKKyAgIGlmIChpbnRlcmxlYXZlZCkKKyAgICAgIHJldHVybiBzdHJpZGUoYnJ3X3ZlYzRfZ3JmKGF0dHIgLyAyLCAoYXR0ciAlIDIpICogNCksIDAsIDQsIDEpOworICAgZWxzZQorICAgICAgcmV0dXJuIGJyd192ZWM4X2dyZihhdHRyLCAwKTsKK30KKworCisvKioKKyAqIFJlcGxhY2UgZWFjaCByZWdpc3RlciBvZiB0eXBlIEFUVFIgaW4gdGhpcy0+aW5zdHJ1Y3Rpb25zIHdpdGggYSByZWZlcmVuY2UKKyAqIHRvIGEgZml4ZWQgSFcgcmVnaXN0ZXIuCisgKgorICogSWYgaW50ZXJsZWF2ZWQgaXMgdHJ1ZSwgdGhlbiBlYWNoIGF0dHJpYnV0ZSB0YWtlcyB1cCBoYWxmIGEgcmVnaXN0ZXIsIHdpdGgKKyAqIHJlZ2lzdGVyIE4gY29udGFpbmluZyBhdHRyaWJ1dGUgMipOIGluIGl0cyBmaXJzdCBoYWxmIGFuZCBhdHRyaWJ1dGUgMipOKzEKKyAqIGluIGl0cyBzZWNvbmQgaGFsZiAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgcGF5bG9hZCBzZXR1cCB1c2VkIGJ5IGdlb21ldHJ5CisgKiBzaGFkZXJzIGluICJzaW5nbGUiIG9yICJkdWFsIGluc3RhbmNlZCIgZGlzcGF0Y2ggbW9kZSkuICBJZiBpbnRlcmxlYXZlZCBpcworICogZmFsc2UsIHRoZW4gZWFjaCBhdHRyaWJ1dGUgdGFrZXMgdXAgYSB3aG9sZSByZWdpc3Rlciwgd2l0aCByZWdpc3RlciBOCisgKiBjb250YWluaW5nIGF0dHJpYnV0ZSBOICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBwYXlsb2FkIHNldHVwIHVzZWQgYnkKKyAqIHZlcnRleCBzaGFkZXJzLCBhbmQgYnkgZ2VvbWV0cnkgc2hhZGVycyBpbiAiZHVhbCBvYmplY3QiIGRpc3BhdGNoIG1vZGUpLgorICovCit2b2lkCit2ZWM0X3Zpc2l0b3I6Omxvd2VyX2F0dHJpYnV0ZXNfdG9faHdfcmVncyhjb25zdCBpbnQgKmF0dHJpYnV0ZV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVybGVhdmVkKQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIC8qIFdlIGhhdmUgdG8gc3VwcG9ydCBBVFRSIGFzIGEgZGVzdGluYXRpb24gZm9yIEdMX0ZJWEVEIGZpeHVwLiAqLworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEFUVFIpIHsKKwkgaW50IGdyZiA9IGF0dHJpYnV0ZV9tYXBbaW5zdC0+ZHN0LnJlZyArIGluc3QtPmRzdC5yZWdfb2Zmc2V0XTsKKworICAgICAgICAgLyogQWxsIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgc2hhZGVyIG5lZWQgdG8gaGF2ZSBiZWVuIGFzc2lnbmVkIGEKKyAgICAgICAgICAqIGhhcmR3YXJlIHJlZ2lzdGVyIGJ5IHRoZSBjYWxsZXIKKyAgICAgICAgICAqLworICAgICAgICAgYXNzZXJ0KGdyZiAhPSAwKTsKKworCSBzdHJ1Y3QgYnJ3X3JlZyByZWcgPSBhdHRyaWJ1dGVfdG9faHdfcmVnKGdyZiwgaW50ZXJsZWF2ZWQpOworCSByZWcudHlwZSA9IGluc3QtPmRzdC50eXBlOworCSByZWcuZHcxLmJpdHMud3JpdGVtYXNrID0gaW5zdC0+ZHN0LndyaXRlbWFzazsKKworCSBpbnN0LT5kc3QuZmlsZSA9IEhXX1JFRzsKKwkgaW5zdC0+ZHN0LmZpeGVkX2h3X3JlZyA9IHJlZzsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkgaWYgKGluc3QtPnNyY1tpXS5maWxlICE9IEFUVFIpCisJICAgIGNvbnRpbnVlOworCisJIGludCBncmYgPSBhdHRyaWJ1dGVfbWFwW2luc3QtPnNyY1tpXS5yZWcgKyBpbnN0LT5zcmNbaV0ucmVnX29mZnNldF07CisKKyAgICAgICAgIC8qIEFsbCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIHNoYWRlciBuZWVkIHRvIGhhdmUgYmVlbiBhc3NpZ25lZCBhCisgICAgICAgICAgKiBoYXJkd2FyZSByZWdpc3RlciBieSB0aGUgY2FsbGVyCisgICAgICAgICAgKi8KKyAgICAgICAgIGFzc2VydChncmYgIT0gMCk7CisKKwkgc3RydWN0IGJyd19yZWcgcmVnID0gYXR0cmlidXRlX3RvX2h3X3JlZyhncmYsIGludGVybGVhdmVkKTsKKwkgcmVnLmR3MS5iaXRzLnN3aXp6bGUgPSBpbnN0LT5zcmNbaV0uc3dpenpsZTsKKyAgICAgICAgIHJlZy50eXBlID0gaW5zdC0+c3JjW2ldLnR5cGU7CisJIGlmIChpbnN0LT5zcmNbaV0uYWJzKQorCSAgICByZWcgPSBicndfYWJzKHJlZyk7CisJIGlmIChpbnN0LT5zcmNbaV0ubmVnYXRlKQorCSAgICByZWcgPSBuZWdhdGUocmVnKTsKKworCSBpbnN0LT5zcmNbaV0uZmlsZSA9IEhXX1JFRzsKKwkgaW5zdC0+c3JjW2ldLmZpeGVkX2h3X3JlZyA9IHJlZzsKKyAgICAgIH0KKyAgIH0KK30KKworaW50Cit2ZWM0X3ZzX3Zpc2l0b3I6OnNldHVwX2F0dHJpYnV0ZXMoaW50IHBheWxvYWRfcmVnKQoreworICAgaW50IG5yX2F0dHJpYnV0ZXM7CisgICBpbnQgYXR0cmlidXRlX21hcFtWRVJUX0FUVFJJQl9NQVggKyAxXTsKKyAgIG1lbXNldChhdHRyaWJ1dGVfbWFwLCAwLCBzaXplb2YoYXR0cmlidXRlX21hcCkpOworCisgICBucl9hdHRyaWJ1dGVzID0gMDsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkVSVF9BVFRSSUJfTUFYOyBpKyspIHsKKyAgICAgIGlmICh2c19wcm9nX2RhdGEtPmlucHV0c19yZWFkICYgQklURklFTEQ2NF9CSVQoaSkpIHsKKwkgYXR0cmlidXRlX21hcFtpXSA9IHBheWxvYWRfcmVnICsgbnJfYXR0cmlidXRlczsKKwkgbnJfYXR0cmlidXRlcysrOworICAgICAgfQorICAgfQorCisgICAvKiBWZXJ0ZXhJRCBpcyBzdG9yZWQgYnkgdGhlIFZGIGFzIHRoZSBsYXN0IHZlcnRleCBlbGVtZW50LCBidXQgd2UKKyAgICAqIGRvbid0IHJlcHJlc2VudCBpdCB3aXRoIGEgZmxhZyBpbiBpbnB1dHNfcmVhZCwgc28gd2UgY2FsbCBpdAorICAgICogVkVSVF9BVFRSSUJfTUFYLgorICAgICovCisgICBpZiAodnNfcHJvZ19kYXRhLT51c2VzX3ZlcnRleGlkIHx8IHZzX3Byb2dfZGF0YS0+dXNlc19pbnN0YW5jZWlkKSB7CisgICAgICBhdHRyaWJ1dGVfbWFwW1ZFUlRfQVRUUklCX01BWF0gPSBwYXlsb2FkX3JlZyArIG5yX2F0dHJpYnV0ZXM7CisgICAgICBucl9hdHRyaWJ1dGVzKys7CisgICB9CisKKyAgIGxvd2VyX2F0dHJpYnV0ZXNfdG9faHdfcmVncyhhdHRyaWJ1dGVfbWFwLCBmYWxzZSAvKiBpbnRlcmxlYXZlZCAqLyk7CisKKyAgIC8qIFRoZSBCU3BlYyBzYXlzIHdlIGFsd2F5cyBoYXZlIHRvIHJlYWQgYXQgbGVhc3Qgb25lIHRoaW5nIGZyb20KKyAgICAqIHRoZSBWRiwgYW5kIGl0IGFwcGVhcnMgdGhhdCB0aGUgaGFyZHdhcmUgd2VkZ2VzIG90aGVyd2lzZS4KKyAgICAqLworICAgaWYgKG5yX2F0dHJpYnV0ZXMgPT0gMCkKKyAgICAgIG5yX2F0dHJpYnV0ZXMgPSAxOworCisgICBwcm9nX2RhdGEtPnVyYl9yZWFkX2xlbmd0aCA9IChucl9hdHRyaWJ1dGVzICsgMSkgLyAyOworCisgICB1bnNpZ25lZCB2dWVfZW50cmllcyA9CisgICAgICBNQVgyKG5yX2F0dHJpYnV0ZXMsIHByb2dfZGF0YS0+dnVlX21hcC5udW1fc2xvdHMpOworCisgICBpZiAoYnJ3LT5nZW4gPT0gNikKKyAgICAgIHByb2dfZGF0YS0+dXJiX2VudHJ5X3NpemUgPSBBTElHTih2dWVfZW50cmllcywgOCkgLyA4OworICAgZWxzZQorICAgICAgcHJvZ19kYXRhLT51cmJfZW50cnlfc2l6ZSA9IEFMSUdOKHZ1ZV9lbnRyaWVzLCA0KSAvIDQ7CisKKyAgIHJldHVybiBwYXlsb2FkX3JlZyArIG5yX2F0dHJpYnV0ZXM7Cit9CisKK2ludAordmVjNF92aXNpdG9yOjpzZXR1cF91bmlmb3JtcyhpbnQgcmVnKQoreworICAgcHJvZ19kYXRhLT5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnID0gcmVnOworCisgICAvKiBUaGUgcHJlLWdlbjYgVlMgcmVxdWlyZXMgdGhhdCBzb21lIHB1c2ggY29uc3RhbnRzIGdldCBsb2FkZWQgbm8KKyAgICAqIG1hdHRlciB3aGF0LCBvciB0aGUgR1BVIHdvdWxkIGhhbmcuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA8IDYgJiYgdGhpcy0+dW5pZm9ybXMgPT0gMCkgeworICAgICAgYXNzZXJ0KHRoaXMtPnVuaWZvcm1zIDwgdGhpcy0+dW5pZm9ybV9hcnJheV9zaXplKTsKKyAgICAgIHRoaXMtPnVuaWZvcm1fdmVjdG9yX3NpemVbdGhpcy0+dW5pZm9ybXNdID0gMTsKKworICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5wYXJhbSA9CisgICAgICAgICByZXJhbGxvYyhOVUxMLCBzdGFnZV9wcm9nX2RhdGEtPnBhcmFtLCBjb25zdCBmbG9hdCAqLCA0KTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJIHVuc2lnbmVkIGludCBzbG90ID0gdGhpcy0+dW5pZm9ybXMgKiA0ICsgaTsKKwkgc3RhdGljIGZsb2F0IHplcm8gPSAwLjA7CisJIHN0YWdlX3Byb2dfZGF0YS0+cGFyYW1bc2xvdF0gPSAmemVybzsKKyAgICAgIH0KKworICAgICAgdGhpcy0+dW5pZm9ybXMrKzsKKyAgICAgIHJlZysrOworICAgfSBlbHNlIHsKKyAgICAgIHJlZyArPSBBTElHTih1bmlmb3JtcywgMikgLyAyOworICAgfQorCisgICBzdGFnZV9wcm9nX2RhdGEtPm5yX3BhcmFtcyA9IHRoaXMtPnVuaWZvcm1zICogNDsKKworICAgcHJvZ19kYXRhLT5jdXJiX3JlYWRfbGVuZ3RoID0gcmVnIC0gcHJvZ19kYXRhLT5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnOworCisgICByZXR1cm4gcmVnOworfQorCit2b2lkCit2ZWM0X3ZzX3Zpc2l0b3I6OnNldHVwX3BheWxvYWQodm9pZCkKK3sKKyAgIGludCByZWcgPSAwOworCisgICAvKiBUaGUgcGF5bG9hZCBhbHdheXMgY29udGFpbnMgaW1wb3J0YW50IGRhdGEgaW4gZzAsIHdoaWNoIGNvbnRhaW5zCisgICAgKiB0aGUgVVJCIGhhbmRsZXMgdGhhdCBhcmUgcGFzc2VkIG9uIHRvIHRoZSBVUkIgd3JpdGUgYXQgdGhlIGVuZAorICAgICogb2YgdGhlIHRocmVhZC4gIFNvLCB3ZSBhbHdheXMgc3RhcnQgcHVzaCBjb25zdGFudHMgYXQgZzEuCisgICAgKi8KKyAgIHJlZysrOworCisgICByZWcgPSBzZXR1cF91bmlmb3JtcyhyZWcpOworCisgICByZWcgPSBzZXR1cF9hdHRyaWJ1dGVzKHJlZyk7CisKKyAgIHRoaXMtPmZpcnN0X25vbl9wYXlsb2FkX2dyZiA9IHJlZzsKK30KKworLy8gTHVuYXJHIDogVE9ETyAtIHNoYWRlciB0aW1lPz8KKy8vc3JjX3JlZworLy92ZWM0X3Zpc2l0b3I6OmdldF90aW1lc3RhbXAoKQorLy97CisvLyAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKworLy8gICBzcmNfcmVnIHRzID0gc3JjX3JlZyhicndfcmVnKEJSV19BUkNISVRFQ1RVUkVfUkVHSVNURVJfRklMRSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfQVJGX1RJTUVTVEFNUCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19SRUdJU1RFUl9UWVBFX1VELAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19WRVJUSUNBTF9TVFJJREVfMCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfV0lEVEhfNCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfSE9SSVpPTlRBTF9TVFJJREVfNCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfU1dJWlpMRV9YWVpXLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19YWVpXKSk7CisKKy8vICAgZHN0X3JlZyBkc3QgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSk7CisKKy8vICAgdmVjNF9pbnN0cnVjdGlvbiAqbW92ID0gZW1pdChNT1YoZHN0LCB0cykpOworLy8gICAvKiBXZSB3YW50IHRvIHJlYWQgdGhlIDMgZmllbGRzIHdlIGNhcmUgYWJvdXQgKG1vc3RseSBmaWVsZCAwLCBidXQgYWxzbyAyKQorLy8gICAgKiBldmVuIGlmIGl0J3Mgbm90IGVuYWJsZWQgaW4gdGhlIGRpc3BhdGNoLgorLy8gICAgKi8KKy8vICAgbW92LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKworLy8gICByZXR1cm4gc3JjX3JlZyhkc3QpOworLy99CisKKy8vdm9pZAorLy92ZWM0X3Zpc2l0b3I6OmVtaXRfc2hhZGVyX3RpbWVfYmVnaW4oKQorLy97CisvLyAgIGN1cnJlbnRfYW5ub3RhdGlvbiA9ICJzaGFkZXIgdGltZSBzdGFydCI7CisvLyAgIHNoYWRlcl9zdGFydF90aW1lID0gZ2V0X3RpbWVzdGFtcCgpOworLy99CisKKy8vIEx1bmFyRyA6IFRPRE8gLSBzaGFkZXIgdGltZT8/CisvL3ZvaWQKKy8vdmVjNF92aXNpdG9yOjplbWl0X3NoYWRlcl90aW1lX2VuZCgpCisvL3sKKy8vICAgY3VycmVudF9hbm5vdGF0aW9uID0gInNoYWRlciB0aW1lIGVuZCI7CisvLyAgIHNyY19yZWcgc2hhZGVyX2VuZF90aW1lID0gZ2V0X3RpbWVzdGFtcCgpOworCisKKy8vICAgLyogQ2hlY2sgdGhhdCB0aGVyZSB3ZXJlbid0IGFueSB0aW1lc3RhbXAgcmVzZXQgZXZlbnRzIChhc3N1bWluZyB0aGVzZQorLy8gICAgKiB3ZXJlIHRoZSBvbmx5IHR3byB0aW1lc3RhbXAgcmVhZHMgdGhhdCBoYXBwZW5lZCkuCisvLyAgICAqLworLy8gICBzcmNfcmVnIHJlc2V0X2VuZCA9IHNoYWRlcl9lbmRfdGltZTsKKy8vICAgcmVzZXRfZW5kLnN3aXp6bGUgPSBCUldfU1dJWlpMRV9aWlpaOworLy8gICB2ZWM0X2luc3RydWN0aW9uICp0ZXN0ID0gZW1pdChBTkQoZHN0X251bGxfZCgpLCByZXNldF9lbmQsIHNyY19yZWcoMXUpKSk7CisvLyAgIHRlc3QtPmNvbmRpdGlvbmFsX21vZCA9IEJSV19DT05ESVRJT05BTF9aOworCisvLyAgIGVtaXQoSUYoQlJXX1BSRURJQ0FURV9OT1JNQUwpKTsKKworLy8gICAvKiBUYWtlIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhbmQgZ2V0IHRoZSBkZWx0YS4gKi8KKy8vICAgc2hhZGVyX3N0YXJ0X3RpbWUubmVnYXRlID0gdHJ1ZTsKKy8vICAgZHN0X3JlZyBkaWZmID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisvLyAgIGVtaXQoQUREKGRpZmYsIHNoYWRlcl9zdGFydF90aW1lLCBzaGFkZXJfZW5kX3RpbWUpKTsKKworLy8gICAvKiBJZiB0aGVyZSB3ZXJlIG5vIGluc3RydWN0aW9ucyBiZXR3ZWVuIHRoZSB0d28gdGltZXN0YW1wIGdldHMsIHRoZSBkaWZmCisvLyAgICAqIGlzIDIgY3ljbGVzLiAgUmVtb3ZlIHRoYXQgb3ZlcmhlYWQsIHNvIEkgY2FuIGZvcmdldCBhYm91dCB0aGF0IHdoZW4KKy8vICAgICogdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgdGltZSB0YWtlbiBmb3Igc2luZ2xlIGluc3RydWN0aW9ucy4KKy8vICAgICovCisvLyAgIGVtaXQoQUREKGRpZmYsIHNyY19yZWcoZGlmZiksIHNyY19yZWcoLTJ1KSkpOworCisvLyAgIGVtaXRfc2hhZGVyX3RpbWVfd3JpdGUoc3RfYmFzZSwgc3JjX3JlZyhkaWZmKSk7CisvLyAgIGVtaXRfc2hhZGVyX3RpbWVfd3JpdGUoc3Rfd3JpdHRlbiwgc3JjX3JlZygxdSkpOworLy8gICBlbWl0KEJSV19PUENPREVfRUxTRSk7CisvLyAgIGVtaXRfc2hhZGVyX3RpbWVfd3JpdGUoc3RfcmVzZXQsIHNyY19yZWcoMXUpKTsKKy8vICAgZW1pdChCUldfT1BDT0RFX0VORElGKTsKKy8vfQorCisvLyBMdW5hckcgOiBUT0RPIC0gc2hhZGVyIHRpbWU/PworLy92b2lkCisvL3ZlYzRfdmlzaXRvcjo6ZW1pdF9zaGFkZXJfdGltZV93cml0ZShlbnVtIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHR5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmVnIHZhbHVlKQorLy97CisvLyAgIGludCBzaGFkZXJfdGltZV9pbmRleCA9CisvLyAgICAgIGJyd19nZXRfc2hhZGVyX3RpbWVfaW5kZXgoYnJ3LCBzaGFkZXJfcHJvZywgcHJvZywgdHlwZSk7CisKKy8vICAgZHN0X3JlZyBkc3QgPQorLy8gICAgICBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6Z2V0X2FycmF5X2luc3RhbmNlKGdsc2xfdHlwZTo6dmVjNF90eXBlLCAyKSk7CisKKy8vICAgZHN0X3JlZyBvZmZzZXQgPSBkc3Q7CisvLyAgIGRzdF9yZWcgdGltZSA9IGRzdDsKKy8vICAgdGltZS5yZWdfb2Zmc2V0Kys7CisKKy8vICAgb2Zmc2V0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9VRDsKKy8vICAgZW1pdChNT1Yob2Zmc2V0LCBzcmNfcmVnKHNoYWRlcl90aW1lX2luZGV4ICogU0hBREVSX1RJTUVfU1RSSURFKSkpOworCisvLyAgIHRpbWUudHlwZSA9IEJSV19SRUdJU1RFUl9UWVBFX1VEOworLy8gICBlbWl0KE1PVih0aW1lLCBzcmNfcmVnKHZhbHVlKSkpOworCisvLyAgIGVtaXQoU0hBREVSX09QQ09ERV9TSEFERVJfVElNRV9BREQsIGRzdF9yZWcoKSwgc3JjX3JlZyhkc3QpKTsKKy8vfQorCitib29sCit2ZWM0X3Zpc2l0b3I6OnJ1bigpCit7CisgICBzYW5pdHlfcGFyYW1fY291bnQgPSBwcm9nLT5QYXJhbWV0ZXJzLT5OdW1QYXJhbWV0ZXJzOworCisvLyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NIQURFUl9USU1FKQorLy8gICAgICBlbWl0X3NoYWRlcl90aW1lX2JlZ2luKCk7CisKKyAgIGFzc2lnbl9jb21tb25fYmluZGluZ190YWJsZV9vZmZzZXRzKDApOworCisgICBlbWl0X3Byb2xvZygpOworCisgICAvKiBHZW5lcmF0ZSBWUyBJUiBmb3IgbWFpbigpLiAgKHRoZSB2aXNpdG9yIG9ubHkgZGVzY2VuZHMgaW50bworICAgICogZnVuY3Rpb25zIGNhbGxlZCAibWFpbiIpLgorICAgICovCisvLyAgIGlmIChzaGFkZXIpIHsKKyAgICAgIGFzc2VydChzaGFkZXIpOworICAgICAgdmlzaXRfaW5zdHJ1Y3Rpb25zKHNoYWRlci0+YmFzZS5pcik7CisvLyAgIH0gZWxzZSB7CisvLyAgICAgIGVtaXRfcHJvZ3JhbV9jb2RlKCk7CisvLyAgIH0KKyAgIGJhc2VfaXIgPSBOVUxMOworCisgICBpZiAoa2V5LT51c2VyY2xpcF9hY3RpdmUgJiYgIXByb2ctPlVzZXNDbGlwRGlzdGFuY2VPdXQpCisgICAgICBzZXR1cF91bmlmb3JtX2NsaXBwbGFuZV92YWx1ZXMoKTsKKworICAgZW1pdF90aHJlYWRfZW5kKCk7CisKKyAgIC8qIEJlZm9yZSBhbnkgb3B0aW1pemF0aW9uLCBwdXNoIGFycmF5IGFjY2Vzc2VzIG91dCB0byBzY3JhdGNoCisgICAgKiBzcGFjZSB3aGVyZSB3ZSBuZWVkIHRoZW0gdG8gYmUuICBUaGlzIHBhc3MgbWF5IGFsbG9jYXRlIG5ldworICAgICogdmlydHVhbCBHUkZzLCBzbyB3ZSB3YW50IHRvIGRvIGl0IGVhcmx5LiAgSXQgYWxzbyBtYWtlcyBzdXJlCisgICAgKiB0aGF0IHdlIGhhdmUgcmVsYWRkciBjb21wdXRhdGlvbnMgYXZhaWxhYmxlIGZvciBDU0UsIHNpbmNlIHdlJ2xsCisgICAgKiBvZnRlbiBkbyByZXBlYXRlZCBzdWJleHByZXNzaW9ucyBmb3IgdGhvc2UuCisgICAgKi8KKyAgIGlmIChzaGFkZXIpIHsKKyAgICAgIG1vdmVfZ3JmX2FycmF5X2FjY2Vzc190b19zY3JhdGNoKCk7CisgICAgICBtb3ZlX3VuaWZvcm1fYXJyYXlfYWNjZXNzX3RvX3B1bGxfY29uc3RhbnRzKCk7CisgICB9IGVsc2UgeworICAgICAgLyogVGhlIEFSQl92ZXJ0ZXhfcHJvZ3JhbSBmcm9udGVuZCBlbWl0cyBwdWxsIGNvbnN0YW50IGxvYWRzIGRpcmVjdGx5CisgICAgICAgKiByYXRoZXIgdGhhbiB1c2luZyByZWxhZGRyLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhbGsgdGhyb3VnaCBhbGwgdGhlCisgICAgICAgKiBpbnN0cnVjdGlvbnMgbG9va2luZyBmb3IgdGhpbmdzIHRvIG1vdmUuICBUaGVyZSBpc24ndCBhbnl0aGluZy4KKyAgICAgICAqCisgICAgICAgKiBXZSBkbyBzdGlsbCBuZWVkIHRvIHNwbGl0IHRoaW5ncyB0byB2ZWM0IHNpemUuCisgICAgICAgKi8KKyAgICAgIHNwbGl0X3VuaWZvcm1fcmVnaXN0ZXJzKCk7CisgICB9CisgICBwYWNrX3VuaWZvcm1fcmVnaXN0ZXJzKCk7CisgICBtb3ZlX3B1c2hfY29uc3RhbnRzX3RvX3B1bGxfY29uc3RhbnRzKCk7CisgICBzcGxpdF92aXJ0dWFsX2dyZnMoKTsKKworICAgYm9vbCBwcm9ncmVzczsKKyAgIGRvIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisgICAgICBwcm9ncmVzcyA9IGRlYWRfY29kZV9lbGltaW5hdGUoKSB8fCBwcm9ncmVzczsKKyAgICAgIHByb2dyZXNzID0gZGVhZF9jb250cm9sX2Zsb3dfZWxpbWluYXRlKHRoaXMpIHx8IHByb2dyZXNzOworICAgICAgcHJvZ3Jlc3MgPSBvcHRfY29weV9wcm9wYWdhdGlvbigpIHx8IHByb2dyZXNzOworICAgICAgcHJvZ3Jlc3MgPSBvcHRfYWxnZWJyYWljKCkgfHwgcHJvZ3Jlc3M7CisgICAgICBwcm9ncmVzcyA9IG9wdF9yZWdpc3Rlcl9jb2FsZXNjZSgpIHx8IHByb2dyZXNzOworICAgfSB3aGlsZSAocHJvZ3Jlc3MpOworCisKKyAgIGlmIChmYWlsZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHNldHVwX3BheWxvYWQoKTsKKworICAgaWYgKGZhbHNlKSB7CisgICAgICAvKiBEZWJ1ZyBvZiByZWdpc3RlciBzcGlsbGluZzogR28gc3BpbGwgZXZlcnl0aGluZy4gKi8KKyAgICAgIGNvbnN0IGludCBncmZfY291bnQgPSB2aXJ0dWFsX2dyZl9jb3VudDsKKyAgICAgIGZsb2F0IHNwaWxsX2Nvc3RzW3ZpcnR1YWxfZ3JmX2NvdW50XTsKKyAgICAgIGJvb2wgbm9fc3BpbGxbdmlydHVhbF9ncmZfY291bnRdOworICAgICAgZXZhbHVhdGVfc3BpbGxfY29zdHMoc3BpbGxfY29zdHMsIG5vX3NwaWxsKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JmX2NvdW50OyBpKyspIHsKKyAgICAgICAgIGlmIChub19zcGlsbFtpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgc3BpbGxfcmVnKGkpOworICAgICAgfQorICAgfQorCisgICB3aGlsZSAoIXJlZ19hbGxvY2F0ZSgpKSB7CisgICAgICBpZiAoZmFpbGVkKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBvcHRfc2NoZWR1bGVfaW5zdHJ1Y3Rpb25zKFNDSEVEVUxFX1BSRV9JUFNfVERfSEkpOworCisKKyAgIG9wdF9zZXRfZGVwZW5kZW5jeV9jb250cm9sKCk7CisKKyAgIC8qIElmIGFueSBzdGF0ZSBwYXJhbWV0ZXJzIHdlcmUgYXBwZW5kZWQsIHRoZW4gUGFyYW1ldGVyVmFsdWVzIGNvdWxkIGhhdmUKKyAgICAqIGJlZW4gcmVhbGxvY2VkLCBpbiB3aGljaCBjYXNlIHRoZSBkcml2ZXIgdW5pZm9ybSBzdG9yYWdlIHNldCB1cCBieQorICAgICogX21lc2FfYXNzb2NpYXRlX3VuaWZvcm1fc3RvcmFnZSgpIHdvdWxkIHBvaW50IHRvIGZyZWVkIG1lbW9yeS4gIE1ha2UKKyAgICAqIHN1cmUgdGhhdCBkaWRuJ3QgaGFwcGVuLgorICAgICovCisgICBhc3NlcnQoc2FuaXR5X3BhcmFtX2NvdW50ID09IHByb2ctPlBhcmFtZXRlcnMtPk51bVBhcmFtZXRlcnMpOworCisgICByZXR1cm4gIWZhaWxlZDsKK30KKworfSAvKiBuYW1lc3BhY2UgYnJ3ICovCisKK2V4dGVybiAiQyIgeworCisvKioKKyAqIENvbXBpbGUgYSB2ZXJ0ZXggc2hhZGVyLgorICoKKyAqIFJldHVybnMgdGhlIGZpbmFsIGFzc2VtYmx5IGFuZCB0aGUgcHJvZ3JhbSdzIHNpemUuCisgKi8KK2NvbnN0IHVuc2lnbmVkICoKK2Jyd192c19lbWl0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgc3RydWN0IGJyd192c19jb21waWxlICpjLAorICAgICAgICAgICAgc3RydWN0IGJyd192c19wcm9nX2RhdGEgKnByb2dfZGF0YSwKKyAgICAgICAgICAgIHZvaWQgKm1lbV9jdHgsCisgICAgICAgICAgICB1bnNpZ25lZCAqZmluYWxfYXNzZW1ibHlfc2l6ZSkKK3sKKy8vICAgYm9vbCBzdGFydF9idXN5ID0gZmFsc2U7CisvLyAgIGRvdWJsZSBzdGFydF90aW1lID0gMDsKKworLy8gICBpZiAodW5saWtlbHkoYnJ3LT5wZXJmX2RlYnVnKSkgeworLy8gICAgICBzdGFydF9idXN5ID0gKGJydy0+YmF0Y2gubGFzdF9ibyAmJgorLy8gICAgICAgICAgICAgICAgICAgIGRybV9pbnRlbF9ib19idXN5KGJydy0+YmF0Y2gubGFzdF9ibykpOworLy8gICAgICBzdGFydF90aW1lID0gZ2V0X3RpbWUoKTsKKy8vICAgfQorCisgICBzdHJ1Y3QgYnJ3X3NoYWRlciAqc2hhZGVyID0gTlVMTDsKKyAgIGlmIChwcm9nKQorICAgICAgc2hhZGVyID0gKGJyd19zaGFkZXIgKikgcHJvZy0+X0xpbmtlZFNoYWRlcnNbTUVTQV9TSEFERVJfVkVSVEVYXTsKKworICAgaWYgKHVubGlrZWx5KElOVEVMX0RFQlVHICYgREVCVUdfVlMpKQorICAgICAgYnJ3X2R1bXBfaXIoYnJ3LCAidmVydGV4IiwgcHJvZywgJnNoYWRlci0+YmFzZSwgJmMtPnZwLT5wcm9ncmFtLkJhc2UpOworCisgICB2ZWM0X3ZzX3Zpc2l0b3IgdihicncsIGMsIHByb2dfZGF0YSwgcHJvZywgbWVtX2N0eCk7CisgICBpZiAoIXYucnVuKCkpIHsKKyAgICAgIGlmIChwcm9nKSB7CisgICAgICAgICBwcm9nLT5MaW5rU3RhdHVzID0gZmFsc2U7CisgICAgICAgICByYWxsb2Nfc3RyY2F0KCZwcm9nLT5JbmZvTG9nLCB2LmZhaWxfbXNnKTsKKyAgICAgIH0KKworICAgICAgX21lc2FfcHJvYmxlbShOVUxMLCAiRmFpbGVkIHRvIGNvbXBpbGUgdmVydGV4IHNoYWRlcjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHYuZmFpbF9tc2cpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgY29uc3QgdW5zaWduZWQgKmFzc2VtYmx5ID0gTlVMTDsKKyAgIGlmIChicnctPmdlbiA+PSA4KSB7CisvLyAgICAgIGdlbjhfdmVjNF9nZW5lcmF0b3IgZyhicncsIHByb2csICZjLT52cC0+cHJvZ3JhbS5CYXNlLCAmcHJvZ19kYXRhLT5iYXNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2N0eCwgSU5URUxfREVCVUcgJiBERUJVR19WUyk7CisvLyAgICAgIGFzc2VtYmx5ID0gZy5nZW5lcmF0ZV9hc3NlbWJseSgmdi5pbnN0cnVjdGlvbnMsIGZpbmFsX2Fzc2VtYmx5X3NpemUpOworICAgfSBlbHNlIHsKKyAgICAgIHZlYzRfZ2VuZXJhdG9yIGcoYnJ3LCBwcm9nLCAmYy0+dnAtPnByb2dyYW0uQmFzZSwgJnByb2dfZGF0YS0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVtX2N0eCwgSU5URUxfREVCVUcgJiBERUJVR19WUyk7CisgICAgICBhc3NlbWJseSA9IGcuZ2VuZXJhdGVfYXNzZW1ibHkoJnYuaW5zdHJ1Y3Rpb25zLCBmaW5hbF9hc3NlbWJseV9zaXplKTsKKyAgIH0KKworLy8gICBpZiAodW5saWtlbHkoYnJ3LT5wZXJmX2RlYnVnKSAmJiBzaGFkZXIpIHsKKy8vICAgICAgaWYgKHNoYWRlci0+Y29tcGlsZWRfb25jZSkgeworLy8gICAgICAgICBicndfdnNfZGVidWdfcmVjb21waWxlKGJydywgcHJvZywgJmMtPmtleSk7CisvLyAgICAgIH0KKy8vICAgICAgaWYgKHN0YXJ0X2J1c3kgJiYgIWRybV9pbnRlbF9ib19idXN5KGJydy0+YmF0Y2gubGFzdF9ibykpIHsKKy8vICAgICAgICAgcGVyZl9kZWJ1ZygiVlMgY29tcGlsZSB0b29rICUuMDNmIG1zIGFuZCBzdGFsbGVkIHRoZSBHUFVcbiIsCisvLyAgICAgICAgICAgICAgICAgICAgKGdldF90aW1lKCkgLSBzdGFydF90aW1lKSAqIDEwMDApOworLy8gICAgICB9CisvLyAgICAgIHNoYWRlci0+Y29tcGlsZWRfb25jZSA9IHRydWU7CisvLyAgIH0KKworICAgcmV0dXJuIGFzc2VtYmx5OworfQorCisKK3ZvaWQKK2Jyd192ZWM0X3NldHVwX3Byb2dfa2V5X2Zvcl9wcmVjb21waWxlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBpZCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICBrZXktPnByb2dyYW1fc3RyaW5nX2lkID0gaWQ7CisgICBrZXktPmNsYW1wX3ZlcnRleF9jb2xvciA9IGN0eC0+QVBJID09IEFQSV9PUEVOR0xfQ09NUEFUOworCisgICB1bnNpZ25lZCBzYW1wbGVyX2NvdW50ID0gX21lc2FfZmxzKHByb2ctPlNhbXBsZXJzVXNlZCk7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2FtcGxlcl9jb3VudDsgaSsrKSB7CisgICAgICBpZiAocHJvZy0+U2hhZG93U2FtcGxlcnMgJiAoMSA8PCBpKSkgeworICAgICAgICAgLyogQXNzdW1lIERFUFRIX1RFWFRVUkVfTU9ERSBpcyB0aGUgZGVmYXVsdDogWCwgWCwgWCwgMSAqLworICAgICAgICAga2V5LT50ZXguc3dpenpsZXNbaV0gPQorICAgICAgICAgICAgTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWCwgU1dJWlpMRV9YLCBTV0laWkxFX09ORSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgLyogQ29sb3Igc2FtcGxlcjogYXNzdW1lIG5vIHN3aXp6bGluZy4gKi8KKyAgICAgICAgIGtleS0+dGV4LnN3aXp6bGVzW2ldID0gU1dJWlpMRV9YWVpXOworICAgICAgfQorICAgfQorfQorCit9IC8qIGV4dGVybiAiQyIgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1M2RiOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNC5oCkBAIC0wLDAgKzEsODE0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBCUldfVkVDNF9ICisjZGVmaW5lIEJSV19WRUM0X0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImJyd19zaGFkZXIuaCIKKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAiYnJ3X3Byb2dyYW0uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfZXUuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBleHRlcm4gIkMiICovCisjaW5jbHVkZSAiZ2VuOF9nZW5lcmF0b3IuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ2xzbC9pci5oIgorCisKK3N0cnVjdCBicndfdmVjNF9jb21waWxlIHsKKyAgIEdMdWludCBsYXN0X3NjcmF0Y2g7IC8qKjwgbWVhc3VyZWQgaW4gMzItYnl0ZSAocmVnaXN0ZXIgc2l6ZSkgdW5pdHMgKi8KKworICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZzsKKworICAgdm9pZCAqbWVtX2N0eDsKKyAgIGNvbnN0IHVuc2lnbmVkICpwcm9ncmFtOworICAgdW5zaWduZWQgcHJvZ3JhbV9zaXplOworfTsKKworCitzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19rZXkgeworICAgR0x1aW50IHByb2dyYW1fc3RyaW5nX2lkOworCisgICAvKioKKyAgICAqIFRydWUgaWYgYXQgbGVhc3Qgb25lIGNsaXAgZmxhZyBpcyBlbmFibGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCisgICAgKiBzaGFkZXIgdXNlcyBjbGlwIHBsYW5lcyBvciBnbF9DbGlwRGlzdGFuY2UuCisgICAgKi8KKyAgIEdMdWludCB1c2VyY2xpcF9hY3RpdmU6MTsKKworICAgLyoqCisgICAgKiBIb3cgbWFueSB1c2VyIGNsaXBwaW5nIHBsYW5lcyBhcmUgYmVpbmcgdXBsb2FkZWQgdG8gdGhlIHZlcnRleCBzaGFkZXIgYXMKKyAgICAqIHB1c2ggY29uc3RhbnRzLgorICAgICovCisgICBHTHVpbnQgbnJfdXNlcmNsaXBfcGxhbmVfY29uc3RzOjQ7CisKKyAgIEdMdWludCBjbGFtcF92ZXJ0ZXhfY29sb3I6MTsKKworICAgc3RydWN0IGJyd19zYW1wbGVyX3Byb2dfa2V5X2RhdGEgdGV4OworfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3ZvaWQKK2Jyd192ZWM0X3NldHVwX3Byb2dfa2V5X2Zvcl9wcmVjb21waWxlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBpZCwgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworCituYW1lc3BhY2UgYnJ3IHsKKworY2xhc3MgZHN0X3JlZzsKKworY2xhc3MgdmVjNF9saXZlX3ZhcmlhYmxlczsKKwordW5zaWduZWQKK3N3aXp6bGVfZm9yX3NpemUoaW50IHNpemUpOworCitjbGFzcyByZWcKK3sKK3B1YmxpYzoKKyAgIC8qKiBSZWdpc3RlciBmaWxlOiBHUkYsIE1SRiwgSU1NLiAqLworICAgZW51bSByZWdpc3Rlcl9maWxlIGZpbGU7CisgICAvKiogdmlydHVhbCByZWdpc3RlciBudW1iZXIuICAwID0gZml4ZWQgaHcgcmVnICovCisgICBpbnQgcmVnOworICAgLyoqIE9mZnNldCB3aXRoaW4gdGhlIHZpcnR1YWwgcmVnaXN0ZXIuICovCisgICBpbnQgcmVnX29mZnNldDsKKyAgIC8qKiBSZWdpc3RlciB0eXBlLiAgQlJXX1JFR0lTVEVSX1RZUEVfKiAqLworICAgaW50IHR5cGU7CisgICBzdHJ1Y3QgYnJ3X3JlZyBmaXhlZF9od19yZWc7CisKKyAgIC8qKiBWYWx1ZSBmb3IgZmlsZSA9PSBCUldfSU1NTUVESUFURV9GSUxFICovCisgICB1bmlvbiB7CisgICAgICBpbnQzMl90IGk7CisgICAgICB1aW50MzJfdCB1OworICAgICAgZmxvYXQgZjsKKyAgIH0gaW1tOworfTsKKworY2xhc3Mgc3JjX3JlZyA6IHB1YmxpYyByZWcKK3sKK3B1YmxpYzoKKyAgIERFQ0xBUkVfUkFMTE9DX0NYWF9PUEVSQVRPUlMoc3JjX3JlZykKKworICAgdm9pZCBpbml0KCk7CisKKyAgIHNyY19yZWcocmVnaXN0ZXJfZmlsZSBmaWxlLCBpbnQgcmVnLCBjb25zdCBnbHNsX3R5cGUgKnR5cGUpOworICAgc3JjX3JlZygpOworICAgc3JjX3JlZyhmbG9hdCBmKTsKKyAgIHNyY19yZWcodWludDMyX3QgdSk7CisgICBzcmNfcmVnKGludDMyX3QgaSk7CisgICBzcmNfcmVnKHN0cnVjdCBicndfcmVnIHJlZyk7CisKKyAgIGJvb2wgZXF1YWxzKHNyY19yZWcgKnIpOworICAgYm9vbCBpc196ZXJvKCkgY29uc3Q7CisgICBib29sIGlzX29uZSgpIGNvbnN0OworICAgYm9vbCBpc19hY2N1bXVsYXRvcigpIGNvbnN0OworCisgICBzcmNfcmVnKGNsYXNzIHZlYzRfdmlzaXRvciAqdiwgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSk7CisKKyAgIGV4cGxpY2l0IHNyY19yZWcoZHN0X3JlZyByZWcpOworCisgICBHTHVpbnQgc3dpenpsZTsgLyoqPCBCUldfU1dJWlpMRV9YWVpXIG1hY3JvcyBmcm9tIGJyd19yZWcuaC4gKi8KKyAgIGJvb2wgbmVnYXRlOworICAgYm9vbCBhYnM7CisKKyAgIHNyY19yZWcgKnJlbGFkZHI7Cit9OworCitzdGF0aWMgaW5saW5lIHNyY19yZWcKK3JldHlwZShzcmNfcmVnIHJlZywgdW5zaWduZWQgdHlwZSkKK3sKKyAgIHJlZy5maXhlZF9od19yZWcudHlwZSA9IHJlZy50eXBlID0gdHlwZTsKKyAgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3JjX3JlZworb2Zmc2V0KHNyY19yZWcgcmVnLCB1bnNpZ25lZCBkZWx0YSkKK3sKKyAgIGFzc2VydChkZWx0YSA9PSAwIHx8IChyZWcuZmlsZSAhPSBIV19SRUcgJiYgcmVnLmZpbGUgIT0gSU1NKSk7CisgICByZWcucmVnX29mZnNldCArPSBkZWx0YTsKKyAgIHJldHVybiByZWc7Cit9CisKKy8qKgorICogUmVzd2l6emxlIGEgZ2l2ZW4gc291cmNlIHJlZ2lzdGVyLgorICogXHNhIGJyd19zd2l6emxlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3JjX3JlZworc3dpenpsZShzcmNfcmVnIHJlZywgdW5zaWduZWQgc3dpenpsZSkKK3sKKyAgIGFzc2VydChyZWcuZmlsZSAhPSBIV19SRUcpOworICAgcmVnLnN3aXp6bGUgPSBCUldfU1dJWlpMRTQoCisgICAgICBCUldfR0VUX1NXWihyZWcuc3dpenpsZSwgQlJXX0dFVF9TV1ooc3dpenpsZSwgMCkpLAorICAgICAgQlJXX0dFVF9TV1oocmVnLnN3aXp6bGUsIEJSV19HRVRfU1daKHN3aXp6bGUsIDEpKSwKKyAgICAgIEJSV19HRVRfU1daKHJlZy5zd2l6emxlLCBCUldfR0VUX1NXWihzd2l6emxlLCAyKSksCisgICAgICBCUldfR0VUX1NXWihyZWcuc3dpenpsZSwgQlJXX0dFVF9TV1ooc3dpenpsZSwgMykpKTsKKyAgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3JjX3JlZworbmVnYXRlKHNyY19yZWcgcmVnKQoreworICAgYXNzZXJ0KHJlZy5maWxlICE9IEhXX1JFRyAmJiByZWcuZmlsZSAhPSBJTU0pOworICAgcmVnLm5lZ2F0ZSA9ICFyZWcubmVnYXRlOworICAgcmV0dXJuIHJlZzsKK30KKworY2xhc3MgZHN0X3JlZyA6IHB1YmxpYyByZWcKK3sKK3B1YmxpYzoKKyAgIERFQ0xBUkVfUkFMTE9DX0NYWF9PUEVSQVRPUlMoZHN0X3JlZykKKworICAgdm9pZCBpbml0KCk7CisKKyAgIGRzdF9yZWcoKTsKKyAgIGRzdF9yZWcocmVnaXN0ZXJfZmlsZSBmaWxlLCBpbnQgcmVnKTsKKyAgIGRzdF9yZWcocmVnaXN0ZXJfZmlsZSBmaWxlLCBpbnQgcmVnLCBjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGludCB3cml0ZW1hc2spOworICAgZHN0X3JlZyhzdHJ1Y3QgYnJ3X3JlZyByZWcpOworICAgZHN0X3JlZyhjbGFzcyB2ZWM0X3Zpc2l0b3IgKnYsIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUpOworCisgICBleHBsaWNpdCBkc3RfcmVnKHNyY19yZWcgcmVnKTsKKworICAgYm9vbCBpc19udWxsKCkgY29uc3Q7CisgICBib29sIGlzX2FjY3VtdWxhdG9yKCkgY29uc3Q7CisKKyAgIGludCB3cml0ZW1hc2s7IC8qKjwgQml0ZmllbGQgb2YgV1JJVEVNQVNLX1tYWVpXXSAqLworCisgICBzcmNfcmVnICpyZWxhZGRyOworfTsKKworc3RhdGljIGlubGluZSBkc3RfcmVnCityZXR5cGUoZHN0X3JlZyByZWcsIHVuc2lnbmVkIHR5cGUpCit7CisgICByZWcuZml4ZWRfaHdfcmVnLnR5cGUgPSByZWcudHlwZSA9IHR5cGU7CisgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW5saW5lIGRzdF9yZWcKK29mZnNldChkc3RfcmVnIHJlZywgdW5zaWduZWQgZGVsdGEpCit7CisgICBhc3NlcnQoZGVsdGEgPT0gMCB8fCAocmVnLmZpbGUgIT0gSFdfUkVHICYmIHJlZy5maWxlICE9IElNTSkpOworICAgcmVnLnJlZ19vZmZzZXQgKz0gZGVsdGE7CisgICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW5saW5lIGRzdF9yZWcKK3dyaXRlbWFzayhkc3RfcmVnIHJlZywgdW5zaWduZWQgbWFzaykKK3sKKyAgIGFzc2VydChyZWcuZmlsZSAhPSBIV19SRUcgJiYgcmVnLmZpbGUgIT0gSU1NKTsKKyAgIGFzc2VydCgocmVnLndyaXRlbWFzayAmIG1hc2spICE9IDApOworICAgcmVnLndyaXRlbWFzayAmPSBtYXNrOworICAgcmV0dXJuIHJlZzsKK30KKworY2xhc3MgdmVjNF9pbnN0cnVjdGlvbiA6IHB1YmxpYyBiYWNrZW5kX2luc3RydWN0aW9uIHsKK3B1YmxpYzoKKyAgIERFQ0xBUkVfUkFMTE9DX0NYWF9PUEVSQVRPUlModmVjNF9pbnN0cnVjdGlvbikKKworICAgdmVjNF9pbnN0cnVjdGlvbih2ZWM0X3Zpc2l0b3IgKnYsIGVudW0gb3Bjb2RlIG9wY29kZSwKKwkJICAgIGRzdF9yZWcgZHN0ID0gZHN0X3JlZygpLAorCQkgICAgc3JjX3JlZyBzcmMwID0gc3JjX3JlZygpLAorCQkgICAgc3JjX3JlZyBzcmMxID0gc3JjX3JlZygpLAorCQkgICAgc3JjX3JlZyBzcmMyID0gc3JjX3JlZygpKTsKKworICAgc3RydWN0IGJyd19yZWcgZ2V0X2RzdCh2b2lkKTsKKyAgIHN0cnVjdCBicndfcmVnIGdldF9zcmMoY29uc3Qgc3RydWN0IGJyd192ZWM0X3Byb2dfZGF0YSAqcHJvZ19kYXRhLCBpbnQgaSk7CisKKyAgIGRzdF9yZWcgZHN0OworICAgc3JjX3JlZyBzcmNbM107CisKKyAgIGJvb2wgc2F0dXJhdGU7CisgICBib29sIGZvcmNlX3dyaXRlbWFza19hbGw7CisgICBib29sIG5vX2RkX2NsZWFyLCBub19kZF9jaGVjazsKKworICAgaW50IGNvbmRpdGlvbmFsX21vZDsgLyoqPCBCUldfQ09ORElUSU9OQUxfKiAqLworCisgICBpbnQgc2FtcGxlcjsKKyAgIHVpbnQzMl90IHRleHR1cmVfb2Zmc2V0OyAvKio8IFRleHR1cmUgT2Zmc2V0IGJpdGZpZWxkICovCisgICBpbnQgdGFyZ2V0OyAvKio8IE1SVCB0YXJnZXQuICovCisgICBib29sIHNoYWRvd19jb21wYXJlOworCisgICBlbnVtIGJyd191cmJfd3JpdGVfZmxhZ3MgdXJiX3dyaXRlX2ZsYWdzOworICAgYm9vbCBoZWFkZXJfcHJlc2VudDsKKyAgIGludCBtbGVuOyAvKio8IFNFTkQgbWVzc2FnZSBsZW5ndGggKi8KKyAgIGludCBiYXNlX21yZjsgLyoqPCBGaXJzdCBNUkYgaW4gdGhlIFNFTkQgbWVzc2FnZSwgaWYgbWxlbiBpcyBub256ZXJvLiAqLworCisgICB1aW50MzJfdCBvZmZzZXQ7IC8qIHNwaWxsL3Vuc3BpbGwgb2Zmc2V0ICovCisgICAvKiogQHsKKyAgICAqIEFubm90YXRpb24gZm9yIHRoZSBnZW5lcmF0ZWQgSVIuICBPbmUgb2YgdGhlIHR3byBjYW4gYmUgc2V0LgorICAgICovCisgICBjb25zdCB2b2lkICppcjsKKyAgIGNvbnN0IGNoYXIgKmFubm90YXRpb247CisgICAvKiogQH0gKi8KKworICAgYm9vbCBpc19zZW5kX2Zyb21fZ3JmKCk7CisgICBib29sIGNhbl9yZXN3aXp6bGVfZHN0KGludCBkc3Rfd3JpdGVtYXNrLCBpbnQgc3dpenpsZSwgaW50IHN3aXp6bGVfbWFzayk7CisgICB2b2lkIHJlc3dpenpsZV9kc3QoaW50IGRzdF93cml0ZW1hc2ssIGludCBzd2l6emxlKTsKKworICAgYm9vbCByZWFkc19mbGFnKCkKKyAgIHsKKyAgICAgIHJldHVybiBwcmVkaWNhdGUgfHwgb3Bjb2RlID09IFZTX09QQ09ERV9VTlBBQ0tfRkxBR1NfU0lNRDRYMjsKKyAgIH0KKworICAgYm9vbCB3cml0ZXNfZmxhZygpCisgICB7CisgICAgICByZXR1cm4gY29uZGl0aW9uYWxfbW9kICYmIG9wY29kZSAhPSBCUldfT1BDT0RFX1NFTDsKKyAgIH0KK307CisKKy8qKgorICogVGhlIHZlcnRleCBzaGFkZXIgZnJvbnQtZW5kLgorICoKKyAqIFRyYW5zbGF0ZXMgZWl0aGVyIEdMU0wgSVIgb3IgTWVzYSBJUiAoZm9yIEFSQl92ZXJ0ZXhfcHJvZ3JhbSBhbmQKKyAqIGZpeGVkLWZ1bmN0aW9uKSBpbnRvIFZTIElSLgorICovCitjbGFzcyB2ZWM0X3Zpc2l0b3IgOiBwdWJsaWMgYmFja2VuZF92aXNpdG9yCit7CitwdWJsaWM6CisgICB2ZWM0X3Zpc2l0b3Ioc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgc3RydWN0IGJyd192ZWM0X2NvbXBpbGUgKmMsCisgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd192ZWM0X3Byb2dfa2V5ICprZXksCisgICAgICAgICAgICAgICAgc3RydWN0IGJyd192ZWM0X3Byb2dfZGF0YSAqcHJvZ19kYXRhLAorCQlzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgIGdsX3NoYWRlcl9zdGFnZSBzdGFnZSwKKwkJdm9pZCAqbWVtX2N0eCwKKyAgICAgICAgICAgICAgICBib29sIGRlYnVnX2ZsYWcsCisgICAgICAgICAgICAgICAgYm9vbCBub19zcGlsbHMsCisgICAgICAgICAgICAgICAgc2hhZGVyX3RpbWVfc2hhZGVyX3R5cGUgc3RfYmFzZSwKKyAgICAgICAgICAgICAgICBzaGFkZXJfdGltZV9zaGFkZXJfdHlwZSBzdF93cml0dGVuLAorICAgICAgICAgICAgICAgIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHN0X3Jlc2V0KTsKKyAgIH52ZWM0X3Zpc2l0b3IoKTsKKworICAgZHN0X3JlZyBkc3RfbnVsbF9mKCkKKyAgIHsKKyAgICAgIHJldHVybiBkc3RfcmVnKGJyd19udWxsX3JlZygpKTsKKyAgIH0KKworICAgZHN0X3JlZyBkc3RfbnVsbF9kKCkKKyAgIHsKKyAgICAgIHJldHVybiBkc3RfcmVnKHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfRCkpOworICAgfQorCisgICBkc3RfcmVnIGRzdF9udWxsX3VkKCkKKyAgIHsKKyAgICAgIHJldHVybiBkc3RfcmVnKHJldHlwZShicndfbnVsbF9yZWcoKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKyAgIH0KKworICAgc3RydWN0IGJyd192ZWM0X2NvbXBpbGUgKiBjb25zdCBjOworICAgY29uc3Qgc3RydWN0IGJyd192ZWM0X3Byb2dfa2V5ICogY29uc3Qga2V5OworICAgc3RydWN0IGJyd192ZWM0X3Byb2dfZGF0YSAqIGNvbnN0IHByb2dfZGF0YTsKKyAgIHVuc2lnbmVkIGludCBzYW5pdHlfcGFyYW1fY291bnQ7CisKKyAgIGNoYXIgKmZhaWxfbXNnOworICAgYm9vbCBmYWlsZWQ7CisKKyAgIC8qKgorICAgICogR0xTTCBJUiBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggb3VyCisgICAgKiBkcml2ZXIgSVIgaW5zdHJ1Y3Rpb25zIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgKi8KKyAgIGNvbnN0IHZvaWQgKmJhc2VfaXI7CisgICBjb25zdCBjaGFyICpjdXJyZW50X2Fubm90YXRpb247CisKKyAgIGludCAqdmlydHVhbF9ncmZfc2l6ZXM7CisgICBpbnQgdmlydHVhbF9ncmZfY291bnQ7CisgICBpbnQgdmlydHVhbF9ncmZfYXJyYXlfc2l6ZTsKKyAgIGludCBmaXJzdF9ub25fcGF5bG9hZF9ncmY7CisgICB1bnNpZ25lZCBpbnQgbWF4X2dyZjsKKyAgIGludCAqdmlydHVhbF9ncmZfc3RhcnQ7CisgICBpbnQgKnZpcnR1YWxfZ3JmX2VuZDsKKyAgIGJydzo6dmVjNF9saXZlX3ZhcmlhYmxlcyAqbGl2ZV9pbnRlcnZhbHM7CisgICBkc3RfcmVnIHVzZXJwbGFuZVtNQVhfQ0xJUF9QTEFORVNdOworCisgICAvKioKKyAgICAqIFRoaXMgaXMgdGhlIHNpemUgdG8gYmUgdXNlZCBmb3IgYW4gYXJyYXkgd2l0aCBhbiBlbGVtZW50IHBlcgorICAgICogcmVnX29mZnNldAorICAgICovCisgICBpbnQgdmlydHVhbF9ncmZfcmVnX2NvdW50OworICAgLyoqIFBlci12aXJ0dWFsLWdyZiBpbmRpY2VzIGludG8gYW4gYXJyYXkgb2Ygc2l6ZSB2aXJ0dWFsX2dyZl9yZWdfY291bnQgKi8KKyAgIGludCAqdmlydHVhbF9ncmZfcmVnX21hcDsKKworICAgZHN0X3JlZyAqdmFyaWFibGVfc3RvcmFnZShpcl92YXJpYWJsZSAqdmFyKTsKKworICAgdm9pZCByZWxhZGRyX3RvX3RlbXAoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBzcmNfcmVnICpyZWcsIGludCAqbnVtX3JlbGFkZHIpOworCisgICBib29sIG5lZWRfYWxsX2NvbnN0YW50c19pbl9wdWxsX2J1ZmZlcjsKKworICAgLyoqCisgICAgKiBcbmFtZSBWaXNpdCBtZXRob2RzCisgICAgKgorICAgICogQXMgdHlwaWNhbCBmb3IgdGhlIHZpc2l0b3IgcGF0dGVybiwgdGhlcmUgbXVzdCBiZSBvbmUgXGMgdmlzaXQgbWV0aG9kIGZvcgorICAgICogZWFjaCBjb25jcmV0ZSBzdWJjbGFzcyBvZiBcYyBpcl9pbnN0cnVjdGlvbi4gIFZpcnR1YWwgYmFzZSBjbGFzc2VzIHdpdGhpbgorICAgICogdGhlIGhpZXJhcmNoeSBzaG91bGQgbm90IGhhdmUgXGMgdmlzaXQgbWV0aG9kcy4KKyAgICAqLworICAgLypAeyovCisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfdmFyaWFibGUgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfbG9vcCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9sb29wX2p1bXAgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2Z1bmN0aW9uICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2V4cHJlc3Npb24gKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfc3dpenpsZSAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2Fzc2lnbm1lbnQgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfY29uc3RhbnQgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfY2FsbCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9yZXR1cm4gKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGlzY2FyZCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl90ZXh0dXJlICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2lmICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2VtaXRfdmVydGV4ICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2VuZF9wcmltaXRpdmUgKik7CisgICAvKkB9Ki8KKworICAgc3JjX3JlZyByZXN1bHQ7CisKKyAgIC8qIFJlZ3MgZm9yIHZlcnRleCByZXN1bHRzLiAgR2VuZXJhdGVkIGF0IGlyX3ZhcmlhYmxlIHZpc2l0aW5nIHRpbWUKKyAgICAqIGZvciB0aGUgaXItPmxvY2F0aW9uJ3MgdXNlZC4KKyAgICAqLworICAgZHN0X3JlZyBvdXRwdXRfcmVnW0JSV19WQVJZSU5HX1NMT1RfQ09VTlRdOworICAgY29uc3QgY2hhciAqb3V0cHV0X3JlZ19hbm5vdGF0aW9uW0JSV19WQVJZSU5HX1NMT1RfQ09VTlRdOworICAgaW50ICp1bmlmb3JtX3NpemU7CisgICBpbnQgKnVuaWZvcm1fdmVjdG9yX3NpemU7CisgICBpbnQgdW5pZm9ybV9hcnJheV9zaXplOyAvKjwgU2l6ZSBvZiB1bmlmb3JtX1t2ZWN0b3JfXXNpemUgYXJyYXlzICovCisgICBpbnQgdW5pZm9ybXM7CisKKyAgIHNyY19yZWcgc2hhZGVyX3N0YXJ0X3RpbWU7CisKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9odDsKKworICAgYm9vbCBydW4odm9pZCk7CisgICB2b2lkIGZhaWwoY29uc3QgY2hhciAqbXNnLCAuLi4pOworCisgICBpbnQgdmlydHVhbF9ncmZfYWxsb2MoaW50IHNpemUpOworICAgdm9pZCBzZXR1cF91bmlmb3JtX2NsaXBwbGFuZV92YWx1ZXMoKTsKKyAgIHZvaWQgc2V0dXBfdW5pZm9ybV92YWx1ZXMoaXJfdmFyaWFibGUgKmlyKTsKKyAgIHZvaWQgc2V0dXBfYnVpbHRpbl91bmlmb3JtX3ZhbHVlcyhpcl92YXJpYWJsZSAqaXIpOworICAgaW50IHNldHVwX3VuaWZvcm1zKGludCBwYXlsb2FkX3JlZyk7CisgICBib29sIHJlZ19hbGxvY2F0ZV90cml2aWFsKCk7CisgICBib29sIHJlZ19hbGxvY2F0ZSgpOworICAgdm9pZCBldmFsdWF0ZV9zcGlsbF9jb3N0cyhmbG9hdCAqc3BpbGxfY29zdHMsIGJvb2wgKm5vX3NwaWxsKTsKKyAgIGludCBjaG9vc2Vfc3BpbGxfcmVnKHN0cnVjdCByYV9ncmFwaCAqZyk7CisgICB2b2lkIHNwaWxsX3JlZyhpbnQgc3BpbGxfcmVnKTsKKyAgIHZvaWQgbW92ZV9ncmZfYXJyYXlfYWNjZXNzX3RvX3NjcmF0Y2goKTsKKyAgIHZvaWQgbW92ZV91bmlmb3JtX2FycmF5X2FjY2Vzc190b19wdWxsX2NvbnN0YW50cygpOworICAgdm9pZCBtb3ZlX3B1c2hfY29uc3RhbnRzX3RvX3B1bGxfY29uc3RhbnRzKCk7CisgICB2b2lkIHNwbGl0X3VuaWZvcm1fcmVnaXN0ZXJzKCk7CisgICB2b2lkIHBhY2tfdW5pZm9ybV9yZWdpc3RlcnMoKTsKKyAgIHZvaWQgY2FsY3VsYXRlX2xpdmVfaW50ZXJ2YWxzKCk7CisgICB2b2lkIGludmFsaWRhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKyAgIHZvaWQgc3BsaXRfdmlydHVhbF9ncmZzKCk7CisgICBib29sIGRlYWRfY29kZV9lbGltaW5hdGUoKTsKKyAgIGJvb2wgdmlydHVhbF9ncmZfaW50ZXJmZXJlcyhpbnQgYSwgaW50IGIpOworICAgaW50ICBsaXZlX2luX2NvdW50KGludCBibG9ja19udW0pIGNvbnN0OworICAgaW50ICBsaXZlX291dF9jb3VudChpbnQgYmxvY2tfbnVtKSBjb25zdDsKKyAgIGJvb2wgb3B0X2NvcHlfcHJvcGFnYXRpb24oKTsKKyAgIGJvb2wgb3B0X2FsZ2VicmFpYygpOworICAgYm9vbCBvcHRfcmVnaXN0ZXJfY29hbGVzY2UoKTsKKyAgIHZvaWQgb3B0X3NldF9kZXBlbmRlbmN5X2NvbnRyb2woKTsKKyAgIGludCBvcHRfc2NoZWR1bGVfaW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uX3NjaGVkdWxlcl9tb2RlIG1vZGUpOworCisgICBib29sIGNhbl9kb19zb3VyY2VfbW9kcyh2ZWM0X2luc3RydWN0aW9uICppbnN0KTsKKworICAgdmVjNF9pbnN0cnVjdGlvbiAqZW1pdCh2ZWM0X2luc3RydWN0aW9uICppbnN0KTsKKworICAgdmVjNF9pbnN0cnVjdGlvbiAqZW1pdChlbnVtIG9wY29kZSBvcGNvZGUpOworCisgICB2ZWM0X2luc3RydWN0aW9uICplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QpOworCisgICB2ZWM0X2luc3RydWN0aW9uICplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCk7CisKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmVtaXQoZW51bSBvcGNvZGUgb3Bjb2RlLCBkc3RfcmVnIGRzdCwKKwkJCSAgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworCisgICB2ZWM0X2luc3RydWN0aW9uICplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsCisJCQkgIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxLCBzcmNfcmVnIHNyYzIpOworCisgICB2ZWM0X2luc3RydWN0aW9uICplbWl0X2JlZm9yZSh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorCQkJCSB2ZWM0X2luc3RydWN0aW9uICpuZXdfaW5zdCk7CisKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKk1PVihkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKk5PVChkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKlJOREQoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCk7CisgICB2ZWM0X2luc3RydWN0aW9uICpSTkRFKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzApOworICAgdmVjNF9pbnN0cnVjdGlvbiAqUk5EWihkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKkZSQyhkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKkYzMlRPMTYoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCk7CisgICB2ZWM0X2luc3RydWN0aW9uICpGMTZUTzMyKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzApOworICAgdmVjNF9pbnN0cnVjdGlvbiAqQUREKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpNVUwoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKk1BQ0goZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKk1BQyhkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqQU5EKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpPUihkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqWE9SKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpEUDMoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKkRQNChkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqRFBIKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpTSEwoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKlNIUihkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqQVNSKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpDTVAoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxLAorCQkJIHVpbnQzMl90IGNvbmRpdGlvbik7CisgICB2ZWM0X2luc3RydWN0aW9uICpJRihzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSwgdWludDMyX3QgY29uZGl0aW9uKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKklGKHVpbnQzMl90IHByZWRpY2F0ZSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpQVUxMX0NPTlNUQU5UX0xPQUQoZHN0X3JlZyBkc3QsIHNyY19yZWcgaW5kZXgpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqU0NSQVRDSF9SRUFEKGRzdF9yZWcgZHN0LCBzcmNfcmVnIGluZGV4KTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKlNDUkFUQ0hfV1JJVEUoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjLCBzcmNfcmVnIGluZGV4KTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKkxSUChkc3RfcmVnIGRzdCwgc3JjX3JlZyBhLCBzcmNfcmVnIHksIHNyY19yZWcgeCk7CisgICB2ZWM0X2luc3RydWN0aW9uICpCRlJFVihkc3RfcmVnIGRzdCwgc3JjX3JlZyB2YWx1ZSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpCRkUoZHN0X3JlZyBkc3QsIHNyY19yZWcgYml0cywgc3JjX3JlZyBvZmZzZXQsIHNyY19yZWcgdmFsdWUpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqQkZJMShkc3RfcmVnIGRzdCwgc3JjX3JlZyBiaXRzLCBzcmNfcmVnIG9mZnNldCk7CisgICB2ZWM0X2luc3RydWN0aW9uICpCRkkyKGRzdF9yZWcgZHN0LCBzcmNfcmVnIGJmaTFfZHN0LCBzcmNfcmVnIGluc2VydCwgc3JjX3JlZyBiYXNlKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKkZCSChkc3RfcmVnIGRzdCwgc3JjX3JlZyB2YWx1ZSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpGQkwoZHN0X3JlZyBkc3QsIHNyY19yZWcgdmFsdWUpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqQ0JJVChkc3RfcmVnIGRzdCwgc3JjX3JlZyB2YWx1ZSk7CisgICB2ZWM0X2luc3RydWN0aW9uICpNQUQoZHN0X3JlZyBkc3QsIHNyY19yZWcgYywgc3JjX3JlZyBiLCBzcmNfcmVnIGEpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqQUREQyhkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqU1VCQihkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpOworCisgICBpbnQgaW1wbGllZF9tcmZfd3JpdGVzKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QpOworCisgICBib29sIHRyeV9yZXdyaXRlX3Joc190b19kc3QoaXJfYXNzaWdubWVudCAqaXIsCisJCQkgICAgICAgZHN0X3JlZyBkc3QsCisJCQkgICAgICAgc3JjX3JlZyBzcmMsCisJCQkgICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqcHJlX3Joc19pbnN0LAorCQkJICAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmxhc3RfcmhzX2luc3QpOworCisgICBib29sIHRyeV9jb3B5X3Byb3BhZ2F0aW9uKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsIGludCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcgKnZhbHVlc1s0XSk7CisKKyAgIC8qKiBXYWxrcyBhbiBleGVjX2xpc3Qgb2YgaXJfaW5zdHJ1Y3Rpb24gYW5kIHNlbmRzIGl0IHRocm91Z2ggdGhpcyB2aXNpdG9yLiAqLworICAgdm9pZCB2aXNpdF9pbnN0cnVjdGlvbnMoY29uc3QgZXhlY19saXN0ICpsaXN0KTsKKworICAgdm9pZCBlbWl0X3ZwX3NvcCh1aW50MzJfdCBjb25kbW9kLCBkc3RfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEsIHNyY19yZWcgb25lKTsKKworICAgdm9pZCBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyX3J2YWx1ZSAqaXIsIHVpbnQzMl90ICpwcmVkaWNhdGUpOworICAgdm9pZCBlbWl0X2Jvb2xfY29tcGFyaXNvbih1bnNpZ25lZCBpbnQgb3AsIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisgICB2b2lkIGVtaXRfaWZfZ2VuNihpcl9pZiAqaXIpOworCisgICB2b2lkIGVtaXRfbWlubWF4KHVpbnQzMl90IGNvbmRtb2QsIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisKKyAgIHZvaWQgZW1pdF9scnAoY29uc3QgZHN0X3JlZyAmZHN0LAorICAgICAgICAgICAgICAgICBjb25zdCBzcmNfcmVnICZ4LCBjb25zdCBzcmNfcmVnICZ5LCBjb25zdCBzcmNfcmVnICZhKTsKKworICAgdm9pZCBlbWl0X2Jsb2NrX21vdmUoZHN0X3JlZyAqZHN0LCBzcmNfcmVnICpzcmMsCisJCQljb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlLCB1aW50MzJfdCBwcmVkaWNhdGUpOworCisgICB2b2lkIGVtaXRfY29uc3RhbnRfdmFsdWVzKGRzdF9yZWcgKmRzdCwgaXJfY29uc3RhbnQgKnZhbHVlKTsKKworICAgLyoqCisgICAgKiBFbWl0IHRoZSBjb3JyZWN0IGRvdC1wcm9kdWN0IGluc3RydWN0aW9uIGZvciB0aGUgdHlwZSBvZiBhcmd1bWVudHMKKyAgICAqLworICAgdm9pZCBlbWl0X2RwKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSwgdW5zaWduZWQgZWxlbWVudHMpOworCisgICB2b2lkIGVtaXRfc2NhbGFyKGlyX2luc3RydWN0aW9uICppciwgZW51bSBwcm9nX29wY29kZSBvcCwKKwkJICAgIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzApOworCisgICB2b2lkIGVtaXRfc2NhbGFyKGlyX2luc3RydWN0aW9uICppciwgZW51bSBwcm9nX29wY29kZSBvcCwKKwkJICAgIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSk7CisKKyAgIHZvaWQgZW1pdF9zY3MoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBlbnVtIHByb2dfb3Bjb2RlIG9wLAorCQkgZHN0X3JlZyBkc3QsIGNvbnN0IHNyY19yZWcgJnNyYyk7CisKKyAgIHNyY19yZWcgZml4XzNzcmNfb3BlcmFuZChzcmNfcmVnIHNyYyk7CisKKyAgIHZvaWQgZW1pdF9tYXRoMV9nZW42KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjKTsKKyAgIHZvaWQgZW1pdF9tYXRoMV9nZW40KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjKTsKKyAgIHZvaWQgZW1pdF9tYXRoKGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjKTsKKyAgIHZvaWQgZW1pdF9tYXRoMl9nZW42KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKyAgIHZvaWQgZW1pdF9tYXRoMl9nZW40KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKyAgIHZvaWQgZW1pdF9tYXRoKGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKTsKKyAgIHNyY19yZWcgZml4X21hdGhfb3BlcmFuZChzcmNfcmVnIHNyYyk7CisKKyAgIHZvaWQgZW1pdF9wYWNrX2hhbGZfMngxNihkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKTsKKyAgIHZvaWQgZW1pdF91bnBhY2tfaGFsZl8yeDE2KGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzApOworCisgICB1aW50MzJfdCBnYXRoZXJfY2hhbm5lbChpcl90ZXh0dXJlICppciwgaW50IHNhbXBsZXIpOworICAgc3JjX3JlZyBlbWl0X21jc19mZXRjaChpcl90ZXh0dXJlICppciwgc3JjX3JlZyBjb29yZGluYXRlLCBpbnQgc2FtcGxlcik7CisgICB2b2lkIGVtaXRfZ2VuNl9nYXRoZXJfd2EodWludDhfdCB3YSwgZHN0X3JlZyBkc3QpOworICAgdm9pZCBzd2l6emxlX3Jlc3VsdChpcl90ZXh0dXJlICppciwgc3JjX3JlZyBvcmlnX3ZhbCwgaW50IHNhbXBsZXIpOworCisgICB2b2lkIGVtaXRfbmRjX2NvbXB1dGF0aW9uKCk7CisgICB2b2lkIGVtaXRfcHNpel9hbmRfZmxhZ3Moc3RydWN0IGJyd19yZWcgcmVnKTsKKyAgIHZvaWQgZW1pdF9jbGlwX2Rpc3RhbmNlcyhkc3RfcmVnIHJlZywgaW50IG9mZnNldCk7CisgICB2b2lkIGVtaXRfZ2VuZXJpY191cmJfc2xvdChkc3RfcmVnIHJlZywgaW50IHZhcnlpbmcpOworICAgdm9pZCBlbWl0X3VyYl9zbG90KGludCBtcmYsIGludCB2YXJ5aW5nKTsKKworICAgdm9pZCBlbWl0X3NoYWRlcl90aW1lX2JlZ2luKCk7CisgICB2b2lkIGVtaXRfc2hhZGVyX3RpbWVfZW5kKCk7CisgICB2b2lkIGVtaXRfc2hhZGVyX3RpbWVfd3JpdGUoZW51bSBzaGFkZXJfdGltZV9zaGFkZXJfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcgdmFsdWUpOworCisgICB2b2lkIGVtaXRfdW50eXBlZF9hdG9taWModW5zaWduZWQgYXRvbWljX29wLCB1bnNpZ25lZCBzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9yZWcgZHN0LCBzcmNfcmVnIG9mZnNldCwgc3JjX3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcgc3JjMSk7CisKKyAgIHZvaWQgZW1pdF91bnR5cGVkX3N1cmZhY2VfcmVhZCh1bnNpZ25lZCBzdXJmX2luZGV4LCBkc3RfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmVnIG9mZnNldCk7CisKKyAgIHNyY19yZWcgZ2V0X3NjcmF0Y2hfb2Zmc2V0KHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkgICAgICBzcmNfcmVnICpyZWxhZGRyLCBpbnQgcmVnX29mZnNldCk7CisgICBzcmNfcmVnIGdldF9wdWxsX2NvbnN0YW50X29mZnNldCh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorCQkJCSAgICBzcmNfcmVnICpyZWxhZGRyLCBpbnQgcmVnX29mZnNldCk7CisgICB2b2lkIGVtaXRfc2NyYXRjaF9yZWFkKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkgIGRzdF9yZWcgZHN0LAorCQkJICBzcmNfcmVnIG9yaWdfc3JjLAorCQkJICBpbnQgYmFzZV9vZmZzZXQpOworICAgdm9pZCBlbWl0X3NjcmF0Y2hfd3JpdGUodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKwkJCSAgIGludCBiYXNlX29mZnNldCk7CisgICB2b2lkIGVtaXRfcHVsbF9jb25zdGFudF9sb2FkKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkJZHN0X3JlZyBkc3QsCisJCQkJc3JjX3JlZyBvcmlnX3NyYywKKwkJCQlpbnQgYmFzZV9vZmZzZXQpOworCisgICBib29sIHRyeV9lbWl0X3NhdChpcl9leHByZXNzaW9uICppcik7CisgICBib29sIHRyeV9lbWl0X21hZChpcl9leHByZXNzaW9uICppcik7CisgICB2b2lkIHJlc29sdmVfdWRfbmVnYXRlKHNyY19yZWcgKnJlZyk7CisKKyAgIHNyY19yZWcgZ2V0X3RpbWVzdGFtcCgpOworCisgICBib29sIHByb2Nlc3NfbW92ZV9jb25kaXRpb24oaXJfcnZhbHVlICppcik7CisKKyAgIHZvaWQgZHVtcF9pbnN0cnVjdGlvbihiYWNrZW5kX2luc3RydWN0aW9uICppbnN0KTsKKyAgIHZvaWQgZHVtcF9pbnN0cnVjdGlvbihiYWNrZW5kX2luc3RydWN0aW9uICppbnN0LCBGSUxFICpmaWxlKTsKKyAgIHZvaWQgZHVtcF9pbnN0cnVjdGlvbihiYWNrZW5kX2luc3RydWN0aW9uICppbnN0LCBjaGFyKiBzdHJpbmcpOworCisgICB2b2lkIHZpc2l0X2F0b21pY19jb3VudGVyX2ludHJpbnNpYyhpcl9jYWxsICppcik7CisKK3Byb3RlY3RlZDoKKyAgIHZvaWQgZW1pdF92ZXJ0ZXgoKTsKKyAgIHZvaWQgbG93ZXJfYXR0cmlidXRlc190b19od19yZWdzKGNvbnN0IGludCAqYXR0cmlidXRlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJsZWF2ZWQpOworICAgdm9pZCBzZXR1cF9wYXlsb2FkX2ludGVyZmVyZW5jZShzdHJ1Y3QgcmFfZ3JhcGggKmcsIGludCBmaXJzdF9wYXlsb2FkX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWdfbm9kZV9jb3VudCk7CisgICB2aXJ0dWFsIGRzdF9yZWcgKm1ha2VfcmVnX2Zvcl9zeXN0ZW1fdmFsdWUoaXJfdmFyaWFibGUgKmlyKSA9IDA7CisgICB2aXJ0dWFsIHZvaWQgc2V0dXBfcGF5bG9hZCgpID0gMDsKKyAgIHZpcnR1YWwgdm9pZCBlbWl0X3Byb2xvZygpID0gMDsKKyAgIC8vdmlydHVhbCB2b2lkIGVtaXRfcHJvZ3JhbV9jb2RlKCkgPSAwOworICAgdmlydHVhbCB2b2lkIGVtaXRfdGhyZWFkX2VuZCgpID0gMDsKKyAgIHZpcnR1YWwgdm9pZCBlbWl0X3VyYl93cml0ZV9oZWFkZXIoaW50IG1yZikgPSAwOworICAgdmlydHVhbCB2ZWM0X2luc3RydWN0aW9uICplbWl0X3VyYl93cml0ZV9vcGNvZGUoYm9vbCBjb21wbGV0ZSkgPSAwOworICAgdmlydHVhbCBpbnQgY29tcHV0ZV9hcnJheV9zdHJpZGUoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKTsKKworICAgY29uc3QgYm9vbCBkZWJ1Z19mbGFnOworCitwcml2YXRlOgorICAgLyoqCisgICAgKiBJZiB0cnVlLCB0aGVuIHJlZ2lzdGVyIGFsbG9jYXRpb24gc2hvdWxkIGZhaWwgaW5zdGVhZCBvZiBzcGlsbGluZy4KKyAgICAqLworICAgY29uc3QgYm9vbCBub19zcGlsbHM7CisKKyAgIGNvbnN0IHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHN0X2Jhc2U7CisgICBjb25zdCBzaGFkZXJfdGltZV9zaGFkZXJfdHlwZSBzdF93cml0dGVuOworICAgY29uc3Qgc2hhZGVyX3RpbWVfc2hhZGVyX3R5cGUgc3RfcmVzZXQ7Cit9OworCisKKy8qKgorICogVGhlIHZlcnRleCBzaGFkZXIgY29kZSBnZW5lcmF0b3IuCisgKgorICogVHJhbnNsYXRlcyBWUyBJUiB0byBhY3R1YWwgaTk2NSBhc3NlbWJseSBjb2RlLgorICovCitjbGFzcyB2ZWM0X2dlbmVyYXRvcgoreworcHVibGljOgorICAgdmVjNF9nZW5lcmF0b3Ioc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19kYXRhICpwcm9nX2RhdGEsCisgICAgICAgICAgICAgICAgICB2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgYm9vbCBkZWJ1Z19mbGFnKTsKKyAgIH52ZWM0X2dlbmVyYXRvcigpOworCisgICBjb25zdCB1bnNpZ25lZCAqZ2VuZXJhdGVfYXNzZW1ibHkoZXhlY19saXN0ICppbnN0cywgdW5zaWduZWQgKmFzbV9zaXplKTsKKworcHJpdmF0ZToKKyAgIHZvaWQgZ2VuZXJhdGVfY29kZShleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7CisgICB2b2lkIGdlbmVyYXRlX3ZlYzRfaW5zdHJ1Y3Rpb24odmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgKnNyYyk7CisKKyAgIHZvaWQgZ2VuZXJhdGVfbWF0aDFfZ2VuNCh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorCQkJICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOworICAgdm9pZCBnZW5lcmF0ZV9tYXRoMV9nZW42KHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkgICAgc3RydWN0IGJyd19yZWcgZHN0LAorCQkJICAgIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX21hdGgyX2dlbjQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKTsKKyAgIHZvaWQgZ2VuZXJhdGVfbWF0aDJfZ2VuNih2ZWM0X2luc3RydWN0aW9uICppbnN0LAorCQkJICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKwkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorCQkJICAgIHN0cnVjdCBicndfcmVnIHNyYzEpOworICAgdm9pZCBnZW5lcmF0ZV9tYXRoMl9nZW43KHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkgICAgc3RydWN0IGJyd19yZWcgZHN0LAorCQkJICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisJCQkgICAgc3RydWN0IGJyd19yZWcgc3JjMSk7CisKKyAgIHZvaWQgZ2VuZXJhdGVfdGV4KHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCSAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorCQkgICAgIHN0cnVjdCBicndfcmVnIHNyYyk7CisKKyAgIHZvaWQgZ2VuZXJhdGVfdnNfdXJiX3dyaXRlKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QpOworICAgdm9pZCBnZW5lcmF0ZV9nc191cmJfd3JpdGUodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCk7CisgICB2b2lkIGdlbmVyYXRlX2dzX3RocmVhZF9lbmQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCk7CisgICB2b2lkIGdlbmVyYXRlX2dzX3NldF93cml0ZV9vZmZzZXQoc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMSk7CisgICB2b2lkIGdlbmVyYXRlX2dzX3NldF92ZXJ0ZXhfY291bnQoc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYyk7CisgICB2b2lkIGdlbmVyYXRlX2dzX3NldF9kd29yZF8yX2ltbWVkKHN0cnVjdCBicndfcmVnIGRzdCwgc3RydWN0IGJyd19yZWcgc3JjKTsKKyAgIHZvaWQgZ2VuZXJhdGVfZ3NfcHJlcGFyZV9jaGFubmVsX21hc2tzKHN0cnVjdCBicndfcmVnIGRzdCk7CisgICB2b2lkIGdlbmVyYXRlX2dzX3NldF9jaGFubmVsX21hc2tzKHN0cnVjdCBicndfcmVnIGRzdCwgc3RydWN0IGJyd19yZWcgc3JjKTsKKyAgIHZvaWQgZ2VuZXJhdGVfZ3NfZ2V0X2luc3RhbmNlX2lkKHN0cnVjdCBicndfcmVnIGRzdCk7CisgICB2b2lkIGdlbmVyYXRlX293b3JkX2R1YWxfYmxvY2tfb2Zmc2V0cyhzdHJ1Y3QgYnJ3X3JlZyBtMSwKKwkJCQkJICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCk7CisgICB2b2lkIGdlbmVyYXRlX3NjcmF0Y2hfd3JpdGUodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKwkJCSAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICAgICAgc3RydWN0IGJyd19yZWcgc3JjLAorCQkJICAgICAgIHN0cnVjdCBicndfcmVnIGluZGV4KTsKKyAgIHZvaWQgZ2VuZXJhdGVfc2NyYXRjaF9yZWFkKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCk7CisgICB2b2lkIGdlbmVyYXRlX3B1bGxfY29uc3RhbnRfbG9hZCh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorCQkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisJCQkJICAgIHN0cnVjdCBicndfcmVnIGluZGV4LAorCQkJCSAgICBzdHJ1Y3QgYnJ3X3JlZyBvZmZzZXQpOworICAgdm9pZCBnZW5lcmF0ZV9wdWxsX2NvbnN0YW50X2xvYWRfZ2VuNyh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHN1cmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG9mZnNldCk7CisgICB2b2lkIGdlbmVyYXRlX3VucGFja19mbGFncyh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0KTsKKworICAgdm9pZCBnZW5lcmF0ZV91bnR5cGVkX2F0b21pYyh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGF0b21pY19vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3VyZl9pbmRleCk7CisKKyAgIHZvaWQgZ2VuZXJhdGVfdW50eXBlZF9zdXJmYWNlX3JlYWQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzdXJmX2luZGV4KTsKKworICAgc3RydWN0IGJyd19jb250ZXh0ICpicnc7CisKKyAgIHN0cnVjdCBicndfY29tcGlsZSAqcDsKKworICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZzsKKyAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nOworCisgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19kYXRhICpwcm9nX2RhdGE7CisKKyAgIHZvaWQgKm1lbV9jdHg7CisgICBjb25zdCBib29sIGRlYnVnX2ZsYWc7Cit9OworCisvKioKKyAqIFRoZSB2ZXJ0ZXggc2hhZGVyIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIFRyYW5zbGF0ZXMgVlMgSVIgdG8gYWN0dWFsIGk5NjUgYXNzZW1ibHkgY29kZS4KKyAqLworY2xhc3MgZ2VuOF92ZWM0X2dlbmVyYXRvciA6IHB1YmxpYyBnZW44X2dlbmVyYXRvcgoreworcHVibGljOgorICAgZ2VuOF92ZWM0X2dlbmVyYXRvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfdmVjNF9wcm9nX2RhdGEgKnByb2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWJ1Z19mbGFnKTsKKyAgIH5nZW44X3ZlYzRfZ2VuZXJhdG9yKCk7CisKKyAgIGNvbnN0IHVuc2lnbmVkICpnZW5lcmF0ZV9hc3NlbWJseShleGVjX2xpc3QgKmluc3RzLCB1bnNpZ25lZCAqYXNtX3NpemUpOworCitwcml2YXRlOgorICAgdm9pZCBnZW5lcmF0ZV9jb2RlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKKyAgIHZvaWQgZ2VuZXJhdGVfdmVjNF9pbnN0cnVjdGlvbih2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyAqc3JjKTsKKworICAgdm9pZCBnZW5lcmF0ZV90ZXgodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCk7CisKKyAgIHZvaWQgZ2VuZXJhdGVfdXJiX3dyaXRlKHZlYzRfaW5zdHJ1Y3Rpb24gKmlyLCBib29sIGNvcHlfZzApOworICAgdm9pZCBnZW5lcmF0ZV9nc190aHJlYWRfZW5kKHZlYzRfaW5zdHJ1Y3Rpb24gKmlyKTsKKyAgIHZvaWQgZ2VuZXJhdGVfZ3Nfc2V0X3dyaXRlX29mZnNldChzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKTsKKyAgIHZvaWQgZ2VuZXJhdGVfZ3Nfc2V0X3ZlcnRleF9jb3VudChzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjKTsKKyAgIHZvaWQgZ2VuZXJhdGVfZ3Nfc2V0X2R3b3JkXzJfaW1tZWQoc3RydWN0IGJyd19yZWcgZHN0LCBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOworICAgdm9pZCBnZW5lcmF0ZV9nc19wcmVwYXJlX2NoYW5uZWxfbWFza3Moc3RydWN0IGJyd19yZWcgZHN0KTsKKyAgIHZvaWQgZ2VuZXJhdGVfZ3Nfc2V0X2NoYW5uZWxfbWFza3Moc3RydWN0IGJyd19yZWcgZHN0LCBzdHJ1Y3QgYnJ3X3JlZyBzcmMpOworCisgICB2b2lkIGdlbmVyYXRlX293b3JkX2R1YWxfYmxvY2tfb2Zmc2V0cyhzdHJ1Y3QgYnJ3X3JlZyBtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGluZGV4KTsKKyAgIHZvaWQgZ2VuZXJhdGVfc2NyYXRjaF93cml0ZSh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgaW5kZXgpOworICAgdm9pZCBnZW5lcmF0ZV9zY3JhdGNoX3JlYWQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGluZGV4KTsKKyAgIHZvaWQgZ2VuZXJhdGVfcHVsbF9jb25zdGFudF9sb2FkKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG9mZnNldCk7CisgICB2b2lkIGdlbmVyYXRlX3VudHlwZWRfYXRvbWljKHZlYzRfaW5zdHJ1Y3Rpb24gKmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGF0b21pY19vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3VyZl9pbmRleCk7CisgICB2b2lkIGdlbmVyYXRlX3VudHlwZWRfc3VyZmFjZV9yZWFkKHZlYzRfaW5zdHJ1Y3Rpb24gKmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHN1cmZfaW5kZXgpOworCisgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19kYXRhICpwcm9nX2RhdGE7CisKKyAgIGNvbnN0IGJvb2wgZGVidWdfZmxhZzsKK307CisKKworfSAvKiBuYW1lc3BhY2UgYnJ3ICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIEJSV19WRUM0X0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9jb3B5X3Byb3BhZ2F0aW9uLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9jb3B5X3Byb3BhZ2F0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTliMzZjCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2NvcHlfcHJvcGFnYXRpb24uY3BwCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBAZmlsZSBicndfdmVjNF9jb3B5X3Byb3BhZ2F0aW9uLmNwcAorICoKKyAqIEltcGxlbWVudHMgdHJhY2tpbmcgb2YgdmFsdWVzIGNvcGllZCBiZXR3ZWVuIHJlZ2lzdGVycywgYW5kCisgKiBvcHRpbWl6YXRpb25zIGJhc2VkIG9uIHRoYXQ6IGNvcHkgcHJvcGFnYXRpb24gYW5kIGNvbnN0YW50CisgKiBwcm9wYWdhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiYnJ3X3ZlYzQuaCIKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCit9CisKK25hbWVzcGFjZSBicncgeworCitzdGF0aWMgYm9vbAoraXNfZGlyZWN0X2NvcHkodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgIHJldHVybiAoaW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfTU9WICYmCisJICAgIWluc3QtPnByZWRpY2F0ZSAmJgorCSAgIGluc3QtPmRzdC5maWxlID09IEdSRiAmJgorCSAgICFpbnN0LT5zYXR1cmF0ZSAmJgorCSAgICFpbnN0LT5kc3QucmVsYWRkciAmJgorCSAgICFpbnN0LT5zcmNbMF0ucmVsYWRkciAmJgorCSAgIGluc3QtPmRzdC50eXBlID09IGluc3QtPnNyY1swXS50eXBlKTsKK30KKworc3RhdGljIGJvb2wKK2lzX2RvbWluYXRlZF9ieV9wcmV2aW91c19pbnN0cnVjdGlvbih2ZWM0X2luc3RydWN0aW9uICppbnN0KQoreworICAgcmV0dXJuIChpbnN0LT5vcGNvZGUgIT0gQlJXX09QQ09ERV9ETyAmJgorCSAgIGluc3QtPm9wY29kZSAhPSBCUldfT1BDT0RFX1dISUxFICYmCisJICAgaW5zdC0+b3Bjb2RlICE9IEJSV19PUENPREVfRUxTRSAmJgorCSAgIGluc3QtPm9wY29kZSAhPSBCUldfT1BDT0RFX0VORElGKTsKK30KKworc3RhdGljIGJvb2wKK2lzX2NoYW5uZWxfdXBkYXRlZCh2ZWM0X2luc3RydWN0aW9uICppbnN0LCBzcmNfcmVnICp2YWx1ZXNbNF0sIGludCBjaCkKK3sKKyAgIGNvbnN0IHNyY19yZWcgKnNyYyA9IHZhbHVlc1tjaF07CisKKyAgIC8qIGNvbnNpZGVyIEdSRiBvbmx5ICovCisgICBhc3NlcnQoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKTsKKyAgIGlmICghc3JjIHx8IHNyYy0+ZmlsZSAhPSBHUkYpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHJldHVybiAoc3JjLT5yZWcgPT0gaW5zdC0+ZHN0LnJlZyAmJgorCSAgIHNyYy0+cmVnX29mZnNldCA9PSBpbnN0LT5kc3QucmVnX29mZnNldCAmJgorCSAgIGluc3QtPmRzdC53cml0ZW1hc2sgJiAoMSA8PCBCUldfR0VUX1NXWihzcmMtPnN3aXp6bGUsIGNoKSkpOworfQorCitzdGF0aWMgYm9vbAordHJ5X2NvbnN0YW50X3Byb3BhZ2F0aW9uKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCB2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcsIHNyY19yZWcgKnZhbHVlc1s0XSkKK3sKKyAgIC8qIEZvciBjb25zdGFudCBwcm9wYWdhdGlvbiwgd2Ugb25seSBoYW5kbGUgdGhlIHNhbWUgY29uc3RhbnQKKyAgICAqIGFjcm9zcyBhbGwgNCBjaGFubmVscy4gIFNvbWUgZGF5LCB3ZSBzaG91bGQgaGFuZGxlIHRoZSA4LWJpdAorICAgICogZmxvYXQgdmVjdG9yIGZvcm1hdCwgd2hpY2ggd291bGQgbGV0IHVzIGNvbnN0YW50IHByb3BhZ2F0ZQorICAgICogdmVjdG9ycyBiZXR0ZXIuCisgICAgKi8KKyAgIHNyY19yZWcgdmFsdWUgPSAqdmFsdWVzWzBdOworICAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgIGlmICghdmFsdWUuZXF1YWxzKHZhbHVlc1tpXSkpCisJIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgaWYgKHZhbHVlLmZpbGUgIT0gSU1NKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoaW5zdC0+c3JjW2FyZ10uYWJzKSB7CisgICAgICBpZiAodmFsdWUudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9GKSB7CisJIHZhbHVlLmltbS5mID0gZmFicyh2YWx1ZS5pbW0uZik7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRCkgeworCSBpZiAodmFsdWUuaW1tLmkgPCAwKQorCSAgICB2YWx1ZS5pbW0uaSA9IC12YWx1ZS5pbW0uaTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGluc3QtPnNyY1thcmddLm5lZ2F0ZSkgeworICAgICAgaWYgKHZhbHVlLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfRikKKwkgdmFsdWUuaW1tLmYgPSAtdmFsdWUuaW1tLmY7CisgICAgICBlbHNlCisJIHZhbHVlLmltbS51ID0gLXZhbHVlLmltbS51OworICAgfQorCisgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgY2FzZSBCUldfT1BDT0RFX01PVjoKKyAgICAgIGluc3QtPnNyY1thcmddID0gdmFsdWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX1BPVzoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1JFTUFJTkRFUjoKKyAgICAgIGlmIChicnctPmdlbiA8IDgpCisgICAgICAgICBicmVhazsKKyAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICBjYXNlIEJSV19PUENPREVfRFAyOgorICAgY2FzZSBCUldfT1BDT0RFX0RQMzoKKyAgIGNhc2UgQlJXX09QQ09ERV9EUDQ6CisgICBjYXNlIEJSV19PUENPREVfRFBIOgorICAgY2FzZSBCUldfT1BDT0RFX0JGSTE6CisgICBjYXNlIEJSV19PUENPREVfQVNSOgorICAgY2FzZSBCUldfT1BDT0RFX1NITDoKKyAgIGNhc2UgQlJXX09QQ09ERV9TSFI6CisgICBjYXNlIEJSV19PUENPREVfU1VCQjoKKyAgICAgIGlmIChhcmcgPT0gMSkgeworICAgICAgICAgaW5zdC0+c3JjW2FyZ10gPSB2YWx1ZTsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9NQUNIOgorICAgY2FzZSBCUldfT1BDT0RFX01VTDoKKyAgIGNhc2UgQlJXX09QQ09ERV9BREQ6CisgICBjYXNlIEJSV19PUENPREVfT1I6CisgICBjYXNlIEJSV19PUENPREVfQU5EOgorICAgY2FzZSBCUldfT1BDT0RFX1hPUjoKKyAgIGNhc2UgQlJXX09QQ09ERV9BRERDOgorICAgICAgaWYgKGFyZyA9PSAxKSB7CisJIGluc3QtPnNyY1thcmddID0gdmFsdWU7CisJIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChhcmcgPT0gMCAmJiBpbnN0LT5zcmNbMV0uZmlsZSAhPSBJTU0pIHsKKwkgLyogRml0IHRoaXMgY29uc3RhbnQgaW4gYnkgY29tbXV0aW5nIHRoZSBvcGVyYW5kcy4gIEV4Y2VwdGlvbjogd2UKKwkgICogY2FuJ3QgZG8gdGhpcyBmb3IgMzItYml0IGludGVnZXIgTVVML01BQ0ggYmVjYXVzZSBpdCdzIGFzeW1tZXRyaWMuCisJICAqLworCSBpZiAoKGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX01VTCB8fAorICAgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9NQUNIKSAmJgorCSAgICAgKGluc3QtPnNyY1sxXS50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0QgfHwKKwkgICAgICBpbnN0LT5zcmNbMV0udHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCkpCisJICAgIGJyZWFrOworCSBpbnN0LT5zcmNbMF0gPSBpbnN0LT5zcmNbMV07CisJIGluc3QtPnNyY1sxXSA9IHZhbHVlOworCSByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfQ01QOgorICAgICAgaWYgKGFyZyA9PSAxKSB7CisJIGluc3QtPnNyY1thcmddID0gdmFsdWU7CisJIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmIChhcmcgPT0gMCAmJiBpbnN0LT5zcmNbMV0uZmlsZSAhPSBJTU0pIHsKKwkgdWludDMyX3QgbmV3X2Ntb2Q7CisKKwkgbmV3X2Ntb2QgPSBicndfc3dhcF9jbW9kKGluc3QtPmNvbmRpdGlvbmFsX21vZCk7CisJIGlmIChuZXdfY21vZCAhPSB+MHUpIHsKKwkgICAgLyogRml0IHRoaXMgY29uc3RhbnQgaW4gYnkgc3dhcHBpbmcgdGhlIG9wZXJhbmRzIGFuZAorCSAgICAgKiBmbGlwcGluZyB0aGUgdGVzdC4KKwkgICAgICovCisJICAgIGluc3QtPnNyY1swXSA9IGluc3QtPnNyY1sxXTsKKwkgICAgaW5zdC0+c3JjWzFdID0gdmFsdWU7CisJICAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IG5ld19jbW9kOworCSAgICByZXR1cm4gdHJ1ZTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9TRUw6CisgICAgICBpZiAoYXJnID09IDEpIHsKKwkgaW5zdC0+c3JjW2FyZ10gPSB2YWx1ZTsKKwkgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGFyZyA9PSAwICYmIGluc3QtPnNyY1sxXS5maWxlICE9IElNTSkgeworCSBpbnN0LT5zcmNbMF0gPSBpbnN0LT5zcmNbMV07CisJIGluc3QtPnNyY1sxXSA9IHZhbHVlOworCisJIC8qIElmIHRoaXMgd2FzIHByZWRpY2F0ZWQsIGZsaXBwaW5nIG9wZXJhbmRzIG1lYW5zCisJICAqIHdlIGFsc28gbmVlZCB0byBmbGlwIHRoZSBwcmVkaWNhdGUuCisJICAqLworCSBpZiAoaW5zdC0+Y29uZGl0aW9uYWxfbW9kID09IEJSV19DT05ESVRJT05BTF9OT05FKSB7CisJICAgIGluc3QtPnByZWRpY2F0ZV9pbnZlcnNlID0gIWluc3QtPnByZWRpY2F0ZV9pbnZlcnNlOworCSB9CisJIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbAoraXNfbG9naWNfb3AoZW51bSBvcGNvZGUgb3Bjb2RlKQoreworICAgcmV0dXJuIChvcGNvZGUgPT0gQlJXX09QQ09ERV9BTkQgfHwKKyAgICAgICAgICAgb3Bjb2RlID09IEJSV19PUENPREVfT1IgIHx8CisgICAgICAgICAgIG9wY29kZSA9PSBCUldfT1BDT0RFX1hPUiB8fAorICAgICAgICAgICBvcGNvZGUgPT0gQlJXX09QQ09ERV9OT1QpOworfQorCitib29sCit2ZWM0X3Zpc2l0b3I6OnRyeV9jb3B5X3Byb3BhZ2F0aW9uKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsIGludCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcgKnZhbHVlc1s0XSkKK3sKKyAgIC8qIEZvciBjb25zdGFudCBwcm9wYWdhdGlvbiwgd2Ugb25seSBoYW5kbGUgdGhlIHNhbWUgY29uc3RhbnQKKyAgICAqIGFjcm9zcyBhbGwgNCBjaGFubmVscy4gIFNvbWUgZGF5LCB3ZSBzaG91bGQgaGFuZGxlIHRoZSA4LWJpdAorICAgICogZmxvYXQgdmVjdG9yIGZvcm1hdCwgd2hpY2ggd291bGQgbGV0IHVzIGNvbnN0YW50IHByb3BhZ2F0ZQorICAgICogdmVjdG9ycyBiZXR0ZXIuCisgICAgKi8KKyAgIHNyY19yZWcgdmFsdWUgPSAqdmFsdWVzWzBdOworICAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgIC8qIFRoaXMgaXMgZXF1YWxzKCkgZXhjZXB0IHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHN3aXp6bGUuICovCisgICAgICBpZiAodmFsdWUuZmlsZSAhPSB2YWx1ZXNbaV0tPmZpbGUgfHwKKwkgIHZhbHVlLnJlZyAhPSB2YWx1ZXNbaV0tPnJlZyB8fAorCSAgdmFsdWUucmVnX29mZnNldCAhPSB2YWx1ZXNbaV0tPnJlZ19vZmZzZXQgfHwKKwkgIHZhbHVlLnR5cGUgIT0gdmFsdWVzW2ldLT50eXBlIHx8CisJICB2YWx1ZS5uZWdhdGUgIT0gdmFsdWVzW2ldLT5uZWdhdGUgfHwKKwkgIHZhbHVlLmFicyAhPSB2YWx1ZXNbaV0tPmFicykgeworCSByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisKKyAgIC8qIENvbXB1dGUgdGhlIHN3aXp6bGUgb2YgdGhlIG9yaWdpbmFsIHJlZ2lzdGVyIGJ5IHN3aXp6bGluZyB0aGUKKyAgICAqIGNvbXBvbmVudCBsb2FkZWQgZnJvbSBlYWNoIHZhbHVlIGFjY29yZGluZyB0byB0aGUgc3dpenpsZSBvZgorICAgICogb3BlcmFuZCB3ZSdyZSBnb2luZyB0byBjaGFuZ2UuCisgICAgKi8KKyAgIGludCBzWzRdOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIHNbaV0gPSBCUldfR0VUX1NXWih2YWx1ZXNbaV0tPnN3aXp6bGUsCisJCQkgQlJXX0dFVF9TV1ooaW5zdC0+c3JjW2FyZ10uc3dpenpsZSwgaSkpOworICAgfQorICAgdmFsdWUuc3dpenpsZSA9IEJSV19TV0laWkxFNChzWzBdLCBzWzFdLCBzWzJdLCBzWzNdKTsKKworICAgaWYgKHZhbHVlLmZpbGUgIT0gVU5JRk9STSAmJgorICAgICAgIHZhbHVlLmZpbGUgIT0gR1JGICYmCisgICAgICAgdmFsdWUuZmlsZSAhPSBBVFRSKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoYnJ3LT5nZW4gPj0gOCAmJiAodmFsdWUubmVnYXRlIHx8IHZhbHVlLmFicykgJiYKKyAgICAgICBpc19sb2dpY19vcChpbnN0LT5vcGNvZGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGlmIChpbnN0LT5zcmNbYXJnXS5hYnMpIHsKKyAgICAgIHZhbHVlLm5lZ2F0ZSA9IGZhbHNlOworICAgICAgdmFsdWUuYWJzID0gdHJ1ZTsKKyAgIH0KKyAgIGlmIChpbnN0LT5zcmNbYXJnXS5uZWdhdGUpCisgICAgICB2YWx1ZS5uZWdhdGUgPSAhdmFsdWUubmVnYXRlOworCisgICBib29sIGhhc19zb3VyY2VfbW9kaWZpZXJzID0gdmFsdWUubmVnYXRlIHx8IHZhbHVlLmFiczsKKworICAgLyogZ2VuNiBtYXRoIGFuZCBnZW43KyBTRU5EcyBmcm9tIEdSRnMgaWdub3JlIHNvdXJjZSBtb2RpZmllcnMgb24KKyAgICAqIGluc3RydWN0aW9ucy4KKyAgICAqLworICAgaWYgKChoYXNfc291cmNlX21vZGlmaWVycyB8fCB2YWx1ZS5maWxlID09IFVOSUZPUk0gfHwKKyAgICAgICAgdmFsdWUuc3dpenpsZSAhPSBCUldfU1dJWlpMRV9YWVpXKSAmJiAhY2FuX2RvX3NvdXJjZV9tb2RzKGluc3QpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoaGFzX3NvdXJjZV9tb2RpZmllcnMgJiYgdmFsdWUudHlwZSAhPSBpbnN0LT5zcmNbYXJnXS50eXBlKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBib29sIGlzXzNzcmNfaW5zdCA9IChpbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9MUlAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3QtPm9wY29kZSA9PSBCUldfT1BDT0RFX01BRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC0+b3Bjb2RlID09IEJSV19PUENPREVfQkZFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5vcGNvZGUgPT0gQlJXX09QQ09ERV9CRkkyKTsKKyAgIGlmIChpc18zc3JjX2luc3QgJiYgdmFsdWUuZmlsZSA9PSBVTklGT1JNKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoaW5zdC0+aXNfc2VuZF9mcm9tX2dyZigpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBXZSBjYW4ndCBjb3B5LXByb3BhZ2F0ZSBhIFVEIG5lZ2F0aW9uIGludG8gYSBjb25kbW9kCisgICAgKiBpbnN0cnVjdGlvbiwgYmVjYXVzZSB0aGUgY29uZG1vZCBlbmRzIHVwIGxvb2tpbmcgYXQgdGhlIDMzLWJpdAorICAgICogc2lnbmVkIGFjY3VtdWxhdG9yIHZhbHVlIGluc3RlYWQgb2YgdGhlIDMyLWJpdCB2YWx1ZSB3ZSB3YW50ZWQKKyAgICAqLworICAgaWYgKGluc3QtPmNvbmRpdGlvbmFsX21vZCAmJgorICAgICAgIHZhbHVlLm5lZ2F0ZSAmJgorICAgICAgIHZhbHVlLnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIERvbid0IHJlcG9ydCBwcm9ncmVzcyBpZiB0aGlzIGlzIGEgbm9vcC4gKi8KKyAgIGlmICh2YWx1ZS5lcXVhbHMoJmluc3QtPnNyY1thcmddKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgdmFsdWUudHlwZSA9IGluc3QtPnNyY1thcmddLnR5cGU7CisgICBpbnN0LT5zcmNbYXJnXSA9IHZhbHVlOworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK3ZlYzRfdmlzaXRvcjo6b3B0X2NvcHlfcHJvcGFnYXRpb24oKQoreworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworICAgc3JjX3JlZyAqY3VyX3ZhbHVlW3ZpcnR1YWxfZ3JmX3JlZ19jb3VudF1bNF07CisKKyAgIG1lbXNldCgmY3VyX3ZhbHVlLCAwLCBzaXplb2YoY3VyX3ZhbHVlKSk7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKilub2RlOworCisgICAgICAvKiBUaGlzIHBhc3Mgb25seSB3b3JrcyBvbiBiYXNpYyBibG9ja3MuICBJZiB0aGVyZSdzIGZsb3cKKyAgICAgICAqIGNvbnRyb2wsIHRocm93IG91dCBhbGwgb3VyIGluZm9ybWF0aW9uIGFuZCBzdGFydCBmcm9tCisgICAgICAgKiBzY3JhdGNoLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBieSB1c2luZyBhIHN0cnVjdHVyZSBsaWtlIGluCisgICAgICAgKiBzcmMvZ2xzbC9vcHRfY29weV9wcm9wYWdhdGlvbi5jcHAgdG8gdHJhY2sgYXZhaWxhYmxlIGNvcGllcy4KKyAgICAgICAqLworICAgICAgaWYgKCFpc19kb21pbmF0ZWRfYnlfcHJldmlvdXNfaW5zdHJ1Y3Rpb24oaW5zdCkpIHsKKwkgbWVtc2V0KGN1cl92YWx1ZSwgMCwgc2l6ZW9mKGN1cl92YWx1ZSkpOworCSBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogRm9yIGVhY2ggc291cmNlIGFyZywgc2VlIGlmIGVhY2ggY29tcG9uZW50IGNvbWVzIGZyb20gYSBjb3B5CisgICAgICAgKiBmcm9tIHRoZSBzYW1lIHR5cGUgZmlsZSAoSU1NLCBHUkYsIFVOSUZPUk0pLCBhbmQgdHJ5CisgICAgICAgKiBvcHRpbWl6aW5nIG91dCBhY2Nlc3MgdG8gdGhlIGNvcHkgcmVzdWx0CisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgeworCSAvKiBDb3BpZWQgdmFsdWVzIGVuZCB1cCBpbiBHUkZzLCBhbmQgd2UgZG9uJ3QgdHJhY2sgcmVsYWRkcgorCSAgKiBhY2Nlc3Nlcy4KKwkgICovCisJIGlmIChpbnN0LT5zcmNbaV0uZmlsZSAhPSBHUkYgfHwKKwkgICAgIGluc3QtPnNyY1tpXS5yZWxhZGRyKQorCSAgICBjb250aW51ZTsKKworCSBpbnQgcmVnID0gKHZpcnR1YWxfZ3JmX3JlZ19tYXBbaW5zdC0+c3JjW2ldLnJlZ10gKworCQkgICAgaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQpOworCisJIC8qIEZpbmQgdGhlIHJlZ3MgdGhhdCBlYWNoIHN3aXp6bGUgY29tcG9uZW50IGNhbWUgZnJvbS4KKwkgICovCisJIHNyY19yZWcgKnZhbHVlc1s0XTsKKwkgaW50IGM7CisJIGZvciAoYyA9IDA7IGMgPCA0OyBjKyspIHsKKwkgICAgdmFsdWVzW2NdID0gY3VyX3ZhbHVlW3JlZ11bQlJXX0dFVF9TV1ooaW5zdC0+c3JjW2ldLnN3aXp6bGUsIGMpXTsKKworCSAgICAvKiBJZiB0aGVyZSdzIG5vIGF2YWlsYWJsZSBjb3B5IGZvciB0aGlzIGNoYW5uZWwsIGJhaWwuCisJICAgICAqIFdlIGNvdWxkIGJlIG1vcmUgYWdncmVzc2l2ZSBoZXJlIC0tIHNvbWUgY2hhbm5lbHMgbWlnaHQKKwkgICAgICogbm90IGdldCB1c2VkIGJhc2VkIG9uIHRoZSBkZXN0aW5hdGlvbiB3cml0ZW1hc2suCisJICAgICAqLworCSAgICBpZiAoIXZhbHVlc1tjXSkKKwkgICAgICAgYnJlYWs7CisKKwkgICAgLyogV2UnbGwgb25seSBiZSBhYmxlIHRvIGNvcHkgcHJvcGFnYXRlIGlmIHRoZSBzb3VyY2VzIGFyZQorCSAgICAgKiBhbGwgZnJvbSB0aGUgc2FtZSBmaWxlIC0tIHRoZXJlJ3Mgbm8gYWJpbGl0eSB0byBzd2l6emxlCisJICAgICAqIDAgb3IgMSBjb25zdGFudHMgaW4gd2l0aCBzb3VyY2UgcmVnaXN0ZXJzIGxpa2UgaW4gaTkxNS4KKwkgICAgICovCisJICAgIGlmIChjID4gMCAmJiB2YWx1ZXNbYyAtIDFdLT5maWxlICE9IHZhbHVlc1tjXS0+ZmlsZSkKKwkgICAgICAgYnJlYWs7CisJIH0KKworCSBpZiAoYyAhPSA0KQorCSAgICBjb250aW51ZTsKKworCSBpZiAodHJ5X2NvbnN0YW50X3Byb3BhZ2F0aW9uKGJydywgaW5zdCwgaSwgdmFsdWVzKSB8fAorCSAgICAgdHJ5X2NvcHlfcHJvcGFnYXRpb24oaW5zdCwgaSwgdmFsdWVzKSkKKwkgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgfQorCisgICAgICAvKiBUcmFjayBhdmFpbGFibGUgc291cmNlIHJlZ2lzdGVycy4gKi8KKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKwkgY29uc3QgaW50IHJlZyA9CisJICAgIHZpcnR1YWxfZ3JmX3JlZ19tYXBbaW5zdC0+ZHN0LnJlZ10gKyBpbnN0LT5kc3QucmVnX29mZnNldDsKKworCSAvKiBVcGRhdGUgb3VyIGRlc3RpbmF0aW9uJ3MgY3VycmVudCBjaGFubmVsIHZhbHVlcy4gIEZvciBhIGRpcmVjdCBjb3B5LAorCSAgKiB0aGUgdmFsdWUgaXMgdGhlIG5ld2x5IHByb3BhZ2F0ZWQgc291cmNlLiAgT3RoZXJ3aXNlLCB3ZSBkb24ndCBrbm93CisJICAqIHRoZSBuZXcgdmFsdWUsIHNvIGNsZWFyIGl0LgorCSAgKi8KKwkgYm9vbCBkaXJlY3RfY29weSA9IGlzX2RpcmVjdF9jb3B5KGluc3QpOworCSBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCSAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmICgxIDw8IGkpKSB7CisJICAgICAgIGN1cl92YWx1ZVtyZWddW2ldID0gZGlyZWN0X2NvcHkgPyAmaW5zdC0+c3JjWzBdIDogTlVMTDsKKwkgICAgfQorCSB9CisKKwkgLyogQ2xlYXIgdGhlIHJlY29yZHMgZm9yIGFueSByZWdpc3RlcnMgd2hvc2UgY3VycmVudCB2YWx1ZSBjYW1lIGZyb20KKwkgICogb3VyIGRlc3RpbmF0aW9uJ3MgdXBkYXRlZCBjaGFubmVscywgYXMgdGhlIHR3byBhcmUgbm8gbG9uZ2VyIGVxdWFsLgorCSAgKi8KKwkgaWYgKGluc3QtPmRzdC5yZWxhZGRyKQorCSAgICBtZW1zZXQoY3VyX3ZhbHVlLCAwLCBzaXplb2YoY3VyX3ZhbHVlKSk7CisJIGVsc2UgeworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxfZ3JmX3JlZ19jb3VudDsgaSsrKSB7CisJICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisJCSAgaWYgKGlzX2NoYW5uZWxfdXBkYXRlZChpbnN0LCBjdXJfdmFsdWVbaV0sIGopKXsKKwkJICAgICBjdXJfdmFsdWVbaV1bal0gPSBOVUxMOworCQkgIH0KKwkgICAgICAgfQorCSAgICB9CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHByb2dyZXNzKQorICAgICAgaW52YWxpZGF0ZV9saXZlX2ludGVydmFscygpOworCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK30gLyogbmFtZXNwYWNlIGJydyAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2dlbmVyYXRvci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfZ2VuZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGYwNzQxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2dlbmVyYXRvci5jcHAKQEAgLTAsMCArMSwxMzcxIEBACisvKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYnJ3X3ZlYzQuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiYnJ3X2V1LmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcHJpbnQuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiCit9OworCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRyA6IEFERAorCituYW1lc3BhY2UgYnJ3IHsKKworc3RydWN0IGJyd19yZWcKK3ZlYzRfaW5zdHJ1Y3Rpb246OmdldF9kc3Qodm9pZCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIGJyd19yZWc7CisKKyAgIHN3aXRjaCAoZHN0LmZpbGUpIHsKKyAgIGNhc2UgR1JGOgorICAgICAgYnJ3X3JlZyA9IGJyd192ZWM4X2dyZihkc3QucmVnICsgZHN0LnJlZ19vZmZzZXQsIDApOworICAgICAgYnJ3X3JlZyA9IHJldHlwZShicndfcmVnLCBkc3QudHlwZSk7CisgICAgICBicndfcmVnLmR3MS5iaXRzLndyaXRlbWFzayA9IGRzdC53cml0ZW1hc2s7CisgICAgICBicmVhazsKKworICAgY2FzZSBNUkY6CisgICAgICBicndfcmVnID0gYnJ3X21lc3NhZ2VfcmVnKGRzdC5yZWcgKyBkc3QucmVnX29mZnNldCk7CisgICAgICBicndfcmVnID0gcmV0eXBlKGJyd19yZWcsIGRzdC50eXBlKTsKKyAgICAgIGJyd19yZWcuZHcxLmJpdHMud3JpdGVtYXNrID0gZHN0LndyaXRlbWFzazsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEhXX1JFRzoKKyAgICAgIGFzc2VydChkc3QudHlwZSA9PSBkc3QuZml4ZWRfaHdfcmVnLnR5cGUpOworICAgICAgYnJ3X3JlZyA9IGRzdC5maXhlZF9od19yZWc7CisgICAgICBicmVhazsKKworICAgY2FzZSBCQURfRklMRToKKyAgICAgIGJyd19yZWcgPSBicndfbnVsbF9yZWcoKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgICAgIGJyd19yZWcgPSBicndfbnVsbF9yZWcoKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGJyd19yZWc7Cit9CisKK3N0cnVjdCBicndfcmVnCit2ZWM0X2luc3RydWN0aW9uOjpnZXRfc3JjKGNvbnN0IHN0cnVjdCBicndfdmVjNF9wcm9nX2RhdGEgKnByb2dfZGF0YSwgaW50IGkpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBicndfcmVnOworCisgICBzd2l0Y2ggKHNyY1tpXS5maWxlKSB7CisgICBjYXNlIEdSRjoKKyAgICAgIGJyd19yZWcgPSBicndfdmVjOF9ncmYoc3JjW2ldLnJlZyArIHNyY1tpXS5yZWdfb2Zmc2V0LCAwKTsKKyAgICAgIGJyd19yZWcgPSByZXR5cGUoYnJ3X3JlZywgc3JjW2ldLnR5cGUpOworICAgICAgYnJ3X3JlZy5kdzEuYml0cy5zd2l6emxlID0gc3JjW2ldLnN3aXp6bGU7CisgICAgICBpZiAoc3JjW2ldLmFicykKKwkgYnJ3X3JlZyA9IGJyd19hYnMoYnJ3X3JlZyk7CisgICAgICBpZiAoc3JjW2ldLm5lZ2F0ZSkKKwkgYnJ3X3JlZyA9IG5lZ2F0ZShicndfcmVnKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIElNTToKKyAgICAgIHN3aXRjaCAoc3JjW2ldLnR5cGUpIHsKKyAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRjoKKwkgYnJ3X3JlZyA9IGJyd19pbW1fZihzcmNbaV0uaW1tLmYpOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfRDoKKwkgYnJ3X3JlZyA9IGJyd19pbW1fZChzcmNbaV0uaW1tLmkpOworCSBicmVhazsKKyAgICAgIGNhc2UgQlJXX1JFR0lTVEVSX1RZUEVfVUQ6CisJIGJyd19yZWcgPSBicndfaW1tX3VkKHNyY1tpXS5pbW0udSk7CisJIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKwkgYnJ3X3JlZyA9IGJyd19udWxsX3JlZygpOworCSBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIFVOSUZPUk06CisgICAgICBicndfcmVnID0gc3RyaWRlKGJyd192ZWM0X2dyZihwcm9nX2RhdGEtPmRpc3BhdGNoX2dyZl9zdGFydF9yZWcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyY1tpXS5yZWcgKyBzcmNbaV0ucmVnX29mZnNldCkgLyAyLAorCQkJCSAgICAoKHNyY1tpXS5yZWcgKyBzcmNbaV0ucmVnX29mZnNldCkgJSAyKSAqIDQpLAorCQkgICAgICAgMCwgNCwgMSk7CisgICAgICBicndfcmVnID0gcmV0eXBlKGJyd19yZWcsIHNyY1tpXS50eXBlKTsKKyAgICAgIGJyd19yZWcuZHcxLmJpdHMuc3dpenpsZSA9IHNyY1tpXS5zd2l6emxlOworICAgICAgaWYgKHNyY1tpXS5hYnMpCisJIGJyd19yZWcgPSBicndfYWJzKGJyd19yZWcpOworICAgICAgaWYgKHNyY1tpXS5uZWdhdGUpCisJIGJyd19yZWcgPSBuZWdhdGUoYnJ3X3JlZyk7CisKKyAgICAgIC8qIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBtb3ZlZCB0byBwdWxsIGNvbnN0YW50cy4gKi8KKyAgICAgIGFzc2VydCghc3JjW2ldLnJlbGFkZHIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgSFdfUkVHOgorICAgICAgYXNzZXJ0KHNyY1tpXS50eXBlID09IHNyY1tpXS5maXhlZF9od19yZWcudHlwZSk7CisgICAgICBicndfcmVnID0gc3JjW2ldLmZpeGVkX2h3X3JlZzsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJBRF9GSUxFOgorICAgICAgLyogUHJvYmFibHkgdW51c2VkLiAqLworICAgICAgYnJ3X3JlZyA9IGJyd19udWxsX3JlZygpOworICAgICAgYnJlYWs7CisgICBjYXNlIEFUVFI6CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgICAgIGJyd19yZWcgPSBicndfbnVsbF9yZWcoKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gYnJ3X3JlZzsKK30KKwordmVjNF9nZW5lcmF0b3I6OnZlYzRfZ2VuZXJhdG9yKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd192ZWM0X3Byb2dfZGF0YSAqcHJvZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWJ1Z19mbGFnKQorICAgOiBicncoYnJ3KSwgc2hhZGVyX3Byb2coc2hhZGVyX3Byb2cpLCBwcm9nKHByb2cpLCBwcm9nX2RhdGEocHJvZ19kYXRhKSwKKyAgICAgbWVtX2N0eChtZW1fY3R4KSwgZGVidWdfZmxhZyhkZWJ1Z19mbGFnKQoreworICAgcCA9IHJ6YWxsb2MobWVtX2N0eCwgc3RydWN0IGJyd19jb21waWxlKTsKKyAgIGJyd19pbml0X2NvbXBpbGUoYnJ3LCBwLCBtZW1fY3R4KTsKK30KKwordmVjNF9nZW5lcmF0b3I6On52ZWM0X2dlbmVyYXRvcigpCit7Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYXRoMV9nZW40KHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMpCit7CisgICBicndfbWF0aChwLAorCSAgICBkc3QsCisJICAgIGJyd19tYXRoX2Z1bmN0aW9uKGluc3QtPm9wY29kZSksCisJICAgIGluc3QtPmJhc2VfbXJmLAorCSAgICBzcmMsCisJICAgIEJSV19NQVRIX0RBVEFfVkVDVE9SLAorCSAgICBCUldfTUFUSF9QUkVDSVNJT05fRlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19nZW42X21hdGhfc3JjX2FyZyhzdHJ1Y3QgYnJ3X3JlZyBzcmMpCit7CisgICAvKiBTb3VyY2Ugc3dpenpsZXMgYXJlIGlnbm9yZWQuICovCisgICBhc3NlcnQoIXNyYy5hYnMpOworICAgYXNzZXJ0KCFzcmMubmVnYXRlKTsKKyAgIGFzc2VydChzcmMuZHcxLmJpdHMuc3dpenpsZSA9PSBCUldfU1dJWlpMRV9YWVpXKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX21hdGgxX2dlbjYodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYykKK3sKKyAgIC8qIENhbid0IGRvIHdyaXRlbWFzayBiZWNhdXNlIG1hdGggY2FuJ3QgYmUgYWxpZ24xNi4gKi8KKyAgIGFzc2VydChkc3QuZHcxLmJpdHMud3JpdGVtYXNrID09IFdSSVRFTUFTS19YWVpXKTsKKyAgIGNoZWNrX2dlbjZfbWF0aF9zcmNfYXJnKHNyYyk7CisKKyAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzEpOworICAgYnJ3X21hdGgocCwKKwkgICAgZHN0LAorCSAgICBicndfbWF0aF9mdW5jdGlvbihpbnN0LT5vcGNvZGUpLAorCSAgICBpbnN0LT5iYXNlX21yZiwKKwkgICAgc3JjLAorCSAgICBCUldfTUFUSF9EQVRBX1NDQUxBUiwKKwkgICAgQlJXX01BVEhfUFJFQ0lTSU9OX0ZVTEwpOworICAgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMTYpOworfQorCit2b2lkCit2ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfbWF0aDJfZ2VuNyh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzEpCit7CisgICBicndfbWF0aDIocCwKKwkgICAgIGRzdCwKKwkgICAgIGJyd19tYXRoX2Z1bmN0aW9uKGluc3QtPm9wY29kZSksCisJICAgICBzcmMwLCBzcmMxKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX21hdGgyX2dlbjYodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKQoreworICAgLyogQ2FuJ3QgZG8gd3JpdGVtYXNrIGJlY2F1c2UgbWF0aCBjYW4ndCBiZSBhbGlnbjE2LiAqLworICAgYXNzZXJ0KGRzdC5kdzEuYml0cy53cml0ZW1hc2sgPT0gV1JJVEVNQVNLX1hZWlcpOworICAgLyogU291cmNlIHN3aXp6bGVzIGFyZSBpZ25vcmVkLiAqLworICAgY2hlY2tfZ2VuNl9tYXRoX3NyY19hcmcoc3JjMCk7CisgICBjaGVja19nZW42X21hdGhfc3JjX2FyZyhzcmMxKTsKKworICAgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMSk7CisgICBicndfbWF0aDIocCwKKwkgICAgIGRzdCwKKwkgICAgIGJyd19tYXRoX2Z1bmN0aW9uKGluc3QtPm9wY29kZSksCisJICAgICBzcmMwLCBzcmMxKTsKKyAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzE2KTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX21hdGgyX2dlbjQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKQoreworICAgLyogRnJvbSB0aGUgSXJvbmxha2UgUFJNLCBWb2x1bWUgNCwgUGFydCAxLCBTZWN0aW9uIDYuMS4xMworICAgICogIk1lc3NhZ2UgUGF5bG9hZCI6CisgICAgKgorICAgICogIk9wZXJhbmQwWzddLiAgRm9yIHRoZSBJTlQgRElWIGZ1bmN0aW9ucywgdGhpcyBvcGVyYW5kIGlzIHRoZQorICAgICogIGRlbm9taW5hdG9yLiIKKyAgICAqICAuLi4KKyAgICAqICJPcGVyYW5kMVs3XS4gIEZvciB0aGUgSU5UIERJViBmdW5jdGlvbnMsIHRoaXMgb3BlcmFuZCBpcyB0aGUKKyAgICAqICBudW1lcmF0b3IuIgorICAgICovCisgICBib29sIGlzX2ludF9kaXYgPSBpbnN0LT5vcGNvZGUgIT0gU0hBREVSX09QQ09ERV9QT1c7CisgICBzdHJ1Y3QgYnJ3X3JlZyAmb3AwID0gaXNfaW50X2RpdiA/IHNyYzEgOiBzcmMwOworICAgc3RydWN0IGJyd19yZWcgJm9wMSA9IGlzX2ludF9kaXYgPyBzcmMwIDogc3JjMTsKKworICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgIGJyd19zZXRfc2F0dXJhdGUocCwgZmFsc2UpOworICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBCUldfUFJFRElDQVRFX05PTkUpOworICAgYnJ3X01PVihwLCByZXR5cGUoYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmICsgMSksIG9wMS50eXBlKSwgb3AxKTsKKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKworICAgYnJ3X21hdGgocCwKKwkgICAgZHN0LAorCSAgICBicndfbWF0aF9mdW5jdGlvbihpbnN0LT5vcGNvZGUpLAorCSAgICBpbnN0LT5iYXNlX21yZiwKKwkgICAgb3AwLAorCSAgICBCUldfTUFUSF9EQVRBX1ZFQ1RPUiwKKwkgICAgQlJXX01BVEhfUFJFQ0lTSU9OX0ZVTEwpOworfQorCit2b2lkCit2ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdGV4KHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjKQoreworICAgaW50IG1zZ190eXBlID0gLTE7CisKKyAgIGlmIChicnctPmdlbiA+PSA1KSB7CisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RFWDoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEw6CisJIGlmIChpbnN0LT5zaGFkb3dfY29tcGFyZSkgeworCSAgICBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MT0RfQ09NUEFSRTsKKwkgfSBlbHNlIHsKKwkgICAgbXNnX3R5cGUgPSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTE9EOworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRDoKKyAgICAgICAgIGlmIChpbnN0LT5zaGFkb3dfY29tcGFyZSkgeworICAgICAgICAgICAgLyogR2VuNy41Ky4gIE90aGVyd2lzZSwgbG93ZXJlZCBieSBicndfbG93ZXJfdGV4dHVyZV9ncmFkaWVudHMoKS4gKi8KKyAgICAgICAgICAgIGFzc2VydChicnctPmlzX2hhc3dlbGwpOworICAgICAgICAgICAgbXNnX3R5cGUgPSBIU1dfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9ERVJJVl9DT01QQVJFOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZ190eXBlID0gR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0RFUklWUzsKKyAgICAgICAgIH0KKwkgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhGOgorCSBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MRDsKKwkgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhGX0NNUzoKKyAgICAgICAgIGlmIChicnctPmdlbiA+PSA3KQorICAgICAgICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTEQyRE1TOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbXNnX3R5cGUgPSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTEQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfTUNTOgorICAgICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTERfTUNTOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhTOgorCSBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9SRVNJTkZPOworCSBicmVhazsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9URzQ6CisgICAgICAgICBpZiAoaW5zdC0+c2hhZG93X2NvbXBhcmUpIHsKKyAgICAgICAgICAgIG1zZ190eXBlID0gR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0dBVEhFUjRfQzsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2dfdHlwZSA9IEdFTjdfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9HQVRIRVI0OworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVEc0X09GRlNFVDoKKyAgICAgICAgIGlmIChpbnN0LT5zaGFkb3dfY29tcGFyZSkgeworICAgICAgICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfR0FUSEVSNF9QT19DOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZ190eXBlID0gR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0dBVEhFUjRfUE87CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGFzc2VydCghInNob3VsZCBub3QgZ2V0IGhlcmU6IGludmFsaWQgdmVjNCB0ZXh0dXJlIG9wY29kZSIpOworCSBicmVhazsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKGluc3QtPm9wY29kZSkgeworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX1RFWDoKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEw6CisJIGlmIChpbnN0LT5zaGFkb3dfY29tcGFyZSkgeworCSAgICBtc2dfdHlwZSA9IEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDRYMl9TQU1QTEVfTE9EX0NPTVBBUkU7CisJICAgIGFzc2VydChpbnN0LT5tbGVuID09IDMpOworCSB9IGVsc2UgeworCSAgICBtc2dfdHlwZSA9IEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDRYMl9TQU1QTEVfTE9EOworCSAgICBhc3NlcnQoaW5zdC0+bWxlbiA9PSAyKTsKKwkgfQorCSBicmVhazsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEQ6CisJIC8qIFRoZXJlIGlzIG5vIHNhbXBsZV9kX2MgbWVzc2FnZTsgY29tcGFyaXNvbnMgYXJlIGRvbmUgbWFudWFsbHkuICovCisJIG1zZ190eXBlID0gQlJXX1NBTVBMRVJfTUVTU0FHRV9TSU1ENFgyX1NBTVBMRV9HUkFESUVOVFM7CisJIGFzc2VydChpbnN0LT5tbGVuID09IDQpOworCSBicmVhazsKKyAgICAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEY6CisJIG1zZ190eXBlID0gQlJXX1NBTVBMRVJfTUVTU0FHRV9TSU1ENFgyX0xEOworCSBhc3NlcnQoaW5zdC0+bWxlbiA9PSAyKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIFNIQURFUl9PUENPREVfVFhTOgorCSBtc2dfdHlwZSA9IEJSV19TQU1QTEVSX01FU1NBR0VfU0lNRDRYMl9SRVNJTkZPOworCSBhc3NlcnQoaW5zdC0+bWxlbiA9PSAyKTsKKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBhc3NlcnQoISJzaG91bGQgbm90IGdldCBoZXJlOiBpbnZhbGlkIHZlYzQgdGV4dHVyZSBvcGNvZGUiKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGFzc2VydChtc2dfdHlwZSAhPSAtMSk7CisKKyAgIC8qIExvYWQgdGhlIG1lc3NhZ2UgaGVhZGVyIGlmIHByZXNlbnQuICBJZiB0aGVyZSdzIGEgdGV4dHVyZSBvZmZzZXQsIHdlIG5lZWQKKyAgICAqIHRvIHNldCBpdCB1cCBleHBsaWNpdGx5IGFuZCBsb2FkIHRoZSBvZmZzZXQgYml0ZmllbGQuICBPdGhlcndpc2UsIHdlIGNhbgorICAgICogdXNlIGFuIGltcGxpZWQgbW92ZSBmcm9tIGcwIHRvIHRoZSBmaXJzdCBtZXNzYWdlIHJlZ2lzdGVyLgorICAgICovCisgICBpZiAoaW5zdC0+aGVhZGVyX3ByZXNlbnQpIHsKKyAgICAgIGlmIChicnctPmdlbiA8IDYgJiYgIWluc3QtPnRleHR1cmVfb2Zmc2V0KSB7CisgICAgICAgICAvKiBTZXQgdXAgYW4gaW1wbGllZCBtb3ZlIGZyb20gZzAgdG8gdGhlIE1SRi4gKi8KKyAgICAgICAgIHNyYyA9IGJyd192ZWM4X2dyZigwLCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBoZWFkZXIgPQorICAgICAgICAgICAgcmV0eXBlKGJyd19tZXNzYWdlX3JlZyhpbnN0LT5iYXNlX21yZiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgICAgICAgLyogRXhwbGljaXRseSBzZXQgdXAgdGhlIG1lc3NhZ2UgaGVhZGVyIGJ5IGNvcHlpbmcgZzAgdG8gdGhlIE1SRi4gKi8KKyAgICAgICAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICAgICAgICBicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19ESVNBQkxFKTsKKyAgICAgICAgIGJyd19NT1YocCwgaGVhZGVyLCByZXR5cGUoYnJ3X3ZlYzhfZ3JmKDAsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworCisgICAgICAgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKworICAgICAgICAgaWYgKGluc3QtPnRleHR1cmVfb2Zmc2V0KSB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIHRleGVsIG9mZnNldCBiaXRzIGluIERXb3JkIDIuICovCisgICAgICAgICAgICBicndfTU9WKHAsIGdldF9lbGVtZW50X3VkKGhlYWRlciwgMiksCisgICAgICAgICAgICAgICAgICAgIGJyd19pbW1fdWQoaW5zdC0+dGV4dHVyZV9vZmZzZXQpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGluc3QtPnNhbXBsZXIgPj0gMTYpIHsKKyAgICAgICAgICAgIC8qIFRoZSAiU2FtcGxlciBJbmRleCIgZmllbGQgY2FuIG9ubHkgc3RvcmUgdmFsdWVzIGJldHdlZW4gMCBhbmQgMTUuCisgICAgICAgICAgICAgKiBIb3dldmVyLCB3ZSBjYW4gYWRkIGFuIG9mZnNldCB0byB0aGUgIlNhbXBsZXIgU3RhdGUgUG9pbnRlciIKKyAgICAgICAgICAgICAqIGZpZWxkLCBlZmZlY3RpdmVseSBzZWxlY3RpbmcgYSBkaWZmZXJlbnQgc2V0IG9mIDE2IHNhbXBsZXJzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoZSAiU2FtcGxlciBTdGF0ZSBQb2ludGVyIiBuZWVkcyB0byBiZSBhbGlnbmVkIHRvIGEgMzItYnl0ZQorICAgICAgICAgICAgICogb2Zmc2V0LCBhbmQgZWFjaCBzYW1wbGVyIHN0YXRlIGlzIG9ubHkgMTYtYnl0ZXMsIHNvIHdlIGNhbid0CisgICAgICAgICAgICAgKiBleGNsdXNpdmVseSB1c2UgdGhlIG9mZnNldCAtIHdlIGhhdmUgdG8gdXNlIGJvdGguCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydChicnctPmlzX2hhc3dlbGwpOyAvKiBmaWVsZCBvbmx5IGV4aXN0cyBvbiBIYXN3ZWxsICovCisgICAgICAgICAgICBicndfQUREKHAsCisgICAgICAgICAgICAgICAgICAgIGdldF9lbGVtZW50X3VkKGhlYWRlciwgMyksCisgICAgICAgICAgICAgICAgICAgIGdldF9lbGVtZW50X3VkKGJyd192ZWM4X2dyZigwLCAwKSwgMyksCisgICAgICAgICAgICAgICAgICAgIGJyd19pbW1fdWQoMTYgKiAoaW5zdC0+c2FtcGxlciAvIDE2KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdlbjdfc2FtcGxlcl9zdGF0ZSkpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKKyAgICAgIH0KKyAgIH0KKworICAgdWludDMyX3QgcmV0dXJuX2Zvcm1hdDsKKworICAgc3dpdGNoIChkc3QudHlwZSkgeworICAgY2FzZSBCUldfUkVHSVNURVJfVFlQRV9EOgorICAgICAgcmV0dXJuX2Zvcm1hdCA9IEJSV19TQU1QTEVSX1JFVFVSTl9GT1JNQVRfU0lOVDMyOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19SRUdJU1RFUl9UWVBFX1VEOgorICAgICAgcmV0dXJuX2Zvcm1hdCA9IEJSV19TQU1QTEVSX1JFVFVSTl9GT1JNQVRfVUlOVDMyOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuX2Zvcm1hdCA9IEJSV19TQU1QTEVSX1JFVFVSTl9GT1JNQVRfRkxPQVQzMjsKKyAgICAgIGJyZWFrOworICAgfQorCisgICB1aW50MzJfdCBzdXJmYWNlX2luZGV4ID0gKChpbnN0LT5vcGNvZGUgPT0gU0hBREVSX09QQ09ERV9URzQgfHwKKyAgICAgIGluc3QtPm9wY29kZSA9PSBTSEFERVJfT1BDT0RFX1RHNF9PRkZTRVQpCisgICAgICA/IHByb2dfZGF0YS0+YmFzZS5iaW5kaW5nX3RhYmxlLmdhdGhlcl90ZXh0dXJlX3N0YXJ0CisgICAgICA6IHByb2dfZGF0YS0+YmFzZS5iaW5kaW5nX3RhYmxlLnRleHR1cmVfc3RhcnQpICsgaW5zdC0+c2FtcGxlcjsKKworICAgYnJ3X1NBTVBMRShwLAorCSAgICAgIGRzdCwKKwkgICAgICBpbnN0LT5iYXNlX21yZiwKKwkgICAgICBzcmMsCisgICAgICAgICAgICAgIHN1cmZhY2VfaW5kZXgsCisJICAgICAgaW5zdC0+c2FtcGxlciAlIDE2LAorCSAgICAgIG1zZ190eXBlLAorCSAgICAgIDEsIC8qIHJlc3BvbnNlIGxlbmd0aCAqLworCSAgICAgIGluc3QtPm1sZW4sCisJICAgICAgaW5zdC0+aGVhZGVyX3ByZXNlbnQsCisJICAgICAgQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQ0WDIsCisJICAgICAgcmV0dXJuX2Zvcm1hdCk7CisKKyAgIGJyd19tYXJrX3N1cmZhY2VfdXNlZCgmcHJvZ19kYXRhLT5iYXNlLCBzdXJmYWNlX2luZGV4KTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3ZzX3VyYl93cml0ZSh2ZWM0X2luc3RydWN0aW9uICppbnN0KQoreworICAgYnJ3X3VyYl9XUklURShwLAorCQkgYnJ3X251bGxfcmVnKCksIC8qIGRlc3QgKi8KKwkJIGluc3QtPmJhc2VfbXJmLCAvKiBzdGFydGluZyBtcmYgcmVnIG5yICovCisJCSBicndfdmVjOF9ncmYoMCwgMCksIC8qIHNyYyAqLworICAgICAgICAgICAgICAgICBpbnN0LT51cmJfd3JpdGVfZmxhZ3MsCisJCSBpbnN0LT5tbGVuLAorCQkgMCwJCS8qIHJlc3BvbnNlIGxlbiAqLworCQkgaW5zdC0+b2Zmc2V0LAkvKiB1cmIgZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSBCUldfVVJCX1NXSVpaTEVfSU5URVJMRUFWRSk7Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc191cmJfd3JpdGUodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIHNyYyA9IGJyd19tZXNzYWdlX3JlZyhpbnN0LT5iYXNlX21yZik7CisgICBicndfdXJiX1dSSVRFKHAsCisgICAgICAgICAgICAgICAgIGJyd19udWxsX3JlZygpLCAvKiBkZXN0ICovCisgICAgICAgICAgICAgICAgIGluc3QtPmJhc2VfbXJmLCAvKiBzdGFydGluZyBtcmYgcmVnIG5yICovCisgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgaW5zdC0+dXJiX3dyaXRlX2ZsYWdzLAorICAgICAgICAgICAgICAgICBpbnN0LT5tbGVuLAorICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAvKiByZXNwb25zZSBsZW4gKi8KKyAgICAgICAgICAgICAgICAgaW5zdC0+b2Zmc2V0LCAgLyogdXJiIGRlc3RpbmF0aW9uIG9mZnNldCAqLworICAgICAgICAgICAgICAgICBCUldfVVJCX1NXSVpaTEVfSU5URVJMRUFWRSk7Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc190aHJlYWRfZW5kKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMgPSBicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYpOworICAgYnJ3X3VyYl9XUklURShwLAorICAgICAgICAgICAgICAgICBicndfbnVsbF9yZWcoKSwgLyogZGVzdCAqLworICAgICAgICAgICAgICAgICBpbnN0LT5iYXNlX21yZiwgLyogc3RhcnRpbmcgbXJmIHJlZyBuciAqLworICAgICAgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICAgICAgIEJSV19VUkJfV1JJVEVfRU9ULAorICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgLyogbWVzc2FnZSBsZW4gKi8KKyAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIC8qIHJlc3BvbnNlIGxlbiAqLworICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgLyogdXJiIGRlc3RpbmF0aW9uIG9mZnNldCAqLworICAgICAgICAgICAgICAgICBCUldfVVJCX1NXSVpaTEVfSU5URVJMRUFWRSk7Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc19zZXRfd3JpdGVfb2Zmc2V0KHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKQoreworICAgLyogRnJvbSBwMjIgb2Ygdm9sdW1lIDQgcGFydCAyIG9mIHRoZSBJdnkgQnJpZGdlIFBSTSAoMi40LjMuMSBNZXNzYWdlCisgICAgKiBIZWFkZXI6IE0wLjMpOgorICAgICoKKyAgICAqICAgICBTbG90IDAgT2Zmc2V0LiBUaGlzIGZpZWxkLCBhZnRlciBhZGRpbmcgdG8gdGhlIEdsb2JhbCBPZmZzZXQgZmllbGQKKyAgICAqICAgICBpbiB0aGUgbWVzc2FnZSBkZXNjcmlwdG9yLCBzcGVjaWZpZXMgdGhlIG9mZnNldCAoaW4gMjU2LWJpdCB1bml0cykKKyAgICAqICAgICBmcm9tIHRoZSBzdGFydCBvZiB0aGUgVVJCIGVudHJ5LCBhcyByZWZlcmVuY2VkIGJ5IFVSQiBIYW5kbGUgMCwgYXQKKyAgICAqICAgICB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIGFjY2Vzc2VkLgorICAgICoKKyAgICAqIFNpbWlsYXIgdGV4dCBkZXNjcmliZXMgRFdPUkQgTTAuNCwgd2hpY2ggaXMgc2xvdCAxIG9mZnNldC4KKyAgICAqCisgICAgKiBUaGVyZWZvcmUsIHdlIHdhbnQgdG8gbXVsdGlwbHkgRFdPUkRzIDAgYW5kIDQgb2Ygc3JjMCAodGhlIHggY29tcG9uZW50cworICAgICogb2YgdGhlIHJlZ2lzdGVyIGZvciBnZW9tZXRyeSBzaGFkZXIgaW52b2NhdGlvbnMgMCBhbmQgMSkgYnkgdGhlCisgICAgKiBpbW1lZGlhdGUgdmFsdWUgaW4gc3JjMSwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gRFdPUkRzIDMgYW5kIDQgb2YgZHN0LgorICAgICoKKyAgICAqIFdlIGNhbiBkbyB0aGlzIHdpdGggdGhlIGZvbGxvd2luZyBFVSBpbnN0cnVjdGlvbjoKKyAgICAqCisgICAgKiAgICAgbXVsKDIpIGRzdC4zPDE+VUQgc3JjMDw4OzIsND5VRCBzcmMxICAgeyBBbGlnbjEgV0VfYWxsIH0KKyAgICAqLworICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzEpOworICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgQlJXX01BU0tfRElTQUJMRSk7CisgICBicndfTVVMKHAsIHN1Ym9mZnNldChzdHJpZGUoZHN0LCAyLCAyLCAxKSwgMyksIHN0cmlkZShzcmMwLCA4LCAyLCA0KSwKKyAgICAgICAgICAgc3JjMSk7CisgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xNik7CisgICBicndfcG9wX2luc25fc3RhdGUocCk7Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc19zZXRfdmVydGV4X2NvdW50KHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYykKK3sKKyAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKyAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworCisgICAvKiBJZiB3ZSB0aGluayBvZiB0aGUgc3JjIGFuZCBkc3QgcmVnaXN0ZXJzIGFzIGNvbXBvc2VkIG9mIDggRFdPUkRzIGVhY2gsCisgICAgKiB3ZSB3YW50IHRvIHBpY2sgdXAgdGhlIGNvbnRlbnRzIG9mIERXT1JEcyAwIGFuZCA0IGZyb20gc3JjLCB0cnVuY2F0ZQorICAgICogdGhlbSB0byBXT1JEcywgYW5kIHRoZW4gcGFjayB0aGVtIGludG8gRFdPUkQgMiBvZiBkc3QuCisgICAgKgorICAgICogSXQncyBlYXNpZXIgdG8gZ2V0IHRoZSBFVSB0byBkbyB0aGlzIGlmIHdlIHRoaW5rIG9mIHRoZSBzcmMgYW5kIGRzdAorICAgICogcmVnaXN0ZXJzIGFzIGNvbXBvc2VkIG9mIDE2IFdPUkRTIGVhY2g7IHRoZW4sIHdlIHdhbnQgdG8gcGljayB1cCB0aGUKKyAgICAqIGNvbnRlbnRzIG9mIFdPUkRzIDAgYW5kIDggZnJvbSBzcmMsIGFuZCBwYWNrIHRoZW0gaW50byBXT1JEcyA0IGFuZCA1IG9mCisgICAgKiBkc3QuCisgICAgKgorICAgICogV2UgY2FuIGRvIHRoYXQgYnkgdGhlIGZvbGxvd2luZyBFVSBpbnN0cnVjdGlvbjoKKyAgICAqCisgICAgKiAgICAgbW92ICgyKSBkc3QuNDwxPjp1dyBzcmM8ODsxLDA+OnV3ICAgeyBBbGlnbjEsIFExLCBOb01hc2sgfQorICAgICovCisgICBicndfTU9WKHAsIHN1Ym9mZnNldChzdHJpZGUocmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpLCAyLCAyLCAxKSwgNCksCisgICAgICAgICAgIHN0cmlkZShyZXR5cGUoc3JjLCBCUldfUkVHSVNURVJfVFlQRV9VVyksIDgsIDEsIDApKTsKKyAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzE2KTsKKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dzX3NldF9kd29yZF8yX2ltbWVkKHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMpCit7CisgICBhc3NlcnQoc3JjLmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSk7CisKKyAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKyAgIGJyd19zZXRfbWFza19jb250cm9sKHAsIEJSV19NQVNLX0RJU0FCTEUpOworICAgYnJ3X01PVihwLCBzdWJvZmZzZXQodmVjMShkc3QpLCAyKSwgc3JjKTsKKyAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzE2KTsKKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dzX3ByZXBhcmVfY2hhbm5lbF9tYXNrcyhzdHJ1Y3QgYnJ3X3JlZyBkc3QpCit7CisgICAvKiBXZSB3YW50IHRvIGxlZnQgc2hpZnQganVzdCBEV09SRCA0ICh0aGUgeCBjb21wb25lbnQgYmVsb25naW5nIHRvIHRoZQorICAgICogc2Vjb25kIGdlb21ldHJ5IHNoYWRlciBpbnZvY2F0aW9uKSBieSA0IGJpdHMuICBTbyBnZW5lcmF0ZSB0aGUKKyAgICAqIGluc3RydWN0aW9uOgorICAgICoKKyAgICAqICAgICBzaGwoMSkgZHN0LjQ8MT5VRCBkc3QuNDwwLDEsMD5VRCA0VUQgeyBhbGlnbjEgV0VfYWxsIH0KKyAgICAqLworICAgZHN0ID0gc3Vib2Zmc2V0KHZlYzEoZHN0KSwgNCk7CisgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgYnJ3X3NldF9hY2Nlc3NfbW9kZShwLCBCUldfQUxJR05fMSk7CisgICBicndfc2V0X21hc2tfY29udHJvbChwLCBCUldfTUFTS19ESVNBQkxFKTsKKyAgIGJyd19TSEwocCwgZHN0LCBkc3QsIGJyd19pbW1fdWQoNCkpOworICAgYnJ3X3BvcF9pbnNuX3N0YXRlKHApOworfQorCit2b2lkCit2ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ3Nfc2V0X2NoYW5uZWxfbWFza3Moc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYykKK3sKKyAgIC8qIEZyb20gcDIxIG9mIHZvbHVtZSA0IHBhcnQgMiBvZiB0aGUgSXZ5IEJyaWRnZSBQUk0gKDIuNC4zLjEgTWVzc2FnZQorICAgICogSGVhZGVyOiBNMC41KToKKyAgICAqCisgICAgKiAgICAgMTUgVmVydGV4IDEgREFUQSBbM10gLyBWZXJ0ZXggMCBEQVRBWzddIENoYW5uZWwgTWFzaworICAgICoKKyAgICAqICAgICAgICBXaGVuIFN3aXp6bGUgQ29udHJvbCA9IFVSQl9JTlRFUkxFQVZFRCB0aGlzIGJpdCBjb250cm9scyBWZXJ0ZXggMQorICAgICogICAgICAgIERBVEFbM10sIHdoZW4gU3dpenpsZSBDb250cm9sID0gVVJCX05PU1dJWlpMRSB0aGlzIGJpdCBjb250cm9scworICAgICogICAgICAgIFZlcnRleCAwIERBVEFbN10uICBUaGlzIGJpdCBpcyBBTkRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCisgICAgKiAgICAgICAgY2hhbm5lbCBlbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBjaGFubmVsIGVuYWJsZS4gIEZvciB0aGUKKyAgICAqICAgICAgICBVUkJfUkVBRF9PV09SRCAmIFVSQl9SRUFEX0hXT1JEIG1lc3NhZ2VzLCB3aGVuIGZpbmFsIGNoYW5uZWwKKyAgICAqICAgICAgICBlbmFibGUgaXMgMSBpdCBpbmRpY2F0ZXMgdGhhdCBWZXJ0ZXggMSBEQVRBIFszXSB3aWxsIGJlIGluY2x1ZGVkCisgICAgKiAgICAgICAgaW4gdGhlIHdyaXRlYmFjayBtZXNzYWdlLiAgRm9yIHRoZSBVUkJfV1JJVEVfT1dPUkQgJgorICAgICogICAgICAgIFVSQl9XUklURV9IV09SRCBtZXNzYWdlcywgd2hlbiBmaW5hbCBjaGFubmVsIGVuYWJsZSBpcyAxIGl0CisgICAgKiAgICAgICAgaW5kaWNhdGVzIHRoYXQgVmVydGV4IDEgREFUQSBbM10gd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBzdXJmYWNlLgorICAgICoKKyAgICAqICAgICAgICAwOiBWZXJ0ZXggMSBEQVRBIFszXSAvIFZlcnRleCAwIERBVEFbN10gY2hhbm5lbCBub3QgaW5jbHVkZWQKKyAgICAqICAgICAgICAxOiBWZXJ0ZXggREFUQSBbM10gLyBWZXJ0ZXggMCBEQVRBWzddIGNoYW5uZWwgaW5jbHVkZWQKKyAgICAqCisgICAgKiAgICAgMTQgVmVydGV4IDEgREFUQSBbMl0gQ2hhbm5lbCBNYXNrCisgICAgKiAgICAgMTMgVmVydGV4IDEgREFUQSBbMV0gQ2hhbm5lbCBNYXNrCisgICAgKiAgICAgMTIgVmVydGV4IDEgREFUQSBbMF0gQ2hhbm5lbCBNYXNrCisgICAgKiAgICAgMTEgVmVydGV4IDAgREFUQSBbM10gQ2hhbm5lbCBNYXNrCisgICAgKiAgICAgMTAgVmVydGV4IDAgREFUQSBbMl0gQ2hhbm5lbCBNYXNrCisgICAgKiAgICAgIDkgVmVydGV4IDAgREFUQSBbMV0gQ2hhbm5lbCBNYXNrCisgICAgKiAgICAgIDggVmVydGV4IDAgREFUQSBbMF0gQ2hhbm5lbCBNYXNrCisgICAgKgorICAgICogKFRoaXMgaXMgZnJvbSBhIHNlY3Rpb24gb2YgdGhlIFBSTSB0aGF0IGlzIGFnbm9zdGljIHRvIHRoZSBwYXJ0aWN1bGFyCisgICAgKiB0eXBlIG9mIHNoYWRlciBiZWluZyBleGVjdXRlZCwgc28gIlZlcnRleCAwIiBhbmQgIlZlcnRleCAxIiByZWZlciB0bworICAgICogZ2VvbWV0cnkgc2hhZGVyIGludm9jYXRpb25zIDAgYW5kIDEsIHJlc3BlY3RpdmVseSkuICBTaW5jZSB3ZSBoYXZlIHRoZQorICAgICogZW5hYmxlIGZsYWdzIGZvciBnZW9tZXRyeSBzaGFkZXIgaW52b2NhdGlvbiAwIGluIGJpdHMgMzowIG9mIERXT1JEIDAsCisgICAgKiBhbmQgdGhlIGVuYWJsZSBmbGFncyBmb3IgZ2VvbWV0cnkgc2hhZGVyIGludm9jYXRpb24gMSBpbiBiaXRzIDc6MCBvZgorICAgICogRFdPUkQgNCwgd2UganVzdCBuZWVkIHRvIE9SIHRoZW0gdG9nZXRoZXIgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYml0cworICAgICogMTU6OCBvZiBEV09SRCA1LgorICAgICoKKyAgICAqIEl0J3MgZWFzaWVyIHRvIGdldCB0aGUgRVUgdG8gZG8gdGhpcyBpZiB3ZSB0aGluayBvZiB0aGUgc3JjIGFuZCBkc3QKKyAgICAqIHJlZ2lzdGVycyBhcyBjb21wb3NlZCBvZiAzMiBieXRlcyBlYWNoOyB0aGVuLCB3ZSB3YW50IHRvIHBpY2sgdXAgdGhlCisgICAgKiBjb250ZW50cyBvZiBieXRlcyAwIGFuZCAxNiBmcm9tIHNyYywgT1IgdGhlbSB0b2dldGhlciwgYW5kIHN0b3JlIHRoZW0gaW4KKyAgICAqIGJ5dGUgMjEuCisgICAgKgorICAgICogV2UgY2FuIGRvIHRoYXQgYnkgdGhlIGZvbGxvd2luZyBFVSBpbnN0cnVjdGlvbjoKKyAgICAqCisgICAgKiAgICAgb3IoMSkgZHN0LjIxPDE+VUIgc3JjPDAsMSwwPlVCIHNyYy4xNjwwLDEsMD5VQiB7IGFsaWduMSBXRV9hbGwgfQorICAgICoKKyAgICAqIE5vdGU6IHRoaXMgcmVsaWVzIG9uIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaGF2aW5nIHplcm9zIGluIChhKSBiaXRzIDc6NCBvZgorICAgICogRFdPUkQgMCBhbmQgKGIpIGJpdHMgMzowIG9mIERXT1JEIDQuICBXZSBjYW4gcmVseSBvbiAoYikgYmVjYXVzZSB0aGUKKyAgICAqIHNvdXJjZSByZWdpc3RlciB3YXMgcHJlcGFyZWQgYnkgR1NfT1BDT0RFX1BSRVBBUkVfQ0hBTk5FTF9NQVNLUyAod2hpY2gKKyAgICAqIHNoaWZ0cyBEV09SRCA0IGxlZnQgYnkgNCBiaXRzKSwgYW5kIHdlIGNhbiByZWx5IG9uIChhKSBiZWNhdXNlIHByaW9yIHRvCisgICAgKiB0aGUgZXhlY3V0aW9uIG9mIEdTX09QQ09ERV9QUkVQQVJFX0NIQU5ORUxfTUFTS1MsIERXT1JEcyAwIGFuZCA0IG5lZWQgdG8KKyAgICAqIGNvbnRhaW4gdmFsaWQgY2hhbm5lbCBtYXNrIHZhbHVlcyAod2hpY2ggYXJlIGluIHRoZSByYW5nZSAweDAtMHhmKS4KKyAgICAqLworICAgZHN0ID0gcmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUIpOworICAgc3JjID0gcmV0eXBlKHNyYywgQlJXX1JFR0lTVEVSX1RZUEVfVUIpOworICAgYnJ3X3B1c2hfaW5zbl9zdGF0ZShwKTsKKyAgIGJyd19zZXRfYWNjZXNzX21vZGUocCwgQlJXX0FMSUdOXzEpOworICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgQlJXX01BU0tfRElTQUJMRSk7CisgICBicndfT1IocCwgc3Vib2Zmc2V0KHZlYzEoZHN0KSwgMjEpLCB2ZWMxKHNyYyksIHN1Ym9mZnNldCh2ZWMxKHNyYyksIDE2KSk7CisgICBicndfcG9wX2luc25fc3RhdGUocCk7Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc19nZXRfaW5zdGFuY2VfaWQoc3RydWN0IGJyd19yZWcgZHN0KQoreworICAgLyogV2Ugd2FudCB0byByaWdodCBzaGlmdCBSMC4wICYgUjAuMSBieSBHRU43X0dTX1BBWUxPQURfSU5TVEFOQ0VfSURfU0hJRlQKKyAgICAqIGFuZCBzdG9yZSBpbnRvIGRzdC4wICYgZHN0LjQuIFNvIGdlbmVyYXRlIHRoZSBpbnN0cnVjdGlvbjoKKyAgICAqCisgICAgKiAgICAgc2hyKDgpIGRzdDwxPiBSMDwxLDQsMD4gR0VON19HU19QQVlMT0FEX0lOU1RBTkNFX0lEX1NISUZUIHsgYWxpZ24xIFdFX25vcm1hbCAxUSB9CisgICAgKi8KKyAgIGJyd19wdXNoX2luc25fc3RhdGUocCk7CisgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKyAgIGRzdCA9IHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgIHN0cnVjdCBicndfcmVnIHIwKHJldHlwZShicndfdmVjOF9ncmYoMCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICBicndfU0hSKHAsIGRzdCwgc3RyaWRlKHIwLCAxLCA0LCAwKSwKKyAgICAgICAgICAgYnJ3X2ltbV91ZChHRU43X0dTX1BBWUxPQURfSU5TVEFOQ0VfSURfU0hJRlQpKTsKKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX293b3JkX2R1YWxfYmxvY2tfb2Zmc2V0cyhzdHJ1Y3QgYnJ3X3JlZyBtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgaW5kZXgpCit7CisgICBpbnQgc2Vjb25kX3ZlcnRleF9vZmZzZXQ7CisKKyAgIGlmIChicnctPmdlbiA+PSA2KQorICAgICAgc2Vjb25kX3ZlcnRleF9vZmZzZXQgPSAxOworICAgZWxzZQorICAgICAgc2Vjb25kX3ZlcnRleF9vZmZzZXQgPSAxNjsKKworICAgbTEgPSByZXR5cGUobTEsIEJSV19SRUdJU1RFUl9UWVBFX0QpOworCisgICAvKiBTZXQgdXAgTTEgKG1lc3NhZ2UgcGF5bG9hZCkuICBPbmx5IHRoZSBibG9jayBvZmZzZXRzIGluIE0xLjAgYW5kCisgICAgKiBNMS40IGFyZSB1c2VkLCBhbmQgdGhlIHJlc3QgYXJlIGlnbm9yZWQuCisgICAgKi8KKyAgIHN0cnVjdCBicndfcmVnIG0xXzAgPSBzdWJvZmZzZXQodmVjMShtMSksIDApOworICAgc3RydWN0IGJyd19yZWcgbTFfNCA9IHN1Ym9mZnNldCh2ZWMxKG0xKSwgNCk7CisgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleF8wID0gc3Vib2Zmc2V0KHZlYzEoaW5kZXgpLCAwKTsKKyAgIHN0cnVjdCBicndfcmVnIGluZGV4XzQgPSBzdWJvZmZzZXQodmVjMShpbmRleCksIDQpOworCisgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgQlJXX01BU0tfRElTQUJMRSk7CisgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKworICAgYnJ3X01PVihwLCBtMV8wLCBpbmRleF8wKTsKKworICAgaWYgKGluZGV4LmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSkgeworICAgICAgaW5kZXhfNC5kdzEudWQgKz0gc2Vjb25kX3ZlcnRleF9vZmZzZXQ7CisgICAgICBicndfTU9WKHAsIG0xXzQsIGluZGV4XzQpOworICAgfSBlbHNlIHsKKyAgICAgIGJyd19BREQocCwgbTFfNCwgaW5kZXhfNCwgYnJ3X2ltbV9kKHNlY29uZF92ZXJ0ZXhfb2Zmc2V0KSk7CisgICB9CisKKyAgIGJyd19wb3BfaW5zbl9zdGF0ZShwKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3VucGFja19mbGFncyh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QpCit7CisgICBicndfcHVzaF9pbnNuX3N0YXRlKHApOworICAgYnJ3X3NldF9tYXNrX2NvbnRyb2wocCwgQlJXX01BU0tfRElTQUJMRSk7CisgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xKTsKKworICAgc3RydWN0IGJyd19yZWcgZmxhZ3MgPSBicndfZmxhZ19yZWcoMCwgMCk7CisgICBzdHJ1Y3QgYnJ3X3JlZyBkc3RfMCA9IHN1Ym9mZnNldCh2ZWMxKGRzdCksIDApOworICAgc3RydWN0IGJyd19yZWcgZHN0XzQgPSBzdWJvZmZzZXQodmVjMShkc3QpLCA0KTsKKworICAgYnJ3X0FORChwLCBkc3RfMCwgZmxhZ3MsIGJyd19pbW1fdWQoMHgwZikpOworICAgYnJ3X0FORChwLCBkc3RfNCwgZmxhZ3MsIGJyd19pbW1fdWQoMHhmMCkpOworICAgYnJ3X1NIUihwLCBkc3RfNCwgZHN0XzQsIGJyd19pbW1fdWQoNCkpOworCisgICBicndfcG9wX2luc25fc3RhdGUocCk7Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zY3JhdGNoX3JlYWQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIGhlYWRlciA9IGJyd192ZWM4X2dyZigwLCAwKTsKKworICAgZ2VuNl9yZXNvbHZlX2ltcGxpZWRfbW92ZShwLCAmaGVhZGVyLCBpbnN0LT5iYXNlX21yZik7CisKKyAgIGdlbmVyYXRlX293b3JkX2R1YWxfYmxvY2tfb2Zmc2V0cyhicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYgKyAxKSwKKwkJCQkgICAgIGluZGV4KTsKKworICAgdWludDMyX3QgbXNnX3R5cGU7CisKKyAgIGlmIChicnctPmdlbiA+PSA2KQorICAgICAgbXNnX3R5cGUgPSBHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1JFQUQ7CisgICBlbHNlIGlmIChicnctPmdlbiA9PSA1IHx8IGJydy0+aXNfZzR4KQorICAgICAgbXNnX3R5cGUgPSBHNDVfREFUQVBPUlRfUkVBRF9NRVNTQUdFX09XT1JEX0RVQUxfQkxPQ0tfUkVBRDsKKyAgIGVsc2UKKyAgICAgIG1zZ190eXBlID0gQlJXX0RBVEFQT1JUX1JFQURfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1JFQUQ7CisKKyAgIC8qIEVhY2ggb2YgdGhlIDggY2hhbm5lbCBlbmFibGVzIGlzIGNvbnNpZGVyZWQgZm9yIHdoZXRoZXIgZWFjaAorICAgICogZHdvcmQgaXMgd3JpdHRlbi4KKyAgICAqLworICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqc2VuZCA9IGJyd19uZXh0X2luc24ocCwgQlJXX09QQ09ERV9TRU5EKTsKKyAgIGJyd19zZXRfZGVzdChwLCBzZW5kLCBkc3QpOworICAgYnJ3X3NldF9zcmMwKHAsIHNlbmQsIGhlYWRlcik7CisgICBpZiAoYnJ3LT5nZW4gPCA2KQorICAgICAgc2VuZC0+aGVhZGVyLmRlc3RyZWdfX2NvbmRpdGlvbmFsbW9kID0gaW5zdC0+YmFzZV9tcmY7CisgICBicndfc2V0X2RwX3JlYWRfbWVzc2FnZShwLCBzZW5kLAorCQkJICAgMjU1LCAvKiBiaW5kaW5nIHRhYmxlIGluZGV4OiBzdGF0ZWxlc3MgYWNjZXNzICovCisJCQkgICBCUldfREFUQVBPUlRfT1dPUkRfRFVBTF9CTE9DS18xT1dPUkQsCisJCQkgICBtc2dfdHlwZSwKKwkJCSAgIEJSV19EQVRBUE9SVF9SRUFEX1RBUkdFVF9SRU5ERVJfQ0FDSEUsCisJCQkgICAyLCAvKiBtbGVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvKiBoZWFkZXJfcHJlc2VudCAqLworCQkJICAgMSAvKiBybGVuICovKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NjcmF0Y2hfd3JpdGUodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGluZGV4KQoreworICAgc3RydWN0IGJyd19yZWcgaGVhZGVyID0gYnJ3X3ZlYzhfZ3JmKDAsIDApOworICAgYm9vbCB3cml0ZV9jb21taXQ7CisKKyAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBwcmVkaWNhdGVkLCB3ZSdsbCBwcmVkaWNhdGUgdGhlIHNlbmQsIG5vdAorICAgICogdGhlIGhlYWRlciBzZXR1cC4KKyAgICAqLworICAgYnJ3X3NldF9wcmVkaWNhdGVfY29udHJvbChwLCBmYWxzZSk7CisKKyAgIGdlbjZfcmVzb2x2ZV9pbXBsaWVkX21vdmUocCwgJmhlYWRlciwgaW5zdC0+YmFzZV9tcmYpOworCisgICBnZW5lcmF0ZV9vd29yZF9kdWFsX2Jsb2NrX29mZnNldHMoYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmICsgMSksCisJCQkJICAgICBpbmRleCk7CisKKyAgIGJyd19NT1YocCwKKwkgICByZXR5cGUoYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmICsgMiksIEJSV19SRUdJU1RFUl9UWVBFX0QpLAorCSAgIHJldHlwZShzcmMsIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKworICAgdWludDMyX3QgbXNnX3R5cGU7CisKKyAgIGlmIChicnctPmdlbiA+PSA3KQorICAgICAgbXNnX3R5cGUgPSBHRU43X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfT1dPUkRfRFVBTF9CTE9DS19XUklURTsKKyAgIGVsc2UgaWYgKGJydy0+Z2VuID09IDYpCisgICAgICBtc2dfdHlwZSA9IEdFTjZfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1dSSVRFOworICAgZWxzZQorICAgICAgbXNnX3R5cGUgPSBCUldfREFUQVBPUlRfV1JJVEVfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1dSSVRFOworCisgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIGluc3QtPnByZWRpY2F0ZSk7CisKKyAgIC8qIFByZS1nZW42LCB3ZSBoYXZlIHRvIHNwZWNpZnkgd3JpdGUgY29tbWl0cyB0byBlbnN1cmUgb3JkZXJpbmcKKyAgICAqIGJldHdlZW4gcmVhZHMgYW5kIHdyaXRlcyB3aXRoaW4gYSB0aHJlYWQuICBBZnRlcndhcmRzLCB0aGF0J3MKKyAgICAqIGd1YXJhbnRlZWQgYW5kIHdyaXRlIGNvbW1pdHMgb25seSBtYXR0ZXIgZm9yIGludGVyLXRocmVhZAorICAgICogc3luY2hyb25pemF0aW9uLgorICAgICovCisgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgd3JpdGVfY29tbWl0ID0gZmFsc2U7CisgICB9IGVsc2UgeworICAgICAgLyogVGhlIHZpc2l0b3Igc2V0IHVwIG91ciBkZXN0aW5hdGlvbiByZWdpc3RlciB0byBiZSBnMC4gIFRoaXMKKyAgICAgICAqIG1lYW5zIHRoYXQgd2hlbiB0aGUgbmV4dCByZWFkIGNvbWVzIGFsb25nLCB3ZSB3aWxsIGVuZCB1cAorICAgICAgICogcmVhZGluZyBmcm9tIGcwIGFuZCBjYXVzaW5nIGEgYmxvY2sgb24gdGhlIHdyaXRlIGNvbW1pdC4gIEZvcgorICAgICAgICogd3JpdGUtYWZ0ZXItcmVhZCwgd2UgYXJlIHJlbHlpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91cworICAgICAgICogcmVhZCBiZWluZyB1c2VkIChhbmQgdGh1cyBibG9ja2luZyBvbiBjb21wbGV0aW9uKSBiZWZvcmUgb3VyCisgICAgICAgKiB3cml0ZSBpcyBleGVjdXRlZC4gIFRoaXMgbWVhbnMgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIGluCisgICAgICAgKiBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIHRvIG5vdCB2aW9sYXRlIHRoaXMgYXNzdW1wdGlvbi4KKyAgICAgICAqLworICAgICAgd3JpdGVfY29tbWl0ID0gdHJ1ZTsKKyAgIH0KKworICAgLyogRWFjaCBvZiB0aGUgOCBjaGFubmVsIGVuYWJsZXMgaXMgY29uc2lkZXJlZCBmb3Igd2hldGhlciBlYWNoCisgICAgKiBkd29yZCBpcyB3cml0dGVuLgorICAgICovCisgICBzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICpzZW5kID0gYnJ3X25leHRfaW5zbihwLCBCUldfT1BDT0RFX1NFTkQpOworICAgYnJ3X3NldF9kZXN0KHAsIHNlbmQsIGRzdCk7CisgICBicndfc2V0X3NyYzAocCwgc2VuZCwgaGVhZGVyKTsKKyAgIGlmIChicnctPmdlbiA8IDYpCisgICAgICBzZW5kLT5oZWFkZXIuZGVzdHJlZ19fY29uZGl0aW9uYWxtb2QgPSBpbnN0LT5iYXNlX21yZjsKKyAgIGJyd19zZXRfZHBfd3JpdGVfbWVzc2FnZShwLCBzZW5kLAorCQkJICAgIDI1NSwgLyogYmluZGluZyB0YWJsZSBpbmRleDogc3RhdGVsZXNzIGFjY2VzcyAqLworCQkJICAgIEJSV19EQVRBUE9SVF9PV09SRF9EVUFMX0JMT0NLXzFPV09SRCwKKwkJCSAgICBtc2dfdHlwZSwKKwkJCSAgICAzLCAvKiBtbGVuICovCisJCQkgICAgdHJ1ZSwgLyogaGVhZGVyIHByZXNlbnQgKi8KKwkJCSAgICBmYWxzZSwgLyogbm90IGEgcmVuZGVyIHRhcmdldCB3cml0ZSAqLworCQkJICAgIHdyaXRlX2NvbW1pdCwgLyogcmxlbiAqLworCQkJICAgIGZhbHNlLCAvKiBlb3QgKi8KKwkJCSAgICB3cml0ZV9jb21taXQpOworfQorCit2b2lkCit2ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHVsbF9jb25zdGFudF9sb2FkKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG9mZnNldCkKK3sKKyAgIGFzc2VydChicnctPmdlbiA8PSA3KTsKKyAgIGFzc2VydChpbmRleC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKwkgIGluZGV4LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgdWludDMyX3Qgc3VyZl9pbmRleCA9IGluZGV4LmR3MS51ZDsKKworICAgc3RydWN0IGJyd19yZWcgaGVhZGVyID0gYnJ3X3ZlYzhfZ3JmKDAsIDApOworCisgICBnZW42X3Jlc29sdmVfaW1wbGllZF9tb3ZlKHAsICZoZWFkZXIsIGluc3QtPmJhc2VfbXJmKTsKKworICAgYnJ3X01PVihwLCByZXR5cGUoYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmICsgMSksIEJSV19SRUdJU1RFUl9UWVBFX0QpLAorCSAgIG9mZnNldCk7CisKKyAgIHVpbnQzMl90IG1zZ190eXBlOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNikKKyAgICAgIG1zZ190eXBlID0gR0VONl9EQVRBUE9SVF9SRUFEX01FU1NBR0VfT1dPUkRfRFVBTF9CTE9DS19SRUFEOworICAgZWxzZSBpZiAoYnJ3LT5nZW4gPT0gNSB8fCBicnctPmlzX2c0eCkKKyAgICAgIG1zZ190eXBlID0gRzQ1X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1JFQUQ7CisgICBlbHNlCisgICAgICBtc2dfdHlwZSA9IEJSV19EQVRBUE9SVF9SRUFEX01FU1NBR0VfT1dPUkRfRFVBTF9CTE9DS19SRUFEOworCisgICAvKiBFYWNoIG9mIHRoZSA4IGNoYW5uZWwgZW5hYmxlcyBpcyBjb25zaWRlcmVkIGZvciB3aGV0aGVyIGVhY2gKKyAgICAqIGR3b3JkIGlzIHdyaXR0ZW4uCisgICAgKi8KKyAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKnNlbmQgPSBicndfbmV4dF9pbnNuKHAsIEJSV19PUENPREVfU0VORCk7CisgICBicndfc2V0X2Rlc3QocCwgc2VuZCwgZHN0KTsKKyAgIGJyd19zZXRfc3JjMChwLCBzZW5kLCBoZWFkZXIpOworICAgaWYgKGJydy0+Z2VuIDwgNikKKyAgICAgIHNlbmQtPmhlYWRlci5kZXN0cmVnX19jb25kaXRpb25hbG1vZCA9IGluc3QtPmJhc2VfbXJmOworICAgYnJ3X3NldF9kcF9yZWFkX21lc3NhZ2UocCwgc2VuZCwKKwkJCSAgIHN1cmZfaW5kZXgsCisJCQkgICBCUldfREFUQVBPUlRfT1dPUkRfRFVBTF9CTE9DS18xT1dPUkQsCisJCQkgICBtc2dfdHlwZSwKKwkJCSAgIEJSV19EQVRBUE9SVF9SRUFEX1RBUkdFVF9EQVRBX0NBQ0hFLAorCQkJICAgMiwgLyogbWxlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLyogaGVhZGVyX3ByZXNlbnQgKi8KKwkJCSAgIDEgLyogcmxlbiAqLyk7CisKKyAgIGJyd19tYXJrX3N1cmZhY2VfdXNlZCgmcHJvZ19kYXRhLT5iYXNlLCBzdXJmX2luZGV4KTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3B1bGxfY29uc3RhbnRfbG9hZF9nZW43KHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHN1cmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgb2Zmc2V0KQoreworICAgYXNzZXJ0KHN1cmZfaW5kZXguZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFICYmCisJICBzdXJmX2luZGV4LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworCisgICBicndfaW5zdHJ1Y3Rpb24gKmluc24gPSBicndfbmV4dF9pbnNuKHAsIEJSV19PUENPREVfU0VORCk7CisgICBicndfc2V0X2Rlc3QocCwgaW5zbiwgZHN0KTsKKyAgIGJyd19zZXRfc3JjMChwLCBpbnNuLCBvZmZzZXQpOworICAgYnJ3X3NldF9zYW1wbGVyX21lc3NhZ2UocCwgaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZfaW5kZXguZHcxLnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogTEQgbWVzc2FnZSBpZ25vcmVzIHNhbXBsZXIgdW5pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogcmxlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbWxlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIG5vIGhlYWRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQ0WDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZwcm9nX2RhdGEtPmJhc2UsIHN1cmZfaW5kZXguZHcxLnVkKTsKK30KKwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3VudHlwZWRfYXRvbWljKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGF0b21pY19vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzdXJmX2luZGV4KQoreworICAgYXNzZXJ0KGF0b21pY19vcC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKyAgICAgICAgICBhdG9taWNfb3AudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCAmJgorICAgICAgICAgIHN1cmZfaW5kZXguZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFICYmCisJICBzdXJmX2luZGV4LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworCisgICBicndfdW50eXBlZF9hdG9taWMocCwgZHN0LCBicndfbWVzc2FnZV9yZWcoaW5zdC0+YmFzZV9tcmYpLAorICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19vcC5kdzEudWQsIHN1cmZfaW5kZXguZHcxLnVkLAorICAgICAgICAgICAgICAgICAgICAgIGluc3QtPm1sZW4sIDEpOworCisgICBicndfbWFya19zdXJmYWNlX3VzZWQoJnByb2dfZGF0YS0+YmFzZSwgc3VyZl9pbmRleC5kdzEudWQpOworfQorCit2b2lkCit2ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW50eXBlZF9zdXJmYWNlX3JlYWQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3VyZl9pbmRleCkKK3sKKyAgIGFzc2VydChzdXJmX2luZGV4LmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorCSAgc3VyZl9pbmRleC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgYnJ3X3VudHlwZWRfc3VyZmFjZV9yZWFkKHAsIGRzdCwgYnJ3X21lc3NhZ2VfcmVnKGluc3QtPmJhc2VfbXJmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmX2luZGV4LmR3MS51ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LT5tbGVuLCAxKTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZwcm9nX2RhdGEtPmJhc2UsIHN1cmZfaW5kZXguZHcxLnVkKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhc3NlbWJseSBmb3IgYSBWZWM0IElSIGluc3RydWN0aW9uLgorICoKKyAqIFxwYXJhbSBpbnN0cnVjdGlvbiBUaGUgVmVjNCBJUiBpbnN0cnVjdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAqIFxwYXJhbSBkc3QgICAgICAgICBUaGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuCisgKiBccGFyYW0gc3JjICAgICAgICAgQW4gYXJyYXkgb2YgdXAgdG8gdGhyZWUgc291cmNlIHJlZ2lzdGVycy4KKyAqLwordm9pZAordmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3ZlYzRfaW5zdHJ1Y3Rpb24odmVjNF9pbnN0cnVjdGlvbiAqaW5zdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyAqc3JjKQoreworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopIGluc3RydWN0aW9uOworCisgICBpZiAoZHN0LndpZHRoID09IEJSV19XSURUSF80KSB7CisgICAgICAvKiBUaGlzIGhhcHBlbnMgaW4gYXR0cmlidXRlIGZpeHVwcyBmb3IgImR1YWwgaW5zdGFuY2VkIiBnZW9tZXRyeQorICAgICAgICogc2hhZGVycywgc2luY2UgdGhleSB1c2UgYXR0cmlidXRlcyB0aGF0IGFyZSB2ZWM0J3MuICBTaW5jZSB0aGUgZXhlYworICAgICAgICogd2lkdGggaXMgb25seSA0LCBpdCdzIGVzc2VudGlhbCB0aGF0IHRoZSBjYWxsZXIgc2V0CisgICAgICAgKiBmb3JjZV93cml0ZW1hc2tfYWxsIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUgaW5zdHJ1Y3Rpb24gaXMgZXhlY3V0ZWQKKyAgICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY2hhbm5lbHMgYXJlIGVuYWJsZWQuCisgICAgICAgKi8KKyAgICAgIGFzc2VydChpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsKTsKKworICAgICAgLyogRml4IHVwIGFueSA8ODs4LDE+IG9yIDwwOzQsMT4gc291cmNlIHJlZ2lzdGVycyB0byA8NDs0LDE+IHRvIHNhdGlzZnkKKyAgICAgICAqIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIgcmVnaW9uIHJlc3RyaWN0aW9ucyAoZnJvbSBHcmFwaGljcyBCU3BlYzoKKyAgICAgICAqIDNELU1lZGlhLUdQR1BVIEVuZ2luZSA+IEVVIE92ZXJ2aWV3ID4gUmVnaXN0ZXJzIGFuZCBSZWdpc3RlciBSZWdpb25zCisgICAgICAgKiA+IFJlZ2lzdGVyIFJlZ2lvbiBSZXN0cmljdGlvbnMpCisgICAgICAgKgorICAgICAgICogICAgIDEuIEV4ZWNTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFdpZHRoLgorICAgICAgICoKKyAgICAgICAqICAgICAyLiBJZiBFeGVjU2l6ZSA9IFdpZHRoIGFuZCBIb3J6U3RyaWRlICE9IDAsIFZlcnRTdHJpZGUgbXVzdCBiZSBzZXQKKyAgICAgICAqICAgICAgICB0byBXaWR0aCAqIEhvcnpTdHJpZGUuIgorICAgICAgICovCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKHNyY1tpXS5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpCisgICAgICAgICAgICBzcmNbaV0gPSBzdHJpZGUoc3JjW2ldLCA0LCA0LCAxKTsKKyAgICAgIH0KKyAgIH0KKworICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKyAgIGNhc2UgQlJXX09QQ09ERV9NT1Y6CisgICAgICBicndfTU9WKHAsIGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBCUldfT1BDT0RFX0FERDoKKyAgICAgIGJyd19BREQocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgQlJXX09QQ09ERV9NVUw6CisgICAgICBicndfTVVMKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfTUFDSDoKKyAgICAgIGJyd19NQUNIKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9NQUQ6CisgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNik7CisgICAgICBicndfTUFEKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0ZSQzoKKyAgICAgIGJyd19GUkMocCwgZHN0LCBzcmNbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfUk5ERDoKKyAgICAgIGJyd19STkREKHAsIGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBCUldfT1BDT0RFX1JOREU6CisgICAgICBicndfUk5ERShwLCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgQlJXX09QQ09ERV9STkRaOgorICAgICAgYnJ3X1JORFoocCwgZHN0LCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9BTkQ6CisgICAgICBicndfQU5EKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfT1I6CisgICAgICBicndfT1IocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgQlJXX09QQ09ERV9YT1I6CisgICAgICBicndfWE9SKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfTk9UOgorICAgICAgYnJ3X05PVChwLCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgQlJXX09QQ09ERV9BU1I6CisgICAgICBicndfQVNSKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfU0hSOgorICAgICAgYnJ3X1NIUihwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBCUldfT1BDT0RFX1NITDoKKyAgICAgIGJyd19TSEwocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0NNUDoKKyAgICAgIGJyd19DTVAocCwgZHN0LCBpbnN0LT5jb25kaXRpb25hbF9tb2QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBCUldfT1BDT0RFX1NFTDoKKyAgICAgIGJyd19TRUwocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0RQSDoKKyAgICAgIGJyd19EUEgocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0RQNDoKKyAgICAgIGJyd19EUDQocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0RQMzoKKyAgICAgIGJyd19EUDMocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0RQMjoKKyAgICAgIGJyd19EUDIocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0YzMlRPMTY6CisgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICBicndfRjMyVE8xNihwLCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0YxNlRPMzI6CisgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICBicndfRjE2VE8zMihwLCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0xSUDoKKyAgICAgIGFzc2VydChicnctPmdlbiA+PSA2KTsKKyAgICAgIGJyd19MUlAocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfQkZSRVY6CisgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAvKiBCRlJFViBvbmx5IHN1cHBvcnRzIFVEIHR5cGUgZm9yIHNyYyBhbmQgZHN0LiAqLworICAgICAgYnJ3X0JGUkVWKHAsIHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwKKyAgICAgICAgICAgICAgICAgICByZXR5cGUoc3JjWzBdLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfRkJIOgorICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgLyogRkJIIG9ubHkgc3VwcG9ydHMgVUQgdHlwZSBmb3IgZHN0LiAqLworICAgICAgYnJ3X0ZCSChwLCByZXR5cGUoZHN0LCBCUldfUkVHSVNURVJfVFlQRV9VRCksIHNyY1swXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgQlJXX09QQ09ERV9GQkw6CisgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAvKiBGQkwgb25seSBzdXBwb3J0cyBVRCB0eXBlIGZvciBkc3QuICovCisgICAgICBicndfRkJMKHAsIHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBCUldfT1BDT0RFX0NCSVQ6CisgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNyk7CisgICAgICAvKiBDQklUIG9ubHkgc3VwcG9ydHMgVUQgdHlwZSBmb3IgZHN0LiAqLworICAgICAgYnJ3X0NCSVQocCwgcmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBzcmNbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfQUREQzoKKyAgICAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgICAgIGJyd19BRERDKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfU1VCQjoKKyAgICAgIGFzc2VydChicnctPmdlbiA+PSA3KTsKKyAgICAgIGJyd19TVUJCKHAsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfTUFDOgorICAgICAgYnJ3X01BQyhwLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfQkZFOgorICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgYnJ3X0JGRShwLCBkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9CRkkxOgorICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgYnJ3X0JGSTEocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgQlJXX09QQ09ERV9CRkkyOgorICAgICAgYXNzZXJ0KGJydy0+Z2VuID49IDcpOworICAgICAgYnJ3X0JGSTIocCwgZHN0LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfSUY6CisgICAgICBpZiAoaW5zdC0+c3JjWzBdLmZpbGUgIT0gQkFEX0ZJTEUpIHsKKyAgICAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBoYXMgYW4gZW1iZWRkZWQgY29tcGFyZSAob25seSBhbGxvd2VkIG9uIGdlbjYpICovCisgICAgICAgICBhc3NlcnQoYnJ3LT5nZW4gPT0gNik7CisgICAgICAgICBnZW42X0lGKHAsIGluc3QtPmNvbmRpdGlvbmFsX21vZCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHN0cnVjdCBicndfaW5zdHJ1Y3Rpb24gKmJyd19pbnN0ID0gYnJ3X0lGKHAsIEJSV19FWEVDVVRFXzgpOworICAgICAgICAgYnJ3X2luc3QtPmhlYWRlci5wcmVkaWNhdGVfY29udHJvbCA9IGluc3QtPnByZWRpY2F0ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfRUxTRToKKyAgICAgIGJyd19FTFNFKHApOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19PUENPREVfRU5ESUY6CisgICAgICBicndfRU5ESUYocCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0RPOgorICAgICAgYnJ3X0RPKHAsIEJSV19FWEVDVVRFXzgpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9CUkVBSzoKKyAgICAgIGJyd19CUkVBSyhwKTsKKyAgICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgQlJXX1BSRURJQ0FURV9OT05FKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBCUldfT1BDT0RFX0NPTlRJTlVFOgorICAgICAgLyogRklOSVNITUU6IFdlIG5lZWQgdG8gd3JpdGUgdGhlIGxvb3AgaW5zdHJ1Y3Rpb24gc3VwcG9ydCBzdGlsbC4gKi8KKyAgICAgIGlmIChicnctPmdlbiA+PSA2KQorICAgICAgICAgZ2VuNl9DT05UKHApOworICAgICAgZWxzZQorICAgICAgICAgYnJ3X0NPTlQocCk7CisgICAgICBicndfc2V0X3ByZWRpY2F0ZV9jb250cm9sKHAsIEJSV19QUkVESUNBVEVfTk9ORSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX1dISUxFOgorICAgICAgYnJ3X1dISUxFKHApOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9SQ1A6CisgICBjYXNlIFNIQURFUl9PUENPREVfUlNROgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1NRUlQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfRVhQMjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9MT0cyOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1NJTjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9DT1M6CisgICAgICBpZiAoYnJ3LT5nZW4gPT0gNikgeworCSBnZW5lcmF0ZV9tYXRoMV9nZW42KGluc3QsIGRzdCwgc3JjWzBdKTsKKyAgICAgIH0gZWxzZSB7CisJIC8qIEFsc28gd29ya3MgZm9yIEdlbjcuICovCisJIGdlbmVyYXRlX21hdGgxX2dlbjQoaW5zdCwgZHN0LCBzcmNbMF0pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9QT1c6CisgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1FVT1RJRU5UOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVI6CisgICAgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworCSBnZW5lcmF0ZV9tYXRoMl9nZW43KGluc3QsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgfSBlbHNlIGlmIChicnctPmdlbiA9PSA2KSB7CisJIGdlbmVyYXRlX21hdGgyX2dlbjYoaW5zdCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICB9IGVsc2UgeworCSBnZW5lcmF0ZV9tYXRoMl9nZW40KGluc3QsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9URVg6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhEOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfQ01TOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRl9NQ1M6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhMOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYUzoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9URzQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfVEc0X09GRlNFVDoKKyAgICAgIGdlbmVyYXRlX3RleChpbnN0LCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBWU19PUENPREVfVVJCX1dSSVRFOgorICAgICAgZ2VuZXJhdGVfdnNfdXJiX3dyaXRlKGluc3QpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9HRU40X1NDUkFUQ0hfUkVBRDoKKyAgICAgIGdlbmVyYXRlX3NjcmF0Y2hfcmVhZChpbnN0LCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9XUklURToKKyAgICAgIGdlbmVyYXRlX3NjcmF0Y2hfd3JpdGUoaW5zdCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEOgorICAgICAgZ2VuZXJhdGVfcHVsbF9jb25zdGFudF9sb2FkKGluc3QsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgVlNfT1BDT0RFX1BVTExfQ09OU1RBTlRfTE9BRF9HRU43OgorICAgICAgZ2VuZXJhdGVfcHVsbF9jb25zdGFudF9sb2FkX2dlbjcoaW5zdCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBHU19PUENPREVfVVJCX1dSSVRFOgorICAgICAgZ2VuZXJhdGVfZ3NfdXJiX3dyaXRlKGluc3QpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgR1NfT1BDT0RFX1RIUkVBRF9FTkQ6CisgICAgICBnZW5lcmF0ZV9nc190aHJlYWRfZW5kKGluc3QpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgR1NfT1BDT0RFX1NFVF9XUklURV9PRkZTRVQ6CisgICAgICBnZW5lcmF0ZV9nc19zZXRfd3JpdGVfb2Zmc2V0KGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgR1NfT1BDT0RFX1NFVF9WRVJURVhfQ09VTlQ6CisgICAgICBnZW5lcmF0ZV9nc19zZXRfdmVydGV4X2NvdW50KGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdTX09QQ09ERV9TRVRfRFdPUkRfMl9JTU1FRDoKKyAgICAgIGdlbmVyYXRlX2dzX3NldF9kd29yZF8yX2ltbWVkKGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdTX09QQ09ERV9QUkVQQVJFX0NIQU5ORUxfTUFTS1M6CisgICAgICBnZW5lcmF0ZV9nc19wcmVwYXJlX2NoYW5uZWxfbWFza3MoZHN0KTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdTX09QQ09ERV9TRVRfQ0hBTk5FTF9NQVNLUzoKKyAgICAgIGdlbmVyYXRlX2dzX3NldF9jaGFubmVsX21hc2tzKGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdTX09QQ09ERV9HRVRfSU5TVEFOQ0VfSUQ6CisgICAgICBnZW5lcmF0ZV9nc19nZXRfaW5zdGFuY2VfaWQoZHN0KTsKKyAgICAgIGJyZWFrOworCisvLyAgIGNhc2UgU0hBREVSX09QQ09ERV9TSEFERVJfVElNRV9BREQ6CisvLyAgICAgIGJyd19zaGFkZXJfdGltZV9hZGQocCwgc3JjWzBdLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfZGF0YS0+YmFzZS5iaW5kaW5nX3RhYmxlLnNoYWRlcl90aW1lX3N0YXJ0KTsKKy8vICAgICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZwcm9nX2RhdGEtPmJhc2UsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nX2RhdGEtPmJhc2UuYmluZGluZ190YWJsZS5zaGFkZXJfdGltZV9zdGFydCk7CisvLyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfVU5UWVBFRF9BVE9NSUM6CisgICAgICBnZW5lcmF0ZV91bnR5cGVkX2F0b21pYyhpbnN0LCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfVU5UWVBFRF9TVVJGQUNFX1JFQUQ6CisgICAgICBnZW5lcmF0ZV91bnR5cGVkX3N1cmZhY2VfcmVhZChpbnN0LCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBWU19PUENPREVfVU5QQUNLX0ZMQUdTX1NJTUQ0WDI6CisgICAgICBnZW5lcmF0ZV91bnBhY2tfZmxhZ3MoaW5zdCwgZHN0KTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgaWYgKGluc3QtPm9wY29kZSA8IChpbnQpIEFSUkFZX1NJWkUob3Bjb2RlX2Rlc2NzKSkgeworICAgICAgICAgX21lc2FfcHJvYmxlbSgmYnJ3LT5jdHgsICJVbnN1cHBvcnRlZCBvcGNvZGUgaW4gYCVzJyBpbiB2ZWM0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGVfZGVzY3NbaW5zdC0+b3Bjb2RlXS5uYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBfbWVzYV9wcm9ibGVtKCZicnctPmN0eCwgIlVuc3VwcG9ydGVkIG9wY29kZSAlZCBpbiB2ZWM0IiwgaW5zdC0+b3Bjb2RlKTsKKyAgICAgIH0KKyAgICAgIGFib3J0KCk7CisgICB9Cit9CisKK3ZvaWQKK3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2RlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaW50IGxhc3RfbmF0aXZlX2luc25fb2Zmc2V0ID0gMDsKKyAgIGNvbnN0IGNoYXIgKmxhc3RfYW5ub3RhdGlvbl9zdHJpbmcgPSBOVUxMOworICAgY29uc3Qgdm9pZCAqbGFzdF9hbm5vdGF0aW9uX2lyID0gTlVMTDsKKworICAgaWYgKHVubGlrZWx5KGRlYnVnX2ZsYWcpKSB7CisgICAgICBpZiAoc2hhZGVyX3Byb2cpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTmF0aXZlIGNvZGUgZm9yICVzIHZlcnRleCBzaGFkZXIgJWQ6XG4iLAorICAgICAgICAgICAgICAgICBzaGFkZXJfcHJvZy0+TGFiZWwgPyBzaGFkZXJfcHJvZy0+TGFiZWwgOiAidW5uYW1lZCIsCisgICAgICAgICAgICAgICAgIHNoYWRlcl9wcm9nLT5OYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5hdGl2ZSBjb2RlIGZvciB2ZXJ0ZXggcHJvZ3JhbSAlZDpcbiIsIHByb2ctPklkKTsKKyAgICAgIH0KKyAgIH0KKworICAgZm9yZWFjaF9saXN0KG5vZGUsIGluc3RydWN0aW9ucykgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopbm9kZTsKKyAgICAgIHN0cnVjdCBicndfcmVnIHNyY1szXSwgZHN0OworCisgICAgICBpZiAodW5saWtlbHkoZGVidWdfZmxhZykpIHsKKwkgaWYgKGxhc3RfYW5ub3RhdGlvbl9pciAhPSBpbnN0LT5pcikgeworCSAgICBsYXN0X2Fubm90YXRpb25faXIgPSBpbnN0LT5pcjsKKwkgICAgaWYgKGxhc3RfYW5ub3RhdGlvbl9pcikgeworCSAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICIpOworICAgICAgICAgICAgICAgaWYgKHNoYWRlcl9wcm9nKSB7CisgICAgICAgICAgICAgICAgICAoKGlyX2luc3RydWN0aW9uICopIGxhc3RfYW5ub3RhdGlvbl9pciktPmZwcmludChzdGRlcnIpOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZ19pbnN0cnVjdGlvbiAqdnBpOworLy8gICAgICAgICAgICAgICAgICB2cGkgPSAoY29uc3QgcHJvZ19pbnN0cnVjdGlvbiAqKSBpbnN0LT5pcjsKKy8vICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZDogIiwgKGludCkodnBpIC0gcHJvZy0+SW5zdHJ1Y3Rpb25zKSk7CisvLyAgICAgICAgICAgICAgICAgIF9tZXNhX2ZwcmludF9pbnN0cnVjdGlvbl9vcHQoc3RkZXJyLCB2cGksIDAsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPR19QUklOVF9ERUJVRywgTlVMTCk7CisgICAgICAgICAgICAgICB9CisJICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwkgICAgfQorCSB9CisJIGlmIChsYXN0X2Fubm90YXRpb25fc3RyaW5nICE9IGluc3QtPmFubm90YXRpb24pIHsKKwkgICAgbGFzdF9hbm5vdGF0aW9uX3N0cmluZyA9IGluc3QtPmFubm90YXRpb247CisJICAgIGlmIChsYXN0X2Fubm90YXRpb25fc3RyaW5nKQorCSAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICVzXG4iLCBsYXN0X2Fubm90YXRpb25fc3RyaW5nKTsKKwkgfQorICAgICAgfQorCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCSBzcmNbaV0gPSBpbnN0LT5nZXRfc3JjKHRoaXMtPnByb2dfZGF0YSwgaSk7CisgICAgICB9CisgICAgICBkc3QgPSBpbnN0LT5nZXRfZHN0KCk7CisKKyAgICAgIGJyd19zZXRfY29uZGl0aW9uYWxtb2QocCwgaW5zdC0+Y29uZGl0aW9uYWxfbW9kKTsKKyAgICAgIGJyd19zZXRfcHJlZGljYXRlX2NvbnRyb2wocCwgaW5zdC0+cHJlZGljYXRlKTsKKyAgICAgIGJyd19zZXRfcHJlZGljYXRlX2ludmVyc2UocCwgaW5zdC0+cHJlZGljYXRlX2ludmVyc2UpOworICAgICAgYnJ3X3NldF9zYXR1cmF0ZShwLCBpbnN0LT5zYXR1cmF0ZSk7CisgICAgICBicndfc2V0X21hc2tfY29udHJvbChwLCBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsKTsKKyAgICAgIGJyd19zZXRfYWNjX3dyaXRlX2NvbnRyb2wocCwgaW5zdC0+d3JpdGVzX2FjY3VtdWxhdG9yKTsKKworICAgICAgdW5zaWduZWQgcHJlX2VtaXRfbnJfaW5zbiA9IHAtPm5yX2luc247CisKKyAgICAgIGdlbmVyYXRlX3ZlYzRfaW5zdHJ1Y3Rpb24oaW5zdCwgZHN0LCBzcmMpOworCisgICAgICBpZiAoaW5zdC0+bm9fZGRfY2xlYXIgfHwgaW5zdC0+bm9fZGRfY2hlY2spIHsKKyAgICAgICAgIGFzc2VydChwLT5ucl9pbnNuID09IHByZV9lbWl0X25yX2luc24gKyAxIHx8CisgICAgICAgICAgICAgICAgISJub19kZF9jaGVjayBvciBub19kZF9jbGVhciBzZXQgZm9yIElSIGVtaXR0aW5nIG1vcmUgIgorICAgICAgICAgICAgICAgICJ0aGFuIDEgaW5zdHJ1Y3Rpb24iKTsKKworICAgICAgICAgc3RydWN0IGJyd19pbnN0cnVjdGlvbiAqbGFzdCA9ICZwLT5zdG9yZVtwcmVfZW1pdF9ucl9pbnNuXTsKKworICAgICAgICAgaWYgKGluc3QtPm5vX2RkX2NsZWFyKQorICAgICAgICAgICAgbGFzdC0+aGVhZGVyLmRlcGVuZGVuY3lfY29udHJvbCB8PSBCUldfREVQRU5ERU5DWV9OT1RDTEVBUkVEOworICAgICAgICAgaWYgKGluc3QtPm5vX2RkX2NoZWNrKQorICAgICAgICAgICAgbGFzdC0+aGVhZGVyLmRlcGVuZGVuY3lfY29udHJvbCB8PSBCUldfREVQRU5ERU5DWV9OT1RDSEVDS0VEOworICAgICAgfQorCisgICAgICBpZiAodW5saWtlbHkoZGVidWdfZmxhZykpIHsKKwkgYnJ3X2R1bXBfY29tcGlsZShwLCBzdGRlcnIsCisJCQkgIGxhc3RfbmF0aXZlX2luc25fb2Zmc2V0LCBwLT5uZXh0X2luc25fb2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgbGFzdF9uYXRpdmVfaW5zbl9vZmZzZXQgPSBwLT5uZXh0X2luc25fb2Zmc2V0OworICAgfQorCisgICBpZiAodW5saWtlbHkoZGVidWdfZmxhZykpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgIH0KKworICAgYnJ3X3NldF91aXBfamlwKHApOworCisgICAvKiBPSywgd2hpbGUgdGhlIElOVEVMX0RFQlVHPXZzIGFib3ZlIGlzIHZlcnkgbmljZSBmb3IgZGVidWdnaW5nIFZTCisgICAgKiBlbWl0IGlzc3VlcywgaXQgZG9lc24ndCBnZXQgdGhlIGp1bXAgZGlzdGFuY2VzIGludG8gdGhlIG91dHB1dCwKKyAgICAqIHdoaWNoIGlzIG9mdGVuIHNvbWV0aGluZyB3ZSB3YW50IHRvIGRlYnVnLiAgU28gdGhpcyBpcyBoZXJlIGluCisgICAgKiBjYXNlIHlvdSdyZSBkb2luZyB0aGF0LgorICAgICovCisgICBpZiAoMCAmJiB1bmxpa2VseShkZWJ1Z19mbGFnKSkgeworICAgICAgYnJ3X2R1bXBfY29tcGlsZShwLCBzdGRlcnIsIDAsIHAtPm5leHRfaW5zbl9vZmZzZXQpOworICAgfQorfQorCitjb25zdCB1bnNpZ25lZCAqCit2ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzZW1ibHkoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmFzc2VtYmx5X3NpemUpCit7CisgICBicndfc2V0X2FjY2Vzc19tb2RlKHAsIEJSV19BTElHTl8xNik7CisgICBnZW5lcmF0ZV9jb2RlKGluc3RydWN0aW9ucyk7CisgICByZXR1cm4gYnJ3X2dldF9wcm9ncmFtKHAsIGFzc2VtYmx5X3NpemUpOworfQorCit9IC8qIG5hbWVzcGFjZSBicncgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9ncy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2dzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5ZWU5YQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9ncy5jCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBicndfdmVjNF9ncy5jCisgKgorICogU3RhdGUgYXRvbSBmb3IgY2xpZW50LXByb2dyYW1tYWJsZSBnZW9tZXRyeSBzaGFkZXJzLCBhbmQgc3VwcG9ydCBjb2RlLgorICovCisKKyNpbmNsdWRlICJicndfdmVjNF9ncy5oIgorI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCisjaW5jbHVkZSAiYnJ3X3ZlYzRfZ3NfdmlzaXRvci5oIgorLy8jaW5jbHVkZSAiYnJ3X3N0YXRlLmgiCisKK2NvbnN0IEdMdWludCBwcmltX3RvX2h3X3ByaW1bR0xfVFJJQU5HTEVfU1RSSVBfQURKQUNFTkNZKzFdID0geworICAgXzNEUFJJTV9QT0lOVExJU1QsCisgICBfM0RQUklNX0xJTkVMSVNULAorICAgXzNEUFJJTV9MSU5FTE9PUCwKKyAgIF8zRFBSSU1fTElORVNUUklQLAorICAgXzNEUFJJTV9UUklMSVNULAorICAgXzNEUFJJTV9UUklTVFJJUCwKKyAgIF8zRFBSSU1fVFJJRkFOLAorICAgXzNEUFJJTV9RVUFETElTVCwKKyAgIF8zRFBSSU1fUVVBRFNUUklQLAorICAgXzNEUFJJTV9QT0xZR09OLAorICAgXzNEUFJJTV9MSU5FTElTVF9BREosCisgICBfM0RQUklNX0xJTkVTVFJJUF9BREosCisgICBfM0RQUklNX1RSSUxJU1RfQURKLAorICAgXzNEUFJJTV9UUklTVFJJUF9BREosCit9OworCitzdGF0aWMgdm9pZAorYnJ3X2dzX2luaXRfY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2dlb21ldHJ5X3Byb2dyYW0gKmdwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X2dzX3Byb2dfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfZ3NfY29tcGlsZSAqYykKK3sKKyAgIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKworICAgYy0+a2V5ID0gKmtleTsKKyAgIGMtPmdwID0gZ3A7CisgICBjLT5iYXNlLnNoYWRlcl9wcm9nID0gcHJvZzsKKyAgIGMtPmJhc2UubWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworfQorCitzdGF0aWMgYm9vbAorYnJ3X2dzX2RvX2NvbXBpbGUoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2dzX2NvbXBpbGUgKmMpCit7CisgICBjLT5wcm9nX2RhdGEuaW5jbHVkZV9wcmltaXRpdmVfaWQgPQorICAgICAgKGMtPmdwLT5wcm9ncmFtLkJhc2UuSW5wdXRzUmVhZCAmIFZBUllJTkdfQklUX1BSSU1JVElWRV9JRCkgIT0gMDsKKworICAgYy0+cHJvZ19kYXRhLmludm9jYXRpb25zID0gYy0+Z3AtPnByb2dyYW0uSW52b2NhdGlvbnM7CisKKyAgIC8qIEFsbG9jYXRlIHRoZSByZWZlcmVuY2VzIHRvIHRoZSB1bmlmb3JtcyB0aGF0IHdpbGwgZW5kIHVwIGluIHRoZQorICAgICogcHJvZ19kYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcGlsZWQgcHJvZ3JhbSwgYW5kIHdoaWNoIHdpbGwgYmUgZnJlZWQKKyAgICAqIGJ5IHRoZSBzdGF0ZSBjYWNoZS4KKyAgICAqCisgICAgKiBOb3RlOiBwYXJhbV9jb3VudCBuZWVkcyB0byBiZSBudW1fdW5pZm9ybV9jb21wb25lbnRzICogNCwgc2luY2Ugd2UgYWRkCisgICAgKiBwYWRkaW5nIGFyb3VuZCB1bmlmb3JtIHZhbHVlcyBiZWxvdyB2ZWM0IHNpemUsIHNvIHRoZSB3b3JzdCBjYXNlIGlzIHRoYXQKKyAgICAqIGV2ZXJ5IHVuaWZvcm0gaXMgYSBmbG9hdCB3aGljaCBnZXRzIHBhZGRlZCB0byB0aGUgc2l6ZSBvZiBhIHZlYzQuCisgICAgKi8KKyAgIHN0cnVjdCBnbF9zaGFkZXIgKmdzID0KKyAgICAgIGMtPmJhc2Uuc2hhZGVyX3Byb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0dFT01FVFJZXTsKKyAgIGludCBwYXJhbV9jb3VudCA9IGdzLT5udW1fdW5pZm9ybV9jb21wb25lbnRzICogNDsKKworICAgLyogV2UgYWxzbyB1cGxvYWQgY2xpcCBwbGFuZSBkYXRhIGFzIHVuaWZvcm1zICovCisgICBwYXJhbV9jb3VudCArPSBNQVhfQ0xJUF9QTEFORVMgKiA0OworCisgICBjLT5wcm9nX2RhdGEuYmFzZS5iYXNlLnBhcmFtID0KKyAgICAgIHJ6YWxsb2NfYXJyYXkoTlVMTCwgY29uc3QgZmxvYXQgKiwgcGFyYW1fY291bnQpOworICAgYy0+cHJvZ19kYXRhLmJhc2UuYmFzZS5wdWxsX3BhcmFtID0KKyAgICAgIHJ6YWxsb2NfYXJyYXkoTlVMTCwgY29uc3QgZmxvYXQgKiwgcGFyYW1fY291bnQpOworICAgLyogU2V0dGluZyBucl9wYXJhbXMgaGVyZSBOT1QgdG8gdGhlIHNpemUgb2YgdGhlIHBhcmFtIGFuZCBwdWxsX3BhcmFtCisgICAgKiBhcnJheXMsIGJ1dCB0byB0aGUgbnVtYmVyIG9mIHVuaWZvcm0gY29tcG9uZW50cyB2ZWM0X3Zpc2l0b3IKKyAgICAqIG5lZWRzLiB2ZWM0X3Zpc2l0b3I6OnNldHVwX3VuaWZvcm1zKCkgd2lsbCBzZXQgaXQgYmFjayB0byBhIHByb3BlciB2YWx1ZS4KKyAgICAqLworICAgYy0+cHJvZ19kYXRhLmJhc2UuYmFzZS5ucl9wYXJhbXMgPSBBTElHTihwYXJhbV9jb3VudCwgNCkgLyA0ICsgZ3MtPm51bV9zYW1wbGVyczsKKworICAgaWYgKGMtPmdwLT5wcm9ncmFtLk91dHB1dFR5cGUgPT0gR0xfUE9JTlRTKSB7CisgICAgICAvKiBXaGVuIHRoZSBvdXRwdXQgdHlwZSBpcyBwb2ludHMsIHRoZSBnZW9tZXRyeSBzaGFkZXIgbWF5IG91dHB1dCBkYXRhCisgICAgICAgKiB0byBtdWx0aXBsZSBzdHJlYW1zLCBhbmQgRW5kUHJpbWl0aXZlKCkgaGFzIG5vIGVmZmVjdC4gIFNvIHdlCisgICAgICAgKiBjb25maWd1cmUgdGhlIGhhcmR3YXJlIHRvIGludGVycHJldCB0aGUgY29udHJvbCBkYXRhIGFzIHN0cmVhbSBJRC4KKyAgICAgICAqLworICAgICAgYy0+cHJvZ19kYXRhLmNvbnRyb2xfZGF0YV9mb3JtYXQgPSBHRU43X0dTX0NPTlRST0xfREFUQV9GT1JNQVRfR1NDVExfU0lEOworCisgICAgICAvKiBIb3dldmVyLCBTdHJlYW1JRCBpcyBub3QgeWV0IHN1cHBvcnRlZCwgc28gd2Ugb3V0cHV0IHplcm8gYml0cyBvZgorICAgICAgICogY29udHJvbCBkYXRhIHBlciB2ZXJ0ZXguCisgICAgICAgKi8KKyAgICAgIGMtPmNvbnRyb2xfZGF0YV9iaXRzX3Blcl92ZXJ0ZXggPSAwOworICAgfSBlbHNlIHsKKyAgICAgIC8qIFdoZW4gdGhlIG91dHB1dCB0eXBlIGlzIHRyaWFuZ2xlX3N0cmlwIG9yIGxpbmVfc3RyaXAsIEVuZFByaW1pdGl2ZSgpCisgICAgICAgKiBtYXkgYmUgdXNlZCB0byB0ZXJtaW5hdGUgdGhlIGN1cnJlbnQgc3RyaXAgYW5kIHN0YXJ0IGEgbmV3IG9uZQorICAgICAgICogKHNpbWlsYXIgdG8gcHJpbWl0aXZlIHJlc3RhcnQpLCBhbmQgb3V0cHV0dGluZyBkYXRhIHRvIG11bHRpcGxlCisgICAgICAgKiBzdHJlYW1zIGlzIG5vdCBzdXBwb3J0ZWQuICBTbyB3ZSBjb25maWd1cmUgdGhlIGhhcmR3YXJlIHRvIGludGVycHJldAorICAgICAgICogdGhlIGNvbnRyb2wgZGF0YSBhcyBFbmRQcmltaXRpdmUgaW5mb3JtYXRpb24gKGEuay5hLiAiY3V0IGJpdHMiKS4KKyAgICAgICAqLworICAgICAgYy0+cHJvZ19kYXRhLmNvbnRyb2xfZGF0YV9mb3JtYXQgPSBHRU43X0dTX0NPTlRST0xfREFUQV9GT1JNQVRfR1NDVExfQ1VUOworCisgICAgICAvKiBXZSBvbmx5IG5lZWQgdG8gb3V0cHV0IGNvbnRyb2wgZGF0YSBpZiB0aGUgc2hhZGVyIGFjdHVhbGx5IGNhbGxzCisgICAgICAgKiBFbmRQcmltaXRpdmUoKS4KKyAgICAgICAqLworICAgICAgYy0+Y29udHJvbF9kYXRhX2JpdHNfcGVyX3ZlcnRleCA9CisgICAgICAgICBjLT5ncC0+cHJvZ3JhbS5Vc2VzRW5kUHJpbWl0aXZlID8gMSA6IDA7CisgICB9CisgICBjLT5jb250cm9sX2RhdGFfaGVhZGVyX3NpemVfYml0cyA9CisgICAgICBjLT5ncC0+cHJvZ3JhbS5WZXJ0aWNlc091dCAqIGMtPmNvbnRyb2xfZGF0YV9iaXRzX3Blcl92ZXJ0ZXg7CisKKyAgIC8qIDEgSFdPUkQgPSAzMiBieXRlcyA9IDI1NiBiaXRzICovCisgICBjLT5wcm9nX2RhdGEuY29udHJvbF9kYXRhX2hlYWRlcl9zaXplX2h3b3JkcyA9CisgICAgICBBTElHTihjLT5jb250cm9sX2RhdGFfaGVhZGVyX3NpemVfYml0cywgMjU2KSAvIDI1NjsKKworICAgR0xiaXRmaWVsZDY0IG91dHB1dHNfd3JpdHRlbiA9IGMtPmdwLT5wcm9ncmFtLkJhc2UuT3V0cHV0c1dyaXR0ZW47CisKKyAgIC8qIEluIG9yZGVyIGZvciBsZWdhY3kgY2xpcHBpbmcgdG8gd29yaywgd2UgbmVlZCB0byBwb3B1bGF0ZSB0aGUgY2xpcAorICAgICogZGlzdGFuY2UgdmFyeWluZyBzbG90cyB3aGVuZXZlciBjbGlwcGluZyBpcyBlbmFibGVkLCBldmVuIGlmIHRoZSB2ZXJ0ZXgKKyAgICAqIHNoYWRlciBkb2Vzbid0IHdyaXRlIHRvIGdsX0NsaXBEaXN0YW5jZS4KKyAgICAqLworICAgaWYgKGMtPmtleS5iYXNlLnVzZXJjbGlwX2FjdGl2ZSkgeworICAgICAgb3V0cHV0c193cml0dGVuIHw9IEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9DTElQX0RJU1QwKTsKKyAgICAgIG91dHB1dHNfd3JpdHRlbiB8PSBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMSk7CisgICB9CisKKyAgIGJyd19jb21wdXRlX3Z1ZV9tYXAoYnJ3LCAmYy0+cHJvZ19kYXRhLmJhc2UudnVlX21hcCwgb3V0cHV0c193cml0dGVuKTsKKworICAgLyogQ29tcHV0ZSB0aGUgb3V0cHV0IHZlcnRleCBzaXplLgorICAgICoKKyAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCBWb2wyIFBhcnQxIDcuMi4xLjEgU1RBVEVfR1MgLSBPdXRwdXQgVmVydGV4CisgICAgKiBTaXplIChwMTY4KToKKyAgICAqCisgICAgKiAgICAgWzAsNjJdIGluZGljYXRpbmcgWzEsNjNdIDE2QiB1bml0cworICAgICoKKyAgICAqICAgICBTcGVjaWZpZXMgdGhlIHNpemUgb2YgZWFjaCB2ZXJ0ZXggc3RvcmVkIGluIHRoZSBHUyBvdXRwdXQgZW50cnkKKyAgICAqICAgICAoZm9sbG93aW5nIGFueSBDb250cm9sIEhlYWRlciBkYXRhKSBhcyBhIG51bWJlciBvZiAxMjgtYml0IHVuaXRzCisgICAgKiAgICAgKG1pbnVzIG9uZSkuCisgICAgKgorICAgICogICAgIFByb2dyYW1taW5nIFJlc3RyaWN0aW9uczogVGhlIHZlcnRleCBzaXplIG11c3QgYmUgcHJvZ3JhbW1lZCBhcyBhCisgICAgKiAgICAgbXVsdGlwbGUgb2YgMzJCIHVuaXRzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb246IFJlbmRlcmluZyBpcworICAgICogICAgIGRpc2FibGVkIChhcyBwZXIgU09MIHN0YWdlIHN0YXRlKSBhbmQgdGhlIHZlcnRleCBzaXplIG91dHB1dCBieSB0aGUKKyAgICAqICAgICBHUyB0aHJlYWQgaXMgMTZCLgorICAgICoKKyAgICAqICAgICBJZiByZW5kZXJpbmcgaXMgZW5hYmxlZCAoYXMgcGVyIFNPTCBzdGF0ZSkgdGhlIHZlcnRleCBzaXplIG11c3QgYmUKKyAgICAqICAgICBwcm9ncmFtbWVkIGFzIGEgbXVsdGlwbGUgb2YgMzJCIHVuaXRzLiBJbiBvdGhlciB3b3JkcywgdGhlIG9ubHkgdGltZQorICAgICogICAgIHNvZnR3YXJlIGNhbiBwcm9ncmFtIGEgdmVydGV4IHNpemUgd2l0aCBhbiBvZGQgbnVtYmVyIG9mIDE2QiB1bml0cworICAgICogICAgIGlzIHdoZW4gcmVuZGVyaW5nIGlzIGRpc2FibGVkLgorICAgICoKKyAgICAqIE5vdGU6IEI9Ynl0ZXMgaW4gdGhlIGFib3ZlIHRleHQuCisgICAgKgorICAgICogSXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZSBleHRyYSB0cm91YmxlIHRvIG9wdGltaXplIHRoZSBjYXNlIHdoZXJlIHRoZQorICAgICogdmVydGV4IHNpemUgaXMgMTZCIChlc3BlY2lhbGx5IHNpbmNlIHRoaXMgd291bGQgcmVxdWlyZSBzcGVjaWFsLWNhc2luZworICAgICogdGhlIEdFTiBhc3NlbWJseSB0aGF0IHdyaXRlcyB0byB0aGUgVVJCKS4gIFNvIHdlIGp1c3Qgc2V0IHRoZSB2ZXJ0ZXgKKyAgICAqIHNpemUgdG8gYSBtdWx0aXBsZSBvZiAzMkIgKDIgdmVjNCdzKSBpbiBhbGwgY2FzZXMuCisgICAgKgorICAgICogVGhlIG1heGltdW0gb3V0cHV0IHZlcnRleCBzaXplIGlzIDYyKjE2ID0gOTkyIGJ5dGVzICgzMSBod29yZHMpLiAgV2UKKyAgICAqIGJ1ZGdldCB0aGF0IGFzIGZvbGxvd3M6CisgICAgKgorICAgICogICA1MTIgYnl0ZXMgZm9yIHZhcnlpbmdzIChhIHZhcnlpbmcgY29tcG9uZW50IGlzIDQgYnl0ZXMgYW5kCisgICAgKiAgICAgICAgICAgICBnbF9NYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMgPSAxMjgpCisgICAgKiAgICAxNiBieXRlcyBvdmVyaGVhZCBmb3IgVkFSWUlOR19TTE9UX1BTSVogKGVhY2ggdmFyeWluZyBzbG90IGlzIDE2CisgICAgKiAgICAgICAgICAgICBieXRlcykKKyAgICAqICAgIDE2IGJ5dGVzIG92ZXJoZWFkIGZvciBnbF9Qb3NpdGlvbiAod2UgYWxsb2NhdGUgaXQgYSBzbG90IGluIHRoZSBWVUUKKyAgICAqICAgICAgICAgICAgIGV2ZW4gaWYgaXQncyBub3QgdXNlZCkKKyAgICAqICAgIDMyIGJ5dGVzIG92ZXJoZWFkIGZvciBnbF9DbGlwRGlzdGFuY2UgKHdlIGFsbG9jYXRlIGl0IDIgVlVFIHNsb3RzCisgICAgKiAgICAgICAgICAgICB3aGVuZXZlciBjbGlwIHBsYW5lcyBhcmUgZW5hYmxlZCwgZXZlbiBpZiB0aGUgc2hhZGVyIGRvZXNuJ3QKKyAgICAqICAgICAgICAgICAgIHdyaXRlIHRvIGdsX0NsaXBEaXN0YW5jZSkKKyAgICAqICAgIDE2IGJ5dGVzIG92ZXJoZWFkIHNpbmNlIHRoZSBWVUUgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIgYnl0ZXMKKyAgICAqICAgICAgICAgICAgIChzZWUgYmVsb3cpLS10aGlzIGNhdXNlcyB1cCB0byAxIFZVRSBzbG90IHRvIGJlIHdhc3RlZAorICAgICogICA0MDAgYnl0ZXMgYXZhaWxhYmxlIGZvciB2YXJ5aW5nIHBhY2tpbmcgb3ZlcmhlYWQKKyAgICAqCisgICAgKiBXb3JzdC1jYXNlIHZhcnlpbmcgcGFja2luZyBvdmVyaGVhZCBpcyAzLzQgb2YgYSB2YXJ5aW5nIHNsb3QgKDEyIGJ5dGVzKQorICAgICogcGVyIGludGVycG9sYXRpb24gdHlwZSwgc28gdGhpcyBpcyBwbGVudHkuCisgICAgKgorICAgICovCisgICB1bnNpZ25lZCBvdXRwdXRfdmVydGV4X3NpemVfYnl0ZXMgPSBjLT5wcm9nX2RhdGEuYmFzZS52dWVfbWFwLm51bV9zbG90cyAqIDE2OworICAgYXNzZXJ0KG91dHB1dF92ZXJ0ZXhfc2l6ZV9ieXRlcyA8PSBHRU43X01BWF9HU19PVVRQVVRfVkVSVEVYX1NJWkVfQllURVMpOworICAgYy0+cHJvZ19kYXRhLm91dHB1dF92ZXJ0ZXhfc2l6ZV9od29yZHMgPQorICAgICAgQUxJR04ob3V0cHV0X3ZlcnRleF9zaXplX2J5dGVzLCAzMikgLyAzMjsKKworICAgLyogQ29tcHV0ZSBVUkIgZW50cnkgc2l6ZS4gIFRoZSBtYXhpbXVtIGFsbG93ZWQgVVJCIGVudHJ5IHNpemUgaXMgMzJrLgorICAgICogVGhhdCBkaXZpZGVzIHVwIGFzIGZvbGxvd3M6CisgICAgKgorICAgICogICAgIDY0IGJ5dGVzIGZvciB0aGUgY29udHJvbCBkYXRhIGhlYWRlciAoY3V0IGluZGljZXMgb3IgU3RyZWFtSUQgYml0cykKKyAgICAqICAgNDA5NiBieXRlcyBmb3IgdmFyeWluZ3MgKGEgdmFyeWluZyBjb21wb25lbnQgaXMgNCBieXRlcyBhbmQKKyAgICAqICAgICAgICAgICAgICBnbF9NYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyA9IDEwMjQpCisgICAgKiAgIDQwOTYgYnl0ZXMgb3ZlcmhlYWQgZm9yIFZBUllJTkdfU0xPVF9QU0laIChlYWNoIHZhcnlpbmcgc2xvdCBpcyAxNgorICAgICogICAgICAgICAgICAgIGJ5dGVzL3ZlcnRleCBhbmQgZ2xfTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyBpcyAyNTYpCisgICAgKiAgIDQwOTYgYnl0ZXMgb3ZlcmhlYWQgZm9yIGdsX1Bvc2l0aW9uICh3ZSBhbGxvY2F0ZSBpdCBhIHNsb3QgaW4gdGhlIFZVRQorICAgICogICAgICAgICAgICAgIGV2ZW4gaWYgaXQncyBub3QgdXNlZCkKKyAgICAqICAgODE5MiBieXRlcyBvdmVyaGVhZCBmb3IgZ2xfQ2xpcERpc3RhbmNlICh3ZSBhbGxvY2F0ZSBpdCAyIFZVRSBzbG90cworICAgICogICAgICAgICAgICAgIHdoZW5ldmVyIGNsaXAgcGxhbmVzIGFyZSBlbmFibGVkLCBldmVuIGlmIHRoZSBzaGFkZXIgZG9lc24ndAorICAgICogICAgICAgICAgICAgIHdyaXRlIHRvIGdsX0NsaXBEaXN0YW5jZSkKKyAgICAqICAgNDA5NiBieXRlcyBvdmVyaGVhZCBzaW5jZSB0aGUgVlVFIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyCisgICAgKiAgICAgICAgICAgICAgYnl0ZXMgKHNlZSBhYm92ZSktLXRoaXMgY2F1c2VzIHVwIHRvIDEgVlVFIHNsb3QgdG8gYmUgd2FzdGVkCisgICAgKiAgIDgxMjggYnl0ZXMgYXZhaWxhYmxlIGZvciB2YXJ5aW5nIHBhY2tpbmcgb3ZlcmhlYWQKKyAgICAqCisgICAgKiBXb3JzdC1jYXNlIHZhcnlpbmcgcGFja2luZyBvdmVyaGVhZCBpcyAzLzQgb2YgYSB2YXJ5aW5nIHNsb3QgcGVyCisgICAgKiBpbnRlcnBvbGF0aW9uIHR5cGUsIHdoaWNoIHdvcmtzIG91dCB0byAzMDcyIGJ5dGVzLCBzbyB0aGlzIHdvdWxkIGFsbG93CisgICAgKiB1cyB0byBhY2NvbW1vZGF0ZSAyIGludGVycG9sYXRpb24gdHlwZXMgd2l0aG91dCBhbnkgZGFuZ2VyIG9mIHJ1bm5pbmcKKyAgICAqIG91dCBvZiBVUkIgc3BhY2UuCisgICAgKgorICAgICogSW4gcHJhY3RpY2UsIHRoZSByaXNrIG9mIHJ1bm5pbmcgb3V0IG9mIFVSQiBzcGFjZSBpcyB2ZXJ5IHNtYWxsLCBzaW5jZQorICAgICogdGhlIGFib3ZlIGZpZ3VyZXMgYXJlIGFsbCB3b3JzdC1jYXNlLCBhbmQgbW9zdCBvZiB0aGVtIHNjYWxlIHdpdGggdGhlCisgICAgKiBudW1iZXIgb2Ygb3V0cHV0IHZlcnRpY2VzLiAgU28gd2UnbGwganVzdCBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBzcGFjZQorICAgICogd2UgbmVlZCwgYW5kIGlmIGl0J3MgdG9vIGxhcmdlLCBmYWlsIHRvIGNvbXBpbGUuCisgICAgKi8KKyAgIHVuc2lnbmVkIG91dHB1dF9zaXplX2J5dGVzID0KKyAgICAgIGMtPnByb2dfZGF0YS5vdXRwdXRfdmVydGV4X3NpemVfaHdvcmRzICogMzIgKiBjLT5ncC0+cHJvZ3JhbS5WZXJ0aWNlc091dDsKKyAgIG91dHB1dF9zaXplX2J5dGVzICs9IDMyICogYy0+cHJvZ19kYXRhLmNvbnRyb2xfZGF0YV9oZWFkZXJfc2l6ZV9od29yZHM7CisKKyAgIC8qIEJyb2Fkd2VsbCBzdG9yZXMgIlZlcnRleCBDb3VudCIgYXMgYSBmdWxsIDggRFdvcmQgKDMyIGJ5dGUpIFVSQiBvdXRwdXQsCisgICAgKiB3aGljaCBjb21lcyBiZWZvcmUgdGhlIGNvbnRyb2wgaGVhZGVyLgorICAgICovCisgICBpZiAoYnJ3LT5nZW4gPj0gOCkKKyAgICAgIG91dHB1dF9zaXplX2J5dGVzICs9IDMyOworCisgICBhc3NlcnQob3V0cHV0X3NpemVfYnl0ZXMgPj0gMSk7CisgICBpZiAob3V0cHV0X3NpemVfYnl0ZXMgPiBHRU43X01BWF9HU19VUkJfRU5UUllfU0laRV9CWVRFUykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgLyogVVJCIGVudHJ5IHNpemVzIGFyZSBzdG9yZWQgYXMgYSBtdWx0aXBsZSBvZiA2NCBieXRlcy4gKi8KKyAgIGMtPnByb2dfZGF0YS5iYXNlLnVyYl9lbnRyeV9zaXplID0gQUxJR04ob3V0cHV0X3NpemVfYnl0ZXMsIDY0KSAvIDY0OworCisgICBjLT5wcm9nX2RhdGEub3V0cHV0X3RvcG9sb2d5ID0gcHJpbV90b19od19wcmltW2MtPmdwLT5wcm9ncmFtLk91dHB1dFR5cGVdOworCisgICBicndfY29tcHV0ZV92dWVfbWFwKGJydywgJmMtPmlucHV0X3Z1ZV9tYXAsIGMtPmtleS5pbnB1dF92YXJ5aW5ncyk7CisKKyAgIC8qIEdTIGlucHV0cyBhcmUgcmVhZCBmcm9tIHRoZSBWVUUgMjU2IGJpdHMgKDIgdmVjNCdzKSBhdCBhIHRpbWUsIHNvIHdlCisgICAgKiBuZWVkIHRvIHByb2dyYW0gYSBVUkIgcmVhZCBsZW5ndGggb2YgY2VpbGluZyhudW1fc2xvdHMgLyAyKS4KKyAgICAqLworICAgYy0+cHJvZ19kYXRhLmJhc2UudXJiX3JlYWRfbGVuZ3RoID0gKGMtPmlucHV0X3Z1ZV9tYXAubnVtX3Nsb3RzICsgMSkgLyAyOworCisgICBjLT5iYXNlLnByb2dyYW0gPSBicndfZ3NfZW1pdChicncsIGMtPmJhc2Uuc2hhZGVyX3Byb2csIGMsCisgICAgICAgICBjLT5iYXNlLm1lbV9jdHgsICZjLT5iYXNlLnByb2dyYW1fc2l6ZSk7CisgICBpZiAoYy0+YmFzZS5wcm9ncmFtID09IE5VTEwpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmIChjLT5iYXNlLmxhc3Rfc2NyYXRjaCkgeworICAgICAgYy0+cHJvZ19kYXRhLmJhc2UudG90YWxfc2NyYXRjaAorICAgICAgICAgPSBicndfZ2V0X3NjcmF0Y2hfc2l6ZShjLT5iYXNlLmxhc3Rfc2NyYXRjaCpSRUdfU0laRSk7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorYnJ3X2dzX2NsZWFyX2NvbXBpbGUoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2dzX2NvbXBpbGUgKmMpCit7CisgICByYWxsb2NfZnJlZShjLT5iYXNlLm1lbV9jdHgpOworfQorCisKK2Jvb2wKK2Jyd19nc19wcmVjb21waWxlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gYnJ3X2NvbnRleHQoY3R4KTsKKyAgIHN0cnVjdCBicndfZ3NfcHJvZ19rZXkga2V5OworCisgICBpZiAoIXByb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0dFT01FVFJZXSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICBzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqZ3AgPSAoc3RydWN0IGdsX2dlb21ldHJ5X3Byb2dyYW0gKikKKyAgICAgIHByb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0dFT01FVFJZXS0+UHJvZ3JhbTsKKyAgIHN0cnVjdCBicndfZ2VvbWV0cnlfcHJvZ3JhbSAqYmdwID0gYnJ3X2dlb21ldHJ5X3Byb2dyYW0oZ3ApOworCisgICBtZW1zZXQoJmtleSwgMCwgc2l6ZW9mKGtleSkpOworCisgICBicndfdmVjNF9zZXR1cF9wcm9nX2tleV9mb3JfcHJlY29tcGlsZShjdHgsICZrZXkuYmFzZSwgYmdwLT5pZCwgJmdwLT5CYXNlKTsKKworICAgLyogQXNzdW1lIHRoYXQgdGhlIHNldCBvZiB2YXJ5aW5ncyBjb21pbmcgaW4gZnJvbSB0aGUgdmVydGV4IHNoYWRlciBleGFjdGx5CisgICAgKiBtYXRjaGVzIHdoYXQgdGhlIGdlb21ldHJ5IHNoYWRlciByZXF1aXJlcy4KKyAgICAqLworICAga2V5LmlucHV0X3ZhcnlpbmdzID0gZ3AtPkJhc2UuSW5wdXRzUmVhZDsKKworICAgc3RydWN0IGJyd19nc19jb21waWxlIGM7CisKKyAgIGJyd19nc19pbml0X2NvbXBpbGUoYnJ3LCBwcm9nLCBiZ3AsICZrZXksICZjKTsKKyAgIGlmICghYnJ3X2dzX2RvX2NvbXBpbGUoYnJ3LCAmYykpIHsKKyAgICAgIGJyd19nc19jbGVhcl9jb21waWxlKGJydywgJmMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICAvLyBSYXRoZXIgdGhhbiBkZWZlciBvciB1cGxvYWQgdG8gY2FjaGUsIGhhbmQgb2ZmCisgICAvLyB0aGUgY29tcGlsZSByZXN1bHRzIGJhY2sgdG8gdGhlIGJyd19jb250ZXh0CisgICBicndfc2hhZGVyX3Byb2dyYW1fc2F2ZV9nc19jb21waWxlKGJydy0+c2hhZGVyX3Byb2csICZjKTsKKworICAgYnJ3X2dzX2NsZWFyX2NvbXBpbGUoYnJ3LCAmYyk7CisKKyAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wKK2Jyd19nc19wcm9nX2RhdGFfY29tcGFyZShjb25zdCB2b2lkICppbl9hLCBjb25zdCB2b2lkICppbl9iKQoreworICAgY29uc3Qgc3RydWN0IGJyd19nc19wcm9nX2RhdGEgKmEgPSBpbl9hOworICAgY29uc3Qgc3RydWN0IGJyd19nc19wcm9nX2RhdGEgKmIgPSBpbl9iOworCisgICAvKiBDb21wYXJlIHRoZSBiYXNlIHN0cnVjdHVyZS4gKi8KKyAgIGlmICghYnJ3X3N0YWdlX3Byb2dfZGF0YV9jb21wYXJlKCZhLT5iYXNlLmJhc2UsICZiLT5iYXNlLmJhc2UpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBDb21wYXJlIHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3QuICovCisgICBjb25zdCB1bnNpZ25lZCBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEpOworICAgaWYgKG1lbWNtcCgoKGNoYXIgKikgYSkgKyBvZmZzZXQsICgoY2hhciAqKSBiKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBicndfZ3NfcHJvZ19kYXRhKSAtIG9mZnNldCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfZ3MuaCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDI0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfZ3MuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBCUldfVkVDNF9HU19ICisjZGVmaW5lIEJSV19WRUM0X0dTX0gKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZ2xfY29udGV4dDsKK3N0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbTsKKworYm9vbCBicndfZ3NfcHJlY29tcGlsZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpOworYm9vbCBicndfZ3NfcHJvZ19kYXRhX2NvbXBhcmUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIEJSV19WRUM0X0dTX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9nc192aXNpdG9yLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9nc192aXNpdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTQ2ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2dzX3Zpc2l0b3IuY3BwCkBAIC0wLDAgKzEsNjM1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBicndfdmVjNF9nc192aXNpdG9yLmNwcAorICoKKyAqIEdlb21ldHJ5LXNoYWRlci1zcGVjaWZpYyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgdmVjNF92aXNpdG9yIGNsYXNzLgorICovCisKKyNpbmNsdWRlICJicndfdmVjNF9nc192aXNpdG9yLmgiCisKK2NvbnN0IHVuc2lnbmVkIE1BWF9HU19JTlBVVF9WRVJUSUNFUyA9IDY7CisKK25hbWVzcGFjZSBicncgeworCit2ZWM0X2dzX3Zpc2l0b3I6OnZlYzRfZ3NfdmlzaXRvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfZ3NfY29tcGlsZSAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vX3NwaWxscykKKyAgIDogdmVjNF92aXNpdG9yKGJydywgJmMtPmJhc2UsICZjLT5ncC0+cHJvZ3JhbS5CYXNlLCAmYy0+a2V5LmJhc2UsCisgICAgICAgICAgICAgICAgICAmYy0+cHJvZ19kYXRhLmJhc2UsIHByb2csIE1FU0FfU0hBREVSX0dFT01FVFJZLCBtZW1fY3R4LAorICAgICAgICAgICAgICAgICAgSU5URUxfREVCVUcgJiBERUJVR19HUywgbm9fc3BpbGxzLAorICAgICAgICAgICAgICAgICAgU1RfR1MsIFNUX0dTX1dSSVRURU4sIFNUX0dTX1JFU0VUKSwKKyAgICAgYyhjKQoreworfQorCisKK2RzdF9yZWcgKgordmVjNF9nc192aXNpdG9yOjptYWtlX3JlZ19mb3Jfc3lzdGVtX3ZhbHVlKGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIGRzdF9yZWcgKnJlZyA9IG5ldyhtZW1fY3R4KSBkc3RfcmVnKHRoaXMsIGlyLT50eXBlKTsKKworICAgc3dpdGNoIChpci0+ZGF0YS5sb2NhdGlvbikgeworICAgY2FzZSBTWVNURU1fVkFMVUVfSU5WT0NBVElPTl9JRDoKKyAgICAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9ICJpbml0aWFsaXplIGdsX0ludm9jYXRpb25JRCI7CisgICAgICBlbWl0KEdTX09QQ09ERV9HRVRfSU5TVEFOQ0VfSUQsICpyZWcpOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gcmVnOworfQorCisKK2ludAordmVjNF9nc192aXNpdG9yOjpzZXR1cF92YXJ5aW5nX2lucHV0cyhpbnQgcGF5bG9hZF9yZWcsIGludCAqYXR0cmlidXRlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZXNfcGVyX3JlZykKK3sKKyAgIC8qIEZvciBnZW9tZXRyeSBzaGFkZXJzIHRoZXJlIGFyZSBOIGNvcGllcyBvZiB0aGUgaW5wdXQgYXR0cmlidXRlcywgd2hlcmUgTgorICAgICogaXMgdGhlIG51bWJlciBvZiBpbnB1dCB2ZXJ0aWNlcy4gIGF0dHJpYnV0ZV9tYXBbQlJXX1ZBUllJTkdfU0xPVF9DT1VOVCAqCisgICAgKiBpICsgal0gcmVwcmVzZW50cyBhdHRyaWJ1dGUgaiBmb3IgdmVydGV4IGkuCisgICAgKgorICAgICogTm90ZSB0aGF0IEdTIGlucHV0cyBhcmUgcmVhZCBmcm9tIHRoZSBWVUUgMjU2IGJpdHMgKDIgdmVjNCdzKSBhdCBhIHRpbWUsCisgICAgKiBzbyB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0IHNsb3RzIHRoYXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlIEdTIChhbmQKKyAgICAqIHRodXMgdGhlIHN0cmlkZSBvZiB0aGUgaW5wdXQgYXJyYXlzKSBpcyB1cmJfcmVhZF9sZW5ndGggKiAyLgorICAgICovCisgICBjb25zdCB1bnNpZ25lZCBudW1faW5wdXRfdmVydGljZXMgPSBjLT5ncC0+cHJvZ3JhbS5WZXJ0aWNlc0luOworICAgYXNzZXJ0KG51bV9pbnB1dF92ZXJ0aWNlcyA8PSBNQVhfR1NfSU5QVVRfVkVSVElDRVMpOworICAgdW5zaWduZWQgaW5wdXRfYXJyYXlfc3RyaWRlID0gYy0+cHJvZ19kYXRhLmJhc2UudXJiX3JlYWRfbGVuZ3RoICogMjsKKworICAgZm9yIChpbnQgc2xvdCA9IDA7IHNsb3QgPCBjLT5pbnB1dF92dWVfbWFwLm51bV9zbG90czsgc2xvdCsrKSB7CisgICAgICBpbnQgdmFyeWluZyA9IGMtPmlucHV0X3Z1ZV9tYXAuc2xvdF90b192YXJ5aW5nW3Nsb3RdOworICAgICAgZm9yICh1bnNpZ25lZCB2ZXJ0ZXggPSAwOyB2ZXJ0ZXggPCBudW1faW5wdXRfdmVydGljZXM7IHZlcnRleCsrKSB7CisgICAgICAgICBhdHRyaWJ1dGVfbWFwW0JSV19WQVJZSU5HX1NMT1RfQ09VTlQgKiB2ZXJ0ZXggKyB2YXJ5aW5nXSA9CisgICAgICAgICAgICBhdHRyaWJ1dGVzX3Blcl9yZWcgKiBwYXlsb2FkX3JlZyArIGlucHV0X2FycmF5X3N0cmlkZSAqIHZlcnRleCArCisgICAgICAgICAgICBzbG90OworICAgICAgfQorICAgfQorCisgICBpbnQgcmVnc191c2VkID0gQUxJR04oaW5wdXRfYXJyYXlfc3RyaWRlICogbnVtX2lucHV0X3ZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfcGVyX3JlZykgLyBhdHRyaWJ1dGVzX3Blcl9yZWc7CisgICByZXR1cm4gcGF5bG9hZF9yZWcgKyByZWdzX3VzZWQ7Cit9CisKKwordm9pZAordmVjNF9nc192aXNpdG9yOjpzZXR1cF9wYXlsb2FkKCkKK3sKKyAgIGludCBhdHRyaWJ1dGVfbWFwW0JSV19WQVJZSU5HX1NMT1RfQ09VTlQgKiBNQVhfR1NfSU5QVVRfVkVSVElDRVNdOworCisgICAvKiBJZiB3ZSBhcmUgaW4gZHVhbCBpbnN0YW5jZWQgbW9kZSwgdGhlbiBhdHRyaWJ1dGVzIGFyZSBnb2luZyB0byBiZQorICAgICogaW50ZXJsZWF2ZWQsIHNvIG9uZSByZWdpc3RlciBjb250YWlucyB0d28gYXR0cmlidXRlIHNsb3RzLgorICAgICovCisgICBpbnQgYXR0cmlidXRlc19wZXJfcmVnID0gYy0+cHJvZ19kYXRhLmR1YWxfaW5zdGFuY2VkX2Rpc3BhdGNoID8gMiA6IDE7CisKKyAgIC8qIElmIGEgZ2VvbWV0cnkgc2hhZGVyIHRyaWVzIHRvIHJlYWQgZnJvbSBhbiBpbnB1dCB0aGF0IHdhc24ndCB3cml0dGVuIGJ5CisgICAgKiB0aGUgdmVydGV4IHNoYWRlciwgdGhhdCBwcm9kdWNlcyB1bmRlZmluZWQgcmVzdWx0cywgYnV0IGl0IHNob3VsZG4ndAorICAgICogY3Jhc2ggYW55dGhpbmcuICBTbyBpbml0aWFsaXplIGF0dHJpYnV0ZV9tYXAgdG8gemVyb3MtLXRoYXQgZW5zdXJlcyB0aGF0CisgICAgKiB0aGVzZSB1bmRlZmluZWQgcmVzdWx0cyBhcmUgcmVhZCBmcm9tIHIwLgorICAgICovCisgICBtZW1zZXQoYXR0cmlidXRlX21hcCwgMCwgc2l6ZW9mKGF0dHJpYnV0ZV9tYXApKTsKKworICAgaW50IHJlZyA9IDA7CisKKyAgIC8qIFRoZSBwYXlsb2FkIGFsd2F5cyBjb250YWlucyBpbXBvcnRhbnQgZGF0YSBpbiByMCwgd2hpY2ggY29udGFpbnMKKyAgICAqIHRoZSBVUkIgaGFuZGxlcyB0aGF0IGFyZSBwYXNzZWQgb24gdG8gdGhlIFVSQiB3cml0ZSBhdCB0aGUgZW5kCisgICAgKiBvZiB0aGUgdGhyZWFkLgorICAgICovCisgICByZWcrKzsKKworICAgLyogSWYgdGhlIHNoYWRlciB1c2VzIGdsX1ByaW1pdGl2ZUlESW4sIHRoYXQgZ29lcyBpbiByMS4gKi8KKyAgIGlmIChjLT5wcm9nX2RhdGEuaW5jbHVkZV9wcmltaXRpdmVfaWQpCisgICAgICBhdHRyaWJ1dGVfbWFwW1ZBUllJTkdfU0xPVF9QUklNSVRJVkVfSURdID0gYXR0cmlidXRlc19wZXJfcmVnICogcmVnKys7CisKKyAgIHJlZyA9IHNldHVwX3VuaWZvcm1zKHJlZyk7CisKKyAgIHJlZyA9IHNldHVwX3ZhcnlpbmdfaW5wdXRzKHJlZywgYXR0cmlidXRlX21hcCwgYXR0cmlidXRlc19wZXJfcmVnKTsKKworICAgbG93ZXJfYXR0cmlidXRlc190b19od19yZWdzKGF0dHJpYnV0ZV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cHJvZ19kYXRhLmR1YWxfaW5zdGFuY2VkX2Rpc3BhdGNoKTsKKworICAgdGhpcy0+Zmlyc3Rfbm9uX3BheWxvYWRfZ3JmID0gcmVnOworfQorCisKK3ZvaWQKK3ZlYzRfZ3NfdmlzaXRvcjo6ZW1pdF9wcm9sb2coKQoreworICAgLyogSW4gdmVydGV4IHNoYWRlcnMsIHIwLjIgaXMgZ3VhcmFudGVlZCB0byBiZSBpbml0aWFsaXplZCB0byB6ZXJvLiAgSW4KKyAgICAqIGdlb21ldHJ5IHNoYWRlcnMsIGl0IGlzbid0IChpdCBjb250YWlucyBhIGJ1bmNoIG9mIGluZm9ybWF0aW9uIHdlIGRvbid0CisgICAgKiBuZWVkLCBsaWtlIHRoZSBpbnB1dCBwcmltaXRpdmUgdHlwZSkuICBXZSBuZWVkIHIwLjIgdG8gYmUgemVybyBpbiBvcmRlcgorICAgICogdG8gYnVpbGQgc2NyYXRjaCByZWFkL3dyaXRlIG1lc3NhZ2VzIGNvcnJlY3RseSAob3RoZXJ3aXNlIHRoaXMgdmFsdWUKKyAgICAqIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBnbG9iYWwgb2Zmc2V0LCBjYXVzaW5nIHVzIHRvIGRvIG91ciBzY3JhdGNoCisgICAgKiByZWFkcy93cml0ZXMgdG8gZ2FyYmFnZSBtZW1vcnkpLiAgU28ganVzdCBzZXQgaXQgdG8gemVybyBhdCB0aGUgdG9wIG9mCisgICAgKiB0aGUgc2hhZGVyLgorICAgICovCisgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSAiY2xlYXIgcjAuMiI7CisgICBkc3RfcmVnIHIwKHJldHlwZShicndfdmVjNF9ncmYoMCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gZW1pdChHU19PUENPREVfU0VUX0RXT1JEXzJfSU1NRUQsIHIwLCAwdSk7CisgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKworICAgLyogQ3JlYXRlIGEgdmlydHVhbCByZWdpc3RlciB0byBob2xkIHRoZSB2ZXJ0ZXggY291bnQgKi8KKyAgIHRoaXMtPnZlcnRleF9jb3VudCA9IHNyY19yZWcodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworCisgICAvKiBJbml0aWFsaXplIHRoZSB2ZXJ0ZXhfY291bnQgcmVnaXN0ZXIgdG8gMCAqLworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gImluaXRpYWxpemUgdmVydGV4X2NvdW50IjsKKyAgIGluc3QgPSBlbWl0KE1PVihkc3RfcmVnKHRoaXMtPnZlcnRleF9jb3VudCksIDB1KSk7CisgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKworICAgaWYgKGMtPmNvbnRyb2xfZGF0YV9oZWFkZXJfc2l6ZV9iaXRzID4gMCkgeworICAgICAgLyogQ3JlYXRlIGEgdmlydHVhbCByZWdpc3RlciB0byBob2xkIHRoZSBjdXJyZW50IHNldCBvZiBjb250cm9sIGRhdGEKKyAgICAgICAqIGJpdHMuCisgICAgICAgKi8KKyAgICAgIHRoaXMtPmNvbnRyb2xfZGF0YV9iaXRzID0gc3JjX3JlZyh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisKKyAgICAgIC8qIElmIHdlJ3JlIG91dHB1dHRpbmcgbW9yZSB0aGFuIDMyIGNvbnRyb2wgZGF0YSBiaXRzLCB0aGVuIEVtaXRWZXJ0ZXgoKQorICAgICAgICogd2lsbCBzZXQgY29udHJvbF9kYXRhX2JpdHMgdG8gMCBhZnRlciBlbWl0dGluZyB0aGUgZmlyc3QgdmVydGV4LgorICAgICAgICogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUgaXQgdG8gMCBoZXJlLgorICAgICAgICovCisgICAgICBpZiAoYy0+Y29udHJvbF9kYXRhX2hlYWRlcl9zaXplX2JpdHMgPD0gMzIpIHsKKyAgICAgICAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9ICJpbml0aWFsaXplIGNvbnRyb2wgZGF0YSBiaXRzIjsKKyAgICAgICAgIGluc3QgPSBlbWl0KE1PVihkc3RfcmVnKHRoaXMtPmNvbnRyb2xfZGF0YV9iaXRzKSwgMHUpKTsKKyAgICAgICAgIGluc3QtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworICAgICAgfQorICAgfQorCisgICAvKiBJZiB0aGUgZ2VvbWV0cnkgc2hhZGVyIHVzZXMgdGhlIGdsX1BvaW50U2l6ZSBpbnB1dCwgd2UgbmVlZCB0byBmaXggaXQgdXAKKyAgICAqIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIHZlcnRleCBzaGFkZXIgc3RvcmVkIGl0IGluIHRoZSB3CisgICAgKiBjb21wb25lbnQgb2YgVkFSWUlOR19TTE9UX1BTSVouCisgICAgKi8KKyAgIGlmIChjLT5ncC0+cHJvZ3JhbS5CYXNlLklucHV0c1JlYWQgJiBWQVJZSU5HX0JJVF9QU0laKSB7CisgICAgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSAic3dpenpsZSBnbF9Qb2ludFNpemUgaW5wdXQiOworICAgICAgZm9yIChpbnQgdmVydGV4ID0gMDsgdmVydGV4IDwgYy0+Z3AtPnByb2dyYW0uVmVydGljZXNJbjsgdmVydGV4KyspIHsKKyAgICAgICAgIGRzdF9yZWcgZHN0KEFUVFIsCisgICAgICAgICAgICAgICAgICAgICBCUldfVkFSWUlOR19TTE9UX0NPVU5UICogdmVydGV4ICsgVkFSWUlOR19TTE9UX1BTSVopOworICAgICAgICAgZHN0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9GOworICAgICAgICAgc3JjX3JlZyBzcmMoZHN0KTsKKyAgICAgICAgIGRzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWDsKKyAgICAgICAgIHNyYy5zd2l6emxlID0gQlJXX1NXSVpaTEVfV1dXVzsKKyAgICAgICAgIGluc3QgPSBlbWl0KE1PVihkc3QsIHNyYykpOworCisgICAgICAgICAvKiBJbiBkdWFsIGluc3RhbmNlZCBkaXNwYXRjaCBtb2RlLCBkc3QgaGFzIGEgd2lkdGggb2YgNCwgc28gd2UgbmVlZAorICAgICAgICAgICogdG8gbWFrZSBzdXJlIHRoZSBNT1YgaGFwcGVucyByZWdhcmRsZXNzIG9mIHdoaWNoIGNoYW5uZWxzIGFyZQorICAgICAgICAgICogZW5hYmxlZC4KKyAgICAgICAgICAqLworICAgICAgICAgaW5zdC0+Zm9yY2Vfd3JpdGVtYXNrX2FsbCA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9IE5VTEw7Cit9CisKKwordm9pZAordmVjNF9nc192aXNpdG9yOjplbWl0X3Byb2dyYW1fY29kZSgpCit7CisgICAvKiBXZSBkb24ndCBzdXBwb3J0IE5WX2dlb21ldHJ5X3Byb2dyYW00LiAqLworICAgYXNzZXJ0KCEiVW5yZWFjaGVkIik7Cit9CisKKwordm9pZAordmVjNF9nc192aXNpdG9yOjplbWl0X3RocmVhZF9lbmQoKQoreworICAgaWYgKGMtPmNvbnRyb2xfZGF0YV9oZWFkZXJfc2l6ZV9iaXRzID4gMCkgeworICAgICAgLyogRHVyaW5nIHNoYWRlciBleGVjdXRpb24sIHdlIG9ubHkgZXZlciBjYWxsIGVtaXRfY29udHJvbF9kYXRhX2JpdHMoKQorICAgICAgICoganVzdCBwcmlvciB0byBvdXRwdXR0aW5nIGEgdmVydGV4LiAgVGhlcmVmb3JlLCB0aGUgY29udHJvbCBkYXRhIGJpdHMKKyAgICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vc3QgcmVjZW50bHkgb3V0cHV0IHZlcnRleCBzdGlsbCBuZWVkIHRvIGJlCisgICAgICAgKiBlbWl0dGVkLgorICAgICAgICovCisgICAgICBjdXJyZW50X2Fubm90YXRpb24gPSAidGhyZWFkIGVuZDogZW1pdCBjb250cm9sIGRhdGEgYml0cyI7CisgICAgICBlbWl0X2NvbnRyb2xfZGF0YV9iaXRzKCk7CisgICB9CisKKyAgIC8qIE1SRiAwIGlzIHJlc2VydmVkIGZvciB0aGUgZGVidWdnZXIsIHNvIHN0YXJ0IHdpdGggbWVzc2FnZSBoZWFkZXIKKyAgICAqIGluIE1SRiAxLgorICAgICovCisgICBpbnQgYmFzZV9tcmYgPSAxOworCisgICBjdXJyZW50X2Fubm90YXRpb24gPSAidGhyZWFkIGVuZCI7CisgICBkc3RfcmVnIG1yZl9yZWcoTVJGLCBiYXNlX21yZik7CisgICBzcmNfcmVnIHIwKHJldHlwZShicndfdmVjOF9ncmYoMCwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gZW1pdChNT1YobXJmX3JlZywgcjApKTsKKyAgIGluc3QtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworICAgZW1pdChHU19PUENPREVfU0VUX1ZFUlRFWF9DT1VOVCwgbXJmX3JlZywgdGhpcy0+dmVydGV4X2NvdW50KTsKKy8vICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfU0hBREVSX1RJTUUpCisvLyAgICAgIGVtaXRfc2hhZGVyX3RpbWVfZW5kKCk7CisgICBpbnN0ID0gZW1pdChHU19PUENPREVfVEhSRUFEX0VORCk7CisgICBpbnN0LT5iYXNlX21yZiA9IGJhc2VfbXJmOworICAgaW5zdC0+bWxlbiA9IDE7Cit9CisKKwordm9pZAordmVjNF9nc192aXNpdG9yOjplbWl0X3VyYl93cml0ZV9oZWFkZXIoaW50IG1yZikKK3sKKyAgIC8qIFRoZSBTRU5EIGluc3RydWN0aW9uIHRoYXQgd3JpdGVzIHRoZSB2ZXJ0ZXggZGF0YSB0byB0aGUgVlVFIHdpbGwgdXNlCisgICAgKiBwZXJfc2xvdF9vZmZzZXQ9dHJ1ZSwgd2hpY2ggbWVhbnMgdGhhdCBEV09SRHMgMyBhbmQgNCBvZiB0aGUgbWVzc2FnZQorICAgICogaGVhZGVyIHNwZWNpZnkgYW4gb2Zmc2V0IChpbiBtdWx0aXBsZXMgb2YgMjU2IGJpdHMpIGludG8gdGhlIFVSQiBlbnRyeQorICAgICogYXQgd2hpY2ggdGhlIHdyaXRlIHNob3VsZCB0YWtlIHBsYWNlLgorICAgICoKKyAgICAqIFNvIHdlIGhhdmUgdG8gcHJlcGFyZSBhIG1lc3NhZ2UgaGVhZGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG9mZnNldAorICAgICogdmFsdWVzLgorICAgICovCisgICBkc3RfcmVnIG1yZl9yZWcoTVJGLCBtcmYpOworICAgc3JjX3JlZyByMChyZXR5cGUoYnJ3X3ZlYzhfZ3JmKDAsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gIlVSQiB3cml0ZSBoZWFkZXIiOworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoTU9WKG1yZl9yZWcsIHIwKSk7CisgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgIGVtaXQoR1NfT1BDT0RFX1NFVF9XUklURV9PRkZTRVQsIG1yZl9yZWcsIHRoaXMtPnZlcnRleF9jb3VudCwKKyAgICAgICAgKHVpbnQzMl90KSBjLT5wcm9nX2RhdGEub3V0cHV0X3ZlcnRleF9zaXplX2h3b3Jkcyk7Cit9CisKKwordmVjNF9pbnN0cnVjdGlvbiAqCit2ZWM0X2dzX3Zpc2l0b3I6OmVtaXRfdXJiX3dyaXRlX29wY29kZShib29sIGNvbXBsZXRlKQoreworICAgLyogV2UgZG9uJ3QgY2FyZSB3aGV0aGVyIHRoZSB2ZXJ0ZXggaXMgY29tcGxldGUsIGJlY2F1c2UgaW4gZ2VuZXJhbAorICAgICogZ2VvbWV0cnkgc2hhZGVycyBvdXRwdXQgbXVsdGlwbGUgdmVydGljZXMsIGFuZCB3ZSBkb24ndCB0ZXJtaW5hdGUgdGhlCisgICAgKiB0aHJlYWQgdW50aWwgYWxsIHZlcnRpY2VzIGFyZSBjb21wbGV0ZS4KKyAgICAqLworICAgKHZvaWQpIGNvbXBsZXRlOworCisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gZW1pdChHU19PUENPREVfVVJCX1dSSVRFKTsKKyAgIGluc3QtPm9mZnNldCA9IGMtPnByb2dfZGF0YS5jb250cm9sX2RhdGFfaGVhZGVyX3NpemVfaHdvcmRzOworCisgICAvKiBXZSBuZWVkIHRvIGluY3JlbWVudCBHbG9iYWwgT2Zmc2V0IGJ5IDEgdG8gbWFrZSByb29tIGZvciBCcm9hZHdlbGwncworICAgICogZXh0cmEgIlZlcnRleCBDb3VudCIgcGF5bG9hZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBVUkIgZW50cnkuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA+PSA4KQorICAgICAgaW5zdC0+b2Zmc2V0Kys7CisKKyAgIGluc3QtPnVyYl93cml0ZV9mbGFncyA9IEJSV19VUkJfV1JJVEVfUEVSX1NMT1RfT0ZGU0VUOworICAgcmV0dXJuIGluc3Q7Cit9CisKKworaW50Cit2ZWM0X2dzX3Zpc2l0b3I6OmNvbXB1dGVfYXJyYXlfc3RyaWRlKGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKK3sKKyAgIC8qIEdlb21ldHJ5IHNoYWRlciBpbnB1dHMgYXJlIGFycmF5cywgYnV0IHRoZXkgdXNlIGFuIHVudXN1YWwgYXJyYXkgbGF5b3V0OgorICAgICogaW5zdGVhZCBvZiBhbGwgYXJyYXkgZWxlbWVudHMgZm9yIGEgZ2l2ZW4gZ2VvbWV0cnkgc2hhZGVyIGlucHV0IGJlaW5nCisgICAgKiBzdG9yZWQgY29uc2VjdXRpdmVseSwgYWxsIGdlb21ldHJ5IHNoYWRlciBpbnB1dHMgYXJlIGludGVybGVhdmVkIGludG8KKyAgICAqIG9uZSBnaWFudCBhcnJheS4gIEF0IHRoaXMgc3RhZ2Ugb2YgY29tcGlsYXRpb24sIHdlIGFzc3VtZSB0aGF0IHRoZQorICAgICogc3RyaWRlIG9mIHRoZSBhcnJheSBpcyBCUldfVkFSWUlOR19TTE9UX0NPVU5ULiAgTGF0ZXIsCisgICAgKiBzZXR1cF9hdHRyaWJ1dGVzKCkgd2lsbCByZW1hcCBvdXIgYWNjZXNzZXMgdG8gdGhlIGFjdHVhbCBpbnB1dCBhcnJheS4KKyAgICAqLworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmX3ZhciA9IGlyLT5hcnJheS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgIGlmIChkZXJlZl92YXIgJiYgZGVyZWZfdmFyLT52YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKQorICAgICAgcmV0dXJuIEJSV19WQVJZSU5HX1NMT1RfQ09VTlQ7CisgICBlbHNlCisgICAgICByZXR1cm4gdmVjNF92aXNpdG9yOjpjb21wdXRlX2FycmF5X3N0cmlkZShpcik7Cit9CisKKworLyoqCisgKiBXcml0ZSBvdXQgYSBiYXRjaCBvZiAzMiBjb250cm9sIGRhdGEgYml0cyBmcm9tIHRoZSBjb250cm9sX2RhdGFfYml0cworICogcmVnaXN0ZXIgdG8gdGhlIFVSQi4KKyAqCisgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdmVydGV4X2NvdW50IHJlZ2lzdGVyIGRldGVybWluZXMgd2hpY2ggRFdPUkQgaW4KKyAqIHRoZSBVUkIgcmVjZWl2ZXMgdGhlIGNvbnRyb2wgZGF0YSBiaXRzLiAgVGhlIGNvbnRyb2xfZGF0YV9iaXRzIHJlZ2lzdGVyIGlzCisgKiBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGNvcnJlY3QgZGF0YSBmb3IgdGhlIHZlcnRleCB0aGF0IHdhcyBtb3N0IHJlY2VudGx5CisgKiBvdXRwdXQsIGFuZCBhbGwgcHJldmlvdXMgdmVydGljZXMgdGhhdCBzaGFyZSB0aGUgc2FtZSBEV09SRC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgZW5zdXJpbmcgdGhhdCBpZiBubyB2ZXJ0aWNlcyBoYXZlIGJlZW4gb3V0cHV0CisgKiB5ZXQsIG5vIGNvbnRyb2wgYml0cyBhcmUgZW1pdHRlZC4KKyAqLwordm9pZAordmVjNF9nc192aXNpdG9yOjplbWl0X2NvbnRyb2xfZGF0YV9iaXRzKCkKK3sKKyAgIGFzc2VydChjLT5jb250cm9sX2RhdGFfYml0c19wZXJfdmVydGV4ICE9IDApOworCisgICAvKiBTaW5jZSB0aGUgVVJCX1dSSVRFX09XT1JEIG1lc3NhZ2Ugb3BlcmF0ZXMgd2l0aCAxMjgtYml0ICh2ZWM0IHNpemVkKQorICAgICogZ3JhbnVsYXJpdHksIHdlIG5lZWQgdG8gdXNlIHR3byB0cmlja3MgdG8gZW5zdXJlIHRoYXQgdGhlIGJhdGNoIG9mIDMyCisgICAgKiBjb250cm9sIGRhdGEgYml0cyBpcyB3cml0dGVuIHRvIHRoZSBhcHByb3ByaWF0ZSBEV09SRCBpbiB0aGUgVVJCLiAgVG8KKyAgICAqIHNlbGVjdCB3aGljaCB2ZWM0IHdlIGFyZSB3cml0aW5nIHRvLCB3ZSB1c2UgdGhlICJzbG90IHswLDF9IG9mZnNldCIKKyAgICAqIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBoZWFkZXIuICBUbyBzZWxlY3Qgd2hpY2ggRFdPUkQgaW4gdGhlIHZlYzQgd2UgYXJlCisgICAgKiB3cml0aW5nIHRvLCB3ZSB1c2UgdGhlIGNoYW5uZWwgbWFzayBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgaGVhZGVyLiAgVG8KKyAgICAqIGF2b2lkIHBlbmFsaXppbmcgZ2VvbWV0cnkgc2hhZGVycyB0aGF0IGVtaXQgYSBzbWFsbCBudW1iZXIgb2YgdmVydGljZXMKKyAgICAqIHdpdGggZXh0cmEgYm9va2tlZXBpbmcsIHdlIG9ubHkgZG8gZWFjaCBvZiB0aGVzZSB0cmlja3Mgd2hlbgorICAgICogYy0+cHJvZ19kYXRhLmNvbnRyb2xfZGF0YV9oZWFkZXJfc2l6ZV9iaXRzIGlzIGxhcmdlIGVub3VnaCB0byBtYWtlIGl0CisgICAgKiBuZWNlc3NhcnkuCisgICAgKgorICAgICogTm90ZTogdGhpcyBtZWFucyB0aGF0IGlmIHdlJ3JlIG91dHB1dHRpbmcganVzdCBhIHNpbmdsZSBEV09SRCBvZiBjb250cm9sCisgICAgKiBkYXRhIGJpdHMsIHdlJ2xsIGFjdHVhbGx5IHJlcGxpY2F0ZSBpdCBmb3VyIHRpbWVzIHNpbmNlIHdlIHdvbid0IGRvIGFueQorICAgICogY2hhbm5lbCBtYXNraW5nLiAgQnV0IHRoYXQncyBub3QgYSBwcm9ibGVtIHNpbmNlIGluIHRoaXMgY2FzZSB0aGUKKyAgICAqIGhhcmR3YXJlIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGZpcnN0IERXT1JELgorICAgICovCisgICBlbnVtIGJyd191cmJfd3JpdGVfZmxhZ3MgdXJiX3dyaXRlX2ZsYWdzID0gQlJXX1VSQl9XUklURV9PV09SRDsKKyAgIGlmIChjLT5jb250cm9sX2RhdGFfaGVhZGVyX3NpemVfYml0cyA+IDMyKQorICAgICAgdXJiX3dyaXRlX2ZsYWdzID0gdXJiX3dyaXRlX2ZsYWdzIHwgQlJXX1VSQl9XUklURV9VU0VfQ0hBTk5FTF9NQVNLUzsKKyAgIGlmIChjLT5jb250cm9sX2RhdGFfaGVhZGVyX3NpemVfYml0cyA+IDEyOCkKKyAgICAgIHVyYl93cml0ZV9mbGFncyA9IHVyYl93cml0ZV9mbGFncyB8IEJSV19VUkJfV1JJVEVfUEVSX1NMT1RfT0ZGU0VUOworCisgICAvKiBJZiB2ZXJ0ZXhfY291bnQgaXMgMCwgdGhlbiBubyBjb250cm9sIGRhdGEgYml0cyBoYXZlIGJlZW4gYWNjdW11bGF0ZWQKKyAgICAqIHlldCwgc28gd2Ugc2hvdWxkIGRvIG5vdGhpbmcuCisgICAgKi8KKyAgIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgdGhpcy0+dmVydGV4X2NvdW50LCAwdSwgQlJXX0NPTkRJVElPTkFMX05FUSkpOworICAgZW1pdChJRihCUldfUFJFRElDQVRFX05PUk1BTCkpOworICAgeworICAgICAgLyogSWYgd2UgYXJlIHVzaW5nIGVpdGhlciBjaGFubmVsIG1hc2tzIG9yIGEgcGVyLXNsb3Qgb2Zmc2V0LCB0aGVuIHdlCisgICAgICAgKiBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggRFdPUkQgd2UgYXJlIHRyeWluZyB0byB3cml0ZSB0bywgdXNpbmcgdGhlCisgICAgICAgKiBmb3JtdWxhOgorICAgICAgICoKKyAgICAgICAqICAgICBkd29yZF9pbmRleCA9ICh2ZXJ0ZXhfY291bnQgLSAxKSAqIGJpdHNfcGVyX3ZlcnRleCAvIDMyCisgICAgICAgKgorICAgICAgICogU2luY2UgYml0c19wZXJfdmVydGV4IGlzIGEgcG93ZXIgb2YgdHdvLCBhbmQgaXMga25vd24gYXQgY29tcGlsZQorICAgICAgICogdGltZSwgdGhpcyBjYW4gYmUgb3B0aW1pemVkIHRvOgorICAgICAgICoKKyAgICAgICAqICAgICBkd29yZF9pbmRleCA9ICh2ZXJ0ZXhfY291bnQgLSAxKSA+PiAoNiAtIGxvZzIoYml0c19wZXJfdmVydGV4KSkKKyAgICAgICAqLworICAgICAgc3JjX3JlZyBkd29yZF9pbmRleCh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICBpZiAodXJiX3dyaXRlX2ZsYWdzKSB7CisgICAgICAgICBzcmNfcmVnIHByZXZfY291bnQodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgICAgZW1pdChBREQoZHN0X3JlZyhwcmV2X2NvdW50KSwgdGhpcy0+dmVydGV4X2NvdW50LCAweGZmZmZmZmZmdSkpOworICAgICAgICAgdW5zaWduZWQgbG9nMl9iaXRzX3Blcl92ZXJ0ZXggPQorICAgICAgICAgICAgX21lc2FfZmxzKGMtPmNvbnRyb2xfZGF0YV9iaXRzX3Blcl92ZXJ0ZXgpOworICAgICAgICAgZW1pdChTSFIoZHN0X3JlZyhkd29yZF9pbmRleCksIHByZXZfY291bnQsCisgICAgICAgICAgICAgICAgICAodWludDMyX3QpICg2IC0gbG9nMl9iaXRzX3Blcl92ZXJ0ZXgpKSk7CisgICAgICB9CisKKyAgICAgIC8qIFN0YXJ0IGJ1aWxkaW5nIHRoZSBVUkIgd3JpdGUgbWVzc2FnZS4gIFRoZSBmaXJzdCBNUkYgZ2V0cyBhIGNvcHkgb2YKKyAgICAgICAqIFIwLgorICAgICAgICovCisgICAgICBpbnQgYmFzZV9tcmYgPSAxOworICAgICAgZHN0X3JlZyBtcmZfcmVnKE1SRiwgYmFzZV9tcmYpOworICAgICAgc3JjX3JlZyByMChyZXR5cGUoYnJ3X3ZlYzhfZ3JmKDAsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoTU9WKG1yZl9yZWcsIHIwKSk7CisgICAgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKworICAgICAgaWYgKHVyYl93cml0ZV9mbGFncyAmIEJSV19VUkJfV1JJVEVfUEVSX1NMT1RfT0ZGU0VUKSB7CisgICAgICAgICAvKiBTZXQgdGhlIHBlci1zbG90IG9mZnNldCB0byBkd29yZF9pbmRleCAvIDQsIHRvIHRoYXQgd2UnbGwgd3JpdGUgdG8KKyAgICAgICAgICAqIHRoZSBhcHByb3ByaWF0ZSBPV09SRCB3aXRoaW4gdGhlIGNvbnRyb2wgZGF0YSBoZWFkZXIuCisgICAgICAgICAgKi8KKyAgICAgICAgIHNyY19yZWcgcGVyX3Nsb3Rfb2Zmc2V0KHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgICAgIGVtaXQoU0hSKGRzdF9yZWcocGVyX3Nsb3Rfb2Zmc2V0KSwgZHdvcmRfaW5kZXgsIDJ1KSk7CisgICAgICAgICBlbWl0KEdTX09QQ09ERV9TRVRfV1JJVEVfT0ZGU0VULCBtcmZfcmVnLCBwZXJfc2xvdF9vZmZzZXQsIDF1KTsKKyAgICAgIH0KKworICAgICAgaWYgKHVyYl93cml0ZV9mbGFncyAmIEJSV19VUkJfV1JJVEVfVVNFX0NIQU5ORUxfTUFTS1MpIHsKKyAgICAgICAgIC8qIFNldCB0aGUgY2hhbm5lbCBtYXNrcyB0byAxIDw8IChkd29yZF9pbmRleCAlIDQpLCBzbyB0aGF0IHdlJ2xsCisgICAgICAgICAgKiB3cml0ZSB0byB0aGUgYXBwcm9wcmlhdGUgRFdPUkQgd2l0aGluIHRoZSBPV09SRC4gIFdlIG5lZWQgdG8gZG8KKyAgICAgICAgICAqIHRoaXMgY29tcHV0YXRpb24gd2l0aCBmb3JjZV93cml0ZW1hc2tfYWxsLCBvdGhlcndpc2UgZ2FyYmFnZSBkYXRhCisgICAgICAgICAgKiBmcm9tIGludm9jYXRpb24gMCBtaWdodCBjbG9iYmVyIHRoZSBtYXNrIGZvciBpbnZvY2F0aW9uIDEgd2hlbgorICAgICAgICAgICogR1NfT1BDT0RFX1BSRVBBUkVfQ0hBTk5FTF9NQVNLUyB0cmllcyB0byBPUiB0aGUgdHdvIG1hc2tzCisgICAgICAgICAgKiB0b2dldGhlci4KKyAgICAgICAgICAqLworICAgICAgICAgc3JjX3JlZyBjaGFubmVsKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgICAgIGluc3QgPSBlbWl0KEFORChkc3RfcmVnKGNoYW5uZWwpLCBkd29yZF9pbmRleCwgM3UpKTsKKyAgICAgICAgIGluc3QtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworICAgICAgICAgc3JjX3JlZyBvbmUodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgICAgaW5zdCA9IGVtaXQoTU9WKGRzdF9yZWcob25lKSwgMXUpKTsKKyAgICAgICAgIGluc3QtPmZvcmNlX3dyaXRlbWFza19hbGwgPSB0cnVlOworICAgICAgICAgc3JjX3JlZyBjaGFubmVsX21hc2sodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgICAgaW5zdCA9IGVtaXQoU0hMKGRzdF9yZWcoY2hhbm5lbF9tYXNrKSwgb25lLCBjaGFubmVsKSk7CisgICAgICAgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgICAgICAgIGVtaXQoR1NfT1BDT0RFX1BSRVBBUkVfQ0hBTk5FTF9NQVNLUywgZHN0X3JlZyhjaGFubmVsX21hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hc2spOworICAgICAgICAgZW1pdChHU19PUENPREVfU0VUX0NIQU5ORUxfTUFTS1MsIG1yZl9yZWcsIGNoYW5uZWxfbWFzayk7CisgICAgICB9CisKKyAgICAgIC8qIFN0b3JlIHRoZSBjb250cm9sIGRhdGEgYml0cyBpbiB0aGUgbWVzc2FnZSBwYXlsb2FkIGFuZCBzZW5kIGl0LiAqLworICAgICAgZHN0X3JlZyBtcmZfcmVnMihNUkYsIGJhc2VfbXJmICsgMSk7CisgICAgICBpbnN0ID0gZW1pdChNT1YobXJmX3JlZzIsIHRoaXMtPmNvbnRyb2xfZGF0YV9iaXRzKSk7CisgICAgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgICAgIGluc3QgPSBlbWl0KEdTX09QQ09ERV9VUkJfV1JJVEUpOworICAgICAgaW5zdC0+dXJiX3dyaXRlX2ZsYWdzID0gdXJiX3dyaXRlX2ZsYWdzOworICAgICAgLyogV2UgbmVlZCB0byBpbmNyZW1lbnQgR2xvYmFsIE9mZnNldCBieSAyNTYtYml0cyB0byBtYWtlIHJvb20gZm9yCisgICAgICAgKiBCcm9hZHdlbGwncyBleHRyYSAiVmVydGV4IENvdW50IiBwYXlsb2FkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICAgKiBVUkIgZW50cnkuICBTaW5jZSB0aGlzIGlzIGFuIE9Xb3JkIG1lc3NhZ2UsIEdsb2JhbCBPZmZzZXQgaXMgY291bnRlZAorICAgICAgICogaW4gMTI4LWJpdCB1bml0cywgc28gd2UgbXVzdCBzZXQgaXQgdG8gMi4KKyAgICAgICAqLworICAgICAgaWYgKGJydy0+Z2VuID49IDgpCisgICAgICAgICBpbnN0LT5vZmZzZXQgPSAyOworICAgICAgaW5zdC0+YmFzZV9tcmYgPSBiYXNlX21yZjsKKyAgICAgIGluc3QtPm1sZW4gPSAyOworICAgfQorICAgZW1pdChCUldfT1BDT0RFX0VORElGKTsKK30KKworCit2b2lkCit2ZWM0X2dzX3Zpc2l0b3I6OnZpc2l0KGlyX2VtaXRfdmVydGV4ICopCit7CisgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSAiZW1pdCB2ZXJ0ZXg6IHNhZmV0eSBjaGVjayI7CisKKyAgIC8qIFRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IG91dHB1dCBtb3JlIHZlcnRpY2VzIHRoYW4gdGhlIHNoYWRlciBzcGVjaWZpZWQKKyAgICAqIHVzaW5nIG1heF92ZXJ0aWNlcywgZG8gdGhlIGxvZ2ljIGluc2lkZSBhIGNvbmRpdGlvbmFsIG9mIHRoZSBmb3JtICJpZgorICAgICogKHZlcnRleF9jb3VudCA8IE1BWCkiCisgICAgKi8KKyAgIHVuc2lnbmVkIG51bV9vdXRwdXRfdmVydGljZXMgPSBjLT5ncC0+cHJvZ3JhbS5WZXJ0aWNlc091dDsKKyAgIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgdGhpcy0+dmVydGV4X2NvdW50LAorICAgICAgICAgICAgc3JjX3JlZyhudW1fb3V0cHV0X3ZlcnRpY2VzKSwgQlJXX0NPTkRJVElPTkFMX0wpKTsKKyAgIGVtaXQoSUYoQlJXX1BSRURJQ0FURV9OT1JNQUwpKTsKKyAgIHsKKyAgICAgIC8qIElmIHdlJ3JlIG91dHB1dHRpbmcgMzIgY29udHJvbCBkYXRhIGJpdHMgb3IgbGVzcywgdGhlbiB3ZSBjYW4gd2FpdAorICAgICAgICogdW50aWwgdGhlIHNoYWRlciBpcyBvdmVyIHRvIG91dHB1dCB0aGVtIGFsbC4gIE90aGVyd2lzZSB3ZSBuZWVkIHRvCisgICAgICAgKiBvdXRwdXQgdGhlbSBhcyB3ZSBnby4gIE5vdyBpcyB0aGUgdGltZSB0byBkbyBpdCwgc2luY2Ugd2UncmUgYWJvdXQgdG8KKyAgICAgICAqIG91dHB1dCB0aGUgdmVydGV4X2NvdW50J3RoIHZlcnRleCwgc28gaXQncyBndWFyYW50ZWVkIHRoYXQgdGhlCisgICAgICAgKiBjb250cm9sIGRhdGEgYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlICh2ZXJ0ZXhfY291bnQgLSAxKXRoIHZlcnRleCBhcmUKKyAgICAgICAqIGNvcnJlY3QuCisgICAgICAgKi8KKyAgICAgIGlmIChjLT5jb250cm9sX2RhdGFfaGVhZGVyX3NpemVfYml0cyA+IDMyKSB7CisgICAgICAgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSAiZW1pdCB2ZXJ0ZXg6IGVtaXQgY29udHJvbCBkYXRhIGJpdHMiOworICAgICAgICAgLyogT25seSBlbWl0IGNvbnRyb2wgZGF0YSBiaXRzIGlmIHdlJ3ZlIGZpbmlzaGVkIGFjY3VtdWxhdGluZyBhIGJhdGNoCisgICAgICAgICAgKiBvZiAzMiBiaXRzLiAgVGhpcyBpcyB0aGUgY2FzZSB3aGVuOgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgICAodmVydGV4X2NvdW50ICogYml0c19wZXJfdmVydGV4KSAlIDMyID09IDAKKyAgICAgICAgICAqCisgICAgICAgICAgKiAoaW4gb3RoZXIgd29yZHMsIHdoZW4gdGhlIGxhc3QgNSBiaXRzIG9mIHZlcnRleF9jb3VudCAqCisgICAgICAgICAgKiBiaXRzX3Blcl92ZXJ0ZXggYXJlIDApLiAgQXNzdW1pbmcgYml0c19wZXJfdmVydGV4ID09IDJebiBmb3Igc29tZQorICAgICAgICAgICogaW50ZWdlciBuICh3aGljaCBpcyBhbHdheXMgdGhlIGNhc2UsIHNpbmNlIGJpdHNfcGVyX3ZlcnRleCBpcworICAgICAgICAgICogYWx3YXlzIDEgb3IgMiksIHRoaXMgaXMgZXF1aXZhbGVudCB0byByZXF1aXJpbmcgdGhhdCB0aGUgbGFzdCA1LW4KKyAgICAgICAgICAqIGJpdHMgb2YgdmVydGV4X2NvdW50IGFyZSAwOgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgICB2ZXJ0ZXhfY291bnQgJiAoMl4oNS1uKSAtIDEpID09IDAKKyAgICAgICAgICAqCisgICAgICAgICAgKiAyXig1LW4pID09IDJeNSAvIDJebiA9PSAzMiAvIGJpdHNfcGVyX3ZlcnRleCwgc28gdGhpcyBpcworICAgICAgICAgICogZXF1aXZhbGVudCB0bzoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAgdmVydGV4X2NvdW50ICYgKDMyIC8gYml0c19wZXJfdmVydGV4IC0gMSkgPT0gMAorICAgICAgICAgICovCisgICAgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0KKyAgICAgICAgICAgIGVtaXQoQU5EKGRzdF9udWxsX2QoKSwgdGhpcy0+dmVydGV4X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSAoMzIgLyBjLT5jb250cm9sX2RhdGFfYml0c19wZXJfdmVydGV4IC0gMSkpKTsKKyAgICAgICAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IEJSV19DT05ESVRJT05BTF9aOworICAgICAgICAgZW1pdChJRihCUldfUFJFRElDQVRFX05PUk1BTCkpOworICAgICAgICAgeworICAgICAgICAgICAgZW1pdF9jb250cm9sX2RhdGFfYml0cygpOworCisgICAgICAgICAgICAvKiBSZXNldCBjb250cm9sX2RhdGFfYml0cyB0byAwIHNvIHdlIGNhbiBzdGFydCBhY2N1bXVsYXRpbmcgYSBuZXcKKyAgICAgICAgICAgICAqIGJhdGNoLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIE5vdGU6IGluIHRoZSBjYXNlIHdoZXJlIHZlcnRleF9jb3VudCA9PSAwLCB0aGlzIG5ldXRyYWxpemVzIHRoZQorICAgICAgICAgICAgICogZWZmZWN0IG9mIGFueSBjYWxsIHRvIEVuZFByaW1pdGl2ZSgpIHRoYXQgdGhlIHNoYWRlciBtYXkgaGF2ZQorICAgICAgICAgICAgICogbWFkZSBiZWZvcmUgb3V0cHV0dGluZyBpdHMgZmlyc3QgdmVydGV4LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnN0ID0gZW1pdChNT1YoZHN0X3JlZyh0aGlzLT5jb250cm9sX2RhdGFfYml0cyksIDB1KSk7CisgICAgICAgICAgICBpbnN0LT5mb3JjZV93cml0ZW1hc2tfYWxsID0gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVtaXQoQlJXX09QQ09ERV9FTkRJRik7CisgICAgICB9CisKKyAgICAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9ICJlbWl0IHZlcnRleDogdmVydGV4IGRhdGEiOworICAgICAgZW1pdF92ZXJ0ZXgoKTsKKworICAgICAgdGhpcy0+Y3VycmVudF9hbm5vdGF0aW9uID0gImVtaXQgdmVydGV4OiBpbmNyZW1lbnQgdmVydGV4IGNvdW50IjsKKyAgICAgIGVtaXQoQUREKGRzdF9yZWcodGhpcy0+dmVydGV4X2NvdW50KSwgdGhpcy0+dmVydGV4X2NvdW50LAorICAgICAgICAgICAgICAgc3JjX3JlZygxdSkpKTsKKyAgIH0KKyAgIGVtaXQoQlJXX09QQ09ERV9FTkRJRik7CisKKyAgIHRoaXMtPmN1cnJlbnRfYW5ub3RhdGlvbiA9IE5VTEw7Cit9CisKK3ZvaWQKK3ZlYzRfZ3NfdmlzaXRvcjo6dmlzaXQoaXJfZW5kX3ByaW1pdGl2ZSAqKQoreworICAgLyogV2UgY2FuIG9ubHkgZG8gRW5kUHJpbWl0aXZlKCkgZnVuY3Rpb25hbGl0eSB3aGVuIHRoZSBjb250cm9sIGRhdGEKKyAgICAqIGNvbnNpc3RzIG9mIGN1dCBiaXRzLiAgRm9ydHVuYXRlbHksIHRoZSBvbmx5IHRpbWUgaXQgaXNuJ3QgaXMgd2hlbiB0aGUKKyAgICAqIG91dHB1dCB0eXBlIGlzIHBvaW50cywgaW4gd2hpY2ggY2FzZSBFbmRQcmltaXRpdmUoKSBpcyBhIG5vLW9wLgorICAgICovCisgICBpZiAoYy0+cHJvZ19kYXRhLmNvbnRyb2xfZGF0YV9mb3JtYXQgIT0KKyAgICAgICBHRU43X0dTX0NPTlRST0xfREFUQV9GT1JNQVRfR1NDVExfQ1VUKSB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIEN1dCBiaXRzIHVzZSBvbmUgYml0IHBlciB2ZXJ0ZXguICovCisgICBhc3NlcnQoYy0+Y29udHJvbF9kYXRhX2JpdHNfcGVyX3ZlcnRleCA9PSAxKTsKKworICAgLyogQ3V0IGJpdCBuIHNob3VsZCBiZSBzZXQgdG8gMSBpZiBFbmRQcmltaXRpdmUoKSB3YXMgY2FsbGVkIGFmdGVyIGVtaXR0aW5nCisgICAgKiB2ZXJ0ZXggbiwgMCBvdGhlcndpc2UuICBTbyBhbGwgd2UgbmVlZCB0byBkbyBoZXJlIGlzIG1hcmsgYml0CisgICAgKiAodmVydGV4X2NvdW50IC0gMSkgJSAzMiBpbiB0aGUgY3V0X2JpdHMgcmVnaXN0ZXIgdG8gaW5kaWNhdGUgdGhhdAorICAgICogRW5kUHJpbWl0aXZlKCkgd2FzIGNhbGxlZCBhZnRlciBlbWl0dGluZyB2ZXJ0ZXggKHZlcnRleF9jb3VudCAtIDEpOworICAgICogdmVjNF9nc192aXNpdG9yOjplbWl0X2NvbnRyb2xfZGF0YV9iaXRzKCkgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QuCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIEVuZFByaW1pdHZlKCkgaXMgY2FsbGVkIGJlZm9yZSBlbWl0dGluZyBhbnkgdmVydGljZXMsIHRoaXMKKyAgICAqIHdpbGwgY2F1c2UgdXMgdG8gc2V0IGJpdCAzMSBvZiB0aGUgY29udHJvbF9kYXRhX2JpdHMgcmVnaXN0ZXIgdG8gMS4KKyAgICAqIFRoYXQncyBmaW5lIGJlY2F1c2U6CisgICAgKgorICAgICogLSBJZiBtYXhfdmVydGljZXMgPCAzMiwgdGhlbiB2ZXJ0ZXggbnVtYmVyIDMxICh6ZXJvLWJhc2VkKSB3aWxsIG5ldmVyIGJlCisgICAgKiAgIG91dHB1dCwgc28gdGhlIGhhcmR3YXJlIHdpbGwgaWdub3JlIGN1dCBiaXQgMzEuCisgICAgKgorICAgICogLSBJZiBtYXhfdmVydGljZXMgPT0gMzIsIHRoZW4gdmVydGV4IG51bWJlciAzMSBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZQorICAgICogICBsYXN0IHZlcnRleCwgc28gc2V0dGluZyBjdXQgYml0IDMxIGhhcyBubyBlZmZlY3QgKHNpbmNlIHRoZSBwcmltaXRpdmUKKyAgICAqICAgaXMgYXV0b21hdGljYWxseSBlbmRlZCB3aGVuIHRoZSBHUyB0ZXJtaW5hdGVzKS4KKyAgICAqCisgICAgKiAtIElmIG1heF92ZXJ0aWNlcyA+IDMyLCB0aGVuIHRoZSBpcl9lbWl0X3ZlcnRleCB2aXNpdG9yIHdpbGwgcmVzZXQgdGhlCisgICAgKiAgIGNvbnRyb2xfZGF0YV9iaXRzIHJlZ2lzdGVyIHRvIDAgd2hlbiB0aGUgZmlyc3QgdmVydGV4IGlzIGVtaXR0ZWQuCisgICAgKi8KKworICAgLyogY29udHJvbF9kYXRhX2JpdHMgfD0gMSA8PCAoKHZlcnRleF9jb3VudCAtIDEpICUgMzIpICovCisgICBzcmNfcmVnIG9uZSh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICBlbWl0KE1PVihkc3RfcmVnKG9uZSksIDF1KSk7CisgICBzcmNfcmVnIHByZXZfY291bnQodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgZW1pdChBREQoZHN0X3JlZyhwcmV2X2NvdW50KSwgdGhpcy0+dmVydGV4X2NvdW50LCAweGZmZmZmZmZmdSkpOworICAgc3JjX3JlZyBtYXNrKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgIC8qIE5vdGU6IHdlJ3JlIHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCB0aGUgR0VOIFNITCBpbnN0cnVjdGlvbiBvbmx5IHBheXMKKyAgICAqIGF0dGVudGlvbiB0byB0aGUgbG93ZXIgNSBiaXRzIG9mIGl0cyBzZWNvbmQgc291cmNlIGFyZ3VtZW50LCBzbyBvbiB0aGlzCisgICAgKiBhcmNoaXRlY3R1cmUsIDEgPDwgKHZlcnRleF9jb3VudCAtIDEpIGlzIGVxdWl2YWxlbnQgdG8gMSA8PAorICAgICogKCh2ZXJ0ZXhfY291bnQgLSAxKSAlIDMyKS4KKyAgICAqLworICAgZW1pdChTSEwoZHN0X3JlZyhtYXNrKSwgb25lLCBwcmV2X2NvdW50KSk7CisgICBlbWl0KE9SKGRzdF9yZWcodGhpcy0+Y29udHJvbF9kYXRhX2JpdHMpLCB0aGlzLT5jb250cm9sX2RhdGFfYml0cywgbWFzaykpOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgKgorZ2VuZXJhdGVfYXNzZW1ibHkoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nLAorICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19kYXRhICpwcm9nX2RhdGEsCisgICAgICAgICAgICAgICAgICB2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqZmluYWxfYXNzZW1ibHlfc2l6ZSkKK3sKKy8vICAgaWYgKGJydy0+Z2VuID49IDgpIHsKKy8vICAgICAgZ2VuOF92ZWM0X2dlbmVyYXRvciBnKGJydywgc2hhZGVyX3Byb2csIHByb2csIHByb2dfZGF0YSwgbWVtX2N0eCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVMX0RFQlVHICYgREVCVUdfR1MpOworLy8gICAgICByZXR1cm4gZy5nZW5lcmF0ZV9hc3NlbWJseShpbnN0cnVjdGlvbnMsIGZpbmFsX2Fzc2VtYmx5X3NpemUpOworLy8gICB9IGVsc2UgeworICAgICAgdmVjNF9nZW5lcmF0b3IgZyhicncsIHNoYWRlcl9wcm9nLCBwcm9nLCBwcm9nX2RhdGEsIG1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgIElOVEVMX0RFQlVHICYgREVCVUdfR1MpOworICAgICAgcmV0dXJuIGcuZ2VuZXJhdGVfYXNzZW1ibHkoaW5zdHJ1Y3Rpb25zLCBmaW5hbF9hc3NlbWJseV9zaXplKTsKKy8vICAgfQorfQorCitleHRlcm4gIkMiIGNvbnN0IHVuc2lnbmVkICoKK2Jyd19nc19lbWl0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgc3RydWN0IGJyd19nc19jb21waWxlICpjLAorICAgICAgICAgICAgdm9pZCAqbWVtX2N0eCwKKyAgICAgICAgICAgIHVuc2lnbmVkICpmaW5hbF9hc3NlbWJseV9zaXplKQoreworICAgaWYgKHVubGlrZWx5KElOVEVMX0RFQlVHICYgREVCVUdfR1MpKSB7CisgICAgICBzdHJ1Y3QgYnJ3X3NoYWRlciAqc2hhZGVyID0KKyAgICAgICAgIChicndfc2hhZGVyICopIHByb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0dFT01FVFJZXTsKKworICAgICAgYnJ3X2R1bXBfaXIoYnJ3LCAiZ2VvbWV0cnkiLCBwcm9nLCAmc2hhZGVyLT5iYXNlLCBOVUxMKTsKKyAgIH0KKworICAgLyogQ29tcGlsZSB0aGUgZ2VvbWV0cnkgc2hhZGVyIGluIERVQUxfT0JKRUNUIGRpc3BhdGNoIG1vZGUsIGlmIHdlIGNhbiBkbworICAgICogc28gd2l0aG91dCBzcGlsbGluZy4gSWYgdGhlIEdTIGludm9jYXRpb25zIGNvdW50ID4gMSwgdGhlbiB3ZSBjYW4ndCB1c2UKKyAgICAqIGR1YWwgb2JqZWN0IG1vZGUuCisgICAgKi8KKyAgIGlmIChjLT5wcm9nX2RhdGEuaW52b2NhdGlvbnMgPD0gMSAmJgorICAgICAgIGxpa2VseSghKElOVEVMX0RFQlVHICYgREVCVUdfTk9fRFVBTF9PQkpFQ1RfR1MpKSkgeworICAgICAgYy0+cHJvZ19kYXRhLmR1YWxfaW5zdGFuY2VkX2Rpc3BhdGNoID0gZmFsc2U7CisKKyAgICAgIHZlYzRfZ3NfdmlzaXRvciB2KGJydywgYywgcHJvZywgbWVtX2N0eCwgdHJ1ZSAvKiBub19zcGlsbHMgKi8pOworICAgICAgaWYgKHYucnVuKCkpIHsKKyAgICAgICAgIHJldHVybiBnZW5lcmF0ZV9hc3NlbWJseShicncsIHByb2csICZjLT5ncC0+cHJvZ3JhbS5CYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5wcm9nX2RhdGEuYmFzZSwgbWVtX2N0eCwgJnYuaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2Fzc2VtYmx5X3NpemUpOworICAgICAgfQorICAgfQorCisgICAvKiBFaXRoZXIgd2UgZmFpbGVkIHRvIGNvbXBpbGUgaW4gRFVBTF9PQkpFQ1QgbW9kZSAocHJvYmFibHkgYmVjYXVzZSBpdAorICAgICogd291bGQgaGF2ZSByZXF1aXJlZCBzcGlsbGluZykgb3IgRFVBTF9PQkpFQ1QgbW9kZSBpcyBkaXNhYmxlZC4gIFNvIGZhbGwKKyAgICAqIGJhY2sgdG8gRFVBTF9JTlNUQU5DRUQgbW9kZSwgd2hpY2ggY29uc3VtZXMgZmV3ZXIgcmVnaXN0ZXJzLgorICAgICoKKyAgICAqIEZJWE1FOiBJbiBhbiBpZGVhbCB3b3JsZCB3ZSdkIGZhbGwgYmFjayB0byBTSU5HTEUgbW9kZSwgd2hpY2ggd291bGQKKyAgICAqIGFsbG93IHVzIHRvIGludGVybGVhdmUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAocmVzdWx0aW5nIGluIGV2ZW4gbGVzcworICAgICogbGlrZWxpaG9vZCBvZiBzcGlsbGluZykuICBCdXQgYXQgdGhlIG1vbWVudCwgdGhlIHZlYzQgZ2VuZXJhdG9yIGFuZAorICAgICogdmlzaXRvciBjbGFzc2VzIGRvbid0IGhhdmUgdGhlIGluZnJhc3RydWN0dXJlIHRvIGludGVybGVhdmUgZ2VuZXJhbAorICAgICogcHVycG9zZSByZWdpc3RlcnMsIHNvIERVQUxfSU5TVEFOQ0VEIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4KKyAgICAqLworICAgYy0+cHJvZ19kYXRhLmR1YWxfaW5zdGFuY2VkX2Rpc3BhdGNoID0gdHJ1ZTsKKworICAgdmVjNF9nc192aXNpdG9yIHYoYnJ3LCBjLCBwcm9nLCBtZW1fY3R4LCBmYWxzZSAvKiBub19zcGlsbHMgKi8pOworICAgaWYgKCF2LnJ1bigpKSB7CisgICAgICBwcm9nLT5MaW5rU3RhdHVzID0gZmFsc2U7CisgICAgICByYWxsb2Nfc3RyY2F0KCZwcm9nLT5JbmZvTG9nLCB2LmZhaWxfbXNnKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gZ2VuZXJhdGVfYXNzZW1ibHkoYnJ3LCBwcm9nLCAmYy0+Z3AtPnByb2dyYW0uQmFzZSwgJmMtPnByb2dfZGF0YS5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV9jdHgsICZ2Lmluc3RydWN0aW9ucywgZmluYWxfYXNzZW1ibHlfc2l6ZSk7Cit9CisKKworfSAvKiBuYW1lc3BhY2UgYnJ3ICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfZ3NfdmlzaXRvci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2dzX3Zpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQxNWVhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2dzX3Zpc2l0b3IuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgYnJ3X3ZlYzRfZ3NfdmlzaXRvci5oCisgKgorICogR2VvbWV0cnktc2hhZGVyLXNwZWNpZmljIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSB2ZWM0X3Zpc2l0b3IgY2xhc3MuCisgKi8KKworI2lmbmRlZiBCUldfVkVDNF9HU19WSVNJVE9SX0gKKyNkZWZpbmUgQlJXX1ZFQzRfR1NfVklTSVRPUl9ICisKKyNpbmNsdWRlICJicndfdmVjNC5oIgorCisKK3N0cnVjdCBicndfZ3NfcHJvZ19rZXkKK3sKKyAgIHN0cnVjdCBicndfdmVjNF9wcm9nX2tleSBiYXNlOworCisgICBHTGJpdGZpZWxkNjQgaW5wdXRfdmFyeWluZ3M7Cit9OworCisKKy8qKgorICogU2NyYXRjaCBkYXRhIHVzZWQgd2hlbiBjb21waWxpbmcgYSBHTFNMIGdlb21ldHJ5IHNoYWRlci4KKyAqLworc3RydWN0IGJyd19nc19jb21waWxlCit7CisgICBzdHJ1Y3QgYnJ3X3ZlYzRfY29tcGlsZSBiYXNlOworICAgc3RydWN0IGJyd19nc19wcm9nX2tleSBrZXk7CisgICBzdHJ1Y3QgYnJ3X2dzX3Byb2dfZGF0YSBwcm9nX2RhdGE7CisgICBzdHJ1Y3QgYnJ3X3Z1ZV9tYXAgaW5wdXRfdnVlX21hcDsKKworICAgc3RydWN0IGJyd19nZW9tZXRyeV9wcm9ncmFtICpncDsKKworICAgdW5zaWduZWQgY29udHJvbF9kYXRhX2JpdHNfcGVyX3ZlcnRleDsKKyAgIHVuc2lnbmVkIGNvbnRyb2xfZGF0YV9oZWFkZXJfc2l6ZV9iaXRzOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitjb25zdCB1bnNpZ25lZCAqYnJ3X2dzX2VtaXQoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfZ3NfY29tcGlsZSAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpmaW5hbF9hc3NlbWJseV9zaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBicncgeworCitjbGFzcyB2ZWM0X2dzX3Zpc2l0b3IgOiBwdWJsaWMgdmVjNF92aXNpdG9yCit7CitwdWJsaWM6CisgICB2ZWM0X2dzX3Zpc2l0b3Ioc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19nc19jb21waWxlICpjLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICB2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgIGJvb2wgbm9fc3BpbGxzKTsKKworcHJvdGVjdGVkOgorICAgdmlydHVhbCBkc3RfcmVnICptYWtlX3JlZ19mb3Jfc3lzdGVtX3ZhbHVlKGlyX3ZhcmlhYmxlICppcik7CisgICB2aXJ0dWFsIHZvaWQgc2V0dXBfcGF5bG9hZCgpOworICAgdmlydHVhbCB2b2lkIGVtaXRfcHJvbG9nKCk7CisgICB2aXJ0dWFsIHZvaWQgZW1pdF9wcm9ncmFtX2NvZGUoKTsKKyAgIHZpcnR1YWwgdm9pZCBlbWl0X3RocmVhZF9lbmQoKTsKKyAgIHZpcnR1YWwgdm9pZCBlbWl0X3VyYl93cml0ZV9oZWFkZXIoaW50IG1yZik7CisgICB2aXJ0dWFsIHZlYzRfaW5zdHJ1Y3Rpb24gKmVtaXRfdXJiX3dyaXRlX29wY29kZShib29sIGNvbXBsZXRlKTsKKyAgIHZpcnR1YWwgaW50IGNvbXB1dGVfYXJyYXlfc3RyaWRlKGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZW1pdF92ZXJ0ZXggKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZW5kX3ByaW1pdGl2ZSAqKTsKKworcHJpdmF0ZToKKyAgIGludCBzZXR1cF92YXJ5aW5nX2lucHV0cyhpbnQgcGF5bG9hZF9yZWcsIGludCAqYXR0cmlidXRlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlc19wZXJfcmVnKTsKKyAgIHZvaWQgZW1pdF9jb250cm9sX2RhdGFfYml0cygpOworCisgICBzcmNfcmVnIHZlcnRleF9jb3VudDsKKyAgIHNyY19yZWcgY29udHJvbF9kYXRhX2JpdHM7CisgICBjb25zdCBzdHJ1Y3QgYnJ3X2dzX2NvbXBpbGUgKiBjb25zdCBjOworfTsKKworfSAvKiBuYW1lc3BhY2UgYnJ3ICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIEJSV19WRUM0X0dTX1ZJU0lUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X2xpdmVfdmFyaWFibGVzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9saXZlX3ZhcmlhYmxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5N2EyNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9saXZlX3ZhcmlhYmxlcy5jcHAKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqCisgKi8KKworI2luY2x1ZGUgImJyd19jZmcuaCIKKyNpbmNsdWRlICJicndfdmVjNF9saXZlX3ZhcmlhYmxlcy5oIgorCit1c2luZyBuYW1lc3BhY2UgYnJ3OworCisvKiogQGZpbGUgYnJ3X3ZlYzRfbGl2ZV92YXJpYWJsZXMuY3BwCisgKgorICogU3VwcG9ydCBmb3IgY29tcHV0aW5nIGF0IHRoZSBiYXNpYyBibG9jayBsZXZlbCB3aGljaCB2YXJpYWJsZXMKKyAqICh2aXJ0dWFsIEdSRnMgaW4gb3VyIGNhc2UpIGFyZSBsaXZlIGF0IGVudHJ5IGFuZCBleGl0LgorICoKKyAqIFNlZSBNdWNobmljaydzIEFkdmFuY2VkIENvbXBpbGVyIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24sIHNlY3Rpb24KKyAqIDE0LjEgKHA0NDQpLgorICovCisKKy8qKgorICogU2V0cyB1cCB0aGUgdXNlW10gYW5kIGRlZltdIGFycmF5cy4KKyAqCisgKiBUaGUgYmFzaWMtYmxvY2stbGV2ZWwgbGl2ZSB2YXJpYWJsZSBhbmFseXNpcyBuZWVkcyB0byBrbm93IHdoaWNoCisgKiB2YXJpYWJsZXMgZ2V0IHVzZWQgYmVmb3JlIHRoZXkncmUgY29tcGxldGVseSBkZWZpbmVkLCBhbmQgd2hpY2gKKyAqIHZhcmlhYmxlcyBhcmUgY29tcGxldGVseSBkZWZpbmVkIGJlZm9yZSB0aGV5J3JlIHVzZWQuCisgKgorICogV2UgaW5kZXBlbmRlbnRseSB0cmFjayBlYWNoIGNoYW5uZWwgb2YgYSB2ZWM0LiAgVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgdG8KKyAqIGJlIGFibGUgdG8gcmVjb2duaXplIGEgc2VxdWVuY2UgbGlrZToKKyAqCisgKiAuLi4KKyAqIERQNCB0bXAueCBhIGI7CisgKiBEUDQgdG1wLnkgYyBkOworICogTVVMIHJlc3VsdC54eSB0bXAueHkgZS54eQorICogLi4uCisgKgorICogYXMgaGF2aW5nIHRtcCBsaXZlIG9ubHkgYWNyb3NzIHRoYXQgc2VxdWVuY2UgKGFzc3VtaW5nIGl0J3MgdXNlZCBub3doZXJlCisgKiBlbHNlKSwgYmVjYXVzZSBpdCdzIGEgY29tbW9uIHBhdHRlcm4uICBBIG1vcmUgY29uc2VydmF0aXZlIGFwcHJvYWNoIHRoYXQKKyAqIGRvZXNuJ3QgZ2V0IHRtcCBtYXJrZWQgYSBkZWZmZWQgaW4gdGhpcyBibG9jayB3aWxsIHRlbmQgdG8gcmVzdWx0IGluCisgKiBzcGlsbGluZy4KKyAqLwordm9pZAordmVjNF9saXZlX3ZhcmlhYmxlczo6c2V0dXBfZGVmX3VzZSgpCit7CisgICBpbnQgaXAgPSAwOworCisgICBmb3IgKGludCBiID0gMDsgYiA8IGNmZy0+bnVtX2Jsb2NrczsgYisrKSB7CisgICAgICBiYmxvY2tfdCAqYmxvY2sgPSBjZmctPmJsb2Nrc1tiXTsKKworICAgICAgYXNzZXJ0KGlwID09IGJsb2NrLT5zdGFydF9pcCk7CisgICAgICBpZiAoYiA+IDApCisJIGFzc2VydChjZmctPmJsb2Nrc1tiIC0gMV0tPmVuZF9pcCA9PSBpcCAtIDEpOworCisgICAgICBmb3IgKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKWJsb2NrLT5zdGFydDsKKwkgICBpbnN0ICE9IGJsb2NrLT5lbmQtPm5leHQ7CisJICAgaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopaW5zdC0+bmV4dCkgeworCisJIC8qIFNldCB1c2VbXSBmb3IgdGhpcyBpbnN0cnVjdGlvbiAqLworCSBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCSAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gR1JGKSB7CisJICAgICAgIGludCByZWcgPSBpbnN0LT5zcmNbaV0ucmVnOworCisgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgICAgaW50IGMgPSBCUldfR0VUX1NXWihpbnN0LT5zcmNbaV0uc3dpenpsZSwgaik7CisgICAgICAgICAgICAgICAgICBpZiAoIUJJVFNFVF9URVNUKGJkW2JdLmRlZiwgcmVnICogNCArIGMpKQorICAgICAgICAgICAgICAgICAgICAgQklUU0VUX1NFVChiZFtiXS51c2UsIHJlZyAqIDQgKyBjKTsKKyAgICAgICAgICAgICAgIH0KKwkgICAgfQorCSB9CisKKwkgLyogQ2hlY2sgZm9yIHVuY29uZGl0aW9uYWwgd3JpdGVzIHRvIHdob2xlIHJlZ2lzdGVycy4gVGhlc2UKKwkgICogYXJlIHRoZSB0aGluZ3MgdGhhdCBzY3JlZW4gb2ZmIHByZWNlZGluZyBkZWZpbml0aW9ucyBvZiBhCisJICAqIHZhcmlhYmxlLCBhbmQgdGh1cyBxdWFsaWZ5IGZvciBiZWluZyBpbiBkZWZbXS4KKwkgICovCisJIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYgJiYKKwkgICAgIHYtPnZpcnR1YWxfZ3JmX3NpemVzW2luc3QtPmRzdC5yZWddID09IDEgJiYKKwkgICAgICFpbnN0LT5wcmVkaWNhdGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmICgxIDw8IGMpKSB7CisgICAgICAgICAgICAgICAgICBpbnQgcmVnID0gaW5zdC0+ZHN0LnJlZzsKKyAgICAgICAgICAgICAgICAgIGlmICghQklUU0VUX1RFU1QoYmRbYl0udXNlLCByZWcgKiA0ICsgYykpCisgICAgICAgICAgICAgICAgICAgICBCSVRTRVRfU0VUKGJkW2JdLmRlZiwgcmVnICogNCArIGMpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorCisJIGlwKys7CisgICAgICB9CisgICB9Cit9CisKKy8qKgorICogVGhlIGFsZ29yaXRobSBpbmNyZW1lbnRhbGx5IHNldHMgYml0cyBpbiBsaXZlb3V0IGFuZCBsaXZlaW4sCisgKiBwcm9wYWdhdGluZyBpdCB0aHJvdWdoIGNvbnRyb2wgZmxvdy4gIEl0IHdpbGwgZXZlbnR1YWxseSB0ZXJtaW5hdGUKKyAqIGJlY2F1c2UgaXQgb25seSBldmVyIGFkZHMgYml0cywgYW5kIHN0b3BzIHdoZW4gbm8gYml0cyBhcmUgYWRkZWQgaW4KKyAqIGEgcGFzcy4KKyAqLwordm9pZAordmVjNF9saXZlX3ZhcmlhYmxlczo6Y29tcHV0ZV9saXZlX3ZhcmlhYmxlcygpCit7CisgICBib29sIGNvbnQgPSB0cnVlOworCisgICB3aGlsZSAoY29udCkgeworICAgICAgY29udCA9IGZhbHNlOworCisgICAgICBmb3IgKGludCBiID0gMDsgYiA8IGNmZy0+bnVtX2Jsb2NrczsgYisrKSB7CisJIC8qIFVwZGF0ZSBsaXZlaW4gKi8KKwkgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzZXRfd29yZHM7IGkrKykgeworICAgICAgICAgICAgQklUU0VUX1dPUkQgbmV3X2xpdmVpbiA9IChiZFtiXS51c2VbaV0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmRbYl0ubGl2ZW91dFtpXSAmIH5iZFtiXS5kZWZbaV0pKTsKKyAgICAgICAgICAgIGlmIChuZXdfbGl2ZWluICYgfmJkW2JdLmxpdmVpbltpXSkgeworICAgICAgICAgICAgICAgYmRbYl0ubGl2ZWluW2ldIHw9IG5ld19saXZlaW47CisgICAgICAgICAgICAgICBjb250ID0gdHJ1ZTsKKwkgICAgfQorCSB9CisKKwkgLyogVXBkYXRlIGxpdmVvdXQgKi8KKwkgZm9yZWFjaF9saXN0KGJsb2NrX25vZGUsICZjZmctPmJsb2Nrc1tiXS0+Y2hpbGRyZW4pIHsKKwkgICAgYmJsb2NrX2xpbmsgKmxpbmsgPSAoYmJsb2NrX2xpbmsgKilibG9ja19ub2RlOworCSAgICBiYmxvY2tfdCAqYmxvY2sgPSBsaW5rLT5ibG9jazsKKworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpdHNldF93b3JkczsgaSsrKSB7CisgICAgICAgICAgICAgICBCSVRTRVRfV09SRCBuZXdfbGl2ZW91dCA9IChiZFtibG9jay0+YmxvY2tfbnVtXS5saXZlaW5baV0gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfmJkW2JdLmxpdmVvdXRbaV0pOworICAgICAgICAgICAgICAgaWYgKG5ld19saXZlb3V0KSB7CisgICAgICAgICAgICAgICAgICBiZFtiXS5saXZlb3V0W2ldIHw9IG5ld19saXZlb3V0OworCQkgIGNvbnQgPSB0cnVlOworCSAgICAgICB9CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQorfQorCit2ZWM0X2xpdmVfdmFyaWFibGVzOjp2ZWM0X2xpdmVfdmFyaWFibGVzKHZlYzRfdmlzaXRvciAqdiwgY2ZnX3QgKmNmZykKKyAgIDogdih2KSwgY2ZnKGNmZykKK3sKKyAgIG1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKworICAgLy8gVGhpcyBpcyBhbiBlbWVyZ2VuY3kgaGFjayB0byB3b3JrIGFyb3VuZCBhIGRlZmVjdCBJIGRvbid0IGhhdmUgdGltZSB0bworICAgLy8gZmlndXJlIG91dCB0aGUgY2F1c2Ugb2YuCisgICBudW1fdmFycyA9IHYtPnZpcnR1YWxfZ3JmX2NvdW50ICogNDsKKyAgIGJkID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBzdHJ1Y3QgYmxvY2tfZGF0YSwgY2ZnLT5udW1fYmxvY2tzKTsKKyAgIGJsb2NrcyA9IGNmZy0+bnVtX2Jsb2NrczsKKworICAgYml0c2V0X3dvcmRzID0gQklUU0VUX1dPUkRTKG51bV92YXJzKTsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2ZnLT5udW1fYmxvY2tzOyBpKyspIHsKKyAgICAgIGJkW2ldLmRlZiA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgQklUU0VUX1dPUkQsIGJpdHNldF93b3Jkcyk7CisgICAgICBiZFtpXS51c2UgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIEJJVFNFVF9XT1JELCBiaXRzZXRfd29yZHMpOworICAgICAgYmRbaV0ubGl2ZWluID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBCSVRTRVRfV09SRCwgYml0c2V0X3dvcmRzKTsKKyAgICAgIGJkW2ldLmxpdmVvdXQgPSByemFsbG9jX2FycmF5KG1lbV9jdHgsIEJJVFNFVF9XT1JELCBiaXRzZXRfd29yZHMpOworICAgfQorCisgICBzZXR1cF9kZWZfdXNlKCk7CisgICBjb21wdXRlX2xpdmVfdmFyaWFibGVzKCk7Cit9CisKK3ZlYzRfbGl2ZV92YXJpYWJsZXM6On52ZWM0X2xpdmVfdmFyaWFibGVzKCkKK3sKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworfQorCisjZGVmaW5lIE1BWF9JTlNUUlVDVElPTiAoMSA8PCAzMCkKKworLyoqCisgKiBDb21wdXRlcyBhIGNvbnNlcnZhdGl2ZSBzdGFydC9lbmQgb2YgdGhlIGxpdmUgaW50ZXJ2YWxzIGZvciBlYWNoIHZpcnR1YWwgR1JGLgorICoKKyAqIFdlIGNvdWxkIGV4cG9zZSBwZXItY2hhbm5lbCBsaXZlIGludGVydmFscyB0byB0aGUgY29uc3VtZXIgYmFzZWQgb24gdGhlCisgKiBpbmZvcm1hdGlvbiB3ZSBjb21wdXRlZCBpbiB2ZWM0X2xpdmVfdmFyaWFibGVzLCBleGNlcHQgdGhhdCBvdXIgb25seQorICogY3VycmVudCB1c2VyIGlzIHZpcnR1YWxfZ3JmX2ludGVyZmVyZXMoKS4gIFNvIHdlIGluc3RlYWQgdW5pb24gdGhlCisgKiBwZXItY2hhbm5lbCByYW5nZXMgaW50byBhIHBlci12Z3JmIHJhbmdlIGZvciB2aXJ0dWFsX2dyZl9zdGFydFtdIGFuZAorICogdmlydHVhbF9ncmZfZW5kW10uCisgKgorICogV2UgY291bGQgcG90ZW50aWFsbHkgaGF2ZSB2aXJ0dWFsX2dyZl9pbnRlcmZlcmVzKCkgZG8gdGhlIHRlc3QgcGVyLWNoYW5uZWwsCisgKiB3aGljaCB3b3VsZCBsZXQgc29tZSBpbnRlcmVzdGluZyByZWdpc3RlciBhbGxvY2F0aW9uIG9jY3VyIChwYXJ0aWN1bGFybHkgb24KKyAqIGNvZGUtZ2VuZXJhdGVkIEdMU0wgc2VxdWVuY2VzIGZyb20gdGhlIENnIGNvbXBpbGVyIHdoaWNoIGRvZXMgcmVnaXN0ZXIKKyAqIGFsbG9jYXRpb24gYXQgdGhlIEdMU0wgbGV2ZWwgYW5kIHRodXMgcmV1c2VzIGNvbXBvbmVudHMgb2YgdGhlIHZhcmlhYmxlCisgKiB3aXRoIGRpc3RpbmN0IGxpZmV0aW1lcykuICBCdXQgcmlnaHQgbm93IHRoZSBjb21wbGV4aXR5IG9mIGRvaW5nIHNvIGRvZXNuJ3QKKyAqIHNlZW0gd29ydGggaXQsIHNpbmNlIGhhdmluZyB2aXJ0dWFsX2dyZl9pbnRlcmZlcmVzKCkgYmUgY2hlYXAgaXMgaW1wb3J0YW50CisgKiBmb3IgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwZXJmb3JtYW5jZS4KKyAqLwordm9pZAordmVjNF92aXNpdG9yOjpjYWxjdWxhdGVfbGl2ZV9pbnRlcnZhbHMoKQoreworICAgaWYgKHRoaXMtPmxpdmVfaW50ZXJ2YWxzKQorICAgICAgcmV0dXJuOworCisgICBpbnQgKnN0YXJ0ID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgdGhpcy0+dmlydHVhbF9ncmZfY291bnQgKiA0KTsKKyAgIGludCAqZW5kID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsIGludCwgdGhpcy0+dmlydHVhbF9ncmZfY291bnQgKiA0KTsKKyAgIHJhbGxvY19mcmVlKHRoaXMtPnZpcnR1YWxfZ3JmX3N0YXJ0KTsKKyAgIHJhbGxvY19mcmVlKHRoaXMtPnZpcnR1YWxfZ3JmX2VuZCk7CisgICB0aGlzLT52aXJ0dWFsX2dyZl9zdGFydCA9IHN0YXJ0OworICAgdGhpcy0+dmlydHVhbF9ncmZfZW5kID0gZW5kOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50ICogNDsgaSsrKSB7CisgICAgICBzdGFydFtpXSA9IE1BWF9JTlNUUlVDVElPTjsKKyAgICAgIGVuZFtpXSA9IC0xOworICAgfQorCisgICAvKiBTdGFydCBieSBzZXR0aW5nIHVwIHRoZSBpbnRlcnZhbHMgd2l0aCBubyBrbm93bGVkZ2Ugb2YgY29udHJvbAorICAgICogZmxvdy4KKyAgICAqLworICAgaW50IGlwID0gMDsKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKilub2RlOworCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDM7IGkrKykgeworCSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gR1JGKSB7CisJICAgIGludCByZWcgPSBpbnN0LT5zcmNbaV0ucmVnOworCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgICAgaW50IGMgPSBCUldfR0VUX1NXWihpbnN0LT5zcmNbaV0uc3dpenpsZSwgaik7CisKKyAgICAgICAgICAgICAgIHN0YXJ0W3JlZyAqIDQgKyBjXSA9IE1JTjIoc3RhcnRbcmVnICogNCArIGNdLCBpcCk7CisgICAgICAgICAgICAgICBlbmRbcmVnICogNCArIGNdID0gaXA7CisgICAgICAgICAgICB9CisJIH0KKyAgICAgIH0KKworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikgeworICAgICAgICAgaW50IHJlZyA9IGluc3QtPmRzdC5yZWc7CisKKyAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+ZHN0LndyaXRlbWFzayAmICgxIDw8IGMpKSB7CisgICAgICAgICAgICAgICBzdGFydFtyZWcgKiA0ICsgY10gPSBNSU4yKHN0YXJ0W3JlZyAqIDQgKyBjXSwgaXApOworICAgICAgICAgICAgICAgZW5kW3JlZyAqIDQgKyBjXSA9IGlwOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpcCsrOworICAgfQorCisgICAvKiBOb3csIGV4dGVuZCB0aG9zZSBpbnRlcnZhbHMgdXNpbmcgb3VyIGFuYWx5c2lzIG9mIGNvbnRyb2wgZmxvdy4KKyAgICAqCisgICAgKiBUaGUgY29udHJvbCBmbG93LWF3YXJlIGFuYWx5c2lzIHdhcyBkb25lIGF0IGEgY2hhbm5lbCBsZXZlbCwgd2hpbGUgYXQKKyAgICAqIHRoaXMgcG9pbnQgd2UncmUgZGlzdGlsbGluZyBpdCBkb3duIHRvIHZncmZzLgorICAgICovCisgICBjZmdfdCBjZmcoJmluc3RydWN0aW9ucyk7CisgICB0aGlzLT5saXZlX2ludGVydmFscyA9IG5ldyhtZW1fY3R4KSB2ZWM0X2xpdmVfdmFyaWFibGVzKHRoaXMsICZjZmcpOworCisKKyAgIGZvciAoaW50IGIgPSAwOyBiIDwgY2ZnLm51bV9ibG9ja3M7IGIrKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXZlX2ludGVydmFscy0+bnVtX3ZhcnM7IGkrKykgeworCSBpZiAoQklUU0VUX1RFU1QobGl2ZV9pbnRlcnZhbHMtPmJkW2JdLmxpdmVpbiwgaSkpIHsKKwkgICAgc3RhcnRbaV0gPSBNSU4yKHN0YXJ0W2ldLCBjZmcuYmxvY2tzW2JdLT5zdGFydF9pcCk7CisJICAgIGVuZFtpXSA9IE1BWDIoZW5kW2ldLCBjZmcuYmxvY2tzW2JdLT5zdGFydF9pcCk7CisJIH0KKworCSBpZiAoQklUU0VUX1RFU1QobGl2ZV9pbnRlcnZhbHMtPmJkW2JdLmxpdmVvdXQsIGkpKSB7CisJICAgIHN0YXJ0W2ldID0gTUlOMihzdGFydFtpXSwgY2ZnLmJsb2Nrc1tiXS0+ZW5kX2lwKTsKKwkgICAgZW5kW2ldID0gTUFYMihlbmRbaV0sIGNmZy5ibG9ja3NbYl0tPmVuZF9pcCk7CisJIH0KKyAgICAgIH0KKyAgIH0KK30KKwordm9pZAordmVjNF92aXNpdG9yOjppbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCkKK3sKKyAgIHJhbGxvY19mcmVlKGxpdmVfaW50ZXJ2YWxzKTsKKyAgIGxpdmVfaW50ZXJ2YWxzID0gTlVMTDsKK30KKworYm9vbAordmVjNF92aXNpdG9yOjp2aXJ0dWFsX2dyZl9pbnRlcmZlcmVzKGludCBhLCBpbnQgYikKK3sKKyAgIGludCBzdGFydF9hID0gTUlOMihNSU4yKHZpcnR1YWxfZ3JmX3N0YXJ0W2EgKiA0ICsgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX2dyZl9zdGFydFthICogNCArIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgICBNSU4yKHZpcnR1YWxfZ3JmX3N0YXJ0W2EgKiA0ICsgMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX2dyZl9zdGFydFthICogNCArIDNdKSk7CisgICBpbnQgc3RhcnRfYiA9IE1JTjIoTUlOMih2aXJ0dWFsX2dyZl9zdGFydFtiICogNCArIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbF9ncmZfc3RhcnRbYiAqIDQgKyAxXSksCisgICAgICAgICAgICAgICAgICAgICAgTUlOMih2aXJ0dWFsX2dyZl9zdGFydFtiICogNCArIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbF9ncmZfc3RhcnRbYiAqIDQgKyAzXSkpOworICAgaW50IGVuZF9hID0gTUFYMihNQVgyKHZpcnR1YWxfZ3JmX2VuZFthICogNCArIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWxfZ3JmX2VuZFthICogNCArIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgTUFYMih2aXJ0dWFsX2dyZl9lbmRbYSAqIDQgKyAyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX2dyZl9lbmRbYSAqIDQgKyAzXSkpOworICAgaW50IGVuZF9iID0gTUFYMihNQVgyKHZpcnR1YWxfZ3JmX2VuZFtiICogNCArIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWxfZ3JmX2VuZFtiICogNCArIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgTUFYMih2aXJ0dWFsX2dyZl9lbmRbYiAqIDQgKyAyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX2dyZl9lbmRbYiAqIDQgKyAzXSkpOworICAgcmV0dXJuICEoZW5kX2EgPD0gc3RhcnRfYiB8fAorICAgICAgICAgICAgZW5kX2IgPD0gc3RhcnRfYSk7Cit9CisKK2ludAordmVjNF92aXNpdG9yOjpsaXZlX291dF9jb3VudChpbnQgYmxvY2tfbnVtKSBjb25zdAoreworICAgaW50IGNvdW50ID0gMDsKKworICAgYXNzZXJ0KHRoaXMtPmxpdmVfaW50ZXJ2YWxzKTsKKyAgIGFzc2VydCh0aGlzLT5saXZlX2ludGVydmFscy0+YmQpOworICAgYXNzZXJ0KGJsb2NrX251bSA8IHRoaXMtPmxpdmVfaW50ZXJ2YWxzLT5ibG9ja3MpOworCisgICAvKiBDb3VudCBudW1iZXIgb2YgbGl2ZSBvdXRzIGZvciBlYWNoIGJsb2NrICovCisgICBmb3IgKGludCBpPTA7IGk8dGhpcy0+bGl2ZV9pbnRlcnZhbHMtPmJpdHNldF93b3JkczsgKytpKQorICAgICAgY291bnQgKz0gX21lc2FfYml0Y291bnQodGhpcy0+bGl2ZV9pbnRlcnZhbHMtPmJkW2Jsb2NrX251bV0ubGl2ZW91dFtpXSk7CisKKyAgIHJldHVybiBjb3VudDsKK30KKworaW50Cit2ZWM0X3Zpc2l0b3I6OmxpdmVfaW5fY291bnQoaW50IGJsb2NrX251bSkgY29uc3QKK3sKKyAgIGludCBjb3VudCA9IDA7CisKKyAgIGFzc2VydCh0aGlzLT5saXZlX2ludGVydmFscyk7CisgICBhc3NlcnQodGhpcy0+bGl2ZV9pbnRlcnZhbHMtPmJkKTsKKyAgIGFzc2VydChibG9ja19udW0gPCB0aGlzLT5saXZlX2ludGVydmFscy0+YmxvY2tzKTsKKworICAgLyogQ291bnQgbnVtYmVyIG9mIGxpdmUgaW5zIGZvciBlYWNoIGJsb2NrICovCisgICBmb3IgKGludCBpPTA7IGk8dGhpcy0+bGl2ZV9pbnRlcnZhbHMtPmJpdHNldF93b3JkczsgKytpKQorICAgICAgY291bnQgKz0gX21lc2FfYml0Y291bnQodGhpcy0+bGl2ZV9pbnRlcnZhbHMtPmJkW2Jsb2NrX251bV0ubGl2ZWluW2ldKTsKKworICAgcmV0dXJuIGNvdW50OworfQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfbGl2ZV92YXJpYWJsZXMuaCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9saXZlX3ZhcmlhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTNkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfbGl2ZV92YXJpYWJsZXMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKyNpbmNsdWRlICJtYWluL2JpdHNldC5oIgorI2luY2x1ZGUgImJyd192ZWM0LmgiCisKK25hbWVzcGFjZSBicncgeworCitzdHJ1Y3QgYmxvY2tfZGF0YSB7CisgICAvKioKKyAgICAqIFdoaWNoIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBiZWZvcmUgYmVpbmcgdXNlZCBpbiB0aGUgYmxvY2suCisgICAgKgorICAgICogTm90ZSB0aGF0IGZvciBvdXIgcHVycG9zZXMsICJkZWZpbmVkIiBtZWFucyB1bmNvbmRpdGlvbmFsbHksIGNvbXBsZXRlbHkKKyAgICAqIGRlZmluZWQuCisgICAgKi8KKyAgIEJJVFNFVF9XT1JEICpkZWY7CisKKyAgIC8qKgorICAgICogV2hpY2ggdmFyaWFibGVzIGFyZSB1c2VkIGJlZm9yZSBiZWluZyBkZWZpbmVkIGluIHRoZSBibG9jay4KKyAgICAqLworICAgQklUU0VUX1dPUkQgKnVzZTsKKworICAgLyoqIFdoaWNoIGRlZnMgcmVhY2ggdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBibG9jay4gKi8KKyAgIEJJVFNFVF9XT1JEICpsaXZlaW47CisKKyAgIC8qKiBXaGljaCBkZWZzIHJlYWNoIHRoZSBleGl0IHBvaW50IG9mIHRoZSBibG9jay4gKi8KKyAgIEJJVFNFVF9XT1JEICpsaXZlb3V0OworfTsKKworY2xhc3MgdmVjNF9saXZlX3ZhcmlhYmxlcyB7CitwdWJsaWM6CisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKHZlYzRfbGl2ZV92YXJpYWJsZXMpCisKKyAgIHZlYzRfbGl2ZV92YXJpYWJsZXModmVjNF92aXNpdG9yICp2LCBjZmdfdCAqY2ZnKTsKKyAgIH52ZWM0X2xpdmVfdmFyaWFibGVzKCk7CisKKyAgIHZvaWQgc2V0dXBfZGVmX3VzZSgpOworICAgdm9pZCBjb21wdXRlX2xpdmVfdmFyaWFibGVzKCk7CisKKyAgIHZlYzRfdmlzaXRvciAqdjsKKyAgIGNmZ190ICpjZmc7CisgICB2b2lkICptZW1fY3R4OworCisgICBpbnQgbnVtX3ZhcnM7CisgICBpbnQgYml0c2V0X3dvcmRzOworICAgaW50IGJsb2NrczsKKworICAgLyoqIFBlci1iYXNpYy1ibG9jayBpbmZvcm1hdGlvbiBvbiBsaXZlIHZhcmlhYmxlcyAqLworICAgc3RydWN0IGJsb2NrX2RhdGEgKmJkOworfTsKKworfSAvKiBuYW1lc3BhY2UgYnJ3ICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfcmVnX2FsbG9jYXRlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF9yZWdfYWxsb2NhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWMwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfcmVnX2FsbG9jYXRlLmNwcApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDExIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9yZWdpc3Rlcl9hbGxvY2F0ZS5oIgorfSAvKiBleHRlcm4gIkMiICovCisKKyNpbmNsdWRlICJicndfdmVjNC5oIgorI2luY2x1ZGUgImJyd192cy5oIgorCit1c2luZyBuYW1lc3BhY2UgYnJ3OworCituYW1lc3BhY2UgYnJ3IHsKKworc3RhdGljIHZvaWQKK2Fzc2lnbih1bnNpZ25lZCBpbnQgKnJlZ19od19sb2NhdGlvbnMsIHJlZyAqcmVnKQoreworICAgaWYgKHJlZy0+ZmlsZSA9PSBHUkYpIHsKKyAgICAgIHJlZy0+cmVnID0gcmVnX2h3X2xvY2F0aW9uc1tyZWctPnJlZ107CisgICB9Cit9CisKK2Jvb2wKK3ZlYzRfdmlzaXRvcjo6cmVnX2FsbG9jYXRlX3RyaXZpYWwoKQoreworICAgdW5zaWduZWQgaW50IGh3X3JlZ19tYXBwaW5nW3RoaXMtPnZpcnR1YWxfZ3JmX2NvdW50XTsKKyAgIGJvb2wgdmlydHVhbF9ncmZfdXNlZFt0aGlzLT52aXJ0dWFsX2dyZl9jb3VudF07CisgICBpbnQgaTsKKyAgIGludCBuZXh0OworCisgICAvKiBDYWxjdWxhdGUgd2hpY2ggdmlydHVhbCBHUkZzIGFyZSBhY3R1YWxseSBpbiB1c2UgYWZ0ZXIgd2hhdGV2ZXIKKyAgICAqIG9wdGltaXphdGlvbiBwYXNzZXMgaGF2ZSBvY2N1cnJlZC4KKyAgICAqLworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52aXJ0dWFsX2dyZl9jb3VudDsgaSsrKSB7CisgICAgICB2aXJ0dWFsX2dyZl91c2VkW2ldID0gZmFsc2U7CisgICB9CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKikgbm9kZTsKKworICAgICAgaWYgKGluc3QtPmRzdC5maWxlID09IEdSRikKKwkgdmlydHVhbF9ncmZfdXNlZFtpbnN0LT5kc3QucmVnXSA9IHRydWU7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYpCisJICAgIHZpcnR1YWxfZ3JmX3VzZWRbaW5zdC0+c3JjW2ldLnJlZ10gPSB0cnVlOworICAgICAgfQorICAgfQorCisgICBod19yZWdfbWFwcGluZ1swXSA9IHRoaXMtPmZpcnN0X25vbl9wYXlsb2FkX2dyZjsKKyAgIG5leHQgPSBod19yZWdfbWFwcGluZ1swXSArIHRoaXMtPnZpcnR1YWxfZ3JmX3NpemVzWzBdOworICAgZm9yIChpID0gMTsgaSA8IHRoaXMtPnZpcnR1YWxfZ3JmX2NvdW50OyBpKyspIHsKKyAgICAgIGlmICh2aXJ0dWFsX2dyZl91c2VkW2ldKSB7CisJIGh3X3JlZ19tYXBwaW5nW2ldID0gbmV4dDsKKwkgbmV4dCArPSB0aGlzLT52aXJ0dWFsX2dyZl9zaXplc1tpXTsKKyAgICAgIH0KKyAgIH0KKyAgIHByb2dfZGF0YS0+dG90YWxfZ3JmID0gbmV4dDsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKSBub2RlOworCisgICAgICBhc3NpZ24oaHdfcmVnX21hcHBpbmcsICZpbnN0LT5kc3QpOworICAgICAgYXNzaWduKGh3X3JlZ19tYXBwaW5nLCAmaW5zdC0+c3JjWzBdKTsKKyAgICAgIGFzc2lnbihod19yZWdfbWFwcGluZywgJmluc3QtPnNyY1sxXSk7CisgICAgICBhc3NpZ24oaHdfcmVnX21hcHBpbmcsICZpbnN0LT5zcmNbMl0pOworICAgfQorCisgICBpZiAocHJvZ19kYXRhLT50b3RhbF9ncmYgPiBtYXhfZ3JmKSB7CisgICAgICBmYWlsKCJSYW4gb3V0IG9mIHJlZ3Mgb24gdHJpdmlhbCBhbGxvY2F0b3IgKCVkLyVkKVxuIiwKKwkgICBwcm9nX2RhdGEtPnRvdGFsX2dyZiwgbWF4X2dyZik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIHZvaWQKK2Jyd192ZWM0X2FsbG9jX3JlZ19zZXQoc3RydWN0IGludGVsX3NjcmVlbiAqc2NyZWVuKQoreworICAgaW50IGJhc2VfcmVnX2NvdW50ID0KKyAgICAgIHNjcmVlbi0+ZGV2aW5mby0+Z2VuID49IDcgPyBHRU43X01SRl9IQUNLX1NUQVJUIDogQlJXX01BWF9HUkY7CisKKyAgIC8qIEFmdGVyIHJ1bm5pbmcgc3BsaXRfdmlydHVhbF9ncmZzKCksIGFsbW9zdCBhbGwgVkdSRnMgd2lsbCBiZSBvZiBzaXplIDEuCisgICAgKiBTRU5ELWZyb20tR1JGIHNvdXJjZXMgY2Fubm90IGJlIHNwbGl0LCBzbyB3ZSBhbHNvIG5lZWQgY2xhc3NlcyBmb3IgZWFjaAorICAgICogcG90ZW50aWFsIG1lc3NhZ2UgbGVuZ3RoLgorICAgICovCisgICBjb25zdCBpbnQgY2xhc3NfY291bnQgPSAyOworICAgY29uc3QgaW50IGNsYXNzX3NpemVzW2NsYXNzX2NvdW50XSA9IHsxLCAyfTsKKworICAgLyogQ29tcHV0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZ2lzdGVycyBhY3Jvc3MgYWxsIGNsYXNzZXMuICovCisgICBpbnQgcmFfcmVnX2NvdW50ID0gMDsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NfY291bnQ7IGkrKykgeworICAgICAgcmFfcmVnX2NvdW50ICs9IGJhc2VfcmVnX2NvdW50IC0gKGNsYXNzX3NpemVzW2ldIC0gMSk7CisgICB9CisKKyAgIHJhbGxvY19mcmVlKHNjcmVlbi0+dmVjNF9yZWdfc2V0LnJhX3JlZ190b19ncmYpOworICAgc2NyZWVuLT52ZWM0X3JlZ19zZXQucmFfcmVnX3RvX2dyZiA9IHJhbGxvY19hcnJheShzY3JlZW4sIHVpbnQ4X3QsIHJhX3JlZ19jb3VudCk7CisgICByYWxsb2NfZnJlZShzY3JlZW4tPnZlYzRfcmVnX3NldC5yZWdzKTsKKyAgIHNjcmVlbi0+dmVjNF9yZWdfc2V0LnJlZ3MgPSByYV9hbGxvY19yZWdfc2V0KHNjcmVlbiwgcmFfcmVnX2NvdW50KTsKKyAgIGlmIChzY3JlZW4tPmRldmluZm8tPmdlbiA+PSA2KQorICAgICAgcmFfc2V0X2FsbG9jYXRlX3JvdW5kX3JvYmluKHNjcmVlbi0+dmVjNF9yZWdfc2V0LnJlZ3MpOworICAgcmFsbG9jX2ZyZWUoc2NyZWVuLT52ZWM0X3JlZ19zZXQuY2xhc3Nlcyk7CisgICBzY3JlZW4tPnZlYzRfcmVnX3NldC5jbGFzc2VzID0gcmFsbG9jX2FycmF5KHNjcmVlbiwgaW50LCBjbGFzc19jb3VudCk7CisKKyAgIC8qIE5vdywgYWRkIHRoZSByZWdpc3RlcnMgdG8gdGhlaXIgY2xhc3NlcywgYW5kIGFkZCB0aGUgY29uZmxpY3RzCisgICAgKiBiZXR3ZWVuIHRoZW0gYW5kIHRoZSBiYXNlIEdSRiByZWdpc3RlcnMgKGFuZCBhbHNvIGVhY2ggb3RoZXIpLgorICAgICovCisgICBpbnQgcmVnID0gMDsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NfY291bnQ7IGkrKykgeworICAgICAgaW50IGNsYXNzX3JlZ19jb3VudCA9IGJhc2VfcmVnX2NvdW50IC0gKGNsYXNzX3NpemVzW2ldIC0gMSk7CisgICAgICBzY3JlZW4tPnZlYzRfcmVnX3NldC5jbGFzc2VzW2ldID0gcmFfYWxsb2NfcmVnX2NsYXNzKHNjcmVlbi0+dmVjNF9yZWdfc2V0LnJlZ3MpOworCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzX3JlZ19jb3VudDsgaisrKSB7CisJIHJhX2NsYXNzX2FkZF9yZWcoc2NyZWVuLT52ZWM0X3JlZ19zZXQucmVncywgc2NyZWVuLT52ZWM0X3JlZ19zZXQuY2xhc3Nlc1tpXSwgcmVnKTsKKworCSBzY3JlZW4tPnZlYzRfcmVnX3NldC5yYV9yZWdfdG9fZ3JmW3JlZ10gPSBqOworCisJIGZvciAoaW50IGJhc2VfcmVnID0gajsKKwkgICAgICBiYXNlX3JlZyA8IGogKyBjbGFzc19zaXplc1tpXTsKKwkgICAgICBiYXNlX3JlZysrKSB7CisJICAgIHJhX2FkZF90cmFuc2l0aXZlX3JlZ19jb25mbGljdChzY3JlZW4tPnZlYzRfcmVnX3NldC5yZWdzLCBiYXNlX3JlZywgcmVnKTsKKwkgfQorCisJIHJlZysrOworICAgICAgfQorICAgfQorICAgYXNzZXJ0KHJlZyA9PSByYV9yZWdfY291bnQpOworCisgICByYV9zZXRfZmluYWxpemUoc2NyZWVuLT52ZWM0X3JlZ19zZXQucmVncywgTlVMTCk7Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6c2V0dXBfcGF5bG9hZF9pbnRlcmZlcmVuY2Uoc3RydWN0IHJhX2dyYXBoICpnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RfcGF5bG9hZF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnX25vZGVfY291bnQpCit7CisgICBpbnQgcGF5bG9hZF9ub2RlX2NvdW50ID0gdGhpcy0+Zmlyc3Rfbm9uX3BheWxvYWRfZ3JmOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IHBheWxvYWRfbm9kZV9jb3VudDsgaSsrKSB7CisgICAgICAvKiBNYXJrIGVhY2ggcGF5bG9hZCByZWcgbm9kZSBhcyBiZWluZyBhbGxvY2F0ZWQgdG8gaXRzIHBoeXNpY2FsIHJlZ2lzdGVyLgorICAgICAgICoKKyAgICAgICAqIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBoYXZlIHBlci1waHlzaWNhbCByZWdpc3RlciBjbGFzc2VzLCB3aGljaAorICAgICAgICogd291bGQganVzdCBiZSBzaWxseS4KKyAgICAgICAqLworICAgICAgcmFfc2V0X25vZGVfcmVnKGcsIGZpcnN0X3BheWxvYWRfbm9kZSArIGksIGkpOworCisgICAgICAvKiBGb3Igbm93LCBqdXN0IG1hcmsgZWFjaCBwYXlsb2FkIG5vZGUgYXMgaW50ZXJmZXJpbmcgd2l0aCBldmVyeSBvdGhlcgorICAgICAgICogbm9kZSB0byBiZSBhbGxvY2F0ZWQuCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVnX25vZGVfY291bnQ7IGorKykgeworICAgICAgICAgcmFfYWRkX25vZGVfaW50ZXJmZXJlbmNlKGcsIGZpcnN0X3BheWxvYWRfbm9kZSArIGksIGopOworICAgICAgfQorICAgfQorfQorCitib29sCit2ZWM0X3Zpc2l0b3I6OnJlZ19hbGxvY2F0ZSgpCit7CisgICBzdHJ1Y3QgaW50ZWxfc2NyZWVuICpzY3JlZW4gPSBicnctPmludGVsU2NyZWVuOworICAgdW5zaWduZWQgaW50IGh3X3JlZ19tYXBwaW5nW3ZpcnR1YWxfZ3JmX2NvdW50XTsKKyAgIGludCBwYXlsb2FkX3JlZ19jb3VudCA9IHRoaXMtPmZpcnN0X25vbl9wYXlsb2FkX2dyZjsKKworICAgLyogVXNpbmcgdGhlIHRyaXZpYWwgYWxsb2NhdG9yIGNhbiBiZSB1c2VmdWwgaW4gZGVidWdnaW5nIHVuZGVmaW5lZAorICAgICogcmVnaXN0ZXIgYWNjZXNzIGFzIGEgcmVzdWx0IG9mIGJyb2tlbiBvcHRpbWl6YXRpb24gcGFzc2VzLgorICAgICovCisgICBpZiAoMCkKKyAgICAgIHJldHVybiByZWdfYWxsb2NhdGVfdHJpdmlhbCgpOworCisgICBjYWxjdWxhdGVfbGl2ZV9pbnRlcnZhbHMoKTsKKworICAgaW50IG5vZGVfY291bnQgPSB2aXJ0dWFsX2dyZl9jb3VudDsKKyAgIGludCBmaXJzdF9wYXlsb2FkX25vZGUgPSBub2RlX2NvdW50OworICAgbm9kZV9jb3VudCArPSBwYXlsb2FkX3JlZ19jb3VudDsKKyAgIHN0cnVjdCByYV9ncmFwaCAqZyA9CisgICAgICByYV9hbGxvY19pbnRlcmZlcmVuY2VfZ3JhcGgoc2NyZWVuLT52ZWM0X3JlZ19zZXQucmVncywgbm9kZV9jb3VudCk7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlydHVhbF9ncmZfY291bnQ7IGkrKykgeworICAgICAgaW50IHNpemUgPSB0aGlzLT52aXJ0dWFsX2dyZl9zaXplc1tpXTsKKyAgICAgIGFzc2VydChzaXplID49IDEgJiYgc2l6ZSA8PSAyICYmCisgICAgICAgICAgICAgIlJlZ2lzdGVyIGFsbG9jYXRpb24gcmVsaWVzIG9uIHNwbGl0X3ZpcnR1YWxfZ3JmcygpLiIpOworICAgICAgcmFfc2V0X25vZGVfY2xhc3MoZywgaSwgc2NyZWVuLT52ZWM0X3JlZ19zZXQuY2xhc3Nlc1tzaXplIC0gMV0pOworCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgeworCSBpZiAodmlydHVhbF9ncmZfaW50ZXJmZXJlcyhpLCBqKSkgeworCSAgICByYV9hZGRfbm9kZV9pbnRlcmZlcmVuY2UoZywgaSwgaik7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgc2V0dXBfcGF5bG9hZF9pbnRlcmZlcmVuY2UoZywgZmlyc3RfcGF5bG9hZF9ub2RlLCBub2RlX2NvdW50KTsKKworICAgaWYgKCFyYV9hbGxvY2F0ZV9ub19zcGlsbHMoZykpIHsKKyAgICAgIC8qIEZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlcnMuICBTcGlsbCBhIHJlZywgYW5kIHRoZSBjYWxsZXIgd2lsbAorICAgICAgICogbG9vcCBiYWNrIGludG8gaGVyZSB0byB0cnkgYWdhaW4uCisgICAgICAgKi8KKyAgICAgIGludCByZWcgPSBjaG9vc2Vfc3BpbGxfcmVnKGcpOworICAgICAgaWYgKHRoaXMtPm5vX3NwaWxscykgeworICAgICAgICAgZmFpbCgiRmFpbHVyZSB0byByZWdpc3RlciBhbGxvY2F0ZS4gIFJlZHVjZSBudW1iZXIgb2YgbGl2ZSAiCisgICAgICAgICAgICAgICJ2YWx1ZXMgdG8gYXZvaWQgdGhpcy4iKTsKKyAgICAgIH0gZWxzZSBpZiAocmVnID09IC0xKSB7CisgICAgICAgICBmYWlsKCJubyByZWdpc3RlciB0byBzcGlsbFxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgc3BpbGxfcmVnKHJlZyk7CisgICAgICB9CisgICAgICByYWxsb2NfZnJlZShnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgLyogR2V0IHRoZSBjaG9zZW4gdmlydHVhbCByZWdpc3RlcnMgZm9yIGVhY2ggbm9kZSwgYW5kIG1hcCB2aXJ0dWFsCisgICAgKiByZWdzIGluIHRoZSByZWdpc3RlciBjbGFzc2VzIGJhY2sgZG93biB0byByZWFsIGhhcmR3YXJlIHJlZworICAgICogbnVtYmVycy4KKyAgICAqLworICAgcHJvZ19kYXRhLT50b3RhbF9ncmYgPSBwYXlsb2FkX3JlZ19jb3VudDsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlydHVhbF9ncmZfY291bnQ7IGkrKykgeworICAgICAgaW50IHJlZyA9IHJhX2dldF9ub2RlX3JlZyhnLCBpKTsKKworICAgICAgaHdfcmVnX21hcHBpbmdbaV0gPSBzY3JlZW4tPnZlYzRfcmVnX3NldC5yYV9yZWdfdG9fZ3JmW3JlZ107CisgICAgICBwcm9nX2RhdGEtPnRvdGFsX2dyZiA9IE1BWDIocHJvZ19kYXRhLT50b3RhbF9ncmYsCisJCQkJICBod19yZWdfbWFwcGluZ1tpXSArIHZpcnR1YWxfZ3JmX3NpemVzW2ldKTsKKyAgIH0KKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIGFzc2lnbihod19yZWdfbWFwcGluZywgJmluc3QtPmRzdCk7CisgICAgICBhc3NpZ24oaHdfcmVnX21hcHBpbmcsICZpbnN0LT5zcmNbMF0pOworICAgICAgYXNzaWduKGh3X3JlZ19tYXBwaW5nLCAmaW5zdC0+c3JjWzFdKTsKKyAgICAgIGFzc2lnbihod19yZWdfbWFwcGluZywgJmluc3QtPnNyY1syXSk7CisgICB9CisKKyAgIHJhbGxvY19mcmVlKGcpOworCisgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjpldmFsdWF0ZV9zcGlsbF9jb3N0cyhmbG9hdCAqc3BpbGxfY29zdHMsIGJvb2wgKm5vX3NwaWxsKQoreworICAgZmxvYXQgbG9vcF9zY2FsZSA9IDEuMDsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52aXJ0dWFsX2dyZl9jb3VudDsgaSsrKSB7CisgICAgICBzcGlsbF9jb3N0c1tpXSA9IDAuMDsKKyAgICAgIG5vX3NwaWxsW2ldID0gdmlydHVhbF9ncmZfc2l6ZXNbaV0gIT0gMTsKKyAgIH0KKworICAgLyogQ2FsY3VsYXRlIGNvc3RzIGZvciBzcGlsbGluZyBub2Rlcy4gIENhbGwgaXQgYSBjb3N0IG9mIDEgcGVyCisgICAgKiBzcGlsbC91bnNwaWxsIHdlJ2xsIGhhdmUgdG8gZG8sIGFuZCBndWVzcyB0aGF0IHRoZSBpbnNpZGVzIG9mCisgICAgKiBsb29wcyBydW4gMTAgdGltZXMuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKikgbm9kZTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkgaWYgKGluc3QtPnNyY1tpXS5maWxlID09IEdSRikgeworCSAgICBzcGlsbF9jb3N0c1tpbnN0LT5zcmNbaV0ucmVnXSArPSBsb29wX3NjYWxlOworICAgICAgICAgICAgaWYgKGluc3QtPnNyY1tpXS5yZWxhZGRyKQorICAgICAgICAgICAgICAgbm9fc3BpbGxbaW5zdC0+c3JjW2ldLnJlZ10gPSB0cnVlOworCSB9CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYpIHsKKwkgc3BpbGxfY29zdHNbaW5zdC0+ZHN0LnJlZ10gKz0gbG9vcF9zY2FsZTsKKyAgICAgICAgIGlmIChpbnN0LT5kc3QucmVsYWRkcikKKyAgICAgICAgICAgIG5vX3NwaWxsW2luc3QtPmRzdC5yZWddID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChpbnN0LT5vcGNvZGUpIHsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX0RPOgorCSBsb29wX3NjYWxlICo9IDEwOworCSBicmVhazsKKworICAgICAgY2FzZSBCUldfT1BDT0RFX1dISUxFOgorCSBsb29wX3NjYWxlIC89IDEwOworCSBicmVhazsKKworICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9SRUFEOgorICAgICAgY2FzZSBTSEFERVJfT1BDT0RFX0dFTjRfU0NSQVRDSF9XUklURToKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgPT0gR1JGKQorICAgICAgICAgICAgICAgbm9fc3BpbGxbaW5zdC0+c3JjW2ldLnJlZ10gPSB0cnVlOworICAgICAgICAgfQorCSBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGKQorCSAgICBub19zcGlsbFtpbnN0LT5kc3QucmVnXSA9IHRydWU7CisJIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorCSBicmVhazsKKyAgICAgIH0KKyAgIH0KK30KKworaW50Cit2ZWM0X3Zpc2l0b3I6OmNob29zZV9zcGlsbF9yZWcoc3RydWN0IHJhX2dyYXBoICpnKQoreworICAgZmxvYXQgc3BpbGxfY29zdHNbdGhpcy0+dmlydHVhbF9ncmZfY291bnRdOworICAgYm9vbCBub19zcGlsbFt0aGlzLT52aXJ0dWFsX2dyZl9jb3VudF07CisKKyAgIGV2YWx1YXRlX3NwaWxsX2Nvc3RzKHNwaWxsX2Nvc3RzLCBub19zcGlsbCk7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dmlydHVhbF9ncmZfY291bnQ7IGkrKykgeworICAgICAgaWYgKCFub19zcGlsbFtpXSkKKyAgICAgICAgIHJhX3NldF9ub2RlX3NwaWxsX2Nvc3QoZywgaSwgc3BpbGxfY29zdHNbaV0pOworICAgfQorCisgICByZXR1cm4gcmFfZ2V0X2Jlc3Rfc3BpbGxfbm9kZShnKTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjpzcGlsbF9yZWcoaW50IHNwaWxsX3JlZ19ucikKK3sKKyAgIGFzc2VydCh2aXJ0dWFsX2dyZl9zaXplc1tzcGlsbF9yZWdfbnJdID09IDEpOworICAgdW5zaWduZWQgaW50IHNwaWxsX29mZnNldCA9IGMtPmxhc3Rfc2NyYXRjaCsrOworCisgICAvKiBHZW5lcmF0ZSBzcGlsbC91bnNwaWxsIGluc3RydWN0aW9ucyBmb3IgdGhlIG9iamVjdHMgYmVpbmcgc3BpbGxlZC4gKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKikgbm9kZTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChpbnN0LT5zcmNbaV0uZmlsZSA9PSBHUkYgJiYgaW5zdC0+c3JjW2ldLnJlZyA9PSBzcGlsbF9yZWdfbnIpIHsKKyAgICAgICAgICAgIHNyY19yZWcgc3BpbGxfcmVnID0gaW5zdC0+c3JjW2ldOworICAgICAgICAgICAgaW5zdC0+c3JjW2ldLnJlZyA9IHZpcnR1YWxfZ3JmX2FsbG9jKDEpOworICAgICAgICAgICAgZHN0X3JlZyB0ZW1wID0gZHN0X3JlZyhpbnN0LT5zcmNbaV0pOworCisgICAgICAgICAgICAvKiBPbmx5IHJlYWQgdGhlIG5lY2Vzc2FyeSBjaGFubmVscywgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdGhlIHJlc3QKKyAgICAgICAgICAgICAqIHdpdGggZGF0YSB0aGF0IG1heSBub3QgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gc2NyYXRjaC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGVtcC53cml0ZW1hc2sgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspCisgICAgICAgICAgICAgICB0ZW1wLndyaXRlbWFzayB8PSAoMSA8PCBCUldfR0VUX1NXWihpbnN0LT5zcmNbaV0uc3dpenpsZSwgYykpOworICAgICAgICAgICAgYXNzZXJ0KHRlbXAud3JpdGVtYXNrICE9IDApOworCisgICAgICAgICAgICBlbWl0X3NjcmF0Y2hfcmVhZChpbnN0LCB0ZW1wLCBzcGlsbF9yZWcsIHNwaWxsX29mZnNldCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYgJiYgaW5zdC0+ZHN0LnJlZyA9PSBzcGlsbF9yZWdfbnIpIHsKKyAgICAgICAgIGVtaXRfc2NyYXRjaF93cml0ZShpbnN0LCBzcGlsbF9vZmZzZXQpOworICAgICAgfQorICAgfQorCisgICBpbnZhbGlkYXRlX2xpdmVfaW50ZXJ2YWxzKCk7Cit9CisKK30gLyogbmFtZXNwYWNlIGJydyAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X3Zpc2l0b3IuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192ZWM0X3Zpc2l0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjVkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfdmlzaXRvci5jcHAKQEAgLTAsMCArMSwzNDUwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImJyd192ZWM0LmgiCisjaW5jbHVkZSAiZ2xzbC9pcl91bmlmb3JtLmgiCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJwcm9ncmFtL3NhbXBsZXIuaCIKK30KKworbmFtZXNwYWNlIGJydyB7CisKK3ZlYzRfaW5zdHJ1Y3Rpb246OnZlYzRfaW5zdHJ1Y3Rpb24odmVjNF92aXNpdG9yICp2LAorCQkJCSAgIGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsCisJCQkJICAgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEsIHNyY19yZWcgc3JjMikKK3sKKyAgIHRoaXMtPm9wY29kZSA9IG9wY29kZTsKKyAgIHRoaXMtPmRzdCA9IGRzdDsKKyAgIHRoaXMtPnNyY1swXSA9IHNyYzA7CisgICB0aGlzLT5zcmNbMV0gPSBzcmMxOworICAgdGhpcy0+c3JjWzJdID0gc3JjMjsKKyAgIHRoaXMtPnNhdHVyYXRlID0gZmFsc2U7CisgICB0aGlzLT5mb3JjZV93cml0ZW1hc2tfYWxsID0gZmFsc2U7CisgICB0aGlzLT5ub19kZF9jbGVhciA9IGZhbHNlOworICAgdGhpcy0+bm9fZGRfY2hlY2sgPSBmYWxzZTsKKyAgIHRoaXMtPndyaXRlc19hY2N1bXVsYXRvciA9IGZhbHNlOworICAgdGhpcy0+Y29uZGl0aW9uYWxfbW9kID0gQlJXX0NPTkRJVElPTkFMX05PTkU7CisgICB0aGlzLT5zYW1wbGVyID0gMDsKKyAgIHRoaXMtPnRleHR1cmVfb2Zmc2V0ID0gMDsKKyAgIHRoaXMtPnRhcmdldCA9IDA7CisgICB0aGlzLT5zaGFkb3dfY29tcGFyZSA9IGZhbHNlOworICAgdGhpcy0+aXIgPSB2LT5iYXNlX2lyOworICAgdGhpcy0+dXJiX3dyaXRlX2ZsYWdzID0gQlJXX1VSQl9XUklURV9OT19GTEFHUzsKKyAgIHRoaXMtPmhlYWRlcl9wcmVzZW50ID0gZmFsc2U7CisgICB0aGlzLT5tbGVuID0gMDsKKyAgIHRoaXMtPmJhc2VfbXJmID0gMDsKKyAgIHRoaXMtPm9mZnNldCA9IDA7CisgICB0aGlzLT5hbm5vdGF0aW9uID0gdi0+Y3VycmVudF9hbm5vdGF0aW9uOworfQorCit2ZWM0X2luc3RydWN0aW9uICoKK3ZlYzRfdmlzaXRvcjo6ZW1pdCh2ZWM0X2luc3RydWN0aW9uICppbnN0KQoreworICAgdGhpcy0+aW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChpbnN0KTsKKworICAgcmV0dXJuIGluc3Q7Cit9CisKK3ZlYzRfaW5zdHJ1Y3Rpb24gKgordmVjNF92aXNpdG9yOjplbWl0X2JlZm9yZSh2ZWM0X2luc3RydWN0aW9uICppbnN0LCB2ZWM0X2luc3RydWN0aW9uICpuZXdfaW5zdCkKK3sKKyAgIG5ld19pbnN0LT5pciA9IGluc3QtPmlyOworICAgbmV3X2luc3QtPmFubm90YXRpb24gPSBpbnN0LT5hbm5vdGF0aW9uOworCisgICBpbnN0LT5pbnNlcnRfYmVmb3JlKG5ld19pbnN0KTsKKworICAgcmV0dXJuIGluc3Q7Cit9CisKK3ZlYzRfaW5zdHJ1Y3Rpb24gKgordmVjNF92aXNpdG9yOjplbWl0KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsCisJCSAgIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxLCBzcmNfcmVnIHNyYzIpCit7CisgICByZXR1cm4gZW1pdChuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBvcGNvZGUsIGRzdCwKKwkJCQkJICAgICBzcmMwLCBzcmMxLCBzcmMyKSk7Cit9CisKKwordmVjNF9pbnN0cnVjdGlvbiAqCit2ZWM0X3Zpc2l0b3I6OmVtaXQoZW51bSBvcGNvZGUgb3Bjb2RlLCBkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpCit7CisgICByZXR1cm4gZW1pdChuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBvcGNvZGUsIGRzdCwgc3JjMCwgc3JjMSkpOworfQorCit2ZWM0X2luc3RydWN0aW9uICoKK3ZlYzRfdmlzaXRvcjo6ZW1pdChlbnVtIG9wY29kZSBvcGNvZGUsIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzApCit7CisgICByZXR1cm4gZW1pdChuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBvcGNvZGUsIGRzdCwgc3JjMCkpOworfQorCit2ZWM0X2luc3RydWN0aW9uICoKK3ZlYzRfdmlzaXRvcjo6ZW1pdChlbnVtIG9wY29kZSBvcGNvZGUsIGRzdF9yZWcgZHN0KQoreworICAgcmV0dXJuIGVtaXQobmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywgb3Bjb2RlLCBkc3QpKTsKK30KKwordmVjNF9pbnN0cnVjdGlvbiAqCit2ZWM0X3Zpc2l0b3I6OmVtaXQoZW51bSBvcGNvZGUgb3Bjb2RlKQoreworICAgcmV0dXJuIGVtaXQobmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywgb3Bjb2RlLCBkc3RfcmVnKCkpKTsKK30KKworI2RlZmluZSBBTFUxKG9wKQkJCQkJCQlcCisgICB2ZWM0X2luc3RydWN0aW9uICoJCQkJCQkJXAorICAgdmVjNF92aXNpdG9yOjpvcChkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwKQkJCQlcCisgICB7CQkJCQkJCQkJXAorICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSB2ZWM0X2luc3RydWN0aW9uKHRoaXMsIEJSV19PUENPREVfIyNvcCwgZHN0LAlcCisJCQkJCSAgIHNyYzApOwkJCVwKKyAgIH0KKworI2RlZmluZSBBTFUyKG9wKQkJCQkJCQlcCisgICB2ZWM0X2luc3RydWN0aW9uICoJCQkJCQkJXAorICAgdmVjNF92aXNpdG9yOjpvcChkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpCQlcCisgICB7CQkJCQkJCQkJXAorICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSB2ZWM0X2luc3RydWN0aW9uKHRoaXMsIEJSV19PUENPREVfIyNvcCwgZHN0LAlcCisJCQkJCSAgIHNyYzAsIHNyYzEpOwkJCVwKKyAgIH0KKworI2RlZmluZSBBTFUyX0FDQyhvcCkJCQkJCQkJXAorICAgdmVjNF9pbnN0cnVjdGlvbiAqCQkJCQkJCVwKKyAgIHZlYzRfdmlzaXRvcjo6b3AoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKQkJXAorICAgewkJCQkJCQkJCVwKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBCUldfT1BDT0RFXyMjb3AsIGRzdCwgc3JjMCwgc3JjMSk7CQlcCisgICAgICBpbnN0LT53cml0ZXNfYWNjdW11bGF0b3IgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBpbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZGVmaW5lIEFMVTMob3ApCQkJCQkJCVwKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKgkJCQkJCQlcCisgICB2ZWM0X3Zpc2l0b3I6Om9wKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSwgc3JjX3JlZyBzcmMyKVwKKyAgIHsJCQkJCQkJCQlcCisgICAgICBhc3NlcnQoYnJ3LT5nZW4gPj0gNik7CQkJCQkJXAorICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSB2ZWM0X2luc3RydWN0aW9uKHRoaXMsIEJSV19PUENPREVfIyNvcCwgZHN0LAlcCisJCQkJCSAgIHNyYzAsIHNyYzEsIHNyYzIpOwkJXAorICAgfQorCitBTFUxKE5PVCkKK0FMVTEoTU9WKQorQUxVMShGUkMpCitBTFUxKFJOREQpCitBTFUxKFJOREUpCitBTFUxKFJORFopCitBTFUxKEYzMlRPMTYpCitBTFUxKEYxNlRPMzIpCitBTFUyKEFERCkKK0FMVTIoTVVMKQorQUxVMl9BQ0MoTUFDSCkKK0FMVTIoQU5EKQorQUxVMihPUikKK0FMVTIoWE9SKQorQUxVMihEUDMpCitBTFUyKERQNCkKK0FMVTIoRFBIKQorQUxVMihTSEwpCitBTFUyKFNIUikKK0FMVTIoQVNSKQorQUxVMyhMUlApCitBTFUxKEJGUkVWKQorQUxVMyhCRkUpCitBTFUyKEJGSTEpCitBTFUzKEJGSTIpCitBTFUxKEZCSCkKK0FMVTEoRkJMKQorQUxVMShDQklUKQorQUxVMyhNQUQpCitBTFUyX0FDQyhBRERDKQorQUxVMl9BQ0MoU1VCQikKK0FMVTIoTUFDKQorCisvKiogR2VuNCBwcmVkaWNhdGVkIElGLiAqLwordmVjNF9pbnN0cnVjdGlvbiAqCit2ZWM0X3Zpc2l0b3I6OklGKHVpbnQzMl90IHByZWRpY2F0ZSkKK3sKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3Q7CisKKyAgIGluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBCUldfT1BDT0RFX0lGKTsKKyAgIGluc3QtPnByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKKworICAgcmV0dXJuIGluc3Q7Cit9CisKKy8qKiBHZW42IElGIHdpdGggZW1iZWRkZWQgY29tcGFyaXNvbi4gKi8KK3ZlYzRfaW5zdHJ1Y3Rpb24gKgordmVjNF92aXNpdG9yOjpJRihzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSwgdWludDMyX3QgY29uZGl0aW9uKQoreworICAgYXNzZXJ0KGJydy0+Z2VuID09IDYpOworCisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0OworCisgICByZXNvbHZlX3VkX25lZ2F0ZSgmc3JjMCk7CisgICByZXNvbHZlX3VkX25lZ2F0ZSgmc3JjMSk7CisKKyAgIGluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBCUldfT1BDT0RFX0lGLCBkc3RfbnVsbF9kKCksCisJCQkJCXNyYzAsIHNyYzEpOworICAgaW5zdC0+Y29uZGl0aW9uYWxfbW9kID0gY29uZGl0aW9uOworCisgICByZXR1cm4gaW5zdDsKK30KKworLyoqCisgKiBDTVA6IFNldHMgdGhlIGxvdyBiaXQgb2YgdGhlIGRlc3RpbmF0aW9uIGNoYW5uZWxzIHdpdGggdGhlIHJlc3VsdAorICogb2YgdGhlIGNvbXBhcmlzb24sIHdoaWxlIHRoZSB1cHBlciBiaXRzIGFyZSB1bmRlZmluZWQsIGFuZCB1cGRhdGVzCisgKiB0aGUgZmxhZyByZWdpc3RlciB3aXRoIHRoZSBwYWNrZWQgMTYgYml0cyBvZiB0aGUgcmVzdWx0LgorICovCit2ZWM0X2luc3RydWN0aW9uICoKK3ZlYzRfdmlzaXRvcjo6Q01QKGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSwgdWludDMyX3QgY29uZGl0aW9uKQoreworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdDsKKworICAgLyogb3JpZ2luYWwgZ2VuNCBkb2VzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZGVzdGluYXRpb24gdHlwZQorICAgICogYmVmb3JlIGJlZm9yZSBjb21wYXJpc29uLCBwcm9kdWNpbmcgZ2FyYmFnZSByZXN1bHRzIGZvciBmbG9hdGluZworICAgICogcG9pbnQgY29tcGFyaXNvbnMuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA9PSA0KSB7CisgICAgICBkc3QudHlwZSA9IHNyYzAudHlwZTsKKyAgICAgIGlmIChkc3QuZmlsZSA9PSBIV19SRUcpCisJIGRzdC5maXhlZF9od19yZWcudHlwZSA9IGRzdC50eXBlOworICAgfQorCisgICByZXNvbHZlX3VkX25lZ2F0ZSgmc3JjMCk7CisgICByZXNvbHZlX3VkX25lZ2F0ZSgmc3JjMSk7CisKKyAgIGluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBCUldfT1BDT0RFX0NNUCwgZHN0LCBzcmMwLCBzcmMxKTsKKyAgIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IGNvbmRpdGlvbjsKKworICAgcmV0dXJuIGluc3Q7Cit9CisKK3ZlYzRfaW5zdHJ1Y3Rpb24gKgordmVjNF92aXNpdG9yOjpTQ1JBVENIX1JFQUQoZHN0X3JlZyBkc3QsIHNyY19yZWcgaW5kZXgpCit7CisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0OworCisgICBpbnN0ID0gbmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywgU0hBREVSX09QQ09ERV9HRU40X1NDUkFUQ0hfUkVBRCwKKwkJCQkJZHN0LCBpbmRleCk7CisgICBpbnN0LT5iYXNlX21yZiA9IDE0OworICAgaW5zdC0+bWxlbiA9IDI7CisKKyAgIHJldHVybiBpbnN0OworfQorCit2ZWM0X2luc3RydWN0aW9uICoKK3ZlYzRfdmlzaXRvcjo6U0NSQVRDSF9XUklURShkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMsIHNyY19yZWcgaW5kZXgpCit7CisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0OworCisgICBpbnN0ID0gbmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywgU0hBREVSX09QQ09ERV9HRU40X1NDUkFUQ0hfV1JJVEUsCisJCQkJCWRzdCwgc3JjLCBpbmRleCk7CisgICBpbnN0LT5iYXNlX21yZiA9IDEzOworICAgaW5zdC0+bWxlbiA9IDM7CisKKyAgIHJldHVybiBpbnN0OworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfZHAoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxLCB1bnNpZ25lZCBlbGVtZW50cykKK3sKKyAgIHN0YXRpYyBlbnVtIG9wY29kZSBkb3Rfb3Bjb2Rlc1tdID0geworICAgICAgQlJXX09QQ09ERV9EUDIsIEJSV19PUENPREVfRFAzLCBCUldfT1BDT0RFX0RQNAorICAgfTsKKworICAgZW1pdChkb3Rfb3Bjb2Rlc1tlbGVtZW50cyAtIDJdLCBkc3QsIHNyYzAsIHNyYzEpOworfQorCitzcmNfcmVnCit2ZWM0X3Zpc2l0b3I6OmZpeF8zc3JjX29wZXJhbmQoc3JjX3JlZyBzcmMpCit7CisgICAvKiBVc2luZyB2ZWM0IHVuaWZvcm1zIGluIFNJTUQ0eDIgcHJvZ3JhbXMgaXMgZGlmZmljdWx0LiBZb3UnZCBsaWtlIHRvIGJlCisgICAgKiBhYmxlIHRvIHVzZSB2ZXJ0aWNhbCBzdHJpZGUgb2YgemVybyB0byByZXBsaWNhdGUgdGhlIHZlYzQgdW5pZm9ybSwgbGlrZQorICAgICoKKyAgICAqICAgIGczPDA7NCwxPjpmIC0gWzAsIDRdWzEsIDVdWzIsIDZdWzMsIDddCisgICAgKgorICAgICogQnV0IHlvdSBjYW4ndCwgc2luY2UgdmVydGljYWwgc3RyaWRlIGlzIGFsd2F5cyBmb3VyIGluIHRocmVlLXNvdXJjZQorICAgICogaW5zdHJ1Y3Rpb25zLiBJbnN0ZWFkLCBpbnNlcnQgYSBNT1YgaW5zdHJ1Y3Rpb24gdG8gZG8gdGhlIHJlcGxpY2F0aW9uIHNvCisgICAgKiB0aGF0IHRoZSB0aHJlZS1zb3VyY2UgaW5zdHJ1Y3Rpb24gY2FuIGNvbnN1bWUgaXQuCisgICAgKi8KKworICAgLyogVGhlIE1PViBpcyBvbmx5IG5lZWRlZCBpZiB0aGUgc291cmNlIGlzIGEgdW5pZm9ybSBvciBpbW1lZGlhdGUuICovCisgICBpZiAoc3JjLmZpbGUgIT0gVU5JRk9STSAmJiBzcmMuZmlsZSAhPSBJTU0pCisgICAgICByZXR1cm4gc3JjOworCisgICBpZiAoc3JjLmZpbGUgPT0gVU5JRk9STSAmJiBicndfaXNfc2luZ2xlX3ZhbHVlX3N3aXp6bGUoc3JjLnN3aXp6bGUpKQorICAgICAgcmV0dXJuIHNyYzsKKworICAgZHN0X3JlZyBleHBhbmRlZCA9IGRzdF9yZWcodGhpcywgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgZXhwYW5kZWQudHlwZSA9IHNyYy50eXBlOworICAgZW1pdChNT1YoZXhwYW5kZWQsIHNyYykpOworICAgcmV0dXJuIHNyY19yZWcoZXhwYW5kZWQpOworfQorCitzcmNfcmVnCit2ZWM0X3Zpc2l0b3I6OmZpeF9tYXRoX29wZXJhbmQoc3JjX3JlZyBzcmMpCit7CisgICAvKiBUaGUgZ2VuNiBtYXRoIGluc3RydWN0aW9uIGlnbm9yZXMgdGhlIHNvdXJjZSBtb2RpZmllcnMgLS0KKyAgICAqIHN3aXp6bGUsIGFicywgbmVnYXRlLCBhbmQgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB0aGUgcmVnaXN0ZXIKKyAgICAqIHJlZ2lvbiBkZXNjcmlwdGlvbi4KKyAgICAqCisgICAgKiBSYXRoZXIgdGhhbiB0cnlpbmcgdG8gZW51bWVyYXRlIGFsbCB0aGVzZSBjYXNlcywgKmFsd2F5cyogZXhwYW5kIHRoZQorICAgICogb3BlcmFuZCB0byBhIHRlbXAgR1JGIGZvciBnZW42LgorICAgICoKKyAgICAqIEZvciBnZW43LCBrZWVwIHRoZSBvcGVyYW5kIGFzLWlzLCBleGNlcHQgaWYgaW1tZWRpYXRlLCB3aGljaCBnZW43IHN0aWxsCisgICAgKiBjYW4ndCB1c2UuCisgICAgKi8KKworICAgaWYgKGJydy0+Z2VuID09IDcgJiYgc3JjLmZpbGUgIT0gSU1NKQorICAgICAgcmV0dXJuIHNyYzsKKworICAgZHN0X3JlZyBleHBhbmRlZCA9IGRzdF9yZWcodGhpcywgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgZXhwYW5kZWQudHlwZSA9IHNyYy50eXBlOworICAgZW1pdChNT1YoZXhwYW5kZWQsIHNyYykpOworICAgcmV0dXJuIHNyY19yZWcoZXhwYW5kZWQpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfbWF0aDFfZ2VuNihlbnVtIG9wY29kZSBvcGNvZGUsIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYykKK3sKKyAgIHNyYyA9IGZpeF9tYXRoX29wZXJhbmQoc3JjKTsKKworICAgaWYgKGRzdC53cml0ZW1hc2sgIT0gV1JJVEVNQVNLX1hZWlcpIHsKKyAgICAgIC8qIFRoZSBnZW42IG1hdGggaW5zdHJ1Y3Rpb24gbXVzdCBiZSBhbGlnbjEsIHNvIHdlIGNhbid0IGRvCisgICAgICAgKiB3cml0ZW1hc2tzLgorICAgICAgICovCisgICAgICBkc3RfcmVnIHRlbXBfZHN0ID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisKKyAgICAgIGVtaXQob3Bjb2RlLCB0ZW1wX2RzdCwgc3JjKTsKKworICAgICAgZW1pdChNT1YoZHN0LCBzcmNfcmVnKHRlbXBfZHN0KSkpOworICAgfSBlbHNlIHsKKyAgICAgIGVtaXQob3Bjb2RlLCBkc3QsIHNyYyk7CisgICB9Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6ZW1pdF9tYXRoMV9nZW40KGVudW0gb3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjKQoreworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQob3Bjb2RlLCBkc3QsIHNyYyk7CisgICBpbnN0LT5iYXNlX21yZiA9IDE7CisgICBpbnN0LT5tbGVuID0gMTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X21hdGgob3Bjb2RlIG9wY29kZSwgZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjKQoreworICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9SQ1A6CisgICBjYXNlIFNIQURFUl9PUENPREVfUlNROgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1NRUlQ6CisgICBjYXNlIFNIQURFUl9PUENPREVfRVhQMjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9MT0cyOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1NJTjoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9DT1M6CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogYmFkIG1hdGggb3Bjb2RlIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChicnctPmdlbiA+PSA4KSB7CisgICAgICBlbWl0KG9wY29kZSwgZHN0LCBzcmMpOworICAgfSBlbHNlIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICBlbWl0X21hdGgxX2dlbjYob3Bjb2RlLCBkc3QsIHNyYyk7CisgICB9IGVsc2UgeworICAgICAgZW1pdF9tYXRoMV9nZW40KG9wY29kZSwgZHN0LCBzcmMpOworICAgfQorfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfbWF0aDJfZ2VuNihlbnVtIG9wY29kZSBvcGNvZGUsCisJCQkgICAgICBkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpCit7CisgICBzcmMwID0gZml4X21hdGhfb3BlcmFuZChzcmMwKTsKKyAgIHNyYzEgPSBmaXhfbWF0aF9vcGVyYW5kKHNyYzEpOworCisgICBpZiAoZHN0LndyaXRlbWFzayAhPSBXUklURU1BU0tfWFlaVykgeworICAgICAgLyogVGhlIGdlbjYgbWF0aCBpbnN0cnVjdGlvbiBtdXN0IGJlIGFsaWduMSwgc28gd2UgY2FuJ3QgZG8KKyAgICAgICAqIHdyaXRlbWFza3MuCisgICAgICAgKi8KKyAgICAgIGRzdF9yZWcgdGVtcF9kc3QgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgICAgIHRlbXBfZHN0LnR5cGUgPSBkc3QudHlwZTsKKworICAgICAgZW1pdChvcGNvZGUsIHRlbXBfZHN0LCBzcmMwLCBzcmMxKTsKKworICAgICAgZW1pdChNT1YoZHN0LCBzcmNfcmVnKHRlbXBfZHN0KSkpOworICAgfSBlbHNlIHsKKyAgICAgIGVtaXQob3Bjb2RlLCBkc3QsIHNyYzAsIHNyYzEpOworICAgfQorfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfbWF0aDJfZ2VuNChlbnVtIG9wY29kZSBvcGNvZGUsCisJCQkgICAgICBkc3RfcmVnIGRzdCwgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpCit7CisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gZW1pdChvcGNvZGUsIGRzdCwgc3JjMCwgc3JjMSk7CisgICBpbnN0LT5iYXNlX21yZiA9IDE7CisgICBpbnN0LT5tbGVuID0gMjsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X21hdGgoZW51bSBvcGNvZGUgb3Bjb2RlLAorCQkJZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCwgc3JjX3JlZyBzcmMxKQoreworICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9QT1c6CisgICBjYXNlIFNIQURFUl9PUENPREVfSU5UX1FVT1RJRU5UOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVI6CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogdW5zdXBwb3J0ZWQgYmluYXJ5IG1hdGggb3Bjb2RlIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChicnctPmdlbiA+PSA4KSB7CisgICAgICBlbWl0KG9wY29kZSwgZHN0LCBzcmMwLCBzcmMxKTsKKyAgIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgZW1pdF9tYXRoMl9nZW42KG9wY29kZSwgZHN0LCBzcmMwLCBzcmMxKTsKKyAgIH0gZWxzZSB7CisgICAgICBlbWl0X21hdGgyX2dlbjQob3Bjb2RlLCBkc3QsIHNyYzAsIHNyYzEpOworICAgfQorfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfcGFja19oYWxmXzJ4MTYoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCkKK3sKKyAgIGlmIChicnctPmdlbiA8IDcpCisgICAgICBhc3NlcnQoISJpcl91bm9wX3BhY2tfaGFsZl8yeDE2IHNob3VsZCBiZSBsb3dlcmVkIik7CisKKyAgIGFzc2VydChkc3QudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICBhc3NlcnQoc3JjMC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0YpOworCisgICAvKiBGcm9tIHRoZSBJdnlicmlkZ2UgUFJNLCBWb2w0LCBQYXJ0MywgU2VjdGlvbiA2LjI3IGYzMnRvMTY6CisgICAgKgorICAgICogICBCZWNhdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhIDE2LWJpdCBmbG9hdGluZy1wb2ludCB0eXBlLAorICAgICogICB0aGUgZGVzdGluYXRpb24gZGF0YSB0eXBlIG11c3QgYmUgV29yZCAoVykuCisgICAgKgorICAgICogICBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBEV29yZC1hbGlnbmVkIGFuZCBzcGVjaWZ5IGEgaG9yaXpvbnRhbCBzdHJpZGUKKyAgICAqICAgKEhvcnpTdHJpZGUpIG9mIDIuIFRoZSAxNi1iaXQgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgd29yZCBvZgorICAgICogICBlYWNoIGRlc3RpbmF0aW9uIGNoYW5uZWwgYW5kIHRoZSB1cHBlciB3b3JkIGlzIG5vdCBtb2RpZmllZC4KKyAgICAqCisgICAgKiBUaGUgYWJvdmUgcmVzdHJpY3Rpb24gaW1wbGllcyB0aGF0IHRoZSBmMzJ0bzE2IGluc3RydWN0aW9uIG11c3QgdXNlCisgICAgKiBhbGlnbjEgbW9kZSwgYmVjYXVzZSBvbmx5IGluIGFsaWduMSBtb2RlIGlzIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkKKyAgICAqIGhvcml6b250YWwgc3RyaWRlLiAgV2UgY2hvb3NlIGhlcmUgdG8gZGVmeSB0aGUgaGFyZHdhcmUgZG9jcyBhbmQgZW1pdAorICAgICogYWxpZ24xNiBpbnN0cnVjdGlvbnMuCisgICAgKgorICAgICogKEkgW2NoYWR2XSBkaWQgYXR0ZW1wdCB0byBlbWl0IGFsaWduMSBpbnN0cnVjdGlvbnMgZm9yIFZTIGYzMnRvMTYKKyAgICAqIGluc3RydWN0aW9ucy4gSSB3YXMgcGFydGlhbGx5IHN1Y2Nlc3NmdWwgaW4gdGhhdCB0aGUgY29kZSBwYXNzZWQgYWxsCisgICAgKiB0ZXN0cy4gIEhvd2V2ZXIsIHRoZSBjb2RlIHdhcyBkdWJpb3VzbHkgY29ycmVjdCBhbmQgZnJhZ2lsZSwgYW5kIHRoZQorICAgICogdGVzdHMgd2VyZSBub3QgaGFyc2ggZW5vdWdoIHRvIHByb2JlIHRoYXQgZnJhaWx0eS4gTm90IHRydXN0aW5nIHRoZQorICAgICogY29kZSwgSSBjaG9zZSBpbnN0ZWFkIHRvIHJlbWFpbiBpbiBhbGlnbjE2IG1vZGUgaW4gZGVmaWFuY2Ugb2YgdGhlIGh3CisgICAgKiBkb2NzKS4KKyAgICAqCisgICAgKiBJJ3ZlIFtjaGFkdl0gZXhwZXJpbWVudGFsbHkgY29uZmlybWVkIHRoYXQsIG9uIGdlbjcgaGFyZHdhcmUgYW5kIHRoZQorICAgICogc2ltdWxhdG9yLCBlbWl0dGluZyBhIGYzMnRvMTYgaW4gYWxpZ24xNiBtb2RlIHdpdGggVUQgYXMgZGVzdGluYXRpb24KKyAgICAqIGRhdGEgdHlwZSBpcyBzYWZlLiBUaGUgYmVoYXZpb3IgZGlmZmVycyBmcm9tIHRoYXQgc3BlY2lmaWVkIGluIHRoZSBQUk0KKyAgICAqIGluIHRoYXQgdGhlIHVwcGVyIHdvcmQgb2YgZWFjaCBkZXN0aW5hdGlvbiBjaGFubmVsIGlzIGNsZWFyZWQgdG8gMC4KKyAgICAqLworCisgICBkc3RfcmVnIHRtcF9kc3QodGhpcywgZ2xzbF90eXBlOjp1dmVjMl90eXBlKTsKKyAgIHNyY19yZWcgdG1wX3NyYyh0bXBfZHN0KTsKKworI2lmIDAKKyAgIC8qIFZlcmlmeSB0aGUgdW5kb2N1bWVudGVkIGJlaGF2aW9yIG9uIHdoaWNoIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zCisgICAgKiByZWx5LiAgSWYgZjMydG8xNiBmYWlscyB0byBjbGVhciB0aGUgdXBwZXIgd29yZCBvZiB0aGUgWCBhbmQgWSBjaGFubmVscywKKyAgICAqIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgYml0LW9yIGluc3RydWN0aW9uIGJlbG93IHdpbGwgYmUgaW5jb3JyZWN0LgorICAgICoKKyAgICAqIFlvdSBzaG91bGQgaW5zcGVjdCB0aGUgZGlzYXNtIG91dHB1dCBpbiBvcmRlciB0byB2ZXJpZnkgdGhhdCB0aGUgTU9WIGlzCisgICAgKiBub3Qgb3B0aW1pemVkIGF3YXkuCisgICAgKi8KKyAgIGVtaXQoTU9WKHRtcF9kc3QsIHNyY19yZWcoMHgxMjM0NTY3OHUpKSk7CisjZW5kaWYKKworICAgLyogR2l2ZSB0bXAgdGhlIGZvcm0gYmVsb3csIHdoZXJlICIuIiBtZWFucyB1bnRvdWNoZWQuCisgICAgKgorICAgICogICAgIHcgeiAgICAgICAgICB5ICAgICAgICAgIHggdyB6ICAgICAgICAgIHkgICAgICAgICAgeAorICAgICogICB8LnwufDB4MDAwMGhoaGh8MHgwMDAwbGxsbHwufC58MHgwMDAwaGhoaHwweDAwMDBsbGxsfAorICAgICoKKyAgICAqIFRoYXQgdGhlIHVwcGVyIHdvcmQgb2YgZWFjaCB3cml0ZS1jaGFubmVsIGJlIDAgaXMgcmVxdWlyZWQgZm9yIHRoZQorICAgICogZm9sbG93aW5nIGJpdC1zaGlmdCBhbmQgYml0LW9yIGluc3RydWN0aW9ucyB0byB3b3JrLiBOb3RlIHRoYXQgdGhpcworICAgICogcmVsaWVzIG9uIHRoZSB1bmRvY3VtZW50ZWQgaGFyZHdhcmUgYmVoYXZpb3IgbWVudGlvbmVkIGFib3ZlLgorICAgICovCisgICB0bXBfZHN0LndyaXRlbWFzayA9IFdSSVRFTUFTS19YWTsKKyAgIGVtaXQoRjMyVE8xNih0bXBfZHN0LCBzcmMwKSk7CisKKyAgIC8qIEdpdmUgdGhlIHdyaXRlLWNoYW5uZWxzIG9mIGRzdCB0aGUgZm9ybToKKyAgICAqICAgMHhoaGhoMDAwMAorICAgICovCisgICB0bXBfc3JjLnN3aXp6bGUgPSBCUldfU1dJWlpMRV9ZWVlZOworICAgZW1pdChTSEwoZHN0LCB0bXBfc3JjLCBzcmNfcmVnKDE2dSkpKTsKKworICAgLyogRmluYWxseSwgZ2l2ZSB0aGUgd3JpdGUtY2hhbm5lbHMgb2YgZHN0IHRoZSBmb3JtIG9mIHBhY2tIYWxmMngxNidzCisgICAgKiBvdXRwdXQ6CisgICAgKiAgIDB4aGhoaGxsbGwKKyAgICAqLworICAgdG1wX3NyYy5zd2l6emxlID0gQlJXX1NXSVpaTEVfWFhYWDsKKyAgIGVtaXQoT1IoZHN0LCBzcmNfcmVnKGRzdCksIHRtcF9zcmMpKTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X3VucGFja19oYWxmXzJ4MTYoZHN0X3JlZyBkc3QsIHNyY19yZWcgc3JjMCkKK3sKKyAgIGlmIChicnctPmdlbiA8IDcpCisgICAgICBhc3NlcnQoISJpcl91bm9wX3VucGFja19oYWxmXzJ4MTYgc2hvdWxkIGJlIGxvd2VyZWQiKTsKKworICAgYXNzZXJ0KGRzdC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX0YpOworICAgYXNzZXJ0KHNyYzAudHlwZSA9PSBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisKKyAgIC8qIEZyb20gdGhlIEl2eWJyaWRnZSBQUk0sIFZvbDQsIFBhcnQzLCBTZWN0aW9uIDYuMjYgZjE2dG8zMjoKKyAgICAqCisgICAgKiAgIEJlY2F1c2UgdGhpcyBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGEgMTYtYml0IGZsb2F0aW5nLXBvaW50IHR5cGUsCisgICAgKiAgIHRoZSBzb3VyY2UgZGF0YSB0eXBlIG11c3QgYmUgV29yZCAoVykuIFRoZSBkZXN0aW5hdGlvbiB0eXBlIG11c3QgYmUKKyAgICAqICAgRiAoRmxvYXQpLgorICAgICoKKyAgICAqIFRvIHVzZSBXIGFzIHRoZSBzb3VyY2UgZGF0YSB0eXBlLCB3ZSBtdXN0IGFkanVzdCBob3Jpem9udGFsIHN0cmlkZXMsCisgICAgKiB3aGljaCBpcyBvbmx5IHBvc3NpYmxlIGluIGFsaWduMSBtb2RlLiBBbGwgbXkgW2NoYWR2XSBhdHRlbXB0cyBhdAorICAgICogZW1pdHRpbmcgYWxpZ24xIGluc3RydWN0aW9ucyBmb3IgdW5wYWNrSGFsZjJ4MTYgZmFpbGVkIHRvIHBhc3MgdGhlCisgICAgKiBQaWdsaXQgdGVzdHMsIHNvIEkgZ2F2ZSB1cC4KKyAgICAqCisgICAgKiBJJ3ZlIHZlcmlmaWVkIHRoYXQsIG9uIGdlbjcgaGFyZHdhcmUgYW5kIHRoZSBzaW11bGF0b3IsIGl0IGlzIHNhZmUgdG8KKyAgICAqIGVtaXQgZjE2dG8zMiBpbiBhbGlnbjE2IG1vZGUgd2l0aCBVRCBhcyBzb3VyY2UgZGF0YSB0eXBlLgorICAgICovCisKKyAgIGRzdF9yZWcgdG1wX2RzdCh0aGlzLCBnbHNsX3R5cGU6OnV2ZWMyX3R5cGUpOworICAgc3JjX3JlZyB0bXBfc3JjKHRtcF9kc3QpOworCisgICB0bXBfZHN0LndyaXRlbWFzayA9IFdSSVRFTUFTS19YOworICAgZW1pdChBTkQodG1wX2RzdCwgc3JjMCwgc3JjX3JlZygweGZmZmZ1KSkpOworCisgICB0bXBfZHN0LndyaXRlbWFzayA9IFdSSVRFTUFTS19ZOworICAgZW1pdChTSFIodG1wX2RzdCwgc3JjMCwgc3JjX3JlZygxNnUpKSk7CisKKyAgIGRzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWFk7CisgICBlbWl0KEYxNlRPMzIoZHN0LCB0bXBfc3JjKSk7Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6dmlzaXRfaW5zdHJ1Y3Rpb25zKGNvbnN0IGV4ZWNfbGlzdCAqbGlzdCkKK3sKKyAgIGZvcmVhY2hfbGlzdChub2RlLCBsaXN0KSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKilub2RlOworCisgICAgICBiYXNlX2lyID0gaXI7CisgICAgICBpci0+YWNjZXB0KHRoaXMpOworICAgfQorfQorCisKK3N0YXRpYyBpbnQKK3R5cGVfc2l6ZShjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgdW5zaWduZWQgaW50IGk7CisgICBpbnQgc2l6ZTsKKworICAgc3dpdGNoICh0eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6CisgICAgICBpZiAodHlwZS0+aXNfbWF0cml4KCkpIHsKKwkgcmV0dXJuIHR5cGUtPm1hdHJpeF9jb2x1bW5zOworICAgICAgfSBlbHNlIHsKKwkgLyogUmVnYXJkbGVzcyBvZiBzaXplIG9mIHZlY3RvciwgaXQgZ2V0cyBhIHZlYzQuIFRoaXMgaXMgYmFkCisJICAqIHBhY2tpbmcgZm9yIHRoaW5ncyBsaWtlIGZsb2F0cywgYnV0IG90aGVyd2lzZSBhcnJheXMgYmVjb21lIGEKKwkgICogbWVzcy4gIEhvcGVmdWxseSBhIGxhdGVyIHBhc3Mgb3ZlciB0aGUgY29kZSBjYW4gcGFjayBzY2FsYXJzCisJICAqIGRvd24gaWYgYXBwcm9wcmlhdGUuCisJICAqLworCSByZXR1cm4gMTsKKyAgICAgIH0KKyAgIGNhc2UgR0xTTF9UWVBFX0FSUkFZOgorICAgICAgYXNzZXJ0KHR5cGUtPmxlbmd0aCA+IDApOworICAgICAgcmV0dXJuIHR5cGVfc2l6ZSh0eXBlLT5maWVsZHMuYXJyYXkpICogdHlwZS0+bGVuZ3RoOworICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOgorICAgICAgc2l6ZSA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgc2l6ZSArPSB0eXBlX3NpemUodHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzaXplOworICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKyAgICAgIC8qIFNhbXBsZXJzIHRha2UgdXAgb25lIHNsb3QgaW4gVU5JRk9STVNbXSwgYnV0IHRoZXkncmUgYmFrZWQgaW4KKyAgICAgICAqIGF0IGxpbmsgdGltZS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIDE7CisgICBjYXNlIEdMU0xfVFlQRV9BVE9NSUNfVUlOVDoKKyAgICAgIHJldHVybiAwOworICAgY2FzZSBHTFNMX1RZUEVfSU1BR0U6CisgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICBjYXNlIEdMU0xfVFlQRV9JTlRFUkZBQ0U6CisgICAgICBhc3NlcnQoMCk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK2ludAordmVjNF92aXNpdG9yOjp2aXJ0dWFsX2dyZl9hbGxvYyhpbnQgc2l6ZSkKK3sKKyAgIGlmICh2aXJ0dWFsX2dyZl9hcnJheV9zaXplIDw9IHZpcnR1YWxfZ3JmX2NvdW50KSB7CisgICAgICBpZiAodmlydHVhbF9ncmZfYXJyYXlfc2l6ZSA9PSAwKQorCSB2aXJ0dWFsX2dyZl9hcnJheV9zaXplID0gMTY7CisgICAgICBlbHNlCisJIHZpcnR1YWxfZ3JmX2FycmF5X3NpemUgKj0gMjsKKyAgICAgIHZpcnR1YWxfZ3JmX3NpemVzID0gcmVyYWxsb2MobWVtX2N0eCwgdmlydHVhbF9ncmZfc2l6ZXMsIGludCwKKwkJCQkgICB2aXJ0dWFsX2dyZl9hcnJheV9zaXplKTsKKyAgICAgIHZpcnR1YWxfZ3JmX3JlZ19tYXAgPSByZXJhbGxvYyhtZW1fY3R4LCB2aXJ0dWFsX2dyZl9yZWdfbWFwLCBpbnQsCisJCQkJICAgICB2aXJ0dWFsX2dyZl9hcnJheV9zaXplKTsKKyAgIH0KKyAgIHZpcnR1YWxfZ3JmX3JlZ19tYXBbdmlydHVhbF9ncmZfY291bnRdID0gdmlydHVhbF9ncmZfcmVnX2NvdW50OworICAgdmlydHVhbF9ncmZfcmVnX2NvdW50ICs9IHNpemU7CisgICB2aXJ0dWFsX2dyZl9zaXplc1t2aXJ0dWFsX2dyZl9jb3VudF0gPSBzaXplOworICAgcmV0dXJuIHZpcnR1YWxfZ3JmX2NvdW50Kys7Cit9CisKK3NyY19yZWc6OnNyY19yZWcoY2xhc3MgdmVjNF92aXNpdG9yICp2LCBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaW5pdCgpOworCisgICB0aGlzLT5maWxlID0gR1JGOworICAgdGhpcy0+cmVnID0gdi0+dmlydHVhbF9ncmZfYWxsb2ModHlwZV9zaXplKHR5cGUpKTsKKworICAgaWYgKHR5cGUtPmlzX2FycmF5KCkgfHwgdHlwZS0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIHRoaXMtPnN3aXp6bGUgPSBCUldfU1dJWlpMRV9OT09QOworICAgfSBlbHNlIHsKKyAgICAgIHRoaXMtPnN3aXp6bGUgPSBzd2l6emxlX2Zvcl9zaXplKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICB9CisKKyAgIHRoaXMtPnR5cGUgPSBicndfdHlwZV9mb3JfYmFzZV90eXBlKHR5cGUpOworfQorCitkc3RfcmVnOjpkc3RfcmVnKGNsYXNzIHZlYzRfdmlzaXRvciAqdiwgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGluaXQoKTsKKworICAgdGhpcy0+ZmlsZSA9IEdSRjsKKyAgIHRoaXMtPnJlZyA9IHYtPnZpcnR1YWxfZ3JmX2FsbG9jKHR5cGVfc2l6ZSh0eXBlKSk7CisKKyAgIGlmICh0eXBlLT5pc19hcnJheSgpIHx8IHR5cGUtPmlzX3JlY29yZCgpKSB7CisgICAgICB0aGlzLT53cml0ZW1hc2sgPSBXUklURU1BU0tfWFlaVzsKKyAgIH0gZWxzZSB7CisgICAgICB0aGlzLT53cml0ZW1hc2sgPSAoMSA8PCB0eXBlLT52ZWN0b3JfZWxlbWVudHMpIC0gMTsKKyAgIH0KKworICAgdGhpcy0+dHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUodHlwZSk7Cit9CisKKy8qIE91ciBzdXBwb3J0IGZvciB1bmlmb3JtcyBpcyBwaWdneS1iYWNrZWQgb24gdGhlIHN0cnVjdAorICogZ2xfZnJhZ21lbnRfcHJvZ3JhbSwgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgdGhlIHZhbHVlcyBhY3R1YWxseQorICogZ2V0IHN0b3JlZCwgcmF0aGVyIHRoYW4gaW4gc29tZSBnbG9iYWwgZ2xfc2hhZGVyX3Byb2dyYW0gdW5pZm9ybQorICogc3RvcmUuCisgKi8KK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6c2V0dXBfdW5pZm9ybV92YWx1ZXMoaXJfdmFyaWFibGUgKmlyKQoreworICAgaW50IG5hbWVsZW4gPSBzdHJsZW4oaXItPm5hbWUpOworCisgICAvKiBUaGUgZGF0YSBmb3Igb3VyIChub24tYnVpbHRpbikgdW5pZm9ybXMgaXMgc3RvcmVkIGluIGEgc2VyaWVzIG9mCisgICAgKiBnbF91bmlmb3JtX2RyaXZlcl9zdG9yYWdlIHN0cnVjdHMgZm9yIGVhY2ggc3ViY29tcG9uZW50IHRoYXQKKyAgICAqIGdsR2V0VW5pZm9ybUxvY2F0aW9uKCkgY291bGQgbmFtZS4gIFdlIGtub3cgaXQncyBiZWVuIHNldCB1cCBpbiB0aGUgc2FtZQorICAgICogb3JkZXIgd2UnZCB3YWxrIHRoZSB0eXBlLCBzbyB3YWxrIHRoZSBsaXN0IG9mIHN0b3JhZ2UgYW5kIGZpbmQgYW55dGhpbmcKKyAgICAqIHdpdGggb3VyIG5hbWUsIG9yIHRoZSBwcmVmaXggb2YgYSBjb21wb25lbnQgdGhhdCBzdGFydHMgd2l0aCBvdXIgbmFtZS4KKyAgICAqLworICAgZm9yICh1bnNpZ25lZCB1ID0gMDsgdSA8IHNoYWRlcl9wcm9nLT5OdW1Vc2VyVW5pZm9ybVN0b3JhZ2U7IHUrKykgeworICAgICAgc3RydWN0IGdsX3VuaWZvcm1fc3RvcmFnZSAqc3RvcmFnZSA9ICZzaGFkZXJfcHJvZy0+VW5pZm9ybVN0b3JhZ2VbdV07CisKKyAgICAgIGlmIChzdHJuY21wKGlyLT5uYW1lLCBzdG9yYWdlLT5uYW1lLCBuYW1lbGVuKSAhPSAwIHx8CisgICAgICAgICAgKHN0b3JhZ2UtPm5hbWVbbmFtZWxlbl0gIT0gMCAmJgorICAgICAgICAgICBzdG9yYWdlLT5uYW1lW25hbWVsZW5dICE9ICcuJyAmJgorICAgICAgICAgICBzdG9yYWdlLT5uYW1lW25hbWVsZW5dICE9ICdbJykpIHsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBnbF9jb25zdGFudF92YWx1ZSAqY29tcG9uZW50cyA9IHN0b3JhZ2UtPnN0b3JhZ2U7CisgICAgICB1bnNpZ25lZCB2ZWN0b3JfY291bnQgPSAoTUFYMihzdG9yYWdlLT5hcnJheV9lbGVtZW50cywgMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPnR5cGUtPm1hdHJpeF9jb2x1bW5zKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBzID0gMDsgcyA8IHZlY3Rvcl9jb3VudDsgcysrKSB7CisgICAgICAgICBhc3NlcnQodW5pZm9ybXMgPCB1bmlmb3JtX2FycmF5X3NpemUpOworICAgICAgICAgdW5pZm9ybV92ZWN0b3Jfc2l6ZVt1bmlmb3Jtc10gPSBzdG9yYWdlLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7CisKKyAgICAgICAgIGludCBpOworICAgICAgICAgZm9yIChpID0gMDsgaSA8IHVuaWZvcm1fdmVjdG9yX3NpemVbdW5pZm9ybXNdOyBpKyspIHsKKyAgICAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+cGFyYW1bdW5pZm9ybXMgKiA0ICsgaV0gPSAmY29tcG9uZW50cy0+ZjsKKyAgICAgICAgICAgIGNvbXBvbmVudHMrKzsKKyAgICAgICAgIH0KKyAgICAgICAgIGZvciAoOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBzdGF0aWMgZmxvYXQgemVybyA9IDA7CisgICAgICAgICAgICBzdGFnZV9wcm9nX2RhdGEtPnBhcmFtW3VuaWZvcm1zICogNCArIGldID0gJnplcm87CisgICAgICAgICB9CisKKyAgICAgICAgIHVuaWZvcm1zKys7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6c2V0dXBfdW5pZm9ybV9jbGlwcGxhbmVfdmFsdWVzKCkKK3sKKy8vICAgZ2xfY2xpcF9wbGFuZSAqY2xpcF9wbGFuZXMgPSBicndfc2VsZWN0X2NsaXBfcGxhbmVzKGN0eCk7CisvLworLy8gICBmb3IgKGludCBpID0gMDsgaSA8IGtleS0+bnJfdXNlcmNsaXBfcGxhbmVfY29uc3RzOyArK2kpIHsKKy8vICAgICAgYXNzZXJ0KHRoaXMtPnVuaWZvcm1zIDwgdW5pZm9ybV9hcnJheV9zaXplKTsKKy8vICAgICAgdGhpcy0+dW5pZm9ybV92ZWN0b3Jfc2l6ZVt0aGlzLT51bmlmb3Jtc10gPSA0OworLy8gICAgICB0aGlzLT51c2VycGxhbmVbaV0gPSBkc3RfcmVnKFVOSUZPUk0sIHRoaXMtPnVuaWZvcm1zKTsKKy8vICAgICAgdGhpcy0+dXNlcnBsYW5lW2ldLnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9GOworLy8gICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworLy8gICAgICAgICBzdGFnZV9wcm9nX2RhdGEtPnBhcmFtW3RoaXMtPnVuaWZvcm1zICogNCArIGpdID0gJmNsaXBfcGxhbmVzW2ldW2pdOworLy8gICAgICB9CisvLyAgICAgICsrdGhpcy0+dW5pZm9ybXM7CisvLyAgIH0KKyAgIGFzc2VydCghIm5vIGdsX0NsaXBQbGFuZSBzdXBwb3J0Iik7Cit9CisKKy8qIE91ciBzdXBwb3J0IGZvciBidWlsdGluIHVuaWZvcm1zIGlzIGV2ZW4gc2NhcmllciB0aGFuIG5vbi1idWlsdGluLgorICogSXQgc2l0cyBvbiB0b3Agb2YgdGhlIFBST0dfU1RBVEVfVkFSIHBhcmFtZXRlcnMgdGhhdCBhcmUKKyAqIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBmcm9tIEdMIGNvbnRleHQgc3RhdGUuCisgKi8KK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6c2V0dXBfYnVpbHRpbl91bmlmb3JtX3ZhbHVlcyhpcl92YXJpYWJsZSAqaXIpCit7CisgICBjb25zdCBpcl9zdGF0ZV9zbG90ICpjb25zdCBzbG90cyA9IGlyLT5zdGF0ZV9zbG90czsKKyAgIGFzc2VydChpci0+c3RhdGVfc2xvdHMgIT0gTlVMTCk7CisKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXItPm51bV9zdGF0ZV9zbG90czsgaSsrKSB7CisgICAgICAvKiBUaGlzIHN0YXRlIHJlZmVyZW5jZSBoYXMgYWxyZWFkeSBiZWVuIHNldHVwIGJ5IGlyX3RvX21lc2EsCisgICAgICAgKiBidXQgd2UnbGwgZ2V0IHRoZSBzYW1lIGluZGV4IGJhY2sgaGVyZS4gIFdlIGNhbiByZWZlcmVuY2UKKyAgICAgICAqIFBhcmFtZXRlclZhbHVlcyBkaXJlY3RseSwgc2luY2UgdW5saWtlIGJyd19mcy5jcHAsIHdlIG5ldmVyCisgICAgICAgKiBhZGQgbmV3IHN0YXRlIHJlZmVyZW5jZXMgZHVyaW5nIGNvbXBpbGUuCisgICAgICAgKi8KKyAgICAgIGludCBpbmRleCA9IF9tZXNhX2FkZF9zdGF0ZV9yZWZlcmVuY2UodGhpcy0+cHJvZy0+UGFyYW1ldGVycywKKwkJCQkJICAgIChnbF9zdGF0ZV9pbmRleCAqKXNsb3RzW2ldLnRva2Vucyk7CisgICAgICBmbG9hdCAqdmFsdWVzID0gJnRoaXMtPnByb2ctPlBhcmFtZXRlcnMtPlBhcmFtZXRlclZhbHVlc1tpbmRleF1bMF0uZjsKKworICAgICAgYXNzZXJ0KHRoaXMtPnVuaWZvcm1zIDwgdW5pZm9ybV9hcnJheV9zaXplKTsKKyAgICAgIHRoaXMtPnVuaWZvcm1fdmVjdG9yX3NpemVbdGhpcy0+dW5pZm9ybXNdID0gMDsKKyAgICAgIC8qIEFkZCBlYWNoIG9mIHRoZSB1bmlxdWUgc3dpenpsZWQgY2hhbm5lbHMgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgKiBUaGlzIHdpbGwgZW5kIHVwIG1hdGNoaW5nIHRoZSBzaXplIG9mIHRoZSBnbHNsX3R5cGUgb2YgdGhpcyBmaWVsZC4KKyAgICAgICAqLworICAgICAgaW50IGxhc3Rfc3dpeiA9IC0xOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKwkgaW50IHN3aXogPSBHRVRfU1daKHNsb3RzW2ldLnN3aXp6bGUsIGopOworCSBsYXN0X3N3aXogPSBzd2l6OworCisJIHN0YWdlX3Byb2dfZGF0YS0+cGFyYW1bdGhpcy0+dW5pZm9ybXMgKiA0ICsgal0gPSAmdmFsdWVzW3N3aXpdOworCSBhc3NlcnQodGhpcy0+dW5pZm9ybXMgPCB1bmlmb3JtX2FycmF5X3NpemUpOworCSBpZiAoc3dpeiA8PSBsYXN0X3N3aXopCisJICAgIHRoaXMtPnVuaWZvcm1fdmVjdG9yX3NpemVbdGhpcy0+dW5pZm9ybXNdKys7CisgICAgICB9CisgICAgICB0aGlzLT51bmlmb3JtcysrOworICAgfQorfQorCitkc3RfcmVnICoKK3ZlYzRfdmlzaXRvcjo6dmFyaWFibGVfc3RvcmFnZShpcl92YXJpYWJsZSAqdmFyKQoreworICAgcmV0dXJuIChkc3RfcmVnICopaGFzaF90YWJsZV9maW5kKHRoaXMtPnZhcmlhYmxlX2h0LCB2YXIpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfYm9vbF90b19jb25kX2NvZGUoaXJfcnZhbHVlICppciwgdWludDMyX3QgKnByZWRpY2F0ZSkKK3sKKyAgIGlyX2V4cHJlc3Npb24gKmV4cHIgPSBpci0+YXNfZXhwcmVzc2lvbigpOworCisgICAqcHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisKKyAgIGlmIChleHByKSB7CisgICAgICBzcmNfcmVnIG9wWzJdOworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdDsKKworICAgICAgYXNzZXJ0KGV4cHItPmdldF9udW1fb3BlcmFuZHMoKSA8PSAyKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZXhwci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKwkgZXhwci0+b3BlcmFuZHNbaV0tPmFjY2VwdCh0aGlzKTsKKwkgb3BbaV0gPSB0aGlzLT5yZXN1bHQ7CisKKwkgcmVzb2x2ZV91ZF9uZWdhdGUoJm9wW2ldKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChleHByLT5vcGVyYXRpb24pIHsKKyAgICAgIGNhc2UgaXJfdW5vcF9sb2dpY19ub3Q6CisJIGluc3QgPSBlbWl0KEFORChkc3RfbnVsbF9kKCksIG9wWzBdLCBzcmNfcmVnKDEpKSk7CisJIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IEJSV19DT05ESVRJT05BTF9aOworCSBicmVhazsKKworICAgICAgY2FzZSBpcl9iaW5vcF9sb2dpY194b3I6CisJIGluc3QgPSBlbWl0KFhPUihkc3RfbnVsbF9kKCksIG9wWzBdLCBvcFsxXSkpOworCSBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTlo7CisJIGJyZWFrOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX29yOgorCSBpbnN0ID0gZW1pdChPUihkc3RfbnVsbF9kKCksIG9wWzBdLCBvcFsxXSkpOworCSBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTlo7CisJIGJyZWFrOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX2FuZDoKKwkgaW5zdCA9IGVtaXQoQU5EKGRzdF9udWxsX2QoKSwgb3BbMF0sIG9wWzFdKSk7CisJIGluc3QtPmNvbmRpdGlvbmFsX21vZCA9IEJSV19DT05ESVRJT05BTF9OWjsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgaXJfdW5vcF9mMmI6CisJIGlmIChicnctPmdlbiA+PSA2KSB7CisJICAgIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgb3BbMF0sIHNyY19yZWcoMC4wZiksIEJSV19DT05ESVRJT05BTF9OWikpOworCSB9IGVsc2UgeworCSAgICBpbnN0ID0gZW1pdChNT1YoZHN0X251bGxfZigpLCBvcFswXSkpOworCSAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTlo7CisJIH0KKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgaXJfdW5vcF9pMmI6CisJIGlmIChicnctPmdlbiA+PSA2KSB7CisJICAgIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgb3BbMF0sIHNyY19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworCSB9IGVsc2UgeworCSAgICBpbnN0ID0gZW1pdChNT1YoZHN0X251bGxfZCgpLCBvcFswXSkpOworCSAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTlo7CisJIH0KKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgaXJfYmlub3BfYWxsX2VxdWFsOgorCSBpbnN0ID0gZW1pdChDTVAoZHN0X251bGxfZCgpLCBvcFswXSwgb3BbMV0sIEJSV19DT05ESVRJT05BTF9aKSk7CisJICpwcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX0FMSUdOMTZfQUxMNEg7CisJIGJyZWFrOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2FueV9uZXF1YWw6CisJIGluc3QgPSBlbWl0KENNUChkc3RfbnVsbF9kKCksIG9wWzBdLCBvcFsxXSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisJICpwcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX0FMSUdOMTZfQU5ZNEg7CisJIGJyZWFrOworCisgICAgICBjYXNlIGlyX3Vub3BfYW55OgorCSBpbnN0ID0gZW1pdChDTVAoZHN0X251bGxfZCgpLCBvcFswXSwgc3JjX3JlZygwKSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisJICpwcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX0FMSUdOMTZfQU5ZNEg7CisJIGJyZWFrOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICAgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgICAgIGNhc2UgaXJfYmlub3BfbGVzczoKKyAgICAgIGNhc2UgaXJfYmlub3BfbGVxdWFsOgorICAgICAgY2FzZSBpcl9iaW5vcF9lcXVhbDoKKyAgICAgIGNhc2UgaXJfYmlub3BfbmVxdWFsOgorCSBlbWl0KENNUChkc3RfbnVsbF9kKCksIG9wWzBdLCBvcFsxXSwKKwkJICBicndfY29uZGl0aW9uYWxfZm9yX2NvbXBhcmlzb24oZXhwci0+b3BlcmF0aW9uKSkpOworCSBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKwkgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlyLT5hY2NlcHQodGhpcyk7CisKKyAgIHJlc29sdmVfdWRfbmVnYXRlKCZ0aGlzLT5yZXN1bHQpOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoQU5EKGRzdF9udWxsX2QoKSwKKwkJCQkJdGhpcy0+cmVzdWx0LCBzcmNfcmVnKDEpKSk7CisgICAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTlo7CisgICB9IGVsc2UgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoTU9WKGRzdF9udWxsX2QoKSwgdGhpcy0+cmVzdWx0KSk7CisgICAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBCUldfQ09ORElUSU9OQUxfTlo7CisgICB9Cit9CisKKy8qKgorICogRW1pdCBhIGdlbjYgSUYgc3RhdGVtZW50IHdpdGggdGhlIGNvbXBhcmlzb24gZm9sZGVkIGludG8gdGhlIElGCisgKiBpbnN0cnVjdGlvbi4KKyAqLwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X2lmX2dlbjYoaXJfaWYgKmlyKQoreworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IGlyLT5jb25kaXRpb24tPmFzX2V4cHJlc3Npb24oKTsKKworICAgaWYgKGV4cHIpIHsKKyAgICAgIHNyY19yZWcgb3BbMl07CisgICAgICBkc3RfcmVnIHRlbXA7CisKKyAgICAgIGFzc2VydChleHByLT5nZXRfbnVtX29wZXJhbmRzKCkgPD0gMik7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGV4cHItPmdldF9udW1fb3BlcmFuZHMoKTsgaSsrKSB7CisJIGV4cHItPm9wZXJhbmRzW2ldLT5hY2NlcHQodGhpcyk7CisJIG9wW2ldID0gdGhpcy0+cmVzdWx0OworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGV4cHItPm9wZXJhdGlvbikgeworICAgICAgY2FzZSBpcl91bm9wX2xvZ2ljX25vdDoKKwkgZW1pdChJRihvcFswXSwgc3JjX3JlZygwKSwgQlJXX0NPTkRJVElPTkFMX1opKTsKKwkgcmV0dXJuOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX3hvcjoKKwkgZW1pdChJRihvcFswXSwgb3BbMV0sIEJSV19DT05ESVRJT05BTF9OWikpOworCSByZXR1cm47CisKKyAgICAgIGNhc2UgaXJfYmlub3BfbG9naWNfb3I6CisJIHRlbXAgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6Ym9vbF90eXBlKTsKKwkgZW1pdChPUih0ZW1wLCBvcFswXSwgb3BbMV0pKTsKKwkgZW1pdChJRihzcmNfcmVnKHRlbXApLCBzcmNfcmVnKDApLCBCUldfQ09ORElUSU9OQUxfTlopKTsKKwkgcmV0dXJuOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX2FuZDoKKwkgdGVtcCA9IGRzdF9yZWcodGhpcywgZ2xzbF90eXBlOjpib29sX3R5cGUpOworCSBlbWl0KEFORCh0ZW1wLCBvcFswXSwgb3BbMV0pKTsKKwkgZW1pdChJRihzcmNfcmVnKHRlbXApLCBzcmNfcmVnKDApLCBCUldfQ09ORElUSU9OQUxfTlopKTsKKwkgcmV0dXJuOworCisgICAgICBjYXNlIGlyX3Vub3BfZjJiOgorCSBlbWl0KElGKG9wWzBdLCBzcmNfcmVnKDApLCBCUldfQ09ORElUSU9OQUxfTlopKTsKKwkgcmV0dXJuOworCisgICAgICBjYXNlIGlyX3Vub3BfaTJiOgorCSBlbWl0KElGKG9wWzBdLCBzcmNfcmVnKDApLCBCUldfQ09ORElUSU9OQUxfTlopKTsKKwkgcmV0dXJuOworCisgICAgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICAgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgICAgIGNhc2UgaXJfYmlub3BfbGVzczoKKyAgICAgIGNhc2UgaXJfYmlub3BfbGVxdWFsOgorICAgICAgY2FzZSBpcl9iaW5vcF9lcXVhbDoKKyAgICAgIGNhc2UgaXJfYmlub3BfbmVxdWFsOgorCSBlbWl0KElGKG9wWzBdLCBvcFsxXSwKKwkJIGJyd19jb25kaXRpb25hbF9mb3JfY29tcGFyaXNvbihleHByLT5vcGVyYXRpb24pKSk7CisJIHJldHVybjsKKworICAgICAgY2FzZSBpcl9iaW5vcF9hbGxfZXF1YWw6CisJIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgb3BbMF0sIG9wWzFdLCBCUldfQ09ORElUSU9OQUxfWikpOworCSBlbWl0KElGKEJSV19QUkVESUNBVEVfQUxJR04xNl9BTEw0SCkpOworCSByZXR1cm47CisKKyAgICAgIGNhc2UgaXJfYmlub3BfYW55X25lcXVhbDoKKwkgZW1pdChDTVAoZHN0X251bGxfZCgpLCBvcFswXSwgb3BbMV0sIEJSV19DT05ESVRJT05BTF9OWikpOworCSBlbWl0KElGKEJSV19QUkVESUNBVEVfQUxJR04xNl9BTlk0SCkpOworCSByZXR1cm47CisKKyAgICAgIGNhc2UgaXJfdW5vcF9hbnk6CisJIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgb3BbMF0sIHNyY19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworCSBlbWl0KElGKEJSV19QUkVESUNBVEVfQUxJR04xNl9BTlk0SCkpOworCSByZXR1cm47CisKKyAgICAgIGRlZmF1bHQ6CisJIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisJIGVtaXQoSUYob3BbMF0sIHNyY19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworCSByZXR1cm47CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlyLT5jb25kaXRpb24tPmFjY2VwdCh0aGlzKTsKKworICAgZW1pdChJRih0aGlzLT5yZXN1bHQsIHNyY19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIGRzdF9yZWcgKnJlZyA9IE5VTEw7CisKKyAgIGlmICh2YXJpYWJsZV9zdG9yYWdlKGlyKSkKKyAgICAgIHJldHVybjsKKworICAgc3dpdGNoIChpci0+ZGF0YS5tb2RlKSB7CisgICBjYXNlIGlyX3Zhcl9zaGFkZXJfaW46CisgICAgICByZWcgPSBuZXcobWVtX2N0eCkgZHN0X3JlZyhBVFRSLCBpci0+ZGF0YS5sb2NhdGlvbik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl92YXJfc2hhZGVyX291dDoKKyAgICAgIHJlZyA9IG5ldyhtZW1fY3R4KSBkc3RfcmVnKHRoaXMsIGlyLT50eXBlKTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlX3NpemUoaXItPnR5cGUpOyBpKyspIHsKKwkgb3V0cHV0X3JlZ1tpci0+ZGF0YS5sb2NhdGlvbiArIGldID0gKnJlZzsKKwkgb3V0cHV0X3JlZ1tpci0+ZGF0YS5sb2NhdGlvbiArIGldLnJlZ19vZmZzZXQgPSBpOworCSBvdXRwdXRfcmVnW2lyLT5kYXRhLmxvY2F0aW9uICsgaV0udHlwZSA9CisgICAgICAgICAgICBicndfdHlwZV9mb3JfYmFzZV90eXBlKGlyLT50eXBlLT5nZXRfc2NhbGFyX3R5cGUoKSk7CisJIG91dHB1dF9yZWdfYW5ub3RhdGlvbltpci0+ZGF0YS5sb2NhdGlvbiArIGldID0gaXItPm5hbWU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl92YXJfYXV0bzoKKyAgIGNhc2UgaXJfdmFyX3RlbXBvcmFyeToKKyAgICAgIHJlZyA9IG5ldyhtZW1fY3R4KSBkc3RfcmVnKHRoaXMsIGlyLT50eXBlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Zhcl91bmlmb3JtOgorICAgICAgcmVnID0gbmV3KHRoaXMtPm1lbV9jdHgpIGRzdF9yZWcoVU5JRk9STSwgdGhpcy0+dW5pZm9ybXMpOworCisgICAgICAvKiBUaGFua3MgdG8gdGhlIGxvd2VyX3Vib19yZWZlcmVuY2UgcGFzcywgd2Ugd2lsbCBzZWUgb25seQorICAgICAgICogaXJfYmlub3BfdWJvX2xvYWQgZXhwcmVzc2lvbnMgYW5kIG5vdCBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSBmb3IgVUJPCisgICAgICAgKiB2YXJpYWJsZXMsIHNvIG5vIG5lZWQgZm9yIHRoZW0gdG8gYmUgaW4gdmFyaWFibGVfaHQuCisgICAgICAgKgorICAgICAgICogQXRvbWljIGNvdW50ZXJzIHRha2Ugbm8gdW5pZm9ybSBzdG9yYWdlLCBubyBuZWVkIHRvIGRvCisgICAgICAgKiBhbnl0aGluZyBoZXJlLgorICAgICAgICovCisgICAgICBpZiAoaXItPmlzX2luX3VuaWZvcm1fYmxvY2soKSB8fCBpci0+dHlwZS0+Y29udGFpbnNfYXRvbWljKCkpCisgICAgICAgICByZXR1cm47CisKKyAgICAgIC8qIFRyYWNrIGhvdyBiaWcgdGhlIHdob2xlIHVuaWZvcm0gdmFyaWFibGUgaXMsIGluIGNhc2Ugd2UgbmVlZCB0byBwdXQgYQorICAgICAgICogY29weSBvZiBpdHMgZGF0YSBpbnRvIHB1bGwgY29uc3RhbnRzIGZvciBhcnJheSBhY2Nlc3MuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCh0aGlzLT51bmlmb3JtcyA8IHVuaWZvcm1fYXJyYXlfc2l6ZSk7CisgICAgICB0aGlzLT51bmlmb3JtX3NpemVbdGhpcy0+dW5pZm9ybXNdID0gdHlwZV9zaXplKGlyLT50eXBlKTsKKworICAgICAgaWYgKCFzdHJuY21wKGlyLT5uYW1lLCAiZ2xfIiwgMykpIHsKKwkgc2V0dXBfYnVpbHRpbl91bmlmb3JtX3ZhbHVlcyhpcik7CisgICAgICB9IGVsc2UgeworCSBzZXR1cF91bmlmb3JtX3ZhbHVlcyhpcik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl92YXJfc3lzdGVtX3ZhbHVlOgorICAgICAgcmVnID0gbWFrZV9yZWdfZm9yX3N5c3RlbV92YWx1ZShpcik7CisgICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICB9CisKKyAgIHJlZy0+dHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUoaXItPnR5cGUpOworICAgaGFzaF90YWJsZV9pbnNlcnQodGhpcy0+dmFyaWFibGVfaHQsIHJlZywgaXIpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX2xvb3AgKmlyKQoreworICAgLyogV2UgZG9uJ3Qgd2FudCBkZWJ1Z2dpbmcgb3V0cHV0IHRvIHByaW50IHRoZSB3aG9sZSBib2R5IG9mIHRoZQorICAgICogbG9vcCBhcyB0aGUgYW5ub3RhdGlvbi4KKyAgICAqLworICAgdGhpcy0+YmFzZV9pciA9IE5VTEw7CisKKyAgIGVtaXQoQlJXX09QQ09ERV9ETyk7CisKKyAgIHZpc2l0X2luc3RydWN0aW9ucygmaXItPmJvZHlfaW5zdHJ1Y3Rpb25zKTsKKworICAgZW1pdChCUldfT1BDT0RFX1dISUxFKTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjp2aXNpdChpcl9sb29wX2p1bXAgKmlyKQoreworICAgc3dpdGNoIChpci0+bW9kZSkgeworICAgY2FzZSBpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWs6CisgICAgICBlbWl0KEJSV19PUENPREVfQlJFQUspOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2xvb3BfanVtcDo6anVtcF9jb250aW51ZToKKyAgICAgIGVtaXQoQlJXX09QQ09ERV9DT05USU5VRSk7CisgICAgICBicmVhazsKKyAgIH0KK30KKworCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqaXIpCit7CisgICBhc3NlcnQoMCk7CisgICAodm9pZClpcjsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjp2aXNpdChpcl9mdW5jdGlvbiAqaXIpCit7CisgICAvKiBJZ25vcmUgZnVuY3Rpb24gYm9kaWVzIG90aGVyIHRoYW4gbWFpbigpIC0tIHdlIHNob3VsZG4ndCBzZWUgY2FsbHMgdG8KKyAgICAqIHRoZW0gc2luY2UgdGhleSBzaG91bGQgYWxsIGJlIGlubGluZWQuCisgICAgKi8KKyAgIGlmIChzdHJjbXAoaXItPm5hbWUsICJtYWluIikgPT0gMCkgeworICAgICAgY29uc3QgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWc7CisgICAgICBleGVjX2xpc3QgZW1wdHk7CisKKyAgICAgIHNpZyA9IGlyLT5tYXRjaGluZ19zaWduYXR1cmUoTlVMTCwgJmVtcHR5KTsKKworICAgICAgYXNzZXJ0KHNpZyk7CisKKyAgICAgIHZpc2l0X2luc3RydWN0aW9ucygmc2lnLT5ib2R5KTsKKyAgIH0KK30KKworYm9vbAordmVjNF92aXNpdG9yOjp0cnlfZW1pdF9zYXQoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICBpcl9ydmFsdWUgKnNhdF9zcmMgPSBpci0+YXNfcnZhbHVlX3RvX3NhdHVyYXRlKCk7CisgICBpZiAoIXNhdF9zcmMpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHNhdF9zcmMtPmFjY2VwdCh0aGlzKTsKKyAgIHNyY19yZWcgc3JjID0gdGhpcy0+cmVzdWx0OworCisgICB0aGlzLT5yZXN1bHQgPSBzcmNfcmVnKHRoaXMsIGlyLT50eXBlKTsKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3Q7CisgICBpbnN0ID0gZW1pdChNT1YoZHN0X3JlZyh0aGlzLT5yZXN1bHQpLCBzcmMpKTsKKyAgIGluc3QtPnNhdHVyYXRlID0gdHJ1ZTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK3ZlYzRfdmlzaXRvcjo6dHJ5X2VtaXRfbWFkKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgLyogMy1zcmMgaW5zdHJ1Y3Rpb25zIHdlcmUgaW50cm9kdWNlZCBpbiBnZW42LiAqLworICAgaWYgKGJydy0+Z2VuIDwgNikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgLyogTUFEIGNhbiBvbmx5IGhhbmRsZSBmbG9hdGluZy1wb2ludCBkYXRhLiAqLworICAgaWYgKGlyLT50eXBlLT5iYXNlX3R5cGUgIT0gR0xTTF9UWVBFX0ZMT0FUKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpcl9ydmFsdWUgKm5vbm11bCA9IGlyLT5vcGVyYW5kc1sxXTsKKyAgIGlyX2V4cHJlc3Npb24gKm11bCA9IGlyLT5vcGVyYW5kc1swXS0+YXNfZXhwcmVzc2lvbigpOworCisgICBpZiAoIW11bCB8fCBtdWwtPm9wZXJhdGlvbiAhPSBpcl9iaW5vcF9tdWwpIHsKKyAgICAgIG5vbm11bCA9IGlyLT5vcGVyYW5kc1swXTsKKyAgICAgIG11bCA9IGlyLT5vcGVyYW5kc1sxXS0+YXNfZXhwcmVzc2lvbigpOworCisgICAgICBpZiAoIW11bCB8fCBtdWwtPm9wZXJhdGlvbiAhPSBpcl9iaW5vcF9tdWwpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIG5vbm11bC0+YWNjZXB0KHRoaXMpOworICAgc3JjX3JlZyBzcmMwID0gZml4XzNzcmNfb3BlcmFuZCh0aGlzLT5yZXN1bHQpOworCisgICBtdWwtPm9wZXJhbmRzWzBdLT5hY2NlcHQodGhpcyk7CisgICBzcmNfcmVnIHNyYzEgPSBmaXhfM3NyY19vcGVyYW5kKHRoaXMtPnJlc3VsdCk7CisKKyAgIG11bC0+b3BlcmFuZHNbMV0tPmFjY2VwdCh0aGlzKTsKKyAgIHNyY19yZWcgc3JjMiA9IGZpeF8zc3JjX29wZXJhbmQodGhpcy0+cmVzdWx0KTsKKworICAgdGhpcy0+cmVzdWx0ID0gc3JjX3JlZyh0aGlzLCBpci0+dHlwZSk7CisgICBlbWl0KEJSV19PUENPREVfTUFELCBkc3RfcmVnKHRoaXMtPnJlc3VsdCksIHNyYzAsIHNyYzEsIHNyYzIpOworCisgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X2Jvb2xfY29tcGFyaXNvbih1bnNpZ25lZCBpbnQgb3AsCisJCQkJIGRzdF9yZWcgZHN0LCBzcmNfcmVnIHNyYzAsIHNyY19yZWcgc3JjMSkKK3sKKyAgIC8qIG9yaWdpbmFsIGdlbjQgZG9lcyBkZXN0aW5hdGlvbiBjb252ZXJzaW9uIGJlZm9yZSBjb21wYXJpc29uLiAqLworICAgaWYgKGJydy0+Z2VuIDwgNSkKKyAgICAgIGRzdC50eXBlID0gc3JjMC50eXBlOworCisgICBlbWl0KENNUChkc3QsIHNyYzAsIHNyYzEsIGJyd19jb25kaXRpb25hbF9mb3JfY29tcGFyaXNvbihvcCkpKTsKKworICAgZHN0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9EOworICAgZW1pdChBTkQoZHN0LCBzcmNfcmVnKGRzdCksIHNyY19yZWcoMHgxKSkpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfbWlubWF4KHVpbnQzMl90IGNvbmRpdGlvbmFsbW9kLCBkc3RfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpCit7CisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0OworCisgICBpZiAoYnJ3LT5nZW4gPj0gNikgeworICAgICAgaW5zdCA9IGVtaXQoQlJXX09QQ09ERV9TRUwsIGRzdCwgc3JjMCwgc3JjMSk7CisgICAgICBpbnN0LT5jb25kaXRpb25hbF9tb2QgPSBjb25kaXRpb25hbG1vZDsKKyAgIH0gZWxzZSB7CisgICAgICBlbWl0KENNUChkc3QsIHNyYzAsIHNyYzEsIGNvbmRpdGlvbmFsbW9kKSk7CisKKyAgICAgIGluc3QgPSBlbWl0KEJSV19PUENPREVfU0VMLCBkc3QsIHNyYzAsIHNyYzEpOworICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICB9Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6ZW1pdF9scnAoY29uc3QgZHN0X3JlZyAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmNfcmVnICZ4LCBjb25zdCBzcmNfcmVnICZ5LCBjb25zdCBzcmNfcmVnICZhKQoreworICAgaWYgKGJydy0+Z2VuID49IDYpIHsKKyAgICAgIC8qIE5vdGUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24ncyBhcmd1bWVudCBvcmRlciBpcyByZXZlcnNlZCBmcm9tIEdMU0wKKyAgICAgICAqIGFuZCB0aGUgSVIuCisgICAgICAgKi8KKyAgICAgIGVtaXQoTFJQKGRzdCwKKyAgICAgICAgICAgICAgIGZpeF8zc3JjX29wZXJhbmQoYSksIGZpeF8zc3JjX29wZXJhbmQoeSksIGZpeF8zc3JjX29wZXJhbmQoeCkpKTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBFYXJsaWVyIGdlbmVyYXRpb25zIGRvbid0IHN1cHBvcnQgdGhyZWUgc291cmNlIG9wZXJhdGlvbnMsIHNvIHdlCisgICAgICAgKiBuZWVkIHRvIGVtaXQgeCooMS1hKSArIHkqYS4KKyAgICAgICAqLworICAgICAgZHN0X3JlZyB5X3RpbWVzX2EgICAgICAgICAgID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisgICAgICBkc3RfcmVnIG9uZV9taW51c19hICAgICAgICAgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgICAgIGRzdF9yZWcgeF90aW1lc19vbmVfbWludXNfYSA9IGRzdF9yZWcodGhpcywgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgeV90aW1lc19hLndyaXRlbWFzayAgICAgICAgICAgPSBkc3Qud3JpdGVtYXNrOworICAgICAgb25lX21pbnVzX2Eud3JpdGVtYXNrICAgICAgICAgPSBkc3Qud3JpdGVtYXNrOworICAgICAgeF90aW1lc19vbmVfbWludXNfYS53cml0ZW1hc2sgPSBkc3Qud3JpdGVtYXNrOworCisgICAgICBlbWl0KE1VTCh5X3RpbWVzX2EsIHksIGEpKTsKKyAgICAgIGVtaXQoQUREKG9uZV9taW51c19hLCBuZWdhdGUoYSksIHNyY19yZWcoMS4wZikpKTsKKyAgICAgIGVtaXQoTVVMKHhfdGltZXNfb25lX21pbnVzX2EsIHgsIHNyY19yZWcob25lX21pbnVzX2EpKSk7CisgICAgICBlbWl0KEFERChkc3QsIHNyY19yZWcoeF90aW1lc19vbmVfbWludXNfYSksIHNyY19yZWcoeV90aW1lc19hKSkpOworICAgfQorfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgdW5zaWduZWQgaW50IG9wZXJhbmQ7CisgICBzcmNfcmVnIG9wW0VsZW1lbnRzKGlyLT5vcGVyYW5kcyldOworICAgc3JjX3JlZyByZXN1bHRfc3JjOworICAgZHN0X3JlZyByZXN1bHRfZHN0OworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdDsKKworICAgaWYgKHRyeV9lbWl0X3NhdChpcikpCisgICAgICByZXR1cm47CisKKyAgIGlmIChpci0+b3BlcmF0aW9uID09IGlyX2Jpbm9wX2FkZCkgeworICAgICAgaWYgKHRyeV9lbWl0X21hZChpcikpCisJIHJldHVybjsKKyAgIH0KKworICAgZm9yIChvcGVyYW5kID0gMDsgb3BlcmFuZCA8IGlyLT5nZXRfbnVtX29wZXJhbmRzKCk7IG9wZXJhbmQrKykgeworICAgICAgdGhpcy0+cmVzdWx0LmZpbGUgPSBCQURfRklMRTsKKyAgICAgIGlyLT5vcGVyYW5kc1tvcGVyYW5kXS0+YWNjZXB0KHRoaXMpOworICAgICAgaWYgKHRoaXMtPnJlc3VsdC5maWxlID09IEJBRF9GSUxFKSB7CisJIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCB0cmVlIGZvciBleHByZXNzaW9uIG9wZXJhbmQ6XG4iKTsKKwkgaXItPm9wZXJhbmRzW29wZXJhbmRdLT5mcHJpbnQoc3RkZXJyKTsKKwkgZXhpdCgxKTsKKyAgICAgIH0KKyAgICAgIG9wW29wZXJhbmRdID0gdGhpcy0+cmVzdWx0OworCisgICAgICAvKiBNYXRyaXggZXhwcmVzc2lvbiBvcGVyYW5kcyBzaG91bGQgaGF2ZSBiZWVuIGJyb2tlbiBkb3duIHRvIHZlY3RvcgorICAgICAgICogb3BlcmF0aW9ucyBhbHJlYWR5LgorICAgICAgICovCisgICAgICBhc3NlcnQoIWlyLT5vcGVyYW5kc1tvcGVyYW5kXS0+dHlwZS0+aXNfbWF0cml4KCkpOworICAgfQorCisgICBpbnQgdmVjdG9yX2VsZW1lbnRzID0gaXItPm9wZXJhbmRzWzBdLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7CisgICBpZiAoaXItPm9wZXJhbmRzWzFdKSB7CisgICAgICB2ZWN0b3JfZWxlbWVudHMgPSBNQVgyKHZlY3Rvcl9lbGVtZW50cywKKwkJCSAgICAgaXItPm9wZXJhbmRzWzFdLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworICAgfQorCisgICB0aGlzLT5yZXN1bHQuZmlsZSA9IEJBRF9GSUxFOworCisgICAvKiBTdG9yYWdlIGZvciBvdXIgcmVzdWx0LiAgSWRlYWxseSBmb3IgYW4gYXNzaWdubWVudCB3ZSdkIGJlIHVzaW5nCisgICAgKiB0aGUgYWN0dWFsIHN0b3JhZ2UgZm9yIHRoZSByZXN1bHQgaGVyZSwgaW5zdGVhZC4KKyAgICAqLworICAgcmVzdWx0X3NyYyA9IHNyY19yZWcodGhpcywgaXItPnR5cGUpOworICAgLyogY29udmVuaWVuY2UgZm9yIHRoZSBlbWl0IGZ1bmN0aW9ucyBiZWxvdy4gKi8KKyAgIHJlc3VsdF9kc3QgPSBkc3RfcmVnKHJlc3VsdF9zcmMpOworICAgLyogSWYgbm90aGluZyBzcGVjaWFsIGhhcHBlbnMsIHRoaXMgaXMgdGhlIHJlc3VsdC4gKi8KKyAgIHRoaXMtPnJlc3VsdCA9IHJlc3VsdF9zcmM7CisgICAvKiBMaW1pdCB3cml0ZXMgdG8gdGhlIGNoYW5uZWxzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHJlc3VsdF9zcmMgbGF0ZXIuCisgICAgKiBUaGlzIGRvZXMgbGltaXQgdGhpcyB0ZW1wJ3MgdXNlIGFzIGEgdGVtcG9yYXJ5IGZvciBtdWx0aS1pbnN0cnVjdGlvbgorICAgICogc2VxdWVuY2VzLgorICAgICovCisgICByZXN1bHRfZHN0LndyaXRlbWFzayA9ICgxIDw8IGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIC0gMTsKKworICAgc3dpdGNoIChpci0+b3BlcmF0aW9uKSB7CisgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OgorICAgICAgLyogTm90ZSB0aGF0IEJSV19PUENPREVfTk9UIGlzIG5vdCBhcHByb3ByaWF0ZSBoZXJlLCBzaW5jZSBpdCBpcworICAgICAgICogb25lcyBjb21wbGVtZW50IG9mIHRoZSB3aG9sZSByZWdpc3Rlciwgbm90IGp1c3QgYml0IDAuCisgICAgICAgKi8KKyAgICAgIGVtaXQoWE9SKHJlc3VsdF9kc3QsIG9wWzBdLCBzcmNfcmVnKDEpKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9uZWc6CisgICAgICBvcFswXS5uZWdhdGUgPSAhb3BbMF0ubmVnYXRlOworICAgICAgZW1pdChNT1YocmVzdWx0X2RzdCwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2FiczoKKyAgICAgIG9wWzBdLmFicyA9IHRydWU7CisgICAgICBvcFswXS5uZWdhdGUgPSBmYWxzZTsKKyAgICAgIGVtaXQoTU9WKHJlc3VsdF9kc3QsIG9wWzBdKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3NpZ246CisgICAgICBpZiAoaXItPnR5cGUtPmlzX2Zsb2F0KCkpIHsKKyAgICAgICAgIC8qIEFORCh2YWwsIDB4ODAwMDAwMDApIGdpdmVzIHRoZSBzaWduIGJpdC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBQcmVkaWNhdGVkIE9SIE9ScyAxLjAgKDB4M2Y4MDAwMDApIHdpdGggdGhlIHNpZ24gYml0IGlmIHZhbCBpcyBub3QKKyAgICAgICAgICAqIHplcm8uCisgICAgICAgICAgKi8KKyAgICAgICAgIGVtaXQoQ01QKGRzdF9udWxsX2YoKSwgb3BbMF0sIHNyY19yZWcoMC4wZiksIEJSV19DT05ESVRJT05BTF9OWikpOworCisgICAgICAgICBvcFswXS50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVUQ7CisgICAgICAgICByZXN1bHRfZHN0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9VRDsKKyAgICAgICAgIGVtaXQoQU5EKHJlc3VsdF9kc3QsIG9wWzBdLCBzcmNfcmVnKDB4ODAwMDAwMDB1KSkpOworCisgICAgICAgICBpbnN0ID0gZW1pdChPUihyZXN1bHRfZHN0LCBzcmNfcmVnKHJlc3VsdF9kc3QpLCBzcmNfcmVnKDB4M2Y4MDAwMDB1KSkpOworICAgICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisKKyAgICAgICAgIHRoaXMtPnJlc3VsdC50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfRjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAvKiAgQVNSKHZhbCwgMzEpIC0+IG5lZ2F0aXZlIHZhbCBnZW5lcmF0ZXMgMHhmZmZmZmZmZiAoc2lnbmVkIC0xKS4KKyAgICAgICAgICAqICAgICAgICAgICAgICAgLT4gbm9uLW5lZ2F0aXZlIHZhbCBnZW5lcmF0ZXMgMHgwMDAwMDAwMC4KKyAgICAgICAgICAqICBQcmVkaWNhdGVkIE9SIHNldHMgMSBpZiB2YWwgaXMgcG9zaXRpdmUuCisgICAgICAgICAgKi8KKyAgICAgICAgIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgb3BbMF0sIHNyY19yZWcoMCksIEJSV19DT05ESVRJT05BTF9HKSk7CisKKyAgICAgICAgIGVtaXQoQVNSKHJlc3VsdF9kc3QsIG9wWzBdLCBzcmNfcmVnKDMxKSkpOworCisgICAgICAgICBpbnN0ID0gZW1pdChPUihyZXN1bHRfZHN0LCBzcmNfcmVnKHJlc3VsdF9kc3QpLCBzcmNfcmVnKDEpKSk7CisgICAgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfcmNwOgorICAgICAgZW1pdF9tYXRoKFNIQURFUl9PUENPREVfUkNQLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2V4cDI6CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9FWFAyLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9sb2cyOgorICAgICAgZW1pdF9tYXRoKFNIQURFUl9PUENPREVfTE9HMiwgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZXhwOgorICAgY2FzZSBpcl91bm9wX2xvZzoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiBzaG91bGQgYmUgaGFuZGxlZCBieSBpcl9leHBsb2dfdG9fZXhwbG9nMiIpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3Bfc2luOgorICAgY2FzZSBpcl91bm9wX3Npbl9yZWR1Y2VkOgorICAgICAgZW1pdF9tYXRoKFNIQURFUl9PUENPREVfU0lOLCByZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9jb3M6CisgICBjYXNlIGlyX3Vub3BfY29zX3JlZHVjZWQ6CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9DT1MsIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfZEZkeDoKKyAgIGNhc2UgaXJfdW5vcF9kRmR5OgorICAgICAgYXNzZXJ0KCEiZGVyaXZhdGl2ZXMgbm90IHZhbGlkIGluIHZlcnRleCBzaGFkZXIiKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfYml0ZmllbGRfcmV2ZXJzZToKKyAgICAgIGVtaXQoQkZSRVYocmVzdWx0X2RzdCwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2JpdF9jb3VudDoKKyAgICAgIGVtaXQoQ0JJVChyZXN1bHRfZHN0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZmluZF9tc2I6IHsKKyAgICAgIHNyY19yZWcgdGVtcCA9IHNyY19yZWcodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworCisgICAgICBpbnN0ID0gZW1pdChGQkgoZHN0X3JlZyh0ZW1wKSwgb3BbMF0pKTsKKyAgICAgIGluc3QtPmRzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWFlaVzsKKworICAgICAgLyogRkJIIGNvdW50cyBmcm9tIHRoZSBNU0Igc2lkZSwgd2hpbGUgR0xTTCdzIGZpbmRNU0IoKSB3YW50cyB0aGUgY291bnQKKyAgICAgICAqIGZyb20gdGhlIExTQiBzaWRlLiBJZiBGQkggZGlkbid0IHJldHVybiBhbiBlcnJvciAoMHhGRkZGRkZGRiksIHRoZW4KKyAgICAgICAqIHN1YnRyYWN0IHRoZSByZXN1bHQgZnJvbSAzMSB0byBjb252ZXJ0IHRoZSBNU0IgY291bnQgaW50byBhbiBMU0IgY291bnQuCisgICAgICAgKi8KKworICAgICAgLyogRkJIIG9ubHkgc3VwcG9ydHMgVUQgdHlwZSBmb3IgZHN0LCBzbyB1c2UgYSBNT1YgdG8gY29udmVydCBVRCB0byBELiAqLworICAgICAgdGVtcC5zd2l6emxlID0gQlJXX1NXSVpaTEVfTk9PUDsKKyAgICAgIGVtaXQoTU9WKHJlc3VsdF9kc3QsIHRlbXApKTsKKworICAgICAgc3JjX3JlZyBzcmNfdG1wID0gc3JjX3JlZyhyZXN1bHRfZHN0KTsKKyAgICAgIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgc3JjX3RtcCwgc3JjX3JlZygtMSksIEJSV19DT05ESVRJT05BTF9OWikpOworCisgICAgICBzcmNfdG1wLm5lZ2F0ZSA9IHRydWU7CisgICAgICBpbnN0ID0gZW1pdChBREQocmVzdWx0X2RzdCwgc3JjX3RtcCwgc3JjX3JlZygzMSkpKTsKKyAgICAgIGluc3QtPnByZWRpY2F0ZSA9IEJSV19QUkVESUNBVEVfTk9STUFMOworICAgICAgYnJlYWs7CisgICB9CisgICBjYXNlIGlyX3Vub3BfZmluZF9sc2I6CisgICAgICBlbWl0KEZCTChyZXN1bHRfZHN0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9ub2lzZToKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiBzaG91bGQgYmUgaGFuZGxlZCBieSBsb3dlcl9ub2lzZSIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfYWRkOgorICAgICAgZW1pdChBREQocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3Bfc3ViOgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IHNob3VsZCBiZSBoYW5kbGVkIGJ5IGlyX3N1Yl90b19hZGRfbmVnIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9tdWw6CisgICAgICBpZiAoYnJ3LT5nZW4gPCA4ICYmIGlyLT50eXBlLT5pc19pbnRlZ2VyKCkpIHsKKwkgLyogRm9yIGludGVnZXIgbXVsdGlwbGljYXRpb24sIHRoZSBNVUwgdXNlcyB0aGUgbG93IDE2IGJpdHMgb2Ygb25lIG9mCisJICAqIHRoZSBvcGVyYW5kcyAoc3JjMCB0aHJvdWdoIFNOQiwgc3JjMSBvbiBJVkIgYW5kIGxhdGVyKS4gIFRoZSBNQUNICisJICAqIGFjY3VtdWxhdGVzIGluIHRoZSBjb250cmlidXRpb24gb2YgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhhdAorCSAgKiBvcGVyYW5kLiAgSWYgd2UgY2FuIGRldGVybWluZSB0aGF0IG9uZSBvZiB0aGUgYXJncyBpcyBpbiB0aGUgbG93CisJICAqIDE2IGJpdHMsIHRob3VnaCwgd2UgY2FuIGp1c3QgZW1pdCBhIHNpbmdsZSBNVUwuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChpci0+b3BlcmFuZHNbMF0tPmlzX3VpbnQxNl9jb25zdGFudCgpKSB7CisgICAgICAgICAgICBpZiAoYnJ3LT5nZW4gPCA3KQorICAgICAgICAgICAgICAgZW1pdChNVUwocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBlbWl0KE1VTChyZXN1bHRfZHN0LCBvcFsxXSwgb3BbMF0pKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoaXItPm9wZXJhbmRzWzFdLT5pc191aW50MTZfY29uc3RhbnQoKSkgeworICAgICAgICAgICAgaWYgKGJydy0+Z2VuIDwgNykKKyAgICAgICAgICAgICAgIGVtaXQoTVVMKHJlc3VsdF9kc3QsIG9wWzFdLCBvcFswXSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZW1pdChNVUwocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgYWNjID0gcmV0eXBlKGJyd19hY2NfcmVnKCksIHJlc3VsdF9kc3QudHlwZSk7CisKKyAgICAgICAgICAgIGVtaXQoTVVMKGFjYywgb3BbMF0sIG9wWzFdKSk7CisgICAgICAgICAgICBlbWl0KE1BQ0goZHN0X251bGxfZCgpLCBvcFswXSwgb3BbMV0pKTsKKyAgICAgICAgICAgIGVtaXQoTU9WKHJlc3VsdF9kc3QsIHNyY19yZWcoYWNjKSkpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKwkgZW1pdChNVUwocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfaW11bF9oaWdoOiB7CisgICAgICBzdHJ1Y3QgYnJ3X3JlZyBhY2MgPSByZXR5cGUoYnJ3X2FjY19yZWcoKSwgcmVzdWx0X2RzdC50eXBlKTsKKworICAgICAgZW1pdChNVUwoYWNjLCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGVtaXQoTUFDSChyZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworICAgfQorICAgY2FzZSBpcl9iaW5vcF9kaXY6CisgICAgICAvKiBGbG9hdGluZyBwb2ludCBzaG91bGQgYmUgbG93ZXJlZCBieSBESVZfVE9fTVVMX1JDUCBpbiB0aGUgY29tcGlsZXIuICovCisgICAgICBhc3NlcnQoaXItPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9JTlRfUVVPVElFTlQsIHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfY2Fycnk6IHsKKyAgICAgIHN0cnVjdCBicndfcmVnIGFjYyA9IHJldHlwZShicndfYWNjX3JlZygpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisKKyAgICAgIGVtaXQoQUREQyhkc3RfbnVsbF91ZCgpLCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGVtaXQoTU9WKHJlc3VsdF9kc3QsIHNyY19yZWcoYWNjKSkpOworICAgICAgYnJlYWs7CisgICB9CisgICBjYXNlIGlyX2Jpbm9wX2JvcnJvdzogeworICAgICAgc3RydWN0IGJyd19yZWcgYWNjID0gcmV0eXBlKGJyd19hY2NfcmVnKCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgICAgZW1pdChTVUJCKGRzdF9udWxsX3VkKCksIG9wWzBdLCBvcFsxXSkpOworICAgICAgZW1pdChNT1YocmVzdWx0X2RzdCwgc3JjX3JlZyhhY2MpKSk7CisgICAgICBicmVhazsKKyAgIH0KKyAgIGNhc2UgaXJfYmlub3BfbW9kOgorICAgICAgLyogRmxvYXRpbmcgcG9pbnQgc2hvdWxkIGJlIGxvd2VyZWQgYnkgTU9EX1RPX0ZSQUNUIGluIHRoZSBjb21waWxlci4gKi8KKyAgICAgIGFzc2VydChpci0+dHlwZS0+aXNfaW50ZWdlcigpKTsKKyAgICAgIGVtaXRfbWF0aChTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVIsIHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgY2FzZSBpcl9iaW5vcF9ncmVhdGVyOgorICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX25lcXVhbDogeworICAgICAgZW1pdChDTVAocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdLAorCSAgICAgICBicndfY29uZGl0aW9uYWxfZm9yX2NvbXBhcmlzb24oaXItPm9wZXJhdGlvbikpKTsKKyAgICAgIGVtaXQoQU5EKHJlc3VsdF9kc3QsIHJlc3VsdF9zcmMsIHNyY19yZWcoMHgxKSkpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfYmlub3BfYWxsX2VxdWFsOgorICAgICAgLyogIj09IiBvcGVyYXRvciBwcm9kdWNpbmcgYSBzY2FsYXIgYm9vbGVhbi4gKi8KKyAgICAgIGlmIChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3ZlY3RvcigpIHx8CisJICBpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisJIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgb3BbMF0sIG9wWzFdLCBCUldfQ09ORElUSU9OQUxfWikpOworCSBlbWl0KE1PVihyZXN1bHRfZHN0LCBzcmNfcmVnKDApKSk7CisJIGluc3QgPSBlbWl0KE1PVihyZXN1bHRfZHN0LCBzcmNfcmVnKDEpKSk7CisJIGluc3QtPnByZWRpY2F0ZSA9IEJSV19QUkVESUNBVEVfQUxJR04xNl9BTEw0SDsKKyAgICAgIH0gZWxzZSB7CisJIGVtaXQoQ01QKHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSwgQlJXX0NPTkRJVElPTkFMX1opKTsKKwkgZW1pdChBTkQocmVzdWx0X2RzdCwgcmVzdWx0X3NyYywgc3JjX3JlZygweDEpKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfYW55X25lcXVhbDoKKyAgICAgIC8qICIhPSIgb3BlcmF0b3IgcHJvZHVjaW5nIGEgc2NhbGFyIGJvb2xlYW4uICovCisgICAgICBpZiAoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc192ZWN0b3IoKSB8fAorCSAgaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc192ZWN0b3IoKSkgeworCSBlbWl0KENNUChkc3RfbnVsbF9kKCksIG9wWzBdLCBvcFsxXSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisKKwkgZW1pdChNT1YocmVzdWx0X2RzdCwgc3JjX3JlZygwKSkpOworCSBpbnN0ID0gZW1pdChNT1YocmVzdWx0X2RzdCwgc3JjX3JlZygxKSkpOworCSBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX0FMSUdOMTZfQU5ZNEg7CisgICAgICB9IGVsc2UgeworCSBlbWl0KENNUChyZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0sIEJSV19DT05ESVRJT05BTF9OWikpOworCSBlbWl0KEFORChyZXN1bHRfZHN0LCByZXN1bHRfc3JjLCBzcmNfcmVnKDB4MSkpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfYW55OgorICAgICAgZW1pdChDTVAoZHN0X251bGxfZCgpLCBvcFswXSwgc3JjX3JlZygwKSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisgICAgICBlbWl0KE1PVihyZXN1bHRfZHN0LCBzcmNfcmVnKDApKSk7CisKKyAgICAgIGluc3QgPSBlbWl0KE1PVihyZXN1bHRfZHN0LCBzcmNfcmVnKDEpKSk7CisgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX0FMSUdOMTZfQU5ZNEg7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sb2dpY194b3I6CisgICAgICBlbWl0KFhPUihyZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX29yOgorICAgICAgZW1pdChPUihyZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX2FuZDoKKyAgICAgIGVtaXQoQU5EKHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfZG90OgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfdmVjdG9yKCkpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMV0tPnR5cGUpOworICAgICAgZW1pdF9kcChyZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0sIGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfc3FydDoKKyAgICAgIGVtaXRfbWF0aChTSEFERVJfT1BDT0RFX1NRUlQsIHJlc3VsdF9kc3QsIG9wWzBdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3JzcToKKyAgICAgIGVtaXRfbWF0aChTSEFERVJfT1BDT0RFX1JTUSwgcmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2kyZjoKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X3UyZjoKKyAgICAgIHRoaXMtPnJlc3VsdCA9IG9wWzBdOworICAgICAgdGhpcy0+cmVzdWx0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9GOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2YyaToKKyAgICAgIHRoaXMtPnJlc3VsdCA9IG9wWzBdOworICAgICAgdGhpcy0+cmVzdWx0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9EOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2YydToKKyAgICAgIHRoaXMtPnJlc3VsdCA9IG9wWzBdOworICAgICAgdGhpcy0+cmVzdWx0LnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9VRDsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfaTJmOgorICAgY2FzZSBpcl91bm9wX2kydToKKyAgIGNhc2UgaXJfdW5vcF91Mmk6CisgICBjYXNlIGlyX3Vub3BfdTJmOgorICAgY2FzZSBpcl91bm9wX2IyZjoKKyAgIGNhc2UgaXJfdW5vcF9iMmk6CisgICBjYXNlIGlyX3Vub3BfZjJpOgorICAgY2FzZSBpcl91bm9wX2YydToKKyAgICAgIGVtaXQoTU9WKHJlc3VsdF9kc3QsIG9wWzBdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9mMmI6CisgICBjYXNlIGlyX3Vub3BfaTJiOiB7CisgICAgICBlbWl0KENNUChyZXN1bHRfZHN0LCBvcFswXSwgc3JjX3JlZygwLjBmKSwgQlJXX0NPTkRJVElPTkFMX05aKSk7CisgICAgICBlbWl0KEFORChyZXN1bHRfZHN0LCByZXN1bHRfc3JjLCBzcmNfcmVnKDEpKSk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBpcl91bm9wX3RydW5jOgorICAgICAgZW1pdChSTkRaKHJlc3VsdF9kc3QsIG9wWzBdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9jZWlsOgorICAgICAgb3BbMF0ubmVnYXRlID0gIW9wWzBdLm5lZ2F0ZTsKKyAgICAgIGluc3QgPSBlbWl0KFJOREQocmVzdWx0X2RzdCwgb3BbMF0pKTsKKyAgICAgIHRoaXMtPnJlc3VsdC5uZWdhdGUgPSB0cnVlOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfZmxvb3I6CisgICAgICBpbnN0ID0gZW1pdChSTkREKHJlc3VsdF9kc3QsIG9wWzBdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9mcmFjdDoKKyAgICAgIGluc3QgPSBlbWl0KEZSQyhyZXN1bHRfZHN0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3Bfcm91bmRfZXZlbjoKKyAgICAgIGVtaXQoUk5ERShyZXN1bHRfZHN0LCBvcFswXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbWluOgorICAgICAgZW1pdF9taW5tYXgoQlJXX0NPTkRJVElPTkFMX0wsIHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfbWF4OgorICAgICAgZW1pdF9taW5tYXgoQlJXX0NPTkRJVElPTkFMX0csIHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9wb3c6CisgICAgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9QT1csIHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2JpdF9ub3Q6CisgICAgICBpbnN0ID0gZW1pdChOT1QocmVzdWx0X2RzdCwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9iaXRfYW5kOgorICAgICAgaW5zdCA9IGVtaXQoQU5EKHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2JpdF94b3I6CisgICAgICBpbnN0ID0gZW1pdChYT1IocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfYml0X29yOgorICAgICAgaW5zdCA9IGVtaXQoT1IocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sc2hpZnQ6CisgICAgICBpbnN0ID0gZW1pdChTSEwocmVzdWx0X2RzdCwgb3BbMF0sIG9wWzFdKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9yc2hpZnQ6CisgICAgICBpZiAoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKQorICAgICAgICAgaW5zdCA9IGVtaXQoQVNSKHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSkpOworICAgICAgZWxzZQorICAgICAgICAgaW5zdCA9IGVtaXQoU0hSKHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfYmZtOgorICAgICAgZW1pdChCRkkxKHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfdWJvX2xvYWQ6IHsKKyAgICAgIGlyX2NvbnN0YW50ICp1bmlmb3JtX2Jsb2NrID0gaXItPm9wZXJhbmRzWzBdLT5hc19jb25zdGFudCgpOworICAgICAgaXJfY29uc3RhbnQgKmNvbnN0X29mZnNldF9pciA9IGlyLT5vcGVyYW5kc1sxXS0+YXNfY29uc3RhbnQoKTsKKyAgICAgIHVuc2lnbmVkIGNvbnN0X29mZnNldCA9IGNvbnN0X29mZnNldF9pciA/IGNvbnN0X29mZnNldF9pci0+dmFsdWUudVswXSA6IDA7CisgICAgICBzcmNfcmVnIG9mZnNldDsKKworICAgICAgLyogTm93LCBsb2FkIHRoZSB2ZWN0b3IgZnJvbSB0aGF0IG9mZnNldC4gKi8KKyAgICAgIGFzc2VydChpci0+dHlwZS0+aXNfdmVjdG9yKCkgfHwgaXItPnR5cGUtPmlzX3NjYWxhcigpKTsKKworICAgICAgc3JjX3JlZyBwYWNrZWRfY29uc3RzID0gc3JjX3JlZyh0aGlzLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisgICAgICBwYWNrZWRfY29uc3RzLnR5cGUgPSByZXN1bHQudHlwZTsKKyAgICAgIHNyY19yZWcgc3VyZl9pbmRleCA9CisgICAgICAgICBzcmNfcmVnKHByb2dfZGF0YS0+YmFzZS5iaW5kaW5nX3RhYmxlLnVib19zdGFydCArIHVuaWZvcm1fYmxvY2stPnZhbHVlLnVbMF0pOworICAgICAgaWYgKGNvbnN0X29mZnNldF9pcikgeworICAgICAgICAgaWYgKGJydy0+Z2VuID49IDgpIHsKKyAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBvZmZzZXQgaW4gYSBHUkYgc28gd2UgY2FuIHNlbmQtZnJvbS1HUkYuICovCisgICAgICAgICAgICBvZmZzZXQgPSBzcmNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6aW50X3R5cGUpOworICAgICAgICAgICAgZW1pdChNT1YoZHN0X3JlZyhvZmZzZXQpLCBzcmNfcmVnKGNvbnN0X29mZnNldCAvIDE2KSkpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEltbWVkaWF0ZXMgYXJlIGZpbmUgb24gb2xkZXIgZ2VuZXJhdGlvbnMgc2luY2UgdGhleSdsbCBiZSBtb3ZlZAorICAgICAgICAgICAgICogdG8gYSAocG90ZW50aWFsbHkgZmFrZSkgTVJGIGF0IHRoZSBnZW5lcmF0b3IgbGV2ZWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHNyY19yZWcoY29uc3Rfb2Zmc2V0IC8gMTYpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgIG9mZnNldCA9IHNyY19yZWcodGhpcywgZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgICAgZW1pdChTSFIoZHN0X3JlZyhvZmZzZXQpLCBvcFsxXSwgc3JjX3JlZyg0KSkpOworICAgICAgfQorCisgICAgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgICAgZHN0X3JlZyBncmZfb2Zmc2V0ID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OmludF90eXBlKTsKKyAgICAgICAgIGdyZl9vZmZzZXQudHlwZSA9IG9mZnNldC50eXBlOworCisgICAgICAgICBlbWl0KE1PVihncmZfb2Zmc2V0LCBvZmZzZXQpKTsKKworICAgICAgICAgZW1pdChuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEX0dFTjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9yZWcocGFja2VkX2NvbnN0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcoZ3JmX29mZnNldCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICB2ZWM0X2luc3RydWN0aW9uICpwdWxsID0KKyAgICAgICAgICAgIGVtaXQobmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlNfT1BDT0RFX1BVTExfQ09OU1RBTlRfTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3JlZyhwYWNrZWRfY29uc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KSk7CisgICAgICAgICBwdWxsLT5iYXNlX21yZiA9IDE0OworICAgICAgICAgcHVsbC0+bWxlbiA9IDE7CisgICAgICB9CisKKyAgICAgIHBhY2tlZF9jb25zdHMuc3dpenpsZSA9IHN3aXp6bGVfZm9yX3NpemUoaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICAgICBwYWNrZWRfY29uc3RzLnN3aXp6bGUgKz0gQlJXX1NXSVpaTEU0KGNvbnN0X29mZnNldCAlIDE2IC8gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Rfb2Zmc2V0ICUgMTYgLyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9vZmZzZXQgJSAxNiAvIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X29mZnNldCAlIDE2IC8gNCk7CisKKyAgICAgIC8qIFVCTyBib29scyBhcmUgYW55IG5vbnplcm8gaW50LiAgV2Ugc3RvcmUgYm9vbHMgYXMgZWl0aGVyIDAgb3IgMS4gKi8KKyAgICAgIGlmIChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKSB7CisgICAgICAgICBlbWl0KENNUChyZXN1bHRfZHN0LCBwYWNrZWRfY29uc3RzLCBzcmNfcmVnKDB1KSwKKyAgICAgICAgICAgICAgICAgIEJSV19DT05ESVRJT05BTF9OWikpOworICAgICAgICAgZW1pdChBTkQocmVzdWx0X2RzdCwgcmVzdWx0LCBzcmNfcmVnKDB4MSkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBlbWl0KE1PVihyZXN1bHRfZHN0LCBwYWNrZWRfY29uc3RzKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdDoKKyAgICAgIGFzc2VydCghInNob3VsZCBoYXZlIGJlZW4gbG93ZXJlZCBieSB2ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ24iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2ZtYToKKyAgICAgIG9wWzBdID0gZml4XzNzcmNfb3BlcmFuZChvcFswXSk7CisgICAgICBvcFsxXSA9IGZpeF8zc3JjX29wZXJhbmQob3BbMV0pOworICAgICAgb3BbMl0gPSBmaXhfM3NyY19vcGVyYW5kKG9wWzJdKTsKKyAgICAgIC8qIE5vdGUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24ncyBhcmd1bWVudCBvcmRlciBpcyByZXZlcnNlZCBmcm9tIEdMU0wKKyAgICAgICAqIGFuZCB0aGUgSVIuCisgICAgICAgKi8KKyAgICAgIGVtaXQoTUFEKHJlc3VsdF9kc3QsIG9wWzJdLCBvcFsxXSwgb3BbMF0pKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2xycDoKKyAgICAgIGVtaXRfbHJwKHJlc3VsdF9kc3QsIG9wWzBdLCBvcFsxXSwgb3BbMl0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdHJpb3BfY3NlbDoKKyAgICAgIGVtaXQoQ01QKGRzdF9udWxsX2QoKSwgb3BbMF0sIHNyY19yZWcoMCksIEJSV19DT05ESVRJT05BTF9OWikpOworICAgICAgaW5zdCA9IGVtaXQoQlJXX09QQ09ERV9TRUwsIHJlc3VsdF9kc3QsIG9wWzFdLCBvcFsyXSk7CisgICAgICBpbnN0LT5wcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PUk1BTDsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2JmaToKKyAgICAgIG9wWzBdID0gZml4XzNzcmNfb3BlcmFuZChvcFswXSk7CisgICAgICBvcFsxXSA9IGZpeF8zc3JjX29wZXJhbmQob3BbMV0pOworICAgICAgb3BbMl0gPSBmaXhfM3NyY19vcGVyYW5kKG9wWzJdKTsKKyAgICAgIGVtaXQoQkZJMihyZXN1bHRfZHN0LCBvcFswXSwgb3BbMV0sIG9wWzJdKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF9iaXRmaWVsZF9leHRyYWN0OgorICAgICAgb3BbMF0gPSBmaXhfM3NyY19vcGVyYW5kKG9wWzBdKTsKKyAgICAgIG9wWzFdID0gZml4XzNzcmNfb3BlcmFuZChvcFsxXSk7CisgICAgICBvcFsyXSA9IGZpeF8zc3JjX29wZXJhbmQob3BbMl0pOworICAgICAgLyogTm90ZSB0aGF0IHRoZSBpbnN0cnVjdGlvbidzIGFyZ3VtZW50IG9yZGVyIGlzIHJldmVyc2VkIGZyb20gR0xTTAorICAgICAgICogYW5kIHRoZSBJUi4KKyAgICAgICAqLworICAgICAgZW1pdChCRkUocmVzdWx0X2RzdCwgb3BbMl0sIG9wWzFdLCBvcFswXSkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdHJpb3BfdmVjdG9yX2luc2VydDoKKyAgICAgIGFzc2VydCghInNob3VsZCBoYXZlIGJlZW4gbG93ZXJlZCBieSBsb3dlcl92ZWN0b3JfaW5zZXJ0Iik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9xdWFkb3BfYml0ZmllbGRfaW5zZXJ0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IHNob3VsZCBiZSBoYW5kbGVkIGJ5ICIKKyAgICAgICAgICAgICAgImJpdGZpZWxkX2luc2VydF90b19iZm1fYmZpXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3F1YWRvcF92ZWN0b3I6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogc2hvdWxkIGJlIGhhbmRsZWQgYnkgbG93ZXJfcXVhZG9wX3ZlY3RvciIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX2hhbGZfMngxNjoKKyAgICAgIGVtaXRfcGFja19oYWxmXzJ4MTYocmVzdWx0X2RzdCwgb3BbMF0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNjoKKyAgICAgIGVtaXRfdW5wYWNrX2hhbGZfMngxNihyZXN1bHRfZHN0LCBvcFswXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Nub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfcGFja19zbm9ybV80eDg6CisgICBjYXNlIGlyX3Vub3BfcGFja191bm9ybV8yeDE2OgorICAgY2FzZSBpcl91bm9wX3BhY2tfdW5vcm1fNHg4OgorICAgY2FzZSBpcl91bm9wX3VucGFja19zbm9ybV8yeDE2OgorICAgY2FzZSBpcl91bm9wX3VucGFja19zbm9ybV80eDg6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Vub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Vub3JtXzR4ODoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiBzaG91bGQgYmUgaGFuZGxlZCBieSBsb3dlcl9wYWNraW5nX2J1aWx0aW5zIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3g6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNl9zcGxpdF95OgorICAgY2FzZSBpcl9iaW5vcF9wYWNrX2hhbGZfMngxNl9zcGxpdDoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiBzaG91bGQgbm90IG9jY3VyIGluIHZlcnRleCBzaGFkZXIiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9sZGV4cDoKKyAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkOiBzaG91bGQgYmUgaGFuZGxlZCBieSBsZGV4cF90b19hcml0aCgpIik7CisgICAgICBicmVhazsKKyAgIH0KK30KKworCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX3N3aXp6bGUgKmlyKQoreworICAgc3JjX3JlZyBzcmM7CisgICBpbnQgaSA9IDA7CisgICBpbnQgc3dpenpsZVs0XTsKKworICAgLyogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBzd2l6emxlcyBpbiBleHByZXNzaW9ucywgbm90IHRob3NlIG9uIHRoZSBsZWZ0CisgICAgKiBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCwgd2hpY2ggZG8gd3JpdGUgbWFza2luZy4gIFNlZSBpcl9hc3NpZ25tZW50CisgICAgKiBmb3IgdGhhdC4KKyAgICAqLworCisgICBpci0+dmFsLT5hY2NlcHQodGhpcyk7CisgICBzcmMgPSB0aGlzLT5yZXN1bHQ7CisgICBhc3NlcnQoc3JjLmZpbGUgIT0gQkFEX0ZJTEUpOworCisgICBmb3IgKGkgPSAwOyBpIDwgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgIGNhc2UgMDoKKwkgc3dpenpsZVtpXSA9IEJSV19HRVRfU1daKHNyYy5zd2l6emxlLCBpci0+bWFzay54KTsKKwkgYnJlYWs7CisgICAgICBjYXNlIDE6CisJIHN3aXp6bGVbaV0gPSBCUldfR0VUX1NXWihzcmMuc3dpenpsZSwgaXItPm1hc2sueSk7CisJIGJyZWFrOworICAgICAgY2FzZSAyOgorCSBzd2l6emxlW2ldID0gQlJXX0dFVF9TV1ooc3JjLnN3aXp6bGUsIGlyLT5tYXNrLnopOworCSBicmVhazsKKyAgICAgIGNhc2UgMzoKKwkgc3dpenpsZVtpXSA9IEJSV19HRVRfU1daKHNyYy5zd2l6emxlLCBpci0+bWFzay53KTsKKwkgICAgYnJlYWs7CisgICAgICB9CisgICB9CisgICBmb3IgKDsgaSA8IDQgJiYgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyA8IDQgJiYgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyA+IDA7IGkrKykgeworICAgICAgLyogUmVwbGljYXRlIHRoZSBsYXN0IGNoYW5uZWwgb3V0LiAqLworICAgICAgc3dpenpsZVtpXSA9IHN3aXp6bGVbaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyAtIDFdOworICAgfQorCisgICBzcmMuc3dpenpsZSA9IEJSV19TV0laWkxFNChzd2l6emxlWzBdLCBzd2l6emxlWzFdLCBzd2l6emxlWzJdLCBzd2l6emxlWzNdKTsKKworICAgdGhpcy0+cmVzdWx0ID0gc3JjOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUgPSBpci0+dHlwZTsKKyAgIGRzdF9yZWcgKnJlZyA9IHZhcmlhYmxlX3N0b3JhZ2UoaXItPnZhcik7CisKKyAgIGlmICghcmVnKSB7CisgICAgICBmYWlsKCJGYWlsZWQgdG8gZmluZCB2YXJpYWJsZSBzdG9yYWdlIGZvciAlc1xuIiwgaXItPnZhci0+bmFtZSk7CisgICAgICB0aGlzLT5yZXN1bHQgPSBzcmNfcmVnKGJyd19udWxsX3JlZygpKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgdGhpcy0+cmVzdWx0ID0gc3JjX3JlZygqcmVnKTsKKworICAgLyogU3lzdGVtIHZhbHVlcyBnZXQgdGhlaXIgc3dpenpsZSBmcm9tIHRoZSBkc3RfcmVnIHdyaXRlbWFzayAqLworICAgaWYgKGlyLT52YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc3lzdGVtX3ZhbHVlKQorICAgICAgcmV0dXJuOworCisgICBpZiAodHlwZS0+aXNfc2NhbGFyKCkgfHwgdHlwZS0+aXNfdmVjdG9yKCkgfHwgdHlwZS0+aXNfbWF0cml4KCkpCisgICAgICB0aGlzLT5yZXN1bHQuc3dpenpsZSA9IHN3aXp6bGVfZm9yX3NpemUodHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKK30KKworCitpbnQKK3ZlYzRfdmlzaXRvcjo6Y29tcHV0ZV9hcnJheV9zdHJpZGUoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKQoreworICAgLyogVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgYXJyYXkgZWxlbWVudHMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5LCBzbworICAgICogdGhlIHN0cmlkZSBpcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgZWxlbWVudC4KKyAgICAqLworICAgcmV0dXJuIHR5cGVfc2l6ZShpci0+dHlwZSk7Cit9CisKKwordm9pZAordmVjNF92aXNpdG9yOjp2aXNpdChpcl9kZXJlZmVyZW5jZV9hcnJheSAqaXIpCit7CisgICBpcl9jb25zdGFudCAqY29uc3RhbnRfaW5kZXg7CisgICBzcmNfcmVnIHNyYzsKKyAgIGludCBhcnJheV9zdHJpZGUgPSBjb21wdXRlX2FycmF5X3N0cmlkZShpcik7CisKKyAgIGNvbnN0YW50X2luZGV4ID0gaXItPmFycmF5X2luZGV4LT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisKKyAgIGlyLT5hcnJheS0+YWNjZXB0KHRoaXMpOworICAgc3JjID0gdGhpcy0+cmVzdWx0OworCisgICBpZiAoY29uc3RhbnRfaW5kZXgpIHsKKyAgICAgIHNyYy5yZWdfb2Zmc2V0ICs9IGNvbnN0YW50X2luZGV4LT52YWx1ZS5pWzBdICogYXJyYXlfc3RyaWRlOworICAgfSBlbHNlIHsKKyAgICAgIC8qIFZhcmlhYmxlIGluZGV4IGFycmF5IGRlcmVmZXJlbmNlLiAgSXQgZWF0cyB0aGUgInZlYzQiIG9mIHRoZQorICAgICAgICogYmFzZSBvZiB0aGUgYXJyYXkgYW5kIGFuIGluZGV4IHRoYXQgb2Zmc2V0cyB0aGUgTWVzYSByZWdpc3RlcgorICAgICAgICogaW5kZXguCisgICAgICAgKi8KKyAgICAgIGlyLT5hcnJheV9pbmRleC0+YWNjZXB0KHRoaXMpOworCisgICAgICBzcmNfcmVnIGluZGV4X3JlZzsKKworICAgICAgaWYgKGFycmF5X3N0cmlkZSA9PSAxKSB7CisJIGluZGV4X3JlZyA9IHRoaXMtPnJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisJIGluZGV4X3JlZyA9IHNyY19yZWcodGhpcywgZ2xzbF90eXBlOjppbnRfdHlwZSk7CisKKwkgZW1pdChNVUwoZHN0X3JlZyhpbmRleF9yZWcpLCB0aGlzLT5yZXN1bHQsIHNyY19yZWcoYXJyYXlfc3RyaWRlKSkpOworICAgICAgfQorCisgICAgICBpZiAoc3JjLnJlbGFkZHIpIHsKKwkgc3JjX3JlZyB0ZW1wID0gc3JjX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmludF90eXBlKTsKKworCSBlbWl0KEFERChkc3RfcmVnKHRlbXApLCAqc3JjLnJlbGFkZHIsIGluZGV4X3JlZykpOworCisJIGluZGV4X3JlZyA9IHRlbXA7CisgICAgICB9CisKKyAgICAgIHNyYy5yZWxhZGRyID0gcmFsbG9jKG1lbV9jdHgsIHNyY19yZWcpOworICAgICAgbWVtY3B5KHNyYy5yZWxhZGRyLCAmaW5kZXhfcmVnLCBzaXplb2YoaW5kZXhfcmVnKSk7CisgICB9CisKKyAgIC8qIElmIHRoZSB0eXBlIGlzIHNtYWxsZXIgdGhhbiBhIHZlYzQsIHJlcGxpY2F0ZSB0aGUgbGFzdCBjaGFubmVsIG91dC4gKi8KKyAgIGlmIChpci0+dHlwZS0+aXNfc2NhbGFyKCkgfHwgaXItPnR5cGUtPmlzX3ZlY3RvcigpIHx8IGlyLT50eXBlLT5pc19tYXRyaXgoKSkKKyAgICAgIHNyYy5zd2l6emxlID0gc3dpenpsZV9mb3Jfc2l6ZShpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgIGVsc2UKKyAgICAgIHNyYy5zd2l6emxlID0gQlJXX1NXSVpaTEVfTk9PUDsKKyAgIHNyYy50eXBlID0gYnJ3X3R5cGVfZm9yX2Jhc2VfdHlwZShpci0+dHlwZSk7CisKKyAgIHRoaXMtPnJlc3VsdCA9IHNyYzsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjp2aXNpdChpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmlyKQoreworICAgdW5zaWduZWQgaW50IGk7CisgICBjb25zdCBnbHNsX3R5cGUgKnN0cnVjdF90eXBlID0gaXItPnJlY29yZC0+dHlwZTsKKyAgIGludCBvZmZzZXQgPSAwOworCisgICBpci0+cmVjb3JkLT5hY2NlcHQodGhpcyk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBzdHJ1Y3RfdHlwZS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAoc3RydWN0X3R5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSwgaXItPmZpZWxkKSA9PSAwKQorCSBicmVhazsKKyAgICAgIG9mZnNldCArPSB0eXBlX3NpemUoc3RydWN0X3R5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSk7CisgICB9CisKKyAgIC8qIElmIHRoZSB0eXBlIGlzIHNtYWxsZXIgdGhhbiBhIHZlYzQsIHJlcGxpY2F0ZSB0aGUgbGFzdCBjaGFubmVsIG91dC4gKi8KKyAgIGlmIChpci0+dHlwZS0+aXNfc2NhbGFyKCkgfHwgaXItPnR5cGUtPmlzX3ZlY3RvcigpIHx8IGlyLT50eXBlLT5pc19tYXRyaXgoKSkKKyAgICAgIHRoaXMtPnJlc3VsdC5zd2l6emxlID0gc3dpenpsZV9mb3Jfc2l6ZShpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgIGVsc2UKKyAgICAgIHRoaXMtPnJlc3VsdC5zd2l6emxlID0gQlJXX1NXSVpaTEVfTk9PUDsKKyAgIHRoaXMtPnJlc3VsdC50eXBlID0gYnJ3X3R5cGVfZm9yX2Jhc2VfdHlwZShpci0+dHlwZSk7CisKKyAgIHRoaXMtPnJlc3VsdC5yZWdfb2Zmc2V0ICs9IG9mZnNldDsKK30KKworLyoqCisgKiBXZSB3YW50IHRvIGJlIGNhcmVmdWwgaW4gYXNzaWdubWVudCBzZXR1cCB0byBoaXQgdGhlIGFjdHVhbCBzdG9yYWdlCisgKiBpbnN0ZWFkIG9mIHBvdGVudGlhbGx5IHVzaW5nIGEgdGVtcG9yYXJ5IGxpa2Ugd2UgbWlnaHQgd2l0aCB0aGUKKyAqIGlyX2RlcmVmZXJlbmNlIGhhbmRsZXIuCisgKi8KK3N0YXRpYyBkc3RfcmVnCitnZXRfYXNzaWdubWVudF9saHMoaXJfZGVyZWZlcmVuY2UgKmlyLCB2ZWM0X3Zpc2l0b3IgKnYpCit7CisgICAvKiBUaGUgTEhTIG11c3QgYmUgYSBkZXJlZmVyZW5jZS4gIElmIHRoZSBMSFMgaXMgYSB2YXJpYWJsZSBpbmRleGVkIGFycmF5CisgICAgKiBhY2Nlc3Mgb2YgYSB2ZWN0b3IsIGl0IG11c3QgYmUgc2VwYXJhdGVkIGludG8gYSBzZXJpZXMgY29uZGl0aW9uYWwgbW92ZXMKKyAgICAqIGJlZm9yZSByZWFjaGluZyB0aGlzIHBvaW50IChzZWUgaXJfdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduKS4KKyAgICAqLworICAgYXNzZXJ0KGlyLT5hc19kZXJlZmVyZW5jZSgpKTsKKyAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpkZXJlZl9hcnJheSA9IGlyLT5hc19kZXJlZmVyZW5jZV9hcnJheSgpOworICAgaWYgKGRlcmVmX2FycmF5KSB7CisgICAgICBhc3NlcnQoIWRlcmVmX2FycmF5LT5hcnJheS0+dHlwZS0+aXNfdmVjdG9yKCkpOworICAgfQorCisgICAvKiBVc2UgdGhlIHJ2YWx1ZSBkZXJlZiBoYW5kbGVyIGZvciB0aGUgbW9zdCBwYXJ0LiAgV2UnbGwgaWdub3JlCisgICAgKiBzd2l6emxlcyBpbiBpdCBhbmQgd3JpdGUgc3dpenpsZXMgdXNpbmcgd3JpdGVtYXNrLCB0aG91Z2guCisgICAgKi8KKyAgIGlyLT5hY2NlcHQodik7CisgICByZXR1cm4gZHN0X3JlZyh2LT5yZXN1bHQpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfYmxvY2tfbW92ZShkc3RfcmVnICpkc3QsIHNyY19yZWcgKnNyYywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUsIHVpbnQzMl90IHByZWRpY2F0ZSkKK3sKKyAgIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1NUUlVDVCkgeworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0eXBlLT5sZW5ndGg7IGkrKykgeworCSBlbWl0X2Jsb2NrX21vdmUoZHN0LCBzcmMsIHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSwgcHJlZGljYXRlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKHR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgZW1pdF9ibG9ja19tb3ZlKGRzdCwgc3JjLCB0eXBlLT5maWVsZHMuYXJyYXksIHByZWRpY2F0ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICh0eXBlLT5pc19tYXRyaXgoKSkgeworICAgICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdmVjX3R5cGU7CisKKyAgICAgIHZlY190eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0ZMT0FULAorCQkJCQkgdHlwZS0+dmVjdG9yX2VsZW1lbnRzLCAxKTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5tYXRyaXhfY29sdW1uczsgaSsrKSB7CisJIGVtaXRfYmxvY2tfbW92ZShkc3QsIHNyYywgdmVjX3R5cGUsIHByZWRpY2F0ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGFzc2VydCh0eXBlLT5pc19zY2FsYXIoKSB8fCB0eXBlLT5pc192ZWN0b3IoKSk7CisKKyAgIGRzdC0+dHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUodHlwZSk7CisgICBzcmMtPnR5cGUgPSBkc3QtPnR5cGU7CisKKyAgIGRzdC0+d3JpdGVtYXNrID0gKDEgPDwgdHlwZS0+dmVjdG9yX2VsZW1lbnRzKSAtIDE7CisKKyAgIHNyYy0+c3dpenpsZSA9IHN3aXp6bGVfZm9yX3NpemUodHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoTU9WKCpkc3QsICpzcmMpKTsKKyAgIGluc3QtPnByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKKworICAgZHN0LT5yZWdfb2Zmc2V0Kys7CisgICBzcmMtPnJlZ19vZmZzZXQrKzsKK30KKworCisvKiBJZiB0aGUgUkhTIHByb2Nlc3NpbmcgcmVzdWx0ZWQgaW4gYW4gaW5zdHJ1Y3Rpb24gZ2VuZXJhdGluZyBhCisgKiB0ZW1wb3JhcnkgdmFsdWUsIGFuZCBpdCB3b3VsZCBiZSBlYXN5IHRvIHJld3JpdGUgdGhlIGluc3RydWN0aW9uIHRvCisgKiBnZW5lcmF0ZSBpdHMgcmVzdWx0IHJpZ2h0IGludG8gdGhlIExIUyBpbnN0ZWFkLCBkbyBzby4gIFRoaXMgZW5kcworICogdXAgcmVsaWFibHkgcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zIHdoZXJlIGl0IGNhbiBiZSB0cmlja3kgdG8gZG8gc28KKyAqIGxhdGVyIHdpdGhvdXQgcmVhbCBVRCBjaGFpbiBpbmZvcm1hdGlvbi4KKyAqLworYm9vbAordmVjNF92aXNpdG9yOjp0cnlfcmV3cml0ZV9yaHNfdG9fZHN0KGlyX2Fzc2lnbm1lbnQgKmlyLAorCQkJCSAgICAgZHN0X3JlZyBkc3QsCisJCQkJICAgICBzcmNfcmVnIHNyYywKKwkJCQkgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKnByZV9yaHNfaW5zdCwKKwkJCQkgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmxhc3RfcmhzX2luc3QpCit7CisgICAvKiBUaGlzIGNvdWxkIGJlIHN1cHBvcnRlZCwgYnV0IGl0IHdvdWxkIHRha2UgbW9yZSBzbWFydHMuICovCisgICBpZiAoaXItPmNvbmRpdGlvbikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKHByZV9yaHNfaW5zdCA9PSBsYXN0X3Joc19pbnN0KQorICAgICAgcmV0dXJuIGZhbHNlOyAvKiBObyBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIHRvIHdvcmsgd2l0aC4gKi8KKworICAgLyogTWFrZSBzdXJlIHRoZSBsYXN0IGluc3RydWN0aW9uIGdlbmVyYXRlZCBvdXIgc291cmNlIHJlZy4gKi8KKyAgIGlmIChzcmMuZmlsZSAhPSBHUkYgfHwKKyAgICAgICBzcmMuZmlsZSAhPSBsYXN0X3Joc19pbnN0LT5kc3QuZmlsZSB8fAorICAgICAgIHNyYy5yZWcgIT0gbGFzdF9yaHNfaW5zdC0+ZHN0LnJlZyB8fAorICAgICAgIHNyYy5yZWdfb2Zmc2V0ICE9IGxhc3RfcmhzX2luc3QtPmRzdC5yZWdfb2Zmc2V0IHx8CisgICAgICAgc3JjLnJlbGFkZHIgfHwKKyAgICAgICBzcmMuYWJzIHx8CisgICAgICAgc3JjLm5lZ2F0ZSB8fAorICAgICAgIGxhc3RfcmhzX2luc3QtPnByZWRpY2F0ZSAhPSBCUldfUFJFRElDQVRFX05PTkUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIENoZWNrIHRoYXQgdGhhdCBsYXN0IGluc3RydWN0aW9uIGZ1bGx5IGluaXRpYWxpemVkIHRoZSBjaGFubmVscworICAgICogd2Ugd2FudCB0byB1c2UsIGluIHRoZSBvcmRlciB3ZSB3YW50IHRvIHVzZSB0aGVtLiAgV2UgY291bGQKKyAgICAqIHBvdGVudGlhbGx5IHJlc3dpenpsZSB0aGUgb3BlcmFuZHMgb2YgbWFueSBpbnN0cnVjdGlvbnMgc28gdGhhdAorICAgICogd2UgY291bGQgaGFuZGxlIG91dCBvZiBvcmRlciBjaGFubmVscywgYnV0IGRvbid0IHlldC4KKyAgICAqLworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBpZiAoZHN0LndyaXRlbWFzayAmICgxIDw8IGkpKSB7CisJIGlmICghKGxhc3RfcmhzX2luc3QtPmRzdC53cml0ZW1hc2sgJiAoMSA8PCBpKSkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSBpZiAoQlJXX0dFVF9TV1ooc3JjLnN3aXp6bGUsIGkpICE9IGkpCisJICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogU3VjY2VzcyEgIFJld3JpdGUgdGhlIGluc3RydWN0aW9uLiAqLworICAgbGFzdF9yaHNfaW5zdC0+ZHN0LmZpbGUgPSBkc3QuZmlsZTsKKyAgIGxhc3RfcmhzX2luc3QtPmRzdC5yZWcgPSBkc3QucmVnOworICAgbGFzdF9yaHNfaW5zdC0+ZHN0LnJlZ19vZmZzZXQgPSBkc3QucmVnX29mZnNldDsKKyAgIGxhc3RfcmhzX2luc3QtPmRzdC5yZWxhZGRyID0gZHN0LnJlbGFkZHI7CisgICBsYXN0X3Joc19pbnN0LT5kc3Qud3JpdGVtYXNrICY9IGRzdC53cml0ZW1hc2s7CisKKyAgIHJldHVybiB0cnVlOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgZHN0X3JlZyBkc3QgPSBnZXRfYXNzaWdubWVudF9saHMoaXItPmxocywgdGhpcyk7CisgICB1aW50MzJfdCBwcmVkaWNhdGUgPSBCUldfUFJFRElDQVRFX05PTkU7CisKKyAgIGlmICghaXItPmxocy0+dHlwZS0+aXNfc2NhbGFyKCkgJiYKKyAgICAgICAhaXItPmxocy0+dHlwZS0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIGlyLT5yaHMtPmFjY2VwdCh0aGlzKTsKKyAgICAgIHNyY19yZWcgc3JjID0gdGhpcy0+cmVzdWx0OworCisgICAgICBpZiAoaXItPmNvbmRpdGlvbikgeworCSBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyLT5jb25kaXRpb24sICZwcmVkaWNhdGUpOworICAgICAgfQorCisgICAgICAvKiBlbWl0X2Jsb2NrX21vdmUgZG9lc24ndCBhY2NvdW50IGZvciBzd2l6emxlcyBpbiB0aGUgc291cmNlIHJlZ2lzdGVyLgorICAgICAgICogVGhpcyBzaG91bGQgYmUgb2ssIHNpbmNlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMgYSBzdHJ1Y3R1cmUgb3IgYW4KKyAgICAgICAqIGFycmF5LCBhbmQgdGhvc2UgY2FuJ3QgYmUgc3dpenpsZWQuICBCdXQgZG91YmxlLWNoZWNrIHRvIGJlIHN1cmUuCisgICAgICAgKi8KKyAgICAgIGFzc2VydChzcmMuc3dpenpsZSA9PQorICAgICAgICAgICAgIChpci0+cmhzLT50eXBlLT5pc19tYXRyaXgoKQorICAgICAgICAgICAgICA/IHN3aXp6bGVfZm9yX3NpemUoaXItPnJocy0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKQorICAgICAgICAgICAgICA6IEJSV19TV0laWkxFX05PT1ApKTsKKworICAgICAgZW1pdF9ibG9ja19tb3ZlKCZkc3QsICZzcmMsIGlyLT5yaHMtPnR5cGUsIHByZWRpY2F0ZSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIE5vdyB3ZSdyZSBkb3duIHRvIGp1c3QgYSBzY2FsYXIvdmVjdG9yIHdpdGggd3JpdGVtYXNrcy4gKi8KKyAgIGludCBpOworCisgICB2ZWM0X2luc3RydWN0aW9uICpwcmVfcmhzX2luc3QsICpsYXN0X3Joc19pbnN0OworICAgcHJlX3Joc19pbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKil0aGlzLT5pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgaXItPnJocy0+YWNjZXB0KHRoaXMpOworCisgICBsYXN0X3Joc19pbnN0ID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKil0aGlzLT5pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgc3JjX3JlZyBzcmMgPSB0aGlzLT5yZXN1bHQ7CisKKyAgIGludCBzd2l6emxlc1s0XTsKKyAgIGludCBmaXJzdF9lbmFibGVkX2NoYW4gPSAwOworICAgaW50IHNyY19jaGFuID0gMDsKKworICAgYXNzZXJ0KGlyLT5saHMtPnR5cGUtPmlzX3ZlY3RvcigpIHx8CisJICBpci0+bGhzLT50eXBlLT5pc19zY2FsYXIoKSk7CisgICBkc3Qud3JpdGVtYXNrID0gaXItPndyaXRlX21hc2s7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBpZiAoZHN0LndyaXRlbWFzayAmICgxIDw8IGkpKSB7CisJIGZpcnN0X2VuYWJsZWRfY2hhbiA9IEJSV19HRVRfU1daKHNyYy5zd2l6emxlLCBpKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIC8qIFN3aXp6bGUgYSBzbWFsbCBSSFMgdmVjdG9yIGludG8gdGhlIGNoYW5uZWxzIGJlaW5nIHdyaXR0ZW4uCisgICAgKgorICAgICogZ2xzbCBpciB0cmVhdHMgd3JpdGVfbWFzayBhcyBkaWN0YXRpbmcgaG93IG1hbnkgY2hhbm5lbHMgYXJlCisgICAgKiBwcmVzZW50IG9uIHRoZSBSSFMgd2hpbGUgaW4gb3VyIGluc3RydWN0aW9ucyB3ZSBuZWVkIHRvIG1ha2UKKyAgICAqIHRob3NlIGNoYW5uZWxzIGFwcGVhciBpbiB0aGUgc2xvdHMgb2YgdGhlIHZlYzQgdGhleSdyZSB3cml0dGVuIHRvLgorICAgICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaWYgKGRzdC53cml0ZW1hc2sgJiAoMSA8PCBpKSkKKwkgc3dpenpsZXNbaV0gPSBCUldfR0VUX1NXWihzcmMuc3dpenpsZSwgc3JjX2NoYW4rKyk7CisgICAgICBlbHNlCisJIHN3aXp6bGVzW2ldID0gZmlyc3RfZW5hYmxlZF9jaGFuOworICAgfQorICAgc3JjLnN3aXp6bGUgPSBCUldfU1dJWlpMRTQoc3dpenpsZXNbMF0sIHN3aXp6bGVzWzFdLAorCQkJICAgICAgc3dpenpsZXNbMl0sIHN3aXp6bGVzWzNdKTsKKworICAgaWYgKHRyeV9yZXdyaXRlX3Joc190b19kc3QoaXIsIGRzdCwgc3JjLCBwcmVfcmhzX2luc3QsIGxhc3RfcmhzX2luc3QpKSB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChpci0+Y29uZGl0aW9uKSB7CisgICAgICBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyLT5jb25kaXRpb24sICZwcmVkaWNhdGUpOworICAgfQorCisgICBmb3IgKGkgPSAwOyBpIDwgdHlwZV9zaXplKGlyLT5saHMtPnR5cGUpOyBpKyspIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSBlbWl0KE1PVihkc3QsIHNyYykpOworICAgICAgaW5zdC0+cHJlZGljYXRlID0gcHJlZGljYXRlOworCisgICAgICBkc3QucmVnX29mZnNldCsrOworICAgICAgc3JjLnJlZ19vZmZzZXQrKzsKKyAgIH0KK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X2NvbnN0YW50X3ZhbHVlcyhkc3RfcmVnICpkc3QsIGlyX2NvbnN0YW50ICppcikKK3sKKyAgIGlmIChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9TVFJVQ1QpIHsKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCAmaXItPmNvbXBvbmVudHMpIHsKKwkgaXJfY29uc3RhbnQgKmZpZWxkX3ZhbHVlID0gKGlyX2NvbnN0YW50ICopbm9kZTsKKworCSBlbWl0X2NvbnN0YW50X3ZhbHVlcyhkc3QsIGZpZWxkX3ZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGlyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGlyLT50eXBlLT5sZW5ndGg7IGkrKykgeworCSBlbWl0X2NvbnN0YW50X3ZhbHVlcyhkc3QsIGlyLT5hcnJheV9lbGVtZW50c1tpXSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChpci0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXItPnR5cGUtPm1hdHJpeF9jb2x1bW5zOyBpKyspIHsKKwkgZmxvYXQgKnZlYyA9ICZpci0+dmFsdWUuZltpICogaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50c107CisKKwkgZm9yIChpbnQgaiA9IDA7IGogPCBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBqKyspIHsKKwkgICAgZHN0LT53cml0ZW1hc2sgPSAxIDw8IGo7CisJICAgIGRzdC0+dHlwZSA9IEJSV19SRUdJU1RFUl9UWVBFX0Y7CisKKwkgICAgZW1pdChNT1YoKmRzdCwgc3JjX3JlZyh2ZWNbal0pKSk7CisJIH0KKwkgZHN0LT5yZWdfb2Zmc2V0Kys7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGludCByZW1haW5pbmdfd3JpdGVtYXNrID0gKDEgPDwgaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgLSAxOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgaWYgKCEocmVtYWluaW5nX3dyaXRlbWFzayAmICgxIDw8IGkpKSkKKwkgY29udGludWU7CisKKyAgICAgIGRzdC0+d3JpdGVtYXNrID0gMSA8PCBpOworICAgICAgZHN0LT50eXBlID0gYnJ3X3R5cGVfZm9yX2Jhc2VfdHlwZShpci0+dHlwZSk7CisKKyAgICAgIC8qIEZpbmQgb3RoZXIgY29tcG9uZW50cyB0aGF0IG1hdGNoIHRoZSBvbmUgd2UncmUgYWJvdXQgdG8KKyAgICAgICAqIHdyaXRlLiAgRW1pdHMgZmV3ZXIgaW5zdHJ1Y3Rpb25zIGZvciB0aGluZ3MgbGlrZSB2ZWM0KDAuNSwKKyAgICAgICAqIDEuNSwgMS41LCAxLjUpLgorICAgICAgICovCisgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBqKyspIHsKKwkgaWYgKGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0JPT0wpIHsKKwkgICAgaWYgKGlyLT52YWx1ZS5iW2ldID09IGlyLT52YWx1ZS5iW2pdKQorCSAgICAgICBkc3QtPndyaXRlbWFzayB8PSAoMSA8PCBqKTsKKwkgfSBlbHNlIHsKKwkgICAgLyogdSwgaSwgYW5kIGYgc3RvcmFnZSBhbGwgbGluZSB1cCwgc28gbm8gbmVlZCBmb3IgYQorCSAgICAgKiBzd2l0Y2ggY2FzZSBmb3IgY29tcGFyaW5nIGVhY2ggdHlwZS4KKwkgICAgICovCisJICAgIGlmIChpci0+dmFsdWUudVtpXSA9PSBpci0+dmFsdWUudVtqXSkKKwkgICAgICAgZHN0LT53cml0ZW1hc2sgfD0gKDEgPDwgaik7CisJIH0KKyAgICAgIH0KKworICAgICAgc3dpdGNoIChpci0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgZW1pdChNT1YoKmRzdCwgc3JjX3JlZyhpci0+dmFsdWUuZltpXSkpKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJIGVtaXQoTU9WKCpkc3QsIHNyY19yZWcoaXItPnZhbHVlLmlbaV0pKSk7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgZW1pdChNT1YoKmRzdCwgc3JjX3JlZyhpci0+dmFsdWUudVtpXSkpKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorCSBlbWl0KE1PVigqZHN0LCBzcmNfcmVnKGlyLT52YWx1ZS5iW2ldKSkpOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGFzc2VydCghIk5vbi1mbG9hdC91aW50L2ludC9ib29sIGNvbnN0YW50Iik7CisJIGJyZWFrOworICAgICAgfQorCisgICAgICByZW1haW5pbmdfd3JpdGVtYXNrICY9IH5kc3QtPndyaXRlbWFzazsKKyAgIH0KKyAgIGRzdC0+cmVnX29mZnNldCsrOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX2NvbnN0YW50ICppcikKK3sKKyAgIGRzdF9yZWcgZHN0ID0gZHN0X3JlZyh0aGlzLCBpci0+dHlwZSk7CisgICB0aGlzLT5yZXN1bHQgPSBzcmNfcmVnKGRzdCk7CisKKyAgIGVtaXRfY29uc3RhbnRfdmFsdWVzKCZkc3QsIGlyKTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjp2aXNpdF9hdG9taWNfY291bnRlcl9pbnRyaW5zaWMoaXJfY2FsbCAqaXIpCit7CisgICBpcl9kZXJlZmVyZW5jZSAqZGVyZWYgPSBzdGF0aWNfY2FzdDxpcl9kZXJlZmVyZW5jZSAqPigKKyAgICAgIGlyLT5hY3R1YWxfcGFyYW1ldGVycy5nZXRfaGVhZCgpKTsKKyAgIGlyX3ZhcmlhYmxlICpsb2NhdGlvbiA9IGRlcmVmLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisgICB1bnNpZ25lZCBzdXJmX2luZGV4ID0gKHByb2dfZGF0YS0+YmFzZS5iaW5kaW5nX3RhYmxlLmFib19zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLT5kYXRhLmF0b21pYy5idWZmZXJfaW5kZXgpOworCisgICAvKiBDYWxjdWxhdGUgdGhlIHN1cmZhY2Ugb2Zmc2V0ICovCisgICBzcmNfcmVnIG9mZnNldCh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqZGVyZWZfYXJyYXkgPSBkZXJlZi0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKTsKKyAgIGlmIChkZXJlZl9hcnJheSkgeworICAgICAgZGVyZWZfYXJyYXktPmFycmF5X2luZGV4LT5hY2NlcHQodGhpcyk7CisKKyAgICAgIHNyY19yZWcgdG1wKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIGVtaXQoTVVMKGRzdF9yZWcodG1wKSwgdGhpcy0+cmVzdWx0LCBBVE9NSUNfQ09VTlRFUl9TSVpFKSk7CisgICAgICBlbWl0KEFERChkc3RfcmVnKG9mZnNldCksIHRtcCwgbG9jYXRpb24tPmRhdGEuYXRvbWljLm9mZnNldCkpOworICAgfSBlbHNlIHsKKyAgICAgIG9mZnNldCA9IGxvY2F0aW9uLT5kYXRhLmF0b21pYy5vZmZzZXQ7CisgICB9CisKKyAgIC8qIEVtaXQgdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KKyAgIGNvbnN0IGNoYXIgKmNhbGxlZSA9IGlyLT5jYWxsZWUtPmZ1bmN0aW9uX25hbWUoKTsKKyAgIGRzdF9yZWcgZHN0ID0gZ2V0X2Fzc2lnbm1lbnRfbGhzKGlyLT5yZXR1cm5fZGVyZWYsIHRoaXMpOworCisgICBpZiAoIXN0cmNtcCgiX19pbnRyaW5zaWNfYXRvbWljX3JlYWQiLCBjYWxsZWUpKSB7CisgICAgICBlbWl0X3VudHlwZWRfc3VyZmFjZV9yZWFkKHN1cmZfaW5kZXgsIGRzdCwgb2Zmc2V0KTsKKworICAgfSBlbHNlIGlmICghc3RyY21wKCJfX2ludHJpbnNpY19hdG9taWNfaW5jcmVtZW50IiwgY2FsbGVlKSkgeworICAgICAgZW1pdF91bnR5cGVkX2F0b21pYyhCUldfQU9QX0lOQywgc3VyZl9pbmRleCwgZHN0LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcoKSwgc3JjX3JlZygpKTsKKworICAgfSBlbHNlIGlmICghc3RyY21wKCJfX2ludHJpbnNpY19hdG9taWNfcHJlZGVjcmVtZW50IiwgY2FsbGVlKSkgeworICAgICAgZW1pdF91bnR5cGVkX2F0b21pYyhCUldfQU9QX1BSRURFQywgc3VyZl9pbmRleCwgZHN0LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcoKSwgc3JjX3JlZygpKTsKKyAgIH0KK30KKwordm9pZAordmVjNF92aXNpdG9yOjp2aXNpdChpcl9jYWxsICppcikKK3sKKyAgIGNvbnN0IGNoYXIgKmNhbGxlZSA9IGlyLT5jYWxsZWUtPmZ1bmN0aW9uX25hbWUoKTsKKworICAgaWYgKCFzdHJjbXAoIl9faW50cmluc2ljX2F0b21pY19yZWFkIiwgY2FsbGVlKSB8fAorICAgICAgICFzdHJjbXAoIl9faW50cmluc2ljX2F0b21pY19pbmNyZW1lbnQiLCBjYWxsZWUpIHx8CisgICAgICAgIXN0cmNtcCgiX19pbnRyaW5zaWNfYXRvbWljX3ByZWRlY3JlbWVudCIsIGNhbGxlZSkpIHsKKyAgICAgIHZpc2l0X2F0b21pY19jb3VudGVyX2ludHJpbnNpYyhpcik7CisgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KCEiVW5zdXBwb3J0ZWQgaW50cmluc2ljLiIpOworICAgfQorfQorCitzcmNfcmVnCit2ZWM0X3Zpc2l0b3I6OmVtaXRfbWNzX2ZldGNoKGlyX3RleHR1cmUgKmlyLCBzcmNfcmVnIGNvb3JkaW5hdGUsIGludCBzYW1wbGVyKQoreworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IG5ldyhtZW1fY3R4KSB2ZWM0X2luc3RydWN0aW9uKHRoaXMsIFNIQURFUl9PUENPREVfVFhGX01DUyk7CisgICBpbnN0LT5iYXNlX21yZiA9IDI7CisgICBpbnN0LT5tbGVuID0gMTsKKyAgIGluc3QtPnNhbXBsZXIgPSBzYW1wbGVyOworICAgaW5zdC0+ZHN0ID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUpOworICAgaW5zdC0+ZHN0LndyaXRlbWFzayA9IFdSSVRFTUFTS19YWVpXOworCisgICAvKiBwYXJhbWV0ZXJzIGFyZTogdSwgdiwgciwgbG9kOyBsb2Qgd2lsbCBhbHdheXMgYmUgemVybyBkdWUgdG8gYXBpIHJlc3RyaWN0aW9ucyAqLworICAgaW50IHBhcmFtX2Jhc2UgPSBpbnN0LT5iYXNlX21yZjsKKyAgIGludCBjb29yZF9tYXNrID0gKDEgPDwgaXItPmNvb3JkaW5hdGUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgLSAxOworICAgaW50IHplcm9fbWFzayA9IDB4ZiAmIH5jb29yZF9tYXNrOworCisgICBlbWl0KE1PVihkc3RfcmVnKE1SRiwgcGFyYW1fYmFzZSwgaXItPmNvb3JkaW5hdGUtPnR5cGUsIGNvb3JkX21hc2spLAorICAgICAgICAgICAgY29vcmRpbmF0ZSkpOworCisgICBlbWl0KE1PVihkc3RfcmVnKE1SRiwgcGFyYW1fYmFzZSwgaXItPmNvb3JkaW5hdGUtPnR5cGUsIHplcm9fbWFzayksCisgICAgICAgICAgICBzcmNfcmVnKDApKSk7CisKKyAgIGVtaXQoaW5zdCk7CisgICByZXR1cm4gc3JjX3JlZyhpbnN0LT5kc3QpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX3RleHR1cmUgKmlyKQoreworICAgaW50IHNhbXBsZXIgPQorICAgICAgX21lc2FfZ2V0X3NhbXBsZXJfdW5pZm9ybV92YWx1ZShpci0+c2FtcGxlciwgc2hhZGVyX3Byb2csIHByb2cpOworCisgICAvKiBXaGVuIHRnNCBpcyB1c2VkIHdpdGggdGhlIGRlZ2VuZXJhdGUgWkVSTy9PTkUgc3dpenpsZXMsIGRvbid0IGJvdGhlcgorICAgICogZW1pdHRpbmcgYW55dGhpbmcgb3RoZXIgdGhhbiBzZXR0aW5nIHVwIHRoZSBjb25zdGFudCByZXN1bHQuCisgICAgKi8KKyAgIGlmIChpci0+b3AgPT0gaXJfdGc0KSB7CisgICAgICBpcl9jb25zdGFudCAqY2hhbiA9IGlyLT5sb2RfaW5mby5jb21wb25lbnQtPmFzX2NvbnN0YW50KCk7CisgICAgICBpbnQgc3dpeiA9IEdFVF9TV1ooa2V5LT50ZXguc3dpenpsZXNbc2FtcGxlcl0sIGNoYW4tPnZhbHVlLmlbMF0pOworICAgICAgaWYgKHN3aXogPT0gU1dJWlpMRV9aRVJPIHx8IHN3aXogPT0gU1dJWlpMRV9PTkUpIHsKKyAgICAgICAgIGRzdF9yZWcgcmVzdWx0KHRoaXMsIGlyLT50eXBlKTsKKyAgICAgICAgIHRoaXMtPnJlc3VsdCA9IHNyY19yZWcocmVzdWx0KTsKKyAgICAgICAgIGVtaXQoTU9WKHJlc3VsdCwgc3JjX3JlZyhzd2l6ID09IFNXSVpaTEVfT05FID8gMS4wZiA6IDAuMGYpKSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIC8qIFNob3VsZCBiZSBsb3dlcmVkIGJ5IGRvX2xvd2VyX3RleHR1cmVfcHJvamVjdGlvbiAqLworICAgYXNzZXJ0KCFpci0+cHJvamVjdG9yKTsKKworICAgLyogU2hvdWxkIGJlIGxvd2VyZWQgKi8KKyAgIGFzc2VydCghaXItPm9mZnNldCB8fCAhaXItPm9mZnNldC0+dHlwZS0+aXNfYXJyYXkoKSk7CisKKyAgIC8qIEdlbmVyYXRlIGNvZGUgdG8gY29tcHV0ZSBhbGwgdGhlIHN1YmV4cHJlc3Npb24gdHJlZXMuICBUaGlzIGhhcyB0byBiZQorICAgICogZG9uZSBiZWZvcmUgbG9hZGluZyBhbnkgdmFsdWVzIGludG8gTVJGcyBmb3IgdGhlIHNhbXBsZXIgbWVzc2FnZSBzaW5jZQorICAgICogZ2VuZXJhdGluZyB0aGVzZSB2YWx1ZXMgbWF5IGludm9sdmUgU0VORCBtZXNzYWdlcyB0aGF0IG5lZWQgdGhlIE1SRnMuCisgICAgKi8KKyAgIHNyY19yZWcgY29vcmRpbmF0ZTsKKyAgIGlmIChpci0+Y29vcmRpbmF0ZSkgeworICAgICAgaXItPmNvb3JkaW5hdGUtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGNvb3JkaW5hdGUgPSB0aGlzLT5yZXN1bHQ7CisgICB9CisKKyAgIHNyY19yZWcgc2hhZG93X2NvbXBhcml0b3I7CisgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKSB7CisgICAgICBpci0+c2hhZG93X2NvbXBhcml0b3ItPmFjY2VwdCh0aGlzKTsKKyAgICAgIHNoYWRvd19jb21wYXJpdG9yID0gdGhpcy0+cmVzdWx0OworICAgfQorCisgICBib29sIGhhc19ub25jb25zdGFudF9vZmZzZXQgPSBpci0+b2Zmc2V0ICYmICFpci0+b2Zmc2V0LT5hc19jb25zdGFudCgpOworICAgc3JjX3JlZyBvZmZzZXRfdmFsdWU7CisgICBpZiAoaGFzX25vbmNvbnN0YW50X29mZnNldCkgeworICAgICAgaXItPm9mZnNldC0+YWNjZXB0KHRoaXMpOworICAgICAgb2Zmc2V0X3ZhbHVlID0gc3JjX3JlZyh0aGlzLT5yZXN1bHQpOworICAgfQorCisgICBjb25zdCBnbHNsX3R5cGUgKmxvZF90eXBlID0gTlVMTCwgKnNhbXBsZV9pbmRleF90eXBlID0gTlVMTDsKKyAgIHNyY19yZWcgbG9kLCBkUGR4LCBkUGR5LCBzYW1wbGVfaW5kZXgsIG1jczsKKyAgIHN3aXRjaCAoaXItPm9wKSB7CisgICBjYXNlIGlyX3RleDoKKyAgICAgIGxvZCA9IHNyY19yZWcoMC4wZik7CisgICAgICBsb2RfdHlwZSA9IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGY6CisgICBjYXNlIGlyX3R4bDoKKyAgIGNhc2UgaXJfdHhzOgorICAgICAgaXItPmxvZF9pbmZvLmxvZC0+YWNjZXB0KHRoaXMpOworICAgICAgbG9kID0gdGhpcy0+cmVzdWx0OworICAgICAgbG9kX3R5cGUgPSBpci0+bG9kX2luZm8ubG9kLT50eXBlOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3F1ZXJ5X2xldmVsczoKKyAgICAgIGxvZCA9IHNyY19yZWcoMCk7CisgICAgICBsb2RfdHlwZSA9IGdsc2xfdHlwZTo6aW50X3R5cGU7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhmX21zOgorICAgICAgaXItPmxvZF9pbmZvLnNhbXBsZV9pbmRleC0+YWNjZXB0KHRoaXMpOworICAgICAgc2FtcGxlX2luZGV4ID0gdGhpcy0+cmVzdWx0OworICAgICAgc2FtcGxlX2luZGV4X3R5cGUgPSBpci0+bG9kX2luZm8uc2FtcGxlX2luZGV4LT50eXBlOworCisgICAgICBpZiAoYnJ3LT5nZW4gPj0gNyAmJiBrZXktPnRleC5jb21wcmVzc2VkX211bHRpc2FtcGxlX2xheW91dF9tYXNrICYgKDE8PHNhbXBsZXIpKQorICAgICAgICAgbWNzID0gZW1pdF9tY3NfZmV0Y2goaXIsIGNvb3JkaW5hdGUsIHNhbXBsZXIpOworICAgICAgZWxzZQorICAgICAgICAgbWNzID0gc3JjX3JlZygwdSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhkOgorICAgICAgaXItPmxvZF9pbmZvLmdyYWQuZFBkeC0+YWNjZXB0KHRoaXMpOworICAgICAgZFBkeCA9IHRoaXMtPnJlc3VsdDsKKworICAgICAgaXItPmxvZF9pbmZvLmdyYWQuZFBkeS0+YWNjZXB0KHRoaXMpOworICAgICAgZFBkeSA9IHRoaXMtPnJlc3VsdDsKKworICAgICAgbG9kX3R5cGUgPSBpci0+bG9kX2luZm8uZ3JhZC5kUGR4LT50eXBlOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4YjoKKyAgIGNhc2UgaXJfbG9kOgorICAgY2FzZSBpcl90ZzQ6CisgICAgICBicmVhazsKKyAgIH0KKworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IE5VTEw7CisgICBzd2l0Y2ggKGlyLT5vcCkgeworICAgY2FzZSBpcl90ZXg6CisgICBjYXNlIGlyX3R4bDoKKyAgICAgIGluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBTSEFERVJfT1BDT0RFX1RYTCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhkOgorICAgICAgaW5zdCA9IG5ldyhtZW1fY3R4KSB2ZWM0X2luc3RydWN0aW9uKHRoaXMsIFNIQURFUl9PUENPREVfVFhEKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGY6CisgICAgICBpbnN0ID0gbmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywgU0hBREVSX09QQ09ERV9UWEYpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4Zl9tczoKKyAgICAgIGluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBTSEFERVJfT1BDT0RFX1RYRl9DTVMpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4czoKKyAgICAgIGluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBTSEFERVJfT1BDT0RFX1RYUyk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdGc0OgorICAgICAgaWYgKGhhc19ub25jb25zdGFudF9vZmZzZXQpCisgICAgICAgICBpbnN0ID0gbmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywgU0hBREVSX09QQ09ERV9URzRfT0ZGU0VUKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGluc3QgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBTSEFERVJfT1BDT0RFX1RHNCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfcXVlcnlfbGV2ZWxzOgorICAgICAgaW5zdCA9IG5ldyhtZW1fY3R4KSB2ZWM0X2luc3RydWN0aW9uKHRoaXMsIFNIQURFUl9PUENPREVfVFhTKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGI6CisgICAgICBhc3NlcnQoISJUWEIgaXMgbm90IHZhbGlkIGZvciB2ZXJ0ZXggc2hhZGVycy4iKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9sb2Q6CisgICAgICBhc3NlcnQoISJMT0QgaXMgbm90IHZhbGlkIGZvciB2ZXJ0ZXggc2hhZGVycy4iKTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIlVucmVjb2duaXplZCB0ZXggb3AiKTsKKyAgIH0KKworICAgaWYgKGlyLT5vZmZzZXQgIT0gTlVMTCAmJiBpci0+b3AgIT0gaXJfdHhmKQorICAgICAgaW5zdC0+dGV4dHVyZV9vZmZzZXQgPSBicndfdGV4dHVyZV9vZmZzZXQoY3R4LCBpci0+b2Zmc2V0LT5hc19jb25zdGFudCgpKTsKKworICAgLyogU3R1ZmYgdGhlIGNoYW5uZWwgc2VsZWN0IGJpdHMgaW4gdGhlIHRvcCBvZiB0aGUgdGV4dHVyZSBvZmZzZXQgKi8KKyAgIGlmIChpci0+b3AgPT0gaXJfdGc0KQorICAgICAgaW5zdC0+dGV4dHVyZV9vZmZzZXQgfD0gZ2F0aGVyX2NoYW5uZWwoaXIsIHNhbXBsZXIpIDw8IDE2OworCisgICAvKiBUaGUgbWVzc2FnZSBoZWFkZXIgaXMgbmVjZXNzYXJ5IGZvcjoKKyAgICAqIC0gR2VuNCAoYWx3YXlzKQorICAgICogLSBUZXhlbCBvZmZzZXRzCisgICAgKiAtIEdhdGhlciBjaGFubmVsIHNlbGVjdGlvbgorICAgICogLSBTYW1wbGVyIGluZGljZXMgdG9vIGxhcmdlIHRvIGZpdCBpbiBhIDQtYml0IHZhbHVlLgorICAgICovCisgICBpbnN0LT5oZWFkZXJfcHJlc2VudCA9CisgICAgICBicnctPmdlbiA8IDUgfHwgaW5zdC0+dGV4dHVyZV9vZmZzZXQgIT0gMCB8fCBpci0+b3AgPT0gaXJfdGc0IHx8CisgICAgICBzYW1wbGVyID49IDE2OworICAgaW5zdC0+YmFzZV9tcmYgPSAyOworICAgaW5zdC0+bWxlbiA9IGluc3QtPmhlYWRlcl9wcmVzZW50ICsgMTsgLyogYWx3YXlzIGF0IGxlYXN0IG9uZSAqLworICAgaW5zdC0+c2FtcGxlciA9IHNhbXBsZXI7CisgICBpbnN0LT5kc3QgPSBkc3RfcmVnKHRoaXMsIGlyLT50eXBlKTsKKyAgIGluc3QtPmRzdC53cml0ZW1hc2sgPSBXUklURU1BU0tfWFlaVzsKKyAgIGluc3QtPnNoYWRvd19jb21wYXJlID0gaXItPnNoYWRvd19jb21wYXJpdG9yICE9IE5VTEw7CisKKyAgIC8qIE1SRiBmb3IgdGhlIGZpcnN0IHBhcmFtZXRlciAqLworICAgaW50IHBhcmFtX2Jhc2UgPSBpbnN0LT5iYXNlX21yZiArIGluc3QtPmhlYWRlcl9wcmVzZW50OworCisgICBpZiAoaXItPm9wID09IGlyX3R4cyB8fCBpci0+b3AgPT0gaXJfcXVlcnlfbGV2ZWxzKSB7CisgICAgICBpbnQgd3JpdGVtYXNrID0gYnJ3LT5nZW4gPT0gNCA/IFdSSVRFTUFTS19XIDogV1JJVEVNQVNLX1g7CisgICAgICBlbWl0KE1PVihkc3RfcmVnKE1SRiwgcGFyYW1fYmFzZSwgbG9kX3R5cGUsIHdyaXRlbWFzayksIGxvZCkpOworICAgfSBlbHNlIHsKKyAgICAgIC8qIExvYWQgdGhlIGNvb3JkaW5hdGUgKi8KKyAgICAgIC8qIEZJTklTSE1FOiBnbF9jbGFtcF9tYXNrIGFuZCBzYXR1cmF0ZSAqLworICAgICAgaW50IGNvb3JkX21hc2sgPSAoMSA8PCBpci0+Y29vcmRpbmF0ZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKSAtIDE7CisgICAgICBpbnQgemVyb19tYXNrID0gMHhmICYgfmNvb3JkX21hc2s7CisKKyAgICAgIGVtaXQoTU9WKGRzdF9yZWcoTVJGLCBwYXJhbV9iYXNlLCBpci0+Y29vcmRpbmF0ZS0+dHlwZSwgY29vcmRfbWFzayksCisgICAgICAgICAgICAgICBjb29yZGluYXRlKSk7CisKKyAgICAgIGlmICh6ZXJvX21hc2sgIT0gMCkgeworICAgICAgICAgZW1pdChNT1YoZHN0X3JlZyhNUkYsIHBhcmFtX2Jhc2UsIGlyLT5jb29yZGluYXRlLT50eXBlLCB6ZXJvX21hc2spLAorICAgICAgICAgICAgICAgICAgc3JjX3JlZygwKSkpOworICAgICAgfQorICAgICAgLyogTG9hZCB0aGUgc2hhZG93IGNvbXBhcml0b3IgKi8KKyAgICAgIGlmIChpci0+c2hhZG93X2NvbXBhcml0b3IgJiYgaXItPm9wICE9IGlyX3R4ZCAmJiAoaXItPm9wICE9IGlyX3RnNCB8fCAhaGFzX25vbmNvbnN0YW50X29mZnNldCkpIHsKKwkgZW1pdChNT1YoZHN0X3JlZyhNUkYsIHBhcmFtX2Jhc2UgKyAxLCBpci0+c2hhZG93X2NvbXBhcml0b3ItPnR5cGUsCisJCQkgIFdSSVRFTUFTS19YKSwKKwkJICBzaGFkb3dfY29tcGFyaXRvcikpOworCSBpbnN0LT5tbGVuKys7CisgICAgICB9CisKKyAgICAgIC8qIExvYWQgdGhlIExPRCBpbmZvICovCisgICAgICBpZiAoaXItPm9wID09IGlyX3RleCB8fCBpci0+b3AgPT0gaXJfdHhsKSB7CisJIGludCBtcmYsIHdyaXRlbWFzazsKKwkgaWYgKGJydy0+Z2VuID49IDUpIHsKKwkgICAgbXJmID0gcGFyYW1fYmFzZSArIDE7CisJICAgIGlmIChpci0+c2hhZG93X2NvbXBhcml0b3IpIHsKKwkgICAgICAgd3JpdGVtYXNrID0gV1JJVEVNQVNLX1k7CisJICAgICAgIC8qIG1sZW4gYWxyZWFkeSBpbmNyZW1lbnRlZCAqLworCSAgICB9IGVsc2UgeworCSAgICAgICB3cml0ZW1hc2sgPSBXUklURU1BU0tfWDsKKwkgICAgICAgaW5zdC0+bWxlbisrOworCSAgICB9CisJIH0gZWxzZSAvKiBicnctPmdlbiA9PSA0ICovIHsKKwkgICAgbXJmID0gcGFyYW1fYmFzZTsKKwkgICAgd3JpdGVtYXNrID0gV1JJVEVNQVNLX1c7CisJIH0KKwkgZW1pdChNT1YoZHN0X3JlZyhNUkYsIG1yZiwgbG9kX3R5cGUsIHdyaXRlbWFzayksIGxvZCkpOworICAgICAgfSBlbHNlIGlmIChpci0+b3AgPT0gaXJfdHhmKSB7CisgICAgICAgICBlbWl0KE1PVihkc3RfcmVnKE1SRiwgcGFyYW1fYmFzZSwgbG9kX3R5cGUsIFdSSVRFTUFTS19XKSwgbG9kKSk7CisgICAgICB9IGVsc2UgaWYgKGlyLT5vcCA9PSBpcl90eGZfbXMpIHsKKyAgICAgICAgIGVtaXQoTU9WKGRzdF9yZWcoTVJGLCBwYXJhbV9iYXNlICsgMSwgc2FtcGxlX2luZGV4X3R5cGUsIFdSSVRFTUFTS19YKSwKKyAgICAgICAgICAgICAgICAgIHNhbXBsZV9pbmRleCkpOworICAgICAgICAgaWYgKGJydy0+Z2VuID49IDcpCisgICAgICAgICAgICAvKiBNQ1MgZGF0YSBpcyBpbiB0aGUgZmlyc3QgY2hhbm5lbCBvZiBgbWNzYCwgYnV0IHdlIG5lZWQgdG8gZ2V0IGl0IGludG8KKyAgICAgICAgICAgICAqIHRoZSAueSBjaGFubmVsIG9mIHRoZSBzZWNvbmQgdmVjNCBvZiBwYXJhbXMsIHNvIHJlcGxpY2F0ZSAueCBhY3Jvc3MKKyAgICAgICAgICAgICAqIHRoZSB3aG9sZSB2ZWM0IGFuZCB0aGVuIG1hc2sgb2ZmIGV2ZXJ5dGhpbmcgZXhjZXB0IC55CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1jcy5zd2l6emxlID0gQlJXX1NXSVpaTEVfWFhYWDsKKyAgICAgICAgICAgIGVtaXQoTU9WKGRzdF9yZWcoTVJGLCBwYXJhbV9iYXNlICsgMSwgZ2xzbF90eXBlOjp1aW50X3R5cGUsIFdSSVRFTUFTS19ZKSwKKyAgICAgICAgICAgICAgICAgICAgIG1jcykpOworICAgICAgICAgaW5zdC0+bWxlbisrOworICAgICAgfSBlbHNlIGlmIChpci0+b3AgPT0gaXJfdHhkKSB7CisJIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9IGxvZF90eXBlOworCisJIGlmIChicnctPmdlbiA+PSA1KSB7CisJICAgIGRQZHguc3dpenpsZSA9IEJSV19TV0laWkxFNChTV0laWkxFX1gsU1dJWlpMRV9YLFNXSVpaTEVfWSxTV0laWkxFX1kpOworCSAgICBkUGR5LnN3aXp6bGUgPSBCUldfU1dJWlpMRTQoU1dJWlpMRV9YLFNXSVpaTEVfWCxTV0laWkxFX1ksU1dJWlpMRV9ZKTsKKwkgICAgZW1pdChNT1YoZHN0X3JlZyhNUkYsIHBhcmFtX2Jhc2UgKyAxLCB0eXBlLCBXUklURU1BU0tfWFopLCBkUGR4KSk7CisJICAgIGVtaXQoTU9WKGRzdF9yZWcoTVJGLCBwYXJhbV9iYXNlICsgMSwgdHlwZSwgV1JJVEVNQVNLX1lXKSwgZFBkeSkpOworCSAgICBpbnN0LT5tbGVuKys7CisKKwkgICAgaWYgKGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMgPT0gMyB8fCBpci0+c2hhZG93X2NvbXBhcml0b3IpIHsKKwkgICAgICAgZFBkeC5zd2l6emxlID0gQlJXX1NXSVpaTEVfWlpaWjsKKwkgICAgICAgZFBkeS5zd2l6emxlID0gQlJXX1NXSVpaTEVfWlpaWjsKKwkgICAgICAgZW1pdChNT1YoZHN0X3JlZyhNUkYsIHBhcmFtX2Jhc2UgKyAyLCB0eXBlLCBXUklURU1BU0tfWCksIGRQZHgpKTsKKwkgICAgICAgZW1pdChNT1YoZHN0X3JlZyhNUkYsIHBhcmFtX2Jhc2UgKyAyLCB0eXBlLCBXUklURU1BU0tfWSksIGRQZHkpKTsKKwkgICAgICAgaW5zdC0+bWxlbisrOworCisgICAgICAgICAgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKSB7CisgICAgICAgICAgICAgICAgICBlbWl0KE1PVihkc3RfcmVnKE1SRiwgcGFyYW1fYmFzZSArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyLT5zaGFkb3dfY29tcGFyaXRvci0+dHlwZSwgV1JJVEVNQVNLX1opLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93X2NvbXBhcml0b3IpKTsKKyAgICAgICAgICAgICAgIH0KKwkgICAgfQorCSB9IGVsc2UgLyogYnJ3LT5nZW4gPT0gNCAqLyB7CisJICAgIGVtaXQoTU9WKGRzdF9yZWcoTVJGLCBwYXJhbV9iYXNlICsgMSwgdHlwZSwgV1JJVEVNQVNLX1hZWiksIGRQZHgpKTsKKwkgICAgZW1pdChNT1YoZHN0X3JlZyhNUkYsIHBhcmFtX2Jhc2UgKyAyLCB0eXBlLCBXUklURU1BU0tfWFlaKSwgZFBkeSkpOworCSAgICBpbnN0LT5tbGVuICs9IDI7CisJIH0KKyAgICAgIH0gZWxzZSBpZiAoaXItPm9wID09IGlyX3RnNCAmJiBoYXNfbm9uY29uc3RhbnRfb2Zmc2V0KSB7CisgICAgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKSB7CisgICAgICAgICAgICBlbWl0KE1PVihkc3RfcmVnKE1SRiwgcGFyYW1fYmFzZSwgaXItPnNoYWRvd19jb21wYXJpdG9yLT50eXBlLCBXUklURU1BU0tfVyksCisgICAgICAgICAgICAgICAgICAgICBzaGFkb3dfY29tcGFyaXRvcikpOworICAgICAgICAgfQorCisgICAgICAgICBlbWl0KE1PVihkc3RfcmVnKE1SRiwgcGFyYW1fYmFzZSArIDEsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgV1JJVEVNQVNLX1hZKSwKKyAgICAgICAgICAgICAgICAgIG9mZnNldF92YWx1ZSkpOworICAgICAgICAgaW5zdC0+bWxlbisrOworICAgICAgfQorICAgfQorCisgICBlbWl0KGluc3QpOworCisgICAvKiBmaXh1cCBudW0gbGF5ZXJzICh6KSBmb3IgY3ViZSBhcnJheXM6IGhhcmR3YXJlIHJldHVybnMgZmFjZXMgKiBsYXllcnM7CisgICAgKiBzcGVjIHJlcXVpcmVzIGxheWVycy4KKyAgICAqLworICAgaWYgKGlyLT5vcCA9PSBpcl90eHMpIHsKKyAgICAgIGdsc2xfdHlwZSBjb25zdCAqdHlwZSA9IGlyLT5zYW1wbGVyLT50eXBlOworICAgICAgaWYgKHR5cGUtPnNhbXBsZXJfZGltZW5zaW9uYWxpdHkgPT0gR0xTTF9TQU1QTEVSX0RJTV9DVUJFICYmCisgICAgICAgICAgdHlwZS0+c2FtcGxlcl9hcnJheSkgeworICAgICAgICAgZW1pdF9tYXRoKFNIQURFUl9PUENPREVfSU5UX1FVT1RJRU5ULAorICAgICAgICAgICAgICAgICAgIHdyaXRlbWFzayhpbnN0LT5kc3QsIFdSSVRFTUFTS19aKSwKKyAgICAgICAgICAgICAgICAgICBzcmNfcmVnKGluc3QtPmRzdCksIHNyY19yZWcoNikpOworICAgICAgfQorICAgfQorCisgICBpZiAoYnJ3LT5nZW4gPT0gNiAmJiBpci0+b3AgPT0gaXJfdGc0KSB7CisgICAgICBlbWl0X2dlbjZfZ2F0aGVyX3dhKGtleS0+dGV4LmdlbjZfZ2F0aGVyX3dhW3NhbXBsZXJdLCBpbnN0LT5kc3QpOworICAgfQorCisgICBzd2l6emxlX3Jlc3VsdChpciwgc3JjX3JlZyhpbnN0LT5kc3QpLCBzYW1wbGVyKTsKK30KKworLyoqCisgKiBBcHBseSB3b3JrYXJvdW5kcyBmb3IgR2VuNiBnYXRoZXIgd2l0aCBVSU5UL1NJTlQKKyAqLwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X2dlbjZfZ2F0aGVyX3dhKHVpbnQ4X3Qgd2EsIGRzdF9yZWcgZHN0KQoreworICAgaWYgKCF3YSkKKyAgICAgIHJldHVybjsKKworICAgaW50IHdpZHRoID0gKHdhICYgV0FfOEJJVCkgPyA4IDogMTY7CisgICBkc3RfcmVnIGRzdF9mID0gZHN0OworICAgZHN0X2YudHlwZSA9IEJSV19SRUdJU1RFUl9UWVBFX0Y7CisKKyAgIC8qIENvbnZlcnQgZnJvbSBVTk9STSB0byBVSU5UICovCisgICBlbWl0KE1VTChkc3RfZiwgc3JjX3JlZyhkc3RfZiksIHNyY19yZWcoKGZsb2F0KSgoMSA8PCB3aWR0aCkgLSAxKSkpKTsKKyAgIGVtaXQoTU9WKGRzdCwgc3JjX3JlZyhkc3RfZikpKTsKKworICAgaWYgKHdhICYgV0FfU0lHTikgeworICAgICAgLyogUmVpbnRlcnByZXQgdGhlIFVJTlQgdmFsdWUgYXMgYSBzaWduZWQgSU5UIHZhbHVlIGJ5CisgICAgICAgKiBzaGlmdGluZyB0aGUgc2lnbiBiaXQgaW50byBwbGFjZSwgdGhlbiBzaGlmdGluZyBiYWNrCisgICAgICAgKiBwcmVzZXJ2aW5nIHNpZ24uCisgICAgICAgKi8KKyAgICAgIGVtaXQoU0hMKGRzdCwgc3JjX3JlZyhkc3QpLCBzcmNfcmVnKDMyIC0gd2lkdGgpKSk7CisgICAgICBlbWl0KEFTUihkc3QsIHNyY19yZWcoZHN0KSwgc3JjX3JlZygzMiAtIHdpZHRoKSkpOworICAgfQorfQorCisvKioKKyAqIFNldCB1cCB0aGUgZ2F0aGVyIGNoYW5uZWwgYmFzZWQgb24gdGhlIHN3aXp6bGUsIGZvciBnYXRoZXI0LgorICovCit1aW50MzJfdAordmVjNF92aXNpdG9yOjpnYXRoZXJfY2hhbm5lbChpcl90ZXh0dXJlICppciwgaW50IHNhbXBsZXIpCit7CisgICBpcl9jb25zdGFudCAqY2hhbiA9IGlyLT5sb2RfaW5mby5jb21wb25lbnQtPmFzX2NvbnN0YW50KCk7CisgICBpbnQgc3dpeiA9IEdFVF9TV1ooa2V5LT50ZXguc3dpenpsZXNbc2FtcGxlcl0sIGNoYW4tPnZhbHVlLmlbMF0pOworICAgc3dpdGNoIChzd2l6KSB7CisgICAgICBjYXNlIFNXSVpaTEVfWDogcmV0dXJuIDA7CisgICAgICBjYXNlIFNXSVpaTEVfWToKKyAgICAgICAgIC8qIGdhdGhlcjQgc2FtcGxlciBpcyBicm9rZW4gZm9yIGdyZWVuIGNoYW5uZWwgb24gUkczMkYgLS0KKyAgICAgICAgICAqIHdlIG11c3QgYXNrIGZvciBibHVlIGluc3RlYWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChrZXktPnRleC5nYXRoZXJfY2hhbm5lbF9xdWlya19tYXNrICYgKDE8PHNhbXBsZXIpKQorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGNhc2UgU1dJWlpMRV9aOiByZXR1cm4gMjsKKyAgICAgIGNhc2UgU1dJWlpMRV9XOiByZXR1cm4gMzsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBhc3NlcnQoISJOb3QgcmVhY2hlZCIpOyAvKiB6ZXJvLCBvbmUgc3dpenpsZXMgaGFuZGxlZCBhbHJlYWR5ICovCisgICAgICAgICByZXR1cm4gMDsKKyAgIH0KK30KKwordm9pZAordmVjNF92aXNpdG9yOjpzd2l6emxlX3Jlc3VsdChpcl90ZXh0dXJlICppciwgc3JjX3JlZyBvcmlnX3ZhbCwgaW50IHNhbXBsZXIpCit7CisgICBpbnQgcyA9IGtleS0+dGV4LnN3aXp6bGVzW3NhbXBsZXJdOworCisgICB0aGlzLT5yZXN1bHQgPSBzcmNfcmVnKHRoaXMsIGlyLT50eXBlKTsKKyAgIGRzdF9yZWcgc3dpenpsZWRfcmVzdWx0KHRoaXMtPnJlc3VsdCk7CisKKyAgIGlmIChpci0+b3AgPT0gaXJfcXVlcnlfbGV2ZWxzKSB7CisgICAgICAvKiAjIGxldmVscyBpcyBpbiAudyAqLworICAgICAgb3JpZ192YWwuc3dpenpsZSA9IEJSV19TV0laWkxFNChTV0laWkxFX1csIFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1cpOworICAgICAgZW1pdChNT1Yoc3dpenpsZWRfcmVzdWx0LCBvcmlnX3ZhbCkpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoaXItPm9wID09IGlyX3R4cyB8fCBpci0+dHlwZSA9PSBnbHNsX3R5cGU6OmZsb2F0X3R5cGUKKwkJCXx8IHMgPT0gU1dJWlpMRV9OT09QIHx8IGlyLT5vcCA9PSBpcl90ZzQpIHsKKyAgICAgIGVtaXQoTU9WKHN3aXp6bGVkX3Jlc3VsdCwgb3JpZ192YWwpKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworCisgICBpbnQgemVyb19tYXNrID0gMCwgb25lX21hc2sgPSAwLCBjb3B5X21hc2sgPSAwOworICAgaW50IHN3aXp6bGVbNF0gPSB7MH07CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBzd2l0Y2ggKEdFVF9TV1oocywgaSkpIHsKKyAgICAgIGNhc2UgU1dJWlpMRV9aRVJPOgorCSB6ZXJvX21hc2sgfD0gKDEgPDwgaSk7CisJIGJyZWFrOworICAgICAgY2FzZSBTV0laWkxFX09ORToKKwkgb25lX21hc2sgfD0gKDEgPDwgaSk7CisJIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgY29weV9tYXNrIHw9ICgxIDw8IGkpOworCSBzd2l6emxlW2ldID0gR0VUX1NXWihzLCBpKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGlmIChjb3B5X21hc2spIHsKKyAgICAgIG9yaWdfdmFsLnN3aXp6bGUgPSBCUldfU1dJWlpMRTQoc3dpenpsZVswXSwgc3dpenpsZVsxXSwgc3dpenpsZVsyXSwgc3dpenpsZVszXSk7CisgICAgICBzd2l6emxlZF9yZXN1bHQud3JpdGVtYXNrID0gY29weV9tYXNrOworICAgICAgZW1pdChNT1Yoc3dpenpsZWRfcmVzdWx0LCBvcmlnX3ZhbCkpOworICAgfQorCisgICBpZiAoemVyb19tYXNrKSB7CisgICAgICBzd2l6emxlZF9yZXN1bHQud3JpdGVtYXNrID0gemVyb19tYXNrOworICAgICAgZW1pdChNT1Yoc3dpenpsZWRfcmVzdWx0LCBzcmNfcmVnKDAuMGYpKSk7CisgICB9CisKKyAgIGlmIChvbmVfbWFzaykgeworICAgICAgc3dpenpsZWRfcmVzdWx0LndyaXRlbWFzayA9IG9uZV9tYXNrOworICAgICAgZW1pdChNT1Yoc3dpenpsZWRfcmVzdWx0LCBzcmNfcmVnKDEuMGYpKSk7CisgICB9Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6dmlzaXQoaXJfcmV0dXJuICppcikKK3sKKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6dmlzaXQoaXJfZGlzY2FyZCAqaXIpCit7CisgICBhc3NlcnQoISJub3QgcmVhY2hlZCIpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OnZpc2l0KGlyX2lmICppcikKK3sKKyAgIC8qIERvbid0IHBvaW50IHRoZSBhbm5vdGF0aW9uIGF0IHRoZSBpZiBzdGF0ZW1lbnQsIGJlY2F1c2UgdGhlbiBpdCBwbHVzCisgICAgKiB0aGUgdGhlbiBhbmQgZWxzZSBibG9ja3MgZ2V0IHByaW50ZWQuCisgICAgKi8KKyAgIHRoaXMtPmJhc2VfaXIgPSBpci0+Y29uZGl0aW9uOworCisgICBpZiAoYnJ3LT5nZW4gPT0gNikgeworICAgICAgZW1pdF9pZl9nZW42KGlyKTsKKyAgIH0gZWxzZSB7CisgICAgICB1aW50MzJfdCBwcmVkaWNhdGU7CisgICAgICBlbWl0X2Jvb2xfdG9fY29uZF9jb2RlKGlyLT5jb25kaXRpb24sICZwcmVkaWNhdGUpOworICAgICAgZW1pdChJRihwcmVkaWNhdGUpKTsKKyAgIH0KKworICAgdmlzaXRfaW5zdHJ1Y3Rpb25zKCZpci0+dGhlbl9pbnN0cnVjdGlvbnMpOworCisgICBpZiAoIWlyLT5lbHNlX2luc3RydWN0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICB0aGlzLT5iYXNlX2lyID0gaXItPmNvbmRpdGlvbjsKKyAgICAgIGVtaXQoQlJXX09QQ09ERV9FTFNFKTsKKworICAgICAgdmlzaXRfaW5zdHJ1Y3Rpb25zKCZpci0+ZWxzZV9pbnN0cnVjdGlvbnMpOworICAgfQorCisgICB0aGlzLT5iYXNlX2lyID0gaXItPmNvbmRpdGlvbjsKKyAgIGVtaXQoQlJXX09QQ09ERV9FTkRJRik7Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6dmlzaXQoaXJfZW1pdF92ZXJ0ZXggKikKK3sKKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7Cit9CisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6dmlzaXQoaXJfZW5kX3ByaW1pdGl2ZSAqKQoreworICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X3VudHlwZWRfYXRvbWljKHVuc2lnbmVkIGF0b21pY19vcCwgdW5zaWduZWQgc3VyZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfcmVnIGRzdCwgc3JjX3JlZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3JlZyBzcmMwLCBzcmNfcmVnIHNyYzEpCit7CisgICB1bnNpZ25lZCBtbGVuID0gMDsKKworICAgLyogU2V0IHRoZSBhdG9taWMgb3BlcmF0aW9uIG9mZnNldC4gKi8KKyAgIGVtaXQoTU9WKGJyd193cml0ZW1hc2soYnJ3X3V2ZWNfbXJmKDgsIG1sZW4sIDApLCBXUklURU1BU0tfWCksIG9mZnNldCkpOworICAgbWxlbisrOworCisgICAvKiBTZXQgdGhlIGF0b21pYyBvcGVyYXRpb24gYXJndW1lbnRzLiAqLworICAgaWYgKHNyYzAuZmlsZSAhPSBCQURfRklMRSkgeworICAgICAgZW1pdChNT1YoYnJ3X3dyaXRlbWFzayhicndfdXZlY19tcmYoOCwgbWxlbiwgMCksIFdSSVRFTUFTS19YKSwgc3JjMCkpOworICAgICAgbWxlbisrOworICAgfQorCisgICBpZiAoc3JjMS5maWxlICE9IEJBRF9GSUxFKSB7CisgICAgICBlbWl0KE1PVihicndfd3JpdGVtYXNrKGJyd191dmVjX21yZig4LCBtbGVuLCAwKSwgV1JJVEVNQVNLX1gpLCBzcmMxKSk7CisgICAgICBtbGVuKys7CisgICB9CisKKyAgIC8qIEVtaXQgdGhlIGluc3RydWN0aW9uLiAgTm90ZSB0aGF0IHRoaXMgbWFwcyB0byB0aGUgbm9ybWFsIFNJTUQ4CisgICAgKiB1bnR5cGVkIGF0b21pYyBtZXNzYWdlIG9uIEl2eSBCcmlkZ2UsIGJ1dCB0aGF0J3MgT0sgYmVjYXVzZQorICAgICogdW51c2VkIGNoYW5uZWxzIHdpbGwgYmUgbWFza2VkIG91dC4KKyAgICAqLworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoU0hBREVSX09QQ09ERV9VTlRZUEVEX0FUT01JQywgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3JlZyhhdG9taWNfb3ApLCBzcmNfcmVnKHN1cmZfaW5kZXgpKTsKKyAgIGluc3QtPmJhc2VfbXJmID0gMDsKKyAgIGluc3QtPm1sZW4gPSBtbGVuOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfdW50eXBlZF9zdXJmYWNlX3JlYWQodW5zaWduZWQgc3VyZl9pbmRleCwgZHN0X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3JlZyBvZmZzZXQpCit7CisgICAvKiBTZXQgdGhlIHN1cmZhY2UgcmVhZCBvZmZzZXQuICovCisgICBlbWl0KE1PVihicndfd3JpdGVtYXNrKGJyd191dmVjX21yZig4LCAwLCAwKSwgV1JJVEVNQVNLX1gpLCBvZmZzZXQpKTsKKworICAgLyogRW1pdCB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgdGhpcyBtYXBzIHRvIHRoZSBub3JtYWwgU0lNRDgKKyAgICAqIHVudHlwZWQgc3VyZmFjZSByZWFkIG1lc3NhZ2UsIGJ1dCB0aGF0J3MgT0sgYmVjYXVzZSB1bnVzZWQKKyAgICAqIGNoYW5uZWxzIHdpbGwgYmUgbWFza2VkIG91dC4KKyAgICAqLworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoU0hBREVSX09QQ09ERV9VTlRZUEVEX1NVUkZBQ0VfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3JjX3JlZyhzdXJmX2luZGV4KSk7CisgICBpbnN0LT5iYXNlX21yZiA9IDA7CisgICBpbnN0LT5tbGVuID0gMTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X25kY19jb21wdXRhdGlvbigpCit7CisgICAvKiBHZXQgdGhlIHBvc2l0aW9uICovCisgICBzcmNfcmVnIHBvcyA9IHNyY19yZWcob3V0cHV0X3JlZ1tWQVJZSU5HX1NMT1RfUE9TXSk7CisKKyAgIC8qIEJ1aWxkIG5kYyBjb29yZHMsIHdoaWNoIGFyZSAoeC93LCB5L3csIHovdywgMS93KSAqLworICAgZHN0X3JlZyBuZGMgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgIG91dHB1dF9yZWdbQlJXX1ZBUllJTkdfU0xPVF9ORENdID0gbmRjOworCisgICBjdXJyZW50X2Fubm90YXRpb24gPSAiTkRDIjsKKyAgIGRzdF9yZWcgbmRjX3cgPSBuZGM7CisgICBuZGNfdy53cml0ZW1hc2sgPSBXUklURU1BU0tfVzsKKyAgIHNyY19yZWcgcG9zX3cgPSBwb3M7CisgICBwb3Nfdy5zd2l6emxlID0gQlJXX1NXSVpaTEU0KFNXSVpaTEVfVywgU1dJWlpMRV9XLCBTV0laWkxFX1csIFNXSVpaTEVfVyk7CisgICBlbWl0X21hdGgoU0hBREVSX09QQ09ERV9SQ1AsIG5kY193LCBwb3Nfdyk7CisKKyAgIGRzdF9yZWcgbmRjX3h5eiA9IG5kYzsKKyAgIG5kY194eXoud3JpdGVtYXNrID0gV1JJVEVNQVNLX1hZWjsKKworICAgZW1pdChNVUwobmRjX3h5eiwgcG9zLCBzcmNfcmVnKG5kY193KSkpOworfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfcHNpel9hbmRfZmxhZ3Moc3RydWN0IGJyd19yZWcgcmVnKQoreworICAgaWYgKGJydy0+Z2VuIDwgNiAmJgorICAgICAgICgocHJvZ19kYXRhLT52dWVfbWFwLnNsb3RzX3ZhbGlkICYgVkFSWUlOR19CSVRfUFNJWikgfHwKKyAgICAgICAga2V5LT51c2VyY2xpcF9hY3RpdmUgfHwgYnJ3LT5oYXNfbmVnYXRpdmVfcmh3X2J1ZykpIHsKKyAgICAgIGRzdF9yZWcgaGVhZGVyMSA9IGRzdF9yZWcodGhpcywgZ2xzbF90eXBlOjp1dmVjNF90eXBlKTsKKyAgICAgIGRzdF9yZWcgaGVhZGVyMV93ID0gaGVhZGVyMTsKKyAgICAgIGhlYWRlcjFfdy53cml0ZW1hc2sgPSBXUklURU1BU0tfVzsKKworICAgICAgZW1pdChNT1YoaGVhZGVyMSwgMHUpKTsKKworICAgICAgaWYgKHByb2dfZGF0YS0+dnVlX21hcC5zbG90c192YWxpZCAmIFZBUllJTkdfQklUX1BTSVopIHsKKwkgc3JjX3JlZyBwc2l6ID0gc3JjX3JlZyhvdXRwdXRfcmVnW1ZBUllJTkdfU0xPVF9QU0laXSk7CisKKwkgY3VycmVudF9hbm5vdGF0aW9uID0gIlBvaW50IHNpemUiOworCSBlbWl0KE1VTChoZWFkZXIxX3csIHBzaXosIHNyY19yZWcoKGZsb2F0KSgxIDw8IDExKSkpKTsKKwkgZW1pdChBTkQoaGVhZGVyMV93LCBzcmNfcmVnKGhlYWRlcjFfdyksIDB4N2ZmIDw8IDgpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGtleS0+dXNlcmNsaXBfYWN0aXZlKSB7CisgICAgICAgICBjdXJyZW50X2Fubm90YXRpb24gPSAiQ2xpcHBpbmcgZmxhZ3MiOworICAgICAgICAgZHN0X3JlZyBmbGFnczAgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgICAgIGRzdF9yZWcgZmxhZ3MxID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisKKyAgICAgICAgIGVtaXQoQ01QKGRzdF9udWxsX2YoKSwgc3JjX3JlZyhvdXRwdXRfcmVnW1ZBUllJTkdfU0xPVF9DTElQX0RJU1QwXSksIHNyY19yZWcoMC4wZiksIEJSV19DT05ESVRJT05BTF9MKSk7CisgICAgICAgICBlbWl0KFZTX09QQ09ERV9VTlBBQ0tfRkxBR1NfU0lNRDRYMiwgZmxhZ3MwLCBzcmNfcmVnKDApKTsKKyAgICAgICAgIGVtaXQoT1IoaGVhZGVyMV93LCBzcmNfcmVnKGhlYWRlcjFfdyksIHNyY19yZWcoZmxhZ3MwKSkpOworCisgICAgICAgICBlbWl0KENNUChkc3RfbnVsbF9mKCksIHNyY19yZWcob3V0cHV0X3JlZ1tWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMV0pLCBzcmNfcmVnKDAuMGYpLCBCUldfQ09ORElUSU9OQUxfTCkpOworICAgICAgICAgZW1pdChWU19PUENPREVfVU5QQUNLX0ZMQUdTX1NJTUQ0WDIsIGZsYWdzMSwgc3JjX3JlZygwKSk7CisgICAgICAgICBlbWl0KFNITChmbGFnczEsIHNyY19yZWcoZmxhZ3MxKSwgc3JjX3JlZyg0KSkpOworICAgICAgICAgZW1pdChPUihoZWFkZXIxX3csIHNyY19yZWcoaGVhZGVyMV93KSwgc3JjX3JlZyhmbGFnczEpKSk7CisgICAgICB9CisKKyAgICAgIC8qIGk5NjUgY2xpcHBpbmcgd29ya2Fyb3VuZDoKKyAgICAgICAqIDEpIFRlc3QgZm9yIC12ZSByaHcKKyAgICAgICAqIDIpIElmIHNldCwKKyAgICAgICAqICAgICAgc2V0IG5kYyA9ICgwLDAsMCwwKQorICAgICAgICogICAgICBzZXQgdWNwWzZdID0gMQorICAgICAgICoKKyAgICAgICAqIExhdGVyLCBjbGlwcGluZyB3aWxsIGRldGVjdCB1Y3BbNl0gYW5kIGVuc3VyZSB0aGUgcHJpbWl0aXZlIGlzCisgICAgICAgKiBjbGlwcGVkIGFnYWluc3QgYWxsIGZpeGVkIHBsYW5lcy4KKyAgICAgICAqLworICAgICAgaWYgKGJydy0+aGFzX25lZ2F0aXZlX3Jod19idWcpIHsKKyAgICAgICAgIHNyY19yZWcgbmRjX3cgPSBzcmNfcmVnKG91dHB1dF9yZWdbQlJXX1ZBUllJTkdfU0xPVF9ORENdKTsKKyAgICAgICAgIG5kY193LnN3aXp6bGUgPSBCUldfU1dJWlpMRV9XV1dXOworICAgICAgICAgZW1pdChDTVAoZHN0X251bGxfZigpLCBuZGNfdywgc3JjX3JlZygwLjBmKSwgQlJXX0NPTkRJVElPTkFMX0wpKTsKKyAgICAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3Q7CisgICAgICAgICBpbnN0ID0gZW1pdChPUihoZWFkZXIxX3csIHNyY19yZWcoaGVhZGVyMV93KSwgc3JjX3JlZygxdSA8PCA2KSkpOworICAgICAgICAgaW5zdC0+cHJlZGljYXRlID0gQlJXX1BSRURJQ0FURV9OT1JNQUw7CisgICAgICAgICBpbnN0ID0gZW1pdChNT1Yob3V0cHV0X3JlZ1tCUldfVkFSWUlOR19TTE9UX05EQ10sIHNyY19yZWcoMC4wZikpKTsKKyAgICAgICAgIGluc3QtPnByZWRpY2F0ZSA9IEJSV19QUkVESUNBVEVfTk9STUFMOworICAgICAgfQorCisgICAgICBlbWl0KE1PVihyZXR5cGUocmVnLCBCUldfUkVHSVNURVJfVFlQRV9VRCksIHNyY19yZWcoaGVhZGVyMSkpKTsKKyAgIH0gZWxzZSBpZiAoYnJ3LT5nZW4gPCA2KSB7CisgICAgICBlbWl0KE1PVihyZXR5cGUocmVnLCBCUldfUkVHSVNURVJfVFlQRV9VRCksIDB1KSk7CisgICB9IGVsc2UgeworICAgICAgZW1pdChNT1YocmV0eXBlKHJlZywgQlJXX1JFR0lTVEVSX1RZUEVfRCksIHNyY19yZWcoMCkpKTsKKyAgICAgIGlmIChwcm9nX2RhdGEtPnZ1ZV9tYXAuc2xvdHNfdmFsaWQgJiBWQVJZSU5HX0JJVF9QU0laKSB7CisgICAgICAgICBlbWl0KE1PVihicndfd3JpdGVtYXNrKHJlZywgV1JJVEVNQVNLX1cpLAorICAgICAgICAgICAgICAgICAgc3JjX3JlZyhvdXRwdXRfcmVnW1ZBUllJTkdfU0xPVF9QU0laXSkpKTsKKyAgICAgIH0KKyAgICAgIGlmIChwcm9nX2RhdGEtPnZ1ZV9tYXAuc2xvdHNfdmFsaWQgJiBWQVJZSU5HX0JJVF9MQVlFUikgeworICAgICAgICAgZW1pdChNT1YocmV0eXBlKGJyd193cml0ZW1hc2socmVnLCBXUklURU1BU0tfWSksIEJSV19SRUdJU1RFUl9UWVBFX0QpLAorICAgICAgICAgICAgICAgICAgc3JjX3JlZyhvdXRwdXRfcmVnW1ZBUllJTkdfU0xPVF9MQVlFUl0pKSk7CisgICAgICB9CisgICAgICBpZiAocHJvZ19kYXRhLT52dWVfbWFwLnNsb3RzX3ZhbGlkICYgVkFSWUlOR19CSVRfVklFV1BPUlQpIHsKKyAgICAgICAgIGVtaXQoTU9WKHJldHlwZShicndfd3JpdGVtYXNrKHJlZywgV1JJVEVNQVNLX1opLCBCUldfUkVHSVNURVJfVFlQRV9EKSwKKyAgICAgICAgICAgICAgICAgIHNyY19yZWcob3V0cHV0X3JlZ1tWQVJZSU5HX1NMT1RfVklFV1BPUlRdKSkpOworICAgICAgfQorICAgfQorfQorCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfY2xpcF9kaXN0YW5jZXMoZHN0X3JlZyByZWcsIGludCBvZmZzZXQpCit7CisgICAvKiBGcm9tIHRoZSBHTFNMIDEuMzAgc3BlYywgc2VjdGlvbiA3LjEgKFZlcnRleCBTaGFkZXIgU3BlY2lhbCBWYXJpYWJsZXMpOgorICAgICoKKyAgICAqICAgICAiSWYgYSBsaW5rZWQgc2V0IG9mIHNoYWRlcnMgZm9ybWluZyB0aGUgdmVydGV4IHN0YWdlIGNvbnRhaW5zIG5vCisgICAgKiAgICAgc3RhdGljIHdyaXRlIHRvIGdsX0NsaXBWZXJ0ZXggb3IgZ2xfQ2xpcERpc3RhbmNlLCBidXQgdGhlCisgICAgKiAgICAgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCBjbGlwcGluZyBhZ2FpbnN0IHVzZXIgY2xpcCBwbGFuZXMgdGhyb3VnaAorICAgICogICAgIHRoZSBBUEksIHRoZW4gdGhlIGNvb3JkaW5hdGUgd3JpdHRlbiB0byBnbF9Qb3NpdGlvbiBpcyB1c2VkIGZvcgorICAgICogICAgIGNvbXBhcmlzb24gYWdhaW5zdCB0aGUgdXNlciBjbGlwIHBsYW5lcy4iCisgICAgKgorICAgICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgc2hhZGVyIGRpZG4ndCB3cml0ZSB0bworICAgICogZ2xfQ2xpcERpc3RhbmNlLiAgQWNjb3JkaW5nbHksIHdlIHVzZSBnbF9DbGlwVmVydGV4IHRvIHBlcmZvcm0gY2xpcHBpbmcKKyAgICAqIGlmIHRoZSB1c2VyIHdyb3RlIHRvIGl0OyBvdGhlcndpc2Ugd2UgdXNlIGdsX1Bvc2l0aW9uLgorICAgICovCisgICBnbF92YXJ5aW5nX3Nsb3QgY2xpcF92ZXJ0ZXggPSBWQVJZSU5HX1NMT1RfQ0xJUF9WRVJURVg7CisgICBpZiAoIShwcm9nX2RhdGEtPnZ1ZV9tYXAuc2xvdHNfdmFsaWQgJiBWQVJZSU5HX0JJVF9DTElQX1ZFUlRFWCkpIHsKKyAgICAgIGNsaXBfdmVydGV4ID0gVkFSWUlOR19TTE9UX1BPUzsKKyAgIH0KKworICAgZm9yIChpbnQgaSA9IDA7IGkgKyBvZmZzZXQgPCBrZXktPm5yX3VzZXJjbGlwX3BsYW5lX2NvbnN0cyAmJiBpIDwgNDsKKyAgICAgICAgKytpKSB7CisgICAgICByZWcud3JpdGVtYXNrID0gMSA8PCBpOworICAgICAgZW1pdChEUDQocmVnLAorICAgICAgICAgICAgICAgc3JjX3JlZyhvdXRwdXRfcmVnW2NsaXBfdmVydGV4XSksCisgICAgICAgICAgICAgICBzcmNfcmVnKHRoaXMtPnVzZXJwbGFuZVtpICsgb2Zmc2V0XSkpKTsKKyAgIH0KK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X2dlbmVyaWNfdXJiX3Nsb3QoZHN0X3JlZyByZWcsIGludCB2YXJ5aW5nKQoreworICAgYXNzZXJ0ICh2YXJ5aW5nIDwgVkFSWUlOR19TTE9UX01BWCk7CisgICByZWcudHlwZSA9IG91dHB1dF9yZWdbdmFyeWluZ10udHlwZTsKKyAgIGN1cnJlbnRfYW5ub3RhdGlvbiA9IG91dHB1dF9yZWdfYW5ub3RhdGlvblt2YXJ5aW5nXTsKKyAgIC8qIENvcHkgdGhlIHJlZ2lzdGVyLCBzYXR1cmF0aW5nIGlmIG5lY2Vzc2FyeSAqLworICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9IGVtaXQoTU9WKHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmVnKG91dHB1dF9yZWdbdmFyeWluZ10pKSk7CisgICBpZiAoKHZhcnlpbmcgPT0gVkFSWUlOR19TTE9UX0NPTDAgfHwKKyAgICAgICAgdmFyeWluZyA9PSBWQVJZSU5HX1NMT1RfQ09MMSB8fAorICAgICAgICB2YXJ5aW5nID09IFZBUllJTkdfU0xPVF9CRkMwIHx8CisgICAgICAgIHZhcnlpbmcgPT0gVkFSWUlOR19TTE9UX0JGQzEpICYmCisgICAgICAga2V5LT5jbGFtcF92ZXJ0ZXhfY29sb3IpIHsKKyAgICAgIGluc3QtPnNhdHVyYXRlID0gdHJ1ZTsKKyAgIH0KK30KKwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X3VyYl9zbG90KGludCBtcmYsIGludCB2YXJ5aW5nKQoreworICAgc3RydWN0IGJyd19yZWcgaHdfcmVnID0gYnJ3X21lc3NhZ2VfcmVnKG1yZik7CisgICBkc3RfcmVnIHJlZyA9IGRzdF9yZWcoTVJGLCBtcmYpOworICAgcmVnLnR5cGUgPSBCUldfUkVHSVNURVJfVFlQRV9GOworCisgICBzd2l0Y2ggKHZhcnlpbmcpIHsKKyAgIGNhc2UgVkFSWUlOR19TTE9UX1BTSVo6CisgICAgICAvKiBQU0laIGlzIGFsd2F5cyBpbiBzbG90IDAsIGFuZCBpcyBjb3VwbGVkIHdpdGggb3RoZXIgZmxhZ3MuICovCisgICAgICBjdXJyZW50X2Fubm90YXRpb24gPSAiaW5kaWNlcywgcG9pbnQgd2lkdGgsIGNsaXAgZmxhZ3MiOworICAgICAgZW1pdF9wc2l6X2FuZF9mbGFncyhod19yZWcpOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19WQVJZSU5HX1NMT1RfTkRDOgorICAgICAgY3VycmVudF9hbm5vdGF0aW9uID0gIk5EQyI7CisgICAgICBlbWl0KE1PVihyZWcsIHNyY19yZWcob3V0cHV0X3JlZ1tCUldfVkFSWUlOR19TTE9UX05EQ10pKSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgVkFSWUlOR19TTE9UX1BPUzoKKyAgICAgIGN1cnJlbnRfYW5ub3RhdGlvbiA9ICJnbF9Qb3NpdGlvbiI7CisgICAgICBlbWl0KE1PVihyZWcsIHNyY19yZWcob3V0cHV0X3JlZ1tWQVJZSU5HX1NMT1RfUE9TXSkpKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBWQVJZSU5HX1NMT1RfRURHRToKKyAgICAgIC8qIFRoaXMgaXMgcHJlc2VudCB3aGVuIGRvaW5nIHVuZmlsbGVkIHBvbHlnb25zLiAgV2UncmUgc3VwcG9zZWQgdG8gY29weQorICAgICAgICogdGhlIGVkZ2UgZmxhZyBmcm9tIHRoZSB1c2VyLXByb3ZpZGVkIHZlcnRleCBhcnJheQorICAgICAgICogKGdsRWRnZUZsYWdQb2ludGVyKSwgb3Igb3RoZXJ3aXNlIHdlJ2xsIGNvcHkgZnJvbSB0aGUgY3VycmVudCB2YWx1ZQorICAgICAgICogb2YgdGhhdCBhdHRyaWJ1dGUgKHN0YXJ0cyBhcyAxLjBmKS4gIFRoaXMgaXMgdGhlbiB1c2VkIGluIGNsaXBwaW5nIHRvCisgICAgICAgKiBkZXRlcm1pbmUgd2hpY2ggZWRnZXMgc2hvdWxkIGJlIGRyYXduIGFzIHdpcmVmcmFtZS4KKyAgICAgICAqLworICAgICAgY3VycmVudF9hbm5vdGF0aW9uID0gImVkZ2UgZmxhZyI7CisgICAgICBlbWl0KE1PVihyZWcsIHNyY19yZWcoZHN0X3JlZyhBVFRSLCBWRVJUX0FUVFJJQl9FREdFRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgV1JJVEVNQVNLX1hZWlcpKSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIEJSV19WQVJZSU5HX1NMT1RfUEFEOgorICAgICAgLyogTm8gbmVlZCB0byB3cml0ZSB0byB0aGlzIHNsb3QgKi8KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGVtaXRfZ2VuZXJpY191cmJfc2xvdChyZWcsIHZhcnlpbmcpOworICAgICAgYnJlYWs7CisgICB9Cit9CisKK3N0YXRpYyBpbnQKK2FsaWduX2ludGVybGVhdmVkX3VyYl9tbGVuKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBpbnQgbWxlbikKK3sKKyAgIGlmIChicnctPmdlbiA+PSA2KSB7CisgICAgICAvKiBVUkIgZGF0YSB3cml0dGVuIChkb2VzIG5vdCBpbmNsdWRlIHRoZSBtZXNzYWdlIGhlYWRlciByZWcpIG11c3QKKyAgICAgICAqIGJlIGEgbXVsdGlwbGUgb2YgMjU2IGJpdHMsIG9yIDIgVlMgcmVnaXN0ZXJzLiAgU2VlIHZvbDVjLjUsCisgICAgICAgKiBzZWN0aW9uIDUuNC4zLjIuMjogVVJCX0lOVEVSTEVBVkVELgorICAgICAgICoKKyAgICAgICAqIFVSQiBlbnRyaWVzIGFyZSBhbGxvY2F0ZWQgb24gYSBtdWx0aXBsZSBvZiAxMDI0IGJpdHMsIHNvIGFuCisgICAgICAgKiBleHRyYSAxMjggYml0cyB3cml0dGVuIGhlcmUgdG8gbWFrZSB0aGUgZW5kIGFsaWduIHRvIDI1NiBpcworICAgICAgICogbm8gcHJvYmxlbS4KKyAgICAgICAqLworICAgICAgaWYgKChtbGVuICUgMikgIT0gMSkKKwkgbWxlbisrOworICAgfQorCisgICByZXR1cm4gbWxlbjsKK30KKworCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgVlVFIHBheWxvYWQgcGx1cyB0aGUgbmVjZXNzYXJ5IFVSQiB3cml0ZSBpbnN0cnVjdGlvbnMgdG8KKyAqIG91dHB1dCBpdC4KKyAqCisgKiBUaGUgVlVFIGxheW91dCBpcyBkb2N1bWVudGVkIGluIFZvbHVtZSAyYS4KKyAqLwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X3ZlcnRleCgpCit7CisgICAvKiBNUkYgMCBpcyByZXNlcnZlZCBmb3IgdGhlIGRlYnVnZ2VyLCBzbyBzdGFydCB3aXRoIG1lc3NhZ2UgaGVhZGVyCisgICAgKiBpbiBNUkYgMS4KKyAgICAqLworICAgaW50IGJhc2VfbXJmID0gMTsKKyAgIGludCBtcmYgPSBiYXNlX21yZjsKKyAgIC8qIEluIHRoZSBwcm9jZXNzIG9mIGdlbmVyYXRpbmcgb3VyIFVSQiB3cml0ZSBtZXNzYWdlIGNvbnRlbnRzLCB3ZQorICAgICogbWF5IG5lZWQgdG8gdW5zcGlsbCBhIHJlZ2lzdGVyIG9yIGxvYWQgZnJvbSBhbiBhcnJheS4gIFRob3NlCisgICAgKiByZWFkcyB3b3VsZCB1c2UgTVJGcyAxNC0xNS4KKyAgICAqLworICAgaW50IG1heF91c2FibGVfbXJmID0gMTM7CisKKyAgIC8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHZlcmlmaWVzIHRoYXQgbWF4X3VzYWJsZV9tcmYgY2F1c2VzIGFuCisgICAgKiBldmVuLW51bWJlcmVkIGFtb3VudCBvZiBVUkIgd3JpdGUgZGF0YSwgd2hpY2ggd2lsbCBtZWV0IGdlbjYncworICAgICogcmVxdWlyZW1lbnRzIGZvciBsZW5ndGggYWxpZ25tZW50LgorICAgICovCisgICBhc3NlcnQgKChtYXhfdXNhYmxlX21yZiAtIGJhc2VfbXJmKSAlIDIgPT0gMCk7CisKKyAgIC8qIEZpcnN0IG1yZiBpcyB0aGUgZzAtYmFzZWQgbWVzc2FnZSBoZWFkZXIgY29udGFpbmluZyBVUkIgaGFuZGxlcyBhbmQKKyAgICAqIHN1Y2guCisgICAgKi8KKyAgIGVtaXRfdXJiX3dyaXRlX2hlYWRlcihtcmYrKyk7CisKKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIGVtaXRfbmRjX2NvbXB1dGF0aW9uKCk7CisgICB9CisKKyAgIC8qIExvd2VyIGxlZ2FjeSBmZiBhbmQgQ2xpcFZlcnRleCBjbGlwcGluZyB0byBjbGlwIGRpc3RhbmNlcyAqLworICAgaWYgKGtleS0+dXNlcmNsaXBfYWN0aXZlICYmICFwcm9nLT5Vc2VzQ2xpcERpc3RhbmNlT3V0KSB7CisgICAgICBjdXJyZW50X2Fubm90YXRpb24gPSAidXNlciBjbGlwIGRpc3RhbmNlcyI7CisKKyAgICAgIG91dHB1dF9yZWdbVkFSWUlOR19TTE9UX0NMSVBfRElTVDBdID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisgICAgICBvdXRwdXRfcmVnW1ZBUllJTkdfU0xPVF9DTElQX0RJU1QxXSA9IGRzdF9yZWcodGhpcywgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworCisgICAgICBlbWl0X2NsaXBfZGlzdGFuY2VzKG91dHB1dF9yZWdbVkFSWUlOR19TTE9UX0NMSVBfRElTVDBdLCAwKTsKKyAgICAgIGVtaXRfY2xpcF9kaXN0YW5jZXMob3V0cHV0X3JlZ1tWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMV0sIDQpOworICAgfQorCisgICAvKiBXZSBtYXkgbmVlZCB0byBzcGxpdCB0aGlzIHVwIGludG8gc2V2ZXJhbCBVUkIgd3JpdGVzLCBzbyBkbyB0aGVtIGluIGEKKyAgICAqIGxvb3AuCisgICAgKi8KKyAgIGludCBzbG90ID0gMDsKKyAgIGJvb2wgY29tcGxldGUgPSBmYWxzZTsKKyAgIGRvIHsKKyAgICAgIC8qIFVSQiBvZmZzZXQgaXMgaW4gVVJCIHJvdyBpbmNyZW1lbnRzLCBhbmQgZWFjaCBvZiBvdXIgTVJGcyBpcyBoYWxmIG9mCisgICAgICAgKiBvbmUgb2YgdGhvc2UsIHNpbmNlIHdlJ3JlIGRvaW5nIGludGVybGVhdmVkIHdyaXRlcy4KKyAgICAgICAqLworICAgICAgaW50IG9mZnNldCA9IHNsb3QgLyAyOworCisgICAgICBtcmYgPSBiYXNlX21yZiArIDE7CisgICAgICBmb3IgKDsgc2xvdCA8IHByb2dfZGF0YS0+dnVlX21hcC5udW1fc2xvdHM7ICsrc2xvdCkgeworICAgICAgICAgZW1pdF91cmJfc2xvdChtcmYrKywgcHJvZ19kYXRhLT52dWVfbWFwLnNsb3RfdG9fdmFyeWluZ1tzbG90XSk7CisKKyAgICAgICAgIC8qIElmIHRoaXMgd2FzIG1heF91c2FibGVfbXJmLCB3ZSBjYW4ndCBmaXQgYW55dGhpbmcgbW9yZSBpbnRvIHRoaXMKKyAgICAgICAgICAqIFVSQiBXUklURS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKG1yZiA+IG1heF91c2FibGVfbXJmKSB7CisgICAgICAgICAgICBzbG90Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29tcGxldGUgPSBzbG90ID49IHByb2dfZGF0YS0+dnVlX21hcC5udW1fc2xvdHM7CisgICAgICBjdXJyZW50X2Fubm90YXRpb24gPSAiVVJCIHdyaXRlIjsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSBlbWl0X3VyYl93cml0ZV9vcGNvZGUoY29tcGxldGUpOworICAgICAgaW5zdC0+YmFzZV9tcmYgPSBiYXNlX21yZjsKKyAgICAgIGluc3QtPm1sZW4gPSBhbGlnbl9pbnRlcmxlYXZlZF91cmJfbWxlbihicncsIG1yZiAtIGJhc2VfbXJmKTsKKyAgICAgIGluc3QtPm9mZnNldCArPSBvZmZzZXQ7CisgICB9IHdoaWxlKCFjb21wbGV0ZSk7Cit9CisKKworc3JjX3JlZwordmVjNF92aXNpdG9yOjpnZXRfc2NyYXRjaF9vZmZzZXQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKwkJCQkgc3JjX3JlZyAqcmVsYWRkciwgaW50IHJlZ19vZmZzZXQpCit7CisgICAvKiBCZWNhdXNlIHdlIHN0b3JlIHRoZSB2YWx1ZXMgdG8gc2NyYXRjaCBpbnRlcmxlYXZlZCBsaWtlIG91cgorICAgICogdmVydGV4IGRhdGEsIHdlIG5lZWQgdG8gc2NhbGUgdGhlIHZlYzQgaW5kZXggYnkgMi4KKyAgICAqLworICAgaW50IG1lc3NhZ2VfaGVhZGVyX3NjYWxlID0gMjsKKworICAgLyogUHJlLWdlbjYsIHRoZSBtZXNzYWdlIGhlYWRlciB1c2VzIGJ5dGUgb2Zmc2V0cyBpbnN0ZWFkIG9mIHZlYzQKKyAgICAqICgxNi1ieXRlKSBvZmZzZXQgdW5pdHMuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA8IDYpCisgICAgICBtZXNzYWdlX2hlYWRlcl9zY2FsZSAqPSAxNjsKKworICAgaWYgKHJlbGFkZHIpIHsKKyAgICAgIHNyY19yZWcgaW5kZXggPSBzcmNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6aW50X3R5cGUpOworCisgICAgICBlbWl0X2JlZm9yZShpbnN0LCBBREQoZHN0X3JlZyhpbmRleCksICpyZWxhZGRyLCBzcmNfcmVnKHJlZ19vZmZzZXQpKSk7CisgICAgICBlbWl0X2JlZm9yZShpbnN0LCBNVUwoZHN0X3JlZyhpbmRleCksCisJCQkgICAgaW5kZXgsIHNyY19yZWcobWVzc2FnZV9oZWFkZXJfc2NhbGUpKSk7CisKKyAgICAgIHJldHVybiBpbmRleDsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3JjX3JlZyhyZWdfb2Zmc2V0ICogbWVzc2FnZV9oZWFkZXJfc2NhbGUpOworICAgfQorfQorCitzcmNfcmVnCit2ZWM0X3Zpc2l0b3I6OmdldF9wdWxsX2NvbnN0YW50X29mZnNldCh2ZWM0X2luc3RydWN0aW9uICppbnN0LAorCQkJCSAgICAgICBzcmNfcmVnICpyZWxhZGRyLCBpbnQgcmVnX29mZnNldCkKK3sKKyAgIGlmIChyZWxhZGRyKSB7CisgICAgICBzcmNfcmVnIGluZGV4ID0gc3JjX3JlZyh0aGlzLCBnbHNsX3R5cGU6OmludF90eXBlKTsKKworICAgICAgZW1pdF9iZWZvcmUoaW5zdCwgQUREKGRzdF9yZWcoaW5kZXgpLCAqcmVsYWRkciwgc3JjX3JlZyhyZWdfb2Zmc2V0KSkpOworCisgICAgICAvKiBQcmUtZ2VuNiwgdGhlIG1lc3NhZ2UgaGVhZGVyIHVzZXMgYnl0ZSBvZmZzZXRzIGluc3RlYWQgb2YgdmVjNAorICAgICAgICogKDE2LWJ5dGUpIG9mZnNldCB1bml0cy4KKyAgICAgICAqLworICAgICAgaWYgKGJydy0+Z2VuIDwgNikgeworCSBlbWl0X2JlZm9yZShpbnN0LCBNVUwoZHN0X3JlZyhpbmRleCksIGluZGV4LCBzcmNfcmVnKDE2KSkpOworICAgICAgfQorCisgICAgICByZXR1cm4gaW5kZXg7CisgICB9IGVsc2UgaWYgKGJydy0+Z2VuID49IDgpIHsKKyAgICAgIC8qIFN0b3JlIHRoZSBvZmZzZXQgaW4gYSBHUkYgc28gd2UgY2FuIHNlbmQtZnJvbS1HUkYuICovCisgICAgICBzcmNfcmVnIG9mZnNldCA9IHNyY19yZWcodGhpcywgZ2xzbF90eXBlOjppbnRfdHlwZSk7CisgICAgICBlbWl0X2JlZm9yZShpbnN0LCBNT1YoZHN0X3JlZyhvZmZzZXQpLCBzcmNfcmVnKHJlZ19vZmZzZXQpKSk7CisgICAgICByZXR1cm4gb2Zmc2V0OworICAgfSBlbHNlIHsKKyAgICAgIGludCBtZXNzYWdlX2hlYWRlcl9zY2FsZSA9IGJydy0+Z2VuIDwgNiA/IDE2IDogMTsKKyAgICAgIHJldHVybiBzcmNfcmVnKHJlZ19vZmZzZXQgKiBtZXNzYWdlX2hlYWRlcl9zY2FsZSk7CisgICB9Cit9CisKKy8qKgorICogRW1pdHMgYW4gaW5zdHJ1Y3Rpb24gYmVmb3JlIEBpbnN0IHRvIGxvYWQgdGhlIHZhbHVlIG5hbWVkIGJ5IEBvcmlnX3NyYworICogZnJvbSBzY3JhdGNoIHNwYWNlIGF0IEBiYXNlX29mZnNldCB0byBAdGVtcC4KKyAqCisgKiBAYmFzZV9vZmZzZXQgaXMgbWVhc3VyZWQgaW4gMzItYnl0ZSB1bml0cyAodGhlIHNpemUgb2YgYSByZWdpc3RlcikuCisgKi8KK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6ZW1pdF9zY3JhdGNoX3JlYWQodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwKKwkJCQlkc3RfcmVnIHRlbXAsIHNyY19yZWcgb3JpZ19zcmMsCisJCQkJaW50IGJhc2Vfb2Zmc2V0KQoreworICAgaW50IHJlZ19vZmZzZXQgPSBiYXNlX29mZnNldCArIG9yaWdfc3JjLnJlZ19vZmZzZXQ7CisgICBzcmNfcmVnIGluZGV4ID0gZ2V0X3NjcmF0Y2hfb2Zmc2V0KGluc3QsIG9yaWdfc3JjLnJlbGFkZHIsIHJlZ19vZmZzZXQpOworCisgICBlbWl0X2JlZm9yZShpbnN0LCBTQ1JBVENIX1JFQUQodGVtcCwgaW5kZXgpKTsKK30KKworLyoqCisgKiBFbWl0cyBhbiBpbnN0cnVjdGlvbiBhZnRlciBAaW5zdCB0byBzdG9yZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbgorICogdG8gQG9yaWdfZHN0IHRvIHNjcmF0Y2ggc3BhY2UgYXQgQGJhc2Vfb2Zmc2V0LCBmcm9tIEB0ZW1wLgorICoKKyAqIEBiYXNlX29mZnNldCBpcyBtZWFzdXJlZCBpbiAzMi1ieXRlIHVuaXRzICh0aGUgc2l6ZSBvZiBhIHJlZ2lzdGVyKS4KKyAqLwordm9pZAordmVjNF92aXNpdG9yOjplbWl0X3NjcmF0Y2hfd3JpdGUodmVjNF9pbnN0cnVjdGlvbiAqaW5zdCwgaW50IGJhc2Vfb2Zmc2V0KQoreworICAgaW50IHJlZ19vZmZzZXQgPSBiYXNlX29mZnNldCArIGluc3QtPmRzdC5yZWdfb2Zmc2V0OworICAgc3JjX3JlZyBpbmRleCA9IGdldF9zY3JhdGNoX29mZnNldChpbnN0LCBpbnN0LT5kc3QucmVsYWRkciwgcmVnX29mZnNldCk7CisKKyAgIC8qIENyZWF0ZSBhIHRlbXBvcmFyeSByZWdpc3RlciB0byBzdG9yZSAqaW5zdCdzIHJlc3VsdCBpbi4KKyAgICAqCisgICAgKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgaW4gTU9WaW5nIGZyb20gb3VyIHRlbXBvcmFyeSByZXN1bHQgcmVnaXN0ZXIgaW4KKyAgICAqIHRoZSBzY3JhdGNoIHdyaXRlLiAgSWYgd2Ugc3dpenpsZSBmcm9tIGNoYW5uZWxzIG9mIHRoZSB0ZW1wb3JhcnkgdGhhdAorICAgICogd2VyZW4ndCBpbml0aWFsaXplZCwgaXQgd2lsbCBjb25mdXNlIGxpdmUgaW50ZXJ2YWwgYW5hbHlzaXMsIHdoaWNoIHdpbGwKKyAgICAqIG1ha2Ugc3BpbGxpbmcgZmFpbCB0byBtYWtlIHByb2dyZXNzLgorICAgICovCisgICBzcmNfcmVnIHRlbXAgPSBzcmNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgIHRlbXAudHlwZSA9IGluc3QtPmRzdC50eXBlOworICAgaW50IGZpcnN0X3dyaXRlbWFza19jaGFuID0gZmZzKGluc3QtPmRzdC53cml0ZW1hc2spIC0gMTsKKyAgIGludCBzd2l6emxlc1s0XTsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgaWYgKGluc3QtPmRzdC53cml0ZW1hc2sgJiAoMSA8PCBpKSkKKyAgICAgICAgIHN3aXp6bGVzW2ldID0gaTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHN3aXp6bGVzW2ldID0gZmlyc3Rfd3JpdGVtYXNrX2NoYW47CisgICB0ZW1wLnN3aXp6bGUgPSBCUldfU1dJWlpMRTQoc3dpenpsZXNbMF0sIHN3aXp6bGVzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGVzWzJdLCBzd2l6emxlc1szXSk7CisKKyAgIGRzdF9yZWcgZHN0ID0gZHN0X3JlZyhicndfd3JpdGVtYXNrKGJyd192ZWM4X2dyZigwLCAwKSwKKwkJCQkgICAgICAgaW5zdC0+ZHN0LndyaXRlbWFzaykpOworICAgdmVjNF9pbnN0cnVjdGlvbiAqd3JpdGUgPSBTQ1JBVENIX1dSSVRFKGRzdCwgdGVtcCwgaW5kZXgpOworICAgd3JpdGUtPnByZWRpY2F0ZSA9IGluc3QtPnByZWRpY2F0ZTsKKyAgIHdyaXRlLT5pciA9IGluc3QtPmlyOworICAgd3JpdGUtPmFubm90YXRpb24gPSBpbnN0LT5hbm5vdGF0aW9uOworICAgaW5zdC0+aW5zZXJ0X2FmdGVyKHdyaXRlKTsKKworICAgaW5zdC0+ZHN0LmZpbGUgPSB0ZW1wLmZpbGU7CisgICBpbnN0LT5kc3QucmVnID0gdGVtcC5yZWc7CisgICBpbnN0LT5kc3QucmVnX29mZnNldCA9IHRlbXAucmVnX29mZnNldDsKKyAgIGluc3QtPmRzdC5yZWxhZGRyID0gTlVMTDsKK30KKworLyoqCisgKiBXZSBjYW4ndCBnZW5lcmFsbHkgc3VwcG9ydCBhcnJheSBhY2Nlc3MgaW4gR1JGIHNwYWNlLCBiZWNhdXNlIGEKKyAqIHNpbmdsZSBpbnN0cnVjdGlvbidzIGRlc3RpbmF0aW9uIGNhbiBvbmx5IHNwYW4gMiBjb250aWd1b3VzCisgKiByZWdpc3RlcnMuICBTbywgd2Ugc2VuZCBhbGwgR1JGIGFycmF5cyB0aGF0IGdldCB2YXJpYWJsZSBpbmRleAorICogYWNjZXNzIHRvIHNjcmF0Y2ggc3BhY2UuCisgKi8KK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6bW92ZV9ncmZfYXJyYXlfYWNjZXNzX3RvX3NjcmF0Y2goKQoreworICAgaW50IHNjcmF0Y2hfbG9jW3RoaXMtPnZpcnR1YWxfZ3JmX2NvdW50XTsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52aXJ0dWFsX2dyZl9jb3VudDsgaSsrKSB7CisgICAgICBzY3JhdGNoX2xvY1tpXSA9IC0xOworICAgfQorCisgICAvKiBGaXJzdCwgY2FsY3VsYXRlIHRoZSBzZXQgb2YgdmlydHVhbCBHUkZzIHRoYXQgbmVlZCB0byBiZSBwdW50ZWQKKyAgICAqIHRvIHNjcmF0Y2ggZHVlIHRvIGhhdmluZyBhbnkgYXJyYXkgYWNjZXNzIG9uIHRoZW0sIGFuZCB3aGVyZSBpbgorICAgICogc2NyYXRjaC4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIGlmIChpbnN0LT5kc3QuZmlsZSA9PSBHUkYgJiYgaW5zdC0+ZHN0LnJlbGFkZHIgJiYKKwkgIHNjcmF0Y2hfbG9jW2luc3QtPmRzdC5yZWddID09IC0xKSB7CisJIHNjcmF0Y2hfbG9jW2luc3QtPmRzdC5yZWddID0gYy0+bGFzdF9zY3JhdGNoOworCSBjLT5sYXN0X3NjcmF0Y2ggKz0gdGhpcy0+dmlydHVhbF9ncmZfc2l6ZXNbaW5zdC0+ZHN0LnJlZ107CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDM7IGkrKykgeworCSBzcmNfcmVnICpzcmMgPSAmaW5zdC0+c3JjW2ldOworCisJIGlmIChzcmMtPmZpbGUgPT0gR1JGICYmIHNyYy0+cmVsYWRkciAmJgorCSAgICAgc2NyYXRjaF9sb2Nbc3JjLT5yZWddID09IC0xKSB7CisJICAgIHNjcmF0Y2hfbG9jW3NyYy0+cmVnXSA9IGMtPmxhc3Rfc2NyYXRjaDsKKwkgICAgYy0+bGFzdF9zY3JhdGNoICs9IHRoaXMtPnZpcnR1YWxfZ3JmX3NpemVzW3NyYy0+cmVnXTsKKwkgfQorICAgICAgfQorICAgfQorCisgICAvKiBOb3csIGZvciBhbnl0aGluZyB0aGF0IHdpbGwgYmUgYWNjZXNzZWQgdGhyb3VnaCBzY3JhdGNoLCByZXdyaXRlCisgICAgKiBpdCB0byBsb2FkL3N0b3JlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYSBfc2FmZSBsaXN0IHdhbGssIGJlY2F1c2UKKyAgICAqIHdlIG1heSBnZW5lcmF0ZSBhIG5ldyBzY3JhdGNoX3dyaXRlIGluc3RydWN0aW9uIGFmdGVyIHRoZSBvbmUKKyAgICAqIHdlJ3JlIHByb2Nlc3NpbmcuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsICZ0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QgPSAodmVjNF9pbnN0cnVjdGlvbiAqKW5vZGU7CisKKyAgICAgIC8qIFNldCB1cCB0aGUgYW5ub3RhdGlvbiB0cmFja2luZyBmb3IgbmV3IGdlbmVyYXRlZCBpbnN0cnVjdGlvbnMuICovCisgICAgICBiYXNlX2lyID0gaW5zdC0+aXI7CisgICAgICBjdXJyZW50X2Fubm90YXRpb24gPSBpbnN0LT5hbm5vdGF0aW9uOworCisgICAgICBpZiAoaW5zdC0+ZHN0LmZpbGUgPT0gR1JGICYmIHNjcmF0Y2hfbG9jW2luc3QtPmRzdC5yZWddICE9IC0xKSB7CisJIGVtaXRfc2NyYXRjaF93cml0ZShpbnN0LCBzY3JhdGNoX2xvY1tpbnN0LT5kc3QucmVnXSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDM7IGkrKykgeworCSBpZiAoaW5zdC0+c3JjW2ldLmZpbGUgIT0gR1JGIHx8IHNjcmF0Y2hfbG9jW2luc3QtPnNyY1tpXS5yZWddID09IC0xKQorCSAgICBjb250aW51ZTsKKworCSBkc3RfcmVnIHRlbXAgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKworCSBlbWl0X3NjcmF0Y2hfcmVhZChpbnN0LCB0ZW1wLCBpbnN0LT5zcmNbaV0sCisJCQkgICBzY3JhdGNoX2xvY1tpbnN0LT5zcmNbaV0ucmVnXSk7CisKKwkgaW5zdC0+c3JjW2ldLmZpbGUgPSB0ZW1wLmZpbGU7CisJIGluc3QtPnNyY1tpXS5yZWcgPSB0ZW1wLnJlZzsKKwkgaW5zdC0+c3JjW2ldLnJlZ19vZmZzZXQgPSB0ZW1wLnJlZ19vZmZzZXQ7CisJIGluc3QtPnNyY1tpXS5yZWxhZGRyID0gTlVMTDsKKyAgICAgIH0KKyAgIH0KK30KKworLyoqCisgKiBFbWl0cyBhbiBpbnN0cnVjdGlvbiBiZWZvcmUgQGluc3QgdG8gbG9hZCB0aGUgdmFsdWUgbmFtZWQgYnkgQG9yaWdfc3JjCisgKiBmcm9tIHRoZSBwdWxsIGNvbnN0YW50IGJ1ZmZlciAoc3VyZmFjZSkgYXQgQGJhc2Vfb2Zmc2V0IHRvIEB0ZW1wLgorICovCit2b2lkCit2ZWM0X3Zpc2l0b3I6OmVtaXRfcHVsbF9jb25zdGFudF9sb2FkKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisJCQkJICAgICAgZHN0X3JlZyB0ZW1wLCBzcmNfcmVnIG9yaWdfc3JjLAorCQkJCSAgICAgIGludCBiYXNlX29mZnNldCkKK3sKKyAgIGludCByZWdfb2Zmc2V0ID0gYmFzZV9vZmZzZXQgKyBvcmlnX3NyYy5yZWdfb2Zmc2V0OworICAgc3JjX3JlZyBpbmRleCA9IHNyY19yZWcocHJvZ19kYXRhLT5iYXNlLmJpbmRpbmdfdGFibGUucHVsbF9jb25zdGFudHNfc3RhcnQpOworICAgc3JjX3JlZyBvZmZzZXQgPSBnZXRfcHVsbF9jb25zdGFudF9vZmZzZXQoaW5zdCwgb3JpZ19zcmMucmVsYWRkciwgcmVnX29mZnNldCk7CisgICB2ZWM0X2luc3RydWN0aW9uICpsb2FkOworCisgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgZHN0X3JlZyBncmZfb2Zmc2V0ID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OmludF90eXBlKTsKKyAgICAgIGdyZl9vZmZzZXQudHlwZSA9IG9mZnNldC50eXBlOworICAgICAgZW1pdF9iZWZvcmUoaW5zdCwgTU9WKGdyZl9vZmZzZXQsIG9mZnNldCkpOworCisgICAgICBsb2FkID0gbmV3KG1lbV9jdHgpIHZlYzRfaW5zdHJ1Y3Rpb24odGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEX0dFTjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgaW5kZXgsIHNyY19yZWcoZ3JmX29mZnNldCkpOworICAgfSBlbHNlIHsKKyAgICAgIGxvYWQgPSBuZXcobWVtX2N0eCkgdmVjNF9pbnN0cnVjdGlvbih0aGlzLCBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIGluZGV4LCBvZmZzZXQpOworICAgICAgbG9hZC0+YmFzZV9tcmYgPSAxNDsKKyAgICAgIGxvYWQtPm1sZW4gPSAxOworICAgfQorICAgZW1pdF9iZWZvcmUoaW5zdCwgbG9hZCk7Cit9CisKKy8qKgorICogSW1wbGVtZW50cyBhcnJheSBhY2Nlc3Mgb2YgdW5pZm9ybXMgYnkgaW5zZXJ0aW5nIGEKKyAqIFBVTExfQ09OU1RBTlRfTE9BRCBpbnN0cnVjdGlvbi4KKyAqCisgKiBVbmxpa2UgdGVtcG9yYXJ5IEdSRiBhcnJheSBhY2Nlc3MgKHdoZXJlIHdlIGRvbid0IHN1cHBvcnQgaXQgZHVlIHRvCisgKiB0aGUgZGlmZmljdWx0eSBvZiBkb2luZyByZWxhdGl2ZSBhZGRyZXNzaW5nIG9uIGluc3RydWN0aW9uCisgKiBkZXN0aW5hdGlvbnMpLCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBkbyBhcnJheSBhY2Nlc3Mgb2YgdW5pZm9ybXMKKyAqIHRoYXQgd2VyZSBsb2FkZWQgaW4gR1JGIHNwYWNlIGFzIHB1c2ggY29uc3RhbnRzLiAgSW4gcmVhbC13b3JsZAorICogdXNhZ2Ugd2UndmUgc2VlbiwgdGhvdWdoLCB0aGUgYXJyYXlzIGJlaW5nIHVzZWQgYXJlIGFsd2F5cyBsYXJnZXIKKyAqIHRoYW4gd2UgY291bGQgbG9hZCBhcyBwdXNoIGNvbnN0YW50cywgc28ganVzdCBhbHdheXMgbW92ZSBhbGwKKyAqIHVuaWZvcm0gYXJyYXkgYWNjZXNzIG91dCB0byBhIHB1bGwgY29uc3RhbnQgYnVmZmVyLgorICovCit2b2lkCit2ZWM0X3Zpc2l0b3I6Om1vdmVfdW5pZm9ybV9hcnJheV9hY2Nlc3NfdG9fcHVsbF9jb25zdGFudHMoKQoreworICAgaW50IHB1bGxfY29uc3RhbnRfbG9jW3RoaXMtPnVuaWZvcm1zXTsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmlmb3JtczsgaSsrKSB7CisgICAgICBwdWxsX2NvbnN0YW50X2xvY1tpXSA9IC0xOworICAgfQorCisgICAvKiBXYWxrIHRocm91Z2ggYW5kIGZpbmQgYXJyYXkgYWNjZXNzIG9mIHVuaWZvcm1zLiAgUHV0IGEgY29weSBvZiB0aGF0CisgICAgKiB1bmlmb3JtIGluIHRoZSBwdWxsIGNvbnN0YW50IGJ1ZmZlci4KKyAgICAqCisgICAgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgbW92ZSBjb25zdGFudC1pbmRleGVkIGFjY2Vzc2VzIHRvIGFycmF5cy4gIE5vCisgICAgKiB0ZXN0aW5nIGhhcyBiZWVuIGRvbmUgb2YgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiB0aGlzIGNob2ljZS4KKyAgICAqLworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgJnRoaXMtPmluc3RydWN0aW9ucykgeworICAgICAgdmVjNF9pbnN0cnVjdGlvbiAqaW5zdCA9ICh2ZWM0X2luc3RydWN0aW9uICopbm9kZTsKKworICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgMzsgaSsrKSB7CisJIGlmIChpbnN0LT5zcmNbaV0uZmlsZSAhPSBVTklGT1JNIHx8ICFpbnN0LT5zcmNbaV0ucmVsYWRkcikKKwkgICAgY29udGludWU7CisKKwkgaW50IHVuaWZvcm0gPSBpbnN0LT5zcmNbaV0ucmVnOworCisJIC8qIElmIHRoaXMgYXJyYXkgaXNuJ3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwdWxsIGNvbnN0YW50IGJ1ZmZlciwKKwkgICogYWRkIGl0LgorCSAgKi8KKwkgaWYgKHB1bGxfY29uc3RhbnRfbG9jW3VuaWZvcm1dID09IC0xKSB7CisJICAgIGNvbnN0IGZsb2F0ICoqdmFsdWVzID0gJnN0YWdlX3Byb2dfZGF0YS0+cGFyYW1bdW5pZm9ybSAqIDRdOworCisJICAgIHB1bGxfY29uc3RhbnRfbG9jW3VuaWZvcm1dID0gc3RhZ2VfcHJvZ19kYXRhLT5ucl9wdWxsX3BhcmFtcyAvIDQ7CisKKwkgICAgYXNzZXJ0KHVuaWZvcm0gPCB1bmlmb3JtX2FycmF5X3NpemUpOworCSAgICBmb3IgKGludCBqID0gMDsgaiA8IHVuaWZvcm1fc2l6ZVt1bmlmb3JtXSAqIDQ7IGorKykgeworCSAgICAgICBzdGFnZV9wcm9nX2RhdGEtPnB1bGxfcGFyYW1bc3RhZ2VfcHJvZ19kYXRhLT5ucl9wdWxsX3BhcmFtcysrXQorICAgICAgICAgICAgICAgICAgPSB2YWx1ZXNbal07CisJICAgIH0KKwkgfQorCisJIC8qIFNldCB1cCB0aGUgYW5ub3RhdGlvbiB0cmFja2luZyBmb3IgbmV3IGdlbmVyYXRlZCBpbnN0cnVjdGlvbnMuICovCisJIGJhc2VfaXIgPSBpbnN0LT5pcjsKKwkgY3VycmVudF9hbm5vdGF0aW9uID0gaW5zdC0+YW5ub3RhdGlvbjsKKworCSBkc3RfcmVnIHRlbXAgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKworCSBlbWl0X3B1bGxfY29uc3RhbnRfbG9hZChpbnN0LCB0ZW1wLCBpbnN0LT5zcmNbaV0sCisJCQkJIHB1bGxfY29uc3RhbnRfbG9jW3VuaWZvcm1dKTsKKworCSBpbnN0LT5zcmNbaV0uZmlsZSA9IHRlbXAuZmlsZTsKKwkgaW5zdC0+c3JjW2ldLnJlZyA9IHRlbXAucmVnOworCSBpbnN0LT5zcmNbaV0ucmVnX29mZnNldCA9IHRlbXAucmVnX29mZnNldDsKKwkgaW5zdC0+c3JjW2ldLnJlbGFkZHIgPSBOVUxMOworICAgICAgfQorICAgfQorCisgICAvKiBOb3cgdGhlcmUgYXJlIG5vIGFjY2Vzc2VzIG9mIHRoZSBVTklGT1JNIGZpbGUgd2l0aCBhIHJlbGFkZHIsIHNvCisgICAgKiBubyBuZWVkIHRvIHRyYWNrIHRoZW0gYXMgbGFyZ2VyLXRoYW4tdmVjNCBvYmplY3RzLiAgVGhpcyB3aWxsIGJlCisgICAgKiByZWxpZWQgb24gaW4gY3V0dGluZyBvdXQgdW51c2VkIHVuaWZvcm0gdmVjdG9ycyBmcm9tIHB1c2gKKyAgICAqIGNvbnN0YW50cy4KKyAgICAqLworICAgc3BsaXRfdW5pZm9ybV9yZWdpc3RlcnMoKTsKK30KKwordm9pZAordmVjNF92aXNpdG9yOjpyZXNvbHZlX3VkX25lZ2F0ZShzcmNfcmVnICpyZWcpCit7CisgICBpZiAocmVnLT50eXBlICE9IEJSV19SRUdJU1RFUl9UWVBFX1VEIHx8CisgICAgICAgIXJlZy0+bmVnYXRlKQorICAgICAgcmV0dXJuOworCisgICBzcmNfcmVnIHRlbXAgPSBzcmNfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSk7CisgICBlbWl0KEJSV19PUENPREVfTU9WLCBkc3RfcmVnKHRlbXApLCAqcmVnKTsKKyAgICpyZWcgPSB0ZW1wOworfQorCit2ZWM0X3Zpc2l0b3I6OnZlYzRfdmlzaXRvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfdmVjNF9jb21waWxlICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfdmVjNF9wcm9nX2RhdGEgKnByb2dfZGF0YSwKKwkJCSAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXJfc3RhZ2Ugc3RhZ2UsCisJCQkgICB2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWJ1Z19mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub19zcGlsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJfdGltZV9zaGFkZXJfdHlwZSBzdF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX3RpbWVfc2hhZGVyX3R5cGUgc3Rfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl90aW1lX3NoYWRlcl90eXBlIHN0X3Jlc2V0KQorICAgOiBiYWNrZW5kX3Zpc2l0b3IoYnJ3LCBzaGFkZXJfcHJvZywgcHJvZywgJnByb2dfZGF0YS0+YmFzZSwgc3RhZ2UpLAorICAgICBjKGMpLAorICAgICBrZXkoa2V5KSwKKyAgICAgcHJvZ19kYXRhKHByb2dfZGF0YSksCisgICAgIHNhbml0eV9wYXJhbV9jb3VudCgwKSwKKyAgICAgZmFpbF9tc2coTlVMTCksCisgICAgIGZpcnN0X25vbl9wYXlsb2FkX2dyZigwKSwKKyAgICAgbmVlZF9hbGxfY29uc3RhbnRzX2luX3B1bGxfYnVmZmVyKGZhbHNlKSwKKyAgICAgZGVidWdfZmxhZyhkZWJ1Z19mbGFnKSwKKyAgICAgbm9fc3BpbGxzKG5vX3NwaWxscyksCisgICAgIHN0X2Jhc2Uoc3RfYmFzZSksCisgICAgIHN0X3dyaXR0ZW4oc3Rfd3JpdHRlbiksCisgICAgIHN0X3Jlc2V0KHN0X3Jlc2V0KQoreworICAgdGhpcy0+bWVtX2N0eCA9IG1lbV9jdHg7CisgICB0aGlzLT5mYWlsZWQgPSBmYWxzZTsKKworICAgdGhpcy0+YmFzZV9pciA9IE5VTEw7CisgICB0aGlzLT5jdXJyZW50X2Fubm90YXRpb24gPSBOVUxMOworICAgbWVtc2V0KHRoaXMtPm91dHB1dF9yZWdfYW5ub3RhdGlvbiwgMCwgc2l6ZW9mKHRoaXMtPm91dHB1dF9yZWdfYW5ub3RhdGlvbikpOworCisgICB0aGlzLT52YXJpYWJsZV9odCA9IGhhc2hfdGFibGVfY3RvcigwLAorCQkJCSAgICAgICBoYXNoX3RhYmxlX3BvaW50ZXJfaGFzaCwKKwkJCQkgICAgICAgaGFzaF90YWJsZV9wb2ludGVyX2NvbXBhcmUpOworCisgICB0aGlzLT52aXJ0dWFsX2dyZl9zdGFydCA9IE5VTEw7CisgICB0aGlzLT52aXJ0dWFsX2dyZl9lbmQgPSBOVUxMOworICAgdGhpcy0+dmlydHVhbF9ncmZfc2l6ZXMgPSBOVUxMOworICAgdGhpcy0+dmlydHVhbF9ncmZfY291bnQgPSAwOworICAgdGhpcy0+dmlydHVhbF9ncmZfcmVnX21hcCA9IE5VTEw7CisgICB0aGlzLT52aXJ0dWFsX2dyZl9yZWdfY291bnQgPSAwOworICAgdGhpcy0+dmlydHVhbF9ncmZfYXJyYXlfc2l6ZSA9IDA7CisgICB0aGlzLT5saXZlX2ludGVydmFscyA9IE5VTEw7CisKKyAgIHRoaXMtPm1heF9ncmYgPSBicnctPmdlbiA+PSA3ID8gR0VON19NUkZfSEFDS19TVEFSVCA6IEJSV19NQVhfR1JGOworCisgICB0aGlzLT51bmlmb3JtcyA9IDA7CisKKyAgIC8qIEluaXRpYWxpemUgdW5pZm9ybV9hcnJheV9zaXplIHRvIGF0IGxlYXN0IDEgYmVjYXVzZSBwcmUtZ2VuNiBWUyByZXF1aXJlcworICAgICogYXQgbGVhc3Qgb25lLiBTZWUgc2V0dXBfdW5pZm9ybXMoKSBpbiBicndfdmVjNC5jcHAuCisgICAgKi8KKyAgIHRoaXMtPnVuaWZvcm1fYXJyYXlfc2l6ZSA9IDE7CisgICBpZiAocHJvZ19kYXRhKSB7CisgICAgICB0aGlzLT51bmlmb3JtX2FycmF5X3NpemUgPSBNQVgyKHN0YWdlX3Byb2dfZGF0YS0+bnJfcGFyYW1zLCAxKTsKKyAgIH0KKworICAgdGhpcy0+dW5pZm9ybV9zaXplID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBpbnQsIHRoaXMtPnVuaWZvcm1fYXJyYXlfc2l6ZSk7CisgICB0aGlzLT51bmlmb3JtX3ZlY3Rvcl9zaXplID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBpbnQsIHRoaXMtPnVuaWZvcm1fYXJyYXlfc2l6ZSk7Cit9CisKK3ZlYzRfdmlzaXRvcjo6fnZlYzRfdmlzaXRvcigpCit7CisgICBoYXNoX3RhYmxlX2R0b3IodGhpcy0+dmFyaWFibGVfaHQpOworfQorCisKK3ZvaWQKK3ZlYzRfdmlzaXRvcjo6ZmFpbChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgIHZhX2xpc3QgdmE7CisgICBjaGFyICptc2c7CisKKyAgIGlmIChmYWlsZWQpCisgICAgICByZXR1cm47CisKKyAgIGZhaWxlZCA9IHRydWU7CisKKyAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgbXNnID0gcmFsbG9jX3Zhc3ByaW50ZihtZW1fY3R4LCBmb3JtYXQsIHZhKTsKKyAgIHZhX2VuZCh2YSk7CisgICBtc2cgPSByYWxsb2NfYXNwcmludGYobWVtX2N0eCwgInZlYzQgY29tcGlsZSBmYWlsZWQ6ICVzXG4iLCBtc2cpOworCisgICB0aGlzLT5mYWlsX21zZyA9IG1zZzsKKworICAgaWYgKGRlYnVnX2ZsYWcpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCAgbXNnKTsKKyAgIH0KK30KKworfSAvKiBuYW1lc3BhY2UgYnJ3ICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfdnNfdmlzaXRvci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZlYzRfdnNfdmlzaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjNDczNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdmVjNF92c192aXNpdG9yLmNwcApAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2luY2x1ZGUgImJyd192cy5oIgorI2luY2x1ZGUgIm1haW4vY29udGV4dC5oIgorCisKK25hbWVzcGFjZSBicncgeworCit2b2lkCit2ZWM0X3ZzX3Zpc2l0b3I6OmVtaXRfcHJvbG9nKCkKK3sKKyAgIGRzdF9yZWcgc2lnbl9yZWNvdmVyeV9zaGlmdDsKKyAgIGRzdF9yZWcgbm9ybWFsaXplX2ZhY3RvcjsKKyAgIGRzdF9yZWcgZXMzX25vcm1hbGl6ZV9mYWN0b3I7CisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkVSVF9BVFRSSUJfTUFYOyBpKyspIHsKKyAgICAgIGlmICh2c19wcm9nX2RhdGEtPmlucHV0c19yZWFkICYgQklURklFTEQ2NF9CSVQoaSkpIHsKKyAgICAgICAgIHVpbnQ4X3Qgd2FfZmxhZ3MgPSB2c19jb21waWxlLT5rZXkuZ2xfYXR0cmliX3dhX2ZsYWdzW2ldOworICAgICAgICAgZHN0X3JlZyByZWcoQVRUUiwgaSk7CisgICAgICAgICBkc3RfcmVnIHJlZ19kID0gcmVnOworICAgICAgICAgcmVnX2QudHlwZSA9IEJSV19SRUdJU1RFUl9UWVBFX0Q7CisgICAgICAgICBkc3RfcmVnIHJlZ191ZCA9IHJlZzsKKyAgICAgICAgIHJlZ191ZC50eXBlID0gQlJXX1JFR0lTVEVSX1RZUEVfVUQ7CisKKyAgICAgICAgIC8qIERvIEdMX0ZJWEVEIHJlc2NhbGluZyBmb3IgR0xFUzIuMC4gIE91ciBHTF9GSVhFRCBhdHRyaWJ1dGVzCisgICAgICAgICAgKiBjb21lIGluIGFzIGZsb2F0aW5nIHBvaW50IGNvbnZlcnNpb25zIG9mIHRoZSBpbnRlZ2VyIHZhbHVlcy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHdhX2ZsYWdzICYgQlJXX0FUVFJJQl9XQV9DT01QT05FTlRfTUFTSykgeworICAgICAgICAgICAgZHN0X3JlZyBkc3QgPSByZWc7CisgICAgICAgICAgICBkc3QudHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgICAgICAgZHN0LndyaXRlbWFzayA9ICgxIDw8ICh3YV9mbGFncyAmIEJSV19BVFRSSUJfV0FfQ09NUE9ORU5UX01BU0spKSAtIDE7CisgICAgICAgICAgICBlbWl0KE1VTChkc3QsIHNyY19yZWcoZHN0KSwgc3JjX3JlZygxLjBmIC8gNjU1MzYuMGYpKSk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIERvIHNpZ24gcmVjb3ZlcnkgZm9yIDIxMDEwMTAgZm9ybWF0cyBpZiByZXF1aXJlZC4gKi8KKyAgICAgICAgIGlmICh3YV9mbGFncyAmIEJSV19BVFRSSUJfV0FfU0lHTikgeworICAgICAgICAgICAgaWYgKHNpZ25fcmVjb3Zlcnlfc2hpZnQuZmlsZSA9PSBCQURfRklMRSkgeworICAgICAgICAgICAgICAgLyogc2hpZnQgY29uc3RhbnQ6IDwyMiwyMiwyMiwzMD4gKi8KKyAgICAgICAgICAgICAgIHNpZ25fcmVjb3Zlcnlfc2hpZnQgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSk7CisgICAgICAgICAgICAgICBlbWl0KE1PVih3cml0ZW1hc2soc2lnbl9yZWNvdmVyeV9zaGlmdCwgV1JJVEVNQVNLX1hZWiksIHNyY19yZWcoMjJ1KSkpOworICAgICAgICAgICAgICAgZW1pdChNT1Yod3JpdGVtYXNrKHNpZ25fcmVjb3Zlcnlfc2hpZnQsIFdSSVRFTUFTS19XKSwgc3JjX3JlZygzMHUpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVtaXQoU0hMKHJlZ191ZCwgc3JjX3JlZyhyZWdfdWQpLCBzcmNfcmVnKHNpZ25fcmVjb3Zlcnlfc2hpZnQpKSk7CisgICAgICAgICAgICBlbWl0KEFTUihyZWdfZCwgc3JjX3JlZyhyZWdfZCksIHNyY19yZWcoc2lnbl9yZWNvdmVyeV9zaGlmdCkpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogQXBwbHkgQkdSQSBzd2l6emxlIGlmIHJlcXVpcmVkLiAqLworICAgICAgICAgaWYgKHdhX2ZsYWdzICYgQlJXX0FUVFJJQl9XQV9CR1JBKSB7CisgICAgICAgICAgICBzcmNfcmVnIHRlbXAgPSBzcmNfcmVnKHJlZyk7CisgICAgICAgICAgICB0ZW1wLnN3aXp6bGUgPSBCUldfU1dJWlpMRTQoMiwxLDAsMyk7CisgICAgICAgICAgICBlbWl0KE1PVihyZWcsIHRlbXApKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHdhX2ZsYWdzICYgQlJXX0FUVFJJQl9XQV9OT1JNQUxJWkUpIHsKKyAgICAgICAgICAgIC8qIEVTIDMuMCBoYXMgZGlmZmVyZW50IHJ1bGVzIGZvciBjb252ZXJ0aW5nIHNpZ25lZCBub3JtYWxpemVkCisgICAgICAgICAgICAgKiBmaXhlZC1wb2ludCBudW1iZXJzIHRoYW4gZGVza3RvcCBHTC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKF9tZXNhX2lzX2dsZXMzKGN0eCkgJiYgKHdhX2ZsYWdzICYgQlJXX0FUVFJJQl9XQV9TSUdOKSkgeworICAgICAgICAgICAgICAgLyogQWNjb3JkaW5nIHRvIGVxdWF0aW9uIDIuMiBvZiB0aGUgRVMgMy4wIHNwZWNpZmljYXRpb24sCisgICAgICAgICAgICAgICAgKiBzaWduZWQgbm9ybWFsaXphdGlvbiBjb252ZXJzaW9uIGlzIGRvbmUgYnk6CisgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICogZiA9IGMgLyAoMl4oYi0xKS0xKQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAoZXMzX25vcm1hbGl6ZV9mYWN0b3IuZmlsZSA9PSBCQURfRklMRSkgeworICAgICAgICAgICAgICAgICAgLyogbXVsIGNvbnN0YW50OiAxIC8gKDJeKGItMSkgLSAxKSAqLworICAgICAgICAgICAgICAgICAgZXMzX25vcm1hbGl6ZV9mYWN0b3IgPSBkc3RfcmVnKHRoaXMsIGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgICAgICAgICAgICAgICAgIGVtaXQoTU9WKHdyaXRlbWFzayhlczNfbm9ybWFsaXplX2ZhY3RvciwgV1JJVEVNQVNLX1hZWiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmVnKDEuMGYgLyAoKDE8PDkpIC0gMSkpKSk7CisgICAgICAgICAgICAgICAgICBlbWl0KE1PVih3cml0ZW1hc2soZXMzX25vcm1hbGl6ZV9mYWN0b3IsIFdSSVRFTUFTS19XKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcoMS4wZiAvICgoMTw8MSkgLSAxKSkpKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZHN0X3JlZyBkc3QgPSByZWc7CisgICAgICAgICAgICAgICBkc3QudHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgICAgICAgICAgZW1pdChNT1YoZHN0LCBzcmNfcmVnKHJlZ19kKSkpOworICAgICAgICAgICAgICAgZW1pdChNVUwoZHN0LCBzcmNfcmVnKGRzdCksIHNyY19yZWcoZXMzX25vcm1hbGl6ZV9mYWN0b3IpKSk7CisgICAgICAgICAgICAgICBlbWl0X21pbm1heChCUldfQ09ORElUSU9OQUxfRywgZHN0LCBzcmNfcmVnKGRzdCksIHNyY19yZWcoLTEuMGYpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGVxdWF0aW9ucyBhcmUgZnJvbSB0aGUgT3BlbkdMIDMuMiBzcGVjaWZpY2F0aW9uOgorICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAqIDIuMSB1bnNpZ25lZCBub3JtYWxpemF0aW9uCisgICAgICAgICAgICAgICAgKiBmID0gYy8oMl5uLTEpCisgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICogMi4yIHNpZ25lZCBub3JtYWxpemF0aW9uCisgICAgICAgICAgICAgICAgKiBmID0gKDJjKzEpLygyXm4tMSkKKyAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgKiBCb3RoIG9mIHRoZXNlIHNoYXJlIGEgY29tbW9uIGRpdmlzb3IsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5CisgICAgICAgICAgICAgICAgKiAibm9ybWFsaXplX2ZhY3RvciIgaW4gdGhlIGNvZGUgYmVsb3cuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVfZmFjdG9yLmZpbGUgPT0gQkFEX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICAgIC8qIDEgLyAoMl5iIC0gMSkgZm9yIGI9PDEwLDEwLDEwLDI+ICovCisgICAgICAgICAgICAgICAgICBub3JtYWxpemVfZmFjdG9yID0gZHN0X3JlZyh0aGlzLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisgICAgICAgICAgICAgICAgICBlbWl0KE1PVih3cml0ZW1hc2sobm9ybWFsaXplX2ZhY3RvciwgV1JJVEVNQVNLX1hZWiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmVnKDEuMGYgLyAoKDE8PDEwKSAtIDEpKSkpOworICAgICAgICAgICAgICAgICAgZW1pdChNT1Yod3JpdGVtYXNrKG5vcm1hbGl6ZV9mYWN0b3IsIFdSSVRFTUFTS19XKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZWcoMS4wZiAvICgoMTw8MikgLSAxKSkpKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZHN0X3JlZyBkc3QgPSByZWc7CisgICAgICAgICAgICAgICBkc3QudHlwZSA9IGJyd190eXBlX2Zvcl9iYXNlX3R5cGUoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgICAgICAgICAgZW1pdChNT1YoZHN0LCBzcmNfcmVnKCh3YV9mbGFncyAmIEJSV19BVFRSSUJfV0FfU0lHTikgPyByZWdfZCA6IHJlZ191ZCkpKTsKKworICAgICAgICAgICAgICAgLyogRm9yIHNpZ25lZCBub3JtYWxpemF0aW9uLCB3ZSB3YW50IHRoZSBudW1lcmF0b3IgdG8gYmUgMmMrMS4gKi8KKyAgICAgICAgICAgICAgIGlmICh3YV9mbGFncyAmIEJSV19BVFRSSUJfV0FfU0lHTikgeworICAgICAgICAgICAgICAgICAgZW1pdChNVUwoZHN0LCBzcmNfcmVnKGRzdCksIHNyY19yZWcoMi4wZikpKTsKKyAgICAgICAgICAgICAgICAgIGVtaXQoQUREKGRzdCwgc3JjX3JlZyhkc3QpLCBzcmNfcmVnKDEuMGYpKSk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGVtaXQoTVVMKGRzdCwgc3JjX3JlZyhkc3QpLCBzcmNfcmVnKG5vcm1hbGl6ZV9mYWN0b3IpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICh3YV9mbGFncyAmIEJSV19BVFRSSUJfV0FfU0NBTEUpIHsKKyAgICAgICAgICAgIGRzdF9yZWcgZHN0ID0gcmVnOworICAgICAgICAgICAgZHN0LnR5cGUgPSBicndfdHlwZV9mb3JfYmFzZV90eXBlKGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgICAgICAgICAgIGVtaXQoTU9WKGRzdCwgc3JjX3JlZygod2FfZmxhZ3MgJiBCUldfQVRUUklCX1dBX1NJR04pID8gcmVnX2QgOiByZWdfdWQpKSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKworZHN0X3JlZyAqCit2ZWM0X3ZzX3Zpc2l0b3I6Om1ha2VfcmVnX2Zvcl9zeXN0ZW1fdmFsdWUoaXJfdmFyaWFibGUgKmlyKQoreworICAgLyogVmVydGV4SUQgaXMgc3RvcmVkIGJ5IHRoZSBWRiBhcyB0aGUgbGFzdCB2ZXJ0ZXggZWxlbWVudCwgYnV0CisgICAgKiB3ZSBkb24ndCByZXByZXNlbnQgaXQgd2l0aCBhIGZsYWcgaW4gaW5wdXRzX3JlYWQsIHNvIHdlIGNhbGwKKyAgICAqIGl0IFZFUlRfQVRUUklCX01BWCwgd2hpY2ggc2V0dXBfYXR0cmlidXRlcygpIHBpY2tzIHVwIG9uLgorICAgICovCisgICBkc3RfcmVnICpyZWcgPSBuZXcobWVtX2N0eCkgZHN0X3JlZyhBVFRSLCBWRVJUX0FUVFJJQl9NQVgpOworCisgICBzd2l0Y2ggKGlyLT5kYXRhLmxvY2F0aW9uKSB7CisgICBjYXNlIFNZU1RFTV9WQUxVRV9WRVJURVhfSUQ6CisgICAgICByZWctPndyaXRlbWFzayA9IFdSSVRFTUFTS19YOworICAgICAgdnNfcHJvZ19kYXRhLT51c2VzX3ZlcnRleGlkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTWVNURU1fVkFMVUVfSU5TVEFOQ0VfSUQ6CisgICAgICByZWctPndyaXRlbWFzayA9IFdSSVRFTUFTS19ZOworICAgICAgdnNfcHJvZ19kYXRhLT51c2VzX2luc3RhbmNlaWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gcmVnOworfQorCisKK3ZvaWQKK3ZlYzRfdnNfdmlzaXRvcjo6ZW1pdF91cmJfd3JpdGVfaGVhZGVyKGludCBtcmYpCit7CisgICAvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBWUzsgYW4gaW1wbGllZCB3cml0ZSB0byB0aGlzIE1SRiB3aWxsIGJlCisgICAgKiBwZXJmb3JtZWQgYnkgVlNfT1BDT0RFX1VSQl9XUklURS4KKyAgICAqLworICAgKHZvaWQpIG1yZjsKK30KKworCit2ZWM0X2luc3RydWN0aW9uICoKK3ZlYzRfdnNfdmlzaXRvcjo6ZW1pdF91cmJfd3JpdGVfb3Bjb2RlKGJvb2wgY29tcGxldGUpCit7CisgICAvKiBGb3IgVlMsIHRoZSBVUkIgd3JpdGVzIGVuZCB0aGUgdGhyZWFkLiAqLworICAgaWYgKGNvbXBsZXRlKSB7CisvLyAgICAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1NIQURFUl9USU1FKQorLy8gICAgICAgICBlbWl0X3NoYWRlcl90aW1lX2VuZCgpOworICAgfQorCisgICB2ZWM0X2luc3RydWN0aW9uICppbnN0ID0gZW1pdChWU19PUENPREVfVVJCX1dSSVRFKTsKKyAgIGluc3QtPnVyYl93cml0ZV9mbGFncyA9IGNvbXBsZXRlID8KKyAgICAgIEJSV19VUkJfV1JJVEVfRU9UX0NPTVBMRVRFIDogQlJXX1VSQl9XUklURV9OT19GTEFHUzsKKworICAgcmV0dXJuIGluc3Q7Cit9CisKKwordm9pZAordmVjNF92c192aXNpdG9yOjplbWl0X3RocmVhZF9lbmQoKQoreworICAgLyogRm9yIFZTLCB3ZSBhbHdheXMgZW5kIHRoZSB0aHJlYWQgYnkgZW1pdHRpbmcgYSBzaW5nbGUgdmVydGV4LgorICAgICogZW1pdF91cmJfd3JpdGVfb3Bjb2RlKCkgd2lsbCB0YWtlIGNhcmUgb2Ygc2V0dGluZyB0aGUgZW90IGZsYWcgb24gdGhlCisgICAgKiBTRU5EIGluc3RydWN0aW9uLgorICAgICovCisgICBlbWl0X3ZlcnRleCgpOworfQorCisKK3ZlYzRfdnNfdmlzaXRvcjo6dmVjNF92c192aXNpdG9yKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd192c19jb21waWxlICp2c19jb21waWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd192c19wcm9nX2RhdGEgKnZzX3Byb2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lbV9jdHgpCisgICA6IHZlYzRfdmlzaXRvcihicncsICZ2c19jb21waWxlLT5iYXNlLCAmdnNfY29tcGlsZS0+dnAtPnByb2dyYW0uQmFzZSwKKyAgICAgICAgICAgICAgICAgICZ2c19jb21waWxlLT5rZXkuYmFzZSwgJnZzX3Byb2dfZGF0YS0+YmFzZSwgcHJvZywKKyAgICAgICAgICAgICAgICAgIE1FU0FfU0hBREVSX1ZFUlRFWCwKKyAgICAgICAgICAgICAgICAgIG1lbV9jdHgsIElOVEVMX0RFQlVHICYgREVCVUdfVlMsIGZhbHNlIC8qIG5vX3NwaWxscyAqLywKKyAgICAgICAgICAgICAgICAgIFNUX1ZTLCBTVF9WU19XUklUVEVOLCBTVF9WU19SRVNFVCksCisgICAgIHZzX2NvbXBpbGUodnNfY29tcGlsZSksCisgICAgIHZzX3Byb2dfZGF0YSh2c19wcm9nX2RhdGEpCit7Cit9CisKKworfSAvKiBuYW1lc3BhY2UgYnJ3ICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZzLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2YWM4NQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfdnMuYwpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIEludGVsIENvcnAuICAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBJbnRlbCBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8KKyBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgorCisgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qCisgICogQXV0aG9yczoKKyAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHdAdm13YXJlLmNvbT4KKyAgKi8KKworCisjaW5jbHVkZSAibWFpbi9jb21waWxlci5oIgorI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCisjaW5jbHVkZSAiYnJ3X3ZzLmgiCisvLyNpbmNsdWRlICJicndfdXRpbC5oIiAgLy8gTHVuYXJHOiBSZW1vdmUKKy8vI2luY2x1ZGUgImJyd19zdGF0ZS5oIiAvLyBMdW5hckc6IFJlbW92ZQorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wcmludC5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKworI2luY2x1ZGUgImdsc2wvcmFsbG9jLmgiCisKKyNpbmNsdWRlICJpY2QtdXRpbHMuaCIgIC8vIEx1bmFyRzogQURECisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NpZ25fdnVlX3Nsb3Qoc3RydWN0IGJyd192dWVfbWFwICp2dWVfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFyeWluZykKK3sKKyAgIC8qIE1ha2Ugc3VyZSB0aGlzIHZhcnlpbmcgaGFzbid0IGJlZW4gYXNzaWduZWQgYSBzbG90IGFscmVhZHkgKi8KKyAgIGFzc2VydCAodnVlX21hcC0+dmFyeWluZ190b19zbG90W3ZhcnlpbmddID09IC0xKTsKKworICAgdnVlX21hcC0+dmFyeWluZ190b19zbG90W3ZhcnlpbmddID0gdnVlX21hcC0+bnVtX3Nsb3RzOworICAgdnVlX21hcC0+c2xvdF90b192YXJ5aW5nW3Z1ZV9tYXAtPm51bV9zbG90cysrXSA9IHZhcnlpbmc7Cit9CisKKy8qKgorICogQ29tcHV0ZSB0aGUgVlVFIG1hcCBmb3IgdmVydGV4IHNoYWRlciBwcm9ncmFtLgorICovCit2b2lkCiticndfY29tcHV0ZV92dWVfbWFwKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgYnJ3X3Z1ZV9tYXAgKnZ1ZV9tYXAsCisgICAgICAgICAgICAgICAgICAgIEdMYml0ZmllbGQ2NCBzbG90c192YWxpZCkKK3sKKyAgIHZ1ZV9tYXAtPnNsb3RzX3ZhbGlkID0gc2xvdHNfdmFsaWQ7CisgICBpbnQgaTsKKworICAgLyogZ2xfTGF5ZXIgYW5kIGdsX1ZpZXdwb3J0SW5kZXggZG9uJ3QgZ2V0IHRoZWlyIG93biB2YXJ5aW5nIHNsb3RzIC0tIHRoZXkKKyAgICAqIGFyZSBzdG9yZWQgaW4gdGhlIGZpcnN0IFZVRSBzbG90IChWQVJZSU5HX1NMT1RfUFNJWikuCisgICAgKi8KKyAgIHNsb3RzX3ZhbGlkICY9IH4oVkFSWUlOR19CSVRfTEFZRVIgfCBWQVJZSU5HX0JJVF9WSUVXUE9SVCk7CisKKyAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgd2Ugc3RvcmUgaW4gdnVlX21hcC0+dmFyeWluZ190b19zbG90IGFuZAorICAgICogdnVlX21hcC0+c2xvdF90b192YXJ5aW5nIHdvbid0IG92ZXJmbG93IHRoZSBzaWduZWQgY2hhcnMgdGhhdCBhcmUgdXNlZAorICAgICogdG8gc3RvcmUgdGhlbS4gIE5vdGUgdGhhdCBzaW5jZSB2dWVfbWFwLT5zbG90X3RvX3Zhcnlpbmcgc29tZXRpbWVzIGhvbGRzCisgICAgKiB2YWx1ZXMgZXF1YWwgdG8gQlJXX1ZBUllJTkdfU0xPVF9DT1VOVCwgd2UgbmVlZCB0byBlbnN1cmUgdGhhdAorICAgICogQlJXX1ZBUllJTkdfU0xPVF9DT1VOVCBpcyA8PSAxMjcsIG5vdCAxMjguCisgICAgKi8KKyAgIFNUQVRJQ19BU1NFUlQoQlJXX1ZBUllJTkdfU0xPVF9DT1VOVCA8PSAxMjcpOworCisgICB2dWVfbWFwLT5udW1fc2xvdHMgPSAwOworICAgZm9yIChpID0gMDsgaSA8IEJSV19WQVJZSU5HX1NMT1RfQ09VTlQ7ICsraSkgeworICAgICAgdnVlX21hcC0+dmFyeWluZ190b19zbG90W2ldID0gLTE7CisgICAgICB2dWVfbWFwLT5zbG90X3RvX3ZhcnlpbmdbaV0gPSBCUldfVkFSWUlOR19TTE9UX0NPVU5UOworICAgfQorCisgICAvKiBWVUUgaGVhZGVyOiBmb3JtYXQgZGVwZW5kcyBvbiBjaGlwIGdlbmVyYXRpb24gYW5kIHdoZXRoZXIgY2xpcHBpbmcgaXMKKyAgICAqIGVuYWJsZWQuCisgICAgKi8KKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIC8qIFRoZXJlIGFyZSA4IGR3b3JkcyBpbiBWVUUgaGVhZGVyIHByZS1Jcm9ubGFrZToKKyAgICAgICAqIGR3b3JkIDAtMyBpcyBpbmRpY2VzLCBwb2ludCB3aWR0aCwgY2xpcCBmbGFncy4KKyAgICAgICAqIGR3b3JkIDQtNyBpcyBuZGMgcG9zaXRpb24KKyAgICAgICAqIGR3b3JkIDgtMTEgaXMgdGhlIGZpcnN0IHZlcnRleCBkYXRhLgorICAgICAgICoKKyAgICAgICAqIE9uIElyb25sYWtlIHRoZSBWVUUgaGVhZGVyIGlzIG5vbWluYWxseSAyMCBkd29yZHMsIGJ1dCB0aGUgaGFyZHdhcmUKKyAgICAgICAqIHdpbGwgYWNjZXB0IHRoZSBzYW1lIGhlYWRlciBsYXlvdXQgYXMgR2VuNCBbYW5kIHNob3VsZCBiZSBhIGJpdCBmYXN0ZXJdCisgICAgICAgKi8KKyAgICAgIGFzc2lnbl92dWVfc2xvdCh2dWVfbWFwLCBWQVJZSU5HX1NMT1RfUFNJWik7CisgICAgICBhc3NpZ25fdnVlX3Nsb3QodnVlX21hcCwgQlJXX1ZBUllJTkdfU0xPVF9OREMpOworICAgICAgYXNzaWduX3Z1ZV9zbG90KHZ1ZV9tYXAsIFZBUllJTkdfU0xPVF9QT1MpOworICAgfSBlbHNlIHsKKyAgICAgIC8qIFRoZXJlIGFyZSA4IG9yIDE2IERXcyAoRDAtRDE1KSBpbiBWVUUgaGVhZGVyIG9uIFNhbmR5YnJpZGdlOgorICAgICAgICogZHdvcmQgMC0zIG9mIHRoZSBoZWFkZXIgaXMgaW5kaWNlcywgcG9pbnQgd2lkdGgsIGNsaXAgZmxhZ3MuCisgICAgICAgKiBkd29yZCA0LTcgaXMgdGhlIDREIHNwYWNlIHBvc2l0aW9uCisgICAgICAgKiBkd29yZCA4LTE1IG9mIHRoZSB2ZXJ0ZXggaGVhZGVyIGlzIHRoZSB1c2VyIGNsaXAgZGlzdGFuY2UgaWYKKyAgICAgICAqIGVuYWJsZWQuCisgICAgICAgKiBkd29yZCA4LTExIG9yIDE2LTE5IGlzIHRoZSBmaXJzdCB2ZXJ0ZXggZWxlbWVudCBkYXRhIHdlIGZpbGwuCisgICAgICAgKi8KKyAgICAgIGFzc2lnbl92dWVfc2xvdCh2dWVfbWFwLCBWQVJZSU5HX1NMT1RfUFNJWik7CisgICAgICBhc3NpZ25fdnVlX3Nsb3QodnVlX21hcCwgVkFSWUlOR19TTE9UX1BPUyk7CisgICAgICBpZiAoc2xvdHNfdmFsaWQgJiBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMCkpCisgICAgICAgICBhc3NpZ25fdnVlX3Nsb3QodnVlX21hcCwgVkFSWUlOR19TTE9UX0NMSVBfRElTVDApOworICAgICAgaWYgKHNsb3RzX3ZhbGlkICYgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0NMSVBfRElTVDEpKQorICAgICAgICAgYXNzaWduX3Z1ZV9zbG90KHZ1ZV9tYXAsIFZBUllJTkdfU0xPVF9DTElQX0RJU1QxKTsKKworICAgICAgLyogZnJvbnQgYW5kIGJhY2sgY29sb3JzIG5lZWQgdG8gYmUgY29uc2VjdXRpdmUgc28gdGhhdCB3ZSBjYW4gdXNlCisgICAgICAgKiBBVFRSSUJVVEVfU1dJWlpMRV9JTlBVVEFUVFJfRkFDSU5HIHRvIHN3aXp6bGUgdGhlbSB3aGVuIGRvaW5nCisgICAgICAgKiB0d28tc2lkZWQgY29sb3IuCisgICAgICAgKi8KKyAgICAgIGlmIChzbG90c192YWxpZCAmIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9DT0wwKSkKKyAgICAgICAgIGFzc2lnbl92dWVfc2xvdCh2dWVfbWFwLCBWQVJZSU5HX1NMT1RfQ09MMCk7CisgICAgICBpZiAoc2xvdHNfdmFsaWQgJiBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQkZDMCkpCisgICAgICAgICBhc3NpZ25fdnVlX3Nsb3QodnVlX21hcCwgVkFSWUlOR19TTE9UX0JGQzApOworICAgICAgaWYgKHNsb3RzX3ZhbGlkICYgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0NPTDEpKQorICAgICAgICAgYXNzaWduX3Z1ZV9zbG90KHZ1ZV9tYXAsIFZBUllJTkdfU0xPVF9DT0wxKTsKKyAgICAgIGlmIChzbG90c192YWxpZCAmIEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9CRkMxKSkKKyAgICAgICAgIGFzc2lnbl92dWVfc2xvdCh2dWVfbWFwLCBWQVJZSU5HX1NMT1RfQkZDMSk7CisgICB9CisKKyAgIC8qIFRoZSBoYXJkd2FyZSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHJlc3Qgb2YgdGhlIHZlcnRleCBvdXRwdXRzLCBzbyBqdXN0CisgICAgKiBhc3NpZ24gdGhlbSBjb250aWd1b3VzbHkuICBEb24ndCByZWFzc2lnbiBvdXRwdXRzIHRoYXQgYWxyZWFkeSBoYXZlIGEKKyAgICAqIHNsb3QuCisgICAgKgorICAgICogV2UgZ2VuZXJhbGx5IGRvbid0IG5lZWQgdG8gYXNzaWduIGEgc2xvdCBmb3IgVkFSWUlOR19TTE9UX0NMSVBfVkVSVEVYLAorICAgICogc2luY2UgaXQncyBlbmNvZGVkIGFzIHRoZSBjbGlwIGRpc3RhbmNlcyBieSBlbWl0X2NsaXBfZGlzdGFuY2VzKCkuCisgICAgKiBIb3dldmVyLCBpdCBtYXkgYmUgb3V0cHV0IGJ5IHRyYW5zZm9ybSBmZWVkYmFjaywgYW5kIHdlJ2QgcmF0aGVyIG5vdAorICAgICogcmVjb21wdXRlIHN0YXRlIHdoZW4gVEYgY2hhbmdlcywgc28gd2UganVzdCBhbHdheXMgaW5jbHVkZSBpdC4KKyAgICAqLworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQVJZSU5HX1NMT1RfTUFYOyArK2kpIHsKKyAgICAgIGlmICgoc2xvdHNfdmFsaWQgJiBCSVRGSUVMRDY0X0JJVChpKSkgJiYKKyAgICAgICAgICB2dWVfbWFwLT52YXJ5aW5nX3RvX3Nsb3RbaV0gPT0gLTEpIHsKKyAgICAgICAgIGFzc2lnbl92dWVfc2xvdCh2dWVfbWFwLCBpKTsKKyAgICAgIH0KKyAgIH0KK30KKworCisvLyBMdW5hckc6IFRPRE8gLSBIb3cgdG8gaGFuZGxlIHVzZXIgY2xpcCBwbGFuZXM/CisvKioKKyAqIERlY2lkZSB3aGljaCBzZXQgb2YgY2xpcCBwbGFuZXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBjbGlwcGluZyB2aWEKKyAqIGdsX1Bvc2l0aW9uIG9yIGdsX0NsaXBWZXJ0ZXguCisgKi8KKy8vZ2xfY2xpcF9wbGFuZSAqYnJ3X3NlbGVjdF9jbGlwX3BsYW5lcyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQorLy97CisvLyAgIGlmIChjdHgtPl9TaGFkZXItPkN1cnJlbnRQcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0pIHsKKy8vICAgICAgLyogVGhlcmUgaXMgY3VycmVudGx5IGEgR0xTTCB2ZXJ0ZXggc2hhZGVyLCBzbyBjbGlwIGFjY29yZGluZyB0byBHTFNMCisvLyAgICAgICAqIHJ1bGVzLCB3aGljaCBtZWFucyBjb21wYXJlIGdsX0NsaXBWZXJ0ZXggKG9yIGdsX1Bvc2l0aW9uLCBpZgorLy8gICAgICAgKiBnbF9DbGlwVmVydGV4IHdhc24ndCBhc3NpZ25lZCkgYWdhaW5zdCB0aGUgZXllLWNvb3JkaW5hdGUgY2xpcCBwbGFuZXMKKy8vICAgICAgICogdGhhdCB3ZXJlIHN0b3JlZCBpbiBFeWVVc2VyUGxhbmUgYXQgdGhlIHRpbWUgdGhlIGNsaXAgcGxhbmVzIHdlcmUKKy8vICAgICAgICogc3BlY2lmaWVkLgorLy8gICAgICAgKi8KKy8vICAgICAgcmV0dXJuIGN0eC0+VHJhbnNmb3JtLkV5ZVVzZXJQbGFuZTsKKy8vICAgfSBlbHNlIHsKKy8vICAgICAgLyogRWl0aGVyIHdlIGFyZSB1c2luZyBmaXhlZCBmdW5jdGlvbiBvciBhbiBBUkIgdmVydGV4IHByb2dyYW0uICBJbgorLy8gICAgICAgKiBlaXRoZXIgY2FzZSB0aGUgY2xpcCBwbGFuZXMgYXJlIGdvaW5nIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QKKy8vICAgICAgICogZ2xfUG9zaXRpb24gKHdoaWNoIGlzIGluIGNsaXAgY29vcmRpbmF0ZXMpIHNvIHdlIGhhdmUgdG8gY2xpcCB1c2luZworLy8gICAgICAgKiBfQ2xpcFVzZXJQbGFuZSwgd2hpY2ggd2FzIHRyYW5zZm9ybWVkIGludG8gY2xpcCBjb29yZGluYXRlcyBieSBNZXNhCisvLyAgICAgICAqIGNvcmUuCisvLyAgICAgICAqLworLy8gICAgICByZXR1cm4gY3R4LT5UcmFuc2Zvcm0uX0NsaXBVc2VyUGxhbmU7CisvLyAgIH0KKy8vfQorCisKK2Jvb2wKK2Jyd192c19wcm9nX2RhdGFfY29tcGFyZShjb25zdCB2b2lkICppbl9hLCBjb25zdCB2b2lkICppbl9iKQoreworICAgY29uc3Qgc3RydWN0IGJyd192c19wcm9nX2RhdGEgKmEgPSBpbl9hOworICAgY29uc3Qgc3RydWN0IGJyd192c19wcm9nX2RhdGEgKmIgPSBpbl9iOworCisgICAvKiBDb21wYXJlIHRoZSBiYXNlIHN0cnVjdHVyZS4gKi8KKyAgIGlmICghYnJ3X3N0YWdlX3Byb2dfZGF0YV9jb21wYXJlKCZhLT5iYXNlLmJhc2UsICZiLT5iYXNlLmJhc2UpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBDb21wYXJlIHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3QuICovCisgICBjb25zdCB1bnNpZ25lZCBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEpOworICAgaWYgKG1lbWNtcCgoKGNoYXIgKikgYSkgKyBvZmZzZXQsICgoY2hhciAqKSBiKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBicndfdnNfcHJvZ19kYXRhKSAtIG9mZnNldCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCiticndfdnNfaW5pdF9jb21waWxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCSAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZlcnRleF9wcm9ncmFtICp2cCwKKwkgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3ZzX3Byb2dfa2V5ICprZXksCisJICAgICAgICAgICAgc3RydWN0IGJyd192c19jb21waWxlICpjKQoreworICAgbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCisgICBtZW1jcHkoJmMtPmtleSwga2V5LCBzaXplb2YoKmtleSkpOworICAgYy0+dnAgPSB2cDsKKyAgIGMtPmJhc2Uuc2hhZGVyX3Byb2cgPSBwcm9nOworICAgYy0+YmFzZS5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7Cit9CisKK3N0YXRpYyBib29sCiticndfdnNfZG9fY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKwkgICAgICAgICAgc3RydWN0IGJyd192c19jb21waWxlICpjKQoreworICAgc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEgKnN0YWdlX3Byb2dfZGF0YSA9ICZjLT5wcm9nX2RhdGEuYmFzZS5iYXNlOworICAgc3RydWN0IGdsX3NoYWRlciAqdnMgPSBOVUxMOworICAgaW50IGk7CisKKyAgIGlmIChjLT5iYXNlLnNoYWRlcl9wcm9nKQorICAgICAgdnMgPSBjLT5iYXNlLnNoYWRlcl9wcm9nLT5fTGlua2VkU2hhZGVyc1tNRVNBX1NIQURFUl9WRVJURVhdOworCisgICAvKiBBbGxvY2F0ZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgdW5pZm9ybXMgdGhhdCB3aWxsIGVuZCB1cCBpbiB0aGUKKyAgICAqIHByb2dfZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBpbGVkIHByb2dyYW0sIGFuZCB3aGljaCB3aWxsIGJlIGZyZWVkCisgICAgKiBieSB0aGUgc3RhdGUgY2FjaGUuCisgICAgKi8KKyAgIGludCBwYXJhbV9jb3VudDsKKyAgIGlmICh2cykgeworICAgICAgLyogV2UgYWRkIHBhZGRpbmcgYXJvdW5kIHVuaWZvcm0gdmFsdWVzIGJlbG93IHZlYzQgc2l6ZSwgd2l0aCB0aGUgd29yc3QKKyAgICAgICAqIGNhc2UgYmVpbmcgYSBmbG9hdCB2YWx1ZSB0aGF0IGdldHMgYmxvd24gdXAgdG8gYSB2ZWM0LCBzbyBiZQorICAgICAgICogY29uc2VydmF0aXZlIGhlcmUuCisgICAgICAgKi8KKyAgICAgIHBhcmFtX2NvdW50ID0gdnMtPm51bV91bmlmb3JtX2NvbXBvbmVudHMgKiA0OworCisgICB9IGVsc2UgeworICAgICAgcGFyYW1fY291bnQgPSBjLT52cC0+cHJvZ3JhbS5CYXNlLlBhcmFtZXRlcnMtPk51bVBhcmFtZXRlcnMgKiA0OworICAgfQorICAgLyogdmVjNF92aXNpdG9yOjpzZXR1cF91bmlmb3JtX2NsaXBwbGFuZV92YWx1ZXMoKSBhbHNvIHVwbG9hZHMgdXNlciBjbGlwCisgICAgKiBwbGFuZXMgYXMgdW5pZm9ybXMuCisgICAgKi8KKyAgIHBhcmFtX2NvdW50ICs9IGMtPmtleS5iYXNlLm5yX3VzZXJjbGlwX3BsYW5lX2NvbnN0cyAqIDQ7CisKKyAgIHN0YWdlX3Byb2dfZGF0YS0+cGFyYW0gPSByemFsbG9jX2FycmF5KE5VTEwsIGNvbnN0IGZsb2F0ICosIHBhcmFtX2NvdW50KTsKKyAgIHN0YWdlX3Byb2dfZGF0YS0+cHVsbF9wYXJhbSA9IHJ6YWxsb2NfYXJyYXkoTlVMTCwgY29uc3QgZmxvYXQgKiwgcGFyYW1fY291bnQpOworCisgICAvKiBTZXR0aW5nIG5yX3BhcmFtcyBoZXJlIE5PVCB0byB0aGUgc2l6ZSBvZiB0aGUgcGFyYW0gYW5kIHB1bGxfcGFyYW0KKyAgICAqIGFycmF5cywgYnV0IHRvIHRoZSBudW1iZXIgb2YgdW5pZm9ybSBjb21wb25lbnRzIHZlYzRfdmlzaXRvcgorICAgICogbmVlZHMuIHZlYzRfdmlzaXRvcjo6c2V0dXBfdW5pZm9ybXMoKSB3aWxsIHNldCBpdCBiYWNrIHRvIGEgcHJvcGVyIHZhbHVlLgorICAgICovCisgICBzdGFnZV9wcm9nX2RhdGEtPm5yX3BhcmFtcyA9IEFMSUdOKHBhcmFtX2NvdW50LCA0KSAvIDQ7CisgICBpZiAodnMpIHsKKyAgICAgIHN0YWdlX3Byb2dfZGF0YS0+bnJfcGFyYW1zICs9IHZzLT5udW1fc2FtcGxlcnM7CisgICB9CisKKyAgIEdMYml0ZmllbGQ2NCBvdXRwdXRzX3dyaXR0ZW4gPSBjLT52cC0+cHJvZ3JhbS5CYXNlLk91dHB1dHNXcml0dGVuOworICAgYy0+cHJvZ19kYXRhLmlucHV0c19yZWFkID0gYy0+dnAtPnByb2dyYW0uQmFzZS5JbnB1dHNSZWFkOworCisgICBpZiAoYy0+a2V5LmNvcHlfZWRnZWZsYWcpIHsKKyAgICAgIG91dHB1dHNfd3JpdHRlbiB8PSBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfRURHRSk7CisgICAgICBjLT5wcm9nX2RhdGEuaW5wdXRzX3JlYWQgfD0gVkVSVF9CSVRfRURHRUZMQUc7CisgICB9CisKKyAgIGlmIChicnctPmdlbiA8IDYpIHsKKyAgICAgIC8qIFB1dCBkdW1teSBzbG90cyBpbnRvIHRoZSBWVUUgZm9yIHRoZSBTRiB0byBwdXQgdGhlIHJlcGxhY2VkCisgICAgICAgKiBwb2ludCBzcHJpdGUgY29vcmRzIGluLiAgV2Ugc2hvdWxkbid0IG5lZWQgdGhlc2UgZHVtbXkgc2xvdHMsCisgICAgICAgKiB3aGljaCB0YWtlIHVwIHByZWNpb3VzIFVSQiBzcGFjZSwgYnV0IGl0IHdvdWxkIG1lYW4gdGhhdCB0aGUgU0YKKyAgICAgICAqIGRvZXNuJ3QgZ2V0IG5pY2UgYWxpZ25lZCBwYWlycyBvZiBpbnB1dCBjb29yZHMgaW50byBvdXRwdXQKKyAgICAgICAqIGNvb3Jkcywgd2hpY2ggd291bGQgYmUgYSBwYWluIHRvIGhhbmRsZS4KKyAgICAgICAqLworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgaWYgKGMtPmtleS5wb2ludF9jb29yZF9yZXBsYWNlICYgKDEgPDwgaSkpCisgICAgICAgICAgICBvdXRwdXRzX3dyaXR0ZW4gfD0gQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX1RFWDAgKyBpKTsKKyAgICAgIH0KKworICAgICAgLyogaWYgYmFjayBjb2xvcnMgYXJlIHdyaXR0ZW4sIGFsbG9jYXRlIHNsb3RzIGZvciBmcm9udCBjb2xvcnMgdG9vICovCisgICAgICBpZiAob3V0cHV0c193cml0dGVuICYgQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0JGQzApKQorICAgICAgICAgb3V0cHV0c193cml0dGVuIHw9IEJJVEZJRUxENjRfQklUKFZBUllJTkdfU0xPVF9DT0wwKTsKKyAgICAgIGlmIChvdXRwdXRzX3dyaXR0ZW4gJiBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQkZDMSkpCisgICAgICAgICBvdXRwdXRzX3dyaXR0ZW4gfD0gQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0NPTDEpOworICAgfQorCisgICAvKiBJbiBvcmRlciBmb3IgbGVnYWN5IGNsaXBwaW5nIHRvIHdvcmssIHdlIG5lZWQgdG8gcG9wdWxhdGUgdGhlIGNsaXAKKyAgICAqIGRpc3RhbmNlIHZhcnlpbmcgc2xvdHMgd2hlbmV2ZXIgY2xpcHBpbmcgaXMgZW5hYmxlZCwgZXZlbiBpZiB0aGUgdmVydGV4CisgICAgKiBzaGFkZXIgZG9lc24ndCB3cml0ZSB0byBnbF9DbGlwRGlzdGFuY2UuCisgICAgKi8KKyAgIGlmIChjLT5rZXkuYmFzZS51c2VyY2xpcF9hY3RpdmUpIHsKKyAgICAgIG91dHB1dHNfd3JpdHRlbiB8PSBCSVRGSUVMRDY0X0JJVChWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMCk7CisgICAgICBvdXRwdXRzX3dyaXR0ZW4gfD0gQklURklFTEQ2NF9CSVQoVkFSWUlOR19TTE9UX0NMSVBfRElTVDEpOworICAgfQorCisgICBicndfY29tcHV0ZV92dWVfbWFwKGJydywgJmMtPnByb2dfZGF0YS5iYXNlLnZ1ZV9tYXAsIG91dHB1dHNfd3JpdHRlbik7CisKKyAgIGlmICgwKSB7CisgICAgICBfbWVzYV9mcHJpbnRfcHJvZ3JhbV9vcHQoc3RkZXJyLCAmYy0+dnAtPnByb2dyYW0uQmFzZSwgUFJPR19QUklOVF9ERUJVRywKKwkJCSAgICAgICB0cnVlKTsKKyAgIH0KKworICAgLyogRW1pdCBHRU40IGNvZGUuCisgICAgKi8KKyAgIGMtPmJhc2UucHJvZ3JhbSA9IGJyd192c19lbWl0KGJydywgYy0+YmFzZS5zaGFkZXJfcHJvZywgYywKKyAgICAgICAgICZjLT5wcm9nX2RhdGEsIGMtPmJhc2UubWVtX2N0eCwgJmMtPmJhc2UucHJvZ3JhbV9zaXplKTsKKyAgIGlmIChjLT5iYXNlLnByb2dyYW0gPT0gTlVMTCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKGMtPmJhc2UubGFzdF9zY3JhdGNoKSB7CisgICAgICBjLT5wcm9nX2RhdGEuYmFzZS50b3RhbF9zY3JhdGNoCisgICAgICAgICA9IGJyd19nZXRfc2NyYXRjaF9zaXplKGMtPmJhc2UubGFzdF9zY3JhdGNoKlJFR19TSVpFKTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCiticndfdnNfY2xlYXJfY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKwkgICAgICAgICAgICAgc3RydWN0IGJyd192c19jb21waWxlICpjKQoreworICAgcmFsbG9jX2ZyZWUoYy0+YmFzZS5tZW1fY3R4KTsKK30KKworLy8gTHVuYXJHIDogVE9ETyAtIHVzZXIgY2xpcCBwbGFuZXM/CisvL3ZvaWQKKy8vYnJ3X3NldHVwX3ZlYzRfa2V5X2NsaXBfaW5mbyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZlYzRfcHJvZ19rZXkgKmtleSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2dyYW1fdXNlc19jbGlwX2Rpc3RhbmNlKQorLy97CisvLyAgIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggPSAmYnJ3LT5jdHg7CisKKy8vICAga2V5LT51c2VyY2xpcF9hY3RpdmUgPSAoY3R4LT5UcmFuc2Zvcm0uQ2xpcFBsYW5lc0VuYWJsZWQgIT0gMCk7CisvLyAgIGlmIChrZXktPnVzZXJjbGlwX2FjdGl2ZSAmJiAhcHJvZ3JhbV91c2VzX2NsaXBfZGlzdGFuY2UpIHsKKy8vICAgICAga2V5LT5ucl91c2VyY2xpcF9wbGFuZV9jb25zdHMKKy8vICAgICAgICAgPSBfbWVzYV9sb2diYXNlMihjdHgtPlRyYW5zZm9ybS5DbGlwUGxhbmVzRW5hYmxlZCkgKyAxOworLy8gICB9CisvL30KKworYm9vbAorYnJ3X3ZzX3ByZWNvbXBpbGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dChjdHgpOworICAgc3RydWN0IGJyd192c19wcm9nX2tleSBrZXk7CisKKyAgIGlmICghcHJvZy0+X0xpbmtlZFNoYWRlcnNbTUVTQV9TSEFERVJfVkVSVEVYXSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICBzdHJ1Y3QgZ2xfdmVydGV4X3Byb2dyYW0gKnZwID0gKHN0cnVjdCBnbF92ZXJ0ZXhfcHJvZ3JhbSAqKQorICAgICAgcHJvZy0+X0xpbmtlZFNoYWRlcnNbTUVTQV9TSEFERVJfVkVSVEVYXS0+UHJvZ3JhbTsKKyAgIHN0cnVjdCBicndfdmVydGV4X3Byb2dyYW0gKmJ2cCA9IGJyd192ZXJ0ZXhfcHJvZ3JhbSh2cCk7CisKKyAgIG1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CisKKyAgIGJyd192ZWM0X3NldHVwX3Byb2dfa2V5X2Zvcl9wcmVjb21waWxlKGN0eCwgJmtleS5iYXNlLCBidnAtPmlkLCAmdnAtPkJhc2UpOworCisgICAvLyBJbiBWSywgdXNlciBjbGlwcGluZyBpcyB0cmlnZ2VyZWQgc29sZWx5IGZyb20gdGhlIHNoYWRlci4KKyAgIGtleS5iYXNlLnVzZXJjbGlwX2FjdGl2ZSA9IHZwLT5CYXNlLlVzZXNDbGlwRGlzdGFuY2VPdXQ7CisKKyAgIHN0cnVjdCBicndfdnNfY29tcGlsZSBjOworCisgICBicndfdnNfaW5pdF9jb21waWxlKGJydywgcHJvZywgYnZwLCAma2V5LCAmYyk7CisgICBpZiAoIWJyd192c19kb19jb21waWxlKGJydywgJmMpKSB7CisgICAgICBicndfdnNfY2xlYXJfY29tcGlsZShicncsICZjKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgLy8gUmF0aGVyIHRoYW4gZGVmZXIgb3IgdXBsb2FkIHRvIGNhY2hlLCBoYW5kIG9mZgorICAgLy8gdGhlIGNvbXBpbGUgcmVzdWx0cyBiYWNrIHRvIHRoZSBicndfY29udGV4dAorICAgYnJ3X3NoYWRlcl9wcm9ncmFtX3NhdmVfdnNfY29tcGlsZShicnctPnNoYWRlcl9wcm9nLCAmYyk7CisKKyAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192cy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd192cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmJiNTYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3ZzLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgQ29weXJpZ2h0IChDKSBJbnRlbCBDb3JwLiAgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgSW50ZWwgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvCisgZGV2ZWxvcCB0aGlzIDNEIGRyaXZlci4KKworIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKgorICAqIEF1dGhvcnM6CisgICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGh3QHZtd2FyZS5jb20+CisgICovCisKKworI2lmbmRlZiBCUldfVlNfSAorI2RlZmluZSBCUldfVlNfSAorCisKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd19ldS5oIgorI2luY2x1ZGUgImJyd192ZWM0LmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9ncmFtLmgiCisKKy8qKgorICogVGhlIFZGIGNhbid0IG5hdGl2ZWx5IGhhbmRsZSBjZXJ0YWluIHR5cGVzIG9mIGF0dHJpYnV0ZXMsIHN1Y2ggYXMgR0xfRklYRUQKKyAqIG9yIG1vc3QgMTBfMTBfMTBfMiB0eXBlcy4gIFRoZXNlIGZsYWdzIGVuYWJsZSB2YXJpb3VzIFZTIHdvcmthcm91bmRzIHRvCisgKiAiZml4IiBhdHRyaWJ1dGVzIGF0IHRoZSBiZWdpbm5pbmcgb2Ygc2hhZGVycy4KKyAqLworI2RlZmluZSBCUldfQVRUUklCX1dBX0NPTVBPTkVOVF9NQVNLICAgIDcgIC8qIG1hc2sgZm9yIEdMX0ZJWEVEIHNjYWxlIGNoYW5uZWwgY291bnQgKi8KKyNkZWZpbmUgQlJXX0FUVFJJQl9XQV9OT1JNQUxJWkUgICAgIDggICAvKiBub3JtYWxpemUgaW4gc2hhZGVyICovCisjZGVmaW5lIEJSV19BVFRSSUJfV0FfQkdSQSAgICAgICAgICAxNiAgLyogc3dhcCByL2IgY2hhbm5lbHMgaW4gc2hhZGVyICovCisjZGVmaW5lIEJSV19BVFRSSUJfV0FfU0lHTiAgICAgICAgICAzMiAgLyogaW50ZXJwcmV0IGFzIHNpZ25lZCBpbiBzaGFkZXIgKi8KKyNkZWZpbmUgQlJXX0FUVFJJQl9XQV9TQ0FMRSAgICAgICAgIDY0ICAvKiBpbnRlcnByZXQgYXMgc2NhbGVkIGluIHNoYWRlciAqLworCitzdHJ1Y3QgYnJ3X3ZzX3Byb2dfa2V5IHsKKyAgIHN0cnVjdCBicndfdmVjNF9wcm9nX2tleSBiYXNlOworCisgICAvKgorICAgICogUGVyLWF0dHJpYnV0ZSB3b3JrYXJvdW5kIGZsYWdzCisgICAgKi8KKyAgIHVpbnQ4X3QgZ2xfYXR0cmliX3dhX2ZsYWdzW1ZFUlRfQVRUUklCX01BWF07CisKKyAgIEdMdWludCBjb3B5X2VkZ2VmbGFnOjE7CisKKyAgIC8qKgorICAgICogRm9yIHByZS1HZW42IGhhcmR3YXJlLCBhIGJpdGZpZWxkIGluZGljYXRpbmcgd2hpY2ggdGV4dHVyZSBjb29yZGluYXRlcworICAgICogYXJlIGdvaW5nIHRvIGJlIHJlcGxhY2VkIHdpdGggcG9pbnQgY29vcmRpbmF0ZXMgKGFzIGEgY29uc2VxdWVuY2Ugb2YgYQorICAgICogY2FsbCB0byBnbFRleEVudmkoR0xfUE9JTlRfU1BSSVRFLCBHTF9DT09SRF9SRVBMQUNFLCBHTF9UUlVFKSkuICBCZWNhdXNlCisgICAgKiBvdXIgU0YgdGhyZWFkIHJlcXVpcmVzIGV4YWN0IG1hdGNoaW5nIGJldHdlZW4gVlMgb3V0cHV0cyBhbmQgRlMgaW5wdXRzLAorICAgICogdGhlc2UgdGV4dHVyZSBjb29yZGluYXRlcyB3aWxsIG5lZWQgdG8gYmUgdW5jb25kaXRpb25hbGx5IGluY2x1ZGVkIGluCisgICAgKiB0aGUgVlVFLCBldmVuIGlmIHRoZXkgYXJlbid0IHdyaXR0ZW4gYnkgdGhlIHZlcnRleCBzaGFkZXIuCisgICAgKi8KKyAgIEdMdWludCBwb2ludF9jb29yZF9yZXBsYWNlOjg7Cit9OworCisKK3N0cnVjdCBicndfdnNfY29tcGlsZSB7CisgICBzdHJ1Y3QgYnJ3X3ZlYzRfY29tcGlsZSBiYXNlOworICAgc3RydWN0IGJyd192c19wcm9nX2tleSBrZXk7CisgICBzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSBwcm9nX2RhdGE7CisKKyAgIHN0cnVjdCBicndfdmVydGV4X3Byb2dyYW0gKnZwOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitjb25zdCB1bnNpZ25lZCAqYnJ3X3ZzX2VtaXQoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfdnNfY29tcGlsZSAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSAqcHJvZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnByb2dyYW1fc2l6ZSk7Citib29sIGJyd192c19wcmVjb21waWxlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyk7Cit2b2lkIGJyd192c19kZWJ1Z19yZWNvbXBpbGUoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfdnNfcHJvZ19rZXkgKmtleSk7Citib29sIGJyd192c19wcm9nX2RhdGFfY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKworCituYW1lc3BhY2UgYnJ3IHsKKworY2xhc3MgdmVjNF92c192aXNpdG9yIDogcHVibGljIHZlYzRfdmlzaXRvcgoreworcHVibGljOgorICAgdmVjNF92c192aXNpdG9yKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfdnNfY29tcGlsZSAqdnNfY29tcGlsZSwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSAqdnNfcHJvZ19kYXRhLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICB2b2lkICptZW1fY3R4KTsKKworcHJvdGVjdGVkOgorICAgdmlydHVhbCBkc3RfcmVnICptYWtlX3JlZ19mb3Jfc3lzdGVtX3ZhbHVlKGlyX3ZhcmlhYmxlICppcik7CisgICB2aXJ0dWFsIHZvaWQgc2V0dXBfcGF5bG9hZCgpOworICAgdmlydHVhbCB2b2lkIGVtaXRfcHJvbG9nKCk7CisgICAvL3ZpcnR1YWwgdm9pZCBlbWl0X3Byb2dyYW1fY29kZSgpOworICAgdmlydHVhbCB2b2lkIGVtaXRfdGhyZWFkX2VuZCgpOworICAgdmlydHVhbCB2b2lkIGVtaXRfdXJiX3dyaXRlX2hlYWRlcihpbnQgbXJmKTsKKyAgIHZpcnR1YWwgdmVjNF9pbnN0cnVjdGlvbiAqZW1pdF91cmJfd3JpdGVfb3Bjb2RlKGJvb2wgY29tcGxldGUpOworCitwcml2YXRlOgorICAgaW50IHNldHVwX2F0dHJpYnV0ZXMoaW50IHBheWxvYWRfcmVnKTsKKyAgIHZvaWQgc2V0dXBfdnBfcmVncygpOworICAgZHN0X3JlZyBnZXRfdnBfZHN0X3JlZyhjb25zdCBwcm9nX2RzdF9yZWdpc3RlciAmZHN0KTsKKyAgIHNyY19yZWcgZ2V0X3ZwX3NyY19yZWcoY29uc3QgcHJvZ19zcmNfcmVnaXN0ZXIgJnNyYyk7CisKKyAgIHN0cnVjdCBicndfdnNfY29tcGlsZSAqIGNvbnN0IHZzX2NvbXBpbGU7CisgICBzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSAqIGNvbnN0IHZzX3Byb2dfZGF0YTsKKyAgIHNyY19yZWcgKnZwX3RlbXBfcmVnczsKKyAgIHNyY19yZWcgdnBfYWRkcl9yZWc7Cit9OworCit9IC8qIG5hbWVzcGFjZSBicncgKi8KKworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3dtLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3dtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNDdkNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9icndfd20uYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIEludGVsIENvcnAuICAyMDA2LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyBJbnRlbCBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8KKyBkZXZlbG9wIHRoaXMgM0QgZHJpdmVyLgorCisgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qCisgICogQXV0aG9yczoKKyAgKiAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHdAdm13YXJlLmNvbT4KKyAgKi8KKworI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCisjaW5jbHVkZSAiYnJ3X3NoYWRlci5oIgorI2luY2x1ZGUgImJyd193bS5oIgorLy8jaW5jbHVkZSAiYnJ3X3N0YXRlLmgiICAvLyBMdW5hckc6IFJlbW92ZQorI2luY2x1ZGUgIm1haW4vZW51bXMuaCIKKyNpbmNsdWRlICJtYWluL2Zvcm1hdHMuaCIKKy8vI2luY2x1ZGUgIm1haW4vZmJvYmplY3QuaCIgLy8gTHVuYXJHOiBSZW1vdmUKKy8vI2luY2x1ZGUgIm1haW4vc2FtcGxlcm9iai5oIiAvLyBMdW5hckc6IFJlbW92ZQorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dyYW0uaCIKKy8vI2luY2x1ZGUgImludGVsX21pcG1hcF90cmVlLmgiIC8vIEx1bmFyRzogUmVtb3ZlCisKKyNpbmNsdWRlICJnbHNsL3JhbGxvYy5oIgorCisvKioKKyAqIFJldHVybiBhIGJpdGZpZWxkIHdoZXJlIGJpdCBuIGlzIHNldCBpZiBiYXJ5Y2VudHJpYyBpbnRlcnBvbGF0aW9uIG1vZGUgbgorICogKHNlZSBlbnVtIGJyd193bV9iYXJ5Y2VudHJpY19pbnRlcnBfbW9kZSkgaXMgbmVlZGVkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZAorYnJ3X2NvbXB1dGVfYmFyeWNlbnRyaWNfaW50ZXJwX21vZGVzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hhZGVfbW9kZWxfZmxhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBlcnNhbXBsZV9zaGFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcHJvZykKK3sKKyAgIHVuc2lnbmVkIGJhcnljZW50cmljX2ludGVycF9tb2RlcyA9IDA7CisgICBpbnQgYXR0cjsKKworICAgLyogTG9vcCB0aHJvdWdoIGFsbCBmcmFnbWVudCBzaGFkZXIgaW5wdXRzIHRvIGZpZ3VyZSBvdXQgd2hhdCBpbnRlcnBvbGF0aW9uCisgICAgKiBtb2RlcyBhcmUgaW4gdXNlLCBhbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBiaXRzIGluCisgICAgKiBiYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMuCisgICAgKi8KKyAgIGZvciAoYXR0ciA9IDA7IGF0dHIgPCBWQVJZSU5HX1NMT1RfTUFYOyArK2F0dHIpIHsKKyAgICAgIGVudW0gZ2xzbF9pbnRlcnBfcXVhbGlmaWVyIGludGVycF9xdWFsaWZpZXIgPQorICAgICAgICAgZnByb2ctPkludGVycFF1YWxpZmllclthdHRyXTsKKyAgICAgIGJvb2wgaXNfY2VudHJvaWQgPSAoZnByb2ctPklzQ2VudHJvaWQgJiBCSVRGSUVMRDY0X0JJVChhdHRyKSkgJiYKKyAgICAgICAgICFwZXJzYW1wbGVfc2hhZGluZzsKKyAgICAgIGJvb2wgaXNfc2FtcGxlID0gKGZwcm9nLT5Jc1NhbXBsZSAmIEJJVEZJRUxENjRfQklUKGF0dHIpKSB8fAorICAgICAgICAgcGVyc2FtcGxlX3NoYWRpbmc7CisgICAgICBib29sIGlzX2dsX0NvbG9yID0gYXR0ciA9PSBWQVJZSU5HX1NMT1RfQ09MMCB8fCBhdHRyID09IFZBUllJTkdfU0xPVF9DT0wxOworCisgICAgICAvKiBJZ25vcmUgdW51c2VkIGlucHV0cy4gKi8KKyAgICAgIGlmICghKGZwcm9nLT5CYXNlLklucHV0c1JlYWQgJiBCSVRGSUVMRDY0X0JJVChhdHRyKSkpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogSWdub3JlIFdQT1MgYW5kIEZBQ0UsIGJlY2F1c2UgdGhleSBkb24ndCByZXF1aXJlIGludGVycG9sYXRpb24uICovCisgICAgICBpZiAoYXR0ciA9PSBWQVJZSU5HX1NMT1RfUE9TIHx8IGF0dHIgPT0gVkFSWUlOR19TTE9UX0ZBQ0UpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogRGV0ZXJtaW5lIHRoZSBzZXQgKG9yIHNldHMpIG9mIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG5lZWRlZCB0bworICAgICAgICogaW50ZXJwb2xhdGUgdGhpcyB2YXJpYWJsZS4gIE5vdGUgdGhhdCB3aGVuCisgICAgICAgKiBicnctPm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgaXMgc2V0LCBjZW50cm9pZCBpbnRlcnBvbGF0aW9uCisgICAgICAgKiB1c2VzIFBJWEVMIGludGVycG9sYXRpb24gZm9yIHVubGl0IHBpeGVscyBhbmQgQ0VOVFJPSUQgaW50ZXJwb2xhdGlvbgorICAgICAgICogZm9yIGxpdCBwaXhlbHMsIHNvIHdlIG5lZWQgYm90aCBzZXRzIG9mIGJhcnljZW50cmljIGNvb3JkaW5hdGVzLgorICAgICAgICovCisgICAgICBpZiAoaW50ZXJwX3F1YWxpZmllciA9PSBJTlRFUlBfUVVBTElGSUVSX05PUEVSU1BFQ1RJVkUpIHsKKyAgICAgICAgIGlmIChpc19jZW50cm9pZCkgeworICAgICAgICAgICAgYmFyeWNlbnRyaWNfaW50ZXJwX21vZGVzIHw9CisgICAgICAgICAgICAgICAxIDw8IEJSV19XTV9OT05QRVJTUEVDVElWRV9DRU5UUk9JRF9CQVJZQ0VOVFJJQzsKKyAgICAgICAgIH0gZWxzZSBpZiAoaXNfc2FtcGxlKSB7CisgICAgICAgICAgICBiYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMgfD0KKyAgICAgICAgICAgICAgIDEgPDwgQlJXX1dNX05PTlBFUlNQRUNUSVZFX1NBTVBMRV9CQVJZQ0VOVFJJQzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoIWlzX2NlbnRyb2lkICYmICFpc19zYW1wbGUpIHx8CisgICAgICAgICAgICAgYnJ3LT5uZWVkc191bmxpdF9jZW50cm9pZF93b3JrYXJvdW5kKSB7CisgICAgICAgICAgICBiYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMgfD0KKyAgICAgICAgICAgICAgIDEgPDwgQlJXX1dNX05PTlBFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpbnRlcnBfcXVhbGlmaWVyID09IElOVEVSUF9RVUFMSUZJRVJfU01PT1RIIHx8CisgICAgICAgICAgICAgICAgICghKHNoYWRlX21vZGVsX2ZsYXQgJiYgaXNfZ2xfQ29sb3IpICYmCisgICAgICAgICAgICAgICAgICBpbnRlcnBfcXVhbGlmaWVyID09IElOVEVSUF9RVUFMSUZJRVJfTk9ORSkpIHsKKyAgICAgICAgIGlmIChpc19jZW50cm9pZCkgeworICAgICAgICAgICAgYmFyeWNlbnRyaWNfaW50ZXJwX21vZGVzIHw9CisgICAgICAgICAgICAgICAxIDw8IEJSV19XTV9QRVJTUEVDVElWRV9DRU5UUk9JRF9CQVJZQ0VOVFJJQzsKKyAgICAgICAgIH0gZWxzZSBpZiAoaXNfc2FtcGxlKSB7CisgICAgICAgICAgICBiYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMgfD0KKyAgICAgICAgICAgICAgIDEgPDwgQlJXX1dNX1BFUlNQRUNUSVZFX1NBTVBMRV9CQVJZQ0VOVFJJQzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoIWlzX2NlbnRyb2lkICYmICFpc19zYW1wbGUpIHx8CisgICAgICAgICAgICAgYnJ3LT5uZWVkc191bmxpdF9jZW50cm9pZF93b3JrYXJvdW5kKSB7CisgICAgICAgICAgICBiYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMgfD0KKyAgICAgICAgICAgICAgIDEgPDwgQlJXX1dNX1BFUlNQRUNUSVZFX1BJWEVMX0JBUllDRU5UUklDOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gYmFyeWNlbnRyaWNfaW50ZXJwX21vZGVzOworfQorCitib29sCiticndfd21fcHJvZ19kYXRhX2NvbXBhcmUoY29uc3Qgdm9pZCAqaW5fYSwgY29uc3Qgdm9pZCAqaW5fYikKK3sKKyAgIGNvbnN0IHN0cnVjdCBicndfd21fcHJvZ19kYXRhICphID0gaW5fYTsKKyAgIGNvbnN0IHN0cnVjdCBicndfd21fcHJvZ19kYXRhICpiID0gaW5fYjsKKworICAgLyogQ29tcGFyZSB0aGUgYmFzZSBzdHJ1Y3R1cmUuICovCisgICBpZiAoIWJyd19zdGFnZV9wcm9nX2RhdGFfY29tcGFyZSgmYS0+YmFzZSwgJmItPmJhc2UpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBDb21wYXJlIHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUuICovCisgICBjb25zdCB1bnNpZ25lZCBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEpOworICAgaWYgKG1lbWNtcCgoKGNoYXIgKikgYSkgKyBvZmZzZXQsICgoY2hhciAqKSBiKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBicndfd21fcHJvZ19kYXRhKSAtIG9mZnNldCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHJldHVybiB0cnVlOworfQorCitzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKgorYnJ3X3dtX2luaXRfY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKwkJICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJICAgIHN0cnVjdCBicndfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCisJCSAgICBjb25zdCBzdHJ1Y3QgYnJ3X3dtX3Byb2dfa2V5ICprZXkpCit7CisgICBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmM7CisKKyAgIGMgPSByemFsbG9jKE5VTEwsIHN0cnVjdCBicndfd21fY29tcGlsZSk7CisgICBpZiAoIWMpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgYy0+c2hhZGVyX3Byb2cgPSBwcm9nOworICAgYy0+ZnAgPSBmcDsKKyAgIGMtPmtleSA9ICprZXk7CisKKyAgIHJldHVybiBjOworfQorCitib29sCiticndfd21fZG9fY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfd21fY29tcGlsZSAqYykKK3sKKyAgIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggPSAmYnJ3LT5jdHg7CisgICBzdHJ1Y3QgZ2xfc2hhZGVyICpmcyA9IE5VTEw7CisKKyAgIGlmIChjLT5zaGFkZXJfcHJvZykKKyAgICAgIGZzID0gYy0+c2hhZGVyX3Byb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0ZSQUdNRU5UXTsKKworICAgLyogQWxsb2NhdGUgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHVuaWZvcm1zIHRoYXQgd2lsbCBlbmQgdXAgaW4gdGhlCisgICAgKiBwcm9nX2RhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21waWxlZCBwcm9ncmFtLCBhbmQgd2hpY2ggd2lsbCBiZSBmcmVlZAorICAgICogYnkgdGhlIHN0YXRlIGNhY2hlLgorICAgICovCisgICBpbnQgcGFyYW1fY291bnQ7CisgICBpZiAoZnMpIHsKKyAgICAgIHBhcmFtX2NvdW50ID0gZnMtPm51bV91bmlmb3JtX2NvbXBvbmVudHM7CisgICB9IGVsc2UgeworICAgICAgcGFyYW1fY291bnQgPSBjLT5mcC0+cHJvZ3JhbS5CYXNlLlBhcmFtZXRlcnMtPk51bVBhcmFtZXRlcnMgKiA0OworICAgfQorICAgLyogVGhlIGJhY2tlbmQgYWxzbyBzb21ldGltZXMgYWRkcyBwYXJhbXMgZm9yIHRleHR1cmUgc2l6ZS4gKi8KKyAgIHBhcmFtX2NvdW50ICs9IDIgKiBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heFRleHR1cmVJbWFnZVVuaXRzOworICAgYy0+cHJvZ19kYXRhLmJhc2UucGFyYW0gPSByemFsbG9jX2FycmF5KE5VTEwsIGNvbnN0IGZsb2F0ICosIHBhcmFtX2NvdW50KTsKKyAgIGMtPnByb2dfZGF0YS5iYXNlLnB1bGxfcGFyYW0gPQorICAgICAgcnphbGxvY19hcnJheShOVUxMLCBjb25zdCBmbG9hdCAqLCBwYXJhbV9jb3VudCk7CisgICBjLT5wcm9nX2RhdGEuYmFzZS5ucl9wYXJhbXMgPSBwYXJhbV9jb3VudDsKKworICAgYy0+cHJvZ19kYXRhLmJhcnljZW50cmljX2ludGVycF9tb2RlcyA9CisgICAgICBicndfY29tcHV0ZV9iYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMoYnJ3LCBjLT5rZXkuZmxhdF9zaGFkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5rZXkucGVyc2FtcGxlX3NoYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmMtPmZwLT5wcm9ncmFtKTsKKworICAgYy0+cHJvZ3JhbSA9IGJyd193bV9mc19lbWl0KGJydywgYywKKyAgICAgICAgICZjLT5mcC0+cHJvZ3JhbSwgYy0+c2hhZGVyX3Byb2csICZjLT5wcm9ncmFtX3NpemUpOworICAgaWYgKGMtPnByb2dyYW0gPT0gTlVMTCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgLyogU2NyYXRjaCBzcGFjZSBpcyB1c2VkIGZvciByZWdpc3RlciBzcGlsbGluZyAqLworICAgaWYgKGMtPmxhc3Rfc2NyYXRjaCkgeworICAgICAgcGVyZl9kZWJ1ZygiRnJhZ21lbnQgc2hhZGVyIHRyaWdnZXJlZCByZWdpc3RlciBzcGlsbGluZy4gICIKKyAgICAgICAgICAgICAgICAgIlRyeSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGxpdmUgc2NhbGFyIHZhbHVlcyB0byAiCisgICAgICAgICAgICAgICAgICJpbXByb3ZlIHBlcmZvcm1hbmNlLlxuIik7CisKKyAgICAgIGMtPnByb2dfZGF0YS50b3RhbF9zY3JhdGNoID0gYnJ3X2dldF9zY3JhdGNoX3NpemUoYy0+bGFzdF9zY3JhdGNoKTsKKyAgIH0KKworICAgaWYgKHVubGlrZWx5KElOVEVMX0RFQlVHICYgREVCVUdfV00pKQorICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworCisgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorYnJ3X3dtX2NsZWFyX2NvbXBpbGUoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpCit7CisgICByYWxsb2NfZnJlZShjKTsKK30KKworLy9zdGF0aWMgdWludDhfdAorLy9nZW42X2dhdGhlcl93b3JrYXJvdW5kKEdMZW51bSBpbnRlcm5hbGZvcm1hdCkKKy8veworLy8gICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CisvLyAgICAgIGNhc2UgR0xfUjhJOiByZXR1cm4gV0FfU0lHTiB8IFdBXzhCSVQ7CisvLyAgICAgIGNhc2UgR0xfUjhVSTogcmV0dXJuIFdBXzhCSVQ7CisvLyAgICAgIGNhc2UgR0xfUjE2STogcmV0dXJuIFdBX1NJR04gfCBXQV8xNkJJVDsKKy8vICAgICAgY2FzZSBHTF9SMTZVSTogcmV0dXJuIFdBXzE2QklUOworLy8gICAgICAvKiBub3RlIHRoYXQgZXZlbiB0aG91Z2ggR0xfUjMySSBhbmQgR0xfUjMyVUkgaGF2ZSBmb3JtYXQgb3ZlcnJpZGVzCisvLyAgICAgICAqIGluIHRoZSBzdXJmYWNlIHN0YXRlLCB0aGVyZSBpcyBubyBzaGFkZXIgdy9hIHJlcXVpcmVkICovCisvLyAgICAgIGRlZmF1bHQ6IHJldHVybiAwOworLy8gICB9CisvL30KKworLy8gTHVuYXJHIDogVE9ETyAtIGJyaW5nIHRoaXMgYmFjayBpbiB3aGVuIG1hcHBpbmcgZGVzY3JpcHRvcgorLy8gICAgICAgICAgICAgICAgIHNldHMgdG8gTk9TCisvL3ZvaWQKKy8vYnJ3X3BvcHVsYXRlX3NhbXBsZXJfcHJvZ19rZXlfZGF0YShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorLy8JCQkJICAgY29uc3Qgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcl9jb3VudCwKKy8vCQkJCSAgIHN0cnVjdCBicndfc2FtcGxlcl9wcm9nX2tleV9kYXRhICprZXkpCisvL3sKKy8vICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBicndfY29udGV4dChjdHgpOworCisvLyAgIGZvciAoaW50IHMgPSAwOyBzIDwgc2FtcGxlcl9jb3VudDsgcysrKSB7CisvLyAgICAgIGtleS0+c3dpenpsZXNbc10gPSBTV0laWkxFX05PT1A7CisKKy8vICAgICAgaWYgKCEocHJvZy0+U2FtcGxlcnNVc2VkICYgKDEgPDwgcykpKQorLy8JIGNvbnRpbnVlOworCisvLyAgICAgIGludCB1bml0X2lkID0gcHJvZy0+U2FtcGxlclVuaXRzW3NdOworLy8gICAgICBjb25zdCBzdHJ1Y3QgZ2xfdGV4dHVyZV91bml0ICp1bml0ID0gJmN0eC0+VGV4dHVyZS5Vbml0W3VuaXRfaWRdOworCisvLyAgICAgIGlmICh1bml0LT5fQ3VycmVudCAmJiB1bml0LT5fQ3VycmVudC0+VGFyZ2V0ICE9IEdMX1RFWFRVUkVfQlVGRkVSKSB7CisvLwkgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICp0ID0gdW5pdC0+X0N1cnJlbnQ7CisvLwkgY29uc3Qgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmltZyA9IHQtPkltYWdlWzBdW3QtPkJhc2VMZXZlbF07CisvLwkgc3RydWN0IGdsX3NhbXBsZXJfb2JqZWN0ICpzYW1wbGVyID0gX21lc2FfZ2V0X3NhbXBsZXJvYmooY3R4LCB1bml0X2lkKTsKKworLy8gICAgICAgICBjb25zdCBib29sIGFscGhhX2RlcHRoID0gdC0+RGVwdGhNb2RlID09IEdMX0FMUEhBICYmCisvLyAgICAgICAgICAgIChpbWctPl9CYXNlRm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCB8fAorLy8gICAgICAgICAgICAgaW1nLT5fQmFzZUZvcm1hdCA9PSBHTF9ERVBUSF9TVEVOQ0lMKTsKKworLy8gICAgICAgICAvKiBIYXN3ZWxsIGhhbmRsZXMgdGV4dHVyZSBzd2l6emxpbmcgYXMgc3VyZmFjZSBmb3JtYXQgb3ZlcnJpZGVzCisvLyAgICAgICAgICAqIChleGNlcHQgZm9yIEdMX0FMUEhBKTsgYWxsIG90aGVyIHBsYXRmb3JtcyBuZWVkIE1PVnMgaW4gdGhlIHNoYWRlci4KKy8vICAgICAgICAgICovCisvLyAgICAgICAgIGlmIChhbHBoYV9kZXB0aCB8fCAoYnJ3LT5nZW4gPCA4ICYmICFicnctPmlzX2hhc3dlbGwpKQorLy8gICAgICAgICAgICBrZXktPnN3aXp6bGVzW3NdID0gYnJ3X2dldF90ZXh0dXJlX3N3aXp6bGUoY3R4LCB0KTsKKworLy8JIGlmIChicnctPmdlbiA8IDggJiYKKy8vICAgICAgICAgICAgIHNhbXBsZXItPk1pbkZpbHRlciAhPSBHTF9ORUFSRVNUICYmCisvLwkgICAgIHNhbXBsZXItPk1hZ0ZpbHRlciAhPSBHTF9ORUFSRVNUKSB7CisvLwkgICAgaWYgKHNhbXBsZXItPldyYXBTID09IEdMX0NMQU1QKQorLy8JICAgICAgIGtleS0+Z2xfY2xhbXBfbWFza1swXSB8PSAxIDw8IHM7CisvLwkgICAgaWYgKHNhbXBsZXItPldyYXBUID09IEdMX0NMQU1QKQorLy8JICAgICAgIGtleS0+Z2xfY2xhbXBfbWFza1sxXSB8PSAxIDw8IHM7CisvLwkgICAgaWYgKHNhbXBsZXItPldyYXBSID09IEdMX0NMQU1QKQorLy8JICAgICAgIGtleS0+Z2xfY2xhbXBfbWFza1syXSB8PSAxIDw8IHM7CisvLwkgfQorCisvLyAgICAgICAgIC8qIGdhdGhlcjQncyBjaGFubmVsIHNlbGVjdCBmb3IgZ3JlZW4gZnJvbSBSRzMyRiBpcyBicm9rZW47CisvLyAgICAgICAgICAqIHJlcXVpcmVzIGEgc2hhZGVyIHcvYSBvbiBJVkI7IGZpeGFibGUgd2l0aCBqdXN0IFNDUyBvbiBIU1cuICovCisvLyAgICAgICAgIGlmIChicnctPmdlbiA9PSA3ICYmICFicnctPmlzX2hhc3dlbGwgJiYgcHJvZy0+VXNlc0dhdGhlcikgeworLy8gICAgICAgICAgICBpZiAoaW1nLT5JbnRlcm5hbEZvcm1hdCA9PSBHTF9SRzMyRikKKy8vICAgICAgICAgICAgICAga2V5LT5nYXRoZXJfY2hhbm5lbF9xdWlya19tYXNrIHw9IDEgPDwgczsKKy8vICAgICAgICAgfQorCisvLyAgICAgICAgIC8qIEdlbjYncyBnYXRoZXI0IGlzIGJyb2tlbiBmb3IgVUlOVC9TSU5UOyB3ZSB0cmVhdCB0aGVtIGFzCisvLyAgICAgICAgICAqIFVOT1JNL0ZMT0FUIGluc3RlYWQgYW5kIGZpeCBpdCBpbiB0aGUgc2hhZGVyLgorLy8gICAgICAgICAgKi8KKy8vICAgICAgICAgaWYgKGJydy0+Z2VuID09IDYgJiYgcHJvZy0+VXNlc0dhdGhlcikgeworLy8gICAgICAgICAgICBrZXktPmdlbjZfZ2F0aGVyX3dhW3NdID0gZ2VuNl9nYXRoZXJfd29ya2Fyb3VuZChpbWctPkludGVybmFsRm9ybWF0KTsKKy8vICAgICAgICAgfQorCisvLyAgICAgICAgIC8qIElmIHRoaXMgaXMgYSBtdWx0aXNhbXBsZSBzYW1wbGVyLCBhbmQgdXNlcyB0aGUgQ01TIE1TQUEgbGF5b3V0LAorLy8gICAgICAgICAgKiB0aGVuIHdlIG5lZWQgdG8gZW1pdCBzbGlnaHRseSBkaWZmZXJlbnQgY29kZSB0byBmaXJzdCBzYW1wbGUgdGhlCisvLyAgICAgICAgICAqIE1DUyBzdXJmYWNlLgorLy8gICAgICAgICAgKi8KKy8vICAgICAgICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppbnRlbF90ZXggPQorLy8gICAgICAgICAgICBpbnRlbF90ZXh0dXJlX29iamVjdCgoc3RydWN0IGdsX3RleHR1cmVfb2JqZWN0ICopdCk7CisKKy8vICAgICAgICAgaWYgKGJydy0+Z2VuID49IDcgJiYKKy8vICAgICAgICAgICAgIGludGVsX3RleC0+bXQtPm1zYWFfbGF5b3V0ID09IElOVEVMX01TQUFfTEFZT1VUX0NNUykgeworLy8gICAgICAgICAgICBrZXktPmNvbXByZXNzZWRfbXVsdGlzYW1wbGVfbGF5b3V0X21hc2sgfD0gMSA8PCBzOworLy8gICAgICAgICB9CisvLyAgICAgIH0KKy8vICAgfQorLy99CisKKy8vc3RhdGljIHZvaWQgYnJ3X3dtX3BvcHVsYXRlX2tleSggc3RydWN0IGJyd19jb250ZXh0ICpicncsCisvLwkJCQkgc3RydWN0IGJyd193bV9wcm9nX2tleSAqa2V5ICkKKy8veworLy8gICBzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4ID0gJmJydy0+Y3R4OworLy8gICAvKiBCUldfTkVXX0ZSQUdNRU5UX1BST0dSQU0gKi8KKy8vICAgY29uc3Qgc3RydWN0IGJyd19mcmFnbWVudF9wcm9ncmFtICpmcCA9CisvLyAgICAgIChzdHJ1Y3QgYnJ3X2ZyYWdtZW50X3Byb2dyYW0gKilicnctPmZyYWdtZW50X3Byb2dyYW07CisvLyAgIGNvbnN0IHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nID0gKHN0cnVjdCBnbF9wcm9ncmFtICopIGJydy0+ZnJhZ21lbnRfcHJvZ3JhbTsKKy8vICAgR0x1aW50IGxvb2t1cCA9IDA7CisvLyAgIEdMdWludCBsaW5lX2FhOworLy8gICBib29sIHByb2dyYW1fdXNlc19kZmR5ID0gZnAtPnByb2dyYW0uVXNlc0RGZHk7CisvLyAgIGJvb2wgbXVsdGlzYW1wbGVfZmJvID0gY3R4LT5EcmF3QnVmZmVyLT5WaXN1YWwuc2FtcGxlcyA+IDE7CisKKy8vICAgbWVtc2V0KGtleSwgMCwgc2l6ZW9mKCprZXkpKTsKKworLy8gICAvKiBCdWlsZCB0aGUgaW5kZXggZm9yIHRhYmxlIGxvb2t1cAorLy8gICAgKi8KKy8vICAgaWYgKGJydy0+Z2VuIDwgNikgeworLy8gICAgICAvKiBfTkVXX0NPTE9SICovCisvLyAgICAgIGlmIChmcC0+cHJvZ3JhbS5Vc2VzS2lsbCB8fCBjdHgtPkNvbG9yLkFscGhhRW5hYmxlZCkKKy8vCSBsb29rdXAgfD0gSVpfUFNfS0lMTF9BTFBIQVRFU1RfQklUOworCisvLyAgICAgIGlmIChmcC0+cHJvZ3JhbS5CYXNlLk91dHB1dHNXcml0dGVuICYgQklURklFTEQ2NF9CSVQoRlJBR19SRVNVTFRfREVQVEgpKQorLy8JIGxvb2t1cCB8PSBJWl9QU19DT01QVVRFU19ERVBUSF9CSVQ7CisKKy8vICAgICAgLyogX05FV19ERVBUSCAqLworLy8gICAgICBpZiAoY3R4LT5EZXB0aC5UZXN0KQorLy8JIGxvb2t1cCB8PSBJWl9ERVBUSF9URVNUX0VOQUJMRV9CSVQ7CisKKy8vICAgICAgaWYgKGN0eC0+RGVwdGguVGVzdCAmJiBjdHgtPkRlcHRoLk1hc2spIC8qID8/ICovCisvLwkgbG9va3VwIHw9IElaX0RFUFRIX1dSSVRFX0VOQUJMRV9CSVQ7CisKKy8vICAgICAgLyogX05FV19TVEVOQ0lMIHwgX05FV19CVUZGRVJTICovCisvLyAgICAgIGlmIChjdHgtPlN0ZW5jaWwuX0VuYWJsZWQpIHsKKy8vCSBsb29rdXAgfD0gSVpfU1RFTkNJTF9URVNUX0VOQUJMRV9CSVQ7CisKKy8vCSBpZiAoY3R4LT5TdGVuY2lsLldyaXRlTWFza1swXSB8fAorLy8JICAgICBjdHgtPlN0ZW5jaWwuV3JpdGVNYXNrW2N0eC0+U3RlbmNpbC5fQmFja0ZhY2VdKQorLy8JICAgIGxvb2t1cCB8PSBJWl9TVEVOQ0lMX1dSSVRFX0VOQUJMRV9CSVQ7CisvLyAgICAgIH0KKy8vICAgICAga2V5LT5pel9sb29rdXAgPSBsb29rdXA7CisvLyAgIH0KKworLy8gICBsaW5lX2FhID0gQUFfTkVWRVI7CisKKy8vICAgLyogX05FV19MSU5FLCBfTkVXX1BPTFlHT04sIEJSV19ORVdfUkVEVUNFRF9QUklNSVRJVkUgKi8KKy8vICAgaWYgKGN0eC0+TGluZS5TbW9vdGhGbGFnKSB7CisvLyAgICAgIGlmIChicnctPnJlZHVjZWRfcHJpbWl0aXZlID09IEdMX0xJTkVTKSB7CisvLwkgbGluZV9hYSA9IEFBX0FMV0FZUzsKKy8vICAgICAgfQorLy8gICAgICBlbHNlIGlmIChicnctPnJlZHVjZWRfcHJpbWl0aXZlID09IEdMX1RSSUFOR0xFUykgeworLy8JIGlmIChjdHgtPlBvbHlnb24uRnJvbnRNb2RlID09IEdMX0xJTkUpIHsKKy8vCSAgICBsaW5lX2FhID0gQUFfU09NRVRJTUVTOworCisvLwkgICAgaWYgKGN0eC0+UG9seWdvbi5CYWNrTW9kZSA9PSBHTF9MSU5FIHx8CisvLwkJKGN0eC0+UG9seWdvbi5DdWxsRmxhZyAmJgorLy8JCSBjdHgtPlBvbHlnb24uQ3VsbEZhY2VNb2RlID09IEdMX0JBQ0spKQorLy8JICAgICAgIGxpbmVfYWEgPSBBQV9BTFdBWVM7CisvLwkgfQorLy8JIGVsc2UgaWYgKGN0eC0+UG9seWdvbi5CYWNrTW9kZSA9PSBHTF9MSU5FKSB7CisvLwkgICAgbGluZV9hYSA9IEFBX1NPTUVUSU1FUzsKKworLy8JICAgIGlmICgoY3R4LT5Qb2x5Z29uLkN1bGxGbGFnICYmCisvLwkJIGN0eC0+UG9seWdvbi5DdWxsRmFjZU1vZGUgPT0gR0xfRlJPTlQpKQorLy8JICAgICAgIGxpbmVfYWEgPSBBQV9BTFdBWVM7CisvLwkgfQorLy8gICAgICB9CisvLyAgIH0KKworLy8gICBrZXktPmxpbmVfYWEgPSBsaW5lX2FhOworCisvLyAgIC8qIF9ORVdfSElOVCAqLworLy8gICBpZiAoYnJ3LT5kaXNhYmxlX2Rlcml2YXRpdmVfb3B0aW1pemF0aW9uKSB7CisvLyAgICAgIGtleS0+aGlnaF9xdWFsaXR5X2Rlcml2YXRpdmVzID0KKy8vICAgICAgICAgY3R4LT5IaW50LkZyYWdtZW50U2hhZGVyRGVyaXZhdGl2ZSAhPSBHTF9GQVNURVNUOworLy8gICB9IGVsc2UgeworLy8gICAgICBrZXktPmhpZ2hfcXVhbGl0eV9kZXJpdmF0aXZlcyA9CisvLyAgICAgICAgIGN0eC0+SGludC5GcmFnbWVudFNoYWRlckRlcml2YXRpdmUgPT0gR0xfTklDRVNUOworLy8gICB9CisKKy8vICAgaWYgKGJydy0+Z2VuIDwgNikKKy8vICAgICAga2V5LT5zdGF0c193bSA9IGJydy0+c3RhdHNfd207CisKKy8vICAgLyogX05FV19MSUdIVCAqLworLy8gICBrZXktPmZsYXRfc2hhZGUgPSAoY3R4LT5MaWdodC5TaGFkZU1vZGVsID09IEdMX0ZMQVQpOworCisvLyAgIC8qIF9ORVdfRlJBR19DTEFNUCB8IF9ORVdfQlVGRkVSUyAqLworLy8gICBrZXktPmNsYW1wX2ZyYWdtZW50X2NvbG9yID0gY3R4LT5Db2xvci5fQ2xhbXBGcmFnbWVudENvbG9yOworCisvLyAgIC8qIF9ORVdfVEVYVFVSRSAqLworLy8gICBicndfcG9wdWxhdGVfc2FtcGxlcl9wcm9nX2tleV9kYXRhKGN0eCwgcHJvZywgYnJ3LT53bS5iYXNlLnNhbXBsZXJfY291bnQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleS0+dGV4KTsKKworLy8gICAvKiBfTkVXX0JVRkZFUlMgKi8KKy8vICAgLyoKKy8vICAgICogSW5jbHVkZSB0aGUgZHJhdyBidWZmZXIgb3JpZ2luIGFuZCBoZWlnaHQgc28gdGhhdCB3ZSBjYW4gY2FsY3VsYXRlCisvLyAgICAqIGZyYWdtZW50IHBvc2l0aW9uIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgYm90dG9tIGxlZnQgb2YgdGhlIGRyYXdhYmxlLAorLy8gICAgKiBmcm9tIHRoZSBpbmNvbWluZyBzY3JlZW4gb3JpZ2luIHJlbGF0aXZlIHBvc2l0aW9uIHdlIGdldCBhcyBwYXJ0IG9mIG91cgorLy8gICAgKiBwYXlsb2FkLgorLy8gICAgKgorLy8gICAgKiBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgV01fV1BPU1hZIG9wY29kZSB3aGVuIHRoZSBmcmFnbWVudCBwcm9ncmFtCisvLyAgICAqIHVzZXMgdGhlIGdsX0ZyYWdDb29yZCBpbnB1dC4KKy8vICAgICoKKy8vICAgICogV2UgY291bGQgYXZvaWQgcmVjb21waWxpbmcgYnkgaW5jbHVkaW5nIHRoaXMgYXMgYSBjb25zdGFudCByZWZlcmVuY2VkIGJ5CisvLyAgICAqIG91ciBwcm9ncmFtLCBidXQgaWYgd2Ugd2VyZSB0byBkbyB0aGF0IGl0IHdvdWxkIGFsc28gYmUgbmljZSB0byBoYW5kbGUKKy8vICAgICogZ2V0dGluZyB0aGF0IGNvbnN0YW50IHVwZGF0ZWQgYXQgYmF0Y2hidWZmZXIgc3VibWl0IHRpbWUgKHdoZW4gd2UKKy8vICAgICogaG9sZCB0aGUgbG9jayBhbmQga25vdyB3aGVyZSB0aGUgYnVmZmVyIHJlYWxseSBpcykgcmF0aGVyIHRoYW4gYXQgZW1pdAorLy8gICAgKiB0aW1lIHdoZW4gd2UgZG9uJ3QgaG9sZCB0aGUgbG9jayBhbmQgYXJlIGp1c3QgZ3Vlc3NpbmcuICBXZSBjb3VsZCBhbHNvCisvLyAgICAqIGp1c3QgYXZvaWQgdXNpbmcgdGhpcyBhcyBrZXkgZGF0YSBpZiB0aGUgcHJvZ3JhbSBkb2Vzbid0IHVzZQorLy8gICAgKiBmcmFnbWVudC5wb3NpdGlvbi4KKy8vICAgICoKKy8vICAgICogRm9yIERSSTIgdGhlIG9yaWdpbl94L3kgd2lsbCBhbHdheXMgYmUgKDAsMCkgYnV0IHdlIHN0aWxsIG5lZWQgdGhlCisvLyAgICAqIGRyYXdhYmxlIGhlaWdodCBpbiBvcmRlciB0byBpbnZlcnQgdGhlIFkgYXhpcy4KKy8vICAgICovCisvLyAgIGlmIChmcC0+cHJvZ3JhbS5CYXNlLklucHV0c1JlYWQgJiBWQVJZSU5HX0JJVF9QT1MpIHsKKy8vICAgICAga2V5LT5kcmF3YWJsZV9oZWlnaHQgPSBjdHgtPkRyYXdCdWZmZXItPkhlaWdodDsKKy8vICAgfQorCisvLyAgIGlmICgoZnAtPnByb2dyYW0uQmFzZS5JbnB1dHNSZWFkICYgVkFSWUlOR19CSVRfUE9TKSB8fCBwcm9ncmFtX3VzZXNfZGZkeSkgeworLy8gICAgICBrZXktPnJlbmRlcl90b19mYm8gPSBfbWVzYV9pc191c2VyX2ZibyhjdHgtPkRyYXdCdWZmZXIpOworLy8gICB9CisKKy8vICAgLyogX05FV19CVUZGRVJTICovCisvLyAgIGtleS0+bnJfY29sb3JfcmVnaW9ucyA9IGN0eC0+RHJhd0J1ZmZlci0+X051bUNvbG9yRHJhd0J1ZmZlcnM7CisKKy8vICAgLyogX05FV19NVUxUSVNBTVBMRSwgX05FV19DT0xPUiwgX05FV19CVUZGRVJTICovCisvLyAgIGtleS0+cmVwbGljYXRlX2FscGhhID0gY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA+IDEgJiYKKy8vICAgICAgKGN0eC0+TXVsdGlzYW1wbGUuU2FtcGxlQWxwaGFUb0NvdmVyYWdlIHx8IGN0eC0+Q29sb3IuQWxwaGFFbmFibGVkKTsKKworLy8gICAvKiBfTkVXX0JVRkZFUlMgX05FV19NVUxUSVNBTVBMRSAqLworLy8gICAvKiBJZ25vcmUgc2FtcGxlIHF1YWxpZmllciB3aGlsZSBjb21wdXRpbmcgdGhpcyBmbGFnLiAqLworLy8gICBrZXktPnBlcnNhbXBsZV9zaGFkaW5nID0KKy8vICAgICAgX21lc2FfZ2V0X21pbl9pbnZvY2F0aW9uc19wZXJfZnJhZ21lbnQoY3R4LCAmZnAtPnByb2dyYW0sIHRydWUpID4gMTsKKy8vICAgaWYgKGtleS0+cGVyc2FtcGxlX3NoYWRpbmcpCisvLyAgICAgIGtleS0+cGVyc2FtcGxlXzJ4ID0gY3R4LT5EcmF3QnVmZmVyLT5WaXN1YWwuc2FtcGxlcyA9PSAyOworCisvLyAgIGtleS0+Y29tcHV0ZV9wb3Nfb2Zmc2V0ID0KKy8vICAgICAgX21lc2FfZ2V0X21pbl9pbnZvY2F0aW9uc19wZXJfZnJhZ21lbnQoY3R4LCAmZnAtPnByb2dyYW0sIGZhbHNlKSA+IDEgJiYKKy8vICAgICAgZnAtPnByb2dyYW0uQmFzZS5TeXN0ZW1WYWx1ZXNSZWFkICYgU1lTVEVNX0JJVF9TQU1QTEVfUE9TOworCisvLyAgIGtleS0+Y29tcHV0ZV9zYW1wbGVfaWQgPQorLy8gICAgICBtdWx0aXNhbXBsZV9mYm8gJiYKKy8vICAgICAgY3R4LT5NdWx0aXNhbXBsZS5FbmFibGVkICYmCisvLyAgICAgIChmcC0+cHJvZ3JhbS5CYXNlLlN5c3RlbVZhbHVlc1JlYWQgJiBTWVNURU1fQklUX1NBTVBMRV9JRCk7CisKKy8vICAgLyogQlJXX05FV19WVUVfTUFQX0dFT01fT1VUICovCisvLyAgIGlmIChicnctPmdlbiA8IDYgfHwgX21lc2FfYml0Y291bnRfNjQoZnAtPnByb2dyYW0uQmFzZS5JbnB1dHNSZWFkICYKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUldfRlNfVkFSWUlOR19JTlBVVF9NQVNLKSA+IDE2KQorLy8gICAgICBrZXktPmlucHV0X3Nsb3RzX3ZhbGlkID0gYnJ3LT52dWVfbWFwX2dlb21fb3V0LnNsb3RzX3ZhbGlkOworCisKKy8vICAgLyogX05FV19DT0xPUiB8IF9ORVdfQlVGRkVSUyAqLworLy8gICAvKiBQcmUtZ2VuNiwgdGhlIGhhcmR3YXJlIGFscGhhIHRlc3QgYWx3YXlzIHVzZWQgZWFjaCByZW5kZXIKKy8vICAgICogdGFyZ2V0J3MgYWxwaGEgdG8gZG8gYWxwaGEgdGVzdCwgYXMgb3Bwb3NlZCB0byByZW5kZXIgdGFyZ2V0IDAncyBhbHBoYQorLy8gICAgKiBsaWtlIEdMIHJlcXVpcmVzLiAgRml4IHRoYXQgYnkgYnVpbGRpbmcgdGhlIGFscGhhIHRlc3QgaW50byB0aGUKKy8vICAgICogc2hhZGVyLCBhbmQgd2UnbGwgc2tpcCBlbmFibGluZyB0aGUgZml4ZWQgZnVuY3Rpb24gYWxwaGEgdGVzdC4KKy8vICAgICovCisvLyAgIGlmIChicnctPmdlbiA8IDYgJiYgY3R4LT5EcmF3QnVmZmVyLT5fTnVtQ29sb3JEcmF3QnVmZmVycyA+IDEgJiYgY3R4LT5Db2xvci5BbHBoYUVuYWJsZWQpIHsKKy8vICAgICAga2V5LT5hbHBoYV90ZXN0X2Z1bmMgPSBjdHgtPkNvbG9yLkFscGhhRnVuYzsKKy8vICAgICAga2V5LT5hbHBoYV90ZXN0X3JlZiA9IGN0eC0+Q29sb3IuQWxwaGFSZWY7CisvLyAgIH0KKworLy8gICAvKiBUaGUgdW5pcXVlIGZyYWdtZW50IHByb2dyYW0gSUQgKi8KKy8vICAga2V5LT5wcm9ncmFtX3N0cmluZ19pZCA9IGZwLT5pZDsKKy8vfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd193bS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2Jyd193bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTAyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3dtLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgQ29weXJpZ2h0IChDKSBJbnRlbCBDb3JwLiAgMjAwNi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgSW50ZWwgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvCisgZGV2ZWxvcCB0aGlzIDNEIGRyaXZlci4KKworIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKgorICAqIEF1dGhvcnM6CisgICogICBLZWl0aCBXaGl0d2VsbCA8a2VpdGh3QHZtd2FyZS5jb20+CisgICovCisKKworI2lmbmRlZiBCUldfV01fSAorI2RlZmluZSBCUldfV01fSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJicndfZXUuaCIKKyNpbmNsdWRlICJicndfcHJvZ3JhbS5oIgorCisvKiBBIGJpZyBsb29rdXAgdGFibGUgaXMgdXNlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGFuZCBob3cgbWFueQorICogYWRkaXRpb25hbCByZWdzIHdpbGwgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBtYWluIHBheWxvYWQgaW4gdGhlIFdNCisgKiBwcm9ncmFtIGV4ZWN1dGlvbi4gIFRoZXNlIG1haW5seSByZWxhdGUgdG8gZGVwdGggYW5kIHN0ZW5jaWwKKyAqIHByb2Nlc3NpbmcgYW5kIHRoZSBlYXJseS1kZXB0aC10ZXN0IG9wdGltaXphdGlvbi4KKyAqLworI2RlZmluZSBJWl9QU19LSUxMX0FMUEhBVEVTVF9CSVQgICAgMHgxCisjZGVmaW5lIElaX1BTX0NPTVBVVEVTX0RFUFRIX0JJVCAgICAweDIKKyNkZWZpbmUgSVpfREVQVEhfV1JJVEVfRU5BQkxFX0JJVCAgIDB4NAorI2RlZmluZSBJWl9ERVBUSF9URVNUX0VOQUJMRV9CSVQgICAgMHg4CisjZGVmaW5lIElaX1NURU5DSUxfV1JJVEVfRU5BQkxFX0JJVCAweDEwCisjZGVmaW5lIElaX1NURU5DSUxfVEVTVF9FTkFCTEVfQklUICAweDIwCisjZGVmaW5lIElaX0JJVF9NQVggICAgICAgICAgICAgICAgICAweDQwCisKKyNkZWZpbmUgQUFfTkVWRVIgICAgIDAKKyNkZWZpbmUgQUFfU09NRVRJTUVTIDEKKyNkZWZpbmUgQUFfQUxXQVlTICAgIDIKKworc3RydWN0IGJyd193bV9wcm9nX2tleSB7CisgICB1aW50OF90IGl6X2xvb2t1cDsKKyAgIEdMdWludCBzdGF0c193bToxOworICAgR0x1aW50IGZsYXRfc2hhZGU6MTsKKyAgIEdMdWludCBwZXJzYW1wbGVfc2hhZGluZzoxOworICAgR0x1aW50IHBlcnNhbXBsZV8yeDoxOworICAgR0x1aW50IG5yX2NvbG9yX3JlZ2lvbnM6NTsKKyAgIEdMdWludCByZXBsaWNhdGVfYWxwaGE6MTsKKyAgIEdMdWludCByZW5kZXJfdG9fZmJvOjE7CisgICBHTHVpbnQgY2xhbXBfZnJhZ21lbnRfY29sb3I6MTsKKyAgIEdMdWludCBjb21wdXRlX3Bvc19vZmZzZXQ6MTsKKyAgIEdMdWludCBjb21wdXRlX3NhbXBsZV9pZDoxOworICAgR0x1aW50IGxpbmVfYWE6MjsKKyAgIEdMdWludCBoaWdoX3F1YWxpdHlfZGVyaXZhdGl2ZXM6MTsKKworICAgR0x1c2hvcnQgZHJhd2FibGVfaGVpZ2h0OworICAgR0xiaXRmaWVsZDY0IGlucHV0X3Nsb3RzX3ZhbGlkOworICAgR0x1aW50IHByb2dyYW1fc3RyaW5nX2lkOjMyOworICAgR0xlbnVtIGFscGhhX3Rlc3RfZnVuYzsgICAgICAgICAgLyogPCBGb3IgR2VuNC81IE1SVCBhbHBoYSB0ZXN0ICovCisgICBmbG9hdCBhbHBoYV90ZXN0X3JlZjsKKworICAgc3RydWN0IGJyd19zYW1wbGVyX3Byb2dfa2V5X2RhdGEgdGV4OworfTsKKworc3RydWN0IGJyd193bV9jb21waWxlIHsKKyAgIHN0cnVjdCBicndfd21fcHJvZ19rZXkga2V5OworICAgc3RydWN0IGJyd193bV9wcm9nX2RhdGEgcHJvZ19kYXRhOworCisgICB1aW50OF90IHNvdXJjZV9kZXB0aF9yZWc7CisgICB1aW50OF90IHNvdXJjZV93X3JlZzsKKyAgIHVpbnQ4X3QgYWFfZGVzdF9zdGVuY2lsX3JlZzsKKyAgIHVpbnQ4X3QgZGVzdF9kZXB0aF9yZWc7CisgICB1aW50OF90IHNhbXBsZV9wb3NfcmVnOworICAgdWludDhfdCBzYW1wbGVfbWFza19yZWc7CisgICB1aW50OF90IGJhcnljZW50cmljX2Nvb3JkX3JlZ1tCUldfV01fQkFSWUNFTlRSSUNfSU5URVJQX01PREVfQ09VTlRdOworICAgdWludDhfdCBucl9wYXlsb2FkX3JlZ3M7CisgICBHTHVpbnQgc291cmNlX2RlcHRoX3RvX3JlbmRlcl90YXJnZXQ6MTsKKyAgIEdMdWludCBydW50aW1lX2NoZWNrX2FhZHNfZW1pdDoxOworCisgICBHTHVpbnQgbGFzdF9zY3JhdGNoOworCisgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoYWRlcl9wcm9nOworICAgc3RydWN0IGJyd19mcmFnbWVudF9wcm9ncmFtICpmcDsKKworICAgY29uc3QgdW5zaWduZWQgKnByb2dyYW07CisgICB1bnNpZ25lZCBwcm9ncmFtX3NpemU7Cit9OworCitzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKgorYnJ3X3dtX2luaXRfY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKwkJICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJICAgIHN0cnVjdCBicndfZnJhZ21lbnRfcHJvZ3JhbSAqZnAsCisJCSAgICBjb25zdCBzdHJ1Y3QgYnJ3X3dtX3Byb2dfa2V5ICprZXkpOworCitib29sCiticndfd21fZG9fY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfd21fY29tcGlsZSAqYyk7CisKK3ZvaWQKK2Jyd193bV91cGxvYWRfY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnJ3X3dtX2NvbXBpbGUgKmMpOworCit2b2lkCiticndfd21fY2xlYXJfY29tcGlsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfd21fY29tcGlsZSAqYyk7CisKKy8qKgorICogQ29tcGlsZSBhIGZyYWdtZW50IHNoYWRlci4KKyAqCisgKiBSZXR1cm5zIHRoZSBmaW5hbCBhc3NlbWJseSBhbmQgdGhlIHByb2dyYW0ncyBzaXplLgorICovCitjb25zdCB1bnNpZ25lZCAqYnJ3X3dtX2ZzX2VtaXQoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd193bV9jb21waWxlICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9mcmFnbWVudF9wcm9ncmFtICpmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmZpbmFsX2Fzc2VtYmx5X3NpemUpOworCit2b2lkIGJyd19ub3RpZnlfbGlua19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKKy8vIEx1bmFyRyA6IFRPRE8gLSBmaW5kIGEgd2F5IHRvIGNhbGwgdGhlc2UgYXMgdGhleSB3ZXJlCisvL0dMYm9vbGVhbiBicndfbGlua19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKK3N0cnVjdCBnbF9zaGFkZXIgKmJyd19uZXdfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMdWludCBuYW1lLCBHTHVpbnQgdHlwZSk7CisvLyBMdW5hckcgOiBUT0RPIC0gZmluZCBhIHdheSB0byBjYWxsIHRoZXNlIGFzIHRoZXkgd2VyZQorLy9zdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKmJyd19uZXdfc2hhZGVyX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUpOworCitib29sIGJyd19jb2xvcl9idWZmZXJfd3JpdGVfZW5hYmxlZChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyk7Cit2b2lkIGJyd193bV9kZWJ1Z19yZWNvbXBpbGUoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBicndfd21fcHJvZ19rZXkgKmtleSk7Citib29sIGJyd193bV9wcm9nX2RhdGFfY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvZ2VuOF9nZW5lcmF0b3IuaCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9nZW44X2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDQ4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvZ2VuOF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogQGZpbGUgZ2VuOF9nZW5lcmF0b3IuaAorICoKKyAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgR2VuOCsgaGFyZHdhcmUsIHJlcGxhY2luZyB0aGUgYnJ3X2V1X2VtaXQuYyBsYXllci4KKyAqLworCisjcHJhZ21hIG9uY2UKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKK30gLyogZXh0ZXJuICJDIiAqLworCisjaW5jbHVkZSAiZ2VuOF9pbnN0cnVjdGlvbi5oIgorCitjbGFzcyBnZW44X2dlbmVyYXRvciB7CitwdWJsaWM6CisgICBnZW44X2dlbmVyYXRvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2csCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgIHZvaWQgKm1lbV9jdHgpOworICAgfmdlbjhfZ2VuZXJhdG9yKCk7CisKKyAgIC8qKgorICAgICogSW5zdHJ1Y3Rpb24gZW1pdHRlcnMuCisgICAgKiBAeworICAgICovCisgICAjZGVmaW5lIEFMVTEoT1ApIFwKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKk9QKHN0cnVjdCBicndfcmVnIGRzdCwgc3RydWN0IGJyd19yZWcgc3JjKTsKKyAgICNkZWZpbmUgQUxVMihPUCkgXAorICAgZ2VuOF9pbnN0cnVjdGlvbiAqT1Aoc3RydWN0IGJyd19yZWcgZCwgc3RydWN0IGJyd19yZWcsIHN0cnVjdCBicndfcmVnKTsKKyAgICNkZWZpbmUgQUxVMyhPUCkgXAorICAgZ2VuOF9pbnN0cnVjdGlvbiAqT1Aoc3RydWN0IGJyd19yZWcgZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcsIHN0cnVjdCBicndfcmVnLCBzdHJ1Y3QgYnJ3X3JlZyk7CisgICBBTFUyKEFERCkKKyAgIEFMVTIoQU5EKQorICAgQUxVMihBU1IpCisgICBBTFUzKEJGRSkKKyAgIEFMVTIoQkZJMSkKKyAgIEFMVTMoQkZJMikKKyAgIEFMVTEoRjMyVE8xNikKKyAgIEFMVTEoRjE2VE8zMikKKyAgIEFMVTEoQkZSRVYpCisgICBBTFUxKENCSVQpCisgICBBTFUyKEFEREMpCisgICBBTFUyKFNVQkIpCisgICBBTFUyKERQMikKKyAgIEFMVTIoRFAzKQorICAgQUxVMihEUDQpCisgICBBTFUyKERQSCkKKyAgIEFMVTEoRkJIKQorICAgQUxVMShGQkwpCisgICBBTFUxKEZSQykKKyAgIEFMVTIoTElORSkKKyAgIEFMVTMoTFJQKQorICAgQUxVMihNQUMpCisgICBBTFUyKE1BQ0gpCisgICBBTFUzKE1BRCkKKyAgIEFMVTIoTVVMKQorICAgQUxVMShNT1YpCisgICBBTFUxKE1PVl9SQVcpCisgICBBTFUxKE5PVCkKKyAgIEFMVTIoT1IpCisgICBBTFUyKFBMTikKKyAgIEFMVTEoUk5ERCkKKyAgIEFMVTEoUk5ERSkKKyAgIEFMVTEoUk5EWikKKyAgIEFMVTIoU0VMKQorICAgQUxVMihTSEwpCisgICBBTFUyKFNIUikKKyAgIEFMVTIoWE9SKQorICAgI3VuZGVmIEFMVTEKKyAgICN1bmRlZiBBTFUyCisgICAjdW5kZWYgQUxVMworCisgICBnZW44X2luc3RydWN0aW9uICpDTVAoc3RydWN0IGJyd19yZWcgZHN0LCB1bnNpZ25lZCBjb25kaXRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLCBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKTsKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKklGKHVuc2lnbmVkIHByZWRpY2F0ZSk7CisgICBnZW44X2luc3RydWN0aW9uICpFTFNFKCk7CisgICBnZW44X2luc3RydWN0aW9uICpFTkRJRigpOworICAgdm9pZCBETygpOworICAgZ2VuOF9pbnN0cnVjdGlvbiAqQlJFQUsoKTsKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKkNPTlRJTlVFKCk7CisgICBnZW44X2luc3RydWN0aW9uICpXSElMRSgpOworCisgICBnZW44X2luc3RydWN0aW9uICpIQUxUKCk7CisKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKk1BVEgodW5zaWduZWQgbWF0aF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwKTsKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKk1BVEgodW5zaWduZWQgbWF0aF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKTsKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKk5PUCgpOworICAgLyoqIEB9ICovCisKKyAgIHZvaWQgZGlzYXNzZW1ibGUoRklMRSAqb3V0LCBpbnQgc3RhcnQsIGludCBlbmQpOworCitwcm90ZWN0ZWQ6CisgICBnZW44X2luc3RydWN0aW9uICphbHUzKHVuc2lnbmVkIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMyKTsKKworICAgZ2VuOF9pbnN0cnVjdGlvbiAqbWF0aCh1bnNpZ25lZCBtYXRoX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYzApOworCisgICBnZW44X2luc3RydWN0aW9uICpuZXh0X2luc3QodW5zaWduZWQgb3Bjb2RlKTsKKworICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZzsKKyAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nOworCisgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydzsKKyAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICppbnRlbDsKKyAgIHN0cnVjdCBnbF9jb250ZXh0ICpjdHg7CisKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKnN0b3JlOworICAgdW5zaWduZWQgc3RvcmVfc2l6ZTsKKyAgIHVuc2lnbmVkIG5yX2luc3Q7CisgICB1bnNpZ25lZCBuZXh0X2luc3Rfb2Zmc2V0OworCisgICAvKioKKyAgICAqIENvbnRyb2wgZmxvdyBzdGFja3M6CisgICAgKgorICAgICogaWZfc3RhY2sgY29udGFpbnMgSUYgYW5kIEVMU0UgaW5zdHJ1Y3Rpb25zIHdoaWNoIG11c3QgYmUgcGF0Y2hlZCB3aXRoCisgICAgKiB0aGUgZmluYWwganVtcCBvZmZzZXRzIChhbmQgcG9wcGVkKSBvbmNlIHRoZSBtYXRjaGluZyBFTkRJRiBpcyBlbmNvdW50ZXJlZC4KKyAgICAqCisgICAgKiBXZSBhY3R1YWxseSBzdG9yZSBhbiBhcnJheSBpbmRleCBpbnRvIHRoZSBzdG9yZSwgcmF0aGVyIHRoYW4gcG9pbnRlcnMKKyAgICAqIHRvIHRoZSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSB3ZSBtYXkgcmVhbGxvYyB0aGUgc3RvcmUuCisgICAgKgorICAgICogIEB7CisgICAgKi8KKyAgIGludCAqaWZfc3RhY2s7CisgICBpbnQgaWZfc3RhY2tfZGVwdGg7CisgICBpbnQgaWZfc3RhY2tfYXJyYXlfc2l6ZTsKKworICAgaW50ICpsb29wX3N0YWNrOworICAgaW50IGxvb3Bfc3RhY2tfZGVwdGg7CisgICBpbnQgbG9vcF9zdGFja19hcnJheV9zaXplOworCisgICBpbnQgaWZfZGVwdGhfaW5fbG9vcDsKKworICAgdm9pZCBwdXNoX2lmX3N0YWNrKGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QpOworICAgZ2VuOF9pbnN0cnVjdGlvbiAqcG9wX2lmX3N0YWNrKCk7CisgICAvKiogQH0gKi8KKworICAgdm9pZCBwYXRjaF9JRl9FTFNFKGdlbjhfaW5zdHJ1Y3Rpb24gKmlmX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgZ2VuOF9pbnN0cnVjdGlvbiAqZWxzZV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgIGdlbjhfaW5zdHJ1Y3Rpb24gKmVuZGlmX2luc3QpOworCisgICB1bnNpZ25lZCBuZXh0X2lwKHVuc2lnbmVkIGlwKSBjb25zdDsKKyAgIHVuc2lnbmVkIGZpbmRfbmV4dF9ibG9ja19lbmQodW5zaWduZWQgc3RhcnRfaXApIGNvbnN0OworICAgdW5zaWduZWQgZmluZF9sb29wX2VuZCh1bnNpZ25lZCBzdGFydCkgY29uc3Q7CisKKyAgIHZvaWQgcGF0Y2hfanVtcF90YXJnZXRzKCk7CisKKyAgIC8qKgorICAgICogRGVmYXVsdCBzdGF0ZSBmb3IgbmV3IGluc3RydWN0aW9ucy4KKyAgICAqLworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIGV4ZWNfc2l6ZTsKKyAgICAgIHVuc2lnbmVkIGFjY2Vzc19tb2RlOworICAgICAgdW5zaWduZWQgbWFza19jb250cm9sOworICAgICAgdW5zaWduZWQgcXRyX2NvbnRyb2w7CisgICAgICB1bnNpZ25lZCBmbGFnX3N1YnJlZ19ucjsKKyAgICAgIHVuc2lnbmVkIGNvbmRpdGlvbmFsX21vZDsKKyAgICAgIHVuc2lnbmVkIHByZWRpY2F0ZTsKKyAgICAgIGJvb2wgcHJlZGljYXRlX2ludmVyc2U7CisgICAgICBib29sIHNhdHVyYXRlOworICAgfSBkZWZhdWx0X3N0YXRlOworCisgICB2b2lkICptZW1fY3R4OworfTsKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9nZW44X2luc3RydWN0aW9uLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvZ2VuOF9pbnN0cnVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjIzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvZ2VuOF9pbnN0cnVjdGlvbi5oCkBAIC0wLDAgKzEsNDIyIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBAZmlsZSBnZW44X2luc3RydWN0aW9uLmgKKyAqCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgR2VuOCsgRVUgaW5zdHJ1Y3Rpb24sIHdpdGggaGVscGVyIG1ldGhvZHMgdG8gZ2V0CisgKiBhbmQgc2V0IHZhcmlvdXMgZmllbGRzLiAgVGhpcyBpcyB0aGUgYWN0dWFsIGhhcmR3YXJlIGZvcm1hdC4KKyAqLworCisjaWZuZGVmIEdFTjhfSU5TVFJVQ1RJT05fSAorI2RlZmluZSBHRU44X0lOU1RSVUNUSU9OX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJicndfY29udGV4dC5oIgorI2luY2x1ZGUgImJyd19yZWcuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiB7CisgICB1aW50MzJfdCBkYXRhWzRdOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZW44X2luc3RydWN0aW9uX2JpdHMoc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG93KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW44X2luc3RydWN0aW9uX3NldF9iaXRzKHN0cnVjdCBnZW44X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbHVlKTsKKworI2RlZmluZSBGKG5hbWUsIGhpZ2gsIGxvdykgXAorc3RhdGljIGlubGluZSB2b2lkIGdlbjhfc2V0XyMjbmFtZShzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCwgdW5zaWduZWQgdikgXAoreyBcCisgICBnZW44X2luc3RydWN0aW9uX3NldF9iaXRzKGluc3QsIGhpZ2gsIGxvdywgdik7IFwKK30gXAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZW44XyMjbmFtZShzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCkgXAoreyBcCisgICByZXR1cm4gZ2VuOF9pbnN0cnVjdGlvbl9iaXRzKGluc3QsIGhpZ2gsIGxvdyk7IFwKK30KKworRihzcmMxX3ZlcnRfc3RyaWRlLCAgICAxMjAsIDExNykKK0Yoc3JjMV9kYTFfd2lkdGgsICAgICAgMTE2LCAxMTQpCitGKHNyYzFfZGExNl9zd2l6X3csICAgIDExNSwgMTE0KQorRihzcmMxX2RhMTZfc3dpel96LCAgICAxMTMsIDExMikKK0Yoc3JjMV9kYTFfaHN0cmlkZSwgICAgMTEzLCAxMTIpCitGKHNyYzFfYWRkcmVzc19tb2RlLCAgIDExMSwgMTExKQorLyoqIFNyYzEuU3JjTW9kIEB7ICovCitGKHNyYzFfbmVnYXRlLCAgICAgICAgIDExMCwgMTEwKQorRihzcmMxX2FicywgICAgICAgICAgICAxMDksIDEwOSkKKy8qKiBAfSAqLworRihzcmMxX2lhMV9zdWJyZWdfbnIsICAxMDgsIDEwNSkKK0Yoc3JjMV9kYV9yZWdfbnIsICAgICAgMTA4LCAxMDEpCitGKHNyYzFfZGExNl9zdWJyZWdfbnIsIDEwMCwgMTAwKQorRihzcmMxX2RhMV9zdWJyZWdfbnIsICAxMDAsICA5NikKK0Yoc3JjMV9kYTE2X3N3aXpfeSwgICAgIDk5LCAgOTgpCitGKHNyYzFfZGExNl9zd2l6X3gsICAgICA5NywgIDk2KQorRihzcmMxX3JlZ190eXBlLCAgICAgICAgOTQsICA5MSkKK0Yoc3JjMV9yZWdfZmlsZSwgICAgICAgIDkwLCAgODkpCitGKHNyYzBfdmVydF9zdHJpZGUsICAgICA4OCwgIDg1KQorRihzcmMwX2RhMV93aWR0aCwgICAgICAgODQsICA4MikKK0Yoc3JjMF9kYTE2X3N3aXpfdywgICAgIDgzLCAgODIpCitGKHNyYzBfZGExNl9zd2l6X3osICAgICA4MSwgIDgwKQorRihzcmMwX2RhMV9oc3RyaWRlLCAgICAgODEsICA4MCkKK0Yoc3JjMF9hZGRyZXNzX21vZGUsICAgIDc5LCAgNzkpCisvKiogU3JjMC5TcmNNb2QgQHsgKi8KK0Yoc3JjMF9uZWdhdGUsICAgICAgICAgIDc4LCAgNzgpCitGKHNyYzBfYWJzLCAgICAgICAgICAgICA3NywgIDc3KQorLyoqIEB9ICovCitGKHNyYzBfaWExX3N1YnJlZ19uciwgICA3NiwgIDczKQorRihzcmMwX2RhX3JlZ19uciwgICAgICAgNzYsICA2OSkKK0Yoc3JjMF9kYTE2X3N1YnJlZ19uciwgIDY4LCAgNjgpCitGKHNyYzBfZGExX3N1YnJlZ19uciwgICA2OCwgIDY0KQorRihzcmMwX2RhMTZfc3dpel95LCAgICAgNjcsICA2NikKK0Yoc3JjMF9kYTE2X3N3aXpfeCwgICAgIDY1LCAgNjQpCitGKGRzdF9hZGRyZXNzX21vZGUsICAgICA2MywgIDYzKQorRihkc3RfZGExX2hzdHJpZGUsICAgICAgNjIsICA2MSkKK0YoZHN0X2lhMV9zdWJyZWdfbnIsICAgIDYwLCAgNTcpCitGKGRzdF9kYV9yZWdfbnIsICAgICAgICA2MCwgIDUzKQorRihkc3RfZGExNl9zdWJyZWdfbnIsICAgNTIsICA1MikKK0YoZHN0X2RhMV9zdWJyZWdfbnIsICAgIDUyLCAgNDgpCitGKGRhMTZfd3JpdGVtYXNrLCAgICAgICA1MSwgIDQ4KSAvKiBEc3QuQ2hhbkVuICovCitGKHNyYzBfcmVnX3R5cGUsICAgICAgICA0NiwgIDQzKQorRihzcmMwX3JlZ19maWxlLCAgICAgICAgNDIsICA0MSkKK0YoZHN0X3JlZ190eXBlLCAgICAgICAgIDQwLCAgMzcpCitGKGRzdF9yZWdfZmlsZSwgICAgICAgICAzNiwgIDM1KQorRihtYXNrX2NvbnRyb2wsICAgICAgICAgMzQsICAzNCkKK0YoZmxhZ19yZWdfbnIsICAgICAgICAgIDMzLCAgMzMpCitGKGZsYWdfc3VicmVnX25yLCAgICAgICAzMiwgIDMyKQorRihzYXR1cmF0ZSwgICAgICAgICAgICAgMzEsICAzMSkKK0YoYnJhbmNoX2NvbnRyb2wsICAgICAgIDMwLCAgMzApCitGKGRlYnVnX2NvbnRyb2wsICAgICAgICAzMCwgIDMwKQorRihjbXB0X2NvbnRyb2wsICAgICAgICAgMjksICAyOSkKK0YoYWNjX3dyX2NvbnRyb2wsICAgICAgIDI4LCAgMjgpCitGKGNvbmRfbW9kaWZpZXIsICAgICAgICAyNywgIDI0KQorRihleGVjX3NpemUsICAgICAgICAgICAgMjMsICAyMSkKK0YocHJlZF9pbnYsICAgICAgICAgICAgIDIwLCAgMjApCitGKHByZWRfY29udHJvbCwgICAgICAgICAxOSwgIDE2KQorRih0aHJlYWRfY29udHJvbCwgICAgICAgMTUsICAxNCkKK0YocXRyX2NvbnRyb2wsICAgICAgICAgIDEzLCAgMTIpCitGKG5pYl9jb250cm9sLCAgICAgICAgICAxMSwgIDExKQorRihub19kZF9jaGVjaywgICAgICAgICAgMTAsICAxMCkKK0Yobm9fZGRfY2xlYXIsICAgICAgICAgICA5LCAgIDkpCitGKGFjY2Vzc19tb2RlLCAgICAgICAgICAgOCwgICA4KQorLyogQml0IDcgaXMgUmVzZXJ2ZWQgKGZvciBmdXR1cmUgT3Bjb2RlIGV4cGFuc2lvbikgKi8KK0Yob3Bjb2RlLCAgICAgICAgICAgICAgICA2LCAgIDApCisKKy8qKgorICogVGhyZWUtc291cmNlIGluc3RydWN0aW9uczoKKyAqICBAeworICovCitGKHNyYzJfM3NyY19yZWdfbnIsICAgIDEyNSwgMTE4KQorRihzcmMyXzNzcmNfc3VicmVnX25yLCAxMTcsIDExNSkKK0Yoc3JjMl8zc3JjX3N3aXp6bGUsICAgMTE0LCAxMDcpCitGKHNyYzJfM3NyY19yZXBfY3RybCwgIDEwNiwgMTA2KQorRihzcmMxXzNzcmNfcmVnX25yLCAgICAxMDQsICA5NykKKy8qIHNyYzFfM3NyY19zdWJyZWdfbnIgc3BhbnMgd29yZCBib3VuZGFyaWVzIGFuZCBoYXMgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHkgKi8KK0Yoc3JjMV8zc3JjX3N3aXp6bGUsICAgIDkzLCAgODYpCitGKHNyYzFfM3NyY19yZXBfY3RybCwgICA4NSwgIDg1KQorRihzcmMwXzNzcmNfcmVnX25yLCAgICAgODMsICA3NikKK0Yoc3JjMF8zc3JjX3N1YnJlZ19uciwgIDc1LCAgNzMpCitGKHNyYzBfM3NyY19zd2l6emxlLCAgICA3MiwgIDY1KQorRihzcmMwXzNzcmNfcmVwX2N0cmwsICAgNjQsICA2NCkKK0YoZHN0XzNzcmNfcmVnX25yLCAgICAgIDYzLCAgNTYpCitGKGRzdF8zc3JjX3N1YnJlZ19uciwgICA1NSwgIDUzKQorRihkc3RfM3NyY193cml0ZW1hc2ssICAgNTIsICA0OSkKK0YoZHN0XzNzcmNfdHlwZSwgICAgICAgIDQ4LCAgNDYpCitGKHNyY18zc3JjX3R5cGUsICAgICAgICA0NSwgIDQzKQorRihzcmMyXzNzcmNfbmVnYXRlLCAgICAgNDIsICA0MikKK0Yoc3JjMl8zc3JjX2FicywgICAgICAgIDQxLCAgNDEpCitGKHNyYzFfM3NyY19uZWdhdGUsICAgICA0MCwgIDQwKQorRihzcmMxXzNzcmNfYWJzLCAgICAgICAgMzksICAzOSkKK0Yoc3JjMF8zc3JjX25lZ2F0ZSwgICAgIDM4LCAgMzgpCitGKHNyYzBfM3NyY19hYnMsICAgICAgICAzNywgIDM3KQorLyoqIEB9ICovCisKKy8qKgorICogRmllbGRzIGZvciBTRU5EIG1lc3NhZ2VzOgorICogIEB7CisgKi8KK0YoZW90LCAgICAgICAgICAgICAgICAgMTI3LCAxMjcpCitGKG1sZW4sICAgICAgICAgICAgICAgIDEyNCwgMTIxKQorRihybGVuLCAgICAgICAgICAgICAgICAxMjAsIDExNikKK0YoaGVhZGVyX3ByZXNlbnQsICAgICAgMTE1LCAxMTUpCitGKGZ1bmN0aW9uX2NvbnRyb2wsICAgIDExNCwgIDk2KQorRihzZmlkLCAgICAgICAgICAgICAgICAgMjcsICAyNCkKK0YobWF0aF9mdW5jdGlvbiwgICAgICAgIDI3LCAgMjQpCisvKiogQH0gKi8KKworLyoqCisgKiBVUkIgbWVzc2FnZSBmdW5jdGlvbiBjb250cm9sIGJpdHM6CisgKiAgQHsKKyAqLworRih1cmJfcGVyX3Nsb3Rfb2Zmc2V0LCAxMTMsIDExMykKK0YodXJiX2ludGVybGVhdmUsICAgICAgMTExLCAxMTEpCitGKHVyYl9nbG9iYWxfb2Zmc2V0LCAgIDExMCwgMTAwKQorRih1cmJfb3Bjb2RlLCAgICAgICAgICAgOTksICA5NikKKy8qKiBAfSAqLworCisvKiBNZXNzYWdlIGRlc2NyaXB0b3IgYml0cyAqLworI2RlZmluZSBNRChuYW1lLCBoaWdoLCBsb3cpIEYobmFtZSwgKGhpZ2ggKyA5NiksIChsb3cgKyA5NikpCisKKy8qKgorICogU2FtcGxlciBtZXNzYWdlIGZ1bmN0aW9uIGNvbnRyb2wgYml0czoKKyAqICBAeworICovCitNRChzYW1wbGVyX3NpbWRfbW9kZSwgICAxOCwgIDE3KQorTUQoc2FtcGxlcl9tc2dfdHlwZSwgICAgMTYsICAxMikKK01EKHNhbXBsZXIsICAgICAgICAgICAgIDExLCAgIDgpCitNRChiaW5kaW5nX3RhYmxlX2luZGV4LCAgNywgICAwKSAvKiBhbHNvIHVzZWQgYnkgb3RoZXIgbWVzc2FnZXMgKi8KKy8qKiBAfSAqLworCisvKioKKyAqIERhdGEgcG9ydCBtZXNzYWdlIGZ1bmN0aW9uIGNvbnRyb2wgYml0czoKKyAqICBAeworICovCitNRChkcF9jYXRlZ29yeSwgICAgICAgICAxOCwgIDE4KQorTUQoZHBfbWVzc2FnZV90eXBlLCAgICAgMTcsICAxNCkKK01EKGRwX21lc3NhZ2VfY29udHJvbCwgIDEzLCAgIDgpCisvKiogQH0gKi8KKworLyoqCisgKiBTY3JhdGNoIG1lc3NhZ2UgYml0czoKKyAqICBAeworICovCitNRChzY3JhdGNoX3JlYWRfd3JpdGUsICAxNywgIDE3KSAvKiAwID0gcmVhZCwgIDEgPSB3cml0ZSAqLworTUQoc2NyYXRjaF90eXBlLCAgICAgICAgMTYsICAxNikgLyogMCA9IE9Xb3JkLCAxID0gRFdvcmQgKi8KK01EKHNjcmF0Y2hfaW52YWxpZGF0ZV9hZnRlcl9yZWFkLCAxNSwgMTUpCitNRChzY3JhdGNoX2Jsb2NrX3NpemUsICAxMywgIDEyKQorTUQoc2NyYXRjaF9hZGRyX29mZnNldCwgMTEsICAgMCkKKy8qKiBAfSAqLworCisvKioKKyAqIFJlbmRlciBUYXJnZXQgbWVzc2FnZSBmdW5jdGlvbiBjb250cm9sIGJpdHM6CisgKiAgQHsKKyAqLworTUQocnRfbGFzdCwgICAgICAgICAgICAgMTIsICAxMikKK01EKHJ0X3Nsb3RfZ3JvdXAsICAgICAgIDExLCAgMTEpCitNRChydF9tZXNzYWdlX3R5cGUsICAgICAxMCwgICA4KQorLyoqIEB9ICovCisKKy8qKgorICogVGhyZWFkIFNwYXduIG1lc3NhZ2UgZnVuY3Rpb24gY29udHJvbCBiaXRzOgorICogIEB7CisgKi8KK01EKHRzX3Jlc291cmNlX3NlbGVjdCwgICA0LCAgIDQpCitNRCh0c19yZXF1ZXN0X3R5cGUsICAgICAgMSwgICAxKQorTUQodHNfb3Bjb2RlLCAgICAgICAgICAgIDAsICAgMCkKKy8qKiBAfSAqLworCisvKioKKyAqIFZpZGVvIE1vdGlvbiBFc3RpbWF0aW9uIG1lc3NhZ2UgZnVuY3Rpb24gY29udHJvbCBiaXRzOgorICogIEB7CisgKi8KK0Yodm1lX21lc3NhZ2VfdHlwZSwgICAgIDE0LCAgMTMpCisvKiogQH0gKi8KKworLyoqCisgKiBDaGVjayAmIFJlZmluZW1lbnQgRW5naW5lIG1lc3NhZ2UgZnVuY3Rpb24gY29udHJvbCBiaXRzOgorICogIEB7CisgKi8KK0YoY3JlX21lc3NhZ2VfdHlwZSwgICAgIDE0LCAgMTMpCisvKiogQH0gKi8KKworI3VuZGVmIE1ECisjdW5kZWYgRgorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dlbjhfc2V0X3NyYzFfM3NyY19zdWJyZWdfbnIoc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QsIHVuc2lnbmVkIHYpCit7CisgICBhc3NlcnQoKHYgJiB+MHg3KSA9PSAwKTsKKworICAgZ2VuOF9pbnN0cnVjdGlvbl9zZXRfYml0cyhpbnN0LCA5NSwgOTQsIHYgJiAweDMpOworICAgZ2VuOF9pbnN0cnVjdGlvbl9zZXRfYml0cyhpbnN0LCA5NiwgOTYsIHYgPj4gMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2dlbjhfc3JjMV8zc3JjX3N1YnJlZ19ucihzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgIHJldHVybiBnZW44X2luc3RydWN0aW9uX2JpdHMoaW5zdCwgOTUsIDk0KSB8CisgICAgICAgICAgKGdlbjhfaW5zdHJ1Y3Rpb25fYml0cyhpbnN0LCA5NiwgOTYpIDw8IDIpOworfQorCisjZGVmaW5lIEdFTjhfSUExX0FERFJfSU1NKHJlZywgbmluZSwgaGlnaCwgbG93KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ2VuOF9zZXRfIyNyZWcjI19pYTFfYWRkcl9pbW0oc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QsIHVuc2lnbmVkIHZhbHVlKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGFzc2VydCgodmFsdWUgJiB+MHgzZmYpID09IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZ2VuOF9pbnN0cnVjdGlvbl9zZXRfYml0cyhpbnN0LCBoaWdoLCBsb3csIHZhbHVlICYgMHgxZmYpOyAgICAgICAgICAgICAgICBcCisgICBnZW44X2luc3RydWN0aW9uX3NldF9iaXRzKGluc3QsIG5pbmUsIG5pbmUsIHZhbHVlID4+IDkpOyAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2dlbjhfIyNyZWcjI19pYTFfYWRkcl9pbW0oc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QpICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICByZXR1cm4gZ2VuOF9pbnN0cnVjdGlvbl9iaXRzKGluc3QsIGhpZ2gsIGxvdykgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoZ2VuOF9pbnN0cnVjdGlvbl9iaXRzKGluc3QsIG5pbmUsIG5pbmUpIDw8IDkpOyAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiBBZGRySW1tWzk6MF0gZm9yIEFsaWduMSBJbmRpcmVjdCBBZGRyZXNzaW5nICovCitHRU44X0lBMV9BRERSX0lNTShzcmMxLCAxMjEsIDEwNCwgOTYpCitHRU44X0lBMV9BRERSX0lNTShzcmMwLCAgOTUsICA3MiwgNjQpCitHRU44X0lBMV9BRERSX0lNTShkc3QsICAgNDcsICA1NiwgNDgpCisKKy8qKgorICogRmxvdyBjb250cm9sIGluc3RydWN0aW9uIGJpdHM6CisgKiAgQHsKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZW44X3VpcChzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCkKK3sKKyAgIHJldHVybiBpbnN0LT5kYXRhWzJdOworfQorc3RhdGljIGlubGluZSB2b2lkIGdlbjhfc2V0X3VpcChzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCwgdW5zaWduZWQgdWlwKQoreworICAgaW5zdC0+ZGF0YVsyXSA9IHVpcDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2VuOF9qaXAoc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICByZXR1cm4gaW5zdC0+ZGF0YVszXTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW44X3NldF9qaXAoc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QsIHVuc2lnbmVkIGppcCkKK3sKKyAgIGluc3QtPmRhdGFbM10gPSBqaXA7Cit9CisvKiogQH0gKi8KKworc3RhdGljIGlubGluZSBpbnQgZ2VuOF9zcmMxX2ltbV9kKHN0cnVjdCBnZW44X2luc3RydWN0aW9uICppbnN0KQoreworICAgcmV0dXJuIGluc3QtPmRhdGFbM107Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdlbjhfc3JjMV9pbW1fdWQoc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QpCit7CisgICByZXR1cm4gaW5zdC0+ZGF0YVszXTsKK30KK3N0YXRpYyBpbmxpbmUgZmxvYXQgZ2VuOF9zcmMxX2ltbV9mKHN0cnVjdCBnZW44X2luc3RydWN0aW9uICppbnN0KQoreworICAgZmlfdHlwZSBmdDsKKworICAgZnQudSA9IGluc3QtPmRhdGFbM107CisgICByZXR1cm4gZnQuZjsKK30KKwordm9pZCBnZW44X3NldF9kc3QoY29uc3Qgc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCwgc3RydWN0IGJyd19yZWcgcmVnKTsKK3ZvaWQgZ2VuOF9zZXRfc3JjMChjb25zdCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCwgc3RydWN0IGJyd19yZWcgcmVnKTsKK3ZvaWQgZ2VuOF9zZXRfc3JjMShjb25zdCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCwgc3RydWN0IGJyd19yZWcgcmVnKTsKKwordm9pZCBnZW44X3NldF91cmJfbWVzc2FnZShjb25zdCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gYnJ3X3VyYl93cml0ZV9mbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWxlbiwgdW5zaWduZWQgcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb2Zmc2V0LCBib29sIGludGVybGVhdmUpOworCit2b2lkIGdlbjhfc2V0X3NhbXBsZXJfbWVzc2FnZShjb25zdCBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnZW44X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleCwgdW5zaWduZWQgc2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ190eXBlLCB1bnNpZ25lZCBybGVuLCB1bnNpZ25lZCBtbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWFkZXJfcHJlc2VudCwgdW5zaWduZWQgc2ltZF9tb2RlKTsKKwordm9pZCBnZW44X3NldF9kcF9tZXNzYWdlKGNvbnN0IHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnZW44X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gYnJ3X21lc3NhZ2VfdGFyZ2V0IHNmaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmluZGluZ190YWJsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtc2dfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlc3BvbnNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlYWRlcl9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5kX29mX3RocmVhZCk7CisKK3ZvaWQgZ2VuOF9zZXRfZHBfc2NyYXRjaF9tZXNzYWdlKGNvbnN0IHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW52YWxpZGF0ZV9hZnRlcl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3JlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhZGRyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1zZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXNwb25zZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlYWRlcl9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmRfb2ZfdGhyZWFkKTsKKworLyoqIERpc2Fzc2VtYmxlIHRoZSBpbnN0cnVjdGlvbi4gKi8KK2ludCBnZW44X2Rpc2Fzc2VtYmxlKEZJTEUgKmZpbGUsIHN0cnVjdCBnZW44X2luc3RydWN0aW9uICppbnN0LCBpbnQgZ2VuKTsKKworCisvKioKKyAqIEZldGNoIGEgc2V0IG9mIGNvbnRpZ3VvdXMgYml0cyBmcm9tIHRoZSBpbnN0cnVjdGlvbi4KKyAqCisgKiBCaXRzIGluZGV4ZXMgcmFuZ2UgZnJvbSAwLi4xMjc7IGZpZWxkcyBtYXkgbm90IGNyb3NzIDMyLWJpdCBib3VuZGFyaWVzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCitnZW44X2luc3RydWN0aW9uX2JpdHMoc3RydWN0IGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QsIHVuc2lnbmVkIGhpZ2gsIHVuc2lnbmVkIGxvdykKK3sKKyAgIC8qIFdlIGFzc3VtZSB0aGUgZmllbGQgZG9lc24ndCBjcm9zcyAzMi1iaXQgYm91bmRhcmllcy4gKi8KKyAgIGNvbnN0IHVuc2lnbmVkIHdvcmQgPSBoaWdoIC8gMzI7CisgICBhc3NlcnQod29yZCA9PSBsb3cgLyAzMik7CisKKyAgIGhpZ2ggJT0gMzI7CisgICBsb3cgJT0gMzI7CisKKyAgIGNvbnN0IHVuc2lnbmVkIG1hc2sgPSAoKCgxIDw8IChoaWdoIC0gbG93ICsgMSkpIC0gMSkgPDwgbG93KTsKKworICAgcmV0dXJuIChpbnN0LT5kYXRhW3dvcmRdICYgbWFzaykgPj4gbG93OworfQorCisvKioKKyAqIFNldCBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbiwgd2l0aCBwcm9wZXIgc2hpZnRpbmcgYW5kIG1hc2tpbmcuCisgKgorICogQml0cyBpbmRleGVzIHJhbmdlIGZyb20gMC4uMTI3OyBmaWVsZHMgbWF5IG5vdCBjcm9zcyAzMi1iaXQgYm91bmRhcmllcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitnZW44X2luc3RydWN0aW9uX3NldF9iaXRzKHN0cnVjdCBnZW44X2luc3RydWN0aW9uICppbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbHVlKQoreworICAgY29uc3QgdW5zaWduZWQgd29yZCA9IGhpZ2ggLyAzMjsKKyAgIGFzc2VydCh3b3JkID09IGxvdyAvIDMyKTsKKworICAgaGlnaCAlPSAzMjsKKyAgIGxvdyAlPSAzMjsKKworICAgY29uc3QgdW5zaWduZWQgbWFzayA9ICgoKDEgPDwgKGhpZ2ggLSBsb3cgKyAxKSkgLSAxKSA8PCBsb3cpOworCisgICAvKiBNYWtlIHN1cmUgdGhlIHN1cHBsaWVkIHZhbHVlIGFjdHVhbGx5IGZpdHMgaW4gdGhlIGdpdmVuIGJpdGZpZWxkLiAqLworICAgYXNzZXJ0KCh2YWx1ZSAmIChtYXNrID4+IGxvdykpID09IHZhbHVlKTsKKworICAgaW5zdC0+ZGF0YVt3b3JkXSA9IChpbnN0LT5kYXRhW3dvcmRdICYgfm1hc2spIHwgKCh2YWx1ZSA8PCBsb3cpICYgbWFzayk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2dlbjhfdmVjNF9nZW5lcmF0b3IuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2dlbjhfdmVjNF9nZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDE2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvZ2VuOF92ZWM0X2dlbmVyYXRvci5jcHAKQEAgLTAsMCArMSw5NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYnJ3X3ZlYzQuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiYnJ3X2V1LmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcHJpbnQuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiCit9OworCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRyA6IEFERAorCituYW1lc3BhY2UgYnJ3IHsKKworZ2VuOF92ZWM0X2dlbmVyYXRvcjo6Z2VuOF92ZWM0X2dlbmVyYXRvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaGFkZXJfcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfdmVjNF9wcm9nX2RhdGEgKnByb2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWJ1Z19mbGFnKQorICAgOiBnZW44X2dlbmVyYXRvcihicncsIHNoYWRlcl9wcm9nLCBwcm9nLCBtZW1fY3R4KSwKKyAgICAgcHJvZ19kYXRhKHByb2dfZGF0YSksCisgICAgIGRlYnVnX2ZsYWcoZGVidWdfZmxhZykKK3sKK30KKworZ2VuOF92ZWM0X2dlbmVyYXRvcjo6fmdlbjhfdmVjNF9nZW5lcmF0b3IoKQoreworfQorCit2b2lkCitnZW44X3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90ZXgodmVjNF9pbnN0cnVjdGlvbiAqaXIsIHN0cnVjdCBicndfcmVnIGRzdCkKK3sKKyAgIGludCBtc2dfdHlwZSA9IDA7CisKKyAgIHN3aXRjaCAoaXItPm9wY29kZSkgeworICAgY2FzZSBTSEFERVJfT1BDT0RFX1RFWDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEw6CisgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJlKSB7CisgICAgICAgICBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MT0RfQ09NUEFSRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBtc2dfdHlwZSA9IEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MT0Q7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEQ6CisgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJlKSB7CisgICAgICAgICBtc2dfdHlwZSA9IEhTV19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0RFUklWX0NPTVBBUkU7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbXNnX3R5cGUgPSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfREVSSVZTOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhGOgorICAgICAgbXNnX3R5cGUgPSBHRU41X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTEQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfQ01TOgorICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfTEQyRE1TOworICAgICAgYnJlYWs7CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhGX01DUzoKKyAgICAgIG1zZ190eXBlID0gR0VON19TQU1QTEVSX01FU1NBR0VfU0FNUExFX0xEX01DUzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYUzoKKyAgICAgIG1zZ190eXBlID0gR0VONV9TQU1QTEVSX01FU1NBR0VfU0FNUExFX1JFU0lORk87CisgICAgICBicmVhazsKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9URzQ6CisgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJlKSB7CisgICAgICAgICBtc2dfdHlwZSA9IEdFTjdfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9HQVRIRVI0X0M7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfR0FUSEVSNDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBTSEFERVJfT1BDT0RFX1RHNF9PRkZTRVQ6CisgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJlKSB7CisgICAgICAgICBtc2dfdHlwZSA9IEdFTjdfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9HQVRIRVI0X1BPX0M7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbXNnX3R5cGUgPSBHRU43X1NBTVBMRVJfTUVTU0FHRV9TQU1QTEVfR0FUSEVSNF9QTzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInNob3VsZCBub3QgZ2V0IGhlcmU6IGludmFsaWQgVlMgdGV4dHVyZSBvcGNvZGUiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBpZiAoaXItPmhlYWRlcl9wcmVzZW50KSB7CisgICAgICBNT1ZfUkFXKHJldHlwZShicndfbWVzc2FnZV9yZWcoaXItPmJhc2VfbXJmKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLAorICAgICAgICAgICAgICByZXR5cGUoYnJ3X3ZlYzhfZ3JmKDAsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworCisgICAgICBkZWZhdWx0X3N0YXRlLmFjY2Vzc19tb2RlID0gQlJXX0FMSUdOXzE7CisKKyAgICAgIGlmIChpci0+dGV4dHVyZV9vZmZzZXQpIHsKKyAgICAgICAgIC8qIFNldCB0aGUgb2Zmc2V0IGJpdHMgaW4gRFdvcmQgMi4gKi8KKyAgICAgICAgIE1PVl9SQVcocmV0eXBlKGJyd192ZWMxX3JlZyhNUkYsIGlyLT5iYXNlX21yZiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICBCUldfUkVHSVNURVJfVFlQRV9VRCksCisgICAgICAgICAgICAgICAgIGJyd19pbW1fdWQoaXItPnRleHR1cmVfb2Zmc2V0KSk7CisgICAgICB9CisKKyAgICAgIGlmIChpci0+c2FtcGxlciA+PSAxNikgeworICAgICAgICAgLyogVGhlICJTYW1wbGVyIEluZGV4IiBmaWVsZCBjYW4gb25seSBzdG9yZSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxNS4KKyAgICAgICAgICAqIEhvd2V2ZXIsIHdlIGNhbiBhZGQgYW4gb2Zmc2V0IHRvIHRoZSAiU2FtcGxlciBTdGF0ZSBQb2ludGVyIgorICAgICAgICAgICogZmllbGQsIGVmZmVjdGl2ZWx5IHNlbGVjdGluZyBhIGRpZmZlcmVudCBzZXQgb2YgMTYgc2FtcGxlcnMuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhlICJTYW1wbGVyIFN0YXRlIFBvaW50ZXIiIG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gYSAzMi1ieXRlCisgICAgICAgICAgKiBvZmZzZXQsIGFuZCBlYWNoIHNhbXBsZXIgc3RhdGUgaXMgb25seSAxNi1ieXRlcywgc28gd2UgY2FuJ3QKKyAgICAgICAgICAqIGV4Y2x1c2l2ZWx5IHVzZSB0aGUgb2Zmc2V0IC0gd2UgaGF2ZSB0byB1c2UgYm90aC4KKyAgICAgICAgICAqLworICAgICAgICAgZ2VuOF9pbnN0cnVjdGlvbiAqYWRkID0KKyAgICAgICAgICAgIEFERChnZXRfZWxlbWVudF91ZChicndfbWVzc2FnZV9yZWcoaXItPmJhc2VfbXJmKSwgMyksCisgICAgICAgICAgICAgICAgZ2V0X2VsZW1lbnRfdWQoYnJ3X3ZlYzhfZ3JmKDAsIDApLCAzKSwKKyAgICAgICAgICAgICAgICBicndfaW1tX3VkKDE2ICogKGlyLT5zYW1wbGVyIC8gMTYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnZW43X3NhbXBsZXJfc3RhdGUpKSk7CisgICAgICAgICBnZW44X3NldF9tYXNrX2NvbnRyb2woYWRkLCBCUldfTUFTS19ESVNBQkxFKTsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdF9zdGF0ZS5hY2Nlc3NfbW9kZSA9IEJSV19BTElHTl8xNjsKKyAgIH0KKworICAgdWludDMyX3Qgc3VyZl9pbmRleCA9CisgICAgICBwcm9nX2RhdGEtPmJhc2UuYmluZGluZ190YWJsZS50ZXh0dXJlX3N0YXJ0ICsgaXItPnNhbXBsZXI7CisKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QgPSBuZXh0X2luc3QoQlJXX09QQ09ERV9TRU5EKTsKKyAgIGdlbjhfc2V0X2RzdChicncsIGluc3QsIGRzdCk7CisgICBnZW44X3NldF9zcmMwKGJydywgaW5zdCwgYnJ3X21lc3NhZ2VfcmVnKGlyLT5iYXNlX21yZikpOworICAgZ2VuOF9zZXRfc2FtcGxlcl9tZXNzYWdlKGJydywgaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyLT5zYW1wbGVyICUgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+bWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+aGVhZGVyX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJXX1NBTVBMRVJfU0lNRF9NT0RFX1NJTUQ0WDIpOworCisgICBicndfbWFya19zdXJmYWNlX3VzZWQoJnByb2dfZGF0YS0+YmFzZSwgc3VyZl9pbmRleCk7Cit9CisKK3ZvaWQKK2dlbjhfdmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3VyYl93cml0ZSh2ZWM0X2luc3RydWN0aW9uICppciwgYm9vbCB2cykKK3sKKyAgIHN0cnVjdCBicndfcmVnIGhlYWRlciA9IGJyd192ZWM4X2dyZihHRU43X01SRl9IQUNLX1NUQVJUICsgaXItPmJhc2VfbXJmLCAwKTsKKworICAgLyogQ29weSBnMC4gKi8KKyAgIGlmICh2cykKKyAgICAgIE1PVl9SQVcoaGVhZGVyLCBicndfdmVjOF9ncmYoMCwgMCkpOworCisgICBnZW44X2luc3RydWN0aW9uICppbnN0OworICAgaWYgKCEoaXItPnVyYl93cml0ZV9mbGFncyAmIEJSV19VUkJfV1JJVEVfVVNFX0NIQU5ORUxfTUFTS1MpKSB7CisgICAgICAvKiBFbmFibGUgQ2hhbm5lbCBNYXNrcyBpbiB0aGUgVVJCX1dSSVRFX09XT1JEIG1lc3NhZ2UgaGVhZGVyICovCisgICAgICBkZWZhdWx0X3N0YXRlLmFjY2Vzc19tb2RlID0gQlJXX0FMSUdOXzE7CisgICAgICBNT1ZfUkFXKGJyd192ZWMxX2dyZihHRU43X01SRl9IQUNLX1NUQVJUICsgaXItPmJhc2VfbXJmLCA1KSwKKyAgICAgICAgICAgICAgYnJ3X2ltbV91ZCgweGZmMDApKTsKKyAgICAgIGRlZmF1bHRfc3RhdGUuYWNjZXNzX21vZGUgPSBCUldfQUxJR05fMTY7CisgICB9CisKKyAgIGluc3QgPSBuZXh0X2luc3QoQlJXX09QQ09ERV9TRU5EKTsKKyAgIGdlbjhfc2V0X3VyYl9tZXNzYWdlKGJydywgaW5zdCwgaXItPnVyYl93cml0ZV9mbGFncywgaXItPm1sZW4sIDAsIGlyLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgIGdlbjhfc2V0X2RzdChicncsIGluc3QsIGJyd19udWxsX3JlZygpKTsKKyAgIGdlbjhfc2V0X3NyYzAoYnJ3LCBpbnN0LCBoZWFkZXIpOworfQorCit2b2lkCitnZW44X3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc19zZXRfdmVydGV4X2NvdW50KHN0cnVjdCBicndfcmVnIGVvdF9tcmZfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMpCit7CisgICAvKiBNb3ZlIHRoZSB2ZXJ0ZXggY291bnQgaW50byB0aGUgc2Vjb25kIE1SRiBmb3IgdGhlIEVPVCB3cml0ZS4gKi8KKyAgIGFzc2VydChlb3RfbXJmX2hlYWRlci5maWxlID09IEJSV19NRVNTQUdFX1JFR0lTVEVSX0ZJTEUpOworICAgaW50IGRzdF9uciA9IEdFTjdfTVJGX0hBQ0tfU1RBUlQgKyBlb3RfbXJmX2hlYWRlci5uciArIDE7CisgICBNT1YocmV0eXBlKGJyd192ZWM4X2dyZihkc3RfbnIsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCksIHNyYyk7Cit9CisKK3ZvaWQKK2dlbjhfdmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dzX3RocmVhZF9lbmQodmVjNF9pbnN0cnVjdGlvbiAqaXIpCit7CisgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMgPSBicndfdmVjOF9ncmYoR0VON19NUkZfSEFDS19TVEFSVCArIGlyLT5iYXNlX21yZiwgMCk7CisgICBnZW44X2luc3RydWN0aW9uICppbnN0OworCisgICAvKiBFbmFibGUgQ2hhbm5lbCBNYXNrcyBpbiB0aGUgVVJCX1dSSVRFX0hXT1JEIG1lc3NhZ2UgaGVhZGVyICovCisgICBkZWZhdWx0X3N0YXRlLmFjY2Vzc19tb2RlID0gQlJXX0FMSUdOXzE7CisgICBpbnN0ID0gT1IocmV0eXBlKGJyd192ZWMxX2dyZihHRU43X01SRl9IQUNLX1NUQVJUICsgaXItPmJhc2VfbXJmLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLAorICAgICAgICAgICAgIHJldHlwZShicndfdmVjMV9ncmYoMCwgNSksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwKKyAgICAgICAgICAgICBicndfaW1tX3VkKDB4ZmYwMCkpOyAvKiBjb3VsZCBiZSAweDExMDAgYnV0IHNob3VsZG4ndCBtYXR0ZXIgKi8KKyAgIGdlbjhfc2V0X21hc2tfY29udHJvbChpbnN0LCBCUldfTUFTS19ESVNBQkxFKTsKKyAgIGRlZmF1bHRfc3RhdGUuYWNjZXNzX21vZGUgPSBCUldfQUxJR05fMTY7CisKKyAgIC8qIG1sZW4gPSAyOiBnMCBoZWFkZXIgKyB2ZXJ0ZXggY291bnQgKi8KKyAgIGluc3QgPSBuZXh0X2luc3QoQlJXX09QQ09ERV9TRU5EKTsKKyAgIGdlbjhfc2V0X3VyYl9tZXNzYWdlKGJydywgaW5zdCwgQlJXX1VSQl9XUklURV9FT1QsIDIsIDAsIDAsIHRydWUpOworICAgZ2VuOF9zZXRfZHN0KGJydywgaW5zdCwgYnJ3X251bGxfcmVnKCkpOworICAgZ2VuOF9zZXRfc3JjMChicncsIGluc3QsIHNyYyk7Cit9CisKK3ZvaWQKK2dlbjhfdmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dzX3NldF93cml0ZV9vZmZzZXQoc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMxKQoreworICAgLyogRnJvbSBwMjIgb2Ygdm9sdW1lIDQgcGFydCAyIG9mIHRoZSBJdnkgQnJpZGdlIFBSTSAoMi40LjMuMSBNZXNzYWdlCisgICAgKiBIZWFkZXI6IE0wLjMpOgorICAgICoKKyAgICAqICAgICBTbG90IDAgT2Zmc2V0LiBUaGlzIGZpZWxkLCBhZnRlciBhZGRpbmcgdG8gdGhlIEdsb2JhbCBPZmZzZXQgZmllbGQKKyAgICAqICAgICBpbiB0aGUgbWVzc2FnZSBkZXNjcmlwdG9yLCBzcGVjaWZpZXMgdGhlIG9mZnNldCAoaW4gMjU2LWJpdCB1bml0cykKKyAgICAqICAgICBmcm9tIHRoZSBzdGFydCBvZiB0aGUgVVJCIGVudHJ5LCBhcyByZWZlcmVuY2VkIGJ5IFVSQiBIYW5kbGUgMCwgYXQKKyAgICAqICAgICB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIGFjY2Vzc2VkLgorICAgICoKKyAgICAqIFNpbWlsYXIgdGV4dCBkZXNjcmliZXMgRFdPUkQgTTAuNCwgd2hpY2ggaXMgc2xvdCAxIG9mZnNldC4KKyAgICAqCisgICAgKiBUaGVyZWZvcmUsIHdlIHdhbnQgdG8gbXVsdGlwbHkgRFdPUkRzIDAgYW5kIDQgb2Ygc3JjMCAodGhlIHggY29tcG9uZW50cworICAgICogb2YgdGhlIHJlZ2lzdGVyIGZvciBnZW9tZXRyeSBzaGFkZXIgaW52b2NhdGlvbnMgMCBhbmQgMSkgYnkgdGhlCisgICAgKiBpbW1lZGlhdGUgdmFsdWUgaW4gc3JjMSwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gRFdPUkRzIDMgYW5kIDQgb2YgZHN0LgorICAgICoKKyAgICAqIFdlIGNhbiBkbyB0aGlzIHdpdGggdGhlIGZvbGxvd2luZyBFVSBpbnN0cnVjdGlvbjoKKyAgICAqCisgICAgKiAgICAgbXVsKDIpIGRzdC4zPDE+VUQgc3JjMDw4OzIsND5VRCBzcmMxICAgeyBBbGlnbjEgV0VfYWxsIH0KKyAgICAqLworICAgZGVmYXVsdF9zdGF0ZS5hY2Nlc3NfbW9kZSA9IEJSV19BTElHTl8xOworICAgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCA9CisgICAgICBNVUwoc3Vib2Zmc2V0KHN0cmlkZShkc3QsIDIsIDIsIDEpLCAzKSwgc3RyaWRlKHNyYzAsIDgsIDIsIDQpLCBzcmMxKTsKKyAgIGdlbjhfc2V0X21hc2tfY29udHJvbChpbnN0LCBCUldfTUFTS19ESVNBQkxFKTsKKyAgIGRlZmF1bHRfc3RhdGUuYWNjZXNzX21vZGUgPSBCUldfQUxJR05fMTY7Cit9CisKK3ZvaWQKK2dlbjhfdmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dzX3NldF9kd29yZF8yX2ltbWVkKHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHNyYykKK3sKKyAgIGFzc2VydChzcmMuZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFKTsKKworICAgZGVmYXVsdF9zdGF0ZS5hY2Nlc3NfbW9kZSA9IEJSV19BTElHTl8xOworCisgICBnZW44X2luc3RydWN0aW9uICppbnN0ID0gTU9WKHN1Ym9mZnNldCh2ZWMxKGRzdCksIDIpLCBzcmMpOworICAgZ2VuOF9zZXRfbWFza19jb250cm9sKGluc3QsIEJSV19NQVNLX0RJU0FCTEUpOworCisgICBkZWZhdWx0X3N0YXRlLmFjY2Vzc19tb2RlID0gQlJXX0FMSUdOXzE2OworfQorCit2b2lkCitnZW44X3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc19wcmVwYXJlX2NoYW5uZWxfbWFza3Moc3RydWN0IGJyd19yZWcgZHN0KQoreworICAgLyogV2Ugd2FudCB0byBsZWZ0IHNoaWZ0IGp1c3QgRFdPUkQgNCAodGhlIHggY29tcG9uZW50IGJlbG9uZ2luZyB0byB0aGUKKyAgICAqIHNlY29uZCBnZW9tZXRyeSBzaGFkZXIgaW52b2NhdGlvbikgYnkgNCBiaXRzLiAgU28gZ2VuZXJhdGUgdGhlCisgICAgKiBpbnN0cnVjdGlvbjoKKyAgICAqCisgICAgKiAgICAgc2hsKDEpIGRzdC40PDE+VUQgZHN0LjQ8MCwxLDA+VUQgNFVEIHsgYWxpZ24xIFdFX2FsbCB9CisgICAgKi8KKyAgIGRzdCA9IHN1Ym9mZnNldCh2ZWMxKGRzdCksIDQpOworICAgZGVmYXVsdF9zdGF0ZS5hY2Nlc3NfbW9kZSA9IEJSV19BTElHTl8xOworICAgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCA9IFNITChkc3QsIGRzdCwgYnJ3X2ltbV91ZCg0KSk7CisgICBnZW44X3NldF9tYXNrX2NvbnRyb2woaW5zdCwgQlJXX01BU0tfRElTQUJMRSk7CisgICBkZWZhdWx0X3N0YXRlLmFjY2Vzc19tb2RlID0gQlJXX0FMSUdOXzE2OworfQorCit2b2lkCitnZW44X3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nc19zZXRfY2hhbm5lbF9tYXNrcyhzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmMpCit7CisgICAvKiBGcm9tIHAyMSBvZiB2b2x1bWUgNCBwYXJ0IDIgb2YgdGhlIEl2eSBCcmlkZ2UgUFJNICgyLjQuMy4xIE1lc3NhZ2UKKyAgICAqIEhlYWRlcjogTTAuNSk6CisgICAgKgorICAgICogICAgIDE1IFZlcnRleCAxIERBVEEgWzNdIC8gVmVydGV4IDAgREFUQVs3XSBDaGFubmVsIE1hc2sKKyAgICAqCisgICAgKiAgICAgICAgV2hlbiBTd2l6emxlIENvbnRyb2wgPSBVUkJfSU5URVJMRUFWRUQgdGhpcyBiaXQgY29udHJvbHMgVmVydGV4IDEKKyAgICAqICAgICAgICBEQVRBWzNdLCB3aGVuIFN3aXp6bGUgQ29udHJvbCA9IFVSQl9OT1NXSVpaTEUgdGhpcyBiaXQgY29udHJvbHMKKyAgICAqICAgICAgICBWZXJ0ZXggMCBEQVRBWzddLiAgVGhpcyBiaXQgaXMgQU5EZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZworICAgICogICAgICAgIGNoYW5uZWwgZW5hYmxlIHRvIGRldGVybWluZSB0aGUgZmluYWwgY2hhbm5lbCBlbmFibGUuICBGb3IgdGhlCisgICAgKiAgICAgICAgVVJCX1JFQURfT1dPUkQgJiBVUkJfUkVBRF9IV09SRCBtZXNzYWdlcywgd2hlbiBmaW5hbCBjaGFubmVsCisgICAgKiAgICAgICAgZW5hYmxlIGlzIDEgaXQgaW5kaWNhdGVzIHRoYXQgVmVydGV4IDEgREFUQSBbM10gd2lsbCBiZSBpbmNsdWRlZAorICAgICogICAgICAgIGluIHRoZSB3cml0ZWJhY2sgbWVzc2FnZS4gIEZvciB0aGUgVVJCX1dSSVRFX09XT1JEICYKKyAgICAqICAgICAgICBVUkJfV1JJVEVfSFdPUkQgbWVzc2FnZXMsIHdoZW4gZmluYWwgY2hhbm5lbCBlbmFibGUgaXMgMSBpdAorICAgICogICAgICAgIGluZGljYXRlcyB0aGF0IFZlcnRleCAxIERBVEEgWzNdIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgc3VyZmFjZS4KKyAgICAqCisgICAgKiAgICAgICAgMDogVmVydGV4IDEgREFUQSBbM10gLyBWZXJ0ZXggMCBEQVRBWzddIGNoYW5uZWwgbm90IGluY2x1ZGVkCisgICAgKiAgICAgICAgMTogVmVydGV4IERBVEEgWzNdIC8gVmVydGV4IDAgREFUQVs3XSBjaGFubmVsIGluY2x1ZGVkCisgICAgKgorICAgICogICAgIDE0IFZlcnRleCAxIERBVEEgWzJdIENoYW5uZWwgTWFzaworICAgICogICAgIDEzIFZlcnRleCAxIERBVEEgWzFdIENoYW5uZWwgTWFzaworICAgICogICAgIDEyIFZlcnRleCAxIERBVEEgWzBdIENoYW5uZWwgTWFzaworICAgICogICAgIDExIFZlcnRleCAwIERBVEEgWzNdIENoYW5uZWwgTWFzaworICAgICogICAgIDEwIFZlcnRleCAwIERBVEEgWzJdIENoYW5uZWwgTWFzaworICAgICogICAgICA5IFZlcnRleCAwIERBVEEgWzFdIENoYW5uZWwgTWFzaworICAgICogICAgICA4IFZlcnRleCAwIERBVEEgWzBdIENoYW5uZWwgTWFzaworICAgICoKKyAgICAqIChUaGlzIGlzIGZyb20gYSBzZWN0aW9uIG9mIHRoZSBQUk0gdGhhdCBpcyBhZ25vc3RpYyB0byB0aGUgcGFydGljdWxhcgorICAgICogdHlwZSBvZiBzaGFkZXIgYmVpbmcgZXhlY3V0ZWQsIHNvICJWZXJ0ZXggMCIgYW5kICJWZXJ0ZXggMSIgcmVmZXIgdG8KKyAgICAqIGdlb21ldHJ5IHNoYWRlciBpbnZvY2F0aW9ucyAwIGFuZCAxLCByZXNwZWN0aXZlbHkpLiAgU2luY2Ugd2UgaGF2ZSB0aGUKKyAgICAqIGVuYWJsZSBmbGFncyBmb3IgZ2VvbWV0cnkgc2hhZGVyIGludm9jYXRpb24gMCBpbiBiaXRzIDM6MCBvZiBEV09SRCAwLAorICAgICogYW5kIHRoZSBlbmFibGUgZmxhZ3MgZm9yIGdlb21ldHJ5IHNoYWRlciBpbnZvY2F0aW9uIDEgaW4gYml0cyA3OjAgb2YKKyAgICAqIERXT1JEIDQsIHdlIGp1c3QgbmVlZCB0byBPUiB0aGVtIHRvZ2V0aGVyIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIGJpdHMKKyAgICAqIDE1Ojggb2YgRFdPUkQgNS4KKyAgICAqCisgICAgKiBJdCdzIGVhc2llciB0byBnZXQgdGhlIEVVIHRvIGRvIHRoaXMgaWYgd2UgdGhpbmsgb2YgdGhlIHNyYyBhbmQgZHN0CisgICAgKiByZWdpc3RlcnMgYXMgY29tcG9zZWQgb2YgMzIgYnl0ZXMgZWFjaDsgdGhlbiwgd2Ugd2FudCB0byBwaWNrIHVwIHRoZQorICAgICogY29udGVudHMgb2YgYnl0ZXMgMCBhbmQgMTYgZnJvbSBzcmMsIE9SIHRoZW0gdG9nZXRoZXIsIGFuZCBzdG9yZSB0aGVtIGluCisgICAgKiBieXRlIDIxLgorICAgICoKKyAgICAqIFdlIGNhbiBkbyB0aGF0IGJ5IHRoZSBmb2xsb3dpbmcgRVUgaW5zdHJ1Y3Rpb246CisgICAgKgorICAgICogICAgIG9yKDEpIGRzdC4yMTwxPlVCIHNyYzwwLDEsMD5VQiBzcmMuMTY8MCwxLDA+VUIgeyBhbGlnbjEgV0VfYWxsIH0KKyAgICAqCisgICAgKiBOb3RlOiB0aGlzIHJlbGllcyBvbiB0aGUgc291cmNlIHJlZ2lzdGVyIGhhdmluZyB6ZXJvcyBpbiAoYSkgYml0cyA3OjQgb2YKKyAgICAqIERXT1JEIDAgYW5kIChiKSBiaXRzIDM6MCBvZiBEV09SRCA0LiAgV2UgY2FuIHJlbHkgb24gKGIpIGJlY2F1c2UgdGhlCisgICAgKiBzb3VyY2UgcmVnaXN0ZXIgd2FzIHByZXBhcmVkIGJ5IEdTX09QQ09ERV9QUkVQQVJFX0NIQU5ORUxfTUFTS1MgKHdoaWNoCisgICAgKiBzaGlmdHMgRFdPUkQgNCBsZWZ0IGJ5IDQgYml0cyksIGFuZCB3ZSBjYW4gcmVseSBvbiAoYSkgYmVjYXVzZSBwcmlvciB0bworICAgICogdGhlIGV4ZWN1dGlvbiBvZiBHU19PUENPREVfUFJFUEFSRV9DSEFOTkVMX01BU0tTLCBEV09SRHMgMCBhbmQgNCBuZWVkIHRvCisgICAgKiBjb250YWluIHZhbGlkIGNoYW5uZWwgbWFzayB2YWx1ZXMgKHdoaWNoIGFyZSBpbiB0aGUgcmFuZ2UgMHgwLTB4ZikuCisgICAgKi8KKyAgIGRzdCA9IHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VCKTsKKyAgIHNyYyA9IHJldHlwZShzcmMsIEJSV19SRUdJU1RFUl9UWVBFX1VCKTsKKworICAgZGVmYXVsdF9zdGF0ZS5hY2Nlc3NfbW9kZSA9IEJSV19BTElHTl8xOworCisgICBnZW44X2luc3RydWN0aW9uICppbnN0ID0KKyAgICAgIE9SKHN1Ym9mZnNldCh2ZWMxKGRzdCksIDIxKSwgdmVjMShzcmMpLCBzdWJvZmZzZXQodmVjMShzcmMpLCAxNikpOworICAgZ2VuOF9zZXRfbWFza19jb250cm9sKGluc3QsIEJSV19NQVNLX0RJU0FCTEUpOworCisgICBkZWZhdWx0X3N0YXRlLmFjY2Vzc19tb2RlID0gQlJXX0FMSUdOXzE2OworfQorCit2b2lkCitnZW44X3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vd29yZF9kdWFsX2Jsb2NrX29mZnNldHMoc3RydWN0IGJyd19yZWcgbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgaW5kZXgpCit7CisgICBpbnQgc2Vjb25kX3ZlcnRleF9vZmZzZXQgPSAxOworCisgICBtMSA9IHJldHlwZShtMSwgQlJXX1JFR0lTVEVSX1RZUEVfRCk7CisKKyAgIC8qIFNldCB1cCBNMSAobWVzc2FnZSBwYXlsb2FkKS4gIE9ubHkgdGhlIGJsb2NrIG9mZnNldHMgaW4gTTEuMCBhbmQKKyAgICAqIE0xLjQgYXJlIHVzZWQsIGFuZCB0aGUgcmVzdCBhcmUgaWdub3JlZC4KKyAgICAqLworICAgc3RydWN0IGJyd19yZWcgbTFfMCA9IHN1Ym9mZnNldCh2ZWMxKG0xKSwgMCk7CisgICBzdHJ1Y3QgYnJ3X3JlZyBtMV80ID0gc3Vib2Zmc2V0KHZlYzEobTEpLCA0KTsKKyAgIHN0cnVjdCBicndfcmVnIGluZGV4XzAgPSBzdWJvZmZzZXQodmVjMShpbmRleCksIDApOworICAgc3RydWN0IGJyd19yZWcgaW5kZXhfNCA9IHN1Ym9mZnNldCh2ZWMxKGluZGV4KSwgNCk7CisKKyAgIGRlZmF1bHRfc3RhdGUubWFza19jb250cm9sID0gQlJXX01BU0tfRElTQUJMRTsKKyAgIGRlZmF1bHRfc3RhdGUuYWNjZXNzX21vZGUgPSBCUldfQUxJR05fMTsKKworICAgTU9WKG0xXzAsIGluZGV4XzApOworCisgICBpZiAoaW5kZXguZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFKSB7CisgICAgICBpbmRleF80LmR3MS51ZCArPSBzZWNvbmRfdmVydGV4X29mZnNldDsKKyAgICAgIE1PVihtMV80LCBpbmRleF80KTsKKyAgIH0gZWxzZSB7CisgICAgICBBREQobTFfNCwgaW5kZXhfNCwgYnJ3X2ltbV9kKHNlY29uZF92ZXJ0ZXhfb2Zmc2V0KSk7CisgICB9CisKKyAgIGRlZmF1bHRfc3RhdGUubWFza19jb250cm9sID0gQlJXX01BU0tfRU5BQkxFOworICAgZGVmYXVsdF9zdGF0ZS5hY2Nlc3NfbW9kZSA9IEJSV19BTElHTl8xNjsKK30KKwordm9pZAorZ2VuOF92ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2NyYXRjaF9yZWFkKHZlYzRfaW5zdHJ1Y3Rpb24gKmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIGhlYWRlciA9IGJyd192ZWM4X2dyZihHRU43X01SRl9IQUNLX1NUQVJUICsgaXItPmJhc2VfbXJmLCAwKTsKKworICAgTU9WX1JBVyhoZWFkZXIsIGJyd192ZWM4X2dyZigwLCAwKSk7CisKKyAgIGdlbmVyYXRlX293b3JkX2R1YWxfYmxvY2tfb2Zmc2V0cyhicndfbWVzc2FnZV9yZWcoaXItPmJhc2VfbXJmICsgMSksIGluZGV4KTsKKworICAgLyogRWFjaCBvZiB0aGUgOCBjaGFubmVsIGVuYWJsZXMgaXMgY29uc2lkZXJlZCBmb3Igd2hldGhlciBlYWNoCisgICAgKiBkd29yZCBpcyB3cml0dGVuLgorICAgICovCisgICBnZW44X2luc3RydWN0aW9uICpzZW5kID0gbmV4dF9pbnN0KEJSV19PUENPREVfU0VORCk7CisgICBnZW44X3NldF9kc3QoYnJ3LCBzZW5kLCBkc3QpOworICAgZ2VuOF9zZXRfc3JjMChicncsIHNlbmQsIGhlYWRlcik7CisgICBnZW44X3NldF9kcF9tZXNzYWdlKGJydywgc2VuZCwgR0VON19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEUsCisgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgLyogYmluZGluZyB0YWJsZSBpbmRleDogc3RhdGVsZXNzIGFjY2VzcyAqLworICAgICAgICAgICAgICAgICAgICAgICBHRU42X0RBVEFQT1JUX1JFQURfTUVTU0FHRV9PV09SRF9EVUFMX0JMT0NLX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgIEJSV19EQVRBUE9SVF9PV09SRF9EVUFMX0JMT0NLXzFPV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAvKiBtbGVuICovCisgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgLyogcmxlbiAqLworICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgIC8qIGhlYWRlciBwcmVzZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsgLyogRU9UICovCit9CisKK3ZvaWQKK2dlbjhfdmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NjcmF0Y2hfd3JpdGUodmVjNF9pbnN0cnVjdGlvbiAqaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBpbmRleCkKK3sKKyAgIHN0cnVjdCBicndfcmVnIGhlYWRlciA9IGJyd192ZWM4X2dyZihHRU43X01SRl9IQUNLX1NUQVJUICsgaXItPmJhc2VfbXJmLCAwKTsKKworICAgTU9WX1JBVyhoZWFkZXIsIGJyd192ZWM4X2dyZigwLCAwKSk7CisKKyAgIGdlbmVyYXRlX293b3JkX2R1YWxfYmxvY2tfb2Zmc2V0cyhicndfbWVzc2FnZV9yZWcoaXItPmJhc2VfbXJmICsgMSksIGluZGV4KTsKKworICAgTU9WKHJldHlwZShicndfbWVzc2FnZV9yZWcoaXItPmJhc2VfbXJmICsgMiksIEJSV19SRUdJU1RFUl9UWVBFX0QpLAorICAgICAgIHJldHlwZShzcmMsIEJSV19SRUdJU1RFUl9UWVBFX0QpKTsKKworICAgLyogRWFjaCBvZiB0aGUgOCBjaGFubmVsIGVuYWJsZXMgaXMgY29uc2lkZXJlZCBmb3Igd2hldGhlciBlYWNoCisgICAgKiBkd29yZCBpcyB3cml0dGVuLgorICAgICovCisgICBnZW44X2luc3RydWN0aW9uICpzZW5kID0gbmV4dF9pbnN0KEJSV19PUENPREVfU0VORCk7CisgICBnZW44X3NldF9kc3QoYnJ3LCBzZW5kLCBkc3QpOworICAgZ2VuOF9zZXRfc3JjMChicncsIHNlbmQsIGhlYWRlcik7CisgICBnZW44X3NldF9wcmVkX2NvbnRyb2woc2VuZCwgaXItPnByZWRpY2F0ZSk7CisgICBnZW44X3NldF9kcF9tZXNzYWdlKGJydywgc2VuZCwgR0VON19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEUsCisgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgLyogYmluZGluZyB0YWJsZSBpbmRleDogc3RhdGVsZXNzIGFjY2VzcyAqLworICAgICAgICAgICAgICAgICAgICAgICBHRU43X0RBVEFQT1JUX1dSSVRFX01FU1NBR0VfT1dPUkRfRFVBTF9CTE9DS19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgQlJXX0RBVEFQT1JUX09XT1JEX0RVQUxfQkxPQ0tfMU9XT1JELAorICAgICAgICAgICAgICAgICAgICAgICAzLCAgICAgIC8qIG1sZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAvKiBybGVuICovCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgLyogaGVhZGVyIHByZXNlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOyAvKiBFT1QgKi8KK30KKwordm9pZAorZ2VuOF92ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHVsbF9jb25zdGFudF9sb2FkKHZlYzRfaW5zdHJ1Y3Rpb24gKmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIG9mZnNldCkKK3sKKyAgIGFzc2VydChpbmRleC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKyAgICAgICAgICBpbmRleC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgIHVpbnQzMl90IHN1cmZfaW5kZXggPSBpbmRleC5kdzEudWQ7CisKKyAgIGFzc2VydChvZmZzZXQuZmlsZSA9PSBCUldfR0VORVJBTF9SRUdJU1RFUl9GSUxFKTsKKworICAgLyogRWFjaCBvZiB0aGUgOCBjaGFubmVsIGVuYWJsZXMgaXMgY29uc2lkZXJlZCBmb3Igd2hldGhlciBlYWNoCisgICAgKiBkd29yZCBpcyB3cml0dGVuLgorICAgICovCisgICBnZW44X2luc3RydWN0aW9uICpzZW5kID0gbmV4dF9pbnN0KEJSV19PUENPREVfU0VORCk7CisgICBnZW44X3NldF9kc3QoYnJ3LCBzZW5kLCBkc3QpOworICAgZ2VuOF9zZXRfc3JjMChicncsIHNlbmQsIG9mZnNldCk7CisgICBnZW44X3NldF9zYW1wbGVyX21lc3NhZ2UoYnJ3LCBzZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogVGhlIExEIG1lc3NhZ2UgaWdub3JlcyB0aGUgc2FtcGxlciB1bml0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjVfU0FNUExFUl9NRVNTQUdFX1NBTVBMRV9MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgIC8qIHJsZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgIC8qIG1sZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIC8qIG5vIGhlYWRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSV19TQU1QTEVSX1NJTURfTU9ERV9TSU1ENFgyKTsKKworICAgYnJ3X21hcmtfc3VyZmFjZV91c2VkKCZwcm9nX2RhdGEtPmJhc2UsIHN1cmZfaW5kZXgpOworfQorCit2b2lkCitnZW44X3ZlYzRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bnR5cGVkX2F0b21pYyh2ZWM0X2luc3RydWN0aW9uICppciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGF0b21pY19vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIHN1cmZfaW5kZXgpCit7CisgICBhc3NlcnQoYXRvbWljX29wLmZpbGUgPT0gQlJXX0lNTUVESUFURV9WQUxVRSAmJgorICAgICAgICAgIGF0b21pY19vcC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEICYmCisgICAgICAgICAgc3VyZl9pbmRleC5maWxlID09IEJSV19JTU1FRElBVEVfVkFMVUUgJiYKKyAgICAgICAgICBzdXJmX2luZGV4LnR5cGUgPT0gQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgYXNzZXJ0KChhdG9taWNfb3AuZHcxLnVkICYgfjB4ZikgPT0gMCk7CisKKyAgIHVuc2lnbmVkIG1zZ19jb250cm9sID0KKyAgICAgIGF0b21pY19vcC5kdzEudWQgfCAvKiBBdG9taWMgT3BlcmF0aW9uIFR5cGU6IEJSV19BT1BfKiAqLworICAgICAgKDEgPDwgNSk7IC8qIFJldHVybiBkYXRhIGV4cGVjdGVkICovCisKKyAgIGdlbjhfaW5zdHJ1Y3Rpb24gKmluc3QgPSBuZXh0X2luc3QoQlJXX09QQ09ERV9TRU5EKTsKKyAgIGdlbjhfc2V0X2RzdChicncsIGluc3QsIHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSk7CisgICBnZW44X3NldF9zcmMwKGJydywgaW5zdCwgYnJ3X21lc3NhZ2VfcmVnKGlyLT5iYXNlX21yZikpOworICAgZ2VuOF9zZXRfZHBfbWVzc2FnZShicncsIGluc3QsIEhTV19TRklEX0RBVEFQT1JUX0RBVEFfQ0FDSEVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3VyZl9pbmRleC5kdzEudWQsCisgICAgICAgICAgICAgICAgICAgICAgIEhTV19EQVRBUE9SVF9EQ19QT1JUMV9VTlRZUEVEX0FUT01JQ19PUF9TSU1ENFgyLAorICAgICAgICAgICAgICAgICAgICAgICBtc2dfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXItPm1sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgIGlyLT5oZWFkZXJfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICBicndfbWFya19zdXJmYWNlX3VzZWQoJnByb2dfZGF0YS0+YmFzZSwgc3VyZl9pbmRleC5kdzEudWQpOworfQorCisKKwordm9pZAorZ2VuOF92ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW50eXBlZF9zdXJmYWNlX3JlYWQodmVjNF9pbnN0cnVjdGlvbiAqaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzdXJmX2luZGV4KQoreworICAgYXNzZXJ0KHN1cmZfaW5kZXguZmlsZSA9PSBCUldfSU1NRURJQVRFX1ZBTFVFICYmCisgICAgICAgICAgc3VyZl9pbmRleC50eXBlID09IEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgZ2VuOF9pbnN0cnVjdGlvbiAqaW5zdCA9IG5leHRfaW5zdChCUldfT1BDT0RFX1NFTkQpOworICAgZ2VuOF9zZXRfZHN0KGJydywgaW5zdCwgcmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKTsKKyAgIGdlbjhfc2V0X3NyYzAoYnJ3LCBpbnN0LCBicndfbWVzc2FnZV9yZWcoaXItPmJhc2VfbXJmKSk7CisgICBnZW44X3NldF9kcF9tZXNzYWdlKGJydywgaW5zdCwgSFNXX1NGSURfREFUQVBPUlRfREFUQV9DQUNIRV8xLAorICAgICAgICAgICAgICAgICAgICAgICBzdXJmX2luZGV4LmR3MS51ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgSFNXX0RBVEFQT1JUX0RDX1BPUlQxX1VOVFlQRURfU1VSRkFDRV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAweGUsIC8qIGVuYWJsZSBvbmx5IHRoZSBSIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgaXItPm1sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgIGlyLT5oZWFkZXJfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICBicndfbWFya19zdXJmYWNlX3VzZWQoJnByb2dfZGF0YS0+YmFzZSwgc3VyZl9pbmRleC5kdzEudWQpOworfQorCisKK3ZvaWQKK2dlbjhfdmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX3ZlYzRfaW5zdHJ1Y3Rpb24odmVjNF9pbnN0cnVjdGlvbiAqaW5zdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfcmVnIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19yZWcgKnNyYykKK3sKKyAgIHZlYzRfaW5zdHJ1Y3Rpb24gKmlyID0gKHZlYzRfaW5zdHJ1Y3Rpb24gKikgaW5zdHJ1Y3Rpb247CisKKyAgIGlmIChkc3Qud2lkdGggPT0gQlJXX1dJRFRIXzQpIHsKKyAgICAgIC8qIFRoaXMgaGFwcGVucyBpbiBhdHRyaWJ1dGUgZml4dXBzIGZvciAiZHVhbCBpbnN0YW5jZWQiIGdlb21ldHJ5CisgICAgICAgKiBzaGFkZXJzLCBzaW5jZSB0aGV5IHVzZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIHZlYzQncy4gIFNpbmNlIHRoZSBleGVjCisgICAgICAgKiB3aWR0aCBpcyBvbmx5IDQsIGl0J3MgZXNzZW50aWFsIHRoYXQgdGhlIGNhbGxlciBzZXQKKyAgICAgICAqIGZvcmNlX3dyaXRlbWFza19hbGwgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoZSBpbnN0cnVjdGlvbiBpcyBleGVjdXRlZAorICAgICAgICogcmVnYXJkbGVzcyBvZiB3aGljaCBjaGFubmVscyBhcmUgZW5hYmxlZC4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KGlyLT5mb3JjZV93cml0ZW1hc2tfYWxsKTsKKworICAgICAgLyogRml4IHVwIGFueSA8ODs4LDE+IG9yIDwwOzQsMT4gc291cmNlIHJlZ2lzdGVycyB0byA8NDs0LDE+IHRvIHNhdGlzZnkKKyAgICAgICAqIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIgcmVnaW9uIHJlc3RyaWN0aW9ucyAoZnJvbSBHcmFwaGljcyBCU3BlYzoKKyAgICAgICAqIDNELU1lZGlhLUdQR1BVIEVuZ2luZSA+IEVVIE92ZXJ2aWV3ID4gUmVnaXN0ZXJzIGFuZCBSZWdpc3RlciBSZWdpb25zCisgICAgICAgKiA+IFJlZ2lzdGVyIFJlZ2lvbiBSZXN0cmljdGlvbnMpCisgICAgICAgKgorICAgICAgICogICAgIDEuIEV4ZWNTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFdpZHRoLgorICAgICAgICoKKyAgICAgICAqICAgICAyLiBJZiBFeGVjU2l6ZSA9IFdpZHRoIGFuZCBIb3J6U3RyaWRlICE9IDAsIFZlcnRTdHJpZGUgbXVzdCBiZSBzZXQKKyAgICAgICAqICAgICAgICB0byBXaWR0aCAqIEhvcnpTdHJpZGUuIgorICAgICAgICovCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKHNyY1tpXS5maWxlID09IEJSV19HRU5FUkFMX1JFR0lTVEVSX0ZJTEUpCisgICAgICAgICAgICBzcmNbaV0gPSBzdHJpZGUoc3JjW2ldLCA0LCA0LCAxKTsKKyAgICAgIH0KKyAgIH0KKworICAgc3dpdGNoIChpci0+b3Bjb2RlKSB7CisgICBjYXNlIEJSV19PUENPREVfTU9WOgorICAgICAgTU9WKGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfQUREOgorICAgICAgQUREKGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9NVUw6CisgICAgICBNVUwoZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX01BQ0g6CisgICAgICBNQUNIKGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9NQUQ6CisgICAgICBNQUQoZHN0LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfRlJDOgorICAgICAgRlJDKGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfUk5ERDoKKyAgICAgIFJOREQoZHN0LCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9STkRFOgorICAgICAgUk5ERShkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX1JORFo6CisgICAgICBSTkRaKGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfQU5EOgorICAgICAgQU5EKGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9PUjoKKyAgICAgIE9SKGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9YT1I6CisgICAgICBYT1IoZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX05PVDoKKyAgICAgIE5PVChkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0FTUjoKKyAgICAgIEFTUihkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfU0hSOgorICAgICAgU0hSKGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9TSEw6CisgICAgICBTSEwoZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0NNUDoKKyAgICAgIENNUChkc3QsIGlyLT5jb25kaXRpb25hbF9tb2QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfU0VMOgorICAgICAgU0VMKGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9EUEg6CisgICAgICBEUEgoZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0RQNDoKKyAgICAgIERQNChkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfRFAzOgorICAgICAgRFAzKGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9EUDI6CisgICAgICBEUDIoZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0YzMlRPMTY6CisgICAgICAvKiBFbXVsYXRlIHRoZSBHZW43IHplcm9pbmcgYnVnLiAqLworICAgICAgTU9WKHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX1VEKSwgYnJ3X2ltbV91ZCgwdSkpOworICAgICAgTU9WKHJldHlwZShkc3QsIEJSV19SRUdJU1RFUl9UWVBFX0hGKSwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfRjE2VE8zMjoKKyAgICAgIE1PVihkc3QsIHJldHlwZShzcmNbMF0sIEJSV19SRUdJU1RFUl9UWVBFX0hGKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0xSUDoKKyAgICAgIExSUChkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9CRlJFVjoKKyAgICAgIC8qIEJGUkVWIG9ubHkgc3VwcG9ydHMgVUQgdHlwZSBmb3Igc3JjIGFuZCBkc3QuICovCisgICAgICBCRlJFVihyZXR5cGUoZHN0LCBCUldfUkVHSVNURVJfVFlQRV9VRCksCisgICAgICAgICAgICByZXR5cGUoc3JjWzBdLCBCUldfUkVHSVNURVJfVFlQRV9VRCkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9GQkg6CisgICAgICAvKiBGQkggb25seSBzdXBwb3J0cyBVRCB0eXBlIGZvciBkc3QuICovCisgICAgICBGQkgocmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9GQkw6CisgICAgICAvKiBGQkwgb25seSBzdXBwb3J0cyBVRCB0eXBlIGZvciBkc3QuICovCisgICAgICBGQkwocmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9DQklUOgorICAgICAgLyogQ0JJVCBvbmx5IHN1cHBvcnRzIFVEIHR5cGUgZm9yIGRzdC4gKi8KKyAgICAgIENCSVQocmV0eXBlKGRzdCwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpLCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9BRERDOgorICAgICAgQUREQyhkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfU1VCQjoKKyAgICAgIFNVQkIoZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0JGRToKKyAgICAgIEJGRShkc3QsIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9CRkkxOgorICAgICAgQkZJMShkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfQkZJMjoKKyAgICAgIEJGSTIoZHN0LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfSUY6CisgICAgICBJRihpci0+cHJlZGljYXRlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfRUxTRToKKyAgICAgIEVMU0UoKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfRU5ESUY6CisgICAgICBFTkRJRigpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9ETzoKKyAgICAgIERPKCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCUldfT1BDT0RFX0JSRUFLOgorICAgICAgQlJFQUsoKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJSV19PUENPREVfQ09OVElOVUU6CisgICAgICBDT05USU5VRSgpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlJXX09QQ09ERV9XSElMRToKKyAgICAgIFdISUxFKCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX1JDUDoKKyAgICAgIE1BVEgoQlJXX01BVEhfRlVOQ1RJT05fSU5WLCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX1JTUToKKyAgICAgIE1BVEgoQlJXX01BVEhfRlVOQ1RJT05fUlNRLCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX1NRUlQ6CisgICAgICBNQVRIKEJSV19NQVRIX0ZVTkNUSU9OX1NRUlQsIGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfRVhQMjoKKyAgICAgIE1BVEgoQlJXX01BVEhfRlVOQ1RJT05fRVhQLCBkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX0xPRzI6CisgICAgICBNQVRIKEJSV19NQVRIX0ZVTkNUSU9OX0xPRywgZHN0LCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9TSU46CisgICAgICBNQVRIKEJSV19NQVRIX0ZVTkNUSU9OX1NJTiwgZHN0LCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9DT1M6CisgICAgICBNQVRIKEJSV19NQVRIX0ZVTkNUSU9OX0NPUywgZHN0LCBzcmNbMF0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9QT1c6CisgICAgICBNQVRIKEJSV19NQVRIX0ZVTkNUSU9OX1BPVywgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9RVU9USUVOVDoKKyAgICAgIE1BVEgoQlJXX01BVEhfRlVOQ1RJT05fSU5UX0RJVl9RVU9USUVOVCwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX0lOVF9SRU1BSU5ERVI6CisgICAgICBNQVRIKEJSV19NQVRIX0ZVTkNUSU9OX0lOVF9ESVZfUkVNQUlOREVSLCBkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfVEVYOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYRDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEY6CisgICBjYXNlIFNIQURFUl9PUENPREVfVFhGX0NNUzoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWEZfTUNTOgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RYTDoKKyAgIGNhc2UgU0hBREVSX09QQ09ERV9UWFM6CisgICBjYXNlIFNIQURFUl9PUENPREVfVEc0OgorICAgY2FzZSBTSEFERVJfT1BDT0RFX1RHNF9PRkZTRVQ6CisgICAgICBnZW5lcmF0ZV90ZXgoaXIsIGRzdCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBWU19PUENPREVfVVJCX1dSSVRFOgorICAgICAgZ2VuZXJhdGVfdXJiX3dyaXRlKGlyLCB0cnVlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfR0VONF9TQ1JBVENIX1JFQUQ6CisgICAgICBnZW5lcmF0ZV9zY3JhdGNoX3JlYWQoaXIsIGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfR0VONF9TQ1JBVENIX1dSSVRFOgorICAgICAgZ2VuZXJhdGVfc2NyYXRjaF93cml0ZShpciwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEOgorICAgY2FzZSBWU19PUENPREVfUFVMTF9DT05TVEFOVF9MT0FEX0dFTjc6CisgICAgICBnZW5lcmF0ZV9wdWxsX2NvbnN0YW50X2xvYWQoaXIsIGRzdCwgc3JjWzBdLCBzcmNbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgR1NfT1BDT0RFX1VSQl9XUklURToKKyAgICAgIGdlbmVyYXRlX3VyYl93cml0ZShpciwgZmFsc2UpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgR1NfT1BDT0RFX1RIUkVBRF9FTkQ6CisgICAgICBnZW5lcmF0ZV9nc190aHJlYWRfZW5kKGlyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdTX09QQ09ERV9TRVRfV1JJVEVfT0ZGU0VUOgorICAgICAgZ2VuZXJhdGVfZ3Nfc2V0X3dyaXRlX29mZnNldChkc3QsIHNyY1swXSwgc3JjWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEdTX09QQ09ERV9TRVRfVkVSVEVYX0NPVU5UOgorICAgICAgZ2VuZXJhdGVfZ3Nfc2V0X3ZlcnRleF9jb3VudChkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBHU19PUENPREVfU0VUX0RXT1JEXzJfSU1NRUQ6CisgICAgICBnZW5lcmF0ZV9nc19zZXRfZHdvcmRfMl9pbW1lZChkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBHU19PUENPREVfUFJFUEFSRV9DSEFOTkVMX01BU0tTOgorICAgICAgZ2VuZXJhdGVfZ3NfcHJlcGFyZV9jaGFubmVsX21hc2tzKGRzdCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBHU19PUENPREVfU0VUX0NIQU5ORUxfTUFTS1M6CisgICAgICBnZW5lcmF0ZV9nc19zZXRfY2hhbm5lbF9tYXNrcyhkc3QsIHNyY1swXSk7CisgICAgICBicmVhazsKKworLy8gICBjYXNlIFNIQURFUl9PUENPREVfU0hBREVSX1RJTUVfQUREOgorLy8gICAgICBhc3NlcnQoISJYWFg6IE1pc3NpbmcgR2VuOCB2ZWM0IHN1cHBvcnQgZm9yIElOVEVMX0RFQlVHPXNoYWRlcl90aW1lIik7CisvLyAgICAgIGJyZWFrOworCisgICBjYXNlIFNIQURFUl9PUENPREVfVU5UWVBFRF9BVE9NSUM6CisgICAgICBnZW5lcmF0ZV91bnR5cGVkX2F0b21pYyhpciwgZHN0LCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSEFERVJfT1BDT0RFX1VOVFlQRURfU1VSRkFDRV9SRUFEOgorICAgICAgZ2VuZXJhdGVfdW50eXBlZF9zdXJmYWNlX3JlYWQoaXIsIGRzdCwgc3JjWzBdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFZTX09QQ09ERV9VTlBBQ0tfRkxBR1NfU0lNRDRYMjoKKyAgICAgIGFzc2VydCghIlZTX09QQ09ERV9VTlBBQ0tfRkxBR1NfU0lNRDRYMiBzaG91bGQgbm90IGJlIHVzZWQgb24gR2VuOCsuIik7CisgICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgIGlmIChpci0+b3Bjb2RlIDwgKGludCkgQVJSQVlfU0laRShvcGNvZGVfZGVzY3MpKSB7CisgICAgICAgICBfbWVzYV9wcm9ibGVtKGN0eCwgIlVuc3VwcG9ydGVkIG9wY29kZSBpbiBgJXMnIGluIFZTXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGVfZGVzY3NbaXItPm9wY29kZV0ubmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgX21lc2FfcHJvYmxlbShjdHgsICJVbnN1cHBvcnRlZCBvcGNvZGUgJWQgaW4gVlMiLCBpci0+b3Bjb2RlKTsKKyAgICAgIH0KKyAgICAgIGFib3J0KCk7CisgICB9Cit9CisKK3ZvaWQKK2dlbjhfdmVjNF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvZGUoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBpbnQgbGFzdF9uYXRpdmVfaW5zdF9vZmZzZXQgPSAwOworICAgY29uc3QgY2hhciAqbGFzdF9hbm5vdGF0aW9uX3N0cmluZyA9IE5VTEw7CisgICBjb25zdCB2b2lkICpsYXN0X2Fubm90YXRpb25faXIgPSBOVUxMOworCisgICBpZiAodW5saWtlbHkoZGVidWdfZmxhZykpIHsKKyAgICAgIGlmIChzaGFkZXJfcHJvZykgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJOYXRpdmUgY29kZSBmb3IgJXMgdmVydGV4IHNoYWRlciAlZDpcbiIsCisgICAgICAgICAgICAgICAgIHNoYWRlcl9wcm9nLT5MYWJlbCA/IHNoYWRlcl9wcm9nLT5MYWJlbCA6ICJ1bm5hbWVkIiwKKyAgICAgICAgICAgICAgICAgc2hhZGVyX3Byb2ctPk5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTmF0aXZlIGNvZGUgZm9yIHZlcnRleCBwcm9ncmFtICVkOlxuIiwgcHJvZy0+SWQpOworICAgICAgfQorICAgfQorCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICB2ZWM0X2luc3RydWN0aW9uICppciA9ICh2ZWM0X2luc3RydWN0aW9uICopIG5vZGU7CisgICAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmNbM10sIGRzdDsKKworICAgICAgaWYgKHVubGlrZWx5KGRlYnVnX2ZsYWcpKSB7CisgICAgICAgICBpZiAobGFzdF9hbm5vdGF0aW9uX2lyICE9IGlyLT5pcikgeworICAgICAgICAgICAgbGFzdF9hbm5vdGF0aW9uX2lyID0gaXItPmlyOworICAgICAgICAgICAgaWYgKGxhc3RfYW5ub3RhdGlvbl9pcikgeworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAiKTsKKyAgICAgICAgICAgICAgIGlmIChzaGFkZXJfcHJvZykgeworICAgICAgICAgICAgICAgICAgKChpcl9pbnN0cnVjdGlvbiAqKSBsYXN0X2Fubm90YXRpb25faXIpLT5mcHJpbnQoc3RkZXJyKTsKKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBjb25zdCBwcm9nX2luc3RydWN0aW9uICp2cGk7CisgICAgICAgICAgICAgICAgICB2cGkgPSAoY29uc3QgcHJvZ19pbnN0cnVjdGlvbiAqKSBpci0+aXI7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiAiLCAoaW50KSh2cGkgLSBwcm9nLT5JbnN0cnVjdGlvbnMpKTsKKyAgICAgICAgICAgICAgICAgIF9tZXNhX2ZwcmludF9pbnN0cnVjdGlvbl9vcHQoc3RkZXJyLCB2cGksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0dfUFJJTlRfREVCVUcsIE5VTEwpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgaWYgKGxhc3RfYW5ub3RhdGlvbl9zdHJpbmcgIT0gaXItPmFubm90YXRpb24pIHsKKyAgICAgICAgICAgIGxhc3RfYW5ub3RhdGlvbl9zdHJpbmcgPSBpci0+YW5ub3RhdGlvbjsKKyAgICAgICAgICAgIGlmIChsYXN0X2Fubm90YXRpb25fc3RyaW5nKQorICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAlc1xuIiwgbGFzdF9hbm5vdGF0aW9uX3N0cmluZyk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICBzcmNbaV0gPSBpci0+Z2V0X3NyYyhwcm9nX2RhdGEsIGkpOworICAgICAgfQorICAgICAgZHN0ID0gaXItPmdldF9kc3QoKTsKKworICAgICAgZGVmYXVsdF9zdGF0ZS5jb25kaXRpb25hbF9tb2QgPSBpci0+Y29uZGl0aW9uYWxfbW9kOworICAgICAgZGVmYXVsdF9zdGF0ZS5wcmVkaWNhdGUgPSBpci0+cHJlZGljYXRlOworICAgICAgZGVmYXVsdF9zdGF0ZS5wcmVkaWNhdGVfaW52ZXJzZSA9IGlyLT5wcmVkaWNhdGVfaW52ZXJzZTsKKyAgICAgIGRlZmF1bHRfc3RhdGUuc2F0dXJhdGUgPSBpci0+c2F0dXJhdGU7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIHByZV9lbWl0X25yX2luc3QgPSBucl9pbnN0OworCisgICAgICBnZW5lcmF0ZV92ZWM0X2luc3RydWN0aW9uKGlyLCBkc3QsIHNyYyk7CisKKyAgICAgIGlmIChpci0+bm9fZGRfY2xlYXIgfHwgaXItPm5vX2RkX2NoZWNrKSB7CisgICAgICAgICBhc3NlcnQobnJfaW5zdCA9PSBwcmVfZW1pdF9ucl9pbnN0ICsgMSB8fAorICAgICAgICAgICAgICAgICEibm9fZGRfY2hlY2sgb3Igbm9fZGRfY2xlYXIgc2V0IGZvciBJUiBlbWl0dGluZyBtb3JlICIKKyAgICAgICAgICAgICAgICAgInRoYW4gMSBpbnN0cnVjdGlvbiIpOworCisgICAgICAgICBnZW44X2luc3RydWN0aW9uICpsYXN0ID0gJnN0b3JlW3ByZV9lbWl0X25yX2luc3RdOworICAgICAgICAgZ2VuOF9zZXRfbm9fZGRfY2xlYXIobGFzdCwgaXItPm5vX2RkX2NsZWFyKTsKKyAgICAgICAgIGdlbjhfc2V0X25vX2RkX2NoZWNrKGxhc3QsIGlyLT5ub19kZF9jaGVjayk7CisgICAgICB9CisKKyAgICAgIGlmICh1bmxpa2VseShkZWJ1Z19mbGFnKSkgeworICAgICAgICAgZGlzYXNzZW1ibGUoc3RkZXJyLCBsYXN0X25hdGl2ZV9pbnN0X29mZnNldCwgbmV4dF9pbnN0X29mZnNldCk7CisgICAgICB9CisKKyAgICAgIGxhc3RfbmF0aXZlX2luc3Rfb2Zmc2V0ID0gbmV4dF9pbnN0X29mZnNldDsKKyAgIH0KKworICAgaWYgKHVubGlrZWx5KGRlYnVnX2ZsYWcpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICB9CisKKyAgIHBhdGNoX2p1bXBfdGFyZ2V0cygpOworCisgICAvKiBPSywgd2hpbGUgdGhlIElOVEVMX0RFQlVHPXZzIGFib3ZlIGlzIHZlcnkgbmljZSBmb3IgZGVidWdnaW5nIFZTCisgICAgKiBlbWl0IGlzc3VlcywgaXQgZG9lc24ndCBnZXQgdGhlIGp1bXAgZGlzdGFuY2VzIGludG8gdGhlIG91dHB1dCwKKyAgICAqIHdoaWNoIGlzIG9mdGVuIHNvbWV0aGluZyB3ZSB3YW50IHRvIGRlYnVnLiAgU28gdGhpcyBpcyBoZXJlIGluCisgICAgKiBjYXNlIHlvdSdyZSBkb2luZyB0aGF0LgorICAgICovCisgICBpZiAoMCAmJiB1bmxpa2VseShkZWJ1Z19mbGFnKSkgeworICAgICAgZGlzYXNzZW1ibGUoc3RkZXJyLCAwLCBuZXh0X2luc3Rfb2Zmc2V0KTsKKyAgIH0KK30KKworY29uc3QgdW5zaWduZWQgKgorZ2VuOF92ZWM0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzZW1ibHkoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqYXNzZW1ibHlfc2l6ZSkKK3sKKyAgIGRlZmF1bHRfc3RhdGUuYWNjZXNzX21vZGUgPSBCUldfQUxJR05fMTY7CisgICBkZWZhdWx0X3N0YXRlLmV4ZWNfc2l6ZSA9IEJSV19FWEVDVVRFXzg7CisgICBnZW5lcmF0ZV9jb2RlKGluc3RydWN0aW9ucyk7CisgICAqYXNzZW1ibHlfc2l6ZSA9IG5leHRfaW5zdF9vZmZzZXQ7CisgICByZXR1cm4gKGNvbnN0IHVuc2lnbmVkICopIHN0b3JlOworfQorCit9IC8qIG5hbWVzcGFjZSBicncgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9pbnRlbF9jaGlwc2V0LmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfY2hpcHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjBkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfY2hpcHNldC5oCkBAIC0wLDAgKzEsMjQ2IEBACisgLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgUENJX0NISVBfSUdEX0dNCQkJMHhBMDExCisjZGVmaW5lIFBDSV9DSElQX0lHRF9HCQkJMHhBMDAxCisKKyNkZWZpbmUgSVNfSUdER00oZGV2aWQpCShkZXZpZCA9PSBQQ0lfQ0hJUF9JR0RfR00pCisjZGVmaW5lIElTX0lHREcoZGV2aWQpCShkZXZpZCA9PSBQQ0lfQ0hJUF9JR0RfRykKKyNkZWZpbmUgSVNfSUdEKGRldmlkKSAoSVNfSUdERyhkZXZpZCkgfHwgSVNfSUdER00oZGV2aWQpKQorCisjZGVmaW5lIFBDSV9DSElQX0k5NjVfRwkJCTB4MjlBMgorI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X1EJCQkweDI5OTIKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HXzEJCTB4Mjk4MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTQ2X0daCQkweDI5NzIKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HTSAgICAgICAgICAgICAgICAweDJBMDIKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HTUUgICAgICAgICAgICAgICAweDJBMTIKKworI2RlZmluZSBQQ0lfQ0hJUF9HTTQ1X0dNICAgICAgICAgICAgICAgIDB4MkE0MgorCisjZGVmaW5lIFBDSV9DSElQX0lHRF9FX0cgICAgICAgICAgICAgICAgMHgyRTAyCisjZGVmaW5lIFBDSV9DSElQX1E0NV9HICAgICAgICAgICAgICAgICAgMHgyRTEyCisjZGVmaW5lIFBDSV9DSElQX0c0NV9HICAgICAgICAgICAgICAgICAgMHgyRTIyCisjZGVmaW5lIFBDSV9DSElQX0c0MV9HICAgICAgICAgICAgICAgICAgMHgyRTMyCisjZGVmaW5lIFBDSV9DSElQX0I0M19HICAgICAgICAgICAgICAgICAgMHgyRTQyCisjZGVmaW5lIFBDSV9DSElQX0I0M19HMSAgICAgICAgICAgICAgICAgMHgyRTkyCisKKyNkZWZpbmUgUENJX0NISVBfSUxEX0cgICAgICAgICAgICAgICAgICAweDAwNDIKKyNkZWZpbmUgUENJX0NISVBfSUxNX0cgICAgICAgICAgICAgICAgICAweDAwNDYKKworI2RlZmluZSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9HVDEJMHgwMTAyCS8qIERlc2t0b3AgKi8KKyNkZWZpbmUgUENJX0NISVBfU0FORFlCUklER0VfR1QyCTB4MDExMgorI2RlZmluZSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9HVDJfUExVUwkweDAxMjIKKyNkZWZpbmUgUENJX0NISVBfU0FORFlCUklER0VfTV9HVDEJMHgwMTA2CS8qIE1vYmlsZSAqLworI2RlZmluZSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9NX0dUMgkweDAxMTYKKyNkZWZpbmUgUENJX0NISVBfU0FORFlCUklER0VfTV9HVDJfUExVUwkweDAxMjYKKyNkZWZpbmUgUENJX0NISVBfU0FORFlCUklER0VfUwkJMHgwMTBBCS8qIFNlcnZlciAqLworCisjZGVmaW5lIFBDSV9DSElQX0lWWUJSSURHRV9HVDEgICAgICAgICAgMHgwMTUyICAvKiBEZXNrdG9wICovCisjZGVmaW5lIFBDSV9DSElQX0lWWUJSSURHRV9HVDIgICAgICAgICAgMHgwMTYyCisjZGVmaW5lIFBDSV9DSElQX0lWWUJSSURHRV9NX0dUMSAgICAgICAgMHgwMTU2ICAvKiBNb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX01fR1QyICAgICAgICAweDAxNjYKKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX1NfR1QxICAgICAgICAweDAxNWEgIC8qIFNlcnZlciAqLworI2RlZmluZSBQQ0lfQ0hJUF9JVllCUklER0VfU19HVDIgICAgICAgIDB4MDE2YQorCisjZGVmaW5lIFBDSV9DSElQX0JBWVRSQUlMX01fMSAgICAgICAgICAgMHgwRjMxCisjZGVmaW5lIFBDSV9DSElQX0JBWVRSQUlMX01fMiAgICAgICAgICAgMHgwRjMyCisjZGVmaW5lIFBDSV9DSElQX0JBWVRSQUlMX01fMyAgICAgICAgICAgMHgwRjMzCisjZGVmaW5lIFBDSV9DSElQX0JBWVRSQUlMX01fNCAgICAgICAgICAgMHgwMTU3CisjZGVmaW5lIFBDSV9DSElQX0JBWVRSQUlMX0QgICAgICAgICAgICAgMHgwMTU1CisKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9HVDEgICAgICAgICAgICAweDA0MDIgLyogRGVza3RvcCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0dUMiAgICAgICAgICAgIDB4MDQxMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0dUMyAgICAgICAgICAgIDB4MDQyMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX01fR1QxICAgICAgICAgIDB4MDQwNiAvKiBNb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9NX0dUMiAgICAgICAgICAweDA0MTYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9NX0dUMyAgICAgICAgICAweDA0MjYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TX0dUMSAgICAgICAgICAweDA0MEEgLyogU2VydmVyICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU19HVDIgICAgICAgICAgMHgwNDFBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU19HVDMgICAgICAgICAgMHgwNDJBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQl9HVDEgICAgICAgICAgMHgwNDBCIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQl9HVDIgICAgICAgICAgMHgwNDFCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQl9HVDMgICAgICAgICAgMHgwNDJCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfRV9HVDEgICAgICAgICAgMHgwNDBFIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfRV9HVDIgICAgICAgICAgMHgwNDFFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfRV9HVDMgICAgICAgICAgMHgwNDJFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX0dUMSAgICAgICAgMHgwQzAyIC8qIERlc2t0b3AgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfR1QyICAgICAgICAweDBDMTIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfR1QzICAgICAgICAweDBDMjIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfTV9HVDEgICAgICAweDBDMDYgLyogTW9iaWxlICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX01fR1QyICAgICAgMHgwQzE2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX01fR1QzICAgICAgMHgwQzI2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX1NfR1QxICAgICAgMHgwQzBBIC8qIFNlcnZlciAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMiAgICAgIDB4MEMxQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMyAgICAgIDB4MEMyQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9CX0dUMSAgICAgIDB4MEMwQiAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9CX0dUMiAgICAgIDB4MEMxQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9CX0dUMyAgICAgIDB4MEMyQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9FX0dUMSAgICAgIDB4MEMwRSAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9FX0dUMiAgICAgIDB4MEMxRQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9FX0dUMyAgICAgIDB4MEMyRQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9HVDEgICAgICAgIDB4MEEwMiAvKiBEZXNrdG9wICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0dUMiAgICAgICAgMHgwQTEyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0dUMyAgICAgICAgMHgwQTIyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX01fR1QxICAgICAgMHgwQTA2IC8qIE1vYmlsZSAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMiAgICAgIDB4MEExNgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMyAgICAgIDB4MEEyNgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9TX0dUMSAgICAgIDB4MEEwQSAvKiBTZXJ2ZXIgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfU19HVDIgICAgICAweDBBMUEKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfU19HVDMgICAgICAweDBBMkEKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDEgICAgICAweDBBMEIgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDIgICAgICAweDBBMUIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDMgICAgICAweDBBMkIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfRV9HVDEgICAgICAweDBBMEUgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfRV9HVDIgICAgICAweDBBMUUKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfRV9HVDMgICAgICAweDBBMkUKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfR1QxICAgICAgICAweDBEMDIgLyogRGVza3RvcCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19HVDIgICAgICAgIDB4MEQxMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19HVDMgICAgICAgIDB4MEQyMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19NX0dUMSAgICAgIDB4MEQwNiAvKiBNb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfTV9HVDIgICAgICAweDBEMTYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfTV9HVDMgICAgICAweDBEMjYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfU19HVDEgICAgICAweDBEMEEgLyogU2VydmVyICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX1NfR1QyICAgICAgMHgwRDFBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX1NfR1QzICAgICAgMHgwRDJBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0JfR1QxICAgICAgMHgwRDBCIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0JfR1QyICAgICAgMHgwRDFCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0JfR1QzICAgICAgMHgwRDJCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QxICAgICAgMHgwRDBFIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QyICAgICAgMHgwRDFFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QzICAgICAgMHgwRDJFCisKKyNkZWZpbmUgSVNfRzQ1KGRldmlkKSAgICAgICAgICAgKGRldmlkID09IFBDSV9DSElQX0lHRF9FX0cgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWQgPT0gUENJX0NISVBfUTQ1X0cgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWQgPT0gUENJX0NISVBfRzQ1X0cgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWQgPT0gUENJX0NISVBfRzQxX0cgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWQgPT0gUENJX0NISVBfQjQzX0cgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWQgPT0gUENJX0NISVBfQjQzX0cxKQorI2RlZmluZSBJU19HTTQ1KGRldmlkKSAgICAgICAgICAoZGV2aWQgPT0gUENJX0NISVBfR000NV9HTSkKKyNkZWZpbmUgSVNfRzRYKGRldmlkKQkJKElTX0c0NShkZXZpZCkgfHwgSVNfR000NShkZXZpZCkpCisKKyNkZWZpbmUgSVNfSUxEKGRldmlkKSAgICAgICAgICAgKGRldmlkID09IFBDSV9DSElQX0lMRF9HKQorI2RlZmluZSBJU19JTE0oZGV2aWQpICAgICAgICAgICAoZGV2aWQgPT0gUENJX0NISVBfSUxNX0cpCisjZGVmaW5lIElTX0dFTjUoZGV2aWQpICAgICAgICAgIChJU19JTEQoZGV2aWQpIHx8IElTX0lMTShkZXZpZCkpCisKKyNkZWZpbmUgSVNfU05CX0dUMShkZXZpZCkJKGRldmlkID09IFBDSV9DSElQX1NBTkRZQlJJREdFX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QxIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfU0FORFlCUklER0VfUykKKworI2RlZmluZSBJU19TTkJfR1QyKGRldmlkKQkoZGV2aWQgPT0gUENJX0NISVBfU0FORFlCUklER0VfR1QyIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfU0FORFlCUklER0VfR1QyX1BMVVMJfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9NX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QyX1BMVVMpCisKKyNkZWZpbmUgSVNfR0VONihkZXZpZCkJCShJU19TTkJfR1QxKGRldmlkKSB8fCBJU19TTkJfR1QyKGRldmlkKSkKKworI2RlZmluZSBJU19JVkJfR1QxKGRldmlkKSAgICAgICAoZGV2aWQgPT0gUENJX0NISVBfSVZZQlJJREdFX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0lWWUJSSURHRV9NX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0lWWUJSSURHRV9TX0dUMSkKKworI2RlZmluZSBJU19JVkJfR1QyKGRldmlkKSAgICAgICAoZGV2aWQgPT0gUENJX0NISVBfSVZZQlJJREdFX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0lWWUJSSURHRV9NX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0lWWUJSSURHRV9TX0dUMikKKworI2RlZmluZSBJU19JVllCUklER0UoZGV2aWQpICAgICAoSVNfSVZCX0dUMShkZXZpZCkgfHwgSVNfSVZCX0dUMihkZXZpZCkpCisKKyNkZWZpbmUgSVNfQkFZVFJBSUwoZGV2aWQpICAgICAgKGRldmlkID09IFBDSV9DSElQX0JBWVRSQUlMX01fMSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpZCA9PSBQQ0lfQ0hJUF9CQVlUUkFJTF9NXzIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWQgPT0gUENJX0NISVBfQkFZVFJBSUxfTV8zIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmlkID09IFBDSV9DSElQX0JBWVRSQUlMX01fNCB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpZCA9PSBQQ0lfQ0hJUF9CQVlUUkFJTF9EKQorCisjZGVmaW5lIElTX0dFTjcoZGV2aWQpCSAgICAgICAgKElTX0lWWUJSSURHRShkZXZpZCkgfHwgXAorCQkJCSBJU19CQVlUUkFJTChkZXZpZCkgfHwgXAorCQkJCSBJU19IQVNXRUxMKGRldmlkKSkKKworI2RlZmluZSBJU19IU1dfR1QxKGRldmlkKQkoZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9HVDEgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX01fR1QxIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQl9HVDEgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0VfR1QxIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfR1QxIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfTV9HVDEgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0JfR1QxIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfRV9HVDEgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9HVDEgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfVUxUX1NfR1QxIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDEgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9FX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX01fR1QxIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfU19HVDEgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19CX0dUMSB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QxKQorI2RlZmluZSBJU19IU1dfR1QyKGRldmlkKQkoZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9HVDIgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX01fR1QyIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQl9HVDIgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0VfR1QyIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfR1QyIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfTV9HVDIgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0JfR1QyIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfRV9HVDIgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9HVDIgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfVUxUX1NfR1QyIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDIgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9FX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX01fR1QyIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfU19HVDIgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19CX0dUMiB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QyKQorI2RlZmluZSBJU19IU1dfR1QzKGRldmlkKQkoZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9HVDMgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX01fR1QzIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TX0dUMyB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQl9HVDMgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0VfR1QzIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfR1QzIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfTV9HVDMgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMyB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0JfR1QzIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfRV9HVDMgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9HVDMgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMyB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfVUxUX1NfR1QzIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDMgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9FX0dUMyB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0dUMyB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX01fR1QzIHx8IFwKKwkJCQkgZGV2aWQgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfU19HVDMgfHwgXAorCQkJCSBkZXZpZCA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19CX0dUMyB8fCBcCisJCQkJIGRldmlkID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QzKQorCisjZGVmaW5lIElTX0hBU1dFTEwoZGV2aWQpICAgICAgIChJU19IU1dfR1QxKGRldmlkKSB8fCBcCisJCQkJIElTX0hTV19HVDIoZGV2aWQpIHx8IFwKKwkJCQkgSVNfSFNXX0dUMyhkZXZpZCkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfZGVidWcuYyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9pbnRlbF9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGEzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfZGVidWcuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMgVk13YXJlLCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGludGVsX2RlYnVnLmMKKyAqCisgKiBTdXBwb3J0IGZvciB0aGUgSU5URUxfREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFsb25nIHdpdGggb3RoZXIKKyAqIG1pc2NlbGxhbmVvdXMgZGVidWdnaW5nIGNvZGUuCisgKi8KKworI2luY2x1ZGUgImJyd19jb250ZXh0LmgiCisjaW5jbHVkZSAiaW50ZWxfZGVidWcuaCIKKy8vI2luY2x1ZGUgInV0aWxzLmgiICAvLyBMdW5hckcgOgorCisvL3VpbnQ2NF90IElOVEVMX0RFQlVHID0gREVCVUdfV00gfCBERUJVR19OTzE2IHwgREVCVUdfR1MgfCBERUJVR19WUzsKK3VpbnQ2NF90IElOVEVMX0RFQlVHID0gMDsKKworLy9zdGF0aWMgY29uc3Qgc3RydWN0IGRyaV9kZWJ1Z19jb250cm9sIGRlYnVnX2NvbnRyb2xbXSA9IHsKKy8vICAgeyAidGV4IiwgICBERUJVR19URVhUVVJFfSwKKy8vICAgeyAic3RhdGUiLCBERUJVR19TVEFURX0sCisvLyAgIHsgImJsaXQiLCAgREVCVUdfQkxJVH0sCisvLyAgIHsgIm1pcCIsICAgREVCVUdfTUlQVFJFRX0sCisvLyAgIHsgImZhbGwiLCAgREVCVUdfUEVSRn0sCisvLyAgIHsgInBlcmYiLCAgREVCVUdfUEVSRn0sCisvLyAgIHsgInBlcmZtb24iLCBERUJVR19QRVJGTU9OfSwKKy8vICAgeyAiYmF0IiwgICBERUJVR19CQVRDSH0sCisvLyAgIHsgInBpeCIsICAgREVCVUdfUElYRUx9LAorLy8gICB7ICJidWYiLCAgIERFQlVHX0JVRk1HUn0sCisvLyAgIHsgImZibyIsICAgREVCVUdfRkJPfSwKKy8vICAgeyAiZnMiLCAgICBERUJVR19XTSB9LAorLy8gICB7ICJncyIsICAgIERFQlVHX0dTfSwKKy8vICAgeyAic3luYyIsICBERUJVR19TWU5DfSwKKy8vICAgeyAicHJpbSIsICBERUJVR19QUklNUyB9LAorLy8gICB7ICJ2ZXJ0IiwgIERFQlVHX1ZFUlRTIH0sCisvLyAgIHsgImRyaSIsICAgREVCVUdfRFJJIH0sCisvLyAgIHsgInNmIiwgICAgREVCVUdfU0YgfSwKKy8vICAgeyAic3RhdHMiLCBERUJVR19TVEFUUyB9LAorLy8gICB7ICJ3bSIsICAgIERFQlVHX1dNIH0sCisvLyAgIHsgInVyYiIsICAgREVCVUdfVVJCIH0sCisvLyAgIHsgInZzIiwgICAgREVCVUdfVlMgfSwKKy8vICAgeyAiY2xpcCIsICBERUJVR19DTElQIH0sCisvLyAgIHsgImF1YiIsICAgREVCVUdfQVVCIH0sCisvLyAgIHsgInNoYWRlcl90aW1lIiwgREVCVUdfU0hBREVSX1RJTUUgfSwKKy8vICAgeyAibm8xNiIsICBERUJVR19OTzE2IH0sCisvLyAgIHsgImJsb3JwIiwgREVCVUdfQkxPUlAgfSwKKy8vICAgeyAibm9kdWFsb2JqIiwgREVCVUdfTk9fRFVBTF9PQkpFQ1RfR1MgfSwKKy8vICAgeyBOVUxMLCAgICAwIH0KKy8vfTsKKwordm9pZAorYnJ3X3Byb2Nlc3NfaW50ZWxfZGVidWdfdmFyaWFibGUoc3RydWN0IGJyd19jb250ZXh0ICpicncpCit7CisgICAvLyBMdW5hckcgOiBGb3Igbm93LCBsZXQncyBoYXJkIGNvZGUgb3VyIGRlYnVnIHZhcmlhYmxlcworICAgSU5URUxfREVCVUcgPSAwOworCisvLyAgIElOVEVMX0RFQlVHID0gZHJpUGFyc2VEZWJ1Z1N0cmluZyhnZXRlbnYoIklOVEVMX0RFQlVHIiksIGRlYnVnX2NvbnRyb2wpOworLy8gICBpZiAoSU5URUxfREVCVUcgJiBERUJVR19CVUZNR1IpCisvLyAgICAgIGRyaV9idWZtZ3Jfc2V0X2RlYnVnKGJydy0+YnVmbWdyLCB0cnVlKTsKKworLy8gICBpZiAoKElOVEVMX0RFQlVHICYgREVCVUdfU0hBREVSX1RJTUUpICYmIGJydy0+Z2VuIDwgNykgeworLy8gICAgICBmcHJpbnRmKHN0ZGVyciwKKy8vICAgICAgICAgICAgICAic2hhZGVyX3RpbWUgZGVidWdnaW5nIHJlcXVpcmVzIGdlbjcgKEl2eWJyaWRnZSkgb3IgYmV0dGVyLlxuIik7CisvLyAgICAgIElOVEVMX0RFQlVHICY9IH5ERUJVR19TSEFERVJfVElNRTsKKy8vICAgfQorCisvLyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX1BFUkYpCisvLyAgICAgIGJydy0+cGVyZl9kZWJ1ZyA9IHRydWU7CisKKy8vICAgaWYgKElOVEVMX0RFQlVHICYgREVCVUdfQVVCKQorLy8gICAgICBkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2R1bXAoYnJ3LT5idWZtZ3IsIHRydWUpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX2RlYnVnLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDAyY2VjCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX2RlYnVnLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBWTXdhcmUsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNwcmFnbWEgb25jZQorCisvKioKKyAqIFxmaWxlIGludGVsX2RlYnVnLmgKKyAqCisgKiBCYXNpYyBJTlRFTF9ERUJVRyBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYW5kbGluZy4gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZQorICogbGlzdCBvZiBkZWJ1Z2dpbmcgZmxhZ3MsIGFzIHdlbGwgYXMgc29tZSBtYWNyb3MgZm9yIGhhbmRsaW5nIHRoZW0uCisgKi8KKworZXh0ZXJuIHVpbnQ2NF90IElOVEVMX0RFQlVHOworCisjZGVmaW5lIERFQlVHX1RFWFRVUkUJICAweDEKKyNkZWZpbmUgREVCVUdfU1RBVEUJICAweDIKKyNkZWZpbmUgREVCVUdfQkxJVAkgIDB4OAorI2RlZmluZSBERUJVR19NSVBUUkVFICAgICAweDEwCisjZGVmaW5lIERFQlVHX1BFUkYJICAweDIwCisjZGVmaW5lIERFQlVHX1BFUkZNT04gICAgIDB4NDAKKyNkZWZpbmUgREVCVUdfQkFUQ0ggICAgICAgMHg4MAorI2RlZmluZSBERUJVR19QSVhFTCAgICAgICAweDEwMAorI2RlZmluZSBERUJVR19CVUZNR1IgICAgICAweDIwMAorI2RlZmluZSBERUJVR19GQk8gICAgICAgICAweDgwMAorI2RlZmluZSBERUJVR19HUyAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgREVCVUdfU1lOQwkgIDB4MjAwMAorI2RlZmluZSBERUJVR19QUklNUwkgIDB4NDAwMAorI2RlZmluZSBERUJVR19WRVJUUwkgIDB4ODAwMAorI2RlZmluZSBERUJVR19EUkkgICAgICAgICAweDEwMDAwCisjZGVmaW5lIERFQlVHX1NGICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgREVCVUdfU1RBVFMgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgREVCVUdfV00gICAgICAgICAgMHg0MDAwMDAKKyNkZWZpbmUgREVCVUdfVVJCICAgICAgICAgMHg4MDAwMDAKKyNkZWZpbmUgREVCVUdfVlMgICAgICAgICAgMHgxMDAwMDAwCisjZGVmaW5lIERFQlVHX0NMSVAgICAgICAgIDB4MjAwMDAwMAorI2RlZmluZSBERUJVR19BVUIgICAgICAgICAweDQwMDAwMDAKKyNkZWZpbmUgREVCVUdfU0hBREVSX1RJTUUgMHg4MDAwMDAwCisjZGVmaW5lIERFQlVHX0JMT1JQICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgREVCVUdfTk8xNiAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBERUJVR19WVUUgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIERFQlVHX05PX0RVQUxfT0JKRUNUX0dTIDB4ODAwMDAwMDAKKworI2lmZGVmIEhBVkVfQU5EUk9JRF9QTEFURk9STQorI2RlZmluZSBMT0dfVEFHICJJTlRFTC1NRVNBIgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpZm5kZWYgQUxPR1cKKyNkZWZpbmUgQUxPR1cgTE9HVworI2VuZGlmCisjZGVmaW5lIGRiZ19wcmludGYoLi4uKQlBTE9HVyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIGRiZ19wcmludGYoLi4uKQlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pCisjZW5kaWYgLyogSEFWRV9BTkRST0lEX1BMQVRGT1JNICovCisKKyNkZWZpbmUgREJHKC4uLikgZG8gewkJCQkJCVwKKwlpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBGSUxFX0RFQlVHX0ZMQUcpKQkJXAorCQlkYmdfcHJpbnRmKF9fVkFfQVJHU19fKTsJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgcGVyZl9kZWJ1ZyguLi4pIGRvIHsJCQkJCVwKKyAgIHN0YXRpYyBHTHVpbnQgbXNnX2lkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19QRVJGKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGJnX3ByaW50ZihfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGlmIChicnctPnBlcmZfZGVidWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfbWVzYV9nbF9kZWJ1ZygmYnJ3LT5jdHgsICZtc2dfaWQsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgTUVTQV9ERUJVR19UWVBFX1BFUkZPUk1BTkNFLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIE1FU0FfREVCVUdfU0VWRVJJVFlfTUVESVVNLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIFdBUk5fT05DRShjb25kLCBmbXQuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgaWYgKHVubGlrZWx5KGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YXRpYyBib29sIF93YXJuZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGF0aWMgR0x1aW50IG1zZ19pZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKCFfd2FybmVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogIik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgZm10KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgX3dhcm5lZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfbWVzYV9nbF9kZWJ1ZyhjdHgsICZtc2dfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgTUVTQV9ERUJVR19UWVBFX09USEVSLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FU0FfREVCVUdfU0VWRVJJVFlfSElHSCwgZm10KTsgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0cnVjdCBicndfY29udGV4dDsKKworZXh0ZXJuIHZvaWQgYnJ3X3Byb2Nlc3NfaW50ZWxfZGVidWdfdmFyaWFibGUoc3RydWN0IGJyd19jb250ZXh0ICpicncpOwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX21pcG1hcF90cmVlLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfbWlwbWFwX3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjVmNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX21pcG1hcF90cmVlLmgKQEAgLTAsMCArMSw3MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDA2IFZNd2FyZSwgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBWTVdBUkUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQGZpbGUgaW50ZWxfbWlwbWFwX3RyZWUuaAorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgdGhhdCB3cmFwcyBhIEJPIGFuZCBkZXNjcmliZXMgaG93IHRoZQorICogbWlwbWFwIGxldmVscyBhbmQgc2xpY2VzIG9mIGEgdGV4dHVyZSBhcmUgbGFpZCBvdXQuCisgKgorICogVGhlIGhhcmR3YXJlIGhhcyBhIGZpeGVkIGxheW91dCBvZiBhIHRleHR1cmUgZGVwZW5kaW5nIG9uIHBhcmFtZXRlcnMgc3VjaAorICogYXMgdGhlIHRhcmdldC90eXBlICgyRCwgM0QsIENVQkUpLCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCwgYW5kIG51bWJlciBvZgorICogbWlwbWFwIGxldmVscy4gIFRoZSBpbmRpdmlkdWFsIGxldmVsL2xheWVyIHNsaWNlcyBhcmUgZWFjaCAyRCByZWN0YW5nbGVzIG9mCisgKiBwaXhlbHMgYXQgc29tZSB4L3kgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkcm1faW50ZWxfYm8uCisgKgorICogT3JpZ2luYWwgT3BlbkdMIGFsbG93ZWQgdGV4dHVyZSBtaXBsZXZlbHMgdG8gYmUgc3BlY2lmaWVkIGluIGFyYml0cmFyeQorICogb3JkZXIsIGFuZCBhIHRleHR1cmUgbWF5IGNoYW5nZSBzaXplIG92ZXIgdGltZS4gIFRodXMsIGVhY2gKKyAqIGludGVsX3RleHR1cmVfaW1hZ2UgaGFzIGEgcmVmZXJlbmNlIHRvIGEgbWlwdHJlZSB0aGF0IGNvbnRhaW5zIHRoZSBwaXhlbAorICogZGF0YSBzaXplZCBhcHByb3ByaWF0ZWx5IGZvciBpdCwgd2hpY2ggd2lsbCBsYXRlciBiZSByZWZlcmVuY2VkIGJ5L2NvcGllZAorICogdG8gdGhlIGludGVsX3RleHR1cmVfb2JqZWN0IGF0IGRyYXcgdGltZSAoaW50ZWxfZmluYWxpemVfbWlwbWFwX3RyZWUoKSkgc28KKyAqIHRoYXQgdGhlcmUncyBhIHNpbmdsZSBtaXB0cmVlIGZvciB0aGUgY29tcGxldGUgdGV4dHVyZS4KKyAqLworCisjaWZuZGVmIElOVEVMX01JUE1BUF9UUkVFX0gKKyNkZWZpbmUgSU5URUxfTUlQTUFQX1RSRUVfSAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgImludGVsX3Jlc29sdmVfbWFwLmgiCisjaW5jbHVkZSA8R0wvaW50ZXJuYWwvZHJpX2ludGVyZmFjZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBicndfY29udGV4dDsKK3N0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXI7CisKK3N0cnVjdCBpbnRlbF9yZXNvbHZlX21hcDsKK3N0cnVjdCBpbnRlbF90ZXh0dXJlX2ltYWdlOworCisvKioKKyAqIFdoZW4gY2FsbGluZyBpbnRlbF9taXB0cmVlX21hcCgpIG9uIGFuIEVUQy10cmFuc2NvZGVkLXRvLVJHQiBtaXB0cmVlIG9yIGEKKyAqIGRlcHRoc3RlbmNpbC1zcGxpdC10by1zZXBhcmF0ZS1zdGVuY2lsIG1pcHRyZWUsIHdlJ2xsIG5vcm1hbGx5IG1ha2UgYQorICogdG1lcG9yYXJ5IGFuZCByZWNyZWF0ZSB0aGUga2luZCBvZiBkYXRhIHJlcXVlc3RlZCBieSBNZXNhIGNvcmUsIHNpbmNlIHdlJ3JlCisgKiBzYXRpc2Z5aW5nIHNvbWUgZ2xHZXRUZXhJbWFnZSgpIHJlcXVlc3Qgb3Igc29tZXRoaW5nLgorICoKKyAqIEhvd2V2ZXIsIG9jY2FzaW9uYWxseSB5b3Ugd2FudCB0byBhY3R1YWxseSBtYXAgdGhlIG1pcHRyZWUncyBjdXJyZW50IGRhdGEKKyAqIHdpdGhvdXQgdHJhbnNjb2RpbmcgYmFjay4gIFRoaXMgZmxhZyB0byBpbnRlbF9taXB0cmVlX21hcCgpIGdldHMgeW91IHRoYXQuCisgKi8KKyNkZWZpbmUgQlJXX01BUF9ESVJFQ1RfQklUCTB4ODAwMDAwMDAKKworc3RydWN0IGludGVsX21pcHRyZWVfbWFwIHsKKyAgIC8qKiBCaXRmaWVsZCBvZiBHTF9NQVBfUkVBRF9CSVQsIEdMX01BUF9XUklURV9CSVQsIEdMX01BUF9JTlZBTElEQVRFX0JJVCAqLworICAgR0xiaXRmaWVsZCBtb2RlOworICAgLyoqIFJlZ2lvbiBvZiBpbnRlcmVzdCBmb3IgdGhlIG1hcC4gKi8KKyAgIGludCB4LCB5LCB3LCBoOworICAgLyoqIFBvc3NpYmx5IG1hbGxvY2VkIHRlbXBvcmFyeSBidWZmZXIgZm9yIHRoZSBtYXBwaW5nLiAqLworICAgdm9pZCAqYnVmZmVyOworICAgLyoqIFBvc3NpYmxlIHBvaW50ZXIgdG8gYSB0ZW1wb3JhcnkgbGluZWFyIG1pcHRyZWUgZm9yIHRoZSBtYXBwaW5nLiAqLworICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdDsKKyAgIC8qKiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiAobWFwX3gsIG1hcF95KSByZXR1cm5lZCBieSB0aGUgbWFwcGluZy4gKi8KKyAgIHZvaWQgKnB0cjsKKyAgIC8qKiBTdHJpZGUgb2YgdGhlIG1hcHBpbmcuICovCisgICBpbnQgc3RyaWRlOworfTsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIGxvY2F0aW9uIG9mIGVhY2ggdGV4dHVyZSBpbWFnZSB3aXRoaW4gYSBtaXB0cmVlLgorICovCitzdHJ1Y3QgaW50ZWxfbWlwbWFwX2xldmVsCit7CisgICAvKiogT2Zmc2V0IHRvIHRoaXMgbWlwdHJlZSBsZXZlbCwgdXNlZCBpbiBjb21wdXRpbmcgeF9vZmZzZXQuICovCisgICBHTHVpbnQgbGV2ZWxfeDsKKyAgIC8qKiBPZmZzZXQgdG8gdGhpcyBtaXB0cmVlIGxldmVsLCB1c2VkIGluIGNvbXB1dGluZyB5X29mZnNldC4gKi8KKyAgIEdMdWludCBsZXZlbF95OworCisgICAvKioKKyAgICAqIFxicmllZiBOdW1iZXIgb2YgMkQgc2xpY2VzIGluIHRoaXMgbWlwbGV2ZWwuCisgICAgKgorICAgICogVGhlIGV4YWN0IHNlbWFudGljcyBvZiBkZXB0aCB2YXJpZXMgYWNjb3JkaW5nIHRvIHRoZSB0ZXh0dXJlIHRhcmdldDoKKyAgICAqICAgIC0gRm9yIEdMX1RFWFRVUkVfQ1VCRV9NQVAsIGRlcHRoIGlzIDYuCisgICAgKiAgICAtIEZvciBHTF9URVhUVVJFXzJEX0FSUkFZLCBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGFycmF5IHNsaWNlcy4gSXQgaXMKKyAgICAqICAgICAgaWRlbnRpY2FsIGZvciBhbGwgbWlwbGV2ZWxzIGluIHRoZSB0ZXh0dXJlLgorICAgICogICAgLSBGb3IgR0xfVEVYVFVSRV8zRCwgaXQgaXMgdGhlIHRleHR1cmUncyBkZXB0aCBhdCB0aGlzIG1pcGxldmVsLiBJdHMKKyAgICAqICAgICAgdmFsdWUsIGxpa2Ugd2lkdGggYW5kIGhlaWdodCwgdmFyaWVzIHdpdGggbWlwbGV2ZWwuCisgICAgKiAgICAtIEZvciBvdGhlciB0ZXh0dXJlIHR5cGVzLCBkZXB0aCBpcyAxLgorICAgICogICAgLSBBZGRpdGlvbmFsbHksIGZvciBVTVMgYW5kIENNUyBtaXB0cmVlcywgZGVwdGggaXMgbXVsdGlwbGllZCBieQorICAgICogICAgICBzYW1wbGUgY291bnQuCisgICAgKi8KKyAgIEdMdWludCBkZXB0aDsKKworICAgLyoqCisgICAgKiBcYnJpZWYgTGlzdCBvZiAyRCBpbWFnZXMgaW4gdGhpcyBtaXBtYXAgbGV2ZWwuCisgICAgKgorICAgICogVGhpcyBtYXkgYmUgYSBsaXN0IG9mIGN1YmUgZmFjZXMsIGFycmF5IHNsaWNlcyBpbiAyRCBhcnJheSB0ZXh0dXJlLCBvcgorICAgICogbGF5ZXJzIGluIGEgM0QgdGV4dHVyZS4gVGhlIGxpc3QncyBsZW5ndGggaXMgXGMgZGVwdGguCisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfc2xpY2UgeworICAgICAgLyoqCisgICAgICAgKiBcbmFtZSBPZmZzZXQgdG8gc2xpY2UKKyAgICAgICAqIFx7CisgICAgICAgKgorICAgICAgICogSGFyZHdhcmUgZm9ybWF0cyBhcmUgc28gZGl2ZXJzZSB0aGF0IHRoYXQgdGhlcmUgaXMgbm8gdW5pZmllZCB3YXkgdG8KKyAgICAgICAqIGNvbXB1dGUgdGhlIHNsaWNlIG9mZnNldHMsIHNvIHdlIHN0b3JlIHRoZW0gaW4gdGhpcyB0YWJsZS4KKyAgICAgICAqCisgICAgICAgKiBUaGUgKHgsIHkpIG9mZnNldCB0byBzbGljZSBcYyBzIGF0IGxldmVsIFxjIGwgcmVsYXRpdmUgdGhlIG1pcHRyZWVzCisgICAgICAgKiBiYXNlIGFkZHJlc3MgaXMKKyAgICAgICAqIFxjb2RlCisgICAgICAgKiAgICAgeCA9IG10LT5sZXZlbFtsXS5zbGljZVtzXS54X29mZnNldAorICAgICAgICogICAgIHkgPSBtdC0+bGV2ZWxbbF0uc2xpY2Vbc10ueV9vZmZzZXQKKyAgICAgICAqLworICAgICAgR0x1aW50IHhfb2Zmc2V0OworICAgICAgR0x1aW50IHlfb2Zmc2V0OworICAgICAgLyoqIFx9ICovCisKKyAgICAgIC8qKgorICAgICAgICogTWFwcGluZyBpbmZvcm1hdGlvbi4gUGVyc2lzdGVudCBmb3IgdGhlIGR1cmF0aW9uIG9mCisgICAgICAgKiBpbnRlbF9taXB0cmVlX21hcC91bm1hcCBvbiB0aGlzIHNsaWNlLgorICAgICAgICovCisgICAgICBzdHJ1Y3QgaW50ZWxfbWlwdHJlZV9tYXAgKm1hcDsKKworICAgICAgLyoqCisgICAgICAgKiBcYnJpZWYgSXMgSGlaIGVuYWJsZWQgZm9yIHRoaXMgc2xpY2U/CisgICAgICAgKgorICAgICAgICogSWYgXGMgbXQtPmxldmVsW2xdLnNsaWNlW3NdLmhhc19oaXogaXMgc2V0LCB0aGVuICgxKSBcYyBtdC0+aGl6X210CisgICAgICAgKiBoYXMgYmVlbiBhbGxvY2F0ZWQgYW5kICgyKSB0aGUgSGlaIG1lbW9yeSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2xpY2UKKyAgICAgICAqIHJlc2lkZXMgYXQgXGMgbXQtPmhpel9tdC0+bGV2ZWxbbF0uc2xpY2Vbc10uCisgICAgICAgKi8KKyAgICAgIGJvb2wgaGFzX2hpejsKKyAgIH0gKnNsaWNlOworfTsKKworLyoqCisgKiBFbnVtIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBkaWZmZXJlbnQgTVNBQSBsYXlvdXRzIHN1cHBvcnRlZCBieSBHZW43LgorICovCitlbnVtIGludGVsX21zYWFfbGF5b3V0Cit7CisgICAvKioKKyAgICAqIE9yZGluYXJ5IHN1cmZhY2Ugd2l0aCBubyBNU0FBLgorICAgICovCisgICBJTlRFTF9NU0FBX0xBWU9VVF9OT05FLAorCisgICAvKioKKyAgICAqIEludGVybGVhdmVkIE11bHRpc2FtcGxlIFN1cmZhY2UuICBUaGUgYWRkaXRpb25hbCBzYW1wbGVzIGFyZQorICAgICogYWNjb21tb2RhdGVkIGJ5IHNjYWxpbmcgdXAgdGhlIHdpZHRoIGFuZCB0aGUgaGVpZ2h0IG9mIHRoZSBzdXJmYWNlIHNvCisgICAgKiB0aGF0IGFsbCB0aGUgc2FtcGxlcyBjb3JyZXNwb25kaW5nIHRvIGEgcGl4ZWwgYXJlIGxvY2F0ZWQgYXQgbmVhcmJ5CisgICAgKiBtZW1vcnkgbG9jYXRpb25zLgorICAgICovCisgICBJTlRFTF9NU0FBX0xBWU9VVF9JTVMsCisKKyAgIC8qKgorICAgICogVW5jb21wcmVzc2VkIE11bHRpc2FtcGxlIFN1cmZhY2UuICBUaGUgc3VyZmFjZSBpcyBzdG9yZWQgYXMgYSAyRCBhcnJheSwKKyAgICAqIHdpdGggYXJyYXkgc2xpY2UgbiBjb250YWluaW5nIGFsbCBwaXhlbCBkYXRhIGZvciBzYW1wbGUgbi4KKyAgICAqLworICAgSU5URUxfTVNBQV9MQVlPVVRfVU1TLAorCisgICAvKioKKyAgICAqIENvbXByZXNzZWQgTXVsdGlzYW1wbGUgU3VyZmFjZS4gIFRoZSBzdXJmYWNlIGlzIHN0b3JlZCBhcyBpbgorICAgICogSU5URUxfTVNBQV9MQVlPVVRfVU1TLCBidXQgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBidWZmZXIgY2FsbGVkIHRoZSBNQ1MKKyAgICAqIChNdWx0aXNhbXBsZSBDb250cm9sIFN1cmZhY2UpIGJ1ZmZlci4gIEVhY2ggcGl4ZWwgaW4gdGhlIE1DUyBidWZmZXIKKyAgICAqIGluZGljYXRlcyB0aGUgbWFwcGluZyBmcm9tIHNhbXBsZSBudW1iZXIgdG8gYXJyYXkgc2xpY2UuICBUaGlzIGFsbG93cworICAgICogdGhlIGNvbW1vbiBjYXNlICh3aGVyZSBhbGwgc2FtcGxlcyBjb25zdGl0dXRpbmcgYSBwaXhlbCBoYXZlIHRoZSBzYW1lCisgICAgKiBjb2xvciB2YWx1ZSkgdG8gYmUgc3RvcmVkIGVmZmljaWVudGx5IGJ5IGp1c3QgdXNpbmcgYSBzaW5nbGUgYXJyYXkKKyAgICAqIHNsaWNlLgorICAgICovCisgICBJTlRFTF9NU0FBX0xBWU9VVF9DTVMsCit9OworCisKKy8qKgorICogRW51bSBmb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgZmFzdCBjbGVhciBzdGF0ZSBvZiBhIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGgKKyAqIGEgbWlwdHJlZS4KKyAqCisgKiBGYXN0IGNsZWFyIHdvcmtzIGJ5IGRlZmVycmluZyB0aGUgbWVtb3J5IHdyaXRlcyB0aGF0IHdvdWxkIGJlIHVzZWQgdG8gY2xlYXIKKyAqIHRoZSBidWZmZXIsIHNvIHRoYXQgaW5zdGVhZCBvZiBwZXJmb3JtaW5nIHRoZW0gYXQgdGhlIHRpbWUgb2YgdGhlIGNsZWFyCisgKiBvcGVyYXRpb24sIHRoZSBoYXJkd2FyZSBhdXRvbWF0aWNhbGx5IHBlcmZvcm1zIHRoZW0gYXQgdGhlIHRpbWUgdGhhdCB0aGUKKyAqIGJ1ZmZlciBpcyBsYXRlciBhY2Nlc3NlZCBmb3IgcmVuZGVyaW5nLiAgVGhlIE1DUyBidWZmZXIga2VlcHMgdHJhY2sgb2YKKyAqIHdoaWNoIHJlZ2lvbnMgb2YgdGhlIGJ1ZmZlciBzdGlsbCBoYXZlIHBlbmRpbmcgY2xlYXIgd3JpdGVzLgorICoKKyAqIFRoaXMgZW51bSBrZWVwcyB0cmFjayBvZiB0aGUgZHJpdmVyJ3Mga25vd2xlZGdlIG9mIHBlbmRpbmcgZmFzdCBjbGVhcnMgaW4KKyAqIHRoZSBNQ1MgYnVmZmVyLgorICoKKyAqIE1DUyBidWZmZXJzIG9ubHkgZXhpc3Qgb24gR2VuNysuCisgKi8KK2VudW0gaW50ZWxfZmFzdF9jbGVhcl9zdGF0ZQoreworICAgLyoqCisgICAgKiBUaGVyZSBpcyBubyBNQ1MgYnVmZmVyIGZvciB0aGlzIG1pcHRyZWUsIGFuZCBvbmUgc2hvdWxkIG5ldmVyIGJlCisgICAgKiBhbGxvY2F0ZWQuCisgICAgKi8KKyAgIElOVEVMX0ZBU1RfQ0xFQVJfU1RBVEVfTk9fTUNTLAorCisgICAvKioKKyAgICAqIE5vIGRlZmVycmVkIGNsZWFycyBhcmUgcGVuZGluZyBmb3IgdGhpcyBtaXB0cmVlLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgICogY29sb3IgYnVmZmVyIGFyZSBlbnRpcmVseSBjb3JyZWN0LiAgQW4gTUNTIGJ1ZmZlciBtYXkgb3IgbWF5IG5vdCBleGlzdAorICAgICogZm9yIHRoaXMgbWlwdHJlZS4gIElmIGl0IGRvZXMgZXhpc3QsIGl0IGlzIGVudGlyZWx5IGluIHRoZSAibm8gZGVmZXJyZWQKKyAgICAqIGNsZWFycyBwZW5kaW5nIiBzdGF0ZS4gIElmIGl0IGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgdGhlCisgICAgKiBmaXJzdCB0aW1lIGEgZmFzdCBjb2xvciBjbGVhciBpcyBleGVjdXRlZC4KKyAgICAqCisgICAgKiBJbiB0aGlzIHN0YXRlLCB0aGUgY29sb3IgYnVmZmVyIGNhbiBiZSB1c2VkIGZvciBwdXJwb3NlcyBvdGhlciB0aGFuCisgICAgKiByZW5kZXJpbmcgd2l0aG91dCBuZWVkaW5nIGEgcmVuZGVyIHRhcmdldCByZXNvbHZlLgorICAgICoKKyAgICAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSAiZmFzdCBjb2xvciBjbGVhciByZXNvbHZlIiBmb3IgTVNBQQorICAgICogYnVmZmVycywgYW4gTVNBQSBidWZmZXIgd2lsbCBuZXZlciBiZSBpbiB0aGlzIHN0YXRlLgorICAgICovCisgICBJTlRFTF9GQVNUX0NMRUFSX1NUQVRFX1JFU09MVkVELAorCisgICAvKioKKyAgICAqIEFuIE1DUyBidWZmZXIgZXhpc3RzIGZvciB0aGlzIG1pcHRyZWUsIGFuZCBkZWZlcnJlZCBjbGVhcnMgYXJlIHBlbmRpbmcKKyAgICAqIGZvciBzb21lIHJlZ2lvbnMgb2YgdGhlIGNvbG9yIGJ1ZmZlciwgYXMgaW5kaWNhdGVkIGJ5IHRoZSBNQ1MgYnVmZmVyLgorICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBjb2xvciBidWZmZXIgYXJlIG9ubHkgY29ycmVjdCBmb3IgdGhlIHJlZ2lvbnMgd2hlcmUKKyAgICAqIHRoZSBNQ1MgYnVmZmVyIGRvZXNuJ3QgaW5kaWNhdGUgYSBkZWZlcnJlZCBjbGVhci4KKyAgICAqCisgICAgKiBJZiBhIHNpbmdsZS1zYW1wbGUgYnVmZmVyIGlzIGluIHRoaXMgc3RhdGUsIGEgcmVuZGVyIHRhcmdldCByZXNvbHZlIG11c3QKKyAgICAqIGJlIHBlcmZvcm1lZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gcmVuZGVyaW5nLgorICAgICovCisgICBJTlRFTF9GQVNUX0NMRUFSX1NUQVRFX1VOUkVTT0xWRUQsCisKKyAgIC8qKgorICAgICogQW4gTUNTIGJ1ZmZlciBleGlzdHMgZm9yIHRoaXMgbWlwdHJlZSwgYW5kIGRlZmVycmVkIGNsZWFycyBhcmUgcGVuZGluZworICAgICogZm9yIHRoZSBlbnRpcmUgY29sb3IgYnVmZmVyLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBNQ1MgYnVmZmVyIHJlZmxlY3QKKyAgICAqIHRoaXMuICBUaGUgY29udGVudHMgb2YgdGhlIGNvbG9yIGJ1ZmZlciBhcmUgdW5kZWZpbmVkLgorICAgICoKKyAgICAqIElmIGEgc2luZ2xlLXNhbXBsZSBidWZmZXIgaXMgaW4gdGhpcyBzdGF0ZSwgYSByZW5kZXIgdGFyZ2V0IHJlc29sdmUgbXVzdAorICAgICogYmUgcGVyZm9ybWVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBmb3IgcHVycG9zZXMgb3RoZXIgdGhhbiByZW5kZXJpbmcuCisgICAgKgorICAgICogSWYgdGhlIGNsaWVudCBhdHRlbXB0cyB0byBjbGVhciBhIGJ1ZmZlciB3aGljaCBpcyBhbHJlYWR5IGluIHRoaXMgc3RhdGUsCisgICAgKiB0aGUgY2xlYXIgY2FuIGJlIHNhZmVseSBza2lwcGVkLCBzaW5jZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgY2xlYXIuCisgICAgKi8KKyAgIElOVEVMX0ZBU1RfQ0xFQVJfU1RBVEVfQ0xFQVIsCit9OworCitzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUKK3sKKyAgIC8qKiBCdWZmZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBpeGVsIGRhdGEuICovCisgICBkcm1faW50ZWxfYm8gKmJvOworCisgICB1aW50MzJfdCBwaXRjaDsgLyoqPCBwaXRjaCBpbiBieXRlcy4gKi8KKworICAgdWludDMyX3QgdGlsaW5nOyAvKio8IE9uZSBvZiB0aGUgSTkxNV9USUxJTkdfKiBmbGFncyAqLworCisgICAvKiBFZmZlY3RpdmVseSB0aGUga2V5OgorICAgICovCisgICBHTGVudW0gdGFyZ2V0OworCisgICAvKioKKyAgICAqIEdlbmVyYWxseSwgdGhpcyBpcyBqdXN0IHRoZSBzYW1lIGFzIHRoZSBnbF90ZXh0dXJlX2ltYWdlLT5UZXhGb3JtYXQgb3IKKyAgICAqIGdsX3JlbmRlcmJ1ZmZlci0+Rm9ybWF0LgorICAgICoKKyAgICAqIEhvd2V2ZXIsIGZvciB0ZXh0dXJlcyBhbmQgcmVuZGVyYnVmZmVycyB3aXRoIHBhY2tlZCBkZXB0aC9zdGVuY2lsIGZvcm1hdHMKKyAgICAqIG9uIGhhcmR3YXJlIHdoZXJlIHdlIHdhbnQgb3IgbmVlZCB0byB1c2Ugc2VwYXJhdGUgc3RlbmNpbCwgdGhlcmUgd2lsbCBiZQorICAgICogdHdvIG1pcHRyZWVzIGZvciBzdG9yaW5nIHRoZSBkYXRhLiAgSWYgdGhlIGRlcHRoc3RlbmNpbCB0ZXh0dXJlIG9yIHJiIGlzCisgICAgKiBNRVNBX0ZPUk1BVF9aMzJfRkxPQVRfUzhYMjRfVUlOVCwgdGhlbiBtdC0+Zm9ybWF0IHdpbGwgYmUKKyAgICAqIE1FU0FfRk9STUFUX1pfRkxPQVQzMiwgb3RoZXJ3aXNlIGZvciBNRVNBX0ZPUk1BVF9aMjRfVU5PUk1fUzhfVUlOVCBvYmplY3RzIGl0IHdpbGwgYmUKKyAgICAqIE1FU0FfRk9STUFUX1oyNF9VTk9STV9YOF9VSU5ULgorICAgICoKKyAgICAqIEZvciBFVEMxL0VUQzIgdGV4dHVyZXMsIHRoaXMgaXMgb25lIG9mIHRoZSB1bmNvbXByZXNzZWQgbWVzYSB0ZXh0dXJlCisgICAgKiBmb3JtYXRzIGlmIHRoZSBoYXJkd2FyZSBsYWNrcyBzdXBwb3J0IGZvciBFVEMxL0VUQzIuIFNlZSBAcmVmIGV0Y19mb3JtYXQuCisgICAgKi8KKyAgIG1lc2FfZm9ybWF0IGZvcm1hdDsKKworICAgLyoqIFRoaXMgdmFyaWFibGUgc3RvcmVzIHRoZSB2YWx1ZSBvZiBFVEMgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCAqLworICAgbWVzYV9mb3JtYXQgZXRjX2Zvcm1hdDsKKworICAgLyoqCisgICAgKiBUaGUgWCBvZmZzZXQgb2YgZWFjaCBpbWFnZSBpbiB0aGUgbWlwdHJlZSBtdXN0IGJlIGFsaWduZWQgdG8gdGhpcy4KKyAgICAqIFNlZSB0aGUgY29tbWVudHMgaW4gYnJ3X3RleF9sYXlvdXQuYy4KKyAgICAqLworICAgdW5zaWduZWQgaW50IGFsaWduX3c7CisgICB1bnNpZ25lZCBpbnQgYWxpZ25faDsgLyoqPCBcc2VlIGFsaWduX3cgKi8KKworICAgR0x1aW50IGZpcnN0X2xldmVsOworICAgR0x1aW50IGxhc3RfbGV2ZWw7CisKKyAgIC8qKgorICAgICogTGV2ZWwgemVybyBpbWFnZSBkaW1lbnNpb25zLiAgVGhlc2UgZGltZW5zaW9ucyBjb3JyZXNwb25kIHRvIHRoZQorICAgICogcGh5c2ljYWwgbGF5b3V0IG9mIGRhdGEgaW4gbWVtb3J5LiAgQWNjb3JkaW5nbHksIHRoZXkgYWNjb3VudCBmb3IgdGhlCisgICAgKiBleHRyYSB3aWR0aCwgaGVpZ2h0LCBhbmQgb3IgZGVwdGggdGhhdCBtdXN0IGJlIGFsbG9jYXRlZCBpbiBvcmRlciB0bworICAgICogYWNjb21tb2RhdGUgbXVsdGlzYW1wbGUgZm9ybWF0cywgYW5kIHRoZXkgYWNjb3VudCBmb3IgdGhlIGV4dHJhIGZhY3RvcgorICAgICogb2YgNiBpbiBkZXB0aCB0aGF0IG11c3QgYmUgYWxsb2NhdGVkIGluIG9yZGVyIHRvIGFjY29tbW9kYXRlIGN1YmVtYXAKKyAgICAqIHRleHR1cmVzLgorICAgICovCisgICBHTHVpbnQgcGh5c2ljYWxfd2lkdGgwLCBwaHlzaWNhbF9oZWlnaHQwLCBwaHlzaWNhbF9kZXB0aDA7CisKKyAgIEdMdWludCBjcHA7IC8qKjwgYnl0ZXMgcGVyIHBpeGVsICovCisgICBHTHVpbnQgbnVtX3NhbXBsZXM7CisgICBib29sIGNvbXByZXNzZWQ7CisKKyAgIC8qKgorICAgICogTGV2ZWwgemVybyBpbWFnZSBkaW1lbnNpb25zLiAgVGhlc2UgZGltZW5zaW9ucyBjb3JyZXNwb25kIHRvIHRoZQorICAgICogbG9naWNhbCB3aWR0aCwgaGVpZ2h0LCBhbmQgZGVwdGggb2YgdGhlIHRleHR1cmUgYXMgc2VlbiBieSBjbGllbnQgY29kZS4KKyAgICAqIEFjY29yZGluZ2x5LCB0aGV5IGRvIG5vdCBhY2NvdW50IGZvciB0aGUgZXh0cmEgd2lkdGgsIGhlaWdodCwgYW5kL29yCisgICAgKiBkZXB0aCB0aGF0IG11c3QgYmUgYWxsb2NhdGVkIGluIG9yZGVyIHRvIGFjY29tbW9kYXRlIG11bHRpc2FtcGxlCisgICAgKiBmb3JtYXRzLCBub3IgZG8gdGhleSBhY2NvdW50IGZvciB0aGUgZXh0cmEgZmFjdG9yIG9mIDYgaW4gZGVwdGggdGhhdAorICAgICogbXVzdCBiZSBhbGxvY2F0ZWQgaW4gb3JkZXIgdG8gYWNjb21tb2RhdGUgY3ViZW1hcCB0ZXh0dXJlcy4KKyAgICAqLworICAgdWludDMyX3QgbG9naWNhbF93aWR0aDAsIGxvZ2ljYWxfaGVpZ2h0MCwgbG9naWNhbF9kZXB0aDA7CisKKyAgIC8qKgorICAgICogRm9yIDFEIGFycmF5LCAyRCBhcnJheSwgY3ViZSwgYW5kIDJEIG11bHRpc2FtcGxlZCBzdXJmYWNlcyBvbiBHZW43OiB0cnVlCisgICAgKiBpZiB0aGUgc3VyZmFjZSBvbmx5IGNvbnRhaW5zIExPRCAwLCBhbmQgaGVuY2Ugbm8gc3BhY2UgaXMgZm9yIExPRCdzCisgICAgKiBvdGhlciB0aGFuIDAgaW4gYmV0d2VlbiBhcnJheSBzbGljZXMuCisgICAgKgorICAgICogQ29ycmVzcG9uZHMgdG8gdGhlIHN1cmZhY2VfYXJyYXlfc3BhY2luZyBiaXQgaW4gZ2VuN19zdXJmYWNlX3N0YXRlLgorICAgICovCisgICBib29sIGFycmF5X3NwYWNpbmdfbG9kMDsKKworICAgLyoqCisgICAgKiBUaGUgZGlzdGFuY2UgaW4gcm93cyBiZXR3ZWVuIGFycmF5IHNsaWNlcyBpbiBhbiB1bmNvbXByZXNzZWQgc3VyZmFjZS4KKyAgICAqCisgICAgKiBGb3IgY29tcHJlc3NlZCBzdXJmYWNlcywgc2xpY2VzIGFyZSBzdG9yZWQgY2xvc2VyIHRvZ2V0aGVyIHBoeXNpY2FsbHk7CisgICAgKiB0aGUgcmVhbCBkaXN0YW5jZSBpcyAocXBpdGNoIC8gYmxvY2sgaGVpZ2h0KS4KKyAgICAqLworICAgdWludDMyX3QgcXBpdGNoOworCisgICAvKioKKyAgICAqIE1TQUEgbGF5b3V0IHVzZWQgYnkgdGhpcyBidWZmZXIuCisgICAgKi8KKyAgIGVudW0gaW50ZWxfbXNhYV9sYXlvdXQgbXNhYV9sYXlvdXQ7CisKKyAgIC8qIERlcml2ZWQgZnJvbSB0aGUgYWJvdmU6CisgICAgKi8KKyAgIEdMdWludCB0b3RhbF93aWR0aDsKKyAgIEdMdWludCB0b3RhbF9oZWlnaHQ7CisKKyAgIC8qIFRoZSAzRFNUQVRFX0NMRUFSX1BBUkFNUyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgZGVwdGggY2xlYXIgdG8KKyAgICAqIHRoaXMgZGVwdGggbWlwbWFwIHRyZWUsIGlmIGFueS4KKyAgICAqLworICAgdWludDMyX3QgZGVwdGhfY2xlYXJfdmFsdWU7CisKKyAgIC8qIEluY2x1ZGVzIGltYWdlIG9mZnNldCB0YWJsZXM6CisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfbGV2ZWwgbGV2ZWxbTUFYX1RFWFRVUkVfTEVWRUxTXTsKKworICAgLyogT2Zmc2V0IGludG8gYm8gd2hlcmUgbWlwdHJlZSBzdGFydHM6CisgICAgKi8KKyAgIHVpbnQzMl90IG9mZnNldDsKKworICAgLyoqCisgICAgKiBcYnJpZWYgSGlaIG1pcHRyZWUKKyAgICAqCisgICAgKiBUaGUgaGl6IG1pcHRyZWUgY29udGFpbnMgdGhlIG1pcHRyZWUncyBoaXogYnVmZmVyLiBUbyBhbGxvY2F0ZSB0aGUgaGl6CisgICAgKiBtaXB0cmVlLCB1c2UgaW50ZWxfbWlwdHJlZV9hbGxvY19oaXooKS4KKyAgICAqCisgICAgKiBUbyBkZXRlcm1pbmUgaWYgaGl6IGlzIGVuYWJsZWQsIGRvIG5vdCBjaGVjayB0aGlzIHBvaW50ZXIuIEluc3RlYWQsIHVzZQorICAgICogaW50ZWxfbWlwdHJlZV9zbGljZV9oYXNfaGl6KCkuCisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqaGl6X210OworCisgICAvKioKKyAgICAqIFxicmllZiBNYXAgb2YgbWlwdHJlZSBzbGljZXMgdG8gbmVlZGVkIHJlc29sdmVzLgorICAgICoKKyAgICAqIFRoaXMgaXMgdXNlZCBvbmx5IHdoZW4gdGhlIG1pcHRyZWUgaGFzIGEgY2hpbGQgSGlaIG1pcHRyZWUuCisgICAgKgorICAgICogTGV0IFxjIG10IGJlIGEgZGVwdGggbWlwdHJlZSB3aXRoIEhpWiBlbmFibGVkLiBUaGVuIHRoZSByZXNvbHZlIG1hcCBpcworICAgICogXGMgbXQtPmhpel9tYXAuIFRoZSByZXNvbHZlIG1hcCBvZiB0aGUgY2hpbGQgSGlaIG1pcHRyZWUsIFxjCisgICAgKiBtdC0+aGl6X210LT5oaXpfbWFwLCBpcyB1bnVzZWQuCisgICAgKi8KKyAgIHN0cnVjdCBpbnRlbF9yZXNvbHZlX21hcCBoaXpfbWFwOworCisgICAvKioKKyAgICAqIFxicmllZiBTdGVuY2lsIG1pcHRyZWUgZm9yIGRlcHRoc3RlbmNpbCB0ZXh0dXJlcy4KKyAgICAqCisgICAgKiBUaGlzIG1pcHRyZWUgaXMgdXNlZCBmb3IgZGVwdGhzdGVuY2lsIHRleHR1cmVzIGFuZCByZW5kZXJidWZmZXJzIHRoYXQKKyAgICAqIHJlcXVpcmUgc2VwYXJhdGUgc3RlbmNpbC4gIEl0IGFsd2F5cyBoYXMgdGhlIHRydWUgY29weSBvZiB0aGUgc3RlbmNpbAorICAgICogYml0cywgcmVnYXJkbGVzcyBvZiBtdC0+Zm9ybWF0LgorICAgICoKKyAgICAqIFxzZWUgaW50ZWxfbWlwdHJlZV9tYXBfZGVwdGhzdGVuY2lsKCkKKyAgICAqIFxzZWUgaW50ZWxfbWlwdHJlZV91bm1hcF9kZXB0aHN0ZW5jaWwoKQorICAgICovCisgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKnN0ZW5jaWxfbXQ7CisKKyAgIC8qKgorICAgICogXGJyaWVmIE1DUyBtaXB0cmVlLgorICAgICoKKyAgICAqIFRoaXMgbWlwdHJlZSBjb250YWlucyB0aGUgIm11bHRpc2FtcGxlIGNvbnRyb2wgc3VyZmFjZSIsIHdoaWNoIHN0b3JlcworICAgICogdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBpbXBsZW1lbnQgY29tcHJlc3NlZCBNU0FBCisgICAgKiAoSU5URUxfTVNBQV9GT1JNQVRfQ01TKSBhbmQgImZhc3QgY29sb3IgY2xlYXIiIGJlaGF2aW91ciBvbiBHZW43Ky4KKyAgICAqCisgICAgKiBOVUxMIGlmIG5vIE1DUyBtaXB0cmVlIGlzIGluIHVzZSBmb3IgdGhpcyBzdXJmYWNlLgorICAgICovCisgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm1jc19tdDsKKworICAgLyoqCisgICAgKiBGYXN0IGNsZWFyIHN0YXRlIGZvciB0aGlzIGJ1ZmZlci4KKyAgICAqLworICAgZW51bSBpbnRlbF9mYXN0X2NsZWFyX3N0YXRlIGZhc3RfY2xlYXJfc3RhdGU7CisKKyAgIC8qKgorICAgICogVGhlIFNVUkZBQ0VfU1RBVEUgYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgZmFzdCBjb2xvciBjbGVhciB0byB0aGlzCisgICAgKiBjb2xvciBtaXBtYXAgdHJlZSwgaWYgYW55LgorICAgICoKKyAgICAqIFRoaXMgdmFsdWUgd2lsbCBvbmx5IGV2ZXIgY29udGFpbiBvbmVzIGluIGJpdHMgMjgtMzEsIHNvIGl0IGlzIHNhZmUgdG8KKyAgICAqIE9SIGludG8gZHdvcmQgNyBvZiBTVVJGQUNFX1NUQVRFLgorICAgICovCisgICB1aW50MzJfdCBmYXN0X2NsZWFyX2NvbG9yX3ZhbHVlOworCisgICAvKiBUaGVzZSBhcmUgYWxzbyByZWZjb3VudGVkOgorICAgICovCisgICBHTHVpbnQgcmVmY291bnQ7Cit9OworCitlbnVtIGludGVsX21pcHRyZWVfdGlsaW5nX21vZGUgeworICAgSU5URUxfTUlQVFJFRV9USUxJTkdfQU5ZLAorICAgSU5URUxfTUlQVFJFRV9USUxJTkdfWSwKKyAgIElOVEVMX01JUFRSRUVfVElMSU5HX05PTkUsCit9OworCitib29sCitpbnRlbF9pc19ub25fbXNydF9tY3NfYnVmZmVyX3N1cHBvcnRlZChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQpOworCit2b2lkCitpbnRlbF9nZXRfbm9uX21zcnRfbWNzX2FsaWdubWVudChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqd2lkdGhfcHgsIHVuc2lnbmVkICpoZWlnaHQpOworCitib29sCitpbnRlbF9taXB0cmVlX2FsbG9jX25vbl9tc3J0X21jcyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQpOworCitzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmludGVsX21pcHRyZWVfY3JlYXRlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorCQkJCQkgICAgICAgbWVzYV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgZmlyc3RfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBsYXN0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgd2lkdGgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgaGVpZ2h0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGRlcHRoMCwKKwkJCQkJICAgICAgIGJvb2wgZXhwZWN0X2FjY2VsZXJhdGVkX3VwbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG51bV9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX21pcHRyZWVfdGlsaW5nX21vZGUpOworCitzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKgoraW50ZWxfbWlwdHJlZV9jcmVhdGVfbGF5b3V0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzYV9mb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBmaXJzdF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbGFzdF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgd2lkdGgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBoZWlnaHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBkZXB0aDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG51bV9zYW1wbGVzKTsKKworc3RydWN0IGludGVsX21pcG1hcF90cmVlICoKK2ludGVsX21pcHRyZWVfY3JlYXRlX2Zvcl9ibyhzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1faW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc2FfZm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCk7CisKK3ZvaWQKK2ludGVsX3VwZGF0ZV93aW5zeXNfcmVuZGVyYnVmZmVyX21pcHRyZWUoc3RydWN0IGJyd19jb250ZXh0ICppbnRlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1faW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXRjaCk7CisKKy8qKgorICogQ3JlYXRlIGEgbWlwdHJlZSBhcHByb3ByaWF0ZSBhcyB0aGUgc3RvcmFnZSBmb3IgYSBub24tdGV4dHVyZSByZW5kZXJidWZmZXIuCisgKiBUaGUgbWlwdHJlZSBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICogICAgIC0gVGhlIHRhcmdldCBpcyBHTF9URVhUVVJFXzJELgorICogICAgIC0gVGhlcmUgYXJlIG5vIGxldmVscyBvdGhlciB0aGFuIHRoZSBiYXNlIGxldmVsIDAuCisgKiAgICAgLSBEZXB0aCBpcyAxLgorICovCitzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUqCitpbnRlbF9taXB0cmVlX2NyZWF0ZV9mb3JfcmVuZGVyYnVmZmVyKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNhX2Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9zYW1wbGVzKTsKKworbWVzYV9mb3JtYXQKK2ludGVsX2RlcHRoX2Zvcm1hdF9mb3JfZGVwdGhzdGVuY2lsX2Zvcm1hdChtZXNhX2Zvcm1hdCBmb3JtYXQpOworCittZXNhX2Zvcm1hdAoraW50ZWxfbG93ZXJfY29tcHJlc3NlZF9mb3JtYXQoc3RydWN0IGJyd19jb250ZXh0ICpicncsIG1lc2FfZm9ybWF0IGZvcm1hdCk7CisKKy8qKiBcYnJpZWYgQXNzZXJ0IHRoYXQgdGhlIGxldmVsIGFuZCBsYXllciBhcmUgdmFsaWQgZm9yIHRoZSBtaXB0cmVlLiAqLworc3RhdGljIGlubGluZSB2b2lkCitpbnRlbF9taXB0cmVlX2NoZWNrX2xldmVsX2xheWVyKHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllcikKK3sKKyAgIGFzc2VydChsZXZlbCA+PSBtdC0+Zmlyc3RfbGV2ZWwpOworICAgYXNzZXJ0KGxldmVsIDw9IG10LT5sYXN0X2xldmVsKTsKKyAgIGFzc2VydChsYXllciA8IG10LT5sZXZlbFtsZXZlbF0uZGVwdGgpOworfQorCit2b2lkIGludGVsX21pcHRyZWVfcmVmZXJlbmNlKHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICpzcmMpOworCit2b2lkIGludGVsX21pcHRyZWVfcmVsZWFzZShzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKiptdCk7CisKKy8qIENoZWNrIGlmIGFuIGltYWdlIGZpdHMgYW4gZXhpc3RpbmcgbWlwbWFwIHRyZWUgbGF5b3V0CisgKi8KK2Jvb2wgaW50ZWxfbWlwdHJlZV9tYXRjaF9pbWFnZShzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3RleHR1cmVfaW1hZ2UgKmltYWdlKTsKKwordm9pZAoraW50ZWxfbWlwdHJlZV9nZXRfaW1hZ2Vfb2Zmc2V0KGNvbnN0IHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisJCQkgICAgICAgR0x1aW50IGxldmVsLCBHTHVpbnQgc2xpY2UsCisJCQkgICAgICAgR0x1aW50ICp4LCBHTHVpbnQgKnkpOworCit2b2lkCitpbnRlbF9taXB0cmVlX2dldF9kaW1lbnNpb25zX2Zvcl9pbWFnZShzdHJ1Y3QgZ2xfdGV4dHVyZV9pbWFnZSAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwgaW50ICpkZXB0aCk7CisKK3ZvaWQKK2ludGVsX21pcHRyZWVfZ2V0X3RpbGVfbWFza3MoY29uc3Qgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1hc2tfeCwgdWludDMyX3QgKm1hc2tfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXBfc3RlbmNpbF9hc195X3RpbGVkKTsKKwordWludDMyX3QKK2ludGVsX21pcHRyZWVfZ2V0X3RpbGVfb2Zmc2V0cyhjb25zdCBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBsZXZlbCwgR0x1aW50IHNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0aWxlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnRpbGVfeSk7Cit1aW50MzJfdAoraW50ZWxfbWlwdHJlZV9nZXRfYWxpZ25lZF9vZmZzZXQoY29uc3Qgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHgsIHVpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hcF9zdGVuY2lsX2FzX3lfdGlsZWQpOworCit2b2lkIGludGVsX21pcHRyZWVfc2V0X2xldmVsX2luZm8oc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgZCk7CisKK3ZvaWQgaW50ZWxfbWlwdHJlZV9zZXRfaW1hZ2Vfb2Zmc2V0KHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgaW1nLCBHTHVpbnQgeCwgR0x1aW50IHkpOworCit2b2lkCitpbnRlbF9taXB0cmVlX2NvcHlfdGV4aW1hZ2Uoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3RleHR1cmVfaW1hZ2UgKmludGVsSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICpkc3RfbXQsIGJvb2wgaW52YWxpZGF0ZSk7CisKK2Jvb2wKK2ludGVsX21pcHRyZWVfYWxsb2NfbWNzKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBudW1fc2FtcGxlcyk7CisKKy8qKgorICogXG5hbWUgTWlwdHJlZSBIaVogZnVuY3Rpb25zCisgKiBceworICoKKyAqIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGUgInNsaWNlX3NldF9uZWVkX3Jlc29sdmUiIGFuZCAic2xpY2VfcmVzb2x2ZSIKKyAqIGZ1bmN0aW9ucyBvbiBhIG1pcHRyZWUgd2l0aG91dCBIaVouIEluIHRoYXQgY2FzZSwgZWFjaCBmdW5jdGlvbiBpcyBhIG5vLW9wLgorICovCisKKy8qKgorICogXGJyaWVmIEFsbG9jYXRlIHRoZSBtaXB0cmVlJ3MgZW1iZWRkZWQgSGlaIG1pcHRyZWUuCisgKiBcc2VlIGludGVsX21pcG1hcF90cmVlOmhpel9tdAorICogXHJldHVybiBmYWxzZSBpZiBhbGxvY2F0aW9uIGZhaWxlZAorICovCisKK2Jvb2wKK2ludGVsX21pcHRyZWVfYWxsb2NfaGl6KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkJc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCk7CisKK2Jvb2wKK2ludGVsX21pcHRyZWVfc2xpY2VfaGFzX2hpeihzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVyKTsKKwordm9pZAoraW50ZWxfbWlwdHJlZV9zbGljZV9zZXRfbmVlZHNfaGl6X3Jlc29sdmUoc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxldmVsLAorCQkJCQkgIHVpbnQzMl90IGRlcHRoKTsKK3ZvaWQKK2ludGVsX21pcHRyZWVfc2xpY2Vfc2V0X25lZWRzX2RlcHRoX3Jlc29sdmUoc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGV2ZWwsCisJCQkJCSAgICB1aW50MzJfdCBkZXB0aCk7CisKK3ZvaWQKK2ludGVsX21pcHRyZWVfc2V0X2FsbF9zbGljZXNfbmVlZF9kZXB0aF9yZXNvbHZlKHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZXZlbCk7CisKKy8qKgorICogXHJldHVybiBmYWxzZSBpZiBubyByZXNvbHZlIHdhcyBuZWVkZWQKKyAqLworYm9vbAoraW50ZWxfbWlwdHJlZV9zbGljZV9yZXNvbHZlX2hpeihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKwkJCQlzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorCQkJCXVuc2lnbmVkIGludCBsZXZlbCwKKwkJCQl1bnNpZ25lZCBpbnQgZGVwdGgpOworCisvKioKKyAqIFxyZXR1cm4gZmFsc2UgaWYgbm8gcmVzb2x2ZSB3YXMgbmVlZGVkCisgKi8KK2Jvb2wKK2ludGVsX21pcHRyZWVfc2xpY2VfcmVzb2x2ZV9kZXB0aChzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKwkJCQkgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQsCisJCQkJICB1bnNpZ25lZCBpbnQgbGV2ZWwsCisJCQkJICB1bnNpZ25lZCBpbnQgZGVwdGgpOworCisvKioKKyAqIFxyZXR1cm4gZmFsc2UgaWYgbm8gcmVzb2x2ZSB3YXMgbmVlZGVkCisgKi8KK2Jvb2wKK2ludGVsX21pcHRyZWVfYWxsX3NsaWNlc19yZXNvbHZlX2hpeihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKwkJCQkgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQpOworCisvKioKKyAqIFxyZXR1cm4gZmFsc2UgaWYgbm8gcmVzb2x2ZSB3YXMgbmVlZGVkCisgKi8KK2Jvb2wKK2ludGVsX21pcHRyZWVfYWxsX3NsaWNlc19yZXNvbHZlX2RlcHRoKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10KTsKKworLyoqXH0qLworCisvKioKKyAqIFVwZGF0ZSB0aGUgZmFzdCBjbGVhciBzdGF0ZSBmb3IgYSBtaXB0cmVlIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIGJlZW4gdXNlZAorICogZm9yIHJlbmRlcmluZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpbnRlbF9taXB0cmVlX3VzZWRfZm9yX3JlbmRlcmluZyhzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10KQoreworICAgLyogSWYgdGhlIGJ1ZmZlciB3YXMgcHJldmlvdXNseSBpbiBmYXN0IGNsZWFyIHN0YXRlLCBjaGFuZ2UgaXQgdG8KKyAgICAqIHVucmVzb2x2ZWQgc3RhdGUsIHNpbmNlIGl0IHdvbid0IGJlIGd1YXJhbnRlZWQgdG8gYmUgY2xlYXIgYWZ0ZXIKKyAgICAqIHJlbmRlcmluZyBvY2N1cnMuCisgICAgKi8KKyAgIGlmIChtdC0+ZmFzdF9jbGVhcl9zdGF0ZSA9PSBJTlRFTF9GQVNUX0NMRUFSX1NUQVRFX0NMRUFSKQorICAgICAgbXQtPmZhc3RfY2xlYXJfc3RhdGUgPSBJTlRFTF9GQVNUX0NMRUFSX1NUQVRFX1VOUkVTT0xWRUQ7Cit9CisKK3ZvaWQKK2ludGVsX21pcHRyZWVfcmVzb2x2ZV9jb2xvcihzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10KTsKKwordm9pZAoraW50ZWxfbWlwdHJlZV9tYWtlX3NoYXJlYWJsZShzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCk7CisKK3ZvaWQKK2ludGVsX21pcHRyZWVfdXBkb3duc2FtcGxlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKmRzdCk7CisKK3ZvaWQgYnJ3X21pcHRyZWVfbGF5b3V0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10KTsKKwordm9pZCAqaW50ZWxfbWlwdHJlZV9tYXBfcmF3KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9taXBtYXBfdHJlZSAqbXQpOworCit2b2lkIGludGVsX21pcHRyZWVfdW5tYXBfcmF3KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10KTsKKwordm9pZAoraW50ZWxfbWlwdHJlZV9tYXAoc3RydWN0IGJyd19jb250ZXh0ICpicncsCisJCSAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKwkJICB1bnNpZ25lZCBpbnQgbGV2ZWwsCisJCSAgdW5zaWduZWQgaW50IHNsaWNlLAorCQkgIHVuc2lnbmVkIGludCB4LAorCQkgIHVuc2lnbmVkIGludCB5LAorCQkgIHVuc2lnbmVkIGludCB3LAorCQkgIHVuc2lnbmVkIGludCBoLAorCQkgIEdMYml0ZmllbGQgbW9kZSwKKwkJICB2b2lkICoqb3V0X3B0ciwKKwkJICBpbnQgKm91dF9zdHJpZGUpOworCit2b2lkCitpbnRlbF9taXB0cmVlX3VubWFwKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorCQkgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwKKwkJICAgIHVuc2lnbmVkIGludCBsZXZlbCwKKwkJICAgIHVuc2lnbmVkIGludCBzbGljZSk7CisKK3ZvaWQKK2ludGVsX2hpel9leGVjKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBzdHJ1Y3QgaW50ZWxfbWlwbWFwX3RyZWUgKm10LAorCSAgICAgICB1bnNpZ25lZCBpbnQgbGV2ZWwsIHVuc2lnbmVkIGludCBsYXllciwgZW51bSBnZW42X2hpel9vcCBvcCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX3Jlc29sdmVfbWFwLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfcmVzb2x2ZV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA0MjcxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX3Jlc29sdmVfbWFwLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogRm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBIaVogb3BlcmF0aW9ucywgc2VlIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgb2YgdGhlCisgKiBTYW5keSBCcmlkZ2UgUFJNLCBWb2x1bWUgMSwgUGFydDI6CisgKiAgIC0gNy41LjMuMSBEZXB0aCBCdWZmZXIgQ2xlYXIKKyAqICAgLSA3LjUuMy4yIERlcHRoIEJ1ZmZlciBSZXNvbHZlCisgKiAgIC0gNy41LjMuMyBIaWVyYXJjaGljYWwgRGVwdGggQnVmZmVyIFJlc29sdmUKKyAqCisgKiBPZiB0aGVzZSwgdHdvIGdldCBlbnRlcmVkIGluIHRoZSByZXNvbHZlIG1hcCBhcyBuZWVkaW5nIHRvIGJlIGRvbmUgdG8gdGhlCisgKiBidWZmZXI6IGRlcHRoIHJlc29sdmUgYW5kIGhpeiByZXNvbHZlLgorICovCitlbnVtIGdlbjZfaGl6X29wIHsKKyAgIEdFTjZfSElaX09QX0RFUFRIX0NMRUFSLAorICAgR0VONl9ISVpfT1BfREVQVEhfUkVTT0xWRSwKKyAgIEdFTjZfSElaX09QX0hJWl9SRVNPTFZFLAorICAgR0VONl9ISVpfT1BfTk9ORSwKK307CisKKy8qKgorICogXGJyaWVmIE1hcCBvZiBtaXB0cmVlIHNsaWNlcyB0byBuZWVkZWQgcmVzb2x2ZXMuCisgKgorICogVGhlIG1hcCBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpbmVhciBkb3VibHktbGlua2VkIGxpc3QuCisgKgorICogSW4gdGhlIGludGVsX3Jlc29sdmVfbWFwKigpIGZ1bmN0aW9ucywgdGhlIFxjIGhlYWQgYXJndW1lbnQgaXMgbm90CisgKiBpbnNwZWN0ZWQgZm9yIGl0cyBkYXRhLiBJdCBvbmx5IHNlcnZlcyBhcyBhbiBhbmNob3IgZm9yIHRoZSBsaXN0LgorICoKKyAqIFxwYXIgRGVzaWduIERpc2N1c3Npb24KKyAqCisgKiAgICAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSB3YXlzIHRvIHJlY29yZCB3aGljaCBtaXB0cmVlIHNsaWNlcyBuZWVkCisgKiAgICAgcmVzb2x2ZXMuIDEpIE1haW50YWluIGEgZmxhZyBmb3IgZXZlcnkgbWlwdHJlZSBzbGljZSBpbiB0aGUgdGV4dHVyZSwKKyAqICAgICBsaWtlbHkgaW4gaW50ZWxfbWlwbWFwX2xldmVsOjpzbGljZSwgb3IgMikgbWFpbnRhaW4gYSBsaXN0IG9mIG9ubHkKKyAqICAgICB0aG9zZSBzbGljZXMgdGhhdCBuZWVkIGEgcmVzb2x2ZS4KKyAqCisgKiAgICAgSW1tZWRpYXRlbHkgYmVmb3JlIGRyYXdpbmcsIGEgZnVsbCBkZXB0aCByZXNvbHZlIHBlcmZvcm1lZCBvbiBlYWNoCisgKiAgICAgZW5hYmxlZCBkZXB0aCB0ZXh0dXJlLiBJZiBkZXNpZ24gMSB3ZXJlIGNob3NlbiwgdGhlbiBhdCBlYWNoIGRyYXcgY2FsbAorICogICAgIGl0IHdvdWxkIGJlIG5lY2Vzc2FyeSB0byBpdGVyYXRlIG92ZXIgZWFjaCBtaXB0cmVlIHNsaWNlIG9mIGVhY2gKKyAqICAgICBlbmFibGVkIGRlcHRoIHRleHR1cmUgaW4gb3JkZXIgdG8gcXVlcnkgaWYgZWFjaCBzbGljZSBuZWVkZWQgYSByZXNvbHZlLgorICogICAgIEluIHRoZSB3b3JzdCBjYXNlLCB0aGlzIHdvdWxkIHJlcXVpcmUgMl4xNiBpdGVyYXRpb25zOiAxNiB0ZXh0dXJlCisgKiAgICAgdW5pdHMsIDE2IG1pcGxldmVscywgYW5kIDI1NiBkZXB0aCBsYXllcnMgKGFzc3VtaW5nIG1heGltdW1zIGZvciBPcGVuR0wKKyAqICAgICAyLjEpLgorICoKKyAqICAgICBCeSBjaG9vc2luZyBkZXNpZ24gMiwgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGlzIGV4YWN0bHkgdGhlIG1pbmltdW0KKyAqICAgICBuZWNlc3NhcnkuCisgKi8KK3N0cnVjdCBpbnRlbF9yZXNvbHZlX21hcCB7CisgICB1aW50MzJfdCBsZXZlbDsKKyAgIHVpbnQzMl90IGxheWVyOworICAgZW51bSBnZW42X2hpel9vcCBuZWVkOworCisgICBzdHJ1Y3QgaW50ZWxfcmVzb2x2ZV9tYXAgKm5leHQ7CisgICBzdHJ1Y3QgaW50ZWxfcmVzb2x2ZV9tYXAgKnByZXY7Cit9OworCit2b2lkCitpbnRlbF9yZXNvbHZlX21hcF9zZXQoc3RydWN0IGludGVsX3Jlc29sdmVfbWFwICpoZWFkLAorCQkgICAgICB1aW50MzJfdCBsZXZlbCwKKwkJICAgICAgdWludDMyX3QgbGF5ZXIsCisJCSAgICAgIGVudW0gZ2VuNl9oaXpfb3AgbmVlZCk7CisKK3N0cnVjdCBpbnRlbF9yZXNvbHZlX21hcCoKK2ludGVsX3Jlc29sdmVfbWFwX2dldChzdHJ1Y3QgaW50ZWxfcmVzb2x2ZV9tYXAgKmhlYWQsCisJCSAgICAgIHVpbnQzMl90IGxldmVsLAorCQkgICAgICB1aW50MzJfdCBsYXllcik7CisKK3ZvaWQKK2ludGVsX3Jlc29sdmVfbWFwX3JlbW92ZShzdHJ1Y3QgaW50ZWxfcmVzb2x2ZV9tYXAgKmVsZW0pOworCit2b2lkCitpbnRlbF9yZXNvbHZlX21hcF9jbGVhcihzdHJ1Y3QgaW50ZWxfcmVzb2x2ZV9tYXAgKmhlYWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZXh0ZXJuICJDIiAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9pbnRlbF9zY3JlZW4uYyBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9pbnRlbF9zY3JlZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZlN2YzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX3NjcmVlbi5jCkBAIC0wLDAgKzEsMTQ4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMDMgVk13YXJlLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFZNV0FSRSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJtYWluL2dsaGVhZGVyLmgiCisjaW5jbHVkZSAibWFpbi9jb250ZXh0LmgiCisjaW5jbHVkZSAibWFpbi9mcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgIm1haW4vcmVuZGVyYnVmZmVyLmgiCisjaW5jbHVkZSAibWFpbi90ZXhvYmouaCIKKyNpbmNsdWRlICJtYWluL2hhc2guaCIKKyNpbmNsdWRlICJtYWluL2Zib2JqZWN0LmgiCisjaW5jbHVkZSAibWFpbi92ZXJzaW9uLmgiCisjaW5jbHVkZSAic3dyYXN0L3NfcmVuZGVyYnVmZmVyLmgiCisjaW5jbHVkZSAiZ2xzbC9yYWxsb2MuaCIKKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAieG1scG9vbC5oIgorCitzdGF0aWMgY29uc3QgX19EUkljb25maWdPcHRpb25zRXh0ZW5zaW9uIGJyd19jb25maWdfb3B0aW9ucyA9IHsKKyAgIC5iYXNlID0geyBfX0RSSV9DT05GSUdfT1BUSU9OUywgMSB9LAorICAgLnhtbCA9CitEUklfQ09ORl9CRUdJTgorICAgRFJJX0NPTkZfU0VDVElPTl9QRVJGT1JNQU5DRQorICAgICAgRFJJX0NPTkZfVkJMQU5LX01PREUoRFJJX0NPTkZfVkJMQU5LX0FMV0FZU19TWU5DKQorICAgICAgRFJJX0NPTkZfTVVMVElUSFJFQURfR0xTTF9DT01QSUxFUigwKQorICAgICAgRFJJX0NPTkZfTUFYX1NIQURFUl9DQUNIRV9TSVpFKDApCisKKyAgICAgIC8qIE9wdGlvbnMgY29ycmVzcG9uZCB0byBEUklfQ09ORl9CT19SRVVTRV9ESVNBQkxFRCwKKyAgICAgICAqIERSSV9DT05GX0JPX1JFVVNFX0FMTAorICAgICAgICovCisgICAgICBEUklfQ09ORl9PUFRfQkVHSU5fVihib19yZXVzZSwgZW51bSwgMSwgIjA6MSIpCisJIERSSV9DT05GX0RFU0NfQkVHSU4oZW4sICJCdWZmZXIgb2JqZWN0IHJldXNlIikKKwkgICAgRFJJX0NPTkZfRU5VTSgwLCAiRGlzYWJsZSBidWZmZXIgb2JqZWN0IHJldXNlIikKKwkgICAgRFJJX0NPTkZfRU5VTSgxLCAiRW5hYmxlIHJldXNlIG9mIGFsbCBzaXplcyBvZiBidWZmZXIgb2JqZWN0cyIpCisJIERSSV9DT05GX0RFU0NfRU5ECisgICAgICBEUklfQ09ORl9PUFRfRU5ECisKKyAgICAgIERSSV9DT05GX09QVF9CRUdJTl9CKGhpeiwgInRydWUiKQorCSBEUklfQ09ORl9ERVNDKGVuLCAiRW5hYmxlIEhpZXJhcmNoaWNhbCBaIG9uIGdlbjYrIikKKyAgICAgIERSSV9DT05GX09QVF9FTkQKKworICAgICAgRFJJX0NPTkZfT1BUX0JFR0lOX0IoZGlzYWJsZV9kZXJpdmF0aXZlX29wdGltaXphdGlvbiwgImZhbHNlIikKKwkgRFJJX0NPTkZfREVTQyhlbiwgIkRlcml2YXRpdmVzIHdpdGggZmluZXIgZ3JhbnVsYXJpdHkgYnkgZGVmYXVsdCIpCisgICAgICBEUklfQ09ORl9PUFRfRU5ECisKKyAgICAgIERSSV9DT05GX09QVF9CRUdJTl9WKGdsYXNzX21vZGUsIGVudW0sIDAsICIwOjIiKQorICAgIERSSV9DT05GX0RFU0NfQkVHSU4oZW4sICJHbGFzcyBPcHRpbWl6ZXIgTW9kZSIpCisgICAgICAgRFJJX0NPTkZfRU5VTSgwLCAiRGlzYWJsZSBHbGFzcyBPcHRpbWl6ZXIiKQorICAgICAgIERSSV9DT05GX0VOVU0oMSwgIlVzZSBEcml2ZXIgV2hpdGVsaXN0IikKKyAgICAgICBEUklfQ09ORl9FTlVNKDIsICJFbmFibGUgR2xhc3MgT3B0aW1pemVyIikKKyAgICBEUklfQ09ORl9ERVNDX0VORAorICAgIERSSV9DT05GX09QVF9FTkQKKworICAgICAgRFJJX0NPTkZfT1BUX0JFR0lOX0IoZ2xhc3NfZW5hYmxlX3JlYXNzb2NpYXRpb24sICJ0cnVlIikKKyAgICAgICAgIERSSV9DT05GX0RFU0MoZW4sICJVc2UgcmVhc3NvY2lhdGUgb3B0aW1pemF0aW9uIHBhc3MgaW4gTHVuYXJHTEFTUyIpCisgICAgICBEUklfQ09ORl9PUFRfRU5ECisKKyAgICBEUklfQ09ORl9TRUNUSU9OX0VORAorCisgICBEUklfQ09ORl9TRUNUSU9OX1FVQUxJVFkKKyAgICAgIERSSV9DT05GX0ZPUkNFX1MzVENfRU5BQkxFKCJmYWxzZSIpCisKKyAgICAgIERSSV9DT05GX09QVF9CRUdJTihjbGFtcF9tYXhfc2FtcGxlcywgaW50LCAtMSkKKyAgICAgICAgICAgICAgRFJJX0NPTkZfREVTQyhlbiwgIkNsYW1wIHRoZSB2YWx1ZSBvZiBHTF9NQVhfU0FNUExFUyB0byB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpbnRlZ2VyLiBJZiBuZWdhdGl2ZSwgdGhlbiBkbyBub3QgY2xhbXAuIikKKyAgICAgIERSSV9DT05GX09QVF9FTkQKKyAgIERSSV9DT05GX1NFQ1RJT05fRU5ECisKKyAgIERSSV9DT05GX1NFQ1RJT05fREVCVUcKKyAgICAgIERSSV9DT05GX05PX1JBU1QoImZhbHNlIikKKyAgICAgIERSSV9DT05GX0FMV0FZU19GTFVTSF9CQVRDSCgiZmFsc2UiKQorICAgICAgRFJJX0NPTkZfQUxXQVlTX0ZMVVNIX0NBQ0hFKCJmYWxzZSIpCisgICAgICBEUklfQ09ORl9ESVNBQkxFX1RIUk9UVExJTkcoImZhbHNlIikKKyAgICAgIERSSV9DT05GX0ZPUkNFX0dMU0xfRVhURU5TSU9OU19XQVJOKCJmYWxzZSIpCisgICAgICBEUklfQ09ORl9ESVNBQkxFX0dMU0xfTElORV9DT05USU5VQVRJT05TKCJmYWxzZSIpCisgICAgICBEUklfQ09ORl9ESVNBQkxFX0JMRU5EX0ZVTkNfRVhURU5ERUQoImZhbHNlIikKKworICAgICAgRFJJX0NPTkZfT1BUX0JFR0lOX0Ioc2hhZGVyX3ByZWNvbXBpbGUsICJ0cnVlIikKKwkgRFJJX0NPTkZfREVTQyhlbiwgIlBlcmZvcm0gY29kZSBnZW5lcmF0aW9uIGF0IHNoYWRlciBsaW5rIHRpbWUuIikKKyAgICAgIERSSV9DT05GX09QVF9FTkQKKyAgIERSSV9DT05GX1NFQ1RJT05fRU5ECitEUklfQ09ORl9FTkQKK307CisKKyNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgorI2luY2x1ZGUgImludGVsX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKyNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCisjaW5jbHVkZSAiaW50ZWxfZmJvLmgiCisjaW5jbHVkZSAiaW50ZWxfbWlwbWFwX3RyZWUuaCIKKyNpbmNsdWRlICJpbnRlbF9zY3JlZW4uaCIKKyNpbmNsdWRlICJpbnRlbF90ZXguaCIKKyNpbmNsdWRlICJpbnRlbF9pbWFnZS5oIgorCisjaW5jbHVkZSAiYnJ3X2NvbnRleHQuaCIKKworI2luY2x1ZGUgImk5MTVfZHJtLmgiCisKKy8qKgorICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcywgdGhpcyByZXR1cm5zIGEgdGltZSBpbiBzZWNvbmRzLgorICovCitkb3VibGUKK2dldF90aW1lKHZvaWQpCit7CisgICBzdHJ1Y3QgdGltZXNwZWMgdHA7CisKKyAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHApOworCisgICByZXR1cm4gdHAudHZfc2VjICsgdHAudHZfbnNlYyAvIDEwMDAwMDAwMDAuMDsKK30KKwordm9pZAorYXViX2R1bXBfYm1wKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgpCit7CisgICBzdHJ1Y3QgZ2xfZnJhbWVidWZmZXIgKmZiID0gY3R4LT5EcmF3QnVmZmVyOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IGZiLT5fTnVtQ29sb3JEcmF3QnVmZmVyczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyYnVmZmVyICppcmIgPQorCSBpbnRlbF9yZW5kZXJidWZmZXIoZmItPl9Db2xvckRyYXdCdWZmZXJzW2ldKTsKKworICAgICAgaWYgKGlyYiAmJiBpcmItPm10KSB7CisJIGVudW0gYXViX2R1bXBfYm1wX2Zvcm1hdCBmb3JtYXQ7CisKKwkgc3dpdGNoIChpcmItPkJhc2UuQmFzZS5Gb3JtYXQpIHsKKwkgY2FzZSBNRVNBX0ZPUk1BVF9COEc4UjhBOF9VTk9STToKKwkgY2FzZSBNRVNBX0ZPUk1BVF9COEc4UjhYOF9VTk9STToKKwkgICAgZm9ybWF0ID0gQVVCX0RVTVBfQk1QX0ZPUk1BVF9BUkdCXzg4ODg7CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBjb250aW51ZTsKKwkgfQorCisgICAgICAgICBkcm1faW50ZWxfZ2VtX2JvX2F1Yl9kdW1wX2JtcChpcmItPm10LT5ibywKKwkJCQkgICAgICAgaXJiLT5kcmF3X3gsCisJCQkJICAgICAgIGlyYi0+ZHJhd195LAorCQkJCSAgICAgICBpcmItPkJhc2UuQmFzZS5XaWR0aCwKKwkJCQkgICAgICAgaXJiLT5CYXNlLkJhc2UuSGVpZ2h0LAorCQkJCSAgICAgICBmb3JtYXQsCisJCQkJICAgICAgIGlyYi0+bXQtPnBpdGNoLAorCQkJCSAgICAgICAwKTsKKyAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIGNvbnN0IF9fRFJJdGV4QnVmZmVyRXh0ZW5zaW9uIGludGVsVGV4QnVmZmVyRXh0ZW5zaW9uID0geworICAgLmJhc2UgPSB7IF9fRFJJX1RFWF9CVUZGRVIsIDMgfSwKKworICAgLnNldFRleEJ1ZmZlciAgICAgICAgPSBpbnRlbFNldFRleEJ1ZmZlciwKKyAgIC5zZXRUZXhCdWZmZXIyICAgICAgID0gaW50ZWxTZXRUZXhCdWZmZXIyLAorICAgLnJlbGVhc2VUZXhCdWZmZXIgICAgPSBOVUxMLAorfTsKKworc3RhdGljIHZvaWQKK2ludGVsX2RyaTJfZmx1c2hfd2l0aF9mbGFncyhfX0RSSWNvbnRleHQgKmNQcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJZHJhd2FibGUgKmRQcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gX19EUkkydGhyb3R0bGVSZWFzb24gcmVhc29uKQoreworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBjUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKworICAgaWYgKCFicncpCisgICAgICByZXR1cm47CisKKyAgIHN0cnVjdCBnbF9jb250ZXh0ICpjdHggPSAmYnJ3LT5jdHg7CisKKyAgIEZMVVNIX1ZFUlRJQ0VTKGN0eCwgMCk7CisKKyAgIGlmIChmbGFncyAmIF9fRFJJMl9GTFVTSF9EUkFXQUJMRSkKKyAgICAgIGludGVsX3Jlc29sdmVfZm9yX2RyaTJfZmx1c2goYnJ3LCBkUHJpdik7CisKKyAgIGlmIChyZWFzb24gPT0gX19EUkkyX1RIUk9UVExFX1NXQVBCVUZGRVIgfHwKKyAgICAgICByZWFzb24gPT0gX19EUkkyX1RIUk9UVExFX0ZMVVNIRlJPTlQpIHsKKyAgICAgIGJydy0+bmVlZF90aHJvdHRsZSA9IHRydWU7CisgICB9CisKKyAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGJydyk7CisKKyAgIGlmIChJTlRFTF9ERUJVRyAmIERFQlVHX0FVQikgeworICAgICAgYXViX2R1bXBfYm1wKGN0eCk7CisgICB9Cit9CisKKy8qKgorICogUHJvdmlkZXMgY29tcGF0aWJpbGl0eSB3aXRoIGxvYWRlcnMgdGhhdCBvbmx5IHN1cHBvcnQgdGhlIG9sZGVyICh2ZXJzaW9uCisgKiAxLTMpIGZsdXNoIGludGVyZmFjZS4KKyAqCisgKiBUaGF0IGluY2x1ZGVzIGxpYkdMIHVwIHRvIE1lc2EgOS4wLCBhbmQgdGhlIFggU2VydmVyIGF0IGxlYXN0IHVwIHRvIDEuMTMuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9kcmkyX2ZsdXNoKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlKQoreworICAgaW50ZWxfZHJpMl9mbHVzaF93aXRoX2ZsYWdzKGRyYXdhYmxlLT5kcmlDb250ZXh0UHJpdiwgZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19EUkkyX0ZMVVNIX0RSQVdBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJMl9USFJPVFRMRV9TV0FQQlVGRkVSKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBfX0RSSTJmbHVzaEV4dGVuc2lvblJlYyBpbnRlbEZsdXNoRXh0ZW5zaW9uID0geworICAgIC5iYXNlID0geyBfX0RSSTJfRkxVU0gsIDQgfSwKKworICAgIC5mbHVzaCAgICAgICAgICAgICAgPSBpbnRlbF9kcmkyX2ZsdXNoLAorICAgIC5pbnZhbGlkYXRlICAgICAgICAgPSBkcmkySW52YWxpZGF0ZURyYXdhYmxlLAorICAgIC5mbHVzaF93aXRoX2ZsYWdzICAgPSBpbnRlbF9kcmkyX2ZsdXNoX3dpdGhfZmxhZ3MsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX2ltYWdlX2Zvcm1hdCBpbnRlbF9pbWFnZV9mb3JtYXRzW10gPSB7CisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19BUkdCODg4OCwgX19EUklfSU1BR0VfQ09NUE9ORU5UU19SR0JBLCAxLAorICAgICB7IHsgMCwgMCwgMCwgX19EUklfSU1BR0VfRk9STUFUX0FSR0I4ODg4LCA0IH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19TQVJHQjg4ODgsIF9fRFJJX0lNQUdFX0NPTVBPTkVOVFNfUkdCQSwgMSwKKyAgICAgeyB7IDAsIDAsIDAsIF9fRFJJX0lNQUdFX0ZPUk1BVF9TQVJHQjgsIDQgfSB9IH0sCisKKyAgIHsgX19EUklfSU1BR0VfRk9VUkNDX1hSR0I4ODg4LCBfX0RSSV9JTUFHRV9DT01QT05FTlRTX1JHQiwgMSwKKyAgICAgeyB7IDAsIDAsIDAsIF9fRFJJX0lNQUdFX0ZPUk1BVF9YUkdCODg4OCwgNCB9LCB9IH0sCisKKyAgIHsgX19EUklfSU1BR0VfRk9VUkNDX1JHQjU2NSwgX19EUklfSU1BR0VfQ09NUE9ORU5UU19SR0IsIDEsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUkdCNTY1LCAyIH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19ZVVY0MTAsIF9fRFJJX0lNQUdFX0NPTVBPTkVOVFNfWV9VX1YsIDMsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUjgsIDEgfSwKKyAgICAgICB7IDEsIDIsIDIsIF9fRFJJX0lNQUdFX0ZPUk1BVF9SOCwgMSB9LAorICAgICAgIHsgMiwgMiwgMiwgX19EUklfSU1BR0VfRk9STUFUX1I4LCAxIH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19ZVVY0MTEsIF9fRFJJX0lNQUdFX0NPTVBPTkVOVFNfWV9VX1YsIDMsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUjgsIDEgfSwKKyAgICAgICB7IDEsIDIsIDAsIF9fRFJJX0lNQUdFX0ZPUk1BVF9SOCwgMSB9LAorICAgICAgIHsgMiwgMiwgMCwgX19EUklfSU1BR0VfRk9STUFUX1I4LCAxIH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19ZVVY0MjAsIF9fRFJJX0lNQUdFX0NPTVBPTkVOVFNfWV9VX1YsIDMsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUjgsIDEgfSwKKyAgICAgICB7IDEsIDEsIDEsIF9fRFJJX0lNQUdFX0ZPUk1BVF9SOCwgMSB9LAorICAgICAgIHsgMiwgMSwgMSwgX19EUklfSU1BR0VfRk9STUFUX1I4LCAxIH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19ZVVY0MjIsIF9fRFJJX0lNQUdFX0NPTVBPTkVOVFNfWV9VX1YsIDMsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUjgsIDEgfSwKKyAgICAgICB7IDEsIDEsIDAsIF9fRFJJX0lNQUdFX0ZPUk1BVF9SOCwgMSB9LAorICAgICAgIHsgMiwgMSwgMCwgX19EUklfSU1BR0VfRk9STUFUX1I4LCAxIH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19ZVVY0NDQsIF9fRFJJX0lNQUdFX0NPTVBPTkVOVFNfWV9VX1YsIDMsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUjgsIDEgfSwKKyAgICAgICB7IDEsIDAsIDAsIF9fRFJJX0lNQUdFX0ZPUk1BVF9SOCwgMSB9LAorICAgICAgIHsgMiwgMCwgMCwgX19EUklfSU1BR0VfRk9STUFUX1I4LCAxIH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19OVjEyLCBfX0RSSV9JTUFHRV9DT01QT05FTlRTX1lfVVYsIDIsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUjgsIDEgfSwKKyAgICAgICB7IDEsIDEsIDEsIF9fRFJJX0lNQUdFX0ZPUk1BVF9HUjg4LCAyIH0gfSB9LAorCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19OVjE2LCBfX0RSSV9JTUFHRV9DT01QT05FTlRTX1lfVVYsIDIsCisgICAgIHsgeyAwLCAwLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfUjgsIDEgfSwKKyAgICAgICB7IDEsIDEsIDAsIF9fRFJJX0lNQUdFX0ZPUk1BVF9HUjg4LCAyIH0gfSB9LAorCisgICAvKiBGb3IgWVVZViBidWZmZXJzLCB3ZSBzZXQgdXAgdHdvIG92ZXJsYXBwaW5nIERSSSBpbWFnZXMgYW5kIHRyZWF0CisgICAgKiB0aGVtIGFzIHBsYW5hciBidWZmZXJzIGluIHRoZSBjb21wb3NpdG9ycy4gIFBsYW5lIDAgaXMgR1I4OCBhbmQKKyAgICAqIHNhbXBsZXMgWVUgb3IgWVYgcGFpcnMgYW5kIHBsYWNlcyBZIGludG8gdGhlIFIgY29tcG9uZW50LCB3aGlsZQorICAgICogcGxhbmUgMSBpcyBBUkdCIGFuZCBzYW1wbGVzIFlVWVYgY2x1c3RlcnMgYW5kIHBsYWNlcyBwYWlycyBhbmQKKyAgICAqIHBsYWNlcyBVIGludG8gdGhlIEcgY29tcG9uZW50IGFuZCBWIGludG8gQS4gIFRoaXMgbGV0cyB0aGUKKyAgICAqIHRleHR1cmUgc2FtcGxlciBpbnRlcnBvbGF0ZSB0aGUgWSBjb21wb25lbnRzIGNvcnJlY3RseSB3aGVuCisgICAgKiBzYW1wbGluZyBmcm9tIHBsYW5lIDAsIGFuZCBpbnRlcnBvbGF0ZSBVIGFuZCBWIGNvcnJlY3RseSB3aGVuCisgICAgKiBzYW1wbGluZyBmcm9tIHBsYW5lIDEuICovCisgICB7IF9fRFJJX0lNQUdFX0ZPVVJDQ19ZVVlWLCBfX0RSSV9JTUFHRV9DT01QT05FTlRTX1lfWFVYViwgMiwKKyAgICAgeyB7IDAsIDAsIDAsIF9fRFJJX0lNQUdFX0ZPUk1BVF9HUjg4LCAyIH0sCisgICAgICAgeyAwLCAxLCAwLCBfX0RSSV9JTUFHRV9GT1JNQVRfQVJHQjg4ODgsIDQgfSB9IH0KK307CisKK3N0YXRpYyB2b2lkCitpbnRlbF9pbWFnZV93YXJuX2lmX3VuYWxpZ25lZChfX0RSSWltYWdlICppbWFnZSwgY29uc3QgY2hhciAqZnVuYykKK3sKKyAgIHVpbnQzMl90IHRpbGluZywgc3dpenpsZTsKKyAgIGRybV9pbnRlbF9ib19nZXRfdGlsaW5nKGltYWdlLT5ibywgJnRpbGluZywgJnN3aXp6bGUpOworCisgICBpZiAodGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUgJiYgKGltYWdlLT5vZmZzZXQgJiAweGZmZikpIHsKKyAgICAgIF9tZXNhX3dhcm5pbmcoTlVMTCwgIiVzOiBvZmZzZXQgMHglMDh4IG5vdCBvbiB0aWxlIGJvdW5kYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgZnVuYywgaW1hZ2UtPm9mZnNldCk7CisgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfaW1hZ2VfZm9ybWF0ICoKK2ludGVsX2ltYWdlX2Zvcm1hdF9sb29rdXAoaW50IGZvdXJjYykKK3sKKyAgIHN0cnVjdCBpbnRlbF9pbWFnZV9mb3JtYXQgKmYgPSBOVUxMOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbnRlbF9pbWFnZV9mb3JtYXRzKTsgaSsrKSB7CisgICAgICBpZiAoaW50ZWxfaW1hZ2VfZm9ybWF0c1tpXS5mb3VyY2MgPT0gZm91cmNjKSB7CisJIGYgPSAmaW50ZWxfaW1hZ2VfZm9ybWF0c1tpXTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBmOworfQorCitzdGF0aWMgX19EUklpbWFnZSAqCitpbnRlbF9hbGxvY2F0ZV9pbWFnZShpbnQgZHJpX2Zvcm1hdCwgdm9pZCAqbG9hZGVyUHJpdmF0ZSkKK3sKKyAgICBfX0RSSWltYWdlICppbWFnZTsKKworICAgIGltYWdlID0gY2FsbG9jKDEsIHNpemVvZiAqaW1hZ2UpOworICAgIGlmIChpbWFnZSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgaW1hZ2UtPmRyaV9mb3JtYXQgPSBkcmlfZm9ybWF0OworICAgIGltYWdlLT5vZmZzZXQgPSAwOworCisgICAgaW1hZ2UtPmZvcm1hdCA9IGRyaUltYWdlRm9ybWF0VG9HTEZvcm1hdChkcmlfZm9ybWF0KTsKKyAgICBpZiAoZHJpX2Zvcm1hdCAhPSBfX0RSSV9JTUFHRV9GT1JNQVRfTk9ORSAmJgorICAgICAgICBpbWFnZS0+Zm9ybWF0ID09IE1FU0FfRk9STUFUX05PTkUpIHsKKyAgICAgICBmcmVlKGltYWdlKTsKKyAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbWFnZS0+aW50ZXJuYWxfZm9ybWF0ID0gX21lc2FfZ2V0X2Zvcm1hdF9iYXNlX2Zvcm1hdChpbWFnZS0+Zm9ybWF0KTsKKyAgICBpbWFnZS0+ZGF0YSA9IGxvYWRlclByaXZhdGU7CisKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKKy8qKgorICogU2V0cyB1cCBhIERSSUltYWdlIHN0cnVjdHVyZSB0byBwb2ludCB0byBhIHNsaWNlIG91dCBvZiBhIG1pcHRyZWUuCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlbF9zZXR1cF9pbWFnZV9mcm9tX21pcG1hcF90cmVlKHN0cnVjdCBicndfY29udGV4dCAqYnJ3LCBfX0RSSWltYWdlICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21pcG1hcF90cmVlICptdCwgR0x1aW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgem9mZnNldCkKK3sKKyAgIGludGVsX21pcHRyZWVfbWFrZV9zaGFyZWFibGUoYnJ3LCBtdCk7CisKKyAgIGludGVsX21pcHRyZWVfY2hlY2tfbGV2ZWxfbGF5ZXIobXQsIGxldmVsLCB6b2Zmc2V0KTsKKworICAgaW1hZ2UtPndpZHRoID0gbWluaWZ5KG10LT5waHlzaWNhbF93aWR0aDAsIGxldmVsIC0gbXQtPmZpcnN0X2xldmVsKTsKKyAgIGltYWdlLT5oZWlnaHQgPSBtaW5pZnkobXQtPnBoeXNpY2FsX2hlaWdodDAsIGxldmVsIC0gbXQtPmZpcnN0X2xldmVsKTsKKyAgIGltYWdlLT5waXRjaCA9IG10LT5waXRjaDsKKworICAgaW1hZ2UtPm9mZnNldCA9IGludGVsX21pcHRyZWVfZ2V0X3RpbGVfb2Zmc2V0cyhtdCwgbGV2ZWwsIHpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZS0+dGlsZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2UtPnRpbGVfeSk7CisKKyAgIGRybV9pbnRlbF9ib191bnJlZmVyZW5jZShpbWFnZS0+Ym8pOworICAgaW1hZ2UtPmJvID0gbXQtPmJvOworICAgZHJtX2ludGVsX2JvX3JlZmVyZW5jZShtdC0+Ym8pOworfQorCitzdGF0aWMgX19EUklpbWFnZSAqCitpbnRlbF9jcmVhdGVfaW1hZ2VfZnJvbV9uYW1lKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKKwkJCSAgICAgaW50IG5hbWUsIGludCBwaXRjaCwgdm9pZCAqbG9hZGVyUHJpdmF0ZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfc2NyZWVuICppbnRlbFNjcmVlbiA9IHNjcmVlbi0+ZHJpdmVyUHJpdmF0ZTsKKyAgICBfX0RSSWltYWdlICppbWFnZTsKKyAgICBpbnQgY3BwOworCisgICAgaW1hZ2UgPSBpbnRlbF9hbGxvY2F0ZV9pbWFnZShmb3JtYXQsIGxvYWRlclByaXZhdGUpOworICAgIGlmIChpbWFnZSA9PSBOVUxMKQorICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGltYWdlLT5mb3JtYXQgPT0gTUVTQV9GT1JNQVRfTk9ORSkKKyAgICAgICBjcHAgPSAxOworICAgIGVsc2UKKyAgICAgICBjcHAgPSBfbWVzYV9nZXRfZm9ybWF0X2J5dGVzKGltYWdlLT5mb3JtYXQpOworCisgICAgaW1hZ2UtPndpZHRoID0gd2lkdGg7CisgICAgaW1hZ2UtPmhlaWdodCA9IGhlaWdodDsKKyAgICBpbWFnZS0+cGl0Y2ggPSBwaXRjaCAqIGNwcDsKKyAgICBpbWFnZS0+Ym8gPSBkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUoaW50ZWxTY3JlZW4tPmJ1Zm1nciwgImltYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgaWYgKCFpbWFnZS0+Ym8pIHsKKyAgICAgICBmcmVlKGltYWdlKTsKKyAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gaW1hZ2U7CQorfQorCitzdGF0aWMgX19EUklpbWFnZSAqCitpbnRlbF9jcmVhdGVfaW1hZ2VfZnJvbV9yZW5kZXJidWZmZXIoX19EUkljb250ZXh0ICpjb250ZXh0LAorCQkJCSAgICAgaW50IHJlbmRlcmJ1ZmZlciwgdm9pZCAqbG9hZGVyUHJpdmF0ZSkKK3sKKyAgIF9fRFJJaW1hZ2UgKmltYWdlOworICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBjb250ZXh0LT5kcml2ZXJQcml2YXRlOworICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eCA9ICZicnctPmN0eDsKKyAgIHN0cnVjdCBnbF9yZW5kZXJidWZmZXIgKnJiOworICAgc3RydWN0IGludGVsX3JlbmRlcmJ1ZmZlciAqaXJiOworCisgICByYiA9IF9tZXNhX2xvb2t1cF9yZW5kZXJidWZmZXIoY3R4LCByZW5kZXJidWZmZXIpOworICAgaWYgKCFyYikgeworICAgICAgX21lc2FfZXJyb3IoY3R4LCBHTF9JTlZBTElEX09QRVJBVElPTiwgImdsUmVuZGVyYnVmZmVyRXh0ZXJuYWxNRVNBIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaXJiID0gaW50ZWxfcmVuZGVyYnVmZmVyKHJiKTsKKyAgIGludGVsX21pcHRyZWVfbWFrZV9zaGFyZWFibGUoYnJ3LCBpcmItPm10KTsKKyAgIGltYWdlID0gY2FsbG9jKDEsIHNpemVvZiAqaW1hZ2UpOworICAgaWYgKGltYWdlID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaW1hZ2UtPmludGVybmFsX2Zvcm1hdCA9IHJiLT5JbnRlcm5hbEZvcm1hdDsKKyAgIGltYWdlLT5mb3JtYXQgPSByYi0+Rm9ybWF0OworICAgaW1hZ2UtPm9mZnNldCA9IDA7CisgICBpbWFnZS0+ZGF0YSA9IGxvYWRlclByaXZhdGU7CisgICBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoaW1hZ2UtPmJvKTsKKyAgIGltYWdlLT5ibyA9IGlyYi0+bXQtPmJvOworICAgZHJtX2ludGVsX2JvX3JlZmVyZW5jZShpcmItPm10LT5ibyk7CisgICBpbWFnZS0+d2lkdGggPSByYi0+V2lkdGg7CisgICBpbWFnZS0+aGVpZ2h0ID0gcmItPkhlaWdodDsKKyAgIGltYWdlLT5waXRjaCA9IGlyYi0+bXQtPnBpdGNoOworICAgaW1hZ2UtPmRyaV9mb3JtYXQgPSBkcmlHTEZvcm1hdFRvSW1hZ2VGb3JtYXQoaW1hZ2UtPmZvcm1hdCk7CisgICBpbWFnZS0+aGFzX2RlcHRoc3RlbmNpbCA9IGlyYi0+bXQtPnN0ZW5jaWxfbXQ/IHRydWUgOiBmYWxzZTsKKworICAgcmItPk5lZWRzRmluaXNoUmVuZGVyVGV4dHVyZSA9IHRydWU7CisgICByZXR1cm4gaW1hZ2U7Cit9CisKK3N0YXRpYyBfX0RSSWltYWdlICoKK2ludGVsX2NyZWF0ZV9pbWFnZV9mcm9tX3RleHR1cmUoX19EUkljb250ZXh0ICpjb250ZXh0LCBpbnQgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB0ZXh0dXJlLCBpbnQgem9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpCit7CisgICBfX0RSSWltYWdlICppbWFnZTsKKyAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gY29udGV4dC0+ZHJpdmVyUHJpdmF0ZTsKKyAgIHN0cnVjdCBnbF90ZXh0dXJlX29iamVjdCAqb2JqOworICAgc3RydWN0IGludGVsX3RleHR1cmVfb2JqZWN0ICppb2JqOworICAgR0x1aW50IGZhY2UgPSAwOworCisgICBvYmogPSBfbWVzYV9sb29rdXBfdGV4dHVyZSgmYnJ3LT5jdHgsIHRleHR1cmUpOworICAgaWYgKCFvYmogfHwgb2JqLT5UYXJnZXQgIT0gdGFyZ2V0KSB7CisgICAgICAqZXJyb3IgPSBfX0RSSV9JTUFHRV9FUlJPUl9CQURfUEFSQU1FVEVSOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlmICh0YXJnZXQgPT0gR0xfVEVYVFVSRV9DVUJFX01BUCkKKyAgICAgIGZhY2UgPSB6b2Zmc2V0OworCisgICBfbWVzYV90ZXN0X3RleG9ial9jb21wbGV0ZW5lc3MoJmJydy0+Y3R4LCBvYmopOworICAgaW9iaiA9IGludGVsX3RleHR1cmVfb2JqZWN0KG9iaik7CisgICBpZiAoIW9iai0+X0Jhc2VDb21wbGV0ZSB8fCAobGV2ZWwgPiAwICYmICFvYmotPl9NaXBtYXBDb21wbGV0ZSkpIHsKKyAgICAgICplcnJvciA9IF9fRFJJX0lNQUdFX0VSUk9SX0JBRF9QQVJBTUVURVI7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKGxldmVsIDwgb2JqLT5CYXNlTGV2ZWwgfHwgbGV2ZWwgPiBvYmotPl9NYXhMZXZlbCkgeworICAgICAgKmVycm9yID0gX19EUklfSU1BR0VfRVJST1JfQkFEX01BVENIOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlmICh0YXJnZXQgPT0gR0xfVEVYVFVSRV8zRCAmJiBvYmotPkltYWdlW2ZhY2VdW2xldmVsXS0+RGVwdGggPCB6b2Zmc2V0KSB7CisgICAgICAqZXJyb3IgPSBfX0RSSV9JTUFHRV9FUlJPUl9CQURfTUFUQ0g7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIGltYWdlID0gY2FsbG9jKDEsIHNpemVvZiAqaW1hZ2UpOworICAgaWYgKGltYWdlID09IE5VTEwpIHsKKyAgICAgICplcnJvciA9IF9fRFJJX0lNQUdFX0VSUk9SX0JBRF9BTExPQzsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpbWFnZS0+aW50ZXJuYWxfZm9ybWF0ID0gb2JqLT5JbWFnZVtmYWNlXVtsZXZlbF0tPkludGVybmFsRm9ybWF0OworICAgaW1hZ2UtPmZvcm1hdCA9IG9iai0+SW1hZ2VbZmFjZV1bbGV2ZWxdLT5UZXhGb3JtYXQ7CisgICBpbWFnZS0+ZGF0YSA9IGxvYWRlclByaXZhdGU7CisgICBpbnRlbF9zZXR1cF9pbWFnZV9mcm9tX21pcG1hcF90cmVlKGJydywgaW1hZ2UsIGlvYmotPm10LCBsZXZlbCwgem9mZnNldCk7CisgICBpbWFnZS0+ZHJpX2Zvcm1hdCA9IGRyaUdMRm9ybWF0VG9JbWFnZUZvcm1hdChpbWFnZS0+Zm9ybWF0KTsKKyAgIGltYWdlLT5oYXNfZGVwdGhzdGVuY2lsID0gaW9iai0+bXQtPnN0ZW5jaWxfbXQ/IHRydWUgOiBmYWxzZTsKKyAgIGlmIChpbWFnZS0+ZHJpX2Zvcm1hdCA9PSBNRVNBX0ZPUk1BVF9OT05FKSB7CisgICAgICAqZXJyb3IgPSBfX0RSSV9JTUFHRV9FUlJPUl9CQURfUEFSQU1FVEVSOworICAgICAgZnJlZShpbWFnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgKmVycm9yID0gX19EUklfSU1BR0VfRVJST1JfU1VDQ0VTUzsKKyAgIHJldHVybiBpbWFnZTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX2Rlc3Ryb3lfaW1hZ2UoX19EUklpbWFnZSAqaW1hZ2UpCit7CisgICBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoaW1hZ2UtPmJvKTsKKyAgIGZyZWUoaW1hZ2UpOworfQorCitzdGF0aWMgX19EUklpbWFnZSAqCitpbnRlbF9jcmVhdGVfaW1hZ2UoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAorCQkgICB1bnNpZ25lZCBpbnQgdXNlLAorCQkgICB2b2lkICpsb2FkZXJQcml2YXRlKQoreworICAgX19EUklpbWFnZSAqaW1hZ2U7CisgICBzdHJ1Y3QgaW50ZWxfc2NyZWVuICppbnRlbFNjcmVlbiA9IHNjcmVlbi0+ZHJpdmVyUHJpdmF0ZTsKKyAgIHVpbnQzMl90IHRpbGluZzsKKyAgIGludCBjcHA7CisgICB1bnNpZ25lZCBsb25nIHBpdGNoOworCisgICB0aWxpbmcgPSBJOTE1X1RJTElOR19YOworICAgaWYgKHVzZSAmIF9fRFJJX0lNQUdFX1VTRV9DVVJTT1IpIHsKKyAgICAgIGlmICh3aWR0aCAhPSA2NCB8fCBoZWlnaHQgIT0gNjQpCisJIHJldHVybiBOVUxMOworICAgICAgdGlsaW5nID0gSTkxNV9USUxJTkdfTk9ORTsKKyAgIH0KKworICAgaWYgKHVzZSAmIF9fRFJJX0lNQUdFX1VTRV9MSU5FQVIpCisgICAgICB0aWxpbmcgPSBJOTE1X1RJTElOR19OT05FOworCisgICBpbWFnZSA9IGludGVsX2FsbG9jYXRlX2ltYWdlKGZvcm1hdCwgbG9hZGVyUHJpdmF0ZSk7CisgICBpZiAoaW1hZ2UgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAKKyAgIGNwcCA9IF9tZXNhX2dldF9mb3JtYXRfYnl0ZXMoaW1hZ2UtPmZvcm1hdCk7CisgICBpbWFnZS0+Ym8gPSBkcm1faW50ZWxfYm9fYWxsb2NfdGlsZWQoaW50ZWxTY3JlZW4tPmJ1Zm1nciwgImltYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjcHAsICZ0aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpdGNoLCAwKTsKKyAgIGlmIChpbWFnZS0+Ym8gPT0gTlVMTCkgeworICAgICAgZnJlZShpbWFnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIGltYWdlLT53aWR0aCA9IHdpZHRoOworICAgaW1hZ2UtPmhlaWdodCA9IGhlaWdodDsKKyAgIGltYWdlLT5waXRjaCA9IHBpdGNoOworCisgICByZXR1cm4gaW1hZ2U7Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX3F1ZXJ5X2ltYWdlKF9fRFJJaW1hZ2UgKmltYWdlLCBpbnQgYXR0cmliLCBpbnQgKnZhbHVlKQoreworICAgc3dpdGNoIChhdHRyaWIpIHsKKyAgIGNhc2UgX19EUklfSU1BR0VfQVRUUklCX1NUUklERToKKyAgICAgICp2YWx1ZSA9IGltYWdlLT5waXRjaDsKKyAgICAgIHJldHVybiB0cnVlOworICAgY2FzZSBfX0RSSV9JTUFHRV9BVFRSSUJfSEFORExFOgorICAgICAgKnZhbHVlID0gaW1hZ2UtPmJvLT5oYW5kbGU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGNhc2UgX19EUklfSU1BR0VfQVRUUklCX05BTUU6CisgICAgICByZXR1cm4gIWRybV9pbnRlbF9ib19mbGluayhpbWFnZS0+Ym8sICh1aW50MzJfdCAqKSB2YWx1ZSk7CisgICBjYXNlIF9fRFJJX0lNQUdFX0FUVFJJQl9GT1JNQVQ6CisgICAgICAqdmFsdWUgPSBpbWFnZS0+ZHJpX2Zvcm1hdDsKKyAgICAgIHJldHVybiB0cnVlOworICAgY2FzZSBfX0RSSV9JTUFHRV9BVFRSSUJfV0lEVEg6CisgICAgICAqdmFsdWUgPSBpbWFnZS0+d2lkdGg7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGNhc2UgX19EUklfSU1BR0VfQVRUUklCX0hFSUdIVDoKKyAgICAgICp2YWx1ZSA9IGltYWdlLT5oZWlnaHQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGNhc2UgX19EUklfSU1BR0VfQVRUUklCX0NPTVBPTkVOVFM6CisgICAgICBpZiAoaW1hZ2UtPnBsYW5hcl9mb3JtYXQgPT0gTlVMTCkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICp2YWx1ZSA9IGltYWdlLT5wbGFuYXJfZm9ybWF0LT5jb21wb25lbnRzOworICAgICAgcmV0dXJuIHRydWU7CisgICBjYXNlIF9fRFJJX0lNQUdFX0FUVFJJQl9GRDoKKyAgICAgIGlmIChkcm1faW50ZWxfYm9fZ2VtX2V4cG9ydF90b19wcmltZShpbWFnZS0+Ym8sIHZhbHVlKSA9PSAwKQorICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9CisKK3N0YXRpYyBfX0RSSWltYWdlICoKK2ludGVsX2R1cF9pbWFnZShfX0RSSWltYWdlICpvcmlnX2ltYWdlLCB2b2lkICpsb2FkZXJQcml2YXRlKQoreworICAgX19EUklpbWFnZSAqaW1hZ2U7CisKKyAgIGltYWdlID0gY2FsbG9jKDEsIHNpemVvZiAqaW1hZ2UpOworICAgaWYgKGltYWdlID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgZHJtX2ludGVsX2JvX3JlZmVyZW5jZShvcmlnX2ltYWdlLT5ibyk7CisgICBpbWFnZS0+Ym8gICAgICAgICAgICAgID0gb3JpZ19pbWFnZS0+Ym87CisgICBpbWFnZS0+aW50ZXJuYWxfZm9ybWF0ID0gb3JpZ19pbWFnZS0+aW50ZXJuYWxfZm9ybWF0OworICAgaW1hZ2UtPnBsYW5hcl9mb3JtYXQgICA9IG9yaWdfaW1hZ2UtPnBsYW5hcl9mb3JtYXQ7CisgICBpbWFnZS0+ZHJpX2Zvcm1hdCAgICAgID0gb3JpZ19pbWFnZS0+ZHJpX2Zvcm1hdDsKKyAgIGltYWdlLT5mb3JtYXQgICAgICAgICAgPSBvcmlnX2ltYWdlLT5mb3JtYXQ7CisgICBpbWFnZS0+b2Zmc2V0ICAgICAgICAgID0gb3JpZ19pbWFnZS0+b2Zmc2V0OworICAgaW1hZ2UtPndpZHRoICAgICAgICAgICA9IG9yaWdfaW1hZ2UtPndpZHRoOworICAgaW1hZ2UtPmhlaWdodCAgICAgICAgICA9IG9yaWdfaW1hZ2UtPmhlaWdodDsKKyAgIGltYWdlLT5waXRjaCAgICAgICAgICAgPSBvcmlnX2ltYWdlLT5waXRjaDsKKyAgIGltYWdlLT50aWxlX3ggICAgICAgICAgPSBvcmlnX2ltYWdlLT50aWxlX3g7CisgICBpbWFnZS0+dGlsZV95ICAgICAgICAgID0gb3JpZ19pbWFnZS0+dGlsZV95OworICAgaW1hZ2UtPmhhc19kZXB0aHN0ZW5jaWwgPSBvcmlnX2ltYWdlLT5oYXNfZGVwdGhzdGVuY2lsOworICAgaW1hZ2UtPmRhdGEgICAgICAgICAgICA9IGxvYWRlclByaXZhdGU7CisKKyAgIG1lbWNweShpbWFnZS0+c3RyaWRlcywgb3JpZ19pbWFnZS0+c3RyaWRlcywgc2l6ZW9mKGltYWdlLT5zdHJpZGVzKSk7CisgICBtZW1jcHkoaW1hZ2UtPm9mZnNldHMsIG9yaWdfaW1hZ2UtPm9mZnNldHMsIHNpemVvZihpbWFnZS0+b2Zmc2V0cykpOworCisgICByZXR1cm4gaW1hZ2U7Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4KK2ludGVsX3ZhbGlkYXRlX3VzYWdlKF9fRFJJaW1hZ2UgKmltYWdlLCB1bnNpZ25lZCBpbnQgdXNlKQoreworICAgaWYgKHVzZSAmIF9fRFJJX0lNQUdFX1VTRV9DVVJTT1IpIHsKKyAgICAgIGlmIChpbWFnZS0+d2lkdGggIT0gNjQgfHwgaW1hZ2UtPmhlaWdodCAhPSA2NCkKKwkgcmV0dXJuIEdMX0ZBTFNFOworICAgfQorCisgICByZXR1cm4gR0xfVFJVRTsKK30KKworc3RhdGljIF9fRFJJaW1hZ2UgKgoraW50ZWxfY3JlYXRlX2ltYWdlX2Zyb21fbmFtZXMoX19EUklzY3JlZW4gKnNjcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvdXJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmFtZXMsIGludCBudW1fbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN0cmlkZXMsIGludCAqb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpCit7CisgICAgc3RydWN0IGludGVsX2ltYWdlX2Zvcm1hdCAqZiA9IE5VTEw7CisgICAgX19EUklpbWFnZSAqaW1hZ2U7CisgICAgaW50IGksIGluZGV4OworCisgICAgaWYgKHNjcmVlbiA9PSBOVUxMIHx8IG5hbWVzID09IE5VTEwgfHwgbnVtX25hbWVzICE9IDEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZiA9IGludGVsX2ltYWdlX2Zvcm1hdF9sb29rdXAoZm91cmNjKTsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGltYWdlID0gaW50ZWxfY3JlYXRlX2ltYWdlX2Zyb21fbmFtZShzY3JlZW4sIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJX0lNQUdFX0ZPUk1BVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc1swXSwgc3RyaWRlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyUHJpdmF0ZSk7CisKKyAgIGlmIChpbWFnZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpbWFnZS0+cGxhbmFyX2Zvcm1hdCA9IGY7CisgICAgZm9yIChpID0gMDsgaSA8IGYtPm5wbGFuZXM7IGkrKykgeworICAgICAgICBpbmRleCA9IGYtPnBsYW5lc1tpXS5idWZmZXJfaW5kZXg7CisgICAgICAgIGltYWdlLT5vZmZzZXRzW2luZGV4XSA9IG9mZnNldHNbaW5kZXhdOworICAgICAgICBpbWFnZS0+c3RyaWRlc1tpbmRleF0gPSBzdHJpZGVzW2luZGV4XTsKKyAgICB9CisKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKK3N0YXRpYyBfX0RSSWltYWdlICoKK2ludGVsX2NyZWF0ZV9pbWFnZV9mcm9tX2ZkcyhfX0RSSXNjcmVlbiAqc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvdXJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZkcywgaW50IG51bV9mZHMsIGludCAqc3RyaWRlcywgaW50ICpvZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpCit7CisgICBzdHJ1Y3QgaW50ZWxfc2NyZWVuICppbnRlbFNjcmVlbiA9IHNjcmVlbi0+ZHJpdmVyUHJpdmF0ZTsKKyAgIHN0cnVjdCBpbnRlbF9pbWFnZV9mb3JtYXQgKmY7CisgICBfX0RSSWltYWdlICppbWFnZTsKKyAgIGludCBpLCBpbmRleDsKKworICAgaWYgKGZkcyA9PSBOVUxMIHx8IG51bV9mZHMgIT0gMSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBmID0gaW50ZWxfaW1hZ2VfZm9ybWF0X2xvb2t1cChmb3VyY2MpOworICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAoZi0+bnBsYW5lcyA9PSAxKQorICAgICAgaW1hZ2UgPSBpbnRlbF9hbGxvY2F0ZV9pbWFnZShmLT5wbGFuZXNbMF0uZHJpX2Zvcm1hdCwgbG9hZGVyUHJpdmF0ZSk7CisgICBlbHNlCisgICAgICBpbWFnZSA9IGludGVsX2FsbG9jYXRlX2ltYWdlKF9fRFJJX0lNQUdFX0ZPUk1BVF9OT05FLCBsb2FkZXJQcml2YXRlKTsKKworICAgaWYgKGltYWdlID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaW1hZ2UtPmJvID0gZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9wcmltZShpbnRlbFNjcmVlbi0+YnVmbWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAqIHN0cmlkZXNbMF0pOworICAgaWYgKGltYWdlLT5ibyA9PSBOVUxMKSB7CisgICAgICBmcmVlKGltYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorICAgaW1hZ2UtPndpZHRoID0gd2lkdGg7CisgICBpbWFnZS0+aGVpZ2h0ID0gaGVpZ2h0OworICAgaW1hZ2UtPnBpdGNoID0gc3RyaWRlc1swXTsKKworICAgaW1hZ2UtPnBsYW5hcl9mb3JtYXQgPSBmOworICAgZm9yIChpID0gMDsgaSA8IGYtPm5wbGFuZXM7IGkrKykgeworICAgICAgaW5kZXggPSBmLT5wbGFuZXNbaV0uYnVmZmVyX2luZGV4OworICAgICAgaW1hZ2UtPm9mZnNldHNbaW5kZXhdID0gb2Zmc2V0c1tpbmRleF07CisgICAgICBpbWFnZS0+c3RyaWRlc1tpbmRleF0gPSBzdHJpZGVzW2luZGV4XTsKKyAgIH0KKworICAgaWYgKGYtPm5wbGFuZXMgPT0gMSkgeworICAgICAgaW1hZ2UtPm9mZnNldCA9IGltYWdlLT5vZmZzZXRzWzBdOworICAgICAgaW50ZWxfaW1hZ2Vfd2Fybl9pZl91bmFsaWduZWQoaW1hZ2UsIF9fRlVOQ1RJT05fXyk7CisgICB9CisKKyAgIHJldHVybiBpbWFnZTsKK30KKworc3RhdGljIF9fRFJJaW1hZ2UgKgoraW50ZWxfY3JlYXRlX2ltYWdlX2Zyb21fZG1hX2J1ZnMoX19EUklzY3JlZW4gKnNjcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvdXJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmRzLCBpbnQgbnVtX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3RyaWRlcywgaW50ICpvZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBfX0RSSVlVVkNvbG9yU3BhY2UgeXV2X2NvbG9yX3NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBfX0RSSVNhbXBsZVJhbmdlIHNhbXBsZV9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gX19EUklDaHJvbWFTaXRpbmcgaG9yaXpvbnRhbF9zaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIF9fRFJJQ2hyb21hU2l0aW5nIHZlcnRpY2FsX3NpdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpCit7CisgICBfX0RSSWltYWdlICppbWFnZTsKKyAgIHN0cnVjdCBpbnRlbF9pbWFnZV9mb3JtYXQgKmYgPSBpbnRlbF9pbWFnZV9mb3JtYXRfbG9va3VwKGZvdXJjYyk7CisKKyAgIC8qIEZvciBub3cgb25seSBwYWNrZWQgZm9ybWF0cyB0aGF0IGhhdmUgbmF0aXZlIHNhbXBsaW5nIGFyZSBzdXBwb3J0ZWQuICovCisgICBpZiAoIWYgfHwgZi0+bnBsYW5lcyAhPSAxKSB7CisgICAgICAqZXJyb3IgPSBfX0RSSV9JTUFHRV9FUlJPUl9CQURfTUFUQ0g7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaW1hZ2UgPSBpbnRlbF9jcmVhdGVfaW1hZ2VfZnJvbV9mZHMoc2NyZWVuLCB3aWR0aCwgaGVpZ2h0LCBmb3VyY2MsIGZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mZHMsIHN0cmlkZXMsIG9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJQcml2YXRlKTsKKworICAgLyoKKyAgICAqIEludmFsaWQgcGFyYW1ldGVycyBhbmQgYW55IGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIGFyZSBhc3N1bWVkIHRvIGJlCisgICAgKiBjaGVja2VkIGJ5IHRoZSBjYWxsZXIuIFRoZXJlZm9yZSBiZXNpZGVzIHVuc3VwcG9ydGVkIGZvcm1hdHMgb25lIGNhbiBmYWlsCisgICAgKiBvbmx5IGluIGFsbG9jYXRpb24uCisgICAgKi8KKyAgIGlmICghaW1hZ2UpIHsKKyAgICAgICplcnJvciA9IF9fRFJJX0lNQUdFX0VSUk9SX0JBRF9BTExPQzsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpbWFnZS0+ZG1hX2J1Zl9pbXBvcnRlZCA9IHRydWU7CisgICBpbWFnZS0+eXV2X2NvbG9yX3NwYWNlID0geXV2X2NvbG9yX3NwYWNlOworICAgaW1hZ2UtPnNhbXBsZV9yYW5nZSA9IHNhbXBsZV9yYW5nZTsKKyAgIGltYWdlLT5ob3Jpem9udGFsX3NpdGluZyA9IGhvcml6b250YWxfc2l0aW5nOworICAgaW1hZ2UtPnZlcnRpY2FsX3NpdGluZyA9IHZlcnRpY2FsX3NpdGluZzsKKworICAgKmVycm9yID0gX19EUklfSU1BR0VfRVJST1JfU1VDQ0VTUzsKKyAgIHJldHVybiBpbWFnZTsKK30KKworc3RhdGljIF9fRFJJaW1hZ2UgKgoraW50ZWxfZnJvbV9wbGFuYXIoX19EUklpbWFnZSAqcGFyZW50LCBpbnQgcGxhbmUsIHZvaWQgKmxvYWRlclByaXZhdGUpCit7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIG9mZnNldCwgc3RyaWRlLCBkcmlfZm9ybWF0LCBpbmRleDsKKyAgICBzdHJ1Y3QgaW50ZWxfaW1hZ2VfZm9ybWF0ICpmOworICAgIF9fRFJJaW1hZ2UgKmltYWdlOworCisgICAgaWYgKHBhcmVudCA9PSBOVUxMIHx8IHBhcmVudC0+cGxhbmFyX2Zvcm1hdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGYgPSBwYXJlbnQtPnBsYW5hcl9mb3JtYXQ7CisKKyAgICBpZiAocGxhbmUgPj0gZi0+bnBsYW5lcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB3aWR0aCA9IHBhcmVudC0+d2lkdGggPj4gZi0+cGxhbmVzW3BsYW5lXS53aWR0aF9zaGlmdDsKKyAgICBoZWlnaHQgPSBwYXJlbnQtPmhlaWdodCA+PiBmLT5wbGFuZXNbcGxhbmVdLmhlaWdodF9zaGlmdDsKKyAgICBkcmlfZm9ybWF0ID0gZi0+cGxhbmVzW3BsYW5lXS5kcmlfZm9ybWF0OworICAgIGluZGV4ID0gZi0+cGxhbmVzW3BsYW5lXS5idWZmZXJfaW5kZXg7CisgICAgb2Zmc2V0ID0gcGFyZW50LT5vZmZzZXRzW2luZGV4XTsKKyAgICBzdHJpZGUgPSBwYXJlbnQtPnN0cmlkZXNbaW5kZXhdOworCisgICAgaW1hZ2UgPSBpbnRlbF9hbGxvY2F0ZV9pbWFnZShkcmlfZm9ybWF0LCBsb2FkZXJQcml2YXRlKTsKKyAgICBpZiAoaW1hZ2UgPT0gTlVMTCkKKyAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChvZmZzZXQgKyBoZWlnaHQgKiBzdHJpZGUgPiBwYXJlbnQtPmJvLT5zaXplKSB7CisgICAgICAgX21lc2Ffd2FybmluZyhOVUxMLCAiaW50ZWxfY3JlYXRlX3N1Yl9pbWFnZTogc3ViaW1hZ2Ugb3V0IG9mIGJvdW5kcyIpOworICAgICAgIGZyZWUoaW1hZ2UpOworICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGltYWdlLT5ibyA9IHBhcmVudC0+Ym87CisgICAgZHJtX2ludGVsX2JvX3JlZmVyZW5jZShwYXJlbnQtPmJvKTsKKworICAgIGltYWdlLT53aWR0aCA9IHdpZHRoOworICAgIGltYWdlLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgaW1hZ2UtPnBpdGNoID0gc3RyaWRlOworICAgIGltYWdlLT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICBpbnRlbF9pbWFnZV93YXJuX2lmX3VuYWxpZ25lZChpbWFnZSwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBpbWFnZTsKK30KKworc3RhdGljIGNvbnN0IF9fRFJJaW1hZ2VFeHRlbnNpb24gaW50ZWxJbWFnZUV4dGVuc2lvbiA9IHsKKyAgICAuYmFzZSA9IHsgX19EUklfSU1BR0UsIDggfSwKKworICAgIC5jcmVhdGVJbWFnZUZyb21OYW1lICAgICAgICAgICAgICAgID0gaW50ZWxfY3JlYXRlX2ltYWdlX2Zyb21fbmFtZSwKKyAgICAuY3JlYXRlSW1hZ2VGcm9tUmVuZGVyYnVmZmVyICAgICAgICA9IGludGVsX2NyZWF0ZV9pbWFnZV9mcm9tX3JlbmRlcmJ1ZmZlciwKKyAgICAuZGVzdHJveUltYWdlICAgICAgICAgICAgICAgICAgICAgICA9IGludGVsX2Rlc3Ryb3lfaW1hZ2UsCisgICAgLmNyZWF0ZUltYWdlICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnRlbF9jcmVhdGVfaW1hZ2UsCisgICAgLnF1ZXJ5SW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnRlbF9xdWVyeV9pbWFnZSwKKyAgICAuZHVwSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGludGVsX2R1cF9pbWFnZSwKKyAgICAudmFsaWRhdGVVc2FnZSAgICAgICAgICAgICAgICAgICAgICA9IGludGVsX3ZhbGlkYXRlX3VzYWdlLAorICAgIC5jcmVhdGVJbWFnZUZyb21OYW1lcyAgICAgICAgICAgICAgID0gaW50ZWxfY3JlYXRlX2ltYWdlX2Zyb21fbmFtZXMsCisgICAgLmZyb21QbGFuYXIgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnRlbF9mcm9tX3BsYW5hciwKKyAgICAuY3JlYXRlSW1hZ2VGcm9tVGV4dHVyZSAgICAgICAgICAgICA9IGludGVsX2NyZWF0ZV9pbWFnZV9mcm9tX3RleHR1cmUsCisgICAgLmNyZWF0ZUltYWdlRnJvbUZkcyAgICAgICAgICAgICAgICAgPSBpbnRlbF9jcmVhdGVfaW1hZ2VfZnJvbV9mZHMsCisgICAgLmNyZWF0ZUltYWdlRnJvbURtYUJ1ZnMgICAgICAgICAgICAgPSBpbnRlbF9jcmVhdGVfaW1hZ2VfZnJvbV9kbWFfYnVmcworfTsKKworc3RhdGljIGludAorYnJ3X3F1ZXJ5X3JlbmRlcmVyX2ludGVnZXIoX19EUklzY3JlZW4gKnBzcCwgaW50IHBhcmFtLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQoreworICAgY29uc3Qgc3RydWN0IGludGVsX3NjcmVlbiAqY29uc3QgaW50ZWxTY3JlZW4gPQorICAgICAgKHN0cnVjdCBpbnRlbF9zY3JlZW4gKikgcHNwLT5kcml2ZXJQcml2YXRlOworCisgICBzd2l0Y2ggKHBhcmFtKSB7CisgICBjYXNlIF9fRFJJMl9SRU5ERVJFUl9WRU5ET1JfSUQ6CisgICAgICB2YWx1ZVswXSA9IDB4ODA4NjsKKyAgICAgIHJldHVybiAwOworICAgY2FzZSBfX0RSSTJfUkVOREVSRVJfREVWSUNFX0lEOgorICAgICAgdmFsdWVbMF0gPSBpbnRlbFNjcmVlbi0+ZGV2aWNlSUQ7CisgICAgICByZXR1cm4gMDsKKyAgIGNhc2UgX19EUkkyX1JFTkRFUkVSX0FDQ0VMRVJBVEVEOgorICAgICAgdmFsdWVbMF0gPSAxOworICAgICAgcmV0dXJuIDA7CisgICBjYXNlIF9fRFJJMl9SRU5ERVJFUl9WSURFT19NRU1PUlk6IHsKKyAgICAgIC8qIE9uY2UgYSBiYXRjaCB1c2VzIG1vcmUgdGhhbiA3NSUgb2YgdGhlIG1heGltdW0gbWFwcGFibGUgc2l6ZSwgd2UKKyAgICAgICAqIGFzc3VtZSB0aGF0IHRoZXJlJ3Mgc29tZSBmcmFnbWVudGF0aW9uLCBhbmQgd2Ugc3RhcnQgZG9pbmcgZXh0cmEKKyAgICAgICAqIGZsdXNoaW5nLCBldGMuICBUaGF0J3MgdGhlIGJpZyBjbGlmZiBhcHBzIHdpbGwgY2FyZSBhYm91dC4KKyAgICAgICAqLworICAgICAgc2l6ZV90IGFwZXJfc2l6ZTsKKyAgICAgIHNpemVfdCBtYXBwYWJsZV9zaXplOworCisgICAgICBkcm1faW50ZWxfZ2V0X2FwZXJ0dXJlX3NpemVzKHBzcC0+ZmQsICZtYXBwYWJsZV9zaXplLCAmYXBlcl9zaXplKTsKKworICAgICAgY29uc3QgdW5zaWduZWQgZ3B1X21hcHBhYmxlX21lZ2FieXRlcyA9CisgICAgICAgICAoYXBlcl9zaXplIC8gKDEwMjQgKiAxMDI0KSkgKiAzIC8gNDsKKworICAgICAgY29uc3QgbG9uZyBzeXN0ZW1fbWVtb3J5X3BhZ2VzID0gc3lzY29uZihfU0NfUEhZU19QQUdFUyk7CisgICAgICBjb25zdCBsb25nIHN5c3RlbV9wYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpOworCisgICAgICBpZiAoc3lzdGVtX21lbW9yeV9wYWdlcyA8PSAwIHx8IHN5c3RlbV9wYWdlX3NpemUgPD0gMCkKKyAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgY29uc3QgdWludDY0X3Qgc3lzdGVtX21lbW9yeV9ieXRlcyA9ICh1aW50NjRfdCkgc3lzdGVtX21lbW9yeV9wYWdlcworICAgICAgICAgKiAodWludDY0X3QpIHN5c3RlbV9wYWdlX3NpemU7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIHN5c3RlbV9tZW1vcnlfbWVnYWJ5dGVzID0KKyAgICAgICAgICh1bnNpZ25lZCkgKHN5c3RlbV9tZW1vcnlfYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKTsKKworICAgICAgdmFsdWVbMF0gPSBNSU4yKHN5c3RlbV9tZW1vcnlfbWVnYWJ5dGVzLCBncHVfbWFwcGFibGVfbWVnYWJ5dGVzKTsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgY2FzZSBfX0RSSTJfUkVOREVSRVJfVU5JRklFRF9NRU1PUllfQVJDSElURUNUVVJFOgorICAgICAgdmFsdWVbMF0gPSAxOworICAgICAgcmV0dXJuIDA7CisgICBjYXNlIF9fRFJJMl9SRU5ERVJFUl9QUkVGRVJSRURfUFJPRklMRToKKyAgICAgIHZhbHVlWzBdID0gKHBzcC0+bWF4X2dsX2NvcmVfdmVyc2lvbiAhPSAwKQorICAgICAgICAgPyAoMVUgPDwgX19EUklfQVBJX09QRU5HTF9DT1JFKSA6ICgxVSA8PCBfX0RSSV9BUElfT1BFTkdMKTsKKyAgICAgIHJldHVybiAwOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBkcmlRdWVyeVJlbmRlcmVySW50ZWdlckNvbW1vbihwc3AsIHBhcmFtLCB2YWx1ZSk7CisgICB9CisKKyAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludAorYnJ3X3F1ZXJ5X3JlbmRlcmVyX3N0cmluZyhfX0RSSXNjcmVlbiAqcHNwLCBpbnQgcGFyYW0sIGNvbnN0IGNoYXIgKip2YWx1ZSkKK3sKKyAgIGNvbnN0IHN0cnVjdCBpbnRlbF9zY3JlZW4gKmludGVsU2NyZWVuID0KKyAgICAgIChzdHJ1Y3QgaW50ZWxfc2NyZWVuICopIHBzcC0+ZHJpdmVyUHJpdmF0ZTsKKworICAgc3dpdGNoIChwYXJhbSkgeworICAgY2FzZSBfX0RSSTJfUkVOREVSRVJfVkVORE9SX0lEOgorICAgICAgdmFsdWVbMF0gPSBicndfdmVuZG9yX3N0cmluZzsKKyAgICAgIHJldHVybiAwOworICAgY2FzZSBfX0RSSTJfUkVOREVSRVJfREVWSUNFX0lEOgorICAgICAgdmFsdWVbMF0gPSBicndfZ2V0X3JlbmRlcmVyX3N0cmluZyhpbnRlbFNjcmVlbi0+ZGV2aWNlSUQpOworICAgICAgcmV0dXJuIDA7CisgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IF9fRFJJMnJlbmRlcmVyUXVlcnlFeHRlbnNpb24gaW50ZWxSZW5kZXJlclF1ZXJ5RXh0ZW5zaW9uID0geworICAgLmJhc2UgPSB7IF9fRFJJMl9SRU5ERVJFUl9RVUVSWSwgMSB9LAorCisgICAucXVlcnlJbnRlZ2VyID0gYnJ3X3F1ZXJ5X3JlbmRlcmVyX2ludGVnZXIsCisgICAucXVlcnlTdHJpbmcgPSBicndfcXVlcnlfcmVuZGVyZXJfc3RyaW5nCit9OworCitzdGF0aWMgY29uc3QgX19EUklyb2J1c3RuZXNzRXh0ZW5zaW9uIGRyaTJSb2J1c3RuZXNzID0geworICAgLmJhc2UgPSB7IF9fRFJJMl9ST0JVU1RORVNTLCAxIH0KK307CisKK3N0YXRpYyBjb25zdCBfX0RSSWV4dGVuc2lvbiAqaW50ZWxTY3JlZW5FeHRlbnNpb25zW10gPSB7CisgICAgJmludGVsVGV4QnVmZmVyRXh0ZW5zaW9uLmJhc2UsCisgICAgJmludGVsRmx1c2hFeHRlbnNpb24uYmFzZSwKKyAgICAmaW50ZWxJbWFnZUV4dGVuc2lvbi5iYXNlLAorICAgICZpbnRlbFJlbmRlcmVyUXVlcnlFeHRlbnNpb24uYmFzZSwKKyAgICAmZHJpMkNvbmZpZ1F1ZXJ5RXh0ZW5zaW9uLmJhc2UsCisgICAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICppbnRlbFJvYnVzdFNjcmVlbkV4dGVuc2lvbnNbXSA9IHsKKyAgICAmaW50ZWxUZXhCdWZmZXJFeHRlbnNpb24uYmFzZSwKKyAgICAmaW50ZWxGbHVzaEV4dGVuc2lvbi5iYXNlLAorICAgICZpbnRlbEltYWdlRXh0ZW5zaW9uLmJhc2UsCisgICAgJmludGVsUmVuZGVyZXJRdWVyeUV4dGVuc2lvbi5iYXNlLAorICAgICZkcmkyQ29uZmlnUXVlcnlFeHRlbnNpb24uYmFzZSwKKyAgICAmZHJpMlJvYnVzdG5lc3MuYmFzZSwKKyAgICBOVUxMCit9OworCitzdGF0aWMgYm9vbAoraW50ZWxfZ2V0X3BhcmFtKF9fRFJJc2NyZWVuICpwc3AsIGludCBwYXJhbSwgaW50ICp2YWx1ZSkKK3sKKyAgIGludCByZXQ7CisgICBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0gZ3A7CisKKyAgIG1lbXNldCgmZ3AsIDAsIHNpemVvZihncCkpOworICAgZ3AucGFyYW0gPSBwYXJhbTsKKyAgIGdwLnZhbHVlID0gdmFsdWU7CisKKyAgIHJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQocHNwLT5mZCwgRFJNX0k5MTVfR0VUUEFSQU0sICZncCwgc2l6ZW9mKGdwKSk7CisgICBpZiAocmV0KSB7CisgICAgICBpZiAocmV0ICE9IC1FSU5WQUwpCisJIF9tZXNhX3dhcm5pbmcoTlVMTCwgImRybV9pOTE1X2dldHBhcmFtOiAlZCIsIHJldCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW50ZWxfZ2V0X2Jvb2xlYW4oX19EUklzY3JlZW4gKnBzcCwgaW50IHBhcmFtKQoreworICAgaW50IHZhbHVlID0gMDsKKyAgIHJldHVybiBpbnRlbF9nZXRfcGFyYW0ocHNwLCBwYXJhbSwgJnZhbHVlKSAmJiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsRGVzdHJveVNjcmVlbihfX0RSSXNjcmVlbiAqIHNQcml2KQoreworICAgc3RydWN0IGludGVsX3NjcmVlbiAqaW50ZWxTY3JlZW4gPSBzUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKworICAgZHJpX2J1Zm1ncl9kZXN0cm95KGludGVsU2NyZWVuLT5idWZtZ3IpOworICAgZHJpRGVzdHJveU9wdGlvbkluZm8oJmludGVsU2NyZWVuLT5vcHRpb25DYWNoZSk7CisKKyAgIHJhbGxvY19mcmVlKGludGVsU2NyZWVuKTsKKyAgIHNQcml2LT5kcml2ZXJQcml2YXRlID0gTlVMTDsKK30KKworCisvKioKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgbmVlZCB0byBzZXQgdXAgR0wgcmVuZGVyaW5nIHRvIGEgbmV3IFggd2luZG93LgorICovCitzdGF0aWMgR0xib29sZWFuCitpbnRlbENyZWF0ZUJ1ZmZlcihfX0RSSXNjcmVlbiAqIGRyaVNjcm5Qcml2LAorICAgICAgICAgICAgICAgICAgX19EUklkcmF3YWJsZSAqIGRyaURyYXdQcml2LAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsX2NvbmZpZyAqIG1lc2FWaXMsIEdMYm9vbGVhbiBpc1BpeG1hcCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9yZW5kZXJidWZmZXIgKnJiOworICAgc3RydWN0IGludGVsX3NjcmVlbiAqc2NyZWVuID0gKHN0cnVjdCBpbnRlbF9zY3JlZW4qKSBkcmlTY3JuUHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKyAgIG1lc2FfZm9ybWF0IHJnYkZvcm1hdDsKKyAgIHVuc2lnbmVkIG51bV9zYW1wbGVzID0gaW50ZWxfcXVhbnRpemVfbnVtX3NhbXBsZXMoc2NyZWVuLCBtZXNhVmlzLT5zYW1wbGVzKTsKKyAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmI7CisKKyAgIGlmIChpc1BpeG1hcCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgZmIgPSBDQUxMT0NfU1RSVUNUKGdsX2ZyYW1lYnVmZmVyKTsKKyAgIGlmICghZmIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIF9tZXNhX2luaXRpYWxpemVfd2luZG93X2ZyYW1lYnVmZmVyKGZiLCBtZXNhVmlzKTsKKworICAgaWYgKHNjcmVlbi0+d2luc3lzX21zYWFfc2FtcGxlc19vdmVycmlkZSAhPSAtMSkgeworICAgICAgbnVtX3NhbXBsZXMgPSBzY3JlZW4tPndpbnN5c19tc2FhX3NhbXBsZXNfb3ZlcnJpZGU7CisgICAgICBmYi0+VmlzdWFsLnNhbXBsZXMgPSBudW1fc2FtcGxlczsKKyAgIH0KKworICAgaWYgKG1lc2FWaXMtPnJlZEJpdHMgPT0gNSkKKyAgICAgIHJnYkZvcm1hdCA9IE1FU0FfRk9STUFUX0I1RzZSNV9VTk9STTsKKyAgIGVsc2UgaWYgKG1lc2FWaXMtPnNSR0JDYXBhYmxlKQorICAgICAgcmdiRm9ybWF0ID0gTUVTQV9GT1JNQVRfQjhHOFI4QThfU1JHQjsKKyAgIGVsc2UgaWYgKG1lc2FWaXMtPmFscGhhQml0cyA9PSAwKQorICAgICAgcmdiRm9ybWF0ID0gTUVTQV9GT1JNQVRfQjhHOFI4WDhfVU5PUk07CisgICBlbHNlIHsKKyAgICAgIHJnYkZvcm1hdCA9IE1FU0FfRk9STUFUX0I4RzhSOEE4X1NSR0I7CisgICAgICBmYi0+VmlzdWFsLnNSR0JDYXBhYmxlID0gdHJ1ZTsKKyAgIH0KKworICAgLyogc2V0dXAgdGhlIGhhcmR3YXJlLWJhc2VkIHJlbmRlcmJ1ZmZlcnMgKi8KKyAgIHJiID0gaW50ZWxfY3JlYXRlX3JlbmRlcmJ1ZmZlcihyZ2JGb3JtYXQsIG51bV9zYW1wbGVzKTsKKyAgIF9tZXNhX2FkZF9yZW5kZXJidWZmZXIoZmIsIEJVRkZFUl9GUk9OVF9MRUZULCAmcmItPkJhc2UuQmFzZSk7CisKKyAgIGlmIChtZXNhVmlzLT5kb3VibGVCdWZmZXJNb2RlKSB7CisgICAgICByYiA9IGludGVsX2NyZWF0ZV9yZW5kZXJidWZmZXIocmdiRm9ybWF0LCBudW1fc2FtcGxlcyk7CisgICAgICBfbWVzYV9hZGRfcmVuZGVyYnVmZmVyKGZiLCBCVUZGRVJfQkFDS19MRUZULCAmcmItPkJhc2UuQmFzZSk7CisgICB9CisKKyAgIC8qCisgICAgKiBBc3NlcnQgaGVyZSB0aGF0IHRoZSBnbF9jb25maWcgaGFzIGFuIGV4cGVjdGVkIGRlcHRoL3N0ZW5jaWwgYml0CisgICAgKiBjb21iaW5hdGlvbjogb25lIG9mIGQyNC9zOCwgZDE2L3MwLCBkMC9zMC4gKFNlZSBpbnRlbEluaXRTY3JlZW4yKCksCisgICAgKiB3aGljaCBjb25zdHJ1Y3RzIHRoZSBhZHZlcnRpc2VkIGNvbmZpZ3MuKQorICAgICovCisgICBpZiAobWVzYVZpcy0+ZGVwdGhCaXRzID09IDI0KSB7CisgICAgICBhc3NlcnQobWVzYVZpcy0+c3RlbmNpbEJpdHMgPT0gOCk7CisKKyAgICAgIGlmIChzY3JlZW4tPmRldmluZm8tPmhhc19oaXpfYW5kX3NlcGFyYXRlX3N0ZW5jaWwpIHsKKyAgICAgICAgIHJiID0gaW50ZWxfY3JlYXRlX3ByaXZhdGVfcmVuZGVyYnVmZmVyKE1FU0FfRk9STUFUX1oyNF9VTk9STV9YOF9VSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXMpOworICAgICAgICAgX21lc2FfYWRkX3JlbmRlcmJ1ZmZlcihmYiwgQlVGRkVSX0RFUFRILCAmcmItPkJhc2UuQmFzZSk7CisgICAgICAgICByYiA9IGludGVsX2NyZWF0ZV9wcml2YXRlX3JlbmRlcmJ1ZmZlcihNRVNBX0ZPUk1BVF9TX1VJTlQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXMpOworICAgICAgICAgX21lc2FfYWRkX3JlbmRlcmJ1ZmZlcihmYiwgQlVGRkVSX1NURU5DSUwsICZyYi0+QmFzZS5CYXNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAvKgorICAgICAgICAgICogVXNlIGNvbWJpbmVkIGRlcHRoL3N0ZW5jaWwuIE5vdGUgdGhhdCB0aGUgcmVuZGVyYnVmZmVyIGlzCisgICAgICAgICAgKiBhdHRhY2hlZCB0byB0d28gYXR0YWNobWVudCBwb2ludHMuCisgICAgICAgICAgKi8KKyAgICAgICAgIHJiID0gaW50ZWxfY3JlYXRlX3ByaXZhdGVfcmVuZGVyYnVmZmVyKE1FU0FfRk9STUFUX1oyNF9VTk9STV9TOF9VSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXMpOworICAgICAgICAgX21lc2FfYWRkX3JlbmRlcmJ1ZmZlcihmYiwgQlVGRkVSX0RFUFRILCAmcmItPkJhc2UuQmFzZSk7CisgICAgICAgICBfbWVzYV9hZGRfcmVuZGVyYnVmZmVyKGZiLCBCVUZGRVJfU1RFTkNJTCwgJnJiLT5CYXNlLkJhc2UpOworICAgICAgfQorICAgfQorICAgZWxzZSBpZiAobWVzYVZpcy0+ZGVwdGhCaXRzID09IDE2KSB7CisgICAgICBhc3NlcnQobWVzYVZpcy0+c3RlbmNpbEJpdHMgPT0gMCk7CisgICAgICByYiA9IGludGVsX2NyZWF0ZV9wcml2YXRlX3JlbmRlcmJ1ZmZlcihNRVNBX0ZPUk1BVF9aX1VOT1JNMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2FtcGxlcyk7CisgICAgICBfbWVzYV9hZGRfcmVuZGVyYnVmZmVyKGZiLCBCVUZGRVJfREVQVEgsICZyYi0+QmFzZS5CYXNlKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgYXNzZXJ0KG1lc2FWaXMtPmRlcHRoQml0cyA9PSAwKTsKKyAgICAgIGFzc2VydChtZXNhVmlzLT5zdGVuY2lsQml0cyA9PSAwKTsKKyAgIH0KKworICAgLyogbm93IGFkZCBhbnkvYWxsIHNvZnR3YXJlLWJhc2VkIHJlbmRlcmJ1ZmZlcnMgd2UgbWF5IG5lZWQgKi8KKyAgIF9zd3Jhc3RfYWRkX3NvZnRfcmVuZGVyYnVmZmVycyhmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyogbmV2ZXIgc3cgY29sb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyogbmV2ZXIgc3cgZGVwdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLyogbmV2ZXIgc3cgc3RlbmNpbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc2FWaXMtPmFjY3VtUmVkQml0cyA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8qIG5ldmVyIHN3IGFscGhhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgIC8qIG5ldmVyIHN3IGF1eCAqLyApOworICAgZHJpRHJhd1ByaXYtPmRyaXZlclByaXZhdGUgPSBmYjsKKworICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbERlc3Ryb3lCdWZmZXIoX19EUklkcmF3YWJsZSAqIGRyaURyYXdQcml2KQoreworICAgIHN0cnVjdCBnbF9mcmFtZWJ1ZmZlciAqZmIgPSBkcmlEcmF3UHJpdi0+ZHJpdmVyUHJpdmF0ZTsKKworICAgIF9tZXNhX3JlZmVyZW5jZV9mcmFtZWJ1ZmZlcigmZmIsIE5VTEwpOworfQorCitzdGF0aWMgYm9vbAoraW50ZWxfaW5pdF9idWZtZ3Ioc3RydWN0IGludGVsX3NjcmVlbiAqaW50ZWxTY3JlZW4pCit7CisgICBfX0RSSXNjcmVlbiAqc3ByaXYgPSBpbnRlbFNjcmVlbi0+ZHJpU2NyblByaXY7CisKKyAgIGludGVsU2NyZWVuLT5ub19odyA9IGdldGVudigiSU5URUxfTk9fSFciKSAhPSBOVUxMOworCisgICBpbnRlbFNjcmVlbi0+YnVmbWdyID0gaW50ZWxfYnVmbWdyX2dlbV9pbml0KHNwcml2LT5mZCwgQkFUQ0hfU1opOworICAgaWYgKGludGVsU2NyZWVuLT5idWZtZ3IgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJbJXM6JXVdIEVycm9yIGluaXRpYWxpemluZyBidWZmZXIgbWFuYWdlci5cbiIsCisJICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X3ZtYV9jYWNoZV9zaXplKGludGVsU2NyZWVuLT5idWZtZ3IsIDUxMik7CisgICBkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfZmVuY2VkX3JlbG9jcyhpbnRlbFNjcmVlbi0+YnVmbWdyKTsKKworICAgaWYgKCFpbnRlbF9nZXRfYm9vbGVhbihzcHJpdiwgSTkxNV9QQVJBTV9IQVNfUkVMQVhFRF9ERUxUQSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzOiAldV0gS2VybmVsIDIuNi4zOSByZXF1aXJlZC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW50ZWxfZGV0ZWN0X3N3aXp6bGluZyhzdHJ1Y3QgaW50ZWxfc2NyZWVuICpzY3JlZW4pCit7CisgICBkcm1faW50ZWxfYm8gKmJ1ZmZlcjsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworICAgdW5zaWduZWQgbG9uZyBhbGlnbmVkX3BpdGNoOworICAgdWludDMyX3QgdGlsaW5nID0gSTkxNV9USUxJTkdfWDsKKyAgIHVpbnQzMl90IHN3aXp6bGVfbW9kZSA9IDA7CisKKyAgIGJ1ZmZlciA9IGRybV9pbnRlbF9ib19hbGxvY190aWxlZChzY3JlZW4tPmJ1Zm1nciwgInN3aXp6bGUgdGVzdCIsCisJCQkJICAgICA2NCwgNjQsIDQsCisJCQkJICAgICAmdGlsaW5nLCAmYWxpZ25lZF9waXRjaCwgZmxhZ3MpOworICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBkcm1faW50ZWxfYm9fZ2V0X3RpbGluZyhidWZmZXIsICZ0aWxpbmcsICZzd2l6emxlX21vZGUpOworICAgZHJtX2ludGVsX2JvX3VucmVmZXJlbmNlKGJ1ZmZlcik7CisKKyAgIGlmIChzd2l6emxlX21vZGUgPT0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICBlbHNlCisgICAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBSZXR1cm4gYXJyYXkgb2YgTVNBQSBtb2RlcyBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLiBUaGUgYXJyYXkgaXMKKyAqIHplcm8tdGVybWluYXRlZCBhbmQgc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIuCisgKi8KK2NvbnN0IGludCoKK2ludGVsX3N1cHBvcnRlZF9tc2FhX21vZGVzKGNvbnN0IHN0cnVjdCBpbnRlbF9zY3JlZW4gICpzY3JlZW4pCit7CisgICBzdGF0aWMgY29uc3QgaW50IGdlbjhfbW9kZXNbXSA9IHs4LCA0LCAyLCAwLCAtMX07CisgICBzdGF0aWMgY29uc3QgaW50IGdlbjdfbW9kZXNbXSA9IHs4LCA0LCAwLCAtMX07CisgICBzdGF0aWMgY29uc3QgaW50IGdlbjZfbW9kZXNbXSA9IHs0LCAwLCAtMX07CisgICBzdGF0aWMgY29uc3QgaW50IGdlbjRfbW9kZXNbXSA9IHswLCAtMX07CisKKyAgIGlmIChzY3JlZW4tPmRldmluZm8tPmdlbiA+PSA4KSB7CisgICAgICByZXR1cm4gZ2VuOF9tb2RlczsKKyAgIH0gZWxzZSBpZiAoc2NyZWVuLT5kZXZpbmZvLT5nZW4gPj0gNykgeworICAgICAgcmV0dXJuIGdlbjdfbW9kZXM7CisgICB9IGVsc2UgaWYgKHNjcmVlbi0+ZGV2aW5mby0+Z2VuID09IDYpIHsKKyAgICAgIHJldHVybiBnZW42X21vZGVzOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBnZW40X21vZGVzOworICAgfQorfQorCitzdGF0aWMgX19EUkljb25maWcqKgoraW50ZWxfc2NyZWVuX21ha2VfY29uZmlncyhfX0RSSXNjcmVlbiAqZHJpX3NjcmVlbikKK3sKKyAgIHN0YXRpYyBjb25zdCBtZXNhX2Zvcm1hdCBmb3JtYXRzW10gPSB7CisgICAgICBNRVNBX0ZPUk1BVF9CNUc2UjVfVU5PUk0sCisgICAgICBNRVNBX0ZPUk1BVF9COEc4UjhBOF9VTk9STQorICAgfTsKKworICAgLyogR0xYX1NXQVBfQ09QWV9PTUwgaXMgbm90IHN1cHBvcnRlZCBkdWUgdG8gcGFnZSBmbGlwcGluZy4gKi8KKyAgIHN0YXRpYyBjb25zdCBHTGVudW0gYmFja19idWZmZXJfbW9kZXNbXSA9IHsKKyAgICAgICBHTFhfU1dBUF9VTkRFRklORURfT01MLCBHTFhfTk9ORSwKKyAgIH07CisKKyAgIHN0YXRpYyBjb25zdCB1aW50OF90IHNpbmdsZXNhbXBsZV9zYW1wbGVzWzFdID0gezB9OworICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXVsdGlzYW1wbGVfc2FtcGxlc1syXSAgPSB7NCwgOH07CisKKyAgIHN0cnVjdCBpbnRlbF9zY3JlZW4gKnNjcmVlbiA9IGRyaV9zY3JlZW4tPmRyaXZlclByaXZhdGU7CisgICBjb25zdCBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvICpkZXZpbmZvID0gc2NyZWVuLT5kZXZpbmZvOworICAgdWludDhfdCBkZXB0aF9iaXRzWzRdLCBzdGVuY2lsX2JpdHNbNF07CisgICBfX0RSSWNvbmZpZyAqKmNvbmZpZ3MgPSBOVUxMOworCisgICAvKiBHZW5lcmF0ZSBzaW5nbGVzYW1wbGUgY29uZmlncyB3aXRob3V0IGFjY3VtdWxhdGlvbiBidWZmZXIuICovCisgICBmb3IgKGludCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm9ybWF0cyk7IGkrKykgeworICAgICAgX19EUkljb25maWcgKipuZXdfY29uZmlnczsKKyAgICAgIGludCBudW1fZGVwdGhfc3RlbmNpbF9iaXRzID0gMjsKKworICAgICAgLyogU3RhcnRpbmcgd2l0aCBEUkkyIHByb3RvY29sIHZlcnNpb24gMS4xIHdlIGNhbiByZXF1ZXN0IGEgZGVwdGgvc3RlbmNpbAorICAgICAgICogYnVmZmVyIHRoYXQgaGFzIGEgZGlmZmVyZW50IG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCB0aGFuIHRoZSBjb2xvcgorICAgICAgICogYnVmZmVyLCBnZW4gPj0gNiBzdXBwb3J0cyB0aGlzLgorICAgICAgICovCisgICAgICBkZXB0aF9iaXRzWzBdID0gMDsKKyAgICAgIHN0ZW5jaWxfYml0c1swXSA9IDA7CisKKyAgICAgIGlmIChmb3JtYXRzW2ldID09IE1FU0FfRk9STUFUX0I1RzZSNV9VTk9STSkgeworICAgICAgICAgZGVwdGhfYml0c1sxXSA9IDE2OworICAgICAgICAgc3RlbmNpbF9iaXRzWzFdID0gMDsKKyAgICAgICAgIGlmIChkZXZpbmZvLT5nZW4gPj0gNikgeworICAgICAgICAgICAgIGRlcHRoX2JpdHNbMl0gPSAyNDsKKyAgICAgICAgICAgICBzdGVuY2lsX2JpdHNbMl0gPSA4OworICAgICAgICAgICAgIG51bV9kZXB0aF9zdGVuY2lsX2JpdHMgPSAzOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGRlcHRoX2JpdHNbMV0gPSAyNDsKKyAgICAgICAgIHN0ZW5jaWxfYml0c1sxXSA9IDg7CisgICAgICB9CisKKyAgICAgIG5ld19jb25maWdzID0gZHJpQ3JlYXRlQ29uZmlncyhmb3JtYXRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlbmNpbF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXB0aF9zdGVuY2lsX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja19idWZmZXJfbW9kZXMsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlc2FtcGxlX3NhbXBsZXMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgY29uZmlncyA9IGRyaUNvbmNhdENvbmZpZ3MoY29uZmlncywgbmV3X2NvbmZpZ3MpOworICAgfQorCisgICAvKiBHZW5lcmF0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBzZXQgb2YgY29uZmlncyB0aGF0IGluY2x1ZGUgYW4KKyAgICAqIGFjY3VtdWxhdGlvbiBidWZmZXIuCisgICAgKi8KKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXRzKTsgaSsrKSB7CisgICAgICBfX0RSSWNvbmZpZyAqKm5ld19jb25maWdzOworCisgICAgICBpZiAoZm9ybWF0c1tpXSA9PSBNRVNBX0ZPUk1BVF9CNUc2UjVfVU5PUk0pIHsKKyAgICAgICAgIGRlcHRoX2JpdHNbMF0gPSAxNjsKKyAgICAgICAgIHN0ZW5jaWxfYml0c1swXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICAgZGVwdGhfYml0c1swXSA9IDI0OworICAgICAgICAgc3RlbmNpbF9iaXRzWzBdID0gODsKKyAgICAgIH0KKworICAgICAgbmV3X2NvbmZpZ3MgPSBkcmlDcmVhdGVDb25maWdzKGZvcm1hdHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYml0cywgc3RlbmNpbF9iaXRzLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tfYnVmZmVyX21vZGVzLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZXNhbXBsZV9zYW1wbGVzLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgY29uZmlncyA9IGRyaUNvbmNhdENvbmZpZ3MoY29uZmlncywgbmV3X2NvbmZpZ3MpOworICAgfQorCisgICAvKiBHZW5lcmF0ZSBtdWx0aXNhbXBsZSBjb25maWdzLgorICAgICoKKyAgICAqIFRoaXMgbG9vcCBicmVha3MgZWFybHksIGFuZCBoZW5jZSBpcyBhIG5vLW9wLCBvbiBnZW4gPCA2LgorICAgICoKKyAgICAqIE11bHRpc2FtcGxlIGNvbmZpZ3MgbXVzdCBmb2xsb3cgdGhlIHNpbmdsZXNhbXBsZSBjb25maWdzIGluIG9yZGVyIHRvCisgICAgKiB3b3JrIGFyb3VuZCBhbiBYIHNlcnZlciBidWcgcHJlc2VudCBpbiAxLjEyLiBUaGUgWCBzZXJ2ZXIgY2hvb3NlcyB0bworICAgICogYXNzb2NpYXRlIHRoZSBmaXJzdCBsaXN0ZWQgUkdCQTg4OC1aMjRTOCBjb25maWcsIHJlZ2FyZGxlc3Mgb2YgaXRzCisgICAgKiBzYW1wbGUgY291bnQsIHdpdGggdGhlIDMyLWJpdCBkZXB0aCB2aXN1YWwgdXNlZCBmb3IgY29tcG9zaXRpbmcuCisgICAgKgorICAgICogT25seSBkb3VibGVidWZmZXIgY29uZmlncyB3aXRoIEdMWF9TV0FQX1VOREVGSU5FRF9PTUwgYmVoYXZpb3IgYXJlCisgICAgKiBzdXBwb3J0ZWQuICBTaW5nbGVidWZmZXIgY29uZmlncyBhcmUgbm90IHN1cHBvcnRlZCBiZWNhdXNlIG5vIG9uZSB3YW50cworICAgICogdGhlbS4KKyAgICAqLworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyBpKyspIHsKKyAgICAgIGlmIChkZXZpbmZvLT5nZW4gPCA2KQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIF9fRFJJY29uZmlnICoqbmV3X2NvbmZpZ3M7CisgICAgICBjb25zdCBpbnQgbnVtX2RlcHRoX3N0ZW5jaWxfYml0cyA9IDI7CisgICAgICBpbnQgbnVtX21zYWFfbW9kZXMgPSAwOworCisgICAgICBkZXB0aF9iaXRzWzBdID0gMDsKKyAgICAgIHN0ZW5jaWxfYml0c1swXSA9IDA7CisKKyAgICAgIGlmIChmb3JtYXRzW2ldID09IE1FU0FfRk9STUFUX0I1RzZSNV9VTk9STSkgeworICAgICAgICAgZGVwdGhfYml0c1sxXSA9IDE2OworICAgICAgICAgc3RlbmNpbF9iaXRzWzFdID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBkZXB0aF9iaXRzWzFdID0gMjQ7CisgICAgICAgICBzdGVuY2lsX2JpdHNbMV0gPSA4OworICAgICAgfQorCisgICAgICBpZiAoZGV2aW5mby0+Z2VuID49IDcpCisgICAgICAgICBudW1fbXNhYV9tb2RlcyA9IDI7CisgICAgICBlbHNlIGlmIChkZXZpbmZvLT5nZW4gPT0gNikKKyAgICAgICAgIG51bV9tc2FhX21vZGVzID0gMTsKKworICAgICAgbmV3X2NvbmZpZ3MgPSBkcmlDcmVhdGVDb25maWdzKGZvcm1hdHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVuY2lsX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2RlcHRoX3N0ZW5jaWxfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrX2J1ZmZlcl9tb2RlcywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXNhbXBsZV9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9tc2FhX21vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgIGNvbmZpZ3MgPSBkcmlDb25jYXRDb25maWdzKGNvbmZpZ3MsIG5ld19jb25maWdzKTsKKyAgIH0KKworICAgaWYgKGNvbmZpZ3MgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJbJXM6JXVdIEVycm9yIGNyZWF0aW5nIEZCQ29uZmlnIVxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gY29uZmlnczsKK30KKworc3RhdGljIHZvaWQKK3NldF9tYXhfZ2xfdmVyc2lvbnMoc3RydWN0IGludGVsX3NjcmVlbiAqc2NyZWVuKQoreworICAgX19EUklzY3JlZW4gKnBzcCA9IHNjcmVlbi0+ZHJpU2NyblByaXY7CisKKyAgIHN3aXRjaCAoc2NyZWVuLT5kZXZpbmZvLT5nZW4pIHsKKyAgIGNhc2UgODoKKyAgIGNhc2UgNzoKKyAgICAgIHBzcC0+bWF4X2dsX2NvcmVfdmVyc2lvbiA9IDMzOworICAgICAgcHNwLT5tYXhfZ2xfY29tcGF0X3ZlcnNpb24gPSAzMDsKKyAgICAgIHBzcC0+bWF4X2dsX2VzMV92ZXJzaW9uID0gMTE7CisgICAgICBwc3AtPm1heF9nbF9lczJfdmVyc2lvbiA9IDMwOworICAgICAgYnJlYWs7CisgICBjYXNlIDY6CisgICAgICBwc3AtPm1heF9nbF9jb3JlX3ZlcnNpb24gPSAzMTsKKyAgICAgIHBzcC0+bWF4X2dsX2NvbXBhdF92ZXJzaW9uID0gMzA7CisgICAgICBwc3AtPm1heF9nbF9lczFfdmVyc2lvbiA9IDExOworICAgICAgcHNwLT5tYXhfZ2xfZXMyX3ZlcnNpb24gPSAzMDsKKyAgICAgIGJyZWFrOworICAgY2FzZSA1OgorICAgY2FzZSA0OgorICAgICAgcHNwLT5tYXhfZ2xfY29yZV92ZXJzaW9uID0gMDsKKyAgICAgIHBzcC0+bWF4X2dsX2NvbXBhdF92ZXJzaW9uID0gMjE7CisgICAgICBwc3AtPm1heF9nbF9lczFfdmVyc2lvbiA9IDExOworICAgICAgcHNwLT5tYXhfZ2xfZXMyX3ZlcnNpb24gPSAyMDsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVucmVjb2duaXplZCBpbnRlbF9zY3JlZW46OmdlbiIpOworICAgICAgYnJlYWs7CisgICB9Cit9CisKKy8qKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIHNwZWNpZmljIHBhcnQgb2YgdGhlIGNyZWF0ZU5ld1NjcmVlbiBlbnRyeSBwb2ludC4KKyAqIENhbGxlZCB3aGVuIHVzaW5nIERSSTIuCisgKgorICogXHJldHVybiB0aGUgc3RydWN0IGdsX2NvbmZpZyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIKKyAqLworc3RhdGljIGNvbnN0CitfX0RSSWNvbmZpZyAqKmludGVsSW5pdFNjcmVlbjIoX19EUklzY3JlZW4gKnBzcCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9zY3JlZW4gKmludGVsU2NyZWVuOworCisgICBpZiAocHNwLT5pbWFnZS5sb2FkZXIpIHsKKyAgIH0gZWxzZSBpZiAocHNwLT5kcmkyLmxvYWRlci0+YmFzZS52ZXJzaW9uIDw9IDIgfHwKKyAgICAgICBwc3AtPmRyaTIubG9hZGVyLT5nZXRCdWZmZXJzV2l0aEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKwkgICAgICAiXG5FUlJPUiEgIERSSTIgbG9hZGVyIHdpdGggZ2V0QnVmZmVyc1dpdGhGb3JtYXQoKSAiCisJICAgICAgInN1cHBvcnQgcmVxdWlyZWRcbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICAvKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBhcmVhICovCisgICBpbnRlbFNjcmVlbiA9IHJ6YWxsb2MoTlVMTCwgc3RydWN0IGludGVsX3NjcmVlbik7CisgICBpZiAoIWludGVsU2NyZWVuKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRVJST1IhICBBbGxvY2F0aW5nIHByaXZhdGUgYXJlYSBmYWlsZWRcbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorICAgLyogcGFyc2UgaW5mb3JtYXRpb24gaW4gX19kcmlDb25maWdPcHRpb25zICovCisgICBkcmlQYXJzZU9wdGlvbkluZm8oJmludGVsU2NyZWVuLT5vcHRpb25DYWNoZSwgYnJ3X2NvbmZpZ19vcHRpb25zLnhtbCk7CisKKyAgIGludGVsU2NyZWVuLT5kcmlTY3JuUHJpdiA9IHBzcDsKKyAgIHBzcC0+ZHJpdmVyUHJpdmF0ZSA9ICh2b2lkICopIGludGVsU2NyZWVuOworCisgICBpZiAoIWludGVsX2luaXRfYnVmbWdyKGludGVsU2NyZWVuKSkKKyAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGludGVsU2NyZWVuLT5kZXZpY2VJRCA9IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2dldF9kZXZpZChpbnRlbFNjcmVlbi0+YnVmbWdyKTsKKyAgIGludGVsU2NyZWVuLT5kZXZpbmZvID0gYnJ3X2dldF9kZXZpY2VfaW5mbyhpbnRlbFNjcmVlbi0+ZGV2aWNlSUQpOworICAgaWYgKCFpbnRlbFNjcmVlbi0+ZGV2aW5mbykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaW50ZWxTY3JlZW4tPmh3X211c3RfdXNlX3NlcGFyYXRlX3N0ZW5jaWwgPSBpbnRlbFNjcmVlbi0+ZGV2aW5mby0+Z2VuID49IDc7CisKKyAgIGludGVsU2NyZWVuLT5od19oYXNfc3dpenpsaW5nID0gaW50ZWxfZGV0ZWN0X3N3aXp6bGluZyhpbnRlbFNjcmVlbik7CisKKyAgIGNvbnN0IGNoYXIgKmZvcmNlX21zYWEgPSBnZXRlbnYoIklOVEVMX0ZPUkNFX01TQUEiKTsKKyAgIGlmIChmb3JjZV9tc2FhKSB7CisgICAgICBpbnRlbFNjcmVlbi0+d2luc3lzX21zYWFfc2FtcGxlc19vdmVycmlkZSA9CisgICAgICAgICBpbnRlbF9xdWFudGl6ZV9udW1fc2FtcGxlcyhpbnRlbFNjcmVlbiwgYXRvaShmb3JjZV9tc2FhKSk7CisgICAgICBwcmludGYoIkZvcmNpbmcgd2luc3lzIHNhbXBsZSBjb3VudCB0byAlZFxuIiwKKyAgICAgICAgICAgICBpbnRlbFNjcmVlbi0+d2luc3lzX21zYWFfc2FtcGxlc19vdmVycmlkZSk7CisgICB9IGVsc2UgeworICAgICAgaW50ZWxTY3JlZW4tPndpbnN5c19tc2FhX3NhbXBsZXNfb3ZlcnJpZGUgPSAtMTsKKyAgIH0KKworICAgc2V0X21heF9nbF92ZXJzaW9ucyhpbnRlbFNjcmVlbik7CisKKyAgIC8qIE5vdGlmaWNhdGlvbiBvZiBHUFUgcmVzZXRzIHJlcXVpcmVzIGhhcmR3YXJlIGNvbnRleHRzIGFuZCBhIGtlcm5lbCBuZXcKKyAgICAqIGVub3VnaCB0byBzdXBwb3J0IERSTV9JT0NUTF9JOTE1X0dFVF9SRVNFVF9TVEFUUy4gIElmIHRoZSBpb2N0bCBpcworICAgICogc3VwcG9ydGVkLCBjYWxsaW5nIGl0IHdpdGggYSBjb250ZXh0IG9mIDAgd2lsbCBlaXRoZXIgZ2VuZXJhdGUgRVBFUk0gb3IKKyAgICAqIG5vIGVycm9yLiAgSWYgdGhlIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQsIGl0IGFsd2F5cyBnZW5lcmF0ZSBFSU5WQUwuCisgICAgKiBVc2UgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBhZHZlcnRpc2UgdGhlIF9fRFJJMl9ST0JVU1RORVNTCisgICAgKiBleHRlbnNpb24gdG8gdGhlIGxvYWRlci4KKyAgICAqCisgICAgKiBEb24ndCBldmVuIHRyeSBvbiBwcmUtR2VuNiwgc2luY2Ugd2UgZG9uJ3QgYXR0ZW1wdCB0byB1c2UgY29udGV4dHMgdGhlcmUuCisgICAgKi8KKyAgIGlmIChpbnRlbFNjcmVlbi0+ZGV2aW5mby0+Z2VuID49IDYpIHsKKyAgICAgIHN0cnVjdCBkcm1faTkxNV9yZXNldF9zdGF0cyBzdGF0czsKKyAgICAgIG1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOworCisgICAgICBjb25zdCBpbnQgcmV0ID0gZHJtSW9jdGwocHNwLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUX1JFU0VUX1NUQVRTLCAmc3RhdHMpOworCisgICAgICBpbnRlbFNjcmVlbi0+aGFzX2NvbnRleHRfcmVzZXRfbm90aWZpY2F0aW9uID0KKyAgICAgICAgIChyZXQgIT0gLTEgfHwgZXJybm8gIT0gRUlOVkFMKTsKKyAgIH0KKworICAgcHNwLT5leHRlbnNpb25zID0gIWludGVsU2NyZWVuLT5oYXNfY29udGV4dF9yZXNldF9ub3RpZmljYXRpb24KKyAgICAgID8gaW50ZWxTY3JlZW5FeHRlbnNpb25zIDogaW50ZWxSb2J1c3RTY3JlZW5FeHRlbnNpb25zOworCisgICBicndfZnNfYWxsb2NfcmVnX3NldHMoaW50ZWxTY3JlZW4pOworICAgYnJ3X3ZlYzRfYWxsb2NfcmVnX3NldChpbnRlbFNjcmVlbik7CisKKyAgIHJldHVybiAoY29uc3QgX19EUkljb25maWcqKikgaW50ZWxfc2NyZWVuX21ha2VfY29uZmlncyhwc3ApOworfQorCitzdHJ1Y3QgaW50ZWxfYnVmZmVyIHsKKyAgIF9fRFJJYnVmZmVyIGJhc2U7CisgICBkcm1faW50ZWxfYm8gKmJvOworfTsKKworc3RhdGljIF9fRFJJYnVmZmVyICoKK2ludGVsQWxsb2NhdGVCdWZmZXIoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJICAgIHVuc2lnbmVkIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGZvcm1hdCwKKwkJICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXIgKmludGVsQnVmZmVyOworICAgc3RydWN0IGludGVsX3NjcmVlbiAqaW50ZWxTY3JlZW4gPSBzY3JlZW4tPmRyaXZlclByaXZhdGU7CisKKyAgIGFzc2VydChhdHRhY2htZW50ID09IF9fRFJJX0JVRkZFUl9GUk9OVF9MRUZUIHx8CisgICAgICAgICAgYXR0YWNobWVudCA9PSBfX0RSSV9CVUZGRVJfQkFDS19MRUZUKTsKKworICAgaW50ZWxCdWZmZXIgPSBjYWxsb2MoMSwgc2l6ZW9mICppbnRlbEJ1ZmZlcik7CisgICBpZiAoaW50ZWxCdWZmZXIgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBUaGUgZnJvbnQgYW5kIGJhY2sgYnVmZmVycyBhcmUgY29sb3IgYnVmZmVycywgd2hpY2ggYXJlIFggdGlsZWQuICovCisgICB1aW50MzJfdCB0aWxpbmcgPSBJOTE1X1RJTElOR19YOworICAgdW5zaWduZWQgbG9uZyBwaXRjaDsKKyAgIGludCBjcHAgPSBmb3JtYXQgLyA4OworICAgaW50ZWxCdWZmZXItPmJvID0gZHJtX2ludGVsX2JvX2FsbG9jX3RpbGVkKGludGVsU2NyZWVuLT5idWZtZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVsQWxsb2NhdGVCdWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbGluZywgJnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPX0FMTE9DX0ZPUl9SRU5ERVIpOworCisgICBpZiAoaW50ZWxCdWZmZXItPmJvID09IE5VTEwpIHsKKwkgICBmcmVlKGludGVsQnVmZmVyKTsKKwkgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgZHJtX2ludGVsX2JvX2ZsaW5rKGludGVsQnVmZmVyLT5ibywgJmludGVsQnVmZmVyLT5iYXNlLm5hbWUpOworCisgICBpbnRlbEJ1ZmZlci0+YmFzZS5hdHRhY2htZW50ID0gYXR0YWNobWVudDsKKyAgIGludGVsQnVmZmVyLT5iYXNlLmNwcCA9IGNwcDsKKyAgIGludGVsQnVmZmVyLT5iYXNlLnBpdGNoID0gcGl0Y2g7CisKKyAgIHJldHVybiAmaW50ZWxCdWZmZXItPmJhc2U7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbFJlbGVhc2VCdWZmZXIoX19EUklzY3JlZW4gKnNjcmVlbiwgX19EUklidWZmZXIgKmJ1ZmZlcikKK3sKKyAgIHN0cnVjdCBpbnRlbF9idWZmZXIgKmludGVsQnVmZmVyID0gKHN0cnVjdCBpbnRlbF9idWZmZXIgKikgYnVmZmVyOworCisgICBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoaW50ZWxCdWZmZXItPmJvKTsKKyAgIGZyZWUoaW50ZWxCdWZmZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IF9fRHJpdmVyQVBJUmVjIGJyd19kcml2ZXJfYXBpID0geworICAgLkluaXRTY3JlZW4JCSA9IGludGVsSW5pdFNjcmVlbjIsCisgICAuRGVzdHJveVNjcmVlbgkgPSBpbnRlbERlc3Ryb3lTY3JlZW4sCisgICAuQ3JlYXRlQ29udGV4dAkgPSBicndDcmVhdGVDb250ZXh0LAorICAgLkRlc3Ryb3lDb250ZXh0CSA9IGludGVsRGVzdHJveUNvbnRleHQsCisgICAuQ3JlYXRlQnVmZmVyCSA9IGludGVsQ3JlYXRlQnVmZmVyLAorICAgLkRlc3Ryb3lCdWZmZXIJID0gaW50ZWxEZXN0cm95QnVmZmVyLAorICAgLk1ha2VDdXJyZW50CQkgPSBpbnRlbE1ha2VDdXJyZW50LAorICAgLlVuYmluZENvbnRleHQJID0gaW50ZWxVbmJpbmRDb250ZXh0LAorICAgLkFsbG9jYXRlQnVmZmVyICAgICAgID0gaW50ZWxBbGxvY2F0ZUJ1ZmZlciwKKyAgIC5SZWxlYXNlQnVmZmVyICAgICAgICA9IGludGVsUmVsZWFzZUJ1ZmZlcgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBfX0RSSURyaXZlclZ0YWJsZUV4dGVuc2lvblJlYyBicndfdnRhYmxlID0geworICAgLmJhc2UgPSB7IF9fRFJJX0RSSVZFUl9WVEFCTEUsIDEgfSwKKyAgIC52dGFibGUgPSAmYnJ3X2RyaXZlcl9hcGksCit9OworCitzdGF0aWMgY29uc3QgX19EUklleHRlbnNpb24gKmJyd19kcml2ZXJfZXh0ZW5zaW9uc1tdID0geworICAgICZkcmlDb3JlRXh0ZW5zaW9uLmJhc2UsCisgICAgJmRyaUltYWdlRHJpdmVyRXh0ZW5zaW9uLmJhc2UsCisgICAgJmRyaURSSTJFeHRlbnNpb24uYmFzZSwKKyAgICAmYnJ3X3Z0YWJsZS5iYXNlLAorICAgICZicndfY29uZmlnX29wdGlvbnMuYmFzZSwKKyAgICBOVUxMCit9OworCitQVUJMSUMgY29uc3QgX19EUklleHRlbnNpb24gKipfX2RyaURyaXZlckdldEV4dGVuc2lvbnNfaTk2NSh2b2lkKQoreworICAgZ2xvYmFsRHJpdmVyQVBJID0gJmJyd19kcml2ZXJfYXBpOworCisgICByZXR1cm4gYnJ3X2RyaXZlcl9leHRlbnNpb25zOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX3NjcmVlbi5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL2ludGVsX3NjcmVlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzEzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvaW50ZWxfc2NyZWVuLmgKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMDMgVk13YXJlLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFZNV0FSRSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lOVEVMX0lOSVRfSF8KKyNkZWZpbmUgX0lOVEVMX0lOSVRfSF8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKKyNpbmNsdWRlICJicndfZGV2aWNlX2luZm8uaCIKKworc3RydWN0IGludGVsX3NjcmVlbgoreworICAgaW50IGRldmljZUlEOworICAgY29uc3Qgc3RydWN0IGJyd19kZXZpY2VfaW5mbyAqZGV2aW5mbzsKKworICAgLyoqCisgICAgKiBBIHVuaXF1ZSBJRCBmb3Igc2hhZGVyIHByb2dyYW1zLgorICAgICovCisgICB1bnNpZ25lZCBwcm9ncmFtX2lkOworCisgICBzdHJ1Y3QgeworICAgICAgc3RydWN0IHJhX3JlZ3MgKnJlZ3M7CisKKyAgICAgIC8qKgorICAgICAgICogQXJyYXkgb2YgdGhlIHJhIGNsYXNzZXMgZm9yIHRoZSB1bmFsaWduZWQgY29udGlndW91cyByZWdpc3RlcgorICAgICAgICogYmxvY2sgc2l6ZXMgdXNlZC4KKyAgICAgICAqLworICAgICAgaW50ICpjbGFzc2VzOworCisgICAgICAvKioKKyAgICAgICAqIE1hcHBpbmcgZm9yIHJlZ2lzdGVyLWFsbG9jYXRlZCBvYmplY3RzIGluICpyZWdzIHRvIHRoZSBmaXJzdAorICAgICAgICogR1JGIGZvciB0aGF0IG9iamVjdC4KKyAgICAgICAqLworICAgICAgdWludDhfdCAqcmFfcmVnX3RvX2dyZjsKKyAgIH0gdmVjNF9yZWdfc2V0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvcGlwZWxpbmVfY29tcGlsZXJfaW50ZXJmYWNlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9waXBlbGluZV9jb21waWxlcl9pbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjA1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvcGlwZWxpbmVfY29tcGlsZXJfaW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDkzOCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNvZHlAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogR3JlZ0YgPGdyZWdATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNpbnR0eXBlcz4KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiZGVzYy5oIgorI2luY2x1ZGUgImdwdS5oIgorI2luY2x1ZGUgInNoYWRlci5oIgorI2luY2x1ZGUgInBpcGVsaW5lLmgiCit9CisKKyNpbmNsdWRlICJjb21waWxlci9zaGFkZXIvY29tcGlsZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcGlwZWxpbmUvcGlwZWxpbmVfY29tcGlsZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcGlwZWxpbmUvYnJ3X2NvbnRleHQuaCIKKyNpbmNsdWRlICJjb21waWxlci9waXBlbGluZS9icndfc2hhZGVyLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2NvbnRleHQuaCIKKyNpbmNsdWRlICJjb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL3JhbGxvYy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL3BpcGVsaW5lL2Jyd19kZXZpY2VfaW5mby5oIgorI2luY2x1ZGUgImNvbXBpbGVyL3BpcGVsaW5lL2Jyd193bS5oIgorCisjaWZuZGVmIFNUQU5EQUxPTkVfU0hBREVSX0NPTVBJTEVSCisKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzdGFuZGFsb25lQ29tcGlsZXIgPSBmYWxzZTsKKworI2Vsc2UKKworICAgIHN0YXRpYyBjb25zdCBib29sIHN0YW5kYWxvbmVDb21waWxlciA9IHRydWU7CisKKyAgICAvLyByZW1vdmUgdGhpcyB3aGVuIHN0YW5kYWxvbmUgcmVzb3VyY2UgbWFwIGNyZWF0aW9uIGV4aXN0cworICAgIGJvb2wgaW50ZWxfZGVzY19pdGVyX2luaXRfZm9yX2JpbmRpbmcoc3RydWN0IGludGVsX2Rlc2NfaXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZGluZ19pbmRleCwgdWludDMyX3QgYXJyYXlfYmFzZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworI2VuZGlmIC8vU1RBTkRBTE9ORV9TSEFERVJfQ09NUElMRVIKKworc3RydWN0IGJyd19iaW5kaW5nX3RhYmxlIHsKKyAgICB1aW50MzJfdCBjb3VudDsKKworICAgIHVpbnQzMl90IHJ0X3N0YXJ0OworCisgICAgdWludDMyX3QgdGV4dHVyZV9zdGFydDsKKyAgICB1aW50MzJfdCB0ZXh0dXJlX2NvdW50OworCisgICAgdWludDMyX3QgdWJvX3N0YXJ0OworICAgIHVpbnQzMl90IHVib19jb3VudDsKKworICAgIHVpbnQzMl90IHRleHR1cmVfZ2F0aGVyX3N0YXJ0OworICAgIHVpbnQzMl90IHRleHR1cmVfZ2F0aGVyX2NvdW50OworCisgICAgdWludDMyX3QgKnNhbXBsZXJfYmluZGluZzsKKyAgICB1aW50MzJfdCAqc2FtcGxlcl9zZXQ7CisKKyAgICB1aW50MzJfdCAqdW5pZm9ybV9iaW5kaW5nOworICAgIHVpbnQzMl90ICp1bmlmb3JtX3NldDsKKworICAgIHVpbnQzMl90ICp0ZXh0dXJlX2dhdGhlcl9iaW5kaW5nOworICAgIHVpbnQzMl90ICp0ZXh0dXJlX2dhdGhlcl9zZXQ7Cit9OworCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2Jyd19jb250ZXh0KHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpCit7CisKKyAgICAvLyBjcmVhdGUgYSBzdHJpcHBlZCBkb3duIGNvbnRleHQgZm9yIGNvbXBpbGF0aW9uCisgICAgaW5pdGlhbGl6ZV9tZXNhX2NvbnRleHRfdG9fZGVmYXVsdHMoJmJydy0+Y3R4KTsKKworICAgIC8vCisgICAgLy8gaW5pdCB0aGUgdGhpbmdzIHB1bGxlZCBmcm9tIERSSSBpbiBicndDcmVhdGVDb250ZXh0CisgICAgLy8KKyAgICBzdHJ1Y3QgYnJ3X2RldmljZV9pbmZvICpkZXZJbmZvID0gcnphbGxvYyhicncsIHN0cnVjdCBicndfZGV2aWNlX2luZm8pOworICAgIHN3aXRjaCAoaW50ZWxfZ3B1X2dlbihncHUpKSB7CisgICAgY2FzZSBJTlRFTF9HRU4oNy41KToKKyAgICAgICAgZGV2SW5mby0+Z2VuID0gNzsKKyAgICAgICAgZGV2SW5mby0+aXNfaGFzd2VsbCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfR0VOKDcpOgorICAgICAgICBkZXZJbmZvLT5nZW4gPSA3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0dFTig2KToKKyAgICAgICAgZGV2SW5mby0+Z2VuID0gNjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCEidW5zdXBwb3J0ZWQgR0VOIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRldkluZm8tPmd0ID0gZ3B1LT5ndDsKKyAgICBkZXZJbmZvLT5oYXNfbGxjID0gdHJ1ZTsKKyAgICBkZXZJbmZvLT5oYXNfcGxuID0gdHJ1ZTsKKyAgICBkZXZJbmZvLT5oYXNfY29tcHI0ID0gdHJ1ZTsKKyAgICBkZXZJbmZvLT5oYXNfbmVnYXRpdmVfcmh3X2J1ZyA9IGZhbHNlOworICAgIGRldkluZm8tPm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPSB0cnVlOworCisgICAgLy8gaGFuZCBjb2RlIHZhbHVlcyB1bnRpbCB3ZSBoYXZlIHNvbWV0aGluZyB0byBwdWxsIGZyb20KKyAgICAvLyB1c2UgYnJ3X2RldmljZV9pbmZvX2hzd19ndDMKKyAgICBicnctPmludGVsU2NyZWVuID0gcnphbGxvYyhicncsIHN0cnVjdCBpbnRlbF9zY3JlZW4pOworICAgIGJydy0+aW50ZWxTY3JlZW4tPmRldmluZm8gPSBkZXZJbmZvOworCisgICAgYnJ3LT5nZW4gPSBicnctPmludGVsU2NyZWVuLT5kZXZpbmZvLT5nZW47CisgICAgYnJ3LT5ndCA9IGJydy0+aW50ZWxTY3JlZW4tPmRldmluZm8tPmd0OworICAgIGJydy0+aXNfZzR4ID0gYnJ3LT5pbnRlbFNjcmVlbi0+ZGV2aW5mby0+aXNfZzR4OworICAgIGJydy0+aXNfYmF5dHJhaWwgPSBicnctPmludGVsU2NyZWVuLT5kZXZpbmZvLT5pc19iYXl0cmFpbDsKKyAgICBicnctPmlzX2hhc3dlbGwgPSBicnctPmludGVsU2NyZWVuLT5kZXZpbmZvLT5pc19oYXN3ZWxsOworICAgIGJydy0+aGFzX2xsYyA9IGJydy0+aW50ZWxTY3JlZW4tPmRldmluZm8tPmhhc19sbGM7CisgICAgYnJ3LT5oYXNfcGxuID0gYnJ3LT5pbnRlbFNjcmVlbi0+ZGV2aW5mby0+aGFzX3BsbjsKKyAgICBicnctPmhhc19jb21wcjQgPSBicnctPmludGVsU2NyZWVuLT5kZXZpbmZvLT5oYXNfY29tcHI0OworICAgIGJydy0+aGFzX25lZ2F0aXZlX3Jod19idWcgPSBicnctPmludGVsU2NyZWVuLT5kZXZpbmZvLT5oYXNfbmVnYXRpdmVfcmh3X2J1ZzsKKyAgICBicnctPm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQgPQorICAgICAgIGJydy0+aW50ZWxTY3JlZW4tPmRldmluZm8tPm5lZWRzX3VubGl0X2NlbnRyb2lkX3dvcmthcm91bmQ7CisKKyAgICBicnctPnZzLmJhc2Uuc3RhZ2UgPSBNRVNBX1NIQURFUl9WRVJURVg7CisgICAgYnJ3LT5ncy5iYXNlLnN0YWdlID0gTUVTQV9TSEFERVJfR0VPTUVUUlk7CisgICAgYnJ3LT53bS5iYXNlLnN0YWdlID0gTUVTQV9TSEFERVJfRlJBR01FTlQ7CisKKyAgICAvLworICAgIC8vIGluaXQgd2hhdCByZW1haW5zIG9mIGludGVsX3NjcmVlbgorICAgIC8vCisgICAgYnJ3LT5pbnRlbFNjcmVlbi0+ZGV2aWNlSUQgPSAwOworICAgIGJydy0+aW50ZWxTY3JlZW4tPnByb2dyYW1faWQgPSAwOworCisgICAgYnJ3X3ZlYzRfYWxsb2NfcmVnX3NldChicnctPmludGVsU2NyZWVuKTsKKworICAgIGJydy0+c2hhZGVyX3Byb2cgPSBicndfbmV3X3NoYWRlcl9wcm9ncmFtKCZicnctPmN0eCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhleGR1bXAoRklMRSAqZnAsIHZvaWQgKnB0ciwgaW50IGJ1ZmxlbikgeworICB1bnNpZ25lZCBpbnQgKmJ1ZiA9ICh1bnNpZ25lZCBpbnQqKXB0cjsKKyAgaW50IGksIGo7CisgIGZvciAoaT0wOyBpPChidWZsZW4vNCk7IGkrPTQpIHsKKyAgICBmcHJpbnRmKGZwLCIlMDZ4OiAiLCBpKTsKKyAgICBmb3IgKGo9MDsgajw0OyBqKyspCisgICAgICBpZiAoaStqIDwgKGJ1Zmxlbi80KSkKKyAgICAgICAgZnByaW50ZihmcCwiJTA4eCAiLCBidWZbaStqXSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoZnAsIiAgICIpOworICAgIGZwcmludGYoZnAsIlxuIik7CisgIH0KKworICBmZmx1c2goZnApOworfQorCitzdGF0aWMgdm9pZCBiYXNlX3Byb2dfZHVtcChGSUxFICpmcCwgc3RydWN0IGJyd19zdGFnZV9wcm9nX2RhdGEqIHN0YWdlX3Byb2dfZGF0YSkKK3sKKyAgICBmcHJpbnRmKGZwLCAic3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnNpemVfYnl0ZXMgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnNpemVfYnl0ZXMpOworICAgIGZwcmludGYoZnAsICJzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUucHVsbF9jb25zdGFudHNfc3RhcnQgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnB1bGxfY29uc3RhbnRzX3N0YXJ0KTsKKyAgICBmcHJpbnRmKGZwLCAic3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnRleHR1cmVfc3RhcnQgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnRleHR1cmVfc3RhcnQpOworICAgIGZwcmludGYoZnAsICJzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUuZ2F0aGVyX3RleHR1cmVfc3RhcnQgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLmdhdGhlcl90ZXh0dXJlX3N0YXJ0KTsKKyAgICBmcHJpbnRmKGZwLCAic3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnVib19zdGFydCA9ICV1XG4iLAorICAgICAgICAgICAgICAgICBzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUudWJvX3N0YXJ0KTsKKyAgICBmcHJpbnRmKGZwLCAic3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLmFib19zdGFydCA9ICV1XG4iLAorICAgICAgICAgICAgICAgICBzdGFnZV9wcm9nX2RhdGEtPmJpbmRpbmdfdGFibGUuYWJvX3N0YXJ0KTsKKyAgICBmcHJpbnRmKGZwLCAic3RhZ2VfcHJvZ19kYXRhLT5iaW5kaW5nX3RhYmxlLnNoYWRlcl90aW1lX3N0YXJ0ID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS5zaGFkZXJfdGltZV9zdGFydCk7CisKKyAgICBmcHJpbnRmKGZwLCAic3RhZ2VfcHJvZ19kYXRhLT5ucl9wYXJhbXMgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5ucl9wYXJhbXMpOworICAgIGZwcmludGYoZnAsICJzdGFnZV9wcm9nX2RhdGEtPm5yX3B1bGxfcGFyYW1zID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+bnJfcHVsbF9wYXJhbXMpOworCisgICAgZnByaW50ZihmcCwgIj09IHB1c2ggY29uc3RhbnRzOiA9PVxuIik7CisgICAgZnByaW50ZihmcCwgInN0YWdlX3Byb2dfZGF0YS0+bnJfcGFyYW1zID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+bnJfcGFyYW1zKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhZ2VfcHJvZ19kYXRhLT5ucl9wYXJhbXM7ICsraSkgeworICAgICAgICBmcHJpbnRmKGZwLCAic3RhZ2VfcHJvZ19kYXRhLT5wYXJhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5wYXJhbSk7CisgICAgICAgIGZwcmludGYoZnAsICIqc3RhZ2VfcHJvZ19kYXRhLT5wYXJhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgKnN0YWdlX3Byb2dfZGF0YS0+cGFyYW0pOworICAgICAgICBmcHJpbnRmKGZwLCAiKipzdGFnZV9wcm9nX2RhdGEtPnBhcmFtID0gJWZcbiIsCisgICAgICAgICAgICAgICAgICAgICAqKnN0YWdlX3Byb2dfZGF0YS0+cGFyYW0pOworICAgIH0KKworICAgIGZwcmludGYoZnAsICI9PSBwdWxsIGNvbnN0YW50czogPT1cbiIpOworICAgIGZwcmludGYoZnAsICJzdGFnZV9wcm9nX2RhdGEtPm5yX3B1bGxfcGFyYW1zID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHN0YWdlX3Byb2dfZGF0YS0+bnJfcHVsbF9wYXJhbXMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFnZV9wcm9nX2RhdGEtPm5yX3B1bGxfcGFyYW1zOyArK2kpIHsKKyAgICAgICAgZnByaW50ZihmcCwgInN0YWdlX3Byb2dfZGF0YS0+cHVsbF9wYXJhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RhZ2VfcHJvZ19kYXRhLT5wdWxsX3BhcmFtKTsKKyAgICAgICAgZnByaW50ZihmcCwgIipzdGFnZV9wcm9nX2RhdGEtPnB1bGxfcGFyYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICpzdGFnZV9wcm9nX2RhdGEtPnB1bGxfcGFyYW0pOworICAgICAgICBmcHJpbnRmKGZwLCAiKipzdGFnZV9wcm9nX2RhdGEtPnB1bGxfcGFyYW0gPSAlZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICoqc3RhZ2VfcHJvZ19kYXRhLT5wdWxsX3BhcmFtKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgYmFzZV92ZWM0X3Byb2dfZHVtcChGSUxFICpmcCwgc3RydWN0IGJyd192ZWM0X3Byb2dfZGF0YSogdmVjNF9wcm9nX2RhdGEpCit7CisgICAgZnByaW50ZihmcCwgInZlYzRfcHJvZ19kYXRhLT52dWVfbWFwLnNsb3RzX3ZhbGlkID0gMHglIiBQUklYNjQgIlxuIiwKKyAgICAgICAgICAgICAgICAgdmVjNF9wcm9nX2RhdGEtPnZ1ZV9tYXAuc2xvdHNfdmFsaWQpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCUldfVkFSWUlOR19TTE9UX0NPVU5UOyArK2kpCisgICAgICAgIGZwcmludGYoZnAsICJ2ZWM0X3Byb2dfZGF0YS0+dnVlX21hcC52YXJ5aW5nX3RvX3Nsb3RbJWldID0gJWlcbiIsIGksCisgICAgICAgICAgICAgICAoaW50KSB2ZWM0X3Byb2dfZGF0YS0+dnVlX21hcC52YXJ5aW5nX3RvX3Nsb3RbaV0pOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCUldfVkFSWUlOR19TTE9UX0NPVU5UOyArK2kpCisgICAgICAgIGZwcmludGYoZnAsICJ2ZWM0X3Byb2dfZGF0YS0+dnVlX21hcC5zbG90X3RvX3ZhcnlpbmdbJWldID0gJWlcbiIsIGksCisgICAgICAgICAgICAgICAoaW50KSB2ZWM0X3Byb2dfZGF0YS0+dnVlX21hcC5zbG90X3RvX3ZhcnlpbmdbaV0pOworCisgICAgZnByaW50ZihmcCwgInZlYzRfcHJvZ19kYXRhLT52dWVfbWFwLm51bV9zbG90cyA9ICVpXG4iLAorICAgICAgICAgICAgICAgICB2ZWM0X3Byb2dfZGF0YS0+dnVlX21hcC5udW1fc2xvdHMpOworICAgIGZwcmludGYoZnAsICJ2ZWM0X3Byb2dfZGF0YS0+ZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyA9ICV1XG4iLAorICAgICAgICAgICAgICAgICB2ZWM0X3Byb2dfZGF0YS0+ZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyk7CisgICAgZnByaW50ZihmcCwgInZlYzRfcHJvZ19kYXRhLT5jdXJiX3JlYWRfbGVuZ3RoID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHZlYzRfcHJvZ19kYXRhLT5jdXJiX3JlYWRfbGVuZ3RoKTsKKyAgICBmcHJpbnRmKGZwLCAidmVjNF9wcm9nX2RhdGEtPnVyYl9yZWFkX2xlbmd0aCA9ICV1XG4iLAorICAgICAgICAgICAgICAgICB2ZWM0X3Byb2dfZGF0YS0+dXJiX3JlYWRfbGVuZ3RoKTsKKyAgICBmcHJpbnRmKGZwLCAidmVjNF9wcm9nX2RhdGEtPnRvdGFsX2dyZiA9ICV1XG4iLAorICAgICAgICAgICAgICAgICB2ZWM0X3Byb2dfZGF0YS0+dG90YWxfZ3JmKTsKKyAgICBmcHJpbnRmKGZwLCAidmVjNF9wcm9nX2RhdGEtPnRvdGFsX3NjcmF0Y2ggPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgdmVjNF9wcm9nX2RhdGEtPnRvdGFsX3NjcmF0Y2gpOworICAgIGZwcmludGYoZnAsICJ2ZWM0X3Byb2dfZGF0YS0+dXJiX2VudHJ5X3NpemUgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgdmVjNF9wcm9nX2RhdGEtPnVyYl9lbnRyeV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgdnNfZGF0YV9kdW1wKEZJTEUgKmZwLCBzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSAqdnNfcHJvZ19kYXRhKQoreworICAgIGZwcmludGYoZnAsICJcbj09PSBiZWdpbiBicndfdnNfcHJvZ19kYXRhID09PVxuIik7CisKKyAgICBiYXNlX3Byb2dfZHVtcChmcCwgJnZzX3Byb2dfZGF0YS0+YmFzZS5iYXNlKTsKKworICAgIGJhc2VfdmVjNF9wcm9nX2R1bXAoZnAsICZ2c19wcm9nX2RhdGEtPmJhc2UpOworCisgICAgZnByaW50ZihmcCwgInZzX3Byb2dfZGF0YS0+aW5wdXRzX3JlYWQgPSAweCUiIFBSSVg2NCAiXG4iLAorICAgICAgICAgICAgICAgICB2c19wcm9nX2RhdGEtPmlucHV0c19yZWFkKTsKKyAgICBmcHJpbnRmKGZwLCAidnNfcHJvZ19kYXRhLT51c2VzX3ZlcnRleGlkID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHZzX3Byb2dfZGF0YS0+dXNlc192ZXJ0ZXhpZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIGZwcmludGYoZnAsICJ2c19wcm9nX2RhdGEtPnVzZXNfaW5zdGFuY2VpZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICB2c19wcm9nX2RhdGEtPnVzZXNfaW5zdGFuY2VpZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgZnByaW50ZihmcCwgIj09PSBlbmQgYnJ3X3ZzX3Byb2dfZGF0YSA9PT1cbiIpOworCisgICAgZmZsdXNoKGZwKTsKK30KKworc3RhdGljIHZvaWQgZ3NfZGF0YV9kdW1wKEZJTEUgKmZwLCBzdHJ1Y3QgYnJ3X2dzX3Byb2dfZGF0YSAqZ3NfcHJvZ19kYXRhKQoreworICAgIGZwcmludGYoZnAsICJcbj09PSBiZWdpbiBicndfZ3NfcHJvZ19kYXRhID09PVxuIik7CisKKyAgICBiYXNlX3Byb2dfZHVtcChmcCwgJmdzX3Byb2dfZGF0YS0+YmFzZS5iYXNlKTsKKworICAgIGJhc2VfdmVjNF9wcm9nX2R1bXAoZnAsICZnc19wcm9nX2RhdGEtPmJhc2UpOworCisgICAgZnByaW50ZihmcCwgImdzX3Byb2dfZGF0YS0+b3V0cHV0X3ZlcnRleF9zaXplX2h3b3JkcyA9ICV1XG4iLAorICAgICAgICAgICAgICAgICBnc19wcm9nX2RhdGEtPm91dHB1dF92ZXJ0ZXhfc2l6ZV9od29yZHMpOworICAgIGZwcmludGYoZnAsICJnc19wcm9nX2RhdGEtPm91dHB1dF90b3BvbG9neSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICBnc19wcm9nX2RhdGEtPm91dHB1dF90b3BvbG9neSk7CisgICAgZnByaW50ZihmcCwgImdzX3Byb2dfZGF0YS0+Y29udHJvbF9kYXRhX2hlYWRlcl9zaXplX2h3b3JkcyA9ICV1XG4iLAorICAgICAgICAgICAgICAgICBnc19wcm9nX2RhdGEtPmNvbnRyb2xfZGF0YV9oZWFkZXJfc2l6ZV9od29yZHMpOworICAgIGZwcmludGYoZnAsICJnc19wcm9nX2RhdGEtPmNvbnRyb2xfZGF0YV9mb3JtYXQgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgZ3NfcHJvZ19kYXRhLT5jb250cm9sX2RhdGFfZm9ybWF0KTsKKyAgICBmcHJpbnRmKGZwLCAiZ3NfcHJvZ19kYXRhLT5pbmNsdWRlX3ByaW1pdGl2ZV9pZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICBnc19wcm9nX2RhdGEtPmluY2x1ZGVfcHJpbWl0aXZlX2lkID8gInRydWUiIDogImZhbHNlIik7CisgICAgZnByaW50ZihmcCwgImdzX3Byb2dfZGF0YS0+aW52b2NhdGlvbnMgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgZ3NfcHJvZ19kYXRhLT5pbnZvY2F0aW9ucyk7CisgICAgZnByaW50ZihmcCwgImdzX3Byb2dfZGF0YS0+ZHVhbF9pbnN0YW5jZWRfZGlzcGF0Y2ggPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgZ3NfcHJvZ19kYXRhLT5kdWFsX2luc3RhbmNlZF9kaXNwYXRjaCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgZnByaW50ZihmcCwgIj09PSBlbmQgYnJ3X2dzX3Byb2dfZGF0YSA9PT1cbiIpOworCisgICAgZmZsdXNoKGZwKTsKK30KKworc3RhdGljIHZvaWQgZnNfZGF0YV9kdW1wKEZJTEUgKmZwLCBzdHJ1Y3QgYnJ3X3dtX3Byb2dfZGF0YSogd21fcHJvZ19kYXRhKQoreworICAgIGZwcmludGYoZnAsICJcbj09PSBiZWdpbiBicndfd21fcHJvZ19kYXRhID09PVxuIik7CisKKyAgICBiYXNlX3Byb2dfZHVtcChmcCwgJndtX3Byb2dfZGF0YS0+YmFzZSk7CisKKyAgICBmcHJpbnRmKGZwLCAid21fcHJvZ19kYXRhLT5jdXJiX3JlYWRfbGVuZ3RoID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHdtX3Byb2dfZGF0YS0+Y3VyYl9yZWFkX2xlbmd0aCk7CisgICAgZnByaW50ZihmcCwgIndtX3Byb2dfZGF0YS0+bnVtX3ZhcnlpbmdfaW5wdXRzID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHdtX3Byb2dfZGF0YS0+bnVtX3ZhcnlpbmdfaW5wdXRzKTsKKyAgICBmcHJpbnRmKGZwLCAid21fcHJvZ19kYXRhLT5maXJzdF9jdXJiZV9ncmYgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgd21fcHJvZ19kYXRhLT5maXJzdF9jdXJiZV9ncmYpOworICAgIGZwcmludGYoZnAsICJ3bV9wcm9nX2RhdGEtPmZpcnN0X2N1cmJlX2dyZl8xNiA9ICV1XG4iLAorICAgICAgICAgICAgICAgICB3bV9wcm9nX2RhdGEtPmZpcnN0X2N1cmJlX2dyZl8xNik7CisgICAgZnByaW50ZihmcCwgIndtX3Byb2dfZGF0YS0+cmVnX2Jsb2NrcyA9ICV1XG4iLAorICAgICAgICAgICAgICAgICB3bV9wcm9nX2RhdGEtPnJlZ19ibG9ja3MpOworICAgIGZwcmludGYoZnAsICJ3bV9wcm9nX2RhdGEtPnJlZ19ibG9ja3NfMTYgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgd21fcHJvZ19kYXRhLT5yZWdfYmxvY2tzXzE2KTsKKyAgICBmcHJpbnRmKGZwLCAid21fcHJvZ19kYXRhLT50b3RhbF9zY3JhdGNoID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHdtX3Byb2dfZGF0YS0+dG90YWxfc2NyYXRjaCk7CisgICAgZnByaW50ZihmcCwgIndtX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS5yZW5kZXJfdGFyZ2V0X3N0YXJ0ID0gJXVcbiIsCisgICAgICAgICAgICAgICAgIHdtX3Byb2dfZGF0YS0+YmluZGluZ190YWJsZS5yZW5kZXJfdGFyZ2V0X3N0YXJ0KTsKKyAgICBmcHJpbnRmKGZwLCAid21fcHJvZ19kYXRhLT5kdWFsX3NyY19ibGVuZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICB3bV9wcm9nX2RhdGEtPmR1YWxfc3JjX2JsZW5kID8gInRydWUiIDogImZhbHNlIik7CisgICAgZnByaW50ZihmcCwgIndtX3Byb2dfZGF0YS0+dXNlc19wb3Nfb2Zmc2V0ID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHdtX3Byb2dfZGF0YS0+dXNlc19wb3Nfb2Zmc2V0ID8gInRydWUiIDogImZhbHNlIik7CisgICAgZnByaW50ZihmcCwgIndtX3Byb2dfZGF0YS0+dXNlc19vbWFzayA9ICVzXG4iLAorICAgICAgICAgICAgICAgICB3bV9wcm9nX2RhdGEtPnVzZXNfb21hc2sgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBmcHJpbnRmKGZwLCAid21fcHJvZ19kYXRhLT5wcm9nX29mZnNldF8xNiA9ICV1XG4iLAorICAgICAgICAgICAgICAgICB3bV9wcm9nX2RhdGEtPnByb2dfb2Zmc2V0XzE2KTsKKyAgICBmcHJpbnRmKGZwLCAid21fcHJvZ19kYXRhLT5iYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgd21fcHJvZ19kYXRhLT5iYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQVJZSU5HX1NMT1RfTUFYOyArK2kpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIndtX3Byb2dfZGF0YS0+dXJiX3NldHVwWyVpXSA9ICVpXG4iLAorICAgICAgICAgICAgICAgICAgaSwgd21fcHJvZ19kYXRhLT51cmJfc2V0dXBbaV0pOworICAgIH0KKworICAgIGZwcmludGYoZnAsICI9PT0gZW5kIGJyd193bV9wcm9nX2RhdGEgPT09XG4iKTsKKworICAgIGZmbHVzaChmcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaXBlX2ludGVyZmFjZV9mcmVlKGNvbnN0IHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyKQoreworICAgIGlmIChzdGFuZGFsb25lQ29tcGlsZXIpCisgICAgICAgIGZyZWUocHRyKTsKKyAgICBlbHNlCisgICAgICAgIGludGVsX2ZyZWUoaGFuZGxlLCBwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnBpcGVfaW50ZXJmYWNlX2FsbG9jKGNvbnN0IHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBzY29wZSkKK3sKKyAgICBpZiAoc3RhbmRhbG9uZUNvbXBpbGVyKQorICAgICAgICByZXR1cm4gY2FsbG9jKHNpemUsIHNpemVvZihjaGFyKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaW50ZWxfYWxsb2MoaGFuZGxlLCBzaXplLCBhbGlnbm1lbnQsIHNjb3BlKTsKK30KKworc3RhdGljIHZvaWQgcm1hcF9kZXN0cm95KGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcCAqcm1hcCkKK3sKKyAgICBwaXBlX2ludGVyZmFjZV9mcmVlKGdwdSwgcm1hcC0+c2xvdHMpOworICAgIHBpcGVfaW50ZXJmYWNlX2ZyZWUoZ3B1LCBybWFwKTsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF9waXBlbGluZV9ybWFwICpybWFwX2NyZWF0ZShjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKnBpcGVsaW5lX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJyd19iaW5kaW5nX3RhYmxlICpidCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcCAqcm1hcDsKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19pdGVyIGl0ZXI7CisgICAgdWludDMyX3Qgc3VyZmFjZV9jb3VudCwgaTsKKworICAgIHJtYXAgPSAoc3RydWN0IGludGVsX3BpcGVsaW5lX3JtYXAgKikKKyAgICAgICAgcGlwZV9pbnRlcmZhY2VfYWxsb2MoZ3B1LCBzaXplb2YoKnJtYXApLCBzaXplb2YoaW50KSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICBpZiAoIXJtYXApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gcmVtb3ZlIHRoaXMgd2hlbiBzdGFuZGFsb25lIHJlc291cmNlIG1hcCBjcmVhdGlvbiBleGlzdHMKKyAgICBpZiAoc3RhbmRhbG9uZUNvbXBpbGVyKQorICAgICAgICByZXR1cm4gcm1hcDsKKworICAgIG1lbXNldChybWFwLCAwLCBzaXplb2YoKnJtYXApKTsKKworICAgIC8qIEZpeCB0aGUgY29tcGlsZXIgYW5kIGZpeCB0aGVzZSEgIE5vIHBvaW50IGluIHVuZGVyc3RhbmRpbmcgdGhlbS4gKi8KKyAgICBybWFwLT5ydF9jb3VudCA9IGJ0LT50ZXh0dXJlX3N0YXJ0OworICAgIHJtYXAtPnRleHR1cmVfcmVzb3VyY2VfY291bnQgPSBidC0+dWJvX3N0YXJ0IC0gYnQtPnRleHR1cmVfc3RhcnQ7CisgICAgcm1hcC0+dWF2X2NvdW50ID0gYnQtPnVib19jb3VudDsKKyAgICBybWFwLT5zYW1wbGVyX2NvdW50ID0gcm1hcC0+dGV4dHVyZV9yZXNvdXJjZV9jb3VudDsKKyAgICBzdXJmYWNlX2NvdW50ID0gcm1hcC0+cnRfY291bnQgKyBybWFwLT50ZXh0dXJlX3Jlc291cmNlX2NvdW50ICsKKyAgICAgICAgcm1hcC0+dWF2X2NvdW50OworICAgIHJtYXAtPnNsb3RfY291bnQgPSBzdXJmYWNlX2NvdW50ICsgcm1hcC0+c2FtcGxlcl9jb3VudDsKKworICAgIHJtYXAtPnNsb3RzID0gKHN0cnVjdCBpbnRlbF9waXBlbGluZV9ybWFwX3Nsb3QgKikKKyAgICAgICAgcGlwZV9pbnRlcmZhY2VfYWxsb2MoZ3B1LCBzaXplb2Yocm1hcC0+c2xvdHNbMF0pICogcm1hcC0+c2xvdF9jb3VudCwKKyAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghcm1hcC0+c2xvdHMpIHsKKyAgICAgICAgcGlwZV9pbnRlcmZhY2VfZnJlZShncHUsIHJtYXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQocm1hcC0+c2xvdHMsIDAsIHNpemVvZihybWFwLT5zbG90c1swXSkgKiBybWFwLT5zbG90X2NvdW50KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBidC0+cnRfc3RhcnQ7IGkrKykKKyAgICAgICAgcm1hcC0+c2xvdHNbaV0udHlwZSA9IElOVEVMX1BJUEVMSU5FX1JNQVBfVU5VU0VEOworCisgICAgZm9yIChpID0gYnQtPnJ0X3N0YXJ0OyBpIDwgYnQtPnRleHR1cmVfc3RhcnQ7IGkrKykgeworICAgICAgICBybWFwLT5zbG90c1tpXS50eXBlID0gSU5URUxfUElQRUxJTkVfUk1BUF9SVDsKKyAgICAgICAgcm1hcC0+c2xvdHNbaV0uaW5kZXggPSBpIC0gYnQtPnJ0X3N0YXJ0OworICAgIH0KKworICAgIGZvciAoaSA9IGJ0LT50ZXh0dXJlX3N0YXJ0OyBpIDwgYnQtPnVib19zdGFydDsgaSsrKSB7CisgICAgICAgIHJtYXAtPnNsb3RzW2ldLnR5cGUgPSBJTlRFTF9QSVBFTElORV9STUFQX1NVUkZBQ0U7CisgICAgICAgIHJtYXAtPnNsb3RzW2ldLmluZGV4ID0gYnQtPnNhbXBsZXJfc2V0W2kgLSBidC0+dGV4dHVyZV9zdGFydF07CisKKyAgICAgICAgLy8gdXNlIHRoZSBzZXQgYW5kIGJpbmRpbmcgZGF0YSB0byBmaW5kIGNvcnJlY3QgZHNldCBzbG90CisgICAgICAgIC8vIFhYWCB2YWxpZGF0ZSBib3RoIHNldCBhbmQgYmluZGluZworICAgICAgICAvLyBYWFggbm8gYXJyYXkgc3VwcG9ydAorICAgICAgICBpbnRlbF9kZXNjX2l0ZXJfaW5pdF9mb3JfYmluZGluZygmaXRlciwKKyAgICAgICAgICAgICAgICBwaXBlbGluZV9sYXlvdXQtPmxheW91dHNbcm1hcC0+c2xvdHNbaV0uaW5kZXhdLAorICAgICAgICAgICAgICAgIGJ0LT5zYW1wbGVyX2JpbmRpbmdbaSAtIGJ0LT50ZXh0dXJlX3N0YXJ0XSwgMCk7CisKKyAgICAgICAgcm1hcC0+c2xvdHNbaV0udS5zdXJmYWNlLm9mZnNldCA9IGl0ZXIuYmVnaW47CisgICAgICAgIHJtYXAtPnNsb3RzW2ldLnUuc3VyZmFjZS5keW5hbWljX29mZnNldF9pbmRleCA9IC0xOworCisgICAgICAgIHJtYXAtPnNsb3RzW2J0LT5jb3VudCArIGkgLSBidC0+dGV4dHVyZV9zdGFydF0udHlwZSA9CisgICAgICAgICAgICBJTlRFTF9QSVBFTElORV9STUFQX1NBTVBMRVI7CisgICAgICAgIHJtYXAtPnNsb3RzW2J0LT5jb3VudCArIGkgLSBidC0+dGV4dHVyZV9zdGFydF0uaW5kZXggPQorICAgICAgICAgICAgcm1hcC0+c2xvdHNbaV0uaW5kZXg7CisgICAgICAgIHJtYXAtPnNsb3RzW2J0LT5jb3VudCArIGkgLSBidC0+dGV4dHVyZV9zdGFydF0udS5zYW1wbGVyID0KKyAgICAgICAgICAgIGl0ZXIuYmVnaW47CisgICAgfQorCisgICAgZm9yIChpID0gYnQtPnVib19zdGFydDsgaSA8IGJ0LT50ZXh0dXJlX2dhdGhlcl9zdGFydDsgaSsrKSB7CisgICAgICAgIHJtYXAtPnNsb3RzW2ldLnR5cGUgPSBJTlRFTF9QSVBFTElORV9STUFQX1NVUkZBQ0U7CisgICAgICAgIHJtYXAtPnNsb3RzW2ldLmluZGV4ID0gYnQtPnVuaWZvcm1fc2V0W2kgLSBidC0+dWJvX3N0YXJ0XTsKKworICAgICAgICAvLyB1c2UgdGhlIHNldCBhbmQgYmluZGluZyBkYXRhIHRvIGZpbmQgY29ycmVjdCBkc2V0IHNsb3QKKyAgICAgICAgLy8gWFhYIHZhbGlkYXRlIGJvdGggc2V0IGFuZCBiaW5kaW5nCisgICAgICAgIC8vIFhYWCBubyBhcnJheSBzdXBwb3J0CisgICAgICAgIGludGVsX2Rlc2NfaXRlcl9pbml0X2Zvcl9iaW5kaW5nKCZpdGVyLAorICAgICAgICAgICAgICAgIHBpcGVsaW5lX2xheW91dC0+bGF5b3V0c1tybWFwLT5zbG90c1tpXS5pbmRleF0sCisgICAgICAgICAgICAgICAgYnQtPnVuaWZvcm1fYmluZGluZ1tpIC0gYnQtPnVib19zdGFydF0sIDApOworCisgICAgICAgIHJtYXAtPnNsb3RzW2ldLnUuc3VyZmFjZS5vZmZzZXQgPSBpdGVyLmJlZ2luOworICAgICAgICBybWFwLT5zbG90c1tpXS51LnN1cmZhY2UuZHluYW1pY19vZmZzZXRfaW5kZXggPSAtMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBidC0+dGV4dHVyZV9nYXRoZXJfc3RhcnQ7IGkgPCBidC0+Y291bnQ7IGkrKykgeworICAgICAgICBybWFwLT5zbG90c1tpXS50eXBlID0gSU5URUxfUElQRUxJTkVfUk1BUF9TVVJGQUNFOworICAgICAgICBybWFwLT5zbG90c1tpXS5pbmRleCA9IGJ0LT50ZXh0dXJlX2dhdGhlcl9zZXRbaSAtIGJ0LT50ZXh0dXJlX2dhdGhlcl9zdGFydF07CisKKyAgICAgICAgLy8gdXNlIHRoZSBzZXQgYW5kIGJpbmRpbmcgZGF0YSB0byBmaW5kIGNvcnJlY3QgZHNldCBzbG90CisgICAgICAgIC8vIFhYWCB2YWxpZGF0ZSBib3RoIHNldCBhbmQgYmluZGluZworICAgICAgICAvLyBYWFggbm8gYXJyYXkgc3VwcG9ydAorICAgICAgICBpbnRlbF9kZXNjX2l0ZXJfaW5pdF9mb3JfYmluZGluZygmaXRlciwKKyAgICAgICAgICAgICAgICBwaXBlbGluZV9sYXlvdXQtPmxheW91dHNbcm1hcC0+c2xvdHNbaV0uaW5kZXhdLAorICAgICAgICAgICAgICAgIGJ0LT50ZXh0dXJlX2dhdGhlcl9iaW5kaW5nW2kgLSBidC0+dGV4dHVyZV9nYXRoZXJfc3RhcnRdLCAwKTsKKworICAgICAgICBybWFwLT5zbG90c1tpXS51LnN1cmZhY2Uub2Zmc2V0ID0gaXRlci5iZWdpbjsKKyAgICAgICAgcm1hcC0+c2xvdHNbaV0udS5zdXJmYWNlLmR5bmFtaWNfb2Zmc2V0X2luZGV4ID0gLTE7CisKKyAgICAgICAgcm1hcC0+c2xvdHNbYnQtPmNvdW50ICsgaSAtIGJ0LT50ZXh0dXJlX2dhdGhlcl9zdGFydF0udHlwZSA9CisgICAgICAgICAgICBJTlRFTF9QSVBFTElORV9STUFQX1NBTVBMRVI7CisgICAgICAgIHJtYXAtPnNsb3RzW2J0LT5jb3VudCArIGkgLSBidC0+dGV4dHVyZV9nYXRoZXJfc3RhcnRdLmluZGV4ID0KKyAgICAgICAgICAgIHJtYXAtPnNsb3RzW2ldLmluZGV4OworICAgICAgICBybWFwLT5zbG90c1tidC0+Y291bnQgKyBpIC0gYnQtPnRleHR1cmVfZ2F0aGVyX3N0YXJ0XS51LnNhbXBsZXIgPQorICAgICAgICAgICAgaXRlci5iZWdpbjsKKyAgICB9CisKKyAgICByZXR1cm4gcm1hcDsKK30KKworZXh0ZXJuICJDIiB7CisKK3N0cnVjdCBicndfY29udGV4dCAqaW50ZWxfY3JlYXRlX2Jyd19jb250ZXh0KGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSkKK3sKKyAgICAvLyBjcmVhdGUgYSBicndfY29udGV4dAorICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3ID0gcnphbGxvYyhOVUxMLCBzdHJ1Y3QgYnJ3X2NvbnRleHQpOworCisgICAgLy8gYWxsb2NhdGUgc3ViIHN0cnVjdHVyZXMgb24gdGhlIHN0YWNrCisgICAgaW5pdGlhbGl6ZV9icndfY29udGV4dChicncsIGdwdSk7CisKKyAgICByZXR1cm4gYnJ3OworfQorCit2b2lkIGludGVsX2Rlc3Ryb3lfYnJ3X2NvbnRleHQoc3RydWN0IGJyd19jb250ZXh0ICpicncpCit7CisgICAgcmFsbG9jX2ZyZWUoYnJ3LT5zaGFkZXJfcHJvZyk7CisgICAgcmFsbG9jX2ZyZWUoYnJ3KTsKK30KKwordm9pZCB1bnBhY2tfc2V0X2FuZF9iaW5kaW5nKGNvbnN0IGludCBsb2NhdGlvbiwgaW50ICZzZXQsIGludCAmYmluZGluZykKK3sKKyAgICAvLyBMb2dpYyBtaXJyb3JlZCBmcm9tIEx1bmFyR0xBU1MgR0xTTCBiYWNrZW5kCisgICAgc2V0ID0gKHVuc2lnbmVkKSBsb2NhdGlvbiA+PiAxNjsKKyAgICBiaW5kaW5nID0gbG9jYXRpb24gJiAweEZGRkY7CisKKyAgICAvLyBVbmJpYXMgc2V0LCB3aGljaCB3YXMgYmlhc2VkIGJ5IDEgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAic2V0PTAiIGFuZCBub3RoaW5nLgorICAgIGJvb2wgc2V0UHJlc2VudCA9IChzZXQgIT0gMCk7CisgICAgaWYgKHNldFByZXNlbnQpCisgICAgICAgIC0tc2V0OworfQorCitjb25zdCBjaGFyICpzaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSkKK3sKKyAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ6ICAgICAgICAgIHJldHVybiAidmVydGV4IjsKKyAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVDogICAgcmV0dXJuICJ0ZXNzZWxsYXRpb24gZXZhbHVhdGlvbiI7CisgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fRVZBTFVBVElPTl9CSVQ6IHJldHVybiAidGVzc2VsbGF0aW9uIGNvbnRyb2wiOworICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOiAgICAgICAgcmV0dXJuICJnZW9tZXRyeSI7CisgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ6ICAgICAgICByZXR1cm4gImZyYWdtZW50IjsKKyAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOiAgICAgICAgIHJldHVybiAiY29tcHV0ZSI7CisgICBkZWZhdWx0OgorICAgICAgIGFzc2VydCgwICYmICJVbmtub3duIHNoYWRlciBzdGFnZSIpOworICAgICAgIHJldHVybiAidW5rbm93biI7CisgICB9Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBidWlsZF9iaW5kaW5nX3RhYmxlKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19iaW5kaW5nX3RhYmxlICpidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyd19zdGFnZV9wcm9nX2RhdGEgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hfcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSkKK3sKKyAgICBnbF9zaGFkZXIgKnNoID0gMDsKKyAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVDogICBzaCA9IHNoX3Byb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX1ZFUlRFWF07ICAgYnJlYWs7CisgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOiBzaCA9IHNoX3Byb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0dFT01FVFJZXTsgYnJlYWs7CisgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOiBzaCA9IHNoX3Byb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0ZSQUdNRU5UXTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDAgJiYgIlVua25vd24gc2hhZGVyIHN0YWdlIik7CisgICAgfQorCisgICAgYnQtPmNvdW50ID0gZGF0YS5iaW5kaW5nX3RhYmxlLnNpemVfYnl0ZXMgLyA0OworCisgICAgLy8gU2VlIGFzc2lnbl9jb21tb25fYmluZGluZ190YWJsZV9vZmZzZXRzCisgICAgLy8gSWYgZ2F0aGVyIGlzIGluIHVzZSAoYmVmb3JlIGdlbjgpLCBzaGFkZXIgd2lsbCB1c2Ugc2Vjb25kIHNldCBvZiBpbmRpY2VzIGZvciBnYXRoZXJzCisgICAgLy8gb24gaW5zdHJ1Y3Rpb24gYnkgaW5zdHJ1Y3Rpb24gYmFzaXMuICBXZSBtdXN0IGR1cGxpY2F0ZSBvdXIgdGV4dHVyZSBiaW5kaW5nIGVudHJpZXMgdG8KKyAgICAvLyBjb21wZW5zYXRlLCBhbmQgdGhleSBmb2xsb3cgVUJPIGVudHJpZXMuCisgICAgY29uc3QgYm9vbCB1c2VzR2F0aGVyID0gc2gtPlByb2dyYW0tPlVzZXNHYXRoZXIgJiYgKGJydy0+Z2VuIDwgOCk7CisgICAgYnQtPnRleHR1cmVfc3RhcnQgPSBkYXRhLmJpbmRpbmdfdGFibGUudGV4dHVyZV9zdGFydDsKKyAgICBidC0+dGV4dHVyZV9jb3VudCA9IGRhdGEuYmluZGluZ190YWJsZS51Ym9fc3RhcnQgLSBkYXRhLmJpbmRpbmdfdGFibGUudGV4dHVyZV9zdGFydDsKKyAgICBidC0+dWJvX3N0YXJ0ICAgICA9IGRhdGEuYmluZGluZ190YWJsZS51Ym9fc3RhcnQ7CisgICAgaWYgKHVzZXNHYXRoZXIpIHsKKyAgICAgICAgYnQtPnVib19jb3VudCAgICAgICAgICAgID0gZGF0YS5iaW5kaW5nX3RhYmxlLmdhdGhlcl90ZXh0dXJlX3N0YXJ0IC0gZGF0YS5iaW5kaW5nX3RhYmxlLnVib19zdGFydDsKKyAgICAgICAgYnQtPnRleHR1cmVfZ2F0aGVyX3N0YXJ0ID0gZGF0YS5iaW5kaW5nX3RhYmxlLmdhdGhlcl90ZXh0dXJlX3N0YXJ0OworICAgICAgICBidC0+dGV4dHVyZV9nYXRoZXJfY291bnQgPSBkYXRhLmJpbmRpbmdfdGFibGUucHVsbF9jb25zdGFudHNfc3RhcnQgLSBidC0+dGV4dHVyZV9nYXRoZXJfc3RhcnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnQtPnVib19jb3VudCAgICAgICAgICAgID0gZGF0YS5iaW5kaW5nX3RhYmxlLnB1bGxfY29uc3RhbnRzX3N0YXJ0IC0gZGF0YS5iaW5kaW5nX3RhYmxlLnVib19zdGFydDsKKyAgICAgICAgYnQtPnRleHR1cmVfZ2F0aGVyX3N0YXJ0ID0gZGF0YS5iaW5kaW5nX3RhYmxlLnB1bGxfY29uc3RhbnRzX3N0YXJ0OworICAgICAgICBidC0+dGV4dHVyZV9nYXRoZXJfY291bnQgPSAwOworICAgIH0KKworICAgIC8vIFRPRE86IGhhbmRsZSBhdG9taWNzCisgICAgYXNzZXJ0KHNoX3Byb2ctPk51bUF0b21pY0J1ZmZlcnMgPT0gMCk7CisKKyAgICBpZiAoYnQtPnVib19jb3VudCAhPSBzaC0+TnVtVW5pZm9ybUJsb2NrcykgeworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBVQk8gZGF0YSB0byBwdWxsIGZyb20sIHRoZSBzaGFkZXIgaXMgdXNpbmcgYSBkZWZhdWx0IHVuaWZvcm0sIHdoaWNoCisgICAgICAgIC8vIHdpbGwgbm90IHdvcmsgaW4gVksuICBXZSBuZWVkIGEgYmluZGluZyBzbG90IHRvIHB1bGwgZnJvbS4KKyAgICAgICAgaW50ZWxfbG9nKGdwdSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULCByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihncHUpLCAwLCAwLAorICAgICAgICAgICAgICAgICJjb21waWxlIGVycm9yOiBVQk8gbWlzbWF0Y2gsICVzIHNoYWRlciBtYXkgcmVhZCBmcm9tIGdsb2JhbCwgbm9uLWJsb2NrIHVuaWZvcm0iLCBzaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKHN0YWdlKSk7CisKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAvKiBUT0RPOiBNb3ZlIHRoaXMgdGVzdCB0byB2YWxpZGF0aW9uIGxheWVyLCBpcyB0aGlzIGFscmVhZHkgY292ZXJlZCBpbiBzaGFkZXJfY2hlY2tlcj8gKi8KKy8vICAgICAgICByZXR1cm4gVktfRVJST1JfQkFEX1BJUEVMSU5FX0RBVEE7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgLy8gU2FtcGxlciBtYXBwaW5nIGRhdGEKKyAgICBidC0+c2FtcGxlcl9iaW5kaW5nID0gKHVpbnQzMl90KikgcnphbGxvY19zaXplKGJydywgYnQtPnRleHR1cmVfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBidC0+c2FtcGxlcl9zZXQgICAgID0gKHVpbnQzMl90KikgcnphbGxvY19zaXplKGJydywgYnQtPnRleHR1cmVfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ0LT50ZXh0dXJlX2NvdW50OyArK2kpIHsKKyAgICAgICAgaW50IGxvY2F0aW9uID0gc2gtPlNhbXBsZXJVbml0c1tpXTsKKyAgICAgICAgaW50IHNldCA9IDA7CisgICAgICAgIGludCBiaW5kaW5nID0gMDsKKworICAgICAgICB1bnBhY2tfc2V0X2FuZF9iaW5kaW5nKGxvY2F0aW9uLCBzZXQsIGJpbmRpbmcpOworCisgICAgICAgIGJ0LT5zYW1wbGVyX2JpbmRpbmdbaV0gPSBiaW5kaW5nOworICAgICAgICBidC0+c2FtcGxlcl9zZXRbaV0gICAgID0gc2V0OworICAgIH0KKworICAgIC8vIFVCTyBtYXBwaW5nIGRhdGEKKyAgICBidC0+dW5pZm9ybV9iaW5kaW5nID0gKHVpbnQzMl90KikgcnphbGxvY19zaXplKGJydywgYnQtPnVib19jb3VudCAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGJ0LT51bmlmb3JtX3NldCAgICAgPSAodWludDMyX3QqKSByemFsbG9jX3NpemUoYnJ3LCBidC0+dWJvX2NvdW50ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidC0+dWJvX2NvdW50OyArK2kpIHsKKyAgICAgICAgaW50IGxvY2F0aW9uID0gc2gtPlVuaWZvcm1CbG9ja3NbaV0uQmluZGluZzsKKyAgICAgICAgaW50IHNldCA9IDA7CisgICAgICAgIGludCBiaW5kaW5nID0gMDsKKworICAgICAgICB1bnBhY2tfc2V0X2FuZF9iaW5kaW5nKGxvY2F0aW9uLCBzZXQsIGJpbmRpbmcpOworCisgICAgICAgIGJ0LT51bmlmb3JtX2JpbmRpbmdbaV0gPSBiaW5kaW5nOworICAgICAgICBidC0+dW5pZm9ybV9zZXRbaV0gICAgID0gc2V0OworICAgIH0KKworICAgIC8vIFRleHR1cmVHYXRoZXIgbWFwcGluZyBkYXRhCisgICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgZXhhY3RseSBsaWtlIFNhbXBsZXIgbWFwcGluZyBkYXRhCisgICAgYnQtPnRleHR1cmVfZ2F0aGVyX2JpbmRpbmcgPSAodWludDMyX3QqKSByemFsbG9jX3NpemUoYnJ3LCBidC0+dGV4dHVyZV9nYXRoZXJfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBidC0+dGV4dHVyZV9nYXRoZXJfc2V0ICAgICA9ICh1aW50MzJfdCopIHJ6YWxsb2Nfc2l6ZShicncsIGJ0LT50ZXh0dXJlX2dhdGhlcl9jb3VudCAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnQtPnRleHR1cmVfZ2F0aGVyX2NvdW50OyArK2kpIHsKKyAgICAgICAgaW50IGxvY2F0aW9uID0gc2gtPlNhbXBsZXJVbml0c1tpXTsKKyAgICAgICAgaW50IHNldCA9IDA7CisgICAgICAgIGludCBiaW5kaW5nID0gMDsKKworICAgICAgICB1bnBhY2tfc2V0X2FuZF9iaW5kaW5nKGxvY2F0aW9uLCBzZXQsIGJpbmRpbmcpOworCisgICAgICAgIGJ0LT50ZXh0dXJlX2dhdGhlcl9iaW5kaW5nW2ldID0gYmluZGluZzsKKyAgICAgICAgYnQtPnRleHR1cmVfZ2F0aGVyX3NldFtpXSAgICAgPSBzZXQ7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKy8vIGludm9rZSBiYWNrZW5kIGNvbXBpbGVyIHRvIGdlbmVyYXRlIElTQSBhbmQgc3VwcG9ydGluZyBkYXRhIHN0cnVjdHVyZXMKK1ZrUmVzdWx0IGludGVsX3BpcGVsaW5lX3NoYWRlcl9jb21waWxlKHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnBpcGVfc2hhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKnBpcGVsaW5lX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2lyKiBpcikKK3sKKyAgICAvKiBYWFggaG93IGFib3V0IGNvbnN0bmVzcz8gKi8KKyAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoX3Byb2cgPSAoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICopIGlyOworICAgIFZrUmVzdWx0IHN0YXR1cyA9IFZLX1NVQ0NFU1M7CisgICAgc3RydWN0IGJyd19iaW5kaW5nX3RhYmxlIGJ0OworCisgICAgc3RydWN0IGJyd19jb250ZXh0ICpicncgPSBpbnRlbF9jcmVhdGVfYnJ3X2NvbnRleHQoZ3B1KTsKKworICAgIG1lbXNldCgmYnQsIDAsIHNpemVvZihidCkpOworCisgICAgLy8gTHVuYXJHIDogVE9ETyAtIHNob3VsZCB0aGlzIGhhdmUgYmVlbiBzZXQgZm9yIHVzIHNvbWV3aGVyZT8KKyAgICBzaF9wcm9nLT5UeXBlID0gc2hfcHJvZy0+U2hhZGVyc1swXS0+U3RhZ2U7CisKKyAgICBpZiAoYnJ3X2xpbmtfc2hhZGVyKCZicnctPmN0eCwgc2hfcHJvZykpIHsKKworICAgICAgICAvLyBmaXJzdCB0YWtlIGF0IHN0YW5kYWxvbmUgYmFja2VuZCBjb21waWxlCisgICAgICAgIHN3aXRjaChzaF9wcm9nLT5TaGFkZXJzWzBdLT5UeXBlKSB7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX1NIQURFUjoKKyAgICAgICAgeworICAgICAgICAgICAgcGlwZV9zaGFkZXItPmNvZGVTaXplID0gZ2V0X3ZzX3Byb2dyYW1fc2l6ZShicnctPnNoYWRlcl9wcm9nKTsKKworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnBDb2RlID0gcGlwZV9pbnRlcmZhY2VfYWxsb2MoZ3B1LCBwaXBlX3NoYWRlci0+Y29kZVNpemUsIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworCisgICAgICAgICAgICBpZiAoIXBpcGVfc2hhZGVyLT5wQ29kZSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0aGUgSVNBIG91dCBvZiBvdXIgY29tcGlsZSBjb250ZXh0LCBpdCBpcyBhYm91dCB0byBwb29mIGF3YXkKKyAgICAgICAgICAgIG1lbWNweShwaXBlX3NoYWRlci0+cENvZGUsIGdldF92c19wcm9ncmFtKGJydy0+c2hhZGVyX3Byb2cpLCBwaXBlX3NoYWRlci0+Y29kZVNpemUpOworCisgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3ZzX3Byb2dfZGF0YSAqZGF0YSA9IGdldF92c19wcm9nX2RhdGEoYnJ3LT5zaGFkZXJfcHJvZyk7CisKKyAgICAgICAgICAgIGlmIChkYXRhLT51c2VzX3ZlcnRleGlkKQorICAgICAgICAgICAgICAgIHBpcGVfc2hhZGVyLT51c2VzIHw9IElOVEVMX1NIQURFUl9VU0VfVklEOworCisgICAgICAgICAgICBpZiAoZGF0YS0+dXNlc19pbnN0YW5jZWlkKQorICAgICAgICAgICAgICAgIHBpcGVfc2hhZGVyLT51c2VzIHw9IElOVEVMX1NIQURFUl9VU0VfSUlEOworCisgICAgICAgICAgICBhc3NlcnQoVkVSVF9BVFRSSUJfTUFYIC0gVkVSVF9BVFRSSUJfR0VORVJJQzAgPCA2NCk7CisgICAgICAgICAgICB1aW50NjRfdCB1c2VyX2F0dHJfcmVhZCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpPVZFUlRfQVRUUklCX0dFTkVSSUMwOyBpIDwgVkVSVF9BVFRSSUJfTUFYOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YS0+aW5wdXRzX3JlYWQgJiBCSVRGSUVMRDY0X0JJVChpKSkgeworICAgICAgICAgICAgICAgICAgICB1c2VyX2F0dHJfcmVhZCB8PSAoMUwgPDwgKGkgLSBWRVJUX0FUVFJJQl9HRU5FUklDMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5pbnB1dHNfcmVhZCA9IHVzZXJfYXR0cl9yZWFkOworCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+ZW5hYmxlX3VzZXJfY2xpcCA9IHNoX3Byb2ctPlZlcnQuVXNlc0NsaXBEaXN0YW5jZTsKKworICAgICAgICAgICAgYXNzZXJ0KFZBUllJTkdfU0xPVF9NQVggLSBWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMCA8IDY0KTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhcnlpbmdzX3dyaXR0ZW4gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaT1WQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMDsgaSA8IFZBUllJTkdfU0xPVF9NQVg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChkYXRhLT5iYXNlLnZ1ZV9tYXAudmFyeWluZ190b19zbG90W2ldID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyeWluZ3Nfd3JpdHRlbiB8PSAoMSA8PCAoaSAtIFZBUllJTkdfU0xPVF9DTElQX0RJU1QwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGlwZV9zaGFkZXItPm91dHB1dHNfd3JpdHRlbiA9IHZhcnlpbmdzX3dyaXR0ZW47CisKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5vdXRwdXRzX29mZnNldCA9IEJSV19TRl9VUkJfRU5UUllfUkVBRF9PRkZTRVQgKiAyOworCisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgcmVhbGx5IGJlc3QgZ3Vlc3NlcywgYW5kIHdpbGwgcmVxdWlyZSBtb3JlIHdvcmsgdG8KKyAgICAgICAgICAgIC8vIHVuZGVyc3RhbmQgYXMgd2UgdHVybiBvbiBtb3JlIGZlYXR1cmVzCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+aW5fY291bnQgPSB1X3BvcGNvdW50KHVzZXJfYXR0cl9yZWFkKSArCisgICAgICAgICAgICAgICAgICAgICgoZGF0YS0+dXNlc192ZXJ0ZXhpZCB8fCBkYXRhLT51c2VzX2luc3RhbmNlaWQpID8gMSA6IDApOworICAgICAgICAgICAgcGlwZV9zaGFkZXItPm91dF9jb3VudCA9IGRhdGEtPmJhc2UudnVlX21hcC5udW1fc2xvdHM7Ly8gPSAyOworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnVyYl9ncmZfc3RhcnQgPSBkYXRhLT5iYXNlLmRpc3BhdGNoX2dyZl9zdGFydF9yZWc7Ly8gPSAxOworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnN1cmZhY2VfY291bnQgPSBkYXRhLT5iYXNlLmJhc2UuYmluZGluZ190YWJsZS5zaXplX2J5dGVzIC8gNDsKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT51Ym9fc3RhcnQgICAgID0gZGF0YS0+YmFzZS5iYXNlLmJpbmRpbmdfdGFibGUudWJvX3N0YXJ0OworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplID0gZGF0YS0+YmFzZS50b3RhbF9zY3JhdGNoOworCisgICAgICAgICAgICBzdGF0dXMgPSBidWlsZF9iaW5kaW5nX3RhYmxlKGdwdSwgYnJ3LCAmYnQsIGRhdGEtPmJhc2UuYmFzZSwgc2hfcHJvZywgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBWS19TVUNDRVNTKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAodW5saWtlbHkoSU5URUxfREVCVUcgJiBERUJVR19WUykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIm91dF9jb3VudDogJWRcbiIsIHBpcGVfc2hhZGVyLT5vdXRfY291bnQpOworCisgICAgICAgICAgICAgICAgdnNfZGF0YV9kdW1wKHN0ZG91dCwgZGF0YSk7CisKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwiXG5JU0EgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVyOlxuIik7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsIklTQSBzaXplOiAlaVxuIiwgcGlwZV9zaGFkZXItPmNvZGVTaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKHN0ZG91dCwgcGlwZV9zaGFkZXItPnBDb2RlLCBwaXBlX3NoYWRlci0+Y29kZVNpemUpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdMX0dFT01FVFJZX1NIQURFUjoKKyAgICAgICAgeworICAgICAgICAgICAgcGlwZV9zaGFkZXItPmNvZGVTaXplID0gZ2V0X2dzX3Byb2dyYW1fc2l6ZShicnctPnNoYWRlcl9wcm9nKTsKKworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnBDb2RlID0gcGlwZV9pbnRlcmZhY2VfYWxsb2MoZ3B1LCBwaXBlX3NoYWRlci0+Y29kZVNpemUsIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworCisgICAgICAgICAgICBpZiAoIXBpcGVfc2hhZGVyLT5wQ29kZSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0aGUgSVNBIG91dCBvZiBvdXIgY29tcGlsZSBjb250ZXh0LCBpdCBpcyBhYm91dCB0byBwb29mIGF3YXkKKyAgICAgICAgICAgIG1lbWNweShwaXBlX3NoYWRlci0+cENvZGUsIGdldF9nc19wcm9ncmFtKGJydy0+c2hhZGVyX3Byb2cpLCBwaXBlX3NoYWRlci0+Y29kZVNpemUpOworCisgICAgICAgICAgICBzdHJ1Y3QgYnJ3X2dzX3Byb2dfZGF0YSAqZGF0YSA9IGdldF9nc19wcm9nX2RhdGEoYnJ3LT5zaGFkZXJfcHJvZyk7CisKKyAgICAgICAgICAgIHN0cnVjdCBnbF9nZW9tZXRyeV9wcm9ncmFtICpncCA9IChzdHJ1Y3QgZ2xfZ2VvbWV0cnlfcHJvZ3JhbSAqKQorICAgICAgICAgICAgICAgc2hfcHJvZy0+X0xpbmtlZFNoYWRlcnNbTUVTQV9TSEFERVJfR0VPTUVUUlldLT5Qcm9ncmFtOworCisgICAgICAgICAgICAvLyBmb3Igbm93LCBhc3N1bWUgaW5wdXRzIGhhdmUgbm90IGNoYW5nZWQsIGJ1dCBuZWVkIHRvIGhvb2sgdXAgdnVlX21hcF92cworICAgICAgICAgICAgcGlwZV9zaGFkZXItPmlucHV0c19yZWFkID0gZ3AtPkJhc2UuSW5wdXRzUmVhZDsKKworICAgICAgICAgICAgLy8gdXJiIGVudHJpZXMgYXJlIHJlcG9ydGVkIGluIHBhaXJzLCBzZWUgdmVjNF9nc192aXNpdG9yOjpzZXR1cF92YXJ5aW5nX2lucHV0cygpCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+aW5fY291bnQgPSBkYXRhLT5iYXNlLnVyYl9yZWFkX2xlbmd0aCAqIDI7CisKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5lbmFibGVfdXNlcl9jbGlwID0gc2hfcHJvZy0+R2VvbS5Vc2VzQ2xpcERpc3RhbmNlOworICAgICAgICAgICAgcGlwZV9zaGFkZXItPmRpc2NhcmRfYWRqICAgICAgPSAoc2hfcHJvZy0+R2VvbS5JbnB1dFR5cGUgPT0gR0xfTElORVMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX3Byb2ctPkdlb20uSW5wdXRUeXBlID09IEdMX1RSSUFOR0xFUyk7CisKKyAgICAgICAgICAgIGFzc2VydChWQVJZSU5HX1NMT1RfTUFYIC0gVkFSWUlOR19TTE9UX0NMSVBfRElTVDAgPCA2NCk7CisgICAgICAgICAgICB1aW50NjRfdCB2YXJ5aW5nc193cml0dGVuID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGk9VkFSWUlOR19TTE9UX0NMSVBfRElTVDA7IGkgPCBWQVJZSU5HX1NMT1RfTUFYOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YS0+YmFzZS52dWVfbWFwLnZhcnlpbmdfdG9fc2xvdFtpXSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhcnlpbmdzX3dyaXR0ZW4gfD0gKDEgPDwgKGkgLSBWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5vdXRwdXRzX3dyaXR0ZW4gPSB2YXJ5aW5nc193cml0dGVuOworICAgICAgICAgICAgcGlwZV9zaGFkZXItPm91dHB1dHNfb2Zmc2V0ID0gQlJXX1NGX1VSQl9FTlRSWV9SRUFEX09GRlNFVCAqIDI7CisgICAgICAgICAgICBwaXBlX3NoYWRlci0+b3V0X2NvdW50ID0gZGF0YS0+YmFzZS52dWVfbWFwLm51bV9zbG90czsKKworICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB3ZXJlIGFsbCBwcm9ncmFtbWVkIGluIGJyd19nc19kb19jb21waWxlCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+b3V0cHV0X3NpemVfaHdvcmRzICAgICAgICAgICAgICA9IGRhdGEtPm91dHB1dF92ZXJ0ZXhfc2l6ZV9od29yZHM7CisgICAgICAgICAgICBwaXBlX3NoYWRlci0+b3V0cHV0X3RvcG9sb2d5ICAgICAgICAgICAgICAgICA9IGRhdGEtPm91dHB1dF90b3BvbG9neTsKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5jb250cm9sX2RhdGFfaGVhZGVyX3NpemVfaHdvcmRzID0gZGF0YS0+Y29udHJvbF9kYXRhX2hlYWRlcl9zaXplX2h3b3JkczsKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5jb250cm9sX2RhdGFfZm9ybWF0ICAgICAgICAgICAgID0gZGF0YS0+Y29udHJvbF9kYXRhX2Zvcm1hdDsKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5pbmNsdWRlX3ByaW1pdGl2ZV9pZCAgICAgICAgICAgID0gZGF0YS0+aW5jbHVkZV9wcmltaXRpdmVfaWQ7CisgICAgICAgICAgICBwaXBlX3NoYWRlci0+aW52b2NhdGlvbnMgICAgICAgICAgICAgICAgICAgICA9IGRhdGEtPmludm9jYXRpb25zOworICAgICAgICAgICAgcGlwZV9zaGFkZXItPmR1YWxfaW5zdGFuY2VkX2Rpc3BhdGNoICAgICAgICAgPSBkYXRhLT5kdWFsX2luc3RhbmNlZF9kaXNwYXRjaDsKKworICAgICAgICAgICAgLy8gVGhlIHJlc3QgZHVwbGljYXRlZCBmcm9tIFZTLCBtZXJnZSBpdCBhbmQgY2xlYW4gdXAKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT51cmJfZ3JmX3N0YXJ0ID0gZGF0YS0+YmFzZS5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnOworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnN1cmZhY2VfY291bnQgPSBkYXRhLT5iYXNlLmJhc2UuYmluZGluZ190YWJsZS5zaXplX2J5dGVzIC8gNDsKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT51Ym9fc3RhcnQgICAgID0gZGF0YS0+YmFzZS5iYXNlLmJpbmRpbmdfdGFibGUudWJvX3N0YXJ0OworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplID0gZGF0YS0+YmFzZS50b3RhbF9zY3JhdGNoOworCisgICAgICAgICAgICBzdGF0dXMgPSBidWlsZF9iaW5kaW5nX3RhYmxlKGdwdSwgYnJ3LCAmYnQsIGRhdGEtPmJhc2UuYmFzZSwgc2hfcHJvZywgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmICh1bmxpa2VseShJTlRFTF9ERUJVRyAmIERFQlVHX0dTKSkgeworICAgICAgICAgICAgICAgIHByaW50Zigib3V0X2NvdW50OiAlZFxuIiwgcGlwZV9zaGFkZXItPm91dF9jb3VudCk7CisKKyAgICAgICAgICAgICAgICBnc19kYXRhX2R1bXAoc3Rkb3V0LCBkYXRhKTsKKworICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCJcbklTQSBnZW5lcmF0ZWQgYnkgY29tcGlsZXI6XG4iKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwiSVNBIHNpemU6ICVpXG4iLCBwaXBlX3NoYWRlci0+Y29kZVNpemUpOworICAgICAgICAgICAgICAgIGhleGR1bXAoc3Rkb3V0LCBwaXBlX3NoYWRlci0+cENvZGUsIHBpcGVfc2hhZGVyLT5jb2RlU2l6ZSk7CisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHTF9GUkFHTUVOVF9TSEFERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IHB1bGxpbmcgYml0cyBvdXQgb2Ygb3VyIGNvbXBpbGUgcmVzdWx0LgorICAgICAgICAgICAgLy8gc2VlIHVwbG9hZF9wc19zdGF0ZSgpIGZvciByZWZlcmVuY2VzIGFib3V0IHdoYXQgSSBiZWxpZXZlIGVhY2ggb2YgdGhlc2UgdmFsdWVzIGFyZQorCisgICAgICAgICAgICAvLyBJIHdvdWxkIHByZWZlciB0byBmaW5kIGEgd2F5IHRvIHB1bGwgdGhpcyBkYXRhIG91dCB3aXRob3V0IGV4cG9zaW5nCisgICAgICAgICAgICAvLyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBjb21waWxlciwgYnV0IGl0IGhhc24ndCBwcmVzZW50ZWQgaXRzZWxmIHlldAorCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+Y29kZVNpemUgPSBnZXRfd21fcHJvZ3JhbV9zaXplKGJydy0+c2hhZGVyX3Byb2cpOworCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+cENvZGUgPSBwaXBlX2ludGVyZmFjZV9hbGxvYyhncHUsIHBpcGVfc2hhZGVyLT5jb2RlU2l6ZSwgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisKKyAgICAgICAgICAgIGlmICghcGlwZV9zaGFkZXItPnBDb2RlKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRoZSBJU0Egb3V0IG9mIG91ciBjb21waWxlIGNvbnRleHQsIGl0IGlzIGFib3V0IHRvIHBvb2YgYXdheQorICAgICAgICAgICAgbWVtY3B5KHBpcGVfc2hhZGVyLT5wQ29kZSwgZ2V0X3dtX3Byb2dyYW0oYnJ3LT5zaGFkZXJfcHJvZyksIHBpcGVfc2hhZGVyLT5jb2RlU2l6ZSk7CisKKyAgICAgICAgICAgIHN0cnVjdCBicndfd21fcHJvZ19kYXRhICpkYXRhID0gZ2V0X3dtX3Byb2dfZGF0YShicnctPnNoYWRlcl9wcm9nKTsKKworICAgICAgICAgICAgYXNzZXJ0KFZBUllJTkdfU0xPVF9NQVggLSBWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMCA8IDY0KTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhcnlpbmdzX3JlYWQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaT1WQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMDsgaSA8IFZBUllJTkdfU0xPVF9NQVg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChkYXRhLT51cmJfc2V0dXBbaV0gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICB2YXJ5aW5nc19yZWFkIHw9ICgxIDw8IChpIC0gVkFSWUlOR19TTE9UX0NMSVBfRElTVDApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaXBlX3NoYWRlci0+aW5wdXRzX3JlYWQgPSB2YXJ5aW5nc19yZWFkOworCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+Z2VuZXJpY19pbnB1dF9zdGFydCA9IFZBUllJTkdfU0xPVF9WQVIwIC0gVkFSWUlOR19TTE9UX0NMSVBfRElTVDA7CisKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5yZWFkc191c2VyX2NsaXAgPSBkYXRhLT51cmJfc2V0dXBbVkFSWUlOR19TTE9UX0NMSVBfRElTVDBdID49IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT51cmJfc2V0dXBbVkFSWUlOR19TTE9UX0NMSVBfRElTVDFdID49IDA7CisKKyAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5zdXJmYWNlX2NvdW50ID0gZGF0YS0+YmFzZS5iaW5kaW5nX3RhYmxlLnNpemVfYnl0ZXMgLyA0OworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnVib19zdGFydCAgICAgPSBkYXRhLT5iYXNlLmJpbmRpbmdfdGFibGUudWJvX3N0YXJ0OworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnVyYl9ncmZfc3RhcnQgPSBkYXRhLT5maXJzdF9jdXJiZV9ncmY7CisgICAgICAgICAgICBwaXBlX3NoYWRlci0+aW5fY291bnQgICAgICA9IGRhdGEtPm51bV92YXJ5aW5nX2lucHV0czsKKworICAgICAgICAgICAgLy8gUGFzcyBvbiBTSU1EMTYgaW5mbworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnVyYl9ncmZfc3RhcnRfMTYgPSBkYXRhLT5maXJzdF9jdXJiZV9ncmZfMTY7CisgICAgICAgICAgICBwaXBlX3NoYWRlci0+b2Zmc2V0XzE2ICAgICAgICA9IGRhdGEtPnByb2dfb2Zmc2V0XzE2OworCisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgcHJvZ3JhbW1lZCBiYXNlZCBvbiBnZW43X3dtX3N0YXRlLmM6OnVwbG9hZF93bV9zdGF0ZSgpCisgICAgICAgICAgICBzdHJ1Y3QgZ2xfZnJhZ21lbnRfcHJvZ3JhbSAqZnAgPSAoc3RydWN0IGdsX2ZyYWdtZW50X3Byb2dyYW0gKikKKyAgICAgICAgICAgICAgIHNoX3Byb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0ZSQUdNRU5UXS0+UHJvZ3JhbTsKKworICAgICAgICAgICAgaWYgKGZwLT5Vc2VzS2lsbCkKKyAgICAgICAgICAgICAgICBwaXBlX3NoYWRlci0+dXNlcyB8PSBJTlRFTF9TSEFERVJfVVNFX0tJTEw7CisKKyAgICAgICAgICAgIGlmIChmcC0+QmFzZS5JbnB1dHNSZWFkICYgVkFSWUlOR19CSVRfUE9TKQorICAgICAgICAgICAgICAgIHBpcGVfc2hhZGVyLT51c2VzIHw9IElOVEVMX1NIQURFUl9VU0VfREVQVEggfCBJTlRFTF9TSEFERVJfVVNFX1c7CisKKyAgICAgICAgICAgIGlmIChmcC0+QmFzZS5PdXRwdXRzV3JpdHRlbiAmIEJJVEZJRUxENjRfQklUKEZSQUdfUkVTVUxUX0RFUFRIKSkgeworCisgICAgICAgICAgICAgICAgc3dpdGNoIChmcC0+RnJhZ0RlcHRoTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgY2FzZSBGUkFHX0RFUFRIX0xBWU9VVF9OT05FOgorICAgICAgICAgICAgICAgICAgIGNhc2UgRlJBR19ERVBUSF9MQVlPVVRfQU5ZOgorICAgICAgICAgICAgICAgICAgICAgIHBpcGVfc2hhZGVyLT5jb21wdXRlZF9kZXB0aF9tb2RlID0gSU5URUxfQ09NUFVURURfREVQVEhfTU9ERV9PTjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICBjYXNlIEZSQUdfREVQVEhfTEFZT1VUX0dSRUFURVI6CisgICAgICAgICAgICAgICAgICAgICAgcGlwZV9zaGFkZXItPmNvbXB1dGVkX2RlcHRoX21vZGUgPSBJTlRFTF9DT01QVVRFRF9ERVBUSF9NT0RFX09OX0dFOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgRlJBR19ERVBUSF9MQVlPVVRfTEVTUzoKKyAgICAgICAgICAgICAgICAgICAgICBwaXBlX3NoYWRlci0+Y29tcHV0ZWRfZGVwdGhfbW9kZSA9IElOVEVMX0NPTVBVVEVEX0RFUFRIX01PREVfT05fTEU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBGUkFHX0RFUFRIX0xBWU9VVF9VTkNIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFbnN1cmUgdGhpcyBpcyAxOjEsIG9yIGNyZWF0ZSBhIGNvbnZlcnRlcgorICAgICAgICAgICAgcGlwZV9zaGFkZXItPmJhcnljZW50cmljX2ludGVycHMgPSBkYXRhLT5iYXJ5Y2VudHJpY19pbnRlcnBfbW9kZXM7CisKKyAgICAgICAgICAgIGlmIChkYXRhLT51cmJfc2V0dXBbVkFSWUlOR19TTE9UX1BOVENdID49IDApCisgICAgICAgICAgICAgICAgcGlwZV9zaGFkZXItPnBvaW50X3Nwcml0ZV9lbmFibGVzID0gMSA8PCBkYXRhLT51cmJfc2V0dXBbVkFSWUlOR19TTE9UX1BOVENdOworCisgICAgICAgICAgICBzdHJ1Y3QgYnJ3X3N0YWdlX3N0YXRlICpzdGFnZV9zdGF0ZSA9ICZicnctPndtLmJhc2U7CisgICAgICAgICAgICBwaXBlX3NoYWRlci0+c2FtcGxlcl9jb3VudCA9IHN0YWdlX3N0YXRlLT5zYW1wbGVyX2NvdW50OworCisgICAgICAgICAgICAvLyBUT0RPIC0gRmlndXJlIG91dCBtdWx0aXBsZSBGUyBvdXRwdXRzCisgICAgICAgICAgICBwaXBlX3NoYWRlci0+b3V0X2NvdW50ID0gMTsKKworICAgICAgICAgICAgcGlwZV9zaGFkZXItPnBlcl90aHJlYWRfc2NyYXRjaF9zaXplID0gZGF0YS0+dG90YWxfc2NyYXRjaDsKKworICAgICAgICAgICAgLy8gY2FsbCBjb21tb24gY29kZSBmb3IgY29tbW9uIGJpbmRpbmcgdGFibGUgZW50cmllcworICAgICAgICAgICAgc3RhdHVzID0gYnVpbGRfYmluZGluZ190YWJsZShncHUsIGJydywgJmJ0LCBkYXRhLT5iYXNlLCBzaF9wcm9nLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gYW5kIHRoZW4gdGFjayBvbiB0aGUgcmVtYWluaW5nIGZpZWxkIGZvciBGUworICAgICAgICAgICAgYnQucnRfc3RhcnQgPSBkYXRhLT5iaW5kaW5nX3RhYmxlLnJlbmRlcl90YXJnZXRfc3RhcnQ7CisKKyAgICAgICAgICAgIGlmICh1bmxpa2VseShJTlRFTF9ERUJVRyAmIERFQlVHX1dNKSkgeworICAgICAgICAgICAgICAgIC8vIHByaW50IG91dCB0aGUgc3VwcG9ydGluZyBzdHJ1Y3R1cmVzIGdlbmVyYXRlZCBieSB0aGUgQkUgY29tcGlsZToKKyAgICAgICAgICAgICAgICBmc19kYXRhX2R1bXAoc3Rkb3V0LCBkYXRhKTsKKworICAgICAgICAgICAgICAgIHByaW50ZigiaW5fY291bnQ6ICVkXG4iLCBwaXBlX3NoYWRlci0+aW5fY291bnQpOworCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsIlxuSVNBIGdlbmVyYXRlZCBieSBjb21waWxlcjpcbiIpOworICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCJJU0Egc2l6ZTogJWlcbiIsIHBpcGVfc2hhZGVyLT5jb2RlU2l6ZSk7CisgICAgICAgICAgICAgICAgaGV4ZHVtcChzdGRvdXQsIHBpcGVfc2hhZGVyLT5wQ29kZSwgcGlwZV9zaGFkZXItPmNvZGVTaXplKTsKKyAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHTF9DT01QVVRFX1NIQURFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgc3RhdHVzID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBwaXBlX3NoYWRlci0+cm1hcCA9IHJtYXBfY3JlYXRlKGdwdSwgcGlwZWxpbmVfbGF5b3V0LCAmYnQpOworICAgICAgICBpZiAoIXBpcGVfc2hhZGVyLT5ybWFwKSB7CisgICAgICAgICAgICBpbnRlbF9waXBlbGluZV9zaGFkZXJfY2xlYW51cChwaXBlX3NoYWRlciwgZ3B1KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVsX2Rlc3Ryb3lfYnJ3X2NvbnRleHQoYnJ3KTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NsZWFudXAoc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSkKK3sKKyAgICBwaXBlX2ludGVyZmFjZV9mcmVlKGdwdSwgc2gtPnBDb2RlKTsKKyAgICBpZiAoc2gtPnJtYXApCisgICAgICAgIHJtYXBfZGVzdHJveShncHUsIHNoLT5ybWFwKTsKKyAgICBtZW1zZXQoc2gsIDAsIHNpemVvZigqc2gpKTsKK30KKworCit2b2lkIGludGVsX2Rpc2Fzc2VtYmxlX2tlcm5lbChjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXJuZWwsIHNpemVfdCBzaXplKQoreworICAgIHN0cnVjdCBicndfY29tcGlsZSBjOworCisgICAgbWVtc2V0KCZjLCAwLCBzaXplb2YoYykpOworICAgIGMuYnJ3ID0gaW50ZWxfY3JlYXRlX2Jyd19jb250ZXh0KGdwdSk7CisgICAgYy5zdG9yZSA9IChzdHJ1Y3QgYnJ3X2luc3RydWN0aW9uICopIGtlcm5lbDsKKworICAgIGJyd19kdW1wX2NvbXBpbGUoJmMsIHN0ZGVyciwgMCwgc2l6ZSk7Cit9CisKK30gLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL3BpcGVsaW5lX2NvbXBpbGVyX2ludGVyZmFjZS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3BpcGVsaW5lL3BpcGVsaW5lX2NvbXBpbGVyX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTkxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvcGlwZWxpbmVfY29tcGlsZXJfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNvZHlAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogR3JlZ0YgPGdyZWdATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBQSVBFTElORV9DT01QSUxFUl9JTlRFUkZBQ0VfSAorI2RlZmluZSBQSVBFTElORV9DT01QSUxFUl9JTlRFUkZBQ0VfSAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgImRldi5oIgorCitzdHJ1Y3QgYnJ3X2NvbnRleHQ7CitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfbGF5b3V0Oworc3RydWN0IGludGVsX2dwdTsKK3N0cnVjdCBpbnRlbF9pcjsKK3N0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXI7CisKK3N0cnVjdCBicndfY29udGV4dCAqaW50ZWxfY3JlYXRlX2Jyd19jb250ZXh0KGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSk7Cit2b2lkIGludGVsX2Rlc3Ryb3lfYnJ3X2NvbnRleHQoc3RydWN0IGJyd19jb250ZXh0ICpicncpOworCitWa1Jlc3VsdCBpbnRlbF9waXBlbGluZV9zaGFkZXJfY29tcGlsZShzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICppcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2xheW91dCAqcGlwZWxpbmVfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfaXIqIGlyKTsKKwordm9pZCBpbnRlbF9waXBlbGluZV9zaGFkZXJfY2xlYW51cChzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1KTsKKworVmtSZXN1bHQgaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NvbXBpbGVfbWV0YShzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9kZXZfbWV0YV9zaGFkZXIgaWQpOworCit2b2lkIGludGVsX2Rpc2Fzc2VtYmxlX2tlcm5lbChjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXJuZWwsIHNpemVfdCBzaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLyogUElQRUxJTkVfQ09NUElMRVJfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9waXBlbGluZS9waXBlbGluZV9jb21waWxlcl9pbnRlcmZhY2VfbWV0YS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvcGlwZWxpbmVfY29tcGlsZXJfaW50ZXJmYWNlX21ldGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTczN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvcGlwZWxpbmUvcGlwZWxpbmVfY29tcGlsZXJfaW50ZXJmYWNlX21ldGEuY3BwCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqCisgKi8KKworCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJncHUuaCIKKyNpbmNsdWRlICJwaXBlbGluZS5oIgorfQorI2luY2x1ZGUgImNvbXBpbGVyL3NoYWRlci9jb21waWxlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb21waWxlci9waXBlbGluZS9waXBlbGluZV9jb21waWxlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb21waWxlci9waXBlbGluZS9icndfYmxvcnBfYmxpdF9ldS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL3BpcGVsaW5lL2Jyd19ibG9ycC5oIgorCitlbnVtIHNhbXBsZXJfcGFyYW0geworICAgIFNBTVBMRVJfUEFSQU1fSE9MRSwKKyAgICBTQU1QTEVSX1BBUkFNX1pFUk8sCisgICAgU0FNUExFUl9QQVJBTV9YLAorICAgIFNBTVBMRVJfUEFSQU1fWSwKKyAgICBTQU1QTEVSX1BBUkFNX0xBWUVSLAorICAgIFNBTVBMRVJfUEFSQU1fTE9ELAorfTsKKworY2xhc3MgaW50ZWxfbWV0YV9jb21waWxlciA6IHB1YmxpYyBicndfYmxvcnBfZXVfZW1pdHRlcgoreworcHVibGljOgorICAgIGludGVsX21ldGFfY29tcGlsZXIoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJyd19jb250ZXh0ICpicncsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2Rldl9tZXRhX3NoYWRlciBpZCk7CisgICAgdm9pZCAqY29tcGlsZShicndfYmxvcnBfcHJvZ19kYXRhICpwcm9nX2RhdGEsIHVpbnQzMl90ICpjb2RlX3NpemUpOworCitwcml2YXRlOgorICAgIHZvaWQgYWxsb2NfcmVncygpCisgICAgeworICAgICAgICBpbnQgZ3JmID0gYmFzZV9ncmY7CisKKyAgICAgICAgZ3JmID0gYWxsb2NfcGNiX3JlZ3MoZ3JmKTsKKyAgICAgICAgZ3JmID0gYWxsb2NfaW5wdXRfcmVncyhncmYpOworICAgICAgICBncmYgPSBhbGxvY190ZW1wX3JlZ3MoZ3JmKTsKKworICAgICAgICBhc3NlcnQoZ3JmIDw9IDEyOCk7CisgICAgfQorCisgICAgaW50IGFsbG9jX3BjYl9yZWdzKGludCBncmYpOworICAgIGludCBhbGxvY19pbnB1dF9yZWdzKGludCBncmYpOworICAgIGludCBhbGxvY190ZW1wX3JlZ3MoaW50IGdyZik7CisKKyAgICB2b2lkIGVtaXRfY29tcHV0ZV9mcmFnX2Nvb3JkKCk7CisgICAgdm9pZCBlbWl0X3NhbXBsZXJfcGF5bG9hZChjb25zdCBzdHJ1Y3QgYnJ3X3JlZyAmbXJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBzYW1wbGVyX3BhcmFtICpwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbV9jb3VudCk7CisKKyAgICB2b2lkIGVtaXRfdnNfZmlsbF9tZW0oKTsKKyAgICB2b2lkIGVtaXRfdnNfY29weV9tZW0oKTsKKyAgICB2b2lkIGVtaXRfdnNfY29weV9pbWdfdG9fbWVtKCk7CisgICAgdm9pZCBlbWl0X2NvcHlfbWVtKCk7CisgICAgdm9pZCBlbWl0X2NvcHlfaW1nKCk7CisgICAgdm9pZCBlbWl0X2NvcHlfbWVtX3RvX2ltZygpOworCisgICAgdm9pZCBlbWl0X2NsZWFyX2NvbG9yKCk7CisgICAgdm9pZCBlbWl0X2NsZWFyX2RlcHRoKCk7CisgICAgdm9pZCAqY29kZWdlbih1aW50MzJfdCAqY29kZV9zaXplKTsKKworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdTsKKyAgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydzsKKyAgICBlbnVtIGludGVsX2Rldl9tZXRhX3NoYWRlciBpZDsKKworICAgIGNvbnN0IHN0cnVjdCBicndfcmVnIHBvaXNvbjsKKyAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyByMDsKKyAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyByMTsKKyAgICBjb25zdCBpbnQgYmFzZV9ncmY7CisgICAgY29uc3QgaW50IGJhc2VfbXJmOworCisgICAgLyogcHVzaGVkIGNvbnN0cyAqLworICAgIHN0cnVjdCBicndfcmVnIGNsZWFyX3ZhbHNbNF07CisKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmNfb2Zmc2V0X3g7CisgICAgc3RydWN0IGJyd19yZWcgc3JjX29mZnNldF95OworICAgIHN0cnVjdCBicndfcmVnIHNyY19sYXllcjsKKyAgICBzdHJ1Y3QgYnJ3X3JlZyBzcmNfbG9kOworCisgICAgc3RydWN0IGJyd19yZWcgZHN0X21lbV9vZmZzZXQ7CisgICAgc3RydWN0IGJyd19yZWcgZHN0X2V4dGVudF93aWR0aDsKKworICAgIC8qIGlucHV0cyAqLworICAgIHN0cnVjdCBicndfcmVnIHZpZDsKKworICAgIC8qIHRlbXBzICovCisgICAgc3RydWN0IGJyd19yZWcgZnJhZ194OworICAgIHN0cnVjdCBicndfcmVnIGZyYWdfeTsKKworICAgIHN0cnVjdCBicndfcmVnIHRleGVsc1s0XTsKKworICAgIHN0cnVjdCBicndfcmVnIHRlbXBzWzRdOworfTsKKworaW50ZWxfbWV0YV9jb21waWxlcjo6aW50ZWxfbWV0YV9jb21waWxlcihjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBicndfY29udGV4dCAqYnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2Rldl9tZXRhX3NoYWRlciBpZCkKKyAgICA6IGJyd19ibG9ycF9ldV9lbWl0dGVyKGJydyksIGdwdShncHUpLCBicncoYnJ3KSwgaWQoaWQpLAorICAgICAgcG9pc29uKGJyd19pbW1fdWQoMHgxMjM0NTY3OCkpLAorICAgICAgcjAocmV0eXBlKGJyd192ZWM4X2dyZigwLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpKSwKKyAgICAgIHIxKHJldHlwZShicndfdmVjOF9ncmYoMSwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKSksCisgICAgICBiYXNlX2dyZigyKSwgLyogc2tpcHBpbmcgcjAgYW5kIHIxICovCisgICAgICBiYXNlX21yZigxKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xlYXJfdmFscyk7IGkrKykKKyAgICAgICAgY2xlYXJfdmFsc1tpXSA9IHBvaXNvbjsKKworICAgIHNyY19vZmZzZXRfeCA9IHBvaXNvbjsKKyAgICBzcmNfb2Zmc2V0X3kgPSBwb2lzb247CisgICAgc3JjX2xheWVyID0gcG9pc29uOworICAgIHNyY19sb2QgPSBwb2lzb247CisKKyAgICBkc3RfbWVtX29mZnNldCA9IHBvaXNvbjsKKyAgICBkc3RfZXh0ZW50X3dpZHRoID0gcG9pc29uOworCisgICAgdmlkID0gcG9pc29uOworfQorCitpbnQgaW50ZWxfbWV0YV9jb21waWxlcjo6YWxsb2NfcGNiX3JlZ3MoaW50IGdyZikKK3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19GSUxMX01FTToKKyAgICAgICAgZHN0X21lbV9vZmZzZXQgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgY2xlYXJfdmFsc1swXSA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAxKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9NRU1fVU5BTElHTkVEOgorICAgICAgICBkc3RfbWVtX29mZnNldCA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBzcmNfb2Zmc2V0X3ggPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgMSksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1I4X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjE2X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyQjMyQTMyX1RPX01FTToKKyAgICAgICAgc3JjX29mZnNldF94ID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIHNyY19vZmZzZXRfeSA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAxKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBkc3RfZXh0ZW50X3dpZHRoID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDIpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIGRzdF9tZW1fb2Zmc2V0ID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDMpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV9NRU06CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFEOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRF9BUlJBWToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkQ6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX0FSUkFZOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9NUzoKKyAgICAgICAgc3JjX29mZnNldF94ID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIHNyY19vZmZzZXRfeSA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAxKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBzcmNfbGF5ZXIgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgMiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgc3JjX2xvZCA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAzKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMURfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRF9BUlJBWV9UT19NRU06CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkRfQVJSQVlfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9NU19UT19NRU06CisgICAgICAgIHNyY19vZmZzZXRfeCA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBzcmNfb2Zmc2V0X3kgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgMSksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgc3JjX2xheWVyID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDIpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIHNyY19sb2QgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgMyksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgZHN0X21lbV9vZmZzZXQgPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgNCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgZHN0X2V4dGVudF93aWR0aCA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCA1KSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfTUVNX1RPX0lNRzoKKyAgICAgICAgc3JjX29mZnNldF94ID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIHNyY19vZmZzZXRfeSA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAxKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBkc3RfZXh0ZW50X3dpZHRoID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDIpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ0xFQVJfQ09MT1I6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DTEVBUl9ERVBUSDoKKyAgICAgICAgY2xlYXJfdmFsc1swXSA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBjbGVhcl92YWxzWzFdID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDEpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIGNsZWFyX3ZhbHNbMl0gPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgMiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgY2xlYXJfdmFsc1szXSA9IHJldHlwZShicndfdmVjMV9ncmYoZ3JmLCAzKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX1JFU09MVkVfMlg6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19SRVNPTFZFXzRYOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfUkVTT0xWRV84WDoKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX1JFU09MVkVfMTZYOgorICAgICAgICBzcmNfb2Zmc2V0X3ggPSByZXR5cGUoYnJ3X3ZlYzFfZ3JmKGdyZiwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICAgICAgc3JjX29mZnNldF95ID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDEpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBncmYgKyAxOworfQorCitpbnQgaW50ZWxfbWV0YV9jb21waWxlcjo6YWxsb2NfaW5wdXRfcmVncyhpbnQgZ3JmKQoreworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0ZJTExfTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9NRU06CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTV9VTkFMSUdORUQ6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1I4X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjE2X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyQjMyQTMyX1RPX01FTToKKyAgICAgICAgdmlkID0gcmV0eXBlKGJyd192ZWMxX2dyZihncmYsIDApLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBncmYgKyAxOworfQorCitpbnQgaW50ZWxfbWV0YV9jb21waWxlcjo6YWxsb2NfdGVtcF9yZWdzKGludCBncmYpCit7CisgICAgaW50IGk7CisKKyAgICBmcmFnX3ggPSByZXR5cGUoYnJ3X3ZlYzhfZ3JmKGdyZiwgMCksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKyAgICBncmYrKzsKKworICAgIGZyYWdfeSA9IHJldHlwZShicndfdmVjOF9ncmYoZ3JmLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVVcpOworICAgIGdyZisrOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGV4ZWxzKTsgaSsrKSB7CisgICAgICAgIHRleGVsc1tpXSA9IHJldHlwZShicndfdmVjOF9ncmYoZ3JmLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBncmYgKz0gODsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZW1wcyk7IGkrKykgeworICAgICAgICB0ZW1wc1tpXSA9IHJldHlwZShicndfdmVjOF9ncmYoZ3JmLCAwKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgICAgICBncmYgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gZ3JmOworfQorCit2b2lkIGludGVsX21ldGFfY29tcGlsZXI6OmVtaXRfY29tcHV0ZV9mcmFnX2Nvb3JkKCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyB4ID0gcmV0eXBlKHN1Ym9mZnNldChyMSwgMiksIEJSV19SRUdJU1RFUl9UWVBFX1VXKTsKKyAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyB5ID0gc3Vib2Zmc2V0KHgsIDEpOworCisgICAgZW1pdF9hZGQoZnJhZ194LCBzdHJpZGUoeCwgMiwgNCwgMCksIGJyd19pbW1fdigweDEwMTAxMDEwKSk7CisgICAgZW1pdF9hZGQoZnJhZ195LCBzdHJpZGUoeSwgMiwgNCwgMCksIGJyd19pbW1fdigweDExMDAxMTAwKSk7Cit9CisKK3ZvaWQgaW50ZWxfbWV0YV9jb21waWxlcjo6ZW1pdF9zYW1wbGVyX3BheWxvYWQoY29uc3Qgc3RydWN0IGJyd19yZWcgJm1yZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBzYW1wbGVyX3BhcmFtICpwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtX2NvdW50KQoreworICAgIGludCBtcmZfb2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtX2NvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChwYXJhbXNbaV0pIHsKKyAgICAgICAgY2FzZSBTQU1QTEVSX1BBUkFNX0hPTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQU1QTEVSX1BBUkFNX1pFUk86CisgICAgICAgICAgICBlbWl0X21vdihvZmZzZXQobXJmLCBtcmZfb2Zmc2V0KSwgYnJ3X2ltbV91ZCgwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQU1QTEVSX1BBUkFNX1g6CisgICAgICAgICAgICBlbWl0X2FkZChvZmZzZXQobXJmLCBtcmZfb2Zmc2V0KSwgZnJhZ194LCBzcmNfb2Zmc2V0X3gpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0FNUExFUl9QQVJBTV9ZOgorICAgICAgICAgICAgZW1pdF9hZGQob2Zmc2V0KG1yZiwgbXJmX29mZnNldCksIGZyYWdfeSwgc3JjX29mZnNldF95KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNBTVBMRVJfUEFSQU1fTEFZRVI6CisgICAgICAgICAgICBlbWl0X21vdihvZmZzZXQobXJmLCBtcmZfb2Zmc2V0KSwgc3JjX2xheWVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNBTVBMRVJfUEFSQU1fTE9EOgorICAgICAgICAgICAgZW1pdF9tb3Yob2Zmc2V0KG1yZiwgbXJmX29mZnNldCksIHNyY19sb2QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoISJ1bmtub3duIHNhbXBsZXIgcGFyYW1ldGVyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1yZl9vZmZzZXQgKz0gMjsKKyAgICB9Cit9CisKK3ZvaWQgaW50ZWxfbWV0YV9jb21waWxlcjo6ZW1pdF92c19maWxsX21lbSgpCit7CisgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgbXJmID0KKyAgICAgICAgcmV0eXBlKHZlYzEoYnJ3X21lc3NhZ2VfcmVnKGJhc2VfbXJmKSksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICBpbnQgbXJmX29mZnNldCA9IDA7CisgICAgYm9vbCB1c2VfaGVhZGVyOworCisgICAgaWYgKGJydy0+Z2VuID49IDcpIHsKKyAgICAgICAgdXNlX2hlYWRlciA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIGVtaXRfbW92Xzgob2Zmc2V0KHZlYzgobXJmKSwgbXJmX29mZnNldCksIHIwKTsKKyAgICAgICAgbXJmX29mZnNldCArPSAxOworCisgICAgICAgIHVzZV9oZWFkZXIgPSB0cnVlOworICAgIH0KKworICAgIGVtaXRfYWRkXzgob2Zmc2V0KG1yZiwgbXJmX29mZnNldCksIGRzdF9tZW1fb2Zmc2V0LCB2aWQpOworICAgIG1yZl9vZmZzZXQgKz0gMTsKKworICAgIGVtaXRfbW92Xzgob2Zmc2V0KG1yZiwgbXJmX29mZnNldCksIGNsZWFyX3ZhbHNbMF0pOworICAgIG1yZl9vZmZzZXQgKz0gMTsKKworICAgIGVtaXRfc2NhdHRlcmVkX3dyaXRlKFNIQURFUl9PUENPREVfRFdPUkRfU0NBVFRFUkVEX1dSSVRFLAorICAgICAgICAgICAgbXJmLCBiYXNlX21yZiwgbXJmX29mZnNldCwgMSwgdXNlX2hlYWRlcik7CisKKyAgICBlbWl0X3VyYl93cml0ZV9lb3QoYmFzZV9tcmYpOworfQorCit2b2lkIGludGVsX21ldGFfY29tcGlsZXI6OmVtaXRfdnNfY29weV9tZW0oKQoreworICAgIGNvbnN0IHN0cnVjdCBicndfcmVnIG1yZiA9CisgICAgICAgIHJldHlwZSh2ZWMxKGJyd19tZXNzYWdlX3JlZyhiYXNlX21yZikpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisgICAgaW50IG1yZl9vZmZzZXQgPSAwOworICAgIGVudW0gb3Bjb2RlIG9wX3JlYWQsIG9wX3dyaXRlOworICAgIGJvb2wgdXNlX2hlYWRlcjsKKworICAgIGlmIChpZCA9PSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTSkgeworICAgICAgICBvcF9yZWFkID0gU0hBREVSX09QQ09ERV9EV09SRF9TQ0FUVEVSRURfUkVBRDsKKyAgICAgICAgb3Bfd3JpdGUgPSBTSEFERVJfT1BDT0RFX0RXT1JEX1NDQVRURVJFRF9XUklURTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBCeXRlIFNjYXR0ZXJlZCBSZWFkL1dyaXRlIGFyZSBHZW43KyBvbmx5ICovCisgICAgICAgIGlmIChicnctPmdlbiA9PSA2KSB7CisgICAgICAgICAgICBlbWl0X3VyYl93cml0ZV9lb3QoYmFzZV9tcmYpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG9wX3JlYWQgPSBTSEFERVJfT1BDT0RFX0JZVEVfU0NBVFRFUkVEX1JFQUQ7CisgICAgICAgIG9wX3dyaXRlID0gU0hBREVSX09QQ09ERV9CWVRFX1NDQVRURVJFRF9XUklURTsKKyAgICB9CisKKyAgICBpZiAoYnJ3LT5nZW4gPj0gNykgeworICAgICAgICB1c2VfaGVhZGVyID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW1pdF9tb3ZfOChvZmZzZXQodmVjOChtcmYpLCBtcmZfb2Zmc2V0KSwgcjApOworICAgICAgICBtcmZfb2Zmc2V0ICs9IDE7CisKKyAgICAgICAgdXNlX2hlYWRlciA9IHRydWU7CisgICAgfQorCisgICAgZW1pdF9hZGRfOChvZmZzZXQobXJmLCBtcmZfb2Zmc2V0KSwgc3JjX29mZnNldF94LCB2aWQpOworICAgIG1yZl9vZmZzZXQgKz0gMTsKKyAgICBlbWl0X3NjYXR0ZXJlZF9yZWFkKHRlbXBzWzBdLCBvcF9yZWFkLCBtcmYsCisgICAgICAgICAgICBiYXNlX21yZiwgbXJmX29mZnNldCwgMSwgdXNlX2hlYWRlcik7CisKKyAgICAvKiBwcmVwYXJlIHRvIHNldCB1cCBkc3Qgb2Zmc2V0ICovCisgICAgbXJmX29mZnNldCAtPSAxOworCisgICAgZW1pdF9hZGRfOChvZmZzZXQobXJmLCBtcmZfb2Zmc2V0KSwgZHN0X21lbV9vZmZzZXQsIHZpZCk7CisgICAgbXJmX29mZnNldCArPSAxOworICAgIGVtaXRfbW92Xzgob2Zmc2V0KG1yZiwgbXJmX29mZnNldCksIHZlYzEodGVtcHNbMF0pKTsKKyAgICBtcmZfb2Zmc2V0ICs9IDE7CisKKyAgICBlbWl0X3NjYXR0ZXJlZF93cml0ZShvcF93cml0ZSwgbXJmLCBiYXNlX21yZiwgbXJmX29mZnNldCwgMSwgdXNlX2hlYWRlcik7CisKKyAgICBlbWl0X3VyYl93cml0ZV9lb3QoYmFzZV9tcmYpOworfQorCit2b2lkIGludGVsX21ldGFfY29tcGlsZXI6OmVtaXRfdnNfY29weV9pbWdfdG9fbWVtKCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyBtcmYgPQorICAgICAgICByZXR5cGUoYnJ3X21lc3NhZ2VfcmVnKGJhc2VfbXJmKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworICAgIGludCBtcmZfb2Zmc2V0ID0gMDsKKyAgICBib29sIHVzZV9oZWFkZXI7CisgICAgZW51bSBvcGNvZGUgb3Bfd3JpdGU7CisgICAgaW50IG9wX3Nsb3RfY291bnQsIGk7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1I4X1RPX01FTToKKyAgICAgICAgb3Bfd3JpdGUgPSBTSEFERVJfT1BDT0RFX0JZVEVfU0NBVFRFUkVEX1dSSVRFOworICAgICAgICBvcF9zbG90X2NvdW50ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1IxNl9UT19NRU06CisgICAgICAgIG9wX3dyaXRlID0gU0hBREVSX09QQ09ERV9CWVRFX1NDQVRURVJFRF9XUklURTsKKyAgICAgICAgb3Bfc2xvdF9jb3VudCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMzJfVE9fTUVNOgorICAgICAgICBvcF93cml0ZSA9IFNIQURFUl9PUENPREVfRFdPUkRfU0NBVFRFUkVEX1dSSVRFOworICAgICAgICBvcF9zbG90X2NvdW50ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1IzMkczMl9UT19NRU06CisgICAgICAgIG9wX3dyaXRlID0gU0hBREVSX09QQ09ERV9EV09SRF9TQ0FUVEVSRURfV1JJVEU7CisgICAgICAgIG9wX3Nsb3RfY291bnQgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyQjMyQTMyX1RPX01FTToKKyAgICAgICAgb3Bfd3JpdGUgPSBTSEFERVJfT1BDT0RFX0RXT1JEX1NDQVRURVJFRF9XUklURTsKKyAgICAgICAgb3Bfc2xvdF9jb3VudCA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9wX3dyaXRlID0gU0hBREVSX09QQ09ERV9EV09SRF9TQ0FUVEVSRURfV1JJVEU7CisgICAgICAgIG9wX3Nsb3RfY291bnQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIW9wX3Nsb3RfY291bnQgfHwgKGJydy0+Z2VuID09IDYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3dyaXRlID09IFNIQURFUl9PUENPREVfQllURV9TQ0FUVEVSRURfV1JJVEUpKSB7CisgICAgICAgIGVtaXRfdXJiX3dyaXRlX2VvdChiYXNlX21yZik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBsb2FkIGltYWdlIHRleGVsICovCisgICAgZW1pdF9tb3YodGVtcHNbMF0sIHZpZCk7CisgICAgZW1pdF9tb3YodGVtcHNbMV0sIGRzdF9leHRlbnRfd2lkdGgpOworICAgIGVtaXRfaXJlbSh0ZW1wc1syXSwgdGVtcHNbMF0sIHRlbXBzWzFdKTsKKyAgICBlbWl0X2lkaXYodGVtcHNbM10sIHRlbXBzWzBdLCB0ZW1wc1sxXSk7CisgICAgaWYgKGJydy0+Z2VuID49IDcpIHsKKyAgICAgICAgZW1pdF9hZGQob2Zmc2V0KG1yZiwgMCksIHZlYzEoc3JjX29mZnNldF94KSwgdmVjMSh0ZW1wc1syXSkpOworICAgICAgICBlbWl0X21vdihvZmZzZXQobXJmLCAyKSwgYnJ3X2ltbV91ZCgwKSk7CisgICAgICAgIGVtaXRfYWRkKG9mZnNldChtcmYsIDQpLCB2ZWMxKHNyY19vZmZzZXRfeSksIHZlYzEodGVtcHNbM10pKTsKKyAgICAgICAgbXJmX29mZnNldCA9IDY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW1pdF9hZGQob2Zmc2V0KG1yZiwgMCksIHZlYzEoc3JjX29mZnNldF94KSwgdmVjMSh0ZW1wc1syXSkpOworICAgICAgICBlbWl0X2FkZChvZmZzZXQobXJmLCAyKSwgdmVjMShzcmNfb2Zmc2V0X3kpLCB2ZWMxKHRlbXBzWzNdKSk7CisgICAgICAgIG1yZl9vZmZzZXQgPSA0OworICAgIH0KKyAgICBlbWl0X3RleHR1cmVfbG9va3VwKHZlYzEodGV4ZWxzWzBdKSwgU0hBREVSX09QQ09ERV9UWEYsIGJhc2VfbXJmLCBtcmZfb2Zmc2V0KTsKKworICAgIG1yZl9vZmZzZXQgPSAwOworICAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICAgIHVzZV9oZWFkZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbWl0X21vdl84KG9mZnNldChtcmYsIG1yZl9vZmZzZXQpLCByMCk7CisgICAgICAgIG1yZl9vZmZzZXQgKz0gMTsKKworICAgICAgICB1c2VfaGVhZGVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBvZmZzZXRzICovCisgICAgaWYgKG9wX3Nsb3RfY291bnQgPT0gMSkgeworICAgICAgICBlbWl0X2FkZF84KG9mZnNldCh2ZWMxKG1yZiksIG1yZl9vZmZzZXQpLCBkc3RfbWVtX29mZnNldCwgdmlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbWl0X211bF84KHZlYzEodGVtcHNbMF0pLCB2aWQsIGJyd19pbW1fdWQob3Bfc2xvdF9jb3VudCkpOworICAgICAgICBlbWl0X2FkZF84KHZlYzEodGVtcHNbMF0pLCBkc3RfbWVtX29mZnNldCwgdmVjMSh0ZW1wc1swXSkpOworCisgICAgICAgIGVtaXRfbW92Xzgob2Zmc2V0KHZlYzEobXJmKSwgbXJmX29mZnNldCksIHZlYzEodGVtcHNbMF0pKTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG9wX3Nsb3RfY291bnQ7IGkrKykgeworICAgICAgICAgICAgZW1pdF9hZGRfOChzdWJvZmZzZXQob2Zmc2V0KHZlYzEobXJmKSwgbXJmX29mZnNldCksIGkpLAorICAgICAgICAgICAgICAgICAgICB2ZWMxKHRlbXBzWzBdKSwgYnJ3X2ltbV91ZChpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbXJmX29mZnNldCArPSAxOworCisgICAgLyogdmFsdWVzICovCisgICAgaWYgKGlkID09IElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjE2X1RPX01FTSkgeworICAgICAgICBlbWl0X21vdihzdWJvZmZzZXQob2Zmc2V0KHZlYzEobXJmKSwgbXJmX29mZnNldCksIDApLAorICAgICAgICAgICAgICAgIHZlYzEodGV4ZWxzWzBdKSk7CisgICAgICAgIGVtaXRfc2hyKHN1Ym9mZnNldChvZmZzZXQodmVjMShtcmYpLCBtcmZfb2Zmc2V0KSwgMSksCisgICAgICAgICAgICAgICAgdmVjMSh0ZXhlbHNbMF0pLCBicndfaW1tX3VkKDgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3Bfc2xvdF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBlbWl0X21vdl84KHN1Ym9mZnNldChvZmZzZXQodmVjMShtcmYpLCBtcmZfb2Zmc2V0KSwgaSksCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCh2ZWMxKHRleGVsc1swXSksIDIgKiBpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbXJmX29mZnNldCArPSAxOworCisgICAgZW1pdF9zY2F0dGVyZWRfd3JpdGUob3Bfd3JpdGUsIHZlYzEobXJmKSwgYmFzZV9tcmYsIG1yZl9vZmZzZXQsCisgICAgICAgICAgICBvcF9zbG90X2NvdW50LCB1c2VfaGVhZGVyKTsKKworICAgIGVtaXRfdXJiX3dyaXRlX2VvdChiYXNlX21yZik7Cit9CisKK3ZvaWQgaW50ZWxfbWV0YV9jb21waWxlcjo6ZW1pdF9jb3B5X21lbSgpCit7CisgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgbXJmID0KKyAgICAgICAgcmV0eXBlKGJyd19tZXNzYWdlX3JlZyhiYXNlX21yZiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgIGVtaXRfY29tcHV0ZV9mcmFnX2Nvb3JkKCk7CisgICAgZW1pdF9hZGQobXJmLCBmcmFnX3gsIHNyY19vZmZzZXRfeCk7CisgICAgZW1pdF90ZXh0dXJlX2xvb2t1cCh0ZXhlbHNbMF0sIFNIQURFUl9PUENPREVfVFhGLCBiYXNlX21yZiwgMik7CisKKyAgICBlbWl0X21vdihvZmZzZXQobXJmLCAwKSwgb2Zmc2V0KHRleGVsc1swXSwgMCkpOworICAgIGVtaXRfbW92KG9mZnNldChtcmYsIDIpLCBvZmZzZXQodGV4ZWxzWzBdLCAyKSk7CisgICAgZW1pdF9tb3Yob2Zmc2V0KG1yZiwgNCksIG9mZnNldCh0ZXhlbHNbMF0sIDQpKTsKKyAgICBlbWl0X21vdihvZmZzZXQobXJmLCA2KSwgb2Zmc2V0KHRleGVsc1swXSwgNikpOworICAgIGVtaXRfcmVuZGVyX3RhcmdldF93cml0ZShtcmYsIGJhc2VfbXJmLCA4LCBmYWxzZSk7Cit9CisKK3ZvaWQgaW50ZWxfbWV0YV9jb21waWxlcjo6ZW1pdF9jb3B5X2ltZygpCit7CisgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgbXJmID0KKyAgICAgICAgcmV0eXBlKGJyd19tZXNzYWdlX3JlZyhiYXNlX21yZiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKyAgICBlbnVtIHNhbXBsZXJfcGFyYW0gcGFyYW1zWzhdOworICAgIHVpbnQzMl90IHBhcmFtX2NvdW50ID0gMDsKKworICAgIGlmIChicnctPmdlbiA+PSA3KSB7CisgICAgICAgIHBhcmFtc1twYXJhbV9jb3VudCsrXSA9IFNBTVBMRVJfUEFSQU1fWDsKKyAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9MT0Q7CisKKyAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMUQ6CisgICAgICAgICAgICBwYXJhbXNbcGFyYW1fY291bnQrK10gPSBTQU1QTEVSX1BBUkFNX1pFUk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFEX0FSUkFZOgorICAgICAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9MQVlFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkQ6CisgICAgICAgICAgICBwYXJhbXNbcGFyYW1fY291bnQrK10gPSBTQU1QTEVSX1BBUkFNX1k7CisgICAgICAgICAgICBwYXJhbXNbcGFyYW1fY291bnQrK10gPSBTQU1QTEVSX1BBUkFNX1pFUk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX0FSUkFZOgorICAgICAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9ZOworICAgICAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9MQVlFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkRfTVM6CisgICAgICAgICAgICAvKiBUT0RPICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9YOworCisgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFEOgorICAgICAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9aRVJPOworICAgICAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9IT0xFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRF9BUlJBWToKKyAgICAgICAgICAgIHBhcmFtc1twYXJhbV9jb3VudCsrXSA9IFNBTVBMRVJfUEFSQU1fTEFZRVI7CisgICAgICAgICAgICBwYXJhbXNbcGFyYW1fY291bnQrK10gPSBTQU1QTEVSX1BBUkFNX1pFUk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEOgorICAgICAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9ZOworICAgICAgICAgICAgcGFyYW1zW3BhcmFtX2NvdW50KytdID0gU0FNUExFUl9QQVJBTV9aRVJPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9BUlJBWToKKyAgICAgICAgICAgIHBhcmFtc1twYXJhbV9jb3VudCsrXSA9IFNBTVBMRVJfUEFSQU1fWTsKKyAgICAgICAgICAgIHBhcmFtc1twYXJhbV9jb3VudCsrXSA9IFNBTVBMRVJfUEFSQU1fTEFZRVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX01TOgorICAgICAgICAgICAgLyogVE9ETyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtc1twYXJhbV9jb3VudCsrXSA9IFNBTVBMRVJfUEFSQU1fTE9EOworICAgIH0KKworICAgIGVtaXRfY29tcHV0ZV9mcmFnX2Nvb3JkKCk7CisgICAgZW1pdF9zYW1wbGVyX3BheWxvYWQobXJmLCBwYXJhbXMsIHBhcmFtX2NvdW50KTsKKyAgICBlbWl0X3RleHR1cmVfbG9va3VwKHRleGVsc1swXSwgU0hBREVSX09QQ09ERV9UWEYsCisgICAgICAgICAgICBiYXNlX21yZiwgcGFyYW1fY291bnQgKiAyKTsKKworICAgIGVtaXRfbW92KG9mZnNldChtcmYsIDApLCBvZmZzZXQodGV4ZWxzWzBdLCAwKSk7CisgICAgZW1pdF9tb3Yob2Zmc2V0KG1yZiwgMiksIG9mZnNldCh0ZXhlbHNbMF0sIDIpKTsKKyAgICBlbWl0X21vdihvZmZzZXQobXJmLCA0KSwgb2Zmc2V0KHRleGVsc1swXSwgNCkpOworICAgIGVtaXRfbW92KG9mZnNldChtcmYsIDYpLCBvZmZzZXQodGV4ZWxzWzBdLCA2KSk7CisgICAgZW1pdF9yZW5kZXJfdGFyZ2V0X3dyaXRlKG1yZiwgYmFzZV9tcmYsIDEwLCBmYWxzZSk7Cit9CisKK3ZvaWQgaW50ZWxfbWV0YV9jb21waWxlcjo6ZW1pdF9jb3B5X21lbV90b19pbWcoKQoreworICAgIGNvbnN0IHN0cnVjdCBicndfcmVnIG1yZiA9CisgICAgICAgIHJldHlwZShicndfbWVzc2FnZV9yZWcoYmFzZV9tcmYpLCBCUldfUkVHSVNURVJfVFlQRV9VRCk7CisKKyAgICBlbWl0X2NvbXB1dGVfZnJhZ19jb29yZCgpOworICAgIGVtaXRfYWRkKHRlbXBzWzBdLCBmcmFnX3ksIHNyY19vZmZzZXRfeSk7CisgICAgZW1pdF9hZGQodGVtcHNbMV0sIGZyYWdfeCwgc3JjX29mZnNldF94KTsKKworICAgIC8qIGNvbnZlcnQgKHgsIHkpIHRvIGxpbmVhciBvZmZzZXQgKi8KKyAgICBlbWl0X211bCh0ZW1wc1syXSwgdGVtcHNbMF0sIGRzdF9leHRlbnRfd2lkdGgpOworICAgIGVtaXRfYWRkKG1yZiwgdGVtcHNbMl0sIHRlbXBzWzFdKTsKKyAgICBlbWl0X3RleHR1cmVfbG9va3VwKHRleGVsc1swXSwgU0hBREVSX09QQ09ERV9UWEYsIGJhc2VfbXJmLCAyKTsKKworICAgIGVtaXRfbW92KG9mZnNldChtcmYsIDApLCBvZmZzZXQodGV4ZWxzWzBdLCAwKSk7CisgICAgZW1pdF9tb3Yob2Zmc2V0KG1yZiwgMiksIG9mZnNldCh0ZXhlbHNbMF0sIDIpKTsKKyAgICBlbWl0X21vdihvZmZzZXQobXJmLCA0KSwgb2Zmc2V0KHRleGVsc1swXSwgNCkpOworICAgIGVtaXRfbW92KG9mZnNldChtcmYsIDYpLCBvZmZzZXQodGV4ZWxzWzBdLCA2KSk7CisgICAgZW1pdF9yZW5kZXJfdGFyZ2V0X3dyaXRlKG1yZiwgYmFzZV9tcmYsIDgsIGZhbHNlKTsKK30KKwordm9pZCBpbnRlbF9tZXRhX2NvbXBpbGVyOjplbWl0X2NsZWFyX2NvbG9yKCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYnJ3X3JlZyBtcmYgPQorICAgICAgICByZXR5cGUoYnJ3X21lc3NhZ2VfcmVnKGJhc2VfbXJmKSwgQlJXX1JFR0lTVEVSX1RZUEVfVUQpOworCisgICAgZW1pdF9tb3Yob2Zmc2V0KG1yZiwgMCksIGNsZWFyX3ZhbHNbMF0pOworICAgIGVtaXRfbW92KG9mZnNldChtcmYsIDIpLCBjbGVhcl92YWxzWzFdKTsKKyAgICBlbWl0X21vdihvZmZzZXQobXJmLCA0KSwgY2xlYXJfdmFsc1syXSk7CisgICAgZW1pdF9tb3Yob2Zmc2V0KG1yZiwgNiksIGNsZWFyX3ZhbHNbM10pOworICAgIGVtaXRfcmVuZGVyX3RhcmdldF93cml0ZShtcmYsIGJhc2VfbXJmLCA4LCBmYWxzZSk7Cit9CisKK3ZvaWQgaW50ZWxfbWV0YV9jb21waWxlcjo6ZW1pdF9jbGVhcl9kZXB0aCgpCit7CisgICAgY29uc3Qgc3RydWN0IGJyd19yZWcgbXJmID0KKyAgICAgICAgcmV0eXBlKGJyd19tZXNzYWdlX3JlZyhiYXNlX21yZiksIEJSV19SRUdJU1RFUl9UWVBFX1VEKTsKKworICAgIC8qIHNraXAgY29sb3IgYW5kIHdyaXRlIG9EZXB0aCBvbmx5ICovCisgICAgZW1pdF9tb3Yob2Zmc2V0KG1yZiwgOCksIGNsZWFyX3ZhbHNbMF0pOworICAgIGVtaXRfcmVuZGVyX3RhcmdldF93cml0ZShtcmYsIGJhc2VfbXJmLCAxMCwgZmFsc2UpOworfQorCit2b2lkICppbnRlbF9tZXRhX2NvbXBpbGVyOjpjb2RlZ2VuKHVpbnQzMl90ICpjb2RlX3NpemUpCit7CisgICAgY29uc3QgdW5zaWduZWQgKnByb2c7CisgICAgdW5zaWduZWQgcHJvZ19zaXplOworICAgIHZvaWQgKmNvZGU7CisKKyAgICBwcm9nID0gZ2V0X3Byb2dyYW0oJnByb2dfc2l6ZSwgc3RkZXJyKTsKKworICAgIGNvZGUgPSBpbnRlbF9hbGxvYyhncHUsIHByb2dfc2l6ZSwgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0RFVklDRSk7CisgICAgaWYgKCFjb2RlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1lbWNweShjb2RlLCBwcm9nLCBwcm9nX3NpemUpOworICAgIGlmIChjb2RlX3NpemUpCisgICAgICAgICpjb2RlX3NpemUgPSBwcm9nX3NpemU7CisKKyAgICByZXR1cm4gY29kZTsKK30KKwordm9pZCAqaW50ZWxfbWV0YV9jb21waWxlcjo6Y29tcGlsZShicndfYmxvcnBfcHJvZ19kYXRhICpwcm9nX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb2RlX3NpemUpCit7CisgICAgbWVtc2V0KHByb2dfZGF0YSwgMCwgc2l6ZW9mKCpwcm9nX2RhdGEpKTsKKyAgICBwcm9nX2RhdGEtPmZpcnN0X2N1cmJlX2dyZiA9IGJhc2VfZ3JmOworCisgICAgYWxsb2NfcmVncygpOworCisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfRklMTF9NRU06CisgICAgICAgIGVtaXRfdnNfZmlsbF9tZW0oKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfTUVNX1VOQUxJR05FRDoKKyAgICAgICAgZW1pdF92c19jb3B5X21lbSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjhfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMTZfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMzJfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMzJHMzJfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMzJHMzJCMzJBMzJfVE9fTUVNOgorICAgICAgICBlbWl0X3ZzX2NvcHlfaW1nX3RvX21lbSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfTUVNOgorICAgICAgICBlbWl0X2NvcHlfbWVtKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRDoKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMURfQVJSQVk6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9BUlJBWToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkRfTVM6CisgICAgICAgIGVtaXRfY29weV9pbWcoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFEX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMURfQVJSQVlfVE9fTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9UT19NRU06CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX0FSUkFZX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfMkRfTVNfVE9fTUVNOgorICAgICAgICBlbWl0X2NsZWFyX2NvbG9yKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ09QWV9NRU1fVE9fSU1HOgorICAgICAgICBlbWl0X2NvcHlfbWVtX3RvX2ltZygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX0NMRUFSX0NPTE9SOgorICAgICAgICBlbWl0X2NsZWFyX2NvbG9yKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ0xFQVJfREVQVEg6CisgICAgICAgIGVtaXRfY2xlYXJfZGVwdGgoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19SRVNPTFZFXzJYOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfUkVTT0xWRV80WDoKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX0ZTX1JFU09MVkVfOFg6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9GU19SRVNPTFZFXzE2WDoKKyAgICAgICAgZW1pdF9jbGVhcl9jb2xvcigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBlbWl0X2NsZWFyX2NvbG9yKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb2RlZ2VuKGNvZGVfc2l6ZSk7Cit9CisKK2V4dGVybiAiQyIgeworCitWa1Jlc3VsdCBpbnRlbF9waXBlbGluZV9zaGFkZXJfY29tcGlsZV9tZXRhKHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2Rldl9tZXRhX3NoYWRlciBpZCkKK3sKKyAgICBzdHJ1Y3QgYnJ3X2NvbnRleHQgKmJydyA9IGludGVsX2NyZWF0ZV9icndfY29udGV4dChncHUpOworCisgICAgaW50ZWxfbWV0YV9jb21waWxlciBjKGdwdSwgYnJ3LCBpZCk7CisgICAgYnJ3X2Jsb3JwX3Byb2dfZGF0YSBwcm9nX2RhdGE7CisKKyAgICBzaC0+cENvZGUgPSBjLmNvbXBpbGUoJnByb2dfZGF0YSwgJnNoLT5jb2RlU2l6ZSk7CisKKyAgICBzaC0+aW5fY291bnQgPSAwOworICAgIHNoLT5vdXRfY291bnQgPSAxOworICAgIHNoLT51c2VzID0gMDsKKyAgICBzaC0+c3VyZmFjZV9jb3VudCA9IEJSV19CTE9SUF9OVU1fQklORElOR19UQUJMRV9FTlRSSUVTOworICAgIHNoLT51cmJfZ3JmX3N0YXJ0ID0gcHJvZ19kYXRhLmZpcnN0X2N1cmJlX2dyZjsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0ZJTExfTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9NRU06CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTV9VTkFMSUdORUQ6CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1I4X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjE2X1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyX1RPX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyRzMyQjMyQTMyX1RPX01FTToKKyAgICAgICAgc2gtPmluX2NvdW50ID0gMTsKKyAgICAgICAgc2gtPnVzZXMgfD0gSU5URUxfU0hBREVSX1VTRV9WSUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVWX01FVEFfRlNfQ0xFQVJfREVQVEg6CisgICAgICAgIHNoLT51c2VzIHw9IElOVEVMX0NPTVBVVEVEX0RFUFRIX01PREVfT047CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJhbGxvY19mcmVlKGJydy0+c2hhZGVyX3Byb2cpOworICAgIHJhbGxvY19mcmVlKGJydyk7CisKKyAgICByZXR1cm4gKHNoLT5wQ29kZSkgPyBWS19TVUNDRVNTIDogVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworfQorCit9IC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvLmdpdGlnbm9yZSBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzcyMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorZ2xzbF9jb21waWxlcgorZ2xzbF9sZXhlci5jcHAKK2dsc2xfcGFyc2VyLmNwcAorZ2xzbF9wYXJzZXIuaAorZ2xzbF9wYXJzZXIub3V0cHV0CitnbHNsX3Rlc3QKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvUkVBRE1FIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyYjU4OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvUkVBRE1FCkBAIC0wLDAgKzEsMjI4IEBACitXZWxjb21lIHRvIE1lc2EncyBHTFNMIGNvbXBpbGVyLiAgQSBicmllZiBvdmVydmlldyBvZiBob3cgdGhpbmdzIGZsb3c6CisKKzEpIGxleCBhbmQgeWFjYy1iYXNlZCBwcmVwcm9jZXNzb3IgdGFrZXMgdGhlIGluY29taW5nIHNoYWRlciBzdHJpbmcKK2FuZCBwcm9kdWNlcyBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgcHJlcHJvY2Vzc2VkIHNoYWRlci4gIFRoaXMKK3Rha2VzIGNhcmUgb2YgdGhpbmdzIGxpa2UgI2lmLCAjaWZkZWYsICNkZWZpbmUsIGFuZCBwcmVwcm9jZXNzb3IgbWFjcm8KK2ludm9jYXRpb25zLiAgTm90ZSB0aGF0ICN2ZXJzaW9uLCAjZXh0ZW5zaW9uLCBhbmQgc29tZSBvdGhlcnMgYXJlCitwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaC4gIFNlZSBnbGNwcC8qCisKKzIpIGxleCBhbmQgeWFjYy1iYXNlZCBwYXJzZXIgdGFrZXMgdGhlIHByZXByb2Nlc3NlZCBzdHJpbmcgYW5kCitnZW5lcmF0ZXMgdGhlIEFTVCAoYWJzdHJhY3Qgc3ludGF4IHRyZWUpLiAgQWxtb3N0IG5vIGNoZWNraW5nIGlzCitwZXJmb3JtZWQgaW4gdGhpcyBzdGFnZS4gIFNlZSBnbHNsX2xleGVyLmxwcCBhbmQgZ2xzbF9wYXJzZXIueXBwLgorCiszKSBUaGUgQVNUIGlzIGNvbnZlcnRlZCB0byAiSElSIi4gIFRoaXMgaXMgdGhlIGludGVybWVkaWF0ZQorcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbXBpbGVyLiAgQ29uc3RydWN0b3JzIGFyZSBnZW5lcmF0ZWQsIGZ1bmN0aW9uCitjYWxscyBhcmUgcmVzb2x2ZWQgdG8gcGFydGljdWxhciBmdW5jdGlvbiBzaWduYXR1cmVzLCBhbmQgYWxsIHRoZQorc2VtYW50aWMgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiAgU2VlIGFzdF8qLmNwcCBmb3IgdGhlIGNvbnZlcnNpb24sIGFuZAoraXIuaCBmb3IgdGhlIElSIHN0cnVjdHVyZXMuCisKKzQpIFRoZSBkcml2ZXIgKE1lc2EsIG9yIG1haW4uY3BwIGZvciB0aGUgc3RhbmRhbG9uZSBiaW5hcnkpIHBlcmZvcm1zCitvcHRpbWl6YXRpb25zLiAgVGhlc2UgaW5jbHVkZSBjb3B5IHByb3BhZ2F0aW9uLCBkZWFkIGNvZGUgZWxpbWluYXRpb24sCitjb25zdGFudCBmb2xkaW5nLCBhbmQgb3RoZXJzLiAgR2VuZXJhbGx5IHRoZSBkcml2ZXIgd2lsbCBjYWxsCitvcHRpbWl6YXRpb25zIGluIGEgbG9vcCwgYXMgZWFjaCBtYXkgb3BlbiB1cCBvcHBvcnR1bml0aWVzIGZvciBvdGhlcgorb3B0aW1pemF0aW9ucyB0byBkbyBhZGRpdGlvbmFsIHdvcmsuICBTZWUgbW9zdCBmaWxlcyBjYWxsZWQgaXJfKi5jcHAKKworNSkgbGlua2luZyBpcyBwZXJmb3JtZWQuICBUaGlzIGRvZXMgY2hlY2tpbmcgdG8gZW5zdXJlIHRoYXQgdGhlCitvdXRwdXRzIG9mIHRoZSB2ZXJ0ZXggc2hhZGVyIG1hdGNoIHRoZSBpbnB1dHMgb2YgdGhlIGZyYWdtZW50IHNoYWRlciwKK2FuZCBhc3NpZ25zIGxvY2F0aW9ucyB0byB1bmlmb3JtcywgYXR0cmlidXRlcywgYW5kIHZhcnlpbmdzLiAgU2VlCitsaW5rZXIuY3BwLgorCis2KSBUaGUgZHJpdmVyIG1heSBwZXJmb3JtIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uIGF0IHRoaXMgcG9pbnQsIGFzCitmb3IgZXhhbXBsZSBkZWFkIGNvZGUgZWxpbWluYXRpb24gcHJldmlvdXNseSBjb3VsZG4ndCByZW1vdmUgZnVuY3Rpb25zCitvciBnbG9iYWwgdmFyaWFibGUgdXNhZ2Ugd2hlbiB3ZSBkaWRuJ3Qga25vdyB3aGF0IG90aGVyIGNvZGUgd291bGQgYmUKK2xpbmtlZCBpbi4KKworNykgVGhlIGRyaXZlciBwZXJmb3JtcyBjb2RlIGdlbmVyYXRpb24gb3V0IG9mIHRoZSBJUiwgdGFraW5nIGEgbGlua2VkCitzaGFkZXIgcHJvZ3JhbSBhbmQgcHJvZHVjaW5nIGEgY29tcGlsZWQgcHJvZ3JhbSBmb3IgZWFjaCBzdGFnZS4gIFNlZQoraXJfdG9fbWVzYS5jcHAgZm9yIE1lc2EgSVIgY29kZSBnZW5lcmF0aW9uLgorCitGQVE6CisKK1E6IFdoYXQgaXMgSElSIHZlcnN1cyBJUiB2ZXJzdXMgTElSPworCitBOiBUaGUgaWRlYSBiZWhpbmQgdGhlIG5hbWluZyB3YXMgdGhhdCBhc3RfdG9faGlyIHdvdWxkIHByb2R1Y2UgYQoraGlnaC1sZXZlbCBJUiAoIkhJUiIpLCB3aXRoIHRoaW5ncyBsaWtlIG1hdHJpeCBvcGVyYXRpb25zLCBzdHJ1Y3R1cmUKK2Fzc2lnbm1lbnRzLCBldGMuLCBwcmVzZW50LiAgQSBzZXJpZXMgb2YgbG93ZXJpbmcgcGFzc2VzIHdvdWxkIG9jY3VyCit0aGF0IGRvIHRoaW5ncyBsaWtlIGJyZWFrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiBpbnRvIGEgc2VyaWVzIG9mIGRvdAorcHJvZHVjdHMvTUFEcywgbWFrZSBzdHJ1Y3R1cmUgYXNzaWdubWVudCBiZSBhIHNlcmllcyBvZiBhc3NpZ25tZW50IG9mCitjb21wb25lbnRzLCBmbGF0dGVuIGlmIHN0YXRlbWVudHMgaW50byBjb25kaXRpb25hbCBtb3ZlcywgYW5kIHN1Y2gsCitwcm9kdWNpbmcgYSBsb3cgbGV2ZWwgSVIgKCJMSVIiKS4KKworSG93ZXZlciwgaXQgbm93IGFwcGVhcnMgdGhhdCBlYWNoIGRyaXZlciB3aWxsIGhhdmUgZGlmZmVyZW50CityZXF1aXJlbWVudHMgZnJvbSBhIExJUi4gIEEgOTE1LWdlbmVyYXRpb24gY2hpcHNldCB3YW50cyBhbGwgZnVuY3Rpb25zCitpbmxpbmVkLCBhbGwgbG9vcHMgdW5yb2xsZWQsIGFsbCBpZnMgZmxhdHRlbmVkLCBubyB2YXJpYWJsZSBhcnJheQorYWNjZXNzZXMsIGFuZCBtYXRyaXggbXVsdGlwbGljYXRpb24gYnJva2VuIGRvd24uICBUaGUgTWVzYSBJUiBiYWNrZW5kCitmb3Igc3dyYXN0IHdvdWxkIGxpa2UgbWF0cmljZXMgYW5kIHN0cnVjdHVyZSBhc3NpZ25tZW50IGJyb2tlbiBkb3duLAorYnV0IGl0IGNhbiBzdXBwb3J0IGZ1bmN0aW9uIGNhbGxzIGFuZCBkeW5hbWljIGJyYW5jaGluZy4gIEEgOTY1IHZlcnRleAorc2hhZGVyIElSIGJhY2tlbmQgY291bGQgcG90ZW50aWFsbHkgZXZlbiBoYW5kbGUgc29tZSBtYXRyaXggb3BlcmF0aW9ucword2l0aG91dCBicmVha2luZyB0aGVtIGRvd24sIGJ1dCB0aGUgOTY1IGZyYWdtZW50IHNoYWRlciBJUiBiYWNrZW5kCit3b3VsZCB3YW50IHRvIGJyZWFrIHRvIGhhdmUgKGFsbW9zdCkgYWxsIG9wZXJhdGlvbnMgZG93biBjaGFubmVsLXdpc2UKK2FuZCBwZXJmb3JtIG9wdGltaXphdGlvbiBvbiB0aGF0LiAgQXMgYSByZXN1bHQsIHRoZXJlJ3Mgbm8gc2luZ2xlCitsb3ctbGV2ZWwgSVIgdGhhdCB3aWxsIG1ha2UgZXZlcnlvbmUgaGFwcHkuICBTbyB0aGF0IHVzYWdlIGhhcyBmYWxsZW4KK291dCBvZiBmYXZvciwgYW5kIGVhY2ggZHJpdmVyIHdpbGwgcGVyZm9ybSBhIHNlcmllcyBvZiBsb3dlcmluZyBwYXNzZXMKK3RvIHRha2UgdGhlIEhJUiBkb3duIHRvIHdoYXRldmVyIHJlc3RyaWN0aW9ucyBpdCB3YW50cyB0byBpbXBvc2UKK2JlZm9yZSBkb2luZyBjb2RlZ2VuLgorCitROiBIb3cgaXMgdGhlIElSIHN0cnVjdHVyZWQ/CisKK0E6IFRoZSBiZXN0IHdheSB0byBnZXQgc3RhcnRlZCBzZWVpbmcgaXQgd291bGQgYmUgdG8gcnVuIHRoZQorc3RhbmRhbG9uZSBjb21waWxlciBhZ2FpbnN0IGEgc2hhZGVyOgorCisuL2dsc2xfY29tcGlsZXIgLS1kdW1wLWxpciBcCisJfi9zcmMvcGlnbGl0L3Rlc3RzL3NoYWRlcnMvZ2xzbC1vcmFuZ2Vib29rLWNoMDYtYnVtcC5mcmFnCisKK1NvIGZvciBleGFtcGxlIG9uZSBvZiB0aGUgaXJfaW5zdHJ1Y3Rpb25zIGluIG1haW4oKSBjb250YWluczoKKworKGFzc2lnbiAoY29uc3RhbnQgYm9vbCAoMSkpICh2YXJfcmVmIGxpdENvbG9yKSAgKGV4cHJlc3Npb24gdmVjMyAqICh2YXJfcmVmIFN1cmYKK2FjZUNvbG9yKSAodmFyX3JlZiBfX3JldHZhbCkgKSApCisKK09yIG1vcmUgdmlzdWFsbHk6CisgICAgICAgICAgICAgICAgICAgICAoYXNzaWduKQorICAgICAgICAgICAgICAgICAvICAgICAgIHwgICAgICAgIFwKKyAgICAgICAgKHZhcl9yZWYpICAoZXhwcmVzc2lvbiAqKSAgKGNvbnN0YW50IGJvb2wgMSkKKyAgICAgICAgIC8gICAgICAgICAgLyAgICAgICAgICAgXAorKGxpdENvbG9yKSAgICAgICh2YXJfcmVmKSAgICAodmFyX3JlZikKKyAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIChTdXJmYWNlQ29sb3IpICAgICAgICAgIChfX3JldHZhbCkKKword2hpY2ggY2FtZSBmcm9tOgorCitsaXRDb2xvciA9IFN1cmZhY2VDb2xvciAqIG1heChkb3Qobm9ybURlbHRhLCBMaWdodERpciksIDAuMCk7CisKKyh0aGUgbWF4IGNhbGwgaXMgbm90IHJlcHJlc2VudGVkIGluIHRoaXMgZXhwcmVzc2lvbiB0cmVlLCBhcyBpdCB3YXMgYQorZnVuY3Rpb24gY2FsbCB0aGF0IGdvdCBpbmxpbmVkIGJ1dCBub3QgYnJvdWdodCBpbnRvIHRoaXMgZXhwcmVzc2lvbgordHJlZSkKKworRWFjaCBvZiB0aG9zZSBub2RlcyBpcyBhIHN1YmNsYXNzIG9mIGlyX2luc3RydWN0aW9uLiAgQSBwYXJ0aWN1bGFyCitpcl9pbnN0cnVjdGlvbiBpbnN0YW5jZSBtYXkgb25seSBhcHBlYXIgb25jZSBpbiB0aGUgd2hvbGUgSVIgdHJlZSB3aXRoCit0aGUgZXhjZXB0aW9uIG9mIGlyX3ZhcmlhYmxlcywgd2hpY2ggYXBwZWFyIG9uY2UgYXMgdmFyaWFibGUKK2RlY2xhcmF0aW9uczoKKworKGRlY2xhcmUgKCkgdmVjMyBub3JtRGVsdGEpCisKK2FuZCBtdWx0aXBsZSB0aW1lcyBhcyB0aGUgdGFyZ2V0cyBvZiB2YXJpYWJsZSBkZXJlZmVyZW5jZXM6CisuLi4KKyhhc3NpZ24gKGNvbnN0YW50IGJvb2wgKDEpKSAodmFyX3JlZiBfX3JldHZhbCkgKGV4cHJlc3Npb24gZmxvYXQgZG90CisgKHZhcl9yZWYgbm9ybURlbHRhKSAodmFyX3JlZiBMaWdodERpcikgKSApCisuLi4KKyhhc3NpZ24gKGNvbnN0YW50IGJvb2wgKDEpKSAodmFyX3JlZiBfX3JldHZhbCkgKGV4cHJlc3Npb24gdmVjMyAtCisgKHZhcl9yZWYgTGlnaHREaXIpIChleHByZXNzaW9uIHZlYzMgKiAoY29uc3RhbnQgZmxvYXQgKDIuMDAwMDAwKSkKKyAoZXhwcmVzc2lvbiB2ZWMzICogKGV4cHJlc3Npb24gZmxvYXQgZG90ICh2YXJfcmVmIG5vcm1EZWx0YSkgKHZhcl9yZWYKKyBMaWdodERpcikgKSAodmFyX3JlZiBub3JtRGVsdGEpICkgKSApICkKKy4uLgorCitFYWNoIG5vZGUgaGFzIGEgdHlwZS4gIEV4cHJlc3Npb25zIG1heSBpbnZvbHZlIHNldmVyYWwgZGlmZmVyZW50IHR5cGVzOgorKGRlY2xhcmUgKHVuaWZvcm0gKSBtYXQ0IGdsX01vZGVsVmlld01hdHJpeCkKKygoYXNzaWduIChjb25zdGFudCBib29sICgxKSkgKHZhcl9yZWYgY29uc3RydWN0b3JfdG1wKSAoZXhwcmVzc2lvbgorIHZlYzQgKiAodmFyX3JlZiBnbF9Nb2RlbFZpZXdNYXRyaXgpICh2YXJfcmVmIGdsX1ZlcnRleCkgKSApCisKK0FuIGV4cHJlc3Npb24gdHJlZSBjYW4gYmUgYXJiaXRyYXJpbHkgZGVlcCwgYW5kIHRoZSBjb21waWxlciB0cmllcyB0bwora2VlcCB0aGVtIHN0cnVjdHVyZWQgbGlrZSB0aGF0IHNvIHRoYXQgdGhpbmdzIGxpa2UgYWxnZWJyYWljCitvcHRpbWl6YXRpb25zICgoY29sb3IgKiAxLjAgPT0gY29sb3IpIGFuZCAoKG1hdDEgKiBtYXQyKSAqIHZlYyA9PSBtYXQxCisqIChtYXQyICogdmVjKSkpIG9yIHJlY29nbml6aW5nIG9wZXJhdGlvbiBwYXR0ZXJucyBmb3IgY29kZSBnZW5lcmF0aW9uCisodmVjMSAqIHZlYzIgKyB2ZWMzID09IG1hZCh2ZWMxLCB2ZWMyLCB2ZWMzKSkgYXJlIGVhc2llci4gIFRoaXMgY29tZXMKK2F0IHRoZSBleHBlbnNlIG9mIGFkZGl0aW9uYWwgdHJpY2tlcnkgaW4gaW1wbGVtZW50aW5nIHNvbWUKK29wdGltaXphdGlvbnMgbGlrZSBDU0Ugd2hlcmUgb25lIG11c3QgbmF2aWdhdGUgYW4gZXhwcmVzc2lvbiB0cmVlLgorCitROiBXaHkgbm8gU1NBIHJlcHJlc2VudGF0aW9uPworCitBOiBDb252ZXJ0aW5nIGFuIElSIHRyZWUgdG8gU1NBIGZvcm0gbWFrZXMgZGVhZCBjb2RlIGVsbWltaW5hdGlvbiwKK2NvbW1vbiBzdWJleHByZXNzaW9uIGVsaW1pbmF0aW9uLCBhbmQgbWFueSBvdGhlciBvcHRpbWl6YXRpb25zIG11Y2gKK2Vhc2llci4gIEhvd2V2ZXIsIGluIG91ciBwcmltYXJpbHkgdmVjdG9yLWJhc2VkIGxhbmd1YWdlLCB0aGVyZSdzIHNvbWUKK21ham9yIHF1ZXN0aW9ucyBhcyB0byBob3cgaXQgd291bGQgd29yay4gIERvIHdlIGRvIFNTQSBvbiB0aGUgc2NhbGFyCitvciB2ZWN0b3IgbGV2ZWw/ICBJZiB3ZSBkbyBpdCBhdCB0aGUgdmVjdG9yIGxldmVsLCB3ZSdyZSBnb2luZyB0byBlbmQKK3VwIHdpdGggbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHZhcmlhYmxlIHdoZW4gZW5jb3VudGVyaW5nIGNvZGUKK2xpa2U6CisKKyhhc3NpZ24gKGNvbnN0YW50IGJvb2wgKDEpKSAoc3dpeiB4ICh2YXJfcmVmIF9fcmV0dmFsKSApICh2YXJfcmVmIGEpICkgCisoYXNzaWduIChjb25zdGFudCBib29sICgxKSkgKHN3aXogeSAodmFyX3JlZiBfX3JldHZhbCkgKSAodmFyX3JlZiBiKSApIAorKGFzc2lnbiAoY29uc3RhbnQgYm9vbCAoMSkpIChzd2l6IHogKHZhcl9yZWYgX19yZXR2YWwpICkgKHZhcl9yZWYgYykgKSAKKworSWYgZXZlcnkgbWFza2VkIHVwZGF0ZSBvZiBhIGNvbXBvbmVudCByZWxpZXMgb24gdGhlIHByZXZpb3VzIHZhbHVlIG9mCit0aGUgdmFyaWFibGUsIHRoZW4gd2UncmUgcHJvYmFibHkgZ29pbmcgdG8gYmUgcXVpdGUgbGltaXRlZCBpbiBvdXIKK2RlYWQgY29kZSBlbGltaW5hdGlvbiB3aW5zLCBhbmQgcmVjb2duaXppbmcgY29tbW9uIGV4cHJlc3Npb25zIG1heQoranVzdCBub3QgaGFwcGVuLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIG9wZXJhdGUgY2hhbm5lbC13aXNlLCB0aGVuCit3ZSdsbCBiZSBwcm9uZSB0byBvcHRpbWl6aW5nIHRoZSBvcGVyYXRpb24gb24gb25lIG9mIHRoZSBjaGFubmVscyBhdAordGhlIGV4cGVuc2Ugb2YgbWFraW5nIGl0cyBpbnN0cnVjdGlvbiBmbG93IGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlcgorY2hhbm5lbHMsIGFuZCBhIHZlY3Rvci1iYXNlZCBHUFUgd291bGQgZW5kIHVwIHdpdGggd29yc2UgY29kZSB0aGFuIGlmCit3ZSBkaWRuJ3Qgb3B0aW1pemUgb3BlcmF0aW9ucyBvbiB0aGF0IGNoYW5uZWwhCisKK09uY2UgYWdhaW4sIGl0IGFwcGVhcnMgdGhhdCBvdXIgb3B0aW1pemF0aW9uIHJlcXVpcmVtZW50cyBhcmUgZHJpdmVuCitzaWduaWZpY2FudGx5IGJ5IHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgRm9yIG5vdywgdGFyZ2V0aW5nIHRoZSBNZXNhCitJUiBiYWNrZW5kLCBTU0EgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHRoYXQgaW1wb3J0YW50IHRvIHByb2R1Y2luZworZXhjZWxsZW50IGNvZGUsIGJ1dCB3ZSBkbyBleHBlY3QgdG8gZG8gc29tZSBTU0EtYmFzZWQgb3B0aW1pemF0aW9ucworZm9yIHRoZSA5NjUgZnJhZ21lbnQgc2hhZGVyIGJhY2tlbmQgd2hlbiB0aGF0IGlzIGRldmVsb3BlZC4KKworUTogSG93IHNob3VsZCBJIGV4cGFuZCBpbnN0cnVjdGlvbnMgdGhhdCB0YWtlIG11bHRpcGxlIGJhY2tlbmQgaW5zdHJ1Y3Rpb25zPworCitTb21ldGltZXMgeW91J2xsIGhhdmUgdG8gZG8gdGhlIGV4cGFuc2lvbiBpbiB5b3VyIGNvZGUgZ2VuZXJhdGlvbiAtLQorc2VlLCBmb3IgZXhhbXBsZSwgaXJfdG9fbWVzYS5jcHAncyBoYW5kbGluZyBvZiBpcl91bm9wX3NxcnQuICBIb3dldmVyLAoraW4gbWFueSBjYXNlcyB5b3UnbGwgd2FudCB0byBkbyBhIHBhc3Mgb3ZlciB0aGUgSVIgdG8gY29udmVydAorbm9uLW5hdGl2ZSBpbnN0cnVjdGlvbnMgdG8gYSBzZXJpZXMgb2YgbmF0aXZlIGluc3RydWN0aW9ucy4gIEZvcgorZXhhbXBsZSwgZm9yIHRoZSBNZXNhIGJhY2tlbmQgd2UgaGF2ZSBpcl9kaXZfdG9fbXVsX3JjcC5jcHAgYmVjYXVzZQorTWVzYSBJUiAoYW5kIG1hbnkgaGFyZHdhcmUgYmFja2VuZHMpIG9ubHkgaGF2ZSBhIHJlY2lwcm9jYWwKK2luc3RydWN0aW9uLCBub3QgYSBkaXZpZGUuICBJbXBsZW1lbnRpbmcgbm9uLW5hdGl2ZSBpbnN0cnVjdGlvbnMgdGhpcword2F5IGdpdmVzIHRoZSBjaGFuY2UgZm9yIGNvbnN0YW50IGZvbGRpbmcgdG8gb2NjdXIsIHNvIChhIC8gMi4wKQorYmVjb21lcyAoYSAqIDAuNSkgYWZ0ZXIgY29kZWdlbiBpbnN0ZWFkIG9mIChhICogKDEuMCAvIDIuMCkpCisKK1E6IEhvdyBzaG91ZCBJIGhhbmRsZSBteSBzcGVjaWFsIGhhcmR3YXJlIGluc3RydWN0aW9ucyB3aXRoIHJlc3BlY3QgdG8gSVI/CisKK091ciBjdXJyZW50IHRoZW9yeSBpcyB0aGF0IGlmIG11bHRpcGxlIHRhcmdldHMgaGF2ZSBhbiBpbnN0cnVjdGlvbiBmb3IKK3NvbWUgb3BlcmF0aW9uLCB0aGVuIHdlIHNob3VsZCBwcm9iYWJseSBiZSBhYmxlIHRvIHJlcHJlc2VudCB0aGF0IGluCit0aGUgSVIuICBHZW5lcmFsbHkgdGhpcyBpcyBpbiB0aGUgZm9ybSBvZiBhbiBpcl97YmluLHVufW9wIGV4cHJlc3Npb24KK3R5cGUuICBGb3IgZXhhbXBsZSwgd2UgaW5pdGlhbGx5IGltcGxlbWVudGVkIGZyYWN0KCkgdXNpbmcgKGEgLQorZmxvb3IoYSkpLCBidXQgYm90aCA5NDUgYW5kIDk2NSBoYXZlIGluc3RydWN0aW9ucyB0byBnaXZlIHRoYXQgcmVzdWx0LAorYW5kIGl0IHdvdWxkIGFsc28gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIG1vZCgpLCBzbworaXJfdW5vcF9mcmFjdCB3YXMgYWRkZWQuICBUaGUgZm9sbG93aW5nIGFyZWFzIG5lZWQgdXBkYXRpbmcgdG8gYWRkIGEKK25ldyBleHByZXNzaW9uIHR5cGU6CisKK2lyLmggKG5ldyBlbnVtKQoraXIuY3BwOm9wZXJhdG9yX3N0cnMgKHVzZWQgZm9yIGlyX3JlYWRlcikKK2lyX2NvbnN0YW50X2V4cHJlc3Npb24uY3BwICh5b3UgcHJvYmFibHkgd2FudCB0byBiZSBhYmxlIHRvIGNvbnN0YW50IGZvbGQpCitpcl92YWxpZGF0ZS5jcHAgKGNoZWNrIHVzZXJzIGhhdmUgdGhlIHJpZ2h0IHR5cGVzKQorCitZb3UgbWF5IGFsc28gbmVlZCB0byB1cGRhdGUgdGhlIGJhY2tlbmRzIGlmIHRoZXkgd2lsbCBzZWUgdGhlIG5ldyBleHByIHR5cGU6CisKKy4uL21lc2Evc2hhZGVycy9pcl90b19tZXNhLmNwcAorCitZb3UgY2FuIHRoZW4gdXNlIHRoZSBuZXcgZXhwcmVzc2lvbiBmcm9tIGJ1aWx0aW5zIChpZiBhbGwgYmFja2VuZHMKK3dvdWxkIHJhdGhlciBzZWUgaXQpLCBvciBzY2FuIHRoZSBJUiBhbmQgY29udmVydCB0byB1c2UgeW91ciBuZXcKK2V4cHJlc3Npb24gdHlwZSAoc2VlIGlyX21vZF90b19mcmFjdCwgZm9yIGV4YW1wbGUpLgorCitROiBIb3cgaXMgbWVtb3J5IG1hbmFnZW1lbnQgaGFuZGxlZCBpbiB0aGUgY29tcGlsZXI/CisKK1RoZSBoaWVyYXJjaGljYWwgbWVtb3J5IGFsbG9jYXRvciAidGFsbG9jIiBkZXZlbG9wZWQgZm9yIHRoZSBTYW1iYQorcHJvamVjdCBpcyB1c2VkLCBzbyB0aGF0IHRoaW5ncyBsaWtlIG9wdGltaXphdGlvbiBwYXNzZXMgZG9uJ3QgaGF2ZSB0bword29ycnkgYWJvdXQgdGhlaXIgZ2FyYmFnZSBjb2xsZWN0aW9uIHNvIG11Y2guICBJdCBoYXMgYSBmZXcgbmljZQorZmVhdHVyZXMsIGluY2x1ZGluZyBsb3cgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgYW5kIGdvb2QgZGVidWdnaW5nCitzdXBwb3J0IHRoYXQncyB0cml2aWFsbHkgYXZhaWxhYmxlLgorCitHZW5lcmFsbHksIGVhY2ggc3RhZ2Ugb2YgdGhlIGNvbXBpbGUgY3JlYXRlcyBhIHRhbGxvYyBjb250ZXh0IGFuZAorYWxsb2NhdGVzIGl0cyBtZW1vcnkgb3V0IG9mIHRoYXQgb3IgY2hpbGRyZW4gb2YgaXQuICBBdCB0aGUgZW5kIG9mIHRoZQorc3RhZ2UsIHRoZSBwaWVjZXMgc3RpbGwgbGl2ZSBhcmUgc3RvbGVuIHRvIGEgbmV3IGNvbnRleHQgYW5kIHRoZSBvbGQKK29uZSBmcmVlZCwgb3IgdGhlIHdob2xlIGNvbnRleHQgaXMga2VwdCBmb3IgdXNlIGJ5IHRoZSBuZXh0IHN0YWdlLgorCitGb3IgSVIgdHJhbnNmb3JtYXRpb25zLCBhIHRlbXBvcmFyeSBjb250ZXh0IGlzIHVzZWQsIHRoZW4gYXQgdGhlIGVuZAorb2YgYWxsIHRyYW5zZm9ybWF0aW9ucywgcmVwYXJlbnRfaXIgcmVwYXJlbnRzIGFsbCBsaXZlIG5vZGVzIHVuZGVyIHRoZQorc2hhZGVyJ3MgSVIgbGlzdCwgYW5kIHRoZSBvbGQgY29udGV4dCBmdWxsIG9mIGRlYWQgbm9kZXMgaXMgZnJlZWQuCitXaGVuIGRldmVsb3BpbmcgYSBzaW5nbGUgSVIgdHJhbnNmb3JtYXRpb24gcGFzcywgdGhpcyBtZWFucyB0aGF0IHlvdQord2FudCB0byBhbGxvY2F0ZSBpbnN0cnVjdGlvbiBub2RlcyBvdXQgb2YgdGhlIHRlbXBvcmFyeSBjb250ZXh0LCBzbyBpZgoraXQgYmVjb21lcyBkZWFkIGl0IGRvZXNuJ3QgbGl2ZSBvbiBhcyB0aGUgY2hpbGQgb2YgYSBsaXZlIG5vZGUuICBBdAordGhlIG1vbWVudCwgb3B0aW1pemF0aW9uIHBhc3NlcyBhcmVuJ3QgcGFzc2VkIHRoYXQgdGVtcG9yYXJ5IGNvbnRleHQsCitzbyB0aGV5IGZpbmQgaXQgYnkgY2FsbGluZyB0YWxsb2NfcGFyZW50KCkgb24gYSBuZWFyYnkgSVIgbm9kZS4gIFRoZQordGFsbG9jX3BhcmVudCgpIGNhbGwgaXMgZXhwZW5zaXZlLCBzbyBtYW55IHBhc3NlcyB3aWxsIGNhY2hlIHRoZQorcmVzdWx0IG9mIHRoZSBmaXJzdCB0YWxsb2NfcGFyZW50KCkuICBDbGVhbmluZyB1cCBhbGwgdGhlIG9wdGltaXphdGlvbgorcGFzc2VzIHRvIHRha2UgYSBjb250ZXh0IGFyZ3VtZW50IGFuZCBub3QgY2FsbCB0YWxsb2NfcGFyZW50KCkgaXMgbGVmdAorYXMgYW4gZXhlcmNpc2UuCisKK1E6IFdoYXQgaXMgdGhlIGZpbGUgbmFtaW5nIGNvbnZlbnRpb24gaW4gdGhpcyBkaXJlY3Rvcnk/CisKK0luaXRpYWxseSwgdGhlcmUgcmVhbGx5IHdhc24ndCBvbmUuICBXZSBoYXZlIHNpbmNlIGFkb3B0ZWQgb25lOgorCisgLSBGaWxlcyB0aGF0IGltcGxlbWVudCBjb2RlIGxvd2VyaW5nIHBhc3NlcyBzaG91bGQgYmUgbmFtZWQgbG93ZXJfKgorICAgKGUuZy4sIGxvd2VyX25vaXNlLmNwcCkuCisgLSBGaWxlcyB0aGF0IGltcGxlbWVudCBvcHRpbWl6YXRpb24gcGFzc2VzIHNob3VsZCBiZSBuYW1lZCBvcHRfKi4KKyAtIEZpbGVzIHRoYXQgaW1wbGVtZW50IGEgY2xhc3MgdGhhdCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGNvZGUgc2hvdWxkCisgICB0YWtlIHRoZSBuYW1lIG9mIHRoYXQgY2xhc3MgKGUuZy4sIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yLmNwcCkuCisgLSBGaWxlcyB0aGF0IGNvbnRhaW4gY29kZSBub3QgZml0dGluZyBpbiBvbmUgb2YgdGhlIHByZXZpb3VzCisgICBjYXRlZ29yaWVzIHNob3VsZCBoYXZlIGEgc2Vuc2libGUgbmFtZSAoZS5nLiwgZ2xzbF9wYXJzZXIueXBwKS4KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvVE9ETyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDA3N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9UT0RPCkBAIC0wLDAgKzEsMTIgQEAKKy0gRGV0ZWN0IGNvZGUgcGF0aHMgaW4gbm9uLXZvaWQgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgcmVhY2ggYSByZXR1cm4gc3RhdGVtZW50CisKKy0gSW1wcm92ZSBoYW5kbGluZyBvZiBjb25zdGFudHMgYW5kIHRoZWlyIGluaXRpYWxpemVycy4gIENvbnN0YW50IGluaXRpYWxpemVycworICBzaG91bGQgbmV2ZXIgZ2VuZXJhdGUgYW55IGNvZGUuICBUaGlzIGlzIHRyaXZhbCBmb3Igc2NhbGFyIGNvbnN0YW50cy4gIEl0IGlzCisgIGFsc28gdHJpdmlhbCBmb3IgYXJyYXlzLCBtYXRyaWNlcywgYW5kIHZlY3RvcnMgdGhhdCBhcmUgYWNjZXNzZWQgd2l0aAorICBjb25zdGFudCBpbmRleCB2YWx1ZXMuICBGb3Igb3RoZXJzIGl0IGlzIG1vcmUgY29tcGxpY2F0ZWQuICBQZXJoYXBzIHRoZXNlCisgIGNhc2VzIHNob3VsZCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gdW5pZm9ybXM/CisKKy0gVHJhY2sgc291cmNlIGxvY2F0aW9ucyB0aHJvdWdob3V0IHRoZSBJUi4gIFRoZXJlIGFyZSBjdXJyZW50bHkgc2V2ZXJhbAorICBwbGFjZXMgd2hlcmUgd2UgY2Fubm90IGVtaXQgbGluZSBudW1iZXJzIGZvciBlcnJvcnMgKGFuZCBjdXJyZW50bHkgZW1pdCAwOjApCisgIGJlY2F1c2Ugd2UndmUgImxvc3QiIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgcGFydGljdWxhcmx5CisgIG5vdGljZWFibGUgYXQgbGluayB0aW1lLgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9hc3QuaCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxMzZmNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0LmgKQEAgLTAsMCArMSwxMTI0IEBACisvKiAtKi0gYysrIC0qLSAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBBU1RfSAorI2RlZmluZSBBU1RfSAorCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgImdsc2xfcGFyc2VyX2V4dHJhcy5oIgorCitzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTsKKworc3RydWN0IFlZTFRZUEU7CisKKy8qKgorICogXGRlZmdyb3VwIEFTVCBBYnN0cmFjdCBzeW50YXggdHJlZSBub2RlIGRlZmluaXRpb25zCisgKgorICogQW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIuICBUaGlzIGlzIGEgZmFpcmx5CisgKiBkaXJlY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYW1tYSBkZXJpdmF0aW9uIGZvciB0aGUgc291cmNlIHByb2dyYW0uCisgKiBObyBzeW1hbnRpYyBjaGVja2luZyBpcyBkb25lIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgQVNULiAgT25seQorICogc3ludGFjdGljIGNoZWNraW5nIGlzIGRvbmUuICBTeW1hbnRpYyBjaGVja2luZyBpcyBwZXJmb3JtZWQgYnkgYSBsYXRlcgorICogc3RhZ2UgdGhhdCBjb252ZXJ0cyB0aGUgQVNUIHRvIGEgbW9yZSBnZW5lcmljIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbi4KKyAqCisgKkB7CisgKi8KKy8qKgorICogQmFzZSBjbGFzcyBvZiBhbGwgYWJzdHJhY3Qgc3ludGF4IHRyZWUgbm9kZXMKKyAqLworY2xhc3MgYXN0X25vZGUgeworcHVibGljOgorICAgREVDTEFSRV9SQUxMT0NfQ1hYX09QRVJBVE9SUyhhc3Rfbm9kZSk7CisKKyAgIC8qKgorICAgICogUHJpbnQgYW4gQVNUIG5vZGUgaW4gc29tZXRoaW5nIGFwcHJveGltYXRpbmcgdGhlIG9yaWdpbmFsIEdMU0wgY29kZQorICAgICovCisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIC8qKgorICAgICogQ29udmVydCB0aGUgQVNUIG5vZGUgdG8gdGhlIGhpZ2gtbGV2ZWwgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uCisgICAgKi8KKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKKyAgIC8qKgorICAgICogUmV0cmlldmUgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiBhbiBBU1Qgbm9kZQorICAgICoKKyAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWQgdG8gZ2V0IHRoZSBzb3VyY2UgcG9zaXRpb24gb2YgYW4gQVNUIG5vZGUKKyAgICAqIGludG8gYSBmb3JtIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBcYyBfbWVzYV9nbHNsX2Vycm9yLgorICAgICoKKyAgICAqIFxzYSBfbWVzYV9nbHNsX2Vycm9yLCBhc3Rfbm9kZTo6c2V0X2xvY2F0aW9uCisgICAgKi8KKyAgIHN0cnVjdCBZWUxUWVBFIGdldF9sb2NhdGlvbih2b2lkKSBjb25zdAorICAgeworICAgICAgc3RydWN0IFlZTFRZUEUgbG9jcDsKKworICAgICAgbG9jcC5zb3VyY2UgPSB0aGlzLT5sb2NhdGlvbi5zb3VyY2U7CisgICAgICBsb2NwLmZpcnN0X2xpbmUgPSB0aGlzLT5sb2NhdGlvbi5maXJzdF9saW5lOworICAgICAgbG9jcC5maXJzdF9jb2x1bW4gPSB0aGlzLT5sb2NhdGlvbi5maXJzdF9jb2x1bW47CisgICAgICBsb2NwLmxhc3RfbGluZSA9IHRoaXMtPmxvY2F0aW9uLmxhc3RfbGluZTsKKyAgICAgIGxvY3AubGFzdF9jb2x1bW4gPSB0aGlzLT5sb2NhdGlvbi5sYXN0X2NvbHVtbjsKKworICAgICAgcmV0dXJuIGxvY3A7CisgICB9CisKKyAgIC8qKgorICAgICogU2V0IHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgYW4gQVNUIG5vZGUgZnJvbSBhIHBhcnNlciBsb2NhdGlvbgorICAgICoKKyAgICAqIFxzYSBhc3Rfbm9kZTo6Z2V0X2xvY2F0aW9uCisgICAgKi8KKyAgIHZvaWQgc2V0X2xvY2F0aW9uKGNvbnN0IHN0cnVjdCBZWUxUWVBFICZsb2NwKQorICAgeworICAgICAgdGhpcy0+bG9jYXRpb24uc291cmNlID0gbG9jcC5zb3VyY2U7CisgICAgICB0aGlzLT5sb2NhdGlvbi5maXJzdF9saW5lID0gbG9jcC5maXJzdF9saW5lOworICAgICAgdGhpcy0+bG9jYXRpb24uZmlyc3RfY29sdW1uID0gbG9jcC5maXJzdF9jb2x1bW47CisgICAgICB0aGlzLT5sb2NhdGlvbi5sYXN0X2xpbmUgPSBsb2NwLmxhc3RfbGluZTsKKyAgICAgIHRoaXMtPmxvY2F0aW9uLmxhc3RfY29sdW1uID0gbG9jcC5sYXN0X2NvbHVtbjsKKyAgIH0KKworICAgLyoqCisgICAgKiBTZXQgdGhlIHNvdXJjZSBsb2NhdGlvbiByYW5nZSBvZiBhbiBBU1Qgbm9kZSB1c2luZyB0d28gbG9jYXRpb24gbm9kZXMKKyAgICAqCisgICAgKiBcc2EgYXN0X25vZGU6OnNldF9sb2NhdGlvbgorICAgICovCisgICB2b2lkIHNldF9sb2NhdGlvbl9yYW5nZShjb25zdCBzdHJ1Y3QgWVlMVFlQRSAmYmVnaW4sIGNvbnN0IHN0cnVjdCBZWUxUWVBFICZlbmQpCisgICB7CisgICAgICB0aGlzLT5sb2NhdGlvbi5zb3VyY2UgPSBiZWdpbi5zb3VyY2U7CisgICAgICB0aGlzLT5sb2NhdGlvbi5maXJzdF9saW5lID0gYmVnaW4uZmlyc3RfbGluZTsKKyAgICAgIHRoaXMtPmxvY2F0aW9uLmxhc3RfbGluZSA9IGVuZC5sYXN0X2xpbmU7CisgICAgICB0aGlzLT5sb2NhdGlvbi5maXJzdF9jb2x1bW4gPSBiZWdpbi5maXJzdF9jb2x1bW47CisgICAgICB0aGlzLT5sb2NhdGlvbi5sYXN0X2NvbHVtbiA9IGVuZC5sYXN0X2NvbHVtbjsKKyAgIH0KKworICAgLyoqCisgICAgKiBTb3VyY2UgbG9jYXRpb24gb2YgdGhlIEFTVCBub2RlLgorICAgICovCisgICBzdHJ1Y3QgeworICAgICAgdW5zaWduZWQgc291cmNlOyAgICAgICAgICAvKio8IEdMU0wgc291cmNlIG51bWJlci4gKi8KKyAgICAgIHVuc2lnbmVkIGZpcnN0X2xpbmU7ICAgICAgLyoqPCBGaXJzdCBsaW5lIG51bWJlciB3aXRoaW4gdGhlIHNvdXJjZSBzdHJpbmcuICovCisgICAgICB1bnNpZ25lZCBmaXJzdF9jb2x1bW47ICAgIC8qKjwgRmlyc3QgY29sdW1uIGluIHRoZSBmaXJzdCBsaW5lLiAqLworICAgICAgdW5zaWduZWQgbGFzdF9saW5lOyAgICAgICAvKio8IExhc3QgbGluZSBudW1iZXIgd2l0aGluIHRoZSBzb3VyY2Ugc3RyaW5nLiAqLworICAgICAgdW5zaWduZWQgbGFzdF9jb2x1bW47ICAgICAvKio8IExhc3QgY29sdW1uIGluIHRoZSBsYXN0IGxpbmUuICovCisgICB9IGxvY2F0aW9uOworCisgICBleGVjX25vZGUgbGluazsKKworcHJvdGVjdGVkOgorICAgLyoqCisgICAgKiBUaGUgb25seSBjb25zdHJ1Y3RvciBpcyBwcm90ZWN0ZWQgc28gdGhhdCBvbmx5IGRlcml2ZWQgY2xhc3Mgb2JqZWN0cyBjYW4KKyAgICAqIGJlIGNyZWF0ZWQuCisgICAgKi8KKyAgIGFzdF9ub2RlKHZvaWQpOworfTsKKworCisvKioKKyAqIE9wZXJhdG9ycyBmb3IgQVNUIGV4cHJlc3Npb24gbm9kZXMuCisgKi8KK2VudW0gYXN0X29wZXJhdG9ycyB7CisgICBhc3RfYXNzaWduLAorICAgYXN0X3BsdXMsICAgICAgICAvKio8IFVuYXJ5ICsgb3BlcmF0b3IuICovCisgICBhc3RfbmVnLAorICAgYXN0X2FkZCwKKyAgIGFzdF9zdWIsCisgICBhc3RfbXVsLAorICAgYXN0X2RpdiwKKyAgIGFzdF9tb2QsCisgICBhc3RfbHNoaWZ0LAorICAgYXN0X3JzaGlmdCwKKyAgIGFzdF9sZXNzLAorICAgYXN0X2dyZWF0ZXIsCisgICBhc3RfbGVxdWFsLAorICAgYXN0X2dlcXVhbCwKKyAgIGFzdF9lcXVhbCwKKyAgIGFzdF9uZXF1YWwsCisgICBhc3RfYml0X2FuZCwKKyAgIGFzdF9iaXRfeG9yLAorICAgYXN0X2JpdF9vciwKKyAgIGFzdF9iaXRfbm90LAorICAgYXN0X2xvZ2ljX2FuZCwKKyAgIGFzdF9sb2dpY194b3IsCisgICBhc3RfbG9naWNfb3IsCisgICBhc3RfbG9naWNfbm90LAorCisgICBhc3RfbXVsX2Fzc2lnbiwKKyAgIGFzdF9kaXZfYXNzaWduLAorICAgYXN0X21vZF9hc3NpZ24sCisgICBhc3RfYWRkX2Fzc2lnbiwKKyAgIGFzdF9zdWJfYXNzaWduLAorICAgYXN0X2xzX2Fzc2lnbiwKKyAgIGFzdF9yc19hc3NpZ24sCisgICBhc3RfYW5kX2Fzc2lnbiwKKyAgIGFzdF94b3JfYXNzaWduLAorICAgYXN0X29yX2Fzc2lnbiwKKworICAgYXN0X2NvbmRpdGlvbmFsLAorCisgICBhc3RfcHJlX2luYywKKyAgIGFzdF9wcmVfZGVjLAorICAgYXN0X3Bvc3RfaW5jLAorICAgYXN0X3Bvc3RfZGVjLAorICAgYXN0X2ZpZWxkX3NlbGVjdGlvbiwKKyAgIGFzdF9hcnJheV9pbmRleCwKKworICAgYXN0X2Z1bmN0aW9uX2NhbGwsCisKKyAgIGFzdF9pZGVudGlmaWVyLAorICAgYXN0X2ludF9jb25zdGFudCwKKyAgIGFzdF91aW50X2NvbnN0YW50LAorICAgYXN0X2Zsb2F0X2NvbnN0YW50LAorICAgYXN0X2Jvb2xfY29uc3RhbnQsCisKKyAgIGFzdF9zZXF1ZW5jZSwKKyAgIGFzdF9hZ2dyZWdhdGUKK307CisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYW55IHNvcnQgb2YgZXhwcmVzc2lvbi4KKyAqLworY2xhc3MgYXN0X2V4cHJlc3Npb24gOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgYXN0X2V4cHJlc3Npb24oaW50IG9wZXIsIGFzdF9leHByZXNzaW9uICosCisJCSAgYXN0X2V4cHJlc3Npb24gKiwgYXN0X2V4cHJlc3Npb24gKik7CisKKyAgIGFzdF9leHByZXNzaW9uKGNvbnN0IGNoYXIgKmlkZW50aWZpZXIpIDoKKyAgICAgIG9wZXIoYXN0X2lkZW50aWZpZXIpCisgICB7CisgICAgICBzdWJleHByZXNzaW9uc1swXSA9IE5VTEw7CisgICAgICBzdWJleHByZXNzaW9uc1sxXSA9IE5VTEw7CisgICAgICBzdWJleHByZXNzaW9uc1syXSA9IE5VTEw7CisgICAgICBwcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisgICAgICB0aGlzLT5ub25fbHZhbHVlX2Rlc2NyaXB0aW9uID0gTlVMTDsKKyAgIH0KKworICAgc3RhdGljIGNvbnN0IGNoYXIgKm9wZXJhdG9yX3N0cmluZyhlbnVtIGFzdF9vcGVyYXRvcnMgb3ApOworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICB2aXJ0dWFsIHZvaWQgaGlyX25vX3J2YWx1ZShleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKKyAgIGlyX3J2YWx1ZSAqZG9faGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19ydmFsdWUpOworCisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIGVudW0gYXN0X29wZXJhdG9ycyBvcGVyOworCisgICBhc3RfZXhwcmVzc2lvbiAqc3ViZXhwcmVzc2lvbnNbM107CisKKyAgIHVuaW9uIHsKKyAgICAgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXI7CisgICAgICBpbnQgaW50X2NvbnN0YW50OworICAgICAgZmxvYXQgZmxvYXRfY29uc3RhbnQ7CisgICAgICB1bnNpZ25lZCB1aW50X2NvbnN0YW50OworICAgICAgaW50IGJvb2xfY29uc3RhbnQ7CisgICB9IHByaW1hcnlfZXhwcmVzc2lvbjsKKworCisgICAvKioKKyAgICAqIExpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIGFuIFxjIGFzdF9zZXF1ZW5jZSBvciBwYXJhbWV0ZXJzIGZvciBhbgorICAgICogXGMgYXN0X2Z1bmN0aW9uX2NhbGwKKyAgICAqLworICAgZXhlY19saXN0IGV4cHJlc3Npb25zOworCisgICAvKioKKyAgICAqIEZvciB0aGluZ3MgdGhhdCBjYW4ndCBiZSBsLXZhbHVlcywgdGhpcyBkZXNjcmliZXMgd2hhdCBpdCBpcy4KKyAgICAqCisgICAgKiBUaGlzIHRleHQgaXMgdXNlZCBieSB0aGUgY29kZSB0aGF0IGdlbmVyYXRlcyBJUiBmb3IgYXNzaWdubWVudHMgdG8KKyAgICAqIGRldGVjdCBhbmQgZW1pdCB1c2VmdWwgbWVzc2FnZXMgZm9yIGFzc2lnbm1lbnRzIHRvIHNvbWUgdGhpbmdzIHRoYXQKKyAgICAqIGNhbid0IGJlIGwtdmFsdWVzLiAgRm9yIGV4YW1wbGUsIHByZS0gb3IgcG9zdC1pbmNlcmVtZW50IGV4cHJlc3Npb25zLgorICAgICoKKyAgICAqIFxub3RlCisgICAgKiBUaGlzIHBvaW50ZXIgbWF5IGJlIFxjIE5VTEwuCisgICAgKi8KKyAgIGNvbnN0IGNoYXIgKm5vbl9sdmFsdWVfZGVzY3JpcHRpb247Cit9OworCitjbGFzcyBhc3RfZXhwcmVzc2lvbl9iaW4gOiBwdWJsaWMgYXN0X2V4cHJlc3Npb24geworcHVibGljOgorICAgYXN0X2V4cHJlc3Npb25fYmluKGludCBvcGVyLCBhc3RfZXhwcmVzc2lvbiAqLCBhc3RfZXhwcmVzc2lvbiAqKTsKKworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworfTsKKworLyoqCisgKiBTdWJjbGFzcyBvZiBleHByZXNzaW9ucyBmb3IgZnVuY3Rpb24gY2FsbHMKKyAqLworY2xhc3MgYXN0X2Z1bmN0aW9uX2V4cHJlc3Npb24gOiBwdWJsaWMgYXN0X2V4cHJlc3Npb24geworcHVibGljOgorICAgYXN0X2Z1bmN0aW9uX2V4cHJlc3Npb24oYXN0X2V4cHJlc3Npb24gKmNhbGxlZSkKKyAgICAgIDogYXN0X2V4cHJlc3Npb24oYXN0X2Z1bmN0aW9uX2NhbGwsIGNhbGxlZSwKKwkJICAgICAgIE5VTEwsIE5VTEwpLAorCWNvbnMoZmFsc2UpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICBhc3RfZnVuY3Rpb25fZXhwcmVzc2lvbihjbGFzcyBhc3RfdHlwZV9zcGVjaWZpZXIgKnR5cGUpCisgICAgICA6IGFzdF9leHByZXNzaW9uKGFzdF9mdW5jdGlvbl9jYWxsLCAoYXN0X2V4cHJlc3Npb24gKikgdHlwZSwKKwkJICAgICAgIE5VTEwsIE5VTEwpLAorCWNvbnModHJ1ZSkKKyAgIHsKKyAgICAgIC8qIGVtcHR5ICovCisgICB9CisKKyAgIGJvb2wgaXNfY29uc3RydWN0b3IoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIGNvbnM7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKKyAgIHZpcnR1YWwgdm9pZCBoaXJfbm9fcnZhbHVlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworcHJpdmF0ZToKKyAgIC8qKgorICAgICogSXMgdGhpcyBmdW5jdGlvbiBjYWxsIGFjdHVhbGx5IGEgY29uc3RydWN0b3I/CisgICAgKi8KKyAgIGJvb2wgY29uczsKK307CisKK2NsYXNzIGFzdF9hcnJheV9zcGVjaWZpZXIgOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgLyoqIFVuc2l6ZWQgYXJyYXkgc3BlY2lmaWVyIChbXSkgKi8KKyAgIGV4cGxpY2l0IGFzdF9hcnJheV9zcGVjaWZpZXIoY29uc3Qgc3RydWN0IFlZTFRZUEUgJmxvY3ApCisgICAgIDogaXNfdW5zaXplZF9hcnJheSh0cnVlKQorICAgeworICAgICAgc2V0X2xvY2F0aW9uKGxvY3ApOworICAgfQorCisgICAvKiogU2l6ZWQgYXJyYXkgc3BlY2lmaWVyIChbZGltXSkgKi8KKyAgIGFzdF9hcnJheV9zcGVjaWZpZXIoY29uc3Qgc3RydWN0IFlZTFRZUEUgJmxvY3AsIGFzdF9leHByZXNzaW9uICpkaW0pCisgICAgIDogaXNfdW5zaXplZF9hcnJheShmYWxzZSkKKyAgIHsKKyAgICAgIHNldF9sb2NhdGlvbihsb2NwKTsKKyAgICAgIGFycmF5X2RpbWVuc2lvbnMucHVzaF90YWlsKCZkaW0tPmxpbmspOworICAgfQorCisgICB2b2lkIGFkZF9kaW1lbnNpb24oYXN0X2V4cHJlc3Npb24gKmRpbSkKKyAgIHsKKyAgICAgIGFycmF5X2RpbWVuc2lvbnMucHVzaF90YWlsKCZkaW0tPmxpbmspOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIC8qIElmIHRydWUsIHRoaXMgbWVhbnMgdGhhdCB0aGUgYXJyYXkgaGFzIGFuIHVuc2l6ZWQgb3V0ZXJtb3N0IGRpbWVuc2lvbi4gKi8KKyAgIGJvb2wgaXNfdW5zaXplZF9hcnJheTsKKworICAgLyogVGhpcyBsaXN0IGNvbnRhaW5zIG9iamVjdHMgb2YgdHlwZSBhc3Rfbm9kZSBjb250YWluaW5nIHRoZQorICAgICogc2l6ZWQgZGltZW5zaW9ucyBvbmx5LCBpbiBvdXRlcm1vc3QtdG8taW5uZXJtb3N0IG9yZGVyLgorICAgICovCisgICBleGVjX2xpc3QgYXJyYXlfZGltZW5zaW9uczsKK307CisKKy8qKgorICogQy1zdHlsZSBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24gY2xhc3MKKyAqCisgKiBSZXByZXNlbnRzIEMtc3R5bGUgaW5pdGlhbGl6ZXJzIG9mIHZlY3RvcnMsIG1hdHJpY2VzLCBhcnJheXMsIGFuZAorICogc3RydWN0dXJlcy4gRS5nLiwgdmVjMyBwb3MgPSB7MS4wLCAwLjAsIC0xLjB9IGlzIGVxdWl2YWxlbnQgdG8KKyAqIHZlYzMgcG9zID0gdmVjMygxLjAsIDAuMCwgLTEuMCkuCisgKgorICogU3BlY2lmaWVkIGluIEdMU0wgNC4yMCBhbmQgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjay4KKyAqCisgKiBcc2EgX21lc2FfYXN0X3NldF9hZ2dyZWdhdGVfdHlwZQorICovCitjbGFzcyBhc3RfYWdncmVnYXRlX2luaXRpYWxpemVyIDogcHVibGljIGFzdF9leHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgIGFzdF9hZ2dyZWdhdGVfaW5pdGlhbGl6ZXIoKQorICAgICAgOiBhc3RfZXhwcmVzc2lvbihhc3RfYWdncmVnYXRlLCBOVUxMLCBOVUxMLCBOVUxMKSwKKyAgICAgICAgY29uc3RydWN0b3JfdHlwZShOVUxMKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgLyoqCisgICAgKiBnbHNsX3R5cGUgb2YgdGhlIGFnZ3JlZ2F0ZSwgd2hpY2ggaXMgaW5mZXJyZWQgZnJvbSB0aGUgTEhTIG9mIHdoYXRldmVyCisgICAgKiB0aGUgYWdncmVnYXRlIGlzIGJlaW5nIHVzZWQgdG8gaW5pdGlhbGl6ZS4gIFRoaXMgY2FuJ3QgYmUgaW5mZXJyZWQgYXQKKyAgICAqIHBhcnNlIHRpbWUgKHNpbmNlIHRoZSBwYXJzZXIgZGVhbHMgd2l0aCBhc3RfdHlwZV9zcGVjaWZpZXJzLCBub3QKKyAgICAqIGdsc2xfdHlwZXMpLCBzbyB0aGUgcGFyc2VyIGxlYXZlcyBpdCBOVUxMLiAgSG93ZXZlciwgdGhlIGFzdC10by1oaXIKKyAgICAqIGNvbnZlcnNpb24gY29kZSBtYWtlcyBzdXJlIHRvIGZpbGwgaXQgaW4gd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICogYmVmb3JlIGhpcigpIGlzIGNhbGxlZC4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdHJ1Y3Rvcl90eXBlOworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICB2aXJ0dWFsIHZvaWQgaGlyX25vX3J2YWx1ZShleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7Cit9OworCisvKioKKyAqIE51bWJlciBvZiBwb3NzaWJsZSBvcGVyYXRvcnMgZm9yIGFuIGFzdF9leHByZXNzaW9uCisgKgorICogVGhpcyBpcyBkb25lIGFzIGEgZGVmaW5lIGluc3RlYWQgb2YgYXMgYW4gYWRkaXRpb25hbCB2YWx1ZSBpbiB0aGUgZW51bSBzbworICogdGhhdCB0aGUgY29tcGlsZXIgd29uJ3QgZ2VuZXJhdGUgc3B1cmlvdXMgbWVzc2FnZXMgbGlrZSAid2FybmluZzoKKyAqIGVudW1lcmF0aW9uIHZhbHVlIOKAmGFzdF9udW1fb3BlcmF0b3Jz4oCZIG5vdCBoYW5kbGVkIGluIHN3aXRjaCIKKyAqLworI2RlZmluZSBBU1RfTlVNX09QRVJBVE9SUyAoYXN0X3NlcXVlbmNlICsgMSkKKworCitjbGFzcyBhc3RfY29tcG91bmRfc3RhdGVtZW50IDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIGFzdF9jb21wb3VuZF9zdGF0ZW1lbnQoaW50IG5ld19zY29wZSwgYXN0X25vZGUgKnN0YXRlbWVudHMpOworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICBpbnQgbmV3X3Njb3BlOworICAgZXhlY19saXN0IHN0YXRlbWVudHM7Cit9OworCitjbGFzcyBhc3RfZGVjbGFyYXRpb24gOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgYXN0X2RlY2xhcmF0aW9uKGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgYXN0X2FycmF5X3NwZWNpZmllciAqYXJyYXlfc3BlY2lmaWVyLAorICAgICAgICAgICAgICAgICAgIGFzdF9leHByZXNzaW9uICppbml0aWFsaXplcik7CisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXI7CisKKyAgIGFzdF9hcnJheV9zcGVjaWZpZXIgKmFycmF5X3NwZWNpZmllcjsKKworICAgYXN0X2V4cHJlc3Npb24gKmluaXRpYWxpemVyOworfTsKKworCitlbnVtIHsKKyAgIGFzdF9wcmVjaXNpb25fbm9uZSA9IDAsIC8qKjwgQWJzZW5jZSBvZiBwcmVjaXNpb24gcXVhbGlmaWVyLiAqLworICAgYXN0X3ByZWNpc2lvbl9oaWdoLAorICAgYXN0X3ByZWNpc2lvbl9tZWRpdW0sCisgICBhc3RfcHJlY2lzaW9uX2xvdworfTsKKworc3RydWN0IGFzdF90eXBlX3F1YWxpZmllciB7CisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKGFzdF90eXBlX3F1YWxpZmllcik7CisKKyAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CisJIHVuc2lnbmVkIGludmFyaWFudDoxOworCSB1bnNpZ25lZCBjb25zdGFudDoxOworCSB1bnNpZ25lZCBhdHRyaWJ1dGU6MTsKKwkgdW5zaWduZWQgdmFyeWluZzoxOworCSB1bnNpZ25lZCBpbjoxOworCSB1bnNpZ25lZCBvdXQ6MTsKKwkgdW5zaWduZWQgY2VudHJvaWQ6MTsKKyAgICAgICAgIHVuc2lnbmVkIHNhbXBsZToxOworCSB1bnNpZ25lZCB1bmlmb3JtOjE7CisJIHVuc2lnbmVkIHNtb290aDoxOworCSB1bnNpZ25lZCBmbGF0OjE7CisJIHVuc2lnbmVkIG5vcGVyc3BlY3RpdmU6MTsKKworCSAvKiogXG5hbWUgTGF5b3V0IHF1YWxpZmllcnMgZm9yIEdMX0FSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucyAqLworCSAvKkB7Ki8KKwkgdW5zaWduZWQgb3JpZ2luX3VwcGVyX2xlZnQ6MTsKKwkgdW5zaWduZWQgcGl4ZWxfY2VudGVyX2ludGVnZXI6MTsKKwkgLypAfSovCisKKwkgLyoqCisJICAqIEZsYWcgc2V0IGlmIEdMX0FSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24gImxvY2F0aW9uIiBsYXlvdXQKKwkgICogcXVhbGlmaWVyIGlzIHVzZWQuCisJICAqLworCSB1bnNpZ25lZCBleHBsaWNpdF9sb2NhdGlvbjoxOworCSAvKioKKwkgICogRmxhZyBzZXQgaWYgR0xfQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbiAiaW5kZXgiIGxheW91dAorCSAgKiBxdWFsaWZpZXIgaXMgdXNlZC4KKwkgICovCisJIHVuc2lnbmVkIGV4cGxpY2l0X2luZGV4OjE7CisKKyAgICAgICAgIC8qKgorICAgICAgICAgICogRmxhZyBzZXQgaWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjayAiYmluZGluZyIgbGF5b3V0CisgICAgICAgICAgKiBxdWFsaWZpZXIgaXMgdXNlZC4KKyAgICAgICAgICAqLworICAgICAgICAgdW5zaWduZWQgZXhwbGljaXRfYmluZGluZzoxOworCisgICAgICAgICAvKioKKyAgICAgICAgICAqIEZsYWcgc2V0IGlmIEdMX0FSQl9zaGFkZXJfYXRvbWljIGNvdW50ZXIgIm9mZnNldCIgbGF5b3V0CisgICAgICAgICAgKiBxdWFsaWZpZXIgaXMgdXNlZC4KKyAgICAgICAgICAqLworICAgICAgICAgdW5zaWduZWQgZXhwbGljaXRfb2Zmc2V0OjE7CisKKyAgICAgICAgIC8qKiBcbmFtZSBMYXlvdXQgcXVhbGlmaWVycyBmb3IgR0xfQU1EX2NvbnNlcnZhdGl2ZV9kZXB0aCAqLworICAgICAgICAgLyoqIFx7ICovCisgICAgICAgICB1bnNpZ25lZCBkZXB0aF9hbnk6MTsKKyAgICAgICAgIHVuc2lnbmVkIGRlcHRoX2dyZWF0ZXI6MTsKKyAgICAgICAgIHVuc2lnbmVkIGRlcHRoX2xlc3M6MTsKKyAgICAgICAgIHVuc2lnbmVkIGRlcHRoX3VuY2hhbmdlZDoxOworICAgICAgICAgLyoqIFx9ICovCisKKwkgLyoqIFxuYW1lIExheW91dCBxdWFsaWZpZXJzIGZvciBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ICovCisJIC8qKiBceyAqLworICAgICAgICAgdW5zaWduZWQgc3RkMTQwOjE7CisgICAgICAgICB1bnNpZ25lZCBzaGFyZWQ6MTsKKyAgICAgICAgIHVuc2lnbmVkIHBhY2tlZDoxOworICAgICAgICAgdW5zaWduZWQgY29sdW1uX21ham9yOjE7CisgICAgICAgICB1bnNpZ25lZCByb3dfbWFqb3I6MTsKKwkgLyoqIFx9ICovCisKKwkgLyoqIFxuYW1lIExheW91dCBxdWFsaWZpZXJzIGZvciBHTFNMIDEuNTAgZ2VvbWV0cnkgc2hhZGVycyAqLworCSAvKiogXHsgKi8KKwkgdW5zaWduZWQgcHJpbV90eXBlOjE7CisJIHVuc2lnbmVkIG1heF92ZXJ0aWNlczoxOworCSAvKiogXH0gKi8KKworICAgICAgICAgLyoqCisgICAgICAgICAgKiBsb2NhbF9zaXplX3t4LHksen0gZmxhZ3MgZm9yIGNvbXB1dGUgc2hhZGVycy4gIEJpdCAwIHJlcHJlc2VudHMKKyAgICAgICAgICAqIGxvY2FsX3NpemVfeCwgYW5kIHNvIG9uLgorICAgICAgICAgICovCisgICAgICAgICB1bnNpZ25lZCBsb2NhbF9zaXplOjM7CisKKwkgLyoqIFxuYW1lIExheW91dCBhbmQgbWVtb3J5IHF1YWxpZmllcnMgZm9yIEFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZS4gKi8KKwkgLyoqIFx7ICovCisJIHVuc2lnbmVkIGVhcmx5X2ZyYWdtZW50X3Rlc3RzOjE7CisJIHVuc2lnbmVkIGV4cGxpY2l0X2ltYWdlX2Zvcm1hdDoxOworCSB1bnNpZ25lZCBjb2hlcmVudDoxOworCSB1bnNpZ25lZCBfdm9sYXRpbGU6MTsKKwkgdW5zaWduZWQgcmVzdHJpY3RfZmxhZzoxOworCSB1bnNpZ25lZCByZWFkX29ubHk6MTsgLyoqPCAicmVhZG9ubHkiIHF1YWxpZmllci4gKi8KKwkgdW5zaWduZWQgd3JpdGVfb25seToxOyAvKio8ICJ3cml0ZW9ubHkiIHF1YWxpZmllci4gKi8KKwkgLyoqIFx9ICovCisKKyAgICAgICAgIC8qKiBcbmFtZSBMYXlvdXQgcXVhbGlmaWVycyBmb3IgR0xfQVJCX2dwdV9zaGFkZXI1ICovCisgICAgICAgICAvKiogXHsgKi8KKyAgICAgICAgIHVuc2lnbmVkIGludm9jYXRpb25zOjE7CisgICAgICAgICAvKiogXH0gKi8KKyAgICAgIH0KKyAgICAgIC8qKiBcYnJpZWYgU2V0IG9mIGZsYWdzLCBhY2Nlc3NlZCBieSBuYW1lLiAqLworICAgICAgcTsKKworICAgICAgLyoqIFxicmllZiBTZXQgb2YgZmxhZ3MsIGFjY2Vzc2VkIGFzIGEgYml0bWFzay4gKi8KKyAgICAgIHVpbnQ2NF90IGk7CisgICB9IGZsYWdzOworCisgICAvKiogUHJlY2lzaW9uIG9mIHRoZSB0eXBlIChoaWdocC9tZWRpdW0vbG93cCkuICovCisgICB1bnNpZ25lZCBwcmVjaXNpb246MjsKKworICAgLyoqIEdlb21ldHJ5IHNoYWRlciBpbnZvY2F0aW9ucyBmb3IgR0xfQVJCX2dwdV9zaGFkZXI1LiAqLworICAgaW50IGludm9jYXRpb25zOworCisgICAvKioKKyAgICAqIExvY2F0aW9uIHNwZWNpZmllZCB2aWEgR0xfQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbiBsYXlvdXQKKyAgICAqCisgICAgKiBcbm90ZQorICAgICogVGhpcyBmaWVsZCBpcyBvbmx5IHZhbGlkIGlmIFxjIGV4cGxpY2l0X2xvY2F0aW9uIGlzIHNldC4KKyAgICAqLworICAgaW50IGxvY2F0aW9uOworICAgLyoqCisgICAgKiBJbmRleCBzcGVjaWZpZWQgdmlhIEdMX0FSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24gbGF5b3V0CisgICAgKgorICAgICogXG5vdGUKKyAgICAqIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCBpZiBcYyBleHBsaWNpdF9pbmRleCBpcyBzZXQuCisgICAgKi8KKyAgIGludCBpbmRleDsKKworICAgLyoqIE1heGltdW0gb3V0cHV0IHZlcnRpY2VzIGluIEdMU0wgMS41MCBnZW9tZXRyeSBzaGFkZXJzLiAqLworICAgaW50IG1heF92ZXJ0aWNlczsKKworICAgLyoqIElucHV0IG9yIG91dHB1dCBwcmltaXRpdmUgdHlwZSBpbiBHTFNMIDEuNTAgZ2VvbWV0cnkgc2hhZGVycyAqLworICAgR0xlbnVtIHByaW1fdHlwZTsKKworICAgLyoqCisgICAgKiBCaW5kaW5nIHNwZWNpZmllZCB2aWEgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjaydzICJiaW5kaW5nIiBrZXl3b3JkLgorICAgICoKKyAgICAqIFxub3RlCisgICAgKiBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgaWYgXGMgZXhwbGljaXRfYmluZGluZyBpcyBzZXQuCisgICAgKi8KKyAgIGludCBiaW5kaW5nOworCisgICAvKioKKyAgICAqIE9mZnNldCBzcGVjaWZpZWQgdmlhIEdMX0FSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXIncyAib2Zmc2V0IgorICAgICoga2V5d29yZC4KKyAgICAqCisgICAgKiBcbm90ZQorICAgICogVGhpcyBmaWVsZCBpcyBvbmx5IHZhbGlkIGlmIFxjIGV4cGxpY2l0X29mZnNldCBpcyBzZXQuCisgICAgKi8KKyAgIGludCBvZmZzZXQ7CisKKyAgIC8qKgorICAgICogTG9jYWwgc2l6ZSBzcGVjaWZpZWQgdmlhIEdMX0FSQl9jb21wdXRlX3NoYWRlcidzICJsb2NhbF9zaXplX3t4LHksen0iCisgICAgKiBsYXlvdXQgcXVhbGlmaWVyLiAgRWxlbWVudCBpIG9mIHRoaXMgYXJyYXkgaXMgb25seSB2YWxpZCBpZgorICAgICogZmxhZ3MucS5sb2NhbF9zaXplICYgKDEgPDwgaSkgaXMgc2V0LgorICAgICovCisgICBpbnQgbG9jYWxfc2l6ZVszXTsKKworICAgLyoqCisgICAgKiBJbWFnZSBmb3JtYXQgc3BlY2lmaWVkIHdpdGggYW4gQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlCisgICAgKiBsYXlvdXQgcXVhbGlmaWVyLgorICAgICoKKyAgICAqIFxub3RlCisgICAgKiBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgaWYgXGMgZXhwbGljaXRfaW1hZ2VfZm9ybWF0IGlzIHNldC4KKyAgICAqLworICAgR0xlbnVtIGltYWdlX2Zvcm1hdDsKKworICAgLyoqCisgICAgKiBCYXNlIHR5cGUgb2YgdGhlIGRhdGEgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gdGhpcyBpbWFnZS4gIE9ubHkKKyAgICAqIHRoZSBmb2xsb3dpbmcgZW51bWVyYW50cyBhcmUgYWxsb3dlZDogR0xTTF9UWVBFX1VJTlQsCisgICAgKiBHTFNMX1RZUEVfSU5ULCBHTFNMX1RZUEVfRkxPQVQuCisgICAgKgorICAgICogXG5vdGUKKyAgICAqIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCBpZiBcYyBleHBsaWNpdF9pbWFnZV9mb3JtYXQgaXMgc2V0LgorICAgICovCisgICBnbHNsX2Jhc2VfdHlwZSBpbWFnZV9iYXNlX3R5cGU7CisKKyAgIC8qKgorICAgICogUmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgYW4gaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXIgaXMgcHJlc2VudC4KKyAgICAqLworICAgYm9vbCBoYXNfaW50ZXJwb2xhdGlvbigpIGNvbnN0OworCisgICAvKioKKyAgICAqIFJldHVybiB3aGV0aGVyIGEgbGF5b3V0IHF1YWxpZmllciBpcyBwcmVzZW50LgorICAgICovCisgICBib29sIGhhc19sYXlvdXQoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBSZXR1cm4gd2hldGhlciBhIHN0b3JhZ2UgcXVhbGlmaWVyIGlzIHByZXNlbnQuCisgICAgKi8KKyAgIGJvb2wgaGFzX3N0b3JhZ2UoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBSZXR1cm4gd2hldGhlciBhbiBhdXhpbGlhcnkgc3RvcmFnZSBxdWFsaWZpZXIgaXMgcHJlc2VudC4KKyAgICAqLworICAgYm9vbCBoYXNfYXV4aWxpYXJ5X3N0b3JhZ2UoKSBjb25zdDsKKworICAgLyoqCisgICAgKiBcYnJpZWYgUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnRlcnBvbGF0aW9uIHF1YWxpZmllci4KKyAgICAqCisgICAgKiBJZiBhbiBpbnRlcnBvbGF0aW9uIHF1YWxpZmllciBpcyBwcmVzZW50LCB0aGVuIHJldHVybiB0aGF0IHF1YWxpZmllcidzCisgICAgKiBzdHJpbmcgcmVwcmVzZW50YXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuIEZvciBleGFtcGxlLCBpZiB0aGUKKyAgICAqIG5vcGVyc3BlY3RpdmUgYml0IGlzIHNldCwgdGhlbiB0aGlzIHJldHVybnMgIm5vcGVyc3BlY3RpdmUiLgorICAgICoKKyAgICAqIElmIG11bHRpcGxlIGludGVycG9sYXRpb24gcXVhbGlmaWVycyBhcmUgc29tZWhvdyBwcmVzZW50LCB0aGVuIHRoZQorICAgICogcmV0dXJuZWQgc3RyaW5nIGlzIHVuZGVmaW5lZCBidXQgbm90IG51bGwuCisgICAgKi8KKyAgIGNvbnN0IGNoYXIgKmludGVycG9sYXRpb25fc3RyaW5nKCkgY29uc3Q7CisKKyAgIGJvb2wgbWVyZ2VfcXVhbGlmaWVyKFlZTFRZUEUgKmxvYywKKwkJCV9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorCQkJYXN0X3R5cGVfcXVhbGlmaWVyIHEpOworCisgICBib29sIG1lcmdlX2luX3F1YWxpZmllcihZWUxUWVBFICpsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF90eXBlX3F1YWxpZmllciBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X25vZGUqICZub2RlKTsKKworfTsKKworY2xhc3MgYXN0X2RlY2xhcmF0b3JfbGlzdDsKKworY2xhc3MgYXN0X3N0cnVjdF9zcGVjaWZpZXIgOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgLyoqCisgICAgKiBcYnJpZWYgTWFrZSBhIHNoYWxsb3cgY29weSBvZiBhbiBhc3Rfc3RydWN0X3NwZWNpZmllci4KKyAgICAqCisgICAgKiBVc2Ugb25seSBpZiB0aGUgb2JqZWN0cyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlIHNhbWUgY29udGV4dCBhbmQgd2lsbCBub3QKKyAgICAqIGJlIG1vZGlmaWVkLiBaZXJvcyB0aGUgaW5oZXJpdGVkIGFzdF9ub2RlJ3MgZmllbGRzLgorICAgICovCisgICBhc3Rfc3RydWN0X3NwZWNpZmllcihjb25zdCBhc3Rfc3RydWN0X3NwZWNpZmllciYgdGhhdCk6CisgICAgICBhc3Rfbm9kZSgpLCBuYW1lKHRoYXQubmFtZSksIGRlY2xhcmF0aW9ucyh0aGF0LmRlY2xhcmF0aW9ucyksCisgICAgICBpc19kZWNsYXJhdGlvbih0aGF0LmlzX2RlY2xhcmF0aW9uKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgYXN0X3N0cnVjdF9zcGVjaWZpZXIoY29uc3QgY2hhciAqaWRlbnRpZmllciwKKwkJCWFzdF9kZWNsYXJhdG9yX2xpc3QgKmRlY2xhcmF0b3JfbGlzdCk7CisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKKyAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAvKiBMaXN0IG9mIGFzdF9kZWNsYXJhdG9yX2xpc3QgKiAqLworICAgZXhlY19saXN0IGRlY2xhcmF0aW9uczsKKyAgIGJvb2wgaXNfZGVjbGFyYXRpb247Cit9OworCisKKworY2xhc3MgYXN0X3R5cGVfc3BlY2lmaWVyIDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIC8qKgorICAgICogXGJyaWVmIE1ha2UgYSBzaGFsbG93IGNvcHkgb2YgYW4gYXN0X3R5cGVfc3BlY2lmaWVyLCBzcGVjaWZ5aW5nIGFycmF5CisgICAgKiAgICAgICAgZmllbGRzLgorICAgICoKKyAgICAqIFVzZSBvbmx5IGlmIHRoZSBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUgc2FtZSBjb250ZXh0IGFuZCB3aWxsIG5vdAorICAgICogYmUgbW9kaWZpZWQuIFplcm9zIHRoZSBpbmhlcml0ZWQgYXN0X25vZGUncyBmaWVsZHMuCisgICAgKi8KKyAgIGFzdF90eXBlX3NwZWNpZmllcihjb25zdCBhc3RfdHlwZV9zcGVjaWZpZXIgKnRoYXQsCisgICAgICAgICAgICAgICAgICAgICAgYXN0X2FycmF5X3NwZWNpZmllciAqYXJyYXlfc3BlY2lmaWVyKQorICAgICAgOiBhc3Rfbm9kZSgpLCB0eXBlX25hbWUodGhhdC0+dHlwZV9uYW1lKSwgc3RydWN0dXJlKHRoYXQtPnN0cnVjdHVyZSksCisgICAgICAgIGFycmF5X3NwZWNpZmllcihhcnJheV9zcGVjaWZpZXIpLAorICAgICAgICBkZWZhdWx0X3ByZWNpc2lvbih0aGF0LT5kZWZhdWx0X3ByZWNpc2lvbikKKyAgIHsKKyAgICAgIC8qIGVtcHR5ICovCisgICB9CisKKyAgIC8qKiBDb25zdHJ1Y3QgYSB0eXBlIHNwZWNpZmllciBmcm9tIGEgdHlwZSBuYW1lICovCisgICBhc3RfdHlwZV9zcGVjaWZpZXIoY29uc3QgY2hhciAqbmFtZSkgCisgICAgICA6IHR5cGVfbmFtZShuYW1lKSwgc3RydWN0dXJlKE5VTEwpLCBhcnJheV9zcGVjaWZpZXIoTlVMTCksCisJZGVmYXVsdF9wcmVjaXNpb24oYXN0X3ByZWNpc2lvbl9ub25lKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgLyoqIENvbnN0cnVjdCBhIHR5cGUgc3BlY2lmaWVyIGZyb20gYSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLworICAgYXN0X3R5cGVfc3BlY2lmaWVyKGFzdF9zdHJ1Y3Rfc3BlY2lmaWVyICpzKQorICAgICAgOiB0eXBlX25hbWUocy0+bmFtZSksIHN0cnVjdHVyZShzKSwgYXJyYXlfc3BlY2lmaWVyKE5VTEwpLAorCWRlZmF1bHRfcHJlY2lzaW9uKGFzdF9wcmVjaXNpb25fbm9uZSkKKyAgIHsKKyAgICAgIC8qIGVtcHR5ICovCisgICB9CisKKyAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKmdsc2xfdHlwZShjb25zdCBjaGFyICoqbmFtZSwKKwkJCQkgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKKyAgICAgIGNvbnN0OworCisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqLCBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqKTsKKworICAgY29uc3QgY2hhciAqdHlwZV9uYW1lOworICAgYXN0X3N0cnVjdF9zcGVjaWZpZXIgKnN0cnVjdHVyZTsKKworICAgYXN0X2FycmF5X3NwZWNpZmllciAqYXJyYXlfc3BlY2lmaWVyOworCisgICAvKiogRm9yIHByZWNpc2lvbiBzdGF0ZW1lbnRzLCB0aGlzIGlzIHRoZSBnaXZlbiBwcmVjaXNpb247IG90aGVyd2lzZSBub25lLiAqLworICAgdW5zaWduZWQgZGVmYXVsdF9wcmVjaXNpb246MjsKK307CisKKworY2xhc3MgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlIDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIHZpcnR1YWwgdm9pZCBwcmludCh2b2lkKSBjb25zdDsKKyAgIGJvb2wgaGFzX3F1YWxpZmllcnMoKSBjb25zdDsKKworICAgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlKCkgOiBxdWFsaWZpZXIoKSwgc3BlY2lmaWVyKE5VTEwpCisgICB7CisgICB9CisKKyAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKmdsc2xfdHlwZShjb25zdCBjaGFyICoqbmFtZSwKKwkJCQkgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKKyAgICAgIGNvbnN0OworCisgICBhc3RfdHlwZV9xdWFsaWZpZXIgcXVhbGlmaWVyOworICAgYXN0X3R5cGVfc3BlY2lmaWVyICpzcGVjaWZpZXI7Cit9OworCisKK2NsYXNzIGFzdF9kZWNsYXJhdG9yX2xpc3QgOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgYXN0X2RlY2xhcmF0b3JfbGlzdChhc3RfZnVsbHlfc3BlY2lmaWVkX3R5cGUgKik7CisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKKyAgIGFzdF9mdWxseV9zcGVjaWZpZWRfdHlwZSAqdHlwZTsKKyAgIC8qKiBMaXN0IG9mICdhc3RfZGVjbGFyYXRpb24gKicgKi8KKyAgIGV4ZWNfbGlzdCBkZWNsYXJhdGlvbnM7CisKKyAgIC8qKgorICAgICogU3BlY2lhbCBmbGFnIGZvciB2ZXJ0ZXggc2hhZGVyICJpbnZhcmlhbnQiIGRlY2xhcmF0aW9ucy4KKyAgICAqCisgICAgKiBWZXJ0ZXggc2hhZGVycyBjYW4gY29udGFpbiAiaW52YXJpYW50IiB2YXJpYWJsZSByZWRlY2xhcmF0aW9ucyB0aGF0IGRvCisgICAgKiBub3QgaW5jbHVkZSBhIHR5cGUuICBGb3IgZXhhbXBsZSwgImludmFyaWFudCBnbF9Qb3NpdGlvbjsiLiAgVGhpcyBmbGFnCisgICAgKiBpcyB1c2VkIHRvIG5vdGUgdGhlc2UgY2FzZXMgd2hlbiBubyB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAqLworICAgaW50IGludmFyaWFudDsKK307CisKKworY2xhc3MgYXN0X3BhcmFtZXRlcl9kZWNsYXJhdG9yIDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIGFzdF9wYXJhbWV0ZXJfZGVjbGFyYXRvcigpIDoKKyAgICAgIHR5cGUoTlVMTCksCisgICAgICBpZGVudGlmaWVyKE5VTEwpLAorICAgICAgYXJyYXlfc3BlY2lmaWVyKE5VTEwpLAorICAgICAgZm9ybWFsX3BhcmFtZXRlcihmYWxzZSksCisgICAgICBpc192b2lkKGZhbHNlKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICBhc3RfZnVsbHlfc3BlY2lmaWVkX3R5cGUgKnR5cGU7CisgICBjb25zdCBjaGFyICppZGVudGlmaWVyOworICAgYXN0X2FycmF5X3NwZWNpZmllciAqYXJyYXlfc3BlY2lmaWVyOworCisgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzX3RvX2hpcihleGVjX2xpc3QgKmFzdF9wYXJhbWV0ZXJzLAorCQkJCSBib29sIGZvcm1hbCwgZXhlY19saXN0ICppcl9wYXJhbWV0ZXJzLAorCQkJCSBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCitwcml2YXRlOgorICAgLyoqIElzIHRoaXMgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIHBhcnQgb2YgYSBmb3JtYWwgcGFyYW1ldGVyIGxpc3Q/ICovCisgICBib29sIGZvcm1hbF9wYXJhbWV0ZXI7CisKKyAgIC8qKgorICAgICogSXMgdGhpcyBwYXJhbWV0ZXIgJ3ZvaWQnIHR5cGU/CisgICAgKgorICAgICogVGhpcyBmaWVsZCBpcyBzZXQgYnkgXGMgOjpoaXIuCisgICAgKi8KKyAgIGJvb2wgaXNfdm9pZDsKK307CisKKworY2xhc3MgYXN0X2Z1bmN0aW9uIDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIGFzdF9mdW5jdGlvbih2b2lkKTsKKworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICBhc3RfZnVsbHlfc3BlY2lmaWVkX3R5cGUgKnJldHVybl90eXBlOworICAgY29uc3QgY2hhciAqaWRlbnRpZmllcjsKKworICAgZXhlY19saXN0IHBhcmFtZXRlcnM7CisKK3ByaXZhdGU6CisgICAvKioKKyAgICAqIElzIHRoaXMgcHJvdG90eXBlIHBhcnQgb2YgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24/CisgICAgKgorICAgICogVXNlZCBieSBhc3RfZnVuY3Rpb25fZGVmaW5pdGlvbjo6aGlyIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMsIGV0Yy4KKyAgICAqIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAqCisgICAgKiBcc2EgOjpoaXIKKyAgICAqLworICAgYm9vbCBpc19kZWZpbml0aW9uOworCisgICAvKioKKyAgICAqIEZ1bmN0aW9uIHNpZ25hdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZnVuY3Rpb24gcHJvdG90eXBlIGluc3RhbmNlCisgICAgKgorICAgICogVXNlZCBieSBhc3RfZnVuY3Rpb25fZGVmaW5pdGlvbjo6aGlyIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMsIGV0Yy4KKyAgICAqIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAqCisgICAgKiBcc2EgOjpoaXIKKyAgICAqLworICAgY2xhc3MgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWduYXR1cmU7CisKKyAgIGZyaWVuZCBjbGFzcyBhc3RfZnVuY3Rpb25fZGVmaW5pdGlvbjsKK307CisKKworY2xhc3MgYXN0X2V4cHJlc3Npb25fc3RhdGVtZW50IDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIGFzdF9leHByZXNzaW9uX3N0YXRlbWVudChhc3RfZXhwcmVzc2lvbiAqKTsKKyAgIHZpcnR1YWwgdm9pZCBwcmludCh2b2lkKSBjb25zdDsKKworICAgdmlydHVhbCBpcl9ydmFsdWUgKmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworICAgYXN0X2V4cHJlc3Npb24gKmV4cHJlc3Npb247Cit9OworCisKK2NsYXNzIGFzdF9jYXNlX2xhYmVsIDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIGFzdF9jYXNlX2xhYmVsKGFzdF9leHByZXNzaW9uICp0ZXN0X3ZhbHVlKTsKKyAgIHZpcnR1YWwgdm9pZCBwcmludCh2b2lkKSBjb25zdDsKKworICAgdmlydHVhbCBpcl9ydmFsdWUgKmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworICAgLyoqCisgICAgKiBBbiB0ZXN0IHZhbHVlIG9mIE5VTEwgbWVhbnMgJ2RlZmF1bHQnLgorICAgICovCisgICBhc3RfZXhwcmVzc2lvbiAqdGVzdF92YWx1ZTsKK307CisKKworY2xhc3MgYXN0X2Nhc2VfbGFiZWxfbGlzdCA6IHB1YmxpYyBhc3Rfbm9kZSB7CitwdWJsaWM6CisgICBhc3RfY2FzZV9sYWJlbF9saXN0KHZvaWQpOworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICAvKioKKyAgICAqIEEgbGlzdCBvZiBjYXNlIGxhYmVscy4KKyAgICAqLworICAgZXhlY19saXN0IGxhYmVsczsKK307CisKKworY2xhc3MgYXN0X2Nhc2Vfc3RhdGVtZW50IDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIGFzdF9jYXNlX3N0YXRlbWVudChhc3RfY2FzZV9sYWJlbF9saXN0ICpsYWJlbHMpOworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICBhc3RfY2FzZV9sYWJlbF9saXN0ICpsYWJlbHM7CisKKyAgIC8qKgorICAgICogQSBsaXN0IG9mIHN0YXRlbWVudHMuCisgICAgKi8KKyAgIGV4ZWNfbGlzdCBzdG10czsKK307CisKKworY2xhc3MgYXN0X2Nhc2Vfc3RhdGVtZW50X2xpc3QgOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgYXN0X2Nhc2Vfc3RhdGVtZW50X2xpc3Qodm9pZCk7CisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKKyAgIC8qKgorICAgICogQSBsaXN0IG9mIGNhc2VzLgorICAgICovCisgICBleGVjX2xpc3QgY2FzZXM7Cit9OworCisKK2NsYXNzIGFzdF9zd2l0Y2hfYm9keSA6IHB1YmxpYyBhc3Rfbm9kZSB7CitwdWJsaWM6CisgICBhc3Rfc3dpdGNoX2JvZHkoYXN0X2Nhc2Vfc3RhdGVtZW50X2xpc3QgKnN0bXRzKTsKKyAgIHZpcnR1YWwgdm9pZCBwcmludCh2b2lkKSBjb25zdDsKKworICAgdmlydHVhbCBpcl9ydmFsdWUgKmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworICAgYXN0X2Nhc2Vfc3RhdGVtZW50X2xpc3QgKnN0bXRzOworfTsKKworCitjbGFzcyBhc3Rfc2VsZWN0aW9uX3N0YXRlbWVudCA6IHB1YmxpYyBhc3Rfbm9kZSB7CitwdWJsaWM6CisgICBhc3Rfc2VsZWN0aW9uX3N0YXRlbWVudChhc3RfZXhwcmVzc2lvbiAqY29uZGl0aW9uLAorCQkJICAgYXN0X25vZGUgKnRoZW5fc3RhdGVtZW50LAorCQkJICAgYXN0X25vZGUgKmVsc2Vfc3RhdGVtZW50KTsKKyAgIHZpcnR1YWwgdm9pZCBwcmludCh2b2lkKSBjb25zdDsKKworICAgdmlydHVhbCBpcl9ydmFsdWUgKmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworICAgYXN0X2V4cHJlc3Npb24gKmNvbmRpdGlvbjsKKyAgIGFzdF9ub2RlICp0aGVuX3N0YXRlbWVudDsKKyAgIGFzdF9ub2RlICplbHNlX3N0YXRlbWVudDsKK307CisKKworY2xhc3MgYXN0X3N3aXRjaF9zdGF0ZW1lbnQgOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgYXN0X3N3aXRjaF9zdGF0ZW1lbnQoYXN0X2V4cHJlc3Npb24gKnRlc3RfZXhwcmVzc2lvbiwKKwkJCWFzdF9ub2RlICpib2R5KTsKKyAgIHZpcnR1YWwgdm9pZCBwcmludCh2b2lkKSBjb25zdDsKKworICAgdmlydHVhbCBpcl9ydmFsdWUgKmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworICAgYXN0X2V4cHJlc3Npb24gKnRlc3RfZXhwcmVzc2lvbjsKKyAgIGFzdF9ub2RlICpib2R5OworCitwcm90ZWN0ZWQ6CisgICB2b2lkIHRlc3RfdG9faGlyKGV4ZWNfbGlzdCAqLCBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqKTsKK307CisKK2NsYXNzIGFzdF9pdGVyYXRpb25fc3RhdGVtZW50IDogcHVibGljIGFzdF9ub2RlIHsKK3B1YmxpYzoKKyAgIGFzdF9pdGVyYXRpb25fc3RhdGVtZW50KGludCBtb2RlLCBhc3Rfbm9kZSAqaW5pdCwgYXN0X25vZGUgKmNvbmRpdGlvbiwKKwkJCSAgIGFzdF9leHByZXNzaW9uICpyZXN0X2V4cHJlc3Npb24sIGFzdF9ub2RlICpib2R5KTsKKworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqLCBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqKTsKKworICAgZW51bSBhc3RfaXRlcmF0aW9uX21vZGVzIHsKKyAgICAgIGFzdF9mb3IsCisgICAgICBhc3Rfd2hpbGUsCisgICAgICBhc3RfZG9fd2hpbGUKKyAgIH0gbW9kZTsKKyAgIAorCisgICBhc3Rfbm9kZSAqaW5pdF9zdGF0ZW1lbnQ7CisgICBhc3Rfbm9kZSAqY29uZGl0aW9uOworICAgYXN0X2V4cHJlc3Npb24gKnJlc3RfZXhwcmVzc2lvbjsKKworICAgYXN0X25vZGUgKmJvZHk7CisKKyAgIC8qKgorICAgICogR2VuZXJhdGUgSVIgZnJvbSB0aGUgY29uZGl0aW9uIG9mIGEgbG9vcAorICAgICoKKyAgICAqIFRoaXMgaXMgZmFjdG9yZWQgb3V0IG9mIDo6aGlyIGJlY2F1c2Ugc29tZSBsb29wcyBoYXZlIHRoZSBjb25kaXRpb24KKyAgICAqIHRlc3QgYXQgdGhlIHRvcCAoZm9yIGFuZCB3aGlsZSksIGFuZCBvdGhlcnMgaGF2ZSBpdCBhdCB0aGUgZW5kIChkby13aGlsZSkuCisgICAgKi8KKyAgIHZvaWQgY29uZGl0aW9uX3RvX2hpcihleGVjX2xpc3QgKiwgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKik7Cit9OworCisKK2NsYXNzIGFzdF9qdW1wX3N0YXRlbWVudCA6IHB1YmxpYyBhc3Rfbm9kZSB7CitwdWJsaWM6CisgICBhc3RfanVtcF9zdGF0ZW1lbnQoaW50IG1vZGUsIGFzdF9leHByZXNzaW9uICpyZXR1cm5fdmFsdWUpOworICAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQpIGNvbnN0OworCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICBlbnVtIGFzdF9qdW1wX21vZGVzIHsKKyAgICAgIGFzdF9jb250aW51ZSwKKyAgICAgIGFzdF9icmVhaywKKyAgICAgIGFzdF9yZXR1cm4sCisgICAgICBhc3RfZGlzY2FyZAorICAgfSBtb2RlOworCisgICBhc3RfZXhwcmVzc2lvbiAqb3B0X3JldHVybl92YWx1ZTsKK307CisKKworY2xhc3MgYXN0X2Z1bmN0aW9uX2RlZmluaXRpb24gOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgYXN0X2Z1bmN0aW9uX2RlZmluaXRpb24oKSA6IHByb3RvdHlwZShOVUxMKSwgYm9keShOVUxMKQorICAgeworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCkgY29uc3Q7CisKKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKKyAgIGFzdF9mdW5jdGlvbiAqcHJvdG90eXBlOworICAgYXN0X2NvbXBvdW5kX3N0YXRlbWVudCAqYm9keTsKK307CisKK2NsYXNzIGFzdF9pbnRlcmZhY2VfYmxvY2sgOiBwdWJsaWMgYXN0X25vZGUgeworcHVibGljOgorICAgYXN0X2ludGVyZmFjZV9ibG9jayhhc3RfdHlwZV9xdWFsaWZpZXIgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnN0YW5jZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBhc3RfYXJyYXlfc3BlY2lmaWVyICphcnJheV9zcGVjaWZpZXIpCisgICA6IGxheW91dChsYXlvdXQpLCBibG9ja19uYW1lKE5VTEwpLCBpbnN0YW5jZV9uYW1lKGluc3RhbmNlX25hbWUpLAorICAgICBhcnJheV9zcGVjaWZpZXIoYXJyYXlfc3BlY2lmaWVyKQorICAgeworICAgfQorCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCisgICBhc3RfdHlwZV9xdWFsaWZpZXIgbGF5b3V0OworICAgY29uc3QgY2hhciAqYmxvY2tfbmFtZTsKKworICAgLyoqCisgICAgKiBEZWNsYXJlZCBuYW1lIG9mIHRoZSBibG9jayBpbnN0YW5jZSwgaWYgc3BlY2lmaWVkLgorICAgICoKKyAgICAqIElmIHRoZSBibG9jayBkb2VzIG5vdCBoYXZlIGFuIGluc3RhbmNlIG5hbWUsIHRoaXMgZmllbGQgd2lsbCBiZQorICAgICogXGMgTlVMTC4KKyAgICAqLworICAgY29uc3QgY2hhciAqaW5zdGFuY2VfbmFtZTsKKworICAgLyoqIExpc3Qgb2YgYXN0X2RlY2xhcmF0b3JfbGlzdCAqICovCisgICBleGVjX2xpc3QgZGVjbGFyYXRpb25zOworCisgICAvKioKKyAgICAqIERlY2xhcmVkIGFycmF5IHNpemUgb2YgdGhlIGJsb2NrIGluc3RhbmNlCisgICAgKgorICAgICogSWYgdGhlIGJsb2NrIGlzIG5vdCBkZWNsYXJlZCBhcyBhbiBhcnJheSBvciBpZiB0aGUgYmxvY2sgaW5zdGFuY2UgYXJyYXkKKyAgICAqIGlzIHVuc2l6ZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBcYyBOVUxMLgorICAgICovCisgICBhc3RfYXJyYXlfc3BlY2lmaWVyICphcnJheV9zcGVjaWZpZXI7Cit9OworCisKKy8qKgorICogQVNUIG5vZGUgcmVwcmVzZW50aW5nIGEgZGVjbGFyYXRpb24gb2YgdGhlIGlucHV0IGxheW91dCBmb3IgZ2VvbWV0cnkKKyAqIHNoYWRlcnMuCisgKi8KK2NsYXNzIGFzdF9nc19pbnB1dF9sYXlvdXQgOiBwdWJsaWMgYXN0X25vZGUKK3sKK3B1YmxpYzoKKyAgIGFzdF9nc19pbnB1dF9sYXlvdXQoY29uc3Qgc3RydWN0IFlZTFRZUEUgJmxvY3AsIEdMZW51bSBwcmltX3R5cGUpCisgICAgICA6IHByaW1fdHlwZShwcmltX3R5cGUpCisgICB7CisgICAgICBzZXRfbG9jYXRpb24obG9jcCk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfcnZhbHVlICpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKK3ByaXZhdGU6CisgICBjb25zdCBHTGVudW0gcHJpbV90eXBlOworfTsKKworCisvKioKKyAqIEFTVCBub2RlIHJlcHJlc2VudGluZyBhIGRlY2FsYXJhdGlvbiBvZiB0aGUgaW5wdXQgbGF5b3V0IGZvciBjb21wdXRlCisgKiBzaGFkZXJzLgorICovCitjbGFzcyBhc3RfY3NfaW5wdXRfbGF5b3V0IDogcHVibGljIGFzdF9ub2RlCit7CitwdWJsaWM6CisgICBhc3RfY3NfaW5wdXRfbGF5b3V0KGNvbnN0IHN0cnVjdCBZWUxUWVBFICZsb2NwLCBjb25zdCB1bnNpZ25lZCAqbG9jYWxfc2l6ZSkKKyAgIHsKKyAgICAgIG1lbWNweSh0aGlzLT5sb2NhbF9zaXplLCBsb2NhbF9zaXplLCBzaXplb2YodGhpcy0+bG9jYWxfc2l6ZSkpOworICAgICAgc2V0X2xvY2F0aW9uKGxvY3ApOworICAgfQorCisgICB2aXJ0dWFsIGlyX3J2YWx1ZSAqaGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCitwcml2YXRlOgorICAgdW5zaWduZWQgbG9jYWxfc2l6ZVszXTsKK307CisKKy8qQH0qLworCitleHRlcm4gdm9pZAorX21lc2FfYXN0X3RvX2hpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworZXh0ZXJuIGlyX3J2YWx1ZSAqCitfbWVzYV9hc3RfZmllbGRfc2VsZWN0aW9uX3RvX2hpcihjb25zdCBhc3RfZXhwcmVzc2lvbiAqZXhwciwKKwkJCQkgZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkJIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKK2V4dGVybiBpcl9ydmFsdWUgKgorX21lc2FfYXN0X2FycmF5X2luZGV4X3RvX2hpcih2b2lkICptZW1fY3R4LAorCQkJICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisJCQkgICAgIGlyX3J2YWx1ZSAqYXJyYXksIGlyX3J2YWx1ZSAqaWR4LAorCQkJICAgICBZWUxUWVBFICZsb2MsIFlZTFRZUEUgJmlkeF9sb2MpOworCitleHRlcm4gdm9pZAorX21lc2FfYXN0X3NldF9hZ2dyZWdhdGVfdHlwZShjb25zdCBnbHNsX3R5cGUgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF9leHByZXNzaW9uICpleHByKTsKKwordm9pZAorZW1pdF9mdW5jdGlvbihfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgaXJfZnVuY3Rpb24gKmYpOworCitleHRlcm4gdm9pZAorY2hlY2tfYnVpbHRpbl9hcnJheV9tYXhfc2l6ZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWUxUWVBFIGxvYywgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKKworI2VuZGlmIC8qIEFTVF9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2FzdF9hcnJheV9pbmRleC5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2FzdF9hcnJheV9pbmRleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkMzM2YgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0X2FycmF5X2luZGV4LmNwcApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJhc3QuaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAiaXIuaCIKKworI2lmIGRlZmluZWQoTkRFQlVHKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBVX0FTU0VSVF9PTkxZIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBVX0FTU0VSVF9PTkxZCisjZW5kaWYKKwordm9pZAorYXN0X2FycmF5X3NwZWNpZmllcjo6cHJpbnQodm9pZCkgY29uc3QKK3sKKyAgIGlmICh0aGlzLT5pc191bnNpemVkX2FycmF5KSB7CisgICAgICBwcmludGYoIlsgXSAiKTsKKyAgIH0KKworICAgZm9yZWFjaF9saXN0X3R5cGVkIChhc3Rfbm9kZSwgYXJyYXlfZGltZW5zaW9uLCBsaW5rLCAmdGhpcy0+YXJyYXlfZGltZW5zaW9ucykgeworICAgICAgcHJpbnRmKCJbICIpOworICAgICAgYXJyYXlfZGltZW5zaW9uLT5wcmludCgpOworICAgICAgcHJpbnRmKCJdICIpOworICAgfQorfQorCisvKioKKyAqIElmIFxjIGlyIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IGZvciB3aGljaCB3ZSBhcmUgdHJhY2tpbmcgdGhlIG1heCBhcnJheQorICogZWxlbWVudCBhY2Nlc3NlZCwgdHJhY2sgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgYmVlbiBhY2Nlc3NlZC4KKyAqIE90aGVyd2lzZSBkbyBub3RoaW5nLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjaGVja3Mgd2hldGhlciB0aGUgYXJyYXkgaXMgYSBidWlsdC1pbiBhcnJheSB3aG9zZQorICogbWF4aW11bSBzaXplIGlzIHRvbyBzbWFsbCB0byBhY2NvbW1vZGF0ZSB0aGUgZ2l2ZW4gaW5kZXgsIGFuZCBpZiBzbyB1c2VzCisgKiBsb2MgYW5kIHN0YXRlIHRvIHJlcG9ydCB0aGUgZXJyb3IuCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfbWF4X2FycmF5X2FjY2Vzcyhpcl9ydmFsdWUgKmlyLCB1bnNpZ25lZCBpZHgsIFlZTFRZUEUgKmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIGlmIChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdmFyID0gaXItPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCkpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSBkZXJlZl92YXItPnZhcjsKKyAgICAgIGlmIChpZHggPiB2YXItPmRhdGEubWF4X2FycmF5X2FjY2VzcykgeworICAgICAgICAgdmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MgPSBpZHg7CisKKyAgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBhY2Nlc3Mgd2lsbCwgYXMgYSBzaWRlIGVmZmVjdCwgaW1wbGljaXRseSBjYXVzZQorICAgICAgICAgICogdGhlIHNpemUgb2YgYSBidWlsdC1pbiBhcnJheSB0byBiZSB0b28gbGFyZ2UuCisgICAgICAgICAgKi8KKyAgICAgICAgIGNoZWNrX2J1aWx0aW5fYXJyYXlfbWF4X3NpemUodmFyLT5uYW1lLCBpZHgrMSwgKmxvYywgc3RhdGUpOworICAgICAgfQorICAgfSBlbHNlIGlmIChpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmRlcmVmX3JlY29yZCA9CisgICAgICAgICAgICAgIGlyLT5hc19kZXJlZmVyZW5jZV9yZWNvcmQoKSkgeworICAgICAgLyogVGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzIHdlIG5lZWQgdG8gY29uc2lkZXI6CisgICAgICAgKgorICAgICAgICogLSBBY2Nlc3NpbmcgYW4gZWxlbWVudCBvZiBhbiBhcnJheSB0aGF0IGlzIGEgbWVtYmVyIG9mIGEgbmFtZWQKKyAgICAgICAqICAgaW50ZXJmYWNlIGJsb2NrIChlLmcuIGlmYy5mb29baV0pCisgICAgICAgKgorICAgICAgICogLSBBY2Nlc3NpbmcgYW4gZWxlbWVudCBvZiBhbiBhcnJheSB0aGF0IGlzIGEgbWVtYmVyIG9mIGEgbmFtZWQKKyAgICAgICAqICAgaW50ZXJmYWNlIGJsb2NrIGFycmF5IChlLmcuIGlmY1tqXS5mb29baV0pLgorICAgICAgICovCisgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdmFyID0KKyAgICAgICAgIGRlcmVmX3JlY29yZC0+cmVjb3JkLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgICAgaWYgKGRlcmVmX3ZhciA9PSBOVUxMKSB7CisgICAgICAgICBpZiAoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmRlcmVmX2FycmF5ID0KKyAgICAgICAgICAgICBkZXJlZl9yZWNvcmQtPnJlY29yZC0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKSkgeworICAgICAgICAgICAgZGVyZWZfdmFyID0gZGVyZWZfYXJyYXktPmFycmF5LT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZGVyZWZfdmFyICE9IE5VTEwpIHsKKyAgICAgICAgIGlmIChkZXJlZl92YXItPnZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSBVX0FTU0VSVF9PTkxZICppbnRlcmZhY2VfdHlwZSA9CisgICAgICAgICAgICAgICBkZXJlZl92YXItPnZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBmaWVsZF9pbmRleCA9CisgICAgICAgICAgICAgICBkZXJlZl9yZWNvcmQtPnJlY29yZC0+dHlwZS0+ZmllbGRfaW5kZXgoZGVyZWZfcmVjb3JkLT5maWVsZCk7CisgICAgICAgICAgICBhc3NlcnQoZmllbGRfaW5kZXggPCBpbnRlcmZhY2VfdHlwZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChpZHggPiBkZXJlZl92YXItPnZhci0+bWF4X2lmY19hcnJheV9hY2Nlc3NbZmllbGRfaW5kZXhdKSB7CisgICAgICAgICAgICAgICBkZXJlZl92YXItPnZhci0+bWF4X2lmY19hcnJheV9hY2Nlc3NbZmllbGRfaW5kZXhdID0gaWR4OworCisgICAgICAgICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgYWNjZXNzIHdpbGwsIGFzIGEgc2lkZSBlZmZlY3QsIGltcGxpY2l0bHkKKyAgICAgICAgICAgICAgICAqIGNhdXNlIHRoZSBzaXplIG9mIGEgYnVpbHQtaW4gYXJyYXkgdG8gYmUgdG9vIGxhcmdlLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBjaGVja19idWlsdGluX2FycmF5X21heF9zaXplKGRlcmVmX3JlY29yZC0+ZmllbGQsIGlkeCsxLCAqbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKworaXJfcnZhbHVlICoKK19tZXNhX2FzdF9hcnJheV9pbmRleF90b19oaXIodm9pZCAqbWVtX2N0eCwKKwkJCSAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorCQkJICAgICBpcl9ydmFsdWUgKmFycmF5LCBpcl9ydmFsdWUgKmlkeCwKKwkJCSAgICAgWVlMVFlQRSAmbG9jLCBZWUxUWVBFICZpZHhfbG9jKQoreworICAgaWYgKCFhcnJheS0+dHlwZS0+aXNfZXJyb3IoKQorICAgICAgICYmICFhcnJheS0+dHlwZS0+aXNfYXJyYXkoKQorICAgICAgICYmICFhcnJheS0+dHlwZS0+aXNfbWF0cml4KCkKKyAgICAgICAmJiAhYXJyYXktPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgaWR4X2xvYywgc3RhdGUsCisJCSAgICAgICAiY2Fubm90IGRlcmVmZXJlbmNlIG5vbi1hcnJheSAvIG5vbi1tYXRyaXggLyAiCisJCSAgICAgICAibm9uLXZlY3RvciIpOworICAgfQorCisgICBpZiAoIWlkeC0+dHlwZS0+aXNfZXJyb3IoKSkgeworICAgICAgaWYgKCFpZHgtPnR5cGUtPmlzX2ludGVnZXIoKSkgeworCSBfbWVzYV9nbHNsX2Vycm9yKCYgaWR4X2xvYywgc3RhdGUsICJhcnJheSBpbmRleCBtdXN0IGJlIGludGVnZXIgdHlwZSIpOworICAgICAgfSBlbHNlIGlmICghaWR4LT50eXBlLT5pc19zY2FsYXIoKSkgeworCSBfbWVzYV9nbHNsX2Vycm9yKCYgaWR4X2xvYywgc3RhdGUsICJhcnJheSBpbmRleCBtdXN0IGJlIHNjYWxhciIpOworICAgICAgfQorICAgfQorCisgICAvKiBJZiB0aGUgYXJyYXkgaW5kZXggaXMgYSBjb25zdGFudCBleHByZXNzaW9uIGFuZCB0aGUgYXJyYXkgaGFzIGEKKyAgICAqIGRlY2xhcmVkIHNpemUsIGVuc3VyZSB0aGF0IHRoZSBhY2Nlc3MgaXMgaW4tYm91bmRzLiAgSWYgdGhlIGFycmF5CisgICAgKiBpbmRleCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLCBlbnN1cmUgdGhhdCB0aGUgYXJyYXkgaGFzIGEKKyAgICAqIGRlY2xhcmVkIHNpemUuCisgICAgKi8KKyAgIGlyX2NvbnN0YW50ICpjb25zdCBjb25zdF9pbmRleCA9IGlkeC0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworICAgaWYgKGNvbnN0X2luZGV4ICE9IE5VTEwgJiYgaWR4LT50eXBlLT5pc19pbnRlZ2VyKCkpIHsKKyAgICAgIGNvbnN0IGludCBpZHggPSBjb25zdF9pbmRleC0+dmFsdWUuaVswXTsKKyAgICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9ICJlcnJvciI7CisgICAgICB1bnNpZ25lZCBib3VuZCA9IDA7CisKKyAgICAgIC8qIEZyb20gcGFnZSAyNCAocGFnZSAzMCBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgIkl0IGlzIGlsbGVnYWwgdG8gZGVjbGFyZSBhbiBhcnJheSB3aXRoIGEgc2l6ZSwgYW5kIHRoZW4KKyAgICAgICAqICAgIGxhdGVyIChpbiB0aGUgc2FtZSBzaGFkZXIpIGluZGV4IHRoZSBzYW1lIGFycmF5IHdpdGggYW4KKyAgICAgICAqICAgIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAgICAgICogICAgZGVjbGFyZWQgc2l6ZS4gSXQgaXMgYWxzbyBpbGxlZ2FsIHRvIGluZGV4IGFuIGFycmF5IHdpdGggYQorICAgICAgICogICAgbmVnYXRpdmUgY29uc3RhbnQgZXhwcmVzc2lvbi4iCisgICAgICAgKi8KKyAgICAgIGlmIChhcnJheS0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKwkgaWYgKGFycmF5LT50eXBlLT5yb3dfdHlwZSgpLT52ZWN0b3JfZWxlbWVudHMgPD0gaWR4KSB7CisJICAgIHR5cGVfbmFtZSA9ICJtYXRyaXgiOworCSAgICBib3VuZCA9IGFycmF5LT50eXBlLT5yb3dfdHlwZSgpLT52ZWN0b3JfZWxlbWVudHM7CisJIH0KKyAgICAgIH0gZWxzZSBpZiAoYXJyYXktPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisJIGlmIChhcnJheS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzIDw9IGlkeCkgeworCSAgICB0eXBlX25hbWUgPSAidmVjdG9yIjsKKwkgICAgYm91bmQgPSBhcnJheS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOworCSB9CisgICAgICB9IGVsc2UgeworCSAvKiBnbHNsX3R5cGU6OmFycmF5X3NpemUoKSByZXR1cm5zIC0xIGZvciBub24tYXJyYXkgdHlwZXMuICBUaGlzIG1lYW5zCisJICAqIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGUgdHlwZSBpcyBhbiBhcnJheSBiZWZvcmUKKwkgICogZG9pbmcgdGhlIGJvdW5kcyBjaGVja2luZy4KKwkgICovCisJIGlmICgoYXJyYXktPnR5cGUtPmFycmF5X3NpemUoKSA+IDApCisJICAgICAmJiAoYXJyYXktPnR5cGUtPmFycmF5X3NpemUoKSA8PSBpZHgpKSB7CisJICAgIHR5cGVfbmFtZSA9ICJhcnJheSI7CisJICAgIGJvdW5kID0gYXJyYXktPnR5cGUtPmFycmF5X3NpemUoKTsKKwkgfQorICAgICAgfQorCisgICAgICBpZiAoYm91bmQgPiAwKSB7CisJIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAiJXMgaW5kZXggbXVzdCBiZSA8ICV1IiwKKwkJCSAgdHlwZV9uYW1lLCBib3VuZCk7CisgICAgICB9IGVsc2UgaWYgKGlkeCA8IDApIHsKKwkgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICIlcyBpbmRleCBtdXN0IGJlID49IDAiLAorCQkJICB0eXBlX25hbWUpOworICAgICAgfQorCisgICAgICBpZiAoYXJyYXktPnR5cGUtPmlzX2FycmF5KCkpCisgICAgICAgICB1cGRhdGVfbWF4X2FycmF5X2FjY2VzcyhhcnJheSwgaWR4LCAmbG9jLCBzdGF0ZSk7CisgICB9IGVsc2UgaWYgKGNvbnN0X2luZGV4ID09IE5VTEwgJiYgYXJyYXktPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIGlmIChhcnJheS0+dHlwZS0+aXNfdW5zaXplZF9hcnJheSgpKSB7CisJIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJ1bnNpemVkIGFycmF5IGluZGV4IG11c3QgYmUgY29uc3RhbnQiKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJyYXktPnR5cGUtPmZpZWxkcy5hcnJheS0+aXNfaW50ZXJmYWNlKCkKKyAgICAgICAgICAgICAgICAgJiYgYXJyYXktPnZhcmlhYmxlX3JlZmVyZW5jZWQoKS0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtKSB7CisJIC8qIFBhZ2UgNDYgaW4gc2VjdGlvbiA0LjMuNyBvZiB0aGUgT3BlbkdMIEVTIDMuMDAgc3BlYyBzYXlzOgorCSAgKgorCSAgKiAgICAgIkFsbCBpbmRleGVzIHVzZWQgdG8gaW5kZXggYSB1bmlmb3JtIGJsb2NrIGFycmF5IG11c3QgYmUKKwkgICogICAgIGNvbnN0YW50IGludGVncmFsIGV4cHJlc3Npb25zLiIKKwkgICovCisJIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisJCQkgICJ1bmlmb3JtIGJsb2NrIGFycmF5IGluZGV4IG11c3QgYmUgY29uc3RhbnQiKTsKKyAgICAgIH0gZWxzZSB7CisJIC8qIHdob2xlX3ZhcmlhYmxlX3JlZmVyZW5jZWQgY2FuIHJldHVybiBOVUxMIGlmIHRoZSBhcnJheSBpcyBhCisJICAqIG1lbWJlciBvZiBhIHN0cnVjdHVyZS4gIEluIHRoaXMgY2FzZSBpdCBpcyBzYWZlIHRvIG5vdCB1cGRhdGUKKwkgICogdGhlIG1heF9hcnJheV9hY2Nlc3MgZmllbGQgYmVjYXVzZSBpdCBpcyBuZXZlciB1c2VkIGZvciBmaWVsZHMKKwkgICogb2Ygc3RydWN0dXJlcy4KKwkgICovCisJIGlyX3ZhcmlhYmxlICp2ID0gYXJyYXktPndob2xlX3ZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKwkgaWYgKHYgIT0gTlVMTCkKKwkgICAgdi0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzID0gYXJyYXktPnR5cGUtPmFycmF5X3NpemUoKSAtIDE7CisgICAgICB9CisKKyAgICAgIC8qIEZyb20gcGFnZSAyMyAoMjkgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4zMCBzcGVjOgorICAgICAgICoKKyAgICAgICAqICAgICJTYW1wbGVycyBhZ2dyZWdhdGVkIGludG8gYXJyYXlzIHdpdGhpbiBhIHNoYWRlciAodXNpbmcgc3F1YXJlCisgICAgICAgKiAgICBicmFja2V0cyBbIF0pIGNhbiBvbmx5IGJlIGluZGV4ZWQgd2l0aCBpbnRlZ3JhbCBjb25zdGFudAorICAgICAgICogICAgZXhwcmVzc2lvbnMgWy4uLl0uIgorICAgICAgICoKKyAgICAgICAqIFRoaXMgcmVzdHJpY3Rpb24gd2FzIGFkZGVkIGluIEdMU0wgMS4zMC4gIFNoYWRlcnMgdXNpbmcgZWFybGllcgorICAgICAgICogdmVyc2lvbiBvZiB0aGUgbGFuZ3VhZ2Ugc2hvdWxkIG5vdCBiZSByZWplY3RlZCBieSB0aGUgY29tcGlsZXIKKyAgICAgICAqIGZyb250LWVuZCBmb3IgdXNpbmcgdGhpcyBjb25zdHJ1Y3QuICBUaGlzIGFsbG93cyB1c2VmdWwgdGhpbmdzIHN1Y2gKKyAgICAgICAqIGFzIHVzaW5nIGEgbG9vcCBjb3VudGVyIGFzIHRoZSBpbmRleCB0byBhbiBhcnJheSBvZiBzYW1wbGVycy4gIElmIHRoZQorICAgICAgICogbG9vcCBpbiB1bnJvbGxlZCwgdGhlIGNvZGUgc2hvdWxkIGNvbXBpbGUgY29ycmVjdGx5LiAgSW5zdGVhZCwgZW1pdCBhCisgICAgICAgKiB3YXJuaW5nLgorICAgICAgICovCisgICAgICBpZiAoYXJyYXktPnR5cGUtPmVsZW1lbnRfdHlwZSgpLT5pc19zYW1wbGVyKCkpIHsKKwkgaWYgKCFzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDEwMCkpIHsKKwkgICAgaWYgKHN0YXRlLT5lc19zaGFkZXIpIHsKKwkgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKCZsb2MsIHN0YXRlLAorCQkJCSAgInNhbXBsZXIgYXJyYXlzIGluZGV4ZWQgd2l0aCBub24tY29uc3RhbnQgIgorCQkJCSAgImV4cHJlc3Npb25zIGlzIG9wdGlvbmFsIGluICVzIiwKKwkJCQkgIHN0YXRlLT5nZXRfdmVyc2lvbl9zdHJpbmcoKSk7CisJICAgIH0gZWxzZSB7CisJICAgICAgIF9tZXNhX2dsc2xfd2FybmluZygmbG9jLCBzdGF0ZSwKKwkJCQkgICJzYW1wbGVyIGFycmF5cyBpbmRleGVkIHdpdGggbm9uLWNvbnN0YW50ICIKKwkJCQkgICJleHByZXNzaW9ucyB3aWxsIGJlIGZvcmJpZGRlbiBpbiBHTFNMIDEuMzAgIgorCQkJCSAgImFuZCBsYXRlciIpOworCSAgICB9CisJIH0gZWxzZSB7CisJICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisJCQkgICAgICJzYW1wbGVyIGFycmF5cyBpbmRleGVkIHdpdGggbm9uLWNvbnN0YW50ICIKKwkJCSAgICAgImV4cHJlc3Npb25zIGlzIGZvcmJpZGRlbiBpbiBHTFNMIDEuMzAgYW5kICIKKwkJCSAgICAgImxhdGVyIik7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogQWZ0ZXIgcGVyZm9ybWluZyBhbGwgb2YgdGhlIGVycm9yIGNoZWNraW5nLCBnZW5lcmF0ZSB0aGUgSVIgZm9yIHRoZQorICAgICogZXhwcmVzc2lvbi4KKyAgICAqLworICAgaWYgKGFycmF5LT50eXBlLT5pc19hcnJheSgpCisgICAgICAgfHwgYXJyYXktPnR5cGUtPmlzX21hdHJpeCgpKSB7CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KGFycmF5LCBpZHgpOworICAgfSBlbHNlIGlmIChhcnJheS0+dHlwZS0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdCwgYXJyYXksIGlkeCk7CisgICB9IGVsc2UgaWYgKGFycmF5LT50eXBlLT5pc19lcnJvcigpKSB7CisgICAgICByZXR1cm4gYXJyYXk7CisgICB9IGVsc2UgeworICAgICAgaXJfcnZhbHVlICpyZXN1bHQgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkoYXJyYXksIGlkeCk7CisgICAgICByZXN1bHQtPnR5cGUgPSBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICB9Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2FzdF9leHByLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0X2V4cHIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjRkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2FzdF9leHByLmNwcApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJhc3QuaCIKKworY29uc3QgY2hhciAqCithc3RfZXhwcmVzc2lvbjo6b3BlcmF0b3Jfc3RyaW5nKGVudW0gYXN0X29wZXJhdG9ycyBvcCkKK3sKKyAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBvcGVyYXRvcnNbXSA9IHsKKyAgICAgICI9IiwKKyAgICAgICIrIiwKKyAgICAgICItIiwKKyAgICAgICIrIiwKKyAgICAgICItIiwKKyAgICAgICIqIiwKKyAgICAgICIvIiwKKyAgICAgICIlIiwKKyAgICAgICI8PCIsCisgICAgICAiPj4iLAorICAgICAgIjwiLAorICAgICAgIj4iLAorICAgICAgIjw9IiwKKyAgICAgICI+PSIsCisgICAgICAiPT0iLAorICAgICAgIiE9IiwKKyAgICAgICImIiwKKyAgICAgICJeIiwKKyAgICAgICJ8IiwKKyAgICAgICJ+IiwKKyAgICAgICImJiIsCisgICAgICAiXl4iLAorICAgICAgInx8IiwKKyAgICAgICIhIiwKKworICAgICAgIio9IiwKKyAgICAgICIvPSIsCisgICAgICAiJT0iLAorICAgICAgIis9IiwKKyAgICAgICItPSIsCisgICAgICAiPDw9IiwKKyAgICAgICI+Pj0iLAorICAgICAgIiY9IiwKKyAgICAgICJePSIsCisgICAgICAifD0iLAorCisgICAgICAiPzoiLAorCisgICAgICAiKysiLAorICAgICAgIi0tIiwKKyAgICAgICIrKyIsCisgICAgICAiLS0iLAorICAgICAgIi4iLAorICAgfTsKKworICAgYXNzZXJ0KCh1bnNpZ25lZCBpbnQpb3AgPCBzaXplb2Yob3BlcmF0b3JzKSAvIHNpemVvZihvcGVyYXRvcnNbMF0pKTsKKworICAgcmV0dXJuIG9wZXJhdG9yc1tvcF07Cit9CisKKworYXN0X2V4cHJlc3Npb25fYmluOjphc3RfZXhwcmVzc2lvbl9iaW4oaW50IG9wZXIsIGFzdF9leHByZXNzaW9uICpleDAsCisJCQkJICAgICAgIGFzdF9leHByZXNzaW9uICpleDEpIDoKKyAgIGFzdF9leHByZXNzaW9uKG9wZXIsIGV4MCwgZXgxLCBOVUxMKQoreworICAgYXNzZXJ0KChvcGVyID49IGFzdF9wbHVzKSAmJiAob3BlciA8PSBhc3RfbG9naWNfbm90KSk7Cit9CisKKwordm9pZAorYXN0X2V4cHJlc3Npb25fYmluOjpwcmludCh2b2lkKSBjb25zdAoreworICAgc3ViZXhwcmVzc2lvbnNbMF0tPnByaW50KCk7CisgICBwcmludGYoIiVzICIsIG9wZXJhdG9yX3N0cmluZyhvcGVyKSk7CisgICBzdWJleHByZXNzaW9uc1sxXS0+cHJpbnQoKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0X2Z1bmN0aW9uLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0X2Z1bmN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM5ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9hc3RfZnVuY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTc4NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgImFzdC5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImxpYmZucy5oIiAvLyBMdW5hckcgQUREOgorCitzdGF0aWMgaXJfcnZhbHVlICoKK2NvbnZlcnRfY29tcG9uZW50KGlyX3J2YWx1ZSAqc3JjLCBjb25zdCBnbHNsX3R5cGUgKmRlc2lyZWRfdHlwZSk7CisKK2Jvb2wKK2FwcGx5X2ltcGxpY2l0X2NvbnZlcnNpb24oY29uc3QgZ2xzbF90eXBlICp0bywgaXJfcnZhbHVlICogJmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKK3N0YXRpYyB1bnNpZ25lZAorcHJvY2Vzc19wYXJhbWV0ZXJzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBleGVjX2xpc3QgKmFjdHVhbF9wYXJhbWV0ZXJzLAorCQkgICBleGVjX2xpc3QgKnBhcmFtZXRlcnMsCisJCSAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKworICAgZm9yZWFjaF9saXN0IChuLCBwYXJhbWV0ZXJzKSB7CisgICAgICBhc3Rfbm9kZSAqY29uc3QgYXN0ID0gZXhlY19ub2RlX2RhdGEoYXN0X25vZGUsIG4sIGxpbmspOworICAgICAgaXJfcnZhbHVlICpyZXN1bHQgPSBhc3QtPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgICAgaXJfY29uc3RhbnQgKmNvbnN0IGNvbnN0YW50ID0gcmVzdWx0LT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisgICAgICBpZiAoY29uc3RhbnQgIT0gTlVMTCkKKwkgcmVzdWx0ID0gY29uc3RhbnQ7CisKKyAgICAgIGFjdHVhbF9wYXJhbWV0ZXJzLT5wdXNoX3RhaWwocmVzdWx0KTsKKyAgICAgIGNvdW50Kys7CisgICB9CisKKyAgIHJldHVybiBjb3VudDsKK30KKworCisvKioKKyAqIEdlbmVyYXRlIGEgc291cmNlIHByb3RvdHlwZSBmb3IgYSBmdW5jdGlvbiBzaWduYXR1cmUKKyAqCisgKiBccGFyYW0gcmV0dXJuX3R5cGUgUmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgTWF5IGJlIFxjIE5VTEwuCisgKiBccGFyYW0gbmFtZSAgICAgICAgTmFtZSBvZiB0aGUgZnVuY3Rpb24uCisgKiBccGFyYW0gcGFyYW1ldGVycyAgTGlzdCBvZiBcYyBpcl9pbnN0cnVjdGlvbiBub2RlcyByZXByZXNlbnRpbmcgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGxpc3QgZm9yIHRoZSBmdW5jdGlvbi4gIFRoaXMgbWF5IGJlIGVpdGhlciBhCisgKiAgICAgICAgICAgICAgICAgICAgZm9ybWFsIChcYyBpcl92YXJpYWJsZSkgb3IgYWN0dWFsIChcYyBpcl9ydmFsdWUpCisgKiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGxpc3QuICBPbmx5IHRoZSB0eXBlIGlzIHVzZWQuCisgKgorICogXHJldHVybgorICogQSByYWxsb2NlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcm90b3R5cGUgb2YgdGhlIGZ1bmN0aW9uLgorICovCitjaGFyICoKK3Byb3RvdHlwZV9zdHJpbmcoY29uc3QgZ2xzbF90eXBlICpyZXR1cm5fdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJIGV4ZWNfbGlzdCAqcGFyYW1ldGVycykKK3sKKyAgIGNoYXIgKnN0ciA9IE5VTEw7CisKKyAgIGlmIChyZXR1cm5fdHlwZSAhPSBOVUxMKQorICAgICAgc3RyID0gcmFsbG9jX2FzcHJpbnRmKE5VTEwsICIlcyAiLCByZXR1cm5fdHlwZS0+bmFtZSk7CisKKyAgIHJhbGxvY19hc3ByaW50Zl9hcHBlbmQoJnN0ciwgIiVzKCIsIG5hbWUpOworCisgICBjb25zdCBjaGFyICpjb21tYSA9ICIiOworICAgZm9yZWFjaF9saXN0KG5vZGUsIHBhcmFtZXRlcnMpIHsKKyAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpjb25zdCBwYXJhbSA9IChpcl92YXJpYWJsZSAqKSBub2RlOworCisgICAgICByYWxsb2NfYXNwcmludGZfYXBwZW5kKCZzdHIsICIlcyVzIiwgY29tbWEsIHBhcmFtLT50eXBlLT5uYW1lKTsKKyAgICAgIGNvbW1hID0gIiwgIjsKKyAgIH0KKworICAgcmFsbG9jX3N0cmNhdCgmc3RyLCAiKSIpOworICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGJvb2wKK3ZlcmlmeV9pbWFnZV9wYXJhbWV0ZXIoWVlMVFlQRSAqbG9jLCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXJfdmFyaWFibGUgKmZvcm1hbCwgY29uc3QgaXJfdmFyaWFibGUgKmFjdHVhbCkKK3sKKyAgIC8qKgorICAgICogRnJvbSB0aGUgQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlIHNwZWNpZmljYXRpb246CisgICAgKgorICAgICogIlRoZSB2YWx1ZXMgb2YgaW1hZ2UgdmFyaWFibGVzIHF1YWxpZmllZCB3aXRoIGNvaGVyZW50LAorICAgICogIHZvbGF0aWxlLCByZXN0cmljdCwgcmVhZG9ubHksIG9yIHdyaXRlb25seSBtYXkgbm90IGJlIHBhc3NlZAorICAgICogIHRvIGZ1bmN0aW9ucyB3aG9zZSBmb3JtYWwgcGFyYW1ldGVycyBsYWNrIHN1Y2gKKyAgICAqICBxdWFsaWZpZXJzLiBbLi4uXSBJdCBpcyBsZWdhbCB0byBoYXZlIGFkZGl0aW9uYWwgcXVhbGlmaWVycworICAgICogIG9uIGEgZm9ybWFsIHBhcmFtZXRlciwgYnV0IG5vdCB0byBoYXZlIGZld2VyLiIKKyAgICAqLworICAgaWYgKGFjdHVhbC0+ZGF0YS5pbWFnZS5jb2hlcmVudCAmJiAhZm9ybWFsLT5kYXRhLmltYWdlLmNvaGVyZW50KSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBjYWxsIHBhcmFtZXRlciBgJXMnIGRyb3BzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImBjb2hlcmVudCcgcXVhbGlmaWVyIiwgZm9ybWFsLT5uYW1lKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgaWYgKGFjdHVhbC0+ZGF0YS5pbWFnZS5fdm9sYXRpbGUgJiYgIWZvcm1hbC0+ZGF0YS5pbWFnZS5fdm9sYXRpbGUpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVyIGAlcycgZHJvcHMgIgorICAgICAgICAgICAgICAgICAgICAgICAiYHZvbGF0aWxlJyBxdWFsaWZpZXIiLCBmb3JtYWwtPm5hbWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBpZiAoYWN0dWFsLT5kYXRhLmltYWdlLnJlc3RyaWN0X2ZsYWcgJiYgIWZvcm1hbC0+ZGF0YS5pbWFnZS5yZXN0cmljdF9mbGFnKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBjYWxsIHBhcmFtZXRlciBgJXMnIGRyb3BzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImByZXN0cmljdCcgcXVhbGlmaWVyIiwgZm9ybWFsLT5uYW1lKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgaWYgKGFjdHVhbC0+ZGF0YS5pbWFnZS5yZWFkX29ubHkgJiYgIWZvcm1hbC0+ZGF0YS5pbWFnZS5yZWFkX29ubHkpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVyIGAlcycgZHJvcHMgIgorICAgICAgICAgICAgICAgICAgICAgICAiYHJlYWRvbmx5JyBxdWFsaWZpZXIiLCBmb3JtYWwtPm5hbWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBpZiAoYWN0dWFsLT5kYXRhLmltYWdlLndyaXRlX29ubHkgJiYgIWZvcm1hbC0+ZGF0YS5pbWFnZS53cml0ZV9vbmx5KSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBjYWxsIHBhcmFtZXRlciBgJXMnIGRyb3BzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImB3cml0ZW9ubHknIHF1YWxpZmllciIsIGZvcm1hbC0+bmFtZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0ICdvdXQnIGFuZCAnaW5vdXQnIGFjdHVhbCBwYXJhbWV0ZXJzIGFyZSBsdmFsdWVzLiAgQWxzbywgdmVyaWZ5CisgKiB0aGF0ICdjb25zdF9pbicgZm9ybWFsIHBhcmFtZXRlcnMgKGFuIGV4dGVuc2lvbiBpbiBvdXIgSVIpIGNvcnJlc3BvbmQgdG8KKyAqIGlyX2NvbnN0YW50IGFjdHVhbCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgYm9vbAordmVyaWZ5X3BhcmFtZXRlcl9tb2RlcyhfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJICAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnLAorCQkgICAgICAgZXhlY19saXN0ICZhY3R1YWxfaXJfcGFyYW1ldGVycywKKwkJICAgICAgIGV4ZWNfbGlzdCAmYWN0dWFsX2FzdF9wYXJhbWV0ZXJzKQoreworICAgZXhlY19ub2RlICphY3R1YWxfaXJfbm9kZSAgPSBhY3R1YWxfaXJfcGFyYW1ldGVycy5oZWFkOworICAgZXhlY19ub2RlICphY3R1YWxfYXN0X25vZGUgPSBhY3R1YWxfYXN0X3BhcmFtZXRlcnMuaGVhZDsKKworICAgZm9yZWFjaF9saXN0KGZvcm1hbF9ub2RlLCAmc2lnLT5wYXJhbWV0ZXJzKSB7CisgICAgICAvKiBUaGUgbGlzdHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGguICovCisgICAgICBhc3NlcnQoIWFjdHVhbF9pcl9ub2RlLT5pc190YWlsX3NlbnRpbmVsKCkpOworICAgICAgYXNzZXJ0KCFhY3R1YWxfYXN0X25vZGUtPmlzX3RhaWxfc2VudGluZWwoKSk7CisKKyAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpjb25zdCBmb3JtYWwgPSAoaXJfdmFyaWFibGUgKikgZm9ybWFsX25vZGU7CisgICAgICBjb25zdCBpcl9ydmFsdWUgKmNvbnN0IGFjdHVhbCA9IChpcl9ydmFsdWUgKikgYWN0dWFsX2lyX25vZGU7CisgICAgICBjb25zdCBhc3RfZXhwcmVzc2lvbiAqY29uc3QgYWN0dWFsX2FzdCA9CisJIGV4ZWNfbm9kZV9kYXRhKGFzdF9leHByZXNzaW9uLCBhY3R1YWxfYXN0X25vZGUsIGxpbmspOworCisgICAgICAvKiBGSVhNRTogJ2xvYycgaXMgaW5jb3JyZWN0IChhcyBvZiAyMDExLTAxLTIxKS4gSXQgaXMgYWx3YXlzCisgICAgICAgKiBGSVhNRTogMDowKDApLgorICAgICAgICovCisgICAgICBZWUxUWVBFIGxvYyA9IGFjdHVhbF9hc3QtPmdldF9sb2NhdGlvbigpOworCisgICAgICAvKiBWZXJpZnkgdGhhdCAnY29uc3RfaW4nIHBhcmFtZXRlcnMgYXJlIGlyX2NvbnN0YW50cy4gKi8KKyAgICAgIGlmIChmb3JtYWwtPmRhdGEubW9kZSA9PSBpcl92YXJfY29uc3RfaW4gJiYKKwkgIGFjdHVhbC0+aXJfdHlwZSAhPSBpcl90eXBlX2NvbnN0YW50KSB7CisJIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisJCQkgICJwYXJhbWV0ZXIgYGluICVzJyBtdXN0IGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiIsCisJCQkgIGZvcm1hbC0+bmFtZSk7CisJIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLyogVmVyaWZ5IHRoYXQgJ291dCcgYW5kICdpbm91dCcgYWN0dWFsIHBhcmFtZXRlcnMgYXJlIGx2YWx1ZXMuICovCisgICAgICBpZiAoZm9ybWFsLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX291dAorICAgICAgICAgIHx8IGZvcm1hbC0+ZGF0YS5tb2RlID09IGlyX3Zhcl9mdW5jdGlvbl9pbm91dCkgeworCSBjb25zdCBjaGFyICptb2RlID0gTlVMTDsKKwkgc3dpdGNoIChmb3JtYWwtPmRhdGEubW9kZSkgeworCSBjYXNlIGlyX3Zhcl9mdW5jdGlvbl9vdXQ6ICAgbW9kZSA9ICJvdXQiOyAgIGJyZWFrOworCSBjYXNlIGlyX3Zhcl9mdW5jdGlvbl9pbm91dDogbW9kZSA9ICJpbm91dCI7IGJyZWFrOworCSBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgIGJyZWFrOworCSB9CisKKwkgLyogVGhpcyBBU1QtYmFzZWQgY2hlY2sgY2F0Y2hlcyBlcnJvcnMgbGlrZSBmKGkrKykuICBUaGUgSVItYmFzZWQKKwkgICogaXNfbHZhbHVlKCkgaXMgaW5zdWZmaWNpZW50IGJlY2F1c2UgdGhlIGFjdHVhbCBwYXJhbWV0ZXIgYXQgdGhlCisJICAqIElSLWxldmVsIGlzIGp1c3QgYSB0ZW1wb3JhcnkgdmFsdWUsIHdoaWNoIGlzIGFuIGwtdmFsdWUuCisJICAqLworCSBpZiAoYWN0dWFsX2FzdC0+bm9uX2x2YWx1ZV9kZXNjcmlwdGlvbiAhPSBOVUxMKSB7CisJICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisJCQkgICAgICJmdW5jdGlvbiBwYXJhbWV0ZXIgJyVzICVzJyByZWZlcmVuY2VzIGEgJXMiLAorCQkJICAgICBtb2RlLCBmb3JtYWwtPm5hbWUsCisJCQkgICAgIGFjdHVhbF9hc3QtPm5vbl9sdmFsdWVfZGVzY3JpcHRpb24pOworCSAgICByZXR1cm4gZmFsc2U7CisJIH0KKworCSBpcl92YXJpYWJsZSAqdmFyID0gYWN0dWFsLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisJIGlmICh2YXIpCisJICAgIHZhci0+ZGF0YS5hc3NpZ25lZCA9IHRydWU7CisKKwkgaWYgKHZhciAmJiB2YXItPmRhdGEucmVhZF9vbmx5KSB7CisJICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisJCQkgICAgICJmdW5jdGlvbiBwYXJhbWV0ZXIgJyVzICVzJyByZWZlcmVuY2VzIHRoZSAiCisJCQkgICAgICJyZWFkLW9ubHkgdmFyaWFibGUgJyVzJyIsCisJCQkgICAgIG1vZGUsIGZvcm1hbC0+bmFtZSwKKwkJCSAgICAgYWN0dWFsLT52YXJpYWJsZV9yZWZlcmVuY2VkKCktPm5hbWUpOworCSAgICByZXR1cm4gZmFsc2U7CisJIH0gZWxzZSBpZiAoIWFjdHVhbC0+aXNfbHZhbHVlKCkpIHsKKyAgICAgICAgICAgIC8qIEV2ZW4gdGhvdWdoIGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0IGlzIG5vdCBhbiBsLXZhbHVlLCBsZXQgaXQKKyAgICAgICAgICAgICAqIHNsb3AgdGhyb3VnaC4gIGdlbmVyYXRlX2NhbGwgd2lsbCBoYW5kbGUgaXQgY29ycmVjdGx5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpcl9leHByZXNzaW9uICpjb25zdCBleHByID0gKChpcl9ydmFsdWUgKikgYWN0dWFsKS0+YXNfZXhwcmVzc2lvbigpOworICAgICAgICAgICAgaWYgKGV4cHIgPT0gTlVMTAorICAgICAgICAgICAgICAgIHx8IGV4cHItPm9wZXJhdGlvbiAhPSBpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdAorICAgICAgICAgICAgICAgIHx8ICFleHByLT5vcGVyYW5kc1swXS0+aXNfbHZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBwYXJhbWV0ZXIgJyVzICVzJyBpcyBub3QgYW4gbHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwgZm9ybWFsLT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKwkgfQorICAgICAgfQorCisgICAgICBpZiAoZm9ybWFsLT50eXBlLT5pc19pbWFnZSgpICYmCisgICAgICAgICAgYWN0dWFsLT52YXJpYWJsZV9yZWZlcmVuY2VkKCkpIHsKKyAgICAgICAgIGlmICghdmVyaWZ5X2ltYWdlX3BhcmFtZXRlcigmbG9jLCBzdGF0ZSwgZm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbC0+dmFyaWFibGVfcmVmZXJlbmNlZCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYWN0dWFsX2lyX25vZGUgID0gYWN0dWFsX2lyX25vZGUtPm5leHQ7CisgICAgICBhY3R1YWxfYXN0X25vZGUgPSBhY3R1YWxfYXN0X25vZGUtPm5leHQ7CisgICB9CisgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK2ZpeF9wYXJhbWV0ZXIodm9pZCAqbWVtX2N0eCwgaXJfcnZhbHVlICphY3R1YWwsIGNvbnN0IGdsc2xfdHlwZSAqZm9ybWFsX3R5cGUsCisgICAgICAgICAgICAgIGV4ZWNfbGlzdCAqYmVmb3JlX2luc3RydWN0aW9ucywgZXhlY19saXN0ICphZnRlcl9pbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgIGJvb2wgcGFyYW1ldGVyX2lzX2lub3V0KQoreworICAgaXJfZXhwcmVzc2lvbiAqY29uc3QgZXhwciA9IGFjdHVhbC0+YXNfZXhwcmVzc2lvbigpOworCisgICAvKiBJZiB0aGUgdHlwZXMgbWF0Y2ggZXhhY3RseSBhbmQgdGhlIHBhcmFtZXRlciBpcyBub3QgYSB2ZWN0b3ItZXh0cmFjdCwKKyAgICAqIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSB0byBmaXggdGhlIHBhcmFtZXRlci4KKyAgICAqLworICAgaWYgKGZvcm1hbF90eXBlID09IGFjdHVhbC0+dHlwZQorICAgICAgICYmIChleHByID09IE5VTEwgfHwgZXhwci0+b3BlcmF0aW9uICE9IGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0KSkKKyAgICAgIHJldHVybjsKKworICAgLyogVG8gY29udmVydCBhbiBvdXQgcGFyYW1ldGVyLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0bworICAgICogaG9sZCB0aGUgdmFsdWUgYmVmb3JlIGNvbnZlcnNpb24sIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGNvbnZlcnNpb24gYWZ0ZXIKKyAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMuCisgICAgKgorICAgICogVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiB0cmFuc2Zvcm1pbmcgY29kZSBsaWtlIHRoaXM6CisgICAgKgorICAgICogICB2b2lkIGYob3V0IGludCB4KTsKKyAgICAqICAgZmxvYXQgdmFsdWU7CisgICAgKiAgIGYodmFsdWUpOworICAgICoKKyAgICAqIEludG8gSVIgdGhhdCdzIGVxdWl2YWxlbnQgdG8gdGhpczoKKyAgICAqCisgICAgKiAgIHZvaWQgZihvdXQgaW50IHgpOworICAgICogICBmbG9hdCB2YWx1ZTsKKyAgICAqICAgaW50IG91dF9wYXJhbWV0ZXJfY29udmVyc2lvbjsKKyAgICAqICAgZihvdXRfcGFyYW1ldGVyX2NvbnZlcnNpb24pOworICAgICogICB2YWx1ZSA9IGZsb2F0KG91dF9wYXJhbWV0ZXJfY29udmVyc2lvbik7CisgICAgKgorICAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBhbiBpcl9leHByZXNzaW9uIG9mIGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0LAorICAgICogYWRkaXRpb25hbCBjb252ZXJzaW9uIGlzIG5lZWRlZCBpbiB0aGUgcG9zdC1jYWxsIHJlLXdyaXRlLgorICAgICovCisgICBpcl92YXJpYWJsZSAqdG1wID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShmb3JtYWxfdHlwZSwgImlub3V0X3RtcCIsIGlyX3Zhcl90ZW1wb3JhcnkpOworCisgICBiZWZvcmVfaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwodG1wKTsKKworICAgLyogSWYgdGhlIHBhcmFtZXRlciBpcyBhbiBpbm91dCBwYXJhbWV0ZXIsIGNvcHkgdGhlIHZhbHVlIG9mIHRoZSBhY3R1YWwKKyAgICAqIHBhcmFtZXRlciB0byB0aGUgbmV3IHRlbXBvcmFyeS4gIE5vdGUgdGhhdCBubyB0eXBlIGNvbnZlcnNpb24gaXMgYWxsb3dlZAorICAgICogaGVyZSBiZWNhdXNlIGlub3V0IHBhcmFtZXRlcnMgbXVzdCBtYXRjaCB0eXBlcyBleGFjdGx5LgorICAgICovCisgICBpZiAocGFyYW1ldGVyX2lzX2lub3V0KSB7CisgICAgICAvKiBJbm91dCBwYXJhbWV0ZXJzIHNob3VsZCBuZXZlciByZXF1aXJlIGNvbnZlcnNpb24sIHNpbmNlIHRoYXQgd291bGQKKyAgICAgICAqIHJlcXVpcmUgYW4gaW1wbGljaXQgY29udmVyc2lvbiB0byBleGlzdCBib3RoIHRvIGFuZCBmcm9tIHRoZSBmb3JtYWwKKyAgICAgICAqIHBhcmFtZXRlciB0eXBlLCBhbmQgdGhlcmUgYXJlIG5vIGJpZGlyZWN0aW9uYWwgaW1wbGljaXQgY29udmVyc2lvbnMuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCAoYWN0dWFsLT50eXBlID09IGZvcm1hbF90eXBlKTsKKworICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmNvbnN0IGRlcmVmX3RtcF8xID0KKyAgICAgICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0bXApOworICAgICAgaXJfYXNzaWdubWVudCAqY29uc3QgYXNzaWdubWVudCA9CisgICAgICAgICBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChkZXJlZl90bXBfMSwgYWN0dWFsKTsKKyAgICAgIGJlZm9yZV9pbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChhc3NpZ25tZW50KTsKKyAgIH0KKworICAgLyogUmVwbGFjZSB0aGUgcGFyYW1ldGVyIGluIHRoZSBjYWxsIHdpdGggYSBkZXJlZmVyZW5jZSBvZiB0aGUgbmV3CisgICAgKiB0ZW1wb3JhcnkuCisgICAgKi8KKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpjb25zdCBkZXJlZl90bXBfMiA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodG1wKTsKKyAgIGFjdHVhbC0+cmVwbGFjZV93aXRoKGRlcmVmX3RtcF8yKTsKKworCisgICAvKiBDb3B5IHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gdGhlIGFjdHVhbCBwYXJhbWV0ZXIgd2l0aCBvcHRpb25hbAorICAgICogdHlwZSBjb252ZXJzaW9uIGFwcGxpZWQuCisgICAgKi8KKyAgIGlyX3J2YWx1ZSAqcmhzID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRtcCk7CisgICBpZiAoYWN0dWFsLT50eXBlICE9IGZvcm1hbF90eXBlKQorICAgICAgcmhzID0gY29udmVydF9jb21wb25lbnQocmhzLCBhY3R1YWwtPnR5cGUpOworCisgICBpcl9ydmFsdWUgKmxocyA9IGFjdHVhbDsKKyAgIGlmIChleHByICE9IE5VTEwgJiYgZXhwci0+b3BlcmF0aW9uID09IGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0KSB7CisgICAgICByaHMgPSBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl90cmlvcF92ZWN0b3JfaW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+b3BlcmFuZHNbMF0tPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLT5vcGVyYW5kc1swXS0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLT5vcGVyYW5kc1sxXS0+Y2xvbmUobWVtX2N0eCwgTlVMTCkpOworICAgICAgbGhzID0gZXhwci0+b3BlcmFuZHNbMF0tPmNsb25lKG1lbV9jdHgsIE5VTEwpOworICAgfQorCisgICBpcl9hc3NpZ25tZW50ICpjb25zdCBhc3NpZ25tZW50XzIgPSBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChsaHMsIHJocyk7CisgICBhZnRlcl9pbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChhc3NpZ25tZW50XzIpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgZnVuY3Rpb24gY2FsbC4KKyAqCisgKiBGb3Igbm9uLXZvaWQgZnVuY3Rpb25zLCB0aGlzIHJldHVybnMgYSBkZXJlZmVyZW5jZSBvZiB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlCisgKiB3aGljaCBzdG9yZXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGNhbGwuICBGb3Igdm9pZCBmdW5jdGlvbnMsIHRoaXMgcmV0dXJucworICogTlVMTC4KKyAqLworc3RhdGljIGlyX3J2YWx1ZSAqCitnZW5lcmF0ZV9jYWxsKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZywKKwkgICAgICBleGVjX2xpc3QgKmFjdHVhbF9wYXJhbWV0ZXJzLAorCSAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgZXhlY19saXN0IHBvc3RfY2FsbF9jb252ZXJzaW9uczsKKworICAgLyogUGVyZm9ybSBpbXBsaWNpdCBjb252ZXJzaW9uIG9mIGFyZ3VtZW50cy4gIEZvciBvdXQgcGFyYW1ldGVycywgd2UgbmVlZAorICAgICogdG8gcGxhY2UgdGhlbSBpbiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBhbmQgZG8gdGhlIGNvbnZlcnNpb24gYWZ0ZXIgdGhlCisgICAgKiBjYWxsIHRha2VzIHBsYWNlLiAgU2luY2Ugd2UgaGF2ZW4ndCBlbWl0dGVkIHRoZSBjYWxsIHlldCwgd2UnbGwgcGxhY2UKKyAgICAqIHRoZSBwb3N0LWNhbGwgY29udmVyc2lvbnMgaW4gYSB0ZW1wb3JhcnkgZXhlY19saXN0LCBhbmQgZW1pdCB0aGVtIGxhdGVyLgorICAgICovCisgICBmb3JlYWNoX3R3b19saXN0cyhmb3JtYWxfbm9kZSwgJnNpZy0+cGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9ub2RlLCBhY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICphY3R1YWwgPSAoaXJfcnZhbHVlICopIGFjdHVhbF9ub2RlOworICAgICAgaXJfdmFyaWFibGUgKmZvcm1hbCA9IChpcl92YXJpYWJsZSAqKSBmb3JtYWxfbm9kZTsKKworICAgICAgaWYgKGZvcm1hbC0+dHlwZS0+aXNfbnVtZXJpYygpIHx8IGZvcm1hbC0+dHlwZS0+aXNfYm9vbGVhbigpKSB7CisJIHN3aXRjaCAoZm9ybWFsLT5kYXRhLm1vZGUpIHsKKwkgY2FzZSBpcl92YXJfY29uc3RfaW46CisJIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX2luOiB7CisJICAgIGlyX3J2YWx1ZSAqY29udmVydGVkCisJICAgICAgID0gY29udmVydF9jb21wb25lbnQoYWN0dWFsLCBmb3JtYWwtPnR5cGUpOworCSAgICBhY3R1YWwtPnJlcGxhY2Vfd2l0aChjb252ZXJ0ZWQpOworCSAgICBicmVhazsKKwkgfQorCSBjYXNlIGlyX3Zhcl9mdW5jdGlvbl9vdXQ6CisJIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX2lub3V0OgorICAgICAgICAgICAgZml4X3BhcmFtZXRlcihjdHgsIGFjdHVhbCwgZm9ybWFsLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMsICZwb3N0X2NhbGxfY29udmVyc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hbC0+ZGF0YS5tb2RlID09IGlyX3Zhcl9mdW5jdGlvbl9pbm91dCk7CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQgKCEiSWxsZWdhbCBmb3JtYWwgcGFyYW1ldGVyIG1vZGUiKTsKKwkgICAgYnJlYWs7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogSWYgdGhlIGZ1bmN0aW9uIGNhbGwgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLCBkb24ndCBnZW5lcmF0ZSBhbnkKKyAgICAqIGluc3RydWN0aW9uczsganVzdCBnZW5lcmF0ZSBhbiBpcl9jb25zdGFudC4KKyAgICAqCisgICAgKiBGdW5jdGlvbiBjYWxscyB3ZXJlIGZpcnN0IGFsbG93ZWQgdG8gYmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgaW4gR0xTTAorICAgICogMS4yMCBhbmQgR0xTTCBFUyAzLjAwLgorICAgICovCisgICBpZiAoc3RhdGUtPmlzX3ZlcnNpb24oMTIwLCAzMDApKSB7CisgICAgICBpcl9jb25zdGFudCAqdmFsdWUgPSBzaWctPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoYWN0dWFsX3BhcmFtZXRlcnMsIE5VTEwpOworICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKwkgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgfQorCisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWYgPSBOVUxMOworICAgaWYgKCFzaWctPnJldHVybl90eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIC8qIENyZWF0ZSBhIG5ldyB0ZW1wb3JhcnkgdG8gaG9sZCB0aGUgcmV0dXJuIHZhbHVlLiAqLworICAgICAgaXJfdmFyaWFibGUgKnZhcjsKKworICAgICAgdmFyID0gbmV3KGN0eCkgaXJfdmFyaWFibGUoc2lnLT5yZXR1cm5fdHlwZSwKKwkJCQkgcmFsbG9jX2FzcHJpbnRmKGN0eCwgIiVzX3JldHZhbCIsCisJCQkJCQkgc2lnLT5mdW5jdGlvbl9uYW1lKCkpLAorCQkJCSBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHZhcik7CisKKyAgICAgIGRlcmVmID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKyAgIH0KKyAgIGlyX2NhbGwgKmNhbGwgPSBuZXcoY3R4KSBpcl9jYWxsKHNpZywgZGVyZWYsIGFjdHVhbF9wYXJhbWV0ZXJzKTsKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKGNhbGwpOworCisgICAvKiBBbHNvIGVtaXQgYW55IG5lY2Vzc2FyeSBvdXQtcGFyYW1ldGVyIGNvbnZlcnNpb25zLiAqLworICAgaW5zdHJ1Y3Rpb25zLT5hcHBlbmRfbGlzdCgmcG9zdF9jYWxsX2NvbnZlcnNpb25zKTsKKworICAgcmV0dXJuIGRlcmVmID8gZGVyZWYtPmNsb25lKGN0eCwgTlVMTCkgOiBOVUxMOworfQorCisvKioKKyAqIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSBhbmQgcGFyYW1ldGVyIGxpc3QsIGZpbmQgdGhlIG1hdGNoaW5nIHNpZ25hdHVyZS4KKyAqLworc3RhdGljIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCittYXRjaF9mdW5jdGlvbl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBleGVjX2xpc3QgKmFjdHVhbF9wYXJhbWV0ZXJzLAorCQkgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICBpcl9mdW5jdGlvbiAqZiA9IHN0YXRlLT5zeW1ib2xzLT5nZXRfZnVuY3Rpb24obmFtZSk7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmxvY2FsX3NpZyA9IE5VTEw7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9IE5VTEw7CisKKyAgIC8qIElzIHRoZSBmdW5jdGlvbiBoaWRkZW4gYnkgYSByZWNvcmQgdHlwZSBjb25zdHJ1Y3Rvcj8gKi8KKyAgIGlmIChzdGF0ZS0+c3ltYm9scy0+Z2V0X3R5cGUobmFtZSkpCisgICAgICBnb3RvIGRvbmU7IC8qIG5vIG1hdGNoICovCisKKyAgIC8qIElzIHRoZSBmdW5jdGlvbiBoaWRkZW4gYnkgYSB2YXJpYWJsZSAoaW1wb3NzaWJsZSBpbiAxLjEwKT8gKi8KKyAgIGlmICghc3RhdGUtPnN5bWJvbHMtPnNlcGFyYXRlX2Z1bmN0aW9uX25hbWVzcGFjZQorICAgICAgICYmIHN0YXRlLT5zeW1ib2xzLT5nZXRfdmFyaWFibGUobmFtZSkpCisgICAgICBnb3RvIGRvbmU7IC8qIG5vIG1hdGNoICovCisKKyAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgIC8qIExvb2sgZm9yIGEgbWF0Y2ggaW4gdGhlIGxvY2FsIHNoYWRlci4gIElmIGV4YWN0LCB3ZSdyZSBkb25lLiAqLworICAgICAgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgICAgc2lnID0gbG9jYWxfc2lnID0gZi0+bWF0Y2hpbmdfc2lnbmF0dXJlKHN0YXRlLCBhY3R1YWxfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfZXhhY3QpOworICAgICAgaWYgKGlzX2V4YWN0KQorCSBnb3RvIGRvbmU7CisKKyAgICAgIGlmICghc3RhdGUtPmVzX3NoYWRlciAmJiBmLT5oYXNfdXNlcl9zaWduYXR1cmUoKSkgeworCSAvKiBJbiBkZXNrdG9wIEdMLCB0aGUgcHJlc2VuY2Ugb2YgYSB1c2VyLWRlZmluZWQgc2lnbmF0dXJlIGhpZGVzIGFueQorCSAgKiBidWlsdC1pbiBzaWduYXR1cmVzLCBzbyB3ZSBtdXN0IGlnbm9yZSB0aGVtLiAgSW4gY29udHJhc3QsIGluIEVTMgorCSAgKiB1c2VyLWRlZmluZWQgc2lnbmF0dXJlcyBhZGQgbmV3IG92ZXJsb2Fkcywgc28gd2UgbXVzdCBwcm9jZWVkLgorCSAgKi8KKwkgZ290byBkb25lOworICAgICAgfQorICAgfQorCisgICAvKiBMb2NhbCBzaGFkZXIgaGFzIG5vIGV4YWN0IGNhbmRpZGF0ZXM7IGNoZWNrIHRoZSBidWlsdC1pbnMuICovCisgICBfbWVzYV9nbHNsX2luaXRpYWxpemVfYnVpbHRpbl9mdW5jdGlvbnMoKTsKKyAgIHNpZyA9IF9tZXNhX2dsc2xfZmluZF9idWlsdGluX2Z1bmN0aW9uKHN0YXRlLCBuYW1lLCBhY3R1YWxfcGFyYW1ldGVycyk7CisKK2RvbmU6CisgICBpZiAoc2lnICE9IE5VTEwpIHsKKyAgICAgIC8qIElmIHRoZSBtYXRjaCBpcyBmcm9tIGEgbGlua2VkIGJ1aWx0LWluIHNoYWRlciwgaW1wb3J0IHRoZSBwcm90b3R5cGUuICovCisgICAgICBpZiAoc2lnICE9IGxvY2FsX3NpZykgeworCSBpZiAoZiA9PSBOVUxMKSB7CisJICAgIGYgPSBuZXcoY3R4KSBpcl9mdW5jdGlvbihuYW1lKTsKKwkgICAgc3RhdGUtPnN5bWJvbHMtPmFkZF9nbG9iYWxfZnVuY3Rpb24oZik7CisJICAgIGVtaXRfZnVuY3Rpb24oc3RhdGUsIGYpOworCSB9CisJIGYtPmFkZF9zaWduYXR1cmUoc2lnLT5jbG9uZV9wcm90b3R5cGUoZiwgTlVMTCkpOworICAgICAgfQorICAgfQorICAgcmV0dXJuIHNpZzsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2Z1bmN0aW9uX3Byb3RvdHlwZXMoX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsIFlZTFRZUEUgKmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfZnVuY3Rpb24gKmYpCit7CisgICBpZiAoZiA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBmb3JlYWNoX2xpc3QgKG5vZGUsICZmLT5zaWduYXR1cmVzKSB7CisgICAgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9IChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKikgbm9kZTsKKworICAgICAgaWYgKHNpZy0+aXNfYnVpbHRpbigpICYmICFzaWctPmlzX2J1aWx0aW5fYXZhaWxhYmxlKHN0YXRlKSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBjaGFyICpzdHIgPSBwcm90b3R5cGVfc3RyaW5nKHNpZy0+cmV0dXJuX3R5cGUsIGYtPm5hbWUsICZzaWctPnBhcmFtZXRlcnMpOworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLCAiICAgJXMiLCBzdHIpOworICAgICAgcmFsbG9jX2ZyZWUoc3RyKTsKKyAgIH0KK30KKworLyoqCisgKiBSYWlzZSBhICJubyBtYXRjaGluZyBmdW5jdGlvbiIgZXJyb3IsIGxpc3RpbmcgYWxsIHBvc3NpYmxlIG92ZXJsb2FkcyB0aGUKKyAqIGNvbXBpbGVyIGNvbnNpZGVyZWQgc28gZGV2ZWxvcGVycyBjYW4gZmlndXJlIG91dCB3aGF0IHdlbnQgd3JvbmcuCisgKi8KK3N0YXRpYyB2b2lkCitub19tYXRjaGluZ19mdW5jdGlvbl9lcnJvcihjb25zdCBjaGFyICpuYW1lLAorCQkJICAgWVlMVFlQRSAqbG9jLAorCQkJICAgZXhlY19saXN0ICphY3R1YWxfcGFyYW1ldGVycywKKwkJCSAgIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgZ2xfc2hhZGVyICpzaCA9IF9tZXNhX2dsc2xfZ2V0X2J1aWx0aW5fZnVuY3Rpb25fc2hhZGVyKCk7CisKKyAgIGlmIChzdGF0ZS0+c3ltYm9scy0+Z2V0X2Z1bmN0aW9uKG5hbWUpID09IE5VTEwKKyAgICAgICYmICghc3RhdGUtPnVzZXNfYnVpbHRpbl9mdW5jdGlvbnMKKyAgICAgICAgICB8fCBzaC0+c3ltYm9scy0+Z2V0X2Z1bmN0aW9uKG5hbWUpID09IE5VTEwpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJubyBmdW5jdGlvbiB3aXRoIG5hbWUgJyVzJyIsIG5hbWUpOworICAgfSBlbHNlIHsKKyAgICAgIGNoYXIgKnN0ciA9IHByb3RvdHlwZV9zdHJpbmcoTlVMTCwgbmFtZSwgYWN0dWFsX3BhcmFtZXRlcnMpOworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gYCVzJzsgY2FuZGlkYXRlcyBhcmU6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgIHJhbGxvY19mcmVlKHN0cik7CisKKyAgICAgIHByaW50X2Z1bmN0aW9uX3Byb3RvdHlwZXMoc3RhdGUsIGxvYywgc3RhdGUtPnN5bWJvbHMtPmdldF9mdW5jdGlvbihuYW1lKSk7CisKKyAgICAgIGlmIChzdGF0ZS0+dXNlc19idWlsdGluX2Z1bmN0aW9ucykgeworICAgICAgICAgcHJpbnRfZnVuY3Rpb25fcHJvdG90eXBlcyhzdGF0ZSwgbG9jLCBzaC0+c3ltYm9scy0+Z2V0X2Z1bmN0aW9uKG5hbWUpKTsKKyAgICAgIH0KKyAgIH0KK30KKworLyoqCisgKiBQZXJmb3JtIGF1dG9tYXRpYyB0eXBlIGNvbnZlcnNpb24gb2YgY29uc3RydWN0b3IgcGFyYW1ldGVycworICoKKyAqIFRoaXMgaW1wbGVtZW50cyB0aGUgcnVsZXMgaW4gdGhlICJDb252ZXJzaW9uIGFuZCBTY2FsYXIgQ29uc3RydWN0b3JzIgorICogc2VjdGlvbiAoR0xTTCAxLjEwIHNlY3Rpb24gNS40LjEpLCBub3QgdGhlICJJbXBsaWNpdCBDb252ZXJzaW9ucyIgcnVsZXMuCisgKi8KK3N0YXRpYyBpcl9ydmFsdWUgKgorY29udmVydF9jb21wb25lbnQoaXJfcnZhbHVlICpzcmMsIGNvbnN0IGdsc2xfdHlwZSAqZGVzaXJlZF90eXBlKQoreworICAgdm9pZCAqY3R4ID0gcmFsbG9jX3BhcmVudChzcmMpOworICAgY29uc3QgdW5zaWduZWQgYSA9IGRlc2lyZWRfdHlwZS0+YmFzZV90eXBlOworICAgY29uc3QgdW5zaWduZWQgYiA9IHNyYy0+dHlwZS0+YmFzZV90eXBlOworICAgaXJfZXhwcmVzc2lvbiAqcmVzdWx0ID0gTlVMTDsKKworICAgaWYgKHNyYy0+dHlwZS0+aXNfZXJyb3IoKSkKKyAgICAgIHJldHVybiBzcmM7CisKKyAgIGFzc2VydChhIDw9IEdMU0xfVFlQRV9CT09MKTsKKyAgIGFzc2VydChiIDw9IEdMU0xfVFlQRV9CT09MKTsKKworICAgaWYgKGEgPT0gYikKKyAgICAgIHJldHVybiBzcmM7CisKKyAgIHN3aXRjaCAoYSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgICAgIHN3aXRjaCAoYikgeworICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfaTJ1LCBzcmMpOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfZjJ1LCBzcmMpOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6CisJIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9pMnUsCisJCSAgbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2IyaSwgc3JjKSk7CisJIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICAgICBzd2l0Y2ggKGIpIHsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF91MmksIHNyYyk7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9mMmksIHNyYyk7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2IyaSwgc3JjKTsKKwkgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgICAgc3dpdGNoIChiKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfdTJmLCBkZXNpcmVkX3R5cGUsIHNyYywgTlVMTCk7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfaTJmLCBkZXNpcmVkX3R5cGUsIHNyYywgTlVMTCk7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2IyZiwgZGVzaXJlZF90eXBlLCBzcmMsIE5VTEwpOworCSBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIHN3aXRjaCAoYikgeworICAgICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2kyYiwKKwkJICBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfdTJpLCBzcmMpKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9pMmIsIGRlc2lyZWRfdHlwZSwgc3JjLCBOVUxMKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2YyYiwgZGVzaXJlZF90eXBlLCBzcmMsIE5VTEwpOworCSBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorCisgICBhc3NlcnQocmVzdWx0ICE9IE5VTEwpOworICAgYXNzZXJ0KHJlc3VsdC0+dHlwZSA9PSBkZXNpcmVkX3R5cGUpOworCisgICAvKiBUcnkgY29uc3RhbnQgZm9sZGluZzsgaXQgbWF5IGZvbGQgaW4gdGhlIGNvbnZlcnNpb24gd2UganVzdCBhZGRlZC4gKi8KKyAgIGlyX2NvbnN0YW50ICpjb25zdCBjb25zdGFudCA9IHJlc3VsdC0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworICAgcmV0dXJuIChjb25zdGFudCAhPSBOVUxMKSA/IChpcl9ydmFsdWUgKikgY29uc3RhbnQgOiAoaXJfcnZhbHVlICopIHJlc3VsdDsKK30KKworLyoqCisgKiBEZXJlZmVyZW5jZSBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIGEgc2NhbGFyLCB2ZWN0b3IsIG9yIG1hdHJpeAorICovCitzdGF0aWMgaXJfcnZhbHVlICoKK2RlcmVmZXJlbmNlX2NvbXBvbmVudChpcl9ydmFsdWUgKnNyYywgdW5zaWduZWQgY29tcG9uZW50KQoreworICAgdm9pZCAqY3R4ID0gcmFsbG9jX3BhcmVudChzcmMpOworICAgYXNzZXJ0KGNvbXBvbmVudCA8IHNyYy0+dHlwZS0+Y29tcG9uZW50cygpKTsKKworICAgLyogSWYgdGhlIHNvdXJjZSBpcyBhIGNvbnN0YW50LCBqdXN0IGNyZWF0ZSBhIG5ldyBjb25zdGFudCBpbnN0ZWFkIG9mIGEKKyAgICAqIGRlcmVmZXJlbmNlIG9mIHRoZSBleGlzdGluZyBjb25zdGFudC4KKyAgICAqLworICAgaXJfY29uc3RhbnQgKmNvbnN0YW50ID0gc3JjLT5hc19jb25zdGFudCgpOworICAgaWYgKGNvbnN0YW50KQorICAgICAgcmV0dXJuIG5ldyhjdHgpIGlyX2NvbnN0YW50KGNvbnN0YW50LCBjb21wb25lbnQpOworCisgICBpZiAoc3JjLT50eXBlLT5pc19zY2FsYXIoKSkgeworICAgICAgcmV0dXJuIHNyYzsKKyAgIH0gZWxzZSBpZiAoc3JjLT50eXBlLT5pc192ZWN0b3IoKSkgeworICAgICAgcmV0dXJuIG5ldyhjdHgpIGlyX3N3aXp6bGUoc3JjLCBjb21wb25lbnQsIDAsIDAsIDAsIDEpOworICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChzcmMtPnR5cGUtPmlzX21hdHJpeCgpKTsKKworICAgICAgLyogRGVyZWZlcmVuY2UgYSByb3cgb2YgdGhlIG1hdHJpeCwgdGhlbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4gdG8gZ2V0CisgICAgICAgKiBhIHNwZWNpZmljIGVsZW1lbnQgZnJvbSB0aGF0IHJvdy4KKyAgICAgICAqLworICAgICAgY29uc3QgaW50IGMgPSBjb21wb25lbnQgLyBzcmMtPnR5cGUtPmNvbHVtbl90eXBlKCktPnZlY3Rvcl9lbGVtZW50czsKKyAgICAgIGNvbnN0IGludCByID0gY29tcG9uZW50ICUgc3JjLT50eXBlLT5jb2x1bW5fdHlwZSgpLT52ZWN0b3JfZWxlbWVudHM7CisgICAgICBpcl9jb25zdGFudCAqY29uc3QgY29sX2luZGV4ID0gbmV3KGN0eCkgaXJfY29uc3RhbnQoYyk7CisgICAgICBpcl9kZXJlZmVyZW5jZSAqY29uc3QgY29sID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkoc3JjLCBjb2xfaW5kZXgpOworCisgICAgICBjb2wtPnR5cGUgPSBzcmMtPnR5cGUtPmNvbHVtbl90eXBlKCk7CisKKyAgICAgIHJldHVybiBkZXJlZmVyZW5jZV9jb21wb25lbnQoY29sLCByKTsKKyAgIH0KKworICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKyAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBpcl9ydmFsdWUgKgorcHJvY2Vzc192ZWNfbWF0X2NvbnN0cnVjdG9yKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3RydWN0b3JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWUxUWVBFICpsb2MsIGV4ZWNfbGlzdCAqcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKworICAgLyogVGhlIEFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgc3BlYyBzYXlzOgorICAgICoKKyAgICAqICJJZiBhbiBpbml0aWFsaXplciBpcyBhIGxpc3Qgb2YgaW5pdGlhbGl6ZXJzIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcywKKyAgICAqICB0aGUgdmFyaWFibGUgYmVpbmcgZGVjbGFyZWQgbXVzdCBiZSBhIHZlY3RvciwgYSBtYXRyaXgsIGFuIGFycmF5LCBvciBhCisgICAgKiAgc3RydWN0dXJlLgorICAgICoKKyAgICAqICAgICAgaW50IGkgPSB7IDEgfTsgLy8gaWxsZWdhbCwgaSBpcyBub3QgYW4gYWdncmVnYXRlIgorICAgICovCisgICBpZiAoY29uc3RydWN0b3JfdHlwZS0+dmVjdG9yX2VsZW1lbnRzIDw9IDEpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgImFnZ3JlZ2F0ZXMgY2FuIG9ubHkgaW5pdGlhbGl6ZSB2ZWN0b3JzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJtYXRyaWNlcywgYXJyYXlzLCBhbmQgc3RydWN0cyIpOworICAgICAgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgIH0KKworICAgZXhlY19saXN0IGFjdHVhbF9wYXJhbWV0ZXJzOworICAgY29uc3QgdW5zaWduZWQgcGFyYW1ldGVyX2NvdW50ID0KKyAgICAgIHByb2Nlc3NfcGFyYW1ldGVycyhpbnN0cnVjdGlvbnMsICZhY3R1YWxfcGFyYW1ldGVycywgcGFyYW1ldGVycywgc3RhdGUpOworCisgICBpZiAocGFyYW1ldGVyX2NvdW50ID09IDAKKyAgICAgICB8fCAoY29uc3RydWN0b3JfdHlwZS0+aXNfdmVjdG9yKCkgJiYKKyAgICAgICAgICAgY29uc3RydWN0b3JfdHlwZS0+dmVjdG9yX2VsZW1lbnRzICE9IHBhcmFtZXRlcl9jb3VudCkKKyAgICAgICB8fCAoY29uc3RydWN0b3JfdHlwZS0+aXNfbWF0cml4KCkgJiYKKyAgICAgICAgICAgY29uc3RydWN0b3JfdHlwZS0+bWF0cml4X2NvbHVtbnMgIT0gcGFyYW1ldGVyX2NvdW50KSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLCAiJXMgY29uc3RydWN0b3IgbXVzdCBoYXZlICV1IHBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcl90eXBlLT5pc192ZWN0b3IoKSA/ICJ2ZWN0b3IiIDogIm1hdHJpeCIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yX3R5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICAgICByZXR1cm4gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgfQorCisgICBib29sIGFsbF9wYXJhbWV0ZXJzX2FyZV9jb25zdGFudCA9IHRydWU7CisKKyAgIC8qIFR5cGUgY2FzdCBlYWNoIHBhcmFtZXRlciBhbmQsIGlmIHBvc3NpYmxlLCBmb2xkIGNvbnN0YW50cy4gKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG4sICZhY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICppciA9IChpcl9ydmFsdWUgKikgbjsKKyAgICAgIGlyX3J2YWx1ZSAqcmVzdWx0ID0gaXI7CisKKyAgICAgIC8qIEFwcGx5IGltcGxpY2l0IGNvbnZlcnNpb25zIChub3QgdGhlIHNjYWxhciBjb25zdHJ1Y3RvciBydWxlcyEpLiBTZWUKKyAgICAgICAqIHRoZSBzcGVjIHF1b3RlIGFib3ZlLiAqLworICAgICAgaWYgKGNvbnN0cnVjdG9yX3R5cGUtPmlzX2Zsb2F0KCkpIHsKKyAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqZGVzaXJlZF90eXBlID0KKyAgICAgICAgICAgIGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9GTE9BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+dHlwZS0+bWF0cml4X2NvbHVtbnMpOworICAgICAgICAgaWYgKHJlc3VsdC0+dHlwZS0+Y2FuX2ltcGxpY2l0bHlfY29udmVydF90byhkZXNpcmVkX3R5cGUpKSB7CisgICAgICAgICAgICAvKiBFdmVuIHRob3VnaCBjb252ZXJ0X2NvbXBvbmVudCgpIGltcGxlbWVudHMgdGhlIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgKiBjb252ZXJzaW9uIHJ1bGVzIChub3QgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMpLCBpdHMgc2FmZQorICAgICAgICAgICAgICogdG8gdXNlIGl0IGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgaW1wbGljaXQKKyAgICAgICAgICAgICAqIGNvbnZlcnNpb24gaXMgbGVnYWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IGNvbnZlcnRfY29tcG9uZW50KGlyLCBkZXNpcmVkX3R5cGUpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY29uc3RydWN0b3JfdHlwZS0+aXNfbWF0cml4KCkpIHsKKyAgICAgICAgIGlmIChyZXN1bHQtPnR5cGUgIT0gY29uc3RydWN0b3JfdHlwZS0+Y29sdW1uX3R5cGUoKSkgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLCAidHlwZSBlcnJvciBpbiBtYXRyaXggY29uc3RydWN0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkOiAlcywgZm91bmQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcl90eXBlLT5jb2x1bW5fdHlwZSgpLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPnR5cGUtPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocmVzdWx0LT50eXBlICE9IGNvbnN0cnVjdG9yX3R5cGUtPmdldF9zY2FsYXJfdHlwZSgpKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJ0eXBlIGVycm9yIGluIHZlY3RvciBjb25zdHJ1Y3RvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQ6ICVzLCBmb3VuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yX3R5cGUtPmdldF9zY2FsYXJfdHlwZSgpLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPnR5cGUtPm5hbWUpOworICAgICAgICAgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgICAgIH0KKworICAgICAgLyogQXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBwYXJhbWV0ZXIgdG8gYSBjb25zdGFudCB2YWx1ZWQgZXhwcmVzc2lvbi4KKyAgICAgICAqIEFmdGVyIGRvaW5nIHNvLCB0cmFjayB3aGV0aGVyIG9yIG5vdCBhbGwgdGhlIHBhcmFtZXRlcnMgdG8gdGhlCisgICAgICAgKiBjb25zdHJ1Y3RvciBhcmUgdHJpdmlhbGx5IGNvbnN0YW50IHZhbHVlZCBleHByZXNzaW9ucy4KKyAgICAgICAqLworICAgICAgaXJfcnZhbHVlICpjb25zdCBjb25zdGFudCA9IHJlc3VsdC0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworCisgICAgICBpZiAoY29uc3RhbnQgIT0gTlVMTCkKKyAgICAgICAgIHJlc3VsdCA9IGNvbnN0YW50OworICAgICAgZWxzZQorICAgICAgICAgYWxsX3BhcmFtZXRlcnNfYXJlX2NvbnN0YW50ID0gZmFsc2U7CisKKyAgICAgIGlyLT5yZXBsYWNlX3dpdGgocmVzdWx0KTsKKyAgIH0KKworICAgaWYgKGFsbF9wYXJhbWV0ZXJzX2FyZV9jb25zdGFudCkKKyAgICAgIHJldHVybiBuZXcoY3R4KSBpcl9jb25zdGFudChjb25zdHJ1Y3Rvcl90eXBlLCAmYWN0dWFsX3BhcmFtZXRlcnMpOworCisgICBpcl92YXJpYWJsZSAqdmFyID0gbmV3KGN0eCkgaXJfdmFyaWFibGUoY29uc3RydWN0b3JfdHlwZSwgInZlY19tYXRfY3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbCh2YXIpOworCisgICBpbnQgaSA9IDA7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmYWN0dWFsX3BhcmFtZXRlcnMpIHsKKyAgICAgIGlyX3J2YWx1ZSAqcmhzID0gKGlyX3J2YWx1ZSAqKSBub2RlOworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmFzc2lnbm1lbnQgPSBOVUxMOworCisgICAgICBpZiAodmFyLT50eXBlLT5pc19tYXRyaXgoKSkgeworICAgICAgICAgaXJfcnZhbHVlICpsaHMgPSBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheSh2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcoY3R4KSBpcl9jb25zdGFudChpKSk7CisgICAgICAgICBhc3NpZ25tZW50ID0gbmV3KGN0eCkgaXJfYXNzaWdubWVudChsaHMsIHJocywgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgLyogdXNlIHdyaXRlbWFzayByYXRoZXIgdGhhbiBpbmRleCBmb3IgdmVjdG9yICovCisgICAgICAgICBhc3NlcnQodmFyLT50eXBlLT5pc192ZWN0b3IoKSk7CisgICAgICAgICBhc3NlcnQoaSA8IDQpOworICAgICAgICAgaXJfZGVyZWZlcmVuY2UgKmxocyA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICAgICAgICBhc3NpZ25tZW50ID0gbmV3KGN0eCkgaXJfYXNzaWdubWVudChsaHMsIHJocywgTlVMTCwgKHVuc2lnbmVkKSgxIDw8IGkpKTsKKyAgICAgIH0KKworICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoYXNzaWdubWVudCk7CisKKyAgICAgIGkrKzsKKyAgIH0KKworICAgcmV0dXJuIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7Cit9CisKKworc3RhdGljIGlyX3J2YWx1ZSAqCitwcm9jZXNzX2FycmF5X2NvbnN0cnVjdG9yKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0cnVjdG9yX3R5cGUsCisJCQkgIFlZTFRZUEUgKmxvYywgZXhlY19saXN0ICpwYXJhbWV0ZXJzLAorCQkJICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgIC8qIEFycmF5IGNvbnN0cnVjdG9ycyBjb21lIGluIHR3byBmb3Jtczogc2l6ZWQgYW5kIHVuc2l6ZWQuICBTaXplZCBhcnJheQorICAgICogY29uc3RydWN0b3JzIGxvb2sgbGlrZSAndmVjNFsyXShhLCBiKScsIHdoZXJlICdhJyBhbmQgJ2InIGFyZSB2ZWM0CisgICAgKiB2YXJpYWJsZXMuICBJbiB0aGlzIGNhc2UgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG11c3QgZXhhY3RseSBtYXRjaCB0aGUKKyAgICAqIHNwZWNpZmllZCBzaXplIG9mIHRoZSBhcnJheS4KKyAgICAqCisgICAgKiBVbnNpemVkIGFycmF5IGNvbnN0cnVjdG9ycyBsb29rIGxpa2UgJ3ZlYzRbXShhLCBiKScsIHdoZXJlICdhJyBhbmQgJ2InCisgICAgKiBhcmUgdmVjNCB2YXJpYWJsZXMuICBJbiB0aGlzIGNhc2UgdGhlIHNpemUgb2YgdGhlIGFycmF5IGJlaW5nIGNvbnN0cnVjdGVkCisgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycy4KKyAgICAqCisgICAgKiBGcm9tIHBhZ2UgNTIgKHBhZ2UgNTggb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS41MCBzcGVjOgorICAgICoKKyAgICAqICAgICJUaGVyZSBtdXN0IGJlIGV4YWN0bHkgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcyB0aGUgc2l6ZSBvZgorICAgICogICAgdGhlIGFycmF5IGJlaW5nIGNvbnN0cnVjdGVkLiBJZiBubyBzaXplIGlzIHByZXNlbnQgaW4gdGhlCisgICAgKiAgICBjb25zdHJ1Y3RvciwgdGhlbiB0aGUgYXJyYXkgaXMgZXhwbGljaXRseSBzaXplZCB0byB0aGUgbnVtYmVyIG9mCisgICAgKiAgICBhcmd1bWVudHMgcHJvdmlkZWQuIFRoZSBhcmd1bWVudHMgYXJlIGFzc2lnbmVkIGluIG9yZGVyLCBzdGFydGluZyBhdAorICAgICogICAgZWxlbWVudCAwLCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbnN0cnVjdGVkIGFycmF5LiBFYWNoIGFyZ3VtZW50CisgICAgKiAgICBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYXJyYXksIG9yIGJlIGEgdHlwZQorICAgICogICAgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFycmF5IGFjY29yZGluZyB0bworICAgICogICAgU2VjdGlvbiA0LjEuMTAgIkltcGxpY2l0IENvbnZlcnNpb25zLiIiCisgICAgKi8KKyAgIGV4ZWNfbGlzdCBhY3R1YWxfcGFyYW1ldGVyczsKKyAgIGNvbnN0IHVuc2lnbmVkIHBhcmFtZXRlcl9jb3VudCA9CisgICAgICBwcm9jZXNzX3BhcmFtZXRlcnMoaW5zdHJ1Y3Rpb25zLCAmYWN0dWFsX3BhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIHN0YXRlKTsKKyAgIGJvb2wgaXNfdW5zaXplZF9hcnJheSA9IGNvbnN0cnVjdG9yX3R5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKTsKKworICAgaWYgKChwYXJhbWV0ZXJfY291bnQgPT0gMCkgfHwKKyAgICAgICAoIWlzX3Vuc2l6ZWRfYXJyYXkgJiYgKGNvbnN0cnVjdG9yX3R5cGUtPmxlbmd0aCAhPSBwYXJhbWV0ZXJfY291bnQpKSkgeworICAgICAgY29uc3QgdW5zaWduZWQgbWluX3BhcmFtID0gaXNfdW5zaXplZF9hcnJheQorICAgICAgICAgPyAxIDogY29uc3RydWN0b3JfdHlwZS0+bGVuZ3RoOworCisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJhcnJheSBjb25zdHJ1Y3RvciBtdXN0IGhhdmUgJXMgJXUgIgorCQkgICAgICAgInBhcmFtZXRlciVzIiwKKwkJICAgICAgIGlzX3Vuc2l6ZWRfYXJyYXkgPyAiYXQgbGVhc3QiIDogImV4YWN0bHkiLAorCQkgICAgICAgbWluX3BhcmFtLCAobWluX3BhcmFtIDw9IDEpID8gIiIgOiAicyIpOworICAgICAgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgIH0KKworICAgaWYgKGlzX3Vuc2l6ZWRfYXJyYXkpIHsKKyAgICAgIGNvbnN0cnVjdG9yX3R5cGUgPQorCSBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZShjb25zdHJ1Y3Rvcl90eXBlLT5lbGVtZW50X3R5cGUoKSwKKwkJCQkgICAgICAgcGFyYW1ldGVyX2NvdW50KTsKKyAgICAgIGFzc2VydChjb25zdHJ1Y3Rvcl90eXBlICE9IE5VTEwpOworICAgICAgYXNzZXJ0KGNvbnN0cnVjdG9yX3R5cGUtPmxlbmd0aCA9PSBwYXJhbWV0ZXJfY291bnQpOworICAgfQorCisgICBib29sIGFsbF9wYXJhbWV0ZXJzX2FyZV9jb25zdGFudCA9IHRydWU7CisKKyAgIC8qIFR5cGUgY2FzdCBlYWNoIHBhcmFtZXRlciBhbmQsIGlmIHBvc3NpYmxlLCBmb2xkIGNvbnN0YW50cy4gKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG4sICZhY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICppciA9IChpcl9ydmFsdWUgKikgbjsKKyAgICAgIGlyX3J2YWx1ZSAqcmVzdWx0ID0gaXI7CisKKyAgICAgIC8qIEFwcGx5IGltcGxpY2l0IGNvbnZlcnNpb25zIChub3QgdGhlIHNjYWxhciBjb25zdHJ1Y3RvciBydWxlcyEpLiBTZWUKKyAgICAgICAqIHRoZSBzcGVjIHF1b3RlIGFib3ZlLiAqLworICAgICAgaWYgKGNvbnN0cnVjdG9yX3R5cGUtPmVsZW1lbnRfdHlwZSgpLT5pc19mbG9hdCgpKSB7CisJIGNvbnN0IGdsc2xfdHlwZSAqZGVzaXJlZF90eXBlID0KKwkgICAgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0ZMT0FULAorCQkJCSAgICBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzLAorCQkJCSAgICBpci0+dHlwZS0+bWF0cml4X2NvbHVtbnMpOworCSBpZiAocmVzdWx0LT50eXBlLT5jYW5faW1wbGljaXRseV9jb252ZXJ0X3RvKGRlc2lyZWRfdHlwZSkpIHsKKwkgICAgLyogRXZlbiB0aG91Z2ggY29udmVydF9jb21wb25lbnQoKSBpbXBsZW1lbnRzIHRoZSBjb25zdHJ1Y3RvcgorCSAgICAgKiBjb252ZXJzaW9uIHJ1bGVzIChub3QgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMpLCBpdHMgc2FmZQorCSAgICAgKiB0byB1c2UgaXQgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBpbXBsaWNpdAorCSAgICAgKiBjb252ZXJzaW9uIGlzIGxlZ2FsLgorCSAgICAgKi8KKwkgICAgcmVzdWx0ID0gY29udmVydF9jb21wb25lbnQoaXIsIGRlc2lyZWRfdHlwZSk7CisJIH0KKyAgICAgIH0KKworICAgICAgaWYgKHJlc3VsdC0+dHlwZSAhPSBjb25zdHJ1Y3Rvcl90eXBlLT5lbGVtZW50X3R5cGUoKSkgeworCSBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJ0eXBlIGVycm9yIGluIGFycmF5IGNvbnN0cnVjdG9yOiAiCisJCQkgICJleHBlY3RlZDogJXMsIGZvdW5kICVzIiwKKwkJCSAgY29uc3RydWN0b3JfdHlwZS0+ZWxlbWVudF90eXBlKCktPm5hbWUsCisJCQkgIHJlc3VsdC0+dHlwZS0+bmFtZSk7CisgICAgICAgICByZXR1cm4gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgICAgfQorCisgICAgICAvKiBBdHRlbXB0IHRvIGNvbnZlcnQgdGhlIHBhcmFtZXRlciB0byBhIGNvbnN0YW50IHZhbHVlZCBleHByZXNzaW9uLgorICAgICAgICogQWZ0ZXIgZG9pbmcgc28sIHRyYWNrIHdoZXRoZXIgb3Igbm90IGFsbCB0aGUgcGFyYW1ldGVycyB0byB0aGUKKyAgICAgICAqIGNvbnN0cnVjdG9yIGFyZSB0cml2aWFsbHkgY29uc3RhbnQgdmFsdWVkIGV4cHJlc3Npb25zLgorICAgICAgICovCisgICAgICBpcl9ydmFsdWUgKmNvbnN0IGNvbnN0YW50ID0gcmVzdWx0LT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisKKyAgICAgIGlmIChjb25zdGFudCAhPSBOVUxMKQorICAgICAgICAgcmVzdWx0ID0gY29uc3RhbnQ7CisgICAgICBlbHNlCisgICAgICAgICBhbGxfcGFyYW1ldGVyc19hcmVfY29uc3RhbnQgPSBmYWxzZTsKKworICAgICAgaXItPnJlcGxhY2Vfd2l0aChyZXN1bHQpOworICAgfQorCisgICBpZiAoYWxsX3BhcmFtZXRlcnNfYXJlX2NvbnN0YW50KQorICAgICAgcmV0dXJuIG5ldyhjdHgpIGlyX2NvbnN0YW50KGNvbnN0cnVjdG9yX3R5cGUsICZhY3R1YWxfcGFyYW1ldGVycyk7CisKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBuZXcoY3R4KSBpcl92YXJpYWJsZShjb25zdHJ1Y3Rvcl90eXBlLCAiYXJyYXlfY3RvciIsCisJCQkJCSAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwodmFyKTsKKworICAgaW50IGkgPSAwOworICAgZm9yZWFjaF9saXN0KG5vZGUsICZhY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICpyaHMgPSAoaXJfcnZhbHVlICopIG5vZGU7CisgICAgICBpcl9ydmFsdWUgKmxocyA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KHZhciwKKwkJCQkJCSAgICAgbmV3KGN0eCkgaXJfY29uc3RhbnQoaSkpOworCisgICAgICBpcl9pbnN0cnVjdGlvbiAqYXNzaWdubWVudCA9IG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCByaHMsIE5VTEwpOworICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoYXNzaWdubWVudCk7CisKKyAgICAgIGkrKzsKKyAgIH0KKworICAgcmV0dXJuIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7Cit9CisKKworLyoqCisgKiBUcnkgdG8gY29udmVydCBhIHJlY29yZCBjb25zdHJ1Y3RvciB0byBhIGNvbnN0YW50IGV4cHJlc3Npb24KKyAqLworc3RhdGljIGlyX2NvbnN0YW50ICoKK2NvbnN0YW50X3JlY29yZF9jb25zdHJ1Y3Rvcihjb25zdCBnbHNsX3R5cGUgKmNvbnN0cnVjdG9yX3R5cGUsCisJCQkgICAgZXhlY19saXN0ICpwYXJhbWV0ZXJzLCB2b2lkICptZW1fY3R4KQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsIHBhcmFtZXRlcnMpIHsKKyAgICAgIGlyX2NvbnN0YW50ICpjb25zdGFudCA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX2NvbnN0YW50KCk7CisgICAgICBpZiAoY29uc3RhbnQgPT0gTlVMTCkKKwkgcmV0dXJuIE5VTEw7CisgICAgICBub2RlLT5yZXBsYWNlX3dpdGgoY29uc3RhbnQpOworICAgfQorCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGNvbnN0cnVjdG9yX3R5cGUsIHBhcmFtZXRlcnMpOworfQorCisKKy8qKgorICogRGV0ZXJtaW5lIGlmIGEgbGlzdCBjb25zaXN0cyBvZiBhIHNpbmdsZSBzY2FsYXIgci12YWx1ZQorICovCitib29sCitzaW5nbGVfc2NhbGFyX3BhcmFtZXRlcihleGVjX2xpc3QgKnBhcmFtZXRlcnMpCit7CisgICBjb25zdCBpcl9ydmFsdWUgKmNvbnN0IHAgPSAoaXJfcnZhbHVlICopIHBhcmFtZXRlcnMtPmhlYWQ7CisgICBhc3NlcnQoKChpcl9ydmFsdWUgKilwKS0+YXNfcnZhbHVlKCkgIT0gTlVMTCk7CisKKyAgIHJldHVybiAocC0+dHlwZS0+aXNfc2NhbGFyKCkgJiYgcC0+bmV4dC0+aXNfdGFpbF9zZW50aW5lbCgpKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlIGlubGluZSBjb2RlIGZvciBhIHZlY3RvciBjb25zdHJ1Y3RvcgorICoKKyAqIFRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3IgY29kZSB3aWxsIGNvbnNpc3Qgb2YgYSB0ZW1wb3JhcnkgdmFyaWFibGUKKyAqIGRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGNvbnN0cnVjdG9yLiAgQSBzZXF1ZW5jZSBvZiBhc3NpZ25tZW50cworICogZnJvbSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRvIHRoZSB0ZW1wb3Jhcnkgd2lsbCBmb2xsb3cuCisgKgorICogXHJldHVybgorICogQW4gXGMgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgb2YgdGhlIHRlbXByb3JhcnkgZ2VuZXJhdGVkIGluIHRoZSBjb25zdHJ1Y3RvcgorICogYm9keS4KKyAqLworaXJfcnZhbHVlICoKK2VtaXRfaW5saW5lX3ZlY3Rvcl9jb25zdHJ1Y3Rvcihjb25zdCBnbHNsX3R5cGUgKnR5cGUsCisJCQkgICAgICAgZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgICAgICAgZXhlY19saXN0ICpwYXJhbWV0ZXJzLAorCQkJICAgICAgIHZvaWQgKmN0eCkKK3sKKyAgIGFzc2VydCghcGFyYW1ldGVycy0+aXNfZW1wdHkoKSk7CisKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBuZXcoY3R4KSBpcl92YXJpYWJsZSh0eXBlLCAidmVjX2N0b3IiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHZhcik7CisKKyAgIC8qIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgdmVjdG9yIGNvbnN0cnVjdG9ycy4KKyAgICAqCisgICAgKiAgLSBDb25zdHJ1Y3QgYSB2ZWN0b3IgZnJvbSBhIHNpbmdsZSBzY2FsYXIgYnkgcmVwbGljYXRpbmcgdGhhdCBzY2FsYXIgdG8KKyAgICAqICAgIGFsbCBjb21wb25lbnRzIG9mIHRoZSB2ZWN0b3IuCisgICAgKgorICAgICogIC0gQ29uc3RydWN0IGEgdmVjdG9yIGZyb20gYW4gYXJiaXJhcnkgY29tYmluYXRpb24gb2YgdmVjdG9ycyBhbmQKKyAgICAqICAgIHNjYWxhcnMuICBUaGUgY29tcG9uZW50cyBvZiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyBhcmUgYXNzaWduZWQKKyAgICAqICAgIHRvIHRoZSB2ZWN0b3IgaW4gb3JkZXIgdW50aWwgdGhlIHZlY3RvciBpcyBmdWxsLgorICAgICovCisgICBjb25zdCB1bnNpZ25lZCBsaHNfY29tcG9uZW50cyA9IHR5cGUtPmNvbXBvbmVudHMoKTsKKyAgIGlmIChzaW5nbGVfc2NhbGFyX3BhcmFtZXRlcihwYXJhbWV0ZXJzKSkgeworICAgICAgaXJfcnZhbHVlICpmaXJzdF9wYXJhbSA9IChpcl9ydmFsdWUgKilwYXJhbWV0ZXJzLT5oZWFkOworICAgICAgaXJfcnZhbHVlICpyaHMgPSBuZXcoY3R4KSBpcl9zd2l6emxlKGZpcnN0X3BhcmFtLCAwLCAwLCAwLCAwLAorCQkJCQkgICBsaHNfY29tcG9uZW50cyk7CisgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqbGhzID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIG1hc2sgPSAoMVUgPDwgbGhzX2NvbXBvbmVudHMpIC0gMTsKKworICAgICAgYXNzZXJ0KHJocy0+dHlwZSA9PSBsaHMtPnR5cGUpOworCisgICAgICBpcl9pbnN0cnVjdGlvbiAqaW5zdCA9IG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCByaHMsIE5VTEwsIG1hc2spOworICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgYmFzZV9jb21wb25lbnQgPSAwOworICAgICAgdW5zaWduZWQgYmFzZV9saHNfY29tcG9uZW50ID0gMDsKKyAgICAgIGlyX2NvbnN0YW50X2RhdGEgZGF0YTsKKyAgICAgIHVuc2lnbmVkIGNvbnN0YW50X21hc2sgPSAwLCBjb25zdGFudF9jb21wb25lbnRzID0gMDsKKworICAgICAgbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgcGFyYW1ldGVycykgeworCSBpcl9ydmFsdWUgKnBhcmFtID0gKGlyX3J2YWx1ZSAqKSBub2RlOworCSB1bnNpZ25lZCByaHNfY29tcG9uZW50cyA9IHBhcmFtLT50eXBlLT5jb21wb25lbnRzKCk7CisKKwkgLyogRG8gbm90IHRyeSB0byBhc3NpZ24gbW9yZSBjb21wb25lbnRzIHRvIHRoZSB2ZWN0b3IgdGhhbiBpdCBoYXMhCisJICAqLworCSBpZiAoKHJoc19jb21wb25lbnRzICsgYmFzZV9saHNfY29tcG9uZW50KSA+IGxoc19jb21wb25lbnRzKSB7CisJICAgIHJoc19jb21wb25lbnRzID0gbGhzX2NvbXBvbmVudHMgLSBiYXNlX2xoc19jb21wb25lbnQ7CisJIH0KKworCSBjb25zdCBpcl9jb25zdGFudCAqY29uc3QgYyA9IHBhcmFtLT5hc19jb25zdGFudCgpOworCSBpZiAoYyAhPSBOVUxMKSB7CisJICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByaHNfY29tcG9uZW50czsgaSsrKSB7CisJICAgICAgIHN3aXRjaCAoYy0+dHlwZS0+YmFzZV90eXBlKSB7CisJICAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJCSAgZGF0YS51W2kgKyBiYXNlX2NvbXBvbmVudF0gPSBjLT5nZXRfdWludF9jb21wb25lbnQoaSk7CisJCSAgYnJlYWs7CisJICAgICAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkJICBkYXRhLmlbaSArIGJhc2VfY29tcG9uZW50XSA9IGMtPmdldF9pbnRfY29tcG9uZW50KGkpOworCQkgIGJyZWFrOworCSAgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkJICBkYXRhLmZbaSArIGJhc2VfY29tcG9uZW50XSA9IGMtPmdldF9mbG9hdF9jb21wb25lbnQoaSk7CisJCSAgYnJlYWs7CisJICAgICAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6CisJCSAgZGF0YS5iW2kgKyBiYXNlX2NvbXBvbmVudF0gPSBjLT5nZXRfYm9vbF9jb21wb25lbnQoaSk7CisJCSAgYnJlYWs7CisJICAgICAgIGRlZmF1bHQ6CisJCSAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKwkJICBicmVhazsKKwkgICAgICAgfQorCSAgICB9CisKKwkgICAgLyogTWFzayBvZiBmaWVsZHMgdG8gYmUgd3JpdHRlbiBpbiB0aGUgYXNzaWdubWVudC4KKwkgICAgICovCisJICAgIGNvbnN0YW50X21hc2sgfD0gKCgxVSA8PCByaHNfY29tcG9uZW50cykgLSAxKSA8PCBiYXNlX2xoc19jb21wb25lbnQ7CisJICAgIGNvbnN0YW50X2NvbXBvbmVudHMgKz0gcmhzX2NvbXBvbmVudHM7CisKKwkgICAgYmFzZV9jb21wb25lbnQgKz0gcmhzX2NvbXBvbmVudHM7CisJIH0KKwkgLyogQWR2YW5jZSB0aGUgY29tcG9uZW50IGluZGV4IGJ5IHRoZSBudW1iZXIgb2YgY29tcG9uZW50cworCSAgKiB0aGF0IHdlcmUganVzdCBhc3NpZ25lZC4KKwkgICovCisJIGJhc2VfbGhzX2NvbXBvbmVudCArPSByaHNfY29tcG9uZW50czsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbnN0YW50X21hc2sgIT0gMCkgeworCSBpcl9kZXJlZmVyZW5jZSAqbGhzID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKwkgY29uc3QgZ2xzbF90eXBlICpyaHNfdHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKHZhci0+dHlwZS0+YmFzZV90eXBlLAorCQkJCQkJCSAgICAgY29uc3RhbnRfY29tcG9uZW50cywKKwkJCQkJCQkgICAgIDEpOworCSBpcl9ydmFsdWUgKnJocyA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KHJoc190eXBlLCAmZGF0YSk7CisKKwkgaXJfaW5zdHJ1Y3Rpb24gKmluc3QgPQorCSAgICBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KGxocywgcmhzLCBOVUxMLCBjb25zdGFudF9tYXNrKTsKKwkgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisgICAgICB9CisKKyAgICAgIGJhc2VfY29tcG9uZW50ID0gMDsKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBwYXJhbWV0ZXJzKSB7CisJIGlyX3J2YWx1ZSAqcGFyYW0gPSAoaXJfcnZhbHVlICopIG5vZGU7CisJIHVuc2lnbmVkIHJoc19jb21wb25lbnRzID0gcGFyYW0tPnR5cGUtPmNvbXBvbmVudHMoKTsKKworCSAvKiBEbyBub3QgdHJ5IHRvIGFzc2lnbiBtb3JlIGNvbXBvbmVudHMgdG8gdGhlIHZlY3RvciB0aGFuIGl0IGhhcyEKKwkgICovCisJIGlmICgocmhzX2NvbXBvbmVudHMgKyBiYXNlX2NvbXBvbmVudCkgPiBsaHNfY29tcG9uZW50cykgeworCSAgICByaHNfY29tcG9uZW50cyA9IGxoc19jb21wb25lbnRzIC0gYmFzZV9jb21wb25lbnQ7CisJIH0KKworCSBjb25zdCBpcl9jb25zdGFudCAqY29uc3QgYyA9IHBhcmFtLT5hc19jb25zdGFudCgpOworCSBpZiAoYyA9PSBOVUxMKSB7CisJICAgIC8qIE1hc2sgb2YgZmllbGRzIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIGFzc2lnbm1lbnQuCisJICAgICAqLworCSAgICBjb25zdCB1bnNpZ25lZCB3cml0ZV9tYXNrID0gKCgxVSA8PCByaHNfY29tcG9uZW50cykgLSAxKQorCSAgICAgICA8PCBiYXNlX2NvbXBvbmVudDsKKworCSAgICBpcl9kZXJlZmVyZW5jZSAqbGhzID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKworCSAgICAvKiBHZW5lcmF0ZSBhIHN3aXp6bGUgc28gdGhhdCBMSFMgYW5kIFJIUyBzaXplcyBtYXRjaC4KKwkgICAgICovCisJICAgIGlyX3J2YWx1ZSAqcmhzID0KKwkgICAgICAgbmV3KGN0eCkgaXJfc3dpenpsZShwYXJhbSwgMCwgMSwgMiwgMywgcmhzX2NvbXBvbmVudHMpOworCisJICAgIGlyX2luc3RydWN0aW9uICppbnN0ID0KKwkgICAgICAgbmV3KGN0eCkgaXJfYXNzaWdubWVudChsaHMsIHJocywgTlVMTCwgd3JpdGVfbWFzayk7CisJICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKGluc3QpOworCSB9CisKKwkgLyogQWR2YW5jZSB0aGUgY29tcG9uZW50IGluZGV4IGJ5IHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0aGF0IHdlcmUKKwkgICoganVzdCBhc3NpZ25lZC4KKwkgICovCisJIGJhc2VfY29tcG9uZW50ICs9IHJoc19jb21wb25lbnRzOworICAgICAgfQorICAgfQorICAgcmV0dXJuIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSBhc3NpZ25tZW50IG9mIGEgcG9ydGlvbiBvZiBhIHZlY3RvciB0byBhIHBvcnRpb24gb2YgYSBtYXRyaXggY29sdW1uCisgKgorICogXHBhcmFtIHNyY19iYXNlICBGaXJzdCBjb21wb25lbnQgb2YgdGhlIHNvdXJjZSB0byBiZSB1c2VkIGluIGFzc2lnbm1lbnQKKyAqIFxwYXJhbSBjb2x1bW4gICAgQ29sdW1uIG9mIGRlc3RpbmF0aW9uIHRvIGJlIGFzc2lnZWQKKyAqIFxwYXJhbSByb3dfYmFzZSAgRmlyc3QgY29tcG9uZW50IG9mIHRoZSBkZXN0aW5hdGlvbiBjb2x1bW4gdG8gYmUgYXNzaWduZWQKKyAqIFxwYXJhbSBjb3VudCAgICAgTnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gYmUgYXNzaWduZWQKKyAqCisgKiBcbm90ZQorICogXGMgc3JjX2Jhc2UgKyBcYyBjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAqIGluIHRoZSBzb3VyY2UgdmVjdG9yLgorICovCitpcl9pbnN0cnVjdGlvbiAqCithc3NpZ25fdG9fbWF0cml4X2NvbHVtbihpcl92YXJpYWJsZSAqdmFyLCB1bnNpZ25lZCBjb2x1bW4sIHVuc2lnbmVkIHJvd19iYXNlLAorCQkJaXJfcnZhbHVlICpzcmMsIHVuc2lnbmVkIHNyY19iYXNlLCB1bnNpZ25lZCBjb3VudCwKKwkJCXZvaWQgKm1lbV9jdHgpCit7CisgICBpcl9jb25zdGFudCAqY29sX2lkeCA9IG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudChjb2x1bW4pOworICAgaXJfZGVyZWZlcmVuY2UgKmNvbHVtbl9yZWYgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkodmFyLCBjb2xfaWR4KTsKKworICAgYXNzZXJ0KGNvbHVtbl9yZWYtPnR5cGUtPmNvbXBvbmVudHMoKSA+PSAocm93X2Jhc2UgKyBjb3VudCkpOworICAgYXNzZXJ0KHNyYy0+dHlwZS0+Y29tcG9uZW50cygpID49IChzcmNfYmFzZSArIGNvdW50KSk7CisKKyAgIC8qIEdlbmVyYXRlIGEgc3dpenpsZSB0aGF0IGV4dHJhY3RzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBmcm9tIHRoZSBzb3VyY2UKKyAgICAqIHRoYXQgYXJlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBjb2x1bW4gb2YgdGhlIG1hdHJpeC4KKyAgICAqLworICAgaWYgKGNvdW50IDwgc3JjLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIHsKKyAgICAgIHNyYyA9IG5ldyhtZW1fY3R4KSBpcl9zd2l6emxlKHNyYywKKwkJCQkgICAgc3JjX2Jhc2UgKyAwLCBzcmNfYmFzZSArIDEsCisJCQkJICAgIHNyY19iYXNlICsgMiwgc3JjX2Jhc2UgKyAzLAorCQkJCSAgICBjb3VudCk7CisgICB9CisKKyAgIC8qIE1hc2sgb2YgZmllbGRzIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIGFzc2lnbm1lbnQuCisgICAgKi8KKyAgIGNvbnN0IHVuc2lnbmVkIHdyaXRlX21hc2sgPSAoKDFVIDw8IGNvdW50KSAtIDEpIDw8IHJvd19iYXNlOworCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQoY29sdW1uX3JlZiwgc3JjLCBOVUxMLCB3cml0ZV9tYXNrKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlIGlubGluZSBjb2RlIGZvciBhIG1hdHJpeCBjb25zdHJ1Y3RvcgorICoKKyAqIFRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3IgY29kZSB3aWxsIGNvbnNpc3Qgb2YgYSB0ZW1wb3JhcnkgdmFyaWFibGUKKyAqIGRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGNvbnN0cnVjdG9yLiAgQSBzZXF1ZW5jZSBvZiBhc3NpZ25tZW50cworICogZnJvbSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRvIHRoZSB0ZW1wb3Jhcnkgd2lsbCBmb2xsb3cuCisgKgorICogXHJldHVybgorICogQW4gXGMgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgb2YgdGhlIHRlbXByb3JhcnkgZ2VuZXJhdGVkIGluIHRoZSBjb25zdHJ1Y3RvcgorICogYm9keS4KKyAqLworaXJfcnZhbHVlICoKK2VtaXRfaW5saW5lX21hdHJpeF9jb25zdHJ1Y3Rvcihjb25zdCBnbHNsX3R5cGUgKnR5cGUsCisJCQkgICAgICAgZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgICAgICAgZXhlY19saXN0ICpwYXJhbWV0ZXJzLAorCQkJICAgICAgIHZvaWQgKmN0eCkKK3sKKyAgIGFzc2VydCghcGFyYW1ldGVycy0+aXNfZW1wdHkoKSk7CisKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBuZXcoY3R4KSBpcl92YXJpYWJsZSh0eXBlLCAibWF0X2N0b3IiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHZhcik7CisKKyAgIC8qIFRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiBtYXRyaXggY29uc3RydWN0b3JzLgorICAgICoKKyAgICAqICAtIENvbnN0cnVjdCBhIG1hdHJpeCBmcm9tIGEgc2luZ2xlIHNjYWxhciBieSByZXBsaWNhdGluZyB0aGF0IHNjYWxhciB0bworICAgICogICAgYWxvbmcgdGhlIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggYW5kIHNldHRpbmcgYWxsIG90aGVyIGNvbXBvbmVudHMgdG8KKyAgICAqICAgIHplcm8uCisgICAgKgorICAgICogIC0gQ29uc3RydWN0IGEgbWF0cml4IGZyb20gYW4gYXJiaXJhcnkgY29tYmluYXRpb24gb2YgdmVjdG9ycyBhbmQKKyAgICAqICAgIHNjYWxhcnMuICBUaGUgY29tcG9uZW50cyBvZiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyBhcmUgYXNzaWduZWQKKyAgICAqICAgIHRvIHRoZSBtYXRyaXggaW4gY29sdW0tbWFqb3Igb3JkZXIgdW50aWwgdGhlIG1hdHJpeCBpcyBmdWxsLgorICAgICoKKyAgICAqICAtIENvbnN0cnVjdCBhIG1hdHJpeCBmcm9tIGEgc2luZ2xlIG1hdHJpeC4gIFRoZSBzb3VyY2UgbWF0cml4IGlzIGNvcGllZAorICAgICogICAgdG8gdGhlIHVwcGVyIGxlZnQgcG9ydGlvbiBvZiB0aGUgY29uc3RydWN0ZWQgbWF0cml4LCBhbmQgdGhlIHJlbWFpbmluZworICAgICogICAgZWxlbWVudHMgdGFrZSB2YWx1ZXMgZnJvbSB0aGUgaWRlbnRpdHkgbWF0cml4LgorICAgICovCisgICBpcl9ydmFsdWUgKmNvbnN0IGZpcnN0X3BhcmFtID0gKGlyX3J2YWx1ZSAqKSBwYXJhbWV0ZXJzLT5oZWFkOworICAgaWYgKHNpbmdsZV9zY2FsYXJfcGFyYW1ldGVyKHBhcmFtZXRlcnMpKSB7CisgICAgICAvKiBBc3NpZ24gdGhlIHNjYWxhciB0byB0aGUgWCBjb21wb25lbnQgb2YgYSB2ZWM0LCBhbmQgZmlsbCB0aGUgcmVtYWluaW5nCisgICAgICAgKiBjb21wb25lbnRzIHdpdGggemVyby4KKyAgICAgICAqLworICAgICAgaXJfdmFyaWFibGUgKnJoc192YXIgPQorCSBuZXcoY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIm1hdF9jdG9yX3ZlYyIsCisJCQkgICAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHJoc192YXIpOworCisgICAgICBpcl9jb25zdGFudF9kYXRhIHplcm87CisgICAgICB6ZXJvLmZbMF0gPSAwLjA7CisgICAgICB6ZXJvLmZbMV0gPSAwLjA7CisgICAgICB6ZXJvLmZbMl0gPSAwLjA7CisgICAgICB6ZXJvLmZbM10gPSAwLjA7CisKKyAgICAgIGlyX2luc3RydWN0aW9uICppbnN0ID0KKwkgbmV3KGN0eCkgaXJfYXNzaWdubWVudChuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShyaHNfdmFyKSwKKwkJCQluZXcoY3R4KSBpcl9jb25zdGFudChyaHNfdmFyLT50eXBlLCAmemVybyksCisJCQkJTlVMTCk7CisgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChpbnN0KTsKKworICAgICAgaXJfZGVyZWZlcmVuY2UgKmNvbnN0IHJoc19yZWYgPSBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShyaHNfdmFyKTsKKworICAgICAgaW5zdCA9IG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQocmhzX3JlZiwgZmlyc3RfcGFyYW0sIE5VTEwsIDB4MDEpOworICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisKKyAgICAgIC8qIEFzc2lnbiB0aGUgdGVtcG9yYXJ5IHZlY3RvciB0byBlYWNoIGNvbHVtbiBvZiB0aGUgZGVzdGluYXRpb24gbWF0cml4CisgICAgICAgKiB3aXRoIGEgc3dpenpsZSB0aGF0IHB1dHMgdGhlIFggY29tcG9uZW50IG9uIHRoZSBkaWFnb25hbCBvZiB0aGUKKyAgICAgICAqIG1hdHJpeC4gIEluIHNvbWUgY2FzZXMgdGhpcyBtYXkgbWVhbiB0aGF0IHRoZSBYIGNvbXBvbmVudCBkb2VzIG5vdAorICAgICAgICogZ2V0IGFzc2lnbmVkIGludG8gdGhlIGNvbHVtbiBhdCBhbGwgKGkuZS4sIHdoZW4gdGhlIG1hdHJpeCBoYXMgbW9yZQorICAgICAgICogY29sdW1ucyB0aGFuIHJvd3MpLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgcmhzX3N3aXpbNF1bNF0gPSB7CisJIHsgMCwgMSwgMSwgMSB9LAorCSB7IDEsIDAsIDEsIDEgfSwKKwkgeyAxLCAxLCAwLCAxIH0sCisJIHsgMSwgMSwgMSwgMCB9CisgICAgICB9OworCisgICAgICBjb25zdCB1bnNpZ25lZCBjb2xzX3RvX2luaXQgPSBNSU4yKHR5cGUtPm1hdHJpeF9jb2x1bW5zLAorCQkJCQkgdHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb2xzX3RvX2luaXQ7IGkrKykgeworCSBpcl9jb25zdGFudCAqY29uc3QgY29sX2lkeCA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KGkpOworCSBpcl9ydmFsdWUgKmNvbnN0IGNvbF9yZWYgPSBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheSh2YXIsIGNvbF9pZHgpOworCisJIGlyX3J2YWx1ZSAqY29uc3QgcmhzX3JlZiA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHJoc192YXIpOworCSBpcl9ydmFsdWUgKmNvbnN0IHJocyA9IG5ldyhjdHgpIGlyX3N3aXp6bGUocmhzX3JlZiwgcmhzX3N3aXpbaV0sCisJCQkJCQkgICAgdHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKworCSBpbnN0ID0gbmV3KGN0eCkgaXJfYXNzaWdubWVudChjb2xfcmVmLCByaHMsIE5VTEwpOworCSBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChpbnN0KTsKKyAgICAgIH0KKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gY29sc190b19pbml0OyBpIDwgdHlwZS0+bWF0cml4X2NvbHVtbnM7IGkrKykgeworCSBpcl9jb25zdGFudCAqY29uc3QgY29sX2lkeCA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KGkpOworCSBpcl9ydmFsdWUgKmNvbnN0IGNvbF9yZWYgPSBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheSh2YXIsIGNvbF9pZHgpOworCisJIGlyX3J2YWx1ZSAqY29uc3QgcmhzX3JlZiA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHJoc192YXIpOworCSBpcl9ydmFsdWUgKmNvbnN0IHJocyA9IG5ldyhjdHgpIGlyX3N3aXp6bGUocmhzX3JlZiwgMSwgMSwgMSwgMSwKKwkJCQkJCSAgICB0eXBlLT52ZWN0b3JfZWxlbWVudHMpOworCisJIGluc3QgPSBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KGNvbF9yZWYsIHJocywgTlVMTCk7CisJIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKGluc3QpOworICAgICAgfQorICAgfSBlbHNlIGlmIChmaXJzdF9wYXJhbS0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKyAgICAgIC8qIEZyb20gcGFnZSA1MCAoNTYgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS41MCBzcGVjOgorICAgICAgICoKKyAgICAgICAqICAgICAiSWYgYSBtYXRyaXggaXMgY29uc3RydWN0ZWQgZnJvbSBhIG1hdHJpeCwgdGhlbiBlYWNoIGNvbXBvbmVudAorICAgICAgICogICAgIChjb2x1bW4gaSwgcm93IGopIGluIHRoZSByZXN1bHQgdGhhdCBoYXMgYSBjb3JyZXNwb25kaW5nCisgICAgICAgKiAgICAgY29tcG9uZW50IChjb2x1bW4gaSwgcm93IGopIGluIHRoZSBhcmd1bWVudCB3aWxsIGJlIGluaXRpYWxpemVkCisgICAgICAgKiAgICAgZnJvbSB0aGVyZS4gQWxsIG90aGVyIGNvbXBvbmVudHMgd2lsbCBiZSBpbml0aWFsaXplZCB0byB0aGUKKyAgICAgICAqICAgICBpZGVudGl0eSBtYXRyaXguIElmIGEgbWF0cml4IGFyZ3VtZW50IGlzIGdpdmVuIHRvIGEgbWF0cml4CisgICAgICAgKiAgICAgY29uc3RydWN0b3IsIGl0IGlzIGFuIGVycm9yIHRvIGhhdmUgYW55IG90aGVyIGFyZ3VtZW50cy4iCisgICAgICAgKi8KKyAgICAgIGFzc2VydChmaXJzdF9wYXJhbS0+bmV4dC0+aXNfdGFpbF9zZW50aW5lbCgpKTsKKyAgICAgIGlyX3J2YWx1ZSAqY29uc3Qgc3JjX21hdHJpeCA9IGZpcnN0X3BhcmFtOworCisgICAgICAvKiBJZiB0aGUgc291cmNlIG1hdHJpeCBpcyBzbWFsbGVyLCBwcmUtaW5pdGlhbGl6ZSB0aGUgcmVsYXZlbnQgcGFydHMgb2YKKyAgICAgICAqIHRoZSBkZXN0aW5hdGlvbiBtYXRyaXggdG8gdGhlIGlkZW50aXR5IG1hdHJpeC4KKyAgICAgICAqLworICAgICAgaWYgKChzcmNfbWF0cml4LT50eXBlLT5tYXRyaXhfY29sdW1ucyA8IHZhci0+dHlwZS0+bWF0cml4X2NvbHVtbnMpCisJICB8fCAoc3JjX21hdHJpeC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzIDwgdmFyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpKSB7CisKKwkgLyogSWYgdGhlIHNvdXJjZSBtYXRyaXggaGFzIGZld2VyIHJvd3MsIGV2ZXJ5IGNvbHVtbiBvZiB0aGUgZGVzdGluYXRpb24KKwkgICogbXVzdCBiZSBpbml0aWFsaXplZC4gIE90aGVyd2lzZSBvbmx5IHRoZSBjb2x1bW5zIGluIHRoZSBkZXN0aW5hdGlvbgorCSAgKiB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgc291cmNlIG11c3QgYmUgaW5pdGlhbGl6ZWQuCisJICAqLworCSB1bnNpZ25lZCBjb2wgPQorCSAgICAoc3JjX21hdHJpeC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzIDwgdmFyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpCisJICAgID8gMCA6IHNyY19tYXRyaXgtPnR5cGUtPm1hdHJpeF9jb2x1bW5zOworCisJIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgY29sX3R5cGUgPSB2YXItPnR5cGUtPmNvbHVtbl90eXBlKCk7CisJIGZvciAoLyogZW1wdHkgKi87IGNvbCA8IHZhci0+dHlwZS0+bWF0cml4X2NvbHVtbnM7IGNvbCsrKSB7CisJICAgIGlyX2NvbnN0YW50X2RhdGEgaWRlbnQ7CisKKwkgICAgaWRlbnQuZlswXSA9IDAuMDsKKwkgICAgaWRlbnQuZlsxXSA9IDAuMDsKKwkgICAgaWRlbnQuZlsyXSA9IDAuMDsKKwkgICAgaWRlbnQuZlszXSA9IDAuMDsKKworCSAgICBpZGVudC5mW2NvbF0gPSAxLjA7CisKKwkgICAgaXJfcnZhbHVlICpjb25zdCByaHMgPSBuZXcoY3R4KSBpcl9jb25zdGFudChjb2xfdHlwZSwgJmlkZW50KTsKKworCSAgICBpcl9ydmFsdWUgKmNvbnN0IGxocyA9CisJICAgICAgIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KHZhciwgbmV3KGN0eCkgaXJfY29uc3RhbnQoY29sKSk7CisKKwkgICAgaXJfaW5zdHJ1Y3Rpb24gKmluc3QgPSBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KGxocywgcmhzLCBOVUxMKTsKKwkgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisJIH0KKyAgICAgIH0KKworICAgICAgLyogQXNzaWduIGNvbHVtbnMgZnJvbSB0aGUgc291cmNlIG1hdHJpeCB0byB0aGUgZGVzdGluYXRpb24gbWF0cml4LgorICAgICAgICoKKyAgICAgICAqIFNpbmNlIHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkIGluIHRoZSBSSFMgb2YgbXVsdGlwbGUgYXNzaWdubWVudHMsCisgICAgICAgKiBnZW5lcmF0ZSBhIHRlbXBvcmFyeSBhbmQgY29weSB0aGUgcGFyYW1ldGVyIHRoZXJlLgorICAgICAgICovCisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgcmhzX3ZhciA9CisJIG5ldyhjdHgpIGlyX3ZhcmlhYmxlKGZpcnN0X3BhcmFtLT50eXBlLCAibWF0X2N0b3JfbWF0IiwKKwkJCSAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwocmhzX3Zhcik7CisKKyAgICAgIGlyX2RlcmVmZXJlbmNlICpjb25zdCByaHNfdmFyX3JlZiA9CisJIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHJoc192YXIpOworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmNvbnN0IGluc3QgPQorCSBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KHJoc192YXJfcmVmLCBmaXJzdF9wYXJhbSwgTlVMTCk7CisgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChpbnN0KTsKKworICAgICAgY29uc3QgdW5zaWduZWQgbGFzdF9yb3cgPSBNSU4yKHNyY19tYXRyaXgtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cywKKwkJCQkgICAgIHZhci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGxhc3RfY29sID0gTUlOMihzcmNfbWF0cml4LT50eXBlLT5tYXRyaXhfY29sdW1ucywKKwkJCQkgICAgIHZhci0+dHlwZS0+bWF0cml4X2NvbHVtbnMpOworCisgICAgICB1bnNpZ25lZCBzd2l6WzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgbGFzdF9yb3c7IGkrKykKKwkgc3dpeltpXSA9IGk7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIHdyaXRlX21hc2sgPSAoMVUgPDwgbGFzdF9yb3cpIC0gMTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxhc3RfY29sOyBpKyspIHsKKwkgaXJfZGVyZWZlcmVuY2UgKmNvbnN0IGxocyA9CisJICAgIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KHZhciwgbmV3KGN0eCkgaXJfY29uc3RhbnQoaSkpOworCSBpcl9ydmFsdWUgKmNvbnN0IHJoc19jb2wgPQorCSAgICBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheShyaHNfdmFyLCBuZXcoY3R4KSBpcl9jb25zdGFudChpKSk7CisKKwkgLyogSWYgb25lIG1hdHJpeCBoYXMgY29sdW1ucyB0aGF0IGFyZSBzbWFsbGVyIHRoYW4gdGhlIGNvbHVtbnMgb2YgdGhlCisJICAqIG90aGVyIG1hdHJpeCwgd3JhcCB0aGUgY29sdW1uIGFjY2VzcyBvZiB0aGUgbGFyZ2VyIHdpdGggYSBzd2l6emxlCisJICAqIHNvIHRoYXQgdGhlIExIUyBhbmQgUkhTIG9mIHRoZSBhc3NpZ25tZW50IGhhdmUgdGhlIHNhbWUgc2l6ZSAoYW5kCisJICAqIHRoZXJlZm9yZSBoYXZlIHRoZSBzYW1lIHR5cGUpLgorCSAgKgorCSAgKiBJdCB3b3VsZCBiZSBwZXJmZWN0bHkgdmFsaWQgdG8gdW5jb25kaXRpb25hbGx5IGdlbmVyYXRlIHRoZQorCSAgKiBzd2l6emxlcywgdGhpcyB0aGlzIHdpbGwgdHlwaWNhbGx5IHJlc3VsdCBpbiBhIG1vcmUgY29tcGFjdCBJUiB0cmVlLgorCSAgKi8KKwkgaXJfcnZhbHVlICpyaHM7CisJIGlmIChsaHMtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyAhPSByaHNfY29sLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIHsKKwkgICAgcmhzID0gbmV3KGN0eCkgaXJfc3dpenpsZShyaHNfY29sLCBzd2l6LCBsYXN0X3Jvdyk7CisJIH0gZWxzZSB7CisJICAgIHJocyA9IHJoc19jb2w7CisJIH0KKworCSBpcl9pbnN0cnVjdGlvbiAqaW5zdCA9CisJICAgIG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCByaHMsIE5VTEwsIHdyaXRlX21hc2spOworCSBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChpbnN0KTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBjb2xzID0gdHlwZS0+bWF0cml4X2NvbHVtbnM7CisgICAgICBjb25zdCB1bnNpZ25lZCByb3dzID0gdHlwZS0+dmVjdG9yX2VsZW1lbnRzOworICAgICAgdW5zaWduZWQgY29sX2lkeCA9IDA7CisgICAgICB1bnNpZ25lZCByb3dfaWR4ID0gMDsKKworICAgICAgZm9yZWFjaF9saXN0IChub2RlLCBwYXJhbWV0ZXJzKSB7CisJIGlyX3J2YWx1ZSAqY29uc3QgcmhzID0gKGlyX3J2YWx1ZSAqKSBub2RlOworCSBjb25zdCB1bnNpZ25lZCBjb21wb25lbnRzX3JlbWFpbmluZ190aGlzX2NvbHVtbiA9IHJvd3MgLSByb3dfaWR4OworCSB1bnNpZ25lZCByaHNfY29tcG9uZW50cyA9IHJocy0+dHlwZS0+Y29tcG9uZW50cygpOworCSB1bnNpZ25lZCByaHNfYmFzZSA9IDA7CisKKwkgLyogU2luY2UgdGhlIHBhcmFtZXRlciBtaWdodCBiZSB1c2VkIGluIHRoZSBSSFMgb2YgdHdvIGFzc2lnbm1lbnRzLAorCSAgKiBnZW5lcmF0ZSBhIHRlbXBvcmFyeSBhbmQgY29weSB0aGUgcGFyYW1ldGVyIHRoZXJlLgorCSAgKi8KKwkgaXJfdmFyaWFibGUgKnJoc192YXIgPQorCSAgICBuZXcoY3R4KSBpcl92YXJpYWJsZShyaHMtPnR5cGUsICJtYXRfY3Rvcl92ZWMiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKwkgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwocmhzX3Zhcik7CisKKwkgaXJfZGVyZWZlcmVuY2UgKnJoc192YXJfcmVmID0KKwkgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUocmhzX3Zhcik7CisJIGlyX2luc3RydWN0aW9uICppbnN0ID0gbmV3KGN0eCkgaXJfYXNzaWdubWVudChyaHNfdmFyX3JlZiwgcmhzLCBOVUxMKTsKKwkgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisKKwkgLyogQXNzaWduIHRoZSBjdXJyZW50IHBhcmFtZXRlciB0byBhcyBtYW55IGNvbXBvbmVudHMgb2YgdGhlIG1hdHJpeAorCSAgKiBhcyBpdCB3aWxsIGZpbGwuCisJICAqCisJICAqIE5PVEU6IEEgc2luZ2xlIHZlY3RvciBwYXJhbWV0ZXIgY2FuIHNwYW4gdHdvIG1hdHJpeCBjb2x1bW5zLiAgQQorCSAgKiBzaW5nbGUgdmVjNCwgZm9yIGV4YW1wbGUsIGNhbiBjb21wbGV0ZWx5IGZpbGwgYSBtYXQyLgorCSAgKi8KKwkgaWYgKHJoc19jb21wb25lbnRzID49IGNvbXBvbmVudHNfcmVtYWluaW5nX3RoaXNfY29sdW1uKSB7CisJICAgIGNvbnN0IHVuc2lnbmVkIGNvdW50ID0gTUlOMihyaHNfY29tcG9uZW50cywKKwkJCQkJY29tcG9uZW50c19yZW1haW5pbmdfdGhpc19jb2x1bW4pOworCisJICAgIHJoc192YXJfcmVmID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUocmhzX3Zhcik7CisKKwkgICAgaXJfaW5zdHJ1Y3Rpb24gKmluc3QgPSBhc3NpZ25fdG9fbWF0cml4X2NvbHVtbih2YXIsIGNvbF9pZHgsCisJCQkJCQkJICAgcm93X2lkeCwKKwkJCQkJCQkgICByaHNfdmFyX3JlZiwgMCwKKwkJCQkJCQkgICBjb3VudCwgY3R4KTsKKwkgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisKKwkgICAgcmhzX2Jhc2UgPSBjb3VudDsKKworCSAgICBjb2xfaWR4Kys7CisJICAgIHJvd19pZHggPSAwOworCSB9CisKKwkgLyogSWYgdGhlcmUgaXMgZGF0YSBsZWZ0IGluIHRoZSBwYXJhbWV0ZXIgYW5kIGNvbXBvbmVudHMgbGVmdCB0byBiZQorCSAgKiBzZXQgaW4gdGhlIGRlc3RpbmF0aW9uLCBlbWl0IGFub3RoZXIgYXNzaWdubWVudC4gIEl0IGlzIHBvc3NpYmxlCisJICAqIHRoYXQgdGhlIGFzc2lnbm1lbnQgY291bGQgYmUgb2YgYSB2ZWM0IHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCisJICAqIG1hdHJpeC4gIEluIHRoaXMgY2FzZSBjb2xfaWR4PT1jb2xzLCBidXQgdGhlcmUgaXMgc3RpbGwgZGF0YQorCSAgKiBsZWZ0IGluIHRoZSBzb3VyY2UgcGFyYW1ldGVyLiAgT2J2aW91c2x5LCBkb24ndCBlbWl0IGFuIGFzc2lnbm1lbnQKKwkgICogdG8gZGF0YSBvdXRzaWRlIHRoZSBkZXN0aW5hdGlvbiBtYXRyaXguCisJICAqLworCSBpZiAoKGNvbF9pZHggPCBjb2xzKSAmJiAocmhzX2Jhc2UgPCByaHNfY29tcG9uZW50cykpIHsKKwkgICAgY29uc3QgdW5zaWduZWQgY291bnQgPSByaHNfY29tcG9uZW50cyAtIHJoc19iYXNlOworCisJICAgIHJoc192YXJfcmVmID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUocmhzX3Zhcik7CisKKwkgICAgaXJfaW5zdHJ1Y3Rpb24gKmluc3QgPSBhc3NpZ25fdG9fbWF0cml4X2NvbHVtbih2YXIsIGNvbF9pZHgsCisJCQkJCQkJICAgcm93X2lkeCwKKwkJCQkJCQkgICByaHNfdmFyX3JlZiwKKwkJCQkJCQkgICByaHNfYmFzZSwKKwkJCQkJCQkgICBjb3VudCwgY3R4KTsKKwkgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisKKwkgICAgcm93X2lkeCArPSBjb3VudDsKKwkgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKK30KKworCitpcl9ydmFsdWUgKgorZW1pdF9pbmxpbmVfcmVjb3JkX2NvbnN0cnVjdG9yKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKwkJCSAgICAgICBleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgICAgICBleGVjX2xpc3QgKnBhcmFtZXRlcnMsCisJCQkgICAgICAgdm9pZCAqbWVtX2N0eCkKK3sKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKHR5cGUsICJyZWNvcmRfY3RvciIsIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmNvbnN0IGQgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwodmFyKTsKKworICAgZXhlY19ub2RlICpub2RlID0gcGFyYW1ldGVycy0+aGVhZDsKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0eXBlLT5sZW5ndGg7IGkrKykgeworICAgICAgYXNzZXJ0KCFub2RlLT5pc190YWlsX3NlbnRpbmVsKCkpOworCisgICAgICBpcl9kZXJlZmVyZW5jZSAqY29uc3QgbGhzID0KKwkgbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3JlY29yZChkLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKwkJCQkJICAgIHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSk7CisKKyAgICAgIGlyX3J2YWx1ZSAqY29uc3QgcmhzID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfcnZhbHVlKCk7CisgICAgICBhc3NlcnQocmhzICE9IE5VTEwpOworCisgICAgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgYXNzaWduID0gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCByaHMsIE5VTEwpOworCisgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChhc3NpZ24pOworICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICB9CisKKyAgIHJldHVybiBkOworfQorCisKK3N0YXRpYyBpcl9ydmFsdWUgKgorcHJvY2Vzc19yZWNvcmRfY29uc3RydWN0b3IoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0cnVjdG9yX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBZWUxUWVBFICpsb2MsIGV4ZWNfbGlzdCAqcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgZXhlY19saXN0IGFjdHVhbF9wYXJhbWV0ZXJzOworCisgICBwcm9jZXNzX3BhcmFtZXRlcnMoaW5zdHJ1Y3Rpb25zLCAmYWN0dWFsX3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycywgc3RhdGUpOworCisgICBleGVjX25vZGUgKm5vZGUgPSBhY3R1YWxfcGFyYW1ldGVycy5oZWFkOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNvbnN0cnVjdG9yX3R5cGUtPmxlbmd0aDsgaSsrKSB7CisgICAgICBpcl9ydmFsdWUgKmlyID0gKGlyX3J2YWx1ZSAqKSBub2RlOworCisgICAgICBpZiAobm9kZS0+aXNfdGFpbF9zZW50aW5lbCgpKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN1ZmZpY2llbnQgcGFyYW1ldGVycyB0byBjb25zdHJ1Y3RvciBmb3IgYCVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yX3R5cGUtPm5hbWUpOworICAgICAgICAgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgICAgIH0KKworICAgICAgaWYgKGFwcGx5X2ltcGxpY2l0X2NvbnZlcnNpb24oY29uc3RydWN0b3JfdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXIsIHN0YXRlKSkgeworICAgICAgICAgbm9kZS0+cmVwbGFjZV93aXRoKGlyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIgdHlwZSBtaXNtYXRjaCBpbiBjb25zdHJ1Y3RvciBmb3IgYCVzLiVzJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoJXMgdnMgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JfdHlwZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JfdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+dHlwZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JfdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlLT5uYW1lKTsKKyAgICAgICAgIHJldHVybiBpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKGN0eCk7OworICAgICAgfQorCisgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgIH0KKworICAgaWYgKCFub2RlLT5pc190YWlsX3NlbnRpbmVsKCkpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgInRvbyBtYW55IHBhcmFtZXRlcnMgaW4gY29uc3RydWN0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBgJXMnIiwgY29uc3RydWN0b3JfdHlwZS0+bmFtZSk7CisgICAgICByZXR1cm4gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgfQorCisgICBpcl9ydmFsdWUgKmNvbnN0IGNvbnN0YW50ID0KKyAgICAgIGNvbnN0YW50X3JlY29yZF9jb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcl90eXBlLCAmYWN0dWFsX3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworCisgICByZXR1cm4gKGNvbnN0YW50ICE9IE5VTEwpCisgICAgICAgICAgICA/IGNvbnN0YW50CisgICAgICAgICAgICA6IGVtaXRfaW5saW5lX3JlY29yZF9jb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcl90eXBlLCBpbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsX3BhcmFtZXRlcnMsIHN0YXRlKTsKK30KKworCitpcl9ydmFsdWUgKgorYXN0X2Z1bmN0aW9uX2V4cHJlc3Npb246OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAvKiBUaGVyZSBhcmUgdGhyZWUgc29ydHMgb2YgZnVuY3Rpb24gY2FsbHMuCisgICAgKgorICAgICogMS4gY29uc3RydWN0b3JzIC0gVGhlIGZpcnN0IHN1YmV4cHJlc3Npb24gaXMgYW4gYXN0X3R5cGVfc3BlY2lmaWVyLgorICAgICogMi4gbWV0aG9kcyAtIE9ubHkgdGhlIC5sZW5ndGgoKSBtZXRob2Qgb2YgYXJyYXkgdHlwZXMuCisgICAgKiAzLiBmdW5jdGlvbnMgLSBDYWxscyB0byByZWd1bGFyIG9sZCBmdW5jdGlvbnMuCisgICAgKgorICAgICogTWV0aG9kIGNhbGxzIGFyZSBhY3R1YWxseSBkZXRlY3RlZCB3aGVuIHRoZSBhc3RfZmllbGRfc2VsZWN0aW9uCisgICAgKiBleHByZXNzaW9uIGlzIGhhbmRsZWQuCisgICAgKi8KKyAgIGlmIChpc19jb25zdHJ1Y3RvcigpKSB7CisgICAgICBjb25zdCBhc3RfdHlwZV9zcGVjaWZpZXIgKnR5cGUgPSAoYXN0X3R5cGVfc3BlY2lmaWVyICopIHN1YmV4cHJlc3Npb25zWzBdOworICAgICAgWVlMVFlQRSBsb2MgPSB0eXBlLT5nZXRfbG9jYXRpb24oKTsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgY29uc3RydWN0b3JfdHlwZSA9IHR5cGUtPmdsc2xfdHlwZSgmIG5hbWUsIHN0YXRlKTsKKworICAgICAgLyogY29uc3RydWN0b3JfdHlwZSBjYW4gYmUgTlVMTCBpZiBhIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUKKyAgICAgICAqIHN0cnVjdHVyZSBoYXMgY29tZSBpbnRvIHNjb3BlLgorICAgICAgICovCisgICAgICBpZiAoY29uc3RydWN0b3JfdHlwZSA9PSBOVUxMKSB7CisJIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAidW5rbm93biB0eXBlIGAlcycgKHN0cnVjdHVyZSBuYW1lICIKKwkJCSAgIm1heSBiZSBzaGFkb3dlZCBieSBhIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSkiLAorCQkJICB0eXBlLT50eXBlX25hbWUpOworCSByZXR1cm4gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgICAgfQorCisKKyAgICAgIC8qIENvbnN0cnVjdG9ycyBmb3Igc2FtcGxlcnMgYXJlIGlsbGVnYWwuCisgICAgICAgKi8KKyAgICAgIGlmIChjb25zdHJ1Y3Rvcl90eXBlLT5pc19zYW1wbGVyKCkpIHsKKwkgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJjYW5ub3QgY29uc3RydWN0IHNhbXBsZXIgdHlwZSBgJXMnIiwKKwkJCSAgY29uc3RydWN0b3JfdHlwZS0+bmFtZSk7CisJIHJldHVybiBpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKGN0eCk7CisgICAgICB9CisKKyAgICAgIGlmIChjb25zdHJ1Y3Rvcl90eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAgICBpZiAoIXN0YXRlLT5jaGVja192ZXJzaW9uKDEyMCwgMzAwLCAmbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgY29uc3RydWN0b3JzIGZvcmJpZGRlbiIpKSB7CisJICAgIHJldHVybiBpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKGN0eCk7CisJIH0KKworCSByZXR1cm4gcHJvY2Vzc19hcnJheV9jb25zdHJ1Y3RvcihpbnN0cnVjdGlvbnMsIGNvbnN0cnVjdG9yX3R5cGUsCisJCQkJCSAgJiBsb2MsICZ0aGlzLT5leHByZXNzaW9ucywgc3RhdGUpOworICAgICAgfQorCisKKyAgICAgIC8qIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgY29uc3RydWN0b3IgY2FsbHMuICBDb25zdHJ1Y3RvcnMgZm9yIGFycmF5cyBhbmQKKyAgICAgICAqIHN0cnVjdHVyZXMgbXVzdCBoYXZlIHRoZSBleGFjdCBudW1iZXIgb2YgYXJndW1lbnRzIHdpdGggbWF0Y2hpbmcgdHlwZXMKKyAgICAgICAqIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgVGhlc2UgY29uc3RydWN0b3JzIGZvbGxvdyBlc3NlbnRpYWxseSB0aGUgc2FtZQorICAgICAgICogdHlwZSBtYXRjaGluZyBydWxlcyBhcyBmdW5jdGlvbnMuCisgICAgICAgKgorICAgICAgICogQ29uc3RydWN0b3JzIGZvciBidWlsdC1pbiBsYW5ndWFnZSB0eXBlcywgc3VjaCBhcyBtYXQ0IGFuZCB2ZWMyLCBhcmUKKyAgICAgICAqIGZyZWUgZm9ybS4gIFRoZSBvbmx5IHJlcXVpcmVtZW50cyBhcmUgdGhhdCB0aGUgcGFyYW1ldGVycyBtdXN0IHByb3ZpZGUKKyAgICAgICAqIGVub3VnaCB2YWx1ZXMgb2YgdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUgYW5kIHRoYXQgbm8gYXJndW1lbnRzIGFyZQorICAgICAgICogZ2l2ZW4gcGFzdCB0aGUgbGFzdCB1c2VkIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqIFdoZW4gdXNpbmcgdGhlIEMtc3R5bGUgaW5pdGlhbGl6ZXIgc3ludGF4IGZyb20gR0xTTCA0LjIwLCBjb25zdHJ1Y3RvcnMKKyAgICAgICAqIG11c3QgaGF2ZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyB3aXRoIG1hdGNoaW5nIHR5cGVzIGluIHRoZQorICAgICAgICogY29ycmVjdCBvcmRlci4KKyAgICAgICAqLworICAgICAgaWYgKGNvbnN0cnVjdG9yX3R5cGUtPmlzX3JlY29yZCgpKSB7CisgICAgICAgICByZXR1cm4gcHJvY2Vzc19yZWNvcmRfY29uc3RydWN0b3IoaW5zdHJ1Y3Rpb25zLCBjb25zdHJ1Y3Rvcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2MsICZ0aGlzLT5leHByZXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgICB9CisKKyAgICAgIGlmICghY29uc3RydWN0b3JfdHlwZS0+aXNfbnVtZXJpYygpICYmICFjb25zdHJ1Y3Rvcl90eXBlLT5pc19ib29sZWFuKCkpCisJIHJldHVybiBpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKGN0eCk7CisKKyAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBjb21wb25lbnRzIG9mIHRoZSB0eXBlIGJlaW5nIGNvbnN0cnVjdGVkLiAqLworICAgICAgY29uc3QgdW5zaWduZWQgdHlwZV9jb21wb25lbnRzID0gY29uc3RydWN0b3JfdHlwZS0+Y29tcG9uZW50cygpOworCisgICAgICAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyBmcm9tIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4KKyAgICAgICAqIGNvbnN1bWVkLiAgVGhpcyBpcyB1c2VkIHRvIHBlcmZvcm0gc2V2ZXJhbCBraW5kcyBvZiBlcnJvciBjaGVja2luZy4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgY29tcG9uZW50c191c2VkID0gMDsKKworICAgICAgdW5zaWduZWQgbWF0cml4X3BhcmFtZXRlcnMgPSAwOworICAgICAgdW5zaWduZWQgbm9ubWF0cml4X3BhcmFtZXRlcnMgPSAwOworICAgICAgZXhlY19saXN0IGFjdHVhbF9wYXJhbWV0ZXJzOworCisgICAgICBmb3JlYWNoX2xpc3QgKG4sICZ0aGlzLT5leHByZXNzaW9ucykgeworCSBhc3Rfbm9kZSAqYXN0ID0gZXhlY19ub2RlX2RhdGEoYXN0X25vZGUsIG4sIGxpbmspOworCSBpcl9ydmFsdWUgKnJlc3VsdCA9IGFzdC0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpLT5hc19ydmFsdWUoKTsKKworCSAvKiBGcm9tIHBhZ2UgNTAgKHBhZ2UgNTYgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS41MCBzcGVjOgorCSAgKgorCSAgKiAgICAiSXQgaXMgYW4gZXJyb3IgdG8gcHJvdmlkZSBleHRyYSBhcmd1bWVudHMgYmV5b25kIHRoaXMKKwkgICogICAgbGFzdCB1c2VkIGFyZ3VtZW50LiIKKwkgICovCisJIGlmIChjb21wb25lbnRzX3VzZWQgPj0gdHlwZV9jb21wb25lbnRzKSB7CisJICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAidG9vIG1hbnkgcGFyYW1ldGVycyB0byBgJXMnICIKKwkJCSAgICAgImNvbnN0cnVjdG9yIiwKKwkJCSAgICAgY29uc3RydWN0b3JfdHlwZS0+bmFtZSk7CisJICAgIHJldHVybiBpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKGN0eCk7CisJIH0KKworCSBpZiAoIXJlc3VsdC0+dHlwZS0+aXNfbnVtZXJpYygpICYmICFyZXN1bHQtPnR5cGUtPmlzX2Jvb2xlYW4oKSkgeworCSAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgImNhbm5vdCBjb25zdHJ1Y3QgYCVzJyBmcm9tIGEgIgorCQkJICAgICAibm9uLW51bWVyaWMgZGF0YSB0eXBlIiwKKwkJCSAgICAgY29uc3RydWN0b3JfdHlwZS0+bmFtZSk7CisJICAgIHJldHVybiBpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKGN0eCk7CisJIH0KKworCSAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG1hdHJpeCBhbmQgbm9ubWF0cml4IHBhcmFtZXRlcnMuICBUaGlzCisJICAqIGlzIHVzZWQgYmVsb3cgdG8gZW5mb3JjZSBzb21lIG9mIHRoZSBjb25zdHJ1Y3RvciBydWxlcy4KKwkgICovCisJIGlmIChyZXN1bHQtPnR5cGUtPmlzX21hdHJpeCgpKQorCSAgICBtYXRyaXhfcGFyYW1ldGVycysrOworCSBlbHNlCisJICAgIG5vbm1hdHJpeF9wYXJhbWV0ZXJzKys7CisKKwkgYWN0dWFsX3BhcmFtZXRlcnMucHVzaF90YWlsKHJlc3VsdCk7CisJIGNvbXBvbmVudHNfdXNlZCArPSByZXN1bHQtPnR5cGUtPmNvbXBvbmVudHMoKTsKKyAgICAgIH0KKworICAgICAgLyogRnJvbSBwYWdlIDI4IChwYWdlIDM0IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMTAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAiSXQgaXMgYW4gZXJyb3IgdG8gY29uc3RydWN0IG1hdHJpY2VzIGZyb20gb3RoZXIgbWF0cmljZXMuIFRoaXMKKyAgICAgICAqICAgIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiIKKyAgICAgICAqLworICAgICAgaWYgKG1hdHJpeF9wYXJhbWV0ZXJzID4gMAorICAgICAgICAgICYmIGNvbnN0cnVjdG9yX3R5cGUtPmlzX21hdHJpeCgpCisgICAgICAgICAgJiYgIXN0YXRlLT5jaGVja192ZXJzaW9uKDEyMCwgMTAwLCAmbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnN0cnVjdCBgJXMnIGZyb20gYSBtYXRyaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcl90eXBlLT5uYW1lKSkgeworCSByZXR1cm4gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgICAgfQorCisgICAgICAvKiBGcm9tIHBhZ2UgNTAgKHBhZ2UgNTYgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS41MCBzcGVjOgorICAgICAgICoKKyAgICAgICAqICAgICJJZiBhIG1hdHJpeCBhcmd1bWVudCBpcyBnaXZlbiB0byBhIG1hdHJpeCBjb25zdHJ1Y3RvciwgaXQgaXMKKyAgICAgICAqICAgIGFuIGVycm9yIHRvIGhhdmUgYW55IG90aGVyIGFyZ3VtZW50cy4iCisgICAgICAgKi8KKyAgICAgIGlmICgobWF0cml4X3BhcmFtZXRlcnMgPiAwKQorCSAgJiYgKChtYXRyaXhfcGFyYW1ldGVycyArIG5vbm1hdHJpeF9wYXJhbWV0ZXJzKSA+IDEpCisJICAmJiBjb25zdHJ1Y3Rvcl90eXBlLT5pc19tYXRyaXgoKSkgeworCSBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgImZvciBtYXRyaXggYCVzJyBjb25zdHJ1Y3RvciwgIgorCQkJICAibWF0cml4IG11c3QgYmUgb25seSBwYXJhbWV0ZXIiLAorCQkJICBjb25zdHJ1Y3Rvcl90eXBlLT5uYW1lKTsKKwkgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgICAgIH0KKworICAgICAgLyogRnJvbSBwYWdlIDI4IChwYWdlIDM0IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMTAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAiSW4gdGhlc2UgY2FzZXMsIHRoZXJlIG11c3QgYmUgZW5vdWdoIGNvbXBvbmVudHMgcHJvdmlkZWQgaW4gdGhlCisgICAgICAgKiAgICBhcmd1bWVudHMgdG8gcHJvdmlkZSBhbiBpbml0aWFsaXplciBmb3IgZXZlcnkgY29tcG9uZW50IGluIHRoZQorICAgICAgICogICAgY29uc3RydWN0ZWQgdmFsdWUuIgorICAgICAgICovCisgICAgICBpZiAoY29tcG9uZW50c191c2VkIDwgdHlwZV9jb21wb25lbnRzICYmIGNvbXBvbmVudHNfdXNlZCAhPSAxCisJICAmJiBtYXRyaXhfcGFyYW1ldGVycyA9PSAwKSB7CisJIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAidG9vIGZldyBjb21wb25lbnRzIHRvIGNvbnN0cnVjdCAiCisJCQkgICJgJXMnIiwKKwkJCSAgY29uc3RydWN0b3JfdHlwZS0+bmFtZSk7CisJIHJldHVybiBpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKGN0eCk7CisgICAgICB9CisKKyAgICAgIC8qIExhdGVyLCB3ZSBjYXN0IGVhY2ggcGFyYW1ldGVyIHRvIHRoZSBzYW1lIGJhc2UgdHlwZSBhcyB0aGUKKyAgICAgICAqIGNvbnN0cnVjdG9yLiAgU2luY2UgdGhlcmUgYXJlIG5vIG5vbi1mbG9hdGluZyBwb2ludCBtYXRyaWNlcywgd2UKKyAgICAgICAqIG5lZWQgdG8gYnJlYWsgdGhlbSB1cCBpbnRvIGEgc2VyaWVzIG9mIGNvbHVtbiB2ZWN0b3JzLgorICAgICAgICovCisgICAgICBpZiAoY29uc3RydWN0b3JfdHlwZS0+YmFzZV90eXBlICE9IEdMU0xfVFlQRV9GTE9BVCkgeworCSBmb3JlYWNoX2xpc3Rfc2FmZShuLCAmYWN0dWFsX3BhcmFtZXRlcnMpIHsKKwkgICAgaXJfcnZhbHVlICptYXRyaXggPSAoaXJfcnZhbHVlICopIG47CisKKwkgICAgaWYgKCFtYXRyaXgtPnR5cGUtPmlzX21hdHJpeCgpKQorCSAgICAgICBjb250aW51ZTsKKworCSAgICAvKiBDcmVhdGUgYSB0ZW1wb3JhcnkgY29udGFpbmluZyB0aGUgbWF0cml4LiAqLworCSAgICBpcl92YXJpYWJsZSAqdmFyID0gbmV3KGN0eCkgaXJfdmFyaWFibGUobWF0cml4LT50eXBlLCAibWF0cml4X3RtcCIsCisJCQkJCQkgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisJICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHZhcik7CisJICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQobmV3KGN0eCkKKwkgICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKSwgbWF0cml4LCBOVUxMKSk7CisJICAgIHZhci0+Y29uc3RhbnRfdmFsdWUgPSBtYXRyaXgtPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKworCSAgICAvKiBSZXBsYWNlIHRoZSBtYXRyaXggd2l0aCBkZXJlZmVyZW5jZXMgb2YgaXRzIGNvbHVtbnMuICovCisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF0cml4LT50eXBlLT5tYXRyaXhfY29sdW1uczsgaSsrKSB7CisJICAgICAgIG1hdHJpeC0+aW5zZXJ0X2JlZm9yZShuZXcgKGN0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkodmFyLAorCQkgIG5ldyhjdHgpIGlyX2NvbnN0YW50KGkpKSk7CisJICAgIH0KKwkgICAgbWF0cml4LT5yZW1vdmUoKTsKKwkgfQorICAgICAgfQorCisgICAgICBib29sIGFsbF9wYXJhbWV0ZXJzX2FyZV9jb25zdGFudCA9IHRydWU7CisKKyAgICAgIC8qIFR5cGUgY2FzdCBlYWNoIHBhcmFtZXRlciBhbmQsIGlmIHBvc3NpYmxlLCBmb2xkIGNvbnN0YW50cy4qLworICAgICAgZm9yZWFjaF9saXN0X3NhZmUobiwgJmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisJIGlyX3J2YWx1ZSAqaXIgPSAoaXJfcnZhbHVlICopIG47CisKKwkgY29uc3QgZ2xzbF90eXBlICpkZXNpcmVkX3R5cGUgPQorCSAgICBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShjb25zdHJ1Y3Rvcl90eXBlLT5iYXNlX3R5cGUsCisJCQkJICAgIGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMsCisJCQkJICAgIGlyLT50eXBlLT5tYXRyaXhfY29sdW1ucyk7CisJIGlyX3J2YWx1ZSAqcmVzdWx0ID0gY29udmVydF9jb21wb25lbnQoaXIsIGRlc2lyZWRfdHlwZSk7CisKKwkgLyogQXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBwYXJhbWV0ZXIgdG8gYSBjb25zdGFudCB2YWx1ZWQgZXhwcmVzc2lvbi4KKwkgICogQWZ0ZXIgZG9pbmcgc28sIHRyYWNrIHdoZXRoZXIgb3Igbm90IGFsbCB0aGUgcGFyYW1ldGVycyB0byB0aGUKKwkgICogY29uc3RydWN0b3IgYXJlIHRyaXZpYWxseSBjb25zdGFudCB2YWx1ZWQgZXhwcmVzc2lvbnMuCisJICAqLworCSBpcl9ydmFsdWUgKmNvbnN0IGNvbnN0YW50ID0gcmVzdWx0LT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisKKwkgaWYgKGNvbnN0YW50ICE9IE5VTEwpCisJICAgIHJlc3VsdCA9IGNvbnN0YW50OworCSBlbHNlCisJICAgIGFsbF9wYXJhbWV0ZXJzX2FyZV9jb25zdGFudCA9IGZhbHNlOworCisJIGlmIChyZXN1bHQgIT0gaXIpIHsKKwkgICAgaXItPnJlcGxhY2Vfd2l0aChyZXN1bHQpOworCSB9CisgICAgICB9CisKKyAgICAgIC8qIElmIGFsbCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgdHJpdmlhbGx5IGNvbnN0YW50LCBjcmVhdGUgYQorICAgICAgICogY29uc3RhbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wbGV0ZSBjb2xsZWN0aW9uIG9mIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGlmIChhbGxfcGFyYW1ldGVyc19hcmVfY29uc3RhbnQpIHsKKwkgcmV0dXJuIG5ldyhjdHgpIGlyX2NvbnN0YW50KGNvbnN0cnVjdG9yX3R5cGUsICZhY3R1YWxfcGFyYW1ldGVycyk7CisgICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdG9yX3R5cGUtPmlzX3NjYWxhcigpKSB7CisJIHJldHVybiBkZXJlZmVyZW5jZV9jb21wb25lbnQoKGlyX3J2YWx1ZSAqKSBhY3R1YWxfcGFyYW1ldGVycy5oZWFkLAorCQkJCSAgICAgIDApOworICAgICAgfSBlbHNlIGlmIChjb25zdHJ1Y3Rvcl90eXBlLT5pc192ZWN0b3IoKSkgeworCSByZXR1cm4gZW1pdF9pbmxpbmVfdmVjdG9yX2NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yX3R5cGUsCisJCQkJCSAgICAgICBpbnN0cnVjdGlvbnMsCisJCQkJCSAgICAgICAmYWN0dWFsX3BhcmFtZXRlcnMsCisJCQkJCSAgICAgICBjdHgpOworICAgICAgfSBlbHNlIHsKKwkgYXNzZXJ0KGNvbnN0cnVjdG9yX3R5cGUtPmlzX21hdHJpeCgpKTsKKwkgcmV0dXJuIGVtaXRfaW5saW5lX21hdHJpeF9jb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcl90eXBlLAorCQkJCQkgICAgICAgaW5zdHJ1Y3Rpb25zLAorCQkJCQkgICAgICAgJmFjdHVhbF9wYXJhbWV0ZXJzLAorCQkJCQkgICAgICAgY3R4KTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBjb25zdCBhc3RfZXhwcmVzc2lvbiAqaWQgPSBzdWJleHByZXNzaW9uc1swXTsKKyAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSA9IGlkLT5wcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllcjsKKyAgICAgIFlZTFRZUEUgbG9jID0gZ2V0X2xvY2F0aW9uKCk7CisgICAgICBleGVjX2xpc3QgYWN0dWFsX3BhcmFtZXRlcnM7CisKKyAgICAgIHByb2Nlc3NfcGFyYW1ldGVycyhpbnN0cnVjdGlvbnMsICZhY3R1YWxfcGFyYW1ldGVycywgJnRoaXMtPmV4cHJlc3Npb25zLAorCQkJIHN0YXRlKTsKKworICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPQorCSBtYXRjaF9mdW5jdGlvbl9ieV9uYW1lKGZ1bmNfbmFtZSwgJmFjdHVhbF9wYXJhbWV0ZXJzLCBzdGF0ZSk7CisKKyAgICAgIGlyX3J2YWx1ZSAqdmFsdWUgPSBOVUxMOworICAgICAgaWYgKHNpZyA9PSBOVUxMKSB7CisJIG5vX21hdGNoaW5nX2Z1bmN0aW9uX2Vycm9yKGZ1bmNfbmFtZSwgJmxvYywgJmFjdHVhbF9wYXJhbWV0ZXJzLCBzdGF0ZSk7CisJIHZhbHVlID0gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgICAgfSBlbHNlIGlmICghdmVyaWZ5X3BhcmFtZXRlcl9tb2RlcyhzdGF0ZSwgc2lnLCBhY3R1YWxfcGFyYW1ldGVycywgdGhpcy0+ZXhwcmVzc2lvbnMpKSB7CisJIC8qIGFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gZW1pdHRlZCAqLworCSB2YWx1ZSA9IGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgICAgIH0gZWxzZSB7CisJIHZhbHVlID0gZ2VuZXJhdGVfY2FsbChpbnN0cnVjdGlvbnMsIHNpZywgJmFjdHVhbF9wYXJhbWV0ZXJzLCBzdGF0ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgIH0KKworICAgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKK30KKworaXJfcnZhbHVlICoKK2FzdF9hZ2dyZWdhdGVfaW5pdGlhbGl6ZXI6OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgIGlmICghdGhpcy0+Y29uc3RydWN0b3JfdHlwZSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgInR5cGUgb2YgQy1zdHlsZSBpbml0aWFsaXplciB1bmtub3duIik7CisgICAgICByZXR1cm4gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgfQorICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCBjb25zdHJ1Y3Rvcl90eXBlID0gdGhpcy0+Y29uc3RydWN0b3JfdHlwZTsKKworICAgaWYgKCFzdGF0ZS0+QVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFja19lbmFibGUpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJDLXN0eWxlIGluaXRpYWxpemF0aW9uIHJlcXVpcmVzIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIGV4dGVuc2lvbiIpOworICAgICAgcmV0dXJuIGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKKyAgIH0KKworICAgaWYgKGNvbnN0cnVjdG9yX3R5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIHJldHVybiBwcm9jZXNzX2FycmF5X2NvbnN0cnVjdG9yKGluc3RydWN0aW9ucywgY29uc3RydWN0b3JfdHlwZSwgJmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGlzLT5leHByZXNzaW9ucywgc3RhdGUpOworICAgfQorCisgICBpZiAoY29uc3RydWN0b3JfdHlwZS0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIHJldHVybiBwcm9jZXNzX3JlY29yZF9jb25zdHJ1Y3RvcihpbnN0cnVjdGlvbnMsIGNvbnN0cnVjdG9yX3R5cGUsICZsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoaXMtPmV4cHJlc3Npb25zLCBzdGF0ZSk7CisgICB9CisKKyAgIHJldHVybiBwcm9jZXNzX3ZlY19tYXRfY29uc3RydWN0b3IoaW5zdHJ1Y3Rpb25zLCBjb25zdHJ1Y3Rvcl90eXBlLCAmbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhpcy0+ZXhwcmVzc2lvbnMsIHN0YXRlKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0X3RvX2hpci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2FzdF90b19oaXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjBjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2FzdF90b19oaXIuY3BwCkBAIC0wLDAgKzEsNTczMSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgYXN0X3RvX2hpci5jCisgKiBDb252ZXJ0IGFic3RyYWN0IHN5bnRheCB0byB0byBoaWdoLWxldmVsIGludGVybWVkaWF0ZSByZXByZW5zZW50YXRpb24gKEhJUikuCisgKgorICogRHVyaW5nIHRoZSBjb252ZXJzaW9uIHRvIEhJUiwgdGhlIG1ham9yaXR5IG9mIHRoZSBzeW1hbnRpYyBjaGVja2luZyBpcworICogcHJlZm9ybWVkIG9uIHRoZSBwcm9ncmFtLiAgVGhpcyBpbmNsdWRlczoKKyAqCisgKiAgICAqIFN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50CisgKiAgICAqIFR5cGUgY2hlY2tpbmcKKyAqICAgICogRnVuY3Rpb24gYmluZGluZworICoKKyAqIFRoZSBtYWpvcml0eSBvZiB0aGlzIHdvcmsgY291bGQgYmUgZG9uZSBkdXJpbmcgcGFyc2luZywgYW5kIHRoZSBwYXJzZXIgY291bGQKKyAqIHByb2JhYmx5IGdlbmVyYXRlIEhJUiBkaXJlY3RseS4gIEhvd2V2ZXIsIHRoaXMgcmVzdWx0cyBpbiBmcmVxdWVudCBjaGFuZ2VzCisgKiB0byB0aGUgcGFyc2VyIGNvZGUuICBTaW5jZSB3ZSBkbyBub3QgYXNzdW1lIHRoYXQgZXZlcnkgc3lzdGVtIHRoaXMgY29tcGlsZXIKKyAqIGlzIGJ1aWx0IG9uIHdpbGwgaGF2ZSBGbGV4IGFuZCBCaXNvbiBpbnN0YWxsZWQsIHdlIGhhdmUgdG8gc3RvcmUgdGhlIGNvZGUKKyAqIGdlbmVyYXRlZCBieSB0aGVzZSB0b29scyBpbiBvdXIgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4gIEluIG90aGVyIHBhcnRzIG9mCisgKiB0aGUgc3lzdGVtIHdlJ3ZlIHNlZW4gcHJvYmxlbXMgd2hlcmUgYSBwYXJzZXIgd2FzIGNoYW5nZWQgYnV0IHRoZSBnZW5lcmF0ZWQKKyAqIGNvZGUgd2FzIG5vdCBjb21taXR0ZWQsIG1lcmdlIGNvbmZsaWN0cyB3aGVyZSBjcmVhdGVkIGJlY2F1c2UgdHdvIGRldmVsb3BlcnMKKyAqIGhhZCBzbGlnaHRseSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQmlzb24gaW5zdGFsbGVkLCBldGMuCisgKgorICogSSBoYXZlIGFsc28gbm90aWNlZCB0aGF0IHJ1bm5pbmcgQmlzb24gZ2VuZXJhdGVkIHBhcnNlcnMgaW4gR0RCIGlzIHZlcnkKKyAqIGlycml0YXRpbmcuICBXaGVuIHlvdSBnZXQgYSBzZWdmYXVsdCBvbiAnJCQgPSAkMS0+Zm9vJywgeW91IGNhbid0IHZlcnkKKyAqIHdlbGwgJ3ByaW50ICQxJyBpbiBHREIuCisgKgorICogQXMgYSByZXN1bHQsIG15IHByZWZlcmVuY2UgaXMgdG8gcHV0IGFzIGxpdHRsZSBDIGNvZGUgYXMgcG9zc2libGUgaW4gdGhlCisgKiBwYXJzZXIgKGFuZCBsZXhlcikgc291cmNlcy4KKyAqLworCisjaW5jbHVkZSAibGliZm5zLmgiIC8vIEx1bmFyRyBBREQ6CisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRyBBREQ6CisjaW5jbHVkZSAiZ2xzbF9zeW1ib2xfdGFibGUuaCIKKyNpbmNsdWRlICJnbHNsX3BhcnNlcl9leHRyYXMuaCIKKyNpbmNsdWRlICJhc3QuaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl9idWlsZGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBpcl9idWlsZGVyOworCitzdGF0aWMgdm9pZAorZGV0ZWN0X2NvbmZsaWN0aW5nX2Fzc2lnbm1lbnRzKHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7CitzdGF0aWMgdm9pZAorcmVtb3ZlX3Blcl92ZXJ0ZXhfYmxvY2tzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLCBpcl92YXJpYWJsZV9tb2RlIG1vZGUpOworCisKK3ZvaWQKK19tZXNhX2FzdF90b19oaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIF9tZXNhX2dsc2xfaW5pdGlhbGl6ZV92YXJpYWJsZXMoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgIHN0YXRlLT5zeW1ib2xzLT5zZXBhcmF0ZV9mdW5jdGlvbl9uYW1lc3BhY2UgPSBzdGF0ZS0+bGFuZ3VhZ2VfdmVyc2lvbiA9PSAxMTA7CisKKyAgIHN0YXRlLT5jdXJyZW50X2Z1bmN0aW9uID0gTlVMTDsKKworICAgc3RhdGUtPnRvcGxldmVsX2lyID0gaW5zdHJ1Y3Rpb25zOworCisgICBzdGF0ZS0+Z3NfaW5wdXRfcHJpbV90eXBlX3NwZWNpZmllZCA9IGZhbHNlOworICAgc3RhdGUtPmNzX2lucHV0X2xvY2FsX3NpemVfc3BlY2lmaWVkID0gZmFsc2U7CisKKyAgIC8qIFNlY3Rpb24gNC4yIG9mIHRoZSBHTFNMIDEuMjAgc3BlY2lmaWNhdGlvbiBzdGF0ZXM6CisgICAgKiAiVGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBhcmUgc2NvcGVkIGluIGEgc2NvcGUgb3V0c2lkZSB0aGUgZ2xvYmFsIHNjb3BlCisgICAgKiAgdXNlcnMgZGVjbGFyZSBnbG9iYWwgdmFyaWFibGVzIGluLiAgVGhhdCBpcywgYSBzaGFkZXIncyBnbG9iYWwgc2NvcGUsCisgICAgKiAgYXZhaWxhYmxlIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZCBnbG9iYWwgdmFyaWFibGVzLCBpcyBuZXN0ZWQKKyAgICAqICBpbnNpZGUgdGhlIHNjb3BlIGNvbnRhaW5pbmcgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucy4iCisgICAgKgorICAgICogU2luY2UgYnVpbHQtaW4gZnVuY3Rpb25zIGxpa2UgZnRyYW5zZm9ybSgpIGFjY2VzcyBidWlsdC1pbiB2YXJpYWJsZXMsCisgICAgKiBpdCBmb2xsb3dzIHRoYXQgdGhvc2UgbXVzdCBiZSBpbiB0aGUgb3V0ZXIgc2NvcGUgYXMgd2VsbC4KKyAgICAqCisgICAgKiBXZSBwdXNoIHNjb3BlIGhlcmUgdG8gY3JlYXRlIHRoaXMgbmVzdGluZyBlZmZlY3QuLi5idXQgZG9uJ3QgcG9wLgorICAgICogVGhpcyB3YXksIGEgc2hhZGVyJ3MgZ2xvYmFscyBhcmUgc3RpbGwgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdXNlCisgICAgKiBieSB0aGUgbGlua2VyLgorICAgICovCisgICBzdGF0ZS0+c3ltYm9scy0+cHVzaF9zY29wZSgpOworCisgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9ub2RlLCBhc3QsIGxpbmssICYgc3RhdGUtPnRyYW5zbGF0aW9uX3VuaXQpCisgICAgICBhc3QtPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgZGV0ZWN0X3JlY3Vyc2lvbl91bmxpbmtlZChzdGF0ZSwgaW5zdHJ1Y3Rpb25zKTsKKyAgIGRldGVjdF9jb25mbGljdGluZ19hc3NpZ25tZW50cyhzdGF0ZSwgaW5zdHJ1Y3Rpb25zKTsKKworICAgc3RhdGUtPnRvcGxldmVsX2lyID0gTlVMTDsKKworICAgLyogTW92ZSBhbGwgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyB0byB0aGUgZnJvbnQgb2YgdGhlIElSIGxpc3QsIGFuZAorICAgICogcmV2ZXJzZSB0aGUgb3JkZXIuICBUaGlzIGhhcyB0aGUgKGludGVuZGVkISkgc2lkZSBlZmZlY3QgdGhhdCB2ZXJ0ZXgKKyAgICAqIHNoYWRlciBpbnB1dHMgYW5kIGZyYWdtZW50IHNoYWRlciBvdXRwdXRzIHdpbGwgYXBwZWFyIGluIHRoZSBJUiBpbiB0aGUKKyAgICAqIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFwcGVhcmVkIGluIHRoZSBzaGFkZXIgY29kZS4gIFRoaXMgcmVzdWx0cyBpbiB0aGUKKyAgICAqIGxvY2F0aW9ucyBiZWluZyBhc3NpZ25lZCBpbiB0aGUgZGVjbGFyZWQgb3JkZXIuICBNYW55IChhcmd1YWJseSBidWdneSkKKyAgICAqIGFwcGxpY2F0aW9ucyBkZXBlbmQgb24gdGhpcyBiZWhhdmlvciwgYW5kIGl0IG1hdGNoZXMgd2hhdCBuZWFybHkgYWxsCisgICAgKiBvdGhlciBkcml2ZXJzIGRvLgorICAgICovCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAodmFyID09IE5VTEwpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgdmFyLT5yZW1vdmUoKTsKKyAgICAgIGluc3RydWN0aW9ucy0+cHVzaF9oZWFkKHZhcik7CisgICB9CisKKyAgIC8qIEZpZ3VyZSBvdXQgaWYgZ2xfRnJhZ0Nvb3JkIGlzIGFjdHVhbGx5IHVzZWQgaW4gZnJhZ21lbnQgc2hhZGVyICovCisgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gc3RhdGUtPnN5bWJvbHMtPmdldF92YXJpYWJsZSgiZ2xfRnJhZ0Nvb3JkIik7CisgICBpZiAodmFyICE9IE5VTEwpCisgICAgICBzdGF0ZS0+ZnNfdXNlc19nbF9mcmFnY29vcmQgPSB2YXItPmRhdGEudXNlZDsKKworICAgLyogRnJvbSBzZWN0aW9uIDcuMSAoQnVpbHQtSW4gTGFuZ3VhZ2UgVmFyaWFibGVzKSBvZiB0aGUgR0xTTCA0LjEwIHNwZWM6CisgICAgKgorICAgICogICAgIElmIG11bHRpcGxlIHNoYWRlcnMgdXNpbmcgbWVtYmVycyBvZiBhIGJ1aWx0LWluIGJsb2NrIGJlbG9uZ2luZyB0bworICAgICogICAgIHRoZSBzYW1lIGludGVyZmFjZSBhcmUgbGlua2VkIHRvZ2V0aGVyIGluIHRoZSBzYW1lIHByb2dyYW0sIHRoZXkKKyAgICAqICAgICBtdXN0IGFsbCByZWRlY2xhcmUgdGhlIGJ1aWx0LWluIGJsb2NrIGluIHRoZSBzYW1lIHdheSwgYXMgZGVzY3JpYmVkCisgICAgKiAgICAgaW4gc2VjdGlvbiA0LjMuNyAiSW50ZXJmYWNlIEJsb2NrcyIgZm9yIGludGVyZmFjZSBibG9jayBtYXRjaGluZywgb3IKKyAgICAqICAgICBhIGxpbmsgZXJyb3Igd2lsbCByZXN1bHQuCisgICAgKgorICAgICogVGhlIHBocmFzZSAidXNpbmcgbWVtYmVycyBvZiBhIGJ1aWx0LWluIGJsb2NrIiBpbXBsaWVzIHRoYXQgaWYgdHdvCisgICAgKiBzaGFkZXJzIGFyZSBsaW5rZWQgdG9nZXRoZXIgYW5kIG9uZSBvZiB0aGVtICpkb2VzIG5vdCB1c2UqIGFueSBtZW1iZXJzCisgICAgKiBvZiB0aGUgYnVpbHQtaW4gYmxvY2ssIHRoZW4gdGhhdCBzaGFkZXIgZG9lcyBub3QgbmVlZCB0byBoYXZlIGEgbWF0Y2hpbmcKKyAgICAqIHJlZGVjbGFyYXRpb24gb2YgdGhlIGJ1aWx0LWluIGJsb2NrLgorICAgICoKKyAgICAqIFRoaXMgYXBwZWFycyB0byBiZSBhIGNsYXJpZmljYXRpb24gdG8gdGhlIGJlaGF2aW91ciBlc3RhYmxpc2hlZCBmb3IKKyAgICAqIGdsX1BlclZlcnRleCBieSBHTFNMIDEuNTAsIHRoZXJlZm9yZSBpbXBsZW1lbnQgaXQgcmVnYXJkbGVzcyBvZiBHTFNMCisgICAgKiB2ZXJzaW9uLgorICAgICoKKyAgICAqIFRoZSBkZWZpbml0aW9uIG9mICJpbnRlcmZhY2UiIGluIHNlY3Rpb24gNC4zLjcgdGhhdCBhcHBsaWVzIGhlcmUgaXMgYXMKKyAgICAqIGZvbGxvd3M6CisgICAgKgorICAgICogICAgIFRoZSBib3VuZGFyeSBiZXR3ZWVuIGFkamFjZW50IHByb2dyYW1tYWJsZSBwaXBlbGluZSBzdGFnZXM6IFRoaXMKKyAgICAqICAgICBzcGFucyBhbGwgdGhlIG91dHB1dHMgaW4gYWxsIGNvbXBpbGF0aW9uIHVuaXRzIG9mIHRoZSBmaXJzdCBzdGFnZQorICAgICogICAgIGFuZCBhbGwgdGhlIGlucHV0cyBpbiBhbGwgY29tcGlsYXRpb24gdW5pdHMgb2YgdGhlIHNlY29uZCBzdGFnZS4KKyAgICAqCisgICAgKiBUaGVyZWZvcmUgdGhpcyBydWxlIGFwcGxpZXMgdG8gYm90aCBpbnRlci0gYW5kIGludHJhLXN0YWdlIGxpbmtpbmcuCisgICAgKgorICAgICogVGhlIGVhc2llc3Qgd2F5IHRvIGltcGxlbWVudCB0aGlzIGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNoYWRlciB1c2VzCisgICAgKiBnbF9QZXJWZXJ0ZXggcmlnaHQgYWZ0ZXIgYXN0LXRvLWlyIGNvbnZlcnNpb24sIGFuZCBpZiBpdCBkb2Vzbid0LCBzaW1wbHkKKyAgICAqIHJlbW92ZSBhbGwgdGhlIHJlbGV2YW50IHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyb20gdGhlIElSLCBzbyB0aGF0IHRoZQorICAgICogbGlua2VyIHdvbid0IHNlZSB0aGVtIGFuZCBjb21wbGFpbiBhYm91dCBtaXNtYXRjaGVzLgorICAgICovCisgICByZW1vdmVfcGVyX3ZlcnRleF9ibG9ja3MoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwgaXJfdmFyX3NoYWRlcl9pbik7CisgICByZW1vdmVfcGVyX3ZlcnRleF9ibG9ja3MoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwgaXJfdmFyX3NoYWRlcl9vdXQpOworfQorCisKKy8qKgorICogSWYgYSBjb252ZXJzaW9uIGlzIGF2YWlsYWJsZSwgY29udmVydCBvbmUgb3BlcmFuZCB0byBhIGRpZmZlcmVudCB0eXBlCisgKgorICogVGhlIFxjIGZyb20gXGMgaXJfcnZhbHVlIGlzIGNvbnZlcnRlZCAiaW4gcGxhY2UiLgorICoKKyAqIFxwYXJhbSB0byAgICAgVHlwZSB0aGF0IHRoZSBvcGVyYW5kIGl0IHRvIGJlIGNvbnZlcnRlZCB0bworICogXHBhcmFtIGZyb20gICBPcGVyYW5kIHRoYXQgaXMgYmVpbmcgY29udmVydGVkCisgKiBccGFyYW0gc3RhdGUgIEdMU0wgY29tcGlsZXIgc3RhdGUKKyAqCisgKiBccmV0dXJuCisgKiBJZiBhIGNvbnZlcnNpb24gaXMgcG9zc2libGUgKG9yIHVubmVjZXNzYXJ5KSwgXGMgdHJ1ZSBpcyByZXR1cm5lZC4KKyAqIE90aGVyd2lzZSBcYyBmYWxzZSBpcyByZXR1cm5lZC4KKyAqLworYm9vbAorYXBwbHlfaW1wbGljaXRfY29udmVyc2lvbihjb25zdCBnbHNsX3R5cGUgKnRvLCBpcl9ydmFsdWUgKiAmZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICBpZiAodG8tPmJhc2VfdHlwZSA9PSBmcm9tLT50eXBlLT5iYXNlX3R5cGUpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgLyogVGhpcyBjb252ZXJzaW9uIHdhcyBhZGRlZCBpbiBHTFNMIDEuMjAuICBJZiB0aGUgY29tcGlsYXRpb24gbW9kZSBpcworICAgICogR0xTTCAxLjEwLCB0aGUgY29udmVyc2lvbiBpcyBza2lwcGVkLgorICAgICovCisgICBpZiAoIXN0YXRlLT5pc192ZXJzaW9uKDEyMCwgMCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIEZyb20gcGFnZSAyNyAocGFnZSAzMyBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgKgorICAgICogICAgIlRoZXJlIGFyZSBubyBpbXBsaWNpdCBhcnJheSBvciBzdHJ1Y3R1cmUgY29udmVyc2lvbnMuIEZvcgorICAgICogICAgZXhhbXBsZSwgYW4gYXJyYXkgb2YgaW50IGNhbm5vdCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhbgorICAgICogICAgYXJyYXkgb2YgZmxvYXQuIFRoZXJlIGFyZSBubyBpbXBsaWNpdCBjb252ZXJzaW9ucyBiZXR3ZWVuCisgICAgKiAgICBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXJzLiIKKyAgICAqLworICAgLyogRklOSVNITUU6IFRoZSBhYm92ZSBjb21tZW50IGlzIHBhcnRpYWxseSBhIGxpZS4gIFRoZXJlIGlzIGludC91aW50CisgICAgKiBGSU5JU0hNRTogY29udmVyc2lvbiBmb3IgaW1tZWRpYXRlIGNvbnN0YW50cy4KKyAgICAqLworICAgaWYgKCF0by0+aXNfZmxvYXQoKSB8fCAhZnJvbS0+dHlwZS0+aXNfbnVtZXJpYygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBDb252ZXJ0IHRvIGEgZmxvYXRpbmcgcG9pbnQgdHlwZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBjb21wb25lbnRzCisgICAgKiBhcyB0aGUgb3JpZ2luYWwgdHlwZSAtIGkuZS4gaW50IHRvIGZsb2F0LCBub3QgaW50IHRvIHZlYzQuCisgICAgKi8KKyAgIHRvID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0ZMT0FULCBmcm9tLT50eXBlLT52ZWN0b3JfZWxlbWVudHMsCisJCQkgICAgICAgIGZyb20tPnR5cGUtPm1hdHJpeF9jb2x1bW5zKTsKKworICAgc3dpdGNoIChmcm9tLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgICAgIGZyb20gPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfaTJmLCB0bywgZnJvbSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICBmcm9tID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX3UyZiwgdG8sIGZyb20sIE5VTEwpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorICAgICAgZnJvbSA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9iMmYsIHRvLCBmcm9tLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwKTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKgorYXJpdGhtZXRpY19yZXN1bHRfdHlwZShpcl9ydmFsdWUgKiAmdmFsdWVfYSwgaXJfcnZhbHVlICogJnZhbHVlX2IsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXVsdGlwbHksCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgWVlMVFlQRSAqbG9jKQoreworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlX2EgPSB2YWx1ZV9hLT50eXBlOworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlX2IgPSB2YWx1ZV9iLT50eXBlOworCisgICAvKiBGcm9tIEdMU0wgMS41MCBzcGVjLCBwYWdlIDU2OgorICAgICoKKyAgICAqICAgICJUaGUgYXJpdGhtZXRpYyBiaW5hcnkgb3BlcmF0b3JzIGFkZCAoKyksIHN1YnRyYWN0ICgtKSwKKyAgICAqICAgIG11bHRpcGx5ICgqKSwgYW5kIGRpdmlkZSAoLykgb3BlcmF0ZSBvbiBpbnRlZ2VyIGFuZAorICAgICogICAgZmxvYXRpbmctcG9pbnQgc2NhbGFycywgdmVjdG9ycywgYW5kIG1hdHJpY2VzLiIKKyAgICAqLworICAgaWYgKCF0eXBlX2EtPmlzX251bWVyaWMoKSB8fCAhdHlwZV9iLT5pc19udW1lcmljKCkpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhbmRzIHRvIGFyaXRobWV0aWMgb3BlcmF0b3JzIG11c3QgYmUgbnVtZXJpYyIpOworICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKworCisgICAvKiAgICAiSWYgb25lIG9wZXJhbmQgaXMgZmxvYXRpbmctcG9pbnQgYmFzZWQgYW5kIHRoZSBvdGhlciBpcworICAgICogICAgbm90LCB0aGVuIHRoZSBjb252ZXJzaW9ucyBmcm9tIFNlY3Rpb24gNC4xLjEwICJJbXBsaWNpdAorICAgICogICAgQ29udmVyc2lvbnMiIGFyZSBhcHBsaWVkIHRvIHRoZSBub24tZmxvYXRpbmctcG9pbnQtYmFzZWQgb3BlcmFuZC4iCisgICAgKi8KKyAgIGlmICghYXBwbHlfaW1wbGljaXRfY29udmVyc2lvbih0eXBlX2EsIHZhbHVlX2IsIHN0YXRlKQorICAgICAgICYmICFhcHBseV9pbXBsaWNpdF9jb252ZXJzaW9uKHR5cGVfYiwgdmFsdWVfYSwgc3RhdGUpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgaW1wbGljaXRseSBjb252ZXJ0IG9wZXJhbmRzIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFyaXRobWV0aWMgb3BlcmF0b3IiKTsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisgICB0eXBlX2EgPSB2YWx1ZV9hLT50eXBlOworICAgdHlwZV9iID0gdmFsdWVfYi0+dHlwZTsKKworICAgLyogICAgIklmIHRoZSBvcGVyYW5kcyBhcmUgaW50ZWdlciB0eXBlcywgdGhleSBtdXN0IGJvdGggYmUgc2lnbmVkIG9yCisgICAgKiAgICBib3RoIGJlIHVuc2lnbmVkLiIKKyAgICAqCisgICAgKiBGcm9tIHRoaXMgcnVsZSBhbmQgdGhlIHByZWNlZGluZyBjb252ZXJzaW9uIGl0IGNhbiBiZSBpbmZlcnJlZCB0aGF0CisgICAgKiBib3RoIHR5cGVzIG11c3QgYmUgR0xTTF9UWVBFX0ZMT0FULCBvciBHTFNMX1RZUEVfVUlOVCwgb3IgR0xTTF9UWVBFX0lOVC4KKyAgICAqIFRoZSBpc19udW1lcmljIGNoZWNrIGFib3ZlIGFscmVhZHkgZmlsdGVyZWQgb3V0IHRoZSBjYXNlIHdoZXJlIGVpdGhlcgorICAgICogdHlwZSBpcyBub3Qgb25lIG9mIHRoZXNlLCBzbyBub3cgdGhlIGJhc2UgdHlwZXMgbmVlZCBvbmx5IGJlIHRlc3RlZCBmb3IKKyAgICAqIGVxdWFsaXR5LgorICAgICovCisgICBpZiAodHlwZV9hLT5iYXNlX3R5cGUgIT0gdHlwZV9iLT5iYXNlX3R5cGUpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImJhc2UgdHlwZSBtaXNtYXRjaCBmb3IgYXJpdGhtZXRpYyBvcGVyYXRvciIpOworICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKworICAgLyogICAgIkFsbCBhcml0aG1ldGljIGJpbmFyeSBvcGVyYXRvcnMgcmVzdWx0IGluIHRoZSBzYW1lIGZ1bmRhbWVudGFsIHR5cGUKKyAgICAqICAgIChzaWduZWQgaW50ZWdlciwgdW5zaWduZWQgaW50ZWdlciwgb3IgZmxvYXRpbmctcG9pbnQpIGFzIHRoZQorICAgICogICAgb3BlcmFuZHMgdGhleSBvcGVyYXRlIG9uLCBhZnRlciBvcGVyYW5kIHR5cGUgY29udmVyc2lvbi4gQWZ0ZXIKKyAgICAqICAgIGNvbnZlcnNpb24sIHRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIHZhbGlkCisgICAgKgorICAgICogICAgKiBUaGUgdHdvIG9wZXJhbmRzIGFyZSBzY2FsYXJzLiBJbiB0aGlzIGNhc2UgdGhlIG9wZXJhdGlvbiBpcworICAgICogICAgICBhcHBsaWVkLCByZXN1bHRpbmcgaW4gYSBzY2FsYXIuIgorICAgICovCisgICBpZiAodHlwZV9hLT5pc19zY2FsYXIoKSAmJiB0eXBlX2ItPmlzX3NjYWxhcigpKQorICAgICAgcmV0dXJuIHR5cGVfYTsKKworICAgLyogICAiKiBPbmUgb3BlcmFuZCBpcyBhIHNjYWxhciwgYW5kIHRoZSBvdGhlciBpcyBhIHZlY3RvciBvciBtYXRyaXguCisgICAgKiAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHNjYWxhciBvcGVyYXRpb24gaXMgYXBwbGllZCBpbmRlcGVuZGVudGx5IHRvIGVhY2gKKyAgICAqICAgICAgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3Igb3IgbWF0cml4LCByZXN1bHRpbmcgaW4gdGhlIHNhbWUgc2l6ZQorICAgICogICAgICB2ZWN0b3Igb3IgbWF0cml4LiIKKyAgICAqLworICAgaWYgKHR5cGVfYS0+aXNfc2NhbGFyKCkpIHsKKyAgICAgIGlmICghdHlwZV9iLT5pc19zY2FsYXIoKSkKKyAgICAgICAgIHJldHVybiB0eXBlX2I7CisgICB9IGVsc2UgaWYgKHR5cGVfYi0+aXNfc2NhbGFyKCkpIHsKKyAgICAgIHJldHVybiB0eXBlX2E7CisgICB9CisKKyAgIC8qIEFsbCBvZiB0aGUgY29tYmluYXRpb25zIG9mIDxzY2FsYXIsIHNjYWxhcj4sIDx2ZWN0b3IsIHNjYWxhcj4sCisgICAgKiA8c2NhbGFyLCB2ZWN0b3I+LCA8c2NhbGFyLCBtYXRyaXg+LCBhbmQgPG1hdHJpeCwgc2NhbGFyPiBoYXZlIGJlZW4KKyAgICAqIGhhbmRsZWQuCisgICAgKi8KKyAgIGFzc2VydCghdHlwZV9hLT5pc19zY2FsYXIoKSk7CisgICBhc3NlcnQoIXR5cGVfYi0+aXNfc2NhbGFyKCkpOworCisgICAvKiAgICIqIFRoZSB0d28gb3BlcmFuZHMgYXJlIHZlY3RvcnMgb2YgdGhlIHNhbWUgc2l6ZS4gSW4gdGhpcyBjYXNlLCB0aGUKKyAgICAqICAgICAgb3BlcmF0aW9uIGlzIGRvbmUgY29tcG9uZW50LXdpc2UgcmVzdWx0aW5nIGluIHRoZSBzYW1lIHNpemUKKyAgICAqICAgICAgdmVjdG9yLiIKKyAgICAqLworICAgaWYgKHR5cGVfYS0+aXNfdmVjdG9yKCkgJiYgdHlwZV9iLT5pc192ZWN0b3IoKSkgeworICAgICAgaWYgKHR5cGVfYSA9PSB0eXBlX2IpIHsKKyAgICAgICAgIHJldHVybiB0eXBlX2E7CisgICAgICB9IGVsc2UgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidmVjdG9yIHNpemUgbWlzbWF0Y2ggZm9yIGFyaXRobWV0aWMgb3BlcmF0b3IiKTsKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICAgICB9CisgICB9CisKKyAgIC8qIEFsbCBvZiB0aGUgY29tYmluYXRpb25zIG9mIDxzY2FsYXIsIHNjYWxhcj4sIDx2ZWN0b3IsIHNjYWxhcj4sCisgICAgKiA8c2NhbGFyLCB2ZWN0b3I+LCA8c2NhbGFyLCBtYXRyaXg+LCA8bWF0cml4LCBzY2FsYXI+LCBhbmQKKyAgICAqIDx2ZWN0b3IsIHZlY3Rvcj4gaGF2ZSBiZWVuIGhhbmRsZWQuICBBdCBsZWFzdCBvbmUgb2YgdGhlIG9wZXJhbmRzIG11c3QKKyAgICAqIGJlIG1hdHJpeC4gIEZ1cnRoZXIsIHNpbmNlIHRoZXJlIGFyZSBubyBpbnRlZ2VyIG1hdHJpeCB0eXBlcywgdGhlIGJhc2UKKyAgICAqIHR5cGUgb2YgYm90aCBvcGVyYW5kcyBtdXN0IGJlIGZsb2F0LgorICAgICovCisgICBhc3NlcnQodHlwZV9hLT5pc19tYXRyaXgoKSB8fCB0eXBlX2ItPmlzX21hdHJpeCgpKTsKKyAgIGFzc2VydCh0eXBlX2EtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgYXNzZXJ0KHR5cGVfYi0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisKKyAgIC8qICAgIiogVGhlIG9wZXJhdG9yIGlzIGFkZCAoKyksIHN1YnRyYWN0ICgtKSwgb3IgZGl2aWRlICgvKSwgYW5kIHRoZQorICAgICogICAgICBvcGVyYW5kcyBhcmUgbWF0cmljZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhbmQgdGhlIHNhbWUKKyAgICAqICAgICAgbnVtYmVyIG9mIGNvbHVtbnMuIEluIHRoaXMgY2FzZSwgdGhlIG9wZXJhdGlvbiBpcyBkb25lIGNvbXBvbmVudC0KKyAgICAqICAgICAgd2lzZSByZXN1bHRpbmcgaW4gdGhlIHNhbWUgc2l6ZSBtYXRyaXguIgorICAgICogICAgKiBUaGUgb3BlcmF0b3IgaXMgbXVsdGlwbHkgKCopLCB3aGVyZSBib3RoIG9wZXJhbmRzIGFyZSBtYXRyaWNlcyBvcgorICAgICogICAgICBvbmUgb3BlcmFuZCBpcyBhIHZlY3RvciBhbmQgdGhlIG90aGVyIGEgbWF0cml4LiBBIHJpZ2h0IHZlY3RvcgorICAgICogICAgICBvcGVyYW5kIGlzIHRyZWF0ZWQgYXMgYSBjb2x1bW4gdmVjdG9yIGFuZCBhIGxlZnQgdmVjdG9yIG9wZXJhbmQgYXMgYQorICAgICogICAgICByb3cgdmVjdG9yLiBJbiBhbGwgdGhlc2UgY2FzZXMsIGl0IGlzIHJlcXVpcmVkIHRoYXQgdGhlIG51bWJlciBvZgorICAgICogICAgICBjb2x1bW5zIG9mIHRoZSBsZWZ0IG9wZXJhbmQgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZQorICAgICogICAgICByaWdodCBvcGVyYW5kLiBUaGVuLCB0aGUgbXVsdGlwbHkgKCopIG9wZXJhdGlvbiBkb2VzIGEgbGluZWFyCisgICAgKiAgICAgIGFsZ2VicmFpYyBtdWx0aXBseSwgeWllbGRpbmcgYW4gb2JqZWN0IHRoYXQgaGFzIHRoZSBzYW1lIG51bWJlciBvZgorICAgICogICAgICByb3dzIGFzIHRoZSBsZWZ0IG9wZXJhbmQgYW5kIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIGFzIHRoZSByaWdodAorICAgICogICAgICBvcGVyYW5kLiBTZWN0aW9uIDUuMTAgIlZlY3RvciBhbmQgTWF0cml4IE9wZXJhdGlvbnMiIGV4cGxhaW5zIGluCisgICAgKiAgICAgIG1vcmUgZGV0YWlsIGhvdyB2ZWN0b3JzIGFuZCBtYXRyaWNlcyBhcmUgb3BlcmF0ZWQgb24uIgorICAgICovCisgICBpZiAoISBtdWx0aXBseSkgeworICAgICAgaWYgKHR5cGVfYSA9PSB0eXBlX2IpCisgICAgICAgICByZXR1cm4gdHlwZV9hOworICAgfSBlbHNlIHsKKyAgICAgIGlmICh0eXBlX2EtPmlzX21hdHJpeCgpICYmIHR5cGVfYi0+aXNfbWF0cml4KCkpIHsKKyAgICAgICAgIC8qIE1hdHJpeCBtdWx0aXBseS4gIFRoZSBjb2x1bW5zIG9mIEEgbXVzdCBtYXRjaCB0aGUgcm93cyBvZiBCLiAgR2l2ZW4KKyAgICAgICAgICAqIHRoZSBvdGhlciBwcmV2aW91c2x5IHRlc3RlZCBjb25zdHJhaW50cywgdGhpcyBtZWFucyB0aGUgdmVjdG9yIHR5cGUKKyAgICAgICAgICAqIG9mIGEgcm93IGZyb20gQSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSB2ZWN0b3IgdHlwZSBvZiBhIGNvbHVtbiBmcm9tCisgICAgICAgICAgKiBCLgorICAgICAgICAgICovCisgICAgICAgICBpZiAodHlwZV9hLT5yb3dfdHlwZSgpID09IHR5cGVfYi0+Y29sdW1uX3R5cGUoKSkgeworICAgICAgICAgICAgLyogVGhlIHJlc3VsdGluZyBtYXRyaXggaGFzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiBtYXRyaXggQiBhbmQKKyAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2Ygcm93cyBvZiBtYXRyaXggQS4gIFdlIGdldCB0aGUgcm93IGNvdW50IG9mIEEgYnkKKyAgICAgICAgICAgICAqIGxvb2tpbmcgYXQgdGhlIHNpemUgb2YgYSB2ZWN0b3IgdGhhdCBtYWtlcyB1cCBhIGNvbHVtbi4gIFRoZQorICAgICAgICAgICAgICogdHJhbnNwb3NlIChzaXplIG9mIGEgcm93KSBpcyBkb25lIGZvciBCLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHR5cGUgPQorICAgICAgICAgICAgICAgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UodHlwZV9hLT5iYXNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2EtPmNvbHVtbl90eXBlKCktPnZlY3Rvcl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfYi0+cm93X3R5cGUoKS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgICAgICAgIGFzc2VydCh0eXBlICE9IGdsc2xfdHlwZTo6ZXJyb3JfdHlwZSk7CisKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlX2EtPmlzX21hdHJpeCgpKSB7CisgICAgICAgICAvKiBBIGlzIGEgbWF0cml4IGFuZCBCIGlzIGEgY29sdW1uIHZlY3Rvci4gIENvbHVtbnMgb2YgQSBtdXN0IG1hdGNoCisgICAgICAgICAgKiByb3dzIG9mIEIuICBHaXZlbiB0aGUgb3RoZXIgcHJldmlvdXNseSB0ZXN0ZWQgY29uc3RyYWludHMsIHRoaXMKKyAgICAgICAgICAqIG1lYW5zIHRoZSB2ZWN0b3IgdHlwZSBvZiBhIHJvdyBmcm9tIEEgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUKKyAgICAgICAgICAqIHZlY3RvciB0aGUgdHlwZSBvZiBCLgorICAgICAgICAgICovCisgICAgICAgICBpZiAodHlwZV9hLT5yb3dfdHlwZSgpID09IHR5cGVfYikgeworICAgICAgICAgICAgLyogVGhlIHJlc3VsdGluZyB2ZWN0b3IgaGFzIGEgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFsIHRvCisgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHJvd3Mgb2YgbWF0cml4IEEuICovCisgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHR5cGUgPQorICAgICAgICAgICAgICAgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UodHlwZV9hLT5iYXNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2EtPmNvbHVtbl90eXBlKCktPnZlY3Rvcl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgYXNzZXJ0KHR5cGUgIT0gZ2xzbF90eXBlOjplcnJvcl90eXBlKTsKKworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgYXNzZXJ0KHR5cGVfYi0+aXNfbWF0cml4KCkpOworCisgICAgICAgICAvKiBBIGlzIGEgcm93IHZlY3RvciBhbmQgQiBpcyBhIG1hdHJpeC4gIENvbHVtbnMgb2YgQSBtdXN0IG1hdGNoIHJvd3MKKyAgICAgICAgICAqIG9mIEIuICBHaXZlbiB0aGUgb3RoZXIgcHJldmlvdXNseSB0ZXN0ZWQgY29uc3RyYWludHMsIHRoaXMgbWVhbnMKKyAgICAgICAgICAqIHRoZSB0eXBlIG9mIEEgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgdmVjdG9yIHR5cGUgb2YgYSBjb2x1bW4gZnJvbQorICAgICAgICAgICogQi4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHR5cGVfYSA9PSB0eXBlX2ItPmNvbHVtbl90eXBlKCkpIHsKKyAgICAgICAgICAgIC8qIFRoZSByZXN1bHRpbmcgdmVjdG9yIGhhcyBhIG51bWJlciBvZiBlbGVtZW50cyBlcXVhbCB0bworICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIG1hdHJpeCBCLiAqLworICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCB0eXBlID0KKyAgICAgICAgICAgICAgIGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKHR5cGVfYS0+YmFzZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9iLT5yb3dfdHlwZSgpLT52ZWN0b3JfZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgIGFzc2VydCh0eXBlICE9IGdsc2xfdHlwZTo6ZXJyb3JfdHlwZSk7CisKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJzaXplIG1pc21hdGNoIGZvciBtYXRyaXggbXVsdGlwbGljYXRpb24iKTsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisKKworICAgLyogICAgIkFsbCBvdGhlciBjYXNlcyBhcmUgaWxsZWdhbC4iCisgICAgKi8KKyAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgInR5cGUgbWlzbWF0Y2giKTsKKyAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKgordW5hcnlfYXJpdGhtZXRpY19yZXN1bHRfdHlwZShjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsIFlZTFRZUEUgKmxvYykKK3sKKyAgIC8qIEZyb20gR0xTTCAxLjUwIHNwZWMsIHBhZ2UgNTc6CisgICAgKgorICAgICogICAgIlRoZSBhcml0aG1ldGljIHVuYXJ5IG9wZXJhdG9ycyBuZWdhdGUgKC0pLCBwb3N0LSBhbmQgcHJlLWluY3JlbWVudAorICAgICogICAgIGFuZCBkZWNyZW1lbnQgKC0tIGFuZCArKykgb3BlcmF0ZSBvbiBpbnRlZ2VyIG9yIGZsb2F0aW5nLXBvaW50CisgICAgKiAgICAgdmFsdWVzIChpbmNsdWRpbmcgdmVjdG9ycyBhbmQgbWF0cmljZXMpLiBBbGwgdW5hcnkgb3BlcmF0b3JzIHdvcmsKKyAgICAqICAgICBjb21wb25lbnQtd2lzZSBvbiB0aGVpciBvcGVyYW5kcy4gVGhlc2UgcmVzdWx0IHdpdGggdGhlIHNhbWUgdHlwZQorICAgICogICAgIHRoZXkgb3BlcmF0ZWQgb24uIgorICAgICovCisgICBpZiAoIXR5cGUtPmlzX251bWVyaWMoKSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAib3BlcmFuZHMgdG8gYXJpdGhtZXRpYyBvcGVyYXRvcnMgbXVzdCBiZSBudW1lcmljIik7CisgICAgICByZXR1cm4gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgfQorCisgICByZXR1cm4gdHlwZTsKK30KKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSByZXN1bHQgdHlwZSBvZiBhIGJpdC1sb2dpYyBvcGVyYXRpb24uCisgKgorICogSWYgdGhlIGdpdmVuIHR5cGVzIHRvIHRoZSBiaXQtbG9naWMgb3BlcmF0b3IgYXJlIGludmFsaWQsIHJldHVybgorICogZ2xzbF90eXBlOjplcnJvcl90eXBlLgorICoKKyAqIFxwYXJhbSB0eXBlX2EgVHlwZSBvZiBMSFMgb2YgYml0LWxvZ2ljIG9wCisgKiBccGFyYW0gdHlwZV9iIFR5cGUgb2YgUkhTIG9mIGJpdC1sb2dpYyBvcAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqCitiaXRfbG9naWNfcmVzdWx0X3R5cGUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZV9hLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGVfYiwKKyAgICAgICAgICAgICAgICAgICAgICBhc3Rfb3BlcmF0b3JzIG9wLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgWVlMVFlQRSAqbG9jKQoreworICAgIGlmICghc3RhdGUtPmNoZWNrX2JpdHdpc2Vfb3BlcmF0aW9uc19hbGxvd2VkKGxvYykpIHsKKyAgICAgICByZXR1cm4gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgIH0KKworICAgIC8qIEZyb20gcGFnZSA1MCAocGFnZSA1NiBvZiBQREYpIG9mIEdMU0wgMS4zMCBzcGVjOgorICAgICAqCisgICAgICogICAgICJUaGUgYml0d2lzZSBvcGVyYXRvcnMgYW5kICgmKSwgZXhjbHVzaXZlLW9yICheKSwgYW5kIGluY2x1c2l2ZS1vcgorICAgICAqICAgICAofCkuIFRoZSBvcGVyYW5kcyBtdXN0IGJlIG9mIHR5cGUgc2lnbmVkIG9yIHVuc2lnbmVkIGludGVnZXJzIG9yCisgICAgICogICAgIGludGVnZXIgdmVjdG9ycy4iCisgICAgICovCisgICAgaWYgKCF0eXBlX2EtPmlzX2ludGVnZXIoKSkgeworICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgIkxIUyBvZiBgJXMnIG11c3QgYmUgYW4gaW50ZWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X2V4cHJlc3Npb246Om9wZXJhdG9yX3N0cmluZyhvcCkpOworICAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICAgfQorICAgIGlmICghdHlwZV9iLT5pc19pbnRlZ2VyKCkpIHsKKyAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJSSFMgb2YgYCVzJyBtdXN0IGJlIGFuIGludGVnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXN0X2V4cHJlc3Npb246Om9wZXJhdG9yX3N0cmluZyhvcCkpOworICAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICAgfQorCisgICAgLyogICAgICJUaGUgZnVuZGFtZW50YWwgdHlwZXMgb2YgdGhlIG9wZXJhbmRzIChzaWduZWQgb3IgdW5zaWduZWQpIG11c3QKKyAgICAgKiAgICAgbWF0Y2gsIgorICAgICAqLworICAgIGlmICh0eXBlX2EtPmJhc2VfdHlwZSAhPSB0eXBlX2ItPmJhc2VfdHlwZSkgeworICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgIm9wZXJhbmRzIG9mIGAlcycgbXVzdCBoYXZlIHRoZSBzYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlIHR5cGUiLCBhc3RfZXhwcmVzc2lvbjo6b3BlcmF0b3Jfc3RyaW5nKG9wKSk7CisgICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgICB9CisKKyAgICAvKiAgICAgIlRoZSBvcGVyYW5kcyBjYW5ub3QgYmUgdmVjdG9ycyBvZiBkaWZmZXJpbmcgc2l6ZS4iICovCisgICAgaWYgKHR5cGVfYS0+aXNfdmVjdG9yKCkgJiYKKyAgICAgICAgdHlwZV9iLT5pc192ZWN0b3IoKSAmJgorICAgICAgICB0eXBlX2EtPnZlY3Rvcl9lbGVtZW50cyAhPSB0eXBlX2ItPnZlY3Rvcl9lbGVtZW50cykgeworICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgIm9wZXJhbmRzIG9mIGAlcycgY2Fubm90IGJlIHZlY3RvcnMgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgImRpZmZlcmVudCBzaXplcyIsIGFzdF9leHByZXNzaW9uOjpvcGVyYXRvcl9zdHJpbmcob3ApKTsKKyAgICAgICByZXR1cm4gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgIH0KKworICAgIC8qICAgICAiSWYgb25lIG9wZXJhbmQgaXMgYSBzY2FsYXIgYW5kIHRoZSBvdGhlciBhIHZlY3RvciwgdGhlIHNjYWxhciBpcworICAgICAqICAgICBhcHBsaWVkIGNvbXBvbmVudC13aXNlIHRvIHRoZSB2ZWN0b3IsIHJlc3VsdGluZyBpbiB0aGUgc2FtZSB0eXBlIGFzCisgICAgICogICAgIHRoZSB2ZWN0b3IuIFRoZSBmdW5kYW1lbnRhbCB0eXBlcyBvZiB0aGUgb3BlcmFuZHMgWy4uLl0gd2lsbCBiZSB0aGUKKyAgICAgKiAgICAgcmVzdWx0aW5nIGZ1bmRhbWVudGFsIHR5cGUuIgorICAgICAqLworICAgIGlmICh0eXBlX2EtPmlzX3NjYWxhcigpKQorICAgICAgICByZXR1cm4gdHlwZV9iOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHR5cGVfYTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKgorbW9kdWx1c19yZXN1bHRfdHlwZShjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlX2EsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGVfYiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLCBZWUxUWVBFICpsb2MpCit7CisgICBpZiAoIXN0YXRlLT5jaGVja192ZXJzaW9uKDEzMCwgMzAwLCBsb2MsICJvcGVyYXRvciAnJSUnIGlzIHJlc2VydmVkIikpIHsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisKKyAgIC8qIEZyb20gR0xTTCAxLjUwIHNwZWMsIHBhZ2UgNTY6CisgICAgKiAgICAiVGhlIG9wZXJhdG9yIG1vZHVsdXMgKCUpIG9wZXJhdGVzIG9uIHNpZ25lZCBvciB1bnNpZ25lZCBpbnRlZ2VycyBvcgorICAgICogICAgaW50ZWdlciB2ZWN0b3JzLiBUaGUgb3BlcmFuZCB0eXBlcyBtdXN0IGJvdGggYmUgc2lnbmVkIG9yIGJvdGggYmUKKyAgICAqICAgIHVuc2lnbmVkLiIKKyAgICAqLworICAgaWYgKCF0eXBlX2EtPmlzX2ludGVnZXIoKSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLCAiTEhTIG9mIG9wZXJhdG9yICUlIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKyAgIGlmICghdHlwZV9iLT5pc19pbnRlZ2VyKCkpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgIlJIUyBvZiBvcGVyYXRvciAlJSBtdXN0IGJlIGFuIGludGVnZXIiKTsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisgICBpZiAodHlwZV9hLT5iYXNlX3R5cGUgIT0gdHlwZV9iLT5iYXNlX3R5cGUpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhbmRzIG9mICUlIG11c3QgaGF2ZSB0aGUgc2FtZSBiYXNlIHR5cGUiKTsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisKKyAgIC8qICAgICJUaGUgb3BlcmFuZHMgY2Fubm90IGJlIHZlY3RvcnMgb2YgZGlmZmVyaW5nIHNpemUuIElmIG9uZSBvcGVyYW5kIGlzCisgICAgKiAgICBhIHNjYWxhciBhbmQgdGhlIG90aGVyIHZlY3RvciwgdGhlbiB0aGUgc2NhbGFyIGlzIGFwcGxpZWQgY29tcG9uZW50LQorICAgICogICAgd2lzZSB0byB0aGUgdmVjdG9yLCByZXN1bHRpbmcgaW4gdGhlIHNhbWUgdHlwZSBhcyB0aGUgdmVjdG9yLiBJZiBib3RoCisgICAgKiAgICBhcmUgdmVjdG9ycyBvZiB0aGUgc2FtZSBzaXplLCB0aGUgcmVzdWx0IGlzIGNvbXB1dGVkIGNvbXBvbmVudC13aXNlLiIKKyAgICAqLworICAgaWYgKHR5cGVfYS0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIGlmICghdHlwZV9iLT5pc192ZWN0b3IoKQorICAgICAgICAgIHx8ICh0eXBlX2EtPnZlY3Rvcl9lbGVtZW50cyA9PSB0eXBlX2ItPnZlY3Rvcl9lbGVtZW50cykpCisgICAgICByZXR1cm4gdHlwZV9hOworICAgfSBlbHNlCisgICAgICByZXR1cm4gdHlwZV9iOworCisgICAvKiAgICAiVGhlIG9wZXJhdG9yIG1vZHVsdXMgKCUpIGlzIG5vdCBkZWZpbmVkIGZvciBhbnkgb3RoZXIgZGF0YSB0eXBlcworICAgICogICAgKG5vbi1pbnRlZ2VyIHR5cGVzKS4iCisgICAgKi8KKyAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgInR5cGUgbWlzbWF0Y2giKTsKKyAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKgorcmVsYXRpb25hbF9yZXN1bHRfdHlwZShpcl9ydmFsdWUgKiAmdmFsdWVfYSwgaXJfcnZhbHVlICogJnZhbHVlX2IsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgWVlMVFlQRSAqbG9jKQoreworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlX2EgPSB2YWx1ZV9hLT50eXBlOworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlX2IgPSB2YWx1ZV9iLT50eXBlOworCisgICAvKiBGcm9tIEdMU0wgMS41MCBzcGVjLCBwYWdlIDU2OgorICAgICogICAgIlRoZSByZWxhdGlvbmFsIG9wZXJhdG9ycyBncmVhdGVyIHRoYW4gKD4pLCBsZXNzIHRoYW4gKDwpLCBncmVhdGVyCisgICAgKiAgICB0aGFuIG9yIGVxdWFsICg+PSksIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgKDw9KSBvcGVyYXRlIG9ubHkgb24KKyAgICAqICAgIHNjYWxhciBpbnRlZ2VyIGFuZCBzY2FsYXIgZmxvYXRpbmctcG9pbnQgZXhwcmVzc2lvbnMuIgorICAgICovCisgICBpZiAoIXR5cGVfYS0+aXNfbnVtZXJpYygpCisgICAgICAgfHwgIXR5cGVfYi0+aXNfbnVtZXJpYygpCisgICAgICAgfHwgIXR5cGVfYS0+aXNfc2NhbGFyKCkKKyAgICAgICB8fCAhdHlwZV9iLT5pc19zY2FsYXIoKSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAib3BlcmFuZHMgdG8gcmVsYXRpb25hbCBvcGVyYXRvcnMgbXVzdCBiZSBzY2FsYXIgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiKTsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisKKyAgIC8qICAgICJFaXRoZXIgdGhlIG9wZXJhbmRzJyB0eXBlcyBtdXN0IG1hdGNoLCBvciB0aGUgY29udmVyc2lvbnMgZnJvbQorICAgICogICAgU2VjdGlvbiA0LjEuMTAgIkltcGxpY2l0IENvbnZlcnNpb25zIiB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGludGVnZXIKKyAgICAqICAgIG9wZXJhbmQsIGFmdGVyIHdoaWNoIHRoZSB0eXBlcyBtdXN0IG1hdGNoLiIKKyAgICAqLworICAgaWYgKCFhcHBseV9pbXBsaWNpdF9jb252ZXJzaW9uKHR5cGVfYSwgdmFsdWVfYiwgc3RhdGUpCisgICAgICAgJiYgIWFwcGx5X2ltcGxpY2l0X2NvbnZlcnNpb24odHlwZV9iLCB2YWx1ZV9hLCBzdGF0ZSkpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgb3BlcmFuZHMgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25hbCBvcGVyYXRvciIpOworICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKyAgIHR5cGVfYSA9IHZhbHVlX2EtPnR5cGU7CisgICB0eXBlX2IgPSB2YWx1ZV9iLT50eXBlOworCisgICBpZiAodHlwZV9hLT5iYXNlX3R5cGUgIT0gdHlwZV9iLT5iYXNlX3R5cGUpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgImJhc2UgdHlwZSBtaXNtYXRjaCIpOworICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKworICAgLyogICAgIlRoZSByZXN1bHQgaXMgc2NhbGFyIEJvb2xlYW4uIgorICAgICovCisgICByZXR1cm4gZ2xzbF90eXBlOjpib29sX3R5cGU7Cit9CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgcmVzdWx0IHR5cGUgb2YgYSBiaXQtc2hpZnQgb3BlcmF0aW9uLgorICoKKyAqIElmIHRoZSBnaXZlbiB0eXBlcyB0byB0aGUgYml0LXNoaWZ0IG9wZXJhdG9yIGFyZSBpbnZhbGlkLCByZXR1cm4KKyAqIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZS4KKyAqCisgKiBccGFyYW0gdHlwZV9hIFR5cGUgb2YgTEhTIG9mIGJpdC1zaGlmdCBvcAorICogXHBhcmFtIHR5cGVfYiBUeXBlIG9mIFJIUyBvZiBiaXQtc2hpZnQgb3AKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKgorc2hpZnRfcmVzdWx0X3R5cGUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZV9hLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZV9iLAorICAgICAgICAgICAgICAgICAgYXN0X29wZXJhdG9ycyBvcCwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgWVlMVFlQRSAqbG9jKQoreworICAgaWYgKCFzdGF0ZS0+Y2hlY2tfYml0d2lzZV9vcGVyYXRpb25zX2FsbG93ZWQobG9jKSkgeworICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKworICAgLyogRnJvbSBwYWdlIDUwIChwYWdlIDU2IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMzAgc3BlYzoKKyAgICAqCisgICAgKiAgICAgIlRoZSBzaGlmdCBvcGVyYXRvcnMgKDw8KSBhbmQgKD4+KS4gRm9yIGJvdGggb3BlcmF0b3JzLCB0aGUgb3BlcmFuZHMKKyAgICAqICAgICBtdXN0IGJlIHNpZ25lZCBvciB1bnNpZ25lZCBpbnRlZ2VycyBvciBpbnRlZ2VyIHZlY3RvcnMuIE9uZSBvcGVyYW5kCisgICAgKiAgICAgY2FuIGJlIHNpZ25lZCB3aGlsZSB0aGUgb3RoZXIgaXMgdW5zaWduZWQuIgorICAgICovCisgICBpZiAoIXR5cGVfYS0+aXNfaW50ZWdlcigpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJMSFMgb2Ygb3BlcmF0b3IgJXMgbXVzdCBiZSBhbiBpbnRlZ2VyIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgdmVjdG9yIiwgYXN0X2V4cHJlc3Npb246Om9wZXJhdG9yX3N0cmluZyhvcCkpOworICAgICByZXR1cm4gZ2xzbF90eXBlOjplcnJvcl90eXBlOworCisgICB9CisgICBpZiAoIXR5cGVfYi0+aXNfaW50ZWdlcigpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJSSFMgb2Ygb3BlcmF0b3IgJXMgbXVzdCBiZSBhbiBpbnRlZ2VyIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgdmVjdG9yIiwgYXN0X2V4cHJlc3Npb246Om9wZXJhdG9yX3N0cmluZyhvcCkpOworICAgICByZXR1cm4gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgfQorCisgICAvKiAgICAgIklmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGEgc2NhbGFyLCB0aGUgc2Vjb25kIG9wZXJhbmQgaGFzIHRvIGJlCisgICAgKiAgICAgYSBzY2FsYXIgYXMgd2VsbC4iCisgICAgKi8KKyAgIGlmICh0eXBlX2EtPmlzX3NjYWxhcigpICYmICF0eXBlX2ItPmlzX3NjYWxhcigpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJpZiB0aGUgZmlyc3Qgb3BlcmFuZCBvZiAlcyBpcyBzY2FsYXIsIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQgbXVzdCBiZSBzY2FsYXIgYXMgd2VsbCIsCisgICAgICAgICAgICAgICAgICAgICAgIGFzdF9leHByZXNzaW9uOjpvcGVyYXRvcl9zdHJpbmcob3ApKTsKKyAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKworICAgLyogSWYgYm90aCBvcGVyYW5kcyBhcmUgdmVjdG9ycywgY2hlY2sgdGhhdCB0aGV5IGhhdmUgc2FtZSBudW1iZXIgb2YKKyAgICAqIGVsZW1lbnRzLgorICAgICovCisgICBpZiAodHlwZV9hLT5pc192ZWN0b3IoKSAmJgorICAgICAgdHlwZV9iLT5pc192ZWN0b3IoKSAmJgorICAgICAgdHlwZV9hLT52ZWN0b3JfZWxlbWVudHMgIT0gdHlwZV9iLT52ZWN0b3JfZWxlbWVudHMpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgInZlY3RvciBvcGVyYW5kcyB0byBvcGVyYXRvciAlcyBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICBhc3RfZXhwcmVzc2lvbjo6b3BlcmF0b3Jfc3RyaW5nKG9wKSk7CisgICAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisKKyAgIC8qICAgICAiSW4gYWxsIGNhc2VzLCB0aGUgcmVzdWx0aW5nIHR5cGUgd2lsbCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBsZWZ0CisgICAgKiAgICAgb3BlcmFuZC4iCisgICAgKi8KKyAgIHJldHVybiB0eXBlX2E7Cit9CisKKy8qKgorICogVmFsaWRhdGVzIHRoYXQgYSB2YWx1ZSBjYW4gYmUgYXNzaWduZWQgdG8gYSBsb2NhdGlvbiB3aXRoIGEgc3BlY2lmaWVkIHR5cGUKKyAqCisgKiBWYWxpZGF0ZXMgdGhhdCBcYyByaHMgY2FuIGJlIGFzc2lnbmVkIHRvIHNvbWUgbG9jYXRpb24uICBJZiB0aGUgdHlwZXMgYXJlCisgKiBub3QgYW4gZXhhY3QgbWF0Y2ggYnV0IGFuIGF1dG9tYXRpYyBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLCBcYyByaHMgd2lsbCBiZQorICogY29udmVydGVkLgorICoKKyAqIFxyZXR1cm4KKyAqIFxjIE5VTEwgaWYgXGMgcmhzIGNhbm5vdCBiZSBhc3NpZ25lZCB0byBhIGxvY2F0aW9uIHdpdGggdHlwZSBcYyBsaHNfdHlwZS4KKyAqIE90aGVyd2lzZSB0aGUgYWN0dWFsIFJIUyB0byBiZSBhc3NpZ25lZCB3aWxsIGJlIHJldHVybmVkLiAgVGhpcyBtYXkgYmUKKyAqIFxjIHJocywgb3IgaXQgbWF5IGJlIFxjIHJocyBhZnRlciBzb21lIHR5cGUgY29udmVyc2lvbi4KKyAqCisgKiBcbm90ZQorICogSW4gYWRkaXRpb24gdG8gYmVpbmcgdXNlZCBmb3IgYXNzaWdubWVudHMsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0bworICogdHlwZS1jaGVjayByZXR1cm4gdmFsdWVzLgorICovCitpcl9ydmFsdWUgKgordmFsaWRhdGVfYXNzaWdubWVudChzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIFlZTFRZUEUgbG9jLCBjb25zdCBnbHNsX3R5cGUgKmxoc190eXBlLAorICAgICAgICAgICAgICAgICAgICBpcl9ydmFsdWUgKnJocywgYm9vbCBpc19pbml0aWFsaXplcikKK3sKKyAgIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgc29tZSBlcnJvciBpbiB0aGUgUkhTLCBqdXN0IHJldHVybiBpdC4gIEFueXRoaW5nCisgICAgKiBlbHNlIHdpbGwgbGVhZCB0byBhbiBhdmFsYW5jaGUgb2YgZXJyb3IgbWVzc2FnZSBiYWNrIHRvIHRoZSB1c2VyLgorICAgICovCisgICBpZiAocmhzLT50eXBlLT5pc19lcnJvcigpKQorICAgICAgcmV0dXJuIHJoczsKKworICAgLyogSWYgdGhlIHR5cGVzIGFyZSBpZGVudGljYWwsIHRoZSBhc3NpZ25tZW50IGNhbiB0cml2aWFsbHkgcHJvY2VlZC4KKyAgICAqLworICAgaWYgKHJocy0+dHlwZSA9PSBsaHNfdHlwZSkKKyAgICAgIHJldHVybiByaHM7CisKKyAgIC8qIElmIHRoZSBhcnJheSBlbGVtZW50IHR5cGVzIGFyZSB0aGUgc2FtZSBhbmQgdGhlIExIUyBpcyB1bnNpemVkLAorICAgICogdGhlIGFzc2lnbm1lbnQgaXMgb2theSBmb3IgaW5pdGlhbGl6ZXJzIGVtYmVkZGVkIGluIHZhcmlhYmxlCisgICAgKiBkZWNsYXJhdGlvbnMuCisgICAgKgorICAgICogTm90ZTogV2hvbGUtYXJyYXkgYXNzaWdubWVudHMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gR0xTTCAxLjEwLCBidXQgdGhpcworICAgICogaXMgaGFuZGxlZCBieSBpcl9kZXJlZmVyZW5jZTo6aXNfbHZhbHVlLgorICAgICovCisgICBpZiAobGhzX3R5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSAmJiByaHMtPnR5cGUtPmlzX2FycmF5KCkKKyAgICAgICAmJiAobGhzX3R5cGUtPmVsZW1lbnRfdHlwZSgpID09IHJocy0+dHlwZS0+ZWxlbWVudF90eXBlKCkpKSB7CisgICAgICBpZiAoaXNfaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgIHJldHVybiByaHM7CisgICAgICB9IGVsc2UgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImltcGxpY2l0bHkgc2l6ZWQgYXJyYXlzIGNhbm5vdCBiZSBhc3NpZ25lZCIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIC8qIENoZWNrIGZvciBpbXBsaWNpdCBjb252ZXJzaW9uIGluIEdMU0wgMS4yMCAqLworICAgaWYgKGFwcGx5X2ltcGxpY2l0X2NvbnZlcnNpb24obGhzX3R5cGUsIHJocywgc3RhdGUpKSB7CisgICAgICBpZiAocmhzLT50eXBlID09IGxoc190eXBlKQorCSByZXR1cm4gcmhzOworICAgfQorCisgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAiJXMgb2YgdHlwZSAlcyBjYW5ub3QgYmUgYXNzaWduZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAidmFyaWFibGUgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgIGlzX2luaXRpYWxpemVyID8gImluaXRpYWxpemVyIiA6ICJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIHJocy0+dHlwZS0+bmFtZSwgbGhzX3R5cGUtPm5hbWUpOworCisgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK21hcmtfd2hvbGVfYXJyYXlfYWNjZXNzKGlyX3J2YWx1ZSAqYWNjZXNzKQoreworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmID0gYWNjZXNzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworCisgICBpZiAoZGVyZWYgJiYgZGVyZWYtPnZhcikgeworICAgICAgZGVyZWYtPnZhci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzID0gZGVyZWYtPnR5cGUtPmxlbmd0aCAtIDE7CisgICB9Cit9CisKK3N0YXRpYyBib29sCitkb19hc3NpZ25tZW50KGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5vbl9sdmFsdWVfZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqbGhzLCBpcl9ydmFsdWUgKnJocywKKyAgICAgICAgICAgICAgaXJfcnZhbHVlICoqb3V0X3J2YWx1ZSwgYm9vbCBuZWVkc19ydmFsdWUsCisgICAgICAgICAgICAgIGJvb2wgaXNfaW5pdGlhbGl6ZXIsCisgICAgICAgICAgICAgIFlZTFRZUEUgbGhzX2xvYykKK3sKKyAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgYm9vbCBlcnJvcl9lbWl0dGVkID0gKGxocy0+dHlwZS0+aXNfZXJyb3IoKSB8fCByaHMtPnR5cGUtPmlzX2Vycm9yKCkpOworICAgaXJfcnZhbHVlICpleHRyYWN0X2NoYW5uZWwgPSBOVUxMOworCisgICAvKiBJZiB0aGUgYXNzaWdubWVudCBMSFMgY29tZXMgYmFjayBhcyBhbiBpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdAorICAgICogZXhwcmVzc2lvbiwgbW92ZSBpdCB0byB0aGUgUkhTIGFzIGFuIGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQuCisgICAgKi8KKyAgIGlmIChsaHMtPmlyX3R5cGUgPT0gaXJfdHlwZV9leHByZXNzaW9uKSB7CisgICAgICBpcl9leHByZXNzaW9uICpjb25zdCBsaHNfZXhwciA9IGxocy0+YXNfZXhwcmVzc2lvbigpOworCisgICAgICBpZiAodW5saWtlbHkobGhzX2V4cHItPm9wZXJhdGlvbiA9PSBpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdCkpIHsKKyAgICAgICAgIGlyX3J2YWx1ZSAqbmV3X3JocyA9CisgICAgICAgICAgICB2YWxpZGF0ZV9hc3NpZ25tZW50KHN0YXRlLCBsaHNfbG9jLCBsaHMtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocywgaXNfaW5pdGlhbGl6ZXIpOworCisgICAgICAgICBpZiAobmV3X3JocyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHM6CisgICAgICAgICAgICAgKiAtIExIUzogKGV4cHJlc3Npb24gZmxvYXQgdmVjdG9yX2V4dHJhY3QgPHZlYz4gPGNoYW5uZWw+KQorICAgICAgICAgICAgICogLSBSSFM6IDxzY2FsYXI+CisgICAgICAgICAgICAgKiBpbnRvOgorICAgICAgICAgICAgICogLSBMSFM6IDx2ZWM+CisgICAgICAgICAgICAgKiAtIFJIUzogKGV4cHJlc3Npb24gdmVjMiB2ZWN0b3JfaW5zZXJ0IDx2ZWM+IDxjaGFubmVsPiA8c2NhbGFyPikKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGUgTEhTIHR5cGUgaXMgbm93IGEgdmVjdG9yIGluc3RlYWQgb2YgYSBzY2FsYXIuICBTaW5jZSBHTFNMCisgICAgICAgICAgICAgKiBhbGxvd3MgYXNzaWdubWVudHMgdG8gYmUgdXNlZCBhcyBydmFsdWVzLCB3ZSBuZWVkIHRvIHJlLWV4dHJhY3QKKyAgICAgICAgICAgICAqIHRoZSBjaGFubmVsIGZyb20gYXNzaWdubWVudF90ZW1wIHdoZW4gcmV0dXJuaW5nIHRoZSBydmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGV4dHJhY3RfY2hhbm5lbCA9IGxoc19leHByLT5vcGVyYW5kc1sxXTsKKyAgICAgICAgICAgIHJocyA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24oaXJfdHJpb3BfdmVjdG9yX2luc2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzX2V4cHItPm9wZXJhbmRzWzBdLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaHNfZXhwci0+b3BlcmFuZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RfY2hhbm5lbCk7CisgICAgICAgICAgICBsaHMgPSBsaHNfZXhwci0+b3BlcmFuZHNbMF0tPmNsb25lKGN0eCwgTlVMTCk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICpsaHNfdmFyID0gbGhzLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisgICBpZiAobGhzX3ZhcikKKyAgICAgIGxoc192YXItPmRhdGEuYXNzaWduZWQgPSB0cnVlOworCisgICBpZiAoIWVycm9yX2VtaXR0ZWQpIHsKKyAgICAgIGlmIChub25fbHZhbHVlX2Rlc2NyaXB0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxoc19sb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzaWdubWVudCB0byAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9sdmFsdWVfZGVzY3JpcHRpb24pOworICAgICAgICAgZXJyb3JfZW1pdHRlZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGxocy0+dmFyaWFibGVfcmVmZXJlbmNlZCgpICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgJiYgbGhzLT52YXJpYWJsZV9yZWZlcmVuY2VkKCktPmRhdGEucmVhZF9vbmx5KSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsaHNfbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFzc2lnbm1lbnQgdG8gcmVhZC1vbmx5IHZhcmlhYmxlICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaHMtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKS0+bmFtZSk7CisgICAgICAgICBlcnJvcl9lbWl0dGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAobGhzLT50eXBlLT5pc19hcnJheSgpICYmCisgICAgICAgICAgICAgICAgICFzdGF0ZS0+Y2hlY2tfdmVyc2lvbigxMjAsIDMwMCwgJmxoc19sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hvbGUgYXJyYXkgYXNzaWdubWVudCBmb3JiaWRkZW4iKSkgeworICAgICAgICAgLyogRnJvbSBwYWdlIDMyIChwYWdlIDM4IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMTAgc3BlYzoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAiT3RoZXIgYmluYXJ5IG9yIHVuYXJ5IGV4cHJlc3Npb25zLCBub24tZGVyZWZlcmVuY2VkCisgICAgICAgICAgKiAgICAgYXJyYXlzLCBmdW5jdGlvbiBuYW1lcywgc3dpenpsZXMgd2l0aCByZXBlYXRlZCBmaWVsZHMsCisgICAgICAgICAgKiAgICAgYW5kIGNvbnN0YW50cyBjYW5ub3QgYmUgbC12YWx1ZXMuIgorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoZSByZXN0cmljdGlvbiBvbiBhcnJheXMgaXMgbGlmdGVkIGluIEdMU0wgMS4yMCBhbmQgR0xTTCBFUyAzLjAwLgorICAgICAgICAgICovCisgICAgICAgICBlcnJvcl9lbWl0dGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoIWxocy0+aXNfbHZhbHVlKCkpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsaHNfbG9jLCBzdGF0ZSwgIm5vbi1sdmFsdWUgaW4gYXNzaWdubWVudCIpOworICAgICAgICAgZXJyb3JfZW1pdHRlZCA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIGlyX3J2YWx1ZSAqbmV3X3JocyA9CisgICAgICB2YWxpZGF0ZV9hc3NpZ25tZW50KHN0YXRlLCBsaHNfbG9jLCBsaHMtPnR5cGUsIHJocywgaXNfaW5pdGlhbGl6ZXIpOworICAgaWYgKG5ld19yaHMgIT0gTlVMTCkgeworICAgICAgcmhzID0gbmV3X3JoczsKKworICAgICAgLyogSWYgdGhlIExIUyBhcnJheSB3YXMgbm90IGRlY2xhcmVkIHdpdGggYSBzaXplLCBpdCB0YWtlcyBpdCBzaXplIGZyb20KKyAgICAgICAqIHRoZSBSSFMuICBJZiB0aGUgTEhTIGlzIGFuIGwtdmFsdWUgYW5kIGEgd2hvbGUgYXJyYXksIGl0IG11c3QgYmUgYQorICAgICAgICogZGVyZWZlcmVuY2Ugb2YgYSB2YXJpYWJsZS4gIEFueSBvdGhlciBjYXNlIHdvdWxkIHJlcXVpcmUgdGhhdCB0aGUgTEhTCisgICAgICAgKiBpcyBlaXRoZXIgbm90IGFuIGwtdmFsdWUgb3Igbm90IGEgd2hvbGUgYXJyYXkuCisgICAgICAgKi8KKyAgICAgIGlmIChsaHMtPnR5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkgeworICAgICAgICAgaXJfZGVyZWZlcmVuY2UgKmNvbnN0IGQgPSBsaHMtPmFzX2RlcmVmZXJlbmNlKCk7CisKKyAgICAgICAgIGFzc2VydChkICE9IE5VTEwpOworCisgICAgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gZC0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworCisgICAgICAgICBhc3NlcnQodmFyICE9IE5VTEwpOworCisgICAgICAgICBpZiAodmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MgPj0gdW5zaWduZWQocmhzLT50eXBlLT5hcnJheV9zaXplKCkpKSB7CisgICAgICAgICAgICAvKiBGSU5JU0hNRTogVGhpcyBzaG91bGQgYWN0dWFsbHkgbG9nIHRoZSBsb2NhdGlvbiBvZiB0aGUgUkhTLiAqLworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxoc19sb2MsIHN0YXRlLCAiYXJyYXkgc2l6ZSBtdXN0IGJlID4gJXUgZHVlIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZXZpb3VzIGFjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzKTsKKyAgICAgICAgIH0KKworICAgICAgICAgdmFyLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UobGhzLT50eXBlLT5lbGVtZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocy0+dHlwZS0+YXJyYXlfc2l6ZSgpKTsKKyAgICAgICAgIGQtPnR5cGUgPSB2YXItPnR5cGU7CisgICAgICB9CisgICAgICBpZiAobGhzLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAgICBtYXJrX3dob2xlX2FycmF5X2FjY2VzcyhyaHMpOworICAgICAgICAgbWFya193aG9sZV9hcnJheV9hY2Nlc3MobGhzKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogTW9zdCBjYWxsZXJzIG9mIGRvX2Fzc2lnbm1lbnQgKGFzc2lnbiwgYWRkX2Fzc2lnbiwgcHJlX2luYy9kZWMsCisgICAgKiBidXQgbm90IHBvc3RfaW5jKSBuZWVkIHRoZSBjb252ZXJ0ZWQgYXNzaWduZWQgdmFsdWUgYXMgYW4gcnZhbHVlCisgICAgKiB0byBoYW5kbGUgdGhpbmdzIGxpa2U6CisgICAgKgorICAgICogaSA9IGogKz0gMTsKKyAgICAqLworICAgaWYgKG5lZWRzX3J2YWx1ZSkgeworICAgICAgaXJfdmFyaWFibGUgKnZhciA9IG5ldyhjdHgpIGlyX3ZhcmlhYmxlKHJocy0+dHlwZSwgImFzc2lnbm1lbnRfdG1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHZhcik7CisgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChhc3NpZ24odmFyLCByaHMpKTsKKworICAgICAgaWYgKCFlcnJvcl9lbWl0dGVkKSB7CisgICAgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdmFyID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKyAgICAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCBkZXJlZl92YXIpKTsKKyAgICAgIH0KKyAgICAgIGlyX3J2YWx1ZSAqcnZhbHVlID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKworICAgICAgaWYgKGV4dHJhY3RfY2hhbm5lbCkgeworICAgICAgICAgcnZhbHVlID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0X2NoYW5uZWwtPmNsb25lKGN0eCwgTlVMTCkpOworICAgICAgfQorCisgICAgICAqb3V0X3J2YWx1ZSA9IHJ2YWx1ZTsKKyAgIH0gZWxzZSB7CisgICAgICBpZiAoIWVycm9yX2VtaXR0ZWQpCisgICAgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChuZXcoY3R4KSBpcl9hc3NpZ25tZW50KGxocywgcmhzKSk7CisgICAgICAqb3V0X3J2YWx1ZSA9IE5VTEw7CisgICB9CisKKyAgIHJldHVybiBlcnJvcl9lbWl0dGVkOworfQorCitzdGF0aWMgaXJfcnZhbHVlICoKK2dldF9sdmFsdWVfY29weShleGVjX2xpc3QgKmluc3RydWN0aW9ucywgaXJfcnZhbHVlICpsdmFsdWUpCit7CisgICB2b2lkICpjdHggPSByYWxsb2NfcGFyZW50KGx2YWx1ZSk7CisgICBpcl92YXJpYWJsZSAqdmFyOworCisgICB2YXIgPSBuZXcoY3R4KSBpcl92YXJpYWJsZShsdmFsdWUtPnR5cGUsICJfcG9zdF9pbmNkZWNfdG1wIiwKKwkJCSAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwodmFyKTsKKyAgIHZhci0+ZGF0YS5tb2RlID0gaXJfdmFyX2F1dG87CisKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQobmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKSwKKwkJCQkJCSAgbHZhbHVlKSk7CisKKyAgIHJldHVybiBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworfQorCisKK2lyX3J2YWx1ZSAqCithc3Rfbm9kZTo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICAodm9pZCkgaW5zdHJ1Y3Rpb25zOworICAgKHZvaWQpIHN0YXRlOworCisgICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorYXN0X2Z1bmN0aW9uX2V4cHJlc3Npb246Omhpcl9ub19ydmFsdWUoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICAodm9pZCloaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7Cit9CisKK3ZvaWQKK2FzdF9hZ2dyZWdhdGVfaW5pdGlhbGl6ZXI6Omhpcl9ub19ydmFsdWUoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgICh2b2lkKWhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKK30KKworc3RhdGljIGlyX3J2YWx1ZSAqCitkb19jb21wYXJpc29uKHZvaWQgKm1lbV9jdHgsIGludCBvcGVyYXRpb24sIGlyX3J2YWx1ZSAqb3AwLCBpcl9ydmFsdWUgKm9wMSkKK3sKKyAgIGludCBqb2luX29wOworICAgaXJfcnZhbHVlICpjbXAgPSBOVUxMOworCisgICBpZiAob3BlcmF0aW9uID09IGlyX2Jpbm9wX2FsbF9lcXVhbCkKKyAgICAgIGpvaW5fb3AgPSBpcl9iaW5vcF9sb2dpY19hbmQ7CisgICBlbHNlCisgICAgICBqb2luX29wID0gaXJfYmlub3BfbG9naWNfb3I7CisKKyAgIHN3aXRjaCAob3AwLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24ob3BlcmF0aW9uLCBvcDAsIG9wMSk7CisKKyAgIGNhc2UgR0xTTF9UWVBFX0FSUkFZOiB7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG9wMC0+dHlwZS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgIGlyX3J2YWx1ZSAqZTAsICplMSwgKnJlc3VsdDsKKworICAgICAgICAgZTAgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkob3AwLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudChpKSk7CisgICAgICAgICBlMSA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheShvcDEtPmNsb25lKG1lbV9jdHgsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGkpKTsKKyAgICAgICAgIHJlc3VsdCA9IGRvX2NvbXBhcmlzb24obWVtX2N0eCwgb3BlcmF0aW9uLCBlMCwgZTEpOworCisgICAgICAgICBpZiAoY21wKSB7CisgICAgICAgICAgICBjbXAgPSBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihqb2luX29wLCBjbXAsIHJlc3VsdCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY21wID0gcmVzdWx0OworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBtYXJrX3dob2xlX2FycmF5X2FjY2VzcyhvcDApOworICAgICAgbWFya193aG9sZV9hcnJheV9hY2Nlc3Mob3AxKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIEdMU0xfVFlQRV9TVFJVQ1Q6IHsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgb3AwLT50eXBlLT5sZW5ndGg7IGkrKykgeworICAgICAgICAgaXJfcnZhbHVlICplMCwgKmUxLCAqcmVzdWx0OworICAgICAgICAgY29uc3QgY2hhciAqZmllbGRfbmFtZSA9IG9wMC0+dHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lOworCisgICAgICAgICBlMCA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV9yZWNvcmQob3AwLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lKTsKKyAgICAgICAgIGUxID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3JlY29yZChvcDEtPmNsb25lKG1lbV9jdHgsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWUpOworICAgICAgICAgcmVzdWx0ID0gZG9fY29tcGFyaXNvbihtZW1fY3R4LCBvcGVyYXRpb24sIGUwLCBlMSk7CisKKyAgICAgICAgIGlmIChjbXApIHsKKyAgICAgICAgICAgIGNtcCA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGpvaW5fb3AsIGNtcCwgcmVzdWx0KTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbXAgPSByZXN1bHQ7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKyAgIGNhc2UgR0xTTF9UWVBFX0lNQUdFOgorICAgY2FzZSBHTFNMX1RZUEVfSU5URVJGQUNFOgorICAgY2FzZSBHTFNMX1RZUEVfQVRPTUlDX1VJTlQ6CisgICAgICAvKiBJIGFzc3VtZSBhIGNvbXBhcmlzb24gb2YgYSBzdHJ1Y3QgY29udGFpbmluZyBhIHNhbXBsZXIganVzdAorICAgICAgICogaWdub3JlcyB0aGUgc2FtcGxlciBwcmVzZW50IGluIHRoZSB0eXBlLgorICAgICAgICovCisgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKGNtcCA9PSBOVUxMKQorICAgICAgY21wID0gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KHRydWUpOworCisgICByZXR1cm4gY21wOworfQorCisvKiBGb3IgbG9naWNhbCBvcGVyYXRpb25zLCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBhcmUKKyAqIHNjYWxhciBib29sZWFucy4gIElmIGl0IGlzbid0LCBlbWl0IGFuIGVycm9yIGFuZCByZXR1cm4gYSBjb25zdGFudAorICogYm9vbGVhbiB0byBhdm9pZCB0cmlnZ2VyaW5nIGNhc2NhZGluZyBlcnJvciBtZXNzYWdlcy4KKyAqLworaXJfcnZhbHVlICoKK2dldF9zY2FsYXJfYm9vbGVhbl9vcGVyYW5kKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorCQkJICAgYXN0X2V4cHJlc3Npb24gKnBhcmVudF9leHByLAorCQkJICAgaW50IG9wZXJhbmQsCisJCQkgICBjb25zdCBjaGFyICpvcGVyYW5kX25hbWUsCisJCQkgICBib29sICplcnJvcl9lbWl0dGVkKQoreworICAgYXN0X2V4cHJlc3Npb24gKmV4cHIgPSBwYXJlbnRfZXhwci0+c3ViZXhwcmVzc2lvbnNbb3BlcmFuZF07CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgIGlyX3J2YWx1ZSAqdmFsID0gZXhwci0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICBpZiAodmFsLT50eXBlLT5pc19ib29sZWFuKCkgJiYgdmFsLT50eXBlLT5pc19zY2FsYXIoKSkKKyAgICAgIHJldHVybiB2YWw7CisKKyAgIGlmICghKmVycm9yX2VtaXR0ZWQpIHsKKyAgICAgIFlZTFRZUEUgbG9jID0gZXhwci0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAiJXMgb2YgYCVzJyBtdXN0IGJlIHNjYWxhciBib29sZWFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfZXhwci0+b3BlcmF0b3Jfc3RyaW5nKHBhcmVudF9leHByLT5vcGVyKSk7CisgICAgICAqZXJyb3JfZW1pdHRlZCA9IHRydWU7CisgICB9CisKKyAgIHJldHVybiBuZXcoY3R4KSBpcl9jb25zdGFudCh0cnVlKTsKK30KKworLyoqCisgKiBJZiBuYW1lIHJlZmVycyB0byBhIGJ1aWx0aW4gYXJyYXkgd2hvc2UgbWF4aW11bSBhbGxvd2VkIHNpemUgaXMgbGVzcyB0aGFuCisgKiBzaXplLCByZXBvcnQgYW4gZXJyb3IgYW5kIHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAqLwordm9pZAorY2hlY2tfYnVpbHRpbl9hcnJheV9tYXhfc2l6ZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWUxUWVBFIGxvYywgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgaWYgKChzdHJjbXAoImdsX1RleENvb3JkIiwgbmFtZSkgPT0gMCkKKyAgICAgICAmJiAoc2l6ZSA+IHN0YXRlLT5Db25zdC5NYXhUZXh0dXJlQ29vcmRzKSkgeworICAgICAgLyogRnJvbSBwYWdlIDU0IChwYWdlIDYwIG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMjAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAgIlRoZSBzaXplIFtvZiBnbF9UZXhDb29yZF0gY2FuIGJlIGF0IG1vc3QKKyAgICAgICAqICAgICBnbF9NYXhUZXh0dXJlQ29vcmRzLiIKKyAgICAgICAqLworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImBnbF9UZXhDb29yZCcgYXJyYXkgc2l6ZSBjYW5ub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAiYmUgbGFyZ2VyIHRoYW4gZ2xfTWF4VGV4dHVyZUNvb3JkcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heFRleHR1cmVDb29yZHMpOworICAgfSBlbHNlIGlmIChzdHJjbXAoImdsX0NsaXBEaXN0YW5jZSIsIG5hbWUpID09IDAKKyAgICAgICAgICAgICAgJiYgc2l6ZSA+IHN0YXRlLT5Db25zdC5NYXhDbGlwUGxhbmVzKSB7CisgICAgICAvKiBGcm9tIHNlY3Rpb24gNy4xIChWZXJ0ZXggU2hhZGVyIFNwZWNpYWwgVmFyaWFibGVzKSBvZiB0aGUKKyAgICAgICAqIEdMU0wgMS4zMCBzcGVjOgorICAgICAgICoKKyAgICAgICAqICAgIlRoZSBnbF9DbGlwRGlzdGFuY2UgYXJyYXkgaXMgcHJlZGVjbGFyZWQgYXMgdW5zaXplZCBhbmQKKyAgICAgICAqICAgbXVzdCBiZSBzaXplZCBieSB0aGUgc2hhZGVyIGVpdGhlciByZWRlY2xhcmluZyBpdCB3aXRoIGEKKyAgICAgICAqICAgc2l6ZSBvciBpbmRleGluZyBpdCBvbmx5IHdpdGggaW50ZWdyYWwgY29uc3RhbnQKKyAgICAgICAqICAgZXhwcmVzc2lvbnMuIC4uLiBUaGUgc2l6ZSBjYW4gYmUgYXQgbW9zdAorICAgICAgICogICBnbF9NYXhDbGlwRGlzdGFuY2VzLiIKKyAgICAgICAqLworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImBnbF9DbGlwRGlzdGFuY2UnIGFycmF5IHNpemUgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImJlIGxhcmdlciB0aGFuIGdsX01heENsaXBEaXN0YW5jZXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhDbGlwUGxhbmVzKTsKKyAgIH0KK30KKworLyoqCisgKiBDcmVhdGUgdGhlIGNvbnN0YW50IDEsIG9mIGEgd2hpY2ggaXMgYXBwcm9wcmlhdGUgZm9yIGluY3JlbWVudGluZyBhbmQKKyAqIGRlY3JlbWVudGluZyB2YWx1ZXMgb2YgdGhlIGdpdmVuIEdMU0wgdHlwZS4gIEZvciBleGFtcGxlLCBpZiB0eXBlIGlzIHZlYzQsCisgKiB0aGlzIGNyZWF0ZXMgYSBjb25zdGFudCB2YWx1ZSBvZiAxLjAgaGF2aW5nIHR5cGUgZmxvYXQuCisgKgorICogSWYgdGhlIGdpdmVuIHR5cGUgaXMgaW52YWxpZCBmb3IgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzLCByZXR1cm4KKyAqIGEgZmxvYXRpbmcgcG9pbnQgMS0tdGhlIGVycm9yIHdpbGwgYmUgZGV0ZWN0ZWQgbGF0ZXIuCisgKi8KK3N0YXRpYyBpcl9ydmFsdWUgKgorY29uc3RhbnRfb25lX2Zvcl9pbmNfZGVjKHZvaWQgKmN0eCwgY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgc3dpdGNoICh0eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICByZXR1cm4gbmV3KGN0eCkgaXJfY29uc3RhbnQoKHVuc2lnbmVkKSAxKTsKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgICAgIHJldHVybiBuZXcoY3R4KSBpcl9jb25zdGFudCgxKTsKKyAgIGRlZmF1bHQ6CisgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBuZXcoY3R4KSBpcl9jb25zdGFudCgxLjBmKTsKKyAgIH0KK30KKworaXJfcnZhbHVlICoKK2FzdF9leHByZXNzaW9uOjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBkb19oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQKK2FzdF9leHByZXNzaW9uOjpoaXJfbm9fcnZhbHVlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgZG9faGlyKGluc3RydWN0aW9ucywgc3RhdGUsIGZhbHNlKTsKK30KKworaXJfcnZhbHVlICoKK2FzdF9leHByZXNzaW9uOjpkb19oaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19ydmFsdWUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgIHN0YXRpYyBjb25zdCBpbnQgb3BlcmF0aW9uc1tBU1RfTlVNX09QRVJBVE9SU10gPSB7CisgICAgICAtMSwgICAgICAgICAgICAgICAvKiBhc3RfYXNzaWduIGRvZXNuJ3QgY29udmVydCB0byBpcl9leHByZXNzaW9uLiAqLworICAgICAgLTEsICAgICAgICAgICAgICAgLyogYXN0X3BsdXMgZG9lc24ndCBjb252ZXJ0IHRvIGlyX2V4cHJlc3Npb24uICovCisgICAgICBpcl91bm9wX25lZywKKyAgICAgIGlyX2Jpbm9wX2FkZCwKKyAgICAgIGlyX2Jpbm9wX3N1YiwKKyAgICAgIGlyX2Jpbm9wX211bCwKKyAgICAgIGlyX2Jpbm9wX2RpdiwKKyAgICAgIGlyX2Jpbm9wX21vZCwKKyAgICAgIGlyX2Jpbm9wX2xzaGlmdCwKKyAgICAgIGlyX2Jpbm9wX3JzaGlmdCwKKyAgICAgIGlyX2Jpbm9wX2xlc3MsCisgICAgICBpcl9iaW5vcF9ncmVhdGVyLAorICAgICAgaXJfYmlub3BfbGVxdWFsLAorICAgICAgaXJfYmlub3BfZ2VxdWFsLAorICAgICAgaXJfYmlub3BfYWxsX2VxdWFsLAorICAgICAgaXJfYmlub3BfYW55X25lcXVhbCwKKyAgICAgIGlyX2Jpbm9wX2JpdF9hbmQsCisgICAgICBpcl9iaW5vcF9iaXRfeG9yLAorICAgICAgaXJfYmlub3BfYml0X29yLAorICAgICAgaXJfdW5vcF9iaXRfbm90LAorICAgICAgaXJfYmlub3BfbG9naWNfYW5kLAorICAgICAgaXJfYmlub3BfbG9naWNfeG9yLAorICAgICAgaXJfYmlub3BfbG9naWNfb3IsCisgICAgICBpcl91bm9wX2xvZ2ljX25vdCwKKworICAgICAgLyogTm90ZTogVGhlIGZvbGxvd2luZyBibG9jayBvZiBleHByZXNzaW9uIHR5cGVzIGFjdHVhbGx5IGNvbnZlcnQKKyAgICAgICAqIHRvIG11bHRpcGxlIElSIGluc3RydWN0aW9ucy4KKyAgICAgICAqLworICAgICAgaXJfYmlub3BfbXVsLCAgICAgLyogYXN0X211bF9hc3NpZ24gKi8KKyAgICAgIGlyX2Jpbm9wX2RpdiwgICAgIC8qIGFzdF9kaXZfYXNzaWduICovCisgICAgICBpcl9iaW5vcF9tb2QsICAgICAvKiBhc3RfbW9kX2Fzc2lnbiAqLworICAgICAgaXJfYmlub3BfYWRkLCAgICAgLyogYXN0X2FkZF9hc3NpZ24gKi8KKyAgICAgIGlyX2Jpbm9wX3N1YiwgICAgIC8qIGFzdF9zdWJfYXNzaWduICovCisgICAgICBpcl9iaW5vcF9sc2hpZnQsICAvKiBhc3RfbHNfYXNzaWduICovCisgICAgICBpcl9iaW5vcF9yc2hpZnQsICAvKiBhc3RfcnNfYXNzaWduICovCisgICAgICBpcl9iaW5vcF9iaXRfYW5kLCAvKiBhc3RfYW5kX2Fzc2lnbiAqLworICAgICAgaXJfYmlub3BfYml0X3hvciwgLyogYXN0X3hvcl9hc3NpZ24gKi8KKyAgICAgIGlyX2Jpbm9wX2JpdF9vciwgIC8qIGFzdF9vcl9hc3NpZ24gKi8KKworICAgICAgLTEsICAgICAgICAgICAgICAgLyogYXN0X2NvbmRpdGlvbmFsIGRvZXNuJ3QgY29udmVydCB0byBpcl9leHByZXNzaW9uLiAqLworICAgICAgaXJfYmlub3BfYWRkLCAgICAgLyogYXN0X3ByZV9pbmMuICovCisgICAgICBpcl9iaW5vcF9zdWIsICAgICAvKiBhc3RfcHJlX2RlYy4gKi8KKyAgICAgIGlyX2Jpbm9wX2FkZCwgICAgIC8qIGFzdF9wb3N0X2luYy4gKi8KKyAgICAgIGlyX2Jpbm9wX3N1YiwgICAgIC8qIGFzdF9wb3N0X2RlYy4gKi8KKyAgICAgIC0xLCAgICAgICAgICAgICAgIC8qIGFzdF9maWVsZF9zZWxlY3Rpb24gZG9lc24ndCBjb252IHRvIGlyX2V4cHJlc3Npb24uICovCisgICAgICAtMSwgICAgICAgICAgICAgICAvKiBhc3RfYXJyYXlfaW5kZXggZG9lc24ndCBjb252ZXJ0IHRvIGlyX2V4cHJlc3Npb24uICovCisgICAgICAtMSwgICAgICAgICAgICAgICAvKiBhc3RfZnVuY3Rpb25fY2FsbCBkb2Vzbid0IGNvbnYgdG8gaXJfZXhwcmVzc2lvbi4gKi8KKyAgICAgIC0xLCAgICAgICAgICAgICAgIC8qIGFzdF9pZGVudGlmaWVyIGRvZXNuJ3QgY29udmVydCB0byBpcl9leHByZXNzaW9uLiAqLworICAgICAgLTEsICAgICAgICAgICAgICAgLyogYXN0X2ludF9jb25zdGFudCBkb2Vzbid0IGNvbnZlcnQgdG8gaXJfZXhwcmVzc2lvbi4gKi8KKyAgICAgIC0xLCAgICAgICAgICAgICAgIC8qIGFzdF91aW50X2NvbnN0YW50IGRvZXNuJ3QgY29udiB0byBpcl9leHByZXNzaW9uLiAqLworICAgICAgLTEsICAgICAgICAgICAgICAgLyogYXN0X2Zsb2F0X2NvbnN0YW50IGRvZXNuJ3QgY29udiB0byBpcl9leHByZXNzaW9uLiAqLworICAgICAgLTEsICAgICAgICAgICAgICAgLyogYXN0X2Jvb2xfY29uc3RhbnQgZG9lc24ndCBjb252IHRvIGlyX2V4cHJlc3Npb24uICovCisgICAgICAtMSwgICAgICAgICAgICAgICAvKiBhc3Rfc2VxdWVuY2UgZG9lc24ndCBjb252ZXJ0IHRvIGlyX2V4cHJlc3Npb24uICovCisgICB9OworICAgaXJfcnZhbHVlICpyZXN1bHQgPSBOVUxMOworICAgaXJfcnZhbHVlICpvcFszXTsKKyAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGU7IC8qIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBzd2l0Y2ggY2FzZXMgKi8KKyAgIGJvb2wgZXJyb3JfZW1pdHRlZCA9IGZhbHNlOworICAgWVlMVFlQRSBsb2M7CisKKyAgIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICBzd2l0Y2ggKHRoaXMtPm9wZXIpIHsKKyAgIGNhc2UgYXN0X2FnZ3JlZ2F0ZToKKyAgICAgIGFzc2VydCghImFzdF9hZ2dyZWdhdGU6IFNob3VsZCBuZXZlciBnZXQgaGVyZS4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9hc3NpZ246IHsKKyAgICAgIG9wWzBdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKyAgICAgIG9wWzFdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMV0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgICAgZXJyb3JfZW1pdHRlZCA9CisgICAgICAgICBkb19hc3NpZ25tZW50KGluc3RydWN0aW9ucywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5ub25fbHZhbHVlX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBvcFswXSwgb3BbMV0sICZyZXN1bHQsIG5lZWRzX3J2YWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5nZXRfbG9jYXRpb24oKSk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBhc3RfcGx1czoKKyAgICAgIG9wWzBdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgICAgdHlwZSA9IHVuYXJ5X2FyaXRobWV0aWNfcmVzdWx0X3R5cGUob3BbMF0tPnR5cGUsIHN0YXRlLCAmIGxvYyk7CisKKyAgICAgIGVycm9yX2VtaXR0ZWQgPSB0eXBlLT5pc19lcnJvcigpOworCisgICAgICByZXN1bHQgPSBvcFswXTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9uZWc6CisgICAgICBvcFswXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgICAgIHR5cGUgPSB1bmFyeV9hcml0aG1ldGljX3Jlc3VsdF90eXBlKG9wWzBdLT50eXBlLCBzdGF0ZSwgJiBsb2MpOworCisgICAgICBlcnJvcl9lbWl0dGVkID0gdHlwZS0+aXNfZXJyb3IoKTsKKworICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihvcGVyYXRpb25zW3RoaXMtPm9wZXJdLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXSwgTlVMTCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfYWRkOgorICAgY2FzZSBhc3Rfc3ViOgorICAgY2FzZSBhc3RfbXVsOgorICAgY2FzZSBhc3RfZGl2OgorICAgICAgb3BbMF0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgb3BbMV0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1sxXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICAgICB0eXBlID0gYXJpdGhtZXRpY19yZXN1bHRfdHlwZShvcFswXSwgb3BbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy0+b3BlciA9PSBhc3RfbXVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCAmIGxvYyk7CisgICAgICBlcnJvcl9lbWl0dGVkID0gdHlwZS0+aXNfZXJyb3IoKTsKKworICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihvcGVyYXRpb25zW3RoaXMtPm9wZXJdLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgYXN0X21vZDoKKyAgICAgIG9wWzBdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKyAgICAgIG9wWzFdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMV0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgICAgdHlwZSA9IG1vZHVsdXNfcmVzdWx0X3R5cGUob3BbMF0tPnR5cGUsIG9wWzFdLT50eXBlLCBzdGF0ZSwgJiBsb2MpOworCisgICAgICBhc3NlcnQob3BlcmF0aW9uc1t0aGlzLT5vcGVyXSA9PSBpcl9iaW5vcF9tb2QpOworCisgICAgICByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKG9wZXJhdGlvbnNbdGhpcy0+b3Blcl0sIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLCBvcFsxXSk7CisgICAgICBlcnJvcl9lbWl0dGVkID0gdHlwZS0+aXNfZXJyb3IoKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9sc2hpZnQ6CisgICBjYXNlIGFzdF9yc2hpZnQ6CisgICAgICAgaWYgKCFzdGF0ZS0+Y2hlY2tfYml0d2lzZV9vcGVyYXRpb25zX2FsbG93ZWQoJmxvYykpIHsKKyAgICAgICAgICBlcnJvcl9lbWl0dGVkID0gdHJ1ZTsKKyAgICAgICB9CisKKyAgICAgICBvcFswXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICAgb3BbMV0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1sxXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgIHR5cGUgPSBzaGlmdF9yZXN1bHRfdHlwZShvcFswXS0+dHlwZSwgb3BbMV0tPnR5cGUsIHRoaXMtPm9wZXIsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jKTsKKyAgICAgICByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKG9wZXJhdGlvbnNbdGhpcy0+b3Blcl0sIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXSwgb3BbMV0pOworICAgICAgIGVycm9yX2VtaXR0ZWQgPSBvcFswXS0+dHlwZS0+aXNfZXJyb3IoKSB8fCBvcFsxXS0+dHlwZS0+aXNfZXJyb3IoKTsKKyAgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfbGVzczoKKyAgIGNhc2UgYXN0X2dyZWF0ZXI6CisgICBjYXNlIGFzdF9sZXF1YWw6CisgICBjYXNlIGFzdF9nZXF1YWw6CisgICAgICBvcFswXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICBvcFsxXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzFdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgICAgIHR5cGUgPSByZWxhdGlvbmFsX3Jlc3VsdF90eXBlKG9wWzBdLCBvcFsxXSwgc3RhdGUsICYgbG9jKTsKKworICAgICAgLyogVGhlIHJlbGF0aW9uYWwgb3BlcmF0b3JzIG11c3QgZWl0aGVyIGdlbmVyYXRlIGFuIGVycm9yIG9yIHJlc3VsdAorICAgICAgICogaW4gYSBzY2FsYXIgYm9vbGVhbi4gIFNlZSBwYWdlIDU3IG9mIHRoZSBHTFNMIDEuNTAgc3BlYy4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KHR5cGUtPmlzX2Vycm9yKCkKKwkgICAgIHx8ICgodHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKQorCQkgJiYgdHlwZS0+aXNfc2NhbGFyKCkpKTsKKworICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihvcGVyYXRpb25zW3RoaXMtPm9wZXJdLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXSwgb3BbMV0pOworICAgICAgZXJyb3JfZW1pdHRlZCA9IHR5cGUtPmlzX2Vycm9yKCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfbmVxdWFsOgorICAgY2FzZSBhc3RfZXF1YWw6CisgICAgICBvcFswXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICBvcFsxXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzFdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgICAgIC8qIEZyb20gcGFnZSA1OCAocGFnZSA2NCBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgIlRoZSBlcXVhbGl0eSBvcGVyYXRvcnMgZXF1YWwgKD09KSwgYW5kIG5vdCBlcXVhbCAoIT0pCisgICAgICAgKiAgICBvcGVyYXRlIG9uIGFsbCB0eXBlcy4gVGhleSByZXN1bHQgaW4gYSBzY2FsYXIgQm9vbGVhbi4gSWYKKyAgICAgICAqICAgIHRoZSBvcGVyYW5kIHR5cGVzIGRvIG5vdCBtYXRjaCwgdGhlbiB0aGVyZSBtdXN0IGJlIGEKKyAgICAgICAqICAgIGNvbnZlcnNpb24gZnJvbSBTZWN0aW9uIDQuMS4xMCAiSW1wbGljaXQgQ29udmVyc2lvbnMiCisgICAgICAgKiAgICBhcHBsaWVkIHRvIG9uZSBvcGVyYW5kIHRoYXQgY2FuIG1ha2UgdGhlbSBtYXRjaCwgaW4gd2hpY2gKKyAgICAgICAqICAgIGNhc2UgdGhpcyBjb252ZXJzaW9uIGlzIGRvbmUuIgorICAgICAgICovCisgICAgICBpZiAoKCFhcHBseV9pbXBsaWNpdF9jb252ZXJzaW9uKG9wWzBdLT50eXBlLCBvcFsxXSwgc3RhdGUpCisgICAgICAgICAgICYmICFhcHBseV9pbXBsaWNpdF9jb252ZXJzaW9uKG9wWzFdLT50eXBlLCBvcFswXSwgc3RhdGUpKQorICAgICAgICAgIHx8IChvcFswXS0+dHlwZSAhPSBvcFsxXS0+dHlwZSkpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAib3BlcmFuZHMgb2YgYCVzJyBtdXN0IGhhdmUgdGhlIHNhbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIsICh0aGlzLT5vcGVyID09IGFzdF9lcXVhbCkgPyAiPT0iIDogIiE9Iik7CisgICAgICAgICBlcnJvcl9lbWl0dGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoKG9wWzBdLT50eXBlLT5pc19hcnJheSgpIHx8IG9wWzFdLT50eXBlLT5pc19hcnJheSgpKSAmJgorICAgICAgICAgICAgICAgICAhc3RhdGUtPmNoZWNrX3ZlcnNpb24oMTIwLCAzMDAsICZsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgY29tcGFyaXNvbnMgZm9yYmlkZGVuIikpIHsKKyAgICAgICAgIGVycm9yX2VtaXR0ZWQgPSB0cnVlOworICAgICAgfSBlbHNlIGlmICgob3BbMF0tPnR5cGUtPmNvbnRhaW5zX29wYXF1ZSgpIHx8CisgICAgICAgICAgICAgICAgICBvcFsxXS0+dHlwZS0+Y29udGFpbnNfb3BhcXVlKCkpKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAib3BhcXVlIHR5cGUgY29tcGFyaXNvbnMgZm9yYmlkZGVuIik7CisgICAgICAgICBlcnJvcl9lbWl0dGVkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGVycm9yX2VtaXR0ZWQpIHsKKyAgICAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICByZXN1bHQgPSBkb19jb21wYXJpc29uKGN0eCwgb3BlcmF0aW9uc1t0aGlzLT5vcGVyXSwgb3BbMF0sIG9wWzFdKTsKKyAgICAgICAgIGFzc2VydChyZXN1bHQtPnR5cGUgPT0gZ2xzbF90eXBlOjpib29sX3R5cGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgYXN0X2JpdF9hbmQ6CisgICBjYXNlIGFzdF9iaXRfeG9yOgorICAgY2FzZSBhc3RfYml0X29yOgorICAgICAgb3BbMF0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgb3BbMV0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1sxXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgdHlwZSA9IGJpdF9sb2dpY19yZXN1bHRfdHlwZShvcFswXS0+dHlwZSwgb3BbMV0tPnR5cGUsIHRoaXMtPm9wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCAmbG9jKTsKKyAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24ob3BlcmF0aW9uc1t0aGlzLT5vcGVyXSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGVycm9yX2VtaXR0ZWQgPSBvcFswXS0+dHlwZS0+aXNfZXJyb3IoKSB8fCBvcFsxXS0+dHlwZS0+aXNfZXJyb3IoKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9iaXRfbm90OgorICAgICAgb3BbMF0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICAgICBpZiAoIXN0YXRlLT5jaGVja19iaXR3aXNlX29wZXJhdGlvbnNfYWxsb3dlZCgmbG9jKSkgeworICAgICAgICAgZXJyb3JfZW1pdHRlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICghb3BbMF0tPnR5cGUtPmlzX2ludGVnZXIoKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgIm9wZXJhbmQgb2YgYH4nIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICAgZXJyb3JfZW1pdHRlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHR5cGUgPSBlcnJvcl9lbWl0dGVkID8gZ2xzbF90eXBlOjplcnJvcl90eXBlIDogb3BbMF0tPnR5cGU7CisgICAgICByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfYml0X25vdCwgdHlwZSwgb3BbMF0sIE5VTEwpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgYXN0X2xvZ2ljX2FuZDogeworICAgICAgZXhlY19saXN0IHJoc19pbnN0cnVjdGlvbnM7CisgICAgICBvcFswXSA9IGdldF9zY2FsYXJfYm9vbGVhbl9vcGVyYW5kKGluc3RydWN0aW9ucywgc3RhdGUsIHRoaXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMSFMiLCAmZXJyb3JfZW1pdHRlZCk7CisgICAgICBvcFsxXSA9IGdldF9zY2FsYXJfYm9vbGVhbl9vcGVyYW5kKCZyaHNfaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwgdGhpcywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJIUyIsICZlcnJvcl9lbWl0dGVkKTsKKworICAgICAgaWYgKHJoc19pbnN0cnVjdGlvbnMuaXNfZW1wdHkoKSkgeworICAgICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9sb2dpY19hbmQsIG9wWzBdLCBvcFsxXSk7CisgICAgICAgICB0eXBlID0gcmVzdWx0LT50eXBlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB0bXAgPSBuZXcoY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OmJvb2xfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kX3RtcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbCh0bXApOworCisgICAgICAgICBpcl9pZiAqY29uc3Qgc3RtdCA9IG5ldyhjdHgpIGlyX2lmKG9wWzBdKTsKKyAgICAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHN0bXQpOworCisgICAgICAgICBzdG10LT50aGVuX2luc3RydWN0aW9ucy5hcHBlbmRfbGlzdCgmcmhzX2luc3RydWN0aW9ucyk7CisgICAgICAgICBpcl9kZXJlZmVyZW5jZSAqY29uc3QgdGhlbl9kZXJlZiA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRtcCk7CisgICAgICAgICBpcl9hc3NpZ25tZW50ICpjb25zdCB0aGVuX2Fzc2lnbiA9CisgICAgICAgICAgICBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KHRoZW5fZGVyZWYsIG9wWzFdKTsKKyAgICAgICAgIHN0bXQtPnRoZW5faW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbCh0aGVuX2Fzc2lnbik7CisKKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlICpjb25zdCBlbHNlX2RlcmVmID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodG1wKTsKKyAgICAgICAgIGlyX2Fzc2lnbm1lbnQgKmNvbnN0IGVsc2VfYXNzaWduID0KKyAgICAgICAgICAgIG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQoZWxzZV9kZXJlZiwgbmV3KGN0eCkgaXJfY29uc3RhbnQoZmFsc2UpKTsKKyAgICAgICAgIHN0bXQtPmVsc2VfaW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChlbHNlX2Fzc2lnbik7CisKKyAgICAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRtcCk7CisgICAgICAgICB0eXBlID0gdG1wLT50eXBlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgYXN0X2xvZ2ljX29yOiB7CisgICAgICBleGVjX2xpc3QgcmhzX2luc3RydWN0aW9uczsKKyAgICAgIG9wWzBdID0gZ2V0X3NjYWxhcl9ib29sZWFuX29wZXJhbmQoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwgdGhpcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxIUyIsICZlcnJvcl9lbWl0dGVkKTsKKyAgICAgIG9wWzFdID0gZ2V0X3NjYWxhcl9ib29sZWFuX29wZXJhbmQoJnJoc19pbnN0cnVjdGlvbnMsIHN0YXRlLCB0aGlzLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkhTIiwgJmVycm9yX2VtaXR0ZWQpOworCisgICAgICBpZiAocmhzX2luc3RydWN0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICAgICByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX2xvZ2ljX29yLCBvcFswXSwgb3BbMV0pOworICAgICAgICAgdHlwZSA9IHJlc3VsdC0+dHlwZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdG1wID0gbmV3KGN0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjpib29sX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yX3RtcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbCh0bXApOworCisgICAgICAgICBpcl9pZiAqY29uc3Qgc3RtdCA9IG5ldyhjdHgpIGlyX2lmKG9wWzBdKTsKKyAgICAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHN0bXQpOworCisgICAgICAgICBpcl9kZXJlZmVyZW5jZSAqY29uc3QgdGhlbl9kZXJlZiA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRtcCk7CisgICAgICAgICBpcl9hc3NpZ25tZW50ICpjb25zdCB0aGVuX2Fzc2lnbiA9CisgICAgICAgICAgICBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KHRoZW5fZGVyZWYsIG5ldyhjdHgpIGlyX2NvbnN0YW50KHRydWUpKTsKKyAgICAgICAgIHN0bXQtPnRoZW5faW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbCh0aGVuX2Fzc2lnbik7CisKKyAgICAgICAgIHN0bXQtPmVsc2VfaW5zdHJ1Y3Rpb25zLmFwcGVuZF9saXN0KCZyaHNfaW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlICpjb25zdCBlbHNlX2RlcmVmID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodG1wKTsKKyAgICAgICAgIGlyX2Fzc2lnbm1lbnQgKmNvbnN0IGVsc2VfYXNzaWduID0KKyAgICAgICAgICAgIG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQoZWxzZV9kZXJlZiwgb3BbMV0pOworICAgICAgICAgc3RtdC0+ZWxzZV9pbnN0cnVjdGlvbnMucHVzaF90YWlsKGVsc2VfYXNzaWduKTsKKworICAgICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodG1wKTsKKyAgICAgICAgIHR5cGUgPSB0bXAtPnR5cGU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBhc3RfbG9naWNfeG9yOgorICAgICAgLyogRnJvbSBwYWdlIDMzIChwYWdlIDM5IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMTAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAiVGhlIGxvZ2ljYWwgYmluYXJ5IG9wZXJhdG9ycyBhbmQgKCYmKSwgb3IgKCB8IHwgKSwgYW5kCisgICAgICAgKiAgICAgZXhjbHVzaXZlIG9yICheXikuIFRoZXkgb3BlcmF0ZSBvbmx5IG9uIHR3byBCb29sZWFuCisgICAgICAgKiAgICAgZXhwcmVzc2lvbnMgYW5kIHJlc3VsdCBpbiBhIEJvb2xlYW4gZXhwcmVzc2lvbi4iCisgICAgICAgKi8KKyAgICAgIG9wWzBdID0gZ2V0X3NjYWxhcl9ib29sZWFuX29wZXJhbmQoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwgdGhpcywgMCwgIkxIUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9lbWl0dGVkKTsKKyAgICAgIG9wWzFdID0gZ2V0X3NjYWxhcl9ib29sZWFuX29wZXJhbmQoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwgdGhpcywgMSwgIlJIUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9lbWl0dGVkKTsKKworICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihvcGVyYXRpb25zW3RoaXMtPm9wZXJdLCBnbHNsX3R5cGU6OmJvb2xfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9sb2dpY19ub3Q6CisgICAgICBvcFswXSA9IGdldF9zY2FsYXJfYm9vbGVhbl9vcGVyYW5kKGluc3RydWN0aW9ucywgc3RhdGUsIHRoaXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYW5kIiwgJmVycm9yX2VtaXR0ZWQpOworCisgICAgICByZXN1bHQgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKG9wZXJhdGlvbnNbdGhpcy0+b3Blcl0sIGdsc2xfdHlwZTo6Ym9vbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXSwgTlVMTCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfbXVsX2Fzc2lnbjoKKyAgIGNhc2UgYXN0X2Rpdl9hc3NpZ246CisgICBjYXNlIGFzdF9hZGRfYXNzaWduOgorICAgY2FzZSBhc3Rfc3ViX2Fzc2lnbjogeworICAgICAgb3BbMF0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgb3BbMV0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1sxXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICAgICB0eXBlID0gYXJpdGhtZXRpY19yZXN1bHRfdHlwZShvcFswXSwgb3BbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy0+b3BlciA9PSBhc3RfbXVsX2Fzc2lnbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgJiBsb2MpOworCisgICAgICBpcl9ydmFsdWUgKnRlbXBfcmhzID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihvcGVyYXRpb25zW3RoaXMtPm9wZXJdLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0sIG9wWzFdKTsKKworICAgICAgZXJyb3JfZW1pdHRlZCA9CisgICAgICAgICBkb19hc3NpZ25tZW50KGluc3RydWN0aW9ucywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5ub25fbHZhbHVlX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+Y2xvbmUoY3R4LCBOVUxMKSwgdGVtcF9yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsIG5lZWRzX3J2YWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5nZXRfbG9jYXRpb24oKSk7CisKKyAgICAgIC8qIEdMU0wgMS4xMCBkb2VzIG5vdCBhbGxvdyBhcnJheSBhc3NpZ25tZW50LiAgSG93ZXZlciwgd2UgZG9uJ3QgaGF2ZSB0bworICAgICAgICogZXhwbGljaXRseSB0ZXN0IGZvciB0aGlzIGJlY2F1c2Ugbm9uZSBvZiB0aGUgYmluYXJ5IGV4cHJlc3Npb24KKyAgICAgICAqIG9wZXJhdG9ycyBhbGxvdyBhcnJheSBvcGVyYW5kcyBlaXRoZXIuCisgICAgICAgKi8KKworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgYXN0X21vZF9hc3NpZ246IHsKKyAgICAgIG9wWzBdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKyAgICAgIG9wWzFdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMV0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgICAgdHlwZSA9IG1vZHVsdXNfcmVzdWx0X3R5cGUob3BbMF0tPnR5cGUsIG9wWzFdLT50eXBlLCBzdGF0ZSwgJiBsb2MpOworCisgICAgICBhc3NlcnQob3BlcmF0aW9uc1t0aGlzLT5vcGVyXSA9PSBpcl9iaW5vcF9tb2QpOworCisgICAgICBpcl9ydmFsdWUgKnRlbXBfcmhzOworICAgICAgdGVtcF9yaHMgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKG9wZXJhdGlvbnNbdGhpcy0+b3Blcl0sIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0sIG9wWzFdKTsKKworICAgICAgZXJyb3JfZW1pdHRlZCA9CisgICAgICAgICBkb19hc3NpZ25tZW50KGluc3RydWN0aW9ucywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5ub25fbHZhbHVlX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+Y2xvbmUoY3R4LCBOVUxMKSwgdGVtcF9yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsIG5lZWRzX3J2YWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5nZXRfbG9jYXRpb24oKSk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBhc3RfbHNfYXNzaWduOgorICAgY2FzZSBhc3RfcnNfYXNzaWduOiB7CisgICAgICBvcFswXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICBvcFsxXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzFdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICB0eXBlID0gc2hpZnRfcmVzdWx0X3R5cGUob3BbMF0tPnR5cGUsIG9wWzFdLT50eXBlLCB0aGlzLT5vcGVyLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jKTsKKyAgICAgIGlyX3J2YWx1ZSAqdGVtcF9yaHMgPSBuZXcoY3R4KSBpcl9leHByZXNzaW9uKG9wZXJhdGlvbnNbdGhpcy0+b3Blcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvcFswXSwgb3BbMV0pOworICAgICAgZXJyb3JfZW1pdHRlZCA9CisgICAgICAgICBkb19hc3NpZ25tZW50KGluc3RydWN0aW9ucywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5ub25fbHZhbHVlX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+Y2xvbmUoY3R4LCBOVUxMKSwgdGVtcF9yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsIG5lZWRzX3J2YWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5nZXRfbG9jYXRpb24oKSk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBhc3RfYW5kX2Fzc2lnbjoKKyAgIGNhc2UgYXN0X3hvcl9hc3NpZ246CisgICBjYXNlIGFzdF9vcl9hc3NpZ246IHsKKyAgICAgIG9wWzBdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKyAgICAgIG9wWzFdID0gdGhpcy0+c3ViZXhwcmVzc2lvbnNbMV0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKyAgICAgIHR5cGUgPSBiaXRfbG9naWNfcmVzdWx0X3R5cGUob3BbMF0tPnR5cGUsIG9wWzFdLT50eXBlLCB0aGlzLT5vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgJmxvYyk7CisgICAgICBpcl9ydmFsdWUgKnRlbXBfcmhzID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihvcGVyYXRpb25zW3RoaXMtPm9wZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb3BbMF0sIG9wWzFdKTsKKyAgICAgIGVycm9yX2VtaXR0ZWQgPQorICAgICAgICAgZG9fYXNzaWdubWVudChpbnN0cnVjdGlvbnMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+bm9uX2x2YWx1ZV9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0tPmNsb25lKGN0eCwgTlVMTCksIHRlbXBfcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LCBuZWVkc19ydmFsdWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+Z2V0X2xvY2F0aW9uKCkpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgYXN0X2NvbmRpdGlvbmFsOiB7CisgICAgICAvKiBGcm9tIHBhZ2UgNTkgKHBhZ2UgNjUgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS41MCBzcGVjOgorICAgICAgICoKKyAgICAgICAqICAgICJUaGUgdGVybmFyeSBzZWxlY3Rpb24gb3BlcmF0b3IgKD86KS4gSXQgb3BlcmF0ZXMgb24gdGhyZWUKKyAgICAgICAqICAgIGV4cHJlc3Npb25zIChleHAxID8gZXhwMiA6IGV4cDMpLiBUaGlzIG9wZXJhdG9yIGV2YWx1YXRlcyB0aGUKKyAgICAgICAqICAgIGZpcnN0IGV4cHJlc3Npb24sIHdoaWNoIG11c3QgcmVzdWx0IGluIGEgc2NhbGFyIEJvb2xlYW4uIgorICAgICAgICovCisgICAgICBvcFswXSA9IGdldF9zY2FsYXJfYm9vbGVhbl9vcGVyYW5kKGluc3RydWN0aW9ucywgc3RhdGUsIHRoaXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24iLCAmZXJyb3JfZW1pdHRlZCk7CisKKyAgICAgIC8qIFRoZSA6PyBvcGVyYXRvciBpcyBpbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGFuIGFub255bW91cyB0ZW1wb3JhcnkKKyAgICAgICAqIGZvbGxvd2VkIGJ5IGFuIGlmLXN0YXRlbWVudC4gIFRoZSBsYXN0IGluc3RydWN0aW9uIGluIGVhY2ggYnJhbmNoIG9mCisgICAgICAgKiB0aGUgaWYtc3RhdGVtZW50IGFzc2lnbnMgYSB2YWx1ZSB0byB0aGUgYW5vbnltb3VzIHRlbXBvcmFyeS4gIFRoaXMKKyAgICAgICAqIHRlbXBvcmFyeSBpcyB0aGUgci12YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgZXhlY19saXN0IHRoZW5faW5zdHJ1Y3Rpb25zOworICAgICAgZXhlY19saXN0IGVsc2VfaW5zdHJ1Y3Rpb25zOworCisgICAgICBvcFsxXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzFdLT5oaXIoJnRoZW5faW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICBvcFsyXSA9IHRoaXMtPnN1YmV4cHJlc3Npb25zWzJdLT5oaXIoJmVsc2VfaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgICAgIC8qIEZyb20gcGFnZSA1OSAocGFnZSA2NSBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgICJUaGUgc2Vjb25kIGFuZCB0aGlyZCBleHByZXNzaW9ucyBjYW4gYmUgYW55IHR5cGUsIGFzCisgICAgICAgKiAgICAgbG9uZyB0aGVpciB0eXBlcyBtYXRjaCwgb3IgdGhlcmUgaXMgYSBjb252ZXJzaW9uIGluCisgICAgICAgKiAgICAgU2VjdGlvbiA0LjEuMTAgIkltcGxpY2l0IENvbnZlcnNpb25zIiB0aGF0IGNhbiBiZSBhcHBsaWVkCisgICAgICAgKiAgICAgdG8gb25lIG9mIHRoZSBleHByZXNzaW9ucyB0byBtYWtlIHRoZWlyIHR5cGVzIG1hdGNoLiBUaGlzCisgICAgICAgKiAgICAgcmVzdWx0aW5nIG1hdGNoaW5nIHR5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIGVudGlyZQorICAgICAgICogICAgIGV4cHJlc3Npb24uIgorICAgICAgICovCisgICAgICBpZiAoKCFhcHBseV9pbXBsaWNpdF9jb252ZXJzaW9uKG9wWzFdLT50eXBlLCBvcFsyXSwgc3RhdGUpCisgICAgICAgICAgJiYgIWFwcGx5X2ltcGxpY2l0X2NvbnZlcnNpb24ob3BbMl0tPnR5cGUsIG9wWzFdLCBzdGF0ZSkpCisgICAgICAgICAgfHwgKG9wWzFdLT50eXBlICE9IG9wWzJdLT50eXBlKSkgeworICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5zdWJleHByZXNzaW9uc1sxXS0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAic2Vjb25kIGFuZCB0aGlyZCBvcGVyYW5kcyBvZiA/OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYXRvciBtdXN0IGhhdmUgbWF0Y2hpbmcgdHlwZXMiKTsKKyAgICAgICAgIGVycm9yX2VtaXR0ZWQgPSB0cnVlOworICAgICAgICAgdHlwZSA9IGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICB0eXBlID0gb3BbMV0tPnR5cGU7CisgICAgICB9CisKKyAgICAgIC8qIEZyb20gcGFnZSAzMyAocGFnZSAzOSBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjEwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgIlRoZSBzZWNvbmQgYW5kIHRoaXJkIGV4cHJlc3Npb25zIG11c3QgYmUgdGhlIHNhbWUgdHlwZSwgYnV0IGNhbgorICAgICAgICogICAgYmUgb2YgYW55IHR5cGUgb3RoZXIgdGhhbiBhbiBhcnJheS4iCisgICAgICAgKi8KKyAgICAgIGlmICh0eXBlLT5pc19hcnJheSgpICYmCisgICAgICAgICAgIXN0YXRlLT5jaGVja192ZXJzaW9uKDEyMCwgMzAwLCAmbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kIGFuZCB0aGlyZCBvcGVyYW5kcyBvZiA/OiBvcGVyYXRvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgYXJyYXlzIikpIHsKKyAgICAgICAgIGVycm9yX2VtaXR0ZWQgPSB0cnVlOworICAgICAgfQorCisgICAgICBpcl9jb25zdGFudCAqY29uZF92YWwgPSBvcFswXS0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworICAgICAgaXJfY29uc3RhbnQgKnRoZW5fdmFsID0gb3BbMV0tPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKyAgICAgIGlyX2NvbnN0YW50ICplbHNlX3ZhbCA9IG9wWzJdLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisKKyAgICAgIGlmICh0aGVuX2luc3RydWN0aW9ucy5pc19lbXB0eSgpCisgICAgICAgICAgJiYgZWxzZV9pbnN0cnVjdGlvbnMuaXNfZW1wdHkoKQorICAgICAgICAgICYmIChjb25kX3ZhbCAhPSBOVUxMKSAmJiAodGhlbl92YWwgIT0gTlVMTCkgJiYgKGVsc2VfdmFsICE9IE5VTEwpKSB7CisgICAgICAgICByZXN1bHQgPSAoY29uZF92YWwtPnZhbHVlLmJbMF0pID8gdGhlbl92YWwgOiBlbHNlX3ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdG1wID0KKyAgICAgICAgICAgIG5ldyhjdHgpIGlyX3ZhcmlhYmxlKHR5cGUsICJjb25kaXRpb25hbF90bXAiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHRtcCk7CisKKyAgICAgICAgIGlyX2lmICpjb25zdCBzdG10ID0gbmV3KGN0eCkgaXJfaWYob3BbMF0pOworICAgICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoc3RtdCk7CisKKyAgICAgICAgIHRoZW5faW5zdHJ1Y3Rpb25zLm1vdmVfbm9kZXNfdG8oJiBzdG10LT50aGVuX2luc3RydWN0aW9ucyk7CisgICAgICAgICBpcl9kZXJlZmVyZW5jZSAqY29uc3QgdGhlbl9kZXJlZiA9CisgICAgICAgICAgICBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0bXApOworICAgICAgICAgaXJfYXNzaWdubWVudCAqY29uc3QgdGhlbl9hc3NpZ24gPQorICAgICAgICAgICAgbmV3KGN0eCkgaXJfYXNzaWdubWVudCh0aGVuX2RlcmVmLCBvcFsxXSk7CisgICAgICAgICBzdG10LT50aGVuX2luc3RydWN0aW9ucy5wdXNoX3RhaWwodGhlbl9hc3NpZ24pOworCisgICAgICAgICBlbHNlX2luc3RydWN0aW9ucy5tb3ZlX25vZGVzX3RvKCYgc3RtdC0+ZWxzZV9pbnN0cnVjdGlvbnMpOworICAgICAgICAgaXJfZGVyZWZlcmVuY2UgKmNvbnN0IGVsc2VfZGVyZWYgPQorICAgICAgICAgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodG1wKTsKKyAgICAgICAgIGlyX2Fzc2lnbm1lbnQgKmNvbnN0IGVsc2VfYXNzaWduID0KKyAgICAgICAgICAgIG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQoZWxzZV9kZXJlZiwgb3BbMl0pOworICAgICAgICAgc3RtdC0+ZWxzZV9pbnN0cnVjdGlvbnMucHVzaF90YWlsKGVsc2VfYXNzaWduKTsKKworICAgICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodG1wKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGFzdF9wcmVfaW5jOgorICAgY2FzZSBhc3RfcHJlX2RlYzogeworICAgICAgdGhpcy0+bm9uX2x2YWx1ZV9kZXNjcmlwdGlvbiA9ICh0aGlzLT5vcGVyID09IGFzdF9wcmVfaW5jKQorICAgICAgICAgPyAicHJlLWluY3JlbWVudCBvcGVyYXRpb24iIDogInByZS1kZWNyZW1lbnQgb3BlcmF0aW9uIjsKKworICAgICAgb3BbMF0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgb3BbMV0gPSBjb25zdGFudF9vbmVfZm9yX2luY19kZWMoY3R4LCBvcFswXS0+dHlwZSk7CisKKyAgICAgIHR5cGUgPSBhcml0aG1ldGljX3Jlc3VsdF90eXBlKG9wWzBdLCBvcFsxXSwgZmFsc2UsIHN0YXRlLCAmIGxvYyk7CisKKyAgICAgIGlyX3J2YWx1ZSAqdGVtcF9yaHM7CisgICAgICB0ZW1wX3JocyA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24ob3BlcmF0aW9uc1t0aGlzLT5vcGVyXSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXSwgb3BbMV0pOworCisgICAgICBlcnJvcl9lbWl0dGVkID0KKyAgICAgICAgIGRvX2Fzc2lnbm1lbnQoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0tPm5vbl9sdmFsdWVfZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLT5jbG9uZShjdHgsIE5VTEwpLCB0ZW1wX3JocywKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwgbmVlZHNfcnZhbHVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0tPmdldF9sb2NhdGlvbigpKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGFzdF9wb3N0X2luYzoKKyAgIGNhc2UgYXN0X3Bvc3RfZGVjOiB7CisgICAgICB0aGlzLT5ub25fbHZhbHVlX2Rlc2NyaXB0aW9uID0gKHRoaXMtPm9wZXIgPT0gYXN0X3Bvc3RfaW5jKQorICAgICAgICAgPyAicG9zdC1pbmNyZW1lbnQgb3BlcmF0aW9uIiA6ICJwb3N0LWRlY3JlbWVudCBvcGVyYXRpb24iOworICAgICAgb3BbMF0gPSB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgb3BbMV0gPSBjb25zdGFudF9vbmVfZm9yX2luY19kZWMoY3R4LCBvcFswXS0+dHlwZSk7CisKKyAgICAgIGVycm9yX2VtaXR0ZWQgPSBvcFswXS0+dHlwZS0+aXNfZXJyb3IoKSB8fCBvcFsxXS0+dHlwZS0+aXNfZXJyb3IoKTsKKworICAgICAgdHlwZSA9IGFyaXRobWV0aWNfcmVzdWx0X3R5cGUob3BbMF0sIG9wWzFdLCBmYWxzZSwgc3RhdGUsICYgbG9jKTsKKworICAgICAgaXJfcnZhbHVlICp0ZW1wX3JoczsKKyAgICAgIHRlbXBfcmhzID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihvcGVyYXRpb25zW3RoaXMtPm9wZXJdLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLCBvcFsxXSk7CisKKyAgICAgIC8qIEdldCBhIHRlbXBvcmFyeSBvZiBhIGNvcHkgb2YgdGhlIGx2YWx1ZSBiZWZvcmUgaXQncyBtb2RpZmllZC4KKyAgICAgICAqIFRoaXMgbWF5IGdldCB0aHJvd24gYXdheSBsYXRlci4KKyAgICAgICAqLworICAgICAgcmVzdWx0ID0gZ2V0X2x2YWx1ZV9jb3B5KGluc3RydWN0aW9ucywgb3BbMF0tPmNsb25lKGN0eCwgTlVMTCkpOworCisgICAgICBpcl9ydmFsdWUgKmp1bmtfcnZhbHVlOworICAgICAgZXJyb3JfZW1pdHRlZCA9CisgICAgICAgICBkb19hc3NpZ25tZW50KGluc3RydWN0aW9ucywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzBdLT5ub25fbHZhbHVlX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+Y2xvbmUoY3R4LCBOVUxMKSwgdGVtcF9yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICZqdW5rX3J2YWx1ZSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdWJleHByZXNzaW9uc1swXS0+Z2V0X2xvY2F0aW9uKCkpOworCisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBhc3RfZmllbGRfc2VsZWN0aW9uOgorICAgICAgcmVzdWx0ID0gX21lc2FfYXN0X2ZpZWxkX3NlbGVjdGlvbl90b19oaXIodGhpcywgaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfYXJyYXlfaW5kZXg6IHsKKyAgICAgIFlZTFRZUEUgaW5kZXhfbG9jID0gc3ViZXhwcmVzc2lvbnNbMV0tPmdldF9sb2NhdGlvbigpOworCisgICAgICBvcFswXSA9IHN1YmV4cHJlc3Npb25zWzBdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICBvcFsxXSA9IHN1YmV4cHJlc3Npb25zWzFdLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgICAgIHJlc3VsdCA9IF9tZXNhX2FzdF9hcnJheV9pbmRleF90b19oaXIoY3R4LCBzdGF0ZSwgb3BbMF0sIG9wWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsIGluZGV4X2xvYyk7CisKKyAgICAgIGlmIChyZXN1bHQtPnR5cGUtPmlzX2Vycm9yKCkpCisgICAgICAgICBlcnJvcl9lbWl0dGVkID0gdHJ1ZTsKKworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgYXN0X2Z1bmN0aW9uX2NhbGw6CisgICAgICAvKiBTaG91bGQgKk5FVkVSKiBnZXQgaGVyZS4gIGFzdF9mdW5jdGlvbl9jYWxsIHNob3VsZCBhbHdheXMgYmUgaGFuZGxlZAorICAgICAgICogYnkgYXN0X2Z1bmN0aW9uX2V4cHJlc3Npb246Omhpci4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KDApOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgYXN0X2lkZW50aWZpZXI6IHsKKyAgICAgIC8qIGFzdF9pZGVudGlmaWVyIGNhbiBhcHBlYXIgc2V2ZXJhbCBwbGFjZXMgaW4gYSBmdWxsIGFic3RyYWN0IHN5bnRheAorICAgICAgICogdHJlZS4gIFRoaXMgcGFydGljdWxhciB1c2UgbXVzdCBiZSBhdCBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIKKyAgICAgICAqIGFzICd2YXJpYWJsZV9pZGVudGlmaWVyJy4KKyAgICAgICAqLworICAgICAgaXJfdmFyaWFibGUgKnZhciA9IAorICAgICAgICAgc3RhdGUtPnN5bWJvbHMtPmdldF92YXJpYWJsZSh0aGlzLT5wcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllcik7CisKKyAgICAgIGlmICh2YXIgIT0gTlVMTCkgeworICAgICAgICAgdmFyLT5kYXRhLnVzZWQgPSB0cnVlOworICAgICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgImAlcycgdW5kZWNsYXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnByaW1hcnlfZXhwcmVzc2lvbi5pZGVudGlmaWVyKTsKKworICAgICAgICAgcmVzdWx0ID0gaXJfcnZhbHVlOjplcnJvcl92YWx1ZShjdHgpOworICAgICAgICAgZXJyb3JfZW1pdHRlZCA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBhc3RfaW50X2NvbnN0YW50OgorICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfY29uc3RhbnQodGhpcy0+cHJpbWFyeV9leHByZXNzaW9uLmludF9jb25zdGFudCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfdWludF9jb25zdGFudDoKKyAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KHRoaXMtPnByaW1hcnlfZXhwcmVzc2lvbi51aW50X2NvbnN0YW50KTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9mbG9hdF9jb25zdGFudDoKKyAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KHRoaXMtPnByaW1hcnlfZXhwcmVzc2lvbi5mbG9hdF9jb25zdGFudCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfYm9vbF9jb25zdGFudDoKKyAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KGJvb2wodGhpcy0+cHJpbWFyeV9leHByZXNzaW9uLmJvb2xfY29uc3RhbnQpKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9zZXF1ZW5jZTogeworICAgICAgLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBnZW5lcmF0ZSBhIHNlcXVlbmNlIGluIHRoZSBBU1Qgd2l0aG91dAorICAgICAgICogYW55IGV4cHJlc3Npb25zIGluIGl0LgorICAgICAgICovCisgICAgICBhc3NlcnQoIXRoaXMtPmV4cHJlc3Npb25zLmlzX2VtcHR5KCkpOworCisgICAgICAvKiBUaGUgci12YWx1ZSBvZiBhIHNlcXVlbmNlIGlzIHRoZSBsYXN0IGV4cHJlc3Npb24gaW4gdGhlIHNlcXVlbmNlLiAgSWYKKyAgICAgICAqIHRoZSBvdGhlciBleHByZXNzaW9ucyBpbiB0aGUgc2VxdWVuY2UgZG8gbm90IGhhdmUgc2lkZS1lZmZlY3RzIChhbmQKKyAgICAgICAqIHRoZXJlZm9yZSBhZGQgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0KSwgdGhleSBnZXQgZHJvcHBlZAorICAgICAgICogb24gdGhlIGZsb29yLgorICAgICAgICovCisgICAgICBleGVjX25vZGUgKnByZXZpb3VzX3RhaWxfcHJlZCA9IE5VTEw7CisgICAgICBZWUxUWVBFIHByZXZpb3VzX29wZXJhbmRfbG9jID0gbG9jOworCisgICAgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9ub2RlLCBhc3QsIGxpbmssICZ0aGlzLT5leHByZXNzaW9ucykgeworICAgICAgICAgLyogSWYgb25lIG9mIHRoZSBvcGVyYW5kcyBvZiBjb21tYSBvcGVyYXRvciBkb2VzIG5vdCBnZW5lcmF0ZSBhbnkKKyAgICAgICAgICAqIGNvZGUsIHdlIHdhbnQgdG8gZW1pdCBhIHdhcm5pbmcuICBBdCBlYWNoIHBhc3MgdGhyb3VnaCB0aGUgbG9vcAorICAgICAgICAgICogcHJldmlvdXNfdGFpbF9wcmVkIHdpbGwgcG9pbnQgdG8gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlCisgICAgICAgICAgKiBzdHJlYW0gKmJlZm9yZSogcHJvY2Vzc2luZyB0aGUgcHJldmlvdXMgb3BlcmFuZC4gIE5hdHVyYWxseSwKKyAgICAgICAgICAqIGluc3RydWN0aW9ucy0+dGFpbF9wcmVkIHdpbGwgcG9pbnQgdG8gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlCisgICAgICAgICAgKiBzdHJlYW0gKmFmdGVyKiBwcm9jZXNzaW5nIHRoZSBwcmV2aW91cyBvcGVyYW5kLiAgSWYgdGhlIHR3bworICAgICAgICAgICogcG9pbnRlcnMgbWF0Y2gsIHRoZW4gdGhlIHByZXZpb3VzIG9wZXJhbmQgaGFkIG5vIGVmZmVjdC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBUaGUgd2FybmluZyBiZWhhdmlvciBoZXJlIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSBHQ0MuICBHQ0Mgd2lsbAorICAgICAgICAgICogb25seSBlbWl0IGEgd2FybmluZyBpZiBub25lIG9mIHRoZSBsZWZ0LWhhbmQgb3BlcmFuZHMgaGF2ZSBhbgorICAgICAgICAgICogZWZmZWN0LiAgSG93ZXZlciwgaXQgd2lsbCBlbWl0IGEgd2FybmluZyBmb3IgZWFjaC4gIEkgYmVsaWV2ZSB0aGF0CisgICAgICAgICAgKiB0aGVyZSBhcmUgc29tZSBjYXNlcyBpbiBDIChlc3BlY2lhbGx5IHdpdGggR0NDIGV4dGVuc2lvbnMpIHdoZXJlCisgICAgICAgICAgKiBpdCBpcyB1c2VmdWwgdG8gaGF2ZSBhbiBpbnRlcm1lZGlhdGUgc3RlcCBpbiBhIHNlcXVlbmNlIGhhdmUgbm8KKyAgICAgICAgICAqIGVmZmVjdCwgYnV0IEkgZG9uJ3QgdGhpbmsgdGhlc2UgY2FzZXMgZXhpc3QgaW4gR0xTTC4gIEVpdGhlciB3YXksCisgICAgICAgICAgKiBpdCB3b3VsZCBiZSBhIGdpYW50IGhhc3NsZSB0byByZXBsaWNhdGUgdGhhdCBiZWhhdmlvci4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHByZXZpb3VzX3RhaWxfcHJlZCA9PSBpbnN0cnVjdGlvbnMtPnRhaWxfcHJlZCkgeworICAgICAgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKCZwcmV2aW91c19vcGVyYW5kX2xvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlZnQtaGFuZCBvcGVyYW5kIG9mIGNvbW1hIGV4cHJlc3Npb24gaGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gZWZmZWN0Iik7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIHRhaWxfcHJlZCBpcyBkaXJlY3RseSBhY2Nlc3NlZCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBnZXRfdGFpbCgpCisgICAgICAgICAgKiBtZXRob2QgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuICBnZXRfdGFpbCgpIGhhcyBleHRyYSBjb2RlIHRvCisgICAgICAgICAgKiByZXR1cm4gTlVMTCB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0CisgICAgICAgICAgKiBoZXJlLCBzbyB1c2luZyB0YWlsX3ByZWQgZGlyZWN0bHkgaXMgZmluZS4KKyAgICAgICAgICAqLworICAgICAgICAgcHJldmlvdXNfdGFpbF9wcmVkID0gaW5zdHJ1Y3Rpb25zLT50YWlsX3ByZWQ7CisgICAgICAgICBwcmV2aW91c19vcGVyYW5kX2xvYyA9IGFzdC0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgICAgICAgIHJlc3VsdCA9IGFzdC0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworICAgICAgfQorCisgICAgICAvKiBBbnkgZXJyb3JzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBlbWl0dGVkIGluIHRoZSBsb29wIGFib3ZlLgorICAgICAgICovCisgICAgICBlcnJvcl9lbWl0dGVkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgfQorICAgfQorICAgdHlwZSA9IE5VTEw7IC8qIHVzZSByZXN1bHQtPnR5cGUsIG5vdCB0eXBlLiAqLworICAgYXNzZXJ0KHJlc3VsdCAhPSBOVUxMIHx8ICFuZWVkc19ydmFsdWUpOworCisgICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+dHlwZS0+aXNfZXJyb3IoKSAmJiAhZXJyb3JfZW1pdHRlZCkKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAidHlwZSBtaXNtYXRjaCIpOworCisgICByZXR1cm4gcmVzdWx0OworfQorCisKK2lyX3J2YWx1ZSAqCithc3RfZXhwcmVzc2lvbl9zdGF0ZW1lbnQ6OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIC8qIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgZXhwcmVzc2lvbiBzdGF0ZW1lbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhbgorICAgICogZXhwcmVzc2lvbi4gIFRoaXMgaXMgdGhlIHNvbGl0YXJ5IHNlbWljb2xvbjoKKyAgICAqCisgICAgKiBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICogICAgIDsKKyAgICAqCisgICAgKiBJbiB0aGlzIGNhc2UgdGhlIGV4cHJlc3Npb24gd2lsbCBiZSBOVUxMLiAgVGVzdCBmb3IgTlVMTCBhbmQgZG9uJ3QgZG8KKyAgICAqIGFueXRoaW5nIGluIHRoYXQgY2FzZS4KKyAgICAqLworICAgaWYgKGV4cHJlc3Npb24gIT0gTlVMTCkKKyAgICAgIGV4cHJlc3Npb24tPmhpcl9ub19ydmFsdWUoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgIC8qIFN0YXRlbWVudHMgZG8gbm90IGhhdmUgci12YWx1ZXMuCisgICAgKi8KKyAgIHJldHVybiBOVUxMOworfQorCisKK2lyX3J2YWx1ZSAqCithc3RfY29tcG91bmRfc3RhdGVtZW50OjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgaWYgKG5ld19zY29wZSkKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wdXNoX3Njb3BlKCk7CisKKyAgIGZvcmVhY2hfbGlzdF90eXBlZCAoYXN0X25vZGUsIGFzdCwgbGluaywgJnRoaXMtPnN0YXRlbWVudHMpCisgICAgICBhc3QtPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgaWYgKG5ld19zY29wZSkKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKworICAgLyogQ29tcG91bmQgc3RhdGVtZW50cyBkbyBub3QgaGF2ZSByLXZhbHVlcy4KKyAgICAqLworICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRXZhbHVhdGUgdGhlIGdpdmVuIGV4ZWNfbm9kZSAod2hpY2ggc2hvdWxkIGJlIGFuIGFzdF9ub2RlIHJlcHJlc2VudGluZworICogYSBzaW5nbGUgYXJyYXkgZGltZW5zaW9uKSBhbmQgcmV0dXJuIGl0cyBpbnRlZ2VyIHZhbHVlLgorICovCitzdGF0aWMgdW5zaWduZWQKK3Byb2Nlc3NfYXJyYXlfc2l6ZShleGVjX25vZGUgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgZXhlY19saXN0IGR1bW15X2luc3RydWN0aW9uczsKKworICAgYXN0X25vZGUgKmFycmF5X3NpemUgPSBleGVjX25vZGVfZGF0YShhc3Rfbm9kZSwgbm9kZSwgbGluayk7CisgICBpcl9ydmFsdWUgKmNvbnN0IGlyID0gYXJyYXlfc2l6ZS0+aGlyKCYgZHVtbXlfaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICBZWUxUWVBFIGxvYyA9IGFycmF5X3NpemUtPmdldF9sb2NhdGlvbigpOworCisgICBpZiAoaXIgPT0gTlVMTCkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBzaXplIGNvdWxkIG5vdCBiZSByZXNvbHZlZCIpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIGlmICghaXItPnR5cGUtPmlzX2ludGVnZXIoKSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBzaXplIG11c3QgYmUgaW50ZWdlciB0eXBlIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgaWYgKCFpci0+dHlwZS0+aXNfc2NhbGFyKCkpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgc2l6ZSBtdXN0IGJlIHNjYWxhciB0eXBlIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgaXJfY29uc3RhbnQgKmNvbnN0IHNpemUgPSBpci0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworICAgaWYgKHNpemUgPT0gTlVMTCkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJhcnJheSBzaXplIG11c3QgYmUgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICJjb25zdGFudCB2YWx1ZWQgZXhwcmVzc2lvbiIpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIGlmIChzaXplLT52YWx1ZS5pWzBdIDw9IDApIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAiYXJyYXkgc2l6ZSBtdXN0IGJlID4gMCIpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIGFzc2VydChzaXplLT50eXBlID09IGlyLT50eXBlKTsKKworICAgLyogSWYgdGhlIGFycmF5IHNpemUgaXMgY29uc3QgKGFuZCB3ZSd2ZSB2ZXJpZmllZCB0aGF0CisgICAgKiBpdCBpcykgdGhlbiBubyBpbnN0cnVjdGlvbnMgc2hvdWxkIGhhdmUgYmVlbiBlbWl0dGVkCisgICAgKiB3aGVuIHdlIGNvbnZlcnRlZCBpdCB0byBISVIuIElmIHRoZXkgd2VyZSBlbWl0dGVkLAorICAgICogdGhlbiBlaXRoZXIgdGhlIGFycmF5IHNpemUgaXNuJ3QgY29uc3QgYWZ0ZXIgYWxsLCBvcgorICAgICogd2UgYXJlIGVtaXR0aW5nIHVubmVjZXNzYXJ5IGluc3RydWN0aW9ucy4KKyAgICAqLworICAgYXNzZXJ0KGR1bW15X2luc3RydWN0aW9ucy5pc19lbXB0eSgpKTsKKworICAgcmV0dXJuIHNpemUtPnZhbHVlLnVbMF07Cit9CisKK3N0YXRpYyBjb25zdCBnbHNsX3R5cGUgKgorcHJvY2Vzc19hcnJheV90eXBlKFlZTFRZUEUgKmxvYywgY29uc3QgZ2xzbF90eXBlICpiYXNlLAorICAgICAgICAgICAgICAgICAgIGFzdF9hcnJheV9zcGVjaWZpZXIgKmFycmF5X3NwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKmFycmF5X3R5cGUgPSBiYXNlOworCisgICBpZiAoYXJyYXlfc3BlY2lmaWVyICE9IE5VTEwpIHsKKyAgICAgIGlmIChiYXNlLT5pc19hcnJheSgpKSB7CisKKyAgICAgICAgIC8qIEZyb20gcGFnZSAxOSAocGFnZSAyNSkgb2YgdGhlIEdMU0wgMS4yMCBzcGVjOgorICAgICAgICAgICoKKyAgICAgICAgICAqICJPbmx5IG9uZS1kaW1lbnNpb25hbCBhcnJheXMgbWF5IGJlIGRlY2xhcmVkLiIKKyAgICAgICAgICAqLworICAgICAgICAgaWYgKCFzdGF0ZS0+QVJCX2FycmF5c19vZl9hcnJheXNfZW5hYmxlKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFycmF5IG9mIGAlcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHTF9BUkJfYXJyYXlzX29mX2FycmF5cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBmb3IgZGVmaW5pbmcgYXJyYXlzIG9mIGFycmF5cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGJhc2UtPmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IHRoZSBvdXRlcm1vc3QgYXJyYXkgZGltZW5zaW9uIGNhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSB1bnNpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGV4ZWNfbm9kZSAqbm9kZSA9IGFycmF5X3NwZWNpZmllci0+YXJyYXlfZGltZW5zaW9ucy50YWlsX3ByZWQ7CisgICAgICAgICAgICFub2RlLT5pc19oZWFkX3NlbnRpbmVsKCk7IG5vZGUgPSBub2RlLT5wcmV2KSB7CisgICAgICAgICB1bnNpZ25lZCBhcnJheV9zaXplID0gcHJvY2Vzc19hcnJheV9zaXplKG5vZGUsIHN0YXRlKTsKKyAgICAgICAgIGFycmF5X3R5cGUgPSBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZShhcnJheV90eXBlLCBhcnJheV9zaXplKTsKKyAgICAgIH0KKworICAgICAgaWYgKGFycmF5X3NwZWNpZmllci0+aXNfdW5zaXplZF9hcnJheSkKKyAgICAgICAgIGFycmF5X3R5cGUgPSBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZShhcnJheV90eXBlLCAwKTsKKyAgIH0KKworICAgcmV0dXJuIGFycmF5X3R5cGU7Cit9CisKKworY29uc3QgZ2xzbF90eXBlICoKK2FzdF90eXBlX3NwZWNpZmllcjo6Z2xzbF90eXBlKGNvbnN0IGNoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKSBjb25zdAoreworICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZTsKKworICAgdHlwZSA9IHN0YXRlLT5zeW1ib2xzLT5nZXRfdHlwZSh0aGlzLT50eXBlX25hbWUpOworICAgKm5hbWUgPSB0aGlzLT50eXBlX25hbWU7CisKKyAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisgICB0eXBlID0gcHJvY2Vzc19hcnJheV90eXBlKCZsb2MsIHR5cGUsIHRoaXMtPmFycmF5X3NwZWNpZmllciwgc3RhdGUpOworCisgICByZXR1cm4gdHlwZTsKK30KKworY29uc3QgZ2xzbF90eXBlICoKK2FzdF9mdWxseV9zcGVjaWZpZWRfdHlwZTo6Z2xzbF90eXBlKGNvbnN0IGNoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKSBjb25zdAoreworICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSA9IHRoaXMtPnNwZWNpZmllci0+Z2xzbF90eXBlKG5hbWUsIHN0YXRlKTsKKworICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAodHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVAorICAgICAgICYmIHN0YXRlLT5lc19zaGFkZXIKKyAgICAgICAmJiBzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQKKyAgICAgICAmJiB0aGlzLT5xdWFsaWZpZXIucHJlY2lzaW9uID09IGFzdF9wcmVjaXNpb25fbm9uZQorICAgICAgICYmIHN0YXRlLT5zeW1ib2xzLT5nZXRfdmFyaWFibGUoIiNkZWZhdWx0IHByZWNpc2lvbiIpID09IE5VTEwpIHsKKyAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAibm8gcHJlY2lzaW9uIHNwZWNpZmllZCB0aGlzIHNjb3BlIGZvciB0eXBlIGAlcyciLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT5uYW1lKTsKKyAgIH0KKworICAgcmV0dXJuIHR5cGU7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYSB0b3BsZXZlbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBkZWNsYXJlcyBhIHZhcnlpbmcuICBUaGlzCisgKiBmdW5jdGlvbiBvcGVyYXRlcyBieSBleGFtaW5pbmcgdGhlIHZhcmlhYmxlJ3MgbW9kZSBhbmQgdGhlIHNoYWRlciB0YXJnZXQsCisgKiBzbyBpdCBjb3JyZWN0bHkgaWRlbnRpZmllcyBsaW5rYWdlIHZhcmlhYmxlcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUKKyAqIGRlY2xhcmVkIHVzaW5nIHRoZSBkZXByZWNhdGVkICJ2YXJ5aW5nIiBzeW50YXggb3IgdGhlIG5ldyAiaW4vb3V0IiBzeW50YXguCisgKgorICogUGFzc2luZyBhIG5vbi10b3BsZXZlbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAoZS5nLiBhIGZ1bmN0aW9uIHBhcmFtZXRlcikgdG8KKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm9kdWNlIHVuZGVmaW5lZCByZXN1bHRzLgorICovCitzdGF0aWMgYm9vbAoraXNfdmFyeWluZ192YXIoaXJfdmFyaWFibGUgKnZhciwgZ2xfc2hhZGVyX3N0YWdlIHRhcmdldCkKK3sKKyAgIHN3aXRjaCAodGFyZ2V0KSB7CisgICBjYXNlIE1FU0FfU0hBREVSX1ZFUlRFWDoKKyAgICAgIHJldHVybiB2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX291dDsKKyAgIGNhc2UgTUVTQV9TSEFERVJfRlJBR01FTlQ6CisgICAgICByZXR1cm4gdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbjsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9vdXQgfHwgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbjsKKyAgIH0KK30KKworCisvKioKKyAqIE1hdHJpeCBsYXlvdXQgcXVhbGlmaWVycyBhcmUgb25seSBhbGxvd2VkIG9uIGNlcnRhaW4gdHlwZXMKKyAqLworc3RhdGljIHZvaWQKK3ZhbGlkYXRlX21hdHJpeF9sYXlvdXRfZm9yX3R5cGUoc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWUxUWVBFICpsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGlmICh2YXIgJiYgIXZhci0+aXNfaW5fdW5pZm9ybV9ibG9jaygpKSB7CisgICAgICAvKiBMYXlvdXQgcXVhbGlmaWVycyBtYXkgb25seSBhcHBseSB0byBpbnRlcmZhY2UgYmxvY2tzIGFuZCBmaWVsZHMgaW4KKyAgICAgICAqIHRoZW0uCisgICAgICAgKi8KKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgInVuaWZvcm0gYmxvY2sgbGF5b3V0IHF1YWxpZmllcnMgcm93X21ham9yIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJjb2x1bW5fbWFqb3IgbWF5IG5vdCBiZSBhcHBsaWVkIHRvIHZhcmlhYmxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJvdXRzaWRlIG9mIHVuaWZvcm0gYmxvY2tzIik7CisgICB9IGVsc2UgaWYgKCF0eXBlLT5pc19tYXRyaXgoKSkgeworICAgICAgLyogVGhlIE9wZW5HTCBFUyAzLjAgY29uZm9ybWFuY2UgdGVzdHMgZGlkIG5vdCBvcmlnaW5hbGx5IGFsbG93CisgICAgICAgKiBtYXRyaXggbGF5b3V0IHF1YWxpZmllcnMgb24gbm9uLW1hdHJpY2VzLiAgSG93ZXZlciwgdGhlIE9wZW5HTAorICAgICAgICogNC40IGFuZCBPcGVuR0wgRVMgMy4wIChyZXZpc2lvbiBUQkQpIHNwZWNpZmljYXRpb25zIHdlcmUKKyAgICAgICAqIGFtZW5kZWQgdG8gc3BlY2lmaWNhbGx5IGFsbG93IHRoZXNlIGxheW91dHMgb24gYWxsIHR5cGVzLiAgRW1pdAorICAgICAgICogYSB3YXJuaW5nIHNvIHRoYXQgcGVvcGxlIGtub3cgdGhlaXIgY29kZSBtYXkgbm90IGJlIHBvcnRhYmxlLgorICAgICAgICovCisgICAgICBfbWVzYV9nbHNsX3dhcm5pbmcobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW5pZm9ybSBibG9jayBsYXlvdXQgcXVhbGlmaWVycyByb3dfbWFqb3IgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY29sdW1uX21ham9yIGFwcGxpZWQgdG8gbm9uLW1hdHJpeCB0eXBlcyBtYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJiZSByZWplY3RlZCBieSBvbGRlciBjb21waWxlcnMiKTsKKyAgIH0gZWxzZSBpZiAodHlwZS0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIC8qIFdlIGFsbG93ICdsYXlvdXQocm93X21ham9yKScgb24gc3RydWN0dXJlIHR5cGVzIGJlY2F1c2UgaXQncyB0aGUgb25seQorICAgICAgICogd2F5IHRvIGdldCByb3ctbWFqb3IgbGF5b3V0cyBvbiBtYXRyaWNlcyBjb250YWluZWQgaW4gc3RydWN0dXJlcy4KKyAgICAgICAqLworICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVuaWZvcm0gYmxvY2sgbGF5b3V0IHF1YWxpZmllcnMgcm93X21ham9yIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvbHVtbl9tYWpvciBhcHBsaWVkIHRvIHN0cnVjdHVyZSB0eXBlcyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpY3RseSBjb25mb3JtYW50IGFuZCBtYXkgYmUgcmVqZWN0ZWQgYnkgb3RoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlcnMiKTsKKyAgIH0KK30KKworc3RhdGljIGJvb2wKK3ZhbGlkYXRlX2JpbmRpbmdfcXVhbGlmaWVyKHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZTFRZUEUgKmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlICp2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhc3RfdHlwZV9xdWFsaWZpZXIgKnF1YWwpCit7CisgICBpZiAodmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3VuaWZvcm0pIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgInRoZSBcImJpbmRpbmdcIiBxdWFsaWZpZXIgb25seSBhcHBsaWVzIHRvIHVuaWZvcm1zIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGlmIChxdWFsLT5iaW5kaW5nIDwgMCkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLCAiYmluZGluZyB2YWx1ZXMgbXVzdCBiZSA+PSAwIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGNvbnN0IHN0cnVjdCBnbF9jb250ZXh0ICpjb25zdCBjdHggPSBzdGF0ZS0+Y3R4OworICAgdW5zaWduZWQgZWxlbWVudHMgPSB2YXItPnR5cGUtPmlzX2FycmF5KCkgPyB2YXItPnR5cGUtPmxlbmd0aCA6IDE7CisgICB1bnNpZ25lZCBtYXhfaW5kZXggPSBxdWFsLT5iaW5kaW5nICsgZWxlbWVudHMgLSAxOworCisgICBpZiAodmFyLT50eXBlLT5pc19pbnRlcmZhY2UoKSkgeworICAgICAgLyogVUJPcy4gIEZyb20gcGFnZSA2MCBvZiB0aGUgR0xTTCA0LjIwIHNwZWNpZmljYXRpb246CisgICAgICAgKiAiSWYgdGhlIGJpbmRpbmcgcG9pbnQgZm9yIGFueSB1bmlmb3JtIGJsb2NrIGluc3RhbmNlIGlzIGxlc3MgdGhhbiB6ZXJvLAorICAgICAgICogIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IG1heGltdW0KKyAgICAgICAqICBudW1iZXIgb2YgdW5pZm9ybSBidWZmZXIgYmluZGluZ3MsIGEgY29tcGlsYXRpb24gZXJyb3Igd2lsbCBvY2N1ci4KKyAgICAgICAqICBXaGVuIHRoZSBiaW5kaW5nIGlkZW50aWZpZXIgaXMgdXNlZCB3aXRoIGEgdW5pZm9ybSBibG9jayBpbnN0YW5jZWQgYXMKKyAgICAgICAqICBhbiBhcnJheSBvZiBzaXplIE4sIGFsbCBlbGVtZW50cyBvZiB0aGUgYXJyYXkgZnJvbSBiaW5kaW5nIHRocm91Z2gKKyAgICAgICAqICBiaW5kaW5nICsgTiDigJMgMSBtdXN0IGJlIHdpdGhpbiB0aGlzIHJhbmdlLiIKKyAgICAgICAqCisgICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IG1heGltdW0gaXMgR0xfTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTLgorICAgICAgICovCisgICAgICBpZiAobWF4X2luZGV4ID49IGN0eC0+Q29uc3QuTWF4VW5pZm9ybUJ1ZmZlckJpbmRpbmdzKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJsYXlvdXQoYmluZGluZyA9ICVkKSBmb3IgJWQgVUJPcyBleGNlZWRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBtYXhpbXVtIG51bWJlciBvZiBVQk8gYmluZGluZyBwb2ludHMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWwtPmJpbmRpbmcsIGVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPkNvbnN0Lk1heFVuaWZvcm1CdWZmZXJCaW5kaW5ncyk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9IGVsc2UgaWYgKHZhci0+dHlwZS0+aXNfc2FtcGxlcigpIHx8CisgICAgICAgICAgICAgICh2YXItPnR5cGUtPmlzX2FycmF5KCkgJiYgdmFyLT50eXBlLT5maWVsZHMuYXJyYXktPmlzX3NhbXBsZXIoKSkpIHsKKyAgICAgIC8qIFNhbXBsZXJzLiAgRnJvbSBwYWdlIDYzIG9mIHRoZSBHTFNMIDQuMjAgc3BlY2lmaWNhdGlvbjoKKyAgICAgICAqICJJZiB0aGUgYmluZGluZyBpcyBsZXNzIHRoYW4gemVybywgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAgICAgICogIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBtYXhpbXVtIHN1cHBvcnRlZCBudW1iZXIgb2YgdW5pdHMsIGEKKyAgICAgICAqICBjb21waWxhdGlvbiBlcnJvciB3aWxsIG9jY3VyLiBXaGVuIHRoZSBiaW5kaW5nIGlkZW50aWZpZXIgaXMgdXNlZAorICAgICAgICogIHdpdGggYW4gYXJyYXkgb2Ygc2l6ZSBOLCBhbGwgZWxlbWVudHMgb2YgdGhlIGFycmF5IGZyb20gYmluZGluZworICAgICAgICogIHRocm91Z2ggYmluZGluZyArIE4gLSAxIG11c3QgYmUgd2l0aGluIHRoaXMgcmFuZ2UuIgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBsaW1pdCA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtzdGF0ZS0+c3RhZ2VdLk1heFRleHR1cmVJbWFnZVVuaXRzOworCisgICAgICBpZiAobWF4X2luZGV4ID49IGxpbWl0KSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJsYXlvdXQoYmluZGluZyA9ICVkKSBmb3IgJWQgc2FtcGxlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZWVkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGV4dHVyZSBpbWFnZSB1bml0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQpIiwgcXVhbC0+YmluZGluZywgZWxlbWVudHMsIGxpbWl0KTsKKworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfSBlbHNlIGlmICh2YXItPnR5cGUtPmNvbnRhaW5zX2F0b21pYygpKSB7CisgICAgICBhc3NlcnQoY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5ncyA8PSBNQVhfQ09NQklORURfQVRPTUlDX0JVRkZFUlMpOworICAgICAgaWYgKHVuc2lnbmVkKHF1YWwtPmJpbmRpbmcpID49IGN0eC0+Q29uc3QuTWF4QXRvbWljQnVmZmVyQmluZGluZ3MpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgImxheW91dChiaW5kaW5nID0gJWQpIGV4Y2VlZHMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtYXhpbXVtIG51bWJlciBvZiBhdG9taWMgY291bnRlciBidWZmZXIgYmluZGluZ3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQpIiwgcXVhbC0+YmluZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5ncyk7CisKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgXCJiaW5kaW5nXCIgcXVhbGlmaWVyIG9ubHkgYXBwbGllcyB0byB1bmlmb3JtICIKKyAgICAgICAgICAgICAgICAgICAgICAgImJsb2Nrcywgc2FtcGxlcnMsIGF0b21pYyBjb3VudGVycywgb3IgYXJyYXlzIHRoZXJlb2YiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKKworc3RhdGljIGdsc2xfaW50ZXJwX3F1YWxpZmllcgoraW50ZXJwcmV0X2ludGVycG9sYXRpb25fcXVhbGlmaWVyKGNvbnN0IHN0cnVjdCBhc3RfdHlwZV9xdWFsaWZpZXIgKnF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGVfbW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWUxUWVBFICpsb2MpCit7CisgICBnbHNsX2ludGVycF9xdWFsaWZpZXIgaW50ZXJwb2xhdGlvbjsKKyAgIGlmIChxdWFsLT5mbGFncy5xLmZsYXQpCisgICAgICBpbnRlcnBvbGF0aW9uID0gSU5URVJQX1FVQUxJRklFUl9GTEFUOworICAgZWxzZSBpZiAocXVhbC0+ZmxhZ3MucS5ub3BlcnNwZWN0aXZlKQorICAgICAgaW50ZXJwb2xhdGlvbiA9IElOVEVSUF9RVUFMSUZJRVJfTk9QRVJTUEVDVElWRTsKKyAgIGVsc2UgaWYgKHF1YWwtPmZsYWdzLnEuc21vb3RoKQorICAgICAgaW50ZXJwb2xhdGlvbiA9IElOVEVSUF9RVUFMSUZJRVJfU01PT1RIOworICAgZWxzZQorICAgICAgaW50ZXJwb2xhdGlvbiA9IElOVEVSUF9RVUFMSUZJRVJfTk9ORTsKKworICAgaWYgKGludGVycG9sYXRpb24gIT0gSU5URVJQX1FVQUxJRklFUl9OT05FKSB7CisgICAgICBpZiAobW9kZSAhPSBpcl92YXJfc2hhZGVyX2luICYmIG1vZGUgIT0gaXJfdmFyX3NoYWRlcl9vdXQpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVycG9sYXRpb24gcXVhbGlmaWVyIGAlcycgY2FuIG9ubHkgYmUgYXBwbGllZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGFkZXIgaW5wdXRzIG9yIG91dHB1dHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbl9zdHJpbmcoaW50ZXJwb2xhdGlvbikpOworCisgICAgICB9CisKKyAgICAgIGlmICgoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX1ZFUlRFWCAmJiBtb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4pIHx8CisgICAgICAgICAgKHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCAmJiBtb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0KSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXIgYCVzJyBjYW5ub3QgYmUgYXBwbGllZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0ZXggc2hhZGVyIGlucHV0cyBvciBmcmFnbWVudCBzaGFkZXIgb3V0cHV0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb25fc3RyaW5nKGludGVycG9sYXRpb24pKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGludGVycG9sYXRpb247Cit9CisKKworc3RhdGljIHZvaWQKK3ZhbGlkYXRlX2V4cGxpY2l0X2xvY2F0aW9uKGNvbnN0IHN0cnVjdCBhc3RfdHlwZV9xdWFsaWZpZXIgKnF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJpYWJsZSAqdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWVlMVFlQRSAqbG9jKQoreworICAgYm9vbCBmYWlsID0gZmFsc2U7CisKKyAgIC8qIEJldHdlZW4gR0xfQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbiBhbgorICAgICogR0xfQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzLCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIGFueSBzaGFkZXIKKyAgICAqIHN0YWdlIGNhbiBiZSBhc3NpZ25lZCBleHBsaWNpdCBsb2NhdGlvbnMuICBUaGUgY2hlY2tpbmcgaGVyZSBhc3NvY2lhdGVzCisgICAgKiB0aGUgY29ycmVjdCBleHRlbnNpb24gd2l0aCB0aGUgY29ycmVjdCBzdGFnZSdzIGlucHV0IC8gb3V0cHV0OgorICAgICoKKyAgICAqICAgICAgICAgICAgICAgICAgICAgaW5wdXQgICAgICAgICAgICBvdXRwdXQKKyAgICAqICAgICAgICAgICAgICAgICAgICAgLS0tLS0gICAgICAgICAgICAtLS0tLS0KKyAgICAqIHZlcnRleCAgICAgICAgICAgICAgZXhwbGljaXRfbG9jICAgICBzc28KKyAgICAqIGdlb21ldHJ5ICAgICAgICAgICAgc3NvICAgICAgICAgICAgICBzc28KKyAgICAqIGZyYWdtZW50ICAgICAgICAgICAgc3NvICAgICAgICAgICAgICBleHBsaWNpdF9sb2MKKyAgICAqLworICAgc3dpdGNoIChzdGF0ZS0+c3RhZ2UpIHsKKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4pIHsKKyAgICAgICAgIGlmICghc3RhdGUtPmNoZWNrX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbl9hbGxvd2VkKGxvYywgdmFyKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX291dCkgeworICAgICAgICAgaWYgKCFzdGF0ZS0+Y2hlY2tfc2VwYXJhdGVfc2hhZGVyX29iamVjdHNfYWxsb3dlZChsb2MsIHZhcikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBmYWlsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIE1FU0FfU0hBREVSX0dFT01FVFJZOgorICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4gfHwgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9vdXQpIHsKKyAgICAgICAgIGlmICghc3RhdGUtPmNoZWNrX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzX2FsbG93ZWQobG9jLCB2YXIpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZmFpbCA9IHRydWU7CisgICAgICBicmVhazsKKworICAgY2FzZSBNRVNBX1NIQURFUl9GUkFHTUVOVDoKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKSB7CisgICAgICAgICBpZiAoIXN0YXRlLT5jaGVja19zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0c19hbGxvd2VkKGxvYywgdmFyKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX291dCkgeworICAgICAgICAgaWYgKCFzdGF0ZS0+Y2hlY2tfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uX2FsbG93ZWQobG9jLCB2YXIpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZmFpbCA9IHRydWU7CisgICAgICBicmVhazsKKworICAgY2FzZSBNRVNBX1NIQURFUl9DT01QVVRFOgorICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiY29tcHV0ZSBzaGFkZXIgdmFyaWFibGVzIGNhbm5vdCBiZSBnaXZlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJleHBsaWNpdCBsb2NhdGlvbnMiKTsKKyAgICAgIHJldHVybjsKKyAgIH07CisKKyAgIGlmIChmYWlsKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgZ2l2ZW4gYW4gZXhwbGljaXQgbG9jYXRpb24gaW4gJXMgc2hhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9zdHJpbmcodmFyKSwKKyAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoc3RhdGUtPnN0YWdlKSk7CisgICB9IGVsc2UgeworICAgICAgdmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uID0gdHJ1ZTsKKworICAgICAgLyogVGhpcyBiaXQgb2Ygc2lsbGluZXNzIGlzIG5lZWRlZCBiZWNhdXNlIGludmFsaWQgZXhwbGljaXQgbG9jYXRpb25zCisgICAgICAgKiBhcmUgc3VwcG9zZWQgdG8gYmUgZmxhZ2dlZCBkdXJpbmcgbGlua2luZy4gIFNtYWxsIG5lZ2F0aXZlIHZhbHVlcworICAgICAgICogYmlhc2VkIGJ5IFZFUlRfQVRUUklCX0dFTkVSSUMwIG9yIEZSQUdfUkVTVUxUX0RBVEEwIGNvdWxkIGFsaWFzCisgICAgICAgKiBidWlsdC1pbiB2YWx1ZXMgKGUuZy4sIC0xNitWRVJUX0FUVFJJQl9HRU5FUklDMCA9IFZFUlRfQVRUUklCX1BPUykuCisgICAgICAgKiBUaGUgbGlua2VyIG5lZWRzIHRvIGJlIGFibGUgdG8gZGlmZmVyZW50aWF0ZSB0aGVzZSBjYXNlcy4gIFRoaXMKKyAgICAgICAqIGVuc3VyZXMgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc3RheSBuZWdhdGl2ZS4KKyAgICAgICAqLworICAgICAgaWYgKHF1YWwtPmxvY2F0aW9uID49IDApIHsKKyAgICAgICAgIHN3aXRjaCAoc3RhdGUtPnN0YWdlKSB7CisgICAgICAgICBjYXNlIE1FU0FfU0hBREVSX1ZFUlRFWDoKKyAgICAgICAgICAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9ICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKQorICAgICAgICAgICAgICAgPyAocXVhbC0+bG9jYXRpb24gKyBWRVJUX0FUVFJJQl9HRU5FUklDMCkKKyAgICAgICAgICAgICAgIDogKHF1YWwtPmxvY2F0aW9uICsgVkFSWUlOR19TTE9UX1ZBUjApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTUVTQV9TSEFERVJfR0VPTUVUUlk6CisgICAgICAgICAgICB2YXItPmRhdGEubG9jYXRpb24gPSBxdWFsLT5sb2NhdGlvbiArIFZBUllJTkdfU0xPVF9WQVIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTUVTQV9TSEFERVJfRlJBR01FTlQ6CisgICAgICAgICAgICB2YXItPmRhdGEubG9jYXRpb24gPSAodmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9vdXQpCisgICAgICAgICAgICAgICA/IChxdWFsLT5sb2NhdGlvbiArIEZSQUdfUkVTVUxUX0RBVEEwKQorICAgICAgICAgICAgICAgOiAocXVhbC0+bG9jYXRpb24gKyBWQVJZSU5HX1NMT1RfVkFSMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgTUVTQV9TSEFERVJfQ09NUFVURToKKyAgICAgICAgICAgIGFzc2VydCghIlVuZXhwZWN0ZWQgc2hhZGVyIHR5cGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IHF1YWwtPmxvY2F0aW9uOworICAgICAgfQorCisgICAgICBpZiAocXVhbC0+ZmxhZ3MucS5leHBsaWNpdF9pbmRleCkgeworICAgICAgICAgLyogRnJvbSB0aGUgR0xTTCA0LjMwIHNwZWNpZmljYXRpb24sIHNlY3Rpb24gNC40LjIgKE91dHB1dAorICAgICAgICAgICogTGF5b3V0IFF1YWxpZmllcnMpOgorICAgICAgICAgICoKKyAgICAgICAgICAqICJJdCBpcyBhbHNvIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZnJhZ21lbnQgc2hhZGVyCisgICAgICAgICAgKiAgc2V0cyBhIGxheW91dCBpbmRleCB0byBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gMS4iCisgICAgICAgICAgKgorICAgICAgICAgICogT2xkZXIgc3BlY2lmaWNhdGlvbnMgZG9uJ3QgbWFuZGF0ZSBhIGJlaGF2aW9yOyB3ZSB0YWtlCisgICAgICAgICAgKiB0aGlzIGFzIGEgY2xhcmlmaWNhdGlvbiBhbmQgYWx3YXlzIGdlbmVyYXRlIHRoZSBlcnJvci4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHF1YWwtPmluZGV4IDwgMCB8fCBxdWFsLT5pbmRleCA+IDEpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGxpY2l0IGluZGV4IG1heSBvbmx5IGJlIDAgb3IgMSIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhci0+ZGF0YS5leHBsaWNpdF9pbmRleCA9IHRydWU7CisgICAgICAgICAgICB2YXItPmRhdGEuaW5kZXggPSBxdWFsLT5pbmRleDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2FwcGx5X2ltYWdlX3F1YWxpZmllcl90b192YXJpYWJsZShjb25zdCBzdHJ1Y3QgYXN0X3R5cGVfcXVhbGlmaWVyICpxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlICp2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZTFRZUEUgKmxvYykKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqYmFzZV90eXBlID0KKyAgICAgICh2YXItPnR5cGUtPmlzX2FycmF5KCkgPyB2YXItPnR5cGUtPmVsZW1lbnRfdHlwZSgpIDogdmFyLT50eXBlKTsKKworICAgaWYgKGJhc2VfdHlwZS0+aXNfaW1hZ2UoKSkgeworICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl91bmlmb3JtICYmCisgICAgICAgICAgdmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX2Z1bmN0aW9uX2luKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJpbWFnZSB2YXJpYWJsZXMgbWF5IG9ubHkgYmUgZGVjbGFyZWQgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gcGFyYW1ldGVycyBvciB1bmlmb3JtLXF1YWxpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWwgdmFyaWFibGVzIik7CisgICAgICB9CisKKyAgICAgIHZhci0+ZGF0YS5pbWFnZS5yZWFkX29ubHkgfD0gcXVhbC0+ZmxhZ3MucS5yZWFkX29ubHk7CisgICAgICB2YXItPmRhdGEuaW1hZ2Uud3JpdGVfb25seSB8PSBxdWFsLT5mbGFncy5xLndyaXRlX29ubHk7CisgICAgICB2YXItPmRhdGEuaW1hZ2UuY29oZXJlbnQgfD0gcXVhbC0+ZmxhZ3MucS5jb2hlcmVudDsKKyAgICAgIHZhci0+ZGF0YS5pbWFnZS5fdm9sYXRpbGUgfD0gcXVhbC0+ZmxhZ3MucS5fdm9sYXRpbGU7CisgICAgICB2YXItPmRhdGEuaW1hZ2UucmVzdHJpY3RfZmxhZyB8PSBxdWFsLT5mbGFncy5xLnJlc3RyaWN0X2ZsYWc7CisgICAgICB2YXItPmRhdGEucmVhZF9vbmx5ID0gdHJ1ZTsKKworICAgICAgaWYgKHF1YWwtPmZsYWdzLnEuZXhwbGljaXRfaW1hZ2VfZm9ybWF0KSB7CisgICAgICAgICBpZiAodmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX2luKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJmb3JtYXQgcXVhbGlmaWVycyBjYW5ub3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlZCBvbiBpbWFnZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChxdWFsLT5pbWFnZV9iYXNlX3R5cGUgIT0gYmFzZV90eXBlLT5zYW1wbGVyX3R5cGUpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgImZvcm1hdCBxdWFsaWZpZXIgZG9lc24ndCBtYXRjaCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZSBkYXRhIHR5cGUgb2YgdGhlIGltYWdlIik7CisgICAgICAgICB9CisKKyAgICAgICAgIHZhci0+ZGF0YS5pbWFnZS5mb3JtYXQgPSBxdWFsLT5pbWFnZV9mb3JtYXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtICYmICFxdWFsLT5mbGFncy5xLndyaXRlX29ubHkpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgInVuaWZvcm1zIG5vdCBxdWFsaWZpZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJgd3JpdGVvbmx5JyBtdXN0IGhhdmUgYSBmb3JtYXQgbGF5b3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YWxpZmllciIpOworICAgICAgICAgfQorCisgICAgICAgICB2YXItPmRhdGEuaW1hZ2UuZm9ybWF0ID0gR0xfTk9ORTsKKyAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKgorZ2V0X2xheW91dF9xdWFsaWZpZXJfc3RyaW5nKGJvb2wgb3JpZ2luX3VwcGVyX2xlZnQsIGJvb2wgcGl4ZWxfY2VudGVyX2ludGVnZXIpCit7CisgICBpZiAob3JpZ2luX3VwcGVyX2xlZnQgJiYgcGl4ZWxfY2VudGVyX2ludGVnZXIpCisgICAgICByZXR1cm4gIm9yaWdpbl91cHBlcl9sZWZ0LCBwaXhlbF9jZW50ZXJfaW50ZWdlciI7CisgICBlbHNlIGlmIChvcmlnaW5fdXBwZXJfbGVmdCkKKyAgICAgIHJldHVybiAib3JpZ2luX3VwcGVyX2xlZnQiOworICAgZWxzZSBpZiAocGl4ZWxfY2VudGVyX2ludGVnZXIpCisgICAgICByZXR1cm4gInBpeGVsX2NlbnRlcl9pbnRlZ2VyIjsKKyAgIGVsc2UKKyAgICAgIHJldHVybiAiICI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraXNfY29uZmxpY3RpbmdfZnJhZ2Nvb3JkX3JlZGVjbGFyYXRpb24oc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFzdF90eXBlX3F1YWxpZmllciAqcXVhbCkKK3sKKyAgIC8qIElmIGdsX0ZyYWdDb29yZCB3YXMgcHJldmlvdXNseSBkZWNsYXJlZCwgYW5kIHRoZSBxdWFsaWZpZXJzIHdlcmUKKyAgICAqIGRpZmZlcmVudCBpbiBhbnkgd2F5LCByZXR1cm4gdHJ1ZS4KKyAgICAqLworICAgaWYgKHN0YXRlLT5mc19yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZCkgeworICAgICAgcmV0dXJuIChzdGF0ZS0+ZnNfcGl4ZWxfY2VudGVyX2ludGVnZXIgIT0gcXVhbC0+ZmxhZ3MucS5waXhlbF9jZW50ZXJfaW50ZWdlcgorICAgICAgICAgfHwgc3RhdGUtPmZzX29yaWdpbl91cHBlcl9sZWZ0ICE9IHF1YWwtPmZsYWdzLnEub3JpZ2luX3VwcGVyX2xlZnQpOworICAgfQorCisgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkCithcHBseV90eXBlX3F1YWxpZmllcl90b192YXJpYWJsZShjb25zdCBzdHJ1Y3QgYXN0X3R5cGVfcXVhbGlmaWVyICpxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGUgKnZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZTFRZUEUgKmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFyYW1ldGVyKQoreworICAgU1RBVElDX0FTU0VSVChzaXplb2YocXVhbC0+ZmxhZ3MucSkgPD0gc2l6ZW9mKHF1YWwtPmZsYWdzLmkpKTsKKworICAgaWYgKHF1YWwtPmZsYWdzLnEuaW52YXJpYW50KSB7CisgICAgICBpZiAodmFyLT5kYXRhLnVzZWQpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlIGAlcycgbWF5IG5vdCBiZSByZWRlY2xhcmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImBpbnZhcmlhbnQnIGFmdGVyIGJlaW5nIHVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPm5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHZhci0+ZGF0YS5pbnZhcmlhbnQgPSAxOworICAgICAgfQorICAgfQorCisgICBpZiAocXVhbC0+ZmxhZ3MucS5jb25zdGFudCB8fCBxdWFsLT5mbGFncy5xLmF0dHJpYnV0ZQorICAgICAgIHx8IHF1YWwtPmZsYWdzLnEudW5pZm9ybQorICAgICAgIHx8IChxdWFsLT5mbGFncy5xLnZhcnlpbmcgJiYgKHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCkpKQorICAgICAgdmFyLT5kYXRhLnJlYWRfb25seSA9IDE7CisKKyAgIGlmIChxdWFsLT5mbGFncy5xLmNlbnRyb2lkKQorICAgICAgdmFyLT5kYXRhLmNlbnRyb2lkID0gMTsKKworICAgaWYgKHF1YWwtPmZsYWdzLnEuc2FtcGxlKQorICAgICAgdmFyLT5kYXRhLnNhbXBsZSA9IDE7CisKKyAgIGlmIChxdWFsLT5mbGFncy5xLmF0dHJpYnV0ZSAmJiBzdGF0ZS0+c3RhZ2UgIT0gTUVTQV9TSEFERVJfVkVSVEVYKSB7CisgICAgICB2YXItPnR5cGUgPSBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJgYXR0cmlidXRlJyB2YXJpYWJsZXMgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAiJXMgc2hhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhzdGF0ZS0+c3RhZ2UpKTsKKyAgIH0KKworICAgLyogU2VjdGlvbiA2LjEuMSAoRnVuY3Rpb24gQ2FsbGluZyBDb252ZW50aW9ucykgb2YgdGhlIEdMU0wgMS4xMCBzcGVjIHNheXM6CisgICAgKgorICAgICogICAgICJIb3dldmVyLCB0aGUgY29uc3QgcXVhbGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggb3V0IG9yIGlub3V0LiIKKyAgICAqCisgICAgKiBUaGUgc2FtZSBzZWN0aW9uIG9mIHRoZSBHTFNMIDQuNDAgc3BlYyBmdXJ0aGVyIGNsYXJpZmllcyB0aGlzIHNheWluZzoKKyAgICAqCisgICAgKiAgICAgIlRoZSBjb25zdCBxdWFsaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBvdXQgb3IgaW5vdXQsIG9yIGEKKyAgICAqICAgICBjb21waWxlLXRpbWUgZXJyb3IgcmVzdWx0cy4iCisgICAgKi8KKyAgIGlmIChpc19wYXJhbWV0ZXIgJiYgcXVhbC0+ZmxhZ3MucS5jb25zdGFudCAmJiBxdWFsLT5mbGFncy5xLm91dCkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiYGNvbnN0JyBtYXkgbm90IGJlIGFwcGxpZWQgdG8gYG91dCcgb3IgYGlub3V0JyAiCisgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBwYXJhbWV0ZXJzIik7CisgICB9CisKKyAgIC8qIElmIHRoZXJlIGlzIG5vIHF1YWxpZmllciB0aGF0IGNoYW5nZXMgdGhlIG1vZGUgb2YgdGhlIHZhcmlhYmxlLCBsZWF2ZQorICAgICogdGhlIHNldHRpbmcgYWxvbmUuCisgICAgKi8KKyAgIGlmIChxdWFsLT5mbGFncy5xLmluICYmIHF1YWwtPmZsYWdzLnEub3V0KQorICAgICAgdmFyLT5kYXRhLm1vZGUgPSBpcl92YXJfZnVuY3Rpb25faW5vdXQ7CisgICBlbHNlIGlmIChxdWFsLT5mbGFncy5xLmluKQorICAgICAgdmFyLT5kYXRhLm1vZGUgPSBpc19wYXJhbWV0ZXIgPyBpcl92YXJfZnVuY3Rpb25faW4gOiBpcl92YXJfc2hhZGVyX2luOworICAgZWxzZSBpZiAocXVhbC0+ZmxhZ3MucS5hdHRyaWJ1dGUKKwkgICAgfHwgKHF1YWwtPmZsYWdzLnEudmFyeWluZyAmJiAoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UKSkpCisgICAgICB2YXItPmRhdGEubW9kZSA9IGlyX3Zhcl9zaGFkZXJfaW47CisgICBlbHNlIGlmIChxdWFsLT5mbGFncy5xLm91dCkKKyAgICAgIHZhci0+ZGF0YS5tb2RlID0gaXNfcGFyYW1ldGVyID8gaXJfdmFyX2Z1bmN0aW9uX291dCA6IGlyX3Zhcl9zaGFkZXJfb3V0OworICAgZWxzZSBpZiAocXVhbC0+ZmxhZ3MucS52YXJ5aW5nICYmIChzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfVkVSVEVYKSkKKyAgICAgIHZhci0+ZGF0YS5tb2RlID0gaXJfdmFyX3NoYWRlcl9vdXQ7CisgICBlbHNlIGlmIChxdWFsLT5mbGFncy5xLnVuaWZvcm0pCisgICAgICB2YXItPmRhdGEubW9kZSA9IGlyX3Zhcl91bmlmb3JtOworCisgICBpZiAoIWlzX3BhcmFtZXRlciAmJiBpc192YXJ5aW5nX3Zhcih2YXIsIHN0YXRlLT5zdGFnZSkpIHsKKyAgICAgIC8qIFVzZXItZGVmaW5lZCBpbnMvb3V0cyBhcmUgbm90IHBlcm1pdHRlZCBpbiBjb21wdXRlIHNoYWRlcnMuICovCisgICAgICBpZiAoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0NPTVBVVEUpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXItZGVmaW5lZCBpbnB1dCBhbmQgb3V0cHV0IHZhcmlhYmxlcyBhcmUgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcm1pdHRlZCBpbiBjb21wdXRlIHNoYWRlcnMiKTsKKyAgICAgIH0KKworICAgICAgLyogVGhpcyB2YXJpYWJsZSBpcyBiZWluZyB1c2VkIHRvIGxpbmsgZGF0YSBiZXR3ZWVuIHNoYWRlciBzdGFnZXMgKGluCisgICAgICAgKiBwcmUtZ2xzbC0xLjMwIHBhcmxhbmNlLCBpdCdzIGEgInZhcnlpbmciKS4gIENoZWNrIHRoYXQgaXQgaGFzIGEgdHlwZQorICAgICAgICogdGhhdCBpcyBhbGxvd2VkIGZvciBzdWNoIHB1cnBvc2VzLgorICAgICAgICoKKyAgICAgICAqIEZyb20gcGFnZSAyNSAocGFnZSAzMSBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjEwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgICJUaGUgdmFyeWluZyBxdWFsaWZpZXIgY2FuIGJlIHVzZWQgb25seSB3aXRoIHRoZSBkYXRhIHR5cGVzCisgICAgICAgKiAgICAgZmxvYXQsIHZlYzIsIHZlYzMsIHZlYzQsIG1hdDIsIG1hdDMsIGFuZCBtYXQ0LCBvciBhcnJheXMgb2YKKyAgICAgICAqICAgICB0aGVzZS4iCisgICAgICAgKgorICAgICAgICogVGhpcyB3YXMgcmVsYXhlZCBpbiBHTFNMIHZlcnNpb24gMS4zMCBhbmQgR0xTTCBFUyB2ZXJzaW9uIDMuMDAuICBGcm9tCisgICAgICAgKiBwYWdlIDMxIChwYWdlIDM3IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMzAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAgIkZyYWdtZW50IGlucHV0cyBjYW4gb25seSBiZSBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXJzIGFuZAorICAgICAgICogICAgIGludGVnZXIgdmVjdG9ycywgZmxvYXQsIGZsb2F0aW5nLXBvaW50IHZlY3RvcnMsIG1hdHJpY2VzLCBvcgorICAgICAgICogICAgIGFycmF5cyBvZiB0aGVzZS4gU3RydWN0dXJlcyBjYW5ub3QgYmUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogU2ltaWxhciB0ZXh0IGV4aXN0cyBpbiB0aGUgc2VjdGlvbiBvbiB2ZXJ0ZXggc2hhZGVyIG91dHB1dHMuCisgICAgICAgKgorICAgICAgICogU2ltaWxhciB0ZXh0IGV4aXN0cyBpbiB0aGUgR0xTTCBFUyAzLjAwIHNwZWMsIGV4Y2VwdCB0aGF0IHRoZSBHTFNMIEVTCisgICAgICAgKiAzLjAwIHNwZWMgYWxsb3dzIHN0cnVjdHMgYXMgd2VsbC4gIFZhcnlpbmcgc3RydWN0cyBhcmUgYWxzbyBhbGxvd2VkCisgICAgICAgKiBpbiBHTFNMIDEuNTAuCisgICAgICAgKi8KKyAgICAgIHN3aXRjaCAodmFyLT50eXBlLT5nZXRfc2NhbGFyX3R5cGUoKS0+YmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgICAgICAgIC8qIE9rIGluIGFsbCBHTFNMIHZlcnNpb25zICovCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICAgICAgICBpZiAoc3RhdGUtPmlzX3ZlcnNpb24oMTMwLCAzMDApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJ5aW5nIHZhcmlhYmxlcyBtdXN0IGJlIG9mIGJhc2UgdHlwZSBmbG9hdCBpbiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5nZXRfdmVyc2lvbl9zdHJpbmcoKSk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1NUUlVDVDoKKyAgICAgICAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxNTAsIDMwMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcnlpbmcgdmFyaWFibGVzIG1heSBub3QgYmUgb2YgdHlwZSBzdHJ1Y3QiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwgImlsbGVnYWwgdHlwZSBmb3IgYSB2YXJ5aW5nIHZhcmlhYmxlIik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHN0YXRlLT5hbGxfaW52YXJpYW50ICYmIChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKSkgeworICAgICAgc3dpdGNoIChzdGF0ZS0+c3RhZ2UpIHsKKyAgICAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0KQorICAgICAgICAgICAgdmFyLT5kYXRhLmludmFyaWFudCA9IHRydWU7CisJICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1FU0FfU0hBREVSX0dFT01FVFJZOgorICAgICAgICAgaWYgKCh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKQorICAgICAgICAgICAgIHx8ICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX291dCkpCisgICAgICAgICAgICB2YXItPmRhdGEuaW52YXJpYW50ID0gdHJ1ZTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNRVNBX1NIQURFUl9GUkFHTUVOVDoKKyAgICAgICAgIGlmICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKQorICAgICAgICAgICAgdmFyLT5kYXRhLmludmFyaWFudCA9IHRydWU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTUVTQV9TSEFERVJfQ09NUFVURToKKyAgICAgICAgIC8qIEludmFyaWFuY2UgaXNuJ3QgbWVhbmluZ2Z1bCBpbiBjb21wdXRlIHNoYWRlcnMuICovCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgdmFyLT5kYXRhLmludGVycG9sYXRpb24gPQorICAgICAgaW50ZXJwcmV0X2ludGVycG9sYXRpb25fcXVhbGlmaWVyKHF1YWwsIChpcl92YXJpYWJsZV9tb2RlKSB2YXItPmRhdGEubW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgbG9jKTsKKworICAgdmFyLT5kYXRhLnBpeGVsX2NlbnRlcl9pbnRlZ2VyID0gcXVhbC0+ZmxhZ3MucS5waXhlbF9jZW50ZXJfaW50ZWdlcjsKKyAgIHZhci0+ZGF0YS5vcmlnaW5fdXBwZXJfbGVmdCA9IHF1YWwtPmZsYWdzLnEub3JpZ2luX3VwcGVyX2xlZnQ7CisgICBpZiAoKHF1YWwtPmZsYWdzLnEub3JpZ2luX3VwcGVyX2xlZnQgfHwgcXVhbC0+ZmxhZ3MucS5waXhlbF9jZW50ZXJfaW50ZWdlcikKKyAgICAgICAmJiAoc3RyY21wKHZhci0+bmFtZSwgImdsX0ZyYWdDb29yZCIpICE9IDApKSB7CisgICAgICBjb25zdCBjaGFyICpjb25zdCBxdWFsX3N0cmluZyA9IChxdWFsLT5mbGFncy5xLm9yaWdpbl91cHBlcl9sZWZ0KQorICAgICAgICAgPyAib3JpZ2luX3VwcGVyX2xlZnQiIDogInBpeGVsX2NlbnRlcl9pbnRlZ2VyIjsKKworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorCQkgICAgICAgImxheW91dCBxdWFsaWZpZXIgYCVzJyBjYW4gb25seSBiZSBhcHBsaWVkIHRvICIKKwkJICAgICAgICJmcmFnbWVudCBzaGFkZXIgaW5wdXQgYGdsX0ZyYWdDb29yZCciLAorCQkgICAgICAgcXVhbF9zdHJpbmcpOworICAgfQorCisgICBpZiAodmFyLT5uYW1lICE9IE5VTEwgJiYgc3RyY21wKHZhci0+bmFtZSwgImdsX0ZyYWdDb29yZCIpID09IDApIHsKKworICAgICAgLyogU2VjdGlvbiA0LjMuOC4xLCBwYWdlIDM5IG9mIEdMU0wgMS41MCBzcGVjIHNheXM6CisgICAgICAgKgorICAgICAgICogICAgIldpdGhpbiBhbnkgc2hhZGVyLCB0aGUgZmlyc3QgcmVkZWNsYXJhdGlvbnMgb2YgZ2xfRnJhZ0Nvb3JkCisgICAgICAgKiAgICAgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSB1c2Ugb2YgZ2xfRnJhZ0Nvb3JkLiIKKyAgICAgICAqCisgICAgICAgKiBHZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yIGlmIGFib3ZlIGNvbmRpdGlvbiBpcyBub3QgbWV0IGJ5IHRoZQorICAgICAgICogZnJhZ21lbnQgc2hhZGVyLgorICAgICAgICovCisgICAgICBpcl92YXJpYWJsZSAqZWFybGllciA9IHN0YXRlLT5zeW1ib2xzLT5nZXRfdmFyaWFibGUoImdsX0ZyYWdDb29yZCIpOworICAgICAgaWYgKGVhcmxpZXIgIT0gTlVMTCAmJgorICAgICAgICAgIGVhcmxpZXItPmRhdGEudXNlZCAmJgorICAgICAgICAgICFzdGF0ZS0+ZnNfcmVkZWNsYXJlc19nbF9mcmFnY29vcmQpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImdsX0ZyYWdDb29yZCB1c2VkIGJlZm9yZSBpdHMgZmlyc3QgcmVkZWNsYXJhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBmcmFnbWVudCBzaGFkZXIiKTsKKyAgICAgIH0KKworICAgICAgLyogTWFrZSBzdXJlIGFsbCBnbF9GcmFnQ29vcmQgcmVkZWNsYXJhdGlvbnMgc3BlY2lmeSB0aGUgc2FtZSBsYXlvdXQKKyAgICAgICAqIHF1YWxpZmllcnMuCisgICAgICAgKi8KKyAgICAgIGlmIChpc19jb25mbGljdGluZ19mcmFnY29vcmRfcmVkZWNsYXJhdGlvbihzdGF0ZSwgcXVhbCkpIHsKKyAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHF1YWxfc3RyaW5nID0KKyAgICAgICAgICAgIGdldF9sYXlvdXRfcXVhbGlmaWVyX3N0cmluZyhxdWFsLT5mbGFncy5xLm9yaWdpbl91cHBlcl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWwtPmZsYWdzLnEucGl4ZWxfY2VudGVyX2ludGVnZXIpOworCisgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBzdGF0ZV9zdHJpbmcgPQorICAgICAgICAgICAgZ2V0X2xheW91dF9xdWFsaWZpZXJfc3RyaW5nKHN0YXRlLT5mc19vcmlnaW5fdXBwZXJfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+ZnNfcGl4ZWxfY2VudGVyX2ludGVnZXIpOworCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJnbF9GcmFnQ29vcmQgcmVkZWNsYXJlZCB3aXRoIGRpZmZlcmVudCBsYXlvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhbGlmaWVycyAoJXMpIGFuZCAoJXMpICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbF9zdHJpbmcpOworICAgICAgfQorICAgICAgc3RhdGUtPmZzX29yaWdpbl91cHBlcl9sZWZ0ID0gcXVhbC0+ZmxhZ3MucS5vcmlnaW5fdXBwZXJfbGVmdDsKKyAgICAgIHN0YXRlLT5mc19waXhlbF9jZW50ZXJfaW50ZWdlciA9IHF1YWwtPmZsYWdzLnEucGl4ZWxfY2VudGVyX2ludGVnZXI7CisgICAgICBzdGF0ZS0+ZnNfcmVkZWNsYXJlc19nbF9mcmFnY29vcmRfd2l0aF9ub19sYXlvdXRfcXVhbGlmaWVycyA9CisgICAgICAgICAhcXVhbC0+ZmxhZ3MucS5vcmlnaW5fdXBwZXJfbGVmdCAmJiAhcXVhbC0+ZmxhZ3MucS5waXhlbF9jZW50ZXJfaW50ZWdlcjsKKyAgICAgIHN0YXRlLT5mc19yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZCA9CisgICAgICAgICBzdGF0ZS0+ZnNfb3JpZ2luX3VwcGVyX2xlZnQgfHwKKyAgICAgICAgIHN0YXRlLT5mc19waXhlbF9jZW50ZXJfaW50ZWdlciB8fAorICAgICAgICAgc3RhdGUtPmZzX3JlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkX3dpdGhfbm9fbGF5b3V0X3F1YWxpZmllcnM7CisgICB9CisKKyAgIGlmIChxdWFsLT5mbGFncy5xLmV4cGxpY2l0X2xvY2F0aW9uKSB7CisgICAgICB2YWxpZGF0ZV9leHBsaWNpdF9sb2NhdGlvbihxdWFsLCB2YXIsIHN0YXRlLCBsb2MpOworICAgfSBlbHNlIGlmIChxdWFsLT5mbGFncy5xLmV4cGxpY2l0X2luZGV4KSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJleHBsaWNpdCBpbmRleCByZXF1aXJlcyBleHBsaWNpdCBsb2NhdGlvbiIpOworICAgfQorCisgICBpZiAocXVhbC0+ZmxhZ3MucS5leHBsaWNpdF9iaW5kaW5nICYmCisgICAgICAgdmFsaWRhdGVfYmluZGluZ19xdWFsaWZpZXIoc3RhdGUsIGxvYywgdmFyLCBxdWFsKSkgeworICAgICAgdmFyLT5kYXRhLmV4cGxpY2l0X2JpbmRpbmcgPSB0cnVlOworICAgICAgdmFyLT5kYXRhLmJpbmRpbmcgPSBxdWFsLT5iaW5kaW5nOworICAgfQorCisgICBpZiAodmFyLT50eXBlLT5jb250YWluc19hdG9taWMoKSkgeworICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtKSB7CisgICAgICAgICBpZiAodmFyLT5kYXRhLmV4cGxpY2l0X2JpbmRpbmcpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkICpvZmZzZXQgPQorICAgICAgICAgICAgICAgJnN0YXRlLT5hdG9taWNfY291bnRlcl9vZmZzZXRzW3Zhci0+ZGF0YS5iaW5kaW5nXTsKKworICAgICAgICAgICAgaWYgKCpvZmZzZXQgJSBBVE9NSUNfQ09VTlRFUl9TSVpFKQorICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzYWxpZ25lZCBhdG9taWMgY291bnRlciBvZmZzZXQiKTsKKworICAgICAgICAgICAgdmFyLT5kYXRhLmF0b21pYy5vZmZzZXQgPSAqb2Zmc2V0OworICAgICAgICAgICAgKm9mZnNldCArPSB2YXItPnR5cGUtPmF0b21pY19zaXplKCk7CisKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdG9taWMgY291bnRlcnMgcmVxdWlyZSBleHBsaWNpdCBiaW5kaW5nIHBvaW50Iik7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9mdW5jdGlvbl9pbikgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLCAiYXRvbWljIGNvdW50ZXJzIG1heSBvbmx5IGJlIGRlY2xhcmVkIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIHBhcmFtZXRlcnMgb3IgdW5pZm9ybS1xdWFsaWZpZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsIHZhcmlhYmxlcyIpOworICAgICAgfQorICAgfQorCisgICAvKiBEb2VzIHRoZSBkZWNsYXJhdGlvbiB1c2UgdGhlIGRlcHJlY2F0ZWQgJ2F0dHJpYnV0ZScgb3IgJ3ZhcnlpbmcnCisgICAgKiBrZXl3b3Jkcz8KKyAgICAqLworICAgY29uc3QgYm9vbCB1c2VzX2RlcHJlY2F0ZWRfcXVhbGlmaWVyID0gcXVhbC0+ZmxhZ3MucS5hdHRyaWJ1dGUKKyAgICAgIHx8IHF1YWwtPmZsYWdzLnEudmFyeWluZzsKKworICAgLyogSXMgdGhlICdsYXlvdXQnIGtleXdvcmQgdXNlZCB3aXRoIHBhcmFtZXRlcnMgdGhhdCBhbGxvdyByZWxheGVkIGNoZWNraW5nLgorICAgICogTWFueSBpbXBsZW1lbnRhdGlvbnMgb2YgR0xfQVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zX2VuYWJsZSBhbmQgc29tZQorICAgICogaW1wbGVtZW50YXRpb25zIChvbmx5IE1lc2E/KSBHTF9BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uX2VuYWJsZQorICAgICogYWxsb3dlZCB0aGUgbGF5b3V0IHF1YWxpZmllciB0byBiZSB1c2VkIHdpdGggJ3ZhcnlpbmcnIGFuZCAnYXR0cmlidXRlJy4KKyAgICAqIFRoZXNlIGV4dGVuc2lvbnMgYW5kIGFsbCBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB0aGF0IGFkZCB0aGUgJ2xheW91dCcKKyAgICAqIGtleXdvcmQgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIHJlcXVpcmUgdGhlIHVzZSBvZiAnaW4nIG9yICdvdXQnLgorICAgICoKKyAgICAqIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIGRvIG5vdCBhbGxvdyB0aGUgZGVwcmVjYXRlZCBrZXl3b3JkczoKKyAgICAqCisgICAgKiAgICBHTF9BTURfY29uc2VydmF0aXZlX2RlcHRoCisgICAgKiAgICBHTF9BUkJfY29uc2VydmF0aXZlX2RlcHRoCisgICAgKiAgICBHTF9BUkJfZ3B1X3NoYWRlcjUKKyAgICAqICAgIEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cworICAgICogICAgR0xfQVJCX3Rlc3NlbGF0aW9uX3NoYWRlcgorICAgICogICAgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFjazMKKyAgICAqICAgIEdMX0FSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QKKyAgICAqCisgICAgKiBJdCBpcyB1bmtub3duIHdoZXRoZXIgR0xfRVhUX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlIG9yIEdMX05WX2dwdV9zaGFkZXI1CisgICAgKiBhbGxvdyBsYXlvdXQgd2l0aCB0aGUgZGVwcmVjYXRlZCBrZXl3b3Jkcy4KKyAgICAqLworICAgY29uc3QgYm9vbCByZWxheGVkX2xheW91dF9xdWFsaWZpZXJfY2hlY2tpbmcgPQorICAgICAgc3RhdGUtPkFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uc19lbmFibGU7CisKKyAgIGlmIChxdWFsLT5oYXNfbGF5b3V0KCkgJiYgdXNlc19kZXByZWNhdGVkX3F1YWxpZmllcikgeworICAgICAgaWYgKHJlbGF4ZWRfbGF5b3V0X3F1YWxpZmllcl9jaGVja2luZykgeworICAgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImBsYXlvdXQnIHF1YWxpZmllciBtYXkgbm90IGJlIHVzZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImBhdHRyaWJ1dGUnIG9yIGB2YXJ5aW5nJyIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImBsYXlvdXQnIHF1YWxpZmllciBtYXkgbm90IGJlIHVzZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJgYXR0cmlidXRlJyBvciBgdmFyeWluZyciKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogTGF5b3V0IHF1YWxpZmllcnMgZm9yIGdsX0ZyYWdEZXB0aCwgd2hpY2ggYXJlIGVuYWJsZWQgYnkgZXh0ZW5zaW9uCisgICAgKiBBTURfY29uc2VydmF0aXZlX2RlcHRoLgorICAgICovCisgICBpbnQgZGVwdGhfbGF5b3V0X2NvdW50ID0gcXVhbC0+ZmxhZ3MucS5kZXB0aF9hbnkKKyAgICAgICsgcXVhbC0+ZmxhZ3MucS5kZXB0aF9ncmVhdGVyCisgICAgICArIHF1YWwtPmZsYWdzLnEuZGVwdGhfbGVzcworICAgICAgKyBxdWFsLT5mbGFncy5xLmRlcHRoX3VuY2hhbmdlZDsKKyAgIGlmIChkZXB0aF9sYXlvdXRfY291bnQgPiAwCisgICAgICAgJiYgIXN0YXRlLT5BTURfY29uc2VydmF0aXZlX2RlcHRoX2VuYWJsZQorICAgICAgICYmICFzdGF0ZS0+QVJCX2NvbnNlcnZhdGl2ZV9kZXB0aF9lbmFibGUpIHsKKyAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIEdMX0FNRF9jb25zZXJ2YXRpdmVfZGVwdGggb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIkdMX0FSQl9jb25zZXJ2YXRpdmVfZGVwdGggbXVzdCBiZSBlbmFibGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0byB1c2UgZGVwdGggbGF5b3V0IHF1YWxpZmllcnMiKTsKKyAgIH0gZWxzZSBpZiAoZGVwdGhfbGF5b3V0X2NvdW50ID4gMAorICAgICAgICAgICAgICAmJiBzdHJjbXAodmFyLT5uYW1lLCAiZ2xfRnJhZ0RlcHRoIikgIT0gMCkgeworICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXB0aCBsYXlvdXQgcXVhbGlmaWVycyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJnbF9GcmFnRGVwdGgiKTsKKyAgIH0gZWxzZSBpZiAoZGVwdGhfbGF5b3V0X2NvdW50ID4gMQorICAgICAgICAgICAgICAmJiBzdHJjbXAodmFyLT5uYW1lLCAiZ2xfRnJhZ0RlcHRoIikgPT0gMCkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiYXQgbW9zdCBvbmUgZGVwdGggbGF5b3V0IHF1YWxpZmllciBjYW4gYmUgYXBwbGllZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICJnbF9GcmFnRGVwdGgiKTsKKyAgIH0KKyAgIGlmIChxdWFsLT5mbGFncy5xLmRlcHRoX2FueSkKKyAgICAgIHZhci0+ZGF0YS5kZXB0aF9sYXlvdXQgPSBpcl9kZXB0aF9sYXlvdXRfYW55OworICAgZWxzZSBpZiAocXVhbC0+ZmxhZ3MucS5kZXB0aF9ncmVhdGVyKQorICAgICAgdmFyLT5kYXRhLmRlcHRoX2xheW91dCA9IGlyX2RlcHRoX2xheW91dF9ncmVhdGVyOworICAgZWxzZSBpZiAocXVhbC0+ZmxhZ3MucS5kZXB0aF9sZXNzKQorICAgICAgdmFyLT5kYXRhLmRlcHRoX2xheW91dCA9IGlyX2RlcHRoX2xheW91dF9sZXNzOworICAgZWxzZSBpZiAocXVhbC0+ZmxhZ3MucS5kZXB0aF91bmNoYW5nZWQpCisgICAgICAgdmFyLT5kYXRhLmRlcHRoX2xheW91dCA9IGlyX2RlcHRoX2xheW91dF91bmNoYW5nZWQ7CisgICBlbHNlCisgICAgICAgdmFyLT5kYXRhLmRlcHRoX2xheW91dCA9IGlyX2RlcHRoX2xheW91dF9ub25lOworCisgICBpZiAocXVhbC0+ZmxhZ3MucS5zdGQxNDAgfHwKKyAgICAgICBxdWFsLT5mbGFncy5xLnBhY2tlZCB8fAorICAgICAgIHF1YWwtPmZsYWdzLnEuc2hhcmVkKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmlmb3JtIGJsb2NrIGxheW91dCBxdWFsaWZpZXJzIHN0ZDE0MCwgcGFja2VkLCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAic2hhcmVkIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gdW5pZm9ybSBibG9ja3MsIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICJtZW1iZXJzIik7CisgICB9CisKKyAgIGlmIChxdWFsLT5mbGFncy5xLnJvd19tYWpvciB8fCBxdWFsLT5mbGFncy5xLmNvbHVtbl9tYWpvcikgeworICAgICAgdmFsaWRhdGVfbWF0cml4X2xheW91dF9mb3JfdHlwZShzdGF0ZSwgbG9jLCB2YXItPnR5cGUsIHZhcik7CisgICB9CisKKyAgIGlmICh2YXItPnR5cGUtPmNvbnRhaW5zX2ltYWdlKCkpCisgICAgICBhcHBseV9pbWFnZV9xdWFsaWZpZXJfdG9fdmFyaWFibGUocXVhbCwgdmFyLCBzdGF0ZSwgbG9jKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZhcmlhYmxlIHRoYXQgaXMgYmVpbmcgcmVkZWNsYXJlZCBieSB0aGlzIGRlY2xhcmF0aW9uCisgKgorICogU2VtYW50aWMgY2hlY2tzIHRvIHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgdGhlIHJlZGVjbGFyYXRpb24gYXJlIGFsc28KKyAqIHBlcmZvcm1lZC4gIElmIHNlbWFudGljIGNoZWNrcyBmYWlsLCBjb21waWxhdGlvbiBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgdmlhCisgKiBcYyBfbWVzYV9nbHNsX2Vycm9yLCBidXQgYSBub24tXGMgTlVMTCBwb2ludGVyIHdpbGwgc3RpbGwgYmUgcmV0dXJuZWQuCisgKgorICogXHJldHVybnMKKyAqIEEgcG9pbnRlciB0byBhbiBleGlzdGluZyB2YXJpYWJsZSBpbiB0aGUgY3VycmVudCBzY29wZSBpZiB0aGUgZGVjbGFyYXRpb24KKyAqIGlzIGEgcmVkZWNsYXJhdGlvbiwgXGMgTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpcl92YXJpYWJsZSAqCitnZXRfdmFyaWFibGVfYmVpbmdfcmVkZWNsYXJlZChpcl92YXJpYWJsZSAqdmFyLCBZWUxUWVBFIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dfYWxsX3JlZGVjbGFyYXRpb25zKQoreworICAgLyogQ2hlY2sgaWYgdGhpcyBkZWNsYXJhdGlvbiBpcyBhY3R1YWxseSBhIHJlLWRlY2xhcmF0aW9uLCBlaXRoZXIgdG8KKyAgICAqIHJlc2l6ZSBhbiBhcnJheSBvciBhZGQgcXVhbGlmaWVycyB0byBhbiBleGlzdGluZyB2YXJpYWJsZS4KKyAgICAqCisgICAgKiBUaGlzIGlzIGFsbG93ZWQgZm9yIHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzY29wZSwgb3Igd2hlbiBhdAorICAgICogZ2xvYmFsIHNjb3BlIChmb3IgYnVpbHQtaW5zIGluIHRoZSBpbXBsaWNpdCBvdXRlciBzY29wZSkuCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICplYXJsaWVyID0gc3RhdGUtPnN5bWJvbHMtPmdldF92YXJpYWJsZSh2YXItPm5hbWUpOworICAgaWYgKGVhcmxpZXIgPT0gTlVMTCB8fAorICAgICAgIChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiAhPSBOVUxMICYmCisgICAgICAgIXN0YXRlLT5zeW1ib2xzLT5uYW1lX2RlY2xhcmVkX3RoaXNfc2NvcGUodmFyLT5uYW1lKSkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisKKyAgIC8qIEZyb20gcGFnZSAyNCAocGFnZSAzMCBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWMsCisgICAgKgorICAgICogIkl0IGlzIGxlZ2FsIHRvIGRlY2xhcmUgYW4gYXJyYXkgd2l0aG91dCBhIHNpemUgYW5kIHRoZW4KKyAgICAqICBsYXRlciByZS1kZWNsYXJlIHRoZSBzYW1lIG5hbWUgYXMgYW4gYXJyYXkgb2YgdGhlIHNhbWUKKyAgICAqICB0eXBlIGFuZCBzcGVjaWZ5IGEgc2l6ZS4iCisgICAgKi8KKyAgIGlmIChlYXJsaWVyLT50eXBlLT5pc191bnNpemVkX2FycmF5KCkgJiYgdmFyLT50eXBlLT5pc19hcnJheSgpCisgICAgICAgJiYgKHZhci0+dHlwZS0+ZWxlbWVudF90eXBlKCkgPT0gZWFybGllci0+dHlwZS0+ZWxlbWVudF90eXBlKCkpKSB7CisgICAgICAvKiBGSU5JU0hNRTogVGhpcyBkb2Vzbid0IG1hdGNoIHRoZSBxdWFsaWZpZXJzIG9uIHRoZSB0d28KKyAgICAgICAqIEZJTklTSE1FOiBkZWNsYXJhdGlvbnMuICBJdCdzIG5vdCAxMDAlIGNsZWFyIHdoZXRoZXIgdGhpcyBpcworICAgICAgICogRklOSVNITUU6IHJlcXVpcmVkIG9yIG5vdC4KKyAgICAgICAqLworCisgICAgICBjb25zdCB1bnNpZ25lZCBzaXplID0gdW5zaWduZWQodmFyLT50eXBlLT5hcnJheV9zaXplKCkpOworICAgICAgY2hlY2tfYnVpbHRpbl9hcnJheV9tYXhfc2l6ZSh2YXItPm5hbWUsIHNpemUsIGxvYywgc3RhdGUpOworICAgICAgaWYgKChzaXplID4gMCkgJiYgKHNpemUgPD0gZWFybGllci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJhcnJheSBzaXplIG11c3QgYmUgPiAldSBkdWUgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicHJldmlvdXMgYWNjZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWFybGllci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzKTsKKyAgICAgIH0KKworICAgICAgZWFybGllci0+dHlwZSA9IHZhci0+dHlwZTsKKyAgICAgIGRlbGV0ZSB2YXI7CisgICAgICB2YXIgPSBOVUxMOworICAgfSBlbHNlIGlmICgoc3RhdGUtPkFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uc19lbmFibGUgfHwKKyAgICAgICAgICAgICAgc3RhdGUtPmlzX3ZlcnNpb24oMTUwLCAwKSkKKyAgICAgICAgICAgICAgJiYgc3RyY21wKHZhci0+bmFtZSwgImdsX0ZyYWdDb29yZCIpID09IDAKKyAgICAgICAgICAgICAgJiYgZWFybGllci0+dHlwZSA9PSB2YXItPnR5cGUKKyAgICAgICAgICAgICAgJiYgZWFybGllci0+ZGF0YS5tb2RlID09IHZhci0+ZGF0YS5tb2RlKSB7CisgICAgICAvKiBBbGxvdyByZWRlY2xhcmF0aW9uIG9mIGdsX0ZyYWdDb29yZCBmb3IgQVJCX2ZjYyBsYXlvdXQKKyAgICAgICAqIHF1YWxpZmllcnMuCisgICAgICAgKi8KKyAgICAgIGVhcmxpZXItPmRhdGEub3JpZ2luX3VwcGVyX2xlZnQgPSB2YXItPmRhdGEub3JpZ2luX3VwcGVyX2xlZnQ7CisgICAgICBlYXJsaWVyLT5kYXRhLnBpeGVsX2NlbnRlcl9pbnRlZ2VyID0gdmFyLT5kYXRhLnBpeGVsX2NlbnRlcl9pbnRlZ2VyOworCisgICAgICAvKiBBY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjMuNyBvZiB0aGUgR0xTTCAxLjMwIHNwZWMsCisgICAgICAgKiB0aGUgZm9sbG93aW5nIGJ1aWx0LWluIHZhcmFpYmxlcyBjYW4gYmUgcmVkZWNsYXJlZCB3aXRoIGFuCisgICAgICAgKiBpbnRlcnBvbGF0aW9uIHF1YWxpZmllcjoKKyAgICAgICAqICAgICogZ2xfRnJvbnRDb2xvcgorICAgICAgICogICAgKiBnbF9CYWNrQ29sb3IKKyAgICAgICAqICAgICogZ2xfRnJvbnRTZWNvbmRhcnlDb2xvcgorICAgICAgICogICAgKiBnbF9CYWNrU2Vjb25kYXJ5Q29sb3IKKyAgICAgICAqICAgICogZ2xfQ29sb3IKKyAgICAgICAqICAgICogZ2xfU2Vjb25kYXJ5Q29sb3IKKyAgICAgICAqLworICAgfSBlbHNlIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDApCisgICAgICAgICAgICAgICYmIChzdHJjbXAodmFyLT5uYW1lLCAiZ2xfRnJvbnRDb2xvciIpID09IDAKKyAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcCh2YXItPm5hbWUsICJnbF9CYWNrQ29sb3IiKSA9PSAwCisgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAodmFyLT5uYW1lLCAiZ2xfRnJvbnRTZWNvbmRhcnlDb2xvciIpID09IDAKKyAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcCh2YXItPm5hbWUsICJnbF9CYWNrU2Vjb25kYXJ5Q29sb3IiKSA9PSAwCisgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAodmFyLT5uYW1lLCAiZ2xfQ29sb3IiKSA9PSAwCisgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAodmFyLT5uYW1lLCAiZ2xfU2Vjb25kYXJ5Q29sb3IiKSA9PSAwKQorICAgICAgICAgICAgICAmJiBlYXJsaWVyLT50eXBlID09IHZhci0+dHlwZQorICAgICAgICAgICAgICAmJiBlYXJsaWVyLT5kYXRhLm1vZGUgPT0gdmFyLT5kYXRhLm1vZGUpIHsKKyAgICAgIGVhcmxpZXItPmRhdGEuaW50ZXJwb2xhdGlvbiA9IHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uOworCisgICAgICAvKiBMYXlvdXQgcXVhbGlmaWVycyBmb3IgZ2xfRnJhZ0RlcHRoLiAqLworICAgfSBlbHNlIGlmICgoc3RhdGUtPkFNRF9jb25zZXJ2YXRpdmVfZGVwdGhfZW5hYmxlIHx8CisgICAgICAgICAgICAgICBzdGF0ZS0+QVJCX2NvbnNlcnZhdGl2ZV9kZXB0aF9lbmFibGUpCisgICAgICAgICAgICAgICYmIHN0cmNtcCh2YXItPm5hbWUsICJnbF9GcmFnRGVwdGgiKSA9PSAwCisgICAgICAgICAgICAgICYmIGVhcmxpZXItPnR5cGUgPT0gdmFyLT50eXBlCisgICAgICAgICAgICAgICYmIGVhcmxpZXItPmRhdGEubW9kZSA9PSB2YXItPmRhdGEubW9kZSkgeworCisgICAgICAvKiogRnJvbSB0aGUgQU1EX2NvbnNlcnZhdGl2ZV9kZXB0aCBzcGVjOgorICAgICAgICogICAgIFdpdGhpbiBhbnkgc2hhZGVyLCB0aGUgZmlyc3QgcmVkZWNsYXJhdGlvbnMgb2YgZ2xfRnJhZ0RlcHRoCisgICAgICAgKiAgICAgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSB1c2Ugb2YgZ2xfRnJhZ0RlcHRoLgorICAgICAgICovCisgICAgICBpZiAoZWFybGllci0+ZGF0YS51c2VkKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGZpcnN0IHJlZGVjbGFyYXRpb24gb2YgZ2xfRnJhZ0RlcHRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYXBwZWFyIGJlZm9yZSBhbnkgdXNlIG9mIGdsX0ZyYWdEZXB0aCIpOworICAgICAgfQorCisgICAgICAvKiBQcmV2ZW50IGluY29uc2lzdGVudCByZWRlY2xhcmF0aW9uIG9mIGRlcHRoIGxheW91dCBxdWFsaWZpZXIuICovCisgICAgICBpZiAoZWFybGllci0+ZGF0YS5kZXB0aF9sYXlvdXQgIT0gaXJfZGVwdGhfbGF5b3V0X25vbmUKKyAgICAgICAgICAmJiBlYXJsaWVyLT5kYXRhLmRlcHRoX2xheW91dCAhPSB2YXItPmRhdGEuZGVwdGhfbGF5b3V0KSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfRnJhZ0RlcHRoOiBkZXB0aCBsYXlvdXQgaXMgZGVjbGFyZWQgaGVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyAnJXMsIGJ1dCBpdCB3YXMgcHJldmlvdXNseSBkZWNsYXJlZCBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfbGF5b3V0X3N0cmluZyh2YXItPmRhdGEuZGVwdGhfbGF5b3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfbGF5b3V0X3N0cmluZyhlYXJsaWVyLT5kYXRhLmRlcHRoX2xheW91dCkpOworICAgICAgfQorCisgICAgICBlYXJsaWVyLT5kYXRhLmRlcHRoX2xheW91dCA9IHZhci0+ZGF0YS5kZXB0aF9sYXlvdXQ7CisKKyAgIH0gZWxzZSBpZiAoYWxsb3dfYWxsX3JlZGVjbGFyYXRpb25zKSB7CisgICAgICBpZiAoZWFybGllci0+ZGF0YS5tb2RlICE9IHZhci0+ZGF0YS5tb2RlKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVkZWNsYXJhdGlvbiBvZiBgJXMnIHdpdGggaW5jb3JyZWN0IHF1YWxpZmllcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPm5hbWUpOworICAgICAgfSBlbHNlIGlmIChlYXJsaWVyLT50eXBlICE9IHZhci0+dHlwZSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZGVjbGFyYXRpb24gb2YgYCVzJyBoYXMgaW5jb3JyZWN0IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPm5hbWUpOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJgJXMnIHJlZGVjbGFyZWQiLCB2YXItPm5hbWUpOworICAgfQorCisgICByZXR1cm4gZWFybGllcjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgSVIgZm9yIGFuIGluaXRpYWxpemVyIGluIGEgdmFyaWFibGUgZGVjbGFyYXRpb24KKyAqLworaXJfcnZhbHVlICoKK3Byb2Nlc3NfaW5pdGlhbGl6ZXIoaXJfdmFyaWFibGUgKnZhciwgYXN0X2RlY2xhcmF0aW9uICpkZWNsLAorCQkgICAgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlICp0eXBlLAorCQkgICAgZXhlY19saXN0ICppbml0aWFsaXplcl9pbnN0cnVjdGlvbnMsCisJCSAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBpcl9ydmFsdWUgKnJlc3VsdCA9IE5VTEw7CisKKyAgIFlZTFRZUEUgaW5pdGlhbGl6ZXJfbG9jID0gZGVjbC0+aW5pdGlhbGl6ZXItPmdldF9sb2NhdGlvbigpOworCisgICAvKiBGcm9tIHBhZ2UgMjQgKHBhZ2UgMzAgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4xMCBzcGVjOgorICAgICoKKyAgICAqICAgICJBbGwgdW5pZm9ybSB2YXJpYWJsZXMgYXJlIHJlYWQtb25seSBhbmQgYXJlIGluaXRpYWxpemVkIGVpdGhlcgorICAgICogICAgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24gdmlhIEFQSSBjb21tYW5kcywgb3IgaW5kaXJlY3RseSBieQorICAgICogICAgT3BlbkdMLiIKKyAgICAqLworICAgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtKSB7CisgICAgICBzdGF0ZS0+Y2hlY2tfdmVyc2lvbigxMjAsIDAsICZpbml0aWFsaXplcl9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGluaXRpYWxpemUgdW5pZm9ybXMiKTsKKyAgIH0KKworICAgLyogRnJvbSBzZWN0aW9uIDQuMS43IG9mIHRoZSBHTFNMIDQuNDAgc3BlYzoKKyAgICAqCisgICAgKiAgICAiT3BhcXVlIHZhcmlhYmxlcyBbLi4uXSBhcmUgaW5pdGlhbGl6ZWQgb25seSB0aHJvdWdoIHRoZQorICAgICogICAgIE9wZW5HTCBBUEk7IHRoZXkgY2Fubm90IGJlIGRlY2xhcmVkIHdpdGggYW4gaW5pdGlhbGl6ZXIgaW4gYQorICAgICogICAgIHNoYWRlci4iCisgICAgKi8KKyAgIGlmICh2YXItPnR5cGUtPmNvbnRhaW5zX29wYXF1ZSgpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgaW5pdGlhbGl6ZXJfbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBpbml0aWFsaXplIG9wYXF1ZSB2YXJpYWJsZSIpOworICAgfQorCisgICBpZiAoKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4pICYmIChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGluaXRpYWxpemVyX2xvYywgc3RhdGUsCisJCSAgICAgICAiY2Fubm90IGluaXRpYWxpemUgJXMgc2hhZGVyIGlucHV0IC8gJXMiLAorCQkgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhzdGF0ZS0+c3RhZ2UpLAorCQkgICAgICAgKHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9WRVJURVgpCisJCSAgICAgICA/ICJhdHRyaWJ1dGUiIDogInZhcnlpbmciKTsKKyAgIH0KKworICAgLyogSWYgdGhlIGluaXRpYWxpemVyIGlzIGFuIGFzdF9hZ2dyZWdhdGVfaW5pdGlhbGl6ZXIsIHJlY3Vyc2l2ZWx5IHN0b3JlCisgICAgKiB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIExIUyBpbnRvIGl0LCBzbyB0aGF0IGl0cyBoaXIoKSBmdW5jdGlvbiBjYW4gZG8KKyAgICAqIHR5cGUgY2hlY2tpbmcuCisgICAgKi8KKyAgIGlmIChkZWNsLT5pbml0aWFsaXplci0+b3BlciA9PSBhc3RfYWdncmVnYXRlKQorICAgICAgX21lc2FfYXN0X3NldF9hZ2dyZWdhdGVfdHlwZSh2YXItPnR5cGUsIGRlY2wtPmluaXRpYWxpemVyKTsKKworICAgaXJfZGVyZWZlcmVuY2UgKmNvbnN0IGxocyA9IG5ldyhzdGF0ZSkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKyAgIGlyX3J2YWx1ZSAqcmhzID0gZGVjbC0+aW5pdGlhbGl6ZXItPmhpcihpbml0aWFsaXplcl9pbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudCB2YWx1ZSBpZiB0aGlzIGlzIGEgY29uc3Qgb3IgdW5pZm9ybQorICAgICogZGVjbGFyYXRpb24uCisgICAgKi8KKyAgIGlmICh0eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5jb25zdGFudAorICAgICAgIHx8IHR5cGUtPnF1YWxpZmllci5mbGFncy5xLnVuaWZvcm0pIHsKKyAgICAgIGlyX3J2YWx1ZSAqbmV3X3JocyA9IHZhbGlkYXRlX2Fzc2lnbm1lbnQoc3RhdGUsIGluaXRpYWxpemVyX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT50eXBlLCByaHMsIHRydWUpOworICAgICAgaWYgKG5ld19yaHMgIT0gTlVMTCkgeworICAgICAgICAgcmhzID0gbmV3X3JoczsKKworICAgICAgICAgaXJfY29uc3RhbnQgKmNvbnN0YW50X3ZhbHVlID0gcmhzLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisgICAgICAgICBpZiAoIWNvbnN0YW50X3ZhbHVlKSB7CisgICAgICAgICAgICAvKiBJZiBBUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIGlzIGVuYWJsZWQsIGluaXRpYWxpemVycyBvZgorICAgICAgICAgICAgICogY29uc3QtcXVhbGlmaWVkIGxvY2FsIHZhcmlhYmxlcyBkbyBub3QgaGF2ZSB0byBiZSBjb25zdGFudAorICAgICAgICAgICAgICogZXhwcmVzc2lvbnMuIENvbnN0LXF1YWxpZmllZCBnbG9iYWwgdmFyaWFibGVzIG11c3Qgc3RpbGwgYmUKKyAgICAgICAgICAgICAqIGluaXRpYWxpemVkIHdpdGggY29uc3RhbnQgZXhwcmVzc2lvbnMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2tfZW5hYmxlCisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGluaXRpYWxpemVyX2xvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXplciBvZiAlcyB2YXJpYWJsZSBgJXMnIG11c3QgYmUgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdGFudCBleHByZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUtPnF1YWxpZmllci5mbGFncy5xLmNvbnN0YW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJjb25zdCIgOiAidW5pZm9ybSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wtPmlkZW50aWZpZXIpOworICAgICAgICAgICAgICAgaWYgKHZhci0+dHlwZS0+aXNfbnVtZXJpYygpKSB7CisgICAgICAgICAgICAgICAgICAvKiBSZWR1Y2UgY2FzY2FkaW5nIGVycm9ycy4gKi8KKyAgICAgICAgICAgICAgICAgIHZhci0+Y29uc3RhbnRfdmFsdWUgPSBpcl9jb25zdGFudDo6emVybyhzdGF0ZSwgdmFyLT50eXBlKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByaHMgPSBjb25zdGFudF92YWx1ZTsKKyAgICAgICAgICAgIHZhci0+Y29uc3RhbnRfdmFsdWUgPSBjb25zdGFudF92YWx1ZTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpZiAodmFyLT50eXBlLT5pc19udW1lcmljKCkpIHsKKyAgICAgICAgICAgIC8qIFJlZHVjZSBjYXNjYWRpbmcgZXJyb3JzLiAqLworICAgICAgICAgICAgdmFyLT5jb25zdGFudF92YWx1ZSA9IGlyX2NvbnN0YW50Ojp6ZXJvKHN0YXRlLCB2YXItPnR5cGUpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBpZiAocmhzICYmICFyaHMtPnR5cGUtPmlzX2Vycm9yKCkpIHsKKyAgICAgIGJvb2wgdGVtcCA9IHZhci0+ZGF0YS5yZWFkX29ubHk7CisgICAgICBpZiAodHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEuY29uc3RhbnQpCisgICAgICAgICB2YXItPmRhdGEucmVhZF9vbmx5ID0gZmFsc2U7CisKKyAgICAgIC8qIE5ldmVyIGVtaXQgY29kZSB0byBpbml0aWFsaXplIGEgdW5pZm9ybS4KKyAgICAgICAqLworICAgICAgY29uc3QgZ2xzbF90eXBlICppbml0aWFsaXplcl90eXBlOworICAgICAgaWYgKCF0eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS51bmlmb3JtKSB7CisgICAgICAgICBkb19hc3NpZ25tZW50KGluaXRpYWxpemVyX2luc3RydWN0aW9ucywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIGxocywgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT5nZXRfbG9jYXRpb24oKSk7CisgICAgICAgICBpbml0aWFsaXplcl90eXBlID0gcmVzdWx0LT50eXBlOworICAgICAgfSBlbHNlCisgICAgICAgICBpbml0aWFsaXplcl90eXBlID0gcmhzLT50eXBlOworCisgICAgICB2YXItPmNvbnN0YW50X2luaXRpYWxpemVyID0gcmhzLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisgICAgICB2YXItPmRhdGEuaGFzX2luaXRpYWxpemVyID0gdHJ1ZTsKKworICAgICAgLyogSWYgdGhlIGRlY2xhcmVkIHZhcmlhYmxlIGlzIGFuIHVuc2l6ZWQgYXJyYXksIGl0IG11c3QgaW5oZXJyaXQKKyAgICAgICAqIGl0cyBmdWxsIHR5cGUgZnJvbSB0aGUgaW5pdGlhbGl6ZXIuICBBIGRlY2xhcmF0aW9uIHN1Y2ggYXMKKyAgICAgICAqCisgICAgICAgKiAgICAgdW5pZm9ybSBmbG9hdCBhW10gPSBmbG9hdFtdKDEuMCwgMi4wLCAzLjAsIDMuMCk7CisgICAgICAgKgorICAgICAgICogYmVjb21lcworICAgICAgICoKKyAgICAgICAqICAgICB1bmlmb3JtIGZsb2F0IGFbNF0gPSBmbG9hdFtdKDEuMCwgMi4wLCAzLjAsIDMuMCk7CisgICAgICAgKgorICAgICAgICogVGhlIGFzc2lnbm1lbnQgZ2VuZXJhdGVkIGluIHRoZSBpZi1zdGF0ZW1lbnQgKGJlbG93KSB3aWxsIGFsc28KKyAgICAgICAqIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHRoaXMgY2FzZSBmb3Igbm9uLXVuaWZvcm1zLgorICAgICAgICoKKyAgICAgICAqIElmIHRoZSBkZWNsYXJlZCB2YXJpYWJsZSBpcyBub3QgYW4gYXJyYXksIHRoZSB0eXBlcyBtdXN0CisgICAgICAgKiBhbHJlYWR5IG1hdGNoIGV4YWN0bHkuICBBcyBhIHJlc3VsdCwgdGhlIHR5cGUgYXNzaWdubWVudAorICAgICAgICogaGVyZSBjYW4gYmUgZG9uZSB1bmNvbmRpdGlvbmFsbHkuICBGb3Igbm9uLXVuaWZvcm1zIHRoZSBjYWxsCisgICAgICAgKiB0byBkb19hc3NpZ25tZW50IGNhbiBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGluaXRpYWxpemVyICh2aWEKKyAgICAgICAqIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHJ1bGVzKS4gIEZvciB1bmlmb3JtcyB0aGUgaW5pdGlhbGl6ZXIKKyAgICAgICAqIG11c3QgYmUgYSBjb25zdGFudCBleHByZXNzaW9uLCBhbmQgdGhlIHR5cGUgb2YgdGhhdCBleHByZXNzaW9uCisgICAgICAgKiB3YXMgdmFsaWRhdGVkIGFib3ZlLgorICAgICAgICovCisgICAgICB2YXItPnR5cGUgPSBpbml0aWFsaXplcl90eXBlOworCisgICAgICB2YXItPmRhdGEucmVhZF9vbmx5ID0gdGVtcDsKKyAgIH0KKworICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIERvIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBuZWNlc3NhcnkgZm9yIGdlb21ldHJ5IHNoYWRlciBpbnB1dCBkZWNsYXJhdGlvbnMKKyAqICh0aGlzIGNvdmVycyBib3RoIGludGVyZmFjZSBibG9ja3MgYXJyYXlzIGFuZCBiYXJlIGlucHV0IHZhcmlhYmxlcykuCisgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfZ2VvbWV0cnlfc2hhZGVyX2lucHV0X2RlY2woc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZTFRZUEUgbG9jLCBpcl92YXJpYWJsZSAqdmFyKQoreworICAgdW5zaWduZWQgbnVtX3ZlcnRpY2VzID0gMDsKKyAgIGlmIChzdGF0ZS0+Z3NfaW5wdXRfcHJpbV90eXBlX3NwZWNpZmllZCkgeworICAgICAgbnVtX3ZlcnRpY2VzID0gdmVydGljZXNfcGVyX3ByaW0oc3RhdGUtPmluX3F1YWxpZmllci0+cHJpbV90eXBlKTsKKyAgIH0KKworICAgLyogR2VvbWV0cnkgc2hhZGVyIGlucHV0IHZhcmlhYmxlcyBtdXN0IGJlIGFycmF5cy4gIENhbGxlciBzaG91bGQgaGF2ZQorICAgICogcmVwb3J0ZWQgYW4gZXJyb3IgZm9yIHRoaXMuCisgICAgKi8KKyAgIGlmICghdmFyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICBhc3NlcnQoc3RhdGUtPmVycm9yKTsKKworICAgICAgLyogVG8gYXZvaWQgY2FzY2FkaW5nIGZhaWx1cmVzLCBzaG9ydCBjaXJjdWl0IHRoZSBjaGVja3MgYmVsb3cuICovCisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICh2YXItPnR5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkgeworICAgICAgLyogU2VjdGlvbiA0LjMuOC4xIChJbnB1dCBMYXlvdXQgUXVhbGlmaWVycykgb2YgdGhlIEdMU0wgMS41MCBzcGVjIHNheXM6CisgICAgICAgKgorICAgICAgICogICBBbGwgZ2VvbWV0cnkgc2hhZGVyIGlucHV0IHVuc2l6ZWQgYXJyYXkgZGVjbGFyYXRpb25zIHdpbGwgYmUKKyAgICAgICAqICAgc2l6ZWQgYnkgYW4gZWFybGllciBpbnB1dCBsYXlvdXQgcXVhbGlmaWVyLCB3aGVuIHByZXNlbnQsIGFzIHBlcgorICAgICAgICogICB0aGUgZm9sbG93aW5nIHRhYmxlLgorICAgICAgICoKKyAgICAgICAqIEZvbGxvd2VkIGJ5IGEgdGFibGUgbWFwcGluZyBlYWNoIGFsbG93ZWQgaW5wdXQgbGF5b3V0IHF1YWxpZmllciB0bworICAgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgbGVuZ3RoLgorICAgICAgICovCisgICAgICBpZiAobnVtX3ZlcnRpY2VzICE9IDApCisgICAgICAgICB2YXItPnR5cGUgPSBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZSh2YXItPnR5cGUtPmZpZWxkcy5hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92ZXJ0aWNlcyk7CisgICB9IGVsc2UgeworICAgICAgLyogU2VjdGlvbiA0LjMuOC4xIChJbnB1dCBMYXlvdXQgUXVhbGlmaWVycykgb2YgdGhlIEdMU0wgMS41MCBzcGVjCisgICAgICAgKiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIG9mIGNvbXBpbGUtdGltZSBlcnJvcnM6CisgICAgICAgKgorICAgICAgICogICAvLyBjb2RlIHNlcXVlbmNlIHdpdGhpbiBvbmUgc2hhZGVyLi4uCisgICAgICAgKiAgIGluIHZlYzQgQ29sb3IxW107ICAgIC8vIHNpemUgdW5rbm93bgorICAgICAgICogICAuLi5Db2xvcjEubGVuZ3RoKCkuLi4vLyBpbGxlZ2FsLCBsZW5ndGgoKSB1bmtub3duCisgICAgICAgKiAgIGluIHZlYzQgQ29sb3IyWzJdOyAgIC8vIHNpemUgaXMgMgorICAgICAgICogICAuLi5Db2xvcjEubGVuZ3RoKCkuLi4vLyBpbGxlZ2FsLCBDb2xvcjEgc3RpbGwgaGFzIG5vIHNpemUKKyAgICAgICAqICAgaW4gdmVjNCBDb2xvcjNbM107ICAgLy8gaWxsZWdhbCwgaW5wdXQgc2l6ZXMgYXJlIGluY29uc2lzdGVudAorICAgICAgICogICBsYXlvdXQobGluZXMpIGluOyAgICAvLyBsZWdhbCwgaW5wdXQgc2l6ZSBpcyAyLCBtYXRjaGluZworICAgICAgICogICBpbiB2ZWM0IENvbG9yNFszXTsgICAvLyBpbGxlZ2FsLCBjb250cmFkaWN0cyBsYXlvdXQKKyAgICAgICAqICAgLi4uCisgICAgICAgKgorICAgICAgICogVG8gZGV0ZWN0IHRoZSBjYXNlIGlsbHVzdHJhdGVkIGJ5IENvbG9yMywgd2UgdmVyaWZ5IHRoYXQgdGhlIHNpemUgb2YKKyAgICAgICAqIGFuIGV4cGxpY2l0bHktc2l6ZWQgYXJyYXkgbWF0Y2hlcyB0aGUgc2l6ZSBvZiBhbnkgcHJldmlvdXNseSBkZWNsYXJlZAorICAgICAgICogZXhwbGljaXRseS1zaXplZCBhcnJheS4gIFRvIGRldGVjdCB0aGUgY2FzZSBpbGx1c3RyYXRlZCBieSBDb2xvcjQsIHdlCisgICAgICAgKiB2ZXJpZnkgdGhhdCB0aGUgc2l6ZSBvZiBhbiBleHBsaWNpdGx5LXNpemVkIGFycmF5IGlzIGNvbnNpc3RlbnQgd2l0aAorICAgICAgICogYW55IHByZXZpb3VzbHkgZGVjbGFyZWQgaW5wdXQgbGF5b3V0LgorICAgICAgICovCisgICAgICBpZiAobnVtX3ZlcnRpY2VzICE9IDAgJiYgdmFyLT50eXBlLT5sZW5ndGggIT0gbnVtX3ZlcnRpY2VzKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VvbWV0cnkgc2hhZGVyIGlucHV0IHNpemUgY29udHJhZGljdHMgcHJldmlvdXNseSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkZWNsYXJlZCBsYXlvdXQgKHNpemUgaXMgJXUsIGJ1dCBsYXlvdXQgcmVxdWlyZXMgYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzaXplIG9mICV1KSIsIHZhci0+dHlwZS0+bGVuZ3RoLCBudW1fdmVydGljZXMpOworICAgICAgfSBlbHNlIGlmIChzdGF0ZS0+Z3NfaW5wdXRfc2l6ZSAhPSAwICYmCisgICAgICAgICAgICAgICAgIHZhci0+dHlwZS0+bGVuZ3RoICE9IHN0YXRlLT5nc19pbnB1dF9zaXplKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VvbWV0cnkgc2hhZGVyIGlucHV0IHNpemVzIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgKHNpemUgaXMgJXUsIGJ1dCBhIHByZXZpb3VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY2xhcmF0aW9uIGhhcyBzaXplICV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dHlwZS0+bGVuZ3RoLCBzdGF0ZS0+Z3NfaW5wdXRfc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgc3RhdGUtPmdzX2lucHV0X3NpemUgPSB2YXItPnR5cGUtPmxlbmd0aDsKKyAgICAgIH0KKyAgIH0KK30KKworCit2b2lkCit2YWxpZGF0ZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsIFlZTFRZUEUgbG9jLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICAvKiBGcm9tIHBhZ2UgMTUgKHBhZ2UgMjEgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4xMCBzcGVjLAorICAgICoKKyAgICAqICAgIklkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGggImdsXyIgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkKKyAgICAqICAgT3BlbkdMLCBhbmQgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBhIHNoYWRlciBhcyBlaXRoZXIgYQorICAgICogICB2YXJpYWJsZSBvciBhIGZ1bmN0aW9uLiIKKyAgICAqLworICAgaWYgKHN0cm5jbXAoaWRlbnRpZmllciwgImdsXyIsIDMpID09IDApIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGlmaWVyIGAlcycgdXNlcyByZXNlcnZlZCBgZ2xfJyBwcmVmaXgiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyKTsKKyAgIH0gZWxzZSBpZiAoc3Ryc3RyKGlkZW50aWZpZXIsICJfXyIpKSB7CisgICAgICAvKiBGcm9tIHBhZ2UgMTQgKHBhZ2UgMjAgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4xMAorICAgICAgICogc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAgIkluIGFkZGl0aW9uLCBhbGwgaWRlbnRpZmllcnMgY29udGFpbmluZyB0d28KKyAgICAgICAqICAgICAgY29uc2VjdXRpdmUgdW5kZXJzY29yZXMgKF9fKSBhcmUgcmVzZXJ2ZWQgYXMKKyAgICAgICAqICAgICAgcG9zc2libGUgZnV0dXJlIGtleXdvcmRzLiIKKyAgICAgICAqCisgICAgICAgKiBUaGUgaW50ZW50aW9uIGlzIHRoYXQgbmFtZXMgY29udGFpbmluZyBfXyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsCisgICAgICAgKiB1c2UgYnkgdGhlIGltcGxlbWVudGF0aW9uLCBhbmQgbmFtZXMgcHJlZml4ZWQgd2l0aCBHTF8gYXJlIHJlc2VydmVkCisgICAgICAgKiBmb3IgdXNlIGJ5IEtocm9ub3MuICBOYW1lcyBzaW1wbHkgY29udGFpbmluZyBfXyBhcmUgZGFuZ2Vyb3VzIHRvIHVzZSwKKyAgICAgICAqIGJ1dCBzaG91bGQgYmUgYWxsb3dlZC4KKyAgICAgICAqCisgICAgICAgKiBBIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBHTFNMIHNwZWNpZmljYXRpb24gd2lsbCBjbGFyaWZ5IHRoaXMuCisgICAgICAgKi8KKyAgICAgIF9tZXNhX2dsc2xfd2FybmluZygmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpZmllciBgJXMnIHVzZXMgcmVzZXJ2ZWQgYF9fJyBzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIpOworICAgfQorfQorCisKK2lyX3J2YWx1ZSAqCithc3RfZGVjbGFyYXRvcl9saXN0OjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICpkZWNsX3R5cGU7CisgICBjb25zdCBjaGFyICp0eXBlX25hbWUgPSBOVUxMOworICAgaXJfcnZhbHVlICpyZXN1bHQgPSBOVUxMOworICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKworICAgLyogRnJvbSBwYWdlIDQ2IChwYWdlIDUyIG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuNTAgc3BlYzoKKyAgICAqCisgICAgKiAgICAgIlRvIGVuc3VyZSB0aGF0IGEgcGFydGljdWxhciBvdXRwdXQgdmFyaWFibGUgaXMgaW52YXJpYW50LCBpdCBpcworICAgICogICAgIG5lY2Vzc2FyeSB0byB1c2UgdGhlIGludmFyaWFudCBxdWFsaWZpZXIuIEl0IGNhbiBlaXRoZXIgYmUgdXNlZCB0bworICAgICogICAgIHF1YWxpZnkgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHZhcmlhYmxlIGFzIGJlaW5nIGludmFyaWFudAorICAgICoKKyAgICAqICAgICAgICAgaW52YXJpYW50IGdsX1Bvc2l0aW9uOyAvLyBtYWtlIGV4aXN0aW5nIGdsX1Bvc2l0aW9uIGJlIGludmFyaWFudCIKKyAgICAqCisgICAgKiBJbiB0aGVzZSBjYXNlcyB0aGUgcGFyc2VyIHdpbGwgc2V0IHRoZSAnaW52YXJpYW50JyBmbGFnIGluIHRoZSBkZWNsYXJhdG9yCisgICAgKiBsaXN0LCBhbmQgdGhlIHR5cGUgd2lsbCBiZSBOVUxMLgorICAgICovCisgICBpZiAodGhpcy0+aW52YXJpYW50KSB7CisgICAgICBhc3NlcnQodGhpcy0+dHlwZSA9PSBOVUxMKTsKKworICAgICAgaWYgKHN0YXRlLT5jdXJyZW50X2Z1bmN0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIHVzZXMgb2YgYGludmFyaWFudCcga2V5d29yZCBtdXN0IGJlIGF0IGdsb2JhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29wZSIpOworICAgICAgfQorCisgICAgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9kZWNsYXJhdGlvbiwgZGVjbCwgbGluaywgJnRoaXMtPmRlY2xhcmF0aW9ucykgeworICAgICAgICAgYXNzZXJ0KGRlY2wtPmFycmF5X3NwZWNpZmllciA9PSBOVUxMKTsKKyAgICAgICAgIGFzc2VydChkZWNsLT5pbml0aWFsaXplciA9PSBOVUxMKTsKKworICAgICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IGVhcmxpZXIgPQorICAgICAgICAgICAgc3RhdGUtPnN5bWJvbHMtPmdldF92YXJpYWJsZShkZWNsLT5pZGVudGlmaWVyKTsKKyAgICAgICAgIGlmIChlYXJsaWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZWNsYXJlZCB2YXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBtYXJrZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YXJpYW50IiwgZGVjbC0+aWRlbnRpZmllcik7CisgICAgICAgICB9IGVsc2UgaWYgKCFpc192YXJ5aW5nX3ZhcihlYXJsaWVyLCBzdGF0ZS0+c3RhZ2UpKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYCVzJyBjYW5ub3QgYmUgbWFya2VkIGludmFyaWFudDsgaW50ZXJmYWNlcyBiZXR3ZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoYWRlciBzdGFnZXMgb25seS4iLCBkZWNsLT5pZGVudGlmaWVyKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoZWFybGllci0+ZGF0YS51c2VkKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFibGUgYCVzJyBtYXkgbm90IGJlIHJlZGVjbGFyZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJgaW52YXJpYW50JyBhZnRlciBiZWluZyB1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXJsaWVyLT5uYW1lKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlYXJsaWVyLT5kYXRhLmludmFyaWFudCA9IHRydWU7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIEludmFyaWFudCByZWRlY2xhcmF0aW9ucyBkbyBub3QgaGF2ZSByLXZhbHVlcy4KKyAgICAgICAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGFzc2VydCh0aGlzLT50eXBlICE9IE5VTEwpOworICAgYXNzZXJ0KCF0aGlzLT5pbnZhcmlhbnQpOworCisgICAvKiBUaGUgdHlwZSBzcGVjaWZpZXIgbWF5IGNvbnRhaW4gYSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gIFByb2Nlc3MgdGhhdAorICAgICogYmVmb3JlIGFueSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb25zLgorICAgICovCisgICAodm9pZCkgdGhpcy0+dHlwZS0+c3BlY2lmaWVyLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgIGRlY2xfdHlwZSA9IHRoaXMtPnR5cGUtPmdsc2xfdHlwZSgmIHR5cGVfbmFtZSwgc3RhdGUpOworCisgICAvKiBBbiBvZmZzZXQtcXVhbGlmaWVkIGF0b21pYyBjb3VudGVyIGRlY2xhcmF0aW9uIHNldHMgdGhlIGRlZmF1bHQKKyAgICAqIG9mZnNldCBmb3IgdGhlIG5leHQgZGVjbGFyYXRpb24gd2l0aGluIHRoZSBzYW1lIGF0b21pYyBjb3VudGVyCisgICAgKiBidWZmZXIuCisgICAgKi8KKyAgIGlmIChkZWNsX3R5cGUgJiYgZGVjbF90eXBlLT5jb250YWluc19hdG9taWMoKSkgeworICAgICAgaWYgKHR5cGUtPnF1YWxpZmllci5mbGFncy5xLmV4cGxpY2l0X2JpbmRpbmcgJiYKKyAgICAgICAgICB0eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5leHBsaWNpdF9vZmZzZXQpCisgICAgICAgICBzdGF0ZS0+YXRvbWljX2NvdW50ZXJfb2Zmc2V0c1t0eXBlLT5xdWFsaWZpZXIuYmluZGluZ10gPQorICAgICAgICAgICAgdHlwZS0+cXVhbGlmaWVyLm9mZnNldDsKKyAgIH0KKworICAgaWYgKHRoaXMtPmRlY2xhcmF0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICAvKiBJZiB0aGVyZSBpcyBubyBzdHJ1Y3R1cmUgaW52b2x2ZWQgaW4gdGhlIHByb2dyYW0gdGV4dCwgdGhlcmUgYXJlIHR3bworICAgICAgICogcG9zc2libGUgc2NlbmFyaW9zOgorICAgICAgICoKKyAgICAgICAqIC0gVGhlIHByb2dyYW0gdGV4dCBjb250YWluZWQgc29tZXRoaW5nIGxpa2UgJ3ZlYzQ7Jy4gIFRoaXMgaXMgYW4KKyAgICAgICAqICAgZW1wdHkgZGVjbGFyYXRpb24uICBJdCBpcyB2YWxpZCBidXQgd2VpcmQuICBFbWl0IGEgd2FybmluZy4KKyAgICAgICAqCisgICAgICAgKiAtIFRoZSBwcm9ncmFtIHRleHQgY29udGFpbmVkIHNvbWV0aGluZyBsaWtlICdTOycgYW5kICdTJyBpcyBub3QgdGhlCisgICAgICAgKiAgIG5hbWUgb2YgYSBrbm93biBzdHJ1Y3R1cmUgdHlwZS4gIFRoaXMgaXMgYm90aCBpbnZhbGlkIGFuZCB3ZWlyZC4KKyAgICAgICAqICAgRW1pdCBhbiBlcnJvci4KKyAgICAgICAqCisgICAgICAgKiAtIFRoZSBwcm9ncmFtIHRleHQgY29udGFpbmVkIHNvbWV0aGluZyBsaWtlICdtZWRpdW1wIGZsb2F0OycKKyAgICAgICAqICAgd2hlbiB0aGUgcHJvZ3JhbW1lciBwcm9iYWJseSBtZWFudCAncHJlY2lzaW9uIG1lZGl1bXAKKyAgICAgICAqICAgZmxvYXQ7JyBFbWl0IGEgd2FybmluZyB3aXRoIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGV5CisgICAgICAgKiAgIHByb2JhYmx5IG1lYW50IHRvIGRvLgorICAgICAgICoKKyAgICAgICAqIE5vdGUgdGhhdCBpZiBkZWNsX3R5cGUgaXMgTlVMTCBhbmQgdGhlcmUgaXMgYSBzdHJ1Y3R1cmUgaW52b2x2ZWQsCisgICAgICAgKiB0aGVyZSBtdXN0IGhhdmUgYmVlbiBzb21lIHNvcnQgb2YgZXJyb3Igd2l0aCB0aGUgc3RydWN0dXJlLiAgSW4gdGhpcworICAgICAgICogY2FzZSB3ZSBhc3N1bWUgdGhhdCBhbiBlcnJvciB3YXMgYWxyZWFkeSBnZW5lcmF0ZWQgb24gdGhpcyBsaW5lIG9mCisgICAgICAgKiBjb2RlIGZvciB0aGUgc3RydWN0dXJlLiAgVGhlcmUgaXMgbm8gbmVlZCB0byBnZW5lcmF0ZSBhbiBhZGRpdGlvbmFsLAorICAgICAgICogY29uZnVzaW5nIGVycm9yLgorICAgICAgICovCisgICAgICBhc3NlcnQodGhpcy0+dHlwZS0+c3BlY2lmaWVyLT5zdHJ1Y3R1cmUgPT0gTlVMTCB8fCBkZWNsX3R5cGUgIT0gTlVMTAorCSAgICAgfHwgc3RhdGUtPmVycm9yKTsKKworICAgICAgaWYgKGRlY2xfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0eXBlIGAlcycgaW4gZW1wdHkgZGVjbGFyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUpOworICAgICAgfSBlbHNlIGlmIChkZWNsX3R5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQVRPTUlDX1VJTlQpIHsKKyAgICAgICAgIC8qIEVtcHR5IGF0b21pYyBjb3VudGVyIGRlY2xhcmF0aW9ucyBhcmUgYWxsb3dlZCBhbmQgdXNlZnVsCisgICAgICAgICAgKiB0byBzZXQgdGhlIGRlZmF1bHQgb2Zmc2V0IHF1YWxpZmllci4KKyAgICAgICAgICAqLworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9IGVsc2UgaWYgKHRoaXMtPnR5cGUtPnF1YWxpZmllci5wcmVjaXNpb24gIT0gYXN0X3ByZWNpc2lvbl9ub25lKSB7CisgICAgICAgICBpZiAodGhpcy0+dHlwZS0+c3BlY2lmaWVyLT5zdHJ1Y3R1cmUgIT0gTlVMTCkgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpc2lvbiBxdWFsaWZpZXJzIGNhbid0IGJlIGFwcGxpZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gc3RydWN0dXJlcyIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwcmVjaXNpb25fbmFtZXNbXSA9IHsKKyAgICAgICAgICAgICAgICJoaWdocCIsCisgICAgICAgICAgICAgICAiaGlnaHAiLAorICAgICAgICAgICAgICAgIm1lZGl1bXAiLAorICAgICAgICAgICAgICAgImxvd3AiCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBfbWVzYV9nbHNsX3dhcm5pbmcoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtcHR5IGRlY2xhcmF0aW9uIHdpdGggcHJlY2lzaW9uIHF1YWxpZmllciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBzZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uLCB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJgcHJlY2lzaW9uICVzICVzOyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbl9uYW1lc1t0aGlzLT50eXBlLT5xdWFsaWZpZXIucHJlY2lzaW9uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0aGlzLT50eXBlLT5zcGVjaWZpZXItPnN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgICBfbWVzYV9nbHNsX3dhcm5pbmcoJmxvYywgc3RhdGUsICJlbXB0eSBkZWNsYXJhdGlvbiIpOworICAgICAgfQorICAgfQorCisgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9kZWNsYXJhdGlvbiwgZGVjbCwgbGluaywgJnRoaXMtPmRlY2xhcmF0aW9ucykgeworICAgICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdmFyX3R5cGU7CisgICAgICBpcl92YXJpYWJsZSAqdmFyOworCisgICAgICAvKiBGSU5JU0hNRTogRW1pdCBhIHdhcm5pbmcgaWYgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzaGFkb3dzIGEKKyAgICAgICAqIEZJTklTSE1FOiBkZWNsYXJhdGlvbiBhdCBhIGhpZ2hlciBzY29wZS4KKyAgICAgICAqLworCisgICAgICBpZiAoKGRlY2xfdHlwZSA9PSBOVUxMKSB8fCBkZWNsX3R5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICAgaWYgKHR5cGVfbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdHlwZSBgJXMnIGluIGRlY2xhcmF0aW9uIG9mIGAlcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsIGRlY2wtPmlkZW50aWZpZXIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0eXBlIGluIGRlY2xhcmF0aW9uIG9mIGAlcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsLT5pZGVudGlmaWVyKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXJfdHlwZSA9IHByb2Nlc3NfYXJyYXlfdHlwZSgmbG9jLCBkZWNsX3R5cGUsIGRlY2wtPmFycmF5X3NwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKworICAgICAgdmFyID0gbmV3KGN0eCkgaXJfdmFyaWFibGUodmFyX3R5cGUsIGRlY2wtPmlkZW50aWZpZXIsIGlyX3Zhcl9hdXRvKTsKKworICAgICAgLyogVGhlICd2YXJ5aW5nIGluJyBhbmQgJ3Zhcnlpbmcgb3V0JyBxdWFsaWZpZXJzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aAorICAgICAgICogQVJCX2dlb21ldHJ5X3NoYWRlcjQgYW5kIEVYVF9nZW9tZXRyeV9zaGFkZXI0LCB3aGljaCB3ZSBkb24ndCBzdXBwb3J0CisgICAgICAgKiB5ZXQuCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS52YXJ5aW5nKSB7CisgICAgICAgICBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEuaW4pIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYHZhcnlpbmcgaW4nIHF1YWxpZmllciBpbiBkZWNsYXJhdGlvbiBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJgJXMnIG9ubHkgdmFsaWQgZm9yIGdlb21ldHJ5IHNoYWRlcnMgdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVJCX2dlb21ldHJ5X3NoYWRlcjQgb3IgRVhUX2dlb21ldHJ5X3NoYWRlcjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsLT5pZGVudGlmaWVyKTsKKyAgICAgICAgIH0gZWxzZSBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEub3V0KSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImB2YXJ5aW5nIG91dCcgcXVhbGlmaWVyIGluIGRlY2xhcmF0aW9uIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImAlcycgb25seSB2YWxpZCBmb3IgZ2VvbWV0cnkgc2hhZGVycyB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUkJfZ2VvbWV0cnlfc2hhZGVyNCBvciBFWFRfZ2VvbWV0cnlfc2hhZGVyNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wtPmlkZW50aWZpZXIpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBGcm9tIHBhZ2UgMjIgKHBhZ2UgMjggb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4xMCBzcGVjaWZpY2F0aW9uOworICAgICAgICoKKyAgICAgICAqICAgICAiR2xvYmFsIHZhcmlhYmxlcyBjYW4gb25seSB1c2UgdGhlIHF1YWxpZmllcnMgY29uc3QsCisgICAgICAgKiAgICAgYXR0cmlidXRlLCB1bmlmb3JtLCBvciB2YXJ5aW5nLiBPbmx5IG9uZSBtYXkgYmUKKyAgICAgICAqICAgICBzcGVjaWZpZWQuCisgICAgICAgKgorICAgICAgICogICAgIExvY2FsIHZhcmlhYmxlcyBjYW4gb25seSB1c2UgdGhlIHF1YWxpZmllciBjb25zdC4iCisgICAgICAgKgorICAgICAgICogVGhpcyBpcyByZWxheGVkIGluIEdMU0wgMS4zMCBhbmQgR0xTTCBFUyAzLjAwLiAgSXQgaXMgYWxzbyByZWxheGVkIGJ5CisgICAgICAgKiBhbnkgZXh0ZW5zaW9uIHRoYXQgYWRkcyB0aGUgJ2xheW91dCcga2V5d29yZC4KKyAgICAgICAqLworICAgICAgaWYgKCFzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDMwMCkKKyAgICAgICAgICAmJiAhc3RhdGUtPmhhc19leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24oKQorICAgICAgICAgICYmICFzdGF0ZS0+aGFzX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzKCkKKyAgICAgICAgICAmJiAhc3RhdGUtPkFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uc19lbmFibGUpIHsKKyAgICAgICAgIGlmICh0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5vdXQpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYG91dCcgcXVhbGlmaWVyIGluIGRlY2xhcmF0aW9uIG9mIGAlcycgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSB2YWxpZCBmb3IgZnVuY3Rpb24gcGFyYW1ldGVycyBpbiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wtPmlkZW50aWZpZXIsIHN0YXRlLT5nZXRfdmVyc2lvbl9zdHJpbmcoKSk7CisgICAgICAgICB9CisgICAgICAgICBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEuaW4pIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYGluJyBxdWFsaWZpZXIgaW4gZGVjbGFyYXRpb24gb2YgYCVzJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC0+aWRlbnRpZmllciwgc3RhdGUtPmdldF92ZXJzaW9uX3N0cmluZygpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIC8qIEZJTklTSE1FOiBUZXN0IGZvciBvdGhlciBpbnZhbGlkIHF1YWxpZmllcnMuICovCisgICAgICB9CisKKyAgICAgIGFwcGx5X3R5cGVfcXVhbGlmaWVyX3RvX3ZhcmlhYmxlKCYgdGhpcy0+dHlwZS0+cXVhbGlmaWVyLCB2YXIsIHN0YXRlLAorCQkJCSAgICAgICAmIGxvYywgZmFsc2UpOworCisgICAgICBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEuaW52YXJpYW50KSB7CisgICAgICAgICBpZiAoIWlzX3ZhcnlpbmdfdmFyKHZhciwgc3RhdGUtPnN0YWdlKSkgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImAlcycgY2Fubm90IGJlIG1hcmtlZCBpbnZhcmlhbnQ7IGludGVyZmFjZXMgYmV0d2VlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGFkZXIgc3RhZ2VzIG9ubHkiLCB2YXItPm5hbWUpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24gIT0gTlVMTCkgeworICAgICAgICAgY29uc3QgY2hhciAqbW9kZSA9IE5VTEw7CisgICAgICAgICBjb25zdCBjaGFyICpleHRyYSA9ICIiOworCisgICAgICAgICAvKiBUaGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGZvciAnaW5vdXQnIGhlcmUgYmVjYXVzZSB0aGUgcGFyc2VyIHdpbGwKKyAgICAgICAgICAqIG9ubHkgYWxsb3cgdGhhdCBpbiBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdHMuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmICh0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5hdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIG1vZGUgPSAiYXR0cmlidXRlIjsKKyAgICAgICAgIH0gZWxzZSBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEudW5pZm9ybSkgeworICAgICAgICAgICAgbW9kZSA9ICJ1bmlmb3JtIjsKKyAgICAgICAgIH0gZWxzZSBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEudmFyeWluZykgeworICAgICAgICAgICAgbW9kZSA9ICJ2YXJ5aW5nIjsKKyAgICAgICAgIH0gZWxzZSBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEuaW4pIHsKKyAgICAgICAgICAgIG1vZGUgPSAiaW4iOworICAgICAgICAgICAgZXh0cmEgPSAiIG9yIGluIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0IjsKKyAgICAgICAgIH0gZWxzZSBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEub3V0KSB7CisgICAgICAgICAgICBtb2RlID0gIm91dCI7CisgICAgICAgICAgICBleHRyYSA9ICIgb3IgaW4gZnVuY3Rpb24gcGFyYW1ldGVyIGxpc3QiOworICAgICAgICAgfQorCisgICAgICAgICBpZiAobW9kZSkgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyB2YXJpYWJsZSBgJXMnIG11c3QgYmUgZGVjbGFyZWQgYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsIHNjb3BlJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCB2YXItPm5hbWUsIGV4dHJhKTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbikgeworICAgICAgICAgdmFyLT5kYXRhLnJlYWRfb25seSA9IHRydWU7CisKKyAgICAgICAgIGlmIChzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfVkVSVEVYKSB7CisgICAgICAgICAgICBib29sIGVycm9yX2VtaXR0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLyogRnJvbSBwYWdlIDMxIChwYWdlIDM3IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuNTAgc3BlYzoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgICAiVmVydGV4IHNoYWRlciBpbnB1dHMgY2FuIG9ubHkgYmUgZmxvYXQsIGZsb2F0aW5nLXBvaW50CisgICAgICAgICAgICAgKiAgICB2ZWN0b3JzLCBtYXRyaWNlcywgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycyBhbmQgaW50ZWdlcgorICAgICAgICAgICAgICogICAgdmVjdG9ycy4gVmVydGV4IHNoYWRlciBpbnB1dHMgY2FuIGFsc28gZm9ybSBhcnJheXMgb2YgdGhlc2UKKyAgICAgICAgICAgICAqICAgIHR5cGVzLCBidXQgbm90IHN0cnVjdHVyZXMuIgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEZyb20gcGFnZSAzMSAocGFnZSAyNyBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjMwIHNwZWM6CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICAgIlZlcnRleCBzaGFkZXIgaW5wdXRzIGNhbiBvbmx5IGJlIGZsb2F0LCBmbG9hdGluZy1wb2ludAorICAgICAgICAgICAgICogICAgdmVjdG9ycywgbWF0cmljZXMsIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlcnMgYW5kIGludGVnZXIKKyAgICAgICAgICAgICAqICAgIHZlY3RvcnMuIFRoZXkgY2Fubm90IGJlIGFycmF5cyBvciBzdHJ1Y3R1cmVzLiIKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGcm9tIHBhZ2UgMjMgKHBhZ2UgMjkgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4yMCBzcGVjOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICJUaGUgYXR0cmlidXRlIHF1YWxpZmllciBjYW4gYmUgdXNlZCBvbmx5IHdpdGggZmxvYXQsCisgICAgICAgICAgICAgKiAgICBmbG9hdGluZy1wb2ludCB2ZWN0b3JzLCBhbmQgbWF0cmljZXMuIEF0dHJpYnV0ZSB2YXJpYWJsZXMKKyAgICAgICAgICAgICAqICAgIGNhbm5vdCBiZSBkZWNsYXJlZCBhcyBhcnJheXMgb3Igc3RydWN0dXJlcy4iCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogRnJvbSBwYWdlIDMzIChwYWdlIDM5IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgICAiVmVydGV4IHNoYWRlciBpbnB1dHMgY2FuIG9ubHkgYmUgZmxvYXQsIGZsb2F0aW5nLXBvaW50CisgICAgICAgICAgICAgKiAgICB2ZWN0b3JzLCBtYXRyaWNlcywgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycyBhbmQgaW50ZWdlcgorICAgICAgICAgICAgICogICAgdmVjdG9ycy4gVmVydGV4IHNoYWRlciBpbnB1dHMgY2Fubm90IGJlIGFycmF5cyBvcgorICAgICAgICAgICAgICogICAgc3RydWN0dXJlcy4iCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY2hlY2tfdHlwZSA9IHZhci0+dHlwZTsKKyAgICAgICAgICAgIHdoaWxlIChjaGVja190eXBlLT5pc19hcnJheSgpKQorICAgICAgICAgICAgICAgY2hlY2tfdHlwZSA9IGNoZWNrX3R5cGUtPmVsZW1lbnRfdHlwZSgpOworCisgICAgICAgICAgICBzd2l0Y2ggKGNoZWNrX3R5cGUtPmJhc2VfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICAgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmlzX3ZlcnNpb24oMTIwLCAzMDApKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydGV4IHNoYWRlciBpbnB1dCAvIGF0dHJpYnV0ZSBjYW5ub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICVzYCVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dHlwZS0+aXNfYXJyYXkoKSA/ICJhcnJheSBvZiAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3R5cGUtPm5hbWUpOworICAgICAgICAgICAgICAgZXJyb3JfZW1pdHRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZXJyb3JfZW1pdHRlZCAmJiB2YXItPnR5cGUtPmlzX2FycmF5KCkgJiYKKyAgICAgICAgICAgICAgICAhc3RhdGUtPmNoZWNrX3ZlcnNpb24oMTUwLCAwLCAmbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVydGV4IHNoYWRlciBpbnB1dCAvIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgaGF2ZSBhcnJheSB0eXBlIikpIHsKKyAgICAgICAgICAgICAgIGVycm9yX2VtaXR0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlkpIHsKKyAgICAgICAgICAgIC8qIEZyb20gc2VjdGlvbiA0LjMuNCAoSW5wdXRzKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICAgIEdlb21ldHJ5IHNoYWRlciBpbnB1dCB2YXJpYWJsZXMgZ2V0IHRoZSBwZXItdmVydGV4IHZhbHVlcworICAgICAgICAgICAgICogICAgIHdyaXR0ZW4gb3V0IGJ5IHZlcnRleCBzaGFkZXIgb3V0cHV0IHZhcmlhYmxlcyBvZiB0aGUgc2FtZQorICAgICAgICAgICAgICogICAgIG5hbWVzLiBTaW5jZSBhIGdlb21ldHJ5IHNoYWRlciBvcGVyYXRlcyBvbiBhIHNldCBvZgorICAgICAgICAgICAgICogICAgIHZlcnRpY2VzLCBlYWNoIGlucHV0IHZhcnlpbmcgdmFyaWFibGUgKG9yIGlucHV0IGJsb2NrLCBzZWUKKyAgICAgICAgICAgICAqICAgICBpbnRlcmZhY2UgYmxvY2tzIGJlbG93KSBuZWVkcyB0byBiZSBkZWNsYXJlZCBhcyBhbiBhcnJheS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCF2YXItPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW9tZXRyeSBzaGFkZXIgaW5wdXRzIG11c3QgYmUgYXJyYXlzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZV9nZW9tZXRyeV9zaGFkZXJfaW5wdXRfZGVjbChzdGF0ZSwgbG9jLCB2YXIpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBJbnRlZ2VyIGZyYWdtZW50IGlucHV0cyBtdXN0IGJlIHF1YWxpZmllZCB3aXRoICdmbGF0Jy4gIEluIEdMU0wgRVMsCisgICAgICAgKiBzbyBtdXN0IGludGVnZXIgdmVydGV4IG91dHB1dHMuCisgICAgICAgKgorICAgICAgICogRnJvbSBzZWN0aW9uIDQuMy40ICgiSW5wdXRzIikgb2YgdGhlIEdMU0wgMS41MCBzcGVjOgorICAgICAgICogICAgIkZyYWdtZW50IHNoYWRlciBpbnB1dHMgdGhhdCBhcmUgc2lnbmVkIG9yIHVuc2lnbmVkIGludGVnZXJzIG9yCisgICAgICAgKiAgICBpbnRlZ2VyIHZlY3RvcnMgbXVzdCBiZSBxdWFsaWZpZWQgd2l0aCB0aGUgaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXIKKyAgICAgICAqICAgIGZsYXQuIgorICAgICAgICoKKyAgICAgICAqIEZyb20gc2VjdGlvbiA0LjMuNCAoIklucHV0IFZhcmlhYmxlcyIpIG9mIHRoZSBHTFNMIDMuMDAgRVMgc3BlYzoKKyAgICAgICAqICAgICJGcmFnbWVudCBzaGFkZXIgaW5wdXRzIHRoYXQgYXJlLCBvciBjb250YWluLCBzaWduZWQgb3IgdW5zaWduZWQKKyAgICAgICAqICAgIGludGVnZXJzIG9yIGludGVnZXIgdmVjdG9ycyBtdXN0IGJlIHF1YWxpZmllZCB3aXRoIHRoZQorICAgICAgICogICAgaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXIgZmxhdC4iCisgICAgICAgKgorICAgICAgICogRnJvbSBzZWN0aW9uIDQuMy42ICgiT3V0cHV0IFZhcmlhYmxlcyIpIG9mIHRoZSBHTFNMIDMuMDAgRVMgc3BlYzoKKyAgICAgICAqICAgICJWZXJ0ZXggc2hhZGVyIG91dHB1dHMgdGhhdCBhcmUsIG9yIGNvbnRhaW4sIHNpZ25lZCBvciB1bnNpZ25lZAorICAgICAgICogICAgaW50ZWdlcnMgb3IgaW50ZWdlciB2ZWN0b3JzIG11c3QgYmUgcXVhbGlmaWVkIHdpdGggdGhlCisgICAgICAgKiAgICBpbnRlcnBvbGF0aW9uIHF1YWxpZmllciBmbGF0LiIKKyAgICAgICAqCisgICAgICAgKiBOb3RlIHRoYXQgcHJpb3IgdG8gR0xTTCAxLjUwLCB0aGlzIHJlcXVpcmVtZW50IGFwcGxpZWQgdG8gdmVydGV4CisgICAgICAgKiBvdXRwdXRzIHJhdGhlciB0aGFuIGZyYWdtZW50IGlucHV0cy4gIFRoYXQgY3JlYXRlcyBwcm9ibGVtcyBpbiB0aGUKKyAgICAgICAqIHByZXNlbmNlIG9mIGdlb21ldHJ5IHNoYWRlcnMsIHNvIHdlIGFkb3B0IHRoZSBHTFNMIDEuNTAgcnVsZSBmb3IgYWxsCisgICAgICAgKiBkZXNrdG9wIEdMIHNoYWRlcnMuICBGb3IgR0xTTCBFUyBzaGFkZXJzLCB3ZSBmb2xsb3cgdGhlIHNwZWMgYW5kCisgICAgICAgKiBhcHBseSB0aGUgcmVzdHJpY3Rpb24gdG8gYm90aCB2ZXJ0ZXggb3V0cHV0cyBhbmQgZnJhZ21lbnQgaW5wdXRzLgorICAgICAgICoKKyAgICAgICAqIE5vdGUgYWxzbyB0aGF0IHRoZSBkZXNrdG9wIEdMU0wgc3BlY3MgYXJlIG1pc3NpbmcgdGhlIHRleHQgIm9yCisgICAgICAgKiBjb250YWluIjsgdGhpcyBpcyBwcmVzdW1hYmx5IGFuIG92ZXJzaWdodCwgc2luY2UgdGhlcmUgaXMgbm8KKyAgICAgICAqIHJlYXNvbmFibGUgd2F5IHRvIGludGVycG9sYXRlIGEgZnJhZ21lbnQgc2hhZGVyIGlucHV0IHRoYXQgY29udGFpbnMKKyAgICAgICAqIGFuIGludGVnZXIuCisgICAgICAgKi8KKyAgICAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDMwMCkgJiYKKyAgICAgICAgICB2YXItPnR5cGUtPmNvbnRhaW5zX2ludGVnZXIoKSAmJgorICAgICAgICAgIHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uICE9IElOVEVSUF9RVUFMSUZJRVJfRkxBVCAmJgorICAgICAgICAgICgoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UICYmIHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4pCisgICAgICAgICAgIHx8IChzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfVkVSVEVYICYmIHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0CisgICAgICAgICAgICAgICAmJiBzdGF0ZS0+ZXNfc2hhZGVyKSkpIHsKKyAgICAgICAgIGNvbnN0IGNoYXIgKnZhcl90eXBlID0gKHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9WRVJURVgpID8KKyAgICAgICAgICAgICJ2ZXJ0ZXggb3V0cHV0IiA6ICJmcmFnbWVudCBpbnB1dCI7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAiaWYgYSAlcyBpcyAob3IgY29udGFpbnMpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIGludGVnZXIsIHRoZW4gaXQgbXVzdCBiZSBxdWFsaWZpZWQgd2l0aCAnZmxhdCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdHlwZSk7CisgICAgICB9CisKKworICAgICAgLyogSW50ZXJwb2xhdGlvbiBxdWFsaWZpZXJzIGNhbm5vdCBiZSBhcHBsaWVkIHRvICdjZW50cm9pZCcgYW5kCisgICAgICAgKiAnY2VudHJvaWQgdmFyeWluZycuCisgICAgICAgKgorICAgICAgICogRnJvbSBwYWdlIDI5IChwYWdlIDM1IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMzAgc3BlYzoKKyAgICAgICAqICAgICJpbnRlcnBvbGF0aW9uIHF1YWxpZmllcnMgbWF5IG9ubHkgcHJlY2VkZSB0aGUgcXVhbGlmaWVycyBpbiwKKyAgICAgICAqICAgIGNlbnRyb2lkIGluLCBvdXQsIG9yIGNlbnRyb2lkIG91dCBpbiBhIGRlY2xhcmF0aW9uLiBUaGV5IGRvIG5vdCBhcHBseQorICAgICAgICogICAgdG8gdGhlIGRlcHJlY2F0ZWQgc3RvcmFnZSBxdWFsaWZpZXJzIHZhcnlpbmcgb3IgY2VudHJvaWQgdmFyeWluZy4iCisgICAgICAgKgorICAgICAgICogVGhlc2UgZGVwcmVjYXRlZCBzdG9yYWdlIHF1YWxpZmllcnMgZG8gbm90IGV4aXN0IGluIEdMU0wgRVMgMy4wMC4KKyAgICAgICAqLworICAgICAgaWYgKHN0YXRlLT5pc192ZXJzaW9uKDEzMCwgMCkKKyAgICAgICAgICAmJiB0aGlzLT50eXBlLT5xdWFsaWZpZXIuaGFzX2ludGVycG9sYXRpb24oKQorICAgICAgICAgICYmIHRoaXMtPnR5cGUtPnF1YWxpZmllci5mbGFncy5xLnZhcnlpbmcpIHsKKworICAgICAgICAgY29uc3QgY2hhciAqaSA9IHRoaXMtPnR5cGUtPnF1YWxpZmllci5pbnRlcnBvbGF0aW9uX3N0cmluZygpOworICAgICAgICAgYXNzZXJ0KGkgIT0gTlVMTCk7CisgICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICAgaWYgKHRoaXMtPnR5cGUtPnF1YWxpZmllci5mbGFncy5xLmNlbnRyb2lkKQorICAgICAgICAgICAgcyA9ICJjZW50cm9pZCB2YXJ5aW5nIjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMgPSAidmFyeWluZyI7CisKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaWZpZXIgJyVzJyBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZCBzdG9yYWdlIHF1YWxpZmllciAnJXMnIiwgaSwgcyk7CisgICAgICB9CisKKworICAgICAgLyogSW50ZXJwb2xhdGlvbiBxdWFsaWZpZXJzIGNhbiBvbmx5IGFwcGx5IHRvIHZlcnRleCBzaGFkZXIgb3V0cHV0cyBhbmQKKyAgICAgICAqIGZyYWdtZW50IHNoYWRlciBpbnB1dHMuCisgICAgICAgKgorICAgICAgICogRnJvbSBwYWdlIDI5IChwYWdlIDM1IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMzAgc3BlYzoKKyAgICAgICAqICAgICJPdXRwdXRzIGZyb20gYSB2ZXJ0ZXggc2hhZGVyIChvdXQpIGFuZCBpbnB1dHMgdG8gYSBmcmFnbWVudAorICAgICAgICogICAgc2hhZGVyIChpbikgY2FuIGJlIGZ1cnRoZXIgcXVhbGlmaWVkIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlc2UKKyAgICAgICAqICAgIGludGVycG9sYXRpb24gcXVhbGlmaWVycyIKKyAgICAgICAqCisgICAgICAgKiBGcm9tIHBhZ2UgMzEgKHBhZ2UgMzcgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgRVMgMy4wMCBzcGVjOgorICAgICAgICogICAgIlRoZXNlIGludGVycG9sYXRpb24gcXVhbGlmaWVycyBtYXkgb25seSBwcmVjZWRlIHRoZSBxdWFsaWZpZXJzCisgICAgICAgKiAgICBpbiwgY2VudHJvaWQgaW4sIG91dCwgb3IgY2VudHJvaWQgb3V0IGluIGEgZGVjbGFyYXRpb24uIFRoZXkgZG8KKyAgICAgICAqICAgIG5vdCBhcHBseSB0byBpbnB1dHMgaW50byBhIHZlcnRleCBzaGFkZXIgb3Igb3V0cHV0cyBmcm9tIGEKKyAgICAgICAqICAgIGZyYWdtZW50IHNoYWRlci4iCisgICAgICAgKi8KKyAgICAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDMwMCkKKyAgICAgICAgICAmJiB0aGlzLT50eXBlLT5xdWFsaWZpZXIuaGFzX2ludGVycG9sYXRpb24oKSkgeworCisgICAgICAgICBjb25zdCBjaGFyICppID0gdGhpcy0+dHlwZS0+cXVhbGlmaWVyLmludGVycG9sYXRpb25fc3RyaW5nKCk7CisgICAgICAgICBhc3NlcnQoaSAhPSBOVUxMKTsKKworICAgICAgICAgc3dpdGNoIChzdGF0ZS0+c3RhZ2UpIHsKKyAgICAgICAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgICAgICAgaWYgKHRoaXMtPnR5cGUtPnF1YWxpZmllci5mbGFncy5xLmluKSB7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhbGlmaWVyICclcycgY2Fubm90IGJlIGFwcGxpZWQgdG8gdmVydGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoYWRlciBpbnB1dHMiLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBNRVNBX1NIQURFUl9GUkFHTUVOVDoKKyAgICAgICAgICAgIGlmICh0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5vdXQpIHsKKyAgICAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaWZpZXIgJyVzJyBjYW5ub3QgYmUgYXBwbGllZCB0byBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGFkZXIgb3V0cHV0cyIsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKworICAgICAgLyogRnJvbSBzZWN0aW9uIDQuMy40IG9mIHRoZSBHTFNMIDEuMzAgc3BlYzoKKyAgICAgICAqICAgICJJdCBpcyBhbiBlcnJvciB0byB1c2UgY2VudHJvaWQgaW4gaW4gYSB2ZXJ0ZXggc2hhZGVyLiIKKyAgICAgICAqCisgICAgICAgKiBGcm9tIHNlY3Rpb24gNC4zLjQgb2YgdGhlIEdMU0wgRVMgMy4wMCBzcGVjOgorICAgICAgICogICAgIkl0IGlzIGFuIGVycm9yIHRvIHVzZSBjZW50cm9pZCBpbiBvciBpbnRlcnBvbGF0aW9uIHF1YWxpZmllcnMgaW4KKyAgICAgICAqICAgIGEgdmVydGV4IHNoYWRlciBpbnB1dC4iCisgICAgICAgKi8KKyAgICAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDMwMCkKKyAgICAgICAgICAmJiB0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5jZW50cm9pZAorICAgICAgICAgICYmIHRoaXMtPnR5cGUtPnF1YWxpZmllci5mbGFncy5xLmluCisgICAgICAgICAgJiYgc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX1ZFUlRFWCkgeworCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ2NlbnRyb2lkIGluJyBjYW5ub3QgYmUgdXNlZCBpbiBhIHZlcnRleCBzaGFkZXIiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9WRVJURVgKKyAgICAgICAgICAmJiB0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5zYW1wbGUKKyAgICAgICAgICAmJiB0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5pbikgeworCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIidzYW1wbGUgaW4nIGNhbm5vdCBiZSB1c2VkIGluIGEgdmVydGV4IHNoYWRlciIpOworICAgICAgfQorCisgICAgICAvKiBTZWN0aW9uIDQuMy42IG9mIHRoZSBHTFNMIDEuMzAgc3BlY2lmaWNhdGlvbiBzdGF0ZXM6CisgICAgICAgKiAiSXQgaXMgYW4gZXJyb3IgdG8gdXNlIGNlbnRyb2lkIG91dCBpbiBhIGZyYWdtZW50IHNoYWRlci4iCisgICAgICAgKgorICAgICAgICogVGhlIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24gc3RhdGVzOgorICAgICAgICogIkl0IGlzIGFuIGVycm9yIHRvIHVzZSBhdXhpbGlhcnkgc3RvcmFnZSBxdWFsaWZpZXJzIG9yIGludGVycG9sYXRpb24KKyAgICAgICAqICBxdWFsaWZpZXJzIG9uIGFuIG91dHB1dCBpbiBhIGZyYWdtZW50IHNoYWRlci4iCisgICAgICAgKi8KKyAgICAgIGlmIChzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQgJiYKKyAgICAgICAgICB0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5vdXQgJiYKKyAgICAgICAgICB0aGlzLT50eXBlLT5xdWFsaWZpZXIuaGFzX2F1eGlsaWFyeV9zdG9yYWdlKCkpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXhpbGlhcnkgc3RvcmFnZSBxdWFsaWZpZXJzIGNhbm5vdCBiZSB1c2VkIG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYWdtZW50IHNoYWRlciBvdXRwdXRzIik7CisgICAgICB9CisKKyAgICAgIC8qIFByZWNpc2lvbiBxdWFsaWZpZXJzIGV4aXN0cyBvbmx5IGluIEdMU0wgdmVyc2lvbnMgMS4wMCBhbmQgPj0gMS4zMC4KKyAgICAgICAqLworICAgICAgaWYgKHRoaXMtPnR5cGUtPnF1YWxpZmllci5wcmVjaXNpb24gIT0gYXN0X3ByZWNpc2lvbl9ub25lKSB7CisgICAgICAgICBzdGF0ZS0+Y2hlY2tfcHJlY2lzaW9uX3F1YWxpZmllcnNfYWxsb3dlZCgmbG9jKTsKKyAgICAgIH0KKworCisgICAgICAvKiBQcmVjaXNpb24gcXVhbGlmaWVycyBhcHBseSB0byBmbG9hdGluZyBwb2ludCwgaW50ZWdlciBhbmQgc2FtcGxlcgorICAgICAgICogdHlwZXMuCisgICAgICAgKgorICAgICAgICogU2VjdGlvbiA0LjUuMiAoUHJlY2lzaW9uIFF1YWxpZmllcnMpIG9mIHRoZSBHTFNMIDEuMzAgc3BlYyBzYXlzOgorICAgICAgICogICAgIkFueSBmbG9hdGluZyBwb2ludCBvciBhbnkgaW50ZWdlciBkZWNsYXJhdGlvbiBjYW4gaGF2ZSB0aGUgdHlwZQorICAgICAgICogICAgcHJlY2VkZWQgYnkgb25lIG9mIHRoZXNlIHByZWNpc2lvbiBxdWFsaWZpZXJzIFsuLi5dIExpdGVyYWwKKyAgICAgICAqICAgIGNvbnN0YW50cyBkbyBub3QgaGF2ZSBwcmVjaXNpb24gcXVhbGlmaWVycy4gTmVpdGhlciBkbyBCb29sZWFuCisgICAgICAgKiAgICB2YXJpYWJsZXMuCisgICAgICAgKgorICAgICAgICogU2VjdGlvbiA0LjUgKFByZWNpc2lvbiBhbmQgUHJlY2lzaW9uIFF1YWxpZmllcnMpIG9mIHRoZSBHTFNMIDEuMzAKKyAgICAgICAqIHNwZWMgYWxzbyBzYXlzOgorICAgICAgICoKKyAgICAgICAqICAgICAiUHJlY2lzaW9uIHF1YWxpZmllcnMgYXJlIGFkZGVkIGZvciBjb2RlIHBvcnRhYmlsaXR5IHdpdGggT3BlbkdMCisgICAgICAgKiAgICAgRVMsIG5vdCBmb3IgZnVuY3Rpb25hbGl0eS4gVGhleSBoYXZlIHRoZSBzYW1lIHN5bnRheCBhcyBpbiBPcGVuR0wKKyAgICAgICAqICAgICBFUy4iCisgICAgICAgKgorICAgICAgICogU2VjdGlvbiA4IChCdWlsdC1JbiBGdW5jdGlvbnMpIG9mIHRoZSBHTFNMIEVTIDEuMDAgc3BlYyBzYXlzOgorICAgICAgICoKKyAgICAgICAqICAgICAidW5pZm9ybSBsb3dwIHNhbXBsZXIyRCBzYW1wbGVyOworICAgICAgICogICAgIGhpZ2hwIHZlYzIgY29vcmQ7CisgICAgICAgKiAgICAgLi4uCisgICAgICAgKiAgICAgbG93cCB2ZWM0IGNvbCA9IHRleHR1cmUyRCAoc2FtcGxlciwgY29vcmQpOworICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUyRCByZXR1cm5zIGxvd3AiCisgICAgICAgKgorICAgICAgICogRnJvbSB0aGlzLCB3ZSBpbmZlciB0aGF0IEdMU0wgMS4zMCAoYW5kIGxhdGVyKSBzaG91bGQgYWxsb3cgcHJlY2lzaW9uCisgICAgICAgKiBxdWFsaWZpZXJzIG9uIHNhbXBsZXIgdHlwZXMganVzdCBsaWtlIGZsb2F0IGFuZCBpbnRlZ2VyIHR5cGVzLgorICAgICAgICovCisgICAgICBpZiAodGhpcy0+dHlwZS0+cXVhbGlmaWVyLnByZWNpc2lvbiAhPSBhc3RfcHJlY2lzaW9uX25vbmUKKyAgICAgICAgICAmJiAhdmFyLT50eXBlLT5pc19mbG9hdCgpCisgICAgICAgICAgJiYgIXZhci0+dHlwZS0+aXNfaW50ZWdlcigpCisgICAgICAgICAgJiYgIXZhci0+dHlwZS0+aXNfcmVjb3JkKCkKKyAgICAgICAgICAmJiAhdmFyLT50eXBlLT5pc19zYW1wbGVyKCkKKyAgICAgICAgICAmJiAhKHZhci0+dHlwZS0+aXNfYXJyYXkoKQorICAgICAgICAgICAgICAgJiYgKHZhci0+dHlwZS0+ZmllbGRzLmFycmF5LT5pc19mbG9hdCgpCisgICAgICAgICAgICAgICAgICAgfHwgdmFyLT50eXBlLT5maWVsZHMuYXJyYXktPmlzX2ludGVnZXIoKSkpKSB7CisKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVjaXNpb24gcXVhbGlmaWVycyBhcHBseSBvbmx5IHRvIGZsb2F0aW5nIHBvaW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnRlZ2VyIGFuZCBzYW1wbGVyIHR5cGVzIik7CisgICAgICB9CisKKyAgICAgIC8qIEZyb20gc2VjdGlvbiA0LjEuNyBvZiB0aGUgR0xTTCA0LjQwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgIltPcGFxdWUgdHlwZXNdIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGFzIGZ1bmN0aW9uCisgICAgICAgKiAgICAgcGFyYW1ldGVycyBvciB1bmlmb3JtLXF1YWxpZmllZCB2YXJpYWJsZXMuIgorICAgICAgICovCisgICAgICBpZiAodmFyX3R5cGUtPmNvbnRhaW5zX29wYXF1ZSgpICYmCisgICAgICAgICAgIXRoaXMtPnR5cGUtPnF1YWxpZmllci5mbGFncy5xLnVuaWZvcm0pIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGFxdWUgdmFyaWFibGVzIG11c3QgYmUgZGVjbGFyZWQgdW5pZm9ybSIpOworICAgICAgfQorCisgICAgICAvKiBQcm9jZXNzIHRoZSBpbml0aWFsaXplciBhbmQgYWRkIGl0cyBpbnN0cnVjdGlvbnMgdG8gYSB0ZW1wb3JhcnkKKyAgICAgICAqIGxpc3QuICBUaGlzIGxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIChiZWxvdykgYWZ0ZXIKKyAgICAgICAqIHRoZSBkZWNsYXJhdGlvbiBpcyBhZGRlZC4gIFRoaXMgaXMgZG9uZSBiZWNhdXNlIGluIHNvbWUgY2FzZXMgKHN1Y2ggYXMKKyAgICAgICAqIHJlZGVjbGFyYXRpb25zKSB0aGUgZGVjbGFyYXRpb24gbWF5IG5vdCBhY3R1YWxseSBiZSBhZGRlZCB0byB0aGUKKyAgICAgICAqIGluc3RydWN0aW9uIHN0cmVhbS4KKyAgICAgICAqLworICAgICAgZXhlY19saXN0IGluaXRpYWxpemVyX2luc3RydWN0aW9uczsKKworICAgICAgLyogRXhhbWluZSB2YXIgbmFtZSBoZXJlIHNpbmNlIHZhciBtYXkgZ2V0IGRlbGV0ZWQgaW4gdGhlIG5leHQgY2FsbCAqLworICAgICAgYm9vbCB2YXJfaXNfZ2xfaWQgPSAoc3RybmNtcCh2YXItPm5hbWUsICJnbF8iLCAzKSA9PSAwKTsKKworICAgICAgaXJfdmFyaWFibGUgKmVhcmxpZXIgPQorICAgICAgICAgZ2V0X3ZhcmlhYmxlX2JlaW5nX3JlZGVjbGFyZWQodmFyLCBkZWNsLT5nZXRfbG9jYXRpb24oKSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd19hbGxfcmVkZWNsYXJhdGlvbnMgKi8pOworICAgICAgaWYgKGVhcmxpZXIgIT0gTlVMTCkgeworICAgICAgICAgaWYgKHZhcl9pc19nbF9pZCAmJgorICAgICAgICAgICAgIGVhcmxpZXItPmRhdGEuaG93X2RlY2xhcmVkID09IGlyX3Zhcl9kZWNsYXJlZF9pbl9ibG9jaykgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImAlcycgaGFzIGFscmVhZHkgYmVlbiByZWRlY2xhcmVkIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsX1BlclZlcnRleCIsIHZhci0+bmFtZSk7CisgICAgICAgICB9CisgICAgICAgICBlYXJsaWVyLT5kYXRhLmhvd19kZWNsYXJlZCA9IGlyX3Zhcl9kZWNsYXJlZF9ub3JtYWxseTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlY2wtPmluaXRpYWxpemVyICE9IE5VTEwpIHsKKyAgICAgICAgIHJlc3VsdCA9IHByb2Nlc3NfaW5pdGlhbGl6ZXIoKGVhcmxpZXIgPT0gTlVMTCkgPyB2YXIgOiBlYXJsaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsLCB0aGlzLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbGl6ZXJfaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICB9CisKKyAgICAgIC8qIEZyb20gcGFnZSAyMyAocGFnZSAyOSBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjEwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgICJJdCBpcyBhbiBlcnJvciB0byB3cml0ZSB0byBhIGNvbnN0IHZhcmlhYmxlIG91dHNpZGUgb2YKKyAgICAgICAqICAgICAgaXRzIGRlY2xhcmF0aW9uLCBzbyB0aGV5IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2hlbgorICAgICAgICogICAgICBkZWNsYXJlZC4iCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLT50eXBlLT5xdWFsaWZpZXIuZmxhZ3MucS5jb25zdGFudCAmJiBkZWNsLT5pbml0aWFsaXplciA9PSBOVUxMKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0IGRlY2xhcmF0aW9uIG9mIGAlcycgbXVzdCBiZSBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wtPmlkZW50aWZpZXIpOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGUtPmVzX3NoYWRlcikgeworICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCB0ID0gKGVhcmxpZXIgPT0gTlVMTCkKKyAgICAgICAgICAgID8gdmFyLT50eXBlIDogZWFybGllci0+dHlwZTsKKworICAgICAgICAgaWYgKHQtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkKKyAgICAgICAgICAgIC8qIFNlY3Rpb24gMTAuMTcgb2YgdGhlIEdMU0wgRVMgMS4wMCBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0CisgICAgICAgICAgICAgKiB1bnNpemVkIGFycmF5IGRlY2xhcmF0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsYW5ndWFnZS4KKyAgICAgICAgICAgICAqIEFycmF5cyB0aGF0IGFyZSBzaXplZCB1c2luZyBhbiBpbml0aWFsaXplciBhcmUgc3RpbGwgZXhwbGljaXRseQorICAgICAgICAgICAgICogc2l6ZWQuICBIb3dldmVyLCBHTFNMIEVTIDEuMDAgZG9lcyBub3QgYWxsb3cgYXJyYXkKKyAgICAgICAgICAgICAqIGluaXRpYWxpemVycy4gIFRoYXQgaXMgb25seSBhbGxvd2VkIGluIEdMU0wgRVMgMy4wMC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBTZWN0aW9uIDQuMS45IChBcnJheXMpIG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYyBzYXlzOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICAiQW4gYXJyYXkgdHlwZSBjYW4gYWxzbyBiZSBmb3JtZWQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgc2l6ZQorICAgICAgICAgICAgICogICAgIGlmIHRoZSBkZWZpbml0aW9uIGluY2x1ZGVzIGFuIGluaXRpYWxpemVyOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICAgICAgZmxvYXQgeFtdID0gZmxvYXRbMl0gKDEuMCwgMi4wKTsgICAgIC8vIGRlY2xhcmVzIGFuIGFycmF5IG9mIHNpemUgMgorICAgICAgICAgICAgICogICAgICAgICBmbG9hdCB5W10gPSBmbG9hdFtdICgxLjAsIDIuMCwgMy4wKTsgLy8gZGVjbGFyZXMgYW4gYXJyYXkgb2Ygc2l6ZSAzCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICAgICAgICBmbG9hdCBhWzVdOworICAgICAgICAgICAgICogICAgICAgICBmbG9hdCBiW10gPSBhOyIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpemVkIGFycmF5IGRlY2xhcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xTTCBFUyIpOworICAgICAgfQorCisgICAgICAvKiBJZiB0aGUgZGVjbGFyYXRpb24gaXMgbm90IGEgcmVkZWNsYXJhdGlvbiwgdGhlcmUgYXJlIGEgZmV3IGFkZGl0aW9uYWwKKyAgICAgICAqIHNlbWFudGljIGNoZWNrcyB0aGF0IG11c3QgYmUgYXBwbGllZC4gIEluIGFkZGl0aW9uLCB2YXJpYWJsZSB0aGF0IHdhcworICAgICAgICogY3JlYXRlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgSVIgc3RyZWFtLgorICAgICAgICovCisgICAgICBpZiAoZWFybGllciA9PSBOVUxMKSB7CisgICAgICAgICB2YWxpZGF0ZV9pZGVudGlmaWVyKGRlY2wtPmlkZW50aWZpZXIsIGxvYywgc3RhdGUpOworCisgICAgICAgICAvKiBBZGQgdGhlIHZhcmlhYmxlIHRvIHRoZSBzeW1ib2wgdGFibGUuICBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemVyJ3MKKyAgICAgICAgICAqIElSIHdhcyBhbHJlYWR5IHByb2Nlc3NlZCBlYXJsaWVyICh0aG91Z2ggaXQgaGFzbid0IGJlZW4gZW1pdHRlZAorICAgICAgICAgICogeWV0KSwgd2l0aG91dCB0aGUgdmFyaWFibGUgaW4gc2NvcGUuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhpcyBkaWZmZXJzIGZyb20gbW9zdCBDLWxpa2UgbGFuZ3VhZ2VzLCBidXQgaXQgZm9sbG93cyB0aGUgR0xTTAorICAgICAgICAgICogc3BlY2lmaWNhdGlvbi4gIEZyb20gcGFnZSAyOCAocGFnZSAzNCBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwCisgICAgICAgICAgKiBzcGVjOgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgICAiV2l0aGluIGEgZGVjbGFyYXRpb24sIHRoZSBzY29wZSBvZiBhIG5hbWUgc3RhcnRzIGltbWVkaWF0ZWx5CisgICAgICAgICAgKiAgICAgYWZ0ZXIgdGhlIGluaXRpYWxpemVyIGlmIHByZXNlbnQgb3IgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG5hbWUKKyAgICAgICAgICAqICAgICBiZWluZyBkZWNsYXJlZCBpZiBub3QuIgorICAgICAgICAgICovCisgICAgICAgICBpZiAoIXN0YXRlLT5zeW1ib2xzLT5hZGRfdmFyaWFibGUodmFyKSkgeworICAgICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJuYW1lIGAlcycgYWxyZWFkeSB0YWtlbiBpbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudCBzY29wZSIsIGRlY2wtPmlkZW50aWZpZXIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIFB1c2ggdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvIHRoZSB0b3AuICBJdCBtZWFucyB0aGF0IGFsbCB0aGUKKyAgICAgICAgICAqIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyB3aWxsIGFwcGVhciBpbiBhIGZ1bm55IGxhc3QtdG8tZmlyc3Qgb3JkZXIsCisgICAgICAgICAgKiBidXQgb3RoZXJ3aXNlIHdlIHJ1biBpbnRvIHRyb3VibGUgaWYgYSBmdW5jdGlvbiBpcyBwcm90b3R5cGVkLCBhCisgICAgICAgICAgKiBnbG9iYWwgdmFyIGlzIGRlY2xlZCwgdGhlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCB3aXRoIHVzYWdlIG9mCisgICAgICAgICAgKiB0aGUgZ2xvYmFsIHZhci4gIFNlZSBnbHNscGFyc2VydGVzdCdzIENvcnJlY3RNb2R1bGUuZnJhZy4KKyAgICAgICAgICAqLworICAgICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX2hlYWQodmFyKTsKKyAgICAgIH0KKworICAgICAgaW5zdHJ1Y3Rpb25zLT5hcHBlbmRfbGlzdCgmaW5pdGlhbGl6ZXJfaW5zdHJ1Y3Rpb25zKTsKKyAgIH0KKworCisgICAvKiBHZW5lcmFsbHksIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBkbyBub3QgaGF2ZSByLXZhbHVlcy4gIEhvd2V2ZXIsCisgICAgKiBvbmUgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIGluCisgICAgKgorICAgICogd2hpbGUgKGJvb2wgYiA9IHNvbWVfY29uZGl0aW9uKCkpIHsKKyAgICAqICAgLi4uCisgICAgKiB9CisgICAgKgorICAgICogc28gd2UgcmV0dXJuIHRoZSBydmFsdWUgZnJvbSB0aGUgbGFzdCBzZWVuIGRlY2xhcmF0aW9uIGhlcmUuCisgICAgKi8KKyAgIHJldHVybiByZXN1bHQ7Cit9CisKKworaXJfcnZhbHVlICoKK2FzdF9wYXJhbWV0ZXJfZGVjbGFyYXRvcjo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlOworICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICB0eXBlID0gdGhpcy0+dHlwZS0+Z2xzbF90eXBlKCYgbmFtZSwgc3RhdGUpOworCisgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdHlwZSBgJXMnIGluIGRlY2xhcmF0aW9uIG9mIGAlcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0aGlzLT5pZGVudGlmaWVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdHlwZSBpbiBkZWNsYXJhdGlvbiBvZiBgJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+aWRlbnRpZmllcik7CisgICAgICB9CisKKyAgICAgIHR5cGUgPSBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisKKyAgIC8qIEZyb20gcGFnZSA2MiAocGFnZSA2OCBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgKgorICAgICogICAgIkZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBubyBpbnB1dCBhcmd1bWVudHMgbmVlZCBub3QgdXNlIHZvaWQgaW4gdGhlCisgICAgKiAgICBhcmd1bWVudCBsaXN0IGJlY2F1c2UgcHJvdG90eXBlcyAob3IgZGVmaW5pdGlvbnMpIGFyZSByZXF1aXJlZCBhbmQKKyAgICAqICAgIHRoZXJlZm9yZSB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgd2hlbiBhbiBlbXB0eSBhcmd1bWVudCBsaXN0ICIoICkiIGlzCisgICAgKiAgICBkZWNsYXJlZC4gVGhlIGlkaW9tICIodm9pZCkiIGFzIGEgcGFyYW1ldGVyIGxpc3QgaXMgcHJvdmlkZWQgZm9yCisgICAgKiAgICBjb252ZW5pZW5jZS4iCisgICAgKgorICAgICogUGxhY2luZyB0aGlzIGNoZWNrIGhlcmUgcHJldmVudHMgYSB2b2lkIHBhcmFtZXRlciBiZWluZyBzZXQgdXAKKyAgICAqIGZvciBhIGZ1bmN0aW9uLCB3aGljaCBhdm9pZHMgdHJpcHBpbmcgdXAgY2hlY2tzIGZvciBtYWluIHRha2luZworICAgICogcGFyYW1ldGVycyBhbmQgbG9va3VwcyBvZiBhbiB1bm5hbWVkIHN5bWJvbC4KKyAgICAqLworICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaWYgKHRoaXMtPmlkZW50aWZpZXIgIT0gTlVMTCkKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZWQgcGFyYW1ldGVyIGNhbm5vdCBoYXZlIHR5cGUgYHZvaWQnIik7CisKKyAgICAgIGlzX3ZvaWQgPSB0cnVlOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlmIChmb3JtYWxfcGFyYW1ldGVyICYmICh0aGlzLT5pZGVudGlmaWVyID09IE5VTEwpKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgImZvcm1hbCBwYXJhbWV0ZXIgbGFja3MgYSBuYW1lIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLyogVGhpcyBvbmx5IGhhbmRsZXMgInZlYzQgZm9vWy4uXSIuICBUaGUgZWFybGllciBzcGVjaWZpZXItPmdsc2xfdHlwZSguLi4pCisgICAgKiBjYWxsIGFscmVhZHkgaGFuZGxlZCB0aGUgInZlYzRbLi5dIGZvbyIgY2FzZS4KKyAgICAqLworICAgdHlwZSA9IHByb2Nlc3NfYXJyYXlfdHlwZSgmbG9jLCB0eXBlLCB0aGlzLT5hcnJheV9zcGVjaWZpZXIsIHN0YXRlKTsKKworICAgaWYgKCF0eXBlLT5pc19lcnJvcigpICYmIHR5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImFycmF5cyBwYXNzZWQgYXMgcGFyYW1ldGVycyBtdXN0IGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiYSBkZWNsYXJlZCBzaXplIik7CisgICAgICB0eXBlID0gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgfQorCisgICBpc192b2lkID0gZmFsc2U7CisgICBpcl92YXJpYWJsZSAqdmFyID0gbmV3KGN0eCkKKyAgICAgIGlyX3ZhcmlhYmxlKHR5cGUsIHRoaXMtPmlkZW50aWZpZXIsIGlyX3Zhcl9mdW5jdGlvbl9pbik7CisKKyAgIC8qIEFwcGx5IGFueSBzcGVjaWZpZWQgcXVhbGlmaWVycyB0byB0aGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLiAgTm90ZSB0aGF0CisgICAgKiBmb3IgZnVuY3Rpb24gcGFyYW1ldGVycyB0aGUgZGVmYXVsdCBtb2RlIGlzICdpbicuCisgICAgKi8KKyAgIGFwcGx5X3R5cGVfcXVhbGlmaWVyX3RvX3ZhcmlhYmxlKCYgdGhpcy0+dHlwZS0+cXVhbGlmaWVyLCB2YXIsIHN0YXRlLCAmIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworCisgICAvKiBGcm9tIHNlY3Rpb24gNC4xLjcgb2YgdGhlIEdMU0wgNC40MCBzcGVjOgorICAgICoKKyAgICAqICAgIk9wYXF1ZSB2YXJpYWJsZXMgY2Fubm90IGJlIHRyZWF0ZWQgYXMgbC12YWx1ZXM7IGhlbmNlIGNhbm5vdAorICAgICogICAgYmUgdXNlZCBhcyBvdXQgb3IgaW5vdXQgZnVuY3Rpb24gcGFyYW1ldGVycywgbm9yIGNhbiB0aGV5IGJlCisgICAgKiAgICBhc3NpZ25lZCBpbnRvLiIKKyAgICAqLworICAgaWYgKCh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfZnVuY3Rpb25faW5vdXQgfHwgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX291dCkKKyAgICAgICAmJiB0eXBlLT5jb250YWluc19vcGFxdWUoKSkgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgIm91dCBhbmQgaW5vdXQgcGFyYW1ldGVycyBjYW5ub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbiBvcGFxdWUgdmFyaWFibGVzIik7CisgICAgICB0eXBlID0gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgfQorCisgICAvKiBGcm9tIHBhZ2UgMzkgKHBhZ2UgNDUgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4xMCBzcGVjOgorICAgICoKKyAgICAqICAgICJXaGVuIGNhbGxpbmcgYSBmdW5jdGlvbiwgZXhwcmVzc2lvbnMgdGhhdCBkbyBub3QgZXZhbHVhdGUgdG8KKyAgICAqICAgICBsLXZhbHVlcyBjYW5ub3QgYmUgcGFzc2VkIHRvIHBhcmFtZXRlcnMgZGVjbGFyZWQgYXMgb3V0IG9yIGlub3V0LiIKKyAgICAqCisgICAgKiBGcm9tIHBhZ2UgMzIgKHBhZ2UgMzggb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4xMCBzcGVjOgorICAgICoKKyAgICAqICAgICJPdGhlciBiaW5hcnkgb3IgdW5hcnkgZXhwcmVzc2lvbnMsIG5vbi1kZXJlZmVyZW5jZWQgYXJyYXlzLAorICAgICogICAgIGZ1bmN0aW9uIG5hbWVzLCBzd2l6emxlcyB3aXRoIHJlcGVhdGVkIGZpZWxkcywgYW5kIGNvbnN0YW50cworICAgICogICAgIGNhbm5vdCBiZSBsLXZhbHVlcy4iCisgICAgKgorICAgICogU28gZm9yIEdMU0wgMS4xMCwgcGFzc2luZyBhbiBhcnJheSBhcyBhbiBvdXQgb3IgaW5vdXQgcGFyYW1ldGVyIGlzIG5vdAorICAgICogYWxsb3dlZC4gIFRoaXMgcmVzdHJpY3Rpb24gaXMgcmVtb3ZlZCBpbiBHTFNMIDEuMjAsIGFuZCBpbiBHTFNMIEVTLgorICAgICovCisgICBpZiAoKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9mdW5jdGlvbl9pbm91dCB8fCB2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfZnVuY3Rpb25fb3V0KQorICAgICAgICYmIHR5cGUtPmlzX2FycmF5KCkKKyAgICAgICAmJiAhc3RhdGUtPmNoZWNrX3ZlcnNpb24oMTIwLCAxMDAsICZsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheXMgY2Fubm90IGJlIG91dCBvciBpbm91dCBwYXJhbWV0ZXJzIikpIHsKKyAgICAgIHR5cGUgPSBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisgICB9CisKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHZhcik7CisKKyAgIC8qIFBhcmFtZXRlciBkZWNsYXJhdGlvbnMgZG8gbm90IGhhdmUgci12YWx1ZXMuCisgICAgKi8KKyAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQKK2FzdF9wYXJhbWV0ZXJfZGVjbGFyYXRvcjo6cGFyYW1ldGVyc190b19oaXIoZXhlY19saXN0ICphc3RfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNfbGlzdCAqaXJfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBhc3RfcGFyYW1ldGVyX2RlY2xhcmF0b3IgKnZvaWRfcGFyYW0gPSBOVUxMOworICAgdW5zaWduZWQgY291bnQgPSAwOworCisgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9wYXJhbWV0ZXJfZGVjbGFyYXRvciwgcGFyYW0sIGxpbmssIGFzdF9wYXJhbWV0ZXJzKSB7CisgICAgICBwYXJhbS0+Zm9ybWFsX3BhcmFtZXRlciA9IGZvcm1hbDsKKyAgICAgIHBhcmFtLT5oaXIoaXJfcGFyYW1ldGVycywgc3RhdGUpOworCisgICAgICBpZiAocGFyYW0tPmlzX3ZvaWQpCisgICAgICAgICB2b2lkX3BhcmFtID0gcGFyYW07CisKKyAgICAgIGNvdW50Kys7CisgICB9CisKKyAgIGlmICgodm9pZF9wYXJhbSAhPSBOVUxMKSAmJiAoY291bnQgPiAxKSkgeworICAgICAgWVlMVFlQRSBsb2MgPSB2b2lkX3BhcmFtLT5nZXRfbG9jYXRpb24oKTsKKworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICJgdm9pZCcgcGFyYW1ldGVyIG11c3QgYmUgb25seSBwYXJhbWV0ZXIiKTsKKyAgIH0KK30KKworCit2b2lkCitlbWl0X2Z1bmN0aW9uKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLCBpcl9mdW5jdGlvbiAqZikKK3sKKyAgIC8qIElSIGludmFyaWFudHMgZGlzYWxsb3cgZnVuY3Rpb24gZGVjbGFyYXRpb25zIG9yIGRlZmluaXRpb25zCisgICAgKiBuZXN0ZWQgd2l0aGluIG90aGVyIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgQnV0IHRoZXJlIGlzIG5vCisgICAgKiByZXF1aXJlbWVudCBhYm91dCB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgICAgKiBhbmQgZGVmaW5pdGlvbnMgd2l0aCByZXNwZWN0IHRvIG9uZSBhbm90aGVyLiAgU28gc2ltcGx5IGluc2VydAorICAgICogdGhlIG5ldyBpcl9mdW5jdGlvbiBibG9jayBhdCB0aGUgZW5kIG9mIHRoZSB0b3BsZXZlbCBpbnN0cnVjdGlvbgorICAgICogbGlzdC4KKyAgICAqLworICAgc3RhdGUtPnRvcGxldmVsX2lyLT5wdXNoX3RhaWwoZik7Cit9CisKKworaXJfcnZhbHVlICoKK2FzdF9mdW5jdGlvbjo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICBpcl9mdW5jdGlvbiAqZiA9IE5VTEw7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9IE5VTEw7CisgICBleGVjX2xpc3QgaGlyX3BhcmFtZXRlcnM7CisKKyAgIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWUgPSBpZGVudGlmaWVyOworCisgICAvKiBOZXcgZnVuY3Rpb25zIGFyZSBhbHdheXMgYWRkZWQgdG8gdGhlIHRvcC1sZXZlbCBJUiBpbnN0cnVjdGlvbiBzdHJlYW0sCisgICAgKiBzbyB0aGlzIGluc3RydWN0aW9uIGxpc3QgcG9pbnRlciBpcyBpZ25vcmVkLiAgU2VlIGFsc28gZW1pdF9mdW5jdGlvbgorICAgICogKGNhbGxlZCBiZWxvdykuCisgICAgKi8KKyAgICh2b2lkKSBpbnN0cnVjdGlvbnM7CisKKyAgIC8qIEZyb20gcGFnZSAyMSAocGFnZSAyNyBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjIwIHNwZWMsCisgICAgKgorICAgICogICAiRnVuY3Rpb24gZGVjbGFyYXRpb25zIChwcm90b3R5cGVzKSBjYW5ub3Qgb2NjdXIgaW5zaWRlIG9mIGZ1bmN0aW9uczsKKyAgICAqICAgdGhleSBtdXN0IGJlIGF0IGdsb2JhbCBzY29wZSwgb3IgZm9yIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMsIG91dHNpZGUKKyAgICAqICAgdGhlIGdsb2JhbCBzY29wZS4iCisgICAgKgorICAgICogRnJvbSBwYWdlIDI3IChwYWdlIDMzIG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIEVTIDEuMDAuMTYgc3BlYywKKyAgICAqCisgICAgKiAgICJVc2VyIGRlZmluZWQgZnVuY3Rpb25zIG1heSBvbmx5IGJlIGRlZmluZWQgd2l0aGluIHRoZSBnbG9iYWwgc2NvcGUuIgorICAgICoKKyAgICAqIE5vdGUgdGhhdCB0aGlzIGxhbmd1YWdlIGRvZXMgbm90IGFwcGVhciBpbiBHTFNMIDEuMTAuCisgICAgKi8KKyAgIGlmICgoc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24gIT0gTlVMTCkgJiYKKyAgICAgICBzdGF0ZS0+aXNfdmVyc2lvbigxMjAsIDEwMCkpIHsKKyAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorCQkgICAgICAgImRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uIGAlcycgbm90IGFsbG93ZWQgd2l0aGluICIKKwkJICAgICAgICJmdW5jdGlvbiBib2R5IiwgbmFtZSk7CisgICB9CisKKyAgIHZhbGlkYXRlX2lkZW50aWZpZXIobmFtZSwgdGhpcy0+Z2V0X2xvY2F0aW9uKCksIHN0YXRlKTsKKworICAgLyogQ29udmVydCB0aGUgbGlzdCBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzIHRvIEhJUiBub3cgc28gdGhhdCB0aGV5IGNhbiBiZQorICAgICogdXNlZCBiZWxvdyB0byBjb21wYXJlIHRoaXMgZnVuY3Rpb24ncyBzaWduYXR1cmUgd2l0aCBwcmV2aW91c2x5IHNlZW4KKyAgICAqIHNpZ25hdHVyZXMgZm9yIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuCisgICAgKi8KKyAgIGFzdF9wYXJhbWV0ZXJfZGVjbGFyYXRvcjo6cGFyYW1ldGVyc190b19oaXIoJiB0aGlzLT5wYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19kZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGhpcl9wYXJhbWV0ZXJzLCBzdGF0ZSk7CisKKyAgIGNvbnN0IGNoYXIgKnJldHVybl90eXBlX25hbWU7CisgICBjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlID0KKyAgICAgIHRoaXMtPnJldHVybl90eXBlLT5nbHNsX3R5cGUoJiByZXR1cm5fdHlwZV9uYW1lLCBzdGF0ZSk7CisKKyAgIGlmICghcmV0dXJuX3R5cGUpIHsKKyAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gYCVzJyBoYXMgdW5kZWNsYXJlZCByZXR1cm4gdHlwZSBgJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcmV0dXJuX3R5cGVfbmFtZSk7CisgICAgICByZXR1cm5fdHlwZSA9IGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKyAgIH0KKworICAgLyogRnJvbSBwYWdlIDU2IChwYWdlIDYyIG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMzAgc3BlYzoKKyAgICAqICJObyBxdWFsaWZpZXIgaXMgYWxsb3dlZCBvbiB0aGUgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbi4iCisgICAgKi8KKyAgIGlmICh0aGlzLT5yZXR1cm5fdHlwZS0+aGFzX3F1YWxpZmllcnMoKSkgeworICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gYCVzJyByZXR1cm4gdHlwZSBoYXMgcXVhbGlmaWVycyIsIG5hbWUpOworICAgfQorCisgICAvKiBTZWN0aW9uIDYuMSAoRnVuY3Rpb24gRGVmaW5pdGlvbnMpIG9mIHRoZSBHTFNMIDEuMjAgc3BlYyBzYXlzOgorICAgICoKKyAgICAqICAgICAiQXJyYXlzIGFyZSBhbGxvd2VkIGFzIGFyZ3VtZW50cyBhbmQgYXMgdGhlIHJldHVybiB0eXBlLiBJbiBib3RoCisgICAgKiAgICAgY2FzZXMsIHRoZSBhcnJheSBtdXN0IGJlIGV4cGxpY2l0bHkgc2l6ZWQuIgorICAgICovCisgICBpZiAocmV0dXJuX3R5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkgeworICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gYCVzJyByZXR1cm4gdHlwZSBhcnJheSBtdXN0IGJlIGV4cGxpY2l0bHkgIgorICAgICAgICAgICAgICAgICAgICAgICAic2l6ZWQiLCBuYW1lKTsKKyAgIH0KKworICAgLyogRnJvbSBzZWN0aW9uIDQuMS43IG9mIHRoZSBHTFNMIDQuNDAgc3BlYzoKKyAgICAqCisgICAgKiAgICAiW09wYXF1ZSB0eXBlc10gY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXMgZnVuY3Rpb24gcGFyYW1ldGVycworICAgICogICAgIG9yIHVuaWZvcm0tcXVhbGlmaWVkIHZhcmlhYmxlcy4iCisgICAgKi8KKyAgIGlmIChyZXR1cm5fdHlwZS0+Y29udGFpbnNfb3BhcXVlKCkpIHsKKyAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gYCVzJyByZXR1cm4gdHlwZSBjYW4ndCBjb250YWluIGFuIG9wYXF1ZSB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICB9CisKKyAgIC8qIFZlcmlmeSB0aGF0IHRoaXMgZnVuY3Rpb24ncyBzaWduYXR1cmUgZWl0aGVyIGRvZXNuJ3QgbWF0Y2ggYSBwcmV2aW91c2x5CisgICAgKiBzZWVuIHNpZ25hdHVyZSBmb3IgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUsIG9yLCBpZiBhIG1hdGNoIGlzIGZvdW5kLAorICAgICogdGhhdCB0aGUgcHJldmlvdXNseSBzZWVuIHNpZ25hdHVyZSBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgZGVmaW5pdGlvbi4KKyAgICAqLworICAgZiA9IHN0YXRlLT5zeW1ib2xzLT5nZXRfZnVuY3Rpb24obmFtZSk7CisgICBpZiAoZiAhPSBOVUxMICYmIChzdGF0ZS0+ZXNfc2hhZGVyIHx8IGYtPmhhc191c2VyX3NpZ25hdHVyZSgpKSkgeworICAgICAgc2lnID0gZi0+ZXhhY3RfbWF0Y2hpbmdfc2lnbmF0dXJlKHN0YXRlLCAmaGlyX3BhcmFtZXRlcnMpOworICAgICAgaWYgKHNpZyAhPSBOVUxMKSB7CisgICAgICAgICBjb25zdCBjaGFyICpiYWR2YXIgPSBzaWctPnF1YWxpZmllcnNfbWF0Y2goJmhpcl9wYXJhbWV0ZXJzKTsKKyAgICAgICAgIGlmIChiYWR2YXIgIT0gTlVMTCkgeworICAgICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImZ1bmN0aW9uIGAlcycgcGFyYW1ldGVyIGAlcycgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhbGlmaWVycyBkb24ndCBtYXRjaCBwcm90b3R5cGUiLCBuYW1lLCBiYWR2YXIpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoc2lnLT5yZXR1cm5fdHlwZSAhPSByZXR1cm5fdHlwZSkgeworICAgICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImZ1bmN0aW9uIGAlcycgcmV0dXJuIHR5cGUgZG9lc24ndCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaCBwcm90b3R5cGUiLCBuYW1lKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHNpZy0+aXNfZGVmaW5lZCkgeworICAgICAgICAgICAgaWYgKGlzX2RlZmluaXRpb24pIHsKKyAgICAgICAgICAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgImZ1bmN0aW9uIGAlcycgcmVkZWZpbmVkIiwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgLyogV2UganVzdCBlbmNvdW50ZXJlZCBhIHByb3RvdHlwZSB0aGF0IGV4YWN0bHkgbWF0Y2hlcyBhCisgICAgICAgICAgICAgICAgKiBmdW5jdGlvbiB0aGF0J3MgYWxyZWFkeSBiZWVuIGRlZmluZWQuICBUaGlzIGlzIHJlZHVuZGFudCwKKyAgICAgICAgICAgICAgICAqIGFuZCB3ZSBzaG91bGQgaWdub3JlIGl0LgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBmID0gbmV3KGN0eCkgaXJfZnVuY3Rpb24obmFtZSk7CisgICAgICBpZiAoIXN0YXRlLT5zeW1ib2xzLT5hZGRfZnVuY3Rpb24oZikpIHsKKyAgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gbmFtZSBzaGFkb3dzIGEgbm9uLWZ1bmN0aW9uIHVzZSBvZiB0aGUgc2FtZSBuYW1lLiAqLworICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImZ1bmN0aW9uIG5hbWUgYCVzJyBjb25mbGljdHMgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tZnVuY3Rpb24iLCBuYW1lKTsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBlbWl0X2Z1bmN0aW9uKHN0YXRlLCBmKTsKKyAgIH0KKworICAgLyogVmVyaWZ5IHRoZSByZXR1cm4gdHlwZSBvZiBtYWluKCkgKi8KKyAgIGlmIChzdHJjbXAobmFtZSwgIm1haW4iKSA9PSAwKSB7CisgICAgICBpZiAoISByZXR1cm5fdHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICAgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgIm1haW4oKSBtdXN0IHJldHVybiB2b2lkIik7CisgICAgICB9CisKKyAgICAgIGlmICghaGlyX3BhcmFtZXRlcnMuaXNfZW1wdHkoKSkgeworICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJtYWluKCkgbXVzdCBub3QgdGFrZSBhbnkgcGFyYW1ldGVycyIpOworICAgICAgfQorICAgfQorCisgICAvKiBGaW5pc2ggc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuZXcgZnVuY3Rpb24gaW4gaXRzIHNpZ25hdHVyZS4KKyAgICAqLworICAgaWYgKHNpZyA9PSBOVUxMKSB7CisgICAgICBzaWcgPSBuZXcoY3R4KSBpcl9mdW5jdGlvbl9zaWduYXR1cmUocmV0dXJuX3R5cGUpOworICAgICAgZi0+YWRkX3NpZ25hdHVyZShzaWcpOworICAgfQorCisgICBzaWctPnJlcGxhY2VfcGFyYW1ldGVycygmaGlyX3BhcmFtZXRlcnMpOworICAgc2lnbmF0dXJlID0gc2lnOworCisgICAvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKHByb3RvdHlwZXMpIGRvIG5vdCBoYXZlIHItdmFsdWVzLgorICAgICovCisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9ydmFsdWUgKgorYXN0X2Z1bmN0aW9uX2RlZmluaXRpb246OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcHJvdG90eXBlLT5pc19kZWZpbml0aW9uID0gdHJ1ZTsKKyAgIHByb3RvdHlwZS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZ25hdHVyZSA9IHByb3RvdHlwZS0+c2lnbmF0dXJlOworICAgaWYgKHNpZ25hdHVyZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGFzc2VydChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKTsKKyAgIHN0YXRlLT5jdXJyZW50X2Z1bmN0aW9uID0gc2lnbmF0dXJlOworICAgc3RhdGUtPmZvdW5kX3JldHVybiA9IGZhbHNlOworCisgICAvKiBEdXBsaWNhdGUgcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgcHJvdG90eXBlIGFzIGNvbmNyZXRlIHZhcmlhYmxlcy4KKyAgICAqIEFkZCB0aGVzZSB0byB0aGUgc3ltYm9sIHRhYmxlLgorICAgICovCisgICBzdGF0ZS0+c3ltYm9scy0+cHVzaF9zY29wZSgpOworICAgZm9yZWFjaF9saXN0KG4sICZzaWduYXR1cmUtPnBhcmFtZXRlcnMpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG4pLT5hc192YXJpYWJsZSgpOworCisgICAgICBhc3NlcnQodmFyICE9IE5VTEwpOworCisgICAgICAvKiBUaGUgb25seSB3YXkgYSBwYXJhbWV0ZXIgd291bGQgImV4aXN0IiBpcyBpZiB0d28gcGFyYW1ldGVycyBoYXZlCisgICAgICAgKiB0aGUgc2FtZSBuYW1lLgorICAgICAgICovCisgICAgICBpZiAoc3RhdGUtPnN5bWJvbHMtPm5hbWVfZGVjbGFyZWRfdGhpc19zY29wZSh2YXItPm5hbWUpKSB7CisgICAgICAgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgInBhcmFtZXRlciBgJXMnIHJlZGVjbGFyZWQiLCB2YXItPm5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHN0YXRlLT5zeW1ib2xzLT5hZGRfdmFyaWFibGUodmFyKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogQ29udmVydCB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24gdG8gSElSLiAqLworICAgdGhpcy0+Ym9keS0+aGlyKCZzaWduYXR1cmUtPmJvZHksIHN0YXRlKTsKKyAgIHNpZ25hdHVyZS0+aXNfZGVmaW5lZCA9IHRydWU7CisKKyAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKworICAgYXNzZXJ0KHN0YXRlLT5jdXJyZW50X2Z1bmN0aW9uID09IHNpZ25hdHVyZSk7CisgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7CisKKyAgIGlmICghc2lnbmF0dXJlLT5yZXR1cm5fdHlwZS0+aXNfdm9pZCgpICYmICFzdGF0ZS0+Zm91bmRfcmV0dXJuKSB7CisgICAgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJmdW5jdGlvbiBgJXMnIGhhcyBub24tdm9pZCByZXR1cm4gdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICIlcywgYnV0IG5vIHJldHVybiBzdGF0ZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUtPmZ1bmN0aW9uX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLT5yZXR1cm5fdHlwZS0+bmFtZSk7CisgICB9CisKKyAgIC8qIEZ1bmN0aW9uIGRlZmluaXRpb25zIGRvIG5vdCBoYXZlIHItdmFsdWVzLgorICAgICovCisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9ydmFsdWUgKgorYXN0X2p1bXBfc3RhdGVtZW50OjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKworICAgc3dpdGNoIChtb2RlKSB7CisgICBjYXNlIGFzdF9yZXR1cm46IHsKKyAgICAgIGlyX3JldHVybiAqaW5zdDsKKyAgICAgIGFzc2VydChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbik7CisKKyAgICAgIGlmIChvcHRfcmV0dXJuX3ZhbHVlKSB7CisgICAgICAgICBpcl9ydmFsdWUgKnJldCA9IG9wdF9yZXR1cm5fdmFsdWUtPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgICAgICAgLyogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gdHlwZSBjYW4gYmUgTlVMTCBpZiB0aGUgc2hhZGVyIHNheXMKKyAgICAgICAgICAqICdyZXR1cm4gZm9vKCk7JyBhbmQgZm9vKCkgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdm9pZC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBOT1RFOiBUaGUgR0xTTCBzcGVjIGRvZXNuJ3Qgc2F5IHRoYXQgdGhpcyBpcyBhbiBlcnJvci4gIFRoZSB0eXBlCisgICAgICAgICAgKiBvZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHZvaWQuICBJZiB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzCisgICAgICAgICAgKiBhbHNvIHZvaWQsIHRoZW4gdGhpcyBzaG91bGQgY29tcGlsZSB3aXRob3V0IGVycm9yLiAgU2VyaW91c2x5LgorICAgICAgICAgICovCisgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHJldF90eXBlID0KKyAgICAgICAgICAgIChyZXQgPT0gTlVMTCkgPyBnbHNsX3R5cGU6OnZvaWRfdHlwZSA6IHJldC0+dHlwZTsKKworICAgICAgICAgLyogSW1wbGljaXQgY29udmVyc2lvbnMgYXJlIG5vdCBhbGxvd2VkIGZvciByZXR1cm4gdmFsdWVzIHByaW9yIHRvCisgICAgICAgICAgKiBBUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrLgorICAgICAgICAgICovCisgICAgICAgICBpZiAoc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24tPnJldHVybl90eXBlICE9IHJldF90eXBlKSB7CisgICAgICAgICAgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICAgICAgICAgICBpZiAoc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2tfZW5hYmxlKSB7CisgICAgICAgICAgICAgICBpZiAoIWFwcGx5X2ltcGxpY2l0X2NvbnZlcnNpb24oc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24tPnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgcmV0dXJuIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzLCBpbiBmdW5jdGlvbiBgJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24tPnJldHVybl90eXBlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbi0+ZnVuY3Rpb25fbmFtZSgpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImByZXR1cm4nIHdpdGggd3JvbmcgdHlwZSAlcywgaW4gZnVuY3Rpb24gYCVzJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfdHlwZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24tPmZ1bmN0aW9uX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24tPnJldHVybl90eXBlLT5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24tPnJldHVybl90eXBlLT5iYXNlX3R5cGUgPT0KKyAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1ZPSUQpIHsKKyAgICAgICAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgICAgICAgICAgIC8qIFRoZSBBUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrLCBHTFNMIEVTIDMuMCwgYW5kIEdMU0wgNC4yMAorICAgICAgICAgICAgICogc3BlY3MgYWRkIGEgY2xhcmlmaWNhdGlvbjoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgICAiQSB2b2lkIGZ1bmN0aW9uIGNhbiBvbmx5IHVzZSByZXR1cm4gd2l0aG91dCBhIHJldHVybiBhcmd1bWVudCwgZXZlbiBpZgorICAgICAgICAgICAgICogICAgIHRoZSByZXR1cm4gYXJndW1lbnQgaGFzIHZvaWQgdHlwZS4gUmV0dXJuIHN0YXRlbWVudHMgb25seSBhY2NlcHQgdmFsdWVzOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICAgICAgdm9pZCBmdW5jMSgpIHsgfQorICAgICAgICAgICAgICogICAgICAgICB2b2lkIGZ1bmMyKCkgeyByZXR1cm4gZnVuYzEoKTsgfSAvLyBpbGxlZ2FsIHJldHVybiBzdGF0ZW1lbnQiCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm9pZCBmdW5jdGlvbnMgY2FuIG9ubHkgdXNlIGByZXR1cm4nIHdpdGhvdXQgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gYXJndW1lbnQiKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaW5zdCA9IG5ldyhjdHgpIGlyX3JldHVybihyZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlmIChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbi0+cmV0dXJuX3R5cGUtPmJhc2VfdHlwZSAhPQorICAgICAgICAgICAgIEdMU0xfVFlQRV9WT0lEKSB7CisgICAgICAgICAgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImByZXR1cm4nIHdpdGggbm8gdmFsdWUsIGluIGZ1bmN0aW9uICVzIHJldHVybmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tdm9pZCIsCisgICAgICAgICAgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbi0+ZnVuY3Rpb25fbmFtZSgpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGluc3QgPSBuZXcoY3R4KSBpcl9yZXR1cm47CisgICAgICB9CisKKyAgICAgIHN0YXRlLT5mb3VuZF9yZXR1cm4gPSB0cnVlOworICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoaW5zdCk7CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBhc3RfZGlzY2FyZDoKKyAgICAgIGlmIChzdGF0ZS0+c3RhZ2UgIT0gTUVTQV9TSEFERVJfRlJBR01FTlQpIHsKKyAgICAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYGRpc2NhcmQnIG1heSBvbmx5IGFwcGVhciBpbiBhIGZyYWdtZW50IHNoYWRlciIpOworICAgICAgfQorICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwobmV3KGN0eCkgaXJfZGlzY2FyZCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfYnJlYWs6CisgICBjYXNlIGFzdF9jb250aW51ZToKKyAgICAgIGlmIChtb2RlID09IGFzdF9jb250aW51ZSAmJgorICAgICAgICAgIHN0YXRlLT5sb29wX25lc3RpbmdfYXN0ID09IE5VTEwpIHsKKyAgICAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAiY29udGludWUgbWF5IG9ubHkgYXBwZWFyIGluIGEgbG9vcCIpOworICAgICAgfSBlbHNlIGlmIChtb2RlID09IGFzdF9icmVhayAmJgorICAgICAgICAgc3RhdGUtPmxvb3BfbmVzdGluZ19hc3QgPT0gTlVMTCAmJgorICAgICAgICAgc3RhdGUtPnN3aXRjaF9zdGF0ZS5zd2l0Y2hfbmVzdGluZ19hc3QgPT0gTlVMTCkgeworICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJicmVhayBtYXkgb25seSBhcHBlYXIgaW4gYSBsb29wIG9yIGEgc3dpdGNoIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgLyogRm9yIGEgbG9vcCwgaW5saW5lIHRoZSBmb3IgbG9vcCBleHByZXNzaW9uIGFnYWluLCBzaW5jZSB3ZSBkb24ndAorICAgICAgICAgICoga25vdyB3aGVyZSBuZWFyIHRoZSBlbmQgb2YgdGhlIGxvb3AgYm9keSB0aGUgbm9ybWFsIGNvcHkgb2YgaXQgaXMKKyAgICAgICAgICAqIGdvaW5nIHRvIGJlIHBsYWNlZC4gIFNhbWUgZ29lcyBmb3IgdGhlIGNvbmRpdGlvbiBmb3IgYSBkby13aGlsZQorICAgICAgICAgICogbG9vcC4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHN0YXRlLT5sb29wX25lc3RpbmdfYXN0ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICBtb2RlID09IGFzdF9jb250aW51ZSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLT5sb29wX25lc3RpbmdfYXN0LT5yZXN0X2V4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgIHN0YXRlLT5sb29wX25lc3RpbmdfYXN0LT5yZXN0X2V4cHJlc3Npb24tPmhpcihpbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5sb29wX25lc3RpbmdfYXN0LT5tb2RlID09CisgICAgICAgICAgICAgICAgYXN0X2l0ZXJhdGlvbl9zdGF0ZW1lbnQ6OmFzdF9kb193aGlsZSkgeworICAgICAgICAgICAgICAgc3RhdGUtPmxvb3BfbmVzdGluZ19hc3QtPmNvbmRpdGlvbl90b19oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChzdGF0ZS0+c3dpdGNoX3N0YXRlLmlzX3N3aXRjaF9pbm5lcm1vc3QgJiYKKyAgICAgICAgICAgICBtb2RlID09IGFzdF9icmVhaykgeworICAgICAgICAgICAgLyogRm9yY2UgYnJlYWsgb3V0IG9mIHN3aXRjaCBieSBzZXR0aW5nIGlzX2JyZWFrIHN3aXRjaCBzdGF0ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IGlzX2JyZWFrX3ZhciA9IHN0YXRlLT5zd2l0Y2hfc3RhdGUuaXNfYnJlYWtfdmFyOworICAgICAgICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmNvbnN0IGRlcmVmX2lzX2JyZWFrX3ZhciA9CisgICAgICAgICAgICAgICBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShpc19icmVha192YXIpOworICAgICAgICAgICAgaXJfY29uc3RhbnQgKmNvbnN0IHRydWVfdmFsID0gbmV3KGN0eCkgaXJfY29uc3RhbnQodHJ1ZSk7CisgICAgICAgICAgICBpcl9hc3NpZ25tZW50ICpjb25zdCBzZXRfYnJlYWtfdmFyID0KKyAgICAgICAgICAgICAgIG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQoZGVyZWZfaXNfYnJlYWtfdmFyLCB0cnVlX3ZhbCk7CisJICAgIAorICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoc2V0X2JyZWFrX3Zhcik7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlyX2xvb3BfanVtcCAqY29uc3QganVtcCA9CisgICAgICAgICAgICAgICBuZXcoY3R4KSBpcl9sb29wX2p1bXAoKG1vZGUgPT0gYXN0X2JyZWFrKQorICAgICAgICAgICAgICAgICAgPyBpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWsKKyAgICAgICAgICAgICAgICAgIDogaXJfbG9vcF9qdW1wOjpqdW1wX2NvbnRpbnVlKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKGp1bXApOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgIH0KKworICAgLyogSnVtcCBpbnN0cnVjdGlvbnMgZG8gbm90IGhhdmUgci12YWx1ZXMuCisgICAgKi8KKyAgIHJldHVybiBOVUxMOworfQorCisKK2lyX3J2YWx1ZSAqCithc3Rfc2VsZWN0aW9uX3N0YXRlbWVudDo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKworICAgaXJfcnZhbHVlICpjb25zdCBjb25kaXRpb24gPSB0aGlzLT5jb25kaXRpb24tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgLyogRnJvbSBwYWdlIDY2IChwYWdlIDcyIG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuNTAgc3BlYzoKKyAgICAqCisgICAgKiAgICAiQW55IGV4cHJlc3Npb24gd2hvc2UgdHlwZSBldmFsdWF0ZXMgdG8gYSBCb29sZWFuIGNhbiBiZSB1c2VkIGFzIHRoZQorICAgICogICAgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBib29sLWV4cHJlc3Npb24uIFZlY3RvciB0eXBlcyBhcmUgbm90IGFjY2VwdGVkCisgICAgKiAgICBhcyB0aGUgZXhwcmVzc2lvbiB0byBpZi4iCisgICAgKgorICAgICogVGhlIGNoZWNrcyBhcmUgc2VwYXJhdGVkIHNvIHRoYXQgaGlnaGVyIHF1YWxpdHkgZGlhZ25vc3RpY3MgY2FuIGJlCisgICAgKiBnZW5lcmF0ZWQgZm9yIGNhc2VzIHdoZXJlIGJvdGggcnVsZXMgYXJlIHZpb2xhdGVkLgorICAgICovCisgICBpZiAoIWNvbmRpdGlvbi0+dHlwZS0+aXNfYm9vbGVhbigpIHx8ICFjb25kaXRpb24tPnR5cGUtPmlzX3NjYWxhcigpKSB7CisgICAgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmNvbmRpdGlvbi0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAiaWYtc3RhdGVtZW50IGNvbmRpdGlvbiBtdXN0IGJlIHNjYWxhciAiCisgICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuIik7CisgICB9CisKKyAgIGlyX2lmICpjb25zdCBzdG10ID0gbmV3KGN0eCkgaXJfaWYoY29uZGl0aW9uKTsKKworICAgaWYgKHRoZW5fc3RhdGVtZW50ICE9IE5VTEwpIHsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wdXNoX3Njb3BlKCk7CisgICAgICB0aGVuX3N0YXRlbWVudC0+aGlyKCYgc3RtdC0+dGhlbl9pbnN0cnVjdGlvbnMsIHN0YXRlKTsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKyAgIH0KKworICAgaWYgKGVsc2Vfc3RhdGVtZW50ICE9IE5VTEwpIHsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wdXNoX3Njb3BlKCk7CisgICAgICBlbHNlX3N0YXRlbWVudC0+aGlyKCYgc3RtdC0+ZWxzZV9pbnN0cnVjdGlvbnMsIHN0YXRlKTsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKyAgIH0KKworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoc3RtdCk7CisKKyAgIC8qIGlmLXN0YXRlbWVudHMgZG8gbm90IGhhdmUgci12YWx1ZXMuCisgICAgKi8KKyAgIHJldHVybiBOVUxMOworfQorCisKK2lyX3J2YWx1ZSAqCithc3Rfc3dpdGNoX3N0YXRlbWVudDo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKworICAgaXJfcnZhbHVlICpjb25zdCB0ZXN0X2V4cHJlc3Npb24gPQorICAgICAgdGhpcy0+dGVzdF9leHByZXNzaW9uLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgIC8qIEZyb20gcGFnZSA2NiAocGFnZSA1NSBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgKgorICAgICogICAgIlRoZSB0eXBlIG9mIGluaXQtZXhwcmVzc2lvbiBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQgbXVzdCBiZSBhIAorICAgICogICAgIHNjYWxhciBpbnRlZ2VyLiIgCisgICAgKi8KKyAgIGlmICghdGVzdF9leHByZXNzaW9uLT50eXBlLT5pc19zY2FsYXIoKSB8fAorICAgICAgICF0ZXN0X2V4cHJlc3Npb24tPnR5cGUtPmlzX2ludGVnZXIoKSkgeworICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT50ZXN0X2V4cHJlc3Npb24tPmdldF9sb2NhdGlvbigpOworCisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaC1zdGF0ZW1lbnQgZXhwcmVzc2lvbiBtdXN0IGJlIHNjYWxhciAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIik7CisgICB9CisKKyAgIC8qIFRyYWNrIHRoZSBzd2l0Y2gtc3RhdGVtZW50IG5lc3RpbmcgaW4gYSBzdGFjay1saWtlIG1hbm5lci4KKyAgICAqLworICAgc3RydWN0IGdsc2xfc3dpdGNoX3N0YXRlIHNhdmVkID0gc3RhdGUtPnN3aXRjaF9zdGF0ZTsKKworICAgc3RhdGUtPnN3aXRjaF9zdGF0ZS5pc19zd2l0Y2hfaW5uZXJtb3N0ID0gdHJ1ZTsKKyAgIHN0YXRlLT5zd2l0Y2hfc3RhdGUuc3dpdGNoX25lc3RpbmdfYXN0ID0gdGhpczsKKyAgIHN0YXRlLT5zd2l0Y2hfc3RhdGUubGFiZWxzX2h0ID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfcG9pbnRlcl9oYXNoLAorCQkJCQkJICAgaGFzaF90YWJsZV9wb2ludGVyX2NvbXBhcmUpOworICAgc3RhdGUtPnN3aXRjaF9zdGF0ZS5wcmV2aW91c19kZWZhdWx0ID0gTlVMTDsKKworICAgLyogSW5pdGFsaXplIGlzX2ZhbGx0aHJ1IHN0YXRlIHRvIGZhbHNlLgorICAgICovCisgICBpcl9ydmFsdWUgKmNvbnN0IGlzX2ZhbGx0aHJ1X3ZhbCA9IG5ldyAoY3R4KSBpcl9jb25zdGFudChmYWxzZSk7CisgICBzdGF0ZS0+c3dpdGNoX3N0YXRlLmlzX2ZhbGx0aHJ1X3ZhciA9CisgICAgICBuZXcoY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OmJvb2xfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfaXNfZmFsbHRocnVfdG1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoc3RhdGUtPnN3aXRjaF9zdGF0ZS5pc19mYWxsdGhydV92YXIpOworCisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfaXNfZmFsbHRocnVfdmFyID0KKyAgICAgIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHN0YXRlLT5zd2l0Y2hfc3RhdGUuaXNfZmFsbHRocnVfdmFyKTsKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQoZGVyZWZfaXNfZmFsbHRocnVfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19mYWxsdGhydV92YWwpKTsKKworICAgLyogSW5pdGFsaXplIGlzX2JyZWFrIHN0YXRlIHRvIGZhbHNlLgorICAgICovCisgICBpcl9ydmFsdWUgKmNvbnN0IGlzX2JyZWFrX3ZhbCA9IG5ldyAoY3R4KSBpcl9jb25zdGFudChmYWxzZSk7CisgICBzdGF0ZS0+c3dpdGNoX3N0YXRlLmlzX2JyZWFrX3ZhciA9CisgICAgICBuZXcoY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OmJvb2xfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hfaXNfYnJlYWtfdG1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoc3RhdGUtPnN3aXRjaF9zdGF0ZS5pc19icmVha192YXIpOworCisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfaXNfYnJlYWtfdmFyID0KKyAgICAgIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHN0YXRlLT5zd2l0Y2hfc3RhdGUuaXNfYnJlYWtfdmFyKTsKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQoZGVyZWZfaXNfYnJlYWtfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19icmVha192YWwpKTsKKworICAgLyogQ2FjaGUgdGVzdCBleHByZXNzaW9uLgorICAgICovCisgICB0ZXN0X3RvX2hpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgLyogRW1pdCBjb2RlIGZvciBib2R5IG9mIHN3aXRjaCBzdG10LgorICAgICovCisgICBib2R5LT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgIGhhc2hfdGFibGVfZHRvcihzdGF0ZS0+c3dpdGNoX3N0YXRlLmxhYmVsc19odCk7CisKKyAgIHN0YXRlLT5zd2l0Y2hfc3RhdGUgPSBzYXZlZDsKKworICAgLyogU3dpdGNoIHN0YXRlbWVudHMgZG8gbm90IGhhdmUgci12YWx1ZXMuICovCisgICByZXR1cm4gTlVMTDsKK30KKworCit2b2lkCithc3Rfc3dpdGNoX3N0YXRlbWVudDo6dGVzdF90b19oaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisKKyAgIC8qIENhY2hlIHZhbHVlIG9mIHRlc3QgZXhwcmVzc2lvbi4gKi8KKyAgIGlyX3J2YWx1ZSAqY29uc3QgdGVzdF92YWwgPQorICAgICAgdGVzdF9leHByZXNzaW9uLT5oaXIoaW5zdHJ1Y3Rpb25zLAorCQkJICAgc3RhdGUpOworCisgICBzdGF0ZS0+c3dpdGNoX3N0YXRlLnRlc3RfdmFyID0gbmV3KGN0eCkgaXJfdmFyaWFibGUodGVzdF92YWwtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaF90ZXN0X3RtcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdGVzdF92YXIgPQorICAgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoc3RhdGUtPnN3aXRjaF9zdGF0ZS50ZXN0X3Zhcik7CisKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHN0YXRlLT5zd2l0Y2hfc3RhdGUudGVzdF92YXIpOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwobmV3KGN0eCkgaXJfYXNzaWdubWVudChkZXJlZl90ZXN0X3ZhciwgdGVzdF92YWwpKTsKK30KKworCitpcl9ydmFsdWUgKgorYXN0X3N3aXRjaF9ib2R5OjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBpZiAoc3RtdHMgIT0gTlVMTCkKKyAgICAgIHN0bXRzLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgIC8qIFN3aXRjaCBib2RpZXMgZG8gbm90IGhhdmUgci12YWx1ZXMuICovCisgICByZXR1cm4gTlVMTDsKK30KKworaXJfcnZhbHVlICoKK2FzdF9jYXNlX3N0YXRlbWVudF9saXN0OjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIGZvcmVhY2hfbGlzdF90eXBlZCAoYXN0X2Nhc2Vfc3RhdGVtZW50LCBjYXNlX3N0bXQsIGxpbmssICYgdGhpcy0+Y2FzZXMpCisgICAgICBjYXNlX3N0bXQtPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgLyogQ2FzZSBzdGF0ZW1lbnRzIGRvIG5vdCBoYXZlIHItdmFsdWVzLiAqLworICAgcmV0dXJuIE5VTEw7Cit9CisKK2lyX3J2YWx1ZSAqCithc3RfY2FzZV9zdGF0ZW1lbnQ6OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIGxhYmVscy0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICAvKiBDb25kaXRpb25hbGx5IHNldCBmYWxsdGhydSBzdGF0ZSBiYXNlZCBvbiBicmVhayBzdGF0ZS4gKi8KKyAgIGlyX2NvbnN0YW50ICpjb25zdCBmYWxzZV92YWwgPSBuZXcoc3RhdGUpIGlyX2NvbnN0YW50KGZhbHNlKTsKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpjb25zdCBkZXJlZl9pc19mYWxsdGhydV92YXIgPQorICAgICAgbmV3KHN0YXRlKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShzdGF0ZS0+c3dpdGNoX3N0YXRlLmlzX2ZhbGx0aHJ1X3Zhcik7CisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqY29uc3QgZGVyZWZfaXNfYnJlYWtfdmFyID0KKyAgICAgIG5ldyhzdGF0ZSkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoc3RhdGUtPnN3aXRjaF9zdGF0ZS5pc19icmVha192YXIpOworICAgaXJfYXNzaWdubWVudCAqY29uc3QgcmVzZXRfZmFsbHRocnVfb25fYnJlYWsgPQorICAgICAgbmV3KHN0YXRlKSBpcl9hc3NpZ25tZW50KGRlcmVmX2lzX2ZhbGx0aHJ1X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZV92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWZfaXNfYnJlYWtfdmFyKTsKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHJlc2V0X2ZhbGx0aHJ1X29uX2JyZWFrKTsKKworICAgLyogR3VhcmQgY2FzZSBzdGF0ZW1lbnRzIGRlcGVuZGluZyBvbiBmYWxsdGhydSBzdGF0ZS4gKi8KKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpjb25zdCBkZXJlZl9mYWxsdGhydV9ndWFyZCA9CisgICAgICBuZXcoc3RhdGUpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHN0YXRlLT5zd2l0Y2hfc3RhdGUuaXNfZmFsbHRocnVfdmFyKTsKKyAgIGlyX2lmICpjb25zdCB0ZXN0X2ZhbGx0aHJ1ID0gbmV3KHN0YXRlKSBpcl9pZihkZXJlZl9mYWxsdGhydV9ndWFyZCk7CisKKyAgIGZvcmVhY2hfbGlzdF90eXBlZCAoYXN0X25vZGUsIHN0bXQsIGxpbmssICYgdGhpcy0+c3RtdHMpCisgICAgICBzdG10LT5oaXIoJiB0ZXN0X2ZhbGx0aHJ1LT50aGVuX2luc3RydWN0aW9ucywgc3RhdGUpOworCisgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbCh0ZXN0X2ZhbGx0aHJ1KTsKKworICAgLyogQ2FzZSBzdGF0ZW1lbnRzIGRvIG5vdCBoYXZlIHItdmFsdWVzLiAqLworICAgcmV0dXJuIE5VTEw7Cit9CisKKworaXJfcnZhbHVlICoKK2FzdF9jYXNlX2xhYmVsX2xpc3Q6OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9jYXNlX2xhYmVsLCBsYWJlbCwgbGluaywgJiB0aGlzLT5sYWJlbHMpCisgICAgICBsYWJlbC0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICAvKiBDYXNlIGxhYmVscyBkbyBub3QgaGF2ZSByLXZhbHVlcy4gKi8KKyAgIHJldHVybiBOVUxMOworfQorCitpcl9ydmFsdWUgKgorYXN0X2Nhc2VfbGFiZWw6OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpkZXJlZl9mYWxsdGhydV92YXIgPQorICAgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoc3RhdGUtPnN3aXRjaF9zdGF0ZS5pc19mYWxsdGhydV92YXIpOworCisgICBpcl9ydmFsdWUgKmNvbnN0IHRydWVfdmFsID0gbmV3KGN0eCkgaXJfY29uc3RhbnQodHJ1ZSk7CisKKyAgIC8qIElmIG5vdCBkZWZhdWx0IGNhc2UsIC4uLiAqLworICAgaWYgKHRoaXMtPnRlc3RfdmFsdWUgIT0gTlVMTCkgeworICAgICAgLyogQ29uZGl0aW9uYWxseSBzZXQgZmFsbHRocnUgc3RhdGUgYmFzZWQgb24KKyAgICAgICAqIGNvbXBhcmlzb24gb2YgY2FjaGVkIHRlc3QgZXhwcmVzc2lvbiB2YWx1ZSB0byBjYXNlIGxhYmVsLgorICAgICAgICovCisgICAgICBpcl9ydmFsdWUgKmNvbnN0IGxhYmVsX3J2YWwgPSB0aGlzLT50ZXN0X3ZhbHVlLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisgICAgICBpcl9jb25zdGFudCAqbGFiZWxfY29uc3QgPSBsYWJlbF9ydmFsLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisKKyAgICAgIGlmICghbGFiZWxfY29uc3QpIHsKKyAgICAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+dGVzdF92YWx1ZS0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoIHN0YXRlbWVudCBjYXNlIGxhYmVsIG11c3QgYmUgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdGFudCBleHByZXNzaW9uIik7CisKKyAgICAgICAgIC8qIFN0dWZmIGEgZHVtbXkgdmFsdWUgaW4gdG8gYWxsb3cgcHJvY2Vzc2luZyB0byBjb250aW51ZS4gKi8KKyAgICAgICAgIGxhYmVsX2NvbnN0ID0gbmV3KGN0eCkgaXJfY29uc3RhbnQoMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgYXN0X2V4cHJlc3Npb24gKnByZXZpb3VzX2xhYmVsID0gKGFzdF9leHByZXNzaW9uICopCisgICAgICAgICBoYXNoX3RhYmxlX2ZpbmQoc3RhdGUtPnN3aXRjaF9zdGF0ZS5sYWJlbHNfaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWxhYmVsX2NvbnN0LT52YWx1ZS51WzBdKTsKKworICAgICAgICAgaWYgKHByZXZpb3VzX2xhYmVsKSB7CisgICAgICAgICAgICBZWUxUWVBFIGxvYyA9IHRoaXMtPnRlc3RfdmFsdWUtPmdldF9sb2NhdGlvbigpOworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJkdXBsaWNhdGUgY2FzZSB2YWx1ZSIpOworCisgICAgICAgICAgICBsb2MgPSBwcmV2aW91c19sYWJlbC0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwgInRoaXMgaXMgdGhlIHByZXZpb3VzIGNhc2UgbGFiZWwiKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYXNoX3RhYmxlX2luc2VydChzdGF0ZS0+c3dpdGNoX3N0YXRlLmxhYmVsc19odCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnRlc3RfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbGFiZWxfY29uc3QtPnZhbHVlLnVbMF0pOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdGVzdF92YXIgPQorICAgICAgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoc3RhdGUtPnN3aXRjaF9zdGF0ZS50ZXN0X3Zhcik7CisKKyAgICAgIGlyX3J2YWx1ZSAqY29uc3QgdGVzdF9jb25kID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9hbGxfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWZfdGVzdF92YXIpOworCisgICAgICBpcl9hc3NpZ25tZW50ICpzZXRfZmFsbHRocnVfb25fdGVzdCA9CisgICAgICAgICBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KGRlcmVmX2ZhbGx0aHJ1X3ZhciwgdHJ1ZV92YWwsIHRlc3RfY29uZCk7CisKKyAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHNldF9mYWxsdGhydV9vbl90ZXN0KTsKKyAgIH0gZWxzZSB7IC8qIGRlZmF1bHQgY2FzZSAqLworICAgICAgaWYgKHN0YXRlLT5zd2l0Y2hfc3RhdGUucHJldmlvdXNfZGVmYXVsdCkgeworICAgICAgICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUgZGVmYXVsdCBsYWJlbHMgaW4gb25lIHN3aXRjaCIpOworCisgICAgICAgICBsb2MgPSBzdGF0ZS0+c3dpdGNoX3N0YXRlLnByZXZpb3VzX2RlZmF1bHQtPmdldF9sb2NhdGlvbigpOworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJ0aGlzIGlzIHRoZSBmaXJzdCBkZWZhdWx0IGxhYmVsIik7CisgICAgICB9CisgICAgICBzdGF0ZS0+c3dpdGNoX3N0YXRlLnByZXZpb3VzX2RlZmF1bHQgPSB0aGlzOworCisgICAgICAvKiBTZXQgZmFsbHRyaHUgc3RhdGUuICovCisgICAgICBpcl9hc3NpZ25tZW50ICpzZXRfZmFsbHRocnUgPQorICAgICAgICAgbmV3KGN0eCkgaXJfYXNzaWdubWVudChkZXJlZl9mYWxsdGhydV92YXIsIHRydWVfdmFsKTsKKworICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoc2V0X2ZhbGx0aHJ1KTsKKyAgIH0KKworICAgLyogQ2FzZSBzdGF0ZW1lbnRzIGRvIG5vdCBoYXZlIHItdmFsdWVzLiAqLworICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2FzdF9pdGVyYXRpb25fc3RhdGVtZW50Ojpjb25kaXRpb25fdG9faGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgdm9pZCAqY3R4ID0gc3RhdGU7CisKKyAgIGlmIChjb25kaXRpb24gIT0gTlVMTCkgeworICAgICAgaXJfcnZhbHVlICpjb25zdCBjb25kID0KKyAgICAgICAgIGNvbmRpdGlvbi0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICAgICBpZiAoKGNvbmQgPT0gTlVMTCkKKyAgICAgICAgICB8fCAhY29uZC0+dHlwZS0+aXNfYm9vbGVhbigpIHx8ICFjb25kLT50eXBlLT5pc19zY2FsYXIoKSkgeworICAgICAgICAgWVlMVFlQRSBsb2MgPSBjb25kaXRpb24tPmdldF9sb2NhdGlvbigpOworCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxvb3AgY29uZGl0aW9uIG11c3QgYmUgc2NhbGFyIGJvb2xlYW4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAvKiBBcyB0aGUgZmlyc3QgY29kZSBpbiB0aGUgbG9vcCBib2R5LCBnZW5lcmF0ZSBhIGJsb2NrIHRoYXQgbG9va3MKKyAgICAgICAgICAqIGxpa2UgJ2lmICghY29uZGl0aW9uKSBicmVhazsnIGFzIHRoZSBsb29wIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICAgaXJfcnZhbHVlICpjb25zdCBub3RfY29uZCA9CisgICAgICAgICAgICBuZXcoY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfbG9naWNfbm90LCBjb25kKTsKKworICAgICAgICAgaXJfaWYgKmNvbnN0IGlmX3N0bXQgPSBuZXcoY3R4KSBpcl9pZihub3RfY29uZCk7CisKKyAgICAgICAgIGlyX2p1bXAgKmNvbnN0IGJyZWFrX3N0bXQgPQorICAgICAgICAgICAgbmV3KGN0eCkgaXJfbG9vcF9qdW1wKGlyX2xvb3BfanVtcDo6anVtcF9icmVhayk7CisKKyAgICAgICAgIGlmX3N0bXQtPnRoZW5faW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChicmVha19zdG10KTsKKyAgICAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKGlmX3N0bXQpOworICAgICAgfQorICAgfQorfQorCisKK2lyX3J2YWx1ZSAqCithc3RfaXRlcmF0aW9uX3N0YXRlbWVudDo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKworICAgLyogRm9yLWxvb3BzIGFuZCB3aGlsZS1sb29wcyBzdGFydCBhIG5ldyBzY29wZSwgYnV0IGRvLXdoaWxlIGxvb3BzIGRvIG5vdC4KKyAgICAqLworICAgaWYgKG1vZGUgIT0gYXN0X2RvX3doaWxlKQorICAgICAgc3RhdGUtPnN5bWJvbHMtPnB1c2hfc2NvcGUoKTsKKworICAgaWYgKGluaXRfc3RhdGVtZW50ICE9IE5VTEwpCisgICAgICBpbml0X3N0YXRlbWVudC0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICBpcl9sb29wICpjb25zdCBzdG10ID0gbmV3KGN0eCkgaXJfbG9vcCgpOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoc3RtdCk7CisKKyAgIC8qIFRyYWNrIHRoZSBjdXJyZW50IGxvb3AgbmVzdGluZy4gKi8KKyAgIGFzdF9pdGVyYXRpb25fc3RhdGVtZW50ICpuZXN0aW5nX2FzdCA9IHN0YXRlLT5sb29wX25lc3RpbmdfYXN0OworCisgICBzdGF0ZS0+bG9vcF9uZXN0aW5nX2FzdCA9IHRoaXM7CisKKyAgIC8qIExpa2V3aXNlLCBpbmRpY2F0ZSB0aGF0IGZvbGxvd2luZyBjb2RlIGlzIGNsb3Nlc3QgdG8gYSBsb29wLAorICAgICogTk9UIGNsb3Nlc3QgdG8gYSBzd2l0Y2guCisgICAgKi8KKyAgIGJvb2wgc2F2ZWRfaXNfc3dpdGNoX2lubmVybW9zdCA9IHN0YXRlLT5zd2l0Y2hfc3RhdGUuaXNfc3dpdGNoX2lubmVybW9zdDsKKyAgIHN0YXRlLT5zd2l0Y2hfc3RhdGUuaXNfc3dpdGNoX2lubmVybW9zdCA9IGZhbHNlOworCisgICBpZiAobW9kZSAhPSBhc3RfZG9fd2hpbGUpCisgICAgICBjb25kaXRpb25fdG9faGlyKCZzdG10LT5ib2R5X2luc3RydWN0aW9ucywgc3RhdGUpOworCisgICBpZiAoYm9keSAhPSBOVUxMKQorICAgICAgYm9keS0+aGlyKCYgc3RtdC0+Ym9keV9pbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgaWYgKHJlc3RfZXhwcmVzc2lvbiAhPSBOVUxMKQorICAgICAgcmVzdF9leHByZXNzaW9uLT5oaXIoJiBzdG10LT5ib2R5X2luc3RydWN0aW9ucywgc3RhdGUpOworCisgICBpZiAobW9kZSA9PSBhc3RfZG9fd2hpbGUpCisgICAgICBjb25kaXRpb25fdG9faGlyKCZzdG10LT5ib2R5X2luc3RydWN0aW9ucywgc3RhdGUpOworCisgICBpZiAobW9kZSAhPSBhc3RfZG9fd2hpbGUpCisgICAgICBzdGF0ZS0+c3ltYm9scy0+cG9wX3Njb3BlKCk7CisKKyAgIC8qIFJlc3RvcmUgcHJldmlvdXMgbmVzdGluZyBiZWZvcmUgcmV0dXJuaW5nLiAqLworICAgc3RhdGUtPmxvb3BfbmVzdGluZ19hc3QgPSBuZXN0aW5nX2FzdDsKKyAgIHN0YXRlLT5zd2l0Y2hfc3RhdGUuaXNfc3dpdGNoX2lubmVybW9zdCA9IHNhdmVkX2lzX3N3aXRjaF9pbm5lcm1vc3Q7CisKKyAgIC8qIExvb3BzIGRvIG5vdCBoYXZlIHItdmFsdWVzLgorICAgICovCisgICByZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyB2YWxpZCBmb3IgZXN0YWJsaXNoaW5nIGEgZGVmYXVsdCBwcmVjaXNpb24KKyAqIHF1YWxpZmllci4KKyAqCisgKiBGcm9tIEdMU0wgRVMgMy4wMCBzZWN0aW9uIDQuNS40ICgiRGVmYXVsdCBQcmVjaXNpb24gUXVhbGlmaWVycyIpOgorICoKKyAqICAgICAiVGhlIHByZWNpc2lvbiBzdGF0ZW1lbnQKKyAqCisgKiAgICAgICAgIHByZWNpc2lvbiBwcmVjaXNpb24tcXVhbGlmaWVyIHR5cGU7CisgKgorICogICAgIGNhbiBiZSB1c2VkIHRvIGVzdGFibGlzaCBhIGRlZmF1bHQgcHJlY2lzaW9uIHF1YWxpZmllci4gVGhlIHR5cGUgZmllbGQKKyAqICAgICBjYW4gYmUgZWl0aGVyIGludCBvciBmbG9hdCBvciBhbnkgb2YgdGhlIHNhbXBsZXIgdHlwZXMsIGFuZCB0aGUKKyAqICAgICBwcmVjaXNpb24tcXVhbGlmaWVyIGNhbiBiZSBsb3dwLCBtZWRpdW1wLCBvciBoaWdocC4iCisgKgorICogR0xTTCBFUyAxLjAwIGhhcyBzaW1pbGFyIGxhbmd1YWdlLiAgR0xTTCAxLjMwIGRvZXNuJ3QgYWxsb3cgcHJlY2lzaW9uCisgKiBxdWFsaWZpZXJzIG9uIHNhbXBsZXIgdHlwZXMsIGJ1dCB0aGlzIHNlZW1zIGxpa2UgYW4gb3ZlcnNpZ2h0IChzaW5jZSB0aGUKKyAqIGludGVudGlvbiBvZiBpbmNsdWRpbmcgdGhlc2UgaW4gR0xTTCAxLjMwIGlzIHRvIGFsbG93IGNvbXBhdGliaWxpdHkgd2l0aCBFUworICogc2hhZGVycykuICBTbyB3ZSBhbGxvdyBpbnQsIGZsb2F0LCBhbmQgYWxsIHNhbXBsZXIgdHlwZXMgcmVnYXJkbGVzcyBvZiBHTFNMCisgKiB2ZXJzaW9uLgorICovCitzdGF0aWMgYm9vbAoraXNfdmFsaWRfZGVmYXVsdF9wcmVjaXNpb25fdHlwZShjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICpjb25zdCB0eXBlKQoreworICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgc3dpdGNoICh0eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgICAgLyogImludCIgYW5kICJmbG9hdCIgYXJlIHZhbGlkLCBidXQgdmVjdG9ycyBhbmQgbWF0cmljZXMgYXJlIG5vdC4gKi8KKyAgICAgIHJldHVybiB0eXBlLT52ZWN0b3JfZWxlbWVudHMgPT0gMSAmJiB0eXBlLT5tYXRyaXhfY29sdW1ucyA9PSAxOworICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKyAgICAgIHJldHVybiB0cnVlOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KKworCitpcl9ydmFsdWUgKgorYXN0X3R5cGVfc3BlY2lmaWVyOjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBpZiAodGhpcy0+ZGVmYXVsdF9wcmVjaXNpb24gPT0gYXN0X3ByZWNpc2lvbl9ub25lICYmIHRoaXMtPnN0cnVjdHVyZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgIC8qIElmIHRoaXMgaXMgYSBwcmVjaXNpb24gc3RhdGVtZW50LCBjaGVjayB0aGF0IHRoZSB0eXBlIHRvIHdoaWNoIGl0IGlzCisgICAgKiBhcHBsaWVkIGlzIGVpdGhlciBmbG9hdCBvciBpbnQuCisgICAgKgorICAgICogRnJvbSBzZWN0aW9uIDQuNS4zIG9mIHRoZSBHTFNMIDEuMzAgc3BlYzoKKyAgICAqICAgICJUaGUgcHJlY2lzaW9uIHN0YXRlbWVudAorICAgICogICAgICAgcHJlY2lzaW9uIHByZWNpc2lvbi1xdWFsaWZpZXIgdHlwZTsKKyAgICAqICAgIGNhbiBiZSB1c2VkIHRvIGVzdGFibGlzaCBhIGRlZmF1bHQgcHJlY2lzaW9uIHF1YWxpZmllci4gVGhlIHR5cGUKKyAgICAqICAgIGZpZWxkIGNhbiBiZSBlaXRoZXIgaW50IG9yIGZsb2F0IFsuLi5dLiAgQW55IG90aGVyIHR5cGVzIG9yCisgICAgKiAgICBxdWFsaWZpZXJzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLgorICAgICovCisgICBpZiAodGhpcy0+ZGVmYXVsdF9wcmVjaXNpb24gIT0gYXN0X3ByZWNpc2lvbl9ub25lKSB7CisgICAgICBpZiAoIXN0YXRlLT5jaGVja19wcmVjaXNpb25fcXVhbGlmaWVyc19hbGxvd2VkKCZsb2MpKQorICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIGlmICh0aGlzLT5zdHJ1Y3R1cmUgIT0gTlVMTCkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpc2lvbiBxdWFsaWZpZXJzIGRvIG5vdCBhcHBseSB0byBzdHJ1Y3R1cmVzIik7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMtPmFycmF5X3NwZWNpZmllciAhPSBOVUxMKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCBwcmVjaXNpb24gc3RhdGVtZW50cyBkbyBub3QgYXBwbHkgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXlzIik7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqY29uc3QgdHlwZSA9CisgICAgICAgICBzdGF0ZS0+c3ltYm9scy0+Z2V0X3R5cGUodGhpcy0+dHlwZV9uYW1lKTsKKyAgICAgIGlmICghaXNfdmFsaWRfZGVmYXVsdF9wcmVjaXNpb25fdHlwZSh0eXBlKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQgcHJlY2lzaW9uIHN0YXRlbWVudHMgYXBwbHkgb25seSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCwgaW50LCBhbmQgc2FtcGxlciB0eXBlcyIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUCisgICAgICAgICAgJiYgc3RhdGUtPmVzX3NoYWRlcgorICAgICAgICAgICYmIHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCkgeworICAgICAgICAgLyogU2VjdGlvbiA0LjUuMyAoRGVmYXVsdCBQcmVjaXNpb24gUXVhbGlmaWVycykgb2YgdGhlIEdMU0wgRVMgMS4wMAorICAgICAgICAgICogc3BlYyBzYXlzOgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgICAiVGhlIGZyYWdtZW50IGxhbmd1YWdlIGhhcyBubyBkZWZhdWx0IHByZWNpc2lvbiBxdWFsaWZpZXIgZm9yCisgICAgICAgICAgKiAgICAgZmxvYXRpbmcgcG9pbnQgdHlwZXMuIgorICAgICAgICAgICoKKyAgICAgICAgICAqIEFzIGEgcmVzdWx0LCB3ZSBoYXZlIHRvIHRyYWNrIHdoZXRoZXIgb3Igbm90IGRlZmF1bHQgcHJlY2lzaW9uIGhhcworICAgICAgICAgICogYmVlbiBzcGVjaWZpZWQgZm9yIGZsb2F0IGluIEdMU0wgRVMgZnJhZ21lbnQgc2hhZGVycy4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBFYXJsaWVyIGluIHRoYXQgc2FtZSBzZWN0aW9uLCB0aGUgc3BlYyBzYXlzOgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgICAiTm9uLXByZWNpc2lvbiBxdWFsaWZpZWQgZGVjbGFyYXRpb25zIHdpbGwgdXNlIHRoZSBwcmVjaXNpb24KKyAgICAgICAgICAqICAgICBxdWFsaWZpZXIgc3BlY2lmaWVkIGluIHRoZSBtb3N0IHJlY2VudCBwcmVjaXNpb24gc3RhdGVtZW50CisgICAgICAgICAgKiAgICAgdGhhdCBpcyBzdGlsbCBpbiBzY29wZS4gVGhlIHByZWNpc2lvbiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lCisgICAgICAgICAgKiAgICAgc2NvcGluZyBydWxlcyBhcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIElmIGl0IGlzIGRlY2xhcmVkCisgICAgICAgICAgKiAgICAgaW5zaWRlIGEgY29tcG91bmQgc3RhdGVtZW50LCBpdHMgZWZmZWN0IHN0b3BzIGF0IHRoZSBlbmQgb2YKKyAgICAgICAgICAqICAgICB0aGUgaW5uZXJtb3N0IHN0YXRlbWVudCBpdCB3YXMgZGVjbGFyZWQgaW4uIFByZWNpc2lvbgorICAgICAgICAgICogICAgIHN0YXRlbWVudHMgaW4gbmVzdGVkIHNjb3BlcyBvdmVycmlkZSBwcmVjaXNpb24gc3RhdGVtZW50cyBpbgorICAgICAgICAgICogICAgIG91dGVyIHNjb3Blcy4gTXVsdGlwbGUgcHJlY2lzaW9uIHN0YXRlbWVudHMgZm9yIHRoZSBzYW1lIGJhc2ljCisgICAgICAgICAgKiAgICAgdHlwZSBjYW4gYXBwZWFyIGluc2lkZSB0aGUgc2FtZSBzY29wZSwgd2l0aCBsYXRlciBzdGF0ZW1lbnRzCisgICAgICAgICAgKiAgICAgb3ZlcnJpZGluZyBlYXJsaWVyIHN0YXRlbWVudHMgd2l0aGluIHRoYXQgc2NvcGUuIgorICAgICAgICAgICoKKyAgICAgICAgICAqIERlZmF1bHQgcHJlY2lzaW9uIHNwZWNpZmljYXRpb25zIGZvbGxvdyB0aGUgc2FtZSBzY29wZSBydWxlcyBhcworICAgICAgICAgICogdmFyaWFibGVzLiAgU28sIHdlIGNhbiB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIGRlZmF1bHQgZmxvYXQKKyAgICAgICAgICAqIHByZWNpc2lvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIHJ1bGVzIHdpbGwganVzdCB3b3JrLiAgVGhpcworICAgICAgICAgICogaXMgYSBzbGlnaHQgYWJ1c2Ugb2YgdGhlIHN5bWJvbCB0YWJsZSwgYnV0IGl0IGhhcyB0aGUgc2VtYW50aWNzCisgICAgICAgICAgKiB0aGF0IHdlIHdhbnQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCBqdW5rID0KKyAgICAgICAgICAgIG5ldyhzdGF0ZSkgaXJfdmFyaWFibGUodHlwZSwgIiNkZWZhdWx0IHByZWNpc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworCisgICAgICAgICBzdGF0ZS0+c3ltYm9scy0+YWRkX3ZhcmlhYmxlKGp1bmspOworICAgICAgfQorCisgICAgICAvKiBGSU5JU0hNRTogVHJhbnNsYXRlIHByZWNpc2lvbiBzdGF0ZW1lbnRzIGludG8gSVIuICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLyogX21lc2FfYXN0X3NldF9hZ2dyZWdhdGVfdHlwZSgpIHNldHMgdGhlIDxzdHJ1Y3R1cmU+IGZpZWxkIHNvIHRoYXQKKyAgICAqIHByb2Nlc3NfcmVjb3JkX2NvbnN0cnVjdG9yKCkgY2FuIGRvIHR5cGUtY2hlY2tpbmcgb24gQy1zdHlsZSBpbml0aWFsaXplcgorICAgICogZXhwcmVzc2lvbnMgb2Ygc3RydWN0cywgYnV0IGFzdF9zdHJ1Y3Rfc3BlY2lmaWVyIHNob3VsZCBvbmx5IGJlIHRyYW5zbGF0ZWQKKyAgICAqIHRvIEhJUiBpZiBpdCBpcyBkZWNsYXJpbmcgdGhlIHR5cGUgb2YgYSBzdHJ1Y3R1cmUuCisgICAgKgorICAgICogVGhlIC0+aXNfZGVjbGFyYXRpb24gZmllbGQgaXMgZmFsc2UgZm9yIGluaXRpYWxpemVycyBvZiB2YXJpYWJsZXMKKyAgICAqIGRlY2xhcmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RydWN0J3MgdHlwZSBkZWZpbml0aW9uLgorICAgICoKKyAgICAqICAgIHN0cnVjdCBTIHsgLi4uIH07ICAgICAgICAgICAgICAoaXNfZGVjbGFyYXRpb24gPSB0cnVlKQorICAgICogICAgc3RydWN0IFQgeyAuLi4gfSB0ID0geyAuLi4gfTsgIChpc19kZWNsYXJhdGlvbiA9IHRydWUpCisgICAgKiAgICBTIHMgPSB7IC4uLiB9OyAgICAgICAgICAgICAgICAgKGlzX2RlY2xhcmF0aW9uID0gZmFsc2UpCisgICAgKi8KKyAgIGlmICh0aGlzLT5zdHJ1Y3R1cmUgIT0gTlVMTCAmJiB0aGlzLT5zdHJ1Y3R1cmUtPmlzX2RlY2xhcmF0aW9uKQorICAgICAgcmV0dXJuIHRoaXMtPnN0cnVjdHVyZS0+aGlyKGluc3RydWN0aW9ucywgc3RhdGUpOworCisgICByZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIFByb2Nlc3MgYSBzdHJ1Y3R1cmUgb3IgaW50ZXJmYWNlIGJsb2NrIHRyZWUgaW50byBhbiBhcnJheSBvZiBzdHJ1Y3R1cmUgZmllbGRzCisgKgorICogQWZ0ZXIgcGFyc2luZywgd2hlcmUgdGhlcmUgYXJlIHNvbWUgc3ludGF4IGRpZmZlcm5jZXMsIHN0cnVjdHVyZXMgYW5kCisgKiBpbnRlcmZhY2UgYmxvY2tzIGFyZSBhbG1vc3QgaWRlbnRpY2FsLiAgVGhleSBhcmUgc2ltaWxhciBlbm91Z2ggdGhhdCB0aGUKKyAqIEFTVCBmb3IgZWFjaCBjYW4gYmUgcHJvY2Vzc2VkIHRoZSBzYW1lIHdheSBpbnRvIGEgc2V0IG9mCisgKiBcYyBnbHNsX3N0cnVjdF9maWVsZCB0byBkZXNjcmliZSB0aGUgbWVtYmVycy4KKyAqCisgKiBJZiB3ZSdyZSBwcm9jZXNzaW5nIGFuIGludGVyZmFjZSBibG9jaywgdmFyX21vZGUgc2hvdWxkIGJlIHRoZSB0eXBlIG9mIHRoZQorICogaW50ZXJmYWNlIGJsb2NrIChpcl92YXJfc2hhZGVyX2luLCBpcl92YXJfc2hhZGVyX291dCwgb3IgaXJfdmFyX3VuaWZvcm0pLgorICogSWYgd2UncmUgcHJvY2Vzc2luZyBhIHN0cnVjdHVyZSwgdmFyX21vZGUgc2hvdWxkIGJlIGlyX3Zhcl9hdXRvLgorICoKKyAqIFxyZXR1cm4KKyAqIFRoZSBudW1iZXIgb2YgZmllbGRzIHByb2Nlc3NlZC4gIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgc3RydWN0dXJlIGZpZWxkcyBpcworICogc3RvcmVkIGluIFxjICpmaWVsZHNfcmV0LgorICovCit1bnNpZ25lZAorYXN0X3Byb2Nlc3Nfc3RydWN0dXJlX29yX2ludGVyZmFjZV9ibG9jayhleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjX2xpc3QgKmRlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVlMVFlQRSAmbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHNsX3N0cnVjdF9maWVsZCAqKmZpZWxkc19yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJsb2NrX3Jvd19tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd19yZXNlcnZlZF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGVfbW9kZSB2YXJfbW9kZSkKK3sKKyAgIHVuc2lnbmVkIGRlY2xfY291bnQgPSAwOworCisgICAvKiBNYWtlIGFuIGluaXRpYWwgcGFzcyBvdmVyIHRoZSBsaXN0IG9mIGZpZWxkcyB0byBkZXRlcm1pbmUgaG93CisgICAgKiBtYW55IHRoZXJlIGFyZS4gIEVhY2ggZWxlbWVudCBpbiB0aGlzIGxpc3QgaXMgYW4gYXN0X2RlY2xhcmF0b3JfbGlzdC4KKyAgICAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBhY3R1YWxseSBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisgICAgKiAnZGVjbGFyYXRpb25zJyBsaXN0IGluIGVhY2ggb2YgdGhlIGVsZW1lbnRzLgorICAgICovCisgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9kZWNsYXJhdG9yX2xpc3QsIGRlY2xfbGlzdCwgbGluaywgZGVjbGFyYXRpb25zKSB7CisgICAgICBmb3JlYWNoX2xpc3RfY29uc3QgKGRlY2xfcHRyLCAmIGRlY2xfbGlzdC0+ZGVjbGFyYXRpb25zKSB7CisgICAgICAgICBkZWNsX2NvdW50Kys7CisgICAgICB9CisgICB9CisKKyAgIC8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZSBmaWVsZHMgYW5kIHByb2Nlc3MgdGhlIGZpZWxkCisgICAgKiBkZWNsYXJhdGlvbnMuICBBcyB0aGUgZGVjbGFyYXRpb25zIGFyZSBwcm9jZXNzZWQsIHRyeSB0byBhbHNvIGNvbnZlcnQKKyAgICAqIHRoZSB0eXBlcyB0byBISVIuICBUaGlzIGVuc3VyZXMgdGhhdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZW1iZWRkZWQgaW4KKyAgICAqIG90aGVyIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBvciBpbiBpbnRlcmZhY2UgYmxvY2tzIGFyZSBwcm9jZXNzZWQuCisgICAgKi8KKyAgIGdsc2xfc3RydWN0X2ZpZWxkICpjb25zdCBmaWVsZHMgPSByYWxsb2NfYXJyYXkoc3RhdGUsIGdsc2xfc3RydWN0X2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsX2NvdW50KTsKKworICAgdW5zaWduZWQgaSA9IDA7CisgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9kZWNsYXJhdG9yX2xpc3QsIGRlY2xfbGlzdCwgbGluaywgZGVjbGFyYXRpb25zKSB7CisgICAgICBjb25zdCBjaGFyICp0eXBlX25hbWU7CisKKyAgICAgIGRlY2xfbGlzdC0+dHlwZS0+c3BlY2lmaWVyLT5oaXIoaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgICAgIC8qIFNlY3Rpb24gMTAuOSBvZiB0aGUgR0xTTCBFUyAxLjAwIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQKKyAgICAgICAqIGVtYmVkZGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsYW5ndWFnZS4KKyAgICAgICAqLworICAgICAgaWYgKHN0YXRlLT5lc19zaGFkZXIgJiYgZGVjbF9saXN0LT50eXBlLT5zcGVjaWZpZXItPnN0cnVjdHVyZSAhPSBOVUxMKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAiZW1iZWRkZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsb3dlZCBpbiBHTFNMIEVTIDEuMDAiKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZ2xzbF90eXBlICpkZWNsX3R5cGUgPQorICAgICAgICAgZGVjbF9saXN0LT50eXBlLT5nbHNsX3R5cGUoJiB0eXBlX25hbWUsIHN0YXRlKTsKKworICAgICAgZm9yZWFjaF9saXN0X3R5cGVkIChhc3RfZGVjbGFyYXRpb24sIGRlY2wsIGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWNsX2xpc3QtPmRlY2xhcmF0aW9ucykgeworICAgICAgICAgaWYgKCFhbGxvd19yZXNlcnZlZF9uYW1lcykKKyAgICAgICAgICAgIHZhbGlkYXRlX2lkZW50aWZpZXIoZGVjbC0+aWRlbnRpZmllciwgbG9jLCBzdGF0ZSk7CisKKyAgICAgICAgIC8qIEZyb20gc2VjdGlvbiA0LjMuOSBvZiB0aGUgR0xTTCA0LjQwIHNwZWM6CisgICAgICAgICAgKgorICAgICAgICAgICogICAgIltJbiBpbnRlcmZhY2UgYmxvY2tzXSBvcGFxdWUgdHlwZXMgYXJlIG5vdCBhbGxvd2VkLiIKKyAgICAgICAgICAqCisgICAgICAgICAgKiBJdCBzaG91bGQgYmUgaW1wb3NzaWJsZSBmb3IgZGVjbF90eXBlIHRvIGJlIE5VTEwgaGVyZS4gIENhc2VzIHRoYXQKKyAgICAgICAgICAqIG1pZ2h0IG5hdHVyYWxseSBsZWFkIHRvIGRlY2xfdHlwZSBiZWluZyBOVUxMLCBlc3BlY2lhbGx5IGZvciB0aGUKKyAgICAgICAgICAqIGlzX2ludGVyZmFjZSBjYXNlLCB3aWxsIGhhdmUgcmVzdWx0ZWQgaW4gY29tcGlsYXRpb24gaGF2aW5nCisgICAgICAgICAgKiBhbHJlYWR5IGhhbHRlZCBkdWUgdG8gYSBzeW50YXggZXJyb3IuCisgICAgICAgICAgKi8KKyAgICAgICAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKmZpZWxkX3R5cGUgPQorICAgICAgICAgICAgZGVjbF90eXBlICE9IE5VTEwgPyBkZWNsX3R5cGUgOiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisKKyAgICAgICAgIGlmIChpc19pbnRlcmZhY2UgJiYgZmllbGRfdHlwZS0+Y29udGFpbnNfb3BhcXVlKCkpIHsKKyAgICAgICAgICAgIFlZTFRZUEUgbG9jID0gZGVjbF9saXN0LT5nZXRfbG9jYXRpb24oKTsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmlmb3JtIGluIG5vbi1kZWZhdWx0IHVuaWZvcm0gYmxvY2sgY29udGFpbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BhcXVlIHZhcmlhYmxlIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChmaWVsZF90eXBlLT5jb250YWluc19hdG9taWMoKSkgeworICAgICAgICAgICAgLyogRklOSVNITUU6IEFkZCBhIHNwZWMgcXVvdGF0aW9uIGhlcmUgb25jZSB1cGRhdGVkIHNwZWMKKyAgICAgICAgICAgICAqIEZJTklTSE1FOiBsYW5ndWFnZSBpcyBhdmFpbGFibGUuICBTZWUgS2hyb25vcyBidWcgIzEwOTAzCisgICAgICAgICAgICAgKiBGSU5JU0hNRTogb24gd2hldGhlciBhdG9taWMgY291bnRlcnMgYXJlIGFsbG93ZWQgaW4KKyAgICAgICAgICAgICAqIEZJTklTSE1FOiBzdHJ1Y3R1cmVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBZWUxUWVBFIGxvYyA9IGRlY2xfbGlzdC0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAiYXRvbWljIGNvdW50ZXIgaW4gc3RydWN0dXJlIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuaWZvcm0gYmxvY2siKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGZpZWxkX3R5cGUtPmNvbnRhaW5zX2ltYWdlKCkpIHsKKyAgICAgICAgICAgIC8qIEZJTklTSE1FOiBTYW1lIHByb2JsZW0gYXMgd2l0aCBhdG9taWMgY291bnRlcnMuCisgICAgICAgICAgICAgKiBGSU5JU0hNRTogUmVxdWVzdCBjbGFyaWZpY2F0aW9uIGZyb20gS2hyb25vcyBhbmQgYWRkCisgICAgICAgICAgICAgKiBGSU5JU0hNRTogc3BlYyBxdW90YXRpb24gaGVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgWVlMVFlQRSBsb2MgPSBkZWNsX2xpc3QtPmdldF9sb2NhdGlvbigpOworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlIGluIHN0cnVjdHVyZSBvciB1bmlmb3JtIGJsb2NrIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbnN0IHN0cnVjdCBhc3RfdHlwZV9xdWFsaWZpZXIgKmNvbnN0IHF1YWwgPQorICAgICAgICAgICAgJiBkZWNsX2xpc3QtPnR5cGUtPnF1YWxpZmllcjsKKyAgICAgICAgIGlmIChxdWFsLT5mbGFncy5xLnN0ZDE0MCB8fAorICAgICAgICAgICAgIHF1YWwtPmZsYWdzLnEucGFja2VkIHx8CisgICAgICAgICAgICAgcXVhbC0+ZmxhZ3MucS5zaGFyZWQpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmlmb3JtIGJsb2NrIGxheW91dCBxdWFsaWZpZXJzIHN0ZDE0MCwgcGFja2VkLCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hhcmVkIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gdW5pZm9ybSBibG9ja3MsIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1iZXJzIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGZpZWxkX3R5cGUgPSBwcm9jZXNzX2FycmF5X3R5cGUoJmxvYywgZGVjbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsLT5hcnJheV9zcGVjaWZpZXIsIHN0YXRlKTsKKyAgICAgICAgIGZpZWxkc1tpXS50eXBlID0gZmllbGRfdHlwZTsKKyAgICAgICAgIGZpZWxkc1tpXS5uYW1lID0gZGVjbC0+aWRlbnRpZmllcjsKKyAgICAgICAgIGZpZWxkc1tpXS5sb2NhdGlvbiA9IC0xOworICAgICAgICAgZmllbGRzW2ldLmludGVycG9sYXRpb24gPQorICAgICAgICAgICAgaW50ZXJwcmV0X2ludGVycG9sYXRpb25fcXVhbGlmaWVyKHF1YWwsIHZhcl9tb2RlLCBzdGF0ZSwgJmxvYyk7CisgICAgICAgICBmaWVsZHNbaV0uY2VudHJvaWQgPSBxdWFsLT5mbGFncy5xLmNlbnRyb2lkID8gMSA6IDA7CisgICAgICAgICBmaWVsZHNbaV0uc2FtcGxlID0gcXVhbC0+ZmxhZ3MucS5zYW1wbGUgPyAxIDogMDsKKworICAgICAgICAgaWYgKHF1YWwtPmZsYWdzLnEucm93X21ham9yIHx8IHF1YWwtPmZsYWdzLnEuY29sdW1uX21ham9yKSB7CisgICAgICAgICAgICBpZiAoIXF1YWwtPmZsYWdzLnEudW5pZm9ybSkgeworICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvd19tYWpvciBhbmQgY29sdW1uX21ham9yIGNhbiBvbmx5IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpZWQgdG8gdW5pZm9ybSBpbnRlcmZhY2UgYmxvY2tzIik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgIHZhbGlkYXRlX21hdHJpeF9sYXlvdXRfZm9yX3R5cGUoc3RhdGUsICZsb2MsIGZpZWxkX3R5cGUsIE5VTEwpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAocXVhbC0+ZmxhZ3MucS51bmlmb3JtICYmIHF1YWwtPmhhc19pbnRlcnBvbGF0aW9uKCkpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnBvbGF0aW9uIHF1YWxpZmllcnMgY2Fubm90IGJlIHVzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB1bmlmb3JtIGludGVyZmFjZSBibG9ja3MiKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKGZpZWxkX3R5cGUtPmlzX21hdHJpeCgpIHx8CisgICAgICAgICAgICAgKGZpZWxkX3R5cGUtPmlzX2FycmF5KCkgJiYgZmllbGRfdHlwZS0+ZmllbGRzLmFycmF5LT5pc19tYXRyaXgoKSkpIHsKKyAgICAgICAgICAgIGZpZWxkc1tpXS5yb3dfbWFqb3IgPSBibG9ja19yb3dfbWFqb3I7CisgICAgICAgICAgICBpZiAocXVhbC0+ZmxhZ3MucS5yb3dfbWFqb3IpCisgICAgICAgICAgICAgICBmaWVsZHNbaV0ucm93X21ham9yID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHF1YWwtPmZsYWdzLnEuY29sdW1uX21ham9yKQorICAgICAgICAgICAgICAgZmllbGRzW2ldLnJvd19tYWpvciA9IGZhbHNlOworICAgICAgICAgfQorCisgICAgICBpKys7CisgICAgICB9CisgICB9CisKKyAgIGFzc2VydChpID09IGRlY2xfY291bnQpOworCisgICAqZmllbGRzX3JldCA9IGZpZWxkczsKKyAgIHJldHVybiBkZWNsX2NvdW50OworfQorCisKK2lyX3J2YWx1ZSAqCithc3Rfc3RydWN0X3NwZWNpZmllcjo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICAvKiBTZWN0aW9uIDQuMS44IChTdHJ1Y3R1cmVzKSBvZiB0aGUgR0xTTCAxLjEwIHNwZWMgc2F5czoKKyAgICAqCisgICAgKiAgICAgIkFub255bW91cyBzdHJ1Y3R1cmVzIGFyZSBub3Qgc3VwcG9ydGVkOyBzbyBlbWJlZGRlZCBzdHJ1Y3R1cmVzIG11c3QKKyAgICAqICAgICBoYXZlIGEgZGVjbGFyYXRvci4gQSBuYW1lIGdpdmVuIHRvIGFuIGVtYmVkZGVkIHN0cnVjdCBpcyBzY29wZWQgYXQKKyAgICAqICAgICB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RydWN0IGl0IGlzIGVtYmVkZGVkIGluLiIKKyAgICAqCisgICAgKiBUaGUgc2FtZSBzZWN0aW9uIG9mIHRoZSAgR0xTTCAxLjIwIHNwZWMgc2F5czoKKyAgICAqCisgICAgKiAgICAgIkFub255bW91cyBzdHJ1Y3R1cmVzIGFyZSBub3Qgc3VwcG9ydGVkLiBFbWJlZGRlZCBzdHJ1Y3R1cmVzIGFyZSBub3QKKyAgICAqICAgICBzdXBwb3J0ZWQuCisgICAgKgorICAgICogICAgICAgICBzdHJ1Y3QgUyB7IGZsb2F0IGY7IH07CisgICAgKiAgICAgICAgIHN0cnVjdCBUIHsKKyAgICAqICAgICAgICAgICAgIFM7ICAgICAgICAgICAgICAvLyBFcnJvcjogYW5vbnltb3VzIHN0cnVjdHVyZXMgZGlzYWxsb3dlZAorICAgICogICAgICAgICAgICAgc3RydWN0IHsgLi4uIH07IC8vIEVycm9yOiBlbWJlZGRlZCBzdHJ1Y3R1cmVzIGRpc2FsbG93ZWQKKyAgICAqICAgICAgICAgICAgIFMgczsgICAgICAgICAgICAvLyBPa2F5OiBuZXN0ZWQgc3RydWN0dXJlcyB3aXRoIG5hbWUgYXJlIGFsbG93ZWQKKyAgICAqICAgICAgICAgfTsiCisgICAgKgorICAgICogVGhlIEdMU0wgRVMgMS4wMCBhbmQgMy4wMCBzcGVjcyBoYXZlIHNpbWlsYXIgbGFuZ2F1Z2UgYW5kIGV4YW1wbGVzLiAgU28sCisgICAgKiB3ZSBhbGxvdyBlbWJlZGRlZCBzdHJ1Y3R1cmVzIGluIDEuMTAgb25seS4KKyAgICAqLworICAgaWYgKHN0YXRlLT5sYW5ndWFnZV92ZXJzaW9uICE9IDExMCAmJiBzdGF0ZS0+c3RydWN0X3NwZWNpZmllcl9kZXB0aCAhPSAwKQorICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKwkJICAgICAgICJlbWJlZGRlZCBzdHJ1Y3R1cmUgZGVjbGFydGlvbnMgYXJlIG5vdCBhbGxvd2VkIik7CisKKyAgIHN0YXRlLT5zdHJ1Y3Rfc3BlY2lmaWVyX2RlcHRoKys7CisKKyAgIGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZHM7CisgICB1bnNpZ25lZCBkZWNsX2NvdW50ID0KKyAgICAgIGFzdF9wcm9jZXNzX3N0cnVjdHVyZV9vcl9pbnRlcmZhY2VfYmxvY2soaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoaXMtPmRlY2xhcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93X3Jlc2VydmVkX25hbWVzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfYXV0byk7CisKKyAgIHZhbGlkYXRlX2lkZW50aWZpZXIodGhpcy0+bmFtZSwgbG9jLCBzdGF0ZSk7CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdCA9CisgICAgICBnbHNsX3R5cGU6OmdldF9yZWNvcmRfaW5zdGFuY2UoZmllbGRzLCBkZWNsX2NvdW50LCB0aGlzLT5uYW1lKTsKKworICAgaWYgKCFzdGF0ZS0+c3ltYm9scy0+YWRkX3R5cGUobmFtZSwgdCkpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAic3RydWN0IGAlcycgcHJldmlvdXNseSBkZWZpbmVkIiwgbmFtZSk7CisgICB9IGVsc2UgeworICAgICAgY29uc3QgZ2xzbF90eXBlICoqcyA9IHJlcmFsbG9jKHN0YXRlLCBzdGF0ZS0+dXNlcl9zdHJ1Y3R1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5udW1fdXNlcl9zdHJ1Y3R1cmVzICsgMSk7CisgICAgICBpZiAocyAhPSBOVUxMKSB7CisgICAgICAgICBzW3N0YXRlLT5udW1fdXNlcl9zdHJ1Y3R1cmVzXSA9IHQ7CisgICAgICAgICBzdGF0ZS0+dXNlcl9zdHJ1Y3R1cmVzID0gczsKKyAgICAgICAgIHN0YXRlLT5udW1fdXNlcl9zdHJ1Y3R1cmVzKys7CisgICAgICB9CisgICB9CisKKyAgIHN0YXRlLT5zdHJ1Y3Rfc3BlY2lmaWVyX2RlcHRoLS07CisKKyAgIC8qIFN0cnVjdHVyZSB0eXBlIGRlZmluaXRpb25zIGRvIG5vdCBoYXZlIHItdmFsdWVzLgorICAgICovCisgICByZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIFZpc2l0b3IgY2xhc3Mgd2hpY2ggZGV0ZWN0cyB3aGV0aGVyIGEgZ2l2ZW4gaW50ZXJmYWNlIGJsb2NrIGhhcyBiZWVuIHVzZWQuCisgKi8KK2NsYXNzIGludGVyZmFjZV9ibG9ja191c2FnZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yCit7CitwdWJsaWM6CisgICBpbnRlcmZhY2VfYmxvY2tfdXNhZ2VfdmlzaXRvcihpcl92YXJpYWJsZV9tb2RlIG1vZGUsIGNvbnN0IGdsc2xfdHlwZSAqYmxvY2spCisgICAgICA6IG1vZGUobW9kZSksIGJsb2NrKGJsb2NrKSwgZm91bmQoZmFsc2UpCisgICB7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQorICAgeworICAgICAgaWYgKGlyLT52YXItPmRhdGEubW9kZSA9PSBtb2RlICYmIGlyLT52YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpID09IGJsb2NrKSB7CisgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICByZXR1cm4gdmlzaXRfc3RvcDsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgYm9vbCB1c2FnZV9mb3VuZCgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gdGhpcy0+Zm91bmQ7CisgICB9CisKK3ByaXZhdGU6CisgICBpcl92YXJpYWJsZV9tb2RlIG1vZGU7CisgICBjb25zdCBnbHNsX3R5cGUgKmJsb2NrOworICAgYm9vbCBmb3VuZDsKK307CisKKworaXJfcnZhbHVlICoKK2FzdF9pbnRlcmZhY2VfYmxvY2s6OmhpcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBZWUxUWVBFIGxvYyA9IHRoaXMtPmdldF9sb2NhdGlvbigpOworCisgICAvKiBUaGUgYXN0X2ludGVyZmFjZV9ibG9jayBoYXMgYSBsaXN0IG9mIGFzdF9kZWNsYXJhdG9yX2xpc3RzLiAgV2UKKyAgICAqIG5lZWQgdG8gdHVybiB0aG9zZSBpbnRvIGlyX3ZhcmlhYmxlcyB3aXRoIGFuIGFzc29jaWF0aW9uCisgICAgKiB3aXRoIHRoaXMgdW5pZm9ybSBibG9jay4KKyAgICAqLworICAgZW51bSBnbHNsX2ludGVyZmFjZV9wYWNraW5nIHBhY2tpbmc7CisgICBpZiAodGhpcy0+bGF5b3V0LmZsYWdzLnEuc2hhcmVkKSB7CisgICAgICBwYWNraW5nID0gR0xTTF9JTlRFUkZBQ0VfUEFDS0lOR19TSEFSRUQ7CisgICB9IGVsc2UgaWYgKHRoaXMtPmxheW91dC5mbGFncy5xLnBhY2tlZCkgeworICAgICAgcGFja2luZyA9IEdMU0xfSU5URVJGQUNFX1BBQ0tJTkdfUEFDS0VEOworICAgfSBlbHNlIHsKKyAgICAgIC8qIFRoZSBkZWZhdWx0IGxheW91dCBpcyBzdGQxNDAuCisgICAgICAgKi8KKyAgICAgIHBhY2tpbmcgPSBHTFNMX0lOVEVSRkFDRV9QQUNLSU5HX1NURDE0MDsKKyAgIH0KKworICAgaXJfdmFyaWFibGVfbW9kZSB2YXJfbW9kZTsKKyAgIGNvbnN0IGNoYXIgKmlmYWNlX3R5cGVfbmFtZTsKKyAgIGlmICh0aGlzLT5sYXlvdXQuZmxhZ3MucS5pbikgeworICAgICAgdmFyX21vZGUgPSBpcl92YXJfc2hhZGVyX2luOworICAgICAgaWZhY2VfdHlwZV9uYW1lID0gImluIjsKKyAgIH0gZWxzZSBpZiAodGhpcy0+bGF5b3V0LmZsYWdzLnEub3V0KSB7CisgICAgICB2YXJfbW9kZSA9IGlyX3Zhcl9zaGFkZXJfb3V0OworICAgICAgaWZhY2VfdHlwZV9uYW1lID0gIm91dCI7CisgICB9IGVsc2UgaWYgKHRoaXMtPmxheW91dC5mbGFncy5xLnVuaWZvcm0pIHsKKyAgICAgIHZhcl9tb2RlID0gaXJfdmFyX3VuaWZvcm07CisgICAgICBpZmFjZV90eXBlX25hbWUgPSAidW5pZm9ybSI7CisgICB9IGVsc2UgeworICAgICAgdmFyX21vZGUgPSBpcl92YXJfYXV0bzsKKyAgICAgIGlmYWNlX3R5cGVfbmFtZSA9ICJVTktOT1dOIjsKKyAgICAgIGFzc2VydCghImludGVyZmFjZSBibG9jayBsYXlvdXQgcXVhbGlmaWVyIG5vdCBmb3VuZCEiKTsKKyAgIH0KKworICAgYm9vbCByZWRlY2xhcmluZ19wZXJfdmVydGV4ID0gc3RyY21wKHRoaXMtPmJsb2NrX25hbWUsICJnbF9QZXJWZXJ0ZXgiKSA9PSAwOworICAgYm9vbCBibG9ja19yb3dfbWFqb3IgPSB0aGlzLT5sYXlvdXQuZmxhZ3MucS5yb3dfbWFqb3I7CisgICBleGVjX2xpc3QgZGVjbGFyZWRfdmFyaWFibGVzOworICAgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkczsKKyAgIHVuc2lnbmVkIGludCBudW1fdmFyaWFibGVzID0KKyAgICAgIGFzdF9wcm9jZXNzX3N0cnVjdHVyZV9vcl9pbnRlcmZhY2VfYmxvY2soJmRlY2xhcmVkX3ZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGlzLT5kZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRlY2xhcmluZ19wZXJfdmVydGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbW9kZSk7CisKKyAgIGlmICghcmVkZWNsYXJpbmdfcGVyX3ZlcnRleCkKKyAgICAgIHZhbGlkYXRlX2lkZW50aWZpZXIodGhpcy0+YmxvY2tfbmFtZSwgbG9jLCBzdGF0ZSk7CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqZWFybGllcl9wZXJfdmVydGV4ID0gTlVMTDsKKyAgIGlmIChyZWRlY2xhcmluZ19wZXJfdmVydGV4KSB7CisgICAgICAvKiBGaW5kIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBvZiBnbF9QZXJWZXJ0ZXguICBJZiB3ZSdyZSByZWRlY2xhcmluZworICAgICAgICogdGhlIG5hbWVkIGludGVyZmFjZSBibG9jayBnbF9pbiwgd2UgY2FuIGZpbmQgaXQgYnkgbG9va2luZyBhdCB0aGUKKyAgICAgICAqIHByZXZpb3VzIGRlY2xhcmF0aW9uIG9mIGdsX2luLiAgT3RoZXJ3aXNlIHdlIGNhbiBmaW5kIGl0IGJ5IGxvb2tpbmcKKyAgICAgICAqIGF0IHRoZSBwcmV2aW91cyBkZWNhbGFydGlvbiBvZiBhbnkgb2YgdGhlIGJ1aWx0LWluIG91dHB1dHMsCisgICAgICAgKiBlLmcuIGdsX1Bvc2l0aW9uLgorICAgICAgICoKKyAgICAgICAqIEFsc28gY2hlY2sgdGhhdCB0aGUgaW5zdGFuY2UgbmFtZSBhbmQgYXJyYXktbmVzcyBvZiB0aGUgcmVkZWNsYXJhdGlvbgorICAgICAgICogYXJlIGNvcnJlY3QuCisgICAgICAgKi8KKyAgICAgIHN3aXRjaCAodmFyX21vZGUpIHsKKyAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9pbjoKKyAgICAgICAgIGlmIChpcl92YXJpYWJsZSAqZWFybGllcl9nbF9pbiA9CisgICAgICAgICAgICAgc3RhdGUtPnN5bWJvbHMtPmdldF92YXJpYWJsZSgiZ2xfaW4iKSkgeworICAgICAgICAgICAgZWFybGllcl9wZXJfdmVydGV4ID0gZWFybGllcl9nbF9pbi0+Z2V0X2ludGVyZmFjZV90eXBlKCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZGVjbGFyYXRpb24gb2YgZ2xfUGVyVmVydGV4IGlucHV0IG5vdCBhbGxvd2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHRoZSAlcyBzaGFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKHN0YXRlLT5zdGFnZSkpOworICAgICAgICAgfQorICAgICAgICAgaWYgKHRoaXMtPmluc3RhbmNlX25hbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgIHN0cmNtcCh0aGlzLT5pbnN0YW5jZV9uYW1lLCAiZ2xfaW4iKSAhPSAwIHx8IHRoaXMtPmFycmF5X3NwZWNpZmllciA9PSBOVUxMKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfUGVyVmVydGV4IGlucHV0IG11c3QgYmUgcmVkZWNsYXJlZCBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbF9pbltdIik7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9vdXQ6CisgICAgICAgICBpZiAoaXJfdmFyaWFibGUgKmVhcmxpZXJfZ2xfUG9zaXRpb24gPQorICAgICAgICAgICAgIHN0YXRlLT5zeW1ib2xzLT5nZXRfdmFyaWFibGUoImdsX1Bvc2l0aW9uIikpIHsKKyAgICAgICAgICAgIGVhcmxpZXJfcGVyX3ZlcnRleCA9IGVhcmxpZXJfZ2xfUG9zaXRpb24tPmdldF9pbnRlcmZhY2VfdHlwZSgpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWRlY2xhcmF0aW9uIG9mIGdsX1BlclZlcnRleCBvdXRwdXQgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbG93ZWQgaW4gdGhlICVzIHNoYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoc3RhdGUtPnN0YWdlKSk7CisgICAgICAgICB9CisgICAgICAgICBpZiAodGhpcy0+aW5zdGFuY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfUGVyVmVydGV4IGlucHV0IG1heSBub3QgYmUgcmVkZWNsYXJlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIGluc3RhbmNlIG5hbWUiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJnbF9QZXJWZXJ0ZXggbXVzdCBiZSBkZWNsYXJlZCBhcyBhbiBpbnB1dCBvciBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZWFybGllcl9wZXJfdmVydGV4ID09IE5VTEwpIHsKKyAgICAgICAgIC8qIEFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuICBCYWlsIG91dCB0byBhdm9pZCBudWxsCisgICAgICAgICAgKiBkZXJlZmVyZW5jZXMgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIC8qIENvcHkgbG9jYXRpb25zIGZyb20gdGhlIG9sZCBnbF9QZXJWZXJ0ZXggaW50ZXJmYWNlIGJsb2NrLiAqLworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV92YXJpYWJsZXM7IGkrKykgeworICAgICAgICAgaW50IGogPSBlYXJsaWVyX3Blcl92ZXJ0ZXgtPmZpZWxkX2luZGV4KGZpZWxkc1tpXS5uYW1lKTsKKyAgICAgICAgIGlmIChqID09IC0xKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVkZWNsYXJhdGlvbiBvZiBnbF9QZXJWZXJ0ZXggbXVzdCBiZSBhIHN1YnNldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiB0aGUgYnVpbHQtaW4gbWVtYmVycyBvZiBnbF9QZXJWZXJ0ZXgiKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWVsZHNbaV0ubG9jYXRpb24gPQorICAgICAgICAgICAgICAgZWFybGllcl9wZXJfdmVydGV4LT5maWVsZHMuc3RydWN0dXJlW2pdLmxvY2F0aW9uOworICAgICAgICAgICAgZmllbGRzW2ldLmludGVycG9sYXRpb24gPQorICAgICAgICAgICAgICAgZWFybGllcl9wZXJfdmVydGV4LT5maWVsZHMuc3RydWN0dXJlW2pdLmludGVycG9sYXRpb247CisgICAgICAgICAgICBmaWVsZHNbaV0uY2VudHJvaWQgPQorICAgICAgICAgICAgICAgZWFybGllcl9wZXJfdmVydGV4LT5maWVsZHMuc3RydWN0dXJlW2pdLmNlbnRyb2lkOworICAgICAgICAgICAgZmllbGRzW2ldLnNhbXBsZSA9CisgICAgICAgICAgICAgICBlYXJsaWVyX3Blcl92ZXJ0ZXgtPmZpZWxkcy5zdHJ1Y3R1cmVbal0uc2FtcGxlOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBGcm9tIHNlY3Rpb24gNy4xICgiQnVpbHQtaW4gTGFuZ3VhZ2UgVmFyaWFibGVzIikgb2YgdGhlIEdMU0wgNC4xMAorICAgICAgICogc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAgSWYgYSBidWlsdC1pbiBpbnRlcmZhY2UgYmxvY2sgaXMgcmVkZWNsYXJlZCwgaXQgbXVzdCBhcHBlYXIgaW4KKyAgICAgICAqICAgICB0aGUgc2hhZGVyIGJlZm9yZSBhbnkgdXNlIG9mIGFueSBtZW1iZXIgaW5jbHVkZWQgaW4gdGhlIGJ1aWx0LWluCisgICAgICAgKiAgICAgZGVjbGFyYXRpb24sIG9yIGEgY29tcGlsYXRpb24gZXJyb3Igd2lsbCByZXN1bHQuCisgICAgICAgKgorICAgICAgICogVGhpcyBhcHBlYXJzIHRvIGJlIGEgY2xhcmlmaWNhdGlvbiB0byB0aGUgYmVoYXZpb3VyIGVzdGFibGlzaGVkIGZvcgorICAgICAgICogZ2xfUGVyVmVydGV4IGJ5IEdMU0wgMS41MCwgdGhlcmVmb3JlIHdlIGltcGxlbWVudCB0aGlzIGJlaGF2aW91cgorICAgICAgICogcmVnYXJkbGVzcyBvZiBHTFNMIHZlcnNpb24uCisgICAgICAgKi8KKyAgICAgIGludGVyZmFjZV9ibG9ja191c2FnZV92aXNpdG9yIHYodmFyX21vZGUsIGVhcmxpZXJfcGVyX3ZlcnRleCk7CisgICAgICB2LnJ1bihpbnN0cnVjdGlvbnMpOworICAgICAgaWYgKHYudXNhZ2VfZm91bmQoKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZGVjbGFyYXRpb24gb2YgYSBidWlsdC1pbiBpbnRlcmZhY2UgYmxvY2sgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBlYXIgYmVmb3JlIGFueSB1c2Ugb2YgYW55IG1lbWJlciBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIGJsb2NrIik7CisgICAgICB9CisgICB9CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqYmxvY2tfdHlwZSA9CisgICAgICBnbHNsX3R5cGU6OmdldF9pbnRlcmZhY2VfaW5zdGFuY2UoZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5ibG9ja19uYW1lKTsKKworICAgaWYgKCFzdGF0ZS0+c3ltYm9scy0+YWRkX2ludGVyZmFjZShibG9ja190eXBlLT5uYW1lLCBibG9ja190eXBlLCB2YXJfbW9kZSkpIHsKKyAgICAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAiaW50ZXJmYWNlIGJsb2NrIGAlcycgd2l0aCB0eXBlIGAlcycgIgorICAgICAgICAgICAgICAgICAgICAgICAiYWxyZWFkeSB0YWtlbiBpbiB0aGUgY3VycmVudCBzY29wZSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJsb2NrX25hbWUsIGlmYWNlX3R5cGVfbmFtZSk7CisgICB9CisKKyAgIC8qIFNpbmNlIGludGVyZmFjZSBibG9ja3MgY2Fubm90IGNvbnRhaW4gc3RhdGVtZW50cywgaXQgc2hvdWxkIGJlCisgICAgKiBpbXBvc3NpYmxlIGZvciB0aGUgYmxvY2sgdG8gZ2VuZXJhdGUgYW55IGluc3RydWN0aW9ucy4KKyAgICAqLworICAgYXNzZXJ0KGRlY2xhcmVkX3ZhcmlhYmxlcy5pc19lbXB0eSgpKTsKKworICAgLyogRnJvbSBzZWN0aW9uIDQuMy40IChJbnB1dHMpIG9mIHRoZSBHTFNMIDEuNTAgc3BlYzoKKyAgICAqCisgICAgKiAgICAgR2VvbWV0cnkgc2hhZGVyIGlucHV0IHZhcmlhYmxlcyBnZXQgdGhlIHBlci12ZXJ0ZXggdmFsdWVzIHdyaXR0ZW4KKyAgICAqICAgICBvdXQgYnkgdmVydGV4IHNoYWRlciBvdXRwdXQgdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWVzLiBTaW5jZSBhCisgICAgKiAgICAgZ2VvbWV0cnkgc2hhZGVyIG9wZXJhdGVzIG9uIGEgc2V0IG9mIHZlcnRpY2VzLCBlYWNoIGlucHV0IHZhcnlpbmcKKyAgICAqICAgICB2YXJpYWJsZSAob3IgaW5wdXQgYmxvY2ssIHNlZSBpbnRlcmZhY2UgYmxvY2tzIGJlbG93KSBuZWVkcyB0byBiZQorICAgICogICAgIGRlY2xhcmVkIGFzIGFuIGFycmF5LgorICAgICovCisgICBpZiAoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0dFT01FVFJZICYmIHRoaXMtPmFycmF5X3NwZWNpZmllciA9PSBOVUxMICYmCisgICAgICAgdmFyX21vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbikgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImdlb21ldHJ5IHNoYWRlciBpbnB1dHMgbXVzdCBiZSBhcnJheXMiKTsKKyAgIH0KKworICAgLyogUGFnZSAzOSAocGFnZSA0NSBvZiB0aGUgUERGKSBvZiBzZWN0aW9uIDQuMy43IGluIHRoZSBHTFNMIEVTIDMuMDAgc3BlYworICAgICogc2F5czoKKyAgICAqCisgICAgKiAgICAgIklmIGFuIGluc3RhbmNlIG5hbWUgKGluc3RhbmNlLW5hbWUpIGlzIHVzZWQsIHRoZW4gaXQgcHV0cyBhbGwgdGhlCisgICAgKiAgICAgbWVtYmVycyBpbnNpZGUgYSBzY29wZSB3aXRoaW4gaXRzIG93biBuYW1lIHNwYWNlLCBhY2Nlc3NlZCB3aXRoIHRoZQorICAgICogICAgIGZpZWxkIHNlbGVjdG9yICggLiApIG9wZXJhdG9yIChhbmFsb2dvdXNseSB0byBzdHJ1Y3R1cmVzKS4iCisgICAgKi8KKyAgIGlmICh0aGlzLT5pbnN0YW5jZV9uYW1lKSB7CisgICAgICBpZiAocmVkZWNsYXJpbmdfcGVyX3ZlcnRleCkgeworICAgICAgICAgLyogV2hlbiBhIGJ1aWx0LWluIGluIGFuIHVubmFtZWQgaW50ZXJmYWNlIGJsb2NrIGlzIHJlZGVjbGFyZWQsCisgICAgICAgICAgKiBnZXRfdmFyaWFibGVfYmVpbmdfcmVkZWNsYXJlZCgpIGNhbGxzCisgICAgICAgICAgKiBjaGVja19idWlsdGluX2FycmF5X21heF9zaXplKCkgdG8gbWFrZSBzdXJlIHRoYXQgYnVpbHQtaW4gYXJyYXkKKyAgICAgICAgICAqIHZhcmlhYmxlcyBhcmVuJ3QgcmVkZWNsYXJlZCB0byBpbGxlZ2FsIHNpemVzLiAgQnV0IHdlJ3JlIGxvb2tpbmcKKyAgICAgICAgICAqIGF0IGEgcmVkZWNsYXJhdGlvbiBvZiBhIG5hbWVkIGJ1aWx0LWluIGludGVyZmFjZSBibG9jay4gIFNvIHdlCisgICAgICAgICAgKiBoYXZlIHRvIG1hbnVhbGx5IGNhbGwgY2hlY2tfYnVpbHRpbl9hcnJheV9tYXhfc2l6ZSgpIGZvciBhbGwgcGFydHMKKyAgICAgICAgICAqIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBhcmUgYXJyYXlzLgorICAgICAgICAgICovCisgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3ZhcmlhYmxlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmllbGRzW2ldLnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNpemUgPSBmaWVsZHNbaV0udHlwZS0+YXJyYXlfc2l6ZSgpOworICAgICAgICAgICAgICAgY2hlY2tfYnVpbHRpbl9hcnJheV9tYXhfc2l6ZShmaWVsZHNbaV0ubmFtZSwgc2l6ZSwgbG9jLCBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgdmFsaWRhdGVfaWRlbnRpZmllcih0aGlzLT5pbnN0YW5jZV9uYW1lLCBsb2MsIHN0YXRlKTsKKyAgICAgIH0KKworICAgICAgaXJfdmFyaWFibGUgKnZhcjsKKworICAgICAgaWYgKHRoaXMtPmFycmF5X3NwZWNpZmllciAhPSBOVUxMKSB7CisgICAgICAgICAvKiBTZWN0aW9uIDQuMy43IChJbnRlcmZhY2UgQmxvY2tzKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWMgc2F5czoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAgRm9yIHVuaWZvcm0gYmxvY2tzIGRlY2xhcmVkIGFuIGFycmF5LCBlYWNoIGluZGl2aWR1YWwgYXJyYXkKKyAgICAgICAgICAqICAgICBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIGEgc2VwYXJhdGUgYnVmZmVyIG9iamVjdCBiYWNraW5nIG9uZQorICAgICAgICAgICogICAgIGluc3RhbmNlIG9mIHRoZSBibG9jay4gQXMgdGhlIGFycmF5IHNpemUgaW5kaWNhdGVzIHRoZSBudW1iZXIKKyAgICAgICAgICAqICAgICBvZiBidWZmZXIgb2JqZWN0cyBuZWVkZWQsIHVuaWZvcm0gYmxvY2sgYXJyYXkgZGVjbGFyYXRpb25zCisgICAgICAgICAgKiAgICAgbXVzdCBzcGVjaWZ5IGFuIGFycmF5IHNpemUuCisgICAgICAgICAgKgorICAgICAgICAgICogQW5kIGEgZmV3IHBhcmFncmFwaHMgbGF0ZXI6CisgICAgICAgICAgKgorICAgICAgICAgICogICAgIEdlb21ldHJ5IHNoYWRlciBpbnB1dCBibG9ja3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBhcnJheXMgYW5kCisgICAgICAgICAgKiAgICAgZm9sbG93IHRoZSBhcnJheSBkZWNsYXJhdGlvbiBhbmQgbGlua2luZyBydWxlcyBmb3IgYWxsCisgICAgICAgICAgKiAgICAgZ2VvbWV0cnkgc2hhZGVyIGlucHV0cy4gQWxsIG90aGVyIGlucHV0IGFuZCBvdXRwdXQgYmxvY2sKKyAgICAgICAgICAqICAgICBhcnJheXMgbXVzdCBzcGVjaWZ5IGFuIGFycmF5IHNpemUuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhlIHVwc2hvdCBvZiB0aGlzIGlzIHRoYXQgdGhlIG9ubHkgY2lyY3Vtc3RhbmNlIHdoZXJlIGFuCisgICAgICAgICAgKiBpbnRlcmZhY2UgYXJyYXkgc2l6ZSAqZG9lc24ndCogbmVlZCB0byBiZSBzcGVjaWZpZWQgaXMgb24gYQorICAgICAgICAgICogZ2VvbWV0cnkgc2hhZGVyIGlucHV0LgorICAgICAgICAgICovCisgICAgICAgICBpZiAodGhpcy0+YXJyYXlfc3BlY2lmaWVyLT5pc191bnNpemVkX2FycmF5ICYmCisgICAgICAgICAgICAgKHN0YXRlLT5zdGFnZSAhPSBNRVNBX1NIQURFUl9HRU9NRVRSWSB8fCAhdGhpcy0+bGF5b3V0LmZsYWdzLnEuaW4pKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSBnZW9tZXRyeSBzaGFkZXIgaW5wdXRzIG1heSBiZSB1bnNpemVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIGJsb2NrIGFycmF5cyIpOworCisgICAgICAgICB9CisKKyAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqYmxvY2tfYXJyYXlfdHlwZSA9CisgICAgICAgICAgICBwcm9jZXNzX2FycmF5X3R5cGUoJmxvYywgYmxvY2tfdHlwZSwgdGhpcy0+YXJyYXlfc3BlY2lmaWVyLCBzdGF0ZSk7CisKKyAgICAgICAgIHZhciA9IG5ldyhzdGF0ZSkgaXJfdmFyaWFibGUoYmxvY2tfYXJyYXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+aW5zdGFuY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX21vZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHZhciA9IG5ldyhzdGF0ZSkgaXJfdmFyaWFibGUoYmxvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+aW5zdGFuY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX21vZGUpOworICAgICAgfQorCisgICAgICBpZiAoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0dFT01FVFJZICYmIHZhcl9tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4pCisgICAgICAgICBoYW5kbGVfZ2VvbWV0cnlfc2hhZGVyX2lucHV0X2RlY2woc3RhdGUsIGxvYywgdmFyKTsKKworICAgICAgaWYgKGlyX3ZhcmlhYmxlICplYXJsaWVyID0KKyAgICAgICAgICBzdGF0ZS0+c3ltYm9scy0+Z2V0X3ZhcmlhYmxlKHRoaXMtPmluc3RhbmNlX25hbWUpKSB7CisgICAgICAgICBpZiAoIXJlZGVjbGFyaW5nX3Blcl92ZXJ0ZXgpIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJgJXMnIHJlZGVjbGFyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5pbnN0YW5jZV9uYW1lKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVhcmxpZXItPmRhdGEuaG93X2RlY2xhcmVkID0gaXJfdmFyX2RlY2xhcmVkX25vcm1hbGx5OworICAgICAgICAgZWFybGllci0+dHlwZSA9IHZhci0+dHlwZTsKKyAgICAgICAgIGVhcmxpZXItPnJlaW5pdF9pbnRlcmZhY2VfdHlwZShibG9ja190eXBlKTsKKyAgICAgICAgIGRlbGV0ZSB2YXI7CisgICAgICB9IGVsc2UgeworICAgICAgICAgLyogUHJvcGFnYXRlIHRoZSAiYmluZGluZyIga2V5d29yZCBpbnRvIHRoaXMgVUJPJ3MgZmllbGRzOworICAgICAgICAgICogdGhlIFVCTyBkZWNsYXJhdGlvbiBpdHNlbGYgZG9lc24ndCBnZXQgYW4gaXJfdmFyaWFibGUgdW5sZXNzIGl0CisgICAgICAgICAgKiBoYXMgYW4gaW5zdGFuY2UgbmFtZS4gIFRoaXMgaXMgdWdseS4KKyAgICAgICAgICAqLworICAgICAgICAgdmFyLT5kYXRhLmV4cGxpY2l0X2JpbmRpbmcgPSB0aGlzLT5sYXlvdXQuZmxhZ3MucS5leHBsaWNpdF9iaW5kaW5nOworICAgICAgICAgdmFyLT5kYXRhLmJpbmRpbmcgPSB0aGlzLT5sYXlvdXQuYmluZGluZzsKKworICAgICAgICAgc3RhdGUtPnN5bWJvbHMtPmFkZF92YXJpYWJsZSh2YXIpOworICAgICAgICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwodmFyKTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBJbiBvcmRlciB0byBoYXZlIGFuIGFycmF5IHNpemUsIHRoZSBibG9jayBtdXN0IGFsc28gYmUgZGVjbGFyZWQgd2l0aAorICAgICAgICogYW4gaW5zdGFuY2UgbmFtZS4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KHRoaXMtPmFycmF5X3NwZWNpZmllciA9PSBOVUxMKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV92YXJpYWJsZXM7IGkrKykgeworICAgICAgICAgaXJfdmFyaWFibGUgKnZhciA9CisgICAgICAgICAgICBuZXcoc3RhdGUpIGlyX3ZhcmlhYmxlKGZpZWxkc1tpXS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWxsb2Nfc3RyZHVwKHN0YXRlLCBmaWVsZHNbaV0ubmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9tb2RlKTsKKyAgICAgICAgIHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uID0gZmllbGRzW2ldLmludGVycG9sYXRpb247CisgICAgICAgICB2YXItPmRhdGEuY2VudHJvaWQgPSBmaWVsZHNbaV0uY2VudHJvaWQ7CisgICAgICAgICB2YXItPmRhdGEuc2FtcGxlID0gZmllbGRzW2ldLnNhbXBsZTsKKyAgICAgICAgIHZhci0+aW5pdF9pbnRlcmZhY2VfdHlwZShibG9ja190eXBlKTsKKworICAgICAgICAgaWYgKHJlZGVjbGFyaW5nX3Blcl92ZXJ0ZXgpIHsKKyAgICAgICAgICAgIGlyX3ZhcmlhYmxlICplYXJsaWVyID0KKyAgICAgICAgICAgICAgIGdldF92YXJpYWJsZV9iZWluZ19yZWRlY2xhcmVkKHZhciwgbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYWxsb3dfYWxsX3JlZGVjbGFyYXRpb25zICovKTsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKHZhci0+bmFtZSwgImdsXyIsIDMpICE9IDAgfHwgZWFybGllciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVkZWNsYXJhdGlvbiBvZiBnbF9QZXJWZXJ0ZXggY2FuIG9ubHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZSBidWlsdC1pbiB2YXJpYWJsZXMiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFybGllci0+ZGF0YS5ob3dfZGVjbGFyZWQgPT0gaXJfdmFyX2RlY2xhcmVkX25vcm1hbGx5KSB7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYCVzJyBoYXMgYWxyZWFkeSBiZWVuIHJlZGVjbGFyZWQiLCB2YXItPm5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIGVhcmxpZXItPmRhdGEuaG93X2RlY2xhcmVkID0gaXJfdmFyX2RlY2xhcmVkX2luX2Jsb2NrOworICAgICAgICAgICAgICAgZWFybGllci0+cmVpbml0X2ludGVyZmFjZV90eXBlKGJsb2NrX3R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChzdGF0ZS0+c3ltYm9scy0+Z2V0X3ZhcmlhYmxlKHZhci0+bmFtZSkgIT0gTlVMTCkKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJgJXMnIHJlZGVjbGFyZWQiLCB2YXItPm5hbWUpOworCisgICAgICAgICAvKiBQcm9wYWdhdGUgdGhlICJiaW5kaW5nIiBrZXl3b3JkIGludG8gdGhpcyBVQk8ncyBmaWVsZHM7CisgICAgICAgICAgKiB0aGUgVUJPIGRlY2xhcmF0aW9uIGl0c2VsZiBkb2Vzbid0IGdldCBhbiBpcl92YXJpYWJsZSB1bmxlc3MgaXQKKyAgICAgICAgICAqIGhhcyBhbiBpbnN0YW5jZSBuYW1lLiAgVGhpcyBpcyB1Z2x5LgorICAgICAgICAgICovCisgICAgICAgICB2YXItPmRhdGEuZXhwbGljaXRfYmluZGluZyA9IHRoaXMtPmxheW91dC5mbGFncy5xLmV4cGxpY2l0X2JpbmRpbmc7CisgICAgICAgICB2YXItPmRhdGEuYmluZGluZyA9IHRoaXMtPmxheW91dC5iaW5kaW5nOworCisgICAgICAgICBzdGF0ZS0+c3ltYm9scy0+YWRkX3ZhcmlhYmxlKHZhcik7CisgICAgICAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbCh2YXIpOworICAgICAgfQorCisgICAgICBpZiAocmVkZWNsYXJpbmdfcGVyX3ZlcnRleCAmJiBibG9ja190eXBlICE9IGVhcmxpZXJfcGVyX3ZlcnRleCkgeworICAgICAgICAgLyogRnJvbSBzZWN0aW9uIDcuMSAoIkJ1aWx0LWluIExhbmd1YWdlIFZhcmlhYmxlcyIpIG9mIHRoZSBHTFNMIDQuMTAgc3BlYzoKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAgSXQgaXMgYWxzbyBhIGNvbXBpbGF0aW9uIGVycm9yIC4uLiB0byByZWRlY2xhcmUgYSBidWlsdC1pbgorICAgICAgICAgICogICAgIGJsb2NrIGFuZCB0aGVuIHVzZSBhIG1lbWJlciBmcm9tIHRoYXQgYnVpbHQtaW4gYmxvY2sgdGhhdCB3YXMKKyAgICAgICAgICAqICAgICBub3QgaW5jbHVkZWQgaW4gdGhlIHJlZGVjbGFyYXRpb24uCisgICAgICAgICAgKgorICAgICAgICAgICogVGhpcyBhcHBlYXJzIHRvIGJlIGEgY2xhcmlmaWNhdGlvbiB0byB0aGUgYmVoYXZpb3VyIGVzdGFibGlzaGVkCisgICAgICAgICAgKiBmb3IgZ2xfUGVyVmVydGV4IGJ5IEdMU0wgMS41MCwgdGhlcmVmb3JlIHdlIGltcGxlbWVudCB0aGlzCisgICAgICAgICAgKiBiZWhhdmlvdXIgcmVnYXJkbGVzcyBvZiBHTFNMIHZlcnNpb24uCisgICAgICAgICAgKgorICAgICAgICAgICogVG8gcHJldmVudCB0aGUgc2hhZGVyIGZyb20gdXNpbmcgYSBtZW1iZXIgdGhhdCB3YXMgbm90IGluY2x1ZGVkIGluCisgICAgICAgICAgKiB0aGUgcmVkZWNsYXJhdGlvbiwgd2UgZGlzYWJsZSBhbnkgaXJfdmFyaWFibGVzIHRoYXQgYXJlIHN0aWxsCisgICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBkZWNsYXJhdGlvbiBvZiBnbF9QZXJWZXJ0ZXggKHNpbmNlIHdlJ3ZlCisgICAgICAgICAgKiBhbHJlYWR5IHVwZGF0ZWQgYWxsIG9mIHRoZSB2YXJpYWJsZXMgY29udGFpbmVkIGluIHRoZSBuZXcKKyAgICAgICAgICAqIGdsX1BlclZlcnRleCB0byBwb2ludCB0byBpdCkuCisgICAgICAgICAgKgorICAgICAgICAgICogQXMgYSBzaWRlIGVmZmVjdCB0aGlzIHdpbGwgcHJldmVudAorICAgICAgICAgICogdmFsaWRhdGVfaW50cmFzdGFnZV9pbnRlcmZhY2VfYmxvY2tzKCkgZnJvbSBnZXR0aW5nIGNvbmZ1c2VkIGFuZAorICAgICAgICAgICogdGhpbmtpbmcgdGhlcmUgYXJlIGNvbmZsaWN0aW5nIGRlZmluaXRpb25zIG9mIGdsX1BlclZlcnRleCBpbiB0aGUKKyAgICAgICAgICAqIHNoYWRlci4KKyAgICAgICAgICAqLworICAgICAgICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKyAgICAgICAgICAgIGlmICh2YXIgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCkgPT0gZWFybGllcl9wZXJfdmVydGV4ICYmCisgICAgICAgICAgICAgICAgdmFyLT5kYXRhLm1vZGUgPT0gdmFyX21vZGUpIHsKKyAgICAgICAgICAgICAgIGlmICh2YXItPmRhdGEuaG93X2RlY2xhcmVkID09IGlyX3Zhcl9kZWNsYXJlZF9ub3JtYWxseSkgeworICAgICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZGVjbGFyYXRpb24gb2YgZ2xfUGVyVmVydGV4IGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2xsb3cgYSByZWRlY2xhcmF0aW9uIG9mIGAlcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPm5hbWUpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgc3RhdGUtPnN5bWJvbHMtPmRpc2FibGVfdmFyaWFibGUodmFyLT5uYW1lKTsKKyAgICAgICAgICAgICAgIHZhci0+cmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorCisKK2lyX3J2YWx1ZSAqCithc3RfZ3NfaW5wdXRfbGF5b3V0OjpoaXIoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgWVlMVFlQRSBsb2MgPSB0aGlzLT5nZXRfbG9jYXRpb24oKTsKKworICAgLyogSWYgYW55IGdlb21ldHJ5IGlucHV0IGxheW91dCBkZWNsYXJhdGlvbiBwcmVjZWRlZCB0aGlzIG9uZSwgbWFrZSBzdXJlIGl0CisgICAgKiB3YXMgY29uc2lzdGVudCB3aXRoIHRoaXMgb25lLgorICAgICovCisgICBpZiAoc3RhdGUtPmdzX2lucHV0X3ByaW1fdHlwZV9zcGVjaWZpZWQgJiYKKyAgICAgICBzdGF0ZS0+aW5fcXVhbGlmaWVyLT5wcmltX3R5cGUgIT0gdGhpcy0+cHJpbV90eXBlKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiZ2VvbWV0cnkgc2hhZGVyIGlucHV0IGxheW91dCBkb2VzIG5vdCBtYXRjaCIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBwcmV2aW91cyBkZWNsYXJhdGlvbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIC8qIElmIGFueSBzaGFkZXIgaW5wdXRzIG9jY3VycmVkIGJlZm9yZSB0aGlzIGRlY2xhcmF0aW9uIGFuZCBzcGVjaWZpZWQgYW4KKyAgICAqIGFycmF5IHNpemUsIG1ha2Ugc3VyZSB0aGUgc2l6ZSB0aGV5IHNwZWNpZmllZCBpcyBjb25zaXN0ZW50IHdpdGggdGhlCisgICAgKiBwcmltaXRpdmUgdHlwZS4KKyAgICAqLworICAgdW5zaWduZWQgbnVtX3ZlcnRpY2VzID0gdmVydGljZXNfcGVyX3ByaW0odGhpcy0+cHJpbV90eXBlKTsKKyAgIGlmIChzdGF0ZS0+Z3NfaW5wdXRfc2l6ZSAhPSAwICYmIHN0YXRlLT5nc19pbnB1dF9zaXplICE9IG51bV92ZXJ0aWNlcykgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgZ2VvbWV0cnkgc2hhZGVyIGlucHV0IGxheW91dCBpbXBsaWVzICV1IHZlcnRpY2VzIgorICAgICAgICAgICAgICAgICAgICAgICAiIHBlciBwcmltaXRpdmUsIGJ1dCBhIHByZXZpb3VzIGlucHV0IGlzIGRlY2xhcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggc2l6ZSAldSIsIG51bV92ZXJ0aWNlcywgc3RhdGUtPmdzX2lucHV0X3NpemUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHN0YXRlLT5nc19pbnB1dF9wcmltX3R5cGVfc3BlY2lmaWVkID0gdHJ1ZTsKKworICAgLyogSWYgYW55IHNoYWRlciBpbnB1dHMgb2NjdXJyZWQgYmVmb3JlIHRoaXMgZGVjbGFyYXRpb24gYW5kIGRpZCBub3QKKyAgICAqIHNwZWNpZnkgYW4gYXJyYXkgc2l6ZSwgdGhlaXIgc2l6ZSBpcyBkZXRlcm1pbmVkIG5vdy4KKyAgICAqLworICAgZm9yZWFjaF9saXN0IChub2RlLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworICAgICAgaWYgKHZhciA9PSBOVUxMIHx8IHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9zaGFkZXJfaW4pCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogTm90ZTogZ2xfUHJpbWl0aXZlSURJbiBoYXMgbW9kZSBpcl92YXJfc2hhZGVyX2luLCBidXQgaXQncyBub3QgYW4KKyAgICAgICAqIGFycmF5OyBza2lwIGl0LgorICAgICAgICovCisKKyAgICAgIGlmICh2YXItPnR5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkgeworICAgICAgICAgaWYgKHZhci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzID49IG51bV92ZXJ0aWNlcykgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgZ2VvbWV0cnkgc2hhZGVyIGlucHV0IGxheW91dCBpbXBsaWVzICV1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZlcnRpY2VzLCBidXQgYW4gYWNjZXNzIHRvIGVsZW1lbnQgJXUgb2YgaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYCVzJyBhbHJlYWR5IGV4aXN0cyIsIG51bV92ZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MsIHZhci0+bmFtZSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFyLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UodmFyLT50eXBlLT5maWVsZHMuYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmVydGljZXMpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9ydmFsdWUgKgorYXN0X2NzX2lucHV0X2xheW91dDo6aGlyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIFlZTFRZUEUgbG9jID0gdGhpcy0+Z2V0X2xvY2F0aW9uKCk7CisKKyAgIC8qIElmIGFueSBjb21wdXRlIGlucHV0IGxheW91dCBkZWNsYXJhdGlvbiBwcmVjZWRlZCB0aGlzIG9uZSwgbWFrZSBzdXJlIGl0CisgICAgKiB3YXMgY29uc2lzdGVudCB3aXRoIHRoaXMgb25lLgorICAgICovCisgICBpZiAoc3RhdGUtPmNzX2lucHV0X2xvY2FsX3NpemVfc3BlY2lmaWVkKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgaWYgKHN0YXRlLT5jc19pbnB1dF9sb2NhbF9zaXplW2ldICE9IHRoaXMtPmxvY2FsX3NpemVbaV0pIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wdXRlIHNoYWRlciBpbnB1dCBsYXlvdXQgZG9lcyBub3QgbWF0Y2giCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcHJldmlvdXMgZGVjbGFyYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBGcm9tIHRoZSBBUkJfY29tcHV0ZV9zaGFkZXIgc3BlY2lmaWNhdGlvbjoKKyAgICAqCisgICAgKiAgICAgSWYgdGhlIGxvY2FsIHNpemUgb2YgdGhlIHNoYWRlciBpbiBhbnkgZGltZW5zaW9uIGlzIGdyZWF0ZXIKKyAgICAqICAgICB0aGFuIHRoZSBtYXhpbXVtIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhhdAorICAgICogICAgIGRpbWVuc2lvbiwgYSBjb21waWxlLXRpbWUgZXJyb3IgcmVzdWx0cy4KKyAgICAqCisgICAgKiBJdCBpcyBub3QgY2xlYXIgZnJvbSB0aGUgc3BlYyBob3cgdGhlIGVycm9yIHNob3VsZCBiZSByZXBvcnRlZCBpZgorICAgICogdGhlIHRvdGFsIHNpemUgb2YgdGhlIHdvcmsgZ3JvdXAgZXhjZWVkcworICAgICogTUFYX0NPTVBVVEVfV09SS19HUk9VUF9JTlZPQ0FUSU9OUywgYnV0IGl0IHNlZW1zIHJlYXNvbmFibGUgdG8KKyAgICAqIHJlcG9ydCBpdCBhdCBjb21waWxlIHRpbWUgYXMgd2VsbC4KKyAgICAqLworICAgR0x1aW50NjQgdG90YWxfaW52b2NhdGlvbnMgPSAxOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIGlmICh0aGlzLT5sb2NhbF9zaXplW2ldID4gc3RhdGUtPmN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbaV0pIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbF9zaXplXyVjIGV4Y2VlZHMgTUFYX0NPTVBVVEVfV09SS19HUk9VUF9TSVpFIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICglZCkiLCAneCcgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwU2l6ZVtpXSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRvdGFsX2ludm9jYXRpb25zICo9IHRoaXMtPmxvY2FsX3NpemVbaV07CisgICAgICBpZiAodG90YWxfaW52b2NhdGlvbnMgPgorICAgICAgICAgIHN0YXRlLT5jdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBJbnZvY2F0aW9ucykgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y3Qgb2YgbG9jYWxfc2l6ZXMgZXhjZWVkcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNQVhfQ09NUFVURV9XT1JLX0dST1VQX0lOVk9DQVRJT05TICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIHN0YXRlLT5jc19pbnB1dF9sb2NhbF9zaXplX3NwZWNpZmllZCA9IHRydWU7CisgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgIHN0YXRlLT5jc19pbnB1dF9sb2NhbF9zaXplW2ldID0gdGhpcy0+bG9jYWxfc2l6ZVtpXTsKKworICAgLyogV2UgbWF5IG5vdyBkZWNsYXJlIHRoZSBidWlsdC1pbiBjb25zdGFudCBnbF9Xb3JrR3JvdXBTaXplIChzZWUKKyAgICAqIGJ1aWx0aW5fdmFyaWFibGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdGFudHMoKSBmb3Igd2h5IHdlIGRpZG4ndAorICAgICogZGVjbGFyZSBpdCBlYXJsaWVyKS4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKnZhciA9IG5ldyhzdGF0ZS0+c3ltYm9scykKKyAgICAgIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgImdsX1dvcmtHcm91cFNpemUiLCBpcl92YXJfYXV0byk7CisgICB2YXItPmRhdGEuaG93X2RlY2xhcmVkID0gaXJfdmFyX2RlY2xhcmVkX2ltcGxpY2l0bHk7CisgICB2YXItPmRhdGEucmVhZF9vbmx5ID0gdHJ1ZTsKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKHZhcik7CisgICBzdGF0ZS0+c3ltYm9scy0+YWRkX3ZhcmlhYmxlKHZhcik7CisgICBpcl9jb25zdGFudF9kYXRhIGRhdGE7CisgICBtZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgIGRhdGEuaVtpXSA9IHRoaXMtPmxvY2FsX3NpemVbaV07CisgICB2YXItPmNvbnN0YW50X3ZhbHVlID0gbmV3KHZhcikgaXJfY29uc3RhbnQoZ2xzbF90eXBlOjppdmVjM190eXBlLCAmZGF0YSk7CisgICB2YXItPmNvbnN0YW50X2luaXRpYWxpemVyID0KKyAgICAgIG5ldyh2YXIpIGlyX2NvbnN0YW50KGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgJmRhdGEpOworICAgdmFyLT5kYXRhLmhhc19pbml0aWFsaXplciA9IHRydWU7CisKKyAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkCitkZXRlY3RfY29uZmxpY3RpbmdfYXNzaWdubWVudHMoc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgYm9vbCBnbF9GcmFnQ29sb3JfYXNzaWduZWQgPSBmYWxzZTsKKyAgIGJvb2wgZ2xfRnJhZ0RhdGFfYXNzaWduZWQgPSBmYWxzZTsKKyAgIGJvb2wgdXNlcl9kZWZpbmVkX2ZzX291dHB1dF9hc3NpZ25lZCA9IGZhbHNlOworICAgaXJfdmFyaWFibGUgKnVzZXJfZGVmaW5lZF9mc19vdXRwdXQgPSBOVUxMOworCisgICAvKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgcHJvcGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uLiAqLworICAgWVlMVFlQRSBsb2M7CisgICBtZW1zZXQoJmxvYywgMCwgc2l6ZW9mKGxvYykpOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl92YXJpYWJsZSAqdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKW5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAoIXZhciB8fCAhdmFyLT5kYXRhLmFzc2lnbmVkKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChzdHJjbXAodmFyLT5uYW1lLCAiZ2xfRnJhZ0NvbG9yIikgPT0gMCkKKyAgICAgICAgIGdsX0ZyYWdDb2xvcl9hc3NpZ25lZCA9IHRydWU7CisgICAgICBlbHNlIGlmIChzdHJjbXAodmFyLT5uYW1lLCAiZ2xfRnJhZ0RhdGEiKSA9PSAwKQorICAgICAgICAgZ2xfRnJhZ0RhdGFfYXNzaWduZWQgPSB0cnVlOworICAgICAgZWxzZSBpZiAoc3RybmNtcCh2YXItPm5hbWUsICJnbF8iLCAzKSAhPSAwKSB7CisgICAgICAgICBpZiAoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UICYmCisgICAgICAgICAgICAgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9vdXQpIHsKKyAgICAgICAgICAgIHVzZXJfZGVmaW5lZF9mc19vdXRwdXRfYXNzaWduZWQgPSB0cnVlOworICAgICAgICAgICAgdXNlcl9kZWZpbmVkX2ZzX291dHB1dCA9IHZhcjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogRnJvbSB0aGUgR0xTTCAxLjMwIHNwZWM6CisgICAgKgorICAgICogICAgICJJZiBhIHNoYWRlciBzdGF0aWNhbGx5IGFzc2lnbnMgYSB2YWx1ZSB0byBnbF9GcmFnQ29sb3IsIGl0CisgICAgKiAgICAgIG1heSBub3QgYXNzaWduIGEgdmFsdWUgdG8gYW55IGVsZW1lbnQgb2YgZ2xfRnJhZ0RhdGEuIElmIGEKKyAgICAqICAgICAgc2hhZGVyIHN0YXRpY2FsbHkgd3JpdGVzIGEgdmFsdWUgdG8gYW55IGVsZW1lbnQgb2YKKyAgICAqICAgICAgZ2xfRnJhZ0RhdGEsIGl0IG1heSBub3QgYXNzaWduIGEgdmFsdWUgdG8KKyAgICAqICAgICAgZ2xfRnJhZ0NvbG9yLiBUaGF0IGlzLCBhIHNoYWRlciBtYXkgYXNzaWduIHZhbHVlcyB0byBlaXRoZXIKKyAgICAqICAgICAgZ2xfRnJhZ0NvbG9yIG9yIGdsX0ZyYWdEYXRhLCBidXQgbm90IGJvdGguIE11bHRpcGxlIHNoYWRlcnMKKyAgICAqICAgICAgbGlua2VkIHRvZ2V0aGVyIG11c3QgYWxzbyBjb25zaXN0ZW50bHkgd3JpdGUganVzdCBvbmUgb2YKKyAgICAqICAgICAgdGhlc2UgdmFyaWFibGVzLiAgU2ltaWxhcmx5LCBpZiB1c2VyIGRlY2xhcmVkIG91dHB1dAorICAgICogICAgICB2YXJpYWJsZXMgYXJlIGluIHVzZSAoc3RhdGljYWxseSBhc3NpZ25lZCB0byksIHRoZW4gdGhlCisgICAgKiAgICAgIGJ1aWx0LWluIHZhcmlhYmxlcyBnbF9GcmFnQ29sb3IgYW5kIGdsX0ZyYWdEYXRhIG1heSBub3QgYmUKKyAgICAqICAgICAgYXNzaWduZWQgdG8uIFRoZXNlIGluY29ycmVjdCB1c2FnZXMgYWxsIGdlbmVyYXRlIGNvbXBpbGUKKyAgICAqICAgICAgdGltZSBlcnJvcnMuIgorICAgICovCisgICBpZiAoZ2xfRnJhZ0NvbG9yX2Fzc2lnbmVkICYmIGdsX0ZyYWdEYXRhX2Fzc2lnbmVkKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAiZnJhZ21lbnQgc2hhZGVyIHdyaXRlcyB0byBib3RoICIKKyAgICAgICAgICAgICAgICAgICAgICAgImBnbF9GcmFnQ29sb3InIGFuZCBgZ2xfRnJhZ0RhdGEnIik7CisgICB9IGVsc2UgaWYgKGdsX0ZyYWdDb2xvcl9hc3NpZ25lZCAmJiB1c2VyX2RlZmluZWRfZnNfb3V0cHV0X2Fzc2lnbmVkKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAiZnJhZ21lbnQgc2hhZGVyIHdyaXRlcyB0byBib3RoICIKKyAgICAgICAgICAgICAgICAgICAgICAgImBnbF9GcmFnQ29sb3InIGFuZCBgJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kZWZpbmVkX2ZzX291dHB1dC0+bmFtZSk7CisgICB9IGVsc2UgaWYgKGdsX0ZyYWdEYXRhX2Fzc2lnbmVkICYmIHVzZXJfZGVmaW5lZF9mc19vdXRwdXRfYXNzaWduZWQpIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJmcmFnbWVudCBzaGFkZXIgd3JpdGVzIHRvIGJvdGggIgorICAgICAgICAgICAgICAgICAgICAgICAiYGdsX0ZyYWdEYXRhJyBhbmQgYCVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGVmaW5lZF9mc19vdXRwdXQtPm5hbWUpOworICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZW1vdmVfcGVyX3ZlcnRleF9ibG9ja3MoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsIGlyX3ZhcmlhYmxlX21vZGUgbW9kZSkKK3sKKyAgIC8qIEZpbmQgdGhlIGdsX1BlclZlcnRleCBpbnRlcmZhY2UgYmxvY2sgb2YgdGhlIGFwcHJvcHJpYXRlIChpbi9vdXQpIG1vZGUsCisgICAgKiBpZiBpdCBleGlzdHMgaW4gdGhpcyBzaGFkZXIgdHlwZS4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICpwZXJfdmVydGV4ID0gTlVMTDsKKyAgIHN3aXRjaCAobW9kZSkgeworICAgY2FzZSBpcl92YXJfc2hhZGVyX2luOgorICAgICAgaWYgKGlyX3ZhcmlhYmxlICpnbF9pbiA9IHN0YXRlLT5zeW1ib2xzLT5nZXRfdmFyaWFibGUoImdsX2luIikpCisgICAgICAgICBwZXJfdmVydGV4ID0gZ2xfaW4tPmdldF9pbnRlcmZhY2VfdHlwZSgpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Zhcl9zaGFkZXJfb3V0OgorICAgICAgaWYgKGlyX3ZhcmlhYmxlICpnbF9Qb3NpdGlvbiA9CisgICAgICAgICAgc3RhdGUtPnN5bWJvbHMtPmdldF92YXJpYWJsZSgiZ2xfUG9zaXRpb24iKSkgeworICAgICAgICAgcGVyX3ZlcnRleCA9IGdsX1Bvc2l0aW9uLT5nZXRfaW50ZXJmYWNlX3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIlVuZXhwZWN0ZWQgbW9kZSIpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGEgYnVpbHQtaW4gZ2xfUGVyVmVydGV4IGludGVyZmFjZSBibG9jaywgdGhlbiB3ZSBkb24ndAorICAgICogbmVlZCB0byBkbyBhbnl0aGluZy4KKyAgICAqLworICAgaWYgKHBlcl92ZXJ0ZXggPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgLyogSWYgdGhlIGludGVyZmFjZSBibG9jayBpcyB1c2VkIGJ5IHRoZSBzaGFkZXIsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbworICAgICogYW55dGhpbmcuCisgICAgKi8KKyAgIGludGVyZmFjZV9ibG9ja191c2FnZV92aXNpdG9yIHYobW9kZSwgcGVyX3ZlcnRleCk7CisgICB2LnJ1bihpbnN0cnVjdGlvbnMpOworICAgaWYgKHYudXNhZ2VfZm91bmQoKSkKKyAgICAgIHJldHVybjsKKworICAgLyogUmVtb3ZlIGFueSBpcl92YXJpYWJsZSBkZWNsYXJhdGlvbnMgdGhhdCByZWZlciB0byB0aGUgaW50ZXJmYWNlIGJsb2NrCisgICAgKiB3ZSdyZSByZW1vdmluZy4KKyAgICAqLworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKyAgICAgIGlmICh2YXIgIT0gTlVMTCAmJiB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpID09IHBlcl92ZXJ0ZXggJiYKKyAgICAgICAgICB2YXItPmRhdGEubW9kZSA9PSBtb2RlKSB7CisgICAgICAgICBzdGF0ZS0+c3ltYm9scy0+ZGlzYWJsZV92YXJpYWJsZSh2YXItPm5hbWUpOworICAgICAgICAgdmFyLT5yZW1vdmUoKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0X3R5cGUuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9hc3RfdHlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMmM0OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYXN0X3R5cGUuY3BwCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImFzdC5oIgorCit2b2lkCithc3RfdHlwZV9zcGVjaWZpZXI6OnByaW50KHZvaWQpIGNvbnN0Cit7CisgICBpZiAoc3RydWN0dXJlKSB7CisgICAgICBzdHJ1Y3R1cmUtPnByaW50KCk7CisgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCIlcyAiLCB0eXBlX25hbWUpOworICAgfQorCisgICBpZiAoYXJyYXlfc3BlY2lmaWVyKSB7CisgICAgICBhcnJheV9zcGVjaWZpZXItPnByaW50KCk7CisgICB9Cit9CisKK2Jvb2wKK2FzdF9mdWxseV9zcGVjaWZpZWRfdHlwZTo6aGFzX3F1YWxpZmllcnMoKSBjb25zdAoreworICAgcmV0dXJuIHRoaXMtPnF1YWxpZmllci5mbGFncy5pICE9IDA7Cit9CisKK2Jvb2wgYXN0X3R5cGVfcXVhbGlmaWVyOjpoYXNfaW50ZXJwb2xhdGlvbigpIGNvbnN0Cit7CisgICByZXR1cm4gdGhpcy0+ZmxhZ3MucS5zbW9vdGgKKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLmZsYXQKKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLm5vcGVyc3BlY3RpdmU7Cit9CisKK2Jvb2wKK2FzdF90eXBlX3F1YWxpZmllcjo6aGFzX2xheW91dCgpIGNvbnN0Cit7CisgICByZXR1cm4gdGhpcy0+ZmxhZ3MucS5vcmlnaW5fdXBwZXJfbGVmdAorICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEucGl4ZWxfY2VudGVyX2ludGVnZXIKKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLmRlcHRoX2FueQorICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEuZGVwdGhfZ3JlYXRlcgorICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEuZGVwdGhfbGVzcworICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEuZGVwdGhfdW5jaGFuZ2VkCisgICAgICAgICAgfHwgdGhpcy0+ZmxhZ3MucS5zdGQxNDAKKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLnNoYXJlZAorICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEuY29sdW1uX21ham9yCisgICAgICAgICAgfHwgdGhpcy0+ZmxhZ3MucS5yb3dfbWFqb3IKKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLnBhY2tlZAorICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEuZXhwbGljaXRfbG9jYXRpb24KKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLmV4cGxpY2l0X2luZGV4CisgICAgICAgICAgfHwgdGhpcy0+ZmxhZ3MucS5leHBsaWNpdF9iaW5kaW5nCisgICAgICAgICAgfHwgdGhpcy0+ZmxhZ3MucS5leHBsaWNpdF9vZmZzZXQ7Cit9CisKK2Jvb2wKK2FzdF90eXBlX3F1YWxpZmllcjo6aGFzX3N0b3JhZ2UoKSBjb25zdAoreworICAgcmV0dXJuIHRoaXMtPmZsYWdzLnEuY29uc3RhbnQKKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLmF0dHJpYnV0ZQorICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEudmFyeWluZworICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEuaW4KKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLm91dAorICAgICAgICAgIHx8IHRoaXMtPmZsYWdzLnEudW5pZm9ybTsKK30KKworYm9vbAorYXN0X3R5cGVfcXVhbGlmaWVyOjpoYXNfYXV4aWxpYXJ5X3N0b3JhZ2UoKSBjb25zdAoreworICAgcmV0dXJuIHRoaXMtPmZsYWdzLnEuY2VudHJvaWQKKyAgICAgICAgICB8fCB0aGlzLT5mbGFncy5xLnNhbXBsZTsKK30KKworY29uc3QgY2hhcioKK2FzdF90eXBlX3F1YWxpZmllcjo6aW50ZXJwb2xhdGlvbl9zdHJpbmcoKSBjb25zdAoreworICAgaWYgKHRoaXMtPmZsYWdzLnEuc21vb3RoKQorICAgICAgcmV0dXJuICJzbW9vdGgiOworICAgZWxzZSBpZiAodGhpcy0+ZmxhZ3MucS5mbGF0KQorICAgICAgcmV0dXJuICJmbGF0IjsKKyAgIGVsc2UgaWYgKHRoaXMtPmZsYWdzLnEubm9wZXJzcGVjdGl2ZSkKKyAgICAgIHJldHVybiAibm9wZXJzcGVjdGl2ZSI7CisgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbAorYXN0X3R5cGVfcXVhbGlmaWVyOjptZXJnZV9xdWFsaWZpZXIoWVlMVFlQRSAqbG9jLAorCQkJCSAgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgYXN0X3R5cGVfcXVhbGlmaWVyIHEpCit7CisgICBhc3RfdHlwZV9xdWFsaWZpZXIgdWJvX21hdF9tYXNrOworICAgdWJvX21hdF9tYXNrLmZsYWdzLmkgPSAwOworICAgdWJvX21hdF9tYXNrLmZsYWdzLnEucm93X21ham9yID0gMTsKKyAgIHVib19tYXRfbWFzay5mbGFncy5xLmNvbHVtbl9tYWpvciA9IDE7CisKKyAgIGFzdF90eXBlX3F1YWxpZmllciB1Ym9fbGF5b3V0X21hc2s7CisgICB1Ym9fbGF5b3V0X21hc2suZmxhZ3MuaSA9IDA7CisgICB1Ym9fbGF5b3V0X21hc2suZmxhZ3MucS5zdGQxNDAgPSAxOworICAgdWJvX2xheW91dF9tYXNrLmZsYWdzLnEucGFja2VkID0gMTsKKyAgIHVib19sYXlvdXRfbWFzay5mbGFncy5xLnNoYXJlZCA9IDE7CisKKyAgIGFzdF90eXBlX3F1YWxpZmllciB1Ym9fYmluZGluZ19tYXNrOworICAgdWJvX2JpbmRpbmdfbWFzay5mbGFncy5pID0gMDsKKyAgIHVib19iaW5kaW5nX21hc2suZmxhZ3MucS5leHBsaWNpdF9iaW5kaW5nID0gMTsKKyAgIHVib19iaW5kaW5nX21hc2suZmxhZ3MucS5leHBsaWNpdF9vZmZzZXQgPSAxOworCisgICAvKiBVbmlmb3JtIGJsb2NrIGxheW91dCBxdWFsaWZpZXJzIGdldCB0byBvdmVyd3JpdGUgZWFjaAorICAgICogb3RoZXIgKHJpZ2h0bW9zdCBoYXZpbmcgcHJpb3JpdHkpLCB3aGlsZSBhbGwgb3RoZXIKKyAgICAqIHF1YWxpZmllcnMgY3VycmVudGx5IGRvbid0IGFsbG93IGR1cGxpY2F0ZXMuCisgICAgKi8KKworICAgaWYgKCh0aGlzLT5mbGFncy5pICYgcS5mbGFncy5pICYgfih1Ym9fbWF0X21hc2suZmxhZ3MuaSB8CisJCQkJICAgICAgdWJvX2xheW91dF9tYXNrLmZsYWdzLmkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ym9fYmluZGluZ19tYXNrLmZsYWdzLmkpKSAhPSAwKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisJCSAgICAgICAiZHVwbGljYXRlIGxheW91dCBxdWFsaWZpZXJzIHVzZWQiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgaWYgKHEuZmxhZ3MucS5wcmltX3R5cGUpIHsKKyAgICAgIGlmICh0aGlzLT5mbGFncy5xLnByaW1fdHlwZSAmJiB0aGlzLT5wcmltX3R5cGUgIT0gcS5wcmltX3R5cGUpIHsKKwkgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorCQkJICAiY29uZmxpY3RpbmcgcHJpbWl0aXZlIHR5cGUgcXVhbGlmaWVycyB1c2VkIik7CisJIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHRoaXMtPnByaW1fdHlwZSA9IHEucHJpbV90eXBlOworICAgfQorCisgICBpZiAocS5mbGFncy5xLm1heF92ZXJ0aWNlcykgeworICAgICAgaWYgKHRoaXMtPmZsYWdzLnEubWF4X3ZlcnRpY2VzICYmIHRoaXMtPm1heF92ZXJ0aWNlcyAhPSBxLm1heF92ZXJ0aWNlcykgeworCSBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisJCQkgICJnZW9tZXRyeSBzaGFkZXIgc2V0IGNvbmZsaWN0aW5nIG1heF92ZXJ0aWNlcyAiCisJCQkgICIoJWQgYW5kICVkKSIsIHRoaXMtPm1heF92ZXJ0aWNlcywgcS5tYXhfdmVydGljZXMpOworCSByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB0aGlzLT5tYXhfdmVydGljZXMgPSBxLm1heF92ZXJ0aWNlczsKKyAgIH0KKworICAgaWYgKChxLmZsYWdzLmkgJiB1Ym9fbWF0X21hc2suZmxhZ3MuaSkgIT0gMCkKKyAgICAgIHRoaXMtPmZsYWdzLmkgJj0gfnVib19tYXRfbWFzay5mbGFncy5pOworICAgaWYgKChxLmZsYWdzLmkgJiB1Ym9fbGF5b3V0X21hc2suZmxhZ3MuaSkgIT0gMCkKKyAgICAgIHRoaXMtPmZsYWdzLmkgJj0gfnVib19sYXlvdXRfbWFzay5mbGFncy5pOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgaWYgKHEuZmxhZ3MucS5sb2NhbF9zaXplICYgKDEgPDwgaSkpIHsKKyAgICAgICAgIGlmICgodGhpcy0+ZmxhZ3MucS5sb2NhbF9zaXplICYgKDEgPDwgaSkpICYmCisgICAgICAgICAgICAgdGhpcy0+bG9jYWxfc2l6ZVtpXSAhPSBxLmxvY2FsX3NpemVbaV0pIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXB1dGUgc2hhZGVyIHNldCBjb25mbGljdGluZyB2YWx1ZXMgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsX3NpemVfJWMgKCVkIGFuZCAlZCkiLCAneCcgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5sb2NhbF9zaXplW2ldLCBxLmxvY2FsX3NpemVbaV0pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgICAgdGhpcy0+bG9jYWxfc2l6ZVtpXSA9IHEubG9jYWxfc2l6ZVtpXTsKKyAgICAgIH0KKyAgIH0KKworICAgdGhpcy0+ZmxhZ3MuaSB8PSBxLmZsYWdzLmk7CisKKyAgIGlmIChxLmZsYWdzLnEuZXhwbGljaXRfbG9jYXRpb24pCisgICAgICB0aGlzLT5sb2NhdGlvbiA9IHEubG9jYXRpb247CisKKyAgIGlmIChxLmZsYWdzLnEuZXhwbGljaXRfaW5kZXgpCisgICAgICB0aGlzLT5pbmRleCA9IHEuaW5kZXg7CisKKyAgIGlmIChxLmZsYWdzLnEuZXhwbGljaXRfYmluZGluZykKKyAgICAgIHRoaXMtPmJpbmRpbmcgPSBxLmJpbmRpbmc7CisKKyAgIGlmIChxLmZsYWdzLnEuZXhwbGljaXRfb2Zmc2V0KQorICAgICAgdGhpcy0+b2Zmc2V0ID0gcS5vZmZzZXQ7CisKKyAgIGlmIChxLnByZWNpc2lvbiAhPSBhc3RfcHJlY2lzaW9uX25vbmUpCisgICAgICB0aGlzLT5wcmVjaXNpb24gPSBxLnByZWNpc2lvbjsKKworICAgaWYgKHEuZmxhZ3MucS5leHBsaWNpdF9pbWFnZV9mb3JtYXQpIHsKKyAgICAgIHRoaXMtPmltYWdlX2Zvcm1hdCA9IHEuaW1hZ2VfZm9ybWF0OworICAgICAgdGhpcy0+aW1hZ2VfYmFzZV90eXBlID0gcS5pbWFnZV9iYXNlX3R5cGU7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitib29sCithc3RfdHlwZV9xdWFsaWZpZXI6Om1lcmdlX2luX3F1YWxpZmllcihZWUxUWVBFICpsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF90eXBlX3F1YWxpZmllciBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X25vZGUqICZub2RlKQoreworICAgdm9pZCAqbWVtX2N0eCA9IHN0YXRlOworICAgYm9vbCBjcmVhdGVfZ3NfYXN0ID0gZmFsc2U7CisgICBib29sIGNyZWF0ZV9jc19hc3QgPSBmYWxzZTsKKyAgIGFzdF90eXBlX3F1YWxpZmllciB2YWxpZF9pbl9tYXNrOworICAgdmFsaWRfaW5fbWFzay5mbGFncy5pID0gMDsKKworICAgc3dpdGNoIChzdGF0ZS0+c3RhZ2UpIHsKKyAgIGNhc2UgTUVTQV9TSEFERVJfR0VPTUVUUlk6CisgICAgICBpZiAocS5mbGFncy5xLnByaW1fdHlwZSkgeworICAgICAgICAgLyogTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBpbnB1dCBwcmltaXRpdmUgdHlwZS4gKi8KKyAgICAgICAgIHN3aXRjaCAocS5wcmltX3R5cGUpIHsKKyAgICAgICAgIGNhc2UgR0xfUE9JTlRTOgorICAgICAgICAgY2FzZSBHTF9MSU5FUzoKKyAgICAgICAgIGNhc2UgR0xfTElORVNfQURKQUNFTkNZOgorICAgICAgICAgY2FzZSBHTF9UUklBTkdMRVM6CisgICAgICAgICBjYXNlIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1k6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGdlb21ldHJ5IHNoYWRlciBpbnB1dCBwcmltaXRpdmUgdHlwZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNyZWF0ZV9nc19hc3QgfD0KKyAgICAgICAgIHEuZmxhZ3MucS5wcmltX3R5cGUgJiYKKyAgICAgICAgICFzdGF0ZS0+aW5fcXVhbGlmaWVyLT5mbGFncy5xLnByaW1fdHlwZTsKKworICAgICAgdmFsaWRfaW5fbWFzay5mbGFncy5xLnByaW1fdHlwZSA9IDE7CisgICAgICB2YWxpZF9pbl9tYXNrLmZsYWdzLnEuaW52b2NhdGlvbnMgPSAxOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0ZSQUdNRU5UOgorICAgICAgaWYgKHEuZmxhZ3MucS5lYXJseV9mcmFnbWVudF90ZXN0cykgeworICAgICAgICAgc3RhdGUtPmVhcmx5X2ZyYWdtZW50X3Rlc3RzID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvYywgc3RhdGUsICJpbnZhbGlkIGlucHV0IGxheW91dCBxdWFsaWZpZXIiKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBNRVNBX1NIQURFUl9DT01QVVRFOgorICAgICAgY3JlYXRlX2NzX2FzdCB8PQorICAgICAgICAgcS5mbGFncy5xLmxvY2FsX3NpemUgIT0gMCAmJgorICAgICAgICAgc3RhdGUtPmluX3F1YWxpZmllci0+ZmxhZ3MucS5sb2NhbF9zaXplID09IDA7CisKKyAgICAgIHZhbGlkX2luX21hc2suZmxhZ3MucS5sb2NhbF9zaXplID0gMTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGxheW91dCBxdWFsaWZpZXJzIG9ubHkgdmFsaWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiZ2VvbWV0cnksIGZyYWdtZW50IGFuZCBjb21wdXRlIHNoYWRlcnMiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICAvKiBHZW5lcmF0ZSBhbiBlcnJvciB3aGVuIGludmFsaWQgaW5wdXQgbGF5b3V0IHF1YWxpZmllcnMgYXJlIHVzZWQuICovCisgICBpZiAoKHEuZmxhZ3MuaSAmIH52YWxpZF9pbl9tYXNrLmZsYWdzLmkpICE9IDApIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKwkJICAgICAgICJpbnZhbGlkIGlucHV0IGxheW91dCBxdWFsaWZpZXJzIHVzZWQiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgLyogSW5wdXQgbGF5b3V0IHF1YWxpZmllcnMgY2FuIGJlIHNwZWNpZmllZCBtdWx0aXBsZQorICAgICogdGltZXMgaW4gc2VwYXJhdGUgZGVjbGFyYXRpb25zLCBhcyBsb25nIGFzIHRoZXkgbWF0Y2guCisgICAgKi8KKyAgIGlmICh0aGlzLT5mbGFncy5xLnByaW1fdHlwZSkgeworICAgICAgaWYgKHEuZmxhZ3MucS5wcmltX3R5cGUgJiYKKyAgICAgICAgICB0aGlzLT5wcmltX3R5cGUgIT0gcS5wcmltX3R5cGUpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0aW5nIGlucHV0IHByaW1pdGl2ZSB0eXBlcyBzcGVjaWZpZWQiKTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAocS5mbGFncy5xLnByaW1fdHlwZSkgeworICAgICAgc3RhdGUtPmluX3F1YWxpZmllci0+ZmxhZ3MucS5wcmltX3R5cGUgPSAxOworICAgICAgc3RhdGUtPmluX3F1YWxpZmllci0+cHJpbV90eXBlID0gcS5wcmltX3R5cGU7CisgICB9CisKKyAgIGlmICh0aGlzLT5mbGFncy5xLmludm9jYXRpb25zICYmCisgICAgICAgcS5mbGFncy5xLmludm9jYXRpb25zICYmCisgICAgICAgdGhpcy0+aW52b2NhdGlvbnMgIT0gcS5pbnZvY2F0aW9ucykgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2MsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAiY29uZmxpY3RpbmcgaW52b2NhdGlvbnMgY291bnRzIHNwZWNpZmllZCIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfSBlbHNlIGlmIChxLmZsYWdzLnEuaW52b2NhdGlvbnMpIHsKKyAgICAgIHRoaXMtPmZsYWdzLnEuaW52b2NhdGlvbnMgPSAxOworICAgICAgdGhpcy0+aW52b2NhdGlvbnMgPSBxLmludm9jYXRpb25zOworICAgfQorCisgICBpZiAoY3JlYXRlX2dzX2FzdCkgeworICAgICAgbm9kZSA9IG5ldyhtZW1fY3R4KSBhc3RfZ3NfaW5wdXRfbGF5b3V0KCpsb2MsIHEucHJpbV90eXBlKTsKKyAgIH0gZWxzZSBpZiAoY3JlYXRlX2NzX2FzdCkgeworICAgICAgLyogSW5mZXIgYSBsb2NhbF9zaXplIG9mIDEgZm9yIGV2ZXJ5IHVuc3BlY2lmaWVkIGRpbWVuc2lvbiAqLworICAgICAgdW5zaWduZWQgbG9jYWxfc2l6ZVszXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICBpZiAocS5mbGFncy5xLmxvY2FsX3NpemUgJiAoMSA8PCBpKSkKKyAgICAgICAgICAgIGxvY2FsX3NpemVbaV0gPSBxLmxvY2FsX3NpemVbaV07CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2NhbF9zaXplW2ldID0gMTsKKyAgICAgIH0KKyAgICAgIG5vZGUgPSBuZXcobWVtX2N0eCkgYXN0X2NzX2lucHV0X2xheW91dCgqbG9jLCBsb2NhbF9zaXplKTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2J1aWx0aW5fZnVuY3Rpb25zLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYnVpbHRpbl9mdW5jdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjI0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2J1aWx0aW5fZnVuY3Rpb25zLmNwcApAQCAtMCwwICsxLDQ0MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGJ1aWx0aW5fZnVuY3Rpb25zLmNwcAorICoKKyAqIFN1cHBvcnQgZm9yIEdMU0wgYnVpbHQtaW4gZnVuY3Rpb25zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzcGxpdCBpbnRvIHNldmVyYWwgbWFpbiBjb21wb25lbnRzOgorICoKKyAqIDEuIEF2YWlsYWJpbGl0eSBwcmVkaWNhdGVzCisgKgorICogICAgQSBzZXJpZXMgb2Ygc21hbGwgZnVuY3Rpb25zIHRoYXQgY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBzaGFkZXIKKyAqICAgIHN1cHBvcnRzIHRoZSB2ZXJzaW9uL2V4dGVuc2lvbnMgcmVxdWlyZWQgdG8gZXhwb3NlIGEgYnVpbHQtaW4uCisgKgorICogMi4gQ29yZSBidWlsdGluX2J1aWxkZXIgY2xhc3MgZnVuY3Rpb25hbGl0eQorICoKKyAqIDMuIExpc3RzIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucworICoKKyAqICAgIFRoZSBidWlsdGluX2J1aWxkZXI6OmNyZWF0ZV9idWlsdGlucygpIGZ1bmN0aW9uIGNvbnRhaW5zIGxpc3RzIG9mIGFsbAorICogICAgYnVpbHQtaW4gZnVuY3Rpb24gc2lnbmF0dXJlcywgd2hlcmUgdGhleSdyZSBhdmFpbGFibGUsIHdoYXQgdHlwZXMgdGhleQorICogICAgdGFrZSwgYW5kIHNvIG9uLgorICoKKyAqIDQuIEltcGxlbWVudGF0aW9ucyBvZiBidWlsdC1pbiBmdW5jdGlvbiBzaWduYXR1cmVzCisgKgorICogICAgQSBzZXJpZXMgb2YgZnVuY3Rpb25zIHdoaWNoIGNyZWF0ZSBpcl9mdW5jdGlvbl9zaWduYXR1cmVzIGFuZCBlbWl0IElSCisgKiAgICB2aWEgaXJfYnVpbGRlciB0byBpbXBsZW1lbnQgdGhlbS4KKyAqCisgKiA1LiBFeHRlcm5hbCBBUEkKKyAqCisgKiAgICBBIGZldyBmdW5jdGlvbnMgdGhlIHJlc3Qgb2YgdGhlIGNvbXBpbGVyIGNhbiB1c2UgdG8gaW50ZXJhY3Qgd2l0aCB0aGUKKyAqICAgIGJ1aWx0LWluIGZ1bmN0aW9uIG1vZHVsZS4gIEZvciBleGFtcGxlLCBzZWFyY2hpbmcgZm9yIGEgYnVpbHQtaW4gYnkKKyAqICAgIG5hbWUgYW5kIHBhcmFtZXRlcnMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibGliZm5zLmgiIC8qIGZvciBzdHJ1Y3QgZ2xfc2hhZGVyICovCisjaW5jbHVkZSAibWFpbi9zaGFkZXJvYmouaCIKKyNpbmNsdWRlICJpcl9idWlsZGVyLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgiCisjaW5jbHVkZSA8bGltaXRzPgorCisjZGVmaW5lIE1fUElmICAgKChmbG9hdCkgTV9QSSkKKyNkZWZpbmUgTV9QSV8yZiAoKGZsb2F0KSBNX1BJXzIpCisjZGVmaW5lIE1fUElfNGYgKChmbG9hdCkgTV9QSV80KQorCit1c2luZyBuYW1lc3BhY2UgaXJfYnVpbGRlcjsKKworLyoqCisgKiBBdmFpbGFiaWxpdHkgcHJlZGljYXRlczoKKyAqICBAeworICovCitzdGF0aWMgYm9vbAorYWx3YXlzX2F2YWlsYWJsZShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICopCit7CisgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2NvbXBhdGliaWxpdHlfdnNfb25seShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfVkVSVEVYICYmCisgICAgICAgICAgc3RhdGUtPmxhbmd1YWdlX3ZlcnNpb24gPD0gMTMwICYmCisgICAgICAgICAgIXN0YXRlLT5lc19zaGFkZXI7Cit9CisKK3N0YXRpYyBib29sCitmc19vbmx5KGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVDsKK30KKworc3RhdGljIGJvb2wKK2dzX29ubHkoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0dFT01FVFJZOworfQorCitzdGF0aWMgYm9vbAordjExMChjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiAhc3RhdGUtPmVzX3NoYWRlcjsKK30KKworc3RhdGljIGJvb2wKK3YxMTBfZnNfb25seShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiAhc3RhdGUtPmVzX3NoYWRlciAmJiBzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQ7Cit9CisKK3N0YXRpYyBib29sCit2MTIwKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHN0YXRlLT5pc192ZXJzaW9uKDEyMCwgMzAwKTsKK30KKworc3RhdGljIGJvb2wKK3YxMzAoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPmlzX3ZlcnNpb24oMTMwLCAzMDApOworfQorCitzdGF0aWMgYm9vbAordjEzMF9mc19vbmx5KGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHN0YXRlLT5pc192ZXJzaW9uKDEzMCwgMzAwKSAmJgorICAgICAgICAgIHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVDsKK30KKworc3RhdGljIGJvb2wKK3YxNDAoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPmlzX3ZlcnNpb24oMTQwLCAwKTsKK30KKworc3RhdGljIGJvb2wKK3RleHR1cmVfcmVjdGFuZ2xlKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHN0YXRlLT5BUkJfdGV4dHVyZV9yZWN0YW5nbGVfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAordGV4dHVyZV9leHRlcm5hbChjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+T0VTX0VHTF9pbWFnZV9leHRlcm5hbF9lbmFibGU7Cit9CisKKy8qKiBUcnVlIGlmIHRleHR1cmluZyBmdW5jdGlvbnMgd2l0aCBleHBsaWNpdCBMT0QgYXJlIGFsbG93ZWQuICovCitzdGF0aWMgYm9vbAorbG9kX2V4aXN0c19pbl9zdGFnZShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIC8qIFRleHR1cmluZyBmdW5jdGlvbnMgd2l0aCAiTG9kIiBpbiB0aGVpciBuYW1lIGV4aXN0OgorICAgICogLSBJbiB0aGUgdmVydGV4IHNoYWRlciBzdGFnZSAoZm9yIGFsbCBsYW5ndWFnZXMpCisgICAgKiAtIEluIGFueSBzdGFnZSBmb3IgR0xTTCAxLjMwKyBvciBHTFNMIEVTIDMuMDAKKyAgICAqIC0gSW4gYW55IHN0YWdlIGZvciBkZXNrdG9wIEdMU0wgd2l0aCBBUkJfc2hhZGVyX3RleHR1cmVfbG9kIGVuYWJsZWQuCisgICAgKgorICAgICogU2luY2UgQVJCX3NoYWRlcl90ZXh0dXJlX2xvZCBjYW4gb25seSBiZSBlbmFibGVkIG9uIGRlc2t0b3AgR0xTTCwgd2UKKyAgICAqIGRvbid0IG5lZWQgdG8gZXhwbGljaXRseSBjaGVjayBzdGF0ZS0+ZXNfc2hhZGVyLgorICAgICovCisgICByZXR1cm4gc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX1ZFUlRFWCB8fAorICAgICAgICAgIHN0YXRlLT5pc192ZXJzaW9uKDEzMCwgMzAwKSB8fAorICAgICAgICAgIHN0YXRlLT5BUkJfc2hhZGVyX3RleHR1cmVfbG9kX2VuYWJsZTsKK30KKworc3RhdGljIGJvb2wKK3YxMTBfbG9kKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuICFzdGF0ZS0+ZXNfc2hhZGVyICYmIGxvZF9leGlzdHNfaW5fc3RhZ2Uoc3RhdGUpOworfQorCitzdGF0aWMgYm9vbAorc2hhZGVyX3RleHR1cmVfbG9kKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHN0YXRlLT5BUkJfc2hhZGVyX3RleHR1cmVfbG9kX2VuYWJsZTsKK30KKworc3RhdGljIGJvb2wKK3NoYWRlcl90ZXh0dXJlX2xvZF9hbmRfcmVjdChjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+QVJCX3NoYWRlcl90ZXh0dXJlX2xvZF9lbmFibGUgJiYKKyAgICAgICAgICBzdGF0ZS0+QVJCX3RleHR1cmVfcmVjdGFuZ2xlX2VuYWJsZTsKK30KKworc3RhdGljIGJvb2wKK3NoYWRlcl9iaXRfZW5jb2RpbmcoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPmlzX3ZlcnNpb24oMzMwLCAzMDApIHx8CisgICAgICAgICAgc3RhdGUtPkFSQl9zaGFkZXJfYml0X2VuY29kaW5nX2VuYWJsZSB8fAorICAgICAgICAgIHN0YXRlLT5BUkJfZ3B1X3NoYWRlcjVfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAorc2hhZGVyX2ludGVnZXJfbWl4KGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHYxMzAoc3RhdGUpICYmIHN0YXRlLT5FWFRfc2hhZGVyX2ludGVnZXJfbWl4X2VuYWJsZTsKK30KKworc3RhdGljIGJvb2wKK3NoYWRlcl9wYWNraW5nX29yX2VzMyhjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+QVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZ19lbmFibGUgfHwKKyAgICAgICAgICBzdGF0ZS0+aXNfdmVyc2lvbig0MDAsIDMwMCk7Cit9CisKK3N0YXRpYyBib29sCitzaGFkZXJfcGFja2luZ19vcl9lczNfb3JfZ3B1X3NoYWRlcjUoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmdfZW5hYmxlIHx8CisgICAgICAgICAgc3RhdGUtPkFSQl9ncHVfc2hhZGVyNV9lbmFibGUgfHwKKyAgICAgICAgICBzdGF0ZS0+aXNfdmVyc2lvbig0MDAsIDMwMCk7Cit9CisKK3N0YXRpYyBib29sCitncHVfc2hhZGVyNShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+aXNfdmVyc2lvbig0MDAsIDApIHx8IHN0YXRlLT5BUkJfZ3B1X3NoYWRlcjVfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAorc2hhZGVyX3BhY2tpbmdfb3JfZ3B1X3NoYWRlcjUoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmdfZW5hYmxlIHx8CisgICAgICAgICAgZ3B1X3NoYWRlcjUoc3RhdGUpOworfQorCitzdGF0aWMgYm9vbAordGV4dHVyZV9hcnJheV9sb2QoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gbG9kX2V4aXN0c19pbl9zdGFnZShzdGF0ZSkgJiYKKyAgICAgICAgICBzdGF0ZS0+RVhUX3RleHR1cmVfYXJyYXlfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAorZnNfdGV4dHVyZV9hcnJheShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQgJiYKKyAgICAgICAgICBzdGF0ZS0+RVhUX3RleHR1cmVfYXJyYXlfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAordGV4dHVyZV9hcnJheShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+RVhUX3RleHR1cmVfYXJyYXlfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAordGV4dHVyZV9tdWx0aXNhbXBsZShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+aXNfdmVyc2lvbigxNTAsIDApIHx8CisgICAgICAgICAgc3RhdGUtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZTsKK30KKworc3RhdGljIGJvb2wKK2ZzX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UICYmCisgICAgICAgICAgKHN0YXRlLT5pc192ZXJzaW9uKDQwMCwgMCkgfHwKKyAgICAgICAgICAgc3RhdGUtPkFSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5X2VuYWJsZSk7Cit9CisKK3N0YXRpYyBib29sCit0ZXh0dXJlX2N1YmVfbWFwX2FycmF5KGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHN0YXRlLT5pc192ZXJzaW9uKDQwMCwgMCkgfHwKKyAgICAgICAgICBzdGF0ZS0+QVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXlfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAordGV4dHVyZV9xdWVyeV9sZXZlbHMoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPmlzX3ZlcnNpb24oNDMwLCAwKSB8fAorICAgICAgICAgIHN0YXRlLT5BUkJfdGV4dHVyZV9xdWVyeV9sZXZlbHNfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAordGV4dHVyZV9xdWVyeV9sb2QoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UICYmCisgICAgICAgICAgc3RhdGUtPkFSQl90ZXh0dXJlX3F1ZXJ5X2xvZF9lbmFibGU7Cit9CisKK3N0YXRpYyBib29sCit0ZXh0dXJlX2dhdGhlcihjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+aXNfdmVyc2lvbig0MDAsIDApIHx8CisgICAgICAgICAgc3RhdGUtPkFSQl90ZXh0dXJlX2dhdGhlcl9lbmFibGUgfHwKKyAgICAgICAgICBzdGF0ZS0+QVJCX2dwdV9zaGFkZXI1X2VuYWJsZTsKK30KKworLyogT25seSBBUkJfdGV4dHVyZV9nYXRoZXIgYnV0IG5vdCBHTFNMIDQuMCBvciBBUkJfZ3B1X3NoYWRlcjUuCisgKiB1c2VkIGZvciByZWxheGF0aW9uIG9mIGNvbnN0IG9mZnNldCByZXF1aXJlbWVudHMuCisgKi8KK3N0YXRpYyBib29sCit0ZXh0dXJlX2dhdGhlcl9vbmx5KGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuICFzdGF0ZS0+aXNfdmVyc2lvbig0MDAsIDApICYmCisgICAgICAgICAgIXN0YXRlLT5BUkJfZ3B1X3NoYWRlcjVfZW5hYmxlICYmCisgICAgICAgICAgc3RhdGUtPkFSQl90ZXh0dXJlX2dhdGhlcl9lbmFibGU7Cit9CisKKy8qIERlc2t0b3AgR0wgb3IgT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzICsgZnJhZ21lbnQgc2hhZGVyIG9ubHkgKi8KK3N0YXRpYyBib29sCitmc19vZXNfZGVyaXZhdGl2ZXMoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UICYmCisgICAgICAgICAgKHN0YXRlLT5pc192ZXJzaW9uKDExMCwgMzAwKSB8fAorICAgICAgICAgICBzdGF0ZS0+T0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzX2VuYWJsZSk7Cit9CisKK3N0YXRpYyBib29sCit0ZXgxZF9sb2QoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gIXN0YXRlLT5lc19zaGFkZXIgJiYgbG9kX2V4aXN0c19pbl9zdGFnZShzdGF0ZSk7Cit9CisKKy8qKiBUcnVlIGlmIHNhbXBsZXIzRCBleGlzdHMgKi8KK3N0YXRpYyBib29sCit0ZXgzZChjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIC8qIHNhbXBsZXIzRCBleGlzdHMgaW4gYWxsIGRlc2t0b3AgR0xTTCB2ZXJzaW9ucywgR0xTTCBFUyAxLjAwIHdpdGggdGhlCisgICAgKiBPRVNfdGV4dHVyZV8zRCBleHRlbnNpb24sIGFuZCBpbiBHTFNMIEVTIDMuMDAuCisgICAgKi8KKyAgIHJldHVybiAhc3RhdGUtPmVzX3NoYWRlciB8fAorICAgICAgICAgIHN0YXRlLT5PRVNfdGV4dHVyZV8zRF9lbmFibGUgfHwKKyAgICAgICAgICBzdGF0ZS0+bGFuZ3VhZ2VfdmVyc2lvbiA+PSAzMDA7Cit9CisKK3N0YXRpYyBib29sCitmc190ZXgzZChjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQgJiYKKyAgICAgICAgICAoIXN0YXRlLT5lc19zaGFkZXIgfHwgc3RhdGUtPk9FU190ZXh0dXJlXzNEX2VuYWJsZSk7Cit9CisKK3N0YXRpYyBib29sCit0ZXgzZF9sb2QoY29uc3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICByZXR1cm4gdGV4M2Qoc3RhdGUpICYmIGxvZF9leGlzdHNfaW5fc3RhZ2Uoc3RhdGUpOworfQorCitzdGF0aWMgYm9vbAorc2hhZGVyX2F0b21pY19jb3VudGVycyhjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIHJldHVybiBzdGF0ZS0+QVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnNfZW5hYmxlOworfQorCitzdGF0aWMgYm9vbAorc2hhZGVyX3RyaW5hcnlfbWlubWF4KGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIHN0YXRlLT5BTURfc2hhZGVyX3RyaW5hcnlfbWlubWF4X2VuYWJsZTsKK30KKworc3RhdGljIGJvb2wKK3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIChzdGF0ZS0+aXNfdmVyc2lvbig0MjAsIDApIHx8CisgICAgICAgICAgIHN0YXRlLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlKTsKK30KKworLyoqIEB9ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogYnVpbHRpbl9idWlsZGVyOiBBIHNpbmdsZXRvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb3JlIG9mIHRoZSBidWlsdC1pbgorICogZnVuY3Rpb24gbW9kdWxlLgorICoKKyAqIEl0IGdlbmVyYXRlcyBJUiBmb3IgZXZlcnkgYnVpbHQtaW4gZnVuY3Rpb24gc2lnbmF0dXJlLCBhbmQgb3JnYW5pemVzIHRoZW0KKyAqIGludG8gZnVuY3Rpb25zLgorICovCitjbGFzcyBidWlsdGluX2J1aWxkZXIgeworcHVibGljOgorICAgYnVpbHRpbl9idWlsZGVyKCk7CisgICB+YnVpbHRpbl9idWlsZGVyKCk7CisKKyAgIHZvaWQgaW5pdGlhbGl6ZSgpOworICAgdm9pZCByZWxlYXNlKCk7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmZpbmQoX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgZXhlY19saXN0ICphY3R1YWxfcGFyYW1ldGVycyk7CisKKyAgIC8qKgorICAgICogQSBzaGFkZXIgdG8gaG9sZCBhbGwgdGhlIGJ1aWx0LWluIHNpZ25hdHVyZXM7IGNyZWF0ZWQgYnkgdGhpcyBtb2R1bGUuCisgICAgKgorICAgICogVGhpcyBpbmNsdWRlcyBzaWduYXR1cmVzIGZvciBldmVyeSBidWlsdC1pbiwgcmVnYXJkbGVzcyBvZiB2ZXJzaW9uIG9yCisgICAgKiBlbmFibGVkIGV4dGVuc2lvbnMuICBUaGUgYXZhaWxhYmlsaXR5IHByZWRpY2F0ZSBhc3NvY2lhdGVkIHdpdGggZWFjaAorICAgICogc2lnbmF0dXJlIGFsbG93cyBtYXRjaGluZ19zaWduYXR1cmUoKSB0byBmaWx0ZXIgb3V0IHRoZSBpcnJlbGV2YW50IG9uZXMuCisgICAgKi8KKyAgIGdsX3NoYWRlciAqc2hhZGVyOworCitwcml2YXRlOgorICAgdm9pZCAqbWVtX2N0eDsKKworICAgLyoqIEdsb2JhbCB2YXJpYWJsZXMgdXNlZCBieSBidWlsdC1pbiBmdW5jdGlvbnMuICovCisgICBpcl92YXJpYWJsZSAqZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeDsKKyAgIGlyX3ZhcmlhYmxlICpnbF9WZXJ0ZXg7CisKKyAgIHZvaWQgY3JlYXRlX3NoYWRlcigpOworICAgdm9pZCBjcmVhdGVfaW50cmluc2ljcygpOworICAgdm9pZCBjcmVhdGVfYnVpbHRpbnMoKTsKKworICAgLyoqCisgICAgKiBJUiBidWlsZGVyIGhlbHBlcnM6CisgICAgKgorICAgICogVGhlc2UgY29udmVuaWVuY2UgZnVuY3Rpb25zIGFzc2lzdCBpbiBlbWl0dGluZyBJUiwgYnV0IGRvbid0IG5lY2Vzc2FyaWx5CisgICAgKiBmaXQgaW4gaXJfYnVpbGRlciBpdHNlbGYuICBNYW55IG9mIHRoZW0gcmVseSBvbiBoYXZpbmcgYSBtZW1fY3R4IGNsYXNzCisgICAgKiBtZW1iZXIgYXZhaWxhYmxlLgorICAgICovCisgICBpcl92YXJpYWJsZSAqaW5fdmFyKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSk7CisgICBpcl92YXJpYWJsZSAqb3V0X3Zhcihjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUpOworICAgaXJfY29uc3RhbnQgKmltbShmbG9hdCBmLCB1bnNpZ25lZCB2ZWN0b3JfZWxlbWVudHM9MSk7CisgICBpcl9jb25zdGFudCAqaW1tKGludCBpLCB1bnNpZ25lZCB2ZWN0b3JfZWxlbWVudHM9MSk7CisgICBpcl9jb25zdGFudCAqaW1tKHVuc2lnbmVkIHUsIHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50cz0xKTsKKyAgIGlyX2NvbnN0YW50ICppbW0oY29uc3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBpcl9jb25zdGFudF9kYXRhICYpOworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnZhcl9yZWYoaXJfdmFyaWFibGUgKnZhcik7CisgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqYXJyYXlfcmVmKGlyX3ZhcmlhYmxlICp2YXIsIGludCBpKTsKKyAgIGlyX3N3aXp6bGUgKm1hdHJpeF9lbHQoaXJfdmFyaWFibGUgKnZhciwgaW50IGNvbCwgaW50IHJvdyk7CisKKyAgIGlyX2V4cHJlc3Npb24gKmFzaW5fZXhwcihpcl92YXJpYWJsZSAqeCk7CisKKyAgIC8qKgorICAgICogQ2FsbCBmdW5jdGlvbiBccGFyYW0gZiB3aXRoIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIHRoZSBsaW5rZWQKKyAgICAqIGxpc3QgXHBhcmFtIHBhcmFtcyBvZiBcYyBpcl92YXJpYWJsZSBvYmplY3RzLiAgXHBhcmFtIHJldCBzaG91bGQKKyAgICAqIHBvaW50IHRvIHRoZSBpcl92YXJpYWJsZSB0aGF0IHdpbGwgaG9sZCB0aGUgZnVuY3Rpb24gcmV0dXJuCisgICAgKiB2YWx1ZSwgb3IgYmUgXGMgTlVMTCBpZiB0aGUgZnVuY3Rpb24gaGFzIHZvaWQgcmV0dXJuIHR5cGUuCisgICAgKi8KKyAgIGlyX2NhbGwgKmNhbGwoaXJfZnVuY3Rpb24gKmYsIGlyX3ZhcmlhYmxlICpyZXQsIGV4ZWNfbGlzdCBwYXJhbXMpOworCisgICAvKiogQ3JlYXRlIGEgbmV3IGZ1bmN0aW9uIGFuZCBhZGQgdGhlIGdpdmVuIHNpZ25hdHVyZXMuICovCisgICB2b2lkIGFkZF9mdW5jdGlvbihjb25zdCBjaGFyICpuYW1lLCAuLi4pOworCisgICBlbnVtIGltYWdlX2Z1bmN0aW9uX2ZsYWdzIHsKKyAgICAgIElNQUdFX0ZVTkNUSU9OX0VNSVRfU1RVQiA9ICgxIDw8IDApLAorICAgICAgSU1BR0VfRlVOQ1RJT05fUkVUVVJOU19WT0lEID0gKDEgPDwgMSksCisgICAgICBJTUFHRV9GVU5DVElPTl9IQVNfVkVDVE9SX0RBVEFfVFlQRSA9ICgxIDw8IDIpLAorICAgICAgSU1BR0VfRlVOQ1RJT05fU1VQUE9SVFNfRkxPQVRfREFUQV9UWVBFID0gKDEgPDwgMyksCisgICAgICBJTUFHRV9GVU5DVElPTl9SRUFEX09OTFkgPSAoMSA8PCA0KSwKKyAgICAgIElNQUdFX0ZVTkNUSU9OX1dSSVRFX09OTFkgPSAoMSA8PCA1KQorICAgfTsKKworICAgLyoqCisgICAgKiBDcmVhdGUgYSBuZXcgaW1hZ2UgYnVpbHQtaW4gZnVuY3Rpb24gZm9yIGFsbCBrbm93biBpbWFnZSB0eXBlcy4KKyAgICAqIFxwIGZsYWdzIGlzIGEgYml0ZmllbGQgb2YgXGMgaW1hZ2VfZnVuY3Rpb25fZmxhZ3MgZmxhZ3MuCisgICAgKi8KKyAgIHZvaWQgYWRkX2ltYWdlX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnRyaW5zaWNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9hcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncyk7CisKKyAgIC8qKgorICAgICogQ3JlYXRlIG5ldyBmdW5jdGlvbnMgZm9yIGFsbCBrbm93biBpbWFnZSBidWlsdC1pbnMgYW5kIHR5cGVzLgorICAgICogSWYgXHAgZ2xzbCBpcyBcYyB0cnVlLCB1c2UgdGhlIEdMU0wgYnVpbHQtaW4gbmFtZXMgYW5kIGVtaXQgY29kZQorICAgICogdG8gY2FsbCBpbnRvIHRoZSBhY3R1YWwgY29tcGlsZXIgaW50cmluc2ljLiAgSWYgXHAgZ2xzbCBpcworICAgICogZmFsc2UsIGVtaXQgYSBmdW5jdGlvbiBwcm90b3R5cGUgd2l0aCBubyBib2R5IGZvciBlYWNoIGltYWdlCisgICAgKiBpbnRyaW5zaWMgbmFtZS4KKyAgICAqLworICAgdm9pZCBhZGRfaW1hZ2VfZnVuY3Rpb25zKGJvb2wgZ2xzbCk7CisKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqbmV3X3NpZyhjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhcmFtcywgLi4uKTsKKworICAgLyoqCisgICAgKiBGdW5jdGlvbiBzaWduYXR1cmUgZ2VuZXJhdG9yczoKKyAgICAqICBAeworICAgICovCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnVub3AoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqcGFyYW1fdHlwZSk7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmJpbm9wKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnBhcmFtMF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnBhcmFtMV90eXBlKTsKKworI2RlZmluZSBCMChYKSBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKl8jI1goKTsKKyNkZWZpbmUgQjEoWCkgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpfIyNYKGNvbnN0IGdsc2xfdHlwZSAqKTsKKyNkZWZpbmUgQjIoWCkgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpfIyNYKGNvbnN0IGdsc2xfdHlwZSAqLCBjb25zdCBnbHNsX3R5cGUgKik7CisjZGVmaW5lIEIzKFgpIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqXyMjWChjb25zdCBnbHNsX3R5cGUgKiwgY29uc3QgZ2xzbF90eXBlICosIGNvbnN0IGdsc2xfdHlwZSAqKTsKKyNkZWZpbmUgQkExKFgpIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqXyMjWChidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUsIGNvbnN0IGdsc2xfdHlwZSAqKTsKKyNkZWZpbmUgQkEyKFgpIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqXyMjWChidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUsIGNvbnN0IGdsc2xfdHlwZSAqLCBjb25zdCBnbHNsX3R5cGUgKik7CisgICBCMShyYWRpYW5zKQorICAgQjEoZGVncmVlcykKKyAgIEIxKHNpbikKKyAgIEIxKGNvcykKKyAgIEIxKHRhbikKKyAgIEIxKGFzaW4pCisgICBCMShhY29zKQorICAgQjEoYXRhbjIpCisgICBCMShhdGFuKQorICAgQjEoc2luaCkKKyAgIEIxKGNvc2gpCisgICBCMSh0YW5oKQorICAgQjEoYXNpbmgpCisgICBCMShhY29zaCkKKyAgIEIxKGF0YW5oKQorICAgQjEocG93KQorICAgQjEoZXhwKQorICAgQjEobG9nKQorICAgQjEoZXhwMikKKyAgIEIxKGxvZzIpCisgICBCMShzcXJ0KQorICAgQjEoaW52ZXJzZXNxcnQpCisgICBCMShhYnMpCisgICBCMShzaWduKQorICAgQjEoZmxvb3IpCisgICBCMSh0cnVuYykKKyAgIEIxKHJvdW5kKQorICAgQjEocm91bmRFdmVuKQorICAgQjEoY2VpbCkKKyAgIEIxKGZyYWN0KQorICAgQjIobW9kKQorICAgQjEobW9kZikKKyAgIEJBMihtaW4pCisgICBCQTIobWF4KQorICAgQkEyKGNsYW1wKQorICAgQjIobWl4X2xycCkKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX21peF9zZWwoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnZhbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmJsZW5kX3R5cGUpOworICAgQjIoc3RlcCkKKyAgIEIyKHNtb290aHN0ZXApCisgICBCMShpc25hbikKKyAgIEIxKGlzaW5mKQorICAgQjEoZmxvYXRCaXRzVG9JbnQpCisgICBCMShmbG9hdEJpdHNUb1VpbnQpCisgICBCMShpbnRCaXRzVG9GbG9hdCkKKyAgIEIxKHVpbnRCaXRzVG9GbG9hdCkKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3BhY2tVbm9ybTJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3BhY2tTbm9ybTJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3BhY2tVbm9ybTR4OChidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwpOworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpfcGFja1Nub3JtNHg4KGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCk7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKl91bnBhY2tVbm9ybTJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3VucGFja1Nub3JtMngxNihidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwpOworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpfdW5wYWNrVW5vcm00eDgoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3VucGFja1Nub3JtNHg4KGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCk7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKl9wYWNrSGFsZjJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3VucGFja0hhbGYyeDE2KGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCk7CisgICBCMShsZW5ndGgpCisgICBCMShkaXN0YW5jZSk7CisgICBCMShkb3QpOworICAgQjEoY3Jvc3MpOworICAgQjEobm9ybWFsaXplKTsKKyAgIEIwKGZ0cmFuc2Zvcm0pOworICAgQjEoZmFjZWZvcndhcmQpOworICAgQjEocmVmbGVjdCk7CisgICBCMShyZWZyYWN0KTsKKyAgIEIxKG1hdHJpeENvbXBNdWx0KTsKKyAgIEIxKG91dGVyUHJvZHVjdCk7CisgICBCMChkZXRlcm1pbmFudF9tYXQyKTsKKyAgIEIwKGRldGVybWluYW50X21hdDMpOworICAgQjAoZGV0ZXJtaW5hbnRfbWF0NCk7CisgICBCMChpbnZlcnNlX21hdDIpOworICAgQjAoaW52ZXJzZV9tYXQzKTsKKyAgIEIwKGludmVyc2VfbWF0NCk7CisgICBCMSh0cmFuc3Bvc2UpOworICAgQkExKGxlc3NUaGFuKTsKKyAgIEJBMShsZXNzVGhhbkVxdWFsKTsKKyAgIEJBMShncmVhdGVyVGhhbik7CisgICBCQTEoZ3JlYXRlclRoYW5FcXVhbCk7CisgICBCQTEoZXF1YWwpOworICAgQkExKG5vdEVxdWFsKTsKKyAgIEIxKGFueSk7CisgICBCMShhbGwpOworICAgQjEobm90KTsKKyAgIEIyKHRleHR1cmVTaXplKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3RleHR1cmVTaXplKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqcmV0dXJuX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnNhbXBsZXJfdHlwZSk7CisKKy8qKiBGbGFncyB0byBfdGV4dHVyZSgpICovCisjZGVmaW5lIFRFWF9QUk9KRUNUIDEKKyNkZWZpbmUgVEVYX09GRlNFVCAgMgorI2RlZmluZSBURVhfQ09NUE9ORU5UIDQKKyNkZWZpbmUgVEVYX09GRlNFVF9OT05DT05TVCA4CisjZGVmaW5lIFRFWF9PRkZTRVRfQVJSQVkgMTYKKworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpfdGV4dHVyZShpcl90ZXh0dXJlX29wY29kZSBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpzYW1wbGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29vcmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gMCk7CisgICBCMCh0ZXh0dXJlQ3ViZUFycmF5U2hhZG93KTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX3RleGVsRmV0Y2goYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnNhbXBsZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpjb29yZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKm9mZnNldF90eXBlID0gTlVMTCk7CisKKyAgIEIwKEVtaXRWZXJ0ZXgpCisgICBCMChFbmRQcmltaXRpdmUpCisKKyAgIEIyKHRleHR1cmVRdWVyeUxvZCk7CisgICBCMSh0ZXh0dXJlUXVlcnlMZXZlbHMpOworICAgQjEoZEZkeCk7CisgICBCMShkRmR5KTsKKyAgIEIxKGZ3aWR0aCk7CisgICBCMShub2lzZTEpOworICAgQjEobm9pc2UyKTsKKyAgIEIxKG5vaXNlMyk7CisgICBCMShub2lzZTQpOworCisgICBCMShiaXRmaWVsZEV4dHJhY3QpCisgICBCMShiaXRmaWVsZEluc2VydCkKKyAgIEIxKGJpdGZpZWxkUmV2ZXJzZSkKKyAgIEIxKGJpdENvdW50KQorICAgQjEoZmluZExTQikKKyAgIEIxKGZpbmRNU0IpCisgICBCMShmbWEpCisgICBCMihsZGV4cCkKKyAgIEIyKGZyZXhwKQorICAgQjEodWFkZENhcnJ5KQorICAgQjEodXN1YkJvcnJvdykKKyAgIEIxKG11bEV4dGVuZGVkKQorCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKl9hdG9taWNfaW50cmluc2ljKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCk7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKl9hdG9taWNfb3AoY29uc3QgY2hhciAqaW50cmluc2ljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCk7CisKKyAgIEIxKG1pbjMpCisgICBCMShtYXgzKQorICAgQjEobWlkMykKKworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpfaW1hZ2VfcHJvdG90eXBlKGNvbnN0IGdsc2xfdHlwZSAqaW1hZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnRyaW5zaWNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX2ltYWdlKGNvbnN0IGdsc2xfdHlwZSAqaW1hZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmludHJpbnNpY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX2FyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKKworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpfbWVtb3J5X2JhcnJpZXJfaW50cmluc2ljKAorICAgICAgYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqX21lbW9yeV9iYXJyaWVyKAorICAgICAgYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKTsKKworI3VuZGVmIEIwCisjdW5kZWYgQjEKKyN1bmRlZiBCMgorI3VuZGVmIEIzCisjdW5kZWYgQkExCisjdW5kZWYgQkEyCisgICAvKiogQH0gKi8KK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCisvKioKKyAqIENvcmUgYnVpbHRpbl9idWlsZGVyIGZ1bmN0aW9uYWxpdHk6CisgKiAgQHsKKyAqLworYnVpbHRpbl9idWlsZGVyOjpidWlsdGluX2J1aWxkZXIoKQorICAgOiBzaGFkZXIoTlVMTCksCisgICAgIGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgoTlVMTCksCisgICAgIGdsX1ZlcnRleChOVUxMKQoreworICAgbWVtX2N0eCA9IE5VTEw7Cit9CisKK2J1aWx0aW5fYnVpbGRlcjo6fmJ1aWx0aW5fYnVpbGRlcigpCit7CisgICByYWxsb2NfZnJlZShtZW1fY3R4KTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6ZmluZChfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBleGVjX2xpc3QgKmFjdHVhbF9wYXJhbWV0ZXJzKQoreworICAgLyogVGhlIHNoYWRlciBjdXJyZW50bHkgYmVpbmcgY29tcGlsZWQgcmVxdWVzdGVkIGEgYnVpbHQtaW4gZnVuY3Rpb247CisgICAgKiBpdCBuZWVkcyB0byBsaW5rIGFnYWluc3QgYnVpbHRpbl9idWlsZGVyOjpzaGFkZXIgaW4gb3JkZXIgdG8gZ2V0IHRoZW0uCisgICAgKgorICAgICogRXZlbiBpZiB3ZSBkb24ndCBmaW5kIGEgbWF0Y2hpbmcgc2lnbmF0dXJlLCB3ZSBzdGlsbCBuZWVkIHRvIGRvIHRoaXMgc28KKyAgICAqIHRoYXQgdGhlICJubyBtYXRjaGluZyBzaWduYXR1cmUiIGVycm9yIHdpbGwgbGlzdCBwb3RlbnRpYWwgY2FuZGlkYXRlcworICAgICogZnJvbSB0aGUgYXZhaWxhYmxlIGJ1aWx0LWlucy4KKyAgICAqLworICAgc3RhdGUtPnVzZXNfYnVpbHRpbl9mdW5jdGlvbnMgPSB0cnVlOworCisgICBpcl9mdW5jdGlvbiAqZiA9IHNoYWRlci0+c3ltYm9scy0+Z2V0X2Z1bmN0aW9uKG5hbWUpOworICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9IGYtPm1hdGNoaW5nX3NpZ25hdHVyZShzdGF0ZSwgYWN0dWFsX3BhcmFtZXRlcnMpOworICAgaWYgKHNpZyA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK3ZvaWQKK2J1aWx0aW5fYnVpbGRlcjo6aW5pdGlhbGl6ZSgpCit7CisgICAvKiBJZiBhbHJlYWR5IGluaXRpYWxpemVkLCBkb24ndCBkbyBpdCBhZ2Fpbi4gKi8KKyAgIGlmIChtZW1fY3R4ICE9IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIG1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgIGNyZWF0ZV9zaGFkZXIoKTsKKyAgIGNyZWF0ZV9pbnRyaW5zaWNzKCk7CisgICBjcmVhdGVfYnVpbHRpbnMoKTsKK30KKwordm9pZAorYnVpbHRpbl9idWlsZGVyOjpyZWxlYXNlKCkKK3sKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworICAgbWVtX2N0eCA9IE5VTEw7CisKKyAgIHJhbGxvY19mcmVlKHNoYWRlcik7CisgICBzaGFkZXIgPSBOVUxMOworfQorCit2b2lkCitidWlsdGluX2J1aWxkZXI6OmNyZWF0ZV9zaGFkZXIoKQoreworICAgLyogVGhlIHRhcmdldCBkb2Vzbid0IGFjdHVhbGx5IG1hdHRlci4gIFRoZXJlJ3Mgbm8gdGFyZ2V0IGZvciBnZW5lcmljCisgICAgKiBHTFNMIHV0aWxpdHkgY29kZSB0aGF0IGNvdWxkIGJlIGxpbmtlZCBhZ2FpbnN0IGFueSBzdGFnZSwgc28ganVzdAorICAgICogYXJiaXRyYXJpbHkgcGljayBHTF9WRVJURVhfU0hBREVSLgorICAgICovCisgICBzaGFkZXIgPSBfbWVzYV9uZXdfc2hhZGVyKE5VTEwsIDAsIEdMX1ZFUlRFWF9TSEFERVIpOworICAgc2hhZGVyLT5zeW1ib2xzID0gbmV3KG1lbV9jdHgpIGdsc2xfc3ltYm9sX3RhYmxlOworCisgICBnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6Om1hdDRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3VuaWZvcm0pOworCisgICBzaGFkZXItPnN5bWJvbHMtPmFkZF92YXJpYWJsZShnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4KTsKKworICAgZ2xfVmVydGV4ID0gaW5fdmFyKGdsc2xfdHlwZTo6dmVjNF90eXBlLCAiZ2xfVmVydGV4Iik7CisgICBzaGFkZXItPnN5bWJvbHMtPmFkZF92YXJpYWJsZShnbF9WZXJ0ZXgpOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBDcmVhdGUgaXJfZnVuY3Rpb24gYW5kIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSBvYmplY3RzIGZvciBlYWNoCisgKiBpbnRyaW5zaWMuCisgKi8KK3ZvaWQKK2J1aWx0aW5fYnVpbGRlcjo6Y3JlYXRlX2ludHJpbnNpY3MoKQoreworICAgYWRkX2Z1bmN0aW9uKCJfX2ludHJpbnNpY19hdG9taWNfcmVhZCIsCisgICAgICAgICAgICAgICAgX2F0b21pY19pbnRyaW5zaWMoc2hhZGVyX2F0b21pY19jb3VudGVycyksCisgICAgICAgICAgICAgICAgTlVMTCk7CisgICBhZGRfZnVuY3Rpb24oIl9faW50cmluc2ljX2F0b21pY19pbmNyZW1lbnQiLAorICAgICAgICAgICAgICAgIF9hdG9taWNfaW50cmluc2ljKHNoYWRlcl9hdG9taWNfY291bnRlcnMpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgYWRkX2Z1bmN0aW9uKCJfX2ludHJpbnNpY19hdG9taWNfcHJlZGVjcmVtZW50IiwKKyAgICAgICAgICAgICAgICBfYXRvbWljX2ludHJpbnNpYyhzaGFkZXJfYXRvbWljX2NvdW50ZXJzKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2ltYWdlX2Z1bmN0aW9ucyhmYWxzZSk7CisKKyAgIGFkZF9mdW5jdGlvbigiX19pbnRyaW5zaWNfbWVtb3J5X2JhcnJpZXIiLAorICAgICAgICAgICAgICAgIF9tZW1vcnlfYmFycmllcl9pbnRyaW5zaWMoc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKioKKyAqIENyZWF0ZSBpcl9mdW5jdGlvbiBhbmQgaXJfZnVuY3Rpb25fc2lnbmF0dXJlIG9iamVjdHMgZm9yIGVhY2ggYnVpbHQtaW4uCisgKgorICogQ29udGFpbnMgYSBsaXN0IG9mIGV2ZXJ5IGF2YWlsYWJsZSBidWlsdC1pbi4KKyAqLwordm9pZAorYnVpbHRpbl9idWlsZGVyOjpjcmVhdGVfYnVpbHRpbnMoKQoreworI2RlZmluZSBGKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgYWRkX2Z1bmN0aW9uKCNOQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLCAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLCAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLCAgXAorICAgICAgICAgICAgICAgIE5VTEwpOworCisjZGVmaW5lIEZJKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBhZGRfZnVuY3Rpb24oI05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6OnZlYzJfdHlwZSksICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6OnZlYzNfdHlwZSksICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6OnZlYzRfdHlwZSksICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6OmludF90eXBlKSwgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6Oml2ZWMzX3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShnbHNsX3R5cGU6Oml2ZWM0X3R5cGUpLCBcCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyNkZWZpbmUgRklVKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGFkZF9mdW5jdGlvbigjTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6aW50X3R5cGUpLCAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKHYxMzAsIGdsc2xfdHlwZTo6dWludF90eXBlKSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzJfdHlwZSksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzNfdHlwZSksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworI2RlZmluZSBJVShOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgYWRkX2Z1bmN0aW9uKCNOQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjppbnRfdHlwZSksICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjppdmVjMl90eXBlKSwgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjppdmVjM190eXBlKSwgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjppdmVjNF90eXBlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjp1aW50X3R5cGUpLCAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjp1dmVjMl90eXBlKSwgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjp1dmVjM190eXBlKSwgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoZ2xzbF90eXBlOjp1dmVjNF90eXBlKSwgXAorICAgICAgICAgICAgICAgIE5VTEwpOworCisjZGVmaW5lIEZJVUIoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBhZGRfZnVuY3Rpb24oI05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmludF90eXBlKSwgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRSh2MTMwLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSksICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRSh2MTMwLCBnbHNsX3R5cGU6OnV2ZWMyX3R5cGUpLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRSh2MTMwLCBnbHNsX3R5cGU6OnV2ZWMzX3R5cGUpLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRSh2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUpLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmJvb2xfdHlwZSksICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmJ2ZWMyX3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmJ2ZWMzX3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmJ2ZWM0X3R5cGUpLCBcCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyNkZWZpbmUgRklVMl9NSVhFRChOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgYWRkX2Z1bmN0aW9uKCNOQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoYWx3YXlzX2F2YWlsYWJsZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsICBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoYWx3YXlzX2F2YWlsYWJsZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSksICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OmludF90eXBlLCAgIGdsc2xfdHlwZTo6aW50X3R5cGUpLCAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjppbnRfdHlwZSksICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoYWx3YXlzX2F2YWlsYWJsZSwgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6OmludF90eXBlKSwgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aW50X3R5cGUpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUoYWx3YXlzX2F2YWlsYWJsZSwgZ2xzbF90eXBlOjppdmVjMl90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLCBcCisgICAgICAgICAgICAgICAgXyMjTkFNRShhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppdmVjNF90eXBlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRSh2MTMwLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSwgIGdsc2xfdHlwZTo6dWludF90eXBlKSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzJfdHlwZSwgZ2xzbF90eXBlOjp1aW50X3R5cGUpLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUodjEzMCwgZ2xzbF90eXBlOjp1dmVjM190eXBlLCBnbHNsX3R5cGU6OnVpbnRfdHlwZSksICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRSh2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dWludF90eXBlKSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF8jI05BTUUodjEzMCwgZ2xzbF90eXBlOjp1dmVjMl90eXBlLCBnbHNsX3R5cGU6OnV2ZWMyX3R5cGUpLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgXyMjTkFNRSh2MTMwLCBnbHNsX3R5cGU6OnV2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6dXZlYzNfdHlwZSksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfIyNOQU1FKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlKSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBGKHJhZGlhbnMpCisgICBGKGRlZ3JlZXMpCisgICBGKHNpbikKKyAgIEYoY29zKQorICAgRih0YW4pCisgICBGKGFzaW4pCisgICBGKGFjb3MpCisKKyAgIGFkZF9mdW5jdGlvbigiYXRhbiIsCisgICAgICAgICAgICAgICAgX2F0YW4oZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfYXRhbihnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX2F0YW4oZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9hdGFuKGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBfYXRhbjIoZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfYXRhbjIoZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9hdGFuMihnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX2F0YW4yKGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgRihzaW5oKQorICAgRihjb3NoKQorICAgRih0YW5oKQorICAgRihhc2luaCkKKyAgIEYoYWNvc2gpCisgICBGKGF0YW5oKQorICAgRihwb3cpCisgICBGKGV4cCkKKyAgIEYobG9nKQorICAgRihleHAyKQorICAgRihsb2cyKQorICAgRihzcXJ0KQorICAgRihpbnZlcnNlc3FydCkKKyAgIEZJKGFicykKKyAgIEZJKHNpZ24pCisgICBGKGZsb29yKQorICAgRih0cnVuYykKKyAgIEYocm91bmQpCisgICBGKHJvdW5kRXZlbikKKyAgIEYoY2VpbCkKKyAgIEYoZnJhY3QpCisKKyAgIGFkZF9mdW5jdGlvbigibW9kIiwKKyAgICAgICAgICAgICAgICBfbW9kKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbW9kKGdsc2xfdHlwZTo6dmVjMl90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbW9kKGdsc2xfdHlwZTo6dmVjM190eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbW9kKGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKworICAgICAgICAgICAgICAgIF9tb2QoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX21vZChnbHNsX3R5cGU6OnZlYzNfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfbW9kKGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBGKG1vZGYpCisKKyAgIEZJVTJfTUlYRUQobWluKQorICAgRklVMl9NSVhFRChtYXgpCisgICBGSVUyX01JWEVEKGNsYW1wKQorCisgICBhZGRfZnVuY3Rpb24oIm1peCIsCisgICAgICAgICAgICAgICAgX21peF9scnAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorICAgICAgICAgICAgICAgIF9taXhfbHJwKGdsc2xfdHlwZTo6dmVjMl90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWl4X2xycChnbHNsX3R5cGU6OnZlYzNfdHlwZSwgIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX21peF9scnAoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX21peF9scnAoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX21peF9scnAoZ2xzbF90eXBlOjp2ZWMzX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX21peF9scnAoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfbWl4X3NlbCh2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6Ym9vbF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWl4X3NlbCh2MTMwLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgIGdsc2xfdHlwZTo6YnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX21peF9zZWwodjEzMCwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsICBnbHNsX3R5cGU6OmJ2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taXhfc2VsKHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpidmVjNF90eXBlKSwKKworICAgICAgICAgICAgICAgIF9taXhfc2VsKHNoYWRlcl9pbnRlZ2VyX21peCwgZ2xzbF90eXBlOjppbnRfdHlwZSwgICBnbHNsX3R5cGU6OmJvb2xfdHlwZSksCisgICAgICAgICAgICAgICAgX21peF9zZWwoc2hhZGVyX2ludGVnZXJfbWl4LCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6YnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX21peF9zZWwoc2hhZGVyX2ludGVnZXJfbWl4LCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6YnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX21peF9zZWwoc2hhZGVyX2ludGVnZXJfbWl4LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6YnZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfbWl4X3NlbChzaGFkZXJfaW50ZWdlcl9taXgsIGdsc2xfdHlwZTo6dWludF90eXBlLCAgZ2xzbF90eXBlOjpib29sX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taXhfc2VsKHNoYWRlcl9pbnRlZ2VyX21peCwgZ2xzbF90eXBlOjp1dmVjMl90eXBlLCBnbHNsX3R5cGU6OmJ2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taXhfc2VsKHNoYWRlcl9pbnRlZ2VyX21peCwgZ2xzbF90eXBlOjp1dmVjM190eXBlLCBnbHNsX3R5cGU6OmJ2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taXhfc2VsKHNoYWRlcl9pbnRlZ2VyX21peCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OmJ2ZWM0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX21peF9zZWwoc2hhZGVyX2ludGVnZXJfbWl4LCBnbHNsX3R5cGU6OmJvb2xfdHlwZSwgIGdsc2xfdHlwZTo6Ym9vbF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWl4X3NlbChzaGFkZXJfaW50ZWdlcl9taXgsIGdsc2xfdHlwZTo6YnZlYzJfdHlwZSwgZ2xzbF90eXBlOjpidmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWl4X3NlbChzaGFkZXJfaW50ZWdlcl9taXgsIGdsc2xfdHlwZTo6YnZlYzNfdHlwZSwgZ2xzbF90eXBlOjpidmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfbWl4X3NlbChzaGFkZXJfaW50ZWdlcl9taXgsIGdsc2xfdHlwZTo6YnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpidmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzdGVwIiwKKyAgICAgICAgICAgICAgICBfc3RlcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3N0ZXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3N0ZXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3N0ZXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfc3RlcChnbHNsX3R5cGU6OnZlYzJfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfc3RlcChnbHNsX3R5cGU6OnZlYzNfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfc3RlcChnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzbW9vdGhzdGVwIiwKKyAgICAgICAgICAgICAgICBfc21vb3Roc3RlcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3Ntb290aHN0ZXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3Ntb290aHN0ZXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3Ntb290aHN0ZXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfc21vb3Roc3RlcChnbHNsX3R5cGU6OnZlYzJfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfc21vb3Roc3RlcChnbHNsX3R5cGU6OnZlYzNfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfc21vb3Roc3RlcChnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAKKyAgIEYoaXNuYW4pCisgICBGKGlzaW5mKQorCisgICBGKGZsb2F0Qml0c1RvSW50KQorICAgRihmbG9hdEJpdHNUb1VpbnQpCisgICBhZGRfZnVuY3Rpb24oImludEJpdHNUb0Zsb2F0IiwKKyAgICAgICAgICAgICAgICBfaW50Qml0c1RvRmxvYXQoZ2xzbF90eXBlOjppbnRfdHlwZSksCisgICAgICAgICAgICAgICAgX2ludEJpdHNUb0Zsb2F0KGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX2ludEJpdHNUb0Zsb2F0KGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX2ludEJpdHNUb0Zsb2F0KGdsc2xfdHlwZTo6aXZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisgICBhZGRfZnVuY3Rpb24oInVpbnRCaXRzVG9GbG9hdCIsCisgICAgICAgICAgICAgICAgX3VpbnRCaXRzVG9GbG9hdChnbHNsX3R5cGU6OnVpbnRfdHlwZSksCisgICAgICAgICAgICAgICAgX3VpbnRCaXRzVG9GbG9hdChnbHNsX3R5cGU6OnV2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF91aW50Qml0c1RvRmxvYXQoZ2xzbF90eXBlOjp1dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdWludEJpdHNUb0Zsb2F0KGdsc2xfdHlwZTo6dXZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigicGFja1Vub3JtMngxNiIsICAgX3BhY2tVbm9ybTJ4MTYoc2hhZGVyX3BhY2tpbmdfb3JfZXMzX29yX2dwdV9zaGFkZXI1KSwgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigicGFja1Nub3JtMngxNiIsICAgX3BhY2tTbm9ybTJ4MTYoc2hhZGVyX3BhY2tpbmdfb3JfZXMzKSwgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigicGFja1Vub3JtNHg4IiwgICAgX3BhY2tVbm9ybTR4OChzaGFkZXJfcGFja2luZ19vcl9ncHVfc2hhZGVyNSksICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigicGFja1Nub3JtNHg4IiwgICAgX3BhY2tTbm9ybTR4OChzaGFkZXJfcGFja2luZ19vcl9ncHVfc2hhZGVyNSksICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidW5wYWNrVW5vcm0yeDE2IiwgX3VucGFja1Vub3JtMngxNihzaGFkZXJfcGFja2luZ19vcl9lczNfb3JfZ3B1X3NoYWRlcjUpLCBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidW5wYWNrU25vcm0yeDE2IiwgX3VucGFja1Nub3JtMngxNihzaGFkZXJfcGFja2luZ19vcl9lczMpLCAgICAgICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidW5wYWNrVW5vcm00eDgiLCAgX3VucGFja1Vub3JtNHg4KHNoYWRlcl9wYWNraW5nX29yX2dwdV9zaGFkZXI1KSwgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidW5wYWNrU25vcm00eDgiLCAgX3VucGFja1Nub3JtNHg4KHNoYWRlcl9wYWNraW5nX29yX2dwdV9zaGFkZXI1KSwgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigicGFja0hhbGYyeDE2IiwgICAgX3BhY2tIYWxmMngxNihzaGFkZXJfcGFja2luZ19vcl9lczMpLCAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidW5wYWNrSGFsZjJ4MTYiLCAgX3VucGFja0hhbGYyeDE2KHNoYWRlcl9wYWNraW5nX29yX2VzMyksICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgRihsZW5ndGgpCisgICBGKGRpc3RhbmNlKQorICAgRihkb3QpCisKKyAgIGFkZF9mdW5jdGlvbigiY3Jvc3MiLCBfY3Jvc3MoZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLCBOVUxMKTsKKworICAgRihub3JtYWxpemUpCisgICBhZGRfZnVuY3Rpb24oImZ0cmFuc2Zvcm0iLCBfZnRyYW5zZm9ybSgpLCBOVUxMKTsKKyAgIEYoZmFjZWZvcndhcmQpCisgICBGKHJlZmxlY3QpCisgICBGKHJlZnJhY3QpCisgICAvLyAuLi4KKyAgIGFkZF9mdW5jdGlvbigibWF0cml4Q29tcE11bHQiLAorICAgICAgICAgICAgICAgIF9tYXRyaXhDb21wTXVsdChnbHNsX3R5cGU6Om1hdDJfdHlwZSksCisgICAgICAgICAgICAgICAgX21hdHJpeENvbXBNdWx0KGdsc2xfdHlwZTo6bWF0M190eXBlKSwKKyAgICAgICAgICAgICAgICBfbWF0cml4Q29tcE11bHQoZ2xzbF90eXBlOjptYXQ0X3R5cGUpLAorICAgICAgICAgICAgICAgIF9tYXRyaXhDb21wTXVsdChnbHNsX3R5cGU6Om1hdDJ4M190eXBlKSwKKyAgICAgICAgICAgICAgICBfbWF0cml4Q29tcE11bHQoZ2xzbF90eXBlOjptYXQyeDRfdHlwZSksCisgICAgICAgICAgICAgICAgX21hdHJpeENvbXBNdWx0KGdsc2xfdHlwZTo6bWF0M3gyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9tYXRyaXhDb21wTXVsdChnbHNsX3R5cGU6Om1hdDN4NF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWF0cml4Q29tcE11bHQoZ2xzbF90eXBlOjptYXQ0eDJfdHlwZSksCisgICAgICAgICAgICAgICAgX21hdHJpeENvbXBNdWx0KGdsc2xfdHlwZTo6bWF0NHgzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgYWRkX2Z1bmN0aW9uKCJvdXRlclByb2R1Y3QiLAorICAgICAgICAgICAgICAgIF9vdXRlclByb2R1Y3QoZ2xzbF90eXBlOjptYXQyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9vdXRlclByb2R1Y3QoZ2xzbF90eXBlOjptYXQzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9vdXRlclByb2R1Y3QoZ2xzbF90eXBlOjptYXQ0X3R5cGUpLAorICAgICAgICAgICAgICAgIF9vdXRlclByb2R1Y3QoZ2xzbF90eXBlOjptYXQyeDNfdHlwZSksCisgICAgICAgICAgICAgICAgX291dGVyUHJvZHVjdChnbHNsX3R5cGU6Om1hdDJ4NF90eXBlKSwKKyAgICAgICAgICAgICAgICBfb3V0ZXJQcm9kdWN0KGdsc2xfdHlwZTo6bWF0M3gyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9vdXRlclByb2R1Y3QoZ2xzbF90eXBlOjptYXQzeDRfdHlwZSksCisgICAgICAgICAgICAgICAgX291dGVyUHJvZHVjdChnbHNsX3R5cGU6Om1hdDR4Ml90eXBlKSwKKyAgICAgICAgICAgICAgICBfb3V0ZXJQcm9kdWN0KGdsc2xfdHlwZTo6bWF0NHgzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgYWRkX2Z1bmN0aW9uKCJkZXRlcm1pbmFudCIsCisgICAgICAgICAgICAgICAgX2RldGVybWluYW50X21hdDIoKSwKKyAgICAgICAgICAgICAgICBfZGV0ZXJtaW5hbnRfbWF0MygpLAorICAgICAgICAgICAgICAgIF9kZXRlcm1pbmFudF9tYXQ0KCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisgICBhZGRfZnVuY3Rpb24oImludmVyc2UiLAorICAgICAgICAgICAgICAgIF9pbnZlcnNlX21hdDIoKSwKKyAgICAgICAgICAgICAgICBfaW52ZXJzZV9tYXQzKCksCisgICAgICAgICAgICAgICAgX2ludmVyc2VfbWF0NCgpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgYWRkX2Z1bmN0aW9uKCJ0cmFuc3Bvc2UiLAorICAgICAgICAgICAgICAgIF90cmFuc3Bvc2UoZ2xzbF90eXBlOjptYXQyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90cmFuc3Bvc2UoZ2xzbF90eXBlOjptYXQzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90cmFuc3Bvc2UoZ2xzbF90eXBlOjptYXQ0X3R5cGUpLAorICAgICAgICAgICAgICAgIF90cmFuc3Bvc2UoZ2xzbF90eXBlOjptYXQyeDNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RyYW5zcG9zZShnbHNsX3R5cGU6Om1hdDJ4NF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdHJhbnNwb3NlKGdsc2xfdHlwZTo6bWF0M3gyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90cmFuc3Bvc2UoZ2xzbF90eXBlOjptYXQzeDRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RyYW5zcG9zZShnbHNsX3R5cGU6Om1hdDR4Ml90eXBlKSwKKyAgICAgICAgICAgICAgICBfdHJhbnNwb3NlKGdsc2xfdHlwZTo6bWF0NHgzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgRklVKGxlc3NUaGFuKQorICAgRklVKGxlc3NUaGFuRXF1YWwpCisgICBGSVUoZ3JlYXRlclRoYW4pCisgICBGSVUoZ3JlYXRlclRoYW5FcXVhbCkKKyAgIEZJVUIobm90RXF1YWwpCisgICBGSVVCKGVxdWFsKQorCisgICBhZGRfZnVuY3Rpb24oImFueSIsCisgICAgICAgICAgICAgICAgX2FueShnbHNsX3R5cGU6OmJ2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9hbnkoZ2xzbF90eXBlOjpidmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfYW55KGdsc2xfdHlwZTo6YnZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigiYWxsIiwKKyAgICAgICAgICAgICAgICBfYWxsKGdsc2xfdHlwZTo6YnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX2FsbChnbHNsX3R5cGU6OmJ2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9hbGwoZ2xzbF90eXBlOjpidmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJub3QiLAorICAgICAgICAgICAgICAgIF9ub3QoZ2xzbF90eXBlOjpidmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfbm90KGdsc2xfdHlwZTo6YnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX25vdChnbHNsX3R5cGU6OmJ2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmVTaXplIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjEzMCwgZ2xzbF90eXBlOjppbnRfdHlwZSwgICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjEzMCwgZ2xzbF90eXBlOjppbnRfdHlwZSwgICBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aW50X3R5cGUsICAgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIzRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjEzMCwgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyM0RfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjEzMCwgZ2xzbF90eXBlOjppdmVjMl90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aW50X3R5cGUsICAgZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZVNoYWRvd190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEQXJyYXlfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEQXJyYXlfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjEzMCwgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjEzMCwgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheVNoYWRvd190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh0ZXh0dXJlX2N1YmVfbWFwX2FycmF5LCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodGV4dHVyZV9jdWJlX21hcF9hcnJheSwgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyQ3ViZUFycmF5X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh0ZXh0dXJlX2N1YmVfbWFwX2FycmF5LCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHRleHR1cmVfY3ViZV9tYXBfYXJyYXksIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZUFycmF5U2hhZG93X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh2MTMwLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRFJlY3RfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEUmVjdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjEzMCwgZ2xzbF90eXBlOjppdmVjMl90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjE0MCwgZ2xzbF90eXBlOjppbnRfdHlwZSwgICBnbHNsX3R5cGU6OnNhbXBsZXJCdWZmZXJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHYxNDAsIGdsc2xfdHlwZTo6aW50X3R5cGUsICAgZ2xzbF90eXBlOjppc2FtcGxlckJ1ZmZlcl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodjE0MCwgZ2xzbF90eXBlOjppbnRfdHlwZSwgICBnbHNsX3R5cGU6OnVzYW1wbGVyQnVmZmVyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlU2l6ZSh0ZXh0dXJlX211bHRpc2FtcGxlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJETVNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHRleHR1cmVfbXVsdGlzYW1wbGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJETVNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHRleHR1cmVfbXVsdGlzYW1wbGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJETVNfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodGV4dHVyZV9tdWx0aXNhbXBsZSwgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRE1TQXJyYXlfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVTaXplKHRleHR1cmVfbXVsdGlzYW1wbGUsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJETVNBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVNpemUodGV4dHVyZV9tdWx0aXNhbXBsZSwgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRNU0FycmF5X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsICAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCAgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5X3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX2N1YmVfbWFwX2FycmF5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdGV4dHVyZV9jdWJlX21hcF9hcnJheSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyQ3ViZUFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHRleHR1cmVfY3ViZV9tYXBfYXJyYXksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIC8qIHNhbXBsZXJDdWJlQXJyYXlTaGFkb3cgaXMgc3BlY2lhbDsgaXQgaGFzIGFuIGV4dHJhIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAqIGZvciB0aGUgc2hhZG93IGNvbXBhcml0b3Igc2luY2UgdGhlcmUgaXMgbm8gdmVjNSB0eXBlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIF90ZXh0dXJlQ3ViZUFycmF5U2hhZG93KCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZSwgIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyQ3ViZV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCAgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCAgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIGZzX3RleHR1cmVfY3ViZV9tYXBfYXJyYXksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZUFycmF5X3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCBmc190ZXh0dXJlX2N1YmVfbWFwX2FycmF5LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgZnNfdGV4dHVyZV9jdWJlX21hcF9hcnJheSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyQ3ViZUFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmVMb2QiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdGV4dHVyZV9jdWJlX21hcF9hcnJheSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHRleHR1cmVfY3ViZV9tYXBfYXJyYXksIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlckN1YmVBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB0ZXh0dXJlX2N1YmVfbWFwX2FycmF5LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmVPZmZzZXQiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5X3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZSwgIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMF9mc19vbmx5LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzBfZnNfb25seSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlUHJvaiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleGVsRmV0Y2giLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZSwgIGdsc2xfdHlwZTo6aW50X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6aW50X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6aW50X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCAgZ2xzbF90eXBlOjppdmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGUsICBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsICBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5X3R5cGUsICBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjppdmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxNDAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyQnVmZmVyX3R5cGUsICBnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTQwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXJCdWZmZXJfdHlwZSwgZ2xzbF90eXBlOjppbnRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjE0MCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyQnVmZmVyX3R5cGUsIGdsc2xfdHlwZTo6aW50X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godGV4dHVyZV9tdWx0aXNhbXBsZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRE1TX3R5cGUsICBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHRleHR1cmVfbXVsdGlzYW1wbGUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJETVNfdHlwZSwgZ2xzbF90eXBlOjppdmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh0ZXh0dXJlX211bHRpc2FtcGxlLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRE1TX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh0ZXh0dXJlX211bHRpc2FtcGxlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJETVNBcnJheV90eXBlLCAgZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh0ZXh0dXJlX211bHRpc2FtcGxlLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRE1TQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh0ZXh0dXJlX211bHRpc2FtcGxlLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRE1TQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXhlbEZldGNoT2Zmc2V0IiwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OmludF90eXBlLCBnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmludF90eXBlLCBnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmludF90eXBlLCBnbHNsX3R5cGU6OmludF90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjppdmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjppdmVjMl90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCAgZ2xzbF90eXBlOjppdmVjM190eXBlLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCAgZ2xzbF90eXBlOjppdmVjMl90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjppdmVjMl90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXhlbEZldGNoKHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheV90eXBlLCAgZ2xzbF90eXBlOjppdmVjMl90eXBlLCBnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4ZWxGZXRjaCh2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSwgZ2xzbF90eXBlOjppbnRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUsIGdsc2xfdHlwZTo6aW50X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5X3R5cGUsICBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleGVsRmV0Y2godjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlUHJvak9mZnNldCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZUxvZE9mZnNldCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlUHJvakxvZCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZVByb2pMb2RPZmZzZXQiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZUdyYWQiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCAgIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdGV4dHVyZV9jdWJlX21hcF9hcnJheSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHRleHR1cmVfY3ViZV9tYXBfYXJyYXksIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlckN1YmVBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB0ZXh0dXJlX2N1YmVfbWFwX2FycmF5LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlR3JhZE9mZnNldCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5X3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmVQcm9qR3JhZCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlUHJvakdyYWRPZmZzZXQiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCB8IFRFWF9PRkZTRVQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCB2MTMwLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgdjEzMCwgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QgfCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHYxMzAsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUIHwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigiRW1pdFZlcnRleCIsICAgX0VtaXRWZXJ0ZXgoKSwgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigiRW5kUHJpbWl0aXZlIiwgX0VuZFByaW1pdGl2ZSgpLCBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlUXVlcnlMT0QiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZSwgIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OmlzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCAgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OmlzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjp1c2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZV90eXBlLCAgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjppc2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5X3R5cGUsICBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjppc2FtcGxlcjFEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6dXNhbXBsZXIxREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlfdHlwZSwgIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6aXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6dXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZUFycmF5X3R5cGUsICBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OmlzYW1wbGVyQ3ViZUFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMb2QoZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxvZChnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TG9kKGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZVF1ZXJ5TGV2ZWxzIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMZXZlbHMoZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxldmVscyhnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6c2FtcGxlckN1YmVfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxldmVscyhnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMZXZlbHMoZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMZXZlbHMoZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxldmVscyhnbHNsX3R5cGU6OnNhbXBsZXJDdWJlU2hhZG93X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMZXZlbHMoZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheVNoYWRvd190eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlTaGFkb3dfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxldmVscyhnbHNsX3R5cGU6OnNhbXBsZXJDdWJlQXJyYXlTaGFkb3dfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6aXNhbXBsZXIxRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6aXNhbXBsZXIzRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMZXZlbHMoZ2xzbF90eXBlOjppc2FtcGxlcjFEQXJyYXlfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxldmVscyhnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlQXJyYXlfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6dXNhbXBsZXIxRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6dXNhbXBsZXIzRF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlUXVlcnlMZXZlbHMoZ2xzbF90eXBlOjp1c2FtcGxlcjFEQXJyYXlfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmVRdWVyeUxldmVscyhnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZVF1ZXJ5TGV2ZWxzKGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZSksCisKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlMUQiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdjExMCwgICAgICAgICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTEwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlMURBcnJheSIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX2FycmF5LCAgICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCBmc190ZXh0dXJlX2FycmF5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTFEUHJvaiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTEwLCAgICAgICAgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMTAsICAgICAgICAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjExMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTEwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlMURMb2QiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdGV4MWRfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTFEQXJyYXlMb2QiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdGV4dHVyZV9hcnJheV9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlMURQcm9qTG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHRleDFkX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdGV4MWRfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTJEIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIGFsd2F5c19hdmFpbGFibGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgZnNfb25seSwgICAgICAgICAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX2V4dGVybmFsLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlckV4dGVybmFsT0VTX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlMkRBcnJheSIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX2FycmF5LCAgICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCBmc190ZXh0dXJlX2FycmF5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTJEUHJvaiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCBhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCBhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCBmc19vbmx5LCAgICAgICAgICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCBmc19vbmx5LCAgICAgICAgICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX2V4dGVybmFsLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlckV4dGVybmFsT0VTX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX2V4dGVybmFsLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlckV4dGVybmFsT0VTX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTJETG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIGxvZF9leGlzdHNfaW5fc3RhZ2UsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUyREFycmF5TG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHRleHR1cmVfYXJyYXlfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTJEUHJvakxvZCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTEwX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjExMF9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlM0QiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdGV4M2QsICAgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgZnNfdGV4M2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUzRFByb2oiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdGV4M2QsICAgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIGZzX3RleDNkLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTNETG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHRleDNkX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTNEUHJvakxvZCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB0ZXgzZF9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlQ3ViZSIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCBhbHdheXNfYXZhaWxhYmxlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgZnNfb25seSwgICAgICAgICAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlQ3ViZUxvZCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhsLCB2MTEwX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlX3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlMkRSZWN0IiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHRleHR1cmVfcmVjdGFuZ2xlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTJEUmVjdFByb2oiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdGV4dHVyZV9yZWN0YW5nbGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX3JlY3RhbmdsZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzaGFkb3cxRCIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB2MTEwLCAgICAgICAgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjExMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzaGFkb3cxREFycmF5IiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHRleHR1cmVfYXJyYXksICAgIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCBmc190ZXh0dXJlX2FycmF5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInNoYWRvdzJEIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMTAsICAgICAgICAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhiLCB2MTEwX2ZzX29ubHksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInNoYWRvdzJEQXJyYXkiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RleCwgdGV4dHVyZV9hcnJheSwgICAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGIsIGZzX3RleHR1cmVfYXJyYXksIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MURQcm9qIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMTAsICAgICAgICAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjExMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MkRQcm9qIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHYxMTAsICAgICAgICAgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4YiwgdjExMF9mc19vbmx5LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MURMb2QiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4bCwgdjExMF9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInNoYWRvdzJETG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMTBfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzaGFkb3cxREFycmF5TG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHRleHR1cmVfYXJyYXlfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMURBcnJheVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MURQcm9qTG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMTBfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MkRQcm9qTG9kIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGwsIHYxMTBfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MkRSZWN0IiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZXgsIHRleHR1cmVfcmVjdGFuZ2xlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MkRSZWN0UHJvaiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGV4LCB0ZXh0dXJlX3JlY3RhbmdsZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJ0ZXh0dXJlMURHcmFkQVJCIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHNoYWRlcl90ZXh0dXJlX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUxRFByb2pHcmFkQVJCIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHNoYWRlcl90ZXh0dXJlX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgc2hhZGVyX3RleHR1cmVfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjFEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTJER3JhZEFSQiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUyRFByb2pHcmFkQVJCIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHNoYWRlcl90ZXh0dXJlX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgc2hhZGVyX3RleHR1cmVfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZTNER3JhZEFSQiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyM0RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUzRFByb2pHcmFkQVJCIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHNoYWRlcl90ZXh0dXJlX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIzRF90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmVDdWJlR3JhZEFSQiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MURHcmFkQVJCIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHNoYWRlcl90ZXh0dXJlX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIxRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MURQcm9qR3JhZEFSQiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9QUk9KRUNUKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzaGFkb3cyREdyYWRBUkIiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3R4ZCwgc2hhZGVyX3RleHR1cmVfbG9kLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzaGFkb3cyRFByb2pHcmFkQVJCIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHNoYWRlcl90ZXh0dXJlX2xvZCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX1BST0pFQ1QpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUyRFJlY3RHcmFkQVJCIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90eGQsIHNoYWRlcl90ZXh0dXJlX2xvZF9hbmRfcmVjdCwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmUyRFJlY3RQcm9qR3JhZEFSQiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2RfYW5kX3JlY3QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2RfYW5kX3JlY3QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigic2hhZG93MkRSZWN0R3JhZEFSQiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2RfYW5kX3JlY3QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJzaGFkb3cyRFJlY3RQcm9qR3JhZEFSQiIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdHhkLCBzaGFkZXJfdGV4dHVyZV9sb2RfYW5kX3JlY3QsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfUFJPSkVDVCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigidGV4dHVyZUdhdGhlciIsCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCB0ZXh0dXJlX2dhdGhlciwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIHRleHR1cmVfZ2F0aGVyLCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCB0ZXh0dXJlX2dhdGhlciwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCB0ZXh0dXJlX2dhdGhlciwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgdGV4dHVyZV9nYXRoZXIsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgdGV4dHVyZV9nYXRoZXIsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCB0ZXh0dXJlX2dhdGhlciwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgdGV4dHVyZV9nYXRoZXIsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgdGV4dHVyZV9nYXRoZXIsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCB0ZXh0dXJlX2dhdGhlciwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCB0ZXh0dXJlX2dhdGhlciwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyQ3ViZUFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIHRleHR1cmVfZ2F0aGVyLCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX0NPTVBPTkVOVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9DT01QT05FTlQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX0NPTVBPTkVOVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9DT01QT05FTlQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9DT01QT05FTlQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9DT01QT05FTlQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgVEVYX0NPTVBPTkVOVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyQ3ViZUFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBURVhfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIFRFWF9DT01QT05FTlQpLAorCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEU2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheVNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXJDdWJlQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmVHYXRoZXJPZmZzZXQiLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgdGV4dHVyZV9nYXRoZXJfb25seSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIHRleHR1cmVfZ2F0aGVyX29ubHksIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIHRleHR1cmVfZ2F0aGVyX29ubHksIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgdGV4dHVyZV9nYXRoZXJfb25seSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgdGV4dHVyZV9nYXRoZXJfb25seSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCB0ZXh0dXJlX2dhdGhlcl9vbmx5LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVF9OT05DT05TVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX05PTkNPTlNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUX05PTkNPTlNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUX05PTkNPTlNUKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUX05PTkNPTlNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVF9OT05DT05TVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX05PTkNPTlNUKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVF9OT05DT05TVCB8IFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX05PTkNPTlNUIHwgVEVYX0NPTVBPTkVOVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QgfCBURVhfQ09NUE9ORU5UKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUX05PTkNPTlNUIHwgVEVYX0NPTVBPTkVOVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVF9OT05DT05TVCB8IFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QgfCBURVhfQ09NUE9ORU5UKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QgfCBURVhfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QgfCBURVhfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QgfCBURVhfQ09NUE9ORU5UKSwKKworICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVF9OT05DT05TVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6c2FtcGxlcjJEQXJyYXlTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfTk9OQ09OU1QpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oInRleHR1cmVHYXRoZXJPZmZzZXRzIiwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfQVJSQVkpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX0FSUkFZKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVF9BUlJBWSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfQVJSQVkgfCBURVhfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVF9BUlJBWSB8IFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX0FSUkFZIHwgVEVYX0NPTVBPTkVOVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVF9BUlJBWSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVF9BUlJBWSksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVF9BUlJBWSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlLCBnbHNsX3R5cGU6OnZlYzNfdHlwZSwgVEVYX09GRlNFVF9BUlJBWSB8IFRFWF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6aXZlYzRfdHlwZSwgZ2xzbF90eXBlOjppc2FtcGxlcjJEQXJyYXlfdHlwZSwgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsIFRFWF9PRkZTRVRfQVJSQVkgfCBURVhfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnV2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6dXNhbXBsZXIyREFycmF5X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUX0FSUkFZIHwgVEVYX0NPTVBPTkVOVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX0FSUkFZKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRFJlY3RfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfQVJSQVkpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwgZ2xzbF90eXBlOjp1c2FtcGxlcjJEUmVjdF90eXBlLCBnbHNsX3R5cGU6OnZlYzJfdHlwZSwgVEVYX09GRlNFVF9BUlJBWSksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX0FSUkFZIHwgVEVYX0NPTVBPTkVOVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjppdmVjNF90eXBlLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX0FSUkFZIHwgVEVYX0NPTVBPTkVOVCksCisgICAgICAgICAgICAgICAgX3RleHR1cmUoaXJfdGc0LCBncHVfc2hhZGVyNSwgZ2xzbF90eXBlOjp1dmVjNF90eXBlLCBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX0FSUkFZIHwgVEVYX0NPTVBPTkVOVCksCisKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRTaGFkb3dfdHlwZSwgZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIFRFWF9PRkZTRVRfQVJSQVkpLAorICAgICAgICAgICAgICAgIF90ZXh0dXJlKGlyX3RnNCwgZ3B1X3NoYWRlcjUsIGdsc2xfdHlwZTo6dmVjNF90eXBlLCBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjM190eXBlLCBURVhfT0ZGU0VUX0FSUkFZKSwKKyAgICAgICAgICAgICAgICBfdGV4dHVyZShpcl90ZzQsIGdwdV9zaGFkZXI1LCBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgZ2xzbF90eXBlOjpzYW1wbGVyMkRSZWN0U2hhZG93X3R5cGUsIGdsc2xfdHlwZTo6dmVjMl90eXBlLCBURVhfT0ZGU0VUX0FSUkFZKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgRihkRmR4KQorICAgRihkRmR5KQorICAgRihmd2lkdGgpCisgICBGKG5vaXNlMSkKKyAgIEYobm9pc2UyKQorICAgRihub2lzZTMpCisgICBGKG5vaXNlNCkKKworICAgSVUoYml0ZmllbGRFeHRyYWN0KQorICAgSVUoYml0ZmllbGRJbnNlcnQpCisgICBJVShiaXRmaWVsZFJldmVyc2UpCisgICBJVShiaXRDb3VudCkKKyAgIElVKGZpbmRMU0IpCisgICBJVShmaW5kTVNCKQorICAgRihmbWEpCisKKyAgIGFkZF9mdW5jdGlvbigibGRleHAiLAorICAgICAgICAgICAgICAgIF9sZGV4cChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGdsc2xfdHlwZTo6aW50X3R5cGUpLAorICAgICAgICAgICAgICAgIF9sZGV4cChnbHNsX3R5cGU6OnZlYzJfdHlwZSwgIGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX2xkZXhwKGdsc2xfdHlwZTo6dmVjM190eXBlLCAgZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfbGRleHAoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICBnbHNsX3R5cGU6Oml2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oImZyZXhwIiwKKyAgICAgICAgICAgICAgICBfZnJleHAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCBnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfZnJleHAoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICBnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9mcmV4cChnbHNsX3R5cGU6OnZlYzNfdHlwZSwgIGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX2ZyZXhwKGdsc2xfdHlwZTo6dmVjNF90eXBlLCAgZ2xzbF90eXBlOjppdmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidWFkZENhcnJ5IiwKKyAgICAgICAgICAgICAgICBfdWFkZENhcnJ5KGdsc2xfdHlwZTo6dWludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfdWFkZENhcnJ5KGdsc2xfdHlwZTo6dXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3VhZGRDYXJyeShnbHNsX3R5cGU6OnV2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF91YWRkQ2FycnkoZ2xzbF90eXBlOjp1dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidXN1YkJvcnJvdyIsCisgICAgICAgICAgICAgICAgX3VzdWJCb3Jyb3coZ2xzbF90eXBlOjp1aW50X3R5cGUpLAorICAgICAgICAgICAgICAgIF91c3ViQm9ycm93KGdsc2xfdHlwZTo6dXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX3VzdWJCb3Jyb3coZ2xzbF90eXBlOjp1dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfdXN1YkJvcnJvdyhnbHNsX3R5cGU6OnV2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgYWRkX2Z1bmN0aW9uKCJpbXVsRXh0ZW5kZWQiLAorICAgICAgICAgICAgICAgIF9tdWxFeHRlbmRlZChnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbXVsRXh0ZW5kZWQoZ2xzbF90eXBlOjppdmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfbXVsRXh0ZW5kZWQoZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfbXVsRXh0ZW5kZWQoZ2xzbF90eXBlOjppdmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgIGFkZF9mdW5jdGlvbigidW11bEV4dGVuZGVkIiwKKyAgICAgICAgICAgICAgICBfbXVsRXh0ZW5kZWQoZ2xzbF90eXBlOjp1aW50X3R5cGUpLAorICAgICAgICAgICAgICAgIF9tdWxFeHRlbmRlZChnbHNsX3R5cGU6OnV2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9tdWxFeHRlbmRlZChnbHNsX3R5cGU6OnV2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9tdWxFeHRlbmRlZChnbHNsX3R5cGU6OnV2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oImF0b21pY0NvdW50ZXIiLAorICAgICAgICAgICAgICAgIF9hdG9taWNfb3AoIl9faW50cmluc2ljX2F0b21pY19yZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl9hdG9taWNfY291bnRlcnMpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgYWRkX2Z1bmN0aW9uKCJhdG9taWNDb3VudGVySW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICBfYXRvbWljX29wKCJfX2ludHJpbnNpY19hdG9taWNfaW5jcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl9hdG9taWNfY291bnRlcnMpLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgYWRkX2Z1bmN0aW9uKCJhdG9taWNDb3VudGVyRGVjcmVtZW50IiwKKyAgICAgICAgICAgICAgICBfYXRvbWljX29wKCJfX2ludHJpbnNpY19hdG9taWNfcHJlZGVjcmVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl9hdG9taWNfY291bnRlcnMpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfZnVuY3Rpb24oIm1pbjMiLAorICAgICAgICAgICAgICAgIF9taW4zKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSksCisgICAgICAgICAgICAgICAgX21pbjMoZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taW4zKGdsc2xfdHlwZTo6dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfbWluMyhnbHNsX3R5cGU6OnZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfbWluMyhnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWluMyhnbHNsX3R5cGU6Oml2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taW4zKGdsc2xfdHlwZTo6aXZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX21pbjMoZ2xzbF90eXBlOjppdmVjNF90eXBlKSwKKworICAgICAgICAgICAgICAgIF9taW4zKGdsc2xfdHlwZTo6dWludF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWluMyhnbHNsX3R5cGU6OnV2ZWMyX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taW4zKGdsc2xfdHlwZTo6dXZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX21pbjMoZ2xzbF90eXBlOjp1dmVjNF90eXBlKSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgYWRkX2Z1bmN0aW9uKCJtYXgzIiwKKyAgICAgICAgICAgICAgICBfbWF4MyhnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLAorICAgICAgICAgICAgICAgIF9tYXgzKGdsc2xfdHlwZTo6dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWF4MyhnbHNsX3R5cGU6OnZlYzNfdHlwZSksCisgICAgICAgICAgICAgICAgX21heDMoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX21heDMoZ2xzbF90eXBlOjppbnRfdHlwZSksCisgICAgICAgICAgICAgICAgX21heDMoZ2xzbF90eXBlOjppdmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWF4MyhnbHNsX3R5cGU6Oml2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9tYXgzKGdsc2xfdHlwZTo6aXZlYzRfdHlwZSksCisKKyAgICAgICAgICAgICAgICBfbWF4MyhnbHNsX3R5cGU6OnVpbnRfdHlwZSksCisgICAgICAgICAgICAgICAgX21heDMoZ2xzbF90eXBlOjp1dmVjMl90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWF4MyhnbHNsX3R5cGU6OnV2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9tYXgzKGdsc2xfdHlwZTo6dXZlYzRfdHlwZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgIGFkZF9mdW5jdGlvbigibWlkMyIsCisgICAgICAgICAgICAgICAgX21pZDMoZ2xzbF90eXBlOjpmbG9hdF90eXBlKSwKKyAgICAgICAgICAgICAgICBfbWlkMyhnbHNsX3R5cGU6OnZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX21pZDMoZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLAorICAgICAgICAgICAgICAgIF9taWQzKGdsc2xfdHlwZTo6dmVjNF90eXBlKSwKKworICAgICAgICAgICAgICAgIF9taWQzKGdsc2xfdHlwZTo6aW50X3R5cGUpLAorICAgICAgICAgICAgICAgIF9taWQzKGdsc2xfdHlwZTo6aXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX21pZDMoZ2xzbF90eXBlOjppdmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfbWlkMyhnbHNsX3R5cGU6Oml2ZWM0X3R5cGUpLAorCisgICAgICAgICAgICAgICAgX21pZDMoZ2xzbF90eXBlOjp1aW50X3R5cGUpLAorICAgICAgICAgICAgICAgIF9taWQzKGdsc2xfdHlwZTo6dXZlYzJfdHlwZSksCisgICAgICAgICAgICAgICAgX21pZDMoZ2xzbF90eXBlOjp1dmVjM190eXBlKSwKKyAgICAgICAgICAgICAgICBfbWlkMyhnbHNsX3R5cGU6OnV2ZWM0X3R5cGUpLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICBhZGRfaW1hZ2VfZnVuY3Rpb25zKHRydWUpOworCisgICBhZGRfZnVuY3Rpb24oIm1lbW9yeUJhcnJpZXIiLAorICAgICAgICAgICAgICAgIF9tZW1vcnlfYmFycmllcihzaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZSksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyN1bmRlZiBGCisjdW5kZWYgRkkKKyN1bmRlZiBGSVUKKyN1bmRlZiBGSVVCCisjdW5kZWYgRklVMl9NSVhFRAorfQorCit2b2lkCitidWlsdGluX2J1aWxkZXI6OmFkZF9mdW5jdGlvbihjb25zdCBjaGFyICpuYW1lLCAuLi4pCit7CisgICB2YV9saXN0IGFwOworCisgICBpcl9mdW5jdGlvbiAqZiA9IG5ldyhtZW1fY3R4KSBpcl9mdW5jdGlvbihuYW1lKTsKKworICAgdmFfc3RhcnQoYXAsIG5hbWUpOworICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnID0gdmFfYXJnKGFwLCBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKik7CisgICAgICBpZiAoc2lnID09IE5VTEwpCisgICAgICAgICBicmVhazsKKworICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICBleGVjX2xpc3Qgc3R1ZmY7CisgICAgICAgICBzdHVmZi5wdXNoX3RhaWwoc2lnKTsKKyAgICAgICAgIHZhbGlkYXRlX2lyX3RyZWUoJnN0dWZmKTsKKyAgICAgIH0KKworICAgICAgZi0+YWRkX3NpZ25hdHVyZShzaWcpOworICAgfQorICAgdmFfZW5kKGFwKTsKKworICAgc2hhZGVyLT5zeW1ib2xzLT5hZGRfZnVuY3Rpb24oZik7Cit9CisKK3ZvaWQKK2J1aWx0aW5fYnVpbGRlcjo6YWRkX2ltYWdlX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnRyaW5zaWNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9hcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHR5cGVzW10gPSB7CisgICAgICBnbHNsX3R5cGU6OmltYWdlMURfdHlwZSwKKyAgICAgIGdsc2xfdHlwZTo6aW1hZ2UyRF90eXBlLAorICAgICAgZ2xzbF90eXBlOjppbWFnZTNEX3R5cGUsCisgICAgICBnbHNsX3R5cGU6OmltYWdlMkRSZWN0X3R5cGUsCisgICAgICBnbHNsX3R5cGU6OmltYWdlQ3ViZV90eXBlLAorICAgICAgZ2xzbF90eXBlOjppbWFnZUJ1ZmZlcl90eXBlLAorICAgICAgZ2xzbF90eXBlOjppbWFnZTFEQXJyYXlfdHlwZSwKKyAgICAgIGdsc2xfdHlwZTo6aW1hZ2UyREFycmF5X3R5cGUsCisgICAgICBnbHNsX3R5cGU6OmltYWdlQ3ViZUFycmF5X3R5cGUsCisgICAgICBnbHNsX3R5cGU6OmltYWdlMkRNU190eXBlLAorICAgICAgZ2xzbF90eXBlOjppbWFnZTJETVNBcnJheV90eXBlLAorICAgICAgZ2xzbF90eXBlOjppaW1hZ2UxRF90eXBlLAorICAgICAgZ2xzbF90eXBlOjppaW1hZ2UyRF90eXBlLAorICAgICAgZ2xzbF90eXBlOjppaW1hZ2UzRF90eXBlLAorICAgICAgZ2xzbF90eXBlOjppaW1hZ2UyRFJlY3RfdHlwZSwKKyAgICAgIGdsc2xfdHlwZTo6aWltYWdlQ3ViZV90eXBlLAorICAgICAgZ2xzbF90eXBlOjppaW1hZ2VCdWZmZXJfdHlwZSwKKyAgICAgIGdsc2xfdHlwZTo6aWltYWdlMURBcnJheV90eXBlLAorICAgICAgZ2xzbF90eXBlOjppaW1hZ2UyREFycmF5X3R5cGUsCisgICAgICBnbHNsX3R5cGU6OmlpbWFnZUN1YmVBcnJheV90eXBlLAorICAgICAgZ2xzbF90eXBlOjppaW1hZ2UyRE1TX3R5cGUsCisgICAgICBnbHNsX3R5cGU6OmlpbWFnZTJETVNBcnJheV90eXBlLAorICAgICAgZ2xzbF90eXBlOjp1aW1hZ2UxRF90eXBlLAorICAgICAgZ2xzbF90eXBlOjp1aW1hZ2UyRF90eXBlLAorICAgICAgZ2xzbF90eXBlOjp1aW1hZ2UzRF90eXBlLAorICAgICAgZ2xzbF90eXBlOjp1aW1hZ2UyRFJlY3RfdHlwZSwKKyAgICAgIGdsc2xfdHlwZTo6dWltYWdlQ3ViZV90eXBlLAorICAgICAgZ2xzbF90eXBlOjp1aW1hZ2VCdWZmZXJfdHlwZSwKKyAgICAgIGdsc2xfdHlwZTo6dWltYWdlMURBcnJheV90eXBlLAorICAgICAgZ2xzbF90eXBlOjp1aW1hZ2UyREFycmF5X3R5cGUsCisgICAgICBnbHNsX3R5cGU6OnVpbWFnZUN1YmVBcnJheV90eXBlLAorICAgICAgZ2xzbF90eXBlOjp1aW1hZ2UyRE1TX3R5cGUsCisgICAgICBnbHNsX3R5cGU6OnVpbWFnZTJETVNBcnJheV90eXBlCisgICB9OworICAgaXJfZnVuY3Rpb24gKmYgPSBuZXcobWVtX2N0eCkgaXJfZnVuY3Rpb24obmFtZSk7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBFbGVtZW50cyh0eXBlcyk7ICsraSkgeworICAgICAgaWYgKHR5cGVzW2ldLT5zYW1wbGVyX3R5cGUgIT0gR0xTTF9UWVBFX0ZMT0FUIHx8CisgICAgICAgICAgKGZsYWdzICYgSU1BR0VfRlVOQ1RJT05fU1VQUE9SVFNfRkxPQVRfREFUQV9UWVBFKSkKKyAgICAgICAgIGYtPmFkZF9zaWduYXR1cmUoX2ltYWdlKHR5cGVzW2ldLCBpbnRyaW5zaWNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hcmd1bWVudHMsIGZsYWdzKSk7CisgICB9CisKKyAgIHNoYWRlci0+c3ltYm9scy0+YWRkX2Z1bmN0aW9uKGYpOworfQorCit2b2lkCitidWlsdGluX2J1aWxkZXI6OmFkZF9pbWFnZV9mdW5jdGlvbnMoYm9vbCBnbHNsKQoreworICAgY29uc3QgdW5zaWduZWQgZmxhZ3MgPSAoZ2xzbCA/IElNQUdFX0ZVTkNUSU9OX0VNSVRfU1RVQiA6IDApOworCisgICBhZGRfaW1hZ2VfZnVuY3Rpb24oZ2xzbCA/ICJpbWFnZUxvYWQiIDogIl9faW50cmluc2ljX2ltYWdlX2xvYWQiLAorICAgICAgICAgICAgICAgICAgICAgICJfX2ludHJpbnNpY19pbWFnZV9sb2FkIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgfCBJTUFHRV9GVU5DVElPTl9IQVNfVkVDVE9SX0RBVEFfVFlQRSB8CisgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0ZVTkNUSU9OX1NVUFBPUlRTX0ZMT0FUX0RBVEFfVFlQRSB8CisgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0ZVTkNUSU9OX1JFQURfT05MWSkpOworCisgICBhZGRfaW1hZ2VfZnVuY3Rpb24oZ2xzbCA/ICJpbWFnZVN0b3JlIiA6ICJfX2ludHJpbnNpY19pbWFnZV9zdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgIl9faW50cmluc2ljX2ltYWdlX3N0b3JlIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgfCBJTUFHRV9GVU5DVElPTl9SRVRVUk5TX1ZPSUQgfAorICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9GVU5DVElPTl9IQVNfVkVDVE9SX0RBVEFfVFlQRSB8CisgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0ZVTkNUSU9OX1NVUFBPUlRTX0ZMT0FUX0RBVEFfVFlQRSB8CisgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0ZVTkNUSU9OX1dSSVRFX09OTFkpKTsKKworICAgYWRkX2ltYWdlX2Z1bmN0aW9uKGdsc2wgPyAiaW1hZ2VBdG9taWNBZGQiIDogIl9faW50cmluc2ljX2ltYWdlX2F0b21pY19hZGQiLAorICAgICAgICAgICAgICAgICAgICAgICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfYWRkIiwgMSwgZmxhZ3MpOworCisgICBhZGRfaW1hZ2VfZnVuY3Rpb24oZ2xzbCA/ICJpbWFnZUF0b21pY01pbiIgOiAiX19pbnRyaW5zaWNfaW1hZ2VfYXRvbWljX21pbiIsCisgICAgICAgICAgICAgICAgICAgICAgIl9faW50cmluc2ljX2ltYWdlX2F0b21pY19taW4iLCAxLCBmbGFncyk7CisKKyAgIGFkZF9pbWFnZV9mdW5jdGlvbihnbHNsID8gImltYWdlQXRvbWljTWF4IiA6ICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfbWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAiX19pbnRyaW5zaWNfaW1hZ2VfYXRvbWljX21heCIsIDEsIGZsYWdzKTsKKworICAgYWRkX2ltYWdlX2Z1bmN0aW9uKGdsc2wgPyAiaW1hZ2VBdG9taWNBbmQiIDogIl9faW50cmluc2ljX2ltYWdlX2F0b21pY19hbmQiLAorICAgICAgICAgICAgICAgICAgICAgICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfYW5kIiwgMSwgZmxhZ3MpOworCisgICBhZGRfaW1hZ2VfZnVuY3Rpb24oZ2xzbCA/ICJpbWFnZUF0b21pY09yIiA6ICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfb3IiLAorICAgICAgICAgICAgICAgICAgICAgICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfb3IiLCAxLCBmbGFncyk7CisKKyAgIGFkZF9pbWFnZV9mdW5jdGlvbihnbHNsID8gImltYWdlQXRvbWljWG9yIiA6ICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfeG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAiX19pbnRyaW5zaWNfaW1hZ2VfYXRvbWljX3hvciIsIDEsIGZsYWdzKTsKKworICAgYWRkX2ltYWdlX2Z1bmN0aW9uKChnbHNsID8gImltYWdlQXRvbWljRXhjaGFuZ2UiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIl9faW50cmluc2ljX2ltYWdlX2F0b21pY19leGNoYW5nZSIpLAorICAgICAgICAgICAgICAgICAgICAgICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfZXhjaGFuZ2UiLCAxLCBmbGFncyk7CisKKyAgIGFkZF9pbWFnZV9mdW5jdGlvbigoZ2xzbCA/ICJpbWFnZUF0b21pY0NvbXBTd2FwIiA6CisgICAgICAgICAgICAgICAgICAgICAgICJfX2ludHJpbnNpY19pbWFnZV9hdG9taWNfY29tcF9zd2FwIiksCisgICAgICAgICAgICAgICAgICAgICAgIl9faW50cmluc2ljX2ltYWdlX2F0b21pY19jb21wX3N3YXAiLCAyLCBmbGFncyk7Cit9CisKK2lyX3ZhcmlhYmxlICoKK2J1aWx0aW5fYnVpbGRlcjo6aW5fdmFyKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUodHlwZSwgbmFtZSwgaXJfdmFyX2Z1bmN0aW9uX2luKTsKK30KKworaXJfdmFyaWFibGUgKgorYnVpbHRpbl9idWlsZGVyOjpvdXRfdmFyKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUodHlwZSwgbmFtZSwgaXJfdmFyX2Z1bmN0aW9uX291dCk7Cit9CisKK2lyX2NvbnN0YW50ICoKK2J1aWx0aW5fYnVpbGRlcjo6aW1tKGZsb2F0IGYsIHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50cykKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoZiwgdmVjdG9yX2VsZW1lbnRzKTsKK30KKworaXJfY29uc3RhbnQgKgorYnVpbHRpbl9idWlsZGVyOjppbW0oaW50IGksIHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50cykKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoaSwgdmVjdG9yX2VsZW1lbnRzKTsKK30KKworaXJfY29uc3RhbnQgKgorYnVpbHRpbl9idWlsZGVyOjppbW0odW5zaWduZWQgdSwgdW5zaWduZWQgdmVjdG9yX2VsZW1lbnRzKQoreworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudCh1LCB2ZWN0b3JfZWxlbWVudHMpOworfQorCitpcl9jb25zdGFudCAqCitidWlsdGluX2J1aWxkZXI6OmltbShjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGlyX2NvbnN0YW50X2RhdGEgJmRhdGEpCit7CisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KHR5cGUsICZkYXRhKTsKK30KKworaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKgorYnVpbHRpbl9idWlsZGVyOjp2YXJfcmVmKGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7Cit9CisKK2lyX2RlcmVmZXJlbmNlX2FycmF5ICoKK2J1aWx0aW5fYnVpbGRlcjo6YXJyYXlfcmVmKGlyX3ZhcmlhYmxlICp2YXIsIGludCBpZHgpCit7CisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KHZhciwgaW1tKGlkeCkpOworfQorCisvKiogUmV0dXJuIGFuIGVsZW1lbnQgb2YgYSBtYXRyaXggKi8KK2lyX3N3aXp6bGUgKgorYnVpbHRpbl9idWlsZGVyOjptYXRyaXhfZWx0KGlyX3ZhcmlhYmxlICp2YXIsIGludCBjb2x1bW4sIGludCByb3cpCit7CisgICByZXR1cm4gc3dpenpsZShhcnJheV9yZWYodmFyLCBjb2x1bW4pLCByb3csIDEpOworfQorCisvKioKKyAqIEltcGxlbWVudGF0aW9ucyBvZiBidWlsdC1pbiBmdW5jdGlvbnM6CisgKiAgQHsKKyAqLworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6bmV3X3NpZyhjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgICB2YV9saXN0IGFwOworCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfZnVuY3Rpb25fc2lnbmF0dXJlKHJldHVybl90eXBlLCBhdmFpbCk7CisKKyAgIGV4ZWNfbGlzdCBwbGlzdDsKKyAgIHZhX3N0YXJ0KGFwLCBudW1fcGFyYW1zKTsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3BhcmFtczsgaSsrKSB7CisgICAgICBwbGlzdC5wdXNoX3RhaWwodmFfYXJnKGFwLCBpcl92YXJpYWJsZSAqKSk7CisgICB9CisgICB2YV9lbmQoYXApOworCisgICBzaWctPnJlcGxhY2VfcGFyYW1ldGVycygmcGxpc3QpOworICAgcmV0dXJuIHNpZzsKK30KKworI2RlZmluZSBNQUtFX1NJRyhyZXR1cm5fdHlwZSwgYXZhaWwsIC4uLikgIFwKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnID0gICAgICAgICAgICAgICBcCisgICAgICBuZXdfc2lnKHJldHVybl90eXBlLCBhdmFpbCwgX19WQV9BUkdTX18pOyAgICAgIFwKKyAgIGlyX2ZhY3RvcnkgYm9keSgmc2lnLT5ib2R5LCBtZW1fY3R4KTsgICAgICAgICAgICAgXAorICAgc2lnLT5pc19kZWZpbmVkID0gdHJ1ZTsKKworI2RlZmluZSBNQUtFX0lOVFJJTlNJQyhyZXR1cm5fdHlwZSwgYXZhaWwsIC4uLikgICAgICBcCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG5ld19zaWcocmV0dXJuX3R5cGUsIGF2YWlsLCBfX1ZBX0FSR1NfXyk7ICAgICAgXAorICAgc2lnLT5pc19pbnRyaW5zaWMgPSB0cnVlOworCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjp1bm9wKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICBpcl9leHByZXNzaW9uX29wZXJhdGlvbiBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnBhcmFtX3R5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3ZhcihwYXJhbV90eXBlLCAieCIpOworICAgTUFLRV9TSUcocmV0dXJuX3R5cGUsIGF2YWlsLCAxLCB4KTsKKyAgIGJvZHkuZW1pdChyZXQoZXhwcihvcGNvZGUsIHgpKSk7CisgICByZXR1cm4gc2lnOworfQorCisjZGVmaW5lIFVOT1AoTkFNRSwgT1BDT0RFLCBBVkFJTCkgICAgICAgICAgICAgICBcCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKiAgICAgICAgICAgICAgICAgICAgICAgICBcCitidWlsdGluX2J1aWxkZXI6Ol8jI05BTUUoY29uc3QgZ2xzbF90eXBlICp0eXBlKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICByZXR1cm4gdW5vcCgmQVZBSUwsIE9QQ09ERSwgdHlwZSwgdHlwZSk7ICAgICBcCit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6OmJpbm9wKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnBhcmFtMF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnBhcmFtMV90eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIocGFyYW0wX3R5cGUsICJ4Iik7CisgICBpcl92YXJpYWJsZSAqeSA9IGluX3ZhcihwYXJhbTFfdHlwZSwgInkiKTsKKyAgIE1BS0VfU0lHKHJldHVybl90eXBlLCBhdmFpbCwgMiwgeCwgeSk7CisgICBib2R5LmVtaXQocmV0KGV4cHIob3Bjb2RlLCB4LCB5KSkpOworICAgcmV0dXJuIHNpZzsKK30KKworI2RlZmluZSBCSU5PUChOQU1FLCBPUENPREUsIEFWQUlMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraXJfZnVuY3Rpb25fc2lnbmF0dXJlICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorYnVpbHRpbl9idWlsZGVyOjpfIyNOQU1FKGNvbnN0IGdsc2xfdHlwZSAqcmV0dXJuX3R5cGUsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqcGFyYW0wX3R5cGUsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqcGFyYW0xX3R5cGUpICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcmV0dXJuIGJpbm9wKCZBVkFJTCwgT1BDT0RFLCByZXR1cm5fdHlwZSwgcGFyYW0wX3R5cGUsIHBhcmFtMV90eXBlKTsgXAorfQorCisvKioKKyAqIEFuZ2xlIGFuZCBUcmlnb25vbWV0cnkgRnVuY3Rpb25zIEB7CisgKi8KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3JhZGlhbnMoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKmRlZ3JlZXMgPSBpbl92YXIodHlwZSwgImRlZ3JlZXMiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIGFsd2F5c19hdmFpbGFibGUsIDEsIGRlZ3JlZXMpOworICAgYm9keS5lbWl0KHJldChtdWwoZGVncmVlcywgaW1tKDAuMDE3NDUzMjkyNWYpKSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2RlZ3JlZXMoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnJhZGlhbnMgPSBpbl92YXIodHlwZSwgInJhZGlhbnMiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIGFsd2F5c19hdmFpbGFibGUsIDEsIHJhZGlhbnMpOworICAgYm9keS5lbWl0KHJldChtdWwocmFkaWFucywgaW1tKDU3LjI5NTc4ZikpKSk7CisgICByZXR1cm4gc2lnOworfQorCitVTk9QKHNpbiwgaXJfdW5vcF9zaW4sIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKGNvcywgaXJfdW5vcF9jb3MsIGFsd2F5c19hdmFpbGFibGUpCisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol90YW4oY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnRoZXRhID0gaW5fdmFyKHR5cGUsICJ0aGV0YSIpOworICAgTUFLRV9TSUcodHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMSwgdGhldGEpOworICAgYm9keS5lbWl0KHJldChkaXYoc2luKHRoZXRhKSwgY29zKHRoZXRhKSkpKTsKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2V4cHJlc3Npb24gKgorYnVpbHRpbl9idWlsZGVyOjphc2luX2V4cHIoaXJfdmFyaWFibGUgKngpCit7CisgICByZXR1cm4gbXVsKHNpZ24oeCksCisgICAgICAgICAgICAgIHN1YihpbW0oTV9QSV8yZiksCisgICAgICAgICAgICAgICAgICBtdWwoc3FydChzdWIoaW1tKDEuMGYpLCBhYnMoeCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICBhZGQoaW1tKE1fUElfMmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwoYWJzKHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKGltbShNX1BJXzRmIC0gMS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKGFicyh4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKGltbSgwLjA4NjU2NjcyNGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKGFicyh4KSwgaW1tKC0wLjAzMTAyOTU1ZikpKSkpKSkpKSk7Cit9CisKK2lyX2NhbGwgKgorYnVpbHRpbl9idWlsZGVyOjpjYWxsKGlyX2Z1bmN0aW9uICpmLCBpcl92YXJpYWJsZSAqcmV0LCBleGVjX2xpc3QgcGFyYW1zKQoreworICAgZXhlY19saXN0IGFjdHVhbF9wYXJhbXM7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmcGFyYW1zKSB7CisgICAgICBpcl92YXJpYWJsZSAqdmFyID0gKGlyX3ZhcmlhYmxlICopIG5vZGU7CisgICAgICBhY3R1YWxfcGFyYW1zLnB1c2hfdGFpbCh2YXJfcmVmKHZhcikpOworICAgfQorCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9CisgICAgICBmLT5leGFjdF9tYXRjaGluZ19zaWduYXR1cmUoTlVMTCwgJmFjdHVhbF9wYXJhbXMpOworICAgaWYgKCFzaWcpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmID0KKyAgICAgIChzaWctPnJldHVybl90eXBlLT5pc192b2lkKCkgPyBOVUxMIDogdmFyX3JlZihyZXQpKTsKKworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9jYWxsKHNpZywgZGVyZWYsICZhY3R1YWxfcGFyYW1zKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2FzaW4oY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIGFsd2F5c19hdmFpbGFibGUsIDEsIHgpOworCisgICBib2R5LmVtaXQocmV0KGFzaW5fZXhwcih4KSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfYWNvcyhjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih0eXBlLCAieCIpOworICAgTUFLRV9TSUcodHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMSwgeCk7CisKKyAgIGJvZHkuZW1pdChyZXQoc3ViKGltbShNX1BJXzJmKSwgYXNpbl9leHByKHgpKSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfYXRhbjIoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnZlY195ID0gaW5fdmFyKHR5cGUsICJ2ZWNfeSIpOworICAgaXJfdmFyaWFibGUgKnZlY194ID0gaW5fdmFyKHR5cGUsICJ2ZWNfeCIpOworICAgTUFLRV9TSUcodHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMiwgdmVjX3ksIHZlY194KTsKKworICAgaXJfdmFyaWFibGUgKnZlY19yZXN1bHQgPSBib2R5Lm1ha2VfdGVtcCh0eXBlLCAidmVjX3Jlc3VsdCIpOworICAgaXJfdmFyaWFibGUgKnIgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJyIik7CisgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICBpcl92YXJpYWJsZSAqeSA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgInkiKTsKKyAgICAgIGlyX3ZhcmlhYmxlICp4ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAieCIpOworICAgICAgYm9keS5lbWl0KGFzc2lnbih5LCBzd2l6emxlKHZlY195LCBpLCAxKSkpOworICAgICAgYm9keS5lbWl0KGFzc2lnbih4LCBzd2l6emxlKHZlY194LCBpLCAxKSkpOworCisgICAgICAvKiBJZiB8eHwgPj0gMS4wZS04ICogfHl8OiAqLworICAgICAgaXJfaWYgKm91dGVyX2lmID0KKyAgICAgICAgIG5ldyhtZW1fY3R4KSBpcl9pZihncmVhdGVyKGFicyh4KSwgbXVsKGltbSgxLjBlLThmKSwgYWJzKHkpKSkpOworCisgICAgICBpcl9mYWN0b3J5IG91dGVyX3RoZW4oJm91dGVyX2lmLT50aGVuX2luc3RydWN0aW9ucywgbWVtX2N0eCk7CisKKyAgICAgIC8qIFRoZW4uLi5jYWxsIGF0YW4oeS94KSAqLworICAgICAgaXJfdmFyaWFibGUgKnlfb3Zlcl94ID0gb3V0ZXJfdGhlbi5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAieV9vdmVyX3giKTsKKyAgICAgIG91dGVyX3RoZW4uZW1pdChhc3NpZ24oeV9vdmVyX3gsIGRpdih5LCB4KSkpOworICAgICAgb3V0ZXJfdGhlbi5lbWl0KGFzc2lnbihyLCBtdWwoeV9vdmVyX3gsIHJzcShhZGQobXVsKHlfb3Zlcl94LCB5X292ZXJfeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW0oMS4wZikpKSkpKTsKKyAgICAgIG91dGVyX3RoZW4uZW1pdChhc3NpZ24ociwgYXNpbl9leHByKHIpKSk7CisKKyAgICAgIC8qICAgICAuLi5hbmQgZml4IGl0IHVwOiAqLworICAgICAgaXJfaWYgKmlubmVyX2lmID0gbmV3KG1lbV9jdHgpIGlyX2lmKGxlc3MoeCwgaW1tKDAuMGYpKSk7CisgICAgICBpbm5lcl9pZi0+dGhlbl9pbnN0cnVjdGlvbnMucHVzaF90YWlsKAorICAgICAgICAgaWZfdHJlZShnZXF1YWwoeSwgaW1tKDAuMGYpKSwKKyAgICAgICAgICAgICAgICAgYXNzaWduKHIsIGFkZChyLCBpbW0oTV9QSWYpKSksCisgICAgICAgICAgICAgICAgIGFzc2lnbihyLCBzdWIociwgaW1tKE1fUElmKSkpKSk7CisgICAgICBvdXRlcl90aGVuLmVtaXQoaW5uZXJfaWYpOworCisgICAgICAvKiBFbHNlLi4uICovCisgICAgICBvdXRlcl9pZi0+ZWxzZV9pbnN0cnVjdGlvbnMucHVzaF90YWlsKAorICAgICAgICAgYXNzaWduKHIsIG11bChzaWduKHkpLCBpbW0oTV9QSV8yZikpKSk7CisKKyAgICAgIGJvZHkuZW1pdChvdXRlcl9pZik7CisKKyAgICAgIGJvZHkuZW1pdChhc3NpZ24odmVjX3Jlc3VsdCwgciwgMSA8PCBpKSk7CisgICB9CisgICBib2R5LmVtaXQocmV0KHZlY19yZXN1bHQpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2F0YW4oY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnlfb3Zlcl94ID0gaW5fdmFyKHR5cGUsICJ5X292ZXJfeCIpOworICAgTUFLRV9TSUcodHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMSwgeV9vdmVyX3gpOworCisgICBpcl92YXJpYWJsZSAqdCA9IGJvZHkubWFrZV90ZW1wKHR5cGUsICJ0Iik7CisgICBib2R5LmVtaXQoYXNzaWduKHQsIG11bCh5X292ZXJfeCwgcnNxKGFkZChtdWwoeV9vdmVyX3gsIHlfb3Zlcl94KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbSgxLjBmKSkpKSkpOworCisgICBib2R5LmVtaXQocmV0KGFzaW5fZXhwcih0KSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfc2luaChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih0eXBlLCAieCIpOworICAgTUFLRV9TSUcodHlwZSwgdjEzMCwgMSwgeCk7CisKKyAgIC8qIDAuNSAqIChlXnggLSBlXigteCkpICovCisgICBib2R5LmVtaXQocmV0KG11bChpbW0oMC41ZiksIHN1YihleHAoeCksIGV4cChuZWcoeCkpKSkpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2Nvc2goY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIHYxMzAsIDEsIHgpOworCisgICAvKiAwLjUgKiAoZV54ICsgZV4oLXgpKSAqLworICAgYm9keS5lbWl0KHJldChtdWwoaW1tKDAuNWYpLCBhZGQoZXhwKHgpLCBleHAobmVnKHgpKSkpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol90YW5oKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHR5cGUsICJ4Iik7CisgICBNQUtFX1NJRyh0eXBlLCB2MTMwLCAxLCB4KTsKKworICAgLyogKGVeeCAtIGVeKC14KSkgLyAoZV54ICsgZV4oLXgpKSAqLworICAgYm9keS5lbWl0KHJldChkaXYoc3ViKGV4cCh4KSwgZXhwKG5lZyh4KSkpLAorICAgICAgICAgICAgICAgICAgICAgYWRkKGV4cCh4KSwgZXhwKG5lZyh4KSkpKSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfYXNpbmgoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIHYxMzAsIDEsIHgpOworCisgICBib2R5LmVtaXQocmV0KG11bChzaWduKHgpLCBsb2coYWRkKGFicyh4KSwgc3FydChhZGQobXVsKHgsIHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbSgxLjBmKSkpKSkpKSk7CisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfYWNvc2goY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIHYxMzAsIDEsIHgpOworCisgICBib2R5LmVtaXQocmV0KGxvZyhhZGQoeCwgc3FydChzdWIobXVsKHgsIHgpLCBpbW0oMS4wZikpKSkpKSk7CisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfYXRhbmgoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIHYxMzAsIDEsIHgpOworCisgICBib2R5LmVtaXQocmV0KG11bChpbW0oMC41ZiksIGxvZyhkaXYoYWRkKGltbSgxLjBmKSwgeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKGltbSgxLjBmKSwgeCkpKSkpKTsKKyAgIHJldHVybiBzaWc7Cit9CisvKiogQH0gKi8KKworLyoqCisgKiBFeHBvbmVudGlhbCBGdW5jdGlvbnMgQHsKKyAqLworCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfcG93KGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHJldHVybiBiaW5vcChpcl9iaW5vcF9wb3csIGFsd2F5c19hdmFpbGFibGUsIHR5cGUsIHR5cGUsIHR5cGUpOworfQorCitVTk9QKGV4cCwgICAgICAgICBpcl91bm9wX2V4cCwgIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKGxvZywgICAgICAgICBpcl91bm9wX2xvZywgIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKGV4cDIsICAgICAgICBpcl91bm9wX2V4cDIsIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKGxvZzIsICAgICAgICBpcl91bm9wX2xvZzIsIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKHNxcnQsICAgICAgICBpcl91bm9wX3NxcnQsIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKGludmVyc2VzcXJ0LCBpcl91bm9wX3JzcSwgIGFsd2F5c19hdmFpbGFibGUpCisKKy8qKiBAfSAqLworCitVTk9QKGFicywgICAgICAgaXJfdW5vcF9hYnMsICAgICAgICBhbHdheXNfYXZhaWxhYmxlKQorVU5PUChzaWduLCAgICAgIGlyX3Vub3Bfc2lnbiwgICAgICAgYWx3YXlzX2F2YWlsYWJsZSkKK1VOT1AoZmxvb3IsICAgICBpcl91bm9wX2Zsb29yLCAgICAgIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKHRydW5jLCAgICAgaXJfdW5vcF90cnVuYywgICAgICB2MTMwKQorVU5PUChyb3VuZCwgICAgIGlyX3Vub3Bfcm91bmRfZXZlbiwgYWx3YXlzX2F2YWlsYWJsZSkKK1VOT1Aocm91bmRFdmVuLCBpcl91bm9wX3JvdW5kX2V2ZW4sIGFsd2F5c19hdmFpbGFibGUpCitVTk9QKGNlaWwsICAgICAgaXJfdW5vcF9jZWlsLCAgICAgICBhbHdheXNfYXZhaWxhYmxlKQorVU5PUChmcmFjdCwgICAgIGlyX3Vub3BfZnJhY3QsICAgICAgYWx3YXlzX2F2YWlsYWJsZSkKKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X21vZChjb25zdCBnbHNsX3R5cGUgKnhfdHlwZSwgY29uc3QgZ2xzbF90eXBlICp5X3R5cGUpCit7CisgICByZXR1cm4gYmlub3AoaXJfYmlub3BfbW9kLCBhbHdheXNfYXZhaWxhYmxlLCB4X3R5cGUsIHhfdHlwZSwgeV90eXBlKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X21vZGYoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIGlyX3ZhcmlhYmxlICppID0gb3V0X3Zhcih0eXBlLCAiaSIpOworICAgTUFLRV9TSUcodHlwZSwgdjEzMCwgMiwgeCwgaSk7CisKKyAgIGlyX3ZhcmlhYmxlICp0ID0gYm9keS5tYWtlX3RlbXAodHlwZSwgInQiKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24odCwgZXhwcihpcl91bm9wX3RydW5jLCB4KSkpOworICAgYm9keS5lbWl0KGFzc2lnbihpLCB0KSk7CisgICBib2R5LmVtaXQocmV0KHN1Yih4LCB0KSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfbWluKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnhfdHlwZSwgY29uc3QgZ2xzbF90eXBlICp5X3R5cGUpCit7CisgICByZXR1cm4gYmlub3AoaXJfYmlub3BfbWluLCBhdmFpbCwgeF90eXBlLCB4X3R5cGUsIHlfdHlwZSk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9tYXgoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqeF90eXBlLCBjb25zdCBnbHNsX3R5cGUgKnlfdHlwZSkKK3sKKyAgIHJldHVybiBiaW5vcChpcl9iaW5vcF9tYXgsIGF2YWlsLCB4X3R5cGUsIHhfdHlwZSwgeV90eXBlKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2NsYW1wKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqdmFsX3R5cGUsIGNvbnN0IGdsc2xfdHlwZSAqYm91bmRfdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHZhbF90eXBlLCAieCIpOworICAgaXJfdmFyaWFibGUgKm1pblZhbCA9IGluX3Zhcihib3VuZF90eXBlLCAibWluVmFsIik7CisgICBpcl92YXJpYWJsZSAqbWF4VmFsID0gaW5fdmFyKGJvdW5kX3R5cGUsICJtYXhWYWwiKTsKKyAgIE1BS0VfU0lHKHZhbF90eXBlLCBhdmFpbCwgMywgeCwgbWluVmFsLCBtYXhWYWwpOworCisgICBib2R5LmVtaXQocmV0KGNsYW1wKHgsIG1pblZhbCwgbWF4VmFsKSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfbWl4X2xycChjb25zdCBnbHNsX3R5cGUgKnZhbF90eXBlLCBjb25zdCBnbHNsX3R5cGUgKmJsZW5kX3R5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih2YWxfdHlwZSwgIngiKTsKKyAgIGlyX3ZhcmlhYmxlICp5ID0gaW5fdmFyKHZhbF90eXBlLCAieSIpOworICAgaXJfdmFyaWFibGUgKmEgPSBpbl92YXIoYmxlbmRfdHlwZSwgImEiKTsKKyAgIE1BS0VfU0lHKHZhbF90eXBlLCBhbHdheXNfYXZhaWxhYmxlLCAzLCB4LCB5LCBhKTsKKworICAgYm9keS5lbWl0KHJldChscnAoeCwgeSwgYSkpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X21peF9zZWwoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnZhbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmJsZW5kX3R5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih2YWxfdHlwZSwgIngiKTsKKyAgIGlyX3ZhcmlhYmxlICp5ID0gaW5fdmFyKHZhbF90eXBlLCAieSIpOworICAgaXJfdmFyaWFibGUgKmEgPSBpbl92YXIoYmxlbmRfdHlwZSwgImEiKTsKKyAgIE1BS0VfU0lHKHZhbF90eXBlLCBhdmFpbCwgMywgeCwgeSwgYSk7CisKKyAgIC8qIGNzZWwgbWF0Y2hlcyB0aGUgdGVybmFyeSBvcGVyYXRvciBpbiB0aGF0IGEgc2VsZWN0b3Igb2YgdHJ1ZSBjaG9zZXMgdGhlCisgICAgKiBmaXJzdCBhcmd1bWVudC4gVGhpcyBkaWZmZXJzIGZyb20gbWl4KHgsIHksIGZhbHNlKSB3aGljaCBjaG9zZXMgdGhlCisgICAgKiBzZWNvbmQgYXJndW1lbnQgKHRvIHJlbWFpbiBjb25zaXN0ZW50IHdpdGggdGhlIGludGVycG9sYXRpbmcgdmVyc2lvbiBvZgorICAgICogbWl4KCkgd2hpY2ggdGFrZXMgYSBibGVuZCBmYWN0b3IgZnJvbSAwLjAgdG8gMS4wIHdoZXJlIDAuMCBpcyBvbmx5IHguCisgICAgKgorICAgICogVG8gaGFuZGxlIHRoZSBiZWhhdmlvciBtaXNtYXRjaCwgcmV2ZXJzZSB0aGUgeCBhbmQgeSBhcmd1bWVudHMuCisgICAgKi8KKyAgIGJvZHkuZW1pdChyZXQoY3NlbChhLCB5LCB4KSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfc3RlcChjb25zdCBnbHNsX3R5cGUgKmVkZ2VfdHlwZSwgY29uc3QgZ2xzbF90eXBlICp4X3R5cGUpCit7CisgICBpcl92YXJpYWJsZSAqZWRnZSA9IGluX3ZhcihlZGdlX3R5cGUsICJlZGdlIik7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih4X3R5cGUsICJ4Iik7CisgICBNQUtFX1NJRyh4X3R5cGUsIGFsd2F5c19hdmFpbGFibGUsIDIsIGVkZ2UsIHgpOworCisgICBpcl92YXJpYWJsZSAqdCA9IGJvZHkubWFrZV90ZW1wKHhfdHlwZSwgInQiKTsKKyAgIGlmICh4X3R5cGUtPnZlY3Rvcl9lbGVtZW50cyA9PSAxKSB7CisgICAgICAvKiBCb3RoIGFyZSBmbG9hdHMgKi8KKyAgICAgIGJvZHkuZW1pdChhc3NpZ24odCwgYjJmKGdlcXVhbCh4LCBlZGdlKSkpKTsKKyAgIH0gZWxzZSBpZiAoZWRnZV90eXBlLT52ZWN0b3JfZWxlbWVudHMgPT0gMSkgeworICAgICAgLyogeCBpcyBhIHZlY3RvciBidXQgZWRnZSBpcyBhIGZsb2F0ICovCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhfdHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgIGJvZHkuZW1pdChhc3NpZ24odCwgYjJmKGdlcXVhbChzd2l6emxlKHgsIGksIDEpLCBlZGdlKSksIDEgPDwgaSkpOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIC8qIEJvdGggYXJlIHZlY3RvcnMgKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeF90eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgICAgYm9keS5lbWl0KGFzc2lnbih0LCBiMmYoZ2VxdWFsKHN3aXp6bGUoeCwgaSwgMSksIHN3aXp6bGUoZWRnZSwgaSwgMSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBpKSk7CisgICAgICB9CisgICB9CisgICBib2R5LmVtaXQocmV0KHQpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3Ntb290aHN0ZXAoY29uc3QgZ2xzbF90eXBlICplZGdlX3R5cGUsIGNvbnN0IGdsc2xfdHlwZSAqeF90eXBlKQoreworICAgaXJfdmFyaWFibGUgKmVkZ2UwID0gaW5fdmFyKGVkZ2VfdHlwZSwgImVkZ2UwIik7CisgICBpcl92YXJpYWJsZSAqZWRnZTEgPSBpbl92YXIoZWRnZV90eXBlLCAiZWRnZTEiKTsKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHhfdHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKHhfdHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMywgZWRnZTAsIGVkZ2UxLCB4KTsKKworICAgLyogRnJvbSB0aGUgR0xTTCAxLjEwIHNwZWNpZmljYXRpb246CisgICAgKgorICAgICogICAgZ2VuVHlwZSB0OworICAgICogICAgdCA9IGNsYW1wKCh4IC0gZWRnZTApIC8gKGVkZ2UxIC0gZWRnZTApLCAwLCAxKTsKKyAgICAqICAgIHJldHVybiB0ICogdCAqICgzIC0gMiAqIHQpOworICAgICovCisKKyAgIGlyX3ZhcmlhYmxlICp0ID0gYm9keS5tYWtlX3RlbXAoeF90eXBlLCAidCIpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBjbGFtcChkaXYoc3ViKHgsIGVkZ2UwKSwgc3ViKGVkZ2UxLCBlZGdlMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW0oMC4wZiksIGltbSgxLjBmKSkpKTsKKworICAgYm9keS5lbWl0KHJldChtdWwodCwgbXVsKHQsIHN1YihpbW0oMy4wZiksIG11bChpbW0oMi4wZiksIHQpKSkpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9pc25hbihjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih0eXBlLCAieCIpOworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjpidmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHYxMzAsIDEsIHgpOworCisgICBib2R5LmVtaXQocmV0KG5lcXVhbCh4LCB4KSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfaXNpbmYoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6YnZlYyh0eXBlLT52ZWN0b3JfZWxlbWVudHMpLCB2MTMwLCAxLCB4KTsKKworICAgaXJfY29uc3RhbnRfZGF0YSBpbmZpbml0aWVzOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgaW5maW5pdGllcy5mW2ldID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICB9CisKKyAgIGJvZHkuZW1pdChyZXQoZXF1YWwoYWJzKHgpLCBpbW0odHlwZSwgaW5maW5pdGllcykpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9mbG9hdEJpdHNUb0ludChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih0eXBlLCAieCIpOworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjppdmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHNoYWRlcl9iaXRfZW5jb2RpbmcsIDEsIHgpOworICAgYm9keS5lbWl0KHJldChiaXRjYXN0X2YyaSh4KSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2Zsb2F0Qml0c1RvVWludChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih0eXBlLCAieCIpOworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjp1dmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHNoYWRlcl9iaXRfZW5jb2RpbmcsIDEsIHgpOworICAgYm9keS5lbWl0KHJldChiaXRjYXN0X2YydSh4KSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2ludEJpdHNUb0Zsb2F0KGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHR5cGUsICJ4Iik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnZlYyh0eXBlLT52ZWN0b3JfZWxlbWVudHMpLCBzaGFkZXJfYml0X2VuY29kaW5nLCAxLCB4KTsKKyAgIGJvZHkuZW1pdChyZXQoYml0Y2FzdF9pMmYoeCkpKTsKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol91aW50Qml0c1RvRmxvYXQoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHNoYWRlcl9iaXRfZW5jb2RpbmcsIDEsIHgpOworICAgYm9keS5lbWl0KHJldChiaXRjYXN0X3UyZih4KSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3BhY2tVbm9ybTJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKQoreworICAgaXJfdmFyaWFibGUgKnYgPSBpbl92YXIoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICJ2Iik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnVpbnRfdHlwZSwgYXZhaWwsIDEsIHYpOworICAgYm9keS5lbWl0KHJldChleHByKGlyX3Vub3BfcGFja191bm9ybV8yeDE2LCB2KSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3BhY2tTbm9ybTJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKQoreworICAgaXJfdmFyaWFibGUgKnYgPSBpbl92YXIoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICJ2Iik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnVpbnRfdHlwZSwgYXZhaWwsIDEsIHYpOworICAgYm9keS5lbWl0KHJldChleHByKGlyX3Vub3BfcGFja19zbm9ybV8yeDE2LCB2KSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3BhY2tVbm9ybTR4OChidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwpCit7CisgICBpcl92YXJpYWJsZSAqdiA9IGluX3ZhcihnbHNsX3R5cGU6OnZlYzRfdHlwZSwgInYiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dWludF90eXBlLCBhdmFpbCwgMSwgdik7CisgICBib2R5LmVtaXQocmV0KGV4cHIoaXJfdW5vcF9wYWNrX3Vub3JtXzR4OCwgdikpKTsKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9wYWNrU25vcm00eDgoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKQoreworICAgaXJfdmFyaWFibGUgKnYgPSBpbl92YXIoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJ2Iik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnVpbnRfdHlwZSwgYXZhaWwsIDEsIHYpOworICAgYm9keS5lbWl0KHJldChleHByKGlyX3Vub3BfcGFja19zbm9ybV80eDgsIHYpKSk7CisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfdW5wYWNrVW5vcm0yeDE2KGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCkKK3sKKyAgIGlyX3ZhcmlhYmxlICpwID0gaW5fdmFyKGdsc2xfdHlwZTo6dWludF90eXBlLCAicCIpOworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsIGF2YWlsLCAxLCBwKTsKKyAgIGJvZHkuZW1pdChyZXQoZXhwcihpcl91bm9wX3VucGFja191bm9ybV8yeDE2LCBwKSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3VucGFja1Nub3JtMngxNihidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwpCit7CisgICBpcl92YXJpYWJsZSAqcCA9IGluX3ZhcihnbHNsX3R5cGU6OnVpbnRfdHlwZSwgInAiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dmVjMl90eXBlLCBhdmFpbCwgMSwgcCk7CisgICBib2R5LmVtaXQocmV0KGV4cHIoaXJfdW5vcF91bnBhY2tfc25vcm1fMngxNiwgcCkpKTsKKyAgIHJldHVybiBzaWc7Cit9CisKKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3VucGFja1Vub3JtNHg4KGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCkKK3sKKyAgIGlyX3ZhcmlhYmxlICpwID0gaW5fdmFyKGdsc2xfdHlwZTo6dWludF90eXBlLCAicCIpOworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIGF2YWlsLCAxLCBwKTsKKyAgIGJvZHkuZW1pdChyZXQoZXhwcihpcl91bm9wX3VucGFja191bm9ybV80eDgsIHApKSk7CisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfdW5wYWNrU25vcm00eDgoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKQoreworICAgaXJfdmFyaWFibGUgKnAgPSBpbl92YXIoZ2xzbF90eXBlOjp1aW50X3R5cGUsICJwIik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnZlYzRfdHlwZSwgYXZhaWwsIDEsIHApOworICAgYm9keS5lbWl0KHJldChleHByKGlyX3Vub3BfdW5wYWNrX3Nub3JtXzR4OCwgcCkpKTsKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9wYWNrSGFsZjJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKQoreworICAgaXJfdmFyaWFibGUgKnYgPSBpbl92YXIoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICJ2Iik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnVpbnRfdHlwZSwgYXZhaWwsIDEsIHYpOworICAgYm9keS5lbWl0KHJldChleHByKGlyX3Vub3BfcGFja19oYWxmXzJ4MTYsIHYpKSk7CisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfdW5wYWNrSGFsZjJ4MTYoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKQoreworICAgaXJfdmFyaWFibGUgKnAgPSBpbl92YXIoZ2xzbF90eXBlOjp1aW50X3R5cGUsICJwIik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnZlYzJfdHlwZSwgYXZhaWwsIDEsIHApOworICAgYm9keS5lbWl0KHJldChleHByKGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNiwgcCkpKTsKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9sZW5ndGgoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMSwgeCk7CisKKyAgIGJvZHkuZW1pdChyZXQoc3FydChkb3QoeCwgeCkpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9kaXN0YW5jZShjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqcDAgPSBpbl92YXIodHlwZSwgInAwIik7CisgICBpcl92YXJpYWJsZSAqcDEgPSBpbl92YXIodHlwZSwgInAxIik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIGFsd2F5c19hdmFpbGFibGUsIDIsIHAwLCBwMSk7CisKKyAgIGlmICh0eXBlLT52ZWN0b3JfZWxlbWVudHMgPT0gMSkgeworICAgICAgYm9keS5lbWl0KHJldChhYnMoc3ViKHAwLCBwMSkpKSk7CisgICB9IGVsc2UgeworICAgICAgaXJfdmFyaWFibGUgKnAgPSBib2R5Lm1ha2VfdGVtcCh0eXBlLCAicCIpOworICAgICAgYm9keS5lbWl0KGFzc2lnbihwLCBzdWIocDAsIHAxKSkpOworICAgICAgYm9keS5lbWl0KHJldChzcXJ0KGRvdChwLCBwKSkpKTsKKyAgIH0KKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2RvdChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpZiAodHlwZS0+dmVjdG9yX2VsZW1lbnRzID09IDEpCisgICAgICByZXR1cm4gYmlub3AoaXJfYmlub3BfbXVsLCBhbHdheXNfYXZhaWxhYmxlLCB0eXBlLCB0eXBlLCB0eXBlKTsKKworICAgcmV0dXJuIGJpbm9wKGlyX2Jpbm9wX2RvdCwgYWx3YXlzX2F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIHR5cGUsIHR5cGUpOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfY3Jvc3MoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKmEgPSBpbl92YXIodHlwZSwgImEiKTsKKyAgIGlyX3ZhcmlhYmxlICpiID0gaW5fdmFyKHR5cGUsICJiIik7CisgICBNQUtFX1NJRyh0eXBlLCBhbHdheXNfYXZhaWxhYmxlLCAyLCBhLCBiKTsKKworICAgaW50IHl6eCA9IE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9ZLCBTV0laWkxFX1osIFNXSVpaTEVfWCwgMCk7CisgICBpbnQgenh5ID0gTUFLRV9TV0laWkxFNChTV0laWkxFX1osIFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCAwKTsKKworICAgYm9keS5lbWl0KHJldChzdWIobXVsKHN3aXp6bGUoYSwgeXp4LCAzKSwgc3dpenpsZShiLCB6eHksIDMpKSwKKyAgICAgICAgICAgICAgICAgICAgIG11bChzd2l6emxlKGEsIHp4eSwgMyksIHN3aXp6bGUoYiwgeXp4LCAzKSkpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9ub3JtYWxpemUoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIGFsd2F5c19hdmFpbGFibGUsIDEsIHgpOworCisgICBpZiAodHlwZS0+dmVjdG9yX2VsZW1lbnRzID09IDEpIHsKKyAgICAgIGJvZHkuZW1pdChyZXQoc2lnbih4KSkpOworICAgfSBlbHNlIHsKKyAgICAgIGJvZHkuZW1pdChyZXQobXVsKHgsIHJzcShkb3QoeCwgeCkpKSkpOworICAgfQorCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfZnRyYW5zZm9ybSgpCit7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnZlYzRfdHlwZSwgY29tcGF0aWJpbGl0eV92c19vbmx5LCAwKTsKKworICAgYm9keS5lbWl0KHJldChuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tdWwsCisgICAgICBnbHNsX3R5cGU6OnZlYzRfdHlwZSwKKyAgICAgIHZhcl9yZWYoZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCksCisgICAgICB2YXJfcmVmKGdsX1ZlcnRleCkpKSk7CisKKyAgIC8qIEZJTklTSE1FOiBPbmNlIHRoZSBpcl9leHByZXNzaW9uKCkgY29uc3RydWN0b3IgaGFuZGxlcyB0eXBlIGluZmVyZW5jZQorICAgICogICAgICAgICAgIGZvciBtYXRyaXggb3BlcmF0aW9ucywgd2UgY2FuIHNpbXBsaWZ5IHRoaXMgdG86CisgICAgKgorICAgICogICAgYm9keS5lbWl0KHJldChtdWwoZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCwgZ2xfVmVydGV4KSkpOworICAgICovCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfZmFjZWZvcndhcmQoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKk4gPSBpbl92YXIodHlwZSwgIk4iKTsKKyAgIGlyX3ZhcmlhYmxlICpJID0gaW5fdmFyKHR5cGUsICJJIik7CisgICBpcl92YXJpYWJsZSAqTnJlZiA9IGluX3Zhcih0eXBlLCAiTnJlZiIpOworICAgTUFLRV9TSUcodHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMywgTiwgSSwgTnJlZik7CisKKyAgIGJvZHkuZW1pdChpZl90cmVlKGxlc3MoZG90KE5yZWYsIEkpLCBpbW0oMC4wZikpLAorICAgICAgICAgICAgICAgICAgICAgcmV0KE4pLCByZXQobmVnKE4pKSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfcmVmbGVjdChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqSSA9IGluX3Zhcih0eXBlLCAiSSIpOworICAgaXJfdmFyaWFibGUgKk4gPSBpbl92YXIodHlwZSwgIk4iKTsKKyAgIE1BS0VfU0lHKHR5cGUsIGFsd2F5c19hdmFpbGFibGUsIDIsIEksIE4pOworCisgICAvKiBJIC0gMiAqIGRvdChOLCBJKSAqIE4gKi8KKyAgIGJvZHkuZW1pdChyZXQoc3ViKEksIG11bChpbW0oMi4wZiksIG11bChkb3QoTiwgSSksIE4pKSkpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3JlZnJhY3QoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKkkgPSBpbl92YXIodHlwZSwgIkkiKTsKKyAgIGlyX3ZhcmlhYmxlICpOID0gaW5fdmFyKHR5cGUsICJOIik7CisgICBpcl92YXJpYWJsZSAqZXRhID0gaW5fdmFyKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImV0YSIpOworICAgTUFLRV9TSUcodHlwZSwgYWx3YXlzX2F2YWlsYWJsZSwgMywgSSwgTiwgZXRhKTsKKworICAgaXJfdmFyaWFibGUgKm5fZG90X2kgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJuX2RvdF9pIik7CisgICBib2R5LmVtaXQoYXNzaWduKG5fZG90X2ksIGRvdChOLCBJKSkpOworCisgICAvKiBGcm9tIHRoZSBHTFNMIDEuMTAgc3BlY2lmaWNhdGlvbjoKKyAgICAqIGsgPSAxLjAgLSBldGEgKiBldGEgKiAoMS4wIC0gZG90KE4sIEkpICogZG90KE4sIEkpKQorICAgICogaWYgKGsgPCAwLjApCisgICAgKiAgICByZXR1cm4gZ2VuVHlwZSgwLjApCisgICAgKiBlbHNlCisgICAgKiAgICByZXR1cm4gZXRhICogSSAtIChldGEgKiBkb3QoTiwgSSkgKyBzcXJ0KGspKSAqIE4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKmsgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJrIik7CisgICBib2R5LmVtaXQoYXNzaWduKGssIHN1YihpbW0oMS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwoZXRhLCBtdWwoZXRhLCBzdWIoaW1tKDEuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChuX2RvdF9pLCBuX2RvdF9pKSkpKSkpKTsKKyAgIGJvZHkuZW1pdChpZl90cmVlKGxlc3MoaywgaW1tKDAuMGYpKSwKKyAgICAgICAgICAgICAgICAgICAgIHJldChpcl9jb25zdGFudDo6emVybyhtZW1fY3R4LCB0eXBlKSksCisgICAgICAgICAgICAgICAgICAgICByZXQoc3ViKG11bChldGEsIEkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwoYWRkKG11bChldGEsIG5fZG90X2kpLCBzcXJ0KGspKSwgTikpKSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfbWF0cml4Q29tcE11bHQoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIGlyX3ZhcmlhYmxlICp5ID0gaW5fdmFyKHR5cGUsICJ5Iik7CisgICBNQUtFX1NJRyh0eXBlLCBhbHdheXNfYXZhaWxhYmxlLCAyLCB4LCB5KTsKKworICAgaXJfdmFyaWFibGUgKnogPSBib2R5Lm1ha2VfdGVtcCh0eXBlLCAieiIpOworICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5tYXRyaXhfY29sdW1uczsgaSsrKSB7CisgICAgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZih6LCBpKSwgbXVsKGFycmF5X3JlZih4LCBpKSwgYXJyYXlfcmVmKHksIGkpKSkpOworICAgfQorICAgYm9keS5lbWl0KHJldCh6KSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9vdXRlclByb2R1Y3QoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKmMgPSBpbl92YXIoZ2xzbF90eXBlOjp2ZWModHlwZS0+dmVjdG9yX2VsZW1lbnRzKSwgImMiKTsKKyAgIGlyX3ZhcmlhYmxlICpyID0gaW5fdmFyKGdsc2xfdHlwZTo6dmVjKHR5cGUtPm1hdHJpeF9jb2x1bW5zKSwgInIiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIHYxMjAsIDIsIGMsIHIpOworCisgICBpcl92YXJpYWJsZSAqbSA9IGJvZHkubWFrZV90ZW1wKHR5cGUsICJtIik7CisgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPm1hdHJpeF9jb2x1bW5zOyBpKyspIHsKKyAgICAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKG0sIGkpLCBtdWwoYywgc3dpenpsZShyLCBpLCAxKSkpKTsKKyAgIH0KKyAgIGJvZHkuZW1pdChyZXQobSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfdHJhbnNwb3NlKGNvbnN0IGdsc2xfdHlwZSAqb3JpZ190eXBlKQoreworICAgY29uc3QgZ2xzbF90eXBlICp0cmFuc3Bvc2VfdHlwZSA9CisgICAgICBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX3R5cGUtPm1hdHJpeF9jb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ190eXBlLT52ZWN0b3JfZWxlbWVudHMpOworCisgICBpcl92YXJpYWJsZSAqbSA9IGluX3ZhcihvcmlnX3R5cGUsICJtIik7CisgICBNQUtFX1NJRyh0cmFuc3Bvc2VfdHlwZSwgdjEyMCwgMSwgbSk7CisKKyAgIGlyX3ZhcmlhYmxlICp0ID0gYm9keS5tYWtlX3RlbXAodHJhbnNwb3NlX3R5cGUsICJ0Iik7CisgICBmb3IgKGludCBpID0gMDsgaSA8IG9yaWdfdHlwZS0+bWF0cml4X2NvbHVtbnM7IGkrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBvcmlnX3R5cGUtPnZlY3Rvcl9lbGVtZW50czsgaisrKSB7CisgICAgICAgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZih0LCBqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X2VsdChtLCBpLCBqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBpKSk7CisgICAgICB9CisgICB9CisgICBib2R5LmVtaXQocmV0KHQpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2RldGVybWluYW50X21hdDIoKQoreworICAgaXJfdmFyaWFibGUgKm0gPSBpbl92YXIoZ2xzbF90eXBlOjptYXQyX3R5cGUsICJtIik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIHYxMjAsIDEsIG0pOworCisgICBib2R5LmVtaXQocmV0KHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgbWF0cml4X2VsdChtLCAxLCAxKSksCisgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAwLCAxKSkpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9kZXRlcm1pbmFudF9tYXQzKCkKK3sKKyAgIGlyX3ZhcmlhYmxlICptID0gaW5fdmFyKGdsc2xfdHlwZTo6bWF0M190eXBlLCAibSIpOworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCB2MTIwLCAxLCBtKTsKKworICAgaXJfZXhwcmVzc2lvbiAqZjEgPQorICAgICAgc3ViKG11bChtYXRyaXhfZWx0KG0sIDEsIDEpLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSwKKyAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAyKSwgbWF0cml4X2VsdChtLCAyLCAxKSkpOworCisgICBpcl9leHByZXNzaW9uICpmMiA9CisgICAgICBzdWIobXVsKG1hdHJpeF9lbHQobSwgMSwgMCksIG1hdHJpeF9lbHQobSwgMiwgMikpLAorICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDIpLCBtYXRyaXhfZWx0KG0sIDIsIDApKSk7CisKKyAgIGlyX2V4cHJlc3Npb24gKmYzID0KKyAgICAgIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAxKSksCisgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMSwgMSksIG1hdHJpeF9lbHQobSwgMiwgMCkpKTsKKworICAgYm9keS5lbWl0KHJldChhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDApLCBmMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIGYyKSksCisgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAyKSwgZjMpKSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfZGV0ZXJtaW5hbnRfbWF0NCgpCit7CisgICBpcl92YXJpYWJsZSAqbSA9IGluX3ZhcihnbHNsX3R5cGU6Om1hdDRfdHlwZSwgIm0iKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgdjEyMCwgMSwgbSk7CisKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwMCA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjAwIik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMDEgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IwMSIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjAyID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMDIiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwMyA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjAzIik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMDQgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IwNCIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjA1ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMDUiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwNiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjA2Iik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMDcgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IwNyIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjA4ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMDgiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwOSA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjA5Iik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMTAgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IxMCIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjExID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMTEiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IxMiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjEyIik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMTMgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IxMyIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjE0ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMTQiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IxNSA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjE1Iik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMTYgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IxNiIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjE3ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMTciKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IxOCA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjE4Iik7CisKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDAsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAyKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDIpLCBtYXRyaXhfZWx0KG0sIDIsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDEsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAxKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDIsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDIsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAxKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDMsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDIsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDQsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDUsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAzLCAxKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDIsIDEpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDYsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAyKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDIpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDcsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDgsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDksIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTAsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTEsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTIsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAzLCAxKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDEpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTMsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAyKSwgbWF0cml4X2VsdChtLCAyLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDIpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTQsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAyLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTUsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAyLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTYsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTcsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTgsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAxKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDEpKSkpKTsKKworICAgaXJfdmFyaWFibGUgKmFkal8wID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJhZGpfMCIpOworCisgICBib2R5LmVtaXQoYXNzaWduKGFkal8wLAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDEsIDEpLCBTdWJGYWN0b3IwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMSwgMiksIFN1YkZhY3RvcjAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAzKSwgU3ViRmFjdG9yMDIpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1gpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYWRqXzAsIG5lZygKKyAgICAgICAgICAgICAgICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgU3ViRmFjdG9yMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDIpLCBTdWJGYWN0b3IwMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMSwgMyksIFN1YkZhY3RvcjA0KSkpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWSkpOworICAgYm9keS5lbWl0KGFzc2lnbihhZGpfMCwKKyAgICAgICAgICAgICAgICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgU3ViRmFjdG9yMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDEpLCBTdWJGYWN0b3IwMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMSwgMyksIFN1YkZhY3RvcjA1KSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19aKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFkal8wLCBuZWcoCisgICAgICAgICAgICAgICAgICAgIGFkZChzdWIobXVsKG1hdHJpeF9lbHQobSwgMSwgMCksIFN1YkZhY3RvcjAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgU3ViRmFjdG9yMDQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDIpLCBTdWJGYWN0b3IwNSkpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1cpKTsKKworICAgYm9keS5lbWl0KHJldChkb3QoYXJyYXlfcmVmKG0sIDApLCBhZGpfMCkpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2ludmVyc2VfbWF0MigpCit7CisgICBpcl92YXJpYWJsZSAqbSA9IGluX3ZhcihnbHNsX3R5cGU6Om1hdDJfdHlwZSwgIm0iKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6bWF0Ml90eXBlLCB2MTIwLCAxLCBtKTsKKworICAgaXJfdmFyaWFibGUgKmFkaiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6bWF0Ml90eXBlLCAiYWRqIik7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDApLCBtYXRyaXhfZWx0KG0sIDEsIDEpLCAxIDw8IDApKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMCksIG5lZyhtYXRyaXhfZWx0KG0sIDAsIDEpKSwgMSA8PCAxKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDEpLCBuZWcobWF0cml4X2VsdChtLCAxLCAwKSksIDEgPDwgMCkpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAxKSwgbWF0cml4X2VsdChtLCAwLCAwKSwgMSA8PCAxKSk7CisKKyAgIGlyX2V4cHJlc3Npb24gKmRldCA9CisgICAgICBzdWIobXVsKG1hdHJpeF9lbHQobSwgMCwgMCksIG1hdHJpeF9lbHQobSwgMSwgMSkpLAorICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDApLCBtYXRyaXhfZWx0KG0sIDAsIDEpKSk7CisKKyAgIGJvZHkuZW1pdChyZXQoZGl2KGFkaiwgZGV0KSkpOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2ludmVyc2VfbWF0MygpCit7CisgICBpcl92YXJpYWJsZSAqbSA9IGluX3ZhcihnbHNsX3R5cGU6Om1hdDNfdHlwZSwgIm0iKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6bWF0M190eXBlLCB2MTIwLCAxLCBtKTsKKworICAgaXJfdmFyaWFibGUgKmYxMV8yMl8yMV8xMiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImYxMV8yMl8yMV8xMiIpOworICAgaXJfdmFyaWFibGUgKmYxMF8yMl8yMF8xMiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImYxMF8yMl8yMF8xMiIpOworICAgaXJfdmFyaWFibGUgKmYxMF8yMV8yMF8xMSA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImYxMF8yMV8yMF8xMSIpOworCisgICBib2R5LmVtaXQoYXNzaWduKGYxMV8yMl8yMV8xMiwKKyAgICAgICAgICAgICAgICAgICAgc3ViKG11bChtYXRyaXhfZWx0KG0sIDEsIDEpLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDIsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oZjEwXzIyXzIwXzEyLAorICAgICAgICAgICAgICAgICAgICBzdWIobXVsKG1hdHJpeF9lbHQobSwgMSwgMCksIG1hdHJpeF9lbHQobSwgMiwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMiwgMCksIG1hdHJpeF9lbHQobSwgMSwgMikpKSkpOworICAgYm9keS5lbWl0KGFzc2lnbihmMTBfMjFfMjBfMTEsCisgICAgICAgICAgICAgICAgICAgIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAxLCAxKSkpKSk7CisKKyAgIGlyX3ZhcmlhYmxlICphZGogPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6Om1hdDNfdHlwZSwgImFkaiIpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAwKSwgZjExXzIyXzIxXzEyLCBXUklURU1BU0tfWCkpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAxKSwgbmVnKGYxMF8yMl8yMF8xMiksIFdSSVRFTUFTS19YKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDIpLCBmMTBfMjFfMjBfMTEsIFdSSVRFTUFTS19YKSk7CisKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMCksIG5lZygKKyAgICAgICAgICAgICAgICAgICAgc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDEpLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDIsIDEpLCBtYXRyaXhfZWx0KG0sIDAsIDIpKSkpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWSkpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDApLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDIsIDApLCBtYXRyaXhfZWx0KG0sIDAsIDIpKSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19ZKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDIpLCBuZWcoCisgICAgICAgICAgICAgICAgICAgIHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgbWF0cml4X2VsdChtLCAyLCAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAwLCAxKSkpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1kpKTsKKworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDEpLCBtYXRyaXhfZWx0KG0sIDAsIDIpKSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19aKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDEpLCBuZWcoCisgICAgICAgICAgICAgICAgICAgIHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgbWF0cml4X2VsdChtLCAxLCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAwLCAyKSkpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1opKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMiksCisgICAgICAgICAgICAgICAgICAgIHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgbWF0cml4X2VsdChtLCAxLCAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAwLCAxKSkpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWikpOworCisgICBpcl9leHByZXNzaW9uICpkZXQgPQorICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgZjExXzIyXzIxXzEyKSwKKyAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIGYxMF8yMl8yMF8xMikpLAorICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDIpLCBmMTBfMjFfMjBfMTEpKTsKKworICAgYm9keS5lbWl0KHJldChkaXYoYWRqLCBkZXQpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9pbnZlcnNlX21hdDQoKQoreworICAgaXJfdmFyaWFibGUgKm0gPSBpbl92YXIoZ2xzbF90eXBlOjptYXQ0X3R5cGUsICJtIik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6Om1hdDRfdHlwZSwgdjEyMCwgMSwgbSk7CisKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwMCA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjAwIik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMDEgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IwMSIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjAyID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMDIiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwMyA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjAzIik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMDQgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IwNCIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjA1ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMDUiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwNiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjA2Iik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMDcgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IwNyIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjA4ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMDgiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IwOSA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjA5Iik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMTAgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IxMCIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjExID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMTEiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IxMiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjEyIik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMTMgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IxMyIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjE0ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMTQiKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IxNSA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjE1Iik7CisgICBpcl92YXJpYWJsZSAqU3ViRmFjdG9yMTYgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJTdWJGYWN0b3IxNiIpOworICAgaXJfdmFyaWFibGUgKlN1YkZhY3RvcjE3ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiU3ViRmFjdG9yMTciKTsKKyAgIGlyX3ZhcmlhYmxlICpTdWJGYWN0b3IxOCA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgIlN1YkZhY3RvcjE4Iik7CisKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDAsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAyKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDIpLCBtYXRyaXhfZWx0KG0sIDIsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDEsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAxKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDIsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDIsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAxKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDMsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDIsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDQsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDIsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDUsIHN1YihtdWwobWF0cml4X2VsdChtLCAyLCAwKSwgbWF0cml4X2VsdChtLCAzLCAxKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDIsIDEpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDYsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAyKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDIpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDcsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDgsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMDksIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTAsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAzLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTEsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAzLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTIsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAzLCAxKSksIG11bChtYXRyaXhfZWx0KG0sIDMsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDEpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTMsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAyKSwgbWF0cml4X2VsdChtLCAyLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDIpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTQsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAyLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTUsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgbWF0cml4X2VsdChtLCAyLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDEpLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTYsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAzKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDMpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTcsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAyKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDIpKSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oU3ViRmFjdG9yMTgsIHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgbWF0cml4X2VsdChtLCAyLCAxKSksIG11bChtYXRyaXhfZWx0KG0sIDIsIDApLCBtYXRyaXhfZWx0KG0sIDEsIDEpKSkpKTsKKworICAgaXJfdmFyaWFibGUgKmFkaiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6bWF0NF90eXBlLCAiYWRqIik7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDApLAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDEsIDEpLCBTdWJGYWN0b3IwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMSwgMiksIFN1YkZhY3RvcjAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAzKSwgU3ViRmFjdG9yMDIpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1gpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMSksIG5lZygKKyAgICAgICAgICAgICAgICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgU3ViRmFjdG9yMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDIpLCBTdWJGYWN0b3IwMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMSwgMyksIFN1YkZhY3RvcjA0KSkpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWCkpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAxLCAwKSwgU3ViRmFjdG9yMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDEpLCBTdWJGYWN0b3IwMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMSwgMyksIFN1YkZhY3RvcjA1KSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19YKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDMpLCBuZWcoCisgICAgICAgICAgICAgICAgICAgIGFkZChzdWIobXVsKG1hdHJpeF9lbHQobSwgMSwgMCksIFN1YkZhY3RvcjAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAxLCAxKSwgU3ViRmFjdG9yMDQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDEsIDIpLCBTdWJGYWN0b3IwNSkpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1gpKTsKKworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAwKSwgbmVnKAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDEpLCBTdWJGYWN0b3IwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMiksIFN1YkZhY3RvcjAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAzKSwgU3ViRmFjdG9yMDIpKSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19ZKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDEpLAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDApLCBTdWJGYWN0b3IwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMiksIFN1YkZhY3RvcjAzKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAzKSwgU3ViRmFjdG9yMDQpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1kpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMiksIG5lZygKKyAgICAgICAgICAgICAgICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgU3ViRmFjdG9yMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDEpLCBTdWJGYWN0b3IwMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMyksIFN1YkZhY3RvcjA1KSkpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWSkpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgU3ViRmFjdG9yMDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDEpLCBTdWJGYWN0b3IwNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMiksIFN1YkZhY3RvcjA1KSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19ZKSk7CisKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMCksCisgICAgICAgICAgICAgICAgICAgIGFkZChzdWIobXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIFN1YkZhY3RvcjA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAyKSwgU3ViRmFjdG9yMDcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDMpLCBTdWJGYWN0b3IwOCkpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWikpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAxKSwgbmVnKAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDApLCBTdWJGYWN0b3IwNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMiksIFN1YkZhY3RvcjA5KSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAzKSwgU3ViRmFjdG9yMTApKSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19aKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDIpLAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDApLCBTdWJGYWN0b3IxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIFN1YkZhY3RvcjA5KSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAzKSwgU3ViRmFjdG9yMTIpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1opKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMyksIG5lZygKKyAgICAgICAgICAgICAgICAgICAgYWRkKHN1YihtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgU3ViRmFjdG9yMDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDEpLCBTdWJGYWN0b3IxMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMiksIFN1YkZhY3RvcjEyKSkpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWikpOworCisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDApLCBuZWcoCisgICAgICAgICAgICAgICAgICAgIGFkZChzdWIobXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIFN1YkZhY3RvcjEzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAyKSwgU3ViRmFjdG9yMTQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDMpLCBTdWJGYWN0b3IxNSkpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1cpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYXJyYXlfcmVmKGFkaiwgMSksCisgICAgICAgICAgICAgICAgICAgIGFkZChzdWIobXVsKG1hdHJpeF9lbHQobSwgMCwgMCksIFN1YkZhY3RvcjEzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAyKSwgU3ViRmFjdG9yMTYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDMpLCBTdWJGYWN0b3IxNykpLAorICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfVykpOworICAgYm9keS5lbWl0KGFzc2lnbihhcnJheV9yZWYoYWRqLCAyKSwgbmVnKAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDApLCBTdWJGYWN0b3IxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIFN1YkZhY3RvcjE2KSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAzKSwgU3ViRmFjdG9yMTgpKSksCisgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19XKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGFycmF5X3JlZihhZGosIDMpLAorICAgICAgICAgICAgICAgICAgICBhZGQoc3ViKG11bChtYXRyaXhfZWx0KG0sIDAsIDApLCBTdWJGYWN0b3IxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIFN1YkZhY3RvcjE3KSksCisgICAgICAgICAgICAgICAgICAgICAgICBtdWwobWF0cml4X2VsdChtLCAwLCAyKSwgU3ViRmFjdG9yMTgpKSwKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1cpKTsKKworICAgaXJfZXhwcmVzc2lvbiAqZGV0ID0KKyAgICAgIGFkZChtdWwobWF0cml4X2VsdChtLCAwLCAwKSwgbWF0cml4X2VsdChhZGosIDAsIDApKSwKKyAgICAgICAgICBhZGQobXVsKG1hdHJpeF9lbHQobSwgMCwgMSksIG1hdHJpeF9lbHQoYWRqLCAxLCAwKSksCisgICAgICAgICAgICAgIGFkZChtdWwobWF0cml4X2VsdChtLCAwLCAyKSwgbWF0cml4X2VsdChhZGosIDIsIDApKSwKKyAgICAgICAgICAgICAgICAgIG11bChtYXRyaXhfZWx0KG0sIDAsIDMpLCBtYXRyaXhfZWx0KGFkaiwgMywgMCkpKSkpOworCisgICBib2R5LmVtaXQocmV0KGRpdihhZGosIGRldCkpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfbGVzc1RoYW4oYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgcmV0dXJuIGJpbm9wKGlyX2Jpbm9wX2xlc3MsIGF2YWlsLAorICAgICAgICAgICAgICAgIGdsc2xfdHlwZTo6YnZlYyh0eXBlLT52ZWN0b3JfZWxlbWVudHMpLCB0eXBlLCB0eXBlKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2xlc3NUaGFuRXF1YWwoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICByZXR1cm4gYmlub3AoaXJfYmlub3BfbGVxdWFsLCBhdmFpbCwKKyAgICAgICAgICAgICAgICBnbHNsX3R5cGU6OmJ2ZWModHlwZS0+dmVjdG9yX2VsZW1lbnRzKSwgdHlwZSwgdHlwZSk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9ncmVhdGVyVGhhbihidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICByZXR1cm4gYmlub3AoaXJfYmlub3BfZ3JlYXRlciwgYXZhaWwsCisgICAgICAgICAgICAgICAgZ2xzbF90eXBlOjpidmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHR5cGUsIHR5cGUpOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfZ3JlYXRlclRoYW5FcXVhbChidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHJldHVybiBiaW5vcChpcl9iaW5vcF9nZXF1YWwsIGF2YWlsLAorICAgICAgICAgICAgICAgIGdsc2xfdHlwZTo6YnZlYyh0eXBlLT52ZWN0b3JfZWxlbWVudHMpLCB0eXBlLCB0eXBlKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2VxdWFsKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHJldHVybiBiaW5vcChpcl9iaW5vcF9lcXVhbCwgYXZhaWwsCisgICAgICAgICAgICAgICAgZ2xzbF90eXBlOjpidmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHR5cGUsIHR5cGUpOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfbm90RXF1YWwoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgcmV0dXJuIGJpbm9wKGlyX2Jpbm9wX25lcXVhbCwgYXZhaWwsCisgICAgICAgICAgICAgICAgZ2xzbF90eXBlOjpidmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHR5cGUsIHR5cGUpOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfYW55KGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHJldHVybiB1bm9wKGFsd2F5c19hdmFpbGFibGUsIGlyX3Vub3BfYW55LCBnbHNsX3R5cGU6OmJvb2xfdHlwZSwgdHlwZSk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9hbGwoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnYgPSBpbl92YXIodHlwZSwgInYiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6Ym9vbF90eXBlLCBhbHdheXNfYXZhaWxhYmxlLCAxLCB2KTsKKworICAgc3dpdGNoICh0eXBlLT52ZWN0b3JfZWxlbWVudHMpIHsKKyAgIGNhc2UgMjoKKyAgICAgIGJvZHkuZW1pdChyZXQobG9naWNfYW5kKHN3aXp6bGVfeCh2KSwgc3dpenpsZV95KHYpKSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIDM6CisgICAgICBib2R5LmVtaXQocmV0KGxvZ2ljX2FuZChsb2dpY19hbmQoc3dpenpsZV94KHYpLCBzd2l6emxlX3kodikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZV96KHYpKSkpOworICAgICAgYnJlYWs7CisgICBjYXNlIDQ6CisgICAgICBib2R5LmVtaXQocmV0KGxvZ2ljX2FuZChsb2dpY19hbmQobG9naWNfYW5kKHN3aXp6bGVfeCh2KSwgc3dpenpsZV95KHYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlX3oodikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZV93KHYpKSkpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiBzaWc7Cit9CisKK1VOT1Aobm90LCBpcl91bm9wX2xvZ2ljX25vdCwgYWx3YXlzX2F2YWlsYWJsZSkKKworc3RhdGljIGJvb2wKK2hhc19sb2QoY29uc3QgZ2xzbF90eXBlICpzYW1wbGVyX3R5cGUpCit7CisgICBhc3NlcnQoc2FtcGxlcl90eXBlLT5pc19zYW1wbGVyKCkpOworCisgICBzd2l0Y2ggKHNhbXBsZXJfdHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSkgeworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNX1JFQ1Q6CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fQlVGOgorICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNX01TOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfdGV4dHVyZVNpemUoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqc2FtcGxlcl90eXBlKQoreworICAgaXJfdmFyaWFibGUgKnMgPSBpbl92YXIoc2FtcGxlcl90eXBlLCAic2FtcGxlciIpOworICAgLyogVGhlIHNhbXBsZXIgYWx3YXlzIGV4aXN0czsgYWRkIG9wdGlvbmFsIGxvZCBsYXRlci4gKi8KKyAgIE1BS0VfU0lHKHJldHVybl90eXBlLCBhdmFpbCwgMSwgcyk7CisKKyAgIGlyX3RleHR1cmUgKnRleCA9IG5ldyhtZW1fY3R4KSBpcl90ZXh0dXJlKGlyX3R4cyk7CisgICB0ZXgtPnNldF9zYW1wbGVyKG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShzKSwgcmV0dXJuX3R5cGUpOworCisgICBpZiAoaGFzX2xvZChzYW1wbGVyX3R5cGUpKSB7CisgICAgICBpcl92YXJpYWJsZSAqbG9kID0gaW5fdmFyKGdsc2xfdHlwZTo6aW50X3R5cGUsICJsb2QiKTsKKyAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwobG9kKTsKKyAgICAgIHRleC0+bG9kX2luZm8ubG9kID0gdmFyX3JlZihsb2QpOworICAgfSBlbHNlIHsKKyAgICAgIHRleC0+bG9kX2luZm8ubG9kID0gaW1tKDB1KTsKKyAgIH0KKworICAgYm9keS5lbWl0KHJldCh0ZXgpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3RleHR1cmUoaXJfdGV4dHVyZV9vcGNvZGUgb3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqcmV0dXJuX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqc2FtcGxlcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvb3JkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgIGlyX3ZhcmlhYmxlICpzID0gaW5fdmFyKHNhbXBsZXJfdHlwZSwgInNhbXBsZXIiKTsKKyAgIGlyX3ZhcmlhYmxlICpQID0gaW5fdmFyKGNvb3JkX3R5cGUsICJQIik7CisgICAvKiBUaGUgc2FtcGxlciBhbmQgY29vcmRpbmF0ZSBhbHdheXMgZXhpc3Q7IGFkZCBvcHRpb25hbCBwYXJhbWV0ZXJzIGxhdGVyLiAqLworICAgTUFLRV9TSUcocmV0dXJuX3R5cGUsIGF2YWlsLCAyLCBzLCBQKTsKKworICAgaXJfdGV4dHVyZSAqdGV4ID0gbmV3KG1lbV9jdHgpIGlyX3RleHR1cmUob3Bjb2RlKTsKKyAgIHRleC0+c2V0X3NhbXBsZXIodmFyX3JlZihzKSwgcmV0dXJuX3R5cGUpOworCisgICBjb25zdCBpbnQgY29vcmRfc2l6ZSA9IHNhbXBsZXJfdHlwZS0+Y29vcmRpbmF0ZV9jb21wb25lbnRzKCk7CisKKyAgIGlmIChjb29yZF9zaXplID09IGNvb3JkX3R5cGUtPnZlY3Rvcl9lbGVtZW50cykgeworICAgICAgdGV4LT5jb29yZGluYXRlID0gdmFyX3JlZihQKTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBUaGUgaW5jb21pbmcgY29vcmRpbmF0ZSBhbHNvIGhhcyB0aGUgcHJvamVjdG9yIG9yIHNoYWRvdyBjb21wYXJpdG9yLAorICAgICAgICogc28gd2UgbmVlZCB0byBzd2l6emxlIHRob3NlIGF3YXkuCisgICAgICAgKi8KKyAgICAgIHRleC0+Y29vcmRpbmF0ZSA9IHN3aXp6bGVfZm9yX3NpemUoUCwgY29vcmRfc2l6ZSk7CisgICB9CisKKyAgIC8qIFRoZSBwcm9qZWN0b3IgaXMgYWx3YXlzIGluIHRoZSBsYXN0IGNvbXBvbmVudC4gKi8KKyAgIGlmIChmbGFncyAmIFRFWF9QUk9KRUNUKQorICAgICAgdGV4LT5wcm9qZWN0b3IgPSBzd2l6emxlKFAsIGNvb3JkX3R5cGUtPnZlY3Rvcl9lbGVtZW50cyAtIDEsIDEpOworCisgICBpZiAoc2FtcGxlcl90eXBlLT5zYW1wbGVyX3NoYWRvdykgeworICAgICAgaWYgKG9wY29kZSA9PSBpcl90ZzQpIHsKKyAgICAgICAgIC8qIGdhdGhlciBoYXMgcmVmeiBhcyBhIHNlcGFyYXRlIHBhcmFtZXRlciwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgICAgICAgICAgKiBjb29yZGluYXRlCisgICAgICAgICAgKi8KKyAgICAgICAgIGlyX3ZhcmlhYmxlICpyZWZ6ID0gaW5fdmFyKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgInJlZnoiKTsKKyAgICAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwocmVmeik7CisgICAgICAgICB0ZXgtPnNoYWRvd19jb21wYXJpdG9yID0gdmFyX3JlZihyZWZ6KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAvKiBUaGUgc2hhZG93IGNvbXBhcml0b3IgaXMgbm9ybWFsbHkgaW4gdGhlIFogY29tcG9uZW50LCBidXQgYSBmZXcgdHlwZXMKKyAgICAgICAgICAqIGhhdmUgc3VmZmljaWVudGx5IGxhcmdlIGNvb3JkaW5hdGVzIHRoYXQgaXQncyBpbiBXLgorICAgICAgICAgICovCisgICAgICAgICB0ZXgtPnNoYWRvd19jb21wYXJpdG9yID0gc3dpenpsZShQLCBNQVgyKGNvb3JkX3NpemUsIFNXSVpaTEVfWiksIDEpOworICAgICAgfQorICAgfQorCisgICBpZiAob3Bjb2RlID09IGlyX3R4bCkgeworICAgICAgaXJfdmFyaWFibGUgKmxvZCA9IGluX3ZhcihnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJsb2QiKTsKKyAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwobG9kKTsKKyAgICAgIHRleC0+bG9kX2luZm8ubG9kID0gdmFyX3JlZihsb2QpOworICAgfSBlbHNlIGlmIChvcGNvZGUgPT0gaXJfdHhkKSB7CisgICAgICBpbnQgZ3JhZF9zaXplID0gY29vcmRfc2l6ZSAtIChzYW1wbGVyX3R5cGUtPnNhbXBsZXJfYXJyYXkgPyAxIDogMCk7CisgICAgICBpcl92YXJpYWJsZSAqZFBkeCA9IGluX3ZhcihnbHNsX3R5cGU6OnZlYyhncmFkX3NpemUpLCAiZFBkeCIpOworICAgICAgaXJfdmFyaWFibGUgKmRQZHkgPSBpbl92YXIoZ2xzbF90eXBlOjp2ZWMoZ3JhZF9zaXplKSwgImRQZHkiKTsKKyAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwoZFBkeCk7CisgICAgICBzaWctPnBhcmFtZXRlcnMucHVzaF90YWlsKGRQZHkpOworICAgICAgdGV4LT5sb2RfaW5mby5ncmFkLmRQZHggPSB2YXJfcmVmKGRQZHgpOworICAgICAgdGV4LT5sb2RfaW5mby5ncmFkLmRQZHkgPSB2YXJfcmVmKGRQZHkpOworICAgfQorCisgICBpZiAoZmxhZ3MgJiAoVEVYX09GRlNFVCB8IFRFWF9PRkZTRVRfTk9OQ09OU1QpKSB7CisgICAgICBpbnQgb2Zmc2V0X3NpemUgPSBjb29yZF9zaXplIC0gKHNhbXBsZXJfdHlwZS0+c2FtcGxlcl9hcnJheSA/IDEgOiAwKTsKKyAgICAgIGlyX3ZhcmlhYmxlICpvZmZzZXQgPQorICAgICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6aXZlYyhvZmZzZXRfc2l6ZSksICJvZmZzZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFRFWF9PRkZTRVQpID8gaXJfdmFyX2NvbnN0X2luIDogaXJfdmFyX2Z1bmN0aW9uX2luKTsKKyAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwob2Zmc2V0KTsKKyAgICAgIHRleC0+b2Zmc2V0ID0gdmFyX3JlZihvZmZzZXQpOworICAgfQorCisgICBpZiAoZmxhZ3MgJiBURVhfT0ZGU0VUX0FSUkFZKSB7CisgICAgICBpcl92YXJpYWJsZSAqb2Zmc2V0cyA9CisgICAgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UoZ2xzbF90eXBlOjppdmVjMl90eXBlLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0cyIsIGlyX3Zhcl9jb25zdF9pbik7CisgICAgICBzaWctPnBhcmFtZXRlcnMucHVzaF90YWlsKG9mZnNldHMpOworICAgICAgdGV4LT5vZmZzZXQgPSB2YXJfcmVmKG9mZnNldHMpOworICAgfQorCisgICBpZiAob3Bjb2RlID09IGlyX3RnNCkgeworICAgICAgaWYgKGZsYWdzICYgVEVYX0NPTVBPTkVOVCkgeworICAgICAgICAgaXJfdmFyaWFibGUgKmNvbXBvbmVudCA9CisgICAgICAgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjppbnRfdHlwZSwgImNvbXAiLCBpcl92YXJfY29uc3RfaW4pOworICAgICAgICAgc2lnLT5wYXJhbWV0ZXJzLnB1c2hfdGFpbChjb21wb25lbnQpOworICAgICAgICAgdGV4LT5sb2RfaW5mby5jb21wb25lbnQgPSB2YXJfcmVmKGNvbXBvbmVudCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIHRleC0+bG9kX2luZm8uY29tcG9uZW50ID0gaW1tKDApOworICAgICAgfQorICAgfQorCisgICAvKiBUaGUgImJpYXMiIHBhcmFtZXRlciBjb21lcyAvYWZ0ZXIvIHRoZSAib2Zmc2V0IiBwYXJhbWV0ZXIsIHdoaWNoIGlzCisgICAgKiBpbmNvbnNpc3RlbnQgd2l0aCBib3RoIHRleHR1cmVMb2RPZmZzZXQgYW5kIHRleHR1cmVHcmFkT2Zmc2V0LgorICAgICovCisgICBpZiAob3Bjb2RlID09IGlyX3R4YikgeworICAgICAgaXJfdmFyaWFibGUgKmJpYXMgPSBpbl92YXIoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiYmlhcyIpOworICAgICAgc2lnLT5wYXJhbWV0ZXJzLnB1c2hfdGFpbChiaWFzKTsKKyAgICAgIHRleC0+bG9kX2luZm8uYmlhcyA9IHZhcl9yZWYoYmlhcyk7CisgICB9CisKKyAgIGJvZHkuZW1pdChyZXQodGV4KSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol90ZXh0dXJlQ3ViZUFycmF5U2hhZG93KCkKK3sKKyAgIGlyX3ZhcmlhYmxlICpzID0gaW5fdmFyKGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheVNoYWRvd190eXBlLCAic2FtcGxlciIpOworICAgaXJfdmFyaWFibGUgKlAgPSBpbl92YXIoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJQIik7CisgICBpcl92YXJpYWJsZSAqY29tcGFyZSA9IGluX3ZhcihnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJjb21wYXJlIik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIHRleHR1cmVfY3ViZV9tYXBfYXJyYXksIDMsIHMsIFAsIGNvbXBhcmUpOworCisgICBpcl90ZXh0dXJlICp0ZXggPSBuZXcobWVtX2N0eCkgaXJfdGV4dHVyZShpcl90ZXgpOworICAgdGV4LT5zZXRfc2FtcGxlcih2YXJfcmVmKHMpLCBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworCisgICB0ZXgtPmNvb3JkaW5hdGUgPSB2YXJfcmVmKFApOworICAgdGV4LT5zaGFkb3dfY29tcGFyaXRvciA9IHZhcl9yZWYoY29tcGFyZSk7CisKKyAgIGJvZHkuZW1pdChyZXQodGV4KSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol90ZXhlbEZldGNoKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpzYW1wbGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29vcmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpvZmZzZXRfdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICpzID0gaW5fdmFyKHNhbXBsZXJfdHlwZSwgInNhbXBsZXIiKTsKKyAgIGlyX3ZhcmlhYmxlICpQID0gaW5fdmFyKGNvb3JkX3R5cGUsICJQIik7CisgICAvKiBUaGUgc2FtcGxlciBhbmQgY29vcmRpbmF0ZSBhbHdheXMgZXhpc3Q7IGFkZCBvcHRpb25hbCBwYXJhbWV0ZXJzIGxhdGVyLiAqLworICAgTUFLRV9TSUcocmV0dXJuX3R5cGUsIGF2YWlsLCAyLCBzLCBQKTsKKworICAgaXJfdGV4dHVyZSAqdGV4ID0gbmV3KG1lbV9jdHgpIGlyX3RleHR1cmUoaXJfdHhmKTsKKyAgIHRleC0+Y29vcmRpbmF0ZSA9IHZhcl9yZWYoUCk7CisgICB0ZXgtPnNldF9zYW1wbGVyKHZhcl9yZWYocyksIHJldHVybl90eXBlKTsKKworICAgaWYgKHNhbXBsZXJfdHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSA9PSBHTFNMX1NBTVBMRVJfRElNX01TKSB7CisgICAgICBpcl92YXJpYWJsZSAqc2FtcGxlID0gaW5fdmFyKGdsc2xfdHlwZTo6aW50X3R5cGUsICJzYW1wbGUiKTsKKyAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwoc2FtcGxlKTsKKyAgICAgIHRleC0+bG9kX2luZm8uc2FtcGxlX2luZGV4ID0gdmFyX3JlZihzYW1wbGUpOworICAgICAgdGV4LT5vcCA9IGlyX3R4Zl9tczsKKyAgIH0gZWxzZSBpZiAoaGFzX2xvZChzYW1wbGVyX3R5cGUpKSB7CisgICAgICBpcl92YXJpYWJsZSAqbG9kID0gaW5fdmFyKGdsc2xfdHlwZTo6aW50X3R5cGUsICJsb2QiKTsKKyAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwobG9kKTsKKyAgICAgIHRleC0+bG9kX2luZm8ubG9kID0gdmFyX3JlZihsb2QpOworICAgfSBlbHNlIHsKKyAgICAgIHRleC0+bG9kX2luZm8ubG9kID0gaW1tKDB1KTsKKyAgIH0KKworICAgaWYgKG9mZnNldF90eXBlICE9IE5VTEwpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpvZmZzZXQgPQorICAgICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKG9mZnNldF90eXBlLCAib2Zmc2V0IiwgaXJfdmFyX2NvbnN0X2luKTsKKyAgICAgIHNpZy0+cGFyYW1ldGVycy5wdXNoX3RhaWwob2Zmc2V0KTsKKyAgICAgIHRleC0+b2Zmc2V0ID0gdmFyX3JlZihvZmZzZXQpOworICAgfQorCisgICBib2R5LmVtaXQocmV0KHRleCkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfRW1pdFZlcnRleCgpCit7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnZvaWRfdHlwZSwgZ3Nfb25seSwgMCk7CisKKyAgIGJvZHkuZW1pdChuZXcobWVtX2N0eCkgaXJfZW1pdF92ZXJ0ZXgoKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9FbmRQcmltaXRpdmUoKQoreworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjp2b2lkX3R5cGUsIGdzX29ubHksIDApOworCisgICBib2R5LmVtaXQobmV3KG1lbV9jdHgpIGlyX2VuZF9wcmltaXRpdmUoKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol90ZXh0dXJlUXVlcnlMb2QoY29uc3QgZ2xzbF90eXBlICpzYW1wbGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpjb29yZF90eXBlKQoreworICAgaXJfdmFyaWFibGUgKnMgPSBpbl92YXIoc2FtcGxlcl90eXBlLCAic2FtcGxlciIpOworICAgaXJfdmFyaWFibGUgKmNvb3JkID0gaW5fdmFyKGNvb3JkX3R5cGUsICJjb29yZCIpOworICAgLyogVGhlIHNhbXBsZXIgYW5kIGNvb3JkaW5hdGUgYWx3YXlzIGV4aXN0OyBhZGQgb3B0aW9uYWwgcGFyYW1ldGVycyBsYXRlci4gKi8KKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dmVjMl90eXBlLCB0ZXh0dXJlX3F1ZXJ5X2xvZCwgMiwgcywgY29vcmQpOworCisgICBpcl90ZXh0dXJlICp0ZXggPSBuZXcobWVtX2N0eCkgaXJfdGV4dHVyZShpcl9sb2QpOworICAgdGV4LT5jb29yZGluYXRlID0gdmFyX3JlZihjb29yZCk7CisgICB0ZXgtPnNldF9zYW1wbGVyKHZhcl9yZWYocyksIGdsc2xfdHlwZTo6dmVjMl90eXBlKTsKKworICAgYm9keS5lbWl0KHJldCh0ZXgpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X3RleHR1cmVRdWVyeUxldmVscyhjb25zdCBnbHNsX3R5cGUgKnNhbXBsZXJfdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICpzID0gaW5fdmFyKHNhbXBsZXJfdHlwZSwgInNhbXBsZXIiKTsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqcmV0dXJuX3R5cGUgPSBnbHNsX3R5cGU6OmludF90eXBlOworICAgTUFLRV9TSUcocmV0dXJuX3R5cGUsIHRleHR1cmVfcXVlcnlfbGV2ZWxzLCAxLCBzKTsKKworICAgaXJfdGV4dHVyZSAqdGV4ID0gbmV3KG1lbV9jdHgpIGlyX3RleHR1cmUoaXJfcXVlcnlfbGV2ZWxzKTsKKyAgIHRleC0+c2V0X3NhbXBsZXIodmFyX3JlZihzKSwgcmV0dXJuX3R5cGUpOworCisgICBib2R5LmVtaXQocmV0KHRleCkpOworCisgICByZXR1cm4gc2lnOworfQorCitVTk9QKGRGZHgsIGlyX3Vub3BfZEZkeCwgZnNfb2VzX2Rlcml2YXRpdmVzKQorVU5PUChkRmR5LCBpcl91bm9wX2RGZHksIGZzX29lc19kZXJpdmF0aXZlcykKKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2Z3aWR0aChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqcCA9IGluX3Zhcih0eXBlLCAicCIpOworICAgTUFLRV9TSUcodHlwZSwgZnNfb2VzX2Rlcml2YXRpdmVzLCAxLCBwKTsKKworICAgYm9keS5lbWl0KHJldChhZGQoYWJzKGV4cHIoaXJfdW5vcF9kRmR4LCBwKSksIGFicyhleHByKGlyX3Vub3BfZEZkeSwgcCkpKSkpOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfbm9pc2UxKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHJldHVybiB1bm9wKHYxMTAsIGlyX3Vub3Bfbm9pc2UsIGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgdHlwZSk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9ub2lzZTIoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnAgPSBpbl92YXIodHlwZSwgInAiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dmVjMl90eXBlLCB2MTEwLCAxLCBwKTsKKworICAgaXJfY29uc3RhbnRfZGF0YSBiX29mZnNldDsKKyAgIGJfb2Zmc2V0LmZbMF0gPSA2MDEuMGY7CisgICBiX29mZnNldC5mWzFdID0gMzEzLjBmOworICAgYl9vZmZzZXQuZlsyXSA9IDI5LjBmOworICAgYl9vZmZzZXQuZlszXSA9IDI3Ny4wZjsKKworICAgaXJfdmFyaWFibGUgKmEgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJhIik7CisgICBpcl92YXJpYWJsZSAqYiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImIiKTsKKyAgIGlyX3ZhcmlhYmxlICp0ID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsICAidCIpOworICAgYm9keS5lbWl0KGFzc2lnbihhLCBleHByKGlyX3Vub3Bfbm9pc2UsIHApKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGIsIGV4cHIoaXJfdW5vcF9ub2lzZSwgYWRkKHAsIGltbSh0eXBlLCBiX29mZnNldCkpKSkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBhLCBXUklURU1BU0tfWCkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBiLCBXUklURU1BU0tfWSkpOworICAgYm9keS5lbWl0KHJldCh0KSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9ub2lzZTMoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnAgPSBpbl92YXIodHlwZSwgInAiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dmVjM190eXBlLCB2MTEwLCAxLCBwKTsKKworICAgaXJfY29uc3RhbnRfZGF0YSBiX29mZnNldDsKKyAgIGJfb2Zmc2V0LmZbMF0gPSA2MDEuMGY7CisgICBiX29mZnNldC5mWzFdID0gMzEzLjBmOworICAgYl9vZmZzZXQuZlsyXSA9IDI5LjBmOworICAgYl9vZmZzZXQuZlszXSA9IDI3Ny4wZjsKKworICAgaXJfY29uc3RhbnRfZGF0YSBjX29mZnNldDsKKyAgIGNfb2Zmc2V0LmZbMF0gPSAxNTU5LjBmOworICAgY19vZmZzZXQuZlsxXSA9IDExMy4wZjsKKyAgIGNfb2Zmc2V0LmZbMl0gPSAxODYxLjBmOworICAgY19vZmZzZXQuZlszXSA9IDc5Ny4wZjsKKworICAgaXJfdmFyaWFibGUgKmEgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJhIik7CisgICBpcl92YXJpYWJsZSAqYiA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImIiKTsKKyAgIGlyX3ZhcmlhYmxlICpjID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiYyIpOworICAgaXJfdmFyaWFibGUgKnQgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnZlYzNfdHlwZSwgICJ0Iik7CisgICBib2R5LmVtaXQoYXNzaWduKGEsIGV4cHIoaXJfdW5vcF9ub2lzZSwgcCkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYiwgZXhwcihpcl91bm9wX25vaXNlLCBhZGQocCwgaW1tKHR5cGUsIGJfb2Zmc2V0KSkpKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGMsIGV4cHIoaXJfdW5vcF9ub2lzZSwgYWRkKHAsIGltbSh0eXBlLCBjX29mZnNldCkpKSkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBhLCBXUklURU1BU0tfWCkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBiLCBXUklURU1BU0tfWSkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBjLCBXUklURU1BU0tfWikpOworICAgYm9keS5lbWl0KHJldCh0KSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9ub2lzZTQoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnAgPSBpbl92YXIodHlwZSwgInAiKTsKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dmVjNF90eXBlLCB2MTEwLCAxLCBwKTsKKworICAgaXJfdmFyaWFibGUgKl9wID0gYm9keS5tYWtlX3RlbXAodHlwZSwgIl9wIik7CisKKyAgIGlyX2NvbnN0YW50X2RhdGEgcF9vZmZzZXQ7CisgICBwX29mZnNldC5mWzBdID0gMTU1OS4wZjsKKyAgIHBfb2Zmc2V0LmZbMV0gPSAxMTMuMGY7CisgICBwX29mZnNldC5mWzJdID0gMTg2MS4wZjsKKyAgIHBfb2Zmc2V0LmZbM10gPSA3OTcuMGY7CisKKyAgIGJvZHkuZW1pdChhc3NpZ24oX3AsIGFkZChwLCBpbW0odHlwZSwgcF9vZmZzZXQpKSkpOworCisgICBpcl9jb25zdGFudF9kYXRhIG9mZnNldDsKKyAgIG9mZnNldC5mWzBdID0gNjAxLjBmOworICAgb2Zmc2V0LmZbMV0gPSAzMTMuMGY7CisgICBvZmZzZXQuZlsyXSA9IDI5LjBmOworICAgb2Zmc2V0LmZbM10gPSAyNzcuMGY7CisKKyAgIGlyX3ZhcmlhYmxlICphID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiYSIpOworICAgaXJfdmFyaWFibGUgKmIgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJiIik7CisgICBpcl92YXJpYWJsZSAqYyA9IGJvZHkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImMiKTsKKyAgIGlyX3ZhcmlhYmxlICpkID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiZCIpOworICAgaXJfdmFyaWFibGUgKnQgPSBib2R5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnZlYzRfdHlwZSwgICJ0Iik7CisgICBib2R5LmVtaXQoYXNzaWduKGEsIGV4cHIoaXJfdW5vcF9ub2lzZSwgcCkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oYiwgZXhwcihpcl91bm9wX25vaXNlLCBhZGQocCwgaW1tKHR5cGUsIG9mZnNldCkpKSkpOworICAgYm9keS5lbWl0KGFzc2lnbihjLCBleHByKGlyX3Vub3Bfbm9pc2UsIF9wKSkpOworICAgYm9keS5lbWl0KGFzc2lnbihkLCBleHByKGlyX3Vub3Bfbm9pc2UsIGFkZChfcCwgaW1tKHR5cGUsIG9mZnNldCkpKSkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBhLCBXUklURU1BU0tfWCkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBiLCBXUklURU1BU0tfWSkpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBjLCBXUklURU1BU0tfWikpOworICAgYm9keS5lbWl0KGFzc2lnbih0LCBkLCBXUklURU1BU0tfVykpOworICAgYm9keS5lbWl0KHJldCh0KSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9iaXRmaWVsZEV4dHJhY3QoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnZhbHVlICA9IGluX3Zhcih0eXBlLCAidmFsdWUiKTsKKyAgIGlyX3ZhcmlhYmxlICpvZmZzZXQgPSBpbl92YXIoZ2xzbF90eXBlOjppbnRfdHlwZSwgIm9mZnNldCIpOworICAgaXJfdmFyaWFibGUgKmJpdHMgICA9IGluX3ZhcihnbHNsX3R5cGU6OmludF90eXBlLCAiYml0cyIpOworICAgTUFLRV9TSUcodHlwZSwgZ3B1X3NoYWRlcjUsIDMsIHZhbHVlLCBvZmZzZXQsIGJpdHMpOworCisgICBib2R5LmVtaXQocmV0KGV4cHIoaXJfdHJpb3BfYml0ZmllbGRfZXh0cmFjdCwgdmFsdWUsIG9mZnNldCwgYml0cykpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2JpdGZpZWxkSW5zZXJ0KGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICpiYXNlICAgPSBpbl92YXIodHlwZSwgImJhc2UiKTsKKyAgIGlyX3ZhcmlhYmxlICppbnNlcnQgPSBpbl92YXIodHlwZSwgImluc2VydCIpOworICAgaXJfdmFyaWFibGUgKm9mZnNldCA9IGluX3ZhcihnbHNsX3R5cGU6OmludF90eXBlLCAib2Zmc2V0Iik7CisgICBpcl92YXJpYWJsZSAqYml0cyAgID0gaW5fdmFyKGdsc2xfdHlwZTo6aW50X3R5cGUsICJiaXRzIik7CisgICBNQUtFX1NJRyh0eXBlLCBncHVfc2hhZGVyNSwgNCwgYmFzZSwgaW5zZXJ0LCBvZmZzZXQsIGJpdHMpOworCisgICBib2R5LmVtaXQocmV0KGJpdGZpZWxkX2luc2VydChiYXNlLCBpbnNlcnQsIG9mZnNldCwgYml0cykpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworVU5PUChiaXRmaWVsZFJldmVyc2UsIGlyX3Vub3BfYml0ZmllbGRfcmV2ZXJzZSwgZ3B1X3NoYWRlcjUpCisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9iaXRDb3VudChjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICByZXR1cm4gdW5vcChncHVfc2hhZGVyNSwgaXJfdW5vcF9iaXRfY291bnQsCisgICAgICAgICAgICAgICBnbHNsX3R5cGU6Oml2ZWModHlwZS0+dmVjdG9yX2VsZW1lbnRzKSwgdHlwZSk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9maW5kTFNCKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIHJldHVybiB1bm9wKGdwdV9zaGFkZXI1LCBpcl91bm9wX2ZpbmRfbHNiLAorICAgICAgICAgICAgICAgZ2xzbF90eXBlOjppdmVjKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyksIHR5cGUpOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfZmluZE1TQihjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICByZXR1cm4gdW5vcChncHVfc2hhZGVyNSwgaXJfdW5vcF9maW5kX21zYiwKKyAgICAgICAgICAgICAgIGdsc2xfdHlwZTo6aXZlYyh0eXBlLT52ZWN0b3JfZWxlbWVudHMpLCB0eXBlKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2ZtYShjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqYSA9IGluX3Zhcih0eXBlLCAiYSIpOworICAgaXJfdmFyaWFibGUgKmIgPSBpbl92YXIodHlwZSwgImIiKTsKKyAgIGlyX3ZhcmlhYmxlICpjID0gaW5fdmFyKHR5cGUsICJjIik7CisgICBNQUtFX1NJRyh0eXBlLCBncHVfc2hhZGVyNSwgMywgYSwgYiwgYyk7CisKKyAgIGJvZHkuZW1pdChyZXQoaXJfYnVpbGRlcjo6Zm1hKGEsIGIsIGMpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9sZGV4cChjb25zdCBnbHNsX3R5cGUgKnhfdHlwZSwgY29uc3QgZ2xzbF90eXBlICpleHBfdHlwZSkKK3sKKyAgIHJldHVybiBiaW5vcChpcl9iaW5vcF9sZGV4cCwgZ3B1X3NoYWRlcjUsIHhfdHlwZSwgeF90eXBlLCBleHBfdHlwZSk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9mcmV4cChjb25zdCBnbHNsX3R5cGUgKnhfdHlwZSwgY29uc3QgZ2xzbF90eXBlICpleHBfdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHhfdHlwZSwgIngiKTsKKyAgIGlyX3ZhcmlhYmxlICpleHBvbmVudCA9IG91dF92YXIoZXhwX3R5cGUsICJleHAiKTsKKyAgIE1BS0VfU0lHKHhfdHlwZSwgZ3B1X3NoYWRlcjUsIDIsIHgsIGV4cG9uZW50KTsKKworICAgY29uc3QgdW5zaWduZWQgdmVjX2VsZW0gPSB4X3R5cGUtPnZlY3Rvcl9lbGVtZW50czsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqYnZlYyA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9CT09MLCB2ZWNfZWxlbSwgMSk7CisgICBjb25zdCBnbHNsX3R5cGUgKnV2ZWMgPSBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfVUlOVCwgdmVjX2VsZW0sIDEpOworCisgICAvKiBTaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBhcmUgc3RvcmVkIGFzCisgICAgKiAgIDEgc2lnbiBiaXQ7CisgICAgKiAgIDggZXhwb25lbnQgYml0czsKKyAgICAqICAgMjMgbWFudGlzc2EgYml0cy4KKyAgICAqCisgICAgKiBBbiBleHBvbmVudCBzaGlmdCBvZiAyMyB3aWxsIHNoaWZ0IHRoZSBtYW50aXNzYSBvdXQsIGxlYXZpbmcgb25seSB0aGUKKyAgICAqIGV4cG9uZW50IGFuZCBzaWduIGJpdCAod2hpY2ggaXRzZWxmIG1heSBiZSB6ZXJvLCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUKKyAgICAqIHdhcyB0YWtlbiBiZWZvcmUgdGhlIGJpdGNhc3QgYW5kIHNoaWZ0LgorICAgICovCisgICBpcl9jb25zdGFudCAqZXhwb25lbnRfc2hpZnQgPSBpbW0oMjMpOworICAgaXJfY29uc3RhbnQgKmV4cG9uZW50X2JpYXMgPSBpbW0oLTEyNiwgdmVjX2VsZW0pOworCisgICBpcl9jb25zdGFudCAqc2lnbl9tYW50aXNzYV9tYXNrID0gaW1tKDB4ODA3ZmZmZmZ1LCB2ZWNfZWxlbSk7CisKKyAgIC8qIEV4cG9uZW50IG9mIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzAuNSwgMS4wKS4gKi8KKyAgIGlyX2NvbnN0YW50ICpleHBvbmVudF92YWx1ZSA9IGltbSgweDNmMDAwMDAwdSwgdmVjX2VsZW0pOworCisgICBpcl92YXJpYWJsZSAqaXNfbm90X3plcm8gPSBib2R5Lm1ha2VfdGVtcChidmVjLCAiaXNfbm90X3plcm8iKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24oaXNfbm90X3plcm8sIG5lcXVhbChhYnMoeCksIGltbSgwLjBmLCB2ZWNfZWxlbSkpKSk7CisKKyAgIC8qIFNpbmNlIGFicyh4KSBlbnN1cmVzIHRoYXQgdGhlIHNpZ24gYml0IGlzIHplcm8sIHdlIGRvbid0IG5lZWQgdG8gYml0Y2FzdAorICAgICogdG8gdW5zaWduZWQgaW50ZWdlcnMgdG8gZW5zdXJlIHRoYXQgMSBiaXRzIGFyZW4ndCBzaGlmdGVkIGluLgorICAgICovCisgICBib2R5LmVtaXQoYXNzaWduKGV4cG9uZW50LCByc2hpZnQoYml0Y2FzdF9mMmkoYWJzKHgpKSwgZXhwb25lbnRfc2hpZnQpKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGV4cG9uZW50LCBhZGQoZXhwb25lbnQsIGNzZWwoaXNfbm90X3plcm8sIGV4cG9uZW50X2JpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbSgwLCB2ZWNfZWxlbSkpKSkpOworCisgICBpcl92YXJpYWJsZSAqYml0cyA9IGJvZHkubWFrZV90ZW1wKHV2ZWMsICJiaXRzIik7CisgICBib2R5LmVtaXQoYXNzaWduKGJpdHMsIGJpdGNhc3RfZjJ1KHgpKSk7CisgICBib2R5LmVtaXQoYXNzaWduKGJpdHMsIGJpdF9hbmQoYml0cywgc2lnbl9tYW50aXNzYV9tYXNrKSkpOworICAgYm9keS5lbWl0KGFzc2lnbihiaXRzLCBiaXRfb3IoYml0cywgY3NlbChpc19ub3RfemVybywgZXhwb25lbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW0oMHUsIHZlY19lbGVtKSkpKSk7CisgICBib2R5LmVtaXQocmV0KGJpdGNhc3RfdTJmKGJpdHMpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol91YWRkQ2FycnkoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIGlyX3ZhcmlhYmxlICp5ID0gaW5fdmFyKHR5cGUsICJ5Iik7CisgICBpcl92YXJpYWJsZSAqY2FycnkgPSBvdXRfdmFyKHR5cGUsICJjYXJyeSIpOworICAgTUFLRV9TSUcodHlwZSwgZ3B1X3NoYWRlcjUsIDMsIHgsIHksIGNhcnJ5KTsKKworICAgYm9keS5lbWl0KGFzc2lnbihjYXJyeSwgaXJfYnVpbGRlcjo6Y2FycnkoeCwgeSkpKTsKKyAgIGJvZHkuZW1pdChyZXQoYWRkKHgsIHkpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol91c3ViQm9ycm93KGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHR5cGUsICJ4Iik7CisgICBpcl92YXJpYWJsZSAqeSA9IGluX3Zhcih0eXBlLCAieSIpOworICAgaXJfdmFyaWFibGUgKmJvcnJvdyA9IG91dF92YXIodHlwZSwgImJvcnJvdyIpOworICAgTUFLRV9TSUcodHlwZSwgZ3B1X3NoYWRlcjUsIDMsIHgsIHksIGJvcnJvdyk7CisKKyAgIGJvZHkuZW1pdChhc3NpZ24oYm9ycm93LCBpcl9idWlsZGVyOjpib3Jyb3coeCwgeSkpKTsKKyAgIGJvZHkuZW1pdChyZXQoc3ViKHgsIHkpKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKKy8qKgorICogRm9yIGJvdGggaW11bEV4dGVuZGVkKCkgYW5kIHVtdWxFeHRlbmRlZCgpIGJ1aWx0LWlucy4KKyAqLworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X211bEV4dGVuZGVkKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHR5cGUsICJ4Iik7CisgICBpcl92YXJpYWJsZSAqeSA9IGluX3Zhcih0eXBlLCAieSIpOworICAgaXJfdmFyaWFibGUgKm1zYiA9IG91dF92YXIodHlwZSwgIm1zYiIpOworICAgaXJfdmFyaWFibGUgKmxzYiA9IG91dF92YXIodHlwZSwgImxzYiIpOworICAgTUFLRV9TSUcoZ2xzbF90eXBlOjp2b2lkX3R5cGUsIGdwdV9zaGFkZXI1LCA0LCB4LCB5LCBtc2IsIGxzYik7CisKKyAgIGJvZHkuZW1pdChhc3NpZ24obXNiLCBpbXVsX2hpZ2goeCwgeSkpKTsKKyAgIGJvZHkuZW1pdChhc3NpZ24obHNiLCBtdWwoeCwgeSkpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2F0b21pY19pbnRyaW5zaWMoYnVpbHRpbl9hdmFpbGFibGVfcHJlZGljYXRlIGF2YWlsKQoreworICAgaXJfdmFyaWFibGUgKmNvdW50ZXIgPSBpbl92YXIoZ2xzbF90eXBlOjphdG9taWNfdWludF90eXBlLCAiY291bnRlciIpOworICAgTUFLRV9JTlRSSU5TSUMoZ2xzbF90eXBlOjp1aW50X3R5cGUsIGF2YWlsLCAxLCBjb3VudGVyKTsKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9hdG9taWNfb3AoY29uc3QgY2hhciAqaW50cmluc2ljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCkKK3sKKyAgIGlyX3ZhcmlhYmxlICpjb3VudGVyID0gaW5fdmFyKGdsc2xfdHlwZTo6YXRvbWljX3VpbnRfdHlwZSwgImF0b21pY19jb3VudGVyIik7CisgICBNQUtFX1NJRyhnbHNsX3R5cGU6OnVpbnRfdHlwZSwgYXZhaWwsIDEsIGNvdW50ZXIpOworCisgICBpcl92YXJpYWJsZSAqcmV0dmFsID0gYm9keS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp1aW50X3R5cGUsICJhdG9taWNfcmV0dmFsIik7CisgICBib2R5LmVtaXQoY2FsbChzaGFkZXItPnN5bWJvbHMtPmdldF9mdW5jdGlvbihpbnRyaW5zaWMpLCByZXR2YWwsCisgICAgICAgICAgICAgICAgICBzaWctPnBhcmFtZXRlcnMpKTsKKyAgIGJvZHkuZW1pdChyZXQocmV0dmFsKSk7CisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfbWluMyhjb25zdCBnbHNsX3R5cGUgKnR5cGUpCit7CisgICBpcl92YXJpYWJsZSAqeCA9IGluX3Zhcih0eXBlLCAieCIpOworICAgaXJfdmFyaWFibGUgKnkgPSBpbl92YXIodHlwZSwgInkiKTsKKyAgIGlyX3ZhcmlhYmxlICp6ID0gaW5fdmFyKHR5cGUsICJ6Iik7CisgICBNQUtFX1NJRyh0eXBlLCBzaGFkZXJfdHJpbmFyeV9taW5tYXgsIDMsIHgsIHksIHopOworCisgICBpcl9leHByZXNzaW9uICptaW4zID0gbWluMih4LCBtaW4yKHkseikpOworICAgYm9keS5lbWl0KHJldChtaW4zKSk7CisKKyAgIHJldHVybiBzaWc7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitidWlsdGluX2J1aWxkZXI6Ol9tYXgzKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp4ID0gaW5fdmFyKHR5cGUsICJ4Iik7CisgICBpcl92YXJpYWJsZSAqeSA9IGluX3Zhcih0eXBlLCAieSIpOworICAgaXJfdmFyaWFibGUgKnogPSBpbl92YXIodHlwZSwgInoiKTsKKyAgIE1BS0VfU0lHKHR5cGUsIHNoYWRlcl90cmluYXJ5X21pbm1heCwgMywgeCwgeSwgeik7CisKKyAgIGlyX2V4cHJlc3Npb24gKm1heDMgPSBtYXgyKHgsIG1heDIoeSx6KSk7CisgICBib2R5LmVtaXQocmV0KG1heDMpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X21pZDMoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaXJfdmFyaWFibGUgKnggPSBpbl92YXIodHlwZSwgIngiKTsKKyAgIGlyX3ZhcmlhYmxlICp5ID0gaW5fdmFyKHR5cGUsICJ5Iik7CisgICBpcl92YXJpYWJsZSAqeiA9IGluX3Zhcih0eXBlLCAieiIpOworICAgTUFLRV9TSUcodHlwZSwgc2hhZGVyX3RyaW5hcnlfbWlubWF4LCAzLCB4LCB5LCB6KTsKKworICAgaXJfZXhwcmVzc2lvbiAqbWlkMyA9IG1heDIobWluMih4LCB5KSwgbWF4MihtaW4yKHgsIHopLCBtaW4yKHksIHopKSk7CisgICBib2R5LmVtaXQocmV0KG1pZDMpKTsKKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X2ltYWdlX3Byb3RvdHlwZShjb25zdCBnbHNsX3R5cGUgKmltYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW50cmluc2ljX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX2FyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqZGF0YV90eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoCisgICAgICBpbWFnZV90eXBlLT5zYW1wbGVyX3R5cGUsCisgICAgICAoZmxhZ3MgJiBJTUFHRV9GVU5DVElPTl9IQVNfVkVDVE9SX0RBVEFfVFlQRSA/IDQgOiAxKSwKKyAgICAgIDEpOworICAgY29uc3QgZ2xzbF90eXBlICpyZXRfdHlwZSA9IChmbGFncyAmIElNQUdFX0ZVTkNUSU9OX1JFVFVSTlNfVk9JRCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsc2xfdHlwZTo6dm9pZF90eXBlIDogZGF0YV90eXBlKTsKKworICAgLyogQWRkcmVzc2luZyBhcmd1bWVudHMgdGhhdCBhcmUgYWx3YXlzIHByZXNlbnQuICovCisgICBpcl92YXJpYWJsZSAqaW1hZ2UgPSBpbl92YXIoaW1hZ2VfdHlwZSwgImltYWdlIik7CisgICBpcl92YXJpYWJsZSAqY29vcmQgPSBpbl92YXIoCisgICAgICBnbHNsX3R5cGU6Oml2ZWMoaW1hZ2VfdHlwZS0+Y29vcmRpbmF0ZV9jb21wb25lbnRzKCkpLCAiY29vcmQiKTsKKworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPSBuZXdfc2lnKAorICAgICAgcmV0X3R5cGUsIHNoYWRlcl9pbWFnZV9sb2FkX3N0b3JlLCAyLCBpbWFnZSwgY29vcmQpOworCisgICAvKiBTYW1wbGUgaW5kZXggZm9yIG11bHRpc2FtcGxlIGltYWdlcy4gKi8KKyAgIGlmIChpbWFnZV90eXBlLT5zYW1wbGVyX2RpbWVuc2lvbmFsaXR5ID09IEdMU0xfU0FNUExFUl9ESU1fTVMpCisgICAgICBzaWctPnBhcmFtZXRlcnMucHVzaF90YWlsKGluX3ZhcihnbHNsX3R5cGU6OmludF90eXBlLCAic2FtcGxlIikpOworCisgICAvKiBEYXRhIGFyZ3VtZW50cy4gKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fYXJndW1lbnRzOyArK2kpCisgICAgICBzaWctPnBhcmFtZXRlcnMucHVzaF90YWlsKGluX3ZhcihkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWxsb2NfYXNwcmludGYoTlVMTCwgImFyZyVkIiwgaSkpKTsKKworICAgLyogU2V0IHRoZSBtYXhpbWFsIHNldCBvZiBxdWFsaWZpZXJzIGFsbG93ZWQgZm9yIHRoaXMgaW1hZ2UKKyAgICAqIGJ1aWx0LWluLiAgRnVuY3Rpb24gY2FsbHMgd2l0aCBhcmd1bWVudHMgaGF2aW5nIGZld2VyCisgICAgKiBxdWFsaWZpZXJzIHRoYW4gcHJlc2VudCBpbiB0aGUgcHJvdG90eXBlIGFyZSBhbGxvd2VkIGJ5IHRoZQorICAgICogc3BlYywgYnV0IG5vdCB3aXRoIG1vcmUsIGkuZS4gdGhpcyB3aWxsIG1ha2UgdGhlIGNvbXBpbGVyCisgICAgKiBhY2NlcHQgZXZlcnl0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGFjY2VwdGVkLCBhbmQgcmVqZWN0IGNhc2VzCisgICAgKiBsaWtlIGxvYWRzIGZyb20gd3JpdGUtb25seSBvciBzdG9yZXMgdG8gcmVhZC1vbmx5IGltYWdlcy4KKyAgICAqLworICAgaW1hZ2UtPmRhdGEuaW1hZ2UucmVhZF9vbmx5ID0gZmxhZ3MgJiBJTUFHRV9GVU5DVElPTl9SRUFEX09OTFk7CisgICBpbWFnZS0+ZGF0YS5pbWFnZS53cml0ZV9vbmx5ID0gZmxhZ3MgJiBJTUFHRV9GVU5DVElPTl9XUklURV9PTkxZOworICAgaW1hZ2UtPmRhdGEuaW1hZ2UuY29oZXJlbnQgPSB0cnVlOworICAgaW1hZ2UtPmRhdGEuaW1hZ2UuX3ZvbGF0aWxlID0gdHJ1ZTsKKyAgIGltYWdlLT5kYXRhLmltYWdlLnJlc3RyaWN0X2ZsYWcgPSB0cnVlOworCisgICByZXR1cm4gc2lnOworfQorCitpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorYnVpbHRpbl9idWlsZGVyOjpfaW1hZ2UoY29uc3QgZ2xzbF90eXBlICppbWFnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW50cmluc2ljX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MpCit7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9IF9pbWFnZV9wcm90b3R5cGUoaW1hZ2VfdHlwZSwgaW50cmluc2ljX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2FyZ3VtZW50cywgZmxhZ3MpOworCisgICBpZiAoZmxhZ3MgJiBJTUFHRV9GVU5DVElPTl9FTUlUX1NUVUIpIHsKKyAgICAgIGlyX2ZhY3RvcnkgYm9keSgmc2lnLT5ib2R5LCBtZW1fY3R4KTsKKyAgICAgIGlyX2Z1bmN0aW9uICpmID0gc2hhZGVyLT5zeW1ib2xzLT5nZXRfZnVuY3Rpb24oaW50cmluc2ljX25hbWUpOworCisgICAgICBpZiAoZmxhZ3MgJiBJTUFHRV9GVU5DVElPTl9SRVRVUk5TX1ZPSUQpIHsKKyAgICAgICAgIGJvZHkuZW1pdChjYWxsKGYsIE5VTEwsIHNpZy0+cGFyYW1ldGVycykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlyX3ZhcmlhYmxlICpyZXRfdmFsID0KKyAgICAgICAgICAgIGJvZHkubWFrZV90ZW1wKHNpZy0+cmV0dXJuX3R5cGUsICJfcmV0X3ZhbCIpOworICAgICAgICAgYm9keS5lbWl0KGNhbGwoZiwgcmV0X3ZhbCwgc2lnLT5wYXJhbWV0ZXJzKSk7CisgICAgICAgICBib2R5LmVtaXQocmV0KHJldF92YWwpKTsKKyAgICAgIH0KKworICAgICAgc2lnLT5pc19kZWZpbmVkID0gdHJ1ZTsKKworICAgfSBlbHNlIHsKKyAgICAgIHNpZy0+aXNfaW50cmluc2ljID0gdHJ1ZTsKKyAgIH0KKworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X21lbW9yeV9iYXJyaWVyX2ludHJpbnNpYyhidWlsdGluX2F2YWlsYWJsZV9wcmVkaWNhdGUgYXZhaWwpCit7CisgICBNQUtFX0lOVFJJTlNJQyhnbHNsX3R5cGU6OnZvaWRfdHlwZSwgYXZhaWwsIDApOworICAgcmV0dXJuIHNpZzsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2J1aWx0aW5fYnVpbGRlcjo6X21lbW9yeV9iYXJyaWVyKGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBhdmFpbCkKK3sKKyAgIE1BS0VfU0lHKGdsc2xfdHlwZTo6dm9pZF90eXBlLCBhdmFpbCwgMCk7CisgICBib2R5LmVtaXQoY2FsbChzaGFkZXItPnN5bWJvbHMtPmdldF9mdW5jdGlvbigiX19pbnRyaW5zaWNfbWVtb3J5X2JhcnJpZXIiKSwKKyAgICAgICAgICAgICAgICAgIE5VTEwsIHNpZy0+cGFyYW1ldGVycykpOworICAgcmV0dXJuIHNpZzsKK30KKworLyoqIEB9ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgYnVpbHRpbl9idWlsZGVyLiAqLworc3RhdGljIGJ1aWx0aW5fYnVpbGRlciBidWlsdGluczsKK3N0YXRpYyBtdHhfdCBidWlsdGluc19sb2NrID0gX01UWF9JTklUSUFMSVpFUl9OUDsKKworLyoqCisgKiBFeHRlcm5hbCBBUEkgKGV4cG9zaW5nIHRoZSBidWlsdC1pbiBtb2R1bGUgdG8gdGhlIHJlc3Qgb2YgdGhlIGNvbXBpbGVyKToKKyAqICBAeworICovCit2b2lkCitfbWVzYV9nbHNsX2luaXRpYWxpemVfYnVpbHRpbl9mdW5jdGlvbnMoKQoreworICAgbXR4X2xvY2soJmJ1aWx0aW5zX2xvY2spOworICAgYnVpbHRpbnMuaW5pdGlhbGl6ZSgpOworICAgbXR4X3VubG9jaygmYnVpbHRpbnNfbG9jayk7Cit9CisKK3ZvaWQKK19tZXNhX2dsc2xfcmVsZWFzZV9idWlsdGluX2Z1bmN0aW9ucygpCit7CisgICBtdHhfbG9jaygmYnVpbHRpbnNfbG9jayk7CisgICBidWlsdGlucy5yZWxlYXNlKCk7CisgICBtdHhfdW5sb2NrKCZidWlsdGluc19sb2NrKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK19tZXNhX2dsc2xfZmluZF9idWlsdGluX2Z1bmN0aW9uKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgZXhlY19saXN0ICphY3R1YWxfcGFyYW1ldGVycykKK3sKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqIHM7CisgICBtdHhfbG9jaygmYnVpbHRpbnNfbG9jayk7CisgICBzID0gYnVpbHRpbnMuZmluZChzdGF0ZSwgbmFtZSwgYWN0dWFsX3BhcmFtZXRlcnMpOworICAgbXR4X3VubG9jaygmYnVpbHRpbnNfbG9jayk7CisgICByZXR1cm4gczsKK30KKworZ2xfc2hhZGVyICoKK19tZXNhX2dsc2xfZ2V0X2J1aWx0aW5fZnVuY3Rpb25fc2hhZGVyKCkKK3sKKyAgIHJldHVybiBidWlsdGlucy5zaGFkZXI7Cit9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9idWlsdGluX3R5cGVfbWFjcm9zLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2J1aWx0aW5fdHlwZV9tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZlMWNlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9idWlsdGluX3R5cGVfbWFjcm9zLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGJ1aWx0aW5fdHlwZV9tYWNyb3MuaAorICoKKyAqIFRoaXMgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIGFsbCBHTFNMIGJ1aWx0LWluIHR5cGVzLCByZWdhcmRsZXNzIG9mIHdoYXQKKyAqIGxhbmd1YWdlIHZlcnNpb24gb3IgZXh0ZW5zaW9uIG1pZ2h0IHByb3ZpZGUgdGhlbS4KKyAqLworCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCitERUNMX1RZUEUoZXJyb3IsICBHTF9JTlZBTElEX0VOVU0sIEdMU0xfVFlQRV9FUlJPUiwgMCwgMCkKK0RFQ0xfVFlQRSh2b2lkLCAgIEdMX0lOVkFMSURfRU5VTSwgR0xTTF9UWVBFX1ZPSUQsICAwLCAwKQorCitERUNMX1RZUEUoYm9vbCwgICBHTF9CT09MLCAgICAgICAgIEdMU0xfVFlQRV9CT09MLCAgMSwgMSkKK0RFQ0xfVFlQRShidmVjMiwgIEdMX0JPT0xfVkVDMiwgICAgR0xTTF9UWVBFX0JPT0wsICAyLCAxKQorREVDTF9UWVBFKGJ2ZWMzLCAgR0xfQk9PTF9WRUMzLCAgICBHTFNMX1RZUEVfQk9PTCwgIDMsIDEpCitERUNMX1RZUEUoYnZlYzQsICBHTF9CT09MX1ZFQzQsICAgIEdMU0xfVFlQRV9CT09MLCAgNCwgMSkKKworREVDTF9UWVBFKGludCwgICAgR0xfSU5ULCAgICAgICAgICBHTFNMX1RZUEVfSU5ULCAgIDEsIDEpCitERUNMX1RZUEUoaXZlYzIsICBHTF9JTlRfVkVDMiwgICAgIEdMU0xfVFlQRV9JTlQsICAgMiwgMSkKK0RFQ0xfVFlQRShpdmVjMywgIEdMX0lOVF9WRUMzLCAgICAgR0xTTF9UWVBFX0lOVCwgICAzLCAxKQorREVDTF9UWVBFKGl2ZWM0LCAgR0xfSU5UX1ZFQzQsICAgICBHTFNMX1RZUEVfSU5ULCAgIDQsIDEpCisKK0RFQ0xfVFlQRSh1aW50LCAgIEdMX1VOU0lHTkVEX0lOVCwgICAgICBHTFNMX1RZUEVfVUlOVCwgMSwgMSkKK0RFQ0xfVFlQRSh1dmVjMiwgIEdMX1VOU0lHTkVEX0lOVF9WRUMyLCBHTFNMX1RZUEVfVUlOVCwgMiwgMSkKK0RFQ0xfVFlQRSh1dmVjMywgIEdMX1VOU0lHTkVEX0lOVF9WRUMzLCBHTFNMX1RZUEVfVUlOVCwgMywgMSkKK0RFQ0xfVFlQRSh1dmVjNCwgIEdMX1VOU0lHTkVEX0lOVF9WRUM0LCBHTFNMX1RZUEVfVUlOVCwgNCwgMSkKKworREVDTF9UWVBFKGZsb2F0LCAgR0xfRkxPQVQsICAgICAgICBHTFNMX1RZUEVfRkxPQVQsIDEsIDEpCitERUNMX1RZUEUodmVjMiwgICBHTF9GTE9BVF9WRUMyLCAgIEdMU0xfVFlQRV9GTE9BVCwgMiwgMSkKK0RFQ0xfVFlQRSh2ZWMzLCAgIEdMX0ZMT0FUX1ZFQzMsICAgR0xTTF9UWVBFX0ZMT0FULCAzLCAxKQorREVDTF9UWVBFKHZlYzQsICAgR0xfRkxPQVRfVkVDNCwgICBHTFNMX1RZUEVfRkxPQVQsIDQsIDEpCisKK0RFQ0xfVFlQRShtYXQyLCAgIEdMX0ZMT0FUX01BVDIsICAgR0xTTF9UWVBFX0ZMT0FULCAyLCAyKQorREVDTF9UWVBFKG1hdDMsICAgR0xfRkxPQVRfTUFUMywgICBHTFNMX1RZUEVfRkxPQVQsIDMsIDMpCitERUNMX1RZUEUobWF0NCwgICBHTF9GTE9BVF9NQVQ0LCAgIEdMU0xfVFlQRV9GTE9BVCwgNCwgNCkKKworREVDTF9UWVBFKG1hdDJ4MywgR0xfRkxPQVRfTUFUMngzLCBHTFNMX1RZUEVfRkxPQVQsIDMsIDIpCitERUNMX1RZUEUobWF0Mng0LCBHTF9GTE9BVF9NQVQyeDQsIEdMU0xfVFlQRV9GTE9BVCwgNCwgMikKK0RFQ0xfVFlQRShtYXQzeDIsIEdMX0ZMT0FUX01BVDN4MiwgR0xTTF9UWVBFX0ZMT0FULCAyLCAzKQorREVDTF9UWVBFKG1hdDN4NCwgR0xfRkxPQVRfTUFUM3g0LCBHTFNMX1RZUEVfRkxPQVQsIDQsIDMpCitERUNMX1RZUEUobWF0NHgyLCBHTF9GTE9BVF9NQVQ0eDIsIEdMU0xfVFlQRV9GTE9BVCwgMiwgNCkKK0RFQ0xfVFlQRShtYXQ0eDMsIEdMX0ZMT0FUX01BVDR4MywgR0xTTF9UWVBFX0ZMT0FULCAzLCA0KQorCitERUNMX1RZUEUoc2FtcGxlcjFELCAgICAgICAgIEdMX1NBTVBMRVJfMUQsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMkQsICAgICAgICAgR0xfU0FNUExFUl8yRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXIzRCwgICAgICAgICBHTF9TQU1QTEVSXzNELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8zRCwgICAwLCAwLCBHTFNMX1RZUEVfRkxPQVQpCitERUNMX1RZUEUoc2FtcGxlckN1YmUsICAgICAgIEdMX1NBTVBMRVJfQ1VCRSwgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMURBcnJheSwgICAgR0xfU0FNUExFUl8xRF9BUlJBWSwgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgMCwgMSwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXIyREFycmF5LCAgICBHTF9TQU1QTEVSXzJEX0FSUkFZLCAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAwLCAxLCBHTFNMX1RZUEVfRkxPQVQpCitERUNMX1RZUEUoc2FtcGxlckN1YmVBcnJheSwgIEdMX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVksICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIDAsIDEsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMkRSZWN0LCAgICAgR0xfU0FNUExFUl8yRF9SRUNULCAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXJCdWZmZXIsICAgICBHTF9TQU1QTEVSX0JVRkZFUiwgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9CVUYsICAwLCAwLCBHTFNMX1RZUEVfRkxPQVQpCitERUNMX1RZUEUoc2FtcGxlcjJETVMsICAgICAgIEdMX1NBTVBMRVJfMkRfTVVMVElTQU1QTEUsICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgIDAsIDAsIEdMU0xfVFlQRV9GTE9BVCkKK0RFQ0xfVFlQRShzYW1wbGVyMkRNU0FycmF5LCAgR0xfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWSwgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgMCwgMSwgR0xTTF9UWVBFX0ZMT0FUKQorCitERUNMX1RZUEUoaXNhbXBsZXIxRCwgICAgICAgIEdMX0lOVF9TQU1QTEVSXzFELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAwLCAwLCBHTFNMX1RZUEVfSU5UKQorREVDTF9UWVBFKGlzYW1wbGVyMkQsICAgICAgICBHTF9JTlRfU0FNUExFUl8yRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgMCwgMCwgR0xTTF9UWVBFX0lOVCkKK0RFQ0xfVFlQRShpc2FtcGxlcjNELCAgICAgICAgR0xfSU5UX1NBTVBMRVJfM0QsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzNELCAgIDAsIDAsIEdMU0xfVFlQRV9JTlQpCitERUNMX1RZUEUoaXNhbXBsZXJDdWJlLCAgICAgIEdMX0lOVF9TQU1QTEVSX0NVQkUsICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAwLCAwLCBHTFNMX1RZUEVfSU5UKQorREVDTF9UWVBFKGlzYW1wbGVyMURBcnJheSwgICBHTF9JTlRfU0FNUExFUl8xRF9BUlJBWSwgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgMCwgMSwgR0xTTF9UWVBFX0lOVCkKK0RFQ0xfVFlQRShpc2FtcGxlcjJEQXJyYXksICAgR0xfSU5UX1NBTVBMRVJfMkRfQVJSQVksICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzJELCAgIDAsIDEsIEdMU0xfVFlQRV9JTlQpCitERUNMX1RZUEUoaXNhbXBsZXJDdWJlQXJyYXksIEdMX0lOVF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZLCAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAwLCAxLCBHTFNMX1RZUEVfSU5UKQorREVDTF9UWVBFKGlzYW1wbGVyMkRSZWN0LCAgICBHTF9JTlRfU0FNUExFUl8yRF9SRUNULCAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwgMCwgMCwgR0xTTF9UWVBFX0lOVCkKK0RFQ0xfVFlQRShpc2FtcGxlckJ1ZmZlciwgICAgR0xfSU5UX1NBTVBMRVJfQlVGRkVSLCAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX0JVRiwgIDAsIDAsIEdMU0xfVFlQRV9JTlQpCitERUNMX1RZUEUoaXNhbXBsZXIyRE1TLCAgICAgIEdMX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFLCAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAwLCAwLCBHTFNMX1RZUEVfSU5UKQorREVDTF9UWVBFKGlzYW1wbGVyMkRNU0FycmF5LCBHTF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWSwgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgMCwgMSwgR0xTTF9UWVBFX0lOVCkKKworREVDTF9UWVBFKHVzYW1wbGVyMUQsICAgICAgICBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8xRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpCitERUNMX1RZUEUodXNhbXBsZXIyRCwgICAgICAgIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAwLCAwLCBHTFNMX1RZUEVfVUlOVCkKK0RFQ0xfVFlQRSh1c2FtcGxlcjNELCAgICAgICAgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfM0QsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzNELCAgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKQorREVDTF9UWVBFKHVzYW1wbGVyQ3ViZSwgICAgICBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFLCAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgMCwgMCwgR0xTTF9UWVBFX1VJTlQpCitERUNMX1RZUEUodXNhbXBsZXIxREFycmF5LCAgIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzFEX0FSUkFZLCAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAwLCAxLCBHTFNMX1RZUEVfVUlOVCkKK0RFQ0xfVFlQRSh1c2FtcGxlcjJEQXJyYXksICAgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVksICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNXzJELCAgIDAsIDEsIEdMU0xfVFlQRV9VSU5UKQorREVDTF9UWVBFKHVzYW1wbGVyQ3ViZUFycmF5LCBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFX01BUF9BUlJBWSwgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgMCwgMSwgR0xTTF9UWVBFX1VJTlQpCitERUNMX1RZUEUodXNhbXBsZXIyRFJlY3QsICAgIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX1JFQ1QsICAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9SRUNULCAwLCAwLCBHTFNMX1RZUEVfVUlOVCkKK0RFQ0xfVFlQRSh1c2FtcGxlckJ1ZmZlciwgICAgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQlVGRkVSLCAgICAgICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX0JVRiwgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKQorREVDTF9UWVBFKHVzYW1wbGVyMkRNUywgICAgICBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSwgICAgICAgR0xTTF9UWVBFX1NBTVBMRVIsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpCitERUNMX1RZUEUodXNhbXBsZXIyRE1TQXJyYXksIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZLCBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAwLCAxLCBHTFNMX1RZUEVfVUlOVCkKKworREVDTF9UWVBFKHNhbXBsZXIxRFNoYWRvdywgICAgICAgIEdMX1NBTVBMRVJfMURfU0hBRE9XLCAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAgICAgMSwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXIyRFNoYWRvdywgICAgICAgIEdMX1NBTVBMRVJfMkRfU0hBRE9XLCAgICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgICAgMSwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXJDdWJlU2hhZG93LCAgICAgIEdMX1NBTVBMRVJfQ1VCRV9TSEFET1csICAgICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAgICAgMSwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXIxREFycmF5U2hhZG93LCAgIEdMX1NBTVBMRVJfMURfQVJSQVlfU0hBRE9XLCAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICAgICAgMSwgMSwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXIyREFycmF5U2hhZG93LCAgIEdMX1NBTVBMRVJfMkRfQVJSQVlfU0hBRE9XLCAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgICAgMSwgMSwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXJDdWJlQXJyYXlTaGFkb3csIEdMX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfU0hBRE9XLCBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAgICAgMSwgMSwgR0xTTF9UWVBFX0ZMT0FUKQorREVDTF9UWVBFKHNhbXBsZXIyRFJlY3RTaGFkb3csICAgIEdMX1NBTVBMRVJfMkRfUkVDVF9TSEFET1csICAgICAgICBHTFNMX1RZUEVfU0FNUExFUiwgR0xTTF9TQU1QTEVSX0RJTV9SRUNULCAgICAgMSwgMCwgR0xTTF9UWVBFX0ZMT0FUKQorCitERUNMX1RZUEUoc2FtcGxlckV4dGVybmFsT0VTLCAgICAgR0xfU0FNUExFUl9FWFRFUk5BTF9PRVMsICAgICAgICAgIEdMU0xfVFlQRV9TQU1QTEVSLCBHTFNMX1NBTVBMRVJfRElNX0VYVEVSTkFMLCAwLCAwLCBHTFNMX1RZUEVfRkxPQVQpCisKK0RFQ0xfVFlQRShpbWFnZTFELCAgICAgICAgIEdMX0lNQUdFXzFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZTJELCAgICAgICAgIEdMX0lNQUdFXzJELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzJELCAgICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZTNELCAgICAgICAgIEdMX0lNQUdFXzNELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzNELCAgICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZTJEUmVjdCwgICAgIEdMX0lNQUdFXzJEX1JFQ1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX1JFQ1QsICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZUN1YmUsICAgICAgIEdMX0lNQUdFX0NVQkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZUJ1ZmZlciwgICAgIEdMX0lNQUdFX0JVRkZFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX0JVRiwgICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZTFEQXJyYXksICAgIEdMX0lNQUdFXzFEX0FSUkFZLCAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgICAgMCwgMSwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZTJEQXJyYXksICAgIEdMX0lNQUdFXzJEX0FSUkFZLCAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzJELCAgICAgMCwgMSwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZUN1YmVBcnJheSwgIEdMX0lNQUdFX0NVQkVfTUFQX0FSUkFZLCAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsICAgMCwgMSwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZTJETVMsICAgICAgIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFLCAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgICAgMCwgMCwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpbWFnZTJETVNBcnJheSwgIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZLCAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgICAgMCwgMSwgR0xTTF9UWVBFX0ZMT0FUKTsKK0RFQ0xfVFlQRShpaW1hZ2UxRCwgICAgICAgIEdMX0lOVF9JTUFHRV8xRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgICAgMCwgMCwgR0xTTF9UWVBFX0lOVCk7CitERUNMX1RZUEUoaWltYWdlMkQsICAgICAgICBHTF9JTlRfSU1BR0VfMkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgIDAsIDAsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKGlpbWFnZTNELCAgICAgICAgR0xfSU5UX0lNQUdFXzNELCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fM0QsICAgICAwLCAwLCBHTFNMX1RZUEVfSU5UKTsKK0RFQ0xfVFlQRShpaW1hZ2UyRFJlY3QsICAgIEdMX0lOVF9JTUFHRV8yRF9SRUNULCAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX1JFQ1QsICAgMCwgMCwgR0xTTF9UWVBFX0lOVCk7CitERUNMX1RZUEUoaWltYWdlQ3ViZSwgICAgICBHTF9JTlRfSU1BR0VfQ1VCRSwgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAgIDAsIDAsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKGlpbWFnZUJ1ZmZlciwgICAgR0xfSU5UX0lNQUdFX0JVRkZFUiwgICAgICAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fQlVGLCAgICAwLCAwLCBHTFNMX1RZUEVfSU5UKTsKK0RFQ0xfVFlQRShpaW1hZ2UxREFycmF5LCAgIEdMX0lOVF9JTUFHRV8xRF9BUlJBWSwgICAgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzFELCAgICAgMCwgMSwgR0xTTF9UWVBFX0lOVCk7CitERUNMX1RZUEUoaWltYWdlMkRBcnJheSwgICBHTF9JTlRfSU1BR0VfMkRfQVJSQVksICAgICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgIDAsIDEsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKGlpbWFnZUN1YmVBcnJheSwgR0xfSU5UX0lNQUdFX0NVQkVfTUFQX0FSUkFZLCAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgICAwLCAxLCBHTFNMX1RZUEVfSU5UKTsKK0RFQ0xfVFlQRShpaW1hZ2UyRE1TLCAgICAgIEdMX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRSwgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX01TLCAgICAgMCwgMCwgR0xTTF9UWVBFX0lOVCk7CitERUNMX1RZUEUoaWltYWdlMkRNU0FycmF5LCBHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVksICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAgIDAsIDEsIEdMU0xfVFlQRV9JTlQpOworREVDTF9UWVBFKHVpbWFnZTFELCAgICAgICAgR0xfVU5TSUdORURfSU5UX0lNQUdFXzFELCAgICAgICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgICAwLCAwLCBHTFNMX1RZUEVfVUlOVCk7CitERUNMX1RZUEUodWltYWdlMkQsICAgICAgICBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkQsICAgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKTsKK0RFQ0xfVFlQRSh1aW1hZ2UzRCwgICAgICAgIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8zRCwgICAgICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNXzNELCAgICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpOworREVDTF9UWVBFKHVpbWFnZTJEUmVjdCwgICAgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX1JFQ1QsICAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwgICAwLCAwLCBHTFNMX1RZUEVfVUlOVCk7CitERUNMX1RZUEUodWltYWdlQ3ViZSwgICAgICBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRSwgICAgICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCAgIDAsIDAsIEdMU0xfVFlQRV9VSU5UKTsKK0RFQ0xfVFlQRSh1aW1hZ2VCdWZmZXIsICAgIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9CVUZGRVIsICAgICAgICAgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX0JVRiwgICAgMCwgMCwgR0xTTF9UWVBFX1VJTlQpOworREVDTF9UWVBFKHVpbWFnZTFEQXJyYXksICAgR0xfVU5TSUdORURfSU5UX0lNQUdFXzFEX0FSUkFZLCAgICAgICAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgICAwLCAxLCBHTFNMX1RZUEVfVUlOVCk7CitERUNMX1RZUEUodWltYWdlMkRBcnJheSwgICBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfQVJSQVksICAgICAgICAgICAgIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICAgIDAsIDEsIEdMU0xfVFlQRV9VSU5UKTsKK0RFQ0xfVFlQRSh1aW1hZ2VDdWJlQXJyYXksIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWSwgICAgICAgR0xTTF9UWVBFX0lNQUdFLCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsICAgMCwgMSwgR0xTTF9UWVBFX1VJTlQpOworREVDTF9UWVBFKHVpbWFnZTJETVMsICAgICAgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFLCAgICAgICBHTFNMX1RZUEVfSU1BR0UsIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgICAwLCAwLCBHTFNMX1RZUEVfVUlOVCk7CitERUNMX1RZUEUodWltYWdlMkRNU0FycmF5LCBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVksIEdMU0xfVFlQRV9JTUFHRSwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICAgIDAsIDEsIEdMU0xfVFlQRV9VSU5UKTsKKworREVDTF9UWVBFKGF0b21pY191aW50LCBHTF9VTlNJR05FRF9JTlRfQVRPTUlDX0NPVU5URVIsIEdMU0xfVFlQRV9BVE9NSUNfVUlOVCwgMSwgMSkKKworU1RSVUNUX1RZUEUoZ2xfRGVwdGhSYW5nZVBhcmFtZXRlcnMpCitTVFJVQ1RfVFlQRShnbF9Qb2ludFBhcmFtZXRlcnMpCitTVFJVQ1RfVFlQRShnbF9NYXRlcmlhbFBhcmFtZXRlcnMpCitTVFJVQ1RfVFlQRShnbF9MaWdodFNvdXJjZVBhcmFtZXRlcnMpCitTVFJVQ1RfVFlQRShnbF9MaWdodE1vZGVsUGFyYW1ldGVycykKK1NUUlVDVF9UWVBFKGdsX0xpZ2h0TW9kZWxQcm9kdWN0cykKK1NUUlVDVF9UWVBFKGdsX0xpZ2h0UHJvZHVjdHMpCitTVFJVQ1RfVFlQRShnbF9Gb2dQYXJhbWV0ZXJzKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9idWlsdGluX3R5cGVzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYnVpbHRpbl90eXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwZmE4YwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYnVpbHRpbl90eXBlcy5jcHAKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGJ1aWx0aW5fdHlwZXMuY3BwCisgKgorICogVGhlIGdsc2xfdHlwZSBjbGFzcyBoYXMgc3RhdGljIG1lbWJlcnMgdG8gcmVwcmVzZW50IGFsbCB0aGUgYnVpbHQtaW4gdHlwZXMKKyAqIChzdWNoIGFzIHRoZSBnbHNsX3R5cGU6Ol9mbG9hdF90eXBlIGZseXdlaWdodCkgYXMgd2VsbCBhcyBjb252ZW5pZW5jZSBwb2ludGVyCisgKiBhY2Nlc3NvcnMgKHN1Y2ggYXMgZ2xzbF90eXBlOjpmbG9hdF90eXBlKS4gIFRob3NlIGdsb2JhbCB2YXJpYWJsZXMgYXJlCisgKiBkZWNsYXJlZCBhbmQgaW5pdGlhbGl6ZWQgaW4gdGhpcyBmaWxlLgorICoKKyAqIFRoaXMgYWxzbyBjb250YWlucyBfbWVzYV9nbHNsX2luaXRpYWxpemVfdHlwZXMoKSwgYSBmdW5jdGlvbiB3aGljaCBwb3B1bGF0ZXMKKyAqIGEgc3ltYm9sIHRhYmxlIHdpdGggdGhlIGF2YWlsYWJsZSBidWlsdC1pbiB0eXBlcyBmb3IgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlCisgKiB2ZXJzaW9uIGFuZCBzZXQgb2YgZW5hYmxlZCBleHRlbnNpb25zLgorICovCisKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisKKy8qKgorICogRGVjbGFyYXRpb25zIG9mIHR5cGUgZmx5d2VpZ2h0cyAoZ2xzbF90eXBlOjpfZm9vX3R5cGUpIGFuZAorICogY29udmVuaWVuY2UgcG9pbnRlcnMgKGdsc2xfdHlwZTo6Zm9vX3R5cGUpLgorICogQHsKKyAqLworI2RlZmluZSBERUNMX1RZUEUoTkFNRSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGNvbnN0IGdsc2xfdHlwZSBnbHNsX3R5cGU6Ol8jI05BTUUjI190eXBlID0gZ2xzbF90eXBlKF9fVkFfQVJHU19fLCAjTkFNRSk7IFwKKyAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgZ2xzbF90eXBlOjpOQU1FIyNfdHlwZSA9ICZnbHNsX3R5cGU6Ol8jI05BTUUjI190eXBlOworCisjZGVmaW5lIFNUUlVDVF9UWVBFKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgY29uc3QgZ2xzbF90eXBlIGdsc2xfdHlwZTo6X3N0cnVjdF8jI05BTUUjI190eXBlID0gICAgICAgICAgIFwKKyAgICAgIGdsc2xfdHlwZShOQU1FIyNfZmllbGRzLCBFbGVtZW50cyhOQU1FIyNfZmllbGRzKSwgI05BTUUpOyBcCisgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGdsc2xfdHlwZTo6c3RydWN0XyMjTkFNRSMjX3R5cGUgPSAgICAgXAorICAgICAgJmdsc2xfdHlwZTo6X3N0cnVjdF8jI05BTUUjI190eXBlOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsc2xfc3RydWN0X2ZpZWxkIGdsX0RlcHRoUmFuZ2VQYXJhbWV0ZXJzX2ZpZWxkc1tdID0geworICAgeyBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJuZWFyIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImZhciIsICBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiZGlmZiIsIGZhbHNlLCAtMSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3N0cnVjdF9maWVsZCBnbF9Qb2ludFBhcmFtZXRlcnNfZmllbGRzW10gPSB7CisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgInNpemUiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAic2l6ZU1pbiIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJzaXplTWF4IiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImZhZGVUaHJlc2hvbGRTaXplIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImRpc3RhbmNlQ29uc3RhbnRBdHRlbnVhdGlvbiIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJkaXN0YW5jZUxpbmVhckF0dGVudWF0aW9uIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImRpc3RhbmNlUXVhZHJhdGljQXR0ZW51YXRpb24iLCBmYWxzZSwgLTEgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xzbF9zdHJ1Y3RfZmllbGQgZ2xfTWF0ZXJpYWxQYXJhbWV0ZXJzX2ZpZWxkc1tdID0geworICAgeyBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgImVtaXNzaW9uIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6dmVjNF90eXBlLCAiYW1iaWVudCIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgImRpZmZ1c2UiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJzcGVjdWxhciIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJzaGluaW5lc3MiLCBmYWxzZSwgLTEgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xzbF9zdHJ1Y3RfZmllbGQgZ2xfTGlnaHRTb3VyY2VQYXJhbWV0ZXJzX2ZpZWxkc1tdID0geworICAgeyBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgImFtYmllbnQiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJkaWZmdXNlIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6dmVjNF90eXBlLCAic3BlY3VsYXIiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJwb3NpdGlvbiIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgImhhbGZWZWN0b3IiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjp2ZWMzX3R5cGUsICJzcG90RGlyZWN0aW9uIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgInNwb3RFeHBvbmVudCIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJzcG90Q3V0b2ZmIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgInNwb3RDb3NDdXRvZmYiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiY29uc3RhbnRBdHRlbnVhdGlvbiIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJsaW5lYXJBdHRlbnVhdGlvbiIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OmZsb2F0X3R5cGUsICJxdWFkcmF0aWNBdHRlbnVhdGlvbiIsIGZhbHNlLCAtMSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3N0cnVjdF9maWVsZCBnbF9MaWdodE1vZGVsUGFyYW1ldGVyc19maWVsZHNbXSA9IHsKKyAgIHsgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJhbWJpZW50IiwgZmFsc2UsIC0xIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsc2xfc3RydWN0X2ZpZWxkIGdsX0xpZ2h0TW9kZWxQcm9kdWN0c19maWVsZHNbXSA9IHsKKyAgIHsgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJzY2VuZUNvbG9yIiwgZmFsc2UsIC0xIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsc2xfc3RydWN0X2ZpZWxkIGdsX0xpZ2h0UHJvZHVjdHNfZmllbGRzW10gPSB7CisgICB7IGdsc2xfdHlwZTo6dmVjNF90eXBlLCAiYW1iaWVudCIsIGZhbHNlLCAtMSB9LAorICAgeyBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgImRpZmZ1c2UiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjp2ZWM0X3R5cGUsICJzcGVjdWxhciIsIGZhbHNlLCAtMSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbHNsX3N0cnVjdF9maWVsZCBnbF9Gb2dQYXJhbWV0ZXJzX2ZpZWxkc1tdID0geworICAgeyBnbHNsX3R5cGU6OnZlYzRfdHlwZSwgImNvbG9yIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgImRlbnNpdHkiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAic3RhcnQiLCBmYWxzZSwgLTEgfSwKKyAgIHsgZ2xzbF90eXBlOjpmbG9hdF90eXBlLCAiZW5kIiwgZmFsc2UsIC0xIH0sCisgICB7IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwgInNjYWxlIiwgZmFsc2UsIC0xIH0sCit9OworCisjaW5jbHVkZSAiYnVpbHRpbl90eXBlX21hY3Jvcy5oIgorLyoqIEB9ICovCisKKy8qKgorICogQ29kZSB0byBwb3B1bGF0ZSBhIHN5bWJvbCB0YWJsZSB3aXRoIHRoZSBidWlsdC1pbiB0eXBlcyBhdmFpbGFibGUgaW4gYQorICogcGFydGljdWxhciBzaGFkaW5nIGxhbmd1YWdlIHZlcnNpb24uICBUaGUgdGFibGUgYmVsb3cgY29udGFpbnMgdGFncyBldmVyeQorICogdHlwZSB3aXRoIHRoZSBHTFNML0dMU0wgRVMgdmVyc2lvbnMgd2hlcmUgaXQgd2FzIGludHJvZHVjZWQuCisgKgorICogQHsKKyAqLworI2RlZmluZSBUKFRZUEUsIE1JTl9HTCwgTUlOX0VTKSBcCisgICB7IGdsc2xfdHlwZTo6VFlQRSMjX3R5cGUsIE1JTl9HTCwgTUlOX0VTIH0sCisKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgYnVpbHRpbl90eXBlX3ZlcnNpb25zIHsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgdHlwZTsKKyAgIGludCBtaW5fZ2w7CisgICBpbnQgbWluX2VzOworfSBidWlsdGluX3R5cGVfdmVyc2lvbnNbXSA9IHsKKyAgIFQodm9pZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLCAxMDApCisgICBUKGJvb2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwgMTAwKQorICAgVChidmVjMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAsIDEwMCkKKyAgIFQoYnZlYzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLCAxMDApCisgICBUKGJ2ZWM0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwgMTAwKQorICAgVChpbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAsIDEwMCkKKyAgIFQoaXZlYzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLCAxMDApCisgICBUKGl2ZWMzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwgMTAwKQorICAgVChpdmVjNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAsIDEwMCkKKyAgIFQodWludCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwLCAzMDApCisgICBUKHV2ZWMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMCwgMzAwKQorICAgVCh1dmVjMywgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAsIDMwMCkKKyAgIFQodXZlYzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwLCAzMDApCisgICBUKGZsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwgMTAwKQorICAgVCh2ZWMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAsIDEwMCkKKyAgIFQodmVjMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLCAxMDApCisgICBUKHZlYzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwgMTAwKQorICAgVChtYXQyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAsIDEwMCkKKyAgIFQobWF0MywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLCAxMDApCisgICBUKG1hdDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwgMTAwKQorICAgVChtYXQyeDMsICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAsIDMwMCkKKyAgIFQobWF0Mng0LCAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwLCAzMDApCisgICBUKG1hdDN4MiwgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMCwgMzAwKQorICAgVChtYXQzeDQsICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAsIDMwMCkKKyAgIFQobWF0NHgyLCAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwLCAzMDApCisgICBUKG1hdDR4MywgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMCwgMzAwKQorCisgICBUKHNhbXBsZXIxRCwgICAgICAgICAgICAgICAgICAgICAgIDExMCwgOTk5KQorICAgVChzYW1wbGVyMkQsICAgICAgICAgICAgICAgICAgICAgICAxMTAsIDEwMCkKKyAgIFQoc2FtcGxlcjNELCAgICAgICAgICAgICAgICAgICAgICAgMTEwLCAzMDApCisgICBUKHNhbXBsZXJDdWJlLCAgICAgICAgICAgICAgICAgICAgIDExMCwgMTAwKQorICAgVChzYW1wbGVyMURBcnJheSwgICAgICAgICAgICAgICAgICAxMzAsIDk5OSkKKyAgIFQoc2FtcGxlcjJEQXJyYXksICAgICAgICAgICAgICAgICAgMTMwLCAzMDApCisgICBUKHNhbXBsZXJDdWJlQXJyYXksICAgICAgICAgICAgICAgIDQwMCwgOTk5KQorICAgVChzYW1wbGVyMkRSZWN0LCAgICAgICAgICAgICAgICAgICAxNDAsIDk5OSkKKyAgIFQoc2FtcGxlckJ1ZmZlciwgICAgICAgICAgICAgICAgICAgMTQwLCA5OTkpCisgICBUKHNhbXBsZXIyRE1TLCAgICAgICAgICAgICAgICAgICAgIDE1MCwgOTk5KQorICAgVChzYW1wbGVyMkRNU0FycmF5LCAgICAgICAgICAgICAgICAxNTAsIDk5OSkKKworICAgVChpc2FtcGxlcjFELCAgICAgICAgICAgICAgICAgICAgICAxMzAsIDk5OSkKKyAgIFQoaXNhbXBsZXIyRCwgICAgICAgICAgICAgICAgICAgICAgMTMwLCAzMDApCisgICBUKGlzYW1wbGVyM0QsICAgICAgICAgICAgICAgICAgICAgIDEzMCwgMzAwKQorICAgVChpc2FtcGxlckN1YmUsICAgICAgICAgICAgICAgICAgICAxMzAsIDMwMCkKKyAgIFQoaXNhbXBsZXIxREFycmF5LCAgICAgICAgICAgICAgICAgMTMwLCA5OTkpCisgICBUKGlzYW1wbGVyMkRBcnJheSwgICAgICAgICAgICAgICAgIDEzMCwgMzAwKQorICAgVChpc2FtcGxlckN1YmVBcnJheSwgICAgICAgICAgICAgICA0MDAsIDk5OSkKKyAgIFQoaXNhbXBsZXIyRFJlY3QsICAgICAgICAgICAgICAgICAgMTQwLCA5OTkpCisgICBUKGlzYW1wbGVyQnVmZmVyLCAgICAgICAgICAgICAgICAgIDE0MCwgOTk5KQorICAgVChpc2FtcGxlcjJETVMsICAgICAgICAgICAgICAgICAgICAxNTAsIDk5OSkKKyAgIFQoaXNhbXBsZXIyRE1TQXJyYXksICAgICAgICAgICAgICAgMTUwLCA5OTkpCisKKyAgIFQodXNhbXBsZXIxRCwgICAgICAgICAgICAgICAgICAgICAgMTMwLCA5OTkpCisgICBUKHVzYW1wbGVyMkQsICAgICAgICAgICAgICAgICAgICAgIDEzMCwgMzAwKQorICAgVCh1c2FtcGxlcjNELCAgICAgICAgICAgICAgICAgICAgICAxMzAsIDMwMCkKKyAgIFQodXNhbXBsZXJDdWJlLCAgICAgICAgICAgICAgICAgICAgMTMwLCAzMDApCisgICBUKHVzYW1wbGVyMURBcnJheSwgICAgICAgICAgICAgICAgIDEzMCwgOTk5KQorICAgVCh1c2FtcGxlcjJEQXJyYXksICAgICAgICAgICAgICAgICAxMzAsIDMwMCkKKyAgIFQodXNhbXBsZXJDdWJlQXJyYXksICAgICAgICAgICAgICAgNDAwLCA5OTkpCisgICBUKHVzYW1wbGVyMkRSZWN0LCAgICAgICAgICAgICAgICAgIDE0MCwgOTk5KQorICAgVCh1c2FtcGxlckJ1ZmZlciwgICAgICAgICAgICAgICAgICAxNDAsIDk5OSkKKyAgIFQodXNhbXBsZXIyRE1TLCAgICAgICAgICAgICAgICAgICAgMTUwLCA5OTkpCisgICBUKHVzYW1wbGVyMkRNU0FycmF5LCAgICAgICAgICAgICAgIDE1MCwgOTk5KQorCisgICBUKHNhbXBsZXIxRFNoYWRvdywgICAgICAgICAgICAgICAgIDExMCwgOTk5KQorICAgVChzYW1wbGVyMkRTaGFkb3csICAgICAgICAgICAgICAgICAxMTAsIDMwMCkKKyAgIFQoc2FtcGxlckN1YmVTaGFkb3csICAgICAgICAgICAgICAgMTMwLCAzMDApCisgICBUKHNhbXBsZXIxREFycmF5U2hhZG93LCAgICAgICAgICAgIDEzMCwgOTk5KQorICAgVChzYW1wbGVyMkRBcnJheVNoYWRvdywgICAgICAgICAgICAxMzAsIDMwMCkKKyAgIFQoc2FtcGxlckN1YmVBcnJheVNoYWRvdywgICAgICAgICAgNDAwLCA5OTkpCisgICBUKHNhbXBsZXIyRFJlY3RTaGFkb3csICAgICAgICAgICAgIDE0MCwgOTk5KQorCisgICBUKHN0cnVjdF9nbF9EZXB0aFJhbmdlUGFyYW1ldGVycywgIDExMCwgMTAwKQorCisgICBUKGltYWdlMUQsICAgICAgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVChpbWFnZTJELCAgICAgICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQoaW1hZ2UzRCwgICAgICAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKGltYWdlMkRSZWN0LCAgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVChpbWFnZUN1YmUsICAgICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQoaW1hZ2VCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKGltYWdlMURBcnJheSwgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVChpbWFnZTJEQXJyYXksICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQoaW1hZ2VDdWJlQXJyYXksICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKGltYWdlMkRNUywgICAgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVChpbWFnZTJETVNBcnJheSwgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQoaWltYWdlMUQsICAgICAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKGlpbWFnZTJELCAgICAgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVChpaW1hZ2UzRCwgICAgICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQoaWltYWdlMkRSZWN0LCAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKGlpbWFnZUN1YmUsICAgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVChpaW1hZ2VCdWZmZXIsICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQoaWltYWdlMURBcnJheSwgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKGlpbWFnZTJEQXJyYXksICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVChpaW1hZ2VDdWJlQXJyYXksICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQoaWltYWdlMkRNUywgICAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKGlpbWFnZTJETVNBcnJheSwgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVCh1aW1hZ2UxRCwgICAgICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQodWltYWdlMkQsICAgICAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKHVpbWFnZTNELCAgICAgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVCh1aW1hZ2UyRFJlY3QsICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQodWltYWdlQ3ViZSwgICAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKHVpbWFnZUJ1ZmZlciwgICAgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVCh1aW1hZ2UxREFycmF5LCAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQodWltYWdlMkRBcnJheSwgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisgICBUKHVpbWFnZUN1YmVBcnJheSwgICAgICAgICAgICAgICAgIDQyMCwgOTk5KQorICAgVCh1aW1hZ2UyRE1TLCAgICAgICAgICAgICAgICAgICAgICA0MjAsIDk5OSkKKyAgIFQodWltYWdlMkRNU0FycmF5LCAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCisKKyAgIFQoYXRvbWljX3VpbnQsICAgICAgICAgICAgICAgICAgICAgNDIwLCA5OTkpCit9OworCitzdGF0aWMgY29uc3QgZ2xzbF90eXBlICpjb25zdCBkZXByZWNhdGVkX3R5cGVzW10gPSB7CisgICBnbHNsX3R5cGU6OnN0cnVjdF9nbF9Qb2ludFBhcmFtZXRlcnNfdHlwZSwKKyAgIGdsc2xfdHlwZTo6c3RydWN0X2dsX01hdGVyaWFsUGFyYW1ldGVyc190eXBlLAorICAgZ2xzbF90eXBlOjpzdHJ1Y3RfZ2xfTGlnaHRTb3VyY2VQYXJhbWV0ZXJzX3R5cGUsCisgICBnbHNsX3R5cGU6OnN0cnVjdF9nbF9MaWdodE1vZGVsUGFyYW1ldGVyc190eXBlLAorICAgZ2xzbF90eXBlOjpzdHJ1Y3RfZ2xfTGlnaHRNb2RlbFByb2R1Y3RzX3R5cGUsCisgICBnbHNsX3R5cGU6OnN0cnVjdF9nbF9MaWdodFByb2R1Y3RzX3R5cGUsCisgICBnbHNsX3R5cGU6OnN0cnVjdF9nbF9Gb2dQYXJhbWV0ZXJzX3R5cGUsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK2FkZF90eXBlKGdsc2xfc3ltYm9sX3RhYmxlICpzeW1ib2xzLCBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHR5cGUpCit7CisgICBzeW1ib2xzLT5hZGRfdHlwZSh0eXBlLT5uYW1lLCB0eXBlKTsKK30KKworLyoqCisgKiBQb3B1bGF0ZSB0aGUgc3ltYm9sIHRhYmxlIHdpdGggYXZhaWxhYmxlIGJ1aWx0LWluIHR5cGVzLgorICovCit2b2lkCitfbWVzYV9nbHNsX2luaXRpYWxpemVfdHlwZXMoc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgc3RydWN0IGdsc2xfc3ltYm9sX3RhYmxlICpzeW1ib2xzID0gc3RhdGUtPnN5bWJvbHM7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBFbGVtZW50cyhidWlsdGluX3R5cGVfdmVyc2lvbnMpOyBpKyspIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBidWlsdGluX3R5cGVfdmVyc2lvbnMgKmNvbnN0IHQgPSAmYnVpbHRpbl90eXBlX3ZlcnNpb25zW2ldOworICAgICAgaWYgKHN0YXRlLT5pc192ZXJzaW9uKHQtPm1pbl9nbCwgdC0+bWluX2VzKSkgeworICAgICAgICAgYWRkX3R5cGUoc3ltYm9scywgdC0+dHlwZSk7CisgICAgICB9CisgICB9CisKKyAgIC8qIEFkZCBkZXByZWNhdGVkIHN0cnVjdHVyZSB0eXBlcy4gIFdoaWxlIHRoZXNlIHdlcmUgZGVwcmVjYXRlZCBpbiAxLjMwLAorICAgICogdGhleSdyZSBzdGlsbCBwcmVzZW50LiAgV2UndmUgcmVtb3ZlZCB0aGVtIGluIDEuNDArIChPcGVuR0wgMy4xKykuCisgICAgKi8KKyAgIGlmICghc3RhdGUtPmVzX3NoYWRlciAmJiBzdGF0ZS0+bGFuZ3VhZ2VfdmVyc2lvbiA8IDE0MCkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEVsZW1lbnRzKGRlcHJlY2F0ZWRfdHlwZXMpOyBpKyspIHsKKyAgICAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGRlcHJlY2F0ZWRfdHlwZXNbaV0pOworICAgICAgfQorICAgfQorCisgICAvKiBBZGQgdHlwZXMgZm9yIGVuYWJsZWQgZXh0ZW5zaW9ucy4gIFRoZXkgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkCisgICAgKiBieSB0aGUgdmVyc2lvbi1iYXNlZCBsb29wLCBidXQgYXR0ZW1wdGluZyB0byBhZGQgdGhlbSBhIHNlY29uZCB0aW1lCisgICAgKiBpcyBoYXJtbGVzcy4KKyAgICAqLworICAgaWYgKHN0YXRlLT5BUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheV9lbmFibGUpIHsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6c2FtcGxlckN1YmVBcnJheVNoYWRvd190eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aXNhbXBsZXJDdWJlQXJyYXlfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnVzYW1wbGVyQ3ViZUFycmF5X3R5cGUpOworICAgfQorCisgICBpZiAoc3RhdGUtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZSkgeworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjpzYW1wbGVyMkRNU190eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aXNhbXBsZXIyRE1TX3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjp1c2FtcGxlcjJETVNfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnNhbXBsZXIyRE1TQXJyYXlfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmlzYW1wbGVyMkRNU0FycmF5X3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjp1c2FtcGxlcjJETVNBcnJheV90eXBlKTsKKyAgIH0KKworICAgaWYgKHN0YXRlLT5BUkJfdGV4dHVyZV9yZWN0YW5nbGVfZW5hYmxlKSB7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZSk7CisgICB9CisKKyAgIGlmIChzdGF0ZS0+RVhUX3RleHR1cmVfYXJyYXlfZW5hYmxlKSB7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnNhbXBsZXIxREFycmF5X3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjpzYW1wbGVyMkRBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5U2hhZG93X3R5cGUpOworICAgfQorCisgICBpZiAoc3RhdGUtPk9FU19FR0xfaW1hZ2VfZXh0ZXJuYWxfZW5hYmxlKSB7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnNhbXBsZXJFeHRlcm5hbE9FU190eXBlKTsKKyAgIH0KKworICAgaWYgKHN0YXRlLT5PRVNfdGV4dHVyZV8zRF9lbmFibGUpIHsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGUpOworICAgfQorCisgICBpZiAoc3RhdGUtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUpIHsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aW1hZ2UxRF90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aW1hZ2UyRF90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aW1hZ2UzRF90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aW1hZ2UyRFJlY3RfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmltYWdlQ3ViZV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aW1hZ2VCdWZmZXJfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmltYWdlMURBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aW1hZ2UyREFycmF5X3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjppbWFnZUN1YmVBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aW1hZ2UyRE1TX3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjppbWFnZTJETVNBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aWltYWdlMURfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmlpbWFnZTJEX3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjppaW1hZ2UzRF90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aWltYWdlMkRSZWN0X3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjppaW1hZ2VDdWJlX3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjppaW1hZ2VCdWZmZXJfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmlpbWFnZTFEQXJyYXlfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmlpbWFnZTJEQXJyYXlfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmlpbWFnZUN1YmVBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aWltYWdlMkRNU190eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6aWltYWdlMkRNU0FycmF5X3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjp1aW1hZ2UxRF90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6dWltYWdlMkRfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnVpbWFnZTNEX3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjp1aW1hZ2UyRFJlY3RfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnVpbWFnZUN1YmVfdHlwZSk7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OnVpbWFnZUJ1ZmZlcl90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6dWltYWdlMURBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6dWltYWdlMkRBcnJheV90eXBlKTsKKyAgICAgIGFkZF90eXBlKHN5bWJvbHMsIGdsc2xfdHlwZTo6dWltYWdlQ3ViZUFycmF5X3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjp1aW1hZ2UyRE1TX3R5cGUpOworICAgICAgYWRkX3R5cGUoc3ltYm9scywgZ2xzbF90eXBlOjp1aW1hZ2UyRE1TQXJyYXlfdHlwZSk7CisgICB9CisKKyAgIGlmIChzdGF0ZS0+QVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnNfZW5hYmxlKSB7CisgICAgICBhZGRfdHlwZShzeW1ib2xzLCBnbHNsX3R5cGU6OmF0b21pY191aW50X3R5cGUpOworICAgfQorfQorLyoqIEB9ICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2J1aWx0aW5fdmFyaWFibGVzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvYnVpbHRpbl92YXJpYWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODY0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2J1aWx0aW5fdmFyaWFibGVzLmNwcApAQCAtMCwwICsxLDEwNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJnbHNsX3BhcnNlcl9leHRyYXMuaCIKKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgImxpYmZucy5oIgorI2luY2x1ZGUgIm1haW4vdW5pZm9ybXMuaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX3N0YXRldmFycy5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImljZC11dGlscy5oIiAvLyBMdW5hckcgLSBBREQKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9OdW1TYW1wbGVzX2VsZW1lbnRzW10gPSB7CisgICB7TlVMTCwge1NUQVRFX05VTV9TQU1QTEVTLCAwLCAwfSwgU1dJWlpMRV9YWFhYfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9EZXB0aFJhbmdlX2VsZW1lbnRzW10gPSB7CisgICB7Im5lYXIiLCB7U1RBVEVfREVQVEhfUkFOR0UsIDAsIDB9LCBTV0laWkxFX1hYWFh9LAorICAgeyJmYXIiLCB7U1RBVEVfREVQVEhfUkFOR0UsIDAsIDB9LCBTV0laWkxFX1lZWVl9LAorICAgeyJkaWZmIiwge1NUQVRFX0RFUFRIX1JBTkdFLCAwLCAwfSwgU1dJWlpMRV9aWlpafSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfQ2xpcFBsYW5lX2VsZW1lbnRzW10gPSB7CisgICB7TlVMTCwge1NUQVRFX0NMSVBQTEFORSwgMCwgMH0sIFNXSVpaTEVfWFlaV30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfUG9pbnRfZWxlbWVudHNbXSA9IHsKKyAgIHsic2l6ZSIsIHtTVEFURV9QT0lOVF9TSVpFfSwgU1dJWlpMRV9YWFhYfSwKKyAgIHsic2l6ZU1pbiIsIHtTVEFURV9QT0lOVF9TSVpFfSwgU1dJWlpMRV9ZWVlZfSwKKyAgIHsic2l6ZU1heCIsIHtTVEFURV9QT0lOVF9TSVpFfSwgU1dJWlpMRV9aWlpafSwKKyAgIHsiZmFkZVRocmVzaG9sZFNpemUiLCB7U1RBVEVfUE9JTlRfU0laRX0sIFNXSVpaTEVfV1dXV30sCisgICB7ImRpc3RhbmNlQ29uc3RhbnRBdHRlbnVhdGlvbiIsIHtTVEFURV9QT0lOVF9BVFRFTlVBVElPTn0sIFNXSVpaTEVfWFhYWH0sCisgICB7ImRpc3RhbmNlTGluZWFyQXR0ZW51YXRpb24iLCB7U1RBVEVfUE9JTlRfQVRURU5VQVRJT059LCBTV0laWkxFX1lZWVl9LAorICAgeyJkaXN0YW5jZVF1YWRyYXRpY0F0dGVudWF0aW9uIiwge1NUQVRFX1BPSU5UX0FUVEVOVUFUSU9OfSwgU1dJWlpMRV9aWlpafSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfRnJvbnRNYXRlcmlhbF9lbGVtZW50c1tdID0geworICAgeyJlbWlzc2lvbiIsIHtTVEFURV9NQVRFUklBTCwgMCwgU1RBVEVfRU1JU1NJT059LCBTV0laWkxFX1hZWld9LAorICAgeyJhbWJpZW50Iiwge1NUQVRFX01BVEVSSUFMLCAwLCBTVEFURV9BTUJJRU5UfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsiZGlmZnVzZSIsIHtTVEFURV9NQVRFUklBTCwgMCwgU1RBVEVfRElGRlVTRX0sIFNXSVpaTEVfWFlaV30sCisgICB7InNwZWN1bGFyIiwge1NUQVRFX01BVEVSSUFMLCAwLCBTVEFURV9TUEVDVUxBUn0sIFNXSVpaTEVfWFlaV30sCisgICB7InNoaW5pbmVzcyIsIHtTVEFURV9NQVRFUklBTCwgMCwgU1RBVEVfU0hJTklORVNTfSwgU1dJWlpMRV9YWFhYfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfQmFja01hdGVyaWFsX2VsZW1lbnRzW10gPSB7CisgICB7ImVtaXNzaW9uIiwge1NUQVRFX01BVEVSSUFMLCAxLCBTVEFURV9FTUlTU0lPTn0sIFNXSVpaTEVfWFlaV30sCisgICB7ImFtYmllbnQiLCB7U1RBVEVfTUFURVJJQUwsIDEsIFNUQVRFX0FNQklFTlR9LCBTV0laWkxFX1hZWld9LAorICAgeyJkaWZmdXNlIiwge1NUQVRFX01BVEVSSUFMLCAxLCBTVEFURV9ESUZGVVNFfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsic3BlY3VsYXIiLCB7U1RBVEVfTUFURVJJQUwsIDEsIFNUQVRFX1NQRUNVTEFSfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsic2hpbmluZXNzIiwge1NUQVRFX01BVEVSSUFMLCAxLCBTVEFURV9TSElOSU5FU1N9LCBTV0laWkxFX1hYWFh9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9MaWdodFNvdXJjZV9lbGVtZW50c1tdID0geworICAgeyJhbWJpZW50Iiwge1NUQVRFX0xJR0hULCAwLCBTVEFURV9BTUJJRU5UfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsiZGlmZnVzZSIsIHtTVEFURV9MSUdIVCwgMCwgU1RBVEVfRElGRlVTRX0sIFNXSVpaTEVfWFlaV30sCisgICB7InNwZWN1bGFyIiwge1NUQVRFX0xJR0hULCAwLCBTVEFURV9TUEVDVUxBUn0sIFNXSVpaTEVfWFlaV30sCisgICB7InBvc2l0aW9uIiwge1NUQVRFX0xJR0hULCAwLCBTVEFURV9QT1NJVElPTn0sIFNXSVpaTEVfWFlaV30sCisgICB7ImhhbGZWZWN0b3IiLCB7U1RBVEVfTElHSFQsIDAsIFNUQVRFX0hBTEZfVkVDVE9SfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsic3BvdERpcmVjdGlvbiIsIHtTVEFURV9MSUdIVCwgMCwgU1RBVEVfU1BPVF9ESVJFQ1RJT059LAorICAgIE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9YLAorCQkgIFNXSVpaTEVfWSwKKwkJICBTV0laWkxFX1osCisJCSAgU1dJWlpMRV9aKX0sCisgICB7InNwb3RDb3NDdXRvZmYiLCB7U1RBVEVfTElHSFQsIDAsIFNUQVRFX1NQT1RfRElSRUNUSU9OfSwgU1dJWlpMRV9XV1dXfSwKKyAgIHsic3BvdEN1dG9mZiIsIHtTVEFURV9MSUdIVCwgMCwgU1RBVEVfU1BPVF9DVVRPRkZ9LCBTV0laWkxFX1hYWFh9LAorICAgeyJzcG90RXhwb25lbnQiLCB7U1RBVEVfTElHSFQsIDAsIFNUQVRFX0FUVEVOVUFUSU9OfSwgU1dJWlpMRV9XV1dXfSwKKyAgIHsiY29uc3RhbnRBdHRlbnVhdGlvbiIsIHtTVEFURV9MSUdIVCwgMCwgU1RBVEVfQVRURU5VQVRJT059LCBTV0laWkxFX1hYWFh9LAorICAgeyJsaW5lYXJBdHRlbnVhdGlvbiIsIHtTVEFURV9MSUdIVCwgMCwgU1RBVEVfQVRURU5VQVRJT059LCBTV0laWkxFX1lZWVl9LAorICAgeyJxdWFkcmF0aWNBdHRlbnVhdGlvbiIsIHtTVEFURV9MSUdIVCwgMCwgU1RBVEVfQVRURU5VQVRJT059LCBTV0laWkxFX1paWlp9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9MaWdodE1vZGVsX2VsZW1lbnRzW10gPSB7CisgICB7ImFtYmllbnQiLCB7U1RBVEVfTElHSFRNT0RFTF9BTUJJRU5ULCAwfSwgU1dJWlpMRV9YWVpXfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdF9lbGVtZW50c1tdID0geworICAgeyJzY2VuZUNvbG9yIiwge1NUQVRFX0xJR0hUTU9ERUxfU0NFTkVDT0xPUiwgMH0sIFNXSVpaTEVfWFlaV30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50IGdsX0JhY2tMaWdodE1vZGVsUHJvZHVjdF9lbGVtZW50c1tdID0geworICAgeyJzY2VuZUNvbG9yIiwge1NUQVRFX0xJR0hUTU9ERUxfU0NFTkVDT0xPUiwgMX0sIFNXSVpaTEVfWFlaV30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50IGdsX0Zyb250TGlnaHRQcm9kdWN0X2VsZW1lbnRzW10gPSB7CisgICB7ImFtYmllbnQiLCB7U1RBVEVfTElHSFRQUk9ELCAwLCAwLCBTVEFURV9BTUJJRU5UfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsiZGlmZnVzZSIsIHtTVEFURV9MSUdIVFBST0QsIDAsIDAsIFNUQVRFX0RJRkZVU0V9LCBTV0laWkxFX1hZWld9LAorICAgeyJzcGVjdWxhciIsIHtTVEFURV9MSUdIVFBST0QsIDAsIDAsIFNUQVRFX1NQRUNVTEFSfSwgU1dJWlpMRV9YWVpXfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfQmFja0xpZ2h0UHJvZHVjdF9lbGVtZW50c1tdID0geworICAgeyJhbWJpZW50Iiwge1NUQVRFX0xJR0hUUFJPRCwgMCwgMSwgU1RBVEVfQU1CSUVOVH0sIFNXSVpaTEVfWFlaV30sCisgICB7ImRpZmZ1c2UiLCB7U1RBVEVfTElHSFRQUk9ELCAwLCAxLCBTVEFURV9ESUZGVVNFfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsic3BlY3VsYXIiLCB7U1RBVEVfTElHSFRQUk9ELCAwLCAxLCBTVEFURV9TUEVDVUxBUn0sIFNXSVpaTEVfWFlaV30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50IGdsX1RleHR1cmVFbnZDb2xvcl9lbGVtZW50c1tdID0geworICAge05VTEwsIHtTVEFURV9URVhFTlZfQ09MT1IsIDB9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9FeWVQbGFuZVNfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fRVlFX1N9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9FeWVQbGFuZVRfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fRVlFX1R9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9FeWVQbGFuZVJfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fRVlFX1J9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9FeWVQbGFuZVFfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fRVlFX1F9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9PYmplY3RQbGFuZVNfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fT0JKRUNUX1N9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9PYmplY3RQbGFuZVRfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fT0JKRUNUX1R9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9PYmplY3RQbGFuZVJfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fT0JKRUNUX1J9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9PYmplY3RQbGFuZVFfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfVEVYR0VOLCAwLCBTVEFURV9URVhHRU5fT0JKRUNUX1F9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9Gb2dfZWxlbWVudHNbXSA9IHsKKyAgIHsiY29sb3IiLCB7U1RBVEVfRk9HX0NPTE9SfSwgU1dJWlpMRV9YWVpXfSwKKyAgIHsiZGVuc2l0eSIsIHtTVEFURV9GT0dfUEFSQU1TfSwgU1dJWlpMRV9YWFhYfSwKKyAgIHsic3RhcnQiLCB7U1RBVEVfRk9HX1BBUkFNU30sIFNXSVpaTEVfWVlZWX0sCisgICB7ImVuZCIsIHtTVEFURV9GT0dfUEFSQU1TfSwgU1dJWlpMRV9aWlpafSwKKyAgIHsic2NhbGUiLCB7U1RBVEVfRk9HX1BBUkFNU30sIFNXSVpaTEVfV1dXV30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50IGdsX05vcm1hbFNjYWxlX2VsZW1lbnRzW10gPSB7CisgICB7TlVMTCwge1NUQVRFX05PUk1BTF9TQ0FMRX0sIFNXSVpaTEVfWFhYWH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50IGdsX0J1bXBSb3RNYXRyaXgwTUVTQV9lbGVtZW50c1tdID0geworICAge05VTEwsIHtTVEFURV9JTlRFUk5BTCwgU1RBVEVfUk9UX01BVFJJWF8wfSwgU1dJWlpMRV9YWVpXfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfQnVtcFJvdE1hdHJpeDFNRVNBX2VsZW1lbnRzW10gPSB7CisgICB7TlVMTCwge1NUQVRFX0lOVEVSTkFMLCBTVEFURV9ST1RfTUFUUklYXzF9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9Gb2dQYXJhbXNPcHRpbWl6ZWRNRVNBX2VsZW1lbnRzW10gPSB7CisgICB7TlVMTCwge1NUQVRFX0lOVEVSTkFMLCBTVEFURV9GT0dfUEFSQU1TX09QVElNSVpFRH0sIFNXSVpaTEVfWFlaV30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50IGdsX0N1cnJlbnRBdHRyaWJWZXJ0TUVTQV9lbGVtZW50c1tdID0geworICAge05VTEwsIHtTVEFURV9JTlRFUk5BTCwgU1RBVEVfQ1VSUkVOVF9BVFRSSUIsIDB9LCBTV0laWkxFX1hZWld9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnbF9idWlsdGluX3VuaWZvcm1fZWxlbWVudCBnbF9DdXJyZW50QXR0cmliRnJhZ01FU0FfZWxlbWVudHNbXSA9IHsKKyAgIHtOVUxMLCB7U1RBVEVfSU5URVJOQUwsIFNUQVRFX0NVUlJFTlRfQVRUUklCX01BWUJFX1ZQX0NMQU1QRUQsIDB9LCBTV0laWkxFX1hZWld9LAorfTsKKworI2RlZmluZSBNQVRSSVgobmFtZSwgc3RhdGV2YXIsIG1vZGlmaWVyKQkJCQlcCisgICBzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50IG5hbWUgIyMgX2VsZW1lbnRzW10gPSB7IFwKKyAgICAgIHsgTlVMTCwgeyBzdGF0ZXZhciwgMCwgMCwgMCwgbW9kaWZpZXJ9LCBTV0laWkxFX1hZWlcgfSwJCVwKKyAgICAgIHsgTlVMTCwgeyBzdGF0ZXZhciwgMCwgMSwgMSwgbW9kaWZpZXJ9LCBTV0laWkxFX1hZWlcgfSwJCVwKKyAgICAgIHsgTlVMTCwgeyBzdGF0ZXZhciwgMCwgMiwgMiwgbW9kaWZpZXJ9LCBTV0laWkxFX1hZWlcgfSwJCVwKKyAgICAgIHsgTlVMTCwgeyBzdGF0ZXZhciwgMCwgMywgMywgbW9kaWZpZXJ9LCBTV0laWkxFX1hZWlcgfSwJCVwKKyAgIH0KKworTUFUUklYKGdsX01vZGVsVmlld01hdHJpeCwKKyAgICAgICBTVEFURV9NT0RFTFZJRVdfTUFUUklYLCBTVEFURV9NQVRSSVhfVFJBTlNQT1NFKTsKK01BVFJJWChnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlLAorICAgICAgIFNUQVRFX01PREVMVklFV19NQVRSSVgsIFNUQVRFX01BVFJJWF9JTlZUUkFOUyk7CitNQVRSSVgoZ2xfTW9kZWxWaWV3TWF0cml4VHJhbnNwb3NlLAorICAgICAgIFNUQVRFX01PREVMVklFV19NQVRSSVgsIDApOworTUFUUklYKGdsX01vZGVsVmlld01hdHJpeEludmVyc2VUcmFuc3Bvc2UsCisgICAgICAgU1RBVEVfTU9ERUxWSUVXX01BVFJJWCwgU1RBVEVfTUFUUklYX0lOVkVSU0UpOworCitNQVRSSVgoZ2xfUHJvamVjdGlvbk1hdHJpeCwKKyAgICAgICBTVEFURV9QUk9KRUNUSU9OX01BVFJJWCwgU1RBVEVfTUFUUklYX1RSQU5TUE9TRSk7CitNQVRSSVgoZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2UsCisgICAgICAgU1RBVEVfUFJPSkVDVElPTl9NQVRSSVgsIFNUQVRFX01BVFJJWF9JTlZUUkFOUyk7CitNQVRSSVgoZ2xfUHJvamVjdGlvbk1hdHJpeFRyYW5zcG9zZSwKKyAgICAgICBTVEFURV9QUk9KRUNUSU9OX01BVFJJWCwgMCk7CitNQVRSSVgoZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2VUcmFuc3Bvc2UsCisgICAgICAgU1RBVEVfUFJPSkVDVElPTl9NQVRSSVgsIFNUQVRFX01BVFJJWF9JTlZFUlNFKTsKKworTUFUUklYKGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgsCisgICAgICAgU1RBVEVfTVZQX01BVFJJWCwgU1RBVEVfTUFUUklYX1RSQU5TUE9TRSk7CitNQVRSSVgoZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2UsCisgICAgICAgU1RBVEVfTVZQX01BVFJJWCwgU1RBVEVfTUFUUklYX0lOVlRSQU5TKTsKK01BVFJJWChnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4VHJhbnNwb3NlLAorICAgICAgIFNUQVRFX01WUF9NQVRSSVgsIDApOworTUFUUklYKGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlLAorICAgICAgIFNUQVRFX01WUF9NQVRSSVgsIFNUQVRFX01BVFJJWF9JTlZFUlNFKTsKKworTUFUUklYKGdsX1RleHR1cmVNYXRyaXgsCisgICAgICAgU1RBVEVfVEVYVFVSRV9NQVRSSVgsIFNUQVRFX01BVFJJWF9UUkFOU1BPU0UpOworTUFUUklYKGdsX1RleHR1cmVNYXRyaXhJbnZlcnNlLAorICAgICAgIFNUQVRFX1RFWFRVUkVfTUFUUklYLCBTVEFURV9NQVRSSVhfSU5WVFJBTlMpOworTUFUUklYKGdsX1RleHR1cmVNYXRyaXhUcmFuc3Bvc2UsCisgICAgICAgU1RBVEVfVEVYVFVSRV9NQVRSSVgsIDApOworTUFUUklYKGdsX1RleHR1cmVNYXRyaXhJbnZlcnNlVHJhbnNwb3NlLAorICAgICAgIFNUQVRFX1RFWFRVUkVfTUFUUklYLCBTVEFURV9NQVRSSVhfSU5WRVJTRSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2VsZW1lbnQgZ2xfTm9ybWFsTWF0cml4X2VsZW1lbnRzW10gPSB7CisgICB7IE5VTEwsIHsgU1RBVEVfTU9ERUxWSUVXX01BVFJJWCwgMCwgMCwgMCwgU1RBVEVfTUFUUklYX0lOVkVSU0V9LAorICAgICBNQUtFX1NXSVpaTEU0KFNXSVpaTEVfWCwgU1dJWlpMRV9ZLCBTV0laWkxFX1osIFNXSVpaTEVfWikgfSwKKyAgIHsgTlVMTCwgeyBTVEFURV9NT0RFTFZJRVdfTUFUUklYLCAwLCAxLCAxLCBTVEFURV9NQVRSSVhfSU5WRVJTRX0sCisgICAgIE1BS0VfU1dJWlpMRTQoU1dJWlpMRV9YLCBTV0laWkxFX1ksIFNXSVpaTEVfWiwgU1dJWlpMRV9aKSB9LAorICAgeyBOVUxMLCB7IFNUQVRFX01PREVMVklFV19NQVRSSVgsIDAsIDIsIDIsIFNUQVRFX01BVFJJWF9JTlZFUlNFfSwKKyAgICAgTUFLRV9TV0laWkxFNChTV0laWkxFX1gsIFNXSVpaTEVfWSwgU1dJWlpMRV9aLCBTV0laWkxFX1opIH0sCit9OworCisjdW5kZWYgTUFUUklYCisKKyNkZWZpbmUgU1RBVEVWQVIobmFtZSkgeyNuYW1lLCBuYW1lICMjIF9lbGVtZW50cywgRWxlbWVudHMobmFtZSAjIyBfZWxlbWVudHMpfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9kZXNjIF9tZXNhX2J1aWx0aW5fdW5pZm9ybV9kZXNjW10gPSB7CisgICBTVEFURVZBUihnbF9OdW1TYW1wbGVzKSwKKyAgIFNUQVRFVkFSKGdsX0RlcHRoUmFuZ2UpLAorICAgU1RBVEVWQVIoZ2xfQ2xpcFBsYW5lKSwKKyAgIFNUQVRFVkFSKGdsX1BvaW50KSwKKyAgIFNUQVRFVkFSKGdsX0Zyb250TWF0ZXJpYWwpLAorICAgU1RBVEVWQVIoZ2xfQmFja01hdGVyaWFsKSwKKyAgIFNUQVRFVkFSKGdsX0xpZ2h0U291cmNlKSwKKyAgIFNUQVRFVkFSKGdsX0xpZ2h0TW9kZWwpLAorICAgU1RBVEVWQVIoZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdCksCisgICBTVEFURVZBUihnbF9CYWNrTGlnaHRNb2RlbFByb2R1Y3QpLAorICAgU1RBVEVWQVIoZ2xfRnJvbnRMaWdodFByb2R1Y3QpLAorICAgU1RBVEVWQVIoZ2xfQmFja0xpZ2h0UHJvZHVjdCksCisgICBTVEFURVZBUihnbF9UZXh0dXJlRW52Q29sb3IpLAorICAgU1RBVEVWQVIoZ2xfRXllUGxhbmVTKSwKKyAgIFNUQVRFVkFSKGdsX0V5ZVBsYW5lVCksCisgICBTVEFURVZBUihnbF9FeWVQbGFuZVIpLAorICAgU1RBVEVWQVIoZ2xfRXllUGxhbmVRKSwKKyAgIFNUQVRFVkFSKGdsX09iamVjdFBsYW5lUyksCisgICBTVEFURVZBUihnbF9PYmplY3RQbGFuZVQpLAorICAgU1RBVEVWQVIoZ2xfT2JqZWN0UGxhbmVSKSwKKyAgIFNUQVRFVkFSKGdsX09iamVjdFBsYW5lUSksCisgICBTVEFURVZBUihnbF9Gb2cpLAorCisgICBTVEFURVZBUihnbF9Nb2RlbFZpZXdNYXRyaXgpLAorICAgU1RBVEVWQVIoZ2xfTW9kZWxWaWV3TWF0cml4SW52ZXJzZSksCisgICBTVEFURVZBUihnbF9Nb2RlbFZpZXdNYXRyaXhUcmFuc3Bvc2UpLAorICAgU1RBVEVWQVIoZ2xfTW9kZWxWaWV3TWF0cml4SW52ZXJzZVRyYW5zcG9zZSksCisKKyAgIFNUQVRFVkFSKGdsX1Byb2plY3Rpb25NYXRyaXgpLAorICAgU1RBVEVWQVIoZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2UpLAorICAgU1RBVEVWQVIoZ2xfUHJvamVjdGlvbk1hdHJpeFRyYW5zcG9zZSksCisgICBTVEFURVZBUihnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSksCisKKyAgIFNUQVRFVkFSKGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgpLAorICAgU1RBVEVWQVIoZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2UpLAorICAgU1RBVEVWQVIoZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeFRyYW5zcG9zZSksCisgICBTVEFURVZBUihnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSksCisKKyAgIFNUQVRFVkFSKGdsX1RleHR1cmVNYXRyaXgpLAorICAgU1RBVEVWQVIoZ2xfVGV4dHVyZU1hdHJpeEludmVyc2UpLAorICAgU1RBVEVWQVIoZ2xfVGV4dHVyZU1hdHJpeFRyYW5zcG9zZSksCisgICBTVEFURVZBUihnbF9UZXh0dXJlTWF0cml4SW52ZXJzZVRyYW5zcG9zZSksCisKKyAgIFNUQVRFVkFSKGdsX05vcm1hbE1hdHJpeCksCisgICBTVEFURVZBUihnbF9Ob3JtYWxTY2FsZSksCisKKyAgIFNUQVRFVkFSKGdsX0J1bXBSb3RNYXRyaXgwTUVTQSksCisgICBTVEFURVZBUihnbF9CdW1wUm90TWF0cml4MU1FU0EpLAorICAgU1RBVEVWQVIoZ2xfRm9nUGFyYW1zT3B0aW1pemVkTUVTQSksCisgICBTVEFURVZBUihnbF9DdXJyZW50QXR0cmliVmVydE1FU0EpLAorICAgU1RBVEVWQVIoZ2xfQ3VycmVudEF0dHJpYkZyYWdNRVNBKSwKKworICAge05VTEwsIE5VTEwsIDB9Cit9OworCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBhY2N1bXVsYXRlcyBmaWVsZHMgZm9yIHRoZSBnbF9QZXJWZXJ0ZXggaW50ZXJmYWNlCisgKiBibG9jay4KKyAqLworY2xhc3MgcGVyX3ZlcnRleF9hY2N1bXVsYXRvcgoreworcHVibGljOgorICAgcGVyX3ZlcnRleF9hY2N1bXVsYXRvcigpOworICAgdm9pZCBhZGRfZmllbGQoaW50IHNsb3QsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSk7CisgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0cnVjdF9pbnRlcmZhY2VfaW5zdGFuY2UoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgIGdsc2xfc3RydWN0X2ZpZWxkIGZpZWxkc1sxMF07CisgICB1bnNpZ25lZCBudW1fZmllbGRzOworfTsKKworCitwZXJfdmVydGV4X2FjY3VtdWxhdG9yOjpwZXJfdmVydGV4X2FjY3VtdWxhdG9yKCkKKyAgIDogZmllbGRzKCksCisgICAgIG51bV9maWVsZHMoMCkKK3sKK30KKworCit2b2lkCitwZXJfdmVydGV4X2FjY3VtdWxhdG9yOjphZGRfZmllbGQoaW50IHNsb3QsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgYXNzZXJ0KHRoaXMtPm51bV9maWVsZHMgPCBBUlJBWV9TSVpFKHRoaXMtPmZpZWxkcykpOworICAgdGhpcy0+ZmllbGRzW3RoaXMtPm51bV9maWVsZHNdLnR5cGUgPSB0eXBlOworICAgdGhpcy0+ZmllbGRzW3RoaXMtPm51bV9maWVsZHNdLm5hbWUgPSBuYW1lOworICAgdGhpcy0+ZmllbGRzW3RoaXMtPm51bV9maWVsZHNdLnJvd19tYWpvciA9IGZhbHNlOworICAgdGhpcy0+ZmllbGRzW3RoaXMtPm51bV9maWVsZHNdLmxvY2F0aW9uID0gc2xvdDsKKyAgIHRoaXMtPmZpZWxkc1t0aGlzLT5udW1fZmllbGRzXS5pbnRlcnBvbGF0aW9uID0gSU5URVJQX1FVQUxJRklFUl9OT05FOworICAgdGhpcy0+ZmllbGRzW3RoaXMtPm51bV9maWVsZHNdLmNlbnRyb2lkID0gMDsKKyAgIHRoaXMtPmZpZWxkc1t0aGlzLT5udW1fZmllbGRzXS5zYW1wbGUgPSAwOworICAgdGhpcy0+bnVtX2ZpZWxkcysrOworfQorCisKK2NvbnN0IGdsc2xfdHlwZSAqCitwZXJfdmVydGV4X2FjY3VtdWxhdG9yOjpjb25zdHJ1Y3RfaW50ZXJmYWNlX2luc3RhbmNlKCkgY29uc3QKK3sKKyAgIHJldHVybiBnbHNsX3R5cGU6OmdldF9pbnRlcmZhY2VfaW5zdGFuY2UodGhpcy0+ZmllbGRzLCB0aGlzLT5udW1fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFNMX0lOVEVSRkFDRV9QQUNLSU5HX1NURDE0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsX1BlclZlcnRleCIpOworfQorCisKK2NsYXNzIGJ1aWx0aW5fdmFyaWFibGVfZ2VuZXJhdG9yCit7CitwdWJsaWM6CisgICBidWlsdGluX3ZhcmlhYmxlX2dlbmVyYXRvcihleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisgICB2b2lkIGdlbmVyYXRlX2NvbnN0YW50cygpOworICAgdm9pZCBnZW5lcmF0ZV91bmlmb3JtcygpOworICAgdm9pZCBnZW5lcmF0ZV92c19zcGVjaWFsX3ZhcnMoKTsKKyAgIHZvaWQgZ2VuZXJhdGVfZ3Nfc3BlY2lhbF92YXJzKCk7CisgICB2b2lkIGdlbmVyYXRlX2ZzX3NwZWNpYWxfdmFycygpOworICAgdm9pZCBnZW5lcmF0ZV9jc19zcGVjaWFsX3ZhcnMoKTsKKyAgIHZvaWQgZ2VuZXJhdGVfdmFyeWluZ3MoKTsKKworcHJpdmF0ZToKKyAgIGNvbnN0IGdsc2xfdHlwZSAqYXJyYXkoY29uc3QgZ2xzbF90eXBlICpiYXNlLCB1bnNpZ25lZCBlbGVtZW50cykKKyAgIHsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZShiYXNlLCBlbGVtZW50cyk7CisgICB9CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZShjb25zdCBjaGFyICpuYW1lKQorICAgeworICAgICAgcmV0dXJuIHN5bXRhYi0+Z2V0X3R5cGUobmFtZSk7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICphZGRfaW5wdXQoaW50IHNsb3QsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKKyAgIHsKKyAgICAgIHJldHVybiBhZGRfdmFyaWFibGUobmFtZSwgdHlwZSwgaXJfdmFyX3NoYWRlcl9pbiwgc2xvdCk7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICphZGRfb3V0cHV0KGludCBzbG90LCBjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUpCisgICB7CisgICAgICByZXR1cm4gYWRkX3ZhcmlhYmxlKG5hbWUsIHR5cGUsIGlyX3Zhcl9zaGFkZXJfb3V0LCBzbG90KTsKKyAgIH0KKworICAgaXJfdmFyaWFibGUgKmFkZF9zeXN0ZW1fdmFsdWUoaW50IHNsb3QsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCisgICB7CisgICAgICByZXR1cm4gYWRkX3ZhcmlhYmxlKG5hbWUsIHR5cGUsIGlyX3Zhcl9zeXN0ZW1fdmFsdWUsIHNsb3QpOworICAgfQorCisgICBpcl92YXJpYWJsZSAqYWRkX3ZhcmlhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpcl92YXJpYWJsZV9tb2RlIG1vZGUsIGludCBzbG90KTsKKyAgIGlyX3ZhcmlhYmxlICphZGRfdW5pZm9ybShjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUpOworICAgaXJfdmFyaWFibGUgKmFkZF9jb25zdChjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpOworICAgaXJfdmFyaWFibGUgKmFkZF9jb25zdF9pdmVjMyhjb25zdCBjaGFyICpuYW1lLCBpbnQgeCwgaW50IHksIGludCB6KTsKKyAgIHZvaWQgYWRkX3ZhcnlpbmcoaW50IHNsb3QsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZV9hc19nc19pbnB1dCk7CisKKyAgIGV4ZWNfbGlzdCAqIGNvbnN0IGluc3RydWN0aW9uczsKKyAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICogY29uc3Qgc3RhdGU7CisgICBnbHNsX3N5bWJvbF90YWJsZSAqIGNvbnN0IHN5bXRhYjsKKworICAgLyoqCisgICAgKiBUcnVlIGlmIGNvbXBhdGliaWxpdHktcHJvZmlsZS1vbmx5IHZhcmlhYmxlcyBzaG91bGQgYmUgaW5jbHVkZWQuICAoSW4KKyAgICAqIGRlc2t0b3AgR0wsIHRoZXNlIGFyZSBhbHdheXMgaW5jbHVkZWQgd2hlbiB0aGUgR0xTTCB2ZXJzaW9uIGlzIDEuMzAgYW5kCisgICAgKiBvciBiZWxvdykuCisgICAgKi8KKyAgIGNvbnN0IGJvb2wgY29tcGF0aWJpbGl0eTsKKworICAgY29uc3QgZ2xzbF90eXBlICogY29uc3QgYm9vbF90OworICAgY29uc3QgZ2xzbF90eXBlICogY29uc3QgaW50X3Q7CisgICBjb25zdCBnbHNsX3R5cGUgKiBjb25zdCBmbG9hdF90OworICAgY29uc3QgZ2xzbF90eXBlICogY29uc3QgdmVjMl90OworICAgY29uc3QgZ2xzbF90eXBlICogY29uc3QgdmVjM190OworICAgY29uc3QgZ2xzbF90eXBlICogY29uc3QgdmVjNF90OworICAgY29uc3QgZ2xzbF90eXBlICogY29uc3QgbWF0M190OworICAgY29uc3QgZ2xzbF90eXBlICogY29uc3QgbWF0NF90OworCisgICBwZXJfdmVydGV4X2FjY3VtdWxhdG9yIHBlcl92ZXJ0ZXhfaW47CisgICBwZXJfdmVydGV4X2FjY3VtdWxhdG9yIHBlcl92ZXJ0ZXhfb3V0OworfTsKKworCitidWlsdGluX3ZhcmlhYmxlX2dlbmVyYXRvcjo6YnVpbHRpbl92YXJpYWJsZV9nZW5lcmF0b3IoCisgICBleGVjX2xpc3QgKmluc3RydWN0aW9ucywgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQorICAgOiBpbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKSwgc3RhdGUoc3RhdGUpLCBzeW10YWIoc3RhdGUtPnN5bWJvbHMpLAorICAgICBjb21wYXRpYmlsaXR5KCFzdGF0ZS0+aXNfdmVyc2lvbigxNDAsIDEwMCkpLAorICAgICBib29sX3QoZ2xzbF90eXBlOjpib29sX3R5cGUpLCBpbnRfdChnbHNsX3R5cGU6OmludF90eXBlKSwKKyAgICAgZmxvYXRfdChnbHNsX3R5cGU6OmZsb2F0X3R5cGUpLCB2ZWMyX3QoZ2xzbF90eXBlOjp2ZWMyX3R5cGUpLAorICAgICB2ZWMzX3QoZ2xzbF90eXBlOjp2ZWMzX3R5cGUpLCB2ZWM0X3QoZ2xzbF90eXBlOjp2ZWM0X3R5cGUpLAorICAgICBtYXQzX3QoZ2xzbF90eXBlOjptYXQzX3R5cGUpLCBtYXQ0X3QoZ2xzbF90eXBlOjptYXQ0X3R5cGUpCit7Cit9CisKKworaXJfdmFyaWFibGUgKgorYnVpbHRpbl92YXJpYWJsZV9nZW5lcmF0b3I6OmFkZF92YXJpYWJsZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaXJfdmFyaWFibGVfbW9kZSBtb2RlLCBpbnQgc2xvdCkKK3sKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBuZXcoc3ltdGFiKSBpcl92YXJpYWJsZSh0eXBlLCBuYW1lLCBtb2RlKTsKKyAgIHZhci0+ZGF0YS5ob3dfZGVjbGFyZWQgPSBpcl92YXJfZGVjbGFyZWRfaW1wbGljaXRseTsKKworICAgc3dpdGNoICh2YXItPmRhdGEubW9kZSkgeworICAgY2FzZSBpcl92YXJfYXV0bzoKKyAgIGNhc2UgaXJfdmFyX3NoYWRlcl9pbjoKKyAgIGNhc2UgaXJfdmFyX3VuaWZvcm06CisgICBjYXNlIGlyX3Zhcl9zeXN0ZW1fdmFsdWU6CisgICAgICB2YXItPmRhdGEucmVhZF9vbmx5ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl92YXJfc2hhZGVyX291dDoKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIC8qIFRoZSBvbmx5IHZhcmlhYmxlcyB0aGF0IGFyZSBhZGRlZCB1c2luZyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZQorICAgICAgICogdW5pZm9ybXMsIHNoYWRlciBpbnB1dHMsIGFuZCBzaGFkZXIgb3V0cHV0cywgY29uc3RhbnRzICh3aGljaCB1c2UKKyAgICAgICAqIGlyX3Zhcl9hdXRvKSwgYW5kIHN5c3RlbSB2YWx1ZXMuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCgwKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICB2YXItPmRhdGEubG9jYXRpb24gPSBzbG90OworICAgdmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uID0gKHNsb3QgPj0gMCk7CisgICB2YXItPmRhdGEuZXhwbGljaXRfaW5kZXggPSAwOworCisgICAvKiBPbmNlIHRoZSB2YXJpYWJsZSBpcyBjcmVhdGVkIGFuIGluaXRpYWxpemVkLCBhZGQgaXQgdG8gdGhlIHN5bWJvbCB0YWJsZQorICAgICogYW5kIGFkZCB0aGUgZGVjbGFyYXRpb24gdG8gdGhlIElSIHN0cmVhbS4KKyAgICAqLworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwodmFyKTsKKworICAgc3ltdGFiLT5hZGRfdmFyaWFibGUodmFyKTsKKyAgIHJldHVybiB2YXI7Cit9CisKKworaXJfdmFyaWFibGUgKgorYnVpbHRpbl92YXJpYWJsZV9nZW5lcmF0b3I6OmFkZF91bmlmb3JtKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgaXJfdmFyaWFibGUgKmNvbnN0IHVuaSA9IGFkZF92YXJpYWJsZShuYW1lLCB0eXBlLCBpcl92YXJfdW5pZm9ybSwgLTEpOworCisgICB1bnNpZ25lZCBpOworICAgZm9yIChpID0gMDsgX21lc2FfYnVpbHRpbl91bmlmb3JtX2Rlc2NbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAoX21lc2FfYnVpbHRpbl91bmlmb3JtX2Rlc2NbaV0ubmFtZSwgbmFtZSkgPT0gMCkgeworCSBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgYXNzZXJ0KF9tZXNhX2J1aWx0aW5fdW5pZm9ybV9kZXNjW2ldLm5hbWUgIT0gTlVMTCk7CisgICBjb25zdCBzdHJ1Y3QgZ2xfYnVpbHRpbl91bmlmb3JtX2Rlc2MqIGNvbnN0IHN0YXRldmFyID0KKyAgICAgICZfbWVzYV9idWlsdGluX3VuaWZvcm1fZGVzY1tpXTsKKworICAgY29uc3QgdW5zaWduZWQgYXJyYXlfY291bnQgPSB0eXBlLT5pc19hcnJheSgpID8gdHlwZS0+bGVuZ3RoIDogMTsKKyAgIHVuaS0+bnVtX3N0YXRlX3Nsb3RzID0gYXJyYXlfY291bnQgKiBzdGF0ZXZhci0+bnVtX2VsZW1lbnRzOworCisgICBpcl9zdGF0ZV9zbG90ICpzbG90cyA9CisgICAgICByYWxsb2NfYXJyYXkodW5pLCBpcl9zdGF0ZV9zbG90LCB1bmktPm51bV9zdGF0ZV9zbG90cyk7CisKKyAgIHVuaS0+c3RhdGVfc2xvdHMgPSBzbG90czsKKworICAgLyogc2VlIG1haW4vY29uZmlnLmggKi8KKyAgIGFzc2VydCh1bmktPm51bV9zdGF0ZV9zbG90cyA8PSBNQVhfTlVNX1NUQVRFX1NMT1RTKTsKKworICAgZm9yICh1bnNpZ25lZCBhID0gMDsgYSA8IGFycmF5X2NvdW50OyBhKyspIHsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBzdGF0ZXZhci0+bnVtX2VsZW1lbnRzOyBqKyspIHsKKwkgY29uc3Qgc3RydWN0IGdsX2J1aWx0aW5fdW5pZm9ybV9lbGVtZW50ICplbGVtZW50ID0KKwkgICAgJnN0YXRldmFyLT5lbGVtZW50c1tqXTsKKworCSBtZW1jcHkoc2xvdHMtPnRva2VucywgZWxlbWVudC0+dG9rZW5zLCBzaXplb2YoZWxlbWVudC0+dG9rZW5zKSk7CisJIGlmICh0eXBlLT5pc19hcnJheSgpKSB7CisJICAgIGlmIChzdHJjbXAobmFtZSwgImdsX0N1cnJlbnRBdHRyaWJWZXJ0TUVTQSIpID09IDAgfHwKKwkJc3RyY21wKG5hbWUsICJnbF9DdXJyZW50QXR0cmliRnJhZ01FU0EiKSA9PSAwKSB7CisJICAgICAgIHNsb3RzLT50b2tlbnNbMl0gPSBhOworCSAgICB9IGVsc2UgeworCSAgICAgICBzbG90cy0+dG9rZW5zWzFdID0gYTsKKwkgICAgfQorCSB9CisKKwkgc2xvdHMtPnN3aXp6bGUgPSBlbGVtZW50LT5zd2l6emxlOworCSBzbG90cysrOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gdW5pOworfQorCisKK2lyX3ZhcmlhYmxlICoKK2J1aWx0aW5fdmFyaWFibGVfZ2VuZXJhdG9yOjphZGRfY29uc3QoY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbHVlKQoreworICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IGFkZF92YXJpYWJsZShuYW1lLCBnbHNsX3R5cGU6OmludF90eXBlLAorCQkJCQkgaXJfdmFyX2F1dG8sIC0xKTsKKyAgIHZhci0+Y29uc3RhbnRfdmFsdWUgPSBuZXcodmFyKSBpcl9jb25zdGFudCh2YWx1ZSk7CisgICB2YXItPmNvbnN0YW50X2luaXRpYWxpemVyID0gbmV3KHZhcikgaXJfY29uc3RhbnQodmFsdWUpOworICAgdmFyLT5kYXRhLmhhc19pbml0aWFsaXplciA9IHRydWU7CisgICByZXR1cm4gdmFyOworfQorCisKK2lyX3ZhcmlhYmxlICoKK2J1aWx0aW5fdmFyaWFibGVfZ2VuZXJhdG9yOjphZGRfY29uc3RfaXZlYzMoY29uc3QgY2hhciAqbmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeikKK3sKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSBhZGRfdmFyaWFibGUobmFtZSwgZ2xzbF90eXBlOjppdmVjM190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfYXV0bywgLTEpOworICAgaXJfY29uc3RhbnRfZGF0YSBkYXRhOworICAgbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworICAgZGF0YS5pWzBdID0geDsKKyAgIGRhdGEuaVsxXSA9IHk7CisgICBkYXRhLmlbMl0gPSB6OworICAgdmFyLT5jb25zdGFudF92YWx1ZSA9IG5ldyh2YXIpIGlyX2NvbnN0YW50KGdsc2xfdHlwZTo6aXZlYzNfdHlwZSwgJmRhdGEpOworICAgdmFyLT5jb25zdGFudF9pbml0aWFsaXplciA9CisgICAgICBuZXcodmFyKSBpcl9jb25zdGFudChnbHNsX3R5cGU6Oml2ZWMzX3R5cGUsICZkYXRhKTsKKyAgIHZhci0+ZGF0YS5oYXNfaW5pdGlhbGl6ZXIgPSB0cnVlOworICAgcmV0dXJuIHZhcjsKK30KKworCit2b2lkCitidWlsdGluX3ZhcmlhYmxlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnRzKCkKK3sKKyAgIGFkZF9jb25zdCgiZ2xfTWF4VmVydGV4QXR0cmlicyIsIHN0YXRlLT5Db25zdC5NYXhWZXJ0ZXhBdHRyaWJzKTsKKyAgIGFkZF9jb25zdCgiZ2xfTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMiLAorICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7CisgICBhZGRfY29uc3QoImdsX01heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMiLAorICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhDb21iaW5lZFRleHR1cmVJbWFnZVVuaXRzKTsKKyAgIGFkZF9jb25zdCgiZ2xfTWF4VGV4dHVyZUltYWdlVW5pdHMiLCBzdGF0ZS0+Q29uc3QuTWF4VGV4dHVyZUltYWdlVW5pdHMpOworICAgYWRkX2NvbnN0KCJnbF9NYXhEcmF3QnVmZmVycyIsIHN0YXRlLT5Db25zdC5NYXhEcmF3QnVmZmVycyk7CisKKyAgIC8qIE1heCB1bmlmb3Jtcy92YXJ5aW5nczogR0xTTCBFUyBjb3VudHMgdGhlc2UgaW4gdW5pdHMgb2YgdmVjdG9yczsgZGVza3RvcAorICAgICogR0wgY291bnRzIHRoZW0gaW4gdW5pdHMgb2YgImNvbXBvbmVudHMiIG9yICJmbG9hdHMiLgorICAgICovCisgICBpZiAoc3RhdGUtPmVzX3NoYWRlcikgeworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heFZlcnRleFVuaWZvcm1Db21wb25lbnRzIC8gNCk7CisgICAgICBhZGRfY29uc3QoImdsX01heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzIC8gNCk7CisKKyAgICAgIC8qIEluIEdMU0wgRVMgMy4wMCwgZ2xfTWF4VmFyeWluZ1ZlY3RvcnMgd2FzIHNwbGl0IG91dCB0byBzZXBhcmF0ZQorICAgICAgICogdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgY29uc3RhbnRzLgorICAgICAgICovCisgICAgICBpZiAoc3RhdGUtPmlzX3ZlcnNpb24oMCwgMzAwKSkgeworICAgICAgICAgYWRkX2NvbnN0KCJnbF9NYXhWZXJ0ZXhPdXRwdXRWZWN0b3JzIiwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4T3V0cHV0Q29tcG9uZW50cyAvIDQpOworICAgICAgICAgYWRkX2NvbnN0KCJnbF9NYXhGcmFnbWVudElucHV0VmVjdG9ycyIsCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPmN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4SW5wdXRDb21wb25lbnRzIC8gNCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgYWRkX2NvbnN0KCJnbF9NYXhWYXJ5aW5nVmVjdG9ycyIsCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPmN0eC0+Q29uc3QuTWF4VmFyeWluZyk7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhWZXJ0ZXhVbmlmb3JtQ29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heFZlcnRleFVuaWZvcm1Db21wb25lbnRzKTsKKworICAgICAgLyogTm90ZTogZ2xfTWF4VmFyeWluZ0Zsb2F0cyB3YXMgZGVwcmVjYXRlZCBpbiBHTFNMIDEuMzArLCBidXQgbm90CisgICAgICAgKiByZW1vdmVkCisgICAgICAgKi8KKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4VmFyeWluZ0Zsb2F0cyIsIHN0YXRlLT5jdHgtPkNvbnN0Lk1heFZhcnlpbmcgKiA0KTsKKworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4RnJhZ21lbnRVbmlmb3JtQ29tcG9uZW50cyk7CisgICB9CisKKyAgIC8qIFRleGVsIG9mZnNldHMgd2VyZSBpbnRyb2R1Y2VkIGluIEFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgKHdoaWNoCisgICAgKiByZXF1aXJlcyBkZXNrdG9wIEdMU0wgdmVyc2lvbiAxMzApLCBhbmQgYWRvcHRlZCBpbnRvIGRlc2t0b3AgR0xTTAorICAgICogdmVyc2lvbiA0LjIwIGFuZCBHTFNMIEVTIHZlcnNpb24gMy4wMC4KKyAgICAqLworICAgaWYgKChzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDApICYmCisgICAgICAgIHN0YXRlLT5BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrX2VuYWJsZSkgfHwKKyAgICAgIHN0YXRlLT5pc192ZXJzaW9uKDQyMCwgMzAwKSkgeworICAgICAgYWRkX2NvbnN0KCJnbF9NaW5Qcm9ncmFtVGV4ZWxPZmZzZXQiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NaW5Qcm9ncmFtVGV4ZWxPZmZzZXQpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhQcm9ncmFtVGV4ZWxPZmZzZXQiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhQcm9ncmFtVGV4ZWxPZmZzZXQpOworICAgfQorCisgICBpZiAoc3RhdGUtPmlzX3ZlcnNpb24oMTMwLCAwKSkgeworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhDbGlwRGlzdGFuY2VzIiwgc3RhdGUtPkNvbnN0Lk1heENsaXBQbGFuZXMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhWYXJ5aW5nQ29tcG9uZW50cyIsIHN0YXRlLT5jdHgtPkNvbnN0Lk1heFZhcnlpbmcgKiA0KTsKKyAgIH0KKworICAgaWYgKHN0YXRlLT5pc192ZXJzaW9uKDE1MCwgMCkpIHsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heFZlcnRleE91dHB1dENvbXBvbmVudHMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heEdlb21ldHJ5SW5wdXRDb21wb25lbnRzKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyk7CisgICAgICBhZGRfY29uc3QoImdsX01heEdlb21ldHJ5VGV4dHVyZUltYWdlVW5pdHMiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhHZW9tZXRyeVRleHR1cmVJbWFnZVVuaXRzKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heEdlb21ldHJ5T3V0cHV0VmVydGljZXMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4R2VvbWV0cnlVbmlmb3JtQ29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heEdlb21ldHJ5VW5pZm9ybUNvbXBvbmVudHMpOworCisgICAgICAvKiBOb3RlOiB0aGUgR0xTTCAxLjUwLTQuNDAgc3BlY3MgcmVxdWlyZQorICAgICAgICogZ2xfTWF4R2VvbWV0cnlWYXJ5aW5nQ29tcG9uZW50cyB0byBiZSBwcmVzZW50LCBhbmQgdG8gYmUgYXQgbGVhc3QgNjQuCisgICAgICAgKiBCdXQgdGhleSBkbyBub3QgZGVmaW5lIHdoYXQgaXQgbWVhbnMgKGFuZCB0aGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUKKyAgICAgICAqIGFueSBjb3JyZXNwb25kaW5nIGNvbnN0YW50IGluIHRoZSBHTCBzcGVjcykuICBIb3dldmVyLAorICAgICAgICogQVJCX2dlb21ldHJ5X3NoYWRlcjQgZGVmaW5lcyBNQVhfR0VPTUVUUllfVkFSWUlOR19DT01QT05FTlRTX0FSQiB0bworICAgICAgICogYmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBvbmVudHMgYXZhaWxhYmxlIGZvciB1c2UgYXMgZ2VvbWV0cnkKKyAgICAgICAqIG91dHB1dHMuICBTbyB3ZSBhc3N1bWUgdGhpcyBpcyBhIHN5bm9ueW0gZm9yCisgICAgICAgKiBnbF9NYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMuCisgICAgICAgKi8KKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4R2VvbWV0cnlWYXJ5aW5nQ29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyk7CisgICB9CisKKyAgIGlmIChjb21wYXRpYmlsaXR5KSB7CisgICAgICAvKiBOb3RlOiBnbF9NYXhMaWdodHMgc3RvcHBlZCBiZWluZyBsaXN0ZWQgYXMgYW4gZXhwbGljaXQgY29uc3RhbnQgaW4KKyAgICAgICAqIEdMU0wgMS4zMCwgaG93ZXZlciBpdCBjb250aW51ZXMgdG8gYmUgcmVmZXJyZWQgdG8gKGFzIGEgbWluaW11bSBzaXplCisgICAgICAgKiBmb3IgY29tcGF0aWJpbGl0eS1tb2RlIHVuaWZvcm1zKSBhbGwgdGhlIHdheSB1cCB0aHJvdWdoIEdMU0wgNC4zMCwgc28KKyAgICAgICAqIHRoaXMgc2VlbXMgbGlrZSBpdCB3YXMgcHJvYmFibHkgYW4gb3ZlcnNpZ2h0LgorICAgICAgICovCisgICAgICBhZGRfY29uc3QoImdsX01heExpZ2h0cyIsIHN0YXRlLT5Db25zdC5NYXhMaWdodHMpOworCisgICAgICBhZGRfY29uc3QoImdsX01heENsaXBQbGFuZXMiLCBzdGF0ZS0+Q29uc3QuTWF4Q2xpcFBsYW5lcyk7CisKKyAgICAgIC8qIE5vdGU6IGdsX01heFRleHR1cmVVbml0cyB3YXNuJ3QgbWFkZSBjb21wYXRpYmlsaXR5LW9ubHkgdW50aWwgR0xTTAorICAgICAgICogMS41MCwgaG93ZXZlciB0aGlzIHNlZW1zIGxpa2UgaXQgd2FzIHByb2JhYmx5IGFuIG92ZXJzaWdodC4KKyAgICAgICAqLworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhUZXh0dXJlVW5pdHMiLCBzdGF0ZS0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzKTsKKworICAgICAgLyogTm90ZTogZ2xfTWF4VGV4dHVyZUNvb3JkcyB3YXMgbGVmdCBvdXQgb2YgR0xTTCAxLjQwLCBidXQgaXQgd2FzCisgICAgICAgKiByZS1pbnRyb2R1Y2VkIGluIEdMU0wgMS41MCwgc28gdGhpcyBzZWVtcyBsaWtlIGl0IHdhcyBwcm9iYWJseSBhbgorICAgICAgICogb3ZlcnNpZ2h0LgorICAgICAgICovCisgICAgICBhZGRfY29uc3QoImdsX01heFRleHR1cmVDb29yZHMiLCBzdGF0ZS0+Q29uc3QuTWF4VGV4dHVyZUNvb3Jkcyk7CisgICB9CisKKyAgIGlmIChzdGF0ZS0+QVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnNfZW5hYmxlKSB7CisgICAgICBhZGRfY29uc3QoImdsX01heFZlcnRleEF0b21pY0NvdW50ZXJzIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4VmVydGV4QXRvbWljQ291bnRlcnMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhHZW9tZXRyeUF0b21pY0NvdW50ZXJzIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4R2VvbWV0cnlBdG9taWNDb3VudGVycyk7CisgICAgICBhZGRfY29uc3QoImdsX01heEZyYWdtZW50QXRvbWljQ291bnRlcnMiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhGcmFnbWVudEF0b21pY0NvdW50ZXJzKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4Q29tYmluZWRBdG9taWNDb3VudGVycyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQ291bnRlcnMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhBdG9taWNDb3VudGVyQmluZGluZ3MiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5ncyk7CisgICAgICBhZGRfY29uc3QoImdsX01heFRlc3NDb250cm9sQXRvbWljQ291bnRlcnMiLCAwKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4VGVzc0V2YWx1YXRpb25BdG9taWNDb3VudGVycyIsIDApOworICAgfQorCisgICBpZiAoc3RhdGUtPmlzX3ZlcnNpb24oNDMwLCAwKSB8fCBzdGF0ZS0+QVJCX2NvbXB1dGVfc2hhZGVyX2VuYWJsZSkgeworICAgICAgYWRkX2NvbnN0X2l2ZWMzKCJnbF9NYXhDb21wdXRlV29ya0dyb3VwQ291bnQiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdKTsKKyAgICAgIGFkZF9jb25zdF9pdmVjMygiZ2xfTWF4Q29tcHV0ZVdvcmtHcm91cFNpemUiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwU2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBTaXplWzJdKTsKKworICAgICAgLyogRnJvbSB0aGUgR0xTTCA0LjQwIHNwZWMsIHNlY3Rpb24gNy4xIChCdWlsdC1JbiBMYW5ndWFnZSBWYXJpYWJsZXMpOgorICAgICAgICoKKyAgICAgICAqICAgICBUaGUgYnVpbHQtaW4gY29uc3RhbnQgZ2xfV29ya0dyb3VwU2l6ZSBpcyBhIGNvbXB1dGUtc2hhZGVyCisgICAgICAgKiAgICAgY29uc3RhbnQgY29udGFpbmluZyB0aGUgbG9jYWwgd29yay1ncm91cCBzaXplIG9mIHRoZSBzaGFkZXIuICBUaGUKKyAgICAgICAqICAgICBzaXplIG9mIHRoZSB3b3JrIGdyb3VwIGluIHRoZSBYLCBZLCBhbmQgWiBkaW1lbnNpb25zIGlzIHN0b3JlZCBpbgorICAgICAgICogICAgIHRoZSB4LCB5LCBhbmQgeiBjb21wb25lbnRzLiAgVGhlIGNvbnN0YW50cyB2YWx1ZXMgaW4KKyAgICAgICAqICAgICBnbF9Xb3JrR3JvdXBTaXplIHdpbGwgbWF0Y2ggdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSByZXF1aXJlZAorICAgICAgICogICAgIGxvY2FsX3NpemVfeCwgbG9jYWxfc2l6ZV95LCBhbmQgbG9jYWxfc2l6ZV96IGxheW91dCBxdWFsaWZpZXJzCisgICAgICAgKiAgICAgZm9yIHRoZSBjdXJyZW50IHNoYWRlci4gIFRoaXMgaXMgYSBjb25zdGFudCBzbyB0aGF0IGl0IGNhbiBiZQorICAgICAgICogICAgIHVzZWQgdG8gc2l6ZSBhcnJheXMgb2YgbWVtb3J5IHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoaW4gdGhlIGxvY2FsCisgICAgICAgKiAgICAgd29yayBncm91cC4gIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIHVzZSBnbF9Xb3JrR3JvdXBTaXplCisgICAgICAgKiAgICAgaW4gYSBzaGFkZXIgdGhhdCBkb2VzIG5vdCBkZWNsYXJlIGEgZml4ZWQgbG9jYWwgZ3JvdXAgc2l6ZSwgb3IKKyAgICAgICAqICAgICBiZWZvcmUgdGhhdCBzaGFkZXIgaGFzIGRlY2xhcmVkIGEgZml4ZWQgbG9jYWwgZ3JvdXAgc2l6ZSwgdXNpbmcKKyAgICAgICAqICAgICBsb2NhbF9zaXplX3gsIGxvY2FsX3NpemVfeSwgYW5kIGxvY2FsX3NpemVfei4KKyAgICAgICAqCisgICAgICAgKiBUbyBwcmV2ZW50IHRoZSBzaGFkZXIgZnJvbSB0cnlpbmcgdG8gcmVmZXIgdG8gZ2xfV29ya0dyb3VwU2l6ZSBiZWZvcmUKKyAgICAgICAqIHRoZSBsYXlvdXQgZGVjbGFyYXRpb24sIHdlIGRvbid0IGRlZmluZSBpdCBoZXJlLiAgSW5zdGVhZCB3ZSBkZWZpbmUgaXQKKyAgICAgICAqIGluIGFzdF9jc19pbnB1dF9sYXlvdXQ6OmhpcigpLgorICAgICAgICovCisgICB9CisKKyAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbig0MjAsIDApIHx8CisgICAgICAgc3RhdGUtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUpIHsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4SW1hZ2VVbml0cyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPkNvbnN0Lk1heEltYWdlVW5pdHMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhDb21iaW5lZEltYWdlVW5pdHNBbmRGcmFnbWVudE91dHB1dHMiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhDb21iaW5lZEltYWdlVW5pdHNBbmRGcmFnbWVudE91dHB1dHMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhJbWFnZVNhbXBsZXMiLAorICAgICAgICAgICAgICAgIHN0YXRlLT5Db25zdC5NYXhJbWFnZVNhbXBsZXMpOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhWZXJ0ZXhJbWFnZVVuaWZvcm1zIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4VmVydGV4SW1hZ2VVbmlmb3Jtcyk7CisgICAgICBhZGRfY29uc3QoImdsX01heFRlc3NDb250cm9sSW1hZ2VVbmlmb3JtcyIsIDApOworICAgICAgYWRkX2NvbnN0KCJnbF9NYXhUZXNzRXZhbHVhdGlvbkltYWdlVW5pZm9ybXMiLCAwKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4R2VvbWV0cnlJbWFnZVVuaWZvcm1zIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4R2VvbWV0cnlJbWFnZVVuaWZvcm1zKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4RnJhZ21lbnRJbWFnZVVuaWZvcm1zIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4RnJhZ21lbnRJbWFnZVVuaWZvcm1zKTsKKyAgICAgIGFkZF9jb25zdCgiZ2xfTWF4Q29tYmluZWRJbWFnZVVuaWZvcm1zIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4Q29tYmluZWRJbWFnZVVuaWZvcm1zKTsKKyAgIH0KK30KKworCisvKioKKyAqIEdlbmVyYXRlIHVuaWZvcm0gdmFyaWFibGVzICh3aGljaCBleGlzdCBpbiBhbGwgdHlwZXMgb2Ygc2hhZGVycykuCisgKi8KK3ZvaWQKK2J1aWx0aW5fdmFyaWFibGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlmb3JtcygpCit7CisgICBhZGRfdW5pZm9ybShpbnRfdCwgImdsX051bVNhbXBsZXMiKTsKKyAgIGFkZF91bmlmb3JtKHR5cGUoImdsX0RlcHRoUmFuZ2VQYXJhbWV0ZXJzIiksICJnbF9EZXB0aFJhbmdlIik7CisgICBhZGRfdW5pZm9ybShhcnJheSh2ZWM0X3QsIFZFUlRfQVRUUklCX01BWCksICJnbF9DdXJyZW50QXR0cmliVmVydE1FU0EiKTsKKyAgIGFkZF91bmlmb3JtKGFycmF5KHZlYzRfdCwgVkFSWUlOR19TTE9UX01BWCksICJnbF9DdXJyZW50QXR0cmliRnJhZ01FU0EiKTsKKworICAgaWYgKGNvbXBhdGliaWxpdHkpIHsKKyAgICAgIGFkZF91bmlmb3JtKG1hdDRfdCwgImdsX01vZGVsVmlld01hdHJpeCIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF90LCAiZ2xfUHJvamVjdGlvbk1hdHJpeCIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF90LCAiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCIpOworICAgICAgYWRkX3VuaWZvcm0obWF0M190LCAiZ2xfTm9ybWFsTWF0cml4Iik7CisgICAgICBhZGRfdW5pZm9ybShtYXQ0X3QsICJnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlIik7CisgICAgICBhZGRfdW5pZm9ybShtYXQ0X3QsICJnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZSIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF90LCAiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2UiKTsKKyAgICAgIGFkZF91bmlmb3JtKG1hdDRfdCwgImdsX01vZGVsVmlld01hdHJpeFRyYW5zcG9zZSIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF90LCAiZ2xfUHJvamVjdGlvbk1hdHJpeFRyYW5zcG9zZSIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF90LCAiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeFRyYW5zcG9zZSIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF90LCAiZ2xfTW9kZWxWaWV3TWF0cml4SW52ZXJzZVRyYW5zcG9zZSIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF90LCAiZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2VUcmFuc3Bvc2UiKTsKKyAgICAgIGFkZF91bmlmb3JtKG1hdDRfdCwgImdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlIik7CisgICAgICBhZGRfdW5pZm9ybShmbG9hdF90LCAiZ2xfTm9ybWFsU2NhbGUiKTsKKyAgICAgIGFkZF91bmlmb3JtKHR5cGUoImdsX0xpZ2h0TW9kZWxQYXJhbWV0ZXJzIiksICJnbF9MaWdodE1vZGVsIik7CisgICAgICBhZGRfdW5pZm9ybSh2ZWMyX3QsICJnbF9CdW1wUm90TWF0cml4ME1FU0EiKTsKKyAgICAgIGFkZF91bmlmb3JtKHZlYzJfdCwgImdsX0J1bXBSb3RNYXRyaXgxTUVTQSIpOworICAgICAgYWRkX3VuaWZvcm0odmVjNF90LCAiZ2xfRm9nUGFyYW1zT3B0aW1pemVkTUVTQSIpOworCisgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IG1hdDRfYXJyYXlfdHlwZSA9CisJIGFycmF5KG1hdDRfdCwgc3RhdGUtPkNvbnN0Lk1heFRleHR1cmVDb29yZHMpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF9hcnJheV90eXBlLCAiZ2xfVGV4dHVyZU1hdHJpeCIpOworICAgICAgYWRkX3VuaWZvcm0obWF0NF9hcnJheV90eXBlLCAiZ2xfVGV4dHVyZU1hdHJpeEludmVyc2UiKTsKKyAgICAgIGFkZF91bmlmb3JtKG1hdDRfYXJyYXlfdHlwZSwgImdsX1RleHR1cmVNYXRyaXhUcmFuc3Bvc2UiKTsKKyAgICAgIGFkZF91bmlmb3JtKG1hdDRfYXJyYXlfdHlwZSwgImdsX1RleHR1cmVNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIik7CisKKyAgICAgIGFkZF91bmlmb3JtKGFycmF5KHZlYzRfdCwgc3RhdGUtPkNvbnN0Lk1heENsaXBQbGFuZXMpLCAiZ2xfQ2xpcFBsYW5lIik7CisgICAgICBhZGRfdW5pZm9ybSh0eXBlKCJnbF9Qb2ludFBhcmFtZXRlcnMiKSwgImdsX1BvaW50Iik7CisKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgbWF0ZXJpYWxfcGFyYW1ldGVyc190eXBlID0KKwkgdHlwZSgiZ2xfTWF0ZXJpYWxQYXJhbWV0ZXJzIik7CisgICAgICBhZGRfdW5pZm9ybShtYXRlcmlhbF9wYXJhbWV0ZXJzX3R5cGUsICJnbF9Gcm9udE1hdGVyaWFsIik7CisgICAgICBhZGRfdW5pZm9ybShtYXRlcmlhbF9wYXJhbWV0ZXJzX3R5cGUsICJnbF9CYWNrTWF0ZXJpYWwiKTsKKworICAgICAgYWRkX3VuaWZvcm0oYXJyYXkodHlwZSgiZ2xfTGlnaHRTb3VyY2VQYXJhbWV0ZXJzIiksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Q29uc3QuTWF4TGlnaHRzKSwKKyAgICAgICAgICAgICAgICAgICJnbF9MaWdodFNvdXJjZSIpOworCisgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGxpZ2h0X21vZGVsX3Byb2R1Y3RzX3R5cGUgPQorICAgICAgICAgdHlwZSgiZ2xfTGlnaHRNb2RlbFByb2R1Y3RzIik7CisgICAgICBhZGRfdW5pZm9ybShsaWdodF9tb2RlbF9wcm9kdWN0c190eXBlLCAiZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdCIpOworICAgICAgYWRkX3VuaWZvcm0obGlnaHRfbW9kZWxfcHJvZHVjdHNfdHlwZSwgImdsX0JhY2tMaWdodE1vZGVsUHJvZHVjdCIpOworCisgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGxpZ2h0X3Byb2R1Y3RzX3R5cGUgPQorICAgICAgICAgYXJyYXkodHlwZSgiZ2xfTGlnaHRQcm9kdWN0cyIpLCBzdGF0ZS0+Q29uc3QuTWF4TGlnaHRzKTsKKyAgICAgIGFkZF91bmlmb3JtKGxpZ2h0X3Byb2R1Y3RzX3R5cGUsICJnbF9Gcm9udExpZ2h0UHJvZHVjdCIpOworICAgICAgYWRkX3VuaWZvcm0obGlnaHRfcHJvZHVjdHNfdHlwZSwgImdsX0JhY2tMaWdodFByb2R1Y3QiKTsKKworICAgICAgYWRkX3VuaWZvcm0oYXJyYXkodmVjNF90LCBzdGF0ZS0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzKSwKKyAgICAgICAgICAgICAgICAgICJnbF9UZXh0dXJlRW52Q29sb3IiKTsKKworICAgICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCB0ZXhjb29yZHNfdmVjNCA9CisJIGFycmF5KHZlYzRfdCwgc3RhdGUtPkNvbnN0Lk1heFRleHR1cmVDb29yZHMpOworICAgICAgYWRkX3VuaWZvcm0odGV4Y29vcmRzX3ZlYzQsICJnbF9FeWVQbGFuZVMiKTsKKyAgICAgIGFkZF91bmlmb3JtKHRleGNvb3Jkc192ZWM0LCAiZ2xfRXllUGxhbmVUIik7CisgICAgICBhZGRfdW5pZm9ybSh0ZXhjb29yZHNfdmVjNCwgImdsX0V5ZVBsYW5lUiIpOworICAgICAgYWRkX3VuaWZvcm0odGV4Y29vcmRzX3ZlYzQsICJnbF9FeWVQbGFuZVEiKTsKKyAgICAgIGFkZF91bmlmb3JtKHRleGNvb3Jkc192ZWM0LCAiZ2xfT2JqZWN0UGxhbmVTIik7CisgICAgICBhZGRfdW5pZm9ybSh0ZXhjb29yZHNfdmVjNCwgImdsX09iamVjdFBsYW5lVCIpOworICAgICAgYWRkX3VuaWZvcm0odGV4Y29vcmRzX3ZlYzQsICJnbF9PYmplY3RQbGFuZVIiKTsKKyAgICAgIGFkZF91bmlmb3JtKHRleGNvb3Jkc192ZWM0LCAiZ2xfT2JqZWN0UGxhbmVRIik7CisKKyAgICAgIGFkZF91bmlmb3JtKHR5cGUoImdsX0ZvZ1BhcmFtZXRlcnMiKSwgImdsX0ZvZyIpOworICAgfQorfQorCisKKy8qKgorICogR2VuZXJhdGUgdmFyaWFibGVzIHdoaWNoIG9ubHkgZXhpc3QgaW4gdmVydGV4IHNoYWRlcnMuCisgKi8KK3ZvaWQKK2J1aWx0aW5fdmFyaWFibGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV92c19zcGVjaWFsX3ZhcnMoKQoreworICAgaWYgKHN0YXRlLT5pc192ZXJzaW9uKDEzMCwgMzAwKSkKKyAgICAgIGFkZF9zeXN0ZW1fdmFsdWUoU1lTVEVNX1ZBTFVFX1ZFUlRFWF9JRCwgaW50X3QsICJnbF9WZXJ0ZXhJRCIpOworICAgaWYgKHN0YXRlLT5BUkJfZHJhd19pbnN0YW5jZWRfZW5hYmxlKQorICAgICAgYWRkX3N5c3RlbV92YWx1ZShTWVNURU1fVkFMVUVfSU5TVEFOQ0VfSUQsIGludF90LCAiZ2xfSW5zdGFuY2VJREFSQiIpOworICAgaWYgKHN0YXRlLT5BUkJfZHJhd19pbnN0YW5jZWRfZW5hYmxlIHx8IHN0YXRlLT5pc192ZXJzaW9uKDE0MCwgMzAwKSkKKyAgICAgIGFkZF9zeXN0ZW1fdmFsdWUoU1lTVEVNX1ZBTFVFX0lOU1RBTkNFX0lELCBpbnRfdCwgImdsX0luc3RhbmNlSUQiKTsKKyAgIGlmIChzdGF0ZS0+QU1EX3ZlcnRleF9zaGFkZXJfbGF5ZXJfZW5hYmxlKQorICAgICAgYWRkX291dHB1dChWQVJZSU5HX1NMT1RfTEFZRVIsIGludF90LCAiZ2xfTGF5ZXIiKTsKKyAgIGlmIChjb21wYXRpYmlsaXR5KSB7CisgICAgICBhZGRfaW5wdXQoVkVSVF9BVFRSSUJfUE9TLCB2ZWM0X3QsICJnbF9WZXJ0ZXgiKTsKKyAgICAgIGFkZF9pbnB1dChWRVJUX0FUVFJJQl9OT1JNQUwsIHZlYzNfdCwgImdsX05vcm1hbCIpOworICAgICAgYWRkX2lucHV0KFZFUlRfQVRUUklCX0NPTE9SMCwgdmVjNF90LCAiZ2xfQ29sb3IiKTsKKyAgICAgIGFkZF9pbnB1dChWRVJUX0FUVFJJQl9DT0xPUjEsIHZlYzRfdCwgImdsX1NlY29uZGFyeUNvbG9yIik7CisgICAgICBhZGRfaW5wdXQoVkVSVF9BVFRSSUJfVEVYMCwgdmVjNF90LCAiZ2xfTXVsdGlUZXhDb29yZDAiKTsKKyAgICAgIGFkZF9pbnB1dChWRVJUX0FUVFJJQl9URVgxLCB2ZWM0X3QsICJnbF9NdWx0aVRleENvb3JkMSIpOworICAgICAgYWRkX2lucHV0KFZFUlRfQVRUUklCX1RFWDIsIHZlYzRfdCwgImdsX011bHRpVGV4Q29vcmQyIik7CisgICAgICBhZGRfaW5wdXQoVkVSVF9BVFRSSUJfVEVYMywgdmVjNF90LCAiZ2xfTXVsdGlUZXhDb29yZDMiKTsKKyAgICAgIGFkZF9pbnB1dChWRVJUX0FUVFJJQl9URVg0LCB2ZWM0X3QsICJnbF9NdWx0aVRleENvb3JkNCIpOworICAgICAgYWRkX2lucHV0KFZFUlRfQVRUUklCX1RFWDUsIHZlYzRfdCwgImdsX011bHRpVGV4Q29vcmQ1Iik7CisgICAgICBhZGRfaW5wdXQoVkVSVF9BVFRSSUJfVEVYNiwgdmVjNF90LCAiZ2xfTXVsdGlUZXhDb29yZDYiKTsKKyAgICAgIGFkZF9pbnB1dChWRVJUX0FUVFJJQl9URVg3LCB2ZWM0X3QsICJnbF9NdWx0aVRleENvb3JkNyIpOworICAgICAgYWRkX2lucHV0KFZFUlRfQVRUUklCX0ZPRywgZmxvYXRfdCwgImdsX0ZvZ0Nvb3JkIik7CisgICB9Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSB2YXJpYWJsZXMgd2hpY2ggb25seSBleGlzdCBpbiBnZW9tZXRyeSBzaGFkZXJzLgorICovCit2b2lkCitidWlsdGluX3ZhcmlhYmxlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ3Nfc3BlY2lhbF92YXJzKCkKK3sKKyAgIGFkZF9vdXRwdXQoVkFSWUlOR19TTE9UX0xBWUVSLCBpbnRfdCwgImdsX0xheWVyIik7CisgICBpZiAoc3RhdGUtPkFSQl92aWV3cG9ydF9hcnJheV9lbmFibGUpCisgICAgICBhZGRfb3V0cHV0KFZBUllJTkdfU0xPVF9WSUVXUE9SVCwgaW50X3QsICJnbF9WaWV3cG9ydEluZGV4Iik7CisgICBpZiAoc3RhdGUtPkFSQl9ncHVfc2hhZGVyNV9lbmFibGUpCisgICAgICBhZGRfc3lzdGVtX3ZhbHVlKFNZU1RFTV9WQUxVRV9JTlZPQ0FUSU9OX0lELCBpbnRfdCwgImdsX0ludm9jYXRpb25JRCIpOworCisgICAvKiBBbHRob3VnaCBnbF9QcmltaXRpdmVJRCBhcHBlYXJzIGluIHRlc3NlbGxhdGlvbiBjb250cm9sIGFuZCB0ZXNzZWxsYXRpb24KKyAgICAqIGV2YWx1YXRpb24gc2hhZGVycywgaXQgaGFzIGEgZGlmZmVyZW50IGZ1bmN0aW9uIHRoZXJlIHRoYW4gaXQgaGFzIGluCisgICAgKiBnZW9tZXRyeSBzaGFkZXJzLCBzbyB3ZSB0cmVhdCBpdCAoYW5kIGl0cyBjb3VudGVycGFydCBnbF9QcmltaXRpdmVJREluKQorICAgICogYXMgc3BlY2lhbCBnZW9tZXRyeSBzaGFkZXIgdmFyaWFibGVzLgorICAgICoKKyAgICAqIE5vdGUgdGhhdCBhbHRob3VnaCB0aGUgZ2VuZXJhbCBjb252ZW50aW9uIG9mIHN1ZmZpeGluZyBnZW9tZXRyeSBzaGFkZXIKKyAgICAqIGlucHV0IHZhcnlpbmdzIHdpdGggIkluIiB3YXMgbm90IGFkb3B0ZWQgaW50byBHTFNMIDEuNTAsIGl0IGlzIHVzZWQgaW4KKyAgICAqIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGdsX1ByaW1pdGl2ZUlESW4uICBTbyB3ZSBkb24ndCBuZWVkIHRvIHRyZWF0CisgICAgKiBnbF9QcmltaXRpdmVJREluIGFzIGFuIHtBUkIsRVhUfV9nZW9tZXRyeV9zaGFkZXI0LW9ubHkgdmFyaWFibGUuCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICp2YXI7CisgICB2YXIgPSBhZGRfaW5wdXQoVkFSWUlOR19TTE9UX1BSSU1JVElWRV9JRCwgaW50X3QsICJnbF9QcmltaXRpdmVJREluIik7CisgICB2YXItPmRhdGEuaW50ZXJwb2xhdGlvbiA9IElOVEVSUF9RVUFMSUZJRVJfRkxBVDsKKyAgIHZhciA9IGFkZF9vdXRwdXQoVkFSWUlOR19TTE9UX1BSSU1JVElWRV9JRCwgaW50X3QsICJnbF9QcmltaXRpdmVJRCIpOworICAgdmFyLT5kYXRhLmludGVycG9sYXRpb24gPSBJTlRFUlBfUVVBTElGSUVSX0ZMQVQ7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSB2YXJpYWJsZXMgd2hpY2ggb25seSBleGlzdCBpbiBmcmFnbWVudCBzaGFkZXJzLgorICovCit2b2lkCitidWlsdGluX3ZhcmlhYmxlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnNfc3BlY2lhbF92YXJzKCkKK3sKKyAgIGFkZF9pbnB1dChWQVJZSU5HX1NMT1RfUE9TLCB2ZWM0X3QsICJnbF9GcmFnQ29vcmQiKTsKKyAgIGFkZF9pbnB1dChWQVJZSU5HX1NMT1RfRkFDRSwgYm9vbF90LCAiZ2xfRnJvbnRGYWNpbmciKTsKKyAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxMjAsIDEwMCkpCisgICAgICBhZGRfaW5wdXQoVkFSWUlOR19TTE9UX1BOVEMsIHZlYzJfdCwgImdsX1BvaW50Q29vcmQiKTsKKworICAgaWYgKHN0YXRlLT5pc192ZXJzaW9uKDE1MCwgMCkpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPQorICAgICAgICAgYWRkX2lucHV0KFZBUllJTkdfU0xPVF9QUklNSVRJVkVfSUQsIGludF90LCAiZ2xfUHJpbWl0aXZlSUQiKTsKKyAgICAgIHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uID0gSU5URVJQX1FVQUxJRklFUl9GTEFUOworICAgfQorCisgICAvKiBnbF9GcmFnQ29sb3IgYW5kIGdsX0ZyYWdEYXRhIHdlcmUgZGVwcmVjYXRlZCBzdGFydGluZyBpbiBkZXNrdG9wIEdMU0wKKyAgICAqIDEuMzAsIGFuZCB3ZXJlIHJlbGVnYXRlZCB0byB0aGUgY29tcGF0aWJpbGl0eSBwcm9maWxlIGluIEdMU0wgNC4yMC4KKyAgICAqIFRoZXkgd2VyZSByZW1vdmVkIGZyb20gR0xTTCBFUyAzLjAwLgorICAgICovCisgICBpZiAoY29tcGF0aWJpbGl0eSB8fCAhc3RhdGUtPmlzX3ZlcnNpb24oNDIwLCAzMDApKSB7CisgICAgICBhZGRfb3V0cHV0KEZSQUdfUkVTVUxUX0NPTE9SLCB2ZWM0X3QsICJnbF9GcmFnQ29sb3IiKTsKKyAgICAgIGFkZF9vdXRwdXQoRlJBR19SRVNVTFRfREFUQTAsCisgICAgICAgICAgICAgICAgIGFycmF5KHZlYzRfdCwgc3RhdGUtPkNvbnN0Lk1heERyYXdCdWZmZXJzKSwgImdsX0ZyYWdEYXRhIik7CisgICB9CisKKyAgIC8qIGdsX0ZyYWdEZXB0aCBoYXMgYWx3YXlzIGJlZW4gaW4gZGVza3RvcCBHTFNMLCBidXQgZGlkIG5vdCBhcHBlYXIgaW4gR0xTTAorICAgICogRVMgMS4wMC4KKyAgICAqLworICAgaWYgKHN0YXRlLT5pc192ZXJzaW9uKDExMCwgMzAwKSkKKyAgICAgIGFkZF9vdXRwdXQoRlJBR19SRVNVTFRfREVQVEgsIGZsb2F0X3QsICJnbF9GcmFnRGVwdGgiKTsKKworICAgaWYgKHN0YXRlLT5BUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0X2VuYWJsZSkgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9CisgICAgICAgICBhZGRfb3V0cHV0KEZSQUdfUkVTVUxUX1NURU5DSUwsIGludF90LCAiZ2xfRnJhZ1N0ZW5jaWxSZWZBUkIiKTsKKyAgICAgIGlmIChzdGF0ZS0+QVJCX3NoYWRlcl9zdGVuY2lsX2V4cG9ydF93YXJuKQorICAgICAgICAgdmFyLT53YXJuX2V4dGVuc2lvbiA9ICJHTF9BUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0IjsKKyAgIH0KKworICAgaWYgKHN0YXRlLT5BTURfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0X2VuYWJsZSkgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9CisgICAgICAgICBhZGRfb3V0cHV0KEZSQUdfUkVTVUxUX1NURU5DSUwsIGludF90LCAiZ2xfRnJhZ1N0ZW5jaWxSZWZBTUQiKTsKKyAgICAgIGlmIChzdGF0ZS0+QU1EX3NoYWRlcl9zdGVuY2lsX2V4cG9ydF93YXJuKQorICAgICAgICAgdmFyLT53YXJuX2V4dGVuc2lvbiA9ICJHTF9BTURfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0IjsKKyAgIH0KKworICAgaWYgKHN0YXRlLT5BUkJfc2FtcGxlX3NoYWRpbmdfZW5hYmxlKSB7CisgICAgICBhZGRfc3lzdGVtX3ZhbHVlKFNZU1RFTV9WQUxVRV9TQU1QTEVfSUQsIGludF90LCAiZ2xfU2FtcGxlSUQiKTsKKyAgICAgIGFkZF9zeXN0ZW1fdmFsdWUoU1lTVEVNX1ZBTFVFX1NBTVBMRV9QT1MsIHZlYzJfdCwgImdsX1NhbXBsZVBvc2l0aW9uIik7CisgICAgICAvKiBGcm9tIHRoZSBBUkJfc2FtcGxlX3NoYWRpbmcgc3BlY2lmaWNhdGlvbjoKKyAgICAgICAqICAgICJUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSBpcyBjZWlsKDxzPi8zMiksIHdoZXJlCisgICAgICAgKiAgICA8cz4gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbG9yIHNhbXBsZXMgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAgICogICAgaW1wbGVtZW50YXRpb24uIgorICAgICAgICogU2luY2Ugbm8gZHJpdmVycyBleHBvc2UgbW9yZSB0aGFuIDMyeCBNU0FBLCB3ZSBjYW4gc2ltcGx5IHNldAorICAgICAgICogdGhlIGFycmF5IHNpemUgdG8gMSByYXRoZXIgdGhhbiBjb21wdXRpbmcgaXQuCisgICAgICAgKi8KKyAgICAgIGFkZF9vdXRwdXQoRlJBR19SRVNVTFRfU0FNUExFX01BU0ssIGFycmF5KGludF90LCAxKSwgImdsX1NhbXBsZU1hc2siKTsKKyAgIH0KKworICAgaWYgKHN0YXRlLT5BUkJfZ3B1X3NoYWRlcjVfZW5hYmxlKSB7CisgICAgICBhZGRfc3lzdGVtX3ZhbHVlKFNZU1RFTV9WQUxVRV9TQU1QTEVfTUFTS19JTiwgYXJyYXkoaW50X3QsIDEpLCAiZ2xfU2FtcGxlTWFza0luIik7CisgICB9Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSB2YXJpYWJsZXMgd2hpY2ggb25seSBleGlzdCBpbiBjb21wdXRlIHNoYWRlcnMuCisgKi8KK3ZvaWQKK2J1aWx0aW5fdmFyaWFibGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc19zcGVjaWFsX3ZhcnMoKQoreworICAgLyogVE9ETzogZmluaXNoIHRoaXMuICovCit9CisKKworLyoqCisgKiBBZGQgYSBzaW5nbGUgInZhcnlpbmciIHZhcmlhYmxlLiAgVGhlIHZhcmlhYmxlJ3MgdHlwZSBhbmQgZGlyZWN0aW9uIChpbnB1dAorICogb3Igb3V0cHV0KSBhcmUgYWRqdXN0ZWQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHNoYWRlciBiZWluZworICogY29tcGlsZWQuICBGb3IgZ2VvbWV0cnkgc2hhZGVycyB1c2luZyB7QVJCLEVYVH1fZ2VvbWV0cnlfc2hhZGVyNCwKKyAqIG5hbWVfYXNfZ3NfaW5wdXQgaXMgdXNlZCBmb3IgdGhlIGlucHV0ICh0byBhdm9pZCBhbWJpZ3VpdHkpLgorICovCit2b2lkCitidWlsdGluX3ZhcmlhYmxlX2dlbmVyYXRvcjo6YWRkX3ZhcnlpbmcoaW50IHNsb3QsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWVfYXNfZ3NfaW5wdXQpCit7CisgICBzd2l0Y2ggKHN0YXRlLT5zdGFnZSkgeworICAgY2FzZSBNRVNBX1NIQURFUl9HRU9NRVRSWToKKyAgICAgIHRoaXMtPnBlcl92ZXJ0ZXhfaW4uYWRkX2ZpZWxkKHNsb3QsIHR5cGUsIG5hbWUpOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgdGhpcy0+cGVyX3ZlcnRleF9vdXQuYWRkX2ZpZWxkKHNsb3QsIHR5cGUsIG5hbWUpOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0ZSQUdNRU5UOgorICAgICAgYWRkX2lucHV0KHNsb3QsIHR5cGUsIG5hbWUpOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0NPTVBVVEU6CisgICAgICAvKiBDb21wdXRlIHNoYWRlcnMgZG9uJ3QgaGF2ZSB2YXJ5aW5ncy4gKi8KKyAgICAgIGJyZWFrOworICAgfQorfQorCisKKy8qKgorICogR2VuZXJhdGUgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgZGF0YSBmcm9tIG9uZSBzaGFkZXIgc3RhZ2UKKyAqIHRvIHRoZSBuZXh0ICgidmFyeWluZ3MiKS4KKyAqLwordm9pZAorYnVpbHRpbl92YXJpYWJsZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3ZhcnlpbmdzKCkKK3sKKyNkZWZpbmUgQUREX1ZBUllJTkcobG9jLCB0eXBlLCBuYW1lKSBcCisgICBhZGRfdmFyeWluZyhsb2MsIHR5cGUsIG5hbWUsIG5hbWUgIkluIikKKworICAgLyogZ2xfUG9zaXRpb24gYW5kIGdsX1BvaW50U2l6ZSBhcmUgbm90IHZpc2libGUgZnJvbSBmcmFnbWVudCBzaGFkZXJzLiAqLworICAgaWYgKHN0YXRlLT5zdGFnZSAhPSBNRVNBX1NIQURFUl9GUkFHTUVOVCkgeworICAgICAgQUREX1ZBUllJTkcoVkFSWUlOR19TTE9UX1BPUywgdmVjNF90LCAiZ2xfUG9zaXRpb24iKTsKKyAgICAgIEFERF9WQVJZSU5HKFZBUllJTkdfU0xPVF9QU0laLCBmbG9hdF90LCAiZ2xfUG9pbnRTaXplIik7CisgICB9CisKKyAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDApKSB7CisgICAgICAgQUREX1ZBUllJTkcoVkFSWUlOR19TTE9UX0NMSVBfRElTVDAsIGFycmF5KGZsb2F0X3QsIDApLAorICAgICAgICAgICAgICAgICAgICJnbF9DbGlwRGlzdGFuY2UiKTsKKyAgIH0KKworICAgaWYgKGNvbXBhdGliaWxpdHkpIHsKKyAgICAgIEFERF9WQVJZSU5HKFZBUllJTkdfU0xPVF9URVgwLCBhcnJheSh2ZWM0X3QsIDApLCAiZ2xfVGV4Q29vcmQiKTsKKyAgICAgIEFERF9WQVJZSU5HKFZBUllJTkdfU0xPVF9GT0dDLCBmbG9hdF90LCAiZ2xfRm9nRnJhZ0Nvb3JkIik7CisgICAgICBpZiAoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UKSB7CisgICAgICAgICBBRERfVkFSWUlORyhWQVJZSU5HX1NMT1RfQ09MMCwgdmVjNF90LCAiZ2xfQ29sb3IiKTsKKyAgICAgICAgIEFERF9WQVJZSU5HKFZBUllJTkdfU0xPVF9DT0wxLCB2ZWM0X3QsICJnbF9TZWNvbmRhcnlDb2xvciIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIEFERF9WQVJZSU5HKFZBUllJTkdfU0xPVF9DTElQX1ZFUlRFWCwgdmVjNF90LCAiZ2xfQ2xpcFZlcnRleCIpOworICAgICAgICAgQUREX1ZBUllJTkcoVkFSWUlOR19TTE9UX0NPTDAsIHZlYzRfdCwgImdsX0Zyb250Q29sb3IiKTsKKyAgICAgICAgIEFERF9WQVJZSU5HKFZBUllJTkdfU0xPVF9CRkMwLCB2ZWM0X3QsICJnbF9CYWNrQ29sb3IiKTsKKyAgICAgICAgIEFERF9WQVJZSU5HKFZBUllJTkdfU0xPVF9DT0wxLCB2ZWM0X3QsICJnbF9Gcm9udFNlY29uZGFyeUNvbG9yIik7CisgICAgICAgICBBRERfVkFSWUlORyhWQVJZSU5HX1NMT1RfQkZDMSwgdmVjNF90LCAiZ2xfQmFja1NlY29uZGFyeUNvbG9yIik7CisgICAgICB9CisgICB9CisKKyAgIGlmIChzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlkpIHsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqcGVyX3ZlcnRleF9pbl90eXBlID0KKyAgICAgICAgIHRoaXMtPnBlcl92ZXJ0ZXhfaW4uY29uc3RydWN0X2ludGVyZmFjZV9pbnN0YW5jZSgpOworICAgICAgYWRkX3ZhcmlhYmxlKCJnbF9pbiIsIGFycmF5KHBlcl92ZXJ0ZXhfaW5fdHlwZSwgMCksCisgICAgICAgICAgICAgICAgICAgaXJfdmFyX3NoYWRlcl9pbiwgLTEpOworICAgfQorICAgaWYgKHN0YXRlLT5zdGFnZSA9PSBNRVNBX1NIQURFUl9WRVJURVggfHwgc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0dFT01FVFJZKSB7CisgICAgICBjb25zdCBnbHNsX3R5cGUgKnBlcl92ZXJ0ZXhfb3V0X3R5cGUgPQorICAgICAgICAgdGhpcy0+cGVyX3ZlcnRleF9vdXQuY29uc3RydWN0X2ludGVyZmFjZV9pbnN0YW5jZSgpOworICAgICAgY29uc3QgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkcyA9IHBlcl92ZXJ0ZXhfb3V0X3R5cGUtPmZpZWxkcy5zdHJ1Y3R1cmU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGVyX3ZlcnRleF9vdXRfdHlwZS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPQorICAgICAgICAgICAgYWRkX3ZhcmlhYmxlKGZpZWxkc1tpXS5uYW1lLCBmaWVsZHNbaV0udHlwZSwgaXJfdmFyX3NoYWRlcl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldLmxvY2F0aW9uKTsKKyAgICAgICAgIHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uID0gZmllbGRzW2ldLmludGVycG9sYXRpb247CisgICAgICAgICB2YXItPmRhdGEuY2VudHJvaWQgPSBmaWVsZHNbaV0uY2VudHJvaWQ7CisgICAgICAgICB2YXItPmRhdGEuc2FtcGxlID0gZmllbGRzW2ldLnNhbXBsZTsKKyAgICAgICAgIHZhci0+aW5pdF9pbnRlcmZhY2VfdHlwZShwZXJfdmVydGV4X291dF90eXBlKTsKKyAgICAgIH0KKyAgIH0KK30KKworCit9OyAvKiBBbm9ueW1vdXMgbmFtZXNwYWNlICovCisKKwordm9pZAorX21lc2FfZ2xzbF9pbml0aWFsaXplX3ZhcmlhYmxlcyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCQlzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBidWlsdGluX3ZhcmlhYmxlX2dlbmVyYXRvciBnZW4oaW5zdHJ1Y3Rpb25zLCBzdGF0ZSk7CisKKyAgIGdlbi5nZW5lcmF0ZV9jb25zdGFudHMoKTsKKyAgIGdlbi5nZW5lcmF0ZV91bmlmb3JtcygpOworCisgICBnZW4uZ2VuZXJhdGVfdmFyeWluZ3MoKTsKKworICAgc3dpdGNoIChzdGF0ZS0+c3RhZ2UpIHsKKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgZ2VuLmdlbmVyYXRlX3ZzX3NwZWNpYWxfdmFycygpOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0dFT01FVFJZOgorICAgICAgZ2VuLmdlbmVyYXRlX2dzX3NwZWNpYWxfdmFycygpOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0ZSQUdNRU5UOgorICAgICAgZ2VuLmdlbmVyYXRlX2ZzX3NwZWNpYWxfdmFycygpOworICAgICAgYnJlYWs7CisgICBjYXNlIE1FU0FfU0hBREVSX0NPTVBVVEU6CisgICAgICBnZW4uZ2VuZXJhdGVfY3Nfc3BlY2lhbF92YXJzKCk7CisgICAgICBicmVhazsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvY29tcGlsZXJfaW50ZXJmYWNlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvY29tcGlsZXJfaW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk0MjIzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9jb21waWxlcl9pbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsNDg3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBTdGV2ZSBLIDxzcmtATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImljZC1zcHYuaCIKKyNpbmNsdWRlICJwaXBlbGluZS5oIgorI2luY2x1ZGUgImNvbXBpbGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL21lc2EtdXRpbHMvc3JjL2dsc2wvcmFsbG9jLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvbWVzYS11dGlscy9zcmMvZ2xzbC9nbHNsX3BhcnNlcl9leHRyYXMuaCIKKyNpbmNsdWRlICJjb21waWxlci9zaGFkZXIvcHJvZ3JhbS5oIgorI2luY2x1ZGUgImNvbXBpbGVyL21lc2EtdXRpbHMvc3JjL21lc2EvbWFpbi9jb250ZXh0LmgiCisjaW5jbHVkZSAiY29tcGlsZXIvbWVzYS11dGlscy9zcmMvbWVzYS9tYWluL2NvbmZpZy5oIgorI2luY2x1ZGUgImNvbXBpbGVyL3NoYWRlci9zdGFuZGFsb25lX3NjYWZmb2xkaW5nLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3dtLmgiCisjaW5jbHVkZSAiY29tcGlsZXIvcGlwZWxpbmUvYnJ3X3NoYWRlci5oIgorI2luY2x1ZGUgIlNQSVJWL3NwaXJ2LmhwcCIKKworLyoqCisgKiBJbml0IHZlcnRleC9mcmFnbWVudC9nZW9tZXRyeSBwcm9ncmFtIGxpbWl0cy4KKyAqIEJhc2Ugb24gaW5pdF9wcm9ncmFtX2xpbWl0cygpCisgKi8KK3ZvaWQgaW5pdF9tZXNhX3Byb2dyYW1fbGltaXRzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIGdsX3NoYWRlcl9zdGFnZSBzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtX2NvbnN0YW50cyAqcHJvZykKK3sKKyAgICBwcm9nLT5NYXhJbnN0cnVjdGlvbnMgPSBNQVhfUFJPR1JBTV9JTlNUUlVDVElPTlM7CisgICAgcHJvZy0+TWF4QWx1SW5zdHJ1Y3Rpb25zID0gTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TOworICAgIHByb2ctPk1heFRleEluc3RydWN0aW9ucyA9IE1BWF9QUk9HUkFNX0lOU1RSVUNUSU9OUzsKKyAgICBwcm9nLT5NYXhUZXhJbmRpcmVjdGlvbnMgPSBNQVhfUFJPR1JBTV9JTlNUUlVDVElPTlM7CisgICAgcHJvZy0+TWF4VGVtcHMgPSBNQVhfUFJPR1JBTV9URU1QUzsKKyAgICBwcm9nLT5NYXhFbnZQYXJhbXMgPSBNQVhfUFJPR1JBTV9FTlZfUEFSQU1TOworICAgIHByb2ctPk1heExvY2FsUGFyYW1zID0gTUFYX1BST0dSQU1fTE9DQUxfUEFSQU1TOworICAgIHByb2ctPk1heEFkZHJlc3NPZmZzZXQgPSBNQVhfUFJPR1JBTV9MT0NBTF9QQVJBTVM7CisKKyAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgY2FzZSBNRVNBX1NIQURFUl9WRVJURVg6CisgICAgICAgIHByb2ctPk1heFBhcmFtZXRlcnMgPSBNQVhfVkVSVEVYX1BST0dSQU1fUEFSQU1TOworICAgICAgICBwcm9nLT5NYXhBdHRyaWJzID0gTUFYX1ZFUlRFWF9HRU5FUklDX0FUVFJJQlM7CisgICAgICAgIHByb2ctPk1heEFkZHJlc3NSZWdzID0gTUFYX1ZFUlRFWF9QUk9HUkFNX0FERFJFU1NfUkVHUzsKKyAgICAgICAgcHJvZy0+TWF4VW5pZm9ybUNvbXBvbmVudHMgPSA0ICogTUFYX1VOSUZPUk1TOworICAgICAgICBwcm9nLT5NYXhJbnB1dENvbXBvbmVudHMgPSAwOyAvKiB2YWx1ZSBub3QgdXNlZCAqLworICAgICAgICBwcm9nLT5NYXhPdXRwdXRDb21wb25lbnRzID0gMTYgKiA0OyAvKiBvbGQgbGltaXQgbm90IHRvIGJyZWFrIHRubCBhbmQgc3dyYXN0ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVTQV9TSEFERVJfRlJBR01FTlQ6CisgICAgICAgIHByb2ctPk1heFBhcmFtZXRlcnMgPSBNQVhfTlZfRlJBR01FTlRfUFJPR1JBTV9QQVJBTVM7CisgICAgICAgIHByb2ctPk1heEF0dHJpYnMgPSBNQVhfTlZfRlJBR01FTlRfUFJPR1JBTV9JTlBVVFM7CisgICAgICAgIHByb2ctPk1heEFkZHJlc3NSZWdzID0gTUFYX0ZSQUdNRU5UX1BST0dSQU1fQUREUkVTU19SRUdTOworICAgICAgICBwcm9nLT5NYXhVbmlmb3JtQ29tcG9uZW50cyA9IDQgKiBNQVhfVU5JRk9STVM7CisgICAgICAgIHByb2ctPk1heElucHV0Q29tcG9uZW50cyA9IDE2ICogNDsgLyogb2xkIGxpbWl0IG5vdCB0byBicmVhayB0bmwgYW5kIHN3cmFzdCAqLworICAgICAgICBwcm9nLT5NYXhPdXRwdXRDb21wb25lbnRzID0gMDsgLyogdmFsdWUgbm90IHVzZWQgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRVNBX1NIQURFUl9HRU9NRVRSWToKKyAgICAgICAgcHJvZy0+TWF4UGFyYW1ldGVycyA9IE1BWF9WRVJURVhfUFJPR1JBTV9QQVJBTVM7CisgICAgICAgIHByb2ctPk1heEF0dHJpYnMgPSBNQVhfVkVSVEVYX0dFTkVSSUNfQVRUUklCUzsKKyAgICAgICAgcHJvZy0+TWF4QWRkcmVzc1JlZ3MgPSBNQVhfVkVSVEVYX1BST0dSQU1fQUREUkVTU19SRUdTOworICAgICAgICBwcm9nLT5NYXhVbmlmb3JtQ29tcG9uZW50cyA9IDQgKiBNQVhfVU5JRk9STVM7CisgICAgICAgIHByb2ctPk1heElucHV0Q29tcG9uZW50cyA9IDE2ICogNDsgLyogb2xkIGxpbWl0IG5vdCB0byBicmVhayB0bmwgYW5kIHN3cmFzdCAqLworICAgICAgICBwcm9nLT5NYXhPdXRwdXRDb21wb25lbnRzID0gMTYgKiA0OyAvKiBvbGQgbGltaXQgbm90IHRvIGJyZWFrIHRubCBhbmQgc3dyYXN0ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVTQV9TSEFERVJfQ09NUFVURToKKyAgICAgICAgcHJvZy0+TWF4UGFyYW1ldGVycyA9IDA7IC8qIG5vdCBtZWFuaW5nZnVsIGZvciBjb21wdXRlIHNoYWRlcnMgKi8KKyAgICAgICAgcHJvZy0+TWF4QXR0cmlicyA9IDA7IC8qIG5vdCBtZWFuaW5nZnVsIGZvciBjb21wdXRlIHNoYWRlcnMgKi8KKyAgICAgICAgcHJvZy0+TWF4QWRkcmVzc1JlZ3MgPSAwOyAvKiBub3QgbWVhbmluZ2Z1bCBmb3IgY29tcHV0ZSBzaGFkZXJzICovCisgICAgICAgIHByb2ctPk1heFVuaWZvcm1Db21wb25lbnRzID0gNCAqIE1BWF9VTklGT1JNUzsKKyAgICAgICAgcHJvZy0+TWF4SW5wdXRDb21wb25lbnRzID0gMDsgLyogbm90IG1lYW5pbmdmdWwgZm9yIGNvbXB1dGUgc2hhZGVycyAqLworICAgICAgICBwcm9nLT5NYXhPdXRwdXRDb21wb25lbnRzID0gMDsgLyogbm90IG1lYW5pbmdmdWwgZm9yIGNvbXB1dGUgc2hhZGVycyAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiQmFkIHNoYWRlciBzdGFnZSBpbiBpbml0X3Byb2dyYW1fbGltaXRzKCkiKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIG5hdGl2ZSBsaW1pdHMgdG8gemVyby4gIFRoaXMgaW1wbGllcyB0aGF0IHRoZXJlIGlzIG5vIG5hdGl2ZQorICAgICAgICAqIHN1cHBvcnQgZm9yIHNoYWRlcnMuICBMZXQgdGhlIGRyaXZlcnMgZmlsbCBpbiB0aGUgYWN0dWFsIHZhbHVlcy4KKyAgICAgICAgKi8KKyAgICBwcm9nLT5NYXhOYXRpdmVJbnN0cnVjdGlvbnMgPSAwOworICAgIHByb2ctPk1heE5hdGl2ZUFsdUluc3RydWN0aW9ucyA9IDA7CisgICAgcHJvZy0+TWF4TmF0aXZlVGV4SW5zdHJ1Y3Rpb25zID0gMDsKKyAgICBwcm9nLT5NYXhOYXRpdmVUZXhJbmRpcmVjdGlvbnMgPSAwOworICAgIHByb2ctPk1heE5hdGl2ZUF0dHJpYnMgPSAwOworICAgIHByb2ctPk1heE5hdGl2ZVRlbXBzID0gMDsKKyAgICBwcm9nLT5NYXhOYXRpdmVBZGRyZXNzUmVncyA9IDA7CisgICAgcHJvZy0+TWF4TmF0aXZlUGFyYW1ldGVycyA9IDA7CisKKyAgICAvKiBTZXQgR0xTTCBkYXRhdHlwZSByYW5nZS9wcmVjaXNpb24gaW5mbyBhc3N1bWluZyBJRUVFIGZsb2F0IHZhbHVlcy4KKyAgICAgICAgKiBEcml2ZXJzIHNob3VsZCBvdmVycmlkZSB0aGVzZSBkZWZhdWx0cyBhcyBuZWVkZWQuCisgICAgICAgICovCisgICAgcHJvZy0+TWVkaXVtRmxvYXQuUmFuZ2VNaW4gPSAxMjc7CisgICAgcHJvZy0+TWVkaXVtRmxvYXQuUmFuZ2VNYXggPSAxMjc7CisgICAgcHJvZy0+TWVkaXVtRmxvYXQuUHJlY2lzaW9uID0gMjM7CisgICAgcHJvZy0+TG93RmxvYXQgPSBwcm9nLT5IaWdoRmxvYXQgPSBwcm9nLT5NZWRpdW1GbG9hdDsKKworICAgIC8qIEFzc3VtZSBpbnRzIGFyZSBzdG9yZWQgYXMgZmxvYXRzIGZvciBub3csIHNpbmNlIHRoaXMgaXMgdGhlIGxlYXN0LWNvbW1vbgorICAgICAgICAqIGRlbm9taW5hdG9yLiAgVGhlIE9wZW5HTCBFUyBzcGVjIGltcGxpZXMgKHBhZ2UgMTMyKSB0aGF0IHRoZSBwcmVjaXNpb24KKyAgICAgICAgKiBvZiBpbnRlZ2VyIHR5cGVzIHNob3VsZCBiZSAwLiAgUHJhY3RpY2FsbHkgc3BlYWtpbmcsIElFRUUKKyAgICAgICAgKiBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBjYW4gb25seSBzdG9yZSBpbnRlZ2VycyBpbiB0aGUKKyAgICAgICAgKiByYW5nZSBbLTB4MDEwMDAwMDAsIDB4MDEwMDAwMDBdIHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24uCisgICAgICAgICovCisgICAgcHJvZy0+TWVkaXVtSW50LlJhbmdlTWluID0gMjQ7CisgICAgcHJvZy0+TWVkaXVtSW50LlJhbmdlTWF4ID0gMjQ7CisgICAgcHJvZy0+TWVkaXVtSW50LlByZWNpc2lvbiA9IDA7CisgICAgcHJvZy0+TG93SW50ID0gcHJvZy0+SGlnaEludCA9IHByb2ctPk1lZGl1bUludDsKKworICAgIHByb2ctPk1heFVuaWZvcm1CbG9ja3MgPSAxMjsKKyAgICBwcm9nLT5NYXhDb21iaW5lZFVuaWZvcm1Db21wb25lbnRzID0gKHByb2ctPk1heFVuaWZvcm1Db21wb25lbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Q29uc3QuTWF4VW5pZm9ybUJsb2NrU2l6ZSAvIDQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZy0+TWF4VW5pZm9ybUJsb2Nrcyk7CisKKyAgICBwcm9nLT5NYXhBdG9taWNCdWZmZXJzID0gMDsKKyAgICBwcm9nLT5NYXhBdG9taWNDb3VudGVycyA9IDA7Cit9CisKKy8vIENvcGllZCBmcm9tIGNvbnRleHQuYzpfbWVzYV9pbml0X2NvbnN0YW50cwordm9pZAoraW5pdGlhbGl6ZV9tZXNhX2NvbnN0YW50cyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KQoreworICAgaW50IGk7CisgICBhc3NlcnQoY3R4KTsKKworICAgLyogQ29uc3RhbnRzLCBtYXkgYmUgb3ZlcnJpZGVuICh1c3VhbGx5IG9ubHkgcmVkdWNlZCkgYnkgZGV2aWNlIGRyaXZlcnMgKi8KKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZU1ieXRlcyA9IE1BWF9URVhUVVJFX01CWVRFUzsKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZUxldmVscyA9IE1BWF9URVhUVVJFX0xFVkVMUzsKKyAgIGN0eC0+Q29uc3QuTWF4M0RUZXh0dXJlTGV2ZWxzID0gTUFYXzNEX1RFWFRVUkVfTEVWRUxTOworICAgY3R4LT5Db25zdC5NYXhDdWJlVGV4dHVyZUxldmVscyA9IE1BWF9DVUJFX1RFWFRVUkVfTEVWRUxTOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlUmVjdFNpemUgPSBNQVhfVEVYVFVSRV9SRUNUX1NJWkU7CisgICBjdHgtPkNvbnN0Lk1heEFycmF5VGV4dHVyZUxheWVycyA9IE1BWF9BUlJBWV9URVhUVVJFX0xBWUVSUzsKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHMgPSBNQVhfVEVYVFVSRV9DT09SRF9VTklUUzsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzsKKyAgIGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzID0gTUlOMihjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHMpOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlTWF4QW5pc290cm9weSA9IE1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlTG9kQmlhcyA9IE1BWF9URVhUVVJFX0xPRF9CSUFTOworICAgY3R4LT5Db25zdC5NYXhUZXh0dXJlQnVmZmVyU2l6ZSA9IDY1NTM2OworICAgY3R4LT5Db25zdC5UZXh0dXJlQnVmZmVyT2Zmc2V0QWxpZ25tZW50ID0gMTsKKyAgIGN0eC0+Q29uc3QuTWF4QXJyYXlMb2NrU2l6ZSA9IE1BWF9BUlJBWV9MT0NLX1NJWkU7CisgICBjdHgtPkNvbnN0LlN1YlBpeGVsQml0cyA9IFNVQl9QSVhFTF9CSVRTOworICAgY3R4LT5Db25zdC5NaW5Qb2ludFNpemUgPSBNSU5fUE9JTlRfU0laRTsKKyAgIGN0eC0+Q29uc3QuTWF4UG9pbnRTaXplID0gTUFYX1BPSU5UX1NJWkU7CisgICBjdHgtPkNvbnN0Lk1pblBvaW50U2l6ZUFBID0gTUlOX1BPSU5UX1NJWkU7CisgICBjdHgtPkNvbnN0Lk1heFBvaW50U2l6ZUFBID0gTUFYX1BPSU5UX1NJWkU7CisgICBjdHgtPkNvbnN0LlBvaW50U2l6ZUdyYW51bGFyaXR5ID0gKEdMZmxvYXQpIFBPSU5UX1NJWkVfR1JBTlVMQVJJVFk7CisgICBjdHgtPkNvbnN0Lk1pbkxpbmVXaWR0aCA9IE1JTl9MSU5FX1dJRFRIOworICAgY3R4LT5Db25zdC5NYXhMaW5lV2lkdGggPSBNQVhfTElORV9XSURUSDsKKyAgIGN0eC0+Q29uc3QuTWluTGluZVdpZHRoQUEgPSBNSU5fTElORV9XSURUSDsKKyAgIGN0eC0+Q29uc3QuTWF4TGluZVdpZHRoQUEgPSBNQVhfTElORV9XSURUSDsKKyAgIGN0eC0+Q29uc3QuTGluZVdpZHRoR3JhbnVsYXJpdHkgPSAoR0xmbG9hdCkgTElORV9XSURUSF9HUkFOVUxBUklUWTsKKyAgIGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lcyA9IDY7CisgICBjdHgtPkNvbnN0Lk1heExpZ2h0cyA9IE1BWF9MSUdIVFM7CisgICBjdHgtPkNvbnN0Lk1heFNoaW5pbmVzcyA9IDEyOC4wOworICAgY3R4LT5Db25zdC5NYXhTcG90RXhwb25lbnQgPSAxMjguMDsKKyAgIGN0eC0+Q29uc3QuTWF4Vmlld3BvcnRXaWR0aCA9IE1BWF9WSUVXUE9SVF9XSURUSDsKKyAgIGN0eC0+Q29uc3QuTWF4Vmlld3BvcnRIZWlnaHQgPSBNQVhfVklFV1BPUlRfSEVJR0hUOworICAgY3R4LT5Db25zdC5NaW5NYXBCdWZmZXJBbGlnbm1lbnQgPSA2NDsKKworICAgLyogRHJpdmVyIG11c3Qgb3ZlcnJpZGUgdGhlc2UgdmFsdWVzIGlmIEFSQl92aWV3cG9ydF9hcnJheSBpcyBzdXBwb3J0ZWQuICovCisgICBjdHgtPkNvbnN0Lk1heFZpZXdwb3J0cyA9IDE7CisgICBjdHgtPkNvbnN0LlZpZXdwb3J0U3VicGl4ZWxCaXRzID0gMDsKKyAgIGN0eC0+Q29uc3QuVmlld3BvcnRCb3VuZHMuTWluID0gMDsKKyAgIGN0eC0+Q29uc3QuVmlld3BvcnRCb3VuZHMuTWF4ID0gMDsKKworICAgLyoqIEdMX0FSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QgKi8KKyAgIGN0eC0+Q29uc3QuTWF4Q29tYmluZWRVbmlmb3JtQmxvY2tzID0gMzY7CisgICBjdHgtPkNvbnN0Lk1heFVuaWZvcm1CdWZmZXJCaW5kaW5ncyA9IDM2OworICAgY3R4LT5Db25zdC5NYXhVbmlmb3JtQmxvY2tTaXplID0gMTYzODQ7CisgICBjdHgtPkNvbnN0LlVuaWZvcm1CdWZmZXJPZmZzZXRBbGlnbm1lbnQgPSAxOworCisgICBmb3IgKGkgPSAwOyBpIDwgTUVTQV9TSEFERVJfU1RBR0VTOyBpKyspCisgICAgICBpbml0X21lc2FfcHJvZ3JhbV9saW1pdHMoY3R4LCAoZ2xfc2hhZGVyX3N0YWdlKWksICZjdHgtPkNvbnN0LlByb2dyYW1baV0pOworCisgICBjdHgtPkNvbnN0Lk1heFByb2dyYW1NYXRyaWNlcyA9IE1BWF9QUk9HUkFNX01BVFJJQ0VTOworICAgY3R4LT5Db25zdC5NYXhQcm9ncmFtTWF0cml4U3RhY2tEZXB0aCA9IE1BWF9QUk9HUkFNX01BVFJJWF9TVEFDS19ERVBUSDsKKworICAgLyogQ2hlY2tBcnJheUJvdW5kcyBpcyBvdmVycmlkZW4gYnkgZHJpdmVycy94MTEgZm9yIFggc2VydmVyICovCisgICBjdHgtPkNvbnN0LkNoZWNrQXJyYXlCb3VuZHMgPSBHTF9GQUxTRTsKKworICAgLyogR0xfQVJCX2RyYXdfYnVmZmVycyAqLworICAgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycyA9IE1BWF9EUkFXX0JVRkZFUlM7CisKKyAgIGN0eC0+Q29uc3QuTWF4Q29sb3JBdHRhY2htZW50cyA9IE1BWF9DT0xPUl9BVFRBQ0hNRU5UUzsKKyAgIGN0eC0+Q29uc3QuTWF4UmVuZGVyYnVmZmVyU2l6ZSA9IE1BWF9SRU5ERVJCVUZGRVJfU0laRTsKKworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzsKKyAgIGN0eC0+Q29uc3QuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOworICAgY3R4LT5Db25zdC5NYXhWYXJ5aW5nID0gMTY7IC8qIG9sZCBsaW1pdCBub3QgdG8gYnJlYWsgdG5sIGFuZCBzd3Jhc3QgKi8KKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSBNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzsKKyAgIGN0eC0+Q29uc3QuTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyA9IE1BWF9HRU9NRVRSWV9PVVRQVVRfVkVSVElDRVM7CisgICBjdHgtPkNvbnN0Lk1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzID0gTUFYX0dFT01FVFJZX1RPVEFMX09VVFBVVF9DT01QT05FTlRTOworCisgICAvKiBTaGFkaW5nIGxhbmd1YWdlIHZlcnNpb24gKi8KKyAgIGN0eC0+Q29uc3QuR0xTTFZlcnNpb24gPSAxNDA7CisKKyAgIC8qIEdMX0FSQl9mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKyAgIGN0eC0+Q29uc3QuTWF4U2FtcGxlcyA9IDA7CisKKyAgIC8qIEdMX0FSQl9zeW5jICovCisgICBjdHgtPkNvbnN0Lk1heFNlcnZlcldhaXRUaW1lb3V0ID0gMHgxZmZmN2ZmZmZmZmZVTEw7CisKKyAgIC8qIEdMX0FUSV9lbnZtYXBfYnVtcG1hcCAqLworICAgY3R4LT5Db25zdC5TdXBwb3J0ZWRCdW1wVW5pdHMgPSBTVVBQT1JURURfQVRJX0JVTVBfVU5JVFM7CisKKyAgIC8qIEdMX0VYVF9wcm92b2tpbmdfdmVydGV4ICovCisgICBjdHgtPkNvbnN0LlF1YWRzRm9sbG93UHJvdm9raW5nVmVydGV4Q29udmVudGlvbiA9IEdMX1RSVUU7CisKKyAgIC8qIEdMX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sgKi8KKyAgIGN0eC0+Q29uc3QuTWF4VHJhbnNmb3JtRmVlZGJhY2tCdWZmZXJzID0gTUFYX0ZFRURCQUNLX0JVRkZFUlM7CisgICBjdHgtPkNvbnN0Lk1heFRyYW5zZm9ybUZlZWRiYWNrU2VwYXJhdGVDb21wb25lbnRzID0gNCAqIE1BWF9GRUVEQkFDS19BVFRSSUJTOworICAgY3R4LT5Db25zdC5NYXhUcmFuc2Zvcm1GZWVkYmFja0ludGVybGVhdmVkQ29tcG9uZW50cyA9IDQgKiBNQVhfRkVFREJBQ0tfQVRUUklCUzsKKyAgIGN0eC0+Q29uc3QuTWF4VmVydGV4U3RyZWFtcyA9IDE7CisKKyAgIC8qIEdMIDMuMiAgKi8KKyAgIGN0eC0+Q29uc3QuUHJvZmlsZU1hc2sgPSAoY3R4LT5BUEkgPT0gQVBJX09QRU5HTF9DT1JFIHx8IGN0eC0+QVBJID09IEFQSV9WSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHTF9DT05URVhUX0NPUkVfUFJPRklMRV9CSVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHTF9DT05URVhUX0NPTVBBVElCSUxJVFlfUFJPRklMRV9CSVQ7CisKKyAgIC8qKiBHTF9FWFRfZ3B1X3NoYWRlcjQgKi8KKyAgIGN0eC0+Q29uc3QuTWluUHJvZ3JhbVRleGVsT2Zmc2V0ID0gLTg7CisgICBjdHgtPkNvbnN0Lk1heFByb2dyYW1UZXhlbE9mZnNldCA9IDc7CisKKyAgIC8qIEdMX0FSQl90ZXh0dXJlX2dhdGhlciAqLworICAgY3R4LT5Db25zdC5NaW5Qcm9ncmFtVGV4dHVyZUdhdGhlck9mZnNldCA9IC04OworICAgY3R4LT5Db25zdC5NYXhQcm9ncmFtVGV4dHVyZUdhdGhlck9mZnNldCA9IDc7CisKKyAgIC8qIEdMX0FSQl9yb2J1c3RuZXNzICovCisgICBjdHgtPkNvbnN0LlJlc2V0U3RyYXRlZ3kgPSBHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fQVJCOworCisgICAvKiBQcmltaXRpdmVSZXN0YXJ0ICovCisgICBjdHgtPkNvbnN0LlByaW1pdGl2ZVJlc3RhcnRJblNvZnR3YXJlID0gR0xfRkFMU0U7CisKKyAgIC8qIEVTIDMuMCBvciBBUkJfRVMzX2NvbXBhdGliaWxpdHkgKi8KKyAgIGN0eC0+Q29uc3QuTWF4RWxlbWVudEluZGV4ID0gMHhmZmZmZmZmZnU7CisKKyAgIC8qIEdMX0FSQl90ZXh0dXJlX211bHRpc2FtcGxlICovCisgICBjdHgtPkNvbnN0Lk1heENvbG9yVGV4dHVyZVNhbXBsZXMgPSAxOworICAgY3R4LT5Db25zdC5NYXhEZXB0aFRleHR1cmVTYW1wbGVzID0gMTsKKyAgIGN0eC0+Q29uc3QuTWF4SW50ZWdlclNhbXBsZXMgPSAxOworCisgICAvKiBHTF9BUkJfc2hhZGVyX2F0b21pY19jb3VudGVycyAqLworICAgY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5ncyA9IE1BWF9DT01CSU5FRF9BVE9NSUNfQlVGRkVSUzsKKyAgIGN0eC0+Q29uc3QuTWF4QXRvbWljQnVmZmVyU2l6ZSA9IE1BWF9BVE9NSUNfQ09VTlRFUlMgKiBBVE9NSUNfQ09VTlRFUl9TSVpFOworICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZEF0b21pY0J1ZmZlcnMgPSBNQVhfQ09NQklORURfQVRPTUlDX0JVRkZFUlM7CisgICBjdHgtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQ291bnRlcnMgPSBNQVhfQVRPTUlDX0NPVU5URVJTOworCisgICAvKiBHTF9BUkJfdmVydGV4X2F0dHJpYl9iaW5kaW5nICovCisgICBjdHgtPkNvbnN0Lk1heFZlcnRleEF0dHJpYlJlbGF0aXZlT2Zmc2V0ID0gMjA0NzsKKyAgIGN0eC0+Q29uc3QuTWF4VmVydGV4QXR0cmliQmluZGluZ3MgPSBNQVhfVkVSVEVYX0dFTkVSSUNfQVRUUklCUzsKKworICAgLyogR0xfQVJCX2NvbXB1dGVfc2hhZGVyICovCisgICBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSA9IDY1NTM1OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gPSA2NTUzNTsKKyAgIGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdID0gNjU1MzU7CisgICBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV0gPSAxMDI0OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSA9IDY0OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMgPSAxMDI0OworCisgICAvKiogR0xfQVJCX2dwdV9zaGFkZXI1ICovCisgICBjdHgtPkNvbnN0Lk1pbkZyYWdtZW50SW50ZXJwb2xhdGlvbk9mZnNldCA9IE1JTl9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVDsKKyAgIGN0eC0+Q29uc3QuTWF4RnJhZ21lbnRJbnRlcnBvbGF0aW9uT2Zmc2V0ID0gTUFYX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUOworCisgICBjdHgtPkNvbnN0LkdsYXNzTW9kZSA9IDA7Cit9CisKK3ZvaWQgaW5pdGlhbGl6ZV9tZXNhX2NvbnRleHRfdG9fZGVmYXVsdHMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCkKK3sKKyAgIG1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7CisKKyAgIGN0eC0+QVBJID0gQVBJX1ZLOworCisgICBjdHgtPkV4dGVuc2lvbnMuZHVtbXlfZmFsc2UgPSBmYWxzZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5kdW1teV90cnVlID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfY29tcHV0ZV9zaGFkZXIgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9jb25zZXJ2YXRpdmVfZGVwdGggPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9kcmF3X2luc3RhbmNlZCA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX0VTMl9jb21wYXRpYmlsaXR5ID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfRVMzX2NvbXBhdGliaWxpdHkgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24gPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucyA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2dwdV9zaGFkZXI1ID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2FtcGxlX3NoYWRpbmcgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9zaGFkZXJfYml0X2VuY29kaW5nID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0ID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGVyX3RleHR1cmVfbG9kID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGluZ19sYW5ndWFnZV9wYWNraW5nID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheSA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfZ2F0aGVyID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9tdWx0aXNhbXBsZSA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfcXVlcnlfbGV2ZWxzID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdGV4dHVyZV9xdWVyeV9sb2QgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl92aWV3cG9ydF9hcnJheSA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfc2hhZGVyX2ludGVnZXJfbWl4ID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfdGV4dHVyZTNEID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5FWFRfdGV4dHVyZV9hcnJheSA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuTlZfdGV4dHVyZV9yZWN0YW5nbGUgPSB0cnVlOworCisgICAvLyBTZXQgc29tZSBpbml0aWFsIGNvbnN0YW50cywgb3ZlcnJpZGUgYXMgbmVlZGVkCisgICBpbml0aWFsaXplX21lc2FfY29uc3RhbnRzKCBjdHggKTsKKworICAgLyogU2V0IHVwIGRlZmF1bHQgc2hhZGVyIGNvbXBpbGVyIG9wdGlvbnMuICovCisgICBzdHJ1Y3QgZ2xfc2hhZGVyX2NvbXBpbGVyX29wdGlvbnMgb3B0aW9uczsKKyAgIG1lbXNldCgmb3B0aW9ucywgMCwgc2l6ZW9mKG9wdGlvbnMpKTsKKyAgIG9wdGlvbnMuTWF4VW5yb2xsSXRlcmF0aW9ucyA9IDMyOworICAgb3B0aW9ucy5NYXhJZkRlcHRoID0gVUlOVF9NQVg7CisKKyAgIC8qIERlZmF1bHQgcHJhZ21hIHNldHRpbmdzICovCisgICBvcHRpb25zLkRlZmF1bHRQcmFnbWFzLk9wdGltaXplID0gdHJ1ZTsKKworICAgZm9yIChpbnQgc2ggPSAwOyBzaCA8IE1FU0FfU0hBREVSX1NUQUdFUzsgKytzaCkKKyAgICAgIG1lbWNweSgmY3R4LT5TaGFkZXJDb21waWxlck9wdGlvbnNbc2hdLCAmb3B0aW9ucywgc2l6ZW9mKG9wdGlvbnMpKTsKKworCisgICBjdHgtPkRyaXZlci5OZXdTaGFkZXIgPSBfbWVzYV9uZXdfc2hhZGVyOworICAgY3R4LT5Ecml2ZXIuRGVsZXRlU2hhZGVyID0gX21lc2FfZGVsZXRlX3NoYWRlcjsKK30KKworCitleHRlcm4gIkMiIHsKKworLy8gaW52b2tlIGZyb250IGVuZCBjb21waWxlciB0byBnZW5lcmF0ZSBhbiBpbmRlcGVuZGVudGx5IGxpbmtlZAorLy8gcHJvZ3JhbSBvYmplY3QgdGhhdCBjb250YWlucyBNZXNhIEhJUgorc3RydWN0IGludGVsX2lyICpzaGFkZXJfY3JlYXRlX2lyKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb2RlLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpCit7CisgICAgc3RydWN0IGljZF9zcHZfaGVhZGVyIGhlYWRlcjsKKyAgICBzdHJ1Y3QgZ2xfY29udGV4dCBsb2NhbF9jdHg7CisgICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eCA9ICZsb2NhbF9jdHg7CisKKyAgICBtZW1jcHkoJmhlYWRlciwgY29kZSwgc2l6ZW9mKGhlYWRlcikpOworICAgIGlmIChoZWFkZXIubWFnaWMgIT0gSUNEX1NQVl9NQUdJQykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfbWVzYV9jcmVhdGVfc2hhZGVyX2NvbXBpbGVyKCk7CisgICAgaW5pdGlhbGl6ZV9tZXNhX2NvbnRleHRfdG9fZGVmYXVsdHMoY3R4KTsKKworICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqc2hhZGVyX3Byb2dyYW0gPSBicndfbmV3X3NoYWRlcl9wcm9ncmFtKGN0eCwgMCk7CisgICAgYXNzZXJ0KHNoYWRlcl9wcm9ncmFtICE9IE5VTEwpOworCisgICAgc2hhZGVyX3Byb2dyYW0tPkluZm9Mb2cgPSByYWxsb2Nfc3RyZHVwKHNoYWRlcl9wcm9ncmFtLCAiIik7CisgICAgc2hhZGVyX3Byb2dyYW0tPlNoYWRlcnMgPQorICAgIHJlcmFsbG9jKHNoYWRlcl9wcm9ncmFtLCBzaGFkZXJfcHJvZ3JhbS0+U2hhZGVycywKKyAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqLCBzaGFkZXJfcHJvZ3JhbS0+TnVtU2hhZGVycyArIDEpOworICAgIGFzc2VydChzaGFkZXJfcHJvZ3JhbS0+U2hhZGVycyAhPSBOVUxMKTsKKworICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciA9IHJ6YWxsb2Moc2hhZGVyX3Byb2dyYW0sIHN0cnVjdCBnbF9zaGFkZXIpOworCisgICAgc2hhZGVyX3Byb2dyYW0tPlNoYWRlcnNbc2hhZGVyX3Byb2dyYW0tPk51bVNoYWRlcnNdID0gc2hhZGVyOworICAgIHNoYWRlcl9wcm9ncmFtLT5OdW1TaGFkZXJzKys7CisKKyAgICBpZiAoaGVhZGVyLnZlcnNpb24gPT0gMCkgeworICAgICAgICAvLyB2ZXJzaW9uIDAgbWVhbnMgd2UgcmVhbGx5IGhhdmUgR0xTTCBTb3VyY2UKKyAgICAgICAgc2hhZGVyLT5Tb3VyY2UgPSAoY29uc3QgY2hhciAqKSBjb2RlICsgc2l6ZW9mKGhlYWRlcik7CisKKyAgICAgICAgc3dpdGNoKGhlYWRlci5nZW5fbWFnaWMpIHsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVDoKKyAgICAgICAgICAgIHNoYWRlci0+VHlwZSA9IEdMX1ZFUlRFWF9TSEFERVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOgorICAgICAgICAgICAgc2hhZGVyLT5UeXBlID0gR0xfR0VPTUVUUllfU0hBREVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDoKKyAgICAgICAgICAgIHNoYWRlci0+VHlwZSA9IEdMX0ZSQUdNRU5UX1NIQURFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworCisgICAgICAgIHNoYWRlci0+U291cmNlID0gKGNvbnN0IEdMY2hhciopY29kZTsKKyAgICAgICAgc2hhZGVyLT5TaXplICAgPSBzaXplIC8gc2l6ZW9mKHVuc2lnbmVkKTsgIC8vIHNpemUgaW4gU1BWIHdvcmRzCisKKyAgICAgICAgc3dpdGNoIChzdGFnZSkgeworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOgorICAgICAgICAgICAgc2hhZGVyLT5UeXBlID0gR0xfVkVSVEVYX1NIQURFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQ6CisgICAgICAgICAgICBzaGFkZXItPlR5cGUgPSBHTF9HRU9NRVRSWV9TSEFERVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOgorICAgICAgICAgICAgc2hhZGVyLT5UeXBlID0gR0xfRlJBR01FTlRfU0hBREVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNoYWRlci0+U3RhZ2UgPSBfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2Uoc2hhZGVyLT5UeXBlKTsKKworICAgIHNoYWRlcl9wcm9ncmFtLT5UeXBlID0gc2hhZGVyLT5TdGFnZTsKKworICAgIGJvb2wgZHVtcF9hc3QgPSBmYWxzZTsKKyAgICBib29sIGR1bXBfU1BWID0gZmFsc2U7CisgICAgYm9vbCBkdW1wX2hpciA9IGZhbHNlOworCisgICAgYm9vbCBzdHJpcF9TUFYgPSBmYWxzZTsKKyAgICBib29sIGNhbm9uaWNhbGl6ZV9TUFYgPSBmYWxzZTsKKworICAgIF9tZXNhX2dsc2xfY29tcGlsZV9zaGFkZXIoY3R4LCBzaGFkZXIsIGR1bXBfYXN0LCBkdW1wX1NQViwgZHVtcF9oaXIsIHN0cmlwX1NQViwgY2Fub25pY2FsaXplX1NQVik7CisKKyAgICBpZiAoc3RybGVuKHNoYWRlci0+SW5mb0xvZykgPiAwKSB7CisgICAgICAgIHByaW50ZigiSW5mbyBsb2c6XG4lc1xuIiwgc2hhZGVyLT5JbmZvTG9nKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorCisgICAgaWYgKCFzaGFkZXItPkNvbXBpbGVTdGF0dXMpIHsKKyAgICAgICAgX21lc2FfZGVzdHJveV9zaGFkZXJfY29tcGlsZXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYXNzZXJ0KHNoYWRlcl9wcm9ncmFtLT5OdW1TaGFkZXJzID09IDEpOworCisgICAgLy8gZm9yIFZLLCB3ZSBhcmUgaW5kZXBlbmRlbnRseSBjb21waWxpbmcgYW5kIGxpbmtpbmcgaW5kaXZpZHVhbAorICAgIC8vIHNoYWRlcnMsIHdoaWNoIG1hdGNoZXMgdGhpcyBmcm9udGVuZCdzIGNvbmNlcHQgb2YgU1NPCisgICAgc2hhZGVyX3Byb2dyYW0tPlNlcGFyYXRlU2hhZGVyID0gdHJ1ZTsKKworICAgIGxpbmtfc2hhZGVycyhjdHgsIHNoYWRlcl9wcm9ncmFtKTsKKworICAgIGlmIChzdHJsZW4oc2hhZGVyX3Byb2dyYW0tPkluZm9Mb2cpID4gMCkgeworICAgICAgICBwcmludGYoIkluZm8gbG9nIGZvciBsaW5raW5nOlxuJXNcbiIsIHNoYWRlcl9wcm9ncmFtLT5JbmZvTG9nKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorCisgICAgaWYgKCFzaGFkZXJfcHJvZ3JhbS0+TGlua1N0YXR1cykgeworICAgICAgICBfbWVzYV9kZXN0cm95X3NoYWRlcl9jb21waWxlcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfbWVzYV9kZXN0cm95X3NoYWRlcl9jb21waWxlcigpOworCisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfaXIgKikgc2hhZGVyX3Byb2dyYW07Cit9CisKK3ZvaWQgc2hhZGVyX2NyZWF0ZV9pcl93aXRoX2xvY2soY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb2RlLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfaXIgKippcikKK3sKKyAgICAvLyBXcmFwIHRoaXMgcGF0aCBpbiBhIG11dGV4IHVudGlsIHdlIGNhbiBjbGVhbiB1cCBpbml0aWFsaXphdGlvbgorICAgIHN0YXRpYyBtdHhfdCBtdXRleCA9IF9NVFhfSU5JVElBTElaRVJfTlA7CisgICAgbXR4X2xvY2soJm11dGV4KTsKKworICAgIGlmICghKmlyKQorICAgICAgICAqaXIgPSBzaGFkZXJfY3JlYXRlX2lyKGdwdSwgY29kZSwgc2l6ZSwgc3RhZ2UpOworCisgICAgbXR4X3VubG9jaygmbXV0ZXgpOworfQorCit2b2lkIHNoYWRlcl9kZXN0cm95X2lyKHN0cnVjdCBpbnRlbF9pciAqaXIpCit7CisgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpzaF9wcm9nID0gKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqKSBpcjsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykKKyAgICAgICByYWxsb2NfZnJlZShzaF9wcm9nLT5fTGlua2VkU2hhZGVyc1tpXSk7CisKKyAgICByYWxsb2NfZnJlZShzaF9wcm9nKTsKK30KKworfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2NvbXBpbGVyX2ludGVyZmFjZS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9jb21waWxlcl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTMxMzBlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9jb21waWxlcl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDU3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIENPTVBJTEVSX0lOVEVSRkFDRV9ICisjZGVmaW5lIENPTVBJTEVSX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDxpY2QuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZ2xfY29udGV4dDsKKwordm9pZCBpbml0aWFsaXplX21lc2FfY29udGV4dF90b19kZWZhdWx0cyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4KTsKKworc3RydWN0IGludGVsX2lyICpzaGFkZXJfY3JlYXRlX2lyKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb2RlLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpOworCit2b2lkIHNoYWRlcl9jcmVhdGVfaXJfd2l0aF9sb2NrKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29kZSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2lyICoqaXIpOworCit2b2lkIHNoYWRlcl9kZXN0cm95X2lyKHN0cnVjdCBpbnRlbF9pciAqaXIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvKiBDT01QSUxFUl9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC8uZ2l0aWdub3JlIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTcxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwLy5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACitnbGNwcAorZ2xjcHAtbGV4LmMKK2dsY3BwLXBhcnNlLm91dHB1dAorZ2xjcHAtcGFyc2UuYworZ2xjcHAtcGFyc2UuaAordGVzdHMvKi5vdXQKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvUkVBRE1FIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4MmQwZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvUkVBRE1FCkBAIC0wLDAgKzEsMzAgQEAKK2dsY3BwIC0tIEdMU0wgIkMiIHByZXByb2Nlc3NvcgorCitUaGlzIGlzIGEgc2ltcGxlIHByZXByb2Nlc3NvciBkZXNpZ25lZCB0byBwcm92aWRlIHRoZSBwcmVwcm9jZXNzaW5nCituZWVkcyBvZiB0aGUgR0xTTCBsYW5ndWFnZS4gVGhlIHJlcXVpcmVtZW50cyBmb3IgdGhpcyBwcmVwcm9jZXNzb3IgYXJlCitzcGVjaWZpZWQgaW4gdGhlIEdMU0wgMS4zMCBzcGVjaWZpY2F0aW9uIGF2YWlsYWJsZSBmcm9tOgorCitodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvZG9jL0dMU0xhbmdTcGVjLkZ1bGwuMS4zMC4xMC5wZGYKKworVGhpcyBzcGVjaWZpY2F0aW9uIGlzIG5vdCBwcmVjaXNlIG9uIHNvbWUgc2VtYW50aWNzLCAoZm9yIGV4YW1wbGUsCisjZGVmaW5lIGFuZCAjaWYpLCBkZWZpbmluZyB0aGVzZSBtZXJlbHkgImFzIGlzIHN0YW5kYXJkIGZvciBDKysKK3ByZXByb2Nlc3NvcnMiLiBUbyBmaWxsIGluIHRoZXNlIGRldGFpbHMsIEkndmUgYmVlbiB1c2luZyBhIGRyYWZ0IG9mCit0aGUgQzk5IHN0YW5kYXJkIGFzIGF2YWlsYWJsZSBmcm9tOgorCitodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cxNC93d3cvZG9jcy9uMTI1Ni5wZGYKKworQW55IGRvd25zdHJlYW0gY29tcGlsZXIgYWNjZXB0aW5nIG91dHB1dCBmcm9tIGdsY3BwIHNob3VsZCBiZSBwcmVwYXJlZAordG8gZW5jb3VudGVyIGFuZCBkZWFsIHdpdGggdGhlIGZvbGxvd2luZyBwcmVwcm9jZXNzb3IgbWFjcm9zOgorCisJI2xpbmUKKwkjcHJhZ21hCisJI2V4dGVuc2lvbgorCitBbGwgb3RoZXIgbWFjcm9zIHdpbGwgYmUgaGFuZGxlZCBhY2NvcmRpbmcgdG8gdGhlIEdMU0wgc3BlY2lmaWNhdGlvbgorYW5kIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgb3V0cHV0LgorCitLbm93biBsaW1pdGF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0KK0EgZmlsZSB0aGF0IGVuZHMgd2l0aCBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gbmFtZSBhcyB0aGUgbGFzdAorbm9uLXdoaXRlc3BhY2UgdG9rZW4gd2lsbCByZXN1bHQgaW4gYSBwYXJzZSBlcnJvciwgKHdoZXJlIGl0IHNob3VsZCBiZQorcGFzc2VkIHRocm91Z2ggYXMgaXMpLgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9nbGNwcC1sZXgubCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvZ2xjcHAtbGV4LmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4ZTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvZ2xjcHAtbGV4LmwKQEAgLTAsMCArMSwzNzkgQEAKKyV7CisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImdsY3BwLmgiCisjaW5jbHVkZSAiZ2xjcHAtcGFyc2UuaCIKKworLyogRmxleCBhbm5veWluZ2x5IGdlbmVyYXRlcyBzb21lIGZ1bmN0aW9ucyB3aXRob3V0IG1ha2luZyB0aGVtCisgKiBzdGF0aWMuIExldCdzIGRlY2xhcmUgdGhlbSBoZXJlLiAqLworaW50IGdsY3BwX2dldF9jb2x1bW4gICh5eXNjYW5fdCB5eXNjYW5uZXIpOwordm9pZCBnbGNwcF9zZXRfY29sdW1uIChpbnQgIGNvbHVtbl9ubyAsIHl5c2Nhbl90IHl5c2Nhbm5lcik7CisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBZWV9OT19VTklTVERfSAorI2VuZGlmCisKKyNkZWZpbmUgWVlfTk9fSU5QVVQKKworI2RlZmluZSBZWV9VU0VSX0FDVElPTgkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAocGFyc2VyLT5oYXNfbmV3X2xpbmVfbnVtYmVyKQkJCVwKKwkJCXl5bGluZW5vID0gcGFyc2VyLT5uZXdfbGluZV9udW1iZXI7CQlcCisJCWlmIChwYXJzZXItPmhhc19uZXdfc291cmNlX251bWJlcikJCQlcCisJCQl5eWxsb2MtPnNvdXJjZSA9IHBhcnNlci0+bmV3X3NvdXJjZV9udW1iZXI7CVwKKwkJeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWNvbHVtbiArIDE7CQkJXAorCQl5eWxsb2MtPmZpcnN0X2xpbmUgPSB5eWxsb2MtPmxhc3RfbGluZSA9IHl5bGluZW5vOwlcCisJCXl5Y29sdW1uICs9IHl5bGVuZzsJCQkJCVwKKwkJeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5Y29sdW1uICsgMTsJCQlcCisJCXBhcnNlci0+aGFzX25ld19saW5lX251bWJlciA9IDA7CQkJXAorCQlwYXJzZXItPmhhc19uZXdfc291cmNlX251bWJlciA9IDA7CQkJXAorIH0gd2hpbGUoMCk7CisKKyNkZWZpbmUgWVlfVVNFUl9JTklUCQkJXAorCWRvIHsJCQkJXAorCQl5eWxpbmVubyA9IDE7CQlcCisJCXl5Y29sdW1uID0gMTsJCVwKKwkJeXlsbG9jLT5zb3VyY2UgPSAwOwlcCisJfSB3aGlsZSgwKQorJX0KKworJW9wdGlvbiBiaXNvbi1icmlkZ2UgYmlzb24tbG9jYXRpb25zIHJlZW50cmFudCBub3l5d3JhcAorJW9wdGlvbiBleHRyYS10eXBlPSJnbGNwcF9wYXJzZXJfdCAqIgorJW9wdGlvbiBwcmVmaXg9ImdsY3BwXyIKKyVvcHRpb24gc3RhY2sKKyVvcHRpb24gbmV2ZXItaW50ZXJhY3RpdmUKKworJXggRE9ORSBDT01NRU5UIFVOUkVBQ0hBQkxFIFNLSVAgREVGSU5FIE5FV0xJTkVfQ0FUQ0hVUAorCitTUEFDRQkJW1s6c3BhY2U6XV0KK05PTlNQQUNFCVteWzpzcGFjZTpdXQorTkVXTElORQkJW1xuXQorSFNQQUNFCQlbIFx0XQorSEFTSAkJXntIU1BBQ0V9KiN7SFNQQUNFfSoKK0lERU5USUZJRVIJW19hLXpBLVpdW19hLXpBLVowLTldKgorUFVOQ1RVQVRJT04JW11bKCl7fS4mKn4hLyU8Pl58Oyw9Ky1dCisKKy8qIFRoZSBPVEhFUiBjbGFzcyBpcyBzaW1wbHkgYSBjYXRjaC1hbGwgZm9yIHRoaW5ncyB0aGF0IHRoZSBDUFAKK3BhcnNlciBqdXN0IGRvZXNuJ3QgY2FyZSBhYm91dC4gU2luY2UgZmxleCByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQKK21hdGNoIGxvbmdlciBzdHJpbmdzIHRha2UgcHJpb3JpdHkgb3ZlciB0aG9zZSBtYXRjaGluZyBzaG9ydGVyCitzdHJpbmdzLCB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gYXZvaWQgT1RIRVIgbWF0Y2hpbmcgYW5kIGhpZGluZworc29tZXRoaW5nIHRoYXQgQ1BQIGRvZXMgY2FyZSBhYm91dC4gU28gd2Ugc2ltcGx5IGV4Y2x1ZGUgYWxsCitjaGFyYWN0ZXJzIHRoYXQgYXBwZWFyIGluIGFueSBvdGhlciBleHByZXNzaW9ucy4gKi8KKworT1RIRVIJCVteXVtfI1s6c3BhY2U6XSNhLXpBLVowLTkoKXt9LiYqfiEvJTw+Xnw7LD0rLV0KKworRElHSVRTCQkJWzAtOV1bMC05XSoKK0RFQ0lNQUxfSU5URUdFUgkJWzEtOV1bMC05XSpbdVVdPworT0NUQUxfSU5URUdFUgkJMFswLTddKlt1VV0/CitIRVhBREVDSU1BTF9JTlRFR0VSCTBbeFhdWzAtOWEtZkEtRl0rW3VVXT8KKworJSUKKworCWdsY3BwX3BhcnNlcl90ICpwYXJzZXIgPSB5eWV4dHJhOworCisJLyogV2hlbiB3ZSBsZXggYSBtdWx0aS1saW5lIGNvbW1lbnQsIHdlIHJlcGxhY2UgaXQgKGFzCisJICogc3BlY2lmaWVkKSB3aXRoIGEgc2luZ2xlIHNwYWNlLiBCdXQgaWYgdGhlIGNvbW1lbnQgc3Bhbm5lZAorCSAqIG11bHRpcGxlIGxpbmVzLCB0aGVuIHN1YnNlcXVlbnQgcGFyc2luZyBzdGFnZXMgd2lsbCBub3QKKwkgKiBjb3VudCBjb3JyZWN0IGxpbmUgbnVtYmVycy4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtIHdlIGtlZXAKKwkgKiB0cmFjayBvZiBhbGwgbmV3bGluZXMgdGhhdCB3ZXJlIGNvbW1lbnRlZCBvdXQgYnkgYQorCSAqIG11bHRpLWxpbmUgY29tbWVudCwgYW5kIHdlIGVtaXQgYSBORVdMSU5FIHRva2VuIGZvciBlYWNoIGF0CisJICogdGhlIG5leHQgbGVnYWwgb3Bwb3J0dW5pdHksICh3aGljaCBpcyB3aGVuIHRoZSBsZXhlciB3b3VsZAorCSAqIGJlIGVtaXR0aW5nIGEgTkVXTElORSB0b2tlbiBhbnl3YXkpLgorCSAqLworCWlmIChZWV9TVEFSVCA9PSBORVdMSU5FX0NBVENIVVApIHsKKwkJaWYgKHBhcnNlci0+Y29tbWVudGVkX25ld2xpbmVzKQorCQkJcGFyc2VyLT5jb21tZW50ZWRfbmV3bGluZXMtLTsKKwkJaWYgKHBhcnNlci0+Y29tbWVudGVkX25ld2xpbmVzID09IDApCisJCQlCRUdJTiBJTklUSUFMOworCQlyZXR1cm4gTkVXTElORTsKKwl9CisKKwkvKiBUaGUgaGFuZGxpbmcgb2YgdGhlIFNLSVAgdnMgSU5JVElBTCBzdGFydCBzdGF0ZXMgcmVxdWlyZXMKKwkgKiBzb21lIHNwZWNpYWwgaGFuZGxpbmcuIFR5cGljYWxseSwgYSBsZXhlciB3b3VsZCBjaGFuZ2UKKwkgKiBzdGFydCBzdGF0ZXMgd2l0aCBzdGF0ZW1lbnRzIGxpa2UgIkJFR0lOIFNLSVAiIHdpdGhpbiB0aGUKKwkgKiBsZXhlciBydWxlcy4gV2UgY2FuJ3QgZ2V0IGF3YXkgd2l0aCB0aGF0IGhlcmUsIHNpbmNlIHdlCisJICogbmVlZCB0aGUgcGFyc2VyIHRvIGFjdHVhbGx5IGV2YWx1YXRlIGV4cHJlc3Npb25zIGZvcgorCSAqIGRpcmVjdGl2ZXMgbGlrZSAiI2lmIi4KKwkgKgorCSAqIFNvLCBoZXJlLCBpbiBjb2RlIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbiBldmVyeSBjYWxsIHRvCisJICogdGhlIGxleGVyLGFuZCBiZWZvcmUgYW55IHJ1bGVzLCB3ZSBleGFtaW5lIHRoZSBza2lwX3N0YWNrCisJICogYXMgc2V0IGJ5IHRoZSBwYXJzZXIgdG8ga25vdyB3aGV0aGVyIHRvIGNoYW5nZSBmcm9tIElOSVRJQUwKKwkgKiB0byBTS0lQIG9yIGZyb20gU0tJUCBiYWNrIHRvIElOSVRJQUwuCisJICoKKwkgKiBUaHJlZSBjYXNlcyBjYXVzZSB1cyB0byBzd2l0Y2ggb3V0IG9mIHRoZSBTS0lQIHN0YXRlIGFuZAorCSAqIGJhY2sgdG8gdGhlIElOSVRJQUwgc3RhdGU6CisJICoKKwkgKgkxLiBUaGUgdG9wIG9mIHRoZSBza2lwX3N0YWNrIGlzIG9mIHR5cGUgU0tJUF9OT19TS0lQCisJICoJICAgVGhpcyBtZWFucyB3ZSdyZSBzdGlsbCBldmFsdWF0aW5nIHNvbWUgI2lmCisJICoJICAgaGllcmFyY2h5LCBidXQgd2UncmUgb24gYSBicmFuY2ggb2YgaXQgd2hlcmUKKwkgKgkgICBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZCAoc3VjaCBhcyAiI2lmIDEiIG9yCisJICoJICAgIiNlbHNlIiBvciBzbykuCisJICoKKwkgKgkyLiBUaGUgc2tpcF9zdGFjayBpcyBOVUxMIG1lYW5pbmcgdGhhdCB3ZSd2ZSByZWFjaGVkCisJICoJICAgdGhlIGxhc3QgI2VuZGlmLgorCSAqCisJICoJMy4gVGhlIGxleGluZ19pZiBiaXQgaXMgc2V0LiBUaGlzIGluZGljYXRlcyB0aGF0IHdlCisJICoJICAgYXJlIGxleGluZyB0aGUgZXhwcmVzc2lvbiBmb2xsb3dpbmcgYW4gIiNpZiIgb2YKKwkgKgkgICAiI2VsaWYiLiBFdmVuIGluc2lkZSBhbiAiI2lmIDAiIHdlIG5lZWQgdG8gbGV4IHRoaXMKKwkgKgkgICBleHByZXNzaW9uIHNvIHRoZSBwYXJzZXIgY2FuIGNvcnJlY3RseSB1cGRhdGUgdGhlCisJICoJICAgc2tpcF9zdGFjayBzdGF0ZS4KKwkgKi8KKwlpZiAoWVlfU1RBUlQgPT0gSU5JVElBTCB8fCBZWV9TVEFSVCA9PSBTS0lQKSB7CisJCWlmIChwYXJzZXItPmxleGluZ19pZiB8fAorCQkgICAgcGFyc2VyLT5za2lwX3N0YWNrID09IE5VTEwgfHwKKwkJICAgIHBhcnNlci0+c2tpcF9zdGFjay0+dHlwZSA9PSBTS0lQX05PX1NLSVApCisJCXsKKwkJCUJFR0lOIElOSVRJQUw7CisJCX0gZWxzZSB7CisJCQlCRUdJTiBTS0lQOworCQl9CisJfQorCisJLyogU2luZ2xlLWxpbmUgY29tbWVudHMgKi8KKyIvLyJbXlxuXSogeworfQorCisJLyogTXVsdGktbGluZSBjb21tZW50cyAqLworIi8qIiAgICAgICAgICAgICAgICAgICAgeyB5eV9wdXNoX3N0YXRlKENPTU1FTlQsIHl5c2Nhbm5lcik7IH0KKzxDT01NRU5UPlteKlxuXSoKKzxDT01NRU5UPlteKlxuXSpcbiAgICAgIHsgeXlsaW5lbm8rKzsgeXljb2x1bW4gPSAwOyBwYXJzZXItPmNvbW1lbnRlZF9uZXdsaW5lcysrOyB9Cis8Q09NTUVOVD4iKiIrW14qL1xuXSoKKzxDT01NRU5UPiIqIitbXiovXG5dKlxuIHsgeXlsaW5lbm8rKzsgeXljb2x1bW4gPSAwOyBwYXJzZXItPmNvbW1lbnRlZF9uZXdsaW5lcysrOyB9Cis8Q09NTUVOVD4iKiIrIi8iICAgICAgICB7CisJeXlfcG9wX3N0YXRlKHl5c2Nhbm5lcik7CisJaWYgKHl5ZXh0cmEtPnNwYWNlX3Rva2VucykKKwkJcmV0dXJuIFNQQUNFOworfQorCit7SEFTSH12ZXJzaW9ue0hTUEFDRX0rIHsKKwl5eWx2YWwtPnN0ciA9IHJhbGxvY19zdHJkdXAgKHl5ZXh0cmEsIHl5dGV4dCk7CisJeXlleHRyYS0+c3BhY2VfdG9rZW5zID0gMDsKKwlyZXR1cm4gSEFTSF9WRVJTSU9OOworfQorCisJLyogZ2xjcHAgZG9lc24ndCBoYW5kbGUgI2V4dGVuc2lvbiwgI3ZlcnNpb24sIG9yICNwcmFnbWEgZGlyZWN0aXZlcy4KKwkgKiBTaW1wbHkgcGFzcyB0aGVtIHRocm91Z2ggdG8gdGhlIG1haW4gY29tcGlsZXIncyBsZXhlci9wYXJzZXIuICovCit7SEFTSH0oZXh0ZW5zaW9ufHByYWdtYSlbXlxuXSsgeworCWlmIChwYXJzZXItPmNvbW1lbnRlZF9uZXdsaW5lcykKKwkJQkVHSU4gTkVXTElORV9DQVRDSFVQOworCXl5bHZhbC0+c3RyID0gcmFsbG9jX3N0cmR1cCAoeXlleHRyYSwgeXl0ZXh0KTsKKwl5eWxpbmVubysrOworCXl5Y29sdW1uID0gMDsKKwlyZXR1cm4gT1RIRVI7Cit9CisKK3tIQVNIfWxpbmV7SFNQQUNFfSsgeworCXJldHVybiBIQVNIX0xJTkU7Cit9CisKKzxTS0lQLElOSVRJQUw+ewore0hBU0h9aWZkZWYgeworCXl5ZXh0cmEtPmxleGluZ19pZiA9IDE7CisJeXlleHRyYS0+c3BhY2VfdG9rZW5zID0gMDsKKwlyZXR1cm4gSEFTSF9JRkRFRjsKK30KKwore0hBU0h9aWZuZGVmIHsKKwl5eWV4dHJhLT5sZXhpbmdfaWYgPSAxOworCXl5ZXh0cmEtPnNwYWNlX3Rva2VucyA9IDA7CisJcmV0dXJuIEhBU0hfSUZOREVGOworfQorCit7SEFTSH1pZi9bXl9hLXpBLVowLTldIHsKKwl5eWV4dHJhLT5sZXhpbmdfaWYgPSAxOworCXl5ZXh0cmEtPnNwYWNlX3Rva2VucyA9IDA7CisJcmV0dXJuIEhBU0hfSUY7Cit9CisKK3tIQVNIfWVsaWYvW15fYS16QS1aMC05XSB7CisJeXlleHRyYS0+bGV4aW5nX2lmID0gMTsKKwl5eWV4dHJhLT5zcGFjZV90b2tlbnMgPSAwOworCXJldHVybiBIQVNIX0VMSUY7Cit9CisKK3tIQVNIfWVsc2UgeworCXl5ZXh0cmEtPnNwYWNlX3Rva2VucyA9IDA7CisJcmV0dXJuIEhBU0hfRUxTRTsKK30KKwore0hBU0h9ZW5kaWYgeworCXl5ZXh0cmEtPnNwYWNlX3Rva2VucyA9IDA7CisJcmV0dXJuIEhBU0hfRU5ESUY7Cit9Cit9CisKKzxTS0lQPlteXG5dIHsKKwlpZiAocGFyc2VyLT5jb21tZW50ZWRfbmV3bGluZXMpCisJCUJFR0lOIE5FV0xJTkVfQ0FUQ0hVUDsKK30KKwore0hBU0h9ZXJyb3IuKiB7CisJY2hhciAqcDsKKwlmb3IgKHAgPSB5eXRleHQ7ICFpc2FscGhhKHBbMF0pOyBwKyspOyAvKiBza2lwICIgICMgICAiICovCisJcCArPSA1OyAvKiBza2lwICJlcnJvciIgKi8KKwlnbGNwcF9lcnJvcih5eWxsb2MsIHl5ZXh0cmEsICIjZXJyb3IlcyIsIHApOworfQorCit7SEFTSH1kZWZpbmV7SFNQQUNFfSsgeworCXl5ZXh0cmEtPnNwYWNlX3Rva2VucyA9IDA7CisJeXlfcHVzaF9zdGF0ZShERUZJTkUsIHl5c2Nhbm5lcik7CisJcmV0dXJuIEhBU0hfREVGSU5FOworfQorCis8REVGSU5FPntJREVOVElGSUVSfS8iKCIgeworCXl5X3BvcF9zdGF0ZSh5eXNjYW5uZXIpOworCXl5bHZhbC0+c3RyID0gcmFsbG9jX3N0cmR1cCAoeXlleHRyYSwgeXl0ZXh0KTsKKwlyZXR1cm4gRlVOQ19JREVOVElGSUVSOworfQorCis8REVGSU5FPntJREVOVElGSUVSfSB7CisJeXlfcG9wX3N0YXRlKHl5c2Nhbm5lcik7CisJeXlsdmFsLT5zdHIgPSByYWxsb2Nfc3RyZHVwICh5eWV4dHJhLCB5eXRleHQpOworCXJldHVybiBPQkpfSURFTlRJRklFUjsKK30KKwore0hBU0h9dW5kZWYgeworCXl5ZXh0cmEtPnNwYWNlX3Rva2VucyA9IDA7CisJcmV0dXJuIEhBU0hfVU5ERUY7Cit9CisKK3tIQVNIfSB7CisJeXlleHRyYS0+c3BhY2VfdG9rZW5zID0gMDsKKwlyZXR1cm4gSEFTSDsKK30KKwore0RFQ0lNQUxfSU5URUdFUn0geworCXl5bHZhbC0+c3RyID0gcmFsbG9jX3N0cmR1cCAoeXlleHRyYSwgeXl0ZXh0KTsKKwlyZXR1cm4gSU5URUdFUl9TVFJJTkc7Cit9CisKK3tPQ1RBTF9JTlRFR0VSfSB7CisJeXlsdmFsLT5zdHIgPSByYWxsb2Nfc3RyZHVwICh5eWV4dHJhLCB5eXRleHQpOworCXJldHVybiBJTlRFR0VSX1NUUklORzsKK30KKwore0hFWEFERUNJTUFMX0lOVEVHRVJ9IHsKKwl5eWx2YWwtPnN0ciA9IHJhbGxvY19zdHJkdXAgKHl5ZXh0cmEsIHl5dGV4dCk7CisJcmV0dXJuIElOVEVHRVJfU1RSSU5HOworfQorCisiPDwiICB7CisJcmV0dXJuIExFRlRfU0hJRlQ7Cit9CisKKyI+PiIgeworCXJldHVybiBSSUdIVF9TSElGVDsKK30KKworIjw9IiB7CisJcmV0dXJuIExFU1NfT1JfRVFVQUw7Cit9CisKKyI+PSIgeworCXJldHVybiBHUkVBVEVSX09SX0VRVUFMOworfQorCisiPT0iIHsKKwlyZXR1cm4gRVFVQUw7Cit9CisKKyIhPSIgeworCXJldHVybiBOT1RfRVFVQUw7Cit9CisKKyImJiIgeworCXJldHVybiBBTkQ7Cit9CisKKyJ8fCIgeworCXJldHVybiBPUjsKK30KKworIiMjIiB7CisJaWYgKHBhcnNlci0+aXNfZ2xlcykKKwkJZ2xjcHBfZXJyb3IoeXlsbG9jLCB5eWV4dHJhLCAiVG9rZW4gcGFzdGluZyAoIyMpIGlzIGlsbGVnYWwgaW4gR0xFUyIpOworCXJldHVybiBQQVNURTsKK30KKworImRlZmluZWQiIHsKKwlyZXR1cm4gREVGSU5FRDsKK30KKwore0lERU5USUZJRVJ9IHsKKwl5eWx2YWwtPnN0ciA9IHJhbGxvY19zdHJkdXAgKHl5ZXh0cmEsIHl5dGV4dCk7CisJcmV0dXJuIElERU5USUZJRVI7Cit9CisKK3tQVU5DVFVBVElPTn0geworCXJldHVybiB5eXRleHRbMF07Cit9CisKK3tPVEhFUn0rIHsKKwl5eWx2YWwtPnN0ciA9IHJhbGxvY19zdHJkdXAgKHl5ZXh0cmEsIHl5dGV4dCk7CisJcmV0dXJuIE9USEVSOworfQorCit7SFNQQUNFfSB7CisJaWYgKHl5ZXh0cmEtPnNwYWNlX3Rva2VucykgeworCQlyZXR1cm4gU1BBQ0U7CisJfQorfQorCis8U0tJUCxJTklUSUFMPlxuIHsKKwlpZiAocGFyc2VyLT5jb21tZW50ZWRfbmV3bGluZXMpIHsKKwkJQkVHSU4gTkVXTElORV9DQVRDSFVQOworCX0KKwl5eWV4dHJhLT5sZXhpbmdfaWYgPSAwOworCXl5bGluZW5vKys7CisJeXljb2x1bW4gPSAwOworCXJldHVybiBORVdMSU5FOworfQorCisJLyogSGFuZGxlIG1pc3NpbmcgbmV3bGluZSBhdCBFT0YuICovCis8SU5JVElBTD48PEVPRj4+IHsKKwlCRUdJTiBET05FOyAvKiBEb24ndCBrZWVwIG1hdGNoaW5nIHRoaXMgcnVsZSBmb3JldmVyLiAqLworCXl5ZXh0cmEtPmxleGluZ19pZiA9IDA7CisJcmV0dXJuIE5FV0xJTkU7Cit9CisKKwkvKiBXZSBkb24ndCBhY3R1YWxseSB1c2UgdGhlIFVOUkVBQ0hBQkxFIHN0YXJ0IGNvbmRpdGlvbi4gV2UKKwlvbmx5IGhhdmUgdGhpcyBhY3Rpb24gaGVyZSBzbyB0aGF0IHdlIGNhbiBwcmV0ZW5kIHRvIGNhbGwgc29tZQorCWdlbmVyYXRlZCBmdW5jdGlvbnMsICh0byBhdm9pZCAiZGVmaW5lZCBidXQgbm90IHVzZWQiCisJd2FybmluZ3MuICovCis8VU5SRUFDSEFCTEU+LiB7CisJdW5wdXQoJy4nKTsKKwl5eV90b3Bfc3RhdGUoeXlleHRyYSk7Cit9CisKKyUlCisKK3ZvaWQKK2dsY3BwX2xleF9zZXRfc291cmNlX3N0cmluZyhnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLCBjb25zdCBjaGFyICpzaGFkZXIpCit7CisJeXlfc2Nhbl9zdHJpbmcoc2hhZGVyLCBwYXJzZXItPnNjYW5uZXIpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9nbGNwcC1wYXJzZS55IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9nbGNwcC1wYXJzZS55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTQ5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL2dsY3BwLXBhcnNlLnkKQEAgLTAsMCArMSwyMTkyIEBACisleworLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJnbGNwcC5oIgorI2luY2x1ZGUgIm1haW4vY29yZS5oIiAvKiBmb3Igc3RydWN0IGdsX2V4dGVuc2lvbnMgKi8KKyNpbmNsdWRlICJtYWluL210eXBlcy5oIiAvKiBmb3IgZ2xfYXBpIGVudW0gKi8KKworc3RhdGljIHZvaWQKK3l5ZXJyb3IgKFlZTFRZUEUgKmxvY3AsIGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIGNvbnN0IGNoYXIgKmVycm9yKTsKKworc3RhdGljIHZvaWQKK19kZWZpbmVfb2JqZWN0X21hY3JvIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkgICAgICBZWUxUWVBFICpsb2MsCisJCSAgICAgIGNvbnN0IGNoYXIgKm1hY3JvLAorCQkgICAgICB0b2tlbl9saXN0X3QgKnJlcGxhY2VtZW50cyk7CisKK3N0YXRpYyB2b2lkCitfZGVmaW5lX2Z1bmN0aW9uX21hY3JvIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkJWVlMVFlQRSAqbG9jLAorCQkJY29uc3QgY2hhciAqbWFjcm8sCisJCQlzdHJpbmdfbGlzdF90ICpwYXJhbWV0ZXJzLAorCQkJdG9rZW5fbGlzdF90ICpyZXBsYWNlbWVudHMpOworCitzdGF0aWMgc3RyaW5nX2xpc3RfdCAqCitfc3RyaW5nX2xpc3RfY3JlYXRlICh2b2lkICpjdHgpOworCitzdGF0aWMgdm9pZAorX3N0cmluZ19saXN0X2FwcGVuZF9pdGVtIChzdHJpbmdfbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpzdHIpOworCitzdGF0aWMgaW50Citfc3RyaW5nX2xpc3RfY29udGFpbnMgKHN0cmluZ19saXN0X3QgKmxpc3QsIGNvbnN0IGNoYXIgKm1lbWJlciwgaW50ICppbmRleCk7CisKK3N0YXRpYyBpbnQKK19zdHJpbmdfbGlzdF9sZW5ndGggKHN0cmluZ19saXN0X3QgKmxpc3QpOworCitzdGF0aWMgaW50Citfc3RyaW5nX2xpc3RfZXF1YWwgKHN0cmluZ19saXN0X3QgKmEsIHN0cmluZ19saXN0X3QgKmIpOworCitzdGF0aWMgYXJndW1lbnRfbGlzdF90ICoKK19hcmd1bWVudF9saXN0X2NyZWF0ZSAodm9pZCAqY3R4KTsKKworc3RhdGljIHZvaWQKK19hcmd1bWVudF9saXN0X2FwcGVuZCAoYXJndW1lbnRfbGlzdF90ICpsaXN0LCB0b2tlbl9saXN0X3QgKmFyZ3VtZW50KTsKKworc3RhdGljIGludAorX2FyZ3VtZW50X2xpc3RfbGVuZ3RoIChhcmd1bWVudF9saXN0X3QgKmxpc3QpOworCitzdGF0aWMgdG9rZW5fbGlzdF90ICoKK19hcmd1bWVudF9saXN0X21lbWJlcl9hdCAoYXJndW1lbnRfbGlzdF90ICpsaXN0LCBpbnQgaW5kZXgpOworCisvKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHJhbGxvY19zdGVhbCgpcyB0aGUgc3RyIHBvaW50ZXIuICovCitzdGF0aWMgdG9rZW5fdCAqCitfdG9rZW5fY3JlYXRlX3N0ciAodm9pZCAqY3R4LCBpbnQgdHlwZSwgY2hhciAqc3RyKTsKKworc3RhdGljIHRva2VuX3QgKgorX3Rva2VuX2NyZWF0ZV9pdmFsICh2b2lkICpjdHgsIGludCB0eXBlLCBpbnQgaXZhbCk7CisKK3N0YXRpYyB0b2tlbl9saXN0X3QgKgorX3Rva2VuX2xpc3RfY3JlYXRlICh2b2lkICpjdHgpOworCitzdGF0aWMgdm9pZAorX3Rva2VuX2xpc3RfYXBwZW5kICh0b2tlbl9saXN0X3QgKmxpc3QsIHRva2VuX3QgKnRva2VuKTsKKworc3RhdGljIHZvaWQKK190b2tlbl9saXN0X2FwcGVuZF9saXN0ICh0b2tlbl9saXN0X3QgKmxpc3QsIHRva2VuX2xpc3RfdCAqdGFpbCk7CisKK3N0YXRpYyBpbnQKK190b2tlbl9saXN0X2VxdWFsX2lnbm9yaW5nX3NwYWNlICh0b2tlbl9saXN0X3QgKmEsIHRva2VuX2xpc3RfdCAqYik7CisKK3N0YXRpYyB2b2lkCitfcGFyc2VyX2FjdGl2ZV9saXN0X3B1c2ggKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsCisJCQkgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsCisJCQkgIHRva2VuX25vZGVfdCAqbWFya2VyKTsKKworc3RhdGljIHZvaWQKK19wYXJzZXJfYWN0aXZlX2xpc3RfcG9wIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyKTsKKworc3RhdGljIGludAorX3BhcnNlcl9hY3RpdmVfbGlzdF9jb250YWlucyAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgY29uc3QgY2hhciAqaWRlbnRpZmllcik7CisKKy8qIEV4cGFuZCBsaXN0LCBhbmQgYmVnaW4gbGV4aW5nIGZyb20gdGhlIHJlc3VsdCAoYWZ0ZXIgZmlyc3QKKyAqIHByZWZpeGluZyBhIHRva2VuIG9mIHR5cGUgJ2hlYWRfdG9rZW5fdHlwZScpLgorICovCitzdGF0aWMgdm9pZAorX2dsY3BwX3BhcnNlcl9leHBhbmRfYW5kX2xleF9mcm9tIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkJCSAgIGludCBoZWFkX3Rva2VuX3R5cGUsCisJCQkJICAgdG9rZW5fbGlzdF90ICpsaXN0KTsKKworLyogUGVyZm9ybSBtYWNybyBleHBhbnNpb24gaW4tcGxhY2Ugb24gdGhlIGdpdmVuIGxpc3QuICovCitzdGF0aWMgdm9pZAorX2dsY3BwX3BhcnNlcl9leHBhbmRfdG9rZW5fbGlzdCAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwKKwkJCQkgdG9rZW5fbGlzdF90ICpsaXN0KTsKKworc3RhdGljIHZvaWQKK19nbGNwcF9wYXJzZXJfcHJpbnRfZXhwYW5kZWRfdG9rZW5fbGlzdCAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwKKwkJCQkJIHRva2VuX2xpc3RfdCAqbGlzdCk7CisKK3N0YXRpYyB2b2lkCitfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfcHVzaF9pZiAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgWVlMVFlQRSAqbG9jLAorCQkJCSAgaW50IGNvbmRpdGlvbik7CisKK3N0YXRpYyB2b2lkCitfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfY2hhbmdlX2lmIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLCBZWUxUWVBFICpsb2MsCisJCQkJICAgIGNvbnN0IGNoYXIgKnR5cGUsIGludCBjb25kaXRpb24pOworCitzdGF0aWMgdm9pZAorX2dsY3BwX3BhcnNlcl9za2lwX3N0YWNrX3BvcCAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgWVlMVFlQRSAqbG9jKTsKKworc3RhdGljIHZvaWQKK19nbGNwcF9wYXJzZXJfaGFuZGxlX3ZlcnNpb25fZGVjbGFyYXRpb24oZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgaW50bWF4X3QgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnQsIGJvb2wgZXhwbGljaXRseV9zZXQpOworCitzdGF0aWMgaW50CitnbGNwcF9wYXJzZXJfbGV4IChZWVNUWVBFICp5eWx2YWwsIFlZTFRZUEUgKnl5bGxvYywgZ2xjcHBfcGFyc2VyX3QgKnBhcnNlcik7CisKK3N0YXRpYyB2b2lkCitnbGNwcF9wYXJzZXJfbGV4X2Zyb20gKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIHRva2VuX2xpc3RfdCAqbGlzdCk7CisKK3N0YXRpYyB2b2lkCithZGRfYnVpbHRpbl9kZWZpbmUoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbHVlKTsKKworJX0KKworJXB1cmUtcGFyc2VyCislZXJyb3ItdmVyYm9zZQorCislbG9jYXRpb25zCislaW5pdGlhbC1hY3Rpb24geworCUAkLmZpcnN0X2xpbmUgPSAxOworCUAkLmZpcnN0X2NvbHVtbiA9IDE7CisJQCQubGFzdF9saW5lID0gMTsKKwlAJC5sYXN0X2NvbHVtbiA9IDE7CisJQCQuc291cmNlID0gMDsKK30KKworJXBhcnNlLXBhcmFtIHtnbGNwcF9wYXJzZXJfdCAqcGFyc2VyfQorJWxleC1wYXJhbSB7Z2xjcHBfcGFyc2VyX3QgKnBhcnNlcn0KKworJWV4cGVjdCAwCisldG9rZW4gQ09NTUFfRklOQUwgREVGSU5FRCBFTElGX0VYUEFOREVEIEhBU0ggSEFTSF9ERUZJTkUgRlVOQ19JREVOVElGSUVSIE9CSl9JREVOVElGSUVSIEhBU0hfRUxJRiBIQVNIX0VMU0UgSEFTSF9FTkRJRiBIQVNIX0lGIEhBU0hfSUZERUYgSEFTSF9JRk5ERUYgSEFTSF9MSU5FIEhBU0hfVU5ERUYgSEFTSF9WRVJTSU9OIElERU5USUZJRVIgSUZfRVhQQU5ERUQgSU5URUdFUiBJTlRFR0VSX1NUUklORyBMSU5FX0VYUEFOREVEIE5FV0xJTkUgT1RIRVIgUExBQ0VIT0xERVIgU1BBQ0UKKyV0b2tlbiBQQVNURQorJXR5cGUgPGl2YWw+IGV4cHJlc3Npb24gSU5URUdFUiBvcGVyYXRvciBTUEFDRSBpbnRlZ2VyX2NvbnN0YW50CisldHlwZSA8c3RyPiBJREVOVElGSUVSIEZVTkNfSURFTlRJRklFUiBPQkpfSURFTlRJRklFUiBJTlRFR0VSX1NUUklORyBPVEhFUgorJXR5cGUgPHN0cmluZ19saXN0PiBpZGVudGlmaWVyX2xpc3QKKyV0eXBlIDx0b2tlbj4gcHJlcHJvY2Vzc2luZ190b2tlbiBjb25kaXRpb25hbF90b2tlbgorJXR5cGUgPHRva2VuX2xpc3Q+IHBwX3Rva2VucyByZXBsYWNlbWVudF9saXN0IHRleHRfbGluZSBjb25kaXRpb25hbF90b2tlbnMKKyVsZWZ0IE9SCislbGVmdCBBTkQKKyVsZWZ0ICd8JworJWxlZnQgJ14nCislbGVmdCAnJicKKyVsZWZ0IEVRVUFMIE5PVF9FUVVBTAorJWxlZnQgJzwnICc+JyBMRVNTX09SX0VRVUFMIEdSRUFURVJfT1JfRVFVQUwKKyVsZWZ0IExFRlRfU0hJRlQgUklHSFRfU0hJRlQKKyVsZWZ0ICcrJyAnLScKKyVsZWZ0ICcqJyAnLycgJyUnCislcmlnaHQgVU5BUlkKKworJSUKKworaW5wdXQ6CisJLyogZW1wdHkgKi8KK3wJaW5wdXQgbGluZQorOworCitsaW5lOgorCWNvbnRyb2xfbGluZSB7CisJCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKCZwYXJzZXItPm91dHB1dCwgJnBhcnNlci0+b3V0cHV0X2xlbmd0aCwgIlxuIik7CisJfQorfAlIQVNIX0xJTkUgeworCQlnbGNwcF9wYXJzZXJfcmVzb2x2ZV9pbXBsaWNpdF92ZXJzaW9uKHBhcnNlcik7CisJfSBwcF90b2tlbnMgTkVXTElORSB7CisKKwkJaWYgKHBhcnNlci0+c2tpcF9zdGFjayA9PSBOVUxMIHx8CisJCSAgICBwYXJzZXItPnNraXBfc3RhY2stPnR5cGUgPT0gU0tJUF9OT19TS0lQKQorCQl7CisJCQlfZ2xjcHBfcGFyc2VyX2V4cGFuZF9hbmRfbGV4X2Zyb20gKHBhcnNlciwKKwkJCQkJCQkgICBMSU5FX0VYUEFOREVELCAkMyk7CisJCX0KKwl9Cit8CXRleHRfbGluZSB7CisJCV9nbGNwcF9wYXJzZXJfcHJpbnRfZXhwYW5kZWRfdG9rZW5fbGlzdCAocGFyc2VyLCAkMSk7CisJCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKCZwYXJzZXItPm91dHB1dCwgJnBhcnNlci0+b3V0cHV0X2xlbmd0aCwgIlxuIik7CisJCXJhbGxvY19mcmVlICgkMSk7CisJfQorfAlleHBhbmRlZF9saW5lCit8CUhBU0ggbm9uX2RpcmVjdGl2ZQorOworCitleHBhbmRlZF9saW5lOgorCUlGX0VYUEFOREVEIGV4cHJlc3Npb24gTkVXTElORSB7CisJCV9nbGNwcF9wYXJzZXJfc2tpcF9zdGFja19wdXNoX2lmIChwYXJzZXIsICYgQDEsICQyKTsKKwl9Cit8CUVMSUZfRVhQQU5ERUQgZXhwcmVzc2lvbiBORVdMSU5FIHsKKwkJX2dsY3BwX3BhcnNlcl9za2lwX3N0YWNrX2NoYW5nZV9pZiAocGFyc2VyLCAmIEAxLCAiZWxpZiIsICQyKTsKKwl9Cit8CUxJTkVfRVhQQU5ERUQgaW50ZWdlcl9jb25zdGFudCBORVdMSU5FIHsKKwkJcGFyc2VyLT5oYXNfbmV3X2xpbmVfbnVtYmVyID0gMTsKKwkJcGFyc2VyLT5uZXdfbGluZV9udW1iZXIgPSAkMjsKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAoJnBhcnNlci0+b3V0cHV0LAorCQkJCQkgICAgICAmcGFyc2VyLT5vdXRwdXRfbGVuZ3RoLAorCQkJCQkgICAgICAiI2xpbmUgJSIgUFJJaU1BWCAiXG4iLAorCQkJCQkgICAgICAkMik7CisJfQorfAlMSU5FX0VYUEFOREVEIGludGVnZXJfY29uc3RhbnQgaW50ZWdlcl9jb25zdGFudCBORVdMSU5FIHsKKwkJcGFyc2VyLT5oYXNfbmV3X2xpbmVfbnVtYmVyID0gMTsKKwkJcGFyc2VyLT5uZXdfbGluZV9udW1iZXIgPSAkMjsKKwkJcGFyc2VyLT5oYXNfbmV3X3NvdXJjZV9udW1iZXIgPSAxOworCQlwYXJzZXItPm5ld19zb3VyY2VfbnVtYmVyID0gJDM7CisJCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKCZwYXJzZXItPm91dHB1dCwKKwkJCQkJICAgICAgJnBhcnNlci0+b3V0cHV0X2xlbmd0aCwKKwkJCQkJICAgICAgIiNsaW5lICUiIFBSSWlNQVggIiAlIiBQUklpTUFYICJcbiIsCisJCQkJCSAgICAgICQyLCAkMyk7CisJfQorOworCitkZWZpbmU6CisJT0JKX0lERU5USUZJRVIgcmVwbGFjZW1lbnRfbGlzdCBORVdMSU5FIHsKKwkJX2RlZmluZV9vYmplY3RfbWFjcm8gKHBhcnNlciwgJiBAMSwgJDEsICQyKTsKKwl9Cit8CUZVTkNfSURFTlRJRklFUiAnKCcgJyknIHJlcGxhY2VtZW50X2xpc3QgTkVXTElORSB7CisJCV9kZWZpbmVfZnVuY3Rpb25fbWFjcm8gKHBhcnNlciwgJiBAMSwgJDEsIE5VTEwsICQ0KTsKKwl9Cit8CUZVTkNfSURFTlRJRklFUiAnKCcgaWRlbnRpZmllcl9saXN0ICcpJyByZXBsYWNlbWVudF9saXN0IE5FV0xJTkUgeworCQlfZGVmaW5lX2Z1bmN0aW9uX21hY3JvIChwYXJzZXIsICYgQDEsICQxLCAkMywgJDUpOworCX0KKzsKKworY29udHJvbF9saW5lOgorCUhBU0hfREVGSU5FIHsKKwkJZ2xjcHBfcGFyc2VyX3Jlc29sdmVfaW1wbGljaXRfdmVyc2lvbihwYXJzZXIpOworCX0gZGVmaW5lCit8CUhBU0hfVU5ERUYgeworCQlnbGNwcF9wYXJzZXJfcmVzb2x2ZV9pbXBsaWNpdF92ZXJzaW9uKHBhcnNlcik7CisJfSBJREVOVElGSUVSIE5FV0xJTkUgeworCQltYWNyb190ICptYWNybyA9IGhhc2hfdGFibGVfZmluZCAocGFyc2VyLT5kZWZpbmVzLCAkMyk7CisJCWlmIChtYWNybykgeworCQkJaGFzaF90YWJsZV9yZW1vdmUgKHBhcnNlci0+ZGVmaW5lcywgJDMpOworCQkJcmFsbG9jX2ZyZWUgKG1hY3JvKTsKKwkJfQorCQlyYWxsb2NfZnJlZSAoJDMpOworCX0KK3wJSEFTSF9JRiB7CisJCWdsY3BwX3BhcnNlcl9yZXNvbHZlX2ltcGxpY2l0X3ZlcnNpb24ocGFyc2VyKTsKKwl9IGNvbmRpdGlvbmFsX3Rva2VucyBORVdMSU5FIHsKKwkJLyogQmUgY2FyZWZ1bCB0byBvbmx5IGV2YWx1YXRlIHRoZSAnaWYnIGV4cHJlc3Npb24gaWYKKwkJICogd2UgYXJlIG5vdCBza2lwcGluZy4gV2hlbiB3ZSBhcmUgc2tpcHBpbmcsIHdlCisJCSAqIHNpbXBseSBwdXNoIGEgbmV3IDAtdmFsdWVkICdpZicgb250byB0aGUgc2tpcAorCQkgKiBzdGFjay4KKwkJICoKKwkJICogVGhpcyBhdm9pZHMgZ2VuZXJhdGluZyBkaWFnbm9zdGljcyBmb3IgaW52YWxpZAorCQkgKiBleHByZXNzaW9ucyB0aGF0IGFyZSBiZWluZyBza2lwcGVkLiAqLworCQlpZiAocGFyc2VyLT5za2lwX3N0YWNrID09IE5VTEwgfHwKKwkJICAgIHBhcnNlci0+c2tpcF9zdGFjay0+dHlwZSA9PSBTS0lQX05PX1NLSVApCisJCXsKKwkJCV9nbGNwcF9wYXJzZXJfZXhwYW5kX2FuZF9sZXhfZnJvbSAocGFyc2VyLAorCQkJCQkJCSAgIElGX0VYUEFOREVELCAkMyk7CisJCX0JCisJCWVsc2UKKwkJeworCQkJX2dsY3BwX3BhcnNlcl9za2lwX3N0YWNrX3B1c2hfaWYgKHBhcnNlciwgJiBAMSwgMCk7CisJCQlwYXJzZXItPnNraXBfc3RhY2stPnR5cGUgPSBTS0lQX1RPX0VORElGOworCQl9CisJfQorfAlIQVNIX0lGIE5FV0xJTkUgeworCQkvKiAjaWYgd2l0aG91dCBhbiBleHByZXNzaW9uIGlzIG9ubHkgYW4gZXJyb3IgaWYgd2UKKwkJICogIGFyZSBub3Qgc2tpcHBpbmcgKi8KKwkJaWYgKHBhcnNlci0+c2tpcF9zdGFjayA9PSBOVUxMIHx8CisJCSAgICBwYXJzZXItPnNraXBfc3RhY2stPnR5cGUgPT0gU0tJUF9OT19TS0lQKQorCQl7CisJCQlnbGNwcF9lcnJvcigmIEAxLCBwYXJzZXIsICIjaWYgd2l0aCBubyBleHByZXNzaW9uIik7CisJCX0JCisJCV9nbGNwcF9wYXJzZXJfc2tpcF9zdGFja19wdXNoX2lmIChwYXJzZXIsICYgQDEsIDApOworCX0KK3wJSEFTSF9JRkRFRiB7CisJCWdsY3BwX3BhcnNlcl9yZXNvbHZlX2ltcGxpY2l0X3ZlcnNpb24ocGFyc2VyKTsKKwl9IElERU5USUZJRVIganVuayBORVdMSU5FIHsKKwkJbWFjcm9fdCAqbWFjcm8gPSBoYXNoX3RhYmxlX2ZpbmQgKHBhcnNlci0+ZGVmaW5lcywgJDMpOworCQlyYWxsb2NfZnJlZSAoJDMpOworCQlfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfcHVzaF9pZiAocGFyc2VyLCAmIEAxLCBtYWNybyAhPSBOVUxMKTsKKwl9Cit8CUhBU0hfSUZOREVGIHsKKwkJZ2xjcHBfcGFyc2VyX3Jlc29sdmVfaW1wbGljaXRfdmVyc2lvbihwYXJzZXIpOworCX0gSURFTlRJRklFUiBqdW5rIE5FV0xJTkUgeworCQltYWNyb190ICptYWNybyA9IGhhc2hfdGFibGVfZmluZCAocGFyc2VyLT5kZWZpbmVzLCAkMyk7CisJCXJhbGxvY19mcmVlICgkMyk7CisJCV9nbGNwcF9wYXJzZXJfc2tpcF9zdGFja19wdXNoX2lmIChwYXJzZXIsICYgQDIsIG1hY3JvID09IE5VTEwpOworCX0KK3wJSEFTSF9FTElGIGNvbmRpdGlvbmFsX3Rva2VucyBORVdMSU5FIHsKKwkJLyogQmUgY2FyZWZ1bCB0byBvbmx5IGV2YWx1YXRlIHRoZSAnZWxpZicgZXhwcmVzc2lvbgorCQkgKiBpZiB3ZSBhcmUgbm90IHNraXBwaW5nLiBXaGVuIHdlIGFyZSBza2lwcGluZywgd2UKKwkJICogc2ltcGx5IGNoYW5nZSB0byBhIDAtdmFsdWVkICdlbGlmJyBvbiB0aGUgc2tpcAorCQkgKiBzdGFjay4KKwkJICoKKwkJICogVGhpcyBhdm9pZHMgZ2VuZXJhdGluZyBkaWFnbm9zdGljcyBmb3IgaW52YWxpZAorCQkgKiBleHByZXNzaW9ucyB0aGF0IGFyZSBiZWluZyBza2lwcGVkLiAqLworCQlpZiAocGFyc2VyLT5za2lwX3N0YWNrICYmCisJCSAgICBwYXJzZXItPnNraXBfc3RhY2stPnR5cGUgPT0gU0tJUF9UT19FTFNFKQorCQl7CisJCQlfZ2xjcHBfcGFyc2VyX2V4cGFuZF9hbmRfbGV4X2Zyb20gKHBhcnNlciwKKwkJCQkJCQkgICBFTElGX0VYUEFOREVELCAkMik7CisJCX0KKwkJZWxzZSBpZiAocGFyc2VyLT5za2lwX3N0YWNrICYmCisJCSAgICBwYXJzZXItPnNraXBfc3RhY2stPmhhc19lbHNlKQorCQl7CisJCQlnbGNwcF9lcnJvcigmIEAxLCBwYXJzZXIsICIjZWxpZiBhZnRlciAjZWxzZSIpOworCQl9CisJCWVsc2UKKwkJeworCQkJX2dsY3BwX3BhcnNlcl9za2lwX3N0YWNrX2NoYW5nZV9pZiAocGFyc2VyLCAmIEAxLAorCQkJCQkJCSAgICAiZWxpZiIsIDApOworCQl9CisJfQorfAlIQVNIX0VMSUYgTkVXTElORSB7CisJCS8qICNlbGlmIHdpdGhvdXQgYW4gZXhwcmVzc2lvbiBpcyBhbiBlcnJvciB1bmxlc3Mgd2UKKwkJICogYXJlIHNraXBwaW5nLiAqLworCQlpZiAocGFyc2VyLT5za2lwX3N0YWNrICYmCisJCSAgICBwYXJzZXItPnNraXBfc3RhY2stPnR5cGUgPT0gU0tJUF9UT19FTFNFKQorCQl7CisJCQlnbGNwcF9lcnJvcigmIEAxLCBwYXJzZXIsICIjZWxpZiB3aXRoIG5vIGV4cHJlc3Npb24iKTsKKwkJfQorCQllbHNlIGlmIChwYXJzZXItPnNraXBfc3RhY2sgJiYKKwkJICAgIHBhcnNlci0+c2tpcF9zdGFjay0+aGFzX2Vsc2UpCisJCXsKKwkJCWdsY3BwX2Vycm9yKCYgQDEsIHBhcnNlciwgIiNlbGlmIGFmdGVyICNlbHNlIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfY2hhbmdlX2lmIChwYXJzZXIsICYgQDEsCisJCQkJCQkJICAgICJlbGlmIiwgMCk7CisJCQlnbGNwcF93YXJuaW5nKCYgQDEsIHBhcnNlciwgImlnbm9yaW5nIGlsbGVnYWwgI2VsaWYgd2l0aG91dCBleHByZXNzaW9uIik7CisJCX0KKwl9Cit8CUhBU0hfRUxTRSB7CisJCWlmIChwYXJzZXItPnNraXBfc3RhY2sgJiYKKwkJICAgIHBhcnNlci0+c2tpcF9zdGFjay0+aGFzX2Vsc2UpCisJCXsKKwkJCWdsY3BwX2Vycm9yKCYgQDEsIHBhcnNlciwgIm11bHRpcGxlICNlbHNlIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfY2hhbmdlX2lmIChwYXJzZXIsICYgQDEsICJlbHNlIiwgMSk7CisJCQlpZiAocGFyc2VyLT5za2lwX3N0YWNrKQorCQkJCXBhcnNlci0+c2tpcF9zdGFjay0+aGFzX2Vsc2UgPSB0cnVlOworCQl9CisJfSBORVdMSU5FCit8CUhBU0hfRU5ESUYgeworCQlfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfcG9wIChwYXJzZXIsICYgQDEpOworCX0gTkVXTElORQorfAlIQVNIX1ZFUlNJT04gaW50ZWdlcl9jb25zdGFudCBORVdMSU5FIHsKKwkJaWYgKHBhcnNlci0+dmVyc2lvbl9yZXNvbHZlZCkgeworCQkJZ2xjcHBfZXJyb3IoJiBAMSwgcGFyc2VyLCAiI3ZlcnNpb24gbXVzdCBhcHBlYXIgb24gdGhlIGZpcnN0IGxpbmUiKTsKKwkJfQorCQlfZ2xjcHBfcGFyc2VyX2hhbmRsZV92ZXJzaW9uX2RlY2xhcmF0aW9uKHBhcnNlciwgJDIsIE5VTEwsIHRydWUpOworCX0KK3wJSEFTSF9WRVJTSU9OIGludGVnZXJfY29uc3RhbnQgSURFTlRJRklFUiBORVdMSU5FIHsKKwkJaWYgKHBhcnNlci0+dmVyc2lvbl9yZXNvbHZlZCkgeworCQkJZ2xjcHBfZXJyb3IoJiBAMSwgcGFyc2VyLCAiI3ZlcnNpb24gbXVzdCBhcHBlYXIgb24gdGhlIGZpcnN0IGxpbmUiKTsKKwkJfQorCQlfZ2xjcHBfcGFyc2VyX2hhbmRsZV92ZXJzaW9uX2RlY2xhcmF0aW9uKHBhcnNlciwgJDIsICQzLCB0cnVlKTsKKwl9Cit8CUhBU0ggTkVXTElORSB7CisJCWdsY3BwX3BhcnNlcl9yZXNvbHZlX2ltcGxpY2l0X3ZlcnNpb24ocGFyc2VyKTsKKwl9Cis7CisKK2ludGVnZXJfY29uc3RhbnQ6CisJSU5URUdFUl9TVFJJTkcgeworCQlpZiAoc3RybGVuICgkMSkgPj0gMyAmJiBzdHJuY21wICgkMSwgIjB4IiwgMikgPT0gMCkgeworCQkJJCQgPSBzdHJ0b2xsICgkMSArIDIsIE5VTEwsIDE2KTsKKwkJfSBlbHNlIGlmICgkMVswXSA9PSAnMCcpIHsKKwkJCSQkID0gc3RydG9sbCAoJDEsIE5VTEwsIDgpOworCQl9IGVsc2UgeworCQkJJCQgPSBzdHJ0b2xsICgkMSwgTlVMTCwgMTApOworCQl9CisJfQorfAlJTlRFR0VSIHsKKwkJJCQgPSAkMTsKKwl9CisKK2V4cHJlc3Npb246CisJaW50ZWdlcl9jb25zdGFudAorfAlJREVOVElGSUVSIHsKKwkJaWYgKHBhcnNlci0+aXNfZ2xlcykKKwkJCWdsY3BwX2Vycm9yKCYgQDEsIHBhcnNlciwgInVuZGVmaW5lZCBtYWNybyAlcyBpbiBleHByZXNzaW9uIChpbGxlZ2FsIGluIEdMRVMpIiwgJDEpOworCQkkJCA9IDA7CisJfQorfAlleHByZXNzaW9uIE9SIGV4cHJlc3Npb24geworCQkkJCA9ICQxIHx8ICQzOworCX0KK3wJZXhwcmVzc2lvbiBBTkQgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgJiYgJDM7CisJfQorfAlleHByZXNzaW9uICd8JyBleHByZXNzaW9uIHsKKwkJJCQgPSAkMSB8ICQzOworCX0KK3wJZXhwcmVzc2lvbiAnXicgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgXiAkMzsKKwl9Cit8CWV4cHJlc3Npb24gJyYnIGV4cHJlc3Npb24geworCQkkJCA9ICQxICYgJDM7CisJfQorfAlleHByZXNzaW9uIE5PVF9FUVVBTCBleHByZXNzaW9uIHsKKwkJJCQgPSAkMSAhPSAkMzsKKwl9Cit8CWV4cHJlc3Npb24gRVFVQUwgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgPT0gJDM7CisJfQorfAlleHByZXNzaW9uIEdSRUFURVJfT1JfRVFVQUwgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgPj0gJDM7CisJfQorfAlleHByZXNzaW9uIExFU1NfT1JfRVFVQUwgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgPD0gJDM7CisJfQorfAlleHByZXNzaW9uICc+JyBleHByZXNzaW9uIHsKKwkJJCQgPSAkMSA+ICQzOworCX0KK3wJZXhwcmVzc2lvbiAnPCcgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgPCAkMzsKKwl9Cit8CWV4cHJlc3Npb24gUklHSFRfU0hJRlQgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgPj4gJDM7CisJfQorfAlleHByZXNzaW9uIExFRlRfU0hJRlQgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgPDwgJDM7CisJfQorfAlleHByZXNzaW9uICctJyBleHByZXNzaW9uIHsKKwkJJCQgPSAkMSAtICQzOworCX0KK3wJZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgKyAkMzsKKwl9Cit8CWV4cHJlc3Npb24gJyUnIGV4cHJlc3Npb24geworCQlpZiAoJDMgPT0gMCkgeworCQkJeXllcnJvciAoJiBAMSwgcGFyc2VyLAorCQkJCSAiemVybyBtb2R1bHVzIGluIHByZXByb2Nlc3NvciBkaXJlY3RpdmUiKTsKKwkJfSBlbHNlIHsKKwkJCSQkID0gJDEgJSAkMzsKKwkJfQorCX0KK3wJZXhwcmVzc2lvbiAnLycgZXhwcmVzc2lvbiB7CisJCWlmICgkMyA9PSAwKSB7CisJCQl5eWVycm9yICgmIEAxLCBwYXJzZXIsCisJCQkJICJkaXZpc2lvbiBieSAwIGluIHByZXByb2Nlc3NvciBkaXJlY3RpdmUiKTsKKwkJfSBlbHNlIHsKKwkJCSQkID0gJDEgLyAkMzsKKwkJfQorCX0KK3wJZXhwcmVzc2lvbiAnKicgZXhwcmVzc2lvbiB7CisJCSQkID0gJDEgKiAkMzsKKwl9Cit8CSchJyBleHByZXNzaW9uICVwcmVjIFVOQVJZIHsKKwkJJCQgPSAhICQyOworCX0KK3wJJ34nIGV4cHJlc3Npb24gJXByZWMgVU5BUlkgeworCQkkJCA9IH4gJDI7CisJfQorfAknLScgZXhwcmVzc2lvbiAlcHJlYyBVTkFSWSB7CisJCSQkID0gLSAkMjsKKwl9Cit8CScrJyBleHByZXNzaW9uICVwcmVjIFVOQVJZIHsKKwkJJCQgPSArICQyOworCX0KK3wJJygnIGV4cHJlc3Npb24gJyknIHsKKwkJJCQgPSAkMjsKKwl9Cis7CisKK2lkZW50aWZpZXJfbGlzdDoKKwlJREVOVElGSUVSIHsKKwkJJCQgPSBfc3RyaW5nX2xpc3RfY3JlYXRlIChwYXJzZXIpOworCQlfc3RyaW5nX2xpc3RfYXBwZW5kX2l0ZW0gKCQkLCAkMSk7CisJCXJhbGxvY19zdGVhbCAoJCQsICQxKTsKKwl9Cit8CWlkZW50aWZpZXJfbGlzdCAnLCcgSURFTlRJRklFUiB7CisJCSQkID0gJDE7CQorCQlfc3RyaW5nX2xpc3RfYXBwZW5kX2l0ZW0gKCQkLCAkMyk7CisJCXJhbGxvY19zdGVhbCAoJCQsICQzKTsKKwl9Cis7CisKK3RleHRfbGluZToKKwlORVdMSU5FIHsgJCQgPSBOVUxMOyB9Cit8CXBwX3Rva2VucyBORVdMSU5FCis7CisKK25vbl9kaXJlY3RpdmU6CisJcHBfdG9rZW5zIE5FV0xJTkUgeworCQl5eWVycm9yICgmIEAxLCBwYXJzZXIsICJJbnZhbGlkIHRva2VucyBhZnRlciAjIik7CisJfQorOworCityZXBsYWNlbWVudF9saXN0OgorCS8qIGVtcHR5ICovIHsgJCQgPSBOVUxMOyB9Cit8CXBwX3Rva2VucworOworCitqdW5rOgorCS8qIGVtcHR5ICovCit8CXBwX3Rva2VucyB7CisJCWdsY3BwX3dhcm5pbmcoJkAxLCBwYXJzZXIsICJleHRyYSB0b2tlbnMgYXQgZW5kIG9mIGRpcmVjdGl2ZSIpOworCX0KKzsKKworY29uZGl0aW9uYWxfdG9rZW46CisJLyogSGFuZGxlICJkZWZpbmVkIiBvcGVyYXRvciAqLworCURFRklORUQgSURFTlRJRklFUiB7CisJCWludCB2ID0gaGFzaF90YWJsZV9maW5kIChwYXJzZXItPmRlZmluZXMsICQyKSA/IDEgOiAwOworCQkkJCA9IF90b2tlbl9jcmVhdGVfaXZhbCAocGFyc2VyLCBJTlRFR0VSLCB2KTsKKwl9Cit8CURFRklORUQgJygnIElERU5USUZJRVIgJyknIHsKKwkJaW50IHYgPSBoYXNoX3RhYmxlX2ZpbmQgKHBhcnNlci0+ZGVmaW5lcywgJDMpID8gMSA6IDA7CisJCSQkID0gX3Rva2VuX2NyZWF0ZV9pdmFsIChwYXJzZXIsIElOVEVHRVIsIHYpOworCX0KK3wJcHJlcHJvY2Vzc2luZ190b2tlbgorOworCitjb25kaXRpb25hbF90b2tlbnM6CisJLyogRXhhY3RseSB0aGUgc2FtZSBhcyBwcF90b2tlbnMsIGJ1dCB1c2luZyBjb25kaXRpb25hbF90b2tlbiAqLworCWNvbmRpdGlvbmFsX3Rva2VuIHsKKwkJJCQgPSBfdG9rZW5fbGlzdF9jcmVhdGUgKHBhcnNlcik7CisJCV90b2tlbl9saXN0X2FwcGVuZCAoJCQsICQxKTsKKwl9Cit8CWNvbmRpdGlvbmFsX3Rva2VucyBjb25kaXRpb25hbF90b2tlbiB7CisJCSQkID0gJDE7CisJCV90b2tlbl9saXN0X2FwcGVuZCAoJCQsICQyKTsKKwl9Cis7CisKK3BwX3Rva2VuczoKKwlwcmVwcm9jZXNzaW5nX3Rva2VuIHsKKwkJcGFyc2VyLT5zcGFjZV90b2tlbnMgPSAxOworCQkkJCA9IF90b2tlbl9saXN0X2NyZWF0ZSAocGFyc2VyKTsKKwkJX3Rva2VuX2xpc3RfYXBwZW5kICgkJCwgJDEpOworCX0KK3wJcHBfdG9rZW5zIHByZXByb2Nlc3NpbmdfdG9rZW4geworCQkkJCA9ICQxOworCQlfdG9rZW5fbGlzdF9hcHBlbmQgKCQkLCAkMik7CisJfQorOworCitwcmVwcm9jZXNzaW5nX3Rva2VuOgorCUlERU5USUZJRVIgeworCQkkJCA9IF90b2tlbl9jcmVhdGVfc3RyIChwYXJzZXIsIElERU5USUZJRVIsICQxKTsKKwkJJCQtPmxvY2F0aW9uID0geXlsbG9jOworCX0KK3wJSU5URUdFUl9TVFJJTkcgeworCQkkJCA9IF90b2tlbl9jcmVhdGVfc3RyIChwYXJzZXIsIElOVEVHRVJfU1RSSU5HLCAkMSk7CisJCSQkLT5sb2NhdGlvbiA9IHl5bGxvYzsKKwl9Cit8CW9wZXJhdG9yIHsKKwkJJCQgPSBfdG9rZW5fY3JlYXRlX2l2YWwgKHBhcnNlciwgJDEsICQxKTsKKwkJJCQtPmxvY2F0aW9uID0geXlsbG9jOworCX0KK3wJT1RIRVIgeworCQkkJCA9IF90b2tlbl9jcmVhdGVfc3RyIChwYXJzZXIsIE9USEVSLCAkMSk7CisJCSQkLT5sb2NhdGlvbiA9IHl5bGxvYzsKKwl9Cit8CVNQQUNFIHsKKwkJJCQgPSBfdG9rZW5fY3JlYXRlX2l2YWwgKHBhcnNlciwgU1BBQ0UsIFNQQUNFKTsKKwkJJCQtPmxvY2F0aW9uID0geXlsbG9jOworCX0KKzsKKworb3BlcmF0b3I6CisJJ1snCQkJeyAkJCA9ICdbJzsgfQorfAknXScJCQl7ICQkID0gJ10nOyB9Cit8CScoJwkJCXsgJCQgPSAnKCc7IH0KK3wJJyknCQkJeyAkJCA9ICcpJzsgfQorfAkneycJCQl7ICQkID0gJ3snOyB9Cit8CSd9JwkJCXsgJCQgPSAnfSc7IH0KK3wJJy4nCQkJeyAkJCA9ICcuJzsgfQorfAknJicJCQl7ICQkID0gJyYnOyB9Cit8CScqJwkJCXsgJCQgPSAnKic7IH0KK3wJJysnCQkJeyAkJCA9ICcrJzsgfQorfAknLScJCQl7ICQkID0gJy0nOyB9Cit8CSd+JwkJCXsgJCQgPSAnfic7IH0KK3wJJyEnCQkJeyAkJCA9ICchJzsgfQorfAknLycJCQl7ICQkID0gJy8nOyB9Cit8CSclJwkJCXsgJCQgPSAnJSc7IH0KK3wJTEVGVF9TSElGVAkJeyAkJCA9IExFRlRfU0hJRlQ7IH0KK3wJUklHSFRfU0hJRlQJCXsgJCQgPSBSSUdIVF9TSElGVDsgfQorfAknPCcJCQl7ICQkID0gJzwnOyB9Cit8CSc+JwkJCXsgJCQgPSAnPic7IH0KK3wJTEVTU19PUl9FUVVBTAkJeyAkJCA9IExFU1NfT1JfRVFVQUw7IH0KK3wJR1JFQVRFUl9PUl9FUVVBTAl7ICQkID0gR1JFQVRFUl9PUl9FUVVBTDsgfQorfAlFUVVBTAkJCXsgJCQgPSBFUVVBTDsgfQorfAlOT1RfRVFVQUwJCXsgJCQgPSBOT1RfRVFVQUw7IH0KK3wJJ14nCQkJeyAkJCA9ICdeJzsgfQorfAknfCcJCQl7ICQkID0gJ3wnOyB9Cit8CUFORAkJCXsgJCQgPSBBTkQ7IH0KK3wJT1IJCQl7ICQkID0gT1I7IH0KK3wJJzsnCQkJeyAkJCA9ICc7JzsgfQorfAknLCcJCQl7ICQkID0gJywnOyB9Cit8CSc9JwkJCXsgJCQgPSAnPSc7IH0KK3wJUEFTVEUJCQl7ICQkID0gUEFTVEU7IH0KKzsKKworJSUKKworc3RyaW5nX2xpc3RfdCAqCitfc3RyaW5nX2xpc3RfY3JlYXRlICh2b2lkICpjdHgpCit7CisJc3RyaW5nX2xpc3RfdCAqbGlzdDsKKworCWxpc3QgPSByYWxsb2MgKGN0eCwgc3RyaW5nX2xpc3RfdCk7CisJbGlzdC0+aGVhZCA9IE5VTEw7CisJbGlzdC0+dGFpbCA9IE5VTEw7CisKKwlyZXR1cm4gbGlzdDsKK30KKwordm9pZAorX3N0cmluZ19saXN0X2FwcGVuZF9pdGVtIChzdHJpbmdfbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RyaW5nX25vZGVfdCAqbm9kZTsKKworCW5vZGUgPSByYWxsb2MgKGxpc3QsIHN0cmluZ19ub2RlX3QpOworCW5vZGUtPnN0ciA9IHJhbGxvY19zdHJkdXAgKG5vZGUsIHN0cik7CisKKwlub2RlLT5uZXh0ID0gTlVMTDsKKworCWlmIChsaXN0LT5oZWFkID09IE5VTEwpIHsKKwkJbGlzdC0+aGVhZCA9IG5vZGU7CisJfSBlbHNlIHsKKwkJbGlzdC0+dGFpbC0+bmV4dCA9IG5vZGU7CisJfQorCisJbGlzdC0+dGFpbCA9IG5vZGU7Cit9CisKK2ludAorX3N0cmluZ19saXN0X2NvbnRhaW5zIChzdHJpbmdfbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICptZW1iZXIsIGludCAqaW5kZXgpCit7CisJc3RyaW5nX25vZGVfdCAqbm9kZTsKKwlpbnQgaTsKKworCWlmIChsaXN0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMCwgbm9kZSA9IGxpc3QtPmhlYWQ7IG5vZGU7IGkrKywgbm9kZSA9IG5vZGUtPm5leHQpIHsKKwkJaWYgKHN0cmNtcCAobm9kZS0+c3RyLCBtZW1iZXIpID09IDApIHsKKwkJCWlmIChpbmRleCkKKwkJCQkqaW5kZXggPSBpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Citfc3RyaW5nX2xpc3RfbGVuZ3RoIChzdHJpbmdfbGlzdF90ICpsaXN0KQoreworCWludCBsZW5ndGggPSAwOworCXN0cmluZ19ub2RlX3QgKm5vZGU7CisKKwlpZiAobGlzdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZvciAobm9kZSA9IGxpc3QtPmhlYWQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KQorCQlsZW5ndGgrKzsKKworCXJldHVybiBsZW5ndGg7Cit9CisKK2ludAorX3N0cmluZ19saXN0X2VxdWFsIChzdHJpbmdfbGlzdF90ICphLCBzdHJpbmdfbGlzdF90ICpiKQoreworCXN0cmluZ19ub2RlX3QgKm5vZGVfYSwgKm5vZGVfYjsKKworCWlmIChhID09IE5VTEwgJiYgYiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZvciAobm9kZV9hID0gYS0+aGVhZCwgbm9kZV9iID0gYi0+aGVhZDsKKwkgICAgIG5vZGVfYSAmJiBub2RlX2I7CisJICAgICBub2RlX2EgPSBub2RlX2EtPm5leHQsIG5vZGVfYiA9IG5vZGVfYi0+bmV4dCkKKwl7CisJCWlmIChzdHJjbXAgKG5vZGVfYS0+c3RyLCBub2RlX2ItPnN0cikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDYXRjaCB0aGUgY2FzZSBvZiBsaXN0cyBiZWluZyBkaWZmZXJlbnQgbGVuZ3RocywgKHdoaWNoCisJICogd291bGQgY2F1c2UgdGhlIGxvb3AgYWJvdmUgdG8gdGVybWluYXRlIGFmdGVyIHRoZSBzaG9ydGVyCisJICogbGlzdCkuICovCisJcmV0dXJuIG5vZGVfYSA9PSBub2RlX2I7Cit9CisKK2FyZ3VtZW50X2xpc3RfdCAqCitfYXJndW1lbnRfbGlzdF9jcmVhdGUgKHZvaWQgKmN0eCkKK3sKKwlhcmd1bWVudF9saXN0X3QgKmxpc3Q7CisKKwlsaXN0ID0gcmFsbG9jIChjdHgsIGFyZ3VtZW50X2xpc3RfdCk7CisJbGlzdC0+aGVhZCA9IE5VTEw7CisJbGlzdC0+dGFpbCA9IE5VTEw7CisKKwlyZXR1cm4gbGlzdDsKK30KKwordm9pZAorX2FyZ3VtZW50X2xpc3RfYXBwZW5kIChhcmd1bWVudF9saXN0X3QgKmxpc3QsIHRva2VuX2xpc3RfdCAqYXJndW1lbnQpCit7CisJYXJndW1lbnRfbm9kZV90ICpub2RlOworCisJbm9kZSA9IHJhbGxvYyAobGlzdCwgYXJndW1lbnRfbm9kZV90KTsKKwlub2RlLT5hcmd1bWVudCA9IGFyZ3VtZW50OworCisJbm9kZS0+bmV4dCA9IE5VTEw7CisKKwlpZiAobGlzdC0+aGVhZCA9PSBOVUxMKSB7CisJCWxpc3QtPmhlYWQgPSBub2RlOworCX0gZWxzZSB7CisJCWxpc3QtPnRhaWwtPm5leHQgPSBub2RlOworCX0KKworCWxpc3QtPnRhaWwgPSBub2RlOworfQorCitpbnQKK19hcmd1bWVudF9saXN0X2xlbmd0aCAoYXJndW1lbnRfbGlzdF90ICpsaXN0KQoreworCWludCBsZW5ndGggPSAwOworCWFyZ3VtZW50X25vZGVfdCAqbm9kZTsKKworCWlmIChsaXN0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChub2RlID0gbGlzdC0+aGVhZDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisJCWxlbmd0aCsrOworCisJcmV0dXJuIGxlbmd0aDsKK30KKwordG9rZW5fbGlzdF90ICoKK19hcmd1bWVudF9saXN0X21lbWJlcl9hdCAoYXJndW1lbnRfbGlzdF90ICpsaXN0LCBpbnQgaW5kZXgpCit7CisJYXJndW1lbnRfbm9kZV90ICpub2RlOworCWludCBpOworCisJaWYgKGxpc3QgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlub2RlID0gbGlzdC0+aGVhZDsKKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworCQlub2RlID0gbm9kZS0+bmV4dDsKKwkJaWYgKG5vZGUgPT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKworCWlmIChub2RlKQorCQlyZXR1cm4gbm9kZS0+YXJndW1lbnQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogTm90ZTogVGhpcyBmdW5jdGlvbiByYWxsb2Nfc3RlYWwoKXMgdGhlIHN0ciBwb2ludGVyLiAqLwordG9rZW5fdCAqCitfdG9rZW5fY3JlYXRlX3N0ciAodm9pZCAqY3R4LCBpbnQgdHlwZSwgY2hhciAqc3RyKQoreworCXRva2VuX3QgKnRva2VuOworCisJdG9rZW4gPSByYWxsb2MgKGN0eCwgdG9rZW5fdCk7CisJdG9rZW4tPnR5cGUgPSB0eXBlOworCXRva2VuLT52YWx1ZS5zdHIgPSBzdHI7CisKKwlyYWxsb2Nfc3RlYWwgKHRva2VuLCBzdHIpOworCisJcmV0dXJuIHRva2VuOworfQorCit0b2tlbl90ICoKK190b2tlbl9jcmVhdGVfaXZhbCAodm9pZCAqY3R4LCBpbnQgdHlwZSwgaW50IGl2YWwpCit7CisJdG9rZW5fdCAqdG9rZW47CisKKwl0b2tlbiA9IHJhbGxvYyAoY3R4LCB0b2tlbl90KTsKKwl0b2tlbi0+dHlwZSA9IHR5cGU7CisJdG9rZW4tPnZhbHVlLml2YWwgPSBpdmFsOworCisJcmV0dXJuIHRva2VuOworfQorCit0b2tlbl9saXN0X3QgKgorX3Rva2VuX2xpc3RfY3JlYXRlICh2b2lkICpjdHgpCit7CisJdG9rZW5fbGlzdF90ICpsaXN0OworCisJbGlzdCA9IHJhbGxvYyAoY3R4LCB0b2tlbl9saXN0X3QpOworCWxpc3QtPmhlYWQgPSBOVUxMOworCWxpc3QtPnRhaWwgPSBOVUxMOworCWxpc3QtPm5vbl9zcGFjZV90YWlsID0gTlVMTDsKKworCXJldHVybiBsaXN0OworfQorCit2b2lkCitfdG9rZW5fbGlzdF9hcHBlbmQgKHRva2VuX2xpc3RfdCAqbGlzdCwgdG9rZW5fdCAqdG9rZW4pCit7CisJdG9rZW5fbm9kZV90ICpub2RlOworCisJbm9kZSA9IHJhbGxvYyAobGlzdCwgdG9rZW5fbm9kZV90KTsKKwlub2RlLT50b2tlbiA9IHRva2VuOworCW5vZGUtPm5leHQgPSBOVUxMOworCisJaWYgKGxpc3QtPmhlYWQgPT0gTlVMTCkgeworCQlsaXN0LT5oZWFkID0gbm9kZTsKKwl9IGVsc2UgeworCQlsaXN0LT50YWlsLT5uZXh0ID0gbm9kZTsKKwl9CisKKwlsaXN0LT50YWlsID0gbm9kZTsKKwlpZiAodG9rZW4tPnR5cGUgIT0gU1BBQ0UpCisJCWxpc3QtPm5vbl9zcGFjZV90YWlsID0gbm9kZTsKK30KKwordm9pZAorX3Rva2VuX2xpc3RfYXBwZW5kX2xpc3QgKHRva2VuX2xpc3RfdCAqbGlzdCwgdG9rZW5fbGlzdF90ICp0YWlsKQoreworCWlmICh0YWlsID09IE5VTEwgfHwgdGFpbC0+aGVhZCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAobGlzdC0+aGVhZCA9PSBOVUxMKSB7CisJCWxpc3QtPmhlYWQgPSB0YWlsLT5oZWFkOworCX0gZWxzZSB7CisJCWxpc3QtPnRhaWwtPm5leHQgPSB0YWlsLT5oZWFkOworCX0KKworCWxpc3QtPnRhaWwgPSB0YWlsLT50YWlsOworCWxpc3QtPm5vbl9zcGFjZV90YWlsID0gdGFpbC0+bm9uX3NwYWNlX3RhaWw7Cit9CisKK3N0YXRpYyB0b2tlbl9saXN0X3QgKgorX3Rva2VuX2xpc3RfY29weSAodm9pZCAqY3R4LCB0b2tlbl9saXN0X3QgKm90aGVyKQoreworCXRva2VuX2xpc3RfdCAqY29weTsKKwl0b2tlbl9ub2RlX3QgKm5vZGU7CisKKwlpZiAob3RoZXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljb3B5ID0gX3Rva2VuX2xpc3RfY3JlYXRlIChjdHgpOworCWZvciAobm9kZSA9IG90aGVyLT5oZWFkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworCQl0b2tlbl90ICpuZXdfdG9rZW4gPSByYWxsb2MgKGNvcHksIHRva2VuX3QpOworCQkqbmV3X3Rva2VuID0gKm5vZGUtPnRva2VuOworCQlfdG9rZW5fbGlzdF9hcHBlbmQgKGNvcHksIG5ld190b2tlbik7CisJfQorCisJcmV0dXJuIGNvcHk7Cit9CisKK3N0YXRpYyB2b2lkCitfdG9rZW5fbGlzdF90cmltX3RyYWlsaW5nX3NwYWNlICh0b2tlbl9saXN0X3QgKmxpc3QpCit7CisJdG9rZW5fbm9kZV90ICp0YWlsLCAqbmV4dDsKKworCWlmIChsaXN0LT5ub25fc3BhY2VfdGFpbCkgeworCQl0YWlsID0gbGlzdC0+bm9uX3NwYWNlX3RhaWwtPm5leHQ7CisJCWxpc3QtPm5vbl9zcGFjZV90YWlsLT5uZXh0ID0gTlVMTDsKKwkJbGlzdC0+dGFpbCA9IGxpc3QtPm5vbl9zcGFjZV90YWlsOworCisJCXdoaWxlICh0YWlsKSB7CisJCQluZXh0ID0gdGFpbC0+bmV4dDsKKwkJCXJhbGxvY19mcmVlICh0YWlsKTsKKwkJCXRhaWwgPSBuZXh0OworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitfdG9rZW5fbGlzdF9pc19lbXB0eV9pZ25vcmluZ19zcGFjZSAodG9rZW5fbGlzdF90ICpsKQoreworCXRva2VuX25vZGVfdCAqbjsKKworCWlmIChsID09IE5VTEwpCisJCXJldHVybiAxOworCisJbiA9IGwtPmhlYWQ7CisJd2hpbGUgKG4gIT0gTlVMTCAmJiBuLT50b2tlbi0+dHlwZSA9PSBTUEFDRSkKKwkJbiA9IG4tPm5leHQ7CisKKwlyZXR1cm4gbiA9PSBOVUxMOworfQorCitpbnQKK190b2tlbl9saXN0X2VxdWFsX2lnbm9yaW5nX3NwYWNlICh0b2tlbl9saXN0X3QgKmEsIHRva2VuX2xpc3RfdCAqYikKK3sKKwl0b2tlbl9ub2RlX3QgKm5vZGVfYSwgKm5vZGVfYjsKKworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKSB7CisJCWludCBhX2VtcHR5ID0gX3Rva2VuX2xpc3RfaXNfZW1wdHlfaWdub3Jpbmdfc3BhY2UoYSk7CisJCWludCBiX2VtcHR5ID0gX3Rva2VuX2xpc3RfaXNfZW1wdHlfaWdub3Jpbmdfc3BhY2UoYik7CisJCXJldHVybiBhX2VtcHR5ID09IGJfZW1wdHk7CisJfQorCisJbm9kZV9hID0gYS0+aGVhZDsKKwlub2RlX2IgPSBiLT5oZWFkOworCisJd2hpbGUgKDEpCisJeworCQlpZiAobm9kZV9hID09IE5VTEwgJiYgbm9kZV9iID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAobm9kZV9hID09IE5VTEwgfHwgbm9kZV9iID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAobm9kZV9hLT50b2tlbi0+dHlwZSA9PSBTUEFDRSkgeworCQkJbm9kZV9hID0gbm9kZV9hLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobm9kZV9iLT50b2tlbi0+dHlwZSA9PSBTUEFDRSkgeworCQkJbm9kZV9iID0gbm9kZV9iLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobm9kZV9hLT50b2tlbi0+dHlwZSAhPSBub2RlX2ItPnRva2VuLT50eXBlKQorCQkJcmV0dXJuIDA7CisKKwkJc3dpdGNoIChub2RlX2EtPnRva2VuLT50eXBlKSB7CisJCWNhc2UgSU5URUdFUjoKKwkJCWlmIChub2RlX2EtPnRva2VuLT52YWx1ZS5pdmFsICE9IAorCQkJICAgIG5vZGVfYi0+dG9rZW4tPnZhbHVlLml2YWwpCisJCQl7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJREVOVElGSUVSOgorCQljYXNlIElOVEVHRVJfU1RSSU5HOgorCQljYXNlIE9USEVSOgorCQkJaWYgKHN0cmNtcCAobm9kZV9hLT50b2tlbi0+dmFsdWUuc3RyLAorCQkJCSAgICBub2RlX2ItPnRva2VuLT52YWx1ZS5zdHIpKQorCQkJeworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlub2RlX2EgPSBub2RlX2EtPm5leHQ7CisJCW5vZGVfYiA9IG5vZGVfYi0+bmV4dDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK190b2tlbl9wcmludCAoY2hhciAqKm91dCwgc2l6ZV90ICpsZW4sIHRva2VuX3QgKnRva2VuKQoreworCWlmICh0b2tlbi0+dHlwZSA8IDI1NikgeworCQlyYWxsb2NfYXNwcmludGZfcmV3cml0ZV90YWlsIChvdXQsIGxlbiwgIiVjIiwgdG9rZW4tPnR5cGUpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh0b2tlbi0+dHlwZSkgeworCWNhc2UgSU5URUdFUjoKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICIlIiBQUklpTUFYLCB0b2tlbi0+dmFsdWUuaXZhbCk7CisJCWJyZWFrOworCWNhc2UgSURFTlRJRklFUjoKKwljYXNlIElOVEVHRVJfU1RSSU5HOgorCWNhc2UgT1RIRVI6CisJCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKG91dCwgbGVuLCAiJXMiLCB0b2tlbi0+dmFsdWUuc3RyKTsKKwkJYnJlYWs7CisJY2FzZSBTUEFDRToKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICIgIik7CisJCWJyZWFrOworCWNhc2UgTEVGVF9TSElGVDoKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICI8PCIpOworCQlicmVhazsKKwljYXNlIFJJR0hUX1NISUZUOgorCQlyYWxsb2NfYXNwcmludGZfcmV3cml0ZV90YWlsIChvdXQsIGxlbiwgIj4+Iik7CisJCWJyZWFrOworCWNhc2UgTEVTU19PUl9FUVVBTDoKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICI8PSIpOworCQlicmVhazsKKwljYXNlIEdSRUFURVJfT1JfRVFVQUw6CisJCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKG91dCwgbGVuLCAiPj0iKTsKKwkJYnJlYWs7CisJY2FzZSBFUVVBTDoKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICI9PSIpOworCQlicmVhazsKKwljYXNlIE5PVF9FUVVBTDoKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICIhPSIpOworCQlicmVhazsKKwljYXNlIEFORDoKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICImJiIpOworCQlicmVhazsKKwljYXNlIE9SOgorCQlyYWxsb2NfYXNwcmludGZfcmV3cml0ZV90YWlsIChvdXQsIGxlbiwgInx8Iik7CisJCWJyZWFrOworCWNhc2UgUEFTVEU6CisJCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKG91dCwgbGVuLCAiIyMiKTsKKwkJYnJlYWs7CisJY2FzZSBDT01NQV9GSU5BTDoKKwkJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAob3V0LCBsZW4sICIsIik7CisJCWJyZWFrOworCWNhc2UgUExBQ0VIT0xERVI6CisJCS8qIE5vdGhpbmcgdG8gcHJpbnQuICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzc2VydCghIkVycm9yOiBEb24ndCBrbm93IGhvdyB0byBwcmludCB0b2tlbi4iKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBSZXR1cm4gYSBuZXcgdG9rZW4gKHJhbGxvYygpZWQgb2ZmIG9mICd0b2tlbicpIGZvcm1lZCBieSBwYXN0aW5nCisgKiAndG9rZW4nIGFuZCAnb3RoZXInLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuICd0b2tlbicgb3IKKyAqICdvdGhlcicgZGlyZWN0bHkgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhbnl0aGluZyBuZXcuCisgKgorICogQ2F1dGlvbjogT25seSB2ZXJ5IGN1cnNvcnkgZXJyb3ItY2hlY2tpbmcgaXMgcGVyZm9ybWVkIHRvIHNlZSBpZgorICogdGhlIGZpbmFsIHJlc3VsdCBpcyBhIHZhbGlkIHNpbmdsZSB0b2tlbi4gKi8KK3N0YXRpYyB0b2tlbl90ICoKK190b2tlbl9wYXN0ZSAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgdG9rZW5fdCAqdG9rZW4sIHRva2VuX3QgKm90aGVyKQoreworCXRva2VuX3QgKmNvbWJpbmVkID0gTlVMTDsKKworCS8qIFBhc3RpbmcgYSBwbGFjZWhvbGRlciBvbnRvIGFueXRoaW5nIG1ha2VzIG5vIGNoYW5nZS4gKi8KKwlpZiAob3RoZXItPnR5cGUgPT0gUExBQ0VIT0xERVIpCisJCXJldHVybiB0b2tlbjsKKworCS8qIFdoZW4gJ3Rva2VuJyBpcyBhIHBsYWNlaG9sZGVyLCBqdXN0IHJldHVybiAnb3RoZXInLiAqLworCWlmICh0b2tlbi0+dHlwZSA9PSBQTEFDRUhPTERFUikKKwkJcmV0dXJuIG90aGVyOworCisJLyogQSB2ZXJ5IGZldyBzaW5nbGUtY2hhcmFjdGVyIHB1bmN0dWF0b3JzIGNhbiBiZSBjb21iaW5lZAorCSAqIHdpdGggYW5vdGhlciB0byBmb3JtIGEgbXVsdGktY2hhcmFjdGVyIHB1bmN0dWF0b3IuICovCisJc3dpdGNoICh0b2tlbi0+dHlwZSkgeworCWNhc2UgJzwnOgorCQlpZiAob3RoZXItPnR5cGUgPT0gJzwnKQorCQkJY29tYmluZWQgPSBfdG9rZW5fY3JlYXRlX2l2YWwgKHRva2VuLCBMRUZUX1NISUZULCBMRUZUX1NISUZUKTsKKwkJZWxzZSBpZiAob3RoZXItPnR5cGUgPT0gJz0nKQorCQkJY29tYmluZWQgPSBfdG9rZW5fY3JlYXRlX2l2YWwgKHRva2VuLCBMRVNTX09SX0VRVUFMLCBMRVNTX09SX0VRVUFMKTsKKwkJYnJlYWs7CisJY2FzZSAnPic6CisJCWlmIChvdGhlci0+dHlwZSA9PSAnPicpCisJCQljb21iaW5lZCA9IF90b2tlbl9jcmVhdGVfaXZhbCAodG9rZW4sIFJJR0hUX1NISUZULCBSSUdIVF9TSElGVCk7CisJCWVsc2UgaWYgKG90aGVyLT50eXBlID09ICc9JykKKwkJCWNvbWJpbmVkID0gX3Rva2VuX2NyZWF0ZV9pdmFsICh0b2tlbiwgR1JFQVRFUl9PUl9FUVVBTCwgR1JFQVRFUl9PUl9FUVVBTCk7CisJCWJyZWFrOworCWNhc2UgJz0nOgorCQlpZiAob3RoZXItPnR5cGUgPT0gJz0nKQorCQkJY29tYmluZWQgPSBfdG9rZW5fY3JlYXRlX2l2YWwgKHRva2VuLCBFUVVBTCwgRVFVQUwpOworCQlicmVhazsKKwljYXNlICchJzoKKwkJaWYgKG90aGVyLT50eXBlID09ICc9JykKKwkJCWNvbWJpbmVkID0gX3Rva2VuX2NyZWF0ZV9pdmFsICh0b2tlbiwgTk9UX0VRVUFMLCBOT1RfRVFVQUwpOworCQlicmVhazsKKwljYXNlICcmJzoKKwkJaWYgKG90aGVyLT50eXBlID09ICcmJykKKwkJCWNvbWJpbmVkID0gX3Rva2VuX2NyZWF0ZV9pdmFsICh0b2tlbiwgQU5ELCBBTkQpOworCQlicmVhazsKKwljYXNlICd8JzoKKwkJaWYgKG90aGVyLT50eXBlID09ICd8JykKKwkJCWNvbWJpbmVkID0gX3Rva2VuX2NyZWF0ZV9pdmFsICh0b2tlbiwgT1IsIE9SKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNvbWJpbmVkICE9IE5VTEwpIHsKKwkJLyogSW5oZXJpdCB0aGUgbG9jYXRpb24gZnJvbSB0aGUgZmlyc3QgdG9rZW4gKi8KKwkJY29tYmluZWQtPmxvY2F0aW9uID0gdG9rZW4tPmxvY2F0aW9uOworCQlyZXR1cm4gY29tYmluZWQ7CisJfQorCisJLyogVHdvIHN0cmluZy12YWx1ZWQgKG9yIGludGVnZXIpIHRva2VucyBjYW4gdXN1YWxseSBqdXN0IGJlCisJICogbWFzaGVkIHRvZ2V0aGVyLiAoV2UgYWxzbyBoYW5kbGUgYSBzdHJpbmcgZm9sbG93ZWQgYnkgYW4KKwkgKiBpbnRlZ2VyIGhlcmUgYXMgd2VsbC4pCisJICoKKwkgKiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zIGhlcmUuIE5vdGFibHksIGlmIHRoZSBmaXJzdCB0b2tlbgorCSAqIGlzIGFuIGludGVnZXIgKG9yIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyKSwgdGhlbgorCSAqIHRoZSBzZWNvbmQgdG9rZW4gbXVzdCBhbHNvIGJlIGFuIGludGVnZXIgb3IgbXVzdCBiZSBhCisJICogc3RyaW5nIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIHRoYXQgYmVnaW5zIHdpdGggYSBkaWdpdC4KKwkgKi8KKwlpZiAoKHRva2VuLT50eXBlID09IElERU5USUZJRVIgfHwgdG9rZW4tPnR5cGUgPT0gT1RIRVIgfHwgdG9rZW4tPnR5cGUgPT0gSU5URUdFUl9TVFJJTkcgfHwgdG9rZW4tPnR5cGUgPT0gSU5URUdFUikgJiYKKwkgICAgKG90aGVyLT50eXBlID09IElERU5USUZJRVIgfHwgb3RoZXItPnR5cGUgPT0gT1RIRVIgfHwgb3RoZXItPnR5cGUgPT0gSU5URUdFUl9TVFJJTkcgfHwgb3RoZXItPnR5cGUgPT0gSU5URUdFUikpCisJeworCQljaGFyICpzdHI7CisJCWludCBjb21iaW5lZF90eXBlOworCisJCS8qIENoZWNrIHRoYXQgcGFzdGluZyBvbnRvIGFuIGludGVnZXIgZG9lc24ndCBjcmVhdGUgYQorCQkgKiBub24taW50ZWdlciwgKHRoYXQgaXMsIG9ubHkgZGlnaXRzIGNhbiBiZQorCQkgKiBwYXN0ZWQuICovCisJCWlmICh0b2tlbi0+dHlwZSA9PSBJTlRFR0VSX1NUUklORyB8fCB0b2tlbi0+dHlwZSA9PSBJTlRFR0VSKQorCQl7CisJCQlzd2l0Y2ggKG90aGVyLT50eXBlKSB7CisJCQljYXNlIElOVEVHRVJfU1RSSU5HOgorCQkJCWlmIChvdGhlci0+dmFsdWUuc3RyWzBdIDwgJzAnIHx8CisJCQkJICAgIG90aGVyLT52YWx1ZS5zdHJbMF0gPiAnOScpCisJCQkJCWdvdG8gRkFJTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URUdFUjoKKwkJCQlpZiAob3RoZXItPnZhbHVlLml2YWwgPCAwKQorCQkJCQlnb3RvIEZBSUw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gRkFJTDsKKwkJCX0KKwkJfQorCisJCWlmICh0b2tlbi0+dHlwZSA9PSBJTlRFR0VSKQorCQkJc3RyID0gcmFsbG9jX2FzcHJpbnRmICh0b2tlbiwgIiUiIFBSSWlNQVgsCisJCQkJCSAgICAgICB0b2tlbi0+dmFsdWUuaXZhbCk7CisJCWVsc2UKKwkJCXN0ciA9IHJhbGxvY19zdHJkdXAgKHRva2VuLCB0b2tlbi0+dmFsdWUuc3RyKTsKKwkJCQkJICAgICAgIAorCisJCWlmIChvdGhlci0+dHlwZSA9PSBJTlRFR0VSKQorCQkJcmFsbG9jX2FzcHJpbnRmX2FwcGVuZCAoJnN0ciwgIiUiIFBSSWlNQVgsCisJCQkJCQlvdGhlci0+dmFsdWUuaXZhbCk7CisJCWVsc2UKKwkJCXJhbGxvY19zdHJjYXQgKCZzdHIsIG90aGVyLT52YWx1ZS5zdHIpOworCisJCS8qIE5ldyB0b2tlbiBpcyBzYW1lIHR5cGUgYXMgb3JpZ2luYWwgdG9rZW4sIHVubGVzcyB3ZQorCQkgKiBzdGFydGVkIHdpdGggYW4gaW50ZWdlciwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGJlCisJCSAqIGNyZWF0aW5nIGFuIGludGVnZXItc3RyaW5nLiAqLworCQljb21iaW5lZF90eXBlID0gdG9rZW4tPnR5cGU7CisJCWlmIChjb21iaW5lZF90eXBlID09IElOVEVHRVIpCisJCQljb21iaW5lZF90eXBlID0gSU5URUdFUl9TVFJJTkc7CisKKwkJY29tYmluZWQgPSBfdG9rZW5fY3JlYXRlX3N0ciAodG9rZW4sIGNvbWJpbmVkX3R5cGUsIHN0cik7CisJCWNvbWJpbmVkLT5sb2NhdGlvbiA9IHRva2VuLT5sb2NhdGlvbjsKKwkJcmV0dXJuIGNvbWJpbmVkOworCX0KKworICAgIEZBSUw6CisJZ2xjcHBfZXJyb3IgKCZ0b2tlbi0+bG9jYXRpb24sIHBhcnNlciwgIiIpOworCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKCZwYXJzZXItPmluZm9fbG9nLCAmcGFyc2VyLT5pbmZvX2xvZ19sZW5ndGgsICJQYXN0aW5nIFwiIik7CisJX3Rva2VuX3ByaW50ICgmcGFyc2VyLT5pbmZvX2xvZywgJnBhcnNlci0+aW5mb19sb2dfbGVuZ3RoLCB0b2tlbik7CisJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAoJnBhcnNlci0+aW5mb19sb2csICZwYXJzZXItPmluZm9fbG9nX2xlbmd0aCwgIlwiIGFuZCBcIiIpOworCV90b2tlbl9wcmludCAoJnBhcnNlci0+aW5mb19sb2csICZwYXJzZXItPmluZm9fbG9nX2xlbmd0aCwgb3RoZXIpOworCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwgKCZwYXJzZXItPmluZm9fbG9nLCAmcGFyc2VyLT5pbmZvX2xvZ19sZW5ndGgsICJcIiBkb2VzIG5vdCBnaXZlIGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbi5cbiIpOworCisJcmV0dXJuIHRva2VuOworfQorCitzdGF0aWMgdm9pZAorX3Rva2VuX2xpc3RfcHJpbnQgKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIHRva2VuX2xpc3RfdCAqbGlzdCkKK3sKKwl0b2tlbl9ub2RlX3QgKm5vZGU7CisKKwlpZiAobGlzdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKG5vZGUgPSBsaXN0LT5oZWFkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkKKwkJX3Rva2VuX3ByaW50ICgmcGFyc2VyLT5vdXRwdXQsICZwYXJzZXItPm91dHB1dF9sZW5ndGgsIG5vZGUtPnRva2VuKTsKK30KKwordm9pZAoreXllcnJvciAoWVlMVFlQRSAqbG9jcCwgZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgY29uc3QgY2hhciAqZXJyb3IpCit7CisJZ2xjcHBfZXJyb3IobG9jcCwgcGFyc2VyLCAiJXMiLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9idWlsdGluX2RlZmluZShnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWx1ZSkKK3sKKyAgIHRva2VuX3QgKnRvazsKKyAgIHRva2VuX2xpc3RfdCAqbGlzdDsKKworICAgdG9rID0gX3Rva2VuX2NyZWF0ZV9pdmFsIChwYXJzZXIsIElOVEVHRVIsIHZhbHVlKTsKKworICAgbGlzdCA9IF90b2tlbl9saXN0X2NyZWF0ZShwYXJzZXIpOworICAgX3Rva2VuX2xpc3RfYXBwZW5kKGxpc3QsIHRvayk7CisgICBfZGVmaW5lX29iamVjdF9tYWNybyhwYXJzZXIsIE5VTEwsIG5hbWUsIGxpc3QpOworfQorCitnbGNwcF9wYXJzZXJfdCAqCitnbGNwcF9wYXJzZXJfY3JlYXRlIChjb25zdCBzdHJ1Y3QgZ2xfZXh0ZW5zaW9ucyAqZXh0ZW5zaW9ucywgZ2xfYXBpIGFwaSkKK3sKKwlnbGNwcF9wYXJzZXJfdCAqcGFyc2VyOworCisJcGFyc2VyID0gcmFsbG9jIChOVUxMLCBnbGNwcF9wYXJzZXJfdCk7CisKKwlnbGNwcF9sZXhfaW5pdF9leHRyYSAocGFyc2VyLCAmcGFyc2VyLT5zY2FubmVyKTsKKwlwYXJzZXItPmRlZmluZXMgPSBoYXNoX3RhYmxlX2N0b3IgKDMyLCBoYXNoX3RhYmxlX3N0cmluZ19oYXNoLAorCQkJCQkgICBoYXNoX3RhYmxlX3N0cmluZ19jb21wYXJlKTsKKwlwYXJzZXItPmFjdGl2ZSA9IE5VTEw7CisJcGFyc2VyLT5sZXhpbmdfaWYgPSAwOworCXBhcnNlci0+c3BhY2VfdG9rZW5zID0gMTsKKwlwYXJzZXItPm5ld2xpbmVfYXNfc3BhY2UgPSAwOworCXBhcnNlci0+aW5fY29udHJvbF9saW5lID0gMDsKKwlwYXJzZXItPnBhcmVuX2NvdW50ID0gMDsKKyAgICAgICAgcGFyc2VyLT5jb21tZW50ZWRfbmV3bGluZXMgPSAwOworCisJcGFyc2VyLT5za2lwX3N0YWNrID0gTlVMTDsKKworCXBhcnNlci0+bGV4X2Zyb21fbGlzdCA9IE5VTEw7CisJcGFyc2VyLT5sZXhfZnJvbV9ub2RlID0gTlVMTDsKKworCXBhcnNlci0+b3V0cHV0ID0gcmFsbG9jX3N0cmR1cChwYXJzZXIsICIiKTsKKwlwYXJzZXItPm91dHB1dF9sZW5ndGggPSAwOworCXBhcnNlci0+aW5mb19sb2cgPSByYWxsb2Nfc3RyZHVwKHBhcnNlciwgIiIpOworCXBhcnNlci0+aW5mb19sb2dfbGVuZ3RoID0gMDsKKwlwYXJzZXItPmVycm9yID0gMDsKKworICAgICAgICBwYXJzZXItPmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOworICAgICAgICBwYXJzZXItPmFwaSA9IGFwaTsKKyAgICAgICAgcGFyc2VyLT52ZXJzaW9uX3Jlc29sdmVkID0gZmFsc2U7CisKKwlwYXJzZXItPmhhc19uZXdfbGluZV9udW1iZXIgPSAwOworCXBhcnNlci0+bmV3X2xpbmVfbnVtYmVyID0gMTsKKwlwYXJzZXItPmhhc19uZXdfc291cmNlX251bWJlciA9IDA7CisJcGFyc2VyLT5uZXdfc291cmNlX251bWJlciA9IDA7CisKKwlyZXR1cm4gcGFyc2VyOworfQorCit2b2lkCitnbGNwcF9wYXJzZXJfZGVzdHJveSAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlcikKK3sKKwlnbGNwcF9sZXhfZGVzdHJveSAocGFyc2VyLT5zY2FubmVyKTsKKwloYXNoX3RhYmxlX2R0b3IgKHBhcnNlci0+ZGVmaW5lcyk7CisJcmFsbG9jX2ZyZWUgKHBhcnNlcik7Cit9CisKK3R5cGVkZWYgZW51bSBmdW5jdGlvbl9zdGF0dXMKK3sKKwlGVU5DVElPTl9TVEFUVVNfU1VDQ0VTUywKKwlGVU5DVElPTl9OT1RfQV9GVU5DVElPTiwKKwlGVU5DVElPTl9VTkJBTEFOQ0VEX1BBUkVOVEhFU0VTCit9IGZ1bmN0aW9uX3N0YXR1c190OworCisvKiBGaW5kIGEgc2V0IG9mIGZ1bmN0aW9uLWxpa2UgbWFjcm8gYXJndW1lbnRzIGJ5IGxvb2tpbmcgZm9yIGEKKyAqIGJhbGFuY2VkIHNldCBvZiBwYXJlbnRoZXNlcy4KKyAqCisgKiBXaGVuIGNhbGxlZCwgJ25vZGUnIHNob3VsZCBiZSB0aGUgb3BlbmluZy1wYXJlbnRoZXNpcyB0b2tlbiwgKG9yCisgKiBwZXJoYXBzIHByZWNlZGluZyBTUEFDRSB0b2tlbnMpLiBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuICpsYXN0IHdpbGwKKyAqIGJlIHRoZSBsYXN0IGNvbnN1bWVkIG5vZGUsIChjb3JyZXNwb25kaW5nIHRvIHRoZSBjbG9zaW5nIHJpZ2h0CisgKiBwYXJlbnRoZXNpcykuCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqCisgKiAgIEZVTkNUSU9OX1NUQVRVU19TVUNDRVNTOgorICoKKyAqCVN1Y2Nlc3NmdWxseSBwYXJzZWQgYSBzZXQgb2YgZnVuY3Rpb24gYXJndW1lbnRzLgkKKyAqCisgKiAgIEZVTkNUSU9OX05PVF9BX0ZVTkNUSU9OOgorICoKKyAqCU1hY3JvIG5hbWUgbm90IGZvbGxvd2VkIGJ5IGEgJygnLiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgYnV0CisgKglzaW1wbHkgdGhhdCB0aGUgbWFjcm8gbmFtZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIG5vbi1tYWNyby4KKyAqCisgKiAgIEZVTkNUSU9OX1VOQkFMQU5DRURfUEFSRU5USEVTRVMKKyAqCisgKglNYWNybyBuYW1lIGlzIG5vdCBmb2xsb3dlZCBieSBhIGJhbGFuY2VkIHNldCBvZiBwYXJlbnRoZXNlcy4KKyAqLworc3RhdGljIGZ1bmN0aW9uX3N0YXR1c190CitfYXJndW1lbnRzX3BhcnNlIChhcmd1bWVudF9saXN0X3QgKmFyZ3VtZW50cywKKwkJICB0b2tlbl9ub2RlX3QgKm5vZGUsCisJCSAgdG9rZW5fbm9kZV90ICoqbGFzdCkKK3sKKwl0b2tlbl9saXN0X3QgKmFyZ3VtZW50OworCWludCBwYXJlbl9jb3VudDsKKworCW5vZGUgPSBub2RlLT5uZXh0OworCisJLyogSWdub3JlIHdoaXRlc3BhY2UgYmVmb3JlIGZpcnN0IHBhcmVudGhlc2lzLiAqLworCXdoaWxlIChub2RlICYmIG5vZGUtPnRva2VuLT50eXBlID09IFNQQUNFKQorCQlub2RlID0gbm9kZS0+bmV4dDsKKworCWlmIChub2RlID09IE5VTEwgfHwgbm9kZS0+dG9rZW4tPnR5cGUgIT0gJygnKQorCQlyZXR1cm4gRlVOQ1RJT05fTk9UX0FfRlVOQ1RJT047CisKKwlub2RlID0gbm9kZS0+bmV4dDsKKworCWFyZ3VtZW50ID0gX3Rva2VuX2xpc3RfY3JlYXRlIChhcmd1bWVudHMpOworCV9hcmd1bWVudF9saXN0X2FwcGVuZCAoYXJndW1lbnRzLCBhcmd1bWVudCk7CisKKwlmb3IgKHBhcmVuX2NvdW50ID0gMTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKwkJaWYgKG5vZGUtPnRva2VuLT50eXBlID09ICcoJykKKwkJeworCQkJcGFyZW5fY291bnQrKzsKKwkJfQorCQllbHNlIGlmIChub2RlLT50b2tlbi0+dHlwZSA9PSAnKScpCisJCXsKKwkJCXBhcmVuX2NvdW50LS07CisJCQlpZiAocGFyZW5fY291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChub2RlLT50b2tlbi0+dHlwZSA9PSAnLCcgJiYKKwkJCSBwYXJlbl9jb3VudCA9PSAxKQorCQl7CisJCQlfdG9rZW5fbGlzdF90cmltX3RyYWlsaW5nX3NwYWNlIChhcmd1bWVudCk7CisJCQlhcmd1bWVudCA9IF90b2tlbl9saXN0X2NyZWF0ZSAoYXJndW1lbnRzKTsKKwkJCV9hcmd1bWVudF9saXN0X2FwcGVuZCAoYXJndW1lbnRzLCBhcmd1bWVudCk7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoYXJndW1lbnQtPmhlYWQgPT0gTlVMTCkgeworCQkJCS8qIERvbid0IHRyZWF0IGluaXRpYWwgd2hpdGVzcGFjZSBhcworCQkJCSAqIHBhcnQgb2YgdGhlIGFyZ3VtZW50LiAqLworCQkJCWlmIChub2RlLT50b2tlbi0+dHlwZSA9PSBTUEFDRSkKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlfdG9rZW5fbGlzdF9hcHBlbmQgKGFyZ3VtZW50LCBub2RlLT50b2tlbik7CisJCX0KKwl9CisKKwlpZiAocGFyZW5fY291bnQpCisJCXJldHVybiBGVU5DVElPTl9VTkJBTEFOQ0VEX1BBUkVOVEhFU0VTOworCisJKmxhc3QgPSBub2RlOworCisJcmV0dXJuIEZVTkNUSU9OX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgdG9rZW5fbGlzdF90ICoKK190b2tlbl9saXN0X2NyZWF0ZV93aXRoX29uZV9pdmFsICh2b2lkICpjdHgsIGludCB0eXBlLCBpbnQgaXZhbCkKK3sKKwl0b2tlbl9saXN0X3QgKmxpc3Q7CisJdG9rZW5fdCAqbm9kZTsKKworCWxpc3QgPSBfdG9rZW5fbGlzdF9jcmVhdGUgKGN0eCk7CisJbm9kZSA9IF90b2tlbl9jcmVhdGVfaXZhbCAobGlzdCwgdHlwZSwgaXZhbCk7CisJX3Rva2VuX2xpc3RfYXBwZW5kIChsaXN0LCBub2RlKTsKKworCXJldHVybiBsaXN0OworfQorCitzdGF0aWMgdG9rZW5fbGlzdF90ICoKK190b2tlbl9saXN0X2NyZWF0ZV93aXRoX29uZV9zcGFjZSAodm9pZCAqY3R4KQoreworCXJldHVybiBfdG9rZW5fbGlzdF9jcmVhdGVfd2l0aF9vbmVfaXZhbCAoY3R4LCBTUEFDRSwgU1BBQ0UpOworfQorCitzdGF0aWMgdG9rZW5fbGlzdF90ICoKK190b2tlbl9saXN0X2NyZWF0ZV93aXRoX29uZV9pbnRlZ2VyICh2b2lkICpjdHgsIGludCBpdmFsKQoreworCXJldHVybiBfdG9rZW5fbGlzdF9jcmVhdGVfd2l0aF9vbmVfaXZhbCAoY3R4LCBJTlRFR0VSLCBpdmFsKTsKK30KKworLyogUGVyZm9ybSBtYWNybyBleHBhbnNpb24gb24gJ2xpc3QnLCBwbGFjaW5nIHRoZSByZXN1bHRpbmcgdG9rZW5zCisgKiBpbnRvIGEgbmV3IGxpc3Qgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGZpcnN0IHRva2VuIG9mIHR5cGUKKyAqICdoZWFkX3Rva2VuX3R5cGUnLiBUaGVuIGJlZ2luIGxleGluZyBmcm9tIHRoZSByZXN1bHRpbmcgbGlzdCwKKyAqIChyZXR1cm4gdG8gdGhlIGN1cnJlbnQgbGV4aW5nIHNvdXJjZSB3aGVuIHRoaXMgbGlzdCBpcyBleGhhdXN0ZWQpLgorICovCitzdGF0aWMgdm9pZAorX2dsY3BwX3BhcnNlcl9leHBhbmRfYW5kX2xleF9mcm9tIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkJCSAgIGludCBoZWFkX3Rva2VuX3R5cGUsCisJCQkJICAgdG9rZW5fbGlzdF90ICpsaXN0KQoreworCXRva2VuX2xpc3RfdCAqZXhwYW5kZWQ7CisJdG9rZW5fdCAqdG9rZW47CisKKwlleHBhbmRlZCA9IF90b2tlbl9saXN0X2NyZWF0ZSAocGFyc2VyKTsKKwl0b2tlbiA9IF90b2tlbl9jcmVhdGVfaXZhbCAocGFyc2VyLCBoZWFkX3Rva2VuX3R5cGUsIGhlYWRfdG9rZW5fdHlwZSk7CisJX3Rva2VuX2xpc3RfYXBwZW5kIChleHBhbmRlZCwgdG9rZW4pOworCV9nbGNwcF9wYXJzZXJfZXhwYW5kX3Rva2VuX2xpc3QgKHBhcnNlciwgbGlzdCk7CisJX3Rva2VuX2xpc3RfYXBwZW5kX2xpc3QgKGV4cGFuZGVkLCBsaXN0KTsKKwlnbGNwcF9wYXJzZXJfbGV4X2Zyb20gKHBhcnNlciwgZXhwYW5kZWQpOworfQorCitzdGF0aWMgdm9pZAorX2dsY3BwX3BhcnNlcl9hcHBseV9wYXN0ZXMgKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIHRva2VuX2xpc3RfdCAqbGlzdCkKK3sKKwl0b2tlbl9ub2RlX3QgKm5vZGU7CisKKwlub2RlID0gbGlzdC0+aGVhZDsKKwl3aGlsZSAobm9kZSkKKwl7CisJCXRva2VuX25vZGVfdCAqbmV4dF9ub25fc3BhY2U7CisKKwkJLyogTG9vayBhaGVhZCBmb3IgYSBQQVNURSB0b2tlbiwgc2tpcHBpbmcgc3BhY2UuICovCisJCW5leHRfbm9uX3NwYWNlID0gbm9kZS0+bmV4dDsKKwkJd2hpbGUgKG5leHRfbm9uX3NwYWNlICYmIG5leHRfbm9uX3NwYWNlLT50b2tlbi0+dHlwZSA9PSBTUEFDRSkKKwkJCW5leHRfbm9uX3NwYWNlID0gbmV4dF9ub25fc3BhY2UtPm5leHQ7CisKKwkJaWYgKG5leHRfbm9uX3NwYWNlID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAobmV4dF9ub25fc3BhY2UtPnRva2VuLT50eXBlICE9IFBBU1RFKSB7CisJCQlub2RlID0gbmV4dF9ub25fc3BhY2U7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5vdyBmaW5kIHRoZSBuZXh0IG5vbi1zcGFjZSB0b2tlbiBhZnRlciB0aGUgUEFTVEUuICovCisJCW5leHRfbm9uX3NwYWNlID0gbmV4dF9ub25fc3BhY2UtPm5leHQ7CisJCXdoaWxlIChuZXh0X25vbl9zcGFjZSAmJiBuZXh0X25vbl9zcGFjZS0+dG9rZW4tPnR5cGUgPT0gU1BBQ0UpCisJCQluZXh0X25vbl9zcGFjZSA9IG5leHRfbm9uX3NwYWNlLT5uZXh0OworCisJCWlmIChuZXh0X25vbl9zcGFjZSA9PSBOVUxMKSB7CisJCQl5eWVycm9yICgmbm9kZS0+dG9rZW4tPmxvY2F0aW9uLCBwYXJzZXIsICInIyMnIGNhbm5vdCBhcHBlYXIgYXQgZWl0aGVyIGVuZCBvZiBhIG1hY3JvIGV4cGFuc2lvblxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlub2RlLT50b2tlbiA9IF90b2tlbl9wYXN0ZSAocGFyc2VyLCBub2RlLT50b2tlbiwgbmV4dF9ub25fc3BhY2UtPnRva2VuKTsKKwkJbm9kZS0+bmV4dCA9IG5leHRfbm9uX3NwYWNlLT5uZXh0OworCQlpZiAobmV4dF9ub25fc3BhY2UgPT0gbGlzdC0+dGFpbCkKKwkJCWxpc3QtPnRhaWwgPSBub2RlOworCX0KKworCWxpc3QtPm5vbl9zcGFjZV90YWlsID0gbGlzdC0+dGFpbDsKK30KKworLyogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0J3MgZXNzZW50aWFsbHkgcGFydCBvZiB0aGUKKyAqIGltcGxlbWVudGF0aW9uIG9mIF9nbGNwcF9wYXJzZXJfZXhwYW5kX25vZGUuIEl0IHNob3VsZG4ndCBiZSBjYWxsZWQKKyAqIGV4Y2VwdCBmb3IgYnkgdGhhdCBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgbm9kZSBpcyBhIHNpbXBsZSB0b2tlbiB3aXRoIG5vIGV4cGFuc2lvbiwgKHRoYXQgaXMsCisgKiBhbHRob3VnaCAnbm9kZScgY29ycmVzcG9uZHMgdG8gYW4gaWRlbnRpZmllciBkZWZpbmVkIGFzIGEKKyAqIGZ1bmN0aW9uLWxpa2UgbWFjcm8sIGl0IGlzIG5vdCBmb2xsb3dlZCB3aXRoIGEgcGFyZW50aGVzaXplZAorICogYXJndW1lbnQgbGlzdCkuCisgKgorICogQ29tcHV0ZSB0aGUgY29tcGxldGUgZXhwYW5zaW9uIG9mIG5vZGUgKHdoaWNoIGlzIGEgZnVuY3Rpb24tbGlrZQorICogbWFjcm8pIGFuZCBzdWJzZXF1ZW50IG5vZGVzIHdoaWNoIGFyZSBhcmd1bWVudHMuCisgKgorICogUmV0dXJucyB0aGUgdG9rZW4gbGlzdCB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgZXhwYW5zaW9uIGFuZCBzZXRzCisgKiAqbGFzdCB0byB0aGUgbGFzdCBub2RlIGluIHRoZSBsaXN0IHRoYXQgd2FzIGNvbnN1bWVkIGJ5IHRoZQorICogZXhwYW5zaW9uLiBTcGVjaWZpY2FsbHksICpsYXN0IHdpbGwgYmUgc2V0IGFzIGZvbGxvd3M6IGFzIHRoZQorICogdG9rZW4gb2YgdGhlIGNsb3NpbmcgcmlnaHQgcGFyZW50aGVzaXMuCisgKi8KK3N0YXRpYyB0b2tlbl9saXN0X3QgKgorX2dsY3BwX3BhcnNlcl9leHBhbmRfZnVuY3Rpb24gKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsCisJCQkgICAgICAgdG9rZW5fbm9kZV90ICpub2RlLAorCQkJICAgICAgIHRva2VuX25vZGVfdCAqKmxhc3QpCisJCQkgICAgICAgCit7CisJbWFjcm9fdCAqbWFjcm87CisJY29uc3QgY2hhciAqaWRlbnRpZmllcjsKKwlhcmd1bWVudF9saXN0X3QgKmFyZ3VtZW50czsKKwlmdW5jdGlvbl9zdGF0dXNfdCBzdGF0dXM7CisJdG9rZW5fbGlzdF90ICpzdWJzdGl0dXRlZDsKKwlpbnQgcGFyYW1ldGVyX2luZGV4OworCisJaWRlbnRpZmllciA9IG5vZGUtPnRva2VuLT52YWx1ZS5zdHI7CisKKwltYWNybyA9IGhhc2hfdGFibGVfZmluZCAocGFyc2VyLT5kZWZpbmVzLCBpZGVudGlmaWVyKTsKKworCWFzc2VydCAobWFjcm8tPmlzX2Z1bmN0aW9uKTsKKworCWFyZ3VtZW50cyA9IF9hcmd1bWVudF9saXN0X2NyZWF0ZSAocGFyc2VyKTsKKwlzdGF0dXMgPSBfYXJndW1lbnRzX3BhcnNlIChhcmd1bWVudHMsIG5vZGUsIGxhc3QpOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEZVTkNUSU9OX1NUQVRVU19TVUNDRVNTOgorCQlicmVhazsKKwljYXNlIEZVTkNUSU9OX05PVF9BX0ZVTkNUSU9OOgorCQlyZXR1cm4gTlVMTDsKKwljYXNlIEZVTkNUSU9OX1VOQkFMQU5DRURfUEFSRU5USEVTRVM6CisJCWdsY3BwX2Vycm9yICgmbm9kZS0+dG9rZW4tPmxvY2F0aW9uLCBwYXJzZXIsICJNYWNybyAlcyBjYWxsIGhhcyB1bmJhbGFuY2VkIHBhcmVudGhlc2VzXG4iLCBpZGVudGlmaWVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogUmVwbGFjZSBhIG1hY3JvIGRlZmluZWQgYXMgZW1wdHkgd2l0aCBhIFNQQUNFIHRva2VuLiAqLworCWlmIChtYWNyby0+cmVwbGFjZW1lbnRzID09IE5VTEwpIHsKKwkJcmFsbG9jX2ZyZWUgKGFyZ3VtZW50cyk7CisJCXJldHVybiBfdG9rZW5fbGlzdF9jcmVhdGVfd2l0aF9vbmVfc3BhY2UgKHBhcnNlcik7CisJfQorCisJaWYgKCEgKChfYXJndW1lbnRfbGlzdF9sZW5ndGggKGFyZ3VtZW50cykgPT0gCisJCV9zdHJpbmdfbGlzdF9sZW5ndGggKG1hY3JvLT5wYXJhbWV0ZXJzKSkgfHwKKwkgICAgICAgKF9zdHJpbmdfbGlzdF9sZW5ndGggKG1hY3JvLT5wYXJhbWV0ZXJzKSA9PSAwICYmCisJCV9hcmd1bWVudF9saXN0X2xlbmd0aCAoYXJndW1lbnRzKSA9PSAxICYmCisJCWFyZ3VtZW50cy0+aGVhZC0+YXJndW1lbnQtPmhlYWQgPT0gTlVMTCkpKQorCXsKKwkJZ2xjcHBfZXJyb3IgKCZub2RlLT50b2tlbi0+bG9jYXRpb24sIHBhcnNlciwKKwkJCSAgICAgICJFcnJvcjogbWFjcm8gJXMgaW52b2tlZCB3aXRoICVkIGFyZ3VtZW50cyAoZXhwZWN0ZWQgJWQpXG4iLAorCQkJICAgICAgaWRlbnRpZmllciwKKwkJCSAgICAgIF9hcmd1bWVudF9saXN0X2xlbmd0aCAoYXJndW1lbnRzKSwKKwkJCSAgICAgIF9zdHJpbmdfbGlzdF9sZW5ndGggKG1hY3JvLT5wYXJhbWV0ZXJzKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFBlcmZvcm0gYXJndW1lbnQgc3Vic3RpdHV0aW9uIG9uIHRoZSByZXBsYWNlbWVudCBsaXN0LiAqLworCXN1YnN0aXR1dGVkID0gX3Rva2VuX2xpc3RfY3JlYXRlIChhcmd1bWVudHMpOworCisJZm9yIChub2RlID0gbWFjcm8tPnJlcGxhY2VtZW50cy0+aGVhZDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisJeworCQlpZiAobm9kZS0+dG9rZW4tPnR5cGUgPT0gSURFTlRJRklFUiAmJgorCQkgICAgX3N0cmluZ19saXN0X2NvbnRhaW5zIChtYWNyby0+cGFyYW1ldGVycywKKwkJCQkJICAgbm9kZS0+dG9rZW4tPnZhbHVlLnN0ciwKKwkJCQkJICAgJnBhcmFtZXRlcl9pbmRleCkpCisJCXsKKwkJCXRva2VuX2xpc3RfdCAqYXJndW1lbnQ7CisJCQlhcmd1bWVudCA9IF9hcmd1bWVudF9saXN0X21lbWJlcl9hdCAoYXJndW1lbnRzLAorCQkJCQkJCSAgICAgcGFyYW1ldGVyX2luZGV4KTsKKwkJCS8qIEJlZm9yZSBzdWJzdGl0dXRpbmcsIHdlIGV4cGFuZCB0aGUgYXJndW1lbnQKKwkJCSAqIHRva2Vucywgb3IgYXBwZW5kIGEgcGxhY2Vob2xkZXIgdG9rZW4gZm9yCisJCQkgKiBhbiBlbXB0eSBhcmd1bWVudC4gKi8KKwkJCWlmIChhcmd1bWVudC0+aGVhZCkgeworCQkJCXRva2VuX2xpc3RfdCAqZXhwYW5kZWRfYXJndW1lbnQ7CisJCQkJZXhwYW5kZWRfYXJndW1lbnQgPSBfdG9rZW5fbGlzdF9jb3B5IChwYXJzZXIsCisJCQkJCQkJCSAgICAgIGFyZ3VtZW50KTsKKwkJCQlfZ2xjcHBfcGFyc2VyX2V4cGFuZF90b2tlbl9saXN0IChwYXJzZXIsCisJCQkJCQkJCSBleHBhbmRlZF9hcmd1bWVudCk7CisJCQkJX3Rva2VuX2xpc3RfYXBwZW5kX2xpc3QgKHN1YnN0aXR1dGVkLAorCQkJCQkJCSBleHBhbmRlZF9hcmd1bWVudCk7CisJCQl9IGVsc2UgeworCQkJCXRva2VuX3QgKm5ld190b2tlbjsKKworCQkJCW5ld190b2tlbiA9IF90b2tlbl9jcmVhdGVfaXZhbCAoc3Vic3RpdHV0ZWQsCisJCQkJCQkJCVBMQUNFSE9MREVSLAorCQkJCQkJCQlQTEFDRUhPTERFUik7CisJCQkJX3Rva2VuX2xpc3RfYXBwZW5kIChzdWJzdGl0dXRlZCwgbmV3X3Rva2VuKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCV90b2tlbl9saXN0X2FwcGVuZCAoc3Vic3RpdHV0ZWQsIG5vZGUtPnRva2VuKTsKKwkJfQorCX0KKworCS8qIEFmdGVyIGFyZ3VtZW50IHN1YnN0aXR1dGlvbiwgYW5kIGJlZm9yZSBmdXJ0aGVyIGV4cGFuc2lvbgorCSAqIGJlbG93LCBpbXBsZW1lbnQgdG9rZW4gcGFzdGluZy4gKi8KKworCV90b2tlbl9saXN0X3RyaW1fdHJhaWxpbmdfc3BhY2UgKHN1YnN0aXR1dGVkKTsKKworCV9nbGNwcF9wYXJzZXJfYXBwbHlfcGFzdGVzIChwYXJzZXIsIHN1YnN0aXR1dGVkKTsKKworCXJldHVybiBzdWJzdGl0dXRlZDsKK30KKworLyogQ29tcHV0ZSB0aGUgY29tcGxldGUgZXhwYW5zaW9uIG9mIG5vZGUsIChhbmQgc3Vic2VxdWVudCBub2RlcyBhZnRlcgorICogJ25vZGUnIGluIHRoZSBjYXNlIHRoYXQgJ25vZGUnIGlzIGEgZnVuY3Rpb24tbGlrZSBtYWNybyBhbmQKKyAqIHN1YnNlcXVlbnQgbm9kZXMgYXJlIGFyZ3VtZW50cykuCisgKgorICogUmV0dXJucyBOVUxMIGlmIG5vZGUgaXMgYSBzaW1wbGUgdG9rZW4gd2l0aCBubyBleHBhbnNpb24uCisgKgorICogT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSB0b2tlbiBsaXN0IHRoYXQgcmVzdWx0cyBmcm9tIHRoZSBleHBhbnNpb24KKyAqIGFuZCBzZXRzICpsYXN0IHRvIHRoZSBsYXN0IG5vZGUgaW4gdGhlIGxpc3QgdGhhdCB3YXMgY29uc3VtZWQgYnkKKyAqIHRoZSBleHBhbnNpb24uIFNwZWNpZmljYWxseSwgKmxhc3Qgd2lsbCBiZSBzZXQgYXMgZm9sbG93czoKKyAqCisgKglBcyAnbm9kZScgaW4gdGhlIGNhc2Ugb2Ygb2JqZWN0LWxpa2UgbWFjcm8gZXhwYW5zaW9uLgorICoKKyAqCUFzIHRoZSB0b2tlbiBvZiB0aGUgY2xvc2luZyByaWdodCBwYXJlbnRoZXNpcyBpbiB0aGUgY2FzZSBvZgorICoJZnVuY3Rpb24tbGlrZSBtYWNybyBleHBhbnNpb24uCisgKi8KK3N0YXRpYyB0b2tlbl9saXN0X3QgKgorX2dsY3BwX3BhcnNlcl9leHBhbmRfbm9kZSAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwKKwkJCSAgIHRva2VuX25vZGVfdCAqbm9kZSwKKwkJCSAgIHRva2VuX25vZGVfdCAqKmxhc3QpCit7CisJdG9rZW5fdCAqdG9rZW4gPSBub2RlLT50b2tlbjsKKwljb25zdCBjaGFyICppZGVudGlmaWVyOworCW1hY3JvX3QgKm1hY3JvOworCisJLyogV2Ugb25seSBleHBhbmQgaWRlbnRpZmllcnMgKi8KKwlpZiAodG9rZW4tPnR5cGUgIT0gSURFTlRJRklFUikgeworCQkvKiBXZSBjaGFuZ2UgYW55IENPTU1BIGludG8gYSBDT01NQV9GSU5BTCB0byBwcmV2ZW50CisJCSAqIGl0IGJlaW5nIG1pc3Rha2VuIGZvciBhbiBhcmd1bWVudCBzZXBhcmF0b3IKKwkJICogbGF0ZXIuICovCisJCWlmICh0b2tlbi0+dHlwZSA9PSAnLCcpIHsKKwkJCXRva2VuLT50eXBlID0gQ09NTUFfRklOQUw7CisJCQl0b2tlbi0+dmFsdWUuaXZhbCA9IENPTU1BX0ZJTkFMOworCQl9CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmxhc3QgPSBub2RlOworCWlkZW50aWZpZXIgPSB0b2tlbi0+dmFsdWUuc3RyOworCisJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgX19MSU5FX18gYW5kIF9fRklMRV9fLCAobm90IHRocm91Z2gKKwkgKiB0aGUgaGFzaCB0YWJsZSkuICovCisJaWYgKHN0cmNtcChpZGVudGlmaWVyLCAiX19MSU5FX18iKSA9PSAwKQorCQlyZXR1cm4gX3Rva2VuX2xpc3RfY3JlYXRlX3dpdGhfb25lX2ludGVnZXIgKHBhcnNlciwgbm9kZS0+dG9rZW4tPmxvY2F0aW9uLmZpcnN0X2xpbmUpOworCisJaWYgKHN0cmNtcChpZGVudGlmaWVyLCAiX19GSUxFX18iKSA9PSAwKQorCQlyZXR1cm4gX3Rva2VuX2xpc3RfY3JlYXRlX3dpdGhfb25lX2ludGVnZXIgKHBhcnNlciwgbm9kZS0+dG9rZW4tPmxvY2F0aW9uLnNvdXJjZSk7CisKKwkvKiBMb29rIHVwIHRoaXMgaWRlbnRpZmllciBpbiB0aGUgaGFzaCB0YWJsZS4gKi8KKwltYWNybyA9IGhhc2hfdGFibGVfZmluZCAocGFyc2VyLT5kZWZpbmVzLCBpZGVudGlmaWVyKTsKKworCS8qIE5vdCBhIG1hY3JvLCBzbyBubyBleHBhbnNpb24gbmVlZGVkLiAqLworCWlmIChtYWNybyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEZpbmFsbHksIGRvbid0IGV4cGFuZCB0aGlzIG1hY3JvIGlmIHdlJ3JlIGFscmVhZHkgYWN0aXZlbHkKKwkgKiBleHBhbmRpbmcgaXQsICh0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24pLiAqLworCWlmIChfcGFyc2VyX2FjdGl2ZV9saXN0X2NvbnRhaW5zIChwYXJzZXIsIGlkZW50aWZpZXIpKSB7CisJCS8qIFdlIGNoYW5nZSB0aGUgdG9rZW4gdHlwZSBoZXJlIGZyb20gSURFTlRJRklFUiB0bworCQkgKiBPVEhFUiB0byBwcmV2ZW50IGFueSBmdXR1cmUgZXhwYW5zaW9uIG9mIHRoaXMKKwkJICogdW5leHBhbmRlZCB0b2tlbi4gKi8KKwkJY2hhciAqc3RyOworCQl0b2tlbl9saXN0X3QgKmV4cGFuc2lvbjsKKwkJdG9rZW5fdCAqZmluYWw7CisKKwkJc3RyID0gcmFsbG9jX3N0cmR1cCAocGFyc2VyLCB0b2tlbi0+dmFsdWUuc3RyKTsKKwkJZmluYWwgPSBfdG9rZW5fY3JlYXRlX3N0ciAocGFyc2VyLCBPVEhFUiwgc3RyKTsKKwkJZXhwYW5zaW9uID0gX3Rva2VuX2xpc3RfY3JlYXRlIChwYXJzZXIpOworCQlfdG9rZW5fbGlzdF9hcHBlbmQgKGV4cGFuc2lvbiwgZmluYWwpOworCQlyZXR1cm4gZXhwYW5zaW9uOworCX0KKworCWlmICghIG1hY3JvLT5pc19mdW5jdGlvbikKKwl7CisJCXRva2VuX2xpc3RfdCAqcmVwbGFjZW1lbnQ7CisKKwkJLyogUmVwbGFjZSBhIG1hY3JvIGRlZmluZWQgYXMgZW1wdHkgd2l0aCBhIFNQQUNFIHRva2VuLiAqLworCQlpZiAobWFjcm8tPnJlcGxhY2VtZW50cyA9PSBOVUxMKQorCQkJcmV0dXJuIF90b2tlbl9saXN0X2NyZWF0ZV93aXRoX29uZV9zcGFjZSAocGFyc2VyKTsKKworCQlyZXBsYWNlbWVudCA9IF90b2tlbl9saXN0X2NvcHkgKHBhcnNlciwgbWFjcm8tPnJlcGxhY2VtZW50cyk7CisJCV9nbGNwcF9wYXJzZXJfYXBwbHlfcGFzdGVzIChwYXJzZXIsIHJlcGxhY2VtZW50KTsKKwkJcmV0dXJuIHJlcGxhY2VtZW50OworCX0KKworCXJldHVybiBfZ2xjcHBfcGFyc2VyX2V4cGFuZF9mdW5jdGlvbiAocGFyc2VyLCBub2RlLCBsYXN0KTsKK30KKworLyogUHVzaCBhIG5ldyBpZGVudGlmaWVyIG9udG8gdGhlIHBhcnNlcidzIGFjdGl2ZSBsaXN0LgorICoKKyAqIEhlcmUsICdtYXJrZXInIGlzIHRoZSB0b2tlbiBub2RlIHRoYXQgYXBwZWFycyBpbiB0aGUgbGlzdCBhZnRlciB0aGUKKyAqIGV4cGFuc2lvbiBvZiAnaWRlbnRpZmllcicuIFRoYXQgaXMsIHdoZW4gdGhlIGxpc3QgaXRlcmF0b3IgYmVnaW5zCisgKiBleGFtaW5pbmcgJ21hcmtlcicsIHRoZW4gaXQgaXMgdGltZSB0byBwb3AgdGhpcyBub2RlIGZyb20gdGhlCisgKiBhY3RpdmUgc3RhY2suCisgKi8KK3N0YXRpYyB2b2lkCitfcGFyc2VyX2FjdGl2ZV9saXN0X3B1c2ggKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsCisJCQkgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsCisJCQkgIHRva2VuX25vZGVfdCAqbWFya2VyKQoreworCWFjdGl2ZV9saXN0X3QgKm5vZGU7CisKKwlub2RlID0gcmFsbG9jIChwYXJzZXItPmFjdGl2ZSwgYWN0aXZlX2xpc3RfdCk7CisJbm9kZS0+aWRlbnRpZmllciA9IHJhbGxvY19zdHJkdXAgKG5vZGUsIGlkZW50aWZpZXIpOworCW5vZGUtPm1hcmtlciA9IG1hcmtlcjsKKwlub2RlLT5uZXh0ID0gcGFyc2VyLT5hY3RpdmU7CisKKwlwYXJzZXItPmFjdGl2ZSA9IG5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCitfcGFyc2VyX2FjdGl2ZV9saXN0X3BvcCAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlcikKK3sKKwlhY3RpdmVfbGlzdF90ICpub2RlID0gcGFyc2VyLT5hY3RpdmU7CisKKwlpZiAobm9kZSA9PSBOVUxMKSB7CisJCXBhcnNlci0+YWN0aXZlID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCW5vZGUgPSBwYXJzZXItPmFjdGl2ZS0+bmV4dDsKKwlyYWxsb2NfZnJlZSAocGFyc2VyLT5hY3RpdmUpOworCisJcGFyc2VyLT5hY3RpdmUgPSBub2RlOworfQorCitzdGF0aWMgaW50CitfcGFyc2VyX2FjdGl2ZV9saXN0X2NvbnRhaW5zIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLCBjb25zdCBjaGFyICppZGVudGlmaWVyKQoreworCWFjdGl2ZV9saXN0X3QgKm5vZGU7CisKKwlpZiAocGFyc2VyLT5hY3RpdmUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKG5vZGUgPSBwYXJzZXItPmFjdGl2ZTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisJCWlmIChzdHJjbXAgKG5vZGUtPmlkZW50aWZpZXIsIGlkZW50aWZpZXIpID09IDApCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBXYWxrIG92ZXIgdGhlIHRva2VuIGxpc3QgcmVwbGFjaW5nIG5vZGVzIHdpdGggdGhlaXIgZXhwYW5zaW9uLgorICogV2hlbmV2ZXIgbm9kZXMgYXJlIGV4cGFuZGVkIHRoZSB3YWxraW5nIHdpbGwgd2FsayBvdmVyIHRoZSBuZXcKKyAqIG5vZGVzLCBjb250aW51aW5nIHRvIGV4cGFuZCBhcyBuZWNlc3NhcnkuIFRoZSByZXN1bHRzIGFyZSBwbGFjZWQgaW4KKyAqICdsaXN0JyBpdHNlbGY7CisgKi8KK3N0YXRpYyB2b2lkCitfZ2xjcHBfcGFyc2VyX2V4cGFuZF90b2tlbl9saXN0IChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkJCSB0b2tlbl9saXN0X3QgKmxpc3QpCit7CisJdG9rZW5fbm9kZV90ICpub2RlX3ByZXY7CisJdG9rZW5fbm9kZV90ICpub2RlLCAqbGFzdCA9IE5VTEw7CisJdG9rZW5fbGlzdF90ICpleHBhbnNpb247CisJYWN0aXZlX2xpc3RfdCAqYWN0aXZlX2luaXRpYWwgPSBwYXJzZXItPmFjdGl2ZTsKKworCWlmIChsaXN0ID09IE5VTEwpCisJCXJldHVybjsKKworCV90b2tlbl9saXN0X3RyaW1fdHJhaWxpbmdfc3BhY2UgKGxpc3QpOworCisJbm9kZV9wcmV2ID0gTlVMTDsKKwlub2RlID0gbGlzdC0+aGVhZDsKKworCXdoaWxlIChub2RlKSB7CisKKwkJd2hpbGUgKHBhcnNlci0+YWN0aXZlICYmIHBhcnNlci0+YWN0aXZlLT5tYXJrZXIgPT0gbm9kZSkKKwkJCV9wYXJzZXJfYWN0aXZlX2xpc3RfcG9wIChwYXJzZXIpOworCisJCWV4cGFuc2lvbiA9IF9nbGNwcF9wYXJzZXJfZXhwYW5kX25vZGUgKHBhcnNlciwgbm9kZSwgJmxhc3QpOworCQlpZiAoZXhwYW5zaW9uKSB7CisJCQl0b2tlbl9ub2RlX3QgKm47CisKKwkJCWZvciAobiA9IG5vZGU7IG4gIT0gbGFzdC0+bmV4dDsgbiA9IG4tPm5leHQpCisJCQkJd2hpbGUgKHBhcnNlci0+YWN0aXZlICYmCisJCQkJICAgICAgIHBhcnNlci0+YWN0aXZlLT5tYXJrZXIgPT0gbikKKwkJCQl7CisJCQkJCV9wYXJzZXJfYWN0aXZlX2xpc3RfcG9wIChwYXJzZXIpOworCQkJCX0KKworCQkJX3BhcnNlcl9hY3RpdmVfbGlzdF9wdXNoIChwYXJzZXIsCisJCQkJCQkgIG5vZGUtPnRva2VuLT52YWx1ZS5zdHIsCisJCQkJCQkgIGxhc3QtPm5leHQpOworCQkJCisJCQkvKiBTcGxpY2UgZXhwYW5zaW9uIGludG8gbGlzdCwgc3VwcG9ydGluZyBhCisJCQkgKiBzaW1wbGUgZGVsZXRpb24gaWYgdGhlIGV4cGFuc2lvbiBpcworCQkJICogZW1wdHkuICovCisJCQlpZiAoZXhwYW5zaW9uLT5oZWFkKSB7CisJCQkJaWYgKG5vZGVfcHJldikKKwkJCQkJbm9kZV9wcmV2LT5uZXh0ID0gZXhwYW5zaW9uLT5oZWFkOworCQkJCWVsc2UKKwkJCQkJbGlzdC0+aGVhZCA9IGV4cGFuc2lvbi0+aGVhZDsKKwkJCQlleHBhbnNpb24tPnRhaWwtPm5leHQgPSBsYXN0LT5uZXh0OworCQkJCWlmIChsYXN0ID09IGxpc3QtPnRhaWwpCisJCQkJCWxpc3QtPnRhaWwgPSBleHBhbnNpb24tPnRhaWw7CisJCQl9IGVsc2UgeworCQkJCWlmIChub2RlX3ByZXYpCisJCQkJCW5vZGVfcHJldi0+bmV4dCA9IGxhc3QtPm5leHQ7CisJCQkJZWxzZQorCQkJCQlsaXN0LT5oZWFkID0gbGFzdC0+bmV4dDsKKwkJCQlpZiAobGFzdCA9PSBsaXN0LT50YWlsKQorCQkJCQlsaXN0LT50YWlsID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW5vZGVfcHJldiA9IG5vZGU7CisJCX0KKwkJbm9kZSA9IG5vZGVfcHJldiA/IG5vZGVfcHJldi0+bmV4dCA6IGxpc3QtPmhlYWQ7CisJfQorCisJLyogUmVtb3ZlIGFueSBsaW5nZXJpbmcgZWZmZWN0cyBvZiB0aGlzIGludm9jYXRpb24gb24gdGhlCisJICogYWN0aXZlIGxpc3QuIFRoYXQgaXMsIHBvcCB1bnRpbCB0aGUgbGlzdCBsb29rcyBsaWtlIGl0IGRpZAorCSAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmdW5jdGlvbi4gKi8KKwl3aGlsZSAocGFyc2VyLT5hY3RpdmUgJiYgcGFyc2VyLT5hY3RpdmUgIT0gYWN0aXZlX2luaXRpYWwpCisJCV9wYXJzZXJfYWN0aXZlX2xpc3RfcG9wIChwYXJzZXIpOworCisJbGlzdC0+bm9uX3NwYWNlX3RhaWwgPSBsaXN0LT50YWlsOworfQorCit2b2lkCitfZ2xjcHBfcGFyc2VyX3ByaW50X2V4cGFuZGVkX3Rva2VuX2xpc3QgKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsCisJCQkJCSB0b2tlbl9saXN0X3QgKmxpc3QpCit7CisJaWYgKGxpc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJX2dsY3BwX3BhcnNlcl9leHBhbmRfdG9rZW5fbGlzdCAocGFyc2VyLCBsaXN0KTsKKworCV90b2tlbl9saXN0X3RyaW1fdHJhaWxpbmdfc3BhY2UgKGxpc3QpOworCisJX3Rva2VuX2xpc3RfcHJpbnQgKHBhcnNlciwgbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCitfY2hlY2tfZm9yX3Jlc2VydmVkX21hY3JvX25hbWUgKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIFlZTFRZUEUgKmxvYywKKwkJCQljb25zdCBjaGFyICppZGVudGlmaWVyKQoreworCS8qIFNlY3Rpb24gMy4zIChQcmVwcm9jZXNzb3IpIG9mIHRoZSBHTFNMIDEuMzAgc3BlYyAoYW5kIGxhdGVyKSBhbmQKKwkgKiB0aGUgR0xTTCBFUyBzcGVjIChhbGwgdmVyc2lvbnMpIHNheToKKwkgKgorCSAqICAgICAiQWxsIG1hY3JvIG5hbWVzIGNvbnRhaW5pbmcgdHdvIGNvbnNlY3V0aXZlIHVuZGVyc2NvcmVzICggX18gKQorCSAqICAgICBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYXMgcHJlZGVmaW5lZCBtYWNybyBuYW1lcy4gQWxsCisJICogICAgIG1hY3JvIG5hbWVzIHByZWZpeGVkIHdpdGggIkdMXyIgKCJHTCIgZm9sbG93ZWQgYnkgYSBzaW5nbGUKKwkgKiAgICAgdW5kZXJzY29yZSkgYXJlIGFsc28gcmVzZXJ2ZWQuIgorCSAqCisJICogVGhlIGludGVudGlvbiBpcyB0aGF0IG5hbWVzIGNvbnRhaW5pbmcgX18gYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbAorCSAqIHVzZSBieSB0aGUgaW1wbGVtZW50YXRpb24sIGFuZCBuYW1lcyBwcmVmaXhlZCB3aXRoIEdMXyBhcmUgcmVzZXJ2ZWQKKwkgKiBmb3IgdXNlIGJ5IEtocm9ub3MuICBTaW5jZSBldmVyeSBleHRlbnNpb24gYWRkcyBhIG5hbWUgcHJlZml4ZWQKKwkgKiB3aXRoIEdMXyAoaS5lLiwgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiksIHRoYXQgc2hvdWxkIGJlIGFuCisJICogZXJyb3IuICBOYW1lcyBzaW1wbHkgY29udGFpbmluZyBfXyBhcmUgZGFuZ2Vyb3VzIHRvIHVzZSwgYnV0IHNob3VsZAorCSAqIGJlIGFsbG93ZWQuCisJICoKKwkgKiBBIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBHTFNMIHNwZWNpZmljYXRpb24gd2lsbCBjbGFyaWZ5IHRoaXMuCisJICovCisJaWYgKHN0cnN0cihpZGVudGlmaWVyLCAiX18iKSkgeworCQlnbGNwcF93YXJuaW5nKGxvYywgcGFyc2VyLAorCQkJICAgICAgIk1hY3JvIG5hbWVzIGNvbnRhaW5pbmcgXCJfX1wiIGFyZSByZXNlcnZlZCAiCisJCQkgICAgICAiZm9yIHVzZSBieSB0aGUgaW1wbGVtZW50YXRpb24uXG4iKTsKKwl9CisJaWYgKHN0cm5jbXAoaWRlbnRpZmllciwgIkdMXyIsIDMpID09IDApIHsKKwkJZ2xjcHBfZXJyb3IgKGxvYywgcGFyc2VyLCAiTWFjcm8gbmFtZXMgc3RhcnRpbmcgd2l0aCBcIkdMX1wiIGFyZSByZXNlcnZlZC5cbiIpOworCX0KK30KKworc3RhdGljIGludAorX21hY3JvX2VxdWFsIChtYWNyb190ICphLCBtYWNyb190ICpiKQoreworCWlmIChhLT5pc19mdW5jdGlvbiAhPSBiLT5pc19mdW5jdGlvbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYS0+aXNfZnVuY3Rpb24pIHsKKwkJaWYgKCEgX3N0cmluZ19saXN0X2VxdWFsIChhLT5wYXJhbWV0ZXJzLCBiLT5wYXJhbWV0ZXJzKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiBfdG9rZW5fbGlzdF9lcXVhbF9pZ25vcmluZ19zcGFjZSAoYS0+cmVwbGFjZW1lbnRzLAorCQkJCQkJIGItPnJlcGxhY2VtZW50cyk7Cit9CisKK3ZvaWQKK19kZWZpbmVfb2JqZWN0X21hY3JvIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkgICAgICBZWUxUWVBFICpsb2MsCisJCSAgICAgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsCisJCSAgICAgIHRva2VuX2xpc3RfdCAqcmVwbGFjZW1lbnRzKQoreworCW1hY3JvX3QgKm1hY3JvLCAqcHJldmlvdXM7CisKKwlpZiAobG9jICE9IE5VTEwpCisJCV9jaGVja19mb3JfcmVzZXJ2ZWRfbWFjcm9fbmFtZShwYXJzZXIsIGxvYywgaWRlbnRpZmllcik7CisKKwltYWNybyA9IHJhbGxvYyAocGFyc2VyLCBtYWNyb190KTsKKworCW1hY3JvLT5pc19mdW5jdGlvbiA9IDA7CisJbWFjcm8tPnBhcmFtZXRlcnMgPSBOVUxMOworCW1hY3JvLT5pZGVudGlmaWVyID0gcmFsbG9jX3N0cmR1cCAobWFjcm8sIGlkZW50aWZpZXIpOworCW1hY3JvLT5yZXBsYWNlbWVudHMgPSByZXBsYWNlbWVudHM7CisJcmFsbG9jX3N0ZWFsIChtYWNybywgcmVwbGFjZW1lbnRzKTsKKworCXByZXZpb3VzID0gaGFzaF90YWJsZV9maW5kIChwYXJzZXItPmRlZmluZXMsIGlkZW50aWZpZXIpOworCWlmIChwcmV2aW91cykgeworCQlpZiAoX21hY3JvX2VxdWFsIChtYWNybywgcHJldmlvdXMpKSB7CisJCQlyYWxsb2NfZnJlZSAobWFjcm8pOworCQkJcmV0dXJuOworCQl9CisJCWdsY3BwX2Vycm9yIChsb2MsIHBhcnNlciwgIlJlZGVmaW5pdGlvbiBvZiBtYWNybyAlc1xuIiwKKwkJCSAgICAgaWRlbnRpZmllcik7CisJfQorCisJaGFzaF90YWJsZV9pbnNlcnQgKHBhcnNlci0+ZGVmaW5lcywgbWFjcm8sIGlkZW50aWZpZXIpOworfQorCit2b2lkCitfZGVmaW5lX2Z1bmN0aW9uX21hY3JvIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkJWVlMVFlQRSAqbG9jLAorCQkJY29uc3QgY2hhciAqaWRlbnRpZmllciwKKwkJCXN0cmluZ19saXN0X3QgKnBhcmFtZXRlcnMsCisJCQl0b2tlbl9saXN0X3QgKnJlcGxhY2VtZW50cykKK3sKKwltYWNyb190ICptYWNybywgKnByZXZpb3VzOworCisJX2NoZWNrX2Zvcl9yZXNlcnZlZF9tYWNyb19uYW1lKHBhcnNlciwgbG9jLCBpZGVudGlmaWVyKTsKKworCW1hY3JvID0gcmFsbG9jIChwYXJzZXIsIG1hY3JvX3QpOworCXJhbGxvY19zdGVhbCAobWFjcm8sIHBhcmFtZXRlcnMpOworCXJhbGxvY19zdGVhbCAobWFjcm8sIHJlcGxhY2VtZW50cyk7CisKKwltYWNyby0+aXNfZnVuY3Rpb24gPSAxOworCW1hY3JvLT5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKwltYWNyby0+aWRlbnRpZmllciA9IHJhbGxvY19zdHJkdXAgKG1hY3JvLCBpZGVudGlmaWVyKTsKKwltYWNyby0+cmVwbGFjZW1lbnRzID0gcmVwbGFjZW1lbnRzOworCXByZXZpb3VzID0gaGFzaF90YWJsZV9maW5kIChwYXJzZXItPmRlZmluZXMsIGlkZW50aWZpZXIpOworCWlmIChwcmV2aW91cykgeworCQlpZiAoX21hY3JvX2VxdWFsIChtYWNybywgcHJldmlvdXMpKSB7CisJCQlyYWxsb2NfZnJlZSAobWFjcm8pOworCQkJcmV0dXJuOworCQl9CisJCWdsY3BwX2Vycm9yIChsb2MsIHBhcnNlciwgIlJlZGVmaW5pdGlvbiBvZiBtYWNybyAlc1xuIiwKKwkJCSAgICAgaWRlbnRpZmllcik7CisJfQorCisJaGFzaF90YWJsZV9pbnNlcnQgKHBhcnNlci0+ZGVmaW5lcywgbWFjcm8sIGlkZW50aWZpZXIpOworfQorCitzdGF0aWMgaW50CitnbGNwcF9wYXJzZXJfbGV4IChZWVNUWVBFICp5eWx2YWwsIFlZTFRZUEUgKnl5bGxvYywgZ2xjcHBfcGFyc2VyX3QgKnBhcnNlcikKK3sKKwl0b2tlbl9ub2RlX3QgKm5vZGU7CisJaW50IHJldDsKKworCWlmIChwYXJzZXItPmxleF9mcm9tX2xpc3QgPT0gTlVMTCkgeworCQlyZXQgPSBnbGNwcF9sZXggKHl5bHZhbCwgeXlsbG9jLCBwYXJzZXItPnNjYW5uZXIpOworCisJCS8qIFhYWDogVGhpcyB1Z2x5IGJsb2NrIG9mIGNvZGUgZXhpc3RzIGZvciB0aGUgc29sZQorCQkgKiBwdXJwb3NlIG9mIGNvbnZlcnRpbmcgYSBORVdMSU5FIHRva2VuIGludG8gYSBTUEFDRQorCQkgKiB0b2tlbiwgYnV0IG9ubHkgaW4gdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBzZWVuIGEKKwkJICogZnVuY3Rpb24tbGlrZSBtYWNybyBuYW1lLCBidXQgaGF2ZSBub3QgeWV0IHNlZW4gaXRzCisJCSAqIGNsb3NpbmcgcGFyZW50aGVzaXMuCisJCSAqCisJCSAqIFRoZXJlJ3MgcGVyaGFwcyBhIG1vcmUgY29tcGFjdCB3YXkgdG8gZG8gdGhpcyB3aXRoCisJCSAqIG1pZC1ydWxlIGFjdGlvbnMgaW4gdGhlIGdyYW1tYXIuCisJCSAqCisJCSAqIEknbSBkZWZpbml0ZWx5IG5vdCBwbGVhc2VkIHdpdGggdGhlIGNvbXBsZXhpdHkgb2YKKwkJICogdGhpcyBjb2RlIGhlcmUuCisJCSAqLworCQlpZiAocGFyc2VyLT5uZXdsaW5lX2FzX3NwYWNlKQorCQl7CisJCQlpZiAocmV0ID09ICcoJykgeworCQkJCXBhcnNlci0+cGFyZW5fY291bnQrKzsKKwkJCX0gZWxzZSBpZiAocmV0ID09ICcpJykgeworCQkJCXBhcnNlci0+cGFyZW5fY291bnQtLTsKKwkJCQlpZiAocGFyc2VyLT5wYXJlbl9jb3VudCA9PSAwKQorCQkJCQlwYXJzZXItPm5ld2xpbmVfYXNfc3BhY2UgPSAwOworCQkJfSBlbHNlIGlmIChyZXQgPT0gTkVXTElORSkgeworCQkJCXJldCA9IFNQQUNFOworCQkJfSBlbHNlIGlmIChyZXQgIT0gU1BBQ0UpIHsKKwkJCQlpZiAocGFyc2VyLT5wYXJlbl9jb3VudCA9PSAwKQorCQkJCQlwYXJzZXItPm5ld2xpbmVfYXNfc3BhY2UgPSAwOworCQkJfQorCQl9CisJCWVsc2UgaWYgKHBhcnNlci0+aW5fY29udHJvbF9saW5lKQorCQl7CisJCQlpZiAocmV0ID09IE5FV0xJTkUpCisJCQkJcGFyc2VyLT5pbl9jb250cm9sX2xpbmUgPSAwOworCQl9CisJCWVsc2UgaWYgKHJldCA9PSBIQVNIX0RFRklORSB8fAorCQkJICAgcmV0ID09IEhBU0hfVU5ERUYgfHwgcmV0ID09IEhBU0hfSUYgfHwKKwkJCSAgIHJldCA9PSBIQVNIX0lGREVGIHx8IHJldCA9PSBIQVNIX0lGTkRFRiB8fAorCQkJICAgcmV0ID09IEhBU0hfRUxJRiB8fCByZXQgPT0gSEFTSF9FTFNFIHx8CisJCQkgICByZXQgPT0gSEFTSF9FTkRJRiB8fCByZXQgPT0gSEFTSCkKKwkJeworCQkJcGFyc2VyLT5pbl9jb250cm9sX2xpbmUgPSAxOworCQl9CisJCWVsc2UgaWYgKHJldCA9PSBJREVOVElGSUVSKQorCQl7CisJCQltYWNyb190ICptYWNybzsKKwkJCW1hY3JvID0gaGFzaF90YWJsZV9maW5kIChwYXJzZXItPmRlZmluZXMsCisJCQkJCQkgeXlsdmFsLT5zdHIpOworCQkJaWYgKG1hY3JvICYmIG1hY3JvLT5pc19mdW5jdGlvbikgeworCQkJCXBhcnNlci0+bmV3bGluZV9hc19zcGFjZSA9IDE7CisJCQkJcGFyc2VyLT5wYXJlbl9jb3VudCA9IDA7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0KKworCW5vZGUgPSBwYXJzZXItPmxleF9mcm9tX25vZGU7CisKKwlpZiAobm9kZSA9PSBOVUxMKSB7CisJCXJhbGxvY19mcmVlIChwYXJzZXItPmxleF9mcm9tX2xpc3QpOworCQlwYXJzZXItPmxleF9mcm9tX2xpc3QgPSBOVUxMOworCQlyZXR1cm4gTkVXTElORTsKKwl9CisKKwkqeXlsdmFsID0gbm9kZS0+dG9rZW4tPnZhbHVlOworCXJldCA9IG5vZGUtPnRva2VuLT50eXBlOworCisJcGFyc2VyLT5sZXhfZnJvbV9ub2RlID0gbm9kZS0+bmV4dDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnbGNwcF9wYXJzZXJfbGV4X2Zyb20gKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIHRva2VuX2xpc3RfdCAqbGlzdCkKK3sKKwl0b2tlbl9ub2RlX3QgKm5vZGU7CisKKwlhc3NlcnQgKHBhcnNlci0+bGV4X2Zyb21fbGlzdCA9PSBOVUxMKTsKKworCS8qIENvcHkgbGlzdCwgZWxpbWluYXRpbmcgYW55IHNwYWNlIHRva2Vucy4gKi8KKwlwYXJzZXItPmxleF9mcm9tX2xpc3QgPSBfdG9rZW5fbGlzdF9jcmVhdGUgKHBhcnNlcik7CisKKwlmb3IgKG5vZGUgPSBsaXN0LT5oZWFkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworCQlpZiAobm9kZS0+dG9rZW4tPnR5cGUgPT0gU1BBQ0UpCisJCQljb250aW51ZTsKKwkJX3Rva2VuX2xpc3RfYXBwZW5kIChwYXJzZXItPmxleF9mcm9tX2xpc3QsIG5vZGUtPnRva2VuKTsKKwl9CisKKwlyYWxsb2NfZnJlZSAobGlzdCk7CisKKwlwYXJzZXItPmxleF9mcm9tX25vZGUgPSBwYXJzZXItPmxleF9mcm9tX2xpc3QtPmhlYWQ7CisKKwkvKiBJdCdzIHBvc3NpYmxlIHRoZSBsaXN0IGNvbnNpc3RlZCBvZiBub3RoaW5nIGJ1dCB3aGl0ZXNwYWNlLiAqLworCWlmIChwYXJzZXItPmxleF9mcm9tX25vZGUgPT0gTlVMTCkgeworCQlyYWxsb2NfZnJlZSAocGFyc2VyLT5sZXhfZnJvbV9saXN0KTsKKwkJcGFyc2VyLT5sZXhfZnJvbV9saXN0ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfcHVzaF9pZiAoZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgWVlMVFlQRSAqbG9jLAorCQkJCSAgaW50IGNvbmRpdGlvbikKK3sKKwlza2lwX3R5cGVfdCBjdXJyZW50ID0gU0tJUF9OT19TS0lQOworCXNraXBfbm9kZV90ICpub2RlOworCisJaWYgKHBhcnNlci0+c2tpcF9zdGFjaykKKwkJY3VycmVudCA9IHBhcnNlci0+c2tpcF9zdGFjay0+dHlwZTsKKworCW5vZGUgPSByYWxsb2MgKHBhcnNlciwgc2tpcF9ub2RlX3QpOworCW5vZGUtPmxvYyA9ICpsb2M7CisKKwlpZiAoY3VycmVudCA9PSBTS0lQX05PX1NLSVApIHsKKwkJaWYgKGNvbmRpdGlvbikKKwkJCW5vZGUtPnR5cGUgPSBTS0lQX05PX1NLSVA7CisJCWVsc2UKKwkJCW5vZGUtPnR5cGUgPSBTS0lQX1RPX0VMU0U7CisJfSBlbHNlIHsKKwkJbm9kZS0+dHlwZSA9IFNLSVBfVE9fRU5ESUY7CisJfQorCisJbm9kZS0+aGFzX2Vsc2UgPSBmYWxzZTsKKwlub2RlLT5uZXh0ID0gcGFyc2VyLT5za2lwX3N0YWNrOworCXBhcnNlci0+c2tpcF9zdGFjayA9IG5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCitfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfY2hhbmdlX2lmIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLCBZWUxUWVBFICpsb2MsCisJCQkJICAgIGNvbnN0IGNoYXIgKnR5cGUsIGludCBjb25kaXRpb24pCit7CisJaWYgKHBhcnNlci0+c2tpcF9zdGFjayA9PSBOVUxMKSB7CisJCWdsY3BwX2Vycm9yIChsb2MsIHBhcnNlciwgIiVzIHdpdGhvdXQgI2lmXG4iLCB0eXBlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwYXJzZXItPnNraXBfc3RhY2stPnR5cGUgPT0gU0tJUF9UT19FTFNFKSB7CisJCWlmIChjb25kaXRpb24pCisJCQlwYXJzZXItPnNraXBfc3RhY2stPnR5cGUgPSBTS0lQX05PX1NLSVA7CisJfSBlbHNlIHsKKwkJcGFyc2VyLT5za2lwX3N0YWNrLT50eXBlID0gU0tJUF9UT19FTkRJRjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitfZ2xjcHBfcGFyc2VyX3NraXBfc3RhY2tfcG9wIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLCBZWUxUWVBFICpsb2MpCit7CisJc2tpcF9ub2RlX3QgKm5vZGU7CisKKwlpZiAocGFyc2VyLT5za2lwX3N0YWNrID09IE5VTEwpIHsKKwkJZ2xjcHBfZXJyb3IgKGxvYywgcGFyc2VyLCAiI2VuZGlmIHdpdGhvdXQgI2lmXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW5vZGUgPSBwYXJzZXItPnNraXBfc3RhY2s7CisJcGFyc2VyLT5za2lwX3N0YWNrID0gbm9kZS0+bmV4dDsKKwlyYWxsb2NfZnJlZSAobm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitfZ2xjcHBfcGFyc2VyX2hhbmRsZV92ZXJzaW9uX2RlY2xhcmF0aW9uKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIGludG1heF90IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVzX2lkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhwbGljaXRseV9zZXQpCit7CisJY29uc3Qgc3RydWN0IGdsX2V4dGVuc2lvbnMgKmV4dGVuc2lvbnMgPSBwYXJzZXItPmV4dGVuc2lvbnM7CisKKwlpZiAocGFyc2VyLT52ZXJzaW9uX3Jlc29sdmVkKQorCQlyZXR1cm47CisKKwlwYXJzZXItPnZlcnNpb25fcmVzb2x2ZWQgPSB0cnVlOworCisJYWRkX2J1aWx0aW5fZGVmaW5lIChwYXJzZXIsICJfX1ZFUlNJT05fXyIsIHZlcnNpb24pOworCisJcGFyc2VyLT5pc19nbGVzID0gKHZlcnNpb24gPT0gMTAwKSB8fAorCQkJICAgKGVzX2lkZW50aWZpZXIgJiYKKwkJCSAgICAoc3RyY21wKGVzX2lkZW50aWZpZXIsICJlcyIpID09IDApKTsKKworCS8qIEFkZCBwcmUtZGVmaW5lZCBtYWNyb3MuICovCisJaWYgKHBhcnNlci0+aXNfZ2xlcykgeworCSAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9FUyIsIDEpOworICAgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzIiwgMSk7CisKKwkgICBpZiAoZXh0ZW5zaW9ucyAhPSBOVUxMKSB7CisJICAgICAgaWYgKGV4dGVuc2lvbnMtPk9FU19FR0xfaW1hZ2VfZXh0ZXJuYWwpCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwiLCAxKTsKKwkgICB9CisJfSBlbHNlIHsKKwkgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX2RyYXdfYnVmZmVycyIsIDEpOworICAgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzIiwgMSk7CisJICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZSIsIDEpOworICAgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQU1EX3NoYWRlcl90cmluYXJ5X21pbm1heCIsIDEpOworCisKKwkgICBpZiAoZXh0ZW5zaW9ucyAhPSBOVUxMKSB7CisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkVYVF90ZXh0dXJlX2FycmF5KQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9FWFRfdGV4dHVyZV9hcnJheSIsIDEpOworCisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkFSQl9hcnJheXNfb2ZfYXJyYXlzKQorCSAgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX2FycmF5c19vZl9hcnJheXMiLCAxKTsKKworCSAgICAgIGlmIChleHRlbnNpb25zLT5BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnMpCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucyIsCisJCQkJICAgIDEpOworCisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkFSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24pCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24iLCAxKTsKKworCSAgICAgIGlmIChleHRlbnNpb25zLT5BUkJfc2hhZGVyX3RleHR1cmVfbG9kKQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BUkJfc2hhZGVyX3RleHR1cmVfbG9kIiwgMSk7CisKKwkgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX2RyYXdfaW5zdGFuY2VkKQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BUkJfZHJhd19pbnN0YW5jZWQiLCAxKTsKKworCSAgICAgIGlmIChleHRlbnNpb25zLT5BUkJfY29uc2VydmF0aXZlX2RlcHRoKSB7CisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FNRF9jb25zZXJ2YXRpdmVfZGVwdGgiLCAxKTsKKwkgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aCIsIDEpOworCSAgICAgIH0KKworCSAgICAgIGlmIChleHRlbnNpb25zLT5BUkJfc2hhZGVyX2JpdF9lbmNvZGluZykKKwkgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmciLCAxKTsKKworCSAgICAgIGlmIChleHRlbnNpb25zLT5BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0KQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0IiwgMSk7CisKKwkgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkpCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5IiwgMSk7CisKKwkgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZykKKwkgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZyIsIDEpOworCisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlKQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BUkJfdGV4dHVyZV9tdWx0aXNhbXBsZSIsIDEpOworCisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkFSQl90ZXh0dXJlX3F1ZXJ5X2xldmVscykKKwkgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX3RleHR1cmVfcXVlcnlfbGV2ZWxzIiwgMSk7CisKKwkgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX3RleHR1cmVfcXVlcnlfbG9kKQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BUkJfdGV4dHVyZV9xdWVyeV9sb2QiLCAxKTsKKworCSAgICAgIGlmIChleHRlbnNpb25zLT5BUkJfZ3B1X3NoYWRlcjUpCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl9ncHVfc2hhZGVyNSIsIDEpOworCisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkFNRF92ZXJ0ZXhfc2hhZGVyX2xheWVyKQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BTURfdmVydGV4X3NoYWRlcl9sYXllciIsIDEpOworCisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2spCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2siLCAxKTsKKworCSAgICAgIGlmIChleHRlbnNpb25zLT5BUkJfc2FtcGxlX3NoYWRpbmcpCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl9zYW1wbGVfc2hhZGluZyIsIDEpOworCisJICAgICAgaWYgKGV4dGVuc2lvbnMtPkFSQl90ZXh0dXJlX2dhdGhlcikKKwkgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX3RleHR1cmVfZ2F0aGVyIiwgMSk7CisKKwkgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnMpCisJICAgICAgICAgYWRkX2J1aWx0aW5fZGVmaW5lKHBhcnNlciwgIkdMX0FSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzIiwgMSk7CisKKwkgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX3ZpZXdwb3J0X2FycmF5KQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BUkJfdmlld3BvcnRfYXJyYXkiLCAxKTsKKworICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX2NvbXB1dGVfc2hhZGVyKQorICAgICAgICAgICAgICAgICBhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfQVJCX2NvbXB1dGVfc2hhZGVyIiwgMSk7CisKKwkgICAgICBpZiAoZXh0ZW5zaW9ucy0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlKQorCSAgICAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUiLCAxKTsKKwkgICB9CisJfQorCisJaWYgKGV4dGVuc2lvbnMgIT0gTlVMTCkgeworCSAgIGlmIChleHRlbnNpb25zLT5FWFRfc2hhZGVyX2ludGVnZXJfbWl4KQorCSAgICAgIGFkZF9idWlsdGluX2RlZmluZShwYXJzZXIsICJHTF9FWFRfc2hhZGVyX2ludGVnZXJfbWl4IiwgMSk7CisJfQorCisJaWYgKHZlcnNpb24gPj0gMTUwKQorCQlhZGRfYnVpbHRpbl9kZWZpbmUocGFyc2VyLCAiR0xfY29yZV9wcm9maWxlIiwgMSk7CisKKwkvKiBDdXJyZW50bHksIGFsbCBFUzIvRVMzIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0IGhpZ2hwIGluIHRoZQorCSAqIGZyYWdtZW50IHNoYWRlciwgc28gd2UgYWx3YXlzIGRlZmluZSB0aGlzIG1hY3JvIGluIEVTMi9FUzMuCisJICogSWYgd2UgZXZlciBnZXQgYSBkcml2ZXIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaGlnaHAsIHdlJ2xsCisJICogbmVlZCB0byBhZGQgYSBmbGFnIHRvIHRoZSBnbF9jb250ZXh0IGFuZCBjaGVjayB0aGF0IGhlcmUuCisJICovCisJaWYgKHZlcnNpb24gPj0gMTMwIHx8IHBhcnNlci0+aXNfZ2xlcykKKwkJYWRkX2J1aWx0aW5fZGVmaW5lIChwYXJzZXIsICJHTF9GUkFHTUVOVF9QUkVDSVNJT05fSElHSCIsIDEpOworCisJaWYgKGV4cGxpY2l0bHlfc2V0KSB7CisJICAgcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCAoJnBhcnNlci0+b3V0cHV0LCAmcGFyc2VyLT5vdXRwdXRfbGVuZ3RoLAorCQkJCQkgIiN2ZXJzaW9uICUiIFBSSWlNQVggIiVzJXMiLCB2ZXJzaW9uLAorCQkJCQkgZXNfaWRlbnRpZmllciA/ICIgIiA6ICIiLAorCQkJCQkgZXNfaWRlbnRpZmllciA/IGVzX2lkZW50aWZpZXIgOiAiIik7CisJfQorfQorCisvKiBHTFNMIHZlcnNpb24gaWYgbm8gdmVyc2lvbiBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4gKi8KKyNkZWZpbmUgSU1QTElDSVRfR0xTTF9WRVJTSU9OIDExMAorCisvKiBHTFNMIEVTIHZlcnNpb24gaWYgbm8gdmVyc2lvbiBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4gKi8KKyNkZWZpbmUgSU1QTElDSVRfR0xTTF9FU19WRVJTSU9OIDEwMAorCit2b2lkCitnbGNwcF9wYXJzZXJfcmVzb2x2ZV9pbXBsaWNpdF92ZXJzaW9uKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIpCit7CisJaW50IGxhbmd1YWdlX3ZlcnNpb24gPSBwYXJzZXItPmFwaSA9PSBBUElfT1BFTkdMRVMyID8KKwkJCSAgICAgICBJTVBMSUNJVF9HTFNMX0VTX1ZFUlNJT04gOgorCQkJICAgICAgIElNUExJQ0lUX0dMU0xfVkVSU0lPTjsKKworCV9nbGNwcF9wYXJzZXJfaGFuZGxlX3ZlcnNpb25fZGVjbGFyYXRpb24ocGFyc2VyLCBsYW5ndWFnZV92ZXJzaW9uLAorCQkJCQkJIE5VTEwsIGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvZ2xjcHAuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvZ2xjcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2IxNTAwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9nbGNwcC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgImdsY3BwLmgiCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJtYWluL3NoYWRlcm9iai5oIgorCitleHRlcm4gaW50IGdsY3BwX3BhcnNlcl9kZWJ1ZzsKKwordm9pZAorX21lc2FfcmVmZXJlbmNlX3NoYWRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyICoqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaCkKK3sKKyAgICh2b2lkKSBjdHg7CisgICAqcHRyID0gc2g7Cit9CisKKy8qIFJlYWQgZnJvbSBmcCB1bnRpbCBFT0YgYW5kIHJldHVybiBhIHN0cmluZyBvZiBldmVyeXRoaW5nIHJlYWQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2xvYWRfdGV4dF9mcCAodm9pZCAqY3R4LCBGSUxFICpmcCkKK3sKKyNkZWZpbmUgQ0hVTksgNDA5NgorCWNoYXIgKnRleHQgPSBOVUxMOworCXNpemVfdCB0ZXh0X3NpemUgPSAwOworCXNpemVfdCB0b3RhbF9yZWFkID0gMDsKKwlzaXplX3QgYnl0ZXM7CisKKwl3aGlsZSAoMSkgeworCQlpZiAodG90YWxfcmVhZCArIENIVU5LICsgMSA+IHRleHRfc2l6ZSkgeworCQkJdGV4dF9zaXplID0gdGV4dF9zaXplID8gdGV4dF9zaXplICogMiA6IENIVU5LICsgMTsKKwkJCXRleHQgPSByZXJhbGxvY19zaXplIChjdHgsIHRleHQsIHRleHRfc2l6ZSk7CisJCQlpZiAodGV4dCA9PSBOVUxMKSB7CisJCQkJZnByaW50ZiAoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJYnl0ZXMgPSBmcmVhZCAodGV4dCArIHRvdGFsX3JlYWQsIDEsIENIVU5LLCBmcCk7CisJCXRvdGFsX3JlYWQgKz0gYnl0ZXM7CisKKwkJaWYgKGJ5dGVzIDwgQ0hVTkspIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdGV4dFt0b3RhbF9yZWFkXSA9ICdcMCc7CisKKwlyZXR1cm4gdGV4dDsKK30KKworc3RhdGljIGNoYXIgKgorbG9hZF90ZXh0X2ZpbGUodm9pZCAqY3R4LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICp0ZXh0OworCUZJTEUgKmZwOworCisJaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgc3RyY21wIChmaWxlbmFtZSwgIi0iKSA9PSAwKQorCQlyZXR1cm4gbG9hZF90ZXh0X2ZwIChjdHgsIHN0ZGluKTsKKworCWZwID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOworCWlmIChmcCA9PSBOVUxMKSB7CisJCWZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIGZpbGUgJXM6ICVzXG4iLAorCQkJIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdGV4dCA9IGxvYWRfdGV4dF9mcCAoY3R4LCBmcCk7CisKKwlmY2xvc2UoZnApOworCisJcmV0dXJuIHRleHQ7Cit9CisKKy8qIEluaXRpYWxpemUgb25seSB0aG9zZSB0aGluZ3MgdGhhdCBnbGNwcCBjYXJlcyBhYm91dC4KKyAqLworc3RhdGljIHZvaWQKK2luaXRfZmFrZV9nbF9jb250ZXh0IChzdHJ1Y3QgZ2xfY29udGV4dCAqZ2xfY3R4KQoreworCWdsX2N0eC0+QVBJID0gQVBJX09QRU5HTF9DT01QQVQ7CisJZ2xfY3R4LT5Db25zdC5EaXNhYmxlR0xTTExpbmVDb250aW51YXRpb25zID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSAodm9pZCkKK3sKKwlmcHJpbnRmIChzdGRlcnIsCisJCSAiVXNhZ2U6IGdsY3BwIFtPUFRJT05TXSBbLS1dIFs8ZmlsZW5hbWU+XVxuIgorCQkgIlxuIgorCQkgIlByZS1wcm9jZXNzIHRoZSBnaXZlbiBmaWxlbmFtZSAoc3RkaW4gaWYgbm8gZmlsZW5hbWUgZ2l2ZW4pLlxuIgorCQkgIlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOlxuIgorCQkgIiAgICAtLWRpc2FibGUtbGluZS1jb250aW51YXRpb25zICAgICAgRG8gbm90IGludGVycHJldCBsaW5lcyBlbmRpbmcgd2l0aCBhXG4iCisJCSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc2xhc2ggKCdcXCcpIGFzIGEgbGluZSBjb250aW51YXRpb24uXG4iKTsKK30KKworZW51bSB7CisJRElTQUJMRV9MSU5FX0NPTlRJTlVBVElPTlNfT1BUID0gQ0hBUl9NQVggKyAxCit9OworCitjb25zdCBzdGF0aWMgc3RydWN0IG9wdGlvbgorbG9uZ19vcHRpb25zW10gPSB7CisJeyJkaXNhYmxlLWxpbmUtY29udGludWF0aW9ucyIsIG5vX2FyZ3VtZW50LCAwLCBESVNBQkxFX0xJTkVfQ09OVElOVUFUSU9OU19PUFQgfSwKKwl7MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIDAsIDAgfQorfTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKmZpbGVuYW1lID0gTlVMTDsKKwl2b2lkICpjdHggPSByYWxsb2MoTlVMTCwgdm9pZCopOworCWNoYXIgKmluZm9fbG9nID0gcmFsbG9jX3N0cmR1cChjdHgsICIiKTsKKwljb25zdCBjaGFyICpzaGFkZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgZ2xfY29udGV4dCBnbF9jdHg7CisJaW50IGM7CisKKwlpbml0X2Zha2VfZ2xfY29udGV4dCAoJmdsX2N0eCk7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiIiwgbG9uZ19vcHRpb25zLCBOVUxMKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgRElTQUJMRV9MSU5FX0NPTlRJTlVBVElPTlNfT1BUOgorCQkJZ2xfY3R4LkNvbnN0LkRpc2FibGVHTFNMTGluZUNvbnRpbnVhdGlvbnMgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSAoKTsKKwkJCWV4aXQgKDEpOworCQl9CisJfQorCisJaWYgKG9wdGluZCArIDEgPCBhcmdjKSB7CisJCXByaW50ZiAoIlVuZXhwZWN0ZWQgYXJndW1lbnQ6ICVzXG4iLCBhcmd2W29wdGluZCsxXSk7CisJCXVzYWdlICgpOworCQlleGl0ICgxKTsKKwl9CisJaWYgKG9wdGluZCA8IGFyZ2MpIHsKKwkJZmlsZW5hbWUgPSBhcmd2W29wdGluZF07CisJfQorCisJc2hhZGVyID0gbG9hZF90ZXh0X2ZpbGUgKGN0eCwgZmlsZW5hbWUpOworCWlmIChzaGFkZXIgPT0gTlVMTCkKKwkgICByZXR1cm4gMTsKKworCXJldCA9IGdsY3BwX3ByZXByb2Nlc3MoY3R4LCAmc2hhZGVyLCAmaW5mb19sb2csIE5VTEwsICZnbF9jdHgpOworCisJcHJpbnRmKCIlcyIsIHNoYWRlcik7CisJZnByaW50ZihzdGRlcnIsICIlcyIsIGluZm9fbG9nKTsKKworCXJhbGxvY19mcmVlKGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9nbGNwcC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9nbGNwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Y2NiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL2dsY3BwLmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEdMQ1BQX0gKKyNkZWZpbmUgR0xDUFBfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKworI2luY2x1ZGUgIi4uL3JhbGxvYy5oIgorCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisKKyNkZWZpbmUgeXlzY2FuX3Qgdm9pZCoKKworLyogU29tZSBkYXRhIHR5cGVzIHVzZWQgZm9yIHBhcnNlciB2YWx1ZXMuICovCisKK3R5cGVkZWYgc3RydWN0IHN0cmluZ19ub2RlIHsKKwljb25zdCBjaGFyICpzdHI7CisJc3RydWN0IHN0cmluZ19ub2RlICpuZXh0OworfSBzdHJpbmdfbm9kZV90OworCit0eXBlZGVmIHN0cnVjdCBzdHJpbmdfbGlzdCB7CisJc3RyaW5nX25vZGVfdCAqaGVhZDsKKwlzdHJpbmdfbm9kZV90ICp0YWlsOworfSBzdHJpbmdfbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCB0b2tlbiB0b2tlbl90OwordHlwZWRlZiBzdHJ1Y3QgdG9rZW5fbGlzdCB0b2tlbl9saXN0X3Q7CisKK3R5cGVkZWYgdW5pb24gWVlTVFlQRQoreworCWludG1heF90IGl2YWw7CisJY2hhciAqc3RyOworCXN0cmluZ19saXN0X3QgKnN0cmluZ19saXN0OworCXRva2VuX3QgKnRva2VuOworCXRva2VuX2xpc3RfdCAqdG9rZW5fbGlzdDsKK30gWVlTVFlQRTsKKworIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKyMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQorCit0eXBlZGVmIHN0cnVjdCBZWUxUWVBFIHsKKyAgIGludCBmaXJzdF9saW5lOworICAgaW50IGZpcnN0X2NvbHVtbjsKKyAgIGludCBsYXN0X2xpbmU7CisgICBpbnQgbGFzdF9jb2x1bW47CisgICB1bnNpZ25lZCBzb3VyY2U7Cit9IFlZTFRZUEU7CisjIGRlZmluZSBZWUxUWVBFX0lTX0RFQ0xBUkVEIDEKKyMgZGVmaW5lIFlZTFRZUEVfSVNfVFJJVklBTCAxCisKKyMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQlcCitkbyB7CQkJCQkJCQlcCisgICBpZiAoTikJCQkJCQkJXAorICAgewkJCQkJCQkJXAorICAgICAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DKFJocywgMSkuZmlyc3RfbGluZTsJXAorICAgICAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCisgICAgICAoQ3VycmVudCkubGFzdF9saW5lICAgID0gWVlSSFNMT0MoUmhzLCBOKS5sYXN0X2xpbmU7CVwKKyAgICAgIChDdXJyZW50KS5sYXN0X2NvbHVtbiAgPSBZWVJIU0xPQyhSaHMsIE4pLmxhc3RfY29sdW1uOwlcCisgICB9CQkJCQkJCQlcCisgICBlbHNlCQkJCQkJCQlcCisgICB7CQkJCQkJCQlcCisgICAgICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gKEN1cnJlbnQpLmxhc3RfbGluZSA9CQlcCisJIFlZUkhTTE9DKFJocywgMCkubGFzdF9saW5lOwkJCQlcCisgICAgICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gKEN1cnJlbnQpLmxhc3RfY29sdW1uID0JCVwKKwkgWVlSSFNMT0MoUmhzLCAwKS5sYXN0X2NvbHVtbjsJCQkJXAorICAgfQkJCQkJCQkJXAorICAgKEN1cnJlbnQpLnNvdXJjZSA9IDA7CQkJCQlcCit9IHdoaWxlICgwKQorCitzdHJ1Y3QgdG9rZW4geworCWludCB0eXBlOworCVlZU1RZUEUgdmFsdWU7CisJWVlMVFlQRSBsb2NhdGlvbjsKK307CisKK3R5cGVkZWYgc3RydWN0IHRva2VuX25vZGUgeworCXRva2VuX3QgKnRva2VuOworCXN0cnVjdCB0b2tlbl9ub2RlICpuZXh0OworfSB0b2tlbl9ub2RlX3Q7CisKK3N0cnVjdCB0b2tlbl9saXN0IHsKKwl0b2tlbl9ub2RlX3QgKmhlYWQ7CisJdG9rZW5fbm9kZV90ICp0YWlsOworCXRva2VuX25vZGVfdCAqbm9uX3NwYWNlX3RhaWw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBhcmd1bWVudF9ub2RlIHsKKwl0b2tlbl9saXN0X3QgKmFyZ3VtZW50OworCXN0cnVjdCBhcmd1bWVudF9ub2RlICpuZXh0OworfSBhcmd1bWVudF9ub2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGFyZ3VtZW50X2xpc3QgeworCWFyZ3VtZW50X25vZGVfdCAqaGVhZDsKKwlhcmd1bWVudF9ub2RlX3QgKnRhaWw7Cit9IGFyZ3VtZW50X2xpc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZ2xjcHBfcGFyc2VyIGdsY3BwX3BhcnNlcl90OworCit0eXBlZGVmIGVudW0geworCVRPS0VOX0NMQVNTX0lERU5USUZJRVIsCisJVE9LRU5fQ0xBU1NfSURFTlRJRklFUl9GSU5BTElaRUQsCisJVE9LRU5fQ0xBU1NfRlVOQ19NQUNSTywKKwlUT0tFTl9DTEFTU19PQkpfTUFDUk8KK30gdG9rZW5fY2xhc3NfdDsKKwordG9rZW5fY2xhc3NfdAorZ2xjcHBfcGFyc2VyX2NsYXNzaWZ5X3Rva2VuIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLAorCQkJICAgICBjb25zdCBjaGFyICppZGVudGlmaWVyLAorCQkJICAgICBpbnQgKnBhcmFtZXRlcl9pbmRleCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgaXNfZnVuY3Rpb247CisJc3RyaW5nX2xpc3RfdCAqcGFyYW1ldGVyczsKKwljb25zdCBjaGFyICppZGVudGlmaWVyOworCXRva2VuX2xpc3RfdCAqcmVwbGFjZW1lbnRzOworfSBtYWNyb190OworCit0eXBlZGVmIHN0cnVjdCBleHBhbnNpb25fbm9kZSB7CisJbWFjcm9fdCAqbWFjcm87CisJdG9rZW5fbm9kZV90ICpyZXBsYWNlbWVudHM7CisJc3RydWN0IGV4cGFuc2lvbl9ub2RlICpuZXh0OworfSBleHBhbnNpb25fbm9kZV90OworCit0eXBlZGVmIGVudW0gc2tpcF90eXBlIHsKKwlTS0lQX05PX1NLSVAsCisJU0tJUF9UT19FTFNFLAorCVNLSVBfVE9fRU5ESUYKK30gc2tpcF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNraXBfbm9kZSB7CisJc2tpcF90eXBlX3QgdHlwZTsKKwlib29sIGhhc19lbHNlOworCVlZTFRZUEUgbG9jOyAvKiBsb2NhdGlvbiBvZiB0aGUgaW5pdGlhbCAjaWYvI2VsaWYvLi4uICovCisJc3RydWN0IHNraXBfbm9kZSAqbmV4dDsKK30gc2tpcF9ub2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGFjdGl2ZV9saXN0IHsKKwljb25zdCBjaGFyICppZGVudGlmaWVyOworCXRva2VuX25vZGVfdCAqbWFya2VyOworCXN0cnVjdCBhY3RpdmVfbGlzdCAqbmV4dDsKK30gYWN0aXZlX2xpc3RfdDsKKworc3RydWN0IGdsY3BwX3BhcnNlciB7CisJeXlzY2FuX3Qgc2Nhbm5lcjsKKwlzdHJ1Y3QgaGFzaF90YWJsZSAqZGVmaW5lczsKKwlhY3RpdmVfbGlzdF90ICphY3RpdmU7CisJaW50IGxleGluZ19pZjsKKwlpbnQgc3BhY2VfdG9rZW5zOworCWludCBuZXdsaW5lX2FzX3NwYWNlOworCWludCBpbl9jb250cm9sX2xpbmU7CisJaW50IHBhcmVuX2NvdW50OworCWludCBjb21tZW50ZWRfbmV3bGluZXM7CisJc2tpcF9ub2RlX3QgKnNraXBfc3RhY2s7CisJdG9rZW5fbGlzdF90ICpsZXhfZnJvbV9saXN0OworCXRva2VuX25vZGVfdCAqbGV4X2Zyb21fbm9kZTsKKwljaGFyICpvdXRwdXQ7CisJY2hhciAqaW5mb19sb2c7CisJc2l6ZV90IG91dHB1dF9sZW5ndGg7CisJc2l6ZV90IGluZm9fbG9nX2xlbmd0aDsKKwlpbnQgZXJyb3I7CisJY29uc3Qgc3RydWN0IGdsX2V4dGVuc2lvbnMgKmV4dGVuc2lvbnM7CisJZ2xfYXBpIGFwaTsKKwlib29sIHZlcnNpb25fcmVzb2x2ZWQ7CisJYm9vbCBoYXNfbmV3X2xpbmVfbnVtYmVyOworCWludCBuZXdfbGluZV9udW1iZXI7CisJYm9vbCBoYXNfbmV3X3NvdXJjZV9udW1iZXI7CisJaW50IG5ld19zb3VyY2VfbnVtYmVyOworCWJvb2wgaXNfZ2xlczsKK307CisKK3N0cnVjdCBnbF9leHRlbnNpb25zOworCitnbGNwcF9wYXJzZXJfdCAqCitnbGNwcF9wYXJzZXJfY3JlYXRlIChjb25zdCBzdHJ1Y3QgZ2xfZXh0ZW5zaW9ucyAqZXh0ZW5zaW9ucywgZ2xfYXBpIGFwaSk7CisKK2ludAorZ2xjcHBfcGFyc2VyX3BhcnNlIChnbGNwcF9wYXJzZXJfdCAqcGFyc2VyKTsKKwordm9pZAorZ2xjcHBfcGFyc2VyX2Rlc3Ryb3kgKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIpOworCit2b2lkCitnbGNwcF9wYXJzZXJfcmVzb2x2ZV9pbXBsaWNpdF92ZXJzaW9uKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIpOworCitpbnQKK2dsY3BwX3ByZXByb2Nlc3Modm9pZCAqcmFsbG9jX2N0eCwgY29uc3QgY2hhciAqKnNoYWRlciwgY2hhciAqKmluZm9fbG9nLAorCSAgIGNvbnN0IHN0cnVjdCBnbF9leHRlbnNpb25zICpleHRlbnNpb25zLCBzdHJ1Y3QgZ2xfY29udGV4dCAqZ19jdHgpOworCisvKiBGdW5jdGlvbnMgZm9yIHdyaXRpbmcgdG8gdGhlIGluZm8gbG9nICovCisKK3ZvaWQKK2dsY3BwX2Vycm9yIChZWUxUWVBFICpsb2NwLCBnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK3ZvaWQKK2dsY3BwX3dhcm5pbmcgKFlZTFRZUEUgKmxvY3AsIGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworLyogR2VuZXJhdGVkIGJ5IGdsY3BwLWxleC5sIHRvIGdsY3BwLWxleC5jICovCisKK2ludAorZ2xjcHBfbGV4X2luaXRfZXh0cmEgKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIHl5c2Nhbl90KiBzY2FubmVyKTsKKwordm9pZAorZ2xjcHBfbGV4X3NldF9zb3VyY2Vfc3RyaW5nKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIsIGNvbnN0IGNoYXIgKnNoYWRlcik7CisKK2ludAorZ2xjcHBfbGV4IChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3AsIHl5c2Nhbl90IHNjYW5uZXIpOworCitpbnQKK2dsY3BwX2xleF9kZXN0cm95ICh5eXNjYW5fdCBzY2FubmVyKTsKKworLyogR2VuZXJhdGVkIGJ5IGdsY3BwLXBhcnNlLnkgdG8gZ2xjcHAtcGFyc2UuYyAqLworCitpbnQKK3l5cGFyc2UgKGdsY3BwX3BhcnNlcl90ICpwYXJzZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvcHAuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTYyM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC9wcC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ2xjcHAuaCIKKyNpbmNsdWRlICJtYWluL2NvcmUuaCIgLyogZm9yIGlzYmxhbmsoKSBvbiBNU1ZDICovCisKK3ZvaWQKK2dsY3BwX2Vycm9yIChZWUxUWVBFICpsb2NwLCBnbGNwcF9wYXJzZXJfdCAqcGFyc2VyLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJcGFyc2VyLT5lcnJvciA9IDE7CisJcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCgmcGFyc2VyLT5pbmZvX2xvZywKKwkJCQkgICAgICZwYXJzZXItPmluZm9fbG9nX2xlbmd0aCwKKwkJCQkgICAgICIldToldSgldSk6ICIKKwkJCQkgICAgICJwcmVwcm9jZXNzb3IgZXJyb3I6ICIsCisJCQkJICAgICBsb2NwLT5zb3VyY2UsCisJCQkJICAgICBsb2NwLT5maXJzdF9saW5lLAorCQkJCSAgICAgbG9jcC0+Zmlyc3RfY29sdW1uKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyYWxsb2NfdmFzcHJpbnRmX3Jld3JpdGVfdGFpbCgmcGFyc2VyLT5pbmZvX2xvZywKKwkJCQkgICAgICAmcGFyc2VyLT5pbmZvX2xvZ19sZW5ndGgsCisJCQkJICAgICAgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyYWxsb2NfYXNwcmludGZfcmV3cml0ZV90YWlsKCZwYXJzZXItPmluZm9fbG9nLAorCQkJCSAgICAgJnBhcnNlci0+aW5mb19sb2dfbGVuZ3RoLCAiXG4iKTsKK30KKwordm9pZAorZ2xjcHBfd2FybmluZyAoWVlMVFlQRSAqbG9jcCwgZ2xjcHBfcGFyc2VyX3QgKnBhcnNlciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwoJnBhcnNlci0+aW5mb19sb2csCisJCQkJICAgICAmcGFyc2VyLT5pbmZvX2xvZ19sZW5ndGgsCisJCQkJICAgICAiJXU6JXUoJXUpOiAiCisJCQkJICAgICAicHJlcHJvY2Vzc29yIHdhcm5pbmc6ICIsCisJCQkJICAgICBsb2NwLT5zb3VyY2UsCisJCQkJICAgICBsb2NwLT5maXJzdF9saW5lLAorCQkJCSAgICAgbG9jcC0+Zmlyc3RfY29sdW1uKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyYWxsb2NfdmFzcHJpbnRmX3Jld3JpdGVfdGFpbCgmcGFyc2VyLT5pbmZvX2xvZywKKwkJCQkgICAgICAmcGFyc2VyLT5pbmZvX2xvZ19sZW5ndGgsCisJCQkJICAgICAgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyYWxsb2NfYXNwcmludGZfcmV3cml0ZV90YWlsKCZwYXJzZXItPmluZm9fbG9nLAorCQkJCSAgICAgJnBhcnNlci0+aW5mb19sb2dfbGVuZ3RoLCAiXG4iKTsKK30KKworLyogUmVtb3ZlIGFueSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXJzIGluIHRoZSBzaGFkZXIsICh3aGV0aGVyIGluCisgKiBwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMgb3IgaW4gR0xTTCBjb2RlKS4KKyAqLworc3RhdGljIGNoYXIgKgorcmVtb3ZlX2xpbmVfY29udGludWF0aW9ucyhnbGNwcF9wYXJzZXJfdCAqY3R4LCBjb25zdCBjaGFyICpzaGFkZXIpCit7CisJY2hhciAqY2xlYW4gPSByYWxsb2Nfc3RyZHVwKGN0eCwgIiIpOworCWNvbnN0IGNoYXIgKmJhY2tzbGFzaCwgKm5ld2xpbmUsICpzZWFyY2hfc3RhcnQ7CisJaW50IGNvbGxhcHNlZF9uZXdsaW5lcyA9IDA7CisKKwlzZWFyY2hfc3RhcnQgPSBzaGFkZXI7CisKKwl3aGlsZSAodHJ1ZSkgeworCQliYWNrc2xhc2ggPSBzdHJjaHIoc2VhcmNoX3N0YXJ0LCAnXFwnKTsKKworCQkvKiBJZiB3ZSBoYXZlIHByZXZpb3VzbHkgY29sbGFwc2VkIGFueSBsaW5lLWNvbnRpbnVhdGlvbnMsCisJCSAqIHRoZW4gd2Ugd2FudCB0byBpbnNlcnQgYWRkaXRpb25hbCBuZXdsaW5lcyBhdCB0aGUgbmV4dAorCQkgKiBvY2N1cnJlbmNlIG9mIGEgbmV3bGluZSBjaGFyYWN0ZXIgdG8gYXZvaWQgY2hhbmdpbmcgYW55CisJCSAqIGxpbmUgbnVtYmVycy4KKwkJICovCisJCWlmIChjb2xsYXBzZWRfbmV3bGluZXMpIHsKKwkJCW5ld2xpbmUgPSBzdHJjaHIoc2VhcmNoX3N0YXJ0LCAnXG4nKTsKKwkJCWlmIChuZXdsaW5lICYmCisJCQkgICAgKGJhY2tzbGFzaCA9PSBOVUxMIHx8IG5ld2xpbmUgPCBiYWNrc2xhc2gpKQorCQkJeworCQkJCXJhbGxvY19zdHJuY2F0KCZjbGVhbiwgc2hhZGVyLAorCQkJCQkgICAgICAgbmV3bGluZSAtIHNoYWRlciArIDEpOworCQkJCXdoaWxlIChjb2xsYXBzZWRfbmV3bGluZXMpIHsKKwkJCQkJcmFsbG9jX3N0cmNhdCgmY2xlYW4sICJcbiIpOworCQkJCQljb2xsYXBzZWRfbmV3bGluZXMtLTsKKwkJCQl9CisJCQkJc2hhZGVyID0gbmV3bGluZSArIDE7CisJCQkJc2VhcmNoX3N0YXJ0ID0gc2hhZGVyOworCQkJfQorCQl9CisKKwkJc2VhcmNoX3N0YXJ0ID0gYmFja3NsYXNoICsgMTsKKworCQlpZiAoYmFja3NsYXNoID09IE5VTEwpCisJCQlicmVhazsKKworCQkvKiBBdCBlYWNoIGxpbmUgY29udGludWF0aW9uLCAoYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGEKKwkJICogbmV3bGluZSksIGNvcHkgYWxsIHByZWNlZGluZyB0ZXh0IHRvIHRoZSBvdXRwdXQsIHRoZW4KKwkJICogYWR2YW5jZSB0aGUgc2hhZGVyIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUKKwkJICogbmV3bGluZS4KKwkJICovCisJCWlmIChiYWNrc2xhc2hbMV0gPT0gJ1xuJyB8fAorCQkgICAgKGJhY2tzbGFzaFsxXSA9PSAnXHInICYmIGJhY2tzbGFzaFsyXSA9PSAnXG4nKSkKKwkJeworCQkJY29sbGFwc2VkX25ld2xpbmVzKys7CisJCQlyYWxsb2Nfc3RybmNhdCgmY2xlYW4sIHNoYWRlciwgYmFja3NsYXNoIC0gc2hhZGVyKTsKKwkJCWlmIChiYWNrc2xhc2hbMV0gPT0gJ1xuJykKKwkJCQlzaGFkZXIgPSBiYWNrc2xhc2ggKyAyOworCQkJZWxzZQorCQkJCXNoYWRlciA9IGJhY2tzbGFzaCArIDM7CisJCQlzZWFyY2hfc3RhcnQgPSBzaGFkZXI7CisJCX0KKwl9CisKKwlyYWxsb2Nfc3RyY2F0KCZjbGVhbiwgc2hhZGVyKTsKKworCXJldHVybiBjbGVhbjsKK30KKworaW50CitnbGNwcF9wcmVwcm9jZXNzKHZvaWQgKnJhbGxvY19jdHgsIGNvbnN0IGNoYXIgKipzaGFkZXIsIGNoYXIgKippbmZvX2xvZywKKwkgICBjb25zdCBzdHJ1Y3QgZ2xfZXh0ZW5zaW9ucyAqZXh0ZW5zaW9ucywgc3RydWN0IGdsX2NvbnRleHQgKmdsX2N0eCkKK3sKKwlpbnQgZXJyb3JzOworCWdsY3BwX3BhcnNlcl90ICpwYXJzZXIgPSBnbGNwcF9wYXJzZXJfY3JlYXRlIChleHRlbnNpb25zLCBnbF9jdHgtPkFQSSk7CisKKwlpZiAoISBnbF9jdHgtPkNvbnN0LkRpc2FibGVHTFNMTGluZUNvbnRpbnVhdGlvbnMpCisJCSpzaGFkZXIgPSByZW1vdmVfbGluZV9jb250aW51YXRpb25zKHBhcnNlciwgKnNoYWRlcik7CisKKwlnbGNwcF9sZXhfc2V0X3NvdXJjZV9zdHJpbmcgKHBhcnNlciwgKnNoYWRlcik7CisKKwlnbGNwcF9wYXJzZXJfcGFyc2UgKHBhcnNlcik7CisKKwlpZiAocGFyc2VyLT5za2lwX3N0YWNrKQorCQlnbGNwcF9lcnJvciAoJnBhcnNlci0+c2tpcF9zdGFjay0+bG9jLCBwYXJzZXIsICJVbnRlcm1pbmF0ZWQgI2lmXG4iKTsKKworCWdsY3BwX3BhcnNlcl9yZXNvbHZlX2ltcGxpY2l0X3ZlcnNpb24ocGFyc2VyKTsKKworCXJhbGxvY19zdHJjYXQoaW5mb19sb2csIHBhcnNlci0+aW5mb19sb2cpOworCisJcmFsbG9jX3N0ZWFsKHJhbGxvY19jdHgsIHBhcnNlci0+b3V0cHV0KTsKKwkqc2hhZGVyID0gcGFyc2VyLT5vdXRwdXQ7CisKKwllcnJvcnMgPSBwYXJzZXItPmVycm9yOworCWdsY3BwX3BhcnNlcl9kZXN0cm95IChwYXJzZXIpOworCXJldHVybiBlcnJvcnM7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwMC1jb250ZW50LXdpdGgtc3BhY2VzLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwMC1jb250ZW50LXdpdGgtc3BhY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMzIwZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAwLWNvbnRlbnQtd2l0aC1zcGFjZXMuYwpAQCAtMCwwICsxIEBACisgICB0aGlzIGlzICBmb3VyIAl0b2tlbnMgIHdpdGggc3BhY2VzCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwMC1jb250ZW50LXdpdGgtc3BhY2VzLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwMC1jb250ZW50LXdpdGgtc3BhY2VzLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxN2VjOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAwLWNvbnRlbnQtd2l0aC1zcGFjZXMuYy5leHBlY3RlZApAQCAtMCwwICsxLDIgQEAKKyAgIHRoaXMgaXMgIGZvdXIgIHRva2VucyAgd2l0aCBzcGFjZXMKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDEtZGVmaW5lLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwMS1kZWZpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmYyZmVlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDEtZGVmaW5lLmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGZvbyAxCitmb28KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAxLWRlZmluZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDEtZGVmaW5lLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4ZmQxNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAxLWRlZmluZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisxCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAyLWRlZmluZS1jaGFpbi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDItZGVmaW5lLWNoYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkNzVjNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAyLWRlZmluZS1jaGFpbi5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBmb28gMQorI2RlZmluZSBiYXIgZm9vCitiYXIKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAyLWRlZmluZS1jaGFpbi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDItZGVmaW5lLWNoYWluLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNDg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAyLWRlZmluZS1jaGFpbi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCisKKzEKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDMtZGVmaW5lLWNoYWluLXJldmVyc2UuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAzLWRlZmluZS1jaGFpbi1yZXZlcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4YjcyNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAzLWRlZmluZS1jaGFpbi1yZXZlcnNlLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIGJhciBmb28KKyNkZWZpbmUgZm9vIDEKK2JhcgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDMtZGVmaW5lLWNoYWluLXJldmVyc2UuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAzLWRlZmluZS1jaGFpbi1yZXZlcnNlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNDg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDAzLWRlZmluZS1jaGFpbi1yZXZlcnNlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACisKKworMQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNC1kZWZpbmUtcmVjdXJzaXZlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNC1kZWZpbmUtcmVjdXJzaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjNTZlYQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA0LWRlZmluZS1yZWN1cnNpdmUuYwpAQCAtMCwwICsxLDYgQEAKKyNkZWZpbmUgZm9vIGJhcgorI2RlZmluZSBiYXIgYmF6CisjZGVmaW5lIGJheiBmb28KK2ZvbworYmFyCitiYXoKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA0LWRlZmluZS1yZWN1cnNpdmUuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA0LWRlZmluZS1yZWN1cnNpdmUuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI2OThiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDQtZGVmaW5lLXJlY3Vyc2l2ZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNyBAQAorCisKKworZm9vCitiYXIKK2JhegorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNS1kZWZpbmUtY29tcG9zaXRlLWNoYWluLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNS1kZWZpbmUtY29tcG9zaXRlLWNoYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1MjFkZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA1LWRlZmluZS1jb21wb3NpdGUtY2hhaW4uYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgZm9vIDEKKyNkZWZpbmUgYmFyIGEgZm9vCitiYXIKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA1LWRlZmluZS1jb21wb3NpdGUtY2hhaW4uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA1LWRlZmluZS1jb21wb3NpdGUtY2hhaW4uYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjczNThmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDUtZGVmaW5lLWNvbXBvc2l0ZS1jaGFpbi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCisKK2EgMQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNi1kZWZpbmUtY29tcG9zaXRlLWNoYWluLXJldmVyc2UuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA2LWRlZmluZS1jb21wb3NpdGUtY2hhaW4tcmV2ZXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjkxYTEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNi1kZWZpbmUtY29tcG9zaXRlLWNoYWluLXJldmVyc2UuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgYmFyIGEgZm9vCisjZGVmaW5lIGZvbyAxCitiYXIKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA2LWRlZmluZS1jb21wb3NpdGUtY2hhaW4tcmV2ZXJzZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDYtZGVmaW5lLWNvbXBvc2l0ZS1jaGFpbi1yZXZlcnNlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3MzU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA2LWRlZmluZS1jb21wb3NpdGUtY2hhaW4tcmV2ZXJzZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCisKK2EgMQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNy1kZWZpbmUtY29tcG9zaXRlLXJlY3Vyc2l2ZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDctZGVmaW5lLWNvbXBvc2l0ZS1yZWN1cnNpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzg0NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDctZGVmaW5lLWNvbXBvc2l0ZS1yZWN1cnNpdmUuYwpAQCAtMCwwICsxLDYgQEAKKyNkZWZpbmUgZm9vIGEgYmFyCisjZGVmaW5lIGJhciBiIGJhegorI2RlZmluZSBiYXogYyBmb28KK2ZvbworYmFyCitiYXoKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA3LWRlZmluZS1jb21wb3NpdGUtcmVjdXJzaXZlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNy1kZWZpbmUtY29tcG9zaXRlLXJlY3Vyc2l2ZS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZmU0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwNy1kZWZpbmUtY29tcG9zaXRlLXJlY3Vyc2l2ZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNyBAQAorCisKKworYSBiIGMgZm9vCitiIGMgYSBiYXIKK2MgYSBiIGJhegorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwOC1kZWZpbmUtZW1wdHkuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA4LWRlZmluZS1lbXB0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYmQxN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwOC1kZWZpbmUtZW1wdHkuYwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgZm9vCitmb28KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA4LWRlZmluZS1lbXB0eS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMDgtZGVmaW5lLWVtcHR5LmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmNTNkNwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA4LWRlZmluZS1lbXB0eS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisgCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA5LXVuZGVmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwOS11bmRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzFmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwOS11bmRlZi5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBmb28gMQorZm9vCisjdW5kZWYgZm9vCitmb28KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDA5LXVuZGVmLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwOS11bmRlZi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYTcwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAwOS11bmRlZi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNSBAQAorCisxCisKK2ZvbworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMC11bmRlZi1yZS1kZWZpbmUuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEwLXVuZGVmLXJlLWRlZmluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZmY3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMC11bmRlZi1yZS1kZWZpbmUuYwpAQCAtMCwwICsxLDYgQEAKKyNkZWZpbmUgZm9vIDEKK2ZvbworI3VuZGVmIGZvbworZm9vCisjZGVmaW5lIGZvbyAyCitmb28KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEwLXVuZGVmLXJlLWRlZmluZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTAtdW5kZWYtcmUtZGVmaW5lLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmN2VmZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEwLXVuZGVmLXJlLWRlZmluZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNyBAQAorCisxCisKK2ZvbworCisyCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDExLWRlZmluZS1mdW5jLWVtcHR5LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMS1kZWZpbmUtZnVuYy1lbXB0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Y2UxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMS1kZWZpbmUtZnVuYy1lbXB0eS5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBmb28oKQorZm9vKCkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDExLWRlZmluZS1mdW5jLWVtcHR5LmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMS1kZWZpbmUtZnVuYy1lbXB0eS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjUzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMS1kZWZpbmUtZnVuYy1lbXB0eS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisgCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEyLWRlZmluZS1mdW5jLW5vLWFyZ3MuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEyLWRlZmluZS1mdW5jLW5vLWFyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmJiNzMwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTItZGVmaW5lLWZ1bmMtbm8tYXJncy5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBmb28oKSBiYXIKK2ZvbygpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMi1kZWZpbmUtZnVuYy1uby1hcmdzLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxMi1kZWZpbmUtZnVuYy1uby1hcmdzLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1Mzc2NwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEyLWRlZmluZS1mdW5jLW5vLWFyZ3MuYy5leHBlY3RlZApAQCAtMCwwICsxLDMgQEAKKworYmFyCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEzLWRlZmluZS1mdW5jLTEtYXJnLXVudXNlZC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTMtZGVmaW5lLWZ1bmMtMS1hcmctdW51c2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4ZmI4YgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEzLWRlZmluZS1mdW5jLTEtYXJnLXVudXNlZC5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBmb28oeCkgMQorZm9vKGJhcikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEzLWRlZmluZS1mdW5jLTEtYXJnLXVudXNlZC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTMtZGVmaW5lLWZ1bmMtMS1hcmctdW51c2VkLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4ZmQxNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDEzLWRlZmluZS1mdW5jLTEtYXJnLXVudXNlZC5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisxCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE0LWRlZmluZS1mdW5jLTItYXJnLXVudXNlZC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTQtZGVmaW5lLWZ1bmMtMi1hcmctdW51c2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmZWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE0LWRlZmluZS1mdW5jLTItYXJnLXVudXNlZC5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBmb28oeCx5KSAxCitmb28oYmFyLGJheikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE0LWRlZmluZS1mdW5jLTItYXJnLXVudXNlZC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTQtZGVmaW5lLWZ1bmMtMi1hcmctdW51c2VkLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4ZmQxNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE0LWRlZmluZS1mdW5jLTItYXJnLXVudXNlZC5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisxCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE1LWRlZmluZS1vYmplY3Qtd2l0aC1wYXJlbnMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE1LWRlZmluZS1vYmplY3Qtd2l0aC1wYXJlbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NThkYTljCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTUtZGVmaW5lLW9iamVjdC13aXRoLXBhcmVucy5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBmb28gKCkxCitmb28oKQorI2RlZmluZSBiYXIgKCkyCitiYXIoKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTUtZGVmaW5lLW9iamVjdC13aXRoLXBhcmVucy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTUtZGVmaW5lLW9iamVjdC13aXRoLXBhcmVucy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZjhjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNS1kZWZpbmUtb2JqZWN0LXdpdGgtcGFyZW5zLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw1IEBACisKKygpMSgpCisKKygpMigpCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE2LWRlZmluZS1mdW5jLTEtYXJnLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNi1kZWZpbmUtZnVuYy0xLWFyZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTI0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNi1kZWZpbmUtZnVuYy0xLWFyZy5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBmb28oeCkgKCh4KSsxKQorZm9vKGJhcikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE2LWRlZmluZS1mdW5jLTEtYXJnLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNi1kZWZpbmUtZnVuYy0xLWFyZy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTgyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNi1kZWZpbmUtZnVuYy0xLWFyZy5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisoKGJhcikrMSkKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTctZGVmaW5lLWZ1bmMtMi1hcmdzLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNy1kZWZpbmUtZnVuYy0yLWFyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzI1MzgzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTctZGVmaW5lLWZ1bmMtMi1hcmdzLmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGZvbyh4LHkpICgoeCkqKHkpKQorZm9vKGJhcixiYXopCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNy1kZWZpbmUtZnVuYy0yLWFyZ3MuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE3LWRlZmluZS1mdW5jLTItYXJncy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzQxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxNy1kZWZpbmUtZnVuYy0yLWFyZ3MuYy5leHBlY3RlZApAQCAtMCwwICsxLDMgQEAKKworKChiYXIpKihiYXopKQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxOC1kZWZpbmUtZnVuYy1tYWNyby1hcy1wYXJhbWV0ZXIuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE4LWRlZmluZS1mdW5jLW1hY3JvLWFzLXBhcmFtZXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODEzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxOC1kZWZpbmUtZnVuYy1tYWNyby1hcy1wYXJhbWV0ZXIuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgeCAwCisjZGVmaW5lIGZvbyh4KSB4Citmb28oMSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE4LWRlZmluZS1mdW5jLW1hY3JvLWFzLXBhcmFtZXRlci5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTgtZGVmaW5lLWZ1bmMtbWFjcm8tYXMtcGFyYW1ldGVyLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNDg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE4LWRlZmluZS1mdW5jLW1hY3JvLWFzLXBhcmFtZXRlci5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCisKKzEKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMTktZGVmaW5lLWZ1bmMtMS1hcmctbXVsdGkuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE5LWRlZmluZS1mdW5jLTEtYXJnLW11bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlNjJiMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE5LWRlZmluZS1mdW5jLTEtYXJnLW11bHRpLmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGZvbyh4KSAoeCkKK2Zvbyh0aGlzIGlzIG1vcmUgdGhhbiBvbmUgd29yZCkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDE5LWRlZmluZS1mdW5jLTEtYXJnLW11bHRpLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxOS1kZWZpbmUtZnVuYy0xLWFyZy1tdWx0aS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTRmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAxOS1kZWZpbmUtZnVuYy0xLWFyZy1tdWx0aS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisodGhpcyBpcyBtb3JlIHRoYW4gb25lIHdvcmQpCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIwLWRlZmluZS1mdW5jLTItYXJnLW11bHRpLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMC1kZWZpbmUtZnVuYy0yLWFyZy1tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDlhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMC1kZWZpbmUtZnVuYy0yLWFyZy1tdWx0aS5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBmb28oeCx5KSB4LHR3byBmaXNoLHJlZCBmaXNoLHkKK2ZvbyhvbmUgZmlzaCwgYmx1ZSBmaXNoKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjAtZGVmaW5lLWZ1bmMtMi1hcmctbXVsdGkuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIwLWRlZmluZS1mdW5jLTItYXJnLW11bHRpLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0OGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIwLWRlZmluZS1mdW5jLTItYXJnLW11bHRpLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKK29uZSBmaXNoLHR3byBmaXNoLHJlZCBmaXNoLGJsdWUgZmlzaAorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMS1kZWZpbmUtZnVuYy1jb21wb3NlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMS1kZWZpbmUtZnVuYy1jb21wb3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkZGQwZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIxLWRlZmluZS1mdW5jLWNvbXBvc2UuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgYmFyKHgpICgxKyh4KSkKKyNkZWZpbmUgZm9vKHkpICgyKih5KSkKK2ZvbyhiYXIoMykpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMS1kZWZpbmUtZnVuYy1jb21wb3NlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMS1kZWZpbmUtZnVuYy1jb21wb3NlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2MjEwNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIxLWRlZmluZS1mdW5jLWNvbXBvc2UuYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworCisoMiooKDErKDMpKSkpCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIyLWRlZmluZS1mdW5jLWFyZy13aXRoLXBhcmVucy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjItZGVmaW5lLWZ1bmMtYXJnLXdpdGgtcGFyZW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwZDczYQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIyLWRlZmluZS1mdW5jLWFyZy13aXRoLXBhcmVucy5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBmb28oeCkgKHgpCitmb28oYXJndW1lbnQoaW5jbHVkaW5nIHBhcmVucylmb3IgdGhlIHdpbikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIyLWRlZmluZS1mdW5jLWFyZy13aXRoLXBhcmVucy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjItZGVmaW5lLWZ1bmMtYXJnLXdpdGgtcGFyZW5zLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjMTY1OAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIyLWRlZmluZS1mdW5jLWFyZy13aXRoLXBhcmVucy5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCisoYXJndW1lbnQoaW5jbHVkaW5nIHBhcmVucylmb3IgdGhlIHdpbikKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjMtZGVmaW5lLWV4dHJhLXdoaXRlc3BhY2UuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIzLWRlZmluZS1leHRyYS13aGl0ZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViZmVkNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIzLWRlZmluZS1leHRyYS13aGl0ZXNwYWNlLmMKQEAgLTAsMCArMSw4IEBACisjZGVmaW5lIG5vYXJncygpIDEgCisjIGRlZmluZSBvbmVhcmcoZm9vKSBmb28gCisgIyBkZWZpbmUgIHR3b2FyZ3MoIHggLCB5ICkgeCB5IAorCSMJZGVmaW5lCXRocmVlYXJncygJYQksCWIJLAljCSkgYSBiIGMgCitub2FyZ3MgKCApIAorb25lYXJnICggMiApIAordHdvYXJncyAoIDMgLCA0ICkgCit0aHJlZWFyZ3MgKCA1ICwgNiAsIDcgKSAKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDIzLWRlZmluZS1leHRyYS13aGl0ZXNwYWNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMy1kZWZpbmUtZXh0cmEtd2hpdGVzcGFjZS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzgyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyMy1kZWZpbmUtZXh0cmEtd2hpdGVzcGFjZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsOSBAQAorCisKKworCisxCisyCiszIDQKKzUgNiA3CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI0LWRlZmluZS1jaGFpbi10by1zZWxmLXJlY3Vyc2lvbi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjQtZGVmaW5lLWNoYWluLXRvLXNlbGYtcmVjdXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4OGFkYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI0LWRlZmluZS1jaGFpbi10by1zZWxmLXJlY3Vyc2lvbi5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSAgZm9vIGZvbworI2RlZmluZSAgYmFyIGZvbworYmFyCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyNC1kZWZpbmUtY2hhaW4tdG8tc2VsZi1yZWN1cnNpb24uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI0LWRlZmluZS1jaGFpbi10by1zZWxmLXJlY3Vyc2lvbi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTU1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyNC1kZWZpbmUtY2hhaW4tdG8tc2VsZi1yZWN1cnNpb24uYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworCitmb28KKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjUtZnVuYy1tYWNyby1hcy1ub24tbWFjcm8uYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI1LWZ1bmMtbWFjcm8tYXMtbm9uLW1hY3JvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzMzY3MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI1LWZ1bmMtbWFjcm8tYXMtbm9uLW1hY3JvLmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGZvbyhiYXIpIGJhcgorZm9vIGJhcgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjUtZnVuYy1tYWNyby1hcy1ub24tbWFjcm8uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI1LWZ1bmMtbWFjcm8tYXMtbm9uLW1hY3JvLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwZjQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI1LWZ1bmMtbWFjcm8tYXMtbm9uLW1hY3JvLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKK2ZvbyBiYXIKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjYtZGVmaW5lLWZ1bmMtZXh0cmEtbmV3bGluZXMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI2LWRlZmluZS1mdW5jLWV4dHJhLW5ld2xpbmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4Mzc0MAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI2LWRlZmluZS1mdW5jLWV4dHJhLW5ld2xpbmVzLmMKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIGZvbyhhKSBiYXIKKworZm9vCisoCisxCispCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyNi1kZWZpbmUtZnVuYy1leHRyYS1uZXdsaW5lcy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjYtZGVmaW5lLWZ1bmMtZXh0cmEtbmV3bGluZXMuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg4OGYyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjYtZGVmaW5lLWZ1bmMtZXh0cmEtbmV3bGluZXMuYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworCitiYXIKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjctZGVmaW5lLWNoYWluLW9iai10by1mdW5jLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyNy1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2NiNTJjCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjctZGVmaW5lLWNoYWluLW9iai10by1mdW5jLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIGZhaWx1cmUoKSBzdWNjZXNzCisjZGVmaW5lIGZvbyBmYWlsdXJlKCkKK2ZvbwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjctZGVmaW5lLWNoYWluLW9iai10by1mdW5jLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyNy1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY3NjJlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjctZGVmaW5lLWNoYWluLW9iai10by1mdW5jLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACisKKworc3VjY2VzcworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyOC1kZWZpbmUtY2hhaW4tb2JqLXRvLW5vbi1mdW5jLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyOC1kZWZpbmUtY2hhaW4tb2JqLXRvLW5vbi1mdW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5NjJhNwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI4LWRlZmluZS1jaGFpbi1vYmotdG8tbm9uLWZ1bmMuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgc3VjY2VzcygpIGZhaWx1cmUKKyNkZWZpbmUgZm9vIHN1Y2Nlc3MKK2ZvbwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjgtZGVmaW5lLWNoYWluLW9iai10by1ub24tZnVuYy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMjgtZGVmaW5lLWNoYWluLW9iai10by1ub24tZnVuYy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjc2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyOC1kZWZpbmUtY2hhaW4tb2JqLXRvLW5vbi1mdW5jLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACisKKworc3VjY2VzcworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyOS1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtd2l0aC1hcmdzLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyOS1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtd2l0aC1hcmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxZjdkMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI5LWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy13aXRoLWFyZ3MuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgYmFyKGZhaWx1cmUpIGZhaWx1cmUKKyNkZWZpbmUgZm9vIGJhcihzdWNjZXNzKQorZm9vCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyOS1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtd2l0aC1hcmdzLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAyOS1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtd2l0aC1hcmdzLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmNzYyZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDI5LWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy13aXRoLWFyZ3MuYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworCitzdWNjZXNzCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMwLWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1jb21wb3NlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzMC1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtY29tcG9zZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NmZiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzMC1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtY29tcG9zZS5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBiYXooZmFpbHVyZSkgZmFpbHVyZQorI2RlZmluZSBiYXIoZmFpbHVyZSkgZmFpbHVyZQorI2RlZmluZSBmb28gYmFyKGJheihzdWNjZXNzKSkKK2ZvbwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzAtZGVmaW5lLWNoYWluLW9iai10by1mdW5jLWNvbXBvc2UuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMwLWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1jb21wb3NlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5YmRkMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMwLWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1jb21wb3NlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw1IEBACisKKworCitzdWNjZXNzCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMxLWRlZmluZS1jaGFpbi1mdW5jLXRvLWZ1bmMtY29tcG9zZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzEtZGVmaW5lLWNoYWluLWZ1bmMtdG8tZnVuYy1jb21wb3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0Yzg3NAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMxLWRlZmluZS1jaGFpbi1mdW5jLXRvLWZ1bmMtY29tcG9zZS5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBiYXooZmFpbHVyZSkgZmFpbHVyZQorI2RlZmluZSBiYXIoZmFpbHVyZSkgZmFpbHVyZQorI2RlZmluZSBmb28oKSBiYXIoYmF6KHN1Y2Nlc3MpKQorZm9vKCkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMxLWRlZmluZS1jaGFpbi1mdW5jLXRvLWZ1bmMtY29tcG9zZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzEtZGVmaW5lLWNoYWluLWZ1bmMtdG8tZnVuYy1jb21wb3NlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5YmRkMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMxLWRlZmluZS1jaGFpbi1mdW5jLXRvLWZ1bmMtY29tcG9zZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNSBAQAorCisKKworc3VjY2VzcworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzMi1kZWZpbmUtZnVuYy1zZWxmLXJlY3Vyc2UuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDMyLWRlZmluZS1mdW5jLXNlbGYtcmVjdXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWM3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzMi1kZWZpbmUtZnVuYy1zZWxmLXJlY3Vyc2UuYwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgZm9vKGEpIGZvbygyKihhKSkKK2ZvbygzKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzItZGVmaW5lLWZ1bmMtc2VsZi1yZWN1cnNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzMi1kZWZpbmUtZnVuYy1zZWxmLXJlY3Vyc2UuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDFkNDRkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzItZGVmaW5lLWZ1bmMtc2VsZi1yZWN1cnNlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKK2ZvbygyKigzKSkKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzMtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzMy1kZWZpbmUtZnVuYy1zZWxmLWNvbXBvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVlNDgyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzMtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGZvbyhhKSBmb28oMiooYSkpCitmb28oZm9vKDMpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzMtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzMy1kZWZpbmUtZnVuYy1zZWxmLWNvbXBvc2UuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE2OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzMtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKK2ZvbygyKihmb28oMiooMykpKSkKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzQtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLW5vbi1mdW5jLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzNC1kZWZpbmUtZnVuYy1zZWxmLWNvbXBvc2Utbm9uLWZ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDlhNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzQtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLW5vbi1mdW5jLmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGZvbyhiYXIpIGJhcgorZm9vKGZvbykKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM0LWRlZmluZS1mdW5jLXNlbGYtY29tcG9zZS1ub24tZnVuYy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzQtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLW5vbi1mdW5jLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4MjNiMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM0LWRlZmluZS1mdW5jLXNlbGYtY29tcG9zZS1ub24tZnVuYy5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorCitmb28KKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzUtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLW5vbi1mdW5jLW11bHRpLXRva2VuLWFyZ3VtZW50LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzNS1kZWZpbmUtZnVuYy1zZWxmLWNvbXBvc2Utbm9uLWZ1bmMtbXVsdGktdG9rZW4tYXJndW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzA3ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzUtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLW5vbi1mdW5jLW11bHRpLXRva2VuLWFyZ3VtZW50LmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGZvbyhiYXIpIGJhcgorZm9vKDErZm9vKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzUtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLW5vbi1mdW5jLW11bHRpLXRva2VuLWFyZ3VtZW50LmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzNS1kZWZpbmUtZnVuYy1zZWxmLWNvbXBvc2Utbm9uLWZ1bmMtbXVsdGktdG9rZW4tYXJndW1lbnQuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdhOWVhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzUtZGVmaW5lLWZ1bmMtc2VsZi1jb21wb3NlLW5vbi1mdW5jLW11bHRpLXRva2VuLWFyZ3VtZW50LmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKKzErZm9vCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM2LWRlZmluZS1mdW5jLW5vbi1tYWNyby1tdWx0aS10b2tlbi1hcmd1bWVudC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzYtZGVmaW5lLWZ1bmMtbm9uLW1hY3JvLW11bHRpLXRva2VuLWFyZ3VtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxZmYzMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM2LWRlZmluZS1mdW5jLW5vbi1tYWNyby1tdWx0aS10b2tlbi1hcmd1bWVudC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBiYXIgc3VjY2VzcworI2RlZmluZSBmb28oeCkgeAorZm9vKG1vcmUgYmFyKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzYtZGVmaW5lLWZ1bmMtbm9uLW1hY3JvLW11bHRpLXRva2VuLWFyZ3VtZW50LmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzNi1kZWZpbmUtZnVuYy1ub24tbWFjcm8tbXVsdGktdG9rZW4tYXJndW1lbnQuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjYzNjBiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzYtZGVmaW5lLWZ1bmMtbm9uLW1hY3JvLW11bHRpLXRva2VuLWFyZ3VtZW50LmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACisKKworbW9yZSBzdWNjZXNzCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM3LWZpbmFsaXplLXVuZXhwYW5kZWQtbWFjcm8uYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM3LWZpbmFsaXplLXVuZXhwYW5kZWQtbWFjcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2EyZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzctZmluYWxpemUtdW5leHBhbmRlZC1tYWNyby5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBleHBhbmQoeCkgZXhwYW5kKHggb25jZSkKKyNkZWZpbmUgZm9vKHgpIHgKK2ZvbyhleHBhbmQoanVzdCkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzNy1maW5hbGl6ZS11bmV4cGFuZGVkLW1hY3JvLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzNy1maW5hbGl6ZS11bmV4cGFuZGVkLW1hY3JvLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhZGVlOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM3LWZpbmFsaXplLXVuZXhwYW5kZWQtbWFjcm8uYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworCitleHBhbmQoanVzdCBvbmNlKQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzOC1mdW5jLWFyZy13aXRoLWNvbW1hcy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzgtZnVuYy1hcmctd2l0aC1jb21tYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDA3YzdkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzgtZnVuYy1hcmctd2l0aC1jb21tYXMuYwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgZm9vKHgpIHN1Y2Nlc3MKK2Zvbyhhcmd1bWVudCAod2l0aCxlbWJlZGRlZCAsIGNvbW1hcykgLS0gdHJpY2t5KQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzgtZnVuYy1hcmctd2l0aC1jb21tYXMuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM4LWZ1bmMtYXJnLXdpdGgtY29tbWFzLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyOGZiMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM4LWZ1bmMtYXJnLXdpdGgtY29tbWFzLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKK3N1Y2Nlc3MKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wMzktZnVuYy1hcmctb2JqLW1hY3JvLXdpdGgtY29tbWEuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM5LWZ1bmMtYXJnLW9iai1tYWNyby13aXRoLWNvbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3ZmU2MwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM5LWZ1bmMtYXJnLW9iai1tYWNyby13aXRoLWNvbW1hLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIGZvbyhhKSAoYSkKKyNkZWZpbmUgYmFyIHR3byx3b3JkcworZm9vKGJhcikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDM5LWZ1bmMtYXJnLW9iai1tYWNyby13aXRoLWNvbW1hLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzOS1mdW5jLWFyZy1vYmotbWFjcm8td2l0aC1jb21tYS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Mzg2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzAzOS1mdW5jLWFyZy1vYmotbWFjcm8td2l0aC1jb21tYS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCisKKyh0d28sd29yZHMpCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQwLXRva2VuLXBhc3RpbmcuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQwLXRva2VuLXBhc3RpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWFiM2JhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDAtdG9rZW4tcGFzdGluZy5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBwYXN0ZShhLGIpIGEgIyMgYgorcGFzdGUob25lICwgdG9rZW4pCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0MC10b2tlbi1wYXN0aW5nLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0MC10b2tlbi1wYXN0aW5nLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmNjY5OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQwLXRva2VuLXBhc3RpbmcuYy5leHBlY3RlZApAQCAtMCwwICsxLDMgQEAKKworb25ldG9rZW4KKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDEtaWYtMC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDEtaWYtMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWI2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0MS1pZi0wLmMKQEAgLTAsMCArMSw1IEBACitzdWNjZXNzXzEKKyNpZiAwCitmYWlsdXJlCisjZW5kaWYKK3N1Y2Nlc3NfMgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDEtaWYtMC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDEtaWYtMC5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MDAwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0MS1pZi0wLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw2IEBACitzdWNjZXNzXzEKKworCisKK3N1Y2Nlc3NfMgorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0Mi1pZi0xLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0Mi1pZi0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0YTI1YwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQyLWlmLTEuYwpAQCAtMCwwICsxLDUgQEAKK3N1Y2Nlc3NfMQorI2lmIDEKK3N1Y2Nlc3NfMgorI2VuZGlmCitzdWNjZXNzXzMKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQyLWlmLTEuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQyLWlmLTEuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTkxMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDItaWYtMS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorc3VjY2Vzc18xCisKK3N1Y2Nlc3NfMgorCitzdWNjZXNzXzMKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDMtaWYtMC1lbHNlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0My1pZi0wLWVsc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjMzNTFmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDMtaWYtMC1lbHNlLmMKQEAgLTAsMCArMSw3IEBACitzdWNjZXNzXzEKKyNpZiAwCitmYWlsdXJlCisjZWxzZQorc3VjY2Vzc18yCisjZW5kaWYKK3N1Y2Nlc3NfMwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDMtaWYtMC1lbHNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0My1pZi0wLWVsc2UuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTllNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDMtaWYtMC1lbHNlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw4IEBACitzdWNjZXNzXzEKKworCisKK3N1Y2Nlc3NfMgorCitzdWNjZXNzXzMKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDQtaWYtMS1lbHNlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0NC1pZi0xLWVsc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGRmYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDQtaWYtMS1lbHNlLmMKQEAgLTAsMCArMSw3IEBACitzdWNjZXNzXzEKKyNpZiAxCitzdWNjZXNzXzIKKyNlbHNlCitmYWlsdXJlCisjZW5kaWYKK3N1Y2Nlc3NfMwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDQtaWYtMS1lbHNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0NC1pZi0xLWVsc2UuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlmNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDQtaWYtMS1lbHNlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw4IEBACitzdWNjZXNzXzEKKworc3VjY2Vzc18yCisKKworCitzdWNjZXNzXzMKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDUtaWYtMC1lbGlmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0NS1pZi0wLWVsaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBmNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDUtaWYtMC1lbGlmLmMKQEAgLTAsMCArMSwxMSBAQAorc3VjY2Vzc18xCisjaWYgMAorZmFpbHVyZV8xCisjZWxpZiAwCitmYWlsdXJlXzIKKyNlbGlmIDEKK3N1Y2Nlc3NfMworI2VsaWYgMQorZmFpbHVyZV8zCisjZW5kaWYKK3N1Y2Nlc3NfNApkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDUtaWYtMC1lbGlmLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0NS1pZi0wLWVsaWYuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ExMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDUtaWYtMC1lbGlmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwxMiBAQAorc3VjY2Vzc18xCisKKworCisKKworc3VjY2Vzc18zCisKKworCitzdWNjZXNzXzQKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDYtaWYtMS1lbHNpZi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDYtaWYtMS1lbHNpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDUxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0Ni1pZi0xLWVsc2lmLmMKQEAgLTAsMCArMSwxMSBAQAorc3VjY2Vzc18xCisjaWYgMQorc3VjY2Vzc18yCisjZWxpZiAwCitmYWlsdXJlXzEKKyNlbGlmIDEKK2ZhaWx1cmVfMgorI2VsaWYgMAorZmFpbHVyZV8zCisjZW5kaWYKK3N1Y2Nlc3NfMwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDYtaWYtMS1lbHNpZi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDYtaWYtMS1lbHNpZi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MjhiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0Ni1pZi0xLWVsc2lmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwxMiBAQAorc3VjY2Vzc18xCisKK3N1Y2Nlc3NfMgorCisKKworCisKKworCitzdWNjZXNzXzMKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDctaWYtZWxpZi1lbHNlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0Ny1pZi1lbGlmLWVsc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGYwODM4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDctaWYtZWxpZi1lbHNlLmMKQEAgLTAsMCArMSwxMSBAQAorc3VjY2Vzc18xCisjaWYgMAorZmFpbHVyZV8xCisjZWxpZiAwCitmYWlsdXJlXzIKKyNlbGlmIDAKK2ZhaWx1cmVfMworI2Vsc2UKK3N1Y2Nlc3NfMgorI2VuZGlmCitzdWNjZXNzXzMKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ3LWlmLWVsaWYtZWxzZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDctaWYtZWxpZi1lbHNlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViNTNhMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ3LWlmLWVsaWYtZWxzZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMTIgQEAKK3N1Y2Nlc3NfMQorCisKKworCisKKworCitzdWNjZXNzXzIKKworc3VjY2Vzc18zCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ4LWlmLW5lc3RlZC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDgtaWYtbmVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0Njc5YwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ4LWlmLW5lc3RlZC5jCkBAIC0wLDAgKzEsMTEgQEAKK3N1Y2Nlc3NfMQorI2lmIDAKK2ZhaWx1cmVfMQorI2lmIDEKK2ZhaWx1cmVfMgorI2Vsc2UKK2ZhaWx1cmVfMworI2VuZGlmCitmYWlsdXJlXzQKKyNlbmRpZgorc3VjY2Vzc18yCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0OC1pZi1uZXN0ZWQuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ4LWlmLW5lc3RlZC5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWZkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0OC1pZi1uZXN0ZWQuYy5leHBlY3RlZApAQCAtMCwwICsxLDEyIEBACitzdWNjZXNzXzEKKworCisKKworCisKKworCisKK3N1Y2Nlc3NfMgorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0OS1pZi1leHByZXNzaW9uLXByZWNlZGVuY2UuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ5LWlmLWV4cHJlc3Npb24tcHJlY2VkZW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2VhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA0OS1pZi1leHByZXNzaW9uLXByZWNlZGVuY2UuYwpAQCAtMCwwICsxLDUgQEAKKyNpZiAxICsgMiAqIDMgKyAtICgyNSAlIDE3IC0gKyAxKQorZmFpbHVyZSB3aXRoIG9wZXJhdG9yIHByZWNlZGVuY2UKKyNlbHNlCitzdWNjZXNzCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ5LWlmLWV4cHJlc3Npb24tcHJlY2VkZW5jZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNDktaWYtZXhwcmVzc2lvbi1wcmVjZWRlbmNlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5ZGViYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDQ5LWlmLWV4cHJlc3Npb24tcHJlY2VkZW5jZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorCisKKworc3VjY2VzcworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDUwLWlmLWRlZmluZWQuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDUwLWlmLWRlZmluZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGYwZjk1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTAtaWYtZGVmaW5lZC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpZiBkZWZpbmVkIGZvbworZmFpbHVyZV8xCisjZWxzZQorc3VjY2Vzc18xCisjZW5kaWYKKyNkZWZpbmUgZm9vCisjaWYgZGVmaW5lZCBmb28KK3N1Y2Nlc3NfMgorI2Vsc2UKK2ZhaWx1cmVfMgorI2VuZGlmCisjdW5kZWYgZm9vCisjaWYgZGVmaW5lZCBmb28KK2ZhaWx1cmVfMworI2Vsc2UKK3N1Y2Nlc3NfMworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1MC1pZi1kZWZpbmVkLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1MC1pZi1kZWZpbmVkLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwMTk1NQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDUwLWlmLWRlZmluZWQuYy5leHBlY3RlZApAQCAtMCwwICsxLDE4IEBACisKKworCitzdWNjZXNzXzEKKworCisKK3N1Y2Nlc3NfMgorCisKKworCisKKworCitzdWNjZXNzXzMKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1MS1pZi1yZWxhdGlvbmFsLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1MS1pZi1yZWxhdGlvbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkYjQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDUxLWlmLXJlbGF0aW9uYWwuYwpAQCAtMCwwICsxLDM1IEBACisjaWYgMyA8IDIKK2ZhaWx1cmVfMQorI2Vsc2UKK3N1Y2Nlc3NfMQorI2VuZGlmCisKKyNpZiAzID49IDIKK3N1Y2Nlc3NfMgorI2Vsc2UKK2ZhaWx1cmVfMgorI2VuZGlmCisKKyNpZiAyICsgMyA8PSA1CitzdWNjZXNzXzMKKyNlbHNlCitmYWlsdXJlXzMKKyNlbmRpZgorCisjaWYgMyAtIDIgPT0gMQorc3VjY2Vzc18zCisjZWxzZQorZmFpbHVyZV8zCisjZW5kaWYKKworI2lmIDEgPiAzCitmYWlsdXJlXzQKKyNlbHNlCitzdWNjZXNzXzQKKyNlbmRpZgorCisjaWYgMSAhPSA1CitzdWNjZXNzXzUKKyNlbHNlCitmYWlsdXJlXzUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTEtaWYtcmVsYXRpb25hbC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTEtaWYtcmVsYXRpb25hbC5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjc2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1MS1pZi1yZWxhdGlvbmFsLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzNiBAQAorCisKKworc3VjY2Vzc18xCisKKworCitzdWNjZXNzXzIKKworCisKKworCitzdWNjZXNzXzMKKworCisKKworCitzdWNjZXNzXzMKKworCisKKworCisKKworc3VjY2Vzc180CisKKworCitzdWNjZXNzXzUKKworCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTItaWYtYml0d2lzZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTItaWYtYml0d2lzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGU0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Mi1pZi1iaXR3aXNlLmMKQEAgLTAsMCArMSwyMCBAQAorI2lmICgweGFhYWFhYWFhIHwgMHg1NTU1NTU1NSkgIT0gNDI5NDk2NzI5NQorZmFpbHVyZV8xCisjZWxzZQorc3VjY2Vzc18xCisjZW5kaWYKKyNpZiAoMHgxMjM0NTY3OCBeIDB4ZmRlY2JhOTgpID09IDQwMjM5NzEwNDAKK3N1Y2Nlc3NfMgorI2Vsc2UKK2ZhaWx1cmVfMgorI2VuZGlmCisjaWYgKH4gMHhkZWFkYmVlZikgIT0gLTM3MzU5Mjg1NjAKK2ZhaWx1cmVfMworI2Vsc2UKK3N1Y2Nlc3NfMworI2VuZGlmCisjaWYgKDA2NjcgJiAwNzMzKSA9PSA0MDMKK3N1Y2Nlc3NfNAorI2Vsc2UKK2ZhaWx1cmVfNAorI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Mi1pZi1iaXR3aXNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Mi1pZi1iaXR3aXNlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1ZDkyZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDUyLWlmLWJpdHdpc2UuYy5leHBlY3RlZApAQCAtMCwwICsxLDIxIEBACisKKworCitzdWNjZXNzXzEKKworCitzdWNjZXNzXzIKKworCisKKworCisKK3N1Y2Nlc3NfMworCisKK3N1Y2Nlc3NfNAorCisKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1My1pZi1kaXZpZGUtYW5kLXNoaWZ0LmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1My1pZi1kaXZpZGUtYW5kLXNoaWZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0YzU0YQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDUzLWlmLWRpdmlkZS1hbmQtc2hpZnQuYwpAQCAtMCwwICsxLDE1IEBACisjaWYgKDE1IC8gMikgIT0gNworZmFpbHVyZV8xCisjZWxzZQorc3VjY2Vzc18xCisjZW5kaWYKKyNpZiAoMSA8PCAxMikgPT0gNDA5Ngorc3VjY2Vzc18yCisjZWxzZQorZmFpbHVyZV8yCisjZW5kaWYKKyNpZiAoMzE3NjIgPj4gOCkgIT0gMTI0CitmYWlsdXJlXzMKKyNlbHNlCitzdWNjZXNzXzMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTMtaWYtZGl2aWRlLWFuZC1zaGlmdC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTMtaWYtZGl2aWRlLWFuZC1zaGlmdC5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2U5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1My1pZi1kaXZpZGUtYW5kLXNoaWZ0LmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwxNiBAQAorCisKKworc3VjY2Vzc18xCisKKworc3VjY2Vzc18yCisKKworCisKKworCitzdWNjZXNzXzMKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1NC1pZi13aXRoLW1hY3Jvcy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTQtaWYtd2l0aC1tYWNyb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGE3OWEwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTQtaWYtd2l0aC1tYWNyb3MuYwpAQCAtMCwwICsxLDM0IEBACisjZGVmaW5lIG9uZSAxCisjZGVmaW5lIHR3byAyCisjZGVmaW5lIHRocmVlIDMKKyNkZWZpbmUgZml2ZSA1CisjaWYgZml2ZSA8IHR3bworZmFpbHVyZV8xCisjZWxzZQorc3VjY2Vzc18xCisjZW5kaWYKKyNpZiB0aHJlZSA+PSB0d28KK3N1Y2Nlc3NfMgorI2Vsc2UKK2ZhaWx1cmVfMgorI2VuZGlmCisjaWYgdHdvICsgdGhyZWUgPD0gZml2ZQorc3VjY2Vzc18zCisjZWxzZQorZmFpbHVyZV8zCisjZW5kaWYKKyNpZiBmaXZlIC0gdHdvID09IHRocmVlCitzdWNjZXNzXzQKKyNlbHNlCitmYWlsdXJlXzQKKyNlbmRpZgorI2lmIG9uZSA+IHRocmVlCitmYWlsdXJlXzUKKyNlbHNlCitzdWNjZXNzXzUKKyNlbmRpZgorI2lmIG9uZSAhPSBmaXZlCitzdWNjZXNzXzYKKyNlbHNlCitmYWlsdXJlXzYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTQtaWYtd2l0aC1tYWNyb3MuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU0LWlmLXdpdGgtbWFjcm9zLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlYTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU0LWlmLXdpdGgtbWFjcm9zLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzNSBAQAorCisKKworCisKKworCitzdWNjZXNzXzEKKworCitzdWNjZXNzXzIKKworCisKKworc3VjY2Vzc18zCisKKworCisKK3N1Y2Nlc3NfNAorCisKKworCisKKworc3VjY2Vzc181CisKKworc3VjY2Vzc182CisKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU1LWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1wYXJlbnMtaW4tdGV4dC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTUtZGVmaW5lLWNoYWluLW9iai10by1mdW5jLXBhcmVucy1pbi10ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmMmMyMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU1LWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1wYXJlbnMtaW4tdGV4dC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBmYWlsdXJlKCkgc3VjY2VzcworI2RlZmluZSBmb28gZmFpbHVyZQorZm9vKCkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU1LWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1wYXJlbnMtaW4tdGV4dC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTUtZGVmaW5lLWNoYWluLW9iai10by1mdW5jLXBhcmVucy1pbi10ZXh0LmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmNzYyZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU1LWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1wYXJlbnMtaW4tdGV4dC5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCisKK3N1Y2Nlc3MKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTYtbWFjcm8tYXJndW1lbnQtd2l0aC1jb21tYS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTYtbWFjcm8tYXJndW1lbnQtd2l0aC1jb21tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzAxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Ni1tYWNyby1hcmd1bWVudC13aXRoLWNvbW1hLmMKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIGJhciB3aXRoLGVtYmVkZGVkLGNvbW1hcworI2RlZmluZSBmdW5jdGlvbih4KSBzdWNjZXNzCisjZGVmaW5lIGZvbyBmdW5jdGlvbgorZm9vKGJhcikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU2LW1hY3JvLWFyZ3VtZW50LXdpdGgtY29tbWEuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU2LW1hY3JvLWFyZ3VtZW50LXdpdGgtY29tbWEuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjliZGQxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTYtbWFjcm8tYXJndW1lbnQtd2l0aC1jb21tYS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNSBAQAorCisKKworc3VjY2VzcworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Ny1lbXB0eS1hcmd1bWVudHMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU3LWVtcHR5LWFyZ3VtZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDAyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Ny1lbXB0eS1hcmd1bWVudHMuYwpAQCAtMCwwICsxLDYgQEAKKyNkZWZpbmUgemVybygpIHN1Y2Nlc3MKK3plcm8oKQorI2RlZmluZSBvbmUoeCkgc3VjY2Vzcworb25lKCkKKyNkZWZpbmUgdHdvKHgseSkgc3VjY2VzcwordHdvKCwpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Ny1lbXB0eS1hcmd1bWVudHMuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU3LWVtcHR5LWFyZ3VtZW50cy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlM2FhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1Ny1lbXB0eS1hcmd1bWVudHMuYy5leHBlY3RlZApAQCAtMCwwICsxLDcgQEAKKworc3VjY2VzcworCitzdWNjZXNzCisKK3N1Y2Nlc3MKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTgtdG9rZW4tcGFzdGluZy1lbXB0eS1hcmd1bWVudHMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU4LXRva2VuLXBhc3RpbmctZW1wdHktYXJndW1lbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjMjYwYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU4LXRva2VuLXBhc3RpbmctZW1wdHktYXJndW1lbnRzLmMKQEAgLTAsMCArMSw1IEBACisjZGVmaW5lIHBhc3RlKHgseSkgeCAjIyB5CitwYXN0ZShhLGIpCitwYXN0ZShhLCkKK3Bhc3RlKCxiKQorcGFzdGUoLCkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU4LXRva2VuLXBhc3RpbmctZW1wdHktYXJndW1lbnRzLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1OC10b2tlbi1wYXN0aW5nLWVtcHR5LWFyZ3VtZW50cy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzM0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1OC10b2tlbi1wYXN0aW5nLWVtcHR5LWFyZ3VtZW50cy5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorCithYgorYQorYgorCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU5LXRva2VuLXBhc3RpbmctaW50ZWdlci5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNTktdG9rZW4tcGFzdGluZy1pbnRlZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiODk1YQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU5LXRva2VuLXBhc3RpbmctaW50ZWdlci5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBwYXN0ZSh4LHkpIHggIyMgeQorcGFzdGUoMSwyKQorcGFzdGUoMSwwMDApCitwYXN0ZShpZGVudGlmaWVyLDIpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1OS10b2tlbi1wYXN0aW5nLWludGVnZXIuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDU5LXRva2VuLXBhc3RpbmctaW50ZWdlci5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTJjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA1OS10b2tlbi1wYXN0aW5nLWludGVnZXIuYy5leHBlY3RlZApAQCAtMCwwICsxLDUgQEAKKworMTIKKzEwMDAKK2lkZW50aWZpZXIyCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYwLWxlZnQtcGFyZW4taW4tbWFjcm8tcmlnaHQtcGFyZW4taW4tdGV4dC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjAtbGVmdC1wYXJlbi1pbi1tYWNyby1yaWdodC1wYXJlbi1pbi10ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MGVhOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYwLWxlZnQtcGFyZW4taW4tbWFjcm8tcmlnaHQtcGFyZW4taW4tdGV4dC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBkb3VibGUoYSkgYSoyCisjZGVmaW5lIGZvbyBkb3VibGUoCitmb28gNSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYwLWxlZnQtcGFyZW4taW4tbWFjcm8tcmlnaHQtcGFyZW4taW4tdGV4dC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjAtbGVmdC1wYXJlbi1pbi1tYWNyby1yaWdodC1wYXJlbi1pbi10ZXh0LmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmMGQyNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYwLWxlZnQtcGFyZW4taW4tbWFjcm8tcmlnaHQtcGFyZW4taW4tdGV4dC5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCisKKzUqMgorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2MS1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtbXVsdGkuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYxLWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmZkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2MS1kZWZpbmUtY2hhaW4tb2JqLXRvLWZ1bmMtbXVsdGkuYwpAQCAtMCwwICsxLDUgQEAKKyNkZWZpbmUgZm9vKHgpIHN1Y2Nlc3MKKyNkZWZpbmUgYmFyIGZvbworI2RlZmluZSBiYXogYmFyCisjZGVmaW5lIGpvZSBiYXoKK2pvZSAoZmFpbHVyZSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYxLWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1tdWx0aS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjEtZGVmaW5lLWNoYWluLW9iai10by1mdW5jLW11bHRpLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExZjdkMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYxLWRlZmluZS1jaGFpbi1vYmotdG8tZnVuYy1tdWx0aS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorCisKKworCitzdWNjZXNzCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYyLWlmLTAtc2tpcHMtZ2FyYmFnZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjItaWYtMC1za2lwcy1nYXJiYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllNDM5YgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYyLWlmLTAtc2tpcHMtZ2FyYmFnZS5jCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBmb28oYSxiKQorI2lmIDAKK2ZvbyhiYXIpCitmb28oCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYyLWlmLTAtc2tpcHMtZ2FyYmFnZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjItaWYtMC1za2lwcy1nYXJiYWdlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiNjZhNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYyLWlmLTAtc2tpcHMtZ2FyYmFnZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjMtY29tbWVudHMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYzLWNvbW1lbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MWQyZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDYzLWNvbW1lbnRzLmMKQEAgLTAsMCArMSwyMCBAQAorLyogdGhpcyBpcyBhIGNvbW1lbnQgKi8KKy8vIHNvIGlzIHRoaXMKKy8vICovCitmID0gZy8qKi8vaDsKKy8qLy8qL2woKTsKK20gPSBuLy8qKi9vCisrIHA7CisvKiB0aGlzCitjb21tZW50IHNwYW5zCittdWx0aXBsZSBsaW5lcyBhbmQKK2NvbnRhaW5zICoqKiBzdGFycworYW5kIHNsYXNoZXMgLyAqKiogLworYW5kIG90aGVyIHN0dWZmLgorKioqKi8KK21vcmUgY29kZSBoZXJlCisvKiBUZXN0IHRoYXQgLyogbmVzdGVkCisgICBjb21tZW50cyAqLworYXJlIG5vdCB0cmVhdGVkIGxpa2UgY29tbWVudHMuCisvKi8gdGhpcyBpcyBhIGNvbW1lbnQgKi8KKy8qLyovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2My1jb21tZW50cy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjMtY29tbWVudHMuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY1YzliCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjMtY29tbWVudHMuYy5leHBlY3RlZApAQCAtMCwwICsxLDIxIEBACisgCisKKworZiA9IGcgL2g7CisgbCgpOworbSA9IG4KKysgcDsKKyAKKworCisKKworCisKK21vcmUgY29kZSBoZXJlCisgCisKK2FyZSBub3QgdHJlYXRlZCBsaWtlIGNvbW1lbnRzLgorIAorIAorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2NC12ZXJzaW9uLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2NC12ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzMjY0OAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY0LXZlcnNpb24uYwpAQCAtMCwwICsxLDIgQEAKKyN2ZXJzaW9uIDEzMAorI2RlZmluZSBGT08KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY0LXZlcnNpb24uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY0LXZlcnNpb24uYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY3MTExCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjQtdmVyc2lvbi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorI3ZlcnNpb24gMTMwCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjUtaWYtZGVmaW5lZC1wYXJlbnMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY1LWlmLWRlZmluZWQtcGFyZW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhYTBmOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY1LWlmLWRlZmluZWQtcGFyZW5zLmMKQEAgLTAsMCArMSwxNyBAQAorI2lmIGRlZmluZWQoZm9vKQorZmFpbHVyZV8xCisjZWxzZQorc3VjY2Vzc18xCisjZW5kaWYKKyNkZWZpbmUgZm9vCisjaWYgZGVmaW5lZCAoIGZvbyApCitzdWNjZXNzXzIKKyNlbHNlCitmYWlsdXJlXzIKKyNlbmRpZgorI3VuZGVmIGZvbworI2lmIGRlZmluZWQgKGZvbykKK2ZhaWx1cmVfMworI2Vsc2UKK3N1Y2Nlc3NfMworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2NS1pZi1kZWZpbmVkLXBhcmVucy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjUtaWYtZGVmaW5lZC1wYXJlbnMuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjAxOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjUtaWYtZGVmaW5lZC1wYXJlbnMuYy5leHBlY3RlZApAQCAtMCwwICsxLDE4IEBACisKKworCitzdWNjZXNzXzEKKworCisKK3N1Y2Nlc3NfMgorCisKKworCisKKworCitzdWNjZXNzXzMKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2Ni1pZi1ub3NwYWNlLWV4cHJlc3Npb24uYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY2LWlmLW5vc3BhY2UtZXhwcmVzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMGI0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2Ni1pZi1ub3NwYWNlLWV4cHJlc3Npb24uYwpAQCAtMCwwICsxLDMgQEAKKyNpZigxKQorc3VjY2VzcworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2Ni1pZi1ub3NwYWNlLWV4cHJlc3Npb24uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY2LWlmLW5vc3BhY2UtZXhwcmVzc2lvbi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODRhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2Ni1pZi1ub3NwYWNlLWV4cHJlc3Npb24uYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworc3VjY2VzcworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY3LW5lc3RlZC1pZmRlZi1pZm5kZWYuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY3LW5lc3RlZC1pZmRlZi1pZm5kZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZjY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjctbmVzdGVkLWlmZGVmLWlmbmRlZi5jCkBAIC0wLDAgKzEsNDAgQEAKKyNkZWZpbmUgRDEKKyNkZWZpbmUgRDIKKworI2RlZmluZSByZXN1bHQgc3VjY2VzcworCisjaWZkZWYgVTEKKyNpZmRlZiBVMgorI3VuZGVmIHJlc3VsdAorI2RlZmluZSByZXN1bHQgZmFpbHVyZQorI2VuZGlmCisjZW5kaWYKK3Jlc3VsdAorCisjaWZuZGVmIEQxCisjaWZuZGVmIEQyCisjdW5kZWYgcmVzdWx0CisjZGVmaW5lIHJlc3VsdCBmYWlsdXJlCisjZW5kaWYKKyNlbmRpZgorcmVzdWx0CisKKyN1bmRlZiByZXN1bHQKKyNkZWZpbmUgcmVzdWx0IGZhaWx1cmUKKyNpZmRlZiBEMQorI2lmZGVmIEQyCisjdW5kZWYgcmVzdWx0CisjZGVmaW5lIHJlc3VsdCBzdWNjZXNzCisjZW5kaWYKKyNlbmRpZgorcmVzdWx0CisKKyN1bmRlZiByZXN1bHQKKyNkZWZpbmUgcmVzdWx0IGZhaWx1cmUKKyNpZm5kZWYgVTEKKyNpZm5kZWYgVTIKKyN1bmRlZiByZXN1bHQKKyNkZWZpbmUgcmVzdWx0IHN1Y2Nlc3MKKyNlbmRpZgorI2VuZGlmCityZXN1bHQKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY3LW5lc3RlZC1pZmRlZi1pZm5kZWYuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY3LW5lc3RlZC1pZmRlZi1pZm5kZWYuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQwZGFhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjctbmVzdGVkLWlmZGVmLWlmbmRlZi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNDEgQEAKKworCisKKworCisKKworCisKKworCitzdWNjZXNzCisKKworCisKKworCisKK3N1Y2Nlc3MKKworCisKKworCisKKworCisKK3N1Y2Nlc3MKKworCisKKworCisKKworCisKK3N1Y2Nlc3MKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjgtYWNjaWRlbnRhbC1wYXN0aW5nLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2OC1hY2NpZGVudGFsLXBhc3RpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTlhYzUxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjgtYWNjaWRlbnRhbC1wYXN0aW5nLmMKQEAgLTAsMCArMSwxMSBAQAorI2RlZmluZSBlbXB0eQorPGVtcHR5PAorPGVtcHR5PQorPmVtcHR5PgorPmVtcHR5PQorPWVtcHR5PQorIWVtcHR5PQorJmVtcHR5JgorfGVtcHR5fAorK2VtcHR5KworLWVtcHR5LQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjgtYWNjaWRlbnRhbC1wYXN0aW5nLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA2OC1hY2NpZGVudGFsLXBhc3RpbmcuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQxY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjgtYWNjaWRlbnRhbC1wYXN0aW5nLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwxMiBAQAorCis8IDwKKzwgPQorPiA+Cis+ID0KKz0gPQorISA9CismICYKK3wgfAorKyArCistIC0KKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjktcmVwZWF0ZWQtYXJndW1lbnQuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY5LXJlcGVhdGVkLWFyZ3VtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0NmVhZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY5LXJlcGVhdGVkLWFyZ3VtZW50LmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIGRvdWJsZSh4KSB4IHgKK2RvdWJsZSgxKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNjktcmVwZWF0ZWQtYXJndW1lbnQuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY5LXJlcGVhdGVkLWFyZ3VtZW50LmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1YzRkNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDY5LXJlcGVhdGVkLWFyZ3VtZW50LmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKKzEgMQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3MC11bmRlZmluZWQtbWFjcm8taW4tZXhwcmVzc2lvbi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzAtdW5kZWZpbmVkLW1hY3JvLWluLWV4cHJlc3Npb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTVhNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzAtdW5kZWZpbmVkLW1hY3JvLWluLWV4cHJlc3Npb24uYwpAQCAtMCwwICsxLDUgQEAKKyNpZiBVTkRFRklORURfTUFDUk8KK0ZhaWx1cmUKKyNlbHNlCitTdWNjZXNzCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDcwLXVuZGVmaW5lZC1tYWNyby1pbi1leHByZXNzaW9uLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3MC11bmRlZmluZWQtbWFjcm8taW4tZXhwcmVzc2lvbi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTg0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3MC11bmRlZmluZWQtbWFjcm8taW4tZXhwcmVzc2lvbi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorCisKKworU3VjY2VzcworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDcxLXB1bmN0dWF0b3IuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDcxLXB1bmN0dWF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTlkNjgyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzEtcHVuY3R1YXRvci5jCkBAIC0wLDAgKzEgQEAKK2EgPSBiCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3MS1wdW5jdHVhdG9yLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3MS1wdW5jdHVhdG9yLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMjUzYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDcxLXB1bmN0dWF0b3IuYy5leHBlY3RlZApAQCAtMCwwICsxLDIgQEAKK2EgPSBiCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDcyLXRva2VuLXBhc3Rpbmctc2FtZS1saW5lLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3Mi10b2tlbi1wYXN0aW5nLXNhbWUtbGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjFlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3Mi10b2tlbi1wYXN0aW5nLXNhbWUtbGluZS5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBwYXN0ZSh4KSBzdWNjZXNzXyAjIyB4CitwYXN0ZSgxKSBwYXN0ZSgyKSBwYXN0ZSgzKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzItdG9rZW4tcGFzdGluZy1zYW1lLWxpbmUuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDcyLXRva2VuLXBhc3Rpbmctc2FtZS1saW5lLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4MGI0MwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDcyLXRva2VuLXBhc3Rpbmctc2FtZS1saW5lLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisKK3N1Y2Nlc3NfMSBzdWNjZXNzXzIgc3VjY2Vzc18zCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDczLWlmLWluLWlmZGVmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3My1pZi1pbi1pZmRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTQ4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3My1pZi1pbi1pZmRlZi5jCkBAIC0wLDAgKzEsNCBAQAorI2lmZGVmIFVOREVGCisjaWYgVU5ERUYgPiAxCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzMtaWYtaW4taWZkZWYuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDczLWlmLWluLWlmZGVmLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyZmYyZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDczLWlmLWluLWlmZGVmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw1IEBACisKKworCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzQtZWxpZi11bmRlZi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzQtZWxpZi11bmRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWFjODkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3NC1lbGlmLXVuZGVmLmMKQEAgLTAsMCArMSwzIEBACisjaWZuZGVmIFVOREVGCisjZWxpZiBVTkRFRiA8IDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzQtZWxpZi11bmRlZi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzQtZWxpZi11bmRlZi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDA5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3NC1lbGlmLXVuZGVmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACisKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc1LWVsaWYtZWxpZi11bmRlZi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzUtZWxpZi1lbGlmLXVuZGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YmM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc1LWVsaWYtZWxpZi11bmRlZi5jCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBVTkRFRgorI2VsaWYgVU5ERUYgPCAwCisjZWxpZiBVTkRFRiA9PSAzCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc1LWVsaWYtZWxpZi11bmRlZi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzUtZWxpZi1lbGlmLXVuZGVmLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyZmYyZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc1LWVsaWYtZWxpZi11bmRlZi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNSBAQAorCisKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc2LWVsaWYtdW5kZWYtbmVzdGVkLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3Ni1lbGlmLXVuZGVmLW5lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDU1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3Ni1lbGlmLXVuZGVmLW5lc3RlZC5jCkBAIC0wLDAgKzEsNSBAQAorI2lmZGVmIFVOREVGCisjaWYgVU5ERUYgPT0gNAorI2VsaWYgVU5ERUYgPT0gNQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc2LWVsaWYtdW5kZWYtbmVzdGVkLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3Ni1lbGlmLXVuZGVmLW5lc3RlZC5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjY2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3Ni1lbGlmLXVuZGVmLW5lc3RlZC5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzctZWxzZS13aXRob3V0LWlmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3Ny1lbHNlLXdpdGhvdXQtaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYwMGJmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzctZWxzZS13aXRob3V0LWlmLmMKQEAgLTAsMCArMSBAQAorI2Vsc2UKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc3LWVsc2Utd2l0aG91dC1pZi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzctZWxzZS13aXRob3V0LWlmLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4OWIzNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc3LWVsc2Utd2l0aG91dC1pZi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorMDoxKDIpOiBwcmVwcm9jZXNzb3IgZXJyb3I6IGVsc2Ugd2l0aG91dCAjaWYKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc4LWVsaWYtd2l0aG91dC1pZi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzgtZWxpZi13aXRob3V0LWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0NjZiMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc4LWVsaWYtd2l0aG91dC1pZi5jCkBAIC0wLDAgKzEgQEAKKyNlbGlmIGRlZmluZWQgRk9PCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3OC1lbGlmLXdpdGhvdXQtaWYuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc4LWVsaWYtd2l0aG91dC1pZi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDFmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3OC1lbGlmLXdpdGhvdXQtaWYuYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKzA6MSgyKTogcHJlcHJvY2Vzc29yIGVycm9yOiBlbGlmIHdpdGhvdXQgI2lmCisKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3OS1lbmRpZi13aXRob3V0LWlmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA3OS1lbmRpZi13aXRob3V0LWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzMzFjMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc5LWVuZGlmLXdpdGhvdXQtaWYuYwpAQCAtMCwwICsxIEBACisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc5LWVuZGlmLXdpdGhvdXQtaWYuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDc5LWVuZGlmLXdpdGhvdXQtaWYuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRkMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wNzktZW5kaWYtd2l0aG91dC1pZi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorMDoxKDIpOiBwcmVwcm9jZXNzb3IgZXJyb3I6ICNlbmRpZiB3aXRob3V0ICNpZgorCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODAtaWYtd2l0aG91dC1leHByZXNzaW9uLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4MC1pZi13aXRob3V0LWV4cHJlc3Npb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjdiYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODAtaWYtd2l0aG91dC1leHByZXNzaW9uLmMKQEAgLTAsMCArMSw0IEBACisvKiBFcnJvciBtZXNzYWdlIGZvciB1bnNraXBwZWQgI2lmIHdpdGggbm8gZXhwcmVzc2lvbi4gKi8KKyNpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgwLWlmLXdpdGhvdXQtZXhwcmVzc2lvbi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODAtaWYtd2l0aG91dC1leHByZXNzaW9uLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4YmEwZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgwLWlmLXdpdGhvdXQtZXhwcmVzc2lvbi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorMDoyKDEpOiBwcmVwcm9jZXNzb3IgZXJyb3I6ICNpZiB3aXRoIG5vIGV4cHJlc3Npb24KKyAKKworCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODEtZWxpZi13aXRob3V0LWV4cHJlc3Npb24uYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgxLWVsaWYtd2l0aG91dC1leHByZXNzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljNzg2NgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgxLWVsaWYtd2l0aG91dC1leHByZXNzaW9uLmMKQEAgLTAsMCArMSwzIEBACisjaWYgMAorI2VsaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODEtZWxpZi13aXRob3V0LWV4cHJlc3Npb24uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgxLWVsaWYtd2l0aG91dC1leHByZXNzaW9uLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0ZjBmNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgxLWVsaWYtd2l0aG91dC1leHByZXNzaW9uLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw1IEBACiswOjIoMSk6IHByZXByb2Nlc3NvciBlcnJvcjogI2VsaWYgd2l0aCBubyBleHByZXNzaW9uCisKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgyLWludmFsaWQtcGFzdGUuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgyLWludmFsaWQtcGFzdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjg0ZDUwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODItaW52YWxpZC1wYXN0ZS5jCkBAIC0wLDAgKzEsNyBAQAorI2RlZmluZSBQQVNURSh4LHkpIHggIyMgeQorUEFTVEUoPCw+KQorUEFTVEUoMCxhYmMpCitQQVNURSgxLD0pCitQQVNURSgyLEApCitQQVNURSgzLC00KQorUEFTVEUoNCwrNS4yKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODItaW52YWxpZC1wYXN0ZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODItaW52YWxpZC1wYXN0ZS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDIxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4Mi1pbnZhbGlkLXBhc3RlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwyMCBAQAorMDoyKDcpOiBwcmVwcm9jZXNzb3IgZXJyb3I6IAorUGFzdGluZyAiPCIgYW5kICI+IiBkb2VzIG5vdCBnaXZlIGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbi4KKzA6Myg3KTogcHJlcHJvY2Vzc29yIGVycm9yOiAKK1Bhc3RpbmcgIjAiIGFuZCAiYWJjIiBkb2VzIG5vdCBnaXZlIGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbi4KKzA6NCg3KTogcHJlcHJvY2Vzc29yIGVycm9yOiAKK1Bhc3RpbmcgIjEiIGFuZCAiPSIgZG9lcyBub3QgZ2l2ZSBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4uCiswOjUoNyk6IHByZXByb2Nlc3NvciBlcnJvcjogCitQYXN0aW5nICIyIiBhbmQgIkAiIGRvZXMgbm90IGdpdmUgYSB2YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuLgorMDo2KDcpOiBwcmVwcm9jZXNzb3IgZXJyb3I6IAorUGFzdGluZyAiMyIgYW5kICItIiBkb2VzIG5vdCBnaXZlIGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbi4KKzA6Nyg3KTogcHJlcHJvY2Vzc29yIGVycm9yOiAKK1Bhc3RpbmcgIjQiIGFuZCAiKyIgZG9lcyBub3QgZ2l2ZSBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4uCisKKzwKKzAKKzEKKzIKKzM0Cis0NS4yCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgzLXVudGVybWluYXRlZC1pZi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODMtdW50ZXJtaW5hdGVkLWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MDYzNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDgzLXVudGVybWluYXRlZC1pZi5jCkBAIC0wLDAgKzEsMiBAQAorI2lmIDEKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODMtdW50ZXJtaW5hdGVkLWlmLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4My11bnRlcm1pbmF0ZWQtaWYuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjlmOGJhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODMtdW50ZXJtaW5hdGVkLWlmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw1IEBACiswOjEoNyk6IHByZXByb2Nlc3NvciBlcnJvcjogVW50ZXJtaW5hdGVkICNpZgorCisKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NC11bmJhbGFuY2VkLXBhcmVudGhlc2VzLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NC11bmJhbGFuY2VkLXBhcmVudGhlc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4OWJhNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg0LXVuYmFsYW5jZWQtcGFyZW50aGVzZXMuYwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgRlVOQyh4KSAoMiooeCkpCitGVU5DKDIzCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NC11bmJhbGFuY2VkLXBhcmVudGhlc2VzLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NC11bmJhbGFuY2VkLXBhcmVudGhlc2VzLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0OWEzNwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg0LXVuYmFsYW5jZWQtcGFyZW50aGVzZXMuYy5leHBlY3RlZApAQCAtMCwwICsxLDIgQEAKKzA6Mig4KTogcHJlcHJvY2Vzc29yIGVycm9yOiBzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJGVuZAorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NS1pbmNvcnJlY3QtYXJndW1lbnQtY291bnQuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg1LWluY29ycmVjdC1hcmd1bWVudC1jb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmVhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NS1pbmNvcnJlY3QtYXJndW1lbnQtY291bnQuYwpAQCAtMCwwICsxLDUgQEAKKyNkZWZpbmUgTVVMVCh4LHkpICgoeCkqKHkpKQorTVVMVCgpCitNVUxUKDEpCitNVUxUKDEsMiwzKQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NS1pbmNvcnJlY3QtYXJndW1lbnQtY291bnQuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg1LWluY29ycmVjdC1hcmd1bWVudC1jb3VudC5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjMwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4NS1pbmNvcnJlY3QtYXJndW1lbnQtY291bnQuYy5leHBlY3RlZApAQCAtMCwwICsxLDEyIEBACiswOjIoMSk6IHByZXByb2Nlc3NvciBlcnJvcjogRXJyb3I6IG1hY3JvIE1VTFQgaW52b2tlZCB3aXRoIDEgYXJndW1lbnRzIChleHBlY3RlZCAyKQorCiswOjMoMSk6IHByZXByb2Nlc3NvciBlcnJvcjogRXJyb3I6IG1hY3JvIE1VTFQgaW52b2tlZCB3aXRoIDEgYXJndW1lbnRzIChleHBlY3RlZCAyKQorCiswOjQoMSk6IHByZXByb2Nlc3NvciBlcnJvcjogRXJyb3I6IG1hY3JvIE1VTFQgaW52b2tlZCB3aXRoIDMgYXJndW1lbnRzIChleHBlY3RlZCAyKQorCisKK01VTFQoKQorTVVMVCgxKQorTVVMVCgxLDIsMykKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4Ni1yZXNlcnZlZC1tYWNyby1uYW1lcy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODYtcmVzZXJ2ZWQtbWFjcm8tbmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI3MjAxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODYtcmVzZXJ2ZWQtbWFjcm8tbmFtZXMuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgX19CQUQgcmVzZXJ2ZWQKKyNkZWZpbmUgR0xfQUxTT19CQUQoKSBhbHNvIHJlc2VydmVkCisjZGVmaW5lIFRISVNfX1RPT19fSVNfX0JBRCByZXNlcnZlZApkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODYtcmVzZXJ2ZWQtbWFjcm8tbmFtZXMuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg2LXJlc2VydmVkLW1hY3JvLW5hbWVzLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhNDJhOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg2LXJlc2VydmVkLW1hY3JvLW5hbWVzLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwxMCBAQAorMDoxKDEwKTogcHJlcHJvY2Vzc29yIHdhcm5pbmc6IE1hY3JvIG5hbWVzIGNvbnRhaW5pbmcgIl9fIiBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgaW1wbGVtZW50YXRpb24uCisKKzA6Mig5KTogcHJlcHJvY2Vzc29yIGVycm9yOiBNYWNybyBuYW1lcyBzdGFydGluZyB3aXRoICJHTF8iIGFyZSByZXNlcnZlZC4KKworMDozKDkpOiBwcmVwcm9jZXNzb3Igd2FybmluZzogTWFjcm8gbmFtZXMgY29udGFpbmluZyAiX18iIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KKworCisKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4Ny1pZi1jb21tZW50cy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODctaWYtY29tbWVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThkYzQzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODctaWYtY29tbWVudHMuYwpAQCAtMCwwICsxLDUgQEAKKyNpZiAoMSA9PSAwKSAvLyBkYW5nZXJvdXMgY29tbWVudAorZmFpbAorI2Vsc2UKK3dpbgorI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4Ny1pZi1jb21tZW50cy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODctaWYtY29tbWVudHMuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdlNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODctaWYtY29tbWVudHMuYy5leHBlY3RlZApAQCAtMCwwICsxLDYgQEAKKworCisKK3dpbgorCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg4LXJlZGVmaW5lLW1hY3JvLWxlZ2l0aW1hdGUuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg4LXJlZGVmaW5lLW1hY3JvLWxlZ2l0aW1hdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA2NjZiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODgtcmVkZWZpbmUtbWFjcm8tbGVnaXRpbWF0ZS5jCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBhYmMgMTIzCisjZGVmaW5lIGFiYyAxMjMKKworI2RlZmluZSBmb28oeCkgKHgpKzIzCisjZGVmaW5lIGZvbyh4KSAoIHggKSArIDIzCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4OC1yZWRlZmluZS1tYWNyby1sZWdpdGltYXRlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4OC1yZWRlZmluZS1tYWNyby1sZWdpdGltYXRlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiNjZhNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg4LXJlZGVmaW5lLW1hY3JvLWxlZ2l0aW1hdGUuYy5leHBlY3RlZApAQCAtMCwwICsxLDYgQEAKKworCisKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDg5LXJlZGVmaW5lLW1hY3JvLWVycm9yLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4OS1yZWRlZmluZS1tYWNyby1lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDEzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4OS1yZWRlZmluZS1tYWNyby1lcnJvci5jCkBAIC0wLDAgKzEsMTcgQEAKKyNkZWZpbmUgeCB5CisjZGVmaW5lIHggegorCisjZGVmaW5lIGFiYyAxMjMKKyNkZWZpbmUgYWJjKCkgMTIzCisKKyNkZWZpbmUgZm9vKCkgYmFyCisjZGVmaW5lIGZvbyh4KSBiYXIKKworI2RlZmluZSBiYXIoKSBiYXoKKyNkZWZpbmUgYmFyIGJhegorCisjZGVmaW5lIGJpZmYoYSxiKSBhK2IKKyNkZWZpbmUgYmlmZihhLGIsYykgYStiCisKKyNkZWZpbmUgb3BlcihhLGIpIGErYgorI2RlZmluZSBvcGVyKGEsYikgYSpiCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA4OS1yZWRlZmluZS1tYWNyby1lcnJvci5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODktcmVkZWZpbmUtbWFjcm8tZXJyb3IuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA5ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wODktcmVkZWZpbmUtbWFjcm8tZXJyb3IuYy5leHBlY3RlZApAQCAtMCwwICsxLDMwIEBACiswOjIoOSk6IHByZXByb2Nlc3NvciBlcnJvcjogUmVkZWZpbml0aW9uIG9mIG1hY3JvIHgKKworMDo1KDkpOiBwcmVwcm9jZXNzb3IgZXJyb3I6IFJlZGVmaW5pdGlvbiBvZiBtYWNybyBhYmMKKworMDo4KDkpOiBwcmVwcm9jZXNzb3IgZXJyb3I6IFJlZGVmaW5pdGlvbiBvZiBtYWNybyBmb28KKworMDoxMSg5KTogcHJlcHJvY2Vzc29yIGVycm9yOiBSZWRlZmluaXRpb24gb2YgbWFjcm8gYmFyCisKKzA6MTQoOSk6IHByZXByb2Nlc3NvciBlcnJvcjogUmVkZWZpbml0aW9uIG9mIG1hY3JvIGJpZmYKKworMDoxNyg5KTogcHJlcHJvY2Vzc29yIGVycm9yOiBSZWRlZmluaXRpb24gb2YgbWFjcm8gb3BlcgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5MC1oYXNoLWVycm9yLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5MC1oYXNoLWVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5YmI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkwLWhhc2gtZXJyb3IuYwpAQCAtMCwwICsxIEBACisjZXJyb3IgaHVtYW4gZXJyb3IKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkwLWhhc2gtZXJyb3IuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkwLWhhc2gtZXJyb3IuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmYxZmJlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTAtaGFzaC1lcnJvci5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMyBAQAorMDoxKDIpOiBwcmVwcm9jZXNzb3IgZXJyb3I6ICNlcnJvciBodW1hbiBlcnJvcgorCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkxLWhhc2gtbGluZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTEtaGFzaC1saW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkNzAzOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkxLWhhc2gtbGluZS5jCkBAIC0wLDAgKzEsMTQgQEAKKyNsaW5lIDAKKyNlcnJvciBsaW5lIDAgZXJyb3IKKyNsaW5lIDI1CisjZXJyb3IgbGluZSAyNSBlcnJvcgorI2xpbmUgMCAxCisjZXJyb3Igc291cmNlIDEsIGxpbmUgMCBlcnJvcgorI2xpbmUgMzAgMgorI2Vycm9yIHNvdXJjZSAyLCBsaW5lIDMwIGVycm9yCisjbGluZSA0NSAyIC8qIEEgbGluZSB3aXRoIGEgY29tbWVudCAqLworI2RlZmluZSBOSU5FVFkgOTAKKyNkZWZpbmUgVFdPIDIKKyNsaW5lIE5JTkVUWSBUV08gLyogQSAjbGluZSBsaW5lIHdpdGggbWFjcm8gZXhwYW5zaW9uICovCisjZGVmaW5lIEZVTkNUSU9OX0xJS0VfTUFDUk8oc291cmNlLCBsaW5lKSBzb3VyY2UgbGluZQorI2xpbmUgRlVOQ1RJT05fTElLRV9NQUNSTygxODAsMikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkxLWhhc2gtbGluZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTEtaGFzaC1saW5lLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhZjBiMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkxLWhhc2gtbGluZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMTkgQEAKKzA6MCgxKTogcHJlcHJvY2Vzc29yIGVycm9yOiAjZXJyb3IgbGluZSAwIGVycm9yCiswOjI1KDEpOiBwcmVwcm9jZXNzb3IgZXJyb3I6ICNlcnJvciBsaW5lIDI1IGVycm9yCisxOjAoMSk6IHByZXByb2Nlc3NvciBlcnJvcjogI2Vycm9yIHNvdXJjZSAxLCBsaW5lIDAgZXJyb3IKKzI6MzAoMSk6IHByZXByb2Nlc3NvciBlcnJvcjogI2Vycm9yIHNvdXJjZSAyLCBsaW5lIDMwIGVycm9yCisjbGluZSAwCisKKyNsaW5lIDI1CisKKyNsaW5lIDAgMQorCisjbGluZSAzMCAyCisKKyNsaW5lIDQ1IDIKKworCisjbGluZSA5MCAyCisKKyNsaW5lIDE4MCAyCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkyLXJlZGVmaW5lLW1hY3JvLWVycm9yLTIuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkyLXJlZGVmaW5lLW1hY3JvLWVycm9yLTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE2MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTItcmVkZWZpbmUtbWFjcm8tZXJyb3ItMi5jCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBBCisjZGVmaW5lIEEgMQorCisjZGVmaW5lIEIgMQorI2RlZmluZSBCCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Mi1yZWRlZmluZS1tYWNyby1lcnJvci0yLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Mi1yZWRlZmluZS1tYWNyby1lcnJvci0yLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyNmY5MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkyLXJlZGVmaW5lLW1hY3JvLWVycm9yLTIuYy5leHBlY3RlZApAQCAtMCwwICsxLDEwIEBACiswOjIoOSk6IHByZXByb2Nlc3NvciBlcnJvcjogUmVkZWZpbml0aW9uIG9mIG1hY3JvIEEKKworMDo1KDkpOiBwcmVwcm9jZXNzb3IgZXJyb3I6IFJlZGVmaW5pdGlvbiBvZiBtYWNybyBCCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkzLWRpdmlkZS1ieS16ZXJvLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5My1kaXZpZGUtYnktemVyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjVkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5My1kaXZpZGUtYnktemVyby5jCkBAIC0wLDAgKzEsMiBAQAorI2lmICgxIC8gMCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTMtZGl2aWRlLWJ5LXplcm8uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkzLWRpdmlkZS1ieS16ZXJvLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmMTgzZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDkzLWRpdmlkZS1ieS16ZXJvLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACiswOjEoMTMpOiBwcmVwcm9jZXNzb3IgZXJyb3I6IGRpdmlzaW9uIGJ5IDAgaW4gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZQorCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTQtZGl2aWRlLWJ5LXplcm8tc2hvcnQtY2lyY3VpdC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTQtZGl2aWRlLWJ5LXplcm8tc2hvcnQtY2lyY3VpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDk3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5NC1kaXZpZGUtYnktemVyby1zaG9ydC1jaXJjdWl0LmMKQEAgLTAsMCArMSwxMyBAQAorLyogZ2xjcHAgaXMgZ2VuZXJhdGluZyBhIGRpdmlzaW9uLWJ5LXplcm8gZXJyb3IgZm9yIHRoaXMgY2FzZS4gIEl0J3MKKyAqIGVhc3kgdG8gYXJndWUgdGhhdCBpdCBzaG91bGQgYmUgc2hvcnQtY2lyY3VpdGluZyB0aGUgZXZhbHVhdGlvbiBhbmQKKyAqIG5vdCBnZW5lcmF0aW5nIHRoZSBkaWFnbm9zdGljICh3aGljaCBoYXBwZW5zIHRvIGJlIHdoYXQgZ2NjIGRvZXMpLgorICogQnV0IGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHdlIHNob3VsZCBmb3JjZSB0aGlzIGJlaGF2aW9yIG9uIG91cgorICogcHJlLXByb2Nlc3NvciwgKGFuZCwgYXMgYWx3YXlzLCB0aGUgR0xTTCBzcGVjaWZpY2F0aW9uIG9mIHRoZQorICogcHJlLXByb2Nlc3NvciBpcyB0b28gdmFndWUgb24gdGhpcyBwb2ludCkuCisgKgorICogSWYgYSBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gb3B0aW1pemF0aW9uIGRvZXMgZ2V0IGFkZGVkIHRvIHRoZQorICogcHJlLXByb2Nlc3NvciB0aGVuIGl0IHdvdWxkIGxlZ2l0aW1hdGUgdG8gdXBkYXRlIHRoZSBleHBlY3RlZCBmaWxlCisgKiBmb3IgdGhpcyB0ZXN0LgorKi8KKyNpZiAxIHx8ICgxIC8gMCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTQtZGl2aWRlLWJ5LXplcm8tc2hvcnQtY2lyY3VpdC5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTQtZGl2aWRlLWJ5LXplcm8tc2hvcnQtY2lyY3VpdC5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjBiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5NC1kaXZpZGUtYnktemVyby1zaG9ydC1jaXJjdWl0LmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwxNSBAQAorMDoxMigxNyk6IHByZXByb2Nlc3NvciBlcnJvcjogZGl2aXNpb24gYnkgMCBpbiBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlCisgCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk1LXJlY3Vyc2l2ZS1kZWZpbmUuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk1LXJlY3Vyc2l2ZS1kZWZpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFkOTBjCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTUtcmVjdXJzaXZlLWRlZmluZS5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBBKGEsIGIpIEIoYSwgYikKKyNkZWZpbmUgQyBBKDAsIEMpCitDCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5NS1yZWN1cnNpdmUtZGVmaW5lLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5NS1yZWN1cnNpdmUtZGVmaW5lLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhYTE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk1LXJlY3Vyc2l2ZS1kZWZpbmUuYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworCitCKDAsIEMpCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk2LXBhc3RlLXR3aWNlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Ni1wYXN0ZS10d2ljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTc1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Ni1wYXN0ZS10d2ljZS5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBwYXN0ZV90d2ljZShhLGIsYykgYSAjIyBiICMjIGMKK3Bhc3RlX3R3aWNlKGp1c3QsIG9uZSwgdG9rZW4pCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk2LXBhc3RlLXR3aWNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Ni1wYXN0ZS10d2ljZS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDE5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Ni1wYXN0ZS10d2ljZS5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsNCBAQAorCitqdXN0b25ldG9rZW4KKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Ny1wYXN0ZS13aXRoLW5vbi1mdW5jdGlvbi1tYWNyby5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTctcGFzdGUtd2l0aC1ub24tZnVuY3Rpb24tbWFjcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ2ODM1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTctcGFzdGUtd2l0aC1ub24tZnVuY3Rpb24tbWFjcm8uYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgUEFTVEVfTUFDUk8gb25lICMjIHRva2VuCitQQVNURV9NQUNSTworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5Ny1wYXN0ZS13aXRoLW5vbi1mdW5jdGlvbi1tYWNyby5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTctcGFzdGUtd2l0aC1ub24tZnVuY3Rpb24tbWFjcm8uYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjkyMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTctcGFzdGUtd2l0aC1ub24tZnVuY3Rpb24tbWFjcm8uYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKworb25ldG9rZW4KKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5OC1lbGlmLXVuZGVmaW5lZC5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTgtZWxpZi11bmRlZmluZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjUyMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTgtZWxpZi11bmRlZmluZWQuYwpAQCAtMCwwICsxLDcgQEAKKyNpZiAwCitOb3QgdGhpcworI2VsaWYgVU5ERUZJTkVEX01BQ1JPCitOb3IgdGhpcworI2Vsc2UKK1llcywgdGhpcy4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTgtZWxpZi11bmRlZmluZWQuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk4LWVsaWYtdW5kZWZpbmVkLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmMGExMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk4LWVsaWYtdW5kZWZpbmVkLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw4IEBACisKKworCisKKworWWVzLCB0aGlzLgorCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMDk5LWM5OS1leGFtcGxlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5OS1jOTktZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTc2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5OS1jOTktZXhhbXBsZS5jCkBAIC0wLDAgKzEsMTcgQEAKKyNkZWZpbmUgIHggICAgICAzCisjZGVmaW5lICBmKGEpICAgZih4ICogKGEpKQorI3VuZGVmICAgeAorI2RlZmluZSAgeCAgICAgIDIKKyNkZWZpbmUgIGcgICAgICBmCisjZGVmaW5lICB6ICAgICAgelswXQorI2RlZmluZSAgaCAgICAgIGcofgorI2RlZmluZSAgbShhKSAgIGEodykKKyNkZWZpbmUgIHcgICAgICAwLDEKKyNkZWZpbmUgIHQoYSkgICBhCisjZGVmaW5lICBwKCkgICAgaW50CisjZGVmaW5lICBxKHgpICAgeAorI2RlZmluZSAgcih4LHkpIHggIyMgeQorZih5KzEpICsgZihmKHopKSAlIHQodChnKSgwKSArIHQpKDEpOworZyh4ICsoMyw0KS13KSB8IGggNSkgJiBtCisgICAgICAgKGYpXm0obSk7CitwKCkgaVtxKCldID0geyBxKDEpLCByKDIsMyksIHIoNCwpLCByKCw1KSwgcigsKX07CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzA5OS1jOTktZXhhbXBsZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTktYzk5LWV4YW1wbGUuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJlNzUwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8wOTktYzk5LWV4YW1wbGUuYy5leHBlY3RlZApAQCAtMCwwICsxLDE3IEBACisKKworCisKKworCisKKworCisKKworCisKK2YoMiAqICh5KzEpKSArIGYoMiAqIChmKDIgKiAoelswXSkpKSkgJSBmKDIgKiAoMCkpICsgdCgxKTsKK2YoMiAqICgyICsoMyw0KS0wLDEpKSB8IGYoMiAqICh+IDUpKSAmIGYoMiAqICgwLDEpKV5tKDAsMSk7CitpbnQgaVtdID0geyAxLCAyMywgNCwgNSwgfTsKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDAtbWFjcm8td2l0aC1jb2xvbi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDAtbWFjcm8td2l0aC1jb2xvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGJiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMC1tYWNyby13aXRoLWNvbG9uLmMKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIG9uZSAxCisjZGVmaW5lIHR3byAyCisKK3N3aXRjaCAoMSkgeworICAgY2FzZSBvbmUgKyB0d286CisgICAgICBicmVhazsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTAwLW1hY3JvLXdpdGgtY29sb24uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTAwLW1hY3JvLXdpdGgtY29sb24uYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY5OGFhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDAtbWFjcm8td2l0aC1jb2xvbi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsOCBAQAorCisKKworc3dpdGNoICgxKSB7CisgICBjYXNlIDEgKyAyOgorICAgICAgYnJlYWs7Cit9CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTAxLW1hY3Jvcy11c2VkLXR3aWNlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMS1tYWNyb3MtdXNlZC10d2ljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjkzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMS1tYWNyb3MtdXNlZC10d2ljZS5jCkBAIC0wLDAgKzEsMTYgQEAKKyNkZWZpbmUgb2JqZWN0IDEKKyNkZWZpbmUgZnVuY3Rpb24oeCkgMQorCisjaWYgb2JqZWN0CitvbmNlCisjZW5kaWYKKyNpZiBvYmplY3QKK3R3aWNlCisjZW5kaWYKKworI2lmIGZ1bmN0aW9uKDApCitvbmNlCisjZW5kaWYKKyNpZiBmdW5jdGlvbigwKQorb25jZSBhZ2FpbgorI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMS1tYWNyb3MtdXNlZC10d2ljZS5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDEtbWFjcm9zLXVzZWQtdHdpY2UuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRiZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDEtbWFjcm9zLXVzZWQtdHdpY2UuYy5leHBlY3RlZApAQCAtMCwwICsxLDE3IEBACisKKworCisKK29uY2UKKworCit0d2ljZQorCisKKworb25jZQorCisKK29uY2UgYWdhaW4KKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMi1nYXJiYWdlLWFmdGVyLWVuZGlmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMi1nYXJiYWdlLWFmdGVyLWVuZGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxNzc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTAyLWdhcmJhZ2UtYWZ0ZXItZW5kaWYuYwpAQCAtMCwwICsxLDIgQEAKKyNpZiAwCisjZW5kaWYgZ2FyYmFnZQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDItZ2FyYmFnZS1hZnRlci1lbmRpZi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDItZ2FyYmFnZS1hZnRlci1lbmRpZi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjNiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMi1nYXJiYWdlLWFmdGVyLWVuZGlmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwyIEBACiswOjIoOCk6IHByZXByb2Nlc3NvciBlcnJvcjogc3ludGF4IGVycm9yLCB1bmV4cGVjdGVkIElERU5USUZJRVIsIGV4cGVjdGluZyBORVdMSU5FCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTAzLWdhcmJhZ2UtYWZ0ZXItZWxzZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDMtZ2FyYmFnZS1hZnRlci1lbHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2MGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTAzLWdhcmJhZ2UtYWZ0ZXItZWxzZS5jCkBAIC0wLDAgKzEsMyBAQAorI2lmIDAKKyNlbHNlIGdhcmJhZ2UKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDMtZ2FyYmFnZS1hZnRlci1lbHNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwMy1nYXJiYWdlLWFmdGVyLWVsc2UuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWY1ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDMtZ2FyYmFnZS1hZnRlci1lbHNlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACiswOjIoNyk6IHByZXByb2Nlc3NvciBlcnJvcjogc3ludGF4IGVycm9yLCB1bmV4cGVjdGVkIElERU5USUZJRVIsIGV4cGVjdGluZyBORVdMSU5FCiswOjEoNyk6IHByZXByb2Nlc3NvciBlcnJvcjogVW50ZXJtaW5hdGVkICNpZgorCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA0LWhhc2gtbGluZS1mb2xsb3dlZC1ieS1jb2RlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwNC1oYXNoLWxpbmUtZm9sbG93ZWQtYnktY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYmVlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwNC1oYXNoLWxpbmUtZm9sbG93ZWQtYnktY29kZS5jCkBAIC0wLDAgKzEsMiBAQAorI2xpbmUgMgoraW50IGZvbygpOwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDQtaGFzaC1saW5lLWZvbGxvd2VkLWJ5LWNvZGUuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA0LWhhc2gtbGluZS1mb2xsb3dlZC1ieS1jb2RlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5YTI5MgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA0LWhhc2gtbGluZS1mb2xsb3dlZC1ieS1jb2RlLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwzIEBACisjbGluZSAyCitpbnQgZm9vKCk7CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA1LW11bHRpbGluZS1oYXNoLWxpbmUuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA1LW11bHRpbGluZS1oYXNoLWxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE1NmM2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDUtbXVsdGlsaW5lLWhhc2gtbGluZS5jCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBYKHgpIHgKKyNsaW5lIFgoCVwKKwkxCVwKKyAgICAgICApCisjbGluZSAyCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwNS1tdWx0aWxpbmUtaGFzaC1saW5lLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwNS1tdWx0aWxpbmUtaGFzaC1saW5lLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4ZTE1MAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA1LW11bHRpbGluZS1oYXNoLWxpbmUuYy5leHBlY3RlZApAQCAtMCwwICsxLDYgQEAKKworI2xpbmUgMQorCisKKyNsaW5lIDIKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDYtbXVsdGlsaW5lLWhhc2gtaWYuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA2LW11bHRpbGluZS1oYXNoLWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5ZTkzZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA2LW11bHRpbGluZS1oYXNoLWlmLmMKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIFgoeCkgeAorI2lmIFgoCQlcCisJMQlcCisgICAgICkKK2ludCBmb28oKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDYtbXVsdGlsaW5lLWhhc2gtaWYuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA2LW11bHRpbGluZS1oYXNoLWlmLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1ZmYyZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA2LW11bHRpbGluZS1oYXNoLWlmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw3IEBACisKKworCisKK2ludCBmb28oKTsKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwNy1tdWx0aWxpbmUtaGFzaC1lbGlmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwNy1tdWx0aWxpbmUtaGFzaC1lbGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxYzY3YQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA3LW11bHRpbGluZS1oYXNoLWVsaWYuYwpAQCAtMCwwICsxLDcgQEAKKyNkZWZpbmUgWCh4KSB4CisjaWYgMAorI2VsaWYgWCgJXAorCTEJXAorICAgICAgICkKK2ludCBmb28oKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDctbXVsdGlsaW5lLWhhc2gtZWxpZi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDctbXVsdGlsaW5lLWhhc2gtZWxpZi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDQ4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwNy1tdWx0aWxpbmUtaGFzaC1lbGlmLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSw4IEBACisKKworCisKKworaW50IGZvbygpOworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA4LW5vLXNwYWNlLWFmdGVyLWhhc2gtdmVyc2lvbi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDgtbm8tc3BhY2UtYWZ0ZXItaGFzaC12ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlMzZmMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA4LW5vLXNwYWNlLWFmdGVyLWhhc2gtdmVyc2lvbi5jCkBAIC0wLDAgKzEgQEAKKyN2ZXJzaW9uMTEwCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwOC1uby1zcGFjZS1hZnRlci1oYXNoLXZlcnNpb24uYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA4LW5vLXNwYWNlLWFmdGVyLWhhc2gtdmVyc2lvbi5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDU0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwOC1uby1zcGFjZS1hZnRlci1oYXNoLXZlcnNpb24uYy5leHBlY3RlZApAQCAtMCwwICsxLDIgQEAKKzA6MSgzKTogcHJlcHJvY2Vzc29yIGVycm9yOiBJbnZhbGlkIHRva2VucyBhZnRlciAjCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA5LW5vLXNwYWNlLWFmdGVyLWhhc2gtbGluZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDktbm8tc3BhY2UtYWZ0ZXItaGFzaC1saW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyOTY2YQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTA5LW5vLXNwYWNlLWFmdGVyLWhhc2gtbGluZS5jCkBAIC0wLDAgKzEgQEAKKyNsaW5lMgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDktbm8tc3BhY2UtYWZ0ZXItaGFzaC1saW5lLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEwOS1uby1zcGFjZS1hZnRlci1oYXNoLWxpbmUuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ1NDRhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMDktbm8tc3BhY2UtYWZ0ZXItaGFzaC1saW5lLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwyIEBACiswOjEoMyk6IHByZXByb2Nlc3NvciBlcnJvcjogSW52YWxpZCB0b2tlbnMgYWZ0ZXIgIworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMC1uby1zcGFjZS1kaWdpdHMtYWZ0ZXItaGFzaC1lbGlmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMC1uby1zcGFjZS1kaWdpdHMtYWZ0ZXItaGFzaC1lbGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3ZDBmMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTEwLW5vLXNwYWNlLWRpZ2l0cy1hZnRlci1oYXNoLWVsaWYuYwpAQCAtMCwwICsxLDMgQEAKKyNpZiAxCisjZWxpZjExMAorI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMC1uby1zcGFjZS1kaWdpdHMtYWZ0ZXItaGFzaC1lbGlmLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMC1uby1zcGFjZS1kaWdpdHMtYWZ0ZXItaGFzaC1lbGlmLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1ZTlkMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTEwLW5vLXNwYWNlLWRpZ2l0cy1hZnRlci1oYXNoLWVsaWYuYy5leHBlY3RlZApAQCAtMCwwICsxLDQgQEAKKzA6MigyKTogcHJlcHJvY2Vzc29yIGVycm9yOiBJbnZhbGlkIHRva2VucyBhZnRlciAjCisKKworCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMS1uby1zcGFjZS1vcGVyYXRvci1hZnRlci1oYXNoLWlmLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMS1uby1zcGFjZS1vcGVyYXRvci1hZnRlci1oYXNoLWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0MTMzNwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTExLW5vLXNwYWNlLW9wZXJhdG9yLWFmdGVyLWhhc2gtaWYuYwpAQCAtMCwwICsxLDE5IEBACisjaWYoMSkKK3N1Y2Nlc3MKKyNlbmRpZgorCisjaWYrMQorc3VjY2VzcworI2VuZGlmCisKKyNpZi0xCitzdWNjZXNzCisjZW5kaWYKKworI2lmITEKK3N1Y2Nlc3MKKyNlbmRpZgorCisjaWZ+MQorc3VjY2VzcworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMS1uby1zcGFjZS1vcGVyYXRvci1hZnRlci1oYXNoLWlmLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMS1uby1zcGFjZS1vcGVyYXRvci1hZnRlci1oYXNoLWlmLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4MzAwOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTExLW5vLXNwYWNlLW9wZXJhdG9yLWFmdGVyLWhhc2gtaWYuYy5leHBlY3RlZApAQCAtMCwwICsxLDIwIEBACisKK3N1Y2Nlc3MKKworCisKK3N1Y2Nlc3MKKworCisKK3N1Y2Nlc3MKKworCisKKworCisKKworc3VjY2VzcworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTEyLW5vLXNwYWNlLW9wZXJhdG9yLWFmdGVyLWhhc2gtZWxpZi5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTItbm8tc3BhY2Utb3BlcmF0b3ItYWZ0ZXItaGFzaC1lbGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMjFiYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTEyLW5vLXNwYWNlLW9wZXJhdG9yLWFmdGVyLWhhc2gtZWxpZi5jCkBAIC0wLDAgKzEsMjQgQEAKKyNpZiAwCisjZWxpZigxKQorc3VjY2VzcworI2VuZGlmCisKKyNpZiAwCisjZWxpZisxCitzdWNjZXNzCisjZW5kaWYKKworI2lmIDAKKyNlbGlmLTEKK3N1Y2Nlc3MKKyNlbmRpZgorCisjaWYgMAorI2VsaWYhMQorc3VjY2VzcworI2VuZGlmCisKKyNpZiAwCisjZWxpZn4xCitzdWNjZXNzCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTEyLW5vLXNwYWNlLW9wZXJhdG9yLWFmdGVyLWhhc2gtZWxpZi5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTItbm8tc3BhY2Utb3BlcmF0b3ItYWZ0ZXItaGFzaC1lbGlmLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NDc5YQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTEyLW5vLXNwYWNlLW9wZXJhdG9yLWFmdGVyLWhhc2gtZWxpZi5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMjUgQEAKKworCitzdWNjZXNzCisKKworCisKK3N1Y2Nlc3MKKworCisKKworc3VjY2VzcworCisKKworCisKKworCisKKworc3VjY2VzcworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTEzLWxpbmUtYW5kLWZpbGUtbWFjcm9zLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMy1saW5lLWFuZC1maWxlLW1hY3Jvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OWM0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMy1saW5lLWFuZC1maWxlLW1hY3Jvcy5jCkBAIC0wLDAgKzEsNyBAQAorMS4gTnVtYmVyIG9mIGRhbG1hdGlvbnM6IF9fTElORV9fIF9fRklMRV9fIF9fTElORV9fCisyLiBOb21pbmFsIHZpc3VhbCBhY3VpdHk6IF9fTElORV9fIF9fRklMRV9fIC8gX19MSU5FX18gX19GSUxFX18KKzMuIEJhdHRsZSBvZiBUaGVybW9weWxhZSwgYXMgZmlsbTogX19MSU5FX18gX19GSUxFX18gX19GSUxFX18KKzQuIEhUVFAgY29kZSBmb3IgIk5vdCBGb3VuZCI6IF9fTElORV9fIF9fRklMRV9fIF9fTElORV9fCis1LiBIZXhhZGVjaW1hbCBmb3IgMjA1NjA6IF9fTElORV9fIF9fRklMRV9fIF9fTElORV9fIF9fRklMRV9fCis2OiBaaXAgY29kZSBmb3IgTm9ydG9udmlsbGUsIEtTOiBfX0xJTkVfXyBfX0xJTkVfXyBfX0ZJTEVfXyBfX0xJTkVfXyBfX0ZJTEVfXworNy4gSmFtZXMgQm9uZCwgYXMgYSBudW1iZXI6IF9fRklMRV9fIF9fRklMRV9fIF9fTElORV9fCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExMy1saW5lLWFuZC1maWxlLW1hY3Jvcy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTMtbGluZS1hbmQtZmlsZS1tYWNyb3MuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTYyZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTMtbGluZS1hbmQtZmlsZS1tYWNyb3MuYy5leHBlY3RlZApAQCAtMCwwICsxLDggQEAKKzEuIE51bWJlciBvZiBkYWxtYXRpb25zOiAxIDAgMQorMi4gTm9taW5hbCB2aXN1YWwgYWN1aXR5OiAyIDAgLyAyIDAKKzMuIEJhdHRsZSBvZiBUaGVybW9weWxhZSwgYXMgZmlsbTogMyAwIDAKKzQuIEhUVFAgY29kZSBmb3IgIk5vdCBGb3VuZCI6IDQgMCA0Cis1LiBIZXhhZGVjaW1hbCBmb3IgMjA1NjA6IDUgMCA1IDAKKzY6IFppcCBjb2RlIGZvciBOb3J0b252aWxsZSwgS1M6IDYgNiAwIDYgMAorNy4gSmFtZXMgQm9uZCwgYXMgYSBudW1iZXI6IDAgMCA3CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE0LXBhc3RlLWludGVnZXItdG9rZW5zLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNC1wYXN0ZS1pbnRlZ2VyLXRva2Vucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGQ5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNC1wYXN0ZS1pbnRlZ2VyLXRva2Vucy5jCkBAIC0wLDAgKzEsNyBAQAorI2RlZmluZSBQQVNURTMoYSxiLGMpIGEgIyMgYiAjIyBjCisjZGVmaW5lIFBBU1RFNChhLGIsYyxkKSBhICMjIGIgIyMgYyAjIyBkCisjZGVmaW5lIFBBU1RFNShhLGIsYyxkLGUpIGEgIyMgYiAjIyBjICMjIGQgIyMgZQorNC4gSFRUUCBjb2RlIGZvciAiTm90IEZvdW5kIjogUEFTVEUzKF9fTElORV9fLCBfX0ZJTEVfXyAsIF9fTElORV9fKQorNS4gSGV4YWRlY2ltYWwgZm9yIDIwNTYwOiBQQVNURTQoX19MSU5FX18sIF9fRklMRV9fLCBfX0xJTkVfXywgX19GSUxFX18pCis2OiBaaXAgY29kZSBmb3IgTm9ydG9udmlsbGUsIEtTOiBQQVNURTUoX19MSU5FX18sIF9fTElORV9fLCBfX0ZJTEVfXywgX19MSU5FX18sICBfX0ZJTEVfXykKKzcuIEphbWVzIEJvbmQsIGFzIGEgbnVtYmVyOiBQQVNURTMoX19GSUxFX18sIF9fRklMRV9fLCBfX0xJTkVfXykKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE0LXBhc3RlLWludGVnZXItdG9rZW5zLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNC1wYXN0ZS1pbnRlZ2VyLXRva2Vucy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWQ3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNC1wYXN0ZS1pbnRlZ2VyLXRva2Vucy5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsOCBAQAorCisKKworNC4gSFRUUCBjb2RlIGZvciAiTm90IEZvdW5kIjogNDA0Cis1LiBIZXhhZGVjaW1hbCBmb3IgMjA1NjA6IDUwNTAKKzY6IFppcCBjb2RlIGZvciBOb3J0b252aWxsZSwgS1M6IDY2MDYwCis3LiBKYW1lcyBCb25kLCBhcyBhIG51bWJlcjogMDA3CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE1LWxpbmUtY29udGludWF0aW9ucy5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTUtbGluZS1jb250aW51YXRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1NTkwZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE1LWxpbmUtY29udGludWF0aW9ucy5jCkBAIC0wLDAgKzEsOSBAQAorLy8gVGhpcyBjb21tZW50IGNvbnRpbnVlcyB0byB0aGUgbmV4dCBsaW5lLCBoaWRpbmcgdGhlIGRlZmluZSBcCisjZGVmaW5lIENPTlRJTlVBVElPTl9VTlNVUFBPUlRFRAorCisjaWZkZWYgQ09OVElOVUFUSU9OX1VOU1VQUE9SVEVECitmYWlsdXJlCisjZWxzZQorc3VjY2VzcworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE1LWxpbmUtY29udGludWF0aW9ucy5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTUtbGluZS1jb250aW51YXRpb25zLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3YmExYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE1LWxpbmUtY29udGludWF0aW9ucy5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMTAgQEAKKworCisKKworCisKK3N1Y2Nlc3MKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE2LWRpc2FibGUtbGluZS1jb250aW51YXRpb25zLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNi1kaXNhYmxlLWxpbmUtY29udGludWF0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDVkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNi1kaXNhYmxlLWxpbmUtY29udGludWF0aW9ucy5jCkBAIC0wLDAgKzEsMTMgQEAKKy8vIGdsY3BwLWFyZ3M6IC0tZGlzYWJsZS1saW5lLWNvbnRpbnVhdGlvbnMKKworLy8gVGhpcyBjb21tZW50cyBlbmRzIHdpdGggYSBiYWNrc2xhc2ggXFwKKyNkZWZpbmUgTk9fQ09OVElOVUFUSU9OCisKKyNpZmRlZiBOT19DT05USU5VQVRJT04KK3N1Y2Nlc3MKKyNlbHNlCitmYWlsdXJlCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE2LWRpc2FibGUtbGluZS1jb250aW51YXRpb25zLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNi1kaXNhYmxlLWxpbmUtY29udGludWF0aW9ucy5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOWE4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNi1kaXNhYmxlLWxpbmUtY29udGludWF0aW9ucy5jLmV4cGVjdGVkCkBAIC0wLDAgKzEsMTQgQEAKKworCisKKworCisKK3N1Y2Nlc3MKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTctbGluZS1jb250aW51YXRpb24tYW5kLW5vbi1jb250aW51YXRpb24tYmFja3NsYXNoLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNy1saW5lLWNvbnRpbnVhdGlvbi1hbmQtbm9uLWNvbnRpbnVhdGlvbi1iYWNrc2xhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTZmMjgyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTctbGluZS1jb250aW51YXRpb24tYW5kLW5vbi1jb250aW51YXRpb24tYmFja3NsYXNoLmMKQEAgLTAsMCArMSwxMiBAQAorLyogVGhpcyB0ZXN0IGNhc2UgaXMgdGhlIG1pbmltYWwgY2FzZSB0byByZXBsaWNhdGUgdGhlIGJ1ZyByZXBvcnRlZCBoZXJlOgorICoKKyAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTY1MTEyCisgKgorICogVG8gdHJpZ2dlciB0aGUgYnVnLCB0aGVyZSBtdXN0IGJlIGEgbGluZS1jb250aW51YXRpb24gc2VxdWVuY2UKKyAqIChiYWNrc2xhc2ggbmV3bGluZSksIHRoZW4gYW4gYWRkaXRpb25hbCBuZXdsaW5lIGNoYXJhY3RlciwgYW5kCisgKiBmaW5hbGx5IGFub3RoZXIgYmFja3NsYXNoIHRoYXQgaXMgbm90IHBhcnQgb2YgYSBsaW5lLWNvbnRpbnVhdGlvbgorICogc2VxdWVuY2UuCisgKi8KK1wKKworLyogXCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTctbGluZS1jb250aW51YXRpb24tYW5kLW5vbi1jb250aW51YXRpb24tYmFja3NsYXNoLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExNy1saW5lLWNvbnRpbnVhdGlvbi1hbmQtbm9uLWNvbnRpbnVhdGlvbi1iYWNrc2xhc2guYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTJkNjUxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTctbGluZS1jb250aW51YXRpb24tYW5kLW5vbi1jb250aW51YXRpb24tYmFja3NsYXNoLmMuZXhwZWN0ZWQKQEAgLTAsMCArMSwxMyBAQAorIAorCisKKworCisKKworCisKKworCisgCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE4LWNvbW1lbnQtYmVjb21lcy1zcGFjZS5jIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTgtY29tbWVudC1iZWNvbWVzLXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlODAzOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE4LWNvbW1lbnQtYmVjb21lcy1zcGFjZS5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBGT08gZmlyc3QvKgorKi9zZWNvbmQKKworRk9PCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOC1jb21tZW50LWJlY29tZXMtc3BhY2UuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE4LWNvbW1lbnQtYmVjb21lcy1zcGFjZS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGY1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOC1jb21tZW50LWJlY29tZXMtc3BhY2UuYy5leHBlY3RlZApAQCAtMCwwICsxLDUgQEAKKworCisKK2ZpcnN0IHNlY29uZAorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOC1tdWx0aXBsZS1lbHNlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOC1tdWx0aXBsZS1lbHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhZDQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE4LW11bHRpcGxlLWVsc2UuYwpAQCAtMCwwICsxLDYgQEAKKyNpZiAwCisjZWxzZQoraW50IGZvbzsKKyNlbHNlCitpbnQgYmFyOworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOC1tdWx0aXBsZS1lbHNlLmMuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOC1tdWx0aXBsZS1lbHNlLmMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlYzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE4LW11bHRpcGxlLWVsc2UuYy5leHBlY3RlZApAQCAtMCwwICsxLDggQEAKKzA6NCgxKTogcHJlcHJvY2Vzc29yIGVycm9yOiBtdWx0aXBsZSAjZWxzZQorCisKK2ludCBmb287CisKK2ludCBiYXI7CisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTktZWxpZi1hZnRlci1lbHNlLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOS1lbGlmLWFmdGVyLWVsc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjllOTIzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMTktZWxpZi1hZnRlci1lbHNlLmMKQEAgLTAsMCArMSw2IEBACisjaWYgMAorI2Vsc2UKK2ludCBmb287CisjZWxpZiAwCitpbnQgYmFyOworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOS1lbGlmLWFmdGVyLWVsc2UuYy5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTE5LWVsaWYtYWZ0ZXItZWxzZS5jLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjA1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzExOS1lbGlmLWFmdGVyLWVsc2UuYy5leHBlY3RlZApAQCAtMCwwICsxLDggQEAKKzA6NCgxKTogcHJlcHJvY2Vzc29yIGVycm9yOiAjZWxpZiBhZnRlciAjZWxzZQorCisKK2ludCBmb287CisKK2ludCBiYXI7CisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMjEtY29tbWVudC1idWctNzI2ODYuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTIxLWNvbW1lbnQtYnVnLTcyNjg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlYmU3MwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xjcHAvdGVzdHMvMTIxLWNvbW1lbnQtYnVnLTcyNjg2LmMKQEAgLTAsMCArMSwyIEBACisvKgorICovIC8vCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzLzEyMS1jb21tZW50LWJ1Zy03MjY4Ni5jLmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMjEtY29tbWVudC1idWctNzI2ODYuYy5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJhNzYzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy8xMjEtY29tbWVudC1idWctNzI2ODYuYy5leHBlY3RlZApAQCAtMCwwICsxLDMgQEAKKyAgCisKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy9nbGNwcC10ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbGNwcC90ZXN0cy9nbGNwcC10ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjY4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsY3BwL3Rlc3RzL2dsY3BwLXRlc3QKQEAgLTAsMCArMSw5NSBAQAorIyEvYmluL3NoCisKK2lmIFsgISAteiAiJHNyY2RpciIgXTsgdGhlbgorICAgdGVzdGRpcj0kc3JjZGlyL2dsY3BwL3Rlc3RzCisgICBnbGNwcD1gcHdkYC9nbGNwcC9nbGNwcAorZWxzZQorICAgdGVzdGRpcj0uCisgICBnbGNwcD0uLi9nbGNwcAorZmkKKwordHJhcCAncm0gJHRlc3QudmFsZ3JpbmQtZXJyb3JzOyBleGl0IDEnIElOVCBRVUlUCisKK3VzYWdlICgpCit7CisgICAgY2F0IDw8RU9GCitVc2FnZTogZ2xjcHAgW29wdGlvbnMuLi5dCisKK1J1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVzYSdzIEdMU0wgcHJlLXByb2Nlc3Nvci4KKworVmFsaWQgb3B0aW9ucyBpbmNsdWRlOgorCisJLS12YWxncmluZAlSdW4gdGhlIHRlc3Qgc3VpdGUgYSBzZWNvbmQgdGltZSB1bmRlciB2YWxncmluZAorRU9GCit9CisKK3Rlc3Rfc3BlY2lmaWNfYXJncyAoKQoreworICAgIHRlc3Q9IiQxIgorCisgICAgZ3JlcCAnZ2xjcHAtYXJnczonICIkdGVzdCIgfCBzZWQgLWUgJ3MsXi4qZ2xjcHAtYXJnczogKiwsJworfQorCisjIFBhcnNlIGNvbW1hbmQtbGluZSBvcHRpb25zCitmb3Igb3B0aW9uOyBkbworICAgIGlmIFsgIiR7b3B0aW9ufSIgPSAnLS1oZWxwJyBdIDsgdGhlbgorCXVzYWdlCisJZXhpdCAwCisgICAgZWxpZiBbICIke29wdGlvbn0iID0gJy0tdmFsZ3JpbmQnIF0gOyB0aGVuCisJZG9fdmFsZ3JpbmQ9eWVzCisgICAgZWxzZQorCWVjaG8gIlVucmVjb2duaXplZCBvcHRpb246ICRvcHRpb24iID4mMgorCWVjaG8gPiYyCisJdXNhZ2UKKwlleGl0IDEKKyAgICBmaQorZG9uZQorCit0b3RhbD0wCitwYXNzPTAKK2NsZWFuPTAKKworZWNobyAiPT09PT09IFRlc3RpbmcgZm9yIGNvcnJlY3RuZXNzID09PT09PSIKK2ZvciB0ZXN0IGluICR0ZXN0ZGlyLyouYzsgZG8KKyAgICBlY2hvIC1uICJUZXN0aW5nICR0ZXN0Li4uIgorICAgICRnbGNwcCAkKHRlc3Rfc3BlY2lmaWNfYXJncyAkdGVzdCkgPCAkdGVzdCA+ICR0ZXN0Lm91dCAyPiYxCisgICAgdG90YWw9JCgodG90YWwrMSkpCisgICAgaWYgY21wICR0ZXN0LmV4cGVjdGVkICR0ZXN0Lm91dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwllY2hvICJQQVNTIgorCXBhc3M9JCgocGFzcysxKSkKKyAgICBlbHNlCisJZWNobyAiRkFJTCIKKwlkaWZmIC11ICR0ZXN0LmV4cGVjdGVkICR0ZXN0Lm91dAorICAgIGZpCitkb25lCisKK2VjaG8gIiIKK2VjaG8gIiRwYXNzLyR0b3RhbCB0ZXN0cyByZXR1cm5lZCBjb3JyZWN0IHJlc3VsdHMiCitlY2hvICIiCisKK2lmIFsgIiRkb192YWxncmluZCIgPSAieWVzIiBdOyB0aGVuCisgICAgZWNobyAiPT09PT09IFRlc3RpbmcgZm9yIHZhbGdyaW5kIGNsZWFubGluZXNzID09PT09PSIKKyAgICBmb3IgdGVzdCBpbiAkdGVzdGRpci8qLmM7IGRvCisJZWNobyAtbiAiVGVzdGluZyAkdGVzdCB3aXRoIHZhbGdyaW5kLi4uIgorCXZhbGdyaW5kIC0tZXJyb3ItZXhpdGNvZGU9MzEgLS1sb2ctZmlsZT0kdGVzdC52YWxncmluZC1lcnJvcnMgJGdsY3BwICQodGVzdF9zcGVjaWZpY19hcmdzICR0ZXN0KSA8ICR0ZXN0ID4vZGV2L251bGwgMj4mMQorCWlmIFsgIiQ/IiA9ICIzMSIgXTsgdGhlbgorCSAgICBlY2hvICJFUlJPUlMiCisJICAgIGNhdCAkdGVzdC52YWxncmluZC1lcnJvcnMKKwllbHNlCisJICAgIGVjaG8gIkNMRUFOIgorCSAgICBjbGVhbj0kKChjbGVhbisxKSkKKwkgICAgcm0gJHRlc3QudmFsZ3JpbmQtZXJyb3JzCisJZmkKKyAgICBkb25lCisKKyAgICBlY2hvICIiCisgICAgZWNobyAiJHBhc3MvJHRvdGFsIHRlc3RzIHJldHVybmVkIGNvcnJlY3QgcmVzdWx0cyIKKyAgICBlY2hvICIkY2xlYW4vJHRvdGFsIHRlc3RzIGFyZSB2YWxncmluZC1jbGVhbiIKK2ZpCisKK2lmIFsgIiRwYXNzIiA9ICIkdG90YWwiIF0gJiYgWyAiJGRvX3ZhbGdyaW5kIiAhPSAieWVzIiBdIHx8IFsgIiRwYXNzIiA9ICIkdG90YWwiIF07IHRoZW4KKyAgICBleGl0IDAKK2Vsc2UKKyAgICBleGl0IDEKK2ZpCisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19iYWNrZW5kLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19iYWNrZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNkN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX2dsYXNzX2JhY2tlbmQuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yOiBTdGV2ZSBLIDxzcmtATHVuYXJHLmNvbT4KKyAqCisgKi8KKworLy89PT0tIGdsc2xfZ2xhc3NfYmFja2VuZC5jcHAgLSBNZXNhIGN1c3RvbWl6YXRpb24gb2YgZ2xhOjpCYWNrRW5kIC0tLS0tPT09Ly8KKy8vCisvLyBDdXN0b21pemF0aW9uIG9mIGdsYTo6QmFja0VuZCBmb3IgTWVzYQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJnbHNsX2dsYXNzX2JhY2tlbmQuaCIKKworbmFtZXNwYWNlIGdsYSB7CisKKy8vCisvLyBmYWN0b3J5IGZvciB0aGUgTWVzYSBMdW5hckdMQVNTIGJhY2tlbmQKKy8vCitCYWNrRW5kKiBHZXRNZXNhR2xhc3NCYWNrRW5kKGNvbnN0IEVTaExhbmd1YWdlIGxhbmd1YWdlKQoreworICAgIHJldHVybiBuZXcgTWVzYUdsYXNzQmFja0VuZChsYW5ndWFnZSk7Cit9CisKK3ZvaWQgUmVsZWFzZU1lc2FHbGFzc0JhY2tFbmQoQmFja0VuZCogYmFja0VuZCkKK3sKKyAgICBkZWxldGUgYmFja0VuZDsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2xhCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfZ2xhc3NfYmFja2VuZC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX2dsYXNzX2JhY2tlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY4NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX2dsYXNzX2JhY2tlbmQuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IFN0ZXZlIEsgPHNya0BMdW5hckcuY29tPgorICoKKyAqLworCisvLz09PS0gZ2xzbF9nbGFzc19iYWNrZW5kLmggLSBNZXNhIGN1c3RvbWl6YXRpb24gb2YgZ2xhOjpCYWNrRW5kIC0tLS0tPT09Ly8KKy8vCisvLyBDdXN0b21pemF0aW9uIG9mIGdsYTo6QmFja0VuZCBmb3IgTWVzYQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJDb3JlL0JhY2tlbmQuaCIKKyNpbmNsdWRlICJnbHNsYW5nL1B1YmxpYy9TaGFkZXJMYW5nLmgiCisKK25hbWVzcGFjZSBnbGEgeworCitjbGFzcyBNZXNhR2xhc3NCYWNrRW5kIDogcHVibGljIGdsYTo6QmFja0VuZCB7CitwdWJsaWM6CisgICBNZXNhR2xhc3NCYWNrRW5kKGNvbnN0IEVTaExhbmd1YWdlIGwpIDoKKyAgICAgICBsYW5ndWFnZShsKQorICAgeworICAgICAgLy8gTHVuYXJHTEFTUyBkZWNvbXBvc2l0aW9uLiAgQXNrIGZvciBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgYmVsb3cuCisgICAgICBmb3IgKGludCBkID0gMDsgZCA8IEVEaUNvdW50OyArK2QpCisgICAgICAgICBkZWNvbXBvc2VbZF0gPSB0cnVlOworCisgICAgICAvLyBUdXJuIG9mZiBzb21lIGRlY29tcG9zaXRpb25zIHdlIGRvbid0IG5lZWQKKyAgICAgIGRlY29tcG9zZVtFRGlEb3RdICAgICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaU1pbl0gICAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpTWF4XSAgICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlFeHBdICAgICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaUxvZ10gICAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpU2lnbl0gICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlBbnldICAgICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaUFsbF0gICAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpTm90XSAgICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlGcmFjdGlvbl0gICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaUludmVyc2VTcXJ0XSAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpRm1hXSAgICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlNb2RGXSAgICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaU1peF0gICAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpRml4ZWRUcmFuc2Zvcm1dICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlQYWNrVW5vcm0yeDE2XSAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaVBhY2tVbm9ybTR4OF0gICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpUGFja1Nub3JtNHg4XSAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlVbnBhY2tVbm9ybTJ4MTZdICAgPQorICAgICAgZGVjb21wb3NlW0VEaVVucGFja1Vub3JtNHg4XSAgICA9CisgICAgICBkZWNvbXBvc2VbRURpVW5wYWNrU25vcm00eDhdICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlQYWNrRG91YmxlMngzMl0gICAgPQorICAgICAgZGVjb21wb3NlW0VEaVVucGFja0RvdWJsZTJ4MzJdICA9CisgICAgICBkZWNvbXBvc2VbRURpUG93aV0gICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlBc2luXSAgICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaUFjb3NdICAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpQXRhbl0gICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlBdGFuMl0gICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaVNpbmhdICAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpQ29zaF0gICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlUYW5oXSAgICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaUFTaW5oXSAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpQUNvc2hdICAgICAgICAgICAgID0KKyAgICAgIGRlY29tcG9zZVtFRGlBVGFuaF0gICAgICAgICAgICAgPQorICAgICAgZGVjb21wb3NlW0VEaUlzTmFuXSAgICAgICAgICAgICA9CisgICAgICBkZWNvbXBvc2VbRURpVGV4dHVyZVByb2plY3Rpb25dID0gCisgICAgICBkZWNvbXBvc2VbRURpUmVmcmFjdF0gICAgICAgICAgID0gCisgICAgICBkZWNvbXBvc2VbRURpRmFjZUZvcndhcmRdICAgICAgID0KKyAgICAgICAgIGZhbHNlOworCisgICAgICAvLyBFeHBsaWNpdGx5IG1lbnRpb24gdGhlIG9uZXMgd2Ugd2FudCBMdW5hckdsYXNzIHRvIGRlY29tcG9zZSBmb3IgdXMsCisgICAgICAvLyBqdXN0IGZvciBjbGFyaXR5LCBldmVuIHRob3VnaCB0aGUgYWJvdmUgbG9vcCBhc2tzIGZvciBkZWNvbXBvc2l0aW9uCisgICAgICAvLyBieSBkZWZhdWx0LgorICAgICAgZGVjb21wb3NlW0VEaUNsYW1wXSAgICAgICA9IGZhbHNlOworICAgICAgZGVjb21wb3NlW0VEaUZpbHRlcldpZHRoXSA9IHRydWU7CisgICB9CisgICAKKyAgIHZvaWQgZ2V0UmVnaXN0ZXJGb3JtKGludCYgb3V0ZXJTb0EsIGludCYgaW5uZXJBb1MpCisgICB7CisgICAgICAgc3dpdGNoIChsYW5ndWFnZSkKKyAgICAgICB7CisgICAgICAgICAgIGNhc2UgRVNoTGFuZ1ZlcnRleDoKKyAgICAgICAgICAgY2FzZSBFU2hMYW5nVGVzc0NvbnRyb2w6CisgICAgICAgICAgIGNhc2UgRVNoTGFuZ1Rlc3NFdmFsdWF0aW9uOgorICAgICAgICAgICBjYXNlIEVTaExhbmdHZW9tZXRyeToKKyAgICAgICAgICAgY2FzZSBFU2hMYW5nRnJhZ21lbnQ6CisgICAgICAgICAgIGNhc2UgRVNoTGFuZ0NvbXB1dGU6CisgICAgICAgICAgICAgICBvdXRlclNvQSA9IDE7CisgICAgICAgICAgICAgICBpbm5lckFvUyA9IDQ7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGFzc2VydCgwKTsgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgaGVyZQorICAgICAgIH0KKyAgIH0KKworICAgLy8gV2UgZG9uJ3Qgd2FudCBwaGkgZnVuY3Rpb25zCisgICBib29sIGdldFJlbW92ZVBoaUZ1bmN0aW9ucygpIHsgcmV0dXJuIHRydWU7IH0KKworICAgCisgICBib29sIGdldERlY2xhcmVQaGlDb3BpZXMoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgIC8vIE5vdCBhbGwgYmFja2VuZHMgeWV0IHN1cHBvcnQgY29uZGl0aW9uYWwgZGlzY2FyZHMuICBBc2sgTHVuYXJHTEFTUyB0bworICAgLy8gYXZvaWQgdGhlbS4KKyAgIGJvb2wgaG9pc3REaXNjYXJkcygpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgIC8vIEFzayBMdW5hckdsYXNzIGZvciBtYXQqdmVjICYgdmVjKm1hdCBpbnRyaW5zaWNzCisgICBib29sIHVzZUNvbHVtbkJhc2VkTWF0cml4SW50cmluc2ljcygpIHsgcmV0dXJuIHRydWU7IH0KKworICAgYm9vbCB1c2VMb2dpY2FsSW8oKSB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgICBjb25zdCBFU2hMYW5ndWFnZSBsYW5ndWFnZTsKK307CisKKy8vCisvLyBmYWN0b3J5IGZvciB0aGUgTWVzYSBMdW5hckdMQVNTIGJhY2tlbmQKKy8vCitCYWNrRW5kKiBHZXRNZXNhR2xhc3NCYWNrRW5kKGNvbnN0IEVTaExhbmd1YWdlKTsKK3ZvaWQgUmVsZWFzZU1lc2FHbGFzc0JhY2tFbmQoQmFja0VuZCopOworCit9IC8vIG5hbWVzcGFjZSBnbGEKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19iYWNrZW5kX3RyYW5zbGF0b3IuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX2dsYXNzX2JhY2tlbmRfdHJhbnNsYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhNjU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19iYWNrZW5kX3RyYW5zbGF0b3IuY3BwCkBAIC0wLDAgKzEsNDExNiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNvZHlAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogR3JlZ0YgPGdyZWdATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogU3RldmUgSyA8c3JrQEx1bmFyRy5jb20+CisgKgorICovCisKKy8vPT09LSBnbHNsX2dsYXNzX2JhY2tlbmRfdHJhbnNsYXRvci5jcHAgLSBNZXNhIGN1c3RvbWl6YXRpb24gb2YgZ2xhOjpCYWNrRW5kVHJhbnNsYXRvciAtLS0tLT09PS8vCisvLworLy8gQ3VzdG9taXphdGlvbiBvZiBnbGE6OkJhY2tFbmRUcmFuc2xhdG9yIGZvciBNZXNhCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTHVuYXJHTEFTUyBpbmNsdWRlcworI2luY2x1ZGUgIkNvcmUvUmV2aXNpb24uaCIKKyNpbmNsdWRlICJDb3JlL0V4Y2VwdGlvbnMuaCIKKyNpbmNsdWRlICJDb3JlL1V0aWwuaCIKKyNpbmNsdWRlICJDb3JlL0JvdHRvbUlSLmgiCisjaW5jbHVkZSAiQ29yZS9CYWNrZW5kLmgiCisjaW5jbHVkZSAiQ29yZS9Qcml2YXRlTWFuYWdlci5oIgorI2luY2x1ZGUgIkNvcmUvT3B0aW9ucy5oIgorI2luY2x1ZGUgIkNvcmUvbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJDb3JlL1V0aWwuaCIKKyNpbmNsdWRlICJnbHNsX2dsYXNzX2JhY2tlbmRfdHJhbnNsYXRvci5oIgorCisvLyBNZXNhIGluY2x1ZGVzCisjaW5jbHVkZSAibWFpbi9zaGFkZXJvYmouaCIKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImdsc2xfcGFyc2VyX2V4dHJhcy5oIgorI2luY2x1ZGUgImFzdC5oIgorCisvLyBMTFZNIGluY2x1ZGVzCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSW5zdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2xzbGFuZy9QdWJsaWMvU2hhZGVyTGFuZy5oIgorCisvLyBQcml2YXRlIGluY2x1ZGVzCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit2b2lkIGVtaXRfZnVuY3Rpb24oX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsIGlyX2Z1bmN0aW9uICpmKTsKKworLy8gQW5vbnltb3VzIG5hbWVzcGFjZSBmb3IgZnVuY3Rpb24gbG9jYWwgdGhpbmdzCituYW1lc3BhY2UgeworICAgdXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyAgIC8vICoqKiogQm9ycm93ZWQgJiBtb2RpZmllZCBmcm9tIEx1bmFyR2xhc3MgR0xTTCBiYWNrZW5kOiAqKioqCisgICBjbGFzcyBNZXRhVHlwZSB7CisgICBwdWJsaWM6CisgICAgICBNZXRhVHlwZSgpIDogcHJlY2lzaW9uKGdsYTo6RU1wTm9uZSksCisgICAgICAgICAgICAgICAgICAgdHlwZUxheW91dChnbGE6OkVNdGxOb25lKSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcnBNZXRob2QoZ2xhOjpFSU1Ob25lKSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcnBMb2NhdGlvbihnbGE6OkVJTEZyYWdtZW50KSwKKyAgICAgICAgICAgICAgICAgICBxdWFsaWZpZXIoZ2xhOjpFVlFOb25lKSwKKyAgICAgICAgICAgICAgICAgICBsb2NhdGlvbigtMSksCisgICAgICAgICAgICAgICAgICAgYmluZGluZygtMSksCisgICAgICAgICAgICAgICAgICAgbWF0cml4KGZhbHNlKSwgbm90U2lnbmVkKGZhbHNlKSwgYmxvY2soZmFsc2UpLCBtZEFnZ3JlZ2F0ZSgwKSwgbWRTYW1wbGVyKDApIHsgfQorICAgICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgIG5hbWU7CisgICAgICBnbGE6OkVNZFByZWNpc2lvbiAgICAgICAgICAgcHJlY2lzaW9uOworICAgICAgZ2xhOjpFTWRCdWlsdEluICAgICAgICAgICAgIGJ1aWx0SW47CisgICAgICBnbGE6OkVNZElucHV0T3V0cHV0ICAgICAgICAgaW9LaW5kOworICAgICAgZ2xhOjpFTWRUeXBlTGF5b3V0ICAgICAgICAgIHR5cGVMYXlvdXQ7CisgICAgICBnbGE6OkVJbnRlcnBvbGF0aW9uTWV0aG9kICAgaW50ZXJwTWV0aG9kOworICAgICAgZ2xhOjpFSW50ZXJwb2xhdGlvbkxvY2F0aW9uIGludGVycExvY2F0aW9uOworICAgICAgZ2xhOjpFVmFyaWFibGVRdWFsaWZpZXIgICAgIHF1YWxpZmllcjsKKyAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjsKKyAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nOworICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeDsKKyAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBub3RTaWduZWQ7CisgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s7CisgICAgICBjb25zdCBsbHZtOjpNRE5vZGUqICAgICAgICAgbWRBZ2dyZWdhdGU7CisgICAgICBjb25zdCBsbHZtOjpNRE5vZGUqICAgICAgICAgbWRTYW1wbGVyOworICAgfTsKKworICAgLy8gKioqKiBCb3Jyb3dlZCAmIG1vZGlmaWVkIGZyb20gTHVuYXJHbGFzcyBHTFNMIGJhY2tlbmQgb3JpZ2luYWw6ICoqKioKKyAgIC8vIFByb2Nlc3MgdGhlIG1kTm9kZSwgZGVjb2RpbmcgYWxsIHR5cGUgaW5mb3JtYXRpb24gYW5kIGVtaXR0aW5nIHF1YWxpZmllcnMuCisgICAvLyBSZXR1cm5pbmcgZmFsc2UgbWVhbnMgdGhlcmUgd2FzIGEgcHJvYmxlbS4KKyAgIGJvb2wgZGVjb2RlTWRUeXBlc0VtaXRNZFF1YWxpZmllcnMoYm9vbCBpb1Jvb3QsIGNvbnN0IGxsdm06Ok1ETm9kZSogbWROb2RlLCBjb25zdCBsbHZtOjpUeXBlKiYgdHlwZSwgYm9vbCBhcnJheUNoaWxkLCBNZXRhVHlwZSYgbWV0YVR5cGUpCisgICB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgZ2xhOworCisgICAgICBpZiAoaW9Sb290KSB7CisgICAgICAgICBsbHZtOjpUeXBlKiBwcm94eVR5cGU7CisgICAgICAgICB1bnNpZ25lZCBpbnQgcHJveHlRdWFsaWZpZXJzOworICAgICAgICAgaW50IHByb3h5T2Zmc2V0OworICAgICAgICAgaW50IGludGVycE1vZGU7CisgICAgICAgICBpZiAoISBDcmFja0lPTWQobWROb2RlLCBtZXRhVHlwZS5uYW1lLCBtZXRhVHlwZS5pb0tpbmQsIHByb3h5VHlwZSwgbWV0YVR5cGUudHlwZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhVHlwZS5wcmVjaXNpb24sIG1ldGFUeXBlLmxvY2F0aW9uLCBtZXRhVHlwZS5tZFNhbXBsZXIsIG1ldGFUeXBlLm1kQWdncmVnYXRlLCBpbnRlcnBNb2RlLCBtZXRhVHlwZS5idWlsdEluLCBtZXRhVHlwZS5iaW5kaW5nLCBwcm94eVF1YWxpZmllcnMsIHByb3h5T2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorCisgICAgICAgICBtZXRhVHlwZS5ibG9jayA9CisgICAgICAgICAgICBtZXRhVHlwZS5pb0tpbmQgPT0gRU1pb1VuaWZvcm1CbG9ja01lbWJlciB8fAorICAgICAgICAgICAgbWV0YVR5cGUuaW9LaW5kID09IEVNaW9CdWZmZXJCbG9ja01lbWJlciAgfHwKKyAgICAgICAgICAgIG1ldGFUeXBlLmlvS2luZCA9PSBFTWlvUGlwZU91dEJsb2NrICAgICAgIHx8CisgICAgICAgICAgICBtZXRhVHlwZS5pb0tpbmQgPT0gRU1pb1BpcGVJbkJsb2NrOworCisgICAgICAgICBpZiAodHlwZSA9PSAwKQorICAgICAgICAgICAgdHlwZSA9IHByb3h5VHlwZTsKKworICAgICAgICAgLy8gZW1pdCBpbnRlcnBvbGF0aW9uIHF1YWxpZmllciwgaWYgYXBwcm9wcmlhdGUKKyAgICAgICAgIHN3aXRjaCAobWV0YVR5cGUuaW9LaW5kKSB7CisgICAgICAgICBjYXNlIEVNaW9QaXBlSW46ICAgbWV0YVR5cGUucXVhbGlmaWVyID0gRVZRSW5wdXQ7ICAgYnJlYWs7CisgICAgICAgICBjYXNlIEVNaW9QaXBlT3V0OiAgbWV0YVR5cGUucXVhbGlmaWVyID0gRVZRT3V0cHV0OyAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgbWV0YVR5cGUucXVhbGlmaWVyID0gRVZRVW5kZWY7ICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBpZiAobWV0YVR5cGUucXVhbGlmaWVyICE9IEVWUVVuZGVmKQorICAgICAgICAgICAgLy8gaW50ZXJwTW9kZSBpcyBpbml0aWFsaXplZCBieSB0aGUgY2FsbCB0byBDcmFja0lPTWQgYWJvdmUuCisgICAgICAgICAgICAjaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgICAgICAgICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdtYXliZS11bmluaXRpYWxpemVkIgorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBDcmFja0ludGVycG9sYXRpb25Nb2RlKGludGVycE1vZGUsIG1ldGFUeXBlLmludGVycE1ldGhvZCwgbWV0YVR5cGUuaW50ZXJwTG9jYXRpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlmICghIENyYWNrQWdncmVnYXRlTWQobWROb2RlLCBtZXRhVHlwZS5uYW1lLCBtZXRhVHlwZS50eXBlTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhVHlwZS5wcmVjaXNpb24sIG1ldGFUeXBlLmxvY2F0aW9uLCBtZXRhVHlwZS5tZFNhbXBsZXIsIG1ldGFUeXBlLmJ1aWx0SW4pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgbWV0YVR5cGUubWRBZ2dyZWdhdGUgPSBtZE5vZGU7CisgICAgICB9CisKKyAgICAgIG1ldGFUeXBlLm1hdHJpeCA9IG1ldGFUeXBlLnR5cGVMYXlvdXQgPT0gRU10bFJvd01ham9yTWF0cml4IHx8IG1ldGFUeXBlLnR5cGVMYXlvdXQgPT0gRU10bENvbE1ham9yTWF0cml4OworICAgICAgbWV0YVR5cGUubm90U2lnbmVkID0gbWV0YVR5cGUudHlwZUxheW91dCA9PSBFTXRsVW5zaWduZWQ7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICAvLyAqKioqIEJvcnJvd2VkIGZyb20gTHVuYXJHbGFzcyBHTFNMIEJhY2tlbmQKKyAgIHZvaWQgU3RyaXBTdWZmaXgoc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIHN1ZmZpeCkKKyAgIHsKKyAgICAgIGNvbnN0IGludCBuZXdTaXplID0gbmFtZS5sZW5ndGgoKSAtIHN0cmxlbihzdWZmaXgpOworICAgICAgaWYgKG5ld1NpemUgPCAwKQorICAgICAgICAgcmV0dXJuOworCisgICAgICBpZiAobmFtZS5jb21wYXJlKG5ld1NpemUsIHN0cmxlbihzdWZmaXgpLCBzdWZmaXgpID09IDApCisgICAgICAgICBuYW1lLnJlc2l6ZShuZXdTaXplKTsKKyAgIH0KKworICAgLy8gKioqKiBCb3Jyb3dlZCBmcm9tIEx1bmFyR2xhc3MgR0xTTCBCYWNrZW5kCisgICBnbGE6OkVWYXJpYWJsZVF1YWxpZmllciBNYXBHbGFBZGRyZXNzU3BhY2UoY29uc3QgbGx2bTo6VmFsdWUqIHZhbHVlKQorICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGdsYTsKKyAgICAgIGlmIChjb25zdCBsbHZtOjpQb2ludGVyVHlwZSogcG9pbnRlciA9IGxsdm06OmR5bl9jYXN0PGxsdm06OlBvaW50ZXJUeXBlPih2YWx1ZS0+Z2V0VHlwZSgpKSkgeworICAgICAgICAgIHN3aXRjaCAocG9pbnRlci0+Z2V0QWRkcmVzc1NwYWNlKCkpIHsKKyAgICAgICAgICBjYXNlIFJlc291cmNlQWRkcmVzc1NwYWNlOgorICAgICAgICAgICAgICByZXR1cm4gRVZRVW5pZm9ybTsKKyAgICAgICAgICBjYXNlIEdsb2JhbEFkZHJlc3NTcGFjZToKKyAgICAgICAgICAgICAgcmV0dXJuIEVWUUdsb2JhbDsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAocG9pbnRlci0+Z2V0QWRkcmVzc1NwYWNlKCkgPj0gQ29uc3RhbnRBZGRyZXNzU3BhY2VCYXNlKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIEVWUVVuaWZvcm07CisKKyAgICAgICAgICAgICAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5KCJBZGRyZXNzIFNwYWNlIGluIEJvdHRvbSBJUjogIiwgcG9pbnRlci0+Z2V0QWRkcmVzc1NwYWNlKCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChsbHZtOjppc2E8bGx2bTo6SW5zdHJ1Y3Rpb24+KHZhbHVlKSkKKyAgICAgICAgICByZXR1cm4gRVZRVGVtcG9yYXJ5OworCisgICAgICAvLyBDaGVjayBmb3IgYW4gdW5kZWYgYmVmb3JlIGEgY29uc3RhbnQgKHNpbmNlIFVuZGVmIGlzIGEKKyAgICAgIC8vIHN1YmNsYXNzIG9mIENvbnN0YW50KQorICAgICAgaWYgKEFyZUFsbFVuZGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgICAgICByZXR1cm4gRVZRVW5kZWY7CisgICAgICB9CisKKyAgICAgIGlmIChsbHZtOjppc2E8bGx2bTo6Q29uc3RhbnQ+KHZhbHVlKSkgeworICAgICAgICAgIHJldHVybiBFVlFDb25zdGFudDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIEVWUVRlbXBvcmFyeTsKKyAgIH0KKworCisgICAvLyAqKioqIEJvcnJvd2VkICYgbW9kaWZpZWQgZnJvbSBMdW5hckdsYXNzIEdMU0wgQmFja2VuZAorICAgLy8gV2hldGhlciB0aGUgZ2l2ZW4gaW50cmluc2ljJ3Mgc3BlY2lmaWVkIG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIHBhc3NlZAorICAgLy8gdmFsdWUsIGFuZCBpdHMgdHlwZSBpcyBhIHZlY3Rvci4KKyAgIGJvb2wgSXNTYW1lU291cmNlKGNvbnN0IGxsdm06OlZhbHVlICpzb3VyY2UsIGNvbnN0IGxsdm06OlZhbHVlICpwcmV2U291cmNlKQorICAgeworICAgICAgIHJldHVybiBzb3VyY2UgJiYgcHJldlNvdXJjZSA9PSBzb3VyY2UgJiYKKyAgICAgICAgICBzb3VyY2UtPmdldFR5cGUoKS0+Z2V0VHlwZUlEKCkgPT0gbGx2bTo6VHlwZTo6VmVjdG9yVHlJRDsKKyAgIH0KKworCisgICAvLworICAgLy8gKioqKiBCb3Jyb3dlZCBmcm9tIEx1bmFyR2xhc3MgR0xTTCBCYWNrZW5kCisgICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IEkvTyBzbG90cyAndHlwZScgd291bGQgZmlsbCB1cC4KKyAgIC8vCisgICBpbnQgQ291bnRTbG90cyhjb25zdCBsbHZtOjpUeXBlKiB0eXBlKQorICAgeworICAgICAgaWYgKHR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OlZlY3RvclR5SUQpCisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGVsc2UgaWYgKHR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OkFycmF5VHlJRCkgeworICAgICAgICAgY29uc3QgbGx2bTo6QXJyYXlUeXBlKiBhcnJheVR5cGUgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpBcnJheVR5cGU+KHR5cGUpOworICAgICAgICAgcmV0dXJuIChpbnQpYXJyYXlUeXBlLT5nZXROdW1FbGVtZW50cygpICogQ291bnRTbG90cyhhcnJheVR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOworICAgICAgfSBlbHNlIGlmICh0eXBlLT5nZXRUeXBlSUQoKSA9PSBsbHZtOjpUeXBlOjpTdHJ1Y3RUeUlEKSB7CisgICAgICAgICBjb25zdCBsbHZtOjpTdHJ1Y3RUeXBlKiBzdHJ1Y3RUeXBlID0gbGx2bTo6ZHluX2Nhc3Q8Y29uc3QgbGx2bTo6U3RydWN0VHlwZT4odHlwZSk7CisgICAgICAgICBpbnQgc2xvdHMgPSAwOworICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgZiA9IDA7IGYgPCBzdHJ1Y3RUeXBlLT5nZXRTdHJ1Y3ROdW1FbGVtZW50cygpOyArK2YpCisgICAgICAgICAgICBzbG90cyArPSBDb3VudFNsb3RzKHN0cnVjdFR5cGUtPmdldENvbnRhaW5lZFR5cGUoZikpOworCisgICAgICAgICByZXR1cm4gc2xvdHM7CisgICAgICB9CisKKyAgICAgIHJldHVybiAxOworICAgfQorCisgICAvLyBTYW1wbGVyIHR5cGVzIGdyZXcgdG8gaW5jbHVkZSBpbmNsdWRlIGltYWdlIHR5cGVzIHdpdGggZm9ybWF0cy4gIFdlIGRvbid0IGhhdmUgaW1hZ2Ugc3VwcG9ydCB5ZXQuCisgICBzdGF0aWMgY29uc3QgaW50IE51bVNhbXBsZXJUeXBlcyAgICAgPSA0MDsKKyAgIHN0YXRpYyBjb25zdCBpbnQgTnVtU2FtcGxlckJhc2VUeXBlcyA9IDM7CisgICBzdGF0aWMgY29uc3QgaW50IE51bVNhbXBsZXJEaW1zICAgICAgPSA3OworICAgc3RhdGljIGNvbnN0IGdsc2xfdHlwZSogU2FtcGxlclR5cGVzW051bVNhbXBsZXJUeXBlc11bTnVtU2FtcGxlckJhc2VUeXBlc11bTnVtU2FtcGxlckRpbXNdW3RydWUrMV1bdHJ1ZSsxXTsKKworICAgLy8gQysrIGJlZm9yZSAxMSBkb2Vzbid0IGhhdmUgYSBzdGF0aWNfYXNzZXJ0LiAgVGhpcyBpcyBhIGhhY2sgdG8gcHJvdmlkZQorICAgLy8gb25lLiAgSWYvd2hlbiB0aGlzIGNvZGUgaXMgZXZlciBtaWdyYXRlZCB0byBDKysxMSwgcmVtb3ZlIHRoaXMsIGFuZCB1c2UKKyAgIC8vIHRoZSBsYW5ndWFnZSdzIG5hdGl2ZSBzdGF0aWNfYXNzZXJ0LgorICAgdGVtcGxhdGUgPGJvb2w+IHN0cnVjdCBlcnNhdHpfc3RhdGljX2Fzc2VydDsKKyAgIHRlbXBsYXRlIDw+IHN0cnVjdCBlcnNhdHpfc3RhdGljX2Fzc2VydDx0cnVlPiB7IGJvb2wgdXNlZDsgfTsKKworICAgLy8gSWYgdGhpcyBmYWlscyBkdXJpbmcgY29tcGlsYXRpb24sIGl0IG1lYW5zIEx1bmFyR2xhc3MgaGFzIGFkZGVkIG5ldyBzYW1wbGVyIHR5cGVzCisgICAvLyBXZSBtdXN0IHJlYWN0IHRvLiAgQWxzbywgc2VlIGNvbW1lbnQgYWJvdmUgZXJzYXR6X3N0YXRpY19hc3NlcnQuCisgICBlcnNhdHpfc3RhdGljX2Fzc2VydDxOdW1TYW1wbGVyVHlwZXMgICAgID09IGdsYTo6RU1zQ291bnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXJCYXNlVHlwZXMgPT0gZ2xhOjpFTXNiQ291bnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXJEaW1zICAgICAgPT0gZ2xhOjpFTXNkQ291bnQ+IFNhbXBsZXJUeXBlTWlzbWF0Y2hXaXRoTHVuYXJHbGFzczsKKworICAgLyoqCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICogQ29udmVydCBzYW1wbGVyIHR5cGUgaW5mbyBmcm9tIEx1bmFyR2xhc3MgTWV0YWRhdGEgdG8gZ2xzbF90eXBlCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICovCisgICBjb25zdCBnbHNsX3R5cGUqIEdldFNhbXBsZXJUeXBlKGdsYTo6RU1kU2FtcGxlciBzYW1wbGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xhOjpFTWRTYW1wbGVyQmFzZVR5cGUgYmFzZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsYTo6RU1kU2FtcGxlckRpbSBzYW1wbGVyRGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2hhZG93LCBib29sIGlzQXJyYXkpCisgICB7CisgICAgICAvLyBCb3VuZHMgY2hlY2sgc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgYXJyYXkhICBUaGUgYm9vbHMgY2FuJ3Qgb3ZlcmZsb3cuCisgICAgICBpZiAoc2FtcGxlclR5cGUgPj0gTnVtU2FtcGxlclR5cGVzICAgICB8fAorICAgICAgICAgIGJhc2VUeXBlICAgID49IE51bVNhbXBsZXJCYXNlVHlwZXMgfHwKKyAgICAgICAgICBzYW1wbGVyRGltICA+PSBOdW1TYW1wbGVyRGltcykgeworICAgICAgICAgYXNzZXJ0KDAgJiYgIlNhbXBsZXIgdHlwZSBjb252ZXJzaW9uIGVycm9yIik7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIFNhbXBsZXJUeXBlc1tzYW1wbGVyVHlwZV1bYmFzZVR5cGVdW3NhbXBsZXJEaW1dW2lzU2hhZG93XVtpc0FycmF5XTsKKyAgIH0KKworCisgICAvKioKKyAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgKiBDb252ZXJ0IGludGVycG9sYXRpb24gcXVhbGlmaWVycyB0byBISVIgdmVyc2lvbgorICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAqLworICAgZ2xzbF9pbnRlcnBfcXVhbGlmaWVyIEludGVycG9sYXRpb25RdWFsaWZpZXJUb0lSKGdsYTo6RUludGVycG9sYXRpb25NZXRob2QgaW0pCisgICB7CisgICAgICBzd2l0Y2ggKGltKSB7CisgICAgICBjYXNlIGdsYTo6RUlNTm9wZXJzcGVjdGl2ZTogcmV0dXJuIElOVEVSUF9RVUFMSUZJRVJfTk9QRVJTUEVDVElWRTsKKyAgICAgIGNhc2UgZ2xhOjpFSU1Ob25lOiAgICAgICAgICByZXR1cm4gSU5URVJQX1FVQUxJRklFUl9GTEFUOworICAgICAgY2FzZSBnbGE6OkVJTVNtb290aDogICAgICAgIHJldHVybiBJTlRFUlBfUVVBTElGSUVSX1NNT09USDsKKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URVJQX1FVQUxJRklFUl9OT05FOworICAgICAgfQorICAgfQorCisgICAvKioKKyAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgKiBDb252ZXJ0IHR5cGUgbGF5b3V0IHRvIEhJUiB2ZXJzaW9uCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICovCisgICAgZ2xzbF9pbnRlcmZhY2VfcGFja2luZyBUeXBlTGF5b3V0VG9JUihnbGE6OkVNZFR5cGVMYXlvdXQgbGF5b3V0KQorICAgIHsKKyAgICAgICBzd2l0Y2ggKGxheW91dCkgeworICAgICAgIGNhc2UgZ2xhOjpFTXRsU2hhcmVkOiByZXR1cm4gR0xTTF9JTlRFUkZBQ0VfUEFDS0lOR19TSEFSRUQ7CisgICAgICAgY2FzZSBnbGE6OkVNdGxQYWNrZWQ6IHJldHVybiBHTFNMX0lOVEVSRkFDRV9QQUNLSU5HX1BBQ0tFRDsKKyAgICAgICBjYXNlIGdsYTo6RU10bFN0ZDQzMDogYXNzZXJ0KDAgJiYgIk5vIEhJUiBzdXBwb3J0IHlldCIpOworICAgICAgIGNhc2UgZ2xhOjpFTXRsU3RkMTQwOiAvLyBmYWxsIHRocm91Z2guLi4KKyAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgcmV0dXJuIEdMU0xfSU5URVJGQUNFX1BBQ0tJTkdfU1REMTQwOworICAgICAgIH0KKyAgICB9CisKKworICAgLyoqCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICogQ29udmVydCBibG9jayBtb2RlCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICovCisgICAgaXJfdmFyaWFibGVfbW9kZSBWYXJpYWJsZVF1YWxpZmllclRvSVIoZ2xhOjpFVmFyaWFibGVRdWFsaWZpZXIgcXVhbGlmaWVyKQorICAgIHsKKyAgICAgICAvLyBUT0RPOiBpcl92YXJfc3lzdGVtX3ZhbHVlCisKKyAgICAgICBzd2l0Y2ggKHF1YWxpZmllcikgeworICAgICAgIGNhc2UgZ2xhOjpFVlFVbmlmb3JtOiAgIHJldHVybiBpcl92YXJfdW5pZm9ybTsKKyAgICAgICBjYXNlIGdsYTo6RVZRSW5wdXQ6ICAgICByZXR1cm4gaXJfdmFyX3NoYWRlcl9pbjsKKyAgICAgICBjYXNlIGdsYTo6RVZRT3V0cHV0OiAgICByZXR1cm4gaXJfdmFyX3NoYWRlcl9vdXQ7CisgICAgICAgY2FzZSBnbGE6OkVWUUNvbnN0YW50OiAgcmV0dXJuIGlyX3Zhcl9jb25zdF9pbjsKKyAgICAgICBjYXNlIGdsYTo6RVZRVGVtcG9yYXJ5OiByZXR1cm4gaXJfdmFyX3RlbXBvcmFyeTsKKyAgICAgICBjYXNlIGdsYTo6RVZRR2xvYmFsOiAgICByZXR1cm4gaXJfdmFyX2F1dG87CisgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGlyX3Zhcl9hdXRvOworICAgICAgIH0KKyAgICB9CisKKworICAgLyoqCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICogRGVkdWNlIHdoZXRoZXIgYSBtZXRhZGF0YSBub2RlIElPIG1ldGFkYXRhLCBvciBhZ2dyZWdhdGUuICBEb2VzIG5vdAorICAgICogZ3JvayBvdGhlciBNRCB0eXBlcy4KKyAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0lvTWQoY29uc3QgbGx2bTo6TUROb2RlKiBtZE5vZGUpCisgICAgeworICAgICAgIHJldHVybiBtZE5vZGUgJiYKKyAgICAgICAgICAgICAgbWROb2RlLT5nZXROdW1PcGVyYW5kcygpID4gMyAmJgorICAgICAgICAgICAgICBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpWYWx1ZT4obWROb2RlLT5nZXRPcGVyYW5kKDIpKSAmJgorICAgICAgICAgICAgICBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpNRE5vZGU+KG1kTm9kZS0+Z2V0T3BlcmFuZCgzKSk7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgaXNJb0FnZ3JlZ2F0ZU1kKGNvbnN0IGxsdm06Ok1ETm9kZSogbWROb2RlKQorICAgIHsKKyAgICAgICByZXR1cm4gaXNJb01kKG1kTm9kZSkgJiYgbWROb2RlLT5nZXROdW1PcGVyYW5kcygpID4gNCAmJgorICAgICAgICAgICAgICBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpNRE5vZGU+KG1kTm9kZS0+Z2V0T3BlcmFuZCg0KSk7CisgICAgfQorCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworCituYW1lc3BhY2UgZ2xhIHsKKwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjppbml0U2FtcGxlclR5cGVzKCkKK3sKKyAgIHVzaW5nIG5hbWVzcGFjZSBnbGE7CisgICBtZW1zZXQoU2FtcGxlclR5cGVzLCAwLCBzaXplb2YoU2FtcGxlclR5cGVzKSk7CisKKyAgIFNhbXBsZXJUeXBlTWlzbWF0Y2hXaXRoTHVuYXJHbGFzcy51c2VkID0gdHJ1ZTsgLy8ganVzdCB0byBxdWlldCBhIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHZhcnMKKworICAgLy8gVE9ETzogdmVyaWZ5IHRoZXNlLCBhbmQgZmlsbCBvdXQgYWxsIHR5cGVzCisgICAvLyBUT0RPOiBuZWVkIEVNc0ltYWdlIHR5cGVzIGluIGFkZGl0aW9uIHRvIEVNc1RleHR1cmUKKworICAgLy8gICAgICAgICAgIFRZUEUgICAgICAgIEJBU0VUWVBFICAgRElNICAgICAgICBTSEFET1cgIEFSUkFZICAgIEdMU0xfU0FNUExFUl9UWVBFCisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkZsb2F0XVtFTXNkMURdICAgIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjpzYW1wbGVyMURfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiRmxvYXRdW0VNc2QyRF0gICAgW2ZhbHNlXVtmYWxzZV0gPSBnbHNsX3R5cGU6OnNhbXBsZXIyRF90eXBlOworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JGbG9hdF1bRU1zZDNEXSAgICBbZmFsc2VdW2ZhbHNlXSA9IGdsc2xfdHlwZTo6c2FtcGxlcjNEX3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkZsb2F0XVtFTXNkQ3ViZV0gIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZV90eXBlOworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JGbG9hdF1bRU1zZFJlY3RdICBbZmFsc2VdW2ZhbHNlXSA9IGdsc2xfdHlwZTo6c2FtcGxlcjJEUmVjdF90eXBlOworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JGbG9hdF1bRU1zZEJ1ZmZlcl1bZmFsc2VdW2ZhbHNlXSA9IGdsc2xfdHlwZTo6c2FtcGxlckJ1ZmZlcl90eXBlOworCisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkludF0gIFtFTXNkMURdICAgIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjppc2FtcGxlcjFEX3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkludF0gIFtFTXNkMkRdICAgIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjppc2FtcGxlcjJEX3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkludF0gIFtFTXNkM0RdICAgIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjppc2FtcGxlcjNEX3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkludF0gIFtFTXNkQ3ViZV0gIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjppc2FtcGxlckN1YmVfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiSW50XSAgW0VNc2RSZWN0XSAgW2ZhbHNlXVtmYWxzZV0gPSBnbHNsX3R5cGU6OmlzYW1wbGVyMkRSZWN0X3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkludF0gIFtFTXNkQnVmZmVyXVtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjppc2FtcGxlckJ1ZmZlcl90eXBlOworCisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYlVpbnRdIFtFTXNkMURdICAgIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjp1c2FtcGxlcjFEX3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYlVpbnRdIFtFTXNkMkRdICAgIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjp1c2FtcGxlcjJEX3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYlVpbnRdIFtFTXNkM0RdICAgIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjp1c2FtcGxlcjNEX3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYlVpbnRdIFtFTXNkQ3ViZV0gIFtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjp1c2FtcGxlckN1YmVfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiVWludF0gW0VNc2RSZWN0XSAgW2ZhbHNlXVtmYWxzZV0gPSBnbHNsX3R5cGU6OnVzYW1wbGVyMkRSZWN0X3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYlVpbnRdIFtFTXNkQnVmZmVyXVtmYWxzZV1bZmFsc2VdID0gZ2xzbF90eXBlOjp1c2FtcGxlckJ1ZmZlcl90eXBlOworCisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkZsb2F0XVtFTXNkMURdICAgIFt0cnVlXSBbZmFsc2VdID0gZ2xzbF90eXBlOjpzYW1wbGVyMURTaGFkb3dfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiRmxvYXRdW0VNc2QyRF0gICAgW3RydWVdIFtmYWxzZV0gPSBnbHNsX3R5cGU6OnNhbXBsZXIyRFNoYWRvd190eXBlOworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JGbG9hdF1bRU1zZEN1YmVdICBbdHJ1ZV0gW2ZhbHNlXSA9IGdsc2xfdHlwZTo6c2FtcGxlckN1YmVTaGFkb3dfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiRmxvYXRdW0VNc2RSZWN0XSAgW3RydWVdIFtmYWxzZV0gPSBnbHNsX3R5cGU6OnNhbXBsZXIyRFJlY3RTaGFkb3dfdHlwZTsKKworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JGbG9hdF1bRU1zZDFEXSAgICBbdHJ1ZV0gW3RydWVdICA9IGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlTaGFkb3dfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiRmxvYXRdW0VNc2QyRF0gICAgW3RydWVdIFt0cnVlXSAgPSBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5U2hhZG93X3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkZsb2F0XVtFTXNkQ3ViZV0gIFt0cnVlXSBbdHJ1ZV0gID0gZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZUFycmF5U2hhZG93X3R5cGU7CisKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiSW50XVtFTXNkMURdICAgICAgW2ZhbHNlXVt0cnVlXSAgPSBnbHNsX3R5cGU6OmlzYW1wbGVyMURBcnJheV90eXBlOworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JJbnRdW0VNc2QyRF0gICAgICBbZmFsc2VdW3RydWVdICA9IGdsc2xfdHlwZTo6aXNhbXBsZXIyREFycmF5X3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkludF1bRU1zZEN1YmVdICAgIFtmYWxzZV1bdHJ1ZV0gID0gZ2xzbF90eXBlOjppc2FtcGxlckN1YmVBcnJheV90eXBlOworCisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYlVpbnRdW0VNc2QxRF0gICAgIFtmYWxzZV1bdHJ1ZV0gID0gZ2xzbF90eXBlOjp1c2FtcGxlcjFEQXJyYXlfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiVWludF1bRU1zZDJEXSAgICAgW2ZhbHNlXVt0cnVlXSAgPSBnbHNsX3R5cGU6OnVzYW1wbGVyMkRBcnJheV90eXBlOworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JVaW50XVtFTXNkQ3ViZV0gICBbZmFsc2VdW3RydWVdICA9IGdsc2xfdHlwZTo6dXNhbXBsZXJDdWJlQXJyYXlfdHlwZTsKKworICAgU2FtcGxlclR5cGVzW0VNc1RleHR1cmVdW0VNc2JGbG9hdF1bRU1zZDFEXSAgICBbZmFsc2VdW3RydWVdICA9IGdsc2xfdHlwZTo6c2FtcGxlcjFEQXJyYXlfdHlwZTsKKyAgIFNhbXBsZXJUeXBlc1tFTXNUZXh0dXJlXVtFTXNiRmxvYXRdW0VNc2QyRF0gICAgW2ZhbHNlXVt0cnVlXSAgPSBnbHNsX3R5cGU6OnNhbXBsZXIyREFycmF5X3R5cGU7CisgICBTYW1wbGVyVHlwZXNbRU1zVGV4dHVyZV1bRU1zYkZsb2F0XVtFTXNkQ3ViZV0gIFtmYWxzZV1bdHJ1ZV0gID0gZ2xzbF90eXBlOjpzYW1wbGVyQ3ViZUFycmF5X3R5cGU7Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENsZWFuIHVwCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitNZXNhR2xhc3NUcmFuc2xhdG9yOjp+TWVzYUdsYXNzVHJhbnNsYXRvcigpCit7CisgICB3aGlsZSAoIXRvRGVsZXRlLmVtcHR5KCkpIHsKKyAgICAgIGRlbGV0ZSB0b0RlbGV0ZS5iYWNrKCk7CisgICAgICB0b0RlbGV0ZS5wb3BfYmFjaygpOworICAgfQorfQorCisvLyAqKioqIEJvcnJvd2VkIGZyb20gTHVuYXJHbGFzcyBHTFNMIGJhY2tlbmQ6ICoqKioKKy8vICdnZXAnIGlzIHBvdGVudGlhbGx5IGEgZ2VwLCBlaXRoZXIgYW4gaW5zdHJ1Y3Rpb24gb3IgYSBjb25zdGFudEV4cHIuCisvLyBTZWUgd2hpY2ggb25lLCBpZiBhbnksIGFuZCByZXR1cm4gaXQuCisvLyBSZXR1cm4gMCBpZiBub3QgYSBnZXAuCitjb25zdCBsbHZtOjpHZXRFbGVtZW50UHRySW5zdCogTWVzYUdsYXNzVHJhbnNsYXRvcjo6Z2V0R2VwQXNJbnN0KGNvbnN0IGxsdm06OlZhbHVlKiBnZXApCit7CisgICBjb25zdCBsbHZtOjpHZXRFbGVtZW50UHRySW5zdCogZ2VwSW5zdCA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06OkdldEVsZW1lbnRQdHJJbnN0PihnZXApOworICAgaWYgKGdlcEluc3QpCisgICAgICByZXR1cm4gZ2VwSW5zdDsKKworICAgLy8gTExWTSBpc24ndCBhbHdheXMgY29uc3QgY29ycmVjdC4gIEkgYmVsaWV2ZSBnZXRBc0luc3RydWN0aW9uKCkgZG9lc24ndAorICAgLy8gbW9kaWZ5IHRoZSBvcmlnaW5hbCwgc28gdGhpcyBpcyBzYWZlLgorICAgbGx2bTo6Q29uc3RhbnRFeHByICpjb25zdGFudEdlcCA9IGNvbnN0X2Nhc3Q8bGx2bTo6Q29uc3RhbnRFeHByKj4obGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnRFeHByPihnZXApKTsKKworICAgaWYgKGNvbnN0YW50R2VwKSB7CisgICAgICBjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiAqaW5zdHJ1Y3Rpb24gPSBjb25zdGFudEdlcC0+Z2V0QXNJbnN0cnVjdGlvbigpOworICAgICAgdG9EZWxldGUucHVzaF9iYWNrKGluc3RydWN0aW9uKTsKKyAgICAgIGdlcEluc3QgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpHZXRFbGVtZW50UHRySW5zdD4oaW5zdHJ1Y3Rpb24pOworICAgfQorCisgICByZXR1cm4gZ2VwSW5zdDsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIYW5kbGUgZXJyb3IgbWVzc2FnZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplcnJvcihjb25zdCBjaGFyKiBtc2cpIGNvbnN0Cit7CisgICBpbmZvTG9nICs9ICJFUlJPUjogIjsKKyAgIGluZm9Mb2cgKz0gbXNnOworICAgaW5mb0xvZyArPSAiXG4iOworCisgICBzdGF0ZS0+ZXJyb3IgPSB0cnVlOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGluaXRpYWxpemUgdHJhbnNsYXRpb24gc3RhdGUKKyAqIGNyaWJiZWQgZnJvbSBCb3R0b21Ub0dMU0wKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6c3RhcnQobGx2bTo6TW9kdWxlJiBtb2R1bGUpCit7CisgICBjb3VudFJlZmVyZW5jZXMobW9kdWxlKTsKKworICAgaW50IG1kSW50OworICAgc3dpdGNoKEVTaExhbmd1YWdlKG1hbmFnZXItPmdldFN0YWdlKCkpKSB7CisgICBjYXNlIEVTaExhbmdWZXJ0ZXg6CisgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgRVNoTGFuZ0dlb21ldHJ5OgorCisgICAgICAgLy8gaW5wdXQgcHJpbWl0aXZlcyBhcmUgbm90IG9wdGlvbmFsCisgICAgICAgc3RhdGUtPmdzX2lucHV0X3ByaW1fdHlwZV9zcGVjaWZpZWQgPSB0cnVlOworCisgICAgICAgc3dpdGNoIChHZXRNZE5hbWVkSW50KG1vZHVsZSwgZ2xhOjpJbnB1dFByaW1pdGl2ZU1kTmFtZSkpIHsKKyAgICAgICBjYXNlIEVNbGdQb2ludHM6CisgICAgICAgICAgIHN0YXRlLT5pbl9xdWFsaWZpZXItPnByaW1fdHlwZSA9IEdMX1BPSU5UUzsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBFTWxnTGluZXM6CisgICAgICAgICAgIHN0YXRlLT5pbl9xdWFsaWZpZXItPnByaW1fdHlwZSA9IEdMX0xJTkVTOworICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIEVNbGdMaW5lc0FkamFjZW5jeToKKyAgICAgICAgICAgc3RhdGUtPmluX3F1YWxpZmllci0+cHJpbV90eXBlID0gR0xfTElORVNfQURKQUNFTkNZOworICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIEVNbGdUcmlhbmdsZXM6CisgICAgICAgICAgIHN0YXRlLT5pbl9xdWFsaWZpZXItPnByaW1fdHlwZSA9IEdMX1RSSUFOR0xFUzsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBFTWxnVHJpYW5nbGVzQWRqYWNlbmN5OgorICAgICAgICAgICBzdGF0ZS0+aW5fcXVhbGlmaWVyLT5wcmltX3R5cGUgPSBHTF9UUklBTkdMRVNfQURKQUNFTkNZOworICAgICAgICAgICBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICBhc3NlcnQoMCAmJiAiVW5rbm93biBnZW9tZXRyeSBzaGFkZXIgaW5wdXQgcHJpbWl0aXZlIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIC8vIGludm9jYXRpb25zIGlzIG9wdGlvbmFsCisgICAgICAgbWRJbnQgPSBHZXRNZE5hbWVkSW50KG1vZHVsZSwgZ2xhOjpJbnZvY2F0aW9uc01kTmFtZSk7CisgICAgICAgaWYgKG1kSW50KSB7CisgICAgICAgICAgIHN0YXRlLT5pbl9xdWFsaWZpZXItPmZsYWdzLnEuaW52b2NhdGlvbnMgPSB0cnVlOworICAgICAgICAgICBzdGF0ZS0+aW5fcXVhbGlmaWVyLT5pbnZvY2F0aW9ucyA9IG1kSW50OworICAgICAgIH0KKworICAgICAgIC8vIG91dHB1dCBwcmltaXRpdmVzIGFyZSBub3Qgb3B0aW9uYWwKKyAgICAgICBzdGF0ZS0+b3V0X3F1YWxpZmllci0+ZmxhZ3MucS5wcmltX3R5cGUgPSB0cnVlOworCisgICAgICAgc3dpdGNoIChHZXRNZE5hbWVkSW50KG1vZHVsZSwgZ2xhOjpPdXRwdXRQcmltaXRpdmVNZE5hbWUpKSB7CisgICAgICAgY2FzZSBFTWxnUG9pbnRzOgorICAgICAgICAgICBzdGF0ZS0+b3V0X3F1YWxpZmllci0+cHJpbV90eXBlID0gR0xfUE9JTlRTOworICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIEVNbGdMaW5lU3RyaXA6CisgICAgICAgICAgIHN0YXRlLT5vdXRfcXVhbGlmaWVyLT5wcmltX3R5cGUgPSBHTF9MSU5FX1NUUklQOworICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIEVNbGdUcmlhbmdsZVN0cmlwOgorICAgICAgICAgICBzdGF0ZS0+b3V0X3F1YWxpZmllci0+cHJpbV90eXBlID0gR0xfVFJJQU5HTEVfU1RSSVA7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIGFzc2VydCgwICYmICJVbmtub3duIGdlb21ldHJ5IHNoYWRlciBvdXRwdXQgcHJpbWl0aXZlIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIC8vIG1heF92ZXJ0aWNlcyBpcyBub3Qgb3B0aW9uYWwKKyAgICAgICBzdGF0ZS0+b3V0X3F1YWxpZmllci0+ZmxhZ3MucS5tYXhfdmVydGljZXMgPSB0cnVlOworICAgICAgIHN0YXRlLT5vdXRfcXVhbGlmaWVyLT5tYXhfdmVydGljZXMgPSBHZXRNZE5hbWVkSW50KG1vZHVsZSwgZ2xhOjpOdW1WZXJ0aWNlc01kTmFtZSk7CisKKyAgICAgICBicmVhazsKKworICAgY2FzZSBFU2hMYW5nRnJhZ21lbnQ6CisKKyAgICAgIGlmIChHZXRNZE5hbWVkSW50KG1vZHVsZSwgUGl4ZWxDZW50ZXJJbnRlZ2VyTWROYW1lKSkKKyAgICAgICAgIHN0YXRlLT5mc19waXhlbF9jZW50ZXJfaW50ZWdlciA9IDE7CisgICAgICBlbHNlCisgICAgICAgICBzdGF0ZS0+ZnNfcGl4ZWxfY2VudGVyX2ludGVnZXIgPSAwOworCisgICAgICBpZiAoR2V0TWROYW1lZEludChtb2R1bGUsIE9yaWdpblVwcGVyTGVmdE1kTmFtZSkpCisgICAgICAgICBzdGF0ZS0+ZnNfb3JpZ2luX3VwcGVyX2xlZnQgPSAxOworICAgICAgZWxzZQorICAgICAgICAgc3RhdGUtPmZzX29yaWdpbl91cHBlcl9sZWZ0ID0gMDsKKworICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICAgYXNzZXJ0KDAgJiYgIlVuc3VwcG9ydGVkIHN0YWdlIik7CisgICAgICAgYnJlYWs7CisgICB9Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaW5pdGlhbGl6ZSB0cmFuc2xhdGlvbiBzdGF0ZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjppbml0aWFsaXplVHJhbnNsYXRpb24oZ2xfY29udGV4dCAqY3R4LCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgZ2xfc2hhZGVyICpzaGFkZXIpCit7CisgICBpbmZvTG9nLmNsZWFyKCk7CisKKyAgIHNldENvbnRleHQoY3R4KTsKKyAgIHNldFBhcnNlU3RhdGUoc3RhdGUpOworICAgc2V0U2hhZGVyKHNoYWRlcik7CisKKyAgIHJhbGxvY19mcmVlKHNoYWRlci0+aXIpOworICAgc2hhZGVyLT5pciA9IG5ldyhzaGFkZXIpIGV4ZWNfbGlzdDsKKworICAgX21lc2FfZ2xzbF9pbml0aWFsaXplX3R5cGVzKHN0YXRlKTsKKyAgIF9tZXNhX2dsc2xfaW5pdGlhbGl6ZV92YXJpYWJsZXMoc2hhZGVyLT5pciwgc3RhdGUpOworCisgICAvLyBTZWVkIG91ciBnbG9iYWxEZWNsTWFwIHdpdGggd2hhdGV2ZXIgX21lc2FfZ2xzbF9pbml0aWFsaXplX3ZhcmlhYmxlcyBkaWQuCisgICBzZWVkR2xvYmFsRGVjbE1hcCgpOworCisgICBzdGF0ZS0+c3ltYm9scy0+c2VwYXJhdGVfZnVuY3Rpb25fbmFtZXNwYWNlID0gc3RhdGUtPmxhbmd1YWdlX3ZlcnNpb24gPT0gMTEwOworCisgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7CisKKyAgIHN0YXRlLT50b3BsZXZlbF9pciA9IHNoYWRlci0+aXI7CisKKyAgIGluc3RydWN0aW9uU3RhY2sucHVzaF9iYWNrKHNoYWRlci0+aXIpOworCisgICBzdGF0ZS0+Z3NfaW5wdXRfcHJpbV90eXBlX3NwZWNpZmllZCA9IGZhbHNlOworICAgc3RhdGUtPmNzX2lucHV0X2xvY2FsX3NpemVfc3BlY2lmaWVkID0gZmFsc2U7CisKKyAgIC8qIFNlY3Rpb24gNC4yIG9mIHRoZSBHTFNMIDEuMjAgc3BlY2lmaWNhdGlvbiBzdGF0ZXM6CisgICAgKiAiVGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBhcmUgc2NvcGVkIGluIGEgc2NvcGUgb3V0c2lkZSB0aGUgZ2xvYmFsIHNjb3BlCisgICAgKiAgdXNlcnMgZGVjbGFyZSBnbG9iYWwgdmFyaWFibGVzIGluLiAgVGhhdCBpcywgYSBzaGFkZXIncyBnbG9iYWwgc2NvcGUsCisgICAgKiAgYXZhaWxhYmxlIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZCBnbG9iYWwgdmFyaWFibGVzLCBpcyBuZXN0ZWQKKyAgICAqICBpbnNpZGUgdGhlIHNjb3BlIGNvbnRhaW5pbmcgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucy4iCisgICAgKgorICAgICogU2luY2UgYnVpbHQtaW4gZnVuY3Rpb25zIGxpa2UgZnRyYW5zZm9ybSgpIGFjY2VzcyBidWlsdC1pbiB2YXJpYWJsZXMsCisgICAgKiBpdCBmb2xsb3dzIHRoYXQgdGhvc2UgbXVzdCBiZSBpbiB0aGUgb3V0ZXIgc2NvcGUgYXMgd2VsbC4KKyAgICAqCisgICAgKiBXZSBwdXNoIHNjb3BlIGhlcmUgdG8gY3JlYXRlIHRoaXMgbmVzdGluZyBlZmZlY3QuLi5idXQgZG9uJ3QgcG9wLgorICAgICogVGhpcyB3YXksIGEgc2hhZGVyJ3MgZ2xvYmFscyBhcmUgc3RpbGwgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdXNlCisgICAgKiBieSB0aGUgbGlua2VyLgorICAgICovCisgICBzdGF0ZS0+c3ltYm9scy0+cHVzaF9zY29wZSgpOworCisgICAvLyBJbml0aWFsaXplIGJ1aWx0aW4gZnVuY3Rpb25zIHdlIG1pZ2h0IHVzZSAodHggc2FtcGxpbmcsIGV0YykKKyAgIF9tZXNhX2dsc2xfaW5pdGlhbGl6ZV9idWlsdGluX2Z1bmN0aW9ucygpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZpbmFsaXplIHRyYW5zbGF0aW9uIHN0YXRlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmZpbmFsaXplVHJhbnNsYXRpb24oKQoreworICAgLyogRmlndXJlIG91dCBpZiBnbF9GcmFnQ29vcmQgaXMgYWN0dWFsbHkgdXNlZCBpbiBmcmFnbWVudCBzaGFkZXIgKi8KKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSBzdGF0ZS0+c3ltYm9scy0+Z2V0X3ZhcmlhYmxlKCJnbF9GcmFnQ29vcmQiKTsKKyAgIGlmICh2YXIgIT0gTlVMTCkKKyAgICAgIHN0YXRlLT5mc191c2VzX2dsX2ZyYWdjb29yZCA9IHZhci0+ZGF0YS51c2VkOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNlZWQgdGhlIGdsb2JhbCBkZWNsYXJhdGlvbiBtYXAgZnJvbSB0aGUgaW5pdGlhbCBkZWNsYXJhdGlvbnMKKyAqIGZyb20gX21lc2FfZ2xzbF9pbml0aWFsaXplX3ZhcmlhYmxlcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6c2VlZEdsb2JhbERlY2xNYXAoKQoreworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgc2hhZGVyLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICh2YXIpCisgICAgICAgICBnbG9iYWxEZWNsTWFwW3Zhci0+bmFtZV0gPSB2YXI7CisgICB9Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV2UgY291bnQgdGhlIHJlZmVyZW5jZXMgb2YgZWFjaCBsdmFsdWUsIHRvIGtub3cgd2hlbiB0byBnZW5lcmF0ZQorICogYXNzaWdubWVudHMgYW5kIHdoZW4gdG8gZGlyZWN0bHkgY3JlYXRlIHRyZWUgbm9kZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6Y291bnRSZWZlcmVuY2VzKGNvbnN0IGxsdm06Ok1vZHVsZSYgbW9kdWxlKQoreworICAgdXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKyAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZnVuY3Rpb25zIGluIG1vZHVsZQorICAgZm9yIChNb2R1bGU6OmNvbnN0X2l0ZXJhdG9yIGZ1bmMgPSBtb2R1bGUuYmVnaW4oKTsgZnVuYyAhPSBtb2R1bGUuZW5kKCk7ICsrZnVuYykgeworICAgICAgZm9yIChGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IgYmxvY2sgPSBmdW5jLT5iZWdpbigpOyBibG9jayAhPSBmdW5jLT5lbmQoKTsgKytibG9jaykgeworICAgICAgICAgZm9yIChCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBpbnN0ID0gYmxvY2stPmJlZ2luKCk7IGluc3QgIT0gYmxvY2stPmVuZCgpOyArK2luc3QpIHsKKworICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB3aGljaCBsb2NhbCB2YWx1ZXMgc2hvdWxkIGJlIHNpZ25lZCBpbnRzCisgICAgICAgICAgICBzd2l0Y2ggKCgmKmluc3QpLT5nZXRPcGNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6WkV4dDogICAvLyBmYWxsIHRocm91Z2guLi4KKyAgICAgICAgICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkZQVG9TSTogc2ludFZhbHVlcy5pbnNlcnQoJippbnN0KTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OlNJVG9GUDogc2ludFZhbHVlcy5pbnNlcnQoKCYqaW5zdCktPmdldE9wZXJhbmQoMCkpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OlNSZW06ICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICAgICAgICAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpTRGl2OgorICAgICAgICAgICAgICAgc2ludFZhbHVlcy5pbnNlcnQoKCYqaW5zdCkpOworICAgICAgICAgICAgICAgc2ludFZhbHVlcy5pbnNlcnQoKCYqaW5zdCktPmdldE9wZXJhbmQoMCkpOworICAgICAgICAgICAgICAgc2ludFZhbHVlcy5pbnNlcnQoKCYqaW5zdCktPmdldE9wZXJhbmQoMSkpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvcGVyYW5kcyBpbiB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgIGZvciAoVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3Igb3AgPSBpbnN0LT5vcF9iZWdpbigpLCBvcEVuZCA9IGluc3QtPm9wX2VuZCgpOworICAgICAgICAgICAgICAgICBvcCAhPSBvcEVuZDsgKytvcCkgeworCisgICAgICAgICAgICAgICByZWZDb3VudE1hcFsqb3BdKys7CisKKyAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBvcEluc3QgPSBkeW5fY2FzdDxsbHZtOjpJbnN0cnVjdGlvbj4ob3ApOworCisgICAgICAgICAgICAgICAvLyBJZiBkZWZpbmVkIGluIGRpZmZlcmVudCBibG9jayB0aGFuIHRoaXMgdXNlLCBmb3JjZSByZWZjb3VudCBsYXJnZQorICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbW92ZSB0aGUgY29kZSBhY3Jvc3MgZmxvdyBjb250cm9sLgorICAgICAgICAgICAgICAgaWYgKG9wSW5zdCAmJiBvcEluc3QtPmdldFBhcmVudCgpICE9IGluc3QtPmdldFBhcmVudCgpKQorICAgICAgICAgICAgICAgICAgcmVmQ291bnRNYXBbKm9wXSA9IDY1NTM2OworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvLyBGb3IgZGVidWdnaW5nOiBjaGFuZ2UgdG8gdHJ1ZSB0byBkdW1wIHJlZiBjb3VudHMKKyAgIHN0YXRpYyBjb25zdCBib29sIGRlYnVnUmVmZXJlbmNlQ291bnRzID0gZmFsc2U7CisKKyAgIGlmIChkZWJ1Z1JlZmVyZW5jZUNvdW50cykgeworICAgICAgRklMRSogb3V0ID0gc3RkZXJyOworICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBuYW1lU3RyZWFtKG5hbWUpOworCisgICAgICBmcHJpbnRmKG91dCwgIlJWYWx1ZSBSZWYgQ291bnRzXG4lLTEwcyA6ICUzc1xuIiwKKyAgICAgICAgICAgICAgIlJWYWx1ZSIsICIjIik7CisKKyAgICAgIGZvciAodFJlZkNvdW50TWFwOjpjb25zdF9pdGVyYXRvciByZWYgPSByZWZDb3VudE1hcC5iZWdpbigpOworICAgICAgICAgICByZWYgIT0gcmVmQ291bnRNYXAuZW5kKCk7ICsrcmVmKSB7CisgICAgICAgICBuYW1lLmNsZWFyKCk7CisgICAgICAgICAvLyByZWYtPmZpcnN0LT5wcmludEFzT3BlcmFuZChuYW1lU3RyZWFtKTsKKyAgICAgICAgIGZwcmludGYob3V0LCAiJS0xMHMgOiAlM2RcbiIsIHJlZi0+Zmlyc3QtPmdldE5hbWUoKS5zdHIoKS5jX3N0cigpLCByZWYtPnNlY29uZCk7CisgICAgICB9CisgICB9Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIHZhbHVlTWFwIGVudHJ5IGZvciB0aGlzIExMVk0gdmFsdWUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSBib29sIE1lc2FHbGFzc1RyYW5zbGF0b3I6OnZhbHVlRW50cnlFeGlzdHMoY29uc3QgbGx2bTo6VmFsdWUqIHZhbHVlKSBjb25zdAoreworICAgcmV0dXJuIHZhbHVlTWFwLmZpbmQodmFsdWUpICE9IHZhbHVlTWFwLmVuZCgpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldHVybiByZWYgY291bnQgb2YgYW4gcnZhbHVlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2lubGluZSB1bnNpZ25lZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjpnZXRSZWZDb3VudChjb25zdCBsbHZtOjpWYWx1ZSogdmFsdWUpIGNvbnN0Cit7CisgICBjb25zdCB0UmVmQ291bnRNYXA6OmNvbnN0X2l0ZXJhdG9yIGZvdW5kID0gcmVmQ291bnRNYXAuZmluZCh2YWx1ZSk7CisKKyAgIC8vIFJldHVybiAwIGlmIG5vdCBmb3VuZCwgZWxzZSB0aGUgcmVmY291bnQKKyAgIHJldHVybiBmb3VuZCA9PSByZWZDb3VudE1hcC5lbmQoKSA/IDAgOiBmb3VuZC0+c2Vjb25kOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVuY2Fwc3VsYXRlIGNyZWF0aW9uIG9mIHZhcmlhYmxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIGlyX3ZhcmlhYmxlKgorTWVzYUdsYXNzVHJhbnNsYXRvcjo6bmV3SVJWYXJpYWJsZShjb25zdCBnbHNsX3R5cGUqIHR5cGUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBib29sIGRlY2xhcmUpCit7CisgICAvLyBJZiB3ZSBoYXZlIGEgZ2xvYmFsIGRlY2wsIHVzZSB0aGF0LiAgSElSIGZvcm0gZXhwZWN0cyB1c2Ugb2YgdGhlIHNhbWUKKyAgIC8vIGlyX3ZhcmlhYmxlIG5vZGUgYXMgdGhlIGdsb2JhbCBkZWNsIHVzZWQuCisgICBjb25zdCB0R2xvYmFsRGVjbE1hcDo6Y29uc3RfaXRlcmF0b3IgZ2xvYmFsRGVjbCA9IGdsb2JhbERlY2xNYXAuZmluZChuYW1lKTsKKyAgIGlmIChnbG9iYWxEZWNsICE9IGdsb2JhbERlY2xNYXAuZW5kKCkpCisgICAgICByZXR1cm4gZ2xvYmFsRGVjbC0+c2Vjb25kOworCisgICAvLyBpcl92YXJpYWJsZSBjb25zdHJ1Y3RvciBzdHJkdXBzIHRoZSBuYW1lLCBzbyBpdCdzIE9LIGlmIGl0IHBvaW50cyB0byBzb21ldGhpbmcgZXBoZW1lcmFsCisgICBpcl92YXJpYWJsZSogdmFyID0gbmV3KHNoYWRlcikgaXJfdmFyaWFibGUodHlwZSwgbmFtZSwgaXJfdmFyaWFibGVfbW9kZShtb2RlKSk7CisgICB2YXItPmRhdGEudXNlZCA9IHRydWU7CisKKyAgIC8vIFRPRE86IGhhbmRsZSBpbnRlcnBvbGF0aW9uIG1vZGVzLCBsb2NhdGlvbnMsIHByZWNpc2lvbnMsIGV0YyBldGMgZXRjCisgICAvLyAgICAgICBwb2tlIHRoZW0gaW50byB0aGUgcmlnaHQgYml0cyBpbiB0aGUgaXJfdmFyaWFibGUKKyAgIC8vIHZhci0+ZGF0YS5jZW50cm9pZCA9CisgICAvLyB2YXItPmRhdGEuc2FtcGxlID0KKyAgIC8vIHZhci0+ZGF0YS5xLioKKyAgIC8vIHZhci0+ZGF0YS5pbnZhcmlhbnQKKyAgIC8vIHZhci0+ZGF0YS5iaW5kaW5nCisgICAvLyB2YXItPmRhdGEudmFyeWluZworICAgLy8gdmFyLT5kYXRhLmhvd19kZWNsYXJlZCA9IGlyX3Zhcl9kZWNsYXJlZF9ub3JtYWxseTsKKworICAgLy8gVE9ETzogYWxzbyBzZXQgZm9yIGNvbnN0cyBhbmQgdmVydGV4IGF0dHJzIHBlciBjb21tZW50IGlyLmg6MTUzPworICAgY29uc3QgYm9vbCByZWFkT25seSA9IChtb2RlID09IGlyX3Zhcl91bmlmb3JtKTsKKyAgIGlmIChyZWFkT25seSkKKyAgICAgIHZhci0+ZGF0YS5yZWFkX29ubHkgPSB0cnVlOworCisgICAvLyBUT0RPOiBUbyBhdm9pZCByZWRlY2xhcmluZyBidWlsdGlucywgd2UgaGF2ZSBhIGhhY2sgdG8gbG9vayBhdCB0aGUgbmFtZS4KKyAgIC8vIFNvbWV0aGluZyBiZXR0ZXIgc2hvdWxkIGJlIGRvbmUgaGVyZS4gIEJlY2F1c2Ugb2Ygc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uLAorICAgLy8gdGhpcyBpcyBzYWZlIGFnYWluc3QgbmFtZSBzdHJpbmdzIHRoYXQgYXJlbid0IDMgY2hhcmFjdGVycyBsb25nLgorICAgY29uc3QgYm9vbCBpc0J1aWx0aW4gPSBuYW1lICYmIG5hbWVbMF0gPT0gJ2cnICYmIG5hbWVbMV0gPT0gJ2wnICYmIG5hbWVbMl0gPT0gJ18nOworCisgICAvLyBEZWNsYXJlIHRoZSB2YXJpYWJsZSBieSBhZGRpbmcgaXQgYXMgZWl0aGVyIGEgZ2xvYmFsIG9yIGxvY2FsIHRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0CisgICBjb25zdCBib29sIGdsb2JhbCA9IChtb2RlID09IGlyX3Zhcl91bmlmb3JtICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBpcl92YXJfc2hhZGVyX291dCk7CisKKyAgIGlmICghaXNCdWlsdGluICYmICghZ2xvYmFsIHx8IGRlY2xhcmUpKQorICAgICAgYWRkSVJJbnN0cnVjdGlvbih2YXIsIGdsb2JhbCk7CisKKyAgIC8vIERlY2xhcmUgZ2xvYmFscyBpbiB0aGUgZ2xvYmFsIGRlY2wgbWFwCisgICBpZiAoZGVjbGFyZSkKKyAgICAgIGdsb2JhbERlY2xNYXBbbmFtZV0gPSB2YXI7CisKKyAgIHJldHVybiB2YXI7Cit9CisKK2lubGluZSBpcl92YXJpYWJsZSoKK01lc2FHbGFzc1RyYW5zbGF0b3I6Om5ld0lSVmFyaWFibGUoY29uc3QgZ2xzbF90eXBlKiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSkKK3sKKyAgIHJldHVybiBuZXdJUlZhcmlhYmxlKHR5cGUsIG5hbWUuY19zdHIoKSwgbW9kZSwgZGVjbGFyZSk7Cit9CisKK2lubGluZSBpcl92YXJpYWJsZSoKK01lc2FHbGFzc1RyYW5zbGF0b3I6Om5ld0lSVmFyaWFibGUoY29uc3QgbGx2bTo6VHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgYm9vbCBkZWNsYXJlKQoreworICAgcmV0dXJuIG5ld0lSVmFyaWFibGUobGx2bVR5cGVUb0hpclR5cGUodHlwZSwgMCwgdmFsdWUpLCBuYW1lLCBtb2RlLCBkZWNsYXJlKTsKK30KKworaW5saW5lIGlyX3ZhcmlhYmxlKgorTWVzYUdsYXNzVHJhbnNsYXRvcjo6bmV3SVJWYXJpYWJsZShjb25zdCBsbHZtOjpUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpWYWx1ZSogdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSkKK3sKKyAgIHJldHVybiBuZXdJUlZhcmlhYmxlKGxsdm1UeXBlVG9IaXJUeXBlKHR5cGUsIDAsIHZhbHVlKSwgbmFtZS5jX3N0cigpLCBtb2RlLCBkZWNsYXJlKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbmNhcHN1bGF0ZSBjcmVhdGlvbiBvZiB2YXJpYWJsZSBkZXJlZmVyZW5jZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIGlyX2RlcmVmZXJlbmNlKgorTWVzYUdsYXNzVHJhbnNsYXRvcjo6bmV3SVJWYXJpYWJsZURlcmVmKGNvbnN0IGdsc2xfdHlwZSogdHlwZSwgY29uc3QgY2hhciogbmFtZSwgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSkKK3sKKyAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShuZXdJUlZhcmlhYmxlKHR5cGUsIG5hbWUsIG1vZGUsIGRlY2xhcmUpKTsKK30KKworaW5saW5lIGlyX2RlcmVmZXJlbmNlKgorTWVzYUdsYXNzVHJhbnNsYXRvcjo6bmV3SVJWYXJpYWJsZURlcmVmKGNvbnN0IGdsc2xfdHlwZSogdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBtb2RlLCBib29sIGRlY2xhcmUpCit7CisgICByZXR1cm4gbmV3SVJWYXJpYWJsZURlcmVmKHR5cGUsIG5hbWUuY19zdHIoKSwgbW9kZSwgZGVjbGFyZSk7Cit9CisKK2lubGluZSBpcl9kZXJlZmVyZW5jZSoKK01lc2FHbGFzc1RyYW5zbGF0b3I6Om5ld0lSVmFyaWFibGVEZXJlZihjb25zdCBsbHZtOjpUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlZhbHVlKiB2YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlKQoreworICAgcmV0dXJuIG5ld0lSVmFyaWFibGVEZXJlZihsbHZtVHlwZVRvSGlyVHlwZSh0eXBlLCAwLCB2YWx1ZSksIG5hbWUsIG1vZGUsIGRlY2xhcmUpOworfQorCitpbmxpbmUgaXJfZGVyZWZlcmVuY2UqCitNZXNhR2xhc3NUcmFuc2xhdG9yOjpuZXdJUlZhcmlhYmxlRGVyZWYoY29uc3QgbGx2bTo6VHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpWYWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSkKK3sKKyAgIHJldHVybiBuZXdJUlZhcmlhYmxlRGVyZWYobGx2bVR5cGVUb0hpclR5cGUodHlwZSwgMCwgdmFsdWUpLCBuYW1lLmNfc3RyKCksIG1vZGUsIGRlY2xhcmUpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgSVIgdGV4dHVyZSBpbnRyaW5zaWNzCisgKiAgIChkZWNsYXJlICh1bmlmb3JtICkgc2FtcGxlcjJEIERpZmZ1c2UpCisgKiAgIChjYWxsIHRleHR1cmUgKHZhcl9yZWYgdGV4dHVyZV9yZXR2YWwpICAoKHZhcl9yZWYgRGlmZnVzZSkgKHZhcl9yZWYgVlRleGNvb3JkKSApKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIHZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6ZW1pdElSVGV4dHVyZShjb25zdCBsbHZtOjpJbnRyaW5zaWNJbnN0KiBsbHZtSW5zdCwgYm9vbCBnYXRoZXIpCit7CisgICBjb25zdCB1bnNpZ25lZCB0ZXhGbGFncyAgICAgICAgPSBHZXRDb25zdGFudEludChsbHZtSW5zdC0+Z2V0T3BlcmFuZChHZXRUZXh0dXJlT3BJbmRleChFVE9GbGFnKSkpOworICAgY29uc3QgbGx2bTo6VmFsdWUqIHNhbXBsZXJUeXBlID0gbGx2bUluc3QtPmdldE9wZXJhbmQoMCk7CisKKyAgIHN0ZDo6c3RyaW5nIHR4TmFtZTsKKyAgIHR4TmFtZS5yZXNlcnZlKDIwKTsKKworICAgLy8gT3JpZ2luYWwgc3R5bGUgc2hhZG93aW5nIHJldHVybnMgdmVjNCB3aGlsZSAybmQgZ2VuZXJhdGlvbiByZXR1cm5zIGZsb2F0LAorICAgLy8gc28sIGhhdmUgdG8gc3RpY2sgdG8gb2xkLXN0eWxlIGZvciB0aG9zZSBjYXNlcy4KKyAgIGNvbnN0IGJvb2wgZm9yY2VPbGRTdHlsZSA9IElzVmVjdG9yKGxsdm1JbnN0LT5nZXRUeXBlKCkpICYmICh0ZXhGbGFncyAmIEVURlNoYWRvdykgJiYgKCh0ZXhGbGFncyAmIEVURkdhdGhlcikgPT0gMCk7CisKKyAgIGlmIChzdGF0ZS0+bGFuZ3VhZ2VfdmVyc2lvbiA+PSAxMzAgJiYgIWZvcmNlT2xkU3R5bGUpIHsKKyAgICAgIGlmICh0ZXhGbGFncyAmIEVURkZldGNoKQorICAgICAgICAgdHhOYW1lID0gInRleGVsRmV0Y2giOworICAgICAgZWxzZQorICAgICAgICAgdHhOYW1lID0gInRleHR1cmUiOworICAgfSBlbHNlIHsKKyAgICAgIGlmICh0ZXhGbGFncyAmIEVURlNoYWRvdykKKyAgICAgICAgIHR4TmFtZSA9ICJzaGFkb3ciOworICAgICAgZWxzZQorICAgICAgICAgdHhOYW1lID0gInRleHR1cmUiOworCisgICAgICBjb25zdCBpbnQgc2FtcGxlciA9IEdldENvbnN0YW50SW50KHNhbXBsZXJUeXBlKTsKKworICAgICAgc3dpdGNoIChzYW1wbGVyKSB7CisgICAgICBjYXNlIEVTYW1wbGVyMUQ6ICAgICAgICB0eE5hbWUgKz0gIjFEIjsgICAgIGJyZWFrOworICAgICAgY2FzZSBFU2FtcGxlcjJEOiAgICAgICAgdHhOYW1lICs9ICIyRCI7ICAgICBicmVhazsKKyAgICAgIGNhc2UgRVNhbXBsZXIzRDogICAgICAgIHR4TmFtZSArPSAiM0QiOyAgICAgYnJlYWs7CisgICAgICBjYXNlIEVTYW1wbGVyQ3ViZTogICAgICB0eE5hbWUgKz0gIkN1YmUiOyAgIGJyZWFrOworICAgICAgY2FzZSBFU2FtcGxlcjJEUmVjdDogICAgdHhOYW1lICs9ICIyRFJlY3QiOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGVycm9yKCJVbmV4cGVjdGVkIHNhbXBsZXIgdHlwZSIpOyAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGlmICh0ZXhGbGFncyAmIEVURlByb2plY3RlZCkKKyAgICAgIHR4TmFtZSArPSAiUHJvaiI7CisKKyAgIC8vIFRoaXMgaXMgT0sgb24gdGhlIHN0YWNrLCBiZWNhdXNlIHRoZSBpcl9jYWxsIGNvbnN0cnVjdG9yIHdpbGwgbW92ZSBvdXQgb2YgaXQuCisgICBleGVjX2xpc3QgcGFyYW1ldGVyczsKKworICAgLy8gU2FtcGxlciBvcGVyYW5kCisgICBwYXJhbWV0ZXJzLnB1c2hfdGFpbChnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKEdldFRleHR1cmVPcEluZGV4KEVUT1NhbXBsZXJMb2MpKSkpOworCisgICAvLyBDb29yZGluYXRlCisgICBwYXJhbWV0ZXJzLnB1c2hfdGFpbChnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKEdldFRleHR1cmVPcEluZGV4KEVUT0Nvb3JkKSkpKTsKKworICAgLy8gUmVmWgorICAgaWYgKHRleEZsYWdzICYgRVRGUmVmWkFyZykgeworICAgICAgcGFyYW1ldGVycy5wdXNoX3RhaWwoZ2V0SVJWYWx1ZShsbHZtSW5zdC0+Z2V0T3BlcmFuZChHZXRUZXh0dXJlT3BJbmRleChFVE9SZWZaKSkpKTsKKyAgIH0KKworICAgLy8gTE9ECisgICBpZiAodGV4RmxhZ3MgJiBFVEZMb2QpIHsKKyAgICAgIHR4TmFtZSArPSAiTG9kIjsKKyAgICAgIHBhcmFtZXRlcnMucHVzaF90YWlsKGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoR2V0VGV4dHVyZU9wSW5kZXgoRVRPQmlhc0xvZCkpKSk7CisgICB9CisKKyAgIC8vIGRQZFgvZFBkWQorICAgaWYgKElzR3JhZGllbnRUZXhJbnN0KGxsdm1JbnN0KSkgeworICAgICAgdHhOYW1lICs9ICJHcmFkQVJCIjsKKyAgICAgIHBhcmFtZXRlcnMucHVzaF90YWlsKGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoR2V0VGV4dHVyZU9wSW5kZXgoRVRPRFBkeCkpKSk7CisgICAgICBwYXJhbWV0ZXJzLnB1c2hfdGFpbChnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKEdldFRleHR1cmVPcEluZGV4KEVUT0RQZHkpKSkpOworICAgfQorCisgICBpZiAodGV4RmxhZ3MgJiBFVEZHYXRoZXIpIHsKKyAgICAgIHR4TmFtZSArPSAiR2F0aGVyIjsKKyAgIH0KKworICAgLy8gT2Zmc2V0cworICAgaWYgKHRleEZsYWdzICYgRVRGT2Zmc2V0QXJnKSB7CisgICAgICBpZiAodGV4RmxhZ3MgJiBFVEZPZmZzZXRzKSB7CisgICAgICAgICBhc3NlcnQoMCAmJiAiVE9ETzogSGFuZGxlIG9mZnNldHMiKTsgLy8gVE9ETzsKKyAgICAgICAgIHR4TmFtZSArPSAiT2Zmc2V0cyI7CisgICAgICB9IGVsc2UgeworICAgICAgICAgdHhOYW1lICs9ICJPZmZzZXQiOworICAgICAgICAgcGFyYW1ldGVycy5wdXNoX3RhaWwoZ2V0SVJWYWx1ZShsbHZtSW5zdC0+Z2V0T3BlcmFuZChHZXRUZXh0dXJlT3BJbmRleChFVE9PZmZzZXQpKSkpOworICAgICAgfQorICAgfQorCisgICAvLyBCaWFzTE9ECisgICBpZiAoKCh0ZXhGbGFncyAmIEVURkJpYXNMb2RBcmcpICE9IDAgJiYgKHRleEZsYWdzICYgRVRGTG9kKSA9PSAwKSB8fAorICAgICAgICh0ZXhGbGFncyAmIEVURkNvbXBvbmVudEFyZykpIHsKKyAgICAgIHBhcmFtZXRlcnMucHVzaF90YWlsKGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoR2V0VGV4dHVyZU9wSW5kZXgoRVRPQmlhc0xvZCkpKSk7CisgICB9CisKKyAgIC8vIEZpbmQgdGhlIHJpZ2h0IGZ1bmN0aW9uIHNpZ25hdHVyZSB0byBjYWxsCisgICAvLyBUaGlzIHNldHMgc3RhdGUtPnVzZXNfYnVpbHRpbl9mdW5jdGlvbnMKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnID0KKyAgICAgIF9tZXNhX2dsc2xfZmluZF9idWlsdGluX2Z1bmN0aW9uKHN0YXRlLCB0eE5hbWUuY19zdHIoKSwgJnBhcmFtZXRlcnMpOworCisgICBpZiAoc2lnID09IDApIHsKKyAgICAgIHJldHVybiBlcnJvcigibm8gbWF0Y2hpbmcgdGV4dHVyZSBzaWduYXR1cmUgZm91bmQiKTsKKyAgIH0KKworICAgY29uc3Qgc3RkOjpzdHJpbmcgcmV0TmFtZSA9IHN0ZDo6c3RyaW5nKHR4TmFtZSkgKyAiX3JldHZhbCI7CisgICBpcl9kZXJlZmVyZW5jZSogZGVzdCA9IG5ld0lSVmFyaWFibGVEZXJlZihsbHZtSW5zdC0+Z2V0VHlwZSgpLCBsbHZtSW5zdCwgcmV0TmFtZSwgaXJfdmFyX2F1dG8pOworCisgICBpcl9jYWxsICpjYWxsID0gbmV3KHNoYWRlcikgaXJfY2FsbChzaWcsIGRlc3QtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCksICZwYXJhbWV0ZXJzKTsKKworICAgLy8gVE9ETzogU2hvdWxkIHdlIGluc2VydCBhIHByb3RvdHlwZT8KKworICAgYWRkSVJJbnN0cnVjdGlvbihsbHZtSW5zdCwgY2FsbCk7Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgSVIgdGV4dHVyZSBxdWVyeSBpbnRyaW5zaWNzCisgKiAgICAoZGVjbGFyZSAodW5pZm9ybSApIHNhbXBsZXIyRCBzdXJmYWNlKQorICogICAgKGRlY2xhcmUgKCkgaXZlYzIgdGV4dHVyZVNpemVfcmV0dmFsKQorICogICAgKGNhbGwgdGV4dHVyZVNpemUgKHZhcl9yZWYgdGV4dHVyZVNpemVfcmV0dmFsKSAgKCh2YXJfcmVmIHN1cmZhY2UpICh2YXJfcmVmIGxvZCkgKSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRJUlRleHR1cmVRdWVyeShjb25zdCBsbHZtOjpJbnRyaW5zaWNJbnN0KiBsbHZtSW5zdCkKK3sKKyAgIGNvbnN0IGNoYXIqIG5hbWU7CisKKyAgIC8vIFRoaXMgaXMgT0sgb24gdGhlIHN0YWNrLCBiZWNhdXNlIHRoZSBpcl9jYWxsIGNvbnN0cnVjdG9yIHdpbGwgbW92ZSBvdXQgb2YgaXQuCisgICBleGVjX2xpc3QgcGFyYW1ldGVyczsKKworICAgLy8gU2FtcGxlciBvcGVyYW5kCisgICBwYXJhbWV0ZXJzLnB1c2hfdGFpbChnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKEdldFRleHR1cmVPcEluZGV4KEVUT1NhbXBsZXJMb2MpKSkpOworCisgICAvLyBJbnNwaXJlZCBieSBMdW5hckdsYXNzIEdMU0wgYmFja2VuZAorICAgc3dpdGNoIChsbHZtSW5zdC0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9xdWVyeVRleHR1cmVTaXplOgorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9xdWVyeVRleHR1cmVTaXplTm9Mb2Q6CisgICAgICBuYW1lID0gInRleHR1cmVTaXplIjsKKyAgICAgIGlmIChsbHZtSW5zdC0+Z2V0TnVtQXJnT3BlcmFuZHMoKSA+IDIpCisgICAgICAgICBwYXJhbWV0ZXJzLnB1c2hfdGFpbChnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKDIpKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUXVlcnlUZXh0dXJlTG9kOgorICAgICAgbmFtZSA9ICJ0ZXh0dXJlTG9kIjsKKyAgICAgIHBhcmFtZXRlcnMucHVzaF90YWlsKGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoMikpKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgbmFtZSA9ICJlcnJvciI7CisgICAgICBlcnJvcigidW5leHBlY3RlZCB0ZXh0dXJlIHF1ZXJ5IGludHJpbnNpYyIpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgdmVyeSBzaW1pbGFyIHRvIGVtaXRJUlRleHR1cmUKKworICAgLy8gRmluZCB0aGUgcmlnaHQgZnVuY3Rpb24gc2lnbmF0dXJlIHRvIGNhbGwKKyAgIC8vIFRoaXMgc2V0cyBzdGF0ZS0+dXNlc19idWlsdGluX2Z1bmN0aW9ucworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPQorICAgICAgX21lc2FfZ2xzbF9maW5kX2J1aWx0aW5fZnVuY3Rpb24oc3RhdGUsIG5hbWUsICZwYXJhbWV0ZXJzKTsKKworICAgaWYgKHNpZyA9PSAwKSB7CisgICAgICByZXR1cm4gZXJyb3IoIm5vIG1hdGNoaW5nIHRleHR1cmUgc2lnbmF0dXJlIGZvdW5kIik7CisgICB9CisKKyAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJldE5hbWUgPSBzdGQ6OnN0cmluZyhuYW1lKSArICJfcmV0dmFsIjsKKyAgIGlyX2RlcmVmZXJlbmNlKiBkZXN0ID0gbmV3SVJWYXJpYWJsZURlcmVmKGxsdm1JbnN0LT5nZXRUeXBlKCksIGxsdm1JbnN0LCByZXROYW1lLCBpcl92YXJfYXV0byk7CisKKyAgIGlyX2NhbGwgKmNhbGwgPSBuZXcoc2hhZGVyKSBpcl9jYWxsKHNpZywgZGVzdC0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKSwgJnBhcmFtZXRlcnMpOworCisgICAvLyBUT0RPOiBTaG91bGQgd2UgaW5zZXJ0IGEgcHJvdG90eXBlPworCisgICBhZGRJUkluc3RydWN0aW9uKGxsdm1JbnN0LCBjYWxsKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBZGQgYSBwbGFpbiAobm9uLWNvbmRpdGlvbmFsKSBkaXNjYXJkCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZERpc2NhcmQoKQoreworICAgYWRkSVJJbnN0cnVjdGlvbihuZXcoc2hhZGVyKSBpcl9kaXNjYXJkKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUcmFuc2xhdGUgc3RydWN0cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBhZGRTdHJ1Y3RUeXBlKGxsdm06OlN0cmluZ1JlZiwgY29uc3QgbGx2bTo6VHlwZSopCit7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHJhbnNsYXRlIGNvbnN0IGdsb2JhbHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkR2xvYmFsQ29uc3QoY29uc3QgbGx2bTo6R2xvYmFsVmFyaWFibGUqIGdsb2JhbCkKK3sKKyAgIHJldHVybiBhZGRHbG9iYWwoZ2xvYmFsKTsKK30KKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHJhbnNsYXRlIGdsb2JhbHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkR2xvYmFsKGNvbnN0IGxsdm06Okdsb2JhbFZhcmlhYmxlKiBnbG9iYWwpCit7CisgICBjb25zdCBnbGE6OkVWYXJpYWJsZVF1YWxpZmllciBxdWFsaWZpZXIgPSBNYXBHbGFBZGRyZXNzU3BhY2UoZ2xvYmFsKTsKKworICAgc3dpdGNoIChxdWFsaWZpZXIpIHsKKyAgIGNhc2UgZ2xhOjpFVlFVbmlmb3JtOgorICAgY2FzZSBnbGE6OkVWUUdsb2JhbDoKKyAgIGNhc2UgZ2xhOjpFVlFUZW1wb3Jhcnk6IGJyZWFrOworICAgZGVmYXVsdDogcmV0dXJuOyAgLy8gbm90aGluZyB0byBkbyBmb3IgdGhlc2UKKyAgIH0KKworICAgbGx2bTo6VHlwZSogdHlwZTsKKyAgIGlmIChjb25zdCBsbHZtOjpQb2ludGVyVHlwZSogcG9pbnRlciA9IGxsdm06OmR5bl9jYXN0PGxsdm06OlBvaW50ZXJUeXBlPihnbG9iYWwtPmdldFR5cGUoKSkpCisgICAgICB0eXBlID0gcG9pbnRlci0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKKyAgIGVsc2UKKyAgICAgIHR5cGUgPSBnbG9iYWwtPmdldFR5cGUoKTsKKworICAgY29uc3QgaXJfdmFyaWFibGVfbW9kZSBpck1vZGUgICA9IFZhcmlhYmxlUXVhbGlmaWVyVG9JUihxdWFsaWZpZXIpOworICAgY29uc3Qgc3RkOjpzdHJpbmcgICAgICBuYW1lICAgICA9IGdsb2JhbC0+Z2V0TmFtZSgpOworCisgICAvLyBSZW1lbWJlciB0aGUgaXJfdmFyaWFibGVfbW9kZSBmb3IgdGhpcyBkZWNsYXJhdGlvbgorICAgaWYgKGdsb2JhbFZhck1vZGVNYXAuZmluZChuYW1lKSA9PSBnbG9iYWxWYXJNb2RlTWFwLmVuZCgpKSB7CisgICAgICBnbG9iYWxWYXJNb2RlTWFwW25hbWVdID0gaXJNb2RlOworICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIGl0IGFscmVhZHkgZXhpc3RlZCBpbiB0aGUgbWFwLCBpdCdzIGR1ZSB0byBhbiBJTyBkZWNsYXJhdGlvbiwKKyAgICAgIC8vIGFuZCB3ZSBkb24ndCB3YW50IHRvIHN0ZXAgb24gdGhhdCwgc28gYmFpbCBvdXQuCisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vIGludGVyZmFjZSBibG9jayBtZW1iZXJzIGFyZSBob2lzdGVkIHRvIGdsb2JhbCBzY29wZSBpbiBISVIuICBUaHVzLCB3ZSBkbworICAgLy8gbm90IGFkZCBnbG9iYWxzIGZvciB0aGVtLgorICAgaWYgKGFub25CbG9ja3MuZmluZChuYW1lKSAhPSBhbm9uQmxvY2tzLmVuZCgpKQorICAgICAgcmV0dXJuOworCisgICBpcl9ydmFsdWUqICAgICAgICAgICAgIHZhckRlcmVmID0gbmV3SVJWYXJpYWJsZURlcmVmKHR5cGUsIDAsIG5hbWUsIGlyTW9kZSwgdHJ1ZSk7CisgICBpcl92YXJpYWJsZSogICAgICAgICAgIHZhciAgICAgID0gdmFyRGVyZWYtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCktPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKworICAgLy8gYWRkIGluaXRpYWxpemVycyB0byBtYWluIHByb2xvZ3VlIG9yIHZhcmlhYmxlIChmb3IgdW5pZm9ybXMpCisgICBpZiAoZ2xvYmFsLT5oYXNJbml0aWFsaXplcigpKSB7CisgICAgICB2YXItPmRhdGEuaGFzX2luaXRpYWxpemVyID0gdHJ1ZTsKKyAgICAgIGlyX2NvbnN0YW50KiBjb25zdFZhbCA9IG5ld0lSQ29uc3RhbnQoZ2xvYmFsLT5nZXRJbml0aWFsaXplcigpKTsKKworICAgICAgaWYgKHF1YWxpZmllciA9PSBnbGE6OkVWUVVuaWZvcm0pIHsKKyAgICAgICAgIHZhci0+Y29uc3RhbnRfdmFsdWUgICAgICAgPSBjb25zdFZhbDsKKyAgICAgICAgIHZhci0+Y29uc3RhbnRfaW5pdGlhbGl6ZXIgPSBjb25zdFZhbC0+Y2xvbmUoc2hhZGVyLCAwKTsKKyAgICAgICAgIC8vIENyZWF0ZSB1bmlmb3JtIGluaXRpYWxpemVycworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8vIE5vbi11bmlmb3JtcyBnZXQgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgIHByb2xvZ3VlLnB1c2hfYmFjayhuZXcoc2hhZGVyKSBpcl9hc3NpZ25tZW50KHZhckRlcmVmLCBjb25zdFZhbCkpOworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENyZWF0ZSBnbG9iYWwgSVIgZGVjbGFyYXRpb25zIGZvciBzaGFkZXJzIGlucywgb3V0cywgYW5kIHVuaWZvcm1zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZElvRGVjbGFyYXRpb24oZ2xhOjpFVmFyaWFibGVRdWFsaWZpZXIgcXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Ok1ETm9kZSogbWROb2RlKQoreworICAgY29uc3QgbGx2bTo6VHlwZSogbWRSYXdUeXBlID0gMDsKKyAgIE1ldGFUeXBlIG1ldGFUeXBlOworICAgZGVjb2RlTWRUeXBlc0VtaXRNZFF1YWxpZmllcnModHJ1ZSwgbWROb2RlLCBtZFJhd1R5cGUsIGZhbHNlLCBtZXRhVHlwZSk7CisgICBjb25zdCBsbHZtOjpUeXBlKiBtZFR5cGUgPSBtZFJhd1R5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7CisKKyAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBtZXRhVHlwZS5uYW1lOworICAgYm9vbCBhbm9ueW1vdXMgPSBmYWxzZTsKKworICAgLy8gTmFtZSBtYXkgYmUgbWlzc2luZyBlaXRoZXIgYmVjYXVzZSBvZiBhbm9ueW1vdXMgYmxvY2sgb3IgU1BJUi1WCisgICAvLyBkZWJ1ZyBzdHJpbmdzIHdlcmUgc3RyaXBwZWQuIEdyYWIgYSBuYW1lIGZyb20gdGhlIG1ldGFkYXRhIHR5cGUKKyAgIHN0ZDo6c3RyaW5nIGJuYW1lOworICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgIG5hbWUgPSBtZE5vZGUtPmdldE9wZXJhbmQoMiktPmdldE5hbWUoKTsKKyAgICAgICBTdHJpcFN1ZmZpeChuYW1lLCAiX3R5cGVQcm94eSIpOworICAgICAgIFN0cmlwU3VmZml4KG5hbWUsICJfc2hhZG93Iik7CisgICAgICAgaWYgKG1ldGFUeXBlLmlvS2luZCA9PSBnbGE6OkVNaW9Vbmlmb3JtQmxvY2tNZW1iZXIpCisgICAgICAgICAgIGFub255bW91cyA9IHRydWU7CisgICB9CisKKyAgIC8vIElmIGl0cyBhIGJ1aWx0aW4sIHRoZSBuYW1lIG1pZ2h0IG5vdCBiZSBjb3JyZWN0IGR1ZSB0byBTUElSLVYgc3RyaXBwaW5nLgorICAgLy8gTWFrZSBzdXJlIHdlIGFyZSB1c2luZyB0aGUgc3RhbmRhcmQgbmFtZSBhcyB0aGUgcmVzdCBvZiB0aGUgZHJpdmVyIHJlbGllcyBvbiB0aGlzLgorICAgc3dpdGNoIChtZXRhVHlwZS5idWlsdEluKSB7CisgICBjYXNlIEVtYlBvc2l0aW9uOiAgICAgICBibmFtZSA9ICJnbF9Qb3NpdGlvbiI7ICAgICBicmVhazsKKyAgIGNhc2UgRW1iUG9pbnRTaXplOiAgICAgIGJuYW1lID0gImdsX1BvaW50U2l6ZSI7ICAgIGJyZWFrOworICAgY2FzZSBFbWJDbGlwRGlzdGFuY2U6ICAgYm5hbWUgPSAiZ2xfQ2xpcERpc3RhbmNlIjsgYnJlYWs7CisgICBjYXNlIEVtYkN1bGxEaXN0YW5jZTogICBibmFtZSA9ICJnbF9DdWxsRGlzdGFuY2UiOyBicmVhazsKKyAgIGNhc2UgRW1iRnJhZ0RlcHRoOiAgICAgIGJuYW1lID0gImdsX0ZyYWdEZXB0aCI7ICAgIGJyZWFrOworICAgY2FzZSBFbWJWZXJ0ZXhJZDogICAgICAgYm5hbWUgPSAiZ2xfVmVydGV4SUQiOyAgICAgYnJlYWs7CisgICBjYXNlIEVtYlZlcnRleEluZGV4OiAgICBibmFtZSA9ICJnbF9WZXJ0ZXhJRCI7ICAgICBicmVhazsKKyAgIGNhc2UgRW1iUHJpbWl0aXZlSWQ6ICAgIGJuYW1lID0gImdsX1ByaW1pdGl2ZUlEIjsgIGJyZWFrOworICAgY2FzZSBFbWJJbnN0YW5jZUlkOiAgICAgYm5hbWUgPSAiZ2xfSW5zdGFuY2VJRCI7ICAgYnJlYWs7CisgICBjYXNlIEVtYkZhY2U6ICAgICAgICAgICBibmFtZSA9ICJnbF9Gcm9udEZhY2luZyI7ICBicmVhazsKKyAgIGNhc2UgRW1iRnJhZ0Nvb3JkOiAgICAgIGJuYW1lID0gImdsX0ZyYWdDb29yZCI7ICAgIGJyZWFrOworICAgY2FzZSBFbWJQb2ludENvb3JkOiAgICAgYm5hbWUgPSAiZ2xfUG9pbnRDb29yZCI7ICAgYnJlYWs7CisgICBjYXNlIEVtYlNhbXBsZUlkOiAgICAgICBibmFtZSA9ICJnbF9TYW1wbGVJRCI7ICAgICBicmVhazsKKyAgIGNhc2UgRW1iTGF5ZXI6ICAgICAgICAgIGJuYW1lID0gImdsX0xheWVyIjsgICAgICAgIGJyZWFrOworICAgY2FzZSBFbWJTYW1wbGVQb3NpdGlvbjogICBibmFtZSA9ICJnbF9TYW1wbGVQb3NpdGlvbiI7ICAgYnJlYWs7CisgICBjYXNlIEVtYlZpZXdwb3J0SW5kZXg6ICAgIGJuYW1lID0gImdsX1ZpZXdwb3J0SW5kZXgiOyAgICBicmVhazsKKyAgIGNhc2UgRW1iSGVscGVySW52b2NhdGlvbjogYm5hbWUgPSAiZ2xfSGVscGVySW52b2NhdGlvbiI7IGJyZWFrOworICAgY2FzZSBFbWJTYW1wbGVNYXNrOiAgICAgICBibmFtZSA9IChtZXRhVHlwZS5pb0tpbmQgPT0gZ2xhOjpFTWlvUGlwZUluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJnbF9TYW1wbGVNYXNrSW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImdsX1NhbXBsZU1hc2siOyAgIGJyZWFrOworICAgY2FzZSBFbWJOb25lOgorICAgICAgIGlmIChtZXRhVHlwZS5pb0tpbmQgPT0gZ2xhOjpFTWlvUGlwZUluQmxvY2spCisgICAgICAgICAgICBibmFtZSA9ICJnbF9pbiI7CisgICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgIC8vIEFueSBidWlsdGlucyBub3QgaW4gR0xTTCA0LjUgd2lsbCBub3QgY29tZSB0aHJvdWdoIFNQSVItViBhbmQgd2lsbAorICAgICAgIC8vIGhhdmUgdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICBicmVhazsKKyAgIH0gLy8gc3dpdGNoCisKKyAgIGNvbnN0IGdsc2xfdHlwZSogICAgICAgaXJJbnRlcmZhY2VUeXBlID0gbGx2bVR5cGVUb0hpclR5cGUobWRUeXBlLCBtZE5vZGUpOworICAgY29uc3QgaXJfdmFyaWFibGVfbW9kZSBpclZhck1vZGUgICAgICAgPSBWYXJpYWJsZVF1YWxpZmllclRvSVIocXVhbGlmaWVyKTsKKworICAgaWYgKCFibmFtZS5lbXB0eSgpKSB7CisgICAgICAgbmFtZUJ1aWx0aW5NYXBbbmFtZV0gPSBibmFtZTsKKyAgICAgICBnbG9iYWxWYXJNb2RlTWFwW25hbWVdID0gaXJWYXJNb2RlOworICAgICAgIG5hbWUgPSBibmFtZTsKKyAgIH0KKworICAgLy8gUmVnaXN0ZXIgbmFtZSAtPiBtZXRhZGF0YSBtYXBwaW5nIGZvciB0aGlzIGRlY2xhcmF0aW9uCisgICB0eXBlbmFtZU1kTWFwW25hbWVdICAgID0gbWROb2RlOworICAgZ2xvYmFsVmFyTW9kZU1hcFtuYW1lXSA9IGlyVmFyTW9kZTsKKworICAgLy8gQmVjYXVzZSBvZiBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24sIHRoaXMgaXMgc2FmZQorICAgY29uc3QgYm9vbCBpc1BlclZlcnRleCA9IGlySW50ZXJmYWNlVHlwZS0+bmFtZSAmJiBzdHJjbXAoaXJJbnRlcmZhY2VUeXBlLT5uYW1lLCAiZ2xfUGVyVmVydGV4IikgPT0gMDsKKworICAgLy8gTWVzYSBob2lzdHMgaW50ZXJmYWNlIGJsb2NrIG1lbWJlcnMgdG8gdG9wIGxldmVsIElPCisgICBpZiAoaXNQZXJWZXJ0ZXgpIHsKKyAgICAgIGFub25CbG9ja3MuaW5zZXJ0KG5hbWUpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoYW5vbnltb3VzKSB7CisgICAgICAvLyBDcmVhdGUgSVIgZGVjbGFyYXRpb24gZm9yIHRoZSBpbnRlcmZhY2UKKyAgICAgIC8vIEZvciBhbm9ueW1vdXMgYmxvY2tzLCBISVIgaG9pc3RzIG1lbWJlcnMgdG8gdGhlIGdsb2JhbCBzY29wZS4gIFRoaXMgaXMgYXdrd2FyZC4KKyAgICAgIGlmIChpckludGVyZmFjZVR5cGUtPmlzX2ludGVyZmFjZSgpKSB7CisgICAgICAgICBhbm9uQmxvY2tzLmluc2VydChuYW1lKTsKKworICAgICAgICAgZm9yICh1bnNpZ25lZCBmaWVsZD0wOyBmaWVsZCA8IGlySW50ZXJmYWNlVHlwZS0+bGVuZ3RoOyArK2ZpZWxkKSB7CisgICAgICAgICAgICBpcl92YXJpYWJsZSogdmFyID0gbmV3SVJWYXJpYWJsZShpckludGVyZmFjZVR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbZmllbGRdLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpckludGVyZmFjZVR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbZmllbGRdLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpclZhck1vZGUsIHRydWUpOworCisgICAgICAgICAgICB2YXItPmRhdGEuaG93X2RlY2xhcmVkID0gaXJfdmFyX2RlY2xhcmVkX2luX2Jsb2NrOworICAgICAgICAgICAgdmFyLT5yZWluaXRfaW50ZXJmYWNlX3R5cGUoaXJJbnRlcmZhY2VUeXBlKTsKKworICAgICAgICAgICAgLy8gVE9ETzogaXJJbnRlcmZhY2VUeXBlLT5maWVsZHMuc3RydWN0dXJlW2ZpZWxkXS5yb3dfbWFqb3I7CisKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uIHNob3VsZCBub3QgYmUgc2V0IG9uIGEgZmllbGQgb2YgYW4gYW5vbnltb3VzIGJsb2NrCisgICAgICAgICAgICBhc3NlcnQoaXJJbnRlcmZhY2VUeXBlLT5maWVsZHMuc3RydWN0dXJlW2ZpZWxkXS5sb2NhdGlvbiA9PSAtMSk7CisKKyAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIGJpbmRpbmcgaW5mbyBmb3IgZWFjaCBtZW1iZXIKKyAgICAgICAgICAgIC8vIEx1bmFyRyBUT0RPOiBUaGlzIGxvb2tzIGxpa2UgYSBuby1vcAorICAgICAgICAgICAgTWV0YVR5cGUgbWV0YVR5cGU7CisgICAgICAgICAgICBkZWNvZGVNZFR5cGVzRW1pdE1kUXVhbGlmaWVycyhpc0lvTWQobWROb2RlKSwgbWROb2RlLCBtZFR5cGUsIGZhbHNlLCBtZXRhVHlwZSk7CisKKyAgICAgICAgICAgIGlmKG1ldGFUeXBlLmJpbmRpbmcgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICB2YXItPmRhdGEuZXhwbGljaXRfYmluZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogYmluZGluZyBpcyBub3cgdHdvIDE2LWJpdCB2YWx1ZXMgY29tYmluZWQKKyAgICAgICAgICAgICAgICB2YXItPmRhdGEuYmluZGluZyA9IG1ldGFUeXBlLmJpbmRpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IGhvdyB0byBzZXQgdGhpcyBhcHByb3ByaWF0ZWx5PworICAgICAgLy8gICAgdmFyLT5kYXRhLmhvd19kZWNsYXJlZCA9IGlyX3Zhcl9kZWNsYXJlZF9pbXBsaWNpdGx5OworICAgfSBlbHNlIHsKKyAgICAgIC8vIENyZWF0ZSBJUiBkZWNsYXJhdGlvbiBmb3IgdGhlIGludGVyZmFjZQorICAgICAgbmV3SVJWYXJpYWJsZShpckludGVyZmFjZVR5cGUsIG5hbWUsIGlyVmFyTW9kZSwgdHJ1ZSk7CisKKyAgICAgIC8vIFJlZ2lzdGVyIGludGVyZmFjZSBibG9jaywgaWYgaXQgaXMgb25lLiAgV2Ugd2FudCB0byB1c2UgdGhlIGludGVyZmFjZQorICAgICAgLy8gbmFtZSwgbm90IHRoZSB0eXBlIG5hbWUsIGluIHRoaXMgcmVnaXN0cmF0aW9uLgorICAgICAgaWYgKGlySW50ZXJmYWNlVHlwZS0+aXNfaW50ZXJmYWNlKCkpIHsKKyAgICAgICAgIGlmICghc3RhdGUtPnN5bWJvbHMtPmFkZF9pbnRlcmZhY2UoaXJJbnRlcmZhY2VUeXBlLT5uYW1lLCBpckludGVyZmFjZVR5cGUsIGlyVmFyTW9kZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigidW5hYmxlIHRvIGFkZCBpbnRlcmZhY2UiKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUcmFuc2xhdGUgZnVuY3Rpb24gYXJndW1lbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZEFyZ3VtZW50KGNvbnN0IGxsdm06OlZhbHVlKiB2YWx1ZSwgYm9vbCBsYXN0KQoreworICAgZm5QYXJhbWV0ZXJzLnB1c2hfdGFpbChnZXRJUlZhbHVlKHZhbHVlKSk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVzZXQgYW55IHBlbmRpbmcgZnVuY3Rpb24gc3RhdGUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6cmVzZXRGblRyYW5zbGF0aW9uU3RhdGUoKQoreworICAgLy8gV2UgZG9uJ3QgZnJlZSBtZW1vcnkgZm9yIHRoZSBmbiBuYW1lLCBiZWNhdXNlIHNvbWVvbmUgZWxzZSBvd25zIGl0CisgICBmbk5hbWUgPSAwOworCisgICAvLyBEZXN0cm95IGFueSBwZW5kaW5nIGZuIHJldHVybiB0eXBlCisgICBkZWxldGUgZm5SZXR1cm5UeXBlOworICAgZm5SZXR1cm5UeXBlID0gMDsKKworICAgLy8gRGVzdHJveSBmdW5jdGlvbiBzaWduYXR1cmUKKyAgIGlmIChmblNpZ25hdHVyZSkgeworICAgICAgcmFsbG9jX2ZyZWUoZm5TaWduYXR1cmUpOworICAgICAgZm5TaWduYXR1cmUgPSAwOworICAgfQorCisgICAvLyBEZXN0cm95IGZ1bmN0aW9uCisgICBpZiAoZm5GdW5jdGlvbikgeworICAgICAgcmFsbG9jX2ZyZWUoZm5GdW5jdGlvbik7CisgICAgICBmbkZ1bmN0aW9uID0gMDsKKyAgIH0KKworICAgLy8gZW1wdHkgcGFyYW1ldGVyIGxpc3QKKyAgIGZuUGFyYW1ldGVycy5tYWtlX2VtcHR5KCk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29udmVydCBzdHJ1Y3QgdHlwZXMuICBNYXkgY2FsbCBsbHZtVHlwZVRvSGlyVHlwZSByZWN1cnNpdmVseS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IGdsc2xfdHlwZSoKK01lc2FHbGFzc1RyYW5zbGF0b3I6OmNvbnZlcnRTdHJ1Y3RUeXBlKGNvbnN0IGxsdm06OlN0cnVjdFR5cGUqIHN0cnVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmICAgICAgICAgYmxvY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6TUROb2RlKiAgICAgbWROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xhOjpFTWRUeXBlTGF5b3V0ICAgICAgcGFyZW50VHlwZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsYTo6RVZhcmlhYmxlUXVhbGlmaWVyIHBhcmVudFF1YWxpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGlzQmxvY2spCit7CisgICBjb25zdCBpbnQgY29udGFpbmVkVHlwZUNvdW50ID0gc3RydWN0VHlwZS0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKTsKKworICAgLy8gQWxsb2NhdGUgYW4gYXJyYXkgb2YgZ2xzbF9zdHJ1Y3RfZmllbGRzIG9mIHNpemUgdG8gaG9sZCBhbGwgc3VidHlwZXMKKyAgIGdsc2xfc3RydWN0X2ZpZWxkICpjb25zdCBmaWVsZHMgPSByYWxsb2NfYXJyYXkoc2hhZGVyLCBnbHNsX3N0cnVjdF9maWVsZCwgY29udGFpbmVkVHlwZUNvdW50KTsKKworICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRhaW5lZFR5cGVDb3VudDsgKytpbmRleCkgeworICAgICAgY29uc3QgbGx2bTo6TUROb2RlKiBzdWJNZEFnZ3JlZ2F0ZSA9CisgICAgICAgICBtZE5vZGUgPyBsbHZtOjpkeW5fY2FzdDxsbHZtOjpNRE5vZGU+KG1kTm9kZS0+Z2V0T3BlcmFuZChHZXRBZ2dyZWdhdGVNZFN1YkFnZ3JlZ2F0ZU9wKGluZGV4KSkpIDogMDsKKworICAgICAgc3RkOjpzdHJpbmcgc3ViTmFtZTsKKyAgICAgIHN1Yk5hbWUucmVzZXJ2ZSgyMCk7CisKKyAgICAgIGNvbnN0IGxsdm06OlR5cGUqIGNvbnRhaW5lZFR5cGUgID0gc3RydWN0VHlwZS0+Z2V0Q29udGFpbmVkVHlwZShpbmRleCk7CisKKyAgICAgIE1ldGFUeXBlIG1ldGFUeXBlOworICAgICAgaWYgKHN1Yk1kQWdncmVnYXRlKQorICAgICAgICAgZGVjb2RlTWRUeXBlc0VtaXRNZFF1YWxpZmllcnMoZmFsc2UsIHN1Yk1kQWdncmVnYXRlLCBjb250YWluZWRUeXBlLCBmYWxzZSwgbWV0YVR5cGUpOworCisgICAgICAvLyBJZiB0aGVyZSdzIG1ldGFkYXRhLCB1c2UgdGhhdCBmaWVsZCBuYW1lLiAgRWxzZSwgbWFrZSB1cCBhIGZpZWxkIG5hbWUuCisgICAgICBpZiAobWROb2RlKSB7CisgICAgICAgICBzdWJOYW1lID0gbWROb2RlLT5nZXRPcGVyYW5kKEdldEFnZ3JlZ2F0ZU1kTmFtZU9wKGluZGV4KSktPmdldE5hbWUoKS5zdHIoKTsKKyAgICAgICAgIGlmIChzdWJOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICBpZiAoc3ViTWRBZ2dyZWdhdGUgJiYgbWV0YVR5cGUuYnVpbHRJbiAhPSBFbWJOb25lKSB7CisgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJuYW1lOworICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1ldGFUeXBlLmJ1aWx0SW4pIHsKKyAgICAgICAgICAgICAgICAgY2FzZSBFbWJQb3NpdGlvbjogYm5hbWUgPSAiZ2xfUG9zaXRpb24iOyAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIGNhc2UgRW1iUG9pbnRTaXplOiAgICAgIGJuYW1lID0gImdsX1BvaW50U2l6ZSI7ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICBjYXNlIEVtYkNsaXBEaXN0YW5jZTogICBibmFtZSA9ICJnbF9DbGlwRGlzdGFuY2UiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogZXJyb3IoInVuaGFuZGxlZCBidWlsdEluIik7CisgICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoCisgICAgICAgICAgICAgICAgIHN1Yk5hbWUuYXNzaWduKGJuYW1lKTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgYW5vbkZpZWxkTmFtZVsyMF07IC8vIGVub3VnaCBmb3IgImFub25fIiArIGRpZ2l0cyB0byBob2xkIG1heGludAorICAgICAgICAgICAgICAgIHNucHJpbnRmKGFub25GaWVsZE5hbWUsIHNpemVvZihhbm9uRmllbGROYW1lKSwgIiVzJXMlZCIsIGJsb2NrTmFtZS5zdHIoKS5jX3N0cigpLCAiX2dnXyIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBzdWJOYW1lLmFzc2lnbihhbm9uRmllbGROYW1lKTsKKyAgICAgICAgICAgICAgICBuYW1lID0gYmxvY2tOYW1lOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBjaGFyIGFub25GaWVsZE5hbWVbMjBdOyAvLyBlbm91Z2ggZm9yICJhbm9uXyIgKyBkaWdpdHMgdG8gaG9sZCBtYXhpbnQKKyAgICAgICAgIHNucHJpbnRmKGFub25GaWVsZE5hbWUsIHNpemVvZihhbm9uRmllbGROYW1lKSwgImFub25fJWQiLCBpbmRleCk7CisgICAgICAgICBzdWJOYW1lLmFzc2lnbihhbm9uRmllbGROYW1lKTsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETzogc2V0IGFycmF5Q2hpbGQsIGV0YyBwcm9wZXJseQorCisgICAgICBmaWVsZHNbaW5kZXhdLm5hbWUgICAgICAgICAgPSByYWxsb2Nfc3RyZHVwKHNoYWRlciwgc3ViTmFtZS5jX3N0cigpKTsKKyAgICAgIGZpZWxkc1tpbmRleF0udHlwZSAgICAgICAgICA9IGxsdm1UeXBlVG9IaXJUeXBlKGNvbnRhaW5lZFR5cGUsIHN1Yk1kQWdncmVnYXRlKTsKKworICAgICAgaWYgKHN1Yk1kQWdncmVnYXRlKSB7CisKKyAgICAgICAgIGlmIChtZXRhVHlwZS5sb2NhdGlvbiA8IGdsYTo6TWF4VXNlckxheW91dExvY2F0aW9uKSB7CisgICAgICAgICAgICBmaWVsZHNbaW5kZXhdLmxvY2F0aW9uICAgICAgPSBtZXRhVHlwZS5sb2NhdGlvbjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWVsZHNbaW5kZXhdLmxvY2F0aW9uICAgICAgPSAtMTsKKyAgICAgICAgIH0KKworICAgICAgICAgZmllbGRzW2luZGV4XS5pbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGlvblF1YWxpZmllclRvSVIobWV0YVR5cGUuaW50ZXJwTWV0aG9kKTsKKyAgICAgICAgIGZpZWxkc1tpbmRleF0uY2VudHJvaWQgICAgICA9IG1ldGFUeXBlLmludGVycExvY2F0aW9uID09IEVJTENlbnRyb2lkOworICAgICAgICAgZmllbGRzW2luZGV4XS5zYW1wbGUgICAgICAgID0gbWV0YVR5cGUuaW50ZXJwTG9jYXRpb24gPT0gRUlMU2FtcGxlOworICAgICAgICAgZmllbGRzW2luZGV4XS5yb3dfbWFqb3IgICAgID0gbWV0YVR5cGUudHlwZUxheW91dCA9PSBFTXRsUm93TWFqb3JNYXRyaXg7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IGhhbmRsZSBxdWFsaWZpZXJzCisgICB9CisKKyAgIGlmIChpc0Jsb2NrKSB7CisgICAgICByZXR1cm4gZ2xzbF90eXBlOjpnZXRfaW50ZXJmYWNlX2luc3RhbmNlKGZpZWxkcywgY29udGFpbmVkVHlwZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTGF5b3V0VG9JUihwYXJlbnRUeXBlTGF5b3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFsbG9jX3N0cmR1cChzaGFkZXIsIG5hbWUuc3RyKCkuY19zdHIoKSkpOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBnbHNsX3R5cGU6OmdldF9yZWNvcmRfaW5zdGFuY2UoZmllbGRzLCBjb250YWluZWRUeXBlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbGxvY19zdHJkdXAoc2hhZGVyLCBuYW1lLnN0cigpLmNfc3RyKCkpKTsKKyAgIH0KK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb252ZXJ0IGFuIExMVk0gdHlwZSB0byBhbiBISVIgdHlwZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgZ2xzbF90eXBlKgorTWVzYUdsYXNzVHJhbnNsYXRvcjo6bGx2bVR5cGVUb0hpclR5cGUoY29uc3QgbGx2bTo6VHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Ok1ETm9kZSogbWROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VmFsdWUqICBsbHZtVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGdlblVuc2lnbmVkKQoreworICAgLy8gRmluZCBhbnkgYWdncmVnYXRlIG1ldGFkYXRhIHdlIG1heSBoYXZlIHN0b3JlZCBhd2F5IGluIGEgcHJpb3IgZGVjbGFyYXRpb24KKyAgIGNvbnN0IHRNRE1hcDo6Y29uc3RfaXRlcmF0b3IgYWdnTWRGcm9tTWFwID0gdHlwZU1kQWdncmVnYXRlTWFwLmZpbmQodHlwZSk7CisgICBjb25zdCBsbHZtOjpNRE5vZGUqIG1kQWdnTm9kZSA9IChhZ2dNZEZyb21NYXAgIT0gdHlwZU1kQWdncmVnYXRlTWFwLmVuZCgpKSA/IGFnZ01kRnJvbU1hcC0+c2Vjb25kIDogMDsKKworICAgaWYgKCFtZE5vZGUpCisgICAgICBtZE5vZGUgPSBtZEFnZ05vZGU7CisKKyAgIGNvbnN0IHRUeXBlRGF0YSB0eXBlRGF0YSh0eXBlLCBtZE5vZGUsIGdlblVuc2lnbmVkKTsKKworICAgLy8gU2VlIGlmIHdlJ3ZlIGFscmVhZHkgY29udmVydGVkIHRoaXMgdHlwZS4gIElmIHNvLCB1c2UgdGhlIG9uZSB3ZSBkaWQgYWxyZWFkeS4KKyAgIGNvbnN0IHRUeXBlTWFwOjpjb25zdF9pdGVyYXRvciBmb3VuZFR5cGUgPSB0eXBlTWFwLmZpbmQodHlwZURhdGEpOworCisgICBpZiAoZm91bmRUeXBlICE9IHR5cGVNYXAuZW5kKCkpCisgICAgICByZXR1cm4gZm91bmRUeXBlLT5zZWNvbmQ7CisgICAKKyAgIC8vIE90aGVyd2lzZSwgd2UgbXVzdCBjb252ZXJ0IGl0LgorICAgY29uc3QgZ2xzbF90eXBlKiByZXR1cm5fdHlwZSA9IGdsc2xfdHlwZTo6ZXJyb3JfdHlwZTsKKworICAgY29uc3QgRU1kVHlwZUxheW91dCBtZFR5cGUgPSBtZE5vZGUgPyBHZXRNZFR5cGVMYXlvdXQobWROb2RlKSA6IGdsYTo6RU10bE5vbmU7CisKKyAgIGNvbnN0IGJvb2wgc2lnbmVkSW50ID0gIWdlblVuc2lnbmVkICYmCisgICAgICAgICAgICgobGx2bVZhbHVlICYmIHNpbnRWYWx1ZXMuZmluZChsbHZtVmFsdWUpICE9IHNpbnRWYWx1ZXMuZW5kKCkpIHx8CisgICAgICAgICAgICAgICAobWRUeXBlICE9IEVNdGxVbnNpZ25lZCkpOworCisgICAvLyBUT0RPOiBoYW5kbGUgcHJlY2lzaW9uLCBldGMKKyAgIHN3aXRjaCAodHlwZS0+Z2V0VHlwZUlEKCkpCisgICB7CisgICBjYXNlIGxsdm06OlR5cGU6OlZlY3RvclR5SUQ6CisgICAgICB7CisgICAgICAgICBnbHNsX2Jhc2VfdHlwZSBnbHNsQmFzZVR5cGU7CisKKyAgICAgICAgIGlmICh0eXBlLT5nZXRDb250YWluZWRUeXBlKDApID09IHR5cGUtPmdldEZsb2F0VHkodHlwZS0+Z2V0Q29udGV4dCgpKSkKKyAgICAgICAgICAgIGdsc2xCYXNlVHlwZSA9IEdMU0xfVFlQRV9GTE9BVDsKKyAgICAgICAgIGVsc2UgaWYgKGdsYTo6SXNCb29sZWFuKHR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpKQorICAgICAgICAgICAgZ2xzbEJhc2VUeXBlID0gR0xTTF9UWVBFX0JPT0w7CisgICAgICAgICBlbHNlIGlmIChnbGE6OklzSW50ZWdlcih0eXBlLT5nZXRDb250YWluZWRUeXBlKDApKSkKKyAgICAgICAgICAgIGdsc2xCYXNlVHlwZSA9IHNpZ25lZEludCA/IEdMU0xfVFlQRV9JTlQgOiBHTFNMX1RZUEVfVUlOVDsKKyAgICAgICAgIGVsc2UgCisgICAgICAgICAgICBnbHNsQmFzZVR5cGUgPSBHTFNMX1RZUEVfVk9JRDsKKworICAgICAgICAgLy8gVE9ETzogVWdseSBjb25zdF9jYXN0IG5lY2Vzc2FyeSBoZXJlIGF0IHRoZSBtb21lbnQuICBGaXguCisgICAgICAgICBjb25zdCBpbnQgY29tcG9uZW50Q291bnQgPSBnbGE6OkdldENvbXBvbmVudENvdW50KGNvbnN0X2Nhc3Q8bGx2bTo6VHlwZSo+KHR5cGUpKTsKKyAgICAgICAgIHJldHVybl90eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoZ2xzbEJhc2VUeXBlLCBjb21wb25lbnRDb3VudCwgMSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAKKyAgIGNhc2UgbGx2bTo6VHlwZTo6QXJyYXlUeUlEOgorICAgICAgeworICAgICAgICAgY29uc3QgbGx2bTo6QXJyYXlUeXBlKiBhcnJheVR5cGUgICAgID0gbGx2bTo6ZHluX2Nhc3Q8Y29uc3QgbGx2bTo6QXJyYXlUeXBlPih0eXBlKTsKKyAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqICAgICAgY29udGFpbmVkVHlwZSA9IGFycmF5VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKKyAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgYXJyYXlTaXplICAgICA9IGFycmF5VHlwZS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAgICAgIGFzc2VydChhcnJheVR5cGUpOworCisgICAgICAgICBjb25zdCBib29sIGlzTWF0ID0gKG1kVHlwZSA9PSBFTXRsUm93TWFqb3JNYXRyaXggfHwgbWRUeXBlID09IEVNdGxDb2xNYWpvck1hdHJpeCk7CisKKyAgICAgICAgIC8vIFJlY29uc3RydWN0IG1hdHJpeCB0eXBlcyBmcm9tIGFycmF5cyBvZiB2ZWN0b3JzLCBwZXIgbWV0YWRhdGEgaGludHMKKyAgICAgICAgIGlmIChpc01hdCkgeworICAgICAgICAgICAgY29uc3QgbGx2bTo6VmVjdG9yVHlwZSogdmVjdG9yVHlwZSA9IGxsdm06OmR5bl9jYXN0PGxsdm06OlZlY3RvclR5cGU+KGNvbnRhaW5lZFR5cGUpOworCisgICAgICAgICAgICAvLyBGb3IgYXJyYXlzIG9mIGFycmF5cyBvZiB2ZWN0b3JzLCB3ZSB3YW50IG9uZSBtb3JlIGxldmVsIG9mIGRlcmVmZXJlbmNlLgorICAgICAgICAgICAgaWYgKHZlY3RvclR5cGUpCisgICAgICAgICAgICAgICByZXR1cm4gZ2xzbE1hdFR5cGUoYXJyYXlTaXplLCB2ZWN0b3JUeXBlLT5nZXROdW1FbGVtZW50cygpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gTWV0YWRhdGEgdHlwZSB3aWxsIGJlIHRoZSBzYW1lCisgICAgICAgICBjb25zdCBnbHNsX3R5cGUqIGNvbnRhaW5lZElSVHlwZSA9IGxsdm1UeXBlVG9IaXJUeXBlKGNvbnRhaW5lZFR5cGUsIG1kTm9kZSwgbGx2bVZhbHVlKTsKKworICAgICAgICAgcmV0dXJuX3R5cGUgPSBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZShjb250YWluZWRJUlR5cGUsIGFycmF5U2l6ZSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgY2FzZSBsbHZtOjpUeXBlOjpTdHJ1Y3RUeUlEOgorICAgICAgeworICAgICAgICAgY29uc3QgbGx2bTo6U3RydWN0VHlwZSogc3RydWN0VHlwZSA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06OlN0cnVjdFR5cGU+KHR5cGUpOworICAgICAgICAgYXNzZXJ0KHN0cnVjdFR5cGUpOworCisgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgc3RydWN0TmFtZSA9IHN0cnVjdFR5cGUtPmlzTGl0ZXJhbCgpID8gIiIgOiBzdHJ1Y3RUeXBlLT5nZXROYW1lKCk7CisKKyAgICAgICAgIC8vIENoZWNrIGZvciBhIHRvcCBsZXZlbCB1bmlmb3JtL2lucHV0L291dHB1dCBNRCB3aXRoIGFuIGFnZ3JlZ2F0ZSBNRCBoYW5naW5nIG9mZiBpdAorICAgICAgICAgLy8gVE9ETzogc2V0IGFycmF5Q2hpbGQgcHJvcGVybHkKKyAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBibG9ja05hbWU7CisgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICAgTWV0YVR5cGUgbWV0YVR5cGU7CisgICAgICAgICBpZiAobWROb2RlKSB7CisgICAgICAgICAgICAgbmFtZSA9IG1kTm9kZS0+Z2V0T3BlcmFuZCgyKS0+Z2V0TmFtZSgpOworICAgICAgICAgICAgIFN0cmlwU3VmZml4KG5hbWUsICJfdHlwZVByb3h5Iik7CisgICAgICAgICAgICAgU3RyaXBTdWZmaXgobmFtZSwgIl9zaGFkb3ciKTsKKyAgICAgICAgICAgICBibG9ja05hbWUgPSBuYW1lOworCisgICAgICAgICAgICAgZGVjb2RlTWRUeXBlc0VtaXRNZFF1YWxpZmllcnMoaXNJb01kKG1kTm9kZSksIG1kTm9kZSwgdHlwZSwgZmFsc2UsIG1ldGFUeXBlKTsKKworICAgICAgICAgICAgIGlmIChtZXRhVHlwZS5pb0tpbmQgPT0gRU1pb1BpcGVPdXRCbG9jaykKKyAgICAgICAgICAgICAgICAgc3RydWN0TmFtZSA9ICJnbF9QZXJWZXJ0ZXgiOworICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGFUeXBlLmlvS2luZCA9PSBFTWlvUGlwZUluQmxvY2spCisgICAgICAgICAgICAgICAgIHN0cnVjdE5hbWUgPSAiZ2xfUGVyVmVydGV4LjAiOworCisgICAgICAgICAgICAgLy8gQ29udmVydCBJTyBtZXRhZGF0YSB0byBhZ2dyZWdhdGUgbWV0YWRhdGEgaWYgbmVlZGVkLgorICAgICAgICAgICAgIGlmIChpc0lvQWdncmVnYXRlTWQobWROb2RlKSkKKyAgICAgICAgICAgICAgICBtZE5vZGUgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpNRE5vZGU+KG1kTm9kZS0+Z2V0T3BlcmFuZCg0KSk7CisKKyAgICAgICAgICAgICAvLyB0cmFjayB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSB0eXBlIGFuZCBpdCdzIGFnZ3JlZ2F0ZSBtZXRhZGF0YQorICAgICAgICAgICAgIHR5cGVNZEFnZ3JlZ2F0ZU1hcFtzdHJ1Y3RUeXBlXSA9IG1kTm9kZTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuX3R5cGUgPSBjb252ZXJ0U3RydWN0VHlwZShzdHJ1Y3RUeXBlLCBzdHJ1Y3ROYW1lLCBibG9ja05hbWUsIG1kTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YVR5cGUudHlwZUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YVR5cGUucXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhVHlwZS5ibG9jayk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgY2FzZSBsbHZtOjpUeXBlOjpQb2ludGVyVHlJRDoKKyAgICAgIC8vIFRPRE86CisgICAgICBhc3NlcnQoMCAmJiAidW5pbXBsZW1lbnRlZCIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgbGx2bTo6VHlwZTo6SW50ZWdlclR5SUQ6CisgICAgICB7CisgICAgICAgICAvLyBTYW1wbGVyIHR5cGUgY29udmVyc2lvbnMKKyAgICAgICAgIGlmIChtZFR5cGUgPT0gRU10bFNhbXBsZXIpIHsKKyAgICAgICAgICAgIEVNZFNhbXBsZXIgICAgICAgICBtZFNhbXBsZXI7CisgICAgICAgICAgICBsbHZtOjpUeXBlKiAgICAgICAgbWRUeXBlOworICAgICAgICAgICAgRU1kU2FtcGxlckRpbSAgICAgIG1kU2FtcGxlckRpbTsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBpc0FycmF5OworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIGlzU2hhZG93OworICAgICAgICAgICAgRU1kU2FtcGxlckJhc2VUeXBlIG1kQmFzZVR5cGU7CisKKyAgICAgICAgICAgIC8vIEhhbmRsZSBhZ2dyZWdhdGUgbWVtYmVyIGZvcm0KKyAgICAgICAgICAgIGNvbnN0IGludCB0eXBlTm9kZVBvcyA9IGlzSW9NZChtZE5vZGUpID8gMyA6IDE7CisKKyAgICAgICAgICAgIGNvbnN0IGxsdm06Ok1ETm9kZSogdHlwZU1kTm9kZSAgICA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06Ok1ETm9kZT4obWROb2RlLT5nZXRPcGVyYW5kKHR5cGVOb2RlUG9zKSk7CisgICAgICAgICAgICBhc3NlcnQodHlwZU1kTm9kZSk7CisgICAgICAgICAgICBjb25zdCBsbHZtOjpNRE5vZGUqIHNhbXBsZXJNZE5vZGUgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpNRE5vZGU+KHR5cGVNZE5vZGUtPmdldE9wZXJhbmQoMykpOworICAgICAgICAgICAgYXNzZXJ0KHNhbXBsZXJNZE5vZGUpOworCisgICAgICAgICAgICBpZiAoZ2xhOjpDcmFja1NhbXBsZXJNZChzYW1wbGVyTWROb2RlLCBtZFNhbXBsZXIsIG1kVHlwZSwgbWRTYW1wbGVyRGltLCBpc0FycmF5LCBpc1NoYWRvdywgbWRCYXNlVHlwZSkpCisgICAgICAgICAgICAgICByZXR1cm4gR2V0U2FtcGxlclR5cGUobWRTYW1wbGVyLCBtZEJhc2VUeXBlLCBtZFNhbXBsZXJEaW0sIGlzU2hhZG93LCBpc0FycmF5KTsKKyAgICAgICAgIH0KKworICAgICAgICAgZ2xzbF9iYXNlX3R5cGUgYmFzZVR5cGUgPSBzaWduZWRJbnQgPyBHTFNMX1RZUEVfSU5UIDogR0xTTF9UWVBFX1VJTlQ7CisKKyAgICAgICAgIGlmIChnbGE6OklzQm9vbGVhbih0eXBlKSkKKyAgICAgICAgICAgIGJhc2VUeXBlID0gR0xTTF9UWVBFX0JPT0w7CisKKyAgICAgICAgIHJldHVybl90eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoYmFzZVR5cGUsIDEsIDEpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgIGNhc2UgbGx2bTo6VHlwZTo6RmxvYXRUeUlEOgorICAgICAgcmV0dXJuX3R5cGUgPSBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsIDEsIDEpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgbGx2bTo6VHlwZTo6Vm9pZFR5SUQ6CisgICAgICByZXR1cm5fdHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9WT0lELCAxLCAxKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgTExWTSB0eXBlIik7CisgICAgICByZXR1cm5fdHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9GTE9BVCwgMSwgMSk7CisgICB9CisKKyAgIHJldHVybiB0eXBlTWFwW3R5cGVEYXRhXSA9IHJldHVybl90eXBlOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRyYW5zbGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBISVIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6c3RhcnRGdW5jdGlvbkRlY2xhcmF0aW9uKGNvbnN0IGxsdm06OlR5cGUqIHR5cGUsIGxsdm06OlN0cmluZ1JlZiBuYW1lKQoreworICAgLy8gSW5pdGlhbGl6ZSBmdW5jdGlvbiBzdGF0ZTogd2Ugb25seSBldmVyIHRyYW5zbGF0ZSBvbmUgZnVuY3Rpb24gYXQgYSB0aW1lLCBhcworICAgLy8gdGhleSBjYW5ub3QgYmUgbmVzdGVkLgorICAgcmVzZXRGblRyYW5zbGF0aW9uU3RhdGUoKTsKKyAgIAorICAgLy8gVE9ETzogY3JlYXRlIHBhcmFtZXRlciBsaXN0LCBldGMgZnJvbQorICAgLy8gaXJfZnVuY3Rpb24gYW5kIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZQorCisgICBmbk5hbWUgICAgICAgPSByYWxsb2Nfc3RyZHVwKHNoYWRlciwgbmFtZS5zdHIoKS5jX3N0cigpKTsKKyAgIGZuUmV0dXJuVHlwZSA9IGxsdm1UeXBlVG9IaXJUeXBlKHR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOworCisgICAvLyBDcmVhdGUgZm4gYW5kIHNpZ25hdHVyZSBvYmplY3RzCisgICBmbkZ1bmN0aW9uID0gbmV3KHNoYWRlcikgaXJfZnVuY3Rpb24oZm5OYW1lKTsKKyAgIGZuU2lnbmF0dXJlID0gbmV3KHNoYWRlcikgaXJfZnVuY3Rpb25fc2lnbmF0dXJlKGZuUmV0dXJuVHlwZSk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRmluaXNoIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVuZEZ1bmN0aW9uRGVjbGFyYXRpb24oKQoreworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXJ0IHRyYW5zbGF0aW9uIG9mIGZ1bmN0aW9uIGJvZHkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6c3RhcnRGdW5jdGlvbkJvZHkoKQoreworICAgYXNzZXJ0KHN0YXRlLT5jdXJyZW50X2Z1bmN0aW9uID09IE5VTEwpOworCisgICAvLyBTdGFydCBidWlsZGluZyBuZXcgaW5zdHJ1Y3Rpb24gbGlzdAorICAgaW5zdHJ1Y3Rpb25TdGFjay5wdXNoX2JhY2soJmZuU2lnbmF0dXJlLT5ib2R5KTsKKworICAgaWYgKCFzdGF0ZS0+c3ltYm9scy0+YWRkX2Z1bmN0aW9uKGZuRnVuY3Rpb24pKSB7CisgICAgICAvLyBTaG91bGRuJ3QgZmFpbCwgYmVjYXVzZSBzZW1hbnRpYyBjaGVja2luZyBkb25lIGJ5IGdsc2xhbmcKKyAgICAgIHJldHVybiBlcnJvcigidW5hYmxlIHRvIGFkZCBmdW5jdGlvbiIpOworICAgfQorCisgICBlbWl0X2Z1bmN0aW9uKHN0YXRlLCBmbkZ1bmN0aW9uKTsKKyAgIGZuRnVuY3Rpb24tPmFkZF9zaWduYXR1cmUoZm5TaWduYXR1cmUpOworCisgICAvLyBUcmFuc2ZlciB0aGUgZm4gcGFyYW1ldGVycyB0byB0aGUgSElSIHNpZ25hdHVyZQorICAgZm5TaWduYXR1cmUtPnJlcGxhY2VfcGFyYW1ldGVycygmZm5QYXJhbWV0ZXJzKTsKKworICAgc3RhdGUtPmN1cnJlbnRfZnVuY3Rpb24gPSBmblNpZ25hdHVyZTsKKyAgIHN0YXRlLT5zeW1ib2xzLT5wdXNoX3Njb3BlKCk7CisKKyAgIC8vIEZvciBtYWluLCBwcmVwZW5kIHByb2xvZ3VlLCBpZiBhbnkKKyAgIHdoaWxlICghcHJvbG9ndWUuZW1wdHkoKSkgeworICAgICAgYWRkSVJJbnN0cnVjdGlvbihwcm9sb2d1ZS5mcm9udCgpKTsKKyAgICAgIHByb2xvZ3VlLnBvcF9mcm9udCgpOworICAgfQorfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVuZCB0cmFuc2xhdGlvbiBvZiBmdW5jdGlvbiBib2R5CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVuZEZ1bmN0aW9uQm9keSgpCit7CisgICBmblNpZ25hdHVyZS0+aXNfZGVmaW5lZCA9IHRydWU7IC8vIHRlbGwgbGlua2VyIGZ1bmN0aW9uIGlzIGRlZmluZWQKKworICAgYXNzZXJ0KGluc3RydWN0aW9uU3RhY2suc2l6ZSgpID49IDIpOyAgLy8gYXQgbGVhc3QgMSBmb3Igc2hhZGVyLCAxIGZvciBmdW5jdGlvbgorICAgaW5zdHJ1Y3Rpb25TdGFjay5wb3BfYmFjaygpOworCisgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9IDA7IC8vIFJlc2V0IHRoaW5ncyBzZXQgaW4gc3RhcnRGdW5jdGlvbkJvZHkKKyAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsgLy8gLi4uCisKKyAgIC8vIFdlJ3ZlIG5vdyBoYW5kZWQgb2ZmICh0byB0aGUgSElSKSBvd25lcnNoaXAgb2YgdGhlc2UgYml0cyBvZiB0cmFuc2xhdGlvbgorICAgLy8gc3RhdGUsIHNvIGRvbid0IGZyZWUgdGhlbSEKKyAgIGZuTmFtZSA9IDA7CisgICBmblJldHVyblR5cGUgPSAwOworICAgZm5TaWduYXR1cmUgPSAwOworICAgZm5GdW5jdGlvbiA9IDA7CisgICBmblBhcmFtZXRlcnMubWFrZV9lbXB0eSgpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENyZWF0ZSBJUiBjb25zdGFudCB2YWx1ZSBmcm9tIE1lc2EgY29uc3RhbnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSBpcl9ydmFsdWUqIE1lc2FHbGFzc1RyYW5zbGF0b3I6Om5ld0lSR2xvYmFsKGNvbnN0IGxsdm06OlZhbHVlKiB2YWx1ZSwgY29uc3QgY2hhciogbmFtZSkKK3sKKyAgIC8vIFRPRE86IG1heWJlIHRoaXMgY2FuJ3QgYmUgcmVhY2hlZD8gIElmIHdlIGFsd2F5cyBzZWUgYSBMb2FkIGZpcnN0LCB0aGF0J2xsCisgICAvLyB0YWtlIGNhcmUgb2YgaXQuCisgICBhc3NlcnQoMCk7CisgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZWUgaWYgdGhpcyBjb25zdGFudCBpcyBhIHplcm8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSBib29sIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmlzQ29uc3RhbnRaZXJvKGNvbnN0IGxsdm06OkNvbnN0YW50KiBjb25zdGFudCkgY29uc3QKK3sKKyAgIC8vIENvZGUgc25pcHBpdCBib3Jyb3dlZCBmcm9tIEx1bmFyR2xhc3MgR0xTTCBiYWNrZW5kCisgICBpZiAoIWNvbnN0YW50IHx8IElzVW5kZWYoY29uc3RhbnQpKQorICAgICAgcmV0dXJuIHRydWU7CisgICBlbHNlIGlmIChsbHZtOjppc2E8bGx2bTo6Q29uc3RhbnRBZ2dyZWdhdGVaZXJvPihjb25zdGFudCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDcmVhdGUgc2ltcGxlIHNjYWxhciBjb25zdGFudAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUCitNZXNhR2xhc3NUcmFuc2xhdG9yOjpuZXdJUlNjYWxhckNvbnN0YW50KGNvbnN0IGxsdm06OkNvbnN0YW50KiBjb25zdGFudCkgY29uc3QKK3sKKyAgIGlmIChpc0NvbnN0YW50WmVybyhjb25zdGFudCkpCisgICAgICAgcmV0dXJuIFQoMCk7CisKKyAgIGNvbnN0IGxsdm06OlR5cGUqIHR5cGUgPSBjb25zdGFudC0+Z2V0VHlwZSgpOworCisgICBzd2l0Y2ggKHR5cGUtPmdldFR5cGVJRCgpKSB7CisgICBjYXNlIGxsdm06OlR5cGU6OkludGVnZXJUeUlEOgorICAgICAgeworICAgICAgICAgaWYgKGdsYTo6SXNCb29sZWFuKHR5cGUpKSB7CisgICAgICAgICAgICBpZiAoR2V0Q29uc3RhbnRJbnQoY29uc3RhbnQpKQorICAgICAgICAgICAgICAgcmV0dXJuIFQodHJ1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICByZXR1cm4gVChmYWxzZSk7CisgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBUKEdldENvbnN0YW50SW50KGNvbnN0YW50KSk7CisgICAgICB9CisKKyAgIGNhc2UgbGx2bTo6VHlwZTo6RmxvYXRUeUlEOgorICAgICAgcmV0dXJuIFQoR2V0Q29uc3RhbnRGbG9hdChjb25zdGFudCkpOworCisgICBkZWZhdWx0OgorICAgICAgZXJyb3IoImVycm9yIGluIGNvbnN0YW50IGNvbnZlcnNpb24iKTsKKyAgICAgIHJldHVybiBUKDApOworICAgfQorfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENyZWF0ZSBJUiBjb25zdGFudCB2YWx1ZSBmcm9tIE1lc2EgY29uc3RhbnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSBpcl9jb25zdGFudCogTWVzYUdsYXNzVHJhbnNsYXRvcjo6bmV3SVJDb25zdGFudChjb25zdCBsbHZtOjpWYWx1ZSogdmFsdWUpCit7CisgICBjb25zdCBsbHZtOjpDb25zdGFudCogY29uc3RhbnQgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpDb25zdGFudD4odmFsdWUpOworICAgY29uc3QgbGx2bTo6VHlwZSogICAgIHR5cGUgICAgID0gY29uc3RhbnQtPmdldFR5cGUoKTsKKworICAgYXNzZXJ0KGNvbnN0YW50KTsKKworICAgLy8gSGFuZGxlIHVuZGVmaW5lZCBjb25zdGFudCB2YWx1ZXMKKyAgIGlmIChsbHZtOjppc2E8bGx2bTo6VW5kZWZWYWx1ZT4oY29uc3RhbnQpKQorICAgICAgcmV0dXJuIGFkZElSVW5kZWZpbmVkKHR5cGUpOworCisgICBjb25zdCBib29sIGlzWmVybyA9IGlzQ29uc3RhbnRaZXJvKGNvbnN0YW50KTsKKworICAgaWYgKGlzWmVybykKKyAgICAgIHJldHVybiBpcl9jb25zdGFudDo6emVybyhzaGFkZXIsIGxsdm1UeXBlVG9IaXJUeXBlKHR5cGUpKTsKKworICAgc3dpdGNoICh0eXBlLT5nZXRUeXBlSUQoKSkKKyAgIHsKKyAgIGNhc2UgbGx2bTo6VHlwZTo6VmVjdG9yVHlJRDoKKyAgICAgIHsKKyAgICAgICAgIGlyX2NvbnN0YW50X2RhdGEgZGF0YTsKKyAgICAgICAgIGNvbnN0IGludCBjb3VudCA9IGdsYTo6R2V0Q29tcG9uZW50Q291bnQoY29uc3RfY2FzdDxsbHZtOjpUeXBlKj4odHlwZSkpOworICAgICAgICAgY29uc3QgbGx2bTo6Q29uc3RhbnREYXRhU2VxdWVudGlhbCogc2VxRGF0YSAgICA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06OkNvbnN0YW50RGF0YVNlcXVlbnRpYWw+KGNvbnN0YW50KTsKKyAgICAgICAgIGNvbnN0IGxsdm06OkNvbnN0YW50VmVjdG9yKiAgICAgICAgIHZlY3RvckRhdGEgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpDb25zdGFudFZlY3Rvcj4oY29uc3RhbnQpOworCisgICAgICAgICBjb25zdCBsbHZtOjpDb25zdGFudCogc3BsYXRWYWx1ZSA9IDA7CisKKyAgICAgICAgIGlmIChzZXFEYXRhKQorICAgICAgICAgICAgc3BsYXRWYWx1ZSA9IHNlcURhdGEtPmdldFNwbGF0VmFsdWUoKTsKKworICAgICAgICAgaWYgKHZlY3RvckRhdGEpCisgICAgICAgICAgICBzcGxhdFZhbHVlID0gdmVjdG9yRGF0YS0+Z2V0U3BsYXRWYWx1ZSgpOworCisgICAgICAgICBjb25zdCBnbHNsX3R5cGUqIGdsc2xUeXBlID0gMDsKKworICAgICAgICAgLy8gVE9ETzogbXVzdCB3ZSBoYW5kbGUgb3RoZXIgbGx2bSBDb25zdGFudCBzdWJjbGFzc2VzPworICAgICAgICAgZm9yIChpbnQgb3A9MDsgb3A8Y291bnQ7ICsrb3ApIHsKKyAgICAgICAgICAgIGNvbnN0IGxsdm06OkNvbnN0YW50KiBvcERhdGEgPQorICAgICAgICAgICAgICAgaXNaZXJvICAgICA/IDAgOgorICAgICAgICAgICAgICAgc3BsYXRWYWx1ZSA/IHNwbGF0VmFsdWUgOgorICAgICAgICAgICAgICAgdmVjdG9yRGF0YSA/IGR5bl9jYXN0PGNvbnN0IGxsdm06OkNvbnN0YW50Pih2ZWN0b3JEYXRhLT5nZXRPcGVyYW5kKG9wKSkgOgorICAgICAgICAgICAgICAgc2VxRGF0YSA/IHNlcURhdGEtPmdldEVsZW1lbnRBc0NvbnN0YW50KG9wKSA6CisgICAgICAgICAgICAgICAwOworCisgICAgICAgICAgICBpZiAodHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSA9PSB0eXBlLT5nZXRGbG9hdFR5KHR5cGUtPmdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgICAgIGdsc2xUeXBlID0gZ2xzbF90eXBlOjp2ZWMoY291bnQpOworICAgICAgICAgICAgICAgZGF0YS5mW29wXSA9IG5ld0lSU2NhbGFyQ29uc3RhbnQ8ZmxvYXQ+KG9wRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChnbGE6OklzQm9vbGVhbih0eXBlLT5nZXRDb250YWluZWRUeXBlKDApKSkgeworICAgICAgICAgICAgICAgZ2xzbFR5cGUgPSBnbHNsX3R5cGU6OmJ2ZWMoY291bnQpOworICAgICAgICAgICAgICAgZGF0YS5iW29wXSA9IG5ld0lSU2NhbGFyQ29uc3RhbnQ8Ym9vbD4ob3BEYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2xhOjpJc0ludGVnZXIodHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSkpIHsKKyAgICAgICAgICAgICAgIC8vIFRPRE86IGRpc3Rpbmd1aXNoIHVuc2lnbmVkIGZyb20gc2lnbmVkCisgICAgICAgICAgICAgICBnbHNsVHlwZSA9IGdsc2xfdHlwZTo6aXZlYyhjb3VudCk7CisgICAgICAgICAgICAgICBkYXRhLmlbb3BdID0gbmV3SVJTY2FsYXJDb25zdGFudDxpbnQ+KG9wRGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgZXJyb3IoInVuZXhwZWN0ZWQgTExWTSB0eXBlIik7CisgICAgICAgICAgICAgICBnbHNsVHlwZSA9IGdsc2xfdHlwZTo6dmVjKGNvdW50KTsKKyAgICAgICAgICAgICAgIGRhdGEuZltvcF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBhc3NlcnQoZ2xzbFR5cGUpOworCisgICAgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoZ2xzbFR5cGUsICZkYXRhKTsKKyAgICAgIH0KKyAKKyAgIGNhc2UgbGx2bTo6VHlwZTo6SW50ZWdlclR5SUQ6CisgICAgICAvLyBUT0RPOiBkaXN0aW5ndWlzaCB1bnNpZ25lZCBmcm9tIHNpZ25lZCwgdXNlIGdldFNFeHRWYWx1ZSBvciBnZXRaRXh0VmFsdWUgYXBwcm9wcmlhdGVseQorICAgICAgaWYgKGdsYTo6SXNCb29sZWFuKHR5cGUpKQorICAgICAgICAgcmV0dXJuIG5ldyhzaGFkZXIpIGlyX2NvbnN0YW50KG5ld0lSU2NhbGFyQ29uc3RhbnQ8Ym9vbD4oY29uc3RhbnQpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChuZXdJUlNjYWxhckNvbnN0YW50PGludD4oY29uc3RhbnQpKTsKKworICAgY2FzZSBsbHZtOjpUeXBlOjpGbG9hdFR5SUQ6CisgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQobmV3SVJTY2FsYXJDb25zdGFudDxmbG9hdD4oY29uc3RhbnQpKTsKKworICAgY2FzZSBsbHZtOjpUeXBlOjpTdHJ1Y3RUeUlEOgorICAgY2FzZSBsbHZtOjpUeXBlOjpBcnJheVR5SUQ6CisgICAgICB7CisgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiBhZ2dyVHlwZSA9IDA7CisgICAgICAgICBpbnQgICAgICAgICAgICAgICBhZ2dyU2l6ZSA9IDA7CisKKyAgICAgICAgIGlmIChjb25zdCBsbHZtOjpTdHJ1Y3RUeXBlKiBzdHJ1Y3RUeXBlID0gbGx2bTo6ZHluX2Nhc3Q8Y29uc3QgbGx2bTo6U3RydWN0VHlwZT4odHlwZSkpIHsKKyAgICAgICAgICAgICBhZ2dyU2l6ZSA9IHN0cnVjdFR5cGUtPmdldE51bUVsZW1lbnRzKCk7CisgICAgICAgICAgICAgYWdnclR5cGUgPSBzdHJ1Y3RUeXBlOworICAgICAgICAgfSBlbHNlIGlmIChjb25zdCBsbHZtOjpBcnJheVR5cGUqIGFycmF5VHlwZSA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06OkFycmF5VHlwZT4odHlwZSkpIHsKKyAgICAgICAgICAgICBhZ2dyU2l6ZSA9IGFycmF5VHlwZS0+Z2V0TnVtRWxlbWVudHMoKTsKKyAgICAgICAgICAgICBhZ2dyVHlwZSA9IGFycmF5VHlwZTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGFzc2VydCgwICYmICJ1bmV4cGVjdGVkIGNvbnN0YW50IGFnZ3JlZ2F0ZSB0eXBlIik7CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbnN0IGxsdm06OkNvbnN0YW50RGF0YVNlcXVlbnRpYWwqIGRhdGFTZXF1ZW50aWFsID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnREYXRhU2VxdWVudGlhbD4oY29uc3RhbnQpOworCisgICAgICAgICAvLyBQb3B1bGF0ZSBhIGxpc3Qgb2YgZW50cmllcworICAgICAgICAgZXhlY19saXN0IGNvbnN0YW50VmFsdWVzOworICAgICAgICAgZm9yIChpbnQgZWxlbWVudCA9IDA7IGVsZW1lbnQgPCBhZ2dyU2l6ZTsgKytlbGVtZW50KSB7CisgICAgICAgICAgICBjb25zdCBsbHZtOjpDb25zdGFudCogY29uc3RFbGVtZW50OworICAgICAgICAgICAgaWYgKGRhdGFTZXF1ZW50aWFsKQorICAgICAgICAgICAgICAgY29uc3RFbGVtZW50ID0gZGF0YVNlcXVlbnRpYWwtPmdldEVsZW1lbnRBc0NvbnN0YW50KGVsZW1lbnQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgY29uc3RFbGVtZW50ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q29uc3RhbnQ+KGNvbnN0YW50LT5nZXRPcGVyYW5kKGVsZW1lbnQpKTsKKworICAgICAgICAgICAgY29uc3RhbnRWYWx1ZXMucHVzaF90YWlsKG5ld0lSQ29uc3RhbnQoY29uc3RFbGVtZW50KSk7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChsbHZtVHlwZVRvSGlyVHlwZShhZ2dyVHlwZSwgMCwgY29uc3RhbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25zdGFudFZhbHVlcyk7CisgICAgICB9CisKKyAgIGNhc2UgbGx2bTo6VHlwZTo6UG9pbnRlclR5SUQ6IC8vIGZhbGwgdGhyb3VnaC4uLgorICAgY2FzZSBsbHZtOjpUeXBlOjpWb2lkVHlJRDogICAgLy8gZmFsbCB0aHJvdWdoCisgICBkZWZhdWx0OgorICAgICAgZXJyb3IoInVuZXhwZWN0ZWQgY29uc3RhbnQgdHlwZSIpOworICAgICAgcmV0dXJuIG5ldyhzaGFkZXIpIGlyX2NvbnN0YW50KDAuMGYpOworICAgfQorfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFkZCB0eXBlLXNhZmUgdW5kZWZpbmVkIHZhbHVlIGluIGNhc2Ugc29tZW9uZSBsb29rcyB1cCBhIG5vdC1kZWZpbmVkIHZhbHVlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgaXJfY29uc3RhbnQqIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZElSVW5kZWZpbmVkKGNvbnN0IGxsdm06OlR5cGUqIHR5cGUpCit7CisgICAvLyBUT0RPOiBhZGQgaW5mb2xvZyB3YXJuaW5nIGFib3V0IHVuZGVmaW5lZCB2YWx1ZXMKKworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRlYWRiZWVmVSA9IDB4ZGVhZGJlZWY7CisgICBzdGF0aWMgY29uc3QgZmxvYXQgZGVhZGJlZWZGID0gKigoZmxvYXQgKikmZGVhZGJlZWZVKTsKKworICAgc3dpdGNoICh0eXBlLT5nZXRUeXBlSUQoKSkKKyAgIHsKKyAgIGNhc2UgbGx2bTo6VHlwZTo6VmVjdG9yVHlJRDoKKyAgICAgIHsKKyAgICAgICAgIGNvbnN0IGludCBjb3VudCA9IGdsYTo6R2V0Q29tcG9uZW50Q291bnQoY29uc3RfY2FzdDxsbHZtOjpUeXBlKj4odHlwZSkpOworCisgICAgICAgICBpZiAodHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSA9PSB0eXBlLT5nZXRGbG9hdFR5KHR5cGUtPmdldENvbnRleHQoKSkpCisgICAgICAgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoZGVhZGJlZWZGLCBjb3VudCk7CisgICAgICAgICBlbHNlIGlmIChnbGE6OklzQm9vbGVhbih0eXBlLT5nZXRDb250YWluZWRUeXBlKDApKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChmYWxzZSwgY291bnQpOworICAgICAgICAgZWxzZSBpZiAodHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSA9PSB0eXBlLT5nZXRJbnQzMlR5KHR5cGUtPmdldENvbnRleHQoKSkpCisgICAgICAgICAgICAvLyBUT0RPOiBkaXN0aW5ndWlzaCB1bnNpZ25lZCBmcm9tIHNpZ25lZAorICAgICAgICAgICAgcmV0dXJuIG5ldyhzaGFkZXIpIGlyX2NvbnN0YW50KGRlYWRiZWVmVSwgY291bnQpOworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBlcnJvcigidW5leHBlY3RlZCBMTFZNIHR5cGUiKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChkZWFkYmVlZkYpOworICAgICAgfQorIAorICAgY2FzZSBsbHZtOjpUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICAgIC8vIFRPRE86IGRpc3Rpbmd1aXNoIHVuc2lnbmVkIGZyb20gc2lnbmVkCisgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoZGVhZGJlZWZVKTsKKworICAgY2FzZSBsbHZtOjpUeXBlOjpGbG9hdFR5SUQ6CisgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoZGVhZGJlZWZGKTsKKworICAgY2FzZSBsbHZtOjpUeXBlOjpBcnJheVR5SUQ6CisgICAgICB7CisgICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIGxpa2VseSBub3Qgc3VmZmljaWVudC4gIG1hdHM/ICBhb2ZhPworICAgICAgICAgY29uc3QgbGx2bTo6QXJyYXlUeXBlKiBhcnJheVR5cGUgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpBcnJheVR5cGU+KHR5cGUpOworICAgICAgICAgYXNzZXJ0KGFycmF5VHlwZSk7CisKKyAgICAgICAgIGNvbnN0IGludCAgICAgICAgIGFycmF5U2l6ZSAgICAgPSBhcnJheVR5cGUtPmdldE51bUVsZW1lbnRzKCk7CisgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiBjb250YWluZWRUeXBlID0gYXJyYXlUeXBlLT5nZXRDb250YWluZWRUeXBlKDApOworCisgICAgICAgICByYWxsb2NfYXJyYXkoc2hhZGVyLCBpcl9jb25zdGFudCosIGFycmF5U2l6ZSk7CisKKyAgICAgICAgIGV4ZWNfbGlzdCogY29uc3RhbnRzID0gbmV3KHNoYWRlcikgZXhlY19saXN0OworCisgICAgICAgICBmb3IgKGludCBlPTA7IGU8YXJyYXlTaXplOyArK2UpIHsKKyAgICAgICAgICAgIGlyX2NvbnN0YW50KiBlbGVtZW50VmFsdWUgPSBhZGRJUlVuZGVmaW5lZChjb250YWluZWRUeXBlKS0+YXNfY29uc3RhbnQoKTsKKyAgICAgICAgICAgIGNvbnN0YW50cy0+cHVzaF90YWlsKGVsZW1lbnRWYWx1ZSk7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChsbHZtVHlwZVRvSGlyVHlwZSh0eXBlKSwgY29uc3RhbnRzKTsKKyAgICAgIH0KKworICAgY2FzZSBsbHZtOjpUeXBlOjpTdHJ1Y3RUeUlEOgorICAgICAgeworICAgICAgICAgY29uc3QgbGx2bTo6U3RydWN0VHlwZSogc3RydWN0VHlwZSA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06OlN0cnVjdFR5cGU+KHR5cGUpOworICAgICAgICAgYXNzZXJ0KHN0cnVjdFR5cGUpOworCisgICAgICAgICBjb25zdCBpbnQgc3RydWN0U2l6ZSA9IHN0cnVjdFR5cGUtPmdldFN0cnVjdE51bUVsZW1lbnRzKCk7CisgICAgICAgICByYWxsb2NfYXJyYXkoc2hhZGVyLCBpcl9jb25zdGFudCosIHN0cnVjdFNpemUpOworCisgICAgICAgICBleGVjX2xpc3QqIGNvbnN0YW50cyA9IG5ldyhzaGFkZXIpIGV4ZWNfbGlzdDsKKworICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgZiA9IDA7IGYgPCBzdHJ1Y3RTaXplOyArK2YpIHsKKyAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIGNvbnRhaW5lZFR5cGUgPSBzdHJ1Y3RUeXBlLT5nZXRDb250YWluZWRUeXBlKGYpOworICAgICAgICAgICAgaXJfY29uc3RhbnQqIGVsZW1lbnRWYWx1ZSA9IGFkZElSVW5kZWZpbmVkKGNvbnRhaW5lZFR5cGUpLT5hc19jb25zdGFudCgpOworICAgICAgICAgICAgY29uc3RhbnRzLT5wdXNoX3RhaWwoZWxlbWVudFZhbHVlKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIG5ldyhzaGFkZXIpIGlyX2NvbnN0YW50KGxsdm1UeXBlVG9IaXJUeXBlKHR5cGUpLCBjb25zdGFudHMpOworICAgICAgfQorCisKKyAgIGNhc2UgbGx2bTo6VHlwZTo6UG9pbnRlclR5SUQ6IC8vIGZhbGwgdGhyb3VnaAorICAgY2FzZSBsbHZtOjpUeXBlOjpWb2lkVHlJRDogICAgLy8gZmFsbCB0aHJvdWdoCisgICBkZWZhdWx0OgorICAgICAgZXJyb3IoInVuZXhwZWN0ZWQgTExWTSB0eXBlIik7CisgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoZGVhZGJlZWZGKTsKKyAgIH0KK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHZXQgYW4gSVIgdmFsdWUsIGVpdGhlciBieSBsb29raW5nIHVwIGV4aXN0aW5nIHZhbHVlLCBvciBtYWtpbmcgYQorICogbmV3IGNvbnN0YW50IG9yIGdsb2JhbAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIGlyX3J2YWx1ZSoKK01lc2FHbGFzc1RyYW5zbGF0b3I6OmdldElSVmFsdWUoY29uc3QgbGx2bTo6VmFsdWUqIGxsdm1WYWx1ZSwgaXJfaW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQoreworICAgdFZhbHVlTWFwOjpjb25zdF9pdGVyYXRvciBsb2NhdGlvbiA9IHZhbHVlTWFwLmZpbmQobGx2bVZhbHVlKTsKKworICAgLy8gSW5zZXJ0IGludG8gbWFwIGlmIG5vdCB0aGVyZQorICAgaWYgKGxvY2F0aW9uID09IHZhbHVlTWFwLmVuZCgpKSB7CisgICAgICAvLyBIYW5kbGUgY29uc3RhbnRzCisgICAgICBpZiAobGx2bTo6aXNhPGxsdm06OkNvbnN0YW50PihsbHZtVmFsdWUpKQorICAgICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXdJUkNvbnN0YW50KGxsdm1WYWx1ZSk7CisgICAgICAvLyBIYW5kbGUgZ2xvYmFsIHZhcmlhYmxlcworICAgICAgZWxzZSBpZiAobGx2bTo6aXNhPGxsdm06Okdsb2JhbFZhcmlhYmxlPihsbHZtVmFsdWUpKQorICAgICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXdJUkdsb2JhbChsbHZtVmFsdWUpOworCisgICAgICAvLyBJZiBhc2tpbmcgZm9yIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBkZWZhdWx0IHZhbHVlCisgICAgICBpZiAoaW5zdHJ1Y3Rpb24gPT0gMCkKKyAgICAgICAgIGluc3RydWN0aW9uID0gYWRkSVJVbmRlZmluZWQobGx2bVZhbHVlLT5nZXRUeXBlKCkpOworCisgICAgICBsb2NhdGlvbiA9IHZhbHVlTWFwLmluc2VydCh0VmFsdWVNYXA6OnZhbHVlX3R5cGUobGx2bVZhbHVlLCBpbnN0cnVjdGlvbikpLmZpcnN0OworICAgfQorCisgICAvLyBUT0RPOiBpcyB0aGVyZSBhbnkgcmVhc29uIHRvIGNsb25lIGFzc2lnbi9jYWxsIHJldHVybnM/CisKKyAgIGlyX3J2YWx1ZSogcnZhbHVlOworCisgICAvLyBSZXR1cm4gYXBwcm9wcmlhdGUgdmFsdWUKKyAgIGlmIChsb2NhdGlvbi0+c2Vjb25kLT5hc19hc3NpZ25tZW50KCkpIHsKKyAgICAgIC8vIEZvciBhc3NpZ25tZW50cywgcmV0dXJuIGEgcmVmIHRvIHRoZSB2YXJpYWJsZSBiZWluZyBhc3NpZ25lZAorICAgICAgcnZhbHVlID0gbG9jYXRpb24tPnNlY29uZC0+YXNfYXNzaWdubWVudCgpLT5saHM7CisgICB9IGVsc2UgaWYgKGxvY2F0aW9uLT5zZWNvbmQtPmFzX2NhbGwoKSkgeworICAgICAgLy8gZm9yIGNhbGxzLCByZXR1cm4gYSByZWYgdG8gdGhlIHJldHVybiB2YWx1ZQorICAgICAgcnZhbHVlID0gbG9jYXRpb24tPnNlY29uZC0+YXNfY2FsbCgpLT5yZXR1cm5fZGVyZWY7CisgICB9IGVsc2UgeworICAgICAgLy8gRm9yIGFsbCBvdGhlcnMsIHJldHVybiB0aGUgdmFsdWUsIG9yIGEgZGVyZWZlcmVuY2UKKyAgICAgIGlmIChsb2NhdGlvbi0+c2Vjb25kLT5hc19ydmFsdWUoKSkgeworICAgICAgICAgcnZhbHVlID0gbG9jYXRpb24tPnNlY29uZC0+YXNfcnZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgZXJyb3IoImludGVybmFsIGVycm9yIGZldGNoaW5nIHJ2YWx1ZSIpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBydmFsdWUtPmNsb25lKHNoYWRlciwgMCk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWFrZSB1cCBhIG5hbWUgZm9yIGEgbmV3IHZhcmlhYmxlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBjaGFyKiBNZXNhR2xhc3NUcmFuc2xhdG9yOjpuZXdOYW1lKGNvbnN0IGxsdm06OlZhbHVlKiBsbHZtVmFsdWUpCit7CisgICBzdGF0aWMgY29uc3QgY2hhciogYmFzZUxvY2FsTmFtZSA9ICIudGVtcCI7CisKKyAgIC8vIFRPRE86IFRoaXMgc3RyaW5nIGZsb3RjaGluZyBpcyBydW50aW1lIGluZWZmaWNpZW50LgorICAgLy8gUmVwbGFjZSB3aXRoIHNvbWV0aGluZyBmYXN0ZXIuCisgICBpZiAoIWxsdm1WYWx1ZS0+Z2V0TmFtZSgpLmVtcHR5KCkpCisgICAgICByZXR1cm4gcmFsbG9jX3N0cmR1cChzaGFkZXIsIChzdGQ6OnN0cmluZygiLiIpICsgbGx2bVZhbHVlLT5nZXROYW1lKCkuc3RyKCkpLmNfc3RyKCkpOworCisgICByZXR1cm4gYmFzZUxvY2FsTmFtZTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBZGQgaW5zdHJ1Y3Rpb24gKFJhdyk6IGRvbid0IGFkZCBtYXAgZW50cnksIGp1c3QgYXBwZW5kIHRvIGluc3QgbGlzdAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIHZvaWQKK01lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZElSSW5zdHJ1Y3Rpb24oaXJfaW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCBib29sIGdsb2JhbCkKK3sKKyAgIC8vIFNldCB2YXJpYWJsZSBhcyBhc3NpZ25lZCB0bywgaWYgaXQgaXMuCisgICBpZiAoaW5zdHJ1Y3Rpb24tPmFzX2Fzc2lnbm1lbnQoKSAmJgorICAgICAgIGluc3RydWN0aW9uLT5hc19hc3NpZ25tZW50KCktPmxocy0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKSkgeworICAgICAgaW5zdHJ1Y3Rpb24tPmFzX2Fzc2lnbm1lbnQoKS0+bGhzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpLT52YXJpYWJsZV9yZWZlcmVuY2VkKCktPmRhdGEuYXNzaWduZWQgPSB0cnVlOworICAgfQorCisgICBpZiAoZ2xvYmFsKQorICAgICAgaW5zdHJ1Y3Rpb25TdGFjay5mcm9udCgpLT5wdXNoX2hlYWQoaW5zdHJ1Y3Rpb24pOworICAgZWxzZQorICAgICAgaW5zdHJ1Y3Rpb25TdGFjay5iYWNrKCktPnB1c2hfdGFpbChpbnN0cnVjdGlvbik7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWRkIGluc3RydWN0aW9uIChjb29rZWQpOiBhZGQgdG8gbGlzdCBvbiB0b3Agb2YgaW5zdHJ1Y3Rpb24gbGlzdCBzdGFjaworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIHZvaWQKK01lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZElSSW5zdHJ1Y3Rpb24oY29uc3QgbGx2bTo6VmFsdWUqIGxsdm1WYWx1ZSwgaXJfaW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQoreworICAgYXNzZXJ0KGluc3RydWN0aW9uKTsKKyAgIHRWYWx1ZU1hcDo6Y29uc3RfaXRlcmF0b3IgbG9jYXRpb24gPSB2YWx1ZU1hcC5maW5kKGxsdm1WYWx1ZSk7CisKKyAgIC8vIFZlcmlmeSBTU0EtbmVzcworICAgaWYgKGxvY2F0aW9uICE9IHZhbHVlTWFwLmVuZCgpKSB7CisgICAgICBhc3NlcnQoMCAmJiAiU1NBIGZhaWx1cmUhICBTaG91bGRuJ3QgYWRkIHNhbWUgdmFsdWUgdHdpY2UuIik7CisgICB9CisKKyAgIGNvbnN0IHVuc2lnbmVkIHJlZkNvdW50ID0gZ2V0UmVmQ291bnQobGx2bVZhbHVlKTsKKworICAgLy8gVGhlc2UgYXJlIGluc3RydWN0aW9ucyB3ZSBtdXN0IGFsd2F5cyBpbnNlcnQgZGlyZWN0bHkKKyAgIGNvbnN0IGJvb2wgZGlyZWN0SW5zZXJ0aW9uID0KKyAgICAgIGluc3RydWN0aW9uLT5hc19hc3NpZ25tZW50KCkgfHwKKyAgICAgIGluc3RydWN0aW9uLT5hc19jYWxsKCkgfHwKKyAgICAgIGluc3RydWN0aW9uLT5hc19kaXNjYXJkKCkgfHwKKyAgICAgIChpbnN0cnVjdGlvbi0+YXNfcnZhbHVlKCkgJiYKKyAgICAgICBpbnN0cnVjdGlvbi0+YXNfcnZhbHVlKCktPnR5cGUtPmlzX3NhbXBsZXIoKSk7CisKKyAgIC8vIFdlIG5ldmVyIGluc2VydCB0ZW1wIGFzc2lnbm1lbnRzIGZvciB0aGVzZQorICAgY29uc3QgYm9vbCBub0luc2VydGlvbiA9CisgICAgICBpbnN0cnVjdGlvbi0+YXNfdmFyaWFibGUoKSB8fAorICAgICAgaW5zdHJ1Y3Rpb24tPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisKKyAgIC8vIEFkZCBpdCB0byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBpZiBuZWVkZWQuICBPdGhlcndpc2UsIGRvbid0OyB3ZSdsbCBsb29rCisgICAvLyBpdCB1cCBsYXRlciBhbmQgdXNlIGl0IGluIGFuIGV4cHJlc3Npb24gdHJlZQorICAgaWYgKChyZWZDb3VudCA+IDEgfHwgZGlyZWN0SW5zZXJ0aW9uKSAmJiAhbm9JbnNlcnRpb24pIHsKKyAgICAgIC8vIENyZWF0ZSBhbiBhc3NpZ25tZW50IHRvIGEgbmV3IGxvY2FsIGlmIG5lZWRlZAorICAgICAgaWYgKCFkaXJlY3RJbnNlcnRpb24pIHsKKyAgICAgICAgIGlyX3J2YWx1ZSogcnZhbHVlID0gaW5zdHJ1Y3Rpb24tPmFzX3J2YWx1ZSgpOworCisgICAgICAgICBpZiAoIXJ2YWx1ZSkgeworICAgICAgICAgICAgLy8gVmFyPC12YXIgYXNzaWdubWVudAorICAgICAgICAgICAgYXNzZXJ0KGluc3RydWN0aW9uLT5hc192YXJpYWJsZSgpKTsKKyAgICAgICAgICAgIHJ2YWx1ZSA9IG5ldyhzaGFkZXIpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKGluc3RydWN0aW9uLT5hc192YXJpYWJsZSgpKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaXJfZGVyZWZlcmVuY2UqIGxvY2FsVmFyID0gbmV3SVJWYXJpYWJsZURlcmVmKHJ2YWx1ZS0+dHlwZSwgbmV3TmFtZShsbHZtVmFsdWUpLCBpcl92YXJfYXV0byk7CisgICAgICAgICAKKyAgICAgICAgIGluc3RydWN0aW9uID0gbmV3KHNoYWRlcikgaXJfYXNzaWdubWVudChsb2NhbFZhciwgcnZhbHVlKTsKKyAgICAgIH0KKworICAgICAgYWRkSVJJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7CisgICB9CisKKyAgIHZhbHVlTWFwW2xsdm1WYWx1ZV0gPSBpbnN0cnVjdGlvbjsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBZGQgYSBidWlsdGluIGZ1bmN0aW9uIGNhbGwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkCitNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0Rm4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0KQoreworICAgY29uc3QgbGx2bTo6Q2FsbEluc3QqIGNhbGxJbnN0ID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q2FsbEluc3Q+KGxsdm1JbnN0KTsKKworICAgY29uc3QgdW5zaWduZWQgbnVtQXJncyA9IGNhbGxJbnN0ID8gY2FsbEluc3QtPmdldE51bUFyZ09wZXJhbmRzKCkgOiBsbHZtSW5zdC0+Z2V0TnVtT3BlcmFuZHMoKTsKKworICAgLy8gVGhpcyBpcyBPSyBvbiB0aGUgc3RhY2ssIGJlY2F1c2UgdGhlIGlyX2NhbGwgY29uc3RydWN0b3Igd2lsbCBtb3ZlIG91dCBvZiBpdC4KKyAgIGV4ZWNfbGlzdCBwYXJhbWV0ZXJzOworICAgCisgICBmb3IgKHVuc2lnbmVkIGk9MDsgaSA8IG51bUFyZ3M7ICsraSkKKyAgICAgIHBhcmFtZXRlcnMucHVzaF90YWlsKGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoaSkpKTsKKworICAgLy8gRmluZCB0aGUgcmlnaHQgZnVuY3Rpb24gc2lnbmF0dXJlIHRvIGNhbGwKKyAgIC8vIFRoaXMgc2V0cyBzdGF0ZS0+dXNlc19idWlsdGluX2Z1bmN0aW9ucworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPQorICAgICAgX21lc2FfZ2xzbF9maW5kX2J1aWx0aW5fZnVuY3Rpb24oc3RhdGUsIG5hbWUsICZwYXJhbWV0ZXJzKTsKKworICAgaWYgKHNpZyA9PSAwKSB7CisgICAgICByZXR1cm4gZXJyb3IoIm5vIG1hdGNoaW5nIGZ1bmN0aW9uIHNpZ25hdHVyZSBmb3VuZCIpOworICAgfQorCisgICBjb25zdCBzdGQ6OnN0cmluZyByZXROYW1lID0gc3RkOjpzdHJpbmcobmFtZSkgKyAiX3JldHZhbCI7CisgICBpcl9kZXJlZmVyZW5jZSogZGVzdCA9IG5ld0lSVmFyaWFibGVEZXJlZihsbHZtSW5zdC0+Z2V0VHlwZSgpLCBsbHZtSW5zdCwgcmV0TmFtZSwgaXJfdmFyX2F1dG8pOworCisgICBpcl9jYWxsICpjYWxsID0gbmV3KHNoYWRlcikgaXJfY2FsbChzaWcsIGRlc3QtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCksICZwYXJhbWV0ZXJzKTsKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIGNhbGwpOworfQorCitpcl9leHByZXNzaW9uKiBNZXNhR2xhc3NUcmFuc2xhdG9yOjpnbGFzc190b19pcl9leHByZXNzaW9uKGNvbnN0IGludCBpck9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSogaGlyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl9ydmFsdWUqIG9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl9ydmFsdWUqIG9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl9ydmFsdWUqIG9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGdlblVuc2lnbmVkMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGdlblVuc2lnbmVkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGdlblVuc2lnbmVkMikKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IG1heE9wID0gMzsKKyAgICBpcl9ydmFsdWUqIG9wW21heE9wXTsKKworICAgIGlmIChnZW5VbnNpZ25lZDAgJiYgb3AwLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCkKKyAgICB7CisgICAgICAgb3BbMF0gPSBuZXcoc2hhZGVyKSBpcl9leHByZXNzaW9uKGlyX3Vub3BfaTJ1LCBvcDApOworICAgIH0KKyAgICBlbHNlIGlmICghZ2VuVW5zaWduZWQwICYmIG9wMC0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKQorICAgIHsKKyAgICAgICBvcFswXSA9IG5ldyhzaGFkZXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF91MmksIG9wMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgb3BbMF0gPSBvcDA7CisgICAgfQorCisgICAgb3BbMV0gPSBvcDE7CisgICAgaWYgKG9wMSkKKyAgICB7CisgICAgICAgaWYgKGdlblVuc2lnbmVkMSAmJiBvcDEtPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKQorICAgICAgIHsKKyAgICAgICAgICAgb3BbMV0gPSBuZXcoc2hhZGVyKSBpcl9leHByZXNzaW9uKGlyX3Vub3BfaTJ1LCBvcDEpOworICAgICAgIH0KKyAgICAgICBlbHNlIGlmICghZ2VuVW5zaWduZWQxICYmIG9wMS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKQorICAgICAgIHsKKyAgICAgICAgICAgb3BbMV0gPSBuZXcoc2hhZGVyKSBpcl9leHByZXNzaW9uKGlyX3Vub3BfdTJpLCBvcDEpOworICAgICAgIH0KKyAgICB9CisKKyAgICBvcFsyXSA9IG9wMjsKKyAgICBpZiAob3AyKQorICAgIHsKKyAgICAgICBpZiAoZ2VuVW5zaWduZWQyICYmIG9wMi0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpCisgICAgICAgeworICAgICAgICAgICBvcFsyXSA9IG5ldyhzaGFkZXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9pMnUsIG9wMik7CisgICAgICAgfQorICAgICAgIGVsc2UgaWYgKCFnZW5VbnNpZ25lZDIgJiYgb3AyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1VJTlQpCisgICAgICAgeworICAgICAgICAgICBvcFsyXSA9IG5ldyhzaGFkZXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF91MmksIG9wMik7CisgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9leHByZXNzaW9uKGlyT3AsIGhpclR5cGUsIG9wWzBdLCBvcFsxXSwgb3BbMl0pOworfQorCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IE4tYXJ5IG9wY29kZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordGVtcGxhdGUgPGludCBvcHM+CitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0T3AoaW50IGlyT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZ2VuVW5zaWduZWQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZ2VuVW5zaWduZWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZ2VuVW5zaWduZWQyKQoreworICAgc3RhdGljIGNvbnN0IGludCBtYXhPcCA9IDM7CisgICBpcl9ydmFsdWUqIG9wW21heE9wXTsKKyAgIGFzc2VydChvcHMgPD0gbWF4T3ApOworCisgICAvKiBBc3N1bWVzIGdlblVuc2lnbmVkIC0+IGdlblVuc2lnbmVkMSAtPiBnZW5VbnNpZ25lZDAgKi8KKyAgIGFzc2VydCghZ2VuVW5zaWduZWQyIHx8IGdlblVuc2lnbmVkMSk7CisgICBhc3NlcnQoIWdlblVuc2lnbmVkMSB8fCBnZW5VbnNpZ25lZDApOworCisgICBjb25zdCBnbHNsX3R5cGUgKmhpclR5cGUgPSBsbHZtVHlwZVRvSGlyVHlwZShsbHZtSW5zdC0+Z2V0VHlwZSgpLCAwLCBsbHZtSW5zdCwgZ2VuVW5zaWduZWQwKTsKKworICAgZm9yIChpbnQgaT0wOyBpPG1heE9wOyArK2kpCisgICB7CisgICAgICBvcFtpXSA9IG9wcyA+IGkgPyBnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKGkpKSA6IDA7CisgICB9CisKKyAgIGlyX3J2YWx1ZSogcmVzdWx0ID0gZ2xhc3NfdG9faXJfZXhwcmVzc2lvbihpck9wLCBoaXJUeXBlLCBvcFswXSwgb3BbMV0sIG9wWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlblVuc2lnbmVkMCwgZ2VuVW5zaWduZWQxLCBnZW5VbnNpZ25lZDIpOworICAgYXNzZXJ0KHJlc3VsdCAmJiAob3BbMF0gfHwgb3BzIDwgMSkgJiYgKG9wWzFdIHx8IG9wcyA8IDIpICYmIChvcFsyXSB8fCBvcHMgPCAzKSk7CisgICAKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIHJlc3VsdCk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWRkIGFsbG9jCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJhbGxvY2EoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0KQoreworICAgbGx2bTo6VHlwZSogdHlwZSA9IGxsdm1JbnN0LT5nZXRUeXBlKCk7CisgICBpZiAoY29uc3QgbGx2bTo6UG9pbnRlclR5cGUqIHBvaW50ZXIgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpQb2ludGVyVHlwZT4odHlwZSkpCisgICAgICB0eXBlID0gcG9pbnRlci0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKKworICAgaXJfcnZhbHVlKiB2YXIgPSBuZXdJUlZhcmlhYmxlRGVyZWYodHlwZSwgbGx2bUluc3QsIG5ld05hbWUobGx2bUluc3QpLCBpcl92YXJfYXV0byk7CisKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIHZhcik7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWRkIElSIHNpZ24gZXh0ZW5zaW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJTZXh0KGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBsbHZtSW5zdCkKK3sKKyAgIC8vIFRPRE86IGhhbmRsZSBhcmJpdHJhcnkgc2lnbiBleHRlbnNpb24uICBGb3Igbm93LCBqdXN0IGZyb20gMSBiaXQKKyAgIC8vIGludHMuCisgICBjb25zdCBnbHNsX3R5cGUgKmhpclR5cGUgPSBsbHZtVHlwZVRvSGlyVHlwZShsbHZtSW5zdC0+Z2V0VHlwZSgpLCAwLCBsbHZtSW5zdCk7CisgICBpcl9ydmFsdWUqIG9wWzNdOworCisgICBjb25zdCBpbnQgY291bnQgPSBnbGE6OkdldENvbXBvbmVudENvdW50KGNvbnN0X2Nhc3Q8bGx2bTo6VHlwZSo+KGxsdm1JbnN0LT5nZXRUeXBlKCkpKTsKKworICAgb3BbMF0gPSBnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApKTsKKworICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgIG9wWzFdID0gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoaW50KDB4ZmZmZmZmZmYpKTsKKyAgICAgIG9wWzJdID0gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoaW50KDApKTsKKyAgIH0gZWxzZSB7CisgICAgICBpcl9jb25zdGFudF9kYXRhIGRhdGEwLCBkYXRhMTsKKyAgICAgIGRhdGExLmlbMF0gPSBkYXRhMS5pWzFdID0gZGF0YTEuaVsyXSA9IGRhdGExLmlbM10gPSBpbnQoMHhmZmZmZmZmZik7CisgICAgICBkYXRhMC5pWzBdID0gZGF0YTAuaVsxXSA9IGRhdGEwLmlbMl0gPSBkYXRhMC5pWzNdID0gaW50KDB4MCk7CisKKyAgICAgIG9wWzFdID0gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoZ2xzbF90eXBlOjppdmVjKGNvdW50KSwgJmRhdGExKTsKKyAgICAgIG9wWzJdID0gbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoZ2xzbF90eXBlOjppdmVjKGNvdW50KSwgJmRhdGEwKTsKKyAgIH0KKworICAgLy8gSElSIHdhbnRzIHRoZSBjb25kaXRpb24gdG8gYmUgYSB2ZWN0b3Igb2Ygc2l6ZSBvZiBlbGVtZW50LCBzbyB3ZSBtdXN0CisgICAvLyBpbnNlcnQgYSBicm9hZGNhc3Qgc3dpenpsZSBpZiBuZWVkIGJlLgorICAgaWYgKG9wWzBdLT50eXBlLT52ZWN0b3JfZWxlbWVudHMgIT0gb3BbMV0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykKKyAgICAgIG9wWzBdID0gbmV3KHNoYWRlcikgaXJfc3dpenpsZShvcFswXSwgMCwgMCwgMCwgMCwgb3BbMV0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisKKyAgIGlyX3J2YWx1ZSogcmVzdWx0ID0gZ2xhc3NfdG9faXJfZXhwcmVzc2lvbihpcl90cmlvcF9jc2VsLCBoaXJUeXBlLCBvcFswXSwgb3BbMV0sIG9wWzJdKTsKKyAgIGFzc2VydChyZXN1bHQgJiYgb3BbMF0gJiYgb3BbMV0gJiYgb3BbMl0pOworICAgCisgICBhZGRJUkluc3RydWN0aW9uKGxsdm1JbnN0LCByZXN1bHQpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgdmVydGV4CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJFbWl0VmVydGV4KGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBsbHZtSW5zdCkKK3sKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obmV3KHNoYWRlcikgaXJfZW1pdF92ZXJ0ZXgoKSk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW5kIHByaW1pdGl2ZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIHZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6ZW1pdElSRW5kUHJpbWl0aXZlKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBsbHZtSW5zdCkKK3sKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obmV3KHNoYWRlcikgaXJfZW5kX3ByaW1pdGl2ZSgpKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IGEgTi1hcnkgb3Agb2YgZWl0aGVyIGxvZ2ljYWwgb3IgYml0d2lzZSB0eXBlLCBzZWxlY3RpbmcgZnJvbSBvbmUgb2YKKyAqIHR3byBJUiBvcGNvZGVzIGFwcHJvcHJpYXRlbHkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit0ZW1wbGF0ZSA8aW50IG9wcz4KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRPcEJpdChpbnQgaXJMb2dpY2FsT3AsIGludCBpckJpdHdpc2VPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBnZW5VbnNpZ25lZCkKK3sKKyAgIGNvbnN0IGJvb2wgaXNCb29sID0gZ2xhOjpJc0Jvb2xlYW4obGx2bUluc3QtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSk7CisKKyAgIHJldHVybiBlbWl0T3A8b3BzPihpc0Jvb2wgPyBpckxvZ2ljYWxPcCA6IGlyQml0d2lzZU9wLCBsbHZtSW5zdCwgZ2VuVW5zaWduZWQgLyogZ2VuVW5zaWduZWQgKi8pOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbnZlcnQgcHJlZGljYXRlCisgKiB1c2UgaW50cyBpbiBpbnRlcmZhY2UgdG8gYXZvaWQgbGFjayBvZiBmb3J3YXJkIGRlY2xzIG9mIGVudW1zIGluIEMrKworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IE1lc2FHbGFzc1RyYW5zbGF0b3I6OmlyQ21wT3AoaW50IHByZWQpIGNvbnN0Cit7CisgICBzd2l0Y2ggKHByZWQpIHsKKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfT0VROiAvLyBmYWxsIHRocm91Z2gKKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfVUVROiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfRVE6ICByZXR1cm4gaXJfYmlub3BfZXF1YWw7CisKKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfT05FOiAvLyBmYWxsIHRocm91Z2gKKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfVU5FOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfTkU6ICByZXR1cm4gaXJfYmlub3BfbmVxdWFsOworCisgICBjYXNlIGxsdm06OkZDbXBJbnN0OjpGQ01QX09HVDogLy8gZmFsbCB0aHJvdWdoCisgICBjYXNlIGxsdm06OkZDbXBJbnN0OjpGQ01QX1VHVDogLy8gLi4uCisgICBjYXNlIGxsdm06OklDbXBJbnN0OjpJQ01QX1VHVDogLy8gLi4uCisgICBjYXNlIGxsdm06OklDbXBJbnN0OjpJQ01QX1NHVDogcmV0dXJuIGlyX2Jpbm9wX2dyZWF0ZXI7CisKKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfT0dFOiAvLyBmYWxsIHRocm91Z2guLi4KKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfVUdFOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfVUdFOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfU0dFOiByZXR1cm4gaXJfYmlub3BfZ2VxdWFsOworCisgICBjYXNlIGxsdm06OkZDbXBJbnN0OjpGQ01QX09MVDogLy8gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkZDbXBJbnN0OjpGQ01QX1VMVDogLy8gLi4uCisgICBjYXNlIGxsdm06OklDbXBJbnN0OjpJQ01QX1VMVDogLy8gLi4uCisgICBjYXNlIGxsdm06OklDbXBJbnN0OjpJQ01QX1NMVDogcmV0dXJuIGlyX2Jpbm9wX2xlc3M7CisKKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfT0xFOiAvLyBmYWxsIHRocm91Z2guLi4KKyAgIGNhc2UgbGx2bTo6RkNtcEluc3Q6OkZDTVBfVUxFOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfVUxFOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfU0xFOiByZXR1cm4gaXJfYmlub3BfbGVxdWFsOworICAgICAgCisgICBkZWZhdWx0OgorICAgICAgZXJyb3IoInVua25vd24gY29tcGFyaXNvbiBvcCIpOworICAgICAgcmV0dXJuIGlyX2Jpbm9wX2VxdWFsOworICAgfQorfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldHVybiBpZiBwcmVkaWNhdGUgaXMgdW5zaWduZWQKKyAqIHVzZSBpbnRzIGluIGludGVyZmFjZSB0byBhdm9pZCBsYWNrIG9mIGZvcndhcmQgZGVjbHMgb2YgZW51bXMgaW4gQysrCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitib29sIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmlyQ21wVW5zaWduZWQoaW50IHByZWQpIGNvbnN0Cit7CisgICBzd2l0Y2ggKHByZWQpIHsKKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfVUdUOiAvLyBmYWxsIHRocm91Z2gKKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfVUdFOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfVUxUOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SUNtcEluc3Q6OklDTVBfVUxFOiByZXR1cm4gdHJ1ZTsKKworICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PRVE6IC8vIGZhbGwgdGhyb3VnaAorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9VRVE6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9FUTogIC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTkU6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9VTkU6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9ORTogIC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PR1Q6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9VR1Q6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9TR1Q6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PR0U6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9VR0U6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9TR0U6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTFQ6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9VTFQ6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9TTFQ6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTEU6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9VTEU6IC8vIC4uLgorICAgY2FzZSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9TTEU6IHJldHVybiBmYWxzZTsKKworICAgZGVmYXVsdDoKKyAgICAgIGVycm9yKCJ1bmtub3duIGNvbXBhcmlzb24gb3AiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IGNvbXBhcmlzb24gb3AKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRDbXAoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0KQoreworICAgY29uc3QgbGx2bTo6Q21wSW5zdCogY21wID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6Q21wSW5zdD4obGx2bUluc3QpOworICAgCisgICAvLyBUT0RPOiBkbyB3ZSBuZWVkIHRvIGhhbmRsZSBhcnJheXMgLyBzdHJ1Y3RzIGhlcmU/CisKKyAgIGlmICghY21wKSB7CisgICAgICByZXR1cm4gZXJyb3IoImludmFsaWQgY29tcGFyaXNvbiBvcCIpOworICAgfQorCisgICBjb25zdCBpbnQgY21wT3AgPSBpckNtcE9wKGNtcC0+Z2V0UHJlZGljYXRlKCkpOworICAgY29uc3QgYm9vbCBnZW5VbnNpZ25lZCA9IGlyQ21wVW5zaWduZWQoY21wLT5nZXRQcmVkaWNhdGUoKSk7CisKKyAgIC8vIFRPRE86IGhhbmRsZSBhcnJheXMsIHN0cnVjdHMKKyAgIHJldHVybiBlbWl0T3A8Mj4oY21wT3AsIGxsdm1JbnN0LCBnZW5VbnNpZ25lZCwgZ2VuVW5zaWduZWQpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFkZCBhIGNvbmRpdGlvbmFsIGRpc2NhcmQKKyAqIE5PVEU6IENVUlJFTlRMWSBESVNBQkxFRCBwZW5kaW5nIGJhY2tlbmQgc3VwcG9ydC4gIFNlZToKKyAqICAgYnJ3X2ZzX3Zpc2l0b3IuY3BwOmZzX3Zpc2l0b3I6OnZpc2l0KGlyX2Rpc2NhcmQgKmlyKQorICogQ29tbWVudCAiRklOSVNITUUiIHRoZXJlLiAgV2hlbiB0aGF0J3MgZG9uZSwgdGhpcyBjYW4gYmUgZW5hYmxlZAorICogYnkgcmVtb3Zpbmcgb3VyIG92ZXJyaWRlIG9mIGhvaXN0RGlzY2FyZHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRJUkRpc2NhcmRDb25kKGNvbnN0IGxsdm06OkNhbGxJbnN0KiBsbHZtSW5zdCkKK3sKKyAgIGlyX3J2YWx1ZSAqb3AwICAgICAgPSBnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgIGlyX2Rpc2NhcmQqIGRpc2NhcmQgPSBuZXcoc2hhZGVyKSBpcl9kaXNjYXJkKG9wMCk7CisKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIGRpc2NhcmQpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFkZCBmdHJhbnNmb3JtCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJGVHJhbnNmb3JtKGNvbnN0IGxsdm06OkNhbGxJbnN0KiBsbHZtSW5zdCkKK3sKKyAgIGV4ZWNfbGlzdCBwYXJhbWV0ZXJzOworCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9CisgICAgICBfbWVzYV9nbHNsX2ZpbmRfYnVpbHRpbl9mdW5jdGlvbihzdGF0ZSwgImZ0cmFuc2Zvcm0iLCAmcGFyYW1ldGVycyk7CisKKyAgIC8vIFRPRE86IGRvbid0IGFzc3VtZSBpcl92YXJfdGVtcG9yYXJ5IGhlcmUKKyAgIGlyX2RlcmVmZXJlbmNlKiBkZXN0ID0gbmV3SVJWYXJpYWJsZURlcmVmKGxsdm1JbnN0LT5nZXRUeXBlKCksIGxsdm1JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZShsbHZtSW5zdCksIGlyX3Zhcl90ZW1wb3JhcnkpOworCisgICAvLyBUT0RPOiBTaG91bGQgd2UgaW5zZXJ0IGEgcHJvdG90eXBlPworICAgaXJfY2FsbCAqY2FsbCA9IG5ldyhzaGFkZXIpIGlyX2NhbGwoc2lnLCBkZXN0LT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpLCAmcGFyYW1ldGVycyk7CisKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIGNhbGwpOworfQorCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWNsYXJlIHBoaSBvdXRwdXQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6ZGVjbGFyZVBoaUNvcHkoY29uc3QgbGx2bTo6VmFsdWUqIGRzdCkKK3sKKyAgIHZhbHVlTWFwW2RzdF0gPSBuZXdJUlZhcmlhYmxlRGVyZWYoZHN0LT5nZXRUeXBlKCksIGRzdCwgbmV3TmFtZShkc3QpLCBpcl92YXJfYXV0byk7Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgcGhpIGZ1bmN0aW9uIGFsaWFzZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkUGhpQWxpYXMoY29uc3QgbGx2bTo6VmFsdWUqIGRzdCwgY29uc3QgbGx2bTo6VmFsdWUqIHNyYykKK3sKKyAgIHZhbHVlTWFwW2RzdF0gPSBnZXRJUlZhbHVlKHNyYyk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW1pdCBwaGkgZnVuY3Rpb24gY29waWVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZFBoaUNvcHkoY29uc3QgbGx2bTo6VmFsdWUqIGRzdCwgY29uc3QgbGx2bTo6VmFsdWUqIHNyYykKK3sKKyAgIGlyX3J2YWx1ZSogaXJEc3QgPSBnZXRJUlZhbHVlKGRzdCk7CisgICBpcl9ydmFsdWUqIGlyU3JjID0gZ2V0SVJWYWx1ZShzcmMpOworCisgICBpcl9hc3NpZ25tZW50KiBhc3NpZ24gID0gbmV3KHNoYWRlcikgaXJfYXNzaWdubWVudChpckRzdCwgaXJTcmMpOworICAgYWRkSVJJbnN0cnVjdGlvbihhc3NpZ24pOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgSVIgaWYgc3RhdGVtZW50IGZyb20gaXJfcnZhbHVlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjphZGRJZihpcl9ydmFsdWUqIGNvbmQsIGJvb2wgaW52ZXJ0KQoreworICAgaWYgKGludmVydCkKKyAgICAgIGNvbmQgPSBnbGFzc190b19pcl9leHByZXNzaW9uKGlyX3Vub3BfbG9naWNfbm90LCBjb25kLT50eXBlLCBjb25kKTsKKworICAgaXJfaWYgKmNvbnN0IGlmU3RtdCA9IG5ldyhzaGFkZXIpIGlyX2lmKGNvbmQpOworCisgICBpZlN0YWNrLnB1c2hfYmFjayhpZlN0bXQpOworICAgaW5zdHJ1Y3Rpb25TdGFjay5wdXNoX2JhY2soJmlmU3RtdC0+dGhlbl9pbnN0cnVjdGlvbnMpOworICAgc3RhdGUtPnN5bWJvbHMtPnB1c2hfc2NvcGUoKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0ICJpZiIgKGJ1dCBub3QgZWxzZSBjbGF1c2UpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZElmKGNvbnN0IGxsdm06OlZhbHVlKiBjb25kLCBib29sIGludmVydCkKK3sKKyAgIHJldHVybiBhZGRJZihnZXRJUlZhbHVlKGNvbmQpLCBpbnZlcnQpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgZWxzZSBjbGF1c2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkRWxzZSgpCit7CisgICBzdGF0ZS0+c3ltYm9scy0+cG9wX3Njb3BlKCk7CisgICBpbnN0cnVjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICBpbnN0cnVjdGlvblN0YWNrLnB1c2hfYmFjaygmaWZTdGFjay5iYWNrKCktPmVsc2VfaW5zdHJ1Y3Rpb25zKTsKKyAgIHN0YXRlLT5zeW1ib2xzLT5wdXNoX3Njb3BlKCk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW1pdCBlbmRpZgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjphZGRFbmRpZigpCit7CisgICBhc3NlcnQoIWlmU3RhY2suZW1wdHkoKSk7CisKKyAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKyAgIGluc3RydWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKworICAgYWRkSVJJbnN0cnVjdGlvbihpZlN0YWNrLmJhY2soKSk7CisKKyAgIGlmU3RhY2sucG9wX2JhY2soKTsKK30KKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW1pdCBzd2l0Y2gKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkU3dpdGNoKGNvbnN0IGxsdm06OlZhbHVlKiBjb25kKQoreworICAgYXNzZXJ0KDAgJiYgIlRPRE86IC4uLiIpOworfQorCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IGNhc2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkQ2FzZShpbnQpCit7CisgICBhc3NlcnQoMCAmJiAiVE9ETzogLi4uIik7Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgZGVmYXVsdAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjphZGREZWZhdWx0KCkKK3sKKyAgIGFzc2VydCgwICYmICJUT0RPOiAuLi4iKTsKK30KKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW1pdCBlbmRjYXNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVuZENhc2UoYm9vbCB3aXRoQnJlYWspCit7CisgICBhc3NlcnQoMCAmJiAiVE9ETzogLi4uIik7Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgZW5kc3dpdGNoCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVuZFN3aXRjaCgpCit7CisgICBhc3NlcnQoMCAmJiAiVE9ETzogLi4uIik7Cit9CisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgY29uZGl0aW9uYWwgbG9vcAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjpiZWdpbkNvbmRpdGlvbmFsTG9vcCgpCit7CisgICBhc3NlcnQoMCAmJiAiVE9ETzogLi4uIik7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW1pdCBjb25kaXRpb25hbCBsb29wCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmJlZ2luU2ltcGxlQ29uZGl0aW9uYWxMb29wKGNvbnN0IGxsdm06OkNtcEluc3QqIGNtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VmFsdWUqIG9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VmFsdWUqIG9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnZlcnQpCit7CisgIC8vIFN0YXJ0IGxvb3AgYm9keQorICAgYmVnaW5Mb29wKCk7CisKKyAgIC8vIFRPRE86IFdoeSBkb24ndCB3ZSBzZWUgYm90aCBvZiB0aGVzZSB0aHJvdWdoIG5vcm1hbCBMdW5hckdsYXNzIGNhbGxiYWNrcz8KKyAgIC8vIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBwcm9jZXNzZWQgdGhlIGV4dHJhY3QgZWxlbWVudHMsIGRvIHRoYXQgbm93LgorICAgaWYgKCF2YWx1ZUVudHJ5RXhpc3RzKG9wMCkpIHsKKyAgICAgIGlmIChkeW5fY2FzdDxjb25zdCBsbHZtOjpJbnN0cnVjdGlvbj4ob3AwKSkKKyAgICAgICAgIGFkZEluc3RydWN0aW9uKGR5bl9jYXN0PGNvbnN0IGxsdm06Okluc3RydWN0aW9uPihvcDApLCBmYWxzZSk7CisgICB9CisKKyAgIGlmICghdmFsdWVFbnRyeUV4aXN0cyhvcDEpKSB7CisgICAgICBpZiAoZHluX2Nhc3Q8Y29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24+KG9wMSkpCisgICAgICAgICBhZGRJbnN0cnVjdGlvbihkeW5fY2FzdDxjb25zdCBsbHZtOjpJbnN0cnVjdGlvbj4ob3AxKSwgZmFsc2UpOworICAgfQorCisgICBlbWl0Q21wKGNtcCk7ICAvLyBlbWl0IGxvb3AgY29tcGFyaXNvbgorICAgYWRkTG9vcEV4aXQoY21wLCAhaW52ZXJ0KTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IGZvciBsb29wIChmb3IgaT0wOyBpIHByZWQgdmFsdWU7IGkgKz0gaW5jcmVtZW50KSAuLi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YmVnaW5Gb3JMb29wKGNvbnN0IGxsdm06OlBISU5vZGUqIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OklDbXBJbnN0OjpQcmVkaWNhdGUgcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSogYm91bmQsIGlyX3J2YWx1ZSogaW5jcmVtZW50KQoreworICAgaXJfcnZhbHVlKiBsb29wVmFyID0gZ2V0SVJWYWx1ZShwaGkpOworCisgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGluaXRpYWxpemUgbG9vcFZhciB0byAwOiB0aGUgQm90dG9tSVIgd2lsbCBwcm9kdWNlIHRoYXQgZm9yIHVzCisKKyAgIC8vIFN0YXJ0IGxvb3AgYm9keQorICAgYmVnaW5Mb29wKCk7CisKKyAgIC8vIEFkZCBhIGNvbmRpdGlvbmFsIGJyZWFrCisgICBpbnQgYnJlYWtfcHJlZDsKKyAgIHN3aXRjaChwcmVkKSB7CisgICBkZWZhdWx0OgorICAgICAgIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eSgibG9vcCBwcmVkaWNhdGUiKTsKKyAgIGNhc2UgbGx2bTo6Q21wSW5zdDo6SUNNUF9ORTogICBicmVha19wcmVkID0gaXJfYmlub3BfZXF1YWw7ICAgYnJlYWs7CisgICBjYXNlIGxsdm06OkNtcEluc3Q6OklDTVBfU0xFOiAgYnJlYWtfcHJlZCA9IGlyX2Jpbm9wX2dyZWF0ZXI7IGJyZWFrOworICAgY2FzZSBsbHZtOjpDbXBJbnN0OjpJQ01QX1VMVDoKKyAgIGNhc2UgbGx2bTo6Q21wSW5zdDo6SUNNUF9TTFQ6ICBicmVha19wcmVkID0gaXJfYmlub3BfZ2VxdWFsOyAgYnJlYWs7CisgICB9CisKKyAgIGJvb2wgZ2VuVW5zaWduZWQgPSBpckNtcFVuc2lnbmVkKHByZWQpOworICAgaXJfcnZhbHVlKiBjbXAgPSBnbGFzc190b19pcl9leHByZXNzaW9uKGJyZWFrX3ByZWQsIGdsc2xfdHlwZTo6Ym9vbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BWYXIsIGJvdW5kLCAwLCBnZW5VbnNpZ25lZCwgZ2VuVW5zaWduZWQpOworCisgICBhZGRJUkxvb3BFeGl0KGNtcCk7CisKKyAgIC8vIENyZWF0ZSB0ZXJtaW5hdG9yIHN0YXRlbWVudCAoZm9yICsraW5kZXgpCisgICBpcl9hc3NpZ25tZW50KiB0ZXJtaW5hdG9yID0KKyAgICAgIG5ldyhzaGFkZXIpIGlyX2Fzc2lnbm1lbnQobG9vcFZhci0+Y2xvbmUoc2hhZGVyLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xhc3NfdG9faXJfZXhwcmVzc2lvbihpcl9iaW5vcF9hZGQsIGxvb3BWYXItPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcFZhci0+Y2xvbmUoc2hhZGVyLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQpKTsKKworICAgbG9vcFRlcm1pbmF0b3JTdGFjay5iYWNrKCkgPSB0ZXJtaW5hdG9yOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgZm9yIGxvb3AgKGZvciBpPTA7IGkgcHJlZCB2YWx1ZTsgaSArPSBpbmNyZW1lbnQpIC4uLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjpiZWdpbkZvckxvb3AoY29uc3QgbGx2bTo6UEhJTm9kZSogcGhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6SUNtcEluc3Q6OlByZWRpY2F0ZSBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYm91bmQsIHVuc2lnbmVkIGluY3JlbWVudCkKK3sKKyAgIHJldHVybiBiZWdpbkZvckxvb3AocGhpLCBwcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoYm91bmQpLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChpbmNyZW1lbnQpKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IGluZHVjdGl2ZSBsb29wLiAgUGhyYXNlZCBpbiB0ZXJtcyBvZiBhIGZvciBsb29wLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjpiZWdpblNpbXBsZUluZHVjdGl2ZUxvb3AoY29uc3QgbGx2bTo6UEhJTm9kZSogcGhpLCBjb25zdCBsbHZtOjpWYWx1ZSogY291bnQpCit7CisgICByZXR1cm4gYmVnaW5Gb3JMb29wKHBoaSwgbGx2bTo6SUNtcEluc3Q6OklDTVBfVUxULAorICAgICAgICAgICAgICAgICAgICAgICBnZXRJUlZhbHVlKGNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoMSkpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgYmVnaW4gbG9vcAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjpiZWdpbkxvb3AoKQoreworICAgaXJfbG9vcCAqY29uc3QgbG9vcFN0bXQgPSBuZXcoc2hhZGVyKSBpcl9sb29wKCk7CisKKyAgIGxvb3BTdGFjay5wdXNoX2JhY2sobG9vcFN0bXQpOworICAgaW5zdHJ1Y3Rpb25TdGFjay5wdXNoX2JhY2soJmxvb3BTdG10LT5ib2R5X2luc3RydWN0aW9ucyk7CisgICBzdGF0ZS0+c3ltYm9scy0+cHVzaF9zY29wZSgpOworCisgICBsb29wVGVybWluYXRvclN0YWNrLnB1c2hfYmFjaygwKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IGVuZCBsb29wCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVuZExvb3AoKQoreworICAgLy8gSGFuZGxlIGFueSBsb29wIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24KKyAgIGlmIChsb29wVGVybWluYXRvclN0YWNrLmJhY2soKSkKKyAgICAgIGFkZElSSW5zdHJ1Y3Rpb24obG9vcFRlcm1pbmF0b3JTdGFjay5iYWNrKCkpOworCisgICBsb29wVGVybWluYXRvclN0YWNrLnBvcF9iYWNrKCk7CisKKyAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKyAgIGluc3RydWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKworICAgYWRkSVJJbnN0cnVjdGlvbihsb29wU3RhY2suYmFjaygpKTsKKworICAgbG9vcFN0YWNrLnBvcF9iYWNrKCk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWRkIElSIGxvb3AgZXhpdCBzdGF0ZW1lbnQgZnJvbSBpcl9ydmFsdWUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmFkZElSTG9vcEV4aXQoaXJfcnZhbHVlKiBjb25kaXRpb24sIGJvb2wgaW52ZXJ0KQoreworICAgaWYgKGNvbmRpdGlvbikKKyAgICAgIGFkZElmKGNvbmRpdGlvbiwgaW52ZXJ0KTsKKworICAgaXJfbG9vcF9qdW1wICpjb25zdCBsb29wRXhpdCA9IG5ldyhzaGFkZXIpIGlyX2xvb3BfanVtcChpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWspOworICAgYWRkSVJJbnN0cnVjdGlvbihsb29wRXhpdCk7CisKKyAgIGlmIChjb25kaXRpb24pCisgICAgICBhZGRFbmRpZigpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFkZCBsb29wIGV4aXQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkTG9vcEV4aXQoY29uc3QgbGx2bTo6VmFsdWUqIGNvbmRpdGlvbiwgYm9vbCBpbnZlcnQpCit7CisgICBhZGRJUkxvb3BFeGl0KGNvbmRpdGlvbiA/IGdldElSVmFsdWUoY29uZGl0aW9uKSA6IDAsIGludmVydCk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWRkIGxvb3AgY29udGludWUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6YWRkTG9vcEJhY2soY29uc3QgbGx2bTo6VmFsdWUqIGNvbmRpdGlvbiwgYm9vbCBpbnZlcnQpCit7CisgICBpcl9sb29wX2p1bXAgKmNvbnN0IGxvb3BDb250aW51ZSA9IG5ldyhzaGFkZXIpIGlyX2xvb3BfanVtcChpcl9sb29wX2p1bXA6Omp1bXBfY29udGludWUpOworICAgYWRkSVJJbnN0cnVjdGlvbihsb29wQ29udGludWUpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRyYW5zbGF0ZSBjYWxsCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJDYWxsKGNvbnN0IGxsdm06OkNhbGxJbnN0KiBsbHZtSW5zdCkKK3sKKyAgIGFzc2VydCgwICYmICJUT0RPOiBoYW5kbGUgY2FsbCIpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRyYW5zbGF0ZSByZXR1cm4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRJUlJldHVybihjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QsIGJvb2wgbGFzdEJsb2NrKQoreworICAgaWYgKGxsdm1JbnN0LT5nZXROdW1PcGVyYW5kcygpID4gMCkKKyAgICAgIGFkZElSSW5zdHJ1Y3Rpb24obmV3KHNoYWRlcikgaXJfcmV0dXJuKGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoMCkpKSk7CisgICBlbHNlIGlmICghbGFzdEJsb2NrKSAvLyBkb24ndCBhZGQgcmV0dXJuIGluIGxhc3Qgc2hhZGVyIGJsb2NrLgorICAgICAgYWRkSVJJbnN0cnVjdGlvbihuZXcoc2hhZGVyKSBpcl9yZXR1cm4pOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRyYWNrIG1heGltdW0gYXJyYXkgZWxlbWVudCB1c2VkCisgKiBJZiBpbmRleCA8IDAsIG1lYW5zIHdlIHVzZSB0aGUgZW50aXJlIGFycmF5IChwcm9iYWJseSBpbmRpcmVjdCBpbmRleGluZykKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OnRyYWNrTWF4QXJyYXlFbGVtZW50KGlyX3J2YWx1ZSogcnZhbHVlLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICBpZiAoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmID0gcnZhbHVlLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpKSB7CisgICAgICBpZiAoaXJfdmFyaWFibGUqIHZhciA9IGRlcmVmLT52YXJpYWJsZV9yZWZlcmVuY2VkKCkpIHsKKyAgICAgICAgIGlmIChpbmRleCA+PSAwKQorICAgICAgICAgICAgdmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MgPSBzdGQ6Om1heCh2YXItPmRhdGEubWF4X2FycmF5X2FjY2VzcywgdW5zaWduZWQoaW5kZXgpKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzID0gZGVyZWYtPnR5cGUtPmxlbmd0aCAtIDE7CisgICAgICB9CisgICB9Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHJhbnNsYXRlIHN3aXp6bGUgaW50cmluc2ljcworICogICAoc3dpeiBjb21wb25lbnRzIC4uLikKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRJUlN3aXp6bGUoY29uc3QgbGx2bTo6SW50cmluc2ljSW5zdCogbGx2bUluc3QpCit7CisgICBjb25zdCBsbHZtOjpWYWx1ZSogICAgc3JjICA9IGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApOworICAgY29uc3QgbGx2bTo6Q29uc3RhbnQqIG1hc2sgPSBsbHZtOjpkeW5fY2FzdDxsbHZtOjpDb25zdGFudD4obGx2bUluc3QtPmdldE9wZXJhbmQoMSkpOworICAgYXNzZXJ0KG1hc2spOworCisgICAvLyBUT0RPOiBJcyB0aGlzIHN1ZmZpY2llbnQgZm9yIGFsbCB0eXBlcyBvZiBzd2l6emxlcz8gIEUuZywgYnJvYWRjYXN0aW5nIHN3aXp6bGVzPworCisgICB1bnNpZ25lZCBjb21wb25lbnRzWzRdID0geyAwLCAwLCAwLCAwIH07CisgICB1bnNpZ25lZCBjb21wb25lbnRDb3VudCA9IGdsYTo6R2V0Q29tcG9uZW50Q291bnQobGx2bUluc3QpOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY29tcG9uZW50Q291bnQ7ICsraSkKKyAgICAgIGlmIChJc0RlZmluZWQobWFzay0+Z2V0QWdncmVnYXRlRWxlbWVudChpKSkpCisgICAgICAgICBjb21wb25lbnRzW2ldID0gZ2xhOjpHZXRDb25zdGFudEludChtYXNrLT5nZXRBZ2dyZWdhdGVFbGVtZW50KGkpKTsKKworICAgaXJfc3dpenpsZSogc3dpenpsZSA9IG5ldyhzaGFkZXIpIGlyX3N3aXp6bGUoZ2V0SVJWYWx1ZShzcmMpLCBjb21wb25lbnRzLCBjb21wb25lbnRDb3VudCk7CisKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIHN3aXp6bGUpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRyYW5zbGF0ZSBpbnNlcnRpb24gaW50cmluc2ljcworICogICB0dXJucyBpbnRvIE4gaW5zdGFuY2VzIG9mOgorICogICAoYXNzaWduICh4KSAodmFyX3JlZiB2YXIpIChleHByZXNzaW9uLi4uKSkKKyAqIEhhbmRsZXMgdmVjdG9yIG9yIHNjYWxhciBzb3VyY2VzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJNdWx0aUluc2VydChjb25zdCBsbHZtOjpJbnRyaW5zaWNJbnN0KiBsbHZtSW5zdCkKK3sKKyAgIGNvbnN0IGludCB3bWFzayA9IGdsYTo6R2V0Q29uc3RhbnRJbnQobGx2bUluc3QtPmdldE9wZXJhbmQoMSkpOworCisgICAvLyBUT0RPOiBvcHRpbWl6ZSBpZGVudGl0eSBjYXNlPyBpbnZlc3RpZ2F0ZSBnZW5lcmFsIG9wdGltaXphdGlvbgorICAgLy8gaW4gdGhpcyBzcGFjZS4gIEZvciBleGFtcGxlLCBpZiBhbGwgY29tcG9uZW50cyBhcmUgb3ZlcndyaXR0ZW4gZnJvbQorICAgLy8gdGhlIHNhbWUgc291cmNlLCB3ZSBjYW4ganVzdCBwYXNzIG9uIGEgc3dpenpsZSBhbmQgYXZvaWQgdGhlCisgICAvLyB0ZW1wIHRoZSB0aGUgYXNzaWdubWVudC4KKworICAgaXJfZGVyZWZlcmVuY2UqIGxvY2FsVG1wID0gbmV3SVJWYXJpYWJsZURlcmVmKGxsdm1JbnN0LT5nZXRUeXBlKCksIGxsdm1JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUobGx2bUluc3QpLCBpcl92YXJfYXV0byk7CisKKyAgIGlyX3ZhcmlhYmxlKiB2YXIgPSBsb2NhbFRtcC0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKS0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworCisgICBjb25zdCBib29sIHdyaXRpbmdBbGxDb21wb25lbnRzID0KKyAgICAgIHZhci0+dHlwZS0+aXNfdmVjdG9yKCkgJiYKKyAgICAgICgoMTw8dmFyLT50eXBlLT5jb21wb25lbnRzKCkpLTEpID09IHdtYXNrOworCisgICAvLyBDb3B5IG9yaWdpbmFsIHZhbHVlIHRvIG5ldyB0ZW1wb3JhcnkKKyAgIC8vIFRPRE86IGlzIGl0IGJldHRlciB0byBqdXN0IGFzc2lnbiB0aGUgbm90LXdyaXR0ZW4gY29tcG9uZW50cz8KKyAgIGlmICghd3JpdGluZ0FsbENvbXBvbmVudHMpIHsKKyAgICAgIGlyX2Fzc2lnbm1lbnQqIGFzc2lnbiA9IG5ldyhzaGFkZXIpIGlyX2Fzc2lnbm1lbnQobG9jYWxUbXAtPmNsb25lKHNoYWRlciwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoMCkpKTsKKyAgICAgIGFkZElSSW5zdHJ1Y3Rpb24oYXNzaWduKTsKKyAgIH0KKyAgICAgIAorICAgdW5zaWduZWQgbnVtQ29tcG9uZW50cyAgICAgICAgPSAwOworICAgdW5zaWduZWQgY29tcG9uZW50c1s0XSAgICAgICAgPSB7IDAsIDAsIDAsIDAgfTsKKyAgIGludCAgICAgIHBhcnRpYWxNYXNrICAgICAgICAgID0gMDsKKyAgIGNvbnN0IGxsdm06OlZhbHVlICpwcmV2U291cmNlID0gMDsKKworICAgLy8gVE9ETzogdGhpcyBtYXkgbm90IGJlIGdlbmVyYWwgZW5vdWdoLiAgRS5nLCBhcnJheSBvcGVyYW5kcz8KKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICBjb25zdCBsbHZtOjpWYWx1ZSogc3JjT3BlcmFuZCA9IGxsdm1JbnN0LT5nZXRPcGVyYW5kKChpKzEpICogMik7CisgICAgICBjb25zdCBsbHZtOjpDb25zdGFudCogc3dpek9mZnNldCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNvbnN0YW50PihsbHZtSW5zdC0+Z2V0T3BlcmFuZChpKjIgKyAzKSk7CisKKyAgICAgIC8vIElmIHNvdXJjZSBjaGFuZ2VkLCBkbyB0aGUgb25lcyB3ZSBoYXZlIHNvIGZhcgorICAgICAgaWYgKCFJc1NhbWVTb3VyY2Uoc3JjT3BlcmFuZCwgcHJldlNvdXJjZSkgJiYgbnVtQ29tcG9uZW50cyA+IDApIHsKKyAgICAgICAgIGlyX3N3aXp6bGUqICAgIHN3aXp6bGUgPSBuZXcoc2hhZGVyKSBpcl9zd2l6emxlKGdldElSVmFsdWUocHJldlNvdXJjZSksIGNvbXBvbmVudHMsIG51bUNvbXBvbmVudHMpOworICAgICAgICAgaXJfYXNzaWdubWVudCogYXNzaWduICA9IG5ldyhzaGFkZXIpIGlyX2Fzc2lnbm1lbnQobG9jYWxUbXAtPmNsb25lKHNoYWRlciwgMCksIHN3aXp6bGUsIDAsIHBhcnRpYWxNYXNrKTsKKyAgICAgICAgIGFkZElSSW5zdHJ1Y3Rpb24oYXNzaWduKTsKKyAgICAgICAgIG51bUNvbXBvbmVudHMgPSAwOworICAgICAgICAgcGFydGlhbE1hc2sgICA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChJc0RlZmluZWQoc3dpek9mZnNldCkpIHsKKyAgICAgICAgIHByZXZTb3VyY2UgPSBzcmNPcGVyYW5kOworICAgICAgICAgY29tcG9uZW50c1tudW1Db21wb25lbnRzKytdID0gZ2xhOjpHZXRDb25zdGFudEludChzd2l6T2Zmc2V0KTsKKyAgICAgICAgIHBhcnRpYWxNYXNrIHw9IDE8PGk7CisgICAgICB9CisgICB9CisKKyAgIC8vIERvIGFueSByZW1haW5kZXIKKyAgIGlmIChudW1Db21wb25lbnRzID4gMCkgeworICAgICAgaXJfc3dpenpsZSogICAgc3dpenpsZSA9IG5ldyhzaGFkZXIpIGlyX3N3aXp6bGUoZ2V0SVJWYWx1ZShwcmV2U291cmNlKSwgY29tcG9uZW50cywgbnVtQ29tcG9uZW50cyk7CisgICAgICBpcl9hc3NpZ25tZW50KiBhc3NpZ24gID0gbmV3KHNoYWRlcikgaXJfYXNzaWdubWVudChsb2NhbFRtcC0+Y2xvbmUoc2hhZGVyLCAwKSwgc3dpenpsZSwgMCwgcGFydGlhbE1hc2spOworICAgICAgYWRkSVJJbnN0cnVjdGlvbihhc3NpZ24pOworICAgfQorCisgICAvLyBUT0RPOiBtYXliZSBpZiBpdCdzIGFsbCBvbmUgc291cmNlIGFuZCB3ZSdyZSBvdmVyd3JpdGluZyB0aGUgd2hvbGUgdGhpbmcsIGl0J3MganVzdCBhCisgICAvLyBzd2l6emxlLCBhbmQgd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIGEgdGVtcCBhc3NpZ25tZW50LgorCisgICAvLyBBZGQgdGhlIGxvY2FsIHRlbXAgd2UgY3JlYXRlZCBmb3IgdGhpcyBtdWx0aS1pbnNlcnQKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIGxvY2FsVG1wKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbWl0IExMVk0gc2F0dXJhdGUgaW50cmluc2ljCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJTYXR1cmF0ZShjb25zdCBsbHZtOjpDYWxsSW5zdCogbGx2bUluc3QpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKmhpclR5cGUgPSBsbHZtVHlwZVRvSGlyVHlwZShsbHZtSW5zdC0+Z2V0VHlwZSgpLCAwLCBsbHZtSW5zdCk7CisKKyAgIGlyX3J2YWx1ZSogbWluT3AgPSBnbGFzc190b19pcl9leHByZXNzaW9uKGlyX2Jpbm9wX21pbiwgaGlyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3KHNoYWRlcikgaXJfY29uc3RhbnQoMS4wZikpOworCisgICBpcl9ydmFsdWUqIHJlc3VsdCA9IGdsYXNzX3RvX2lyX2V4cHJlc3Npb24oaXJfYmlub3BfbWF4LCBoaXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9wLCBuZXcoc2hhZGVyKSBpcl9jb25zdGFudCgwLjBmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBhZGRJUkluc3RydWN0aW9uKGxsdm1JbnN0LCByZXN1bHQpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVtaXQgTExWTSBjbGFtcCBpbnRyaW5zaWMuICBXZSBwcmVmZXIgTHVuYXJHbGFzcyB0byBkZWNvbXBvc2UgdGhpcyBmb3IgdXMsCisgKiBidXQgY2FuIGxlYXZlIHRoaXMgaGVyZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRJUkNsYW1wKGNvbnN0IGxsdm06OkNhbGxJbnN0KiBsbHZtSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZ2VuVW5zaWduZWQpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKmhpclR5cGUgPSBsbHZtVHlwZVRvSGlyVHlwZShsbHZtSW5zdC0+Z2V0VHlwZSgpLCAwLCBsbHZtSW5zdCwgZ2VuVW5zaWduZWQpOworCisgICBpcl9ydmFsdWUqIG1pbk9wID0gZ2xhc3NfdG9faXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tYXgsIGhpclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZ2VuVW5zaWduZWQsIGdlblVuc2lnbmVkKTsKKworICAgaXJfcnZhbHVlKiByZXN1bHQgPSBnbGFzc190b19pcl9leHByZXNzaW9uKGlyX2Jpbm9wX21pbiwgaGlyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBnZW5VbnNpZ25lZCwgZ2VuVW5zaWduZWQpOworCisgICBhZGRJUkluc3RydWN0aW9uKGxsdm1JbnN0LCByZXN1bHQpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERldGVybWluZSBnbHNsIG1hdHJpeCB0eXBlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgY29uc3QgZ2xzbF90eXBlKiBNZXNhR2xhc3NUcmFuc2xhdG9yOjpnbHNsTWF0VHlwZShpbnQgbnVtQ29scywgaW50IG51bVJvd3MpIGNvbnN0Cit7CisgICAvLyBJZiBhbGwgY29sdW1ucyBhcmUgZnJvbSB0aGUgc2FtZSBzb3VyY2UsIHdlIGNhbiB1c2UgbWF0KnZlYyBvciB2ZWMqbWF0CisgICAvLyBEZXRlcm1pbmUgdGhlIGdsc2xfdHlwZSB0byB1c2U6CisgICBpZiAobnVtUm93cyA9PSBudW1Db2xzKSB7CisgICAgICAvLyBTcXVhcmUgbWF0cml4CisgICAgICBzd2l0Y2ggKG51bVJvd3MpIHsKKyAgICAgIGNhc2UgMjogcmV0dXJuIGdsc2xfdHlwZTo6bWF0Ml90eXBlOworICAgICAgY2FzZSAzOiByZXR1cm4gZ2xzbF90eXBlOjptYXQzX3R5cGU7IAorICAgICAgY2FzZSA0OiByZXR1cm4gZ2xzbF90eXBlOjptYXQ0X3R5cGU7IAorICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGVycm9yKCJiYWQgbWF0cml4IGRpbWVuc2lvbiIpOworICAgICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6bWF0NF90eXBlOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIC8vIG5vbi1zcXVhcmUgbWF0cml4CisgICAgICBpZiAobnVtQ29scyA9PSAyICYmIG51bVJvd3MgPT0gMykKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6Om1hdDJ4M190eXBlOworICAgICAgZWxzZSBpZiAobnVtQ29scyA9PSAyICYmIG51bVJvd3MgPT0gNCkKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6Om1hdDJ4NF90eXBlOworICAgICAgZWxzZSBpZiAobnVtQ29scyA9PSAzICYmIG51bVJvd3MgPT0gMikKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6Om1hdDN4Ml90eXBlOworICAgICAgZWxzZSBpZiAobnVtQ29scyA9PSAzICYmIG51bVJvd3MgPT0gNCkKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6Om1hdDN4NF90eXBlOworICAgICAgZWxzZSBpZiAobnVtQ29scyA9PSA0ICYmIG51bVJvd3MgPT0gMikKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6Om1hdDR4Ml90eXBlOworICAgICAgZWxzZSBpZiAobnVtQ29scyA9PSA0ICYmIG51bVJvd3MgPT0gMykKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6Om1hdDR4M190eXBlOworICAgICAgZWxzZSB7CisgICAgICAgICBlcnJvcigiYmFkIG1hdHJpeCBkaW1lbnNpb24iKTsKKyAgICAgICAgIHJldHVybiBnbHNsX3R5cGU6Om1hdDRfdHlwZTsKKyAgICAgIH0KKyAgIH0KK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2FkLCBwb3RlbnRpYWxseSBmcm9tIEdFUCBjaGFpbiBvZmZzZXQKKyAqIHR5cGVPdmVycmlkZSBsZXRzIHVzIG92ZXJydWxlIHRoZSBpbnRlcm5hbCB0eXBlLCBmb3IgZXhhbXBsZSwgaWYgYSBoaWdoZXIKKyAqIGxldmVsIG1hdCp2ZWMgaW50cmluc2ljcyBrbm93cyB0aGUgdHlwZSBzaG91bGQgYmUgYSBtYXRyaXguCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgaXJfcnZhbHVlKgorTWVzYUdsYXNzVHJhbnNsYXRvcjo6bWFrZUlSTG9hZChjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QsIGNvbnN0IGdsc2xfdHlwZSogdHlwZU92ZXJyaWRlKQoreworICAgY29uc3QgbGx2bTo6VmFsdWUqICAgICAgICAgICAgIHNyYyAgICAgPSBsbHZtSW5zdC0+Z2V0T3BlcmFuZCgwKTsKKyAgIGNvbnN0IGxsdm06OkdldEVsZW1lbnRQdHJJbnN0KiBnZXBJbnN0ID0gZ2V0R2VwQXNJbnN0KHNyYyk7CisKKyAgIGNvbnN0IGxsdm06Ok1ETm9kZSogICAgICAgICAgICBtZE5vZGUgID0gbGx2bUluc3QtPmdldE1ldGFkYXRhKFVuaWZvcm1NZE5hbWUpOworICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgICAgIG5hbWU7CisKKyAgIC8vIElmIHRoaXMgbG9hZCBkb2Vzbid0IGhhdmUgYSBtZXRhZGF0YSBub2RlLCB0cnkgdG8gZmluZCBvbmUgd2UndmUgY3JlYXRlZAorICAgLy8gZHVyaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gIFdlIHVzZSByZW5kZXp2b3VzLWJ5LW5hbWUgdG8gdGhhdCBlbmQuCisgICAvLyBXZSBtaWdodCBub3QgZmluZCBvbmUgdGhvdWdoLCBlLmcsIGlmIHRoaXMgbG9hZCBpcyBub3QgZnJvbSBhIGdsb2JhbC4KKworICAgaWYgKGdlcEluc3QpCisgICAgICBuYW1lID0gZ2VwSW5zdC0+Z2V0T3BlcmFuZCgwKS0+Z2V0TmFtZSgpOworICAgZWxzZSAKKyAgICAgIG5hbWUgPSBsbHZtSW5zdC0+Z2V0T3BlcmFuZCgwKS0+Z2V0TmFtZSgpOworCisgICAvLyBMb29rIGZvciBidWlsdGluCisgICB0TmFtZUJ1aWx0aW5NYXA6OmNvbnN0X2l0ZXJhdG9yIGdvdCA9IG5hbWVCdWlsdGluTWFwLmZpbmQobmFtZSk7CisgICBpZiAoZ290ICE9IG5hbWVCdWlsdGluTWFwLmVuZCgpKQorICAgICAgIG5hbWUgPSBnb3QtPnNlY29uZDsKKworICAgaWYgKCFtZE5vZGUgJiYgIW5hbWUuZW1wdHkoKSkgeworICAgICAgYXV0byBpdCA9IHR5cGVuYW1lTWRNYXAuZmluZChuYW1lKTsKKyAgICAgIG1kTm9kZSA9IChpdCA9PSB0eXBlbmFtZU1kTWFwLmVuZCgpKSA/IDAgOiBpdC0+c2Vjb25kOworICAgfQorCisgICAvLyBMb29rIHVwIHRoZSBpcl92YXJpYWJsZV9tb2RlIHdlIHJlbWVtYmVyZWQgZHVyaW5nIHRoZSBnbG9iYWwgZGVjbGFyYXRpb24KKyAgIGNvbnN0IGlyX3ZhcmlhYmxlX21vZGUgaXJNb2RlID0gaXJfdmFyaWFibGVfbW9kZShnbG9iYWxWYXJNb2RlTWFwW25hbWVdKTsKKworICAgLy8gSGFuZGxlIHR5cGVzIGZvciBib3RoIEdFUCBjaGFpbiBsb2FkcyBhbmQgbm9uLUdFUHMuCisgICBjb25zdCBsbHZtOjpUeXBlKiBzcmNUeXBlID0KKyAgICAgIChnZXBJbnN0ID8gZ2VwSW5zdC0+Z2V0UG9pbnRlck9wZXJhbmQoKSA6IGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApKS0+Z2V0VHlwZSgpOworCisgICBpZiAoc3JjVHlwZS0+Z2V0VHlwZUlEKCkgPT0gbGx2bTo6VHlwZTo6UG9pbnRlclR5SUQpCisgICAgICBzcmNUeXBlID0gc3JjVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKKworICAgY29uc3QgZ2xzbF90eXBlKiBpclR5cGUgPSBsbHZtVHlwZVRvSGlyVHlwZShzcmNUeXBlLCBtZE5vZGUsIGxsdm1JbnN0KTsKKworICAgaXJfcnZhbHVlKiBsb2FkOworICAgaXJfdmFyaWFibGUqIGlvVmFyID0gMDsKKyAgIGlyX3J2YWx1ZSogYWdncmVnYXRlID0gMDsKKworICAgLy8gSGFuZGxlIEdFUCB0cmF2ZXJzYWwKKyAgIGlmIChnZXBJbnN0KSB7CisgICAgICBjb25zdCBsbHZtOjpWYWx1ZSogZ2VwU3JjID0gZ2VwSW5zdC0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKworICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgbG9hZCBmcm9tIHRoaXMgYWdncmVnYXRlLCBtYWtlIHVwIGEgbmV3IG9uZS4KKyAgICAgIGNvbnN0IHRWYWx1ZU1hcDo6Y29uc3RfaXRlcmF0b3IgbG9jYXRpb24gPSB2YWx1ZU1hcC5maW5kKGdlcFNyYyk7CisgICAgICBpZiAobG9jYXRpb24gPT0gdmFsdWVNYXAuZW5kKCkpIHsKKyAgICAgICAgICBjb25zdCBsbHZtOjpNRE5vZGUqIG1kTm9kZTsKKyAgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiAgIG1kVHlwZTsKKyAgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiAgIG1kQWdncmVnYXRlVHlwZTsKKworICAgICAgICAgIEZpbmRHZXBUeXBlKGdlcEluc3QsIG1kVHlwZSwgbWRBZ2dyZWdhdGVUeXBlLCBtZE5vZGUpOworICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSogaXJUeXBlID0gbGx2bVR5cGVUb0hpclR5cGUobWRUeXBlLCBtZE5vZGUsIGxsdm1JbnN0KTsKKworICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBuYW1lID0gc3JjLT5nZXROYW1lKCk7CisKKyAgICAgICAgICBpZiAoZ2VwU3JjKSB7CisgICAgICAgICAgICAgbmFtZSA9IGdlcFNyYy0+Z2V0TmFtZSgpOworCisgICAgICAgICAgICAgLy8gTG9vayBmb3IgYnVpbHRpbgorICAgICAgICAgICAgIHROYW1lQnVpbHRpbk1hcDo6Y29uc3RfaXRlcmF0b3IgZ290ID0gbmFtZUJ1aWx0aW5NYXAuZmluZChuYW1lKTsKKyAgICAgICAgICAgICBpZiAoZ290ICE9IG5hbWVCdWlsdGluTWFwLmVuZCgpKQorICAgICAgICAgICAgICAgICBuYW1lID0gZ290LT5zZWNvbmQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgaXJfdmFyaWFibGVfbW9kZSBpck1vZGUgPSBpcl92YXJpYWJsZV9tb2RlKGdsb2JhbFZhck1vZGVNYXBbbmFtZV0pOworCisgICAgICAgICAgaXJfcnZhbHVlKiBpckRzdCA9IG5ld0lSVmFyaWFibGVEZXJlZihpclR5cGUsIG5hbWUsIGlyTW9kZSk7CisKKyAgICAgICAgICB2YWx1ZU1hcC5pbnNlcnQodFZhbHVlTWFwOjp2YWx1ZV90eXBlKGdlcFNyYywgaXJEc3QpKS5maXJzdDsKKyAgICAgICB9CisKKworICAgICAgLy8gVE9ETzogRm9yIGdsb2JhbHMsIGRvIHdlIHJlYWxseSBoYXZlIHRvIGxvb2sgdGhpcyB1cCBmcm9tIHRoZQorICAgICAgLy8gZ2xvYmFsIGRlY2w/ICBUaGUgZ2xvYmFsIGRlY2wgY2FuJ3QgcHV0IGFueSBsbHZtOjpWYWx1ZSBpbiB0aGUgbWFwLAorICAgICAgLy8gYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYSBsbHZtOjpWYWx1ZSwgc28gd2UgY2FuJ3QgdXNlIHRoZSBub3JtYWwKKyAgICAgIC8vIHNjaGVtZS4gVGhpcyBzZWVtcyB1Z2x5OiBwcm9iYWJseSBqdXN0IG92ZXJsb29raW5nIHRoZSAicmlnaHQiIHdheS4KKyAgICAgIC8vIE5lZWRzIHdvcmsuLi4KKyAgICAgIGlmIChnbG9iYWxEZWNsTWFwLmZpbmQobmFtZSkgIT0gZ2xvYmFsRGVjbE1hcC5lbmQoKSB8fAorICAgICAgICAgIGFub25CbG9ja3MuZmluZChuYW1lKSAhPSBhbm9uQmxvY2tzLmVuZCgpKSB7CisgICAgICAgICBhZ2dyZWdhdGUgPSBuZXdJUlZhcmlhYmxlRGVyZWYoaXJUeXBlLCBuYW1lLCBpck1vZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGFnZ3JlZ2F0ZSA9IGdldElSVmFsdWUoZ2VwU3JjKTsKKyAgICAgIH0KKyAgIAorICAgICAgbG9hZCA9IHRyYXZlcnNlR0VQKGdlcEluc3QsIGFnZ3JlZ2F0ZSwgMCk7CisgICB9IGVsc2UgeworICAgICAgIGNvbnN0IGxsdm06OlZhbHVlKiBsb2FkU3JjID0gbGx2bUluc3QtPmdldE9wZXJhbmQoMCk7CisKKyAgICAgICAvLyBMb2FkIGZyb20gZXhpc3RpbmcgdmFyaWFibGUsIG9yIGRlY2xhcmUgYSBuZXcgb25lCisgICAgICAgY29uc3QgdFZhbHVlTWFwOjpjb25zdF9pdGVyYXRvciBsb2NhdGlvbiA9IHZhbHVlTWFwLmZpbmQobG9hZFNyYyk7CisgICAgICAgaWYgKGxvY2F0aW9uID09IHZhbHVlTWFwLmVuZCgpKSB7CisgICAgICAgICAgIGxvYWQgPSBuZXdJUlZhcmlhYmxlRGVyZWYoc3JjVHlwZSwgbG9hZFNyYywgbmFtZSwgaXJNb2RlKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBsb2FkID0gZ2V0SVJWYWx1ZShsb2FkU3JjKTsKKyAgICAgICB9CisgICB9CisKKyAgIGlmIChsb2FkLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpKSB7CisgICAgICBpb1ZhciA9IGxvYWQtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCktPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIH0gZWxzZSBpZiAoYWdncmVnYXRlKSB7CisgICAgICBpb1ZhciA9IGFnZ3JlZ2F0ZS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKS0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworICAgfQorCisgICBzZXRJb1BhcmFtZXRlcnMoaW9WYXIsIG1kTm9kZSk7CisKKyAgIC8vIEhhbmRsZSB0eXBlIG92ZXJyaWRpbmcKKyAgIGlmICh0eXBlT3ZlcnJpZGUpCisgICAgICBsb2FkLT50eXBlID0gdHlwZU92ZXJyaWRlOworCisgICByZXR1cm4gbG9hZDsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDcmVhdGUgYW4gSVIgbWF0cml4IG9iamVjdCBieSBkaXJlY3QgcmVhZCBmcm9tIGEgdW5pZm9ybSBtYXRyaXgsCisgKiBvciBtb3ZlcyBvZiBjb2x1bW4gdmVjdG9ycyBpbnRvIGEgdGVtcCBtYXRyaXguCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgaXJfcnZhbHVlKgorTWVzYUdsYXNzVHJhbnNsYXRvcjo6aW50cmluc2ljTWF0KGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBsbHZtSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RDb2x1bW4sIGludCBudW1Db2xzLCBpbnQgbnVtUm93cykKK3sKKyAgIGNvbnN0IGxsdm06OlZhbHVlKiBtYXRTb3VyY2UgPSAwOworCisgICAvLyBJZiB0aGUgc291cmNlIGlzIGZyb20gYSB1bmlmb3JtLCB3ZSdsbCBtYWtlIGEgbmV3IHVuaWZvcm0gbWF0cml4LgorICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCBmb3JtIGEgbWF0cml4IGJ5IGNvcHlpbmcgdGhlIGNvbHVtbnMgaW50byBhIG5ldyBtYXQsCisgICAvLyBhbmQgaG9wZSBkb3duc3RyZWFtIGNvcHkgcHJvcGFnYXRpb24gb3B0aW1pemVzIHRoZW0gYXdheS4KKyAgIGZvciAoaW50IGNvbD0wOyBjb2w8bnVtQ29sczsgKytjb2wpIHsKKyAgICAgIGNvbnN0IGludCBjb2xQb3MgPSBjb2wgKyBmaXJzdENvbHVtbjsKKworICAgICAgaWYgKGNvbnN0IGxsdm06OkV4dHJhY3RWYWx1ZUluc3QqIGV4dHJhY3RWYWx1ZSA9CisgICAgICAgICAgbGx2bTo6ZHluX2Nhc3Q8Y29uc3QgbGx2bTo6RXh0cmFjdFZhbHVlSW5zdD4obGx2bUluc3QtPmdldE9wZXJhbmQoY29sUG9zKSkpIHsKKworICAgICAgICAgaWYgKGNvbCA9PSAwKSB7CisgICAgICAgICAgICBtYXRTb3VyY2UgPSBleHRyYWN0VmFsdWUtPmdldE9wZXJhbmQoMCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1hdFNvdXJjZSAhPSBleHRyYWN0VmFsdWUtPmdldE9wZXJhbmQoMCkpCisgICAgICAgICAgICAgICBtYXRTb3VyY2UgPSAwOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBjb25zdCBnbHNsX3R5cGUqIG1hdFR5cGUgICAgPSBnbHNsTWF0VHlwZShudW1Db2xzLCBudW1Sb3dzKTsKKyAgIGFzc2VydChtYXRUeXBlKTsKKworICAgaXJfcnZhbHVlKiBtYXRyaXggPSAwOworCisgICBpZiAobWF0U291cmNlKSB7CisgICAgICBjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbWF0U3JjSW5zdCA9IGR5bl9jYXN0PGNvbnN0IGxsdm06Okluc3RydWN0aW9uPihtYXRTb3VyY2UpOworCisgICAgICBjb25zdCBsbHZtOjpHZXRFbGVtZW50UHRySW5zdCogZ2VwSW5zdCA9IGdldEdlcEFzSW5zdChtYXRTcmNJbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgICAgIGxsdm06OlN0cmluZ1JlZiBuYW1lOworCisgICAgICBpZiAoZ2VwSW5zdCkKKyAgICAgICAgIG5hbWUgPSBnZXBJbnN0LT5nZXRPcGVyYW5kKDApLT5nZXROYW1lKCk7CisgICAgICBlbHNlIAorICAgICAgICAgbmFtZSA9IGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApLT5nZXROYW1lKCk7CisKKyAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlX21vZGUgaXJNb2RlID0gaXJfdmFyaWFibGVfbW9kZShnbG9iYWxWYXJNb2RlTWFwW25hbWVdKTsKKworICAgICAgLy8gU2luZ2xlIG1hdCBzb3VyY2UgbWF5IGhhdmUgY29tZSBmcm9tIGEgdW5pZm9ybSBsb2FkLCBvciBhIHByZXZpb3VzIG1hdCptYXQKKyAgICAgIGlmIChtYXRTcmNJbnN0LT5nZXRPcGNvZGUoKSA9PSBsbHZtOjpJbnN0cnVjdGlvbjo6TG9hZCAmJgorICAgICAgICAgIGlyTW9kZSA9PSBpcl92YXJfdW5pZm9ybSkgeworICAgICAgICAgbWF0cml4ID0gbWFrZUlSTG9hZChkeW5fY2FzdDxjb25zdCBsbHZtOjpJbnN0cnVjdGlvbj4obWF0U291cmNlKSwgbWF0VHlwZSk7CisgICAgICB9IGVsc2UgaWYgKG1hdFNyY0luc3QtPmdldE9wY29kZSgpID09IGxsdm06Okluc3RydWN0aW9uOjpDYWxsKSB7CisgICAgICAgICBjb25zdCBsbHZtOjpJbnRyaW5zaWNJbnN0KiBpbnRyaW5zaWMgPSBkeW5fY2FzdDxjb25zdCBsbHZtOjpJbnRyaW5zaWNJbnN0PihtYXRTcmNJbnN0KTsKKworICAgICAgICAgaWYgKGludHJpbnNpYykgeworICAgICAgICAgICAgc3dpdGNoIChpbnRyaW5zaWMtPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgICAgICAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDJUaW1lc01hdHJpeDI6CisgICAgICAgICAgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNYXRyaXgyVGltZXNNYXRyaXgzOgorICAgICAgICAgICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWF0cml4MlRpbWVzTWF0cml4NDoKKyAgICAgICAgICAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDNUaW1lc01hdHJpeDI6CisgICAgICAgICAgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNYXRyaXgzVGltZXNNYXRyaXgzOgorICAgICAgICAgICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWF0cml4M1RpbWVzTWF0cml4NDoKKyAgICAgICAgICAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDRUaW1lc01hdHJpeDI6CisgICAgICAgICAgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNYXRyaXg0VGltZXNNYXRyaXgzOgorICAgICAgICAgICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWF0cml4NFRpbWVzTWF0cml4NDoKKyAgICAgICAgICAgICAgIG1hdHJpeCA9IGdldElSVmFsdWUobWF0U291cmNlKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgLy8gd2UncmUgZ29pbmcgdG8gbG9hZCBpdCB0aGUgaGFyZCB3YXkKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKCFtYXRyaXgpIHsKKyAgICAgIC8vIElmIHdlIGNhbid0IHVzZSBtYXQqdmVjIGRpcmVjdGx5LCBpc3N1ZSBzZXBhcmF0ZSBtb3ZlcyBpbnRvIGEgdGVtcCBtYXRyaXgsCisgICAgICAvLyBhbmQgbXVsdGlwbHkgZnJvbSB0aGF0LgorICAgICAgbWF0cml4ID0gbmV3SVJWYXJpYWJsZURlcmVmKG1hdFR5cGUsIHJhbGxvY19zdHJkdXAoc2hhZGVyLCAiLm1hdC50ZW1wIiksIGlyX3Zhcl9hdXRvKTsKKworICAgICAgZm9yIChpbnQgY29sPTA7IGNvbCA8IG51bUNvbHM7ICsrY29sKSB7CisgICAgICAgICBjb25zdCBpbnQgY29sUG9zID0gY29sICsgZmlyc3RDb2x1bW47CisKKyAgICAgICAgIGlyX3J2YWx1ZSogaW5kZXhWYWwgPSBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChjb2wpOworICAgICAgICAgaXJfcnZhbHVlKiBjb2x1bW4gICA9IG5ldyhzaGFkZXIpIGlyX2RlcmVmZXJlbmNlX2FycmF5KG1hdHJpeC0+Y2xvbmUoc2hhZGVyLCAwKSwgaW5kZXhWYWwpOworCisgICAgICAgICBhZGRJUkluc3RydWN0aW9uKG5ldyhzaGFkZXIpIGlyX2Fzc2lnbm1lbnQoY29sdW1uLCBnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKGNvbFBvcykpKSk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBtYXRyaXg7Cit9CisKKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtYXQqbWF0IGludHJpbnNpY3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkCitNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJNYXRUaW1lc01hdChjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtTGVmdENvbHMsIGludCBudW1SaWdodENvbHMpCit7CisgICAvLyBTaXplIG9mIGNvbHVtbiB2ZWN0b3IKKyAgIGNvbnN0IGludCBsZWZ0Um93cyAgPQorICAgICAgZ2xhOjpHZXRDb21wb25lbnRDb3VudChjb25zdF9jYXN0PGxsdm06OlR5cGUqPihsbHZtSW5zdC0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpKSk7CisgICBjb25zdCBpbnQgcmlnaHRSb3dzID0KKyAgICAgIGdsYTo6R2V0Q29tcG9uZW50Q291bnQoY29uc3RfY2FzdDxsbHZtOjpUeXBlKj4obGx2bUluc3QtPmdldE9wZXJhbmQobnVtTGVmdENvbHMpLT5nZXRUeXBlKCkpKTsKKworICAgLy8gTExWTSBwcm9kdWNlcyBhIHN0cnVjdCByZXN1bHQsIHdoaWNoIGlzbid0IHdoYXQgd2Ugd2FudCB0byBiZSBtYWtpbmcuICBTbywgd2UnbGwKKyAgIC8vIG92ZXJyaWRlIHRoYXQgd2l0aCB0aGUgdHlwZSB3ZSBrbm93IGl0IG91Z2h0IHRvIGJlLgorICAgY29uc3QgZ2xzbF90eXBlKiByZXN1bHRUeXBlID0gZ2xzbE1hdFR5cGUobnVtTGVmdENvbHMsIHJpZ2h0Um93cyk7CisKKyAgIGlyX3J2YWx1ZSogbGVmdE1hdCAgPSBpbnRyaW5zaWNNYXQobGx2bUluc3QsIDAsIG51bUxlZnRDb2xzLCBsZWZ0Um93cyk7CisgICBpcl9ydmFsdWUqIHJpZ2h0TWF0ID0gaW50cmluc2ljTWF0KGxsdm1JbnN0LCBudW1MZWZ0Q29scywgbnVtUmlnaHRDb2xzLCByaWdodFJvd3MpOworICAgCisgICBpcl9ydmFsdWUqIHJlc3VsdCAgID0gZ2xhc3NfdG9faXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tdWwsIHJlc3VsdFR5cGUsIGxlZnRNYXQsIHJpZ2h0TWF0KTsKKworICAgYWRkSVJJbnN0cnVjdGlvbihsbHZtSW5zdCwgcmVzdWx0KTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtYXQqVmVjIGFuZCB2ZWMqbWF0IGludHJpbnNpY3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkCitNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJNYXRNdWwoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0LCBpbnQgbnVtQ29scywgYm9vbCBtYXRMZWZ0KQoreworICAgY29uc3QgaW50IGZpcnN0Q29sdW1uID0gbWF0TGVmdCA/IDAgOiAxOworICAgY29uc3QgaW50IHZlY1BvcyAgICAgID0gbWF0TGVmdCA/IG51bUNvbHMgOiAwOworCisgICBjb25zdCBsbHZtOjpWYWx1ZSogdmVjU291cmNlID0gbGx2bUluc3QtPmdldE9wZXJhbmQodmVjUG9zKTsKKworICAgLy8gU2l6ZSBvZiBjb2x1bW4gdmVjdG9yCisgICBjb25zdCBpbnQgdmVjU2l6ZSA9IAorICAgICAgZ2xhOjpHZXRDb21wb25lbnRDb3VudChjb25zdF9jYXN0PGxsdm06OlR5cGUqPihsbHZtSW5zdC0+Z2V0T3BlcmFuZCh2ZWNQb3MpLT5nZXRUeXBlKCkpKTsKKworICAgaXJfcnZhbHVlKiByZXN1bHQgPSAwOworCisgICBjb25zdCBnbHNsX3R5cGUqIHJlc3VsdFR5cGUgPSBsbHZtVHlwZVRvSGlyVHlwZShsbHZtSW5zdC0+Z2V0VHlwZSgpLCAwLCBsbHZtSW5zdCk7CisKKyAgIGlyX3J2YWx1ZSogdmVjdG9yID0gZ2V0SVJWYWx1ZSh2ZWNTb3VyY2UpOworICAgaXJfcnZhbHVlKiBtYXRyaXggPSBpbnRyaW5zaWNNYXQobGx2bUluc3QsIGZpcnN0Q29sdW1uLCBudW1Db2xzLCB2ZWNTaXplKTsKKworICAgLy8gSXNzdWUgdGhlIG1hdHJpeCBtdWx0aXBseSwgaW4gdGhlIHJlcXVlc3RlZCBvcmRlcgorICAgaWYgKG1hdExlZnQpCisgICAgICByZXN1bHQgPSBnbGFzc190b19pcl9leHByZXNzaW9uKGlyX2Jpbm9wX211bCwgcmVzdWx0VHlwZSwgbWF0cml4LCB2ZWN0b3IpOworICAgZWxzZQorICAgICAgcmVzdWx0ID0gZ2xhc3NfdG9faXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tdWwsIHJlc3VsdFR5cGUsIHZlY3RvciwgbWF0cml4KTsKKworICAgYWRkSVJJbnN0cnVjdGlvbihsbHZtSW5zdCwgcmVzdWx0KTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUcmFuc2xhdGUgaW50cmluc2ljCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJJbnRyaW5zaWMoY29uc3QgbGx2bTo6SW50cmluc2ljSW5zdCogbGx2bUluc3QpCit7CisgICBzd2l0Y2ggKGxsdm1JbnN0LT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6aW52YXJpYW50X2VuZDogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gaWdub3JlIExMVk0gaGludHMKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjppbnZhcmlhbnRfc3RhcnQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAvLyBpZ25vcmUgTExWTSBoaW50cworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmxpZmV0aW1lX2VuZDogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgIC8vIGlnbm9yZSBMTFZNIGhpbnRzCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gaWdub3JlIExMVk0gaGludHMKKworICAgLy8gSGFuZGxlIFRleHR1cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfcXVlcnlUZXh0dXJlU2l6ZTogICAgICAgICAgICAgICAgICAvLyAuLi4gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3F1ZXJ5VGV4dHVyZVNpemVOb0xvZDogICAgICAgICAgICAgLy8gLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZRdWVyeVRleHR1cmVMb2Q6ICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUlRleHR1cmVRdWVyeShsbHZtSW5zdCk7CisgICAvLyBUT0RPOiBHb286IDQzMCBGdW5jdGlvbmFsaXR5OiB0ZXh0dXJlUXVlcnlMZXZlbHMoKQorICAgLy8gY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9xdWVyeVRleHR1cmVMZXZlbHM6IC8vIFRPRE86CisKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdGV4dHVyZVNhbXBsZTogICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRleHR1cmVTYW1wbGU6ICAgICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGUxOiAgICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlMTogICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGUyOiAgICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlMjogICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGUzOiAgICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlMzogICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGU0OiAgICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlNDogICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdGV4dHVyZVNhbXBsZUxvZFJlZlo6ICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRleHR1cmVTYW1wbGVMb2RSZWZaOiAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaMTogICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWjE6ICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaMjogICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWjI6ICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaMzogICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWjM6ICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaNDogICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWjQ6ICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdGV4dHVyZVNhbXBsZUxvZFJlZlpPZmZzZXQ6ICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0OiAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0MTogICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldDE6ICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0MjogICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldDI6ICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0MzogICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldDM6ICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0NDogICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldDQ6ICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdGV4dHVyZVNhbXBsZUxvZFJlZlpPZmZzZXRHcmFkOiAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0R3JhZDogICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0R3JhZDE6ICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldEdyYWQxOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0R3JhZDI6ICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldEdyYWQyOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0R3JhZDM6ICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldEdyYWQzOiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfclRleHR1cmVTYW1wbGVMb2RSZWZaT2Zmc2V0R3JhZDQ6ICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJUZXh0dXJlU2FtcGxlTG9kUmVmWk9mZnNldEdyYWQ0OiAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdGV4ZWxGZXRjaE9mZnNldDogICAgICAgICAgICAgICAgICAvLyAuLi4gCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZUZXhlbEZldGNoT2Zmc2V0OiAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUlRleHR1cmUobGx2bUluc3QsIGZhbHNlKTsKKyAgIC8vIEdhdGhlcgorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV90ZXhlbEdhdGhlcjogICAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRleGVsR2F0aGVyOiAgICAgICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdGV4ZWxHYXRoZXJPZmZzZXQ6ICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRleGVsR2F0aGVyT2Zmc2V0OiAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdGV4ZWxHYXRoZXJPZmZzZXRzOiAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRleGVsR2F0aGVyT2Zmc2V0czogICAgICAgICAgICAgICByZXR1cm4gZW1pdElSVGV4dHVyZShsbHZtSW5zdCwgdHJ1ZSk7CisKKyAgIC8vIEhhbmRsZSBNdWx0SW5zZXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNdWx0aUluc2VydDogICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX211bHRpSW5zZXJ0OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUk11bHRpSW5zZXJ0KGxsdm1JbnN0KTsKKworICAgLy8gSGFuZGxlIFN3aXp6bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfc3dpenpsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlN3aXp6bGU6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdElSU3dpenpsZShsbHZtSW5zdCk7CisKKyAgIC8vIEhhbmRsZSBGUCBhbmQgaW50ZWdlciBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2FiczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZBYnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2FicywgbGx2bUluc3QpOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3NNaW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNaW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwyPihpcl9iaW5vcF9taW4sIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdU1pbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDI+KGlyX2Jpbm9wX21pbiwgbGx2bUluc3QsIHRydWUsIHRydWUgLyogZ2VuVW5zaWduZWQgKi8pOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3NNYXg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNYXg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwyPihpcl9iaW5vcF9tYXgsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdU1heDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDI+KGlyX2Jpbm9wX21heCwgbGx2bUluc3QsIHRydWUsIHRydWUgLyogZ2VuVW5zaWduZWQgKi8pOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3NDbGFtcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZDbGFtcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUkNsYW1wKGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdUNsYW1wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdElSQ2xhbXAobGx2bUluc3QsIHRydWUgLyogZ2VuVW5zaWduZWQgKi8pOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZSYWRpYW5zOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigicmFkaWFucyIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkRlZ3JlZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJkZWdyZWVzIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mU2luOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9zaW4sIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkNvczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDE+KGlyX3Vub3BfY29zLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZUYW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigidGFuIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mQXNpbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImFzaW4iLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZBY29zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigiYWNvcyIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkF0YW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkF0YW4yOiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJhdGFuIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mU2luaDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oInNpbmgiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZDb3NoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigiY29zaCIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlRhbmg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJ0YW5oIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mQXNpbmg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImFzaW5oIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mQWNvc2g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImFjb3NoIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mQXRhbmg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImF0YW5oIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUG93OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUG93aTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8Mj4oaXJfYmlub3BfcG93LCAgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mRXhwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9leHAsICAgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTG9nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9sb2csICAgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mRXhwMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9leHAyLCAgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTG9nMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9sb2cyLCAgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mRXhwMTA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwKTsgcmV0dXJuOyAvLyBMZXQgTHVuYXJHbGFzcyBkZWNvbXBvc2UKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkxvZzEwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IHJldHVybjsgLy8gTGV0IEx1bmFyR2xhc3MgZGVjb21wb3NlCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZTcXJ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3NxcnQsICBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZJbnZlcnNlU3FydDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3JzcSwgICBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZTaWduOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3NpZ246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3NpZ24sICBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGbG9vcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2Zsb29yLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZDZWlsaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2NlaWwsICBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZSb3VuZEV2ZW46ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3JvdW5kX2V2ZW4sIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJvdW5kWmVybzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDE+KGlyX3Vub3BfdHJ1bmMsICBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZSb3VuZEZhc3Q6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigicm91bmQiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGcmFjdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2ZyYWN0LCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNb2RGOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigibW9kZiIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1peDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDM+KGlyX3RyaW9wX2xycCwgIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZmJNaXg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJtaXgiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZTdGVwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigic3RlcCIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlNtb290aFN0ZXA6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJzbW9vdGhzdGVwIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mSXNOYW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImlzbmFuIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mSXNJbmY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImlzaW5mIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mU2F0dXJhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0SVJTYXR1cmF0ZShsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGbWE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwzPihpcl90cmlvcF9mbWEsICBsbHZtSW5zdCk7CisKKyAgIC8vIEhhbmRsZSBpbnRlZ2VyLW9ubHkgb3BzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2FkZENhcnJ5OiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwyPihpcl9iaW5vcF9jYXJyeSwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9zdWJCb3Jyb3c6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8Mj4oaXJfYmlub3BfYm9ycm93LCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3VtdWxFeHRlbmRlZDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigidW11bEV4dGVuZGVkIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9zbXVsRXh0ZW5kZWQ6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oInNtdWxFeHRlbmRlZCIsIGxsdm1JbnN0KTsKKworICAgLy8gSGFuZGxlIG1hdCp2ZWMgJiB2ZWMqbWF0IGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDJUaW1lc1ZlY3RvcjogICAgICAgICAgICAgICByZXR1cm4gZW1pdElSTWF0TXVsKGxsdm1JbnN0LCAyLCB0cnVlKTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDNUaW1lc1ZlY3RvcjogICAgICAgICAgICAgICByZXR1cm4gZW1pdElSTWF0TXVsKGxsdm1JbnN0LCAzLCB0cnVlKTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDRUaW1lc1ZlY3RvcjogICAgICAgICAgICAgICByZXR1cm4gZW1pdElSTWF0TXVsKGxsdm1JbnN0LCA0LCB0cnVlKTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlZlY3RvclRpbWVzTWF0cml4MjogICAgICAgICAgICAgICByZXR1cm4gZW1pdElSTWF0TXVsKGxsdm1JbnN0LCAyLCBmYWxzZSk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZWZWN0b3JUaW1lc01hdHJpeDM6ICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUk1hdE11bChsbHZtSW5zdCwgMywgZmFsc2UpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mVmVjdG9yVGltZXNNYXRyaXg0OiAgICAgICAgICAgICAgIHJldHVybiBlbWl0SVJNYXRNdWwobGx2bUluc3QsIDQsIGZhbHNlKTsKKworICAgLy8gSGFuZGxlIG1hdCptYXQgLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDJUaW1lc01hdHJpeDI6ICAgICAgICAgICAgICByZXR1cm4gZW1pdElSTWF0VGltZXNNYXQobGx2bUluc3QsIDIsIDIpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWF0cml4MlRpbWVzTWF0cml4MzogICAgICAgICAgICAgIHJldHVybiBlbWl0SVJNYXRUaW1lc01hdChsbHZtSW5zdCwgMiwgMyk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNYXRyaXgyVGltZXNNYXRyaXg0OiAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUk1hdFRpbWVzTWF0KGxsdm1JbnN0LCAyLCA0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDNUaW1lc01hdHJpeDI6ICAgICAgICAgICAgICByZXR1cm4gZW1pdElSTWF0VGltZXNNYXQobGx2bUluc3QsIDMsIDIpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWF0cml4M1RpbWVzTWF0cml4MzogICAgICAgICAgICAgIHJldHVybiBlbWl0SVJNYXRUaW1lc01hdChsbHZtSW5zdCwgMywgMyk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNYXRyaXgzVGltZXNNYXRyaXg0OiAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUk1hdFRpbWVzTWF0KGxsdm1JbnN0LCAzLCA0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk1hdHJpeDRUaW1lc01hdHJpeDI6ICAgICAgICAgICAgICByZXR1cm4gZW1pdElSTWF0VGltZXNNYXQobGx2bUluc3QsIDQsIDIpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTWF0cml4NFRpbWVzTWF0cml4MzogICAgICAgICAgICAgIHJldHVybiBlbWl0SVJNYXRUaW1lc01hdChsbHZtSW5zdCwgNCwgMyk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZNYXRyaXg0VGltZXNNYXRyaXg0OiAgICAgICAgICAgICAgcmV0dXJuIGVtaXRJUk1hdFRpbWVzTWF0KGxsdm1JbnN0LCA0LCA0KTsKKworICAgLy8gSGFuZGxlIGJpdCBvcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkZsb2F0Qml0c1RvSW50OiAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJmbG9hdEJpdHNUb0ludCIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkludEJpdHNUb2Zsb2F0OiAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJpbnRCaXRzVG9GbG9hdCIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfc0JpdEZpZWxkRXh0cmFjdDogICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDM+KGlyX3RyaW9wX2JpdGZpZWxkX2V4dHJhY3QsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfdUJpdEZpZWxkRXh0cmFjdDogICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDM+KGlyX3RyaW9wX2JpdGZpZWxkX2V4dHJhY3QsIGxsdm1JbnN0LCB0cnVlLCB0cnVlLCB0cnVlIC8qIGdlblVuc2lnbmVkKi8pOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9iaXRGaWVsZEluc2VydDogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8Mz4oaXJfdHJpb3BfYmZpLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2JpdFJldmVyc2U6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2JpdGZpZWxkX3JldmVyc2UsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfYml0Q291bnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDE+KGlyX3Vub3BfYml0X2NvdW50LCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZpbmRMU0I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2ZpbmRfbHNiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3NGaW5kTVNCOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2ZpbmRfbXNiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX3VGaW5kTVNCOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2ZpbmRfbXNiLCBsbHZtSW5zdCwgdHJ1ZSAvKiBnZW5VbnNpZ25lZCAqLyk7CisKKyAgIC8vIEhhbmRsZSBwYWNrL3VucGFjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGcmV4cDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigiZnJleHAiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZMZGV4cDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigibGRleHAiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZQYWNrVW5vcm0yeDE2OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3BhY2tfdW5vcm1fMngxNiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mVW5wYWNrVW5vcm0yeDE2OiAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF91bnBhY2tfdW5vcm1fMngxNiwgbGx2bUluc3QpOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZQYWNrU25vcm0yeDE2OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3BhY2tfc25vcm1fMngxNiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mVW5wYWNrU25vcm0yeDE2OiAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF91bnBhY2tfc25vcm1fMngxNiwgbGx2bUluc3QpOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZQYWNrSGFsZjJ4MTY6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3BhY2tfaGFsZl8yeDE2LCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZVbnBhY2tIYWxmMngxNjogICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3VucGFja19oYWxmXzJ4MTYsIGxsdm1JbnN0KTsKKworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUGFja1Vub3JtNHg4OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9wYWNrX3Vub3JtXzR4OCwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mUGFja1Nub3JtNHg4OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9wYWNrX3Nub3JtXzR4OCwgbGx2bUluc3QpOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZVbnBhY2tVbm9ybTR4ODogICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX3VucGFja191bm9ybV80eDgsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlVucGFja1Nub3JtNHg4OiAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDE+KGlyX3Vub3BfdW5wYWNrX3Nub3JtXzR4OCwgbGx2bUluc3QpOworCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZQYWNrRG91YmxlMngzMjogICAgICAgICAgICAgICAgICAgYXNzZXJ0KDApOyBicmVhazsgLy8gVE9ETzoKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlVucGFja0RvdWJsZTJ4MzI6ICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IGJyZWFrOyAvLyBUT0RPOgorCisgICAvLyBIYW5kbGUgZ2VvbWV0cnkgb3BzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImxlbmd0aCIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkRpc3RhbmNlOiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJkaXN0YW5jZSIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkRvdDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkRvdDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi4KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkRvdDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdE9wPDI+KGlyX2Jpbm9wX2RvdCwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mQ3Jvc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oImNyb3NzIiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTm9ybWFsaXplOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oIm5vcm1hbGl6ZSIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZk5vcm1hbGl6ZTNEOiAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IGJyZWFrOyAvLyBUT0RPOgorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mTGl0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwKTsgYnJlYWs7IC8vIFRPRE86CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZGYWNlRm9yd2FyZDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigiZmFjZWZvcndhcmQiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZSZWZsZWN0OiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigicmVmbGVjdCIsIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZlJlZnJhY3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJyZWZyYWN0IiwgbGx2bUluc3QpOworCisgICAvLyBIYW5kbGUgZGVyaXZhdGl2ZSBhbmQgdHJhbnNmb3JtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mREZkeDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9kRmR4LCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX2ZERmR5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2RGZHksIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZkZpbHRlcldpZHRoOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJmd2lkdGgiLCBsbHZtSW5zdCk7CisKKyAgIC8vIEhhbmRsZSB2ZWN0b3IgbG9naWNhbCBvcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX25vdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtaXRGbigibm90IiwgbGx2bUluc3QpOworICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9hbnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9hbnksIGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfYWxsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJhbGwiLCBsbHZtSW5zdCk7CisKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZGlzY2FyZENvbmRpdGlvbmFsOiAgICAgICAgICAgICAgICByZXR1cm4gZW1pdElSRGlzY2FyZENvbmQobGx2bUluc3QpOworCisgICAvLyBIYW5kbGUgZml4ZWQgdHJhbnNmb3JtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9mRml4ZWRUcmFuc2Zvcm06ICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0SVJGVHJhbnNmb3JtKGxsdm1JbnN0KTsKKworICAgLy8gQ29udHJvbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfYmFycmllcjogICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IGJyZWFrOyAvLyBUT0RPOgorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9tZW1vcnlCYXJyaWVyOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0Rm4oIm1lbW9yeUJhcnJpZXIiLCBsbHZtSW5zdCk7CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX21lbW9yeUJhcnJpZXJBdG9taWNDb3VudGVyOiAgICAgICAgYXNzZXJ0KDApOyBicmVhazsgLy8gVE9ETzoKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfbWVtb3J5QmFycmllckJ1ZmZlcjogICAgICAgICAgICAgICBhc3NlcnQoMCk7IGJyZWFrOyAvLyBUT0RPOgorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9tZW1vcnlCYXJyaWVySW1hZ2U6ICAgICAgICAgICAgICAgIGFzc2VydCgwKTsgYnJlYWs7IC8vIFRPRE86CisgICBjYXNlIGxsdm06OkludHJpbnNpYzo6Z2xhX21lbW9yeUJhcnJpZXJTaGFyZWQ6ICAgICAgICAgICAgICAgYXNzZXJ0KDApOyBicmVhazsgLy8gVE9ETzoKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZ3JvdXBNZW1vcnlCYXJyaWVyOiAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IGJyZWFrOyAvLyBUT0RPOgorCisgICAvLyBHZW9tZXRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9lbWl0VmVydGV4OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWl0SVJFbWl0VmVydGV4KGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZW5kUHJpbWl0aXZlOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdElSRW5kUHJpbWl0aXZlKGxsdm1JbnN0KTsKKyAgIGNhc2UgbGx2bTo6SW50cmluc2ljOjpnbGFfZW1pdFN0cmVhbVZlcnRleDogICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IGJyZWFrOyAvLyBUT0RPOgorICAgY2FzZSBsbHZtOjpJbnRyaW5zaWM6OmdsYV9lbmRTdHJlYW1QcmltaXRpdmU6ICAgICAgICAgICAgICAgIGFzc2VydCgwKTsgYnJlYWs7IC8vIFRPRE86CisKKyAgIGRlZmF1bHQ6ICAgICByZXR1cm4gZXJyb3IoInVua25vd24gaW50cmluc2ljIik7CisgICB9Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHJhbnNsYXRlIGNhbGwgb3IgaW50cmluc2ljCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJDYWxsT3JJbnRyaW5zaWMoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0KQoreworCisgICBpZiAoY29uc3QgbGx2bTo6SW50cmluc2ljSW5zdCogaW50cmluc2ljID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6SW50cmluc2ljSW5zdD4obGx2bUluc3QpKSB7CisgICAgICBlbWl0SVJJbnRyaW5zaWMoaW50cmluc2ljKTsKKyAgIH0gZWxzZSB7CisgICAgICBjb25zdCBsbHZtOjpDYWxsSW5zdCogY2FsbCA9IGxsdm06OmR5bl9jYXN0PGxsdm06OkNhbGxJbnN0PihsbHZtSW5zdCk7CisgICAgICBhc3NlcnQoY2FsbCk7CisgICAgICBlbWl0SVJDYWxsKGNhbGwpOworICAgfQorfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFZlY3RvciBjb21wb25lbnQgZXh0cmFjdGlvbgorICogICA8cmVzdWx0PiA9IGV4dHJhY3RlbGVtZW50IDxuIHggPHR5Pj4gPHZhbD4sIGkzMiA8aWR4PiAgICA7IHlpZWxkcyB0eXBlIDx0eT4KKyAqICAgaW5kZXggY2FuIGJlIGNvbnN0YW50IG9yIHZhcmlhYmxlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJFeHRyYWN0RWxlbWVudChjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QpCit7CisgICBpcl9ydmFsdWUgKnZlY3RvciAgID0gZ2V0SVJWYWx1ZShsbHZtSW5zdC0+Z2V0T3BlcmFuZCgwKSk7CisgICBpcl9ydmFsdWUgKmluZGV4ICAgID0gZ2V0SVJWYWx1ZShsbHZtSW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICBhc3NlcnQodmVjdG9yICYmIGluZGV4KTsKKworICAgaWYgKGluZGV4LT5hc19jb25zdGFudCgpKSB7CisgICAgICB1bnNpZ25lZCBjb21wb25lbnQgPSBpbmRleC0+YXNfY29uc3RhbnQoKS0+Z2V0X3VpbnRfY29tcG9uZW50KDApOworICAgICAgY29uc3QgdW5zaWduZWQgY29tcG9uZW50c1s0XSA9IHsgY29tcG9uZW50LCBjb21wb25lbnQsIGNvbXBvbmVudCwgY29tcG9uZW50IH07CisgICAgICBpcl9zd2l6emxlKiBzd2l6emxlID0gbmV3KHNoYWRlcikgaXJfc3dpenpsZSh2ZWN0b3IsIGNvbXBvbmVudHMsIDEpOworICAgICAgYWRkSVJJbnN0cnVjdGlvbihsbHZtSW5zdCwgc3dpenpsZSk7CisgICB9IGVsc2UgeworICAgICAgZW1pdE9wPDI+KGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0LCBsbHZtSW5zdCk7CisgICB9Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRW1pdCBJUiBzZWxlY3QgKHRlcm5hcnkgb3ApCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJTZWxlY3QoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0KQoreworICAgY29uc3QgZ2xzbF90eXBlICpoaXJUeXBlID0gbGx2bVR5cGVUb0hpclR5cGUobGx2bUluc3QtPmdldFR5cGUoKSwgMCwgbGx2bUluc3QpOworICAgaXJfcnZhbHVlKiBvcFszXTsKKworICAgb3BbMF0gPSBnZXRJUlZhbHVlKGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApKTsKKyAgIG9wWzFdID0gZ2V0SVJWYWx1ZShsbHZtSW5zdC0+Z2V0T3BlcmFuZCgxKSk7CisgICBvcFsyXSA9IGdldElSVmFsdWUobGx2bUluc3QtPmdldE9wZXJhbmQoMikpOworCisgICBpcl9ydmFsdWUqIHJlc3VsdDsKKworICAgLy8gSElSIGNhbid0IHN3aXRjaCBhcnJheXMsIGV0YywgZnJvbSBhIHNpbmdsZSBib29sZWFuLiAgQ3JlYXRlCisgICAvLyBpZi9lbHNlL2VuZGlmIGluIHRoYXQgY2FzZS4KKyAgIGlmIChvcFsxXS0+dHlwZS0+aXNfYXJyYXkoKSB8fCBvcFsxXS0+dHlwZS0+aXNfbWF0cml4KCkgfHxvcFsxXS0+dHlwZS0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIHJlc3VsdCA9IG5ld0lSVmFyaWFibGVEZXJlZihoaXJUeXBlLCBuZXdOYW1lKGxsdm1JbnN0KSwgaXJfdmFyX2F1dG8pOworCisgICAgICBhZGRJZihvcFswXSk7IHsKKyAgICAgICAgIGFkZElSSW5zdHJ1Y3Rpb24obmV3KHNoYWRlcikgaXJfYXNzaWdubWVudChyZXN1bHQsIG9wWzFdKSk7CisgICAgICB9IGFkZEVsc2UoKTsgeworICAgICAgICAgYWRkSVJJbnN0cnVjdGlvbihuZXcoc2hhZGVyKSBpcl9hc3NpZ25tZW50KHJlc3VsdC0+Y2xvbmUoc2hhZGVyLCAwKSwgb3BbMl0pKTsKKyAgICAgIH0gYWRkRW5kaWYoKTsKKyAgIH0gZWxzZSB7CisgICAgICAvLyBISVIgd2FudHMgdGhlIGNvbmRpdGlvbiB0byBiZSBhIHZlY3RvciBvZiBzaXplIG9mIGVsZW1lbnQsIHNvIHdlIG11c3QKKyAgICAgIC8vIGluc2VydCBhIGJyb2FkY2FzdCBzd2l6emxlIGlmIG5lZWQgYmUuCisgICAgICBpZiAob3BbMV0tPnR5cGUtPmlzX3ZlY3RvcigpICYmICFvcFswXS0+dHlwZS0+aXNfdmVjdG9yKCkpCisgICAgICAgICBvcFswXSA9IG5ldyhzaGFkZXIpIGlyX3N3aXp6bGUob3BbMF0sIDAsIDAsIDAsIDAsIG9wWzFdLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworCisgICAgICByZXN1bHQgPSBnbGFzc190b19pcl9leHByZXNzaW9uKGlyX3RyaW9wX2NzZWwsIGhpclR5cGUsIG9wWzBdLCBvcFsxXSwgb3BbMl0pOworICAgfQorICAgCisgICBhc3NlcnQocmVzdWx0ICYmIG9wWzBdICYmIG9wWzFdICYmIG9wWzJdKTsKKworICAgYWRkSVJJbnN0cnVjdGlvbihsbHZtSW5zdCwgcmVzdWx0KTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGaXggSVIgTHZhbHVlcworICogV2hlbiBzZWVpbmcgYSBHRVAgY2hhaW4sIHdlIGRvbid0IHlldCBrbm93IHdoZXRoZXIgaXQgd2lsbCBiZSBmb3IgYW4KKyAqIExWYWx1ZSBvciBSVmFsdWUgcmVmZXJlbmNlLiAgTW9zdGx5IHRoZSBISVIgaXMgdGhlIHNhbWUgZm9yIGJvdGgsIHNvCisgKiB0aGlzIHdvcmtzIG91dCwgYnV0IGZvciB2ZWN0b3IgY29tcG9uZW50IHJlZmVyZW5jZXMsIHdlIG11c3QgcHJvZHVjZQorICogZGlmZmVyZW50IEhJUi4gIFRoaXMgY2hhbmdlIGFkZHMgc3VwcG9ydCBmb3IgZG9pbmcgdGhhdCBieSBjb252ZXJ0aW5nCisgKiB0aGUgUi12YWx1ZSBmb3JtIHRvIHRoZSBMLXZhbHVlIGZvcm0sIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBndWVzcworICogYWJvdXQgaXQgZWFybGllciBpbiB0aW1lIHRoYW4gd2Ugc2VlIHRoZSB1c2UuICAoQWx0ZXJuYXRlbHksICB3ZSBjb3VsZAorICogYW5hbHl6ZSB0aGUgc2l0dWF0aW9uIGluIGEgcHJlLXBhc3MpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaXJfaW5zdHJ1Y3Rpb24qIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmZpeElSTFZhbHVlKGlyX3J2YWx1ZSogbGhzLCBpcl9ydmFsdWUqIHJocykKK3sKKyAgIC8vIGNvbnZlcnQ6CisgICAvLyAgKGFzc2lnbiAodmVjdG9yX2V4dHJhY3QgdmVjIGNvbXApIGVsZW1lbnRWYWwpCisgICAvLyB0bzsKKyAgIC8vICAoYXNzaWduIHZlYyAodmVjdG9yX2luc2VydCB2ZWMgZWxlbWVudHZhbCBjb21wKSkKKyAgIC8vIFRPRE86IFNvbWV0aW1lcyB3ZSBtaWdodCBub3QgbmVlZCB0aGUgYXNzaWduCisKKyAgIGlmIChpcl9leHByZXNzaW9uKiBsdmFsID0gbGhzLT5hc19leHByZXNzaW9uKCkpIHsKKyAgICAgIGlmIChsdmFsLT5vcGVyYXRpb24gPT0gaXJfYmlub3BfdmVjdG9yX2V4dHJhY3QpIHsKKyAgICAgICAgIGlyX2V4cHJlc3Npb24qIHZlY0lucyA9CisgICAgICAgICAgICBnbGFzc190b19pcl9leHByZXNzaW9uKGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2YWwtPm9wZXJhbmRzWzBdLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdmFsLT5vcGVyYW5kc1swXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZhbC0+b3BlcmFuZHNbMV0pOworCisgICAgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfYXNzaWdubWVudChsdmFsLT5vcGVyYW5kc1swXS0+Y2xvbmUoc2hhZGVyLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY0lucyk7CisgICAgICB9CisgICB9CisKKyAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIG5vcm1hbCBhc3NpZ25tZW50CisgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfYXNzaWdubWVudChsaHMsIHJocyk7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9hZCwgcG90ZW50aWFsbHkgZnJvbSBHRVAgY2hhaW4gb2Zmc2V0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJMb2FkKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBsbHZtSW5zdCkKK3sKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIG1ha2VJUkxvYWQobGx2bUluc3QpKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCaW5kaW5nIGlzIHR3byBjb21iaW5lZCAxNi1iaXQgbnVtYmVycywgb25lIGZvciBzZXQsIG9uZSBmb3IgYmluZGluZworICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBhbmQgcmV0dXJucyBlYWNoIG9mIHRoZW0uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjp1blBhY2tTZXRBbmRCaW5kaW5nKGNvbnN0IGludCBiaW5kaW5nSW4sIGludCYgc2V0LCBpbnQmIGJpbmRpbmdPdXQpCit7CisgICAgLy8gTG9naWMgbWlycm9yZWQgZnJvbSBMdW5hckdMQVNTIEdMU0wgYmFja2VuZAorICAgIHNldCA9ICh1bnNpZ25lZCkgYmluZGluZ0luID4+IDE2OworICAgIGJpbmRpbmdPdXQgPSBiaW5kaW5nSW4gJiAweEZGRkY7CisKKyAgICAvLyBVbmJpYXMgc2V0LCB3aGljaCB3YXMgYmlhc2VkIGJ5IDEgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAic2V0PTAiIGFuZCBub3RoaW5nLgorICAgIGJvb2wgc2V0UHJlc2VudCA9IChzZXQgIT0gMCk7CisgICAgaWYgKHNldFByZXNlbnQpCisgICAgICAgIC0tc2V0OworfQorCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZXQgSU8gdmFyaWFibGUgcGFyYW1ldGVycyAobG9jYXRpb25zLCBpbnRlcnAgbW9kZXMsIHBpeGVsIG9yaWdpbnMsIGV0YykKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6c2V0SW9QYXJhbWV0ZXJzKGlyX3ZhcmlhYmxlKiBpb1ZhciwgY29uc3QgbGx2bTo6TUROb2RlKiBtZE5vZGUpCit7CisgICBpZiAoaW9WYXIgJiYgbWROb2RlKSB7CisgICAgICBjb25zdCBsbHZtOjpUeXBlKiAgIG1kVHlwZSA9IDA7CisgICAgICBNZXRhVHlwZSBtZXRhVHlwZTsKKworICAgICAgLy8gR2xlYW4gaW5mb3JtYXRpb24gZnJvbSBtZXRhZGF0YSBmb3IgaW50cmluc2ljCisgICAgICBkZWNvZGVNZFR5cGVzRW1pdE1kUXVhbGlmaWVycyh0cnVlLCBtZE5vZGUsIG1kVHlwZSwgZmFsc2UsIG1ldGFUeXBlKTsKKworICAgICAgLy8gaW9WYXItPmRhdGEuaW5kZXggICAgICAgICA9IHNsb3RPZmZzZXQ7CisgICAgICBpb1Zhci0+ZGF0YS51c2VkID0gdHJ1ZTsKKyAgICAgIGlvVmFyLT5kYXRhLm9yaWdpbl91cHBlcl9sZWZ0ICAgID0gc3RhdGUtPmZzX29yaWdpbl91cHBlcl9sZWZ0OworICAgICAgaW9WYXItPmRhdGEucGl4ZWxfY2VudGVyX2ludGVnZXIgPSBzdGF0ZS0+ZnNfcGl4ZWxfY2VudGVyX2ludGVnZXI7CisKKyAgICAgIGlmIChtZXRhVHlwZS5ibG9jayB8fCBtZXRhVHlwZS5tZFNhbXBsZXIgIT0gMCkgeworICAgICAgICAgIGlmIChtZXRhVHlwZS5iaW5kaW5nICE9IC0xKSB7CisgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzYW1wbGVyIG9yIGEgYmxvY2ssIHdlIG5lZWQgYSBiaW5kaW5nCisgICAgICAgICAgICAgIGlvVmFyLT5kYXRhLmV4cGxpY2l0X2JpbmRpbmcgID0gdHJ1ZTsKKyAgICAgICAgICAgICAgLy8gTm90ZTogRm9yIHNhbXBsZXIgYW5kIFVCTyBiaW5kaW5ncywgbG9jYXRpb24gaXMgbm93IHR3byAxNi1iaXQKKyAgICAgICAgICAgICAgLy8gdmFsdWVzIGNvbWJpbmVkLCBwYXNzIHRoZSB3aG9sZSB0aGluZyEKKyAgICAgICAgICAgICAgaW9WYXItPmRhdGEuYmluZGluZyAgICAgICAgICAgPSBtZXRhVHlwZS5iaW5kaW5nOworICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IGxvY2F0aW9uID0gbWV0YVR5cGUubG9jYXRpb247CisgICAgICAgICAgaWYgKGxvY2F0aW9uID49IDAgJiYgbG9jYXRpb24gPCBnbGE6Ok1heFVzZXJMYXlvdXRMb2NhdGlvbikgeworICAgICAgICAgICAgICBpb1Zhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbiA9IHRydWU7CisKKyAgICAgICAgICAgICAgaWYgKChtYW5hZ2VyLT5nZXRTdGFnZSgpID09IEVTaExhbmdGcmFnbWVudCkgJiYgbWV0YVR5cGUucXVhbGlmaWVyID09IEVWUU91dHB1dCkKKyAgICAgICAgICAgICAgICAgIGlvVmFyLT5kYXRhLmxvY2F0aW9uICAgICAgPSBsb2NhdGlvbiArIEZSQUdfUkVTVUxUX0RBVEEwOworICAgICAgICAgICAgICBlbHNlIGlmICgobWFuYWdlci0+Z2V0U3RhZ2UoKSA9PSBFU2hMYW5nVmVydGV4KSAmJiBtZXRhVHlwZS5xdWFsaWZpZXIgPT0gRVZRSW5wdXQpCisgICAgICAgICAgICAgICAgICBpb1Zhci0+ZGF0YS5sb2NhdGlvbiAgICAgID0gbG9jYXRpb24gKyBWRVJUX0FUVFJJQl9HRU5FUklDMDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgaW9WYXItPmRhdGEubG9jYXRpb24gICAgICA9IGxvY2F0aW9uICsgVkFSWUlOR19TTE9UX1ZBUjA7CisgICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0b3JlLCBwb3RlbnRpYWxseSB0byBHRVAgY2hhaW4gb2Zmc2V0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJTdG9yZShjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QpCit7CisgICBjb25zdCBsbHZtOjpWYWx1ZSogICAgICAgICAgICAgc3JjICAgICA9IGxsdm1JbnN0LT5nZXRPcGVyYW5kKDApOworICAgY29uc3QgbGx2bTo6VmFsdWUqICAgICAgICAgICAgIGRzdCAgICAgPSBsbHZtSW5zdC0+Z2V0T3BlcmFuZCgxKTsKKyAgIGNvbnN0IGxsdm06OkdldEVsZW1lbnRQdHJJbnN0KiBnZXBJbnN0ID0gZ2V0R2VwQXNJbnN0KGRzdCk7CisgICBjb25zdCBsbHZtOjpNRE5vZGUqICAgICAgICAgICAgbWROb2RlOworICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgICAgIG5hbWU7CisKKyAgIGlmIChnZXBJbnN0KQorICAgICAgbmFtZSA9IGdlcEluc3QtPmdldE9wZXJhbmQoMCktPmdldE5hbWUoKTsKKyAgIGVsc2UgCisgICAgICBuYW1lID0gbGx2bUluc3QtPmdldE9wZXJhbmQoMSktPmdldE5hbWUoKTsKKworICAgLy8gTG9vayBmb3IgYnVpbHRpbgorICAgdE5hbWVCdWlsdGluTWFwOjpjb25zdF9pdGVyYXRvciBnb3QgPSBuYW1lQnVpbHRpbk1hcC5maW5kKG5hbWUpOworICAgaWYgKGdvdCAhPSBuYW1lQnVpbHRpbk1hcC5lbmQoKSkKKyAgICAgICBuYW1lID0gZ290LT5zZWNvbmQ7CisKKyAgIG1kTm9kZSA9IG5hbWUuZW1wdHkoKSA/IDAgOiB0eXBlbmFtZU1kTWFwW25hbWVdOworCisgICBhc3NlcnQobGx2bTo6aXNhPGxsdm06OlBvaW50ZXJUeXBlPihkc3QtPmdldFR5cGUoKSkpOworCisgICBpcl9ydmFsdWUqIGlyRHN0OworICAgaXJfdmFyaWFibGUqIGlvVmFyID0gMDsKKyAgIGlyX3J2YWx1ZSogYWdncmVnYXRlID0gMDsKKworICAgaWYgKGdlcEluc3QpIHsKKyAgICAgIGNvbnN0IGxsdm06Ok1ETm9kZSogbWROb2RlOworICAgICAgY29uc3QgbGx2bTo6VHlwZSogICBtZFR5cGU7CisgICAgICBjb25zdCBsbHZtOjpUeXBlKiAgIG1kQWdncmVnYXRlVHlwZTsKKworICAgICAgRmluZEdlcFR5cGUoZ2VwSW5zdCwgbWRUeXBlLCBtZEFnZ3JlZ2F0ZVR5cGUsIG1kTm9kZSk7CisKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSogaXJUeXBlID0gbGx2bVR5cGVUb0hpclR5cGUobWRUeXBlLCBtZE5vZGUsIGxsdm1JbnN0KTsKKworICAgICAgY29uc3QgbGx2bTo6VmFsdWUqIGdlcFNyYyA9IGdlcEluc3QtPmdldFBvaW50ZXJPcGVyYW5kKCk7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHdyaXRlIHRvIHRoaXMgYWdncmVnYXRlLCBtYWtlIHVwIGEgbmV3IG9uZS4KKyAgICAgIGNvbnN0IHRWYWx1ZU1hcDo6Y29uc3RfaXRlcmF0b3IgbG9jYXRpb24gPSB2YWx1ZU1hcC5maW5kKGdlcFNyYyk7CisgICAgICBpZiAobG9jYXRpb24gPT0gdmFsdWVNYXAuZW5kKCkpIHsKKworICAgICAgICAgaWYgKGdlcFNyYykgeworICAgICAgICAgICAgbmFtZSA9IGdlcEluc3QtPmdldFBvaW50ZXJPcGVyYW5kKCktPmdldE5hbWUoKTsKKworICAgICAgICAgICAgLy8gTG9vayBmb3IgYnVpbHRpbgorICAgICAgICAgICAgdE5hbWVCdWlsdGluTWFwOjpjb25zdF9pdGVyYXRvciBnb3QgPSBuYW1lQnVpbHRpbk1hcC5maW5kKG5hbWUpOworICAgICAgICAgICAgaWYgKGdvdCAhPSBuYW1lQnVpbHRpbk1hcC5lbmQoKSkKKyAgICAgICAgICAgICAgICBuYW1lID0gZ290LT5zZWNvbmQ7CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlX21vZGUgaXJNb2RlID0gaXJfdmFyaWFibGVfbW9kZShnbG9iYWxWYXJNb2RlTWFwW25hbWVdKTsKKworICAgICAgICAgaXJEc3QgPSBuZXdJUlZhcmlhYmxlRGVyZWYoaXJUeXBlLCBuYW1lLCBpck1vZGUpOworCisgICAgICAgICB2YWx1ZU1hcC5pbnNlcnQodFZhbHVlTWFwOjp2YWx1ZV90eXBlKGdlcFNyYywgaXJEc3QpKS5maXJzdDsKKyAgICAgIH0KKworICAgICAgYWdncmVnYXRlID0gZ2V0SVJWYWx1ZShnZXBTcmMpOworICAgICAgaXJEc3QgPSB0cmF2ZXJzZUdFUChnZXBJbnN0LCBhZ2dyZWdhdGUsIDApOworCisgICB9IGVsc2UgaWYgKGxsdm06OmlzYTxsbHZtOjpJbnN0cnVjdGlvbj4oZHN0KSkgeyAvLyB0ZW1wb3JhcnkgcG9pbnRlciBjYW4ganVzdCBiZSB1c2VkIGRpcmVjdGx5CisgICAgICBpckRzdCA9IGdldElSVmFsdWUoZHN0KTsKKworICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSogaXJUeXBlID0gbGx2bVR5cGVUb0hpclR5cGUoZHN0LT5nZXRUeXBlKCktPmdldENvbnRhaW5lZFR5cGUoMCksIDAsIGxsdm1JbnN0KTsKKworICAgICAgLy8gbGx2bTo6U3RyaW5nUmVmIG5hbWUgPSBkc3QtPmdldE5hbWUoKTsKKyAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlX21vZGUgaXJNb2RlID0gaXJfdmFyaWFibGVfbW9kZShnbG9iYWxWYXJNb2RlTWFwW25hbWVdKTsKKworICAgICAgaXJEc3QgPSBuZXdJUlZhcmlhYmxlRGVyZWYoaXJUeXBlLCBuYW1lLCBpck1vZGUpOworICAgfQorCisgICBpZiAoaXJEc3QtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCkpIHsKKyAgICAgIGlvVmFyID0gaXJEc3QtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCktPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIH0gZWxzZSBpZiAoYWdncmVnYXRlKSB7CisgICAgICBpb1ZhciA9IGFnZ3JlZ2F0ZS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKS0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworICAgfQorCisgICBzZXRJb1BhcmFtZXRlcnMoaW9WYXIsIG1kTm9kZSk7CisKKyAgIGFkZElSSW5zdHJ1Y3Rpb24obGx2bUluc3QsIGZpeElSTFZhbHVlKGlyRHN0LCBnZXRJUlZhbHVlKHNyYykpKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWZWN0b3IgY29tcG9uZW50IGluc2VydGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW5saW5lIHZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6ZW1pdElSSW5zZXJ0RWxlbWVudChjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QpCit7CisgICAvLyBpcl90cmlwb3BfdmVjdG9yX2luc2VydAorICAgYXNzZXJ0KDAgJiYgIlRPRE86IGhhbmRsZSBpbnNlcnRFbGVtZW50Iik7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRyYXZlcnNlIG9uZSBzdGVwIG9mIGEgZGVyZWZlcmVuY2UgY2hhaW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lyX3J2YWx1ZSogTWVzYUdsYXNzVHJhbnNsYXRvcjo6ZGVyZWZlcmVuY2VHZXAoY29uc3QgbGx2bTo6VHlwZSomIHR5cGUsIGlyX3J2YWx1ZSogYWdncmVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSogb3BlcmFuZCwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpNRE5vZGUqJiBtZEFnZ3JlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1kVHlwZUxheW91dCogbWRUeXBlTGF5b3V0KQoreworICAgaWYgKG9wZXJhbmQpIHsKKyAgICAgIGlmIChsbHZtOjppc2E8Y29uc3QgbGx2bTo6Q29uc3RhbnRJbnQ+KG9wZXJhbmQpKQorICAgICAgICAgaW5kZXggPSBHZXRDb25zdGFudEludChvcGVyYW5kKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGluZGV4ID0gLTE7CisgICB9CisKKyAgIHN3aXRjaCAodHlwZS0+Z2V0VHlwZUlEKCkpIHsKKyAgIGNhc2UgbGx2bTo6VHlwZTo6U3RydWN0VHlJRDoKKyAgIGNhc2UgbGx2bTo6VHlwZTo6QXJyYXlUeUlEOgorICAgY2FzZSBsbHZtOjpUeXBlOjpWZWN0b3JUeUlEOgorICAgICAgaWYgKGFnZ3JlZ2F0ZS0+dHlwZS0+aXNfYXJyYXkoKSB8fCBhZ2dyZWdhdGUtPnR5cGUtPmlzX21hdHJpeCgpKSB7CisgICAgICAgICBpcl9ydmFsdWUqIGluZGV4VmFsOworCisgICAgICAgICBpZiAoaW5kZXggPCAwKSB7IC8vIEluZGlyZWN0IGluZGV4aW5nCisgICAgICAgICAgICBpbmRleFZhbCA9IGdldElSVmFsdWUob3BlcmFuZCk7CisgICAgICAgICAgICB0cmFja01heEFycmF5RWxlbWVudChhZ2dyZWdhdGUsIC0xKTsKKyAgICAgICAgIH0gZWxzZSB7IC8vIERpcmVjdCBpbmRleGluZworICAgICAgICAgICAgaW5kZXhWYWwgPSBuZXcoc2hhZGVyKSBpcl9jb25zdGFudChpbmRleCk7CisgICAgICAgICAgICB0cmFja01heEFycmF5RWxlbWVudChhZ2dyZWdhdGUsIGluZGV4KTsKKyAgICAgICAgIH0KKworICAgICAgICAgdHlwZSA9IHR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7CisKKyAgICAgICAgIHJldHVybiBuZXcoc2hhZGVyKSBpcl9kZXJlZmVyZW5jZV9hcnJheShhZ2dyZWdhdGUsIGluZGV4VmFsKTsKKyAgICAgIH0gZWxzZSBpZiAoYWdncmVnYXRlLT50eXBlLT5pc192ZWN0b3IoKSkgeworICAgICAgICAgdHlwZSA9IHR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7CisKKyAgICAgICAgIHJldHVybiBnbGFzc190b19pcl9leHByZXNzaW9uKGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bVR5cGVUb0hpclR5cGUodHlwZSksIGFnZ3JlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElSVmFsdWUob3BlcmFuZCkpOworICAgICAgfSBlbHNlIGlmIChhZ2dyZWdhdGUtPnR5cGUtPmlzX3JlY29yZCgpIHx8CisgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZS0+dHlwZS0+aXNfaW50ZXJmYWNlKCkpIHsKKyAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIGVycm9yKCJub24tY29uc3RhbnQgaW5kZXggaW4gc3RydWN0dXJlIGRlcmVmZXJlbmNlIik7CisgICAgICAgICAgICAvLyBPbiBlcnJvciwganVzdCBzZWxlY3QgdGhlIGZpcnN0IGZpZWxkLCBzaW5jZSB3ZSBjYW4ndCBrbm93IHdoYXQgd2FzIHJlYWxseSBtZWFudC4KKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkX25hbWUgPSByYWxsb2Nfc3RyZHVwKHNoYWRlciwgYWdncmVnYXRlLT50eXBlLT5maWVsZHMuc3RydWN0dXJlWzBdLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyhzaGFkZXIpIGlyX2RlcmVmZXJlbmNlX3JlY29yZChhZ2dyZWdhdGUsIGZpZWxkX25hbWUpOworICAgICAgICAgfQorCisgICAgICAgICB0eXBlID0gdHlwZS0+Z2V0Q29udGFpbmVkVHlwZShpbmRleCk7CisKKyAgICAgICAgIC8vIERlZmVyZW5jZSB0aGUgbWV0YWRhdGEgYWdncmVnYXRlIAorICAgICAgICAgaWYgKG1kQWdncmVnYXRlKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYWdnT3AgPSBHZXRBZ2dyZWdhdGVNZFN1YkFnZ3JlZ2F0ZU9wKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbnQobWRBZ2dyZWdhdGUtPmdldE51bU9wZXJhbmRzKCkpIDw9IGFnZ09wKSB7CisgICAgICAgICAgICAgICBlcnJvcigiYmFkIE1EIGFnZ3JlZ2F0ZSBpbmRleCIpOworICAgICAgICAgICAgICAgbWRBZ2dyZWdhdGUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIG1kQWdncmVnYXRlID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6TUROb2RlPihtZEFnZ3JlZ2F0ZS0+Z2V0T3BlcmFuZChhZ2dPcCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWRBZ2dyZWdhdGUgJiYgbWRUeXBlTGF5b3V0KQorICAgICAgICAgICAgICAgKm1kVHlwZUxheW91dCA9IEdldE1kVHlwZUxheW91dChtZEFnZ3JlZ2F0ZSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChhZ2dyZWdhdGUtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIGlyX3ZhcmlhYmxlKiB2YXIgPSBhZ2dyZWdhdGUtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCktPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gaW50ZXJmYWNlIGJsb2NrIG1lbWJlcnMgYXJlIGhvaXN0ZWQgdG8gZ2xvYmFsIHNjb3BlIGluIEhJUgorICAgICAgICAgICAgaWYgKGFub25CbG9ja3MuZmluZCh2YXItPm5hbWUpICE9IGFub25CbG9ja3MuZW5kKCkpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBuZXdJUlZhcmlhYmxlRGVyZWYoYWdncmVnYXRlLT50eXBlLT5maWVsZHMuc3RydWN0dXJlW2luZGV4XS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtPnR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaW5kZXhdLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlX21vZGUoZ2xvYmFsVmFyTW9kZU1hcFt2YXItPm5hbWVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkX25hbWUgPSByYWxsb2Nfc3RyZHVwKHNoYWRlciwgYWdncmVnYXRlLT50eXBlLT5maWVsZHMuc3RydWN0dXJlW2luZGV4XS5uYW1lKTsKKworICAgICAgICAgLy8gaW50ZXJmYWNlIGJsb2NrIG1lbWJlcnMgYXJlIGhvaXN0ZWQgdG8gZ2xvYmFsIHNjb3BlIGluIEhJUgorICAgICAgICAgaWYgKGFub25CbG9ja3MuZmluZChhZ2dyZWdhdGUtPnR5cGUtPm5hbWUpICE9IGFub25CbG9ja3MuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlX21vZGUgaXJNb2RlID0gaXJfdmFyaWFibGVfbW9kZShnbG9iYWxWYXJNb2RlTWFwW2FnZ3JlZ2F0ZS0+dHlwZS0+bmFtZV0pOworICAgICAgICAgICAgcmV0dXJuIG5ld0lSVmFyaWFibGVEZXJlZihsbHZtVHlwZVRvSGlyVHlwZSh0eXBlKSwgZmllbGRfbmFtZSwgaXJNb2RlKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3KHNoYWRlcikgaXJfZGVyZWZlcmVuY2VfcmVjb3JkKGFnZ3JlZ2F0ZSwgZmllbGRfbmFtZSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gZXJyb3IgY2FzZSBpZiBpdCB3YXNuJ3QgYW4gYXJyYXkgb3IgYSBzdHJ1Y3QKKworICAgZGVmYXVsdDoKKyAgICAgIGVycm9yKCJ1bmV4cGVjdGVkIHR5cGUgaW4gR0VQIik7CisgICAgICByZXR1cm4gbmV3SVJWYXJpYWJsZURlcmVmKGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9GTE9BVCwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcnZhbCIsIGlyX3Zhcl9hdXRvKTsKKyAgIH0KK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUcmF2ZXJzZSBHRVAgaW5zdHJ1Y3Rpb24gY2hhaW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworaW5saW5lIHZvaWQgTWVzYUdsYXNzVHJhbnNsYXRvcjo6RmluZEdlcFR5cGUoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qIGxsdm1JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHlwZSomIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiYgYWdncmVnYXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Ok1ETm9kZSomIG1kTm9kZSkKK3sKKyAgIGFnZ3JlZ2F0ZVR5cGUgPSB0eXBlID0gbGx2bUluc3QtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKworICAgd2hpbGUgKHR5cGUtPmdldFR5cGVJRCgpID09IGxsdm06OlR5cGU6OlBvaW50ZXJUeUlEKQorICAgICAgdHlwZSA9IHR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7CisKKyAgIHdoaWxlIChhZ2dyZWdhdGVUeXBlLT5nZXRUeXBlSUQoKSA9PSBsbHZtOjpUeXBlOjpQb2ludGVyVHlJRCB8fCBhZ2dyZWdhdGVUeXBlLT5nZXRUeXBlSUQoKSA9PSBsbHZtOjpUeXBlOjpBcnJheVR5SUQpCisgICAgICBhZ2dyZWdhdGVUeXBlID0gYWdncmVnYXRlVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKKyAgIAorICAgYXV0byBpdCA9IHR5cGVNZEFnZ3JlZ2F0ZU1hcC5maW5kKGFnZ3JlZ2F0ZVR5cGUpOworICAgbWROb2RlID0gKGl0ID09IHR5cGVNZEFnZ3JlZ2F0ZU1hcC5lbmQoKSkgPyAwIDogaXQtPnNlY29uZDsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUcmF2ZXJzZSBHRVAgaW5zdHJ1Y3Rpb24gY2hhaW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSBpcl9ydmFsdWUqIE1lc2FHbGFzc1RyYW5zbGF0b3I6OnRyYXZlcnNlR0VQKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBsbHZtSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSogYWdncmVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1kVHlwZUxheW91dCogbWRUeXBlTGF5b3V0KQoreworICAgLy8gKioqIEZ1bmN0aW9uIGJvcnJvd2VkIGZyb20gTHVuYXJHbGFzcyBHTFNMIGJhY2tlbmQsIG1vZGlmaWVkIHNsaWdodGx5ICoqKgorICAgY29uc3QgbGx2bTo6TUROb2RlKiBtZEFnZ3JlZ2F0ZTsKKyAgIGNvbnN0IGxsdm06OlR5cGUqICAgbWRUeXBlOworICAgY29uc3QgbGx2bTo6VHlwZSogICBtZEFnZ3JlZ2F0ZVR5cGU7CisKKyAgIEZpbmRHZXBUeXBlKGxsdm1JbnN0LCBtZFR5cGUsIG1kQWdncmVnYXRlVHlwZSwgbWRBZ2dyZWdhdGUpOworCisgICAvLyBSZWdpc3RlciB0eXBlIGluIHRoZSB0eXBlIG1hcDoKKyAgIGNvbnN0IGxsdm06OlN0cnVjdFR5cGUqIHN0cnVjdFR5cGUgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpTdHJ1Y3RUeXBlPihtZEFnZ3JlZ2F0ZVR5cGUpOworICAgaWYgKHN0cnVjdFR5cGUpIHsKKyAgICAgIGNvbnN0IGxsdm06OlN0cmluZ1JlZiBzdHJ1Y3ROYW1lID0gc3RydWN0VHlwZS0+aXNMaXRlcmFsKCkgPyAiIiA6IHN0cnVjdFR5cGUtPmdldE5hbWUoKTsKKyAgICAgIHR5cGVuYW1lTWRNYXBbc3RydWN0TmFtZV0gPSBtZEFnZ3JlZ2F0ZTsKKyAgIH0KKworICAgaWYgKGNvbnN0IGxsdm06OkdldEVsZW1lbnRQdHJJbnN0KiBnZXBJbnN0ID0gZ2V0R2VwQXNJbnN0KGxsdm1JbnN0KSkgeworICAgICAgLy8gU3RhcnQgYXQgb3BlcmFuZCAyIHNpbmNlIGluZGljZXMgMCBhbmQgMSBnaXZlIHlvdSB0aGUgYmFzZSBhbmQgYXJlIGhhbmRsZWQgYmVmb3JlIHRyYXZlcnNlR2VwCisgICAgICBjb25zdCBsbHZtOjpUeXBlKiBnZXBUeXBlID0gZ2VwSW5zdC0+Z2V0UG9pbnRlck9wZXJhbmRUeXBlKCktPmdldENvbnRhaW5lZFR5cGUoMCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBvcCA9IDI7IG9wIDwgZ2VwSW5zdC0+Z2V0TnVtT3BlcmFuZHMoKTsgKytvcCkKKyAgICAgICAgIGFnZ3JlZ2F0ZSA9IGRlcmVmZXJlbmNlR2VwKGdlcFR5cGUsIGFnZ3JlZ2F0ZSwgZ2VwSW5zdC0+Z2V0T3BlcmFuZChvcCksIC0xLCBtZEFnZ3JlZ2F0ZSwgbWRUeXBlTGF5b3V0KTsKKworICAgfSBlbHNlIGlmIChjb25zdCBsbHZtOjpJbnNlcnRWYWx1ZUluc3QqIGluc2VydFZhbHVlSW5zdCA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06Okluc2VydFZhbHVlSW5zdD4obGx2bUluc3QpKSB7CisgICAgICBjb25zdCBsbHZtOjpUeXBlKiBnZXBUeXBlID0gaW5zZXJ0VmFsdWVJbnN0LT5nZXRBZ2dyZWdhdGVPcGVyYW5kKCktPmdldFR5cGUoKTsgICAgICAgICAgICAKKyAgICAgIGZvciAobGx2bTo6SW5zZXJ0VmFsdWVJbnN0OjppZHhfaXRlcmF0b3IgaXRlciA9IGluc2VydFZhbHVlSW5zdC0+aWR4X2JlZ2luKCksIGVuZCA9IGluc2VydFZhbHVlSW5zdC0+aWR4X2VuZCgpOworICAgICAgICAgICBpdGVyICE9IGVuZDsgKytpdGVyKQorICAgICAgICAgYWdncmVnYXRlID0gZGVyZWZlcmVuY2VHZXAoZ2VwVHlwZSwgYWdncmVnYXRlLCAwLCAqaXRlciwgbWRBZ2dyZWdhdGUpOworCisgICB9IGVsc2UgaWYgKGNvbnN0IGxsdm06OkV4dHJhY3RWYWx1ZUluc3QqIGV4dHJhY3RWYWx1ZUluc3QgPSBsbHZtOjpkeW5fY2FzdDxjb25zdCBsbHZtOjpFeHRyYWN0VmFsdWVJbnN0PihsbHZtSW5zdCkpIHsKKyAgICAgIGNvbnN0IGxsdm06OlR5cGUqIGdlcFR5cGUgPSBleHRyYWN0VmFsdWVJbnN0LT5nZXRBZ2dyZWdhdGVPcGVyYW5kKCktPmdldFR5cGUoKTsgIAorICAgICAgZm9yIChsbHZtOjpFeHRyYWN0VmFsdWVJbnN0OjppZHhfaXRlcmF0b3IgaXRlciA9IGV4dHJhY3RWYWx1ZUluc3QtPmlkeF9iZWdpbigpLCBlbmQgPSBleHRyYWN0VmFsdWVJbnN0LT5pZHhfZW5kKCk7CisgICAgICAgICAgIGl0ZXIgIT0gZW5kOyArK2l0ZXIpCisgICAgICAgICBhZ2dyZWdhdGUgPSBkZXJlZmVyZW5jZUdlcChnZXBUeXBlLCBhZ2dyZWdhdGUsIDAsICppdGVyLCBtZEFnZ3JlZ2F0ZSk7CisKKyAgIH0gZWxzZSB7CisgICAgICBlcnJvcigibm9uLUdFUCBpbiB0cmF2ZXJzZUdFUCIpOworICAgICAgcmV0dXJuIG5ld0lSVmFyaWFibGVEZXJlZihnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3J2YWwiLCBpcl92YXJfYXV0byk7CisgICB9CisKKyAgIHJldHVybiBhZ2dyZWdhdGU7Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQXJyYXkgY29tcG9uZW50IG9yIHN0cnVjdCBleHRyYWN0aW9uCisgKiAgIDxyZXN1bHQ+ID0gZXh0cmFjdHZhbHVlIDxhZ2dyZWdhdGUgdHlwZT4gPHZhbD4sIDxpZHg+eywgPGlkeD59KgorICogICAgICAoYXJyYXlfcmVmICh2YXJfcmVmIC4uLikgKGNvbnN0YW50IGludCAoMCkgKSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2lubGluZSB2b2lkIE1lc2FHbGFzc1RyYW5zbGF0b3I6OmVtaXRJUkV4dHJhY3RWYWx1ZShjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QpCit7CisgICBjb25zdCBsbHZtOjpFeHRyYWN0VmFsdWVJbnN0KiBleHRyYWN0VmFsdWVJbnN0ID0gbGx2bTo6ZHluX2Nhc3Q8Y29uc3QgbGx2bTo6RXh0cmFjdFZhbHVlSW5zdD4obGx2bUluc3QpOworICAgYXNzZXJ0KGxsdm1JbnN0KTsKKworICAgY29uc3QgbGx2bTo6VmFsdWUqIGFnZ3JlZ2F0ZSA9IGV4dHJhY3RWYWx1ZUluc3QtPmdldEFnZ3JlZ2F0ZU9wZXJhbmQoKTsKKyAgIGFzc2VydChhZ2dyZWdhdGUpOworCisgICBhZGRJUkluc3RydWN0aW9uKGxsdm1JbnN0LCB0cmF2ZXJzZUdFUChleHRyYWN0VmFsdWVJbnN0LCBnZXRJUlZhbHVlKGFnZ3JlZ2F0ZSksIDApKTsKK30KKworCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBcnJheSBjb21wb25lbnQgaW5zZXJ0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbmxpbmUgdm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjplbWl0SVJJbnNlcnRWYWx1ZShjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QpCit7CisgICBjb25zdCBsbHZtOjpJbnNlcnRWYWx1ZUluc3QqIGluc2VydFZhbHVlSW5zdCA9IGxsdm06OmR5bl9jYXN0PGNvbnN0IGxsdm06Okluc2VydFZhbHVlSW5zdD4obGx2bUluc3QpOworCisgICBpcl9ydmFsdWUqIGFnZ3JlZ2F0ZSAgPSBnZXRJUlZhbHVlKGluc2VydFZhbHVlSW5zdC0+Z2V0QWdncmVnYXRlT3BlcmFuZCgpKTsKKyAgIGlyX3J2YWx1ZSogZ2VwICAgICAgICA9IHRyYXZlcnNlR0VQKGluc2VydFZhbHVlSW5zdCwgYWdncmVnYXRlLCAwKTsKKyAgIGlyX3J2YWx1ZSogc3JjICAgICAgICA9IGdldElSVmFsdWUoaW5zZXJ0VmFsdWVJbnN0LT5nZXRJbnNlcnRlZFZhbHVlT3BlcmFuZCgpKTsKKyAgIGlyX2Fzc2lnbm1lbnQqIGFzc2lnbiA9IG5ldyhzaGFkZXIpIGlyX2Fzc2lnbm1lbnQoZ2VwLCBzcmMpOworCisgICBhZGRJUkluc3RydWN0aW9uKGFzc2lnbik7CisgICBhZGRJUkluc3RydWN0aW9uKGxsdm1JbnN0LCBhZ2dyZWdhdGUpOworfQorCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRyYW5zbGF0ZSBpbnN0cnVjdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBNZXNhR2xhc3NUcmFuc2xhdG9yOjphZGRJbnN0cnVjdGlvbihjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiogbGx2bUluc3QsIGJvb2wgbGFzdEJsb2NrLCBib29sIHJlZmVyZW5jZWRPdXRzaWRlU2NvcGUpCit7CisgICAgaWYgKHJlZmVyZW5jZWRPdXRzaWRlU2NvcGUpIHsKKyAgICAgICAvLyBlbWl0R2xhVmFsdWVEZWNsYXJhdGlvbihsbHZtSW5zdCwgcmVmZXJlbmNlZE91dHNpZGVTY29wZSk7CisgICAgfQorCisgICAgc3dpdGNoIChsbHZtSW5zdC0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpBZGQ6ICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6RkFkZDogICAgICAgICAgIHJldHVybiBlbWl0T3A8Mj4oaXJfYmlub3BfYWRkLCAgICAgbGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OlN1YjogICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guLi4KKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpGU3ViOiAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwyPihpcl9iaW5vcF9zdWIsICAgICBsbHZtSW5zdCk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6TXVsOiAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkZNdWw6ICAgICAgICAgICByZXR1cm4gZW1pdE9wPDI+KGlyX2Jpbm9wX211bCwgICAgIGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpVRGl2OiAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwyPihpcl9iaW5vcF9kaXYsICAgICBsbHZtSW5zdCwgdHJ1ZSwgdHJ1ZSAvKiBnZW5VbnNpZ25lZCAqLyk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6U0RpdjogICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkZEaXY6ICAgICAgICAgICByZXR1cm4gZW1pdE9wPDI+KGlyX2Jpbm9wX2RpdiwgICAgIGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpVUmVtOiAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwyPihpcl9iaW5vcF9tb2QsICAgICBsbHZtSW5zdCwgdHJ1ZSwgdHJ1ZSAvKiBnZW5VbnNpZ25lZCAqLyk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6U1JlbTogICAgICAgICAgIHJldHVybiBlbWl0T3A8Mj4oaXJfYmlub3BfbW9kLCAgICAgbGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkZSZW06ICAgICAgICAgICByZXR1cm4gZW1pdEZuKCJtb2QiLCBsbHZtSW5zdCk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6U2hsOiAgICAgICAgICAgIHJldHVybiBlbWl0T3A8Mj4oaXJfYmlub3BfbHNoaWZ0LCAgbGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkxTaHI6ICAgICAgICAgICByZXR1cm4gZW1pdE9wPDI+KGlyX2Jpbm9wX3JzaGlmdCwgIGxsdm1JbnN0LCB0cnVlIC8qIGdlblVuc2lnbmVkICovKTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpBU2hyOiAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwyPihpcl9iaW5vcF9yc2hpZnQsICBsbHZtSW5zdCk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6QW5kOiAgICAgICAgICAgIHJldHVybiBlbWl0T3BCaXQ8Mj4oaXJfYmlub3BfbG9naWNfYW5kLCBpcl9iaW5vcF9iaXRfYW5kLCBsbHZtSW5zdCk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6T3I6ICAgICAgICAgICAgIHJldHVybiBlbWl0T3BCaXQ8Mj4oaXJfYmlub3BfbG9naWNfb3IsICBpcl9iaW5vcF9iaXRfb3IsICBsbHZtSW5zdCk7CisgICAgLy8gVE9ETzogeG9yIG5lZWRzIGEgZGVkaWNhdGVkIGVtaXR0ZXIsIHRvIGhhbmRsZSBhbGwgdGhlIHN0dWZmCisgICAgLy8gTExWTSBkb2VzIHdpdGggaXQuICBMaWtlIHVuYXJ5IG5lZ2F0aW9uIGFuZCB3aGF0bm90LgorICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OlhvcjogICAgICAgICAgICByZXR1cm4gZW1pdE9wQml0PDI+KGlyX2Jpbm9wX2xvZ2ljX3hvciwgaXJfYmlub3BfYml0X3hvciwgbGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OklDbXA6ICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guLi4KKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpGQ21wOiAgICAgICAgICAgcmV0dXJuIGVtaXRDbXAobGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkZQVG9VSTogICAgICAgICByZXR1cm4gZW1pdE9wPDE+KGlyX3Vub3BfZjJ1LCAgICAgIGxsdm1JbnN0LCB0cnVlIC8qIGdlblVuc2lnbmVkICovKTsKKyAgICAvLyBUT0RPOiBmb3IgWkV4dCwgaWYgd2UgbmVlZCBtb3JlIHRoYW4gMSB0byAzMiBiaXQgY29udmVyc2lvbnMsIG1vcmUKKyAgICAvLyBzbWFydHMgd2lsIGJlIG5lZWRlZCB0aGFuIGJsaW5kIHVzZSBvZiBpcl91bm9wX2IyaS4KKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpaRXh0OiAgICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2IyaSwgICAgICBsbHZtSW5zdCk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6U0V4dDogICAgICAgICAgIHJldHVybiBlbWl0SVJTZXh0KGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpGUFRvU0k6ICAgICAgICAgcmV0dXJuIGVtaXRPcDwxPihpcl91bm9wX2YyaSwgICAgICBsbHZtSW5zdCk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6VUlUb0ZQOiAgICAgICAgIHJldHVybiBlbWl0T3BCaXQ8MT4oaXJfdW5vcF9iMmYsIGlyX3Vub3BfdTJmLCBsbHZtSW5zdCwgdHJ1ZSAvKiBnZW5VbnNpZ25lZCAqLyk7CisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6U0lUb0ZQOiAgICAgICAgIHJldHVybiBlbWl0T3A8MT4oaXJfdW5vcF9pMmYsICAgICAgbGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkNhbGw6ICAgICAgICAgICByZXR1cm4gZW1pdElSQ2FsbE9ySW50cmluc2ljKGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpSZXQ6ICAgICAgICAgICAgcmV0dXJuIGVtaXRJUlJldHVybihsbHZtSW5zdCwgbGFzdEJsb2NrKTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpMb2FkOiAgICAgICAgICAgcmV0dXJuIGVtaXRJUkxvYWQobGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OkFsbG9jYTogICAgICAgICByZXR1cm4gZW1pdElSYWxsb2NhKGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpTdG9yZTogICAgICAgICAgcmV0dXJuIGVtaXRJUlN0b3JlKGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudDogcmV0dXJuIGVtaXRJUkV4dHJhY3RFbGVtZW50KGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50OiAgcmV0dXJuIGVtaXRJUkluc2VydEVsZW1lbnQobGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OlNlbGVjdDogICAgICAgICByZXR1cm4gZW1pdElSU2VsZWN0KGxsdm1JbnN0KTsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyOiAgYnJlYWs7IC8vIGRlZmVyIHVudGlsIHdlIHByb2Nlc3MgdGhlIGxvYWQuCisgICAgY2FzZSBsbHZtOjpJbnN0cnVjdGlvbjo6RXh0cmFjdFZhbHVlOiAgIHJldHVybiBlbWl0SVJFeHRyYWN0VmFsdWUobGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246Okluc2VydFZhbHVlOiAgICByZXR1cm4gZW1pdElSSW5zZXJ0VmFsdWUobGx2bUluc3QpOworICAgIGNhc2UgbGx2bTo6SW5zdHJ1Y3Rpb246OlNodWZmbGVWZWN0b3I6ICBhc3NlcnQoMCAmJiAiVE9ETzogU2h1ZmZsZVZlY3RvciIpOyBicmVhazsKKyAgICBjYXNlIGxsdm06Okluc3RydWN0aW9uOjpCaXRDYXN0OiAgICAgICAgcmV0dXJuOyAgLy8gbm90aGluZyB0byBkbzogYml0Y2FzdCBjYXN0cyBwdHIgdHlwZXMKKyAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgbGx2bUluc3QtPmR1bXAoKTsKKyAgICAgICByZXR1cm4gZXJyb3IoInVuZXhwZWN0ZWQgTExWTSBvcGNvZGUiKTsKKyAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3IKKyAgICB9Cit9CisKKworLyoqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRmFjdG9yeSBmb3IgTWVzYSBMdW5hckdMQVNTIGJhY2stZW5kIHRyYW5zbGF0b3IKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK0JhY2tFbmRUcmFuc2xhdG9yKiBHZXRNZXNhR2xhc3NUcmFuc2xhdG9yKE1hbmFnZXIqIG1hbmFnZXIpCit7CisgICAgcmV0dXJuIG5ldyBNZXNhR2xhc3NUcmFuc2xhdG9yKG1hbmFnZXIpOworfQorCisvKioKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXN0cm95IGJhY2stZW5kIHRyYW5zbGF0b3IKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgUmVsZWFzZU1lc2FHbGFzc1RyYW5zbGF0b3IoQmFja0VuZFRyYW5zbGF0b3IqIHRhcmdldCkKK3sKKyAgICBkZWxldGUgdGFyZ2V0OworfQorCit9IC8vIG5hbWVzcGFjZSBnbGEKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19iYWNrZW5kX3RyYW5zbGF0b3IuaCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19iYWNrZW5kX3RyYW5zbGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTk2MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX2dsYXNzX2JhY2tlbmRfdHJhbnNsYXRvci5oCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBHcmVnRiA8Z3JlZ0BMdW5hckcuY29tPgorICogQXV0aG9yOiBTdGV2ZSBLIDxzcmtATHVuYXJHLmNvbT4KKyAqCisgKi8KKworLy89PT0tIGdsc2xfZ2xhc3NfYmFja2VuZF90cmFuc2xhdG9yLmggLSBNZXNhIGN1c3RvbWl6YXRpb24gb2YgZ2xhOjpCYWNrRW5kVHJhbnNsYXRvciAtLS0tLT09PS8vCisvLworLy8gQ3VzdG9taXphdGlvbiBvZiBnbGE6OkJhY2tFbmRUcmFuc2xhdG9yIGZvciBNZXNhCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIkNvcmUvUHJpdmF0ZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJDb3JlL0JhY2tlbmQuaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHRyMS90dXBsZT4KKworLy8gRm9yd2FyZCBkZWNsYXJlIHRvIGF2b2lkIHB1bGxpbmcgaW4gZW50aXJlIHVubmVlZGVkIGRlZmluaXRpb25zCitzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTsKK3N0cnVjdCBnbHNsX3R5cGU7CitzdHJ1Y3QgZ2xfc2hhZGVyOworc3RydWN0IGdsX2NvbnRleHQ7CitzdHJ1Y3QgaXJfaW5zdHJ1Y3Rpb247CitzdHJ1Y3QgaXJfZnVuY3Rpb247CitzdHJ1Y3QgaXJfcnZhbHVlOworc3RydWN0IGlyX2V4cHJlc3Npb247CitzdHJ1Y3QgaXJfY29uc3RhbnQ7CitzdHJ1Y3QgaXJfZnVuY3Rpb25fc2lnbmF0dXJlOworc3RydWN0IGlyX3ZhcmlhYmxlOworc3RydWN0IGlyX2RlcmVmZXJlbmNlOworc3RydWN0IGlyX2lmOworc3RydWN0IGlyX2xvb3A7CitzdHJ1Y3QgZXhlY19saXN0OworCisvLyBGb3J3YXJkIGRlY2xzIGZvciBMTFZNCituYW1lc3BhY2UgbGx2bSB7CisgICBjbGFzcyBJbnRyaW5zaWNJbnN0OworfTsKKworbmFtZXNwYWNlIGdsYSB7CisgICAgQmFja0VuZFRyYW5zbGF0b3IqIEdldE1lc2FHbGFzc1RyYW5zbGF0b3IoTWFuYWdlciopOworICAgIHZvaWQgUmVsZWFzZU1lc2FHbGFzc1RyYW5zbGF0b3IoZ2xhOjpCYWNrRW5kVHJhbnNsYXRvciopOworCisgICAgQmFja0VuZCogR2V0RHVtbXlCYWNrRW5kKCk7CisgICAgdm9pZCBSZWxlYXNlTWVzYUdsYXNzQmFja0VuZChnbGE6OkJhY2tFbmQqKTsKKworICAgIGNsYXNzIE1lc2FHbGFzc1RyYW5zbGF0b3IgOiBwdWJsaWMgZ2xhOjpCYWNrRW5kVHJhbnNsYXRvciB7CisgICAgcHVibGljOgorICAgICAgICBNZXNhR2xhc3NUcmFuc2xhdG9yKE1hbmFnZXIqIG0pIDoKKyAgICAgICAgICAgIEJhY2tFbmRUcmFuc2xhdG9yKG0pLAorICAgICAgICAgICAgZm5SZXR1cm5UeXBlKDApLAorICAgICAgICAgICAgZm5OYW1lKDApLAorICAgICAgICAgICAgZm5GdW5jdGlvbigwKSwKKyAgICAgICAgICAgIGZuU2lnbmF0dXJlKDApLAorICAgICAgICAgICAgc3RhdGUoMCksCisgICAgICAgICAgICBjdHgoMCkKKyAgICAgICAgeyB9CisKKyAgICAgICAgfk1lc2FHbGFzc1RyYW5zbGF0b3IoKTsKKworICAgICAgICB2b2lkIGluaXRpYWxpemVUcmFuc2xhdGlvbihnbF9jb250ZXh0ICosIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKiwgZ2xfc2hhZGVyICopOworICAgICAgICB2b2lkIGZpbmFsaXplVHJhbnNsYXRpb24oKTsKKyAgICAgICAgdm9pZCBzZWVkR2xvYmFsRGVjbE1hcCgpOworICAgICAgICBjb25zdCBjaGFyKiBnZXRJbmZvTG9nKCkgY29uc3QgeyByZXR1cm4gaW5mb0xvZy5jX3N0cigpOyB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgaW5pdFNhbXBsZXJUeXBlcygpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBib29sIGhvaXN0VW5kZWZPcGVyYW5kcygpICB7ICByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAvLyBUcmFuc2xhdGlvbiBtZXRob2RzIGZyb20gTHVuYXJHbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdm9pZCBzdGFydChsbHZtOjpNb2R1bGUmKTsKKyAgICAgICAgdm9pZCBlbmQobGx2bTo6TW9kdWxlJikgeyAvKiBub3RoaW5nIHRvIGRvICovIH0KKworICAgICAgICB2b2lkIGFkZFN0cnVjdFR5cGUobGx2bTo6U3RyaW5nUmVmLCBjb25zdCBsbHZtOjpUeXBlKik7CisgICAgICAgIHZvaWQgYWRkR2xvYmFsKGNvbnN0IGxsdm06Okdsb2JhbFZhcmlhYmxlKik7CisgICAgICAgIHZvaWQgYWRkR2xvYmFsQ29uc3QoY29uc3QgbGx2bTo6R2xvYmFsVmFyaWFibGUqKTsKKyAgICAgICAgdm9pZCBhZGRJb0RlY2xhcmF0aW9uKGdsYTo6RVZhcmlhYmxlUXVhbGlmaWVyIHF1YWxpZmllciwgY29uc3QgbGx2bTo6TUROb2RlKiBtZE5vZGUpOworICAgICAgICB2b2lkIHN0YXJ0RnVuY3Rpb25EZWNsYXJhdGlvbihjb25zdCBsbHZtOjpUeXBlKiB0eXBlLCBsbHZtOjpTdHJpbmdSZWYgbmFtZSk7CisgICAgICAgIHZvaWQgYWRkQXJndW1lbnQoY29uc3QgbGx2bTo6VmFsdWUqIHZhbHVlLCBib29sIGxhc3QpOworICAgICAgICB2b2lkIGVuZEZ1bmN0aW9uRGVjbGFyYXRpb24oKTsKKyAgICAgICAgdm9pZCBzdGFydEZ1bmN0aW9uQm9keSgpOworICAgICAgICB2b2lkIGVuZEZ1bmN0aW9uQm9keSgpOworICAgICAgICB2b2lkIGFkZEluc3RydWN0aW9uKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiBsbHZtSW5zdHJ1Y3Rpb24sIGJvb2wgbGFzdEJsb2NrLCBib29sIHJlZmVyZW5jZWRPdXRzaWRlU2NvcGU9ZmFsc2UpOworICAgICAgICB2b2lkIGRlY2xhcmVQaGlDb3B5KGNvbnN0IGxsdm06OlZhbHVlKiBkc3QpOworICAgICAgICB2b2lkIGFkZFBoaUNvcHkoY29uc3QgbGx2bTo6VmFsdWUqIGRzdCwgY29uc3QgbGx2bTo6VmFsdWUqIHNyYyk7CisgICAgICAgIHZvaWQgYWRkUGhpQWxpYXMoY29uc3QgbGx2bTo6VmFsdWUqIGRzdCwgY29uc3QgbGx2bTo6VmFsdWUqIHNyYyk7CisgICAgICAgIHZvaWQgYWRkSWYoY29uc3QgbGx2bTo6VmFsdWUqIGNvbmQsIGJvb2wgaW52ZXJ0PWZhbHNlKTsKKyAgICAgICAgdm9pZCBhZGRFbHNlKCk7CisgICAgICAgIHZvaWQgYWRkRW5kaWYoKTsKKyAgICAgICAgdm9pZCBhZGRTd2l0Y2goY29uc3QgbGx2bTo6VmFsdWUqIGNvbmQpOworICAgICAgICB2b2lkIGFkZENhc2UoaW50KTsKKyAgICAgICAgdm9pZCBhZGREZWZhdWx0KCk7CisgICAgICAgIHZvaWQgZW5kQ2FzZShib29sIHdpdGhCcmVhayk7CisgICAgICAgIHZvaWQgZW5kU3dpdGNoKCk7CisgICAgICAgIHZvaWQgYmVnaW5Db25kaXRpb25hbExvb3AoKTsKKyAgICAgICAgdm9pZCBiZWdpblNpbXBsZUNvbmRpdGlvbmFsTG9vcChjb25zdCBsbHZtOjpDbXBJbnN0KiBjbXAsIGNvbnN0IGxsdm06OlZhbHVlKiBvcDEsIGNvbnN0IGxsdm06OlZhbHVlKiBvcDIsIGJvb2wgaW52ZXJ0PWZhbHNlKTsKKyAgICAgICAgdm9pZCBiZWdpbkZvckxvb3AoY29uc3QgbGx2bTo6UEhJTm9kZSogcGhpLCBsbHZtOjpJQ21wSW5zdDo6UHJlZGljYXRlLCB1bnNpZ25lZCBib3VuZCwgdW5zaWduZWQgaW5jcmVtZW50KTsKKyAgICAgICAgdm9pZCBiZWdpblNpbXBsZUluZHVjdGl2ZUxvb3AoY29uc3QgbGx2bTo6UEhJTm9kZSogcGhpLCBjb25zdCBsbHZtOjpWYWx1ZSogY291bnQpOworICAgICAgICB2b2lkIGJlZ2luTG9vcCgpOworICAgICAgICB2b2lkIGVuZExvb3AoKTsKKyAgICAgICAgdm9pZCBhZGRMb29wRXhpdChjb25zdCBsbHZtOjpWYWx1ZSogY29uZGl0aW9uPU5VTEwsIGJvb2wgaW52ZXJ0PWZhbHNlKTsKKyAgICAgICAgdm9pZCBhZGRMb29wQmFjayhjb25zdCBsbHZtOjpWYWx1ZSogY29uZGl0aW9uPU5VTEwsIGJvb2wgaW52ZXJ0PWZhbHNlKTsKKyAgICAgICAgdm9pZCBhZGREaXNjYXJkKCk7CisgICAgICAgIHZvaWQgcHJpbnQoKSB7IH0KKworICAgICAgICAvLyBJbnRlcm5hbCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdm9pZCBzZXRQYXJzZVN0YXRlKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnMpIHsgc3RhdGUgPSBzOyB9CisgICAgICAgIHZvaWQgc2V0Q29udGV4dChnbF9jb250ZXh0ICpjKSB7IGN0eCA9IGM7IH0KKyAgICAgICAgdm9pZCBzZXRTaGFkZXIoZ2xfc2hhZGVyICpzKSB7IHNoYWRlciA9IHM7IH0KKyAgICAgICAgdm9pZCByZXNldEZuVHJhbnNsYXRpb25TdGF0ZSgpOworICAgICAgICBjb25zdCBsbHZtOjpHZXRFbGVtZW50UHRySW5zdCogZ2V0R2VwQXNJbnN0KGNvbnN0IGxsdm06OlZhbHVlKiBnZXApOworCisgICAgICAgIGludCBpckNtcE9wKGludCkgY29uc3Q7IC8vIHVzZSBpbnRzIHRvIGF2b2lkIGxhY2sgb2YgZm9yd2FyZCBkZWNscyBvZiBlbnVtcyBpbiBDKysKKyAgICAgICAgYm9vbCBpckNtcFVuc2lnbmVkKGludCkgY29uc3Q7CisKKyAgICAgICAgaXJfZXhwcmVzc2lvbiAqZ2xhc3NfdG9faXJfZXhwcmVzc2lvbihjb25zdCBpbnQsIGNvbnN0IGdsc2xfdHlwZSosIGlyX3J2YWx1ZSogPSBOVUxMLCBpcl9ydmFsdWUqID0gTlVMTCwgaXJfcnZhbHVlKiA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sID0gZmFsc2UsIGNvbnN0IGJvb2wgPSBmYWxzZSwgY29uc3QgYm9vbCA9IGZhbHNlKTsKKworICAgICAgICAvLyBGb3IgbG9vcCB3aXRoIGlyX3J2YWx1ZSBpbnB1dHMKKyAgICAgICAgdm9pZCBiZWdpbkZvckxvb3AoY29uc3QgbGx2bTo6UEhJTm9kZSogcGhpLCBsbHZtOjpJQ21wSW5zdDo6UHJlZGljYXRlLCBpcl9ydmFsdWUqIGJvdW5kLCBpcl9ydmFsdWUqIGluY3JlbWVudCk7CisKKyAgICAgICAgLy8gSVIgZmxhdm9yIG9mIHNpbXBsZSBpbmR1Y3RpdmUgbG9vcAorICAgICAgICB2b2lkIGJlZ2luU2ltcGxlSW5kdWN0aXZlTG9vcChjb25zdCBsbHZtOjpQSElOb2RlKiBwaGksIGlyX3J2YWx1ZSopOworCisgICAgICAgIC8vIEFkZCBJUiBpZiBzdGF0ZW1lbnQgZnJvbSBpcl9ydmFsdWUKKyAgICAgICAgaW5saW5lIHZvaWQgYWRkSWYoaXJfcnZhbHVlKiBjb25kLCBib29sIGludmVydD1mYWxzZSk7CisKKyAgICAgICAgLy8gQWRkIElSIGxvb3AgZXhpdCBzdGF0ZW1lbnQgZnJvbSBpcl9ydmFsdWUKKyAgICAgICAgaW5saW5lIHZvaWQgYWRkSVJMb29wRXhpdChpcl9ydmFsdWUqIGNvbmRpdGlvbj1OVUxMLCBib29sIGludmVydD1mYWxzZSk7CisKKyAgICAgICAgLy8gQ29udmVydCBzdHJ1Y3R1cmUgdHlwZXMgKGFsc28gdXNlZCBmb3IgYmxvY2tzKQorICAgICAgICBjb25zdCBnbHNsX3R5cGUqIGNvbnZlcnRTdHJ1Y3RUeXBlKGNvbnN0IGxsdm06OlN0cnVjdFR5cGUqLCBsbHZtOjpTdHJpbmdSZWYgbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGJsb2NrTmFtZSwgY29uc3QgbGx2bTo6TUROb2RlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbGE6OkVNZFR5cGVMYXlvdXQsIGdsYTo6RVZhcmlhYmxlUXVhbGlmaWVyLCBib29sIGlzQmxvY2spOworCisgICAgICAgIC8vIENvbnZlcnQgYW4gTExWTSB0eXBlIHRvIGFuIEhJUiB0eXBlCisgICAgICAgIGNvbnN0IGdsc2xfdHlwZSogbGx2bVR5cGVUb0hpclR5cGUoY29uc3QgbGx2bTo6VHlwZSosIGNvbnN0IGxsdm06Ok1ETm9kZSogPSAwLCBjb25zdCBsbHZtOjpWYWx1ZSogPSAwLCBjb25zdCBib29sID0gZmFsc2UpOworCisgICAgICAgIC8vIEVtaXQgdmVydGV4CisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUkVtaXRWZXJ0ZXgoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qKTsKKworICAgICAgICAvLyBFbmQgcHJpbWl0aXZlCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUkVuZFByaW1pdGl2ZShjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiopOworCisgICAgICAgIC8vIEFkZCBJUiBzaWduIGV4dGVuc2lvbgorICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJTZXh0KGNvbnN0IGxsdm06Okluc3RydWN0aW9uKik7CisKKyAgICAgICAgLy8gQWRkIGFsbG9jCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUmFsbG9jYShjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiopOworCisgICAgICAgIC8vIEFkZCBhIGJpbmFyeSBvcAorICAgICAgICB0ZW1wbGF0ZSA8aW50IG9wcz4gaW5saW5lIHZvaWQgZW1pdE9wKGludCAvKiBpcl9leHByZXNzaW9uX29wZXJhdGlvbiAqLywgY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgPSBmYWxzZSwgY29uc3QgYm9vbCA9IGZhbHNlLCBjb25zdCBib29sID0gZmFsc2UpOworCisgICAgICAgIC8vIEFkZCBhIGJpbmFyeSBvcCBvZiBlaXRoZXIgbG9naWNhbCBvciBiaXR3aXNlIHR5cGUKKyAgICAgICAgdGVtcGxhdGUgPGludCBvcHM+IGlubGluZSB2b2lkIGVtaXRPcEJpdChpbnQgLyogbG9naWNhbF9vcCAqLywgaW50IC8qIGJpdHdpc2Vfb3AgKi8sIGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sID0gZmFsc2UgLyogZ2VuVW5zaWduZWQgKi8pOworCisgICAgICAgIC8vIEFkZCBhIGJ1aWx0aW4gZnVuY3Rpb24gY2FsbAorICAgICAgICBpbmxpbmUgdm9pZCBlbWl0Rm4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qKTsKKworICAgICAgICAvLyBBZGQgYSBzYXR1cmF0aW9uLiAgVE9ETzogV2FudCB0byBhc2sgZm9yIGEgTHVuYXJHbGFzcworICAgICAgICAvLyBkZWNvbXBvc2l0aW9uIG9mIHRoaXMsIHdoaWNoIGRvZXNuJ3QgZXhpc3QgeWV0LgorICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJTYXR1cmF0ZShjb25zdCBsbHZtOjpDYWxsSW5zdCopOworCisgICAgICAgIC8vIEFkZCBhIGNsYW1wLiAgVE9ETzogV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gZG8gdGhpcyBoZXJlOyBiZXR0ZXIKKyAgICAgICAgLy8gZm9yIEx1bmFyR2xhc3MgdG8gZG8gaXQsIGJ1dCB0aGVyZSdzIGEgZGVmZWN0IGluIHRoZSBMdW5hckdsYXNzIGRlY29tcG9zaXRpb24KKyAgICAgICAgLy8gZXhwb3NlZCBieSB0YWlqaS1zaGFkZXJzL3NoYWRlcl8zMi5mcmFnLiAgVGhpcyBpcyBhIHdvcmthcm91bmQgdW50aWwKKyAgICAgICAgLy8gdGhhdCdzIHNvcnRlZC4KKyAgICAgICAgaW5saW5lIHZvaWQgZW1pdElSQ2xhbXAoY29uc3QgbGx2bTo6Q2FsbEluc3QqLCBjb25zdCBib29sID0gZmFsc2UpOworCisgICAgICAgIC8vIEFkZCBhIGNvbmRpdGlvbmFsIGRpc2NhcmQKKyAgICAgICAgaW5saW5lIHZvaWQgZW1pdElSRGlzY2FyZENvbmQoY29uc3QgbGx2bTo6Q2FsbEluc3QqKTsKKworICAgICAgICAvLyBBZGQgZml4ZWQgdHJhbnNmb3JtCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUkZUcmFuc2Zvcm0oY29uc3QgbGx2bTo6Q2FsbEluc3QqKTsKKworICAgICAgICAvLyBBZGQgYSBjb21wYXJpc29uIG9wCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRDbXAoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qKTsKKworICAgICAgICAvLyBBZGQgYSBmdW5jdGlvbiBjYWxsIG9yIGludHJpbnNpYworICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJDYWxsKGNvbnN0IGxsdm06OkNhbGxJbnN0Kik7CisKKyAgICAgICAgLy8gQWRkIGEgZnVuY3Rpb24gY2FsbCBvciBpbnRyaW5zaWMKKyAgICAgICAgaW5saW5lIHZvaWQgZW1pdElSUmV0dXJuKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiwgYm9vbCBsYXN0QmxvY2spOworCisgICAgICAgIC8vIERldGVybWluZSBnbHNsIG1hdHJpeCB0eXBlCisgICAgICAgIGlubGluZSBjb25zdCBnbHNsX3R5cGUqIGdsc2xNYXRUeXBlKGludCBudW1Db2xzLCBpbnQgbnVtUm93cykgY29uc3Q7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuIElSIG1hdHJpeCBvYmplY3QgYnkgZGlyZWN0IHJlYWQgZnJvbSBhIHVuaWZvcm0gbWF0cml4LAorICAgICAgICAvLyBvciBtb3ZlcyBvZiBjb2x1bW4gdmVjdG9ycyBpbnRvIGEgdGVtcCBtYXRyaXguCisgICAgICAgIGlubGluZSBpcl9ydmFsdWUqIGludHJpbnNpY01hdChjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RDb2x1bW4sIGludCBudW1Db2xzLCBpbnQgbnVtUm93cyk7CisKKyAgICAgICAgLy8gQWRkIElSIG1hdCp2ZWMgb3IgdmVjKm1hdCBpbnRyaW5zaWMKKyAgICAgICAgaW5saW5lIHZvaWQgZW1pdElSTWF0TXVsKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiwgaW50IG51bUNvbHMsIGJvb2wgbWF0TGVmdCk7CisKKyAgICAgICAgLy8gQWRkIElSIG1hdCptYXQgaW50cmluc2ljCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUk1hdFRpbWVzTWF0KGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiwgaW50IG51bUxlZnRDb2xzLCBpbnQgbnVtcmlnaHRDb2xzKTsKKworICAgICAgICAvLyBJUiBpbnRyaW5zaWNzCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUkludHJpbnNpYyhjb25zdCBsbHZtOjpJbnRyaW5zaWNJbnN0Kik7CisKKyAgICAgICAgLy8gVHJhY2sgbWF4aW11bSBhcnJheSB2YWx1ZSB1c2VkCisgICAgICAgIGlubGluZSB2b2lkIHRyYWNrTWF4QXJyYXlFbGVtZW50KGlyX3J2YWx1ZSogZGVyZWYsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgLy8gSVIgdGV4dHVyZSBpbnRyaW5zaWNzCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUlRleHR1cmUoY29uc3QgbGx2bTo6SW50cmluc2ljSW5zdCosIGJvb2wgZ2F0aGVyKTsKKyAgICAgICAgaW5saW5lIHZvaWQgZW1pdElSVGV4dHVyZVF1ZXJ5KGNvbnN0IGxsdm06OkludHJpbnNpY0luc3QqKTsKKworICAgICAgICAvLyBJUiBpbnNlcnRpb24gaW50cmluc2ljcworICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJNdWx0aUluc2VydChjb25zdCBsbHZtOjpJbnRyaW5zaWNJbnN0Kik7CisKKyAgICAgICAgLy8gSVIgc3dpenpsZSBpbnRyaW5zaWNzCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUlN3aXp6bGUoY29uc3QgbGx2bTo6SW50cmluc2ljSW5zdCopOworCisgICAgICAgIC8vIExvYWQgb3BlcmF0aW9uIChidXQgZG9uJ3QgYWRkIHRvIGluc3RydWN0aW9uIHN0cmVhbSkKKyAgICAgICAgaW5saW5lIGlyX3J2YWx1ZSogbWFrZUlSTG9hZChjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiosIGNvbnN0IGdsc2xfdHlwZSogPSAwKTsKKworICAgICAgICAvLyBMb2FkIG9wZXJhdGlvbgorICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJMb2FkKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKik7CisKKyAgICAgICAgLy8gU3RvcmUgb3BlcmF0aW9uCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUlN0b3JlKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKik7CisKKyAgICAgICAgLy8gQWRkIGEgZnVuY3Rpb24gY2FsbCBvciBpbnRyaW5zaWMKKyAgICAgICAgaW5saW5lIHZvaWQgZW1pdElSQ2FsbE9ySW50cmluc2ljKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKik7CisKKyAgICAgICAgLy8gVmVjdG9yIGNvbXBvbmVudCBleHRyYWN0aW9uCisgICAgICAgIGlubGluZSB2b2lkIGVtaXRJUkV4dHJhY3RFbGVtZW50KGNvbnN0IGxsdm06Okluc3RydWN0aW9uKik7CisKKyAgICAgICAgLy8gdGVybmFyeSBvcGVyYXRvcgorICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJTZWxlY3QoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qKTsKKworICAgICAgICAvLyBWZWN0b3IgY29tcG9uZW50IGluc2VydGlvbgorICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJJbnNlcnRFbGVtZW50KGNvbnN0IGxsdm06Okluc3RydWN0aW9uKik7CisKKyAgICAgICAgLy8gQXJyYXkgY29tcG9uZW50IGV4dHJhY3Rpb24KKyAgICAgICAgaW5saW5lIHZvaWQgZW1pdElSRXh0cmFjdFZhbHVlKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKik7CisKKyAgICAgICAgaW5saW5lIHZvaWQgRmluZEdlcFR5cGUoY29uc3QgbGx2bTo6SW5zdHJ1Y3Rpb24qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6TUROb2RlKiYpOworCisgICAgICAgIC8vIERlZmVyZW5jZSBHRVAKKyAgICAgICAgaW5saW5lIGlyX3J2YWx1ZSogZGVyZWZlcmVuY2VHZXAoY29uc3QgbGx2bTo6VHlwZSomLCBpcl9ydmFsdWUqLCBsbHZtOjpWYWx1ZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgY29uc3QgbGx2bTo6TUROb2RlKiYsIEVNZFR5cGVMYXlvdXQqID0gMCk7CisKKyAgICAgICAgLy8gVHJhdmVyc2UgR0VQIGluc3RydWN0aW9uCisgICAgICAgIGlubGluZSBpcl9ydmFsdWUqIHRyYXZlcnNlR0VQKGNvbnN0IGxsdm06Okluc3RydWN0aW9uKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfcnZhbHVlKiBhZ2dyZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVNZFR5cGVMYXlvdXQqID0gMCk7CisKKyAgICAgICAgLy8gQXJyYXkgY29tcG9uZW50IGluc2VydGlvbgorICAgICAgICBpbmxpbmUgdm9pZCBlbWl0SVJJbnNlcnRWYWx1ZShjb25zdCBsbHZtOjpJbnN0cnVjdGlvbiopOworCisgICAgICAgIC8vIFNlZSBpZiB0aGlzIGNvbnN0YW50IGlzIGEgemVybworICAgICAgICBpbmxpbmUgYm9vbCBpc0NvbnN0YW50WmVybyhjb25zdCBsbHZtOjpDb25zdGFudCopIGNvbnN0OworCisgICAgICAgIC8vIENyZWF0ZSBhIHNpbXBsZSBzY2FsYXIgY29uc3RhbnQKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUIG5ld0lSU2NhbGFyQ29uc3RhbnQoY29uc3QgbGx2bTo6Q29uc3RhbnQqKSBjb25zdDsKKworICAgICAgICAvLyBBZGQgYSBjb25zdGFudCB2YWx1ZSBmb3IgdGhpcyBMTFZNIHZhbHVlCisgICAgICAgIGlubGluZSBpcl9jb25zdGFudCogbmV3SVJDb25zdGFudChjb25zdCBsbHZtOjpWYWx1ZSopOworCisgICAgICAgIC8vIEFkZCBhIGdsb2JhbCBmb3IgdGhpcyBMTFZNIHZhbHVlCisgICAgICAgIGlubGluZSBpcl9ydmFsdWUqIG5ld0lSR2xvYmFsKGNvbnN0IGxsdm06OlZhbHVlKiwgY29uc3QgY2hhciogbmFtZSA9IDApOworCisgICAgICAgIC8vIEFkZCB0eXBlLXNhZmUgdW5kZWZpbmVkIHZhbHVlIGluIGNhc2Ugc29tZW9uZSBsb29rcyB1cCBhIG5vdC1kZWZpbmVkIHZhbHVlCisgICAgICAgIGlubGluZSBpcl9jb25zdGFudCogYWRkSVJVbmRlZmluZWQoY29uc3QgbGx2bTo6VHlwZSopOworCisgICAgICAgIC8vIEFkZCB2YXJpYWJsZSBmcm9tIExMVk0gdmFsdWUKKyAgICAgICAgaW5saW5lIGlyX3J2YWx1ZSogZ2V0SVJWYWx1ZShjb25zdCBsbHZtOjpWYWx1ZSosIGlyX2luc3RydWN0aW9uKiA9IDApOworCisgICAgICAgIC8vIEFkZCBpbnN0cnVjdGlvbiB0byB0b3Agb2YgaW5zdHJ1Y3Rpb24gbGlzdCBzdGFjaworICAgICAgICBpbmxpbmUgdm9pZCBhZGRJUkluc3RydWN0aW9uKGNvbnN0IGxsdm06OlZhbHVlKiwgaXJfaW5zdHJ1Y3Rpb24qKTsKKworICAgICAgICAvLyByYXcgYWRkIGluc3RydWN0aW9uOiBkb24ndCBhZGQgbWFwIGVudHJ5LCBqdXN0IGFwcGVuZCB0byBpbnN0IGxpc3QKKyAgICAgICAgaW5saW5lIHZvaWQgYWRkSVJJbnN0cnVjdGlvbihpcl9pbnN0cnVjdGlvbiosIGJvb2wgZ2xvYmFsID0gZmFsc2UpOworCisgICAgICAgIC8vIFJldHVybiByZWYgY291bnQgb2YgYW4gcnZhbHVlCisgICAgICAgIGlubGluZSB1bnNpZ25lZCBnZXRSZWZDb3VudChjb25zdCBsbHZtOjpWYWx1ZSopIGNvbnN0OworCisgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYSB2YWx1ZU1hcCBlbnRyeSBmb3IgdGhpcyBMTFZNIHZhbHVlCisgICAgICAgIGlubGluZSBib29sIHZhbHVlRW50cnlFeGlzdHMoY29uc3QgbGx2bTo6VmFsdWUqKSBjb25zdDsKKworICAgICAgICAvLyBFbmNhcHN1bGF0ZSBjcmVhdGlvbiBvZiB2YXJpYWJsZXMuICBJZGVhbGx5IHRoZSBpbnQgd291bGQgYmUKKyAgICAgICAgLy8gaXJfdmFyaWFibGVfbW9kZSwgYnV0IHdlIGNhbid0IGZvcndhcmQgZGVjbGFyZSBhbiBlbnVtIHVudGlsIEMrKzExCisgICAgICAgIGlubGluZSBpcl92YXJpYWJsZSogbmV3SVJWYXJpYWJsZShjb25zdCBnbHNsX3R5cGUqLCBjb25zdCBjaGFyKiwgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSA9IGZhbHNlKTsKKyAgICAgICAgaW5saW5lIGlyX3ZhcmlhYmxlKiBuZXdJUlZhcmlhYmxlKGNvbnN0IGdsc2xfdHlwZSosIGNvbnN0IHN0ZDo6c3RyaW5nJiwgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSA9IGZhbHNlKTsKKyAgICAgICAgaW5saW5lIGlyX3ZhcmlhYmxlKiBuZXdJUlZhcmlhYmxlKGNvbnN0IGxsdm06OlR5cGUqIHR5cGUsIGNvbnN0IGxsdm06OlZhbHVlKiwgY29uc3QgY2hhciosIGludCBtb2RlLCBib29sIGRlY2xhcmUgPSBmYWxzZSk7CisgICAgICAgIGlubGluZSBpcl92YXJpYWJsZSogbmV3SVJWYXJpYWJsZShjb25zdCBsbHZtOjpUeXBlKiB0eXBlLCBjb25zdCBsbHZtOjpWYWx1ZSosIGNvbnN0IHN0ZDo6c3RyaW5nJiwgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBFbmNhcHN1bGF0ZSBjcmVhdGlvbiBvZiB2YXJpYWJsZSBkZXJlZmVyZW5jZS4gIElkZWFsbHkgdGhlIGludCB3b3VsZCBiZQorICAgICAgICAvLyBpcl92YXJpYWJsZV9tb2RlLCBidXQgd2UgY2FuJ3QgZm9yd2FyZCBkZWNsYXJlIGFuIGVudW0gdW50aWwgQysrMTEKKyAgICAgICAgaW5saW5lIGlyX2RlcmVmZXJlbmNlKiBuZXdJUlZhcmlhYmxlRGVyZWYoY29uc3QgZ2xzbF90eXBlKiwgY29uc3QgY2hhciosIGludCBtb2RlLCBib29sIGRlY2xhcmUgPSBmYWxzZSk7CisgICAgICAgIGlubGluZSBpcl9kZXJlZmVyZW5jZSogbmV3SVJWYXJpYWJsZURlcmVmKGNvbnN0IGdsc2xfdHlwZSosIGNvbnN0IHN0ZDo6c3RyaW5nJiwgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSA9IGZhbHNlKTsKKyAgICAgICAgaW5saW5lIGlyX2RlcmVmZXJlbmNlKiBuZXdJUlZhcmlhYmxlRGVyZWYoY29uc3QgbGx2bTo6VHlwZSogdHlwZSwgY29uc3QgbGx2bTo6VmFsdWUqLCBjb25zdCBjaGFyKiwgaW50IG1vZGUsIGJvb2wgZGVjbGFyZSA9IGZhbHNlKTsKKyAgICAgICAgaW5saW5lIGlyX2RlcmVmZXJlbmNlKiBuZXdJUlZhcmlhYmxlRGVyZWYoY29uc3QgbGx2bTo6VHlwZSogdHlwZSwgY29uc3QgbGx2bTo6VmFsdWUqLCBjb25zdCBzdGQ6OnN0cmluZyYsIGludCBtb2RlLCBib29sIGRlY2xhcmUgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gRml4IHVwIElSIEx2YWx1ZXMgKHNlZSBjb21tZW50IGluIEMrKyBjb2RlKQorICAgICAgICBpcl9pbnN0cnVjdGlvbiogZml4SVJMVmFsdWUoaXJfcnZhbHVlKiBsaHMsIGlyX3J2YWx1ZSogcmhzKTsKKworICAgICAgICAvLyBBZGQgZXJyb3IgbWVzc2FnZQorICAgICAgICB2b2lkIGVycm9yKGNvbnN0IGNoYXIqIG1zZykgY29uc3Q7CisKKyAgICAgICAgdm9pZCB1blBhY2tTZXRBbmRCaW5kaW5nKGNvbnN0IGludCBsb2NhdGlvbiwgaW50JiBzZXQsIGludCYgYmluZGluZyk7CisKKyAgICAgICAgdm9pZCBzZXRJb1BhcmFtZXRlcnMoaXJfdmFyaWFibGUqIGlvVmFyLCBjb25zdCBsbHZtOjpNRE5vZGUqKTsKKworICAgICAgICAvLyBEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAvLyBNYXAgTExWTSB2YWx1ZXMgdG8gSVIgdmFsdWVzCisgICAgICAgIC8vIFdlIG5ldmVyIG5lZWQgYW4gb3JkZXJlZCB0cmF2ZXJzYWwuICBVc2UgdW5vcmRlcmVkIG1hcCBmb3IgcGVyZm9ybWFuY2UuCisgICAgICAgIHR5cGVkZWYgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8Y29uc3QgbGx2bTo6VmFsdWUqLCBpcl9pbnN0cnVjdGlvbio+IHRWYWx1ZU1hcDsKKyAgICAgICAgdFZhbHVlTWFwIHZhbHVlTWFwOworCisgICAgICAgIC8vIHN0cnVjdHVyZSB0byBjb3VudCBydmFsdWVzIHBlciBsdmFsdWUKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDxjb25zdCBsbHZtOjpWYWx1ZSosIHVuc2lnbmVkPiB0UmVmQ291bnRNYXA7CisgICAgICAgIHRSZWZDb3VudE1hcCByZWZDb3VudE1hcDsKKworICAgICAgICAvLyBtYXAgZnJvbSB0eXBlIG5hbWVzIHRvIHRoZSBtZEFnZ3JlZ2F0ZSBub2RlcyB0aGF0IGRlc2NyaWJlIHRoZWlyIHR5cGVzCisgICAgICAgIHR5cGVkZWYgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8Y29uc3QgbGx2bTo6VHlwZSosIGNvbnN0IGxsdm06Ok1ETm9kZSo+IHRNRE1hcDsKKyAgICAgICAgdE1ETWFwIHR5cGVNZEFnZ3JlZ2F0ZU1hcDsKKworICAgICAgICAvLyBNYXAgZnJvbSB0eXBlIG5hbWVzIHRvIG1ldGFkYXRhIG5vZGVzCisgICAgICAgIHR5cGVkZWYgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNvbnN0IGxsdm06Ok1ETm9kZSo+IHRUeXBlbmFtZU1kTWFwOworICAgICAgICB0VHlwZW5hbWVNZE1hcCB0eXBlbmFtZU1kTWFwOworCisgICAgICAgIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPGNvbnN0IGxsdm06OlR5cGUqLCBjb25zdCBsbHZtOjpNRE5vZGUqLCBjb25zdCBib29sPiB0VHlwZURhdGE7CisKKyAgICAgICAgc3RydWN0IFR5cGVIYXNoIHsKKyAgICAgICAgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgdFR5cGVEYXRhJiBwKSBjb25zdCB7IHJldHVybiBzaXplX3Qoc3RkOjp0cjE6OmdldDwwPihwKSkgXiBzaXplX3Qoc3RkOjp0cjE6OmdldDwxPihwKSkgXiBzaXplX3Qoc3RkOjp0cjE6OmdldDwyPihwKSk7IH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBtYXAgdG8gdHJhY2sgbWFwcGluZyBmcm9tIExMVk0gdG8gSElSIHR5cGVzCisgICAgICAgIHR5cGVkZWYgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8dFR5cGVEYXRhLCBjb25zdCBnbHNsX3R5cGUqLCBUeXBlSGFzaD4gdFR5cGVNYXA7CisgICAgICAgIHRUeXBlTWFwIHR5cGVNYXA7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgZGVjbGFyYXRpb24gbWFwLiAgV2UgbWFwIHVzZXMgb2YgZ2xvYmFscyB0byB0aGVpciBkZWNsYXJhdGlvbnMKKyAgICAgICAgLy8gdXNpbmcgcmVuZGV6dm91cy1ieS1uYW1lLiAgSElSIHJlcXVpcmVzIHVzZSBvZiB0aGUgZXhhY3QgaXJfdmFyaWFibGUgbm9kZS4KKyAgICAgICAgdHlwZWRlZiBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaXJfdmFyaWFibGUqPiB0R2xvYmFsRGVjbE1hcDsKKyAgICAgICAgdEdsb2JhbERlY2xNYXAgZ2xvYmFsRGVjbE1hcDsKKworICAgICAgICAvLyBGb3IgZ2xvYmFscywgd2UgcmVtZW1iZXIgYW4gaXJfdmFyaWFibGVfbW9kZSBmcm9tIHRoZSBnbG9iYWwgZGVjbGFyYXRpb24uCisgICAgICAgIC8vIEFsYXMsIHdlIHN0b3JlIGl0IGFzIGFuIGludCBoZXJlIHNpbmNlIHdlIGNhbid0IGZvcndhcmQgZGVjbGFyZSBhbiBlbnVtLgorICAgICAgICB0eXBlZGVmIHN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHRHbG9iYWxWYXJNb2RlTWFwOworICAgICAgICB0R2xvYmFsVmFyTW9kZU1hcCBnbG9iYWxWYXJNb2RlTWFwOworCisgICAgICAgIC8vIFNvbWUgYnVpbHRpbiB2YXJpYWJsZXMgbWF5IGJlIGRlY2xhcmVkIGFuZCByZWYnZCB3aXRoIGFub3RoZXIgbmFtZSwgZXNwZWNpYWxseSB3aGVuCisgICAgICAgIC8vIFNQSVJWIGRlYnVnIGluZm8gaXMgc3RyaXBwZWQuIFJlbWVtYmVyIHRoZXNlIG1hcHBpbmdzIGhlcmUuCisgICAgICAgIHR5cGVkZWYgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiB0TmFtZUJ1aWx0aW5NYXA7CisgICAgICAgIHROYW1lQnVpbHRpbk1hcCBuYW1lQnVpbHRpbk1hcDsKKworICAgICAgICAvLyBDZXJ0YWluIEhJUiBvcGNvZGVzIHJlcXVpcmUgcHJvcGVyIHNpbnQvdWludCB0eXBlcywgYW5kIHRoYXQgaW5mb3JtYXRpb24gaXMKKyAgICAgICAgLy8gbm90IHByZXNlcnZlZCBpbiBMTFZNLiAgTHVuYXJHbGFzcyBwcm92aWRlcyBpdCBpbiBtZXRhZGF0YSBmb3IgSU8gYW5kIHVuaWZvcm0KKyAgICAgICAgLy8gZGF0YSwgYnV0IG5vdCBhcmJpdHJhcnkgdGVtcCB2YWx1ZXMuICBUaGlzIHNldCB0cmFja3MgdGVtcG9yYXJpZXMgdGhhdCBtdXN0CisgICAgICAgIC8vIGJlIHNpbnRzLgorICAgICAgICB0eXBlZGVmIHN0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0PGNvbnN0IGxsdm06OlZhbHVlKj4gdFNpbnRTZXQ7CisgICAgICAgIHRTaW50U2V0IHNpbnRWYWx1ZXM7CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIGFub255bW91cyBzdHJ1Y3RzIHdoZXJlIHdlIG11c3QgaG9pc3QgdGhlIG1lbWJlcnMgdG8gdGhlIGdsb2JhbCBzY29wZSwKKyAgICAgICAgLy8gYmVjYXVzZSBISVIgZm9ybSBkb2Vzbid0IG1hdGNoIEJvdHRvbUlSIGZvcm0uICBCb3R0b21JUiBob2xkcyB0aGVtIGluIGEgc3RydWN0dXJlLAorICAgICAgICAvLyB3aGlsZSBISVIgbWFrZXMgZWFjaCBtbWViZXIgYSBnbG9iYWxseSBzY29wZWQgdmFyaWFibGUuICBUaGlzIGlzIGF3a3dhcmQuCisgICAgICAgIHN0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBhbm9uQmxvY2tzOworCisgICAgICAgIC8vIFN0YWNrIG9mIGluc3RydWN0aW9uIGxpc3RzIGZvciBjcmVhdGlvbiBvZiBISVIgdHJlZQorICAgICAgICBzdGQ6OnZlY3RvcjxleGVjX2xpc3QgKj4gaW5zdHJ1Y3Rpb25TdGFjazsKKworICAgICAgICAvLyBTdGFjayBvZiBpZiBzdGF0ZW1lbnRzLiAgVXNlZCB0byBmaW5kIGVsc2UgY2xhdXNlIGluc3RydWN0aW9uIGxpc3QKKyAgICAgICAgc3RkOjp2ZWN0b3I8aXJfaWYgKj4gaWZTdGFjazsKKworICAgICAgICAvLyBTdGFjayBvZiBsb29wIHN0YXRlbWVudHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPGlyX2xvb3AgKj4gbG9vcFN0YWNrOworCisgICAgICAgIC8vIFN0YWNrIG9mIGxvb3AgdGVybWluYXRvciBzdGF0ZW1lbnRzIChlLmcsIGZvciBoYW5kbGluZyArK2luZGV4KS4KKyAgICAgICAgc3RkOjp2ZWN0b3I8aXJfaW5zdHJ1Y3Rpb24gKj4gbG9vcFRlcm1pbmF0b3JTdGFjazsKKworICAgICAgICAvLyBHbG9iYWwgaW5pdGlhbGl6ZXJzLCBldGMgd2UnbGwgYWRkIGFzIGEgbWFpbigpIHByb2xvZ3VlCisgICAgICAgIHN0ZDo6bGlzdDxpcl9pbnN0cnVjdGlvbiAqPiBwcm9sb2d1ZTsKKworICAgICAgICAvLyBXZSBjb3VudCB0aGUgcmVmZXJlbmNlcyBvZiBlYWNoIGx2YWx1ZSwgdG8ga25vdyB3aGVuIHRvIGdlbmVyYXRlCisgICAgICAgIC8vIGFzc2lnbm1lbnRzIGFuZCB3aGVuIHRvIGRpcmVjdGx5IGNyZWF0ZSB0cmVlIG5vZGVzCisgICAgICAgIHZvaWQgY291bnRSZWZlcmVuY2VzKGNvbnN0IGxsdm06Ok1vZHVsZSYpOworCisgICAgICAgIC8vIE1ha2UgdXAgYSBuYW1lIGZvciBhIG5ldyB2YXJpYWJsZQorICAgICAgICBjb25zdCBjaGFyKiBuZXdOYW1lKGNvbnN0IGxsdm06OlZhbHVlKik7CisKKyAgICAgICAgLy8gbGlzdCBvZiBsbHZtIFZhbHVlcyB0byBmcmVlIG9uIGV4aXQKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgbGx2bTo6VmFsdWUqPiB0b0RlbGV0ZTsKKworICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIGluZm9Mb2c7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gdHJhbnNsYXRpb24gc3RhdGU6IHdlIG5lZWQgdGhlc2UgYmVjYXVzZSB0aGUgdHJhdmVyc2FsIG9mIExMVk0KKyAgICAgICAgLy8gZnVuY3Rpb25zIGlzIGRpc3RyaWJ1dGVkIGFjcm9zcyBtdWx0aXBsZSBtZXRob2RzLgorICAgICAgICBjb25zdCBnbHNsX3R5cGUqICAgICAgICAgZm5SZXR1cm5UeXBlOworICAgICAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgZm5OYW1lOworICAgICAgICBpcl9mdW5jdGlvbiogICAgICAgICAgICAgZm5GdW5jdGlvbjsKKyAgICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlKiAgIGZuU2lnbmF0dXJlOworICAgICAgICBleGVjX2xpc3QgICAgICAgICAgICAgICAgZm5QYXJhbWV0ZXJzOworCisgICAgICAgIC8vIE1lc2Egc3RhdGUgYW5kIGNvbnRleHQKKyAgICAgICAgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSogIHN0YXRlOworICAgICAgICBnbF9zaGFkZXIqICAgICAgICAgICAgICAgc2hhZGVyOworICAgICAgICBnbF9jb250ZXh0KiAgICAgICAgICAgICAgY3R4OworICAgIH07IC8vIGNsYXNzIE1lc2FHbGFzc1RyYW5zbGF0b3IKK30gLy8gbmFtZXNwYWNlIGdsYQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfZ2xhc3NfbWFuYWdlci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfZ2xhc3NfbWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ODkwMAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19tYW5hZ2VyLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogU3RldmUgSyA8c3JrQEx1bmFyRy5jb20+CisgKgorICovCisKKy8vPT09LSBnbHNsX2dsYXNzX21hbmFnZXIuY3BwIC0gTWVzYSBjdXN0b21pemF0aW9uIG9mIFByaXZhdGVNYW5hZ2VyIC0tLS0tPT09Ly8KKy8vCisvLyBDdXN0b21pemF0aW9uIG9mIGdsYTo6UHJpdmF0ZU1hbmFnZXIgZm9yIE1lc2EKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJnbHNsX2dsYXNzX21hbmFnZXIuaCIKKyNpbmNsdWRlICJnbHNsX2dsYXNzX2JhY2tlbmQuaCIKKyNpbmNsdWRlICJnbHNsX2dsYXNzX2JhY2tlbmRfdHJhbnNsYXRvci5oIgorCitnbGE6Ok1lc2FHbGFzc01hbmFnZXI6Ok1lc2FHbGFzc01hbmFnZXIoY29uc3QgRVNoTGFuZ3VhZ2UgbGFuZ3VhZ2UpCit7CisgICBjcmVhdGVOb25yZXVzYWJsZSgpOworICAgYmFja0VuZCA9IGdsYTo6R2V0TWVzYUdsYXNzQmFja0VuZChsYW5ndWFnZSk7Cit9CisKK2dsYTo6TWVzYUdsYXNzTWFuYWdlcjo6fk1lc2FHbGFzc01hbmFnZXIoKQoreworICAgZnJlZU5vbnJldXNhYmxlKCk7CisgICBnbGE6OlJlbGVhc2VNZXNhR2xhc3NCYWNrRW5kKGJhY2tFbmQpOworfQorCit2b2lkIGdsYTo6TWVzYUdsYXNzTWFuYWdlcjo6Y2xlYXIoKQoreworICAgZnJlZU5vbnJldXNhYmxlKCk7CisgICBjcmVhdGVOb25yZXVzYWJsZSgpOworfQorCit2b2lkIGdsYTo6TWVzYUdsYXNzTWFuYWdlcjo6Y3JlYXRlQ29udGV4dCgpCit7CisgICBkZWxldGUgY29udGV4dDsKKyAgIGNvbnRleHQgPSBuZXcgbGx2bTo6TExWTUNvbnRleHQ7Cit9CisKK3ZvaWQgZ2xhOjpNZXNhR2xhc3NNYW5hZ2VyOjpjcmVhdGVOb25yZXVzYWJsZSgpCit7CisgICBiYWNrRW5kVHJhbnNsYXRvciA9IGdsYTo6R2V0TWVzYUdsYXNzVHJhbnNsYXRvcih0aGlzKTsKK30KKwordm9pZCBnbGE6Ok1lc2FHbGFzc01hbmFnZXI6OmZyZWVOb25yZXVzYWJsZSgpCit7CisgICBnbGE6OlJlbGVhc2VNZXNhR2xhc3NUcmFuc2xhdG9yKGJhY2tFbmRUcmFuc2xhdG9yKTsKKyAgIHdoaWxlICghIGZyZWVMaXN0LmVtcHR5KCkpIHsKKyAgICAgIGRlbGV0ZSBmcmVlTGlzdC5iYWNrKCk7CisgICAgICBmcmVlTGlzdC5wb3BfYmFjaygpOworICAgfQorICAgZGVsZXRlIG1vZHVsZTsKKyAgIG1vZHVsZSA9IDA7CisgICBkZWxldGUgY29udGV4dDsKKyAgIGNvbnRleHQgPSAwOworfQorCitnbGE6Ok1hbmFnZXIqIGdsYTo6Z2V0TWFuYWdlcihjb25zdCBFU2hMYW5ndWFnZSBsYW5ndWFnZSkKK3sKKyAgIHJldHVybiBuZXcgZ2xhOjpNZXNhR2xhc3NNYW5hZ2VyKGxhbmd1YWdlKTsKK30KKworZ2xhOjpNZXNhR2xhc3NUcmFuc2xhdG9yKiBnbGE6Ok1lc2FHbGFzc01hbmFnZXI6OmdldEJhY2tlbmRUcmFuc2xhdG9yKCkKK3sKKyAgIC8vIFdlIGtub3cgdGhpcyBtdXN0IGJlIGEgTWVzYUdsYXNzVHJhbnNsYXRvciwgYmVjYXVzZSB3ZSBvbmx5CisgICAvLyBnZXQgdGhlbSBmcm9tIG91ciBmYWN0b3J5LCB3aGljaCBvbmx5IG1ha2VzIE1lc2FHbGFzc1RyYW5zbGF0b3JzLgorICAgcmV0dXJuIHN0YXRpY19jYXN0PGdsYTo6TWVzYUdsYXNzVHJhbnNsYXRvcio+KGJhY2tFbmRUcmFuc2xhdG9yKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9nbGFzc19tYW5hZ2VyLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfZ2xhc3NfbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzM2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfZ2xhc3NfbWFuYWdlci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yOiBTdGV2ZSBLIDxzcmtATHVuYXJHLmNvbT4KKyAqCisgKi8KKworLy89PT0tIGdsc2xfZ2xhc3NfbWFuYWdlci5oIC0gTWVzYSBjdXN0b21pemF0aW9uIG9mIFByaXZhdGVNYW5hZ2VyIC0tLS0tPT09Ly8KKy8vCisvLyBDdXN0b21pemF0aW9uIG9mIGdsYTo6UHJpdmF0ZU1hbmFnZXIgZm9yIE1lc2EKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzd2l0Y2giCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW5rbm93bi1wcmFnbWFzIgorI2luY2x1ZGUgIkNvcmUvUHJpdmF0ZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJnbHNsYW5nL1B1YmxpYy9TaGFkZXJMYW5nLmgiCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorCituYW1lc3BhY2UgZ2xhIHsKKworY2xhc3MgTWVzYUdsYXNzVHJhbnNsYXRvcjsgIC8vIGZvcndhcmQgZGVjbGFyZQorCitjbGFzcyBNZXNhR2xhc3NNYW5hZ2VyIDogcHVibGljIGdsYTo6UHJpdmF0ZU1hbmFnZXIgeworcHVibGljOgorICAgTWVzYUdsYXNzTWFuYWdlcihjb25zdCBFU2hMYW5ndWFnZSk7CisgICB2aXJ0dWFsIH5NZXNhR2xhc3NNYW5hZ2VyKCk7CisgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKyAgIHZvaWQgY3JlYXRlQ29udGV4dCgpOworICAgTWVzYUdsYXNzVHJhbnNsYXRvciogZ2V0QmFja2VuZFRyYW5zbGF0b3IoKTsKKworcHJvdGVjdGVkOgorICAgdm9pZCBmcmVlTm9ucmV1c2FibGUoKTsKKyAgIHZvaWQgY3JlYXRlTm9ucmV1c2FibGUoKTsKK307CisKKy8vIFdlIHByb3ZpZGUgb3VyIG93biBvdmVybG9hZCBvZiBnZXRNYW5hZ2VyIHRvIHBhc3MgaW4gc29tZSBkYXRhCitNYW5hZ2VyKiBnZXRNYW5hZ2VyKGNvbnN0IEVTaExhbmd1YWdlKTsKKworfSAvLyBuYW1lc3BhY2UgZ2xhCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfbGV4ZXIubGwgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfbGV4ZXIubGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwMjM1MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9sZXhlci5sbApAQCAtMCwwICsxLDU3OCBAQAorJXsKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCwgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAic3RydG9kLmgiCisjaW5jbHVkZSAiYXN0LmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXIuaCIKKworc3RhdGljIGludCBjbGFzc2lmeV9pZGVudGlmaWVyKHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICosIGNvbnN0IGNoYXIgKik7CisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBZWV9OT19VTklTVERfSAorI2VuZGlmCisKKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04JCQkJCQlcCisgICBkbyB7CQkJCQkJCQlcCisgICAgICB5eWxsb2MtPnNvdXJjZSA9IDA7CQkJCQlcCisgICAgICB5eWxsb2MtPmZpcnN0X2NvbHVtbiA9IHl5Y29sdW1uICsgMTsJCQlcCisgICAgICB5eWxsb2MtPmZpcnN0X2xpbmUgPSB5eWxsb2MtPmxhc3RfbGluZSA9IHl5bGluZW5vICsgMTsJXAorICAgICAgeXljb2x1bW4gKz0geXlsZW5nOwkJCQkJXAorICAgICAgeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5Y29sdW1uICsgMTsJCQlcCisgICB9IHdoaWxlKDApOworCisjZGVmaW5lIFlZX1VTRVJfSU5JVCB5eWxpbmVubyA9IDA7IHl5Y29sdW1uID0gMDsKKworLyogQSBtYWNybyBmb3IgaGFuZGxpbmcgcmVzZXJ2ZWQgd29yZHMgYW5kIGtleXdvcmRzIGFjcm9zcyBsYW5ndWFnZSB2ZXJzaW9ucy4KKyAqCisgKiBDZXJ0YWluIHdvcmRzIHN0YXJ0IG91dCBhcyBpZGVudGlmaWVycywgYmVjb21lIHJlc2VydmVkIHdvcmRzIGluCisgKiBsYXRlciBsYW5ndWFnZSByZXZpc2lvbnMsIGFuZCBmaW5hbGx5IGJlY29tZSBsYW5ndWFnZSBrZXl3b3Jkcy4KKyAqIFRoaXMgbWF5IGhhcHBlbiBhdCBkaWZmZXJlbnQgdGltZXMgaW4gZGVza3RvcCBHTFNMIGFuZCBHTFNMIEVTLgorICoKKyAqIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGxleGVyIHJ1bGU6CisgKiBzYW1wbGVyQnVmZmVyICAgICAgIEtFWVdPUkQoMTMwLCAwLCAxNDAsIDAsIFNBTVBMRVJCVUZGRVIpCisgKgorICogVGhpcyBtZWFucyB0aGF0ICJzYW1wbGVyQnVmZmVyIiB3aWxsIGJlIHRyZWF0ZWQgYXM6CisgKiAtIGEga2V5d29yZCAoU0FNUExFUkJVRkZFUiB0b2tlbikgICAgICAgICAuLi5pbiBHTFNMID49IDEuNDAKKyAqIC0gYSByZXNlcnZlZCB3b3JkIC0gZXJyb3IgICAgICAgICAgICAgICAgIC4uLmluIEdMU0wgPj0gMS4zMAorICogLSBhbiBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW4gR0xTTCA8ICAxLjMwIG9yIEdMU0wgRVMKKyAqLworI2RlZmluZSBLRVlXT1JEKHJlc2VydmVkX2dsc2wsIHJlc2VydmVkX2dsc2xfZXMsCQkJXAorICAgICAgICAgICAgICAgIGFsbG93ZWRfZ2xzbCwgYWxsb3dlZF9nbHNsX2VzLCB0b2tlbikJCQlcCisgICBLRVlXT1JEX1dJVEhfQUxUKHJlc2VydmVkX2dsc2wsIHJlc2VydmVkX2dsc2xfZXMsCQkJXAorICAgICAgICAgICAgICAgICAgICBhbGxvd2VkX2dsc2wsIGFsbG93ZWRfZ2xzbF9lcywgZmFsc2UsIHRva2VuKQorCisvKioKKyAqIExpa2UgdGhlIEtFWVdPUkQgbWFjcm8sIGJ1dCB0aGUgd29yZCBpcyBhbHNvIHRyZWF0ZWQgYXMgYSBrZXl3b3JkCisgKiBpZiB0aGUgZ2l2ZW4gYm9vbGVhbiBleHByZXNzaW9uIGlzIHRydWUuCisgKi8KKyNkZWZpbmUgS0VZV09SRF9XSVRIX0FMVChyZXNlcnZlZF9nbHNsLCByZXNlcnZlZF9nbHNsX2VzLAkJXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRfZ2xzbCwgYWxsb3dlZF9nbHNsX2VzLAkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbHRfZXhwciwgdG9rZW4pCQkJCVwKKyAgIGRvIHsJCQkJCQkJCQlcCisgICAgICBpZiAoeXlleHRyYS0+aXNfdmVyc2lvbihhbGxvd2VkX2dsc2wsIGFsbG93ZWRfZ2xzbF9lcykJCVwKKyAgICAgICAgICB8fCAoYWx0X2V4cHIpKSB7CQkJCQkJXAorCSByZXR1cm4gdG9rZW47CQkJCQkJCVwKKyAgICAgIH0gZWxzZSBpZiAoeXlleHRyYS0+aXNfdmVyc2lvbihyZXNlcnZlZF9nbHNsLAkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZF9nbHNsX2VzKSkgewkJXAorCSBfbWVzYV9nbHNsX2Vycm9yKHl5bGxvYywgeXlleHRyYSwJCQkJXAorCQkJICAiaWxsZWdhbCB1c2Ugb2YgcmVzZXJ2ZWQgd29yZCBgJXMnIiwgeXl0ZXh0KTsJXAorCSByZXR1cm4gRVJST1JfVE9LOwkJCQkJCVwKKyAgICAgIH0gZWxzZSB7CQkJCQkJCQlcCisJIHl5bHZhbC0+aWRlbnRpZmllciA9IHN0cmR1cCh5eXRleHQpOwkJCQlcCisJIHJldHVybiBjbGFzc2lmeV9pZGVudGlmaWVyKHl5ZXh0cmEsIHl5dGV4dCk7CQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgIH0gd2hpbGUgKDApCisKKy8qKgorICogQSBtYWNybyBmb3IgaGFuZGxpbmcga2V5d29yZHMgdGhhdCBoYXZlIGJlZW4gcHJlc2VudCBpbiBHTFNMIHNpbmNlCisgKiBpdHMgb3JpZ2luLCBidXQgd2VyZSBjaGFuZ2VkIGludG8gcmVzZXJ2ZWQgd29yZHMgaW4gR0xTTCAzLjAwIEVTLgorICovCisjZGVmaW5lIERFUFJFQ0FURURfRVNfS0VZV09SRCh0b2tlbikJCQkJCVwKKyAgIGRvIHsJCQkJCQkJCQlcCisgICAgICBpZiAoeXlleHRyYS0+aXNfdmVyc2lvbigwLCAzMDApKSB7CQkJCVwKKwkgX21lc2FfZ2xzbF9lcnJvcih5eWxsb2MsIHl5ZXh0cmEsCQkJCVwKKwkJCSAgImlsbGVnYWwgdXNlIG9mIHJlc2VydmVkIHdvcmQgYCVzJyIsIHl5dGV4dCk7CVwKKwkgcmV0dXJuIEVSUk9SX1RPSzsJCQkJCQlcCisgICAgICB9IGVsc2UgewkJCQkJCQkJXAorICAgICAgICAgcmV0dXJuIHRva2VuOwkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgfSB3aGlsZSAoMCkKKworc3RhdGljIGludAorbGl0ZXJhbF9pbnRlZ2VyKGNoYXIgKnRleHQsIGludCBsZW4sIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJWVlTVFlQRSAqbHZhbCwgWVlMVFlQRSAqbGxvYywgaW50IGJhc2UpCit7CisgICBib29sIGlzX3VpbnQgPSAodGV4dFtsZW4gLSAxXSA9PSAndScgfHwKKwkJICAgdGV4dFtsZW4gLSAxXSA9PSAnVScpOworICAgY29uc3QgY2hhciAqZGlnaXRzID0gdGV4dDsKKworICAgLyogU2tpcCAiMHgiICovCisgICBpZiAoYmFzZSA9PSAxNikKKyAgICAgIGRpZ2l0cyArPSAyOworCisjaWZkZWYgX01TQ19WRVIKKyAgIHVuc2lnbmVkIF9faW50NjQgdmFsdWUgPSBfc3RydG91aTY0KGRpZ2l0cywgTlVMTCwgYmFzZSk7CisjZWxzZQorICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlID0gc3RydG91bGwoZGlnaXRzLCBOVUxMLCBiYXNlKTsKKyNlbmRpZgorCisgICBsdmFsLT5uID0gKGludCl2YWx1ZTsKKworICAgaWYgKHZhbHVlID4gVUlOVF9NQVgpIHsKKyAgICAgIC8qIE5vdGUgdGhhdCBzaWduZWQgMHhmZmZmZmZmZiBpcyB2YWxpZCwgbm90IG91dCBvZiByYW5nZSEgKi8KKyAgICAgIGlmIChzdGF0ZS0+aXNfdmVyc2lvbigxMzAsIDMwMCkpIHsKKwkgX21lc2FfZ2xzbF9lcnJvcihsbG9jLCBzdGF0ZSwKKwkJCSAgImxpdGVyYWwgdmFsdWUgYCVzJyBvdXQgb2YgcmFuZ2UiLCB0ZXh0KTsKKyAgICAgIH0gZWxzZSB7CisJIF9tZXNhX2dsc2xfd2FybmluZyhsbG9jLCBzdGF0ZSwKKwkJCSAgICAibGl0ZXJhbCB2YWx1ZSBgJXMnIG91dCBvZiByYW5nZSIsIHRleHQpOworICAgICAgfQorICAgfSBlbHNlIGlmIChiYXNlID09IDEwICYmICFpc191aW50ICYmICh1bnNpZ25lZCl2YWx1ZSA+ICh1bnNpZ25lZClJTlRfTUFYICsgMSkgeworICAgICAgLyogVHJpZXMgdG8gY2F0Y2ggdW5pbnRlbnRpb25hbGx5IHByb3ZpZGluZyBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICogTm90ZSB0aGF0IC0yMTQ3NDgzNjQ4IGlzIHBhcnNlZCBhcyAtKDIxNDc0ODM2NDgpLCBzbyB3ZSBkb24ndAorICAgICAgICogd2FudCB0byB3YXJuIGZvciBJTlRfTUFYLgorICAgICAgICovCisgICAgICBfbWVzYV9nbHNsX3dhcm5pbmcobGxvYywgc3RhdGUsCisJCQkgInNpZ25lZCBsaXRlcmFsIHZhbHVlIGAlcycgaXMgaW50ZXJwcmV0ZWQgYXMgJWQiLAorCQkJIHRleHQsIGx2YWwtPm4pOworICAgfQorICAgcmV0dXJuIGlzX3VpbnQgPyBVSU5UQ09OU1RBTlQgOiBJTlRDT05TVEFOVDsKK30KKworI2RlZmluZSBMSVRFUkFMX0lOVEVHRVIoYmFzZSkgXAorICAgbGl0ZXJhbF9pbnRlZ2VyKHl5dGV4dCwgeXlsZW5nLCB5eWV4dHJhLCB5eWx2YWwsIHl5bGxvYywgYmFzZSkKKworJX0KKworJW9wdGlvbiBiaXNvbi1icmlkZ2UgYmlzb24tbG9jYXRpb25zIHJlZW50cmFudCBub3l5d3JhcAorJW9wdGlvbiBub3VucHV0IG5veXlfdG9wX3N0YXRlCislb3B0aW9uIG5ldmVyLWludGVyYWN0aXZlCislb3B0aW9uIHByZWZpeD0iX21lc2FfZ2xzbF9sZXhlcl8iCislb3B0aW9uIGV4dHJhLXR5cGU9InN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICoiCisKKyV4IFBQIFBSQUdNQQorCitERUNfSU5UCQlbMS05XVswLTldKgorSEVYX0lOVAkJMFt4WF1bMC05YS1mQS1GXSsKK09DVF9JTlQJCTBbMC03XSoKK0lOVAkJKHtERUNfSU5UfXx7SEVYX0lOVH18e09DVF9JTlR9KQorU1BDCQlbIFx0XSoKK1NQQ1AJCVsgXHRdKworSEFTSAkJXntTUEN9I3tTUEN9CislJQorCitbIFxyXHRdKwkJOworCisgICAgLyogUHJlcHJvY2Vzc29yIHRva2Vucy4gKi8gCiteWyBcdF0qI1sgXHRdKiQJCQk7CiteWyBcdF0qI1sgXHRdKnZlcnNpb24JCXsgQkVHSU4gUFA7IHJldHVybiBWRVJTSU9OX1RPSzsgfQorXlsgXHRdKiNbIFx0XSpleHRlbnNpb24JCXsgQkVHSU4gUFA7IHJldHVybiBFWFRFTlNJT047IH0KK3tIQVNIfWxpbmV7U1BDUH17SU5UfXtTUENQfXtJTlR9e1NQQ30kIHsKKwkJCQkgICAvKiBFYXQgY2hhcmFjdGVycyB1bnRpbCB0aGUgZmlyc3QgZGlnaXQgaXMKKwkJCQkgICAgKiBlbmNvdW50ZXJlZAorCQkJCSAgICAqLworCQkJCSAgIGNoYXIgKnB0ciA9IHl5dGV4dDsKKwkJCQkgICB3aGlsZSAoIWlzZGlnaXQoKnB0cikpCisJCQkJICAgICAgcHRyKys7CisKKwkJCQkgICAvKiBTdWJ0cmFjdCBvbmUgZnJvbSB0aGUgbGluZSBudW1iZXIgYmVjYXVzZQorCQkJCSAgICAqIHl5bGluZW5vIGlzIHplcm8tYmFzZWQgaW5zdGVhZCBvZgorCQkJCSAgICAqIG9uZS1iYXNlZC4KKwkJCQkgICAgKi8KKwkJCQkgICB5eWxpbmVubyA9IHN0cnRvbChwdHIsICZwdHIsIDApIC0gMTsKKwkJCQkgICB5eWxsb2MtPnNvdXJjZSA9IHN0cnRvbChwdHIsIE5VTEwsIDApOworCQkJCX0KK3tIQVNIfWxpbmV7U1BDUH17SU5UfXtTUEN9JAl7CisJCQkJICAgLyogRWF0IGNoYXJhY3RlcnMgdW50aWwgdGhlIGZpcnN0IGRpZ2l0IGlzCisJCQkJICAgICogZW5jb3VudGVyZWQKKwkJCQkgICAgKi8KKwkJCQkgICBjaGFyICpwdHIgPSB5eXRleHQ7CisJCQkJICAgd2hpbGUgKCFpc2RpZ2l0KCpwdHIpKQorCQkJCSAgICAgIHB0cisrOworCisJCQkJICAgLyogU3VidHJhY3Qgb25lIGZyb20gdGhlIGxpbmUgbnVtYmVyIGJlY2F1c2UKKwkJCQkgICAgKiB5eWxpbmVubyBpcyB6ZXJvLWJhc2VkIGluc3RlYWQgb2YKKwkJCQkgICAgKiBvbmUtYmFzZWQuCisJCQkJICAgICovCisJCQkJICAgeXlsaW5lbm8gPSBzdHJ0b2wocHRyLCAmcHRyLCAwKSAtIDE7CisJCQkJfQorXntTUEN9I3tTUEN9cHJhZ21he1NQQ1B9ZGVidWd7U1BDfVwoe1NQQ31vbntTUEN9XCkgeworCQkJCSAgQkVHSU4gUFA7CisJCQkJICByZXR1cm4gUFJBR01BX0RFQlVHX09OOworCQkJCX0KK157U1BDfSN7U1BDfXByYWdtYXtTUENQfWRlYnVne1NQQ31cKHtTUEN9b2Zme1NQQ31cKSB7CisJCQkJICBCRUdJTiBQUDsKKwkJCQkgIHJldHVybiBQUkFHTUFfREVCVUdfT0ZGOworCQkJCX0KK157U1BDfSN7U1BDfXByYWdtYXtTUENQfW9wdGltaXple1NQQ31cKHtTUEN9b257U1BDfVwpIHsKKwkJCQkgIEJFR0lOIFBQOworCQkJCSAgcmV0dXJuIFBSQUdNQV9PUFRJTUlaRV9PTjsKKwkJCQl9Citee1NQQ30je1NQQ31wcmFnbWF7U1BDUH1vcHRpbWl6ZXtTUEN9XCh7U1BDfW9mZntTUEN9XCkgeworCQkJCSAgQkVHSU4gUFA7CisJCQkJICByZXR1cm4gUFJBR01BX09QVElNSVpFX09GRjsKKwkJCQl9Citee1NQQ30je1NQQ31wcmFnbWF7U1BDUH1TVERHTHtTUENQfWludmFyaWFudHtTUEN9XCh7U1BDfWFsbHtTUEN9XCkgeworCQkJCSAgQkVHSU4gUFA7CisJCQkJICByZXR1cm4gUFJBR01BX0lOVkFSSUFOVF9BTEw7CisJCQkJfQorXntTUEN9I3tTUEN9cHJhZ21he1NQQ1B9CXsgQkVHSU4gUFJBR01BOyB9CisKKzxQUkFHTUE+XG4JCQl7IEJFR0lOIDA7IHl5bGluZW5vKys7IHl5Y29sdW1uID0gMDsgfQorPFBSQUdNQT4uCQkJeyB9CisKKzxQUD5cL1wvW15cbl0qCQkJeyB9Cis8UFA+WyBcdFxyXSoJCQl7IH0KKzxQUD46CQkJCXJldHVybiBDT0xPTjsKKzxQUD5bX2EtekEtWl1bX2EtekEtWjAtOV0qCXsKKwkJCQkgICB5eWx2YWwtPmlkZW50aWZpZXIgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCQkgICByZXR1cm4gSURFTlRJRklFUjsKKwkJCQl9Cis8UFA+WzEtOV1bMC05XSoJCQl7CisJCQkJICAgIHl5bHZhbC0+biA9IHN0cnRvbCh5eXRleHQsIE5VTEwsIDEwKTsKKwkJCQkgICAgcmV0dXJuIElOVENPTlNUQU5UOworCQkJCX0KKzxQUD5cbgkJCQl7IEJFR0lOIDA7IHl5bGluZW5vKys7IHl5Y29sdW1uID0gMDsgcmV0dXJuIEVPTDsgfQorCitcbgkJeyB5eWxpbmVubysrOyB5eWNvbHVtbiA9IDA7IH0KKworYXR0cmlidXRlCURFUFJFQ0FURURfRVNfS0VZV09SRChBVFRSSUJVVEUpOworY29uc3QJCXJldHVybiBDT05TVF9UT0s7Citib29sCQlyZXR1cm4gQk9PTF9UT0s7CitmbG9hdAkJcmV0dXJuIEZMT0FUX1RPSzsKK2ludAkJcmV0dXJuIElOVF9UT0s7Cit1aW50CQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDMwMCwgVUlOVF9UT0spOworCiticmVhawkJcmV0dXJuIEJSRUFLOworY29udGludWUJcmV0dXJuIENPTlRJTlVFOworZG8JCXJldHVybiBETzsKK3doaWxlCQlyZXR1cm4gV0hJTEU7CitlbHNlCQlyZXR1cm4gRUxTRTsKK2ZvcgkJcmV0dXJuIEZPUjsKK2lmCQlyZXR1cm4gSUY7CitkaXNjYXJkCQlyZXR1cm4gRElTQ0FSRDsKK3JldHVybgkJcmV0dXJuIFJFVFVSTjsKKworYnZlYzIJCXJldHVybiBCVkVDMjsKK2J2ZWMzCQlyZXR1cm4gQlZFQzM7CitidmVjNAkJcmV0dXJuIEJWRUM0OworaXZlYzIJCXJldHVybiBJVkVDMjsKK2l2ZWMzCQlyZXR1cm4gSVZFQzM7CitpdmVjNAkJcmV0dXJuIElWRUM0OwordXZlYzIJCUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMzAwLCBVVkVDMik7Cit1dmVjMwkJS0VZV09SRCgxMzAsIDMwMCwgMTMwLCAzMDAsIFVWRUMzKTsKK3V2ZWM0CQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDMwMCwgVVZFQzQpOwordmVjMgkJcmV0dXJuIFZFQzI7Cit2ZWMzCQlyZXR1cm4gVkVDMzsKK3ZlYzQJCXJldHVybiBWRUM0OworbWF0MgkJcmV0dXJuIE1BVDJYMjsKK21hdDMJCXJldHVybiBNQVQzWDM7CittYXQ0CQlyZXR1cm4gTUFUNFg0OworbWF0MngyCQlLRVlXT1JEKDEyMCwgMzAwLCAxMjAsIDMwMCwgTUFUMlgyKTsKK21hdDJ4MwkJS0VZV09SRCgxMjAsIDMwMCwgMTIwLCAzMDAsIE1BVDJYMyk7CittYXQyeDQJCUtFWVdPUkQoMTIwLCAzMDAsIDEyMCwgMzAwLCBNQVQyWDQpOworbWF0M3gyCQlLRVlXT1JEKDEyMCwgMzAwLCAxMjAsIDMwMCwgTUFUM1gyKTsKK21hdDN4MwkJS0VZV09SRCgxMjAsIDMwMCwgMTIwLCAzMDAsIE1BVDNYMyk7CittYXQzeDQJCUtFWVdPUkQoMTIwLCAzMDAsIDEyMCwgMzAwLCBNQVQzWDQpOworbWF0NHgyCQlLRVlXT1JEKDEyMCwgMzAwLCAxMjAsIDMwMCwgTUFUNFgyKTsKK21hdDR4MwkJS0VZV09SRCgxMjAsIDMwMCwgMTIwLCAzMDAsIE1BVDRYMyk7CittYXQ0eDQJCUtFWVdPUkQoMTIwLCAzMDAsIDEyMCwgMzAwLCBNQVQ0WDQpOworCitpbgkJcmV0dXJuIElOX1RPSzsKK291dAkJcmV0dXJuIE9VVF9UT0s7Citpbm91dAkJcmV0dXJuIElOT1VUX1RPSzsKK3VuaWZvcm0JCXJldHVybiBVTklGT1JNOwordmFyeWluZwkJREVQUkVDQVRFRF9FU19LRVlXT1JEKFZBUllJTkcpOworY2VudHJvaWQJS0VZV09SRCgxMjAsIDMwMCwgMTIwLCAzMDAsIENFTlRST0lEKTsKK2ludmFyaWFudAlLRVlXT1JEKDEyMCwgMTAwLCAxMjAsIDEwMCwgSU5WQVJJQU5UKTsKK2ZsYXQJCUtFWVdPUkQoMTMwLCAxMDAsIDEzMCwgMzAwLCBGTEFUKTsKK3Ntb290aAkJS0VZV09SRCgxMzAsIDMwMCwgMTMwLCAzMDAsIFNNT09USCk7Citub3BlcnNwZWN0aXZlCUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMCwgTk9QRVJTUEVDVElWRSk7CisKK3NhbXBsZXIxRAlERVBSRUNBVEVEX0VTX0tFWVdPUkQoU0FNUExFUjFEKTsKK3NhbXBsZXIyRAlyZXR1cm4gU0FNUExFUjJEOworc2FtcGxlcjNECXJldHVybiBTQU1QTEVSM0Q7CitzYW1wbGVyQ3ViZQlyZXR1cm4gU0FNUExFUkNVQkU7CitzYW1wbGVyMURBcnJheQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDAsIFNBTVBMRVIxREFSUkFZKTsKK3NhbXBsZXIyREFycmF5CUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMzAwLCBTQU1QTEVSMkRBUlJBWSk7CitzYW1wbGVyMURTaGFkb3cJREVQUkVDQVRFRF9FU19LRVlXT1JEKFNBTVBMRVIxRFNIQURPVyk7CitzYW1wbGVyMkRTaGFkb3cJcmV0dXJuIFNBTVBMRVIyRFNIQURPVzsKK3NhbXBsZXJDdWJlU2hhZG93CUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMzAwLCBTQU1QTEVSQ1VCRVNIQURPVyk7CitzYW1wbGVyMURBcnJheVNoYWRvdwlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDAsIFNBTVBMRVIxREFSUkFZU0hBRE9XKTsKK3NhbXBsZXIyREFycmF5U2hhZG93CUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMzAwLCBTQU1QTEVSMkRBUlJBWVNIQURPVyk7Citpc2FtcGxlcjFECQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDAsIElTQU1QTEVSMUQpOworaXNhbXBsZXIyRAkJS0VZV09SRCgxMzAsIDMwMCwgMTMwLCAzMDAsIElTQU1QTEVSMkQpOworaXNhbXBsZXIzRAkJS0VZV09SRCgxMzAsIDMwMCwgMTMwLCAzMDAsIElTQU1QTEVSM0QpOworaXNhbXBsZXJDdWJlCQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDMwMCwgSVNBTVBMRVJDVUJFKTsKK2lzYW1wbGVyMURBcnJheQkJS0VZV09SRCgxMzAsIDMwMCwgMTMwLCAwLCBJU0FNUExFUjFEQVJSQVkpOworaXNhbXBsZXIyREFycmF5CQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDMwMCwgSVNBTVBMRVIyREFSUkFZKTsKK3VzYW1wbGVyMUQJCUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMCwgVVNBTVBMRVIxRCk7Cit1c2FtcGxlcjJECQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDMwMCwgVVNBTVBMRVIyRCk7Cit1c2FtcGxlcjNECQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDMwMCwgVVNBTVBMRVIzRCk7Cit1c2FtcGxlckN1YmUJCUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMzAwLCBVU0FNUExFUkNVQkUpOwordXNhbXBsZXIxREFycmF5CQlLRVlXT1JEKDEzMCwgMzAwLCAxMzAsIDAsIFVTQU1QTEVSMURBUlJBWSk7Cit1c2FtcGxlcjJEQXJyYXkJCUtFWVdPUkQoMTMwLCAzMDAsIDEzMCwgMzAwLCBVU0FNUExFUjJEQVJSQVkpOworCisgICAvKiBhZGRpdGlvbmFsIGtleXdvcmRzIGluIEFSQl90ZXh0dXJlX211bHRpc2FtcGxlLCBpbmNsdWRlZCBpbiBHTFNMIDEuNTAgKi8KKyAgIC8qIHRoZXNlIGFyZSByZXNlcnZlZCBidXQgbm90IGRlZmluZWQgaW4gR0xTTCAzLjAwICovCitzYW1wbGVyMkRNUyAgICAgICAgS0VZV09SRF9XSVRIX0FMVCgxNTAsIDMwMCwgMTUwLCAwLCB5eWV4dHJhLT5BUkJfdGV4dHVyZV9tdWx0aXNhbXBsZV9lbmFibGUsIFNBTVBMRVIyRE1TKTsKK2lzYW1wbGVyMkRNUyAgICAgICBLRVlXT1JEX1dJVEhfQUxUKDE1MCwgMzAwLCAxNTAsIDAsIHl5ZXh0cmEtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZSwgSVNBTVBMRVIyRE1TKTsKK3VzYW1wbGVyMkRNUyAgICAgICBLRVlXT1JEX1dJVEhfQUxUKDE1MCwgMzAwLCAxNTAsIDAsIHl5ZXh0cmEtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZSwgVVNBTVBMRVIyRE1TKTsKK3NhbXBsZXIyRE1TQXJyYXkgICBLRVlXT1JEX1dJVEhfQUxUKDE1MCwgMzAwLCAxNTAsIDAsIHl5ZXh0cmEtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZSwgU0FNUExFUjJETVNBUlJBWSk7Citpc2FtcGxlcjJETVNBcnJheSAgS0VZV09SRF9XSVRIX0FMVCgxNTAsIDMwMCwgMTUwLCAwLCB5eWV4dHJhLT5BUkJfdGV4dHVyZV9tdWx0aXNhbXBsZV9lbmFibGUsIElTQU1QTEVSMkRNU0FSUkFZKTsKK3VzYW1wbGVyMkRNU0FycmF5ICBLRVlXT1JEX1dJVEhfQUxUKDE1MCwgMzAwLCAxNTAsIDAsIHl5ZXh0cmEtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZSwgVVNBTVBMRVIyRE1TQVJSQVkpOworCisgICAvKiBrZXl3b3JkcyBhdmFpbGFibGUgd2l0aCBBUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheV9lbmFibGUgZXh0ZW5zaW9uIG9uIGRlc2t0b3AgR0xTTCAqLworc2FtcGxlckN1YmVBcnJheSAgIEtFWVdPUkRfV0lUSF9BTFQoNDAwLCAwLCA0MDAsIDAsIHl5ZXh0cmEtPkFSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5X2VuYWJsZSwgU0FNUExFUkNVQkVBUlJBWSk7Citpc2FtcGxlckN1YmVBcnJheSBLRVlXT1JEX1dJVEhfQUxUKDQwMCwgMCwgNDAwLCAwLCB5eWV4dHJhLT5BUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheV9lbmFibGUsIElTQU1QTEVSQ1VCRUFSUkFZKTsKK3VzYW1wbGVyQ3ViZUFycmF5IEtFWVdPUkRfV0lUSF9BTFQoNDAwLCAwLCA0MDAsIDAsIHl5ZXh0cmEtPkFSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5X2VuYWJsZSwgVVNBTVBMRVJDVUJFQVJSQVkpOworc2FtcGxlckN1YmVBcnJheVNoYWRvdyAgIEtFWVdPUkRfV0lUSF9BTFQoNDAwLCAwLCA0MDAsIDAsIHl5ZXh0cmEtPkFSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5X2VuYWJsZSwgU0FNUExFUkNVQkVBUlJBWVNIQURPVyk7CisKK3NhbXBsZXJFeHRlcm5hbE9FUwkJeworCQkJICBpZiAoeXlleHRyYS0+T0VTX0VHTF9pbWFnZV9leHRlcm5hbF9lbmFibGUpCisJCQkgICAgIHJldHVybiBTQU1QTEVSRVhURVJOQUxPRVM7CisJCQkgIGVsc2UKKwkJCSAgICAgcmV0dXJuIElERU5USUZJRVI7CisJCX0KKworICAgLyoga2V5d29yZHMgYXZhaWxhYmxlIHdpdGggQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlICovCitpbWFnZTFEICAgICAgICAgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBJTUFHRTFEKTsKK2ltYWdlMkQgICAgICAgICBLRVlXT1JEX1dJVEhfQUxUKDEzMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIElNQUdFMkQpOworaW1hZ2UzRCAgICAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSU1BR0UzRCk7CitpbWFnZTJEUmVjdCAgICAgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBJTUFHRTJEUkVDVCk7CitpbWFnZUN1YmUgICAgICAgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBJTUFHRUNVQkUpOworaW1hZ2VCdWZmZXIgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSU1BR0VCVUZGRVIpOworaW1hZ2UxREFycmF5ICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSU1BR0UxREFSUkFZKTsKK2ltYWdlMkRBcnJheSAgICBLRVlXT1JEX1dJVEhfQUxUKDEzMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIElNQUdFMkRBUlJBWSk7CitpbWFnZUN1YmVBcnJheSAgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBJTUFHRUNVQkVBUlJBWSk7CitpbWFnZTJETVMgICAgICAgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBJTUFHRTJETVMpOworaW1hZ2UyRE1TQXJyYXkgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSU1BR0UyRE1TQVJSQVkpOworaWltYWdlMUQgICAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSUlNQUdFMUQpOworaWltYWdlMkQgICAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSUlNQUdFMkQpOworaWltYWdlM0QgICAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSUlNQUdFM0QpOworaWltYWdlMkRSZWN0ICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSUlNQUdFMkRSRUNUKTsKK2lpbWFnZUN1YmUgICAgICBLRVlXT1JEX1dJVEhfQUxUKDEzMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIElJTUFHRUNVQkUpOworaWltYWdlQnVmZmVyICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSUlNQUdFQlVGRkVSKTsKK2lpbWFnZTFEQXJyYXkgICBLRVlXT1JEX1dJVEhfQUxUKDEzMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIElJTUFHRTFEQVJSQVkpOworaWltYWdlMkRBcnJheSAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSUlNQUdFMkRBUlJBWSk7CitpaW1hZ2VDdWJlQXJyYXkgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBJSU1BR0VDVUJFQVJSQVkpOworaWltYWdlMkRNUyAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgSUlNQUdFMkRNUyk7CitpaW1hZ2UyRE1TQXJyYXkgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBJSU1BR0UyRE1TQVJSQVkpOwordWltYWdlMUQgICAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVUlNQUdFMUQpOwordWltYWdlMkQgICAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVUlNQUdFMkQpOwordWltYWdlM0QgICAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVUlNQUdFM0QpOwordWltYWdlMkRSZWN0ICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVUlNQUdFMkRSRUNUKTsKK3VpbWFnZUN1YmUgICAgICBLRVlXT1JEX1dJVEhfQUxUKDEzMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIFVJTUFHRUNVQkUpOwordWltYWdlQnVmZmVyICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVUlNQUdFQlVGRkVSKTsKK3VpbWFnZTFEQXJyYXkgICBLRVlXT1JEX1dJVEhfQUxUKDEzMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIFVJTUFHRTFEQVJSQVkpOwordWltYWdlMkRBcnJheSAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVUlNQUdFMkRBUlJBWSk7Cit1aW1hZ2VDdWJlQXJyYXkgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBVSU1BR0VDVUJFQVJSQVkpOwordWltYWdlMkRNUyAgICAgIEtFWVdPUkRfV0lUSF9BTFQoMTMwLCAzMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVUlNQUdFMkRNUyk7Cit1aW1hZ2UyRE1TQXJyYXkgS0VZV09SRF9XSVRIX0FMVCgxMzAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBVSU1BR0UyRE1TQVJSQVkpOworaW1hZ2UxRFNoYWRvdyAgICAgICAgICAgS0VZV09SRCgxMzAsIDMwMCwgMCwgMCwgSU1BR0UxRFNIQURPVyk7CitpbWFnZTJEU2hhZG93ICAgICAgICAgICBLRVlXT1JEKDEzMCwgMzAwLCAwLCAwLCBJTUFHRTJEU0hBRE9XKTsKK2ltYWdlMURBcnJheVNoYWRvdyAgICAgIEtFWVdPUkQoMTMwLCAzMDAsIDAsIDAsIElNQUdFMURBUlJBWVNIQURPVyk7CitpbWFnZTJEQXJyYXlTaGFkb3cgICAgICBLRVlXT1JEKDEzMCwgMzAwLCAwLCAwLCBJTUFHRTJEQVJSQVlTSEFET1cpOworCitjb2hlcmVudAlLRVlXT1JEX1dJVEhfQUxUKDQyMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIENPSEVSRU5UKTsKK3ZvbGF0aWxlCUtFWVdPUkRfV0lUSF9BTFQoMTEwLCAxMDAsIDQyMCwgMCwgeXlleHRyYS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSwgVk9MQVRJTEUpOworcmVzdHJpY3QJS0VZV09SRF9XSVRIX0FMVCg0MjAsIDMwMCwgNDIwLCAwLCB5eWV4dHJhLT5BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmVfZW5hYmxlLCBSRVNUUklDVCk7CityZWFkb25seQlLRVlXT1JEX1dJVEhfQUxUKDQyMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIFJFQURPTkxZKTsKK3dyaXRlb25seQlLRVlXT1JEX1dJVEhfQUxUKDQyMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUsIFdSSVRFT05MWSk7CisKK2F0b21pY191aW50ICAgICBLRVlXT1JEX1dJVEhfQUxUKDQyMCwgMzAwLCA0MjAsIDAsIHl5ZXh0cmEtPkFSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzX2VuYWJsZSwgQVRPTUlDX1VJTlQpOworCitzdHJ1Y3QJCXJldHVybiBTVFJVQ1Q7Cit2b2lkCQlyZXR1cm4gVk9JRF9UT0s7CisKK2xheW91dAkJeworCQkgIGlmICgoeXlleHRyYS0+aXNfdmVyc2lvbigxNDAsIDMwMCkpCisJCSAgICAgIHx8IHl5ZXh0cmEtPkFNRF9jb25zZXJ2YXRpdmVfZGVwdGhfZW5hYmxlCisJCSAgICAgIHx8IHl5ZXh0cmEtPkFSQl9jb25zZXJ2YXRpdmVfZGVwdGhfZW5hYmxlCisJCSAgICAgIHx8IHl5ZXh0cmEtPkFSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb25fZW5hYmxlCisgICAgICAgICAgICAgICAgICAgICAgfHwgeXlleHRyYS0+aGFzX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzKCkKKwkJICAgICAgfHwgeXlleHRyYS0+QVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdF9lbmFibGUKKwkJICAgICAgfHwgeXlleHRyYS0+QVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zX2VuYWJsZQorICAgICAgICAgICAgICAgICAgICAgIHx8IHl5ZXh0cmEtPkFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2tfZW5hYmxlCisgICAgICAgICAgICAgICAgICAgICAgfHwgeXlleHRyYS0+QVJCX2NvbXB1dGVfc2hhZGVyX2VuYWJsZSkgeworCQkgICAgICByZXR1cm4gTEFZT1VUX1RPSzsKKwkJICAgfSBlbHNlIHsKKwkJICAgICAgeXlsdmFsLT5pZGVudGlmaWVyID0gc3RyZHVwKHl5dGV4dCk7CisJCSAgICAgIHJldHVybiBjbGFzc2lmeV9pZGVudGlmaWVyKHl5ZXh0cmEsIHl5dGV4dCk7CisJCSAgIH0KKwkJfQorCitcK1wrCQlyZXR1cm4gSU5DX09QOworLS0JCXJldHVybiBERUNfT1A7CitcPD0JCXJldHVybiBMRV9PUDsKKz49CQlyZXR1cm4gR0VfT1A7Cis9PQkJcmV0dXJuIEVRX09QOworIT0JCXJldHVybiBORV9PUDsKKyYmCQlyZXR1cm4gQU5EX09QOworXHxcfAkJcmV0dXJuIE9SX09QOworIl5eIgkJcmV0dXJuIFhPUl9PUDsKKyI8PCIJCXJldHVybiBMRUZUX09QOworIj4+IgkJcmV0dXJuIFJJR0hUX09QOworCitcKj0JCXJldHVybiBNVUxfQVNTSUdOOworXC89CQlyZXR1cm4gRElWX0FTU0lHTjsKK1wrPQkJcmV0dXJuIEFERF9BU1NJR047CitcJT0JCXJldHVybiBNT0RfQVNTSUdOOworXDxcPD0JCXJldHVybiBMRUZUX0FTU0lHTjsKKz4+PQkJcmV0dXJuIFJJR0hUX0FTU0lHTjsKKyY9CQlyZXR1cm4gQU5EX0FTU0lHTjsKKyJePSIJCXJldHVybiBYT1JfQVNTSUdOOworXHw9CQlyZXR1cm4gT1JfQVNTSUdOOworLT0JCXJldHVybiBTVUJfQVNTSUdOOworCitbMS05XVswLTldKlt1VV0/CXsKKwkJCSAgICByZXR1cm4gTElURVJBTF9JTlRFR0VSKDEwKTsKKwkJCX0KKzBbeFhdWzAtOWEtZkEtRl0rW3VVXT8JeworCQkJICAgIHJldHVybiBMSVRFUkFMX0lOVEVHRVIoMTYpOworCQkJfQorMFswLTddKlt1VV0/CQl7CisJCQkgICAgcmV0dXJuIExJVEVSQUxfSU5URUdFUig4KTsKKwkJCX0KKworWzAtOV0rXC5bMC05XSsoW2VFXVsrLV0/WzAtOV0rKT9bZkZdPwl7CisJCQkgICAgeXlsdmFsLT5yZWFsID0gZ2xzbF9zdHJ0b2YoeXl0ZXh0LCBOVUxMKTsKKwkJCSAgICByZXR1cm4gRkxPQVRDT05TVEFOVDsKKwkJCX0KK1wuWzAtOV0rKFtlRV1bKy1dP1swLTldKyk/W2ZGXT8JCXsKKwkJCSAgICB5eWx2YWwtPnJlYWwgPSBnbHNsX3N0cnRvZih5eXRleHQsIE5VTEwpOworCQkJICAgIHJldHVybiBGTE9BVENPTlNUQU5UOworCQkJfQorWzAtOV0rXC4oW2VFXVsrLV0/WzAtOV0rKT9bZkZdPwkJeworCQkJICAgIHl5bHZhbC0+cmVhbCA9IGdsc2xfc3RydG9mKHl5dGV4dCwgTlVMTCk7CisJCQkgICAgcmV0dXJuIEZMT0FUQ09OU1RBTlQ7CisJCQl9CitbMC05XStbZUVdWystXT9bMC05XStbZkZdPwkJeworCQkJICAgIHl5bHZhbC0+cmVhbCA9IGdsc2xfc3RydG9mKHl5dGV4dCwgTlVMTCk7CisJCQkgICAgcmV0dXJuIEZMT0FUQ09OU1RBTlQ7CisJCQl9CitbMC05XStbZkZdCQl7CisJCQkgICAgeXlsdmFsLT5yZWFsID0gZ2xzbF9zdHJ0b2YoeXl0ZXh0LCBOVUxMKTsKKwkJCSAgICByZXR1cm4gRkxPQVRDT05TVEFOVDsKKwkJCX0KKwordHJ1ZQkJCXsKKwkJCSAgICB5eWx2YWwtPm4gPSAxOworCQkJICAgIHJldHVybiBCT09MQ09OU1RBTlQ7CisJCQl9CitmYWxzZQkJCXsKKwkJCSAgICB5eWx2YWwtPm4gPSAwOworCQkJICAgIHJldHVybiBCT09MQ09OU1RBTlQ7CisJCQl9CisKKworICAgIC8qIFJlc2VydmVkIHdvcmRzIGluIEdMU0wgMS4xMC4gKi8KK2FzbQkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgQVNNKTsKK2NsYXNzCQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBDTEFTUyk7Cit1bmlvbgkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgVU5JT04pOworZW51bQkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgRU5VTSk7Cit0eXBlZGVmCQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBUWVBFREVGKTsKK3RlbXBsYXRlCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIFRFTVBMQVRFKTsKK3RoaXMJCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIFRISVMpOworcGFja2VkCQlLRVlXT1JEX1dJVEhfQUxUKDExMCwgMTAwLCAxNDAsIDMwMCwgeXlleHRyYS0+QVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdF9lbmFibGUsIFBBQ0tFRF9UT0spOworZ290bwkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgR09UTyk7Citzd2l0Y2gJCUtFWVdPUkQoMTEwLCAxMDAsIDEzMCwgMzAwLCBTV0lUQ0gpOworZGVmYXVsdAkJS0VZV09SRCgxMTAsIDEwMCwgMTMwLCAzMDAsIERFRkFVTFQpOworaW5saW5lCQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBJTkxJTkVfVE9LKTsKK25vaW5saW5lCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIE5PSU5MSU5FKTsKK3B1YmxpYwkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgUFVCTElDX1RPSyk7CitzdGF0aWMJCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIFNUQVRJQyk7CitleHRlcm4JCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIEVYVEVSTik7CitleHRlcm5hbAlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBFWFRFUk5BTCk7CitpbnRlcmZhY2UJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgSU5URVJGQUNFKTsKK2xvbmcJCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIExPTkdfVE9LKTsKK3Nob3J0CQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBTSE9SVF9UT0spOworZG91YmxlCQlLRVlXT1JEKDExMCwgMTAwLCA0MDAsIDAsIERPVUJMRV9UT0spOworaGFsZgkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgSEFMRik7CitmaXhlZAkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgRklYRURfVE9LKTsKK3Vuc2lnbmVkCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIFVOU0lHTkVEKTsKK2lucHV0CQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBJTlBVVF9UT0spOworb3V0cHV0CQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBPVVRQVVQpOworaHZlYzIJCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIEhWRUMyKTsKK2h2ZWMzCQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBIVkVDMyk7CitodmVjNAkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgSFZFQzQpOworZHZlYzIJCUtFWVdPUkQoMTEwLCAxMDAsIDQwMCwgMCwgRFZFQzIpOworZHZlYzMJCUtFWVdPUkQoMTEwLCAxMDAsIDQwMCwgMCwgRFZFQzMpOworZHZlYzQJCUtFWVdPUkQoMTEwLCAxMDAsIDQwMCwgMCwgRFZFQzQpOworZnZlYzIJCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIEZWRUMyKTsKK2Z2ZWMzCQlLRVlXT1JEKDExMCwgMTAwLCAwLCAwLCBGVkVDMyk7CitmdmVjNAkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgRlZFQzQpOworc2FtcGxlcjJEUmVjdAkJREVQUkVDQVRFRF9FU19LRVlXT1JEKFNBTVBMRVIyRFJFQ1QpOworc2FtcGxlcjNEUmVjdAkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgU0FNUExFUjNEUkVDVCk7CitzYW1wbGVyMkRSZWN0U2hhZG93CURFUFJFQ0FURURfRVNfS0VZV09SRChTQU1QTEVSMkRSRUNUU0hBRE9XKTsKK3NpemVvZgkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgU0laRU9GKTsKK2Nhc3QJCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIENBU1QpOworbmFtZXNwYWNlCUtFWVdPUkQoMTEwLCAxMDAsIDAsIDAsIE5BTUVTUEFDRSk7Cit1c2luZwkJS0VZV09SRCgxMTAsIDEwMCwgMCwgMCwgVVNJTkcpOworCisgICAgLyogQWRkaXRpb25hbCByZXNlcnZlZCB3b3JkcyBpbiBHTFNMIDEuMjAuICovCitsb3dwCQlLRVlXT1JEKDEyMCwgMTAwLCAxMzAsIDEwMCwgTE9XUCk7CittZWRpdW1wCQlLRVlXT1JEKDEyMCwgMTAwLCAxMzAsIDEwMCwgTUVESVVNUCk7CitoaWdocAkJS0VZV09SRCgxMjAsIDEwMCwgMTMwLCAxMDAsIEhJR0hQKTsKK3ByZWNpc2lvbglLRVlXT1JEKDEyMCwgMTAwLCAxMzAsIDEwMCwgUFJFQ0lTSU9OKTsKKworICAgIC8qIEFkZGl0aW9uYWwgcmVzZXJ2ZWQgd29yZHMgaW4gR0xTTCAxLjMwLiAqLworY2FzZQkJS0VZV09SRCgxMzAsIDMwMCwgMTMwLCAzMDAsIENBU0UpOworY29tbW9uCQlLRVlXT1JEKDEzMCwgMzAwLCAwLCAwLCBDT01NT04pOworcGFydGl0aW9uCUtFWVdPUkQoMTMwLCAzMDAsIDAsIDAsIFBBUlRJVElPTik7CithY3RpdmUJCUtFWVdPUkQoMTMwLCAzMDAsIDAsIDAsIEFDVElWRSk7CitzdXBlcnAJCUtFWVdPUkQoMTMwLCAxMDAsIDAsIDAsIFNVUEVSUCk7CitzYW1wbGVyQnVmZmVyCUtFWVdPUkQoMTMwLCAzMDAsIDE0MCwgMCwgU0FNUExFUkJVRkZFUik7CitmaWx0ZXIJCUtFWVdPUkQoMTMwLCAzMDAsIDAsIDAsIEZJTFRFUik7Cityb3dfbWFqb3IJS0VZV09SRF9XSVRIX0FMVCgxMzAsIDAsIDE0MCwgMCwgeXlleHRyYS0+QVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdF9lbmFibGUgJiYgIXl5ZXh0cmEtPmVzX3NoYWRlciwgUk9XX01BSk9SKTsKKworICAgIC8qIEFkZGl0aW9uYWwgcmVzZXJ2ZWQgd29yZHMgaW4gR0xTTCAxLjQwICovCitpc2FtcGxlcjJEUmVjdAlLRVlXT1JEKDE0MCwgMzAwLCAxNDAsIDAsIElTQU1QTEVSMkRSRUNUKTsKK3VzYW1wbGVyMkRSZWN0CUtFWVdPUkQoMTQwLCAzMDAsIDE0MCwgMCwgVVNBTVBMRVIyRFJFQ1QpOworaXNhbXBsZXJCdWZmZXIJS0VZV09SRCgxNDAsIDMwMCwgMTQwLCAwLCBJU0FNUExFUkJVRkZFUik7Cit1c2FtcGxlckJ1ZmZlcglLRVlXT1JEKDE0MCwgMzAwLCAxNDAsIDAsIFVTQU1QTEVSQlVGRkVSKTsKKworICAgIC8qIEFkZGl0aW9uYWwgcmVzZXJ2ZWQgd29yZHMgaW4gR0xTTCBFUyAzLjAwICovCityZXNvdXJjZQlLRVlXT1JEKDAsIDMwMCwgMCwgMCwgUkVTT1VSQ0UpOworcGF0Y2gJCUtFWVdPUkQoMCwgMzAwLCAwLCAwLCBQQVRDSCk7CitzYW1wbGUJCUtFWVdPUkRfV0lUSF9BTFQoNDAwLCAzMDAsIDQwMCwgMCwgeXlleHRyYS0+QVJCX2dwdV9zaGFkZXI1X2VuYWJsZSwgU0FNUExFKTsKK3N1YnJvdXRpbmUJS0VZV09SRCgwLCAzMDAsIDAsIDAsIFNVQlJPVVRJTkUpOworCisKK1tfYS16QS1aXVtfYS16QS1aMC05XSoJeworCQkJICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSA9IHl5ZXh0cmE7CisJCQkgICAgdm9pZCAqY3R4ID0gc3RhdGU7CQorCQkJICAgIHl5bHZhbC0+aWRlbnRpZmllciA9IHJhbGxvY19zdHJkdXAoY3R4LCB5eXRleHQpOworCQkJICAgIHJldHVybiBjbGFzc2lmeV9pZGVudGlmaWVyKHN0YXRlLCB5eXRleHQpOworCQkJfQorCisuCQkJeyByZXR1cm4geXl0ZXh0WzBdOyB9CisKKyUlCisKK2ludAorY2xhc3NpZnlfaWRlbnRpZmllcihzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICBpZiAoc3RhdGUtPnN5bWJvbHMtPmdldF92YXJpYWJsZShuYW1lKSB8fCBzdGF0ZS0+c3ltYm9scy0+Z2V0X2Z1bmN0aW9uKG5hbWUpKQorICAgICAgcmV0dXJuIElERU5USUZJRVI7CisgICBlbHNlIGlmIChzdGF0ZS0+c3ltYm9scy0+Z2V0X3R5cGUobmFtZSkpCisgICAgICByZXR1cm4gVFlQRV9JREVOVElGSUVSOworICAgZWxzZQorICAgICAgcmV0dXJuIE5FV19JREVOVElGSUVSOworfQorCit2b2lkCitfbWVzYV9nbHNsX2xleGVyX2N0b3Ioc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICB5eWxleF9pbml0X2V4dHJhKHN0YXRlLCAmIHN0YXRlLT5zY2FubmVyKTsKKyAgIHl5X3NjYW5fc3RyaW5nKHN0cmluZywgc3RhdGUtPnNjYW5uZXIpOworfQorCit2b2lkCitfbWVzYV9nbHNsX2xleGVyX2R0b3Ioc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgeXlsZXhfZGVzdHJveShzdGF0ZS0+c2Nhbm5lcik7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfcGFyc2VyLnl5IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX3BhcnNlci55eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlkNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX3BhcnNlci55eQpAQCAtMCwwICsxLDI1NTggQEAKKyV7CisvKgorICogQ29weXJpZ2h0IMKpIDIwMDgsIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiYXN0LmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgIm1haW4vY29udGV4dC5oIgorCisjdW5kZWYgeXllcnJvcgorCitzdGF0aWMgdm9pZCB5eWVycm9yKFlZTFRZUEUgKmxvYywgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3QsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgIF9tZXNhX2dsc2xfZXJyb3IobG9jLCBzdCwgIiVzIiwgbXNnKTsKK30KKworc3RhdGljIGludAorX21lc2FfZ2xzbF9sZXgoWVlTVFlQRSAqdmFsLCBZWUxUWVBFICpsb2MsIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgcmV0dXJuIF9tZXNhX2dsc2xfbGV4ZXJfbGV4KHZhbCwgbG9jLCBzdGF0ZS0+c2Nhbm5lcik7Cit9CisKK3N0YXRpYyBib29sIG1hdGNoX2xheW91dF9xdWFsaWZpZXIoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIC8qIEZyb20gdGhlIEdMU0wgMS41MCBzcGVjLCBzZWN0aW9uIDQuMy44IChMYXlvdXQgUXVhbGlmaWVycyk6CisgICAgKgorICAgICogICAgICJUaGUgdG9rZW5zIGluIGFueSBsYXlvdXQtcXVhbGlmaWVyLWlkLWxpc3QgLi4uIGFyZSBub3QgY2FzZQorICAgICogICAgIHNlbnNpdGl2ZSwgdW5sZXNzIGV4cGxpY2l0bHkgbm90ZWQgb3RoZXJ3aXNlLiIKKyAgICAqCisgICAgKiBUaGUgdGV4dCAidW5sZXNzIGV4cGxpY2l0bHkgbm90ZWQgb3RoZXJ3aXNlIiBhcHBlYXJzIHRvIGJlCisgICAgKiB2YWN1b3VzLS1ubyBkZXNrdG9wIEdMU0wgc3BlYyAodXAgdGhyb3VnaCBHTFNMIDQuNDApIG5vdGVzCisgICAgKiBvdGhlcndpc2UuCisgICAgKgorICAgICogSG93ZXZlciwgdGhlIEdMU0wgRVMgMy4wMCBzcGVjIHNheXMsIGluIHNlY3Rpb24gNC4zLjggKExheW91dAorICAgICogUXVhbGlmaWVycyk6CisgICAgKgorICAgICogICAgICJBcyBmb3Igb3RoZXIgaWRlbnRpZmllcnMsIHRoZXkgYXJlIGNhc2Ugc2Vuc2l0aXZlLiIKKyAgICAqCisgICAgKiBTbyB3ZSBuZWVkIHRvIGRvIGEgY2FzZS1zZW5zaXRpdmUgb3IgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoLAorICAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIGNvbXBpbGluZyBmb3IgR0xTTCBFUy4KKyAgICAqLworICAgaWYgKHN0YXRlLT5lc19zaGFkZXIpCisgICAgICByZXR1cm4gc3RyY21wKHMxLCBzMik7CisgICBlbHNlCisgICAgICByZXR1cm4gc3RyY2FzZWNtcChzMSwgczIpOworfQorJX0KKworJWV4cGVjdCAwCisKKyVwdXJlLXBhcnNlcgorJWVycm9yLXZlcmJvc2UKKworJWxvY2F0aW9ucworJWluaXRpYWwtYWN0aW9uIHsKKyAgIEAkLmZpcnN0X2xpbmUgPSAxOworICAgQCQuZmlyc3RfY29sdW1uID0gMTsKKyAgIEAkLmxhc3RfbGluZSA9IDE7CisgICBAJC5sYXN0X2NvbHVtbiA9IDE7CisgICBAJC5zb3VyY2UgPSAwOworfQorCislbGV4LXBhcmFtICAge3N0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZX0KKyVwYXJzZS1wYXJhbSB7c3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlfQorCisldW5pb24geworICAgaW50IG47CisgICBmbG9hdCByZWFsOworICAgY29uc3QgY2hhciAqaWRlbnRpZmllcjsKKworICAgc3RydWN0IGFzdF90eXBlX3F1YWxpZmllciB0eXBlX3F1YWxpZmllcjsKKworICAgYXN0X25vZGUgKm5vZGU7CisgICBhc3RfdHlwZV9zcGVjaWZpZXIgKnR5cGVfc3BlY2lmaWVyOworICAgYXN0X2FycmF5X3NwZWNpZmllciAqYXJyYXlfc3BlY2lmaWVyOworICAgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlICpmdWxseV9zcGVjaWZpZWRfdHlwZTsKKyAgIGFzdF9mdW5jdGlvbiAqZnVuY3Rpb247CisgICBhc3RfcGFyYW1ldGVyX2RlY2xhcmF0b3IgKnBhcmFtZXRlcl9kZWNsYXJhdG9yOworICAgYXN0X2Z1bmN0aW9uX2RlZmluaXRpb24gKmZ1bmN0aW9uX2RlZmluaXRpb247CisgICBhc3RfY29tcG91bmRfc3RhdGVtZW50ICpjb21wb3VuZF9zdGF0ZW1lbnQ7CisgICBhc3RfZXhwcmVzc2lvbiAqZXhwcmVzc2lvbjsKKyAgIGFzdF9kZWNsYXJhdG9yX2xpc3QgKmRlY2xhcmF0b3JfbGlzdDsKKyAgIGFzdF9zdHJ1Y3Rfc3BlY2lmaWVyICpzdHJ1Y3Rfc3BlY2lmaWVyOworICAgYXN0X2RlY2xhcmF0aW9uICpkZWNsYXJhdGlvbjsKKyAgIGFzdF9zd2l0Y2hfYm9keSAqc3dpdGNoX2JvZHk7CisgICBhc3RfY2FzZV9sYWJlbCAqY2FzZV9sYWJlbDsKKyAgIGFzdF9jYXNlX2xhYmVsX2xpc3QgKmNhc2VfbGFiZWxfbGlzdDsKKyAgIGFzdF9jYXNlX3N0YXRlbWVudCAqY2FzZV9zdGF0ZW1lbnQ7CisgICBhc3RfY2FzZV9zdGF0ZW1lbnRfbGlzdCAqY2FzZV9zdGF0ZW1lbnRfbGlzdDsKKyAgIGFzdF9pbnRlcmZhY2VfYmxvY2sgKmludGVyZmFjZV9ibG9jazsKKworICAgc3RydWN0IHsKKyAgICAgIGFzdF9ub2RlICpjb25kOworICAgICAgYXN0X2V4cHJlc3Npb24gKnJlc3Q7CisgICB9IGZvcl9yZXN0X3N0YXRlbWVudDsKKworICAgc3RydWN0IHsKKyAgICAgIGFzdF9ub2RlICp0aGVuX3N0YXRlbWVudDsKKyAgICAgIGFzdF9ub2RlICplbHNlX3N0YXRlbWVudDsKKyAgIH0gc2VsZWN0aW9uX3Jlc3Rfc3RhdGVtZW50OworfQorCisldG9rZW4gQVRUUklCVVRFIENPTlNUX1RPSyBCT09MX1RPSyBGTE9BVF9UT0sgSU5UX1RPSyBVSU5UX1RPSworJXRva2VuIEJSRUFLIENPTlRJTlVFIERPIEVMU0UgRk9SIElGIERJU0NBUkQgUkVUVVJOIFNXSVRDSCBDQVNFIERFRkFVTFQKKyV0b2tlbiBCVkVDMiBCVkVDMyBCVkVDNCBJVkVDMiBJVkVDMyBJVkVDNCBVVkVDMiBVVkVDMyBVVkVDNCBWRUMyIFZFQzMgVkVDNAorJXRva2VuIENFTlRST0lEIElOX1RPSyBPVVRfVE9LIElOT1VUX1RPSyBVTklGT1JNIFZBUllJTkcKKyV0b2tlbiBOT1BFUlNQRUNUSVZFIEZMQVQgU01PT1RICisldG9rZW4gTUFUMlgyIE1BVDJYMyBNQVQyWDQKKyV0b2tlbiBNQVQzWDIgTUFUM1gzIE1BVDNYNAorJXRva2VuIE1BVDRYMiBNQVQ0WDMgTUFUNFg0CisldG9rZW4gU0FNUExFUjFEIFNBTVBMRVIyRCBTQU1QTEVSM0QgU0FNUExFUkNVQkUgU0FNUExFUjFEU0hBRE9XIFNBTVBMRVIyRFNIQURPVworJXRva2VuIFNBTVBMRVJDVUJFU0hBRE9XIFNBTVBMRVIxREFSUkFZIFNBTVBMRVIyREFSUkFZIFNBTVBMRVIxREFSUkFZU0hBRE9XCisldG9rZW4gU0FNUExFUjJEQVJSQVlTSEFET1cgU0FNUExFUkNVQkVBUlJBWSBTQU1QTEVSQ1VCRUFSUkFZU0hBRE9XCisldG9rZW4gSVNBTVBMRVIxRCBJU0FNUExFUjJEIElTQU1QTEVSM0QgSVNBTVBMRVJDVUJFCisldG9rZW4gSVNBTVBMRVIxREFSUkFZIElTQU1QTEVSMkRBUlJBWSBJU0FNUExFUkNVQkVBUlJBWQorJXRva2VuIFVTQU1QTEVSMUQgVVNBTVBMRVIyRCBVU0FNUExFUjNEIFVTQU1QTEVSQ1VCRSBVU0FNUExFUjFEQVJSQVkKKyV0b2tlbiBVU0FNUExFUjJEQVJSQVkgVVNBTVBMRVJDVUJFQVJSQVkKKyV0b2tlbiBTQU1QTEVSMkRSRUNUIElTQU1QTEVSMkRSRUNUIFVTQU1QTEVSMkRSRUNUIFNBTVBMRVIyRFJFQ1RTSEFET1cKKyV0b2tlbiBTQU1QTEVSQlVGRkVSIElTQU1QTEVSQlVGRkVSIFVTQU1QTEVSQlVGRkVSCisldG9rZW4gU0FNUExFUjJETVMgSVNBTVBMRVIyRE1TIFVTQU1QTEVSMkRNUworJXRva2VuIFNBTVBMRVIyRE1TQVJSQVkgSVNBTVBMRVIyRE1TQVJSQVkgVVNBTVBMRVIyRE1TQVJSQVkKKyV0b2tlbiBTQU1QTEVSRVhURVJOQUxPRVMKKyV0b2tlbiBJTUFHRTFEIElNQUdFMkQgSU1BR0UzRCBJTUFHRTJEUkVDVCBJTUFHRUNVQkUgSU1BR0VCVUZGRVIKKyV0b2tlbiBJTUFHRTFEQVJSQVkgSU1BR0UyREFSUkFZIElNQUdFQ1VCRUFSUkFZIElNQUdFMkRNUyBJTUFHRTJETVNBUlJBWQorJXRva2VuIElJTUFHRTFEIElJTUFHRTJEIElJTUFHRTNEIElJTUFHRTJEUkVDVCBJSU1BR0VDVUJFIElJTUFHRUJVRkZFUgorJXRva2VuIElJTUFHRTFEQVJSQVkgSUlNQUdFMkRBUlJBWSBJSU1BR0VDVUJFQVJSQVkgSUlNQUdFMkRNUyBJSU1BR0UyRE1TQVJSQVkKKyV0b2tlbiBVSU1BR0UxRCBVSU1BR0UyRCBVSU1BR0UzRCBVSU1BR0UyRFJFQ1QgVUlNQUdFQ1VCRSBVSU1BR0VCVUZGRVIKKyV0b2tlbiBVSU1BR0UxREFSUkFZIFVJTUFHRTJEQVJSQVkgVUlNQUdFQ1VCRUFSUkFZIFVJTUFHRTJETVMgVUlNQUdFMkRNU0FSUkFZCisldG9rZW4gSU1BR0UxRFNIQURPVyBJTUFHRTJEU0hBRE9XIElNQUdFMURBUlJBWVNIQURPVyBJTUFHRTJEQVJSQVlTSEFET1cKKyV0b2tlbiBDT0hFUkVOVCBWT0xBVElMRSBSRVNUUklDVCBSRUFET05MWSBXUklURU9OTFkKKyV0b2tlbiBBVE9NSUNfVUlOVAorJXRva2VuIFNUUlVDVCBWT0lEX1RPSyBXSElMRQorJXRva2VuIDxpZGVudGlmaWVyPiBJREVOVElGSUVSIFRZUEVfSURFTlRJRklFUiBORVdfSURFTlRJRklFUgorJXR5cGUgPGlkZW50aWZpZXI+IGFueV9pZGVudGlmaWVyCisldHlwZSA8aW50ZXJmYWNlX2Jsb2NrPiBpbnN0YW5jZV9uYW1lX29wdAorJXRva2VuIDxyZWFsPiBGTE9BVENPTlNUQU5UCisldG9rZW4gPG4+IElOVENPTlNUQU5UIFVJTlRDT05TVEFOVCBCT09MQ09OU1RBTlQKKyV0b2tlbiA8aWRlbnRpZmllcj4gRklFTERfU0VMRUNUSU9OCisldG9rZW4gTEVGVF9PUCBSSUdIVF9PUAorJXRva2VuIElOQ19PUCBERUNfT1AgTEVfT1AgR0VfT1AgRVFfT1AgTkVfT1AKKyV0b2tlbiBBTkRfT1AgT1JfT1AgWE9SX09QIE1VTF9BU1NJR04gRElWX0FTU0lHTiBBRERfQVNTSUdOCisldG9rZW4gTU9EX0FTU0lHTiBMRUZUX0FTU0lHTiBSSUdIVF9BU1NJR04gQU5EX0FTU0lHTiBYT1JfQVNTSUdOIE9SX0FTU0lHTgorJXRva2VuIFNVQl9BU1NJR04KKyV0b2tlbiBJTlZBUklBTlQKKyV0b2tlbiBMT1dQIE1FRElVTVAgSElHSFAgU1VQRVJQIFBSRUNJU0lPTgorCisldG9rZW4gVkVSU0lPTl9UT0sgRVhURU5TSU9OIExJTkUgQ09MT04gRU9MIElOVEVSRkFDRSBPVVRQVVQKKyV0b2tlbiBQUkFHTUFfREVCVUdfT04gUFJBR01BX0RFQlVHX09GRgorJXRva2VuIFBSQUdNQV9PUFRJTUlaRV9PTiBQUkFHTUFfT1BUSU1JWkVfT0ZGCisldG9rZW4gUFJBR01BX0lOVkFSSUFOVF9BTEwKKyV0b2tlbiBMQVlPVVRfVE9LCisKKyAgIC8qIFJlc2VydmVkIHdvcmRzIHRoYXQgYXJlIG5vdCBhY3R1YWxseSB1c2VkIGluIHRoZSBncmFtbWFyLgorICAgICovCisldG9rZW4gQVNNIENMQVNTIFVOSU9OIEVOVU0gVFlQRURFRiBURU1QTEFURSBUSElTIFBBQ0tFRF9UT0sgR09UTworJXRva2VuIElOTElORV9UT0sgTk9JTkxJTkUgUFVCTElDX1RPSyBTVEFUSUMgRVhURVJOIEVYVEVSTkFMCisldG9rZW4gTE9OR19UT0sgU0hPUlRfVE9LIERPVUJMRV9UT0sgSEFMRiBGSVhFRF9UT0sgVU5TSUdORUQgSU5QVVRfVE9LIE9VUFRVVAorJXRva2VuIEhWRUMyIEhWRUMzIEhWRUM0IERWRUMyIERWRUMzIERWRUM0IEZWRUMyIEZWRUMzIEZWRUM0CisldG9rZW4gU0FNUExFUjNEUkVDVAorJXRva2VuIFNJWkVPRiBDQVNUIE5BTUVTUEFDRSBVU0lORworJXRva2VuIFJFU09VUkNFIFBBVENIIFNBTVBMRQorJXRva2VuIFNVQlJPVVRJTkUKKworJXRva2VuIEVSUk9SX1RPSworCisldG9rZW4gQ09NTU9OIFBBUlRJVElPTiBBQ1RJVkUgRklMVEVSIFJPV19NQUpPUgorCisldHlwZSA8aWRlbnRpZmllcj4gdmFyaWFibGVfaWRlbnRpZmllcgorJXR5cGUgPG5vZGU+IHN0YXRlbWVudAorJXR5cGUgPG5vZGU+IHN0YXRlbWVudF9saXN0CisldHlwZSA8bm9kZT4gc2ltcGxlX3N0YXRlbWVudAorJXR5cGUgPG4+IHByZWNpc2lvbl9xdWFsaWZpZXIKKyV0eXBlIDx0eXBlX3F1YWxpZmllcj4gdHlwZV9xdWFsaWZpZXIKKyV0eXBlIDx0eXBlX3F1YWxpZmllcj4gYXV4aWxpYXJ5X3N0b3JhZ2VfcXVhbGlmaWVyCisldHlwZSA8dHlwZV9xdWFsaWZpZXI+IHN0b3JhZ2VfcXVhbGlmaWVyCisldHlwZSA8dHlwZV9xdWFsaWZpZXI+IGludGVycG9sYXRpb25fcXVhbGlmaWVyCisldHlwZSA8dHlwZV9xdWFsaWZpZXI+IGxheW91dF9xdWFsaWZpZXIKKyV0eXBlIDx0eXBlX3F1YWxpZmllcj4gbGF5b3V0X3F1YWxpZmllcl9pZF9saXN0IGxheW91dF9xdWFsaWZpZXJfaWQKKyV0eXBlIDx0eXBlX3F1YWxpZmllcj4gaW50ZXJmYWNlX2Jsb2NrX2xheW91dF9xdWFsaWZpZXIKKyV0eXBlIDx0eXBlX3F1YWxpZmllcj4gaW50ZXJmYWNlX3F1YWxpZmllcgorJXR5cGUgPHR5cGVfc3BlY2lmaWVyPiB0eXBlX3NwZWNpZmllcgorJXR5cGUgPHR5cGVfc3BlY2lmaWVyPiB0eXBlX3NwZWNpZmllcl9ub25hcnJheQorJXR5cGUgPGFycmF5X3NwZWNpZmllcj4gYXJyYXlfc3BlY2lmaWVyCisldHlwZSA8aWRlbnRpZmllcj4gYmFzaWNfdHlwZV9zcGVjaWZpZXJfbm9uYXJyYXkKKyV0eXBlIDxmdWxseV9zcGVjaWZpZWRfdHlwZT4gZnVsbHlfc3BlY2lmaWVkX3R5cGUKKyV0eXBlIDxmdW5jdGlvbj4gZnVuY3Rpb25fcHJvdG90eXBlCisldHlwZSA8ZnVuY3Rpb24+IGZ1bmN0aW9uX2hlYWRlcgorJXR5cGUgPGZ1bmN0aW9uPiBmdW5jdGlvbl9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzCisldHlwZSA8ZnVuY3Rpb24+IGZ1bmN0aW9uX2RlY2xhcmF0b3IKKyV0eXBlIDxwYXJhbWV0ZXJfZGVjbGFyYXRvcj4gcGFyYW1ldGVyX2RlY2xhcmF0b3IKKyV0eXBlIDxwYXJhbWV0ZXJfZGVjbGFyYXRvcj4gcGFyYW1ldGVyX2RlY2xhcmF0aW9uCisldHlwZSA8dHlwZV9xdWFsaWZpZXI+IHBhcmFtZXRlcl9xdWFsaWZpZXIKKyV0eXBlIDx0eXBlX3F1YWxpZmllcj4gcGFyYW1ldGVyX2RpcmVjdGlvbl9xdWFsaWZpZXIKKyV0eXBlIDx0eXBlX3NwZWNpZmllcj4gcGFyYW1ldGVyX3R5cGVfc3BlY2lmaWVyCisldHlwZSA8ZnVuY3Rpb25fZGVmaW5pdGlvbj4gZnVuY3Rpb25fZGVmaW5pdGlvbgorJXR5cGUgPGNvbXBvdW5kX3N0YXRlbWVudD4gY29tcG91bmRfc3RhdGVtZW50X25vX25ld19zY29wZQorJXR5cGUgPGNvbXBvdW5kX3N0YXRlbWVudD4gY29tcG91bmRfc3RhdGVtZW50CisldHlwZSA8bm9kZT4gc3RhdGVtZW50X25vX25ld19zY29wZQorJXR5cGUgPG5vZGU+IGV4cHJlc3Npb25fc3RhdGVtZW50CisldHlwZSA8ZXhwcmVzc2lvbj4gZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IHByaW1hcnlfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IGFzc2lnbm1lbnRfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24KKyV0eXBlIDxleHByZXNzaW9uPiBsb2dpY2FsX29yX2V4cHJlc3Npb24KKyV0eXBlIDxleHByZXNzaW9uPiBsb2dpY2FsX3hvcl9leHByZXNzaW9uCisldHlwZSA8ZXhwcmVzc2lvbj4gbG9naWNhbF9hbmRfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IGluY2x1c2l2ZV9vcl9leHByZXNzaW9uCisldHlwZSA8ZXhwcmVzc2lvbj4gZXhjbHVzaXZlX29yX2V4cHJlc3Npb24KKyV0eXBlIDxleHByZXNzaW9uPiBhbmRfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IGVxdWFsaXR5X2V4cHJlc3Npb24KKyV0eXBlIDxleHByZXNzaW9uPiByZWxhdGlvbmFsX2V4cHJlc3Npb24KKyV0eXBlIDxleHByZXNzaW9uPiBzaGlmdF9leHByZXNzaW9uCisldHlwZSA8ZXhwcmVzc2lvbj4gYWRkaXRpdmVfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24KKyV0eXBlIDxleHByZXNzaW9uPiB1bmFyeV9leHByZXNzaW9uCisldHlwZSA8ZXhwcmVzc2lvbj4gY29uc3RhbnRfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IGludGVnZXJfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IHBvc3RmaXhfZXhwcmVzc2lvbgorJXR5cGUgPGV4cHJlc3Npb24+IGZ1bmN0aW9uX2NhbGxfaGVhZGVyX3dpdGhfcGFyYW1ldGVycworJXR5cGUgPGV4cHJlc3Npb24+IGZ1bmN0aW9uX2NhbGxfaGVhZGVyX25vX3BhcmFtZXRlcnMKKyV0eXBlIDxleHByZXNzaW9uPiBmdW5jdGlvbl9jYWxsX2hlYWRlcgorJXR5cGUgPGV4cHJlc3Npb24+IGZ1bmN0aW9uX2NhbGxfZ2VuZXJpYworJXR5cGUgPGV4cHJlc3Npb24+IGZ1bmN0aW9uX2NhbGxfb3JfbWV0aG9kCisldHlwZSA8ZXhwcmVzc2lvbj4gZnVuY3Rpb25fY2FsbAorJXR5cGUgPGV4cHJlc3Npb24+IG1ldGhvZF9jYWxsX2dlbmVyaWMKKyV0eXBlIDxleHByZXNzaW9uPiBtZXRob2RfY2FsbF9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzCisldHlwZSA8ZXhwcmVzc2lvbj4gbWV0aG9kX2NhbGxfaGVhZGVyX25vX3BhcmFtZXRlcnMKKyV0eXBlIDxleHByZXNzaW9uPiBtZXRob2RfY2FsbF9oZWFkZXIKKyV0eXBlIDxuPiBhc3NpZ25tZW50X29wZXJhdG9yCisldHlwZSA8bj4gdW5hcnlfb3BlcmF0b3IKKyV0eXBlIDxleHByZXNzaW9uPiBmdW5jdGlvbl9pZGVudGlmaWVyCisldHlwZSA8bm9kZT4gZXh0ZXJuYWxfZGVjbGFyYXRpb24KKyV0eXBlIDxkZWNsYXJhdG9yX2xpc3Q+IGluaXRfZGVjbGFyYXRvcl9saXN0CisldHlwZSA8ZGVjbGFyYXRvcl9saXN0PiBzaW5nbGVfZGVjbGFyYXRpb24KKyV0eXBlIDxleHByZXNzaW9uPiBpbml0aWFsaXplcgorJXR5cGUgPGV4cHJlc3Npb24+IGluaXRpYWxpemVyX2xpc3QKKyV0eXBlIDxub2RlPiBkZWNsYXJhdGlvbgorJXR5cGUgPG5vZGU+IGRlY2xhcmF0aW9uX3N0YXRlbWVudAorJXR5cGUgPG5vZGU+IGp1bXBfc3RhdGVtZW50CisldHlwZSA8bm9kZT4gaW50ZXJmYWNlX2Jsb2NrCisldHlwZSA8aW50ZXJmYWNlX2Jsb2NrPiBiYXNpY19pbnRlcmZhY2VfYmxvY2sKKyV0eXBlIDxzdHJ1Y3Rfc3BlY2lmaWVyPiBzdHJ1Y3Rfc3BlY2lmaWVyCisldHlwZSA8ZGVjbGFyYXRvcl9saXN0PiBzdHJ1Y3RfZGVjbGFyYXRpb25fbGlzdAorJXR5cGUgPGRlY2xhcmF0b3JfbGlzdD4gc3RydWN0X2RlY2xhcmF0aW9uCisldHlwZSA8ZGVjbGFyYXRpb24+IHN0cnVjdF9kZWNsYXJhdG9yCisldHlwZSA8ZGVjbGFyYXRpb24+IHN0cnVjdF9kZWNsYXJhdG9yX2xpc3QKKyV0eXBlIDxkZWNsYXJhdG9yX2xpc3Q+IG1lbWJlcl9saXN0CisldHlwZSA8ZGVjbGFyYXRvcl9saXN0PiBtZW1iZXJfZGVjbGFyYXRpb24KKyV0eXBlIDxub2RlPiBzZWxlY3Rpb25fc3RhdGVtZW50CisldHlwZSA8c2VsZWN0aW9uX3Jlc3Rfc3RhdGVtZW50PiBzZWxlY3Rpb25fcmVzdF9zdGF0ZW1lbnQKKyV0eXBlIDxub2RlPiBzd2l0Y2hfc3RhdGVtZW50CisldHlwZSA8c3dpdGNoX2JvZHk+IHN3aXRjaF9ib2R5CisldHlwZSA8Y2FzZV9sYWJlbF9saXN0PiBjYXNlX2xhYmVsX2xpc3QKKyV0eXBlIDxjYXNlX2xhYmVsPiBjYXNlX2xhYmVsCisldHlwZSA8Y2FzZV9zdGF0ZW1lbnQ+IGNhc2Vfc3RhdGVtZW50CisldHlwZSA8Y2FzZV9zdGF0ZW1lbnRfbGlzdD4gY2FzZV9zdGF0ZW1lbnRfbGlzdAorJXR5cGUgPG5vZGU+IGl0ZXJhdGlvbl9zdGF0ZW1lbnQKKyV0eXBlIDxub2RlPiBjb25kaXRpb24KKyV0eXBlIDxub2RlPiBjb25kaXRpb25vcHQKKyV0eXBlIDxub2RlPiBmb3JfaW5pdF9zdGF0ZW1lbnQKKyV0eXBlIDxmb3JfcmVzdF9zdGF0ZW1lbnQ+IGZvcl9yZXN0X3N0YXRlbWVudAorJXR5cGUgPG4+IGludGVnZXJfY29uc3RhbnQKKyV0eXBlIDxub2RlPiBsYXlvdXRfZGVmYXVsdHMKKworJXJpZ2h0IFRIRU4gRUxTRQorJSUKKwordHJhbnNsYXRpb25fdW5pdDoKKyAgIHZlcnNpb25fc3RhdGVtZW50IGV4dGVuc2lvbl9zdGF0ZW1lbnRfbGlzdAorICAgeworICAgICAgX21lc2FfZ2xzbF9pbml0aWFsaXplX3R5cGVzKHN0YXRlKTsKKyAgIH0KKyAgIGV4dGVybmFsX2RlY2xhcmF0aW9uX2xpc3QKKyAgIHsKKyAgICAgIGRlbGV0ZSBzdGF0ZS0+c3ltYm9sczsKKyAgICAgIHN0YXRlLT5zeW1ib2xzID0gbmV3KHJhbGxvY19wYXJlbnQoc3RhdGUpKSBnbHNsX3N5bWJvbF90YWJsZTsKKyAgICAgIF9tZXNhX2dsc2xfaW5pdGlhbGl6ZV90eXBlcyhzdGF0ZSk7CisgICB9CisgICA7CisKK3ZlcnNpb25fc3RhdGVtZW50OgorICAgLyogYmxhbmsgLSBubyAjdmVyc2lvbiBzcGVjaWZpZWQ6IGRlZmF1bHRzIGFyZSBhbHJlYWR5IHNldCAqLworICAgfCBWRVJTSU9OX1RPSyBJTlRDT05TVEFOVCBFT0wKKyAgIHsKKyAgICAgIHN0YXRlLT5wcm9jZXNzX3ZlcnNpb25fZGlyZWN0aXZlKCZAMiwgJDIsIE5VTEwpOworICAgICAgaWYgKHN0YXRlLT5lcnJvcikgeworICAgICAgICAgWVlFUlJPUjsKKyAgICAgIH0KKyAgIH0KKyAgIHwgVkVSU0lPTl9UT0sgSU5UQ09OU1RBTlQgYW55X2lkZW50aWZpZXIgRU9MCisgICB7CisgICAgICBzdGF0ZS0+cHJvY2Vzc192ZXJzaW9uX2RpcmVjdGl2ZSgmQDIsICQyLCAkMyk7CisgICAgICBpZiAoc3RhdGUtPmVycm9yKSB7CisgICAgICAgICBZWUVSUk9SOworICAgICAgfQorICAgfQorICAgOworCitwcmFnbWFfc3RhdGVtZW50OgorICAgUFJBR01BX0RFQlVHX09OIEVPTAorICAgfCBQUkFHTUFfREVCVUdfT0ZGIEVPTAorICAgfCBQUkFHTUFfT1BUSU1JWkVfT04gRU9MCisgICB8IFBSQUdNQV9PUFRJTUlaRV9PRkYgRU9MCisgICB8IFBSQUdNQV9JTlZBUklBTlRfQUxMIEVPTAorICAgeworICAgICAgaWYgKCFzdGF0ZS0+aXNfdmVyc2lvbigxMjAsIDEwMCkpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfd2FybmluZygmIEAxLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJhZ21hIGBpbnZhcmlhbnQoYWxsKScgbm90IHN1cHBvcnRlZCBpbiAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihHTFNMIEVTIDEuMDAgb3IgR0xTTCAxLjIwIHJlcXVpcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmdldF92ZXJzaW9uX3N0cmluZygpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBzdGF0ZS0+YWxsX2ludmFyaWFudCA9IHRydWU7CisgICAgICB9CisgICB9CisgICA7CisKK2V4dGVuc2lvbl9zdGF0ZW1lbnRfbGlzdDoKKworICAgfCBleHRlbnNpb25fc3RhdGVtZW50X2xpc3QgZXh0ZW5zaW9uX3N0YXRlbWVudAorICAgOworCithbnlfaWRlbnRpZmllcjoKKyAgIElERU5USUZJRVIKKyAgIHwgVFlQRV9JREVOVElGSUVSCisgICB8IE5FV19JREVOVElGSUVSCisgICA7CisKK2V4dGVuc2lvbl9zdGF0ZW1lbnQ6CisgICBFWFRFTlNJT04gYW55X2lkZW50aWZpZXIgQ09MT04gYW55X2lkZW50aWZpZXIgRU9MCisgICB7CisgICAgICBpZiAoIV9tZXNhX2dsc2xfcHJvY2Vzc19leHRlbnNpb24oJDIsICYgQDIsICQ0LCAmIEA0LCBzdGF0ZSkpIHsKKyAgICAgICAgIFlZRVJST1I7CisgICAgICB9CisgICB9CisgICA7CisKK2V4dGVybmFsX2RlY2xhcmF0aW9uX2xpc3Q6CisgICBleHRlcm5hbF9kZWNsYXJhdGlvbgorICAgeworICAgICAgLyogRklOSVNITUU6IFRoZSBOVUxMIHRlc3QgaXMgcmVxdWlyZWQgYmVjYXVzZSBwcmFnbWFzIGFyZSBzZXQgdG8KKyAgICAgICAqIEZJTklTSE1FOiBOVUxMLiAoU2VlIHByb2R1Y3Rpb24gcnVsZSBmb3IgZXh0ZXJuYWxfZGVjbGFyYXRpb24uKQorICAgICAgICovCisgICAgICBpZiAoJDEgIT0gTlVMTCkKKyAgICAgICAgIHN0YXRlLT50cmFuc2xhdGlvbl91bml0LnB1c2hfdGFpbCgmICQxLT5saW5rKTsKKyAgIH0KKyAgIHwgZXh0ZXJuYWxfZGVjbGFyYXRpb25fbGlzdCBleHRlcm5hbF9kZWNsYXJhdGlvbgorICAgeworICAgICAgLyogRklOSVNITUU6IFRoZSBOVUxMIHRlc3QgaXMgcmVxdWlyZWQgYmVjYXVzZSBwcmFnbWFzIGFyZSBzZXQgdG8KKyAgICAgICAqIEZJTklTSE1FOiBOVUxMLiAoU2VlIHByb2R1Y3Rpb24gcnVsZSBmb3IgZXh0ZXJuYWxfZGVjbGFyYXRpb24uKQorICAgICAgICovCisgICAgICBpZiAoJDIgIT0gTlVMTCkKKyAgICAgICAgIHN0YXRlLT50cmFuc2xhdGlvbl91bml0LnB1c2hfdGFpbCgmICQyLT5saW5rKTsKKyAgIH0KKyAgIDsKKwordmFyaWFibGVfaWRlbnRpZmllcjoKKyAgIElERU5USUZJRVIKKyAgIHwgTkVXX0lERU5USUZJRVIKKyAgIDsKKworcHJpbWFyeV9leHByZXNzaW9uOgorICAgdmFyaWFibGVfaWRlbnRpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uKGFzdF9pZGVudGlmaWVyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgICAgJCQtPnByaW1hcnlfZXhwcmVzc2lvbi5pZGVudGlmaWVyID0gJDE7CisgICB9CisgICB8IElOVENPTlNUQU5UCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oYXN0X2ludF9jb25zdGFudCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgICAgICQkLT5wcmltYXJ5X2V4cHJlc3Npb24uaW50X2NvbnN0YW50ID0gJDE7CisgICB9CisgICB8IFVJTlRDT05TVEFOVAorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uKGFzdF91aW50X2NvbnN0YW50LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgICAgJCQtPnByaW1hcnlfZXhwcmVzc2lvbi51aW50X2NvbnN0YW50ID0gJDE7CisgICB9CisgICB8IEZMT0FUQ09OU1RBTlQKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbihhc3RfZmxvYXRfY29uc3RhbnQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICAkJC0+cHJpbWFyeV9leHByZXNzaW9uLmZsb2F0X2NvbnN0YW50ID0gJDE7CisgICB9CisgICB8IEJPT0xDT05TVEFOVAorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uKGFzdF9ib29sX2NvbnN0YW50LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgICAgJCQtPnByaW1hcnlfZXhwcmVzc2lvbi5ib29sX2NvbnN0YW50ID0gJDE7CisgICB9CisgICB8ICcoJyBleHByZXNzaW9uICcpJworICAgeworICAgICAgJCQgPSAkMjsKKyAgIH0KKyAgIDsKKworcG9zdGZpeF9leHByZXNzaW9uOgorICAgcHJpbWFyeV9leHByZXNzaW9uCisgICB8IHBvc3RmaXhfZXhwcmVzc2lvbiAnWycgaW50ZWdlcl9leHByZXNzaW9uICddJworICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uKGFzdF9hcnJheV9pbmRleCwgJDEsICQzLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEA0KTsKKyAgIH0KKyAgIHwgZnVuY3Rpb25fY2FsbAorICAgeworICAgICAgJCQgPSAkMTsKKyAgIH0KKyAgIHwgcG9zdGZpeF9leHByZXNzaW9uICcuJyBhbnlfaWRlbnRpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uKGFzdF9maWVsZF9zZWxlY3Rpb24sICQxLCBOVUxMLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgICAgICQkLT5wcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllciA9ICQzOworICAgfQorICAgfCBwb3N0Zml4X2V4cHJlc3Npb24gSU5DX09QCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oYXN0X3Bvc3RfaW5jLCAkMSwgTlVMTCwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMik7CisgICB9CisgICB8IHBvc3RmaXhfZXhwcmVzc2lvbiBERUNfT1AKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbihhc3RfcG9zdF9kZWMsICQxLCBOVUxMLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAyKTsKKyAgIH0KKyAgIDsKKworaW50ZWdlcl9leHByZXNzaW9uOgorICAgZXhwcmVzc2lvbgorICAgOworCitmdW5jdGlvbl9jYWxsOgorICAgZnVuY3Rpb25fY2FsbF9vcl9tZXRob2QKKyAgIDsKKworZnVuY3Rpb25fY2FsbF9vcl9tZXRob2Q6CisgICBmdW5jdGlvbl9jYWxsX2dlbmVyaWMKKyAgIHwgcG9zdGZpeF9leHByZXNzaW9uICcuJyBtZXRob2RfY2FsbF9nZW5lcmljCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oYXN0X2ZpZWxkX3NlbGVjdGlvbiwgJDEsICQzLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIDsKKworZnVuY3Rpb25fY2FsbF9nZW5lcmljOgorICAgZnVuY3Rpb25fY2FsbF9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzICcpJworICAgfCBmdW5jdGlvbl9jYWxsX2hlYWRlcl9ub19wYXJhbWV0ZXJzICcpJworICAgOworCitmdW5jdGlvbl9jYWxsX2hlYWRlcl9ub19wYXJhbWV0ZXJzOgorICAgZnVuY3Rpb25fY2FsbF9oZWFkZXIgVk9JRF9UT0sKKyAgIHwgZnVuY3Rpb25fY2FsbF9oZWFkZXIKKyAgIDsKKworZnVuY3Rpb25fY2FsbF9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzOgorICAgZnVuY3Rpb25fY2FsbF9oZWFkZXIgYXNzaWdubWVudF9leHByZXNzaW9uCisgICB7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICAkJC0+ZXhwcmVzc2lvbnMucHVzaF90YWlsKCYgJDItPmxpbmspOworICAgfQorICAgfCBmdW5jdGlvbl9jYWxsX2hlYWRlcl93aXRoX3BhcmFtZXRlcnMgJywnIGFzc2lnbm1lbnRfZXhwcmVzc2lvbgorICAgeworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgICAgJCQtPmV4cHJlc3Npb25zLnB1c2hfdGFpbCgmICQzLT5saW5rKTsKKyAgIH0KKyAgIDsKKworICAgLy8gR3JhbW1hciBOb3RlOiBDb25zdHJ1Y3RvcnMgbG9vayBsaWtlIGZ1bmN0aW9ucywgYnV0IGxleGljYWwKKyAgIC8vIGFuYWx5c2lzIHJlY29nbml6ZWQgbW9zdCBvZiB0aGVtIGFzIGtleXdvcmRzLiBUaGV5IGFyZSBub3cKKyAgIC8vIHJlY29nbml6ZWQgdGhyb3VnaCAidHlwZV9zcGVjaWZpZXIiLgorZnVuY3Rpb25fY2FsbF9oZWFkZXI6CisgICBmdW5jdGlvbl9pZGVudGlmaWVyICcoJworICAgOworCitmdW5jdGlvbl9pZGVudGlmaWVyOgorICAgdHlwZV9zcGVjaWZpZXIKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZnVuY3Rpb25fZXhwcmVzc2lvbigkMSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgICAgIH0KKyAgIHwgdmFyaWFibGVfaWRlbnRpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZXhwcmVzc2lvbiAqY2FsbGVlID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oJDEpOworICAgICAgY2FsbGVlLT5zZXRfbG9jYXRpb24oQDEpOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZnVuY3Rpb25fZXhwcmVzc2lvbihjYWxsZWUpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICB9CisgICB8IEZJRUxEX1NFTEVDVElPTgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZXhwcmVzc2lvbiAqY2FsbGVlID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oJDEpOworICAgICAgY2FsbGVlLT5zZXRfbG9jYXRpb24oQDEpOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZnVuY3Rpb25fZXhwcmVzc2lvbihjYWxsZWUpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICB9CisgICA7CisKK21ldGhvZF9jYWxsX2dlbmVyaWM6CisgICBtZXRob2RfY2FsbF9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzICcpJworICAgfCBtZXRob2RfY2FsbF9oZWFkZXJfbm9fcGFyYW1ldGVycyAnKScKKyAgIDsKKworbWV0aG9kX2NhbGxfaGVhZGVyX25vX3BhcmFtZXRlcnM6CisgICBtZXRob2RfY2FsbF9oZWFkZXIgVk9JRF9UT0sKKyAgIHwgbWV0aG9kX2NhbGxfaGVhZGVyCisgICA7CisKK21ldGhvZF9jYWxsX2hlYWRlcl93aXRoX3BhcmFtZXRlcnM6CisgICBtZXRob2RfY2FsbF9oZWFkZXIgYXNzaWdubWVudF9leHByZXNzaW9uCisgICB7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICAkJC0+ZXhwcmVzc2lvbnMucHVzaF90YWlsKCYgJDItPmxpbmspOworICAgfQorICAgfCBtZXRob2RfY2FsbF9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzICcsJyBhc3NpZ25tZW50X2V4cHJlc3Npb24KKyAgIHsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgICAgICQkLT5leHByZXNzaW9ucy5wdXNoX3RhaWwoJiAkMy0+bGluayk7CisgICB9CisgICA7CisKKyAgIC8vIEdyYW1tYXIgTm90ZTogQ29uc3RydWN0b3JzIGxvb2sgbGlrZSBtZXRob2RzLCBidXQgbGV4aWNhbAorICAgLy8gYW5hbHlzaXMgcmVjb2duaXplZCBtb3N0IG9mIHRoZW0gYXMga2V5d29yZHMuIFRoZXkgYXJlIG5vdworICAgLy8gcmVjb2duaXplZCB0aHJvdWdoICJ0eXBlX3NwZWNpZmllciIuCittZXRob2RfY2FsbF9oZWFkZXI6CisgICB2YXJpYWJsZV9pZGVudGlmaWVyICcoJworICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZXhwcmVzc2lvbiAqY2FsbGVlID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oJDEpOworICAgICAgY2FsbGVlLT5zZXRfbG9jYXRpb24oQDEpOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZnVuY3Rpb25fZXhwcmVzc2lvbihjYWxsZWUpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICB9CisgICA7CisKKyAgIC8vIEdyYW1tYXIgTm90ZTogTm8gdHJhZGl0aW9uYWwgc3R5bGUgdHlwZSBjYXN0cy4KK3VuYXJ5X2V4cHJlc3Npb246CisgICBwb3N0Zml4X2V4cHJlc3Npb24KKyAgIHwgSU5DX09QIHVuYXJ5X2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbihhc3RfcHJlX2luYywgJDIsIE5VTEwsIE5VTEwpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICB9CisgICB8IERFQ19PUCB1bmFyeV9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oYXN0X3ByZV9kZWMsICQyLCBOVUxMLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgfQorICAgfCB1bmFyeV9vcGVyYXRvciB1bmFyeV9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb24oJDEsICQyLCBOVUxMLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAyKTsKKyAgIH0KKyAgIDsKKworICAgLy8gR3JhbW1hciBOb3RlOiBObyAnKicgb3IgJyYnIHVuYXJ5IG9wcy4gUG9pbnRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuCit1bmFyeV9vcGVyYXRvcjoKKyAgICcrJyAgIHsgJCQgPSBhc3RfcGx1czsgfQorICAgfCAnLScgeyAkJCA9IGFzdF9uZWc7IH0KKyAgIHwgJyEnIHsgJCQgPSBhc3RfbG9naWNfbm90OyB9CisgICB8ICd+JyB7ICQkID0gYXN0X2JpdF9ub3Q7IH0KKyAgIDsKKworbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbjoKKyAgIHVuYXJ5X2V4cHJlc3Npb24KKyAgIHwgbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbiAnKicgdW5hcnlfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfbXVsLCAkMSwgJDMpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgfCBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uICcvJyB1bmFyeV9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb25fYmluKGFzdF9kaXYsICQxLCAkMyk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICB9CisgICB8IG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gJyUnIHVuYXJ5X2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbl9iaW4oYXN0X21vZCwgJDEsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIDsKKworYWRkaXRpdmVfZXhwcmVzc2lvbjoKKyAgIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24KKyAgIHwgYWRkaXRpdmVfZXhwcmVzc2lvbiAnKycgbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfYWRkLCAkMSwgJDMpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgfCBhZGRpdGl2ZV9leHByZXNzaW9uICctJyBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb25fYmluKGFzdF9zdWIsICQxLCAkMyk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICB9CisgICA7CisKK3NoaWZ0X2V4cHJlc3Npb246CisgICBhZGRpdGl2ZV9leHByZXNzaW9uCisgICB8IHNoaWZ0X2V4cHJlc3Npb24gTEVGVF9PUCBhZGRpdGl2ZV9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb25fYmluKGFzdF9sc2hpZnQsICQxLCAkMyk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICB9CisgICB8IHNoaWZ0X2V4cHJlc3Npb24gUklHSFRfT1AgYWRkaXRpdmVfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfcnNoaWZ0LCAkMSwgJDMpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgOworCityZWxhdGlvbmFsX2V4cHJlc3Npb246CisgICBzaGlmdF9leHByZXNzaW9uCisgICB8IHJlbGF0aW9uYWxfZXhwcmVzc2lvbiAnPCcgc2hpZnRfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfbGVzcywgJDEsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIHwgcmVsYXRpb25hbF9leHByZXNzaW9uICc+JyBzaGlmdF9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb25fYmluKGFzdF9ncmVhdGVyLCAkMSwgJDMpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgfCByZWxhdGlvbmFsX2V4cHJlc3Npb24gTEVfT1Agc2hpZnRfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfbGVxdWFsLCAkMSwgJDMpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgfCByZWxhdGlvbmFsX2V4cHJlc3Npb24gR0VfT1Agc2hpZnRfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfZ2VxdWFsLCAkMSwgJDMpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgOworCitlcXVhbGl0eV9leHByZXNzaW9uOgorICAgcmVsYXRpb25hbF9leHByZXNzaW9uCisgICB8IGVxdWFsaXR5X2V4cHJlc3Npb24gRVFfT1AgcmVsYXRpb25hbF9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb25fYmluKGFzdF9lcXVhbCwgJDEsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIHwgZXF1YWxpdHlfZXhwcmVzc2lvbiBORV9PUCByZWxhdGlvbmFsX2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbl9iaW4oYXN0X25lcXVhbCwgJDEsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIDsKKworYW5kX2V4cHJlc3Npb246CisgICBlcXVhbGl0eV9leHByZXNzaW9uCisgICB8IGFuZF9leHByZXNzaW9uICcmJyBlcXVhbGl0eV9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb25fYmluKGFzdF9iaXRfYW5kLCAkMSwgJDMpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgOworCitleGNsdXNpdmVfb3JfZXhwcmVzc2lvbjoKKyAgIGFuZF9leHByZXNzaW9uCisgICB8IGV4Y2x1c2l2ZV9vcl9leHByZXNzaW9uICdeJyBhbmRfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfYml0X3hvciwgJDEsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIDsKKworaW5jbHVzaXZlX29yX2V4cHJlc3Npb246CisgICBleGNsdXNpdmVfb3JfZXhwcmVzc2lvbgorICAgfCBpbmNsdXNpdmVfb3JfZXhwcmVzc2lvbiAnfCcgZXhjbHVzaXZlX29yX2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbl9iaW4oYXN0X2JpdF9vciwgJDEsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIDsKKworbG9naWNhbF9hbmRfZXhwcmVzc2lvbjoKKyAgIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uCisgICB8IGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24gQU5EX09QIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2V4cHJlc3Npb25fYmluKGFzdF9sb2dpY19hbmQsICQxLCAkMyk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICB9CisgICA7CisKK2xvZ2ljYWxfeG9yX2V4cHJlc3Npb246CisgICBsb2dpY2FsX2FuZF9leHByZXNzaW9uCisgICB8IGxvZ2ljYWxfeG9yX2V4cHJlc3Npb24gWE9SX09QIGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbl9iaW4oYXN0X2xvZ2ljX3hvciwgJDEsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIDsKKworbG9naWNhbF9vcl9leHByZXNzaW9uOgorICAgbG9naWNhbF94b3JfZXhwcmVzc2lvbgorICAgfCBsb2dpY2FsX29yX2V4cHJlc3Npb24gT1JfT1AgbG9naWNhbF94b3JfZXhwcmVzc2lvbgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX2Jpbihhc3RfbG9naWNfb3IsICQxLCAkMyk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICB9CisgICA7CisKK2NvbmRpdGlvbmFsX2V4cHJlc3Npb246CisgICBsb2dpY2FsX29yX2V4cHJlc3Npb24KKyAgIHwgbG9naWNhbF9vcl9leHByZXNzaW9uICc/JyBleHByZXNzaW9uICc6JyBhc3NpZ25tZW50X2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbihhc3RfY29uZGl0aW9uYWwsICQxLCAkMywgJDUpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDUpOworICAgfQorICAgOworCithc3NpZ25tZW50X2V4cHJlc3Npb246CisgICBjb25kaXRpb25hbF9leHByZXNzaW9uCisgICB8IHVuYXJ5X2V4cHJlc3Npb24gYXNzaWdubWVudF9vcGVyYXRvciBhc3NpZ25tZW50X2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbigkMiwgJDEsICQzLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgIH0KKyAgIDsKKworYXNzaWdubWVudF9vcGVyYXRvcjoKKyAgICc9JyAgICAgICAgICAgICAgICB7ICQkID0gYXN0X2Fzc2lnbjsgfQorICAgfCBNVUxfQVNTSUdOICAgICAgIHsgJCQgPSBhc3RfbXVsX2Fzc2lnbjsgfQorICAgfCBESVZfQVNTSUdOICAgICAgIHsgJCQgPSBhc3RfZGl2X2Fzc2lnbjsgfQorICAgfCBNT0RfQVNTSUdOICAgICAgIHsgJCQgPSBhc3RfbW9kX2Fzc2lnbjsgfQorICAgfCBBRERfQVNTSUdOICAgICAgIHsgJCQgPSBhc3RfYWRkX2Fzc2lnbjsgfQorICAgfCBTVUJfQVNTSUdOICAgICAgIHsgJCQgPSBhc3Rfc3ViX2Fzc2lnbjsgfQorICAgfCBMRUZUX0FTU0lHTiAgICAgIHsgJCQgPSBhc3RfbHNfYXNzaWduOyB9CisgICB8IFJJR0hUX0FTU0lHTiAgICAgeyAkJCA9IGFzdF9yc19hc3NpZ247IH0KKyAgIHwgQU5EX0FTU0lHTiAgICAgICB7ICQkID0gYXN0X2FuZF9hc3NpZ247IH0KKyAgIHwgWE9SX0FTU0lHTiAgICAgICB7ICQkID0gYXN0X3hvcl9hc3NpZ247IH0KKyAgIHwgT1JfQVNTSUdOICAgICAgICB7ICQkID0gYXN0X29yX2Fzc2lnbjsgfQorICAgOworCitleHByZXNzaW9uOgorICAgYXNzaWdubWVudF9leHByZXNzaW9uCisgICB7CisgICAgICAkJCA9ICQxOworICAgfQorICAgfCBleHByZXNzaW9uICcsJyBhc3NpZ25tZW50X2V4cHJlc3Npb24KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgaWYgKCQxLT5vcGVyICE9IGFzdF9zZXF1ZW5jZSkgeworICAgICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZXhwcmVzc2lvbihhc3Rfc2VxdWVuY2UsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgICAgICAgJCQtPmV4cHJlc3Npb25zLnB1c2hfdGFpbCgmICQxLT5saW5rKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAkJCA9ICQxOworICAgICAgfQorCisgICAgICAkJC0+ZXhwcmVzc2lvbnMucHVzaF90YWlsKCYgJDMtPmxpbmspOworICAgfQorICAgOworCitjb25zdGFudF9leHByZXNzaW9uOgorICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbgorICAgOworCitkZWNsYXJhdGlvbjoKKyAgIGZ1bmN0aW9uX3Byb3RvdHlwZSAnOycKKyAgIHsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKyAgICAgICQkID0gJDE7CisgICB9CisgICB8IGluaXRfZGVjbGFyYXRvcl9saXN0ICc7JworICAgeworICAgICAgJCQgPSAkMTsKKyAgIH0KKyAgIHwgUFJFQ0lTSU9OIHByZWNpc2lvbl9xdWFsaWZpZXIgdHlwZV9zcGVjaWZpZXIgJzsnCisgICB7CisgICAgICAkMy0+ZGVmYXVsdF9wcmVjaXNpb24gPSAkMjsKKyAgICAgICQkID0gJDM7CisgICB9CisgICB8IGludGVyZmFjZV9ibG9jaworICAgeworICAgICAgJCQgPSAkMTsKKyAgIH0KKyAgIDsKKworZnVuY3Rpb25fcHJvdG90eXBlOgorICAgZnVuY3Rpb25fZGVjbGFyYXRvciAnKScKKyAgIDsKKworZnVuY3Rpb25fZGVjbGFyYXRvcjoKKyAgIGZ1bmN0aW9uX2hlYWRlcgorICAgfCBmdW5jdGlvbl9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzCisgICA7CisKK2Z1bmN0aW9uX2hlYWRlcl93aXRoX3BhcmFtZXRlcnM6CisgICBmdW5jdGlvbl9oZWFkZXIgcGFyYW1ldGVyX2RlY2xhcmF0aW9uCisgICB7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPnBhcmFtZXRlcnMucHVzaF90YWlsKCYgJDItPmxpbmspOworICAgfQorICAgfCBmdW5jdGlvbl9oZWFkZXJfd2l0aF9wYXJhbWV0ZXJzICcsJyBwYXJhbWV0ZXJfZGVjbGFyYXRpb24KKyAgIHsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+cGFyYW1ldGVycy5wdXNoX3RhaWwoJiAkMy0+bGluayk7CisgICB9CisgICA7CisKK2Z1bmN0aW9uX2hlYWRlcjoKKyAgIGZ1bGx5X3NwZWNpZmllZF90eXBlIHZhcmlhYmxlX2lkZW50aWZpZXIgJygnCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2Z1bmN0aW9uKCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAyKTsKKyAgICAgICQkLT5yZXR1cm5fdHlwZSA9ICQxOworICAgICAgJCQtPmlkZW50aWZpZXIgPSAkMjsKKworICAgICAgc3RhdGUtPnN5bWJvbHMtPmFkZF9mdW5jdGlvbihuZXcoc3RhdGUpIGlyX2Z1bmN0aW9uKCQyKSk7CisgICAgICBzdGF0ZS0+c3ltYm9scy0+cHVzaF9zY29wZSgpOworICAgfQorICAgOworCitwYXJhbWV0ZXJfZGVjbGFyYXRvcjoKKyAgIHR5cGVfc3BlY2lmaWVyIGFueV9pZGVudGlmaWVyCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X3BhcmFtZXRlcl9kZWNsYXJhdG9yKCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMik7CisgICAgICAkJC0+dHlwZSA9IG5ldyhjdHgpIGFzdF9mdWxseV9zcGVjaWZpZWRfdHlwZSgpOworICAgICAgJCQtPnR5cGUtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICAkJC0+dHlwZS0+c3BlY2lmaWVyID0gJDE7CisgICAgICAkJC0+aWRlbnRpZmllciA9ICQyOworICAgfQorICAgfCB0eXBlX3NwZWNpZmllciBhbnlfaWRlbnRpZmllciBhcnJheV9zcGVjaWZpZXIKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfcGFyYW1ldGVyX2RlY2xhcmF0b3IoKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAzKTsKKyAgICAgICQkLT50eXBlID0gbmV3KGN0eCkgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlKCk7CisgICAgICAkJC0+dHlwZS0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgICAgICQkLT50eXBlLT5zcGVjaWZpZXIgPSAkMTsKKyAgICAgICQkLT5pZGVudGlmaWVyID0gJDI7CisgICAgICAkJC0+YXJyYXlfc3BlY2lmaWVyID0gJDM7CisgICB9CisgICA7CisKK3BhcmFtZXRlcl9kZWNsYXJhdGlvbjoKKyAgIHBhcmFtZXRlcl9xdWFsaWZpZXIgcGFyYW1ldGVyX2RlY2xhcmF0b3IKKyAgIHsKKyAgICAgICQkID0gJDI7CisgICAgICAkJC0+dHlwZS0+cXVhbGlmaWVyID0gJDE7CisgICB9CisgICB8IHBhcmFtZXRlcl9xdWFsaWZpZXIgcGFyYW1ldGVyX3R5cGVfc3BlY2lmaWVyCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X3BhcmFtZXRlcl9kZWNsYXJhdG9yKCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAyKTsKKyAgICAgICQkLT50eXBlID0gbmV3KGN0eCkgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlKCk7CisgICAgICAkJC0+dHlwZS0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMik7CisgICAgICAkJC0+dHlwZS0+cXVhbGlmaWVyID0gJDE7CisgICAgICAkJC0+dHlwZS0+c3BlY2lmaWVyID0gJDI7CisgICB9CisgICA7CisKK3BhcmFtZXRlcl9xdWFsaWZpZXI6CisgICAvKiBlbXB0eSAqLworICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgfQorICAgfCBDT05TVF9UT0sgcGFyYW1ldGVyX3F1YWxpZmllcgorICAgeworICAgICAgaWYgKCQyLmZsYWdzLnEuY29uc3RhbnQpCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJkdXBsaWNhdGUgY29uc3QgcXVhbGlmaWVyIik7CisKKyAgICAgICQkID0gJDI7CisgICAgICAkJC5mbGFncy5xLmNvbnN0YW50ID0gMTsKKyAgIH0KKyAgIHwgcGFyYW1ldGVyX2RpcmVjdGlvbl9xdWFsaWZpZXIgcGFyYW1ldGVyX3F1YWxpZmllcgorICAgeworICAgICAgaWYgKCgkMS5mbGFncy5xLmluIHx8ICQxLmZsYWdzLnEub3V0KSAmJiAoJDIuZmxhZ3MucS5pbiB8fCAkMi5mbGFncy5xLm91dCkpCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJkdXBsaWNhdGUgaW4vb3V0L2lub3V0IHF1YWxpZmllciIpOworCisgICAgICBpZiAoIXN0YXRlLT5BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrX2VuYWJsZSAmJiAkMi5mbGFncy5xLmNvbnN0YW50KQorICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmQDEsIHN0YXRlLCAiY29uc3QgbXVzdCBiZSBzcGVjaWZpZWQgYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluL291dC9pbm91dCIpOworCisgICAgICAkJCA9ICQxOworICAgICAgJCQubWVyZ2VfcXVhbGlmaWVyKCZAMSwgc3RhdGUsICQyKTsKKyAgIH0KKyAgIHwgcHJlY2lzaW9uX3F1YWxpZmllciBwYXJhbWV0ZXJfcXVhbGlmaWVyCisgICB7CisgICAgICBpZiAoJDIucHJlY2lzaW9uICE9IGFzdF9wcmVjaXNpb25fbm9uZSkKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJkAxLCBzdGF0ZSwgImR1cGxpY2F0ZSBwcmVjaXNpb24gcXVhbGlmaWVyIik7CisKKyAgICAgIGlmICghc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2tfZW5hYmxlICYmICQyLmZsYWdzLmkgIT0gMCkKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJkAxLCBzdGF0ZSwgInByZWNpc2lvbiBxdWFsaWZpZXJzIG11c3QgY29tZSBsYXN0Iik7CisKKyAgICAgICQkID0gJDI7CisgICAgICAkJC5wcmVjaXNpb24gPSAkMTsKKyAgIH0KKworcGFyYW1ldGVyX2RpcmVjdGlvbl9xdWFsaWZpZXI6CisgICBJTl9UT0sKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEuaW4gPSAxOworICAgfQorICAgfCBPVVRfVE9LCisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLm91dCA9IDE7CisgICB9CisgICB8IElOT1VUX1RPSworICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgICAgJCQuZmxhZ3MucS5pbiA9IDE7CisgICAgICAkJC5mbGFncy5xLm91dCA9IDE7CisgICB9CisgICA7CisKK3BhcmFtZXRlcl90eXBlX3NwZWNpZmllcjoKKyAgIHR5cGVfc3BlY2lmaWVyCisgICA7CisKK2luaXRfZGVjbGFyYXRvcl9saXN0OgorICAgc2luZ2xlX2RlY2xhcmF0aW9uCisgICB8IGluaXRfZGVjbGFyYXRvcl9saXN0ICcsJyBhbnlfaWRlbnRpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDMsIE5VTEwsIE5VTEwpOworICAgICAgZGVjbC0+c2V0X2xvY2F0aW9uKEAzKTsKKworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5kZWNsYXJhdGlvbnMucHVzaF90YWlsKCZkZWNsLT5saW5rKTsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5hZGRfdmFyaWFibGUobmV3KHN0YXRlKSBpcl92YXJpYWJsZShOVUxMLCAkMywgaXJfdmFyX2F1dG8pKTsKKyAgIH0KKyAgIHwgaW5pdF9kZWNsYXJhdG9yX2xpc3QgJywnIGFueV9pZGVudGlmaWVyIGFycmF5X3NwZWNpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDMsICQ0LCBOVUxMKTsKKyAgICAgIGRlY2wtPnNldF9sb2NhdGlvbl9yYW5nZShAMywgQDQpOworCisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmRlY2xhcmF0aW9ucy5wdXNoX3RhaWwoJmRlY2wtPmxpbmspOworICAgICAgc3RhdGUtPnN5bWJvbHMtPmFkZF92YXJpYWJsZShuZXcoc3RhdGUpIGlyX3ZhcmlhYmxlKE5VTEwsICQzLCBpcl92YXJfYXV0bykpOworICAgfQorICAgfCBpbml0X2RlY2xhcmF0b3JfbGlzdCAnLCcgYW55X2lkZW50aWZpZXIgYXJyYXlfc3BlY2lmaWVyICc9JyBpbml0aWFsaXplcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDMsICQ0LCAkNik7CisgICAgICBkZWNsLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDMsIEA0KTsKKworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5kZWNsYXJhdGlvbnMucHVzaF90YWlsKCZkZWNsLT5saW5rKTsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5hZGRfdmFyaWFibGUobmV3KHN0YXRlKSBpcl92YXJpYWJsZShOVUxMLCAkMywgaXJfdmFyX2F1dG8pKTsKKyAgIH0KKyAgIHwgaW5pdF9kZWNsYXJhdG9yX2xpc3QgJywnIGFueV9pZGVudGlmaWVyICc9JyBpbml0aWFsaXplcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDMsIE5VTEwsICQ1KTsKKyAgICAgIGRlY2wtPnNldF9sb2NhdGlvbihAMyk7CisKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+ZGVjbGFyYXRpb25zLnB1c2hfdGFpbCgmZGVjbC0+bGluayk7CisgICAgICBzdGF0ZS0+c3ltYm9scy0+YWRkX3ZhcmlhYmxlKG5ldyhzdGF0ZSkgaXJfdmFyaWFibGUoTlVMTCwgJDMsIGlyX3Zhcl9hdXRvKSk7CisgICB9CisgICA7CisKKyAgIC8vIEdyYW1tYXIgTm90ZTogTm8gJ2VudW0nLCBvciAndHlwZWRlZicuCitzaW5nbGVfZGVjbGFyYXRpb246CisgICBmdWxseV9zcGVjaWZpZWRfdHlwZQorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAvKiBFbXB0eSBkZWNsYXJhdGlvbiBsaXN0IGlzIHZhbGlkLiAqLworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRvcl9saXN0KCQxKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgfQorICAgfCBmdWxseV9zcGVjaWZpZWRfdHlwZSBhbnlfaWRlbnRpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDIsIE5VTEwsIE5VTEwpOworICAgICAgZGVjbC0+c2V0X2xvY2F0aW9uKEAyKTsKKworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRvcl9saXN0KCQxKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAyKTsKKyAgICAgICQkLT5kZWNsYXJhdGlvbnMucHVzaF90YWlsKCZkZWNsLT5saW5rKTsKKyAgIH0KKyAgIHwgZnVsbHlfc3BlY2lmaWVkX3R5cGUgYW55X2lkZW50aWZpZXIgYXJyYXlfc3BlY2lmaWVyCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgIGFzdF9kZWNsYXJhdGlvbiAqZGVjbCA9IG5ldyhjdHgpIGFzdF9kZWNsYXJhdGlvbigkMiwgJDMsIE5VTEwpOworICAgICAgZGVjbC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAyLCBAMyk7CisKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2RlY2xhcmF0b3JfbGlzdCgkMSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICAgICAkJC0+ZGVjbGFyYXRpb25zLnB1c2hfdGFpbCgmZGVjbC0+bGluayk7CisgICB9CisgICB8IGZ1bGx5X3NwZWNpZmllZF90eXBlIGFueV9pZGVudGlmaWVyIGFycmF5X3NwZWNpZmllciAnPScgaW5pdGlhbGl6ZXIKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgYXN0X2RlY2xhcmF0aW9uICpkZWNsID0gbmV3KGN0eCkgYXN0X2RlY2xhcmF0aW9uKCQyLCAkMywgJDUpOworICAgICAgZGVjbC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAyLCBAMyk7CisKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2RlY2xhcmF0b3JfbGlzdCgkMSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICAgICAkJC0+ZGVjbGFyYXRpb25zLnB1c2hfdGFpbCgmZGVjbC0+bGluayk7CisgICB9CisgICB8IGZ1bGx5X3NwZWNpZmllZF90eXBlIGFueV9pZGVudGlmaWVyICc9JyBpbml0aWFsaXplcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDIsIE5VTEwsICQ0KTsKKyAgICAgIGRlY2wtPnNldF9sb2NhdGlvbihAMik7CisKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2RlY2xhcmF0b3JfbGlzdCgkMSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMik7CisgICAgICAkJC0+ZGVjbGFyYXRpb25zLnB1c2hfdGFpbCgmZGVjbC0+bGluayk7CisgICB9CisgICB8IElOVkFSSUFOVCB2YXJpYWJsZV9pZGVudGlmaWVyIC8vIFZlcnRleCBvbmx5LgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDIsIE5VTEwsIE5VTEwpOworICAgICAgZGVjbC0+c2V0X2xvY2F0aW9uKEAyKTsKKworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRvcl9saXN0KE5VTEwpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDIpOworICAgICAgJCQtPmludmFyaWFudCA9IHRydWU7CisKKyAgICAgICQkLT5kZWNsYXJhdGlvbnMucHVzaF90YWlsKCZkZWNsLT5saW5rKTsKKyAgIH0KKyAgIDsKKworZnVsbHlfc3BlY2lmaWVkX3R5cGU6CisgICB0eXBlX3NwZWNpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9mdWxseV9zcGVjaWZpZWRfdHlwZSgpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICAkJC0+c3BlY2lmaWVyID0gJDE7CisgICB9CisgICB8IHR5cGVfcXVhbGlmaWVyIHR5cGVfc3BlY2lmaWVyCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlKCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMik7CisgICAgICAkJC0+cXVhbGlmaWVyID0gJDE7CisgICAgICAkJC0+c3BlY2lmaWVyID0gJDI7CisgICB9CisgICA7CisKK2xheW91dF9xdWFsaWZpZXI6CisgICBMQVlPVVRfVE9LICcoJyBsYXlvdXRfcXVhbGlmaWVyX2lkX2xpc3QgJyknCisgICB7CisgICAgICAkJCA9ICQzOworICAgfQorICAgOworCitsYXlvdXRfcXVhbGlmaWVyX2lkX2xpc3Q6CisgICBsYXlvdXRfcXVhbGlmaWVyX2lkCisgICB8IGxheW91dF9xdWFsaWZpZXJfaWRfbGlzdCAnLCcgbGF5b3V0X3F1YWxpZmllcl9pZAorICAgeworICAgICAgJCQgPSAkMTsKKyAgICAgIGlmICghJCQubWVyZ2VfcXVhbGlmaWVyKCYgQDMsIHN0YXRlLCAkMykpIHsKKyAgICAgICAgIFlZRVJST1I7CisgICAgICB9CisgICB9CisgICA7CisKK2ludGVnZXJfY29uc3RhbnQ6CisgICBJTlRDT05TVEFOVCB7ICQkID0gJDE7IH0KKyAgIHwgVUlOVENPTlNUQU5UIHsgJCQgPSAkMTsgfQorICAgOworCitsYXlvdXRfcXVhbGlmaWVyX2lkOgorICAgYW55X2lkZW50aWZpZXIKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKworICAgICAgLyogTGF5b3V0IHF1YWxpZmllcnMgZm9yIEFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucy4gKi8KKyAgICAgIGlmICghJCQuZmxhZ3MuaSAmJiAoc3RhdGUtPkFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uc19lbmFibGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmlzX3ZlcnNpb24oMTUwLCAwKSkpIHsKKyAgICAgICAgIGlmIChtYXRjaF9sYXlvdXRfcXVhbGlmaWVyKCQxLCAib3JpZ2luX3VwcGVyX2xlZnQiLCBzdGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgJCQuZmxhZ3MucS5vcmlnaW5fdXBwZXJfbGVmdCA9IDE7CisgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoX2xheW91dF9xdWFsaWZpZXIoJDEsICJwaXhlbF9jZW50ZXJfaW50ZWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpID09IDApIHsKKyAgICAgICAgICAgICQkLmZsYWdzLnEucGl4ZWxfY2VudGVyX2ludGVnZXIgPSAxOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoJCQuZmxhZ3MuaSAmJiBzdGF0ZS0+QVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zX3dhcm4pIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfd2FybmluZygmIEAxLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xfQVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zIGxheW91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkZW50aWZpZXIgYCVzJyB1c2VkIiwgJDEpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBMYXlvdXQgcXVhbGlmaWVycyBmb3IgQU1EL0FSQl9jb25zZXJ2YXRpdmVfZGVwdGguICovCisgICAgICBpZiAoISQkLmZsYWdzLmkgJiYKKyAgICAgICAgICAoc3RhdGUtPkFNRF9jb25zZXJ2YXRpdmVfZGVwdGhfZW5hYmxlIHx8CisgICAgICAgICAgIHN0YXRlLT5BUkJfY29uc2VydmF0aXZlX2RlcHRoX2VuYWJsZSkpIHsKKyAgICAgICAgIGlmIChtYXRjaF9sYXlvdXRfcXVhbGlmaWVyKCQxLCAiZGVwdGhfYW55Iiwgc3RhdGUpID09IDApIHsKKyAgICAgICAgICAgICQkLmZsYWdzLnEuZGVwdGhfYW55ID0gMTsKKyAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigkMSwgImRlcHRoX2dyZWF0ZXIiLCBzdGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgJCQuZmxhZ3MucS5kZXB0aF9ncmVhdGVyID0gMTsKKyAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigkMSwgImRlcHRoX2xlc3MiLCBzdGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgJCQuZmxhZ3MucS5kZXB0aF9sZXNzID0gMTsKKyAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigkMSwgImRlcHRoX3VuY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpID09IDApIHsKKyAgICAgICAgICAgICQkLmZsYWdzLnEuZGVwdGhfdW5jaGFuZ2VkID0gMTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKCQkLmZsYWdzLmkgJiYgc3RhdGUtPkFNRF9jb25zZXJ2YXRpdmVfZGVwdGhfd2FybikgeworICAgICAgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKCYgQDEsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHTF9BTURfY29uc2VydmF0aXZlX2RlcHRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5b3V0IHF1YWxpZmllciBgJXMnIGlzIHVzZWQiLCAkMSk7CisgICAgICAgICB9CisgICAgICAgICBpZiAoJCQuZmxhZ3MuaSAmJiBzdGF0ZS0+QVJCX2NvbnNlcnZhdGl2ZV9kZXB0aF93YXJuKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX3dhcm5pbmcoJiBAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdMX0FSQl9jb25zZXJ2YXRpdmVfZGVwdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQgcXVhbGlmaWVyIGAlcycgaXMgdXNlZCIsICQxKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogU2VlIGFsc28gaW50ZXJmYWNlX2Jsb2NrX2xheW91dF9xdWFsaWZpZXIuICovCisgICAgICBpZiAoISQkLmZsYWdzLmkgJiYgc3RhdGUtPmhhc191bmlmb3JtX2J1ZmZlcl9vYmplY3RzKCkpIHsKKyAgICAgICAgIGlmIChtYXRjaF9sYXlvdXRfcXVhbGlmaWVyKCQxLCAic3RkMTQwIiwgc3RhdGUpID09IDApIHsKKyAgICAgICAgICAgICQkLmZsYWdzLnEuc3RkMTQwID0gMTsKKyAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigkMSwgInNoYXJlZCIsIHN0YXRlKSA9PSAwKSB7CisgICAgICAgICAgICAkJC5mbGFncy5xLnNoYXJlZCA9IDE7CisgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoX2xheW91dF9xdWFsaWZpZXIoJDEsICJjb2x1bW5fbWFqb3IiLCBzdGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgJCQuZmxhZ3MucS5jb2x1bW5fbWFqb3IgPSAxOworICAgICAgICAgLyogInJvd19tYWpvciIgaXMgYSByZXNlcnZlZCB3b3JkIGluIEdMU0wgMS4zMCsuIEl0cyB0b2tlbiBpcyBwYXJzZWQKKyAgICAgICAgICAqIGJlbG93IGluIHRoZSBpbnRlcmZhY2VfYmxvY2tfbGF5b3V0X3F1YWxpZmllciBydWxlLgorICAgICAgICAgICoKKyAgICAgICAgICAqIEl0IGlzIG5vdCBhIHJlc2VydmVkIHdvcmQgaW4gR0xTTCBFUyAzLjAwLCBzbyBpdCdzIGhhbmRsZWQgaGVyZSBhcworICAgICAgICAgICogYW4gaWRlbnRpZmllci4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBBbHNvLCB0aGlzIHRha2VzIGNhcmUgb2YgYWx0ZXJuYXRlIGNhcGl0YWxpemF0aW9ucyBvZgorICAgICAgICAgICogInJvd19tYWpvciIgKHdoaWNoIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGxheW91dCBxdWFsaWZpZXJzCisgICAgICAgICAgKiBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBpbiBkZXNrdG9wIEdMU0wpLgorICAgICAgICAgICovCisgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoX2xheW91dF9xdWFsaWZpZXIoJDEsICJyb3dfbWFqb3IiLCBzdGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgJCQuZmxhZ3MucS5yb3dfbWFqb3IgPSAxOworICAgICAgICAgLyogInBhY2tlZCIgaXMgYSByZXNlcnZlZCB3b3JkIGluIEdMU0wsIGFuZCBpdHMgdG9rZW4gaXMKKyAgICAgICAgICAqIHBhcnNlZCBiZWxvdyBpbiB0aGUgaW50ZXJmYWNlX2Jsb2NrX2xheW91dF9xdWFsaWZpZXIgcnVsZS4KKyAgICAgICAgICAqIEhvd2V2ZXIsIHdlIG11c3QgdGFrZSBjYXJlIG9mIGFsdGVybmF0ZSBjYXBpdGFsaXphdGlvbnMgb2YKKyAgICAgICAgICAqICJwYWNrZWQiLCBiZWNhdXNlIGxheW91dCBxdWFsaWZpZXJzIGFyZSBjYXNlLWluc2Vuc2l0aXZlCisgICAgICAgICAgKiBpbiBkZXNrdG9wIEdMU0wuCisgICAgICAgICAgKi8KKyAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigkMSwgInBhY2tlZCIsIHN0YXRlKSA9PSAwKSB7CisgICAgICAgICAgICQkLmZsYWdzLnEucGFja2VkID0gMTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKCQkLmZsYWdzLmkgJiYgc3RhdGUtPkFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3Rfd2FybikgeworICAgICAgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKCYgQDEsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjdmVyc2lvbiAxNDAgLyBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5b3V0IHF1YWxpZmllciBgJXMnIGlzIHVzZWQiLCAkMSk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIExheW91dCBxdWFsaWZpZXJzIGZvciBHTFNMIDEuNTAgZ2VvbWV0cnkgc2hhZGVycy4gKi8KKyAgICAgIGlmICghJCQuZmxhZ3MuaSkgeworICAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICAgICAgR0xlbnVtIGU7CisgICAgICAgICB9IG1hcFtdID0geworICAgICAgICAgICAgICAgICB7ICJwb2ludHMiLCBHTF9QT0lOVFMgfSwKKyAgICAgICAgICAgICAgICAgeyAibGluZXMiLCBHTF9MSU5FUyB9LAorICAgICAgICAgICAgICAgICB7ICJsaW5lc19hZGphY2VuY3kiLCBHTF9MSU5FU19BREpBQ0VOQ1kgfSwKKyAgICAgICAgICAgICAgICAgeyAibGluZV9zdHJpcCIsIEdMX0xJTkVfU1RSSVAgfSwKKyAgICAgICAgICAgICAgICAgeyAidHJpYW5nbGVzIiwgR0xfVFJJQU5HTEVTIH0sCisgICAgICAgICAgICAgICAgIHsgInRyaWFuZ2xlc19hZGphY2VuY3kiLCBHTF9UUklBTkdMRVNfQURKQUNFTkNZIH0sCisgICAgICAgICAgICAgICAgIHsgInRyaWFuZ2xlX3N0cmlwIiwgR0xfVFJJQU5HTEVfU1RSSVAgfSwKKyAgICAgICAgIH07CisgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRWxlbWVudHMobWFwKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigkMSwgbWFwW2ldLnMsIHN0YXRlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAkJC5mbGFncy5xLnByaW1fdHlwZSA9IDE7CisgICAgICAgICAgICAgICAkJC5wcmltX3R5cGUgPSBtYXBbaV0uZTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBpZiAoJCQuZmxhZ3MuaSAmJiAhc3RhdGUtPmlzX3ZlcnNpb24oMTUwLCAwKSkgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIEAxLCBzdGF0ZSwgIiN2ZXJzaW9uIDE1MCBsYXlvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhbGlmaWVyIGAlcycgdXNlZCIsICQxKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogTGF5b3V0IHF1YWxpZmllcnMgZm9yIEFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZS4gKi8KKyAgICAgIGlmIChzdGF0ZS0+QVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlX2VuYWJsZSB8fAorICAgICAgICAgIHN0YXRlLT5pc192ZXJzaW9uKDQyMCwgMCkpIHsKKyAgICAgICAgIGlmICghJCQuZmxhZ3MuaSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdDsKKyAgICAgICAgICAgICAgIGdsc2xfYmFzZV90eXBlIGJhc2VfdHlwZTsKKyAgICAgICAgICAgIH0gbWFwW10gPSB7CisgICAgICAgICAgICAgICB7ICJyZ2JhMzJmIiwgR0xfUkdCQTMyRiwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyZ2JhMTZmIiwgR0xfUkdCQTE2RiwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyZzMyZiIsIEdMX1JHMzJGLCBHTFNMX1RZUEVfRkxPQVQgfSwKKyAgICAgICAgICAgICAgIHsgInJnMTZmIiwgR0xfUkcxNkYsIEdMU0xfVFlQRV9GTE9BVCB9LAorICAgICAgICAgICAgICAgeyAicjExZl9nMTFmX2IxMGYiLCBHTF9SMTFGX0cxMUZfQjEwRiwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyMzJmIiwgR0xfUjMyRiwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyMTZmIiwgR0xfUjE2RiwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyZ2JhMzJ1aSIsIEdMX1JHQkEzMlVJLCBHTFNMX1RZUEVfVUlOVCB9LAorICAgICAgICAgICAgICAgeyAicmdiYTE2dWkiLCBHTF9SR0JBMTZVSSwgR0xTTF9UWVBFX1VJTlQgfSwKKyAgICAgICAgICAgICAgIHsgInJnYjEwX2EydWkiLCBHTF9SR0IxMF9BMlVJLCBHTFNMX1RZUEVfVUlOVCB9LAorICAgICAgICAgICAgICAgeyAicmdiYTh1aSIsIEdMX1JHQkE4VUksIEdMU0xfVFlQRV9VSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyZzMydWkiLCBHTF9SRzMyVUksIEdMU0xfVFlQRV9VSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyZzE2dWkiLCBHTF9SRzE2VUksIEdMU0xfVFlQRV9VSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyZzh1aSIsIEdMX1JHOFVJLCBHTFNMX1RZUEVfVUlOVCB9LAorICAgICAgICAgICAgICAgeyAicjMydWkiLCBHTF9SMzJVSSwgR0xTTF9UWVBFX1VJTlQgfSwKKyAgICAgICAgICAgICAgIHsgInIxNnVpIiwgR0xfUjE2VUksIEdMU0xfVFlQRV9VSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyOHVpIiwgR0xfUjhVSSwgR0xTTF9UWVBFX1VJTlQgfSwKKyAgICAgICAgICAgICAgIHsgInJnYmEzMmkiLCBHTF9SR0JBMzJJLCBHTFNMX1RZUEVfSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyZ2JhMTZpIiwgR0xfUkdCQTE2SSwgR0xTTF9UWVBFX0lOVCB9LAorICAgICAgICAgICAgICAgeyAicmdiYThpIiwgR0xfUkdCQThJLCBHTFNMX1RZUEVfSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyZzMyaSIsIEdMX1JHMzJJLCBHTFNMX1RZUEVfSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyZzE2aSIsIEdMX1JHMTZJLCBHTFNMX1RZUEVfSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyZzhpIiwgR0xfUkc4SSwgR0xTTF9UWVBFX0lOVCB9LAorICAgICAgICAgICAgICAgeyAicjMyaSIsIEdMX1IzMkksIEdMU0xfVFlQRV9JTlQgfSwKKyAgICAgICAgICAgICAgIHsgInIxNmkiLCBHTF9SMTZJLCBHTFNMX1RZUEVfSU5UIH0sCisgICAgICAgICAgICAgICB7ICJyOGkiLCBHTF9SOEksIEdMU0xfVFlQRV9JTlQgfSwKKyAgICAgICAgICAgICAgIHsgInJnYmExNiIsIEdMX1JHQkExNiwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyZ2IxMF9hMiIsIEdMX1JHQjEwX0EyLCBHTFNMX1RZUEVfRkxPQVQgfSwKKyAgICAgICAgICAgICAgIHsgInJnYmE4IiwgR0xfUkdCQTgsIEdMU0xfVFlQRV9GTE9BVCB9LAorICAgICAgICAgICAgICAgeyAicmcxNiIsIEdMX1JHMTYsIEdMU0xfVFlQRV9GTE9BVCB9LAorICAgICAgICAgICAgICAgeyAicmc4IiwgR0xfUkc4LCBHTFNMX1RZUEVfRkxPQVQgfSwKKyAgICAgICAgICAgICAgIHsgInIxNiIsIEdMX1IxNiwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyOCIsIEdMX1I4LCBHTFNMX1RZUEVfRkxPQVQgfSwKKyAgICAgICAgICAgICAgIHsgInJnYmExNl9zbm9ybSIsIEdMX1JHQkExNl9TTk9STSwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyZ2JhOF9zbm9ybSIsIEdMX1JHQkE4X1NOT1JNLCBHTFNMX1RZUEVfRkxPQVQgfSwKKyAgICAgICAgICAgICAgIHsgInJnMTZfc25vcm0iLCBHTF9SRzE2X1NOT1JNLCBHTFNMX1RZUEVfRkxPQVQgfSwKKyAgICAgICAgICAgICAgIHsgInJnOF9zbm9ybSIsIEdMX1JHOF9TTk9STSwgR0xTTF9UWVBFX0ZMT0FUIH0sCisgICAgICAgICAgICAgICB7ICJyMTZfc25vcm0iLCBHTF9SMTZfU05PUk0sIEdMU0xfVFlQRV9GTE9BVCB9LAorICAgICAgICAgICAgICAgeyAicjhfc25vcm0iLCBHTF9SOF9TTk9STSwgR0xTTF9UWVBFX0ZMT0FUIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBFbGVtZW50cyhtYXApOyBpKyspIHsKKyAgICAgICAgICAgICAgIGlmIChtYXRjaF9sYXlvdXRfcXVhbGlmaWVyKCQxLCBtYXBbaV0ubmFtZSwgc3RhdGUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICQkLmZsYWdzLnEuZXhwbGljaXRfaW1hZ2VfZm9ybWF0ID0gMTsKKyAgICAgICAgICAgICAgICAgICQkLmltYWdlX2Zvcm1hdCA9IG1hcFtpXS5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAkJC5pbWFnZV9iYXNlX3R5cGUgPSBtYXBbaV0uYmFzZV90eXBlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICghJCQuZmxhZ3MuaSAmJgorICAgICAgICAgICAgIG1hdGNoX2xheW91dF9xdWFsaWZpZXIoJDEsICJlYXJseV9mcmFnbWVudF90ZXN0cyIsIHN0YXRlKSA9PSAwKSB7CisgICAgICAgICAgICAkJC5mbGFncy5xLmVhcmx5X2ZyYWdtZW50X3Rlc3RzID0gMTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCEkJC5mbGFncy5pKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDEsIHN0YXRlLCAidW5yZWNvZ25pemVkIGxheW91dCBpZGVudGlmaWVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImAlcyciLCAkMSk7CisgICAgICAgICBZWUVSUk9SOworICAgICAgfQorICAgfQorICAgfCBhbnlfaWRlbnRpZmllciAnPScgaW50ZWdlcl9jb25zdGFudAorICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworCisgICAgICBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigibG9jYXRpb24iLCAkMSwgc3RhdGUpID09IDApIHsKKyAgICAgICAgICQkLmZsYWdzLnEuZXhwbGljaXRfbG9jYXRpb24gPSAxOworCisgICAgICAgICBpZiAoJCQuZmxhZ3MucS5hdHRyaWJ1dGUgPT0gMSAmJgorICAgICAgICAgICAgIHN0YXRlLT5BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uX3dhcm4pIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfd2FybmluZygmIEAxLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xfQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbiBsYXlvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGlmaWVyIGAlcycgdXNlZCIsICQxKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKCQzID49IDApIHsKKyAgICAgICAgICAgICQkLmxvY2F0aW9uID0gJDM7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMywgc3RhdGUsICJpbnZhbGlkIGxvY2F0aW9uICVkIHNwZWNpZmllZCIsICQzKTsKKyAgICAgICAgICAgICBZWUVSUk9SOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobWF0Y2hfbGF5b3V0X3F1YWxpZmllcigiaW5kZXgiLCAkMSwgc3RhdGUpID09IDApIHsKKyAgICAgICAgICQkLmZsYWdzLnEuZXhwbGljaXRfaW5kZXggPSAxOworCisgICAgICAgICBpZiAoJDMgPj0gMCkgeworICAgICAgICAgICAgJCQuaW5kZXggPSAkMzsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDMsIHN0YXRlLCAiaW52YWxpZCBpbmRleCAlZCBzcGVjaWZpZWQiLCAkMyk7CisgICAgICAgICAgICBZWUVSUk9SOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoKHN0YXRlLT5BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrX2VuYWJsZSB8fAorICAgICAgICAgICBzdGF0ZS0+QVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnNfZW5hYmxlKSAmJgorICAgICAgICAgIG1hdGNoX2xheW91dF9xdWFsaWZpZXIoImJpbmRpbmciLCAkMSwgc3RhdGUpID09IDApIHsKKyAgICAgICAgICQkLmZsYWdzLnEuZXhwbGljaXRfYmluZGluZyA9IDE7CisgICAgICAgICAkJC5iaW5kaW5nID0gJDM7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZS0+QVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnNfZW5hYmxlICYmCisgICAgICAgICAgbWF0Y2hfbGF5b3V0X3F1YWxpZmllcigib2Zmc2V0IiwgJDEsIHN0YXRlKSA9PSAwKSB7CisgICAgICAgICAkJC5mbGFncy5xLmV4cGxpY2l0X29mZnNldCA9IDE7CisgICAgICAgICAkJC5vZmZzZXQgPSAkMzsKKyAgICAgIH0KKworICAgICAgaWYgKG1hdGNoX2xheW91dF9xdWFsaWZpZXIoIm1heF92ZXJ0aWNlcyIsICQxLCBzdGF0ZSkgPT0gMCkgeworICAgICAgICAgJCQuZmxhZ3MucS5tYXhfdmVydGljZXMgPSAxOworCisgICAgICAgICBpZiAoJDMgPCAwKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBtYXhfdmVydGljZXMgJWQgc3BlY2lmaWVkIiwgJDMpOworICAgICAgICAgICAgWVlFUlJPUjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkJC5tYXhfdmVydGljZXMgPSAkMzsKKyAgICAgICAgICAgIGlmICghc3RhdGUtPmlzX3ZlcnNpb24oMTUwLCAwKSkgeworICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIEAzLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiN2ZXJzaW9uIDE1MCBtYXhfdmVydGljZXMgcXVhbGlmaWVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllZCIsICQzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsb2NhbF9zaXplX3F1YWxpZmllcnNbM10gPSB7CisgICAgICAgICAibG9jYWxfc2l6ZV94IiwKKyAgICAgICAgICJsb2NhbF9zaXplX3kiLAorICAgICAgICAgImxvY2FsX3NpemVfeiIsCisgICAgICB9OworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgIGlmIChtYXRjaF9sYXlvdXRfcXVhbGlmaWVyKGxvY2FsX3NpemVfcXVhbGlmaWVyc1tpXSwgJDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCQzIDw9IDApIHsKKyAgICAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkICVzIG9mICVkIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemVfcXVhbGlmaWVyc1tpXSwgJDMpOworICAgICAgICAgICAgICAgWVlFUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLT5pc192ZXJzaW9uKDQzMCwgMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIXN0YXRlLT5BUkJfY29tcHV0ZV9zaGFkZXJfZW5hYmxlKSB7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgcXVhbGlmaWVyIHJlcXVpcmVzIEdMU0wgNC4zMCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUkJfY29tcHV0ZV9zaGFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9zaXplX3F1YWxpZmllcnNbaV0pOworICAgICAgICAgICAgICAgWVlFUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAkJC5mbGFncy5xLmxvY2FsX3NpemUgfD0gKDEgPDwgaSk7CisgICAgICAgICAgICAgICAkJC5sb2NhbF9zaXplW2ldID0gJDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG1hdGNoX2xheW91dF9xdWFsaWZpZXIoImludm9jYXRpb25zIiwgJDEsIHN0YXRlKSA9PSAwKSB7CisgICAgICAgICAkJC5mbGFncy5xLmludm9jYXRpb25zID0gMTsKKworICAgICAgICAgaWYgKCQzIDw9IDApIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGludm9jYXRpb25zICVkIHNwZWNpZmllZCIsICQzKTsKKyAgICAgICAgICAgIFlZRVJST1I7CisgICAgICAgICB9IGVsc2UgaWYgKCQzID4gTUFYX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OUykgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIEAzLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludm9jYXRpb25zICglZCkgZXhjZWVkcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHTF9NQVhfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TIiwgJDMpOworICAgICAgICAgICAgWVlFUlJPUjsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkJC5pbnZvY2F0aW9ucyA9ICQzOworICAgICAgICAgICAgaWYgKCFzdGF0ZS0+aXNfdmVyc2lvbig0MDAsIDApICYmCisgICAgICAgICAgICAgICAgIXN0YXRlLT5BUkJfZ3B1X3NoYWRlcjVfZW5hYmxlKSB7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xfQVJCX2dwdV9zaGFkZXI1IGludm9jYXRpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YWxpZmllciBzcGVjaWZpZWQiLCAkMyk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIElmIHRoZSBpZGVudGlmaWVyIGRpZG4ndCBtYXRjaCBhbnkga25vd24gbGF5b3V0IGlkZW50aWZpZXJzLAorICAgICAgICogZW1pdCBhbiBlcnJvci4KKyAgICAgICAqLworICAgICAgaWYgKCEkJC5mbGFncy5pKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDEsIHN0YXRlLCAidW5yZWNvZ25pemVkIGxheW91dCBpZGVudGlmaWVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImAlcyciLCAkMSk7CisgICAgICAgICBZWUVSUk9SOworICAgICAgfQorICAgfQorICAgfCBpbnRlcmZhY2VfYmxvY2tfbGF5b3V0X3F1YWxpZmllcgorICAgeworICAgICAgJCQgPSAkMTsKKyAgICAgIC8qIExheW91dCBxdWFsaWZpZXJzIGZvciBBUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0LiAqLworICAgICAgaWYgKCQkLmZsYWdzLnEudW5pZm9ybSAmJiAhc3RhdGUtPmhhc191bmlmb3JtX2J1ZmZlcl9vYmplY3RzKCkpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIjdmVyc2lvbiAxNDAgLyBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxheW91dCBxdWFsaWZpZXIgYCVzJyBpcyB1c2VkIiwgJDEpOworICAgICAgfSBlbHNlIGlmICgkJC5mbGFncy5xLnVuaWZvcm0gJiYgc3RhdGUtPkFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3Rfd2FybikgeworICAgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKCYgQDEsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjdmVyc2lvbiAxNDAgLyBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5b3V0IHF1YWxpZmllciBgJXMnIGlzIHVzZWQiLCAkMSk7CisgICAgICB9CisgICB9CisgICA7CisKKy8qIFRoaXMgaXMgYSBzZXBhcmF0ZSBsYW5ndWFnZSBydWxlIGJlY2F1c2Ugd2UgcGFyc2UgdGhlc2UgYXMgdG9rZW5zCisgKiAoZHVlIHRvIHRoZW0gYmVpbmcgcmVzZXJ2ZWQga2V5d29yZHMpIGluc3RlYWQgb2YgaWRlbnRpZmllcnMgbGlrZQorICogbW9zdCBxdWFsaWZpZXJzLiAgU2VlIHRoZSBhbnlfaWRlbnRpZmllciBwYXRoIG9mCisgKiBsYXlvdXRfcXVhbGlmaWVyX2lkIGZvciB0aGUgb3RoZXJzLgorICoKKyAqIE5vdGUgdGhhdCBzaW5jZSBsYXlvdXQgcXVhbGlmaWVycyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBpbiBkZXNrdG9wCisgKiBHTFNMLCBhbGwgb2YgdGhlc2UgcXVhbGlmaWVycyBuZWVkIHRvIGJlIGhhbmRsZWQgYXMgaWRlbnRpZmllcnMgYXMKKyAqIHdlbGwgKGJ5IHRoZSBhbnlfaWRlbnRpZmllciBwYXRoIG9mIGxheW91dF9xdWFsaWZpZXJfaWQpLgorICovCitpbnRlcmZhY2VfYmxvY2tfbGF5b3V0X3F1YWxpZmllcjoKKyAgIFJPV19NQUpPUgorICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgICAgJCQuZmxhZ3MucS5yb3dfbWFqb3IgPSAxOworICAgfQorICAgfCBQQUNLRURfVE9LCisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLnBhY2tlZCA9IDE7CisgICB9CisgICA7CisKK2ludGVycG9sYXRpb25fcXVhbGlmaWVyOgorICAgU01PT1RICisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLnNtb290aCA9IDE7CisgICB9CisgICB8IEZMQVQKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEuZmxhdCA9IDE7CisgICB9CisgICB8IE5PUEVSU1BFQ1RJVkUKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEubm9wZXJzcGVjdGl2ZSA9IDE7CisgICB9CisgICA7CisKK3R5cGVfcXVhbGlmaWVyOgorICAgLyogU2luZ2xlIHF1YWxpZmllcnMgKi8KKyAgIElOVkFSSUFOVAorICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgICAgJCQuZmxhZ3MucS5pbnZhcmlhbnQgPSAxOworICAgfQorICAgfCBhdXhpbGlhcnlfc3RvcmFnZV9xdWFsaWZpZXIKKyAgIHwgc3RvcmFnZV9xdWFsaWZpZXIKKyAgIHwgaW50ZXJwb2xhdGlvbl9xdWFsaWZpZXIKKyAgIHwgbGF5b3V0X3F1YWxpZmllcgorICAgfCBwcmVjaXNpb25fcXVhbGlmaWVyCisgICB7CisgICAgICBtZW1zZXQoJiQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLnByZWNpc2lvbiA9ICQxOworICAgfQorCisgICAvKiBNdWx0aXBsZSBxdWFsaWZpZXJzOgorICAgICogSW4gR0xTTCA0LjIwLCB0aGVzZSBjYW4gYmUgc3BlY2lmaWVkIGluIGFueSBvcmRlci4gIEluIGVhcmxpZXIgdmVyc2lvbnMsCisgICAgKiB0aGV5IGFwcGVhciBpbiB0aGlzIG9yZGVyIChzZWUgR0xTTCAxLjUwIHNlY3Rpb24gNC43ICYgY29tbWVudHMgYmVsb3cpOgorICAgICoKKyAgICAqICAgIGludmFyaWFudCBpbnRlcnBvbGF0aW9uIGF1eGlsaWFyeSBzdG9yYWdlIHByZWNpc2lvbiAgLi4ub3IuLi4KKyAgICAqICAgIGxheW91dCBzdG9yYWdlIHByZWNpc2lvbgorICAgICoKKyAgICAqIEVhY2ggcXVhbGlmaWVyJ3MgcnVsZSBlbnN1cmVzIHRoYXQgdGhlIGFjY3VtdWxhdGVkIHF1YWxpZmllcnMgb24gdGhlIHJpZ2h0CisgICAgKiBzaWRlIGRvbid0IGNvbnRhaW4gYW55IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhlIGxlZnQgaGFuZCBzaWRlLgorICAgICogRm9yIGV4YW1wbGUsIHdoZW4gcHJvY2Vzc2luZyBhIHN0b3JhZ2UgcXVhbGlmaWVyLCB3ZSBjaGVjayB0aGF0IHRoZXJlIGFyZQorICAgICogbm8gYXV4aWxpYXJ5LCBpbnRlcnBvbGF0aW9uLCBsYXlvdXQsIG9yIGludmFyaWFudCBxdWFsaWZpZXJzIHRvIHRoZSByaWdodC4KKyAgICAqLworICAgfCBJTlZBUklBTlQgdHlwZV9xdWFsaWZpZXIKKyAgIHsKKyAgICAgIGlmICgkMi5mbGFncy5xLmludmFyaWFudCkKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJkAxLCBzdGF0ZSwgImR1cGxpY2F0ZSBcImludmFyaWFudFwiIHF1YWxpZmllciIpOworCisgICAgICBpZiAoJDIuaGFzX2xheW91dCgpKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcImludmFyaWFudFwiIGNhbm5vdCBiZSB1c2VkIHdpdGggbGF5b3V0KC4uLikiKTsKKyAgICAgIH0KKworICAgICAgJCQgPSAkMjsKKyAgICAgICQkLmZsYWdzLnEuaW52YXJpYW50ID0gMTsKKyAgIH0KKyAgIHwgaW50ZXJwb2xhdGlvbl9xdWFsaWZpZXIgdHlwZV9xdWFsaWZpZXIKKyAgIHsKKyAgICAgIC8qIFNlY3Rpb24gNC4zIG9mIHRoZSBHTFNMIDEuNDAgc3BlY2lmaWNhdGlvbiBzdGF0ZXM6CisgICAgICAgKiAiLi4ucXVhbGlmaWVkIHdpdGggb25lIG9mIHRoZXNlIGludGVycG9sYXRpb24gcXVhbGlmaWVycyIKKyAgICAgICAqCisgICAgICAgKiBHTFNMIDEuMzAgY2xhaW1zIHRvIGFsbG93ICJvbmUgb3IgbW9yZSIsIGJ1dCBpbnNpc3RzIHRoYXQ6CisgICAgICAgKiAiVGhlc2UgaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXJzIG1heSBvbmx5IHByZWNlZGUgdGhlIHF1YWxpZmllcnMgaW4sCisgICAgICAgKiAgY2VudHJvaWQgaW4sIG91dCwgb3IgY2VudHJvaWQgb3V0IGluIGEgZGVjbGFyYXRpb24uIgorICAgICAgICoKKyAgICAgICAqIC4uLndoaWNoIG1lYW5zIHRoYXQgZS5nLiBzbW9vdGggY2FuJ3QgcHJlY2VkZSBzbW9vdGgsIHNvIHRoZXJlIGNhbiBiZQorICAgICAgICogb25seSBvbmUgYWZ0ZXIgYWxsLCBhbmQgdGhlIDEuNDAgdGV4dCBpcyBhIGNsYXJpZmljYXRpb24sIG5vdCBhIGNoYW5nZS4KKyAgICAgICAqLworICAgICAgaWYgKCQyLmhhc19pbnRlcnBvbGF0aW9uKCkpCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJkdXBsaWNhdGUgaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXIiKTsKKworICAgICAgaWYgKCQyLmhhc19sYXlvdXQoKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmQDEsIHN0YXRlLCAiaW50ZXJwb2xhdGlvbiBxdWFsaWZpZXJzIGNhbm5vdCBiZSB1c2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggbGF5b3V0KC4uLikiKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFzdGF0ZS0+QVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFja19lbmFibGUgJiYgJDIuZmxhZ3MucS5pbnZhcmlhbnQpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJkAxLCBzdGF0ZSwgImludGVycG9sYXRpb24gcXVhbGlmaWVycyBtdXN0IGNvbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgXCJpbnZhcmlhbnRcIiIpOworICAgICAgfQorCisgICAgICAkJCA9ICQxOworICAgICAgJCQubWVyZ2VfcXVhbGlmaWVyKCZAMSwgc3RhdGUsICQyKTsKKyAgIH0KKyAgIHwgbGF5b3V0X3F1YWxpZmllciB0eXBlX3F1YWxpZmllcgorICAgeworICAgICAgLyogVGhlIEdMU0wgMS41MCBncmFtbWFyIGluZGljYXRlcyB0aGF0IGEgbGF5b3V0KC4uLikgZGVjbGFyYXRpb24gY2FuIGJlCisgICAgICAgKiB1c2VkIHN0YW5kYWxvbmUgb3IgaW1tZWRpYXRlbHkgYmVmb3JlIGEgc3RvcmFnZSBxdWFsaWZpZXIuICBJdCBjYW5ub3QKKyAgICAgICAqIGJlIHVzZWQgd2l0aCBpbnRlcnBvbGF0aW9uIHF1YWxpZmllcnMgb3IgaW52YXJpYW50LiAgVGhlcmUgZG9lcyBub3QKKyAgICAgICAqIGFwcGVhciB0byBiZSBhbnkgdGV4dCBpbmRpY2F0aW5nIHRoYXQgaXQgbXVzdCBjb21lIGJlZm9yZSB0aGUgc3RvcmFnZQorICAgICAgICogcXVhbGlmaWVyLCBidXQgYWx3YXlzIHNlZW1zIHRvIGluIGV4YW1wbGVzLgorICAgICAgICovCisgICAgICBpZiAoIXN0YXRlLT5BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrX2VuYWJsZSAmJiAkMi5oYXNfbGF5b3V0KCkpCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJkdXBsaWNhdGUgbGF5b3V0KC4uLikgcXVhbGlmaWVycyIpOworCisgICAgICBpZiAoJDIuZmxhZ3MucS5pbnZhcmlhbnQpCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJsYXlvdXQoLi4uKSBjYW5ub3QgYmUgdXNlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBcImludmFyaWFudFwiIHF1YWxpZmllciIpOworCisgICAgICBpZiAoJDIuaGFzX2ludGVycG9sYXRpb24oKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmQDEsIHN0YXRlLCAibGF5b3V0KC4uLikgY2Fubm90IGJlIHVzZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnBvbGF0aW9uIHF1YWxpZmllcnMiKTsKKyAgICAgIH0KKworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLm1lcmdlX3F1YWxpZmllcigmQDEsIHN0YXRlLCAkMik7CisgICB9CisgICB8IGF1eGlsaWFyeV9zdG9yYWdlX3F1YWxpZmllciB0eXBlX3F1YWxpZmllcgorICAgeworICAgICAgaWYgKCQyLmhhc19hdXhpbGlhcnlfc3RvcmFnZSgpKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGUgYXV4aWxpYXJ5IHN0b3JhZ2UgcXVhbGlmaWVyIChjZW50cm9pZCBvciBzYW1wbGUpIik7CisgICAgICB9CisKKyAgICAgIGlmICghc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2tfZW5hYmxlICYmCisgICAgICAgICAgKCQyLmZsYWdzLnEuaW52YXJpYW50IHx8ICQyLmhhc19pbnRlcnBvbGF0aW9uKCkgfHwgJDIuaGFzX2xheW91dCgpKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmQDEsIHN0YXRlLCAiYXV4aWxpYXJ5IHN0b3JhZ2UgcXVhbGlmaWVycyBtdXN0IGNvbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAianVzdCBiZWZvcmUgc3RvcmFnZSBxdWFsaWZpZXJzIik7CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgICAgJCQubWVyZ2VfcXVhbGlmaWVyKCZAMSwgc3RhdGUsICQyKTsKKyAgIH0KKyAgIHwgc3RvcmFnZV9xdWFsaWZpZXIgdHlwZV9xdWFsaWZpZXIKKyAgIHsKKyAgICAgIC8qIFNlY3Rpb24gNC4zIG9mIHRoZSBHTFNMIDEuMjAgc3BlY2lmaWNhdGlvbiBzdGF0ZXM6CisgICAgICAgKiAiVmFyaWFibGUgZGVjbGFyYXRpb25zIG1heSBoYXZlIGEgc3RvcmFnZSBxdWFsaWZpZXIgc3BlY2lmaWVkLi4uIgorICAgICAgICogIDEuMzAgY2xhcmlmaWVzIHRoaXMgdG8gIm1heSBoYXZlIG9uZSBzdG9yYWdlIHF1YWxpZmllciIuCisgICAgICAgKi8KKyAgICAgIGlmICgkMi5oYXNfc3RvcmFnZSgpKQorICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmQDEsIHN0YXRlLCAiZHVwbGljYXRlIHN0b3JhZ2UgcXVhbGlmaWVyIik7CisKKyAgICAgIGlmICghc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2tfZW5hYmxlICYmCisgICAgICAgICAgKCQyLmZsYWdzLnEuaW52YXJpYW50IHx8ICQyLmhhc19pbnRlcnBvbGF0aW9uKCkgfHwgJDIuaGFzX2xheW91dCgpIHx8CisgICAgICAgICAgICQyLmhhc19hdXhpbGlhcnlfc3RvcmFnZSgpKSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmQDEsIHN0YXRlLCAic3RvcmFnZSBxdWFsaWZpZXJzIG11c3QgY29tZSBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhcmlhbnQsIGludGVycG9sYXRpb24sIGxheW91dCBhbmQgYXV4aWxpYXJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3JhZ2UgcXVhbGlmaWVycyIpOworICAgICAgfQorCisgICAgICAkJCA9ICQxOworICAgICAgJCQubWVyZ2VfcXVhbGlmaWVyKCZAMSwgc3RhdGUsICQyKTsKKyAgIH0KKyAgIHwgcHJlY2lzaW9uX3F1YWxpZmllciB0eXBlX3F1YWxpZmllcgorICAgeworICAgICAgaWYgKCQyLnByZWNpc2lvbiAhPSBhc3RfcHJlY2lzaW9uX25vbmUpCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJkdXBsaWNhdGUgcHJlY2lzaW9uIHF1YWxpZmllciIpOworCisgICAgICBpZiAoIXN0YXRlLT5BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrX2VuYWJsZSAmJiAkMi5mbGFncy5pICE9IDApCisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJwcmVjaXNpb24gcXVhbGlmaWVycyBtdXN0IGNvbWUgbGFzdCIpOworCisgICAgICAkJCA9ICQyOworICAgICAgJCQucHJlY2lzaW9uID0gJDE7CisgICB9CisgICA7CisKK2F1eGlsaWFyeV9zdG9yYWdlX3F1YWxpZmllcjoKKyAgIENFTlRST0lECisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLmNlbnRyb2lkID0gMTsKKyAgIH0KKyAgIHwgU0FNUExFCisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLnNhbXBsZSA9IDE7CisgICB9CisgICAvKiBUT0RPOiAicGF0Y2giIGFsc28gZ29lcyBoZXJlIHNvbWVkYXkuICovCisKK3N0b3JhZ2VfcXVhbGlmaWVyOgorICAgQ09OU1RfVE9LCisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLmNvbnN0YW50ID0gMTsKKyAgIH0KKyAgIHwgQVRUUklCVVRFCisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLmF0dHJpYnV0ZSA9IDE7CisgICB9CisgICB8IFZBUllJTkcKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEudmFyeWluZyA9IDE7CisgICB9CisgICB8IElOX1RPSworICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgICAgJCQuZmxhZ3MucS5pbiA9IDE7CisgICB9CisgICB8IE9VVF9UT0sKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEub3V0ID0gMTsKKyAgIH0KKyAgIHwgVU5JRk9STQorICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgICAgJCQuZmxhZ3MucS51bmlmb3JtID0gMTsKKyAgIH0KKyAgIHwgQ09IRVJFTlQKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEuY29oZXJlbnQgPSAxOworICAgfQorICAgfCBWT0xBVElMRQorICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgICAgJCQuZmxhZ3MucS5fdm9sYXRpbGUgPSAxOworICAgfQorICAgfCBSRVNUUklDVAorICAgeworICAgICAgU1RBVElDX0FTU0VSVChzaXplb2YoJCQuZmxhZ3MucSkgPD0gc2l6ZW9mKCQkLmZsYWdzLmkpKTsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEucmVzdHJpY3RfZmxhZyA9IDE7CisgICB9CisgICB8IFJFQURPTkxZCisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLnJlYWRfb25seSA9IDE7CisgICB9CisgICB8IFdSSVRFT05MWQorICAgeworICAgICAgbWVtc2V0KCYgJCQsIDAsIHNpemVvZigkJCkpOworICAgICAgJCQuZmxhZ3MucS53cml0ZV9vbmx5ID0gMTsKKyAgIH0KKyAgIDsKKworYXJyYXlfc3BlY2lmaWVyOgorICAgJ1snICddJworICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9hcnJheV9zcGVjaWZpZXIoQDEpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDIpOworICAgfQorICAgfCAnWycgY29uc3RhbnRfZXhwcmVzc2lvbiAnXScKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfYXJyYXlfc3BlY2lmaWVyKEAxLCAkMik7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICB9CisgICB8IGFycmF5X3NwZWNpZmllciAnWycgJ10nCisgICB7CisgICAgICAkJCA9ICQxOworCisgICAgICBpZiAoIXN0YXRlLT5BUkJfYXJyYXlzX29mX2FycmF5c19lbmFibGUpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJHTF9BUkJfYXJyYXlzX29mX2FycmF5cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBmb3IgZGVmaW5pbmcgYXJyYXlzIG9mIGFycmF5cyIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IHRoZSBvdXRlcm1vc3QgYXJyYXkgZGltZW5zaW9uIGNhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSB1bnNpemVkIik7CisgICAgICB9CisgICB9CisgICB8IGFycmF5X3NwZWNpZmllciAnWycgY29uc3RhbnRfZXhwcmVzc2lvbiAnXScKKyAgIHsKKyAgICAgICQkID0gJDE7CisKKyAgICAgIGlmICghc3RhdGUtPkFSQl9hcnJheXNfb2ZfYXJyYXlzX2VuYWJsZSkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIEAxLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkdMX0FSQl9hcnJheXNfb2ZfYXJyYXlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGZvciBkZWZpbmluZyBhcnJheXMgb2YgYXJyYXlzIik7CisgICAgICB9CisKKyAgICAgICQkLT5hZGRfZGltZW5zaW9uKCQzKTsKKyAgIH0KKyAgIDsKKwordHlwZV9zcGVjaWZpZXI6CisgICB0eXBlX3NwZWNpZmllcl9ub25hcnJheQorICAgfCB0eXBlX3NwZWNpZmllcl9ub25hcnJheSBhcnJheV9zcGVjaWZpZXIKKyAgIHsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YXJyYXlfc3BlY2lmaWVyID0gJDI7CisgICB9CisgICA7CisKK3R5cGVfc3BlY2lmaWVyX25vbmFycmF5OgorICAgYmFzaWNfdHlwZV9zcGVjaWZpZXJfbm9uYXJyYXkKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfdHlwZV9zcGVjaWZpZXIoJDEpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICB9CisgICB8IHN0cnVjdF9zcGVjaWZpZXIKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfdHlwZV9zcGVjaWZpZXIoJDEpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICB9CisgICB8IFRZUEVfSURFTlRJRklFUgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF90eXBlX3NwZWNpZmllcigkMSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgIH0KKyAgIDsKKworYmFzaWNfdHlwZV9zcGVjaWZpZXJfbm9uYXJyYXk6CisgICBWT0lEX1RPSyAgICAgICAgICAgICAgICAgeyAkJCA9ICJ2b2lkIjsgfQorICAgfCBGTE9BVF9UT0sgICAgICAgICAgICAgIHsgJCQgPSAiZmxvYXQiOyB9CisgICB8IElOVF9UT0sgICAgICAgICAgICAgICAgeyAkJCA9ICJpbnQiOyB9CisgICB8IFVJTlRfVE9LICAgICAgICAgICAgICAgeyAkJCA9ICJ1aW50IjsgfQorICAgfCBCT09MX1RPSyAgICAgICAgICAgICAgIHsgJCQgPSAiYm9vbCI7IH0KKyAgIHwgVkVDMiAgICAgICAgICAgICAgICAgICB7ICQkID0gInZlYzIiOyB9CisgICB8IFZFQzMgICAgICAgICAgICAgICAgICAgeyAkJCA9ICJ2ZWMzIjsgfQorICAgfCBWRUM0ICAgICAgICAgICAgICAgICAgIHsgJCQgPSAidmVjNCI7IH0KKyAgIHwgQlZFQzIgICAgICAgICAgICAgICAgICB7ICQkID0gImJ2ZWMyIjsgfQorICAgfCBCVkVDMyAgICAgICAgICAgICAgICAgIHsgJCQgPSAiYnZlYzMiOyB9CisgICB8IEJWRUM0ICAgICAgICAgICAgICAgICAgeyAkJCA9ICJidmVjNCI7IH0KKyAgIHwgSVZFQzIgICAgICAgICAgICAgICAgICB7ICQkID0gIml2ZWMyIjsgfQorICAgfCBJVkVDMyAgICAgICAgICAgICAgICAgIHsgJCQgPSAiaXZlYzMiOyB9CisgICB8IElWRUM0ICAgICAgICAgICAgICAgICAgeyAkJCA9ICJpdmVjNCI7IH0KKyAgIHwgVVZFQzIgICAgICAgICAgICAgICAgICB7ICQkID0gInV2ZWMyIjsgfQorICAgfCBVVkVDMyAgICAgICAgICAgICAgICAgIHsgJCQgPSAidXZlYzMiOyB9CisgICB8IFVWRUM0ICAgICAgICAgICAgICAgICAgeyAkJCA9ICJ1dmVjNCI7IH0KKyAgIHwgTUFUMlgyICAgICAgICAgICAgICAgICB7ICQkID0gIm1hdDIiOyB9CisgICB8IE1BVDJYMyAgICAgICAgICAgICAgICAgeyAkJCA9ICJtYXQyeDMiOyB9CisgICB8IE1BVDJYNCAgICAgICAgICAgICAgICAgeyAkJCA9ICJtYXQyeDQiOyB9CisgICB8IE1BVDNYMiAgICAgICAgICAgICAgICAgeyAkJCA9ICJtYXQzeDIiOyB9CisgICB8IE1BVDNYMyAgICAgICAgICAgICAgICAgeyAkJCA9ICJtYXQzIjsgfQorICAgfCBNQVQzWDQgICAgICAgICAgICAgICAgIHsgJCQgPSAibWF0M3g0IjsgfQorICAgfCBNQVQ0WDIgICAgICAgICAgICAgICAgIHsgJCQgPSAibWF0NHgyIjsgfQorICAgfCBNQVQ0WDMgICAgICAgICAgICAgICAgIHsgJCQgPSAibWF0NHgzIjsgfQorICAgfCBNQVQ0WDQgICAgICAgICAgICAgICAgIHsgJCQgPSAibWF0NCI7IH0KKyAgIHwgU0FNUExFUjFEICAgICAgICAgICAgICB7ICQkID0gInNhbXBsZXIxRCI7IH0KKyAgIHwgU0FNUExFUjJEICAgICAgICAgICAgICB7ICQkID0gInNhbXBsZXIyRCI7IH0KKyAgIHwgU0FNUExFUjJEUkVDVCAgICAgICAgICB7ICQkID0gInNhbXBsZXIyRFJlY3QiOyB9CisgICB8IFNBTVBMRVIzRCAgICAgICAgICAgICAgeyAkJCA9ICJzYW1wbGVyM0QiOyB9CisgICB8IFNBTVBMRVJDVUJFICAgICAgICAgICAgeyAkJCA9ICJzYW1wbGVyQ3ViZSI7IH0KKyAgIHwgU0FNUExFUkVYVEVSTkFMT0VTICAgICB7ICQkID0gInNhbXBsZXJFeHRlcm5hbE9FUyI7IH0KKyAgIHwgU0FNUExFUjFEU0hBRE9XICAgICAgICB7ICQkID0gInNhbXBsZXIxRFNoYWRvdyI7IH0KKyAgIHwgU0FNUExFUjJEU0hBRE9XICAgICAgICB7ICQkID0gInNhbXBsZXIyRFNoYWRvdyI7IH0KKyAgIHwgU0FNUExFUjJEUkVDVFNIQURPVyAgICB7ICQkID0gInNhbXBsZXIyRFJlY3RTaGFkb3ciOyB9CisgICB8IFNBTVBMRVJDVUJFU0hBRE9XICAgICAgeyAkJCA9ICJzYW1wbGVyQ3ViZVNoYWRvdyI7IH0KKyAgIHwgU0FNUExFUjFEQVJSQVkgICAgICAgICB7ICQkID0gInNhbXBsZXIxREFycmF5IjsgfQorICAgfCBTQU1QTEVSMkRBUlJBWSAgICAgICAgIHsgJCQgPSAic2FtcGxlcjJEQXJyYXkiOyB9CisgICB8IFNBTVBMRVIxREFSUkFZU0hBRE9XICAgeyAkJCA9ICJzYW1wbGVyMURBcnJheVNoYWRvdyI7IH0KKyAgIHwgU0FNUExFUjJEQVJSQVlTSEFET1cgICB7ICQkID0gInNhbXBsZXIyREFycmF5U2hhZG93IjsgfQorICAgfCBTQU1QTEVSQlVGRkVSICAgICAgICAgIHsgJCQgPSAic2FtcGxlckJ1ZmZlciI7IH0KKyAgIHwgU0FNUExFUkNVQkVBUlJBWSAgICAgICB7ICQkID0gInNhbXBsZXJDdWJlQXJyYXkiOyB9CisgICB8IFNBTVBMRVJDVUJFQVJSQVlTSEFET1cgeyAkJCA9ICJzYW1wbGVyQ3ViZUFycmF5U2hhZG93IjsgfQorICAgfCBJU0FNUExFUjFEICAgICAgICAgICAgIHsgJCQgPSAiaXNhbXBsZXIxRCI7IH0KKyAgIHwgSVNBTVBMRVIyRCAgICAgICAgICAgICB7ICQkID0gImlzYW1wbGVyMkQiOyB9CisgICB8IElTQU1QTEVSMkRSRUNUICAgICAgICAgeyAkJCA9ICJpc2FtcGxlcjJEUmVjdCI7IH0KKyAgIHwgSVNBTVBMRVIzRCAgICAgICAgICAgICB7ICQkID0gImlzYW1wbGVyM0QiOyB9CisgICB8IElTQU1QTEVSQ1VCRSAgICAgICAgICAgeyAkJCA9ICJpc2FtcGxlckN1YmUiOyB9CisgICB8IElTQU1QTEVSMURBUlJBWSAgICAgICAgeyAkJCA9ICJpc2FtcGxlcjFEQXJyYXkiOyB9CisgICB8IElTQU1QTEVSMkRBUlJBWSAgICAgICAgeyAkJCA9ICJpc2FtcGxlcjJEQXJyYXkiOyB9CisgICB8IElTQU1QTEVSQlVGRkVSICAgICAgICAgeyAkJCA9ICJpc2FtcGxlckJ1ZmZlciI7IH0KKyAgIHwgSVNBTVBMRVJDVUJFQVJSQVkgICAgICB7ICQkID0gImlzYW1wbGVyQ3ViZUFycmF5IjsgfQorICAgfCBVU0FNUExFUjFEICAgICAgICAgICAgIHsgJCQgPSAidXNhbXBsZXIxRCI7IH0KKyAgIHwgVVNBTVBMRVIyRCAgICAgICAgICAgICB7ICQkID0gInVzYW1wbGVyMkQiOyB9CisgICB8IFVTQU1QTEVSMkRSRUNUICAgICAgICAgeyAkJCA9ICJ1c2FtcGxlcjJEUmVjdCI7IH0KKyAgIHwgVVNBTVBMRVIzRCAgICAgICAgICAgICB7ICQkID0gInVzYW1wbGVyM0QiOyB9CisgICB8IFVTQU1QTEVSQ1VCRSAgICAgICAgICAgeyAkJCA9ICJ1c2FtcGxlckN1YmUiOyB9CisgICB8IFVTQU1QTEVSMURBUlJBWSAgICAgICAgeyAkJCA9ICJ1c2FtcGxlcjFEQXJyYXkiOyB9CisgICB8IFVTQU1QTEVSMkRBUlJBWSAgICAgICAgeyAkJCA9ICJ1c2FtcGxlcjJEQXJyYXkiOyB9CisgICB8IFVTQU1QTEVSQlVGRkVSICAgICAgICAgeyAkJCA9ICJ1c2FtcGxlckJ1ZmZlciI7IH0KKyAgIHwgVVNBTVBMRVJDVUJFQVJSQVkgICAgICB7ICQkID0gInVzYW1wbGVyQ3ViZUFycmF5IjsgfQorICAgfCBTQU1QTEVSMkRNUyAgICAgICAgICAgIHsgJCQgPSAic2FtcGxlcjJETVMiOyB9CisgICB8IElTQU1QTEVSMkRNUyAgICAgICAgICAgeyAkJCA9ICJpc2FtcGxlcjJETVMiOyB9CisgICB8IFVTQU1QTEVSMkRNUyAgICAgICAgICAgeyAkJCA9ICJ1c2FtcGxlcjJETVMiOyB9CisgICB8IFNBTVBMRVIyRE1TQVJSQVkgICAgICAgeyAkJCA9ICJzYW1wbGVyMkRNU0FycmF5IjsgfQorICAgfCBJU0FNUExFUjJETVNBUlJBWSAgICAgIHsgJCQgPSAiaXNhbXBsZXIyRE1TQXJyYXkiOyB9CisgICB8IFVTQU1QTEVSMkRNU0FSUkFZICAgICAgeyAkJCA9ICJ1c2FtcGxlcjJETVNBcnJheSI7IH0KKyAgIHwgSU1BR0UxRCAgICAgICAgICAgICAgICB7ICQkID0gImltYWdlMUQiOyB9CisgICB8IElNQUdFMkQgICAgICAgICAgICAgICAgeyAkJCA9ICJpbWFnZTJEIjsgfQorICAgfCBJTUFHRTNEICAgICAgICAgICAgICAgIHsgJCQgPSAiaW1hZ2UzRCI7IH0KKyAgIHwgSU1BR0UyRFJFQ1QgICAgICAgICAgICB7ICQkID0gImltYWdlMkRSZWN0IjsgfQorICAgfCBJTUFHRUNVQkUgICAgICAgICAgICAgIHsgJCQgPSAiaW1hZ2VDdWJlIjsgfQorICAgfCBJTUFHRUJVRkZFUiAgICAgICAgICAgIHsgJCQgPSAiaW1hZ2VCdWZmZXIiOyB9CisgICB8IElNQUdFMURBUlJBWSAgICAgICAgICAgeyAkJCA9ICJpbWFnZTFEQXJyYXkiOyB9CisgICB8IElNQUdFMkRBUlJBWSAgICAgICAgICAgeyAkJCA9ICJpbWFnZTJEQXJyYXkiOyB9CisgICB8IElNQUdFQ1VCRUFSUkFZICAgICAgICAgeyAkJCA9ICJpbWFnZUN1YmVBcnJheSI7IH0KKyAgIHwgSU1BR0UyRE1TICAgICAgICAgICAgICB7ICQkID0gImltYWdlMkRNUyI7IH0KKyAgIHwgSU1BR0UyRE1TQVJSQVkgICAgICAgICB7ICQkID0gImltYWdlMkRNU0FycmF5IjsgfQorICAgfCBJSU1BR0UxRCAgICAgICAgICAgICAgIHsgJCQgPSAiaWltYWdlMUQiOyB9CisgICB8IElJTUFHRTJEICAgICAgICAgICAgICAgeyAkJCA9ICJpaW1hZ2UyRCI7IH0KKyAgIHwgSUlNQUdFM0QgICAgICAgICAgICAgICB7ICQkID0gImlpbWFnZTNEIjsgfQorICAgfCBJSU1BR0UyRFJFQ1QgICAgICAgICAgIHsgJCQgPSAiaWltYWdlMkRSZWN0IjsgfQorICAgfCBJSU1BR0VDVUJFICAgICAgICAgICAgIHsgJCQgPSAiaWltYWdlQ3ViZSI7IH0KKyAgIHwgSUlNQUdFQlVGRkVSICAgICAgICAgICB7ICQkID0gImlpbWFnZUJ1ZmZlciI7IH0KKyAgIHwgSUlNQUdFMURBUlJBWSAgICAgICAgICB7ICQkID0gImlpbWFnZTFEQXJyYXkiOyB9CisgICB8IElJTUFHRTJEQVJSQVkgICAgICAgICAgeyAkJCA9ICJpaW1hZ2UyREFycmF5IjsgfQorICAgfCBJSU1BR0VDVUJFQVJSQVkgICAgICAgIHsgJCQgPSAiaWltYWdlQ3ViZUFycmF5IjsgfQorICAgfCBJSU1BR0UyRE1TICAgICAgICAgICAgIHsgJCQgPSAiaWltYWdlMkRNUyI7IH0KKyAgIHwgSUlNQUdFMkRNU0FSUkFZICAgICAgICB7ICQkID0gImlpbWFnZTJETVNBcnJheSI7IH0KKyAgIHwgVUlNQUdFMUQgICAgICAgICAgICAgICB7ICQkID0gInVpbWFnZTFEIjsgfQorICAgfCBVSU1BR0UyRCAgICAgICAgICAgICAgIHsgJCQgPSAidWltYWdlMkQiOyB9CisgICB8IFVJTUFHRTNEICAgICAgICAgICAgICAgeyAkJCA9ICJ1aW1hZ2UzRCI7IH0KKyAgIHwgVUlNQUdFMkRSRUNUICAgICAgICAgICB7ICQkID0gInVpbWFnZTJEUmVjdCI7IH0KKyAgIHwgVUlNQUdFQ1VCRSAgICAgICAgICAgICB7ICQkID0gInVpbWFnZUN1YmUiOyB9CisgICB8IFVJTUFHRUJVRkZFUiAgICAgICAgICAgeyAkJCA9ICJ1aW1hZ2VCdWZmZXIiOyB9CisgICB8IFVJTUFHRTFEQVJSQVkgICAgICAgICAgeyAkJCA9ICJ1aW1hZ2UxREFycmF5IjsgfQorICAgfCBVSU1BR0UyREFSUkFZICAgICAgICAgIHsgJCQgPSAidWltYWdlMkRBcnJheSI7IH0KKyAgIHwgVUlNQUdFQ1VCRUFSUkFZICAgICAgICB7ICQkID0gInVpbWFnZUN1YmVBcnJheSI7IH0KKyAgIHwgVUlNQUdFMkRNUyAgICAgICAgICAgICB7ICQkID0gInVpbWFnZTJETVMiOyB9CisgICB8IFVJTUFHRTJETVNBUlJBWSAgICAgICAgeyAkJCA9ICJ1aW1hZ2UyRE1TQXJyYXkiOyB9CisgICB8IEFUT01JQ19VSU5UICAgICAgICAgICAgeyAkJCA9ICJhdG9taWNfdWludCI7IH0KKyAgIDsKKworcHJlY2lzaW9uX3F1YWxpZmllcjoKKyAgIEhJR0hQCisgICB7CisgICAgICBzdGF0ZS0+Y2hlY2tfcHJlY2lzaW9uX3F1YWxpZmllcnNfYWxsb3dlZCgmQDEpOworICAgICAgJCQgPSBhc3RfcHJlY2lzaW9uX2hpZ2g7CisgICB9CisgICB8IE1FRElVTVAKKyAgIHsKKyAgICAgIHN0YXRlLT5jaGVja19wcmVjaXNpb25fcXVhbGlmaWVyc19hbGxvd2VkKCZAMSk7CisgICAgICAkJCA9IGFzdF9wcmVjaXNpb25fbWVkaXVtOworICAgfQorICAgfCBMT1dQCisgICB7CisgICAgICBzdGF0ZS0+Y2hlY2tfcHJlY2lzaW9uX3F1YWxpZmllcnNfYWxsb3dlZCgmQDEpOworICAgICAgJCQgPSBhc3RfcHJlY2lzaW9uX2xvdzsKKyAgIH0KKyAgIDsKKworc3RydWN0X3NwZWNpZmllcjoKKyAgIFNUUlVDVCBhbnlfaWRlbnRpZmllciAneycgc3RydWN0X2RlY2xhcmF0aW9uX2xpc3QgJ30nCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X3N0cnVjdF9zcGVjaWZpZXIoJDIsICQ0KTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDIsIEA1KTsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5hZGRfdHlwZSgkMiwgZ2xzbF90eXBlOjp2b2lkX3R5cGUpOworICAgfQorICAgfCBTVFJVQ1QgJ3snIHN0cnVjdF9kZWNsYXJhdGlvbl9saXN0ICd9JworICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9zdHJ1Y3Rfc3BlY2lmaWVyKE5VTEwsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDIsIEA0KTsKKyAgIH0KKyAgIDsKKworc3RydWN0X2RlY2xhcmF0aW9uX2xpc3Q6CisgICBzdHJ1Y3RfZGVjbGFyYXRpb24KKyAgIHsKKyAgICAgICQkID0gJDE7CisgICAgICAkMS0+bGluay5zZWxmX2xpbmsoKTsKKyAgIH0KKyAgIHwgc3RydWN0X2RlY2xhcmF0aW9uX2xpc3Qgc3RydWN0X2RlY2xhcmF0aW9uCisgICB7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmxpbmsuaW5zZXJ0X2JlZm9yZSgmICQyLT5saW5rKTsKKyAgIH0KKyAgIDsKKworc3RydWN0X2RlY2xhcmF0aW9uOgorICAgZnVsbHlfc3BlY2lmaWVkX3R5cGUgc3RydWN0X2RlY2xhcmF0b3JfbGlzdCAnOycKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlICpjb25zdCB0eXBlID0gJDE7CisgICAgICB0eXBlLT5zZXRfbG9jYXRpb24oQDEpOworCisgICAgICBpZiAodHlwZS0+cXVhbGlmaWVyLmZsYWdzLmkgIT0gMCkKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJkAxLCBzdGF0ZSwKKwkJCSAgIm9ubHkgcHJlY2lzaW9uIHF1YWxpZmllcnMgbWF5IGJlIGFwcGxpZWQgdG8gIgorCQkJICAic3RydWN0dXJlIG1lbWJlcnMiKTsKKworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRvcl9saXN0KHR5cGUpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMik7CisKKyAgICAgICQkLT5kZWNsYXJhdGlvbnMucHVzaF9kZWdlbmVyYXRlX2xpc3RfYXRfaGVhZCgmICQyLT5saW5rKTsKKyAgIH0KKyAgIDsKKworc3RydWN0X2RlY2xhcmF0b3JfbGlzdDoKKyAgIHN0cnVjdF9kZWNsYXJhdG9yCisgICB7CisgICAgICAkJCA9ICQxOworICAgICAgJDEtPmxpbmsuc2VsZl9saW5rKCk7CisgICB9CisgICB8IHN0cnVjdF9kZWNsYXJhdG9yX2xpc3QgJywnIHN0cnVjdF9kZWNsYXJhdG9yCisgICB7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmxpbmsuaW5zZXJ0X2JlZm9yZSgmICQzLT5saW5rKTsKKyAgIH0KKyAgIDsKKworc3RydWN0X2RlY2xhcmF0b3I6CisgICBhbnlfaWRlbnRpZmllcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9kZWNsYXJhdGlvbigkMSwgTlVMTCwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgIH0KKyAgIHwgYW55X2lkZW50aWZpZXIgYXJyYXlfc3BlY2lmaWVyCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2RlY2xhcmF0aW9uKCQxLCAkMiwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMik7CisgICB9CisgICA7CisKK2luaXRpYWxpemVyOgorICAgYXNzaWdubWVudF9leHByZXNzaW9uCisgICB8ICd7JyBpbml0aWFsaXplcl9saXN0ICd9JworICAgeworICAgICAgJCQgPSAkMjsKKyAgIH0KKyAgIHwgJ3snIGluaXRpYWxpemVyX2xpc3QgJywnICd9JworICAgeworICAgICAgJCQgPSAkMjsKKyAgIH0KKyAgIDsKKworaW5pdGlhbGl6ZXJfbGlzdDoKKyAgIGluaXRpYWxpemVyCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2FnZ3JlZ2F0ZV9pbml0aWFsaXplcigpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICAgICAkJC0+ZXhwcmVzc2lvbnMucHVzaF90YWlsKCYgJDEtPmxpbmspOworICAgfQorICAgfCBpbml0aWFsaXplcl9saXN0ICcsJyBpbml0aWFsaXplcgorICAgeworICAgICAgJDEtPmV4cHJlc3Npb25zLnB1c2hfdGFpbCgmICQzLT5saW5rKTsKKyAgIH0KKyAgIDsKKworZGVjbGFyYXRpb25fc3RhdGVtZW50OgorICAgZGVjbGFyYXRpb24KKyAgIDsKKworICAgLy8gR3JhbW1hciBOb3RlOiBsYWJlbGVkIHN0YXRlbWVudHMgZm9yIFNXSVRDSCBvbmx5OyAnZ290bycgaXMgbm90CisgICAvLyBzdXBwb3J0ZWQuCitzdGF0ZW1lbnQ6CisgICBjb21wb3VuZF9zdGF0ZW1lbnQgICAgICAgIHsgJCQgPSAoYXN0X25vZGUgKikgJDE7IH0KKyAgIHwgc2ltcGxlX3N0YXRlbWVudAorICAgOworCitzaW1wbGVfc3RhdGVtZW50OgorICAgZGVjbGFyYXRpb25fc3RhdGVtZW50CisgICB8IGV4cHJlc3Npb25fc3RhdGVtZW50CisgICB8IHNlbGVjdGlvbl9zdGF0ZW1lbnQKKyAgIHwgc3dpdGNoX3N0YXRlbWVudAorICAgfCBpdGVyYXRpb25fc3RhdGVtZW50CisgICB8IGp1bXBfc3RhdGVtZW50CisgICA7CisKK2NvbXBvdW5kX3N0YXRlbWVudDoKKyAgICd7JyAnfScKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfY29tcG91bmRfc3RhdGVtZW50KHRydWUsIE5VTEwpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDIpOworICAgfQorICAgfCAneycKKyAgIHsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wdXNoX3Njb3BlKCk7CisgICB9CisgICBzdGF0ZW1lbnRfbGlzdCAnfScKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfY29tcG91bmRfc3RhdGVtZW50KHRydWUsICQzKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEA0KTsKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKyAgIH0KKyAgIDsKKworc3RhdGVtZW50X25vX25ld19zY29wZToKKyAgIGNvbXBvdW5kX3N0YXRlbWVudF9ub19uZXdfc2NvcGUgeyAkJCA9IChhc3Rfbm9kZSAqKSAkMTsgfQorICAgfCBzaW1wbGVfc3RhdGVtZW50CisgICA7CisKK2NvbXBvdW5kX3N0YXRlbWVudF9ub19uZXdfc2NvcGU6CisgICAneycgJ30nCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2NvbXBvdW5kX3N0YXRlbWVudChmYWxzZSwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMik7CisgICB9CisgICB8ICd7JyBzdGF0ZW1lbnRfbGlzdCAnfScKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfY29tcG91bmRfc3RhdGVtZW50KGZhbHNlLCAkMik7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBAMyk7CisgICB9CisgICA7CisKK3N0YXRlbWVudF9saXN0OgorICAgc3RhdGVtZW50CisgICB7CisgICAgICBpZiAoJDEgPT0gTlVMTCkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIEAxLCBzdGF0ZSwgIjxuaWw+IHN0YXRlbWVudCIpOworICAgICAgICAgYXNzZXJ0KCQxICE9IE5VTEwpOworICAgICAgfQorCisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmxpbmsuc2VsZl9saW5rKCk7CisgICB9CisgICB8IHN0YXRlbWVudF9saXN0IHN0YXRlbWVudAorICAgeworICAgICAgaWYgKCQyID09IE5VTEwpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMiwgc3RhdGUsICI8bmlsPiBzdGF0ZW1lbnQiKTsKKyAgICAgICAgIGFzc2VydCgkMiAhPSBOVUxMKTsKKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+bGluay5pbnNlcnRfYmVmb3JlKCYgJDItPmxpbmspOworICAgfQorICAgOworCitleHByZXNzaW9uX3N0YXRlbWVudDoKKyAgICc7JworICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX3N0YXRlbWVudChOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgfQorICAgfCBleHByZXNzaW9uICc7JworICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9leHByZXNzaW9uX3N0YXRlbWVudCgkMSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgIH0KKyAgIDsKKworc2VsZWN0aW9uX3N0YXRlbWVudDoKKyAgIElGICcoJyBleHByZXNzaW9uICcpJyBzZWxlY3Rpb25fcmVzdF9zdGF0ZW1lbnQKKyAgIHsKKyAgICAgICQkID0gbmV3KHN0YXRlKSBhc3Rfc2VsZWN0aW9uX3N0YXRlbWVudCgkMywgJDUudGhlbl9zdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDUuZWxzZV9zdGF0ZW1lbnQpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDUpOworICAgfQorICAgOworCitzZWxlY3Rpb25fcmVzdF9zdGF0ZW1lbnQ6CisgICBzdGF0ZW1lbnQgRUxTRSBzdGF0ZW1lbnQKKyAgIHsKKyAgICAgICQkLnRoZW5fc3RhdGVtZW50ID0gJDE7CisgICAgICAkJC5lbHNlX3N0YXRlbWVudCA9ICQzOworICAgfQorICAgfCBzdGF0ZW1lbnQgJXByZWMgVEhFTgorICAgeworICAgICAgJCQudGhlbl9zdGF0ZW1lbnQgPSAkMTsKKyAgICAgICQkLmVsc2Vfc3RhdGVtZW50ID0gTlVMTDsKKyAgIH0KKyAgIDsKKworY29uZGl0aW9uOgorICAgZXhwcmVzc2lvbgorICAgeworICAgICAgJCQgPSAoYXN0X25vZGUgKikgJDE7CisgICB9CisgICB8IGZ1bGx5X3NwZWNpZmllZF90eXBlIGFueV9pZGVudGlmaWVyICc9JyBpbml0aWFsaXplcgorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICBhc3RfZGVjbGFyYXRpb24gKmRlY2wgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRpb24oJDIsIE5VTEwsICQ0KTsKKyAgICAgIGFzdF9kZWNsYXJhdG9yX2xpc3QgKmRlY2xhcmF0b3IgPSBuZXcoY3R4KSBhc3RfZGVjbGFyYXRvcl9saXN0KCQxKTsKKyAgICAgIGRlY2wtPnNldF9sb2NhdGlvbl9yYW5nZShAMiwgQDQpOworICAgICAgZGVjbGFyYXRvci0+c2V0X2xvY2F0aW9uKEAxKTsKKworICAgICAgZGVjbGFyYXRvci0+ZGVjbGFyYXRpb25zLnB1c2hfdGFpbCgmZGVjbC0+bGluayk7CisgICAgICAkJCA9IGRlY2xhcmF0b3I7CisgICB9CisgICA7CisKKy8qCisgKiBzaXd0Y2hfc3RhdGVtZW50IGdyYW1tYXIgaXMgYmFzZWQgb24gdGhlIHN5bnRheCBkZXNjcmliZWQgaW4gdGhlIGJvZHkKKyAqIG9mIHRoZSBHTFNMIHNwZWMsIG5vdCBpbiBpdCdzIGFwcGVuZGl4ISEhCisgKi8KK3N3aXRjaF9zdGF0ZW1lbnQ6CisgICBTV0lUQ0ggJygnIGV4cHJlc3Npb24gJyknIHN3aXRjaF9ib2R5CisgICB7CisgICAgICAkJCA9IG5ldyhzdGF0ZSkgYXN0X3N3aXRjaF9zdGF0ZW1lbnQoJDMsICQ1KTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEA1KTsKKyAgIH0KKyAgIDsKKworc3dpdGNoX2JvZHk6CisgICAneycgJ30nCisgICB7CisgICAgICAkJCA9IG5ldyhzdGF0ZSkgYXN0X3N3aXRjaF9ib2R5KE5VTEwpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDIpOworICAgfQorICAgfCAneycgY2FzZV9zdGF0ZW1lbnRfbGlzdCAnfScKKyAgIHsKKyAgICAgICQkID0gbmV3KHN0YXRlKSBhc3Rfc3dpdGNoX2JvZHkoJDIpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDMpOworICAgfQorICAgOworCitjYXNlX2xhYmVsOgorICAgQ0FTRSBleHByZXNzaW9uICc6JworICAgeworICAgICAgJCQgPSBuZXcoc3RhdGUpIGFzdF9jYXNlX2xhYmVsKCQyKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDIpOworICAgfQorICAgfCBERUZBVUxUICc6JworICAgeworICAgICAgJCQgPSBuZXcoc3RhdGUpIGFzdF9jYXNlX2xhYmVsKE5VTEwpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMik7CisgICB9CisgICA7CisKK2Nhc2VfbGFiZWxfbGlzdDoKKyAgIGNhc2VfbGFiZWwKKyAgIHsKKyAgICAgIGFzdF9jYXNlX2xhYmVsX2xpc3QgKmxhYmVscyA9IG5ldyhzdGF0ZSkgYXN0X2Nhc2VfbGFiZWxfbGlzdCgpOworCisgICAgICBsYWJlbHMtPmxhYmVscy5wdXNoX3RhaWwoJiAkMS0+bGluayk7CisgICAgICAkJCA9IGxhYmVsczsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgfQorICAgfCBjYXNlX2xhYmVsX2xpc3QgY2FzZV9sYWJlbAorICAgeworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5sYWJlbHMucHVzaF90YWlsKCYgJDItPmxpbmspOworICAgfQorICAgOworCitjYXNlX3N0YXRlbWVudDoKKyAgIGNhc2VfbGFiZWxfbGlzdCBzdGF0ZW1lbnQKKyAgIHsKKyAgICAgIGFzdF9jYXNlX3N0YXRlbWVudCAqc3RtdHMgPSBuZXcoc3RhdGUpIGFzdF9jYXNlX3N0YXRlbWVudCgkMSk7CisgICAgICBzdG10cy0+c2V0X2xvY2F0aW9uKEAyKTsKKworICAgICAgc3RtdHMtPnN0bXRzLnB1c2hfdGFpbCgmICQyLT5saW5rKTsKKyAgICAgICQkID0gc3RtdHM7CisgICB9CisgICB8IGNhc2Vfc3RhdGVtZW50IHN0YXRlbWVudAorICAgeworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5zdG10cy5wdXNoX3RhaWwoJiAkMi0+bGluayk7CisgICB9CisgICA7CisKK2Nhc2Vfc3RhdGVtZW50X2xpc3Q6CisgICBjYXNlX3N0YXRlbWVudAorICAgeworICAgICAgYXN0X2Nhc2Vfc3RhdGVtZW50X2xpc3QgKmNhc2VzPSBuZXcoc3RhdGUpIGFzdF9jYXNlX3N0YXRlbWVudF9saXN0KCk7CisgICAgICBjYXNlcy0+c2V0X2xvY2F0aW9uKEAxKTsKKworICAgICAgY2FzZXMtPmNhc2VzLnB1c2hfdGFpbCgmICQxLT5saW5rKTsKKyAgICAgICQkID0gY2FzZXM7CisgICB9CisgICB8IGNhc2Vfc3RhdGVtZW50X2xpc3QgY2FzZV9zdGF0ZW1lbnQKKyAgIHsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+Y2FzZXMucHVzaF90YWlsKCYgJDItPmxpbmspOworICAgfQorICAgOworCitpdGVyYXRpb25fc3RhdGVtZW50OgorICAgV0hJTEUgJygnIGNvbmRpdGlvbiAnKScgc3RhdGVtZW50X25vX25ld19zY29wZQorICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9pdGVyYXRpb25fc3RhdGVtZW50KGFzdF9pdGVyYXRpb25fc3RhdGVtZW50Ojphc3Rfd2hpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICQzLCBOVUxMLCAkNSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBANCk7CisgICB9CisgICB8IERPIHN0YXRlbWVudCBXSElMRSAnKCcgZXhwcmVzc2lvbiAnKScgJzsnCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2l0ZXJhdGlvbl9zdGF0ZW1lbnQoYXN0X2l0ZXJhdGlvbl9zdGF0ZW1lbnQ6OmFzdF9kb193aGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJDUsIE5VTEwsICQyKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEA2KTsKKyAgIH0KKyAgIHwgRk9SICcoJyBmb3JfaW5pdF9zdGF0ZW1lbnQgZm9yX3Jlc3Rfc3RhdGVtZW50ICcpJyBzdGF0ZW1lbnRfbm9fbmV3X3Njb3BlCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2l0ZXJhdGlvbl9zdGF0ZW1lbnQoYXN0X2l0ZXJhdGlvbl9zdGF0ZW1lbnQ6OmFzdF9mb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQzLCAkNC5jb25kLCAkNC5yZXN0LCAkNik7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uX3JhbmdlKEAxLCBANik7CisgICB9CisgICA7CisKK2Zvcl9pbml0X3N0YXRlbWVudDoKKyAgIGV4cHJlc3Npb25fc3RhdGVtZW50CisgICB8IGRlY2xhcmF0aW9uX3N0YXRlbWVudAorICAgOworCitjb25kaXRpb25vcHQ6CisgICBjb25kaXRpb24KKyAgIHwgLyogZW1wdHkgKi8KKyAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgIH0KKyAgIDsKKworZm9yX3Jlc3Rfc3RhdGVtZW50OgorICAgY29uZGl0aW9ub3B0ICc7JworICAgeworICAgICAgJCQuY29uZCA9ICQxOworICAgICAgJCQucmVzdCA9IE5VTEw7CisgICB9CisgICB8IGNvbmRpdGlvbm9wdCAnOycgZXhwcmVzc2lvbgorICAgeworICAgICAgJCQuY29uZCA9ICQxOworICAgICAgJCQucmVzdCA9ICQzOworICAgfQorICAgOworCisgICAvLyBHcmFtbWFyIE5vdGU6IE5vICdnb3RvJy4gR290b3MgYXJlIG5vdCBzdXBwb3J0ZWQuCitqdW1wX3N0YXRlbWVudDoKKyAgIENPTlRJTlVFICc7JworICAgeworICAgICAgdm9pZCAqY3R4ID0gc3RhdGU7CisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9qdW1wX3N0YXRlbWVudChhc3RfanVtcF9zdGF0ZW1lbnQ6OmFzdF9jb250aW51ZSwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgIH0KKyAgIHwgQlJFQUsgJzsnCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2p1bXBfc3RhdGVtZW50KGFzdF9qdW1wX3N0YXRlbWVudDo6YXN0X2JyZWFrLCBOVUxMKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb24oQDEpOworICAgfQorICAgfCBSRVRVUk4gJzsnCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2p1bXBfc3RhdGVtZW50KGFzdF9qdW1wX3N0YXRlbWVudDo6YXN0X3JldHVybiwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgIH0KKyAgIHwgUkVUVVJOIGV4cHJlc3Npb24gJzsnCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2p1bXBfc3RhdGVtZW50KGFzdF9qdW1wX3N0YXRlbWVudDo6YXN0X3JldHVybiwgJDIpOworICAgICAgJCQtPnNldF9sb2NhdGlvbl9yYW5nZShAMSwgQDIpOworICAgfQorICAgfCBESVNDQVJEICc7JyAvLyBGcmFnbWVudCBzaGFkZXIgb25seS4KKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgJCQgPSBuZXcoY3R4KSBhc3RfanVtcF9zdGF0ZW1lbnQoYXN0X2p1bXBfc3RhdGVtZW50Ojphc3RfZGlzY2FyZCwgTlVMTCk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAxKTsKKyAgIH0KKyAgIDsKKworZXh0ZXJuYWxfZGVjbGFyYXRpb246CisgICBmdW5jdGlvbl9kZWZpbml0aW9uICAgICAgeyAkJCA9ICQxOyB9CisgICB8IGRlY2xhcmF0aW9uICAgICAgICAgICAgeyAkJCA9ICQxOyB9CisgICB8IHByYWdtYV9zdGF0ZW1lbnQgICAgICAgeyAkJCA9IE5VTEw7IH0KKyAgIHwgbGF5b3V0X2RlZmF1bHRzICAgICAgICB7ICQkID0gJDE7IH0KKyAgIDsKKworZnVuY3Rpb25fZGVmaW5pdGlvbjoKKyAgIGZ1bmN0aW9uX3Byb3RvdHlwZSBjb21wb3VuZF9zdGF0ZW1lbnRfbm9fbmV3X3Njb3BlCisgICB7CisgICAgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgICAgICQkID0gbmV3KGN0eCkgYXN0X2Z1bmN0aW9uX2RlZmluaXRpb24oKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAyKTsKKyAgICAgICQkLT5wcm90b3R5cGUgPSAkMTsKKyAgICAgICQkLT5ib2R5ID0gJDI7CisKKyAgICAgIHN0YXRlLT5zeW1ib2xzLT5wb3Bfc2NvcGUoKTsKKyAgIH0KKyAgIDsKKworLyogbGF5b3V0X3F1YWxpZmllcm9wdCBpcyBwYWNrZWQgaW50byB0aGlzIHJ1bGUgKi8KK2ludGVyZmFjZV9ibG9jazoKKyAgIGJhc2ljX2ludGVyZmFjZV9ibG9jaworICAgeworICAgICAgJCQgPSAkMTsKKyAgIH0KKyAgIHwgbGF5b3V0X3F1YWxpZmllciBiYXNpY19pbnRlcmZhY2VfYmxvY2sKKyAgIHsKKyAgICAgIGFzdF9pbnRlcmZhY2VfYmxvY2sgKmJsb2NrID0gJDI7CisgICAgICBpZiAoIWJsb2NrLT5sYXlvdXQubWVyZ2VfcXVhbGlmaWVyKCYgQDEsIHN0YXRlLCAkMSkpIHsKKyAgICAgICAgIFlZRVJST1I7CisgICAgICB9CisgICAgICAkJCA9IGJsb2NrOworICAgfQorICAgOworCitiYXNpY19pbnRlcmZhY2VfYmxvY2s6CisgICBpbnRlcmZhY2VfcXVhbGlmaWVyIE5FV19JREVOVElGSUVSICd7JyBtZW1iZXJfbGlzdCAnfScgaW5zdGFuY2VfbmFtZV9vcHQgJzsnCisgICB7CisgICAgICBhc3RfaW50ZXJmYWNlX2Jsb2NrICpjb25zdCBibG9jayA9ICQ2OworCisgICAgICBibG9jay0+YmxvY2tfbmFtZSA9ICQyOworICAgICAgYmxvY2stPmRlY2xhcmF0aW9ucy5wdXNoX2RlZ2VuZXJhdGVfbGlzdF9hdF9oZWFkKCYgJDQtPmxpbmspOworCisgICAgICBpZiAoJDEuZmxhZ3MucS51bmlmb3JtKSB7CisgICAgICAgICBpZiAoIXN0YXRlLT5oYXNfdW5pZm9ybV9idWZmZXJfb2JqZWN0cygpKSB7CisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDEsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI3ZlcnNpb24gMTQwIC8gR0xfQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBmb3IgZGVmaW5pbmcgdW5pZm9ybSBibG9ja3MiKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUtPkFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3Rfd2FybikgeworICAgICAgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKCYgQDEsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjdmVyc2lvbiAxNDAgLyBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgZm9yIGRlZmluaW5nIHVuaWZvcm0gYmxvY2tzIik7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgaWYgKHN0YXRlLT5lc19zaGFkZXIgfHwgc3RhdGUtPmxhbmd1YWdlX3ZlcnNpb24gPCAxNTApIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjdmVyc2lvbiAxNTAgcmVxdWlyZWQgZm9yIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBibG9ja3MiKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogRnJvbSB0aGUgR0xTTCAxLjUwLjExIHNwZWMsIHNlY3Rpb24gNC4zLjcgKCJJbnRlcmZhY2UgQmxvY2tzIik6CisgICAgICAgKiAiSXQgaXMgaWxsZWdhbCB0byBoYXZlIGFuIGlucHV0IGJsb2NrIGluIGEgdmVydGV4IHNoYWRlcgorICAgICAgICogIG9yIGFuIG91dHB1dCBibG9jayBpbiBhIGZyYWdtZW50IHNoYWRlciIKKyAgICAgICAqLworICAgICAgaWYgKChzdGF0ZS0+c3RhZ2UgPT0gTUVTQV9TSEFERVJfVkVSVEVYKSAmJiAkMS5mbGFncy5xLmluKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDEsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYGluJyBpbnRlcmZhY2UgYmxvY2sgaXMgbm90IGFsbG93ZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImEgdmVydGV4IHNoYWRlciIpOworICAgICAgfSBlbHNlIGlmICgoc3RhdGUtPnN0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UKSAmJiAkMS5mbGFncy5xLm91dCkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIEAxLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImBvdXQnIGludGVyZmFjZSBibG9jayBpcyBub3QgYWxsb3dlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBmcmFnbWVudCBzaGFkZXIiKTsKKyAgICAgIH0KKworICAgICAgLyogU2luY2UgYmxvY2sgYXJyYXlzIHJlcXVpcmUgbmFtZXMsIGFuZCBib3RoIGZlYXR1cmVzIGFyZSBhZGRlZCBpbgorICAgICAgICogdGhlIHNhbWUgbGFuZ3VhZ2UgdmVyc2lvbnMsIHdlIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseQorICAgICAgICogdmVyc2lvbi1jaGVjayBib3RoIHRoaW5ncy4KKyAgICAgICAqLworICAgICAgaWYgKGJsb2NrLT5pbnN0YW5jZV9uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgIHN0YXRlLT5jaGVja192ZXJzaW9uKDE1MCwgMzAwLCAmIEAxLCAiaW50ZXJmYWNlIGJsb2NrcyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gaW5zdGFuY2UgbmFtZSBhcmUgbm90IGFsbG93ZWQiKTsKKyAgICAgIH0KKworICAgICAgdWludDY0X3QgaW50ZXJmYWNlX3R5cGVfbWFzazsKKyAgICAgIHN0cnVjdCBhc3RfdHlwZV9xdWFsaWZpZXIgdGVtcF90eXBlX3F1YWxpZmllcjsKKworICAgICAgLyogR2V0IGEgYml0bWFzayBjb250YWluaW5nIG9ubHkgdGhlIGluL291dC91bmlmb3JtIGZsYWdzLCBhbGxvd2luZyB1cworICAgICAgICogdG8gaWdub3JlIG90aGVyIGlycmVsZXZhbnQgZmxhZ3MgbGlrZSBpbnRlcnBvbGF0aW9uIHF1YWxpZmllcnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBfdHlwZV9xdWFsaWZpZXIuZmxhZ3MuaSA9IDA7CisgICAgICB0ZW1wX3R5cGVfcXVhbGlmaWVyLmZsYWdzLnEudW5pZm9ybSA9IHRydWU7CisgICAgICB0ZW1wX3R5cGVfcXVhbGlmaWVyLmZsYWdzLnEuaW4gPSB0cnVlOworICAgICAgdGVtcF90eXBlX3F1YWxpZmllci5mbGFncy5xLm91dCA9IHRydWU7CisgICAgICBpbnRlcmZhY2VfdHlwZV9tYXNrID0gdGVtcF90eXBlX3F1YWxpZmllci5mbGFncy5pOworCisgICAgICAvKiBHZXQgdGhlIGJsb2NrJ3MgaW50ZXJmYWNlIHF1YWxpZmllci4gIFRoZSBpbnRlcmZhY2VfcXVhbGlmaWVyCisgICAgICAgKiBwcm9kdWN0aW9uIHJ1bGUgZ3VhcmFudGVlcyB0aGF0IG9ubHkgb25lIGJpdCB3aWxsIGJlIHNldCAoYW5kCisgICAgICAgKiBpdCB3aWxsIGJlIGluL291dC91bmlmb3JtKS4KKyAgICAgICAqLworICAgICAgdWludDY0X3QgYmxvY2tfaW50ZXJmYWNlX3F1YWxpZmllciA9ICQxLmZsYWdzLmk7CisKKyAgICAgIGJsb2NrLT5sYXlvdXQuZmxhZ3MuaSB8PSBibG9ja19pbnRlcmZhY2VfcXVhbGlmaWVyOworCisgICAgICBmb3JlYWNoX2xpc3RfdHlwZWQgKGFzdF9kZWNsYXJhdG9yX2xpc3QsIG1lbWJlciwgbGluaywgJmJsb2NrLT5kZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgIGFzdF90eXBlX3F1YWxpZmllciYgcXVhbGlmaWVyID0gbWVtYmVyLT50eXBlLT5xdWFsaWZpZXI7CisgICAgICAgICBpZiAoKHF1YWxpZmllci5mbGFncy5pICYgaW50ZXJmYWNlX3R5cGVfbWFzaykgPT0gMCkgeworICAgICAgICAgICAgLyogR0xTTGFuZ1NwZWMuMS41MC4xMSwgNC4zLjcgKEludGVyZmFjZSBCbG9ja3MpOgorICAgICAgICAgICAgICogIklmIG5vIG9wdGlvbmFsIHF1YWxpZmllciBpcyB1c2VkIGluIGEgbWVtYmVyIGRlY2xhcmF0aW9uLCB0aGUKKyAgICAgICAgICAgICAqICBxdWFsaWZpZXIgb2YgdGhlIHZhcmlhYmxlIGlzIGp1c3QgaW4sIG91dCwgb3IgdW5pZm9ybSBhcyBkZWNsYXJlZAorICAgICAgICAgICAgICogIGJ5IGludGVyZmFjZS1xdWFsaWZpZXIuIgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBxdWFsaWZpZXIuZmxhZ3MuaSB8PSBibG9ja19pbnRlcmZhY2VfcXVhbGlmaWVyOworICAgICAgICAgfSBlbHNlIGlmICgocXVhbGlmaWVyLmZsYWdzLmkgJiBpbnRlcmZhY2VfdHlwZV9tYXNrKSAhPQorICAgICAgICAgICAgICAgICAgICBibG9ja19pbnRlcmZhY2VfcXVhbGlmaWVyKSB7CisgICAgICAgICAgICAvKiBHTFNMYW5nU3BlYy4xLjUwLjExLCA0LjMuNyAoSW50ZXJmYWNlIEJsb2Nrcyk6CisgICAgICAgICAgICAgKiAiSWYgb3B0aW9uYWwgcXVhbGlmaWVycyBhcmUgdXNlZCwgdGhleSBjYW4gaW5jbHVkZSBpbnRlcnBvbGF0aW9uCisgICAgICAgICAgICAgKiAgYW5kIHN0b3JhZ2UgcXVhbGlmaWVycyBhbmQgdGhleSBtdXN0IGRlY2xhcmUgYW4gaW5wdXQsIG91dHB1dCwKKyAgICAgICAgICAgICAqICBvciB1bmlmb3JtIHZhcmlhYmxlIGNvbnNpc3RlbnQgd2l0aCB0aGUgaW50ZXJmYWNlIHF1YWxpZmllciBvZgorICAgICAgICAgICAgICogIHRoZSBibG9jay4iCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmlmb3JtL2luL291dCBxdWFsaWZpZXIgb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIGJsb2NrIG1lbWJlciBkb2VzIG5vdCBtYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgaW50ZXJmYWNlIGJsb2NrIik7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgICQkID0gYmxvY2s7CisgICB9CisgICA7CisKK2ludGVyZmFjZV9xdWFsaWZpZXI6CisgICBJTl9UT0sKKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEuaW4gPSAxOworICAgfQorICAgfCBPVVRfVE9LCisgICB7CisgICAgICBtZW1zZXQoJiAkJCwgMCwgc2l6ZW9mKCQkKSk7CisgICAgICAkJC5mbGFncy5xLm91dCA9IDE7CisgICB9CisgICB8IFVOSUZPUk0KKyAgIHsKKyAgICAgIG1lbXNldCgmICQkLCAwLCBzaXplb2YoJCQpKTsKKyAgICAgICQkLmZsYWdzLnEudW5pZm9ybSA9IDE7CisgICB9CisgICA7CisKK2luc3RhbmNlX25hbWVfb3B0OgorICAgLyogZW1wdHkgKi8KKyAgIHsKKyAgICAgICQkID0gbmV3KHN0YXRlKSBhc3RfaW50ZXJmYWNlX2Jsb2NrKCpzdGF0ZS0+ZGVmYXVsdF91bmlmb3JtX3F1YWxpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgfQorICAgfCBORVdfSURFTlRJRklFUgorICAgeworICAgICAgJCQgPSBuZXcoc3RhdGUpIGFzdF9pbnRlcmZhY2VfYmxvY2soKnN0YXRlLT5kZWZhdWx0X3VuaWZvcm1fcXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDEsIE5VTEwpOworICAgICAgJCQtPnNldF9sb2NhdGlvbihAMSk7CisgICB9CisgICB8IE5FV19JREVOVElGSUVSIGFycmF5X3NwZWNpZmllcgorICAgeworICAgICAgJCQgPSBuZXcoc3RhdGUpIGFzdF9pbnRlcmZhY2VfYmxvY2soKnN0YXRlLT5kZWZhdWx0X3VuaWZvcm1fcXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDEsICQyKTsKKyAgICAgICQkLT5zZXRfbG9jYXRpb25fcmFuZ2UoQDEsIEAyKTsKKyAgIH0KKyAgIDsKKworbWVtYmVyX2xpc3Q6CisgICBtZW1iZXJfZGVjbGFyYXRpb24KKyAgIHsKKyAgICAgICQkID0gJDE7CisgICAgICAkMS0+bGluay5zZWxmX2xpbmsoKTsKKyAgIH0KKyAgIHwgbWVtYmVyX2RlY2xhcmF0aW9uIG1lbWJlcl9saXN0CisgICB7CisgICAgICAkJCA9ICQxOworICAgICAgJDItPmxpbmsuaW5zZXJ0X2JlZm9yZSgmICQkLT5saW5rKTsKKyAgIH0KKyAgIDsKKworbWVtYmVyX2RlY2xhcmF0aW9uOgorICAgZnVsbHlfc3BlY2lmaWVkX3R5cGUgc3RydWN0X2RlY2xhcmF0b3JfbGlzdCAnOycKKyAgIHsKKyAgICAgIHZvaWQgKmN0eCA9IHN0YXRlOworICAgICAgYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlICp0eXBlID0gJDE7CisgICAgICB0eXBlLT5zZXRfbG9jYXRpb24oQDEpOworCisgICAgICBpZiAodHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEuYXR0cmlidXRlKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCYgQDEsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCAnYXR0cmlidXRlJyBjYW5ub3QgYmUgdXNlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBibG9jayBtZW1iZXIiKTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+cXVhbGlmaWVyLmZsYWdzLnEudmFyeWluZykgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIEAxLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmQgJ3ZhcnlpbmcnIGNhbm5vdCBiZSB1c2VkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIGJsb2NrIG1lbWJlciIpOworICAgICAgfQorCisgICAgICAkJCA9IG5ldyhjdHgpIGFzdF9kZWNsYXJhdG9yX2xpc3QodHlwZSk7CisgICAgICAkJC0+c2V0X2xvY2F0aW9uKEAyKTsKKworICAgICAgJCQtPmRlY2xhcmF0aW9ucy5wdXNoX2RlZ2VuZXJhdGVfbGlzdF9hdF9oZWFkKCYgJDItPmxpbmspOworICAgfQorICAgOworCitsYXlvdXRfZGVmYXVsdHM6CisgICBsYXlvdXRfcXVhbGlmaWVyIFVOSUZPUk0gJzsnCisgICB7CisgICAgICBpZiAoIXN0YXRlLT5kZWZhdWx0X3VuaWZvcm1fcXVhbGlmaWVyLT5tZXJnZV9xdWFsaWZpZXIoJiBAMSwgc3RhdGUsICQxKSkgeworICAgICAgICAgWVlFUlJPUjsKKyAgICAgIH0KKyAgICAgICQkID0gTlVMTDsKKyAgIH0KKworICAgfCBsYXlvdXRfcXVhbGlmaWVyIElOX1RPSyAnOycKKyAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICAgIGlmICghc3RhdGUtPmluX3F1YWxpZmllci0+bWVyZ2VfaW5fcXVhbGlmaWVyKCYgQDEsIHN0YXRlLCAkMSwgJCQpKSB7CisgICAgICAgICBZWUVSUk9SOworICAgICAgfQorICAgfQorCisgICB8IGxheW91dF9xdWFsaWZpZXIgT1VUX1RPSyAnOycKKyAgIHsKKyAgICAgIGlmIChzdGF0ZS0+c3RhZ2UgIT0gTUVTQV9TSEFERVJfR0VPTUVUUlkpIHsKKyAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJiBAMSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgbGF5b3V0IHF1YWxpZmllcnMgb25seSB2YWxpZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW9tZXRyeSBzaGFkZXJzIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgaWYgKCQxLmZsYWdzLnEucHJpbV90eXBlKSB7CisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIG91dHB1dCBwcmltaXRpdmUgdHlwZS4gKi8KKyAgICAgICAgICAgIHN3aXRjaCAoJDEucHJpbV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEdMX1BPSU5UUzoKKyAgICAgICAgICAgIGNhc2UgR0xfTElORV9TVFJJUDoKKyAgICAgICAgICAgIGNhc2UgR0xfVFJJQU5HTEVfU1RSSVA6CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZAMSwgc3RhdGUsICJpbnZhbGlkIGdlb21ldHJ5IHNoYWRlciBvdXRwdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbWl0aXZlIHR5cGUiKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgaWYgKCFzdGF0ZS0+b3V0X3F1YWxpZmllci0+bWVyZ2VfcXVhbGlmaWVyKCYgQDEsIHN0YXRlLCAkMSkpCisgICAgICAgICAgICBZWUVSUk9SOworICAgICAgfQorICAgICAgJCQgPSBOVUxMOworICAgfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX3BhcnNlcl9leHRyYXMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX3BhcnNlcl9leHRyYXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjdhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfcGFyc2VyX2V4dHJhcy5jcHAKQEAgLTAsMCArMSwxODkzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDgsIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNCBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisvLyBUaGVzZSAjaW5jbHVkZXMgTVVTVCBiZSBwcm92aWRlZCBiZWZvcmUgZ2xleHQuaCwgd2hpY2ggcG9sbHV0ZXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisjaW5jbHVkZSAiZ2xzbGFuZy9JbmNsdWRlL1NoSGFuZGxlLmgiCisjaW5jbHVkZSAiZ2xzbGFuZy9QdWJsaWMvU2hhZGVyTGFuZy5oIgorI2luY2x1ZGUgIkZyb250ZW5kcy9nbHNsYW5nL0dsc2xhbmdUb1RvcC5oIgorI2luY2x1ZGUgIkZyb250ZW5kcy9TUElSVi9TcHZUb1RvcC5oIgorI2luY2x1ZGUgIlNQSVJWL0dsc2xhbmdUb1Nwdi5oIgorI2luY2x1ZGUgIlNQSVJWL1NQVlJlbWFwcGVyLmgiCisjaW5jbHVkZSAiU1BJUlYvR0xTTC5zdGQuNDUwLmgiCisjaW5jbHVkZSAiU1BJUlYvZGlzYXNzZW1ibGUuaCIKKyNpbmNsdWRlICJTUElSVi9kb2MuaCIKKyNpbmNsdWRlICJnbHNsX2dsYXNzX21hbmFnZXIuaCIKKyNpbmNsdWRlICJnbHNsX2dsYXNzX2JhY2tlbmRfdHJhbnNsYXRvci5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJsaWJmbnMuaCIgLy8gTHVuYXJHIEFERDoKKyNpbmNsdWRlICJpY2QtdXRpbHMuaCIgIC8vIEx1bmFyRyBBREQ6CisjaW5jbHVkZSAibWFpbi9jb250ZXh0LmgiCisjaW5jbHVkZSAibWFpbi9zaGFkZXJvYmouaCIKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfZGlza2NhY2hlLmgiCit9CisKKyNpbmNsdWRlICJyYWxsb2MuaCIKKyNpbmNsdWRlICJhc3QuaCIKKyNpbmNsdWRlICJnbHNsX3BhcnNlcl9leHRyYXMuaCIKKy8vI2luY2x1ZGUgImdsc2xfcGFyc2VyLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAibG9vcF9hbmFseXNpcy5oIgorI2luY2x1ZGUgInRocmVhZHBvb2wuaCIKKyNpbmNsdWRlICJTUElSVi9zcGlydi5ocHAiCisjaW5jbHVkZSAiQ29yZS9FeGNlcHRpb25zLmgiCisKKworLyoqCisgKiBGb3JtYXQgYSBzaG9ydCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZ2l2ZW4gR0xTTCB2ZXJzaW9uLgorICovCitjb25zdCBjaGFyICoKK2dsc2xfY29tcHV0ZV92ZXJzaW9uX3N0cmluZyh2b2lkICptZW1fY3R4LCBib29sIGlzX2VzLCB1bnNpZ25lZCB2ZXJzaW9uKQoreworICAgcmV0dXJuIHJhbGxvY19hc3ByaW50ZihtZW1fY3R4LCAiR0xTTCVzICVkLiUwMmQiLCBpc19lcyA/ICIgRVMiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gLyAxMDAsIHZlcnNpb24gJSAxMDApOworfQorCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrbm93bl9kZXNrdG9wX2dsc2xfdmVyc2lvbnNbXSA9CisgICB7IDExMCwgMTIwLCAxMzAsIDE0MCwgMTUwLCAzMzAsIDQwMCwgNDEwLCA0MjAsIDQzMCwgNDQwIH07CisKKworX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTo6X21lc2FfZ2xzbF9wYXJzZV9zdGF0ZShzdHJ1Y3QgZ2xfY29udGV4dCAqX2N0eCwKKwkJCQkJICAgICAgIGdsX3NoYWRlcl9zdGFnZSBzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbWVtX2N0eCkKKyAgIDogY3R4KF9jdHgpLCBjc19pbnB1dF9sb2NhbF9zaXplX3NwZWNpZmllZChmYWxzZSksIGNzX2lucHV0X2xvY2FsX3NpemUoKSwKKyAgICAgc3dpdGNoX3N0YXRlKCkKK3sKKyAgIGFzc2VydChzdGFnZSA8IE1FU0FfU0hBREVSX1NUQUdFUyk7CisgICB0aGlzLT5zdGFnZSA9IHN0YWdlOworCisgICB0aGlzLT5zY2FubmVyID0gTlVMTDsKKyAgIHRoaXMtPnRyYW5zbGF0aW9uX3VuaXQubWFrZV9lbXB0eSgpOworICAgdGhpcy0+c3ltYm9scyA9IG5ldyhtZW1fY3R4KSBnbHNsX3N5bWJvbF90YWJsZTsKKworICAgdGhpcy0+aW5mb19sb2cgPSByYWxsb2Nfc3RyZHVwKG1lbV9jdHgsICIiKTsKKyAgIHRoaXMtPmVycm9yID0gZmFsc2U7CisgICB0aGlzLT5sb29wX25lc3RpbmdfYXN0ID0gTlVMTDsKKworICAgdGhpcy0+c3RydWN0X3NwZWNpZmllcl9kZXB0aCA9IDA7CisKKyAgIHRoaXMtPnVzZXNfYnVpbHRpbl9mdW5jdGlvbnMgPSBmYWxzZTsKKworICAgLyogU2V0IGRlZmF1bHQgbGFuZ3VhZ2UgdmVyc2lvbiBhbmQgZXh0ZW5zaW9ucyAqLworICAgdGhpcy0+bGFuZ3VhZ2VfdmVyc2lvbiA9IGN0eC0+Q29uc3QuRm9yY2VHTFNMVmVyc2lvbiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5Db25zdC5Gb3JjZUdMU0xWZXJzaW9uIDogMTEwOworICAgdGhpcy0+ZXNfc2hhZGVyID0gZmFsc2U7CisgICB0aGlzLT5BUkJfdGV4dHVyZV9yZWN0YW5nbGVfZW5hYmxlID0gdHJ1ZTsKKworICAgLyogT3BlbkdMIEVTIDIuMCBoYXMgZGlmZmVyZW50IGRlZmF1bHRzIGZyb20gZGVza3RvcCBHTC4gKi8KKyAgIGlmIChjdHgtPkFQSSA9PSBBUElfT1BFTkdMRVMyKSB7CisgICAgICB0aGlzLT5sYW5ndWFnZV92ZXJzaW9uID0gMTAwOworICAgICAgdGhpcy0+ZXNfc2hhZGVyID0gdHJ1ZTsKKyAgICAgIHRoaXMtPkFSQl90ZXh0dXJlX3JlY3RhbmdsZV9lbmFibGUgPSBmYWxzZTsKKyAgIH0KKworICAgdGhpcy0+ZXh0ZW5zaW9ucyA9ICZjdHgtPkV4dGVuc2lvbnM7CisKKyAgIHRoaXMtPkNvbnN0Lk1heExpZ2h0cyA9IGN0eC0+Q29uc3QuTWF4TGlnaHRzOworICAgdGhpcy0+Q29uc3QuTWF4Q2xpcFBsYW5lcyA9IGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lczsKKyAgIHRoaXMtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA9IGN0eC0+Q29uc3QuTWF4VGV4dHVyZVVuaXRzOworICAgdGhpcy0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkcyA9IGN0eC0+Q29uc3QuTWF4VGV4dHVyZUNvb3JkVW5pdHM7CisgICB0aGlzLT5Db25zdC5NYXhWZXJ0ZXhBdHRyaWJzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4QXR0cmliczsKKyAgIHRoaXMtPkNvbnN0Lk1heFZlcnRleFVuaWZvcm1Db21wb25lbnRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4VW5pZm9ybUNvbXBvbmVudHM7CisgICB0aGlzLT5Db25zdC5NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heFRleHR1cmVJbWFnZVVuaXRzOworICAgdGhpcy0+Q29uc3QuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IGN0eC0+Q29uc3QuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0czsKKyAgIHRoaXMtPkNvbnN0Lk1heFRleHR1cmVJbWFnZVVuaXRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhUZXh0dXJlSW1hZ2VVbml0czsKKyAgIHRoaXMtPkNvbnN0Lk1heEZyYWdtZW50VW5pZm9ybUNvbXBvbmVudHMgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heFVuaWZvcm1Db21wb25lbnRzOworICAgdGhpcy0+Q29uc3QuTWluUHJvZ3JhbVRleGVsT2Zmc2V0ID0gY3R4LT5Db25zdC5NaW5Qcm9ncmFtVGV4ZWxPZmZzZXQ7CisgICB0aGlzLT5Db25zdC5NYXhQcm9ncmFtVGV4ZWxPZmZzZXQgPSBjdHgtPkNvbnN0Lk1heFByb2dyYW1UZXhlbE9mZnNldDsKKworICAgdGhpcy0+Q29uc3QuTWF4RHJhd0J1ZmZlcnMgPSBjdHgtPkNvbnN0Lk1heERyYXdCdWZmZXJzOworCisgICAvKiAxLjUwIGNvbnN0YW50cyAqLworICAgdGhpcy0+Q29uc3QuTWF4VmVydGV4T3V0cHV0Q29tcG9uZW50cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heE91dHB1dENvbXBvbmVudHM7CisgICB0aGlzLT5Db25zdC5NYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4SW5wdXRDb21wb25lbnRzOworICAgdGhpcy0+Q29uc3QuTWF4R2VvbWV0cnlPdXRwdXRDb21wb25lbnRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhPdXRwdXRDb21wb25lbnRzOworICAgdGhpcy0+Q29uc3QuTWF4RnJhZ21lbnRJbnB1dENvbXBvbmVudHMgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heElucHV0Q29tcG9uZW50czsKKyAgIHRoaXMtPkNvbnN0Lk1heEdlb21ldHJ5VGV4dHVyZUltYWdlVW5pdHMgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfR0VPTUVUUlldLk1heFRleHR1cmVJbWFnZVVuaXRzOworICAgdGhpcy0+Q29uc3QuTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlcyA9IGN0eC0+Q29uc3QuTWF4R2VvbWV0cnlPdXRwdXRWZXJ0aWNlczsKKyAgIHRoaXMtPkNvbnN0Lk1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzID0gY3R4LT5Db25zdC5NYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50czsKKyAgIHRoaXMtPkNvbnN0Lk1heEdlb21ldHJ5VW5pZm9ybUNvbXBvbmVudHMgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfR0VPTUVUUlldLk1heFVuaWZvcm1Db21wb25lbnRzOworCisgICB0aGlzLT5Db25zdC5NYXhWZXJ0ZXhBdG9taWNDb3VudGVycyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heEF0b21pY0NvdW50ZXJzOworICAgdGhpcy0+Q29uc3QuTWF4R2VvbWV0cnlBdG9taWNDb3VudGVycyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4QXRvbWljQ291bnRlcnM7CisgICB0aGlzLT5Db25zdC5NYXhGcmFnbWVudEF0b21pY0NvdW50ZXJzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhBdG9taWNDb3VudGVyczsKKyAgIHRoaXMtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQ291bnRlcnMgPSBjdHgtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQ291bnRlcnM7CisgICB0aGlzLT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5ncyA9IGN0eC0+Q29uc3QuTWF4QXRvbWljQnVmZmVyQmluZGluZ3M7CisKKyAgIC8qIENvbXB1dGUgc2hhZGVyIGNvbnN0YW50cyAqLworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEVsZW1lbnRzKHRoaXMtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBDb3VudCk7IGkrKykKKyAgICAgIHRoaXMtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFtpXSA9IGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50W2ldOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEVsZW1lbnRzKHRoaXMtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBTaXplKTsgaSsrKQorICAgICAgdGhpcy0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbaV0gPSBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBTaXplW2ldOworCisgICB0aGlzLT5Db25zdC5NYXhJbWFnZVVuaXRzID0gY3R4LT5Db25zdC5NYXhJbWFnZVVuaXRzOworICAgdGhpcy0+Q29uc3QuTWF4Q29tYmluZWRJbWFnZVVuaXRzQW5kRnJhZ21lbnRPdXRwdXRzID0gY3R4LT5Db25zdC5NYXhDb21iaW5lZEltYWdlVW5pdHNBbmRGcmFnbWVudE91dHB1dHM7CisgICB0aGlzLT5Db25zdC5NYXhJbWFnZVNhbXBsZXMgPSBjdHgtPkNvbnN0Lk1heEltYWdlU2FtcGxlczsKKyAgIHRoaXMtPkNvbnN0Lk1heFZlcnRleEltYWdlVW5pZm9ybXMgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhJbWFnZVVuaWZvcm1zOworICAgdGhpcy0+Q29uc3QuTWF4R2VvbWV0cnlJbWFnZVVuaWZvcm1zID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhJbWFnZVVuaWZvcm1zOworICAgdGhpcy0+Q29uc3QuTWF4RnJhZ21lbnRJbWFnZVVuaWZvcm1zID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhJbWFnZVVuaWZvcm1zOworICAgdGhpcy0+Q29uc3QuTWF4Q29tYmluZWRJbWFnZVVuaWZvcm1zID0gY3R4LT5Db25zdC5NYXhDb21iaW5lZEltYWdlVW5pZm9ybXM7CisKKyAgIHRoaXMtPmN1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOworICAgdGhpcy0+dG9wbGV2ZWxfaXIgPSBOVUxMOworICAgdGhpcy0+Zm91bmRfcmV0dXJuID0gZmFsc2U7CisgICB0aGlzLT5hbGxfaW52YXJpYW50ID0gZmFsc2U7CisgICB0aGlzLT51c2VyX3N0cnVjdHVyZXMgPSBOVUxMOworICAgdGhpcy0+bnVtX3VzZXJfc3RydWN0dXJlcyA9IDA7CisKKyAgIC8qIFBvcHVsYXRlIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBHTFNMIHZlcnNpb25zICovCisgICAvKiBGSU5JU0hNRTogT25jZSB0aGUgT3BlbkdMIDMuMCAnZm9yd2FyZCBjb21wYXRpYmxlJyBjb250ZXh0IG9yCisgICAgKiB0aGUgT3BlbkdMIDMuMiBDb3JlIGNvbnRleHQgaXMgc3VwcG9ydGVkLCB0aGlzIGxvZ2ljIHdpbGwgbmVlZAorICAgICogY2hhbmdlLiAgT2xkZXIgdmVyc2lvbnMgb2YgR0xTTCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorICAgICogb3V0c2lkZSB0aGUgY29tcGF0aWJpbGl0eSBjb250ZXh0cyBvZiAzLnguCisgICAgKi8KKyAgIHRoaXMtPm51bV9zdXBwb3J0ZWRfdmVyc2lvbnMgPSAwOworICAgaWYgKF9tZXNhX2lzX2Rlc2t0b3BfZ2woY3R4KSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa25vd25fZGVza3RvcF9nbHNsX3ZlcnNpb25zKTsgaSsrKSB7CisgICAgICAgICBpZiAoa25vd25fZGVza3RvcF9nbHNsX3ZlcnNpb25zW2ldIDw9IGN0eC0+Q29uc3QuR0xTTFZlcnNpb24pIHsKKyAgICAgICAgICAgIHRoaXMtPnN1cHBvcnRlZF92ZXJzaW9uc1t0aGlzLT5udW1fc3VwcG9ydGVkX3ZlcnNpb25zXS52ZXIKKyAgICAgICAgICAgICAgID0ga25vd25fZGVza3RvcF9nbHNsX3ZlcnNpb25zW2ldOworICAgICAgICAgICAgdGhpcy0+c3VwcG9ydGVkX3ZlcnNpb25zW3RoaXMtPm51bV9zdXBwb3J0ZWRfdmVyc2lvbnNdLmVzID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLT5udW1fc3VwcG9ydGVkX3ZlcnNpb25zKys7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBpZiAoY3R4LT5BUEkgPT0gQVBJX09QRU5HTEVTMiB8fCBjdHgtPkV4dGVuc2lvbnMuQVJCX0VTMl9jb21wYXRpYmlsaXR5KSB7CisgICAgICB0aGlzLT5zdXBwb3J0ZWRfdmVyc2lvbnNbdGhpcy0+bnVtX3N1cHBvcnRlZF92ZXJzaW9uc10udmVyID0gMTAwOworICAgICAgdGhpcy0+c3VwcG9ydGVkX3ZlcnNpb25zW3RoaXMtPm51bV9zdXBwb3J0ZWRfdmVyc2lvbnNdLmVzID0gdHJ1ZTsKKyAgICAgIHRoaXMtPm51bV9zdXBwb3J0ZWRfdmVyc2lvbnMrKzsKKyAgIH0KKyAgIGlmIChfbWVzYV9pc19nbGVzMyhjdHgpIHx8IGN0eC0+RXh0ZW5zaW9ucy5BUkJfRVMzX2NvbXBhdGliaWxpdHkpIHsKKyAgICAgIHRoaXMtPnN1cHBvcnRlZF92ZXJzaW9uc1t0aGlzLT5udW1fc3VwcG9ydGVkX3ZlcnNpb25zXS52ZXIgPSAzMDA7CisgICAgICB0aGlzLT5zdXBwb3J0ZWRfdmVyc2lvbnNbdGhpcy0+bnVtX3N1cHBvcnRlZF92ZXJzaW9uc10uZXMgPSB0cnVlOworICAgICAgdGhpcy0+bnVtX3N1cHBvcnRlZF92ZXJzaW9ucysrOworICAgfQorICAgYXNzZXJ0KHRoaXMtPm51bV9zdXBwb3J0ZWRfdmVyc2lvbnMKKyAgICAgICAgICA8PSBBUlJBWV9TSVpFKHRoaXMtPnN1cHBvcnRlZF92ZXJzaW9ucykpOworCisgICAvKiBDcmVhdGUgYSBzdHJpbmcgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcyB0byB0ZWxsIHRoZSB1c2VyIHdoaWNoIEdMU0wKKyAgICAqIHZlcnNpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgKi8KKyAgIGNoYXIgKnN1cHBvcnRlZCA9IHJhbGxvY19zdHJkdXAodGhpcywgIiIpOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPm51bV9zdXBwb3J0ZWRfdmVyc2lvbnM7IGkrKykgeworICAgICAgdW5zaWduZWQgdmVyID0gdGhpcy0+c3VwcG9ydGVkX3ZlcnNpb25zW2ldLnZlcjsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHByZWZpeCA9IChpID09IDApCisJID8gIiIKKwkgOiAoKGkgPT0gdGhpcy0+bnVtX3N1cHBvcnRlZF92ZXJzaW9ucyAtIDEpID8gIiwgYW5kICIgOiAiLCAiKTsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHN1ZmZpeCA9ICh0aGlzLT5zdXBwb3J0ZWRfdmVyc2lvbnNbaV0uZXMpID8gIiBFUyIgOiAiIjsKKworICAgICAgcmFsbG9jX2FzcHJpbnRmX2FwcGVuZCgmIHN1cHBvcnRlZCwgIiVzJXUuJTAydSVzIiwKKwkJCSAgICAgcHJlZml4LAorCQkJICAgICB2ZXIgLyAxMDAsIHZlciAlIDEwMCwKKwkJCSAgICAgc3VmZml4KTsKKyAgIH0KKworICAgdGhpcy0+c3VwcG9ydGVkX3ZlcnNpb25fc3RyaW5nID0gc3VwcG9ydGVkOworCisgICBpZiAoY3R4LT5Db25zdC5Gb3JjZUdMU0xFeHRlbnNpb25zV2FybikKKyAgICAgIF9tZXNhX2dsc2xfcHJvY2Vzc19leHRlbnNpb24oImFsbCIsIE5VTEwsICJ3YXJuIiwgTlVMTCwgdGhpcyk7CisKKyAgIHRoaXMtPmRlZmF1bHRfdW5pZm9ybV9xdWFsaWZpZXIgPSBuZXcodGhpcykgYXN0X3R5cGVfcXVhbGlmaWVyKCk7CisgICB0aGlzLT5kZWZhdWx0X3VuaWZvcm1fcXVhbGlmaWVyLT5mbGFncy5xLnNoYXJlZCA9IDE7CisgICB0aGlzLT5kZWZhdWx0X3VuaWZvcm1fcXVhbGlmaWVyLT5mbGFncy5xLmNvbHVtbl9tYWpvciA9IDE7CisKKyAgIHRoaXMtPmZzX3VzZXNfZ2xfZnJhZ2Nvb3JkID0gZmFsc2U7CisgICB0aGlzLT5mc19yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZCA9IGZhbHNlOworICAgdGhpcy0+ZnNfb3JpZ2luX3VwcGVyX2xlZnQgPSBmYWxzZTsKKyAgIHRoaXMtPmZzX3BpeGVsX2NlbnRlcl9pbnRlZ2VyID0gZmFsc2U7CisgICB0aGlzLT5mc19yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZF93aXRoX25vX2xheW91dF9xdWFsaWZpZXJzID0gZmFsc2U7CisKKyAgIHRoaXMtPmdzX2lucHV0X3ByaW1fdHlwZV9zcGVjaWZpZWQgPSBmYWxzZTsKKyAgIHRoaXMtPmdzX2lucHV0X3NpemUgPSAwOworICAgdGhpcy0+aW5fcXVhbGlmaWVyID0gbmV3KHRoaXMpIGFzdF90eXBlX3F1YWxpZmllcigpOworICAgdGhpcy0+b3V0X3F1YWxpZmllciA9IG5ldyh0aGlzKSBhc3RfdHlwZV9xdWFsaWZpZXIoKTsKKyAgIHRoaXMtPmVhcmx5X2ZyYWdtZW50X3Rlc3RzID0gZmFsc2U7CisgICBtZW1zZXQodGhpcy0+YXRvbWljX2NvdW50ZXJfb2Zmc2V0cywgMCwKKyAgICAgICAgICBzaXplb2YodGhpcy0+YXRvbWljX2NvdW50ZXJfb2Zmc2V0cykpOworfQorCisvKioKKyAqIERldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IEdMU0wgdmVyc2lvbiBpcyBzdWZmaWNpZW50bHkgaGlnaCB0byBzdXBwb3J0CisgKiBhIGNlcnRhaW4gZmVhdHVyZSwgYW5kIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYgaXQgaXNuJ3QuCisgKgorICogXHBhcmFtIHJlcXVpcmVkX2dsc2xfdmVyc2lvbiBhbmQgXGMgcmVxdWlyZWRfZ2xzbF9lc192ZXJzaW9uIGFyZQorICogaW50ZXJwcmV0ZWQgYXMgdGhleSBhcmUgaW4gX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTo6aXNfdmVyc2lvbigpLgorICoKKyAqIFxwYXJhbSBsb2NwIGlzIHRoZSBwYXJzZXIgbG9jYXRpb24gd2hlcmUgdGhlIGVycm9yIHNob3VsZCBiZSByZXBvcnRlZC4KKyAqCisgKiBccGFyYW0gZm10IChhbmQgYWRkaXRpb25hbCBhcmd1bWVudHMpIGNvbnN0aXR1dGUgYSBwcmludGYtc3R5bGUgZXJyb3IKKyAqIG1lc3NhZ2UgdG8gcmVwb3J0IGlmIHRoZSB2ZXJzaW9uIGNoZWNrIGZhaWxzLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBjdXJyZW50IGFuZCByZXF1aXJlZCBHTFNMIHZlcnNpb25zIHdpbGwgYmUgYXBwZW5kZWQuICBTbywgZm9yIGV4YW1wbGUsIGlmCisgKiB0aGUgR0xTTCB2ZXJzaW9uIGJlaW5nIGNvbXBpbGVkIGlzIDEuMjAsIGFuZCBjaGVja192ZXJzaW9uKDEzMCwgMzAwLCBsb2NwLAorICogImZvbyB1bnN1cHBvcnRlZCIpIGlzIGNhbGxlZCwgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSAiZm9vIHVuc3VwcG9ydGVkIGluCisgKiBHTFNMIDEuMjAgKEdMU0wgMS4zMCBvciBHTFNMIDMuMDAgRVMgcmVxdWlyZWQpIi4KKyAqLworYm9vbAorX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTo6Y2hlY2tfdmVyc2lvbih1bnNpZ25lZCByZXF1aXJlZF9nbHNsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlcXVpcmVkX2dsc2xfZXNfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVlMVFlQRSAqbG9jcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICBpZiAodGhpcy0+aXNfdmVyc2lvbihyZXF1aXJlZF9nbHNsX3ZlcnNpb24sIHJlcXVpcmVkX2dsc2xfZXNfdmVyc2lvbikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgdmFfbGlzdCBhcmdzOworICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgIGNoYXIgKnByb2JsZW0gPSByYWxsb2NfdmFzcHJpbnRmKHRoaXMsIGZtdCwgYXJncyk7CisgICB2YV9lbmQoYXJncyk7CisgICBjb25zdCBjaGFyICpnbHNsX3ZlcnNpb25fc3RyaW5nCisgICAgICA9IGdsc2xfY29tcHV0ZV92ZXJzaW9uX3N0cmluZyh0aGlzLCBmYWxzZSwgcmVxdWlyZWRfZ2xzbF92ZXJzaW9uKTsKKyAgIGNvbnN0IGNoYXIgKmdsc2xfZXNfdmVyc2lvbl9zdHJpbmcKKyAgICAgID0gZ2xzbF9jb21wdXRlX3ZlcnNpb25fc3RyaW5nKHRoaXMsIHRydWUsIHJlcXVpcmVkX2dsc2xfZXNfdmVyc2lvbik7CisgICBjb25zdCBjaGFyICpyZXF1aXJlbWVudF9zdHJpbmcgPSAiIjsKKyAgIGlmIChyZXF1aXJlZF9nbHNsX3ZlcnNpb24gJiYgcmVxdWlyZWRfZ2xzbF9lc192ZXJzaW9uKSB7CisgICAgICByZXF1aXJlbWVudF9zdHJpbmcgPSByYWxsb2NfYXNwcmludGYodGhpcywgIiAoJXMgb3IgJXMgcmVxdWlyZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHNsX3ZlcnNpb25fc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsc2xfZXNfdmVyc2lvbl9zdHJpbmcpOworICAgfSBlbHNlIGlmIChyZXF1aXJlZF9nbHNsX3ZlcnNpb24pIHsKKyAgICAgIHJlcXVpcmVtZW50X3N0cmluZyA9IHJhbGxvY19hc3ByaW50Zih0aGlzLCAiICglcyByZXF1aXJlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsc2xfdmVyc2lvbl9zdHJpbmcpOworICAgfSBlbHNlIGlmIChyZXF1aXJlZF9nbHNsX2VzX3ZlcnNpb24pIHsKKyAgICAgIHJlcXVpcmVtZW50X3N0cmluZyA9IHJhbGxvY19hc3ByaW50Zih0aGlzLCAiICglcyByZXF1aXJlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsc2xfZXNfdmVyc2lvbl9zdHJpbmcpOworICAgfQorICAgX21lc2FfZ2xzbF9lcnJvcihsb2NwLCB0aGlzLCAiJXMgaW4gJXMlcyIsCisgICAgICAgICAgICAgICAgICAgIHByb2JsZW0sIHRoaXMtPmdldF92ZXJzaW9uX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zdHJpbmcpOworCisgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogUHJvY2VzcyBhIEdMU0wgI3ZlcnNpb24gZGlyZWN0aXZlLgorICoKKyAqIFxwYXJhbSB2ZXJzaW9uIGlzIHRoZSBpbnRlZ2VyIHRoYXQgZm9sbG93cyB0aGUgI3ZlcnNpb24gdG9rZW4uCisgKgorICogXHBhcmFtIGlkZW50IGlzIGEgc3RyaW5nIGlkZW50aWZpZXIgdGhhdCBmb2xsb3dzIHRoZSBpbnRlZ2VyLCBpZiBhbnkgaXMKKyAqIHByZXNlbnQuICBPdGhlcndpc2UgTlVMTC4KKyAqLwordm9pZAorX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTo6cHJvY2Vzc192ZXJzaW9uX2RpcmVjdGl2ZShZWUxUWVBFICpsb2NwLCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnQpCit7CisgICBib29sIGVzX3Rva2VuX3ByZXNlbnQgPSBmYWxzZTsKKyAgIGlmIChpZGVudCkgeworICAgICAgaWYgKHN0cmNtcChpZGVudCwgImVzIikgPT0gMCkgeworICAgICAgICAgZXNfdG9rZW5fcHJlc2VudCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPj0gMTUwKSB7CisgICAgICAgICBpZiAoc3RyY21wKGlkZW50LCAiY29yZSIpID09IDApIHsKKyAgICAgICAgICAgIC8qIEFjY2VwdCB0aGUgdG9rZW4uICBUaGVyZSdzIG5vIG5lZWQgdG8gcmVjb3JkIHRoYXQgdGhpcyBpcworICAgICAgICAgICAgICogYSBjb3JlIHByb2ZpbGUgc2hhZGVyIHNpbmNlIHRoYXQncyB0aGUgb25seSBwcm9maWxlIHdlIHN1cHBvcnQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGlkZW50LCAiY29tcGF0aWJpbGl0eSIpID09IDApIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jcCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IobG9jcCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBpcyBub3QgYSB2YWxpZCBzaGFkaW5nIGxhbmd1YWdlIHByb2ZpbGU7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmIHByZXNlbnQsIGl0IG11c3QgYmUgXCJjb3JlXCIiLCBpZGVudCk7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2NwLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCB0ZXh0IGZvbGxvd2luZyB2ZXJzaW9uIG51bWJlciIpOworICAgICAgfQorICAgfQorCisgICB0aGlzLT5lc19zaGFkZXIgPSBlc190b2tlbl9wcmVzZW50OworICAgaWYgKHZlcnNpb24gPT0gMTAwKSB7CisgICAgICBpZiAoZXNfdG9rZW5fcHJlc2VudCkgeworICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihsb2NwLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xTTCAxLjAwIEVTIHNob3VsZCBiZSBzZWxlY3RlZCB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJgI3ZlcnNpb24gMTAwJyIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHRoaXMtPmVzX3NoYWRlciA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIGlmICh0aGlzLT5lc19zaGFkZXIpIHsKKyAgICAgIHRoaXMtPkFSQl90ZXh0dXJlX3JlY3RhbmdsZV9lbmFibGUgPSBmYWxzZTsKKyAgIH0KKworICAgdGhpcy0+bGFuZ3VhZ2VfdmVyc2lvbiA9IHZlcnNpb247CisKKyAgIGJvb2wgc3VwcG9ydGVkID0gZmFsc2U7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdGhpcy0+bnVtX3N1cHBvcnRlZF92ZXJzaW9uczsgaSsrKSB7CisgICAgICBpZiAodGhpcy0+c3VwcG9ydGVkX3ZlcnNpb25zW2ldLnZlciA9PSAodW5zaWduZWQpIHZlcnNpb24KKyAgICAgICAgICAmJiB0aGlzLT5zdXBwb3J0ZWRfdmVyc2lvbnNbaV0uZXMgPT0gdGhpcy0+ZXNfc2hhZGVyKSB7CisgICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGlmICghc3VwcG9ydGVkKSB7CisgICAgICBfbWVzYV9nbHNsX2Vycm9yKGxvY3AsIHRoaXMsICIlcyBpcyBub3Qgc3VwcG9ydGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICJTdXBwb3J0ZWQgdmVyc2lvbnMgYXJlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldF92ZXJzaW9uX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdXBwb3J0ZWRfdmVyc2lvbl9zdHJpbmcpOworCisgICAgICAvKiBPbiBleGl0LCB0aGUgbGFuZ3VhZ2VfdmVyc2lvbiBtdXN0IGJlIHNldCB0byBhIHZhbGlkIHZhbHVlLgorICAgICAgICogTGF0ZXIgY2FsbHMgdG8gX21lc2FfZ2xzbF9pbml0aWFsaXplX3R5cGVzIHdpbGwgbWlzYmVoYXZlIGlmCisgICAgICAgKiB0aGUgdmVyc2lvbiBpcyBpbnZhbGlkLgorICAgICAgICovCisgICAgICBzd2l0Y2ggKHRoaXMtPmN0eC0+QVBJKSB7CisgICAgICBjYXNlIEFQSV9PUEVOR0xfQ09NUEFUOgorICAgICAgY2FzZSBBUElfT1BFTkdMX0NPUkU6CisJIHRoaXMtPmxhbmd1YWdlX3ZlcnNpb24gPSB0aGlzLT5jdHgtPkNvbnN0LkdMU0xWZXJzaW9uOworCSBicmVhazsKKworICAgICAgY2FzZSBBUElfT1BFTkdMRVM6CisJIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisJIC8qIEZBTExUSFJPVUdIICovCisKKyAgICAgIGNhc2UgQVBJX09QRU5HTEVTMjoKKwkgdGhpcy0+bGFuZ3VhZ2VfdmVyc2lvbiA9IDEwMDsKKwkgYnJlYWs7CisgICAgICBjYXNlIEFQSV9WSzoKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogVHJhbnNsYXRlIGEgZ2xfc2hhZGVyX3N0YWdlIHRvIGEgc2hvcnQgc2hhZGVyIHN0YWdlIG5hbWUgZm9yIGRlYnVnCisgKiBwcmludG91dHMgYW5kIGVycm9yIG1lc3NhZ2VzLgorICovCitjb25zdCBjaGFyICoKK19tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcodW5zaWduZWQgc3RhZ2UpCit7CisgICBzd2l0Y2ggKHN0YWdlKSB7CisgICBjYXNlIE1FU0FfU0hBREVSX1ZFUlRFWDogICByZXR1cm4gInZlcnRleCI7CisgICBjYXNlIE1FU0FfU0hBREVSX0ZSQUdNRU5UOiByZXR1cm4gImZyYWdtZW50IjsKKyAgIGNhc2UgTUVTQV9TSEFERVJfR0VPTUVUUlk6IHJldHVybiAiZ2VvbWV0cnkiOworICAgfQorCisgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworICAgcmV0dXJuICJ1bmtub3duIjsKK30KKworLyogVGhpcyBoZWxwZXIgZnVuY3Rpb24gd2lsbCBhcHBlbmQgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIHNoYWRlcidzCisgICBpbmZvIGxvZyBhbmQgcmVwb3J0IGl0IHZpYSBHTF9BUkJfZGVidWdfb3V0cHV0LiBQZXIgdGhhdCBleHRlbnNpb24sCisgICAndHlwZScgaXMgb25lIG9mIHRoZSBlbnVtIHZhbHVlcyBjbGFzc2lmeWluZyB0aGUgbWVzc2FnZSwgYW5kCisgICAnaWQnIGlzIHRoZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIElEIG9mIHRoZSBnaXZlbiBtZXNzYWdlLiAqLworc3RhdGljIHZvaWQKK19tZXNhX2dsc2xfbXNnKGNvbnN0IFlZTFRZUEUgKmxvY3AsIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgIGJvb2wgZXJyb3IgPSAodHlwZSA9PSBNRVNBX0RFQlVHX1RZUEVfRVJST1IpOworICAgR0x1aW50IG1zZ19pZCA9IDA7CisKKyAgIGFzc2VydChzdGF0ZS0+aW5mb19sb2cgIT0gTlVMTCk7CisKKyAgIC8qIEdldCB0aGUgb2Zmc2V0IHRoYXQgdGhlIG5ldyBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0by4gKi8KKyAgIGludCBtc2dfb2Zmc2V0ID0gc3RybGVuKHN0YXRlLT5pbmZvX2xvZyk7CisKKyAgIHJhbGxvY19hc3ByaW50Zl9hcHBlbmQoJnN0YXRlLT5pbmZvX2xvZywgIiV1OiV1KCV1KTogJXM6ICIsCisJCQkJCSAgICBsb2NwLT5zb3VyY2UsCisJCQkJCSAgICBsb2NwLT5maXJzdF9saW5lLAorCQkJCQkgICAgbG9jcC0+Zmlyc3RfY29sdW1uLAorCQkJCQkgICAgZXJyb3IgPyAiZXJyb3IiIDogIndhcm5pbmciKTsKKyAgIHJhbGxvY192YXNwcmludGZfYXBwZW5kKCZzdGF0ZS0+aW5mb19sb2csIGZtdCwgYXApOworCisgICBjb25zdCBjaGFyICpjb25zdCBtc2cgPSAmc3RhdGUtPmluZm9fbG9nW21zZ19vZmZzZXRdOworICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eCA9IHN0YXRlLT5jdHg7CisKKyAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdmlhIEdMX0FSQl9kZWJ1Z19vdXRwdXQuICovCisgICBfbWVzYV9zaGFkZXJfZGVidWcoY3R4LCB0eXBlLCAmbXNnX2lkLCBtc2csIHN0cmxlbihtc2cpKTsKKworICAgcmFsbG9jX3N0cmNhdCgmc3RhdGUtPmluZm9fbG9nLCAiXG4iKTsKK30KKwordm9pZAorX21lc2FfZ2xzbF9lcnJvcihZWUxUWVBFICpsb2NwLCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgdmFfbGlzdCBhcDsKKworICAgc3RhdGUtPmVycm9yID0gdHJ1ZTsKKworICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICBfbWVzYV9nbHNsX21zZyhsb2NwLCBzdGF0ZSwgTUVTQV9ERUJVR19UWVBFX0VSUk9SLCBmbXQsIGFwKTsKKyAgIHZhX2VuZChhcCk7Cit9CisKKwordm9pZAorX21lc2FfZ2xzbF93YXJuaW5nKGNvbnN0IFlZTFRZUEUgKmxvY3AsIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgIHZhX2xpc3QgYXA7CisKKyAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgX21lc2FfZ2xzbF9tc2cobG9jcCwgc3RhdGUsIE1FU0FfREVCVUdfVFlQRV9PVEhFUiwgZm10LCBhcCk7CisgICB2YV9lbmQoYXApOworfQorCisKKy8qKgorICogRW51bSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIGJlaGF2aW9ycyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4KKyAqIGFuICNleHRlbnNpb24gZGlyZWN0aXZlLgorICovCitlbnVtIGV4dF9iZWhhdmlvciB7CisgICBleHRlbnNpb25fZGlzYWJsZSwKKyAgIGV4dGVuc2lvbl9lbmFibGUsCisgICBleHRlbnNpb25fcmVxdWlyZSwKKyAgIGV4dGVuc2lvbl93YXJuCit9OworCisvKioKKyAqIEVsZW1lbnQgdHlwZSBmb3IgX21lc2FfZ2xzbF9zdXBwb3J0ZWRfZXh0ZW5zaW9ucworICovCitzdHJ1Y3QgX21lc2FfZ2xzbF9leHRlbnNpb24geworICAgLyoqCisgICAgKiBOYW1lIG9mIHRoZSBleHRlbnNpb24gd2hlbiByZWZlcnJlZCB0byBpbiBhIEdMU0wgZXh0ZW5zaW9uCisgICAgKiBzdGF0ZW1lbnQKKyAgICAqLworICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgLyoqIFRydWUgaWYgdGhpcyBleHRlbnNpb24gaXMgYXZhaWxhYmxlIHRvIGRlc2t0b3AgR0wgc2hhZGVycyAqLworICAgYm9vbCBhdmFpbF9pbl9HTDsKKworICAgLyoqIFRydWUgaWYgdGhpcyBleHRlbnNpb24gaXMgYXZhaWxhYmxlIHRvIEdMRVMgc2hhZGVycyAqLworICAgYm9vbCBhdmFpbF9pbl9FUzsKKworICAgLyoqCisgICAgKiBGbGFnIGluIHRoZSBnbF9leHRlbnNpb25zIHN0cnVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcworICAgICogZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLCBvcgorICAgICogJmdsX2V4dGVuc2lvbnM6OmR1bW15X3RydWUgaWYgc3VwcG9ydGVkIGJ5IGFsbCBkcml2ZXJzLgorICAgICoKKyAgICAqIE5vdGU6IHRoZSB0eXBlIChHTGJvb2xlYW4gZ2xfZXh0ZW5zaW9uczo6KikgaXMgYSAicG9pbnRlciB0bworICAgICogbWVtYmVyIiB0eXBlLCB0aGUgdHlwZS1zYWZlIGFsdGVybmF0aXZlIHRvIHRoZSAib2Zmc2V0b2YiIG1hY3JvLgorICAgICogSW4gYSBudXRzaGVsbDoKKyAgICAqCisgICAgKiAtIGZvbyBiYXI6OiogcCBkZWNsYXJlcyBwIHRvIGJlIGFuICJvZmZzZXQiIHRvIGEgZmllbGQgb2YgdHlwZQorICAgICogICBmb28gdGhhdCBleGlzdHMgd2l0aGluIHN0cnVjdCBiYXIKKyAgICAqIC0gJmJhcjo6YmF6IGNvbXB1dGVzIHRoZSAib2Zmc2V0IiBvZiBmaWVsZCBiYXogd2l0aGluIHN0cnVjdCBiYXIKKyAgICAqIC0geC4qcCBhY2Nlc3NlcyB0aGUgZmllbGQgb2YgeCB0aGF0IGV4aXN0cyBhdCAib2Zmc2V0IiBwCisgICAgKiAtIHgtPipwIGlzIGVxdWl2YWxlbnQgdG8gKCp4KS4qcAorICAgICovCisgICBjb25zdCBHTGJvb2xlYW4gZ2xfZXh0ZW5zaW9uczo6KiBzdXBwb3J0ZWRfZmxhZzsKKworICAgLyoqCisgICAgKiBGbGFnIGluIHRoZSBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlIHN0cnVjdCB0aGF0IHNob3VsZCBiZSBzZXQKKyAgICAqIHdoZW4gdGhpcyBleHRlbnNpb24gaXMgZW5hYmxlZC4KKyAgICAqCisgICAgKiBTZWUgbm90ZSBpbiBfbWVzYV9nbHNsX2V4dGVuc2lvbjo6c3VwcG9ydGVkX2ZsYWcgYWJvdXQgInBvaW50ZXIKKyAgICAqIHRvIG1lbWJlciIgdHlwZXMuCisgICAgKi8KKyAgIGJvb2wgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZTo6KiBlbmFibGVfZmxhZzsKKworICAgLyoqCisgICAgKiBGbGFnIGluIHRoZSBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlIHN0cnVjdCB0aGF0IHNob3VsZCBiZSBzZXQKKyAgICAqIHdoZW4gdGhlIHNoYWRlciByZXF1ZXN0cyAid2FybiIgYmVoYXZpb3IgZm9yIHRoaXMgZXh0ZW5zaW9uLgorICAgICoKKyAgICAqIFNlZSBub3RlIGluIF9tZXNhX2dsc2xfZXh0ZW5zaW9uOjpzdXBwb3J0ZWRfZmxhZyBhYm91dCAicG9pbnRlcgorICAgICogdG8gbWVtYmVyIiB0eXBlcy4KKyAgICAqLworICAgYm9vbCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlOjoqIHdhcm5fZmxhZzsKKworCisgICBib29sIGNvbXBhdGlibGVfd2l0aF9zdGF0ZShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkgY29uc3Q7CisgICB2b2lkIHNldF9mbGFncyhfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgZXh0X2JlaGF2aW9yIGJlaGF2aW9yKSBjb25zdDsKK307CisKKyNkZWZpbmUgRVhUKE5BTUUsIEdMLCBFUywgU1VQUE9SVEVEX0ZMQUcpICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgIkdMXyIgI05BTUUsIEdMLCBFUywgJmdsX2V4dGVuc2lvbnM6OlNVUFBPUlRFRF9GTEFHLCAgIFwKKyAgICAgICAgICZfbWVzYV9nbHNsX3BhcnNlX3N0YXRlOjpOQU1FIyNfZW5hYmxlLCAgICAgICAgICAgIFwKKyAgICAgICAgICZfbWVzYV9nbHNsX3BhcnNlX3N0YXRlOjpOQU1FIyNfd2FybiB9CisKKy8qKgorICogVGFibGUgb2YgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHdpdGhpbiBhIHNoYWRlciwKKyAqIGFuZCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGV5IGFyZSBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyBjb25zdCBfbWVzYV9nbHNsX2V4dGVuc2lvbiBfbWVzYV9nbHNsX3N1cHBvcnRlZF9leHRlbnNpb25zW10gPSB7CisgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEkgYXZhaWxhYmlsaXR5ICovCisgICAvKiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTCAgICAgRVMgICAgICAgICBzdXBwb3J0ZWQgZmxhZyAqLworCisgICAvKiBBUkIgZXh0ZW5zaW9ucyBnbyBoZXJlLCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCisgICAgKi8KKyAgIEVYVChBUkJfYXJyYXlzX29mX2FycmF5cywgICAgICAgICAgIHRydWUsICBmYWxzZSwgICAgIEFSQl9hcnJheXNfb2ZfYXJyYXlzKSwKKyAgIEVYVChBUkJfY29tcHV0ZV9zaGFkZXIsICAgICAgICAgICAgIHRydWUsICBmYWxzZSwgICAgIEFSQl9jb21wdXRlX3NoYWRlciksCisgICBFWFQoQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aCwgICAgICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfY29uc2VydmF0aXZlX2RlcHRoKSwKKyAgIEVYVChBUkJfZHJhd19idWZmZXJzLCAgICAgICAgICAgICAgIHRydWUsICBmYWxzZSwgICAgIGR1bW15X3RydWUpLAorICAgRVhUKEFSQl9kcmF3X2luc3RhbmNlZCwgICAgICAgICAgICAgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX2RyYXdfaW5zdGFuY2VkKSwKKyAgIEVYVChBUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uLCAgIHRydWUsICBmYWxzZSwgICAgIEFSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24pLAorICAgRVhUKEFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucywgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zKSwKKyAgIEVYVChBUkJfZ3B1X3NoYWRlcjUsICAgICAgICAgICAgICAgIHRydWUsICBmYWxzZSwgICAgIEFSQl9ncHVfc2hhZGVyNSksCisgICBFWFQoQVJCX3NhbXBsZV9zaGFkaW5nLCAgICAgICAgICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfc2FtcGxlX3NoYWRpbmcpLAorICAgRVhUKEFSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cywgICAgdHJ1ZSwgIGZhbHNlLCAgICAgZHVtbXlfdHJ1ZSksCisgICBFWFQoQVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnMsICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfc2hhZGVyX2F0b21pY19jb3VudGVycyksCisgICBFWFQoQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmcsICAgICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfc2hhZGVyX2JpdF9lbmNvZGluZyksCisgICBFWFQoQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlLCAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUpLAorICAgRVhUKEFSQl9zaGFkZXJfc3RlbmNpbF9leHBvcnQsICAgICAgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX3NoYWRlcl9zdGVuY2lsX2V4cG9ydCksCisgICBFWFQoQVJCX3NoYWRlcl90ZXh0dXJlX2xvZCwgICAgICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfc2hhZGVyX3RleHR1cmVfbG9kKSwKKyAgIEVYVChBUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrLCAgIHRydWUsICBmYWxzZSwgICAgIEFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2spLAorICAgRVhUKEFSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmcsICAgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZyksCisgICBFWFQoQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXksICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheSksCisgICBFWFQoQVJCX3RleHR1cmVfZ2F0aGVyLCAgICAgICAgICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfdGV4dHVyZV9nYXRoZXIpLAorICAgRVhUKEFSQl90ZXh0dXJlX211bHRpc2FtcGxlLCAgICAgICAgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX3RleHR1cmVfbXVsdGlzYW1wbGUpLAorICAgRVhUKEFSQl90ZXh0dXJlX3F1ZXJ5X2xldmVscywgICAgICAgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX3RleHR1cmVfcXVlcnlfbGV2ZWxzKSwKKyAgIEVYVChBUkJfdGV4dHVyZV9xdWVyeV9sb2QsICAgICAgICAgIHRydWUsICBmYWxzZSwgICAgIEFSQl90ZXh0dXJlX3F1ZXJ5X2xvZCksCisgICBFWFQoQVJCX3RleHR1cmVfcmVjdGFuZ2xlLCAgICAgICAgICB0cnVlLCAgZmFsc2UsICAgICBkdW1teV90cnVlKSwKKyAgIEVYVChBUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0LCAgICAgIHRydWUsICBmYWxzZSwgICAgIEFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QpLAorICAgRVhUKEFSQl92aWV3cG9ydF9hcnJheSwgICAgICAgICAgICAgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX3ZpZXdwb3J0X2FycmF5KSwKKworICAgLyogS0hSIGV4dGVuc2lvbnMgZ28gaGVyZSwgc29ydGVkIGFscGhhYmV0aWNhbGx5LgorICAgICovCisKKyAgIC8qIE9FUyBleHRlbnNpb25zIGdvIGhlcmUsIHNvcnRlZCBhbHBoYWJldGljYWxseS4KKyAgICAqLworICAgRVhUKE9FU19FR0xfaW1hZ2VfZXh0ZXJuYWwsICAgICAgICAgZmFsc2UsIHRydWUsICAgICAgT0VTX0VHTF9pbWFnZV9leHRlcm5hbCksCisgICBFWFQoT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzLCAgICAgICBmYWxzZSwgdHJ1ZSwgICAgICBPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMpLAorICAgRVhUKE9FU190ZXh0dXJlXzNELCAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsICAgICAgRVhUX3RleHR1cmUzRCksCisKKyAgIC8qIEFsbCBvdGhlciBleHRlbnNpb25zIGdvIGhlcmUsIHNvcnRlZCBhbHBoYWJldGljYWxseS4KKyAgICAqLworICAgRVhUKEFNRF9jb25zZXJ2YXRpdmVfZGVwdGgsICAgICAgICAgdHJ1ZSwgIGZhbHNlLCAgICAgQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aCksCisgICBFWFQoQU1EX3NoYWRlcl9zdGVuY2lsX2V4cG9ydCwgICAgICB0cnVlLCAgZmFsc2UsICAgICBBUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0KSwKKyAgIEVYVChBTURfc2hhZGVyX3RyaW5hcnlfbWlubWF4LCAgICAgIHRydWUsICBmYWxzZSwgICAgIGR1bW15X3RydWUpLAorICAgRVhUKEFNRF92ZXJ0ZXhfc2hhZGVyX2xheWVyLCAgICAgICAgdHJ1ZSwgIGZhbHNlLCAgICAgQU1EX3ZlcnRleF9zaGFkZXJfbGF5ZXIpLAorICAgRVhUKEVYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cywgICAgZmFsc2UsIHRydWUsICAgICAgZHVtbXlfdHJ1ZSksCisgICBFWFQoRVhUX3NoYWRlcl9pbnRlZ2VyX21peCwgICAgICAgICB0cnVlLCAgdHJ1ZSwgICAgICBFWFRfc2hhZGVyX2ludGVnZXJfbWl4KSwKKyAgIEVYVChFWFRfdGV4dHVyZV9hcnJheSwgICAgICAgICAgICAgIHRydWUsICBmYWxzZSwgICAgIEVYVF90ZXh0dXJlX2FycmF5KSwKK307CisKKyN1bmRlZiBFWFQKKworCisvKioKKyAqIERldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gZXh0ZW5zaW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0LAorICogQVBJLCBhbmQgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGluIHRoZSBjdXJyZW50IHBhcnNlciBzdGF0ZS4KKyAqLworYm9vbCBfbWVzYV9nbHNsX2V4dGVuc2lvbjo6Y29tcGF0aWJsZV93aXRoX3N0YXRlKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSBjb25zdAoreworICAgLyogQ2hlY2sgdGhhdCB0aGlzIGV4dGVuc2lvbiBtYXRjaGVzIHdoZXRoZXIgd2UgYXJlIGNvbXBpbGluZworICAgICogZm9yIGRlc2t0b3AgR0wgb3IgR0xFUy4KKyAgICAqLworICAgaWYgKHN0YXRlLT5lc19zaGFkZXIpIHsKKyAgICAgIGlmICghdGhpcy0+YXZhaWxfaW5fRVMpIHJldHVybiBmYWxzZTsKKyAgIH0gZWxzZSB7CisgICAgICBpZiAoIXRoaXMtPmF2YWlsX2luX0dMKSByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIC8qIENoZWNrIHRoYXQgdGhpcyBleHRlbnNpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBPcGVuR0wKKyAgICAqIGltcGxlbWVudGF0aW9uLgorICAgICoKKyAgICAqIE5vdGU6IHRoZSAtPiogb3BlcmF0b3IgaW5kZXhlcyBpbnRvIHN0YXRlLT5leHRlbnNpb25zIGJ5IHRoZQorICAgICogb2Zmc2V0IHRoaXMtPnN1cHBvcnRlZF9mbGFnLiAgU2VlCisgICAgKiBfbWVzYV9nbHNsX2V4dGVuc2lvbjo6c3VwcG9ydGVkX2ZsYWcgZm9yIG1vcmUgaW5mby4KKyAgICAqLworICAgcmV0dXJuIHN0YXRlLT5leHRlbnNpb25zLT4qKHRoaXMtPnN1cHBvcnRlZF9mbGFnKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGluIHRoZSBwYXJzZXIgc3RhdGUgdG8gZXN0YWJsaXNoIHRoZQorICogZ2l2ZW4gYmVoYXZpb3IgZm9yIHRoaXMgZXh0ZW5zaW9uLgorICovCit2b2lkIF9tZXNhX2dsc2xfZXh0ZW5zaW9uOjpzZXRfZmxhZ3MoX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X2JlaGF2aW9yIGJlaGF2aW9yKSBjb25zdAoreworICAgLyogTm90ZTogdGhlIC0+KiBvcGVyYXRvciBpbmRleGVzIGludG8gc3RhdGUgYnkgdGhlCisgICAgKiBvZmZzZXRzIHRoaXMtPmVuYWJsZV9mbGFnIGFuZCB0aGlzLT53YXJuX2ZsYWcuICBTZWUKKyAgICAqIF9tZXNhX2dsc2xfZXh0ZW5zaW9uOjpzdXBwb3J0ZWRfZmxhZyBmb3IgbW9yZSBpbmZvLgorICAgICovCisgICBzdGF0ZS0+Kih0aGlzLT5lbmFibGVfZmxhZykgPSAoYmVoYXZpb3IgIT0gZXh0ZW5zaW9uX2Rpc2FibGUpOworICAgc3RhdGUtPioodGhpcy0+d2Fybl9mbGFnKSAgID0gKGJlaGF2aW9yID09IGV4dGVuc2lvbl93YXJuKTsKK30KKworLyoqCisgKiBGaW5kIGFuIGV4dGVuc2lvbiBieSBuYW1lIGluIF9tZXNhX2dsc2xfc3VwcG9ydGVkX2V4dGVuc2lvbnMuICBJZgorICogdGhlIG5hbWUgaXMgbm90IGZvdW5kLCByZXR1cm4gTlVMTC4KKyAqLworc3RhdGljIGNvbnN0IF9tZXNhX2dsc2xfZXh0ZW5zaW9uICpmaW5kX2V4dGVuc2lvbihjb25zdCBjaGFyICpuYW1lKQoreworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEVsZW1lbnRzKF9tZXNhX2dsc2xfc3VwcG9ydGVkX2V4dGVuc2lvbnMpOyArK2kpIHsKKyAgICAgIGlmIChzdHJjbXAobmFtZSwgX21lc2FfZ2xzbF9zdXBwb3J0ZWRfZXh0ZW5zaW9uc1tpXS5uYW1lKSA9PSAwKSB7CisgICAgICAgICByZXR1cm4gJl9tZXNhX2dsc2xfc3VwcG9ydGVkX2V4dGVuc2lvbnNbaV07CisgICAgICB9CisgICB9CisgICByZXR1cm4gTlVMTDsKK30KKworCitib29sCitfbWVzYV9nbHNsX3Byb2Nlc3NfZXh0ZW5zaW9uKGNvbnN0IGNoYXIgKm5hbWUsIFlZTFRZUEUgKm5hbWVfbG9jcCwKKwkJCSAgICAgY29uc3QgY2hhciAqYmVoYXZpb3Jfc3RyaW5nLCBZWUxUWVBFICpiZWhhdmlvcl9sb2NwLAorCQkJICAgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIGV4dF9iZWhhdmlvciBiZWhhdmlvcjsKKyAgIGlmIChzdHJjbXAoYmVoYXZpb3Jfc3RyaW5nLCAid2FybiIpID09IDApIHsKKyAgICAgIGJlaGF2aW9yID0gZXh0ZW5zaW9uX3dhcm47CisgICB9IGVsc2UgaWYgKHN0cmNtcChiZWhhdmlvcl9zdHJpbmcsICJyZXF1aXJlIikgPT0gMCkgeworICAgICAgYmVoYXZpb3IgPSBleHRlbnNpb25fcmVxdWlyZTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKGJlaGF2aW9yX3N0cmluZywgImVuYWJsZSIpID09IDApIHsKKyAgICAgIGJlaGF2aW9yID0gZXh0ZW5zaW9uX2VuYWJsZTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKGJlaGF2aW9yX3N0cmluZywgImRpc2FibGUiKSA9PSAwKSB7CisgICAgICBiZWhhdmlvciA9IGV4dGVuc2lvbl9kaXNhYmxlOworICAgfSBlbHNlIHsKKyAgICAgIF9tZXNhX2dsc2xfZXJyb3IoYmVoYXZpb3JfbG9jcCwgc3RhdGUsCisJCSAgICAgICAidW5rbm93biBleHRlbnNpb24gYmVoYXZpb3IgYCVzJyIsCisJCSAgICAgICBiZWhhdmlvcl9zdHJpbmcpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBpZiAoc3RyY21wKG5hbWUsICJhbGwiKSA9PSAwKSB7CisgICAgICBpZiAoKGJlaGF2aW9yID09IGV4dGVuc2lvbl9lbmFibGUpIHx8IChiZWhhdmlvciA9PSBleHRlbnNpb25fcmVxdWlyZSkpIHsKKwkgX21lc2FfZ2xzbF9lcnJvcihuYW1lX2xvY3AsIHN0YXRlLCAiY2Fubm90ICVzIGFsbCBleHRlbnNpb25zIiwKKwkJCSAgKGJlaGF2aW9yID09IGV4dGVuc2lvbl9lbmFibGUpCisJCQkgID8gImVuYWJsZSIgOiAicmVxdWlyZSIpOworCSByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsKKyAgICAgICAgICAgICAgaSA8IEVsZW1lbnRzKF9tZXNhX2dsc2xfc3VwcG9ydGVkX2V4dGVuc2lvbnMpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IF9tZXNhX2dsc2xfZXh0ZW5zaW9uICpleHRlbnNpb24KKyAgICAgICAgICAgICAgID0gJl9tZXNhX2dsc2xfc3VwcG9ydGVkX2V4dGVuc2lvbnNbaV07CisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5jb21wYXRpYmxlX3dpdGhfc3RhdGUoc3RhdGUpKSB7CisgICAgICAgICAgICAgICBfbWVzYV9nbHNsX3N1cHBvcnRlZF9leHRlbnNpb25zW2ldLnNldF9mbGFncyhzdGF0ZSwgYmVoYXZpb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IF9tZXNhX2dsc2xfZXh0ZW5zaW9uICpleHRlbnNpb24gPSBmaW5kX2V4dGVuc2lvbihuYW1lKTsKKyAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uLT5jb21wYXRpYmxlX3dpdGhfc3RhdGUoc3RhdGUpKSB7CisgICAgICAgICBleHRlbnNpb24tPnNldF9mbGFncyhzdGF0ZSwgYmVoYXZpb3IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gImV4dGVuc2lvbiBgJXMnIHVuc3VwcG9ydGVkIGluICVzIHNoYWRlciI7CisKKyAgICAgICAgIGlmIChiZWhhdmlvciA9PSBleHRlbnNpb25fcmVxdWlyZSkgeworICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcihuYW1lX2xvY3AsIHN0YXRlLCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoc3RhdGUtPnN0YWdlKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX21lc2FfZ2xzbF93YXJuaW5nKG5hbWVfbG9jcCwgc3RhdGUsIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKHN0YXRlLT5zdGFnZSkpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKioKKyAqIFJlY3Vyc2VzIHRocm91Z2ggPHR5cGU+IGFuZCA8ZXhwcj4gaWYgPGV4cHI+IGlzIGFuIGFnZ3JlZ2F0ZSBpbml0aWFsaXplcgorICogYW5kIHNldHMgPGV4cHI+J3MgPGNvbnN0cnVjdG9yX3R5cGU+IGZpZWxkIHRvIDx0eXBlPi4gR2l2ZXMgbGF0ZXIgZnVuY3Rpb25zCisgKiAocHJvY2Vzc19hcnJheV9jb25zdHJ1Y3RvciwgZXQgYWwpIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZG8gdHlwZQorICogY2hlY2tpbmcuCisgKgorICogT3BlcmF0ZXMgb24gYXNzaWdubWVudHMgaW52b2x2aW5nIGFuIGFnZ3JlZ2F0ZSBpbml0aWFsaXplci4gRS5nLiwKKyAqCisgKiB2ZWM0IHBvcyA9IHsxLjAsIC0xLjAsIDAuMCwgMS4wfTsKKyAqCisgKiBvciBtb3JlIHJpZGljdWxvdXNseSwKKyAqCisgKiBzdHJ1Y3QgUyB7CisgKiAgICAgdmVjNCB2WzJdOworICogfTsKKyAqCisgKiBzdHJ1Y3QgeworICogICAgIFMgYVsyXSwgYjsKKyAqICAgICBpbnQgYzsKKyAqIH0gYWdncmVnYXRlID0geworICogICAgIHsKKyAqICAgICAgICAgeworICogICAgICAgICAgICAgeworICogICAgICAgICAgICAgICAgIHsxLjAsIDIuMCwgMy4wLCA0LjB9LCAvLyBhWzBdLnZbMF0KKyAqICAgICAgICAgICAgICAgICB7NS4wLCA2LjAsIDcuMCwgOC4wfSAgLy8gYVswXS52WzFdCisgKiAgICAgICAgICAgICB9IC8vIGFbMF0udgorICogICAgICAgICB9LCAvLyBhWzBdCisgKiAgICAgICAgIHsKKyAqICAgICAgICAgICAgIHsKKyAqICAgICAgICAgICAgICAgICB7MS4wLCAyLjAsIDMuMCwgNC4wfSwgLy8gYVsxXS52WzBdCisgKiAgICAgICAgICAgICAgICAgezUuMCwgNi4wLCA3LjAsIDguMH0gIC8vIGFbMV0udlsxXQorICogICAgICAgICAgICAgfSAvLyBhWzFdLnYKKyAqICAgICAgICAgfSAvLyBhWzFdCisgKiAgICAgfSwgLy8gYQorICogICAgIHsKKyAqICAgICAgICAgeworICogICAgICAgICAgICAgezEuMCwgMi4wLCAzLjAsIDQuMH0sIC8vIGIudlswXQorICogICAgICAgICAgICAgezUuMCwgNi4wLCA3LjAsIDguMH0gIC8vIGIudlsxXQorICogICAgICAgICB9IC8vIGIudgorICogICAgIH0sIC8vIGIKKyAqICAgICA0IC8vIGMKKyAqIH07CisgKgorICogVGhpcyBwYXNzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgPHR5cGU+IGUgPSB7IC4uLiB9CisgKiBkb2Vzbid0IGNvbnRhaW4gc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIHR5cGVzIG1hdGNoLgorICovCit2b2lkCitfbWVzYV9hc3Rfc2V0X2FnZ3JlZ2F0ZV90eXBlKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBhc3RfYWdncmVnYXRlX2luaXRpYWxpemVyICphaSA9IChhc3RfYWdncmVnYXRlX2luaXRpYWxpemVyICopZXhwcjsKKyAgIGFpLT5jb25zdHJ1Y3Rvcl90eXBlID0gdHlwZTsKKworICAgLyogSWYgdGhlIGFnZ3JlZ2F0ZSBpcyBhbiBhcnJheSwgcmVjdXJzaXZlbHkgc2V0IGl0cyBlbGVtZW50cycgdHlwZXMuICovCisgICBpZiAodHlwZS0+aXNfYXJyYXkoKSkgeworICAgICAgLyogRWFjaCBhcnJheSBlbGVtZW50IGhhcyB0aGUgdHlwZSB0eXBlLT5lbGVtZW50X3R5cGUoKS4KKyAgICAgICAqCisgICAgICAgKiBFLmcuLCBpZiA8dHlwZT4gaWYgc3RydWN0IFNbMl0gd2Ugd2FudCB0byBzZXQgZWFjaCBlbGVtZW50J3MgdHlwZSB0bworICAgICAgICogc3RydWN0IFMuCisgICAgICAgKi8KKyAgICAgIGZvciAoZXhlY19ub2RlICpleHByX25vZGUgPSBhaS0+ZXhwcmVzc2lvbnMuaGVhZDsKKyAgICAgICAgICAgIWV4cHJfbm9kZS0+aXNfdGFpbF9zZW50aW5lbCgpOworICAgICAgICAgICBleHByX25vZGUgPSBleHByX25vZGUtPm5leHQpIHsKKyAgICAgICAgIGFzdF9leHByZXNzaW9uICpleHByID0gZXhlY19ub2RlX2RhdGEoYXN0X2V4cHJlc3Npb24sIGV4cHJfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisKKyAgICAgICAgIGlmIChleHByLT5vcGVyID09IGFzdF9hZ2dyZWdhdGUpCisgICAgICAgICAgICBfbWVzYV9hc3Rfc2V0X2FnZ3JlZ2F0ZV90eXBlKHR5cGUtPmVsZW1lbnRfdHlwZSgpLCBleHByKTsKKyAgICAgIH0KKworICAgLyogSWYgdGhlIGFnZ3JlZ2F0ZSBpcyBhIHN0cnVjdCwgcmVjdXJzaXZlbHkgc2V0IGl0cyBmaWVsZHMnIHR5cGVzLiAqLworICAgfSBlbHNlIGlmICh0eXBlLT5pc19yZWNvcmQoKSkgeworICAgICAgZXhlY19ub2RlICpleHByX25vZGUgPSBhaS0+ZXhwcmVzc2lvbnMuaGVhZDsKKworICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBzdHJ1Y3QncyBmaWVsZHMuICovCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyAhZXhwcl9ub2RlLT5pc190YWlsX3NlbnRpbmVsKCkgJiYgaSA8IHR5cGUtPmxlbmd0aDsKKyAgICAgICAgICAgaSsrLCBleHByX25vZGUgPSBleHByX25vZGUtPm5leHQpIHsKKyAgICAgICAgIGFzdF9leHByZXNzaW9uICpleHByID0gZXhlY19ub2RlX2RhdGEoYXN0X2V4cHJlc3Npb24sIGV4cHJfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisKKyAgICAgICAgIGlmIChleHByLT5vcGVyID09IGFzdF9hZ2dyZWdhdGUpIHsKKyAgICAgICAgICAgIF9tZXNhX2FzdF9zZXRfYWdncmVnYXRlX3R5cGUodHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlLCBleHByKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIC8qIElmIHRoZSBhZ2dyZWdhdGUgaXMgYSBtYXRyaXgsIHNldCBpdHMgY29sdW1ucycgdHlwZXMuICovCisgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hdHJpeCgpKSB7CisgICAgICBmb3IgKGV4ZWNfbm9kZSAqZXhwcl9ub2RlID0gYWktPmV4cHJlc3Npb25zLmhlYWQ7CisgICAgICAgICAgICFleHByX25vZGUtPmlzX3RhaWxfc2VudGluZWwoKTsKKyAgICAgICAgICAgZXhwcl9ub2RlID0gZXhwcl9ub2RlLT5uZXh0KSB7CisgICAgICAgICBhc3RfZXhwcmVzc2lvbiAqZXhwciA9IGV4ZWNfbm9kZV9kYXRhKGFzdF9leHByZXNzaW9uLCBleHByX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworCisgICAgICAgICBpZiAoZXhwci0+b3BlciA9PSBhc3RfYWdncmVnYXRlKQorICAgICAgICAgICAgX21lc2FfYXN0X3NldF9hZ2dyZWdhdGVfdHlwZSh0eXBlLT5jb2x1bW5fdHlwZSgpLCBleHByKTsKKyAgICAgIH0KKyAgIH0KK30KKworCit2b2lkCitfbWVzYV9hc3RfdHlwZV9xdWFsaWZpZXJfcHJpbnQoY29uc3Qgc3RydWN0IGFzdF90eXBlX3F1YWxpZmllciAqcSkKK3sKKyAgIGlmIChxLT5mbGFncy5xLmNvbnN0YW50KQorICAgICAgcHJpbnRmKCJjb25zdCAiKTsKKworICAgaWYgKHEtPmZsYWdzLnEuaW52YXJpYW50KQorICAgICAgcHJpbnRmKCJpbnZhcmlhbnQgIik7CisKKyAgIGlmIChxLT5mbGFncy5xLmF0dHJpYnV0ZSkKKyAgICAgIHByaW50ZigiYXR0cmlidXRlICIpOworCisgICBpZiAocS0+ZmxhZ3MucS52YXJ5aW5nKQorICAgICAgcHJpbnRmKCJ2YXJ5aW5nICIpOworCisgICBpZiAocS0+ZmxhZ3MucS5pbiAmJiBxLT5mbGFncy5xLm91dCkKKyAgICAgIHByaW50ZigiaW5vdXQgIik7CisgICBlbHNlIHsKKyAgICAgIGlmIChxLT5mbGFncy5xLmluKQorCSBwcmludGYoImluICIpOworCisgICAgICBpZiAocS0+ZmxhZ3MucS5vdXQpCisJIHByaW50Zigib3V0ICIpOworICAgfQorCisgICBpZiAocS0+ZmxhZ3MucS5jZW50cm9pZCkKKyAgICAgIHByaW50ZigiY2VudHJvaWQgIik7CisgICBpZiAocS0+ZmxhZ3MucS5zYW1wbGUpCisgICAgICBwcmludGYoInNhbXBsZSAiKTsKKyAgIGlmIChxLT5mbGFncy5xLnVuaWZvcm0pCisgICAgICBwcmludGYoInVuaWZvcm0gIik7CisgICBpZiAocS0+ZmxhZ3MucS5zbW9vdGgpCisgICAgICBwcmludGYoInNtb290aCAiKTsKKyAgIGlmIChxLT5mbGFncy5xLmZsYXQpCisgICAgICBwcmludGYoImZsYXQgIik7CisgICBpZiAocS0+ZmxhZ3MucS5ub3BlcnNwZWN0aXZlKQorICAgICAgcHJpbnRmKCJub3BlcnNwZWN0aXZlICIpOworfQorCisKK3ZvaWQKK2FzdF9ub2RlOjpwcmludCh2b2lkKSBjb25zdAoreworICAgcHJpbnRmKCJ1bmhhbmRsZWQgbm9kZSAiKTsKK30KKworCithc3Rfbm9kZTo6YXN0X25vZGUodm9pZCkKK3sKKyAgIHRoaXMtPmxvY2F0aW9uLnNvdXJjZSA9IDA7CisgICB0aGlzLT5sb2NhdGlvbi5maXJzdF9saW5lID0gMDsKKyAgIHRoaXMtPmxvY2F0aW9uLmZpcnN0X2NvbHVtbiA9IDA7CisgICB0aGlzLT5sb2NhdGlvbi5sYXN0X2xpbmUgPSAwOworICAgdGhpcy0+bG9jYXRpb24ubGFzdF9jb2x1bW4gPSAwOworfQorCisKK3N0YXRpYyB2b2lkCithc3Rfb3B0X2FycmF5X2RpbWVuc2lvbnNfcHJpbnQoY29uc3QgYXN0X2FycmF5X3NwZWNpZmllciAqYXJyYXlfc3BlY2lmaWVyKQoreworICAgaWYgKGFycmF5X3NwZWNpZmllcikKKyAgICAgIGFycmF5X3NwZWNpZmllci0+cHJpbnQoKTsKK30KKworCit2b2lkCithc3RfY29tcG91bmRfc3RhdGVtZW50OjpwcmludCh2b2lkKSBjb25zdAoreworICAgcHJpbnRmKCJ7XG4iKTsKKyAgIAorICAgZm9yZWFjaF9saXN0X2NvbnN0KG4sICZ0aGlzLT5zdGF0ZW1lbnRzKSB7CisgICAgICBhc3Rfbm9kZSAqYXN0ID0gZXhlY19ub2RlX2RhdGEoYXN0X25vZGUsIG4sIGxpbmspOworICAgICAgYXN0LT5wcmludCgpOworICAgfQorCisgICBwcmludGYoIn1cbiIpOworfQorCisKK2FzdF9jb21wb3VuZF9zdGF0ZW1lbnQ6OmFzdF9jb21wb3VuZF9zdGF0ZW1lbnQoaW50IG5ld19zY29wZSwKKwkJCQkJICAgICAgIGFzdF9ub2RlICpzdGF0ZW1lbnRzKQoreworICAgdGhpcy0+bmV3X3Njb3BlID0gbmV3X3Njb3BlOworCisgICBpZiAoc3RhdGVtZW50cyAhPSBOVUxMKSB7CisgICAgICB0aGlzLT5zdGF0ZW1lbnRzLnB1c2hfZGVnZW5lcmF0ZV9saXN0X2F0X2hlYWQoJnN0YXRlbWVudHMtPmxpbmspOworICAgfQorfQorCisKK3ZvaWQKK2FzdF9leHByZXNzaW9uOjpwcmludCh2b2lkKSBjb25zdAoreworICAgc3dpdGNoIChvcGVyKSB7CisgICBjYXNlIGFzdF9hc3NpZ246CisgICBjYXNlIGFzdF9tdWxfYXNzaWduOgorICAgY2FzZSBhc3RfZGl2X2Fzc2lnbjoKKyAgIGNhc2UgYXN0X21vZF9hc3NpZ246CisgICBjYXNlIGFzdF9hZGRfYXNzaWduOgorICAgY2FzZSBhc3Rfc3ViX2Fzc2lnbjoKKyAgIGNhc2UgYXN0X2xzX2Fzc2lnbjoKKyAgIGNhc2UgYXN0X3JzX2Fzc2lnbjoKKyAgIGNhc2UgYXN0X2FuZF9hc3NpZ246CisgICBjYXNlIGFzdF94b3JfYXNzaWduOgorICAgY2FzZSBhc3Rfb3JfYXNzaWduOgorICAgICAgc3ViZXhwcmVzc2lvbnNbMF0tPnByaW50KCk7CisgICAgICBwcmludGYoIiVzICIsIG9wZXJhdG9yX3N0cmluZyhvcGVyKSk7CisgICAgICBzdWJleHByZXNzaW9uc1sxXS0+cHJpbnQoKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9maWVsZF9zZWxlY3Rpb246CisgICAgICBzdWJleHByZXNzaW9uc1swXS0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiLiAlcyAiLCBwcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllcik7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfcGx1czoKKyAgIGNhc2UgYXN0X25lZzoKKyAgIGNhc2UgYXN0X2JpdF9ub3Q6CisgICBjYXNlIGFzdF9sb2dpY19ub3Q6CisgICBjYXNlIGFzdF9wcmVfaW5jOgorICAgY2FzZSBhc3RfcHJlX2RlYzoKKyAgICAgIHByaW50ZigiJXMgIiwgb3BlcmF0b3Jfc3RyaW5nKG9wZXIpKTsKKyAgICAgIHN1YmV4cHJlc3Npb25zWzBdLT5wcmludCgpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgYXN0X3Bvc3RfaW5jOgorICAgY2FzZSBhc3RfcG9zdF9kZWM6CisgICAgICBzdWJleHByZXNzaW9uc1swXS0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiJXMgIiwgb3BlcmF0b3Jfc3RyaW5nKG9wZXIpKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9jb25kaXRpb25hbDoKKyAgICAgIHN1YmV4cHJlc3Npb25zWzBdLT5wcmludCgpOworICAgICAgcHJpbnRmKCI/ICIpOworICAgICAgc3ViZXhwcmVzc2lvbnNbMV0tPnByaW50KCk7CisgICAgICBwcmludGYoIjogIik7CisgICAgICBzdWJleHByZXNzaW9uc1syXS0+cHJpbnQoKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF9hcnJheV9pbmRleDoKKyAgICAgIHN1YmV4cHJlc3Npb25zWzBdLT5wcmludCgpOworICAgICAgcHJpbnRmKCJbICIpOworICAgICAgc3ViZXhwcmVzc2lvbnNbMV0tPnByaW50KCk7CisgICAgICBwcmludGYoIl0gIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfZnVuY3Rpb25fY2FsbDogeworICAgICAgc3ViZXhwcmVzc2lvbnNbMF0tPnByaW50KCk7CisgICAgICBwcmludGYoIiggIik7CisKKyAgICAgIGZvcmVhY2hfbGlzdF9jb25zdCAobiwgJnRoaXMtPmV4cHJlc3Npb25zKSB7CisJIGlmIChuICE9IHRoaXMtPmV4cHJlc3Npb25zLmdldF9oZWFkKCkpCisJICAgIHByaW50ZigiLCAiKTsKKworCSBhc3Rfbm9kZSAqYXN0ID0gZXhlY19ub2RlX2RhdGEoYXN0X25vZGUsIG4sIGxpbmspOworCSBhc3QtPnByaW50KCk7CisgICAgICB9CisKKyAgICAgIHByaW50ZigiKSAiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGFzdF9pZGVudGlmaWVyOgorICAgICAgcHJpbnRmKCIlcyAiLCBwcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllcik7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfaW50X2NvbnN0YW50OgorICAgICAgcHJpbnRmKCIlZCAiLCBwcmltYXJ5X2V4cHJlc3Npb24uaW50X2NvbnN0YW50KTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF91aW50X2NvbnN0YW50OgorICAgICAgcHJpbnRmKCIldSAiLCBwcmltYXJ5X2V4cHJlc3Npb24udWludF9jb25zdGFudCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfZmxvYXRfY29uc3RhbnQ6CisgICAgICBwcmludGYoIiVmICIsIHByaW1hcnlfZXhwcmVzc2lvbi5mbG9hdF9jb25zdGFudCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfYm9vbF9jb25zdGFudDoKKyAgICAgIHByaW50ZigiJXMgIiwKKwkgICAgIHByaW1hcnlfZXhwcmVzc2lvbi5ib29sX2NvbnN0YW50CisJICAgICA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgYXN0X3NlcXVlbmNlOiB7CisgICAgICBwcmludGYoIiggIik7CisgICAgICBmb3JlYWNoX2xpc3RfY29uc3QobiwgJiB0aGlzLT5leHByZXNzaW9ucykgeworCSBpZiAobiAhPSB0aGlzLT5leHByZXNzaW9ucy5nZXRfaGVhZCgpKQorCSAgICBwcmludGYoIiwgIik7CisKKwkgYXN0X25vZGUgKmFzdCA9IGV4ZWNfbm9kZV9kYXRhKGFzdF9ub2RlLCBuLCBsaW5rKTsKKwkgYXN0LT5wcmludCgpOworICAgICAgfQorICAgICAgcHJpbnRmKCIpICIpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgYXN0X2FnZ3JlZ2F0ZTogeworICAgICAgcHJpbnRmKCJ7ICIpOworICAgICAgZm9yZWFjaF9saXN0X2NvbnN0KG4sICYgdGhpcy0+ZXhwcmVzc2lvbnMpIHsKKwkgaWYgKG4gIT0gdGhpcy0+ZXhwcmVzc2lvbnMuZ2V0X2hlYWQoKSkKKwkgICAgcHJpbnRmKCIsICIpOworCisJIGFzdF9ub2RlICphc3QgPSBleGVjX25vZGVfZGF0YShhc3Rfbm9kZSwgbiwgbGluayk7CisJIGFzdC0+cHJpbnQoKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigifSAiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KDApOworICAgICAgYnJlYWs7CisgICB9Cit9CisKK2FzdF9leHByZXNzaW9uOjphc3RfZXhwcmVzc2lvbihpbnQgb3BlciwKKwkJCSAgICAgICBhc3RfZXhwcmVzc2lvbiAqZXgwLAorCQkJICAgICAgIGFzdF9leHByZXNzaW9uICpleDEsCisJCQkgICAgICAgYXN0X2V4cHJlc3Npb24gKmV4MikgOgorICAgcHJpbWFyeV9leHByZXNzaW9uKCkKK3sKKyAgIHRoaXMtPm9wZXIgPSBhc3Rfb3BlcmF0b3JzKG9wZXIpOworICAgdGhpcy0+c3ViZXhwcmVzc2lvbnNbMF0gPSBleDA7CisgICB0aGlzLT5zdWJleHByZXNzaW9uc1sxXSA9IGV4MTsKKyAgIHRoaXMtPnN1YmV4cHJlc3Npb25zWzJdID0gZXgyOworICAgdGhpcy0+bm9uX2x2YWx1ZV9kZXNjcmlwdGlvbiA9IE5VTEw7Cit9CisKKwordm9pZAorYXN0X2V4cHJlc3Npb25fc3RhdGVtZW50OjpwcmludCh2b2lkKSBjb25zdAoreworICAgaWYgKGV4cHJlc3Npb24pCisgICAgICBleHByZXNzaW9uLT5wcmludCgpOworCisgICBwcmludGYoIjsgIik7Cit9CisKKworYXN0X2V4cHJlc3Npb25fc3RhdGVtZW50Ojphc3RfZXhwcmVzc2lvbl9zdGF0ZW1lbnQoYXN0X2V4cHJlc3Npb24gKmV4KSA6CisgICBleHByZXNzaW9uKGV4KQoreworICAgLyogZW1wdHkgKi8KK30KKworCit2b2lkCithc3RfZnVuY3Rpb246OnByaW50KHZvaWQpIGNvbnN0Cit7CisgICByZXR1cm5fdHlwZS0+cHJpbnQoKTsKKyAgIHByaW50ZigiICVzICgiLCBpZGVudGlmaWVyKTsKKworICAgZm9yZWFjaF9saXN0X2NvbnN0KG4sICYgdGhpcy0+cGFyYW1ldGVycykgeworICAgICAgYXN0X25vZGUgKmFzdCA9IGV4ZWNfbm9kZV9kYXRhKGFzdF9ub2RlLCBuLCBsaW5rKTsKKyAgICAgIGFzdC0+cHJpbnQoKTsKKyAgIH0KKworICAgcHJpbnRmKCIpIik7Cit9CisKKworYXN0X2Z1bmN0aW9uOjphc3RfZnVuY3Rpb24odm9pZCkKKyAgIDogcmV0dXJuX3R5cGUoTlVMTCksIGlkZW50aWZpZXIoTlVMTCksIGlzX2RlZmluaXRpb24oZmFsc2UpLAorICAgICBzaWduYXR1cmUoTlVMTCkKK3sKKyAgIC8qIGVtcHR5ICovCit9CisKKwordm9pZAorYXN0X2Z1bGx5X3NwZWNpZmllZF90eXBlOjpwcmludCh2b2lkKSBjb25zdAoreworICAgX21lc2FfYXN0X3R5cGVfcXVhbGlmaWVyX3ByaW50KCYgcXVhbGlmaWVyKTsKKyAgIHNwZWNpZmllci0+cHJpbnQoKTsKK30KKworCit2b2lkCithc3RfcGFyYW1ldGVyX2RlY2xhcmF0b3I6OnByaW50KHZvaWQpIGNvbnN0Cit7CisgICB0eXBlLT5wcmludCgpOworICAgaWYgKGlkZW50aWZpZXIpCisgICAgICBwcmludGYoIiVzICIsIGlkZW50aWZpZXIpOworICAgYXN0X29wdF9hcnJheV9kaW1lbnNpb25zX3ByaW50KGFycmF5X3NwZWNpZmllcik7Cit9CisKKwordm9pZAorYXN0X2Z1bmN0aW9uX2RlZmluaXRpb246OnByaW50KHZvaWQpIGNvbnN0Cit7CisgICBwcm90b3R5cGUtPnByaW50KCk7CisgICBib2R5LT5wcmludCgpOworfQorCisKK3ZvaWQKK2FzdF9kZWNsYXJhdGlvbjo6cHJpbnQodm9pZCkgY29uc3QKK3sKKyAgIHByaW50ZigiJXMgIiwgaWRlbnRpZmllcik7CisgICBhc3Rfb3B0X2FycmF5X2RpbWVuc2lvbnNfcHJpbnQoYXJyYXlfc3BlY2lmaWVyKTsKKworICAgaWYgKGluaXRpYWxpemVyKSB7CisgICAgICBwcmludGYoIj0gIik7CisgICAgICBpbml0aWFsaXplci0+cHJpbnQoKTsKKyAgIH0KK30KKworCithc3RfZGVjbGFyYXRpb246OmFzdF9kZWNsYXJhdGlvbihjb25zdCBjaGFyICppZGVudGlmaWVyLAorCQkJCSBhc3RfYXJyYXlfc3BlY2lmaWVyICphcnJheV9zcGVjaWZpZXIsCisJCQkJIGFzdF9leHByZXNzaW9uICppbml0aWFsaXplcikKK3sKKyAgIHRoaXMtPmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgdGhpcy0+YXJyYXlfc3BlY2lmaWVyID0gYXJyYXlfc3BlY2lmaWVyOworICAgdGhpcy0+aW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKK30KKworCit2b2lkCithc3RfZGVjbGFyYXRvcl9saXN0OjpwcmludCh2b2lkKSBjb25zdAoreworICAgYXNzZXJ0KHR5cGUgfHwgaW52YXJpYW50KTsKKworICAgaWYgKHR5cGUpCisgICAgICB0eXBlLT5wcmludCgpOworICAgZWxzZQorICAgICAgcHJpbnRmKCJpbnZhcmlhbnQgIik7CisKKyAgIGZvcmVhY2hfbGlzdF9jb25zdCAocHRyLCAmIHRoaXMtPmRlY2xhcmF0aW9ucykgeworICAgICAgaWYgKHB0ciAhPSB0aGlzLT5kZWNsYXJhdGlvbnMuZ2V0X2hlYWQoKSkKKwkgcHJpbnRmKCIsICIpOworCisgICAgICBhc3Rfbm9kZSAqYXN0ID0gZXhlY19ub2RlX2RhdGEoYXN0X25vZGUsIHB0ciwgbGluayk7CisgICAgICBhc3QtPnByaW50KCk7CisgICB9CisKKyAgIHByaW50ZigiOyAiKTsKK30KKworCithc3RfZGVjbGFyYXRvcl9saXN0Ojphc3RfZGVjbGFyYXRvcl9saXN0KGFzdF9mdWxseV9zcGVjaWZpZWRfdHlwZSAqdHlwZSkKK3sKKyAgIHRoaXMtPnR5cGUgPSB0eXBlOworICAgdGhpcy0+aW52YXJpYW50ID0gZmFsc2U7Cit9CisKK3ZvaWQKK2FzdF9qdW1wX3N0YXRlbWVudDo6cHJpbnQodm9pZCkgY29uc3QKK3sKKyAgIHN3aXRjaCAobW9kZSkgeworICAgY2FzZSBhc3RfY29udGludWU6CisgICAgICBwcmludGYoImNvbnRpbnVlOyAiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBhc3RfYnJlYWs6CisgICAgICBwcmludGYoImJyZWFrOyAiKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBhc3RfcmV0dXJuOgorICAgICAgcHJpbnRmKCJyZXR1cm4gIik7CisgICAgICBpZiAob3B0X3JldHVybl92YWx1ZSkKKwkgb3B0X3JldHVybl92YWx1ZS0+cHJpbnQoKTsKKworICAgICAgcHJpbnRmKCI7ICIpOworICAgICAgYnJlYWs7CisgICBjYXNlIGFzdF9kaXNjYXJkOgorICAgICAgcHJpbnRmKCJkaXNjYXJkOyAiKTsKKyAgICAgIGJyZWFrOworICAgfQorfQorCisKK2FzdF9qdW1wX3N0YXRlbWVudDo6YXN0X2p1bXBfc3RhdGVtZW50KGludCBtb2RlLCBhc3RfZXhwcmVzc2lvbiAqcmV0dXJuX3ZhbHVlKQorICAgOiBvcHRfcmV0dXJuX3ZhbHVlKE5VTEwpCit7CisgICB0aGlzLT5tb2RlID0gYXN0X2p1bXBfbW9kZXMobW9kZSk7CisKKyAgIGlmIChtb2RlID09IGFzdF9yZXR1cm4pCisgICAgICBvcHRfcmV0dXJuX3ZhbHVlID0gcmV0dXJuX3ZhbHVlOworfQorCisKK3ZvaWQKK2FzdF9zZWxlY3Rpb25fc3RhdGVtZW50OjpwcmludCh2b2lkKSBjb25zdAoreworICAgcHJpbnRmKCJpZiAoICIpOworICAgY29uZGl0aW9uLT5wcmludCgpOworICAgcHJpbnRmKCIpICIpOworCisgICB0aGVuX3N0YXRlbWVudC0+cHJpbnQoKTsKKworICAgaWYgKGVsc2Vfc3RhdGVtZW50KSB7CisgICAgICBwcmludGYoImVsc2UgIik7CisgICAgICBlbHNlX3N0YXRlbWVudC0+cHJpbnQoKTsKKyAgIH0KKyAgIAorfQorCisKK2FzdF9zZWxlY3Rpb25fc3RhdGVtZW50Ojphc3Rfc2VsZWN0aW9uX3N0YXRlbWVudChhc3RfZXhwcmVzc2lvbiAqY29uZGl0aW9uLAorCQkJCQkJIGFzdF9ub2RlICp0aGVuX3N0YXRlbWVudCwKKwkJCQkJCSBhc3Rfbm9kZSAqZWxzZV9zdGF0ZW1lbnQpCit7CisgICB0aGlzLT5jb25kaXRpb24gPSBjb25kaXRpb247CisgICB0aGlzLT50aGVuX3N0YXRlbWVudCA9IHRoZW5fc3RhdGVtZW50OworICAgdGhpcy0+ZWxzZV9zdGF0ZW1lbnQgPSBlbHNlX3N0YXRlbWVudDsKK30KKworCit2b2lkCithc3Rfc3dpdGNoX3N0YXRlbWVudDo6cHJpbnQodm9pZCkgY29uc3QKK3sKKyAgIHByaW50Zigic3dpdGNoICggIik7CisgICB0ZXN0X2V4cHJlc3Npb24tPnByaW50KCk7CisgICBwcmludGYoIikgIik7CisKKyAgIGJvZHktPnByaW50KCk7Cit9CisKKworYXN0X3N3aXRjaF9zdGF0ZW1lbnQ6OmFzdF9zd2l0Y2hfc3RhdGVtZW50KGFzdF9leHByZXNzaW9uICp0ZXN0X2V4cHJlc3Npb24sCisJCQkJCSAgIGFzdF9ub2RlICpib2R5KQoreworICAgdGhpcy0+dGVzdF9leHByZXNzaW9uID0gdGVzdF9leHByZXNzaW9uOworICAgdGhpcy0+Ym9keSA9IGJvZHk7Cit9CisKKwordm9pZAorYXN0X3N3aXRjaF9ib2R5OjpwcmludCh2b2lkKSBjb25zdAoreworICAgcHJpbnRmKCJ7XG4iKTsKKyAgIGlmIChzdG10cyAhPSBOVUxMKSB7CisgICAgICBzdG10cy0+cHJpbnQoKTsKKyAgIH0KKyAgIHByaW50ZigifVxuIik7Cit9CisKKworYXN0X3N3aXRjaF9ib2R5Ojphc3Rfc3dpdGNoX2JvZHkoYXN0X2Nhc2Vfc3RhdGVtZW50X2xpc3QgKnN0bXRzKQoreworICAgdGhpcy0+c3RtdHMgPSBzdG10czsKK30KKworCit2b2lkIGFzdF9jYXNlX2xhYmVsOjpwcmludCh2b2lkKSBjb25zdAoreworICAgaWYgKHRlc3RfdmFsdWUgIT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJjYXNlICIpOworICAgICAgdGVzdF92YWx1ZS0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiOiAiKTsKKyAgIH0gZWxzZSB7CisgICAgICBwcmludGYoImRlZmF1bHQ6ICIpOworICAgfQorfQorCisKK2FzdF9jYXNlX2xhYmVsOjphc3RfY2FzZV9sYWJlbChhc3RfZXhwcmVzc2lvbiAqdGVzdF92YWx1ZSkKK3sKKyAgIHRoaXMtPnRlc3RfdmFsdWUgPSB0ZXN0X3ZhbHVlOworfQorCisKK3ZvaWQgYXN0X2Nhc2VfbGFiZWxfbGlzdDo6cHJpbnQodm9pZCkgY29uc3QKK3sKKyAgIGZvcmVhY2hfbGlzdF9jb25zdChuLCAmIHRoaXMtPmxhYmVscykgeworICAgICAgYXN0X25vZGUgKmFzdCA9IGV4ZWNfbm9kZV9kYXRhKGFzdF9ub2RlLCBuLCBsaW5rKTsKKyAgICAgIGFzdC0+cHJpbnQoKTsKKyAgIH0KKyAgIHByaW50ZigiXG4iKTsKK30KKworCithc3RfY2FzZV9sYWJlbF9saXN0Ojphc3RfY2FzZV9sYWJlbF9saXN0KHZvaWQpCit7Cit9CisKKwordm9pZCBhc3RfY2FzZV9zdGF0ZW1lbnQ6OnByaW50KHZvaWQpIGNvbnN0Cit7CisgICBsYWJlbHMtPnByaW50KCk7CisgICBmb3JlYWNoX2xpc3RfY29uc3QobiwgJiB0aGlzLT5zdG10cykgeworICAgICAgYXN0X25vZGUgKmFzdCA9IGV4ZWNfbm9kZV9kYXRhKGFzdF9ub2RlLCBuLCBsaW5rKTsKKyAgICAgIGFzdC0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgIH0KK30KKworCithc3RfY2FzZV9zdGF0ZW1lbnQ6OmFzdF9jYXNlX3N0YXRlbWVudChhc3RfY2FzZV9sYWJlbF9saXN0ICpsYWJlbHMpCit7CisgICB0aGlzLT5sYWJlbHMgPSBsYWJlbHM7Cit9CisKKwordm9pZCBhc3RfY2FzZV9zdGF0ZW1lbnRfbGlzdDo6cHJpbnQodm9pZCkgY29uc3QKK3sKKyAgIGZvcmVhY2hfbGlzdF9jb25zdChuLCAmIHRoaXMtPmNhc2VzKSB7CisgICAgICBhc3Rfbm9kZSAqYXN0ID0gZXhlY19ub2RlX2RhdGEoYXN0X25vZGUsIG4sIGxpbmspOworICAgICAgYXN0LT5wcmludCgpOworICAgfQorfQorCisKK2FzdF9jYXNlX3N0YXRlbWVudF9saXN0Ojphc3RfY2FzZV9zdGF0ZW1lbnRfbGlzdCh2b2lkKQoreworfQorCisKK3ZvaWQKK2FzdF9pdGVyYXRpb25fc3RhdGVtZW50OjpwcmludCh2b2lkKSBjb25zdAoreworICAgc3dpdGNoIChtb2RlKSB7CisgICBjYXNlIGFzdF9mb3I6CisgICAgICBwcmludGYoImZvciggIik7CisgICAgICBpZiAoaW5pdF9zdGF0ZW1lbnQpCisJIGluaXRfc3RhdGVtZW50LT5wcmludCgpOworICAgICAgcHJpbnRmKCI7ICIpOworCisgICAgICBpZiAoY29uZGl0aW9uKQorCSBjb25kaXRpb24tPnByaW50KCk7CisgICAgICBwcmludGYoIjsgIik7CisKKyAgICAgIGlmIChyZXN0X2V4cHJlc3Npb24pCisJIHJlc3RfZXhwcmVzc2lvbi0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiKSAiKTsKKworICAgICAgYm9keS0+cHJpbnQoKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGFzdF93aGlsZToKKyAgICAgIHByaW50Zigid2hpbGUgKCAiKTsKKyAgICAgIGlmIChjb25kaXRpb24pCisJIGNvbmRpdGlvbi0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiKSAiKTsKKyAgICAgIGJvZHktPnByaW50KCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBhc3RfZG9fd2hpbGU6CisgICAgICBwcmludGYoImRvICIpOworICAgICAgYm9keS0+cHJpbnQoKTsKKyAgICAgIHByaW50Zigid2hpbGUgKCAiKTsKKyAgICAgIGlmIChjb25kaXRpb24pCisJIGNvbmRpdGlvbi0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiKTsgIik7CisgICAgICBicmVhazsKKyAgIH0KK30KKworCithc3RfaXRlcmF0aW9uX3N0YXRlbWVudDo6YXN0X2l0ZXJhdGlvbl9zdGF0ZW1lbnQoaW50IG1vZGUsCisJCQkJCQkgYXN0X25vZGUgKmluaXQsCisJCQkJCQkgYXN0X25vZGUgKmNvbmRpdGlvbiwKKwkJCQkJCSBhc3RfZXhwcmVzc2lvbiAqcmVzdF9leHByZXNzaW9uLAorCQkJCQkJIGFzdF9ub2RlICpib2R5KQoreworICAgdGhpcy0+bW9kZSA9IGFzdF9pdGVyYXRpb25fbW9kZXMobW9kZSk7CisgICB0aGlzLT5pbml0X3N0YXRlbWVudCA9IGluaXQ7CisgICB0aGlzLT5jb25kaXRpb24gPSBjb25kaXRpb247CisgICB0aGlzLT5yZXN0X2V4cHJlc3Npb24gPSByZXN0X2V4cHJlc3Npb247CisgICB0aGlzLT5ib2R5ID0gYm9keTsKK30KKworCit2b2lkCithc3Rfc3RydWN0X3NwZWNpZmllcjo6cHJpbnQodm9pZCkgY29uc3QKK3sKKyAgIHByaW50Zigic3RydWN0ICVzIHsgIiwgbmFtZSk7CisgICBmb3JlYWNoX2xpc3RfY29uc3QobiwgJnRoaXMtPmRlY2xhcmF0aW9ucykgeworICAgICAgYXN0X25vZGUgKmFzdCA9IGV4ZWNfbm9kZV9kYXRhKGFzdF9ub2RlLCBuLCBsaW5rKTsKKyAgICAgIGFzdC0+cHJpbnQoKTsKKyAgIH0KKyAgIHByaW50ZigifSAiKTsKK30KKworCithc3Rfc3RydWN0X3NwZWNpZmllcjo6YXN0X3N0cnVjdF9zcGVjaWZpZXIoY29uc3QgY2hhciAqaWRlbnRpZmllciwKKwkJCQkJICAgYXN0X2RlY2xhcmF0b3JfbGlzdCAqZGVjbGFyYXRvcl9saXN0KQoreworICAgaWYgKGlkZW50aWZpZXIgPT0gTlVMTCkgeworICAgICAgc3RhdGljIG10eF90IG11dGV4ID0gX01UWF9JTklUSUFMSVpFUl9OUDsKKyAgICAgIHN0YXRpYyB1bnNpZ25lZCBhbm9uX2NvdW50ID0gMTsKKyAgICAgIHVuc2lnbmVkIGNvdW50OworCisgICAgICBtdHhfbG9jaygmbXV0ZXgpOworICAgICAgY291bnQgPSBhbm9uX2NvdW50Kys7CisgICAgICBtdHhfdW5sb2NrKCZtdXRleCk7CisKKyAgICAgIGlkZW50aWZpZXIgPSByYWxsb2NfYXNwcmludGYodGhpcywgIiNhbm9uX3N0cnVjdF8lMDR4IiwgY291bnQpOworICAgfQorICAgbmFtZSA9IGlkZW50aWZpZXI7CisgICB0aGlzLT5kZWNsYXJhdGlvbnMucHVzaF9kZWdlbmVyYXRlX2xpc3RfYXRfaGVhZCgmZGVjbGFyYXRvcl9saXN0LT5saW5rKTsKKyAgIGlzX2RlY2xhcmF0aW9uID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK3NldF9zaGFkZXJfaW5vdXRfbGF5b3V0KHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwKKwkJICAgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICBpZiAoc2hhZGVyLT5TdGFnZSAhPSBNRVNBX1NIQURFUl9HRU9NRVRSWSkgeworICAgICAgLyogU2hvdWxkIGhhdmUgYmVlbiBwcmV2ZW50ZWQgYnkgdGhlIHBhcnNlci4gKi8KKyAgICAgIGFzc2VydCghc3RhdGUtPmluX3F1YWxpZmllci0+ZmxhZ3MuaSk7CisgICAgICBhc3NlcnQoIXN0YXRlLT5vdXRfcXVhbGlmaWVyLT5mbGFncy5pKTsKKyAgIH0KKworICAgaWYgKHNoYWRlci0+U3RhZ2UgIT0gTUVTQV9TSEFERVJfQ09NUFVURSkgeworICAgICAgLyogU2hvdWxkIGhhdmUgYmVlbiBwcmV2ZW50ZWQgYnkgdGhlIHBhcnNlci4gKi8KKyAgICAgIGFzc2VydCghc3RhdGUtPmNzX2lucHV0X2xvY2FsX3NpemVfc3BlY2lmaWVkKTsKKyAgIH0KKworICAgaWYgKHNoYWRlci0+U3RhZ2UgIT0gTUVTQV9TSEFERVJfRlJBR01FTlQpIHsKKyAgICAgIC8qIFNob3VsZCBoYXZlIGJlZW4gcHJldmVudGVkIGJ5IHRoZSBwYXJzZXIuICovCisgICAgICBhc3NlcnQoIXN0YXRlLT5mc191c2VzX2dsX2ZyYWdjb29yZCk7CisgICAgICBhc3NlcnQoIXN0YXRlLT5mc19yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZCk7CisgICAgICBhc3NlcnQoIXN0YXRlLT5mc19waXhlbF9jZW50ZXJfaW50ZWdlcik7CisgICAgICBhc3NlcnQoIXN0YXRlLT5mc19vcmlnaW5fdXBwZXJfbGVmdCk7CisgICB9CisKKyAgIHN3aXRjaCAoc2hhZGVyLT5TdGFnZSkgeworICAgY2FzZSBNRVNBX1NIQURFUl9HRU9NRVRSWToKKyAgICAgIHNoYWRlci0+R2VvbS5WZXJ0aWNlc091dCA9IDA7CisgICAgICBpZiAoc3RhdGUtPm91dF9xdWFsaWZpZXItPmZsYWdzLnEubWF4X3ZlcnRpY2VzKQorICAgICAgICAgc2hhZGVyLT5HZW9tLlZlcnRpY2VzT3V0ID0gc3RhdGUtPm91dF9xdWFsaWZpZXItPm1heF92ZXJ0aWNlczsKKworICAgICAgaWYgKHN0YXRlLT5nc19pbnB1dF9wcmltX3R5cGVfc3BlY2lmaWVkKSB7CisgICAgICAgICBzaGFkZXItPkdlb20uSW5wdXRUeXBlID0gc3RhdGUtPmluX3F1YWxpZmllci0+cHJpbV90eXBlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHNoYWRlci0+R2VvbS5JbnB1dFR5cGUgPSBQUklNX1VOS05PV047CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZS0+b3V0X3F1YWxpZmllci0+ZmxhZ3MucS5wcmltX3R5cGUpIHsKKyAgICAgICAgIHNoYWRlci0+R2VvbS5PdXRwdXRUeXBlID0gc3RhdGUtPm91dF9xdWFsaWZpZXItPnByaW1fdHlwZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBzaGFkZXItPkdlb20uT3V0cHV0VHlwZSA9IFBSSU1fVU5LTk9XTjsKKyAgICAgIH0KKworICAgICAgc2hhZGVyLT5HZW9tLkludm9jYXRpb25zID0gMDsKKyAgICAgIGlmIChzdGF0ZS0+aW5fcXVhbGlmaWVyLT5mbGFncy5xLmludm9jYXRpb25zKQorICAgICAgICAgc2hhZGVyLT5HZW9tLkludm9jYXRpb25zID0gc3RhdGUtPmluX3F1YWxpZmllci0+aW52b2NhdGlvbnM7CisgICAgICBicmVhazsKKworICAgY2FzZSBNRVNBX1NIQURFUl9DT01QVVRFOgorICAgICAgaWYgKHN0YXRlLT5jc19pbnB1dF9sb2NhbF9zaXplX3NwZWNpZmllZCkgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBzaGFkZXItPkNvbXAuTG9jYWxTaXplW2ldID0gc3RhdGUtPmNzX2lucHV0X2xvY2FsX3NpemVbaV07CisgICAgICB9IGVsc2UgeworICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBzaGFkZXItPkNvbXAuTG9jYWxTaXplW2ldID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIE1FU0FfU0hBREVSX0ZSQUdNRU5UOgorICAgICAgc2hhZGVyLT5yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZCA9IHN0YXRlLT5mc19yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZDsKKyAgICAgIHNoYWRlci0+dXNlc19nbF9mcmFnY29vcmQgPSBzdGF0ZS0+ZnNfdXNlc19nbF9mcmFnY29vcmQ7CisgICAgICBzaGFkZXItPnBpeGVsX2NlbnRlcl9pbnRlZ2VyID0gc3RhdGUtPmZzX3BpeGVsX2NlbnRlcl9pbnRlZ2VyOworICAgICAgc2hhZGVyLT5vcmlnaW5fdXBwZXJfbGVmdCA9IHN0YXRlLT5mc19vcmlnaW5fdXBwZXJfbGVmdDsKKyAgICAgIHNoYWRlci0+QVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zX2VuYWJsZSA9CisgICAgICAgICBzdGF0ZS0+QVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zX2VuYWJsZTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgLyogTm90aGluZyB0byBkby4gKi8KKyAgICAgIGJyZWFrOworICAgfQorfQorCitleHRlcm4gIkMiIHsKKwordm9pZCBfbWVzYV9nbHNsYW5nX2dlbmVyYXRlX3Jlc291cmNlcyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQnVpbHRJblJlc291cmNlJiByZXNvdXJjZXMpCit7CisgICByZXNvdXJjZXMubWF4TGlnaHRzID0gY3R4LT5Db25zdC5NYXhMaWdodHM7CisgICByZXNvdXJjZXMubWF4Q2xpcFBsYW5lcyA9IGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lczsKKyAgIHJlc291cmNlcy5tYXhUZXh0dXJlVW5pdHMgPSBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0czsKKyAgIHJlc291cmNlcy5tYXhUZXh0dXJlQ29vcmRzID0gY3R4LT5Db25zdC5NYXhUZXh0dXJlQ29vcmRVbml0czsKKyAgIHJlc291cmNlcy5tYXhWZXJ0ZXhBdHRyaWJzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4QXR0cmliczsKKyAgIHJlc291cmNlcy5tYXhWZXJ0ZXhVbmlmb3JtQ29tcG9uZW50cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heFVuaWZvcm1Db21wb25lbnRzOworICAgcmVzb3VyY2VzLm1heFZhcnlpbmdGbG9hdHMgPSBjdHgtPkNvbnN0Lk1heFZhcnlpbmcgKiA0OworICAgcmVzb3VyY2VzLm1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4VGV4dHVyZUltYWdlVW5pdHM7CisgICByZXNvdXJjZXMubWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IGN0eC0+Q29uc3QuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0czsKKyAgIHJlc291cmNlcy5tYXhUZXh0dXJlSW1hZ2VVbml0cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHM7CisgICByZXNvdXJjZXMubWF4RnJhZ21lbnRVbmlmb3JtQ29tcG9uZW50cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VW5pZm9ybUNvbXBvbmVudHM7CisgICByZXNvdXJjZXMubWF4RHJhd0J1ZmZlcnMgPSBjdHgtPkNvbnN0Lk1heERyYXdCdWZmZXJzOworICAgcmVzb3VyY2VzLm1heFZlcnRleFVuaWZvcm1WZWN0b3JzID0gcmVzb3VyY2VzLm1heFZlcnRleFVuaWZvcm1Db21wb25lbnRzIC8gNDsKKyAgIHJlc291cmNlcy5tYXhWYXJ5aW5nVmVjdG9ycyA9IGN0eC0+Q29uc3QuTWF4VmFyeWluZzsKKyAgIHJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0gcmVzb3VyY2VzLm1heEZyYWdtZW50VW5pZm9ybUNvbXBvbmVudHMgLyA0OworICAgcmVzb3VyY2VzLm1heFZlcnRleE91dHB1dFZlY3RvcnMgPSBjdHgtPkNvbnN0Lk1heFZhcnlpbmc7CisgICByZXNvdXJjZXMubWF4RnJhZ21lbnRJbnB1dFZlY3RvcnMgPSBjdHgtPkNvbnN0Lk1heFZhcnlpbmcgLSAxOworICAgcmVzb3VyY2VzLm1pblByb2dyYW1UZXhlbE9mZnNldCA9IGN0eC0+Q29uc3QuTWluUHJvZ3JhbVRleGVsT2Zmc2V0OworICAgcmVzb3VyY2VzLm1heFByb2dyYW1UZXhlbE9mZnNldCA9IGN0eC0+Q29uc3QuTWF4UHJvZ3JhbVRleGVsT2Zmc2V0OworICAgcmVzb3VyY2VzLm1heENsaXBEaXN0YW5jZXMgPSA4OyAgICAgICAgICAgICAgIC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heENvbXB1dGVXb3JrR3JvdXBDb3VudFggPSBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXTsKKyAgIHJlc291cmNlcy5tYXhDb21wdXRlV29ya0dyb3VwQ291bnRZID0gY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV07CisgICByZXNvdXJjZXMubWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WiA9IGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdOworICAgcmVzb3VyY2VzLm1heENvbXB1dGVXb3JrR3JvdXBTaXplWCA9IGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMF07CisgICByZXNvdXJjZXMubWF4Q29tcHV0ZVdvcmtHcm91cFNpemVYID0gY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsxXTsKKyAgIHJlc291cmNlcy5tYXhDb21wdXRlV29ya0dyb3VwU2l6ZVogPSBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBTaXplWzJdOworICAgcmVzb3VyY2VzLm1heENvbXB1dGVVbmlmb3JtQ29tcG9uZW50cyA9IDEwMjQ7IC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heENvbXB1dGVUZXh0dXJlSW1hZ2VVbml0cyA9IDE2OyAgIC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heENvbXB1dGVJbWFnZVVuaWZvcm1zID0gODsgICAgICAgIC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heENvbXB1dGVBdG9taWNDb3VudGVycyA9IDg7ICAgICAgIC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heENvbXB1dGVBdG9taWNDb3VudGVyQnVmZmVycyA9IDE7IC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heFZhcnlpbmdDb21wb25lbnRzID0gY3R4LT5Db25zdC5NYXhWYXJ5aW5nICogNDsKKyAgIHJlc291cmNlcy5tYXhWZXJ0ZXhPdXRwdXRDb21wb25lbnRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4T3V0cHV0Q29tcG9uZW50czsKKyAgIHJlc291cmNlcy5tYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4SW5wdXRDb21wb25lbnRzOworICAgcmVzb3VyY2VzLm1heEdlb21ldHJ5T3V0cHV0Q29tcG9uZW50cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9HRU9NRVRSWV0uTWF4T3V0cHV0Q29tcG9uZW50czsKKyAgIHJlc291cmNlcy5tYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4SW5wdXRDb21wb25lbnRzOworICAgcmVzb3VyY2VzLm1heEltYWdlVW5pdHMgPSBjdHgtPkNvbnN0Lk1heEltYWdlVW5pdHM7CisgICByZXNvdXJjZXMubWF4Q29tYmluZWRJbWFnZVVuaXRzQW5kRnJhZ21lbnRPdXRwdXRzID0gY3R4LT5Db25zdC5NYXhDb21iaW5lZEltYWdlVW5pdHNBbmRGcmFnbWVudE91dHB1dHM7CisgICByZXNvdXJjZXMubWF4SW1hZ2VTYW1wbGVzID0gY3R4LT5Db25zdC5NYXhJbWFnZVNhbXBsZXM7CisgICByZXNvdXJjZXMubWF4VmVydGV4SW1hZ2VVbmlmb3JtcyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heEltYWdlVW5pZm9ybXM7CisgICByZXNvdXJjZXMubWF4VGVzc0NvbnRyb2xJbWFnZVVuaWZvcm1zID0gMDsgICAgLy8gVE9ETzogLi4uCisgICByZXNvdXJjZXMubWF4VGVzc0V2YWx1YXRpb25JbWFnZVVuaWZvcm1zID0gMDsgLy8gVE9ETzogLi4uCisgICByZXNvdXJjZXMubWF4R2VvbWV0cnlJbWFnZVVuaWZvcm1zID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhJbWFnZVVuaWZvcm1zOworICAgcmVzb3VyY2VzLm1heEZyYWdtZW50SW1hZ2VVbmlmb3JtcyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4SW1hZ2VVbmlmb3JtczsKKyAgIHJlc291cmNlcy5tYXhDb21iaW5lZEltYWdlVW5pZm9ybXMgPSBjdHgtPkNvbnN0Lk1heENvbWJpbmVkSW1hZ2VVbmlmb3JtczsKKyAgIHJlc291cmNlcy5tYXhHZW9tZXRyeVRleHR1cmVJbWFnZVVuaXRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhUZXh0dXJlSW1hZ2VVbml0czsKKyAgIHJlc291cmNlcy5tYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzID0gY3R4LT5Db25zdC5NYXhHZW9tZXRyeU91dHB1dFZlcnRpY2VzOworICAgcmVzb3VyY2VzLm1heEdlb21ldHJ5VG90YWxPdXRwdXRDb21wb25lbnRzID0gY3R4LT5Db25zdC5NYXhHZW9tZXRyeVRvdGFsT3V0cHV0Q29tcG9uZW50czsKKyAgIHJlc291cmNlcy5tYXhHZW9tZXRyeVVuaWZvcm1Db21wb25lbnRzID0gY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0dFT01FVFJZXS5NYXhVbmlmb3JtQ29tcG9uZW50czsKKyAgIHJlc291cmNlcy5tYXhHZW9tZXRyeVZhcnlpbmdDb21wb25lbnRzID0gNjQ7ICAgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzQ29udHJvbElucHV0Q29tcG9uZW50cyA9IDEyODsgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzQ29udHJvbE91dHB1dENvbXBvbmVudHMgPSAxMjg7ICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzQ29udHJvbFRleHR1cmVJbWFnZVVuaXRzID0gMTY7ICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzQ29udHJvbFVuaWZvcm1Db21wb25lbnRzID0gMTAyNDsgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzQ29udHJvbFRvdGFsT3V0cHV0Q29tcG9uZW50cyA9IDQwOTY7ICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvbklucHV0Q29tcG9uZW50cyA9IDEyODsgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvbk91dHB1dENvbXBvbmVudHMgPSAxMjg7ICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvblRleHR1cmVJbWFnZVVuaXRzID0gMTY7ICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvblVuaWZvcm1Db21wb25lbnRzID0gMTAyNDsgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzUGF0Y2hDb21wb25lbnRzID0gMTIwOyAgICAgICAgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhQYXRjaFZlcnRpY2VzID0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzR2VuTGV2ZWwgPSA2NDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhWaWV3cG9ydHMgPSBjdHgtPkNvbnN0Lk1heFZpZXdwb3J0czsKKyAgIHJlc291cmNlcy5tYXhWZXJ0ZXhBdG9taWNDb3VudGVycyA9IGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heEF0b21pY0NvdW50ZXJzOworICAgcmVzb3VyY2VzLm1heFRlc3NDb250cm9sQXRvbWljQ291bnRlcnMgPSAwOyAgICAgICAgICAgIC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heFRlc3NFdmFsdWF0aW9uQXRvbWljQ291bnRlcnMgPSAwOyAgICAgICAgIC8vIFRPRE86IC4uLgorICAgcmVzb3VyY2VzLm1heEdlb21ldHJ5QXRvbWljQ291bnRlcnMgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfR0VPTUVUUlldLk1heEF0b21pY0NvdW50ZXJzOworICAgcmVzb3VyY2VzLm1heEZyYWdtZW50QXRvbWljQ291bnRlcnMgPSBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfRlJBR01FTlRdLk1heEF0b21pY0NvdW50ZXJzOworICAgcmVzb3VyY2VzLm1heENvbWJpbmVkQXRvbWljQ291bnRlcnMgPSBjdHgtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQ291bnRlcnM7CisgICByZXNvdXJjZXMubWF4QXRvbWljQ291bnRlckJpbmRpbmdzID0gY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5nczsKKyAgIHJlc291cmNlcy5tYXhWZXJ0ZXhBdG9taWNDb3VudGVyQnVmZmVycyA9IDA7ICAgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzQ29udHJvbEF0b21pY0NvdW50ZXJCdWZmZXJzID0gMDsgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhUZXNzRXZhbHVhdGlvbkF0b21pY0NvdW50ZXJCdWZmZXJzID0gMDsgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhHZW9tZXRyeUF0b21pY0NvdW50ZXJCdWZmZXJzID0gMDsgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhGcmFnbWVudEF0b21pY0NvdW50ZXJCdWZmZXJzID0gMTsgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhDb21iaW5lZEF0b21pY0NvdW50ZXJCdWZmZXJzID0gMTsgICAgICAgICAvLyBUT0RPOiAuLi4KKyAgIHJlc291cmNlcy5tYXhBdG9taWNDb3VudGVyQnVmZmVyU2l6ZSA9IGN0eC0+Q29uc3QuTWF4QXRvbWljQnVmZmVyU2l6ZTsKKyAgIHJlc291cmNlcy5tYXhUcmFuc2Zvcm1GZWVkYmFja0J1ZmZlcnMgPSBjdHgtPkNvbnN0Lk1heFRyYW5zZm9ybUZlZWRiYWNrQnVmZmVyczsKKyAgIHJlc291cmNlcy5tYXhUcmFuc2Zvcm1GZWVkYmFja0ludGVybGVhdmVkQ29tcG9uZW50cyA9IGN0eC0+Q29uc3QuTWF4VHJhbnNmb3JtRmVlZGJhY2tJbnRlcmxlYXZlZENvbXBvbmVudHM7CisgICByZXNvdXJjZXMubGltaXRzLm5vbkluZHVjdGl2ZUZvckxvb3BzID0gMTsKKyAgIHJlc291cmNlcy5saW1pdHMud2hpbGVMb29wcyA9IDE7CisgICByZXNvdXJjZXMubGltaXRzLmRvV2hpbGVMb29wcyA9IDE7CisgICByZXNvdXJjZXMubGltaXRzLmdlbmVyYWxVbmlmb3JtSW5kZXhpbmcgPSAxOworICAgcmVzb3VyY2VzLmxpbWl0cy5nZW5lcmFsQXR0cmlidXRlTWF0cml4VmVjdG9ySW5kZXhpbmcgPSAxOworICAgcmVzb3VyY2VzLmxpbWl0cy5nZW5lcmFsVmFyeWluZ0luZGV4aW5nID0gMTsKKyAgIHJlc291cmNlcy5saW1pdHMuZ2VuZXJhbFNhbXBsZXJJbmRleGluZyA9IDE7CisgICByZXNvdXJjZXMubGltaXRzLmdlbmVyYWxWYXJpYWJsZUluZGV4aW5nID0gMTsKKyAgIHJlc291cmNlcy5saW1pdHMuZ2VuZXJhbENvbnN0YW50TWF0cml4VmVjdG9ySW5kZXhpbmcgPSAxOworfQorCisKK0VTaExhbmd1YWdlIF9tZXNhX3NoYWRlcl9zdGFnZV90b19nbHNsYW5nX3N0YWdlKHVuc2lnbmVkIHN0YWdlKQoreworICAgc3dpdGNoIChzdGFnZSkKKyAgIHsKKyAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOiAgICAgICAgICByZXR1cm4gRVNoTGFuZ1ZlcnRleDsKKyAgIGNhc2UgTUVTQV9TSEFERVJfR0VPTUVUUlk6ICAgICAgICByZXR1cm4gRVNoTGFuZ0dlb21ldHJ5OworICAgY2FzZSBNRVNBX1NIQURFUl9GUkFHTUVOVDogICAgICAgIHJldHVybiBFU2hMYW5nRnJhZ21lbnQ7CisgICBjYXNlIE1FU0FfU0hBREVSX0NPTVBVVEU6ICAgICAgICAgcmV0dXJuIEVTaExhbmdDb21wdXRlOworLy8gVE9ETzogIGNhc2UgTUVTQV9TSEFERVJfVEVTU19DT05UUk9MOiAgICByZXR1cm4gRVNoTGFuZ1Rlc3NDb250cm9sOworLy8gVE9ETzogIGNhc2UgTUVTQV9TSEFERVJfVEVTU19FVkFMVUFUSU9OOiByZXR1cm4gRVNoTGFuZ1Rlc3NFdmFsdWF0aW9uOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICByZXR1cm4gRVNoTGFuZ1ZlcnRleDsKKyAgIH0KK30KKwordm9pZCBudWxsX3Vuc3VwcG9ydGVkX2Z1bmN0aW9uYWxpdHkoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIGdsYTo6RUFib3J0VHlwZSBhdCkgeworICAgaWYgKGF0ID09IGdsYTo6RUFUQWJvcnQpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGwgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisgICAgICBleGl0KDEpOworICAgfQorfQorCit2b2lkCitfbWVzYV9nbHNsX2NvbXBpbGVfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkdW1wX2FzdCwgYm9vbCBkdW1wX1NQViwgYm9vbCBkdW1wX2hpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpcF9TUFYsIGJvb2wgY2Fub25pY2FsaXplX1NQVikKK3sKKyAgIGNvbnN0IGNoYXIqIGluZm9Mb2cgPSAiIjsKKworICAgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUgPQorICAgICAgbmV3KHNoYWRlcikgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZShjdHgsIHNoYWRlci0+U3RhZ2UsIHNoYWRlcik7CisKKyAgIHN0YXRlLT5lcnJvciA9IGZhbHNlOworCisgICAvLyBUT0RPOiBEb24ndCBjcmVhdGUgYW5kIGRlbGV0ZSB0aGUgbWFuYWdlciBmb3IgZWFjaCBjb21waWxlLiAgU2hvdWxkIGhhdmUKKyAgIC8vIG9uZSBwZXIgcG90ZW50aWFsIGNvbXBpbGF0aW9uIHRocmVhZCwgYW5kIHJlLXVzZSBmcm9tIGEgcG9vbC4KKyAgIGNvbnN0IEVTaExhbmd1YWdlIGdsc2xhbmdfc3RhZ2UgPSBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fZ2xzbGFuZ19zdGFnZShzaGFkZXItPlN0YWdlKTsKKyAgIGdsYTo6TWFuYWdlciogZ2xhTWFuYWdlciA9IGdsYTo6Z2V0TWFuYWdlcihnbHNsYW5nX3N0YWdlKTsKKworICAgLy8gV2Uga25vdyB0aGlzIGlzIGEgTWVzYUdsYXNzTWFuYWdlciwgYmVjYXVzZSBpdHMgZnJvbSBvdXIgZmFjdG9yeQorICAgZ2xhOjpNZXNhR2xhc3NNYW5hZ2VyKiBtYW5hZ2VyID0gc3RhdGljX2Nhc3Q8Z2xhOjpNZXNhR2xhc3NNYW5hZ2VyKj4oZ2xhTWFuYWdlcik7CisKKyAgIG1hbmFnZXItPm9wdGlvbnMub3B0aW1pemF0aW9ucy5sb29wVW5yb2xsVGhyZXNob2xkID0gMzUwOworICAgbWFuYWdlci0+b3B0aW9ucy5vcHRpbWl6YXRpb25zLmZsYXR0ZW5Ib2lzdFRocmVzaG9sZCA9IDI1OworICAgbWFuYWdlci0+b3B0aW9ucy5vcHRpbWl6YXRpb25zLnJlYXNzb2NpYXRlID0gY3R4LT5Db25zdC5HbGFzc0VuYWJsZVJlYXNzb2NpYXRpb247CisKKyAgIGNvbnN0IGJvb2wgdXNlU1BWID0gKCh1bnNpZ25lZCBpbnQgKilzaGFkZXItPlNvdXJjZSlbMF0gPT0gc3B2OjpNYWdpY051bWJlcjsKKworICAgZ2xzbGFuZzo6VFNoYWRlciogIGdsc2xhbmdfc2hhZGVyID0gdXNlU1BWID8gMCA6IG5ldyBnbHNsYW5nOjpUU2hhZGVyKGdsc2xhbmdfc3RhZ2UpOworICAgZ2xzbGFuZzo6VFByb2dyYW0qIGdsc2xhbmdfcHJvZ3JhbSA9IHVzZVNQViA/IDAgOiBuZXcgZ2xzbGFuZzo6VFByb2dyYW07CisKKyAgIGlmICghdXNlU1BWICYmIChnbHNsYW5nX3NoYWRlciA9PSAwIHx8IGdsc2xhbmdfcHJvZ3JhbSA9PSAwKSkKKyAgICAgIHN0YXRlLT5lcnJvciA9IHRydWU7CisKKyAgIC8vIFNldCB0aGUgc2hhZGVyIHNvdXJjZSBpbnRvIHRoZSBUU2hhZGVyIG9iamVjdAorICAgaWYgKCF1c2VTUFYpCisgICAgICAgZ2xzbGFuZ19zaGFkZXItPnNldFN0cmluZ3MoJnNoYWRlci0+U291cmNlLCAxKTsKKworICAgLy8gZ2xzbGFuZyBtZXNzYWdlIHJlcG9ydGluZyBsZXZlbAorICAgY29uc3QgRVNoTWVzc2FnZXMgbWVzc2FnZXMgPSBFU2hNZXNzYWdlcyhFU2hNc2dEZWZhdWx0IHwgRVNoTXNnUmVsYXhlZEVycm9ycyk7CisKKyAgIC8vIFRPRE86IGRvbid0IGRvIHRoaXMgcGVyIGNvbXBpbGUuCisgICBUQnVpbHRJblJlc291cmNlIHJlc291cmNlczsKKyAgIF9tZXNhX2dsc2xhbmdfZ2VuZXJhdGVfcmVzb3VyY2VzKGN0eCwgcmVzb3VyY2VzKTsKKworICAgY29uc3QgaW50IGRlZmF1bHRWZXJzaW9uID0gc3RhdGUtPmVzX3NoYWRlciA/IDEwMCA6IDExMDsKKworICAgaWYgKCF1c2VTUFYgJiYgIXN0YXRlLT5lcnJvcikgeworICAgICAgaWYgKCFnbHNsYW5nX3NoYWRlci0+cGFyc2UoJnJlc291cmNlcywgZGVmYXVsdFZlcnNpb24sIGZhbHNlLCBtZXNzYWdlcykpIHsKKyAgICAgICAgIHN0YXRlLT5lcnJvciA9IHRydWU7CisgICAgICAgICBpbmZvTG9nID0gZ2xzbGFuZ19zaGFkZXItPmdldEluZm9Mb2coKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKCF1c2VTUFYgJiYgIXN0YXRlLT5lcnJvcikKKyAgICAgIGdsc2xhbmdfcHJvZ3JhbS0+YWRkU2hhZGVyKGdsc2xhbmdfc2hhZGVyKTsKKworICAgLy8gUnVuIGdsc2xhbmcgbGlua2luZyBzdGVwCisgICBpZiAoIXVzZVNQViAmJiAhc3RhdGUtPmVycm9yICYmICFnbHNsYW5nX3Byb2dyYW0tPmxpbmsobWVzc2FnZXMpKSB7CisgICAgICBzdGF0ZS0+ZXJyb3IgPSB0cnVlOworICAgICAgaW5mb0xvZyA9IGdsc2xhbmdfcHJvZ3JhbS0+Z2V0SW5mb0xvZygpOworICAgfQorCisjaWZuZGVmIERFQlVHCisgICAvL3N0ZDo6Y2VyciA8PCBzdGQ6OmVuZGwgPDwgIlJlZ2lzdGVyIEhhbmRsZXIiIDw8IHN0ZDo6ZW5kbDsKKyAgIGdsYTo6UmVnaXN0ZXJVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlIYW5kbGVyKChnbGE6OlVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUhhbmRsZXIpIG51bGxfdW5zdXBwb3J0ZWRfZnVuY3Rpb25hbGl0eSk7CisjZW5kaWYKKworICAgaWYgKCFzdGF0ZS0+ZXJyb3IpIHsKKyAgICAgICBpZiAoIXVzZVNQVikgeworICAgICAgICAgICBmb3IgKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgRVNoTGFuZ0NvdW50OyArK3N0YWdlKSB7CisgICAgICAgICAgICAgICBnbHNsYW5nOjpUSW50ZXJtZWRpYXRlKiBpbnRlcm1lZGlhdGUgPSBnbHNsYW5nX3Byb2dyYW0tPmdldEludGVybWVkaWF0ZSgoRVNoTGFuZ3VhZ2Upc3RhZ2UpOworICAgICAgICAgICAgICAgaWYgKCEgaW50ZXJtZWRpYXRlKQorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgVHJhbnNsYXRlR2xzbGFuZ1RvVG9wKCppbnRlcm1lZGlhdGUsICptYW5hZ2VyKTsKKyAgICAgICAgICAgfQorICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBTUFYgcmVhbGx5IGlzIFNQVgorICAgICAgICAgICBpZiAoKCh1bnNpZ25lZCBpbnQgKilzaGFkZXItPlNvdXJjZSlbMF0gPT0gc3B2OjpNYWdpY051bWJlcikgeworICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBzcGlydjsKKworICAgICAgICAgICAgICAgc3BpcnYucmVzZXJ2ZShzaGFkZXItPlNpemUpOworICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wOyB4PHNoYWRlci0+U2l6ZTsgKyt4KQorICAgICAgICAgICAgICAgICAgIHNwaXJ2LnB1c2hfYmFjaygoKHVuc2lnbmVkIGludCAqKXNoYWRlci0+U291cmNlKVt4XSk7CisKKyAgICAgICAgICAgICAgIGlmIChzdHJpcF9TUFYgfHwgY2Fub25pY2FsaXplX1NQVikgeworICAgICAgICAgICAgICAgICAgIC8vIHJlbWFwIGlzIGV4cGVuc2l2ZSwganVzdCBjYWxsIG9uY2Ugd2l0aCBPUidkIGZlYXR1cmUgbWFzaworICAgICAgICAgICAgICAgICAgIHNwdjo6c3BpcnZiaW5fdCgwKS5yZW1hcChzcGlydiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBfU1BWICAgICAgICA/IHNwdjo6c3BpcnZiaW5fdDo6U1RSSVAgICAgICAgICA6IDAgfAorICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVfU1BWID8gc3B2OjpzcGlydmJpbl90OjpBTExfQlVUX1NUUklQIDogMCk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChkdW1wX1NQVikgeworICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNwaXJ2LXRvb2xzOjpEaXNhc3NlbWJsZShzdGQ6OmNvdXQsIHNwaXJ2KTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgZ2xhOjpTcHZUb1RvcChzcGlydiwgKm1hbmFnZXIpOworICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgc3RhdGUtPmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIGlmIChkdW1wX2hpcikKKyAgICAgICAgICAgbWFuYWdlci0+ZHVtcCgiXG5Ub3AgSVI6XG4iKTsKKworICAgICAgIC8vIFRvcCBJUiB0byBib3R0b20gSVIKKyAgICAgICBtYW5hZ2VyLT50cmFuc2xhdGVUb3BUb0JvdHRvbSgpOworCisgICAgICAgaWYgKGR1bXBfaGlyKQorICAgICAgICAgICBtYW5hZ2VyLT5kdW1wKCJcblxuQm90dG9tIElSOlxuIik7CisgICB9CisKKyAgIGlmICghc3RhdGUtPmVycm9yKSB7CisgICAgICBjb25zdCBib29sIHByZXZFc1NoYWRlciA9IHN0YXRlLT5lc19zaGFkZXI7CisKKyAgICAgIC8vIFdlIG11c3QgcHJvdmlkZSBzb21lIHN0YXRlIHRoYXQgbG93ZXIgbGV2ZWwgZnVuY3Rpb25zIGRlcGVuZCB1cG9uCisgICAgICBzdGF0ZS0+ZXNfc2hhZGVyID0gKG1hbmFnZXItPmdldFByb2ZpbGUoKSA9PSBFRXNQcm9maWxlKTsKKyAgICAgIHN0YXRlLT5sYW5ndWFnZV92ZXJzaW9uID0gdXNlU1BWID8gNDUwIDogbWFuYWdlci0+Z2V0VmVyc2lvbigpOworICAgICAgCisgICAgICAvLyBUT0RPOiBlbmFibGUga2V5IGV4dGVuc2lvbnMsIGluIGFkdmFuY2Ugb2YgYmV0dGVyIGludGVncmF0aW9uLAorICAgICAgLy8gc28gdGhhdCB0ZXh0dXJlIGZuIGxvb2t1cCBjYW4gZmluZCB0aGVtLiAgVGhpcyBpc24ndCB0aGUgcmlnaHQgd2F5IHRvCisgICAgICAvLyBnbyBhYm91dCBpdC4KKyAgICAgIHN0YXRlLT5BUkJfdGV4dHVyZV9yZWN0YW5nbGVfZW5hYmxlICA9IHRydWU7CisgICAgICBzdGF0ZS0+QVJCX3NoYWRlcl90ZXh0dXJlX2xvZF9lbmFibGUgPSB0cnVlOworICAgICAgc3RhdGUtPkFSQl9kcmF3X2luc3RhbmNlZF9lbmFibGUgICAgID0gdHJ1ZTsKKyAgICAgIHN0YXRlLT5FWFRfdGV4dHVyZV9hcnJheV9lbmFibGUgICAgICA9IHRydWU7CisgICAgICBzdGF0ZS0+QVJCX3RleHR1cmVfcmVjdGFuZ2xlX2VuYWJsZSAgPSB0cnVlOworICAgICAgc3RhdGUtPkFSQl90ZXh0dXJlX2dhdGhlcl9lbmFibGUgICAgID0gdHJ1ZTsKKyAgICAgIHN0YXRlLT5BUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheV9lbmFibGUgPSB0cnVlOworCisgICAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgbmV3IGluc3RydWN0aW9uIGxpc3QKKyAgICAgIC8vIFNldCByZXF1aXJlZCBzdGF0ZSBmb3IgdHJhbnNsYXRpb24gdG8gSElSCisgICAgICBtYW5hZ2VyLT5nZXRCYWNrZW5kVHJhbnNsYXRvcigpLT5pbml0aWFsaXplVHJhbnNsYXRpb24oY3R4LCBzdGF0ZSwgc2hhZGVyKTsKKworICAgICAgLy8gVHJhbnNsYXRlIEJvdHRvbSBJUiB0byBISVIKKyAgICAgIC8vIFRPRE86IFNraXAgZW1wdHkgdHJhbnNsYXRpb24gdW5pdHM6CisgICAgICAvLyAgICAgIXN0YXRlLT50cmFuc2xhdGlvbl91bml0LmlzX2VtcHR5KCkgcHJvYmFibHkgbm90IHNldCB1cCBpbiB0aGlzIHBhdGgKKyAgICAgIG1hbmFnZXItPnRyYW5zbGF0ZUJvdHRvbVRvVGFyZ2V0KCk7CisKKyAgICAgIG1hbmFnZXItPmdldEJhY2tlbmRUcmFuc2xhdG9yKCktPmZpbmFsaXplVHJhbnNsYXRpb24oKTsKKworICAgICAgc3RhdGUtPmVzX3NoYWRlciA9IHByZXZFc1NoYWRlcjsKKworICAgICAgLy8gVE9ETzogZW5zdXJlIHRoYXQgc3RhdGUtPmVycm9yIGlzIHNldCBpZiB0aGUgdHJhbnNsYXRvciBmYWlscworCisgICAgICBpZiAoZHVtcF9oaXIpCisgICAgICAgICBfbWVzYV9wcmludF9pcihzdGRvdXQsIHNoYWRlci0+aXIsIHN0YXRlKTsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgcmVzdWx0aW5nIEhJUgorICAgaWYgKCFzdGF0ZS0+ZXJyb3IpIHsKKyAgICAgIHZhbGlkYXRlX2lyX3RyZWUoc2hhZGVyLT5pcik7CisgICB9IGVsc2UgeworICAgICAgaWYgKCFpbmZvTG9nIHx8IGluZm9Mb2dbMF0gPT0gJ1wwJykKKyAgICAgICAgIGluZm9Mb2cgPSBtYW5hZ2VyLT5nZXRCYWNrZW5kVHJhbnNsYXRvcigpLT5nZXRJbmZvTG9nKCk7CisgICB9CisKKyAgIC8vIEZyZWUgb2xkIGluZm9sb2cgaWYgYW55CisgICBpZiAoc2hhZGVyLT5JbmZvTG9nKQorICAgICAgcmFsbG9jX2ZyZWUoc2hhZGVyLT5JbmZvTG9nKTsKKworICAgc2hhZGVyLT5zeW1ib2xzICAgICAgICAgICAgICAgID0gc3RhdGUtPnN5bWJvbHM7CisgICBzaGFkZXItPkNvbXBpbGVTdGF0dXMgICAgICAgICAgPSAhc3RhdGUtPmVycm9yOworICAgc2hhZGVyLT5WZXJzaW9uICAgICAgICAgICAgICAgID0gdXNlU1BWID8gNDUwIDogbWFuYWdlci0+Z2V0VmVyc2lvbigpOworICAgc2hhZGVyLT51c2VzX2J1aWx0aW5fZnVuY3Rpb25zID0gc3RhdGUtPnVzZXNfYnVpbHRpbl9mdW5jdGlvbnM7CisgICBzaGFkZXItPklzRVMgICAgICAgICAgICAgICAgICAgPSBzdGF0ZS0+ZXNfc2hhZGVyOworCisgICBpZiAoIXN0YXRlLT5lcnJvcikKKyAgICAgIHNldF9zaGFkZXJfaW5vdXRfbGF5b3V0KHNoYWRlciwgc3RhdGUpOworCisgICAvLyBSZXR1cm4gaW5mb2xvZyBmcm9tIHBhcnNlciBvciBsaW5rZXIKKyAgIHN0YXRlLT5pbmZvX2xvZyA9IHNoYWRlci0+SW5mb0xvZyA9IHJhbGxvY19zdHJkdXAoc2hhZGVyLCBpbmZvTG9nKTsKKworICAgaWYgKHNoYWRlci0+aXIpCisgICAgICByZXBhcmVudF9pcihzaGFkZXItPmlyLCBzaGFkZXItPmlyKTsKKworICAgLy8gY2xlYW4gdXAKKyAgIGlmIChzdGF0ZSkKKyAgICAgIHJhbGxvY19mcmVlKHN0YXRlKTsKKworICAgZGVsZXRlIGdsc2xhbmdfcHJvZ3JhbTsKKyAgIGRlbGV0ZSBnbHNsYW5nX3NoYWRlcjsKKyAgIGRlbGV0ZSBtYW5hZ2VyOworfQorCit9IC8qIGV4dGVybiAiQyIgKi8KKy8qKgorICogRG8gdGhlIHNldCBvZiBjb21tb24gb3B0aW1pemF0aW9ucyBwYXNzZXMKKyAqCisgKiBccGFyYW0gaXIgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHRvIGJlIG9wdGltaXplZAorICogXHBhcmFtIGxpbmtlZCAgICAgICAgICAgICAgICAgICAgICBJcyB0aGUgc2hhZGVyIGxpbmtlZD8gIFRoaXMgZW5hYmxlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25zIHBhc3NlcyB0aGF0IHJlbW92ZSBjb2RlIGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBzY29wZSBhbmQgY291bGQgY2F1c2UgbGlua2luZyB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsLgorICogXHBhcmFtIHVuaWZvcm1fbG9jYXRpb25zX2Fzc2lnbmVkICBIYXZlIGxvY2F0aW9ucyBhbHJlYWR5IGJlZW4gYXNzaWduZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zPyAgVGhpcyBwcmV2ZW50cyB0aGUgZGVjbGFyYXRpb25zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHVudXNlZCB1bmlmb3JtcyBmcm9tIGJlaW5nIHJlbW92ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoaXMgZmxhZyBvbmx5IG1hdHRlcnMgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGMgbGlua2VkIGlzIFxjIHRydWUuCisgKiBccGFyYW0gbWF4X3Vucm9sbF9pdGVyYXRpb25zICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJvbGxlZC4gIFNldHRpbmcgdG8gMCBkaXNhYmxlcyBsb29wCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucm9sbGluZy4KKyAqIFxwYXJhbSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgVGhlIGRyaXZlcidzIHByZWZlcnJlZCBzaGFkZXIgb3B0aW9ucy4KKyAqLworYm9vbAorZG9fY29tbW9uX29wdGltaXphdGlvbihleGVjX2xpc3QgKmlyLCBib29sIGxpbmtlZCwKKwkJICAgICAgIGJvb2wgdW5pZm9ybV9sb2NhdGlvbnNfYXNzaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucyAqb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYXRpdmVfaW50ZWdlcnMpCit7CisgICBHTGJvb2xlYW4gcHJvZ3Jlc3MgPSBHTF9GQUxTRTsKKworICAgcHJvZ3Jlc3MgPSBsb3dlcl9pbnN0cnVjdGlvbnMoaXIsIFNVQl9UT19BRERfTkVHKSB8fCBwcm9ncmVzczsKKworICAgaWYgKGxpbmtlZCkgeworICAgICAgcHJvZ3Jlc3MgPSBkb19mdW5jdGlvbl9pbmxpbmluZyhpcikgfHwgcHJvZ3Jlc3M7CisgICAgICBwcm9ncmVzcyA9IGRvX2RlYWRfZnVuY3Rpb25zKGlyKSB8fCBwcm9ncmVzczsKKyAgICAgIHByb2dyZXNzID0gZG9fc3RydWN0dXJlX3NwbGl0dGluZyhpcikgfHwgcHJvZ3Jlc3M7CisgICB9CisgICBwcm9ncmVzcyA9IGRvX2lmX3NpbXBsaWZpY2F0aW9uKGlyKSB8fCBwcm9ncmVzczsKKyAgIHByb2dyZXNzID0gb3B0X2ZsYXR0ZW5fbmVzdGVkX2lmX2Jsb2NrcyhpcikgfHwgcHJvZ3Jlc3M7CisgICBwcm9ncmVzcyA9IGRvX2NvcHlfcHJvcGFnYXRpb24oaXIpIHx8IHByb2dyZXNzOworICAgcHJvZ3Jlc3MgPSBkb19jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzKGlyKSB8fCBwcm9ncmVzczsKKworICAgaWYgKG9wdGlvbnMtPk9wdGltaXplRm9yQU9TICYmICFsaW5rZWQpCisgICAgICBwcm9ncmVzcyA9IG9wdF9mbGlwX21hdHJpY2VzKGlyKSB8fCBwcm9ncmVzczsKKworICAgaWYgKGxpbmtlZCAmJiBvcHRpb25zLT5PcHRpbWl6ZUZvckFPUykgeworICAgICAgcHJvZ3Jlc3MgPSBkb192ZWN0b3JpemUoaXIpIHx8IHByb2dyZXNzOworICAgfQorCisgICBpZiAobGlua2VkKQorICAgICAgcHJvZ3Jlc3MgPSBkb19kZWFkX2NvZGUoaXIsIHVuaWZvcm1fbG9jYXRpb25zX2Fzc2lnbmVkKSB8fCBwcm9ncmVzczsKKyAgIGVsc2UKKyAgICAgIHByb2dyZXNzID0gZG9fZGVhZF9jb2RlX3VubGlua2VkKGlyKSB8fCBwcm9ncmVzczsKKworICAgcHJvZ3Jlc3MgPSBkb19kZWFkX2NvZGVfbG9jYWwoaXIpIHx8IHByb2dyZXNzOworICAgcHJvZ3Jlc3MgPSBkb190cmVlX2dyYWZ0aW5nKGlyKSB8fCBwcm9ncmVzczsKKyAgIHByb2dyZXNzID0gZG9fY29uc3RhbnRfcHJvcGFnYXRpb24oaXIpIHx8IHByb2dyZXNzOworICAgaWYgKGxpbmtlZCkKKyAgICAgIHByb2dyZXNzID0gZG9fY29uc3RhbnRfdmFyaWFibGUoaXIpIHx8IHByb2dyZXNzOworICAgZWxzZQorICAgICAgcHJvZ3Jlc3MgPSBkb19jb25zdGFudF92YXJpYWJsZV91bmxpbmtlZChpcikgfHwgcHJvZ3Jlc3M7CisgICBwcm9ncmVzcyA9IGRvX2NvbnN0YW50X2ZvbGRpbmcoaXIpIHx8IHByb2dyZXNzOworICAgcHJvZ3Jlc3MgPSBkb19jc2UoaXIpIHx8IHByb2dyZXNzOworICAgcHJvZ3Jlc3MgPSBkb19hbGdlYnJhaWMoaXIsIG5hdGl2ZV9pbnRlZ2VycykgfHwgcHJvZ3Jlc3M7CisgICBwcm9ncmVzcyA9IGRvX2xvd2VyX2p1bXBzKGlyKSB8fCBwcm9ncmVzczsKKyAgIHByb2dyZXNzID0gZG9fdmVjX2luZGV4X3RvX3N3aXp6bGUoaXIpIHx8IHByb2dyZXNzOworICAgcHJvZ3Jlc3MgPSBsb3dlcl92ZWN0b3JfaW5zZXJ0KGlyLCBmYWxzZSkgfHwgcHJvZ3Jlc3M7CisgICBwcm9ncmVzcyA9IGRvX3N3aXp6bGVfc3dpenpsZShpcikgfHwgcHJvZ3Jlc3M7CisgICBwcm9ncmVzcyA9IGRvX25vb3Bfc3dpenpsZShpcikgfHwgcHJvZ3Jlc3M7CisKKyAgIHByb2dyZXNzID0gb3B0aW1pemVfc3BsaXRfYXJyYXlzKGlyLCBsaW5rZWQpIHx8IHByb2dyZXNzOworICAgcHJvZ3Jlc3MgPSBvcHRpbWl6ZV9yZWR1bmRhbnRfanVtcHMoaXIpIHx8IHByb2dyZXNzOworCisgICBsb29wX3N0YXRlICpscyA9IGFuYWx5emVfbG9vcF92YXJpYWJsZXMoaXIpOworICAgaWYgKGxzLT5sb29wX2ZvdW5kKSB7CisgICAgICBwcm9ncmVzcyA9IHNldF9sb29wX2NvbnRyb2xzKGlyLCBscykgfHwgcHJvZ3Jlc3M7CisgICAgICBwcm9ncmVzcyA9IHVucm9sbF9sb29wcyhpciwgbHMsIG9wdGlvbnMpIHx8IHByb2dyZXNzOworICAgfQorICAgZGVsZXRlIGxzOworCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK2V4dGVybiAiQyIgeworCisvKioKKyAqIFRvIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNyZWF0aW9uIHRpbWUuICBUaGlzIGRvZXMgb25lLXRpbWUKKyAqIGNvbXBpbGVyIGluaXRpYWxpemF0aW9uLgorICovCit2b2lkCitfbWVzYV9jcmVhdGVfc2hhZGVyX2NvbXBpbGVyKHZvaWQpCit7CisgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAvLyBJbml0aWFsaXplIGdsc2xhbmcgYW5kIEx1bmFyR2xhc3MKKyAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgIGdsc2xhbmc6OkluaXRpYWxpemVQcm9jZXNzKCk7CisgICAgICBnbGE6Ok1hbmFnZXI6OnN0YXJ0TXVsdGl0aHJlYWRlZCgpOworICAgICAgZ2xhOjpNZXNhR2xhc3NUcmFuc2xhdG9yOjppbml0U2FtcGxlclR5cGVzKCk7CisgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICB9Cit9CisKKy8qKgorICogVG8gYmUgY2FsbGVkIGF0IEdMIHRlYXJkb3duIHRpbWUsIHRoaXMgZnJlZXMgY29tcGlsZXIgZGF0YXN0cnVjdHVyZXMuCisgKgorICogQWZ0ZXIgY2FsbGluZyB0aGlzLCBhbnkgcHJldmlvdXNseSBjb21waWxlZCBzaGFkZXJzIGFuZCBzaGFkZXIKKyAqIHByb2dyYW1zIHdvdWxkIGJlIGludmFsaWQuICBTbyB0aGlzIHNob3VsZCBoYXBwZW4gYXQgYXBwcm94aW1hdGVseQorICogcHJvZ3JhbSBleGl0LgorICovCit2b2lkCitfbWVzYV9kZXN0cm95X3NoYWRlcl9jb21waWxlcih2b2lkKQoreworLy8gICBfbWVzYV9nbHNsX2Rlc3Ryb3lfdGhyZWFkcG9vbCgpOworCisgICBfbWVzYV9kZXN0cm95X3NoYWRlcl9jb21waWxlcl9jYWNoZXMoKTsKKworICAgX21lc2FfZ2xzbF9yZWxlYXNlX3R5cGVzKCk7Cit9CisKKy8qKgorICogUmVsZWFzZXMgY29tcGlsZXIgY2FjaGVzIHRvIHRyYWRlIG9mZiBwZXJmb3JtYW5jZSBmb3IgbWVtb3J5LgorICoKKyAqIEludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBnbFJlbGVhc2VTaGFkZXJDb21waWxlcigpLgorICovCit2b2lkCitfbWVzYV9kZXN0cm95X3NoYWRlcl9jb21waWxlcl9jYWNoZXModm9pZCkKK3sKKy8vICAgX21lc2FfZ2xzbF93YWl0X3RocmVhZHBvb2woKTsKKyAgIF9tZXNhX2dsc2xfcmVsZWFzZV9idWlsdGluX2Z1bmN0aW9ucygpOworfQorCit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfc3ltYm9sX3RhYmxlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9zeW1ib2xfdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTIzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfc3ltYm9sX3RhYmxlLmNwcApAQCAtMCwwICsxLDI0OCBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZ2xzbF9zeW1ib2xfdGFibGUuaCIKKworY2xhc3Mgc3ltYm9sX3RhYmxlX2VudHJ5IHsKK3B1YmxpYzoKKyAgIERFQ0xBUkVfUkFMTE9DX0NYWF9PUEVSQVRPUlMoc3ltYm9sX3RhYmxlX2VudHJ5KTsKKworICAgYm9vbCBhZGRfaW50ZXJmYWNlKGNvbnN0IGdsc2xfdHlwZSAqaSwgZW51bSBpcl92YXJpYWJsZV9tb2RlIG1vZGUpCisgICB7CisgICAgICBjb25zdCBnbHNsX3R5cGUgKipkZXN0OworCisgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgIGNhc2UgaXJfdmFyX3VuaWZvcm06CisgICAgICAgICBkZXN0ID0gJmlidTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpcl92YXJfc2hhZGVyX2luOgorICAgICAgICAgZGVzdCA9ICZpYmk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9vdXQ6CisgICAgICAgICBkZXN0ID0gJmlibzsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFzc2VydCghIlVuc3VwcG9ydGVkIGludGVyZmFjZSB2YXJpYWJsZSBtb2RlISIpOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoKmRlc3QgIT0gTlVMTCkgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICpkZXN0ID0gaTsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorCisgICBjb25zdCBnbHNsX3R5cGUgKmdldF9pbnRlcmZhY2UoZW51bSBpcl92YXJpYWJsZV9tb2RlIG1vZGUpCisgICB7CisgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgIGNhc2UgaXJfdmFyX3VuaWZvcm06CisgICAgICAgICByZXR1cm4gaWJ1OworICAgICAgY2FzZSBpcl92YXJfc2hhZGVyX2luOgorICAgICAgICAgcmV0dXJuIGliaTsKKyAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9vdXQ6CisgICAgICAgICByZXR1cm4gaWJvOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFzc2VydCghIlVuc3VwcG9ydGVkIGludGVyZmFjZSB2YXJpYWJsZSBtb2RlISIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIHN5bWJvbF90YWJsZV9lbnRyeShpcl92YXJpYWJsZSAqdikgICAgICAgICAgICAgICA6CisgICAgICB2KHYpLCBmKDApLCB0KDApLCBpYnUoMCksIGliaSgwKSwgaWJvKDApLCBhKDApIHt9CisgICBzeW1ib2xfdGFibGVfZW50cnkoaXJfZnVuY3Rpb24gKmYpICAgICAgICAgICAgICAgOgorICAgICAgdigwKSwgZihmKSwgdCgwKSwgaWJ1KDApLCBpYmkoMCksIGlibygwKSwgYSgwKSB7fQorICAgc3ltYm9sX3RhYmxlX2VudHJ5KGNvbnN0IGdsc2xfdHlwZSAqdCkgICAgICAgICAgIDoKKyAgICAgIHYoMCksIGYoMCksIHQodCksIGlidSgwKSwgaWJpKDApLCBpYm8oMCksIGEoMCkge30KKyAgIHN5bWJvbF90YWJsZV9lbnRyeShjb25zdCBnbHNsX3R5cGUgKnQsIGVudW0gaXJfdmFyaWFibGVfbW9kZSBtb2RlKSA6CisgICAgICB2KDApLCBmKDApLCB0KDApLCBpYnUoMCksIGliaSgwKSwgaWJvKDApLCBhKDApCisgICB7CisgICAgICBhc3NlcnQodC0+aXNfaW50ZXJmYWNlKCkpOworICAgICAgYWRkX2ludGVyZmFjZSh0LCBtb2RlKTsKKyAgIH0KKyAgIHN5bWJvbF90YWJsZV9lbnRyeShjb25zdCBjbGFzcyBhc3RfdHlwZV9zcGVjaWZpZXIgKmEpOgorICAgICAgdigwKSwgZigwKSwgdCgwKSwgaWJ1KDApLCBpYmkoMCksIGlibygwKSwgYShhKSB7fQorCisgICBpcl92YXJpYWJsZSAqdjsKKyAgIGlyX2Z1bmN0aW9uICpmOworICAgY29uc3QgZ2xzbF90eXBlICp0OworICAgY29uc3QgZ2xzbF90eXBlICppYnU7CisgICBjb25zdCBnbHNsX3R5cGUgKmliaTsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqaWJvOworICAgY29uc3QgY2xhc3MgYXN0X3R5cGVfc3BlY2lmaWVyICphOworfTsKKworZ2xzbF9zeW1ib2xfdGFibGU6Omdsc2xfc3ltYm9sX3RhYmxlKCkKK3sKKyAgIHRoaXMtPnNlcGFyYXRlX2Z1bmN0aW9uX25hbWVzcGFjZSA9IGZhbHNlOworICAgdGhpcy0+dGFibGUgPSBfbWVzYV9zeW1ib2xfdGFibGVfY3RvcigpOworICAgdGhpcy0+bWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworfQorCitnbHNsX3N5bWJvbF90YWJsZTo6fmdsc2xfc3ltYm9sX3RhYmxlKCkKK3sKKyAgIF9tZXNhX3N5bWJvbF90YWJsZV9kdG9yKHRhYmxlKTsKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworfQorCit2b2lkIGdsc2xfc3ltYm9sX3RhYmxlOjpwdXNoX3Njb3BlKCkKK3sKKyAgIF9tZXNhX3N5bWJvbF90YWJsZV9wdXNoX3Njb3BlKHRhYmxlKTsKK30KKwordm9pZCBnbHNsX3N5bWJvbF90YWJsZTo6cG9wX3Njb3BlKCkKK3sKKyAgIF9tZXNhX3N5bWJvbF90YWJsZV9wb3Bfc2NvcGUodGFibGUpOworfQorCitib29sIGdsc2xfc3ltYm9sX3RhYmxlOjpuYW1lX2RlY2xhcmVkX3RoaXNfc2NvcGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIHJldHVybiBfbWVzYV9zeW1ib2xfdGFibGVfc3ltYm9sX3Njb3BlKHRhYmxlLCAtMSwgbmFtZSkgPT0gMDsKK30KKworYm9vbCBnbHNsX3N5bWJvbF90YWJsZTo6YWRkX3ZhcmlhYmxlKGlyX3ZhcmlhYmxlICp2KQoreworICAgaWYgKHRoaXMtPnNlcGFyYXRlX2Z1bmN0aW9uX25hbWVzcGFjZSkgeworICAgICAgLyogSW4gMS4xMCwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgaGF2ZSBzZXBhcmF0ZSBuYW1lc3BhY2VzLiAqLworICAgICAgc3ltYm9sX3RhYmxlX2VudHJ5ICpleGlzdGluZyA9IGdldF9lbnRyeSh2LT5uYW1lKTsKKyAgICAgIGlmIChuYW1lX2RlY2xhcmVkX3RoaXNfc2NvcGUodi0+bmFtZSkpIHsKKwkgLyogSWYgdGhlcmUncyBhbHJlYWR5IGFuIGV4aXN0aW5nIGZ1bmN0aW9uIChub3QgYSBjb25zdHJ1Y3RvciEpIGluCisJICAqIHRoZSBjdXJyZW50IHNjb3BlLCBqdXN0IHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkgdG8gaW5jbHVkZSAndicuCisJICAqLworCSBpZiAoZXhpc3RpbmctPnYgPT0gTlVMTCAmJiBleGlzdGluZy0+dCA9PSBOVUxMKSB7CisJICAgIGV4aXN0aW5nLT52ID0gdjsKKwkgICAgcmV0dXJuIHRydWU7CisJIH0KKyAgICAgIH0gZWxzZSB7CisJIC8qIElmIG5vdCBkZWNsYXJlZCBhdCB0aGlzIHNjb3BlLCBhZGQgYSBuZXcgZW50cnkuICBCdXQgaWYgYW4gZXhpc3RpbmcKKwkgICogZW50cnkgaW5jbHVkZXMgYSBmdW5jdGlvbiwgcHJvcGFnYXRlIHRoYXQgdG8gdGhpcyBibG9jayAtIG90aGVyd2lzZQorCSAgKiB0aGUgbmV3IHZhcmlhYmxlIGRlY2xhcmF0aW9uIHdvdWxkIHNoYWRvdyB0aGUgZnVuY3Rpb24uCisJICAqLworCSBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gbmV3KG1lbV9jdHgpIHN5bWJvbF90YWJsZV9lbnRyeSh2KTsKKwkgaWYgKGV4aXN0aW5nICE9IE5VTEwpCisJICAgIGVudHJ5LT5mID0gZXhpc3RpbmctPmY7CisJIGludCBhZGRlZCA9IF9tZXNhX3N5bWJvbF90YWJsZV9hZGRfc3ltYm9sKHRhYmxlLCAtMSwgdi0+bmFtZSwgZW50cnkpOworCSBhc3NlcnQoYWRkZWQgPT0gMCk7CisJICh2b2lkKWFkZGVkOworCSByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgLyogMS4yMCsgcnVsZXM6ICovCisgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gbmV3KG1lbV9jdHgpIHN5bWJvbF90YWJsZV9lbnRyeSh2KTsKKyAgIHJldHVybiBfbWVzYV9zeW1ib2xfdGFibGVfYWRkX3N5bWJvbCh0YWJsZSwgLTEsIHYtPm5hbWUsIGVudHJ5KSA9PSAwOworfQorCitib29sIGdsc2xfc3ltYm9sX3RhYmxlOjphZGRfdHlwZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBnbHNsX3R5cGUgKnQpCit7CisgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gbmV3KG1lbV9jdHgpIHN5bWJvbF90YWJsZV9lbnRyeSh0KTsKKyAgIHJldHVybiBfbWVzYV9zeW1ib2xfdGFibGVfYWRkX3N5bWJvbCh0YWJsZSwgLTEsIG5hbWUsIGVudHJ5KSA9PSAwOworfQorCitib29sIGdsc2xfc3ltYm9sX3RhYmxlOjphZGRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGdsc2xfdHlwZSAqaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpcl92YXJpYWJsZV9tb2RlIG1vZGUpCit7CisgICBhc3NlcnQoaS0+aXNfaW50ZXJmYWNlKCkpOworICAgc3ltYm9sX3RhYmxlX2VudHJ5ICplbnRyeSA9IGdldF9lbnRyeShuYW1lKTsKKyAgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisgICAgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0KKyAgICAgICAgIG5ldyhtZW1fY3R4KSBzeW1ib2xfdGFibGVfZW50cnkoaSwgbW9kZSk7CisgICAgICBib29sIGFkZF9pbnRlcmZhY2Vfc3ltYm9sX3Jlc3VsdCA9CisgICAgICAgICBfbWVzYV9zeW1ib2xfdGFibGVfYWRkX3N5bWJvbCh0YWJsZSwgLTEsIG5hbWUsIGVudHJ5KSA9PSAwOworICAgICAgYXNzZXJ0KGFkZF9pbnRlcmZhY2Vfc3ltYm9sX3Jlc3VsdCk7CisgICAgICByZXR1cm4gYWRkX2ludGVyZmFjZV9zeW1ib2xfcmVzdWx0OworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBlbnRyeS0+YWRkX2ludGVyZmFjZShpLCBtb2RlKTsKKyAgIH0KK30KKworYm9vbCBnbHNsX3N5bWJvbF90YWJsZTo6YWRkX2Z1bmN0aW9uKGlyX2Z1bmN0aW9uICpmKQoreworICAgaWYgKHRoaXMtPnNlcGFyYXRlX2Z1bmN0aW9uX25hbWVzcGFjZSAmJiBuYW1lX2RlY2xhcmVkX3RoaXNfc2NvcGUoZi0+bmFtZSkpIHsKKyAgICAgIC8qIEluIDEuMTAsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGhhdmUgc2VwYXJhdGUgbmFtZXNwYWNlcy4gKi8KKyAgICAgIHN5bWJvbF90YWJsZV9lbnRyeSAqZXhpc3RpbmcgPSBnZXRfZW50cnkoZi0+bmFtZSk7CisgICAgICBpZiAoKGV4aXN0aW5nLT5mID09IE5VTEwpICYmIChleGlzdGluZy0+dCA9PSBOVUxMKSkgeworCSBleGlzdGluZy0+ZiA9IGY7CisJIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorICAgc3ltYm9sX3RhYmxlX2VudHJ5ICplbnRyeSA9IG5ldyhtZW1fY3R4KSBzeW1ib2xfdGFibGVfZW50cnkoZik7CisgICByZXR1cm4gX21lc2Ffc3ltYm9sX3RhYmxlX2FkZF9zeW1ib2wodGFibGUsIC0xLCBmLT5uYW1lLCBlbnRyeSkgPT0gMDsKK30KKwordm9pZCBnbHNsX3N5bWJvbF90YWJsZTo6YWRkX2dsb2JhbF9mdW5jdGlvbihpcl9mdW5jdGlvbiAqZikKK3sKKyAgIHN5bWJvbF90YWJsZV9lbnRyeSAqZW50cnkgPSBuZXcobWVtX2N0eCkgc3ltYm9sX3RhYmxlX2VudHJ5KGYpOworICAgaW50IGFkZGVkID0gX21lc2Ffc3ltYm9sX3RhYmxlX2FkZF9nbG9iYWxfc3ltYm9sKHRhYmxlLCAtMSwgZi0+bmFtZSwgZW50cnkpOworICAgYXNzZXJ0KGFkZGVkID09IDApOworICAgKHZvaWQpYWRkZWQ7Cit9CisKK2lyX3ZhcmlhYmxlICpnbHNsX3N5bWJvbF90YWJsZTo6Z2V0X3ZhcmlhYmxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gZ2V0X2VudHJ5KG5hbWUpOworICAgcmV0dXJuIGVudHJ5ICE9IE5VTEwgPyBlbnRyeS0+diA6IE5VTEw7Cit9CisKK2NvbnN0IGdsc2xfdHlwZSAqZ2xzbF9zeW1ib2xfdGFibGU6OmdldF90eXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gZ2V0X2VudHJ5KG5hbWUpOworICAgcmV0dXJuIGVudHJ5ICE9IE5VTEwgPyBlbnRyeS0+dCA6IE5VTEw7Cit9CisKK2NvbnN0IGdsc2xfdHlwZSAqZ2xzbF9zeW1ib2xfdGFibGU6OmdldF9pbnRlcmZhY2UoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpcl92YXJpYWJsZV9tb2RlIG1vZGUpCit7CisgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gZ2V0X2VudHJ5KG5hbWUpOworICAgcmV0dXJuIGVudHJ5ICE9IE5VTEwgPyBlbnRyeS0+Z2V0X2ludGVyZmFjZShtb2RlKSA6IE5VTEw7Cit9CisKK2lyX2Z1bmN0aW9uICpnbHNsX3N5bWJvbF90YWJsZTo6Z2V0X2Z1bmN0aW9uKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gZ2V0X2VudHJ5KG5hbWUpOworICAgcmV0dXJuIGVudHJ5ICE9IE5VTEwgPyBlbnRyeS0+ZiA6IE5VTEw7Cit9CisKK3N5bWJvbF90YWJsZV9lbnRyeSAqZ2xzbF9zeW1ib2xfdGFibGU6OmdldF9lbnRyeShjb25zdCBjaGFyICpuYW1lKQoreworICAgcmV0dXJuIChzeW1ib2xfdGFibGVfZW50cnkgKikKKyAgICAgIF9tZXNhX3N5bWJvbF90YWJsZV9maW5kX3N5bWJvbCh0YWJsZSwgLTEsIG5hbWUpOworfQorCit2b2lkCitnbHNsX3N5bWJvbF90YWJsZTo6ZGlzYWJsZV92YXJpYWJsZShjb25zdCBjaGFyICpuYW1lKQoreworICAgLyogSWRlYWxseSB3ZSB3b3VsZCByZW1vdmUgdGhlIHZhcmlhYmxlJ3MgZW50cnkgZnJvbSB0aGUgc3ltYm9sIHRhYmxlLCBidXQKKyAgICAqIHRoYXQgd291bGQgYmUgZGlmZmljdWx0LiAgRm9ydHVuYXRlbHksIHNpbmNlIHRoaXMgaXMgb25seSB1c2VkIGZvcgorICAgICogYnVpbHQtaW4gdmFyaWFibGVzLCBpdCB3b24ndCBiZSBwb3NzaWJsZSBmb3IgdGhlIHNoYWRlciB0byByZS1pbnRyb2R1Y2UKKyAgICAqIHRoZSB2YXJpYWJsZSBsYXRlciwgc28gYWxsIHdlIHJlYWxseSBuZWVkIHRvIGRvIGlzIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgKiBmdXJ0aGVyIGF0dGVtcHRzIHRvIGFjY2VzcyBpdCB1c2luZyBnZXRfdmFyaWFibGUoKSB3aWxsIHJldHVybiBOVUxMLgorICAgICovCisgICBzeW1ib2xfdGFibGVfZW50cnkgKmVudHJ5ID0gZ2V0X2VudHJ5KG5hbWUpOworICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgIGVudHJ5LT52ID0gTlVMTDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9zeW1ib2xfdGFibGUuaCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvZ2xzbF9zeW1ib2xfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzIzZmMzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX3N5bWJvbF90YWJsZS5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiAtKi0gYysrIC0qLSAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBHTFNMX1NZTUJPTF9UQUJMRQorI2RlZmluZSBHTFNMX1NZTUJPTF9UQUJMRQorCisjaW5jbHVkZSA8bmV3PgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJwcm9ncmFtL3N5bWJvbF90YWJsZS5oIgorfQorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCitjbGFzcyBzeW1ib2xfdGFibGVfZW50cnk7CisKKy8qKgorICogRmFjYWRlIGNsYXNzIGZvciBfbWVzYV9zeW1ib2xfdGFibGUKKyAqCisgKiBXcmFwcyB0aGUgZXhpc3RpbmcgXGMgX21lc2Ffc3ltYm9sX3RhYmxlIGRhdGEgc3RydWN0dXJlIHRvIGVuZm9yY2Ugc29tZQorICogdHlwZSBzYWZlIGFuZCBzb21lIHN5bWJvbCB0YWJsZSBpbnZhcmlhbnRzLgorICovCitzdHJ1Y3QgZ2xzbF9zeW1ib2xfdGFibGUgeworcHJpdmF0ZToKKyAgIHN0YXRpYyB2b2lkCisgICBfZ2xzbF9zeW1ib2xfdGFibGVfZGVzdHJ1Y3RvciAoZ2xzbF9zeW1ib2xfdGFibGUgKnRhYmxlKQorICAgeworICAgICAgdGFibGUtPn5nbHNsX3N5bWJvbF90YWJsZSgpOworICAgfQorCitwdWJsaWM6CisgICAvKiBDYWxsZXJzIG9mIHRoaXMgcmFsbG9jLWJhc2VkIG5ldyBuZWVkIG5vdCBjYWxsIGRlbGV0ZS4gSXQncworICAgICogZWFzaWVyIHRvIGp1c3QgcmFsbG9jX2ZyZWUgJ2N0eCcgKG9yIGFueSBvZiBpdHMgYW5jZXN0b3JzKS4gKi8KKyAgIHN0YXRpYyB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHZvaWQgKmN0eCkKKyAgIHsKKyAgICAgIHZvaWQgKnRhYmxlOworCisgICAgICB0YWJsZSA9IHJhbGxvY19zaXplKGN0eCwgc2l6ZSk7CisgICAgICBhc3NlcnQodGFibGUgIT0gTlVMTCk7CisKKyAgICAgIHJhbGxvY19zZXRfZGVzdHJ1Y3Rvcih0YWJsZSwgKHZvaWQgKCopKHZvaWQqKSkgX2dsc2xfc3ltYm9sX3RhYmxlX2Rlc3RydWN0b3IpOworCisgICAgICByZXR1cm4gdGFibGU7CisgICB9CisKKyAgIC8qIElmIHRoZSB1c2VyICpkb2VzKiBjYWxsIGRlbGV0ZSwgdGhhdCdzIE9LLCB3ZSB3aWxsIGp1c3QKKyAgICAqIHJhbGxvY19mcmVlIGluIHRoYXQgY2FzZS4gSGVyZSwgQysrIHdpbGwgaGF2ZSBhbHJlYWR5IGNhbGxlZCB0aGUKKyAgICAqIGRlc3RydWN0b3Igc28gdGVsbCByYWxsb2Mgbm90IHRvIGRvIHRoYXQgYWdhaW4uICovCisgICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqdGFibGUpCisgICB7CisgICAgICByYWxsb2Nfc2V0X2Rlc3RydWN0b3IodGFibGUsIE5VTEwpOworICAgICAgcmFsbG9jX2ZyZWUodGFibGUpOworICAgfQorICAgCisgICBnbHNsX3N5bWJvbF90YWJsZSgpOworICAgfmdsc2xfc3ltYm9sX3RhYmxlKCk7CisKKyAgIC8qIEluIDEuMTAsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGhhdmUgc2VwYXJhdGUgbmFtZXNwYWNlcy4gKi8KKyAgIGJvb2wgc2VwYXJhdGVfZnVuY3Rpb25fbmFtZXNwYWNlOworCisgICB2b2lkIHB1c2hfc2NvcGUoKTsKKyAgIHZvaWQgcG9wX3Njb3BlKCk7CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBuYW1lIHdhcyBkZWNsYXJlZCBhdCB0aGUgY3VycmVudCBzY29wZQorICAgICovCisgICBib29sIG5hbWVfZGVjbGFyZWRfdGhpc19zY29wZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgLyoqCisgICAgKiBcbmFtZSBNZXRob2RzIHRvIGFkZCBzeW1ib2xzIHRvIHRoZSB0YWJsZQorICAgICoKKyAgICAqIFRoZXJlIGlzIHNvbWUgdGVtcHRhdGlvbiB0byByZW5hbWUgYWxsIHRoZXNlIGZ1bmN0aW9ucyB0byBcYyBhZGRfc3ltYm9sCisgICAgKiBvciBzaW1pbGFyLiAgSG93ZXZlciwgdGhpcyBicmVha3Mgc3ltbWV0cnkgd2l0aCB0aGUgZ2V0dGVyIGZ1bmN0aW9ucyBhbmQKKyAgICAqIHJlZHVjZXMgdGhlIGNsYXJpdHkgb2YgdGhlIGludGVudGlvbiBvZiBjb2RlIHRoYXQgdXNlcyB0aGVzZSBtZXRob2RzLgorICAgICovCisgICAvKkB7Ki8KKyAgIGJvb2wgYWRkX3ZhcmlhYmxlKGlyX3ZhcmlhYmxlICp2KTsKKyAgIGJvb2wgYWRkX3R5cGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZ2xzbF90eXBlICp0KTsKKyAgIGJvb2wgYWRkX2Z1bmN0aW9uKGlyX2Z1bmN0aW9uICpmKTsKKyAgIGJvb2wgYWRkX2ludGVyZmFjZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBnbHNsX3R5cGUgKmksCisgICAgICAgICAgICAgICAgICAgICAgZW51bSBpcl92YXJpYWJsZV9tb2RlIG1vZGUpOworICAgLypAfSovCisKKyAgIC8qKgorICAgICogQWRkIGFuIGZ1bmN0aW9uIGF0IGdsb2JhbCBzY29wZSB3aXRob3V0IGNoZWNraW5nIGZvciBzY29waW5nIGNvbmZsaWN0cy4KKyAgICAqLworICAgdm9pZCBhZGRfZ2xvYmFsX2Z1bmN0aW9uKGlyX2Z1bmN0aW9uICpmKTsKKworICAgLyoqCisgICAgKiBcbmFtZSBNZXRob2RzIHRvIGdldCBzeW1ib2xzIGZyb20gdGhlIHRhYmxlCisgICAgKi8KKyAgIC8qQHsqLworICAgaXJfdmFyaWFibGUgKmdldF92YXJpYWJsZShjb25zdCBjaGFyICpuYW1lKTsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqZ2V0X3R5cGUoY29uc3QgY2hhciAqbmFtZSk7CisgICBpcl9mdW5jdGlvbiAqZ2V0X2Z1bmN0aW9uKGNvbnN0IGNoYXIgKm5hbWUpOworICAgY29uc3QgZ2xzbF90eXBlICpnZXRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpcl92YXJpYWJsZV9tb2RlIG1vZGUpOworICAgLypAfSovCisKKyAgIC8qKgorICAgICogRGlzYWJsZSBhIHByZXZpb3VzbHktYWRkZWQgdmFyaWFibGUgc28gdGhhdCBpdCBubyBsb25nZXIgYXBwZWFycyB0byBiZQorICAgICogaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gZ2xfUGVyVmVydGV4IGlzIHJlZGVjbGFyZWQsCisgICAgKiB0byBlbnN1cmUgdGhhdCBwcmV2aW91c2x5LWF2YWlsYWJsZSBidWlsdC1pbiB2YXJpYWJsZXMgYXJlIG5vIGxvbmdlcgorICAgICogYXZhaWxhYmxlLgorICAgICovCisgICB2b2lkIGRpc2FibGVfdmFyaWFibGUoY29uc3QgY2hhciAqbmFtZSk7CisKK3ByaXZhdGU6CisgICBzeW1ib2xfdGFibGVfZW50cnkgKmdldF9lbnRyeShjb25zdCBjaGFyICpuYW1lKTsKKworICAgc3RydWN0IF9tZXNhX3N5bWJvbF90YWJsZSAqdGFibGU7CisgICB2b2lkICptZW1fY3R4OworfTsKKworI2VuZGlmIC8qIEdMU0xfU1lNQk9MX1RBQkxFICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2dsc2xfdHlwZXMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBmMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9nbHNsX3R5cGVzLmNwcApAQCAtMCwwICsxLDEyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJsaWJmbnMuaCIgLy8gTHVuYXJHIEFERDoKKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgImdsc2xfcGFyc2VyX2V4dHJhcy5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorfQorCittdHhfdCBnbHNsX3R5cGU6Om11dGV4ID0gX01UWF9JTklUSUFMSVpFUl9OUDsKK2hhc2hfdGFibGUgKmdsc2xfdHlwZTo6YXJyYXlfdHlwZXMgPSBOVUxMOworaGFzaF90YWJsZSAqZ2xzbF90eXBlOjpyZWNvcmRfdHlwZXMgPSBOVUxMOworaGFzaF90YWJsZSAqZ2xzbF90eXBlOjppbnRlcmZhY2VfdHlwZXMgPSBOVUxMOwordm9pZCAqZ2xzbF90eXBlOjptZW1fY3R4ID0gTlVMTDsKKwordm9pZAorZ2xzbF90eXBlOjppbml0X3JhbGxvY190eXBlX2N0eCh2b2lkKQoreworICAgaWYgKGdsc2xfdHlwZTo6bWVtX2N0eCA9PSBOVUxMKSB7CisgICAgICBnbHNsX3R5cGU6Om1lbV9jdHggPSByYWxsb2NfYXV0b2ZyZWVfY29udGV4dCgpOworICAgICAgYXNzZXJ0KGdsc2xfdHlwZTo6bWVtX2N0eCAhPSBOVUxMKTsKKyAgIH0KK30KKworZ2xzbF90eXBlOjpnbHNsX3R5cGUoR0xlbnVtIGdsX3R5cGUsCisJCSAgICAgZ2xzbF9iYXNlX3R5cGUgYmFzZV90eXBlLCB1bnNpZ25lZCB2ZWN0b3JfZWxlbWVudHMsCisJCSAgICAgdW5zaWduZWQgbWF0cml4X2NvbHVtbnMsIGNvbnN0IGNoYXIgKm5hbWUpIDoKKyAgIGdsX3R5cGUoZ2xfdHlwZSksCisgICBiYXNlX3R5cGUoYmFzZV90eXBlKSwKKyAgIHNhbXBsZXJfZGltZW5zaW9uYWxpdHkoMCksIHNhbXBsZXJfc2hhZG93KDApLCBzYW1wbGVyX2FycmF5KDApLAorICAgc2FtcGxlcl90eXBlKDApLCBpbnRlcmZhY2VfcGFja2luZygwKSwKKyAgIHZlY3Rvcl9lbGVtZW50cyh2ZWN0b3JfZWxlbWVudHMpLCBtYXRyaXhfY29sdW1ucyhtYXRyaXhfY29sdW1ucyksCisgICBsZW5ndGgoMCkKK3sKKyAgIG10eF9sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKKworICAgaW5pdF9yYWxsb2NfdHlwZV9jdHgoKTsKKyAgIGFzc2VydChuYW1lICE9IE5VTEwpOworICAgdGhpcy0+bmFtZSA9IHJhbGxvY19zdHJkdXAodGhpcy0+bWVtX2N0eCwgbmFtZSk7CisKKyAgIG10eF91bmxvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICAvKiBOZWl0aGVyIGRpbWVuc2lvbiBpcyB6ZXJvIG9yIGJvdGggZGltZW5zaW9ucyBhcmUgemVyby4KKyAgICAqLworICAgYXNzZXJ0KCh2ZWN0b3JfZWxlbWVudHMgPT0gMCkgPT0gKG1hdHJpeF9jb2x1bW5zID09IDApKTsKKyAgIG1lbXNldCgmIGZpZWxkcywgMCwgc2l6ZW9mKGZpZWxkcykpOworfQorCitnbHNsX3R5cGU6Omdsc2xfdHlwZShHTGVudW0gZ2xfdHlwZSwgZ2xzbF9iYXNlX3R5cGUgYmFzZV90eXBlLAorCQkgICAgIGVudW0gZ2xzbF9zYW1wbGVyX2RpbSBkaW0sIGJvb2wgc2hhZG93LCBib29sIGFycmF5LAorCQkgICAgIHVuc2lnbmVkIHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUpIDoKKyAgIGdsX3R5cGUoZ2xfdHlwZSksCisgICBiYXNlX3R5cGUoYmFzZV90eXBlKSwKKyAgIHNhbXBsZXJfZGltZW5zaW9uYWxpdHkoZGltKSwgc2FtcGxlcl9zaGFkb3coc2hhZG93KSwKKyAgIHNhbXBsZXJfYXJyYXkoYXJyYXkpLCBzYW1wbGVyX3R5cGUodHlwZSksIGludGVyZmFjZV9wYWNraW5nKDApLAorICAgbGVuZ3RoKDApCit7CisgICBtdHhfbG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisKKyAgIGluaXRfcmFsbG9jX3R5cGVfY3R4KCk7CisgICBhc3NlcnQobmFtZSAhPSBOVUxMKTsKKyAgIHRoaXMtPm5hbWUgPSByYWxsb2Nfc3RyZHVwKHRoaXMtPm1lbV9jdHgsIG5hbWUpOworCisgICBtdHhfdW5sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKKworICAgbWVtc2V0KCYgZmllbGRzLCAwLCBzaXplb2YoZmllbGRzKSk7CisKKyAgIGlmIChiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1NBTVBMRVIpIHsKKyAgICAgIC8qIFNhbXBsZXJzIHRha2Ugbm8gc3RvcmFnZSB3aGF0c29ldmVyLiAqLworICAgICAgbWF0cml4X2NvbHVtbnMgPSB2ZWN0b3JfZWxlbWVudHMgPSAwOworICAgfSBlbHNlIHsKKyAgICAgIG1hdHJpeF9jb2x1bW5zID0gdmVjdG9yX2VsZW1lbnRzID0gMTsKKyAgIH0KK30KKworZ2xzbF90eXBlOjpnbHNsX3R5cGUoY29uc3QgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkcywgdW5zaWduZWQgbnVtX2ZpZWxkcywKKwkJICAgICBjb25zdCBjaGFyICpuYW1lKSA6CisgICBnbF90eXBlKDApLAorICAgYmFzZV90eXBlKEdMU0xfVFlQRV9TVFJVQ1QpLAorICAgc2FtcGxlcl9kaW1lbnNpb25hbGl0eSgwKSwgc2FtcGxlcl9zaGFkb3coMCksIHNhbXBsZXJfYXJyYXkoMCksCisgICBzYW1wbGVyX3R5cGUoMCksIGludGVyZmFjZV9wYWNraW5nKDApLAorICAgdmVjdG9yX2VsZW1lbnRzKDApLCBtYXRyaXhfY29sdW1ucygwKSwKKyAgIGxlbmd0aChudW1fZmllbGRzKQoreworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIG10eF9sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKKworICAgaW5pdF9yYWxsb2NfdHlwZV9jdHgoKTsKKyAgIGFzc2VydChuYW1lICE9IE5VTEwpOworICAgdGhpcy0+bmFtZSA9IHJhbGxvY19zdHJkdXAodGhpcy0+bWVtX2N0eCwgbmFtZSk7CisgICB0aGlzLT5maWVsZHMuc3RydWN0dXJlID0gcmFsbG9jX2FycmF5KHRoaXMtPm1lbV9jdHgsCisJCQkJCSBnbHNsX3N0cnVjdF9maWVsZCwgbGVuZ3RoKTsKKworICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUgPSBmaWVsZHNbaV0udHlwZTsKKyAgICAgIHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSA9IHJhbGxvY19zdHJkdXAodGhpcy0+ZmllbGRzLnN0cnVjdHVyZSwKKwkJCQkJCSAgICAgZmllbGRzW2ldLm5hbWUpOworICAgICAgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5sb2NhdGlvbiA9IGZpZWxkc1tpXS5sb2NhdGlvbjsKKyAgICAgIHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0uaW50ZXJwb2xhdGlvbiA9IGZpZWxkc1tpXS5pbnRlcnBvbGF0aW9uOworICAgICAgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5jZW50cm9pZCA9IGZpZWxkc1tpXS5jZW50cm9pZDsKKyAgICAgIHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0uc2FtcGxlID0gZmllbGRzW2ldLnNhbXBsZTsKKyAgICAgIHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ucm93X21ham9yID0gZmllbGRzW2ldLnJvd19tYWpvcjsKKyAgIH0KKworICAgbXR4X3VubG9jaygmZ2xzbF90eXBlOjptdXRleCk7Cit9CisKK2dsc2xfdHlwZTo6Z2xzbF90eXBlKGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZHMsIHVuc2lnbmVkIG51bV9maWVsZHMsCisJCSAgICAgZW51bSBnbHNsX2ludGVyZmFjZV9wYWNraW5nIHBhY2tpbmcsIGNvbnN0IGNoYXIgKm5hbWUpIDoKKyAgIGdsX3R5cGUoMCksCisgICBiYXNlX3R5cGUoR0xTTF9UWVBFX0lOVEVSRkFDRSksCisgICBzYW1wbGVyX2RpbWVuc2lvbmFsaXR5KDApLCBzYW1wbGVyX3NoYWRvdygwKSwgc2FtcGxlcl9hcnJheSgwKSwKKyAgIHNhbXBsZXJfdHlwZSgwKSwgaW50ZXJmYWNlX3BhY2tpbmcoKHVuc2lnbmVkKSBwYWNraW5nKSwKKyAgIHZlY3Rvcl9lbGVtZW50cygwKSwgbWF0cml4X2NvbHVtbnMoMCksCisgICBsZW5ndGgobnVtX2ZpZWxkcykKK3sKKyAgIHVuc2lnbmVkIGludCBpOworCisgICBtdHhfbG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisKKyAgIGluaXRfcmFsbG9jX3R5cGVfY3R4KCk7CisgICBhc3NlcnQobmFtZSAhPSBOVUxMKTsKKyAgIHRoaXMtPm5hbWUgPSByYWxsb2Nfc3RyZHVwKHRoaXMtPm1lbV9jdHgsIG5hbWUpOworICAgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZSA9IHJhbGxvY19hcnJheSh0aGlzLT5tZW1fY3R4LAorCQkJCQkgZ2xzbF9zdHJ1Y3RfZmllbGQsIGxlbmd0aCk7CisgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSA9IGZpZWxkc1tpXS50eXBlOworICAgICAgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lID0gcmFsbG9jX3N0cmR1cCh0aGlzLT5maWVsZHMuc3RydWN0dXJlLAorCQkJCQkJICAgICBmaWVsZHNbaV0ubmFtZSk7CisgICAgICB0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLmxvY2F0aW9uID0gZmllbGRzW2ldLmxvY2F0aW9uOworICAgICAgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5pbnRlcnBvbGF0aW9uID0gZmllbGRzW2ldLmludGVycG9sYXRpb247CisgICAgICB0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLmNlbnRyb2lkID0gZmllbGRzW2ldLmNlbnRyb2lkOworICAgICAgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5zYW1wbGUgPSBmaWVsZHNbaV0uc2FtcGxlOworICAgICAgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5yb3dfbWFqb3IgPSBmaWVsZHNbaV0ucm93X21ham9yOworICAgfQorCisgICBtdHhfdW5sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKK30KKworCit2b2lkCitnbHNsX3R5cGU6OnNlcmlhbGl6ZShtZW1vcnlfd3JpdGVyICZtZW0pIGNvbnN0Cit7CisgICB1aW50MzJfdCBkYXRhX2xlbiA9IDA7CisKKyAgIG1lbS53cml0ZV9zdHJpbmcobmFtZSk7CisKKyAgIHVuc2lnbmVkIHN0YXJ0X3BvcyA9IG1lbS5wb3NpdGlvbigpOworICAgbWVtLndyaXRlX3VpbnQzMl90KGRhdGFfbGVuKTsKKworICAgLyoqCisgICAgKiBVc2VkIHRvIG5vdGlmeSByZWFkZXIgaWYgYSB1c2VyIGRlZmluZWQgdHlwZQorICAgICogaGFzIGJlZW4gc2VyaWFsaXplZCBiZWZvcmUuCisgICAgKi8KKyAgIHVpbnQ4X3QgdXNlcl90eXBlX2V4aXN0cyA9IDA7CisKKyAgIC8qIFNlcmlhbGl6ZSBvbmx5IHVzZXIgZGVmaW5lZCB0eXBlcy4gKi8KKyAgIHN3aXRjaCAoYmFzZV90eXBlKSB7CisgICBjYXNlIEdMU0xfVFlQRV9BUlJBWToKKyAgIGNhc2UgR0xTTF9UWVBFX1NUUlVDVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVEVSRkFDRToKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGdvdG8gc2VyaWFsaXphdGlvbl9lcGlsb2d1ZTsKKyAgIH0KKworICAgdWludDMyX3QgdHlwZV9pZDsKKyAgIHVzZXJfdHlwZV9leGlzdHMgPSBtZW0ubWFrZV91bmlxdWVfaWQodGhpcywgJnR5cGVfaWQpOworCisgICBtZW0ud3JpdGVfdWludDhfdCh1c2VyX3R5cGVfZXhpc3RzKTsKKyAgIG1lbS53cml0ZV91aW50MzJfdCh0eXBlX2lkKTsKKworICAgLyogTm8gbmVlZCB0byB3cml0ZSBhZ2Fpbi4gKi8KKyAgIGlmICh1c2VyX3R5cGVfZXhpc3RzKQorICAgICAgZ290byBzZXJpYWxpemF0aW9uX2VwaWxvZ3VlOworCisgICBtZW0ud3JpdGVfdWludDMyX3QoKHVpbnQzMl90KWxlbmd0aCk7CisgICBtZW0ud3JpdGVfdWludDhfdCgodWludDhfdCliYXNlX3R5cGUpOworICAgbWVtLndyaXRlX3VpbnQ4X3QoKHVpbnQ4X3QpaW50ZXJmYWNlX3BhY2tpbmcpOworCisgICBpZiAoYmFzZV90eXBlID09IEdMU0xfVFlQRV9BUlJBWSkgeworICAgICAgZWxlbWVudF90eXBlKCktPnNlcmlhbGl6ZShtZW0pOworICAgfSBlbHNlIHsKKyAgICAgIGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZCA9IGZpZWxkcy5zdHJ1Y3R1cmU7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyssIGZpZWxkKyspIHsKKyAgICAgICAgIG1lbS53cml0ZShmaWVsZCwgc2l6ZW9mKGdsc2xfc3RydWN0X2ZpZWxkKSk7CisgICAgICAgICBtZW0ud3JpdGVfc3RyaW5nKGZpZWxkLT5uYW1lKTsKKyAgICAgICAgIGZpZWxkLT50eXBlLT5zZXJpYWxpemUobWVtKTsKKyAgICAgIH0KKyAgIH0KKworc2VyaWFsaXphdGlvbl9lcGlsb2d1ZToKKyAgIC8qIFVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHdyaXR0ZW4gZGF0YSBpbiAnc3RhcnRfcG9zJy4gKi8KKyAgIGRhdGFfbGVuID0gbWVtLnBvc2l0aW9uKCkgLSBzdGFydF9wb3MgLSBzaXplb2YoZGF0YV9sZW4pOworICAgbWVtLm92ZXJ3cml0ZSgmZGF0YV9sZW4sIHNpemVvZihkYXRhX2xlbiksIHN0YXJ0X3Bvcyk7Cit9CisKKworY29uc3QgZ2xzbF90eXBlICoKK2Rlc2VyaWFsaXplX2dsc2xfdHlwZShtZW1vcnlfbWFwICptYXAsIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGFzaF90YWJsZSAqdHlwZV9oYXNoKQoreworICAgY2hhciAqbmFtZSA9IG1hcC0+cmVhZF9zdHJpbmcoKTsKKyAgIC8qIFRPRE86IFVuZGVyc3RhbmQgaG93IHRoaXMgY2FuIGhhcHBlbiBhbmQgZml4ICovCisgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm4gZ2xzbF90eXBlOjplcnJvcl90eXBlOworCisgICB1aW50MzJfdCB0eXBlX3NpemUgPSBtYXAtPnJlYWRfdWludDMyX3QoKTsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqcmV0X3R5cGUgPSBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqZXhpc3RpbmdfdHlwZSA9CisgICAgICBzdGF0ZS0+c3ltYm9scy0+Z2V0X3R5cGUobmFtZSk7CisKKyAgIC8qIElmIHR5cGUgZXhpc3RzLCBtb3ZlIHJlYWQgcG9pbnRlciBmb3J3YXJkIGFuZCByZXR1cm4gdHlwZS4gKi8KKyAgIGlmIChleGlzdGluZ190eXBlKSB7CisgICAgICBtYXAtPmZmd2QodHlwZV9zaXplKTsKKyAgICAgIHJldHVybiBleGlzdGluZ190eXBlOworICAgfQorCisgICAvKiBIYXMgdGhpcyB1c2VyIHR5cGUgYmVlbiByZWFkIGFuZCBzdG9yZWQgdG8gaGFzaCBhbHJlYWR5PyAqLworICAgdWludDhfdCB1c2VyX3R5cGVfZXhpc3RzID0gbWFwLT5yZWFkX3VpbnQ4X3QoKTsKKyAgIHVpbnQzMl90IHR5cGVfaWQgPSBtYXAtPnJlYWRfdWludDMyX3QoKTsKKworICAgdWludDMyX3QgbGVuZ3RoOworICAgdWludDhfdCBiYXNlX3R5cGUsIGludGVyZmFjZV9wYWNraW5nOworCisgICBpZiAodXNlcl90eXBlX2V4aXN0cykgeworICAgICAgaGFzaF9lbnRyeSAqZW50cnkgPQorICAgICAgICAgX21lc2FfaGFzaF90YWJsZV9zZWFyY2godHlwZV9oYXNoLCBfbWVzYV9oYXNoX3N0cmluZyhuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgKHVpbnRwdHJfdCkgdHlwZV9pZCk7CisKKyAgICAgIC8qIFJldHVybiBhbHJlYWR5IHJlYWQgdHlwZSBmcm9tIHRoZSBoYXNoLiAqLworICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LT5kYXRhKQorICAgICAgICAgcmV0dXJuIChjb25zdCBnbHNsX3R5cGUgKikgZW50cnktPmRhdGE7CisgICAgICBlbHNlCisgICAgICAgICBnb3RvIHR5cGVfc2VyaWFsaXphdGlvbl9lcnJvcjsKKyAgIH0KKworICAgbGVuZ3RoID0gbWFwLT5yZWFkX3VpbnQzMl90KCk7CisgICBiYXNlX3R5cGUgPSBtYXAtPnJlYWRfdWludDhfdCgpOworICAgaW50ZXJmYWNlX3BhY2tpbmcgPSBtYXAtPnJlYWRfdWludDhfdCgpOworCisgICBpZiAoYmFzZV90eXBlID49IEdMU0xfVFlQRV9FUlJPUikKKyAgICAgIGdvdG8gdHlwZV9zZXJpYWxpemF0aW9uX2Vycm9yOworCisgICAvKiBBcnJheSB0eXBlIGhhcyBhZGRpdGlvbmFsIGVsZW1lbnRfdHlwZSBpbmZvcm1hdGlvbi4gKi8KKyAgIGlmIChiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0FSUkFZKSB7CisgICAgICBjb25zdCBnbHNsX3R5cGUgKmVsZW1lbnRfdHlwZSA9CisgICAgICAgICBkZXNlcmlhbGl6ZV9nbHNsX3R5cGUobWFwLCBzdGF0ZSwgdHlwZV9oYXNoKTsKKyAgICAgIGlmICghZWxlbWVudF90eXBlKQorICAgICAgICAgZ290byB0eXBlX3NlcmlhbGl6YXRpb25fZXJyb3I7CisKKyAgICAgIHJldF90eXBlID0gZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UoZWxlbWVudF90eXBlLCBsZW5ndGgpOworICAgICAgZ290byByZXR1cm5fdHlwZTsKKyAgIH0KKworICAgLyogU3RydWN0dXJlcyBoYXZlIGZpZWxkcyBjb250YWluaW5nIG9mIG5hbWVzIGFuZCB0eXBlcy4gKi8KKyAgIGVsc2UgaWYgKGJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfU1RSVUNUIHx8CisgICAgICBiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVEVSRkFDRSkgeworICAgICAgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkcyA9IHJhbGxvY19hcnJheShOVUxMLCBnbHNsX3N0cnVjdF9maWVsZCwgbGVuZ3RoKTsKKyAgICAgIGlmICghZmllbGRzKQorICAgICAgICAgZ290byB0eXBlX3NlcmlhbGl6YXRpb25fZXJyb3I7CisKKyAgICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykgeworICAgICAgICAgbWFwLT5yZWFkKCZmaWVsZHNba10sIHNpemVvZihnbHNsX3N0cnVjdF9maWVsZCkpOworICAgICAgICAgY2hhciAqZmllbGRfbmFtZSA9IG1hcC0+cmVhZF9zdHJpbmcoKTsKKyAgICAgICAgIGZpZWxkc1trXS5uYW1lID0gX21lc2Ffc3RyZHVwKGZpZWxkX25hbWUpOworICAgICAgICAgZmllbGRzW2tdLnR5cGUgPSBkZXNlcmlhbGl6ZV9nbHNsX3R5cGUobWFwLCBzdGF0ZSwgdHlwZV9oYXNoKTsKKyAgICAgICAgIC8qIEJyZWFrIG91dCBvZiB0aGUgbG9vcCBpZiByZWFkIGVycm9ycyBvY2N1cnJlZC4gKi8KKyAgICAgICAgIGlmIChtYXAtPmVycm9ycygpKQorICAgICAgICAgICAgZ290byB0eXBlX3NlcmlhbGl6YXRpb25fZXJyb3I7CisgICAgICB9CisKKyAgICAgIGlmIChiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1NUUlVDVCkKKyAgICAgICAgIHJldF90eXBlID0gZ2xzbF90eXBlOjpnZXRfcmVjb3JkX2luc3RhbmNlKGZpZWxkcywgbGVuZ3RoLCBuYW1lKTsKKyAgICAgIGVsc2UgaWYgKGJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5URVJGQUNFKQorICAgICAgICAgcmV0X3R5cGUgPQorICAgICAgICAgICAgZ2xzbF90eXBlOjpnZXRfaW50ZXJmYWNlX2luc3RhbmNlKGZpZWxkcywgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnbHNsX2ludGVyZmFjZV9wYWNraW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9wYWNraW5nLCBuYW1lKTsKKyAgICAgIC8qIEZyZWUgYWxsb2NhdGVkIG1lbW9yeS4gKi8KKyAgICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykKKyAgICAgICAgIGZyZWUoKHZvaWQgKilmaWVsZHNba10ubmFtZSk7CisgICAgICByYWxsb2NfZnJlZShmaWVsZHMpOworCisgICAgICBnb3RvIHJldHVybl90eXBlOworICAgfSBlbHNlIGlmIChiYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1VJTlQpIHsKKyAgICAgIC8qIFN1cHBvcnQgdWludCBhcyBhIHVzZXIgdHlwZSBpZiBpdCB3YXNuJ3QgYXZhaWxhYmxlCisgICAgICAgKiBpbiBidWlsdGluX3R5cGVfdmVyc2lvbnMuICBUaGlzIGNhbiBoYXBwZW4gZHVyaW5nCisgICAgICAgKiBJUiBsb3dlcmluZyBwYXNzZXMuCisgICAgICAgKi8KKyAgICAgIHJldF90eXBlID0gZ2xzbF90eXBlOjp1aW50X3R5cGU7CisgICAgICBnb3RvIHJldHVybl90eXBlOworICAgfQorCisgICAvKiBTaG91bGQgbm90IGZhbGwgZG93biBoZXJlISAqLwordHlwZV9zZXJpYWxpemF0aW9uX2Vycm9yOgorICAgYXNzZXJ0KCEiZXJyb3IgZGVzZXJpYWxpemluZyBnbHNsX3R5cGUiKTsKKyAgIHJldHVybiBnbHNsX3R5cGU6OmVycm9yX3R5cGU7CisKK3JldHVybl90eXBlOgorICAgLyogU3RvcmUgdXNlciB0eXBlIGluIHRvIGhhc2guICovCisgICBfbWVzYV9oYXNoX3RhYmxlX2luc2VydCh0eXBlX2hhc2gsIF9tZXNhX2hhc2hfc3RyaW5nKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSAodWludHB0cl90KSB0eXBlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSByZXRfdHlwZSk7CisgICByZXR1cm4gcmV0X3R5cGU7Cit9CisKKworCisKK2Jvb2wKK2dsc2xfdHlwZTo6Y29udGFpbnNfc2FtcGxlcigpIGNvbnN0Cit7CisgICBpZiAodGhpcy0+aXNfYXJyYXkoKSkgeworICAgICAgcmV0dXJuIHRoaXMtPmZpZWxkcy5hcnJheS0+Y29udGFpbnNfc2FtcGxlcigpOworICAgfSBlbHNlIGlmICh0aGlzLT5pc19yZWNvcmQoKSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0aGlzLT5sZW5ndGg7IGkrKykgeworCSBpZiAodGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlLT5jb250YWluc19zYW1wbGVyKCkpCisJICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0aGlzLT5pc19zYW1wbGVyKCk7CisgICB9Cit9CisKKworYm9vbAorZ2xzbF90eXBlOjpjb250YWluc19pbnRlZ2VyKCkgY29uc3QKK3sKKyAgIGlmICh0aGlzLT5pc19hcnJheSgpKSB7CisgICAgICByZXR1cm4gdGhpcy0+ZmllbGRzLmFycmF5LT5jb250YWluc19pbnRlZ2VyKCk7CisgICB9IGVsc2UgaWYgKHRoaXMtPmlzX3JlY29yZCgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHRoaXMtPmxlbmd0aDsgaSsrKSB7CisJIGlmICh0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUtPmNvbnRhaW5zX2ludGVnZXIoKSkKKwkgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXMtPmlzX2ludGVnZXIoKTsKKyAgIH0KK30KKworYm9vbAorZ2xzbF90eXBlOjpjb250YWluc19vcGFxdWUoKSBjb25zdCB7CisgICBzd2l0Y2ggKGJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKyAgIGNhc2UgR0xTTF9UWVBFX0lNQUdFOgorICAgY2FzZSBHTFNMX1RZUEVfQVRPTUlDX1VJTlQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIGNhc2UgR0xTTF9UWVBFX0FSUkFZOgorICAgICAgcmV0dXJuIGVsZW1lbnRfdHlwZSgpLT5jb250YWluc19vcGFxdWUoKTsKKyAgIGNhc2UgR0xTTF9UWVBFX1NUUlVDVDoKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgIGlmIChmaWVsZHMuc3RydWN0dXJlW2ldLnR5cGUtPmNvbnRhaW5zX29wYXF1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitnbF90ZXh0dXJlX2luZGV4CitnbHNsX3R5cGU6OnNhbXBsZXJfaW5kZXgoKSBjb25zdAoreworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCB0ID0gKHRoaXMtPmlzX2FycmF5KCkpID8gdGhpcy0+ZmllbGRzLmFycmF5IDogdGhpczsKKworICAgYXNzZXJ0KHQtPmlzX3NhbXBsZXIoKSk7CisKKyAgIHN3aXRjaCAodC0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSkgeworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzFEOgorICAgICAgcmV0dXJuICh0LT5zYW1wbGVyX2FycmF5KSA/IFRFWFRVUkVfMURfQVJSQVlfSU5ERVggOiBURVhUVVJFXzFEX0lOREVYOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzJEOgorICAgICAgcmV0dXJuICh0LT5zYW1wbGVyX2FycmF5KSA/IFRFWFRVUkVfMkRfQVJSQVlfSU5ERVggOiBURVhUVVJFXzJEX0lOREVYOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzNEOgorICAgICAgcmV0dXJuIFRFWFRVUkVfM0RfSU5ERVg7CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fQ1VCRToKKyAgICAgIHJldHVybiAodC0+c2FtcGxlcl9hcnJheSkgPyBURVhUVVJFX0NVQkVfQVJSQVlfSU5ERVggOiBURVhUVVJFX0NVQkVfSU5ERVg7CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fUkVDVDoKKyAgICAgIHJldHVybiBURVhUVVJFX1JFQ1RfSU5ERVg7CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fQlVGOgorICAgICAgcmV0dXJuIFRFWFRVUkVfQlVGRkVSX0lOREVYOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNX0VYVEVSTkFMOgorICAgICAgcmV0dXJuIFRFWFRVUkVfRVhURVJOQUxfSU5ERVg7CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fTVM6CisgICAgICByZXR1cm4gKHQtPnNhbXBsZXJfYXJyYXkpID8gVEVYVFVSRV8yRF9NVUxUSVNBTVBMRV9BUlJBWV9JTkRFWCA6IFRFWFRVUkVfMkRfTVVMVElTQU1QTEVfSU5ERVg7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKyAgICAgIHJldHVybiBURVhUVVJFX0JVRkZFUl9JTkRFWDsKKyAgIH0KK30KKworYm9vbAorZ2xzbF90eXBlOjpjb250YWluc19pbWFnZSgpIGNvbnN0Cit7CisgICBpZiAodGhpcy0+aXNfYXJyYXkoKSkgeworICAgICAgcmV0dXJuIHRoaXMtPmZpZWxkcy5hcnJheS0+Y29udGFpbnNfaW1hZ2UoKTsKKyAgIH0gZWxzZSBpZiAodGhpcy0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdGhpcy0+bGVuZ3RoOyBpKyspIHsKKwkgaWYgKHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZS0+Y29udGFpbnNfaW1hZ2UoKSkKKwkgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXMtPmlzX2ltYWdlKCk7CisgICB9Cit9CisKK2NvbnN0IGdsc2xfdHlwZSAqZ2xzbF90eXBlOjpnZXRfYmFzZV90eXBlKCkgY29uc3QKK3sKKyAgIHN3aXRjaCAoYmFzZV90eXBlKSB7CisgICBjYXNlIEdMU0xfVFlQRV9VSU5UOgorICAgICAgcmV0dXJuIHVpbnRfdHlwZTsKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgICAgIHJldHVybiBpbnRfdHlwZTsKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIGZsb2F0X3R5cGU7CisgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorICAgICAgcmV0dXJuIGJvb2xfdHlwZTsKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZXJyb3JfdHlwZTsKKyAgIH0KK30KKworCitjb25zdCBnbHNsX3R5cGUgKmdsc2xfdHlwZTo6Z2V0X3NjYWxhcl90eXBlKCkgY29uc3QKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9IHRoaXM7CisKKyAgIC8qIEhhbmRsZSBhcnJheXMgKi8KKyAgIHdoaWxlICh0eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0FSUkFZKQorICAgICAgdHlwZSA9IHR5cGUtPmZpZWxkcy5hcnJheTsKKworICAgLyogSGFuZGxlIHZlY3RvcnMgYW5kIG1hdHJpY2VzICovCisgICBzd2l0Y2ggKHR5cGUtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgICAgIHJldHVybiB1aW50X3R5cGU7CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICAgICByZXR1cm4gaW50X3R5cGU7CisgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBmbG9hdF90eXBlOworICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIHJldHVybiBib29sX3R5cGU7CisgICBkZWZhdWx0OgorICAgICAgLyogSGFuZGxlIGV2ZXJ5dGhpbmcgZWxzZSAqLworICAgICAgcmV0dXJuIHR5cGU7CisgICB9Cit9CisKKwordm9pZAorX21lc2FfZ2xzbF9yZWxlYXNlX3R5cGVzKHZvaWQpCit7CisgICBtdHhfbG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisKKyAgIGlmIChnbHNsX3R5cGU6OmFycmF5X3R5cGVzICE9IE5VTEwpIHsKKyAgICAgIGhhc2hfdGFibGVfZHRvcihnbHNsX3R5cGU6OmFycmF5X3R5cGVzKTsKKyAgICAgIGdsc2xfdHlwZTo6YXJyYXlfdHlwZXMgPSBOVUxMOworICAgfQorCisgICBpZiAoZ2xzbF90eXBlOjpyZWNvcmRfdHlwZXMgIT0gTlVMTCkgeworICAgICAgaGFzaF90YWJsZV9kdG9yKGdsc2xfdHlwZTo6cmVjb3JkX3R5cGVzKTsKKyAgICAgIGdsc2xfdHlwZTo6cmVjb3JkX3R5cGVzID0gTlVMTDsKKyAgIH0KKworICAgbXR4X3VubG9jaygmZ2xzbF90eXBlOjptdXRleCk7Cit9CisKKworZ2xzbF90eXBlOjpnbHNsX3R5cGUoY29uc3QgZ2xzbF90eXBlICphcnJheSwgdW5zaWduZWQgbGVuZ3RoKSA6CisgICBiYXNlX3R5cGUoR0xTTF9UWVBFX0FSUkFZKSwKKyAgIHNhbXBsZXJfZGltZW5zaW9uYWxpdHkoMCksIHNhbXBsZXJfc2hhZG93KDApLCBzYW1wbGVyX2FycmF5KDApLAorICAgc2FtcGxlcl90eXBlKDApLCBpbnRlcmZhY2VfcGFja2luZygwKSwKKyAgIHZlY3Rvcl9lbGVtZW50cygwKSwgbWF0cml4X2NvbHVtbnMoMCksCisgICBuYW1lKE5VTEwpLCBsZW5ndGgobGVuZ3RoKQoreworICAgdGhpcy0+ZmllbGRzLmFycmF5ID0gYXJyYXk7CisgICAvKiBJbmhlcml0IHRoZSBnbCB0eXBlIG9mIHRoZSBiYXNlLiBUaGUgR0wgdHlwZSBpcyB1c2VkIGZvcgorICAgICogdW5pZm9ybS9zdGF0ZXZhciBoYW5kbGluZyBpbiBNZXNhIGFuZCB0aGUgYXJyYXluZXNzIG9mIHRoZSB0eXBlCisgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGUgc2l6ZSByYXRoZXIgdGhhbiB0aGUgdHlwZS4KKyAgICAqLworICAgdGhpcy0+Z2xfdHlwZSA9IGFycmF5LT5nbF90eXBlOworCisgICAvKiBBbGxvdyBhIG1heGltdW0gb2YgMTAgY2hhcmFjdGVycyBmb3IgdGhlIGFycmF5IHNpemUuICBUaGlzIGlzIGVub3VnaAorICAgICogZm9yIDMyLWJpdHMgb2YgfjAuICBUaGUgZXh0cmEgMyBhcmUgZm9yIHRoZSAnWycsICddJywgYW5kIHRlcm1pbmF0aW5nCisgICAgKiBOVUwuCisgICAgKi8KKyAgIGNvbnN0IHVuc2lnbmVkIG5hbWVfbGVuZ3RoID0gc3RybGVuKGFycmF5LT5uYW1lKSArIDEwICsgMzsKKworICAgbXR4X2xvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworICAgY2hhciAqY29uc3QgbiA9IChjaGFyICopIHJhbGxvY19zaXplKHRoaXMtPm1lbV9jdHgsIG5hbWVfbGVuZ3RoKTsKKyAgIG10eF91bmxvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICBpZiAobGVuZ3RoID09IDApCisgICAgICBzbnByaW50ZihuLCBuYW1lX2xlbmd0aCwgIiVzW10iLCBhcnJheS0+bmFtZSk7CisgICBlbHNlIHsKKyAgICAgIC8qIGluc2VydCBvdXRlcm1vc3QgZGltZW5zaW9ucyBpbiB0aGUgY29ycmVjdCBzcG90CisgICAgICAgKiBvdGhlcndpc2UgdGhlIGRpbWVuc2lvbiBvcmRlciB3aWxsIGJlIGJhY2t3YXJkcworICAgICAgICovCisgICAgICBjb25zdCBjaGFyICpwb3MgPSBzdHJjaHIoYXJyYXktPm5hbWUsICdbJyk7CisgICAgICBpZiAocG9zKSB7CisgICAgICAgICBpbnQgaWR4ID0gcG9zIC0gYXJyYXktPm5hbWU7CisgICAgICAgICBzbnByaW50ZihuLCBpZHgrMSwgIiVzIiwgYXJyYXktPm5hbWUpOworICAgICAgICAgc25wcmludGYobiArIGlkeCwgbmFtZV9sZW5ndGggLSBpZHgsICJbJXVdJXMiLAorICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBhcnJheS0+bmFtZSArIGlkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgc25wcmludGYobiwgbmFtZV9sZW5ndGgsICIlc1sldV0iLCBhcnJheS0+bmFtZSwgbGVuZ3RoKTsKKyAgICAgIH0KKyAgIH0KKworICAgdGhpcy0+bmFtZSA9IG47Cit9CisKKworY29uc3QgZ2xzbF90eXBlICoKK2dsc2xfdHlwZTo6dmVjKHVuc2lnbmVkIGNvbXBvbmVudHMpCit7CisgICBpZiAoY29tcG9uZW50cyA9PSAwIHx8IGNvbXBvbmVudHMgPiA0KQorICAgICAgcmV0dXJuIGVycm9yX3R5cGU7CisKKyAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHRzW10gPSB7CisgICAgICBmbG9hdF90eXBlLCB2ZWMyX3R5cGUsIHZlYzNfdHlwZSwgdmVjNF90eXBlCisgICB9OworICAgcmV0dXJuIHRzW2NvbXBvbmVudHMgLSAxXTsKK30KKworCitjb25zdCBnbHNsX3R5cGUgKgorZ2xzbF90eXBlOjppdmVjKHVuc2lnbmVkIGNvbXBvbmVudHMpCit7CisgICBpZiAoY29tcG9uZW50cyA9PSAwIHx8IGNvbXBvbmVudHMgPiA0KQorICAgICAgcmV0dXJuIGVycm9yX3R5cGU7CisKKyAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHRzW10gPSB7CisgICAgICBpbnRfdHlwZSwgaXZlYzJfdHlwZSwgaXZlYzNfdHlwZSwgaXZlYzRfdHlwZQorICAgfTsKKyAgIHJldHVybiB0c1tjb21wb25lbnRzIC0gMV07Cit9CisKKworY29uc3QgZ2xzbF90eXBlICoKK2dsc2xfdHlwZTo6dXZlYyh1bnNpZ25lZCBjb21wb25lbnRzKQoreworICAgaWYgKGNvbXBvbmVudHMgPT0gMCB8fCBjb21wb25lbnRzID4gNCkKKyAgICAgIHJldHVybiBlcnJvcl90eXBlOworCisgICBzdGF0aWMgY29uc3QgZ2xzbF90eXBlICpjb25zdCB0c1tdID0geworICAgICAgdWludF90eXBlLCB1dmVjMl90eXBlLCB1dmVjM190eXBlLCB1dmVjNF90eXBlCisgICB9OworICAgcmV0dXJuIHRzW2NvbXBvbmVudHMgLSAxXTsKK30KKworCitjb25zdCBnbHNsX3R5cGUgKgorZ2xzbF90eXBlOjpidmVjKHVuc2lnbmVkIGNvbXBvbmVudHMpCit7CisgICBpZiAoY29tcG9uZW50cyA9PSAwIHx8IGNvbXBvbmVudHMgPiA0KQorICAgICAgcmV0dXJuIGVycm9yX3R5cGU7CisKKyAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHRzW10gPSB7CisgICAgICBib29sX3R5cGUsIGJ2ZWMyX3R5cGUsIGJ2ZWMzX3R5cGUsIGJ2ZWM0X3R5cGUKKyAgIH07CisgICByZXR1cm4gdHNbY29tcG9uZW50cyAtIDFdOworfQorCisKK2NvbnN0IGdsc2xfdHlwZSAqCitnbHNsX3R5cGU6OmdldF9pbnN0YW5jZSh1bnNpZ25lZCBiYXNlX3R5cGUsIHVuc2lnbmVkIHJvd3MsIHVuc2lnbmVkIGNvbHVtbnMpCit7CisgICBpZiAoYmFzZV90eXBlID09IEdMU0xfVFlQRV9WT0lEKQorICAgICAgcmV0dXJuIHZvaWRfdHlwZTsKKworICAgaWYgKChyb3dzIDwgMSkgfHwgKHJvd3MgPiA0KSB8fCAoY29sdW1ucyA8IDEpIHx8IChjb2x1bW5zID4gNCkpCisgICAgICByZXR1cm4gZXJyb3JfdHlwZTsKKworICAgLyogVHJlYXQgR0xTTCB2ZWN0b3JzIGFzIE54MSBtYXRyaWNlcy4KKyAgICAqLworICAgaWYgKGNvbHVtbnMgPT0gMSkgeworICAgICAgc3dpdGNoIChiYXNlX3R5cGUpIHsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJIHJldHVybiB1dmVjKHJvd3MpOworICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSByZXR1cm4gaXZlYyhyb3dzKTsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSByZXR1cm4gdmVjKHJvd3MpOworICAgICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgcmV0dXJuIGJ2ZWMocm93cyk7CisgICAgICBkZWZhdWx0OgorCSByZXR1cm4gZXJyb3JfdHlwZTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBpZiAoKGJhc2VfdHlwZSAhPSBHTFNMX1RZUEVfRkxPQVQpIHx8IChyb3dzID09IDEpKQorCSByZXR1cm4gZXJyb3JfdHlwZTsKKworICAgICAgLyogR0xTTCBtYXRyaXggdHlwZXMgYXJlIG5hbWVkIG1hdHtDT0xVTU5TfXh7Uk9XU30uICBPbmx5IHRoZSBmb2xsb3dpbmcKKyAgICAgICAqIGNvbWJpbmF0aW9ucyBhcmUgdmFsaWQ6CisgICAgICAgKgorICAgICAgICogICAxIDIgMyA0CisgICAgICAgKiAxCisgICAgICAgKiAyICAgeCB4IHgKKyAgICAgICAqIDMgICB4IHggeAorICAgICAgICogNCAgIHggeCB4CisgICAgICAgKi8KKyNkZWZpbmUgSURYKGMscikgKCgoYy0xKSozKSArIChyLTEpKQorCisgICAgICBzd2l0Y2ggKElEWChjb2x1bW5zLCByb3dzKSkgeworICAgICAgY2FzZSBJRFgoMiwyKTogcmV0dXJuIG1hdDJfdHlwZTsKKyAgICAgIGNhc2UgSURYKDIsMyk6IHJldHVybiBtYXQyeDNfdHlwZTsKKyAgICAgIGNhc2UgSURYKDIsNCk6IHJldHVybiBtYXQyeDRfdHlwZTsKKyAgICAgIGNhc2UgSURYKDMsMik6IHJldHVybiBtYXQzeDJfdHlwZTsKKyAgICAgIGNhc2UgSURYKDMsMyk6IHJldHVybiBtYXQzX3R5cGU7CisgICAgICBjYXNlIElEWCgzLDQpOiByZXR1cm4gbWF0M3g0X3R5cGU7CisgICAgICBjYXNlIElEWCg0LDIpOiByZXR1cm4gbWF0NHgyX3R5cGU7CisgICAgICBjYXNlIElEWCg0LDMpOiByZXR1cm4gbWF0NHgzX3R5cGU7CisgICAgICBjYXNlIElEWCg0LDQpOiByZXR1cm4gbWF0NF90eXBlOworICAgICAgZGVmYXVsdDogcmV0dXJuIGVycm9yX3R5cGU7CisgICAgICB9CisgICB9CisKKyAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICByZXR1cm4gZXJyb3JfdHlwZTsKK30KKworCitjb25zdCBnbHNsX3R5cGUgKgorZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UoY29uc3QgZ2xzbF90eXBlICpiYXNlLCB1bnNpZ25lZCBhcnJheV9zaXplKQoreworICAgLyogR2VuZXJhdGUgYSBuYW1lIHVzaW5nIHRoZSBiYXNlIHR5cGUgcG9pbnRlciBpbiB0aGUga2V5LiAgVGhpcyBpcworICAgICogZG9uZSBiZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHR5cGUgbWF5IG5vdCBiZSB1bmlxdWUgYWNyb3NzCisgICAgKiBzaGFkZXJzLiAgRm9yIGV4YW1wbGUsIHR3byBzaGFkZXJzIG1heSBoYXZlIGRpZmZlcmVudCByZWNvcmQgdHlwZXMKKyAgICAqIG5hbWVkICdmb28nLgorICAgICovCisgICBjaGFyIGtleVsxMjhdOworICAgc25wcmludGYoa2V5LCBzaXplb2Yoa2V5KSwgIiVwWyV1XSIsICh2b2lkICopIGJhc2UsIGFycmF5X3NpemUpOworCisgICBtdHhfbG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisKKyAgIGlmIChhcnJheV90eXBlcyA9PSBOVUxMKSB7CisgICAgICBhcnJheV90eXBlcyA9IGhhc2hfdGFibGVfY3Rvcig2NCwgaGFzaF90YWJsZV9zdHJpbmdfaGFzaCwKKwkJCQkgICAgaGFzaF90YWJsZV9zdHJpbmdfY29tcGFyZSk7CisgICB9CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdCA9IChnbHNsX3R5cGUgKikgaGFzaF90YWJsZV9maW5kKGFycmF5X3R5cGVzLCBrZXkpOworCisgICBpZiAodCA9PSBOVUxMKSB7CisgICAgICBtdHhfdW5sb2NrKCZnbHNsX3R5cGU6Om11dGV4KTsKKyAgICAgIHQgPSBuZXcgZ2xzbF90eXBlKGJhc2UsIGFycmF5X3NpemUpOworICAgICAgbXR4X2xvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICAgICBoYXNoX3RhYmxlX2luc2VydChhcnJheV90eXBlcywgKHZvaWQgKikgdCwgcmFsbG9jX3N0cmR1cChtZW1fY3R4LCBrZXkpKTsKKyAgIH0KKworICAgYXNzZXJ0KHQtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQVJSQVkpOworICAgYXNzZXJ0KHQtPmxlbmd0aCA9PSBhcnJheV9zaXplKTsKKyAgIGFzc2VydCh0LT5maWVsZHMuYXJyYXkgPT0gYmFzZSk7CisKKyAgIG10eF91bmxvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICByZXR1cm4gdDsKK30KKworCitib29sCitnbHNsX3R5cGU6OnJlY29yZF9jb21wYXJlKGNvbnN0IGdsc2xfdHlwZSAqYikgY29uc3QKK3sKKyAgIGlmICh0aGlzLT5sZW5ndGggIT0gYi0+bGVuZ3RoKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAodGhpcy0+aW50ZXJmYWNlX3BhY2tpbmcgIT0gYi0+aW50ZXJmYWNlX3BhY2tpbmcpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0aGlzLT5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSAhPSBiLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUpCisJIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChzdHJjbXAodGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lLAorCQkgYi0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lKSAhPSAwKQorCSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5yb3dfbWFqb3IKKyAgICAgICAgICE9IGItPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ucm93X21ham9yKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5sb2NhdGlvbgorICAgICAgICAgICE9IGItPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubG9jYXRpb24pCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5pbnRlcnBvbGF0aW9uCisgICAgICAgICAgIT0gYi0+ZmllbGRzLnN0cnVjdHVyZVtpXS5pbnRlcnBvbGF0aW9uKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0uY2VudHJvaWQKKyAgICAgICAgICAhPSBiLT5maWVsZHMuc3RydWN0dXJlW2ldLmNlbnRyb2lkKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0uc2FtcGxlCisgICAgICAgICAgIT0gYi0+ZmllbGRzLnN0cnVjdHVyZVtpXS5zYW1wbGUpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCisKK2ludAorZ2xzbF90eXBlOjpyZWNvcmRfa2V5X2NvbXBhcmUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3Qga2V5MSA9IChnbHNsX3R5cGUgKikgYTsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3Qga2V5MiA9IChnbHNsX3R5cGUgKikgYjsKKworICAgLyogUmV0dXJuIHplcm8gaXMgdGhlIHR5cGVzIG1hdGNoICh0aGVyZSBpcyB6ZXJvIGRpZmZlcmVuY2UpIG9yIG5vbi16ZXJvCisgICAgKiBvdGhlcndpc2UuCisgICAgKi8KKyAgIGlmIChzdHJjbXAoa2V5MS0+bmFtZSwga2V5Mi0+bmFtZSkgIT0gMCkKKyAgICAgIHJldHVybiAxOworCisgICByZXR1cm4gIWtleTEtPnJlY29yZF9jb21wYXJlKGtleTIpOworfQorCisKK3Vuc2lnbmVkCitnbHNsX3R5cGU6OnJlY29yZF9rZXlfaGFzaChjb25zdCB2b2lkICphKQoreworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCBrZXkgPSAoZ2xzbF90eXBlICopIGE7CisgICBjaGFyIGhhc2hfa2V5WzEyOF07CisgICB1bnNpZ25lZCBzaXplID0gMDsKKworICAgc2l6ZSA9IHNucHJpbnRmKGhhc2hfa2V5LCBzaXplb2YoaGFzaF9rZXkpLCAiJTA4eCIsIGtleS0+bGVuZ3RoKTsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGtleS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzaXplID49IHNpemVvZihoYXNoX2tleSkpCisJIGJyZWFrOworCisgICAgICBzaXplICs9IHNucHJpbnRmKCYgaGFzaF9rZXlbc2l6ZV0sIHNpemVvZihoYXNoX2tleSkgLSBzaXplLAorCQkgICAgICAgIiVwIiwgKHZvaWQgKikga2V5LT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUpOworICAgfQorCisgICByZXR1cm4gaGFzaF90YWJsZV9zdHJpbmdfaGFzaCgmIGhhc2hfa2V5KTsKK30KKworCitjb25zdCBnbHNsX3R5cGUgKgorZ2xzbF90eXBlOjpnZXRfcmVjb3JkX2luc3RhbmNlKGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZHMsCisJCQkgICAgICAgdW5zaWduZWQgbnVtX2ZpZWxkcywKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgY29uc3QgZ2xzbF90eXBlIGtleShmaWVsZHMsIG51bV9maWVsZHMsIG5hbWUpOworCisgICBtdHhfbG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisKKyAgIGlmIChyZWNvcmRfdHlwZXMgPT0gTlVMTCkgeworICAgICAgcmVjb3JkX3R5cGVzID0gaGFzaF90YWJsZV9jdG9yKDY0LCByZWNvcmRfa2V5X2hhc2gsIHJlY29yZF9rZXlfY29tcGFyZSk7CisgICB9CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdCA9IChnbHNsX3R5cGUgKikgaGFzaF90YWJsZV9maW5kKHJlY29yZF90eXBlcywgJiBrZXkpOworICAgaWYgKHQgPT0gTlVMTCkgeworICAgICAgbXR4X3VubG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisgICAgICB0ID0gbmV3IGdsc2xfdHlwZShmaWVsZHMsIG51bV9maWVsZHMsIG5hbWUpOworICAgICAgbXR4X2xvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICAgICBoYXNoX3RhYmxlX2luc2VydChyZWNvcmRfdHlwZXMsICh2b2lkICopIHQsIHQpOworICAgfQorCisgICBhc3NlcnQodC0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9TVFJVQ1QpOworICAgYXNzZXJ0KHQtPmxlbmd0aCA9PSBudW1fZmllbGRzKTsKKyAgIGFzc2VydChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCk7CisKKyAgIG10eF91bmxvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICByZXR1cm4gdDsKK30KKworCitjb25zdCBnbHNsX3R5cGUgKgorZ2xzbF90eXBlOjpnZXRfaW50ZXJmYWNlX2luc3RhbmNlKGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZHMsCisJCQkJICB1bnNpZ25lZCBudW1fZmllbGRzLAorCQkJCSAgZW51bSBnbHNsX2ludGVyZmFjZV9wYWNraW5nIHBhY2tpbmcsCisJCQkJICBjb25zdCBjaGFyICpibG9ja19uYW1lKQoreworICAgY29uc3QgZ2xzbF90eXBlIGtleShmaWVsZHMsIG51bV9maWVsZHMsIHBhY2tpbmcsIGJsb2NrX25hbWUpOworCisgICBtdHhfbG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisKKyAgIGlmIChpbnRlcmZhY2VfdHlwZXMgPT0gTlVMTCkgeworICAgICAgaW50ZXJmYWNlX3R5cGVzID0gaGFzaF90YWJsZV9jdG9yKDY0LCByZWNvcmRfa2V5X2hhc2gsIHJlY29yZF9rZXlfY29tcGFyZSk7CisgICB9CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdCA9IChnbHNsX3R5cGUgKikgaGFzaF90YWJsZV9maW5kKGludGVyZmFjZV90eXBlcywgJiBrZXkpOworICAgaWYgKHQgPT0gTlVMTCkgeworICAgICAgbXR4X3VubG9jaygmZ2xzbF90eXBlOjptdXRleCk7CisgICAgICB0ID0gbmV3IGdsc2xfdHlwZShmaWVsZHMsIG51bV9maWVsZHMsIHBhY2tpbmcsIGJsb2NrX25hbWUpOworICAgICAgbXR4X2xvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICAgICBoYXNoX3RhYmxlX2luc2VydChpbnRlcmZhY2VfdHlwZXMsICh2b2lkICopIHQsIHQpOworICAgfQorCisgICBhc3NlcnQodC0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlRFUkZBQ0UpOworICAgYXNzZXJ0KHQtPmxlbmd0aCA9PSBudW1fZmllbGRzKTsKKyAgIGFzc2VydChzdHJjbXAodC0+bmFtZSwgYmxvY2tfbmFtZSkgPT0gMCk7CisKKyAgIG10eF91bmxvY2soJmdsc2xfdHlwZTo6bXV0ZXgpOworCisgICByZXR1cm4gdDsKK30KKworCitjb25zdCBnbHNsX3R5cGUgKgorZ2xzbF90eXBlOjpmaWVsZF90eXBlKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0Cit7CisgICBpZiAodGhpcy0+YmFzZV90eXBlICE9IEdMU0xfVFlQRV9TVFJVQ1QKKyAgICAgICAmJiB0aGlzLT5iYXNlX3R5cGUgIT0gR0xTTF9UWVBFX0lOVEVSRkFDRSkKKyAgICAgIHJldHVybiBlcnJvcl90eXBlOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdGhpcy0+bGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAobmFtZSwgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lKSA9PSAwKQorCSByZXR1cm4gdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlOworICAgfQorCisgICByZXR1cm4gZXJyb3JfdHlwZTsKK30KKworCitpbnQKK2dsc2xfdHlwZTo6ZmllbGRfaW5kZXgoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKK3sKKyAgIGlmICh0aGlzLT5iYXNlX3R5cGUgIT0gR0xTTF9UWVBFX1NUUlVDVAorICAgICAgICYmIHRoaXMtPmJhc2VfdHlwZSAhPSBHTFNMX1RZUEVfSU5URVJGQUNFKQorICAgICAgcmV0dXJuIC0xOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdGhpcy0+bGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAobmFtZSwgdGhpcy0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lKSA9PSAwKQorCSByZXR1cm4gaTsKKyAgIH0KKworICAgcmV0dXJuIC0xOworfQorCisKK3Vuc2lnbmVkCitnbHNsX3R5cGU6OmNvbXBvbmVudF9zbG90cygpIGNvbnN0Cit7CisgICBzd2l0Y2ggKHRoaXMtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIHJldHVybiB0aGlzLT5jb21wb25lbnRzKCk7CisKKyAgIGNhc2UgR0xTTF9UWVBFX1NUUlVDVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVEVSRkFDRTogeworICAgICAgdW5zaWduZWQgc2l6ZSA9IDA7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0aGlzLT5sZW5ndGg7IGkrKykKKwkgc2l6ZSArPSB0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUtPmNvbXBvbmVudF9zbG90cygpOworCisgICAgICByZXR1cm4gc2l6ZTsKKyAgIH0KKworICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6CisgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoICogdGhpcy0+ZmllbGRzLmFycmF5LT5jb21wb25lbnRfc2xvdHMoKTsKKworICAgY2FzZSBHTFNMX1RZUEVfSU1BR0U6CisgICAgICByZXR1cm4gMTsKKworICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKyAgIGNhc2UgR0xTTF9UWVBFX0FUT01JQ19VSU5UOgorICAgY2FzZSBHTFNMX1RZUEVfVk9JRDoKKyAgIGNhc2UgR0xTTF9UWVBFX0VSUk9SOgorICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiAwOworfQorCitib29sCitnbHNsX3R5cGU6OmNhbl9pbXBsaWNpdGx5X2NvbnZlcnRfdG8oY29uc3QgZ2xzbF90eXBlICpkZXNpcmVkKSBjb25zdAoreworICAgaWYgKHRoaXMgPT0gZGVzaXJlZCkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAvKiBUaGVyZSBpcyBubyBjb252ZXJzaW9uIGFtb25nIG1hdHJpeCB0eXBlcy4gKi8KKyAgIGlmICh0aGlzLT5tYXRyaXhfY29sdW1ucyA+IDEgfHwgZGVzaXJlZC0+bWF0cml4X2NvbHVtbnMgPiAxKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBpbnQgYW5kIHVpbnQgY2FuIGJlIGNvbnZlcnRlZCB0byBmbG9hdC4gKi8KKyAgIHJldHVybiBkZXNpcmVkLT5pc19mbG9hdCgpCisgICAgICAgICAgJiYgdGhpcy0+aXNfaW50ZWdlcigpCisgICAgICAgICAgJiYgdGhpcy0+dmVjdG9yX2VsZW1lbnRzID09IGRlc2lyZWQtPnZlY3Rvcl9lbGVtZW50czsKK30KKwordW5zaWduZWQKK2dsc2xfdHlwZTo6c3RkMTQwX2Jhc2VfYWxpZ25tZW50KGJvb2wgcm93X21ham9yKSBjb25zdAoreworICAgLyogKDEpIElmIHRoZSBtZW1iZXIgaXMgYSBzY2FsYXIgY29uc3VtaW5nIDxOPiBiYXNpYyBtYWNoaW5lIHVuaXRzLCB0aGUKKyAgICAqICAgICBiYXNlIGFsaWdubWVudCBpcyA8Tj4uCisgICAgKgorICAgICogKDIpIElmIHRoZSBtZW1iZXIgaXMgYSB0d28tIG9yIGZvdXItY29tcG9uZW50IHZlY3RvciB3aXRoIGNvbXBvbmVudHMKKyAgICAqICAgICBjb25zdW1pbmcgPE4+IGJhc2ljIG1hY2hpbmUgdW5pdHMsIHRoZSBiYXNlIGFsaWdubWVudCBpcyAyPE4+IG9yCisgICAgKiAgICAgNDxOPiwgcmVzcGVjdGl2ZWx5LgorICAgICoKKyAgICAqICgzKSBJZiB0aGUgbWVtYmVyIGlzIGEgdGhyZWUtY29tcG9uZW50IHZlY3RvciB3aXRoIGNvbXBvbmVudHMgY29uc3VtaW5nCisgICAgKiAgICAgPE4+IGJhc2ljIG1hY2hpbmUgdW5pdHMsIHRoZSBiYXNlIGFsaWdubWVudCBpcyA0PE4+LgorICAgICovCisgICBpZiAodGhpcy0+aXNfc2NhbGFyKCkgfHwgdGhpcy0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIHN3aXRjaCAodGhpcy0+dmVjdG9yX2VsZW1lbnRzKSB7CisgICAgICBjYXNlIDE6CisJIHJldHVybiA0OworICAgICAgY2FzZSAyOgorCSByZXR1cm4gODsKKyAgICAgIGNhc2UgMzoKKyAgICAgIGNhc2UgNDoKKwkgcmV0dXJuIDE2OworICAgICAgfQorICAgfQorCisgICAvKiAoNCkgSWYgdGhlIG1lbWJlciBpcyBhbiBhcnJheSBvZiBzY2FsYXJzIG9yIHZlY3RvcnMsIHRoZSBiYXNlIGFsaWdubWVudAorICAgICogICAgIGFuZCBhcnJheSBzdHJpZGUgYXJlIHNldCB0byBtYXRjaCB0aGUgYmFzZSBhbGlnbm1lbnQgb2YgYSBzaW5nbGUKKyAgICAqICAgICBhcnJheSBlbGVtZW50LCBhY2NvcmRpbmcgdG8gcnVsZXMgKDEpLCAoMiksIGFuZCAoMyksIGFuZCByb3VuZGVkIHVwCisgICAgKiAgICAgdG8gdGhlIGJhc2UgYWxpZ25tZW50IG9mIGEgdmVjNC4gVGhlIGFycmF5IG1heSBoYXZlIHBhZGRpbmcgYXQgdGhlCisgICAgKiAgICAgZW5kOyB0aGUgYmFzZSBvZmZzZXQgb2YgdGhlIG1lbWJlciBmb2xsb3dpbmcgdGhlIGFycmF5IGlzIHJvdW5kZWQgdXAKKyAgICAqICAgICB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiB0aGUgYmFzZSBhbGlnbm1lbnQuCisgICAgKgorICAgICogKDYpIElmIHRoZSBtZW1iZXIgaXMgYW4gYXJyYXkgb2YgPFM+IGNvbHVtbi1tYWpvciBtYXRyaWNlcyB3aXRoIDxDPgorICAgICogICAgIGNvbHVtbnMgYW5kIDxSPiByb3dzLCB0aGUgbWF0cml4IGlzIHN0b3JlZCBpZGVudGljYWxseSB0byBhIHJvdyBvZgorICAgICogICAgIDxTPio8Qz4gY29sdW1uIHZlY3RvcnMgd2l0aCA8Uj4gY29tcG9uZW50cyBlYWNoLCBhY2NvcmRpbmcgdG8gcnVsZQorICAgICogICAgICg0KS4KKyAgICAqCisgICAgKiAoOCkgSWYgdGhlIG1lbWJlciBpcyBhbiBhcnJheSBvZiA8Uz4gcm93LW1ham9yIG1hdHJpY2VzIHdpdGggPEM+IGNvbHVtbnMKKyAgICAqICAgICBhbmQgPFI+IHJvd3MsIHRoZSBtYXRyaXggaXMgc3RvcmVkIGlkZW50aWNhbGx5IHRvIGEgcm93IG9mIDxTPio8Uj4KKyAgICAqICAgICByb3cgdmVjdG9ycyB3aXRoIDxDPiBjb21wb25lbnRzIGVhY2gsIGFjY29yZGluZyB0byBydWxlICg0KS4KKyAgICAqCisgICAgKiAoMTApIElmIHRoZSBtZW1iZXIgaXMgYW4gYXJyYXkgb2YgPFM+IHN0cnVjdHVyZXMsIHRoZSA8Uz4gZWxlbWVudHMgb2YKKyAgICAqICAgICAgdGhlIGFycmF5IGFyZSBsYWlkIG91dCBpbiBvcmRlciwgYWNjb3JkaW5nIHRvIHJ1bGUgKDkpLgorICAgICovCisgICBpZiAodGhpcy0+aXNfYXJyYXkoKSkgeworICAgICAgaWYgKHRoaXMtPmZpZWxkcy5hcnJheS0+aXNfc2NhbGFyKCkgfHwKKwkgIHRoaXMtPmZpZWxkcy5hcnJheS0+aXNfdmVjdG9yKCkgfHwKKwkgIHRoaXMtPmZpZWxkcy5hcnJheS0+aXNfbWF0cml4KCkpIHsKKwkgcmV0dXJuIE1BWDIodGhpcy0+ZmllbGRzLmFycmF5LT5zdGQxNDBfYmFzZV9hbGlnbm1lbnQocm93X21ham9yKSwgMTYpOworICAgICAgfSBlbHNlIHsKKwkgYXNzZXJ0KHRoaXMtPmZpZWxkcy5hcnJheS0+aXNfcmVjb3JkKCkpOworCSByZXR1cm4gdGhpcy0+ZmllbGRzLmFycmF5LT5zdGQxNDBfYmFzZV9hbGlnbm1lbnQocm93X21ham9yKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogKDUpIElmIHRoZSBtZW1iZXIgaXMgYSBjb2x1bW4tbWFqb3IgbWF0cml4IHdpdGggPEM+IGNvbHVtbnMgYW5kCisgICAgKiAgICAgPFI+IHJvd3MsIHRoZSBtYXRyaXggaXMgc3RvcmVkIGlkZW50aWNhbGx5IHRvIGFuIGFycmF5IG9mCisgICAgKiAgICAgPEM+IGNvbHVtbiB2ZWN0b3JzIHdpdGggPFI+IGNvbXBvbmVudHMgZWFjaCwgYWNjb3JkaW5nIHRvCisgICAgKiAgICAgcnVsZSAoNCkuCisgICAgKgorICAgICogKDcpIElmIHRoZSBtZW1iZXIgaXMgYSByb3ctbWFqb3IgbWF0cml4IHdpdGggPEM+IGNvbHVtbnMgYW5kIDxSPgorICAgICogICAgIHJvd3MsIHRoZSBtYXRyaXggaXMgc3RvcmVkIGlkZW50aWNhbGx5IHRvIGFuIGFycmF5IG9mIDxSPgorICAgICogICAgIHJvdyB2ZWN0b3JzIHdpdGggPEM+IGNvbXBvbmVudHMgZWFjaCwgYWNjb3JkaW5nIHRvIHJ1bGUgKDQpLgorICAgICovCisgICBpZiAodGhpcy0+aXNfbWF0cml4KCkpIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnZlY190eXBlLCAqYXJyYXlfdHlwZTsKKyAgICAgIGludCBjID0gdGhpcy0+bWF0cml4X2NvbHVtbnM7CisgICAgICBpbnQgciA9IHRoaXMtPnZlY3Rvcl9lbGVtZW50czsKKworICAgICAgaWYgKHJvd19tYWpvcikgeworCSB2ZWNfdHlwZSA9IGdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsIGMsIDEpOworCSBhcnJheV90eXBlID0gZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UodmVjX3R5cGUsIHIpOworICAgICAgfSBlbHNlIHsKKwkgdmVjX3R5cGUgPSBnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0ZMT0FULCByLCAxKTsKKwkgYXJyYXlfdHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2FycmF5X2luc3RhbmNlKHZlY190eXBlLCBjKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGFycmF5X3R5cGUtPnN0ZDE0MF9iYXNlX2FsaWdubWVudChmYWxzZSk7CisgICB9CisKKyAgIC8qICg5KSBJZiB0aGUgbWVtYmVyIGlzIGEgc3RydWN0dXJlLCB0aGUgYmFzZSBhbGlnbm1lbnQgb2YgdGhlCisgICAgKiAgICAgc3RydWN0dXJlIGlzIDxOPiwgd2hlcmUgPE4+IGlzIHRoZSBsYXJnZXN0IGJhc2UgYWxpZ25tZW50CisgICAgKiAgICAgdmFsdWUgb2YgYW55IG9mIGl0cyBtZW1iZXJzLCBhbmQgcm91bmRlZCB1cCB0byB0aGUgYmFzZQorICAgICogICAgIGFsaWdubWVudCBvZiBhIHZlYzQuIFRoZSBpbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhpcworICAgICogICAgIHN1Yi1zdHJ1Y3R1cmUgYXJlIHRoZW4gYXNzaWduZWQgb2Zmc2V0cyBieSBhcHBseWluZyB0aGlzIHNldAorICAgICogICAgIG9mIHJ1bGVzIHJlY3Vyc2l2ZWx5LCB3aGVyZSB0aGUgYmFzZSBvZmZzZXQgb2YgdGhlIGZpcnN0CisgICAgKiAgICAgbWVtYmVyIG9mIHRoZSBzdWItc3RydWN0dXJlIGlzIGVxdWFsIHRvIHRoZSBhbGlnbmVkIG9mZnNldAorICAgICogICAgIG9mIHRoZSBzdHJ1Y3R1cmUuIFRoZSBzdHJ1Y3R1cmUgbWF5IGhhdmUgcGFkZGluZyBhdCB0aGUgZW5kOworICAgICogICAgIHRoZSBiYXNlIG9mZnNldCBvZiB0aGUgbWVtYmVyIGZvbGxvd2luZyB0aGUgc3ViLXN0cnVjdHVyZSBpcworICAgICogICAgIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgdGhlIGJhc2UgYWxpZ25tZW50IG9mIHRoZQorICAgICogICAgIHN0cnVjdHVyZS4KKyAgICAqLworICAgaWYgKHRoaXMtPmlzX3JlY29yZCgpKSB7CisgICAgICB1bnNpZ25lZCBiYXNlX2FsaWdubWVudCA9IDE2OworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPmxlbmd0aDsgaSsrKSB7CisJIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKmZpZWxkX3R5cGUgPSB0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGU7CisJIGJhc2VfYWxpZ25tZW50ID0gTUFYMihiYXNlX2FsaWdubWVudCwKKwkJCSAgICAgICBmaWVsZF90eXBlLT5zdGQxNDBfYmFzZV9hbGlnbm1lbnQocm93X21ham9yKSk7CisgICAgICB9CisgICAgICByZXR1cm4gYmFzZV9hbGlnbm1lbnQ7CisgICB9CisKKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICByZXR1cm4gLTE7Cit9CisKK3Vuc2lnbmVkCitnbHNsX3R5cGU6OnN0ZDE0MF9zaXplKGJvb2wgcm93X21ham9yKSBjb25zdAoreworICAgLyogKDEpIElmIHRoZSBtZW1iZXIgaXMgYSBzY2FsYXIgY29uc3VtaW5nIDxOPiBiYXNpYyBtYWNoaW5lIHVuaXRzLCB0aGUKKyAgICAqICAgICBiYXNlIGFsaWdubWVudCBpcyA8Tj4uCisgICAgKgorICAgICogKDIpIElmIHRoZSBtZW1iZXIgaXMgYSB0d28tIG9yIGZvdXItY29tcG9uZW50IHZlY3RvciB3aXRoIGNvbXBvbmVudHMKKyAgICAqICAgICBjb25zdW1pbmcgPE4+IGJhc2ljIG1hY2hpbmUgdW5pdHMsIHRoZSBiYXNlIGFsaWdubWVudCBpcyAyPE4+IG9yCisgICAgKiAgICAgNDxOPiwgcmVzcGVjdGl2ZWx5LgorICAgICoKKyAgICAqICgzKSBJZiB0aGUgbWVtYmVyIGlzIGEgdGhyZWUtY29tcG9uZW50IHZlY3RvciB3aXRoIGNvbXBvbmVudHMgY29uc3VtaW5nCisgICAgKiAgICAgPE4+IGJhc2ljIG1hY2hpbmUgdW5pdHMsIHRoZSBiYXNlIGFsaWdubWVudCBpcyA0PE4+LgorICAgICovCisgICBpZiAodGhpcy0+aXNfc2NhbGFyKCkgfHwgdGhpcy0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIHJldHVybiB0aGlzLT52ZWN0b3JfZWxlbWVudHMgKiA0OworICAgfQorCisgICAvKiAoNSkgSWYgdGhlIG1lbWJlciBpcyBhIGNvbHVtbi1tYWpvciBtYXRyaXggd2l0aCA8Qz4gY29sdW1ucyBhbmQKKyAgICAqICAgICA8Uj4gcm93cywgdGhlIG1hdHJpeCBpcyBzdG9yZWQgaWRlbnRpY2FsbHkgdG8gYW4gYXJyYXkgb2YKKyAgICAqICAgICA8Qz4gY29sdW1uIHZlY3RvcnMgd2l0aCA8Uj4gY29tcG9uZW50cyBlYWNoLCBhY2NvcmRpbmcgdG8KKyAgICAqICAgICBydWxlICg0KS4KKyAgICAqCisgICAgKiAoNikgSWYgdGhlIG1lbWJlciBpcyBhbiBhcnJheSBvZiA8Uz4gY29sdW1uLW1ham9yIG1hdHJpY2VzIHdpdGggPEM+CisgICAgKiAgICAgY29sdW1ucyBhbmQgPFI+IHJvd3MsIHRoZSBtYXRyaXggaXMgc3RvcmVkIGlkZW50aWNhbGx5IHRvIGEgcm93IG9mCisgICAgKiAgICAgPFM+KjxDPiBjb2x1bW4gdmVjdG9ycyB3aXRoIDxSPiBjb21wb25lbnRzIGVhY2gsIGFjY29yZGluZyB0byBydWxlCisgICAgKiAgICAgKDQpLgorICAgICoKKyAgICAqICg3KSBJZiB0aGUgbWVtYmVyIGlzIGEgcm93LW1ham9yIG1hdHJpeCB3aXRoIDxDPiBjb2x1bW5zIGFuZCA8Uj4KKyAgICAqICAgICByb3dzLCB0aGUgbWF0cml4IGlzIHN0b3JlZCBpZGVudGljYWxseSB0byBhbiBhcnJheSBvZiA8Uj4KKyAgICAqICAgICByb3cgdmVjdG9ycyB3aXRoIDxDPiBjb21wb25lbnRzIGVhY2gsIGFjY29yZGluZyB0byBydWxlICg0KS4KKyAgICAqCisgICAgKiAoOCkgSWYgdGhlIG1lbWJlciBpcyBhbiBhcnJheSBvZiA8Uz4gcm93LW1ham9yIG1hdHJpY2VzIHdpdGggPEM+IGNvbHVtbnMKKyAgICAqICAgICBhbmQgPFI+IHJvd3MsIHRoZSBtYXRyaXggaXMgc3RvcmVkIGlkZW50aWNhbGx5IHRvIGEgcm93IG9mIDxTPio8Uj4KKyAgICAqICAgICByb3cgdmVjdG9ycyB3aXRoIDxDPiBjb21wb25lbnRzIGVhY2gsIGFjY29yZGluZyB0byBydWxlICg0KS4KKyAgICAqLworICAgaWYgKHRoaXMtPmlzX21hdHJpeCgpIHx8ICh0aGlzLT5pc19hcnJheSgpICYmCisJCQkgICAgIHRoaXMtPmZpZWxkcy5hcnJheS0+aXNfbWF0cml4KCkpKSB7CisgICAgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICplbGVtZW50X3R5cGU7CisgICAgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp2ZWNfdHlwZTsKKyAgICAgIHVuc2lnbmVkIGludCBhcnJheV9sZW47CisKKyAgICAgIGlmICh0aGlzLT5pc19hcnJheSgpKSB7CisJIGVsZW1lbnRfdHlwZSA9IHRoaXMtPmZpZWxkcy5hcnJheTsKKwkgYXJyYXlfbGVuID0gdGhpcy0+bGVuZ3RoOworICAgICAgfSBlbHNlIHsKKwkgZWxlbWVudF90eXBlID0gdGhpczsKKwkgYXJyYXlfbGVuID0gMTsKKyAgICAgIH0KKworICAgICAgaWYgKHJvd19tYWpvcikgeworCSB2ZWNfdHlwZSA9IGdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsCisJCQkJIGVsZW1lbnRfdHlwZS0+bWF0cml4X2NvbHVtbnMsIDEpOworCSBhcnJheV9sZW4gKj0gZWxlbWVudF90eXBlLT52ZWN0b3JfZWxlbWVudHM7CisgICAgICB9IGVsc2UgeworCSB2ZWNfdHlwZSA9IGdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsCisJCQkJIGVsZW1lbnRfdHlwZS0+dmVjdG9yX2VsZW1lbnRzLCAxKTsKKwkgYXJyYXlfbGVuICo9IGVsZW1lbnRfdHlwZS0+bWF0cml4X2NvbHVtbnM7CisgICAgICB9CisgICAgICBjb25zdCBnbHNsX3R5cGUgKmFycmF5X3R5cGUgPSBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZSh2ZWNfdHlwZSwKKwkJCQkJCQkJICBhcnJheV9sZW4pOworCisgICAgICByZXR1cm4gYXJyYXlfdHlwZS0+c3RkMTQwX3NpemUoZmFsc2UpOworICAgfQorCisgICAvKiAoNCkgSWYgdGhlIG1lbWJlciBpcyBhbiBhcnJheSBvZiBzY2FsYXJzIG9yIHZlY3RvcnMsIHRoZSBiYXNlIGFsaWdubWVudAorICAgICogICAgIGFuZCBhcnJheSBzdHJpZGUgYXJlIHNldCB0byBtYXRjaCB0aGUgYmFzZSBhbGlnbm1lbnQgb2YgYSBzaW5nbGUKKyAgICAqICAgICBhcnJheSBlbGVtZW50LCBhY2NvcmRpbmcgdG8gcnVsZXMgKDEpLCAoMiksIGFuZCAoMyksIGFuZCByb3VuZGVkIHVwCisgICAgKiAgICAgdG8gdGhlIGJhc2UgYWxpZ25tZW50IG9mIGEgdmVjNC4gVGhlIGFycmF5IG1heSBoYXZlIHBhZGRpbmcgYXQgdGhlCisgICAgKiAgICAgZW5kOyB0aGUgYmFzZSBvZmZzZXQgb2YgdGhlIG1lbWJlciBmb2xsb3dpbmcgdGhlIGFycmF5IGlzIHJvdW5kZWQgdXAKKyAgICAqICAgICB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiB0aGUgYmFzZSBhbGlnbm1lbnQuCisgICAgKgorICAgICogKDEwKSBJZiB0aGUgbWVtYmVyIGlzIGFuIGFycmF5IG9mIDxTPiBzdHJ1Y3R1cmVzLCB0aGUgPFM+IGVsZW1lbnRzIG9mCisgICAgKiAgICAgIHRoZSBhcnJheSBhcmUgbGFpZCBvdXQgaW4gb3JkZXIsIGFjY29yZGluZyB0byBydWxlICg5KS4KKyAgICAqLworICAgaWYgKHRoaXMtPmlzX2FycmF5KCkpIHsKKyAgICAgIGlmICh0aGlzLT5maWVsZHMuYXJyYXktPmlzX3JlY29yZCgpKSB7CisJIHJldHVybiB0aGlzLT5sZW5ndGggKiB0aGlzLT5maWVsZHMuYXJyYXktPnN0ZDE0MF9zaXplKHJvd19tYWpvcik7CisgICAgICB9IGVsc2UgeworCSB1bnNpZ25lZCBlbGVtZW50X2Jhc2VfYWxpZ24gPQorCSAgICB0aGlzLT5maWVsZHMuYXJyYXktPnN0ZDE0MF9iYXNlX2FsaWdubWVudChyb3dfbWFqb3IpOworCSByZXR1cm4gdGhpcy0+bGVuZ3RoICogTUFYMihlbGVtZW50X2Jhc2VfYWxpZ24sIDE2KTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogKDkpIElmIHRoZSBtZW1iZXIgaXMgYSBzdHJ1Y3R1cmUsIHRoZSBiYXNlIGFsaWdubWVudCBvZiB0aGUKKyAgICAqICAgICBzdHJ1Y3R1cmUgaXMgPE4+LCB3aGVyZSA8Tj4gaXMgdGhlIGxhcmdlc3QgYmFzZSBhbGlnbm1lbnQKKyAgICAqICAgICB2YWx1ZSBvZiBhbnkgb2YgaXRzIG1lbWJlcnMsIGFuZCByb3VuZGVkIHVwIHRvIHRoZSBiYXNlCisgICAgKiAgICAgYWxpZ25tZW50IG9mIGEgdmVjNC4gVGhlIGluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGlzCisgICAgKiAgICAgc3ViLXN0cnVjdHVyZSBhcmUgdGhlbiBhc3NpZ25lZCBvZmZzZXRzIGJ5IGFwcGx5aW5nIHRoaXMgc2V0CisgICAgKiAgICAgb2YgcnVsZXMgcmVjdXJzaXZlbHksIHdoZXJlIHRoZSBiYXNlIG9mZnNldCBvZiB0aGUgZmlyc3QKKyAgICAqICAgICBtZW1iZXIgb2YgdGhlIHN1Yi1zdHJ1Y3R1cmUgaXMgZXF1YWwgdG8gdGhlIGFsaWduZWQgb2Zmc2V0CisgICAgKiAgICAgb2YgdGhlIHN0cnVjdHVyZS4gVGhlIHN0cnVjdHVyZSBtYXkgaGF2ZSBwYWRkaW5nIGF0IHRoZSBlbmQ7CisgICAgKiAgICAgdGhlIGJhc2Ugb2Zmc2V0IG9mIHRoZSBtZW1iZXIgZm9sbG93aW5nIHRoZSBzdWItc3RydWN0dXJlIGlzCisgICAgKiAgICAgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiB0aGUgYmFzZSBhbGlnbm1lbnQgb2YgdGhlCisgICAgKiAgICAgc3RydWN0dXJlLgorICAgICovCisgICBpZiAodGhpcy0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIHVuc2lnbmVkIHNpemUgPSAwOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPmxlbmd0aDsgaSsrKSB7CisJIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKmZpZWxkX3R5cGUgPSB0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGU7CisJIHVuc2lnbmVkIGFsaWduID0gZmllbGRfdHlwZS0+c3RkMTQwX2Jhc2VfYWxpZ25tZW50KHJvd19tYWpvcik7CisJIHNpemUgPSBnbHNsX2FsaWduKHNpemUsIGFsaWduKTsKKwkgc2l6ZSArPSBmaWVsZF90eXBlLT5zdGQxNDBfc2l6ZShyb3dfbWFqb3IpOworICAgICAgfQorICAgICAgc2l6ZSA9IGdsc2xfYWxpZ24oc2l6ZSwKKwkJCXRoaXMtPmZpZWxkcy5zdHJ1Y3R1cmVbMF0udHlwZS0+c3RkMTQwX2Jhc2VfYWxpZ25tZW50KHJvd19tYWpvcikpOworICAgICAgcmV0dXJuIHNpemU7CisgICB9CisKKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICByZXR1cm4gLTE7Cit9CisKKwordW5zaWduZWQKK2dsc2xfdHlwZTo6Y291bnRfYXR0cmlidXRlX3Nsb3RzKCkgY29uc3QKK3sKKyAgIC8qIEZyb20gcGFnZSAzMSAocGFnZSAzNyBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjUwIHNwZWM6CisgICAgKgorICAgICogICAgICJBIHNjYWxhciBpbnB1dCBjb3VudHMgdGhlIHNhbWUgYW1vdW50IGFnYWluc3QgdGhpcyBsaW1pdCBhcyBhIHZlYzQsCisgICAgKiAgICAgc28gYXBwbGljYXRpb25zIG1heSB3YW50IHRvIGNvbnNpZGVyIHBhY2tpbmcgZ3JvdXBzIG9mIGZvdXIKKyAgICAqICAgICB1bnJlbGF0ZWQgZmxvYXQgaW5wdXRzIHRvZ2V0aGVyIGludG8gYSB2ZWN0b3IgdG8gYmV0dGVyIHV0aWxpemUgdGhlCisgICAgKiAgICAgY2FwYWJpbGl0aWVzIG9mIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlLiBBIG1hdHJpeCBpbnB1dCB3aWxsIHVzZSB1cAorICAgICogICAgIG11bHRpcGxlIGxvY2F0aW9ucy4gIFRoZSBudW1iZXIgb2YgbG9jYXRpb25zIHVzZWQgd2lsbCBlcXVhbCB0aGUKKyAgICAqICAgICBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbWF0cml4LiIKKyAgICAqCisgICAgKiBUaGUgc3BlYyBkb2VzIG5vdCBleHBsaWNpdGx5IHNheSBob3cgYXJyYXlzIGFyZSBjb3VudGVkLiAgSG93ZXZlciwgaXQKKyAgICAqIHNob3VsZCBiZSBzYWZlIHRvIGFzc3VtZSB0aGUgdG90YWwgbnVtYmVyIG9mIHNsb3RzIGNvbnN1bWVkIGJ5IGFuIGFycmF5CisgICAgKiBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGFycmF5IG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiBzbG90cworICAgICogY29uc3VtZWQgYnkgYSBzaW5nbGUgZWxlbWVudCBvZiB0aGUgYXJyYXkuCisgICAgKgorICAgICogVGhlIHNwZWMgc2F5cyBub3RoaW5nIGFib3V0IGhvdyBzdHJ1Y3RzIGFyZSBjb3VudGVkLCBiZWNhdXNlIHZlcnRleAorICAgICogYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgKG9yIGNvbnRhaW4pIHN0cnVjdHMuICBIb3dldmVyLCBNZXNhCisgICAgKiBhbGxvd3MgdmFyeWluZyBzdHJ1Y3RzLCB0aGUgbnVtYmVyIG9mIHZhcnlpbmcgc2xvdHMgdGFrZW4gdXAgYnkgYQorICAgICogdmFyeWluZyBzdHJ1Y3QgaXMgc2ltcGx5IGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlIG51bWJlciBvZiBzbG90cyB0YWtlbgorICAgICogdXAgYnkgZWFjaCBlbGVtZW50LgorICAgICovCisgICBzd2l0Y2ggKHRoaXMtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIHJldHVybiB0aGlzLT5tYXRyaXhfY29sdW1uczsKKworICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOgorICAgY2FzZSBHTFNMX1RZUEVfSU5URVJGQUNFOiB7CisgICAgICB1bnNpZ25lZCBzaXplID0gMDsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPmxlbmd0aDsgaSsrKQorICAgICAgICAgc2l6ZSArPSB0aGlzLT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUtPmNvdW50X2F0dHJpYnV0ZV9zbG90cygpOworCisgICAgICByZXR1cm4gc2l6ZTsKKyAgIH0KKworICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6CisgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoICogdGhpcy0+ZmllbGRzLmFycmF5LT5jb3VudF9hdHRyaWJ1dGVfc2xvdHMoKTsKKworICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKyAgIGNhc2UgR0xTTF9UWVBFX0lNQUdFOgorICAgY2FzZSBHTFNMX1RZUEVfQVRPTUlDX1VJTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICAgICBicmVhazsKKyAgIH0KKworICAgYXNzZXJ0KCEiVW5leHBlY3RlZCB0eXBlIGluIGNvdW50X2F0dHJpYnV0ZV9zbG90cygpIik7CisKKyAgIHJldHVybiAwOworfQorCitpbnQKK2dsc2xfdHlwZTo6Y29vcmRpbmF0ZV9jb21wb25lbnRzKCkgY29uc3QKK3sKKyAgIGludCBzaXplOworCisgICBzd2l0Y2ggKHNhbXBsZXJfZGltZW5zaW9uYWxpdHkpIHsKKyAgIGNhc2UgR0xTTF9TQU1QTEVSX0RJTV8xRDoKKyAgIGNhc2UgR0xTTF9TQU1QTEVSX0RJTV9CVUY6CisgICAgICBzaXplID0gMTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzJEOgorICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNX1JFQ1Q6CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fTVM6CisgICBjYXNlIEdMU0xfU0FNUExFUl9ESU1fRVhURVJOQUw6CisgICAgICBzaXplID0gMjsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNXzNEOgorICAgY2FzZSBHTFNMX1NBTVBMRVJfRElNX0NVQkU6CisgICAgICBzaXplID0gMzsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICBzaXplID0gMTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICAvKiBBcnJheSB0ZXh0dXJlcyBuZWVkIGFuIGFkZGl0aW9uYWwgY29tcG9uZW50IGZvciB0aGUgYXJyYXkgaW5kZXguICovCisgICBpZiAoc2FtcGxlcl9hcnJheSkKKyAgICAgIHNpemUgKz0gMTsKKworICAgcmV0dXJuIHNpemU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2hpcl9maWVsZF9zZWxlY3Rpb24uY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9oaXJfZmllbGRfc2VsZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTkyYzg5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9oaXJfZmllbGRfc2VsZWN0aW9uLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgInByb2dyYW0vc3ltYm9sX3RhYmxlLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiYXN0LmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCitpcl9ydmFsdWUgKgorX21lc2FfYXN0X2ZpZWxkX3NlbGVjdGlvbl90b19oaXIoY29uc3QgYXN0X2V4cHJlc3Npb24gKmV4cHIsCisJCQkJIGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJCSBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUpCit7CisgICB2b2lkICpjdHggPSBzdGF0ZTsKKyAgIGlyX3J2YWx1ZSAqcmVzdWx0ID0gTlVMTDsKKyAgIGlyX3J2YWx1ZSAqb3A7CisKKyAgIG9wID0gZXhwci0+c3ViZXhwcmVzc2lvbnNbMF0tPmhpcihpbnN0cnVjdGlvbnMsIHN0YXRlKTsKKworICAgLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBmaWVsZCBzZWxlY3Rpb24uICBUaGVyZSBpcyB0aGUgc2VsZWN0aW9uIG9mIGEKKyAgICAqIHNwZWNpZmljIGZpZWxkIGZyb20gYSBzdHJ1Y3R1cmUsIGFuZCB0aGVyZSBpcyB0aGUgc2VsZWN0aW9uIG9mIGEKKyAgICAqIHN3aXp6bGUgLyBtYXNrIGZyb20gYSB2ZWN0b3IuICBXaGljaCBpcyB3aGljaCBpcyBkZXRlcm1pbmVkIGVudGlyZWx5CisgICAgKiBieSB0aGUgYmFzZSB0eXBlIG9mIHRoZSB0aGluZyB0byB3aGljaCB0aGUgZmllbGQgc2VsZWN0aW9uIG9wZXJhdG9yIGlzCisgICAgKiBiZWluZyBhcHBsaWVkLgorICAgICovCisgICBZWUxUWVBFIGxvYyA9IGV4cHItPmdldF9sb2NhdGlvbigpOworICAgaWYgKG9wLT50eXBlLT5pc19lcnJvcigpKSB7CisgICAgICAvKiBzaWxlbnRseSBwcm9wYWdhdGUgdGhlIGVycm9yICovCisgICB9IGVsc2UgaWYgKG9wLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1NUUlVDVAorICAgICAgICAgICAgICB8fCBvcC0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlRFUkZBQ0UpIHsKKyAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3JlY29yZChvcCwKKwkJCQkJICAgICAgZXhwci0+cHJpbWFyeV9leHByZXNzaW9uLmlkZW50aWZpZXIpOworCisgICAgICBpZiAocmVzdWx0LT50eXBlLT5pc19lcnJvcigpKSB7CisJIF9tZXNhX2dsc2xfZXJyb3IoJiBsb2MsIHN0YXRlLCAiY2Fubm90IGFjY2VzcyBmaWVsZCBgJXMnIG9mICIKKwkJCSAgInN0cnVjdHVyZSIsCisJCQkgIGV4cHItPnByaW1hcnlfZXhwcmVzc2lvbi5pZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAoZXhwci0+c3ViZXhwcmVzc2lvbnNbMV0gIT0gTlVMTCkgeworICAgICAgLyogSGFuZGxlICJtZXRob2QgY2FsbHMiIGluIEdMU0wgMS4yMCAtIG5hbWVseSwgYXJyYXkubGVuZ3RoKCkgKi8KKyAgICAgIHN0YXRlLT5jaGVja192ZXJzaW9uKDEyMCwgMzAwLCAmbG9jLCAibWV0aG9kcyBub3Qgc3VwcG9ydGVkIik7CisKKyAgICAgIGFzdF9leHByZXNzaW9uICpjYWxsID0gZXhwci0+c3ViZXhwcmVzc2lvbnNbMV07CisgICAgICBhc3NlcnQoY2FsbC0+b3BlciA9PSBhc3RfZnVuY3Rpb25fY2FsbCk7CisKKyAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgICAgIG1ldGhvZCA9IGNhbGwtPnN1YmV4cHJlc3Npb25zWzBdLT5wcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllcjsKKworICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJsZW5ndGgiKSA9PSAwKSB7CisgICAgICAgICBpZiAoIWNhbGwtPmV4cHJlc3Npb25zLmlzX2VtcHR5KCkpCisgICAgICAgICAgICBfbWVzYV9nbHNsX2Vycm9yKCZsb2MsIHN0YXRlLCAibGVuZ3RoIG1ldGhvZCB0YWtlcyBubyBhcmd1bWVudHMiKTsKKworICAgICAgICAgaWYgKG9wLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAgICAgICBpZiAob3AtPnR5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkKKyAgICAgICAgICAgICAgIF9tZXNhX2dsc2xfZXJyb3IoJmxvYywgc3RhdGUsICJsZW5ndGggY2FsbGVkIG9uIHVuc2l6ZWQgYXJyYXkiKTsKKworICAgICAgICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfY29uc3RhbnQob3AtPnR5cGUtPmFycmF5X3NpemUoKSk7CisgICAgICAgICB9IGVsc2UgaWYgKG9wLT50eXBlLT5pc192ZWN0b3IoKSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLT5BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrX2VuYWJsZSkgeworICAgICAgICAgICAgICAgLyogLmxlbmd0aCgpIHJldHVybnMgaW50LiAqLworICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3KGN0eCkgaXJfY29uc3RhbnQoKGludCkgb3AtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImxlbmd0aCBtZXRob2Qgb24gbWF0cml4IG9ubHkgYXZhaWxhYmxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjayIpOworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIGlmIChvcC0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+QVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFja19lbmFibGUpIHsKKyAgICAgICAgICAgICAgIC8qIC5sZW5ndGgoKSByZXR1cm5zIGludC4gKi8KKyAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyhjdHgpIGlyX2NvbnN0YW50KChpbnQpIG9wLT50eXBlLT5tYXRyaXhfY29sdW1ucyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgImxlbmd0aCBtZXRob2Qgb24gbWF0cml4IG9ubHkgYXZhaWxhYmxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjayIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKwkgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwgInVua25vd24gbWV0aG9kOiBgJXMnIiwgbWV0aG9kKTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAob3AtPnR5cGUtPmlzX3ZlY3RvcigpIHx8CisgICAgICAgICAgICAgIChzdGF0ZS0+QVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFja19lbmFibGUgJiYKKyAgICAgICAgICAgICAgIG9wLT50eXBlLT5pc19zY2FsYXIoKSkpIHsKKyAgICAgIGlyX3N3aXp6bGUgKnN3aXogPSBpcl9zd2l6emxlOjpjcmVhdGUob3AsCisJCQkJCSAgICBleHByLT5wcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllciwKKwkJCQkJICAgIG9wLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworICAgICAgaWYgKHN3aXogIT0gTlVMTCkgeworCSByZXN1bHQgPSBzd2l6OworICAgICAgfSBlbHNlIHsKKwkgLyogRklOSVNITUU6IExvZ2dpbmcgb2YgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIG1vdmVkIGludG8KKwkgICogRklOSVNITUU6IGlyX3N3aXp6bGU6OmNyZWF0ZS4gIFRoaXMgYWxsb3dzIHRoZSBnZW5lcmF0aW9uIG9mIG1vcmUKKwkgICogRklOSVNITUU6IHNwZWNpZmljIGVycm9yIG1lc3NhZ2VzLgorCSAgKi8KKwkgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJpbnZhbGlkIHN3aXp6bGUgLyBtYXNrIGAlcyciLAorCQkJICBleHByLT5wcmltYXJ5X2V4cHJlc3Npb24uaWRlbnRpZmllcik7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgX21lc2FfZ2xzbF9lcnJvcigmIGxvYywgc3RhdGUsICJjYW5ub3QgYWNjZXNzIGZpZWxkIGAlcycgb2YgIgorCQkgICAgICAgIm5vbi1zdHJ1Y3R1cmUgLyBub24tdmVjdG9yIiwKKwkJICAgICAgIGV4cHItPnByaW1hcnlfZXhwcmVzc2lvbi5pZGVudGlmaWVyKTsKKyAgIH0KKworICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IGlyX3J2YWx1ZTo6ZXJyb3JfdmFsdWUoY3R4KTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXIuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzYTVjNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXIuY3BwCkBAIC0wLDAgKzEsMTg5NiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImxpYmZucy5oIgorCitpcl9ydmFsdWU6OmlyX3J2YWx1ZSgpCit7CisgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjplcnJvcl90eXBlOworfQorCitib29sIGlyX3J2YWx1ZTo6aXNfemVybygpIGNvbnN0Cit7CisgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgaXJfcnZhbHVlOjppc19vbmUoKSBjb25zdAoreworICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGlyX3J2YWx1ZTo6aXNfbmVnYXRpdmVfb25lKCkgY29uc3QKK3sKKyAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBpcl9ydmFsdWU6OmlzX2Jhc2lzKCkgY29uc3QKK3sKKyAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBNb2RpZnkgdGhlIHN3aXp6bGUgbWFrZSB0byBtb3ZlIG9uZSBjb21wb25lbnQgdG8gYW5vdGhlcgorICoKKyAqIFxwYXJhbSBtICAgIElSIHN3aXp6bGUgdG8gYmUgbW9kaWZpZWQKKyAqIFxwYXJhbSBmcm9tIENvbXBvbmVudCBpbiB0aGUgUkhTIHRoYXQgaXMgdG8gYmUgc3dpenpsZWQKKyAqIFxwYXJhbSB0byAgIERlc2lyZWQgc3dpenpsZSBsb2NhdGlvbiBvZiBcYyBmcm9tCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfcmhzX3N3aXp6bGUoaXJfc3dpenpsZV9tYXNrICZtLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKyAgIHN3aXRjaCAodG8pIHsKKyAgIGNhc2UgMDogbS54ID0gZnJvbTsgYnJlYWs7CisgICBjYXNlIDE6IG0ueSA9IGZyb207IGJyZWFrOworICAgY2FzZSAyOiBtLnogPSBmcm9tOyBicmVhazsKKyAgIGNhc2UgMzogbS53ID0gZnJvbTsgYnJlYWs7CisgICBkZWZhdWx0OiBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworICAgfQorCisgICBtLm51bV9jb21wb25lbnRzID0gTUFYMihtLm51bV9jb21wb25lbnRzLCAodG8gKyAxKSk7Cit9CisKK3ZvaWQKK2lyX2Fzc2lnbm1lbnQ6OnNldF9saHMoaXJfcnZhbHVlICpsaHMpCit7CisgICB2b2lkICptZW1fY3R4ID0gdGhpczsKKyAgIGJvb2wgc3dpenpsZWQgPSBmYWxzZTsKKworICAgd2hpbGUgKGxocyAhPSBOVUxMKSB7CisgICAgICBpcl9zd2l6emxlICpzd2l6ID0gbGhzLT5hc19zd2l6emxlKCk7CisKKyAgICAgIGlmIChzd2l6ID09IE5VTEwpCisJIGJyZWFrOworCisgICAgICB1bnNpZ25lZCB3cml0ZV9tYXNrID0gMDsKKyAgICAgIGlyX3N3aXp6bGVfbWFzayByaHNfc3dpeiA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc3dpei0+bWFzay5udW1fY29tcG9uZW50czsgaSsrKSB7CisJIHVuc2lnbmVkIGMgPSAwOworCisJIHN3aXRjaCAoaSkgeworCSBjYXNlIDA6IGMgPSBzd2l6LT5tYXNrLng7IGJyZWFrOworCSBjYXNlIDE6IGMgPSBzd2l6LT5tYXNrLnk7IGJyZWFrOworCSBjYXNlIDI6IGMgPSBzd2l6LT5tYXNrLno7IGJyZWFrOworCSBjYXNlIDM6IGMgPSBzd2l6LT5tYXNrLnc7IGJyZWFrOworCSBkZWZhdWx0OiBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworCSB9CisKKwkgd3JpdGVfbWFzayB8PSAoKCh0aGlzLT53cml0ZV9tYXNrID4+IGkpICYgMSkgPDwgYyk7CisJIHVwZGF0ZV9yaHNfc3dpenpsZShyaHNfc3dpeiwgaSwgYyk7CisgICAgICB9CisKKyAgICAgIHRoaXMtPndyaXRlX21hc2sgPSB3cml0ZV9tYXNrOworICAgICAgbGhzID0gc3dpei0+dmFsOworCisgICAgICB0aGlzLT5yaHMgPSBuZXcobWVtX2N0eCkgaXJfc3dpenpsZSh0aGlzLT5yaHMsIHJoc19zd2l6KTsKKyAgICAgIHN3aXp6bGVkID0gdHJ1ZTsKKyAgIH0KKworICAgaWYgKHN3aXp6bGVkKSB7CisgICAgICAvKiBOb3csIFJIUyBjaGFubmVscyBsaW5lIHVwIHdpdGggdGhlIExIUyB3cml0ZW1hc2suICBDb2xsYXBzZSBpdAorICAgICAgICogdG8ganVzdCB0aGUgY2hhbm5lbHMgdGhhdCB3aWxsIGJlIHdyaXR0ZW4uCisgICAgICAgKi8KKyAgICAgIGlyX3N3aXp6bGVfbWFzayByaHNfc3dpeiA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgICAgaW50IHJoc19jaGFuID0gMDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJIGlmICh3cml0ZV9tYXNrICYgKDEgPDwgaSkpCisJICAgIHVwZGF0ZV9yaHNfc3dpenpsZShyaHNfc3dpeiwgaSwgcmhzX2NoYW4rKyk7CisgICAgICB9CisgICAgICB0aGlzLT5yaHMgPSBuZXcobWVtX2N0eCkgaXJfc3dpenpsZSh0aGlzLT5yaHMsIHJoc19zd2l6KTsKKyAgIH0KKworICAgYXNzZXJ0KChsaHMgPT0gTlVMTCkgfHwgbGhzLT5hc19kZXJlZmVyZW5jZSgpKTsKKworICAgdGhpcy0+bGhzID0gKGlyX2RlcmVmZXJlbmNlICopIGxoczsKK30KKworaXJfdmFyaWFibGUgKgoraXJfYXNzaWdubWVudDo6d2hvbGVfdmFyaWFibGVfd3JpdHRlbigpCit7CisgICBpcl92YXJpYWJsZSAqdiA9IHRoaXMtPmxocy0+d2hvbGVfdmFyaWFibGVfcmVmZXJlbmNlZCgpOworCisgICBpZiAodiA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGlmICh2LT50eXBlLT5pc19zY2FsYXIoKSkKKyAgICAgIHJldHVybiB2OworCisgICBpZiAodi0+dHlwZS0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIG1hc2sgPSAoMVUgPDwgdi0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKSAtIDE7CisKKyAgICAgIGlmIChtYXNrICE9IHRoaXMtPndyaXRlX21hc2spCisJIHJldHVybiBOVUxMOworICAgfQorCisgICAvKiBFaXRoZXIgYWxsIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBhcmUgYXNzaWduZWQgb3IgdGhlIHZhcmlhYmxlIGlzIHNvbWUKKyAgICAqIGNvbXBvc2l0ZSB0eXBlIChhbmQgdGhlIHdob2xlIHRoaW5nIGlzIGFzc2lnbmVkLgorICAgICovCisgICByZXR1cm4gdjsKK30KKworaXJfYXNzaWdubWVudDo6aXJfYXNzaWdubWVudChpcl9kZXJlZmVyZW5jZSAqbGhzLCBpcl9ydmFsdWUgKnJocywKKwkJCSAgICAgaXJfcnZhbHVlICpjb25kaXRpb24sIHVuc2lnbmVkIHdyaXRlX21hc2spCit7CisgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9hc3NpZ25tZW50OworICAgdGhpcy0+Y29uZGl0aW9uID0gY29uZGl0aW9uOworICAgdGhpcy0+cmhzID0gcmhzOworICAgdGhpcy0+bGhzID0gbGhzOworICAgdGhpcy0+d3JpdGVfbWFzayA9IHdyaXRlX21hc2s7CisKKyAgIGlmIChsaHMtPnR5cGUtPmlzX3NjYWxhcigpIHx8IGxocy0+dHlwZS0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIGludCBsaHNfY29tcG9uZW50cyA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCSBpZiAod3JpdGVfbWFzayAmICgxIDw8IGkpKQorCSAgICBsaHNfY29tcG9uZW50cysrOworICAgICAgfQorCisgICAgICBhc3NlcnQobGhzX2NvbXBvbmVudHMgPT0gdGhpcy0+cmhzLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworICAgfQorfQorCitpcl9hc3NpZ25tZW50Ojppcl9hc3NpZ25tZW50KGlyX3J2YWx1ZSAqbGhzLCBpcl9ydmFsdWUgKnJocywKKwkJCSAgICAgaXJfcnZhbHVlICpjb25kaXRpb24pCit7CisgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9hc3NpZ25tZW50OworICAgdGhpcy0+Y29uZGl0aW9uID0gY29uZGl0aW9uOworICAgdGhpcy0+cmhzID0gcmhzOworCisgICAvKiBJZiB0aGUgUkhTIGlzIGEgdmVjdG9yIHR5cGUsIGFzc3VtZSB0aGF0IGFsbCBjb21wb25lbnRzIG9mIHRoZSB2ZWN0b3IKKyAgICAqIHR5cGUgYXJlIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIExIUy4gIFRoZSB3cml0ZSBtYXNrIGNvbWVzIGZyb20gdGhlIFJIUworICAgICogYmVjYXVzZSB3ZSBjYW4gaGF2ZSBhIGNhc2Ugd2hlcmUgdGhlIExIUyBpcyBhIHZlYzQgYW5kIHRoZSBSSFMgaXMgYQorICAgICogdmVjMy4gIEluIHRoYXQgY2FzZSwgdGhlIGFzc2lnbm1lbnQgaXM6CisgICAgKgorICAgICogICAgIChhc3NpZ24gKC4uLikgKHh5eikgKHZhcl9yZWYgbGhzKSAodmFyX3JlZiByaHMpKQorICAgICovCisgICBpZiAocmhzLT50eXBlLT5pc192ZWN0b3IoKSkKKyAgICAgIHRoaXMtPndyaXRlX21hc2sgPSAoMVUgPDwgcmhzLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIC0gMTsKKyAgIGVsc2UgaWYgKHJocy0+dHlwZS0+aXNfc2NhbGFyKCkpCisgICAgICB0aGlzLT53cml0ZV9tYXNrID0gMTsKKyAgIGVsc2UKKyAgICAgIHRoaXMtPndyaXRlX21hc2sgPSAwOworCisgICB0aGlzLT5zZXRfbGhzKGxocyk7Cit9CisKK2lyX2V4cHJlc3Npb246OmlyX2V4cHJlc3Npb24oaW50IG9wLCBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlLAorCQkJICAgICBpcl9ydmFsdWUgKm9wMCwgaXJfcnZhbHVlICpvcDEsCisJCQkgICAgIGlyX3J2YWx1ZSAqb3AyLCBpcl9ydmFsdWUgKm9wMykKK3sKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2V4cHJlc3Npb247CisgICB0aGlzLT50eXBlID0gdHlwZTsKKyAgIHRoaXMtPm9wZXJhdGlvbiA9IGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uKG9wKTsKKyAgIHRoaXMtPm9wZXJhbmRzWzBdID0gb3AwOworICAgdGhpcy0+b3BlcmFuZHNbMV0gPSBvcDE7CisgICB0aGlzLT5vcGVyYW5kc1syXSA9IG9wMjsKKyAgIHRoaXMtPm9wZXJhbmRzWzNdID0gb3AzOworI2lmbmRlZiBOREVCVUcKKyAgIGludCBudW1fb3BlcmFuZHMgPSBnZXRfbnVtX29wZXJhbmRzKHRoaXMtPm9wZXJhdGlvbik7CisgICBmb3IgKGludCBpID0gbnVtX29wZXJhbmRzOyBpIDwgNDsgaSsrKSB7CisgICAgICBhc3NlcnQodGhpcy0+b3BlcmFuZHNbaV0gPT0gTlVMTCk7CisgICB9CisjZW5kaWYKK30KKworaXJfZXhwcmVzc2lvbjo6aXJfZXhwcmVzc2lvbihpbnQgb3AsIGlyX3J2YWx1ZSAqb3AwKQoreworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfZXhwcmVzc2lvbjsKKworICAgdGhpcy0+b3BlcmF0aW9uID0gaXJfZXhwcmVzc2lvbl9vcGVyYXRpb24ob3ApOworICAgdGhpcy0+b3BlcmFuZHNbMF0gPSBvcDA7CisgICB0aGlzLT5vcGVyYW5kc1sxXSA9IE5VTEw7CisgICB0aGlzLT5vcGVyYW5kc1syXSA9IE5VTEw7CisgICB0aGlzLT5vcGVyYW5kc1szXSA9IE5VTEw7CisKKyAgIGFzc2VydChvcCA8PSBpcl9sYXN0X3Vub3ApOworCisgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikgeworICAgY2FzZSBpcl91bm9wX2JpdF9ub3Q6CisgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OgorICAgY2FzZSBpcl91bm9wX25lZzoKKyAgIGNhc2UgaXJfdW5vcF9hYnM6CisgICBjYXNlIGlyX3Vub3Bfc2lnbjoKKyAgIGNhc2UgaXJfdW5vcF9yY3A6CisgICBjYXNlIGlyX3Vub3BfcnNxOgorICAgY2FzZSBpcl91bm9wX3NxcnQ6CisgICBjYXNlIGlyX3Vub3BfZXhwOgorICAgY2FzZSBpcl91bm9wX2xvZzoKKyAgIGNhc2UgaXJfdW5vcF9leHAyOgorICAgY2FzZSBpcl91bm9wX2xvZzI6CisgICBjYXNlIGlyX3Vub3BfdHJ1bmM6CisgICBjYXNlIGlyX3Vub3BfY2VpbDoKKyAgIGNhc2UgaXJfdW5vcF9mbG9vcjoKKyAgIGNhc2UgaXJfdW5vcF9mcmFjdDoKKyAgIGNhc2UgaXJfdW5vcF9yb3VuZF9ldmVuOgorICAgY2FzZSBpcl91bm9wX3NpbjoKKyAgIGNhc2UgaXJfdW5vcF9jb3M6CisgICBjYXNlIGlyX3Vub3Bfc2luX3JlZHVjZWQ6CisgICBjYXNlIGlyX3Vub3BfY29zX3JlZHVjZWQ6CisgICBjYXNlIGlyX3Vub3BfZEZkeDoKKyAgIGNhc2UgaXJfdW5vcF9kRmR5OgorICAgY2FzZSBpcl91bm9wX2JpdGZpZWxkX3JldmVyc2U6CisgICAgICB0aGlzLT50eXBlID0gb3AwLT50eXBlOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9mMmk6CisgICBjYXNlIGlyX3Vub3BfYjJpOgorICAgY2FzZSBpcl91bm9wX3UyaToKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2YyaToKKyAgIGNhc2UgaXJfdW5vcF9iaXRfY291bnQ6CisgICBjYXNlIGlyX3Vub3BfZmluZF9tc2I6CisgICBjYXNlIGlyX3Vub3BfZmluZF9sc2I6CisgICAgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0lOVCwKKwkJCQkJICAgb3AwLT50eXBlLT52ZWN0b3JfZWxlbWVudHMsIDEpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9iMmY6CisgICBjYXNlIGlyX3Vub3BfaTJmOgorICAgY2FzZSBpcl91bm9wX3UyZjoKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2kyZjoKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X3UyZjoKKyAgICAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsCisJCQkJCSAgIG9wMC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzLCAxKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfZjJiOgorICAgY2FzZSBpcl91bm9wX2kyYjoKKyAgICAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfQk9PTCwKKwkJCQkJICAgb3AwLT50eXBlLT52ZWN0b3JfZWxlbWVudHMsIDEpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9pMnU6CisgICBjYXNlIGlyX3Vub3BfZjJ1OgorICAgY2FzZSBpcl91bm9wX2JpdGNhc3RfZjJ1OgorICAgICAgdGhpcy0+dHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9VSU5ULAorCQkJCQkgICBvcDAtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cywgMSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX25vaXNlOgorICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTZfc3BsaXRfeDoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3k6CisgICAgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjpmbG9hdF90eXBlOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9hbnk6CisgICAgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjpib29sX3R5cGU7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Nub3JtXzR4ODoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Vub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfcGFja191bm9ybV80eDg6CisgICBjYXNlIGlyX3Vub3BfcGFja19oYWxmXzJ4MTY6CisgICAgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjp1aW50X3R5cGU7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3VucGFja19zbm9ybV8yeDE2OgorICAgY2FzZSBpcl91bm9wX3VucGFja191bm9ybV8yeDE2OgorICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTY6CisgICAgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjp2ZWMyX3R5cGU7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3VucGFja19zbm9ybV80eDg6CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Vub3JtXzR4ODoKKyAgICAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OnZlYzRfdHlwZTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IG1pc3NpbmcgYXV0b21hdGljIHR5cGUgc2V0dXAgZm9yIGlyX2V4cHJlc3Npb24iKTsKKyAgICAgIHRoaXMtPnR5cGUgPSBvcDAtPnR5cGU7CisgICAgICBicmVhazsKKyAgIH0KK30KKworaXJfZXhwcmVzc2lvbjo6aXJfZXhwcmVzc2lvbihpbnQgb3AsIGlyX3J2YWx1ZSAqb3AwLCBpcl9ydmFsdWUgKm9wMSkKK3sKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2V4cHJlc3Npb247CisKKyAgIHRoaXMtPm9wZXJhdGlvbiA9IGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uKG9wKTsKKyAgIHRoaXMtPm9wZXJhbmRzWzBdID0gb3AwOworICAgdGhpcy0+b3BlcmFuZHNbMV0gPSBvcDE7CisgICB0aGlzLT5vcGVyYW5kc1syXSA9IE5VTEw7CisgICB0aGlzLT5vcGVyYW5kc1szXSA9IE5VTEw7CisKKyAgIGFzc2VydChvcCA+IGlyX2xhc3RfdW5vcCk7CisKKyAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uKSB7CisgICBjYXNlIGlyX2Jpbm9wX2FsbF9lcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfYW55X25lcXVhbDoKKyAgICAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OmJvb2xfdHlwZTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2FkZDoKKyAgIGNhc2UgaXJfYmlub3Bfc3ViOgorICAgY2FzZSBpcl9iaW5vcF9taW46CisgICBjYXNlIGlyX2Jpbm9wX21heDoKKyAgIGNhc2UgaXJfYmlub3BfcG93OgorICAgY2FzZSBpcl9iaW5vcF9tdWw6CisgICBjYXNlIGlyX2Jpbm9wX2RpdjoKKyAgIGNhc2UgaXJfYmlub3BfbW9kOgorICAgICAgaWYgKG9wMC0+dHlwZS0+aXNfc2NhbGFyKCkpIHsKKwkgdGhpcy0+dHlwZSA9IG9wMS0+dHlwZTsKKyAgICAgIH0gZWxzZSBpZiAob3AxLT50eXBlLT5pc19zY2FsYXIoKSkgeworCSB0aGlzLT50eXBlID0gb3AwLT50eXBlOworICAgICAgfSBlbHNlIHsKKwkgLyogRklOSVNITUU6IG1hdHJpeCB0eXBlcyAqLworCSBhc3NlcnQoIW9wMC0+dHlwZS0+aXNfbWF0cml4KCkgJiYgIW9wMS0+dHlwZS0+aXNfbWF0cml4KCkpOworCSBhc3NlcnQob3AwLT50eXBlID09IG9wMS0+dHlwZSk7CisJIHRoaXMtPnR5cGUgPSBvcDAtPnR5cGU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sb2dpY19hbmQ6CisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX3hvcjoKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfb3I6CisgICBjYXNlIGlyX2Jpbm9wX2JpdF9hbmQ6CisgICBjYXNlIGlyX2Jpbm9wX2JpdF94b3I6CisgICBjYXNlIGlyX2Jpbm9wX2JpdF9vcjoKKyAgICAgICBhc3NlcnQoIW9wMC0+dHlwZS0+aXNfbWF0cml4KCkpOworICAgICAgIGFzc2VydCghb3AxLT50eXBlLT5pc19tYXRyaXgoKSk7CisgICAgICBpZiAob3AwLT50eXBlLT5pc19zY2FsYXIoKSkgeworICAgICAgICAgdGhpcy0+dHlwZSA9IG9wMS0+dHlwZTsKKyAgICAgIH0gZWxzZSBpZiAob3AxLT50eXBlLT5pc19zY2FsYXIoKSkgeworICAgICAgICAgdGhpcy0+dHlwZSA9IG9wMC0+dHlwZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KG9wMC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzID09IG9wMS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgICAgICB0aGlzLT50eXBlID0gb3AwLT50eXBlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX25lcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfbGVxdWFsOgorICAgY2FzZSBpcl9iaW5vcF9nZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2xlc3M6CisgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICAgICBhc3NlcnQob3AwLT50eXBlID09IG9wMS0+dHlwZSk7CisgICAgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0JPT0wsCisJCQkJCSAgIG9wMC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzLCAxKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2RvdDoKKyAgICAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OmZsb2F0X3R5cGU7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9wYWNrX2hhbGZfMngxNl9zcGxpdDoKKyAgICAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OnVpbnRfdHlwZTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2ltdWxfaGlnaDoKKyAgIGNhc2UgaXJfYmlub3BfY2Fycnk6CisgICBjYXNlIGlyX2Jpbm9wX2JvcnJvdzoKKyAgIGNhc2UgaXJfYmlub3BfbHNoaWZ0OgorICAgY2FzZSBpcl9iaW5vcF9yc2hpZnQ6CisgICBjYXNlIGlyX2Jpbm9wX2JmbToKKyAgIGNhc2UgaXJfYmlub3BfbGRleHA6CisgICAgICB0aGlzLT50eXBlID0gb3AwLT50eXBlOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfdmVjdG9yX2V4dHJhY3Q6CisgICAgICB0aGlzLT50eXBlID0gb3AwLT50eXBlLT5nZXRfc2NhbGFyX3R5cGUoKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEibm90IHJlYWNoZWQ6IG1pc3NpbmcgYXV0b21hdGljIHR5cGUgc2V0dXAgZm9yIGlyX2V4cHJlc3Npb24iKTsKKyAgICAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OmZsb2F0X3R5cGU7CisgICB9Cit9CisKK2lyX2V4cHJlc3Npb246OmlyX2V4cHJlc3Npb24oaW50IG9wLCBpcl9ydmFsdWUgKm9wMCwgaXJfcnZhbHVlICpvcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqb3AyKQoreworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfZXhwcmVzc2lvbjsKKworICAgdGhpcy0+b3BlcmF0aW9uID0gaXJfZXhwcmVzc2lvbl9vcGVyYXRpb24ob3ApOworICAgdGhpcy0+b3BlcmFuZHNbMF0gPSBvcDA7CisgICB0aGlzLT5vcGVyYW5kc1sxXSA9IG9wMTsKKyAgIHRoaXMtPm9wZXJhbmRzWzJdID0gb3AyOworICAgdGhpcy0+b3BlcmFuZHNbM10gPSBOVUxMOworCisgICBhc3NlcnQob3AgPiBpcl9sYXN0X2Jpbm9wICYmIG9wIDw9IGlyX2xhc3RfdHJpb3ApOworCisgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikgeworICAgY2FzZSBpcl90cmlvcF9mbWE6CisgICBjYXNlIGlyX3RyaW9wX2xycDoKKyAgIGNhc2UgaXJfdHJpb3BfYml0ZmllbGRfZXh0cmFjdDoKKyAgIGNhc2UgaXJfdHJpb3BfdmVjdG9yX2luc2VydDoKKyAgICAgIHRoaXMtPnR5cGUgPSBvcDAtPnR5cGU7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF9iZmk6CisgICBjYXNlIGlyX3RyaW9wX2NzZWw6CisgICAgICB0aGlzLT50eXBlID0gb3AxLT50eXBlOworICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJub3QgcmVhY2hlZDogbWlzc2luZyBhdXRvbWF0aWMgdHlwZSBzZXR1cCBmb3IgaXJfZXhwcmVzc2lvbiIpOworICAgICAgdGhpcy0+dHlwZSA9IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZTsKKyAgIH0KK30KKwordW5zaWduZWQgaW50Citpcl9leHByZXNzaW9uOjpnZXRfbnVtX29wZXJhbmRzKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wKQoreworICAgYXNzZXJ0KG9wIDw9IGlyX2xhc3Rfb3Bjb2RlKTsKKworICAgaWYgKG9wIDw9IGlyX2xhc3RfdW5vcCkKKyAgICAgIHJldHVybiAxOworCisgICBpZiAob3AgPD0gaXJfbGFzdF9iaW5vcCkKKyAgICAgIHJldHVybiAyOworCisgICBpZiAob3AgPD0gaXJfbGFzdF90cmlvcCkKKyAgICAgIHJldHVybiAzOworCisgICBpZiAob3AgPD0gaXJfbGFzdF9xdWFkb3ApCisgICAgICByZXR1cm4gNDsKKworICAgYXNzZXJ0KGZhbHNlKTsKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgb3BlcmF0b3Jfc3Ryc1tdID0geworICAgIn4iLAorICAgIiEiLAorICAgIm5lZyIsCisgICAiYWJzIiwKKyAgICJzaWduIiwKKyAgICJyY3AiLAorICAgInJzcSIsCisgICAic3FydCIsCisgICAiZXhwIiwKKyAgICJsb2ciLAorICAgImV4cDIiLAorICAgImxvZzIiLAorICAgImYyaSIsCisgICAiZjJ1IiwKKyAgICJpMmYiLAorICAgImYyYiIsCisgICAiYjJmIiwKKyAgICJpMmIiLAorICAgImIyaSIsCisgICAidTJmIiwKKyAgICJpMnUiLAorICAgInUyaSIsCisgICAiYml0Y2FzdF9pMmYiLAorICAgImJpdGNhc3RfZjJpIiwKKyAgICJiaXRjYXN0X3UyZiIsCisgICAiYml0Y2FzdF9mMnUiLAorICAgImFueSIsCisgICAidHJ1bmMiLAorICAgImNlaWwiLAorICAgImZsb29yIiwKKyAgICJmcmFjdCIsCisgICAicm91bmRfZXZlbiIsCisgICAic2luIiwKKyAgICJjb3MiLAorICAgInNpbl9yZWR1Y2VkIiwKKyAgICJjb3NfcmVkdWNlZCIsCisgICAiZEZkeCIsCisgICAiZEZkeSIsCisgICAicGFja1Nub3JtMngxNiIsCisgICAicGFja1Nub3JtNHg4IiwKKyAgICJwYWNrVW5vcm0yeDE2IiwKKyAgICJwYWNrVW5vcm00eDgiLAorICAgInBhY2tIYWxmMngxNiIsCisgICAidW5wYWNrU25vcm0yeDE2IiwKKyAgICJ1bnBhY2tTbm9ybTR4OCIsCisgICAidW5wYWNrVW5vcm0yeDE2IiwKKyAgICJ1bnBhY2tVbm9ybTR4OCIsCisgICAidW5wYWNrSGFsZjJ4MTYiLAorICAgInVucGFja0hhbGYyeDE2X3NwbGl0X3giLAorICAgInVucGFja0hhbGYyeDE2X3NwbGl0X3kiLAorICAgImJpdGZpZWxkX3JldmVyc2UiLAorICAgImJpdF9jb3VudCIsCisgICAiZmluZF9tc2IiLAorICAgImZpbmRfbHNiIiwKKyAgICJub2lzZSIsCisgICAiKyIsCisgICAiLSIsCisgICAiKiIsCisgICAiaW11bF9oaWdoIiwKKyAgICIvIiwKKyAgICJjYXJyeSIsCisgICAiYm9ycm93IiwKKyAgICIlIiwKKyAgICI8IiwKKyAgICI+IiwKKyAgICI8PSIsCisgICAiPj0iLAorICAgIj09IiwKKyAgICIhPSIsCisgICAiYWxsX2VxdWFsIiwKKyAgICJhbnlfbmVxdWFsIiwKKyAgICI8PCIsCisgICAiPj4iLAorICAgIiYiLAorICAgIl4iLAorICAgInwiLAorICAgIiYmIiwKKyAgICJeXiIsCisgICAifHwiLAorICAgImRvdCIsCisgICAibWluIiwKKyAgICJtYXgiLAorICAgInBvdyIsCisgICAicGFja0hhbGYyeDE2X3NwbGl0IiwKKyAgICJiZm0iLAorICAgInVib19sb2FkIiwKKyAgICJsZGV4cCIsCisgICAidmVjdG9yX2V4dHJhY3QiLAorICAgImZtYSIsCisgICAibHJwIiwKKyAgICJjc2VsIiwKKyAgICJiZmkiLAorICAgImJpdGZpZWxkX2V4dHJhY3QiLAorICAgInZlY3Rvcl9pbnNlcnQiLAorICAgImJpdGZpZWxkX2luc2VydCIsCisgICAidmVjdG9yIiwKK307CisKK2NvbnN0IGNoYXIgKmlyX2V4cHJlc3Npb246Om9wZXJhdG9yX3N0cmluZyhpcl9leHByZXNzaW9uX29wZXJhdGlvbiBvcCkKK3sKKyAgIGFzc2VydCgodW5zaWduZWQgaW50KSBvcCA8IEVsZW1lbnRzKG9wZXJhdG9yX3N0cnMpKTsKKyAgIGFzc2VydChFbGVtZW50cyhvcGVyYXRvcl9zdHJzKSA9PSAoaXJfcXVhZG9wX3ZlY3RvciArIDEpKTsKKyAgIHJldHVybiBvcGVyYXRvcl9zdHJzW29wXTsKK30KKworY29uc3QgY2hhciAqaXJfZXhwcmVzc2lvbjo6b3BlcmF0b3Jfc3RyaW5nKCkKK3sKKyAgIHJldHVybiBvcGVyYXRvcl9zdHJpbmcodGhpcy0+b3BlcmF0aW9uKTsKK30KKworY29uc3QgY2hhcioKK2RlcHRoX2xheW91dF9zdHJpbmcoaXJfZGVwdGhfbGF5b3V0IGxheW91dCkKK3sKKyAgIHN3aXRjaChsYXlvdXQpIHsKKyAgIGNhc2UgaXJfZGVwdGhfbGF5b3V0X25vbmU6ICAgICAgcmV0dXJuICIiOworICAgY2FzZSBpcl9kZXB0aF9sYXlvdXRfYW55OiAgICAgICByZXR1cm4gImRlcHRoX2FueSI7CisgICBjYXNlIGlyX2RlcHRoX2xheW91dF9ncmVhdGVyOiAgIHJldHVybiAiZGVwdGhfZ3JlYXRlciI7CisgICBjYXNlIGlyX2RlcHRoX2xheW91dF9sZXNzOiAgICAgIHJldHVybiAiZGVwdGhfbGVzcyI7CisgICBjYXNlIGlyX2RlcHRoX2xheW91dF91bmNoYW5nZWQ6IHJldHVybiAiZGVwdGhfdW5jaGFuZ2VkIjsKKworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwKTsKKyAgICAgIHJldHVybiAiIjsKKyAgIH0KK30KKworaXJfZXhwcmVzc2lvbl9vcGVyYXRpb24KK2lyX2V4cHJlc3Npb246OmdldF9vcGVyYXRvcihjb25zdCBjaGFyICpzdHIpCit7CisgICBjb25zdCBpbnQgb3BlcmF0b3JfY291bnQgPSBzaXplb2Yob3BlcmF0b3Jfc3RycykgLyBzaXplb2Yob3BlcmF0b3Jfc3Ryc1swXSk7CisgICBmb3IgKGludCBvcCA9IDA7IG9wIDwgb3BlcmF0b3JfY291bnQ7IG9wKyspIHsKKyAgICAgIGlmIChzdHJjbXAoc3RyLCBvcGVyYXRvcl9zdHJzW29wXSkgPT0gMCkKKwkgcmV0dXJuIChpcl9leHByZXNzaW9uX29wZXJhdGlvbikgb3A7CisgICB9CisgICByZXR1cm4gKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uKSAtMTsKK30KKworaXJfY29uc3RhbnQ6OmlyX2NvbnN0YW50KCkKK3sKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2NvbnN0YW50OworfQorCitpcl9jb25zdGFudDo6aXJfY29uc3RhbnQoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSwKKwkJCSBjb25zdCBpcl9jb25zdGFudF9kYXRhICpkYXRhKQoreworICAgYXNzZXJ0KCh0eXBlLT5iYXNlX3R5cGUgPj0gR0xTTF9UWVBFX1VJTlQpCisJICAmJiAodHlwZS0+YmFzZV90eXBlIDw9IEdMU0xfVFlQRV9CT09MKSk7CisKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2NvbnN0YW50OworICAgdGhpcy0+dHlwZSA9IHR5cGU7CisgICBtZW1jcHkoJiB0aGlzLT52YWx1ZSwgZGF0YSwgc2l6ZW9mKHRoaXMtPnZhbHVlKSk7Cit9CisKK2lyX2NvbnN0YW50Ojppcl9jb25zdGFudChmbG9hdCBmLCB1bnNpZ25lZCB2ZWN0b3JfZWxlbWVudHMpCit7CisgICBhc3NlcnQodmVjdG9yX2VsZW1lbnRzIDw9IDQpOworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfY29uc3RhbnQ7CisgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0ZMT0FULCB2ZWN0b3JfZWxlbWVudHMsIDEpOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICB0aGlzLT52YWx1ZS5mW2ldID0gZjsKKyAgIH0KKyAgIGZvciAodW5zaWduZWQgaSA9IHZlY3Rvcl9lbGVtZW50czsgaSA8IDE2OyBpKyspICB7CisgICAgICB0aGlzLT52YWx1ZS5mW2ldID0gMDsKKyAgIH0KK30KKworaXJfY29uc3RhbnQ6OmlyX2NvbnN0YW50KHVuc2lnbmVkIGludCB1LCB1bnNpZ25lZCB2ZWN0b3JfZWxlbWVudHMpCit7CisgICBhc3NlcnQodmVjdG9yX2VsZW1lbnRzIDw9IDQpOworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfY29uc3RhbnQ7CisgICB0aGlzLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX1VJTlQsIHZlY3Rvcl9lbGVtZW50cywgMSk7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgIHRoaXMtPnZhbHVlLnVbaV0gPSB1OworICAgfQorICAgZm9yICh1bnNpZ25lZCBpID0gdmVjdG9yX2VsZW1lbnRzOyBpIDwgMTY7IGkrKykgeworICAgICAgdGhpcy0+dmFsdWUudVtpXSA9IDA7CisgICB9Cit9CisKK2lyX2NvbnN0YW50Ojppcl9jb25zdGFudChpbnQgaW50ZWdlciwgdW5zaWduZWQgdmVjdG9yX2VsZW1lbnRzKQoreworICAgYXNzZXJ0KHZlY3Rvcl9lbGVtZW50cyA8PSA0KTsKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2NvbnN0YW50OworICAgdGhpcy0+dHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKEdMU0xfVFlQRV9JTlQsIHZlY3Rvcl9lbGVtZW50cywgMSk7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgIHRoaXMtPnZhbHVlLmlbaV0gPSBpbnRlZ2VyOworICAgfQorICAgZm9yICh1bnNpZ25lZCBpID0gdmVjdG9yX2VsZW1lbnRzOyBpIDwgMTY7IGkrKykgeworICAgICAgdGhpcy0+dmFsdWUuaVtpXSA9IDA7CisgICB9Cit9CisKK2lyX2NvbnN0YW50Ojppcl9jb25zdGFudChib29sIGIsIHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50cykKK3sKKyAgIGFzc2VydCh2ZWN0b3JfZWxlbWVudHMgPD0gNCk7CisgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9jb25zdGFudDsKKyAgIHRoaXMtPnR5cGUgPSBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfQk9PTCwgdmVjdG9yX2VsZW1lbnRzLCAxKTsKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgdGhpcy0+dmFsdWUuYltpXSA9IGI7CisgICB9CisgICBmb3IgKHVuc2lnbmVkIGkgPSB2ZWN0b3JfZWxlbWVudHM7IGkgPCAxNjsgaSsrKSB7CisgICAgICB0aGlzLT52YWx1ZS5iW2ldID0gZmFsc2U7CisgICB9Cit9CisKK2lyX2NvbnN0YW50Ojppcl9jb25zdGFudChjb25zdCBpcl9jb25zdGFudCAqYywgdW5zaWduZWQgaSkKK3sKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2NvbnN0YW50OworICAgdGhpcy0+dHlwZSA9IGMtPnR5cGUtPmdldF9iYXNlX3R5cGUoKTsKKworICAgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6ICB0aGlzLT52YWx1ZS51WzBdID0gYy0+dmFsdWUudVtpXTsgYnJlYWs7CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6ICAgdGhpcy0+dmFsdWUuaVswXSA9IGMtPnZhbHVlLmlbaV07IGJyZWFrOworICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6IHRoaXMtPnZhbHVlLmZbMF0gPSBjLT52YWx1ZS5mW2ldOyBicmVhazsKKyAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6ICB0aGlzLT52YWx1ZS5iWzBdID0gYy0+dmFsdWUuYltpXTsgYnJlYWs7CisgICBkZWZhdWx0OiAgICAgICAgICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsgYnJlYWs7CisgICB9Cit9CisKK2lyX2NvbnN0YW50Ojppcl9jb25zdGFudChjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlLCBleGVjX2xpc3QgKnZhbHVlX2xpc3QpCit7CisgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9jb25zdGFudDsKKyAgIHRoaXMtPnR5cGUgPSB0eXBlOworCisgICBhc3NlcnQodHlwZS0+aXNfc2NhbGFyKCkgfHwgdHlwZS0+aXNfdmVjdG9yKCkgfHwgdHlwZS0+aXNfbWF0cml4KCkKKwkgIHx8IHR5cGUtPmlzX3JlY29yZCgpIHx8IHR5cGUtPmlzX2FycmF5KCkpOworCisgICBpZiAodHlwZS0+aXNfYXJyYXkoKSkgeworICAgICAgdGhpcy0+YXJyYXlfZWxlbWVudHMgPSByYWxsb2NfYXJyYXkodGhpcywgaXJfY29uc3RhbnQgKiwgdHlwZS0+bGVuZ3RoKTsKKyAgICAgIHVuc2lnbmVkIGkgPSAwOworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsIHZhbHVlX2xpc3QpIHsKKwkgaXJfY29uc3RhbnQgKnZhbHVlID0gKGlyX2NvbnN0YW50ICopIG5vZGU7CisJIGFzc2VydCh2YWx1ZS0+YXNfY29uc3RhbnQoKSAhPSBOVUxMKTsKKworCSB0aGlzLT5hcnJheV9lbGVtZW50c1tpKytdID0gdmFsdWU7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIElmIHRoZSBjb25zdGFudCBpcyBhIHJlY29yZCwgdGhlIHR5cGVzIG9mIGVhY2ggb2YgdGhlIGVudHJpZXMgaW4KKyAgICAqIHZhbHVlX2xpc3QgbXVzdCBiZSBhIDEtZm9yLTEgbWF0Y2ggd2l0aCB0aGUgc3RydWN0dXJlIGNvbXBvbmVudHMuICBFYWNoCisgICAgKiBlbnRyeSBtdXN0IGFsc28gYmUgYSBjb25zdGFudC4gIEp1c3QgbW92ZSB0aGUgbm9kZXMgZnJvbSB0aGUgdmFsdWVfbGlzdAorICAgICogdG8gdGhlIGxpc3QgaW4gdGhlIGlyX2NvbnN0YW50LgorICAgICovCisgICAvKiBGSU5JU0hNRTogU2hvdWxkIHRoZXJlIGJlIHNvbWUgdHlwZSBjaGVja2luZyBhbmQgLyBvciBhc3NlcnRpb25zIGhlcmU/ICovCisgICAvKiBGSU5JU0hNRTogU2hvdWxkIHRoZSBuZXcgY29uc3RhbnQgdGFrZSBvd25lcnNoaXAgb2YgdGhlIG5vZGVzIGZyb20KKyAgICAqIEZJTklTSE1FOiB2YWx1ZV9saXN0LCBvciBzaG91bGQgaXQgbWFrZSBjb3BpZXM/CisgICAgKi8KKyAgIGlmICh0eXBlLT5pc19yZWNvcmQoKSkgeworICAgICAgdmFsdWVfbGlzdC0+bW92ZV9ub2Rlc190bygmIHRoaXMtPmNvbXBvbmVudHMpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgdGhpcy0+dmFsdWUudVtpXSA9IDA7CisgICB9CisKKyAgIGlyX2NvbnN0YW50ICp2YWx1ZSA9IChpcl9jb25zdGFudCAqKSAodmFsdWVfbGlzdC0+aGVhZCk7CisKKyAgIC8qIENvbnN0cnVjdG9ycyB3aXRoIGV4YWN0bHkgb25lIHNjYWxhciBhcmd1bWVudCBhcmUgc3BlY2lhbCBmb3IgdmVjdG9ycworICAgICogYW5kIG1hdHJpY2VzLiAgRm9yIHZlY3RvcnMsIHRoZSBzY2FsYXIgdmFsdWUgaXMgcmVwbGljYXRlZCB0byBmaWxsIGFsbAorICAgICogdGhlIGNvbXBvbmVudHMuICBGb3IgbWF0cmljZXMsIHRoZSBzY2FsYXIgZmlsbHMgdGhlIGNvbXBvbmVudHMgb2YgdGhlCisgICAgKiBkaWFnb25hbCB3aGlsZSB0aGUgcmVzdCBpcyBmaWxsZWQgd2l0aCAwLgorICAgICovCisgICBpZiAodmFsdWUtPnR5cGUtPmlzX3NjYWxhcigpICYmIHZhbHVlLT5uZXh0LT5pc190YWlsX3NlbnRpbmVsKCkpIHsKKyAgICAgIGlmICh0eXBlLT5pc19tYXRyaXgoKSkgeworCSAvKiBNYXRyaXggLSBmaWxsIGRpYWdvbmFsIChyZXN0IGlzIGFscmVhZHkgc2V0IHRvIDApICovCisJIGFzc2VydCh0eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKwkgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHR5cGUtPm1hdHJpeF9jb2x1bW5zOyBpKyspCisJICAgIHRoaXMtPnZhbHVlLmZbaSAqIHR5cGUtPnZlY3Rvcl9lbGVtZW50cyArIGldID0gdmFsdWUtPnZhbHVlLmZbMF07CisgICAgICB9IGVsc2UgeworCSAvKiBWZWN0b3Igb3Igc2NhbGFyIC0gZmlsbCBhbGwgY29tcG9uZW50cyAqLworCSBzd2l0Y2ggKHR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0eXBlLT5jb21wb25lbnRzKCk7IGkrKykKKwkgICAgICAgdGhpcy0+dmFsdWUudVtpXSA9IHZhbHVlLT52YWx1ZS51WzBdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0eXBlLT5jb21wb25lbnRzKCk7IGkrKykKKwkgICAgICAgdGhpcy0+dmFsdWUuZltpXSA9IHZhbHVlLT52YWx1ZS5mWzBdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHR5cGUtPmNvbXBvbmVudHMoKTsgaSsrKQorCSAgICAgICB0aGlzLT52YWx1ZS5iW2ldID0gdmFsdWUtPnZhbHVlLmJbMF07CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworCSAgICBicmVhazsKKwkgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAodHlwZS0+aXNfbWF0cml4KCkgJiYgdmFsdWUtPnR5cGUtPmlzX21hdHJpeCgpKSB7CisgICAgICBhc3NlcnQodmFsdWUtPm5leHQtPmlzX3RhaWxfc2VudGluZWwoKSk7CisKKyAgICAgIC8qIEZyb20gc2VjdGlvbiA1LjQuMiBvZiB0aGUgR0xTTCAxLjIwIHNwZWM6CisgICAgICAgKiAiSWYgYSBtYXRyaXggaXMgY29uc3RydWN0ZWQgZnJvbSBhIG1hdHJpeCwgdGhlbiBlYWNoIGNvbXBvbmVudAorICAgICAgICogIChjb2x1bW4gaSwgcm93IGopIGluIHRoZSByZXN1bHQgdGhhdCBoYXMgYSBjb3JyZXNwb25kaW5nIGNvbXBvbmVudAorICAgICAgICogIChjb2x1bW4gaSwgcm93IGopIGluIHRoZSBhcmd1bWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGZyb20gdGhlcmUuIgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBjb2xzID0gTUlOMih0eXBlLT5tYXRyaXhfY29sdW1ucywgdmFsdWUtPnR5cGUtPm1hdHJpeF9jb2x1bW5zKTsKKyAgICAgIHVuc2lnbmVkIHJvd3MgPSBNSU4yKHR5cGUtPnZlY3Rvcl9lbGVtZW50cywgdmFsdWUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY29sczsgaSsrKSB7CisJIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCByb3dzOyBqKyspIHsKKwkgICAgY29uc3QgdW5zaWduZWQgc3JjID0gaSAqIHZhbHVlLT50eXBlLT52ZWN0b3JfZWxlbWVudHMgKyBqOworCSAgICBjb25zdCB1bnNpZ25lZCBkc3QgPSBpICogdHlwZS0+dmVjdG9yX2VsZW1lbnRzICsgajsKKwkgICAgdGhpcy0+dmFsdWUuZltkc3RdID0gdmFsdWUtPnZhbHVlLmZbc3JjXTsKKwkgfQorICAgICAgfQorCisgICAgICAvKiAiQWxsIG90aGVyIGNvbXBvbmVudHMgd2lsbCBiZSBpbml0aWFsaXplZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4LiIgKi8KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IGNvbHM7IGkgPCB0eXBlLT5tYXRyaXhfY29sdW1uczsgaSsrKQorCSB0aGlzLT52YWx1ZS5mW2kgKiB0eXBlLT52ZWN0b3JfZWxlbWVudHMgKyBpXSA9IDEuMDsKKworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBVc2UgZWFjaCBjb21wb25lbnQgZnJvbSBlYWNoIGVudHJ5IGluIHRoZSB2YWx1ZV9saXN0IHRvIGluaXRpYWxpemUgb25lCisgICAgKiBjb21wb25lbnQgb2YgdGhlIGNvbnN0YW50IGJlaW5nIGNvbnN0cnVjdGVkLgorICAgICovCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdHlwZS0+Y29tcG9uZW50cygpOyAvKiBlbXB0eSAqLykgeworICAgICAgYXNzZXJ0KHZhbHVlLT5hc19jb25zdGFudCgpICE9IE5VTEwpOworICAgICAgYXNzZXJ0KCF2YWx1ZS0+aXNfdGFpbF9zZW50aW5lbCgpKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHZhbHVlLT50eXBlLT5jb21wb25lbnRzKCk7IGorKykgeworCSBzd2l0Y2ggKHR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICB0aGlzLT52YWx1ZS51W2ldID0gdmFsdWUtPmdldF91aW50X2NvbXBvbmVudChqKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgdGhpcy0+dmFsdWUuaVtpXSA9IHZhbHVlLT5nZXRfaW50X2NvbXBvbmVudChqKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICB0aGlzLT52YWx1ZS5mW2ldID0gdmFsdWUtPmdldF9mbG9hdF9jb21wb25lbnQoaik7CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9CT09MOgorCSAgICB0aGlzLT52YWx1ZS5iW2ldID0gdmFsdWUtPmdldF9ib29sX2NvbXBvbmVudChqKTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIC8qIEZJTklTSE1FOiBXaGF0IHRvIGRvPyAgRXhjZXB0aW9ucyBhcmUgbm90IHRoZSBhbnN3ZXIuCisJICAgICAqLworCSAgICBicmVhazsKKwkgfQorCisJIGkrKzsKKwkgaWYgKGkgPj0gdHlwZS0+Y29tcG9uZW50cygpKQorCSAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdmFsdWUgPSAoaXJfY29uc3RhbnQgKikgdmFsdWUtPm5leHQ7CisgICB9Cit9CisKK2lyX2NvbnN0YW50ICoKK2lyX2NvbnN0YW50Ojp6ZXJvKHZvaWQgKm1lbV9jdHgsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGFzc2VydCh0eXBlLT5pc19zY2FsYXIoKSB8fCB0eXBlLT5pc192ZWN0b3IoKSB8fCB0eXBlLT5pc19tYXRyaXgoKQorCSAgfHwgdHlwZS0+aXNfcmVjb3JkKCkgfHwgdHlwZS0+aXNfYXJyYXkoKSk7CisKKyAgIGlyX2NvbnN0YW50ICpjID0gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50OworICAgYy0+dHlwZSA9IHR5cGU7CisgICBtZW1zZXQoJmMtPnZhbHVlLCAwLCBzaXplb2YoYy0+dmFsdWUpKTsKKworICAgaWYgKHR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIGMtPmFycmF5X2VsZW1lbnRzID0gcmFsbG9jX2FycmF5KGMsIGlyX2NvbnN0YW50ICosIHR5cGUtPmxlbmd0aCk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0eXBlLT5sZW5ndGg7IGkrKykKKwkgYy0+YXJyYXlfZWxlbWVudHNbaV0gPSBpcl9jb25zdGFudDo6emVybyhjLCB0eXBlLT5lbGVtZW50X3R5cGUoKSk7CisgICB9CisKKyAgIGlmICh0eXBlLT5pc19yZWNvcmQoKSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHR5cGUtPmxlbmd0aDsgaSsrKSB7CisJIGlyX2NvbnN0YW50ICpjb21wID0gaXJfY29uc3RhbnQ6Onplcm8obWVtX2N0eCwgdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlKTsKKwkgYy0+Y29tcG9uZW50cy5wdXNoX3RhaWwoY29tcCk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBjOworfQorCitib29sCitpcl9jb25zdGFudDo6Z2V0X2Jvb2xfY29tcG9uZW50KHVuc2lnbmVkIGkpIGNvbnN0Cit7CisgICBzd2l0Y2ggKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDogIHJldHVybiB0aGlzLT52YWx1ZS51W2ldICE9IDA7CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6ICAgcmV0dXJuIHRoaXMtPnZhbHVlLmlbaV0gIT0gMDsKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOiByZXR1cm4gKChpbnQpdGhpcy0+dmFsdWUuZltpXSkgIT0gMDsKKyAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6ICByZXR1cm4gdGhpcy0+dmFsdWUuYltpXTsKKyAgIGRlZmF1bHQ6ICAgICAgICAgICAgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOyBicmVhazsKKyAgIH0KKworICAgLyogTXVzdCByZXR1cm4gc29tZXRoaW5nIHRvIG1ha2UgdGhlIGNvbXBpbGVyIGhhcHB5LiAgVGhpcyBpcyBjbGVhcmx5IGFuCisgICAgKiBlcnJvciBjYXNlLgorICAgICovCisgICByZXR1cm4gZmFsc2U7Cit9CisKK2Zsb2F0Citpcl9jb25zdGFudDo6Z2V0X2Zsb2F0X2NvbXBvbmVudCh1bnNpZ25lZCBpKSBjb25zdAoreworICAgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6ICByZXR1cm4gKGZsb2F0KSB0aGlzLT52YWx1ZS51W2ldOworICAgY2FzZSBHTFNMX1RZUEVfSU5UOiAgIHJldHVybiAoZmxvYXQpIHRoaXMtPnZhbHVlLmlbaV07CisgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDogcmV0dXJuIHRoaXMtPnZhbHVlLmZbaV07CisgICBjYXNlIEdMU0xfVFlQRV9CT09MOiAgcmV0dXJuIHRoaXMtPnZhbHVlLmJbaV0gPyAxLjBmIDogMC4wZjsKKyAgIGRlZmF1bHQ6ICAgICAgICAgICAgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOyBicmVhazsKKyAgIH0KKworICAgLyogTXVzdCByZXR1cm4gc29tZXRoaW5nIHRvIG1ha2UgdGhlIGNvbXBpbGVyIGhhcHB5LiAgVGhpcyBpcyBjbGVhcmx5IGFuCisgICAgKiBlcnJvciBjYXNlLgorICAgICovCisgICByZXR1cm4gMC4wOworfQorCitpbnQKK2lyX2NvbnN0YW50OjpnZXRfaW50X2NvbXBvbmVudCh1bnNpZ25lZCBpKSBjb25zdAoreworICAgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6ICByZXR1cm4gdGhpcy0+dmFsdWUudVtpXTsKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDogICByZXR1cm4gdGhpcy0+dmFsdWUuaVtpXTsKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOiByZXR1cm4gKGludCkgdGhpcy0+dmFsdWUuZltpXTsKKyAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6ICByZXR1cm4gdGhpcy0+dmFsdWUuYltpXSA/IDEgOiAwOworICAgZGVmYXVsdDogICAgICAgICAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7IGJyZWFrOworICAgfQorCisgICAvKiBNdXN0IHJldHVybiBzb21ldGhpbmcgdG8gbWFrZSB0aGUgY29tcGlsZXIgaGFwcHkuICBUaGlzIGlzIGNsZWFybHkgYW4KKyAgICAqIGVycm9yIGNhc2UuCisgICAgKi8KKyAgIHJldHVybiAwOworfQorCit1bnNpZ25lZAoraXJfY29uc3RhbnQ6OmdldF91aW50X2NvbXBvbmVudCh1bnNpZ25lZCBpKSBjb25zdAoreworICAgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6ICByZXR1cm4gdGhpcy0+dmFsdWUudVtpXTsKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDogICByZXR1cm4gdGhpcy0+dmFsdWUuaVtpXTsKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOiByZXR1cm4gKHVuc2lnbmVkKSB0aGlzLT52YWx1ZS5mW2ldOworICAgY2FzZSBHTFNMX1RZUEVfQk9PTDogIHJldHVybiB0aGlzLT52YWx1ZS5iW2ldID8gMSA6IDA7CisgICBkZWZhdWx0OiAgICAgICAgICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsgYnJlYWs7CisgICB9CisKKyAgIC8qIE11c3QgcmV0dXJuIHNvbWV0aGluZyB0byBtYWtlIHRoZSBjb21waWxlciBoYXBweS4gIFRoaXMgaXMgY2xlYXJseSBhbgorICAgICogZXJyb3IgY2FzZS4KKyAgICAqLworICAgcmV0dXJuIDA7Cit9CisKK2lyX2NvbnN0YW50ICoKK2lyX2NvbnN0YW50OjpnZXRfYXJyYXlfZWxlbWVudCh1bnNpZ25lZCBpKSBjb25zdAoreworICAgYXNzZXJ0KHRoaXMtPnR5cGUtPmlzX2FycmF5KCkpOworCisgICAvKiBGcm9tIHBhZ2UgMzUgKHBhZ2UgNDEgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4yMCBzcGVjOgorICAgICoKKyAgICAqICAgICAiQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIGEgc2hhZGVyIHN1YnNjcmlwdHMgYW4gYXJyYXkgd2l0aCBhbiBpbmRleAorICAgICogICAgIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSB0aGUgYXJyYXkgd2FzCisgICAgKiAgICAgZGVjbGFyZWQgd2l0aC4iCisgICAgKgorICAgICogTW9zdCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGFyZSByZW1vdmVkIGJlZm9yZSB0aGluZ3MgY291bGQgZ2V0IHRoaXMgZmFyLgorICAgICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIG5vbi1jb25zdGFudCBhcnJheSBpbmRleCB2YWx1ZXMgY2FuIGdldCBjb25zdGFudAorICAgICogZm9sZGVkLgorICAgICovCisgICBpZiAoaW50KGkpIDwgMCkKKyAgICAgIGkgPSAwOworICAgZWxzZSBpZiAoaSA+PSB0aGlzLT50eXBlLT5sZW5ndGgpCisgICAgICBpID0gdGhpcy0+dHlwZS0+bGVuZ3RoIC0gMTsKKworICAgcmV0dXJuIGFycmF5X2VsZW1lbnRzW2ldOworfQorCitpcl9jb25zdGFudCAqCitpcl9jb25zdGFudDo6Z2V0X3JlY29yZF9maWVsZChjb25zdCBjaGFyICpuYW1lKQoreworICAgaW50IGlkeCA9IHRoaXMtPnR5cGUtPmZpZWxkX2luZGV4KG5hbWUpOworCisgICBpZiAoaWR4IDwgMCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAodGhpcy0+Y29tcG9uZW50cy5pc19lbXB0eSgpKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGV4ZWNfbm9kZSAqbm9kZSA9IHRoaXMtPmNvbXBvbmVudHMuaGVhZDsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWR4OyBpKyspIHsKKyAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworCisgICAgICAvKiBJZiB0aGUgZW5kIG9mIHRoZSBsaXN0IGlzIGVuY291bnRlcmVkIGJlZm9yZSB0aGUgZWxlbWVudCBtYXRjaGluZyB0aGUKKyAgICAgICAqIHJlcXVlc3RlZCBmaWVsZCBpcyBmb3VuZCwgcmV0dXJuIE5VTEwuCisgICAgICAgKi8KKyAgICAgIGlmIChub2RlLT5pc190YWlsX3NlbnRpbmVsKCkpCisJIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gKGlyX2NvbnN0YW50ICopIG5vZGU7Cit9CisKK3ZvaWQKK2lyX2NvbnN0YW50Ojpjb3B5X29mZnNldChpcl9jb25zdGFudCAqc3JjLCBpbnQgb2Zmc2V0KQoreworICAgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6IHsKKyAgICAgIHVuc2lnbmVkIGludCBzaXplID0gc3JjLT50eXBlLT5jb21wb25lbnRzKCk7CisgICAgICBhc3NlcnQgKHNpemUgPD0gdGhpcy0+dHlwZS0+Y29tcG9uZW50cygpIC0gb2Zmc2V0KTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MDsgaTxzaXplOyBpKyspIHsKKwkgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKwkgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgICAgdmFsdWUudVtpK29mZnNldF0gPSBzcmMtPmdldF91aW50X2NvbXBvbmVudChpKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgdmFsdWUuaVtpK29mZnNldF0gPSBzcmMtPmdldF9pbnRfY29tcG9uZW50KGkpOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIHZhbHVlLmZbaStvZmZzZXRdID0gc3JjLT5nZXRfZmxvYXRfY29tcG9uZW50KGkpOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgICAgdmFsdWUuYltpK29mZnNldF0gPSBzcmMtPmdldF9ib29sX2NvbXBvbmVudChpKTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6IC8vIFNodXQgdXAgdGhlIGNvbXBpbGVyCisJICAgIGJyZWFrOworCSB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOiB7CisgICAgICBhc3NlcnQgKHNyYy0+dHlwZSA9PSB0aGlzLT50eXBlKTsKKyAgICAgIHRoaXMtPmNvbXBvbmVudHMubWFrZV9lbXB0eSgpOworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsICZzcmMtPmNvbXBvbmVudHMpIHsKKwkgaXJfY29uc3RhbnQgKmNvbnN0IG9yaWcgPSAoaXJfY29uc3RhbnQgKikgbm9kZTsKKworCSB0aGlzLT5jb21wb25lbnRzLnB1c2hfdGFpbChvcmlnLT5jbG9uZSh0aGlzLCBOVUxMKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6IHsKKyAgICAgIGFzc2VydCAoc3JjLT50eXBlID09IHRoaXMtPnR5cGUpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPnR5cGUtPmxlbmd0aDsgaSsrKSB7CisJIHRoaXMtPmFycmF5X2VsZW1lbnRzW2ldID0gc3JjLT5hcnJheV9lbGVtZW50c1tpXS0+Y2xvbmUodGhpcywgTlVMTCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICBicmVhazsKKyAgIH0KK30KKwordm9pZAoraXJfY29uc3RhbnQ6OmNvcHlfbWFza2VkX29mZnNldChpcl9jb25zdGFudCAqc3JjLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKyAgIGFzc2VydCAoIXR5cGUtPmlzX2FycmF5KCkgJiYgIXR5cGUtPmlzX3JlY29yZCgpKTsKKworICAgaWYgKCF0eXBlLT5pc192ZWN0b3IoKSAmJiAhdHlwZS0+aXNfbWF0cml4KCkpIHsKKyAgICAgIG9mZnNldCA9IDA7CisgICAgICBtYXNrID0gMTsKKyAgIH0KKworICAgaW50IGlkID0gMDsKKyAgIGZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKKyAgICAgIGlmIChtYXNrICYgKDEgPDwgaSkpIHsKKwkgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKwkgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgICAgdmFsdWUudVtpK29mZnNldF0gPSBzcmMtPmdldF91aW50X2NvbXBvbmVudChpZCsrKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgdmFsdWUuaVtpK29mZnNldF0gPSBzcmMtPmdldF9pbnRfY29tcG9uZW50KGlkKyspOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIHZhbHVlLmZbaStvZmZzZXRdID0gc3JjLT5nZXRfZmxvYXRfY29tcG9uZW50KGlkKyspOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgICAgdmFsdWUuYltpK29mZnNldF0gPSBzcmMtPmdldF9ib29sX2NvbXBvbmVudChpZCsrKTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisJICAgIHJldHVybjsKKwkgfQorICAgICAgfQorICAgfQorfQorCitib29sCitpcl9jb25zdGFudDo6aGFzX3ZhbHVlKGNvbnN0IGlyX2NvbnN0YW50ICpjKSBjb25zdAoreworICAgaWYgKHRoaXMtPnR5cGUgIT0gYy0+dHlwZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKHRoaXMtPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0aGlzLT50eXBlLT5sZW5ndGg7IGkrKykgeworCSBpZiAoIXRoaXMtPmFycmF5X2VsZW1lbnRzW2ldLT5oYXNfdmFsdWUoYy0+YXJyYXlfZWxlbWVudHNbaV0pKQorCSAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgaWYgKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfU1RSVUNUKSB7CisgICAgICBjb25zdCBleGVjX25vZGUgKmFfbm9kZSA9IHRoaXMtPmNvbXBvbmVudHMuaGVhZDsKKyAgICAgIGNvbnN0IGV4ZWNfbm9kZSAqYl9ub2RlID0gYy0+Y29tcG9uZW50cy5oZWFkOworCisgICAgICB3aGlsZSAoIWFfbm9kZS0+aXNfdGFpbF9zZW50aW5lbCgpKSB7CisJIGFzc2VydCghYl9ub2RlLT5pc190YWlsX3NlbnRpbmVsKCkpOworCisJIGNvbnN0IGlyX2NvbnN0YW50ICpjb25zdCBhX2ZpZWxkID0gKGlyX2NvbnN0YW50ICopIGFfbm9kZTsKKwkgY29uc3QgaXJfY29uc3RhbnQgKmNvbnN0IGJfZmllbGQgPSAoaXJfY29uc3RhbnQgKikgYl9ub2RlOworCisJIGlmICghYV9maWVsZC0+aGFzX3ZhbHVlKGJfZmllbGQpKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgYV9ub2RlID0gYV9ub2RlLT5uZXh0OworCSBiX25vZGUgPSBiX25vZGUtPm5leHQ7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdGhpcy0+dHlwZS0+Y29tcG9uZW50cygpOyBpKyspIHsKKyAgICAgIHN3aXRjaCAodGhpcy0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSBpZiAodGhpcy0+dmFsdWUudVtpXSAhPSBjLT52YWx1ZS51W2ldKQorCSAgICByZXR1cm4gZmFsc2U7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSBpZiAodGhpcy0+dmFsdWUuaVtpXSAhPSBjLT52YWx1ZS5pW2ldKQorCSAgICByZXR1cm4gZmFsc2U7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJIGlmICh0aGlzLT52YWx1ZS5mW2ldICE9IGMtPnZhbHVlLmZbaV0pCisJICAgIHJldHVybiBmYWxzZTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorCSBpZiAodGhpcy0+dmFsdWUuYltpXSAhPSBjLT52YWx1ZS5iW2ldKQorCSAgICByZXR1cm4gZmFsc2U7CisJIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKwkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAoraXJfY29uc3RhbnQ6OmlzX3ZhbHVlKGZsb2F0IGYsIGludCBpKSBjb25zdAoreworICAgaWYgKCF0aGlzLT50eXBlLT5pc19zY2FsYXIoKSAmJiAhdGhpcy0+dHlwZS0+aXNfdmVjdG9yKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIE9ubHkgYWNjZXB0IGJvb2xlYW4gdmFsdWVzIGZvciAwLzEuICovCisgICBpZiAoaW50KGJvb2woaSkpICE9IGkgJiYgdGhpcy0+dHlwZS0+aXNfYm9vbGVhbigpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgdGhpcy0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBjKyspIHsKKyAgICAgIHN3aXRjaCAodGhpcy0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgaWYgKHRoaXMtPnZhbHVlLmZbY10gIT0gZikKKwkgICAgcmV0dXJuIGZhbHNlOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgaWYgKHRoaXMtPnZhbHVlLmlbY10gIT0gaSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJIGlmICh0aGlzLT52YWx1ZS51W2NdICE9IHVuc2lnbmVkKGkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgaWYgKHRoaXMtPnZhbHVlLmJbY10gIT0gYm9vbChpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIC8qIFRoZSBvbmx5IG90aGVyIGJhc2UgdHlwZXMgYXJlIHN0cnVjdHVyZXMsIGFycmF5cywgYW5kIHNhbXBsZXJzLgorCSAgKiBTYW1wbGVycyBjYW5ub3QgYmUgY29uc3RhbnRzLCBhbmQgdGhlIG90aGVycyBzaG91bGQgaGF2ZSBiZWVuCisJICAqIGZpbHRlcmVkIG91dCBhYm92ZS4KKwkgICovCisJIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisJIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2lyX2NvbnN0YW50Ojppc196ZXJvKCkgY29uc3QKK3sKKyAgIHJldHVybiBpc192YWx1ZSgwLjAsIDApOworfQorCitib29sCitpcl9jb25zdGFudDo6aXNfb25lKCkgY29uc3QKK3sKKyAgIHJldHVybiBpc192YWx1ZSgxLjAsIDEpOworfQorCitib29sCitpcl9jb25zdGFudDo6aXNfbmVnYXRpdmVfb25lKCkgY29uc3QKK3sKKyAgIHJldHVybiBpc192YWx1ZSgtMS4wLCAtMSk7Cit9CisKK2Jvb2wKK2lyX2NvbnN0YW50Ojppc19iYXNpcygpIGNvbnN0Cit7CisgICBpZiAoIXRoaXMtPnR5cGUtPmlzX3NjYWxhcigpICYmICF0aGlzLT50eXBlLT5pc192ZWN0b3IoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKHRoaXMtPnR5cGUtPmlzX2Jvb2xlYW4oKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgdW5zaWduZWQgb25lcyA9IDA7CisgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgdGhpcy0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBjKyspIHsKKyAgICAgIHN3aXRjaCAodGhpcy0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgaWYgKHRoaXMtPnZhbHVlLmZbY10gPT0gMS4wKQorCSAgICBvbmVzKys7CisJIGVsc2UgaWYgKHRoaXMtPnZhbHVlLmZbY10gIT0gMC4wKQorCSAgICByZXR1cm4gZmFsc2U7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSBpZiAodGhpcy0+dmFsdWUuaVtjXSA9PSAxKQorCSAgICBvbmVzKys7CisJIGVsc2UgaWYgKHRoaXMtPnZhbHVlLmlbY10gIT0gMCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJIGlmIChpbnQodGhpcy0+dmFsdWUudVtjXSkgPT0gMSkKKwkgICAgb25lcysrOworCSBlbHNlIGlmIChpbnQodGhpcy0+dmFsdWUudVtjXSkgIT0gMCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIC8qIFRoZSBvbmx5IG90aGVyIGJhc2UgdHlwZXMgYXJlIHN0cnVjdHVyZXMsIGFycmF5cywgc2FtcGxlcnMsIGFuZAorCSAgKiBib29sZWFucy4gIFNhbXBsZXJzIGNhbm5vdCBiZSBjb25zdGFudHMsIGFuZCB0aGUgb3RoZXJzIHNob3VsZAorCSAgKiBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0IGFib3ZlLgorCSAgKi8KKwkgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKwkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gb25lcyA9PSAxOworfQorCitib29sCitpcl9jb25zdGFudDo6aXNfdWludDE2X2NvbnN0YW50KCkgY29uc3QKK3sKKyAgIGlmICghdHlwZS0+aXNfaW50ZWdlcigpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICByZXR1cm4gdmFsdWUudVswXSA8ICgxIDw8IDE2KTsKK30KKworaXJfbG9vcDo6aXJfbG9vcCgpCit7CisgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9sb29wOworfQorCisKK2lyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlOjppcl9kZXJlZmVyZW5jZV92YXJpYWJsZShpcl92YXJpYWJsZSAqdmFyKQoreworICAgYXNzZXJ0KHZhciAhPSBOVUxMKTsKKworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfZGVyZWZlcmVuY2VfdmFyaWFibGU7CisgICB0aGlzLT52YXIgPSB2YXI7CisgICB0aGlzLT50eXBlID0gdmFyLT50eXBlOworfQorCisKK2lyX2RlcmVmZXJlbmNlX2FycmF5Ojppcl9kZXJlZmVyZW5jZV9hcnJheShpcl9ydmFsdWUgKnZhbHVlLAorCQkJCQkgICBpcl9ydmFsdWUgKmFycmF5X2luZGV4KQoreworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfZGVyZWZlcmVuY2VfYXJyYXk7CisgICB0aGlzLT5hcnJheV9pbmRleCA9IGFycmF5X2luZGV4OworICAgdGhpcy0+c2V0X2FycmF5KHZhbHVlKTsKK30KKworCitpcl9kZXJlZmVyZW5jZV9hcnJheTo6aXJfZGVyZWZlcmVuY2VfYXJyYXkoaXJfdmFyaWFibGUgKnZhciwKKwkJCQkJICAgaXJfcnZhbHVlICphcnJheV9pbmRleCkKK3sKKyAgIHZvaWQgKmN0eCA9IHJhbGxvY19wYXJlbnQodmFyKTsKKworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfZGVyZWZlcmVuY2VfYXJyYXk7CisgICB0aGlzLT5hcnJheV9pbmRleCA9IGFycmF5X2luZGV4OworICAgdGhpcy0+c2V0X2FycmF5KG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcikpOworfQorCisKK3ZvaWQKK2lyX2RlcmVmZXJlbmNlX2FycmF5OjpzZXRfYXJyYXkoaXJfcnZhbHVlICp2YWx1ZSkKK3sKKyAgIGFzc2VydCh2YWx1ZSAhPSBOVUxMKTsKKworICAgdGhpcy0+YXJyYXkgPSB2YWx1ZTsKKworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCB2dCA9IHRoaXMtPmFycmF5LT50eXBlOworCisgICBpZiAodnQtPmlzX2FycmF5KCkpIHsKKyAgICAgIHR5cGUgPSB2dC0+ZWxlbWVudF90eXBlKCk7CisgICB9IGVsc2UgaWYgKHZ0LT5pc19tYXRyaXgoKSkgeworICAgICAgdHlwZSA9IHZ0LT5jb2x1bW5fdHlwZSgpOworICAgfSBlbHNlIGlmICh2dC0+aXNfdmVjdG9yKCkpIHsKKyAgICAgIHR5cGUgPSB2dC0+Z2V0X2Jhc2VfdHlwZSgpOworICAgfQorfQorCisKK2lyX2RlcmVmZXJlbmNlX3JlY29yZDo6aXJfZGVyZWZlcmVuY2VfcmVjb3JkKGlyX3J2YWx1ZSAqdmFsdWUsCisJCQkJCSAgICAgY29uc3QgY2hhciAqZmllbGQpCit7CisgICBhc3NlcnQodmFsdWUgIT0gTlVMTCk7CisKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2RlcmVmZXJlbmNlX3JlY29yZDsKKyAgIHRoaXMtPnJlY29yZCA9IHZhbHVlOworICAgdGhpcy0+ZmllbGQgPSByYWxsb2Nfc3RyZHVwKHRoaXMsIGZpZWxkKTsKKyAgIHRoaXMtPnR5cGUgPSB0aGlzLT5yZWNvcmQtPnR5cGUtPmZpZWxkX3R5cGUoZmllbGQpOworfQorCisKK2lyX2RlcmVmZXJlbmNlX3JlY29yZDo6aXJfZGVyZWZlcmVuY2VfcmVjb3JkKGlyX3ZhcmlhYmxlICp2YXIsCisJCQkJCSAgICAgY29uc3QgY2hhciAqZmllbGQpCit7CisgICB2b2lkICpjdHggPSByYWxsb2NfcGFyZW50KHZhcik7CisKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2RlcmVmZXJlbmNlX3JlY29yZDsKKyAgIHRoaXMtPnJlY29yZCA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICB0aGlzLT5maWVsZCA9IHJhbGxvY19zdHJkdXAodGhpcywgZmllbGQpOworICAgdGhpcy0+dHlwZSA9IHRoaXMtPnJlY29yZC0+dHlwZS0+ZmllbGRfdHlwZShmaWVsZCk7Cit9CisKK2Jvb2wKK2lyX2RlcmVmZXJlbmNlOjppc19sdmFsdWUoKSBjb25zdAoreworICAgaXJfdmFyaWFibGUgKnZhciA9IHRoaXMtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKworICAgLyogRXZlcnkgbC12YWx1ZSBkZXJmZXJlbmNlIGNoYWluIGV2ZW50dWFsbHkgZW5kcyBpbiBhIHZhcmlhYmxlLgorICAgICovCisgICBpZiAoKHZhciA9PSBOVUxMKSB8fCB2YXItPmRhdGEucmVhZF9vbmx5KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBGcm9tIHNlY3Rpb24gNC4xLjcgb2YgdGhlIEdMU0wgNC40MCBzcGVjOgorICAgICoKKyAgICAqICAgIk9wYXF1ZSB2YXJpYWJsZXMgY2Fubm90IGJlIHRyZWF0ZWQgYXMgbC12YWx1ZXM7IGhlbmNlIGNhbm5vdAorICAgICogICAgYmUgdXNlZCBhcyBvdXQgb3IgaW5vdXQgZnVuY3Rpb24gcGFyYW1ldGVycywgbm9yIGNhbiB0aGV5IGJlCisgICAgKiAgICBhc3NpZ25lZCBpbnRvLiIKKyAgICAqLworICAgaWYgKHRoaXMtPnR5cGUtPmNvbnRhaW5zX29wYXF1ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleF9vcGNvZGVfc3Ryc1tdID0geyAidGV4IiwgInR4YiIsICJ0eGwiLCAidHhkIiwgInR4ZiIsICJ0eGZfbXMiLCAidHhzIiwgImxvZCIsICJ0ZzQiLCAicXVlcnlfbGV2ZWxzIiB9OworCitjb25zdCBjaGFyICppcl90ZXh0dXJlOjpvcGNvZGVfc3RyaW5nKCkKK3sKKyAgIGFzc2VydCgodW5zaWduZWQgaW50KSBvcCA8PQorCSAgc2l6ZW9mKHRleF9vcGNvZGVfc3RycykgLyBzaXplb2YodGV4X29wY29kZV9zdHJzWzBdKSk7CisgICByZXR1cm4gdGV4X29wY29kZV9zdHJzW29wXTsKK30KKworaXJfdGV4dHVyZV9vcGNvZGUKK2lyX3RleHR1cmU6OmdldF9vcGNvZGUoY29uc3QgY2hhciAqc3RyKQoreworICAgY29uc3QgaW50IGNvdW50ID0gc2l6ZW9mKHRleF9vcGNvZGVfc3RycykgLyBzaXplb2YodGV4X29wY29kZV9zdHJzWzBdKTsKKyAgIGZvciAoaW50IG9wID0gMDsgb3AgPCBjb3VudDsgb3ArKykgeworICAgICAgaWYgKHN0cmNtcChzdHIsIHRleF9vcGNvZGVfc3Ryc1tvcF0pID09IDApCisJIHJldHVybiAoaXJfdGV4dHVyZV9vcGNvZGUpIG9wOworICAgfQorICAgcmV0dXJuIChpcl90ZXh0dXJlX29wY29kZSkgLTE7Cit9CisKKwordm9pZAoraXJfdGV4dHVyZTo6c2V0X3NhbXBsZXIoaXJfZGVyZWZlcmVuY2UgKnNhbXBsZXIsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGFzc2VydChzYW1wbGVyICE9IE5VTEwpOworICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCk7CisgICB0aGlzLT5zYW1wbGVyID0gc2FtcGxlcjsKKyAgIHRoaXMtPnR5cGUgPSB0eXBlOworCisgICBpZiAodGhpcy0+b3AgPT0gaXJfdHhzIHx8IHRoaXMtPm9wID09IGlyX3F1ZXJ5X2xldmVscykgeworICAgICAgYXNzZXJ0KHR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKTsKKyAgIH0gZWxzZSBpZiAodGhpcy0+b3AgPT0gaXJfbG9kKSB7CisgICAgICBhc3NlcnQodHlwZS0+dmVjdG9yX2VsZW1lbnRzID09IDIpOworICAgICAgYXNzZXJ0KHR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChzYW1wbGVyLT50eXBlLT5zYW1wbGVyX3R5cGUgPT0gKGludCkgdHlwZS0+YmFzZV90eXBlKTsKKyAgICAgIGlmIChzYW1wbGVyLT50eXBlLT5zYW1wbGVyX3NoYWRvdykKKwkgYXNzZXJ0KHR5cGUtPnZlY3Rvcl9lbGVtZW50cyA9PSA0IHx8IHR5cGUtPnZlY3Rvcl9lbGVtZW50cyA9PSAxKTsKKyAgICAgIGVsc2UKKwkgYXNzZXJ0KHR5cGUtPnZlY3Rvcl9lbGVtZW50cyA9PSA0KTsKKyAgIH0KK30KKworCit2b2lkCitpcl9zd2l6emxlOjppbml0X21hc2soY29uc3QgdW5zaWduZWQgKmNvbXAsIHVuc2lnbmVkIGNvdW50KQoreworICAgYXNzZXJ0KChjb3VudCA+PSAxKSAmJiAoY291bnQgPD0gNCkpOworCisgICBtZW1zZXQoJnRoaXMtPm1hc2ssIDAsIHNpemVvZih0aGlzLT5tYXNrKSk7CisgICB0aGlzLT5tYXNrLm51bV9jb21wb25lbnRzID0gY291bnQ7CisKKyAgIHVuc2lnbmVkIGR1cF9tYXNrID0gMDsKKyAgIHN3aXRjaCAoY291bnQpIHsKKyAgIGNhc2UgNDoKKyAgICAgIGFzc2VydChjb21wWzNdIDw9IDMpOworICAgICAgZHVwX21hc2sgfD0gKDFVIDw8IGNvbXBbM10pCisJICYgKCgxVSA8PCBjb21wWzBdKSB8ICgxVSA8PCBjb21wWzFdKSB8ICgxVSA8PCBjb21wWzJdKSk7CisgICAgICB0aGlzLT5tYXNrLncgPSBjb21wWzNdOworCisgICBjYXNlIDM6CisgICAgICBhc3NlcnQoY29tcFsyXSA8PSAzKTsKKyAgICAgIGR1cF9tYXNrIHw9ICgxVSA8PCBjb21wWzJdKQorCSAmICgoMVUgPDwgY29tcFswXSkgfCAoMVUgPDwgY29tcFsxXSkpOworICAgICAgdGhpcy0+bWFzay56ID0gY29tcFsyXTsKKworICAgY2FzZSAyOgorICAgICAgYXNzZXJ0KGNvbXBbMV0gPD0gMyk7CisgICAgICBkdXBfbWFzayB8PSAoMVUgPDwgY29tcFsxXSkKKwkgJiAoKDFVIDw8IGNvbXBbMF0pKTsKKyAgICAgIHRoaXMtPm1hc2sueSA9IGNvbXBbMV07CisKKyAgIGNhc2UgMToKKyAgICAgIGFzc2VydChjb21wWzBdIDw9IDMpOworICAgICAgdGhpcy0+bWFzay54ID0gY29tcFswXTsKKyAgIH0KKworICAgdGhpcy0+bWFzay5oYXNfZHVwbGljYXRlcyA9IGR1cF9tYXNrICE9IDA7CisKKyAgIC8qIEJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN3aXp6bGUgYW5kIHRoZSBiYXNlIHR5cGUKKyAgICAqIChpLmUuLCBmbG9hdCwgaW50LCB1bnNpZ25lZCwgb3IgYm9vbCkgb2YgdGhlIHZlY3RvciBiZWluZyBzd2l6emxlZCwKKyAgICAqIGdlbmVyYXRlIHRoZSB0eXBlIG9mIHRoZSByZXN1bHRpbmcgdmFsdWUuCisgICAgKi8KKyAgIHR5cGUgPSBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZSh2YWwtPnR5cGUtPmJhc2VfdHlwZSwgbWFzay5udW1fY29tcG9uZW50cywgMSk7Cit9CisKK2lyX3N3aXp6bGU6OmlyX3N3aXp6bGUoaXJfcnZhbHVlICp2YWwsIHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIHVuc2lnbmVkIHosCisJCSAgICAgICB1bnNpZ25lZCB3LCB1bnNpZ25lZCBjb3VudCkKKyAgIDogdmFsKHZhbCkKK3sKKyAgIGNvbnN0IHVuc2lnbmVkIGNvbXBvbmVudHNbNF0gPSB7IHgsIHksIHosIHcgfTsKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX3N3aXp6bGU7CisgICB0aGlzLT5pbml0X21hc2soY29tcG9uZW50cywgY291bnQpOworfQorCitpcl9zd2l6emxlOjppcl9zd2l6emxlKGlyX3J2YWx1ZSAqdmFsLCBjb25zdCB1bnNpZ25lZCAqY29tcCwKKwkJICAgICAgIHVuc2lnbmVkIGNvdW50KQorICAgOiB2YWwodmFsKQoreworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfc3dpenpsZTsKKyAgIHRoaXMtPmluaXRfbWFzayhjb21wLCBjb3VudCk7Cit9CisKK2lyX3N3aXp6bGU6OmlyX3N3aXp6bGUoaXJfcnZhbHVlICp2YWwsIGlyX3N3aXp6bGVfbWFzayBtYXNrKQoreworICAgdGhpcy0+aXJfdHlwZSA9IGlyX3R5cGVfc3dpenpsZTsKKyAgIHRoaXMtPnZhbCA9IHZhbDsKKyAgIHRoaXMtPm1hc2sgPSBtYXNrOworICAgdGhpcy0+dHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKHZhbC0+dHlwZS0+YmFzZV90eXBlLAorCQkJCQltYXNrLm51bV9jb21wb25lbnRzLCAxKTsKK30KKworI2RlZmluZSBYIDEKKyNkZWZpbmUgUiA1CisjZGVmaW5lIFMgOQorI2RlZmluZSBJIDEzCisKK2lyX3N3aXp6bGUgKgoraXJfc3dpenpsZTo6Y3JlYXRlKGlyX3J2YWx1ZSAqdmFsLCBjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIHZlY3Rvcl9sZW5ndGgpCit7CisgICB2b2lkICpjdHggPSByYWxsb2NfcGFyZW50KHZhbCk7CisKKyAgIC8qIEZvciBlYWNoIHBvc3NpYmxlIHN3aXp6bGUgY2hhcmFjdGVyLCB0aGlzIHRhYmxlIGVuY29kZXMgdGhlIHZhbHVlIGluCisgICAgKiBcYyBpZHhfbWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgMHRoIGVsZW1lbnQgb2YgdGhlIHZlY3Rvci4gIEZvciBpbnZhbGlkCisgICAgKiBzd2l6emxlIGNoYXJhY3RlcnMgKGUuZy4sICdrJyksIGEgc3BlY2lhbCB2YWx1ZSBpcyB1c2VkIHRoYXQgd2lsbCBhbGxvdworICAgICogZGV0ZWN0aW9uIG9mIGVycm9ycy4KKyAgICAqLworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmFzZV9pZHhbMjZdID0geworICAgLyogYSAgYiAgYyAgZCAgZSAgZiAgZyAgaCAgaSAgaiAgayAgbCAgbSAqLworICAgICAgUiwgUiwgSSwgSSwgSSwgSSwgUiwgSSwgSSwgSSwgSSwgSSwgSSwKKyAgIC8qIG4gIG8gIHAgIHEgIHIgIHMgIHQgIHUgIHYgIHcgIHggIHkgIHogKi8KKyAgICAgIEksIEksIFMsIFMsIFIsIFMsIFMsIEksIEksIFgsIFgsIFgsIFgKKyAgIH07CisKKyAgIC8qIEVhY2ggdmFsaWQgc3dpenpsZSBjaGFyYWN0ZXIgaGFzIGFuIGVudHJ5IGluIHRoZSBwcmV2aW91cyB0YWJsZS4gIFRoaXMKKyAgICAqIHRhYmxlIGVuY29kZXMgdGhlIGJhc2UgaW5kZXggZW5jb2RlZCBpbiB0aGUgcHJldmlvdXMgdGFibGUgcGx1cyB0aGUgYWN0dWFsCisgICAgKiBpbmRleCBvZiB0aGUgc3dpenpsZSBjaGFyYWN0ZXIuICBXaGVuIHByb2Nlc3Npbmcgc3dpenpsZXMsIHRoZSBmaXJzdAorICAgICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgaXMgaW5kZXhlZCBpbiB0aGUgcHJldmlvdXMgdGFibGUuICBFYWNoIGNoYXJhY3RlcgorICAgICogaW4gdGhlIHN0cmluZyBpcyBpbmRleGVkIGluIHRoaXMgdGFibGUsIGFuZCB0aGUgdmFsdWUgZm91bmQgdGhlcmUgaGFzIHRoZQorICAgICogdmFsdWUgZm9ybSB0aGUgZmlyc3QgdGFibGUgc3VidHJhY3RlZC4gIFRoZSByZXN1bHQgbXVzdCBiZSBvbiB0aGUgcmFuZ2UKKyAgICAqIFswLDNdLgorICAgICoKKyAgICAqIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nICJ3enl4IiB3aWxsIGdldCBYIGZyb20gdGhlIGZpcnN0IHRhYmxlLiAgRWFjaCBvZgorICAgICogdGhlIGNoYXJjYXRlcnMgd2lsbCBnZXQgWCszLCBYKzIsIFgrMSwgYW5kIFgrMCBmcm9tIHRoaXMgdGFibGUuICBBZnRlcgorICAgICogc3VidHJhY3Rpb24sIHRoZSBzd2l6emxlIHZhbHVlcyBhcmUgeyAzLCAyLCAxLCAwIH0uCisgICAgKgorICAgICogVGhlIHN0cmluZyAid3pyZyIgd2lsbCBnZXQgWCBmcm9tIHRoZSBmaXJzdCB0YWJsZS4gIEVhY2ggb2YgdGhlIGNoYXJhY3RlcnMKKyAgICAqIHdpbGwgZ2V0IFgrMywgWCsyLCBSKzAsIGFuZCBSKzEgZnJvbSB0aGlzIHRhYmxlLiAgQWZ0ZXIgc3VidHJhY3Rpb24sIHRoZQorICAgICogc3dpenpsZSB2YWx1ZXMgYXJlIHsgMywgMiwgNCwgNSB9LiAgU2luY2UgNCBhbmQgNSBhcmUgb3V0c2lkZSB0aGUgcmFuZ2UKKyAgICAqIFswLDNdLCB0aGUgZXJyb3IgaXMgZGV0ZWN0ZWQuCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGlkeF9tYXBbMjZdID0geworICAgLyogYSAgICBiICAgIGMgICAgZCAgICBlICAgIGYgICAgZyAgICBoICAgIGkgICAgaiAgICBrICAgIGwgICAgbSAqLworICAgICAgUiszLCBSKzIsIDAsICAgMCwgICAwLCAgIDAsICAgUisxLCAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgIC8qIG4gICAgbyAgICBwICAgIHEgICAgciAgICBzICAgIHQgICAgdSAgICB2ICAgIHcgICAgeCAgICB5ICAgIHogKi8KKyAgICAgIDAsICAgMCwgICBTKzIsIFMrMywgUiswLCBTKzAsIFMrMSwgMCwgICAwLCAgIFgrMywgWCswLCBYKzEsIFgrMgorICAgfTsKKworICAgaW50IHN3aXpfaWR4WzRdID0geyAwLCAwLCAwLCAwIH07CisgICB1bnNpZ25lZCBpOworCisKKyAgIC8qIFZhbGlkYXRlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN3aXp6bGUgc3RyaW5nIGFuZCBsb29rIHVwIHRoZSBiYXNlCisgICAgKiBpbmRleCB2YWx1ZSBhcyBkZXNjcmliZWQgYWJvdmUuCisgICAgKi8KKyAgIGlmICgoc3RyWzBdIDwgJ2EnKSB8fCAoc3RyWzBdID4gJ3onKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBjb25zdCB1bnNpZ25lZCBiYXNlID0gYmFzZV9pZHhbc3RyWzBdIC0gJ2EnXTsKKworCisgICBmb3IgKGkgPSAwOyAoaSA8IDQpICYmIChzdHJbaV0gIT0gJ1wwJyk7IGkrKykgeworICAgICAgLyogVmFsaWRhdGUgdGhlIG5leHQgY2hhcmFjdGVyLCBhbmQsIGFzIGRlc2NyaWJlZCBhYm92ZSwgY29udmVydCBpdCB0byBhCisgICAgICAgKiBzd2l6emxlIGluZGV4LgorICAgICAgICovCisgICAgICBpZiAoKHN0cltpXSA8ICdhJykgfHwgKHN0cltpXSA+ICd6JykpCisJIHJldHVybiBOVUxMOworCisgICAgICBzd2l6X2lkeFtpXSA9IGlkeF9tYXBbc3RyW2ldIC0gJ2EnXSAtIGJhc2U7CisgICAgICBpZiAoKHN3aXpfaWR4W2ldIDwgMCkgfHwgKHN3aXpfaWR4W2ldID49IChpbnQpIHZlY3Rvcl9sZW5ndGgpKQorCSByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKHN0cltpXSAhPSAnXDAnKQorCSByZXR1cm4gTlVMTDsKKworICAgcmV0dXJuIG5ldyhjdHgpIGlyX3N3aXp6bGUodmFsLCBzd2l6X2lkeFswXSwgc3dpel9pZHhbMV0sIHN3aXpfaWR4WzJdLAorCQkJICAgICAgc3dpel9pZHhbM10sIGkpOworfQorCisjdW5kZWYgWAorI3VuZGVmIFIKKyN1bmRlZiBTCisjdW5kZWYgSQorCitpcl92YXJpYWJsZSAqCitpcl9zd2l6emxlOjp2YXJpYWJsZV9yZWZlcmVuY2VkKCkgY29uc3QKK3sKKyAgIHJldHVybiB0aGlzLT52YWwtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKK30KKworCitpcl92YXJpYWJsZTo6aXJfdmFyaWFibGUoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBpcl92YXJpYWJsZV9tb2RlIG1vZGUpCisgICA6IG1heF9pZmNfYXJyYXlfYWNjZXNzKE5VTEwpCit7CisgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV92YXJpYWJsZTsKKyAgIHRoaXMtPnR5cGUgPSB0eXBlOworICAgdGhpcy0+bmFtZSA9IHJhbGxvY19zdHJkdXAodGhpcywgbmFtZSk7CisgICB0aGlzLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uID0gZmFsc2U7CisgICB0aGlzLT5kYXRhLmhhc19pbml0aWFsaXplciA9IGZhbHNlOworICAgdGhpcy0+ZGF0YS5sb2NhdGlvbiA9IC0xOworICAgdGhpcy0+ZGF0YS5sb2NhdGlvbl9mcmFjID0gMDsKKyAgIHRoaXMtPndhcm5fZXh0ZW5zaW9uID0gTlVMTDsKKyAgIHRoaXMtPmNvbnN0YW50X3ZhbHVlID0gTlVMTDsKKyAgIHRoaXMtPmNvbnN0YW50X2luaXRpYWxpemVyID0gTlVMTDsKKyAgIHRoaXMtPmRhdGEub3JpZ2luX3VwcGVyX2xlZnQgPSBmYWxzZTsKKyAgIHRoaXMtPmRhdGEucGl4ZWxfY2VudGVyX2ludGVnZXIgPSBmYWxzZTsKKyAgIHRoaXMtPmRhdGEuZGVwdGhfbGF5b3V0ID0gaXJfZGVwdGhfbGF5b3V0X25vbmU7CisgICB0aGlzLT5kYXRhLnVzZWQgPSBmYWxzZTsKKyAgIHRoaXMtPmRhdGEucmVhZF9vbmx5ID0gZmFsc2U7CisgICB0aGlzLT5kYXRhLmNlbnRyb2lkID0gZmFsc2U7CisgICB0aGlzLT5kYXRhLnNhbXBsZSA9IGZhbHNlOworICAgdGhpcy0+ZGF0YS5pbnZhcmlhbnQgPSBmYWxzZTsKKyAgIHRoaXMtPmRhdGEuaG93X2RlY2xhcmVkID0gaXJfdmFyX2RlY2xhcmVkX25vcm1hbGx5OworICAgdGhpcy0+ZGF0YS5tb2RlID0gbW9kZTsKKyAgIHRoaXMtPmRhdGEuaW50ZXJwb2xhdGlvbiA9IElOVEVSUF9RVUFMSUZJRVJfTk9ORTsKKyAgIHRoaXMtPmRhdGEubWF4X2FycmF5X2FjY2VzcyA9IDA7CisgICB0aGlzLT5kYXRhLmF0b21pYy5idWZmZXJfaW5kZXggPSAwOworICAgdGhpcy0+ZGF0YS5hdG9taWMub2Zmc2V0ID0gMDsKKyAgIHRoaXMtPmRhdGEuaW1hZ2UucmVhZF9vbmx5ID0gZmFsc2U7CisgICB0aGlzLT5kYXRhLmltYWdlLndyaXRlX29ubHkgPSBmYWxzZTsKKyAgIHRoaXMtPmRhdGEuaW1hZ2UuY29oZXJlbnQgPSBmYWxzZTsKKyAgIHRoaXMtPmRhdGEuaW1hZ2UuX3ZvbGF0aWxlID0gZmFsc2U7CisgICB0aGlzLT5kYXRhLmltYWdlLnJlc3RyaWN0X2ZsYWcgPSBmYWxzZTsKKworICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfU0FNUExFUikKKyAgICAgICAgIHRoaXMtPmRhdGEucmVhZF9vbmx5ID0gdHJ1ZTsKKworICAgICAgaWYgKHR5cGUtPmlzX2ludGVyZmFjZSgpKQorICAgICAgICAgdGhpcy0+aW5pdF9pbnRlcmZhY2VfdHlwZSh0eXBlKTsKKyAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19pbnRlcmZhY2UoKSkKKyAgICAgICAgIHRoaXMtPmluaXRfaW50ZXJmYWNlX3R5cGUodHlwZS0+ZmllbGRzLmFycmF5KTsKKyAgIH0KK30KKworCitjb25zdCBjaGFyICoKK2ludGVycG9sYXRpb25fc3RyaW5nKHVuc2lnbmVkIGludGVycG9sYXRpb24pCit7CisgICBzd2l0Y2ggKGludGVycG9sYXRpb24pIHsKKyAgIGNhc2UgSU5URVJQX1FVQUxJRklFUl9OT05FOiAgICAgICAgICByZXR1cm4gIm5vIjsKKyAgIGNhc2UgSU5URVJQX1FVQUxJRklFUl9TTU9PVEg6ICAgICAgICByZXR1cm4gInNtb290aCI7CisgICBjYXNlIElOVEVSUF9RVUFMSUZJRVJfRkxBVDogICAgICAgICAgcmV0dXJuICJmbGF0IjsKKyAgIGNhc2UgSU5URVJQX1FVQUxJRklFUl9OT1BFUlNQRUNUSVZFOiByZXR1cm4gIm5vcGVyc3BlY3RpdmUiOworICAgfQorCisgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworICAgcmV0dXJuICIiOworfQorCisKK2dsc2xfaW50ZXJwX3F1YWxpZmllcgoraXJfdmFyaWFibGU6OmRldGVybWluZV9pbnRlcnBvbGF0aW9uX21vZGUoYm9vbCBmbGF0X3NoYWRlKQoreworICAgaWYgKHRoaXMtPmRhdGEuaW50ZXJwb2xhdGlvbiAhPSBJTlRFUlBfUVVBTElGSUVSX05PTkUpCisgICAgICByZXR1cm4gKGdsc2xfaW50ZXJwX3F1YWxpZmllcikgdGhpcy0+ZGF0YS5pbnRlcnBvbGF0aW9uOworICAgaW50IGxvY2F0aW9uID0gdGhpcy0+ZGF0YS5sb2NhdGlvbjsKKyAgIGJvb2wgaXNfZ2xfQ29sb3IgPQorICAgICAgbG9jYXRpb24gPT0gVkFSWUlOR19TTE9UX0NPTDAgfHwgbG9jYXRpb24gPT0gVkFSWUlOR19TTE9UX0NPTDE7CisgICBpZiAoZmxhdF9zaGFkZSAmJiBpc19nbF9Db2xvcikKKyAgICAgIHJldHVybiBJTlRFUlBfUVVBTElGSUVSX0ZMQVQ7CisgICBlbHNlCisgICAgICByZXR1cm4gSU5URVJQX1FVQUxJRklFUl9TTU9PVEg7Cit9CisKKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlOjppcl9mdW5jdGlvbl9zaWduYXR1cmUoY29uc3QgZ2xzbF90eXBlICpyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXZhaWxhYmxlX3ByZWRpY2F0ZSBiKQorICAgOiByZXR1cm5fdHlwZShyZXR1cm5fdHlwZSksIGlzX2RlZmluZWQoZmFsc2UpLCBpc19pbnRyaW5zaWMoZmFsc2UpLAorICAgICBidWlsdGluX2F2YWlsKGIpLCBfZnVuY3Rpb24oTlVMTCkKK3sKKyAgIHRoaXMtPmlyX3R5cGUgPSBpcl90eXBlX2Z1bmN0aW9uX3NpZ25hdHVyZTsKKyAgIHRoaXMtPm9yaWdpbiA9IE5VTEw7Cit9CisKKworYm9vbAoraXJfZnVuY3Rpb25fc2lnbmF0dXJlOjppc19idWlsdGluKCkgY29uc3QKK3sKKyAgIHJldHVybiBidWlsdGluX2F2YWlsICE9IE5VTEw7Cit9CisKKworYm9vbAoraXJfZnVuY3Rpb25fc2lnbmF0dXJlOjppc19idWlsdGluX2F2YWlsYWJsZShjb25zdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkgY29uc3QKK3sKKyAgIC8qIFdlIGNhbid0IGNhbGwgdGhlIHByZWRpY2F0ZSB3aXRob3V0IGEgc3RhdGUgcG9pbnRlciwgc28ganVzdCBzYXkgdGhhdAorICAgICogdGhlIHNpZ25hdHVyZSBpcyBhdmFpbGFibGUuICBBdCBjb21waWxlIHRpbWUsIHdlIG5lZWQgdGhlIGZpbHRlcmluZywKKyAgICAqIGJ1dCBhbHNvIHJlY2VpdmUgYSB2YWxpZCBzdGF0ZSBwb2ludGVyLiAgQXQgbGluayB0aW1lLCB3ZSdyZSByZXNvbHZpbmcKKyAgICAqIGltcG9ydGVkIGJ1aWx0LWluIHByb3RvdHlwZXMgdG8gdGhlaXIgZGVmaW5pdGlvbnMsIHdoaWNoIHdpbGwgYWx3YXlzCisgICAgKiBiZSBhbiBleGFjdCBtYXRjaC4gIFNvIHdlIGNhbiBza2lwIHRoZSBmaWx0ZXJpbmcuCisgICAgKi8KKyAgIGlmIChzdGF0ZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgIGFzc2VydChidWlsdGluX2F2YWlsICE9IE5VTEwpOworICAgcmV0dXJuIGJ1aWx0aW5fYXZhaWwoc3RhdGUpOworfQorCisKK3N0YXRpYyBib29sCittb2Rlc19tYXRjaCh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQoreworICAgaWYgKGEgPT0gYikKKyAgICAgIHJldHVybiB0cnVlOworCisgICAvKiBBY2NlcHQgImluIiB2cy4gImNvbnN0IGluIiAqLworICAgaWYgKChhID09IGlyX3Zhcl9jb25zdF9pbiAmJiBiID09IGlyX3Zhcl9mdW5jdGlvbl9pbikgfHwKKyAgICAgICAoYiA9PSBpcl92YXJfY29uc3RfaW4gJiYgYSA9PSBpcl92YXJfZnVuY3Rpb25faW4pKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgIHJldHVybiBmYWxzZTsKK30KKworCitjb25zdCBjaGFyICoKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZTo6cXVhbGlmaWVyc19tYXRjaChleGVjX2xpc3QgKnBhcmFtcykKK3sKKyAgIC8qIGNoZWNrIHRoYXQgdGhlIHF1YWxpZmllcnMgbWF0Y2guICovCisgICBmb3JlYWNoX3R3b19saXN0cyhhX25vZGUsICZ0aGlzLT5wYXJhbWV0ZXJzLCBiX25vZGUsIHBhcmFtcykgeworICAgICAgaXJfdmFyaWFibGUgKmEgPSAoaXJfdmFyaWFibGUgKikgYV9ub2RlOworICAgICAgaXJfdmFyaWFibGUgKmIgPSAoaXJfdmFyaWFibGUgKikgYl9ub2RlOworCisgICAgICBpZiAoYS0+ZGF0YS5yZWFkX29ubHkgIT0gYi0+ZGF0YS5yZWFkX29ubHkgfHwKKwkgICFtb2Rlc19tYXRjaChhLT5kYXRhLm1vZGUsIGItPmRhdGEubW9kZSkgfHwKKwkgIGEtPmRhdGEuaW50ZXJwb2xhdGlvbiAhPSBiLT5kYXRhLmludGVycG9sYXRpb24gfHwKKwkgIGEtPmRhdGEuY2VudHJvaWQgIT0gYi0+ZGF0YS5jZW50cm9pZCB8fAorICAgICAgICAgIGEtPmRhdGEuc2FtcGxlICE9IGItPmRhdGEuc2FtcGxlIHx8CisgICAgICAgICAgYS0+ZGF0YS5pbWFnZS5yZWFkX29ubHkgIT0gYi0+ZGF0YS5pbWFnZS5yZWFkX29ubHkgfHwKKyAgICAgICAgICBhLT5kYXRhLmltYWdlLndyaXRlX29ubHkgIT0gYi0+ZGF0YS5pbWFnZS53cml0ZV9vbmx5IHx8CisgICAgICAgICAgYS0+ZGF0YS5pbWFnZS5jb2hlcmVudCAhPSBiLT5kYXRhLmltYWdlLmNvaGVyZW50IHx8CisgICAgICAgICAgYS0+ZGF0YS5pbWFnZS5fdm9sYXRpbGUgIT0gYi0+ZGF0YS5pbWFnZS5fdm9sYXRpbGUgfHwKKyAgICAgICAgICBhLT5kYXRhLmltYWdlLnJlc3RyaWN0X2ZsYWcgIT0gYi0+ZGF0YS5pbWFnZS5yZXN0cmljdF9mbGFnKSB7CisKKwkgLyogcGFyYW1ldGVyIGEncyBxdWFsaWZpZXJzIGRvbid0IG1hdGNoICovCisJIHJldHVybiBhLT5uYW1lOworICAgICAgfQorICAgfQorICAgcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZAoraXJfZnVuY3Rpb25fc2lnbmF0dXJlOjpyZXBsYWNlX3BhcmFtZXRlcnMoZXhlY19saXN0ICpuZXdfcGFyYW1zKQoreworICAgLyogRGVzdHJveSBhbGwgb2YgdGhlIHByZXZpb3VzIHBhcmFtZXRlciBpbmZvcm1hdGlvbi4gIElmIHRoZSBwcmV2aW91cworICAgICogcGFyYW1ldGVyIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSwgaXQgbWF5IGVpdGhlcgorICAgICogc3BlY2lmeSBpbmNvcnJlY3QgcGFyYW1ldGVyIG5hbWVzIG9yIG5vdCBoYXZlIG5hbWVzIGF0IGFsbC4KKyAgICAqLworICAgbmV3X3BhcmFtcy0+bW92ZV9ub2Rlc190bygmcGFyYW1ldGVycyk7Cit9CisKKworaXJfZnVuY3Rpb246OmlyX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICB0aGlzLT5pcl90eXBlID0gaXJfdHlwZV9mdW5jdGlvbjsKKyAgIHRoaXMtPm5hbWUgPSByYWxsb2Nfc3RyZHVwKHRoaXMsIG5hbWUpOworfQorCisKK2Jvb2wKK2lyX2Z1bmN0aW9uOjpoYXNfdXNlcl9zaWduYXR1cmUoKQoreworICAgZm9yZWFjaF9saXN0KG4sICZ0aGlzLT5zaWduYXR1cmVzKSB7CisgICAgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmNvbnN0IHNpZyA9IChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKikgbjsKKyAgICAgIGlmICghc2lnLT5pc19idWlsdGluKCkpCisJIHJldHVybiB0cnVlOworICAgfQorICAgcmV0dXJuIGZhbHNlOworfQorCisKK2lyX3J2YWx1ZSAqCitpcl9ydmFsdWU6OmVycm9yX3ZhbHVlKHZvaWQgKm1lbV9jdHgpCit7CisgICBpcl9ydmFsdWUgKnYgPSBuZXcobWVtX2N0eCkgaXJfcnZhbHVlOworCisgICB2LT50eXBlID0gZ2xzbF90eXBlOjplcnJvcl90eXBlOworICAgcmV0dXJuIHY7Cit9CisKKwordm9pZAordmlzaXRfZXhlY19saXN0KGV4ZWNfbGlzdCAqbGlzdCwgaXJfdmlzaXRvciAqdmlzaXRvcikKK3sKKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG4sIGxpc3QpIHsKKyAgICAgICgoaXJfaW5zdHJ1Y3Rpb24gKikgbiktPmFjY2VwdCh2aXNpdG9yKTsKKyAgIH0KK30KKworCitzdGF0aWMgdm9pZAorc3RlYWxfbWVtb3J5KGlyX2luc3RydWN0aW9uICppciwgdm9pZCAqbmV3X2N0eCkKK3sKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBpci0+YXNfdmFyaWFibGUoKTsKKyAgIGlyX2NvbnN0YW50ICpjb25zdGFudCA9IGlyLT5hc19jb25zdGFudCgpOworICAgaWYgKHZhciAhPSBOVUxMICYmIHZhci0+Y29uc3RhbnRfdmFsdWUgIT0gTlVMTCkKKyAgICAgIHN0ZWFsX21lbW9yeSh2YXItPmNvbnN0YW50X3ZhbHVlLCBpcik7CisKKyAgIGlmICh2YXIgIT0gTlVMTCAmJiB2YXItPmNvbnN0YW50X2luaXRpYWxpemVyICE9IE5VTEwpCisgICAgICBzdGVhbF9tZW1vcnkodmFyLT5jb25zdGFudF9pbml0aWFsaXplciwgaXIpOworCisgICAvKiBUaGUgY29tcG9uZW50cyBvZiBhZ2dyZWdhdGUgY29uc3RhbnRzIGFyZSBub3QgdmlzaXRlZCBieSB0aGUgbm9ybWFsCisgICAgKiB2aXNpdG9yLCBzbyBzdGVhbCB0aGVpciB2YWx1ZXMgYnkgaGFuZC4KKyAgICAqLworICAgaWYgKGNvbnN0YW50ICE9IE5VTEwpIHsKKyAgICAgIGlmIChjb25zdGFudC0+dHlwZS0+aXNfcmVjb3JkKCkpIHsKKwkgZm9yZWFjaF9saXN0KG4sICZjb25zdGFudC0+Y29tcG9uZW50cykgeworCSAgICBpcl9jb25zdGFudCAqZmllbGQgPSAoaXJfY29uc3RhbnQgKikgbjsKKwkgICAgc3RlYWxfbWVtb3J5KGZpZWxkLCBpcik7CisJIH0KKyAgICAgIH0gZWxzZSBpZiAoY29uc3RhbnQtPnR5cGUtPmlzX2FycmF5KCkpIHsKKwkgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb25zdGFudC0+dHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgICAgc3RlYWxfbWVtb3J5KGNvbnN0YW50LT5hcnJheV9lbGVtZW50c1tpXSwgaXIpOworCSB9CisgICAgICB9CisgICB9CisKKyAgIHJhbGxvY19zdGVhbChuZXdfY3R4LCBpcik7Cit9CisKKwordm9pZAorcmVwYXJlbnRfaXIoZXhlY19saXN0ICpsaXN0LCB2b2lkICptZW1fY3R4KQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsIGxpc3QpIHsKKyAgICAgIHZpc2l0X3RyZWUoKGlyX2luc3RydWN0aW9uICopIG5vZGUsIHN0ZWFsX21lbW9yeSwgbWVtX2N0eCk7CisgICB9Cit9CisKKworc3RhdGljIGlyX3J2YWx1ZSAqCit0cnlfbWluX29uZShpcl9ydmFsdWUgKmlyKQoreworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IGlyLT5hc19leHByZXNzaW9uKCk7CisKKyAgIGlmICghZXhwciB8fCBleHByLT5vcGVyYXRpb24gIT0gaXJfYmlub3BfbWluKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGlmIChleHByLT5vcGVyYW5kc1swXS0+aXNfb25lKCkpCisgICAgICByZXR1cm4gZXhwci0+b3BlcmFuZHNbMV07CisKKyAgIGlmIChleHByLT5vcGVyYW5kc1sxXS0+aXNfb25lKCkpCisgICAgICByZXR1cm4gZXhwci0+b3BlcmFuZHNbMF07CisKKyAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaXJfcnZhbHVlICoKK3RyeV9tYXhfemVybyhpcl9ydmFsdWUgKmlyKQoreworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IGlyLT5hc19leHByZXNzaW9uKCk7CisKKyAgIGlmICghZXhwciB8fCBleHByLT5vcGVyYXRpb24gIT0gaXJfYmlub3BfbWF4KQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGlmIChleHByLT5vcGVyYW5kc1swXS0+aXNfemVybygpKQorICAgICAgcmV0dXJuIGV4cHItPm9wZXJhbmRzWzFdOworCisgICBpZiAoZXhwci0+b3BlcmFuZHNbMV0tPmlzX3plcm8oKSkKKyAgICAgIHJldHVybiBleHByLT5vcGVyYW5kc1swXTsKKworICAgcmV0dXJuIE5VTEw7Cit9CisKK2lyX3J2YWx1ZSAqCitpcl9ydmFsdWU6OmFzX3J2YWx1ZV90b19zYXR1cmF0ZSgpCit7CisgICBpcl9leHByZXNzaW9uICpleHByID0gdGhpcy0+YXNfZXhwcmVzc2lvbigpOworCisgICBpZiAoIWV4cHIpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaXJfcnZhbHVlICptYXhfemVybyA9IHRyeV9tYXhfemVybyhleHByKTsKKyAgIGlmIChtYXhfemVybykgeworICAgICAgcmV0dXJuIHRyeV9taW5fb25lKG1heF96ZXJvKTsKKyAgIH0gZWxzZSB7CisgICAgICBpcl9ydmFsdWUgKm1pbl9vbmUgPSB0cnlfbWluX29uZShleHByKTsKKyAgICAgIGlmIChtaW5fb25lKSB7CisJIHJldHVybiB0cnlfbWF4X3plcm8obWluX29uZSk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorCisKK3Vuc2lnbmVkCit2ZXJ0aWNlc19wZXJfcHJpbShHTGVudW0gcHJpbSkKK3sKKyAgIHN3aXRjaCAocHJpbSkgeworICAgY2FzZSBHTF9QT0lOVFM6CisgICAgICByZXR1cm4gMTsKKyAgIGNhc2UgR0xfTElORVM6CisgICAgICByZXR1cm4gMjsKKyAgIGNhc2UgR0xfVFJJQU5HTEVTOgorICAgICAgcmV0dXJuIDM7CisgICBjYXNlIEdMX0xJTkVTX0FESkFDRU5DWToKKyAgICAgIHJldHVybiA0OworICAgY2FzZSBHTF9UUklBTkdMRVNfQURKQUNFTkNZOgorICAgICAgcmV0dXJuIDY7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiQmFkIHByaW1pdGl2ZSIpOworICAgICAgcmV0dXJuIDM7CisgICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbW9kZSBvZiBhIHZhcmlhYmxlCisgKi8KK2NvbnN0IGNoYXIgKgorbW9kZV9zdHJpbmcoY29uc3QgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIHN3aXRjaCAodmFyLT5kYXRhLm1vZGUpIHsKKyAgIGNhc2UgaXJfdmFyX2F1dG86CisgICAgICByZXR1cm4gKHZhci0+ZGF0YS5yZWFkX29ubHkpID8gImdsb2JhbCBjb25zdGFudCIgOiAiZ2xvYmFsIHZhcmlhYmxlIjsKKworICAgY2FzZSBpcl92YXJfdW5pZm9ybToKKyAgICAgIHJldHVybiAidW5pZm9ybSI7CisKKyAgIGNhc2UgaXJfdmFyX3NoYWRlcl9pbjoKKyAgICAgIHJldHVybiAic2hhZGVyIGlucHV0IjsKKworICAgY2FzZSBpcl92YXJfc2hhZGVyX291dDoKKyAgICAgIHJldHVybiAic2hhZGVyIG91dHB1dCI7CisKKyAgIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX2luOgorICAgY2FzZSBpcl92YXJfY29uc3RfaW46CisgICAgICByZXR1cm4gImZ1bmN0aW9uIGlucHV0IjsKKworICAgY2FzZSBpcl92YXJfZnVuY3Rpb25fb3V0OgorICAgICAgcmV0dXJuICJmdW5jdGlvbiBvdXRwdXQiOworCisgICBjYXNlIGlyX3Zhcl9mdW5jdGlvbl9pbm91dDoKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gaW5vdXQiOworCisgICBjYXNlIGlyX3Zhcl9zeXN0ZW1fdmFsdWU6CisgICAgICByZXR1cm4gInNoYWRlciBpbnB1dCI7CisKKyAgIGNhc2UgaXJfdmFyX3RlbXBvcmFyeToKKyAgICAgIHJldHVybiAiY29tcGlsZXIgdGVtcG9yYXJ5IjsKKworICAgY2FzZSBpcl92YXJfbW9kZV9jb3VudDoKKyAgICAgIGJyZWFrOworICAgfQorCisgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworICAgcmV0dXJuICJpbnZhbGlkIHZhcmlhYmxlIjsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfYmFzaWNfYmxvY2suY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9iYXNpY19ibG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ZmRhMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfYmFzaWNfYmxvY2suY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBpcl9iYXNpY19ibG9jay5jcHAKKyAqCisgKiBCYXNpYyBibG9jayBhbmFseXNpcyBvZiBpbnN0cnVjdGlvbiBzdHJlYW1zLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9iYXNpY19ibG9jay5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworLyoqCisgKiBDYWxscyBhIHVzZXIgZnVuY3Rpb24gZm9yIGV2ZXJ5IGJhc2ljIGJsb2NrIGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uCisgKgorICogQmFzaWMgYmxvY2sgYW5hbHlzaXMgaXMgcHJldHR5IGVhc3kgaW4gb3VyIElSIHRoYW5rcyB0byB0aGUgbGFjayBvZgorICogdW5zdHJ1Y3R1cmVkIGNvbnRyb2wgZmxvdy4gIFdlJ3ZlIGdvdDoKKyAqCisgKiBpcl9sb29wIChmb3IgKCkge30sIHdoaWxlICgpIHt9LCBkbyB7fSB3aGlsZSAoKSkKKyAqIGlyX2xvb3BfanVtcCAoCisgKiBpcl9pZiAoKSB7fQorICogaXJfcmV0dXJuCisgKiBpcl9jYWxsKCkKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGJhc2ljIGJsb2NrcyByZXR1cm5lZCBieSB0aGlzIGRvbid0IGVuY29tcGFzcyBhbGwKKyAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBwcm9ncmFtIC0tIGZvciBleGFtcGxlLCBpZiBjb25kaXRpb25zCisgKiBkb24ndCBnZXQgcmV0dXJuZWQsIG5vciBkbyB0aGUgYXNzaWdubWVudHMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZAorICogZm9yIGlyX2NhbGwgcGFyYW1ldGVycy4KKyAqLwordm9pZCBjYWxsX2Zvcl9iYXNpY19ibG9ja3MoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgICB2b2lkICgqY2FsbGJhY2spKGlyX2luc3RydWN0aW9uICpmaXJzdCwKKwkJCQkJICAgIGlyX2luc3RydWN0aW9uICpsYXN0LAorCQkJCQkgICAgdm9pZCAqZGF0YSksCisJCQkgICB2b2lkICpkYXRhKQoreworICAgaXJfaW5zdHJ1Y3Rpb24gKmxlYWRlciA9IE5VTEw7CisgICBpcl9pbnN0cnVjdGlvbiAqbGFzdCA9IE5VTEw7CisKKyAgIGZvcmVhY2hfbGlzdChuLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworICAgICAgaXJfaWYgKmlyX2lmOworICAgICAgaXJfbG9vcCAqaXJfbG9vcDsKKyAgICAgIGlyX2Z1bmN0aW9uICppcl9mdW5jdGlvbjsKKworICAgICAgaWYgKCFsZWFkZXIpCisJIGxlYWRlciA9IGlyOworCisgICAgICBpZiAoKGlyX2lmID0gaXItPmFzX2lmKCkpKSB7CisJIGNhbGxiYWNrKGxlYWRlciwgaXIsIGRhdGEpOworCSBsZWFkZXIgPSBOVUxMOworCisJIGNhbGxfZm9yX2Jhc2ljX2Jsb2NrcygmaXJfaWYtPnRoZW5faW5zdHJ1Y3Rpb25zLCBjYWxsYmFjaywgZGF0YSk7CisJIGNhbGxfZm9yX2Jhc2ljX2Jsb2NrcygmaXJfaWYtPmVsc2VfaW5zdHJ1Y3Rpb25zLCBjYWxsYmFjaywgZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKChpcl9sb29wID0gaXItPmFzX2xvb3AoKSkpIHsKKwkgY2FsbGJhY2sobGVhZGVyLCBpciwgZGF0YSk7CisJIGxlYWRlciA9IE5VTEw7CisJIGNhbGxfZm9yX2Jhc2ljX2Jsb2NrcygmaXJfbG9vcC0+Ym9keV9pbnN0cnVjdGlvbnMsIGNhbGxiYWNrLCBkYXRhKTsKKyAgICAgIH0gZWxzZSBpZiAoaXItPmFzX2p1bXAoKSB8fCBpci0+YXNfY2FsbCgpKSB7CisJIGNhbGxiYWNrKGxlYWRlciwgaXIsIGRhdGEpOworCSBsZWFkZXIgPSBOVUxMOworICAgICAgfSBlbHNlIGlmICgoaXJfZnVuY3Rpb24gPSBpci0+YXNfZnVuY3Rpb24oKSkpIHsKKwkgLyogQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXNuJ3QgaW50ZXJydXB0IG91ciBiYXNpYyBibG9jaworCSAgKiBzaW5jZSBleGVjdXRpb24gZG9lc24ndCBnbyBpbnRvIGl0LiAgV2Ugc2hvdWxkIHByb2Nlc3MgdGhlCisJICAqIGJvZGllcyBvZiBpdHMgc2lnbmF0dXJlcyBmb3IgQkJzLCB0aG91Z2guCisJICAqCisJICAqIE5vdGUgdGhhdCB3ZSBtaXNzIGFuIG9wcG9ydHVuaXR5IGZvciBwcm9kdWNpbmcgbW9yZQorCSAgKiBtYXhpbWFsIEJCcyBiZXR3ZWVuIHRoZSBpbnN0cnVjdGlvbnMgdGhhdCBwcmVjZWRlIG1haW4oKQorCSAgKiBhbmQgdGhlIGJvZHkgb2YgbWFpbigpLiAgUGVyaGFwcyB0aG9zZSBpbnN0cnVjdGlvbnMgb3VnaHQKKwkgICogdG8gbGl2ZSBpbnNpZGUgb2YgbWFpbigpLgorCSAgKi8KKwkgZm9yZWFjaF9saXN0KGZ1bmNfbm9kZSwgJmlyX2Z1bmN0aW9uLT5zaWduYXR1cmVzKSB7CisJICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqaXJfc2lnID0gKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKSBmdW5jX25vZGU7CisKKwkgICAgY2FsbF9mb3JfYmFzaWNfYmxvY2tzKCZpcl9zaWctPmJvZHksIGNhbGxiYWNrLCBkYXRhKTsKKwkgfQorICAgICAgfQorICAgICAgbGFzdCA9IGlyOworICAgfQorICAgaWYgKGxlYWRlcikgeworICAgICAgY2FsbGJhY2sobGVhZGVyLCBsYXN0LCBkYXRhKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfYmFzaWNfYmxvY2suaCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfYmFzaWNfYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQ2NzhiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9iYXNpY19ibG9jay5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCit2b2lkIGNhbGxfZm9yX2Jhc2ljX2Jsb2NrcyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgIHZvaWQgKCpjYWxsYmFjaykoaXJfaW5zdHJ1Y3Rpb24gKmZpcnN0LAorCQkJCQkgICAgaXJfaW5zdHJ1Y3Rpb24gKmxhc3QsCisJCQkJCSAgICB2b2lkICpkYXRhKSwKKwkJCSAgIHZvaWQgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9idWlsZGVyLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfYnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfYnVpbGRlci5jcHAKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaXJfYnVpbGRlci5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5oIgorCit1c2luZyBuYW1lc3BhY2UgaXJfYnVpbGRlcjsKKworbmFtZXNwYWNlIGlyX2J1aWxkZXIgeworCit2b2lkCitpcl9mYWN0b3J5OjplbWl0KGlyX2luc3RydWN0aW9uICppcikKK3sKKyAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKGlyKTsKK30KKworaXJfdmFyaWFibGUgKgoraXJfZmFjdG9yeTo6bWFrZV90ZW1wKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp2YXI7CisKKyAgIHZhciA9IG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZSh0eXBlLCBuYW1lLCBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGVtaXQodmFyKTsKKworICAgcmV0dXJuIHZhcjsKK30KKworaXJfYXNzaWdubWVudCAqCithc3NpZ24oZGVyZWYgbGhzLCBvcGVyYW5kIHJocywgb3BlcmFuZCBjb25kaXRpb24sIGludCB3cml0ZW1hc2spCit7CisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX3BhcmVudChsaHMudmFsKTsKKworICAgaXJfYXNzaWdubWVudCAqYXNzaWduID0gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobGhzLnZhbCwKKwkJCQkJCSAgICAgIHJocy52YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24udmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVtYXNrKTsKKworICAgcmV0dXJuIGFzc2lnbjsKK30KKworaXJfYXNzaWdubWVudCAqCithc3NpZ24oZGVyZWYgbGhzLCBvcGVyYW5kIHJocykKK3sKKyAgIHJldHVybiBhc3NpZ24obGhzLCByaHMsICgxIDw8IGxocy52YWwtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgLSAxKTsKK30KKworaXJfYXNzaWdubWVudCAqCithc3NpZ24oZGVyZWYgbGhzLCBvcGVyYW5kIHJocywgaW50IHdyaXRlbWFzaykKK3sKKyAgIHJldHVybiBhc3NpZ24obGhzLCByaHMsIChpcl9ydmFsdWUgKikgTlVMTCwgd3JpdGVtYXNrKTsKK30KKworaXJfYXNzaWdubWVudCAqCithc3NpZ24oZGVyZWYgbGhzLCBvcGVyYW5kIHJocywgb3BlcmFuZCBjb25kaXRpb24pCit7CisgICByZXR1cm4gYXNzaWduKGxocywgcmhzLCBjb25kaXRpb24sICgxIDw8IGxocy52YWwtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgLSAxKTsKK30KKworaXJfcmV0dXJuICoKK3JldChvcGVyYW5kIHJldHZhbCkKK3sKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KHJldHZhbC52YWwpOworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9yZXR1cm4ocmV0dmFsLnZhbCk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZShvcGVyYW5kIGEsIGludCBzd2l6emxlLCBpbnQgY29tcG9uZW50cykKK3sKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KGEudmFsKTsKKworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9zd2l6emxlKGEudmFsLAorCQkJCSAgR0VUX1NXWihzd2l6emxlLCAwKSwKKwkJCQkgIEdFVF9TV1ooc3dpenpsZSwgMSksCisJCQkJICBHRVRfU1daKHN3aXp6bGUsIDIpLAorCQkJCSAgR0VUX1NXWihzd2l6emxlLCAzKSwKKwkJCQkgIGNvbXBvbmVudHMpOworfQorCitpcl9zd2l6emxlICoKK3N3aXp6bGVfZm9yX3NpemUob3BlcmFuZCBhLCB1bnNpZ25lZCBjb21wb25lbnRzKQoreworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoYS52YWwpOworCisgICBpZiAoYS52YWwtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyA8IGNvbXBvbmVudHMpCisgICAgICBjb21wb25lbnRzID0gYS52YWwtPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsKKworICAgdW5zaWduZWQgc1s0XSA9IHsgMCwgMSwgMiwgMyB9OworICAgZm9yIChpbnQgaSA9IGNvbXBvbmVudHM7IGkgPCA0OyBpKyspCisgICAgICBzW2ldID0gY29tcG9uZW50cyAtIDE7CisKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfc3dpenpsZShhLnZhbCwgcywgY29tcG9uZW50cyk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV94eHh4KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWFhYWCwgNCk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV95eXl5KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWVlZWSwgNCk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV96enp6KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWlpaWiwgNCk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV93d3d3KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfV1dXVywgNCk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV94KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWFhYWCwgMSk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV95KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWVlZWSwgMSk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV96KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWlpaWiwgMSk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV93KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfV1dXVywgMSk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV94eShvcGVyYW5kIGEpCit7CisgICByZXR1cm4gc3dpenpsZShhLCBTV0laWkxFX1hZWlcsIDIpOworfQorCitpcl9zd2l6emxlICoKK3N3aXp6bGVfeHl6KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWFlaVywgMyk7Cit9CisKK2lyX3N3aXp6bGUgKgorc3dpenpsZV94eXp3KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBzd2l6emxlKGEsIFNXSVpaTEVfWFlaVywgNCk7Cit9CisKK2lyX2V4cHJlc3Npb24gKgorZXhwcihpcl9leHByZXNzaW9uX29wZXJhdGlvbiBvcCwgb3BlcmFuZCBhKQoreworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoYS52YWwpOworCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24ob3AsIGEudmFsKTsKK30KKworaXJfZXhwcmVzc2lvbiAqCitleHByKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wLCBvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KGEudmFsKTsKKworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKG9wLCBhLnZhbCwgYi52YWwpOworfQorCitpcl9leHByZXNzaW9uICoKK2V4cHIoaXJfZXhwcmVzc2lvbl9vcGVyYXRpb24gb3AsIG9wZXJhbmQgYSwgb3BlcmFuZCBiLCBvcGVyYW5kIGMpCit7CisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX3BhcmVudChhLnZhbCk7CisKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihvcCwgYS52YWwsIGIudmFsLCBjLnZhbCk7Cit9CisKK2lyX2V4cHJlc3Npb24gKmFkZChvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX2FkZCwgYSwgYik7Cit9CisKK2lyX2V4cHJlc3Npb24gKnN1YihvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX3N1YiwgYSwgYik7Cit9CisKK2lyX2V4cHJlc3Npb24gKm1pbjIob3BlcmFuZCBhLCBvcGVyYW5kIGIpCit7CisgICByZXR1cm4gZXhwcihpcl9iaW5vcF9taW4sIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uICptYXgyKG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfbWF4LCBhLCBiKTsKK30KKworaXJfZXhwcmVzc2lvbiAqbXVsKG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfbXVsLCBhLCBiKTsKK30KKworaXJfZXhwcmVzc2lvbiAqaW11bF9oaWdoKG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfaW11bF9oaWdoLCBhLCBiKTsKK30KKworaXJfZXhwcmVzc2lvbiAqZGl2KG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfZGl2LCBhLCBiKTsKK30KKworaXJfZXhwcmVzc2lvbiAqY2Fycnkob3BlcmFuZCBhLCBvcGVyYW5kIGIpCit7CisgICByZXR1cm4gZXhwcihpcl9iaW5vcF9jYXJyeSwgYSwgYik7Cit9CisKK2lyX2V4cHJlc3Npb24gKmJvcnJvdyhvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX2JvcnJvdywgYSwgYik7Cit9CisKK2lyX2V4cHJlc3Npb24gKnJvdW5kX2V2ZW4ob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9yb3VuZF9ldmVuLCBhKTsKK30KKworLyogZG90IGZvciB2ZWN0b3JzLCBtdWwgZm9yIHNjYWxhcnMgKi8KK2lyX2V4cHJlc3Npb24gKmRvdChvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIGFzc2VydChhLnZhbC0+dHlwZSA9PSBiLnZhbC0+dHlwZSk7CisKKyAgIGlmIChhLnZhbC0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzID09IDEpCisgICAgICByZXR1cm4gZXhwcihpcl9iaW5vcF9tdWwsIGEsIGIpOworCisgICByZXR1cm4gZXhwcihpcl9iaW5vcF9kb3QsIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uKgorY2xhbXAob3BlcmFuZCBhLCBvcGVyYW5kIGIsIG9wZXJhbmQgYykKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX21pbiwgZXhwcihpcl9iaW5vcF9tYXgsIGEsIGIpLCBjKTsKK30KKworaXJfZXhwcmVzc2lvbiAqCitzYXR1cmF0ZShvcGVyYW5kIGEpCit7CisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX3BhcmVudChhLnZhbCk7CisKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX21heCwKKwkgICAgICAgZXhwcihpcl9iaW5vcF9taW4sIGEsIG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudCgxLjBmKSksCisJICAgICAgIG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudCgwLjBmKSk7Cit9CisKK2lyX2V4cHJlc3Npb24gKgorYWJzKG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfYWJzLCBhKTsKK30KKworaXJfZXhwcmVzc2lvbiAqCituZWcob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9uZWcsIGEpOworfQorCitpcl9leHByZXNzaW9uICoKK3NpbihvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX3NpbiwgYSk7Cit9CisKK2lyX2V4cHJlc3Npb24gKgorY29zKG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfY29zLCBhKTsKK30KKworaXJfZXhwcmVzc2lvbiAqCitleHAob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9leHAsIGEpOworfQorCitpcl9leHByZXNzaW9uICoKK3JzcShvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX3JzcSwgYSk7Cit9CisKK2lyX2V4cHJlc3Npb24gKgorc3FydChvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX3NxcnQsIGEpOworfQorCitpcl9leHByZXNzaW9uICoKK2xvZyhvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX2xvZywgYSk7Cit9CisKK2lyX2V4cHJlc3Npb24gKgorc2lnbihvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX3NpZ24sIGEpOworfQorCitpcl9leHByZXNzaW9uKgorZXF1YWwob3BlcmFuZCBhLCBvcGVyYW5kIGIpCit7CisgICByZXR1cm4gZXhwcihpcl9iaW5vcF9lcXVhbCwgYSwgYik7Cit9CisKK2lyX2V4cHJlc3Npb24qCituZXF1YWwob3BlcmFuZCBhLCBvcGVyYW5kIGIpCit7CisgICByZXR1cm4gZXhwcihpcl9iaW5vcF9uZXF1YWwsIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uKgorbGVzcyhvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX2xlc3MsIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uKgorZ3JlYXRlcihvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX2dyZWF0ZXIsIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uKgorbGVxdWFsKG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfbGVxdWFsLCBhLCBiKTsKK30KKworaXJfZXhwcmVzc2lvbioKK2dlcXVhbChvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX2dlcXVhbCwgYSwgYik7Cit9CisKK2lyX2V4cHJlc3Npb24qCitsb2dpY19ub3Qob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9sb2dpY19ub3QsIGEpOworfQorCitpcl9leHByZXNzaW9uKgorbG9naWNfYW5kKG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfbG9naWNfYW5kLCBhLCBiKTsKK30KKworaXJfZXhwcmVzc2lvbioKK2xvZ2ljX29yKG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfbG9naWNfb3IsIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uKgorYml0X25vdChvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX2JpdF9ub3QsIGEpOworfQorCitpcl9leHByZXNzaW9uKgorYml0X2FuZChvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX2JpdF9hbmQsIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uKgorYml0X29yKG9wZXJhbmQgYSwgb3BlcmFuZCBiKQoreworICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfYml0X29yLCBhLCBiKTsKK30KKworaXJfZXhwcmVzc2lvbioKK2xzaGlmdChvcGVyYW5kIGEsIG9wZXJhbmQgYikKK3sKKyAgIHJldHVybiBleHByKGlyX2Jpbm9wX2xzaGlmdCwgYSwgYik7Cit9CisKK2lyX2V4cHJlc3Npb24qCityc2hpZnQob3BlcmFuZCBhLCBvcGVyYW5kIGIpCit7CisgICByZXR1cm4gZXhwcihpcl9iaW5vcF9yc2hpZnQsIGEsIGIpOworfQorCitpcl9leHByZXNzaW9uKgorZjJpKG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfZjJpLCBhKTsKK30KKworaXJfZXhwcmVzc2lvbioKK2JpdGNhc3RfZjJpKG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfYml0Y2FzdF9mMmksIGEpOworfQorCitpcl9leHByZXNzaW9uKgoraTJmKG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfaTJmLCBhKTsKK30KKworaXJfZXhwcmVzc2lvbioKK2JpdGNhc3RfaTJmKG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfYml0Y2FzdF9pMmYsIGEpOworfQorCitpcl9leHByZXNzaW9uKgoraTJ1KG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfaTJ1LCBhKTsKK30KKworaXJfZXhwcmVzc2lvbioKK3UyaShvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX3UyaSwgYSk7Cit9CisKK2lyX2V4cHJlc3Npb24qCitmMnUob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9mMnUsIGEpOworfQorCitpcl9leHByZXNzaW9uKgorYml0Y2FzdF9mMnUob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9iaXRjYXN0X2YydSwgYSk7Cit9CisKK2lyX2V4cHJlc3Npb24qCit1MmYob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF91MmYsIGEpOworfQorCitpcl9leHByZXNzaW9uKgorYml0Y2FzdF91MmYob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9iaXRjYXN0X3UyZiwgYSk7Cit9CisKK2lyX2V4cHJlc3Npb24qCitpMmIob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9pMmIsIGEpOworfQorCitpcl9leHByZXNzaW9uKgorYjJpKG9wZXJhbmQgYSkKK3sKKyAgIHJldHVybiBleHByKGlyX3Vub3BfYjJpLCBhKTsKK30KKworaXJfZXhwcmVzc2lvbiAqCitmMmIob3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdW5vcF9mMmIsIGEpOworfQorCitpcl9leHByZXNzaW9uICoKK2IyZihvcGVyYW5kIGEpCit7CisgICByZXR1cm4gZXhwcihpcl91bm9wX2IyZiwgYSk7Cit9CisKK2lyX2V4cHJlc3Npb24gKgorZm1hKG9wZXJhbmQgYSwgb3BlcmFuZCBiLCBvcGVyYW5kIGMpCit7CisgICByZXR1cm4gZXhwcihpcl90cmlvcF9mbWEsIGEsIGIsIGMpOworfQorCitpcl9leHByZXNzaW9uICoKK2xycChvcGVyYW5kIHgsIG9wZXJhbmQgeSwgb3BlcmFuZCBhKQoreworICAgcmV0dXJuIGV4cHIoaXJfdHJpb3BfbHJwLCB4LCB5LCBhKTsKK30KKworaXJfZXhwcmVzc2lvbiAqCitjc2VsKG9wZXJhbmQgYSwgb3BlcmFuZCBiLCBvcGVyYW5kIGMpCit7CisgICByZXR1cm4gZXhwcihpcl90cmlvcF9jc2VsLCBhLCBiLCBjKTsKK30KKworaXJfZXhwcmVzc2lvbiAqCitiaXRmaWVsZF9pbnNlcnQob3BlcmFuZCBhLCBvcGVyYW5kIGIsIG9wZXJhbmQgYywgb3BlcmFuZCBkKQoreworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoYS52YWwpOworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX3F1YWRvcF9iaXRmaWVsZF9pbnNlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS52YWwtPnR5cGUsIGEudmFsLCBiLnZhbCwgYy52YWwsIGQudmFsKTsKK30KKworaXJfaWYqCitpZl90cmVlKG9wZXJhbmQgY29uZGl0aW9uLAorICAgICAgICBpcl9pbnN0cnVjdGlvbiAqdGhlbl9icmFuY2gpCit7CisgICBhc3NlcnQodGhlbl9icmFuY2ggIT0gTlVMTCk7CisKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KGNvbmRpdGlvbi52YWwpOworCisgICBpcl9pZiAqcmVzdWx0ID0gbmV3KG1lbV9jdHgpIGlyX2lmKGNvbmRpdGlvbi52YWwpOworICAgcmVzdWx0LT50aGVuX2luc3RydWN0aW9ucy5wdXNoX3RhaWwodGhlbl9icmFuY2gpOworICAgcmV0dXJuIHJlc3VsdDsKK30KKworaXJfaWYqCitpZl90cmVlKG9wZXJhbmQgY29uZGl0aW9uLAorICAgICAgICBpcl9pbnN0cnVjdGlvbiAqdGhlbl9icmFuY2gsCisgICAgICAgIGlyX2luc3RydWN0aW9uICplbHNlX2JyYW5jaCkKK3sKKyAgIGFzc2VydCh0aGVuX2JyYW5jaCAhPSBOVUxMKTsKKyAgIGFzc2VydChlbHNlX2JyYW5jaCAhPSBOVUxMKTsKKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoY29uZGl0aW9uLnZhbCk7CisKKyAgIGlyX2lmICpyZXN1bHQgPSBuZXcobWVtX2N0eCkgaXJfaWYoY29uZGl0aW9uLnZhbCk7CisgICByZXN1bHQtPnRoZW5faW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbCh0aGVuX2JyYW5jaCk7CisgICByZXN1bHQtPmVsc2VfaW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChlbHNlX2JyYW5jaCk7CisgICByZXR1cm4gcmVzdWx0OworfQorCit9IC8qIG5hbWVzcGFjZSBpcl9idWlsZGVyICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Nsb25lLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfY2xvbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMGFkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Nsb25lLmNwcApAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisKK2lyX3J2YWx1ZSAqCitpcl9ydmFsdWU6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICopIGNvbnN0Cit7CisgICAvKiBUaGUgb25seSBwb3NzaWJsZSBpbnN0YW50aWF0aW9uIGlzIHRoZSBnZW5lcmljIGVycm9yIHZhbHVlLiAqLworICAgcmV0dXJuIGVycm9yX3ZhbHVlKG1lbV9jdHgpOworfQorCisvKioKKyAqIER1cGxpY2F0ZSBhbiBJUiB2YXJpYWJsZQorICovCitpcl92YXJpYWJsZSAqCitpcl92YXJpYWJsZTo6Y2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdAoreworICAgaXJfdmFyaWFibGUgKnZhciA9IG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZSh0aGlzLT50eXBlLCB0aGlzLT5uYW1lLAorCQkJCQkgICAgICAgKGlyX3ZhcmlhYmxlX21vZGUpIHRoaXMtPmRhdGEubW9kZSk7CisKKyAgIHZhci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzID0gdGhpcy0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzOworICAgaWYgKHRoaXMtPmlzX2ludGVyZmFjZV9pbnN0YW5jZSgpKSB7CisgICAgICB2YXItPm1heF9pZmNfYXJyYXlfYWNjZXNzID0KKyAgICAgICAgIHJ6YWxsb2NfYXJyYXkodmFyLCB1bnNpZ25lZCwgdGhpcy0+aW50ZXJmYWNlX3R5cGUtPmxlbmd0aCk7CisgICAgICBtZW1jcHkodmFyLT5tYXhfaWZjX2FycmF5X2FjY2VzcywgdGhpcy0+bWF4X2lmY19hcnJheV9hY2Nlc3MsCisgICAgICAgICAgICAgdGhpcy0+aW50ZXJmYWNlX3R5cGUtPmxlbmd0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgfQorCisgICBtZW1jcHkoJnZhci0+ZGF0YSwgJnRoaXMtPmRhdGEsIHNpemVvZih2YXItPmRhdGEpKTsKKworICAgdmFyLT53YXJuX2V4dGVuc2lvbiA9IHRoaXMtPndhcm5fZXh0ZW5zaW9uOworCisgICB2YXItPm51bV9zdGF0ZV9zbG90cyA9IHRoaXMtPm51bV9zdGF0ZV9zbG90czsKKyAgIGlmICh0aGlzLT5zdGF0ZV9zbG90cykgeworICAgICAgLyogRklOSVNITUU6IFRoaXMgcmVhbGx5IHdhbnRzIHRvIHVzZSBzb21ldGhpbmcgbGlrZSB0YWxsb2NfcmVmZXJlbmNlLCBidXQKKyAgICAgICAqIEZJTklTSE1FOiByYWxsb2MgZG9lc24ndCBoYXZlIGFueSBzaW1pbGFyIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB2YXItPnN0YXRlX3Nsb3RzID0gcmFsbG9jX2FycmF5KHZhciwgaXJfc3RhdGVfc2xvdCwKKwkJCQkgICAgICB0aGlzLT5udW1fc3RhdGVfc2xvdHMpOworICAgICAgbWVtY3B5KHZhci0+c3RhdGVfc2xvdHMsIHRoaXMtPnN0YXRlX3Nsb3RzLAorCSAgICAgc2l6ZW9mKHRoaXMtPnN0YXRlX3Nsb3RzWzBdKSAqIHZhci0+bnVtX3N0YXRlX3Nsb3RzKTsKKyAgIH0KKworICAgaWYgKHRoaXMtPmNvbnN0YW50X3ZhbHVlKQorICAgICAgdmFyLT5jb25zdGFudF92YWx1ZSA9IHRoaXMtPmNvbnN0YW50X3ZhbHVlLT5jbG9uZShtZW1fY3R4LCBodCk7CisKKyAgIGlmICh0aGlzLT5jb25zdGFudF9pbml0aWFsaXplcikKKyAgICAgIHZhci0+Y29uc3RhbnRfaW5pdGlhbGl6ZXIgPQorCSB0aGlzLT5jb25zdGFudF9pbml0aWFsaXplci0+Y2xvbmUobWVtX2N0eCwgaHQpOworCisgICB2YXItPmludGVyZmFjZV90eXBlID0gdGhpcy0+aW50ZXJmYWNlX3R5cGU7CisKKyAgIGlmIChodCkgeworICAgICAgaGFzaF90YWJsZV9pbnNlcnQoaHQsIHZhciwgKHZvaWQgKiljb25zdF9jYXN0PGlyX3ZhcmlhYmxlICo+KHRoaXMpKTsKKyAgIH0KKworICAgcmV0dXJuIHZhcjsKK30KKworaXJfc3dpenpsZSAqCitpcl9zd2l6emxlOjpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpIGNvbnN0Cit7CisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX3N3aXp6bGUodGhpcy0+dmFsLT5jbG9uZShtZW1fY3R4LCBodCksIHRoaXMtPm1hc2spOworfQorCitpcl9yZXR1cm4gKgoraXJfcmV0dXJuOjpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpIGNvbnN0Cit7CisgICBpcl9ydmFsdWUgKm5ld192YWx1ZSA9IE5VTEw7CisKKyAgIGlmICh0aGlzLT52YWx1ZSkKKyAgICAgIG5ld192YWx1ZSA9IHRoaXMtPnZhbHVlLT5jbG9uZShtZW1fY3R4LCBodCk7CisKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfcmV0dXJuKG5ld192YWx1ZSk7Cit9CisKK2lyX2Rpc2NhcmQgKgoraXJfZGlzY2FyZDo6Y2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdAoreworICAgaXJfcnZhbHVlICpuZXdfY29uZGl0aW9uID0gTlVMTDsKKworICAgaWYgKHRoaXMtPmNvbmRpdGlvbiAhPSBOVUxMKQorICAgICAgbmV3X2NvbmRpdGlvbiA9IHRoaXMtPmNvbmRpdGlvbi0+Y2xvbmUobWVtX2N0eCwgaHQpOworCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2Rpc2NhcmQobmV3X2NvbmRpdGlvbik7Cit9CisKK2lyX2xvb3BfanVtcCAqCitpcl9sb29wX2p1bXA6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgICh2b2lkKWh0OworCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2xvb3BfanVtcCh0aGlzLT5tb2RlKTsKK30KKworaXJfaWYgKgoraXJfaWY6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIGlyX2lmICpuZXdfaWYgPSBuZXcobWVtX2N0eCkgaXJfaWYodGhpcy0+Y29uZGl0aW9uLT5jbG9uZShtZW1fY3R4LCBodCkpOworCisgICBmb3JlYWNoX2xpc3QobiwgJnRoaXMtPnRoZW5faW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKyAgICAgIG5ld19pZi0+dGhlbl9pbnN0cnVjdGlvbnMucHVzaF90YWlsKGlyLT5jbG9uZShtZW1fY3R4LCBodCkpOworICAgfQorCisgICBmb3JlYWNoX2xpc3QobiwgJnRoaXMtPmVsc2VfaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKyAgICAgIG5ld19pZi0+ZWxzZV9pbnN0cnVjdGlvbnMucHVzaF90YWlsKGlyLT5jbG9uZShtZW1fY3R4LCBodCkpOworICAgfQorCisgICByZXR1cm4gbmV3X2lmOworfQorCitpcl9sb29wICoKK2lyX2xvb3A6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIGlyX2xvb3AgKm5ld19sb29wID0gbmV3KG1lbV9jdHgpIGlyX2xvb3AoKTsKKworICAgZm9yZWFjaF9saXN0KG4sICZ0aGlzLT5ib2R5X2luc3RydWN0aW9ucykgeworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmlyID0gKGlyX2luc3RydWN0aW9uICopIG47CisgICAgICBuZXdfbG9vcC0+Ym9keV9pbnN0cnVjdGlvbnMucHVzaF90YWlsKGlyLT5jbG9uZShtZW1fY3R4LCBodCkpOworICAgfQorCisgICByZXR1cm4gbmV3X2xvb3A7Cit9CisKK2lyX2NhbGwgKgoraXJfY2FsbDo6Y2xvbmUodm9pZCAqbWVtX2N0eCwgc3RydWN0IGhhc2hfdGFibGUgKmh0KSBjb25zdAoreworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKm5ld19yZXR1cm5fcmVmID0gTlVMTDsKKyAgIGlmICh0aGlzLT5yZXR1cm5fZGVyZWYgIT0gTlVMTCkKKyAgICAgIG5ld19yZXR1cm5fcmVmID0gdGhpcy0+cmV0dXJuX2RlcmVmLT5jbG9uZShtZW1fY3R4LCBodCk7CisKKyAgIGV4ZWNfbGlzdCBuZXdfcGFyYW1ldGVyczsKKworICAgZm9yZWFjaF9saXN0KG4sICZ0aGlzLT5hY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmlyID0gKGlyX2luc3RydWN0aW9uICopIG47CisgICAgICBuZXdfcGFyYW1ldGVycy5wdXNoX3RhaWwoaXItPmNsb25lKG1lbV9jdHgsIGh0KSk7CisgICB9CisKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY2FsbCh0aGlzLT5jYWxsZWUsIG5ld19yZXR1cm5fcmVmLCAmbmV3X3BhcmFtZXRlcnMpOworfQorCitpcl9leHByZXNzaW9uICoKK2lyX2V4cHJlc3Npb246OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIGlyX3J2YWx1ZSAqb3BbRWxlbWVudHModGhpcy0+b3BlcmFuZHMpXSA9IHsgTlVMTCwgfTsKKyAgIHVuc2lnbmVkIGludCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgZ2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKyAgICAgIG9wW2ldID0gdGhpcy0+b3BlcmFuZHNbaV0tPmNsb25lKG1lbV9jdHgsIGh0KTsKKyAgIH0KKworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKHRoaXMtPm9wZXJhdGlvbiwgdGhpcy0+dHlwZSwKKwkJCQkgICAgIG9wWzBdLCBvcFsxXSwgb3BbMl0sIG9wWzNdKTsKK30KKworaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKgoraXJfZGVyZWZlcmVuY2VfdmFyaWFibGU6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIGlyX3ZhcmlhYmxlICpuZXdfdmFyOworCisgICBpZiAoaHQpIHsKKyAgICAgIG5ld192YXIgPSAoaXJfdmFyaWFibGUgKiloYXNoX3RhYmxlX2ZpbmQoaHQsIHRoaXMtPnZhcik7CisgICAgICBpZiAoIW5ld192YXIpCisJIG5ld192YXIgPSB0aGlzLT52YXI7CisgICB9IGVsc2UgeworICAgICAgbmV3X3ZhciA9IHRoaXMtPnZhcjsKKyAgIH0KKworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShuZXdfdmFyKTsKK30KKworaXJfZGVyZWZlcmVuY2VfYXJyYXkgKgoraXJfZGVyZWZlcmVuY2VfYXJyYXk6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkodGhpcy0+YXJyYXktPmNsb25lKG1lbV9jdHgsIGh0KSwKKwkJCQkJICAgIHRoaXMtPmFycmF5X2luZGV4LT5jbG9uZShtZW1fY3R4LAorCQkJCQkJCQkgICAgIGh0KSk7Cit9CisKK2lyX2RlcmVmZXJlbmNlX3JlY29yZCAqCitpcl9kZXJlZmVyZW5jZV9yZWNvcmQ6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfcmVjb3JkKHRoaXMtPnJlY29yZC0+Y2xvbmUobWVtX2N0eCwgaHQpLAorCQkJCQkgICAgIHRoaXMtPmZpZWxkKTsKK30KKworaXJfdGV4dHVyZSAqCitpcl90ZXh0dXJlOjpjbG9uZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpIGNvbnN0Cit7CisgICBpcl90ZXh0dXJlICpuZXdfdGV4ID0gbmV3KG1lbV9jdHgpIGlyX3RleHR1cmUodGhpcy0+b3ApOworICAgbmV3X3RleC0+dHlwZSA9IHRoaXMtPnR5cGU7CisKKyAgIG5ld190ZXgtPnNhbXBsZXIgPSB0aGlzLT5zYW1wbGVyLT5jbG9uZShtZW1fY3R4LCBodCk7CisgICBpZiAodGhpcy0+Y29vcmRpbmF0ZSkKKyAgICAgIG5ld190ZXgtPmNvb3JkaW5hdGUgPSB0aGlzLT5jb29yZGluYXRlLT5jbG9uZShtZW1fY3R4LCBodCk7CisgICBpZiAodGhpcy0+cHJvamVjdG9yKQorICAgICAgbmV3X3RleC0+cHJvamVjdG9yID0gdGhpcy0+cHJvamVjdG9yLT5jbG9uZShtZW1fY3R4LCBodCk7CisgICBpZiAodGhpcy0+c2hhZG93X2NvbXBhcml0b3IpIHsKKyAgICAgIG5ld190ZXgtPnNoYWRvd19jb21wYXJpdG9yID0gdGhpcy0+c2hhZG93X2NvbXBhcml0b3ItPmNsb25lKG1lbV9jdHgsIGh0KTsKKyAgIH0KKworICAgaWYgKHRoaXMtPm9mZnNldCAhPSBOVUxMKQorICAgICAgbmV3X3RleC0+b2Zmc2V0ID0gdGhpcy0+b2Zmc2V0LT5jbG9uZShtZW1fY3R4LCBodCk7CisKKyAgIHN3aXRjaCAodGhpcy0+b3ApIHsKKyAgIGNhc2UgaXJfdGV4OgorICAgY2FzZSBpcl9sb2Q6CisgICBjYXNlIGlyX3F1ZXJ5X2xldmVsczoKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGI6CisgICAgICBuZXdfdGV4LT5sb2RfaW5mby5iaWFzID0gdGhpcy0+bG9kX2luZm8uYmlhcy0+Y2xvbmUobWVtX2N0eCwgaHQpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4bDoKKyAgIGNhc2UgaXJfdHhmOgorICAgY2FzZSBpcl90eHM6CisgICAgICBuZXdfdGV4LT5sb2RfaW5mby5sb2QgPSB0aGlzLT5sb2RfaW5mby5sb2QtPmNsb25lKG1lbV9jdHgsIGh0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGZfbXM6CisgICAgICBuZXdfdGV4LT5sb2RfaW5mby5zYW1wbGVfaW5kZXggPSB0aGlzLT5sb2RfaW5mby5zYW1wbGVfaW5kZXgtPmNsb25lKG1lbV9jdHgsIGh0KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6CisgICAgICBuZXdfdGV4LT5sb2RfaW5mby5ncmFkLmRQZHggPSB0aGlzLT5sb2RfaW5mby5ncmFkLmRQZHgtPmNsb25lKG1lbV9jdHgsIGh0KTsKKyAgICAgIG5ld190ZXgtPmxvZF9pbmZvLmdyYWQuZFBkeSA9IHRoaXMtPmxvZF9pbmZvLmdyYWQuZFBkeS0+Y2xvbmUobWVtX2N0eCwgaHQpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3RnNDoKKyAgICAgIG5ld190ZXgtPmxvZF9pbmZvLmNvbXBvbmVudCA9IHRoaXMtPmxvZF9pbmZvLmNvbXBvbmVudC0+Y2xvbmUobWVtX2N0eCwgaHQpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiBuZXdfdGV4OworfQorCitpcl9hc3NpZ25tZW50ICoKK2lyX2Fzc2lnbm1lbnQ6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIGlyX3J2YWx1ZSAqbmV3X2NvbmRpdGlvbiA9IE5VTEw7CisKKyAgIGlmICh0aGlzLT5jb25kaXRpb24pCisgICAgICBuZXdfY29uZGl0aW9uID0gdGhpcy0+Y29uZGl0aW9uLT5jbG9uZShtZW1fY3R4LCBodCk7CisKKyAgIGlyX2Fzc2lnbm1lbnQgKmNsb25lZCA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudCh0aGlzLT5saHMtPmNsb25lKG1lbV9jdHgsIGh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnJocy0+Y2xvbmUobWVtX2N0eCwgaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NvbmRpdGlvbik7CisgICBjbG9uZWQtPndyaXRlX21hc2sgPSB0aGlzLT53cml0ZV9tYXNrOworICAgcmV0dXJuIGNsb25lZDsKK30KKworaXJfZnVuY3Rpb24gKgoraXJfZnVuY3Rpb246OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIGlyX2Z1bmN0aW9uICpjb3B5ID0gbmV3KG1lbV9jdHgpIGlyX2Z1bmN0aW9uKHRoaXMtPm5hbWUpOworCisgICBmb3JlYWNoX2xpc3RfY29uc3Qobm9kZSwgJnRoaXMtPnNpZ25hdHVyZXMpIHsKKyAgICAgIGNvbnN0IGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29uc3Qgc2lnID0KKwkgKGNvbnN0IGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29uc3QpIG5vZGU7CisKKyAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnX2NvcHkgPSBzaWctPmNsb25lKG1lbV9jdHgsIGh0KTsKKyAgICAgIGNvcHktPmFkZF9zaWduYXR1cmUoc2lnX2NvcHkpOworCisgICAgICBpZiAoaHQgIT0gTlVMTCkKKwkgaGFzaF90YWJsZV9pbnNlcnQoaHQsIHNpZ19jb3B5LAorCQkJICAgKHZvaWQgKiljb25zdF9jYXN0PGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqPihzaWcpKTsKKyAgIH0KKworICAgcmV0dXJuIGNvcHk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitpcl9mdW5jdGlvbl9zaWduYXR1cmU6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29weSA9IHRoaXMtPmNsb25lX3Byb3RvdHlwZShtZW1fY3R4LCBodCk7CisKKyAgIGNvcHktPmlzX2RlZmluZWQgPSB0aGlzLT5pc19kZWZpbmVkOworCisgICAvKiBDbG9uZSB0aGUgaW5zdHJ1Y3Rpb24gbGlzdC4KKyAgICAqLworICAgZm9yZWFjaF9saXN0X2NvbnN0KG5vZGUsICZ0aGlzLT5ib2R5KSB7CisgICAgICBjb25zdCBpcl9pbnN0cnVjdGlvbiAqY29uc3QgaW5zdCA9IChjb25zdCBpcl9pbnN0cnVjdGlvbiAqKSBub2RlOworCisgICAgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgaW5zdF9jb3B5ID0gaW5zdC0+Y2xvbmUobWVtX2N0eCwgaHQpOworICAgICAgY29weS0+Ym9keS5wdXNoX3RhaWwoaW5zdF9jb3B5KTsKKyAgIH0KKworICAgcmV0dXJuIGNvcHk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitpcl9mdW5jdGlvbl9zaWduYXR1cmU6OmNsb25lX3Byb3RvdHlwZSh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpIGNvbnN0Cit7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmNvcHkgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSh0aGlzLT5yZXR1cm5fdHlwZSk7CisKKyAgIGNvcHktPmlzX2RlZmluZWQgPSBmYWxzZTsKKyAgIGNvcHktPmJ1aWx0aW5fYXZhaWwgPSB0aGlzLT5idWlsdGluX2F2YWlsOworICAgY29weS0+b3JpZ2luID0gdGhpczsKKworICAgLyogQ2xvbmUgdGhlIHBhcmFtZXRlciBsaXN0LCBidXQgTk9UIHRoZSBib2R5LgorICAgICovCisgICBmb3JlYWNoX2xpc3RfY29uc3Qobm9kZSwgJnRoaXMtPnBhcmFtZXRlcnMpIHsKKyAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpjb25zdCBwYXJhbSA9IChjb25zdCBpcl92YXJpYWJsZSAqKSBub2RlOworCisgICAgICBhc3NlcnQoY29uc3RfY2FzdDxpcl92YXJpYWJsZSAqPihwYXJhbSktPmFzX3ZhcmlhYmxlKCkgIT0gTlVMTCk7CisKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCBwYXJhbV9jb3B5ID0gcGFyYW0tPmNsb25lKG1lbV9jdHgsIGh0KTsKKyAgICAgIGNvcHktPnBhcmFtZXRlcnMucHVzaF90YWlsKHBhcmFtX2NvcHkpOworICAgfQorCisgICByZXR1cm4gY29weTsKK30KKworaXJfY29uc3RhbnQgKgoraXJfY29uc3RhbnQ6OmNsb25lKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCkgY29uc3QKK3sKKyAgICh2b2lkKWh0OworCisgICBzd2l0Y2ggKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSkgeworICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQodGhpcy0+dHlwZSwgJnRoaXMtPnZhbHVlKTsKKworICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOiB7CisgICAgICBpcl9jb25zdGFudCAqYyA9IG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudDsKKworICAgICAgYy0+dHlwZSA9IHRoaXMtPnR5cGU7CisgICAgICBmb3IgKGV4ZWNfbm9kZSAqbm9kZSA9IHRoaXMtPmNvbXBvbmVudHMuaGVhZAorCSAgICAgIDsgIW5vZGUtPmlzX3RhaWxfc2VudGluZWwoKQorCSAgICAgIDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKwkgaXJfY29uc3RhbnQgKmNvbnN0IG9yaWcgPSAoaXJfY29uc3RhbnQgKikgbm9kZTsKKworCSBjLT5jb21wb25lbnRzLnB1c2hfdGFpbChvcmlnLT5jbG9uZShtZW1fY3R4LCBOVUxMKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjOworICAgfQorCisgICBjYXNlIEdMU0xfVFlQRV9BUlJBWTogeworICAgICAgaXJfY29uc3RhbnQgKmMgPSBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQ7CisKKyAgICAgIGMtPnR5cGUgPSB0aGlzLT50eXBlOworICAgICAgYy0+YXJyYXlfZWxlbWVudHMgPSByYWxsb2NfYXJyYXkoYywgaXJfY29uc3RhbnQgKiwgdGhpcy0+dHlwZS0+bGVuZ3RoKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0aGlzLT50eXBlLT5sZW5ndGg7IGkrKykgeworCSBjLT5hcnJheV9lbGVtZW50c1tpXSA9IHRoaXMtPmFycmF5X2VsZW1lbnRzW2ldLT5jbG9uZShtZW1fY3R4LCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjOworICAgfQorCisgICBjYXNlIEdMU0xfVFlQRV9TQU1QTEVSOgorICAgY2FzZSBHTFNMX1RZUEVfSU1BR0U6CisgICBjYXNlIEdMU0xfVFlQRV9BVE9NSUNfVUlOVDoKKyAgIGNhc2UgR0xTTF9UWVBFX1ZPSUQ6CisgICBjYXNlIEdMU0xfVFlQRV9FUlJPUjoKKyAgIGNhc2UgR0xTTF9UWVBFX0lOVEVSRkFDRToKKyAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIE5VTEw7Cit9CisKKworY2xhc3MgZml4dXBfaXJfY2FsbF92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGZpeHVwX2lyX2NhbGxfdmlzaXRvcihzdHJ1Y3QgaGFzaF90YWJsZSAqaHQpCisgICB7CisgICAgICB0aGlzLT5odCA9IGh0OworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKQorICAgeworICAgICAgLyogVHJ5IHRvIGZpbmQgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSByZWZlcmVuY2VkIGJ5IHRoZSBpcl9jYWxsIGluIHRoZQorICAgICAgICogdGFibGUuICBJZiBpdCBpcyBmb3VuZCwgcmVwbGFjZSBpdCB3aXRoIHRoZSB2YWx1ZSBmcm9tIHRoZSB0YWJsZS4KKyAgICAgICAqLworICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPQorCSAoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopIGhhc2hfdGFibGVfZmluZCh0aGlzLT5odCwgaXItPmNhbGxlZSk7CisgICAgICBpZiAoc2lnICE9IE5VTEwpCisJIGlyLT5jYWxsZWUgPSBzaWc7CisKKyAgICAgIC8qIFNpbmNlIHRoaXMgbWF5IGJlIHVzZWQgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVycyBhcmUgZmxhdHRlbmVkLAorICAgICAgICogdGhlIGNoaWxkcmVuIGFsc28gbmVlZCB0byBiZSBwcm9jZXNzZWQuCisgICAgICAgKi8KKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworcHJpdmF0ZToKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKK307CisKKworc3RhdGljIHZvaWQKK2ZpeHVwX2Z1bmN0aW9uX2NhbGxzKHN0cnVjdCBoYXNoX3RhYmxlICpodCwgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBmaXh1cF9pcl9jYWxsX3Zpc2l0b3IgdihodCk7CisgICB2LnJ1bihpbnN0cnVjdGlvbnMpOworfQorCisKK3ZvaWQKK2Nsb25lX2lyX2xpc3Qodm9pZCAqbWVtX2N0eCwgZXhlY19saXN0ICpvdXQsIGNvbnN0IGV4ZWNfbGlzdCAqaW4pCit7CisgICBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQgPQorICAgICAgaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfcG9pbnRlcl9oYXNoLCBoYXNoX3RhYmxlX3BvaW50ZXJfY29tcGFyZSk7CisKKyAgIGZvcmVhY2hfbGlzdF9jb25zdChub2RlLCBpbikgeworICAgICAgY29uc3QgaXJfaW5zdHJ1Y3Rpb24gKmNvbnN0IG9yaWdpbmFsID0gKGlyX2luc3RydWN0aW9uICopIG5vZGU7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqY29weSA9IG9yaWdpbmFsLT5jbG9uZShtZW1fY3R4LCBodCk7CisKKyAgICAgIG91dC0+cHVzaF90YWlsKGNvcHkpOworICAgfQorCisgICAvKiBNYWtlIGEgcGFzcyBvdmVyIHRoZSBjbG9uZWQgdHJlZSB0byBmaXggdXAgaXJfY2FsbCBub2RlcyB0byBwb2ludCB0byB0aGUKKyAgICAqIGNsb25lZCBpcl9mdW5jdGlvbl9zaWduYXR1cmUgbm9kZXMuICBUaGlzIGNhbm5vdCBiZSBkb25lIGF1dG9tYXRpY2FsbHkKKyAgICAqIGR1cmluZyBjbG9uaW5nIGJlY2F1c2UgdGhlIGlyX2NhbGwgbWlnaHQgYmUgYSBmb3J3YXJkIHJlZmVyZW5jZSAoaS5lLiwKKyAgICAqIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCBpdCByZWZlcmVuY2VzIG1heSBub3QgaGF2ZSBiZWVuIGNsb25lZCB5ZXQpLgorICAgICovCisgICBmaXh1cF9mdW5jdGlvbl9jYWxscyhodCwgb3V0KTsKKworICAgaGFzaF90YWJsZV9kdG9yKGh0KTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfY29uc3RhbnRfZXhwcmVzc2lvbi5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2NvbnN0YW50X2V4cHJlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzExZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2NvbnN0YW50X2V4cHJlc3Npb24uY3BwCkBAIC0wLDAgKzEsMTk1MSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaXJfY29uc3RhbnRfZXhwcmVzc2lvbi5jcHAKKyAqIEV2YWx1YXRlIGFuZCBwcm9jZXNzIGNvbnN0YW50IHZhbHVlZCBleHByZXNzaW9ucworICoKKyAqIEluIEdMU0wsIGNvbnN0YW50IHZhbHVlZCBleHByZXNzaW9ucyBhcmUgdXNlZCBpbiBzZXZlcmFsIHBsYWNlcy4gIFRoZXNlCisgKiBtdXN0IGJlIHByb2Nlc3NlZCBhbmQgZXZhbHVhdGVkIHZlcnkgZWFybHkgaW4gdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuCisgKgorICogICAgKiBTaXplcyBvZiBhcnJheXMKKyAqICAgICogSW5pdGlhbGl6ZXJzIGZvciB1bmlmb3JtcworICogICAgKiBJbml0aWFsaXplcnMgZm9yIFxjIGNvbnN0IHZhcmlhYmxlcworICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAibGliZm5zLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDwgMTgwMCkKK3N0YXRpYyBpbnQgaXNub3JtYWwoZG91YmxlIHgpCit7CisgICByZXR1cm4gX2ZwY2xhc3MoeCkgPT0gX0ZQQ0xBU1NfTk4gfHwgX2ZwY2xhc3MoeCkgPT0gX0ZQQ0xBU1NfUE47Cit9CisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKQorI2luY2x1ZGUgPGllZWVmcC5oPgorc3RhdGljIGludCBpc25vcm1hbChkb3VibGUgeCkKK3sKKyAgIHJldHVybiBmcGNsYXNzKHgpID09IEZQX05PUk1BTDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKK3N0YXRpYyBkb3VibGUgY29weXNpZ24oZG91YmxlIHgsIGRvdWJsZSB5KQoreworICAgcmV0dXJuIF9jb3B5c2lnbih4LCB5KTsKK30KKyNlbmRpZgorCitzdGF0aWMgZmxvYXQKK2RvdChpcl9jb25zdGFudCAqb3AwLCBpcl9jb25zdGFudCAqb3AxKQoreworICAgYXNzZXJ0KG9wMC0+dHlwZS0+aXNfZmxvYXQoKSAmJiBvcDEtPnR5cGUtPmlzX2Zsb2F0KCkpOworCisgICBmbG9hdCByZXN1bHQgPSAwOworICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wMC0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspCisgICAgICByZXN1bHQgKz0gb3AwLT52YWx1ZS5mW2NdICogb3AxLT52YWx1ZS5mW2NdOworCisgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBUaGlzIG1ldGhvZCBpcyB0aGUgb25seSBvbmUgc3VwcG9ydGVkIGJ5IGdjYy4gIFVuaW9ucyBpbiBwYXJ0aWN1bGFyCisgKiBhcmUgaWZmeSwgYW5kIHJlYWQtdGhyb3VnaC1jb252ZXJ0ZWQtcG9pbnRlciBpcyBraWxsZWQgYnkgc3RyaWN0CisgKiBhbGlhc2luZy4gIE9UT0gsIHRoZSBjb21waWxlciBzZWVzIHRocm91Z2ggdGhlIG1lbWNweSwgc28gdGhlCisgKiByZXN1bHRpbmcgYXNtIGlzIHJlYXNvbmFibGUuCisgKi8KK3N0YXRpYyBmbG9hdAorYml0Y2FzdF91MmYodW5zaWduZWQgaW50IHUpCit7CisgICBhc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YodW5zaWduZWQgaW50KSk7CisgICBmbG9hdCBmOworICAgbWVtY3B5KCZmLCAmdSwgc2l6ZW9mKGYpKTsKKyAgIHJldHVybiBmOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitiaXRjYXN0X2YydShmbG9hdCBmKQoreworICAgYXNzZXJ0KHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgdW5zaWduZWQgaW50IHU7CisgICBtZW1jcHkoJnUsICZmLCBzaXplb2YoZikpOworICAgcmV0dXJuIHU7Cit9CisKKy8qKgorICogRXZhbHVhdGUgb25lIGNvbXBvbmVudCBvZiBhIGZsb2F0aW5nLXBvaW50IDR4OCB1bnBhY2tpbmcgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgdWludDhfdAorKCpwYWNrXzF4OF9mdW5jX3QpKGZsb2F0KTsKKworLyoqCisgKiBFdmFsdWF0ZSBvbmUgY29tcG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgMngxNiB1bnBhY2tpbmcgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgdWludDE2X3QKKygqcGFja18xeDE2X2Z1bmNfdCkoZmxvYXQpOworCisvKioKKyAqIEV2YWx1YXRlIG9uZSBjb21wb25lbnQgb2YgYSBmbG9hdGluZy1wb2ludCA0eDggdW5wYWNraW5nIGZ1bmN0aW9uLgorICovCit0eXBlZGVmIGZsb2F0CisoKnVucGFja18xeDhfZnVuY190KSh1aW50OF90KTsKKworLyoqCisgKiBFdmFsdWF0ZSBvbmUgY29tcG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgMngxNiB1bnBhY2tpbmcgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgZmxvYXQKKygqdW5wYWNrXzF4MTZfZnVuY190KSh1aW50MTZfdCk7CisKKy8qKgorICogRXZhbHVhdGUgYSAyeDE2IGZsb2F0aW5nLXBvaW50IHBhY2tpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB1aW50MzJfdAorcGFja18yeDE2KHBhY2tfMXgxNl9mdW5jX3QgcGFja18xeDE2LAorICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAvKiBGcm9tIHNlY3Rpb24gOC40IG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAqCisgICAgKiAgICBwYWNrU25vcm0yeDE2CisgICAgKiAgICAtLS0tLS0tLS0tLS0tCisgICAgKiAgICBUaGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3Igd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsZWFzdAorICAgICogICAgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgb3V0cHV0OyB0aGUgbGFzdCBjb21wb25lbnQgd2lsbCBiZSB3cml0dGVuIHRvCisgICAgKiAgICB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzLgorICAgICoKKyAgICAqIFRoZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIG90aGVyIHBhY2tpbmcgZnVuY3Rpb25zIGNvbnRhaW4gc2ltaWxhcgorICAgICogbGFuZ3VhZ2UuCisgICAgKi8KKyAgIHVpbnQzMl90IHUgPSAwOworICAgdSB8PSAoKHVpbnQzMl90KSBwYWNrXzF4MTYoeCkgPDwgMCk7CisgICB1IHw9ICgodWludDMyX3QpIHBhY2tfMXgxNih5KSA8PCAxNik7CisgICByZXR1cm4gdTsKK30KKworLyoqCisgKiBFdmFsdWF0ZSBhIDR4OCBmbG9hdGluZy1wb2ludCBwYWNraW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdWludDMyX3QKK3BhY2tfNHg4KHBhY2tfMXg4X2Z1bmNfdCBwYWNrXzF4OCwKKyAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcpCit7CisgICAvKiBGcm9tIHNlY3Rpb24gOC40IG9mIHRoZSBHTFNMIDQuMzAgc3BlYzoKKyAgICAqCisgICAgKiAgICBwYWNrU25vcm00eDgKKyAgICAqICAgIC0tLS0tLS0tLS0tLQorICAgICogICAgVGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbGVhc3QKKyAgICAqICAgIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIG91dHB1dDsgdGhlIGxhc3QgY29tcG9uZW50IHdpbGwgYmUgd3JpdHRlbiB0bworICAgICogICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAqCisgICAgKiBUaGUgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBvdGhlciBwYWNraW5nIGZ1bmN0aW9ucyBjb250YWluIHNpbWlsYXIKKyAgICAqIGxhbmd1YWdlLgorICAgICovCisgICB1aW50MzJfdCB1ID0gMDsKKyAgIHUgfD0gKCh1aW50MzJfdCkgcGFja18xeDgoeCkgPDwgMCk7CisgICB1IHw9ICgodWludDMyX3QpIHBhY2tfMXg4KHkpIDw8IDgpOworICAgdSB8PSAoKHVpbnQzMl90KSBwYWNrXzF4OCh6KSA8PCAxNik7CisgICB1IHw9ICgodWludDMyX3QpIHBhY2tfMXg4KHcpIDw8IDI0KTsKKyAgIHJldHVybiB1OworfQorCisvKioKKyAqIEV2YWx1YXRlIGEgMngxNiBmbG9hdGluZy1wb2ludCB1bnBhY2tpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCit1bnBhY2tfMngxNih1bnBhY2tfMXgxNl9mdW5jX3QgdW5wYWNrXzF4MTYsCisgICAgICAgICAgICB1aW50MzJfdCB1LAorICAgICAgICAgICAgZmxvYXQgKngsIGZsb2F0ICp5KQoreworICAgIC8qIEZyb20gc2VjdGlvbiA4LjQgb2YgdGhlIEdMU0wgRVMgMy4wMCBzcGVjOgorICAgICAqCisgICAgICogICAgdW5wYWNrU25vcm0yeDE2CisgICAgICogICAgLS0tLS0tLS0tLS0tLS0tCisgICAgICogICAgVGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20KKyAgICAgKiAgICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgaW5wdXQ7IHRoZSBsYXN0IGNvbXBvbmVudCB3aWxsIGJlCisgICAgICogICAgZXh0cmFjdGVkIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgKgorICAgICAqIFRoZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIG90aGVyIHVucGFja2luZyBmdW5jdGlvbnMgY29udGFpbiBzaW1pbGFyCisgICAgICogbGFuZ3VhZ2UuCisgICAgICovCisgICAqeCA9IHVucGFja18xeDE2KCh1aW50MTZfdCkgKHUgJiAweGZmZmYpKTsKKyAgICp5ID0gdW5wYWNrXzF4MTYoKHVpbnQxNl90KSAodSA+PiAxNikpOworfQorCisvKioKKyAqIEV2YWx1YXRlIGEgNHg4IGZsb2F0aW5nLXBvaW50IHVucGFja2luZyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3VucGFja180eDgodW5wYWNrXzF4OF9mdW5jX3QgdW5wYWNrXzF4OCwgdWludDMyX3QgdSwKKyAgICAgICAgICAgZmxvYXQgKngsIGZsb2F0ICp5LCBmbG9hdCAqeiwgZmxvYXQgKncpCit7CisgICAgLyogRnJvbSBzZWN0aW9uIDguNCBvZiB0aGUgR0xTTCA0LjMwIHNwZWM6CisgICAgICoKKyAgICAgKiAgICB1bnBhY2tTbm9ybTR4OAorICAgICAqICAgIC0tLS0tLS0tLS0tLS0tCisgICAgICogICAgVGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20KKyAgICAgKiAgICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgaW5wdXQ7IHRoZSBsYXN0IGNvbXBvbmVudCB3aWxsIGJlCisgICAgICogICAgZXh0cmFjdGVkIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgKgorICAgICAqIFRoZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIG90aGVyIHVucGFja2luZyBmdW5jdGlvbnMgY29udGFpbiBzaW1pbGFyCisgICAgICogbGFuZ3VhZ2UuCisgICAgICovCisgICAqeCA9IHVucGFja18xeDgoKHVpbnQ4X3QpICh1ICYgMHhmZikpOworICAgKnkgPSB1bnBhY2tfMXg4KCh1aW50OF90KSAodSA+PiA4KSk7CisgICAqeiA9IHVucGFja18xeDgoKHVpbnQ4X3QpICh1ID4+IDE2KSk7CisgICAqdyA9IHVucGFja18xeDgoKHVpbnQ4X3QpICh1ID4+IDI0KSk7Cit9CisKKy8qKgorICogRXZhbHVhdGUgb25lIGNvbXBvbmVudCBvZiBwYWNrU25vcm00eDguCisgKi8KK3N0YXRpYyB1aW50OF90CitwYWNrX3Nub3JtXzF4OChmbG9hdCB4KQoreworICAgIC8qIEZyb20gc2VjdGlvbiA4LjQgb2YgdGhlIEdMU0wgNC4zMCBzcGVjOgorICAgICAqCisgICAgICogICAgcGFja1Nub3JtNHg4CisgICAgICogICAgLS0tLS0tLS0tLS0tCisgICAgICogICAgVGhlIGNvbnZlcnNpb24gZm9yIGNvbXBvbmVudCBjIG9mIHYgdG8gZml4ZWQgcG9pbnQgaXMgZG9uZSBhcworICAgICAqICAgIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiAgICAgIHBhY2tTbm9ybTR4ODogcm91bmQoY2xhbXAoYywgLTEsICsxKSAqIDEyNy4wKQorICAgICAqCisgICAgICogV2UgbXVzdCBmaXJzdCBjYXN0IHRoZSBmbG9hdCB0byBhbiBpbnQsIGJlY2F1c2UgY2FzdGluZyBhIG5lZ2F0aXZlCisgICAgICogZmxvYXQgdG8gYSB1aW50IGlzIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgIHJldHVybiAodWludDhfdCkgKGludDhfdCkKKyAgICAgICAgICBfbWVzYV9yb3VuZF90b19ldmVuKENMQU1QKHgsIC0xLjBmLCArMS4wZikgKiAxMjcuMGYpOworfQorCisvKioKKyAqIEV2YWx1YXRlIG9uZSBjb21wb25lbnQgb2YgcGFja1Nub3JtMngxNi4KKyAqLworc3RhdGljIHVpbnQxNl90CitwYWNrX3Nub3JtXzF4MTYoZmxvYXQgeCkKK3sKKyAgICAvKiBGcm9tIHNlY3Rpb24gOC40IG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAgKgorICAgICAqICAgIHBhY2tTbm9ybTJ4MTYKKyAgICAgKiAgICAtLS0tLS0tLS0tLS0tCisgICAgICogICAgVGhlIGNvbnZlcnNpb24gZm9yIGNvbXBvbmVudCBjIG9mIHYgdG8gZml4ZWQgcG9pbnQgaXMgZG9uZSBhcworICAgICAqICAgIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiAgICAgIHBhY2tTbm9ybTJ4MTY6IHJvdW5kKGNsYW1wKGMsIC0xLCArMSkgKiAzMjc2Ny4wKQorICAgICAqCisgICAgICogV2UgbXVzdCBmaXJzdCBjYXN0IHRoZSBmbG9hdCB0byBhbiBpbnQsIGJlY2F1c2UgY2FzdGluZyBhIG5lZ2F0aXZlCisgICAgICogZmxvYXQgdG8gYSB1aW50IGlzIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgIHJldHVybiAodWludDE2X3QpIChpbnQxNl90KQorICAgICAgICAgIF9tZXNhX3JvdW5kX3RvX2V2ZW4oQ0xBTVAoeCwgLTEuMGYsICsxLjBmKSAqIDMyNzY3LjBmKTsKK30KKworLyoqCisgKiBFdmFsdWF0ZSBvbmUgY29tcG9uZW50IG9mIHVucGFja1Nub3JtNHg4LgorICovCitzdGF0aWMgZmxvYXQKK3VucGFja19zbm9ybV8xeDgodWludDhfdCB1KQoreworICAgIC8qIEZyb20gc2VjdGlvbiA4LjQgb2YgdGhlIEdMU0wgNC4zMCBzcGVjOgorICAgICAqCisgICAgICogICAgdW5wYWNrU25vcm00eDgKKyAgICAgKiAgICAtLS0tLS0tLS0tLS0tLQorICAgICAqICAgIFRoZSBjb252ZXJzaW9uIGZvciB1bnBhY2tlZCBmaXhlZC1wb2ludCB2YWx1ZSBmIHRvIGZsb2F0aW5nIHBvaW50IGlzCisgICAgICogICAgZG9uZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogICAgICAgdW5wYWNrU25vcm00eDg6IGNsYW1wKGYgLyAxMjcuMCwgLTEsICsxKQorICAgICAqLworICAgcmV0dXJuIENMQU1QKChpbnQ4X3QpIHUgLyAxMjcuMGYsIC0xLjBmLCArMS4wZik7Cit9CisKKy8qKgorICogRXZhbHVhdGUgb25lIGNvbXBvbmVudCBvZiB1bnBhY2tTbm9ybTJ4MTYuCisgKi8KK3N0YXRpYyBmbG9hdAordW5wYWNrX3Nub3JtXzF4MTYodWludDE2X3QgdSkKK3sKKyAgICAvKiBGcm9tIHNlY3Rpb24gOC40IG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAgKgorICAgICAqICAgIHVucGFja1Nub3JtMngxNgorICAgICAqICAgIC0tLS0tLS0tLS0tLS0tLQorICAgICAqICAgIFRoZSBjb252ZXJzaW9uIGZvciB1bnBhY2tlZCBmaXhlZC1wb2ludCB2YWx1ZSBmIHRvIGZsb2F0aW5nIHBvaW50IGlzCisgICAgICogICAgZG9uZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogICAgICAgdW5wYWNrU25vcm0yeDE2OiBjbGFtcChmIC8gMzI3NjcuMCwgLTEsICsxKQorICAgICAqLworICAgcmV0dXJuIENMQU1QKChpbnQxNl90KSB1IC8gMzI3NjcuMGYsIC0xLjBmLCArMS4wZik7Cit9CisKKy8qKgorICogRXZhbHVhdGUgb25lIGNvbXBvbmVudCBwYWNrVW5vcm00eDguCisgKi8KK3N0YXRpYyB1aW50OF90CitwYWNrX3Vub3JtXzF4OChmbG9hdCB4KQoreworICAgIC8qIEZyb20gc2VjdGlvbiA4LjQgb2YgdGhlIEdMU0wgNC4zMCBzcGVjOgorICAgICAqCisgICAgICogICAgcGFja1Vub3JtNHg4CisgICAgICogICAgLS0tLS0tLS0tLS0tCisgICAgICogICAgVGhlIGNvbnZlcnNpb24gZm9yIGNvbXBvbmVudCBjIG9mIHYgdG8gZml4ZWQgcG9pbnQgaXMgZG9uZSBhcworICAgICAqICAgIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiAgICAgICBwYWNrVW5vcm00eDg6IHJvdW5kKGNsYW1wKGMsIDAsICsxKSAqIDI1NS4wKQorICAgICAqLworICAgcmV0dXJuICh1aW50OF90KSBfbWVzYV9yb3VuZF90b19ldmVuKENMQU1QKHgsIDAuMGYsIDEuMGYpICogMjU1LjBmKTsKK30KKworLyoqCisgKiBFdmFsdWF0ZSBvbmUgY29tcG9uZW50IHBhY2tVbm9ybTJ4MTYuCisgKi8KK3N0YXRpYyB1aW50MTZfdAorcGFja191bm9ybV8xeDE2KGZsb2F0IHgpCit7CisgICAgLyogRnJvbSBzZWN0aW9uIDguNCBvZiB0aGUgR0xTTCBFUyAzLjAwIHNwZWM6CisgICAgICoKKyAgICAgKiAgICBwYWNrVW5vcm0yeDE2CisgICAgICogICAgLS0tLS0tLS0tLS0tLQorICAgICAqICAgIFRoZSBjb252ZXJzaW9uIGZvciBjb21wb25lbnQgYyBvZiB2IHRvIGZpeGVkIHBvaW50IGlzIGRvbmUgYXMKKyAgICAgKiAgICBmb2xsb3dzOgorICAgICAqCisgICAgICogICAgICAgcGFja1Vub3JtMngxNjogcm91bmQoY2xhbXAoYywgMCwgKzEpICogNjU1MzUuMCkKKyAgICAgKi8KKyAgIHJldHVybiAodWludDE2X3QpIF9tZXNhX3JvdW5kX3RvX2V2ZW4oQ0xBTVAoeCwgMC4wZiwgMS4wZikgKiA2NTUzNS4wZik7Cit9CisKKy8qKgorICogRXZhbHVhdGUgb25lIGNvbXBvbmVudCBvZiB1bnBhY2tVbm9ybTR4OC4KKyAqLworc3RhdGljIGZsb2F0Cit1bnBhY2tfdW5vcm1fMXg4KHVpbnQ4X3QgdSkKK3sKKyAgICAvKiBGcm9tIHNlY3Rpb24gOC40IG9mIHRoZSBHTFNMIDQuMzAgc3BlYzoKKyAgICAgKgorICAgICAqICAgIHVucGFja1Vub3JtNHg4CisgICAgICogICAgLS0tLS0tLS0tLS0tLS0KKyAgICAgKiAgICBUaGUgY29udmVyc2lvbiBmb3IgdW5wYWNrZWQgZml4ZWQtcG9pbnQgdmFsdWUgZiB0byBmbG9hdGluZyBwb2ludCBpcworICAgICAqICAgIGRvbmUgYXMgZm9sbG93czoKKyAgICAgKgorICAgICAqICAgICAgIHVucGFja1Vub3JtNHg4OiBmIC8gMjU1LjAKKyAgICAgKi8KKyAgIHJldHVybiAoZmxvYXQpIHUgLyAyNTUuMGY7Cit9CisKKy8qKgorICogRXZhbHVhdGUgb25lIGNvbXBvbmVudCBvZiB1bnBhY2tVbm9ybTJ4MTYuCisgKi8KK3N0YXRpYyBmbG9hdAordW5wYWNrX3Vub3JtXzF4MTYodWludDE2X3QgdSkKK3sKKyAgICAvKiBGcm9tIHNlY3Rpb24gOC40IG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAgKgorICAgICAqICAgIHVucGFja1Vub3JtMngxNgorICAgICAqICAgIC0tLS0tLS0tLS0tLS0tLQorICAgICAqICAgIFRoZSBjb252ZXJzaW9uIGZvciB1bnBhY2tlZCBmaXhlZC1wb2ludCB2YWx1ZSBmIHRvIGZsb2F0aW5nIHBvaW50IGlzCisgICAgICogICAgZG9uZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogICAgICAgdW5wYWNrVW5vcm0yeDE2OiBmIC8gNjU1MzUuMAorICAgICAqLworICAgcmV0dXJuIChmbG9hdCkgdSAvIDY1NTM1LjBmOworfQorCisvKioKKyAqIEV2YWx1YXRlIG9uZSBjb21wb25lbnQgb2YgcGFja0hhbGYyeDE2LgorICovCitzdGF0aWMgdWludDE2X3QKK3BhY2tfaGFsZl8xeDE2KGZsb2F0IHgpCit7CisgICByZXR1cm4gX21lc2FfZmxvYXRfdG9faGFsZih4KTsKK30KKworLyoqCisgKiBFdmFsdWF0ZSBvbmUgY29tcG9uZW50IG9mIHVucGFja0hhbGYyeDE2LgorICovCitzdGF0aWMgZmxvYXQKK3VucGFja19oYWxmXzF4MTYodWludDE2X3QgdSkKK3sKKyAgIHJldHVybiBfbWVzYV9oYWxmX3RvX2Zsb2F0KHUpOworfQorCisvKioKKyAqIEdldCB0aGUgY29uc3RhbnQgdGhhdCBpcyB1bHRpbWF0ZWx5IHJlZmVyZW5jZWQgYnkgYW4gci12YWx1ZSwgaW4gYSBjb25zdGFudAorICogZXhwcmVzc2lvbiBldmFsdWF0aW9uIGNvbnRleHQuCisgKgorICogVGhlIG9mZnNldCBpcyB1c2VkIHdoZW4gdGhlIHJlZmVyZW5jZSBpcyB0byBhIHNwZWNpZmljIGNvbHVtbiBvZiBhIG1hdHJpeC4KKyAqLworc3RhdGljIGJvb2wKK2NvbnN0YW50X3JlZmVyZW5jZWQoY29uc3QgaXJfZGVyZWZlcmVuY2UgKmRlcmVmLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGFzaF90YWJsZSAqdmFyaWFibGVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgaXJfY29uc3RhbnQgKiZzdG9yZSwgaW50ICZvZmZzZXQpCit7CisgICBzdG9yZSA9IE5VTEw7CisgICBvZmZzZXQgPSAwOworCisgICBpZiAodmFyaWFibGVfY29udGV4dCA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBzd2l0Y2ggKGRlcmVmLT5pcl90eXBlKSB7CisgICBjYXNlIGlyX3R5cGVfZGVyZWZlcmVuY2VfYXJyYXk6IHsKKyAgICAgIGNvbnN0IGlyX2RlcmVmZXJlbmNlX2FycmF5ICpjb25zdCBkYSA9CisgICAgICAgICAoY29uc3QgaXJfZGVyZWZlcmVuY2VfYXJyYXkgKikgZGVyZWY7CisKKyAgICAgIGlyX2NvbnN0YW50ICpjb25zdCBpbmRleF9jID0KKyAgICAgICAgIGRhLT5hcnJheV9pbmRleC0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSh2YXJpYWJsZV9jb250ZXh0KTsKKworICAgICAgaWYgKCFpbmRleF9jIHx8ICFpbmRleF9jLT50eXBlLT5pc19zY2FsYXIoKSB8fCAhaW5kZXhfYy0+dHlwZS0+aXNfaW50ZWdlcigpKQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNvbnN0IGludCBpbmRleCA9IGluZGV4X2MtPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UID8KKyAgICAgICAgIGluZGV4X2MtPmdldF9pbnRfY29tcG9uZW50KDApIDoKKyAgICAgICAgIGluZGV4X2MtPmdldF91aW50X2NvbXBvbmVudCgwKTsKKworICAgICAgaXJfY29uc3RhbnQgKnN1YnN0b3JlOworICAgICAgaW50IHN1Ym9mZnNldDsKKworICAgICAgY29uc3QgaXJfZGVyZWZlcmVuY2UgKmNvbnN0IGRlcmVmID0gZGEtPmFycmF5LT5hc19kZXJlZmVyZW5jZSgpOworICAgICAgaWYgKCFkZXJlZikKKyAgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoIWNvbnN0YW50X3JlZmVyZW5jZWQoZGVyZWYsIHZhcmlhYmxlX2NvbnRleHQsIHN1YnN0b3JlLCBzdWJvZmZzZXQpKQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgdnQgPSBkYS0+YXJyYXktPnR5cGU7CisgICAgICBpZiAodnQtPmlzX2FycmF5KCkpIHsKKyAgICAgICAgIHN0b3JlID0gc3Vic3RvcmUtPmdldF9hcnJheV9lbGVtZW50KGluZGV4KTsKKyAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICB9IGVsc2UgaWYgKHZ0LT5pc19tYXRyaXgoKSkgeworICAgICAgICAgc3RvcmUgPSBzdWJzdG9yZTsKKyAgICAgICAgIG9mZnNldCA9IGluZGV4ICogdnQtPnZlY3Rvcl9lbGVtZW50czsKKyAgICAgIH0gZWxzZSBpZiAodnQtPmlzX3ZlY3RvcigpKSB7CisgICAgICAgICBzdG9yZSA9IHN1YnN0b3JlOworICAgICAgICAgb2Zmc2V0ID0gc3Vib2Zmc2V0ICsgaW5kZXg7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGlyX3R5cGVfZGVyZWZlcmVuY2VfcmVjb3JkOiB7CisgICAgICBjb25zdCBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmNvbnN0IGRyID0KKyAgICAgICAgIChjb25zdCBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKikgZGVyZWY7CisKKyAgICAgIGNvbnN0IGlyX2RlcmVmZXJlbmNlICpjb25zdCBkZXJlZiA9IGRyLT5yZWNvcmQtPmFzX2RlcmVmZXJlbmNlKCk7CisgICAgICBpZiAoIWRlcmVmKQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlyX2NvbnN0YW50ICpzdWJzdG9yZTsKKyAgICAgIGludCBzdWJvZmZzZXQ7CisKKyAgICAgIGlmICghY29uc3RhbnRfcmVmZXJlbmNlZChkZXJlZiwgdmFyaWFibGVfY29udGV4dCwgc3Vic3RvcmUsIHN1Ym9mZnNldCkpCisgICAgICAgICBicmVhazsKKworICAgICAgLyogU2luY2Ugd2UncmUgZHJvcHBpbmcgaXQgb24gdGhlIGZsb29yLi4uCisgICAgICAgKi8KKyAgICAgIGFzc2VydChzdWJvZmZzZXQgPT0gMCk7CisKKyAgICAgIHN0b3JlID0gc3Vic3RvcmUtPmdldF9yZWNvcmRfZmllbGQoZHItPmZpZWxkKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGlyX3R5cGVfZGVyZWZlcmVuY2VfdmFyaWFibGU6IHsKKyAgICAgIGNvbnN0IGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpjb25zdCBkdiA9CisgICAgICAgICAoY29uc3QgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKikgZGVyZWY7CisKKyAgICAgIHN0b3JlID0gKGlyX2NvbnN0YW50ICopIGhhc2hfdGFibGVfZmluZCh2YXJpYWJsZV9jb250ZXh0LCBkdi0+dmFyKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gc3RvcmUgIT0gTlVMTDsKK30KKworCitpcl9jb25zdGFudCAqCitpcl9ydmFsdWU6OmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoc3RydWN0IGhhc2hfdGFibGUgKikKK3sKKyAgIGFzc2VydCh0aGlzLT50eXBlLT5pc19lcnJvcigpKTsKKyAgIHJldHVybiBOVUxMOworfQorCitpcl9jb25zdGFudCAqCitpcl9leHByZXNzaW9uOjpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0KQoreworICAgaWYgKHRoaXMtPnR5cGUtPmlzX2Vycm9yKCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaXJfY29uc3RhbnQgKm9wW0VsZW1lbnRzKHRoaXMtPm9wZXJhbmRzKV0gPSB7IE5VTEwsIH07CisgICBpcl9jb25zdGFudF9kYXRhIGRhdGE7CisKKyAgIG1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKworICAgZm9yICh1bnNpZ25lZCBvcGVyYW5kID0gMDsgb3BlcmFuZCA8IHRoaXMtPmdldF9udW1fb3BlcmFuZHMoKTsgb3BlcmFuZCsrKSB7CisgICAgICBvcFtvcGVyYW5kXSA9IHRoaXMtPm9wZXJhbmRzW29wZXJhbmRdLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHZhcmlhYmxlX2NvbnRleHQpOworICAgICAgaWYgKCFvcFtvcGVyYW5kXSkKKwkgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlmIChvcFsxXSAhPSBOVUxMKQorICAgICAgc3dpdGNoICh0aGlzLT5vcGVyYXRpb24pIHsKKyAgICAgIGNhc2UgaXJfYmlub3BfbHNoaWZ0OgorICAgICAgY2FzZSBpcl9iaW5vcF9yc2hpZnQ6CisgICAgICBjYXNlIGlyX2Jpbm9wX2xkZXhwOgorICAgICAgY2FzZSBpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdDoKKyAgICAgIGNhc2UgaXJfdHJpb3BfY3NlbDoKKyAgICAgIGNhc2UgaXJfdHJpb3BfYml0ZmllbGRfZXh0cmFjdDoKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gb3BbMV0tPnR5cGUtPmJhc2VfdHlwZSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgYm9vbCBvcDBfc2NhbGFyID0gb3BbMF0tPnR5cGUtPmlzX3NjYWxhcigpOworICAgYm9vbCBvcDFfc2NhbGFyID0gb3BbMV0gIT0gTlVMTCAmJiBvcFsxXS0+dHlwZS0+aXNfc2NhbGFyKCk7CisKKyAgIC8qIFdoZW4gaXRlcmF0aW5nIG92ZXIgYSB2ZWN0b3Igb3IgbWF0cml4J3MgY29tcG9uZW50cywgd2Ugd2FudCB0byBpbmNyZWFzZQorICAgICogdGhlIGxvb3AgY291bnRlci4gIEhvd2V2ZXIsIGZvciBzY2FsYXJzLCB3ZSB3YW50IHRvIHN0YXkgYXQgMC4KKyAgICAqLworICAgdW5zaWduZWQgYzBfaW5jID0gb3AwX3NjYWxhciA/IDAgOiAxOworICAgdW5zaWduZWQgYzFfaW5jID0gb3AxX3NjYWxhciA/IDAgOiAxOworICAgdW5zaWduZWQgY29tcG9uZW50czsKKyAgIGlmIChvcDFfc2NhbGFyIHx8ICFvcFsxXSkgeworICAgICAgY29tcG9uZW50cyA9IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7CisgICB9IGVsc2UgeworICAgICAgY29tcG9uZW50cyA9IG9wWzFdLT50eXBlLT5jb21wb25lbnRzKCk7CisgICB9CisKKyAgIHZvaWQgKmN0eCA9IHJhbGxvY19wYXJlbnQodGhpcyk7CisKKyAgIC8qIEhhbmRsZSBhcnJheSBvcGVyYXRpb25zIGhlcmUsIHJhdGhlciB0aGFuIGJlbG93LiAqLworICAgaWYgKG9wWzBdLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICBhc3NlcnQob3BbMV0gIT0gTlVMTCAmJiBvcFsxXS0+dHlwZS0+aXNfYXJyYXkoKSk7CisgICAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikgeworICAgICAgY2FzZSBpcl9iaW5vcF9hbGxfZXF1YWw6CisJIHJldHVybiBuZXcoY3R4KSBpcl9jb25zdGFudChvcFswXS0+aGFzX3ZhbHVlKG9wWzFdKSk7CisgICAgICBjYXNlIGlyX2Jpbm9wX2FueV9uZXF1YWw6CisJIHJldHVybiBuZXcoY3R4KSBpcl9jb25zdGFudCghb3BbMF0tPmhhc192YWx1ZShvcFsxXSkpOworICAgICAgZGVmYXVsdDoKKwkgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgc3dpdGNoICh0aGlzLT5vcGVyYXRpb24pIHsKKyAgIGNhc2UgaXJfdW5vcF9iaXRfbm90OgorICAgICAgIHN3aXRjaCAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSkgeworICAgICAgIGNhc2UgR0xTTF9UWVBFX0lOVDoKKyAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykKKyAgICAgICAgICAgICAgIGRhdGEuaVtjXSA9IH4gb3BbMF0tPnZhbHVlLmlbY107CisgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspCisgICAgICAgICAgICAgICBkYXRhLnVbY10gPSB+IG9wWzBdLT52YWx1ZS51W2NdOworICAgICAgICAgICBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgfQorICAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0JPT0wpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykKKwkgZGF0YS5iW2NdID0gIW9wWzBdLT52YWx1ZS5iW2NdOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9mMmk6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmlbY10gPSAoaW50KSBvcFswXS0+dmFsdWUuZltjXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2YydToKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisgICAgICAgICBkYXRhLmlbY10gPSAodW5zaWduZWQpIG9wWzBdLT52YWx1ZS5mW2NdOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfaTJmOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IChmbG9hdCkgb3BbMF0tPnZhbHVlLmlbY107CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF91MmY6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IChmbG9hdCkgb3BbMF0tPnZhbHVlLnVbY107CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9iMmY6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQk9PTCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IG9wWzBdLT52YWx1ZS5iW2NdID8gMS4wRiA6IDAuMEY7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9mMmI6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuZltjXSAhPSAwLjBGID8gdHJ1ZSA6IGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfYjJpOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0JPT0wpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLnVbY10gPSBvcFswXS0+dmFsdWUuYltjXSA/IDEgOiAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfaTJiOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5pc19pbnRlZ2VyKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUudVtjXSA/IHRydWUgOiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3UyaToKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgZGF0YS5pW2NdID0gb3BbMF0tPnZhbHVlLnVbY107CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9pMnU6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgZGF0YS51W2NdID0gb3BbMF0tPnZhbHVlLmlbY107CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2kyZjoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmZbY10gPSBiaXRjYXN0X3UyZihvcFswXS0+dmFsdWUuaVtjXSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2YyaToKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuaVtjXSA9IGJpdGNhc3RfZjJ1KG9wWzBdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2JpdGNhc3RfdTJmOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1VJTlQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmZbY10gPSBiaXRjYXN0X3UyZihvcFswXS0+dmFsdWUudVtjXSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2YydToKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEudVtjXSA9IGJpdGNhc3RfZjJ1KG9wWzBdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2FueToKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+aXNfYm9vbGVhbigpKTsKKyAgICAgIGRhdGEuYlswXSA9IGZhbHNlOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBpZiAob3BbMF0tPnZhbHVlLmJbY10pCisJICAgIGRhdGEuYlswXSA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3RydW5jOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgZGF0YS5mW2NdID0gdHJ1bmNmKG9wWzBdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfcm91bmRfZXZlbjoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IF9tZXNhX3JvdW5kX3RvX2V2ZW4ob3BbMF0tPnZhbHVlLmZbY10pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9jZWlsOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgZGF0YS5mW2NdID0gY2VpbGYob3BbMF0tPnZhbHVlLmZbY10pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9mbG9vcjoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IGZsb29yZihvcFswXS0+dmFsdWUuZltjXSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2ZyYWN0OgorICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBzd2l0Y2ggKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICBkYXRhLnVbY10gPSAwOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBkYXRhLmlbY10gPSAwOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGRhdGEuZltjXSA9IG9wWzBdLT52YWx1ZS5mW2NdIC0gZmxvb3Iob3BbMF0tPnZhbHVlLmZbY10pOworCSAgICBicmVhazsKKwkgZGVmYXVsdDoKKwkgICAgYXNzZXJ0KDApOworCSB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3NpbjoKKyAgIGNhc2UgaXJfdW5vcF9zaW5fcmVkdWNlZDoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IHNpbmYob3BbMF0tPnZhbHVlLmZbY10pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9jb3M6CisgICBjYXNlIGlyX3Vub3BfY29zX3JlZHVjZWQ6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmZbY10gPSBjb3NmKG9wWzBdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfbmVnOgorICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBzd2l0Y2ggKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICBkYXRhLnVbY10gPSAtKChpbnQpIG9wWzBdLT52YWx1ZS51W2NdKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZGF0YS5pW2NdID0gLW9wWzBdLT52YWx1ZS5pW2NdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGRhdGEuZltjXSA9IC1vcFswXS0+dmFsdWUuZltjXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9hYnM6CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIHN3aXRjaCAodGhpcy0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2NdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBkYXRhLmlbY10gPSBvcFswXS0+dmFsdWUuaVtjXTsKKwkgICAgaWYgKGRhdGEuaVtjXSA8IDApCisJICAgICAgIGRhdGEuaVtjXSA9IC1kYXRhLmlbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgICAgZGF0YS5mW2NdID0gZmFicyhvcFswXS0+dmFsdWUuZltjXSk7CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoMCk7CisJIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfc2lnbjoKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgc3dpdGNoICh0aGlzLT50eXBlLT5iYXNlX3R5cGUpIHsKKwkgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgICAgZGF0YS51W2NdID0gb3BbMF0tPnZhbHVlLmlbY10gPiAwOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBkYXRhLmlbY10gPSAob3BbMF0tPnZhbHVlLmlbY10gPiAwKSAtIChvcFswXS0+dmFsdWUuaVtjXSA8IDApOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGRhdGEuZltjXSA9IGZsb2F0KChvcFswXS0+dmFsdWUuZltjXSA+IDApLShvcFswXS0+dmFsdWUuZltjXSA8IDApKTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9yY3A6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBzd2l0Y2ggKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICBpZiAob3BbMF0tPnZhbHVlLnVbY10gIT0gMC4wKQorCSAgICAgICBkYXRhLnVbY10gPSAxIC8gb3BbMF0tPnZhbHVlLnVbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJICAgIGlmIChvcFswXS0+dmFsdWUuaVtjXSAhPSAwLjApCisJICAgICAgIGRhdGEuaVtjXSA9IDEgLyBvcFswXS0+dmFsdWUuaVtjXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBpZiAob3BbMF0tPnZhbHVlLmZbY10gIT0gMC4wKQorCSAgICAgICBkYXRhLmZbY10gPSAxLjBGIC8gb3BbMF0tPnZhbHVlLmZbY107CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoMCk7CisJIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfcnNxOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgZGF0YS5mW2NdID0gMS4wRiAvIHNxcnRmKG9wWzBdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfc3FydDoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IHNxcnRmKG9wWzBdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfZXhwOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgZGF0YS5mW2NdID0gZXhwZihvcFswXS0+dmFsdWUuZltjXSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2V4cDI6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmZbY10gPSBleHAyZihvcFswXS0+dmFsdWUuZltjXSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2xvZzoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IGxvZ2Yob3BbMF0tPnZhbHVlLmZbY10pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9sb2cyOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgZGF0YS5mW2NdID0gbG9nMmYob3BbMF0tPnZhbHVlLmZbY10pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9kRmR4OgorICAgY2FzZSBpcl91bm9wX2RGZHk6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBkYXRhLmZbY10gPSAwLjA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fMngxNjoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisgICAgICBkYXRhLnVbMF0gPSBwYWNrXzJ4MTYocGFja19zbm9ybV8xeDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS5mWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS5mWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fNHg4OgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgICAgIGRhdGEudVswXSA9IHBhY2tfNHg4KHBhY2tfc25vcm1fMXg4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0tPnZhbHVlLmZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+dmFsdWUuZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS5mWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0tPnZhbHVlLmZbM10pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Nub3JtXzJ4MTY6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgdW5wYWNrXzJ4MTYodW5wYWNrX3Nub3JtXzF4MTYsCisgICAgICAgICAgICAgICAgICBvcFswXS0+dmFsdWUudVswXSwKKyAgICAgICAgICAgICAgICAgICZkYXRhLmZbMF0sICZkYXRhLmZbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Nub3JtXzR4ODoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICB1bnBhY2tfNHg4KHVucGFja19zbm9ybV8xeDgsCisgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS51WzBdLAorICAgICAgICAgICAgICAgICAmZGF0YS5mWzBdLCAmZGF0YS5mWzFdLCAmZGF0YS5mWzJdLCAmZGF0YS5mWzNdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3BhY2tfdW5vcm1fMngxNjoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisgICAgICBkYXRhLnVbMF0gPSBwYWNrXzJ4MTYocGFja191bm9ybV8xeDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS5mWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS5mWzFdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3BhY2tfdW5vcm1fNHg4OgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IGdsc2xfdHlwZTo6dmVjNF90eXBlKTsKKyAgICAgIGRhdGEudVswXSA9IHBhY2tfNHg4KHBhY2tfdW5vcm1fMXg4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0tPnZhbHVlLmZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+dmFsdWUuZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS5mWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0tPnZhbHVlLmZbM10pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Vub3JtXzJ4MTY6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgdW5wYWNrXzJ4MTYodW5wYWNrX3Vub3JtXzF4MTYsCisgICAgICAgICAgICAgICAgICBvcFswXS0+dmFsdWUudVswXSwKKyAgICAgICAgICAgICAgICAgICZkYXRhLmZbMF0sICZkYXRhLmZbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Vub3JtXzR4ODoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICB1bnBhY2tfNHg4KHVucGFja191bm9ybV8xeDgsCisgICAgICAgICAgICAgICAgIG9wWzBdLT52YWx1ZS51WzBdLAorICAgICAgICAgICAgICAgICAmZGF0YS5mWzBdLCAmZGF0YS5mWzFdLCAmZGF0YS5mWzJdLCAmZGF0YS5mWzNdKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX3BhY2tfaGFsZl8yeDE2OgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IGdsc2xfdHlwZTo6dmVjMl90eXBlKTsKKyAgICAgIGRhdGEudVswXSA9IHBhY2tfMngxNihwYWNrX2hhbGZfMXgxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+dmFsdWUuZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFswXS0+dmFsdWUuZlsxXSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2OgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIHVucGFja18yeDE2KHVucGFja19oYWxmXzF4MTYsCisgICAgICAgICAgICAgICAgICBvcFswXS0+dmFsdWUudVswXSwKKyAgICAgICAgICAgICAgICAgICZkYXRhLmZbMF0sICZkYXRhLmZbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX3BvdzoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIGRhdGEuZltjXSA9IHBvd2Yob3BbMF0tPnZhbHVlLmZbY10sIG9wWzFdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2RvdDoKKyAgICAgIGRhdGEuZlswXSA9IGRvdChvcFswXSwgb3BbMV0pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbWluOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlIHx8IG9wMF9zY2FsYXIgfHwgb3AxX3NjYWxhcik7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKwkgICBjIDwgY29tcG9uZW50czsKKwkgICBjMCArPSBjMF9pbmMsIGMxICs9IGMxX2luYywgYysrKSB7CisKKwkgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGRhdGEudVtjXSA9IE1JTjIob3BbMF0tPnZhbHVlLnVbYzBdLCBvcFsxXS0+dmFsdWUudVtjMV0pOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBkYXRhLmlbY10gPSBNSU4yKG9wWzBdLT52YWx1ZS5pW2MwXSwgb3BbMV0tPnZhbHVlLmlbYzFdKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBkYXRhLmZbY10gPSBNSU4yKG9wWzBdLT52YWx1ZS5mW2MwXSwgb3BbMV0tPnZhbHVlLmZbYzFdKTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfbWF4OgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlIHx8IG9wMF9zY2FsYXIgfHwgb3AxX3NjYWxhcik7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKwkgICBjIDwgY29tcG9uZW50czsKKwkgICBjMCArPSBjMF9pbmMsIGMxICs9IGMxX2luYywgYysrKSB7CisKKwkgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGRhdGEudVtjXSA9IE1BWDIob3BbMF0tPnZhbHVlLnVbYzBdLCBvcFsxXS0+dmFsdWUudVtjMV0pOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBkYXRhLmlbY10gPSBNQVgyKG9wWzBdLT52YWx1ZS5pW2MwXSwgb3BbMV0tPnZhbHVlLmlbYzFdKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBkYXRhLmZbY10gPSBNQVgyKG9wWzBdLT52YWx1ZS5mW2MwXSwgb3BbMV0tPnZhbHVlLmZbYzFdKTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfYWRkOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlIHx8IG9wMF9zY2FsYXIgfHwgb3AxX3NjYWxhcik7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKwkgICBjIDwgY29tcG9uZW50czsKKwkgICBjMCArPSBjMF9pbmMsIGMxICs9IGMxX2luYywgYysrKSB7CisKKwkgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2MwXSArIG9wWzFdLT52YWx1ZS51W2MxXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZGF0YS5pW2NdID0gb3BbMF0tPnZhbHVlLmlbYzBdICsgb3BbMV0tPnZhbHVlLmlbYzFdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGRhdGEuZltjXSA9IG9wWzBdLT52YWx1ZS5mW2MwXSArIG9wWzFdLT52YWx1ZS5mW2MxXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3Bfc3ViOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlIHx8IG9wMF9zY2FsYXIgfHwgb3AxX3NjYWxhcik7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKwkgICBjIDwgY29tcG9uZW50czsKKwkgICBjMCArPSBjMF9pbmMsIGMxICs9IGMxX2luYywgYysrKSB7CisKKwkgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2MwXSAtIG9wWzFdLT52YWx1ZS51W2MxXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZGF0YS5pW2NdID0gb3BbMF0tPnZhbHVlLmlbYzBdIC0gb3BbMV0tPnZhbHVlLmlbYzFdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGRhdGEuZltjXSA9IG9wWzBdLT52YWx1ZS5mW2MwXSAtIG9wWzFdLT52YWx1ZS5mW2MxXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfbXVsOgorICAgICAgLyogQ2hlY2sgZm9yIGVxdWFsIHR5cGVzLCBvciB1bmVxdWFsIHR5cGVzIGludm9sdmluZyBzY2FsYXJzICovCisgICAgICBpZiAoKG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlICYmICFvcFswXS0+dHlwZS0+aXNfbWF0cml4KCkpCisJICB8fCBvcDBfc2NhbGFyIHx8IG9wMV9zY2FsYXIpIHsKKwkgZm9yICh1bnNpZ25lZCBjID0gMCwgYzAgPSAwLCBjMSA9IDA7CisJICAgICAgYyA8IGNvbXBvbmVudHM7CisJICAgICAgYzAgKz0gYzBfaW5jLCBjMSArPSBjMV9pbmMsIGMrKykgeworCisJICAgIHN3aXRjaCAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSkgeworCSAgICBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICAgICBkYXRhLnVbY10gPSBvcFswXS0+dmFsdWUudVtjMF0gKiBvcFsxXS0+dmFsdWUudVtjMV07CisJICAgICAgIGJyZWFrOworCSAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJICAgICAgIGRhdGEuaVtjXSA9IG9wWzBdLT52YWx1ZS5pW2MwXSAqIG9wWzFdLT52YWx1ZS5pW2MxXTsKKwkgICAgICAgYnJlYWs7CisJICAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICAgICBkYXRhLmZbY10gPSBvcFswXS0+dmFsdWUuZltjMF0gKiBvcFsxXS0+dmFsdWUuZltjMV07CisJICAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgICBhc3NlcnQoMCk7CisJICAgIH0KKwkgfQorICAgICAgfSBlbHNlIHsKKwkgYXNzZXJ0KG9wWzBdLT50eXBlLT5pc19tYXRyaXgoKSB8fCBvcFsxXS0+dHlwZS0+aXNfbWF0cml4KCkpOworCisJIC8qIE11bHRpcGx5IGFuIE4tYnktTSBtYXRyaXggd2l0aCBhbiBNLWJ5LVAgbWF0cml4LiAgU2luY2UgZWl0aGVyCisJICAqIG1hdHJpeCBjYW4gYmUgYSBHTFNMIHZlY3RvciwgZWl0aGVyIE4gb3IgUCBjYW4gYmUgMS4KKwkgICoKKwkgICogRm9yIHZlYyptYXQsIHRoZSB2ZWN0b3IgaXMgdHJlYXRlZCBhcyBhIHJvdyB2ZWN0b3IuICBUaGlzCisJICAqIG1lYW5zIHRoZSB2ZWN0b3IgaXMgYSAxLXJvdyB4IE0tY29sdW1uIG1hdHJpeC4KKwkgICoKKwkgICogRm9yIG1hdCp2ZWMsIHRoZSB2ZWN0b3IgaXMgdHJlYXRlZCBhcyBhIGNvbHVtbiB2ZWN0b3IuICBTaW5jZQorCSAgKiBtYXRyaXhfY29sdW1ucyBpcyAxIGZvciB2ZWN0b3JzLCB0aGlzIGp1c3Qgd29ya3MuCisJICAqLworCSBjb25zdCB1bnNpZ25lZCBuID0gb3BbMF0tPnR5cGUtPmlzX3ZlY3RvcigpCisJICAgID8gMSA6IG9wWzBdLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7CisJIGNvbnN0IHVuc2lnbmVkIG0gPSBvcFsxXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOworCSBjb25zdCB1bnNpZ25lZCBwID0gb3BbMV0tPnR5cGUtPm1hdHJpeF9jb2x1bW5zOworCSBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgcDsgaisrKSB7CisJICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkgICAgICAgZm9yICh1bnNpZ25lZCBrID0gMDsgayA8IG07IGsrKykgeworCQkgIGRhdGEuZltpK24qal0gKz0gb3BbMF0tPnZhbHVlLmZbaStuKmtdKm9wWzFdLT52YWx1ZS5mW2srbSpqXTsKKwkgICAgICAgfQorCSAgICB9CisJIH0KKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2RpdjoKKyAgICAgIC8qIEZJTklTSE1FOiBFbWl0IHdhcm5pbmcgd2hlbiBkaXZpc2lvbi1ieS16ZXJvIGlzIGRldGVjdGVkLiAqLworICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlIHx8IG9wMF9zY2FsYXIgfHwgb3AxX3NjYWxhcik7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKwkgICBjIDwgY29tcG9uZW50czsKKwkgICBjMCArPSBjMF9pbmMsIGMxICs9IGMxX2luYywgYysrKSB7CisKKwkgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGlmIChvcFsxXS0+dmFsdWUudVtjMV0gPT0gMCkgeworCSAgICAgICBkYXRhLnVbY10gPSAwOworCSAgICB9IGVsc2UgeworCSAgICAgICBkYXRhLnVbY10gPSBvcFswXS0+dmFsdWUudVtjMF0gLyBvcFsxXS0+dmFsdWUudVtjMV07CisJICAgIH0KKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgaWYgKG9wWzFdLT52YWx1ZS5pW2MxXSA9PSAwKSB7CisJICAgICAgIGRhdGEuaVtjXSA9IDA7CisJICAgIH0gZWxzZSB7CisJICAgICAgIGRhdGEuaVtjXSA9IG9wWzBdLT52YWx1ZS5pW2MwXSAvIG9wWzFdLT52YWx1ZS5pW2MxXTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJICAgIGRhdGEuZltjXSA9IG9wWzBdLT52YWx1ZS5mW2MwXSAvIG9wWzFdLT52YWx1ZS5mW2MxXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfbW9kOgorICAgICAgLyogRklOSVNITUU6IEVtaXQgd2FybmluZyB3aGVuIGRpdmlzaW9uLWJ5LXplcm8gaXMgZGV0ZWN0ZWQuICovCisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUgPT0gb3BbMV0tPnR5cGUgfHwgb3AwX3NjYWxhciB8fCBvcDFfc2NhbGFyKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDAsIGMwID0gMCwgYzEgPSAwOworCSAgIGMgPCBjb21wb25lbnRzOworCSAgIGMwICs9IGMwX2luYywgYzEgKz0gYzFfaW5jLCBjKyspIHsKKworCSBzd2l0Y2ggKG9wWzBdLT50eXBlLT5iYXNlX3R5cGUpIHsKKwkgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgICAgaWYgKG9wWzFdLT52YWx1ZS51W2MxXSA9PSAwKSB7CisJICAgICAgIGRhdGEudVtjXSA9IDA7CisJICAgIH0gZWxzZSB7CisJICAgICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2MwXSAlIG9wWzFdLT52YWx1ZS51W2MxXTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBpZiAob3BbMV0tPnZhbHVlLmlbYzFdID09IDApIHsKKwkgICAgICAgZGF0YS5pW2NdID0gMDsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgZGF0YS5pW2NdID0gb3BbMF0tPnZhbHVlLmlbYzBdICUgb3BbMV0tPnZhbHVlLmlbYzFdOworCSAgICB9CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgICAgLyogV2UgZG9uJ3QgdXNlIGZtb2QgYmVjYXVzZSBpdCByb3VuZHMgdG93YXJkIHplcm87IEdMU0wgc3BlY2lmaWVzCisJICAgICAqIHRoZSB1c2Ugb2YgZmxvb3IuCisJICAgICAqLworCSAgICBkYXRhLmZbY10gPSBvcFswXS0+dmFsdWUuZltjMF0gLSBvcFsxXS0+dmFsdWUuZltjMV0KKwkgICAgICAgKiBmbG9vcmYob3BbMF0tPnZhbHVlLmZbYzBdIC8gb3BbMV0tPnZhbHVlLmZbYzFdKTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorCisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sb2dpY19hbmQ6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQk9PTCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKQorCSBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuYltjXSAmJiBvcFsxXS0+dmFsdWUuYltjXTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9sb2dpY194b3I6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQk9PTCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKQorCSBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuYltjXSBeIG9wWzFdLT52YWx1ZS5iW2NdOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX29yOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0JPT0wpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykKKwkgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmJbY10gfHwgb3BbMV0tPnZhbHVlLmJbY107CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGRhdGEuYltjXSA9IG9wWzBdLT52YWx1ZS51W2NdIDwgb3BbMV0tPnZhbHVlLnVbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJICAgIGRhdGEuYltjXSA9IG9wWzBdLT52YWx1ZS5pW2NdIDwgb3BbMV0tPnZhbHVlLmlbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmZbY10gPCBvcFsxXS0+dmFsdWUuZltjXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICAgICBhc3NlcnQob3BbMF0tPnR5cGUgPT0gb3BbMV0tPnR5cGUpOworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wWzBdLT50eXBlLT5jb21wb25lbnRzKCk7IGMrKykgeworCSBzd2l0Y2ggKG9wWzBdLT50eXBlLT5iYXNlX3R5cGUpIHsKKwkgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLnVbY10gPiBvcFsxXS0+dmFsdWUudVtjXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmlbY10gPiBvcFsxXS0+dmFsdWUuaVtjXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuZltjXSA+IG9wWzFdLT52YWx1ZS5mW2NdOworCSAgICBicmVhazsKKwkgZGVmYXVsdDoKKwkgICAgYXNzZXJ0KDApOworCSB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfYmlub3BfbGVxdWFsOgorICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlID09IG9wWzFdLT50eXBlKTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcFswXS0+dHlwZS0+Y29tcG9uZW50cygpOyBjKyspIHsKKwkgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJICAgIGRhdGEuYltjXSA9IG9wWzBdLT52YWx1ZS51W2NdIDw9IG9wWzFdLT52YWx1ZS51W2NdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuaVtjXSA8PSBvcFsxXS0+dmFsdWUuaVtjXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuZltjXSA8PSBvcFsxXS0+dmFsdWUuZltjXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZSA9PSBvcFsxXS0+dHlwZSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgb3BbMF0tPnR5cGUtPmNvbXBvbmVudHMoKTsgYysrKSB7CisJIHN3aXRjaCAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUudVtjXSA+PSBvcFsxXS0+dmFsdWUudVtjXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmlbY10gPj0gb3BbMV0tPnZhbHVlLmlbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmZbY10gPj0gb3BbMV0tPnZhbHVlLmZbY107CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoMCk7CisJIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl9iaW5vcF9lcXVhbDoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZSA9PSBvcFsxXS0+dHlwZSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgY29tcG9uZW50czsgYysrKSB7CisJIHN3aXRjaCAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUudVtjXSA9PSBvcFsxXS0+dmFsdWUudVtjXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmlbY10gPT0gb3BbMV0tPnZhbHVlLmlbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmZbY10gPT0gb3BbMV0tPnZhbHVlLmZbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9CT09MOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuYltjXSA9PSBvcFsxXS0+dmFsdWUuYltjXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX25lcXVhbDoKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZSA9PSBvcFsxXS0+dHlwZSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgY29tcG9uZW50czsgYysrKSB7CisJIHN3aXRjaCAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUudVtjXSAhPSBvcFsxXS0+dmFsdWUudVtjXTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmlbY10gIT0gb3BbMV0tPnZhbHVlLmlbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgICAgZGF0YS5iW2NdID0gb3BbMF0tPnZhbHVlLmZbY10gIT0gb3BbMV0tPnZhbHVlLmZbY107CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9CT09MOgorCSAgICBkYXRhLmJbY10gPSBvcFswXS0+dmFsdWUuYltjXSAhPSBvcFsxXS0+dmFsdWUuYltjXTsKKwkgICAgYnJlYWs7CisJIGRlZmF1bHQ6CisJICAgIGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2FsbF9lcXVhbDoKKyAgICAgIGRhdGEuYlswXSA9IG9wWzBdLT5oYXNfdmFsdWUob3BbMV0pOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX2Jpbm9wX2FueV9uZXF1YWw6CisgICAgICBkYXRhLmJbMF0gPSAhb3BbMF0tPmhhc192YWx1ZShvcFsxXSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sc2hpZnQ6CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKyAgICAgICAgICAgYyA8IGNvbXBvbmVudHM7CisgICAgICAgICAgIGMwICs9IGMwX2luYywgYzEgKz0gYzFfaW5jLCBjKyspIHsKKworICAgICAgICAgIGlmIChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQgJiYKKyAgICAgICAgICAgICAgb3BbMV0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKSB7CisgICAgICAgICAgICAgIGRhdGEuaVtjXSA9IG9wWzBdLT52YWx1ZS5pW2MwXSA8PCBvcFsxXS0+dmFsdWUuaVtjMV07CisKKyAgICAgICAgICB9IGVsc2UgaWYgKG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCAmJgorICAgICAgICAgICAgICAgICAgICAgb3BbMV0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCkgeworICAgICAgICAgICAgICBkYXRhLmlbY10gPSBvcFswXS0+dmFsdWUuaVtjMF0gPDwgb3BbMV0tPnZhbHVlLnVbYzFdOworCisgICAgICAgICAgfSBlbHNlIGlmIChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UICYmCisgICAgICAgICAgICAgICAgICAgICBvcFsxXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpIHsKKyAgICAgICAgICAgICAgZGF0YS51W2NdID0gb3BbMF0tPnZhbHVlLnVbYzBdIDw8IG9wWzFdLT52YWx1ZS5pW2MxXTsKKworICAgICAgICAgIH0gZWxzZSBpZiAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCAmJgorICAgICAgICAgICAgICAgICAgICAgb3BbMV0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCkgeworICAgICAgICAgICAgICBkYXRhLnVbY10gPSBvcFswXS0+dmFsdWUudVtjMF0gPDwgb3BbMV0tPnZhbHVlLnVbYzFdOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX3JzaGlmdDoKKyAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwLCBjMCA9IDAsIGMxID0gMDsKKyAgICAgICAgICAgIGMgPCBjb21wb25lbnRzOworICAgICAgICAgICAgYzAgKz0gYzBfaW5jLCBjMSArPSBjMV9pbmMsIGMrKykgeworCisgICAgICAgICAgIGlmIChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQgJiYKKyAgICAgICAgICAgICAgIG9wWzFdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCkgeworICAgICAgICAgICAgICAgZGF0YS5pW2NdID0gb3BbMF0tPnZhbHVlLmlbYzBdID4+IG9wWzFdLT52YWx1ZS5pW2MxXTsKKworICAgICAgICAgICB9IGVsc2UgaWYgKG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCAmJgorICAgICAgICAgICAgICAgICAgICAgIG9wWzFdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1VJTlQpIHsKKyAgICAgICAgICAgICAgIGRhdGEuaVtjXSA9IG9wWzBdLT52YWx1ZS5pW2MwXSA+PiBvcFsxXS0+dmFsdWUudVtjMV07CisKKyAgICAgICAgICAgfSBlbHNlIGlmIChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UICYmCisgICAgICAgICAgICAgICAgICAgICAgb3BbMV0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKSB7CisgICAgICAgICAgICAgICBkYXRhLnVbY10gPSBvcFswXS0+dmFsdWUudVtjMF0gPj4gb3BbMV0tPnZhbHVlLmlbYzFdOworCisgICAgICAgICAgIH0gZWxzZSBpZiAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCAmJgorICAgICAgICAgICAgICAgICAgICAgIG9wWzFdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1VJTlQpIHsKKyAgICAgICAgICAgICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2MwXSA+PiBvcFsxXS0+dmFsdWUudVtjMV07CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfYml0X2FuZDoKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDAsIGMwID0gMCwgYzEgPSAwOworICAgICAgICAgICBjIDwgY29tcG9uZW50czsKKyAgICAgICAgICAgYzAgKz0gYzBfaW5jLCBjMSArPSBjMV9pbmMsIGMrKykgeworCisgICAgICAgICAgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorICAgICAgICAgICAgICBkYXRhLmlbY10gPSBvcFswXS0+dmFsdWUuaVtjMF0gJiBvcFsxXS0+dmFsdWUuaVtjMV07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICAgICAgICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2MwXSAmIG9wWzFdLT52YWx1ZS51W2MxXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2JpdF9vcjoKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDAsIGMwID0gMCwgYzEgPSAwOworICAgICAgICAgICBjIDwgY29tcG9uZW50czsKKyAgICAgICAgICAgYzAgKz0gYzBfaW5jLCBjMSArPSBjMV9pbmMsIGMrKykgeworCisgICAgICAgICAgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorICAgICAgICAgICAgICBkYXRhLmlbY10gPSBvcFswXS0+dmFsdWUuaVtjMF0gfCBvcFsxXS0+dmFsdWUuaVtjMV07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICAgICAgICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2MwXSB8IG9wWzFdLT52YWx1ZS51W2MxXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0OiB7CisgICAgICBjb25zdCBpbnQgYyA9IENMQU1QKG9wWzFdLT52YWx1ZS5pWzBdLCAwLAorCQkJICAoaW50KSBvcFswXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzIC0gMSk7CisKKyAgICAgIHN3aXRjaCAob3BbMF0tPnR5cGUtPmJhc2VfdHlwZSkgeworICAgICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgICAgICAgIGRhdGEudVswXSA9IG9wWzBdLT52YWx1ZS51W2NdOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICAgICAgICBkYXRhLmlbMF0gPSBvcFswXS0+dmFsdWUuaVtjXTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisgICAgICAgICBkYXRhLmZbMF0gPSBvcFswXS0+dmFsdWUuZltjXTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKyAgICAgICAgIGRhdGEuYlswXSA9IG9wWzBdLT52YWx1ZS5iW2NdOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgYXNzZXJ0KDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfYmlub3BfYml0X3hvcjoKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDAsIGMwID0gMCwgYzEgPSAwOworICAgICAgICAgICBjIDwgY29tcG9uZW50czsKKyAgICAgICAgICAgYzAgKz0gYzBfaW5jLCBjMSArPSBjMV9pbmMsIGMrKykgeworCisgICAgICAgICAgc3dpdGNoIChvcFswXS0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorICAgICAgICAgICAgICBkYXRhLmlbY10gPSBvcFswXS0+dmFsdWUuaVtjMF0gXiBvcFsxXS0+dmFsdWUuaVtjMV07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICAgICAgICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS51W2MwXSBeIG9wWzFdLT52YWx1ZS51W2MxXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfYml0ZmllbGRfcmV2ZXJzZToKKyAgICAgIC8qIGh0dHA6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbCNCaXRSZXZlcnNlT2J2aW91cyAqLworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgdW5zaWduZWQgaW50IHYgPSBvcFswXS0+dmFsdWUudVtjXTsgLy8gaW5wdXQgYml0cyB0byBiZSByZXZlcnNlZAorICAgICAgICAgdW5zaWduZWQgaW50IHIgPSB2OyAvLyByIHdpbGwgYmUgcmV2ZXJzZWQgYml0cyBvZiB2OyBmaXJzdCBnZXQgTFNCIG9mIHYKKyAgICAgICAgIGludCBzID0gc2l6ZW9mKHYpICogQ0hBUl9CSVQgLSAxOyAvLyBleHRyYSBzaGlmdCBuZWVkZWQgYXQgZW5kCisKKyAgICAgICAgIGZvciAodiA+Pj0gMTsgdjsgdiA+Pj0gMSkgeworICAgICAgICAgICAgciA8PD0gMTsKKyAgICAgICAgICAgIHIgfD0gdiAmIDE7CisgICAgICAgICAgICBzLS07CisgICAgICAgICB9CisgICAgICAgICByIDw8PSBzOyAvLyBzaGlmdCB3aGVuIHYncyBoaWdoZXN0IGJpdHMgYXJlIHplcm8KKworICAgICAgICAgZGF0YS51W2NdID0gcjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfYml0X2NvdW50OgorICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgdW5zaWduZWQgY291bnQgPSAwOworICAgICAgICAgdW5zaWduZWQgdiA9IG9wWzBdLT52YWx1ZS51W2NdOworCisgICAgICAgICBmb3IgKDsgdjsgY291bnQrKykgeworICAgICAgICAgICAgdiAmPSB2IC0gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGRhdGEudVtjXSA9IGNvdW50OworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9maW5kX21zYjoKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKKyAgICAgICAgIGludCB2ID0gb3BbMF0tPnZhbHVlLmlbY107CisKKyAgICAgICAgIGlmICh2ID09IDAgfHwgKG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCAmJiB2ID09IC0xKSkKKyAgICAgICAgICAgIGRhdGEuaVtjXSA9IC0xOworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgaW50IHRvcF9iaXQgPSBvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gMCA6IHYgJiAoMSA8PCAzMSk7CisKKyAgICAgICAgICAgIHdoaWxlICgoKHYgJiAoMSA8PCAzMSkpID09IHRvcF9iaXQpICYmIGNvdW50ICE9IDMyKSB7CisgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgdiA8PD0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGF0YS5pW2NdID0gMzEgLSBjb3VudDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfZmluZF9sc2I6CisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgY29tcG9uZW50czsgYysrKSB7CisgICAgICAgICBpZiAob3BbMF0tPnZhbHVlLmlbY10gPT0gMCkKKyAgICAgICAgICAgIGRhdGEuaVtjXSA9IC0xOworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBwb3MgPSAwOworICAgICAgICAgICAgdW5zaWduZWQgdiA9IG9wWzBdLT52YWx1ZS51W2NdOworCisgICAgICAgICAgICBmb3IgKDsgISh2ICYgMSk7IHYgPj49IDEpIHsKKyAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS51W2NdID0gcG9zOworICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdHJpb3BfYml0ZmllbGRfZXh0cmFjdDogeworICAgICAgaW50IG9mZnNldCA9IG9wWzFdLT52YWx1ZS5pWzBdOworICAgICAgaW50IGJpdHMgPSBvcFsyXS0+dmFsdWUuaVswXTsKKworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgaWYgKGJpdHMgPT0gMCkKKyAgICAgICAgICAgIGRhdGEudVtjXSA9IDA7CisgICAgICAgICBlbHNlIGlmIChvZmZzZXQgPCAwIHx8IGJpdHMgPCAwKQorICAgICAgICAgICAgZGF0YS51W2NdID0gMDsgLyogVW5kZWZpbmVkLCBwZXIgc3BlYy4gKi8KKyAgICAgICAgIGVsc2UgaWYgKG9mZnNldCArIGJpdHMgPiAzMikKKyAgICAgICAgICAgIGRhdGEudVtjXSA9IDA7IC8qIFVuZGVmaW5lZCwgcGVyIHNwZWMuICovCisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpIHsKKyAgICAgICAgICAgICAgIC8qIGludCBzbyB0aGF0IHRoZSByaWdodCBzaGlmdCB3aWxsIHNpZ24tZXh0ZW5kLiAqLworICAgICAgICAgICAgICAgaW50IHZhbHVlID0gb3BbMF0tPnZhbHVlLmlbY107CisgICAgICAgICAgICAgICB2YWx1ZSA8PD0gMzIgLSBiaXRzIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgdmFsdWUgPj49IDMyIC0gYml0czsKKyAgICAgICAgICAgICAgIGRhdGEuaVtjXSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbHVlID0gb3BbMF0tPnZhbHVlLnVbY107CisgICAgICAgICAgICAgICB2YWx1ZSA8PD0gMzIgLSBiaXRzIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgdmFsdWUgPj49IDMyIC0gYml0czsKKyAgICAgICAgICAgICAgIGRhdGEudVtjXSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfYmlub3BfYmZtOiB7CisgICAgICBpbnQgYml0cyA9IG9wWzBdLT52YWx1ZS5pWzBdOworICAgICAgaW50IG9mZnNldCA9IG9wWzFdLT52YWx1ZS5pWzBdOworCisgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgY29tcG9uZW50czsgYysrKSB7CisgICAgICAgICBpZiAoYml0cyA9PSAwKQorICAgICAgICAgICAgZGF0YS51W2NdID0gb3BbMF0tPnZhbHVlLnVbY107CisgICAgICAgICBlbHNlIGlmIChvZmZzZXQgPCAwIHx8IGJpdHMgPCAwKQorICAgICAgICAgICAgZGF0YS51W2NdID0gMDsgLyogVW5kZWZpbmVkIGZvciBiaXRmaWVsZEluc2VydCwgcGVyIHNwZWMuICovCisgICAgICAgICBlbHNlIGlmIChvZmZzZXQgKyBiaXRzID4gMzIpCisgICAgICAgICAgICBkYXRhLnVbY10gPSAwOyAvKiBVbmRlZmluZWQgZm9yIGJpdGZpZWxkSW5zZXJ0LCBwZXIgc3BlYy4gKi8KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRhdGEudVtjXSA9ICgoMSA8PCBiaXRzKSAtIDEpIDw8IG9mZnNldDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGlyX2Jpbm9wX2xkZXhwOgorICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgZGF0YS5mW2NdID0gbGRleHAob3BbMF0tPnZhbHVlLmZbY10sIG9wWzFdLT52YWx1ZS5pW2NdKTsKKyAgICAgICAgIC8qIEZsdXNoIHN1Ym5vcm1hbCB2YWx1ZXMgdG8gemVyby4gKi8KKyAgICAgICAgIGlmICghaXNub3JtYWwoZGF0YS5mW2NdKSkKKyAgICAgICAgICAgIGRhdGEuZltjXSA9IGNvcHlzaWduKDAuMGYsIG9wWzBdLT52YWx1ZS5mW2NdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2ZtYToKKyAgICAgIGFzc2VydChvcFswXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBhc3NlcnQob3BbMV0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYXNzZXJ0KG9wWzJdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgZGF0YS5mW2NdID0gb3BbMF0tPnZhbHVlLmZbY10gKiBvcFsxXS0+dmFsdWUuZltjXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcFsyXS0+dmFsdWUuZltjXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2xycDogeworICAgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGFzc2VydChvcFsxXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBhc3NlcnQob3BbMl0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworCisgICAgICB1bnNpZ25lZCBjMl9pbmMgPSBvcFsyXS0+dHlwZS0+aXNfc2NhbGFyKCkgPyAwIDogMTsKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDAsIGMyID0gMDsgYyA8IGNvbXBvbmVudHM7IGMyICs9IGMyX2luYywgYysrKSB7CisgICAgICAgICBkYXRhLmZbY10gPSBvcFswXS0+dmFsdWUuZltjXSAqICgxLjBmIC0gb3BbMl0tPnZhbHVlLmZbYzJdKSArCisgICAgICAgICAgICAgICAgICAgICAob3BbMV0tPnZhbHVlLmZbY10gKiBvcFsyXS0+dmFsdWUuZltjMl0pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfdHJpb3BfY3NlbDoKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKKyAgICAgICAgIGRhdGEudVtjXSA9IG9wWzBdLT52YWx1ZS5iW2NdID8gb3BbMV0tPnZhbHVlLnVbY10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3BbMl0tPnZhbHVlLnVbY107CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF92ZWN0b3JfaW5zZXJ0OiB7CisgICAgICBjb25zdCB1bnNpZ25lZCBpZHggPSBvcFsyXS0+dmFsdWUudVswXTsKKworICAgICAgbWVtY3B5KCZkYXRhLCAmb3BbMF0tPnZhbHVlLCBzaXplb2YoZGF0YSkpOworCisgICAgICBzd2l0Y2ggKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSkgeworICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorCSBkYXRhLmlbaWR4XSA9IG9wWzFdLT52YWx1ZS5pWzBdOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJIGRhdGEudVtpZHhdID0gb3BbMV0tPnZhbHVlLnVbMF07CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisJIGRhdGEuZltpZHhdID0gb3BbMV0tPnZhbHVlLmZbMF07CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgZGF0YS5iW2lkeF0gPSBvcFsxXS0+dmFsdWUuYlswXTsKKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworCSBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorCisgICBjYXNlIGlyX3F1YWRvcF9iaXRmaWVsZF9pbnNlcnQ6IHsKKyAgICAgIGludCBvZmZzZXQgPSBvcFsyXS0+dmFsdWUuaVswXTsKKyAgICAgIGludCBiaXRzID0gb3BbM10tPnZhbHVlLmlbMF07CisKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKKyAgICAgICAgIGlmIChiaXRzID09IDApCisgICAgICAgICAgICBkYXRhLnVbY10gPSBvcFswXS0+dmFsdWUudVtjXTsKKyAgICAgICAgIGVsc2UgaWYgKG9mZnNldCA8IDAgfHwgYml0cyA8IDApCisgICAgICAgICAgICBkYXRhLnVbY10gPSAwOyAvKiBVbmRlZmluZWQsIHBlciBzcGVjLiAqLworICAgICAgICAgZWxzZSBpZiAob2Zmc2V0ICsgYml0cyA+IDMyKQorICAgICAgICAgICAgZGF0YS51W2NdID0gMDsgLyogVW5kZWZpbmVkLCBwZXIgc3BlYy4gKi8KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgaW5zZXJ0X21hc2sgPSAoKDEgPDwgYml0cykgLSAxKSA8PCBvZmZzZXQ7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGluc2VydCA9IG9wWzFdLT52YWx1ZS51W2NdOworICAgICAgICAgICAgaW5zZXJ0IDw8PSBvZmZzZXQ7CisgICAgICAgICAgICBpbnNlcnQgJj0gaW5zZXJ0X21hc2s7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGJhc2UgPSBvcFswXS0+dmFsdWUudVtjXTsKKyAgICAgICAgICAgIGJhc2UgJj0gfmluc2VydF9tYXNrOworCisgICAgICAgICAgICBkYXRhLnVbY10gPSBiYXNlIHwgaW5zZXJ0OworICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfcXVhZG9wX3ZlY3RvcjoKKyAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCB0aGlzLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGMrKykgeworCSBzd2l0Y2ggKHRoaXMtPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJICAgIGRhdGEuaVtjXSA9IG9wW2NdLT52YWx1ZS5pWzBdOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgICAgZGF0YS51W2NdID0gb3BbY10tPnZhbHVlLnVbMF07CisJICAgIGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgICAgZGF0YS5mW2NdID0gb3BbY10tPnZhbHVlLmZbMF07CisJICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICBhc3NlcnQoMCk7CisJIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgLyogRklOSVNITUU6IFNob3VsZCBoYW5kbGUgYWxsIGV4cHJlc3Npb24gdHlwZXMuICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIG5ldyhjdHgpIGlyX2NvbnN0YW50KHRoaXMtPnR5cGUsICZkYXRhKTsKK30KKworCitpcl9jb25zdGFudCAqCitpcl90ZXh0dXJlOjpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICopCit7CisgICAvKiB0ZXh0dXJlIGxvb2t1cHMgYXJlbid0IGNvbnN0YW50IGV4cHJlc3Npb25zICovCisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9jb25zdGFudCAqCitpcl9zd2l6emxlOjpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0KQoreworICAgaXJfY29uc3RhbnQgKnYgPSB0aGlzLT52YWwtPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUodmFyaWFibGVfY29udGV4dCk7CisKKyAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgIGlyX2NvbnN0YW50X2RhdGEgZGF0YSA9IHsgeyAwIH0gfTsKKworICAgICAgY29uc3QgdW5zaWduZWQgc3dpel9pZHhbNF0gPSB7CisJIHRoaXMtPm1hc2sueCwgdGhpcy0+bWFzay55LCB0aGlzLT5tYXNrLnosIHRoaXMtPm1hc2sudworICAgICAgfTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPm1hc2subnVtX2NvbXBvbmVudHM7IGkrKykgeworCSBzd2l0Y2ggKHYtPnR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSBjYXNlIEdMU0xfVFlQRV9JTlQ6ICAgZGF0YS51W2ldID0gdi0+dmFsdWUudVtzd2l6X2lkeFtpXV07IGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9GTE9BVDogZGF0YS5mW2ldID0gdi0+dmFsdWUuZltzd2l6X2lkeFtpXV07IGJyZWFrOworCSBjYXNlIEdMU0xfVFlQRV9CT09MOiAgZGF0YS5iW2ldID0gdi0+dmFsdWUuYltzd2l6X2lkeFtpXV07IGJyZWFrOworCSBkZWZhdWx0OiAgICAgICAgICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsgYnJlYWs7CisJIH0KKyAgICAgIH0KKworICAgICAgdm9pZCAqY3R4ID0gcmFsbG9jX3BhcmVudCh0aGlzKTsKKyAgICAgIHJldHVybiBuZXcoY3R4KSBpcl9jb25zdGFudCh0aGlzLT50eXBlLCAmZGF0YSk7CisgICB9CisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9jb25zdGFudCAqCitpcl9kZXJlZmVyZW5jZV92YXJpYWJsZTo6Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZShzdHJ1Y3QgaGFzaF90YWJsZSAqdmFyaWFibGVfY29udGV4dCkKK3sKKyAgIC8qIFRoaXMgbWF5IG9jY3VyIGR1cmluZyBjb21waWxlIGFuZCB2YXItPnR5cGUgaXMgZ2xzbF90eXBlOjplcnJvcl90eXBlICovCisgICBpZiAoIXZhcikKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBHaXZlIHByaW9yaXR5IHRvIHRoZSBjb250ZXh0IGhhc2h0YWJsZSwgaWYgaXQgZXhpc3RzICovCisgICBpZiAodmFyaWFibGVfY29udGV4dCkgeworICAgICAgaXJfY29uc3RhbnQgKnZhbHVlID0gKGlyX2NvbnN0YW50ICopaGFzaF90YWJsZV9maW5kKHZhcmlhYmxlX2NvbnRleHQsIHZhcik7CisgICAgICBpZih2YWx1ZSkKKwkgcmV0dXJuIHZhbHVlOworICAgfQorCisgICAvKiBUaGUgY29uc3RhbnRfdmFsdWUgb2YgYSB1bmlmb3JtIHZhcmlhYmxlIGlzIGl0cyBpbml0aWFsaXplciwKKyAgICAqIG5vdCB0aGUgbGlmZXRpbWUgY29uc3RhbnQgdmFsdWUgb2YgdGhlIHVuaWZvcm0uCisgICAgKi8KKyAgIGlmICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfdW5pZm9ybSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAoIXZhci0+Y29uc3RhbnRfdmFsdWUpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgcmV0dXJuIHZhci0+Y29uc3RhbnRfdmFsdWUtPmNsb25lKHJhbGxvY19wYXJlbnQodmFyKSwgTlVMTCk7Cit9CisKKworaXJfY29uc3RhbnQgKgoraXJfZGVyZWZlcmVuY2VfYXJyYXk6OmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoc3RydWN0IGhhc2hfdGFibGUgKnZhcmlhYmxlX2NvbnRleHQpCit7CisgICBpcl9jb25zdGFudCAqYXJyYXkgPSB0aGlzLT5hcnJheS0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSh2YXJpYWJsZV9jb250ZXh0KTsKKyAgIGlyX2NvbnN0YW50ICppZHggPSB0aGlzLT5hcnJheV9pbmRleC0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSh2YXJpYWJsZV9jb250ZXh0KTsKKworICAgaWYgKChhcnJheSAhPSBOVUxMKSAmJiAoaWR4ICE9IE5VTEwpKSB7CisgICAgICB2b2lkICpjdHggPSByYWxsb2NfcGFyZW50KHRoaXMpOworICAgICAgaWYgKGFycmF5LT50eXBlLT5pc19tYXRyaXgoKSkgeworCSAvKiBBcnJheSBhY2Nlc3Mgb2YgYSBtYXRyaXggcmVzdWx0cyBpbiBhIHZlY3Rvci4KKwkgICovCisJIGNvbnN0IHVuc2lnbmVkIGNvbHVtbiA9IGlkeC0+dmFsdWUudVswXTsKKworCSBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGNvbHVtbl90eXBlID0gYXJyYXktPnR5cGUtPmNvbHVtbl90eXBlKCk7CisKKwkgLyogT2Zmc2V0IGluIHRoZSBjb25zdGFudCBtYXRyaXggdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGNvbHVtbgorCSAgKiB0byBiZSBleHRyYWN0ZWQuCisJICAqLworCSBjb25zdCB1bnNpZ25lZCBtYXRfaWR4ID0gY29sdW1uICogY29sdW1uX3R5cGUtPnZlY3Rvcl9lbGVtZW50czsKKworCSBpcl9jb25zdGFudF9kYXRhIGRhdGEgPSB7IHsgMCB9IH07CisKKwkgc3dpdGNoIChjb2x1bW5fdHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNvbHVtbl90eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykKKwkgICAgICAgZGF0YS51W2ldID0gYXJyYXktPnZhbHVlLnVbbWF0X2lkeCArIGldOworCisJICAgIGJyZWFrOworCisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY29sdW1uX3R5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKQorCSAgICAgICBkYXRhLmZbaV0gPSBhcnJheS0+dmFsdWUuZlttYXRfaWR4ICsgaV07CisKKwkgICAgYnJlYWs7CisKKwkgZGVmYXVsdDoKKwkgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKwkgICAgYnJlYWs7CisJIH0KKworCSByZXR1cm4gbmV3KGN0eCkgaXJfY29uc3RhbnQoY29sdW1uX3R5cGUsICZkYXRhKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJyYXktPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisJIGNvbnN0IHVuc2lnbmVkIGNvbXBvbmVudCA9IGlkeC0+dmFsdWUudVswXTsKKworCSByZXR1cm4gbmV3KGN0eCkgaXJfY29uc3RhbnQoYXJyYXksIGNvbXBvbmVudCk7CisgICAgICB9IGVsc2UgeworCSBjb25zdCB1bnNpZ25lZCBpbmRleCA9IGlkeC0+dmFsdWUudVswXTsKKwkgcmV0dXJuIGFycmF5LT5nZXRfYXJyYXlfZWxlbWVudChpbmRleCktPmNsb25lKGN0eCwgTlVMTCk7CisgICAgICB9CisgICB9CisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9jb25zdGFudCAqCitpcl9kZXJlZmVyZW5jZV9yZWNvcmQ6OmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoc3RydWN0IGhhc2hfdGFibGUgKikKK3sKKyAgIGlyX2NvbnN0YW50ICp2ID0gdGhpcy0+cmVjb3JkLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKCk7CisKKyAgIHJldHVybiAodiAhPSBOVUxMKSA/IHYtPmdldF9yZWNvcmRfZmllbGQodGhpcy0+ZmllbGQpIDogTlVMTDsKK30KKworCitpcl9jb25zdGFudCAqCitpcl9hc3NpZ25tZW50Ojpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICopCit7CisgICAvKiBGSU5JU0hNRTogSGFuZGxlIENFcyBpbnZvbHZpbmcgYXNzaWdubWVudCAocmV0dXJuIFJIUykgKi8KKyAgIHJldHVybiBOVUxMOworfQorCisKK2lyX2NvbnN0YW50ICoKK2lyX2NvbnN0YW50Ojpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICopCit7CisgICByZXR1cm4gdGhpczsKK30KKworCitpcl9jb25zdGFudCAqCitpcl9jYWxsOjpjb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0KQoreworICAgcmV0dXJuIHRoaXMtPmNhbGxlZS0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgmdGhpcy0+YWN0dWFsX3BhcmFtZXRlcnMsIHZhcmlhYmxlX2NvbnRleHQpOworfQorCisKK2Jvb2wgaXJfZnVuY3Rpb25fc2lnbmF0dXJlOjpjb25zdGFudF9leHByZXNzaW9uX2V2YWx1YXRlX2V4cHJlc3Npb25fbGlzdChjb25zdCBzdHJ1Y3QgZXhlY19saXN0ICZib2R5LAorCQkJCQkJCQkJIHN0cnVjdCBoYXNoX3RhYmxlICp2YXJpYWJsZV9jb250ZXh0LAorCQkJCQkJCQkJIGlyX2NvbnN0YW50ICoqcmVzdWx0KQoreworICAgZm9yZWFjaF9saXN0KG4sICZib2R5KSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaW5zdCA9IChpcl9pbnN0cnVjdGlvbiAqKW47CisgICAgICBzd2l0Y2goaW5zdC0+aXJfdHlwZSkgeworCisJIC8qIChkZWNsYXJlICgpIHR5cGUgc3ltYm9sKSAqLworICAgICAgY2FzZSBpcl90eXBlX3ZhcmlhYmxlOiB7CisJIGlyX3ZhcmlhYmxlICp2YXIgPSBpbnN0LT5hc192YXJpYWJsZSgpOworCSBoYXNoX3RhYmxlX2luc2VydCh2YXJpYWJsZV9jb250ZXh0LCBpcl9jb25zdGFudDo6emVybyh0aGlzLCB2YXItPnR5cGUpLCB2YXIpOworCSBicmVhazsKKyAgICAgIH0KKworCSAvKiAoYXNzaWduIFtjb25kaXRpb25dICh3cml0ZS1tYXNrKSAocmVmKSAodmFsdWUpKSAqLworICAgICAgY2FzZSBpcl90eXBlX2Fzc2lnbm1lbnQ6IHsKKwkgaXJfYXNzaWdubWVudCAqYXNnID0gaW5zdC0+YXNfYXNzaWdubWVudCgpOworCSBpZiAoYXNnLT5jb25kaXRpb24pIHsKKwkgICAgaXJfY29uc3RhbnQgKmNvbmQgPSBhc2ctPmNvbmRpdGlvbi0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSh2YXJpYWJsZV9jb250ZXh0KTsKKwkgICAgaWYgKCFjb25kKQorCSAgICAgICByZXR1cm4gZmFsc2U7CisJICAgIGlmICghY29uZC0+Z2V0X2Jvb2xfY29tcG9uZW50KDApKQorCSAgICAgICBicmVhazsKKwkgfQorCisJIGlyX2NvbnN0YW50ICpzdG9yZSA9IE5VTEw7CisJIGludCBvZmZzZXQgPSAwOworCisJIGlmICghY29uc3RhbnRfcmVmZXJlbmNlZChhc2ctPmxocywgdmFyaWFibGVfY29udGV4dCwgc3RvcmUsIG9mZnNldCkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSBpcl9jb25zdGFudCAqdmFsdWUgPSBhc2ctPnJocy0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSh2YXJpYWJsZV9jb250ZXh0KTsKKworCSBpZiAoIXZhbHVlKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgc3RvcmUtPmNvcHlfbWFza2VkX29mZnNldCh2YWx1ZSwgb2Zmc2V0LCBhc2ctPndyaXRlX21hc2spOworCSBicmVhazsKKyAgICAgIH0KKworCSAvKiAocmV0dXJuIChleHByZXNzaW9uKSkgKi8KKyAgICAgIGNhc2UgaXJfdHlwZV9yZXR1cm46CisJIGFzc2VydCAocmVzdWx0KTsKKwkgKnJlc3VsdCA9IGluc3QtPmFzX3JldHVybigpLT52YWx1ZS0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSh2YXJpYWJsZV9jb250ZXh0KTsKKwkgcmV0dXJuICpyZXN1bHQgIT0gTlVMTDsKKworCSAvKiAoY2FsbCBuYW1lIChyZWYpIChwYXJhbXMpKSovCisgICAgICBjYXNlIGlyX3R5cGVfY2FsbDogeworCSBpcl9jYWxsICpjYWxsID0gaW5zdC0+YXNfY2FsbCgpOworCisJIC8qIEp1c3Qgc2F5IG5vIHRvIHZvaWQgZnVuY3Rpb25zIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgV2UKKwkgICogZG9uJ3QgbmVlZCB0aGVtIGF0IHRoYXQgcG9pbnQuCisJICAqLworCisJIGlmICghY2FsbC0+cmV0dXJuX2RlcmVmKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgaXJfY29uc3RhbnQgKnN0b3JlID0gTlVMTDsKKwkgaW50IG9mZnNldCA9IDA7CisKKwkgaWYgKCFjb25zdGFudF9yZWZlcmVuY2VkKGNhbGwtPnJldHVybl9kZXJlZiwgdmFyaWFibGVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSwgb2Zmc2V0KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJIGlyX2NvbnN0YW50ICp2YWx1ZSA9IGNhbGwtPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUodmFyaWFibGVfY29udGV4dCk7CisKKwkgaWYoIXZhbHVlKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgc3RvcmUtPmNvcHlfb2Zmc2V0KHZhbHVlLCBvZmZzZXQpOworCSBicmVhazsKKyAgICAgIH0KKworCSAvKiAoaWYgY29uZGl0aW9uICh0aGVuLWluc3RydWN0aW9ucykgKGVsc2UtaW5zdHJ1Y3Rpb25zKSkgKi8KKyAgICAgIGNhc2UgaXJfdHlwZV9pZjogeworCSBpcl9pZiAqaWlmID0gaW5zdC0+YXNfaWYoKTsKKworCSBpcl9jb25zdGFudCAqY29uZCA9IGlpZi0+Y29uZGl0aW9uLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHZhcmlhYmxlX2NvbnRleHQpOworCSBpZiAoIWNvbmQgfHwgIWNvbmQtPnR5cGUtPmlzX2Jvb2xlYW4oKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJIGV4ZWNfbGlzdCAmYnJhbmNoID0gY29uZC0+Z2V0X2Jvb2xfY29tcG9uZW50KDApID8gaWlmLT50aGVuX2luc3RydWN0aW9ucyA6IGlpZi0+ZWxzZV9pbnN0cnVjdGlvbnM7CisKKwkgKnJlc3VsdCA9IE5VTEw7CisJIGlmICghY29uc3RhbnRfZXhwcmVzc2lvbl9ldmFsdWF0ZV9leHByZXNzaW9uX2xpc3QoYnJhbmNoLCB2YXJpYWJsZV9jb250ZXh0LCByZXN1bHQpKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgLyogSWYgdGhlcmUgd2FzIGEgcmV0dXJuIGluIHRoZSBicmFuY2ggY2hvc2VuLCBkcm9wIG91dCBub3cuICovCisJIGlmICgqcmVzdWx0KQorCSAgICByZXR1cm4gdHJ1ZTsKKworCSBicmVhazsKKyAgICAgIH0KKworCSAvKiBFdmVyeSBvdGhlciBleHByZXNzaW9uIHR5cGUsIHdlIGRyb3Agb3V0LiAqLworICAgICAgZGVmYXVsdDoKKwkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCisgICAvKiBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyBub3QgYW4gZXJyb3IgY29uZGl0aW9uICovCisgICBpZiAocmVzdWx0KQorICAgICAgKnJlc3VsdCA9IE5VTEw7CisKKyAgIHJldHVybiB0cnVlOworfQorCitpcl9jb25zdGFudCAqCitpcl9mdW5jdGlvbl9zaWduYXR1cmU6OmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoZXhlY19saXN0ICphY3R1YWxfcGFyYW1ldGVycywgc3RydWN0IGhhc2hfdGFibGUgKnZhcmlhYmxlX2NvbnRleHQpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUgPSB0aGlzLT5yZXR1cm5fdHlwZTsKKyAgIGlmICh0eXBlID09IGdsc2xfdHlwZTo6dm9pZF90eXBlKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIC8qIEZyb20gdGhlIEdMU0wgMS4yMCBzcGVjLCBwYWdlIDIzOgorICAgICogIkZ1bmN0aW9uIGNhbGxzIHRvIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgKG5vbi1idWlsdC1pbiBmdW5jdGlvbnMpCisgICAgKiAgY2Fubm90IGJlIHVzZWQgdG8gZm9ybSBjb25zdGFudCBleHByZXNzaW9ucy4iCisgICAgKi8KKyAgIGlmICghdGhpcy0+aXNfYnVpbHRpbigpKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIC8qCisgICAgKiBPZiB0aGUgYnVpbHRpbiBmdW5jdGlvbnMsIG9ubHkgdGhlIHRleHR1cmUgbG9va3VwcyBhbmQgdGhlIG5vaXNlCisgICAgKiBvbmVzIG11c3Qgbm90IGJlIHVzZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBUaGV5IGFsbCBpbmNsdWRlCisgICAgKiBzcGVjaWZpYyBvcGNvZGVzIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBzcGVjaWFsLWNhc2VkIGF0IHRoaXMKKyAgICAqIHBvaW50LgorICAgICovCisKKyAgIC8qIEluaXRpYWxpemUgdGhlIHRhYmxlIG9mIGRlcmVmZXJlbmNhYmxlIG5hbWVzIHdpdGggdGhlIGZ1bmN0aW9uCisgICAgKiBwYXJhbWV0ZXJzLiAgVmVyaWZ5IHRoZWlyIGNvbnN0LW5lc3Mgb24gdGhlIHdheS4KKyAgICAqCisgICAgKiBXZSBleHBlY3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyB0byBoYXZlCisgICAgKiBiZWVuIGNoZWNrZWQgZWFybGllci4KKyAgICAqLworICAgaGFzaF90YWJsZSAqZGVyZWZfaGFzaCA9IGhhc2hfdGFibGVfY3Rvcig4LCBoYXNoX3RhYmxlX3BvaW50ZXJfaGFzaCwKKwkJCQkJICAgIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKTsKKworICAgLyogSWYgIm9yaWdpbiIgaXMgbm9uLU5VTEwsIHRoZW4gdGhlIGZ1bmN0aW9uIGJvZHkgaXMgdGhlcmUuICBTbyB3ZQorICAgICogaGF2ZSB0byB1c2UgdGhlIHZhcmlhYmxlIG9iamVjdHMgZnJvbSB0aGUgb2JqZWN0IHdpdGggdGhlIGJvZHksCisgICAgKiBidXQgdGhlIHBhcmFtZXRlciBpbnN0YW50aWF0aW9uIG9uIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgICAqLworICAgY29uc3QgZXhlY19ub2RlICpwYXJhbWV0ZXJfaW5mbyA9IG9yaWdpbiA/IG9yaWdpbi0+cGFyYW1ldGVycy5oZWFkIDogcGFyYW1ldGVycy5oZWFkOworCisgICBmb3JlYWNoX2xpc3QobiwgYWN0dWFsX3BhcmFtZXRlcnMpIHsKKyAgICAgIGlyX2NvbnN0YW50ICpjb25zdGFudCA9ICgoaXJfcnZhbHVlICopIG4pLT5jb25zdGFudF9leHByZXNzaW9uX3ZhbHVlKHZhcmlhYmxlX2NvbnRleHQpOworICAgICAgaWYgKGNvbnN0YW50ID09IE5VTEwpIHsKKyAgICAgICAgIGhhc2hfdGFibGVfZHRvcihkZXJlZl9oYXNoKTsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSAoaXJfdmFyaWFibGUgKilwYXJhbWV0ZXJfaW5mbzsKKyAgICAgIGhhc2hfdGFibGVfaW5zZXJ0KGRlcmVmX2hhc2gsIGNvbnN0YW50LCB2YXIpOworCisgICAgICBwYXJhbWV0ZXJfaW5mbyA9IHBhcmFtZXRlcl9pbmZvLT5uZXh0OworICAgfQorCisgICBpcl9jb25zdGFudCAqcmVzdWx0ID0gTlVMTDsKKworICAgLyogTm93IHJ1biB0aGUgYnVpbHRpbiBmdW5jdGlvbiB1bnRpbCBzb21ldGhpbmcgbm9uLWNvbnN0YW50CisgICAgKiBoYXBwZW5zIG9yIHdlIGdldCB0aGUgcmVzdWx0LgorICAgICovCisgICBpZiAoY29uc3RhbnRfZXhwcmVzc2lvbl9ldmFsdWF0ZV9leHByZXNzaW9uX2xpc3Qob3JpZ2luID8gb3JpZ2luLT5ib2R5IDogYm9keSwgZGVyZWZfaGFzaCwgJnJlc3VsdCkgJiYgcmVzdWx0KQorICAgICAgcmVzdWx0ID0gcmVzdWx0LT5jbG9uZShyYWxsb2NfcGFyZW50KHRoaXMpLCBOVUxMKTsKKworICAgaGFzaF90YWJsZV9kdG9yKGRlcmVmX2hhc2gpOworCisgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9kZXNlcmlhbGl6ZXIuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9kZXNlcmlhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDdjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Rlc2VyaWFsaXplci5jcHAKQEAgLTAsMCArMSw3NzMgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImlyX2Rlc2VyaWFsaXplci5oIgorCisvKioKKyAqIFNlYXJjaGVzIGZvciBpcl9mdW5jdGlvbiB3aXRoIG1hdGNoaW5nIHNpZ25hdHVyZSBmcm9tIGV4ZWNfbGlzdC4KKyAqLworc3RhdGljIGlyX2Z1bmN0aW9uICoKK3NlYXJjaF9mdW5jKHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwgc3RydWN0IGV4ZWNfbGlzdCAqbGlzdCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBleGVjX2xpc3QgKnBhcmFtZXRlcnMpCit7CisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCBsaXN0KSB7CisgICAgICBpcl9mdW5jdGlvbiAqZnVuYyA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX2Z1bmN0aW9uKCk7CisgICAgICBpZiAoZnVuYyAmJiBzdHJjbXAobmFtZSwgZnVuYy0+bmFtZSkgPT0gMCAmJgorICAgICAgICAgZnVuYy0+bWF0Y2hpbmdfc2lnbmF0dXJlKHN0YXRlLCBwYXJhbWV0ZXJzKSkKKyAgICAgICAgIHJldHVybiBmdW5jOworICAgfQorICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVhZCBhIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zLgorICovCitib29sCitpcl9kZXNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplX2xpc3QoZXhlY19saXN0ICpsaXN0KQoreworICAgdWludDMyX3QgbGlzdF9sZW4gPSBtYXAtPnJlYWRfdWludDMyX3QoKTsKKyAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsaXN0X2xlbjsgaysrKQorICAgICAgaWYgKCFyZWFkX2luc3RydWN0aW9uKGxpc3QpKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgcmV0dXJuIHRydWU7Cit9CisKKworaXJfaW5zdHJ1Y3Rpb24gKgoraXJfZGVzZXJpYWxpemVyOjpyZWFkX2lyX3ZhcmlhYmxlKCkKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9IGRlc2VyaWFsaXplX2dsc2xfdHlwZShtYXAsIHN0YXRlLCB0eXBlX2h0KTsKKworICAgLyogVE9ETzogVW5kZXJzdGFuZCBob3cgdGhpcyBjYW4gaGFwcGVuIGFuZCBmaXggKi8KKyAgIGlmICh0eXBlID09IGdsc2xfdHlwZTo6ZXJyb3JfdHlwZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBjaGFyICpuYW1lID0gbWFwLT5yZWFkX3N0cmluZygpOworICAgaW50NjRfdCB1bmlxdWVfaWQgPSBtYXAtPnJlYWRfaW50NjRfdCgpOworICAgdWludDhfdCBtb2RlID0gbWFwLT5yZWFkX3VpbnQ4X3QoKTsKKworICAgaXJfdmFyaWFibGUgKnZhciA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUodHlwZSwgbmFtZSwgKGlyX3ZhcmlhYmxlX21vZGUpIG1vZGUpOworCisgICBpZiAoIXZhcikKKyAgICAgIHJldHVybiBOVUxMOworCisgICBtYXAtPnJlYWQoJnZhci0+ZGF0YSwgc2l6ZW9mKHZhci0+ZGF0YSkpOworCisgICB2YXItPm51bV9zdGF0ZV9zbG90cyA9IG1hcC0+cmVhZF91aW50MzJfdCgpOworICAgdWludDhfdCBoYXNfY29uc3RhbnRfdmFsdWUgPSBtYXAtPnJlYWRfdWludDhfdCgpOworICAgdWludDhfdCBoYXNfY29uc3RhbnRfaW5pdGlhbGl6ZXIgPSBtYXAtPnJlYWRfdWludDhfdCgpOworCisgICB2YXItPnN0YXRlX3Nsb3RzID0gTlVMTDsKKworICAgaWYgKHZhci0+bnVtX3N0YXRlX3Nsb3RzID4gMCkgeworCisgICAgICAvKiBWYWxpZGF0ZSBudW1fc3RhdGVfc2xvdHMgYWdhaW5zdCBkZWZpbmVkIG1heGltdW0uICovCisgICAgICBpZiAodmFyLT5udW1fc3RhdGVfc2xvdHMgPiBNQVhfTlVNX1NUQVRFX1NMT1RTKQorICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIHZhci0+c3RhdGVfc2xvdHMgPSByYWxsb2NfYXJyYXkodmFyLCBpcl9zdGF0ZV9zbG90LCB2YXItPm51bV9zdGF0ZV9zbG90cyk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2YXItPm51bV9zdGF0ZV9zbG90czsgaSsrKSB7CisgICAgICAgICB2YXItPnN0YXRlX3Nsb3RzW2ldLnN3aXp6bGUgPSBtYXAtPnJlYWRfaW50MzJfdCgpOworICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKKyAgICAgICAgICAgIHZhci0+c3RhdGVfc2xvdHNbaV0udG9rZW5zW2pdID0gbWFwLT5yZWFkX2ludDMyX3QoKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGhhc19jb25zdGFudF92YWx1ZSkKKyAgICAgIHZhci0+Y29uc3RhbnRfdmFsdWUgPSByZWFkX2lyX2NvbnN0YW50KCk7CisKKyAgIGlmIChoYXNfY29uc3RhbnRfaW5pdGlhbGl6ZXIpCisgICAgICB2YXItPmNvbnN0YW50X2luaXRpYWxpemVyID0gcmVhZF9pcl9jb25zdGFudCgpOworCisgICB1aW50OF90IGhhc19pbnRlcmZhY2VfdHlwZSA9IG1hcC0+cmVhZF91aW50OF90KCk7CisKKyAgIGlmIChoYXNfaW50ZXJmYWNlX3R5cGUgJiYgKHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCkgPT0gTlVMTCkpCisgICAgICB2YXItPmluaXRfaW50ZXJmYWNlX3R5cGUoZGVzZXJpYWxpemVfZ2xzbF90eXBlKG1hcCwgc3RhdGUsIHR5cGVfaHQpKTsKKyAgIC8qKgorICAgICogU3RvcmUgYWRkcmVzcyB0byB0aGlzIHZhcmlhYmxlIHNvIHRoYXQgdmFyaWFibGUKKyAgICAqIGRlcmVmZXJlbmNlIHJlYWRlcnMgY2FuIGZpbmQgaXQgbGF0ZXIuCisgICAgKi8KKyAgIF9tZXNhX2hhc2hfdGFibGVfaW5zZXJ0KHZhcl9odCwgaGFzaF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgKGludHB0cl90KSB1bmlxdWVfaWQsIHZhcik7CisgICByZXR1cm4gdmFyOworfQorCisKK2lyX2luc3RydWN0aW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl9mdW5jdGlvbihib29sIHByb3RvdHlwZXNfb25seSkKK3sKKyAgIGNoYXIgKm5hbWUgPSBtYXAtPnJlYWRfc3RyaW5nKCk7CisgICB1aW50MzJfdCBudW1fc2lnbmF0dXJlcyA9IG1hcC0+cmVhZF91aW50MzJfdCgpOworCisgICBpcl9mdW5jdGlvbiAqZiA9IG5ldyhtZW1fY3R4KSBpcl9mdW5jdGlvbihuYW1lKTsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnID0gTlVMTDsKKyAgIHVpbnQzMl90IG5leHRfc2lnbmF0dXJlID0gMDsKKworICAgLyogQWRkIGFsbCBzaWduYXR1cmVzIHRvIHRoZSBmdW5jdGlvbi4gKi8KKyAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBudW1fc2lnbmF0dXJlczsgaisrKSB7CisKKyAgICAgIGlmIChwcm90b3R5cGVzX29ubHkgJiYgbmV4dF9zaWduYXR1cmUpIHsKKyAgICAgICAgIC8qIFdlJ3JlIG9uIG91ciA+MSBpdGVyYXRpb24gb2YgdGhlIGxvb3Agc28KKyAgICAgICAgICAqIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBzaWduYXR1cmUgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAqIGFuZCBtdXN0IHNraXAgYWhlYWQgdG8gdGhlIG5leHQgc2lnbmF0dXJlLgorICAgICAgICAgICovCisgICAgICAgICBtYXAtPmp1bXAobmV4dF9zaWduYXR1cmUpOworICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIFR5cGUgZXF1YWxzIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZS4gKi8KKyAgICAgIHVpbnQ4X3QgaXJfdHlwZSA9IG1hcC0+cmVhZF91aW50OF90KCk7CisgICAgICB1aW50MzJfdCBsZW4gPSBtYXAtPnJlYWRfdWludDMyX3QoKTsKKworICAgICAgLyogVGhlIG5leHQgc2lnLCBpZiB0aGVyZSBpcyBvbmUsIGZvbGxvd3MgdGhlIGVudGlyZSBmdW5jdGlvbiwgbm90CisgICAgICAgKiBqdXN0IHRoZSBwYXJhbWV0ZXJzLgorICAgICAgICovCisgICAgICBpZiAocHJvdG90eXBlc19vbmx5KQorICAgICAgICAgbmV4dF9zaWduYXR1cmUgPSBtYXAtPnBvc2l0aW9uKCkgKyBsZW47CisKKyAgICAgIC8qIFVzZWQgZm9yIGRlYnVnZ2luZy4gKi8KKyAgICAgICh2b2lkKSBpcl90eXBlOworCisgICAgICBhc3NlcnQoaXJfdHlwZSA9PSBpcl90eXBlX2Z1bmN0aW9uX3NpZ25hdHVyZSk7CisKKyAgICAgIHVpbnQ4X3QgaXNfYnVpbHRpbiA9IG1hcC0+cmVhZF91aW50OF90KCk7CisKKyAgICAgIHVpbnQ4X3QgaXNfZGVmaW5lZCA9IG1hcC0+cmVhZF91aW50OF90KCk7CisKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqcmV0dXJuX3R5cGUgPSBkZXNlcmlhbGl6ZV9nbHNsX3R5cGUobWFwLCBzdGF0ZSwgdHlwZV9odCk7CisgICAgICBpZiAoIXJldHVybl90eXBlKQorICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIHNpZyA9IG5ldyhtZW1fY3R4KSBpcl9mdW5jdGlvbl9zaWduYXR1cmUocmV0dXJuX3R5cGUpOworCisgICAgICAvKiBpc19kZWZpbmVkIHNob3VsZCBiZSB0cnVlIGlmIG9yaWdpbmFsIHdhcywgZXZlbiBpZiBmdW5jIGlzIGVtcHR5ICovCisgICAgICBzaWctPmlzX2RlZmluZWQgPSBpc19kZWZpbmVkOworCisgICAgICAvKiBGaWxsIGZ1bmN0aW9uIHNpZ25hdHVyZSBwYXJhbWV0ZXJzLiAqLworICAgICAgaWYgKCFkZXNlcmlhbGl6ZV9saXN0KCZzaWctPnBhcmFtZXRlcnMpKQorICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIC8qIEZpbGwgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZnVuY3Rpb24gYm9keS4gKi8KKyAgICAgIGlmICghcHJvdG90eXBlc19vbmx5KSB7CisgICAgICAgICB1aW50MzJfdCBib2R5X2NvdW50ID0gbWFwLT5yZWFkX3VpbnQzMl90KCk7CisgICAgICAgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgYm9keV9jb3VudDsgaysrKQorICAgICAgICAgICAgaWYgKCFyZWFkX2luc3RydWN0aW9uKCZzaWctPmJvZHksIGlzX2J1aWx0aW4gPyB0cnVlIDogZmFsc2UpKQorICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmICghaXNfYnVpbHRpbikgeworICAgICAgICAgZi0+YWRkX3NpZ25hdHVyZShzaWcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqYnVpbHRpbl9zaWcgPQorICAgICAgICAgICAgX21lc2FfZ2xzbF9maW5kX2J1aWx0aW5fZnVuY3Rpb24oc3RhdGUsIG5hbWUsICZzaWctPnBhcmFtZXRlcnMpOworCisgICAgICAgICBpZiAoIWJ1aWx0aW5fc2lnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgIGYtPmFkZF9zaWduYXR1cmUoc2lnKTsKKyAgICAgIH0KKworICAgICAgLyogQnJlYWsgb3V0IG9mIHRoZSBsb29wIGlmIHJlYWQgZXJyb3JzIG9jY3VycmVkLiAqLworICAgICAgaWYgKG1hcC0+ZXJyb3JzKCkpCisgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgfSAvKiBGb3IgZWFjaCBmdW5jdGlvbiBzaWduYXR1cmUuICovCisKKyAgIHJldHVybiBmOworfQorCisKKy8qIFJlYWRzIGluIHR5cGUgYW5kIHBhY2thZ2UgbGVuZ3RoLCBjb21wYXJlcyB0eXBlIHRvIGV4cGVjdGVkIHR5cGUuICovCisjZGVmaW5lIFZBTElEQVRFX1JWQUxVRShub2RlX3R5cGUpXAorICAgdWludDhfdCBpcl90eXBlID0gbWFwLT5yZWFkX3VpbnQ4X3QoKTtcCisgICB1aW50MzJfdCBsZW4gPSBtYXAtPnJlYWRfdWludDMyX3QoKTtcCisgICAodm9pZCkgbGVuO1wKKyAgIGlmIChpcl90eXBlICE9IG5vZGVfdHlwZSlcCisgICAgICByZXR1cm4gTlVMTDtcCisKKworaXJfZGVyZWZlcmVuY2VfYXJyYXkgKgoraXJfZGVzZXJpYWxpemVyOjpyZWFkX2lyX2RlcmVmZXJlbmNlX2FycmF5KCkKK3sKKyAgIFZBTElEQVRFX1JWQUxVRShpcl90eXBlX2RlcmVmZXJlbmNlX2FycmF5KTsKKworICAgaXJfcnZhbHVlICphcnJheV9ydmFsID0gcmVhZF9pcl9ydmFsdWUoKTsKKyAgIGlyX3J2YWx1ZSAqaW5kZXhfcnZhbCA9IHJlYWRfaXJfcnZhbHVlKCk7CisKKyAgIGlmIChhcnJheV9ydmFsICYmIGluZGV4X3J2YWwpCisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KGFycmF5X3J2YWwsIGluZGV4X3J2YWwpOworCisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKgoraXJfZGVzZXJpYWxpemVyOjpyZWFkX2lyX2RlcmVmZXJlbmNlX3JlY29yZCgpCit7CisgICBWQUxJREFURV9SVkFMVUUoaXJfdHlwZV9kZXJlZmVyZW5jZV9yZWNvcmQpOworCisgICBjaGFyICpuYW1lID0gbWFwLT5yZWFkX3N0cmluZygpOworCisgICBpcl9ydmFsdWUgKnJ2YWwgPSByZWFkX2lyX3J2YWx1ZSgpOworCisgICBpZiAocnZhbCkKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfcmVjb3JkKHJ2YWwsIG5hbWUpOworCisgICByZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIFJlYWRzIGluIGEgdmFyaWFibGUgZGVyZWYsIHNlZWtzIHZhcmlhYmxlIGFkZHJlc3MKKyAqIGZyb20gYSBtYXAgd2l0aCBpdCdzIHVuaXF1ZV9pZC4KKyAqLworaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKgoraXJfZGVzZXJpYWxpemVyOjpyZWFkX2lyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCkKK3sKKyAgIFZBTElEQVRFX1JWQUxVRShpcl90eXBlX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKTsKKworICAgaW50NjRfdCB1bmlxdWVfaWQgPSBtYXAtPnJlYWRfaW50NjRfdCgpOworCisgICBoYXNoX2VudHJ5ICplbnRyeSA9IF9tZXNhX2hhc2hfdGFibGVfc2VhcmNoKHZhcl9odCwgaGFzaF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSAoaW50cHRyX3QpIHVuaXF1ZV9pZCk7CisgICBpZiAoIWVudHJ5KQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoKGlyX3ZhcmlhYmxlKikgZW50cnktPmRhdGEpOworfQorCisKK2lyX2NvbnN0YW50ICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl9jb25zdGFudCgpCit7CisgICBWQUxJREFURV9SVkFMVUUoaXJfdHlwZV9jb25zdGFudCk7CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3RhbnRfdHlwZSA9IGRlc2VyaWFsaXplX2dsc2xfdHlwZShtYXAsIHN0YXRlLCB0eXBlX2h0KTsKKworICAgLyogVE9ETzogVW5kZXJzdGFuZCBob3cgdGhpcyBjYW4gaGFwcGVuIGFuZCBmaXggKi8KKyAgIGlmIChjb25zdGFudF90eXBlID09IGdsc2xfdHlwZTo6ZXJyb3JfdHlwZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpcl9jb25zdGFudF9kYXRhIGRhdGE7CisgICBtYXAtPnJlYWQoJmRhdGEsIHNpemVvZihkYXRhKSk7CisKKyAgIC8qIEFycmF5IG9mIGNvbnN0YW50cy4gKi8KKyAgIGlmIChjb25zdGFudF90eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0FSUkFZKSB7CisKKyAgICAgIHN0cnVjdCBleGVjX2xpc3QgZWxlbWVudHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY29uc3RhbnRfdHlwZS0+bGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgaXJfY29uc3RhbnQgKmNvbiA9IHJlYWRfaXJfY29uc3RhbnQoKTsKKworICAgICAgICAgLyogVE9ETzogVW5kZXJzdGFuZCBob3cgdGhpcyBjYW4gaGFwcGVuIGFuZCBmaXggKi8KKyAgICAgICAgIGlmICghY29uKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgIC8qIEJyZWFrIG91dCBvZiB0aGUgbG9vcCBpZiByZWFkIGVycm9ycyBvY2N1cnJlZC4gKi8KKyAgICAgICAgIGlmIChtYXAtPmVycm9ycygpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgIGVsZW1lbnRzLnB1c2hfdGFpbChjb24pOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGNvbnN0YW50X3R5cGUsICZlbGVtZW50cyk7CisKKyAgIH0gZWxzZSBpZiAoY29uc3RhbnRfdHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9TVFJVQ1QpIHsKKyAgICAgIHN0cnVjdCBleGVjX2xpc3QgZWxlbWVudHM7CisgICAgICBpZiAoIWRlc2VyaWFsaXplX2xpc3QoJmVsZW1lbnRzKSkKKyAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGNvbnN0YW50X3R5cGUsICZlbGVtZW50cyk7CisgICB9CisKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoY29uc3RhbnRfdHlwZSwgJmRhdGEpOworfQorCisKK2lyX3N3aXp6bGUgKgoraXJfZGVzZXJpYWxpemVyOjpyZWFkX2lyX3N3aXp6bGUoKQoreworICAgVkFMSURBVEVfUlZBTFVFKGlyX3R5cGVfc3dpenpsZSk7CisKKyAgIHN0cnVjdCBpcl9zd2l6emxlX21hc2sgbWFzayA9IHt9OworICAgbWFwLT5yZWFkKCZtYXNrLCBzaXplb2YoaXJfc3dpenpsZV9tYXNrKSk7CisKKyAgIGlyX3J2YWx1ZSAqcnZhbCA9IHJlYWRfaXJfcnZhbHVlKCk7CisgICBpZiAocnZhbCkKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfc3dpenpsZShydmFsLCBtYXNrLngsIG1hc2sueSwgbWFzay56LCBtYXNrLncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzay5udW1fY29tcG9uZW50cyk7CisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl90ZXh0dXJlICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl90ZXh0dXJlKCkKK3sKKyAgIFZBTElEQVRFX1JWQUxVRShpcl90eXBlX3RleHR1cmUpOworCisgICBpbnQzMl90IG9wID0gbWFwLT5yZWFkX2ludDMyX3QoKTsKKworICAgaXJfdGV4dHVyZSAqbmV3X3RleCA9IG5ldyhtZW1fY3R4KSBpcl90ZXh0dXJlKChpcl90ZXh0dXJlX29wY29kZSkgb3ApOworCisgICBpZiAoIW5ld190ZXgpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlID0gZGVzZXJpYWxpemVfZ2xzbF90eXBlKG1hcCwgc3RhdGUsIHR5cGVfaHQpOworCisgICBpcl9kZXJlZmVyZW5jZSAqc2FtcGxlciA9IChpcl9kZXJlZmVyZW5jZSAqKSByZWFkX2lyX3J2YWx1ZSgpOworCisgICBpZiAoIXNhbXBsZXIgfHwgIXR5cGUpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgbmV3X3RleC0+c2V0X3NhbXBsZXIoc2FtcGxlciwgdHlwZSk7CisKKyAgIG5ld190ZXgtPmNvb3JkaW5hdGUgPSByZWFkX2lyX3J2YWx1ZSgpOworICAgbmV3X3RleC0+cHJvamVjdG9yID0gcmVhZF9pcl9ydmFsdWUoKTsKKyAgIG5ld190ZXgtPnNoYWRvd19jb21wYXJpdG9yID0gcmVhZF9pcl9ydmFsdWUoKTsKKyAgIG5ld190ZXgtPm9mZnNldCA9IHJlYWRfaXJfcnZhbHVlKCk7CisKKyAgIG1lbXNldCgmbmV3X3RleC0+bG9kX2luZm8sIDAsIHNpemVvZihuZXdfdGV4LT5sb2RfaW5mbykpOworCisgICBuZXdfdGV4LT5sb2RfaW5mby5sb2QgPSByZWFkX2lyX3J2YWx1ZSgpOworICAgbmV3X3RleC0+bG9kX2luZm8uYmlhcyA9IHJlYWRfaXJfcnZhbHVlKCk7CisgICBuZXdfdGV4LT5sb2RfaW5mby5zYW1wbGVfaW5kZXggPSByZWFkX2lyX3J2YWx1ZSgpOworICAgbmV3X3RleC0+bG9kX2luZm8uY29tcG9uZW50ID0gcmVhZF9pcl9ydmFsdWUoKTsKKyAgIG5ld190ZXgtPmxvZF9pbmZvLmdyYWQuZFBkeCA9IHJlYWRfaXJfcnZhbHVlKCk7CisgICBuZXdfdGV4LT5sb2RfaW5mby5ncmFkLmRQZHkgPSByZWFkX2lyX3J2YWx1ZSgpOworCisgICByZXR1cm4gbmV3X3RleDsKK30KKworCitpcl9leHByZXNzaW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl9leHByZXNzaW9uKCkKK3sKKyAgIFZBTElEQVRFX1JWQUxVRShpcl90eXBlX2V4cHJlc3Npb24pOworCisgICAvKiBUeXBlIHJlc3VsdGluZyBmcm9tIHRoZSBvcGVyYXRpb24uICovCisgICBjb25zdCBnbHNsX3R5cGUgKnJ2YWxfdHlwZSA9IGRlc2VyaWFsaXplX2dsc2xfdHlwZShtYXAsIHN0YXRlLCB0eXBlX2h0KTsKKworICAgLyogUmVhZCBvcGVyYXRpb24gdHlwZSArIGFsbCBvcGVyYW5kcyBmb3IgY3JlYXRpbmcgaXJfZXhwcmVzc2lvbi4gKi8KKyAgIHVpbnQzMl90IG9wZXJhdGlvbiA9IG1hcC0+cmVhZF91aW50MzJfdCgpOworICAgdWludDMyX3Qgb3BlcmFuZHMgPSBtYXAtPnJlYWRfaW50MzJfdCgpOworCisgICBpcl9ydmFsdWUgKmlyX3J2YWx1ZV90YWJsZVs0XSA9IHsgTlVMTCB9OworICAgZm9yICh1bnNpZ25lZCBrID0gMDsgayA8IG9wZXJhbmRzOyBrKyspIHsKKyAgICAgIGlyX3J2YWx1ZV90YWJsZVtrXSA9IHJlYWRfaXJfcnZhbHVlKCk7CisgICAgICBpZiAoIWlyX3J2YWx1ZV90YWJsZVtrXSkKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24ob3BlcmF0aW9uLAorICAgICAgcnZhbF90eXBlLAorICAgICAgaXJfcnZhbHVlX3RhYmxlWzBdLAorICAgICAgaXJfcnZhbHVlX3RhYmxlWzFdLAorICAgICAgaXJfcnZhbHVlX3RhYmxlWzJdLAorICAgICAgaXJfcnZhbHVlX3RhYmxlWzNdKTsKK30KKworCitpcl9ydmFsdWUgKgoraXJfZGVzZXJpYWxpemVyOjpyZWFkX2lyX3J2YWx1ZSgpCit7CisgICB1aW50OF90IGlyX3R5cGUgPSBtYXAtPnJlYWRfdWludDhfdCgpOworCisgICBzd2l0Y2goaXJfdHlwZSkgeworICAgY2FzZSBpcl90eXBlX2NvbnN0YW50OgorICAgICAgcmV0dXJuIHJlYWRfaXJfY29uc3RhbnQoKTsKKyAgIGNhc2UgaXJfdHlwZV9kZXJlZmVyZW5jZV92YXJpYWJsZToKKyAgICAgIHJldHVybiByZWFkX2lyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICBjYXNlIGlyX3R5cGVfZGVyZWZlcmVuY2VfcmVjb3JkOgorICAgICAgcmV0dXJuIHJlYWRfaXJfZGVyZWZlcmVuY2VfcmVjb3JkKCk7CisgICBjYXNlIGlyX3R5cGVfZGVyZWZlcmVuY2VfYXJyYXk6CisgICAgICByZXR1cm4gcmVhZF9pcl9kZXJlZmVyZW5jZV9hcnJheSgpOworICAgY2FzZSBpcl90eXBlX2V4cHJlc3Npb246CisgICAgICByZXR1cm4gcmVhZF9pcl9leHByZXNzaW9uKCk7CisgICBjYXNlIGlyX3R5cGVfc3dpenpsZToKKyAgICAgIHJldHVybiByZWFkX2lyX3N3aXp6bGUoKTsKKyAgIGNhc2UgaXJfdHlwZV90ZXh0dXJlOgorICAgICAgcmV0dXJuIHJlYWRfaXJfdGV4dHVyZSgpOworICAgLyogdHlwZSBpcyBpcl90eXBlX3Vuc2V0IGlyIHJ2YWx1ZSBpcyBzZXQgdG8gTlVMTCAqLworICAgY2FzZSBpcl90eXBlX3Vuc2V0OgorICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorfQorCisKK2lyX2luc3RydWN0aW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl9hc3NpZ25tZW50KCkKK3sKKyAgIHVpbnQzMl90IHdyaXRlX21hc2sgPSBtYXAtPnJlYWRfdWludDhfdCgpOworCisgICBpcl9kZXJlZmVyZW5jZSAqbGhzX2RlcmVmID0gKGlyX2RlcmVmZXJlbmNlICopIHJlYWRfaXJfcnZhbHVlKCk7CisKKyAgIGlmICghbGhzX2RlcmVmKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGlyX3J2YWx1ZSAqY29uZCA9IHJlYWRfaXJfcnZhbHVlKCk7CisgICBpcl9ydmFsdWUgKnJ2YWwgPSByZWFkX2lyX3J2YWx1ZSgpOworCisgICBpZiAocnZhbCkKKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChsaHNfZGVyZWYsIHJ2YWwsIGNvbmQsIHdyaXRlX21hc2spOworCisgICByZXR1cm4gTlVMTDsKK30KKworCitpcl9pbnN0cnVjdGlvbiAqCitpcl9kZXNlcmlhbGl6ZXI6OnJlYWRfaXJfaWYoKQoreworICAgaXJfcnZhbHVlICpjb25kID0gcmVhZF9pcl9ydmFsdWUoKTsKKyAgIC8qIFRPRE86IFVuZGVyc3RhbmQgaG93IHRoaXMgY2FuIGhhcHBlbiBhbmQgZml4ICovCisgICBpZiAoIWNvbmQpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaXJfaWYgKmlyaWYgPSBuZXcobWVtX2N0eCkgaXJfaWYoY29uZCk7CisgICBpZiAoIWlyaWYpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaWYgKCFkZXNlcmlhbGl6ZV9saXN0KCZpcmlmLT50aGVuX2luc3RydWN0aW9ucykpCisgICAgICByZXR1cm4gTlVMTDsKKyAgIGlmICghZGVzZXJpYWxpemVfbGlzdCgmaXJpZi0+ZWxzZV9pbnN0cnVjdGlvbnMpKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBpcmlmOworfQorCisKK2lyX2luc3RydWN0aW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl9yZXR1cm4oKQoreworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9yZXR1cm4ocmVhZF9pcl9ydmFsdWUoKSk7Cit9CisKKworLyoqCisgKiBSZWFkIGEgY2FsbCB0byBpcl9mdW5jdGlvbiwgZmluZHMgdGhlIGNvcnJlY3QgZnVuY3Rpb24KKyAqIHNpZ25hdHVyZSBmcm9tIHByb3RvdHlwZXMgbGlzdCBhbmQgY3JlYXRlcyB0aGUgY2FsbC4KKyAqLworaXJfaW5zdHJ1Y3Rpb24gKgoraXJfZGVzZXJpYWxpemVyOjpyZWFkX2lyX2NhbGwoKQoreworICAgc3RydWN0IGV4ZWNfbGlzdCBwYXJhbWV0ZXJzOworCisgICBjaGFyICpuYW1lID0gbWFwLT5yZWFkX3N0cmluZygpOworCisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqcmV0dXJuX2RlcmVmID0gKGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICopIHJlYWRfaXJfcnZhbHVlKCk7CisKKyAgIHVpbnQ4X3QgbGlzdF9sZW4gPSBtYXAtPnJlYWRfdWludDhfdCgpOworCisgICAvKiByZWFkIGNhbGwgcGFyYW1ldGVycyAqLworICAgZm9yICh1bnNpZ25lZCBrID0gMDsgayA8IGxpc3RfbGVuOyBrKyspIHsKKyAgICAgIGlyX3J2YWx1ZSAqcnZhbCA9IHJlYWRfaXJfcnZhbHVlKCk7CisKKyAgICAgIGlmICghcnZhbCkKKyAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBwYXJhbWV0ZXJzLnB1c2hfdGFpbChydmFsKTsKKyAgIH0KKworICAgdWludDhfdCB1c2VfYnVpbHRpbiA9IG1hcC0+cmVhZF91aW50OF90KCk7CisKKyAgIGlmICh1c2VfYnVpbHRpbikgeworICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpidWlsdGluX3NpZyA9CisgICAgICAgICBfbWVzYV9nbHNsX2ZpbmRfYnVpbHRpbl9mdW5jdGlvbihzdGF0ZSwgbmFtZSwgJnBhcmFtZXRlcnMpOworCisgICAgICBpZiAoIWJ1aWx0aW5fc2lnKQorICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIGlyX2NhbGwgKmNhbGwgPSBuZXcobWVtX2N0eCkgaXJfY2FsbChidWlsdGluX3NpZywgcmV0dXJuX2RlcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbWV0ZXJzKTsKKyAgICAgIGNhbGwtPnVzZV9idWlsdGluID0gdHJ1ZTsKKyAgICAgIHJldHVybiBjYWxsOworICAgfQorCisgICAvKiBGaW5kIHRoZSBmdW5jdGlvbiBmcm9tIHRoZSBwcm90b3R5cGVzLiAqLworICAgaXJfZnVuY3Rpb24gKmZ1bmMgPSBzZWFyY2hfZnVuYyhzdGF0ZSwgcHJvdG90eXBlcywgbmFtZSwgJnBhcmFtZXRlcnMpOworICAgaWYgKGZ1bmMpCisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NhbGwoZnVuYy0+bWF0Y2hpbmdfc2lnbmF0dXJlKHN0YXRlLCAmcGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX2RlcmVmLCAmcGFyYW1ldGVycyk7CisKKyAgIHJldHVybiBOVUxMOworfQorCisKK2lyX2luc3RydWN0aW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl9kaXNjYXJkKCkKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZGlzY2FyZChyZWFkX2lyX3J2YWx1ZSgpKTsKK30KKworCitpcl9pbnN0cnVjdGlvbiAqCitpcl9kZXNlcmlhbGl6ZXI6OnJlYWRfaXJfbG9vcCgpCit7CisgICBpcl9sb29wICpsb29wID0gbmV3KG1lbV9jdHgpIGlyX2xvb3A7CisKKyAgIGlmICghZGVzZXJpYWxpemVfbGlzdCgmbG9vcC0+Ym9keV9pbnN0cnVjdGlvbnMpKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBsb29wOworfQorCisKK2lyX2luc3RydWN0aW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9pcl9sb29wX2p1bXAoKQoreworICAgdWludDhfdCBtb2RlID0gbWFwLT5yZWFkX3VpbnQ4X3QoKTsKKyAgIHJldHVybiAgbmV3KG1lbV9jdHgpIGlyX2xvb3BfanVtcCgoaXJfbG9vcF9qdW1wOjpqdW1wX21vZGUpIG1vZGUpOworfQorCisKK2lyX2luc3RydWN0aW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9lbWl0X3ZlcnRleCgpCit7CisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2VtaXRfdmVydGV4OworfQorCisKK2lyX2luc3RydWN0aW9uICoKK2lyX2Rlc2VyaWFsaXplcjo6cmVhZF9lbmRfcHJpbWl0aXZlKCkKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZW5kX3ByaW1pdGl2ZTsKK30KKworCitib29sCitpcl9kZXNlcmlhbGl6ZXI6OnJlYWRfaW5zdHJ1Y3Rpb24oc3RydWN0IGV4ZWNfbGlzdCAqbGlzdCwgYm9vbCBpZ25vcmUpCit7CisgICB1aW50OF90IGlyX3R5cGUgPSBtYXAtPnJlYWRfdWludDhfdCgpOworICAgdWludDMyX3QgaW5zdF9kdW1wc2l6ZSA9IG1hcC0+cmVhZF91aW50MzJfdCgpOworCisgICAvKiBSZWFkZXIgd2FudHMgdG8ganVtcCBvdmVyIHRoaXMgaW5zdHJ1Y3Rpb24uICovCisgICBpZiAoaWdub3JlKSB7CisgICAgICBtYXAtPmZmd2QoaW5zdF9kdW1wc2l6ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgaXJfaW5zdHJ1Y3Rpb24gKmlyOworCisgICBzd2l0Y2goaXJfdHlwZSkgeworICAgY2FzZSBpcl90eXBlX3ZhcmlhYmxlOgorICAgICAgaXIgPSByZWFkX2lyX3ZhcmlhYmxlKCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHlwZV9hc3NpZ25tZW50OgorICAgICAgaXIgPSByZWFkX2lyX2Fzc2lnbm1lbnQoKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eXBlX2NvbnN0YW50OgorICAgICAgaXIgPSByZWFkX2lyX2NvbnN0YW50KCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHlwZV9mdW5jdGlvbjoKKyAgICAgIGlyID0gcmVhZF9pcl9mdW5jdGlvbigpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R5cGVfaWY6CisgICAgICBpciA9IHJlYWRfaXJfaWYoKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eXBlX3JldHVybjoKKyAgICAgIGlyID0gcmVhZF9pcl9yZXR1cm4oKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eXBlX2NhbGw6CisgICAgICBpciA9IHJlYWRfaXJfY2FsbCgpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R5cGVfZGlzY2FyZDoKKyAgICAgIGlyID0gcmVhZF9pcl9kaXNjYXJkKCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHlwZV9sb29wOgorICAgICAgaXIgPSByZWFkX2lyX2xvb3AoKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eXBlX2xvb3BfanVtcDoKKyAgICAgIGlyID0gcmVhZF9pcl9sb29wX2p1bXAoKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eXBlX2VtaXRfdmVydGV4OgorICAgICAgaXIgPSByZWFkX2VtaXRfdmVydGV4KCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHlwZV9lbmRfcHJpbWl0aXZlOgorICAgICAgaXIgPSByZWFkX2VuZF9wcmltaXRpdmUoKTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGlmIChpcl90eXBlIDw9IGlyX3R5cGVfdW5zZXQgfHwgaXJfdHlwZSA+PSBpcl90eXBlX21heCkKKyAgICAgICAgIGFzc2VydCghInJlYWQgaW52YWxpZCBpcl90eXBlIGR1cmluZyBJUiBkZXNlcmlhbGl6YXRpb25cbiIpOworCisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGlmICghaXIgfHwgbWFwLT5lcnJvcnMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgbGlzdC0+cHVzaF90YWlsKGlyKTsKKyAgIHJldHVybiB0cnVlOworfQorCisKKy8qKgorICogR28gdGhyb3VnaCB0aGUgYmxvYiBhbmQgcmVhZCBwcm90b3R5cGVzIGZvciB0aGUgZnVuY3Rpb25zLgorICovCitib29sCitpcl9kZXNlcmlhbGl6ZXI6OnJlYWRfcHJvdG90eXBlcyh1bnNpZ25lZCBsaXN0X2xlbikKK3sKKyAgIHVpbnQzMl90IGlyX3N0YXJ0ID0gbWFwLT5wb3NpdGlvbigpOworCisgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgbGlzdF9sZW47IGsrKykgeworICAgICAgdWludDhfdCBpcl90eXBlID0gbWFwLT5yZWFkX3VpbnQ4X3QoKTsKKyAgICAgIHVpbnQzMl90IGxlbiA9IG1hcC0+cmVhZF91aW50MzJfdCgpOworCisgICAgICBpZiAobGVuID4gKG1hcC0+c2l6ZSgpIC0gbWFwLT5wb3NpdGlvbigpKSkgeworICAgICAgICAgLyogV2UndmUgcnVuIG9mZiB0aGUgZW5kIGZvciBzb21lIHJlYXNvbgorICAgICAgICAgICogaG9wZWZ1bGx5IHdlIGdvdCB0aGUgcHJvdG9zIHdlIG5lZWQKKyAgICAgICAgICAqIG1vdmUgb24hCisgICAgICAgICAgKiBUT0RPOiBVbmRlcnN0YW5kIGhvdyB0aGlzIGNhbiBoYXBwZW4gYW5kIGZpeAorICAgICAgICAgICovCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGlyX3R5cGUgIT0gaXJfdHlwZV9mdW5jdGlvbikgeworICAgICAgICAgbWFwLT5mZndkKGxlbik7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmZ1bmMgPSByZWFkX2lyX2Z1bmN0aW9uKHRydWUpOworICAgICAgaWYgKCFmdW5jKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBwcm90b3R5cGVzLT5wdXNoX3RhaWwoZnVuYyk7CisKKyAgICAgIC8qIEJyZWFrIG91dCBvZiB0aGUgbG9vcCBpZiByZWFkIGVycm9ycyBvY2N1cnJlZC4gKi8KKyAgICAgIGlmIChtYXAtPmVycm9ycygpKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBtYXAtPmp1bXAoaXJfc3RhcnQpOworICAgcmV0dXJuIHRydWU7Cit9CisKKworLyoqCisgKiBFbmFibGUgYWxsIGdsc2wgZXh0ZW5zaW9ucyBmb3IgdGhlIHBhcnNlIHN0YXRlLiBQYXRjaCB0byBwYWNrCisgKiBlbmFibGUgYml0cyBpbiBhIHN0cnVjdCB3YXMgbm90IGFjY2VwdGVkIGJ5IHVwc3RyZWFtIHNvIHdlIG5lZWQKKyAqIHRvIGVuYWJsZSBlYWNoIGluZGl2aWR1YWwgYml0IGxpa2UgdGhpcy4KKyAqLworc3RhdGljIHZvaWQKK2VuYWJsZV9nbHNsX2V4dGVuc2lvbnMoc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKQoreworICAgc3RhdGUtPkFSQl9hcnJheXNfb2ZfYXJyYXlzX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX2NvbXB1dGVfc2hhZGVyX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX2NvbnNlcnZhdGl2ZV9kZXB0aF9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFSQl9kcmF3X2J1ZmZlcnNfZW5hYmxlID0gdHJ1ZTsKKyAgIHN0YXRlLT5BUkJfZHJhd19pbnN0YW5jZWRfZW5hYmxlID0gdHJ1ZTsKKyAgIHN0YXRlLT5BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX2dwdV9zaGFkZXI1X2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3NhbXBsZV9zaGFkaW5nX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnNfZW5hYmxlID0gdHJ1ZTsKKyAgIHN0YXRlLT5BUkJfc2hhZGVyX2JpdF9lbmNvZGluZ19lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZV9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFSQl9zaGFkZXJfc3RlbmNpbF9leHBvcnRfZW5hYmxlID0gdHJ1ZTsKKyAgIHN0YXRlLT5BUkJfc2hhZGVyX3RleHR1cmVfbG9kX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFja19lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmdfZW5hYmxlID0gdHJ1ZTsKKyAgIHN0YXRlLT5BUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheV9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFSQl90ZXh0dXJlX2dhdGhlcl9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFSQl90ZXh0dXJlX211bHRpc2FtcGxlX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3RleHR1cmVfcXVlcnlfbGV2ZWxzX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3RleHR1cmVfcXVlcnlfbG9kX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3RleHR1cmVfcmVjdGFuZ2xlX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdF9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFSQl92aWV3cG9ydF9hcnJheV9lbmFibGUgPSB0cnVlOworCisgICBzdGF0ZS0+T0VTX0VHTF9pbWFnZV9leHRlcm5hbF9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlc19lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPk9FU190ZXh0dXJlXzNEX2VuYWJsZSA9IHRydWU7CisKKyAgIHN0YXRlLT5BTURfY29uc2VydmF0aXZlX2RlcHRoX2VuYWJsZSA9IHRydWU7CisgICBzdGF0ZS0+QU1EX3NoYWRlcl9zdGVuY2lsX2V4cG9ydF9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkFNRF9zaGFkZXJfdHJpbmFyeV9taW5tYXhfZW5hYmxlID0gdHJ1ZTsKKyAgIHN0YXRlLT5BTURfdmVydGV4X3NoYWRlcl9sYXllcl9lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkVYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0c19lbmFibGUgPSB0cnVlOworICAgc3RhdGUtPkVYVF9zaGFkZXJfaW50ZWdlcl9taXhfZW5hYmxlID0gdHJ1ZTsKKyAgIHN0YXRlLT5FWFRfdGV4dHVyZV9hcnJheV9lbmFibGUgPSB0cnVlOworfQorCisKK2Jvb2wKK2lyX2Rlc2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgdm9pZCAqbWVtX2N0eCwgZ2xfc2hhZGVyICpzaGFkZXIsIG1lbW9yeV9tYXAgKm1hcCkKK3sKKyAgIGFzc2VydChjdHgpOworICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICB1aW50MzJfdCBleGVjX2xpc3RfbGVuOworCisgICAvKiBBbGxvY2F0aW9ucyB1c2UgcGFzc2VkIHJhbGxvYyBjdHggZHVyaW5nIHJlYWRpbmcuICovCisgICB0aGlzLT5tZW1fY3R4ID0gbWVtX2N0eDsKKyAgIHRoaXMtPm1hcCA9IG1hcDsKKworICAgLyogUGFyc2Ugc3RhdGUgaXMgdXNlZCB0byBmaW5kIGJ1aWx0aW4gZnVuY3Rpb25zIGFuZCBleGlzdGluZyB0eXBlcyBkdXJpbmcKKyAgICAqIHJlYWRpbmcuIFdlIGVuYWJsZSBhbGwgdGhlIGV4dGVuc2lvbnMgdG8gaGF2ZSBhbGwgcG9zc2libGUgYnVpbHRpbiB0eXBlcworICAgICogYW5kIGZ1bmN0aW9ucyBhdmFpbGFibGUuCisgICAgKi8KKyAgIHN0YXRlID0gbmV3KG1lbV9jdHgpCisgICAgICBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlKGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2Uoc2hhZGVyLT5UeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyKTsKKworICAgZW5hYmxlX2dsc2xfZXh0ZW5zaW9ucyhzdGF0ZSk7CisKKyAgIHN0YXRlLT5sYW5ndWFnZV92ZXJzaW9uID0gc2hhZGVyLT5WZXJzaW9uOworICAgc3RhdGUtPnVzZXNfYnVpbHRpbl9mdW5jdGlvbnMgPSB0cnVlOworICAgX21lc2FfZ2xzbF9pbml0aWFsaXplX2J1aWx0aW5fZnVuY3Rpb25zKCk7CisgICBfbWVzYV9nbHNsX2luaXRpYWxpemVfdHlwZXMoc3RhdGUpOworCisgICBwcm90b3R5cGVzID0gbmV3KG1lbV9jdHgpIGV4ZWNfbGlzdDsKKyAgIHNoYWRlci0+aXIgPSBuZXcoc2hhZGVyKSBleGVjX2xpc3Q7CisKKyAgIGV4ZWNfbGlzdF9sZW4gPSBtYXAtPnJlYWRfdWludDMyX3QoKTsKKworICAgc3VjY2VzcyA9IHJlYWRfcHJvdG90eXBlcyhleGVjX2xpc3RfbGVuKTsKKworICAgLyogVG9wIGxldmVsIGV4ZWNfbGlzdCByZWFkIGxvb3AsIGNvbnN0cnVjdHMgYSBuZXcgbGlzdC4gKi8KKyAgIHdoaWxlKGV4ZWNfbGlzdF9sZW4gJiYgc3VjY2VzcyA9PSB0cnVlKSB7CisgICAgICBzdWNjZXNzID0gcmVhZF9pbnN0cnVjdGlvbihzaGFkZXItPmlyKTsKKyAgICAgIGV4ZWNfbGlzdF9sZW4tLTsKKyAgIH0KKworICAgcmFsbG9jX2ZyZWUocHJvdG90eXBlcyk7CisgICByYWxsb2NfZnJlZShzdGF0ZSk7CisKKyAgIGlmICghc3VjY2VzcykKKyAgICAgIGdvdG8gZXJyb3JfZGVzZXJpYWxpemU7CisKKyAgIHNoYWRlci0+Q29tcGlsZVN0YXR1cyA9IEdMX1RSVUU7CisKKyAgIC8qIEFsbG9jYXRlcyBnbHNsX3N5bWJvbF90YWJsZSBpbnRlcm5hbGx5LiAqLworICAgcG9wdWxhdGVfc3ltYm9sX3RhYmxlKHNoYWRlcik7CisKKyAgIHZhbGlkYXRlX2lyX3RyZWUoc2hhZGVyLT5pcik7CisKK2Vycm9yX2Rlc2VyaWFsaXplOgorICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Rlc2VyaWFsaXplci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9kZXNlcmlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVlZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9kZXNlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDEyMSBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgSVJfQ0FDSEVfREVTRVJJQUxJWkVSX0gKKyNkZWZpbmUgSVJfQ0FDSEVfREVTRVJJQUxJWkVSX0gKKworI2luY2x1ZGUgInByb2dyYW0vcHJvZ3JhbS5oIgorI2luY2x1ZGUgImdsc2xfcGFyc2VyX2V4dHJhcy5oIgorI2luY2x1ZGUgIm1haW4vc2hhZGVyb2JqLmgiCisjaW5jbHVkZSAibGlua2VyLmgiCisjaW5jbHVkZSAibWVtb3J5X21hcC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyoqCisgKiBDbGFzcyB0byBkZXNlcmlhbGl6ZSBnbF9zaGFkZXIgSVIgZnJvbSBhIGJpbmFyeSBkYXRhIGJsb2IKKyAqCisgKiBEZXNlcmlhbGl6YXRpb24gaXMgZG9uZSB3aXRoIGEgaGVscCBvZiBtZW1vcnlfbWFwIGNsYXNzIHRoYXQgdGFrZXMgY2FyZQorICogb2YgYWN0dWFsIGRhdGEgcmVhZGluZy4gQ2xhc3MgZmlsbHMgZXhpc3RpbmcgZ2xfc2hhZGVyJ3MgaXIgZXhlY19saXN0CisgKiB3aXRoIElSIGluc3RydWN0aW9ucyBmcm9tIHRoZSBiaW5hcnkgYmxvYi4KKyAqLworY2xhc3MgaXJfZGVzZXJpYWxpemVyCit7CitwdWJsaWM6CisgICBpcl9kZXNlcmlhbGl6ZXIoKSA6CisgICAgICBzdGF0ZShOVUxMKSwKKyAgICAgIG1lbV9jdHgoTlVMTCksCisgICAgICBtYXAoTlVMTCkKKyAgIHsKKyAgICAgIHZhcl9odCA9IF9tZXNhX2hhc2hfdGFibGVfY3JlYXRlKDAsIGludF9lcXVhbCk7CisgICAgICB0eXBlX2h0ID0gX21lc2FfaGFzaF90YWJsZV9jcmVhdGUoMCwgaW50X2VxdWFsKTsKKyAgICAgIGhhc2hfdmFsdWUgPSBfbWVzYV9oYXNoX2RhdGEodGhpcywgc2l6ZW9mKGlyX2Rlc2VyaWFsaXplcikpOworICAgfQorCisgICB+aXJfZGVzZXJpYWxpemVyKCkKKyAgIHsKKyAgICAgIF9tZXNhX2hhc2hfdGFibGVfZGVzdHJveSh2YXJfaHQsIE5VTEwpOworICAgICAgX21lc2FfaGFzaF90YWJsZV9kZXN0cm95KHR5cGVfaHQsIE5VTEwpOworICAgfQorCisgICAvKiBkZXNlcmlhbGl6ZSBJUiB0byBnbF9zaGFkZXIgZnJvbSBtYXBwZWQgbWVtb3J5ICovCisgICBib29sIGRlc2VyaWFsaXplKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHZvaWQgKm1lbV9jdHgsIGdsX3NoYWRlciAqc2hhZGVyLCBtZW1vcnlfbWFwICptYXApOworCitwcml2YXRlOgorCisgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGU7CisgICB2b2lkICptZW1fY3R4OworICAgbWVtb3J5X21hcCAqbWFwOworCisgICAvKiBwb2ludGVyIHRvIGxpc3Qgd2hpY2ggY29udGFpbnMgcHJvdG90eXBlcyBvZiBmdW5jdGlvbnMgKi8KKyAgIHN0cnVjdCBleGVjX2xpc3QgKnByb3RvdHlwZXM7CisKKyAgIGJvb2wgcmVhZF9wcm90b3R5cGVzKHVuc2lnbmVkIGxpc3RfbGVuKTsKKyAgIGJvb2wgcmVhZF9pbnN0cnVjdGlvbihzdHJ1Y3QgZXhlY19saXN0ICpsaXN0LCBib29sIGlnbm9yZSA9IGZhbHNlKTsKKyAgIGJvb2wgZGVzZXJpYWxpemVfbGlzdChzdHJ1Y3QgZXhlY19saXN0ICpsaXN0KTsKKworICAgaXJfaW5zdHJ1Y3Rpb24gKnJlYWRfaXJfdmFyaWFibGUoKTsKKyAgIGlyX2luc3RydWN0aW9uICpyZWFkX2lyX2Fzc2lnbm1lbnQoKTsKKyAgIGlyX2luc3RydWN0aW9uICpyZWFkX2lyX2Z1bmN0aW9uKGJvb2wgcHJvdG90eXBlc19vbmx5ID0gZmFsc2UpOworICAgaXJfaW5zdHJ1Y3Rpb24gKnJlYWRfaXJfaWYoKTsKKyAgIGlyX2luc3RydWN0aW9uICpyZWFkX2lyX3JldHVybigpOworICAgaXJfaW5zdHJ1Y3Rpb24gKnJlYWRfaXJfY2FsbCgpOworICAgaXJfaW5zdHJ1Y3Rpb24gKnJlYWRfaXJfZGlzY2FyZCgpOworICAgaXJfaW5zdHJ1Y3Rpb24gKnJlYWRfaXJfbG9vcCgpOworICAgaXJfaW5zdHJ1Y3Rpb24gKnJlYWRfaXJfbG9vcF9qdW1wKCk7CisgICBpcl9pbnN0cnVjdGlvbiAqcmVhZF9lbWl0X3ZlcnRleCgpOworICAgaXJfaW5zdHJ1Y3Rpb24gKnJlYWRfZW5kX3ByaW1pdGl2ZSgpOworCisgICAvKiBydmFsdWUgcmVhZGVycyAqLworICAgaXJfcnZhbHVlICpyZWFkX2lyX3J2YWx1ZSgpOworICAgaXJfY29uc3RhbnQgKnJlYWRfaXJfY29uc3RhbnQoKTsKKyAgIGlyX3N3aXp6bGUgKnJlYWRfaXJfc3dpenpsZSgpOworICAgaXJfdGV4dHVyZSAqcmVhZF9pcl90ZXh0dXJlKCk7CisgICBpcl9leHByZXNzaW9uICpyZWFkX2lyX2V4cHJlc3Npb24oKTsKKyAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpyZWFkX2lyX2RlcmVmZXJlbmNlX2FycmF5KCk7CisgICBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKnJlYWRfaXJfZGVyZWZlcmVuY2VfcmVjb3JkKCk7CisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqcmVhZF9pcl9kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworCisgICAvKioKKyAgICAqIHZhcl9odCBpcyB1c2VkIHRvIHN0b3JlIGNyZWF0ZWQgaXJfdmFyaWFibGVzIHdpdGggYSB1bmlxdWVfa2V5IGZvcgorICAgICogZWFjaCBzbyB0aGF0IGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlIGNyZWF0aW9uIGNhbiBmaW5kIHRoZSB2YXJpYWJsZQorICAgICovCisgICBzdHJ1Y3QgaGFzaF90YWJsZSAqdmFyX2h0OworICAgdWludDMyX3QgaGFzaF92YWx1ZTsKKworICAgLyogdG8gcmVhZCB1c2VyIHR5cGVzIG9ubHkgb25jZSAqLworICAgc3RydWN0IGhhc2hfdGFibGUgKnR5cGVfaHQ7CisKKyAgIHN0YXRpYyBib29sIGludF9lcXVhbChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQorICAgeworICAgICAgcmV0dXJuIGEgPT0gYjsKKyAgIH0KKworfTsKKworCisjZW5kaWYgLyogaWZkZWYgX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIElSX0NBQ0hFX0RFU0VSSUFMSVpFUl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2VxdWFscy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2VxdWFscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzNzZjZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfZXF1YWxzLmNwcApAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpci5oIgorCisvKioKKyAqIEhlbHBlciBmb3IgY2hlY2tpbmcgZXF1YWxpdHkgd2hlbiBvbmUgaW5zdHJ1Y3Rpb24gbWlnaHQgYmUgTlVMTCwgc2luY2UgeW91CisgKiBjYW4ndCBhY2Nlc3MgYSdzIHZ0YWJsZSBpbiB0aGF0IGNhc2UuCisgKi8KK3N0YXRpYyBib29sCitwb3NzaWJseV9udWxsX2VxdWFscyhpcl9pbnN0cnVjdGlvbiAqYSwgaXJfaW5zdHJ1Y3Rpb24gKmIsIGVudW0gaXJfbm9kZV90eXBlIGlnbm9yZSkKK3sKKyAgIGlmICghYSB8fCAhYikKKyAgICAgIHJldHVybiAhYSAmJiAhYjsKKworICAgcmV0dXJuIGEtPmVxdWFscyhiLCBpZ25vcmUpOworfQorCisvKioKKyAqIFRoZSBiYXNlIGVxdWFsaXR5IGZ1bmN0aW9uOiBSZXR1cm4gbm90IGVxdWFsIGZvciBhbnl0aGluZyB3ZSBkb24ndCBrbm93CisgKiBhYm91dC4KKyAqLworYm9vbAoraXJfaW5zdHJ1Y3Rpb246OmVxdWFscyhpcl9pbnN0cnVjdGlvbiAqLCBlbnVtIGlyX25vZGVfdHlwZSkKK3sKKyAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbAoraXJfY29uc3RhbnQ6OmVxdWFscyhpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gaXJfbm9kZV90eXBlKQoreworICAgY29uc3QgaXJfY29uc3RhbnQgKm90aGVyID0gaXItPmFzX2NvbnN0YW50KCk7CisgICBpZiAoIW90aGVyKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAodHlwZSAhPSBvdGhlci0+dHlwZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHR5cGUtPmNvbXBvbmVudHMoKTsgaSsrKSB7CisgICAgICBpZiAodmFsdWUudVtpXSAhPSBvdGhlci0+dmFsdWUudVtpXSkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2lyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlOjplcXVhbHMoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBlbnVtIGlyX25vZGVfdHlwZSkKK3sKKyAgIGNvbnN0IGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpvdGhlciA9IGlyLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaWYgKCFvdGhlcikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHZhciA9PSBvdGhlci0+dmFyOworfQorCitib29sCitpcl9kZXJlZmVyZW5jZV9hcnJheTo6ZXF1YWxzKGlyX2luc3RydWN0aW9uICppciwgZW51bSBpcl9ub2RlX3R5cGUgaWdub3JlKQoreworICAgY29uc3QgaXJfZGVyZWZlcmVuY2VfYXJyYXkgKm90aGVyID0gaXItPmFzX2RlcmVmZXJlbmNlX2FycmF5KCk7CisgICBpZiAoIW90aGVyKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAodHlwZSAhPSBvdGhlci0+dHlwZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKCFhcnJheS0+ZXF1YWxzKG90aGVyLT5hcnJheSwgaWdub3JlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKCFhcnJheV9pbmRleC0+ZXF1YWxzKG90aGVyLT5hcnJheV9pbmRleCwgaWdub3JlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2lyX3N3aXp6bGU6OmVxdWFscyhpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gaXJfbm9kZV90eXBlIGlnbm9yZSkKK3sKKyAgIGNvbnN0IGlyX3N3aXp6bGUgKm90aGVyID0gaXItPmFzX3N3aXp6bGUoKTsKKyAgIGlmICghb3RoZXIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICh0eXBlICE9IG90aGVyLT50eXBlKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoaWdub3JlICE9IGlyX3R5cGVfc3dpenpsZSkgeworICAgICAgaWYgKG1hc2sueCAhPSBvdGhlci0+bWFzay54IHx8CisgICAgICAgICAgbWFzay55ICE9IG90aGVyLT5tYXNrLnkgfHwKKyAgICAgICAgICBtYXNrLnogIT0gb3RoZXItPm1hc2sueiB8fAorICAgICAgICAgIG1hc2sudyAhPSBvdGhlci0+bWFzay53KSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiB2YWwtPmVxdWFscyhvdGhlci0+dmFsLCBpZ25vcmUpOworfQorCitib29sCitpcl90ZXh0dXJlOjplcXVhbHMoaXJfaW5zdHJ1Y3Rpb24gKmlyLCBlbnVtIGlyX25vZGVfdHlwZSBpZ25vcmUpCit7CisgICBjb25zdCBpcl90ZXh0dXJlICpvdGhlciA9IGlyLT5hc190ZXh0dXJlKCk7CisgICBpZiAoIW90aGVyKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAodHlwZSAhPSBvdGhlci0+dHlwZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKG9wICE9IG90aGVyLT5vcCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKCFwb3NzaWJseV9udWxsX2VxdWFscyhjb29yZGluYXRlLCBvdGhlci0+Y29vcmRpbmF0ZSwgaWdub3JlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKCFwb3NzaWJseV9udWxsX2VxdWFscyhwcm9qZWN0b3IsIG90aGVyLT5wcm9qZWN0b3IsIGlnbm9yZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICghcG9zc2libHlfbnVsbF9lcXVhbHMoc2hhZG93X2NvbXBhcml0b3IsIG90aGVyLT5zaGFkb3dfY29tcGFyaXRvciwgaWdub3JlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKCFwb3NzaWJseV9udWxsX2VxdWFscyhvZmZzZXQsIG90aGVyLT5vZmZzZXQsIGlnbm9yZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICghc2FtcGxlci0+ZXF1YWxzKG90aGVyLT5zYW1wbGVyLCBpZ25vcmUpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBzd2l0Y2ggKG9wKSB7CisgICBjYXNlIGlyX3RleDoKKyAgIGNhc2UgaXJfbG9kOgorICAgY2FzZSBpcl9xdWVyeV9sZXZlbHM6CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhiOgorICAgICAgaWYgKCFsb2RfaW5mby5iaWFzLT5lcXVhbHMob3RoZXItPmxvZF9pbmZvLmJpYXMsIGlnbm9yZSkpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhsOgorICAgY2FzZSBpcl90eGY6CisgICBjYXNlIGlyX3R4czoKKyAgICAgIGlmICghbG9kX2luZm8ubG9kLT5lcXVhbHMob3RoZXItPmxvZF9pbmZvLmxvZCwgaWdub3JlKSkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6CisgICAgICBpZiAoIWxvZF9pbmZvLmdyYWQuZFBkeC0+ZXF1YWxzKG90aGVyLT5sb2RfaW5mby5ncmFkLmRQZHgsIGlnbm9yZSkgfHwKKyAgICAgICAgICAhbG9kX2luZm8uZ3JhZC5kUGR5LT5lcXVhbHMob3RoZXItPmxvZF9pbmZvLmdyYWQuZFBkeSwgaWdub3JlKSkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGZfbXM6CisgICAgICBpZiAoIWxvZF9pbmZvLnNhbXBsZV9pbmRleC0+ZXF1YWxzKG90aGVyLT5sb2RfaW5mby5zYW1wbGVfaW5kZXgsIGlnbm9yZSkpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdGc0OgorICAgICAgaWYgKCFsb2RfaW5mby5jb21wb25lbnQtPmVxdWFscyhvdGhlci0+bG9kX2luZm8uY29tcG9uZW50LCBpZ25vcmUpKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiVW5yZWNvZ25pemVkIHRleHR1cmUgb3AiKTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2lyX2V4cHJlc3Npb246OmVxdWFscyhpcl9pbnN0cnVjdGlvbiAqaXIsIGVudW0gaXJfbm9kZV90eXBlIGlnbm9yZSkKK3sKKyAgIGNvbnN0IGlyX2V4cHJlc3Npb24gKm90aGVyID0gaXItPmFzX2V4cHJlc3Npb24oKTsKKyAgIGlmICghb3RoZXIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICh0eXBlICE9IG90aGVyLT50eXBlKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAob3BlcmF0aW9uICE9IG90aGVyLT5vcGVyYXRpb24pCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnZXRfbnVtX29wZXJhbmRzKCk7IGkrKykgeworICAgICAgaWYgKCFvcGVyYW5kc1tpXS0+ZXF1YWxzKG90aGVyLT5vcGVyYW5kc1tpXSwgaWdub3JlKSkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2V4cHJlc3Npb25fZmxhdHRlbmluZy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2V4cHJlc3Npb25fZmxhdHRlbmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjYWRiMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfZXhwcmVzc2lvbl9mbGF0dGVuaW5nLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBpcl9leHByZXNzaW9uX2ZsYXR0ZW5pbmcuY3BwCisgKgorICogVGFrZXMgdGhlIGxlYXZlcyBvZiBleHByZXNzaW9uIHRyZWVzIGFuZCBtYWtlcyB0aGVtIGRlcmVmZXJlbmNlcyBvZgorICogYXNzaWdubWVudHMgb2YgdGhlIGxlYXZlcyB0byB0ZW1wb3JhcmllcywgYWNjb3JkaW5nIHRvIGEgcHJlZGljYXRlLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgYnJlYWtpbmcgZG93biBtYXRyaXggb3BlcmF0aW9ucywgd2hlcmUgaXQncyBlYXNpZXIgdG8KKyAqIGNyZWF0ZSBhIHRlbXBvcmFyeSBhbmQgd29yayBvbiBlYWNoIG9mIGl0cyB2ZWN0b3IgY29tcG9uZW50cyBpbmRpdmlkdWFsbHkuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX3J2YWx1ZV92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfZXhwcmVzc2lvbl9mbGF0dGVuaW5nLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCitjbGFzcyBpcl9leHByZXNzaW9uX2ZsYXR0ZW5pbmdfdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9leHByZXNzaW9uX2ZsYXR0ZW5pbmdfdmlzaXRvcihib29sICgqcHJlZGljYXRlKShpcl9pbnN0cnVjdGlvbiAqaXIpKQorICAgeworICAgICAgdGhpcy0+cHJlZGljYXRlID0gcHJlZGljYXRlOworICAgfQorCisgICB2aXJ0dWFsIH5pcl9leHByZXNzaW9uX2ZsYXR0ZW5pbmdfdmlzaXRvcigpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICB2b2lkIGhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKTsKKyAgIGJvb2wgKCpwcmVkaWNhdGUpKGlyX2luc3RydWN0aW9uICppcik7Cit9OworCit2b2lkCitkb19leHByZXNzaW9uX2ZsYXR0ZW5pbmcoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJCQkgYm9vbCAoKnByZWRpY2F0ZSkoaXJfaW5zdHJ1Y3Rpb24gKmlyKSkKK3sKKyAgIGlyX2V4cHJlc3Npb25fZmxhdHRlbmluZ192aXNpdG9yIHYocHJlZGljYXRlKTsKKworICAgZm9yZWFjaF9saXN0KG4sIGluc3RydWN0aW9ucykgeworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmlyID0gKGlyX2luc3RydWN0aW9uICopIG47CisKKyAgICAgIGlyLT5hY2NlcHQoJnYpOworICAgfQorfQorCit2b2lkCitpcl9leHByZXNzaW9uX2ZsYXR0ZW5pbmdfdmlzaXRvcjo6aGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpCit7CisgICBpcl92YXJpYWJsZSAqdmFyOworICAgaXJfYXNzaWdubWVudCAqYXNzaWduOworICAgaXJfcnZhbHVlICppciA9ICpydmFsdWU7CisKKyAgIGlmICghaXIgfHwgIXRoaXMtPnByZWRpY2F0ZShpcikpCisgICAgICByZXR1cm47CisKKyAgIHZvaWQgKmN0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICB2YXIgPSBuZXcoY3R4KSBpcl92YXJpYWJsZShpci0+dHlwZSwgImZsYXR0ZW5pbmdfdG1wIiwgaXJfdmFyX3RlbXBvcmFyeSk7CisgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKHZhcik7CisKKyAgIGFzc2lnbiA9IG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQobmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKSwKKwkJCQkgICBpciwKKwkJCQkgICBOVUxMKTsKKyAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKKworICAgKnJ2YWx1ZSA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Z1bmN0aW9uLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfZnVuY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2Y1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Z1bmN0aW9uLmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAiaXIuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgIFBBUkFNRVRFUl9MSVNUX05PX01BVENILAorICAgUEFSQU1FVEVSX0xJU1RfRVhBQ1RfTUFUQ0gsCisgICBQQVJBTUVURVJfTElTVF9JTkVYQUNUX01BVENIIC8qPCBNYXRjaCByZXF1aXJlcyBpbXBsaWNpdCBjb252ZXJzaW9uLiAqLworfSBwYXJhbWV0ZXJfbGlzdF9tYXRjaF90OworCisvKioKKyAqIFxicmllZiBDaGVjayBpZiB0d28gcGFyYW1ldGVyIGxpc3RzIG1hdGNoLgorICoKKyAqIFxwYXJhbSBsaXN0X2EgUGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqIFxwYXJhbSBsaXN0X2IgQWN0dWFsIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAqIFxzZWUgbWF0Y2hpbmdfc2lnbmF0dXJlKCkKKyAqLworc3RhdGljIHBhcmFtZXRlcl9saXN0X21hdGNoX3QKK3BhcmFtZXRlcl9saXN0c19tYXRjaChjb25zdCBleGVjX2xpc3QgKmxpc3RfYSwgY29uc3QgZXhlY19saXN0ICpsaXN0X2IpCit7CisgICBjb25zdCBleGVjX25vZGUgKm5vZGVfYSA9IGxpc3RfYS0+aGVhZDsKKyAgIGNvbnN0IGV4ZWNfbm9kZSAqbm9kZV9iID0gbGlzdF9iLT5oZWFkOworCisgICAvKiBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHRoZXJlIGlzIGFuIGluZXhhY3QgbWF0Y2ggcmVxdWlyaW5nIGFuIGltcGxpY2l0CisgICAgKiBjb252ZXJzaW9uLiAqLworICAgYm9vbCBpbmV4YWN0X21hdGNoID0gZmFsc2U7CisKKyAgIGZvciAoLyogZW1wdHkgKi8KKwk7ICFub2RlX2EtPmlzX3RhaWxfc2VudGluZWwoKQorCTsgbm9kZV9hID0gbm9kZV9hLT5uZXh0LCBub2RlX2IgPSBub2RlX2ItPm5leHQpIHsKKyAgICAgIC8qIElmIGFsbCBvZiB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZSBvdGhlciBwYXJhbWV0ZXIgbGlzdCBoYXZlIGJlZW4KKyAgICAgICAqIGV4aGF1c3RlZCwgdGhlIGxpc3RzIGhhdmUgZGlmZmVyZW50IGxlbmd0aCBhbmQsIGJ5IGRlZmluaXRpb24sCisgICAgICAgKiBkbyBub3QgbWF0Y2guCisgICAgICAgKi8KKyAgICAgIGlmIChub2RlX2ItPmlzX3RhaWxfc2VudGluZWwoKSkKKwkgcmV0dXJuIFBBUkFNRVRFUl9MSVNUX05PX01BVENIOworCisKKyAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpjb25zdCBwYXJhbSA9IChpcl92YXJpYWJsZSAqKSBub2RlX2E7CisgICAgICBjb25zdCBpcl9ydmFsdWUgKmNvbnN0IGFjdHVhbCA9IChpcl9ydmFsdWUgKikgbm9kZV9iOworCisgICAgICBpZiAocGFyYW0tPnR5cGUgPT0gYWN0dWFsLT50eXBlKQorCSBjb250aW51ZTsKKworICAgICAgLyogVHJ5IHRvIGZpbmQgYW4gaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIGFjdHVhbCB0byBwYXJhbS4gKi8KKyAgICAgIGluZXhhY3RfbWF0Y2ggPSB0cnVlOworICAgICAgc3dpdGNoICgoZW51bSBpcl92YXJpYWJsZV9tb2RlKShwYXJhbS0+ZGF0YS5tb2RlKSkgeworICAgICAgY2FzZSBpcl92YXJfYXV0bzoKKyAgICAgIGNhc2UgaXJfdmFyX3VuaWZvcm06CisgICAgICBjYXNlIGlyX3Zhcl90ZW1wb3Jhcnk6CisJIC8qIFRoZXNlIGFyZSBhbGwgZXJyb3IgY29uZGl0aW9ucy4gIEl0IGlzIGludmFsaWQgZm9yIGEgcGFyYW1ldGVyIHRvCisJICAqIGEgZnVuY3Rpb24gdG8gYmUgZGVjbGFyZWQgYXMgYXV0byAobm90IGluLCBvdXQsIG9yIGlub3V0KSBvcgorCSAgKiBhcyB1bmlmb3JtLgorCSAgKi8KKwkgYXNzZXJ0KDApOworCSByZXR1cm4gUEFSQU1FVEVSX0xJU1RfTk9fTUFUQ0g7CisKKyAgICAgIGNhc2UgaXJfdmFyX2NvbnN0X2luOgorICAgICAgY2FzZSBpcl92YXJfZnVuY3Rpb25faW46CisJIGlmICghYWN0dWFsLT50eXBlLT5jYW5faW1wbGljaXRseV9jb252ZXJ0X3RvKHBhcmFtLT50eXBlKSkKKwkgICAgcmV0dXJuIFBBUkFNRVRFUl9MSVNUX05PX01BVENIOworCSBicmVhazsKKworICAgICAgY2FzZSBpcl92YXJfZnVuY3Rpb25fb3V0OgorCSBpZiAoIXBhcmFtLT50eXBlLT5jYW5faW1wbGljaXRseV9jb252ZXJ0X3RvKGFjdHVhbC0+dHlwZSkpCisJICAgIHJldHVybiBQQVJBTUVURVJfTElTVF9OT19NQVRDSDsKKwkgYnJlYWs7CisKKyAgICAgIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX2lub3V0OgorCSAvKiBTaW5jZSB0aGVyZSBhcmUgbm8gYmktZGlyZWN0aW9uYWwgYXV0b21hdGljIGNvbnZlcnNpb25zIChlLmcuLAorCSAgKiB0aGVyZSBpcyBpbnQgLT4gZmxvYXQgYnV0IG5vIGZsb2F0IC0+IGludCksIGlub3V0IHBhcmFtZXRlcnMgbXVzdAorCSAgKiBiZSBleGFjdCBtYXRjaGVzLgorCSAgKi8KKwkgcmV0dXJuIFBBUkFNRVRFUl9MSVNUX05PX01BVENIOworCisgICAgICBkZWZhdWx0OgorCSBhc3NlcnQoZmFsc2UpOworCSByZXR1cm4gUEFSQU1FVEVSX0xJU1RfTk9fTUFUQ0g7CisgICAgICB9CisgICB9CisKKyAgIC8qIElmIGFsbCBvZiB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZSBvdGhlciBwYXJhbWV0ZXIgbGlzdCBoYXZlIGJlZW4KKyAgICAqIGV4aGF1c3RlZCwgdGhlIGxpc3RzIGhhdmUgZGlmZmVyZW50IGxlbmd0aCBhbmQsIGJ5IGRlZmluaXRpb24sIGRvIG5vdAorICAgICogbWF0Y2guCisgICAgKi8KKyAgIGlmICghbm9kZV9iLT5pc190YWlsX3NlbnRpbmVsKCkpCisgICAgICByZXR1cm4gUEFSQU1FVEVSX0xJU1RfTk9fTUFUQ0g7CisKKyAgIGlmIChpbmV4YWN0X21hdGNoKQorICAgICAgcmV0dXJuIFBBUkFNRVRFUl9MSVNUX0lORVhBQ1RfTUFUQ0g7CisgICBlbHNlCisgICAgICByZXR1cm4gUEFSQU1FVEVSX0xJU1RfRVhBQ1RfTUFUQ0g7Cit9CisKKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2lyX2Z1bmN0aW9uOjptYXRjaGluZ19zaWduYXR1cmUoX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWNfbGlzdCAqYWN0dWFsX3BhcmFtZXRlcnMpCit7CisgICBib29sIGlzX2V4YWN0OworICAgcmV0dXJuIG1hdGNoaW5nX3NpZ25hdHVyZShzdGF0ZSwgYWN0dWFsX3BhcmFtZXRlcnMsICZpc19leGFjdCk7Cit9CisKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqCitpcl9mdW5jdGlvbjo6bWF0Y2hpbmdfc2lnbmF0dXJlKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjX2xpc3QgKmFjdHVhbF9wYXJhbWV0ZXJzLAorCQkJICAgICAgICBib29sICppc19leGFjdCkKK3sKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqbWF0Y2ggPSBOVUxMOworICAgYm9vbCBtdWx0aXBsZV9pbmV4YWN0X21hdGNoZXMgPSBmYWxzZTsKKworICAgLyogRnJvbSBwYWdlIDQyIChwYWdlIDQ5IG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMjAgc3BlYzoKKyAgICAqCisgICAgKiAiSWYgYW4gZXhhY3QgbWF0Y2ggaXMgZm91bmQsIHRoZSBvdGhlciBzaWduYXR1cmVzIGFyZSBpZ25vcmVkLCBhbmQKKyAgICAqICB0aGUgZXhhY3QgbWF0Y2ggaXMgdXNlZC4gIE90aGVyd2lzZSwgaWYgbm8gZXhhY3QgbWF0Y2ggaXMgZm91bmQsIHRoZW4KKyAgICAqICB0aGUgaW1wbGljaXQgY29udmVyc2lvbnMgaW4gU2VjdGlvbiA0LjEuMTAgIkltcGxpY2l0IENvbnZlcnNpb25zIiB3aWxsCisgICAgKiAgYmUgYXBwbGllZCB0byB0aGUgY2FsbGluZyBhcmd1bWVudHMgaWYgdGhpcyBjYW4gbWFrZSB0aGVpciB0eXBlcyBtYXRjaAorICAgICogIGEgc2lnbmF0dXJlLiAgSW4gdGhpcyBjYXNlLCBpdCBpcyBhIHNlbWFudGljIGVycm9yIGlmIHRoZXJlIGFyZQorICAgICogIG11bHRpcGxlIHdheXMgdG8gYXBwbHkgdGhlc2UgY29udmVyc2lvbnMgdG8gdGhlIGFjdHVhbCBhcmd1bWVudHMgb2YgYQorICAgICogIGNhbGwgc3VjaCB0aGF0IHRoZSBjYWxsIGNhbiBiZSBtYWRlIHRvIG1hdGNoIG11bHRpcGxlIHNpZ25hdHVyZXMuIgorICAgICovCisgICBmb3JlYWNoX2xpc3QobiwgJnRoaXMtPnNpZ25hdHVyZXMpIHsKKyAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29uc3Qgc2lnID0gKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKSBuOworCisgICAgICAvKiBTa2lwIG92ZXIgYW55IGJ1aWx0LWlucyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgaW4gdGhpcyBzaGFkZXIuICovCisgICAgICBpZiAoc2lnLT5pc19idWlsdGluKCkgJiYgIXNpZy0+aXNfYnVpbHRpbl9hdmFpbGFibGUoc3RhdGUpKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIHN3aXRjaCAocGFyYW1ldGVyX2xpc3RzX21hdGNoKCYgc2lnLT5wYXJhbWV0ZXJzLCBhY3R1YWxfcGFyYW1ldGVycykpIHsKKyAgICAgIGNhc2UgUEFSQU1FVEVSX0xJU1RfRVhBQ1RfTUFUQ0g6CisJICppc19leGFjdCA9IHRydWU7CisJIHJldHVybiBzaWc7CisgICAgICBjYXNlIFBBUkFNRVRFUl9MSVNUX0lORVhBQ1RfTUFUQ0g6CisJIGlmIChtYXRjaCA9PSBOVUxMKQorCSAgICBtYXRjaCA9IHNpZzsKKwkgZWxzZQorCSAgICBtdWx0aXBsZV9pbmV4YWN0X21hdGNoZXMgPSB0cnVlOworCSBjb250aW51ZTsKKyAgICAgIGNhc2UgUEFSQU1FVEVSX0xJU1RfTk9fTUFUQ0g6CisJIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKwkgYXNzZXJ0KGZhbHNlKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIC8qIFRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoICh3ZSB3b3VsZCBoYXZlIHJldHVybmVkIGl0IGJ5IG5vdykuICBJZiB0aGVyZQorICAgICogYXJlIG11bHRpcGxlIGluZXhhY3QgbWF0Y2hlcywgdGhlIGNhbGwgaXMgYW1iaWd1b3VzLCB3aGljaCBpcyBhbiBlcnJvci4KKyAgICAqCisgICAgKiBGSU5JU0hNRTogUmVwb3J0IGEgZGVjZW50IGVycm9yLiAgUmV0dXJuaW5nIE5VTEwgd2lsbCBsaWtlbHkgcmVzdWx0IGluCisgICAgKiBGSU5JU0hNRTogYSAibm8gbWF0Y2hpbmcgc2lnbmF0dXJlIiBlcnJvcjsgaXQgc2hvdWxkIHJlcG9ydCB0aGF0IHRoZQorICAgICogRklOSVNITUU6IGNhbGwgaXMgYW1iaWd1b3VzLiAgQnV0IHJlcG9ydGluZyBlcnJvcnMgZnJvbSBoZXJlIGlzIGhhcmQuCisgICAgKi8KKyAgICppc19leGFjdCA9IGZhbHNlOworCisgICBpZiAobXVsdGlwbGVfaW5leGFjdF9tYXRjaGVzKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHJldHVybiBtYXRjaDsKK30KKworCitzdGF0aWMgYm9vbAorcGFyYW1ldGVyX2xpc3RzX21hdGNoX2V4YWN0KGNvbnN0IGV4ZWNfbGlzdCAqbGlzdF9hLCBjb25zdCBleGVjX2xpc3QgKmxpc3RfYikKK3sKKyAgIGNvbnN0IGV4ZWNfbm9kZSAqbm9kZV9hID0gbGlzdF9hLT5oZWFkOworICAgY29uc3QgZXhlY19ub2RlICpub2RlX2IgPSBsaXN0X2ItPmhlYWQ7CisKKyAgIGZvciAoLyogZW1wdHkgKi8KKwk7ICFub2RlX2EtPmlzX3RhaWxfc2VudGluZWwoKSAmJiAhbm9kZV9iLT5pc190YWlsX3NlbnRpbmVsKCkKKwk7IG5vZGVfYSA9IG5vZGVfYS0+bmV4dCwgbm9kZV9iID0gbm9kZV9iLT5uZXh0KSB7CisgICAgICBpcl92YXJpYWJsZSAqYSA9IChpcl92YXJpYWJsZSAqKSBub2RlX2E7CisgICAgICBpcl92YXJpYWJsZSAqYiA9IChpcl92YXJpYWJsZSAqKSBub2RlX2I7CisKKyAgICAgIC8qIElmIHRoZSB0eXBlcyBvZiB0aGUgcGFyYW1ldGVycyBkbyBub3QgbWF0Y2gsIHRoZSBwYXJhbWV0ZXJzIGxpc3RzCisgICAgICAgKiBhcmUgZGlmZmVyZW50LgorICAgICAgICovCisgICAgICBpZiAoYS0+dHlwZSAhPSBiLT50eXBlKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICAvKiBVbmxlc3MgYm90aCBsaXN0cyBhcmUgZXhoYXVzdGVkLCB0aGV5IGRpZmZlciBpbiBsZW5ndGggYW5kLCBieQorICAgICogZGVmaW5pdGlvbiwgZG8gbm90IG1hdGNoLgorICAgICovCisgICByZXR1cm4gKG5vZGVfYS0+aXNfdGFpbF9zZW50aW5lbCgpID09IG5vZGVfYi0+aXNfdGFpbF9zZW50aW5lbCgpKTsKK30KKworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2lyX2Z1bmN0aW9uOjpleGFjdF9tYXRjaGluZ19zaWduYXR1cmUoX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWNfbGlzdCAqYWN0dWFsX3BhcmFtZXRlcnMpCit7CisgICBmb3JlYWNoX2xpc3QobiwgJnRoaXMtPnNpZ25hdHVyZXMpIHsKKyAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29uc3Qgc2lnID0gKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKSBuOworCisgICAgICAvKiBTa2lwIG92ZXIgYW55IGJ1aWx0LWlucyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgaW4gdGhpcyBzaGFkZXIuICovCisgICAgICBpZiAoc2lnLT5pc19idWlsdGluKCkgJiYgIXNpZy0+aXNfYnVpbHRpbl9hdmFpbGFibGUoc3RhdGUpKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChwYXJhbWV0ZXJfbGlzdHNfbWF0Y2hfZXhhY3QoJnNpZy0+cGFyYW1ldGVycywgYWN0dWFsX3BhcmFtZXRlcnMpKQorCSByZXR1cm4gc2lnOworICAgfQorICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Z1bmN0aW9uX2Nhbl9pbmxpbmUuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9mdW5jdGlvbl9jYW5faW5saW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjE1ZDVkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9mdW5jdGlvbl9jYW5faW5saW5lLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBpcl9mdW5jdGlvbl9jYW5faW5saW5lLmNwcAorICoKKyAqIERldGVybWluZXMgaWYgd2UgY2FuIGlubGluZSBhIGZ1bmN0aW9uIGNhbGwgdXNpbmcgaXJfZnVuY3Rpb25faW5saW5pbmcuY3BwLgorICoKKyAqIFRoZSBwcmltYXJ5IHJlc3RyaWN0aW9uIGlzIHRoYXQgd2UgY2FuJ3QgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uCisgKiBvdGhlciB0aGFuIGFzIHRoZSBsYXN0IGluc3RydWN0aW9uLiAgV2UgY291bGQgcG90ZW50aWFsbHkgd29yaworICogYXJvdW5kIHRoaXMgZm9yIHNvbWUgY29uc3RydWN0cyBieSBmbGF0dGVuaW5nIGNvbnRyb2wgZmxvdyBhbmQKKyAqIG1vdmluZyB0aGUgcmV0dXJuIHRvIHRoZSBlbmQsIG9yIGJ5IHVzaW5nIGJyZWFrcyBmcm9tIGEgZG8ge30gd2hpbGUKKyAqICgwKSBsb29wIHN1cnJvdW5kaW5nIHRoZSBmdW5jdGlvbiBib2R5LgorICovCisKKyNpbmNsdWRlICJpci5oIgorCitjbGFzcyBpcl9mdW5jdGlvbl9jYW5faW5saW5lX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfZnVuY3Rpb25fY2FuX2lubGluZV92aXNpdG9yKCkKKyAgIHsKKyAgICAgIHRoaXMtPm51bV9yZXR1cm5zID0gMDsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9yZXR1cm4gKik7CisKKyAgIGludCBudW1fcmV0dXJuczsKK307CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9mdW5jdGlvbl9jYW5faW5saW5lX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3JldHVybiAqaXIpCit7CisgICAodm9pZCkgaXI7CisgICB0aGlzLT5udW1fcmV0dXJucysrOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitib29sCitjYW5faW5saW5lKGlyX2NhbGwgKmNhbGwpCit7CisgICBpcl9mdW5jdGlvbl9jYW5faW5saW5lX3Zpc2l0b3IgdjsKKyAgIGNvbnN0IGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY2FsbGVlID0gY2FsbC0+Y2FsbGVlOworICAgaWYgKCFjYWxsZWUtPmlzX2RlZmluZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHYucnVuKChleGVjX2xpc3QgKikgJmNhbGxlZS0+Ym9keSk7CisKKyAgIC8qIElmIHRoZSBmdW5jdGlvbiBpcyBlbXB0eSAobm8gbGFzdCBpbnN0cnVjdGlvbikgb3IgZG9lcyBub3QgZW5kIHdpdGggYQorICAgICogcmV0dXJuIHN0YXRlbWVudCwgd2UgbmVlZCB0byBjb3VudCB0aGUgaW1wbGljaXQgcmV0dXJuLgorICAgICovCisgICBpcl9pbnN0cnVjdGlvbiAqbGFzdCA9IChpcl9pbnN0cnVjdGlvbiAqKWNhbGxlZS0+Ym9keS5nZXRfdGFpbCgpOworICAgaWYgKGxhc3QgPT0gTlVMTCB8fCAhbGFzdC0+YXNfcmV0dXJuKCkpCisgICAgICB2Lm51bV9yZXR1cm5zKys7CisKKyAgIHJldHVybiB2Lm51bV9yZXR1cm5zID09IDE7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Z1bmN0aW9uX2RldGVjdF9yZWN1cnNpb24uY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9mdW5jdGlvbl9kZXRlY3RfcmVjdXJzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk4NWNkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9mdW5jdGlvbl9kZXRlY3RfcmVjdXJzaW9uLmNwcApAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDExIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaXJfZnVuY3Rpb25fZGV0ZWN0X3JlY3Vyc2lvbi5jcHAKKyAqIERldGVybWluZSB3aGV0aGVyIGEgc2hhZGVyIGNvbnRhaW5zIHN0YXRpYyByZWN1cnNpb24uCisgKgorICogQ29uc2lkZXIgdGhlIChwb3NzaWJseSBkaXNqb2ludCkgZ3JhcGggb2YgZnVuY3Rpb24gY2FsbHMgaW4gYSBzaGFkZXIuICBJZiBhCisgKiBwcm9ncmFtIGNvbnRhaW5zIHJlY3Vyc2lvbiwgdGhpcyBncmFwaCB3aWxsIGNvbnRhaW4gYSBjeWNsZS4gIElmIGEgZnVuY3Rpb24KKyAqIGlzIHBhcnQgb2YgYSBjeWNsZSwgaXQgd2lsbCBoYXZlIGEgY2FsbGVyIGFuZCBpdCB3aWxsIGhhdmUgYSBjYWxsZWUgKGl0CisgKiBjYWxscyBhbm90aGVyIGZ1bmN0aW9uKS4KKyAqCisgKiBUbyBkZXRlY3QgcmVjdXJzaW9uLCB0aGUgZnVuY3Rpb24gY2FsbCBncmFwaCBpcyBjb25zdHJ1Y3RlZC4gIFRoZSBncmFwaCBpcworICogcmVwZWF0ZWRseSByZWR1Y2VkIGJ5IHJlbW92aW5nIGFueSBmdW5jdGlvbiB0aGF0IGVpdGhlciBoYXMgbm8gY2FsbGVlcworICogKGxlYWYgZnVuY3Rpb25zKSBvciBoYXMgbm8gY2FsbGVyLiAgRXZlbnR1YWxseSB0aGUgb25seSBmdW5jdGlvbnMgdGhhdAorICogcmVtYWluIHdpbGwgYmUgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgY3ljbGVzLgorICoKKyAqIFRoZSBHTFNMIHNwZWMgaXMgYSBiaXQgd2lzaHktd2FzaHkgYWJvdXQgcmVjdXJzaW9uLgorICoKKyAqIEZyb20gcGFnZSAzOSAocGFnZSA0NSBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjEwIHNwZWM6CisgKgorICogICAgICJCZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgcmVjdXJzaW9uIGlzIHVzZWQuIFJlY3Vyc2lvbiBtZWFucyBoYXZpbmcgYW55CisgKiAgICAgZnVuY3Rpb24gYXBwZWFyaW5nIG1vcmUgdGhhbiBvbmNlIGF0IGFueSBvbmUgdGltZSBpbiB0aGUgcnVuLXRpbWUgc3RhY2sKKyAqICAgICBvZiBmdW5jdGlvbiBjYWxscy4gVGhhdCBpcywgYSBmdW5jdGlvbiBtYXkgbm90IGNhbGwgaXRzZWxmIGVpdGhlcgorICogICAgIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuIENvbXBpbGVycyBtYXkgZ2l2ZSBkaWFnbm9zdGljIG1lc3NhZ2VzIHdoZW4KKyAqICAgICB0aGlzIGlzIGRldGVjdGFibGUgYXQgY29tcGlsZSB0aW1lLCBidXQgbm90IGFsbCBzdWNoIGNhc2VzIGNhbiBiZQorICogICAgIGRldGVjdGVkIGF0IGNvbXBpbGUgdGltZS4iCisgKgorICogRnJvbSBwYWdlIDc5IChwYWdlIDg1IG9mIHRoZSBQREYpOgorICoKKyAqICAgICAiMjIpIFNob3VsZCByZWN1cnNpb24gYmUgc3VwcG9ydGVkPworICoKKyAqICAgICAgRElTQ1VTU0lPTjogUHJvYmFibHkgbm90IG5lY2Vzc2FyeSwgYnV0IGFub3RoZXIgZXhhbXBsZSBvZiBsaW1pdGluZworICogICAgICB0aGUgbGFuZ3VhZ2UgYmFzZWQgb24gaG93IGl0IHdvdWxkIGRpcmVjdGx5IG1hcCB0byBoYXJkd2FyZS4gT25lCisgKiAgICAgIHRob3VnaHQgaXMgdGhhdCByZWN1cnNpb24gd291bGQgYmVuZWZpdCByYXkgdHJhY2luZyBzaGFkZXJzLiBPbiB0aGUKKyAqICAgICAgb3RoZXIgaGFuZCwgbWFueSByZWN1cnNpb24gb3BlcmF0aW9ucyBjYW4gYWxzbyBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoZQorICogICAgICB1c2VyIG1hbmFnaW5nIHRoZSByZWN1cnNpb24gdGhyb3VnaCBhcnJheXMuIFJlbmRlck1hbiBkb2Vzbid0IHN1cHBvcnQKKyAqICAgICAgcmVjdXJzaW9uLiBUaGlzIGNvdWxkIGJlIGFkZGVkIGF0IGEgbGF0ZXIgZGF0ZSwgaWYgaXQgcHJvdmVkIHRvIGJlCisgKiAgICAgIG5lY2Vzc2FyeS4KKyAqCisgKiAgICAgIFJFU09MVkVEIG9uIFNlcHRlbWJlciAxMCwgMjAwMjogSW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8KKyAqICAgICAgc3VwcG9ydCByZWN1cnNpb24uCisgKgorICogICAgICBDTE9TRUQgb24gU2VwdGVtYmVyIDEwLCAyMDAyLiIKKyAqCisgKiBGcm9tIHBhZ2UgNzkgKHBhZ2UgODUgb2YgdGhlIFBERik6CisgKgorICogICAgICI1NikgSXMgaXQgYW4gZXJyb3IgZm9yIGFuIGltcGxlbWVudGF0aW9uIHRvIHN1cHBvcnQgcmVjdXJzaW9uIGlmIHRoZQorICogICAgIHNwZWNpZmljYXRpb24gc2F5cyByZWN1cnNpb24gaXMgbm90IHN1cHBvcnRlZD8KKyAqCisgKiAgICAgQURERUQgb24gU2VwdGVtYmVyIDEwLCAyMDAyLgorICoKKyAqICAgICBESVNDVVNTSU9OOiBUaGlzIGlzc3VlcyBpcyByZWxhdGVkIHRvIElzc3VlICgyMikuIElmIHdlIHNheSB0aGF0CisgKiAgICAgcmVjdXJzaW9uIChvciBzb21lIG90aGVyIHBpZWNlIG9mIGZ1bmN0aW9uYWxpdHkpIGlzIG5vdCBzdXBwb3J0ZWQsIGlzCisgKiAgICAgaXQgYW4gZXJyb3IgZm9yIGFuIGltcGxlbWVudGF0aW9uIHRvIHN1cHBvcnQgaXQ/IFBlcmhhcHMgdGhlCisgKiAgICAgc3BlY2lmaWNhdGlvbiBzaG91bGQgcmVtYWluIHNpbGVudCBvbiB0aGVzZSBraW5kIG9mIHRoaW5ncyBzbyB0aGF0IHRoZXkKKyAqICAgICBjb3VsZCBiZSBncmFjZWZ1bGx5IGFkZGVkIGxhdGVyIGFzIGFuIGV4dGVuc2lvbiBvciBhcyBwYXJ0IG9mIHRoZQorICogICAgIHN0YW5kYXJkLgorICoKKyAqICAgICBSRVNPTFVUSU9OOiBMYW5ndWFnZXMsIGluIGdlbmVyYWwsIGhhdmUgcHJvZ3JhbXMgdGhhdCBhcmUgbm90CisgKiAgICAgd2VsbC1mb3JtZWQgaW4gd2F5cyBhIGNvbXBpbGVyIGNhbm5vdCBkZXRlY3QuIFBvcnRhYmlsaXR5IGlzIG9ubHkKKyAqICAgICBlbnN1cmVkIGZvciB3ZWxsLWZvcm1lZCBwcm9ncmFtcy4gRGV0ZWN0aW5nIHJlY3Vyc2lvbiBpcyBhbiBleGFtcGxlIG9mCisgKiAgICAgdGhpcy4gVGhlIGxhbmd1YWdlIHdpbGwgc2F5IGEgd2VsbC1mb3JtZWQgcHJvZ3JhbSBtYXkgbm90IHJlY3Vyc2UsIGJ1dAorICogICAgIGNvbXBpbGVycyBhcmUgbm90IGZvcmNlZCB0byBkZXRlY3QgdGhhdCByZWN1cnNpb24gbWF5IGhhcHBlbi4KKyAqCisgKiAgICAgQ0xPU0VEOiBOb3ZlbWJlciAyOSwgMjAwMi4iCisgKgorICogSW4gR0xTTCAxLjEwIHRoZSBiZWhhdmlvciBvZiByZWN1cnNpb24gaXMgdW5kZWZpbmVkLiAgQ29tcGlsZXJzIGRvbid0IGhhdmUKKyAqIHRvIHJlamVjdCBzaGFkZXJzIChhdCBjb21waWxlLXRpbWUgb3IgbGluay10aW1lKSB0aGF0IGNvbnRhaW4gcmVjdXJzaW9uLgorICogSW5zdGVhZCB0aGV5IGNvdWxkIHdvcmssIG9yIGNyYXNoLCBvciBraWxsIGEga2l0dGVuLgorICoKKyAqIEZyb20gcGFnZSA0NCAocGFnZSA1MCBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjIwIHNwZWM6CisgKgorICogICAgICJSZWN1cnNpb24gaXMgbm90IGFsbG93ZWQsIG5vdCBldmVuIHN0YXRpY2FsbHkuIFN0YXRpYyByZWN1cnNpb24gaXMKKyAqICAgICBwcmVzZW50IGlmIHRoZSBzdGF0aWMgZnVuY3Rpb24gY2FsbCBncmFwaCBvZiB0aGUgcHJvZ3JhbSBjb250YWlucworICogICAgIGN5Y2xlcy4iCisgKgorICogVGhpcyBsYW5nYXVnZSBjbGVhcnMgdGhpbmdzIHVwIGEgYml0LCBidXQgaXQgc3RpbGwgbGVhdmVzIGEgbG90IG9mCisgKiBxdWVzdGlvbnMgdW5hbnN3ZXJlZC4KKyAqCisgKiAgICAgLSBJcyB0aGUgZXJyb3IgZ2VuZXJhdGVkIGF0IGNvbXBpbGUtdGltZSBvciBsaW5rLXRpbWU/CisgKgorICogICAgIC0gSXMgaXQgYW4gZXJyb3IgdG8gaGF2ZSBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGlzIG5ldmVyIHN0YXRpY2FsbHkKKyAqICAgICAgIGNhbGxlZCBieSBtYWluIG9yIGFueSBmdW5jdGlvbiBjYWxsZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSBtYWluPworICogICAgICAgVGVjaG5pY2FsbHkgc3BlYWtpbmcsIHN1Y2ggYSBmdW5jdGlvbiBpcyBub3QgaW4gdGhlICJzdGF0aWMgZnVuY3Rpb24KKyAqICAgICAgIGNhbGwgZ3JhcGggb2YgdGhlIHByb2dyYW0iIGF0IGFsbC4KKyAqCisgKiBcYnVnCisgKiBJZiBhIHNoYWRlciBoYXMgbXVsdGlwbGUgY3ljbGVzLCB0aGlzIGFsZ29yaXRobSBtYXkgZXJyb25lb3VzbHkgY29tcGxhaW4KKyAqIGFib3V0IGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCBpbiBhbnkgY3ljbGUsIGJ1dCBhcmUgaW4gdGhlIHBhcnQgb2YgdGhlIGNhbGwKKyAqIHRyZWUgdGhhdCBjb25uZWN0cyB0aGVtLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBjYWxsIGdyYXBoIGNvbnNpc3RzIG9mIGEKKyAqIGN5Y2xlIGJldHdlZW4gQSBhbmQgQiwgYW5kIGEgY3ljbGUgYmV0d2VlbiBEIGFuZCBFLCBhbmQgQiBhbHNvIGNhbGxzIEMKKyAqIHdoaWNoIGNhbGxzIEQsIHRoZW4gdGhpcyBhbGdvcml0aG0gd2lsbCByZXBvcnQgQyBhcyBhIGZ1bmN0aW9uIHdoaWNoICJoYXMKKyAqIHN0YXRpYyByZWN1cnNpb24iIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCBwYXJ0IG9mIGFueSBjeWNsZS4KKyAqCisgKiBBIGJldHRlciBhbGdvcml0aG0gZm9yIGN5Y2xlIGRldGVjdGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGlzIGRyYXdiYWNrIGNhbgorICogYmUgZm91bmQgaGVyZToKKyAqCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RhcmphbiVFMiU4MCU5OXNfc3Ryb25nbHlfY29ubmVjdGVkX2NvbXBvbmVudHNfYWxnb3JpdGhtCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworI2luY2x1ZGUgImxpYmZucy5oIiAgLy8gTHVuYXJHIEFERDogCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJnbHNsX3BhcnNlcl9leHRyYXMuaCIKKyNpbmNsdWRlICJsaW5rZXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJwcm9ncmFtLmgiCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBjYWxsX25vZGUgOiBwdWJsaWMgZXhlY19ub2RlIHsKKyAgIGNsYXNzIGZ1bmN0aW9uICpmdW5jOworfTsKKworY2xhc3MgZnVuY3Rpb24geworcHVibGljOgorICAgZnVuY3Rpb24oaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcpCisgICAgICA6IHNpZyhzaWcpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKGZ1bmN0aW9uKQorCisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZzsKKworICAgLyoqIExpc3Qgb2YgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGlzIGZ1bmN0aW9uLiAqLworICAgZXhlY19saXN0IGNhbGxlZXM7CisKKyAgIC8qKiBMaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhpcyBmdW5jdGlvbi4gKi8KKyAgIGV4ZWNfbGlzdCBjYWxsZXJzOworfTsKKworY2xhc3MgaGFzX3JlY3Vyc2lvbl92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGhhc19yZWN1cnNpb25fdmlzaXRvcigpCisgICAgICA6IGN1cnJlbnQoTlVMTCkKKyAgIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisgICAgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICAgICB0aGlzLT5mdW5jdGlvbl9oYXNoID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfcG9pbnRlcl9oYXNoLAorCQkJCQkgICAgaGFzaF90YWJsZV9wb2ludGVyX2NvbXBhcmUpOworICAgfQorCisgICB+aGFzX3JlY3Vyc2lvbl92aXNpdG9yKCkKKyAgIHsKKyAgICAgIGhhc2hfdGFibGVfZHRvcih0aGlzLT5mdW5jdGlvbl9oYXNoKTsKKyAgICAgIHJhbGxvY19mcmVlKHRoaXMtPm1lbV9jdHgpOworICAgfQorCisgICBmdW5jdGlvbiAqZ2V0X2Z1bmN0aW9uKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnKQorICAgeworICAgICAgZnVuY3Rpb24gKmYgPSAoZnVuY3Rpb24gKikgaGFzaF90YWJsZV9maW5kKHRoaXMtPmZ1bmN0aW9uX2hhc2gsIHNpZyk7CisgICAgICBpZiAoZiA9PSBOVUxMKSB7CisJIGYgPSBuZXcobWVtX2N0eCkgZnVuY3Rpb24oc2lnKTsKKwkgaGFzaF90YWJsZV9pbnNlcnQodGhpcy0+ZnVuY3Rpb25faGFzaCwgZiwgc2lnKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGY7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcpCisgICB7CisgICAgICB0aGlzLT5jdXJyZW50ID0gdGhpcy0+Z2V0X2Z1bmN0aW9uKHNpZyk7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcpCisgICB7CisgICAgICAodm9pZCkgc2lnOworICAgICAgdGhpcy0+Y3VycmVudCA9IE5VTEw7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfY2FsbCAqY2FsbCkKKyAgIHsKKyAgICAgIC8qIEF0IGdsb2JhbCBzY29wZSB0aGlzLT5jdXJyZW50IHdpbGwgYmUgTlVMTC4gIFNpbmNlIHRoZXJlIGlzIG5vIHdheSB0bworICAgICAgICogY2FsbCBnbG9iYWwgc2NvcGUsIGl0IGNhbiBuZXZlciBiZSBwYXJ0IG9mIGEgY3ljbGUuICBEb24ndCBib3RoZXIKKyAgICAgICAqIGFkZGluZyBjYWxscyBmcm9tIGdsb2JhbCBzY29wZSB0byB0aGUgZ3JhcGguCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLT5jdXJyZW50ID09IE5VTEwpCisJIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgICAgZnVuY3Rpb24gKmNvbnN0IHRhcmdldCA9IHRoaXMtPmdldF9mdW5jdGlvbihjYWxsLT5jYWxsZWUpOworCisgICAgICAvKiBDcmVhdGUgYSBsaW5rIGZyb20gdGhlIGNhbGxlciB0byB0aGUgY2FsbGVlLgorICAgICAgICovCisgICAgICBjYWxsX25vZGUgKm5vZGUgPSBuZXcobWVtX2N0eCkgY2FsbF9ub2RlOworICAgICAgbm9kZS0+ZnVuYyA9IHRhcmdldDsKKyAgICAgIHRoaXMtPmN1cnJlbnQtPmNhbGxlZXMucHVzaF90YWlsKG5vZGUpOworCisgICAgICAvKiBDcmVhdGUgYSBsaW5rIGZyb20gdGhlIGNhbGxlZSB0byB0aGUgY2FsbGVyLgorICAgICAgICovCisgICAgICBub2RlID0gbmV3KG1lbV9jdHgpIGNhbGxfbm9kZTsKKyAgICAgIG5vZGUtPmZ1bmMgPSB0aGlzLT5jdXJyZW50OworICAgICAgdGFyZ2V0LT5jYWxsZXJzLnB1c2hfdGFpbChub2RlKTsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgZnVuY3Rpb24gKmN1cnJlbnQ7CisgICBzdHJ1Y3QgaGFzaF90YWJsZSAqZnVuY3Rpb25faGFzaDsKKyAgIHZvaWQgKm1lbV9jdHg7CisgICBib29sIHByb2dyZXNzOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK3N0YXRpYyB2b2lkCitkZXN0cm95X2xpbmtzKGV4ZWNfbGlzdCAqbGlzdCwgZnVuY3Rpb24gKmYpCit7CisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCBsaXN0KSB7CisgICAgICBzdHJ1Y3QgY2FsbF9ub2RlICpuID0gKHN0cnVjdCBjYWxsX25vZGUgKikgbm9kZTsKKworICAgICAgLyogSWYgdGhpcyBpcyB0aGUgcmlnaHQgZnVuY3Rpb24sIHJlbW92ZSBpdC4gIE5vdGUgdGhhdCB0aGUgbG9vcCBjYW5ub3QKKyAgICAgICAqIHRlcm1pbmF0ZSBub3cuICBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgbGlua3MgdG8gYSBmdW5jdGlvbiBpZiBpdCBpcworICAgICAgICogZWl0aGVyIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvciBjYWxscyBtdWx0aXBsZSB0aW1lcy4KKyAgICAgICAqLworICAgICAgaWYgKG4tPmZ1bmMgPT0gZikKKwkgbi0+cmVtb3ZlKCk7CisgICB9Cit9CisKKworLyoqCisgKiBSZW1vdmUgYSBmdW5jdGlvbiBpZiBpdCBoYXMgZWl0aGVyIG5vIGluIG9yIG5vIG91dCBsaW5rcworICovCitzdGF0aWMgdm9pZAorcmVtb3ZlX3VubGlua2VkX2Z1bmN0aW9ucyhjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsIHZvaWQgKmNsb3N1cmUpCit7CisgICBoYXNfcmVjdXJzaW9uX3Zpc2l0b3IgKnZpc2l0b3IgPSAoaGFzX3JlY3Vyc2lvbl92aXNpdG9yICopIGNsb3N1cmU7CisgICBmdW5jdGlvbiAqZiA9IChmdW5jdGlvbiAqKSBkYXRhOworCisgICBpZiAoZi0+Y2FsbGVycy5pc19lbXB0eSgpIHx8IGYtPmNhbGxlZXMuaXNfZW1wdHkoKSkgeworICAgICAgd2hpbGUgKCFmLT5jYWxsZXJzLmlzX2VtcHR5KCkpIHsKKwkgc3RydWN0IGNhbGxfbm9kZSAqbiA9IChzdHJ1Y3QgY2FsbF9ub2RlICopIGYtPmNhbGxlcnMucG9wX2hlYWQoKTsKKwkgZGVzdHJveV9saW5rcygmIG4tPmZ1bmMtPmNhbGxlZXMsIGYpOworICAgICAgfQorCisgICAgICB3aGlsZSAoIWYtPmNhbGxlZXMuaXNfZW1wdHkoKSkgeworCSBzdHJ1Y3QgY2FsbF9ub2RlICpuID0gKHN0cnVjdCBjYWxsX25vZGUgKikgZi0+Y2FsbGVlcy5wb3BfaGVhZCgpOworCSBkZXN0cm95X2xpbmtzKCYgbi0+ZnVuYy0+Y2FsbGVycywgZik7CisgICAgICB9CisKKyAgICAgIGhhc2hfdGFibGVfcmVtb3ZlKHZpc2l0b3ItPmZ1bmN0aW9uX2hhc2gsIGtleSk7CisgICAgICB2aXNpdG9yLT5wcm9ncmVzcyA9IHRydWU7CisgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2VtaXRfZXJyb3JzX3VubGlua2VkKGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqZGF0YSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSA9CisgICAgICAoc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKikgY2xvc3VyZTsKKyAgIGZ1bmN0aW9uICpmID0gKGZ1bmN0aW9uICopIGRhdGE7CisgICBZWUxUWVBFIGxvYzsKKworICAgKHZvaWQpIGtleTsKKworICAgY2hhciAqcHJvdG8gPSBwcm90b3R5cGVfc3RyaW5nKGYtPnNpZy0+cmV0dXJuX3R5cGUsCisJCQkJICBmLT5zaWctPmZ1bmN0aW9uX25hbWUoKSwKKwkJCQkgICZmLT5zaWctPnBhcmFtZXRlcnMpOworCisgICBtZW1zZXQoJmxvYywgMCwgc2l6ZW9mKGxvYykpOworICAgX21lc2FfZ2xzbF9lcnJvcigmbG9jLCBzdGF0ZSwKKwkJICAgICJmdW5jdGlvbiBgJXMnIGhhcyBzdGF0aWMgcmVjdXJzaW9uIiwKKwkJICAgIHByb3RvKTsKKyAgIHJhbGxvY19mcmVlKHByb3RvKTsKK30KKworCitzdGF0aWMgdm9pZAorZW1pdF9lcnJvcnNfbGlua2VkKGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqZGF0YSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyA9CisgICAgICAoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICopIGNsb3N1cmU7CisgICBmdW5jdGlvbiAqZiA9IChmdW5jdGlvbiAqKSBkYXRhOworCisgICAodm9pZCkga2V5OworCisgICBjaGFyICpwcm90byA9IHByb3RvdHlwZV9zdHJpbmcoZi0+c2lnLT5yZXR1cm5fdHlwZSwKKwkJCQkgIGYtPnNpZy0+ZnVuY3Rpb25fbmFtZSgpLAorCQkJCSAgJmYtPnNpZy0+cGFyYW1ldGVycyk7CisKKyAgIGxpbmtlcl9lcnJvcihwcm9nLCAiZnVuY3Rpb24gYCVzJyBoYXMgc3RhdGljIHJlY3Vyc2lvbi5cbiIsIHByb3RvKTsKKyAgIHJhbGxvY19mcmVlKHByb3RvKTsKK30KKworCit2b2lkCitkZXRlY3RfcmVjdXJzaW9uX3VubGlua2VkKHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSwKKwkJCSAgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBoYXNfcmVjdXJzaW9uX3Zpc2l0b3IgdjsKKworICAgLyogQ29sbGVjdCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZ1bmN0aW9ucyBjYWxsIHdoaWNoIG90aGVyCisgICAgKiBmdW5jdGlvbnMuCisgICAgKi8KKyAgIHYucnVuKGluc3RydWN0aW9ucyk7CisKKyAgIC8qIFJlbW92ZSBmcm9tIHRoZSBzZXQgYWxsIG9mIHRoZSBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgaGF2ZSBubyBjYWxsZXIgb3IKKyAgICAqIGNhbGwgbm8gb3RoZXIgZnVuY3Rpb25zLiAgUmVwZWF0IHVudGlsIG5vIGZ1bmN0aW9ucyBhcmUgcmVtb3ZlZC4KKyAgICAqLworICAgZG8geworICAgICAgdi5wcm9ncmVzcyA9IGZhbHNlOworICAgICAgaGFzaF90YWJsZV9jYWxsX2ZvcmVhY2godi5mdW5jdGlvbl9oYXNoLCByZW1vdmVfdW5saW5rZWRfZnVuY3Rpb25zLCAmIHYpOworICAgfSB3aGlsZSAodi5wcm9ncmVzcyk7CisKKworICAgLyogQXQgdGhpcyBwb2ludCBhbnkgZnVuY3Rpb25zIHN0aWxsIGluIHRoZSBoYXNoIG11c3QgYmUgcGFydCBvZiBhIGN5Y2xlLgorICAgICovCisgICBoYXNoX3RhYmxlX2NhbGxfZm9yZWFjaCh2LmZ1bmN0aW9uX2hhc2gsIGVtaXRfZXJyb3JzX3VubGlua2VkLCBzdGF0ZSk7Cit9CisKKwordm9pZAorZGV0ZWN0X3JlY3Vyc2lvbl9saW5rZWQoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorCQkJZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBoYXNfcmVjdXJzaW9uX3Zpc2l0b3IgdjsKKworICAgLyogQ29sbGVjdCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZ1bmN0aW9ucyBjYWxsIHdoaWNoIG90aGVyCisgICAgKiBmdW5jdGlvbnMuCisgICAgKi8KKyAgIHYucnVuKGluc3RydWN0aW9ucyk7CisKKyAgIC8qIFJlbW92ZSBmcm9tIHRoZSBzZXQgYWxsIG9mIHRoZSBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgaGF2ZSBubyBjYWxsZXIgb3IKKyAgICAqIGNhbGwgbm8gb3RoZXIgZnVuY3Rpb25zLiAgUmVwZWF0IHVudGlsIG5vIGZ1bmN0aW9ucyBhcmUgcmVtb3ZlZC4KKyAgICAqLworICAgZG8geworICAgICAgdi5wcm9ncmVzcyA9IGZhbHNlOworICAgICAgaGFzaF90YWJsZV9jYWxsX2ZvcmVhY2godi5mdW5jdGlvbl9oYXNoLCByZW1vdmVfdW5saW5rZWRfZnVuY3Rpb25zLCAmIHYpOworICAgfSB3aGlsZSAodi5wcm9ncmVzcyk7CisKKworICAgLyogQXQgdGhpcyBwb2ludCBhbnkgZnVuY3Rpb25zIHN0aWxsIGluIHRoZSBoYXNoIG11c3QgYmUgcGFydCBvZiBhIGN5Y2xlLgorICAgICovCisgICBoYXNoX3RhYmxlX2NhbGxfZm9yZWFjaCh2LmZ1bmN0aW9uX2hhc2gsIGVtaXRfZXJyb3JzX2xpbmtlZCwgcHJvZyk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Z1bmN0aW9uX2lubGluaW5nLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2Z1bmN0aW9uX2lubGluaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiMDExYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfZnVuY3Rpb25faW5saW5pbmcuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBpcl9mdW5jdGlvbl9pbmxpbmluZy5oCisgKgorICogUmVwbGFjZXMgY2FsbHMgdG8gZnVuY3Rpb25zIHdpdGggdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgorICovCisKK2Jvb2wgY2FuX2lubGluZShpcl9jYWxsICpjYWxsKTsKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9oaWVyYXJjaGljYWxfdmlzaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2MDZkZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IuY3BwCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IuaCIKKworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OmlyX2hpZXJhcmNoaWNhbF92aXNpdG9yKCkKK3sKKyAgIHRoaXMtPmJhc2VfaXIgPSBOVUxMOworICAgdGhpcy0+Y2FsbGJhY2sgPSBOVUxMOworICAgdGhpcy0+ZGF0YSA9IE5VTEw7CisgICB0aGlzLT5pbl9hc3NpZ25lZSA9IGZhbHNlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0KGlyX3J2YWx1ZSAqaXIpCit7CisgICBpZiAodGhpcy0+Y2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHRoaXMtPmNhbGxiYWNrKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0KGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIGlmICh0aGlzLT5jYWxsYmFjayAhPSBOVUxMKQorICAgICAgdGhpcy0+Y2FsbGJhY2soaXIsIHRoaXMtPmRhdGEpOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9oaWVyYXJjaGljYWxfdmlzaXRvcjo6dmlzaXQoaXJfY29uc3RhbnQgKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdChpcl9sb29wX2p1bXAgKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdChpcl9lbWl0X3ZlcnRleCAqaXIpCit7CisgICBpZiAodGhpcy0+Y2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHRoaXMtPmNhbGxiYWNrKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0KGlyX2VuZF9wcmltaXRpdmUgKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqaXIpCit7CisgICBpZiAodGhpcy0+Y2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHRoaXMtPmNhbGxiYWNrKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2xvb3AgKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9sb29wICppcikKK3sKKyAgICh2b2lkKSBpcjsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uICppcikKK3sKKyAgIGlmICh0aGlzLT5jYWxsYmFjayAhPSBOVUxMKQorICAgICAgdGhpcy0+Y2FsbGJhY2soaXIsIHRoaXMtPmRhdGEpOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9oaWVyYXJjaGljYWxfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfZnVuY3Rpb24gKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9leHByZXNzaW9uICppcikKK3sKKyAgICh2b2lkKSBpcjsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl90ZXh0dXJlICppcikKK3sKKyAgIGlmICh0aGlzLT5jYWxsYmFjayAhPSBOVUxMKQorICAgICAgdGhpcy0+Y2FsbGJhY2soaXIsIHRoaXMtPmRhdGEpOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9oaWVyYXJjaGljYWxfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfdGV4dHVyZSAqaXIpCit7CisgICAodm9pZCkgaXI7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9oaWVyYXJjaGljYWxfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfc3dpenpsZSAqaXIpCit7CisgICBpZiAodGhpcy0+Y2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHRoaXMtPmNhbGxiYWNrKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX3N3aXp6bGUgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKK3sKKyAgIGlmICh0aGlzLT5jYWxsYmFjayAhPSBOVUxMKQorICAgICAgdGhpcy0+Y2FsbGJhY2soaXIsIHRoaXMtPmRhdGEpOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9oaWVyYXJjaGljYWxfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqaXIpCit7CisgICBpZiAodGhpcy0+Y2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHRoaXMtPmNhbGxiYWNrKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqaXIpCit7CisgICAodm9pZCkgaXI7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9oaWVyYXJjaGljYWxfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpZiAodGhpcy0+Y2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHRoaXMtPmNhbGxiYWNrKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9jYWxsICppcikKK3sKKyAgICh2b2lkKSBpcjsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9yZXR1cm4gKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9yZXR1cm4gKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Rpc2NhcmQgKmlyKQoreworICAgaWYgKHRoaXMtPmNhbGxiYWNrICE9IE5VTEwpCisgICAgICB0aGlzLT5jYWxsYmFjayhpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9kaXNjYXJkICppcikKK3sKKyAgICh2b2lkKSBpcjsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9pZiAqaXIpCit7CisgICBpZiAodGhpcy0+Y2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHRoaXMtPmNhbGxiYWNrKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2lmICppcikKK3sKKyAgICh2b2lkKSBpcjsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKwordm9pZAoraXJfaGllcmFyY2hpY2FsX3Zpc2l0b3I6OnJ1bihleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgaW5zdHJ1Y3Rpb25zKTsKK30KKworCit2b2lkCit2aXNpdF90cmVlKGlyX2luc3RydWN0aW9uICppciwKKwkgICB2b2lkICgqY2FsbGJhY2spKGNsYXNzIGlyX2luc3RydWN0aW9uICppciwgdm9pZCAqZGF0YSksCisJICAgdm9pZCAqZGF0YSkKK3sKKyAgIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHY7CisKKyAgIHYuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgIHYuZGF0YSA9IGRhdGE7CisKKyAgIGlyLT5hY2NlcHQoJnYpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9oaWVyYXJjaGljYWxfdmlzaXRvci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9oaWVyYXJjaGljYWxfdmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0N2QyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2hpZXJhcmNoaWNhbF92aXNpdG9yLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIElSX0hJRVJBUkNISUNBTF9WSVNJVE9SX0gKKyNkZWZpbmUgSVJfSElFUkFSQ0hJQ0FMX1ZJU0lUT1JfSAorCisvKioKKyAqIEVudW1lcmF0aW9uIHZhbHVlcyByZXR1cm5lZCBieSB2aXNpdCBtZXRob2RzIHRvIGd1aWRlIHByb2Nlc3NpbmcKKyAqLworZW51bSBpcl92aXNpdG9yX3N0YXR1cyB7CisgICB2aXNpdF9jb250aW51ZSwJCS8qKjwgQ29udGludWUgdmlzaXRpbmcgYXMgbm9ybWFsLiAqLworICAgdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQsCS8qKjwgRG9uJ3QgdmlzaXQgc2libGluZ3MsIGNvbnRpbnVlIHcvcGFyZW50LiAqLworICAgdmlzaXRfc3RvcAkJCS8qKjwgU3RvcCB2aXNpdGluZyBpbW1lZGlhdGVseS4gKi8KK307CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisvKioKKyAqIEJhc2UgY2xhc3Mgb2YgaGllcmFyY2hpY2FsIHZpc2l0b3JzIG9mIElSIGluc3RydWN0aW9uIHRyZWVzCisgKgorICogSGllcmFyY2hpY2FsIHZpc2l0b3JzIGRpZmZlciBmcm9tIHRyYWRpdGlvbmFsIHZpc2l0b3JzIGluIGEgY291cGxlIG9mCisgKiBpbXBvcnRhbnQgd2F5cy4gIFJhdGhlciB0aGFuIGhhdmluZyBhIHNpbmdsZSBcYyB2aXNpdCBtZXRob2QgZm9yIGVhY2gKKyAqIHN1YmNsYXNzIGluIHRoZSBjb21wb3NpdGUsIHRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiB2aXNpdCBtZXRob2RzLgorICogTGVhZi1ub2RlIGNsYXNzZXMgaGF2ZSBhIHRyYWRpdGlvbmFsIFxjIHZpc2l0IG1ldGhvZC4gIEludGVybmFsLW5vZGUKKyAqIGNsYXNzZXMgaGF2ZSBhIFxjIHZpc2l0X2VudGVyIG1ldGhvZCwgd2hpY2ggaXMgaW52b2tlZCBqdXN0IGJlZm9yZQorICogcHJvY2Vzc2luZyBjaGlsZCBub2RlcywgYW5kIGEgXGMgdmlzaXRfbGVhdmUgbWV0aG9kIHdoaWNoIGlzIGludm9rZWQganVzdAorICogYWZ0ZXIgcHJvY2Vzc2luZyBjaGlsZCBub2Rlcy4KKyAqCisgKiBJbiBhZGRpdGlvbiwgZWFjaCB2aXNpdCBtZXRob2QgYW5kIHRoZSBcYyBhY2NlcHQgbWV0aG9kcyBpbiB0aGUgY29tcG9zaXRlCisgKiBoYXZlIGEgcmV0dXJuIHZhbHVlIHdoaWNoIGd1aWRlcyB0aGUgbmF2aWdhdGlvbi4gIEFueSBvZiB0aGUgdmlzaXQgbWV0aG9kcworICogY2FuIGNob29zZSB0byBjb250aW51ZSB2aXNpdGluZyB0aGUgdHJlZSBhcyBub3JtYWwgKGJ5IHJldHVybmluZyBcYworICogdmlzaXRfY29udGludWUpLCB0ZXJtaW5hdGUgdmlzaXRpbmcgYW55IGZ1cnRoZXIgbm9kZXMgaW1tZWRpYXRlbHkgKGJ5CisgKiByZXR1cm5pbmcgXGMgdmlzaXRfc3RvcCksIG9yIHN0b3AgdmlzaXRpbmcgc2libGluZyBub2RlcyAoYnkgcmV0dXJuaW5nIFxjCisgKiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkuCisgKgorICogVGhlc2UgdHdvIGNoYW5nZXMgY29tYmluZSB0byBhbGxvdyBuYWdpdmF0aW9uIG9mIGNoaWxkcmVuIHRvIGJlIGltcGxlbWVudGVkCisgKiBpbiB0aGUgY29tcG9zaXRlJ3MgXGMgYWNjZXB0IG1ldGhvZC4gIFRoZSBcYyBhY2NlcHQgbWV0aG9kIGZvciBhIGxlYWYtbm9kZQorICogY2xhc3Mgd2lsbCBzaW1wbHkgY2FsbCB0aGUgXGMgdmlzaXQgbWV0aG9kLCBhcyB1c3VhbCwgYW5kIHBhc3MgaXRzIHJldHVybgorICogdmFsdWUgb24uICBUaGUgXGMgYWNjZXB0IG1ldGhvZCBmb3IgaW50ZXJuYWwtbm9kZSBjbGFzc2VzIHdpbGwgY2FsbCB0aGUgXGMKKyAqIHZpc2l0X2VudGVyIG1ldGhvZCwgY2FsbCB0aGUgXGMgYWNjcGV0IG1ldGhvZCBvZiBlYWNoIGNoaWxkIG5vZGUsIGFuZCwKKyAqIGZpbmFsbHksIGNhbGwgdGhlIFxjIHZpc2l0X2xlYXZlIG1ldGhvZC4gIElmIGFueSBvZiB0aGVzZSByZXR1cm4gYSB2YWx1ZQorICogb3RoZXIgdGhhdCBcYyB2aXNpdF9jb250aW51ZSwgdGhlIGNvcnJlY3QgYWN0aW9uIG11c3QgYmUgdGFrZW4uCisgKgorICogVGhlIGZpbmFsIGJlbmVmaXQgaXMgdGhhdCB0aGUgaGllcmFyY2hpY2FsIHZpc2l0b3IgYmFzZSBjbGFzcyBuZWVkIG5vdCBiZQorICogYWJzdHJhY3QuICBEZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBldmVyeSBcYyB2aXNpdCwgXGMgdmlzaXRfZW50ZXIsIGFuZAorICogXGMgdmlzaXRfbGVhdmUgbWV0aG9kIGNhbiBiZSBwcm92aWRlZC4gIEJ5IGRlZmF1bHQgZWFjaCBvZiB0aGVzZSBtZXRob2RzCisgKiBzaW1wbHkgcmV0dXJucyBcYyB2aXNpdF9jb250aW51ZS4gIFRoaXMgYWxsb3dzIGEgc2lnbmlmaWNhbnQgcmVkdWN0aW9uIGluCisgKiBkZXJpdmVkIGNsYXNzIGNvZGUuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaGllcmFyY2hpY2FsIHZpc2l0b3JzLCBzZWU6CisgKgorICogICAgaHR0cDovL2MyLmNvbS9jZ2kvd2lraT9IaWVyYXJjaGljYWxWaXNpdG9yUGF0dGVybgorICogICAgaHR0cDovL2MyLmNvbS9jZ2kvd2lraT9IaWVyYXJjaGljYWxWaXNpdG9yRGlzY3Vzc2lvbgorICovCisKK2NsYXNzIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yKCk7CisKKyAgIC8qKgorICAgICogXG5hbWUgVmlzaXQgbWV0aG9kcyBmb3IgbGVhZi1ub2RlIGNsYXNzZXMKKyAgICAqLworICAgLypAeyovCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGNsYXNzIGlyX3J2YWx1ZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoY2xhc3MgaXJfdmFyaWFibGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGNsYXNzIGlyX2NvbnN0YW50ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChjbGFzcyBpcl9sb29wX2p1bXAgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGNsYXNzIGlyX2VtaXRfdmVydGV4ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChjbGFzcyBpcl9lbmRfcHJpbWl0aXZlICopOworCisgICAvKioKKyAgICAqIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlIGlzbid0IHRlY2huaWNhbGx5IGEgbGVhZiwgYnV0IGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICogbGVhZiBoZXJlIGZvciBhIGNvdXBsZSByZWFzb25zLiAgQnkgbm90IGF1dG9tYXRpY2FsbHkgdmlzaXRpbmcgdGhlIG9uZQorICAgICogY2hpbGQgaXJfdmFyaWFibGUgbm9kZSBmcm9tIHRoZSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSwgaXJfdmFyaWFibGUKKyAgICAqIG5vZGVzIGNhbiBhbHdheXMgYmUgaGFuZGxlZCBhcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICBDb2RlIHRoYXQgdXNlZAorICAgICogbm9uLWhpZXJhcmNoaWNhbCB2aXNpdG9ycyBoYWQgdG8gc2V0IGFuICJpbiBhIGRlcmVmZXJlbmNlIiBmbGFnIHRvCisgICAgKiBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSBhbiBpcl92YXJpYWJsZS4gIEJ5IGZvcmNpbmcgdGhlIHZpc2l0b3IgdG8KKyAgICAqIGhhbmRsZSB0aGUgaXJfdmFyaWFibGUgd2l0aGluIHRoZSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSB2aXNpdG9yLCB0aGlzCisgICAgKiBrbHVkZ2UgY2FuIGJlIGF2b2lkZWQuCisgICAgKgorICAgICogSW4gYWRkaXRpb24sIEkgY2FuIGVudmlzaW9uIG5vIHVzZSBmb3IgaGF2aW5nIHNlcGFyYXRlIGVudGVyIGFuZCBsZWF2ZQorICAgICogbWV0aG9kcy4gIEFueXRoaW5nIHRoYXQgY291bGQgYmUgZG9uZSBpbiB0aGUgZW50ZXIgYW5kIGxlYXZlIG1ldGhvZHMKKyAgICAqIHRoYXQgY291bGRuJ3QganVzdCBiZSBkb25lIGluIHRoZSB2aXNpdCBtZXRob2QuCisgICAgKi8KKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoY2xhc3MgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisgICAvKkB9Ki8KKworICAgLyoqCisgICAgKiBcbmFtZSBWaXNpdCBtZXRob2RzIGZvciBpbnRlcm5hbC1ub2RlIGNsYXNzZXMKKyAgICAqLworICAgLypAeyovCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2xvb3AgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX2xvb3AgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihjbGFzcyBpcl9mdW5jdGlvbiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfZnVuY3Rpb24gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2V4cHJlc3Npb24gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX2V4cHJlc3Npb24gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX3RleHR1cmUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX3RleHR1cmUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX3N3aXp6bGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX3N3aXp6bGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2RlcmVmZXJlbmNlX2FycmF5ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShjbGFzcyBpcl9kZXJlZmVyZW5jZV9hcnJheSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfZGVyZWZlcmVuY2VfcmVjb3JkICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShjbGFzcyBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2Fzc2lnbm1lbnQgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX2Fzc2lnbm1lbnQgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2NhbGwgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX2NhbGwgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX3JldHVybiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfcmV0dXJuICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihjbGFzcyBpcl9kaXNjYXJkICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShjbGFzcyBpcl9kaXNjYXJkICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihjbGFzcyBpcl9pZiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfaWYgKik7CisgICAvKkB9Ki8KKworCisgICAvKioKKyAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJvY2VzcyBhIGxpbmtlZCBsaXN0IG9mIGluc3RydWN0aW9ucyB3aXRoIGEgdmlzaXRvcgorICAgICovCisgICB2b2lkIHJ1bihzdHJ1Y3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCisgICAvKiBTb21lIHZpc2l0b3JzIG1heSBuZWVkIHRvIGluc2VydCBuZXcgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZAorICAgICogYXNzaWdubWVudHMgZm9yIHBvcnRpb25zIG9mIGEgc3VidHJlZSwgd2hpY2ggbWVhbnMgdGhleSBuZWVkIGEKKyAgICAqIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaW4gdGhlIHN0cmVhbSwgbm90IGp1c3QgdGhlaXIKKyAgICAqIG5vZGUgaW4gdGhlIHRyZWUgcm9vdGVkIGF0IHRoYXQgaW5zdHJ1Y3Rpb24uCisgICAgKgorICAgICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSB2aXNpdF9saXN0X2VsZW1lbnRzIC0tIGlmIHRoZSB2aXNpdG9yIGlzCisgICAgKiBub3QgY2FsbGVkIGJ5IGl0LCBub3RoaW5nIGdvb2Qgd2lsbCBoYXBwZW4uCisgICAgKi8KKyAgIGNsYXNzIGlyX2luc3RydWN0aW9uICpiYXNlX2lyOworCisgICAvKioKKyAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBvbiBlbnRyeSB0byBlYWNoIG5vZGUgdmlzaXRlZC4KKyAgICAqCisgICAgKiBcd2FybmluZworICAgICogVmlzaXRvciBjbGFzc2VzIGRlcml2ZWQgZnJvbSBcYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciBcYiBtYXkgXGIgbm90CisgICAgKiBpbnZva2UgdGhpcyBmdW5jdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBjYXVzZSB0aGUKKyAgICAqIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgb24gZXZlcnkgbm9kZSB0eXBlIGV4ZWNwdCBvbmUuCisgICAgKi8KKyAgIHZvaWQgKCpjYWxsYmFjaykoY2xhc3MgaXJfaW5zdHJ1Y3Rpb24gKmlyLCB2b2lkICpkYXRhKTsKKworICAgLyoqCisgICAgKiBFeHRyYSBkYXRhIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIHBlci1ub2RlIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgKi8KKyAgIHZvaWQgKmRhdGE7CisKKyAgIC8qKgorICAgICogQ3VycmVudGx5IGluIHRoZSBMSFMgb2YgYW4gYXNzaWdubWVudD8KKyAgICAqCisgICAgKiBUaGlzIGlzIHNldCBhbmQgY2xlYXJlZCBieSB0aGUgXGMgaXJfYXNzaWdubWVudDo6YWNjZXB0IG1ldGhvZC4KKyAgICAqLworICAgYm9vbCBpbl9hc3NpZ25lZTsKK307CisKK3ZvaWQgdmlzaXRfdHJlZShpcl9pbnN0cnVjdGlvbiAqaXIsCisJCXZvaWQgKCpjYWxsYmFjaykoY2xhc3MgaXJfaW5zdHJ1Y3Rpb24gKmlyLCB2b2lkICpkYXRhKSwKKwkJdm9pZCAqZGF0YSk7CisKK2lyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xpc3RfZWxlbWVudHMoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYsIGV4ZWNfbGlzdCAqbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGF0ZW1lbnRfbGlzdCA9IHRydWUpOworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBJUl9ISUVSQVJDSElDQUxfVklTSVRPUl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2h2X2FjY2VwdC5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2h2X2FjY2VwdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZjcwZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfaHZfYWNjZXB0LmNwcApAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpci5oIgorCisvKioKKyAqIFxmaWxlIGlyX2h2X2FjY2VwdC5jcHAKKyAqIEltcGxlbWVudGF0aW9ucyBvZiBhbGwgaGllcmFyY2hpY2FsIHZpc2l0b3IgYWNjZXB0IG1ldGhvZHMgZm9yIElSCisgKiBpbnN0cnVjdGlvbnMuCisgKi8KKworLyoqCisgKiBQcm9jZXNzIGEgbGlzdCBvZiBub2RlcyB1c2luZyBhIGhpZXJhcmNoaWNhbCB2aXN0b3IuCisgKgorICogSWYgc3RhdGVtZW50X2xpc3QgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGlzIGlzIGEgbGlzdCBvZiBzdGF0ZW1lbnRzLCBzbworICogdi0+YmFzZV9pciB3aWxsIGJlIHNldCB0byBwb2ludCB0byBlYWNoIHN0YXRlbWVudCBqdXN0IGJlZm9yZSBpdGVyYXRpbmcKKyAqIG92ZXIgaXQsIGFuZCByZXN0b3JlZCBhZnRlciBpdGVyYXRpb24gaXMgY29tcGxldGUuICBJZiBzdGF0ZW1lbnRfbGlzdCBpcworICogZmFsc2UsIHRoaXMgaXMgYSBsaXN0IHRoYXQgYXBwZWFycyBpbnNpZGUgYSBzdGF0ZW1lbnQgKGUuZy4gYSBwYXJhbWV0ZXIKKyAqIGxpc3QpLCBzbyB2LT5iYXNlX2lyIHdpbGwgYmUgbGVmdCBhbG9uZS4KKyAqCisgKiBcd2FybmluZworICogVGhpcyBmdW5jdGlvbiB3aWxsIG9wZXJhdGUgY29ycmVjdGx5IGlmIGEgbm9kZSBiZWluZyBwcm9jZXNzZWQgaXMgcmVtb3ZlZAorICogZnJvbSB0aGUgbGlzdC4gIEhvd2V2ZXIsIGlmIG5vZGVzIGFyZSBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciB0aGUgbm9kZSBiZWluZworICogcHJvY2Vzc2VkLCBzb21lIG9mIHRoZSBhZGRlZCBub2RlcyBtYXkgbm90IGJlIHByb2Nlc3NlZC4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK3Zpc2l0X2xpc3RfZWxlbWVudHMoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYsIGV4ZWNfbGlzdCAqbCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGF0ZW1lbnRfbGlzdCkKK3sKKyAgIGlyX2luc3RydWN0aW9uICpwcmV2X2Jhc2VfaXIgPSB2LT5iYXNlX2lyOworCisgICBmb3JlYWNoX2xpc3Rfc2FmZShuLCBsKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKyAgICAgIGlmIChzdGF0ZW1lbnRfbGlzdCkKKyAgICAgICAgIHYtPmJhc2VfaXIgPSBpcjsKKyAgICAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHMgPSBpci0+YWNjZXB0KHYpOworCisgICAgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKwkgcmV0dXJuIHM7CisgICB9CisgICBpZiAoc3RhdGVtZW50X2xpc3QpCisgICAgICB2LT5iYXNlX2lyID0gcHJldl9iYXNlX2lyOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZTo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgcmV0dXJuIHYtPnZpc2l0KHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92YXJpYWJsZTo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgcmV0dXJuIHYtPnZpc2l0KHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9sb29wOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICBpcl92aXNpdG9yX3N0YXR1cyBzID0gdi0+dmlzaXRfZW50ZXIodGhpcyk7CisKKyAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorICAgICAgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKworICAgcyA9IHZpc2l0X2xpc3RfZWxlbWVudHModiwgJnRoaXMtPmJvZHlfaW5zdHJ1Y3Rpb25zKTsKKyAgIGlmIChzID09IHZpc2l0X3N0b3ApCisgICAgICByZXR1cm4gczsKKworICAgcmV0dXJuIHYtPnZpc2l0X2xlYXZlKHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9sb29wX2p1bXA6OmFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqdikKK3sKKyAgIHJldHVybiB2LT52aXNpdCh0aGlzKTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfZnVuY3Rpb25fc2lnbmF0dXJlOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICBpcl92aXNpdG9yX3N0YXR1cyBzID0gdi0+dmlzaXRfZW50ZXIodGhpcyk7CisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgIHMgPSB2aXNpdF9saXN0X2VsZW1lbnRzKHYsICZ0aGlzLT5wYXJhbWV0ZXJzKTsKKyAgIGlmIChzID09IHZpc2l0X3N0b3ApCisgICAgICByZXR1cm4gczsKKworICAgcyA9IHZpc2l0X2xpc3RfZWxlbWVudHModiwgJnRoaXMtPmJvZHkpOworICAgcmV0dXJuIChzID09IHZpc2l0X3N0b3ApID8gcyA6IHYtPnZpc2l0X2xlYXZlKHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9mdW5jdGlvbjo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgaXJfdmlzaXRvcl9zdGF0dXMgcyA9IHYtPnZpc2l0X2VudGVyKHRoaXMpOworICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisgICAgICByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworCisgICBzID0gdmlzaXRfbGlzdF9lbGVtZW50cyh2LCAmdGhpcy0+c2lnbmF0dXJlcywgZmFsc2UpOworICAgcmV0dXJuIChzID09IHZpc2l0X3N0b3ApID8gcyA6IHYtPnZpc2l0X2xlYXZlKHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9leHByZXNzaW9uOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICBpcl92aXNpdG9yX3N0YXR1cyBzID0gdi0+dmlzaXRfZW50ZXIodGhpcyk7CisKKyAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorICAgICAgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPmdldF9udW1fb3BlcmFuZHMoKTsgaSsrKSB7CisgICAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhbmRzW2ldLT5hY2NlcHQodikpIHsKKyAgICAgIGNhc2UgdmlzaXRfY29udGludWU6CisJIGJyZWFrOworCisgICAgICBjYXNlIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OgorCSAvLyBJIHdpc2ggZm9yIEphdmEncyBsYWJlbGVkIGJyZWFrLXN0YXRlbWVudCBoZXJlLgorCSBnb3RvIGRvbmU7CisKKyAgICAgIGNhc2UgdmlzaXRfc3RvcDoKKwkgcmV0dXJuIHM7CisgICAgICB9CisgICB9CisKK2RvbmU6CisgICByZXR1cm4gdi0+dmlzaXRfbGVhdmUodGhpcyk7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl90ZXh0dXJlOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICBpcl92aXNpdG9yX3N0YXR1cyBzID0gdi0+dmlzaXRfZW50ZXIodGhpcyk7CisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgIHMgPSB0aGlzLT5zYW1wbGVyLT5hY2NlcHQodik7CisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgIGlmICh0aGlzLT5jb29yZGluYXRlKSB7CisgICAgICBzID0gdGhpcy0+Y29vcmRpbmF0ZS0+YWNjZXB0KHYpOworICAgICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisJIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisgICB9CisKKyAgIGlmICh0aGlzLT5wcm9qZWN0b3IpIHsKKyAgICAgIHMgPSB0aGlzLT5wcm9qZWN0b3ItPmFjY2VwdCh2KTsKKyAgICAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorCSByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworICAgfQorCisgICBpZiAodGhpcy0+c2hhZG93X2NvbXBhcml0b3IpIHsKKyAgICAgIHMgPSB0aGlzLT5zaGFkb3dfY29tcGFyaXRvci0+YWNjZXB0KHYpOworICAgICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisJIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisgICB9CisKKyAgIGlmICh0aGlzLT5vZmZzZXQpIHsKKyAgICAgIHMgPSB0aGlzLT5vZmZzZXQtPmFjY2VwdCh2KTsKKyAgICAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorCSByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworICAgfQorCisgICBzd2l0Y2ggKHRoaXMtPm9wKSB7CisgICBjYXNlIGlyX3RleDoKKyAgIGNhc2UgaXJfbG9kOgorICAgY2FzZSBpcl9xdWVyeV9sZXZlbHM6CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhiOgorICAgICAgcyA9IHRoaXMtPmxvZF9pbmZvLmJpYXMtPmFjY2VwdCh2KTsKKyAgICAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorCSByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4bDoKKyAgIGNhc2UgaXJfdHhmOgorICAgY2FzZSBpcl90eHM6CisgICAgICBzID0gdGhpcy0+bG9kX2luZm8ubG9kLT5hY2NlcHQodik7CisgICAgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKwkgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGZfbXM6CisgICAgICBzID0gdGhpcy0+bG9kX2luZm8uc2FtcGxlX2luZGV4LT5hY2NlcHQodik7CisgICAgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhkOgorICAgICAgcyA9IHRoaXMtPmxvZF9pbmZvLmdyYWQuZFBkeC0+YWNjZXB0KHYpOworICAgICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisJIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgICAgIHMgPSB0aGlzLT5sb2RfaW5mby5ncmFkLmRQZHktPmFjY2VwdCh2KTsKKyAgICAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorCSByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3RnNDoKKyAgICAgIHMgPSB0aGlzLT5sb2RfaW5mby5jb21wb25lbnQtPmFjY2VwdCh2KTsKKyAgICAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorICAgICAgICAgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKyAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gKHMgPT0gdmlzaXRfc3RvcCkgPyBzIDogdi0+dmlzaXRfbGVhdmUodGhpcyk7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3N3aXp6bGU6OmFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqdikKK3sKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHMgPSB2LT52aXNpdF9lbnRlcih0aGlzKTsKKyAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorICAgICAgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKworICAgcyA9IHRoaXMtPnZhbC0+YWNjZXB0KHYpOworICAgcmV0dXJuIChzID09IHZpc2l0X3N0b3ApID8gcyA6IHYtPnZpc2l0X2xlYXZlKHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9kZXJlZmVyZW5jZV92YXJpYWJsZTo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgcmV0dXJuIHYtPnZpc2l0KHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9kZXJlZmVyZW5jZV9hcnJheTo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgaXJfdmlzaXRvcl9zdGF0dXMgcyA9IHYtPnZpc2l0X2VudGVyKHRoaXMpOworICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisgICAgICByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworCisgICAvKiBUaGUgYXJyYXkgaW5kZXggaXMgbm90IHRoZSB0YXJnZXQgb2YgdGhlIGFzc2lnbm1lbnQsIHNvIGNsZWFyIHRoZQorICAgICogJ2luX2Fzc2lnbmVlJyBmbGFnLiAgUmVzdG9yZSBpdCBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgYXJyYXkgaW5kZXguCisgICAgKi8KKyAgIGNvbnN0IGJvb2wgd2FzX2luX2Fzc2lnbmVlID0gdi0+aW5fYXNzaWduZWU7CisgICB2LT5pbl9hc3NpZ25lZSA9IGZhbHNlOworICAgcyA9IHRoaXMtPmFycmF5X2luZGV4LT5hY2NlcHQodik7CisgICB2LT5pbl9hc3NpZ25lZSA9IHdhc19pbl9hc3NpZ25lZTsKKworICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisgICAgICByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworCisgICBzID0gdGhpcy0+YXJyYXktPmFjY2VwdCh2KTsKKyAgIHJldHVybiAocyA9PSB2aXNpdF9zdG9wKSA/IHMgOiB2LT52aXNpdF9sZWF2ZSh0aGlzKTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfZGVyZWZlcmVuY2VfcmVjb3JkOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICBpcl92aXNpdG9yX3N0YXR1cyBzID0gdi0+dmlzaXRfZW50ZXIodGhpcyk7CisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgIHMgPSB0aGlzLT5yZWNvcmQtPmFjY2VwdCh2KTsKKyAgIHJldHVybiAocyA9PSB2aXNpdF9zdG9wKSA/IHMgOiB2LT52aXNpdF9sZWF2ZSh0aGlzKTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfYXNzaWdubWVudDo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgaXJfdmlzaXRvcl9zdGF0dXMgcyA9IHYtPnZpc2l0X2VudGVyKHRoaXMpOworICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisgICAgICByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworCisgICB2LT5pbl9hc3NpZ25lZSA9IHRydWU7CisgICBzID0gdGhpcy0+bGhzLT5hY2NlcHQodik7CisgICB2LT5pbl9hc3NpZ25lZSA9IGZhbHNlOworICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisgICAgICByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworCisgICBzID0gdGhpcy0+cmhzLT5hY2NlcHQodik7CisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgIGlmICh0aGlzLT5jb25kaXRpb24pCisgICAgICBzID0gdGhpcy0+Y29uZGl0aW9uLT5hY2NlcHQodik7CisKKyAgIHJldHVybiAocyA9PSB2aXNpdF9zdG9wKSA/IHMgOiB2LT52aXNpdF9sZWF2ZSh0aGlzKTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29uc3RhbnQ6OmFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqdikKK3sKKyAgIHJldHVybiB2LT52aXNpdCh0aGlzKTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfY2FsbDo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgaXJfdmlzaXRvcl9zdGF0dXMgcyA9IHYtPnZpc2l0X2VudGVyKHRoaXMpOworICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisgICAgICByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworCisgICBpZiAodGhpcy0+cmV0dXJuX2RlcmVmICE9IE5VTEwpIHsKKyAgICAgIHYtPmluX2Fzc2lnbmVlID0gdHJ1ZTsKKyAgICAgIHMgPSB0aGlzLT5yZXR1cm5fZGVyZWYtPmFjY2VwdCh2KTsKKyAgICAgIHYtPmluX2Fzc2lnbmVlID0gZmFsc2U7CisgICAgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKwkgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKyAgIH0KKworICAgcyA9IHZpc2l0X2xpc3RfZWxlbWVudHModiwgJnRoaXMtPmFjdHVhbF9wYXJhbWV0ZXJzLCBmYWxzZSk7CisgICBpZiAocyA9PSB2aXNpdF9zdG9wKQorICAgICAgcmV0dXJuIHM7CisKKyAgIHJldHVybiB2LT52aXNpdF9sZWF2ZSh0aGlzKTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfcmV0dXJuOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICBpcl92aXNpdG9yX3N0YXR1cyBzID0gdi0+dmlzaXRfZW50ZXIodGhpcyk7CisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgIGlyX3J2YWx1ZSAqdmFsID0gdGhpcy0+Z2V0X3ZhbHVlKCk7CisgICBpZiAodmFsKSB7CisgICAgICBzID0gdmFsLT5hY2NlcHQodik7CisgICAgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKwkgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKyAgIH0KKworICAgcmV0dXJuIHYtPnZpc2l0X2xlYXZlKHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9kaXNjYXJkOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICBpcl92aXNpdG9yX3N0YXR1cyBzID0gdi0+dmlzaXRfZW50ZXIodGhpcyk7CisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZSkKKyAgICAgIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisKKyAgIGlmICh0aGlzLT5jb25kaXRpb24gIT0gTlVMTCkgeworICAgICAgcyA9IHRoaXMtPmNvbmRpdGlvbi0+YWNjZXB0KHYpOworICAgICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisJIHJldHVybiAocyA9PSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgPyB2aXNpdF9jb250aW51ZSA6IHM7CisgICB9CisKKyAgIHJldHVybiB2LT52aXNpdF9sZWF2ZSh0aGlzKTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfaWY6OmFjY2VwdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqdikKK3sKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHMgPSB2LT52aXNpdF9lbnRlcih0aGlzKTsKKyAgIGlmIChzICE9IHZpc2l0X2NvbnRpbnVlKQorICAgICAgcmV0dXJuIChzID09IHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50KSA/IHZpc2l0X2NvbnRpbnVlIDogczsKKworICAgcyA9IHRoaXMtPmNvbmRpdGlvbi0+YWNjZXB0KHYpOworICAgaWYgKHMgIT0gdmlzaXRfY29udGludWUpCisgICAgICByZXR1cm4gKHMgPT0gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQpID8gdmlzaXRfY29udGludWUgOiBzOworCisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgeworICAgICAgcyA9IHZpc2l0X2xpc3RfZWxlbWVudHModiwgJnRoaXMtPnRoZW5faW5zdHJ1Y3Rpb25zKTsKKyAgICAgIGlmIChzID09IHZpc2l0X3N0b3ApCisJIHJldHVybiBzOworICAgfQorCisgICBpZiAocyAhPSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCkgeworICAgICAgcyA9IHZpc2l0X2xpc3RfZWxlbWVudHModiwgJnRoaXMtPmVsc2VfaW5zdHJ1Y3Rpb25zKTsKKyAgICAgIGlmIChzID09IHZpc2l0X3N0b3ApCisJIHJldHVybiBzOworICAgfQorCisgICByZXR1cm4gdi0+dmlzaXRfbGVhdmUodGhpcyk7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9lbWl0X3ZlcnRleDo6YWNjZXB0KGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yICp2KQoreworICAgcmV0dXJuIHYtPnZpc2l0KHRoaXMpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9lbmRfcHJpbWl0aXZlOjphY2NlcHQoaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgKnYpCit7CisgICByZXR1cm4gdi0+dmlzaXQodGhpcyk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2ltcG9ydF9wcm90b3R5cGVzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfaW1wb3J0X3Byb3RvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDI5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX2ltcG9ydF9wcm90b3R5cGVzLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaXJfaW1wb3J0X3Byb3RvdHlwZXMuY3BwCisgKiBJbXBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcyBmcm9tIG9uZSBJUiB0cmVlIGludG8gYW5vdGhlci4KKyAqCisgKiBcYXV0aG9yIElhbiBSb21hbmljaworICovCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorCituYW1lc3BhY2UgeworCisvKioKKyAqIFZpc2l0b3IgdXNlZCB0byBpbXBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcworICoKKyAqIE5vcm1hbGx5IHRoZSBcYyBjbG9uZSBtZXRob2Qgb2YgZWl0aGVyIFxjIGlyX2Z1bmN0aW9uIG9yCisgKiBcYyBpcl9mdW5jdGlvbl9zaWduYXR1cmUgY291bGQgYmUgdXNlZC4gIEhvd2V2ZXIsIHdlIGRvbid0IHdhbnQgYSBjb21wbGV0ZQorICogY2xvbmUgb2YgdGhlIFxjIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZS4gIFdlIHdhbnQgZXZlcnl0aGluZyBcYiBleGNlcHQgdGhlCisgKiBib2R5IG9mIHRoZSBmdW5jdGlvbi4KKyAqLworY2xhc3MgaW1wb3J0X3Byb3RvdHlwZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIC8qKgorICAgICovCisgICBpbXBvcnRfcHJvdG90eXBlX3Zpc2l0b3IoZXhlY19saXN0ICpsaXN0LCBnbHNsX3N5bWJvbF90YWJsZSAqc3ltYm9scywKKwkJCSAgICB2b2lkICptZW1fY3R4KQorICAgeworICAgICAgdGhpcy0+bWVtX2N0eCA9IG1lbV9jdHg7CisgICAgICB0aGlzLT5saXN0ID0gbGlzdDsKKyAgICAgIHRoaXMtPnN5bWJvbHMgPSBzeW1ib2xzOworICAgICAgdGhpcy0+ZnVuY3Rpb24gPSBOVUxMOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uICppcikKKyAgIHsKKyAgICAgIGFzc2VydCh0aGlzLT5mdW5jdGlvbiA9PSBOVUxMKTsKKworICAgICAgdGhpcy0+ZnVuY3Rpb24gPSB0aGlzLT5zeW1ib2xzLT5nZXRfZnVuY3Rpb24oaXItPm5hbWUpOworICAgICAgaWYgKCF0aGlzLT5mdW5jdGlvbikgeworCSB0aGlzLT5mdW5jdGlvbiA9IG5ldyh0aGlzLT5tZW1fY3R4KSBpcl9mdW5jdGlvbihpci0+bmFtZSk7CisKKwkgbGlzdC0+cHVzaF90YWlsKHRoaXMtPmZ1bmN0aW9uKTsKKworCSAvKiBBZGQgdGhlIG5ldyBmdW5jdGlvbiB0byB0aGUgc3ltYm9sIHRhYmxlLgorCSAgKi8KKwkgdGhpcy0+c3ltYm9scy0+YWRkX2Z1bmN0aW9uKHRoaXMtPmZ1bmN0aW9uKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9mdW5jdGlvbiAqaXIpCisgICB7CisgICAgICAodm9pZCkgaXI7CisgICAgICBhc3NlcnQodGhpcy0+ZnVuY3Rpb24gIT0gTlVMTCk7CisKKyAgICAgIHRoaXMtPmZ1bmN0aW9uID0gTlVMTDsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICppcikKKyAgIHsKKyAgICAgIGFzc2VydCh0aGlzLT5mdW5jdGlvbiAhPSBOVUxMKTsKKworICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpjb3B5ID0gaXItPmNsb25lX3Byb3RvdHlwZShtZW1fY3R4LCBOVUxMKTsKKworICAgICAgdGhpcy0+ZnVuY3Rpb24tPmFkZF9zaWduYXR1cmUoY29weSk7CisKKyAgICAgIC8qIERvIG5vdCBwcm9jZXNzIGNoaWxkIG5vZGVzIG9mIHRoZSBpcl9mdW5jdGlvbl9zaWduYXR1cmUuICBUaGVyZSBjYW4KKyAgICAgICAqIG5ldmVyIGJlIGFueSBub2RlcyBpbnNpZGUgdGhlIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSB0aGF0IHdlIGNhcmUKKyAgICAgICAqIGFib3V0LiAgSW5zdGVhZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHNpYmxpbmcuCisgICAgICAgKi8KKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKKyAgIH0KKworcHJpdmF0ZToKKyAgIGV4ZWNfbGlzdCAqbGlzdDsKKyAgIGlyX2Z1bmN0aW9uICpmdW5jdGlvbjsKKyAgIGdsc2xfc3ltYm9sX3RhYmxlICpzeW1ib2xzOworICAgdm9pZCAqbWVtX2N0eDsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCisvKioKKyAqIEltcG9ydCBmdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gb25lIElSIHRyZWUgaW50byBhbm90aGVyCisgKgorICogXHBhcmFtIHNvdXJjZSAgIFNvdXJjZSBpbnN0cnVjdGlvbiBzdHJlYW0gY29udGFpbmluZyBmdW5jdGlvbnMgd2hvc2UKKyAqICAgICAgICAgICAgICAgICBwcm90b3R5cGVzIGFyZSB0byBiZSBpbXBvcnRlZAorICogXHBhcmFtIGRlc3QgICAgIERlc3RpbmF0aW9uIGluc3RydWN0aW9uIHN0cmVhbSB3aGVyZSBuZXcgXGMgaXJfZnVuY3Rpb24gYW5kCisgKiAgICAgICAgICAgICAgICAgXGMgaXJfZnVuY3Rpb25fc2lnbmF0dXJlIG5vZGVzIHdpbGwgYmUgc3RvcmVkCisgKiBccGFyYW0gc3ltYm9scyAgU3ltYm9sIHRhYmxlIHdoZXJlIG5ldyBmdW5jdGlvbnMgd2lsbCBiZSBzdG9yZWQKKyAqIFxwYXJhbSBtZW1fY3R4ICByYWxsb2MgbWVtb3J5IGNvbnRleHQgdXNlZCBmb3IgbmV3IGFsbG9jYXRpb25zCisgKi8KK3ZvaWQKK2ltcG9ydF9wcm90b3R5cGVzKGNvbnN0IGV4ZWNfbGlzdCAqc291cmNlLCBleGVjX2xpc3QgKmRlc3QsCisJCSAgZ2xzbF9zeW1ib2xfdGFibGUgKnN5bWJvbHMsIHZvaWQgKm1lbV9jdHgpCit7CisgICBpbXBvcnRfcHJvdG90eXBlX3Zpc2l0b3IgdihkZXN0LCBzeW1ib2xzLCBtZW1fY3R4KTsKKworICAgLyogTWFraW5nIHNvdXJjZSBiZSBjb25zdCBpcyBqdXN0IGV4dHJhIGRvY3VtZW50YXRpb24uCisgICAgKi8KKyAgIHYucnVuKGNvbnN0X2Nhc3Q8ZXhlY19saXN0ICo+KHNvdXJjZSkpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9wcmludF92aXNpdG9yLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfcHJpbnRfdmlzaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyODhkYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfcHJpbnRfdmlzaXRvci5jcHAKQEAgLTAsMCArMSw1NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRzogQURECisjaW5jbHVkZSAiaXJfcHJpbnRfdmlzaXRvci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJnbHNsX3BhcnNlcl9leHRyYXMuaCIKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorCitzdGF0aWMgdm9pZCBwcmludF90eXBlKEZJTEUgKmYsIGNvbnN0IGdsc2xfdHlwZSAqdCk7CisKK3ZvaWQKK2lyX2luc3RydWN0aW9uOjpwcmludCh2b2lkKSBjb25zdAoreworICAgdGhpcy0+ZnByaW50KHN0ZG91dCk7Cit9CisKK3ZvaWQKK2lyX2luc3RydWN0aW9uOjpmcHJpbnQoRklMRSAqZikgY29uc3QKK3sKKyAgIGlyX2luc3RydWN0aW9uICpkZWNvbnN0ZWQgPSBjb25zdF9jYXN0PGlyX2luc3RydWN0aW9uICo+KHRoaXMpOworCisgICBpcl9wcmludF92aXNpdG9yIHYoZik7CisgICBkZWNvbnN0ZWQtPmFjY2VwdCgmdik7Cit9CisKK2V4dGVybiAiQyIgewordm9pZAorX21lc2FfcHJpbnRfaXIoRklMRSAqZiwgZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisJICAgICAgIHN0cnVjdCBfbWVzYV9nbHNsX3BhcnNlX3N0YXRlICpzdGF0ZSkKK3sKKyAgIGlmIChzdGF0ZSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHN0YXRlLT5udW1fdXNlcl9zdHJ1Y3R1cmVzOyBpKyspIHsKKwkgY29uc3QgZ2xzbF90eXBlICpjb25zdCBzID0gc3RhdGUtPnVzZXJfc3RydWN0dXJlc1tpXTsKKworCSBmcHJpbnRmKGYsICIoc3RydWN0dXJlICglcykgKCVzQCVwKSAoJXUpIChcbiIsCisgICAgICAgICAgICAgICAgIHMtPm5hbWUsIHMtPm5hbWUsICh2b2lkICopIHMsIHMtPmxlbmd0aCk7CisKKwkgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHMtPmxlbmd0aDsgaisrKSB7CisJICAgIGZwcmludGYoZiwgIlx0KCgiKTsKKwkgICAgcHJpbnRfdHlwZShmLCBzLT5maWVsZHMuc3RydWN0dXJlW2pdLnR5cGUpOworCSAgICBmcHJpbnRmKGYsICIpKCVzKSlcbiIsIHMtPmZpZWxkcy5zdHJ1Y3R1cmVbal0ubmFtZSk7CisJIH0KKworCSBmcHJpbnRmKGYsICIpXG4iKTsKKyAgICAgIH0KKyAgIH0KKworICAgZnByaW50ZihmLCAiKFxuIik7CisgICBmb3JlYWNoX2xpc3QobiwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKyAgICAgIGlyLT5mcHJpbnQoZik7CisgICAgICBpZiAoaXItPmlyX3R5cGUgIT0gaXJfdHlwZV9mdW5jdGlvbikKKwkgZnByaW50ZihmLCAiXG4iKTsKKyAgIH0KKyAgIGZwcmludGYoZiwgIlxuKSIpOworfQorCit9IC8qIGV4dGVybiAiQyIgKi8KKworaXJfcHJpbnRfdmlzaXRvcjo6aXJfcHJpbnRfdmlzaXRvcihGSUxFICpmKQorICAgOiBmKGYpCit7CisgICBpbmRlbnRhdGlvbiA9IDA7CisgICBwcmludGFibGVfbmFtZXMgPQorICAgICAgaGFzaF90YWJsZV9jdG9yKDMyLCBoYXNoX3RhYmxlX3BvaW50ZXJfaGFzaCwgaGFzaF90YWJsZV9wb2ludGVyX2NvbXBhcmUpOworICAgc3ltYm9scyA9IF9tZXNhX3N5bWJvbF90YWJsZV9jdG9yKCk7CisgICBtZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7Cit9CisKK2lyX3ByaW50X3Zpc2l0b3I6On5pcl9wcmludF92aXNpdG9yKCkKK3sKKyAgIGhhc2hfdGFibGVfZHRvcihwcmludGFibGVfbmFtZXMpOworICAgX21lc2Ffc3ltYm9sX3RhYmxlX2R0b3Ioc3ltYm9scyk7CisgICByYWxsb2NfZnJlZShtZW1fY3R4KTsKK30KKwordm9pZCBpcl9wcmludF92aXNpdG9yOjppbmRlbnQodm9pZCkKK3sKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb247IGkrKykKKyAgICAgIGZwcmludGYoZiwgIiAgIik7Cit9CisKK2NvbnN0IGNoYXIgKgoraXJfcHJpbnRfdmlzaXRvcjo6dW5pcXVlX25hbWUoaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIC8qIHZhci0+bmFtZSBjYW4gYmUgTlVMTCBpbiBmdW5jdGlvbiBwcm90b3R5cGVzIHdoZW4gYSB0eXBlIGlzIGdpdmVuIGZvciBhCisgICAgKiBwYXJhbWV0ZXIgYnV0IG5vIG5hbWUgaXMgZ2l2ZW4uICBJbiB0aGF0IGNhc2UsIGp1c3QgcmV0dXJuIGFuIGVtcHR5CisgICAgKiBzdHJpbmcuICBEb24ndCB3b3JyeSBhYm91dCB0cmFja2luZyB0aGUgZ2VuZXJhdGVkIG5hbWUgaW4gdGhlIHByaW50YWJsZQorICAgICogbmFtZXMgaGFzaCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgc2NvcGUgd2hlcmUgaXQgY2FuIGV2ZXIgYXBwZWFyLgorICAgICovCisgICBpZiAodmFyLT5uYW1lID09IE5VTEwpIHsKKyAgICAgIHN0YXRpYyB1bnNpZ25lZCBhcmcgPSAxOworICAgICAgcmV0dXJuIHJhbGxvY19hc3ByaW50Zih0aGlzLT5tZW1fY3R4LCAicGFyYW1ldGVyQCV1IiwgYXJnKyspOworICAgfQorCisgICAvKiBEbyB3ZSBhbHJlYWR5IGhhdmUgYSBuYW1lIGZvciB0aGlzIHZhcmlhYmxlPyAqLworICAgY29uc3QgY2hhciAqbmFtZSA9IChjb25zdCBjaGFyICopIGhhc2hfdGFibGVfZmluZCh0aGlzLT5wcmludGFibGVfbmFtZXMsIHZhcik7CisgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgcmV0dXJuIG5hbWU7CisKKyAgIC8qIElmIHRoZXJlJ3Mgbm8gY29uZmxpY3QsIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCBuYW1lICovCisgICBpZiAoX21lc2Ffc3ltYm9sX3RhYmxlX2ZpbmRfc3ltYm9sKHRoaXMtPnN5bWJvbHMsIC0xLCB2YXItPm5hbWUpID09IE5VTEwpIHsKKyAgICAgIG5hbWUgPSB2YXItPm5hbWU7CisgICB9IGVsc2UgeworICAgICAgc3RhdGljIHVuc2lnbmVkIGkgPSAxOworICAgICAgbmFtZSA9IHJhbGxvY19hc3ByaW50Zih0aGlzLT5tZW1fY3R4LCAiJXNAJXUiLCB2YXItPm5hbWUsICsraSk7CisgICB9CisgICBoYXNoX3RhYmxlX2luc2VydCh0aGlzLT5wcmludGFibGVfbmFtZXMsICh2b2lkICopIG5hbWUsIHZhcik7CisgICBfbWVzYV9zeW1ib2xfdGFibGVfYWRkX3N5bWJvbCh0aGlzLT5zeW1ib2xzLCAtMSwgbmFtZSwgdmFyKTsKKyAgIHJldHVybiBuYW1lOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdHlwZShGSUxFICpmLCBjb25zdCBnbHNsX3R5cGUgKnQpCit7CisgICBpZiAodC0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9BUlJBWSkgeworICAgICAgZnByaW50ZihmLCAiKGFycmF5ICIpOworICAgICAgcHJpbnRfdHlwZShmLCB0LT5maWVsZHMuYXJyYXkpOworICAgICAgZnByaW50ZihmLCAiICV1KSIsIHQtPmxlbmd0aCk7CisgICB9IGVsc2UgaWYgKCh0LT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1NUUlVDVCkKKwkgICAgICAmJiAoc3RybmNtcCgiZ2xfIiwgdC0+bmFtZSwgMykgIT0gMCkpIHsKKyAgICAgIGZwcmludGYoZiwgIiVzQCVwIiwgdC0+bmFtZSwgKHZvaWQgKikgdCk7CisgICB9IGVsc2UgeworICAgICAgZnByaW50ZihmLCAiJXMiLCB0LT5uYW1lKTsKKyAgIH0KK30KKwordm9pZCBpcl9wcmludF92aXNpdG9yOjp2aXNpdChpcl9ydmFsdWUgKikKK3sKKyAgIGZwcmludGYoZiwgImVycm9yIik7Cit9CisKK3ZvaWQgaXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfdmFyaWFibGUgKmlyKQoreworICAgZnByaW50ZihmLCAiKGRlY2xhcmUgIik7CisKKyAgIGNvbnN0IGNoYXIgKmNvbnN0IGNlbnQgPSAoaXItPmRhdGEuY2VudHJvaWQpID8gImNlbnRyb2lkICIgOiAiIjsKKyAgIGNvbnN0IGNoYXIgKmNvbnN0IHNhbXAgPSAoaXItPmRhdGEuc2FtcGxlKSA/ICJzYW1wbGUgIiA6ICIiOworICAgY29uc3QgY2hhciAqY29uc3QgaW52ID0gKGlyLT5kYXRhLmludmFyaWFudCkgPyAiaW52YXJpYW50ICIgOiAiIjsKKyAgIGNvbnN0IGNoYXIgKmNvbnN0IG1vZGVbXSA9IHsgIiIsICJ1bmlmb3JtICIsICJzaGFkZXJfaW4gIiwgInNoYWRlcl9vdXQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluICIsICJvdXQgIiwgImlub3V0ICIsCisJCQkgICAgICAgICJjb25zdF9pbiAiLCAic3lzICIsICJ0ZW1wb3JhcnkgIiB9OworICAgU1RBVElDX0FTU0VSVChBUlJBWV9TSVpFKG1vZGUpID09IGlyX3Zhcl9tb2RlX2NvdW50KTsKKyAgIGNvbnN0IGNoYXIgKmNvbnN0IGludGVycFtdID0geyAiIiwgInNtb290aCIsICJmbGF0IiwgIm5vcGVyc3BlY3RpdmUiIH07CisgICBTVEFUSUNfQVNTRVJUKEFSUkFZX1NJWkUoaW50ZXJwKSA9PSBJTlRFUlBfUVVBTElGSUVSX0NPVU5UKTsKKworICAgZnByaW50ZihmLCAiKCVzJXMlcyVzJXMpICIsCisJICBjZW50LCBzYW1wLCBpbnYsIG1vZGVbaXItPmRhdGEubW9kZV0sIGludGVycFtpci0+ZGF0YS5pbnRlcnBvbGF0aW9uXSk7CisKKyAgIHByaW50X3R5cGUoZiwgaXItPnR5cGUpOworICAgZnByaW50ZihmLCAiICVzKSIsIHVuaXF1ZV9uYW1lKGlyKSk7Cit9CisKKwordm9pZCBpcl9wcmludF92aXNpdG9yOjp2aXNpdChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgX21lc2Ffc3ltYm9sX3RhYmxlX3B1c2hfc2NvcGUoc3ltYm9scyk7CisgICBmcHJpbnRmKGYsICIoc2lnbmF0dXJlICIpOworICAgaW5kZW50YXRpb24rKzsKKworICAgcHJpbnRfdHlwZShmLCBpci0+cmV0dXJuX3R5cGUpOworICAgZnByaW50ZihmLCAiXG4iKTsKKyAgIGluZGVudCgpOworCisgICBmcHJpbnRmKGYsICIocGFyYW1ldGVyc1xuIik7CisgICBpbmRlbnRhdGlvbisrOworCisgICBmb3JlYWNoX2xpc3QobiwgJmlyLT5wYXJhbWV0ZXJzKSB7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgaW5zdCA9IChpcl92YXJpYWJsZSAqKSBuOworCisgICAgICBpbmRlbnQoKTsKKyAgICAgIGluc3QtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICB9CisgICBpbmRlbnRhdGlvbi0tOworCisgICBpbmRlbnQoKTsKKyAgIGZwcmludGYoZiwgIilcbiIpOworCisgICBpbmRlbnQoKTsKKworICAgZnByaW50ZihmLCAiKFxuIik7CisgICBpbmRlbnRhdGlvbisrOworCisgICBmb3JlYWNoX2xpc3QobiwgJmlyLT5ib2R5KSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgaW5zdCA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworCisgICAgICBpbmRlbnQoKTsKKyAgICAgIGluc3QtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICB9CisgICBpbmRlbnRhdGlvbi0tOworICAgaW5kZW50KCk7CisgICBmcHJpbnRmKGYsICIpKVxuIik7CisgICBpbmRlbnRhdGlvbi0tOworICAgX21lc2Ffc3ltYm9sX3RhYmxlX3BvcF9zY29wZShzeW1ib2xzKTsKK30KKworCit2b2lkIGlyX3ByaW50X3Zpc2l0b3I6OnZpc2l0KGlyX2Z1bmN0aW9uICppcikKK3sKKyAgIGZwcmludGYoZiwgIihmdW5jdGlvbiAlc1xuIiwgaXItPm5hbWUpOworICAgaW5kZW50YXRpb24rKzsKKyAgIGZvcmVhY2hfbGlzdChuLCAmaXItPnNpZ25hdHVyZXMpIHsKKyAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29uc3Qgc2lnID0gKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKSBuOworICAgICAgaW5kZW50KCk7CisgICAgICBzaWctPmFjY2VwdCh0aGlzKTsKKyAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICB9CisgICBpbmRlbnRhdGlvbi0tOworICAgaW5kZW50KCk7CisgICBmcHJpbnRmKGYsICIpXG5cbiIpOworfQorCisKK3ZvaWQgaXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICBmcHJpbnRmKGYsICIoZXhwcmVzc2lvbiAiKTsKKworICAgcHJpbnRfdHlwZShmLCBpci0+dHlwZSk7CisKKyAgIGZwcmludGYoZiwgIiAlcyAiLCBpci0+b3BlcmF0b3Jfc3RyaW5nKCkpOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXItPmdldF9udW1fb3BlcmFuZHMoKTsgaSsrKSB7CisgICAgICBpci0+b3BlcmFuZHNbaV0tPmFjY2VwdCh0aGlzKTsKKyAgIH0KKworICAgZnByaW50ZihmLCAiKSAiKTsKK30KKworCit2b2lkIGlyX3ByaW50X3Zpc2l0b3I6OnZpc2l0KGlyX3RleHR1cmUgKmlyKQoreworICAgZnByaW50ZihmLCAiKCVzICIsIGlyLT5vcGNvZGVfc3RyaW5nKCkpOworCisgICBwcmludF90eXBlKGYsIGlyLT50eXBlKTsKKyAgIGZwcmludGYoZiwgIiAiKTsKKworICAgaXItPnNhbXBsZXItPmFjY2VwdCh0aGlzKTsKKyAgIGZwcmludGYoZiwgIiAiKTsKKworICAgaWYgKGlyLT5vcCAhPSBpcl90eHMgJiYgaXItPm9wICE9IGlyX3F1ZXJ5X2xldmVscykgeworICAgICAgaXItPmNvb3JkaW5hdGUtPmFjY2VwdCh0aGlzKTsKKworICAgICAgZnByaW50ZihmLCAiICIpOworCisgICAgICBpZiAoaXItPm9mZnNldCAhPSBOVUxMKSB7CisJIGlyLT5vZmZzZXQtPmFjY2VwdCh0aGlzKTsKKyAgICAgIH0gZWxzZSB7CisJIGZwcmludGYoZiwgIjAiKTsKKyAgICAgIH0KKworICAgICAgZnByaW50ZihmLCAiICIpOworICAgfQorCisgICBpZiAoaXItPm9wICE9IGlyX3R4ZiAmJiBpci0+b3AgIT0gaXJfdHhmX21zICYmCisgICAgICAgaXItPm9wICE9IGlyX3R4cyAmJiBpci0+b3AgIT0gaXJfdGc0ICYmCisgICAgICAgaXItPm9wICE9IGlyX3F1ZXJ5X2xldmVscykgeworICAgICAgaWYgKGlyLT5wcm9qZWN0b3IpCisJIGlyLT5wcm9qZWN0b3ItPmFjY2VwdCh0aGlzKTsKKyAgICAgIGVsc2UKKwkgZnByaW50ZihmLCAiMSIpOworCisgICAgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKSB7CisJIGZwcmludGYoZiwgIiAiKTsKKwkgaXItPnNoYWRvd19jb21wYXJpdG9yLT5hY2NlcHQodGhpcyk7CisgICAgICB9IGVsc2UgeworCSBmcHJpbnRmKGYsICIgKCkiKTsKKyAgICAgIH0KKyAgIH0KKworICAgZnByaW50ZihmLCAiICIpOworICAgc3dpdGNoIChpci0+b3ApCisgICB7CisgICBjYXNlIGlyX3RleDoKKyAgIGNhc2UgaXJfbG9kOgorICAgY2FzZSBpcl9xdWVyeV9sZXZlbHM6CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhiOgorICAgICAgaXItPmxvZF9pbmZvLmJpYXMtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGw6CisgICBjYXNlIGlyX3R4ZjoKKyAgIGNhc2UgaXJfdHhzOgorICAgICAgaXItPmxvZF9pbmZvLmxvZC0+YWNjZXB0KHRoaXMpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4Zl9tczoKKyAgICAgIGlyLT5sb2RfaW5mby5zYW1wbGVfaW5kZXgtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6CisgICAgICBmcHJpbnRmKGYsICIoIik7CisgICAgICBpci0+bG9kX2luZm8uZ3JhZC5kUGR4LT5hY2NlcHQodGhpcyk7CisgICAgICBmcHJpbnRmKGYsICIgIik7CisgICAgICBpci0+bG9kX2luZm8uZ3JhZC5kUGR5LT5hY2NlcHQodGhpcyk7CisgICAgICBmcHJpbnRmKGYsICIpIik7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdGc0OgorICAgICAgaXItPmxvZF9pbmZvLmNvbXBvbmVudC0+YWNjZXB0KHRoaXMpOworICAgICAgYnJlYWs7CisgICB9OworICAgZnByaW50ZihmLCAiKSIpOworfQorCisKK3ZvaWQgaXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfc3dpenpsZSAqaXIpCit7CisgICBjb25zdCB1bnNpZ25lZCBzd2l6WzRdID0geworICAgICAgaXItPm1hc2sueCwKKyAgICAgIGlyLT5tYXNrLnksCisgICAgICBpci0+bWFzay56LAorICAgICAgaXItPm1hc2sudywKKyAgIH07CisKKyAgIGZwcmludGYoZiwgIihzd2l6ICIpOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlyLT5tYXNrLm51bV9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgIGZwcmludGYoZiwgIiVjIiwgInh5enciW3N3aXpbaV1dKTsKKyAgIH0KKyAgIGZwcmludGYoZiwgIiAiKTsKKyAgIGlyLT52YWwtPmFjY2VwdCh0aGlzKTsKKyAgIGZwcmludGYoZiwgIikiKTsKK30KKworCit2b2lkIGlyX3ByaW50X3Zpc2l0b3I6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBpci0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworICAgZnByaW50ZihmLCAiKHZhcl9yZWYgJXMpICIsIHVuaXF1ZV9uYW1lKHZhcikpOworfQorCisKK3ZvaWQgaXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKQoreworICAgZnByaW50ZihmLCAiKGFycmF5X3JlZiAiKTsKKyAgIGlyLT5hcnJheS0+YWNjZXB0KHRoaXMpOworICAgaXItPmFycmF5X2luZGV4LT5hY2NlcHQodGhpcyk7CisgICBmcHJpbnRmKGYsICIpICIpOworfQorCisKK3ZvaWQgaXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICppcikKK3sKKyAgIGZwcmludGYoZiwgIihyZWNvcmRfcmVmICIpOworICAgaXItPnJlY29yZC0+YWNjZXB0KHRoaXMpOworICAgZnByaW50ZihmLCAiICVzKSAiLCBpci0+ZmllbGQpOworfQorCisKK3ZvaWQgaXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBmcHJpbnRmKGYsICIoYXNzaWduICIpOworCisgICBpZiAoaXItPmNvbmRpdGlvbikKKyAgICAgIGlyLT5jb25kaXRpb24tPmFjY2VwdCh0aGlzKTsKKworICAgY2hhciBtYXNrWzVdOworICAgdW5zaWduZWQgaiA9IDA7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIGlmICgoaXItPndyaXRlX21hc2sgJiAoMSA8PCBpKSkgIT0gMCkgeworCSBtYXNrW2pdID0gInh5enciW2ldOworCSBqKys7CisgICAgICB9CisgICB9CisgICBtYXNrW2pdID0gJ1wwJzsKKworICAgZnByaW50ZihmLCAiICglcykgIiwgbWFzayk7CisKKyAgIGlyLT5saHMtPmFjY2VwdCh0aGlzKTsKKworICAgZnByaW50ZihmLCAiICIpOworCisgICBpci0+cmhzLT5hY2NlcHQodGhpcyk7CisgICBmcHJpbnRmKGYsICIpICIpOworfQorCisKK3ZvaWQgaXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfY29uc3RhbnQgKmlyKQoreworICAgZnByaW50ZihmLCAiKGNvbnN0YW50ICIpOworICAgcHJpbnRfdHlwZShmLCBpci0+dHlwZSk7CisgICBmcHJpbnRmKGYsICIgKCIpOworCisgICBpZiAoaXItPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpci0+dHlwZS0+bGVuZ3RoOyBpKyspCisJIGlyLT5nZXRfYXJyYXlfZWxlbWVudChpKS0+YWNjZXB0KHRoaXMpOworICAgfSBlbHNlIGlmIChpci0+dHlwZS0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIGlyX2NvbnN0YW50ICp2YWx1ZSA9IChpcl9jb25zdGFudCAqKSBpci0+Y29tcG9uZW50cy5nZXRfaGVhZCgpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlyLT50eXBlLT5sZW5ndGg7IGkrKykgeworCSBmcHJpbnRmKGYsICIoJXMgIiwgaXItPnR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSk7CisJIHZhbHVlLT5hY2NlcHQodGhpcyk7CisJIGZwcmludGYoZiwgIikiKTsKKworCSB2YWx1ZSA9IChpcl9jb25zdGFudCAqKSB2YWx1ZS0+bmV4dDsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXItPnR5cGUtPmNvbXBvbmVudHMoKTsgaSsrKSB7CisJIGlmIChpICE9IDApCisJICAgIGZwcmludGYoZiwgIiAiKTsKKwkgc3dpdGNoIChpci0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6ICBmcHJpbnRmKGYsICIldSIsIGlyLT52YWx1ZS51W2ldKTsgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0lOVDogICBmcHJpbnRmKGYsICIlZCIsIGlyLT52YWx1ZS5pW2ldKTsgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorICAgICAgICAgICAgaWYgKGlyLT52YWx1ZS5mW2ldID09IDAuMGYpCisgICAgICAgICAgICAgICAvKiAwLjAgPT0gLTAuMCwgc28gcHJpbnQgd2l0aCAlZiB0byBnZXQgdGhlIHByb3BlciBzaWduLiAqLworICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJS4xZiIsIGlyLT52YWx1ZS5mW2ldKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZhYnMoaXItPnZhbHVlLmZbaV0pIDwgMC4wMDAwMDFmKQorICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJWEiLCBpci0+dmFsdWUuZltpXSk7CisgICAgICAgICAgICBlbHNlIGlmIChmYWJzKGlyLT52YWx1ZS5mW2ldKSA+IDEwMDAwMDAuMGYpCisgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlZSIsIGlyLT52YWx1ZS5mW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVmIiwgaXItPnZhbHVlLmZbaV0pOworICAgICAgICAgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0JPT0w6ICBmcHJpbnRmKGYsICIlZCIsIGlyLT52YWx1ZS5iW2ldKTsgYnJlYWs7CisJIGRlZmF1bHQ6IGFzc2VydCgwKTsKKwkgfQorICAgICAgfQorICAgfQorICAgZnByaW50ZihmLCAiKSkgIik7Cit9CisKKwordm9pZAoraXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfY2FsbCAqaXIpCit7CisgICBmcHJpbnRmKGYsICIoY2FsbCAlcyAiLCBpci0+Y2FsbGVlX25hbWUoKSk7CisgICBpZiAoaXItPnJldHVybl9kZXJlZikKKyAgICAgIGlyLT5yZXR1cm5fZGVyZWYtPmFjY2VwdCh0aGlzKTsKKyAgIGZwcmludGYoZiwgIiAoIik7CisgICBmb3JlYWNoX2xpc3QobiwgJmlyLT5hY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICpjb25zdCBwYXJhbSA9IChpcl9ydmFsdWUgKikgbjsKKworICAgICAgcGFyYW0tPmFjY2VwdCh0aGlzKTsKKyAgIH0KKyAgIGZwcmludGYoZiwgIikpXG4iKTsKK30KKworCit2b2lkCitpcl9wcmludF92aXNpdG9yOjp2aXNpdChpcl9yZXR1cm4gKmlyKQoreworICAgZnByaW50ZihmLCAiKHJldHVybiIpOworCisgICBpcl9ydmFsdWUgKmNvbnN0IHZhbHVlID0gaXItPmdldF92YWx1ZSgpOworICAgaWYgKHZhbHVlKSB7CisgICAgICBmcHJpbnRmKGYsICIgIik7CisgICAgICB2YWx1ZS0+YWNjZXB0KHRoaXMpOworICAgfQorCisgICBmcHJpbnRmKGYsICIpIik7Cit9CisKKwordm9pZAoraXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfZGlzY2FyZCAqaXIpCit7CisgICBmcHJpbnRmKGYsICIoZGlzY2FyZCAiKTsKKworICAgaWYgKGlyLT5jb25kaXRpb24gIT0gTlVMTCkgeworICAgICAgZnByaW50ZihmLCAiICIpOworICAgICAgaXItPmNvbmRpdGlvbi0+YWNjZXB0KHRoaXMpOworICAgfQorCisgICBmcHJpbnRmKGYsICIpIik7Cit9CisKKwordm9pZAoraXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfaWYgKmlyKQoreworICAgZnByaW50ZihmLCAiKGlmICIpOworICAgaXItPmNvbmRpdGlvbi0+YWNjZXB0KHRoaXMpOworCisgICBmcHJpbnRmKGYsICIoXG4iKTsKKyAgIGluZGVudGF0aW9uKys7CisKKyAgIGZvcmVhY2hfbGlzdChuLCAmaXItPnRoZW5faW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgaW5zdCA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworCisgICAgICBpbmRlbnQoKTsKKyAgICAgIGluc3QtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICB9CisKKyAgIGluZGVudGF0aW9uLS07CisgICBpbmRlbnQoKTsKKyAgIGZwcmludGYoZiwgIilcbiIpOworCisgICBpbmRlbnQoKTsKKyAgIGlmICghaXItPmVsc2VfaW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkpIHsKKyAgICAgIGZwcmludGYoZiwgIihcbiIpOworICAgICAgaW5kZW50YXRpb24rKzsKKworICAgICAgZm9yZWFjaF9saXN0KG4sICZpci0+ZWxzZV9pbnN0cnVjdGlvbnMpIHsKKwkgaXJfaW5zdHJ1Y3Rpb24gKmNvbnN0IGluc3QgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKworCSBpbmRlbnQoKTsKKwkgaW5zdC0+YWNjZXB0KHRoaXMpOworCSBmcHJpbnRmKGYsICJcbiIpOworICAgICAgfQorICAgICAgaW5kZW50YXRpb24tLTsKKyAgICAgIGluZGVudCgpOworICAgICAgZnByaW50ZihmLCAiKSlcbiIpOworICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoZiwgIigpKVxuIik7CisgICB9Cit9CisKKwordm9pZAoraXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfbG9vcCAqaXIpCit7CisgICBmcHJpbnRmKGYsICIobG9vcCAoXG4iKTsKKyAgIGluZGVudGF0aW9uKys7CisKKyAgIGZvcmVhY2hfbGlzdChuLCAmaXItPmJvZHlfaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgaW5zdCA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworCisgICAgICBpbmRlbnQoKTsKKyAgICAgIGluc3QtPmFjY2VwdCh0aGlzKTsKKyAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICB9CisgICBpbmRlbnRhdGlvbi0tOworICAgaW5kZW50KCk7CisgICBmcHJpbnRmKGYsICIpKVxuIik7Cit9CisKKwordm9pZAoraXJfcHJpbnRfdmlzaXRvcjo6dmlzaXQoaXJfbG9vcF9qdW1wICppcikKK3sKKyAgIGZwcmludGYoZiwgIiVzIiwgaXItPmlzX2JyZWFrKCkgPyAiYnJlYWsiIDogImNvbnRpbnVlIik7Cit9CisKK3ZvaWQKK2lyX3ByaW50X3Zpc2l0b3I6OnZpc2l0KGlyX2VtaXRfdmVydGV4ICopCit7CisgICBmcHJpbnRmKGYsICIoZW1pdC12ZXJ0ZXgpIik7Cit9CisKK3ZvaWQKK2lyX3ByaW50X3Zpc2l0b3I6OnZpc2l0KGlyX2VuZF9wcmltaXRpdmUgKikKK3sKKyAgIGZwcmludGYoZiwgIihlbmQtcHJpbWl0aXZlKSIpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9wcmludF92aXNpdG9yLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3ByaW50X3Zpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGYwNDFkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9wcmludF92aXNpdG9yLmgKQEAgLTAsMCArMSw5NSBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgSVJfUFJJTlRfVklTSVRPUl9ICisjZGVmaW5lIElSX1BSSU5UX1ZJU0lUT1JfSAorCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInByb2dyYW0vc3ltYm9sX3RhYmxlLmgiCit9CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB2aXNpdG9ycyBvZiBJUiBpbnN0cnVjdGlvbiB0cmVlcworICovCitjbGFzcyBpcl9wcmludF92aXNpdG9yIDogcHVibGljIGlyX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfcHJpbnRfdmlzaXRvcihGSUxFICpmKTsKKyAgIHZpcnR1YWwgfmlyX3ByaW50X3Zpc2l0b3IoKTsKKworICAgdm9pZCBpbmRlbnQodm9pZCk7CisKKyAgIC8qKgorICAgICogXG5hbWUgVmlzaXQgbWV0aG9kcworICAgICoKKyAgICAqIEFzIHR5cGljYWwgZm9yIHRoZSB2aXNpdG9yIHBhdHRlcm4sIHRoZXJlIG11c3QgYmUgb25lIFxjIHZpc2l0IG1ldGhvZCBmb3IKKyAgICAqIGVhY2ggY29uY3JldGUgc3ViY2xhc3Mgb2YgXGMgaXJfaW5zdHJ1Y3Rpb24uICBWaXJ0dWFsIGJhc2UgY2xhc3NlcyB3aXRoaW4KKyAgICAqIHRoZSBoaWVyYXJjaHkgc2hvdWxkIG5vdCBoYXZlIFxjIHZpc2l0IG1ldGhvZHMuCisgICAgKi8KKyAgIC8qQHsqLworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX3J2YWx1ZSAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl92YXJpYWJsZSAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZnVuY3Rpb24gKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZXhwcmVzc2lvbiAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl90ZXh0dXJlICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX3N3aXp6bGUgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2Fzc2lnbm1lbnQgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfY29uc3RhbnQgKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfY2FsbCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9yZXR1cm4gKik7CisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZGlzY2FyZCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9pZiAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9sb29wICopOworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2xvb3BfanVtcCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9lbWl0X3ZlcnRleCAqKTsKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChpcl9lbmRfcHJpbWl0aXZlICopOworICAgLypAfSovCisKK3ByaXZhdGU6CisgICAvKioKKyAgICAqIEZldGNoL2dlbmVyYXRlIGEgdW5pcXVlIG5hbWUgZm9yIGlyX3ZhcmlhYmxlLgorICAgICoKKyAgICAqIEdMU0wgSVIgcGVybWl0cyBtdWx0aXBsZSBpcl92YXJpYWJsZXMgdG8gc2hhcmUgdGhlIHNhbWUgbmFtZS4gIFRoaXMgd29ya3MKKyAgICAqIGZpbmUgdW50aWwgd2UgdHJ5IHRvIHByaW50IGl0LCB3aGVuIHdlIHJlYWxseSBuZWVkIGEgdW5pcXVlIG9uZS4KKyAgICAqLworICAgY29uc3QgY2hhciAqdW5pcXVlX25hbWUoaXJfdmFyaWFibGUgKnZhcik7CisKKyAgIC8qKiBBIG1hcHBpbmcgZnJvbSBpcl92YXJpYWJsZSAqIC0+IHVuaXF1ZSBwcmludGFibGUgbmFtZXMuICovCisgICBoYXNoX3RhYmxlICpwcmludGFibGVfbmFtZXM7CisgICBfbWVzYV9zeW1ib2xfdGFibGUgKnN5bWJvbHM7CisKKyAgIHZvaWQgKm1lbV9jdHg7CisgICBGSUxFICpmOworCisgICBpbnQgaW5kZW50YXRpb247Cit9OworCisjZW5kaWYgLyogSVJfUFJJTlRfVklTSVRPUl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3JlYWRlci5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3JlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5MjNmMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfcmVhZGVyLmNwcApAQCAtMCwwICsxLDExMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaXJfcmVhZGVyLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgInNfZXhwcmVzc2lvbi5oIgorCitjb25zdCBzdGF0aWMgYm9vbCBkZWJ1ZyA9IGZhbHNlOworCituYW1lc3BhY2UgeworCitjbGFzcyBpcl9yZWFkZXIgeworcHVibGljOgorICAgaXJfcmVhZGVyKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKik7CisKKyAgIHZvaWQgcmVhZChleGVjX2xpc3QgKmluc3RydWN0aW9ucywgY29uc3QgY2hhciAqc3JjLCBib29sIHNjYW5fZm9yX3Byb3Rvcyk7CisKK3ByaXZhdGU6CisgICB2b2lkICptZW1fY3R4OworICAgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGU7CisKKyAgIHZvaWQgaXJfcmVhZF9lcnJvcihzX2V4cHJlc3Npb24gKiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisgICBjb25zdCBnbHNsX3R5cGUgKnJlYWRfdHlwZShzX2V4cHJlc3Npb24gKik7CisKKyAgIHZvaWQgc2Nhbl9mb3JfcHJvdG90eXBlcyhleGVjX2xpc3QgKiwgc19leHByZXNzaW9uICopOworICAgaXJfZnVuY3Rpb24gKnJlYWRfZnVuY3Rpb24oc19leHByZXNzaW9uICosIGJvb2wgc2tpcF9ib2R5KTsKKyAgIHZvaWQgcmVhZF9mdW5jdGlvbl9zaWcoaXJfZnVuY3Rpb24gKiwgc19leHByZXNzaW9uICosIGJvb2wgc2tpcF9ib2R5KTsKKworICAgdm9pZCByZWFkX2luc3RydWN0aW9ucyhleGVjX2xpc3QgKiwgc19leHByZXNzaW9uICosIGlyX2xvb3AgKik7CisgICBpcl9pbnN0cnVjdGlvbiAqcmVhZF9pbnN0cnVjdGlvbihzX2V4cHJlc3Npb24gKiwgaXJfbG9vcCAqKTsKKyAgIGlyX3ZhcmlhYmxlICpyZWFkX2RlY2xhcmF0aW9uKHNfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX2lmICpyZWFkX2lmKHNfZXhwcmVzc2lvbiAqLCBpcl9sb29wICopOworICAgaXJfbG9vcCAqcmVhZF9sb29wKHNfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX2NhbGwgKnJlYWRfY2FsbChzX2V4cHJlc3Npb24gKik7CisgICBpcl9yZXR1cm4gKnJlYWRfcmV0dXJuKHNfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX3J2YWx1ZSAqcmVhZF9ydmFsdWUoc19leHByZXNzaW9uICopOworICAgaXJfYXNzaWdubWVudCAqcmVhZF9hc3NpZ25tZW50KHNfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX2V4cHJlc3Npb24gKnJlYWRfZXhwcmVzc2lvbihzX2V4cHJlc3Npb24gKik7CisgICBpcl9zd2l6emxlICpyZWFkX3N3aXp6bGUoc19leHByZXNzaW9uICopOworICAgaXJfY29uc3RhbnQgKnJlYWRfY29uc3RhbnQoc19leHByZXNzaW9uICopOworICAgaXJfdGV4dHVyZSAqcmVhZF90ZXh0dXJlKHNfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX2VtaXRfdmVydGV4ICpyZWFkX2VtaXRfdmVydGV4KHNfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX2VuZF9wcmltaXRpdmUgKnJlYWRfZW5kX3ByaW1pdGl2ZShzX2V4cHJlc3Npb24gKik7CisKKyAgIGlyX2RlcmVmZXJlbmNlICpyZWFkX2RlcmVmZXJlbmNlKHNfZXhwcmVzc2lvbiAqKTsKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpyZWFkX3Zhcl9yZWYoc19leHByZXNzaW9uICopOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK2lyX3JlYWRlcjo6aXJfcmVhZGVyKF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlKSA6IHN0YXRlKHN0YXRlKQoreworICAgdGhpcy0+bWVtX2N0eCA9IHN0YXRlOworfQorCit2b2lkCitfbWVzYV9nbHNsX3JlYWRfaXIoX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsIGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkgICBjb25zdCBjaGFyICpzcmMsIGJvb2wgc2Nhbl9mb3JfcHJvdG9zKQoreworICAgaXJfcmVhZGVyIHIoc3RhdGUpOworICAgci5yZWFkKGluc3RydWN0aW9ucywgc3JjLCBzY2FuX2Zvcl9wcm90b3MpOworfQorCit2b2lkCitpcl9yZWFkZXI6OnJlYWQoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGNvbnN0IGNoYXIgKnNyYywgYm9vbCBzY2FuX2Zvcl9wcm90b3MpCit7CisgICB2b2lkICpzeF9tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICBzX2V4cHJlc3Npb24gKmV4cHIgPSBzX2V4cHJlc3Npb246OnJlYWRfZXhwcmVzc2lvbihzeF9tZW1fY3R4LCBzcmMpOworICAgaWYgKGV4cHIgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihOVUxMLCAiY291bGRuJ3QgcGFyc2UgUy1FeHByZXNzaW9uLiIpOworICAgICAgcmV0dXJuOworICAgfQorICAgCisgICBpZiAoc2Nhbl9mb3JfcHJvdG9zKSB7CisgICAgICBzY2FuX2Zvcl9wcm90b3R5cGVzKGluc3RydWN0aW9ucywgZXhwcik7CisgICAgICBpZiAoc3RhdGUtPmVycm9yKQorCSByZXR1cm47CisgICB9CisKKyAgIHJlYWRfaW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgZXhwciwgTlVMTCk7CisgICByYWxsb2NfZnJlZShzeF9tZW1fY3R4KTsKKworICAgaWYgKGRlYnVnKQorICAgICAgdmFsaWRhdGVfaXJfdHJlZShpbnN0cnVjdGlvbnMpOworfQorCit2b2lkCitpcl9yZWFkZXI6OmlyX3JlYWRfZXJyb3Ioc19leHByZXNzaW9uICpleHByLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgIHZhX2xpc3QgYXA7CisKKyAgIHN0YXRlLT5lcnJvciA9IHRydWU7CisKKyAgIGlmIChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiAhPSBOVUxMKQorICAgICAgcmFsbG9jX2FzcHJpbnRmX2FwcGVuZCgmc3RhdGUtPmluZm9fbG9nLCAiSW4gZnVuY3Rpb24gJXM6XG4iLAorCQkJICAgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbi0+ZnVuY3Rpb25fbmFtZSgpKTsKKyAgIHJhbGxvY19zdHJjYXQoJnN0YXRlLT5pbmZvX2xvZywgImVycm9yOiAiKTsKKworICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICByYWxsb2NfdmFzcHJpbnRmX2FwcGVuZCgmc3RhdGUtPmluZm9fbG9nLCBmbXQsIGFwKTsKKyAgIHZhX2VuZChhcCk7CisgICByYWxsb2Nfc3RyY2F0KCZzdGF0ZS0+aW5mb19sb2csICJcbiIpOworCisgICBpZiAoZXhwciAhPSBOVUxMKSB7CisgICAgICByYWxsb2Nfc3RyY2F0KCZzdGF0ZS0+aW5mb19sb2csICIuLi5pbiB0aGlzIGNvbnRleHQ6XG4gICAiKTsKKyAgICAgIGV4cHItPnByaW50KCk7CisgICAgICByYWxsb2Nfc3RyY2F0KCZzdGF0ZS0+aW5mb19sb2csICJcblxuIik7CisgICB9Cit9CisKK2NvbnN0IGdsc2xfdHlwZSAqCitpcl9yZWFkZXI6OnJlYWRfdHlwZShzX2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBzX2V4cHJlc3Npb24gKnNfYmFzZV90eXBlOworICAgc19pbnQgKnNfc2l6ZTsKKworICAgc19wYXR0ZXJuIHBhdFtdID0geyAiYXJyYXkiLCBzX2Jhc2VfdHlwZSwgc19zaXplIH07CisgICBpZiAoTUFUQ0goZXhwciwgcGF0KSkgeworICAgICAgY29uc3QgZ2xzbF90eXBlICpiYXNlX3R5cGUgPSByZWFkX3R5cGUoc19iYXNlX3R5cGUpOworICAgICAgaWYgKGJhc2VfdHlwZSA9PSBOVUxMKSB7CisJIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyBiYXNlIHR5cGUgb2YgYXJyYXkgdHlwZSIpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGdsc2xfdHlwZTo6Z2V0X2FycmF5X2luc3RhbmNlKGJhc2VfdHlwZSwgc19zaXplLT52YWx1ZSgpKTsKKyAgIH0KKyAgIAorICAgc19zeW1ib2wgKnR5cGVfc3ltID0gU1hfQVNfU1lNQk9MKGV4cHIpOworICAgaWYgKHR5cGVfc3ltID09IE5VTEwpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImV4cGVjdGVkIDx0eXBlPiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9IHN0YXRlLT5zeW1ib2xzLT5nZXRfdHlwZSh0eXBlX3N5bS0+dmFsdWUoKSk7CisgICBpZiAodHlwZSA9PSBOVUxMKQorICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiaW52YWxpZCB0eXBlOiAlcyIsIHR5cGVfc3ltLT52YWx1ZSgpKTsKKworICAgcmV0dXJuIHR5cGU7Cit9CisKKwordm9pZAoraXJfcmVhZGVyOjpzY2FuX2Zvcl9wcm90b3R5cGVzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBzX2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBzX2xpc3QgKmxpc3QgPSBTWF9BU19MSVNUKGV4cHIpOworICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiRXhwZWN0ZWQgKDxpbnN0cnVjdGlvbj4gLi4uKTsgZm91bmQgYW4gYXRvbS4iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZm9yZWFjaF9saXN0KG4sICZsaXN0LT5zdWJleHByZXNzaW9ucykgeworICAgICAgc19saXN0ICpzdWIgPSBTWF9BU19MSVNUKG4pOworICAgICAgaWYgKHN1YiA9PSBOVUxMKQorCSBjb250aW51ZTsgLy8gbm90IGEgKGZ1bmN0aW9uIC4uLik7IGlnbm9yZSBpdC4KKworICAgICAgc19zeW1ib2wgKnRhZyA9IFNYX0FTX1NZTUJPTChzdWItPnN1YmV4cHJlc3Npb25zLmdldF9oZWFkKCkpOworICAgICAgaWYgKHRhZyA9PSBOVUxMIHx8IHN0cmNtcCh0YWctPnZhbHVlKCksICJmdW5jdGlvbiIpICE9IDApCisJIGNvbnRpbnVlOyAvLyBub3QgYSAoZnVuY3Rpb24gLi4uKTsgaWdub3JlIGl0LgorCisgICAgICBpcl9mdW5jdGlvbiAqZiA9IHJlYWRfZnVuY3Rpb24oc3ViLCB0cnVlKTsKKyAgICAgIGlmIChmID09IE5VTEwpCisJIHJldHVybjsKKyAgICAgIGluc3RydWN0aW9ucy0+cHVzaF90YWlsKGYpOworICAgfQorfQorCitpcl9mdW5jdGlvbiAqCitpcl9yZWFkZXI6OnJlYWRfZnVuY3Rpb24oc19leHByZXNzaW9uICpleHByLCBib29sIHNraXBfYm9keSkKK3sKKyAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKKyAgIHNfc3ltYm9sICpuYW1lOworCisgICBzX3BhdHRlcm4gcGF0W10gPSB7ICJmdW5jdGlvbiIsIG5hbWUgfTsKKyAgIGlmICghUEFSVElBTF9NQVRDSChleHByLCBwYXQpKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJFeHBlY3RlZCAoZnVuY3Rpb24gPG5hbWU+IChzaWduYXR1cmUgLi4uKSAuLi4pIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaXJfZnVuY3Rpb24gKmYgPSBzdGF0ZS0+c3ltYm9scy0+Z2V0X2Z1bmN0aW9uKG5hbWUtPnZhbHVlKCkpOworICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgZiA9IG5ldyhtZW1fY3R4KSBpcl9mdW5jdGlvbihuYW1lLT52YWx1ZSgpKTsKKyAgICAgIGFkZGVkID0gc3RhdGUtPnN5bWJvbHMtPmFkZF9mdW5jdGlvbihmKTsKKyAgICAgIGFzc2VydChhZGRlZCk7CisgICB9CisKKyAgIC8qIFNraXAgb3ZlciAiZnVuY3Rpb24iIHRhZyBhbmQgZnVuY3Rpb24gbmFtZSAod2hpY2ggYXJlIGd1YXJhbnRlZWQgdG8gYmUKKyAgICAqIHByZXNlbnQgYnkgdGhlIGFib3ZlIFBBUlRJQUxfTUFUQ0ggY2FsbCkuCisgICAgKi8KKyAgIGV4ZWNfbm9kZSAqbm9kZSA9ICgoc19saXN0ICopIGV4cHIpLT5zdWJleHByZXNzaW9ucy5oZWFkLT5uZXh0LT5uZXh0OworICAgZm9yICgvKiBub3RoaW5nICovOyAhbm9kZS0+aXNfdGFpbF9zZW50aW5lbCgpOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgICAgc19leHByZXNzaW9uICpzX3NpZyA9IChzX2V4cHJlc3Npb24gKikgbm9kZTsKKyAgICAgIHJlYWRfZnVuY3Rpb25fc2lnKGYsIHNfc2lnLCBza2lwX2JvZHkpOworICAgfQorICAgcmV0dXJuIGFkZGVkID8gZiA6IE5VTEw7Cit9CisKK3N0YXRpYyBib29sCithbHdheXNfYXZhaWxhYmxlKGNvbnN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKikKK3sKKyAgIHJldHVybiB0cnVlOworfQorCit2b2lkCitpcl9yZWFkZXI6OnJlYWRfZnVuY3Rpb25fc2lnKGlyX2Z1bmN0aW9uICpmLCBzX2V4cHJlc3Npb24gKmV4cHIsIGJvb2wgc2tpcF9ib2R5KQoreworICAgc19leHByZXNzaW9uICp0eXBlX2V4cHI7CisgICBzX2xpc3QgKnBhcmFtbGlzdDsKKyAgIHNfbGlzdCAqYm9keV9saXN0OworCisgICBzX3BhdHRlcm4gcGF0W10gPSB7ICJzaWduYXR1cmUiLCB0eXBlX2V4cHIsIHBhcmFtbGlzdCwgYm9keV9saXN0IH07CisgICBpZiAoIU1BVENIKGV4cHIsIHBhdCkpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgIkV4cGVjdGVkIChzaWduYXR1cmUgPHR5cGU+IChwYXJhbWV0ZXJzIC4uLikgIgorCQkJICAiKDxpbnN0cnVjdGlvbj4gLi4uKSkiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgY29uc3QgZ2xzbF90eXBlICpyZXR1cm5fdHlwZSA9IHJlYWRfdHlwZSh0eXBlX2V4cHIpOworICAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHNfc3ltYm9sICpwYXJhbXRhZyA9IFNYX0FTX1NZTUJPTChwYXJhbWxpc3QtPnN1YmV4cHJlc3Npb25zLmdldF9oZWFkKCkpOworICAgaWYgKHBhcmFtdGFnID09IE5VTEwgfHwgc3RyY21wKHBhcmFtdGFnLT52YWx1ZSgpLCAicGFyYW1ldGVycyIpICE9IDApIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IocGFyYW1saXN0LCAiRXhwZWN0ZWQgKHBhcmFtZXRlcnMgLi4uKSIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvLyBSZWFkIHRoZSBwYXJhbWV0ZXJzIGxpc3QgaW50byBhIHRlbXBvcmFyeSBwbGFjZS4KKyAgIGV4ZWNfbGlzdCBoaXJfcGFyYW1ldGVyczsKKyAgIHN0YXRlLT5zeW1ib2xzLT5wdXNoX3Njb3BlKCk7CisKKyAgIC8qIFNraXAgb3ZlciB0aGUgInBhcmFtZXRlcnMiIHRhZy4gKi8KKyAgIGV4ZWNfbm9kZSAqbm9kZSA9IHBhcmFtbGlzdC0+c3ViZXhwcmVzc2lvbnMuaGVhZC0+bmV4dDsKKyAgIGZvciAoLyogbm90aGluZyAqLzsgIW5vZGUtPmlzX3RhaWxfc2VudGluZWwoKTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSByZWFkX2RlY2xhcmF0aW9uKChzX2V4cHJlc3Npb24gKikgbm9kZSk7CisgICAgICBpZiAodmFyID09IE5VTEwpCisJIHJldHVybjsKKworICAgICAgaGlyX3BhcmFtZXRlcnMucHVzaF90YWlsKHZhcik7CisgICB9CisKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnID0KKyAgICAgIGYtPmV4YWN0X21hdGNoaW5nX3NpZ25hdHVyZShzdGF0ZSwgJmhpcl9wYXJhbWV0ZXJzKTsKKyAgIGlmIChzaWcgPT0gTlVMTCAmJiBza2lwX2JvZHkpIHsKKyAgICAgIC8qIElmIHNjYW5uaW5nIGZvciBwcm90b3R5cGVzLCBnZW5lcmF0ZSBhIG5ldyBzaWduYXR1cmUuICovCisgICAgICAvKiBpcl9yZWFkZXIgZG9lc24ndCBrbm93IHdoYXQgbGFuZ3VhZ2VzIHN1cHBvcnQgYSBnaXZlbiBidWlsdC1pbiwgc28KKyAgICAgICAqIGp1c3Qgc2F5IHRoYXQgdGhleSdyZSBhbHdheXMgYXZhaWxhYmxlLiAgRm9yIG5vdywgb3RoZXIgbWVjaGFuaXNtcworICAgICAgICogZ3VhcmFudGVlIHRoZSByaWdodCBidWlsdC1pbnMgYXJlIGF2YWlsYWJsZS4KKyAgICAgICAqLworICAgICAgc2lnID0gbmV3KG1lbV9jdHgpIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZShyZXR1cm5fdHlwZSwgYWx3YXlzX2F2YWlsYWJsZSk7CisgICAgICBmLT5hZGRfc2lnbmF0dXJlKHNpZyk7CisgICB9IGVsc2UgaWYgKHNpZyAhPSBOVUxMKSB7CisgICAgICBjb25zdCBjaGFyICpiYWR2YXIgPSBzaWctPnF1YWxpZmllcnNfbWF0Y2goJmhpcl9wYXJhbWV0ZXJzKTsKKyAgICAgIGlmIChiYWR2YXIgIT0gTlVMTCkgeworCSBpcl9yZWFkX2Vycm9yKGV4cHIsICJmdW5jdGlvbiBgJXMnIHBhcmFtZXRlciBgJXMnIHF1YWxpZmllcnMgIgorCQkgICAgICAgImRvbid0IG1hdGNoIHByb3RvdHlwZSIsIGYtPm5hbWUsIGJhZHZhcik7CisJIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHNpZy0+cmV0dXJuX3R5cGUgIT0gcmV0dXJuX3R5cGUpIHsKKwkgaXJfcmVhZF9lcnJvcihleHByLCAiZnVuY3Rpb24gYCVzJyByZXR1cm4gdHlwZSBkb2Vzbid0ICIKKwkJICAgICAgICJtYXRjaCBwcm90b3R5cGUiLCBmLT5uYW1lKTsKKwkgcmV0dXJuOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vIHByb3RvdHlwZSBmb3IgdGhpcyBib2R5IGV4aXN0cyAtIHNraXAgaXQuICovCisgICAgICBzdGF0ZS0+c3ltYm9scy0+cG9wX3Njb3BlKCk7CisgICAgICByZXR1cm47CisgICB9CisgICBhc3NlcnQoc2lnICE9IE5VTEwpOworCisgICBzaWctPnJlcGxhY2VfcGFyYW1ldGVycygmaGlyX3BhcmFtZXRlcnMpOworCisgICBpZiAoIXNraXBfYm9keSAmJiAhYm9keV9saXN0LT5zdWJleHByZXNzaW9ucy5pc19lbXB0eSgpKSB7CisgICAgICBpZiAoc2lnLT5pc19kZWZpbmVkKSB7CisJIGlyX3JlYWRfZXJyb3IoZXhwciwgImZ1bmN0aW9uICVzIHJlZGVmaW5lZCIsIGYtPm5hbWUpOworCSByZXR1cm47CisgICAgICB9CisgICAgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9IHNpZzsKKyAgICAgIHJlYWRfaW5zdHJ1Y3Rpb25zKCZzaWctPmJvZHksIGJvZHlfbGlzdCwgTlVMTCk7CisgICAgICBzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7CisgICAgICBzaWctPmlzX2RlZmluZWQgPSB0cnVlOworICAgfQorCisgICBzdGF0ZS0+c3ltYm9scy0+cG9wX3Njb3BlKCk7Cit9CisKK3ZvaWQKK2lyX3JlYWRlcjo6cmVhZF9pbnN0cnVjdGlvbnMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHNfZXhwcmVzc2lvbiAqZXhwciwKKwkJCSAgICAgaXJfbG9vcCAqbG9vcF9jdHgpCit7CisgICAvLyBSZWFkIGluIGEgbGlzdCBvZiBpbnN0cnVjdGlvbnMKKyAgIHNfbGlzdCAqbGlzdCA9IFNYX0FTX0xJU1QoZXhwcik7CisgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJFeHBlY3RlZCAoPGluc3RydWN0aW9uPiAuLi4pOyBmb3VuZCBhbiBhdG9tLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3JlYWNoX2xpc3QobiwgJmxpc3QtPnN1YmV4cHJlc3Npb25zKSB7CisgICAgICBzX2V4cHJlc3Npb24gKnN1YiA9IChzX2V4cHJlc3Npb24gKikgbjsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IHJlYWRfaW5zdHJ1Y3Rpb24oc3ViLCBsb29wX2N0eCk7CisgICAgICBpZiAoaXIgIT0gTlVMTCkgeworCSAvKiBHbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgdG9wLCBiZWZvcmUKKwkgICogYW55IGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IHVzZSB0aGVtLiAgRnVuY3Rpb25zIGFyZSBhZGRlZCB0byB0aGUKKwkgICogaW5zdHJ1Y3Rpb24gc3RyZWFtIHdoZW4gc2Nhbm5pbmcgZm9yIHByb3RvdHlwZXMsIHNvIHdpdGhvdXQgdGhpcworCSAgKiBoYWNrLCB0aGV5IGFsd2F5cyBhcHBlYXIgYmVmb3JlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KKwkgICovCisJIGlmIChzdGF0ZS0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMICYmIGlyLT5hc192YXJpYWJsZSgpICE9IE5VTEwpCisJICAgIGluc3RydWN0aW9ucy0+cHVzaF9oZWFkKGlyKTsKKwkgZWxzZQorCSAgICBpbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChpcik7CisgICAgICB9CisgICB9Cit9CisKKworaXJfaW5zdHJ1Y3Rpb24gKgoraXJfcmVhZGVyOjpyZWFkX2luc3RydWN0aW9uKHNfZXhwcmVzc2lvbiAqZXhwciwgaXJfbG9vcCAqbG9vcF9jdHgpCit7CisgICBzX3N5bWJvbCAqc3ltYm9sID0gU1hfQVNfU1lNQk9MKGV4cHIpOworICAgaWYgKHN5bWJvbCAhPSBOVUxMKSB7CisgICAgICBpZiAoc3RyY21wKHN5bWJvbC0+dmFsdWUoKSwgImJyZWFrIikgPT0gMCAmJiBsb29wX2N0eCAhPSBOVUxMKQorCSByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2xvb3BfanVtcChpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWspOworICAgICAgaWYgKHN0cmNtcChzeW1ib2wtPnZhbHVlKCksICJjb250aW51ZSIpID09IDAgJiYgbG9vcF9jdHggIT0gTlVMTCkKKwkgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9sb29wX2p1bXAoaXJfbG9vcF9qdW1wOjpqdW1wX2NvbnRpbnVlKTsKKyAgIH0KKworICAgc19saXN0ICpsaXN0ID0gU1hfQVNfTElTVChleHByKTsKKyAgIGlmIChsaXN0ID09IE5VTEwgfHwgbGlzdC0+c3ViZXhwcmVzc2lvbnMuaXNfZW1wdHkoKSkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiSW52YWxpZCBpbnN0cnVjdGlvbi5cbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHNfc3ltYm9sICp0YWcgPSBTWF9BU19TWU1CT0wobGlzdC0+c3ViZXhwcmVzc2lvbnMuZ2V0X2hlYWQoKSk7CisgICBpZiAodGFnID09IE5VTEwpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImV4cGVjdGVkIGluc3RydWN0aW9uIHRhZyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlyX2luc3RydWN0aW9uICppbnN0ID0gTlVMTDsKKyAgIGlmIChzdHJjbXAodGFnLT52YWx1ZSgpLCAiZGVjbGFyZSIpID09IDApIHsKKyAgICAgIGluc3QgPSByZWFkX2RlY2xhcmF0aW9uKGxpc3QpOworICAgfSBlbHNlIGlmIChzdHJjbXAodGFnLT52YWx1ZSgpLCAiYXNzaWduIikgPT0gMCkgeworICAgICAgaW5zdCA9IHJlYWRfYXNzaWdubWVudChsaXN0KTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKHRhZy0+dmFsdWUoKSwgImlmIikgPT0gMCkgeworICAgICAgaW5zdCA9IHJlYWRfaWYobGlzdCwgbG9vcF9jdHgpOworICAgfSBlbHNlIGlmIChzdHJjbXAodGFnLT52YWx1ZSgpLCAibG9vcCIpID09IDApIHsKKyAgICAgIGluc3QgPSByZWFkX2xvb3AobGlzdCk7CisgICB9IGVsc2UgaWYgKHN0cmNtcCh0YWctPnZhbHVlKCksICJjYWxsIikgPT0gMCkgeworICAgICAgaW5zdCA9IHJlYWRfY2FsbChsaXN0KTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKHRhZy0+dmFsdWUoKSwgInJldHVybiIpID09IDApIHsKKyAgICAgIGluc3QgPSByZWFkX3JldHVybihsaXN0KTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKHRhZy0+dmFsdWUoKSwgImZ1bmN0aW9uIikgPT0gMCkgeworICAgICAgaW5zdCA9IHJlYWRfZnVuY3Rpb24obGlzdCwgZmFsc2UpOworICAgfSBlbHNlIGlmIChzdHJjbXAodGFnLT52YWx1ZSgpLCAiZW1pdC12ZXJ0ZXgiKSA9PSAwKSB7CisgICAgICBpbnN0ID0gcmVhZF9lbWl0X3ZlcnRleChsaXN0KTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKHRhZy0+dmFsdWUoKSwgImVuZC1wcmltaXRpdmUiKSA9PSAwKSB7CisgICAgICBpbnN0ID0gcmVhZF9lbmRfcHJpbWl0aXZlKGxpc3QpOworICAgfSBlbHNlIHsKKyAgICAgIGluc3QgPSByZWFkX3J2YWx1ZShsaXN0KTsKKyAgICAgIGlmIChpbnN0ID09IE5VTEwpCisJIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyBpbnN0cnVjdGlvbiIpOworICAgfQorICAgcmV0dXJuIGluc3Q7Cit9CisKK2lyX3ZhcmlhYmxlICoKK2lyX3JlYWRlcjo6cmVhZF9kZWNsYXJhdGlvbihzX2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBzX2xpc3QgKnNfcXVhbHM7CisgICBzX2V4cHJlc3Npb24gKnNfdHlwZTsKKyAgIHNfc3ltYm9sICpzX25hbWU7CisKKyAgIHNfcGF0dGVybiBwYXRbXSA9IHsgImRlY2xhcmUiLCBzX3F1YWxzLCBzX3R5cGUsIHNfbmFtZSB9OworICAgaWYgKCFNQVRDSChleHByLCBwYXQpKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJleHBlY3RlZCAoZGVjbGFyZSAoPHF1YWxpZmllcnM+KSA8dHlwZT4gPG5hbWU+KSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9IHJlYWRfdHlwZShzX3R5cGUpOworICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpcl92YXJpYWJsZSAqdmFyID0gbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKHR5cGUsIHNfbmFtZS0+dmFsdWUoKSwKKwkJCQkJICAgICAgIGlyX3Zhcl9hdXRvKTsKKworICAgZm9yZWFjaF9saXN0KG4sICZzX3F1YWxzLT5zdWJleHByZXNzaW9ucykgeworICAgICAgc19zeW1ib2wgKnF1YWxpZmllciA9IFNYX0FTX1NZTUJPTChuKTsKKyAgICAgIGlmIChxdWFsaWZpZXIgPT0gTlVMTCkgeworCSBpcl9yZWFkX2Vycm9yKGV4cHIsICJxdWFsaWZpZXIgbGlzdCBtdXN0IGNvbnRhaW4gb25seSBzeW1ib2xzIik7CisJIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICAvLyBGSU5JU0hNRTogQ2hlY2sgZm9yIGR1cGxpY2F0ZS9jb25mbGljdGluZyBxdWFsaWZpZXJzLgorICAgICAgaWYgKHN0cmNtcChxdWFsaWZpZXItPnZhbHVlKCksICJjZW50cm9pZCIpID09IDApIHsKKwkgdmFyLT5kYXRhLmNlbnRyb2lkID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHF1YWxpZmllci0+dmFsdWUoKSwgInNhbXBsZSIpID09IDApIHsKKyAgICAgICAgIHZhci0+ZGF0YS5zYW1wbGUgPSAxOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAocXVhbGlmaWVyLT52YWx1ZSgpLCAiaW52YXJpYW50IikgPT0gMCkgeworCSB2YXItPmRhdGEuaW52YXJpYW50ID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHF1YWxpZmllci0+dmFsdWUoKSwgInVuaWZvcm0iKSA9PSAwKSB7CisJIHZhci0+ZGF0YS5tb2RlID0gaXJfdmFyX3VuaWZvcm07CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChxdWFsaWZpZXItPnZhbHVlKCksICJhdXRvIikgPT0gMCkgeworCSB2YXItPmRhdGEubW9kZSA9IGlyX3Zhcl9hdXRvOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAocXVhbGlmaWVyLT52YWx1ZSgpLCAiaW4iKSA9PSAwKSB7CisJIHZhci0+ZGF0YS5tb2RlID0gaXJfdmFyX2Z1bmN0aW9uX2luOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAocXVhbGlmaWVyLT52YWx1ZSgpLCAic2hhZGVyX2luIikgPT0gMCkgeworICAgICAgICAgdmFyLT5kYXRhLm1vZGUgPSBpcl92YXJfc2hhZGVyX2luOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAocXVhbGlmaWVyLT52YWx1ZSgpLCAiY29uc3RfaW4iKSA9PSAwKSB7CisJIHZhci0+ZGF0YS5tb2RlID0gaXJfdmFyX2NvbnN0X2luOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAocXVhbGlmaWVyLT52YWx1ZSgpLCAib3V0IikgPT0gMCkgeworCSB2YXItPmRhdGEubW9kZSA9IGlyX3Zhcl9mdW5jdGlvbl9vdXQ7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChxdWFsaWZpZXItPnZhbHVlKCksICJzaGFkZXJfb3V0IikgPT0gMCkgeworCSB2YXItPmRhdGEubW9kZSA9IGlyX3Zhcl9zaGFkZXJfb3V0OworICAgICAgfSBlbHNlIGlmIChzdHJjbXAocXVhbGlmaWVyLT52YWx1ZSgpLCAiaW5vdXQiKSA9PSAwKSB7CisJIHZhci0+ZGF0YS5tb2RlID0gaXJfdmFyX2Z1bmN0aW9uX2lub3V0OworICAgICAgfSBlbHNlIGlmIChzdHJjbXAocXVhbGlmaWVyLT52YWx1ZSgpLCAidGVtcG9yYXJ5IikgPT0gMCkgeworCSB2YXItPmRhdGEubW9kZSA9IGlyX3Zhcl90ZW1wb3Jhcnk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChxdWFsaWZpZXItPnZhbHVlKCksICJzbW9vdGgiKSA9PSAwKSB7CisJIHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uID0gSU5URVJQX1FVQUxJRklFUl9TTU9PVEg7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChxdWFsaWZpZXItPnZhbHVlKCksICJmbGF0IikgPT0gMCkgeworCSB2YXItPmRhdGEuaW50ZXJwb2xhdGlvbiA9IElOVEVSUF9RVUFMSUZJRVJfRkxBVDsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHF1YWxpZmllci0+dmFsdWUoKSwgIm5vcGVyc3BlY3RpdmUiKSA9PSAwKSB7CisJIHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uID0gSU5URVJQX1FVQUxJRklFUl9OT1BFUlNQRUNUSVZFOworICAgICAgfSBlbHNlIHsKKwkgaXJfcmVhZF9lcnJvcihleHByLCAidW5rbm93biBxdWFsaWZpZXI6ICVzIiwgcXVhbGlmaWVyLT52YWx1ZSgpKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIC8vIEFkZCB0aGUgdmFyaWFibGUgdG8gdGhlIHN5bWJvbCB0YWJsZQorICAgc3RhdGUtPnN5bWJvbHMtPmFkZF92YXJpYWJsZSh2YXIpOworCisgICByZXR1cm4gdmFyOworfQorCisKK2lyX2lmICoKK2lyX3JlYWRlcjo6cmVhZF9pZihzX2V4cHJlc3Npb24gKmV4cHIsIGlyX2xvb3AgKmxvb3BfY3R4KQoreworICAgc19leHByZXNzaW9uICpzX2NvbmQ7CisgICBzX2V4cHJlc3Npb24gKnNfdGhlbjsKKyAgIHNfZXhwcmVzc2lvbiAqc19lbHNlOworCisgICBzX3BhdHRlcm4gcGF0W10gPSB7ICJpZiIsIHNfY29uZCwgc190aGVuLCBzX2Vsc2UgfTsKKyAgIGlmICghTUFUQ0goZXhwciwgcGF0KSkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiZXhwZWN0ZWQgKGlmIDxjb25kaXRpb24+ICg8dGhlbj4uLi4pICg8ZWxzZT4uLi4pKSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlyX3J2YWx1ZSAqY29uZGl0aW9uID0gcmVhZF9ydmFsdWUoc19jb25kKTsKKyAgIGlmIChjb25kaXRpb24gPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIGNvbmRpdGlvbiBvZiAoaWYgLi4uKSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlyX2lmICppZmYgPSBuZXcobWVtX2N0eCkgaXJfaWYoY29uZGl0aW9uKTsKKworICAgcmVhZF9pbnN0cnVjdGlvbnMoJmlmZi0+dGhlbl9pbnN0cnVjdGlvbnMsIHNfdGhlbiwgbG9vcF9jdHgpOworICAgcmVhZF9pbnN0cnVjdGlvbnMoJmlmZi0+ZWxzZV9pbnN0cnVjdGlvbnMsIHNfZWxzZSwgbG9vcF9jdHgpOworICAgaWYgKHN0YXRlLT5lcnJvcikgeworICAgICAgZGVsZXRlIGlmZjsKKyAgICAgIGlmZiA9IE5VTEw7CisgICB9CisgICByZXR1cm4gaWZmOworfQorCisKK2lyX2xvb3AgKgoraXJfcmVhZGVyOjpyZWFkX2xvb3Aoc19leHByZXNzaW9uICpleHByKQoreworICAgc19leHByZXNzaW9uICpzX2JvZHk7CisKKyAgIHNfcGF0dGVybiBsb29wX3BhdFtdID0geyAibG9vcCIsIHNfYm9keSB9OworICAgaWYgKCFNQVRDSChleHByLCBsb29wX3BhdCkpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImV4cGVjdGVkIChsb29wIDxib2R5PikiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpcl9sb29wICpsb29wID0gbmV3KG1lbV9jdHgpIGlyX2xvb3A7CisKKyAgIHJlYWRfaW5zdHJ1Y3Rpb25zKCZsb29wLT5ib2R5X2luc3RydWN0aW9ucywgc19ib2R5LCBsb29wKTsKKyAgIGlmIChzdGF0ZS0+ZXJyb3IpIHsKKyAgICAgIGRlbGV0ZSBsb29wOworICAgICAgbG9vcCA9IE5VTEw7CisgICB9CisgICByZXR1cm4gbG9vcDsKK30KKworCitpcl9yZXR1cm4gKgoraXJfcmVhZGVyOjpyZWFkX3JldHVybihzX2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBzX2V4cHJlc3Npb24gKnNfcmV0dmFsOworCisgICBzX3BhdHRlcm4gcmV0dXJuX3ZhbHVlX3BhdFtdID0geyAicmV0dXJuIiwgc19yZXR2YWx9OworICAgc19wYXR0ZXJuIHJldHVybl92b2lkX3BhdFtdID0geyAicmV0dXJuIiB9OworICAgaWYgKE1BVENIKGV4cHIsIHJldHVybl92YWx1ZV9wYXQpKSB7CisgICAgICBpcl9ydmFsdWUgKnJldHZhbCA9IHJlYWRfcnZhbHVlKHNfcmV0dmFsKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCkgeworICAgICAgICAgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIHJldHVybiB2YWx1ZSIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX3JldHVybihyZXR2YWwpOworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCByZXR1cm5fdm9pZF9wYXQpKSB7CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX3JldHVybjsKKyAgIH0gZWxzZSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJleHBlY3RlZCAocmV0dXJuIDxydmFsdWU+KSBvciAocmV0dXJuKSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9Cit9CisKKworaXJfcnZhbHVlICoKK2lyX3JlYWRlcjo6cmVhZF9ydmFsdWUoc19leHByZXNzaW9uICpleHByKQoreworICAgc19saXN0ICpsaXN0ID0gU1hfQVNfTElTVChleHByKTsKKyAgIGlmIChsaXN0ID09IE5VTEwgfHwgbGlzdC0+c3ViZXhwcmVzc2lvbnMuaXNfZW1wdHkoKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBzX3N5bWJvbCAqdGFnID0gU1hfQVNfU1lNQk9MKGxpc3QtPnN1YmV4cHJlc3Npb25zLmdldF9oZWFkKCkpOworICAgaWYgKHRhZyA9PSBOVUxMKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJleHBlY3RlZCBydmFsdWUgdGFnIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaXJfcnZhbHVlICpydmFsdWUgPSByZWFkX2RlcmVmZXJlbmNlKGxpc3QpOworICAgaWYgKHJ2YWx1ZSAhPSBOVUxMIHx8IHN0YXRlLT5lcnJvcikKKyAgICAgIHJldHVybiBydmFsdWU7CisgICBlbHNlIGlmIChzdHJjbXAodGFnLT52YWx1ZSgpLCAic3dpeiIpID09IDApIHsKKyAgICAgIHJ2YWx1ZSA9IHJlYWRfc3dpenpsZShsaXN0KTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKHRhZy0+dmFsdWUoKSwgImV4cHJlc3Npb24iKSA9PSAwKSB7CisgICAgICBydmFsdWUgPSByZWFkX2V4cHJlc3Npb24obGlzdCk7CisgICB9IGVsc2UgaWYgKHN0cmNtcCh0YWctPnZhbHVlKCksICJjb25zdGFudCIpID09IDApIHsKKyAgICAgIHJ2YWx1ZSA9IHJlYWRfY29uc3RhbnQobGlzdCk7CisgICB9IGVsc2UgeworICAgICAgcnZhbHVlID0gcmVhZF90ZXh0dXJlKGxpc3QpOworICAgICAgaWYgKHJ2YWx1ZSA9PSBOVUxMICYmICFzdGF0ZS0+ZXJyb3IpCisJIGlyX3JlYWRfZXJyb3IoZXhwciwgInVucmVjb2duaXplZCBydmFsdWUgdGFnOiAlcyIsIHRhZy0+dmFsdWUoKSk7CisgICB9CisKKyAgIHJldHVybiBydmFsdWU7Cit9CisKK2lyX2Fzc2lnbm1lbnQgKgoraXJfcmVhZGVyOjpyZWFkX2Fzc2lnbm1lbnQoc19leHByZXNzaW9uICpleHByKQoreworICAgc19leHByZXNzaW9uICpjb25kX2V4cHIgPSBOVUxMOworICAgc19leHByZXNzaW9uICpsaHNfZXhwciwgKnJoc19leHByOworICAgc19saXN0ICAgICAgICptYXNrX2xpc3Q7CisKKyAgIHNfcGF0dGVybiBwYXQ0W10gPSB7ICJhc3NpZ24iLCAgICAgICAgICAgIG1hc2tfbGlzdCwgbGhzX2V4cHIsIHJoc19leHByIH07CisgICBzX3BhdHRlcm4gcGF0NVtdID0geyAiYXNzaWduIiwgY29uZF9leHByLCBtYXNrX2xpc3QsIGxoc19leHByLCByaHNfZXhwciB9OworICAgaWYgKCFNQVRDSChleHByLCBwYXQ0KSAmJiAhTUFUQ0goZXhwciwgcGF0NSkpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImV4cGVjdGVkIChhc3NpZ24gWzxjb25kaXRpb24+XSAoPHdyaXRlIG1hc2s+KSAiCisJCQkgICI8bGhzPiA8cmhzPikiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpcl9ydmFsdWUgKmNvbmRpdGlvbiA9IE5VTEw7CisgICBpZiAoY29uZF9leHByICE9IE5VTEwpIHsKKyAgICAgIGNvbmRpdGlvbiA9IHJlYWRfcnZhbHVlKGNvbmRfZXhwcik7CisgICAgICBpZiAoY29uZGl0aW9uID09IE5VTEwpIHsKKwkgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIGNvbmRpdGlvbiBvZiBhc3NpZ25tZW50Iik7CisJIHJldHVybiBOVUxMOworICAgICAgfQorICAgfQorCisgICB1bnNpZ25lZCBtYXNrID0gMDsKKworICAgc19zeW1ib2wgKm1hc2tfc3ltYm9sOworICAgc19wYXR0ZXJuIG1hc2tfcGF0W10gPSB7IG1hc2tfc3ltYm9sIH07CisgICBpZiAoTUFUQ0gobWFza19saXN0LCBtYXNrX3BhdCkpIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1hc2tfc3RyID0gbWFza19zeW1ib2wtPnZhbHVlKCk7CisgICAgICB1bnNpZ25lZCBtYXNrX2xlbmd0aCA9IHN0cmxlbihtYXNrX3N0cik7CisgICAgICBpZiAobWFza19sZW5ndGggPiA0KSB7CisJIGlyX3JlYWRfZXJyb3IoZXhwciwgImludmFsaWQgd3JpdGUgbWFzazogJXMiLCBtYXNrX3N0cik7CisJIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBjb25zdCB1bnNpZ25lZCBpZHhfbWFwW10gPSB7IDMsIDAsIDEsIDIgfTsgLyogdz1iaXQgMywgeD0wLCB5PTEsIHo9MiAqLworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWFza19sZW5ndGg7IGkrKykgeworCSBpZiAobWFza19zdHJbaV0gPCAndycgfHwgbWFza19zdHJbaV0gPiAneicpIHsKKwkgICAgaXJfcmVhZF9lcnJvcihleHByLCAid3JpdGUgbWFzayBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcjogJWMiLAorCQkJICBtYXNrX3N0cltpXSk7CisJICAgIHJldHVybiBOVUxMOworCSB9CisJIG1hc2sgfD0gMSA8PCBpZHhfbWFwW21hc2tfc3RyW2ldIC0gJ3cnXTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAoIW1hc2tfbGlzdC0+c3ViZXhwcmVzc2lvbnMuaXNfZW1wdHkoKSkgeworICAgICAgaXJfcmVhZF9lcnJvcihtYXNrX2xpc3QsICJleHBlY3RlZCAoKSBvciAoPHdyaXRlIG1hc2s+KSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlyX2RlcmVmZXJlbmNlICpsaHMgPSByZWFkX2RlcmVmZXJlbmNlKGxoc19leHByKTsKKyAgIGlmIChsaHMgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIGxlZnQtaGFuZCBzaWRlIG9mIGFzc2lnbm1lbnQiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpcl9ydmFsdWUgKnJocyA9IHJlYWRfcnZhbHVlKHJoc19leHByKTsKKyAgIGlmIChyaHMgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50Iik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKG1hc2sgPT0gMCAmJiAobGhzLT50eXBlLT5pc192ZWN0b3IoKSB8fCBsaHMtPnR5cGUtPmlzX3NjYWxhcigpKSkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAibm9uLXplcm8gd3JpdGUgbWFzayByZXF1aXJlZC4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCByaHMsIGNvbmRpdGlvbiwgbWFzayk7Cit9CisKK2lyX2NhbGwgKgoraXJfcmVhZGVyOjpyZWFkX2NhbGwoc19leHByZXNzaW9uICpleHByKQoreworICAgc19zeW1ib2wgKm5hbWU7CisgICBzX2xpc3QgKnBhcmFtczsKKyAgIHNfbGlzdCAqc19yZXR1cm4gPSBOVUxMOworCisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqcmV0dXJuX2RlcmVmID0gTlVMTDsKKworICAgc19wYXR0ZXJuIHZvaWRfcGF0W10gPSB7ICJjYWxsIiwgbmFtZSwgcGFyYW1zIH07CisgICBzX3BhdHRlcm4gbm9uX3ZvaWRfcGF0W10gPSB7ICJjYWxsIiwgbmFtZSwgc19yZXR1cm4sIHBhcmFtcyB9OworICAgaWYgKE1BVENIKGV4cHIsIG5vbl92b2lkX3BhdCkpIHsKKyAgICAgIHJldHVybl9kZXJlZiA9IHJlYWRfdmFyX3JlZihzX3JldHVybik7CisgICAgICBpZiAocmV0dXJuX2RlcmVmID09IE5VTEwpIHsKKwkgaXJfcmVhZF9lcnJvcihzX3JldHVybiwgIndoZW4gcmVhZGluZyBhIGNhbGwncyByZXR1cm4gc3RvcmFnZSIpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAoIU1BVENIKGV4cHIsIHZvaWRfcGF0KSkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiZXhwZWN0ZWQgKGNhbGwgPG5hbWU+IFs8ZGVyZWY+XSAoPHBhcmFtPiAuLi4pKSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGV4ZWNfbGlzdCBwYXJhbWV0ZXJzOworCisgICBmb3JlYWNoX2xpc3QobiwgJnBhcmFtcy0+c3ViZXhwcmVzc2lvbnMpIHsKKyAgICAgIHNfZXhwcmVzc2lvbiAqZXhwciA9IChzX2V4cHJlc3Npb24gKikgbjsKKyAgICAgIGlyX3J2YWx1ZSAqcGFyYW0gPSByZWFkX3J2YWx1ZShleHByKTsKKyAgICAgIGlmIChwYXJhbSA9PSBOVUxMKSB7CisJIGlyX3JlYWRfZXJyb3IoZXhwciwgIndoZW4gcmVhZGluZyBwYXJhbWV0ZXIgdG8gZnVuY3Rpb24gY2FsbCIpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHBhcmFtZXRlcnMucHVzaF90YWlsKHBhcmFtKTsKKyAgIH0KKworICAgaXJfZnVuY3Rpb24gKmYgPSBzdGF0ZS0+c3ltYm9scy0+Z2V0X2Z1bmN0aW9uKG5hbWUtPnZhbHVlKCkpOworICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiZm91bmQgY2FsbCB0byB1bmRlZmluZWQgZnVuY3Rpb24gJXMiLAorCQkgICAgbmFtZS0+dmFsdWUoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpjYWxsZWUgPSBmLT5tYXRjaGluZ19zaWduYXR1cmUoc3RhdGUsICZwYXJhbWV0ZXJzKTsKKyAgIGlmIChjYWxsZWUgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiY291bGRuJ3QgZmluZCBtYXRjaGluZyBzaWduYXR1cmUgZm9yIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgIiVzIiwgbmFtZS0+dmFsdWUoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKGNhbGxlZS0+cmV0dXJuX3R5cGUgPT0gZ2xzbF90eXBlOjp2b2lkX3R5cGUgJiYgcmV0dXJuX2RlcmVmKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJjYWxsIGhhcyByZXR1cm4gdmFsdWUgc3RvcmFnZSBidXQgdm9pZCB0eXBlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0gZWxzZSBpZiAoY2FsbGVlLT5yZXR1cm5fdHlwZSAhPSBnbHNsX3R5cGU6OnZvaWRfdHlwZSAmJiAhcmV0dXJuX2RlcmVmKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJjYWxsIGhhcyBub24tdm9pZCB0eXBlIGJ1dCBubyByZXR1cm4gdmFsdWUgc3RvcmFnZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY2FsbChjYWxsZWUsIHJldHVybl9kZXJlZiwgJnBhcmFtZXRlcnMpOworfQorCitpcl9leHByZXNzaW9uICoKK2lyX3JlYWRlcjo6cmVhZF9leHByZXNzaW9uKHNfZXhwcmVzc2lvbiAqZXhwcikKK3sKKyAgIHNfZXhwcmVzc2lvbiAqc190eXBlOworICAgc19zeW1ib2wgKnNfb3A7CisgICBzX2V4cHJlc3Npb24gKnNfYXJnWzRdID0ge05VTEx9OworCisgICBzX3BhdHRlcm4gcGF0W10gPSB7ICJleHByZXNzaW9uIiwgc190eXBlLCBzX29wLCBzX2FyZ1swXSB9OworICAgaWYgKCFQQVJUSUFMX01BVENIKGV4cHIsIHBhdCkpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImV4cGVjdGVkIChleHByZXNzaW9uIDx0eXBlPiA8b3BlcmF0b3I+ICIKKwkJCSAgIjxvcGVyYW5kPiBbPG9wZXJhbmQ+XSBbPG9wZXJhbmQ+XSBbPG9wZXJhbmQ+XSkiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorICAgc19hcmdbMV0gPSAoc19leHByZXNzaW9uICopIHNfYXJnWzBdLT5uZXh0OyAvLyBtYXkgYmUgdGFpbCBzZW50aW5lbAorICAgc19hcmdbMl0gPSAoc19leHByZXNzaW9uICopIHNfYXJnWzFdLT5uZXh0OyAvLyBtYXkgYmUgdGFpbCBzZW50aW5lbCBvciBOVUxMCisgICBpZiAoc19hcmdbMl0pCisgICAgICBzX2FyZ1szXSA9IChzX2V4cHJlc3Npb24gKikgc19hcmdbMl0tPm5leHQ7IC8vIG1heSBiZSB0YWlsIHNlbnRpbmVsIG9yIE5VTEwKKworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlID0gcmVhZF90eXBlKHNfdHlwZSk7CisgICBpZiAodHlwZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIC8qIFJlYWQgdGhlIG9wZXJhdG9yICovCisgICBpcl9leHByZXNzaW9uX29wZXJhdGlvbiBvcCA9IGlyX2V4cHJlc3Npb246OmdldF9vcGVyYXRvcihzX29wLT52YWx1ZSgpKTsKKyAgIGlmIChvcCA9PSAoaXJfZXhwcmVzc2lvbl9vcGVyYXRpb24pIC0xKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJpbnZhbGlkIG9wZXJhdG9yOiAlcyIsIHNfb3AtPnZhbHVlKCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisgICAgCisgICBpbnQgbnVtX29wZXJhbmRzID0gLTM7IC8qIHNraXAgImV4cHJlc3Npb24iIDx0eXBlPiA8b3BlcmF0aW9uPiAqLworICAgZm9yZWFjaF9saXN0KG4sICYoKHNfbGlzdCAqKSBleHByKS0+c3ViZXhwcmVzc2lvbnMpCisgICAgICArK251bV9vcGVyYW5kczsKKworICAgaW50IGV4cGVjdGVkX29wZXJhbmRzID0gaXJfZXhwcmVzc2lvbjo6Z2V0X251bV9vcGVyYW5kcyhvcCk7CisgICBpZiAobnVtX29wZXJhbmRzICE9IGV4cGVjdGVkX29wZXJhbmRzKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJmb3VuZCAlZCBleHByZXNzaW9uIG9wZXJhbmRzLCBleHBlY3RlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIG51bV9vcGVyYW5kcywgZXhwZWN0ZWRfb3BlcmFuZHMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlyX3J2YWx1ZSAqYXJnWzRdID0ge05VTEx9OworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fb3BlcmFuZHM7IGkrKykgeworICAgICAgYXJnW2ldID0gcmVhZF9ydmFsdWUoc19hcmdbaV0pOworICAgICAgaWYgKGFyZ1tpXSA9PSBOVUxMKSB7CisgICAgICAgICBpcl9yZWFkX2Vycm9yKE5VTEwsICJ3aGVuIHJlYWRpbmcgb3BlcmFuZCAjJWQgb2YgJXMiLCBpLCBzX29wLT52YWx1ZSgpKTsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24ob3AsIHR5cGUsIGFyZ1swXSwgYXJnWzFdLCBhcmdbMl0sIGFyZ1szXSk7Cit9CisKK2lyX3N3aXp6bGUgKgoraXJfcmVhZGVyOjpyZWFkX3N3aXp6bGUoc19leHByZXNzaW9uICpleHByKQoreworICAgc19zeW1ib2wgKnN3aXo7CisgICBzX2V4cHJlc3Npb24gKnN1YjsKKworICAgc19wYXR0ZXJuIHBhdFtdID0geyAic3dpeiIsIHN3aXosIHN1YiB9OworICAgaWYgKCFNQVRDSChleHByLCBwYXQpKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKGV4cHIsICJleHBlY3RlZCAoc3dpeiA8c3dpenpsZT4gPHJ2YWx1ZT4pIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKHN0cmxlbihzd2l6LT52YWx1ZSgpKSA+IDQpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImV4cGVjdGVkIGEgdmFsaWQgc3dpenpsZTsgZm91bmQgJXMiLCBzd2l6LT52YWx1ZSgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpcl9ydmFsdWUgKnJ2YWx1ZSA9IHJlYWRfcnZhbHVlKHN1Yik7CisgICBpZiAocnZhbHVlID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaXJfc3dpenpsZSAqaXIgPSBpcl9zd2l6emxlOjpjcmVhdGUocnZhbHVlLCBzd2l6LT52YWx1ZSgpLAorCQkJCSAgICAgICBydmFsdWUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICBpZiAoaXIgPT0gTlVMTCkKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImludmFsaWQgc3dpenpsZSIpOworCisgICByZXR1cm4gaXI7Cit9CisKK2lyX2NvbnN0YW50ICoKK2lyX3JlYWRlcjo6cmVhZF9jb25zdGFudChzX2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBzX2V4cHJlc3Npb24gKnR5cGVfZXhwcjsKKyAgIHNfbGlzdCAqdmFsdWVzOworCisgICBzX3BhdHRlcm4gcGF0W10gPSB7ICJjb25zdGFudCIsIHR5cGVfZXhwciwgdmFsdWVzIH07CisgICBpZiAoIU1BVENIKGV4cHIsIHBhdCkpIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoZXhwciwgImV4cGVjdGVkIChjb25zdGFudCA8dHlwZT4gKC4uLikpIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlID0gcmVhZF90eXBlKHR5cGVfZXhwcik7CisgICBpZiAodHlwZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihleHByLCAiZXhwZWN0ZWQgKGNvbnN0YW50IDx0eXBlPiAoLi4uKSkiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpZiAodHlwZS0+aXNfYXJyYXkoKSkgeworICAgICAgdW5zaWduZWQgZWxlbWVudHNfc3VwcGxpZWQgPSAwOworICAgICAgZXhlY19saXN0IGVsZW1lbnRzOworICAgICAgZm9yZWFjaF9saXN0KG4sICZ2YWx1ZXMtPnN1YmV4cHJlc3Npb25zKSB7CisJIHNfZXhwcmVzc2lvbiAqZWx0ID0gKHNfZXhwcmVzc2lvbiAqKSBuOworCSBpcl9jb25zdGFudCAqaXJfZWx0ID0gcmVhZF9jb25zdGFudChlbHQpOworCSBpZiAoaXJfZWx0ID09IE5VTEwpCisJICAgIHJldHVybiBOVUxMOworCSBlbGVtZW50cy5wdXNoX3RhaWwoaXJfZWx0KTsKKwkgZWxlbWVudHNfc3VwcGxpZWQrKzsKKyAgICAgIH0KKworICAgICAgaWYgKGVsZW1lbnRzX3N1cHBsaWVkICE9IHR5cGUtPmxlbmd0aCkgeworCSBpcl9yZWFkX2Vycm9yKHZhbHVlcywgImV4cGVjdGVkIGV4YWN0bHkgJXUgYXJyYXkgZWxlbWVudHMsICIKKwkJICAgICAgICJnaXZlbiAldSIsIHR5cGUtPmxlbmd0aCwgZWxlbWVudHNfc3VwcGxpZWQpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQodHlwZSwgJmVsZW1lbnRzKTsKKyAgIH0KKworICAgaXJfY29uc3RhbnRfZGF0YSBkYXRhID0geyB7IDAgfSB9OworCisgICAvLyBSZWFkIGluIGxpc3Qgb2YgdmFsdWVzIChhdCBtb3N0IDE2KS4KKyAgIHVuc2lnbmVkIGsgPSAwOworICAgZm9yZWFjaF9saXN0KG4sICZ2YWx1ZXMtPnN1YmV4cHJlc3Npb25zKSB7CisgICAgICBpZiAoayA+PSAxNikgeworCSBpcl9yZWFkX2Vycm9yKHZhbHVlcywgImV4cGVjdGVkIGF0IG1vc3QgMTYgbnVtYmVycyIpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgc19leHByZXNzaW9uICpleHByID0gKHNfZXhwcmVzc2lvbiAqKSBuOworCisgICAgICBpZiAodHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCkgeworCSBzX251bWJlciAqdmFsdWUgPSBTWF9BU19OVU1CRVIoZXhwcik7CisJIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisJICAgIGlyX3JlYWRfZXJyb3IodmFsdWVzLCAiZXhwZWN0ZWQgbnVtYmVycyIpOworCSAgICByZXR1cm4gTlVMTDsKKwkgfQorCSBkYXRhLmZba10gPSB2YWx1ZS0+ZnZhbHVlKCk7CisgICAgICB9IGVsc2UgeworCSBzX2ludCAqdmFsdWUgPSBTWF9BU19JTlQoZXhwcik7CisJIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisJICAgIGlyX3JlYWRfZXJyb3IodmFsdWVzLCAiZXhwZWN0ZWQgaW50ZWdlcnMiKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJIH0KKworCSBzd2l0Y2ggKHR5cGUtPmJhc2VfdHlwZSkgeworCSBjYXNlIEdMU0xfVFlQRV9VSU5UOiB7CisJICAgIGRhdGEudVtrXSA9IHZhbHVlLT52YWx1ZSgpOworCSAgICBicmVhazsKKwkgfQorCSBjYXNlIEdMU0xfVFlQRV9JTlQ6IHsKKwkgICAgZGF0YS5pW2tdID0gdmFsdWUtPnZhbHVlKCk7CisJICAgIGJyZWFrOworCSB9CisJIGNhc2UgR0xTTF9UWVBFX0JPT0w6IHsKKwkgICAgZGF0YS5iW2tdID0gdmFsdWUtPnZhbHVlKCk7CisJICAgIGJyZWFrOworCSB9CisJIGRlZmF1bHQ6CisJICAgIGlyX3JlYWRfZXJyb3IodmFsdWVzLCAidW5zdXBwb3J0ZWQgY29uc3RhbnQgdHlwZSIpOworCSAgICByZXR1cm4gTlVMTDsKKwkgfQorICAgICAgfQorICAgICAgKytrOworICAgfQorICAgaWYgKGsgIT0gdHlwZS0+Y29tcG9uZW50cygpKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKHZhbHVlcywgImV4cGVjdGVkICV1IGNvbnN0YW50IHZhbHVlcywgZm91bmQgJXUiLAorCQkgICAgdHlwZS0+Y29tcG9uZW50cygpLCBrKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KHR5cGUsICZkYXRhKTsKK30KKworaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKgoraXJfcmVhZGVyOjpyZWFkX3Zhcl9yZWYoc19leHByZXNzaW9uICpleHByKQoreworICAgc19zeW1ib2wgKnNfdmFyOworICAgc19wYXR0ZXJuIHZhcl9wYXRbXSA9IHsgInZhcl9yZWYiLCBzX3ZhciB9OworCisgICBpZiAoTUFUQ0goZXhwciwgdmFyX3BhdCkpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSBzdGF0ZS0+c3ltYm9scy0+Z2V0X3ZhcmlhYmxlKHNfdmFyLT52YWx1ZSgpKTsKKyAgICAgIGlmICh2YXIgPT0gTlVMTCkgeworCSBpcl9yZWFkX2Vycm9yKGV4cHIsICJ1bmRlY2xhcmVkIHZhcmlhYmxlOiAlcyIsIHNfdmFyLT52YWx1ZSgpKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICB9CisgICByZXR1cm4gTlVMTDsKK30KKworaXJfZGVyZWZlcmVuY2UgKgoraXJfcmVhZGVyOjpyZWFkX2RlcmVmZXJlbmNlKHNfZXhwcmVzc2lvbiAqZXhwcikKK3sKKyAgIHNfZXhwcmVzc2lvbiAqc19zdWJqZWN0OworICAgc19leHByZXNzaW9uICpzX2luZGV4OworICAgc19zeW1ib2wgKnNfZmllbGQ7CisKKyAgIHNfcGF0dGVybiBhcnJheV9wYXRbXSA9IHsgImFycmF5X3JlZiIsIHNfc3ViamVjdCwgc19pbmRleCB9OworICAgc19wYXR0ZXJuIHJlY29yZF9wYXRbXSA9IHsgInJlY29yZF9yZWYiLCBzX3N1YmplY3QsIHNfZmllbGQgfTsKKworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnZhcl9yZWYgPSByZWFkX3Zhcl9yZWYoZXhwcik7CisgICBpZiAodmFyX3JlZiAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gdmFyX3JlZjsKKyAgIH0gZWxzZSBpZiAoTUFUQ0goZXhwciwgYXJyYXlfcGF0KSkgeworICAgICAgaXJfcnZhbHVlICpzdWJqZWN0ID0gcmVhZF9ydmFsdWUoc19zdWJqZWN0KTsKKyAgICAgIGlmIChzdWJqZWN0ID09IE5VTEwpIHsKKwkgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIHRoZSBzdWJqZWN0IG9mIGFuIGFycmF5X3JlZiIpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgaXJfcnZhbHVlICppZHggPSByZWFkX3J2YWx1ZShzX2luZGV4KTsKKyAgICAgIGlmIChpZHggPT0gTlVMTCkgeworCSBpcl9yZWFkX2Vycm9yKE5VTEwsICJ3aGVuIHJlYWRpbmcgdGhlIGluZGV4IG9mIGFuIGFycmF5X3JlZiIpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkoc3ViamVjdCwgaWR4KTsKKyAgIH0gZWxzZSBpZiAoTUFUQ0goZXhwciwgcmVjb3JkX3BhdCkpIHsKKyAgICAgIGlyX3J2YWx1ZSAqc3ViamVjdCA9IHJlYWRfcnZhbHVlKHNfc3ViamVjdCk7CisgICAgICBpZiAoc3ViamVjdCA9PSBOVUxMKSB7CisJIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyB0aGUgc3ViamVjdCBvZiBhIHJlY29yZF9yZWYiKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3JlY29yZChzdWJqZWN0LCBzX2ZpZWxkLT52YWx1ZSgpKTsKKyAgIH0KKyAgIHJldHVybiBOVUxMOworfQorCitpcl90ZXh0dXJlICoKK2lyX3JlYWRlcjo6cmVhZF90ZXh0dXJlKHNfZXhwcmVzc2lvbiAqZXhwcikKK3sKKyAgIHNfc3ltYm9sICp0YWcgPSBOVUxMOworICAgc19leHByZXNzaW9uICpzX3R5cGUgPSBOVUxMOworICAgc19leHByZXNzaW9uICpzX3NhbXBsZXIgPSBOVUxMOworICAgc19leHByZXNzaW9uICpzX2Nvb3JkID0gTlVMTDsKKyAgIHNfZXhwcmVzc2lvbiAqc19vZmZzZXQgPSBOVUxMOworICAgc19leHByZXNzaW9uICpzX3Byb2ogPSBOVUxMOworICAgc19saXN0ICpzX3NoYWRvdyA9IE5VTEw7CisgICBzX2V4cHJlc3Npb24gKnNfbG9kID0gTlVMTDsKKyAgIHNfZXhwcmVzc2lvbiAqc19zYW1wbGVfaW5kZXggPSBOVUxMOworICAgc19leHByZXNzaW9uICpzX2NvbXBvbmVudCA9IE5VTEw7CisKKyAgIGlyX3RleHR1cmVfb3Bjb2RlIG9wID0gaXJfdGV4OyAvKiBzaWxlbmNlIHdhcm5pbmcgKi8KKworICAgc19wYXR0ZXJuIHRleF9wYXR0ZXJuW10gPQorICAgICAgeyAidGV4Iiwgc190eXBlLCBzX3NhbXBsZXIsIHNfY29vcmQsIHNfb2Zmc2V0LCBzX3Byb2osIHNfc2hhZG93IH07CisgICBzX3BhdHRlcm4gbG9kX3BhdHRlcm5bXSA9CisgICAgICB7ICJsb2QiLCBzX3R5cGUsIHNfc2FtcGxlciwgc19jb29yZCB9OworICAgc19wYXR0ZXJuIHR4Zl9wYXR0ZXJuW10gPQorICAgICAgeyAidHhmIiwgc190eXBlLCBzX3NhbXBsZXIsIHNfY29vcmQsIHNfb2Zmc2V0LCBzX2xvZCB9OworICAgc19wYXR0ZXJuIHR4Zl9tc19wYXR0ZXJuW10gPQorICAgICAgeyAidHhmX21zIiwgc190eXBlLCBzX3NhbXBsZXIsIHNfY29vcmQsIHNfc2FtcGxlX2luZGV4IH07CisgICBzX3BhdHRlcm4gdHhzX3BhdHRlcm5bXSA9CisgICAgICB7ICJ0eHMiLCBzX3R5cGUsIHNfc2FtcGxlciwgc19sb2QgfTsKKyAgIHNfcGF0dGVybiB0ZzRfcGF0dGVybltdID0KKyAgICAgIHsgInRnNCIsIHNfdHlwZSwgc19zYW1wbGVyLCBzX2Nvb3JkLCBzX29mZnNldCwgc19jb21wb25lbnQgfTsKKyAgIHNfcGF0dGVybiBxdWVyeV9sZXZlbHNfcGF0dGVybltdID0KKyAgICAgIHsgInF1ZXJ5X2xldmVscyIsIHNfdHlwZSwgc19zYW1wbGVyIH07CisgICBzX3BhdHRlcm4gb3RoZXJfcGF0dGVybltdID0KKyAgICAgIHsgdGFnLCBzX3R5cGUsIHNfc2FtcGxlciwgc19jb29yZCwgc19vZmZzZXQsIHNfcHJvaiwgc19zaGFkb3csIHNfbG9kIH07CisKKyAgIGlmIChNQVRDSChleHByLCBsb2RfcGF0dGVybikpIHsKKyAgICAgIG9wID0gaXJfbG9kOworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCB0ZXhfcGF0dGVybikpIHsKKyAgICAgIG9wID0gaXJfdGV4OworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCB0eGZfcGF0dGVybikpIHsKKyAgICAgIG9wID0gaXJfdHhmOworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCB0eGZfbXNfcGF0dGVybikpIHsKKyAgICAgIG9wID0gaXJfdHhmX21zOworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCB0eHNfcGF0dGVybikpIHsKKyAgICAgIG9wID0gaXJfdHhzOworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCB0ZzRfcGF0dGVybikpIHsKKyAgICAgIG9wID0gaXJfdGc0OworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCBxdWVyeV9sZXZlbHNfcGF0dGVybikpIHsKKyAgICAgIG9wID0gaXJfcXVlcnlfbGV2ZWxzOworICAgfSBlbHNlIGlmIChNQVRDSChleHByLCBvdGhlcl9wYXR0ZXJuKSkgeworICAgICAgb3AgPSBpcl90ZXh0dXJlOjpnZXRfb3Bjb2RlKHRhZy0+dmFsdWUoKSk7CisgICAgICBpZiAob3AgPT0gLTEpCisJIHJldHVybiBOVUxMOworICAgfSBlbHNlIHsKKyAgICAgIGlyX3JlYWRfZXJyb3IoTlVMTCwgInVuZXhwZWN0ZWQgdGV4dHVyZSBwYXR0ZXJuICVzIiwgdGFnLT52YWx1ZSgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpcl90ZXh0dXJlICp0ZXggPSBuZXcobWVtX2N0eCkgaXJfdGV4dHVyZShvcCk7CisKKyAgIC8vIFJlYWQgcmV0dXJuIHR5cGUKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9IHJlYWRfdHlwZShzX3R5cGUpOworICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIHR5cGUgaW4gKCVzIC4uLikiLAorCQkgICAgdGV4LT5vcGNvZGVfc3RyaW5nKCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIC8vIFJlYWQgc2FtcGxlciAobXVzdCBiZSBhIGRlcmVmKQorICAgaXJfZGVyZWZlcmVuY2UgKnNhbXBsZXIgPSByZWFkX2RlcmVmZXJlbmNlKHNfc2FtcGxlcik7CisgICBpZiAoc2FtcGxlciA9PSBOVUxMKSB7CisgICAgICBpcl9yZWFkX2Vycm9yKE5VTEwsICJ3aGVuIHJlYWRpbmcgc2FtcGxlciBpbiAoJXMgLi4uKSIsCisJCSAgICB0ZXgtPm9wY29kZV9zdHJpbmcoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIHRleC0+c2V0X3NhbXBsZXIoc2FtcGxlciwgdHlwZSk7CisKKyAgIGlmIChvcCAhPSBpcl90eHMpIHsKKyAgICAgIC8vIFJlYWQgY29vcmRpbmF0ZSAoYW55IHJ2YWx1ZSkKKyAgICAgIHRleC0+Y29vcmRpbmF0ZSA9IHJlYWRfcnZhbHVlKHNfY29vcmQpOworICAgICAgaWYgKHRleC0+Y29vcmRpbmF0ZSA9PSBOVUxMKSB7CisJIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyBjb29yZGluYXRlIGluICglcyAuLi4pIiwKKwkJICAgICAgIHRleC0+b3Bjb2RlX3N0cmluZygpKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChvcCAhPSBpcl90eGZfbXMgJiYgb3AgIT0gaXJfbG9kKSB7CisgICAgICAgICAvLyBSZWFkIHRleGVsIG9mZnNldCAtIGVpdGhlciAwIG9yIGFuIHJ2YWx1ZS4KKyAgICAgICAgIHNfaW50ICpzaV9vZmZzZXQgPSBTWF9BU19JTlQoc19vZmZzZXQpOworICAgICAgICAgaWYgKHNpX29mZnNldCA9PSBOVUxMIHx8IHNpX29mZnNldC0+dmFsdWUoKSAhPSAwKSB7CisgICAgICAgICAgICB0ZXgtPm9mZnNldCA9IHJlYWRfcnZhbHVlKHNfb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICh0ZXgtPm9mZnNldCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICBpcl9yZWFkX2Vycm9yKHNfb2Zmc2V0LCAiZXhwZWN0ZWQgMCBvciBhbiBleHByZXNzaW9uIik7CisgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYgKG9wICE9IGlyX3R4ZiAmJiBvcCAhPSBpcl90eGZfbXMgJiYKKyAgICAgICBvcCAhPSBpcl90eHMgJiYgb3AgIT0gaXJfbG9kICYmIG9wICE9IGlyX3RnNCAmJgorICAgICAgIG9wICE9IGlyX3F1ZXJ5X2xldmVscykgeworICAgICAgc19pbnQgKnByb2pfYXNfaW50ID0gU1hfQVNfSU5UKHNfcHJvaik7CisgICAgICBpZiAocHJval9hc19pbnQgJiYgcHJval9hc19pbnQtPnZhbHVlKCkgPT0gMSkgeworCSB0ZXgtPnByb2plY3RvciA9IE5VTEw7CisgICAgICB9IGVsc2UgeworCSB0ZXgtPnByb2plY3RvciA9IHJlYWRfcnZhbHVlKHNfcHJvaik7CisJIGlmICh0ZXgtPnByb2plY3RvciA9PSBOVUxMKSB7CisJICAgIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyBwcm9qZWN0aXZlIGRpdmlkZSBpbiAoJXMgLi4pIiwKKwkgICAgICAgICAgICAgICAgICB0ZXgtPm9wY29kZV9zdHJpbmcoKSk7CisJICAgIHJldHVybiBOVUxMOworCSB9CisgICAgICB9CisKKyAgICAgIGlmIChzX3NoYWRvdy0+c3ViZXhwcmVzc2lvbnMuaXNfZW1wdHkoKSkgeworCSB0ZXgtPnNoYWRvd19jb21wYXJpdG9yID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisJIHRleC0+c2hhZG93X2NvbXBhcml0b3IgPSByZWFkX3J2YWx1ZShzX3NoYWRvdyk7CisJIGlmICh0ZXgtPnNoYWRvd19jb21wYXJpdG9yID09IE5VTEwpIHsKKwkgICAgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIHNoYWRvdyBjb21wYXJpdG9yIGluICglcyAuLikiLAorCQkJICB0ZXgtPm9wY29kZV9zdHJpbmcoKSk7CisJICAgIHJldHVybiBOVUxMOworCSB9CisgICAgICB9CisgICB9CisKKyAgIHN3aXRjaCAob3ApIHsKKyAgIGNhc2UgaXJfdHhiOgorICAgICAgdGV4LT5sb2RfaW5mby5iaWFzID0gcmVhZF9ydmFsdWUoc19sb2QpOworICAgICAgaWYgKHRleC0+bG9kX2luZm8uYmlhcyA9PSBOVUxMKSB7CisJIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyBMT0QgYmlhcyBpbiAodHhiIC4uLikiKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhsOgorICAgY2FzZSBpcl90eGY6CisgICBjYXNlIGlyX3R4czoKKyAgICAgIHRleC0+bG9kX2luZm8ubG9kID0gcmVhZF9ydmFsdWUoc19sb2QpOworICAgICAgaWYgKHRleC0+bG9kX2luZm8ubG9kID09IE5VTEwpIHsKKwkgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIExPRCBpbiAoJXMgLi4uKSIsCisJCSAgICAgICB0ZXgtPm9wY29kZV9zdHJpbmcoKSk7CisJIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4Zl9tczoKKyAgICAgIHRleC0+bG9kX2luZm8uc2FtcGxlX2luZGV4ID0gcmVhZF9ydmFsdWUoc19zYW1wbGVfaW5kZXgpOworICAgICAgaWYgKHRleC0+bG9kX2luZm8uc2FtcGxlX2luZGV4ID09IE5VTEwpIHsKKyAgICAgICAgIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyBzYW1wbGVfaW5kZXggaW4gKHR4Zl9tcyAuLi4pIik7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6IHsKKyAgICAgIHNfZXhwcmVzc2lvbiAqc19keCwgKnNfZHk7CisgICAgICBzX3BhdHRlcm4gZHhkeV9wYXRbXSA9IHsgc19keCwgc19keSB9OworICAgICAgaWYgKCFNQVRDSChzX2xvZCwgZHhkeV9wYXQpKSB7CisJIGlyX3JlYWRfZXJyb3Ioc19sb2QsICJleHBlY3RlZCAoZFBkeCBkUGR5KSBpbiAodHhkIC4uLikiKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICB0ZXgtPmxvZF9pbmZvLmdyYWQuZFBkeCA9IHJlYWRfcnZhbHVlKHNfZHgpOworICAgICAgaWYgKHRleC0+bG9kX2luZm8uZ3JhZC5kUGR4ID09IE5VTEwpIHsKKwkgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIGRQZHggaW4gKHR4ZCAuLi4pIik7CisJIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgdGV4LT5sb2RfaW5mby5ncmFkLmRQZHkgPSByZWFkX3J2YWx1ZShzX2R5KTsKKyAgICAgIGlmICh0ZXgtPmxvZF9pbmZvLmdyYWQuZFBkeSA9PSBOVUxMKSB7CisJIGlyX3JlYWRfZXJyb3IoTlVMTCwgIndoZW4gcmVhZGluZyBkUGR5IGluICh0eGQgLi4uKSIpOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorICAgY2FzZSBpcl90ZzQ6CisgICAgICB0ZXgtPmxvZF9pbmZvLmNvbXBvbmVudCA9IHJlYWRfcnZhbHVlKHNfY29tcG9uZW50KTsKKyAgICAgIGlmICh0ZXgtPmxvZF9pbmZvLmNvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgICBpcl9yZWFkX2Vycm9yKE5VTEwsICJ3aGVuIHJlYWRpbmcgY29tcG9uZW50IGluICh0ZzQgLi4uKSIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICAvLyB0ZXggYW5kIGxvZCBkb24ndCBoYXZlIGFueSBleHRyYSBwYXJhbWV0ZXJzLgorICAgICAgYnJlYWs7CisgICB9OworICAgcmV0dXJuIHRleDsKK30KKworaXJfZW1pdF92ZXJ0ZXggKgoraXJfcmVhZGVyOjpyZWFkX2VtaXRfdmVydGV4KHNfZXhwcmVzc2lvbiAqZXhwcikKK3sKKyAgIHNfcGF0dGVybiBwYXRbXSA9IHsgImVtaXQtdmVydGV4IiB9OworCisgICBpZiAoTUFUQ0goZXhwciwgcGF0KSkgeworICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9lbWl0X3ZlcnRleCgpOworICAgfQorICAgaXJfcmVhZF9lcnJvcihOVUxMLCAid2hlbiByZWFkaW5nIGVtaXQtdmVydGV4Iik7CisgICByZXR1cm4gTlVMTDsKK30KKworaXJfZW5kX3ByaW1pdGl2ZSAqCitpcl9yZWFkZXI6OnJlYWRfZW5kX3ByaW1pdGl2ZShzX2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBzX3BhdHRlcm4gcGF0W10gPSB7ICJlbmQtcHJpbWl0aXZlIiB9OworCisgICBpZiAoTUFUQ0goZXhwciwgcGF0KSkgeworICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9lbmRfcHJpbWl0aXZlKCk7CisgICB9CisgICBpcl9yZWFkX2Vycm9yKE5VTEwsICJ3aGVuIHJlYWRpbmcgZW5kLXByaW1pdGl2ZSIpOworICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3JlYWRlci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9yZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYyY2EyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9yZWFkZXIuaApAQCAtMCwwICsxLDM0IEBACisvKiAtKi0gYysrIC0qLSAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBJUl9SRUFERVJfSAorI2RlZmluZSBJUl9SRUFERVJfSAorCisjaW5jbHVkZSAiaXIuaCIKKwordm9pZCBfbWVzYV9nbHNsX3JlYWRfaXIoX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUsIGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJY29uc3QgY2hhciAqc3JjLCBib29sIHNjYW5fZm9yX3Byb3RvdHlwZXMpOworCisjZW5kaWYgLyogSVJfUkVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfcnZhbHVlX3Zpc2l0b3IuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9ydmFsdWVfdmlzaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZTk0NAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfcnZhbHVlX3Zpc2l0b3IuY3BwCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBpcl9ydmFsdWVfdmlzaXRvci5jcHAKKyAqCisgKiBHZW5lcmljIGNsYXNzIHRvIGltcGxlbWVudCB0aGUgY29tbW9uIHBhdHRlcm4gd2UgaGF2ZSBvZiB3YW50aW5nIHRvCisgKiB2aXNpdCBlYWNoIGlyX3J2YWx1ZSAqIGFuZCBwb3NzaWJseSBjaGFuZ2UgdGhhdCBub2RlIHRvIGEgZGlmZmVyZW50CisgKiBjbGFzcy4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfcnZhbHVlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9ydmFsdWVfYmFzZV92aXNpdG9yOjpydmFsdWVfdmlzaXQoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICB1bnNpZ25lZCBpbnQgb3BlcmFuZDsKKworICAgZm9yIChvcGVyYW5kID0gMDsgb3BlcmFuZCA8IGlyLT5nZXRfbnVtX29wZXJhbmRzKCk7IG9wZXJhbmQrKykgeworICAgICAgaGFuZGxlX3J2YWx1ZSgmaXItPm9wZXJhbmRzW29wZXJhbmRdKTsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX2Jhc2VfdmlzaXRvcjo6cnZhbHVlX3Zpc2l0KGlyX3RleHR1cmUgKmlyKQoreworICAgaGFuZGxlX3J2YWx1ZSgmaXItPmNvb3JkaW5hdGUpOworICAgaGFuZGxlX3J2YWx1ZSgmaXItPnByb2plY3Rvcik7CisgICBoYW5kbGVfcnZhbHVlKCZpci0+c2hhZG93X2NvbXBhcml0b3IpOworICAgaGFuZGxlX3J2YWx1ZSgmaXItPm9mZnNldCk7CisKKyAgIHN3aXRjaCAoaXItPm9wKSB7CisgICBjYXNlIGlyX3RleDoKKyAgIGNhc2UgaXJfbG9kOgorICAgY2FzZSBpcl9xdWVyeV9sZXZlbHM6CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhiOgorICAgICAgaGFuZGxlX3J2YWx1ZSgmaXItPmxvZF9pbmZvLmJpYXMpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4ZjoKKyAgIGNhc2UgaXJfdHhsOgorICAgY2FzZSBpcl90eHM6CisgICAgICBoYW5kbGVfcnZhbHVlKCZpci0+bG9kX2luZm8ubG9kKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGZfbXM6CisgICAgICBoYW5kbGVfcnZhbHVlKCZpci0+bG9kX2luZm8uc2FtcGxlX2luZGV4KTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGQ6CisgICAgICBoYW5kbGVfcnZhbHVlKCZpci0+bG9kX2luZm8uZ3JhZC5kUGR4KTsKKyAgICAgIGhhbmRsZV9ydmFsdWUoJmlyLT5sb2RfaW5mby5ncmFkLmRQZHkpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3RnNDoKKyAgICAgIGhhbmRsZV9ydmFsdWUoJmlyLT5sb2RfaW5mby5jb21wb25lbnQpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV9iYXNlX3Zpc2l0b3I6OnJ2YWx1ZV92aXNpdChpcl9zd2l6emxlICppcikKK3sKKyAgIGhhbmRsZV9ydmFsdWUoJmlyLT52YWwpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX2Jhc2VfdmlzaXRvcjo6cnZhbHVlX3Zpc2l0KGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKK3sKKyAgIC8qIFRoZSBhcnJheSBpbmRleCBpcyBub3QgdGhlIHRhcmdldCBvZiB0aGUgYXNzaWdubWVudCwgc28gY2xlYXIgdGhlCisgICAgKiAnaW5fYXNzaWduZWUnIGZsYWcuICBSZXN0b3JlIGl0IGFmdGVyIHJldHVybmluZyBmcm9tIHRoZSBhcnJheSBpbmRleC4KKyAgICAqLworICAgY29uc3QgYm9vbCB3YXNfaW5fYXNzaWduZWUgPSB0aGlzLT5pbl9hc3NpZ25lZTsKKyAgIHRoaXMtPmluX2Fzc2lnbmVlID0gZmFsc2U7CisgICBoYW5kbGVfcnZhbHVlKCZpci0+YXJyYXlfaW5kZXgpOworICAgdGhpcy0+aW5fYXNzaWduZWUgPSB3YXNfaW5fYXNzaWduZWU7CisKKyAgIGhhbmRsZV9ydmFsdWUoJmlyLT5hcnJheSk7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9ydmFsdWVfYmFzZV92aXNpdG9yOjpydmFsdWVfdmlzaXQoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICppcikKK3sKKyAgIGhhbmRsZV9ydmFsdWUoJmlyLT5yZWNvcmQpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX2Jhc2VfdmlzaXRvcjo6cnZhbHVlX3Zpc2l0KGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgaGFuZGxlX3J2YWx1ZSgmaXItPnJocyk7CisgICBoYW5kbGVfcnZhbHVlKCZpci0+Y29uZGl0aW9uKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX2Jhc2VfdmlzaXRvcjo6cnZhbHVlX3Zpc2l0KGlyX2NhbGwgKmlyKQoreworICAgZm9yZWFjaF9saXN0X3NhZmUobiwgJmlyLT5hY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICpwYXJhbSA9IChpcl9ydmFsdWUgKikgbjsKKyAgICAgIGlyX3J2YWx1ZSAqbmV3X3BhcmFtID0gcGFyYW07CisgICAgICBoYW5kbGVfcnZhbHVlKCZuZXdfcGFyYW0pOworCisgICAgICBpZiAobmV3X3BhcmFtICE9IHBhcmFtKSB7CisJIHBhcmFtLT5yZXBsYWNlX3dpdGgobmV3X3BhcmFtKTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV9iYXNlX3Zpc2l0b3I6OnJ2YWx1ZV92aXNpdChpcl9yZXR1cm4gKmlyKQoreworICAgaGFuZGxlX3J2YWx1ZSgmaXItPnZhbHVlKTs7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9ydmFsdWVfYmFzZV92aXNpdG9yOjpydmFsdWVfdmlzaXQoaXJfaWYgKmlyKQoreworICAgaGFuZGxlX3J2YWx1ZSgmaXItPmNvbmRpdGlvbik7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9leHByZXNzaW9uICppcikKK3sKKyAgIHJldHVybiBydmFsdWVfdmlzaXQoaXIpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX3RleHR1cmUgKmlyKQoreworICAgcmV0dXJuIHJ2YWx1ZV92aXNpdChpcik7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9ydmFsdWVfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfc3dpenpsZSAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9kZXJlZmVyZW5jZV9hcnJheSAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmlyKQoreworICAgcmV0dXJuIHJ2YWx1ZV92aXNpdChpcik7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9ydmFsdWVfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9jYWxsICppcikKK3sKKyAgIHJldHVybiBydmFsdWVfdmlzaXQoaXIpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX3JldHVybiAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9pZiAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV9lbnRlcl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9leHByZXNzaW9uICppcikKK3sKKyAgIHJldHVybiBydmFsdWVfdmlzaXQoaXIpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX2VudGVyX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3RleHR1cmUgKmlyKQoreworICAgcmV0dXJuIHJ2YWx1ZV92aXNpdChpcik7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9ydmFsdWVfZW50ZXJfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfc3dpenpsZSAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV9lbnRlcl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9hcnJheSAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV9lbnRlcl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmlyKQoreworICAgcmV0dXJuIHJ2YWx1ZV92aXNpdChpcik7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9ydmFsdWVfZW50ZXJfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV9lbnRlcl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9jYWxsICppcikKK3sKKyAgIHJldHVybiBydmFsdWVfdmlzaXQoaXIpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfcnZhbHVlX2VudGVyX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3JldHVybiAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3J2YWx1ZV9lbnRlcl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9pZiAqaXIpCit7CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfc2VyaWFsaXplLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfc2VyaWFsaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzNmOWJkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9zZXJpYWxpemUuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKiAtKi0gYysrIC0qLSAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpcl9zZXJpYWxpemUuaCIKKworCisvKioKKyAqIFdyYXBzIHNlcmlhbGl6YXRpb24gb2YgYW4gaXIgaW5zdHJ1Y3Rpb24sIHdyaXRlcyBpcl90eXBlCisgKiBhbmQgbGVuZ3RoIG9mIGVhY2ggaW5zdHJ1Y3Rpb24gcGFja2FnZSBhcyBhIGhlYWRlciBmb3IgaXQKKyAqLwordm9pZAoraXJfaW5zdHJ1Y3Rpb246OnNlcmlhbGl6ZShtZW1vcnlfd3JpdGVyICZtZW0pCit7CisgICB1aW50MzJfdCBkYXRhX2xlbiA9IDA7CisgICB1aW50OF90IGlyX3R5cGUgPSB0aGlzLT5pcl90eXBlOworICAgbWVtLndyaXRlX3VpbnQ4X3QoaXJfdHlwZSk7CisKKyAgIHVuc2lnbmVkIHN0YXJ0X3BvcyA9IG1lbS5wb3NpdGlvbigpOworICAgbWVtLndyaXRlX3VpbnQzMl90KGRhdGFfbGVuKTsKKworICAgdGhpcy0+c2VyaWFsaXplX2RhdGEobWVtKTsKKworICAgZGF0YV9sZW4gPSBtZW0ucG9zaXRpb24oKSAtIHN0YXJ0X3BvcyAtIHNpemVvZihkYXRhX2xlbik7CisgICBtZW0ub3ZlcndyaXRlKCZkYXRhX2xlbiwgc2l6ZW9mKGRhdGFfbGVuKSwgc3RhcnRfcG9zKTsKK30KKworCisvKioKKyAqIFdyYXBzIHJ2YWx1ZSBzZXJpYWxpemF0aW9uLCBydmFsdWUgaGFzIGl0cyB0eXBlIG9yCisgKiBpcl90eXBlX3Vuc2V0IHdyaXR0ZW4gYmVmb3JlIGl0IHRvIGluZGljYXRlIGlmIHZhbHVlIGlzIE5VTEwKKyAqLworc3RhdGljIHZvaWQKK3NlcmlhbGl6ZV9ydmFsdWUoaXJfcnZhbHVlICp2YWwsIG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIHVpbnQ4X3QgaXJfdHlwZSA9IHZhbCA/IHZhbC0+aXJfdHlwZSA6IGlyX3R5cGVfdW5zZXQ7CisgICBtZW0ud3JpdGVfdWludDhfdChpcl90eXBlKTsKKworICAgaWYgKHZhbCkKKyAgICAgIHZhbC0+c2VyaWFsaXplKG1lbSk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uIG9mIGV4ZWNfbGlzdCwgd3JpdGVzIGxlbmd0aCBvZiB0aGUgbGlzdCArCisgKiBjYWxscyBzZXJpYWxpemVfZGF0YSBmb3IgZWFjaCBpbnN0cnVjdGlvbgorICovCit2b2lkCitzZXJpYWxpemVfbGlzdChleGVjX2xpc3QgKmxpc3QsIG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIHVpbnQzMl90IGxpc3RfbGVuID0gMDsKKworICAgdW5zaWduZWQgc3RhcnRfcG9zID0gbWVtLnBvc2l0aW9uKCk7CisgICBtZW0ud3JpdGVfdWludDMyX3QobGlzdF9sZW4pOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgbGlzdCkgeworICAgICAgKChpcl9pbnN0cnVjdGlvbiAqKW5vZGUpLT5zZXJpYWxpemUobWVtKTsKKyAgICAgIGxpc3RfbGVuKys7CisgICB9CisKKyAgIG1lbS5vdmVyd3JpdGUoJmxpc3RfbGVuLCBzaXplb2YobGlzdF9sZW4pLCBzdGFydF9wb3MpOworfQorCisKK3ZvaWQKK2lyX3ZhcmlhYmxlOjpzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pCit7CisgICAvKiBuYW1lIGNhbiBiZSBOVUxMLCBzZWUgaXJfcHJpbnRfdmlzaXRvciBmb3IgZXhwbGFuYXRpb24gKi8KKyAgIGNvbnN0IGNoYXIgKm5vbl9udWxsX25hbWUgPSBuYW1lID8gbmFtZSA6ICJwYXJhbWV0ZXIiOworICAgaW50NjRfdCB1bmlxdWVfaWQgPSAoaW50NjRfdCkgKGludHB0cl90KSB0aGlzOworICAgdWludDhfdCBtb2RlID0gZGF0YS5tb2RlOworICAgdWludDhfdCBoYXNfY29uc3RhbnRfdmFsdWUgPSBjb25zdGFudF92YWx1ZSA/IDEgOiAwOworICAgdWludDhfdCBoYXNfY29uc3RhbnRfaW5pdGlhbGl6ZXIgPSBjb25zdGFudF9pbml0aWFsaXplciA/IDEgOiAwOworCisgICB0eXBlLT5zZXJpYWxpemUobWVtKTsKKworICAgbWVtLndyaXRlX3N0cmluZyhub25fbnVsbF9uYW1lKTsKKyAgIG1lbS53cml0ZV9pbnQ2NF90KHVuaXF1ZV9pZCk7CisgICBtZW0ud3JpdGVfdWludDhfdChtb2RlKTsKKworICAgbWVtLndyaXRlKCZkYXRhLCBzaXplb2YoZGF0YSkpOworCisgICBtZW0ud3JpdGVfdWludDMyX3QobnVtX3N0YXRlX3Nsb3RzKTsKKyAgIG1lbS53cml0ZV91aW50OF90KGhhc19jb25zdGFudF92YWx1ZSk7CisgICBtZW0ud3JpdGVfdWludDhfdChoYXNfY29uc3RhbnRfaW5pdGlhbGl6ZXIpOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3N0YXRlX3Nsb3RzOyBpKyspIHsKKyAgICAgIG1lbS53cml0ZV9pbnQzMl90KHN0YXRlX3Nsb3RzW2ldLnN3aXp6bGUpOworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IDU7IGorKykgeworICAgICAgICAgbWVtLndyaXRlX2ludDMyX3Qoc3RhdGVfc2xvdHNbaV0udG9rZW5zW2pdKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGNvbnN0YW50X3ZhbHVlKQorICAgICAgY29uc3RhbnRfdmFsdWUtPnNlcmlhbGl6ZShtZW0pOworCisgICBpZiAoY29uc3RhbnRfaW5pdGlhbGl6ZXIpCisgICAgICBjb25zdGFudF9pbml0aWFsaXplci0+c2VyaWFsaXplKG1lbSk7CisKKyAgIHVpbnQ4X3QgaGFzX2ludGVyZmFjZV90eXBlID0gZ2V0X2ludGVyZmFjZV90eXBlKCkgPyAxIDogMDsKKworICAgbWVtLndyaXRlX3VpbnQ4X3QoaGFzX2ludGVyZmFjZV90eXBlKTsKKyAgIGlmIChoYXNfaW50ZXJmYWNlX3R5cGUpCisgICAgICBnZXRfaW50ZXJmYWNlX3R5cGUoKS0+c2VyaWFsaXplKG1lbSk7Cit9CisKKwordm9pZAoraXJfYXNzaWdubWVudDo6c2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKQoreworICAgdWludDhfdCBhc3NpZ25tZW50X21hc2sgPSB3cml0ZV9tYXNrOworICAgbWVtLndyaXRlX3VpbnQ4X3QoYXNzaWdubWVudF9tYXNrKTsKKworICAgc2VyaWFsaXplX3J2YWx1ZShsaHMsIG1lbSk7CisgICBzZXJpYWxpemVfcnZhbHVlKGNvbmRpdGlvbiwgbWVtKTsKKyAgIHNlcmlhbGl6ZV9ydmFsdWUocmhzLCBtZW0pOworfQorCisKK3ZvaWQKK2lyX2NhbGw6OnNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIG1lbS53cml0ZV9zdHJpbmcoY2FsbGVlX25hbWUoKSk7CisKKyAgIHVpbnQ4X3QgbGlzdF9sZW4gPSAwOworICAgdWludDhfdCB1c2VzX2J1aWx0aW4gPSB1c2VfYnVpbHRpbjsKKworICAgc2VyaWFsaXplX3J2YWx1ZShyZXR1cm5fZGVyZWYsIG1lbSk7CisKKyAgIHVuc2lnbmVkIHN0YXJ0X3BvcyA9IG1lbS5wb3NpdGlvbigpOworICAgbWVtLndyaXRlX3VpbnQ4X3QobGlzdF9sZW4pOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisgICAgICBzZXJpYWxpemVfcnZhbHVlKChpcl9ydmFsdWUqKW5vZGUsIG1lbSk7CisgICAgICBsaXN0X2xlbisrOworICAgfQorCisgICBtZW0ub3ZlcndyaXRlKCZsaXN0X2xlbiwgc2l6ZW9mKGxpc3RfbGVuKSwgc3RhcnRfcG9zKTsKKyAgIG1lbS53cml0ZV91aW50OF90KHVzZXNfYnVpbHRpbik7Cit9CisKKwordm9pZAoraXJfY29uc3RhbnQ6OnNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIHR5cGUtPnNlcmlhbGl6ZShtZW0pOworCisgICBtZW0ud3JpdGUoJnZhbHVlLCBzaXplb2YoaXJfY29uc3RhbnRfZGF0YSkpOworCisgICBpZiAoYXJyYXlfZWxlbWVudHMpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0eXBlLT5sZW5ndGg7IGkrKykKKyAgICAgICAgIGFycmF5X2VsZW1lbnRzW2ldLT5zZXJpYWxpemUobWVtKTsKKyAgIH0KKworICAgLyogc3RydWN0IGNvbnN0YW50LCBkdW1wIGNvbXBvbmVudHMgZXhlY19saXN0ICovCisgICBpZiAoIWNvbXBvbmVudHMuaXNfZW1wdHkoKSkKKyAgICAgIHNlcmlhbGl6ZV9saXN0KCZjb21wb25lbnRzLCBtZW0pOworfQorCisKK3ZvaWQKK2lyX2RlcmVmZXJlbmNlX2FycmF5OjpzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pCit7CisgICBzZXJpYWxpemVfcnZhbHVlKGFycmF5LCBtZW0pOworICAgc2VyaWFsaXplX3J2YWx1ZShhcnJheV9pbmRleCwgbWVtKTsKK30KKworCit2b2lkCitpcl9kZXJlZmVyZW5jZV9yZWNvcmQ6OnNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIG1lbS53cml0ZV9zdHJpbmcoZmllbGQpOworICAgc2VyaWFsaXplX3J2YWx1ZShyZWNvcmQsIG1lbSk7Cit9CisKKworCisvKioKKyAqIGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlIGlzIHVzZWQgYXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGl0CisgKi8KK3ZvaWQKK2lyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlOjpzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pCit7CisgICBtZW0ud3JpdGVfaW50NjRfdCgoaW50NjRfdCkgKGludHB0cl90KSB2YXIpOworfQorCisKK3ZvaWQKK2lyX2Rpc2NhcmQ6OnNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIHNlcmlhbGl6ZV9ydmFsdWUoY29uZGl0aW9uLCBtZW0pOworfQorCisKK3ZvaWQKK2lyX2V4cHJlc3Npb246OnNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIHVpbnQzMl90IG51bV9vcGVyYW5kcyA9IGdldF9udW1fb3BlcmFuZHMoKTsKKyAgIHVpbnQzMl90IGV4cF9vcGVyYXRpb24gPSBvcGVyYXRpb247CisKKyAgIHR5cGUtPnNlcmlhbGl6ZShtZW0pOworCisgICBtZW0ud3JpdGVfdWludDMyX3QoZXhwX29wZXJhdGlvbik7CisgICBtZW0ud3JpdGVfdWludDMyX3QobnVtX29wZXJhbmRzKTsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9vcGVyYW5kczsgaSsrKQorICAgICAgc2VyaWFsaXplX3J2YWx1ZShvcGVyYW5kc1tpXSwgbWVtKTsKK30KKworCit2b2lkCitpcl9mdW5jdGlvbjo6c2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKQoreworICAgbWVtLndyaXRlX3N0cmluZyhuYW1lKTsKKyAgIHNlcmlhbGl6ZV9saXN0KCZzaWduYXR1cmVzLCBtZW0pOworfQorCisKK3ZvaWQKK2lyX2Z1bmN0aW9uX3NpZ25hdHVyZTo6c2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKQoreworICAgdWludDhfdCBidWlsdGluX2Z1bmMgPSBpc19idWlsdGluKCk7CisgICBtZW0ud3JpdGVfdWludDhfdChidWlsdGluX2Z1bmMpOworCisgICB1aW50OF90IGlzX2RlZmluZWQgPSB0aGlzLT5pc19kZWZpbmVkOworICAgbWVtLndyaXRlX3VpbnQ4X3QoaXNfZGVmaW5lZCk7CisKKyAgIC8qIGR1bXAgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uICovCisgICByZXR1cm5fdHlwZS0+c2VyaWFsaXplKG1lbSk7CisKKyAgIC8qIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgIHNlcmlhbGl6ZV9saXN0KCZwYXJhbWV0ZXJzLCBtZW0pOworCisgICAvKiBmdW5jdGlvbiBib2R5ICovCisgICBzZXJpYWxpemVfbGlzdCgmYm9keSwgbWVtKTsKK30KKworCit2b2lkCitpcl9pZjo6c2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKQoreworICAgc2VyaWFsaXplX3J2YWx1ZShjb25kaXRpb24sIG1lbSk7CisgICBzZXJpYWxpemVfbGlzdCgmdGhlbl9pbnN0cnVjdGlvbnMsIG1lbSk7CisgICBzZXJpYWxpemVfbGlzdCgmZWxzZV9pbnN0cnVjdGlvbnMsIG1lbSk7Cit9CisKKwordm9pZAoraXJfbG9vcDo6c2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKQoreworICAgc2VyaWFsaXplX2xpc3QoJmJvZHlfaW5zdHJ1Y3Rpb25zLCBtZW0pOworfQorCisKK3ZvaWQKK2lyX2xvb3BfanVtcDo6c2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKQoreworICAgdWludDhfdCBqdW1wX21vZGUgPSBtb2RlOworICAgbWVtLndyaXRlX3VpbnQ4X3QoanVtcF9tb2RlKTsKK30KKworCit2b2lkCitpcl9yZXR1cm46OnNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIHNlcmlhbGl6ZV9ydmFsdWUodmFsdWUsIG1lbSk7Cit9CisKKwordm9pZAoraXJfc3dpenpsZTo6c2VyaWFsaXplX2RhdGEobWVtb3J5X3dyaXRlciAmbWVtKQoreworICAgbWVtLndyaXRlKCZtYXNrLCBzaXplb2YoaXJfc3dpenpsZV9tYXNrKSk7CisgICBzZXJpYWxpemVfcnZhbHVlKHZhbCwgbWVtKTsKK30KKworCit2b2lkCitpcl90ZXh0dXJlOjpzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pCit7CisgICBtZW0ud3JpdGVfaW50MzJfdCgoaW50MzJfdClvcCk7CisKKyAgIHR5cGUtPnNlcmlhbGl6ZShtZW0pOworCisgICAvKiBzYW1wbGVyICovCisgICBtZW0ud3JpdGVfdWludDhfdCgodWludDhfdClzYW1wbGVyLT5pcl90eXBlKTsKKworICAgc2FtcGxlci0+c2VyaWFsaXplKG1lbSk7CisKKyAgIHNlcmlhbGl6ZV9ydmFsdWUoY29vcmRpbmF0ZSwgbWVtKTsKKyAgIHNlcmlhbGl6ZV9ydmFsdWUocHJvamVjdG9yLCBtZW0pOworICAgc2VyaWFsaXplX3J2YWx1ZShzaGFkb3dfY29tcGFyaXRvciwgbWVtKTsKKyAgIHNlcmlhbGl6ZV9ydmFsdWUob2Zmc2V0LCBtZW0pOworCisgICAvKiBsb2RfaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgIHNlcmlhbGl6ZV9ydmFsdWUobG9kX2luZm8ubG9kLCBtZW0pOworICAgc2VyaWFsaXplX3J2YWx1ZShsb2RfaW5mby5iaWFzLCBtZW0pOworICAgc2VyaWFsaXplX3J2YWx1ZShsb2RfaW5mby5zYW1wbGVfaW5kZXgsIG1lbSk7CisgICBzZXJpYWxpemVfcnZhbHVlKGxvZF9pbmZvLmNvbXBvbmVudCwgbWVtKTsKKyAgIHNlcmlhbGl6ZV9ydmFsdWUobG9kX2luZm8uZ3JhZC5kUGR4LCBtZW0pOworICAgc2VyaWFsaXplX3J2YWx1ZShsb2RfaW5mby5ncmFkLmRQZHksIG1lbSk7Cit9CisKKwordm9pZAoraXJfZW1pdF92ZXJ0ZXg6OnNlcmlhbGl6ZV9kYXRhKG1lbW9yeV93cml0ZXIgJm1lbSkKK3sKKyAgIC8qIG5vIGRhdGEgKi8KK30KKworCit2b2lkCitpcl9lbmRfcHJpbWl0aXZlOjpzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pCit7CisgICAvKiBubyBkYXRhICovCit9CisKKwordm9pZAoraXJfcnZhbHVlOjpzZXJpYWxpemVfZGF0YShtZW1vcnlfd3JpdGVyICZtZW0pCit7CisgICBhc3NlcnQoMCAmJiAidW5yZWFjaGFibGUiKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfc2VyaWFsaXplLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3NlcmlhbGl6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzQ3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3NlcmlhbGl6ZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIElSX1NFUklBTElaRV9ICisjZGVmaW5lIElSX1NFUklBTElaRV9ICisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgIm1lbW9yeV93cml0ZXIuaCIKKyNpbmNsdWRlICJtYWluL2hhc2hfdGFibGUuaCIKKwordm9pZAorc2VyaWFsaXplX2xpc3QoZXhlY19saXN0ICpsaXN0LCBtZW1vcnlfd3JpdGVyICZtZW0pOworCisjZW5kaWYgLyogSVJfU0VSSUFMSVpFX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfc2V0X3Byb2dyYW1faW5vdXRzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfc2V0X3Byb2dyYW1faW5vdXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVjOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl9zZXRfcHJvZ3JhbV9pbm91dHMuY3BwCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBpcl9zZXRfcHJvZ3JhbV9pbm91dHMuY3BwCisgKgorICogU2V0cyB0aGUgSW5wdXRzUmVhZCBhbmQgT3V0cHV0c1dyaXR0ZW4gb2YgTWVzYSBwcm9ncmFtcy4KKyAqCisgKiBBZGRpdGlvbmFsbHksIGZvciBmcmFnbWVudCBzaGFkZXJzLCBzZXRzIHRoZSBJbnRlcnBRdWFsaWZpZXIgYXJyYXksIHRoZQorICogSXNDZW50cm9pZCBhbmQgSXNTYW1wbGUgYml0ZmllbGRzLCBhbmQgdGhlIFVzZXNERmR5IGZsYWcuCisgKgorICogTWVzYSBwcm9ncmFtcyAoZ2xfcHJvZ3JhbSwgbm90IGdsX3NoYWRlcl9wcm9ncmFtKSBoYXZlIGEgc2V0IG9mCisgKiBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIHZhcnlpbmdzIGFyZSByZWFkIGFuZCB3cml0dGVuLiAgQ29tcHV0aW5nCisgKiB3aGljaCBhcmUgYWN0dWFsbHkgcmVhZCBmcm9tIHNvbWUgc29ydCBvZiBiYWNrZW5kIGNvZGUgY2FuIGJlCisgKiB0cmlja3kgd2hlbiB2YXJpYWJsZSBhcnJheSBpbmRleGluZyBpbnZvbHZlZC4gIFNvIHRoaXMgcGFzcworICogcHJvdmlkZXMgc3VwcG9ydCBmb3Igc2V0dGluZyBJbnB1dHNSZWFkIGFuZCBPdXRwdXRzV3JpdHRlbiByaWdodAorICogZnJvbSB0aGUgR0xTTCBJUi4KKyAqLworCisjaW5jbHVkZSAibGliZm5zLmgiIC8vIEx1bmFyRyBBREQ6CisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBpcl9zZXRfcHJvZ3JhbV9pbm91dHNfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9zZXRfcHJvZ3JhbV9pbm91dHNfdmlzaXRvcihzdHJ1Y3QgZ2xfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlcl9zdGFnZSBzaGFkZXJfc3RhZ2UpCisgICB7CisgICAgICB0aGlzLT5wcm9nID0gcHJvZzsKKyAgICAgIHRoaXMtPnNoYWRlcl9zdGFnZSA9IHNoYWRlcl9zdGFnZTsKKyAgIH0KKyAgIH5pcl9zZXRfcHJvZ3JhbV9pbm91dHNfdmlzaXRvcigpCisgICB7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZXhwcmVzc2lvbiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZGlzY2FyZCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfdGV4dHVyZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisKK3ByaXZhdGU6CisgICB2b2lkIG1hcmtfd2hvbGVfdmFyaWFibGUoaXJfdmFyaWFibGUgKnZhcik7CisgICBib29sIHRyeV9tYXJrX3BhcnRpYWxfdmFyaWFibGUoaXJfdmFyaWFibGUgKnZhciwgaXJfcnZhbHVlICppbmRleCk7CisKKyAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nOworICAgZ2xfc2hhZGVyX3N0YWdlIHNoYWRlcl9zdGFnZTsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitzdGF0aWMgaW5saW5lIGJvb2wKK2lzX3NoYWRlcl9pbm91dChpcl92YXJpYWJsZSAqdmFyKQoreworICAgcmV0dXJuIHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4gfHwKKyAgICAgICAgICB2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX291dCB8fAorICAgICAgICAgIHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zeXN0ZW1fdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkCittYXJrKHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLCBpcl92YXJpYWJsZSAqdmFyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLAorICAgICBib29sIGlzX2ZyYWdtZW50X3NoYWRlcikKK3sKKyAgIC8qIEFzIG9mIEdMU0wgMS4yMCwgdmFyeWluZ3MgY2FuIG9ubHkgYmUgZmxvYXRzLCBmbG9hdGluZy1wb2ludAorICAgICogdmVjdG9ycyBvciBtYXRyaWNlcywgb3IgYXJyYXlzIG9mIHRoZW0uICBGb3IgTWVzYSBwcm9ncmFtcyB1c2luZworICAgICogSW5wdXRzUmVhZC9PdXRwdXRzV3JpdHRlbiwgZXZlcnl0aGluZyBidXQgbWF0cmljZXMgdXNlcyBvbmUKKyAgICAqIHNsb3QsIHdoaWxlIG1hdHJpY2VzIHVzZSBhIHNsb3QgcGVyIGNvbHVtbi4gIFByZXN1bWFibHkKKyAgICAqIHNvbWV0aGluZyBkb2luZyBhIG1vcmUgY2xldmVyIHBhY2tpbmcgd291bGQgdXNlIHNvbWV0aGluZyBvdGhlcgorICAgICogdGhhbiBJbnB1dHNSZWFkL091dHB1dHNXcml0dGVuLgorICAgICovCisKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIEdMYml0ZmllbGQ2NCBiaXRmaWVsZCA9CisgICAgICAgICBCSVRGSUVMRDY0X0JJVCh2YXItPmRhdGEubG9jYXRpb24gKyB2YXItPmRhdGEuaW5kZXggKyBvZmZzZXQgKyBpKTsKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKSB7CisJIHByb2ctPklucHV0c1JlYWQgfD0gYml0ZmllbGQ7CisgICAgICAgICBpZiAoaXNfZnJhZ21lbnRfc2hhZGVyKSB7CisgICAgICAgICAgICBnbF9mcmFnbWVudF9wcm9ncmFtICpmcHJvZyA9IChnbF9mcmFnbWVudF9wcm9ncmFtICopIHByb2c7CisgICAgICAgICAgICBmcHJvZy0+SW50ZXJwUXVhbGlmaWVyW3Zhci0+ZGF0YS5sb2NhdGlvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+ZGF0YS5pbmRleCArIG9mZnNldCArIGldID0KKyAgICAgICAgICAgICAgIChnbHNsX2ludGVycF9xdWFsaWZpZXIpIHZhci0+ZGF0YS5pbnRlcnBvbGF0aW9uOworICAgICAgICAgICAgaWYgKHZhci0+ZGF0YS5jZW50cm9pZCkKKyAgICAgICAgICAgICAgIGZwcm9nLT5Jc0NlbnRyb2lkIHw9IGJpdGZpZWxkOworICAgICAgICAgICAgaWYgKHZhci0+ZGF0YS5zYW1wbGUpCisgICAgICAgICAgICAgICBmcHJvZy0+SXNTYW1wbGUgfD0gYml0ZmllbGQ7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zeXN0ZW1fdmFsdWUpIHsKKyAgICAgICAgIHByb2ctPlN5c3RlbVZhbHVlc1JlYWQgfD0gYml0ZmllbGQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAgYXNzZXJ0KHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0KTsKKwkgcHJvZy0+T3V0cHV0c1dyaXR0ZW4gfD0gYml0ZmllbGQ7CisgICAgICB9CisgICB9Cit9CisKKy8qKgorICogTWFyayBhbiBlbnRpcmUgdmFyaWFibGUgYXMgdXNlZC4gIENhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSB2YXJpYWJsZQorICogcmVwcmVzZW50cyBhIHNoYWRlciBpbnB1dCBvciBvdXRwdXQuCisgKi8KK3ZvaWQKK2lyX3NldF9wcm9ncmFtX2lub3V0c192aXNpdG9yOjptYXJrX3dob2xlX3ZhcmlhYmxlKGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUgPSB2YXItPnR5cGU7CisgICBpZiAodGhpcy0+c2hhZGVyX3N0YWdlID09IE1FU0FfU0hBREVSX0dFT01FVFJZICYmCisgICAgICAgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbiAmJiB0eXBlLT5pc19hcnJheSgpKSB7CisgICAgICB0eXBlID0gdHlwZS0+ZmllbGRzLmFycmF5OworICAgfQorCisgICBtYXJrKHRoaXMtPnByb2csIHZhciwgMCwgdHlwZS0+Y291bnRfYXR0cmlidXRlX3Nsb3RzKCksCisgICAgICAgIHRoaXMtPnNoYWRlcl9zdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCk7Cit9CisKKy8qIERlZmF1bHQgaGFuZGxlcjogTWFyayBhbGwgdGhlIGxvY2F0aW9ucyBpbiB0aGUgdmFyaWFibGUgYXMgdXNlZC4gKi8KK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9zZXRfcHJvZ3JhbV9pbm91dHNfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQoreworICAgaWYgKCFpc19zaGFkZXJfaW5vdXQoaXItPnZhcikpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIG1hcmtfd2hvbGVfdmFyaWFibGUoaXItPnZhcik7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworLyoqCisgKiBUcnkgdG8gbWFyayBhIHBvcnRpb24gb2YgdGhlIGdpdmVuIHZhcmlhYmxlIGFzIHVzZWQuICBDYWxsZXIgbXVzdCBlbnN1cmUKKyAqIHRoYXQgdGhlIHZhcmlhYmxlIHJlcHJlc2VudHMgYSBzaGFkZXIgaW5wdXQgb3Igb3V0cHV0IHdoaWNoIGNhbiBiZSBpbmRleGVkCisgKiBpbnRvIGluIGFycmF5IGZhc2hpb24gKGFuIGFycmF5IG9yIG1hdHJpeCkuICBGb3IgdGhlIHB1cnBvc2Ugb2YgZ2VvbWV0cnkKKyAqIHNoYWRlciBpbnB1dHMgKHdoaWNoIGFyZSBhbHdheXMgYXJyYXlzKiksIHRoaXMgbWVhbnMgdGhhdCB0aGUgYXJyYXkgZWxlbWVudAorICogbXVzdCBiZSBzb21ldGhpbmcgdGhhdCBjYW4gYmUgaW5kZXhlZCBpbnRvIGluIGFycmF5IGZhc2hpb24uCisgKgorICogKkV4Y2VwdCBnbF9QcmltaXRpdmVJREluLCBhcyBub3RlZCBiZWxvdy4KKyAqCisgKiBJZiB0aGUgaW5kZXggY2FuJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBjb25zdGFudCwgb3Igc29tZSBvdGhlciBwcm9ibGVtCisgKiBvY2N1cnMsIHRoZW4gbm90aGluZyB3aWxsIGJlIG1hcmtlZCBhbmQgZmFsc2Ugd2lsbCBiZSByZXR1cm5lZC4KKyAqLworYm9vbAoraXJfc2V0X3Byb2dyYW1faW5vdXRzX3Zpc2l0b3I6OnRyeV9tYXJrX3BhcnRpYWxfdmFyaWFibGUoaXJfdmFyaWFibGUgKnZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqaW5kZXgpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUgPSB2YXItPnR5cGU7CisKKyAgIGlmICh0aGlzLT5zaGFkZXJfc3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlkgJiYKKyAgICAgICB2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKSB7CisgICAgICAvKiBUaGUgb25seSBnZW9tZXRyeSBzaGFkZXIgaW5wdXQgdGhhdCBpcyBub3QgYW4gYXJyYXkgaXMKKyAgICAgICAqIGdsX1ByaW1pdGl2ZUlESW4sIGFuZCBpbiB0aGF0IGNhc2UsIHRoaXMgY29kZSB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsCisgICAgICAgKiBiZWNhdXNlIGdsX1ByaW1pdGl2ZUlESW4gY2FuJ3QgYmUgaW5kZXhlZCBpbnRvIGluIGFycmF5IGZhc2hpb24uCisgICAgICAgKi8KKyAgICAgIGFzc2VydCh0eXBlLT5pc19hcnJheSgpKTsKKyAgICAgIHR5cGUgPSB0eXBlLT5maWVsZHMuYXJyYXk7CisgICB9CisKKyAgIC8qIFRoZSBjb2RlIGJlbG93IG9ubHkgaGFuZGxlczoKKyAgICAqCisgICAgKiAtIEluZGV4aW5nIGludG8gbWF0cmljZXMKKyAgICAqIC0gSW5kZXhpbmcgaW50byBhcnJheXMgb2YgKG1hdHJpY2VzLCB2ZWN0b3JzLCBvciBzY2FsYXJzKQorICAgICoKKyAgICAqIEFsbCBvdGhlciBwb3NzaWJpbGl0aWVzIGFyZSBlaXRoZXIgcHJvaGliaXRlZCBieSBHTFNMICh2ZXJ0ZXggaW5wdXRzIGFuZAorICAgICogZnJhZ21lbnQgb3V0cHV0cyBjYW4ndCBiZSBzdHJ1Y3RzKSBvciBzaG91bGQgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQgYnkKKyAgICAqIGxvd2VyaW5nIHBhc3NlcyAoZG9fdmVjX2luZGV4X3RvX3N3aXp6bGUoKSBnZXRzIHJpZCBvZiBpbmRleGluZyBpbnRvCisgICAgKiB2ZWN0b3JzLCBhbmQgbG93ZXJfcGFja2VkX3ZhcnlpbmdzKCkgZ2V0cyByaWQgb2Ygc3RydWN0cyB0aGF0IG9jY3VyIGluCisgICAgKiB2YXJ5aW5ncykuCisgICAgKi8KKyAgIGlmICghKHR5cGUtPmlzX21hdHJpeCgpIHx8CisgICAgICAgICh0eXBlLT5pc19hcnJheSgpICYmCisgICAgICAgICAodHlwZS0+ZmllbGRzLmFycmF5LT5pc19udW1lcmljKCkgfHwKKyAgICAgICAgICB0eXBlLT5maWVsZHMuYXJyYXktPmlzX2Jvb2xlYW4oKSkpKSkgeworICAgICAgYXNzZXJ0KCEiVW5leHBlY3RlZCBpbmRleGluZyBpbiBpcl9zZXRfcHJvZ3JhbV9pbm91dHMiKTsKKworICAgICAgLyogRm9yIHNhZmV0eSBpbiByZWxlYXNlIGJ1aWxkcywgaW4gY2FzZSB3ZSBldmVyIGVuY291bnRlciB1bmV4cGVjdGVkCisgICAgICAgKiBpbmRleGluZywgZ2l2ZSB1cCBhbmQgbGV0IHRoZSBjYWxsZXIgbWFyayB0aGUgd2hvbGUgdmFyaWFibGUgYXMgdXNlZC4KKyAgICAgICAqLworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBpcl9jb25zdGFudCAqaW5kZXhfYXNfY29uc3RhbnQgPSBpbmRleC0+YXNfY29uc3RhbnQoKTsKKyAgIGlmICghaW5kZXhfYXNfY29uc3RhbnQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIHVuc2lnbmVkIGVsZW1fd2lkdGg7CisgICB1bnNpZ25lZCBudW1fZWxlbXM7CisgICBpZiAodHlwZS0+aXNfYXJyYXkoKSkgeworICAgICAgbnVtX2VsZW1zID0gdHlwZS0+bGVuZ3RoOworICAgICAgaWYgKHR5cGUtPmZpZWxkcy5hcnJheS0+aXNfbWF0cml4KCkpCisgICAgICAgICBlbGVtX3dpZHRoID0gdHlwZS0+ZmllbGRzLmFycmF5LT5tYXRyaXhfY29sdW1uczsKKyAgICAgIGVsc2UKKyAgICAgICAgIGVsZW1fd2lkdGggPSAxOworICAgfSBlbHNlIHsKKyAgICAgIG51bV9lbGVtcyA9IHR5cGUtPm1hdHJpeF9jb2x1bW5zOworICAgICAgZWxlbV93aWR0aCA9IDE7CisgICB9CisKKyAgIGlmIChpbmRleF9hc19jb25zdGFudC0+dmFsdWUudVswXSA+PSBudW1fZWxlbXMpIHsKKyAgICAgIC8qIENvbnN0YW50IGluZGV4IG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgbWF0cml4L2FycmF5LiAgVGhpcyBjb3VsZAorICAgICAgICogYXJpc2UgYXMgYSByZXN1bHQgb2YgY29uc3RhbnQgZm9sZGluZyBvZiBhIGxlZ2FsIEdMU0wgcHJvZ3JhbS4KKyAgICAgICAqCisgICAgICAgKiBFdmVuIHRob3VnaCB0aGUgc3BlYyBzYXlzIHRoYXQgaW5kZXhpbmcgb3V0c2lkZSB0aGUgYm91bmRzIG9mIGEKKyAgICAgICAqIG1hdHJpeC9hcnJheSByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvdXIsIHdlIGRvbid0IHdhbnQgdG8gcGFzcworICAgICAgICogb3V0LW9mLXJhbmdlIHZhbHVlcyB0byBtYXJrKCkgKHNpbmNlIHRoaXMgY291bGQgcmVzdWx0IGluIHNsb3RzIHRoYXQKKyAgICAgICAqIGRvbid0IGV4aXN0IGJlaW5nIG1hcmtlZCBhcyB1c2VkKSwgc28ganVzdCBsZXQgdGhlIGNhbGxlciBtYXJrIHRoZQorICAgICAgICogd2hvbGUgdmFyaWFibGUgYXMgdXNlZC4KKyAgICAgICAqLworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBtYXJrKHRoaXMtPnByb2csIHZhciwgaW5kZXhfYXNfY29uc3RhbnQtPnZhbHVlLnVbMF0gKiBlbGVtX3dpZHRoLAorICAgICAgICBlbGVtX3dpZHRoLCB0aGlzLT5zaGFkZXJfc3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpOworICAgcmV0dXJuIHRydWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9zZXRfcHJvZ3JhbV9pbm91dHNfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKQoreworICAgLyogTm90ZTogZm9yIGdlb21ldHJ5IHNoYWRlciBpbnB1dHMsIGxvd2VyX25hbWVkX2ludGVyZmFjZV9ibG9ja3MgbWF5CisgICAgKiBjcmVhdGUgMkQgYXJyYXlzLCBzbyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gaGFuZGxlIHRob3NlLiAgMkQgYXJyYXlzCisgICAgKiBzaG91bGRuJ3QgYmUgYWJsZSB0byBjcm9wIHVwIGZvciBhbnkgb3RoZXIgcmVhc29uLgorICAgICovCisgICBpZiAoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKiBjb25zdCBpbm5lcl9hcnJheSA9CisgICAgICAgaXItPmFycmF5LT5hc19kZXJlZmVyZW5jZV9hcnJheSgpKSB7CisgICAgICAvKiAgICAgICAgICBpciA9PiBmb29baV1bal0KKyAgICAgICAqIGlubmVyX2FycmF5ID0+IGZvb1tpXQorICAgICAgICovCisgICAgICBpZiAoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKiBjb25zdCBkZXJlZl92YXIgPQorICAgICAgICAgIGlubmVyX2FycmF5LT5hcnJheS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKSkgeworICAgICAgICAgaWYgKHRoaXMtPnNoYWRlcl9zdGFnZSA9PSBNRVNBX1NIQURFUl9HRU9NRVRSWSAmJgorICAgICAgICAgICAgIGRlcmVmX3Zhci0+dmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbikgeworICAgICAgICAgICAgLyogZm9vIGlzIGEgZ2VvbWV0cnkgc2hhZGVyIGlucHV0LCBzbyBpIGlzIHRoZSB2ZXJ0ZXgsIGFuZCBqIHRoZQorICAgICAgICAgICAgICogcGFydCBvZiB0aGUgaW5wdXQgd2UncmUgYWNjZXNzaW5nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodHJ5X21hcmtfcGFydGlhbF92YXJpYWJsZShkZXJlZl92YXItPnZhciwgaXItPmFycmF5X2luZGV4KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFdlJ3ZlIG5vdyB0YWtlbiBjYXJlIG9mIGZvbyBhbmQgaiwgYnV0IGkgbWlnaHQgY29udGFpbiBhCisgICAgICAgICAgICAgICAgKiBzdWJleHByZXNzaW9uIHRoYXQgYWNjZXNzZXMgc2hhZGVyIGlucHV0cy4gIFNvIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgKiB2aXNpdCBpIGFuZCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIHBhcmVudC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaW5uZXJfYXJyYXktPmFycmF5X2luZGV4LT5hY2NlcHQodGhpcyk7CisgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9IGVsc2UgaWYgKGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICogY29uc3QgZGVyZWZfdmFyID0KKyAgICAgICAgICAgICAgaXItPmFycmF5LT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpKSB7CisgICAgICAvKiBpciA9PiBmb29baV0sIHdoZXJlIGZvbyBpcyBhIHZhcmlhYmxlLiAqLworICAgICAgaWYgKHRoaXMtPnNoYWRlcl9zdGFnZSA9PSBNRVNBX1NIQURFUl9HRU9NRVRSWSAmJgorICAgICAgICAgIGRlcmVmX3Zhci0+dmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbikgeworICAgICAgICAgLyogZm9vIGlzIGEgZ2VvbWV0cnkgc2hhZGVyIGlucHV0LCBzbyBpIGlzIHRoZSB2ZXJ0ZXgsIGFuZCB3ZSdyZQorICAgICAgICAgICogYWNjZXNzaW5nIHRoZSBlbnRpcmUgaW5wdXQuCisgICAgICAgICAgKi8KKyAgICAgICAgIG1hcmtfd2hvbGVfdmFyaWFibGUoZGVyZWZfdmFyLT52YXIpOworICAgICAgICAgLyogV2UndmUgbm93IHRha2VuIGNhcmUgb2YgZm9vLCBidXQgaSBtaWdodCBjb250YWluIGEgc3ViZXhwcmVzc2lvbgorICAgICAgICAgICogdGhhdCBhY2Nlc3NlcyBzaGFkZXIgaW5wdXRzLiAgU28gbWFudWFsbHkgdmlzaXQgaSBhbmQgdGhlbgorICAgICAgICAgICogY29udGludWUgd2l0aCB0aGUgcGFyZW50LgorICAgICAgICAgICovCisgICAgICAgICBpci0+YXJyYXlfaW5kZXgtPmFjY2VwdCh0aGlzKTsKKyAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKKyAgICAgIH0gZWxzZSBpZiAoaXNfc2hhZGVyX2lub3V0KGRlcmVmX3Zhci0+dmFyKSkgeworICAgICAgICAgLyogZm9vIGlzIGEgc2hhZGVyIGlucHV0L291dHB1dCwgYnV0IG5vdCBhIGdlb21ldHJ5IHNoYWRlciBpbnB1dCwKKyAgICAgICAgICAqIHNvIGkgaXMgdGhlIHBhcnQgb2YgdGhlIGlucHV0IHdlJ3JlIGFjY2Vzc2luZy4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKHRyeV9tYXJrX3BhcnRpYWxfdmFyaWFibGUoZGVyZWZfdmFyLT52YXIsIGlyLT5hcnJheV9pbmRleCkpCisgICAgICAgICAgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7CisgICAgICB9CisgICB9CisKKyAgIC8qIFRoZSBleHByZXNzaW9uIGlzIHNvbWV0aGluZyB3ZSBkb24ndCByZWNvZ25pemUuICBKdXN0IHZpc2l0IGl0cworICAgICogc3ViZXhwcmVzc2lvbnMuCisgICAgKi8KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3NldF9wcm9ncmFtX2lub3V0c192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgLyogV2UgZG9uJ3Qgd2FudCB0byBkZXNjZW5kIGludG8gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kCisgICAgKiBjb25zaWRlciB0aGVtIGFzIHNoYWRlciBpbnB1dHMgb3Igb3V0cHV0cy4KKyAgICAqLworICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCAmaXItPmJvZHkpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfc2V0X3Byb2dyYW1faW5vdXRzX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgaWYgKHRoaXMtPnNoYWRlcl9zdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCAmJgorICAgICAgIGlyLT5vcGVyYXRpb24gPT0gaXJfdW5vcF9kRmR5KSB7CisgICAgICBnbF9mcmFnbWVudF9wcm9ncmFtICpmcHJvZyA9IChnbF9mcmFnbWVudF9wcm9ncmFtICopIHByb2c7CisgICAgICBmcHJvZy0+VXNlc0RGZHkgPSB0cnVlOworICAgfQorICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfc2V0X3Byb2dyYW1faW5vdXRzX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Rpc2NhcmQgKikKK3sKKyAgIC8qIGRpc2NhcmRzIGFyZSBvbmx5IGFsbG93ZWQgaW4gZnJhZ21lbnQgc2hhZGVycy4gKi8KKyAgIGFzc2VydCh0aGlzLT5zaGFkZXJfc3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpOworCisgICBnbF9mcmFnbWVudF9wcm9ncmFtICpmcHJvZyA9IChnbF9mcmFnbWVudF9wcm9ncmFtICopIHByb2c7CisgICBmcHJvZy0+VXNlc0tpbGwgPSB0cnVlOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9zZXRfcHJvZ3JhbV9pbm91dHNfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfdGV4dHVyZSAqaXIpCit7CisgICBpZiAoaXItPm9wID09IGlyX3RnNCkKKyAgICAgIHByb2ctPlVzZXNHYXRoZXIgPSB0cnVlOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCit2b2lkCitkb19zZXRfcHJvZ3JhbV9pbm91dHMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlcl9zdGFnZSBzaGFkZXJfc3RhZ2UpCit7CisgICBpcl9zZXRfcHJvZ3JhbV9pbm91dHNfdmlzaXRvciB2KHByb2csIHNoYWRlcl9zdGFnZSk7CisKKyAgIHByb2ctPklucHV0c1JlYWQgPSAwOworICAgcHJvZy0+T3V0cHV0c1dyaXR0ZW4gPSAwOworICAgcHJvZy0+U3lzdGVtVmFsdWVzUmVhZCA9IDA7CisgICBpZiAoc2hhZGVyX3N0YWdlID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UKSB7CisgICAgICBnbF9mcmFnbWVudF9wcm9ncmFtICpmcHJvZyA9IChnbF9mcmFnbWVudF9wcm9ncmFtICopIHByb2c7CisgICAgICBtZW1zZXQoZnByb2ctPkludGVycFF1YWxpZmllciwgMCwgc2l6ZW9mKGZwcm9nLT5JbnRlcnBRdWFsaWZpZXIpKTsKKyAgICAgIGZwcm9nLT5Jc0NlbnRyb2lkID0gMDsKKyAgICAgIGZwcm9nLT5Jc1NhbXBsZSA9IDA7CisgICAgICBmcHJvZy0+VXNlc0RGZHkgPSBmYWxzZTsKKyAgICAgIGZwcm9nLT5Vc2VzS2lsbCA9IGZhbHNlOworICAgfQorICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfdW5pZm9ybS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl91bmlmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwODUwOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfdW5pZm9ybS5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIElSX1VOSUZPUk1fSAorI2RlZmluZSBJUl9VTklGT1JNX0gKKworCisvKiBzdGRib29sLmggaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGluIGJvdGggQyBhbmQgQysrIGNvZGUuCisgKi8KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICJwcm9ncmFtL3Byb2dfcGFyYW1ldGVyLmgiICAvKiBGb3IgdW5pb24gZ2xfY29uc3RhbnRfdmFsdWUuICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitlbnVtIGdsX3VuaWZvcm1fZHJpdmVyX2Zvcm1hdCB7CisgICB1bmlmb3JtX25hdGl2ZSA9IDAsICAgICAgICAgIC8qKjwgU3RvcmUgZGF0YSBpbiB0aGUgbmF0aXZlIGZvcm1hdC4gKi8KKyAgIHVuaWZvcm1faW50X2Zsb2F0LCAgICAgICAgICAgLyoqPCBTdG9yZSBpbnRlZ2VyIGRhdGEgYXMgZmxvYXRzLiAqLworICAgdW5pZm9ybV9ib29sX2Zsb2F0LCAgICAgICAgICAvKio8IFN0b3JlIGJvb2xlYW4gZGF0YSBhcyBmbG9hdHMuICovCisKKyAgIC8qKgorICAgICogU3RvcmUgYm9vbGVhbiBkYXRhIGFzIGludGVnZXIgdXNpbmcgMSBmb3IgXGMgdHJ1ZS4KKyAgICAqLworICAgdW5pZm9ybV9ib29sX2ludF8wXzEsCisKKyAgIC8qKgorICAgICogU3RvcmUgYm9vbGVhbiBkYXRhIGFzIGludGVnZXIgdXNpbmcgfjAgZm9yIFxjIHRydWUuCisgICAgKi8KKyAgIHVuaWZvcm1fYm9vbF9pbnRfMF9ub3QwCit9OworCitzdHJ1Y3QgZ2xfdW5pZm9ybV9kcml2ZXJfc3RvcmFnZSB7CisgICAvKioKKyAgICAqIE51bWJlciBvZiBieXRlcyBmcm9tIG9uZSBhcnJheSBlbGVtZW50IHRvIHRoZSBuZXh0LgorICAgICovCisgICB1aW50OF90IGVsZW1lbnRfc3RyaWRlOworCisgICAvKioKKyAgICAqIE51bWJlciBvZiBieXRlcyBmcm9tIG9uZSB2ZWN0b3IgaW4gYSBtYXRyaXggdG8gdGhlIG5leHQuCisgICAgKi8KKyAgIHVpbnQ4X3QgdmVjdG9yX3N0cmlkZTsKKworICAgLyoqCisgICAgKiBCYXNlIGZvcm1hdCBvZiB0aGUgc3RvcmVkIGRhdGEuCisgICAgKgorICAgICogVGhpcyBmaWVsZCBtdXN0IGhhdmUgYSB2YWx1ZSBmcm9tIFxjIEdMU0xfVFlQRV9VSU5UIHRocm91Z2ggXGMKKyAgICAqIEdMU0xfVFlQRV9TQU1QTEVSLgorICAgICovCisgICB1aW50OF90IGZvcm1hdDsKKworICAgLyoqCisgICAgKiBQb2ludGVyIHRvIHRoZSBiYXNlIG9mIHRoZSBkYXRhLgorICAgICovCisgICB2b2lkICpkYXRhOworfTsKKworc3RydWN0IGdsX29wYXF1ZV91bmlmb3JtX2luZGV4IHsKKyAgIC8qKgorICAgICogQmFzZSBvcGFxdWUgdW5pZm9ybSBpbmRleAorICAgICoKKyAgICAqIElmIFxjIGdsX3VuaWZvcm1fc3RvcmFnZTo6YmFzZV90eXBlIGlzIGFuIG9wYXF1ZSB0eXBlLCB0aGlzCisgICAgKiByZXByZXNlbnRzIGl0cyB1bmlmb3JtIGluZGV4LiAgSWYgXGMKKyAgICAqIGdsX3VuaWZvcm1fc3RvcmFnZTo6YXJyYXlfZWxlbWVudHMgaXMgbm90IHplcm8sIHRoZSBhcnJheSB3aWxsCisgICAgKiB1c2Ugb3BhcXVlIHVuaWZvcm0gaW5kaWNlcyBcYyBpbmRleCB0aHJvdWdoIFxjIGluZGV4ICsgXGMKKyAgICAqIGdsX3VuaWZvcm1fc3RvcmFnZTo6YXJyYXlfZWxlbWVudHMgLSAxLCBpbmNsdXNpdmUuCisgICAgKgorICAgICogTm90ZSB0aGF0IHRoZSBpbmRleCBtYXkgYmUgZGlmZmVyZW50IGluIGVhY2ggc2hhZGVyIHN0YWdlLgorICAgICovCisgICB1aW50OF90IGluZGV4OworCisgICAvKioKKyAgICAqIFdoZXRoZXIgdGhpcyBvcGFxdWUgdW5pZm9ybSBpcyB1c2VkIGluIHRoaXMgc2hhZGVyIHN0YWdlLgorICAgICovCisgICBib29sIGFjdGl2ZTsKK307CisKK3N0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgeworICAgY2hhciAqbmFtZTsKKyAgIC8qKiBUeXBlIG9mIHRoaXMgdW5pZm9ybSBkYXRhIHN0b3JlZC4KKyAgICAqCisgICAgKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgaXQncyB0aGUgdHlwZSBvZiBhIHNpbmdsZSBhcnJheSBlbGVtZW50LgorICAgICovCisgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICp0eXBlOworCisgICAvKioKKyAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyB1bmlmb3JtLgorICAgICoKKyAgICAqIEZvciBub24tYXJyYXlzLCB0aGlzIGlzIGFsd2F5cyAwLiAgRm9yIGFycmF5cywgdGhlIHZhbHVlIGlzIHRoZSBzaXplIG9mCisgICAgKiB0aGUgYXJyYXkuCisgICAgKi8KKyAgIHVuc2lnbmVkIGFycmF5X2VsZW1lbnRzOworCisgICAvKioKKyAgICAqIEhhcyB0aGlzIHVuaWZvcm0gZXZlciBiZWVuIHNldD8KKyAgICAqLworICAgYm9vbCBpbml0aWFsaXplZDsKKworICAgc3RydWN0IGdsX29wYXF1ZV91bmlmb3JtX2luZGV4IHNhbXBsZXJbTUVTQV9TSEFERVJfU1RBR0VTXTsKKworICAgc3RydWN0IGdsX29wYXF1ZV91bmlmb3JtX2luZGV4IGltYWdlW01FU0FfU0hBREVSX1NUQUdFU107CisKKyAgIC8qKgorICAgICogU3RvcmFnZSB1c2VkIGJ5IHRoZSBkcml2ZXIgZm9yIHRoZSB1bmlmb3JtCisgICAgKi8KKyAgIHVuc2lnbmVkIG51bV9kcml2ZXJfc3RvcmFnZTsKKyAgIHN0cnVjdCBnbF91bmlmb3JtX2RyaXZlcl9zdG9yYWdlICpkcml2ZXJfc3RvcmFnZTsKKworICAgLyoqCisgICAgKiBTdG9yYWdlIHVzZWQgYnkgTWVzYSBmb3IgdGhlIHVuaWZvcm0KKyAgICAqCisgICAgKiBUaGlzIGZvcm0gb2YgdGhlIHVuaWZvcm0gaXMgdXNlZCBieSBNZXNhJ3MgaW1wbGVtZW50YXRpb24gb2YgXGMKKyAgICAqIGdsR2V0VW5pZm9ybS4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZHJpdmVycyB0byBvYnRhaW4gdGhlIHZhbHVlIG9mIHRoZQorICAgICogdW5pZm9ybSBpZiB0aGUgXGMgOjpkcml2ZXJfc3RvcmFnZSBpbnRlcmZhY2UgaXMgbm90IHVzZWQuCisgICAgKi8KKyAgIHVuaW9uIGdsX2NvbnN0YW50X3ZhbHVlICpzdG9yYWdlOworCisgICAvKiogRmllbGRzIGZvciBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0CisgICAgKiBAeworICAgICovCisKKyAgIC8qKgorICAgICogR0xfVU5JRk9STV9CTE9DS19JTkRFWDogaW5kZXggb2YgdGhlIHVuaWZvcm0gYmxvY2sgY29udGFpbmluZworICAgICogdGhlIHVuaWZvcm0sIG9yIC0xIGZvciB0aGUgZGVmYXVsdCB1bmlmb3JtIGJsb2NrLiAgTm90ZSB0aGF0IHRoZQorICAgICogaW5kZXggaXMgaW50byB0aGUgbGlua2VkIHByb2dyYW0ncyBVbmlmb3JtQmxvY2tzW10gYXJyYXksIG5vdAorICAgICogdGhlIGxpbmtlZCBzaGFkZXIncy4KKyAgICAqLworICAgaW50IGJsb2NrX2luZGV4OworCisgICAvKiogR0xfVU5JRk9STV9PRkZTRVQ6IGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgdW5pZm9ybSBibG9jaywgb3IgLTEuICovCisgICBpbnQgb2Zmc2V0OworCisgICAvKioKKyAgICAqIEdMX1VOSUZPUk1fTUFUUklYX1NUUklERTogYnl0ZSBzdHJpZGUgYmV0d2VlbiBjb2x1bW5zIG9yIHJvd3Mgb2YKKyAgICAqIGEgbWF0cml4LiAgU2V0IHRvIDAgZm9yIG5vbi1tYXRyaWNlcyBpbiBVQk9zLCBvciAtMSBmb3IgdW5pZm9ybXMKKyAgICAqIGluIHRoZSBkZWZhdWx0IHVuaWZvcm0gYmxvY2suCisgICAgKi8KKyAgIGludCBtYXRyaXhfc3RyaWRlOworCisgICAvKioKKyAgICAqIEdMX1VOSUZPUk1fQVJSQVlfU1RSSURFOiBieXRlIHN0cmlkZSBiZXR3ZWVuIGVsZW1lbnRzIG9mIHRoZQorICAgICogYXJyYXkuICBTZXQgdG8gemVybyBmb3Igbm9uLWFycmF5cyBpbiBVQk9zLCBvciAtMSBmb3IgdW5pZm9ybXMKKyAgICAqIGluIHRoZSBkZWZhdWx0IHVuaWZvcm0gYmxvY2suCisgICAgKi8KKyAgIGludCBhcnJheV9zdHJpZGU7CisKKyAgIC8qKiBHTF9VTklGT1JNX1JPV19NQUpPUjogdHJ1ZSBpZmYgaXQncyBhIHJvdy1tYWpvciBtYXRyaXggaW4gYSBVQk8gKi8KKyAgIGJvb2wgcm93X21ham9yOworCisgICAvKiogQH0gKi8KKworICAgLyoqCisgICAgKiBJbmRleCB3aXRoaW4gZ2xfc2hhZGVyX3Byb2dyYW06OkF0b21pY0J1ZmZlcnNbXSBvZiB0aGUgYXRvbWljCisgICAgKiBjb3VudGVyIGJ1ZmZlciB0aGlzIHVuaWZvcm0gaXMgc3RvcmVkIGluLCBvciAtMSBpZiB0aGlzIGlzIG5vdAorICAgICogYW4gYXRvbWljIGNvdW50ZXIuCisgICAgKi8KKyAgIGludCBhdG9taWNfYnVmZmVyX2luZGV4OworCisgICAvKioKKyAgICAqIFRoZSAnYmFzZSBsb2NhdGlvbicgZm9yIHRoaXMgdW5pZm9ybSBpbiB0aGUgdW5pZm9ybSByZW1hcCB0YWJsZS4gRm9yCisgICAgKiBhcnJheXMgdGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgICAgKi8KKyAgIHVuc2lnbmVkIHJlbWFwX2xvY2F0aW9uOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIElSX1VOSUZPUk1fSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl92YWxpZGF0ZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3ZhbGlkYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRlZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl92YWxpZGF0ZS5jcHAKQEAgLTAsMCArMSw4MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGlyX3ZhbGlkYXRlLmNwcAorICoKKyAqIEF0dGVtcHRzIHRvIHZlcmlmeSB0aGF0IHZhcmlvdXMgaW52YXJpYW50cyBvZiB0aGUgSVIgdHJlZSBhcmUgdHJ1ZS4KKyAqCisgKiBJbiBwYXJ0aWN1bGFyLCBhdCB0aGUgbW9tZW50IGl0IG1ha2VzIHN1cmUgdGhhdCBubyBzaW5nbGUKKyAqIGlyX2luc3RydWN0aW9uIG5vZGUgZXhjZXB0IGZvciBpcl92YXJpYWJsZSBhcHBlYXJzIG11bHRpcGxlIHRpbWVzCisgKiBpbiB0aGUgaXIgdHJlZS4gIGlyX3ZhcmlhYmxlIGRvZXMgYXBwZWFyIG11bHRpcGxlIHRpbWVzOiBPbmNlIGFzIGEKKyAqIGRlY2xhcmF0aW9uIGluIGFuIGV4ZWNfbGlzdCwgYW5kIG11bHRpcGxlIHRpbWVzIGFzIHRoZSBlbmRwb2ludCBvZgorICogYSBkZXJlZmVyZW5jZSBjaGFpbi4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl9oaWVyYXJjaGljYWxfdmlzaXRvci5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgaXJfdmFsaWRhdGUgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfdmFsaWRhdGUoKQorICAgeworICAgICAgdGhpcy0+aHQgPSBoYXNoX3RhYmxlX2N0b3IoMCwgaGFzaF90YWJsZV9wb2ludGVyX2hhc2gsCisJCQkJIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKTsKKworICAgICAgdGhpcy0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7CisKKyAgICAgIHRoaXMtPmNhbGxiYWNrID0gaXJfdmFsaWRhdGU6OnZhbGlkYXRlX2lyOworICAgICAgdGhpcy0+ZGF0YSA9IGh0OworICAgfQorCisgICB+aXJfdmFsaWRhdGUoKQorICAgeworICAgICAgaGFzaF90YWJsZV9kdG9yKHRoaXMtPmh0KTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl92YXJpYWJsZSAqdik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcik7CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfaWYgKmlyKTsKKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9mdW5jdGlvbiAqaXIpOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9mdW5jdGlvbiAqaXIpOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKTsKKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9leHByZXNzaW9uICppcik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX3N3aXp6bGUgKmlyKTsKKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihjbGFzcyBpcl9kZXJlZmVyZW5jZV9hcnJheSAqKTsKKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICppcik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKTsKKworICAgc3RhdGljIHZvaWQgdmFsaWRhdGVfaXIoaXJfaW5zdHJ1Y3Rpb24gKmlyLCB2b2lkICpkYXRhKTsKKworICAgaXJfZnVuY3Rpb24gKmN1cnJlbnRfZnVuY3Rpb247CisKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFsaWRhdGU6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIGlmICgoaXItPnZhciA9PSBOVUxMKSB8fCAoaXItPnZhci0+YXNfdmFyaWFibGUoKSA9PSBOVUxMKSkgeworICAgICAgcHJpbnRmKCJpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSBAICVwIGRvZXMgbm90IHNwZWNpZnkgYSB2YXJpYWJsZSAlcFxuIiwKKwkgICAgICh2b2lkICopIGlyLCAodm9pZCAqKSBpci0+dmFyKTsKKyAgICAgIGFib3J0KCk7CisgICB9CisKKyAgIGlmIChoYXNoX3RhYmxlX2ZpbmQoaHQsIGlyLT52YXIpID09IE5VTEwpIHsKKyAgICAgIHByaW50ZigiaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgQCAlcCBzcGVjaWZpZXMgdW5kZWNsYXJlZCB2YXJpYWJsZSAiCisJICAgICAiYCVzJyBAICVwXG4iLAorCSAgICAgKHZvaWQgKikgaXIsIGlyLT52YXItPm5hbWUsICh2b2lkICopIGlyLT52YXIpOworICAgICAgYWJvcnQoKTsKKyAgIH0KKworICAgdGhpcy0+dmFsaWRhdGVfaXIoaXIsIHRoaXMtPmRhdGEpOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92YWxpZGF0ZTo6dmlzaXRfZW50ZXIoY2xhc3MgaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKQoreworICAgaWYgKCFpci0+YXJyYXktPnR5cGUtPmlzX2FycmF5KCkgJiYgIWlyLT5hcnJheS0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKyAgICAgIHByaW50ZigiaXJfZGVyZWZlcmVuY2VfYXJyYXkgQCAlcCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGFycmF5IG9yIGEgIgorICAgICAgICAgICAgICJtYXRyaXhcbiIsCisgICAgICAgICAgICAgKHZvaWQgKikgaXIpOworICAgICAgaXItPnByaW50KCk7CisgICAgICBwcmludGYoIlxuIik7CisgICAgICBhYm9ydCgpOworICAgfQorCisgICBpZiAoIWlyLT5hcnJheV9pbmRleC0+dHlwZS0+aXNfc2NhbGFyKCkpIHsKKyAgICAgIHByaW50ZigiaXJfZGVyZWZlcmVuY2VfYXJyYXkgQCAlcCBkb2VzIG5vdCBoYXZlIHNjYWxhciBpbmRleDogJXNcbiIsCisgICAgICAgICAgICAgKHZvaWQgKikgaXIsIGlyLT5hcnJheV9pbmRleC0+dHlwZS0+bmFtZSk7CisgICAgICBhYm9ydCgpOworICAgfQorCisgICBpZiAoIWlyLT5hcnJheV9pbmRleC0+dHlwZS0+aXNfaW50ZWdlcigpKSB7CisgICAgICBwcmludGYoImlyX2RlcmVmZXJlbmNlX2FycmF5IEAgJXAgZG9lcyBub3QgaGF2ZSBpbnRlZ2VyIGluZGV4OiAlc1xuIiwKKyAgICAgICAgICAgICAodm9pZCAqKSBpciwgaXItPmFycmF5X2luZGV4LT50eXBlLT5uYW1lKTsKKyAgICAgIGFib3J0KCk7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZhbGlkYXRlOjp2aXNpdF9lbnRlcihpcl9pZiAqaXIpCit7CisgICBpZiAoaXItPmNvbmRpdGlvbi0+dHlwZSAhPSBnbHNsX3R5cGU6OmJvb2xfdHlwZSkgeworICAgICAgcHJpbnRmKCJpcl9pZiBjb25kaXRpb24gJXMgdHlwZSBpbnN0ZWFkIG9mIGJvb2wuXG4iLAorCSAgICAgaXItPmNvbmRpdGlvbi0+dHlwZS0+bmFtZSk7CisgICAgICBpci0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgIGFib3J0KCk7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFsaWRhdGU6OnZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uICppcikKK3sKKyAgIC8qIEZ1bmN0aW9uIGRlZmluaXRpb25zIGNhbm5vdCBiZSBuZXN0ZWQuCisgICAgKi8KKyAgIGlmICh0aGlzLT5jdXJyZW50X2Z1bmN0aW9uICE9IE5VTEwpIHsKKyAgICAgIHByaW50ZigiRnVuY3Rpb24gZGVmaW5pdGlvbiBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgZnVuY3Rpb24gIgorCSAgICAgImRlZmluaXRpb246XG4iKTsKKyAgICAgIHByaW50ZigiJXMgJXAgaW5zaWRlICVzICVwXG4iLAorCSAgICAgaXItPm5hbWUsICh2b2lkICopIGlyLAorCSAgICAgdGhpcy0+Y3VycmVudF9mdW5jdGlvbi0+bmFtZSwgKHZvaWQgKikgdGhpcy0+Y3VycmVudF9mdW5jdGlvbik7CisgICAgICBhYm9ydCgpOworICAgfQorCisgICAvKiBTdG9yZSB0aGUgY3VycmVudCBmdW5jdGlvbiBoaWVyYXJjaHkgYmVpbmcgdHJhdmVyc2VkLiAgVGhpcyBpcyB1c2VkCisgICAgKiBieSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIHZpc2l0b3IgdG8gZW5zdXJlIHRoYXQgdGhlIHNpZ25hdHVyZXMgYXJlCisgICAgKiBsaW5rZWQgd2l0aCB0aGUgY29ycmVjdCBmdW5jdGlvbnMuCisgICAgKi8KKyAgIHRoaXMtPmN1cnJlbnRfZnVuY3Rpb24gPSBpcjsKKworICAgdGhpcy0+dmFsaWRhdGVfaXIoaXIsIHRoaXMtPmRhdGEpOworCisgICAvKiBWZXJpZnkgdGhhdCBhbGwgb2YgdGhlIHRoaW5ncyBzdG9yZWQgaW4gdGhlIGxpc3Qgb2Ygc2lnbmF0dXJlcyBhcmUsCisgICAgKiBpbiBmYWN0LCBmdW5jdGlvbiBzaWduYXR1cmVzLgorICAgICovCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmlyLT5zaWduYXR1cmVzKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqc2lnID0gKGlyX2luc3RydWN0aW9uICopIG5vZGU7CisKKyAgICAgIGlmIChzaWctPmlyX3R5cGUgIT0gaXJfdHlwZV9mdW5jdGlvbl9zaWduYXR1cmUpIHsKKwkgcHJpbnRmKCJOb24tc2lnbmF0dXJlIGluIHNpZ25hdHVyZSBsaXN0IG9mIGZ1bmN0aW9uIGAlcydcbiIsCisJCWlyLT5uYW1lKTsKKwkgYWJvcnQoKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFsaWRhdGU6OnZpc2l0X2xlYXZlKGlyX2Z1bmN0aW9uICppcikKK3sKKyAgIGFzc2VydChyYWxsb2NfcGFyZW50KGlyLT5uYW1lKSA9PSBpcik7CisKKyAgIHRoaXMtPmN1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFsaWRhdGU6OnZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqaXIpCit7CisgICBpZiAodGhpcy0+Y3VycmVudF9mdW5jdGlvbiAhPSBpci0+ZnVuY3Rpb24oKSkgeworICAgICAgcHJpbnRmKCJGdW5jdGlvbiBzaWduYXR1cmUgbmVzdGVkIGluc2lkZSB3cm9uZyBmdW5jdGlvbiAiCisJICAgICAiZGVmaW5pdGlvbjpcbiIpOworICAgICAgcHJpbnRmKCIlcCBpbnNpZGUgJXMgJXAgaW5zdGVhZCBvZiAlcyAlcFxuIiwKKwkgICAgICh2b2lkICopIGlyLAorCSAgICAgdGhpcy0+Y3VycmVudF9mdW5jdGlvbi0+bmFtZSwgKHZvaWQgKikgdGhpcy0+Y3VycmVudF9mdW5jdGlvbiwKKwkgICAgIGlyLT5mdW5jdGlvbl9uYW1lKCksICh2b2lkICopIGlyLT5mdW5jdGlvbigpKTsKKyAgICAgIGFib3J0KCk7CisgICB9CisKKyAgIGlmIChpci0+cmV0dXJuX3R5cGUgPT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJGdW5jdGlvbiBzaWduYXR1cmUgJXAgZm9yIGZ1bmN0aW9uICVzIGhhcyBOVUxMIHJldHVybiB0eXBlLlxuIiwKKwkgICAgICh2b2lkICopIGlyLCBpci0+ZnVuY3Rpb25fbmFtZSgpKTsKKyAgICAgIGFib3J0KCk7CisgICB9CisKKyAgIHRoaXMtPnZhbGlkYXRlX2lyKGlyLCB0aGlzLT5kYXRhKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFsaWRhdGU6OnZpc2l0X2xlYXZlKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgc3dpdGNoIChpci0+b3BlcmF0aW9uKSB7CisgICBjYXNlIGlyX3Vub3BfYml0X25vdDoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUgPT0gaXItPnR5cGUpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OgorICAgICAgYXNzZXJ0KGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0JPT0wpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfbmVnOgorICAgY2FzZSBpcl91bm9wX2FiczoKKyAgIGNhc2UgaXJfdW5vcF9zaWduOgorICAgY2FzZSBpcl91bm9wX3JjcDoKKyAgIGNhc2UgaXJfdW5vcF9yc3E6CisgICBjYXNlIGlyX3Vub3Bfc3FydDoKKyAgICAgIGFzc2VydChpci0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMF0tPnR5cGUpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9leHA6CisgICBjYXNlIGlyX3Vub3BfbG9nOgorICAgY2FzZSBpcl91bm9wX2V4cDI6CisgICBjYXNlIGlyX3Vub3BfbG9nMjoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYXNzZXJ0KGlyLT50eXBlID09IGlyLT5vcGVyYW5kc1swXS0+dHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2YyaToKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYXNzZXJ0KGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9mMnU6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2kyZjoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9mMmI6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl91bm9wX2IyZjoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQk9PTCk7CisgICAgICBhc3NlcnQoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfaTJiOgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpOworICAgICAgYXNzZXJ0KGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0JPT0wpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfYjJpOgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfdTJmOgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9pMnU6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCk7CisgICAgICBhc3NlcnQoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF91Mmk6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX1VJTlQpOworICAgICAgYXNzZXJ0KGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2kyZjoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X2YyaToKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYXNzZXJ0KGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdW5vcF9iaXRjYXN0X3UyZjoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCk7CisgICAgICBhc3NlcnQoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3Vub3BfYml0Y2FzdF9mMnU6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfYW55OgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKTsKKyAgICAgIGFzc2VydChpci0+dHlwZSA9PSBnbHNsX3R5cGU6OmJvb2xfdHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3RydW5jOgorICAgY2FzZSBpcl91bm9wX3JvdW5kX2V2ZW46CisgICBjYXNlIGlyX3Vub3BfY2VpbDoKKyAgIGNhc2UgaXJfdW5vcF9mbG9vcjoKKyAgIGNhc2UgaXJfdW5vcF9mcmFjdDoKKyAgIGNhc2UgaXJfdW5vcF9zaW46CisgICBjYXNlIGlyX3Vub3BfY29zOgorICAgY2FzZSBpcl91bm9wX3Npbl9yZWR1Y2VkOgorICAgY2FzZSBpcl91bm9wX2Nvc19yZWR1Y2VkOgorICAgY2FzZSBpcl91bm9wX2RGZHg6CisgICBjYXNlIGlyX3Vub3BfZEZkeToKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+dHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF9wYWNrX3Vub3JtXzJ4MTY6CisgICBjYXNlIGlyX3Vub3BfcGFja19oYWxmXzJ4MTY6CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3BhY2tfc25vcm1fNHg4OgorICAgY2FzZSBpcl91bm9wX3BhY2tfdW5vcm1fNHg4OgorICAgICAgYXNzZXJ0KGlyLT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUgPT0gZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfc25vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfdW5vcm1fMngxNjoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2OgorICAgICAgYXNzZXJ0KGlyLT50eXBlID09IGdsc2xfdHlwZTo6dmVjMl90eXBlKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfc25vcm1fNHg4OgorICAgY2FzZSBpcl91bm9wX3VucGFja191bm9ybV80eDg6CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3VucGFja19oYWxmXzJ4MTZfc3BsaXRfeDoKKyAgIGNhc2UgaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3k6CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9iaXRmaWVsZF9yZXZlcnNlOgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+dHlwZSk7CisgICAgICBhc3NlcnQoaXItPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2JpdF9jb3VudDoKKyAgIGNhc2UgaXJfdW5vcF9maW5kX21zYjoKKyAgIGNhc2UgaXJfdW5vcF9maW5kX2xzYjoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyA9PSBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBhc3NlcnQoaXItPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3Bfbm9pc2U6CisgICAgICAvKiBYWFggd2hhdCBjYW4gd2UgYXNzZXJ0IGhlcmU/ICovCisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9hZGQ6CisgICBjYXNlIGlyX2Jpbm9wX3N1YjoKKyAgIGNhc2UgaXJfYmlub3BfbXVsOgorICAgY2FzZSBpcl9iaW5vcF9kaXY6CisgICBjYXNlIGlyX2Jpbm9wX21vZDoKKyAgIGNhc2UgaXJfYmlub3BfbWluOgorICAgY2FzZSBpcl9iaW5vcF9tYXg6CisgICBjYXNlIGlyX2Jpbm9wX3BvdzoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PQorICAgICAgICAgICAgIGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+YmFzZV90eXBlKTsKKworICAgICAgaWYgKGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfc2NhbGFyKCkpCisJIGFzc2VydChpci0+b3BlcmFuZHNbMV0tPnR5cGUgPT0gaXItPnR5cGUpOworICAgICAgZWxzZSBpZiAoaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc19zY2FsYXIoKSkKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+dHlwZSk7CisgICAgICBlbHNlIGlmIChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3ZlY3RvcigpICYmCisJICAgICAgIGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+aXNfdmVjdG9yKCkpIHsKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMV0tPnR5cGUpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlID09IGlyLT50eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2ltdWxfaGlnaDoKKyAgICAgIGFzc2VydChpci0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMF0tPnR5cGUpOworICAgICAgYXNzZXJ0KGlyLT50eXBlID09IGlyLT5vcGVyYW5kc1sxXS0+dHlwZSk7CisgICAgICBhc3NlcnQoaXItPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9jYXJyeToKKyAgIGNhc2UgaXJfYmlub3BfYm9ycm93OgorICAgICAgYXNzZXJ0KGlyLT50eXBlID09IGlyLT5vcGVyYW5kc1swXS0+dHlwZSk7CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gaXItPm9wZXJhbmRzWzFdLT50eXBlKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9VSU5UKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2xlc3M6CisgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICBjYXNlIGlyX2Jpbm9wX2xlcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfZ2VxdWFsOgorICAgY2FzZSBpcl9iaW5vcF9lcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfbmVxdWFsOgorICAgICAgLyogVGhlIHNlbWFudGljcyBvZiB0aGUgSVIgb3BlcmF0b3JzIGRpZmZlciBmcm9tIHRoZSBHTFNMIDwsID4sIDw9LCA+PSwKKyAgICAgICAqID09LCBhbmQgIT0gb3BlcmF0b3JzLiAgVGhlIElSIG9wZXJhdG9ycyBwZXJmb3JtIGEgY29tcG9uZW50LXdpc2UKKyAgICAgICAqIGNvbXBhcmlzb24gb24gc2NhbGFyIG9yIHZlY3RvciB0eXBlcyBhbmQgcmV0dXJuIGEgYm9vbGVhbiBzY2FsYXIgb3IKKyAgICAgICAqIHZlY3RvciB0eXBlIG9mIHRoZSBzYW1lIHNpemUuCisgICAgICAgKi8KKyAgICAgIGFzc2VydChpci0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUgPT0gaXItPm9wZXJhbmRzWzFdLT50eXBlKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3ZlY3RvcigpCisJICAgICB8fCBpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3NjYWxhcigpKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50cworCSAgICAgPT0gaXItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9hbGxfZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2FueV9uZXF1YWw6CisgICAgICAvKiBHTFNMID09IGFuZCAhPSBvcGVyYXRlIG9uIHNjYWxhcnMsIHZlY3RvcnMsIG1hdHJpY2VzIGFuZCBhcnJheXMsIGFuZAorICAgICAgICogcmV0dXJuIGEgc2NhbGFyIGJvb2xlYW4uICBUaGUgSVIgbWF0Y2hlcyB0aGF0LgorICAgICAgICovCisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gZ2xzbF90eXBlOjpib29sX3R5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMV0tPnR5cGUpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbHNoaWZ0OgorICAgY2FzZSBpcl9iaW5vcF9yc2hpZnQ6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc19pbnRlZ2VyKCkgJiYKKyAgICAgICAgICAgICBpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBpZiAoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc19zY2FsYXIoKSkgeworICAgICAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX3NjYWxhcigpKTsKKyAgICAgIH0KKyAgICAgIGlmIChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3ZlY3RvcigpICYmCisgICAgICAgICAgaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc192ZWN0b3IoKSkgeworICAgICAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmNvbXBvbmVudHMoKSA9PQorICAgICAgICAgICAgICAgICBpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmNvbXBvbmVudHMoKSk7CisgICAgICB9CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gaXItPm9wZXJhbmRzWzBdLT50eXBlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2JpdF9hbmQ6CisgICBjYXNlIGlyX2Jpbm9wX2JpdF94b3I6CisgICBjYXNlIGlyX2Jpbm9wX2JpdF9vcjoKKyAgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0KKyAgICAgICAgICAgICAgaXItPm9wZXJhbmRzWzFdLT50eXBlLT5iYXNlX3R5cGUpOworICAgICAgIGFzc2VydChpci0+dHlwZS0+aXNfaW50ZWdlcigpKTsKKyAgICAgICBpZiAoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc192ZWN0b3IoKSAmJgorICAgICAgICAgICBpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisgICAgICAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyA9PQorICAgICAgICAgICAgICAgICAgaXItPm9wZXJhbmRzWzFdLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworICAgICAgIH0KKyAgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sb2dpY19hbmQ6CisgICBjYXNlIGlyX2Jpbm9wX2xvZ2ljX3hvcjoKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfb3I6CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gZ2xzbF90eXBlOjpib29sX3R5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBnbHNsX3R5cGU6OmJvb2xfdHlwZSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzFdLT50eXBlID09IGdsc2xfdHlwZTo6Ym9vbF90eXBlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2RvdDoKKyAgICAgIGFzc2VydChpci0+dHlwZSA9PSBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9GTE9BVCk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc192ZWN0b3IoKSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlID09IGlyLT5vcGVyYW5kc1sxXS0+dHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9wYWNrX2hhbGZfMngxNl9zcGxpdDoKKyAgICAgIGFzc2VydChpci0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlID09IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzFdLT50eXBlID09IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9iZm06CisgICAgICBhc3NlcnQoaXItPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc19pbnRlZ2VyKCkpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+aXNfaW50ZWdlcigpKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX3Vib19sb2FkOgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+YXNfY29uc3RhbnQoKSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1sxXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sZGV4cDoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUgPT0gaXItPnR5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfZmxvYXQoKSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzFdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5jb21wb25lbnRzKCkgPT0KKyAgICAgICAgICAgICBpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmNvbXBvbmVudHMoKSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF92ZWN0b3JfZXh0cmFjdDoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3ZlY3RvcigpKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX3NjYWxhcigpCisgICAgICAgICAgICAgJiYgaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc19pbnRlZ2VyKCkpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdHJpb3BfZm1hOgorICAgICAgYXNzZXJ0KGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKTsKKyAgICAgIGFzc2VydChpci0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMF0tPnR5cGUpOworICAgICAgYXNzZXJ0KGlyLT50eXBlID09IGlyLT5vcGVyYW5kc1sxXS0+dHlwZSk7CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gaXItPm9wZXJhbmRzWzJdLT50eXBlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2xycDoKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMV0tPnR5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1syXS0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMF0tPnR5cGUgfHwgaXItPm9wZXJhbmRzWzJdLT50eXBlID09IGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF9jc2VsOgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9CT09MKTsKKyAgICAgIGFzc2VydChpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzID09IGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzKTsKKyAgICAgIGFzc2VydChpci0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMV0tPnR5cGUpOworICAgICAgYXNzZXJ0KGlyLT50eXBlID09IGlyLT5vcGVyYW5kc1syXS0+dHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF9iZmk6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc19pbnRlZ2VyKCkpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1sxXS0+dHlwZSA9PSBpci0+b3BlcmFuZHNbMl0tPnR5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1sxXS0+dHlwZSA9PSBpci0+dHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl90cmlvcF9iaXRmaWVsZF9leHRyYWN0OgorICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBpci0+dHlwZSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzFdLT50eXBlID09IGdsc2xfdHlwZTo6aW50X3R5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1syXS0+dHlwZSA9PSBnbHNsX3R5cGU6OmludF90eXBlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQ6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5pc192ZWN0b3IoKSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc19zY2FsYXIoKSk7CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gaXItPm9wZXJhbmRzWzFdLT50eXBlLT5iYXNlX3R5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1syXS0+dHlwZS0+aXNfc2NhbGFyKCkKKyAgICAgICAgICAgICAmJiBpci0+b3BlcmFuZHNbMl0tPnR5cGUtPmlzX2ludGVnZXIoKSk7CisgICAgICBhc3NlcnQoaXItPnR5cGUgPT0gaXItPm9wZXJhbmRzWzBdLT50eXBlKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3F1YWRvcF9iaXRmaWVsZF9pbnNlcnQ6CisgICAgICBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlID09IGlyLT50eXBlKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbMV0tPnR5cGUgPT0gaXItPnR5cGUpOworICAgICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1syXS0+dHlwZSA9PSBnbHNsX3R5cGU6OmludF90eXBlKTsKKyAgICAgIGFzc2VydChpci0+b3BlcmFuZHNbM10tPnR5cGUgPT0gZ2xzbF90eXBlOjppbnRfdHlwZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9xdWFkb3BfdmVjdG9yOgorICAgICAgLyogVGhlIHZlY3RvciBvcGVyYXRvciBjb2xsZWN0cyBzb21lIG51bWJlciBvZiBzY2FsYXJzIGFuZCBnZW5lcmF0ZXMgYQorICAgICAgICogdmVjdG9yIGZyb20gdGhlbS4KKyAgICAgICAqCisgICAgICAgKiAgLSBBbGwgb2YgdGhlIG9wZXJhbmRzIG11c3QgYmUgc2NhbGFyLgorICAgICAgICogIC0gTnVtYmVyIG9mIG9wZXJhbmRzIG11c3QgbWF0Y2hlIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLgorICAgICAgICogIC0gQmFzZSB0eXBlIG9mIHRoZSBvcGVyYW5kcyBtdXN0IG1hdGNoIHRoZSBiYXNlIHR5cGUgb2YgdGhlIHJlc3VsdC4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KGlyLT50eXBlLT5pc192ZWN0b3IoKSk7CisgICAgICBzd2l0Y2ggKGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIHsKKyAgICAgIGNhc2UgMjoKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfc2NhbGFyKCkpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gaXItPnR5cGUtPmJhc2VfdHlwZSk7CisJIGFzc2VydChpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX3NjYWxhcigpKTsKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+YmFzZV90eXBlID09IGlyLT50eXBlLT5iYXNlX3R5cGUpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzJdID09IE5VTEwpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzNdID09IE5VTEwpOworCSBicmVhazsKKyAgICAgIGNhc2UgMzoKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfc2NhbGFyKCkpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzBdLT50eXBlLT5iYXNlX3R5cGUgPT0gaXItPnR5cGUtPmJhc2VfdHlwZSk7CisJIGFzc2VydChpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX3NjYWxhcigpKTsKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+YmFzZV90eXBlID09IGlyLT50eXBlLT5iYXNlX3R5cGUpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzJdLT50eXBlLT5pc19zY2FsYXIoKSk7CisJIGFzc2VydChpci0+b3BlcmFuZHNbMl0tPnR5cGUtPmJhc2VfdHlwZSA9PSBpci0+dHlwZS0+YmFzZV90eXBlKTsKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1szXSA9PSBOVUxMKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIDQ6CisJIGFzc2VydChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3NjYWxhcigpKTsKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1swXS0+dHlwZS0+YmFzZV90eXBlID09IGlyLT50eXBlLT5iYXNlX3R5cGUpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc19zY2FsYXIoKSk7CisJIGFzc2VydChpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmJhc2VfdHlwZSA9PSBpci0+dHlwZS0+YmFzZV90eXBlKTsKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1syXS0+dHlwZS0+aXNfc2NhbGFyKCkpOworCSBhc3NlcnQoaXItPm9wZXJhbmRzWzJdLT50eXBlLT5iYXNlX3R5cGUgPT0gaXItPnR5cGUtPmJhc2VfdHlwZSk7CisJIGFzc2VydChpci0+b3BlcmFuZHNbM10tPnR5cGUtPmlzX3NjYWxhcigpKTsKKwkgYXNzZXJ0KGlyLT5vcGVyYW5kc1szXS0+dHlwZS0+YmFzZV90eXBlID09IGlyLT50eXBlLT5iYXNlX3R5cGUpOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIC8qIFRoZSBpc192ZWN0b3IgYXNzZXJ0aW9uIGFib3ZlIHNob3VsZCBwcmV2ZW50IGV4ZWN1dGlvbiBmcm9tIGV2ZXIKKwkgICogZ2V0dGluZyBoZXJlLgorCSAgKi8KKwkgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZhbGlkYXRlOjp2aXNpdF9sZWF2ZShpcl9zd2l6emxlICppcikKK3sKKyAgIHVuc2lnbmVkIGludCBjaGFuc1s0XSA9IHtpci0+bWFzay54LCBpci0+bWFzay55LCBpci0+bWFzay56LCBpci0+bWFzay53fTsKKworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgIGlmIChjaGFuc1tpXSA+PSBpci0+dmFsLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpIHsKKwkgcHJpbnRmKCJpcl9zd2l6emxlIEAgJXAgc3BlY2lmaWVzIGEgY2hhbm5lbCBub3QgcHJlc2VudCAiCisJCSJpbiB0aGUgdmFsdWUuXG4iLCAodm9pZCAqKSBpcik7CisJIGlyLT5wcmludCgpOworCSBhYm9ydCgpOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92YWxpZGF0ZTo6dmlzaXQoaXJfdmFyaWFibGUgKmlyKQoreworICAgLyogQW4gaXJfdmFyaWFibGUgaXMgdGhlIG9uZSB0aGluZyB0aGF0IGNhbiAoYW5kIHdpbGwpIGFwcGVhciBtdWx0aXBsZSB0aW1lcworICAgICogaW4gYW4gSVIgdHJlZS4gIEl0IGlzIGFkZGVkIHRvIHRoZSBoYXNodGFibGUgc28gdGhhdCBpdCBjYW4gYmUgdXNlZAorICAgICogaW4gdGhlIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQgYSB2YXJpYWJsZSBpcworICAgICogZGVjbGFyZWQgYmVmb3JlIGl0IGlzIGRlcmVmZXJlbmNlZC4KKyAgICAqLworICAgaWYgKGlyLT5uYW1lKQorICAgICAgYXNzZXJ0KHJhbGxvY19wYXJlbnQoaXItPm5hbWUpID09IGlyKTsKKworICAgaGFzaF90YWJsZV9pbnNlcnQoaHQsIGlyLCBpcik7CisKKworICAgLyogSWYgYSB2YXJpYWJsZSBpcyBhbiBhcnJheSwgdmVyaWZ5IHRoYXQgdGhlIG1heGltdW0gYXJyYXkgaW5kZXggaXMgaW4KKyAgICAqIGJvdW5kcy4gIFRoZXJlIHdhcyBvbmNlIGFuIGVycm9yIGluIEFTVC10by1ISVIgY29udmVyc2lvbiB0aGF0IHNldCB0aGlzCisgICAgKiB0byBiZSBvdXQgb2YgYm91bmRzLgorICAgICovCisgICBpZiAoaXItPnR5cGUtPmFycmF5X3NpemUoKSA+IDApIHsKKyAgICAgIGlmIChpci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzID49IGlyLT50eXBlLT5sZW5ndGgpIHsKKwkgcHJpbnRmKCJpcl92YXJpYWJsZSBoYXMgbWF4aW11bSBhY2Nlc3Mgb3V0IG9mIGJvdW5kcyAoJWQgdnMgJWQpXG4iLAorCQlpci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzLCBpci0+dHlwZS0+bGVuZ3RoIC0gMSk7CisJIGlyLT5wcmludCgpOworCSBhYm9ydCgpOworICAgICAgfQorICAgfQorCisgICAvKiBJZiBhIHZhcmlhYmxlIGlzIGFuIGludGVyZmFjZSBibG9jayAob3IgYW4gYXJyYXkgb2YgaW50ZXJmYWNlIGJsb2NrcyksCisgICAgKiB2ZXJpZnkgdGhhdCB0aGUgbWF4aW11bSBhcnJheSBpbmRleCBmb3IgZWFjaCBpbnRlcmZhY2UgbWVtYmVyIGlzIGluCisgICAgKiBib3VuZHMuCisgICAgKi8KKyAgIGlmIChpci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkpIHsKKyAgICAgIGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZHMgPQorICAgICAgICAgaXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5maWVsZHMuc3RydWN0dXJlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgIGlmIChmaWVsZHNbaV0udHlwZS0+YXJyYXlfc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgaWYgKGlyLT5tYXhfaWZjX2FycmF5X2FjY2Vzc1tpXSA+PSBmaWVsZHNbaV0udHlwZS0+bGVuZ3RoKSB7CisgICAgICAgICAgICAgICBwcmludGYoImlyX3ZhcmlhYmxlIGhhcyBtYXhpbXVtIGFjY2VzcyBvdXQgb2YgYm91bmRzIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgImZpZWxkICVzICglZCB2cyAlZClcbiIsIGZpZWxkc1tpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGlyLT5tYXhfaWZjX2FycmF5X2FjY2Vzc1tpXSwgZmllbGRzW2ldLnR5cGUtPmxlbmd0aCk7CisgICAgICAgICAgICAgICBpci0+cHJpbnQoKTsKKyAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGlmIChpci0+Y29uc3RhbnRfaW5pdGlhbGl6ZXIgIT0gTlVMTCAmJiAhaXItPmRhdGEuaGFzX2luaXRpYWxpemVyKSB7CisgICAgICBwcmludGYoImlyX3ZhcmlhYmxlIGRpZG4ndCBoYXZlIGFuIGluaXRpYWxpemVyLCBidXQgaGFzIGEgY29uc3RhbnQgIgorCSAgICAgImluaXRpYWxpemVyIHZhbHVlLlxuIik7CisgICAgICBpci0+cHJpbnQoKTsKKyAgICAgIGFib3J0KCk7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZhbGlkYXRlOjp2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGNvbnN0IGlyX2RlcmVmZXJlbmNlICpjb25zdCBsaHMgPSBpci0+bGhzOworICAgaWYgKGxocy0+dHlwZS0+aXNfc2NhbGFyKCkgfHwgbGhzLT50eXBlLT5pc192ZWN0b3IoKSkgeworICAgICAgaWYgKGlyLT53cml0ZV9tYXNrID09IDApIHsKKwkgcHJpbnRmKCJBc3NpZ25tZW50IExIUyBpcyAlcywgYnV0IHdyaXRlIG1hc2sgaXMgMDpcbiIsCisJCWxocy0+dHlwZS0+aXNfc2NhbGFyKCkgPyAic2NhbGFyIiA6ICJ2ZWN0b3IiKTsKKwkgaXItPnByaW50KCk7CisJIGFib3J0KCk7CisgICAgICB9CisKKyAgICAgIGludCBsaHNfY29tcG9uZW50cyA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCSBpZiAoaXItPndyaXRlX21hc2sgJiAoMSA8PCBpKSkKKwkgICAgbGhzX2NvbXBvbmVudHMrKzsKKyAgICAgIH0KKworICAgICAgaWYgKGxoc19jb21wb25lbnRzICE9IGlyLT5yaHMtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cykgeworCSBwcmludGYoIkFzc2lnbm1lbnQgY291bnQgb2YgTEhTIHdyaXRlIG1hc2sgY2hhbm5lbHMgZW5hYmxlZCBub3RcbiIKKwkJIm1hdGNoaW5nIFJIUyB2ZWN0b3Igc2l6ZSAoJWQgTEhTLCAlZCBSSFMpLlxuIiwKKwkJbGhzX2NvbXBvbmVudHMsIGlyLT5yaHMtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyk7CisJIGlyLT5wcmludCgpOworCSBhYm9ydCgpOworICAgICAgfQorICAgfQorCisgICB0aGlzLT52YWxpZGF0ZV9pcihpciwgdGhpcy0+ZGF0YSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZhbGlkYXRlOjp2aXNpdF9lbnRlcihpcl9jYWxsICppcikKK3sKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29uc3QgY2FsbGVlID0gaXItPmNhbGxlZTsKKworICAgaWYgKGNhbGxlZS0+aXJfdHlwZSAhPSBpcl90eXBlX2Z1bmN0aW9uX3NpZ25hdHVyZSkgeworICAgICAgcHJpbnRmKCJJUiBjYWxsZWQgYnkgaXJfY2FsbCBpcyBub3QgaXJfZnVuY3Rpb25fc2lnbmF0dXJlIVxuIik7CisgICAgICBhYm9ydCgpOworICAgfQorCisgICBpZiAoaXItPnJldHVybl9kZXJlZikgeworICAgICAgaWYgKGlyLT5yZXR1cm5fZGVyZWYtPnR5cGUgIT0gY2FsbGVlLT5yZXR1cm5fdHlwZSkgeworCSBwcmludGYoImNhbGxlZSB0eXBlICVzIGRvZXMgbm90IG1hdGNoIHJldHVybiBzdG9yYWdlIHR5cGUgJXNcbiIsCisJICAgICAgICBjYWxsZWUtPnJldHVybl90eXBlLT5uYW1lLCBpci0+cmV0dXJuX2RlcmVmLT50eXBlLT5uYW1lKTsKKwkgYWJvcnQoKTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAoY2FsbGVlLT5yZXR1cm5fdHlwZSAhPSBnbHNsX3R5cGU6OnZvaWRfdHlwZSkgeworICAgICAgcHJpbnRmKCJpcl9jYWxsIGhhcyBub24tdm9pZCBjYWxsZWUgYnV0IG5vIHJldHVybiBzdG9yYWdlXG4iKTsKKyAgICAgIGFib3J0KCk7CisgICB9CisKKyAgIGNvbnN0IGV4ZWNfbm9kZSAqZm9ybWFsX3BhcmFtX25vZGUgPSBjYWxsZWUtPnBhcmFtZXRlcnMuaGVhZDsKKyAgIGNvbnN0IGV4ZWNfbm9kZSAqYWN0dWFsX3BhcmFtX25vZGUgPSBpci0+YWN0dWFsX3BhcmFtZXRlcnMuaGVhZDsKKyAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoZm9ybWFsX3BhcmFtX25vZGUtPmlzX3RhaWxfc2VudGluZWwoKQorICAgICAgICAgICE9IGFjdHVhbF9wYXJhbV9ub2RlLT5pc190YWlsX3NlbnRpbmVsKCkpIHsKKyAgICAgICAgIHByaW50ZigiaXJfY2FsbCBoYXMgdGhlIHdyb25nIG51bWJlciBvZiBwYXJhbWV0ZXJzOlxuIik7CisgICAgICAgICBnb3RvIGR1bXBfaXI7CisgICAgICB9CisgICAgICBpZiAoZm9ybWFsX3BhcmFtX25vZGUtPmlzX3RhaWxfc2VudGluZWwoKSkgeworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb25zdCBpcl92YXJpYWJsZSAqZm9ybWFsX3BhcmFtCisgICAgICAgICA9IChjb25zdCBpcl92YXJpYWJsZSAqKSBmb3JtYWxfcGFyYW1fbm9kZTsKKyAgICAgIGNvbnN0IGlyX3J2YWx1ZSAqYWN0dWFsX3BhcmFtCisgICAgICAgICA9IChjb25zdCBpcl9ydmFsdWUgKikgYWN0dWFsX3BhcmFtX25vZGU7CisgICAgICBpZiAoZm9ybWFsX3BhcmFtLT50eXBlICE9IGFjdHVhbF9wYXJhbS0+dHlwZSkgeworICAgICAgICAgcHJpbnRmKCJpcl9jYWxsIHBhcmFtZXRlciB0eXBlIG1pc21hdGNoOlxuIik7CisgICAgICAgICBnb3RvIGR1bXBfaXI7CisgICAgICB9CisgICAgICBpZiAoZm9ybWFsX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX291dAorICAgICAgICAgIHx8IGZvcm1hbF9wYXJhbS0+ZGF0YS5tb2RlID09IGlyX3Zhcl9mdW5jdGlvbl9pbm91dCkgeworICAgICAgICAgaWYgKCFhY3R1YWxfcGFyYW0tPmlzX2x2YWx1ZSgpKSB7CisgICAgICAgICAgICBwcmludGYoImlyX2NhbGwgb3V0L2lub3V0IHBhcmFtZXRlcnMgbXVzdCBiZSBsdmFsdWVzOlxuIik7CisgICAgICAgICAgICBnb3RvIGR1bXBfaXI7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBmb3JtYWxfcGFyYW1fbm9kZSA9IGZvcm1hbF9wYXJhbV9ub2RlLT5uZXh0OworICAgICAgYWN0dWFsX3BhcmFtX25vZGUgPSBhY3R1YWxfcGFyYW1fbm9kZS0+bmV4dDsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCitkdW1wX2lyOgorICAgaXItPnByaW50KCk7CisgICBwcmludGYoImNhbGxlZTpcbiIpOworICAgY2FsbGVlLT5wcmludCgpOworICAgYWJvcnQoKTsKKyAgIHJldHVybiB2aXNpdF9zdG9wOworfQorCit2b2lkCitpcl92YWxpZGF0ZTo6dmFsaWRhdGVfaXIoaXJfaW5zdHJ1Y3Rpb24gKmlyLCB2b2lkICpkYXRhKQoreworICAgc3RydWN0IGhhc2hfdGFibGUgKmh0ID0gKHN0cnVjdCBoYXNoX3RhYmxlICopIGRhdGE7CisKKyAgIGlmIChoYXNoX3RhYmxlX2ZpbmQoaHQsIGlyKSkgeworICAgICAgcHJpbnRmKCJJbnN0cnVjdGlvbiBub2RlIHByZXNlbnQgdHdpY2UgaW4gaXIgdHJlZTpcbiIpOworICAgICAgaXItPnByaW50KCk7CisgICAgICBwcmludGYoIlxuIik7CisgICAgICBhYm9ydCgpOworICAgfQorICAgaGFzaF90YWJsZV9pbnNlcnQoaHQsIGlyLCBpcik7Cit9CisKK3ZvaWQKK2NoZWNrX25vZGVfdHlwZShpcl9pbnN0cnVjdGlvbiAqaXIsIHZvaWQgKmRhdGEpCit7CisgICAodm9pZCkgZGF0YTsKKworICAgaWYgKGlyLT5pcl90eXBlIDw9IGlyX3R5cGVfdW5zZXQgfHwgaXItPmlyX3R5cGUgPj0gaXJfdHlwZV9tYXgpIHsKKyAgICAgIHByaW50ZigiSW5zdHJ1Y3Rpb24gbm9kZSB3aXRoIHVuc2V0IHR5cGVcbiIpOworICAgICAgaXItPnByaW50KCk7IHByaW50ZigiXG4iKTsKKyAgIH0KKyAgIGlyX3J2YWx1ZSAqdmFsdWUgPSBpci0+YXNfcnZhbHVlKCk7CisgICBpZiAodmFsdWUgIT0gTlVMTCkKKyAgICAgIGFzc2VydCh2YWx1ZS0+dHlwZSAhPSBnbHNsX3R5cGU6OmVycm9yX3R5cGUpOworfQorCit2b2lkCit2YWxpZGF0ZV9pcl90cmVlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgLyogV2Ugc2hvdWxkbid0IGhhdmUgYW55IHJlYXNvbiB0byB2YWxpZGF0ZSBJUiBpbiBhIHJlbGVhc2UgYnVpbGQsCisgICAgKiBhbmQgaXQncyBoYWxmIGNvbXBvc2VkIG9mIGFzc2VydCgpcyBhbnl3YXkgd2hpY2ggd291bGRuJ3QgZG8KKyAgICAqIGFueXRoaW5nLgorICAgICovCisjaWZkZWYgREVCVUcKKyAgIGlyX3ZhbGlkYXRlIHY7CisKKyAgIHYucnVuKGluc3RydWN0aW9ucyk7CisKKyAgIGZvcmVhY2hfbGlzdChuLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworCisgICAgICB2aXNpdF90cmVlKGlyLCBjaGVja19ub2RlX3R5cGUsIE5VTEwpOworICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3ZhcmlhYmxlX3JlZmNvdW50LmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvaXJfdmFyaWFibGVfcmVmY291bnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2ViMWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3ZhcmlhYmxlX3JlZmNvdW50LmNwcApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaXJfdmFyaWFibGVfcmVmY291bnQuY3BwCisgKgorICogUHJvdmlkZXMgYSB2aXNpdG9yIHdoaWNoIHByb2R1Y2VzIGEgbGlzdCBvZiB2YXJpYWJsZXMgcmVmZXJlbmNlZCwKKyAqIGhvdyBtYW55IHRpbWVzIHRoZXkgd2VyZSByZWZlcmVuY2VkIGFuZCBhc3NpZ25lZCwgYW5kIHdoZXRoZXIgdGhleQorICogd2VyZSBkZWZpbmVkIGluIHRoZSBzY29wZS4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfdmFyaWFibGVfcmVmY291bnQuaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAibWFpbi9oYXNoX3RhYmxlLmgiCisKK2lyX3ZhcmlhYmxlX3JlZmNvdW50X3Zpc2l0b3I6OmlyX3ZhcmlhYmxlX3JlZmNvdW50X3Zpc2l0b3IoKQoreworICAgdGhpcy0+bWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworICAgdGhpcy0+aHQgPSBfbWVzYV9oYXNoX3RhYmxlX2NyZWF0ZShOVUxMLCBfbWVzYV9rZXlfcG9pbnRlcl9lcXVhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2VudHJ5KHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeSkKK3sKKyAgIGlyX3ZhcmlhYmxlX3JlZmNvdW50X2VudHJ5ICppdnJlID0gKGlyX3ZhcmlhYmxlX3JlZmNvdW50X2VudHJ5ICopIGVudHJ5LT5kYXRhOworICAgZGVsZXRlIGl2cmU7Cit9CisKK2lyX3ZhcmlhYmxlX3JlZmNvdW50X3Zpc2l0b3I6On5pcl92YXJpYWJsZV9yZWZjb3VudF92aXNpdG9yKCkKK3sKKyAgIHJhbGxvY19mcmVlKHRoaXMtPm1lbV9jdHgpOworICAgX21lc2FfaGFzaF90YWJsZV9kZXN0cm95KHRoaXMtPmh0LCBmcmVlX2VudHJ5KTsKK30KKworLy8gY29uc3RydWN0b3IKK2lyX3ZhcmlhYmxlX3JlZmNvdW50X2VudHJ5Ojppcl92YXJpYWJsZV9yZWZjb3VudF9lbnRyeShpcl92YXJpYWJsZSAqdmFyKQoreworICAgdGhpcy0+dmFyID0gdmFyOworICAgYXNzaWduID0gTlVMTDsKKyAgIGFzc2lnbmVkX2NvdW50ID0gMDsKKyAgIGRlY2xhcmF0aW9uID0gZmFsc2U7CisgICByZWZlcmVuY2VkX2NvdW50ID0gMDsKK30KKworCitpcl92YXJpYWJsZV9yZWZjb3VudF9lbnRyeSAqCitpcl92YXJpYWJsZV9yZWZjb3VudF92aXNpdG9yOjpnZXRfdmFyaWFibGVfZW50cnkoaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGFzc2VydCh2YXIpOworCisgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqZSA9IF9tZXNhX2hhc2hfdGFibGVfc2VhcmNoKHRoaXMtPmh0LAorCQkJCQkJICAgIF9tZXNhX2hhc2hfcG9pbnRlcih2YXIpLAorCQkJCQkJICAgIHZhcik7CisgICBpZiAoZSkKKyAgICAgIHJldHVybiAoaXJfdmFyaWFibGVfcmVmY291bnRfZW50cnkgKillLT5kYXRhOworCisgICBpcl92YXJpYWJsZV9yZWZjb3VudF9lbnRyeSAqZW50cnkgPSBuZXcgaXJfdmFyaWFibGVfcmVmY291bnRfZW50cnkodmFyKTsKKyAgIGFzc2VydChlbnRyeS0+cmVmZXJlbmNlZF9jb3VudCA9PSAwKTsKKyAgIF9tZXNhX2hhc2hfdGFibGVfaW5zZXJ0KHRoaXMtPmh0LCBfbWVzYV9oYXNoX3BvaW50ZXIodmFyKSwgdmFyLCBlbnRyeSk7CisKKyAgIHJldHVybiBlbnRyeTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFyaWFibGVfcmVmY291bnRfdmlzaXRvcjo6dmlzaXQoaXJfdmFyaWFibGUgKmlyKQoreworICAgaXJfdmFyaWFibGVfcmVmY291bnRfZW50cnkgKmVudHJ5ID0gdGhpcy0+Z2V0X3ZhcmlhYmxlX2VudHJ5KGlyKTsKKyAgIGlmIChlbnRyeSkKKyAgICAgIGVudHJ5LT5kZWNsYXJhdGlvbiA9IHRydWU7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFyaWFibGVfcmVmY291bnRfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQoreworICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IGlyLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisgICBpcl92YXJpYWJsZV9yZWZjb3VudF9lbnRyeSAqZW50cnkgPSB0aGlzLT5nZXRfdmFyaWFibGVfZW50cnkodmFyKTsKKworICAgaWYgKGVudHJ5KQorICAgICAgZW50cnktPnJlZmVyZW5jZWRfY291bnQrKzsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92YXJpYWJsZV9yZWZjb3VudF92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgLyogV2UgZG9uJ3Qgd2FudCB0byBkZXNjZW5kIGludG8gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kCisgICAgKiBkZWFkLWNvZGUgZWxpbWluYXRlIHRoZW0sIHNvIGp1c3QgYWNjZXB0IHRoZSBib2R5IGhlcmUuCisgICAgKi8KKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5ib2R5KTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFyaWFibGVfcmVmY291bnRfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpcl92YXJpYWJsZV9yZWZjb3VudF9lbnRyeSAqZW50cnk7CisgICBlbnRyeSA9IHRoaXMtPmdldF92YXJpYWJsZV9lbnRyeShpci0+bGhzLT52YXJpYWJsZV9yZWZlcmVuY2VkKCkpOworICAgaWYgKGVudHJ5KSB7CisgICAgICBlbnRyeS0+YXNzaWduZWRfY291bnQrKzsKKyAgICAgIGlmIChlbnRyeS0+YXNzaWduID09IE5VTEwpCisJIGVudHJ5LT5hc3NpZ24gPSBpcjsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl92YXJpYWJsZV9yZWZjb3VudC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9pcl92YXJpYWJsZV9yZWZjb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWU4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2lyX3ZhcmlhYmxlX3JlZmNvdW50LmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgaXJfdmFyaWFibGVfcmVmY291bnQuaAorICoKKyAqIFByb3ZpZGVzIGEgdmlzaXRvciB3aGljaCBwcm9kdWNlcyBhIGxpc3Qgb2YgdmFyaWFibGVzIHJlZmVyZW5jZWQsCisgKiBob3cgbWFueSB0aW1lcyB0aGV5IHdlcmUgcmVmZXJlbmNlZCBhbmQgYXNzaWduZWQsIGFuZCB3aGV0aGVyIHRoZXkKKyAqIHdlcmUgZGVmaW5lZCBpbiB0aGUgc2NvcGUuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworY2xhc3MgaXJfdmFyaWFibGVfcmVmY291bnRfZW50cnkKK3sKK3B1YmxpYzoKKyAgIGlyX3ZhcmlhYmxlX3JlZmNvdW50X2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpOworCisgICBpcl92YXJpYWJsZSAqdmFyOyAvKiBUaGUga2V5OiB0aGUgdmFyaWFibGUncyBwb2ludGVyLiAqLworICAgaXJfYXNzaWdubWVudCAqYXNzaWduOyAvKiBBbiBhc3NpZ25tZW50IHRvIHRoZSB2YXJpYWJsZSwgaWYgYW55ICovCisKKyAgIC8qKiBOdW1iZXIgb2YgdGltZXMgdGhlIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQsIGluY2x1ZGluZyBhc3NpZ25tZW50cy4gKi8KKyAgIHVuc2lnbmVkIHJlZmVyZW5jZWRfY291bnQ7CisKKyAgIC8qKiBOdW1iZXIgb2YgdGltZXMgdGhlIHZhcmlhYmxlIGlzIGFzc2lnbmVkLiAqLworICAgdW5zaWduZWQgYXNzaWduZWRfY291bnQ7CisKKyAgIGJvb2wgZGVjbGFyYXRpb247IC8qIElmIHRoZSB2YXJpYWJsZSBoYWQgYSBkZWNsIGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gKi8KK307CisKK2NsYXNzIGlyX3ZhcmlhYmxlX3JlZmNvdW50X3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfdmFyaWFibGVfcmVmY291bnRfdmlzaXRvcih2b2lkKTsKKyAgIH5pcl92YXJpYWJsZV9yZWZjb3VudF92aXNpdG9yKHZvaWQpOworCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX3ZhcmlhYmxlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqKTsKKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKik7CisKKyAgIGlyX3ZhcmlhYmxlX3JlZmNvdW50X2VudHJ5ICpnZXRfdmFyaWFibGVfZW50cnkoaXJfdmFyaWFibGUgKnZhcik7CisKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKKworICAgdm9pZCAqbWVtX2N0eDsKK307CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpYmZucy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saWJmbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc2MGRiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saWJmbnMuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgTHVuYXJHIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8vIEx1bmFyRyBBREQ6CisKKyNpZm5kZWYgTElCRk5TX0gKKyNkZWZpbmUgTElCRk5TX0gKKworI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisKKyNlbmRpZiAvLyBMSUJGTlNfSApkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX2F0b21pY3MuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX2F0b21pY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmNkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpbmtfYXRvbWljcy5jcHAKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl91bmlmb3JtLmgiCisjaW5jbHVkZSAibGlua2VyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKworbmFtZXNwYWNlIHsKKyAgIC8qCisgICAgKiBBdG9taWMgY291bnRlciBhcyBzZWVuIGJ5IHRoZSBwcm9ncmFtLgorICAgICovCisgICBzdHJ1Y3QgYWN0aXZlX2F0b21pY19jb3VudGVyIHsKKyAgICAgIHVuc2lnbmVkIGlkOworICAgICAgaXJfdmFyaWFibGUgKnZhcjsKKyAgIH07CisKKyAgIC8qCisgICAgKiBBdG9taWMgY291bnRlciBidWZmZXIgcmVmZXJlbmNlZCBieSB0aGUgcHJvZ3JhbS4gIFRoZXJlIGlzIGEgb25lCisgICAgKiB0byBvbmUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGVzZSBhbmQgdGhlIG9iamVjdHMgdGhhdCBjYW4gYmUKKyAgICAqIHF1ZXJpZWQgdXNpbmcgZ2xHZXRBY3RpdmVBdG9taWNDb3VudGVyQnVmZmVyaXYoKS4KKyAgICAqLworICAgc3RydWN0IGFjdGl2ZV9hdG9taWNfYnVmZmVyIHsKKyAgICAgIGFjdGl2ZV9hdG9taWNfYnVmZmVyKCkKKyAgICAgICAgIDogY291bnRlcnMoMCksIG51bV9jb3VudGVycygwKSwgc3RhZ2VfcmVmZXJlbmNlcygpLCBzaXplKDApCisgICAgICB7fQorCisgICAgICB+YWN0aXZlX2F0b21pY19idWZmZXIoKQorICAgICAgeworICAgICAgICAgZnJlZShjb3VudGVycyk7CisgICAgICB9CisKKyAgICAgIHZvaWQgcHVzaF9iYWNrKHVuc2lnbmVkIGlkLCBpcl92YXJpYWJsZSAqdmFyKQorICAgICAgeworICAgICAgICAgY291bnRlcnMgPSAoYWN0aXZlX2F0b21pY19jb3VudGVyICopCisgICAgICAgICAgICByZWFsbG9jKGNvdW50ZXJzLCBzaXplb2YoYWN0aXZlX2F0b21pY19jb3VudGVyKSAqIChudW1fY291bnRlcnMgKyAxKSk7CisKKyAgICAgICAgIGNvdW50ZXJzW251bV9jb3VudGVyc10uaWQgPSBpZDsKKyAgICAgICAgIGNvdW50ZXJzW251bV9jb3VudGVyc10udmFyID0gdmFyOworICAgICAgICAgbnVtX2NvdW50ZXJzKys7CisgICAgICB9CisKKyAgICAgIGFjdGl2ZV9hdG9taWNfY291bnRlciAqY291bnRlcnM7CisgICAgICB1bnNpZ25lZCBudW1fY291bnRlcnM7CisgICAgICB1bnNpZ25lZCBzdGFnZV9yZWZlcmVuY2VzW01FU0FfU0hBREVSX1NUQUdFU107CisgICAgICB1bnNpZ25lZCBzaXplOworICAgfTsKKworICAgaW50CisgICBjbXBfYWN0aXZlcyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQorICAgeworICAgICAgY29uc3QgYWN0aXZlX2F0b21pY19jb3VudGVyICpjb25zdCBmaXJzdCA9IChhY3RpdmVfYXRvbWljX2NvdW50ZXIgKikgYTsKKyAgICAgIGNvbnN0IGFjdGl2ZV9hdG9taWNfY291bnRlciAqY29uc3Qgc2Vjb25kID0gKGFjdGl2ZV9hdG9taWNfY291bnRlciAqKSBiOworCisgICAgICByZXR1cm4gaW50KGZpcnN0LT52YXItPmRhdGEuYXRvbWljLm9mZnNldCkgLSBpbnQoc2Vjb25kLT52YXItPmRhdGEuYXRvbWljLm9mZnNldCk7CisgICB9CisKKyAgIGJvb2wKKyAgIGNoZWNrX2F0b21pY19jb3VudGVyc19vdmVybGFwKGNvbnN0IGlyX3ZhcmlhYmxlICp4LCBjb25zdCBpcl92YXJpYWJsZSAqeSkKKyAgIHsKKyAgICAgIHJldHVybiAoKHgtPmRhdGEuYXRvbWljLm9mZnNldCA+PSB5LT5kYXRhLmF0b21pYy5vZmZzZXQgJiYKKyAgICAgICAgICAgICAgIHgtPmRhdGEuYXRvbWljLm9mZnNldCA8IHktPmRhdGEuYXRvbWljLm9mZnNldCArIHktPnR5cGUtPmF0b21pY19zaXplKCkpIHx8CisgICAgICAgICAgICAgICh5LT5kYXRhLmF0b21pYy5vZmZzZXQgPj0geC0+ZGF0YS5hdG9taWMub2Zmc2V0ICYmCisgICAgICAgICAgICAgICB5LT5kYXRhLmF0b21pYy5vZmZzZXQgPCB4LT5kYXRhLmF0b21pYy5vZmZzZXQgKyB4LT50eXBlLT5hdG9taWNfc2l6ZSgpKSk7CisgICB9CisKKyAgIGFjdGl2ZV9hdG9taWNfYnVmZmVyICoKKyAgIGZpbmRfYWN0aXZlX2F0b21pY19jb3VudGVycyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbnVtX2J1ZmZlcnMpCisgICB7CisgICAgICBhY3RpdmVfYXRvbWljX2J1ZmZlciAqY29uc3QgYnVmZmVycyA9CisgICAgICAgICBuZXcgYWN0aXZlX2F0b21pY19idWZmZXJbY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5nc107CisKKyAgICAgICpudW1fYnVmZmVycyA9IDA7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7ICsraSkgeworICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2ggPSBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXTsKKyAgICAgICAgIGlmIChzaCA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBzaC0+aXIpIHsKKyAgICAgICAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSAoKGlyX2luc3RydWN0aW9uICopbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgICAgICAgIGlmICh2YXIgJiYgdmFyLT50eXBlLT5jb250YWluc19hdG9taWMoKSkgeworICAgICAgICAgICAgICAgdW5zaWduZWQgaWQgPSAwOworICAgICAgICAgICAgICAgYm9vbCBmb3VuZCA9IHByb2ctPlVuaWZvcm1IYXNoLT5nZXQoaWQsIHZhci0+bmFtZSk7CisgICAgICAgICAgICAgICBhc3NlcnQoZm91bmQpOworICAgICAgICAgICAgICAgKHZvaWQpIGZvdW5kOworICAgICAgICAgICAgICAgYWN0aXZlX2F0b21pY19idWZmZXIgKmJ1ZiA9ICZidWZmZXJzW3Zhci0+ZGF0YS5iaW5kaW5nXTsKKworICAgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGUgYnVmZmVyIGlzIHVzZWQsIGluY3JlbWVudAorICAgICAgICAgICAgICAgICogdGhlIGNvdW50ZXIgb2YgYnVmZmVycyB1c2VkLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBpZiAoYnVmLT5zaXplID09IDApCisgICAgICAgICAgICAgICAgICAoKm51bV9idWZmZXJzKSsrOworCisgICAgICAgICAgICAgICBidWYtPnB1c2hfYmFjayhpZCwgdmFyKTsKKworICAgICAgICAgICAgICAgYnVmLT5zdGFnZV9yZWZlcmVuY2VzW2ldKys7CisgICAgICAgICAgICAgICBidWYtPnNpemUgPSBNQVgyKGJ1Zi0+c2l6ZSwgdmFyLT5kYXRhLmF0b21pYy5vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnR5cGUtPmF0b21pY19zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5nczsgaSsrKSB7CisgICAgICAgICBpZiAoYnVmZmVyc1tpXS5zaXplID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgcXNvcnQoYnVmZmVyc1tpXS5jb3VudGVycywgYnVmZmVyc1tpXS5udW1fY291bnRlcnMsCisgICAgICAgICAgICAgICBzaXplb2YoYWN0aXZlX2F0b21pY19jb3VudGVyKSwKKyAgICAgICAgICAgICAgIGNtcF9hY3RpdmVzKTsKKworICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMTsgaiA8IGJ1ZmZlcnNbaV0ubnVtX2NvdW50ZXJzOyBqKyspIHsKKyAgICAgICAgICAgIC8qIElmIGFuIG92ZXJsYXBwaW5nIGNvdW50ZXIgZm91bmQsIGl0IG11c3QgYmUgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgICAgICAgICAgKiBzYW1lIGNvdW50ZXIgZnJvbSBhIGRpZmZlcmVudCBzaGFkZXIgc3RhZ2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjaGVja19hdG9taWNfY291bnRlcnNfb3ZlcmxhcChidWZmZXJzW2ldLmNvdW50ZXJzW2otMV0udmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0uY291bnRlcnNbal0udmFyKQorICAgICAgICAgICAgICAgICYmIHN0cmNtcChidWZmZXJzW2ldLmNvdW50ZXJzW2otMV0udmFyLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzW2ldLmNvdW50ZXJzW2pdLnZhci0+bmFtZSkgIT0gMCkgeworICAgICAgICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csICJBdG9taWMgY291bnRlciAlcyBkZWNsYXJlZCBhdCBvZmZzZXQgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBpcyBhbHJlYWR5IGluIHVzZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0uY291bnRlcnNbal0udmFyLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0uY291bnRlcnNbal0udmFyLT5kYXRhLmF0b21pYy5vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGJ1ZmZlcnM7CisgICB9Cit9CisKK3ZvaWQKK2xpbmtfYXNzaWduX2F0b21pY19jb3VudGVyX3Jlc291cmNlcyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHVuc2lnbmVkIG51bV9idWZmZXJzOworICAgYWN0aXZlX2F0b21pY19idWZmZXIgKmFicyA9CisgICAgICBmaW5kX2FjdGl2ZV9hdG9taWNfY291bnRlcnMoY3R4LCBwcm9nLCAmbnVtX2J1ZmZlcnMpOworCisgICBwcm9nLT5BdG9taWNCdWZmZXJzID0gcnphbGxvY19hcnJheShwcm9nLCBnbF9hY3RpdmVfYXRvbWljX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9idWZmZXJzKTsKKyAgIHByb2ctPk51bUF0b21pY0J1ZmZlcnMgPSBudW1fYnVmZmVyczsKKworICAgdW5zaWduZWQgaSA9IDA7CisgICBmb3IgKHVuc2lnbmVkIGJpbmRpbmcgPSAwOworICAgICAgICBiaW5kaW5nIDwgY3R4LT5Db25zdC5NYXhBdG9taWNCdWZmZXJCaW5kaW5nczsKKyAgICAgICAgYmluZGluZysrKSB7CisKKyAgICAgIC8qIElmIHRoZSBiaW5kaW5nIHdhcyBub3QgdXNlZCwgc2tpcC4KKyAgICAgICAqLworICAgICAgaWYgKGFic1tiaW5kaW5nXS5zaXplID09IDApCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgYWN0aXZlX2F0b21pY19idWZmZXIgJmFiID0gYWJzW2JpbmRpbmddOworICAgICAgZ2xfYWN0aXZlX2F0b21pY19idWZmZXIgJm1hYiA9IHByb2ctPkF0b21pY0J1ZmZlcnNbaV07CisKKyAgICAgIC8qIEFzc2lnbiBidWZmZXItc3BlY2lmaWMgZmllbGRzLiAqLworICAgICAgbWFiLkJpbmRpbmcgPSBiaW5kaW5nOworICAgICAgbWFiLk1pbmltdW1TaXplID0gYWIuc2l6ZTsKKyAgICAgIG1hYi5Vbmlmb3JtcyA9IHJ6YWxsb2NfYXJyYXkocHJvZy0+QXRvbWljQnVmZmVycywgR0x1aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYi5udW1fY291bnRlcnMpOworICAgICAgbWFiLk51bVVuaWZvcm1zID0gYWIubnVtX2NvdW50ZXJzOworCisgICAgICAvKiBBc3NpZ24gY291bnRlci1zcGVjaWZpYyBmaWVsZHMuICovCisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgYWIubnVtX2NvdW50ZXJzOyBqKyspIHsKKyAgICAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSBhYi5jb3VudGVyc1tqXS52YXI7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBpZCA9IGFiLmNvdW50ZXJzW2pdLmlkOworICAgICAgICAgZ2xfdW5pZm9ybV9zdG9yYWdlICpjb25zdCBzdG9yYWdlID0gJnByb2ctPlVuaWZvcm1TdG9yYWdlW2lkXTsKKworICAgICAgICAgbWFiLlVuaWZvcm1zW2pdID0gaWQ7CisgICAgICAgICB2YXItPmRhdGEuYXRvbWljLmJ1ZmZlcl9pbmRleCA9IGk7CisgICAgICAgICBzdG9yYWdlLT5hdG9taWNfYnVmZmVyX2luZGV4ID0gaTsKKyAgICAgICAgIHN0b3JhZ2UtPm9mZnNldCA9IHZhci0+ZGF0YS5hdG9taWMub2Zmc2V0OworICAgICAgICAgc3RvcmFnZS0+YXJyYXlfc3RyaWRlID0gKHZhci0+dHlwZS0+aXNfYXJyYXkoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT50eXBlLT5lbGVtZW50X3R5cGUoKS0+YXRvbWljX3NpemUoKSA6IDApOworICAgICAgfQorCisgICAgICAvKiBBc3NpZ24gc3RhZ2Utc3BlY2lmaWMgZmllbGRzLiAqLworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IE1FU0FfU0hBREVSX1NUQUdFUzsgKytqKQorICAgICAgICAgbWFiLlN0YWdlUmVmZXJlbmNlc1tqXSA9CisgICAgICAgICAgICAoYWIuc3RhZ2VfcmVmZXJlbmNlc1tqXSA/IEdMX1RSVUUgOiBHTF9GQUxTRSk7CisKKyAgICAgIGkrKzsKKyAgIH0KKworICAgZGVsZXRlIFtdIGFiczsKKyAgIGFzc2VydChpID09IG51bV9idWZmZXJzKTsKK30KKwordm9pZAorbGlua19jaGVja19hdG9taWNfY291bnRlcl9yZXNvdXJjZXMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHVuc2lnbmVkIG51bV9idWZmZXJzOworICAgYWN0aXZlX2F0b21pY19idWZmZXIgKmNvbnN0IGFicyA9CisgICAgICBmaW5kX2FjdGl2ZV9hdG9taWNfY291bnRlcnMoY3R4LCBwcm9nLCAmbnVtX2J1ZmZlcnMpOworICAgdW5zaWduZWQgYXRvbWljX2NvdW50ZXJzW01FU0FfU0hBREVSX1NUQUdFU10gPSB7fTsKKyAgIHVuc2lnbmVkIGF0b21pY19idWZmZXJzW01FU0FfU0hBREVSX1NUQUdFU10gPSB7fTsKKyAgIHVuc2lnbmVkIHRvdGFsX2F0b21pY19jb3VudGVycyA9IDA7CisgICB1bnNpZ25lZCB0b3RhbF9hdG9taWNfYnVmZmVycyA9IDA7CisKKyAgIC8qIFN1bSB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzLiAgTm90ZSB0aGF0IHRoaXMgY291bnRzIGJ1ZmZlcnMgYW5kCisgICAgKiBjb3VudGVycyByZWZlcmVuY2VkIGJ5IHNldmVyYWwgc2hhZGVyIHN0YWdlcyBtdWx0aXBsZSB0aW1lcworICAgICogYWdhaW5zdCB0aGUgY29tYmluZWQgbGltaXQgLS0gVGhhdCdzIHRoZSBiZWhhdmlvciB0aGUgc3BlYworICAgICogcmVxdWlyZXMuCisgICAgKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjdHgtPkNvbnN0Lk1heEF0b21pY0J1ZmZlckJpbmRpbmdzOyBpKyspIHsKKyAgICAgIGlmIChhYnNbaV0uc2l6ZSA9PSAwKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBNRVNBX1NIQURFUl9TVEFHRVM7ICsraikgeworICAgICAgICAgY29uc3QgdW5zaWduZWQgbiA9IGFic1tpXS5zdGFnZV9yZWZlcmVuY2VzW2pdOworCisgICAgICAgICBpZiAobikgeworICAgICAgICAgICAgYXRvbWljX2NvdW50ZXJzW2pdICs9IG47CisgICAgICAgICAgICB0b3RhbF9hdG9taWNfY291bnRlcnMgKz0gbjsKKyAgICAgICAgICAgIGF0b21pY19idWZmZXJzW2pdKys7CisgICAgICAgICAgICB0b3RhbF9hdG9taWNfYnVmZmVycysrOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBDaGVjayB0aGF0IHRoZXkgYXJlIHdpdGhpbiB0aGUgc3VwcG9ydGVkIGxpbWl0cy4gKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworICAgICAgaWYgKGF0b21pY19jb3VudGVyc1tpXSA+IGN0eC0+Q29uc3QuUHJvZ3JhbVtpXS5NYXhBdG9taWNDb3VudGVycykKKyAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiVG9vIG1hbnkgJXMgc2hhZGVyIGF0b21pYyBjb3VudGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhpKSk7CisKKyAgICAgIGlmIChhdG9taWNfYnVmZmVyc1tpXSA+IGN0eC0+Q29uc3QuUHJvZ3JhbVtpXS5NYXhBdG9taWNCdWZmZXJzKQorICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csICJUb28gbWFueSAlcyBzaGFkZXIgYXRvbWljIGNvdW50ZXIgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhpKSk7CisgICB9CisKKyAgIGlmICh0b3RhbF9hdG9taWNfY291bnRlcnMgPiBjdHgtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQ291bnRlcnMpCisgICAgICBsaW5rZXJfZXJyb3IocHJvZywgIlRvbyBtYW55IGNvbWJpbmVkIGF0b21pYyBjb3VudGVycyIpOworCisgICBpZiAodG90YWxfYXRvbWljX2J1ZmZlcnMgPiBjdHgtPkNvbnN0Lk1heENvbWJpbmVkQXRvbWljQnVmZmVycykKKyAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiVG9vIG1hbnkgY29tYmluZWQgYXRvbWljIGJ1ZmZlcnMiKTsKKworICAgZGVsZXRlIFtdIGFiczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua19mdW5jdGlvbnMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX2Z1bmN0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NTY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua19mdW5jdGlvbnMuY3BwCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImxpYmZucy5oIiAvLyBMdW5hckcgQUREOgorI2luY2x1ZGUgImdsc2xfc3ltYm9sX3RhYmxlLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAibGlua2VyLmgiCisKK3N0YXRpYyBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorZmluZF9tYXRjaGluZ19zaWduYXR1cmUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZXhlY19saXN0ICphY3R1YWxfcGFyYW1ldGVycywKKwkJCWdsX3NoYWRlciAqKnNoYWRlcl9saXN0LCB1bnNpZ25lZCBudW1fc2hhZGVycywKKwkJCWJvb2wgdXNlX2J1aWx0aW4pOworCituYW1lc3BhY2UgeworCitjbGFzcyBjYWxsX2xpbmtfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBjYWxsX2xpbmtfdmlzaXRvcihnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywgZ2xfc2hhZGVyICpsaW5rZWQsCisJCSAgICAgZ2xfc2hhZGVyICoqc2hhZGVyX2xpc3QsIHVuc2lnbmVkIG51bV9zaGFkZXJzKQorICAgeworICAgICAgdGhpcy0+cHJvZyA9IHByb2c7CisgICAgICB0aGlzLT5zaGFkZXJfbGlzdCA9IHNoYWRlcl9saXN0OworICAgICAgdGhpcy0+bnVtX3NoYWRlcnMgPSBudW1fc2hhZGVyczsKKyAgICAgIHRoaXMtPnN1Y2Nlc3MgPSB0cnVlOworICAgICAgdGhpcy0+bGlua2VkID0gbGlua2VkOworCisgICAgICB0aGlzLT5sb2NhbHMgPSBoYXNoX3RhYmxlX2N0b3IoMCwgaGFzaF90YWJsZV9wb2ludGVyX2hhc2gsCisJCQkJICAgICBoYXNoX3RhYmxlX3BvaW50ZXJfY29tcGFyZSk7CisgICB9CisKKyAgIH5jYWxsX2xpbmtfdmlzaXRvcigpCisgICB7CisgICAgICBoYXNoX3RhYmxlX2R0b3IodGhpcy0+bG9jYWxzKTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl92YXJpYWJsZSAqaXIpCisgICB7CisgICAgICBoYXNoX3RhYmxlX2luc2VydChsb2NhbHMsIGlyLCBpcik7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfY2FsbCAqaXIpCisgICB7CisgICAgICAvKiBJZiBpciBpcyBhbiBpcl9jYWxsIGZyb20gYSBmdW5jdGlvbiB0aGF0IHdhcyBpbXBvcnRlZCBmcm9tIGFub3RoZXIKKyAgICAgICAqIHNoYWRlciBjYWxsZWUgd2lsbCBwb2ludCB0byBhbiBpcl9mdW5jdGlvbl9zaWduYXR1cmUgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgKiBzaGFkZXIuICBJbiB0aGlzIGNhc2UgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBNVVNUIE5PVCBCRSBNT0RJRklFRC4KKyAgICAgICAqIERvaW5nIHNvIHdpbGwgbW9kaWZ5IHRoZSBvcmlnaW5hbCBzaGFkZXIuICBUaGlzIG1heSBwcmV2ZW50IHRoYXQKKyAgICAgICAqIHNoYWRlciBmcm9tIGJlaW5nIGxpbmthYmxlIGluIG90aGVyIHByb2dyYW1zLgorICAgICAgICovCisgICAgICBjb25zdCBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmNvbnN0IGNhbGxlZSA9IGlyLT5jYWxsZWU7CisgICAgICBhc3NlcnQoY2FsbGVlICE9IE5VTEwpOworICAgICAgY29uc3QgY2hhciAqY29uc3QgbmFtZSA9IGNhbGxlZS0+ZnVuY3Rpb25fbmFtZSgpOworCisgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbiBzaWduYXR1cmUgYWxyZWFkeSBleGlzdHMgaW4gdGhlCisgICAgICAgKiBmaW5hbCBsaW5rZWQgc2hhZGVyLiAgSWYgaXQgZG9lcywgdXNlIGl0IGFzIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuCisgICAgICAgKi8KKyAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnID0KKwkgZmluZF9tYXRjaGluZ19zaWduYXR1cmUobmFtZSwgJmNhbGxlZS0+cGFyYW1ldGVycywgJmxpbmtlZCwgMSwKKwkJCQkgaXItPnVzZV9idWlsdGluKTsKKyAgICAgIGlmIChzaWcgIT0gTlVMTCkgeworCSBpci0+Y2FsbGVlID0gc2lnOworCSByZXR1cm4gdmlzaXRfY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIFRyeSB0byBmaW5kIHRoZSBzaWduYXR1cmUgaW4gb25lIG9mIHRoZSBvdGhlciBzaGFkZXJzIHRoYXQgaXMgYmVpbmcKKyAgICAgICAqIGxpbmtlZC4gIElmIGl0J3Mgbm90IGZvdW5kIHRoZXJlLCByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgKi8KKyAgICAgIHNpZyA9IGZpbmRfbWF0Y2hpbmdfc2lnbmF0dXJlKG5hbWUsICZpci0+YWN0dWFsX3BhcmFtZXRlcnMsIHNoYWRlcl9saXN0LAorCQkJCSAgICBudW1fc2hhZGVycywgaXItPnVzZV9idWlsdGluKTsKKyAgICAgIGlmIChzaWcgPT0gTlVMTCkgeworCSAvKiBGSU5JU0hNRTogTG9nIHRoZSBmdWxsIHNpZ25hdHVyZSBvZiB1bnJlc29sdmVkIGZ1bmN0aW9uLgorCSAgKi8KKwkgbGlua2VyX2Vycm9yKHRoaXMtPnByb2csICJ1bnJlc29sdmVkIHJlZmVyZW5jZSB0byBmdW5jdGlvbiBgJXMnXG4iLAorCQkgICAgICBuYW1lKTsKKwkgdGhpcy0+c3VjY2VzcyA9IGZhbHNlOworCSByZXR1cm4gdmlzaXRfc3RvcDsKKyAgICAgIH0KKworICAgICAgLyogRmluZCB0aGUgcHJvdG90eXBlIGluZm9ybWF0aW9uIGluIHRoZSBsaW5rZWQgc2hhZGVyLiAgR2VuZXJhdGUgYW55CisgICAgICAgKiBkZXRhaWxzIHRoYXQgbWF5IGJlIG1pc3NpbmcuCisgICAgICAgKi8KKyAgICAgIGlyX2Z1bmN0aW9uICpmID0gbGlua2VkLT5zeW1ib2xzLT5nZXRfZnVuY3Rpb24obmFtZSk7CisgICAgICBpZiAoZiA9PSBOVUxMKSB7CisJIGYgPSBuZXcobGlua2VkKSBpcl9mdW5jdGlvbihuYW1lKTsKKworCSAvKiBBZGQgdGhlIG5ldyBmdW5jdGlvbiB0byB0aGUgbGlua2VkIElSLiAgUHV0IGl0IGF0IHRoZSBlbmQKKyAgICAgICAgICAqIHNvIHRoYXQgaXQgY29tZXMgYWZ0ZXIgYW55IGdsb2JhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKyAgICAgICAgICAqIHRoYXQgaXQgcmVmZXJzIHRvLgorCSAgKi8KKwkgbGlua2VkLT5zeW1ib2xzLT5hZGRfZnVuY3Rpb24oZik7CisJIGxpbmtlZC0+aXItPnB1c2hfdGFpbChmKTsKKyAgICAgIH0KKworICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpsaW5rZWRfc2lnID0KKwkgZi0+ZXhhY3RfbWF0Y2hpbmdfc2lnbmF0dXJlKE5VTEwsICZjYWxsZWUtPnBhcmFtZXRlcnMpOworICAgICAgaWYgKChsaW5rZWRfc2lnID09IE5VTEwpCisJICB8fCAoKGxpbmtlZF9zaWcgIT0gTlVMTCkKKwkgICAgICAmJiAobGlua2VkX3NpZy0+aXNfYnVpbHRpbigpICE9IGlyLT51c2VfYnVpbHRpbikpKSB7CisJIGxpbmtlZF9zaWcgPSBuZXcobGlua2VkKSBpcl9mdW5jdGlvbl9zaWduYXR1cmUoY2FsbGVlLT5yZXR1cm5fdHlwZSk7CisJIGYtPmFkZF9zaWduYXR1cmUobGlua2VkX3NpZyk7CisgICAgICB9CisKKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQgbGlua2VkX3NpZyBhbmQgY2FsbGVkIG1heSBiZSB0aGUgc2FtZS4gIElmIGlyIGlzIGFuCisgICAgICAgKiBpcl9jYWxsIGZyb20gbGlua2VkIHRoZW4gbGlua2VkX3NpZyBhbmQgY2FsbGVlIHdpbGwgYmUKKyAgICAgICAqIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZXMgdGhhdCBoYXZlIG5vIGRlZmluaXRpb25zIChpc19kZWZpbmVkIGlzIGZhbHNlKS4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KCFsaW5rZWRfc2lnLT5pc19kZWZpbmVkKTsKKyAgICAgIGFzc2VydChsaW5rZWRfc2lnLT5ib2R5LmlzX2VtcHR5KCkpOworCisgICAgICAvKiBDcmVhdGUgYW4gaW4tcGxhY2UgY2xvbmUgb2YgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGlzIG11bHRpc3RlcAorICAgICAgICogcHJvY2VzcyBpbnRyb2R1Y2VzIHNvbWUgY29tcGxleGl0eSBoZXJlLCBidXQgaXQgaGFzIHNvbWUgYWR2YW50YWdlcy4KKyAgICAgICAqIFRoZSBwYXJhbWV0ZXIgbGlzdCBhbmQgdGhlIGFuZCBmdW5jdGlvbiBib2R5IGFyZSBjbG9uZWQgc2VwYXJhdGVseS4KKyAgICAgICAqIFRoZSBjbG9uZSBvZiB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgdXNlZCB0byBwcmltZSB0aGUgaGFzaHRhYmxlIHVzZWQKKyAgICAgICAqIHRvIHJlcGxhY2UgdmFyaWFibGUgcmVmZXJlbmNlcyBpbiB0aGUgY2xvbmVkIGJvZHkuCisgICAgICAgKgorICAgICAgICogVGhlIGJpZyBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgaXJfZnVuY3Rpb25fc2lnbmF0dXJlIGRvZXMgbm90IGNoYW5nZS4KKyAgICAgICAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIElSIHRyZWUgdG8KKyAgICAgICAqIHBhdGNoIGlyX2NhbGwgbm9kZXMuICBJbiBhZGRpdGlvbiwgdGhlcmUgaXMgbm8gd2F5IHRvIHJlbW92ZSBvcgorICAgICAgICogcmVwbGFjZSBzaWduYXR1cmUgc3RvcmVkIGluIGEgZnVuY3Rpb24uICBPbmUgY291bGQgZWFzaWx5IGJlIGFkZGVkLAorICAgICAgICogYnV0IHRoaXMgYXZvaWRzIHRoZSBuZWVkLgorICAgICAgICovCisgICAgICBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQgPSBoYXNoX3RhYmxlX2N0b3IoMCwgaGFzaF90YWJsZV9wb2ludGVyX2hhc2gsCisJCQkJCSAgICAgIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKTsKKyAgICAgIGV4ZWNfbGlzdCBmb3JtYWxfcGFyYW1ldGVyczsKKyAgICAgIGZvcmVhY2hfbGlzdF9jb25zdChub2RlLCAmc2lnLT5wYXJhbWV0ZXJzKSB7CisJIGNvbnN0IGlyX2luc3RydWN0aW9uICpjb25zdCBvcmlnaW5hbCA9IChpcl9pbnN0cnVjdGlvbiAqKSBub2RlOworCSBhc3NlcnQoY29uc3RfY2FzdDxpcl9pbnN0cnVjdGlvbiAqPihvcmlnaW5hbCktPmFzX3ZhcmlhYmxlKCkpOworCisJIGlyX2luc3RydWN0aW9uICpjb3B5ID0gb3JpZ2luYWwtPmNsb25lKGxpbmtlZCwgaHQpOworCSBmb3JtYWxfcGFyYW1ldGVycy5wdXNoX3RhaWwoY29weSk7CisgICAgICB9CisKKyAgICAgIGxpbmtlZF9zaWctPnJlcGxhY2VfcGFyYW1ldGVycygmZm9ybWFsX3BhcmFtZXRlcnMpOworCisgICAgICBpZiAoc2lnLT5pc19kZWZpbmVkKSB7CisgICAgICAgICBmb3JlYWNoX2xpc3RfY29uc3Qobm9kZSwgJnNpZy0+Ym9keSkgeworICAgICAgICAgICAgY29uc3QgaXJfaW5zdHJ1Y3Rpb24gKmNvbnN0IG9yaWdpbmFsID0gKGlyX2luc3RydWN0aW9uICopIG5vZGU7CisKKyAgICAgICAgICAgIGlyX2luc3RydWN0aW9uICpjb3B5ID0gb3JpZ2luYWwtPmNsb25lKGxpbmtlZCwgaHQpOworICAgICAgICAgICAgbGlua2VkX3NpZy0+Ym9keS5wdXNoX3RhaWwoY29weSk7CisgICAgICAgICB9CisKKyAgICAgICAgIGxpbmtlZF9zaWctPmlzX2RlZmluZWQgPSB0cnVlOworICAgICAgfQorCisgICAgICBoYXNoX3RhYmxlX2R0b3IoaHQpOworCisgICAgICAvKiBQYXRjaCByZWZlcmVuY2VzIGluc2lkZSB0aGUgZnVuY3Rpb24gdG8gdGhpbmdzIG91dHNpZGUgdGhlIGZ1bmN0aW9uCisgICAgICAgKiAoaS5lLiwgZnVuY3Rpb24gY2FsbHMgYW5kIGdsb2JhbCB2YXJpYWJsZXMpLgorICAgICAgICovCisgICAgICBsaW5rZWRfc2lnLT5hY2NlcHQodGhpcyk7CisKKyAgICAgIGlyLT5jYWxsZWUgPSBsaW5rZWRfc2lnOworCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfY2FsbCAqaXIpCisgICB7CisgICAgICAvKiBUcmF2ZXJzZSBsaXN0IG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIGFuZCBmb3IgYXJyYXkgcGFyYW1ldGVycworICAgICAgICogcHJvcGFnYXRlIG1heF9hcnJheV9hY2Nlc3MuIE90aGVyd2lzZSBhcnJheXMgdGhhdCBhcmUgb25seSByZWZlcmVuY2VkCisgICAgICAgKiBmcm9tIGluc2lkZSBmdW5jdGlvbnMgdmlhIGZ1bmN0aW9uIHBhcmFtZXRlcnMgd2lsbCBiZSBpbmNvcnJlY3RseQorICAgICAgICogb3B0aW1pemVkLiBUaGlzIHdpbGwgbGVhZCB0byBpbmNvcnJlY3QgY29kZSBiZWluZyBnZW5lcmF0ZWQgKG9yIHdvcnNlKS4KKyAgICAgICAqIERvIGl0IHdoZW4gbGVhdmluZyB0aGUgbm9kZSBzbyB0aGUgY2hpbGRyZW4gd291bGQgcHJvcGFnYXRlIHRoZWlyCisgICAgICAgKiBhcnJheSBhY2Nlc3NlcyBmaXJzdC4KKyAgICAgICAqLworCisgICAgICBjb25zdCBleGVjX25vZGUgKmZvcm1hbF9wYXJhbV9ub2RlID0gaXItPmNhbGxlZS0+cGFyYW1ldGVycy5nZXRfaGVhZCgpOworICAgICAgaWYgKGZvcm1hbF9wYXJhbV9ub2RlKSB7CisgICAgICAgICBjb25zdCBleGVjX25vZGUgKmFjdHVhbF9wYXJhbV9ub2RlID0gaXItPmFjdHVhbF9wYXJhbWV0ZXJzLmdldF9oZWFkKCk7CisgICAgICAgICB3aGlsZSAoIWFjdHVhbF9wYXJhbV9ub2RlLT5pc190YWlsX3NlbnRpbmVsKCkpIHsKKyAgICAgICAgICAgIGlyX3ZhcmlhYmxlICpmb3JtYWxfcGFyYW0gPSAoaXJfdmFyaWFibGUgKikgZm9ybWFsX3BhcmFtX25vZGU7CisgICAgICAgICAgICBpcl9ydmFsdWUgKmFjdHVhbF9wYXJhbSA9IChpcl9ydmFsdWUgKikgYWN0dWFsX3BhcmFtX25vZGU7CisKKyAgICAgICAgICAgIGZvcm1hbF9wYXJhbV9ub2RlID0gZm9ybWFsX3BhcmFtX25vZGUtPmdldF9uZXh0KCk7CisgICAgICAgICAgICBhY3R1YWxfcGFyYW1fbm9kZSA9IGFjdHVhbF9wYXJhbV9ub2RlLT5nZXRfbmV4dCgpOworCisgICAgICAgICAgICBpZiAoZm9ybWFsX3BhcmFtLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAgICAgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWYgPSBhY3R1YWxfcGFyYW0tPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICAgICAgICAgICAgICBpZiAoZGVyZWYgJiYgZGVyZWYtPnZhciAmJiBkZXJlZi0+dmFyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICBkZXJlZi0+dmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MgPQorICAgICAgICAgICAgICAgICAgICAgTUFYMihmb3JtYWxfcGFyYW0tPmRhdGEubWF4X2FycmF5X2FjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZi0+dmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKKyAgIHsKKyAgICAgIGlmIChoYXNoX3RhYmxlX2ZpbmQobG9jYWxzLCBpci0+dmFyKSA9PSBOVUxMKSB7CisJIC8qIFRoZSBub24tZnVuY3Rpb24gdmFyaWFibGUgbXVzdCBiZSBhIGdsb2JhbCwgc28gdHJ5IHRvIGZpbmQgdGhlCisJICAqIHZhcmlhYmxlIGluIHRoZSBzaGFkZXIncyBzeW1ib2wgdGFibGUuICBJZiB0aGUgdmFyaWFibGUgaXMgbm90CisJICAqIGZvdW5kLCB0aGVuIGl0J3MgYSBnbG9iYWwgdGhhdCAqTVVTVCogYmUgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYWwKKwkgICogc2hhZGVyLgorCSAgKi8KKwkgaXJfdmFyaWFibGUgKnZhciA9IGxpbmtlZC0+c3ltYm9scy0+Z2V0X3ZhcmlhYmxlKGlyLT52YXItPm5hbWUpOworCSBpZiAodmFyID09IE5VTEwpIHsKKwkgICAgLyogQ2xvbmUgdGhlIGlyX3ZhcmlhYmxlIHRoYXQgdGhlIGRlcmVmZXJlbmNlIGFscmVhZHkgaGFzIGFuZCBhZGQKKwkgICAgICogaXQgdG8gdGhlIGxpbmtlZCBzaGFkZXIuCisJICAgICAqLworCSAgICB2YXIgPSBpci0+dmFyLT5jbG9uZShsaW5rZWQsIE5VTEwpOworCSAgICBsaW5rZWQtPnN5bWJvbHMtPmFkZF92YXJpYWJsZSh2YXIpOworCSAgICBsaW5rZWQtPmlyLT5wdXNoX2hlYWQodmFyKTsKKwkgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh2YXItPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgICAgICAgICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBnbG9iYWwgYXJyYXkgZGVjbGFyZWQgaW4gbXVsdGlwbGUKKyAgICAgICAgICAgICAgICAqIHNoYWRlcnMgd2l0aG91dCBhIHNpemUuICBUaGUgYXJyYXkgaXMgaW1wbGljaXRseSBzaXplZCBieQorICAgICAgICAgICAgICAgICogdGhlIG1heGltYWwgYWNjZXNzIHRvIGl0IGluICphbnkqIHNoYWRlci4gIEJlY2F1c2Ugb2YgdGhpcywKKyAgICAgICAgICAgICAgICAqIHdlIG5lZWQgdG8gdHJhY2sgdGhlIG1heGltYWwgYWNjZXNzIHRvIHRoZSBhcnJheSBhcyBsaW5raW5nCisgICAgICAgICAgICAgICAgKiBwdWxscyBtb3JlIGZ1bmN0aW9ucyBpbiB0aGF0IGFjY2VzcyB0aGUgYXJyYXkuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIHZhci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzID0KKyAgICAgICAgICAgICAgICAgIE1BWDIodmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGlyLT52YXItPmRhdGEubWF4X2FycmF5X2FjY2Vzcyk7CisKKyAgICAgICAgICAgICAgIGlmICh2YXItPnR5cGUtPmxlbmd0aCA9PSAwICYmIGlyLT52YXItPnR5cGUtPmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgICAgICAgdmFyLT50eXBlID0gaXItPnZhci0+dHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YXItPmlzX2ludGVyZmFjZV9pbnN0YW5jZSgpKSB7CisgICAgICAgICAgICAgICAvKiBTaW1pbGFybHksIHdlIG5lZWQgaW1wbGljaXQgc2l6ZXMgb2YgYXJyYXlzIHdpdGhpbiBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAqIGJsb2NrcyB0byBiZSBzaXplZCBieSB0aGUgbWF4aW1hbCBhY2Nlc3MgaW4gKmFueSogc2hhZGVyLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKS0+bGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgICAgICAgIHZhci0+bWF4X2lmY19hcnJheV9hY2Nlc3NbaV0gPQorICAgICAgICAgICAgICAgICAgICAgTUFYMih2YXItPm1heF9pZmNfYXJyYXlfYWNjZXNzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+dmFyLT5tYXhfaWZjX2FycmF5X2FjY2Vzc1tpXSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJIH0KKworCSBpci0+dmFyID0gdmFyOworICAgICAgfQorCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIC8qKiBXYXMgZnVuY3Rpb24gbGlua2luZyBzdWNjZXNzZnVsPyAqLworICAgYm9vbCBzdWNjZXNzOworCitwcml2YXRlOgorICAgLyoqCisgICAgKiBTaGFkZXIgcHJvZ3JhbSBiZWluZyBsaW5rZWQKKyAgICAqCisgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgbG9nZ2luZyBlcnJvciBtZXNzYWdlcy4KKyAgICAqLworICAgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2c7CisKKyAgIC8qKiBMaXN0IG9mIHNoYWRlcnMgYXZhaWxhYmxlIGZvciBsaW5raW5nLiAqLworICAgZ2xfc2hhZGVyICoqc2hhZGVyX2xpc3Q7CisKKyAgIC8qKiBOdW1iZXIgb2Ygc2hhZGVycyBhdmFpbGFibGUgZm9yIGxpbmtpbmcuICovCisgICB1bnNpZ25lZCBudW1fc2hhZGVyczsKKworICAgLyoqCisgICAgKiBGaW5hbCBsaW5rZWQgc2hhZGVyCisgICAgKgorICAgICogVGhpcyBpcyB1c2VkIHR3byB3YXlzLiAgSXQgaXMgdXNlZCB0byBmaW5kIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlCisgICAgKiBsaW5rZWQgc2hhZGVyIHRoYXQgYXJlIGFjY2Vzc2VkIGJ5IHRoZSBmdW5jdGlvbi4gIEl0IGlzIGFsc28gdXNlZCB0byBhZGQKKyAgICAqIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSB0aGUgc2hhZGVyIHdoZXJlIHRoZSBmdW5jdGlvbiBvcmlnaW5hdGVkLgorICAgICovCisgICBnbF9zaGFkZXIgKmxpbmtlZDsKKworICAgLyoqCisgICAgKiBUYWJsZSBvZiB2YXJpYWJsZXMgbG9jYWwgdG8gdGhlIGZ1bmN0aW9uLgorICAgICovCisgICBoYXNoX3RhYmxlICpsb2NhbHM7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworLyoqCisgKiBTZWFyY2hlcyBhIGxpc3Qgb2Ygc2hhZGVycyBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworaXJfZnVuY3Rpb25fc2lnbmF0dXJlICoKK2ZpbmRfbWF0Y2hpbmdfc2lnbmF0dXJlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGV4ZWNfbGlzdCAqYWN0dWFsX3BhcmFtZXRlcnMsCisJCQlnbF9zaGFkZXIgKipzaGFkZXJfbGlzdCwgdW5zaWduZWQgbnVtX3NoYWRlcnMsCisJCQlib29sIHVzZV9idWlsdGluKQoreworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9zaGFkZXJzOyBpKyspIHsKKyAgICAgIGlyX2Z1bmN0aW9uICpjb25zdCBmID0gc2hhZGVyX2xpc3RbaV0tPnN5bWJvbHMtPmdldF9mdW5jdGlvbihuYW1lKTsKKworICAgICAgaWYgKGYgPT0gTlVMTCkKKwkgY29udGludWU7CisKKyAgICAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnID0KKyAgICAgICAgIGYtPm1hdGNoaW5nX3NpZ25hdHVyZShOVUxMLCBhY3R1YWxfcGFyYW1ldGVycyk7CisKKyAgICAgIGlmICgoc2lnID09IE5VTEwpIHx8CisgICAgICAgICAgKCFzaWctPmlzX2RlZmluZWQgJiYgIXNpZy0+aXNfaW50cmluc2ljKSkKKwkgY29udGludWU7CisKKyAgICAgIC8qIElmIHRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0byBiaW5kIHRvIGEgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIHRoZQorICAgICAgICogc2lnbmF0dXJlIHRoYXQgd2UgZm91bmQgaXNuJ3QgYSBidWlsdC1pbiwga2VlcCBsb29raW5nLiAgQWxzbyBrZWVwCisgICAgICAgKiBsb29raW5nIGlmIHdlIGV4cGVjdCBhIG5vbi1idWlsdC1pbiBidXQgZm91bmQgYSBidWlsdC1pbi4KKyAgICAgICAqLworICAgICAgaWYgKHVzZV9idWlsdGluICE9IHNpZy0+aXNfYnVpbHRpbigpKQorCSAgICBjb250aW51ZTsKKworICAgICAgcmV0dXJuIHNpZzsKKyAgIH0KKworICAgcmV0dXJuIE5VTEw7Cit9CisKKworYm9vbAorbGlua19mdW5jdGlvbl9jYWxscyhnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywgZ2xfc2hhZGVyICptYWluLAorCQkgICAgZ2xfc2hhZGVyICoqc2hhZGVyX2xpc3QsIHVuc2lnbmVkIG51bV9zaGFkZXJzKQoreworICAgY2FsbF9saW5rX3Zpc2l0b3Igdihwcm9nLCBtYWluLCBzaGFkZXJfbGlzdCwgbnVtX3NoYWRlcnMpOworCisgICB2LnJ1bihtYWluLT5pcik7CisgICByZXR1cm4gdi5zdWNjZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX2ludGVyZmFjZV9ibG9ja3MuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX2ludGVyZmFjZV9ibG9ja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTUyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpbmtfaW50ZXJmYWNlX2Jsb2Nrcy5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGxpbmtfaW50ZXJmYWNlX2Jsb2Nrcy5jcHAKKyAqIExpbmtlciBzdXBwb3J0IGZvciBHTFNMJ3MgaW50ZXJmYWNlIGJsb2Nrcy4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgImxpbmtlci5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBpbnRlcmZhY2UgYmxvY2sgZGVmaW5pdGlvbiB0aGF0IHdlIG5lZWQgdG8ga2VlcAorICogdHJhY2sgb2YgaW4gb3JkZXIgdG8gY2hlY2sgbGlua2FnZSBydWxlcy4KKyAqCisgKiBOb3RlOiB0aGlzIGNsYXNzIGlzIGV4cGVjdGVkIHRvIGJlIHNob3J0IGxpdmVkLCBzbyBpdCBkb2Vzbid0IG1ha2UgY29waWVzCisgKiBvZiB0aGUgc3RyaW5ncyBpdCByZWZlcmVuY2VzOyBpdCBzaW1wbHkgYm9ycm93cyB0aGUgcG9pbnRlcnMgZnJvbSB0aGUKKyAqIGlyX3ZhcmlhYmxlIGNsYXNzLgorICovCitzdHJ1Y3QgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb24KK3sKKyAgIC8qKgorICAgICogRXh0cmFjdCBhbiBpbnRlcmZhY2UgYmxvY2sgZGVmaW5pdGlvbiBmcm9tIGFuIGlyX3ZhcmlhYmxlIHRoYXQKKyAgICAqIHJlcHJlc2VudHMgZWl0aGVyIHRoZSBpbnRlcmZhY2UgaW5zdGFuY2UgKGZvciBuYW1lZCBpbnRlcmZhY2VzKSwgb3IgYQorICAgICogbWVtYmVyIG9mIHRoZSBpbnRlcmZhY2UgKGZvciB1bm5hbWVkIGludGVyZmFjZXMpLgorICAgICovCisgICBleHBsaWNpdCBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbihjb25zdCBpcl92YXJpYWJsZSAqdmFyKQorICAgICAgOiB0eXBlKHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCkpLAorICAgICAgICBpbnN0YW5jZV9uYW1lKE5VTEwpLAorICAgICAgICBhcnJheV9zaXplKC0xKQorICAgeworICAgICAgaWYgKHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkpIHsKKyAgICAgICAgIGluc3RhbmNlX25hbWUgPSB2YXItPm5hbWU7CisgICAgICAgICBpZiAodmFyLT50eXBlLT5pc19hcnJheSgpKQorICAgICAgICAgICAgYXJyYXlfc2l6ZSA9IHZhci0+dHlwZS0+bGVuZ3RoOworICAgICAgfQorICAgICAgZXhwbGljaXRseV9kZWNsYXJlZCA9ICh2YXItPmRhdGEuaG93X2RlY2xhcmVkICE9IGlyX3Zhcl9kZWNsYXJlZF9pbXBsaWNpdGx5KTsKKyAgIH0KKworICAgLyoqCisgICAgKiBJbnRlcmZhY2UgYmxvY2sgdHlwZQorICAgICovCisgICBjb25zdCBnbHNsX3R5cGUgKnR5cGU7CisKKyAgIC8qKgorICAgICogRm9yIGEgbmFtZWQgaW50ZXJmYWNlIGJsb2NrLCB0aGUgaW5zdGFuY2UgbmFtZS4gIE90aGVyd2lzZSBOVUxMLgorICAgICovCisgICBjb25zdCBjaGFyICppbnN0YW5jZV9uYW1lOworCisgICAvKioKKyAgICAqIEZvciBhbiBpbnRlcmZhY2UgYmxvY2sgYXJyYXksIHRoZSBhcnJheSBzaXplIChvciAwIGlmIHVuc2l6ZWQpLgorICAgICogT3RoZXJ3aXNlIC0xLgorICAgICovCisgICBpbnQgYXJyYXlfc2l6ZTsKKworICAgLyoqCisgICAgKiBUcnVlIGlmIHRoaXMgaW50ZXJmYWNlIGJsb2NrIHdhcyBleHBsaWNpdGx5IGRlY2xhcmVkIGluIHRoZSBzaGFkZXI7CisgICAgKiBmYWxzZSBpZiBpdCB3YXMgYW4gaW1wbGljaXRseSBkZWNsYXJlZCBidWlsdC1pbiBpbnRlcmZhY2UgYmxvY2suCisgICAgKi8KKyAgIGJvb2wgZXhwbGljaXRseV9kZWNsYXJlZDsKK307CisKKworLyoqCisgKiBDaGVjayBpZiB0d28gaW50ZXJmYWNlcyBtYXRjaCwgYWNjb3JkaW5nIHRvIGludHJhc3RhZ2UgaW50ZXJmYWNlIG1hdGNoaW5nCisgKiBydWxlcy4gIElmIHRoZXkgZG8sIGFuZCB0aGUgZmlyc3QgaW50ZXJmYWNlIHVzZXMgYW4gdW5zaXplZCBhcnJheSwgaXQgd2lsbAorICogYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBhcnJheSBzaXplIGRlY2xhcmVkIGluIHRoZSBzZWNvbmQgaW50ZXJmYWNlLgorICovCitib29sCitpbnRyYXN0YWdlX21hdGNoKGludGVyZmFjZV9ibG9ja19kZWZpbml0aW9uICphLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiAqYiwKKyAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGVfbW9kZSBtb2RlKQoreworICAgLyogVHlwZXMgbXVzdCBtYXRjaC4gKi8KKyAgIGlmIChhLT50eXBlICE9IGItPnR5cGUpIHsKKyAgICAgIC8qIEV4Y2VwdGlvbjogaWYgYm90aCB0aGUgaW50ZXJmYWNlIGJsb2NrcyBhcmUgaW1wbGljaXRseSBkZWNsYXJlZCwKKyAgICAgICAqIGRvbid0IGZvcmNlIHRoZWlyIHR5cGVzIHRvIG1hdGNoLiAgVGhleSBtaWdodCBtaXNtYXRjaCBkdWUgdG8gdGhlIHR3bworICAgICAgICogc2hhZGVycyB1c2luZyBkaWZmZXJlbnQgR0xTTCB2ZXJzaW9ucywgYW5kIHRoYXQncyBvay4KKyAgICAgICAqLworICAgICAgaWYgKGEtPmV4cGxpY2l0bHlfZGVjbGFyZWQgfHwgYi0+ZXhwbGljaXRseV9kZWNsYXJlZCkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgLyogUHJlc2VuY2UvYWJzZW5jZSBvZiBpbnRlcmZhY2UgbmFtZXMgbXVzdCBtYXRjaC4gKi8KKyAgIGlmICgoYS0+aW5zdGFuY2VfbmFtZSA9PSBOVUxMKSAhPSAoYi0+aW5zdGFuY2VfbmFtZSA9PSBOVUxMKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgLyogRm9yIHVuaWZvcm1zLCBpbnN0YW5jZSBuYW1lcyBuZWVkIG5vdCBtYXRjaC4gIEZvciBzaGFkZXIgaW5zL291dHMsCisgICAgKiBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBzcGVjIHdoZXRoZXIgdGhleSBuZWVkIHRvIG1hdGNoLCBidXQKKyAgICAqIE1lc2EncyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlbSBtYXRjaGluZy4KKyAgICAqLworICAgaWYgKGEtPmluc3RhbmNlX25hbWUgIT0gTlVMTCAmJiBtb2RlICE9IGlyX3Zhcl91bmlmb3JtICYmCisgICAgICAgc3RyY21wKGEtPmluc3RhbmNlX25hbWUsIGItPmluc3RhbmNlX25hbWUpICE9IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgLyogQXJyYXkgdnMuIG5vbmFycmF5IG11c3QgYmUgY29uc2lzdGVudCwgYW5kIHNpemVzIG11c3QgYmUKKyAgICAqIGNvbnNpc3RlbnQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHVuc2l6ZWQgYXJyYXlzIG1hdGNoIHNpemVkCisgICAgKiBhcnJheXMuCisgICAgKi8KKyAgIGlmICgoYS0+YXJyYXlfc2l6ZSA9PSAtMSkgIT0gKGItPmFycmF5X3NpemUgPT0gLTEpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgaWYgKGItPmFycmF5X3NpemUgIT0gMCkgeworICAgICAgaWYgKGEtPmFycmF5X3NpemUgPT0gMCkKKyAgICAgICAgIGEtPmFycmF5X3NpemUgPSBiLT5hcnJheV9zaXplOworICAgICAgZWxzZSBpZiAoYS0+YXJyYXlfc2l6ZSAhPSBiLT5hcnJheV9zaXplKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKioKKyAqIENoZWNrIGlmIHR3byBpbnRlcmZhY2VzIG1hdGNoLCBhY2NvcmRpbmcgdG8gaW50ZXJzdGFnZSAoaW4vb3V0KSBpbnRlcmZhY2UKKyAqIG1hdGNoaW5nIHJ1bGVzLgorICoKKyAqIElmIFxjIGV4dHJhX2FycmF5X2xldmVsIGlzIHRydWUsIHRoZW4gdmVydGV4LXRvLWdlb21ldHJ5IHNoYWRlciBtYXRjaGluZworICogcnVsZXMgYXJlIGVuZm9yY2VkIChpLmUuIGEgc3VjY2Vzc2Z1bCBtYXRjaCByZXF1aXJlcyB0aGUgY29uc3VtZXIgaW50ZXJmYWNlCisgKiB0byBiZSBhbiBhcnJheSBhbmQgdGhlIHByb2R1Y2VyIGludGVyZmFjZSB0byBiZSBhIG5vbi1hcnJheSkuCisgKi8KK2Jvb2wKK2ludGVyc3RhZ2VfbWF0Y2goY29uc3QgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb24gKnByb2R1Y2VyLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiAqY29uc3VtZXIsCisgICAgICAgICAgICAgICAgIGJvb2wgZXh0cmFfYXJyYXlfbGV2ZWwpCit7CisgICAvKiBVbnNpemVkIGFycmF5cyBzaG91bGQgbm90IG9jY3VyIGR1cmluZyBpbnRlcnN0YWdlIGxpbmtpbmcuICBUaGV5CisgICAgKiBzaG91bGQgaGF2ZSBhbGwgYmVlbiBhc3NpZ25lZCBhIHNpemUgYnkgbGlua19pbnRyYXN0YWdlX3NoYWRlcnMuCisgICAgKi8KKyAgIGFzc2VydChjb25zdW1lci0+YXJyYXlfc2l6ZSAhPSAwKTsKKyAgIGFzc2VydChwcm9kdWNlci0+YXJyYXlfc2l6ZSAhPSAwKTsKKworICAgLyogVHlwZXMgbXVzdCBtYXRjaC4gKi8KKyAgIGlmIChjb25zdW1lci0+dHlwZSAhPSBwcm9kdWNlci0+dHlwZSkgeworICAgICAgLyogRXhjZXB0aW9uOiBpZiBib3RoIHRoZSBpbnRlcmZhY2UgYmxvY2tzIGFyZSBpbXBsaWNpdGx5IGRlY2xhcmVkLAorICAgICAgICogZG9uJ3QgZm9yY2UgdGhlaXIgdHlwZXMgdG8gbWF0Y2guICBUaGV5IG1pZ2h0IG1pc21hdGNoIGR1ZSB0byB0aGUgdHdvCisgICAgICAgKiBzaGFkZXJzIHVzaW5nIGRpZmZlcmVudCBHTFNMIHZlcnNpb25zLCBhbmQgdGhhdCdzIG9rLgorICAgICAgICovCisgICAgICBpZiAoY29uc3VtZXItPmV4cGxpY2l0bHlfZGVjbGFyZWQgfHwgcHJvZHVjZXItPmV4cGxpY2l0bHlfZGVjbGFyZWQpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisgICBpZiAoZXh0cmFfYXJyYXlfbGV2ZWwpIHsKKyAgICAgIC8qIENvbnN1bWVyIG11c3QgYmUgYW4gYXJyYXksIGFuZCBwcm9kdWNlciBtdXN0IG5vdC4gKi8KKyAgICAgIGlmIChjb25zdW1lci0+YXJyYXlfc2l6ZSA9PSAtMSkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChwcm9kdWNlci0+YXJyYXlfc2l6ZSAhPSAtMSkKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBBcnJheSB2cy4gbm9uYXJyYXkgbXVzdCBiZSBjb25zaXN0ZW50LCBhbmQgc2l6ZXMgbXVzdCBiZSBjb25zaXN0ZW50LgorICAgICAgICogU2luY2UgdW5zaXplZCBhcnJheXMgaGF2ZSBiZWVuIHJ1bGVkIG91dCwgd2UgY2FuIGNoZWNrIHRoaXMgYnkganVzdAorICAgICAgICogbWFraW5nIHN1cmUgdGhlIHNpemVzIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgaWYgKGNvbnN1bWVyLT5hcnJheV9zaXplICE9IHByb2R1Y2VyLT5hcnJheV9zaXplKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorICAgcmV0dXJuIHRydWU7Cit9CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIGEgbWFwcGluZyBmcm9tIGFuIGludGVyZmFjZSBibG9jayBuYW1lIHRvIHRoZQorICogbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoYXQgaW50ZXJmYWNlIGJsb2NrIHRvIGRldGVybWluZSB3aGV0aGVyIHRvCisgKiBnZW5lcmF0ZSBhIGxpbmsgZXJyb3IuCisgKgorICogTm90ZTogdGhpcyBjbGFzcyBpcyBleHBlY3RlZCB0byBiZSBzaG9ydCBsaXZlZCwgc28gaXQgZG9lc24ndCBtYWtlIGNvcGllcworICogb2YgdGhlIHN0cmluZ3MgaXQgcmVmZXJlbmNlczsgaXQgc2ltcGx5IGJvcnJvd3MgdGhlIHBvaW50ZXJzIGZyb20gdGhlCisgKiBpcl92YXJpYWJsZSBjbGFzcy4KKyAqLworY2xhc3MgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb25zCit7CitwdWJsaWM6CisgICBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbnMoKQorICAgICAgOiBtZW1fY3R4KHJhbGxvY19jb250ZXh0KE5VTEwpKSwKKyAgICAgICAgaHQoaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfc3RyaW5nX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3RhYmxlX3N0cmluZ19jb21wYXJlKSkKKyAgIHsKKyAgIH0KKworICAgfmludGVyZmFjZV9ibG9ja19kZWZpbml0aW9ucygpCisgICB7CisgICAgICBoYXNoX3RhYmxlX2R0b3IoaHQpOworICAgICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7CisgICB9CisKKyAgIC8qKgorICAgICogTG9va3VwIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBoYXZpbmcgdGhlIGdpdmVuIGJsb2NrIG5hbWUuICBSZXR1cm4KKyAgICAqIE5VTEwgaWYgbm9uZSBpcyBmb3VuZC4KKyAgICAqLworICAgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb24gKmxvb2t1cChjb25zdCBjaGFyICpibG9ja19uYW1lKQorICAgeworICAgICAgcmV0dXJuIChpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiAqKSBoYXNoX3RhYmxlX2ZpbmQoaHQsIGJsb2NrX25hbWUpOworICAgfQorCisgICAvKioKKyAgICAqIEFkZCBhIG5ldyBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAgICAqLworICAgdm9pZCBzdG9yZShjb25zdCBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiAmZGVmKQorICAgeworICAgICAgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb24gKmhhc2hfZW50cnkgPQorICAgICAgICAgcnphbGxvYyhtZW1fY3R4LCBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbik7CisgICAgICAqaGFzaF9lbnRyeSA9IGRlZjsKKyAgICAgIGhhc2hfdGFibGVfaW5zZXJ0KGh0LCBoYXNoX2VudHJ5LCBkZWYudHlwZS0+bmFtZSk7CisgICB9CisKK3ByaXZhdGU6CisgICAvKioKKyAgICAqIFJhbGxvYyBjb250ZXh0IGZvciBkYXRhIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY2xhc3MuCisgICAgKi8KKyAgIHZvaWQgKm1lbV9jdHg7CisKKyAgIC8qKgorICAgICogSGFzaCB0YWJsZSBtYXBwaW5nIGludGVyZmFjZSBibG9jayBuYW1lIHRvIGFuIFxjCisgICAgKiBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiBzdHJ1Y3QuICBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiBzdHJ1Y3RzCisgICAgKiBhcmUgYWxsb2NhdGVkIHVzaW5nIFxjIG1lbV9jdHguCisgICAgKi8KKyAgIGhhc2hfdGFibGUgKmh0OworfTsKKworCit9OyAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKKwordm9pZAordmFsaWRhdGVfaW50cmFzdGFnZV9pbnRlcmZhY2VfYmxvY2tzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbF9zaGFkZXIgKipzaGFkZXJfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fc2hhZGVycykKK3sKKyAgIGludGVyZmFjZV9ibG9ja19kZWZpbml0aW9ucyBpbl9pbnRlcmZhY2VzOworICAgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb25zIG91dF9pbnRlcmZhY2VzOworICAgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb25zIHVuaWZvcm1faW50ZXJmYWNlczsKKworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1fc2hhZGVyczsgaSsrKSB7CisgICAgICBpZiAoc2hhZGVyX2xpc3RbaV0gPT0gTlVMTCkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgc2hhZGVyX2xpc3RbaV0tPmlyKSB7CisgICAgICAgICBpcl92YXJpYWJsZSAqdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKyAgICAgICAgIGlmICghdmFyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqaWZhY2VfdHlwZSA9IHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCk7CisKKyAgICAgICAgIGlmIChpZmFjZV90eXBlID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb25zICpkZWZpbml0aW9uczsKKyAgICAgICAgIHN3aXRjaCAodmFyLT5kYXRhLm1vZGUpIHsKKyAgICAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9pbjoKKyAgICAgICAgICAgIGRlZmluaXRpb25zID0gJmluX2ludGVyZmFjZXM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9vdXQ6CisgICAgICAgICAgICBkZWZpbml0aW9ucyA9ICZvdXRfaW50ZXJmYWNlczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBpcl92YXJfdW5pZm9ybToKKyAgICAgICAgICAgIGRlZmluaXRpb25zID0gJnVuaWZvcm1faW50ZXJmYWNlczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIE9ubHkgaW4sIG91dCwgYW5kIHVuaWZvcm0gaW50ZXJmYWNlcyBhcmUgbGVnYWwsIHNvIHdlIHNob3VsZAorICAgICAgICAgICAgICogbmV2ZXIgZ2V0IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydCghImlsbGVnYWwgaW50ZXJmYWNlIHR5cGUiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorCisgICAgICAgICBjb25zdCBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiBkZWYodmFyKTsKKyAgICAgICAgIGludGVyZmFjZV9ibG9ja19kZWZpbml0aW9uICpwcmV2X2RlZiA9CisgICAgICAgICAgICBkZWZpbml0aW9ucy0+bG9va3VwKGlmYWNlX3R5cGUtPm5hbWUpOworCisgICAgICAgICBpZiAocHJldl9kZWYgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZSBpbnRlcmZhY2UsIHNvIHNhdmUKKyAgICAgICAgICAgICAqIGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEgc3RydWN0dXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZWZpbml0aW9ucy0+c3RvcmUoZGVmKTsKKyAgICAgICAgIH0gZWxzZSBpZiAoIWludHJhc3RhZ2VfbWF0Y2gocHJldl9kZWYsICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcl92YXJpYWJsZV9tb2RlKSB2YXItPmRhdGEubW9kZSkpIHsKKyAgICAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiZGVmaW5pdGlvbnMgb2YgaW50ZXJmYWNlIGJsb2NrIGAlcycgZG8gbm90IgorICAgICAgICAgICAgICAgICAgICAgICAgICIgbWF0Y2hcbiIsIGlmYWNlX3R5cGUtPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCit2b2lkCit2YWxpZGF0ZV9pbnRlcnN0YWdlX2lub3V0X2Jsb2NrcyhzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbF9zaGFkZXIgKnByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfc2hhZGVyICpjb25zdW1lcikKK3sKKyAgIGludGVyZmFjZV9ibG9ja19kZWZpbml0aW9ucyBkZWZpbml0aW9uczsKKyAgIGNvbnN0IGJvb2wgZXh0cmFfYXJyYXlfbGV2ZWwgPSBjb25zdW1lci0+U3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlk7CisKKyAgIC8qIEFkZCBpbnB1dCBpbnRlcmZhY2VzIGZyb20gdGhlIGNvbnN1bWVyIHRvIHRoZSBzeW1ib2wgdGFibGUuICovCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgY29uc3VtZXItPmlyKSB7CisgICAgICBpcl92YXJpYWJsZSAqdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKyAgICAgIGlmICghdmFyIHx8ICF2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpIHx8IHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9zaGFkZXJfaW4pCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgZGVmaW5pdGlvbnMuc3RvcmUoaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb24odmFyKSk7CisgICB9CisKKyAgIC8qIFZlcmlmeSB0aGF0IHRoZSBwcm9kdWNlcidzIG91dHB1dCBpbnRlcmZhY2VzIG1hdGNoLiAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsIHByb2R1Y2VyLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKnZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisgICAgICBpZiAoIXZhciB8fCAhdmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKSB8fCB2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfc2hhZGVyX291dCkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpbnRlcmZhY2VfYmxvY2tfZGVmaW5pdGlvbiAqY29uc3VtZXJfZGVmID0KKyAgICAgICAgIGRlZmluaXRpb25zLmxvb2t1cCh2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lKTsKKworICAgICAgLyogVGhlIGNvbnN1bWVyIGRvZXNuJ3QgdXNlIHRoaXMgb3V0cHV0IGJsb2NrLiAgSWdub3JlIGl0LiAqLworICAgICAgaWYgKGNvbnN1bWVyX2RlZiA9PSBOVUxMKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGNvbnN0IGludGVyZmFjZV9ibG9ja19kZWZpbml0aW9uIHByb2R1Y2VyX2RlZih2YXIpOworCisgICAgICBpZiAoIWludGVyc3RhZ2VfbWF0Y2goJnByb2R1Y2VyX2RlZiwgY29uc3VtZXJfZGVmLCBleHRyYV9hcnJheV9sZXZlbCkpIHsKKyAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiZGVmaW5pdGlvbnMgb2YgaW50ZXJmYWNlIGJsb2NrIGAlcycgZG8gbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hcbiIsIHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorfQorCisKK3ZvaWQKK3ZhbGlkYXRlX2ludGVyc3RhZ2VfdW5pZm9ybV9ibG9ja3Moc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXIgKipzdGFnZXMsIGludCBudW1fc3RhZ2VzKQoreworICAgaW50ZXJmYWNlX2Jsb2NrX2RlZmluaXRpb25zIGRlZmluaXRpb25zOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9zdGFnZXM7IGkrKykgeworICAgICAgaWYgKHN0YWdlc1tpXSA9PSBOVUxMKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGNvbnN0IGdsX3NoYWRlciAqc3RhZ2UgPSBzdGFnZXNbaV07CisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgc3RhZ2UtPmlyKSB7CisgICAgICAgICBpcl92YXJpYWJsZSAqdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKyAgICAgICAgIGlmICghdmFyIHx8ICF2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpIHx8IHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl91bmlmb3JtKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGludGVyZmFjZV9ibG9ja19kZWZpbml0aW9uICpvbGRfZGVmID0KKyAgICAgICAgICAgIGRlZmluaXRpb25zLmxvb2t1cCh2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lKTsKKyAgICAgICAgIGNvbnN0IGludGVyZmFjZV9ibG9ja19kZWZpbml0aW9uIG5ld19kZWYodmFyKTsKKyAgICAgICAgIGlmIChvbGRfZGVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlZmluaXRpb25zLnN0b3JlKG5ld19kZWYpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEludGVyc3RhZ2UgdW5pZm9ybSBtYXRjaGluZyBydWxlcyBhcmUgdGhlIHNhbWUgYXMgaW50cmFzdGFnZQorICAgICAgICAgICAgICogdW5pZm9ybSBtYXRjaGluIHJ1bGVzIChmb3IgdW5pZm9ybXMsIGl0IGlzIGFzIHRob3VnaCBhbGwKKyAgICAgICAgICAgICAqIHNoYWRlcnMgYXJlIGluIHRoZSBzYW1lIHNoYWRlciBzdGFnZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghaW50cmFzdGFnZV9tYXRjaChvbGRfZGVmLCAmbmV3X2RlZiwgaXJfdmFyX3VuaWZvcm0pKSB7CisgICAgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImRlZmluaXRpb25zIG9mIGludGVyZmFjZSBibG9jayBgJXMnIGRvIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoXG4iLCB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZV92aXNpdG9yLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZV92aXNpdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjZlZjMyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlX3Zpc2l0b3IuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmVfdmlzaXRvci5oIgorI2luY2x1ZGUgInByb2dyYW0uaCIKKworbGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZSAqCitwcm9jZXNzX2Jsb2NrKHZvaWQgKm1lbV9jdHgsIHN0cnVjdCBoYXNoX3RhYmxlICpodCwgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGNvbnN0IHVpbnQzMl90IGggPSBfbWVzYV9oYXNoX3N0cmluZyh2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lKTsKKyAgIGNvbnN0IGhhc2hfZW50cnkgKmNvbnN0IGV4aXN0aW5nX2Jsb2NrID0KKyAgICAgIF9tZXNhX2hhc2hfdGFibGVfc2VhcmNoKGh0LCBoLCB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lKTsKKworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCBibG9ja190eXBlID0gdmFyLT5pc19pbnRlcmZhY2VfaW5zdGFuY2UoKQorICAgICAgPyB2YXItPnR5cGUgOiB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpOworCisKKyAgIC8qIElmIGEgYmxvY2sgd2l0aCB0aGlzIGJsb2NrLW5hbWUgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gc2VlbiwgYWRkIGl0LgorICAgICogSWYgYSBibG9jayB3aXRoIHRoaXMgYmxvY2stbmFtZSBoYXMgYmVlbiBzZWVuLCBpdCBtdXN0IGJlIGlkZW50aWNhbCB0bworICAgICogdGhlIGJsb2NrIGN1cnJlbnRseSBiZWluZyBleGFtaW5lZC4KKyAgICAqLworICAgaWYgKGV4aXN0aW5nX2Jsb2NrID09IE5VTEwpIHsKKyAgICAgIGxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmUgKmNvbnN0IGIgPQorCSByemFsbG9jKG1lbV9jdHgsIHN0cnVjdCBsaW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlKTsKKworICAgICAgYi0+dHlwZSA9IGJsb2NrX3R5cGU7CisgICAgICBiLT5oYXNfaW5zdGFuY2VfbmFtZSA9IHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCk7CisKKyAgICAgIGlmICh2YXItPmRhdGEuZXhwbGljaXRfYmluZGluZykgeworICAgICAgICAgYi0+aGFzX2JpbmRpbmcgPSB0cnVlOworICAgICAgICAgYi0+YmluZGluZyA9IHZhci0+ZGF0YS5iaW5kaW5nOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGItPmhhc19iaW5kaW5nID0gZmFsc2U7CisgICAgICAgICBiLT5iaW5kaW5nID0gMDsKKyAgICAgIH0KKworICAgICAgX21lc2FfaGFzaF90YWJsZV9pbnNlcnQoaHQsIGgsIHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUsCisJCQkgICAgICAodm9pZCAqKSBiKTsKKyAgICAgIHJldHVybiBiOworICAgfSBlbHNlIHsKKyAgICAgIGxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmUgKmNvbnN0IGIgPQorCSAobGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZSAqKSBleGlzdGluZ19ibG9jay0+ZGF0YTsKKworICAgICAgaWYgKGItPnR5cGUgIT0gYmxvY2tfdHlwZQorCSAgfHwgYi0+aGFzX2luc3RhbmNlX25hbWUgIT0gdmFyLT5pc19pbnRlcmZhY2VfaW5zdGFuY2UoKSkKKwkgcmV0dXJuIE5VTEw7CisgICAgICBlbHNlCisJIHJldHVybiBiOworICAgfQorCisgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworICAgcmV0dXJuIE5VTEw7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsaW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKK3sKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpjb25zdCBkID0gaXItPmFycmF5LT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IChkID09IE5VTEwpID8gTlVMTCA6IGQtPnZhcjsKKworICAgLyogSWYgdGhlIHItdmFsdWUgYmVpbmcgZGVyZWZlcmVuY2VkIGlzIG5vdCBhIHZhcmlhYmxlIChlLmcuLCBhIGZpZWxkIG9mIGEKKyAgICAqIHN0cnVjdHVyZSkgb3IgaXMgbm90IGEgdW5pZm9ybSBibG9jayBpbnN0YW5jZSwgY29udGludWUuCisgICAgKgorICAgICogV0FSTklORzogSXQgaXMgbm90IGVub3VnaCBmb3IgdGhlIHZhcmlhYmxlIHRvIGJlIHBhcnQgb2YgdW5pZm9ybSBibG9jay4KKyAgICAqIEl0IG11c3QgcmVwcmVzZW50IHRoZSBlbnRpcmUgYmxvY2suICBBcnJheXMgKG9yIG1hdHJpY2VzKSBpbnNpZGUgYmxvY2tzCisgICAgKiB0aGF0IGxhY2sgYW4gaW5zdGFuY2UgbmFtZSBhcmUgaGFuZGxlZCBieSB0aGUgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUKKyAgICAqIGZ1bmN0aW9uLgorICAgICovCisgICBpZiAodmFyID09IE5VTEwKKyAgICAgICB8fCAhdmFyLT5pc19pbl91bmlmb3JtX2Jsb2NrKCkKKyAgICAgICB8fCAhdmFyLT5pc19pbnRlcmZhY2VfaW5zdGFuY2UoKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgLyogUHJvY2VzcyB0aGUgYmxvY2suICBCYWlsIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KKyAgICAqLworICAgbGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZSAqY29uc3QgYiA9CisgICAgICBwcm9jZXNzX2Jsb2NrKHRoaXMtPm1lbV9jdHgsIHRoaXMtPmh0LCB2YXIpOworICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgbGlua2VyX2Vycm9yKHByb2csCisJCSAgICJ1bmlmb3JtIGJsb2NrIGAlcycgaGFzIG1pc21hdGNoaW5nIGRlZmluaXRpb25zIiwKKwkJICAgdmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKS0+bmFtZSk7CisgICAgICB0aGlzLT5zdWNjZXNzID0gZmFsc2U7CisgICAgICByZXR1cm4gdmlzaXRfc3RvcDsKKyAgIH0KKworICAgLyogQmxvY2sgYXJyYXlzIG11c3QgYmUgZGVjbGFyZWQgd2l0aCBhbiBpbnN0YW5jZSBuYW1lLgorICAgICovCisgICBhc3NlcnQoYi0+aGFzX2luc3RhbmNlX25hbWUpOworICAgYXNzZXJ0KChiLT5udW1fYXJyYXlfZWxlbWVudHMgPT0gMCkgPT0gKGItPmFycmF5X2VsZW1lbnRzID09IE5VTEwpKTsKKyAgIGFzc2VydChiLT50eXBlICE9IE5VTEwpOworCisgICAvKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhpcyBhcnJheSBpbmRleCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZQorICAgICogbGlzdCBvZiBhY3RpdmUgYXJyYXkgaW5kaWNlcy4gIEF0IHRoaXMgcG9pbnQgYWxsIGNvbnN0YW50IGZvbGRpbmcgbXVzdAorICAgICogaGF2ZSBvY2N1cnJlZCwgYW5kIHRoZSBhcnJheSBpbmRleCBtdXN0IGJlIGEgY29uc3RhbnQuCisgICAgKi8KKyAgIGlyX2NvbnN0YW50ICpjID0gaXItPmFycmF5X2luZGV4LT5hc19jb25zdGFudCgpOworICAgYXNzZXJ0KGMgIT0gTlVMTCk7CisKKyAgIGNvbnN0IHVuc2lnbmVkIGlkeCA9IGMtPmdldF91aW50X2NvbXBvbmVudCgwKTsKKworICAgdW5zaWduZWQgaTsKKyAgIGZvciAoaSA9IDA7IGkgPCBiLT5udW1fYXJyYXlfZWxlbWVudHM7IGkrKykgeworICAgICAgaWYgKGItPmFycmF5X2VsZW1lbnRzW2ldID09IGlkeCkKKwkgYnJlYWs7CisgICB9CisKKyAgIGFzc2VydChpIDw9IGItPm51bV9hcnJheV9lbGVtZW50cyk7CisKKyAgIGlmIChpID09IGItPm51bV9hcnJheV9lbGVtZW50cykgeworICAgICAgYi0+YXJyYXlfZWxlbWVudHMgPSByZXJhbGxvYyh0aGlzLT5tZW1fY3R4LAorCQkJCSAgIGItPmFycmF5X2VsZW1lbnRzLAorCQkJCSAgIHVuc2lnbmVkLAorCQkJCSAgIGItPm51bV9hcnJheV9lbGVtZW50cyArIDEpOworCisgICAgICBiLT5hcnJheV9lbGVtZW50c1tiLT5udW1fYXJyYXlfZWxlbWVudHNdID0gaWR4OworCisgICAgICBiLT5udW1fYXJyYXlfZWxlbWVudHMrKzsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworbGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZV92aXNpdG9yOjp2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqaXIpCit7CisgICBpcl92YXJpYWJsZSAqdmFyID0gaXItPnZhcjsKKworICAgaWYgKCF2YXItPmlzX2luX3VuaWZvcm1fYmxvY2soKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgYXNzZXJ0KCF2YXItPmlzX2ludGVyZmFjZV9pbnN0YW5jZSgpIHx8ICF2YXItPnR5cGUtPmlzX2FycmF5KCkpOworCisgICAvKiBQcm9jZXNzIHRoZSBibG9jay4gIEJhaWwgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorICAgICovCisgICBsaW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlICpjb25zdCBiID0KKyAgICAgIHByb2Nlc3NfYmxvY2sodGhpcy0+bWVtX2N0eCwgdGhpcy0+aHQsIHZhcik7CisgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICBsaW5rZXJfZXJyb3IodGhpcy0+cHJvZywKKwkJICAgInVuaWZvcm0gYmxvY2sgYCVzJyBoYXMgbWlzbWF0Y2hpbmcgZGVmaW5pdGlvbnMiLAorCQkgICB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lKTsKKyAgICAgIHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgIHJldHVybiB2aXNpdF9zdG9wOworICAgfQorCisgICBhc3NlcnQoYi0+bnVtX2FycmF5X2VsZW1lbnRzID09IDApOworICAgYXNzZXJ0KGItPmFycmF5X2VsZW1lbnRzID09IE5VTEwpOworICAgYXNzZXJ0KGItPnR5cGUgIT0gTlVMTCk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZV92aXNpdG9yLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmVfdmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NmRiY2EKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmVfdmlzaXRvci5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgTElOS19VTklGT1JNX0JMT0NLX0FDVElWRV9WSVNJVE9SX0gKKyNkZWZpbmUgTElOS19VTklGT1JNX0JMT0NLX0FDVElWRV9WSVNJVE9SX0gKKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJtYWluL2hhc2hfdGFibGUuaCIKKworc3RydWN0IGxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmUgeworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlOworCisgICB1bnNpZ25lZCAqYXJyYXlfZWxlbWVudHM7CisgICB1bnNpZ25lZCBudW1fYXJyYXlfZWxlbWVudHM7CisKKyAgIHVuc2lnbmVkIGJpbmRpbmc7CisKKyAgIGJvb2wgaGFzX2luc3RhbmNlX25hbWU7CisgICBib29sIGhhc19iaW5kaW5nOworfTsKKworY2xhc3MgbGlua191bmlmb3JtX2Jsb2NrX2FjdGl2ZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmVfdmlzaXRvcih2b2lkICptZW1fY3R4LCBzdHJ1Y3QgaGFzaF90YWJsZSAqaHQsCisJCQkJICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCisgICAgICA6IHN1Y2Nlc3ModHJ1ZSksIHByb2cocHJvZyksIGh0KGh0KSwgbWVtX2N0eChtZW1fY3R4KQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9hcnJheSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisKKyAgIGJvb2wgc3VjY2VzczsKKworcHJpdmF0ZToKKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZzsKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCisjZW5kaWYgLyogTElOS19VTklGT1JNX0JMT0NLX0FDVElWRV9WSVNJVE9SX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua191bmlmb3JtX2Jsb2Nrcy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpbmtfdW5pZm9ybV9ibG9ja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjlmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpbmtfdW5pZm9ybV9ibG9ja3MuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImxpYmZucy5oIiAvLyBMdW5hckcgQUREOgorI2luY2x1ZGUgImljZC11dGlscy5oIiAvLyBMdW5hckcgQUREOgorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAibGlua2VyLmgiCisjaW5jbHVkZSAiaXJfdW5pZm9ybS5oIgorI2luY2x1ZGUgImxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmVfdmlzaXRvci5oIgorI2luY2x1ZGUgIm1haW4vaGFzaF90YWJsZS5oIgorI2luY2x1ZGUgInByb2dyYW0uaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgdWJvX3Zpc2l0b3IgOiBwdWJsaWMgcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIHVib192aXNpdG9yKHZvaWQgKm1lbV9jdHgsIGdsX3VuaWZvcm1fYnVmZmVyX3ZhcmlhYmxlICp2YXJpYWJsZXMsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fdmFyaWFibGVzKQorICAgICAgOiBpbmRleCgwKSwgb2Zmc2V0KDApLCBidWZmZXJfc2l6ZSgwKSwgdmFyaWFibGVzKHZhcmlhYmxlcyksCisgICAgICAgIG51bV92YXJpYWJsZXMobnVtX3ZhcmlhYmxlcyksIG1lbV9jdHgobWVtX2N0eCksIGlzX2FycmF5X2luc3RhbmNlKGZhbHNlKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdm9pZCBwcm9jZXNzKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKKyAgIHsKKyAgICAgIHRoaXMtPm9mZnNldCA9IDA7CisgICAgICB0aGlzLT5idWZmZXJfc2l6ZSA9IDA7CisgICAgICB0aGlzLT5pc19hcnJheV9pbnN0YW5jZSA9IHN0cmNocihuYW1lLCAnXScpICE9IE5VTEw7CisgICAgICB0aGlzLT5wcm9ncmFtX3Jlc291cmNlX3Zpc2l0b3I6OnByb2Nlc3ModHlwZSwgbmFtZSk7CisgICB9CisKKyAgIHVuc2lnbmVkIGluZGV4OworICAgdW5zaWduZWQgb2Zmc2V0OworICAgdW5zaWduZWQgYnVmZmVyX3NpemU7CisgICBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZSAqdmFyaWFibGVzOworICAgdW5zaWduZWQgbnVtX3ZhcmlhYmxlczsKKyAgIHZvaWQgKm1lbV9jdHg7CisgICBib29sIGlzX2FycmF5X2luc3RhbmNlOworCitwcml2YXRlOgorICAgdmlydHVhbCB2b2lkIHZpc2l0X2ZpZWxkKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJvd19tYWpvcikKKyAgIHsKKyAgICAgICh2b2lkKSB0eXBlOworICAgICAgKHZvaWQpIG5hbWU7CisgICAgICAodm9pZCkgcm93X21ham9yOworICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIHZpc2l0X2ZpZWxkKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJvd19tYWpvciwgY29uc3QgZ2xzbF90eXBlICpyZWNvcmRfdHlwZSkKKyAgIHsKKyAgICAgIGFzc2VydCh0aGlzLT5pbmRleCA8IHRoaXMtPm51bV92YXJpYWJsZXMpOworCisgICAgICBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZSAqdiA9ICZ0aGlzLT52YXJpYWJsZXNbdGhpcy0+aW5kZXgrK107CisKKyAgICAgIHYtPk5hbWUgPSByYWxsb2Nfc3RyZHVwKG1lbV9jdHgsIG5hbWUpOworICAgICAgdi0+VHlwZSA9IHR5cGU7CisgICAgICB2LT5Sb3dNYWpvciA9IHJvd19tYWpvcjsKKworICAgICAgaWYgKHRoaXMtPmlzX2FycmF5X2luc3RhbmNlKSB7CisgICAgICAgICB2LT5JbmRleE5hbWUgPSByYWxsb2Nfc3RyZHVwKG1lbV9jdHgsIG5hbWUpOworCisgICAgICAgICBjaGFyICpvcGVuX2JyYWNrZXQgPSBzdHJjaHIodi0+SW5kZXhOYW1lLCAnWycpOworICAgICAgICAgYXNzZXJ0KG9wZW5fYnJhY2tldCAhPSBOVUxMKTsKKworICAgICAgICAgY2hhciAqY2xvc2VfYnJhY2tldCA9IHN0cmNocihvcGVuX2JyYWNrZXQsICddJyk7CisgICAgICAgICBhc3NlcnQoY2xvc2VfYnJhY2tldCAhPSBOVUxMKTsKKworICAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSB0YWlsIHdpdGhvdXQgdGhlICddJyBidXQgd2l0aCB0aGUgTlVMLgorICAgICAgICAgICovCisgICAgICAgICB1bnNpZ25lZCBsZW4gPSBzdHJsZW4oY2xvc2VfYnJhY2tldCArIDEpICsgMTsKKworICAgICAgICAgbWVtbW92ZShvcGVuX2JyYWNrZXQsIGNsb3NlX2JyYWNrZXQgKyAxLCBsZW4pOworICAgICB9IGVsc2UgeworICAgICAgICAgdi0+SW5kZXhOYW1lID0gdi0+TmFtZTsKKyAgICAgIH0KKworICAgICAgY29uc3QgdW5zaWduZWQgYWxpZ25tZW50ID0gcmVjb3JkX3R5cGUKKwkgPyByZWNvcmRfdHlwZS0+c3RkMTQwX2Jhc2VfYWxpZ25tZW50KHYtPlJvd01ham9yKQorCSA6IHR5cGUtPnN0ZDE0MF9iYXNlX2FsaWdubWVudCh2LT5Sb3dNYWpvcik7CisgICAgICB1bnNpZ25lZCBzaXplID0gdHlwZS0+c3RkMTQwX3NpemUodi0+Um93TWFqb3IpOworCisgICAgICB0aGlzLT5vZmZzZXQgPSBnbHNsX2FsaWduKHRoaXMtPm9mZnNldCwgYWxpZ25tZW50KTsKKyAgICAgIHYtPk9mZnNldCA9IHRoaXMtPm9mZnNldDsKKyAgICAgIHRoaXMtPm9mZnNldCArPSBzaXplOworCisgICAgICAvKiBGcm9tIHRoZSBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0IHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgICJGb3IgdW5pZm9ybSBibG9ja3MgbGFpZCBvdXQgYWNjb3JkaW5nIHRvIFtzdGQxNDBdIHJ1bGVzLCB0aGUKKyAgICAgICAqICAgICAgbWluaW11bSBidWZmZXIgb2JqZWN0IHNpemUgcmV0dXJuZWQgYnkgdGhlCisgICAgICAgKiAgICAgIFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFIHF1ZXJ5IGlzIGRlcml2ZWQgYnkgdGFraW5nIHRoZSBvZmZzZXQgb2YKKyAgICAgICAqICAgICAgdGhlIGxhc3QgYmFzaWMgbWFjaGluZSB1bml0IGNvbnN1bWVkIGJ5IHRoZSBsYXN0IHVuaWZvcm0gb2YgdGhlCisgICAgICAgKiAgICAgIHVuaWZvcm0gYmxvY2sgKGluY2x1ZGluZyBhbnkgZW5kLW9mLWFycmF5IG9yIGVuZC1vZi1zdHJ1Y3R1cmUKKyAgICAgICAqICAgICAgcGFkZGluZyksIGFkZGluZyBvbmUsIGFuZCByb3VuZGluZyB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZgorICAgICAgICogICAgICB0aGUgYmFzZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGEgdmVjNC4iCisgICAgICAgKi8KKyAgICAgIHRoaXMtPmJ1ZmZlcl9zaXplID0gZ2xzbF9hbGlnbih0aGlzLT5vZmZzZXQsIDE2KTsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIHZpc2l0X2ZpZWxkKGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZCkKKyAgIHsKKyAgICAgIC8qIEZJTklTSE1FOiBXaGVuIHN1cHBvcnQgZm9yIGRvdWJsZXMgKGR2ZWM0LCBldGMuKSBpcyBhZGRlZCB0byB0aGUKKyAgICAgICAqIEZJTklTSE1FOiBjb21waWxlciwgdGhpcyBtYXkgYmUgaW5jb3JyZWN0IGZvciBhIHN0cnVjdHVyZSBpbiBhIFVCTworICAgICAgICogRklOSVNITUU6IGxpa2Ugc3RydWN0IHMgeyBzdHJ1Y3QgeyBmbG9hdCBmIH0gczE7IGR2ZWM0IHY7IH07LgorICAgICAgICovCisgICAgICB0aGlzLT5vZmZzZXQgPSBnbHNsX2FsaWduKHRoaXMtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPnR5cGUtPnN0ZDE0MF9iYXNlX2FsaWdubWVudChmYWxzZSkpOworICAgfQorfTsKKworY2xhc3MgY291bnRfYmxvY2tfc2l6ZSA6IHB1YmxpYyBwcm9ncmFtX3Jlc291cmNlX3Zpc2l0b3IgeworcHVibGljOgorICAgY291bnRfYmxvY2tfc2l6ZSgpIDogbnVtX2FjdGl2ZV91bmlmb3JtcygwKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdW5zaWduZWQgbnVtX2FjdGl2ZV91bmlmb3JtczsKKworcHJpdmF0ZToKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdF9maWVsZChjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByb3dfbWFqb3IpCisgICB7CisgICAgICAodm9pZCkgdHlwZTsKKyAgICAgICh2b2lkKSBuYW1lOworICAgICAgKHZvaWQpIHJvd19tYWpvcjsKKyAgICAgIHRoaXMtPm51bV9hY3RpdmVfdW5pZm9ybXMrKzsKKyAgIH0KK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitzdHJ1Y3QgYmxvY2sgeworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlOworICAgYm9vbCBoYXNfaW5zdGFuY2VfbmFtZTsKK307CisKK3Vuc2lnbmVkCitsaW5rX3VuaWZvcm1fYmxvY2tzKHZvaWQgKm1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqKnNoYWRlcl9saXN0LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fc2hhZGVycywKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3VuaWZvcm1fYmxvY2sgKipibG9ja3NfcmV0KQoreworICAgLyogVGhpcyBoYXNoIHRhYmxlIHdpbGwgdHJhY2sgYWxsIG9mIHRoZSB1bmlmb3JtIGJsb2NrcyB0aGF0IGhhdmUgYmVlbgorICAgICogZW5jb3VudGVyZWQuICBTaW5jZSBibG9ja3Mgd2l0aCB0aGUgc2FtZSBibG9jay1uYW1lIG11c3QgYmUgdGhlIHNhbWUsCisgICAgKiB0aGUgaGFzaCBpcyBvcmdhbml6ZWQgYnkgYmxvY2stbmFtZS4KKyAgICAqLworICAgc3RydWN0IGhhc2hfdGFibGUgKmJsb2NrX2hhc2ggPQorICAgICAgX21lc2FfaGFzaF90YWJsZV9jcmVhdGUobWVtX2N0eCwgX21lc2Ffa2V5X3N0cmluZ19lcXVhbCk7CisKKyAgIC8qIERldGVybWluZSB3aGljaCB1bmlmb3JtIGJsb2NrcyBhcmUgYWN0aXZlLgorICAgICovCisgICBsaW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlX3Zpc2l0b3IgdihtZW1fY3R4LCBibG9ja19oYXNoLCBwcm9nKTsKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fc2hhZGVyczsgaSsrKSB7CisgICAgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBzaGFkZXJfbGlzdFtpXS0+aXIpOworICAgfQorCisgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB1bmlmb3JtIGJsb2Nrcy4gIENvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YKKyAgICAqIGFjdGl2ZSBzbG90cyBpbiB0aG9zZSB1bmlmb3JtIGJsb2Nrcy4KKyAgICAqLworICAgdW5zaWduZWQgbnVtX2Jsb2NrcyA9IDA7CisgICB1bnNpZ25lZCBudW1fdmFyaWFibGVzID0gMDsKKyAgIGNvdW50X2Jsb2NrX3NpemUgYmxvY2tfc2l6ZTsKKyAgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKworICAgaGFzaF90YWJsZV9mb3JlYWNoIChibG9ja19oYXNoLCBlbnRyeSkgeworICAgICAgY29uc3Qgc3RydWN0IGxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmUgKmNvbnN0IGIgPQorICAgICAgICAgKGNvbnN0IHN0cnVjdCBsaW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlICopIGVudHJ5LT5kYXRhOworCisgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGJsb2NrX3R5cGUgPQorICAgICAgICAgYi0+dHlwZS0+aXNfYXJyYXkoKSA/IGItPnR5cGUtPmZpZWxkcy5hcnJheSA6IGItPnR5cGU7CisKKyAgICAgIGFzc2VydCgoYi0+bnVtX2FycmF5X2VsZW1lbnRzID4gMCkgPT0gYi0+dHlwZS0+aXNfYXJyYXkoKSk7CisKKyAgICAgIGJsb2NrX3NpemUubnVtX2FjdGl2ZV91bmlmb3JtcyA9IDA7CisgICAgICBibG9ja19zaXplLnByb2Nlc3MoYmxvY2tfdHlwZSwgIiIpOworCisgICAgICBpZiAoYi0+bnVtX2FycmF5X2VsZW1lbnRzID4gMCkgeworICAgICAgICAgbnVtX2Jsb2NrcyArPSBiLT5udW1fYXJyYXlfZWxlbWVudHM7CisgICAgICAgICBudW1fdmFyaWFibGVzICs9IGItPm51bV9hcnJheV9lbGVtZW50cworICAgICAgICAgICAgKiBibG9ja19zaXplLm51bV9hY3RpdmVfdW5pZm9ybXM7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbnVtX2Jsb2NrcysrOworICAgICAgICAgbnVtX3ZhcmlhYmxlcyArPSBibG9ja19zaXplLm51bV9hY3RpdmVfdW5pZm9ybXM7CisgICAgICB9CisKKyAgIH0KKworICAgaWYgKG51bV9ibG9ja3MgPT0gMCkgeworICAgICAgYXNzZXJ0KG51bV92YXJpYWJsZXMgPT0gMCk7CisgICAgICBfbWVzYV9oYXNoX3RhYmxlX2Rlc3Ryb3koYmxvY2tfaGFzaCwgTlVMTCk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgYXNzZXJ0KG51bV92YXJpYWJsZXMgIT0gMCk7CisKKyAgIC8qIEFsbG9jYXRlIHN0b3JhZ2UgdG8gaG9sZCBhbGwgb2YgdGhlIGluZm9ybWF0YXRpb24gcmVsYXRlZCB0byB1bmlmb3JtCisgICAgKiBibG9ja3MgdGhhdCBjYW4gYmUgcXVlcmllZCB0aHJvdWdoIHRoZSBBUEkuCisgICAgKi8KKyAgIGdsX3VuaWZvcm1fYmxvY2sgKmJsb2NrcyA9CisgICAgICByYWxsb2NfYXJyYXkobWVtX2N0eCwgZ2xfdW5pZm9ybV9ibG9jaywgbnVtX2Jsb2Nrcyk7CisgICBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZSAqdmFyaWFibGVzID0KKyAgICAgIHJhbGxvY19hcnJheShibG9ja3MsIGdsX3VuaWZvcm1fYnVmZmVyX3ZhcmlhYmxlLCBudW1fdmFyaWFibGVzKTsKKworICAgLyogQWRkIGVhY2ggdmFyaWFibGUgZnJvbSBlYWNoIHVuaWZvcm0gYmxvY2sgdG8gdGhlIEFQSSB0cmFja2luZworICAgICogc3RydWN0dXJlcy4KKyAgICAqLworICAgdW5zaWduZWQgaSA9IDA7CisgICB1Ym9fdmlzaXRvciBwYXJjZWwoYmxvY2tzLCB2YXJpYWJsZXMsIG51bV92YXJpYWJsZXMpOworCisgICBTVEFUSUNfQVNTRVJUKHVuc2lnbmVkKEdMU0xfSU5URVJGQUNFX1BBQ0tJTkdfU1REMTQwKQorICAgICAgICAgICAgICAgICA9PSB1bnNpZ25lZCh1Ym9fcGFja2luZ19zdGQxNDApKTsKKyAgIFNUQVRJQ19BU1NFUlQodW5zaWduZWQoR0xTTF9JTlRFUkZBQ0VfUEFDS0lOR19TSEFSRUQpCisgICAgICAgICAgICAgICAgID09IHVuc2lnbmVkKHVib19wYWNraW5nX3NoYXJlZCkpOworICAgU1RBVElDX0FTU0VSVCh1bnNpZ25lZChHTFNMX0lOVEVSRkFDRV9QQUNLSU5HX1BBQ0tFRCkKKyAgICAgICAgICAgICAgICAgPT0gdW5zaWduZWQodWJvX3BhY2tpbmdfcGFja2VkKSk7CisKKworICAgaGFzaF90YWJsZV9mb3JlYWNoIChibG9ja19oYXNoLCBlbnRyeSkgeworICAgICAgY29uc3Qgc3RydWN0IGxpbmtfdW5pZm9ybV9ibG9ja19hY3RpdmUgKmNvbnN0IGIgPQorICAgICAgICAgKGNvbnN0IHN0cnVjdCBsaW5rX3VuaWZvcm1fYmxvY2tfYWN0aXZlICopIGVudHJ5LT5kYXRhOworICAgICAgY29uc3QgZ2xzbF90eXBlICpibG9ja190eXBlID0gYi0+dHlwZTsKKworICAgICAgaWYgKGItPm51bV9hcnJheV9lbGVtZW50cyA+IDApIHsKKyAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWUgPSBibG9ja190eXBlLT5maWVsZHMuYXJyYXktPm5hbWU7CisKKyAgICAgICAgIGFzc2VydChiLT5oYXNfaW5zdGFuY2VfbmFtZSk7CisgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgYi0+bnVtX2FycmF5X2VsZW1lbnRzOyBqKyspIHsKKyAgICAgICAgICAgIGJsb2Nrc1tpXS5OYW1lID0gcmFsbG9jX2FzcHJpbnRmKGJsb2NrcywgIiVzWyV1XSIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT5hcnJheV9lbGVtZW50c1tqXSk7CisgICAgICAgICAgICBibG9ja3NbaV0uVW5pZm9ybXMgPSAmdmFyaWFibGVzW3BhcmNlbC5pbmRleF07CisKKyAgICAgICAgICAgIC8qIFRoZSBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIHNwZWMgc2F5czoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgICAgIklmIHRoZSBiaW5kaW5nIGlkZW50aWZpZXIgaXMgdXNlZCB3aXRoIGEgdW5pZm9ybSBibG9jaworICAgICAgICAgICAgICogICAgIGluc3RhbmNlZCBhcyBhbiBhcnJheSB0aGVuIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheQorICAgICAgICAgICAgICogICAgIHRha2VzIHRoZSBzcGVjaWZpZWQgYmxvY2sgYmluZGluZyBhbmQgZWFjaCBzdWJzZXF1ZW50CisgICAgICAgICAgICAgKiAgICAgZWxlbWVudCB0YWtlcyB0aGUgbmV4dCBjb25zZWN1dGl2ZSB1bmlmb3JtIGJsb2NrIGJpbmRpbmcKKyAgICAgICAgICAgICAqICAgICBwb2ludC4iCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJsb2Nrc1tpXS5CaW5kaW5nID0gKGItPmhhc19iaW5kaW5nKSA/IGItPmJpbmRpbmcgKyBqIDogMDsKKworICAgICAgICAgICAgYmxvY2tzW2ldLlVuaWZvcm1CdWZmZXJTaXplID0gMDsKKyAgICAgICAgICAgIGJsb2Nrc1tpXS5fUGFja2luZyA9CisgICAgICAgICAgICAgICBnbF91bmlmb3JtX2Jsb2NrX3BhY2tpbmcoYmxvY2tfdHlwZS0+aW50ZXJmYWNlX3BhY2tpbmcpOworCisgICAgICAgICAgICBwYXJjZWwucHJvY2VzcyhibG9ja190eXBlLT5maWVsZHMuYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NbaV0uTmFtZSk7CisKKyAgICAgICAgICAgIGJsb2Nrc1tpXS5Vbmlmb3JtQnVmZmVyU2l6ZSA9IHBhcmNlbC5idWZmZXJfc2l6ZTsKKworICAgICAgICAgICAgYmxvY2tzW2ldLk51bVVuaWZvcm1zID0KKyAgICAgICAgICAgICAgICh1bnNpZ25lZCkocHRyZGlmZl90KSgmdmFyaWFibGVzW3BhcmNlbC5pbmRleF0gLSBibG9ja3NbaV0uVW5pZm9ybXMpOworCisgICAgICAgICAgICBpKys7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgYmxvY2tzW2ldLk5hbWUgPSByYWxsb2Nfc3RyZHVwKGJsb2NrcywgYmxvY2tfdHlwZS0+bmFtZSk7CisgICAgICAgICBibG9ja3NbaV0uVW5pZm9ybXMgPSAmdmFyaWFibGVzW3BhcmNlbC5pbmRleF07CisgICAgICAgICBibG9ja3NbaV0uQmluZGluZyA9IChiLT5oYXNfYmluZGluZykgPyBiLT5iaW5kaW5nIDogMDsKKyAgICAgICAgIGJsb2Nrc1tpXS5Vbmlmb3JtQnVmZmVyU2l6ZSA9IDA7CisgICAgICAgICBibG9ja3NbaV0uX1BhY2tpbmcgPQorICAgICAgICAgICAgZ2xfdW5pZm9ybV9ibG9ja19wYWNraW5nKGJsb2NrX3R5cGUtPmludGVyZmFjZV9wYWNraW5nKTsKKworICAgICAgICAgcGFyY2VsLnByb2Nlc3MoYmxvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmhhc19pbnN0YW5jZV9uYW1lID8gYmxvY2tfdHlwZS0+bmFtZSA6ICIiKTsKKworICAgICAgICAgYmxvY2tzW2ldLlVuaWZvcm1CdWZmZXJTaXplID0gcGFyY2VsLmJ1ZmZlcl9zaXplOworCisgICAgICAgICBibG9ja3NbaV0uTnVtVW5pZm9ybXMgPQorICAgICAgICAgICAgKHVuc2lnbmVkKShwdHJkaWZmX3QpKCZ2YXJpYWJsZXNbcGFyY2VsLmluZGV4XSAtIGJsb2Nrc1tpXS5Vbmlmb3Jtcyk7CisKKyAgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgIH0KKworICAgYXNzZXJ0KHBhcmNlbC5pbmRleCA9PSBudW1fdmFyaWFibGVzKTsKKworICAgX21lc2FfaGFzaF90YWJsZV9kZXN0cm95KGJsb2NrX2hhc2gsIE5VTEwpOworCisgICAqYmxvY2tzX3JldCA9IGJsb2NrczsKKyAgIHJldHVybiBudW1fYmxvY2tzOworfQorCitib29sCitsaW5rX3VuaWZvcm1fYmxvY2tzX2FyZV9jb21wYXRpYmxlKGNvbnN0IGdsX3VuaWZvcm1fYmxvY2sgKmEsCisJCQkJICAgY29uc3QgZ2xfdW5pZm9ybV9ibG9jayAqYikKK3sKKyAgIGFzc2VydChzdHJjbXAoYS0+TmFtZSwgYi0+TmFtZSkgPT0gMCk7CisKKyAgIC8qIFBhZ2UgMzUgKHBhZ2UgNDIgb2YgdGhlIFBERikgaW4gc2VjdGlvbiA0LjMuNyBvZiB0aGUgR0xTTCAxLjUwIHNwZWMgc2F5czoKKyAgICAqCisgICAgKiAgICAgIk1hdGNoZWQgYmxvY2sgbmFtZXMgd2l0aGluIGFuIGludGVyZmFjZSAoYXMgZGVmaW5lZCBhYm92ZSkgbXVzdAorICAgICogICAgIG1hdGNoIGluIHRlcm1zIG9mIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2YgZGVjbGFyYXRpb25zIHdpdGggdGhlCisgICAgKiAgICAgc2FtZSBzZXF1ZW5jZSBvZiB0eXBlcyBhbmQgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgbWVtYmVyIG5hbWVzLCBhcworICAgICogICAgIHdlbGwgYXMgaGF2aW5nIHRoZSBzYW1lIG1lbWJlci13aXNlIGxheW91dCBxdWFsaWZpY2F0aW9uLi4uLmlmIGEKKyAgICAqICAgICBtYXRjaGluZyBibG9jayBpcyBkZWNsYXJlZCBhcyBhbiBhcnJheSwgdGhlbiB0aGUgYXJyYXkgc2l6ZXMgbXVzdAorICAgICogICAgIGFsc28gbWF0Y2guLi4gQW55IG1pc21hdGNoIHdpbGwgZ2VuZXJhdGUgYSBsaW5rIGVycm9yLiIKKyAgICAqCisgICAgKiBBcnJheXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbyB0aGVyZSBpcyBubyBjaGVjayBmb3IgdGhhdC4KKyAgICAqLworICAgaWYgKGEtPk51bVVuaWZvcm1zICE9IGItPk51bVVuaWZvcm1zKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoYS0+X1BhY2tpbmcgIT0gYi0+X1BhY2tpbmcpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhLT5OdW1Vbmlmb3JtczsgaSsrKSB7CisgICAgICBpZiAoc3RyY21wKGEtPlVuaWZvcm1zW2ldLk5hbWUsIGItPlVuaWZvcm1zW2ldLk5hbWUpICE9IDApCisJIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKGEtPlVuaWZvcm1zW2ldLlR5cGUgIT0gYi0+VW5pZm9ybXNbaV0uVHlwZSkKKwkgcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoYS0+VW5pZm9ybXNbaV0uUm93TWFqb3IgIT0gYi0+VW5pZm9ybXNbaV0uUm93TWFqb3IpCisJIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xpbmtfdW5pZm9ybV9pbml0aWFsaXplcnMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX3VuaWZvcm1faW5pdGlhbGl6ZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTRjZDcxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX3VuaWZvcm1faW5pdGlhbGl6ZXJzLmNwcApAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJsaWJmbnMuaCIgLy8gTHVuYXJHIEFERDoKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImxpbmtlci5oIgorI2luY2x1ZGUgImlyX3VuaWZvcm0uaCIKKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHB1dCBpbiBhICJwcml2YXRlIiBuYW1lc3BhY2UgaW5zdGVhZCBvZiBiZWluZyBtYXJrZWQKKyAqIHN0YXRpYyBzbyB0aGF0IHRoZSB1bml0IHRlc3RzIGNhbiBhY2Nlc3MgdGhlbS4gIFNlZQorICogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9BZHZhbmNlZEd1aWRlI1Rlc3RpbmdfUHJpdmF0ZV9Db2RlCisgKi8KK25hbWVzcGFjZSBsaW5rZXIgeworCitnbF91bmlmb3JtX3N0b3JhZ2UgKgorZ2V0X3N0b3JhZ2UoZ2xfdW5pZm9ybV9zdG9yYWdlICpzdG9yYWdlLCB1bnNpZ25lZCBudW1fc3RvcmFnZSwKKwkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtX3N0b3JhZ2U7IGkrKykgeworICAgICAgaWYgKHN0cmNtcChuYW1lLCBzdG9yYWdlW2ldLm5hbWUpID09IDApCisJIHJldHVybiAmc3RvcmFnZVtpXTsKKyAgIH0KKworICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZ2V0X3VuaWZvcm1fYmxvY2tfaW5kZXgoY29uc3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnNoUHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaWZvcm1CbG9ja05hbWUpCit7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hQcm9nLT5OdW1Vbmlmb3JtQmxvY2tzOyBpKyspIHsKKyAgICAgIGlmICghc3RyY21wKHNoUHJvZy0+VW5pZm9ybUJsb2Nrc1tpXS5OYW1lLCB1bmlmb3JtQmxvY2tOYW1lKSkKKwkgcmV0dXJuIGk7CisgICB9CisKKyAgIHJldHVybiBHTF9JTlZBTElEX0lOREVYOworfQorCit2b2lkCitjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UodW5pb24gZ2xfY29uc3RhbnRfdmFsdWUgKnN0b3JhZ2UsCisJCQkgY29uc3QgaXJfY29uc3RhbnQgKnZhbCwKKwkJCSBjb25zdCBlbnVtIGdsc2xfYmFzZV90eXBlIGJhc2VfdHlwZSwKKwkJCSBjb25zdCB1bnNpZ25lZCBpbnQgZWxlbWVudHMpCit7CisgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGVsZW1lbnRzOyBpKyspIHsKKyAgICAgIHN3aXRjaCAoYmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9VSU5UOgorCSBzdG9yYWdlW2ldLnUgPSB2YWwtPnZhbHVlLnVbaV07CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorICAgICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKwkgc3RvcmFnZVtpXS5pID0gdmFsLT52YWx1ZS5pW2ldOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSBzdG9yYWdlW2ldLmYgPSB2YWwtPnZhbHVlLmZbaV07CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgc3RvcmFnZVtpXS5iID0gaW50KHZhbC0+dmFsdWUuYltpXSk7CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6CisgICAgICBjYXNlIEdMU0xfVFlQRV9TVFJVQ1Q6CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTUFHRToKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0FUT01JQ19VSU5UOgorICAgICAgY2FzZSBHTFNMX1RZUEVfSU5URVJGQUNFOgorICAgICAgY2FzZSBHTFNMX1RZUEVfVk9JRDoKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0VSUk9SOgorCSAvKiBBbGwgb3RoZXIgdHlwZXMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGZpbHRlcmVkIGJ5IG90aGVyCisJICAqIHBhdGhzIGluIHRoZSBjYWxsZXIuCisJICAqLworCSBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworCSBicmVhazsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZAorc2V0X3NhbXBsZXJfYmluZGluZyhnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywgY29uc3QgY2hhciAqbmFtZSwgaW50IGJpbmRpbmcpCit7CisgICBzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlICpjb25zdCBzdG9yYWdlID0KKyAgICAgIGdldF9zdG9yYWdlKHByb2ctPlVuaWZvcm1TdG9yYWdlLCBwcm9nLT5OdW1Vc2VyVW5pZm9ybVN0b3JhZ2UsIG5hbWUpOworCisgICBpZiAoc3RvcmFnZSA9PSBOVUxMKSB7CisgICAgICBhc3NlcnQoc3RvcmFnZSAhPSBOVUxMKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgY29uc3QgdW5zaWduZWQgZWxlbWVudHMgPSBNQVgyKHN0b3JhZ2UtPmFycmF5X2VsZW1lbnRzLCAxKTsKKworICAgLyogU2VjdGlvbiA0LjQuNCAoT3BhcXVlLVVuaWZvcm0gTGF5b3V0IFF1YWxpZmllcnMpIG9mIHRoZSBHTFNMIDQuMjAgc3BlYworICAgICogc2F5czoKKyAgICAqCisgICAgKiAgICAgIklmIHRoZSBiaW5kaW5nIGlkZW50aWZpZXIgaXMgdXNlZCB3aXRoIGFuIGFycmF5LCB0aGUgZmlyc3QgZWxlbWVudAorICAgICogICAgIG9mIHRoZSBhcnJheSB0YWtlcyB0aGUgc3BlY2lmaWVkIHVuaXQgYW5kIGVhY2ggc3Vic2VxdWVudCBlbGVtZW50CisgICAgKiAgICAgdGFrZXMgdGhlIG5leHQgY29uc2VjdXRpdmUgdW5pdC4iCisgICAgKi8KKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZWxlbWVudHM7IGkrKykgeworICAgICAgc3RvcmFnZS0+c3RvcmFnZVtpXS5pID0gYmluZGluZyArIGk7CisgICB9CisKKyAgIGZvciAoaW50IHNoID0gMDsgc2ggPCBNRVNBX1NIQURFUl9TVEFHRVM7IHNoKyspIHsKKyAgICAgIGdsX3NoYWRlciAqc2hhZGVyID0gcHJvZy0+X0xpbmtlZFNoYWRlcnNbc2hdOworCisgICAgICBpZiAoc2hhZGVyICYmIHN0b3JhZ2UtPnNhbXBsZXJbc2hdLmFjdGl2ZSkgeworICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4ID0gc3RvcmFnZS0+c2FtcGxlcltzaF0uaW5kZXggKyBpOworCisgICAgICAgICAgICBzaGFkZXItPlNhbXBsZXJVbml0c1tpbmRleF0gPSBzdG9yYWdlLT5zdG9yYWdlW2ldLmk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHN0b3JhZ2UtPmluaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZAorc2V0X2Jsb2NrX2JpbmRpbmcoZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKmJsb2NrX25hbWUsIGludCBiaW5kaW5nKQoreworICAgY29uc3QgdW5zaWduZWQgYmxvY2tfaW5kZXggPSBnZXRfdW5pZm9ybV9ibG9ja19pbmRleChwcm9nLCBibG9ja19uYW1lKTsKKworICAgaWYgKGJsb2NrX2luZGV4ID09IEdMX0lOVkFMSURfSU5ERVgpIHsKKyAgICAgIGFzc2VydChibG9ja19pbmRleCAhPSBHTF9JTlZBTElEX0lOREVYKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgICAgLyogVGhpcyBpcyBhIGZpZWxkIG9mIGEgVUJPLiAgdmFsIGlzIHRoZSBiaW5kaW5nIGluZGV4LiAqLworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworICAgICAgICAgaW50IHN0YWdlX2luZGV4ID0gcHJvZy0+VW5pZm9ybUJsb2NrU3RhZ2VJbmRleFtpXVtibG9ja19pbmRleF07CisKKyAgICAgICAgIGlmIChzdGFnZV9pbmRleCAhPSAtMSkgeworICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2ggPSBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXTsKKyAgICAgICAgICAgIHNoLT5Vbmlmb3JtQmxvY2tzW3N0YWdlX2luZGV4XS5CaW5kaW5nID0gYmluZGluZzsKKyAgICAgICAgIH0KKyAgICAgIH0KK30KKwordm9pZAorc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIodm9pZCAqbWVtX2N0eCwgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisJCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCBnbHNsX3R5cGUgKnR5cGUsCisJCQlpcl9jb25zdGFudCAqdmFsKQoreworICAgaWYgKHR5cGUtPmlzX3JlY29yZCgpKSB7CisgICAgICBpcl9jb25zdGFudCAqZmllbGRfY29uc3RhbnQ7CisKKyAgICAgIGZpZWxkX2NvbnN0YW50ID0gKGlyX2NvbnN0YW50ICopdmFsLT5jb21wb25lbnRzLmdldF9oZWFkKCk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgY29uc3QgZ2xzbF90eXBlICpmaWVsZF90eXBlID0gdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlOworCSBjb25zdCBjaGFyICpmaWVsZF9uYW1lID0gcmFsbG9jX2FzcHJpbnRmKG1lbV9jdHgsICIlcy4lcyIsIG5hbWUsCisJCQkJCSAgICB0eXBlLT5maWVsZHMuc3RydWN0dXJlW2ldLm5hbWUpOworCSBzZXRfdW5pZm9ybV9pbml0aWFsaXplcihtZW1fY3R4LCBwcm9nLCBmaWVsZF9uYW1lLAorCQkJCSBmaWVsZF90eXBlLCBmaWVsZF9jb25zdGFudCk7CisJIGZpZWxkX2NvbnN0YW50ID0gKGlyX2NvbnN0YW50ICopZmllbGRfY29uc3RhbnQtPm5leHQ7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKSkgeworICAgICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCBlbGVtZW50X3R5cGUgPSB0eXBlLT5maWVsZHMuYXJyYXk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgY29uc3QgY2hhciAqZWxlbWVudF9uYW1lID0gcmFsbG9jX2FzcHJpbnRmKG1lbV9jdHgsICIlc1slZF0iLCBuYW1lLCBpKTsKKworCSBzZXRfdW5pZm9ybV9pbml0aWFsaXplcihtZW1fY3R4LCBwcm9nLCBlbGVtZW50X25hbWUsCisJCQkJIGVsZW1lbnRfdHlwZSwgdmFsLT5hcnJheV9lbGVtZW50c1tpXSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHN0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgKmNvbnN0IHN0b3JhZ2UgPQorICAgICAgZ2V0X3N0b3JhZ2UocHJvZy0+VW5pZm9ybVN0b3JhZ2UsCisJCSAgcHJvZy0+TnVtVXNlclVuaWZvcm1TdG9yYWdlLAorCQkgIG5hbWUpOworICAgaWYgKHN0b3JhZ2UgPT0gTlVMTCkgeworICAgICAgYXNzZXJ0KHN0b3JhZ2UgIT0gTlVMTCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICh2YWwtPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIGNvbnN0IGVudW0gZ2xzbF9iYXNlX3R5cGUgYmFzZV90eXBlID0KKwkgdmFsLT5hcnJheV9lbGVtZW50c1swXS0+dHlwZS0+YmFzZV90eXBlOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IGVsZW1lbnRzID0gdmFsLT5hcnJheV9lbGVtZW50c1swXS0+dHlwZS0+Y29tcG9uZW50cygpOworICAgICAgdW5zaWduZWQgaW50IGlkeCA9IDA7CisKKyAgICAgIGFzc2VydCh2YWwtPnR5cGUtPmxlbmd0aCA+PSBzdG9yYWdlLT5hcnJheV9lbGVtZW50cyk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0b3JhZ2UtPmFycmF5X2VsZW1lbnRzOyBpKyspIHsKKwkgY29weV9jb25zdGFudF90b19zdG9yYWdlKCYgc3RvcmFnZS0+c3RvcmFnZVtpZHhdLAorCQkJCSAgdmFsLT5hcnJheV9lbGVtZW50c1tpXSwKKwkJCQkgIGJhc2VfdHlwZSwKKwkJCQkgIGVsZW1lbnRzKTsKKworCSBpZHggKz0gZWxlbWVudHM7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgY29weV9jb25zdGFudF90b19zdG9yYWdlKHN0b3JhZ2UtPnN0b3JhZ2UsCisJCQkgICAgICAgdmFsLAorCQkJICAgICAgIHZhbC0+dHlwZS0+YmFzZV90eXBlLAorCQkJICAgICAgIHZhbC0+dHlwZS0+Y29tcG9uZW50cygpKTsKKworICAgICAgaWYgKHN0b3JhZ2UtPnR5cGUtPmlzX3NhbXBsZXIoKSkgeworICAgICAgICAgZm9yIChpbnQgc2ggPSAwOyBzaCA8IE1FU0FfU0hBREVSX1NUQUdFUzsgc2grKykgeworICAgICAgICAgICAgZ2xfc2hhZGVyICpzaGFkZXIgPSBwcm9nLT5fTGlua2VkU2hhZGVyc1tzaF07CisKKyAgICAgICAgICAgIGlmIChzaGFkZXIgJiYgc3RvcmFnZS0+c2FtcGxlcltzaF0uYWN0aXZlKSB7CisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCA9IHN0b3JhZ2UtPnNhbXBsZXJbc2hdLmluZGV4OworCisgICAgICAgICAgICAgICBzaGFkZXItPlNhbXBsZXJVbml0c1tpbmRleF0gPSBzdG9yYWdlLT5zdG9yYWdlWzBdLmk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHN0b3JhZ2UtPmluaXRpYWxpemVkID0gdHJ1ZTsKK30KK30KKwordm9pZAorbGlua19zZXRfdW5pZm9ybV9pbml0aWFsaXplcnMoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgdm9pZCAqbWVtX2N0eCA9IE5VTEw7CisKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTUVTQV9TSEFERVJfU1RBR0VTOyBpKyspIHsKKyAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldOworCisgICAgICBpZiAoc2hhZGVyID09IE5VTEwpCisJIGNvbnRpbnVlOworCisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgc2hhZGVyLT5pcikgeworCSBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworCSBpZiAoIXZhciB8fCB2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfdW5pZm9ybSkKKwkgICAgY29udGludWU7CisKKwkgaWYgKCFtZW1fY3R4KQorCSAgICBtZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisKKyAgICAgICAgIGlmICh2YXItPmRhdGEuZXhwbGljaXRfYmluZGluZykgeworICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCB0eXBlID0gdmFyLT50eXBlOworCisgICAgICAgICAgICBpZiAodHlwZS0+aXNfc2FtcGxlcigpCisgICAgICAgICAgICAgICAgfHwgKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19zYW1wbGVyKCkpKSB7CisgICAgICAgICAgICAgICBsaW5rZXI6OnNldF9zYW1wbGVyX2JpbmRpbmcocHJvZywgdmFyLT5uYW1lLCB2YXItPmRhdGEuYmluZGluZyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhci0+aXNfaW5fdW5pZm9ybV9ibG9jaygpKSB7CisgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGlmYWNlX3R5cGUgPSB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpOworCisgICAgICAgICAgICAgICAvKiBJZiB0aGUgdmFyaWFibGUgaXMgYW4gYXJyYXkgYW5kIGl0IGlzIGFuIGludGVyZmFjZSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAqIHdlIG5lZWQgdG8gc2V0IHRoZSBiaW5kaW5nIGZvciBlYWNoIGFycmF5IGVsZW1lbnQuICBKdXN0CisgICAgICAgICAgICAgICAgKiBjaGVja2luZyB0aGF0IHRoZSB2YXJpYWJsZSBpcyBhbiBhcnJheSBpcyBub3Qgc3VmZmljaWVudC4KKyAgICAgICAgICAgICAgICAqIFRoZSB2YXJpYWJsZSBjb3VsZCBiZSBhbiBhcnJheSBlbGVtZW50IG9mIGEgdW5pZm9ybSBibG9jaworICAgICAgICAgICAgICAgICogdGhhdCBsYWNrcyBhbiBpbnN0YW5jZSBuYW1lLiAgRm9yIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICogICAgIHVuaWZvcm0gVSB7CisgICAgICAgICAgICAgICAgKiAgICAgICAgIGZsb2F0IGZbNF07CisgICAgICAgICAgICAgICAgKiAgICAgfTsKKyAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgKiBJbiB0aGlzIGNhc2UgImYiIHdvdWxkIHBhc3MgaXNfaW5fdW5pZm9ybV9ibG9jayAoYWJvdmUpIGFuZAorICAgICAgICAgICAgICAgICogdHlwZS0+aXNfYXJyYXkoKSwgYnV0IGl0IHdpbGwgZmFpbCBpc19pbnRlcmZhY2VfaW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaWYgKHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkgJiYgdmFyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFyLT50eXBlLT5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICByYWxsb2NfYXNwcmludGYobWVtX2N0eCwgIiVzWyV1XSIsIGlmYWNlX3R5cGUtPm5hbWUsIGkpOworCisgICAgICAgICAgICAgICAgICAgICAvKiBTZWN0aW9uIDQuNC4zIChVbmlmb3JtIEJsb2NrIExheW91dCBRdWFsaWZpZXJzKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAqIEdMU0wgNC4yMCBzcGVjIHNheXM6CisgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICogICAgICJJZiB0aGUgYmluZGluZyBpZGVudGlmaWVyIGlzIHVzZWQgd2l0aCBhIHVuaWZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAqICAgICBibG9jayBpbnN0YW5jZWQgYXMgYW4gYXJyYXkgdGhlbiB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICogICAgIG9mIHRoZSBhcnJheSB0YWtlcyB0aGUgc3BlY2lmaWVkIGJsb2NrIGJpbmRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgKiAgICAgZWFjaCBzdWJzZXF1ZW50IGVsZW1lbnQgdGFrZXMgdGhlIG5leHQgY29uc2VjdXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAqICAgICB1bmlmb3JtIGJsb2NrIGJpbmRpbmcgcG9pbnQuIgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBsaW5rZXI6OnNldF9ibG9ja19iaW5kaW5nKHByb2csIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+ZGF0YS5iaW5kaW5nICsgaSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbGlua2VyOjpzZXRfYmxvY2tfYmluZGluZyhwcm9nLCBpZmFjZV90eXBlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPmRhdGEuYmluZGluZyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmNvbnRhaW5zX2F0b21pYygpKSB7CisgICAgICAgICAgICAgICAvKiB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGRvIGFueXRoaW5nLiAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIGFzc2VydCghIkV4cGxpY2l0IGJpbmRpbmcgbm90IG9uIGEgc2FtcGxlciwgVUJPIG9yIGF0b21pYy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSBpZiAodmFyLT5jb25zdGFudF92YWx1ZSkgeworICAgICAgICAgICAgbGlua2VyOjpzZXRfdW5pZm9ybV9pbml0aWFsaXplcihtZW1fY3R4LCBwcm9nLCB2YXItPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dHlwZSwgdmFyLT5jb25zdGFudF92YWx1ZSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX3VuaWZvcm1zLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua191bmlmb3Jtcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlODdhYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua191bmlmb3Jtcy5jcHAKQEAgLTAsMCArMSw5NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAibGliZm5zLmgiIC8vIEx1bmFyRyBBREQ6CisjaW5jbHVkZSAiaWNkLXV0aWxzLmgiIC8vIEx1bmFyRzogQURECisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJsaW5rZXIuaCIKKyNpbmNsdWRlICJpcl91bmlmb3JtLmgiCisjaW5jbHVkZSAiZ2xzbF9zeW1ib2xfdGFibGUuaCIKKyNpbmNsdWRlICJwcm9ncmFtL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJwcm9ncmFtLmgiCisKKy8qKgorICogXGZpbGUgbGlua191bmlmb3Jtcy5jcHAKKyAqIEFzc2lnbiBsb2NhdGlvbnMgZm9yIEdMU0wgdW5pZm9ybXMuCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworCisvKioKKyAqIENvdW50IHRoZSBiYWNraW5nIHN0b3JhZ2UgcmVxdWlyZW1lbnRzIGZvciBhIHR5cGUKKyAqLworc3RhdGljIHVuc2lnbmVkCit2YWx1ZXNfZm9yX3R5cGUoY29uc3QgZ2xzbF90eXBlICp0eXBlKQoreworICAgaWYgKHR5cGUtPmlzX3NhbXBsZXIoKSkgeworICAgICAgcmV0dXJuIDE7CisgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19zYW1wbGVyKCkpIHsKKyAgICAgIHJldHVybiB0eXBlLT5hcnJheV9zaXplKCk7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGUtPmNvbXBvbmVudF9zbG90cygpOworICAgfQorfQorCit2b2lkCitwcm9ncmFtX3Jlc291cmNlX3Zpc2l0b3I6OnByb2Nlc3MoY29uc3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgYXNzZXJ0KHR5cGUtPmlzX3JlY29yZCgpCisgICAgICAgICAgfHwgKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKSkKKyAgICAgICAgICB8fCB0eXBlLT5pc19pbnRlcmZhY2UoKQorICAgICAgICAgIHx8ICh0eXBlLT5pc19hcnJheSgpICYmIHR5cGUtPmZpZWxkcy5hcnJheS0+aXNfaW50ZXJmYWNlKCkpKTsKKworICAgY2hhciAqbmFtZV9jb3B5ID0gcmFsbG9jX3N0cmR1cChOVUxMLCBuYW1lKTsKKyAgIHJlY3Vyc2lvbih0eXBlLCAmbmFtZV9jb3B5LCBzdHJsZW4obmFtZSksIGZhbHNlLCBOVUxMKTsKKyAgIHJhbGxvY19mcmVlKG5hbWVfY29weSk7Cit9CisKK3ZvaWQKK3Byb2dyYW1fcmVzb3VyY2VfdmlzaXRvcjo6cHJvY2Vzcyhpcl92YXJpYWJsZSAqdmFyKQoreworICAgY29uc3QgZ2xzbF90eXBlICp0ID0gdmFyLT50eXBlOworCisgICAvKiBmYWxzZSBpcyBhbHdheXMgcGFzc2VkIGZvciB0aGUgcm93X21ham9yIHBhcmFtZXRlciB0byB0aGUgb3RoZXIKKyAgICAqIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGJlY2F1c2Ugbm8gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHRvIGRvCisgICAgKiBvdGhlcndpc2UuICBTZWUgdGhlIHdhcm5pbmcgaW4gbGlua2VyLmguCisgICAgKi8KKworICAgLyogT25seSBzdHJkdXAgdGhlIG5hbWUgaWYgd2UgYWN0dWFsbHkgd2lsbCBuZWVkIHRvIG1vZGlmeSBpdC4gKi8KKyAgIGlmICh2YXItPmRhdGEuZnJvbV9uYW1lZF9pZmNfYmxvY2tfYXJyYXkpIHsKKyAgICAgIC8qIGxvd2VyX25hbWVkX2ludGVyZmFjZV9ibG9ja3MgY3JlYXRlZCB0aGlzIHZhcmlhYmxlIGJ5IGxvd2VyaW5nIGFuCisgICAgICAgKiBpbnRlcmZhY2UgYmxvY2sgYXJyYXkgdG8gYW4gYXJyYXkgdmFyaWFibGUuICBGb3IgZXhhbXBsZSBpZiB0aGUKKyAgICAgICAqIG9yaWdpbmFsIHNvdXJjZSBjb2RlIHdhczoKKyAgICAgICAqCisgICAgICAgKiAgICAgb3V0IEJsayB7IHZlYzQgYmFyIH0gZm9vWzNdOworICAgICAgICoKKyAgICAgICAqIFRoZW4gdGhlIHZhcmlhYmxlIGlzIG5vdzoKKyAgICAgICAqCisgICAgICAgKiAgICAgb3V0IHZlYzQgYmFyWzNdOworICAgICAgICoKKyAgICAgICAqIFdlIG5lZWQgdG8gdmlzaXQgZWFjaCBhcnJheSBlbGVtZW50IHVzaW5nIHRoZSBuYW1lcyBjb25zdHJ1Y3RlZCBsaWtlCisgICAgICAgKiBzbzoKKyAgICAgICAqCisgICAgICAgKiAgICAgQmxrWzBdLmJhcgorICAgICAgICogICAgIEJsa1sxXS5iYXIKKyAgICAgICAqICAgICBCbGtbMl0uYmFyCisgICAgICAgKi8KKyAgICAgIGFzc2VydCh0LT5pc19hcnJheSgpKTsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqaWZjX3R5cGUgPSB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpOworICAgICAgY2hhciAqbmFtZSA9IHJhbGxvY19zdHJkdXAoTlVMTCwgaWZjX3R5cGUtPm5hbWUpOworICAgICAgc2l6ZV90IG5hbWVfbGVuZ3RoID0gc3RybGVuKG5hbWUpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHQtPmxlbmd0aDsgaSsrKSB7CisgICAgICAgICBzaXplX3QgbmV3X2xlbmd0aCA9IG5hbWVfbGVuZ3RoOworICAgICAgICAgcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbCgmbmFtZSwgJm5ld19sZW5ndGgsICJbJXVdLiVzIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT5uYW1lKTsKKyAgICAgICAgIC8qIE5vdGU6IHJvd19tYWpvciBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHVuaWZvcm0gYmxvY2tzLCBhbmQKKyAgICAgICAgICAqIGxvd2VyaW5nIGlzIG9ubHkgYXBwbGllZCB0byBub24tdW5pZm9ybSBpbnRlcmZhY2UgYmxvY2tzLCBzbyB3ZQorICAgICAgICAgICogY2FuIHNhZmVseSBwYXNzIGZhbHNlIGZvciByb3dfbWFqb3IuCisgICAgICAgICAgKi8KKyAgICAgICAgIHJlY3Vyc2lvbih2YXItPnR5cGUsICZuYW1lLCBuZXdfbGVuZ3RoLCBmYWxzZSwgTlVMTCk7CisgICAgICB9CisgICAgICByYWxsb2NfZnJlZShuYW1lKTsKKyAgIH0gZWxzZSBpZiAodmFyLT5kYXRhLmZyb21fbmFtZWRfaWZjX2Jsb2NrX25vbmFycmF5KSB7CisgICAgICAvKiBsb3dlcl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzIGNyZWF0ZWQgdGhpcyB2YXJpYWJsZSBieSBsb3dlcmluZyBhCisgICAgICAgKiBuYW1lZCBpbnRlcmZhY2UgYmxvY2sgKG5vbi1hcnJheSkgdG8gYW4gb3JkaW5hcnkgdmFyaWFibGUuICBGb3IKKyAgICAgICAqIGV4YW1wbGUgaWYgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIHdhczoKKyAgICAgICAqCisgICAgICAgKiAgICAgb3V0IEJsayB7IHZlYzQgYmFyIH0gZm9vOworICAgICAgICoKKyAgICAgICAqIFRoZW4gdGhlIHZhcmlhYmxlIGlzIG5vdzoKKyAgICAgICAqCisgICAgICAgKiAgICAgb3V0IHZlYzQgYmFyOworICAgICAgICoKKyAgICAgICAqIFdlIG5lZWQgdG8gdmlzaXQgdGhpcyB2YXJpYWJsZSB1c2luZyB0aGUgbmFtZToKKyAgICAgICAqCisgICAgICAgKiAgICAgQmxrLmJhcgorICAgICAgICovCisgICAgICBjb25zdCBnbHNsX3R5cGUgKmlmY190eXBlID0gdmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKTsKKyAgICAgIGNoYXIgKm5hbWUgPSByYWxsb2NfYXNwcmludGYoTlVMTCwgIiVzLiVzIiwgaWZjX3R5cGUtPm5hbWUsIHZhci0+bmFtZSk7CisgICAgICAvKiBOb3RlOiByb3dfbWFqb3IgaXMgb25seSBtZWFuaW5nZnVsIGZvciB1bmlmb3JtIGJsb2NrcywgYW5kIGxvd2VyaW5nCisgICAgICAgKiBpcyBvbmx5IGFwcGxpZWQgdG8gbm9uLXVuaWZvcm0gaW50ZXJmYWNlIGJsb2Nrcywgc28gd2UgY2FuIHNhZmVseQorICAgICAgICogcGFzcyBmYWxzZSBmb3Igcm93X21ham9yLgorICAgICAgICovCisgICAgICByZWN1cnNpb24odmFyLT50eXBlLCAmbmFtZSwgc3RybGVuKG5hbWUpLCBmYWxzZSwgTlVMTCk7CisgICAgICByYWxsb2NfZnJlZShuYW1lKTsKKyAgIH0gZWxzZSBpZiAodC0+aXNfcmVjb3JkKCkgfHwgKHQtPmlzX2FycmF5KCkgJiYgdC0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKSkpIHsKKyAgICAgIGNoYXIgKm5hbWUgPSByYWxsb2Nfc3RyZHVwKE5VTEwsIHZhci0+bmFtZSk7CisgICAgICByZWN1cnNpb24odmFyLT50eXBlLCAmbmFtZSwgc3RybGVuKG5hbWUpLCBmYWxzZSwgTlVMTCk7CisgICAgICByYWxsb2NfZnJlZShuYW1lKTsKKyAgIH0gZWxzZSBpZiAodC0+aXNfaW50ZXJmYWNlKCkpIHsKKyAgICAgIGNoYXIgKm5hbWUgPSByYWxsb2Nfc3RyZHVwKE5VTEwsIHZhci0+dHlwZS0+bmFtZSk7CisgICAgICByZWN1cnNpb24odmFyLT50eXBlLCAmbmFtZSwgc3RybGVuKG5hbWUpLCBmYWxzZSwgTlVMTCk7CisgICAgICByYWxsb2NfZnJlZShuYW1lKTsKKyAgIH0gZWxzZSBpZiAodC0+aXNfYXJyYXkoKSAmJiB0LT5maWVsZHMuYXJyYXktPmlzX2ludGVyZmFjZSgpKSB7CisgICAgICBjaGFyICpuYW1lID0gcmFsbG9jX3N0cmR1cChOVUxMLCB2YXItPnR5cGUtPmZpZWxkcy5hcnJheS0+bmFtZSk7CisgICAgICByZWN1cnNpb24odmFyLT50eXBlLCAmbmFtZSwgc3RybGVuKG5hbWUpLCBmYWxzZSwgTlVMTCk7CisgICAgICByYWxsb2NfZnJlZShuYW1lKTsKKyAgIH0gZWxzZSB7CisgICAgICB0aGlzLT52aXNpdF9maWVsZCh0LCB2YXItPm5hbWUsIGZhbHNlLCBOVUxMKTsKKyAgIH0KK30KKwordm9pZAorcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yOjpyZWN1cnNpb24oY29uc3QgZ2xzbF90eXBlICp0LCBjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbmd0aCwgYm9vbCByb3dfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKnJlY29yZF90eXBlKQoreworICAgLyogUmVjb3JkcyBuZWVkIHRvIGhhdmUgZWFjaCBmaWVsZCBwcm9jZXNzZWQgaW5kaXZpZHVhbGx5LgorICAgICoKKyAgICAqIEFycmF5cyBvZiByZWNvcmRzIG5lZWQgdG8gaGF2ZSBlYWNoIGFycmF5IGVsZW1lbnQgcHJvY2Vzc2VkCisgICAgKiBpbmRpdmlkdWFsbHksIHRoZW4gZWFjaCBmaWVsZCBvZiB0aGUgcmVzdWx0aW5nIGFycmF5IGVsZW1lbnRzIHByb2Nlc3NlZAorICAgICogaW5kaXZpZHVhbGx5LgorICAgICovCisgICBpZiAodC0+aXNfcmVjb3JkKCkgfHwgdC0+aXNfaW50ZXJmYWNlKCkpIHsKKyAgICAgIGlmIChyZWNvcmRfdHlwZSA9PSBOVUxMICYmIHQtPmlzX3JlY29yZCgpKQorICAgICAgICAgcmVjb3JkX3R5cGUgPSB0OworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdC0+bGVuZ3RoOyBpKyspIHsKKwkgY29uc3QgY2hhciAqZmllbGQgPSB0LT5maWVsZHMuc3RydWN0dXJlW2ldLm5hbWU7CisJIHNpemVfdCBuZXdfbGVuZ3RoID0gbmFtZV9sZW5ndGg7CisKKyAgICAgICAgIGlmICh0LT5maWVsZHMuc3RydWN0dXJlW2ldLnR5cGUtPmlzX3JlY29yZCgpKQorICAgICAgICAgICAgdGhpcy0+dmlzaXRfZmllbGQoJnQtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0pOworCisgICAgICAgICAvKiBBcHBlbmQgJy5maWVsZCcgdG8gdGhlIGN1cnJlbnQgdmFyaWFibGUgbmFtZS4gKi8KKyAgICAgICAgIGlmIChuYW1lX2xlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByYWxsb2NfYXNwcmludGZfcmV3cml0ZV90YWlsKG5hbWUsICZuZXdfbGVuZ3RoLCAiJXMiLCBmaWVsZCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmFsbG9jX2FzcHJpbnRmX3Jld3JpdGVfdGFpbChuYW1lLCAmbmV3X2xlbmd0aCwgIi4lcyIsIGZpZWxkKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcmVjdXJzaW9uKHQtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSwgbmFtZSwgbmV3X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICB0LT5maWVsZHMuc3RydWN0dXJlW2ldLnJvd19tYWpvciwgcmVjb3JkX3R5cGUpOworCisgICAgICAgICAvKiBPbmx5IHRoZSBmaXJzdCBsZWFmLWZpZWxkIG9mIHRoZSByZWNvcmQgZ2V0cyBjYWxsZWQgd2l0aCB0aGUKKyAgICAgICAgICAqIHJlY29yZCB0eXBlIHBvaW50ZXIuCisgICAgICAgICAgKi8KKyAgICAgICAgIHJlY29yZF90eXBlID0gTlVMTDsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAodC0+aXNfYXJyYXkoKSAmJiAodC0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0LT5maWVsZHMuYXJyYXktPmlzX2ludGVyZmFjZSgpKSkgeworICAgICAgaWYgKHJlY29yZF90eXBlID09IE5VTEwgJiYgdC0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKSkKKyAgICAgICAgIHJlY29yZF90eXBlID0gdC0+ZmllbGRzLmFycmF5OworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdC0+bGVuZ3RoOyBpKyspIHsKKwkgc2l6ZV90IG5ld19sZW5ndGggPSBuYW1lX2xlbmd0aDsKKworCSAvKiBBcHBlbmQgdGhlIHN1YnNjcmlwdCB0byB0aGUgY3VycmVudCB2YXJpYWJsZSBuYW1lICovCisJIHJhbGxvY19hc3ByaW50Zl9yZXdyaXRlX3RhaWwobmFtZSwgJm5ld19sZW5ndGgsICJbJXVdIiwgaSk7CisKKyAgICAgICAgIHJlY3Vyc2lvbih0LT5maWVsZHMuYXJyYXksIG5hbWUsIG5ld19sZW5ndGgsIHJvd19tYWpvciwKKyAgICAgICAgICAgICAgICAgICByZWNvcmRfdHlwZSk7CisKKyAgICAgICAgIC8qIE9ubHkgdGhlIGZpcnN0IGxlYWYtZmllbGQgb2YgdGhlIHJlY29yZCBnZXRzIGNhbGxlZCB3aXRoIHRoZQorICAgICAgICAgICogcmVjb3JkIHR5cGUgcG9pbnRlci4KKyAgICAgICAgICAqLworICAgICAgICAgcmVjb3JkX3R5cGUgPSBOVUxMOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIHRoaXMtPnZpc2l0X2ZpZWxkKHQsICpuYW1lLCByb3dfbWFqb3IsIHJlY29yZF90eXBlKTsKKyAgIH0KK30KKwordm9pZAorcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yOjp2aXNpdF9maWVsZChjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKikKK3sKKyAgIHZpc2l0X2ZpZWxkKHR5cGUsIG5hbWUsIHJvd19tYWpvcik7Cit9CisKK3ZvaWQKK3Byb2dyYW1fcmVzb3VyY2VfdmlzaXRvcjo6dmlzaXRfZmllbGQoY29uc3QgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkKQoreworICAgKHZvaWQpIGZpZWxkOworICAgLyogZW1wdHkgKi8KK30KKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBDbGFzcyB0byBoZWxwIGNhbGN1bGF0ZSB0aGUgc3RvcmFnZSByZXF1aXJlbWVudHMgZm9yIGEgc2V0IG9mIHVuaWZvcm1zCisgKgorICogQXMgdW5pZm9ybXMgYXJlIGFkZGVkIHRvIHRoZSBhY3RpdmUgc2V0IHRoZSBudW1iZXIgb2YgYWN0aXZlIHVuaWZvcm1zIGFuZAorICogdGhlIHN0b3JhZ2UgcmVxdWlyZW1lbnRzIGZvciB0aG9zZSB1bmlmb3JtcyBhcmUgYWNjdW11bGF0ZWQuICBUaGUgYWN0aXZlCisgKiB1bmlmb3JtcyBhcmUgYWRkZWQgdGhlIHRoZSBoYXNoIHRhYmxlIHN1cHBsaWVkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBJZiB0aGUgc2FtZSB1bmlmb3JtIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzIChpLmUuLCBvbmNlIGZvciBlYWNoIHNoYWRlcgorICogdGFyZ2V0KSwgaXQgd2lsbCBvbmx5IGJlIGFjY291bnRlZCBvbmNlLgorICovCitjbGFzcyBjb3VudF91bmlmb3JtX3NpemUgOiBwdWJsaWMgcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGNvdW50X3VuaWZvcm1fc2l6ZShzdHJ1Y3Qgc3RyaW5nX3RvX3VpbnRfbWFwICptYXApCisgICAgICA6IG51bV9hY3RpdmVfdW5pZm9ybXMoMCksIG51bV92YWx1ZXMoMCksIG51bV9zaGFkZXJfc2FtcGxlcnMoMCksCisgICAgICAgIG51bV9zaGFkZXJfaW1hZ2VzKDApLCBudW1fc2hhZGVyX3VuaWZvcm1fY29tcG9uZW50cygwKSwKKyAgICAgICAgaXNfdWJvX3ZhcihmYWxzZSksIG1hcChtYXApCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICB2b2lkIHN0YXJ0X3NoYWRlcigpCisgICB7CisgICAgICB0aGlzLT5udW1fc2hhZGVyX3NhbXBsZXJzID0gMDsKKyAgICAgIHRoaXMtPm51bV9zaGFkZXJfaW1hZ2VzID0gMDsKKyAgICAgIHRoaXMtPm51bV9zaGFkZXJfdW5pZm9ybV9jb21wb25lbnRzID0gMDsKKyAgIH0KKworICAgdm9pZCBwcm9jZXNzKGlyX3ZhcmlhYmxlICp2YXIpCisgICB7CisgICAgICB0aGlzLT5pc191Ym9fdmFyID0gdmFyLT5pc19pbl91bmlmb3JtX2Jsb2NrKCk7CisgICAgICBpZiAodmFyLT5pc19pbnRlcmZhY2VfaW5zdGFuY2UoKSkKKyAgICAgICAgIHByb2dyYW1fcmVzb3VyY2VfdmlzaXRvcjo6cHJvY2Vzcyh2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUpOworICAgICAgZWxzZQorICAgICAgICAgcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yOjpwcm9jZXNzKHZhcik7CisgICB9CisKKyAgIC8qKgorICAgICogVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSB1bmlmb3JtcyBjb3VudGVkCisgICAgKi8KKyAgIHVuc2lnbmVkIG51bV9hY3RpdmVfdW5pZm9ybXM7CisKKyAgIC8qKgorICAgICogTnVtYmVyIG9mIGRhdGEgdmFsdWVzIHJlcXVpcmVkIHRvIGJhY2sgdGhlIHN0b3JhZ2UgZm9yIHRoZSBhY3RpdmUgdW5pZm9ybXMKKyAgICAqLworICAgdW5zaWduZWQgbnVtX3ZhbHVlczsKKworICAgLyoqCisgICAgKiBOdW1iZXIgb2Ygc2FtcGxlcnMgdXNlZAorICAgICovCisgICB1bnNpZ25lZCBudW1fc2hhZGVyX3NhbXBsZXJzOworCisgICAvKioKKyAgICAqIE51bWJlciBvZiBpbWFnZXMgdXNlZAorICAgICovCisgICB1bnNpZ25lZCBudW1fc2hhZGVyX2ltYWdlczsKKworICAgLyoqCisgICAgKiBOdW1iZXIgb2YgdW5pZm9ybXMgdXNlZCBpbiB0aGUgY3VycmVudCBzaGFkZXIKKyAgICAqLworICAgdW5zaWduZWQgbnVtX3NoYWRlcl91bmlmb3JtX2NvbXBvbmVudHM7CisKKyAgIGJvb2wgaXNfdWJvX3ZhcjsKKworcHJpdmF0ZToKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdF9maWVsZChjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByb3dfbWFqb3IpCisgICB7CisgICAgICBhc3NlcnQoIXR5cGUtPmlzX3JlY29yZCgpKTsKKyAgICAgIGFzc2VydCghKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKSkpOworICAgICAgYXNzZXJ0KCF0eXBlLT5pc19pbnRlcmZhY2UoKSk7CisgICAgICBhc3NlcnQoISh0eXBlLT5pc19hcnJheSgpICYmIHR5cGUtPmZpZWxkcy5hcnJheS0+aXNfaW50ZXJmYWNlKCkpKTsKKworICAgICAgKHZvaWQpIHJvd19tYWpvcjsKKworICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBzYW1wbGVycyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHVuaWZvcm0gaXMKKyAgICAgICAqIGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUgaGFzaCB0YWJsZSBwcmV2ZW50cyBhZGRpbmcgdGhlIHNhbWUKKyAgICAgICAqIHVuaWZvcm0gZm9yIG11bHRpcGxlIHNoYWRlciB0YXJnZXRzLCBidXQgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8KKyAgICAgICAqIGNvdW50IGl0IGZvciBlYWNoIHNoYWRlciB0YXJnZXQuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHVuc2lnbmVkIHZhbHVlcyA9IHZhbHVlc19mb3JfdHlwZSh0eXBlKTsKKyAgICAgIGlmICh0eXBlLT5jb250YWluc19zYW1wbGVyKCkpIHsKKwkgdGhpcy0+bnVtX3NoYWRlcl9zYW1wbGVycyArPQorCSAgICB0eXBlLT5pc19hcnJheSgpID8gdHlwZS0+YXJyYXlfc2l6ZSgpIDogMTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+Y29udGFpbnNfaW1hZ2UoKSkgeworICAgICAgICAgdGhpcy0+bnVtX3NoYWRlcl9pbWFnZXMgKz0gdmFsdWVzOworCisgICAgICAgICAvKiBBcyBkcml2ZXJzIGFyZSBsaWtlbHkgdG8gcmVwcmVzZW50IGltYWdlIHVuaWZvcm1zIGFzCisgICAgICAgICAgKiBzY2FsYXIgaW5kaWNlcywgY291bnQgdGhlbSBhZ2FpbnN0IHRoZSBsaW1pdCBvZiB1bmlmb3JtCisgICAgICAgICAgKiBjb21wb25lbnRzIGluIHRoZSBkZWZhdWx0IGJsb2NrLiAgVGhlIHNwZWMgYWxsb3dzIGltYWdlCisgICAgICAgICAgKiB1bmlmb3JtcyB0byB1c2UgdXAgbm8gbW9yZSB0aGFuIG9uZSBzY2FsYXIgc2xvdC4KKyAgICAgICAgICAqLworICAgICAgICAgdGhpcy0+bnVtX3NoYWRlcl91bmlmb3JtX2NvbXBvbmVudHMgKz0gdmFsdWVzOworICAgICAgfSBlbHNlIHsKKwkgLyogQWNjdW11bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHVuaWZvcm0gc2xvdHMgdXNlZCBieSB0aGlzIHNoYWRlci4KKwkgICogTm90ZSB0aGF0IHNhbXBsZXJzIGRvIG5vdCBjb3VudCBhZ2FpbnN0IHRoaXMgbGltaXQgYmVjYXVzZSB0aGV5CisJICAqIGRvbid0IHVzZSBhbnkgc3RvcmFnZSBvbiBjdXJyZW50IGhhcmR3YXJlLgorCSAgKi8KKwkgaWYgKCFpc191Ym9fdmFyKQorCSAgICB0aGlzLT5udW1fc2hhZGVyX3VuaWZvcm1fY29tcG9uZW50cyArPSB2YWx1ZXM7CisgICAgICB9CisKKyAgICAgIC8qIElmIHRoZSB1bmlmb3JtIGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGlkOworICAgICAgaWYgKHRoaXMtPm1hcC0+Z2V0KGlkLCBuYW1lKSkKKwkgcmV0dXJuOworCisgICAgICB0aGlzLT5tYXAtPnB1dCh0aGlzLT5udW1fYWN0aXZlX3VuaWZvcm1zLCBuYW1lKTsKKworICAgICAgLyogRWFjaCBsZWFmIHVuaWZvcm0gb2NjdXBpZXMgb25lIGVudHJ5IGluIHRoZSBsaXN0IG9mIGFjdGl2ZQorICAgICAgICogdW5pZm9ybXMuCisgICAgICAgKi8KKyAgICAgIHRoaXMtPm51bV9hY3RpdmVfdW5pZm9ybXMrKzsKKyAgICAgIHRoaXMtPm51bV92YWx1ZXMgKz0gdmFsdWVzOworICAgfQorCisgICBzdHJ1Y3Qgc3RyaW5nX3RvX3VpbnRfbWFwICptYXA7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworLyoqCisgKiBDbGFzcyB0byBoZWxwIHBhcmNlbCBvdXQgcGllY2VzIG9mIGJhY2tpbmcgc3RvcmFnZSB0byB1bmlmb3JtcworICoKKyAqIEVhY2ggdW5pZm9ybSBwcm9jZXNzZWQgaGFzIHNvbWUgcmFuZ2Ugb2YgdGhlIFxjIGdsX2NvbnN0YW50X3ZhbHVlCisgKiBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBpdC4gIFRoZSBhc3NvY2lhdGlvbiBpcyBkb25lIGJ5IGZpbmRpbmcKKyAqIHRoZSB1bmlmb3JtIGluIHRoZSBcYyBzdHJpbmdfdG9fdWludF9tYXAgYW5kIHVzaW5nIHRoZSB2YWx1ZSBmcm9tCisgKiB0aGUgbWFwIHRvIGNvbm5lY3QgdGhhdCBzbG90IGluIHRoZSBcYyBnbF91bmlmb3JtX3N0b3JhZ2UgdGFibGUKKyAqIHdpdGggdGhlIG5leHQgYXZhaWxhYmxlIHNsb3QgaW4gdGhlIFxjIGdsX2NvbnN0YW50X3ZhbHVlIGFycmF5LgorICoKKyAqIFx3YXJuaW5nCisgKiBUaGlzIGNsYXNzIGFzc3VtZXMgdGhhdCBldmVyeSB1bmlmb3JtIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgaXMKKyAqIGFscmVhZHkgaW4gdGhlIFxjIHN0cmluZ190b191aW50X21hcC4gIEluIGFkZGl0aW9uLCBpdCBhc3N1bWVzIHRoYXQKKyAqIHRoZSBcYyBnbF91bmlmb3JtX3N0b3JhZ2UgYW5kIFxjIGdsX2NvbnN0YW50X3ZhbHVlIGFycmF5cyBhcmUgImJpZworICogZW5vdWdoLiIKKyAqLworY2xhc3MgcGFyY2VsX291dF91bmlmb3JtX3N0b3JhZ2UgOiBwdWJsaWMgcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIHBhcmNlbF9vdXRfdW5pZm9ybV9zdG9yYWdlKHN0cnVjdCBzdHJpbmdfdG9fdWludF9tYXAgKm1hcCwKKwkJCSAgICAgIHN0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgKnVuaWZvcm1zLAorCQkJICAgICAgdW5pb24gZ2xfY29uc3RhbnRfdmFsdWUgKnZhbHVlcykKKyAgICAgIDogbWFwKG1hcCksIHVuaWZvcm1zKHVuaWZvcm1zKSwgdmFsdWVzKHZhbHVlcykKKyAgIHsKKyAgIH0KKworICAgdm9pZCBzdGFydF9zaGFkZXIoZ2xfc2hhZGVyX3N0YWdlIHNoYWRlcl90eXBlKQorICAgeworICAgICAgYXNzZXJ0KHNoYWRlcl90eXBlIDwgTUVTQV9TSEFERVJfU1RBR0VTKTsKKyAgICAgIHRoaXMtPnNoYWRlcl90eXBlID0gc2hhZGVyX3R5cGU7CisKKyAgICAgIHRoaXMtPnNoYWRlcl9zYW1wbGVyc191c2VkID0gMDsKKyAgICAgIHRoaXMtPnNoYWRlcl9zaGFkb3dfc2FtcGxlcnMgPSAwOworICAgICAgdGhpcy0+bmV4dF9zYW1wbGVyID0gMDsKKyAgICAgIHRoaXMtPm5leHRfaW1hZ2UgPSAwOworICAgICAgbWVtc2V0KHRoaXMtPnRhcmdldHMsIDAsIHNpemVvZih0aGlzLT50YXJnZXRzKSk7CisgICB9CisKKyAgIHZvaWQgc2V0X2FuZF9wcm9jZXNzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJCWlyX3ZhcmlhYmxlICp2YXIpCisgICB7CisgICAgICB1Ym9fYmxvY2tfaW5kZXggPSAtMTsKKyAgICAgIGlmICh2YXItPmlzX2luX3VuaWZvcm1fYmxvY2soKSkgeworICAgICAgICAgaWYgKHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkgJiYgdmFyLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBsID0gc3RybGVuKHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUpOworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtVW5pZm9ybUJsb2NrczsgaSsrKSB7CisgICAgICAgICAgICAgICBpZiAoc3RybmNtcCh2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZy0+VW5pZm9ybUJsb2Nrc1tpXS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbCkgPT0gMAorICAgICAgICAgICAgICAgICAgICYmIHByb2ctPlVuaWZvcm1CbG9ja3NbaV0uTmFtZVtsXSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgIHVib19ibG9ja19pbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtVW5pZm9ybUJsb2NrczsgaSsrKSB7CisgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ctPlVuaWZvcm1CbG9ja3NbaV0uTmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgdWJvX2Jsb2NrX2luZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorCSAgICB9CisJIH0KKwkgYXNzZXJ0KHVib19ibG9ja19pbmRleCAhPSAtMSk7CisKKyAgICAgICAgIC8qIFVuaWZvcm0gYmxvY2tzIHRoYXQgd2VyZSBzcGVjaWZpZWQgd2l0aCBhbiBpbnN0YW5jZSBuYW1lIG11c3QgYmUKKyAgICAgICAgICAqIGhhbmRsZWQgYSBsaXR0bGUgYml0IGRpZmZlcmVudGx5LiAgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGlzIHRoZQorICAgICAgICAgICogbmFtZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgdW5pZm9ybSBibG9jayBpbnN0ZWFkIG9mIGJlaW5nIHRoZSBuYW1lCisgICAgICAgICAgKiBvZiBhIHZhcmlhYmxlIHdpdGhpbiB0aGUgYmxvY2suICBUaGVyZWZvcmUsIHNlYXJjaGluZyBmb3IgdGhlIG5hbWUKKyAgICAgICAgICAqIHdpdGhpbiB0aGUgYmxvY2sgd2lsbCBmYWlsLgorICAgICAgICAgICovCisgICAgICAgICBpZiAodmFyLT5pc19pbnRlcmZhY2VfaW5zdGFuY2UoKSkgeworICAgICAgICAgICAgdWJvX2J5dGVfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHVib19yb3dfbWFqb3IgPSBmYWxzZTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfdW5pZm9ybV9ibG9jayAqY29uc3QgYmxvY2sgPQorICAgICAgICAgICAgICAgJnByb2ctPlVuaWZvcm1CbG9ja3NbdWJvX2Jsb2NrX2luZGV4XTsKKworICAgICAgICAgICAgYXNzZXJ0KHZhci0+ZGF0YS5sb2NhdGlvbiAhPSAtMSk7CisKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZSAqY29uc3QgdWJvX3ZhciA9CisgICAgICAgICAgICAgICAmYmxvY2stPlVuaWZvcm1zW3Zhci0+ZGF0YS5sb2NhdGlvbl07CisKKyAgICAgICAgICAgIHVib19yb3dfbWFqb3IgPSB1Ym9fdmFyLT5Sb3dNYWpvcjsKKyAgICAgICAgICAgIHVib19ieXRlX29mZnNldCA9IHVib192YXItPk9mZnNldDsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkpCisgICAgICAgICAgICBwcm9jZXNzKHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJvY2Vzcyh2YXIpOworICAgICAgfSBlbHNlCisgICAgICAgICBwcm9jZXNzKHZhcik7CisgICB9CisKKyAgIGludCB1Ym9fYmxvY2tfaW5kZXg7CisgICBpbnQgdWJvX2J5dGVfb2Zmc2V0OworICAgYm9vbCB1Ym9fcm93X21ham9yOworICAgZ2xfc2hhZGVyX3N0YWdlIHNoYWRlcl90eXBlOworCitwcml2YXRlOgorICAgdm9pZCBoYW5kbGVfc2FtcGxlcnMoY29uc3QgZ2xzbF90eXBlICpiYXNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlICp1bmlmb3JtKQorICAgeworICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfc2FtcGxlcigpKSB7CisgICAgICAgICB1bmlmb3JtLT5zYW1wbGVyW3NoYWRlcl90eXBlXS5pbmRleCA9IHRoaXMtPm5leHRfc2FtcGxlcjsKKyAgICAgICAgIHVuaWZvcm0tPnNhbXBsZXJbc2hhZGVyX3R5cGVdLmFjdGl2ZSA9IHRydWU7CisKKyAgICAgICAgIC8qIEluY3JlbWVudCB0aGUgc2FtcGxlciBieSAxIGZvciBub24tYXJyYXlzIGFuZCBieSB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgKiBhcnJheSBlbGVtZW50cyBmb3IgYXJyYXlzLgorICAgICAgICAgICovCisgICAgICAgICB0aGlzLT5uZXh0X3NhbXBsZXIgKz0KKyAgICAgICAgICAgICAgIE1BWDIoMSwgdW5pZm9ybS0+YXJyYXlfZWxlbWVudHMpOworCisgICAgICAgICBjb25zdCBnbF90ZXh0dXJlX2luZGV4IHRhcmdldCA9IGJhc2VfdHlwZS0+c2FtcGxlcl9pbmRleCgpOworICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hhZG93ID0gYmFzZV90eXBlLT5zYW1wbGVyX3NoYWRvdzsKKyAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IHVuaWZvcm0tPnNhbXBsZXJbc2hhZGVyX3R5cGVdLmluZGV4OworICAgICAgICAgICAgICBpIDwgTUlOMih0aGlzLT5uZXh0X3NhbXBsZXIsIE1BWF9TQU1QTEVSUyk7CisgICAgICAgICAgICAgIGkrKykgeworICAgICAgICAgICAgdGhpcy0+dGFyZ2V0c1tpXSA9IHRhcmdldDsKKyAgICAgICAgICAgIHRoaXMtPnNoYWRlcl9zYW1wbGVyc191c2VkIHw9IDFVIDw8IGk7CisgICAgICAgICAgICB0aGlzLT5zaGFkZXJfc2hhZG93X3NhbXBsZXJzIHw9IHNoYWRvdyA8PCBpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHVuaWZvcm0tPnNhbXBsZXJbc2hhZGVyX3R5cGVdLmluZGV4ID0gfjA7CisgICAgICAgICB1bmlmb3JtLT5zYW1wbGVyW3NoYWRlcl90eXBlXS5hY3RpdmUgPSBmYWxzZTsKKyAgICAgIH0KKyAgIH0KKworICAgdm9pZCBoYW5kbGVfaW1hZ2VzKGNvbnN0IGdsc2xfdHlwZSAqYmFzZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UgKnVuaWZvcm0pCisgICB7CisgICAgICBpZiAoYmFzZV90eXBlLT5pc19pbWFnZSgpKSB7CisgICAgICAgICB1bmlmb3JtLT5pbWFnZVtzaGFkZXJfdHlwZV0uaW5kZXggPSB0aGlzLT5uZXh0X2ltYWdlOworICAgICAgICAgdW5pZm9ybS0+aW1hZ2Vbc2hhZGVyX3R5cGVdLmFjdGl2ZSA9IHRydWU7CisKKyAgICAgICAgIC8qIEluY3JlbWVudCB0aGUgaW1hZ2UgaW5kZXggYnkgMSBmb3Igbm9uLWFycmF5cyBhbmQgYnkgdGhlCisgICAgICAgICAgKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgZm9yIGFycmF5cy4KKyAgICAgICAgICAqLworICAgICAgICAgdGhpcy0+bmV4dF9pbWFnZSArPSBNQVgyKDEsIHVuaWZvcm0tPmFycmF5X2VsZW1lbnRzKTsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHVuaWZvcm0tPmltYWdlW3NoYWRlcl90eXBlXS5pbmRleCA9IH4wOworICAgICAgICAgdW5pZm9ybS0+aW1hZ2Vbc2hhZGVyX3R5cGVdLmFjdGl2ZSA9IGZhbHNlOworICAgICAgfQorICAgfQorCisgICB2aXJ0dWFsIHZvaWQgdmlzaXRfZmllbGQoY29uc3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcm93X21ham9yKQorICAgeworICAgICAgKHZvaWQpIHR5cGU7CisgICAgICAodm9pZCkgbmFtZTsKKyAgICAgICh2b2lkKSByb3dfbWFqb3I7CisgICAgICBhc3NlcnQoISJTaG91bGQgbm90IGdldCBoZXJlLiIpOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgdmlzaXRfZmllbGQoY29uc3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcm93X21ham9yLCBjb25zdCBnbHNsX3R5cGUgKnJlY29yZF90eXBlKQorICAgeworICAgICAgYXNzZXJ0KCF0eXBlLT5pc19yZWNvcmQoKSk7CisgICAgICBhc3NlcnQoISh0eXBlLT5pc19hcnJheSgpICYmIHR5cGUtPmZpZWxkcy5hcnJheS0+aXNfcmVjb3JkKCkpKTsKKyAgICAgIGFzc2VydCghdHlwZS0+aXNfaW50ZXJmYWNlKCkpOworICAgICAgYXNzZXJ0KCEodHlwZS0+aXNfYXJyYXkoKSAmJiB0eXBlLT5maWVsZHMuYXJyYXktPmlzX2ludGVyZmFjZSgpKSk7CisKKyAgICAgICh2b2lkKSByb3dfbWFqb3I7CisKKyAgICAgIHVuc2lnbmVkIGlkOworICAgICAgYm9vbCBmb3VuZCA9IHRoaXMtPm1hcC0+Z2V0KGlkLCBuYW1lKTsKKyAgICAgIGFzc2VydChmb3VuZCk7CisKKyAgICAgIGlmICghZm91bmQpCisJIHJldHVybjsKKworICAgICAgY29uc3QgZ2xzbF90eXBlICpiYXNlX3R5cGU7CisgICAgICBpZiAodHlwZS0+aXNfYXJyYXkoKSkgeworCSB0aGlzLT51bmlmb3Jtc1tpZF0uYXJyYXlfZWxlbWVudHMgPSB0eXBlLT5sZW5ndGg7CisJIGJhc2VfdHlwZSA9IHR5cGUtPmZpZWxkcy5hcnJheTsKKyAgICAgIH0gZWxzZSB7CisJIHRoaXMtPnVuaWZvcm1zW2lkXS5hcnJheV9lbGVtZW50cyA9IDA7CisJIGJhc2VfdHlwZSA9IHR5cGU7CisgICAgICB9CisKKyAgICAgIC8qIFRoaXMgYXNzaWducyB1bmlmb3JtIGluZGljZXMgdG8gc2FtcGxlciBhbmQgaW1hZ2UgdW5pZm9ybXMuICovCisgICAgICBoYW5kbGVfc2FtcGxlcnMoYmFzZV90eXBlLCAmdGhpcy0+dW5pZm9ybXNbaWRdKTsKKyAgICAgIGhhbmRsZV9pbWFnZXMoYmFzZV90eXBlLCAmdGhpcy0+dW5pZm9ybXNbaWRdKTsKKworICAgICAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBzdG9yYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVuaWZvcm0sIGl0IG1lYW5zCisgICAgICAgKiB0aGF0IGl0IHdhcyBzZXQgd2hpbGUgcHJvY2Vzc2luZyBhbiBlYXJsaWVyIHNoYWRlciBzdGFnZS4gIEZvcgorICAgICAgICogZXhhbXBsZSwgd2UgbWF5IGJlIHByb2Nlc3NpbmcgdGhlIHVuaWZvcm0gaW4gdGhlIGZyYWdtZW50IHNoYWRlciwgYnV0CisgICAgICAgKiB0aGUgdW5pZm9ybSB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgaW4gdGhlIHZlcnRleCBzaGFkZXIuCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLT51bmlmb3Jtc1tpZF0uc3RvcmFnZSAhPSBOVUxMKSB7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHRoaXMtPnVuaWZvcm1zW2lkXS5uYW1lID0gcmFsbG9jX3N0cmR1cCh0aGlzLT51bmlmb3JtcywgbmFtZSk7CisgICAgICB0aGlzLT51bmlmb3Jtc1tpZF0udHlwZSA9IGJhc2VfdHlwZTsKKyAgICAgIHRoaXMtPnVuaWZvcm1zW2lkXS5pbml0aWFsaXplZCA9IDA7CisgICAgICB0aGlzLT51bmlmb3Jtc1tpZF0ubnVtX2RyaXZlcl9zdG9yYWdlID0gMDsKKyAgICAgIHRoaXMtPnVuaWZvcm1zW2lkXS5kcml2ZXJfc3RvcmFnZSA9IE5VTEw7CisgICAgICB0aGlzLT51bmlmb3Jtc1tpZF0uc3RvcmFnZSA9IHRoaXMtPnZhbHVlczsKKyAgICAgIHRoaXMtPnVuaWZvcm1zW2lkXS5hdG9taWNfYnVmZmVyX2luZGV4ID0gLTE7CisgICAgICBpZiAodGhpcy0+dWJvX2Jsb2NrX2luZGV4ICE9IC0xKSB7CisJIHRoaXMtPnVuaWZvcm1zW2lkXS5ibG9ja19pbmRleCA9IHRoaXMtPnVib19ibG9ja19pbmRleDsKKworCSBjb25zdCB1bnNpZ25lZCBhbGlnbm1lbnQgPSByZWNvcmRfdHlwZQorCSAgICA/IHJlY29yZF90eXBlLT5zdGQxNDBfYmFzZV9hbGlnbm1lbnQodWJvX3Jvd19tYWpvcikKKwkgICAgOiB0eXBlLT5zdGQxNDBfYmFzZV9hbGlnbm1lbnQodWJvX3Jvd19tYWpvcik7CisJIHRoaXMtPnVib19ieXRlX29mZnNldCA9IGdsc2xfYWxpZ24odGhpcy0+dWJvX2J5dGVfb2Zmc2V0LCBhbGlnbm1lbnQpOworCSB0aGlzLT51bmlmb3Jtc1tpZF0ub2Zmc2V0ID0gdGhpcy0+dWJvX2J5dGVfb2Zmc2V0OworCSB0aGlzLT51Ym9fYnl0ZV9vZmZzZXQgKz0gdHlwZS0+c3RkMTQwX3NpemUodWJvX3Jvd19tYWpvcik7CisKKwkgaWYgKHR5cGUtPmlzX2FycmF5KCkpIHsKKwkgICAgdGhpcy0+dW5pZm9ybXNbaWRdLmFycmF5X3N0cmlkZSA9CisJICAgICAgIGdsc2xfYWxpZ24odHlwZS0+ZmllbGRzLmFycmF5LT5zdGQxNDBfc2l6ZSh1Ym9fcm93X21ham9yKSwgMTYpOworCSB9IGVsc2UgeworCSAgICB0aGlzLT51bmlmb3Jtc1tpZF0uYXJyYXlfc3RyaWRlID0gMDsKKwkgfQorCisJIGlmICh0eXBlLT5pc19tYXRyaXgoKSB8fAorCSAgICAgKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19tYXRyaXgoKSkpIHsKKwkgICAgdGhpcy0+dW5pZm9ybXNbaWRdLm1hdHJpeF9zdHJpZGUgPSAxNjsKKwkgICAgdGhpcy0+dW5pZm9ybXNbaWRdLnJvd19tYWpvciA9IHVib19yb3dfbWFqb3I7CisJIH0gZWxzZSB7CisJICAgIHRoaXMtPnVuaWZvcm1zW2lkXS5tYXRyaXhfc3RyaWRlID0gMDsKKwkgICAgdGhpcy0+dW5pZm9ybXNbaWRdLnJvd19tYWpvciA9IGZhbHNlOworCSB9CisgICAgICB9IGVsc2UgeworCSB0aGlzLT51bmlmb3Jtc1tpZF0uYmxvY2tfaW5kZXggPSAtMTsKKwkgdGhpcy0+dW5pZm9ybXNbaWRdLm9mZnNldCA9IC0xOworCSB0aGlzLT51bmlmb3Jtc1tpZF0uYXJyYXlfc3RyaWRlID0gLTE7CisJIHRoaXMtPnVuaWZvcm1zW2lkXS5tYXRyaXhfc3RyaWRlID0gLTE7CisJIHRoaXMtPnVuaWZvcm1zW2lkXS5yb3dfbWFqb3IgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgdGhpcy0+dmFsdWVzICs9IHZhbHVlc19mb3JfdHlwZSh0eXBlKTsKKyAgIH0KKworICAgc3RydWN0IHN0cmluZ190b191aW50X21hcCAqbWFwOworCisgICBzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlICp1bmlmb3JtczsKKyAgIHVuc2lnbmVkIG5leHRfc2FtcGxlcjsKKyAgIHVuc2lnbmVkIG5leHRfaW1hZ2U7CisKK3B1YmxpYzoKKyAgIHVuaW9uIGdsX2NvbnN0YW50X3ZhbHVlICp2YWx1ZXM7CisKKyAgIGdsX3RleHR1cmVfaW5kZXggdGFyZ2V0c1tNQVhfU0FNUExFUlNdOworCisgICAvKioKKyAgICAqIE1hc2sgb2Ygc2FtcGxlcnMgdXNlZCBieSB0aGUgY3VycmVudCBzaGFkZXIgc3RhZ2UuCisgICAgKi8KKyAgIHVuc2lnbmVkIHNoYWRlcl9zYW1wbGVyc191c2VkOworCisgICAvKioKKyAgICAqIE1hc2sgb2Ygc2FtcGxlcnMgdXNlZCBieSB0aGUgY3VycmVudCBzaGFkZXIgc3RhZ2UgZm9yIHNoYWRvd3MuCisgICAgKi8KKyAgIHVuc2lnbmVkIHNoYWRlcl9zaGFkb3dfc2FtcGxlcnM7CisKKyAgIGJvb2wgaXNWSzsKK307CisKKy8qKgorICogTWVyZ2VzIGEgdW5pZm9ybSBibG9jayBpbnRvIGFuIGFycmF5IG9mIHVuaWZvcm0gYmxvY2tzIHRoYXQgbWF5IG9yCisgKiBtYXkgbm90IGFscmVhZHkgY29udGFpbiBhIGNvcHkgb2YgaXQuCisgKgorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5ldyBibG9jayBpbiB0aGUgYXJyYXkuCisgKi8KK2ludAorbGlua19jcm9zc192YWxpZGF0ZV91bmlmb3JtX2Jsb2NrKHZvaWQgKm1lbV9jdHgsCisJCQkJICBzdHJ1Y3QgZ2xfdW5pZm9ybV9ibG9jayAqKmxpbmtlZF9ibG9ja3MsCisJCQkJICB1bnNpZ25lZCBpbnQgKm51bV9saW5rZWRfYmxvY2tzLAorCQkJCSAgc3RydWN0IGdsX3VuaWZvcm1fYmxvY2sgKm5ld19ibG9jaykKK3sKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgKm51bV9saW5rZWRfYmxvY2tzOyBpKyspIHsKKyAgICAgIHN0cnVjdCBnbF91bmlmb3JtX2Jsb2NrICpvbGRfYmxvY2sgPSAmKCpsaW5rZWRfYmxvY2tzKVtpXTsKKworICAgICAgaWYgKHN0cmNtcChvbGRfYmxvY2stPk5hbWUsIG5ld19ibG9jay0+TmFtZSkgPT0gMCkKKwkgcmV0dXJuIGxpbmtfdW5pZm9ybV9ibG9ja3NfYXJlX2NvbXBhdGlibGUob2xkX2Jsb2NrLCBuZXdfYmxvY2spCisJICAgID8gaSA6IC0xOworICAgfQorCisgICAqbGlua2VkX2Jsb2NrcyA9IHJlcmFsbG9jKG1lbV9jdHgsICpsaW5rZWRfYmxvY2tzLAorCQkJICAgICBzdHJ1Y3QgZ2xfdW5pZm9ybV9ibG9jaywKKwkJCSAgICAgKm51bV9saW5rZWRfYmxvY2tzICsgMSk7CisgICBpbnQgbGlua2VkX2Jsb2NrX2luZGV4ID0gKCpudW1fbGlua2VkX2Jsb2NrcykrKzsKKyAgIHN0cnVjdCBnbF91bmlmb3JtX2Jsb2NrICpsaW5rZWRfYmxvY2sgPSAmKCpsaW5rZWRfYmxvY2tzKVtsaW5rZWRfYmxvY2tfaW5kZXhdOworCisgICBtZW1jcHkobGlua2VkX2Jsb2NrLCBuZXdfYmxvY2ssIHNpemVvZigqbmV3X2Jsb2NrKSk7CisgICBsaW5rZWRfYmxvY2stPlVuaWZvcm1zID0gcmFsbG9jX2FycmF5KCpsaW5rZWRfYmxvY2tzLAorCQkJCQkgc3RydWN0IGdsX3VuaWZvcm1fYnVmZmVyX3ZhcmlhYmxlLAorCQkJCQkgbGlua2VkX2Jsb2NrLT5OdW1Vbmlmb3Jtcyk7CisKKyAgIG1lbWNweShsaW5rZWRfYmxvY2stPlVuaWZvcm1zLAorCSAgbmV3X2Jsb2NrLT5Vbmlmb3JtcywKKwkgIHNpemVvZigqbGlua2VkX2Jsb2NrLT5Vbmlmb3JtcykgKiBsaW5rZWRfYmxvY2stPk51bVVuaWZvcm1zKTsKKworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBsaW5rZWRfYmxvY2stPk51bVVuaWZvcm1zOyBpKyspIHsKKyAgICAgIHN0cnVjdCBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZSAqdWJvX3ZhciA9CisJICZsaW5rZWRfYmxvY2stPlVuaWZvcm1zW2ldOworCisgICAgICBpZiAodWJvX3Zhci0+TmFtZSA9PSB1Ym9fdmFyLT5JbmRleE5hbWUpIHsKKyAgICAgICAgIHVib192YXItPk5hbWUgPSByYWxsb2Nfc3RyZHVwKCpsaW5rZWRfYmxvY2tzLCB1Ym9fdmFyLT5OYW1lKTsKKyAgICAgICAgIHVib192YXItPkluZGV4TmFtZSA9IHVib192YXItPk5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAgdWJvX3Zhci0+TmFtZSA9IHJhbGxvY19zdHJkdXAoKmxpbmtlZF9ibG9ja3MsIHVib192YXItPk5hbWUpOworICAgICAgICAgdWJvX3Zhci0+SW5kZXhOYW1lID0gcmFsbG9jX3N0cmR1cCgqbGlua2VkX2Jsb2NrcywgdWJvX3Zhci0+SW5kZXhOYW1lKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIGxpbmtlZF9ibG9ja19pbmRleDsKK30KKworLyoqCisgKiBXYWxrcyB0aGUgSVIgYW5kIHVwZGF0ZSB0aGUgcmVmZXJlbmNlcyB0byB1bmlmb3JtIGJsb2NrcyBpbiB0aGUKKyAqIGlyX3ZhcmlhYmxlcyB0byBwb2ludCBhdCBsaW5rZWQgc2hhZGVyJ3MgbGlzdCAocHJldmlvdXNseSwgdGhleQorICogd291bGQgcG9pbnQgYXQgdGhlIHVuaWZvcm0gYmxvY2sgbGlzdCBpbiBvbmUgb2YgdGhlIHByZS1saW5rZWQKKyAqIHNoYWRlcnMpLgorICovCitzdGF0aWMgdm9pZAorbGlua191cGRhdGVfdW5pZm9ybV9idWZmZXJfdmFyaWFibGVzKHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcikKK3sKKyAgIGZvcmVhY2hfbGlzdChub2RlLCBzaGFkZXItPmlyKSB7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworICAgICAgaWYgKCh2YXIgPT0gTlVMTCkgfHwgIXZhci0+aXNfaW5fdW5pZm9ybV9ibG9jaygpKQorCSBjb250aW51ZTsKKworICAgICAgYXNzZXJ0KHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtKTsKKworICAgICAgaWYgKHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkpIHsKKyAgICAgICAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IDA7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgY2hhciBzZW50aW5lbCA9ICdcMCc7CisKKyAgICAgIGlmICh2YXItPnR5cGUtPmlzX3JlY29yZCgpKSB7CisgICAgICAgICBzZW50aW5lbCA9ICcuJzsKKyAgICAgIH0gZWxzZSBpZiAodmFyLT50eXBlLT5pc19hcnJheSgpCisgICAgICAgICAgICAgICAgICYmIHZhci0+dHlwZS0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKSkgeworICAgICAgICAgc2VudGluZWwgPSAnWyc7CisgICAgICB9CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGwgPSBzdHJsZW4odmFyLT5uYW1lKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaGFkZXItPk51bVVuaWZvcm1CbG9ja3M7IGkrKykgeworCSBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgc2hhZGVyLT5Vbmlmb3JtQmxvY2tzW2ldLk51bVVuaWZvcm1zOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChzZW50aW5lbCkgeworICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYmVnaW4gPSBzaGFkZXItPlVuaWZvcm1CbG9ja3NbaV0uVW5pZm9ybXNbal0uTmFtZTsKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCA9IHN0cmNocihiZWdpbiwgc2VudGluZWwpOworCisgICAgICAgICAgICAgICBpZiAoZW5kID09IE5VTEwpCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgaWYgKGwgIT0gKGVuZCAtIGJlZ2luKSkKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICBpZiAoc3RybmNtcCh2YXItPm5hbWUsIGJlZ2luLCBsKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICB2YXItPmRhdGEubG9jYXRpb24gPSBqOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodmFyLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlci0+VW5pZm9ybUJsb2Nrc1tpXS5Vbmlmb3Jtc1tqXS5OYW1lKSkgeworCSAgICAgICBmb3VuZCA9IHRydWU7CisJICAgICAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IGo7CisJICAgICAgIGJyZWFrOworCSAgICB9CisJIH0KKwkgaWYgKGZvdW5kKQorCSAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGFzc2VydChmb3VuZCk7CisgICB9Cit9CisKK3ZvaWQKK2xpbmtfYXNzaWduX3VuaWZvcm1fYmxvY2tfb2Zmc2V0cyhzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIpCit7CisgICBmb3IgKHVuc2lnbmVkIGIgPSAwOyBiIDwgc2hhZGVyLT5OdW1Vbmlmb3JtQmxvY2tzOyBiKyspIHsKKyAgICAgIHN0cnVjdCBnbF91bmlmb3JtX2Jsb2NrICpibG9jayA9ICZzaGFkZXItPlVuaWZvcm1CbG9ja3NbYl07CisKKyAgICAgIHVuc2lnbmVkIG9mZnNldCA9IDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGJsb2NrLT5OdW1Vbmlmb3JtczsgaSsrKSB7CisJIHN0cnVjdCBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZSAqdWJvX3ZhciA9ICZibG9jay0+VW5pZm9ybXNbaV07CisJIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUgPSB1Ym9fdmFyLT5UeXBlOworCisJIHVuc2lnbmVkIGFsaWdubWVudCA9IHR5cGUtPnN0ZDE0MF9iYXNlX2FsaWdubWVudCh1Ym9fdmFyLT5Sb3dNYWpvcik7CisJIHVuc2lnbmVkIHNpemUgPSB0eXBlLT5zdGQxNDBfc2l6ZSh1Ym9fdmFyLT5Sb3dNYWpvcik7CisKKwkgb2Zmc2V0ID0gZ2xzbF9hbGlnbihvZmZzZXQsIGFsaWdubWVudCk7CisJIHVib192YXItPk9mZnNldCA9IG9mZnNldDsKKwkgb2Zmc2V0ICs9IHNpemU7CisgICAgICB9CisKKyAgICAgIC8qIEZyb20gdGhlIEdMX0FSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3Qgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICAgIkZvciB1bmlmb3JtIGJsb2NrcyBsYWlkIG91dCBhY2NvcmRpbmcgdG8gW3N0ZDE0MF0gcnVsZXMsCisgICAgICAgKiAgICAgIHRoZSBtaW5pbXVtIGJ1ZmZlciBvYmplY3Qgc2l6ZSByZXR1cm5lZCBieSB0aGUKKyAgICAgICAqICAgICAgVU5JRk9STV9CTE9DS19EQVRBX1NJWkUgcXVlcnkgaXMgZGVyaXZlZCBieSB0YWtpbmcgdGhlCisgICAgICAgKiAgICAgIG9mZnNldCBvZiB0aGUgbGFzdCBiYXNpYyBtYWNoaW5lIHVuaXQgY29uc3VtZWQgYnkgdGhlCisgICAgICAgKiAgICAgIGxhc3QgdW5pZm9ybSBvZiB0aGUgdW5pZm9ybSBibG9jayAoaW5jbHVkaW5nIGFueQorICAgICAgICogICAgICBlbmQtb2YtYXJyYXkgb3IgZW5kLW9mLXN0cnVjdHVyZSBwYWRkaW5nKSwgYWRkaW5nIG9uZSwKKyAgICAgICAqICAgICAgYW5kIHJvdW5kaW5nIHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIHRoZSBiYXNlCisgICAgICAgKiAgICAgIGFsaWdubWVudCByZXF1aXJlZCBmb3IgYSB2ZWM0LiIKKyAgICAgICAqLworICAgICAgYmxvY2stPlVuaWZvcm1CdWZmZXJTaXplID0gZ2xzbF9hbGlnbihvZmZzZXQsIDE2KTsKKyAgIH0KK30KKworLyoqCisgKiBTY2FuIHRoZSBwcm9ncmFtIGZvciBpbWFnZSB1bmlmb3JtcyBhbmQgc3RvcmUgaW1hZ2UgdW5pdCBhY2Nlc3MKKyAqIGluZm9ybWF0aW9uIGludG8gdGhlIGdsX3NoYWRlciBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2xpbmtfc2V0X2ltYWdlX2FjY2Vzc19xdWFsaWZpZXJzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworICAgICAgZ2xfc2hhZGVyICpzaCA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldOworCisgICAgICBpZiAoc2ggPT0gTlVMTCkKKwkgY29udGludWU7CisKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBzaC0+aXIpIHsKKwkgaXJfdmFyaWFibGUgKnZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgICAgIGlmICh2YXIgJiYgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3VuaWZvcm0gJiYKKyAgICAgICAgICAgICB2YXItPnR5cGUtPmNvbnRhaW5zX2ltYWdlKCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGlkID0gMDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBwcm9nLT5Vbmlmb3JtSGFzaC0+Z2V0KGlkLCB2YXItPm5hbWUpOworICAgICAgICAgICAgYXNzZXJ0KGZvdW5kKTsKKyAgICAgICAgICAgICh2b2lkKSBmb3VuZDsKKyAgICAgICAgICAgIGNvbnN0IGdsX3VuaWZvcm1fc3RvcmFnZSAqc3RvcmFnZSA9ICZwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpZF07CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbmRleCA9IHN0b3JhZ2UtPmltYWdlW2ldLmluZGV4OworICAgICAgICAgICAgY29uc3QgR0xlbnVtIGFjY2VzcyA9ICh2YXItPmRhdGEuaW1hZ2UucmVhZF9vbmx5ID8gR0xfUkVBRF9PTkxZIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT5kYXRhLmltYWdlLndyaXRlX29ubHkgPyBHTF9XUklURV9PTkxZIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkVBRF9XUklURSk7CisKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBNQVgyKDEsIHN0b3JhZ2UtPmFycmF5X2VsZW1lbnRzKTsgKytqKQorICAgICAgICAgICAgICAgc2gtPkltYWdlQWNjZXNzW2luZGV4ICsgal0gPSBhY2Nlc3M7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQKK2xpbmtfYXNzaWduX3VuaWZvcm1fbG9jYXRpb25zKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHJhbGxvY19mcmVlKHByb2ctPlVuaWZvcm1TdG9yYWdlKTsKKyAgIHByb2ctPlVuaWZvcm1TdG9yYWdlID0gTlVMTDsKKyAgIHByb2ctPk51bVVzZXJVbmlmb3JtU3RvcmFnZSA9IDA7CisKKyAgIHJhbGxvY19mcmVlKHByb2ctPlVuaWZvcm1SZW1hcFRhYmxlKTsKKyAgIHByb2ctPlVuaWZvcm1SZW1hcFRhYmxlID0gTlVMTDsKKyAgIHByb2ctPk51bVVuaWZvcm1SZW1hcFRhYmxlID0gMDsKKworICAgaWYgKHByb2ctPlVuaWZvcm1IYXNoICE9IE5VTEwpIHsKKyAgICAgIHByb2ctPlVuaWZvcm1IYXNoLT5jbGVhcigpOworICAgfSBlbHNlIHsKKyAgICAgIHByb2ctPlVuaWZvcm1IYXNoID0gbmV3IHN0cmluZ190b191aW50X21hcDsKKyAgIH0KKworICAgLyogRmlyc3QgcGFzczogQ291bnQgdGhlIHVuaWZvcm0gcmVzb3VyY2VzIHVzZWQgYnkgdGhlIHVzZXItZGVmaW5lZAorICAgICogdW5pZm9ybXMuICBXaGlsZSB0aGlzIGhhcHBlbnMsIGVhY2ggYWN0aXZlIHVuaWZvcm0gd2lsbCBoYXZlIGFuIGluZGV4CisgICAgKiBhc3NpZ25lZCB0byBpdC4KKyAgICAqCisgICAgKiBOb3RlOiB0aGlzIGlzICpOT1QqIHRoZSBpbmRleCB0aGF0IGlzIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBieQorICAgICogZ2xHZXRVbmlmb3JtTG9jYXRpb24uCisgICAgKi8KKyAgIGNvdW50X3VuaWZvcm1fc2l6ZSB1bmlmb3JtX3NpemUocHJvZy0+VW5pZm9ybUhhc2gpOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaCA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldOworCisgICAgICBpZiAoc2ggPT0gTlVMTCkKKwkgY29udGludWU7CisKKyAgICAgIC8qIFVuaWZvcm1zIHRoYXQgbGFjayBhbiBpbml0aWFsaXplciBpbiB0aGUgc2hhZGVyIGNvZGUgaGF2ZSBhbiBpbml0aWFsCisgICAgICAgKiB2YWx1ZSBvZiB6ZXJvLiAgVGhpcyBpbmNsdWRlcyBzYW1wbGVyIHVuaWZvcm1zLgorICAgICAgICoKKyAgICAgICAqIFBhZ2UgMjQgKHBhZ2UgMzAgb2YgdGhlIFBERikgb2YgdGhlIEdMU0wgMS4yMCBzcGVjIHNheXM6CisgICAgICAgKgorICAgICAgICogICAgICJUaGUgbGluayB0aW1lIGluaXRpYWwgdmFsdWUgaXMgZWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUncworICAgICAgICogICAgIGluaXRpYWxpemVyLCBpZiBwcmVzZW50LCBvciAwIGlmIG5vIGluaXRpYWxpemVyIGlzIHByZXNlbnQuIFNhbXBsZXIKKyAgICAgICAqICAgICB0eXBlcyBjYW5ub3QgaGF2ZSBpbml0aWFsaXplcnMuIgorICAgICAgICovCisgICAgICBtZW1zZXQoc2gtPlNhbXBsZXJVbml0cywgMCwgc2l6ZW9mKHNoLT5TYW1wbGVyVW5pdHMpKTsKKyAgICAgIG1lbXNldChzaC0+SW1hZ2VVbml0cywgMCwgc2l6ZW9mKHNoLT5JbWFnZVVuaXRzKSk7CisKKyAgICAgIGxpbmtfdXBkYXRlX3VuaWZvcm1fYnVmZmVyX3ZhcmlhYmxlcyhzaCk7CisKKyAgICAgIC8qIFJlc2V0IHZhcmlvdXMgcGVyLXNoYWRlciB0YXJnZXQgY291bnRzLgorICAgICAgICovCisgICAgICB1bmlmb3JtX3NpemUuc3RhcnRfc2hhZGVyKCk7CisKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBzaC0+aXIpIHsKKwkgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKwkgaWYgKCh2YXIgPT0gTlVMTCkgfHwgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl91bmlmb3JtKSkKKwkgICAgY29udGludWU7CisKKwkgLyogRklOSVNITUU6IFVwZGF0ZSBjb2RlIHRvIHByb2Nlc3MgYnVpbHQtaW4gdW5pZm9ybXMhCisJICAqLworCSBpZiAoc3RybmNtcCgiZ2xfIiwgdmFyLT5uYW1lLCAzKSA9PSAwKSB7CisJICAgIHVuaWZvcm1fc2l6ZS5udW1fc2hhZGVyX3VuaWZvcm1fY29tcG9uZW50cyArPQorCSAgICAgICB2YXItPnR5cGUtPmNvbXBvbmVudF9zbG90cygpOworCSAgICBjb250aW51ZTsKKwkgfQorCisJIHVuaWZvcm1fc2l6ZS5wcm9jZXNzKHZhcik7CisgICAgICB9CisKKyAgICAgIHNoLT5udW1fc2FtcGxlcnMgPSB1bmlmb3JtX3NpemUubnVtX3NoYWRlcl9zYW1wbGVyczsKKyAgICAgIHNoLT5OdW1JbWFnZXMgPSB1bmlmb3JtX3NpemUubnVtX3NoYWRlcl9pbWFnZXM7CisgICAgICBzaC0+bnVtX3VuaWZvcm1fY29tcG9uZW50cyA9IHVuaWZvcm1fc2l6ZS5udW1fc2hhZGVyX3VuaWZvcm1fY29tcG9uZW50czsKKworICAgICAgc2gtPm51bV9jb21iaW5lZF91bmlmb3JtX2NvbXBvbmVudHMgPSBzaC0+bnVtX3VuaWZvcm1fY29tcG9uZW50czsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaC0+TnVtVW5pZm9ybUJsb2NrczsgaSsrKSB7CisJIHNoLT5udW1fY29tYmluZWRfdW5pZm9ybV9jb21wb25lbnRzICs9CisJICAgIHNoLT5Vbmlmb3JtQmxvY2tzW2ldLlVuaWZvcm1CdWZmZXJTaXplIC8gNDsKKyAgICAgIH0KKyAgIH0KKworICAgY29uc3QgdW5zaWduZWQgbnVtX3VzZXJfdW5pZm9ybXMgPSB1bmlmb3JtX3NpemUubnVtX2FjdGl2ZV91bmlmb3JtczsKKyAgIGNvbnN0IHVuc2lnbmVkIG51bV9kYXRhX3Nsb3RzID0gdW5pZm9ybV9zaXplLm51bV92YWx1ZXM7CisKKyAgIC8qIE9uIHRoZSBvdXRzaWRlIGNoYW5jZSB0aGF0IHRoZXJlIHdlcmUgbm8gdW5pZm9ybXMsIGJhaWwgb3V0LgorICAgICovCisgICBpZiAobnVtX3VzZXJfdW5pZm9ybXMgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgc3RydWN0IGdsX3VuaWZvcm1fc3RvcmFnZSAqdW5pZm9ybXMgPQorICAgICAgcnphbGxvY19hcnJheShwcm9nLCBzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlLCBudW1fdXNlcl91bmlmb3Jtcyk7CisgICB1bmlvbiBnbF9jb25zdGFudF92YWx1ZSAqZGF0YSA9CisgICAgICByemFsbG9jX2FycmF5KHVuaWZvcm1zLCB1bmlvbiBnbF9jb25zdGFudF92YWx1ZSwgbnVtX2RhdGFfc2xvdHMpOworI2lmbmRlZiBOREVCVUcKKyAgIHVuaW9uIGdsX2NvbnN0YW50X3ZhbHVlICpkYXRhX2VuZCA9ICZkYXRhW251bV9kYXRhX3Nsb3RzXTsKKyNlbmRpZgorCisgICBwYXJjZWxfb3V0X3VuaWZvcm1fc3RvcmFnZSBwYXJjZWwocHJvZy0+VW5pZm9ybUhhc2gsIHVuaWZvcm1zLCBkYXRhKTsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0gPT0gTlVMTCkKKwkgY29udGludWU7CisKKyAgICAgIHBhcmNlbC5zdGFydF9zaGFkZXIoKGdsX3NoYWRlcl9zdGFnZSlpKTsKKworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsIHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldLT5pcikgeworCSBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworCSBpZiAoKHZhciA9PSBOVUxMKSB8fCAodmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3VuaWZvcm0pKQorCSAgICBjb250aW51ZTsKKworCSAvKiBGSU5JU0hNRTogVXBkYXRlIGNvZGUgdG8gcHJvY2VzcyBidWlsdC1pbiB1bmlmb3JtcyEKKwkgICovCisJIGlmIChzdHJuY21wKCJnbF8iLCB2YXItPm5hbWUsIDMpID09IDApCisJICAgIGNvbnRpbnVlOworCisJIHBhcmNlbC5zZXRfYW5kX3Byb2Nlc3MocHJvZywgdmFyKTsKKyAgICAgIH0KKworICAgICAgcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0tPmFjdGl2ZV9zYW1wbGVycyA9IHBhcmNlbC5zaGFkZXJfc2FtcGxlcnNfdXNlZDsKKyAgICAgIHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldLT5zaGFkb3dfc2FtcGxlcnMgPSBwYXJjZWwuc2hhZGVyX3NoYWRvd19zYW1wbGVyczsKKworICAgICAgU1RBVElDX0FTU0VSVChzaXplb2YocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0tPlNhbXBsZXJUYXJnZXRzKSA9PSBzaXplb2YocGFyY2VsLnRhcmdldHMpKTsKKyAgICAgIG1lbWNweShwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+U2FtcGxlclRhcmdldHMsIHBhcmNlbC50YXJnZXRzLAorICAgICAgICAgICAgIHNpemVvZihwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+U2FtcGxlclRhcmdldHMpKTsKKyAgIH0KKworICAgLyogQnVpbGQgdGhlIHVuaWZvcm0gcmVtYXAgdGFibGUgdGhhdCBpcyB1c2VkIHRvIHNldC9nZXQgdW5pZm9ybSBsb2NhdGlvbnMgKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fdXNlcl91bmlmb3JtczsgaSsrKSB7CisKKyAgICAgIC8qIGhvdyBtYW55IG5ldyBlbnRyaWVzIGZvciB0aGlzIHVuaWZvcm0/ICovCisgICAgICBjb25zdCB1bnNpZ25lZCBlbnRyaWVzID0gTUFYMigxLCB1bmlmb3Jtc1tpXS5hcnJheV9lbGVtZW50cyk7CisKKyAgICAgIC8qIHJlc2l6ZSByZW1hcCB0YWJsZSB0byBmaXQgbmV3IGVudHJpZXMgKi8KKyAgICAgIHByb2ctPlVuaWZvcm1SZW1hcFRhYmxlID0KKyAgICAgICAgIHJlcmFsbG9jKHByb2csCisgICAgICAgICAgICAgICAgICBwcm9nLT5Vbmlmb3JtUmVtYXBUYWJsZSwKKyAgICAgICAgICAgICAgICAgIGdsX3VuaWZvcm1fc3RvcmFnZSAqLAorICAgICAgICAgICAgICAgICAgcHJvZy0+TnVtVW5pZm9ybVJlbWFwVGFibGUgKyBlbnRyaWVzKTsKKworICAgICAgLyogc2V0IHBvaW50ZXJzIGZvciB0aGlzIHVuaWZvcm0gKi8KKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBlbnRyaWVzOyBqKyspCisgICAgICAgICBwcm9nLT5Vbmlmb3JtUmVtYXBUYWJsZVtwcm9nLT5OdW1Vbmlmb3JtUmVtYXBUYWJsZStqXSA9ICZ1bmlmb3Jtc1tpXTsKKworICAgICAgLyogc2V0IHRoZSBiYXNlIGxvY2F0aW9uIGluIHJlbWFwIHRhYmxlIGZvciB0aGUgdW5pZm9ybSAqLworICAgICAgdW5pZm9ybXNbaV0ucmVtYXBfbG9jYXRpb24gPSBwcm9nLT5OdW1Vbmlmb3JtUmVtYXBUYWJsZTsKKworICAgICAgcHJvZy0+TnVtVW5pZm9ybVJlbWFwVGFibGUgKz0gZW50cmllczsKKyAgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fdXNlcl91bmlmb3JtczsgaSsrKSB7CisgICAgICBhc3NlcnQodW5pZm9ybXNbaV0uc3RvcmFnZSAhPSBOVUxMKTsKKyAgIH0KKworICAgYXNzZXJ0KHBhcmNlbC52YWx1ZXMgPT0gZGF0YV9lbmQpOworI2VuZGlmCisKKyAgIHByb2ctPk51bVVzZXJVbmlmb3JtU3RvcmFnZSA9IG51bV91c2VyX3VuaWZvcm1zOworICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2UgPSB1bmlmb3JtczsKKworICAgbGlua19zZXRfaW1hZ2VfYWNjZXNzX3F1YWxpZmllcnMocHJvZyk7CisgICBsaW5rX3NldF91bmlmb3JtX2luaXRpYWxpemVycyhwcm9nKTsKKworICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX3ZhcnlpbmdzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua192YXJ5aW5ncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0MzA0NQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua192YXJ5aW5ncy5jcHAKQEAgLTAsMCArMSwxNTMxIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsaW5rX3ZhcnlpbmdzLmNwcAorICoKKyAqIExpbmtlciBmdW5jdGlvbnMgcmVsYXRlZCBzcGVjaWZpY2FsbHkgdG8gbGlua2luZyB2YXJ5aW5ncyBiZXR3ZWVuIHNoYWRlcgorICogc3RhZ2VzLgorICovCisKKworI2luY2x1ZGUgImljZC11dGlscy5oIiAvLyBMdW5hckc6IEFERAorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAiZ2xzbF9zeW1ib2xfdGFibGUuaCIKKyNpbmNsdWRlICJnbHNsX3BhcnNlcl9leHRyYXMuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJsaW5rZXIuaCIKKyNpbmNsdWRlICJsaW5rX3ZhcnlpbmdzLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJwcm9ncmFtL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJwcm9ncmFtLmgiCisKKworLyoqCisgKiBWYWxpZGF0ZSB0aGUgdHlwZXMgYW5kIHF1YWxpZmllcnMgb2YgYW4gb3V0cHV0IGZyb20gb25lIHN0YWdlIGFnYWluc3QgdGhlCisgKiBtYXRjaGluZyBpbnB1dCB0byBhbm90aGVyIHN0YWdlLgorICovCitzdGF0aWMgdm9pZAorY3Jvc3NfdmFsaWRhdGVfdHlwZXNfYW5kX3F1YWxpZmllcnMoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXJfdmFyaWFibGUgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXJfdmFyaWFibGUgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlcl9zdGFnZSBjb25zdW1lcl9zdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlcl9zdGFnZSBwcm9kdWNlcl9zdGFnZSkKK3sKKyAgIC8qIENoZWNrIHRoYXQgdGhlIHR5cGVzIG1hdGNoIGJldHdlZW4gc3RhZ2VzLgorICAgICovCisgICBjb25zdCBnbHNsX3R5cGUgKnR5cGVfdG9fbWF0Y2ggPSBpbnB1dC0+dHlwZTsKKyAgIGlmIChjb25zdW1lcl9zdGFnZSA9PSBNRVNBX1NIQURFUl9HRU9NRVRSWSkgeworICAgICAgYXNzZXJ0KHR5cGVfdG9fbWF0Y2gtPmlzX2FycmF5KCkpOyAvKiBFbmZvcmNlZCBieSBhc3RfdG9faGlyICovCisgICAgICB0eXBlX3RvX21hdGNoID0gdHlwZV90b19tYXRjaC0+ZWxlbWVudF90eXBlKCk7CisgICB9CisgICBpZiAodHlwZV90b19tYXRjaCAhPSBvdXRwdXQtPnR5cGUpIHsKKyAgICAgIC8qIFRoZXJlIGlzIGEgYml0IG9mIGEgc3BlY2lhbCBjYXNlIGZvciBnbF9UZXhDb29yZC4gIFRoaXMKKyAgICAgICAqIGJ1aWx0LWluIGlzIHVuc2l6ZWQgYnkgZGVmYXVsdC4gIEFwcGxpY2F0aW9ucyB0aGF0IHZhcmlhYmxlCisgICAgICAgKiBhY2Nlc3MgaXQgbXVzdCByZWRlY2xhcmUgaXQgd2l0aCBhIHNpemUuICBUaGVyZSBpcyBzb21lCisgICAgICAgKiBsYW5ndWFnZSBpbiB0aGUgR0xTTCBzcGVjIHRoYXQgaW1wbGllcyB0aGUgZnJhZ21lbnQgc2hhZGVyCisgICAgICAgKiBhbmQgdmVydGV4IHNoYWRlciBkbyBub3QgaGF2ZSB0byBhZ3JlZSBvbiB0aGlzIHNpemUuICBPdGhlcgorICAgICAgICogZHJpdmVyIGJlaGF2ZSB0aGlzIHdheSwgYW5kIG9uZSBvciB0d28gYXBwbGljYXRpb25zIHNlZW0gdG8KKyAgICAgICAqIHJlbHkgb24gaXQuCisgICAgICAgKgorICAgICAgICogTmVpdGhlciBkZWNsYXJhdGlvbiBuZWVkcyB0byBiZSBtb2RpZmllZCBoZXJlIGJlY2F1c2UgdGhlIGFycmF5CisgICAgICAgKiBzaXplcyBhcmUgZml4ZWQgbGF0ZXIgd2hlbiB1cGRhdGVfYXJyYXlfc2l6ZXMgaXMgY2FsbGVkLgorICAgICAgICoKKyAgICAgICAqIEZyb20gcGFnZSA0OCAocGFnZSA1NCBvZiB0aGUgUERGKSBvZiB0aGUgR0xTTCAxLjEwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgICJVbmxpa2UgdXNlci1kZWZpbmVkIHZhcnlpbmcgdmFyaWFibGVzLCB0aGUgYnVpbHQtaW4KKyAgICAgICAqICAgICB2YXJ5aW5nIHZhcmlhYmxlcyBkb24ndCBoYXZlIGEgc3RyaWN0IG9uZS10by1vbmUKKyAgICAgICAqICAgICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZSB2ZXJ0ZXggbGFuZ3VhZ2UgYW5kIHRoZQorICAgICAgICogICAgIGZyYWdtZW50IGxhbmd1YWdlLiIKKyAgICAgICAqLworICAgICAgaWYgKCFvdXRwdXQtPnR5cGUtPmlzX2FycmF5KCkKKyAgICAgICAgICB8fCAoc3RybmNtcCgiZ2xfIiwgb3V0cHV0LT5uYW1lLCAzKSAhPSAwKSkgeworICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csCisgICAgICAgICAgICAgICAgICAgICAgIiVzIHNoYWRlciBvdXRwdXQgYCVzJyBkZWNsYXJlZCBhcyB0eXBlIGAlcycsICIKKyAgICAgICAgICAgICAgICAgICAgICAiYnV0ICVzIHNoYWRlciBpbnB1dCBkZWNsYXJlZCBhcyB0eXBlIGAlcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhwcm9kdWNlcl9zdGFnZSksCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+dHlwZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKGNvbnN1bWVyX3N0YWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZS0+bmFtZSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIC8qIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBxdWFsaWZpZXJzIG1hdGNoIGJldHdlZW4gc3RhZ2VzLgorICAgICovCisgICBpZiAoaW5wdXQtPmRhdGEuY2VudHJvaWQgIT0gb3V0cHV0LT5kYXRhLmNlbnRyb2lkKSB7CisgICAgICBsaW5rZXJfZXJyb3IocHJvZywKKyAgICAgICAgICAgICAgICAgICAiJXMgc2hhZGVyIG91dHB1dCBgJXMnICVzIGNlbnRyb2lkIHF1YWxpZmllciwgIgorICAgICAgICAgICAgICAgICAgICJidXQgJXMgc2hhZGVyIGlucHV0ICVzIGNlbnRyb2lkIHF1YWxpZmllclxuIiwKKyAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKHByb2R1Y2VyX3N0YWdlKSwKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgKG91dHB1dC0+ZGF0YS5jZW50cm9pZCkgPyAiaGFzIiA6ICJsYWNrcyIsCisgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhjb25zdW1lcl9zdGFnZSksCisgICAgICAgICAgICAgICAgICAgKGlucHV0LT5kYXRhLmNlbnRyb2lkKSA/ICJoYXMiIDogImxhY2tzIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChpbnB1dC0+ZGF0YS5zYW1wbGUgIT0gb3V0cHV0LT5kYXRhLnNhbXBsZSkgeworICAgICAgbGlua2VyX2Vycm9yKHByb2csCisgICAgICAgICAgICAgICAgICAgIiVzIHNoYWRlciBvdXRwdXQgYCVzJyAlcyBzYW1wbGUgcXVhbGlmaWVyLCAiCisgICAgICAgICAgICAgICAgICAgImJ1dCAlcyBzaGFkZXIgaW5wdXQgJXMgc2FtcGxlIHF1YWxpZmllclxuIiwKKyAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKHByb2R1Y2VyX3N0YWdlKSwKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgKG91dHB1dC0+ZGF0YS5zYW1wbGUpID8gImhhcyIgOiAibGFja3MiLAorICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoY29uc3VtZXJfc3RhZ2UpLAorICAgICAgICAgICAgICAgICAgIChpbnB1dC0+ZGF0YS5zYW1wbGUpID8gImhhcyIgOiAibGFja3MiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYgKGlucHV0LT5kYXRhLmludmFyaWFudCAhPSBvdXRwdXQtPmRhdGEuaW52YXJpYW50KSB7CisgICAgICBsaW5rZXJfZXJyb3IocHJvZywKKyAgICAgICAgICAgICAgICAgICAiJXMgc2hhZGVyIG91dHB1dCBgJXMnICVzIGludmFyaWFudCBxdWFsaWZpZXIsICIKKyAgICAgICAgICAgICAgICAgICAiYnV0ICVzIHNoYWRlciBpbnB1dCAlcyBpbnZhcmlhbnQgcXVhbGlmaWVyXG4iLAorICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcocHJvZHVjZXJfc3RhZ2UpLAorICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAob3V0cHV0LT5kYXRhLmludmFyaWFudCkgPyAiaGFzIiA6ICJsYWNrcyIsCisgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhjb25zdW1lcl9zdGFnZSksCisgICAgICAgICAgICAgICAgICAgKGlucHV0LT5kYXRhLmludmFyaWFudCkgPyAiaGFzIiA6ICJsYWNrcyIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoaW5wdXQtPmRhdGEuaW50ZXJwb2xhdGlvbiAhPSBvdXRwdXQtPmRhdGEuaW50ZXJwb2xhdGlvbikgeworICAgICAgbGlua2VyX2Vycm9yKHByb2csCisgICAgICAgICAgICAgICAgICAgIiVzIHNoYWRlciBvdXRwdXQgYCVzJyBzcGVjaWZpZXMgJXMgIgorICAgICAgICAgICAgICAgICAgICJpbnRlcnBvbGF0aW9uIHF1YWxpZmllciwgIgorICAgICAgICAgICAgICAgICAgICJidXQgJXMgc2hhZGVyIGlucHV0IHNwZWNpZmllcyAlcyAiCisgICAgICAgICAgICAgICAgICAgImludGVycG9sYXRpb24gcXVhbGlmaWVyXG4iLAorICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcocHJvZHVjZXJfc3RhZ2UpLAorICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uX3N0cmluZyhvdXRwdXQtPmRhdGEuaW50ZXJwb2xhdGlvbiksCisgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhjb25zdW1lcl9zdGFnZSksCisgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbl9zdHJpbmcoaW5wdXQtPmRhdGEuaW50ZXJwb2xhdGlvbikpOworICAgICAgcmV0dXJuOworICAgfQorfQorCisvKioKKyAqIFZhbGlkYXRlIGZyb250IGFuZCBiYWNrIGNvbG9yIG91dHB1dHMgYWdhaW5zdCBzaW5nbGUgY29sb3IgaW5wdXQKKyAqLworc3RhdGljIHZvaWQKK2Nyb3NzX3ZhbGlkYXRlX2Zyb250X2FuZF9iYWNrX2NvbG9yKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpmcm9udF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpiYWNrX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfc2hhZGVyX3N0YWdlIGNvbnN1bWVyX3N0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfc2hhZGVyX3N0YWdlIHByb2R1Y2VyX3N0YWdlKQoreworICAgaWYgKGZyb250X2NvbG9yICE9IE5VTEwgJiYgZnJvbnRfY29sb3ItPmRhdGEuYXNzaWduZWQpCisgICAgICBjcm9zc192YWxpZGF0ZV90eXBlc19hbmRfcXVhbGlmaWVycyhwcm9nLCBpbnB1dCwgZnJvbnRfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9zdGFnZSwgcHJvZHVjZXJfc3RhZ2UpOworCisgICBpZiAoYmFja19jb2xvciAhPSBOVUxMICYmIGJhY2tfY29sb3ItPmRhdGEuYXNzaWduZWQpCisgICAgICBjcm9zc192YWxpZGF0ZV90eXBlc19hbmRfcXVhbGlmaWVycyhwcm9nLCBpbnB1dCwgYmFja19jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX3N0YWdlLCBwcm9kdWNlcl9zdGFnZSk7Cit9CisKKy8qKgorICogVmFsaWRhdGUgdGhhdCBvdXRwdXRzIGZyb20gb25lIHN0YWdlIG1hdGNoIGlucHV0cyBvZiBhbm90aGVyCisgKi8KK3ZvaWQKK2Nyb3NzX3ZhbGlkYXRlX291dHB1dHNfdG9faW5wdXRzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJCQkgZ2xfc2hhZGVyICpwcm9kdWNlciwgZ2xfc2hhZGVyICpjb25zdW1lcikKK3sKKyAgIGdsc2xfc3ltYm9sX3RhYmxlIHBhcmFtZXRlcnM7CisgICBpcl92YXJpYWJsZSAqZXhwbGljaXRfbG9jYXRpb25zW01BWF9WQVJZSU5HXSA9IHsgTlVMTCwgfTsKKworICAgLyogRmluZCBhbGwgc2hhZGVyIG91dHB1dHMgaW4gdGhlICJwcm9kdWNlciIgc3RhZ2UuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCBwcm9kdWNlci0+aXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAoKHZhciA9PSBOVUxMKSB8fCAodmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9vdXQpKQorCSBjb250aW51ZTsKKworICAgICAgaWYgKCF2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24KKyAgICAgICAgICB8fCB2YXItPmRhdGEubG9jYXRpb24gPCBWQVJZSU5HX1NMT1RfVkFSMCkKKyAgICAgICAgIHBhcmFtZXRlcnMuYWRkX3ZhcmlhYmxlKHZhcik7CisgICAgICBlbHNlIHsKKyAgICAgICAgIC8qIFVzZXItZGVmaW5lZCB2YXJ5aW5ncyB3aXRoIGV4cGxpY2l0IGxvY2F0aW9ucyBhcmUgaGFuZGxlZAorICAgICAgICAgICogZGlmZmVyZW50bHkgYmVjYXVzZSB0aGV5IGRvIG5vdCBuZWVkIHRvIGhhdmUgbWF0Y2hpbmcgbmFtZXMuCisgICAgICAgICAgKi8KKyAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGlkeCA9IHZhci0+ZGF0YS5sb2NhdGlvbiAtIFZBUllJTkdfU0xPVF9WQVIwOworCisgICAgICAgICBpZiAoZXhwbGljaXRfbG9jYXRpb25zW2lkeF0gIT0gTlVMTCkgeworICAgICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHNoYWRlciBoYXMgbXVsdGlwbGUgb3V0cHV0cyBleHBsaWNpdGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzaWduZWQgdG8gbG9jYXRpb24gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhwcm9kdWNlci0+U3RhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisKKyAgICAgICAgIGV4cGxpY2l0X2xvY2F0aW9uc1tpZHhdID0gdmFyOworICAgICAgfQorICAgfQorCisKKyAgIC8qIEZpbmQgYWxsIHNoYWRlciBpbnB1dHMgaW4gdGhlICJjb25zdW1lciIgc3RhZ2UuICBBbnkgdmFyaWFibGVzIHRoYXQgaGF2ZQorICAgICogbWF0Y2hpbmcgb3V0cHV0cyBhbHJlYWR5IGluIHRoZSBzeW1ib2wgdGFibGUgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYW5kCisgICAgKiBxdWFsaWZpZXJzLgorICAgICoKKyAgICAqIEV4Y2VwdGlvbjogaWYgdGhlIGNvbnN1bWVyIGlzIHRoZSBnZW9tZXRyeSBzaGFkZXIsIHRoZW4gdGhlIGlucHV0cworICAgICogc2hvdWxkIGJlIGFycmF5cyBhbmQgdGhlIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlCisgICAgKiBvZiB0aGUgY29ycmVzcG9uZGluZyBwcm9kdWNlciBvdXRwdXQuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCBjb25zdW1lci0+aXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCBpbnB1dCA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICgoaW5wdXQgPT0gTlVMTCkgfHwgKGlucHV0LT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9pbikpCisJIGNvbnRpbnVlOworCisgICAgICBpZiAoc3RyY21wKGlucHV0LT5uYW1lLCAiZ2xfQ29sb3IiKSA9PSAwICYmIGlucHV0LT5kYXRhLnVzZWQpIHsKKyAgICAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpjb25zdCBmcm9udF9jb2xvciA9CisgICAgICAgICAgICBwYXJhbWV0ZXJzLmdldF92YXJpYWJsZSgiZ2xfRnJvbnRDb2xvciIpOworCisgICAgICAgICBjb25zdCBpcl92YXJpYWJsZSAqY29uc3QgYmFja19jb2xvciA9CisgICAgICAgICAgICBwYXJhbWV0ZXJzLmdldF92YXJpYWJsZSgiZ2xfQmFja0NvbG9yIik7CisKKyAgICAgICAgIGNyb3NzX3ZhbGlkYXRlX2Zyb250X2FuZF9iYWNrX2NvbG9yKHByb2csIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRfY29sb3IsIGJhY2tfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lci0+U3RhZ2UsIHByb2R1Y2VyLT5TdGFnZSk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChpbnB1dC0+bmFtZSwgImdsX1NlY29uZGFyeUNvbG9yIikgPT0gMCAmJiBpbnB1dC0+ZGF0YS51c2VkKSB7CisgICAgICAgICBjb25zdCBpcl92YXJpYWJsZSAqY29uc3QgZnJvbnRfY29sb3IgPQorICAgICAgICAgICAgcGFyYW1ldGVycy5nZXRfdmFyaWFibGUoImdsX0Zyb250U2Vjb25kYXJ5Q29sb3IiKTsKKworICAgICAgICAgY29uc3QgaXJfdmFyaWFibGUgKmNvbnN0IGJhY2tfY29sb3IgPQorICAgICAgICAgICAgcGFyYW1ldGVycy5nZXRfdmFyaWFibGUoImdsX0JhY2tTZWNvbmRhcnlDb2xvciIpOworCisgICAgICAgICBjcm9zc192YWxpZGF0ZV9mcm9udF9hbmRfYmFja19jb2xvcihwcm9nLCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250X2NvbG9yLCBiYWNrX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXItPlN0YWdlLCBwcm9kdWNlci0+U3RhZ2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIFRoZSBydWxlcyBmb3IgY29ubmVjdGluZyBpbnB1dHMgYW5kIG91dHB1dHMgY2hhbmdlIGluIHRoZSBwcmVzZW5jZQorICAgICAgICAgICogb2YgZXhwbGljaXQgbG9jYXRpb25zLiAgSW4gdGhpcyBjYXNlLCB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCB0aGUKKyAgICAgICAgICAqIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMuICBJbnN0ZWFkLCB3ZSBjYXJlIG9ubHkgYWJvdXQgdGhlCisgICAgICAgICAgKiBleHBsaWNpdGx5IGFzc2lnbmVkIGxvY2F0aW9uLgorICAgICAgICAgICovCisgICAgICAgICBpcl92YXJpYWJsZSAqb3V0cHV0ID0gTlVMTDsKKyAgICAgICAgIGlmIChpbnB1dC0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbgorICAgICAgICAgICAgICYmIGlucHV0LT5kYXRhLmxvY2F0aW9uID49IFZBUllJTkdfU0xPVF9WQVIwKSB7CisgICAgICAgICAgICBvdXRwdXQgPSBleHBsaWNpdF9sb2NhdGlvbnNbaW5wdXQtPmRhdGEubG9jYXRpb24gLSBWQVJZSU5HX1NMT1RfVkFSMF07CisKKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHNoYWRlciBpbnB1dCBgJXMnIHdpdGggZXhwbGljaXQgbG9jYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgbm8gbWF0Y2hpbmcgb3V0cHV0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoY29uc3VtZXItPlN0YWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0cHV0ID0gcGFyYW1ldGVycy5nZXRfdmFyaWFibGUoaW5wdXQtPm5hbWUpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAob3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNyb3NzX3ZhbGlkYXRlX3R5cGVzX2FuZF9xdWFsaWZpZXJzKHByb2csIGlucHV0LCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lci0+U3RhZ2UsIHByb2R1Y2VyLT5TdGFnZSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKworLyoqCisgKiBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGJhc2VkIG9uIGEgc3RyaW5nIHRoYXQgd2FzIHBhc3NlZCB0bworICogZ2xUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzLgorICoKKyAqIElmIHRoZSBpbnB1dCBpcyBtYWwtZm9ybWVkLCB0aGlzIGNhbGwgc3RpbGwgc3VjY2VlZHMsIGJ1dCBpdCBzZXRzCisgKiB0aGlzLT52YXJfbmFtZSB0byBhIG1hbC1mb3JtZWQgaW5wdXQsIHNvIHRmZWVkYmFja19kZWNsOjpmaW5kX291dHB1dF92YXIoKQorICogd2lsbCBmYWlsIHRvIGZpbmQgYW55IG1hdGNoaW5nIHZhcmlhYmxlLgorICovCit2b2lkCit0ZmVlZGJhY2tfZGVjbDo6aW5pdChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCB2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5wdXQpCit7CisgICAvKiBXZSBkb24ndCBoYXZlIHRvIGJlIHBlZGFudGljIGFib3V0IHdoYXQgaXMgYSB2YWxpZCBHTFNMIHZhcmlhYmxlIG5hbWUsCisgICAgKiBiZWNhdXNlIGFueSB2YXJpYWJsZSB3aXRoIGFuIGludmFsaWQgbmFtZSBjYW4ndCBleGlzdCBpbiB0aGUgSVIgYW55d2F5LgorICAgICovCisKKyAgIHRoaXMtPmxvY2F0aW9uID0gLTE7CisgICB0aGlzLT5vcmlnX25hbWUgPSBpbnB1dDsKKyAgIHRoaXMtPmlzX2NsaXBfZGlzdGFuY2VfbWVzYSA9IGZhbHNlOworICAgdGhpcy0+c2tpcF9jb21wb25lbnRzID0gMDsKKyAgIHRoaXMtPm5leHRfYnVmZmVyX3NlcGFyYXRvciA9IGZhbHNlOworICAgdGhpcy0+bWF0Y2hlZF9jYW5kaWRhdGUgPSBOVUxMOworCisgICBpZiAoY3R4LT5FeHRlbnNpb25zLkFSQl90cmFuc2Zvcm1fZmVlZGJhY2szKSB7CisgICAgICAvKiBQYXJzZSBnbF9OZXh0QnVmZmVyLiAqLworICAgICAgaWYgKHN0cmNtcChpbnB1dCwgImdsX05leHRCdWZmZXIiKSA9PSAwKSB7CisgICAgICAgICB0aGlzLT5uZXh0X2J1ZmZlcl9zZXBhcmF0b3IgPSB0cnVlOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvKiBQYXJzZSBnbF9Ta2lwQ29tcG9uZW50cy4gKi8KKyAgICAgIGlmIChzdHJjbXAoaW5wdXQsICJnbF9Ta2lwQ29tcG9uZW50czEiKSA9PSAwKQorICAgICAgICAgdGhpcy0+c2tpcF9jb21wb25lbnRzID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChpbnB1dCwgImdsX1NraXBDb21wb25lbnRzMiIpID09IDApCisgICAgICAgICB0aGlzLT5za2lwX2NvbXBvbmVudHMgPSAyOworICAgICAgZWxzZSBpZiAoc3RyY21wKGlucHV0LCAiZ2xfU2tpcENvbXBvbmVudHMzIikgPT0gMCkKKyAgICAgICAgIHRoaXMtPnNraXBfY29tcG9uZW50cyA9IDM7CisgICAgICBlbHNlIGlmIChzdHJjbXAoaW5wdXQsICJnbF9Ta2lwQ29tcG9uZW50czQiKSA9PSAwKQorICAgICAgICAgdGhpcy0+c2tpcF9jb21wb25lbnRzID0gNDsKKworICAgICAgaWYgKHRoaXMtPnNraXBfY29tcG9uZW50cykKKyAgICAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogUGFyc2UgYSBkZWNsYXJhdGlvbi4gKi8KKyAgIGNvbnN0IGNoYXIgKmJhc2VfbmFtZV9lbmQ7CisgICBsb25nIHN1YnNjcmlwdCA9IHBhcnNlX3Byb2dyYW1fcmVzb3VyY2VfbmFtZShpbnB1dCwgJmJhc2VfbmFtZV9lbmQpOworICAgdGhpcy0+dmFyX25hbWUgPSByYWxsb2Nfc3RybmR1cChtZW1fY3R4LCBpbnB1dCwgYmFzZV9uYW1lX2VuZCAtIGlucHV0KTsKKyAgIGlmIChzdWJzY3JpcHQgPj0gMCkgeworICAgICAgdGhpcy0+YXJyYXlfc3Vic2NyaXB0ID0gc3Vic2NyaXB0OworICAgICAgdGhpcy0+aXNfc3Vic2NyaXB0ZWQgPSB0cnVlOworICAgfSBlbHNlIHsKKyAgICAgIHRoaXMtPmlzX3N1YnNjcmlwdGVkID0gZmFsc2U7CisgICB9CisKKyAgIC8qIEZvciBkcml2ZXJzIHRoYXQgbG93ZXIgZ2xfQ2xpcERpc3RhbmNlIHRvIGdsX0NsaXBEaXN0YW5jZU1FU0EsIHRoaXMKKyAgICAqIGNsYXNzIG11c3QgYmVoYXZlIHNwZWNpYWxseSB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IGdsX0NsaXBEaXN0YW5jZQorICAgICogaXMgY29udmVydGVkIGZyb20gYSBmbG9hdFs4XSB0byBhIHZlYzRbMl0uCisgICAgKi8KKyAgIGlmIChjdHgtPlNoYWRlckNvbXBpbGVyT3B0aW9uc1tNRVNBX1NIQURFUl9WRVJURVhdLkxvd2VyQ2xpcERpc3RhbmNlICYmCisgICAgICAgc3RyY21wKHRoaXMtPnZhcl9uYW1lLCAiZ2xfQ2xpcERpc3RhbmNlIikgPT0gMCkgeworICAgICAgdGhpcy0+aXNfY2xpcF9kaXN0YW5jZV9tZXNhID0gdHJ1ZTsKKyAgIH0KK30KKworCisvKioKKyAqIERldGVybWluZSB3aGV0aGVyIHR3byB0ZmVlZGJhY2tfZGVjbCBvYmplY3RzIHJlZmVyIHRvIHRoZSBzYW1lIHZhcmlhYmxlIGFuZAorICogYXJyYXkgaW5kZXggKGlmIGFwcGxpY2FibGUpLgorICovCitib29sCit0ZmVlZGJhY2tfZGVjbDo6aXNfc2FtZShjb25zdCB0ZmVlZGJhY2tfZGVjbCAmeCwgY29uc3QgdGZlZWRiYWNrX2RlY2wgJnkpCit7CisgICBhc3NlcnQoeC5pc192YXJ5aW5nKCkgJiYgeS5pc192YXJ5aW5nKCkpOworCisgICBpZiAoc3RyY21wKHgudmFyX25hbWUsIHkudmFyX25hbWUpICE9IDApCisgICAgICByZXR1cm4gZmFsc2U7CisgICBpZiAoeC5pc19zdWJzY3JpcHRlZCAhPSB5LmlzX3N1YnNjcmlwdGVkKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgaWYgKHguaXNfc3Vic2NyaXB0ZWQgJiYgeC5hcnJheV9zdWJzY3JpcHQgIT0geS5hcnJheV9zdWJzY3JpcHQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKioKKyAqIEFzc2lnbiBhIGxvY2F0aW9uIGZvciB0aGlzIHRmZWVkYmFja19kZWNsIG9iamVjdCBiYXNlZCBvbiB0aGUgdHJhbnNmb3JtCisgKiBmZWVkYmFjayBjYW5kaWRhdGUgZm91bmQgYnkgZmluZF9jYW5kaWRhdGUuCisgKgorICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgdGhyb3VnaCBsaW5rZXJfZXJyb3IoKSBhbmQgZmFsc2UKKyAqIGlzIHJldHVybmVkLgorICovCitib29sCit0ZmVlZGJhY2tfZGVjbDo6YXNzaWduX2xvY2F0aW9uKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIGFzc2VydCh0aGlzLT5pc192YXJ5aW5nKCkpOworCisgICB1bnNpZ25lZCBmaW5lX2xvY2F0aW9uCisgICAgICA9IHRoaXMtPm1hdGNoZWRfY2FuZGlkYXRlLT50b3BsZXZlbF92YXItPmRhdGEubG9jYXRpb24gKiA0CisgICAgICArIHRoaXMtPm1hdGNoZWRfY2FuZGlkYXRlLT50b3BsZXZlbF92YXItPmRhdGEubG9jYXRpb25fZnJhYworICAgICAgKyB0aGlzLT5tYXRjaGVkX2NhbmRpZGF0ZS0+b2Zmc2V0OworCisgICBpZiAodGhpcy0+bWF0Y2hlZF9jYW5kaWRhdGUtPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIC8qIEFycmF5IHZhcmlhYmxlICovCisgICAgICBjb25zdCB1bnNpZ25lZCBtYXRyaXhfY29scyA9CisgICAgICAgICB0aGlzLT5tYXRjaGVkX2NhbmRpZGF0ZS0+dHlwZS0+ZmllbGRzLmFycmF5LT5tYXRyaXhfY29sdW1uczsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50cyA9CisgICAgICAgICB0aGlzLT5tYXRjaGVkX2NhbmRpZGF0ZS0+dHlwZS0+ZmllbGRzLmFycmF5LT52ZWN0b3JfZWxlbWVudHM7CisgICAgICB1bnNpZ25lZCBhY3R1YWxfYXJyYXlfc2l6ZSA9IHRoaXMtPmlzX2NsaXBfZGlzdGFuY2VfbWVzYSA/CisgICAgICAgICBwcm9nLT5MYXN0Q2xpcERpc3RhbmNlQXJyYXlTaXplIDoKKyAgICAgICAgIHRoaXMtPm1hdGNoZWRfY2FuZGlkYXRlLT50eXBlLT5hcnJheV9zaXplKCk7CisKKyAgICAgIGlmICh0aGlzLT5pc19zdWJzY3JpcHRlZCkgeworICAgICAgICAgLyogQ2hlY2sgYXJyYXkgYm91bmRzLiAqLworICAgICAgICAgaWYgKHRoaXMtPmFycmF5X3N1YnNjcmlwdCA+PSBhY3R1YWxfYXJyYXlfc2l6ZSkgeworICAgICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csICJUcmFuc2Zvcm0gZmVlZGJhY2sgdmFyeWluZyAlcyBoYXMgaW5kZXggIgorICAgICAgICAgICAgICAgICAgICAgICAgICIlaSwgYnV0IHRoZSBhcnJheSBzaXplIGlzICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+b3JpZ19uYW1lLCB0aGlzLT5hcnJheV9zdWJzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2FycmF5X3NpemUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgICAgdW5zaWduZWQgYXJyYXlfZWxlbV9zaXplID0gdGhpcy0+aXNfY2xpcF9kaXN0YW5jZV9tZXNhID8KKyAgICAgICAgICAgIDEgOiB2ZWN0b3JfZWxlbWVudHMgKiBtYXRyaXhfY29sczsKKyAgICAgICAgIGZpbmVfbG9jYXRpb24gKz0gYXJyYXlfZWxlbV9zaXplICogdGhpcy0+YXJyYXlfc3Vic2NyaXB0OworICAgICAgICAgdGhpcy0+c2l6ZSA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICAgdGhpcy0+c2l6ZSA9IGFjdHVhbF9hcnJheV9zaXplOworICAgICAgfQorICAgICAgdGhpcy0+dmVjdG9yX2VsZW1lbnRzID0gdmVjdG9yX2VsZW1lbnRzOworICAgICAgdGhpcy0+bWF0cml4X2NvbHVtbnMgPSBtYXRyaXhfY29sczsKKyAgICAgIGlmICh0aGlzLT5pc19jbGlwX2Rpc3RhbmNlX21lc2EpCisgICAgICAgICB0aGlzLT50eXBlID0gR0xfRkxPQVQ7CisgICAgICBlbHNlCisgICAgICAgICB0aGlzLT50eXBlID0gdGhpcy0+bWF0Y2hlZF9jYW5kaWRhdGUtPnR5cGUtPmZpZWxkcy5hcnJheS0+Z2xfdHlwZTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBSZWd1bGFyIHZhcmlhYmxlIChzY2FsYXIsIHZlY3Rvciwgb3IgbWF0cml4KSAqLworICAgICAgaWYgKHRoaXMtPmlzX3N1YnNjcmlwdGVkKSB7CisgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgIlRyYW5zZm9ybSBmZWVkYmFjayB2YXJ5aW5nICVzIHJlcXVlc3RlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICJidXQgJXMgaXMgbm90IGFuIGFycmF5LiIsCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+b3JpZ19uYW1lLCB0aGlzLT52YXJfbmFtZSk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB0aGlzLT5zaXplID0gMTsKKyAgICAgIHRoaXMtPnZlY3Rvcl9lbGVtZW50cyA9IHRoaXMtPm1hdGNoZWRfY2FuZGlkYXRlLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7CisgICAgICB0aGlzLT5tYXRyaXhfY29sdW1ucyA9IHRoaXMtPm1hdGNoZWRfY2FuZGlkYXRlLT50eXBlLT5tYXRyaXhfY29sdW1uczsKKyAgICAgIHRoaXMtPnR5cGUgPSB0aGlzLT5tYXRjaGVkX2NhbmRpZGF0ZS0+dHlwZS0+Z2xfdHlwZTsKKyAgIH0KKyAgIHRoaXMtPmxvY2F0aW9uID0gZmluZV9sb2NhdGlvbiAvIDQ7CisgICB0aGlzLT5sb2NhdGlvbl9mcmFjID0gZmluZV9sb2NhdGlvbiAlIDQ7CisKKyAgIC8qIEZyb20gR0xfRVhUX3RyYW5zZm9ybV9mZWVkYmFjazoKKyAgICAqICAgQSBwcm9ncmFtIHdpbGwgZmFpbCB0byBsaW5rIGlmOgorICAgICoKKyAgICAqICAgKiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gY2FwdHVyZSBpbiBhbnkgdmFyeWluZworICAgICogICAgIHZhcmlhYmxlIGluIDx2YXJ5aW5ncz4gaXMgZ3JlYXRlciB0aGFuIHRoZSBjb25zdGFudAorICAgICogICAgIE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UU19FWFQgYW5kIHRoZQorICAgICogICAgIGJ1ZmZlciBtb2RlIGlzIFNFUEFSQVRFX0FUVFJJQlNfRVhUOworICAgICovCisgICBpZiAocHJvZy0+VHJhbnNmb3JtRmVlZGJhY2suQnVmZmVyTW9kZSA9PSBHTF9TRVBBUkFURV9BVFRSSUJTICYmCisgICAgICAgdGhpcy0+bnVtX2NvbXBvbmVudHMoKSA+CisgICAgICAgY3R4LT5Db25zdC5NYXhUcmFuc2Zvcm1GZWVkYmFja1NlcGFyYXRlQ29tcG9uZW50cykgeworICAgICAgbGlua2VyX2Vycm9yKHByb2csICJUcmFuc2Zvcm0gZmVlZGJhY2sgdmFyeWluZyAlcyBleGNlZWRzICIKKyAgICAgICAgICAgICAgICAgICAiTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9DT01QT05FTlRTLiIsCisgICAgICAgICAgICAgICAgICAgdGhpcy0+b3JpZ19uYW1lKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKKwordW5zaWduZWQKK3RmZWVkYmFja19kZWNsOjpnZXRfbnVtX291dHB1dHMoKSBjb25zdAoreworICAgaWYgKCF0aGlzLT5pc192YXJ5aW5nKCkpIHsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICByZXR1cm4gKHRoaXMtPm51bV9jb21wb25lbnRzKCkgKyB0aGlzLT5sb2NhdGlvbl9mcmFjICsgMykvNDsKK30KKworCisvKioKKyAqIFVwZGF0ZSBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfaW5mbyB0byByZWZsZWN0IHRoaXMgdGZlZWRiYWNrX2RlY2wuCisgKgorICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgdGhyb3VnaCBsaW5rZXJfZXJyb3IoKSBhbmQgZmFsc2UKKyAqIGlzIHJldHVybmVkLgorICovCitib29sCit0ZmVlZGJhY2tfZGVjbDo6c3RvcmUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBidWZmZXIsIGNvbnN0IHVuc2lnbmVkIG1heF9vdXRwdXRzKSBjb25zdAoreworICAgYXNzZXJ0KCF0aGlzLT5uZXh0X2J1ZmZlcl9zZXBhcmF0b3IpOworCisgICAvKiBIYW5kbGUgZ2xfU2tpcENvbXBvbmVudHMuICovCisgICBpZiAodGhpcy0+c2tpcF9jb21wb25lbnRzKSB7CisgICAgICBpbmZvLT5CdWZmZXJTdHJpZGVbYnVmZmVyXSArPSB0aGlzLT5za2lwX2NvbXBvbmVudHM7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgLyogRnJvbSBHTF9FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrOgorICAgICogICBBIHByb2dyYW0gd2lsbCBmYWlsIHRvIGxpbmsgaWY6CisgICAgKgorICAgICogICAgICogdGhlIHRvdGFsIG51bWJlciBvZiBjb21wb25lbnRzIHRvIGNhcHR1cmUgaXMgZ3JlYXRlciB0aGFuCisgICAgKiAgICAgICB0aGUgY29uc3RhbnQgTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTX0VYVAorICAgICogICAgICAgYW5kIHRoZSBidWZmZXIgbW9kZSBpcyBJTlRFUkxFQVZFRF9BVFRSSUJTX0VYVC4KKyAgICAqLworICAgaWYgKHByb2ctPlRyYW5zZm9ybUZlZWRiYWNrLkJ1ZmZlck1vZGUgPT0gR0xfSU5URVJMRUFWRURfQVRUUklCUyAmJgorICAgICAgIGluZm8tPkJ1ZmZlclN0cmlkZVtidWZmZXJdICsgdGhpcy0+bnVtX2NvbXBvbmVudHMoKSA+CisgICAgICAgY3R4LT5Db25zdC5NYXhUcmFuc2Zvcm1GZWVkYmFja0ludGVybGVhdmVkQ29tcG9uZW50cykgeworICAgICAgbGlua2VyX2Vycm9yKHByb2csICJUaGUgTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTICIKKyAgICAgICAgICAgICAgICAgICAibGltaXQgaGFzIGJlZW4gZXhjZWVkZWQuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHVuc2lnbmVkIGxvY2F0aW9uID0gdGhpcy0+bG9jYXRpb247CisgICB1bnNpZ25lZCBsb2NhdGlvbl9mcmFjID0gdGhpcy0+bG9jYXRpb25fZnJhYzsKKyAgIHVuc2lnbmVkIG51bV9jb21wb25lbnRzID0gdGhpcy0+bnVtX2NvbXBvbmVudHMoKTsKKyAgIHdoaWxlIChudW1fY29tcG9uZW50cyA+IDApIHsKKyAgICAgIHVuc2lnbmVkIG91dHB1dF9zaXplID0gTUlOMihudW1fY29tcG9uZW50cywgNCAtIGxvY2F0aW9uX2ZyYWMpOworICAgICAgYXNzZXJ0KGluZm8tPk51bU91dHB1dHMgPCBtYXhfb3V0cHV0cyk7CisgICAgICBpbmZvLT5PdXRwdXRzW2luZm8tPk51bU91dHB1dHNdLkNvbXBvbmVudE9mZnNldCA9IGxvY2F0aW9uX2ZyYWM7CisgICAgICBpbmZvLT5PdXRwdXRzW2luZm8tPk51bU91dHB1dHNdLk91dHB1dFJlZ2lzdGVyID0gbG9jYXRpb247CisgICAgICBpbmZvLT5PdXRwdXRzW2luZm8tPk51bU91dHB1dHNdLk51bUNvbXBvbmVudHMgPSBvdXRwdXRfc2l6ZTsKKyAgICAgIGluZm8tPk91dHB1dHNbaW5mby0+TnVtT3V0cHV0c10uT3V0cHV0QnVmZmVyID0gYnVmZmVyOworICAgICAgaW5mby0+T3V0cHV0c1tpbmZvLT5OdW1PdXRwdXRzXS5Ec3RPZmZzZXQgPSBpbmZvLT5CdWZmZXJTdHJpZGVbYnVmZmVyXTsKKyAgICAgICsraW5mby0+TnVtT3V0cHV0czsKKyAgICAgIGluZm8tPkJ1ZmZlclN0cmlkZVtidWZmZXJdICs9IG91dHB1dF9zaXplOworICAgICAgbnVtX2NvbXBvbmVudHMgLT0gb3V0cHV0X3NpemU7CisgICAgICBsb2NhdGlvbisrOworICAgICAgbG9jYXRpb25fZnJhYyA9IDA7CisgICB9CisKKyAgIGluZm8tPlZhcnlpbmdzW2luZm8tPk51bVZhcnlpbmddLk5hbWUgPSByYWxsb2Nfc3RyZHVwKHByb2csIHRoaXMtPm9yaWdfbmFtZSk7CisgICBpbmZvLT5WYXJ5aW5nc1tpbmZvLT5OdW1WYXJ5aW5nXS5UeXBlID0gdGhpcy0+dHlwZTsKKyAgIGluZm8tPlZhcnlpbmdzW2luZm8tPk51bVZhcnlpbmddLlNpemUgPSB0aGlzLT5zaXplOworICAgaW5mby0+TnVtVmFyeWluZysrOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworCitjb25zdCB0ZmVlZGJhY2tfY2FuZGlkYXRlICoKK3RmZWVkYmFja19kZWNsOjpmaW5kX2NhbmRpZGF0ZShnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3RhYmxlICp0ZmVlZGJhY2tfY2FuZGlkYXRlcykKK3sKKyAgIGNvbnN0IGNoYXIgKm5hbWUgPSB0aGlzLT5pc19jbGlwX2Rpc3RhbmNlX21lc2EKKyAgICAgID8gImdsX0NsaXBEaXN0YW5jZU1FU0EiIDogdGhpcy0+dmFyX25hbWU7CisgICB0aGlzLT5tYXRjaGVkX2NhbmRpZGF0ZSA9IChjb25zdCB0ZmVlZGJhY2tfY2FuZGlkYXRlICopCisgICAgICBoYXNoX3RhYmxlX2ZpbmQodGZlZWRiYWNrX2NhbmRpZGF0ZXMsIG5hbWUpOworICAgaWYgKCF0aGlzLT5tYXRjaGVkX2NhbmRpZGF0ZSkgeworICAgICAgLyogRnJvbSBHTF9FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrOgorICAgICAgICogICBBIHByb2dyYW0gd2lsbCBmYWlsIHRvIGxpbmsgaWY6CisgICAgICAgKgorICAgICAgICogICAqIGFueSB2YXJpYWJsZSBuYW1lIHNwZWNpZmllZCBpbiB0aGUgPHZhcnlpbmdzPiBhcnJheSBpcyBub3QKKyAgICAgICAqICAgICBkZWNsYXJlZCBhcyBhbiBvdXRwdXQgaW4gdGhlIGdlb21ldHJ5IHNoYWRlciAoaWYgcHJlc2VudCkgb3IKKyAgICAgICAqICAgICB0aGUgdmVydGV4IHNoYWRlciAoaWYgbm8gZ2VvbWV0cnkgc2hhZGVyIGlzIHByZXNlbnQpOworICAgICAgICovCisgICAgICBsaW5rZXJfZXJyb3IocHJvZywgIlRyYW5zZm9ybSBmZWVkYmFjayB2YXJ5aW5nICVzIHVuZGVjbGFyZWQuIiwKKyAgICAgICAgICAgICAgICAgICB0aGlzLT5vcmlnX25hbWUpOworICAgfQorICAgcmV0dXJuIHRoaXMtPm1hdGNoZWRfY2FuZGlkYXRlOworfQorCisKKy8qKgorICogUGFyc2UgYWxsIHRoZSB0cmFuc2Zvcm0gZmVlZGJhY2sgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBwYXNzZWQgdG8KKyAqIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncygpIGFuZCBzdG9yZSB0aGVtIGluIHRmZWVkYmFja19kZWNsIG9iamVjdHMuCisgKgorICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgdGhyb3VnaCBsaW5rZXJfZXJyb3IoKSBhbmQgZmFsc2UKKyAqIGlzIHJldHVybmVkLgorICovCitib29sCitwYXJzZV90ZmVlZGJhY2tfZGVjbHMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1lbV9jdHgsIHVuc2lnbmVkIG51bV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFyeWluZ19uYW1lcywgdGZlZWRiYWNrX2RlY2wgKmRlY2xzKQoreworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9uYW1lczsgKytpKSB7CisgICAgICBkZWNsc1tpXS5pbml0KGN0eCwgbWVtX2N0eCwgdmFyeWluZ19uYW1lc1tpXSk7CisKKyAgICAgIGlmICghZGVjbHNbaV0uaXNfdmFyeWluZygpKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIC8qIEZyb20gR0xfRVhUX3RyYW5zZm9ybV9mZWVkYmFjazoKKyAgICAgICAqICAgQSBwcm9ncmFtIHdpbGwgZmFpbCB0byBsaW5rIGlmOgorICAgICAgICoKKyAgICAgICAqICAgKiBhbnkgdHdvIGVudHJpZXMgaW4gdGhlIDx2YXJ5aW5ncz4gYXJyYXkgc3BlY2lmeSB0aGUgc2FtZSB2YXJ5aW5nCisgICAgICAgKiAgICAgdmFyaWFibGU7CisgICAgICAgKgorICAgICAgICogV2UgaW50ZXJwcmV0IHRoaXMgdG8gbWVhbiAiYW55IHR3byBlbnRyaWVzIGluIHRoZSA8dmFyeWluZ3M+IGFycmF5CisgICAgICAgKiBzcGVjaWZ5IHRoZSBzYW1lIHZhcnlpbmcgdmFyaWFibGUgYW5kIGFycmF5IGluZGV4Iiwgc2luY2UgdHJhbnNmb3JtCisgICAgICAgKiBmZWVkYmFjayBvZiBhcnJheXMgd291bGQgYmUgdXNlbGVzcyBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgICAgIGlmICghZGVjbHNbal0uaXNfdmFyeWluZygpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIGlmICh0ZmVlZGJhY2tfZGVjbDo6aXNfc2FtZShkZWNsc1tpXSwgZGVjbHNbal0pKSB7CisgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgIlRyYW5zZm9ybSBmZWVkYmFjayB2YXJ5aW5nICVzIHNwZWNpZmllZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlLiIsIHZhcnlpbmdfbmFtZXNbaV0pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgcmV0dXJuIHRydWU7Cit9CisKKworLyoqCisgKiBTdG9yZSB0cmFuc2Zvcm0gZmVlZGJhY2sgbG9jYXRpb24gYXNzaWdubWVudHMgaW50bworICogcHJvZy0+TGlua2VkVHJhbnNmb3JtRmVlZGJhY2sgYmFzZWQgb24gdGhlIGRhdGEgc3RvcmVkIGluIHRmZWVkYmFja19kZWNscy4KKyAqCisgKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBlcnJvciBpcyByZXBvcnRlZCB0aHJvdWdoIGxpbmtlcl9lcnJvcigpIGFuZCBmYWxzZQorICogaXMgcmV0dXJuZWQuCisgKi8KK2Jvb2wKK3N0b3JlX3RmZWVkYmFja19pbmZvKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV90ZmVlZGJhY2tfZGVjbHMsCisgICAgICAgICAgICAgICAgICAgICB0ZmVlZGJhY2tfZGVjbCAqdGZlZWRiYWNrX2RlY2xzKQoreworICAgYm9vbCBzZXBhcmF0ZV9hdHRyaWJzX21vZGUgPQorICAgICAgcHJvZy0+VHJhbnNmb3JtRmVlZGJhY2suQnVmZmVyTW9kZSA9PSBHTF9TRVBBUkFURV9BVFRSSUJTOworCisgICByYWxsb2NfZnJlZShwcm9nLT5MaW5rZWRUcmFuc2Zvcm1GZWVkYmFjay5WYXJ5aW5ncyk7CisgICByYWxsb2NfZnJlZShwcm9nLT5MaW5rZWRUcmFuc2Zvcm1GZWVkYmFjay5PdXRwdXRzKTsKKworICAgbWVtc2V0KCZwcm9nLT5MaW5rZWRUcmFuc2Zvcm1GZWVkYmFjaywgMCwKKyAgICAgICAgICBzaXplb2YocHJvZy0+TGlua2VkVHJhbnNmb3JtRmVlZGJhY2spKTsKKworICAgcHJvZy0+TGlua2VkVHJhbnNmb3JtRmVlZGJhY2suVmFyeWluZ3MgPQorICAgICAgcnphbGxvY19hcnJheShwcm9nLAorCQkgICAgc3RydWN0IGdsX3RyYW5zZm9ybV9mZWVkYmFja192YXJ5aW5nX2luZm8sCisJCSAgICBudW1fdGZlZWRiYWNrX2RlY2xzKTsKKworICAgdW5zaWduZWQgbnVtX291dHB1dHMgPSAwOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV90ZmVlZGJhY2tfZGVjbHM7ICsraSkKKyAgICAgIG51bV9vdXRwdXRzICs9IHRmZWVkYmFja19kZWNsc1tpXS5nZXRfbnVtX291dHB1dHMoKTsKKworICAgcHJvZy0+TGlua2VkVHJhbnNmb3JtRmVlZGJhY2suT3V0cHV0cyA9CisgICAgICByemFsbG9jX2FycmF5KHByb2csCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBudW1fb3V0cHV0cyk7CisKKyAgIHVuc2lnbmVkIG51bV9idWZmZXJzID0gMDsKKworICAgaWYgKHNlcGFyYXRlX2F0dHJpYnNfbW9kZSkgeworICAgICAgLyogR0xfU0VQQVJBVEVfQVRUUklCUyAqLworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV90ZmVlZGJhY2tfZGVjbHM7ICsraSkgeworICAgICAgICAgaWYgKCF0ZmVlZGJhY2tfZGVjbHNbaV0uc3RvcmUoY3R4LCBwcm9nLCAmcHJvZy0+TGlua2VkVHJhbnNmb3JtRmVlZGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVmZmVycywgbnVtX291dHB1dHMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICBudW1fYnVmZmVycysrOworICAgICAgfQorICAgfQorICAgZWxzZSB7CisgICAgICAvKiBHTF9JTlZFUkxFQVZFRF9BVFRSSUJTICovCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3RmZWVkYmFja19kZWNsczsgKytpKSB7CisgICAgICAgICBpZiAodGZlZWRiYWNrX2RlY2xzW2ldLmlzX25leHRfYnVmZmVyX3NlcGFyYXRvcigpKSB7CisgICAgICAgICAgICBudW1fYnVmZmVycysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmICghdGZlZWRiYWNrX2RlY2xzW2ldLnN0b3JlKGN0eCwgcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9nLT5MaW5rZWRUcmFuc2Zvcm1GZWVkYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9idWZmZXJzLCBudW1fb3V0cHV0cykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBudW1fYnVmZmVycysrOworICAgfQorCisgICBhc3NlcnQocHJvZy0+TGlua2VkVHJhbnNmb3JtRmVlZGJhY2suTnVtT3V0cHV0cyA9PSBudW1fb3V0cHV0cyk7CisKKyAgIHByb2ctPkxpbmtlZFRyYW5zZm9ybUZlZWRiYWNrLk51bUJ1ZmZlcnMgPSBudW1fYnVmZmVyczsKKyAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHJlY29yZGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gb3V0cHV0cyBvZiBvbmUgc2hhZGVyCisgKiBzdGFnZSAodGhlICJwcm9kdWNlciIpIGFuZCBpbnB1dHMgb2YgYW5vdGhlciAodGhlICJjb25zdW1lciIpLgorICovCitjbGFzcyB2YXJ5aW5nX21hdGNoZXMKK3sKK3B1YmxpYzoKKyAgIHZhcnlpbmdfbWF0Y2hlcyhib29sIGRpc2FibGVfdmFyeWluZ19wYWNraW5nLCBib29sIGNvbnN1bWVyX2lzX2ZzKTsKKyAgIH52YXJ5aW5nX21hdGNoZXMoKTsKKyAgIHZvaWQgcmVjb3JkKGlyX3ZhcmlhYmxlICpwcm9kdWNlcl92YXIsIGlyX3ZhcmlhYmxlICpjb25zdW1lcl92YXIpOworICAgdW5zaWduZWQgYXNzaWduX2xvY2F0aW9ucygpOworICAgdm9pZCBzdG9yZV9sb2NhdGlvbnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgIC8qKgorICAgICogSWYgdHJ1ZSwgdGhpcyBkcml2ZXIgZGlzYWJsZXMgdmFyeWluZyBwYWNraW5nLCBzbyBhbGwgdmFyeWluZ3MgbmVlZCB0bworICAgICogYmUgYWxpZ25lZCBvbiBzbG90IGJvdW5kYXJpZXMsIGFuZCB0YWtlIHVwIGEgbnVtYmVyIG9mIHNsb3RzIGVxdWFsIHRvCisgICAgKiB0aGVpciBudW1iZXIgb2YgbWF0cml4IGNvbHVtbnMgdGltZXMgdGhlaXIgYXJyYXkgc2l6ZS4KKyAgICAqLworICAgY29uc3QgYm9vbCBkaXNhYmxlX3ZhcnlpbmdfcGFja2luZzsKKworICAgLyoqCisgICAgKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgaW4gd2hpY2ggdmFyeWluZ3MgYXJlIHBhY2tlZCB3aXRoaW4gYQorICAgICogcGFja2luZyBjbGFzcy4KKyAgICAqCisgICAgKiBDdXJyZW50bHkgd2UgcGFjayB2ZWM0J3MgZmlyc3QsIHRoZW4gdmVjMidzLCB0aGVuIHNjYWxhciB2YWx1ZXMsIHRoZW4KKyAgICAqIHZlYzMncy4gIFRoaXMgb3JkZXIgZW5zdXJlcyB0aGF0IHRoZSBvbmx5IHZlY3RvcnMgdGhhdCBhcmUgYXQgcmlzayBvZgorICAgICogaGF2aW5nIHRvIGJlICJkb3VibGUgcGFya2VkIiAoc3BsaXQgYmV0d2VlbiB0d28gYWRqYWNlbnQgdmFyeWluZyBzbG90cykKKyAgICAqIGFyZSB0aGUgdmVjMydzLgorICAgICovCisgICBlbnVtIHBhY2tpbmdfb3JkZXJfZW51bSB7CisgICAgICBQQUNLSU5HX09SREVSX1ZFQzQsCisgICAgICBQQUNLSU5HX09SREVSX1ZFQzIsCisgICAgICBQQUNLSU5HX09SREVSX1NDQUxBUiwKKyAgICAgIFBBQ0tJTkdfT1JERVJfVkVDMywKKyAgIH07CisKKyAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlX3BhY2tpbmdfY2xhc3MoY29uc3QgaXJfdmFyaWFibGUgKnZhcik7CisgICBzdGF0aWMgcGFja2luZ19vcmRlcl9lbnVtIGNvbXB1dGVfcGFja2luZ19vcmRlcihjb25zdCBpcl92YXJpYWJsZSAqdmFyKTsKKyAgIHN0YXRpYyBpbnQgbWF0Y2hfY29tcGFyYXRvcihjb25zdCB2b2lkICp4X2dlbmVyaWMsIGNvbnN0IHZvaWQgKnlfZ2VuZXJpYyk7CisKKyAgIC8qKgorICAgICogU3RydWN0dXJlIHJlY29yZGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBzaW5nbGUgcHJvZHVjZXIgb3V0cHV0CisgICAgKiBhbmQgYSBzaW5nbGUgY29uc3VtZXIgaW5wdXQuCisgICAgKi8KKyAgIHN0cnVjdCBtYXRjaCB7CisgICAgICAvKioKKyAgICAgICAqIFBhY2tpbmcgY2xhc3MgZm9yIHRoaXMgdmFyeWluZywgY29tcHV0ZWQgYnkgY29tcHV0ZV9wYWNraW5nX2NsYXNzKCkuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIHBhY2tpbmdfY2xhc3M7CisKKyAgICAgIC8qKgorICAgICAgICogUGFja2luZyBvcmRlciBmb3IgdGhpcyB2YXJ5aW5nLCBjb21wdXRlZCBieSBjb21wdXRlX3BhY2tpbmdfb3JkZXIoKS4KKyAgICAgICAqLworICAgICAgcGFja2luZ19vcmRlcl9lbnVtIHBhY2tpbmdfb3JkZXI7CisgICAgICB1bnNpZ25lZCBudW1fY29tcG9uZW50czsKKworICAgICAgLyoqCisgICAgICAgKiBUaGUgb3V0cHV0IHZhcmlhYmxlIGluIHRoZSBwcm9kdWNlciBzdGFnZS4KKyAgICAgICAqLworICAgICAgaXJfdmFyaWFibGUgKnByb2R1Y2VyX3ZhcjsKKworICAgICAgLyoqCisgICAgICAgKiBUaGUgaW5wdXQgdmFyaWFibGUgaW4gdGhlIGNvbnN1bWVyIHN0YWdlLgorICAgICAgICovCisgICAgICBpcl92YXJpYWJsZSAqY29uc3VtZXJfdmFyOworCisgICAgICAvKioKKyAgICAgICAqIFRoZSBsb2NhdGlvbiB3aGljaCBoYXMgYmVlbiBhc3NpZ25lZCBmb3IgdGhpcyB2YXJ5aW5nLiAgVGhpcyBpcworICAgICAgICogZXhwcmVzc2VkIGluIG11bHRpcGxlcyBvZiBhIGZsb2F0LCB3aXRoIHRoZSBmaXJzdCBnZW5lcmljIHZhcnlpbmcKKyAgICAgICAqIChpLmUuIHRoZSBvbmUgcmVmZXJyZWQgdG8gYnkgVkFSWUlOR19TTE9UX1ZBUjApIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgICAgICogdmFsdWUgMC4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgZ2VuZXJpY19sb2NhdGlvbjsKKyAgIH0gKm1hdGNoZXM7CisKKyAgIC8qKgorICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgXGMgbWF0Y2hlcyBhcnJheSB0aGF0IGFyZSBjdXJyZW50bHkgaW4KKyAgICAqIHVzZS4KKyAgICAqLworICAgdW5zaWduZWQgbnVtX21hdGNoZXM7CisKKyAgIC8qKgorICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHdlcmUgc2V0IGFzaWRlIGZvciB0aGUgXGMgbWF0Y2hlcyBhcnJheSB3aGVuCisgICAgKiBpdCB3YXMgYWxsb2NhdGVkLgorICAgICovCisgICB1bnNpZ25lZCBtYXRjaGVzX2NhcGFjaXR5OworCisgICBjb25zdCBib29sIGNvbnN1bWVyX2lzX2ZzOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK3ZhcnlpbmdfbWF0Y2hlczo6dmFyeWluZ19tYXRjaGVzKGJvb2wgZGlzYWJsZV92YXJ5aW5nX3BhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN1bWVyX2lzX2ZzKQorICAgOiBkaXNhYmxlX3ZhcnlpbmdfcGFja2luZyhkaXNhYmxlX3ZhcnlpbmdfcGFja2luZyksCisgICAgIGNvbnN1bWVyX2lzX2ZzKGNvbnN1bWVyX2lzX2ZzKQoreworICAgLyogTm90ZTogdGhpcyBpbml0aWFsIGNhcGFjaXR5IGlzIHJhdGhlciBhcmJpdHJhcmlseSBjaG9zZW4gdG8gYmUgbGFyZ2UKKyAgICAqIGVub3VnaCBmb3IgbWFueSBjYXNlcyB3aXRob3V0IHdhc3RpbmcgYW4gdW5yZWFzb25hYmxlIGFtb3VudCBvZiBzcGFjZS4KKyAgICAqIHZhcnlpbmdfbWF0Y2hlczo6cmVjb3JkKCkgd2lsbCByZXNpemUgdGhlIGFycmF5IGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KKyAgICAqIHRoaXMgbnVtYmVyIG9mIHZhcnlpbmdzLgorICAgICovCisgICB0aGlzLT5tYXRjaGVzX2NhcGFjaXR5ID0gODsKKyAgIHRoaXMtPm1hdGNoZXMgPSAobWF0Y2ggKikKKyAgICAgIG1hbGxvYyhzaXplb2YoKnRoaXMtPm1hdGNoZXMpICogdGhpcy0+bWF0Y2hlc19jYXBhY2l0eSk7CisgICB0aGlzLT5udW1fbWF0Y2hlcyA9IDA7Cit9CisKKwordmFyeWluZ19tYXRjaGVzOjp+dmFyeWluZ19tYXRjaGVzKCkKK3sKKyAgIGZyZWUodGhpcy0+bWF0Y2hlcyk7Cit9CisKKworLyoqCisgKiBSZWNvcmQgdGhlIGdpdmVuIHByb2R1Y2VyL2NvbnN1bWVyIHZhcmlhYmxlIHBhaXIgaW4gdGhlIGxpc3Qgb2YgdmFyaWFibGVzCisgKiB0aGF0IHNob3VsZCBsYXRlciBiZSBhc3NpZ25lZCBsb2NhdGlvbnMuCisgKgorICogSXQgaXMgcGVybWlzc2libGUgZm9yIFxjIGNvbnN1bWVyX3ZhciB0byBiZSBOVUxMICh0aGlzIGhhcHBlbnMgaWYgYQorICogdmFyaWFibGUgaXMgb3V0cHV0IGJ5IHRoZSBwcm9kdWNlciBhbmQgY29uc3VtZWQgYnkgdHJhbnNmb3JtIGZlZWRiYWNrLCBidXQKKyAqIG5vdCBjb25zdW1lZCBieSB0aGUgY29uc3VtZXIpLgorICoKKyAqIElmIFxjIHByb2R1Y2VyX3ZhciBoYXMgYWxyZWFkeSBiZWVuIHBhaXJlZCB1cCB3aXRoIGEgY29uc3VtZXJfdmFyLCBvcgorICogcHJvZHVjZXJfdmFyIGlzIHBhcnQgb2YgZml4ZWQgcGlwZWxpbmUgZnVuY3Rpb25hbGl0eSAoYW5kIGhlbmNlIGFscmVhZHkgaGFzCisgKiBhIGxvY2F0aW9uIGFzc2lnbmVkKSwgdGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0LgorICoKKyAqIE5vdGU6IGFzIGEgc2lkZSBlZmZlY3QgdGhpcyBmdW5jdGlvbiBtYXkgY2hhbmdlIHRoZSBpbnRlcnBvbGF0aW9uIHR5cGUgb2YKKyAqIFxjIHByb2R1Y2VyX3ZhciwgYnV0IG9ubHkgd2hlbiB0aGUgY2hhbmdlIGNvdWxkbid0IHBvc3NpYmx5IGFmZmVjdAorICogcmVuZGVyaW5nLgorICovCit2b2lkCit2YXJ5aW5nX21hdGNoZXM6OnJlY29yZChpcl92YXJpYWJsZSAqcHJvZHVjZXJfdmFyLCBpcl92YXJpYWJsZSAqY29uc3VtZXJfdmFyKQoreworICAgYXNzZXJ0KHByb2R1Y2VyX3ZhciAhPSBOVUxMIHx8IGNvbnN1bWVyX3ZhciAhPSBOVUxMKTsKKworICAgaWYgKChwcm9kdWNlcl92YXIgJiYgIXByb2R1Y2VyX3Zhci0+ZGF0YS5pc191bm1hdGNoZWRfZ2VuZXJpY19pbm91dCkKKyAgICAgICB8fCAoY29uc3VtZXJfdmFyICYmICFjb25zdW1lcl92YXItPmRhdGEuaXNfdW5tYXRjaGVkX2dlbmVyaWNfaW5vdXQpKSB7CisgICAgICAvKiBFaXRoZXIgYSBsb2NhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB2YXJpYWJsZSAoc2luY2UgaXQgaXMgcGFydAorICAgICAgICogb2YgZml4ZWQgZnVuY3Rpb25hbGl0eSksIG9yIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVjb3JkZWQgYXMgcGFydCBvZiBhCisgICAgICAgKiBwcmV2aW91cyBtYXRjaC4KKyAgICAgICAqLworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoKGNvbnN1bWVyX3ZhciA9PSBOVUxMICYmIHByb2R1Y2VyX3Zhci0+dHlwZS0+Y29udGFpbnNfaW50ZWdlcigpKSB8fAorICAgICAgICFjb25zdW1lcl9pc19mcykgeworICAgICAgLyogU2luY2UgdGhpcyB2YXJ5aW5nIGlzIG5vdCBiZWluZyBjb25zdW1lZCBieSB0aGUgZnJhZ21lbnQgc2hhZGVyLCBpdHMKKyAgICAgICAqIGludGVycG9sYXRpb24gdHlwZSB2YXJ5aW5nIGNhbm5vdCBwb3NzaWJseSBhZmZlY3QgcmVuZGVyaW5nLiAgQWxzbywKKyAgICAgICAqIHRoaXMgdmFyaWFibGUgaXMgbm9uLWZsYXQgYW5kIGlzIChvciBjb250YWlucykgYW4gaW50ZWdlci4KKyAgICAgICAqCisgICAgICAgKiBsb3dlcl9wYWNrZWRfdmFyeWluZ3MgcmVxdWlyZXMgYWxsIGludGVnZXIgdmFyeWluZ3MgdG8gZmxhdCwKKyAgICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhleSBhcHBlYXIuICBXZSBjYW4gdHJpdmlhbGx5IHNhdGlzZnkgdGhhdAorICAgICAgICogcmVxdWlyZW1lbnQgYnkgY2hhbmdpbmcgdGhlIGludGVycG9sYXRpb24gdHlwZSB0byBmbGF0IGhlcmUuCisgICAgICAgKi8KKyAgICAgIHByb2R1Y2VyX3Zhci0+ZGF0YS5jZW50cm9pZCA9IGZhbHNlOworICAgICAgcHJvZHVjZXJfdmFyLT5kYXRhLnNhbXBsZSA9IGZhbHNlOworICAgICAgcHJvZHVjZXJfdmFyLT5kYXRhLmludGVycG9sYXRpb24gPSBJTlRFUlBfUVVBTElGSUVSX0ZMQVQ7CisKKyAgICAgIGlmIChjb25zdW1lcl92YXIpIHsKKyAgICAgICAgIGNvbnN1bWVyX3Zhci0+ZGF0YS5jZW50cm9pZCA9IGZhbHNlOworICAgICAgICAgY29uc3VtZXJfdmFyLT5kYXRhLnNhbXBsZSA9IGZhbHNlOworICAgICAgICAgY29uc3VtZXJfdmFyLT5kYXRhLmludGVycG9sYXRpb24gPSBJTlRFUlBfUVVBTElGSUVSX0ZMQVQ7CisgICAgICB9CisgICB9CisKKyAgIGlmICh0aGlzLT5udW1fbWF0Y2hlcyA9PSB0aGlzLT5tYXRjaGVzX2NhcGFjaXR5KSB7CisgICAgICB0aGlzLT5tYXRjaGVzX2NhcGFjaXR5ICo9IDI7CisgICAgICB0aGlzLT5tYXRjaGVzID0gKG1hdGNoICopCisgICAgICAgICByZWFsbG9jKHRoaXMtPm1hdGNoZXMsCisgICAgICAgICAgICAgICAgIHNpemVvZigqdGhpcy0+bWF0Y2hlcykgKiB0aGlzLT5tYXRjaGVzX2NhcGFjaXR5KTsKKyAgIH0KKworICAgY29uc3QgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IChwcm9kdWNlcl92YXIgIT0gTlVMTCkKKyAgICAgID8gcHJvZHVjZXJfdmFyIDogY29uc3VtZXJfdmFyOworCisgICB0aGlzLT5tYXRjaGVzW3RoaXMtPm51bV9tYXRjaGVzXS5wYWNraW5nX2NsYXNzCisgICAgICA9IHRoaXMtPmNvbXB1dGVfcGFja2luZ19jbGFzcyh2YXIpOworICAgdGhpcy0+bWF0Y2hlc1t0aGlzLT5udW1fbWF0Y2hlc10ucGFja2luZ19vcmRlcgorICAgICAgPSB0aGlzLT5jb21wdXRlX3BhY2tpbmdfb3JkZXIodmFyKTsKKyAgIGlmICh0aGlzLT5kaXNhYmxlX3ZhcnlpbmdfcGFja2luZykgeworICAgICAgdW5zaWduZWQgc2xvdHMgPSB2YXItPnR5cGUtPmlzX2FycmF5KCkKKyAgICAgICAgID8gKHZhci0+dHlwZS0+bGVuZ3RoICogdmFyLT50eXBlLT5maWVsZHMuYXJyYXktPm1hdHJpeF9jb2x1bW5zKQorICAgICAgICAgOiB2YXItPnR5cGUtPm1hdHJpeF9jb2x1bW5zOworICAgICAgdGhpcy0+bWF0Y2hlc1t0aGlzLT5udW1fbWF0Y2hlc10ubnVtX2NvbXBvbmVudHMgPSA0ICogc2xvdHM7CisgICB9IGVsc2UgeworICAgICAgdGhpcy0+bWF0Y2hlc1t0aGlzLT5udW1fbWF0Y2hlc10ubnVtX2NvbXBvbmVudHMKKyAgICAgICAgID0gdmFyLT50eXBlLT5jb21wb25lbnRfc2xvdHMoKTsKKyAgIH0KKyAgIHRoaXMtPm1hdGNoZXNbdGhpcy0+bnVtX21hdGNoZXNdLnByb2R1Y2VyX3ZhciA9IHByb2R1Y2VyX3ZhcjsKKyAgIHRoaXMtPm1hdGNoZXNbdGhpcy0+bnVtX21hdGNoZXNdLmNvbnN1bWVyX3ZhciA9IGNvbnN1bWVyX3ZhcjsKKyAgIHRoaXMtPm51bV9tYXRjaGVzKys7CisgICBpZiAocHJvZHVjZXJfdmFyKQorICAgICAgcHJvZHVjZXJfdmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0ID0gMDsKKyAgIGlmIChjb25zdW1lcl92YXIpCisgICAgICBjb25zdW1lcl92YXItPmRhdGEuaXNfdW5tYXRjaGVkX2dlbmVyaWNfaW5vdXQgPSAwOworfQorCisKKy8qKgorICogQ2hvb3NlIGxvY2F0aW9ucyBmb3IgYWxsIG9mIHRoZSB2YXJpYWJsZSBtYXRjaGVzIHRoYXQgd2VyZSBwcmV2aW91c2x5CisgKiBwYXNzZWQgdG8gdmFyeWluZ19tYXRjaGVzOjpyZWNvcmQoKS4KKyAqLwordW5zaWduZWQKK3ZhcnlpbmdfbWF0Y2hlczo6YXNzaWduX2xvY2F0aW9ucygpCit7CisgICAvKiBTb3J0IHZhcnlpbmcgbWF0Y2hlcyBpbnRvIGFuIG9yZGVyIHRoYXQgbWFrZXMgdGhlbSBlYXN5IHRvIHBhY2suICovCisgICBxc29ydCh0aGlzLT5tYXRjaGVzLCB0aGlzLT5udW1fbWF0Y2hlcywgc2l6ZW9mKCp0aGlzLT5tYXRjaGVzKSwKKyAgICAgICAgICZ2YXJ5aW5nX21hdGNoZXM6Om1hdGNoX2NvbXBhcmF0b3IpOworCisgICB1bnNpZ25lZCBnZW5lcmljX2xvY2F0aW9uID0gMDsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRoaXMtPm51bV9tYXRjaGVzOyBpKyspIHsKKyAgICAgIC8qIEFkdmFuY2UgdG8gdGhlIG5leHQgc2xvdCBpZiB0aGlzIHZhcnlpbmcgaGFzIGEgZGlmZmVyZW50IHBhY2tpbmcKKyAgICAgICAqIGNsYXNzIHRoYW4gdGhlIHByZXZpb3VzIG9uZSwgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IG9uIGEgc2xvdAorICAgICAgICogYm91bmRhcnkuCisgICAgICAgKi8KKyAgICAgIGlmIChpID4gMCAmJgorICAgICAgICAgIHRoaXMtPm1hdGNoZXNbaSAtIDFdLnBhY2tpbmdfY2xhc3MKKyAgICAgICAgICAhPSB0aGlzLT5tYXRjaGVzW2ldLnBhY2tpbmdfY2xhc3MpIHsKKyAgICAgICAgIGdlbmVyaWNfbG9jYXRpb24gPSBBTElHTihnZW5lcmljX2xvY2F0aW9uLCA0KTsKKyAgICAgIH0KKworICAgICAgdGhpcy0+bWF0Y2hlc1tpXS5nZW5lcmljX2xvY2F0aW9uID0gZ2VuZXJpY19sb2NhdGlvbjsKKworICAgICAgZ2VuZXJpY19sb2NhdGlvbiArPSB0aGlzLT5tYXRjaGVzW2ldLm51bV9jb21wb25lbnRzOworICAgfQorCisgICByZXR1cm4gKGdlbmVyaWNfbG9jYXRpb24gKyAzKSAvIDQ7Cit9CisKKworLyoqCisgKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGFuZCBjb25zdW1lciBzaGFkZXJzIHRvIHJlZmxlY3QgdGhlIGxvY2F0aW9ucworICogYXNzaWdubWVudHMgdGhhdCB3ZXJlIG1hZGUgYnkgdmFyeWluZ19tYXRjaGVzOjphc3NpZ25fbG9jYXRpb25zKCkuCisgKi8KK3ZvaWQKK3ZhcnlpbmdfbWF0Y2hlczo6c3RvcmVfbG9jYXRpb25zKCkgY29uc3QKK3sKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0aGlzLT5udW1fbWF0Y2hlczsgaSsrKSB7CisgICAgICBpcl92YXJpYWJsZSAqcHJvZHVjZXJfdmFyID0gdGhpcy0+bWF0Y2hlc1tpXS5wcm9kdWNlcl92YXI7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3VtZXJfdmFyID0gdGhpcy0+bWF0Y2hlc1tpXS5jb25zdW1lcl92YXI7CisgICAgICB1bnNpZ25lZCBnZW5lcmljX2xvY2F0aW9uID0gdGhpcy0+bWF0Y2hlc1tpXS5nZW5lcmljX2xvY2F0aW9uOworICAgICAgdW5zaWduZWQgc2xvdCA9IGdlbmVyaWNfbG9jYXRpb24gLyA0OworICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gZ2VuZXJpY19sb2NhdGlvbiAlIDQ7CisKKyAgICAgIGlmIChwcm9kdWNlcl92YXIpIHsKKyAgICAgICAgIHByb2R1Y2VyX3Zhci0+ZGF0YS5sb2NhdGlvbiA9IFZBUllJTkdfU0xPVF9WQVIwICsgc2xvdDsKKyAgICAgICAgIHByb2R1Y2VyX3Zhci0+ZGF0YS5sb2NhdGlvbl9mcmFjID0gb2Zmc2V0OworICAgICAgfQorCisgICAgICBpZiAoY29uc3VtZXJfdmFyKSB7CisgICAgICAgICBhc3NlcnQoY29uc3VtZXJfdmFyLT5kYXRhLmxvY2F0aW9uID09IC0xKTsKKyAgICAgICAgIGNvbnN1bWVyX3Zhci0+ZGF0YS5sb2NhdGlvbiA9IFZBUllJTkdfU0xPVF9WQVIwICsgc2xvdDsKKyAgICAgICAgIGNvbnN1bWVyX3Zhci0+ZGF0YS5sb2NhdGlvbl9mcmFjID0gb2Zmc2V0OworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogQ29tcHV0ZSB0aGUgInBhY2tpbmcgY2xhc3MiIG9mIHRoZSBnaXZlbiB2YXJ5aW5nLiAgVGhpcyBpcyBhbiB1bnNpZ25lZAorICogaW50ZWdlciB3aXRoIHRoZSBwcm9wZXJ0eSB0aGF0IHR3byB2YXJpYWJsZXMgaW4gdGhlIHNhbWUgcGFja2luZyBjbGFzcyBjYW4KKyAqIGJlIHNhZmVseSBiYWNrZWQgaW50byB0aGUgc2FtZSB2ZWM0LgorICovCit1bnNpZ25lZAordmFyeWluZ19tYXRjaGVzOjpjb21wdXRlX3BhY2tpbmdfY2xhc3MoY29uc3QgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIC8qIFdpdGhvdXQgaGVscCBmcm9tIHRoZSBiYWNrLWVuZCwgdGhlcmUgaXMgbm8gd2F5IHRvIHBhY2sgdG9nZXRoZXIKKyAgICAqIHZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbnRlcnBvbGF0aW9uIHR5cGVzLCBiZWNhdXNlCisgICAgKiBsb3dlcl9wYWNrZWRfdmFyeWluZ3MgbXVzdCBjaG9vc2UgZXhhY3RseSBvbmUgaW50ZXJwb2xhdGlvbiB0eXBlIGZvcgorICAgICogZWFjaCBwYWNrZWQgdmFyeWluZyBpdCBjcmVhdGVzLgorICAgICoKKyAgICAqIEhvd2V2ZXIsIHdlIGNhbiBzYWZlbHkgcGFjayB0b2dldGhlciBmbG9hdHMsIGludHMsIGFuZCB1aW50cywgYmVjYXVzZToKKyAgICAqCisgICAgKiAtIHZhcnlpbmdzIG9mIGJhc2UgdHlwZSAiaW50IiBhbmQgInVpbnQiIG11c3QgdXNlIHRoZSAiZmxhdCIKKyAgICAqICAgaW50ZXJwb2xhdGlvbiB0eXBlLCB3aGljaCBjYW4gb25seSBvY2N1ciBpbiBHTFNMIDEuMzAgYW5kIGFib3ZlLgorICAgICoKKyAgICAqIC0gT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBHTFNMIDEuMzAgYW5kIGFib3ZlLCBsb3dlcl9wYWNrZWRfdmFyeWluZ3MKKyAgICAqICAgY2FuIHN0b3JlIGZsYXQgZmxvYXRzIGFzIGludHMgd2l0aG91dCBsb3NpbmcgYW55IGluZm9ybWF0aW9uICh1c2luZworICAgICogICB0aGUgaXJfdW5vcF9iaXRjYXN0Xyogb3Bjb2RlcykuCisgICAgKgorICAgICogVGhlcmVmb3JlLCB0aGUgcGFja2luZyBjbGFzcyBkZXBlbmRzIG9ubHkgb24gdGhlIGludGVycG9sYXRpb24gdHlwZS4KKyAgICAqLworICAgdW5zaWduZWQgcGFja2luZ19jbGFzcyA9IHZhci0+ZGF0YS5jZW50cm9pZCB8ICh2YXItPmRhdGEuc2FtcGxlIDw8IDEpOworICAgcGFja2luZ19jbGFzcyAqPSA0OworICAgcGFja2luZ19jbGFzcyArPSB2YXItPmRhdGEuaW50ZXJwb2xhdGlvbjsKKyAgIHJldHVybiBwYWNraW5nX2NsYXNzOworfQorCisKKy8qKgorICogQ29tcHV0ZSB0aGUgInBhY2tpbmcgb3JkZXIiIG9mIHRoZSBnaXZlbiB2YXJ5aW5nLiAgVGhpcyBpcyBhIHNvcnQga2V5IHdlCisgKiB1c2UgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gYXR0ZW1wdCB0byBwYWNrIHRoZSBnaXZlbiB2YXJ5aW5nIHJlbGF0aXZlIHRvCisgKiBvdGhlciB2YXJ5aW5ncyBpbiB0aGUgc2FtZSBwYWNraW5nIGNsYXNzLgorICovCit2YXJ5aW5nX21hdGNoZXM6OnBhY2tpbmdfb3JkZXJfZW51bQordmFyeWluZ19tYXRjaGVzOjpjb21wdXRlX3BhY2tpbmdfb3JkZXIoY29uc3QgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqZWxlbWVudF90eXBlID0gdmFyLT50eXBlOworCisgICB3aGlsZSAoZWxlbWVudF90eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0FSUkFZKSB7CisgICAgICBlbGVtZW50X3R5cGUgPSBlbGVtZW50X3R5cGUtPmZpZWxkcy5hcnJheTsKKyAgIH0KKworICAgc3dpdGNoIChlbGVtZW50X3R5cGUtPmNvbXBvbmVudF9zbG90cygpICUgNCkgeworICAgY2FzZSAxOiByZXR1cm4gUEFDS0lOR19PUkRFUl9TQ0FMQVI7CisgICBjYXNlIDI6IHJldHVybiBQQUNLSU5HX09SREVSX1ZFQzI7CisgICBjYXNlIDM6IHJldHVybiBQQUNLSU5HX09SREVSX1ZFQzM7CisgICBjYXNlIDA6IHJldHVybiBQQUNLSU5HX09SREVSX1ZFQzQ7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEiVW5leHBlY3RlZCB2YWx1ZSBvZiB2ZWN0b3JfZWxlbWVudHMiKTsKKyAgICAgIHJldHVybiBQQUNLSU5HX09SREVSX1ZFQzQ7CisgICB9Cit9CisKKworLyoqCisgKiBDb21wYXJpc29uIGZ1bmN0aW9uIHBhc3NlZCB0byBxc29ydCgpIHRvIHNvcnQgdmFyeWluZ3MgYnkgcGFja2luZ19jbGFzcyBhbmQKKyAqIHRoZW4gYnkgcGFja2luZ19vcmRlci4KKyAqLworaW50Cit2YXJ5aW5nX21hdGNoZXM6Om1hdGNoX2NvbXBhcmF0b3IoY29uc3Qgdm9pZCAqeF9nZW5lcmljLCBjb25zdCB2b2lkICp5X2dlbmVyaWMpCit7CisgICBjb25zdCBtYXRjaCAqeCA9IChjb25zdCBtYXRjaCAqKSB4X2dlbmVyaWM7CisgICBjb25zdCBtYXRjaCAqeSA9IChjb25zdCBtYXRjaCAqKSB5X2dlbmVyaWM7CisKKyAgIGlmICh4LT5wYWNraW5nX2NsYXNzICE9IHktPnBhY2tpbmdfY2xhc3MpCisgICAgICByZXR1cm4geC0+cGFja2luZ19jbGFzcyAtIHktPnBhY2tpbmdfY2xhc3M7CisgICByZXR1cm4geC0+cGFja2luZ19vcmRlciAtIHktPnBhY2tpbmdfb3JkZXI7Cit9CisKKworLyoqCisgKiBJcyB0aGUgZ2l2ZW4gdmFyaWFibGUgYSB2YXJ5aW5nIHZhcmlhYmxlIHRvIGJlIGNvdW50ZWQgYWdhaW5zdCB0aGUKKyAqIGxpbWl0IGluIGN0eC0+Q29uc3QuTWF4VmFyeWluZz8KKyAqIFRoaXMgaW5jbHVkZXMgdmFyaWFibGVzIHN1Y2ggYXMgdGV4Y29vcmRzLCBjb2xvcnMgYW5kIGdlbmVyaWMKKyAqIHZhcnlpbmdzLCBidXQgZXhjbHVkZXMgdmFyaWFibGVzIHN1Y2ggYXMgZ2xfRnJvbnRGYWNpbmcgYW5kIGdsX0ZyYWdDb29yZC4KKyAqLworc3RhdGljIGJvb2wKK2lzX3ZhcnlpbmdfdmFyKGdsX3NoYWRlcl9zdGFnZSBzdGFnZSwgY29uc3QgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIC8qIE9ubHkgZnJhZ21lbnQgc2hhZGVycyB3aWxsIHRha2UgYSB2YXJ5aW5nIHZhcmlhYmxlIGFzIGFuIGlucHV0ICovCisgICBpZiAoc3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQgJiYKKyAgICAgICB2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKSB7CisgICAgICBzd2l0Y2ggKHZhci0+ZGF0YS5sb2NhdGlvbikgeworICAgICAgY2FzZSBWQVJZSU5HX1NMT1RfUE9TOgorICAgICAgY2FzZSBWQVJZSU5HX1NMT1RfRkFDRToKKyAgICAgIGNhc2UgVkFSWUlOR19TTE9UX1BOVEM6CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICB9CisgICByZXR1cm4gZmFsc2U7Cit9CisKKworLyoqCisgKiBWaXNpdG9yIGNsYXNzIHRoYXQgZ2VuZXJhdGVzIHRmZWVkYmFja19jYW5kaWRhdGUgc3RydWN0cyBkZXNjcmliaW5nIGFsbAorICogcG9zc2libGUgdGFyZ2V0cyBvZiB0cmFuc2Zvcm0gZmVlZGJhY2suCisgKgorICogdGZlZWRiYWNrX2NhbmRpZGF0ZSBzdHJ1Y3RzIGFyZSBzdG9yZWQgaW4gdGhlIGhhc2ggdGFibGUKKyAqIHRmZWVkYmFja19jYW5kaWRhdGVzLCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiAgVGhpcyBoYXNoIHRhYmxlCisgKiBtYXBzIHZhcnlpbmcgbmFtZXMgdG8gaW5zdGFuY2VzIG9mIHRoZSB0ZmVlZGJhY2tfY2FuZGlkYXRlIHN0cnVjdC4KKyAqLworY2xhc3MgdGZlZWRiYWNrX2NhbmRpZGF0ZV9nZW5lcmF0b3IgOiBwdWJsaWMgcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yCit7CitwdWJsaWM6CisgICB0ZmVlZGJhY2tfY2FuZGlkYXRlX2dlbmVyYXRvcih2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF90YWJsZSAqdGZlZWRiYWNrX2NhbmRpZGF0ZXMpCisgICAgICA6IG1lbV9jdHgobWVtX2N0eCksCisgICAgICAgIHRmZWVkYmFja19jYW5kaWRhdGVzKHRmZWVkYmFja19jYW5kaWRhdGVzKSwKKyAgICAgICAgdG9wbGV2ZWxfdmFyKE5VTEwpLAorICAgICAgICB2YXJ5aW5nX2Zsb2F0cygwKQorICAgeworICAgfQorCisgICB2b2lkIHByb2Nlc3MoaXJfdmFyaWFibGUgKnZhcikKKyAgIHsKKyAgICAgIHRoaXMtPnRvcGxldmVsX3ZhciA9IHZhcjsKKyAgICAgIHRoaXMtPnZhcnlpbmdfZmxvYXRzID0gMDsKKyAgICAgIGlmICh2YXItPmlzX2ludGVyZmFjZV9pbnN0YW5jZSgpKQorICAgICAgICAgcHJvZ3JhbV9yZXNvdXJjZV92aXNpdG9yOjpwcm9jZXNzKHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKS0+bmFtZSk7CisgICAgICBlbHNlCisgICAgICAgICBwcm9ncmFtX3Jlc291cmNlX3Zpc2l0b3I6OnByb2Nlc3ModmFyKTsKKyAgIH0KKworcHJpdmF0ZToKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdF9maWVsZChjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByb3dfbWFqb3IpCisgICB7CisgICAgICBhc3NlcnQoIXR5cGUtPmlzX3JlY29yZCgpKTsKKyAgICAgIGFzc2VydCghKHR5cGUtPmlzX2FycmF5KCkgJiYgdHlwZS0+ZmllbGRzLmFycmF5LT5pc19yZWNvcmQoKSkpOworICAgICAgYXNzZXJ0KCF0eXBlLT5pc19pbnRlcmZhY2UoKSk7CisgICAgICBhc3NlcnQoISh0eXBlLT5pc19hcnJheSgpICYmIHR5cGUtPmZpZWxkcy5hcnJheS0+aXNfaW50ZXJmYWNlKCkpKTsKKworICAgICAgKHZvaWQpIHJvd19tYWpvcjsKKworICAgICAgdGZlZWRiYWNrX2NhbmRpZGF0ZSAqY2FuZGlkYXRlCisgICAgICAgICA9IHJ6YWxsb2ModGhpcy0+bWVtX2N0eCwgdGZlZWRiYWNrX2NhbmRpZGF0ZSk7CisgICAgICBjYW5kaWRhdGUtPnRvcGxldmVsX3ZhciA9IHRoaXMtPnRvcGxldmVsX3ZhcjsKKyAgICAgIGNhbmRpZGF0ZS0+dHlwZSA9IHR5cGU7CisgICAgICBjYW5kaWRhdGUtPm9mZnNldCA9IHRoaXMtPnZhcnlpbmdfZmxvYXRzOworICAgICAgaGFzaF90YWJsZV9pbnNlcnQodGhpcy0+dGZlZWRiYWNrX2NhbmRpZGF0ZXMsIGNhbmRpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbGxvY19zdHJkdXAodGhpcy0+bWVtX2N0eCwgbmFtZSkpOworICAgICAgdGhpcy0+dmFyeWluZ19mbG9hdHMgKz0gdHlwZS0+Y29tcG9uZW50X3Nsb3RzKCk7CisgICB9CisKKyAgIC8qKgorICAgICogTWVtb3J5IGNvbnRleHQgdXNlZCB0byBhbGxvY2F0ZSBoYXNoIHRhYmxlIGtleXMgYW5kIHZhbHVlcy4KKyAgICAqLworICAgdm9pZCAqIGNvbnN0IG1lbV9jdHg7CisKKyAgIC8qKgorICAgICogSGFzaCB0YWJsZSBpbiB3aGljaCB0ZmVlZGJhY2tfY2FuZGlkYXRlIG9iamVjdHMgc2hvdWxkIGJlIHN0b3JlZC4KKyAgICAqLworICAgaGFzaF90YWJsZSAqIGNvbnN0IHRmZWVkYmFja19jYW5kaWRhdGVzOworCisgICAvKioKKyAgICAqIFBvaW50ZXIgdG8gdGhlIHRvcGxldmVsIHZhcmlhYmxlIHRoYXQgaXMgYmVpbmcgdHJhdmVyc2VkLgorICAgICovCisgICBpcl92YXJpYWJsZSAqdG9wbGV2ZWxfdmFyOworCisgICAvKioKKyAgICAqIFRvdGFsIG51bWJlciBvZiB2YXJ5aW5nIGZsb2F0cyB0aGF0IGhhdmUgYmVlbiB2aXNpdGVkIHNvIGZhci4gIFRoaXMgaXMKKyAgICAqIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvZmZzZXQgdG8gZWFjaCB2YXJ5aW5nIHdpdGhpbiB0aGUgdG9wbGV2ZWwKKyAgICAqIHZhcmlhYmxlLgorICAgICovCisgICB1bnNpZ25lZCB2YXJ5aW5nX2Zsb2F0czsKK307CisKKworbmFtZXNwYWNlIGxpbmtlciB7CisKK2Jvb2wKK3BvcHVsYXRlX2NvbnN1bWVyX2lucHV0X3NldHModm9pZCAqbWVtX2N0eCwgZXhlY19saXN0ICppciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF90YWJsZSAqY29uc3VtZXJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3RhYmxlICpjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJpYWJsZSAqY29uc3VtZXJfaW5wdXRzX3dpdGhfbG9jYXRpb25zW1ZBUllJTkdfU0xPVF9NQVhdKQoreworICAgbWVtc2V0KGNvbnN1bWVyX2lucHV0c193aXRoX2xvY2F0aW9ucywKKyAgICAgICAgICAwLAorICAgICAgICAgIHNpemVvZihjb25zdW1lcl9pbnB1dHNfd2l0aF9sb2NhdGlvbnNbMF0pICogVkFSWUlOR19TTE9UX01BWCk7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCBpcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IGlucHV0X3ZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICgoaW5wdXRfdmFyICE9IE5VTEwpICYmIChpbnB1dF92YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX2luKSkgeworICAgICAgICAgaWYgKGlucHV0X3Zhci0+dHlwZS0+aXNfaW50ZXJmYWNlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgIGlmIChpbnB1dF92YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pIHsKKyAgICAgICAgICAgIC8qIGFzc2lnbl92YXJ5aW5nX2xvY2F0aW9ucyBvbmx5IGNhcmVzIGFib3V0IGZpbmRpbmcgdGhlCisgICAgICAgICAgICAgKiBpcl92YXJpYWJsZSBhdCB0aGUgc3RhcnQgb2YgYSBjb250aWd1b3VzIGxvY2F0aW9uIGJsb2NrLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICAtIEZvciAhcHJvZHVjZXIsIGNvbnN1bWVyX2lucHV0c193aXRoX2xvY2F0aW9ucyBpc24ndCB1c2VkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgICAtIEZvciAhY29uc3VtZXIsIGNvbnN1bWVyX2lucHV0c193aXRoX2xvY2F0aW9ucyBpcyBlbXB0eS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGb3IgY29uc3VtZXIgJiYgcHJvZHVjZXIsIGlmIHlvdSB3ZXJlIHRyeWluZyB0byBzZXQgc29tZQorICAgICAgICAgICAgICogaXJfdmFyaWFibGUgdG8gdGhlIG1pZGRsZSBvZiBhIGxvY2F0aW9uIGJsb2NrIG9uIHRoZSBvdGhlciBzaWRlCisgICAgICAgICAgICAgKiBvZiBwcm9kdWNlci9jb25zdW1lciwgY3Jvc3NfdmFsaWRhdGVfb3V0cHV0c190b19pbnB1dHMoKSBzaG91bGQKKyAgICAgICAgICAgICAqIGJlIGxpbmstZXJyb3JpbmcgZHVlIHRvIGVpdGhlciB0eXBlIG1pc21hdGNoIG9yIGxvY2F0aW9uCisgICAgICAgICAgICAgKiBvdmVybGFwcy4gIElmIHRoZSB2YXJpYWJsZXMgZG8gbWF0Y2ggdXAsIHRoZW4gdGhleSd2ZSBnb3QgYQorICAgICAgICAgICAgICogbWF0Y2hpbmcgZGF0YS5sb2NhdGlvbiBhbmQgeW91IG9ubHkgbG9va2VkIGF0CisgICAgICAgICAgICAgKiBjb25zdW1lcl9pbnB1dHNfd2l0aF9sb2NhdGlvbnNbdmFyLT5kYXRhLmxvY2F0aW9uXSwgbm90IGFueQorICAgICAgICAgICAgICogZm9sbG93aW5nIGVudHJpZXMgZm9yIHRoZSBhcnJheS9zdHJ1Y3R1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnN1bWVyX2lucHV0c193aXRoX2xvY2F0aW9uc1tpbnB1dF92YXItPmRhdGEubG9jYXRpb25dID0KKyAgICAgICAgICAgICAgIGlucHV0X3ZhcjsKKyAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRfdmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyICpjb25zdCBpZmFjZV9maWVsZF9uYW1lID0KKyAgICAgICAgICAgICAgIHJhbGxvY19hc3ByaW50ZihtZW1fY3R4LCAiJXMuJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3Zhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdmFyLT5uYW1lKTsKKyAgICAgICAgICAgIGhhc2hfdGFibGVfaW5zZXJ0KGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMsIGlucHV0X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlX2ZpZWxkX25hbWUpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhc2hfdGFibGVfaW5zZXJ0KGNvbnN1bWVyX2lucHV0cywgaW5wdXRfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFsbG9jX3N0cmR1cChtZW1fY3R4LCBpbnB1dF92YXItPm5hbWUpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogRmluZCBhIHZhcmlhYmxlIGZyb20gdGhlIGNvbnN1bWVyIHRoYXQgIm1hdGNoZXMiIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZmluZHMgaW5wdXRzIHdpdGggbmFtZXMgdGhhdCBtYXRjaC4gIFRoZXJlIGlzIG5vCisgKiB2YWxpZGF0aW9uIChoZXJlKSB0aGF0IHRoZSB0eXBlcywgZXRjLiBhcmUgY29tcGF0aWJsZS4KKyAqLworaXJfdmFyaWFibGUgKgorZ2V0X21hdGNoaW5nX2lucHV0KHZvaWQgKm1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaXJfdmFyaWFibGUgKm91dHB1dF92YXIsCisgICAgICAgICAgICAgICAgICAgaGFzaF90YWJsZSAqY29uc3VtZXJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGUgKmNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGUgKmNvbnN1bWVyX2lucHV0c193aXRoX2xvY2F0aW9uc1tWQVJZSU5HX1NMT1RfTUFYXSkKK3sKKyAgIGlyX3ZhcmlhYmxlICppbnB1dF92YXI7CisKKyAgIGlmIChvdXRwdXRfdmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKSB7CisgICAgICBpbnB1dF92YXIgPSBjb25zdW1lcl9pbnB1dHNfd2l0aF9sb2NhdGlvbnNbb3V0cHV0X3Zhci0+ZGF0YS5sb2NhdGlvbl07CisgICB9IGVsc2UgaWYgKG91dHB1dF92YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpICE9IE5VTEwpIHsKKyAgICAgIGNoYXIgKmNvbnN0IGlmYWNlX2ZpZWxkX25hbWUgPQorICAgICAgICAgcmFsbG9jX2FzcHJpbnRmKG1lbV9jdHgsICIlcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3Zhci0+Z2V0X2ludGVyZmFjZV90eXBlKCktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3Zhci0+bmFtZSk7CisgICAgICBpbnB1dF92YXIgPQorICAgICAgICAgKGlyX3ZhcmlhYmxlICopIGhhc2hfdGFibGVfZmluZChjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZV9maWVsZF9uYW1lKTsKKyAgIH0gZWxzZSB7CisgICAgICBpbnB1dF92YXIgPQorICAgICAgICAgKGlyX3ZhcmlhYmxlICopIGhhc2hfdGFibGVfZmluZChjb25zdW1lcl9pbnB1dHMsIG91dHB1dF92YXItPm5hbWUpOworICAgfQorCisgICByZXR1cm4gKGlucHV0X3ZhciA9PSBOVUxMIHx8IGlucHV0X3Zhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9zaGFkZXJfaW4pCisgICAgICA/IE5VTEwgOiBpbnB1dF92YXI7Cit9CisKK30KKworc3RhdGljIGludAoraW9fdmFyaWFibGVfY21wKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKyAgIGNvbnN0IGlyX3ZhcmlhYmxlICpjb25zdCBhID0gKihjb25zdCBpcl92YXJpYWJsZSAqKikgX2E7CisgICBjb25zdCBpcl92YXJpYWJsZSAqY29uc3QgYiA9ICooY29uc3QgaXJfdmFyaWFibGUgKiopIF9iOworCisgICBpZiAoYS0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbiAmJiBiLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKQorICAgICAgcmV0dXJuIGItPmRhdGEubG9jYXRpb24gLSBhLT5kYXRhLmxvY2F0aW9uOworCisgICBpZiAoYS0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbiAmJiAhYi0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbikKKyAgICAgIHJldHVybiAxOworCisgICBpZiAoIWEtPmRhdGEuZXhwbGljaXRfbG9jYXRpb24gJiYgYi0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbikKKyAgICAgIHJldHVybiAtMTsKKworICAgcmV0dXJuIC1zdHJjbXAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKKy8qKgorICogU29ydCB0aGUgc2hhZGVyIElPIHZhcmlhYmxlcyBpbnRvIGNhbm9uaWNhbCBvcmRlcgorICovCitzdGF0aWMgdm9pZAorY2Fub25pY2FsaXplX3NoYWRlcl9pbyhleGVjX2xpc3QgKmlyLCBlbnVtIGlyX3ZhcmlhYmxlX21vZGUgaW9fbW9kZSkKK3sKKyAgIGlyX3ZhcmlhYmxlICp2YXJfdGFibGVbTUFYX1BST0dSQU1fT1VUUFVUUyAqIDRdOworICAgdW5zaWduZWQgbnVtX3ZhcmlhYmxlcyA9IDA7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCBpcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICh2YXIgPT0gTlVMTCB8fCB2YXItPmRhdGEubW9kZSAhPSBpb19tb2RlKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBlbmNvdW50ZXJlZCBtb3JlIEkvTyB2YXJpYWJsZXMgdGhhdCBjb3VsZAorICAgICAgICogc3VjY2Vzc2Z1bGx5IGxpbmssIGJhaWwuCisgICAgICAgKi8KKyAgICAgIGlmIChudW1fdmFyaWFibGVzID09IEFSUkFZX1NJWkUodmFyX3RhYmxlKSkKKyAgICAgICAgIHJldHVybjsKKworICAgICAgdmFyX3RhYmxlW251bV92YXJpYWJsZXMrK10gPSB2YXI7CisgICB9CisKKyAgIGlmIChudW1fdmFyaWFibGVzID09IDApCisgICAgICByZXR1cm47CisKKyAgIC8qIFNvcnQgdGhlIGxpc3QgaW4gcmV2ZXJzZSBvcmRlciAoaW9fdmFyaWFibGVfY21wIGhhbmRsZXMgdGhpcykuICBMYXRlcgorICAgICogd2UncmUgZ29pbmcgdG8gcHVzaCB0aGUgdmFyaWFibGVzIG9uIHRvIHRoZSBJUiBsaXN0IGFzIGEgc3RhY2ssIHNvIHdlCisgICAgKiB3YW50IHRoZSBsYXN0IHZhcmlhYmxlIChpbiBjYW5vbmljYWwgb3JkZXIpIHRvIGJlIGZpcnN0IGluIHRoZSBsaXN0LgorICAgICovCisgICBxc29ydCh2YXJfdGFibGUsIG51bV92YXJpYWJsZXMsIHNpemVvZih2YXJfdGFibGVbMF0pLCBpb192YXJpYWJsZV9jbXApOworCisgICAvKiBSZW1vdmUgdGhlIHZhcmlhYmxlIGZyb20gaXQncyBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBJUiwgYW5kIHB1dCBpdCBhdAorICAgICogdGhlIGZyb250LgorICAgICovCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3ZhcmlhYmxlczsgaSsrKSB7CisgICAgICB2YXJfdGFibGVbaV0tPnJlbW92ZSgpOworICAgICAgaXItPnB1c2hfaGVhZCh2YXJfdGFibGVbaV0pOworICAgfQorfQorCisvKioKKyAqIEFzc2lnbiBsb2NhdGlvbnMgZm9yIGFsbCB2YXJpYWJsZXMgdGhhdCBhcmUgcHJvZHVjZWQgaW4gb25lIHBpcGVsaW5lIHN0YWdlCisgKiAodGhlICJwcm9kdWNlciIpIGFuZCBjb25zdW1lZCBpbiB0aGUgbmV4dCBzdGFnZSAodGhlICJjb25zdW1lciIpLgorICoKKyAqIFZhcmlhYmxlcyBwcm9kdWNlZCBieSB0aGUgcHJvZHVjZXIgbWF5IGFsc28gYmUgY29uc3VtZWQgYnkgdHJhbnNmb3JtCisgKiBmZWVkYmFjay4KKyAqCisgKiBccGFyYW0gbnVtX3RmZWVkYmFja19kZWNscyBpcyB0aGUgbnVtYmVyIG9mIGRlY2xhcmF0aW9ucyBpbmRpY2F0aW5nCisgKiAgICAgICAgdmFyaWFibGVzIHRoYXQgbWF5IGJlIGNvbnN1bWVkIGJ5IHRyYW5zZm9ybSBmZWVkYmFjay4KKyAqCisgKiBccGFyYW0gdGZlZWRiYWNrX2RlY2xzIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0ZmVlZGJhY2tfZGVjbCBvYmplY3RzCisgKiAgICAgICAgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgc3RyaW5ncyBwYXNzZWQgdG8KKyAqICAgICAgICBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MoKS4gIGFzc2lnbl9sb2NhdGlvbigpIHdpbGwgYmUgY2FsbGVkIGZvcgorICogICAgICAgIGVhY2ggb2YgdGhlc2Ugb2JqZWN0cyB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZSBvdXRwdXRzIG9mIHRoZQorICogICAgICAgIHByb2R1Y2VyLgorICoKKyAqIFxwYXJhbSBnc19pbnB1dF92ZXJ0aWNlczogaWYgXGMgY29uc3VtZXIgaXMgYSBnZW9tZXRyeSBzaGFkZXIsIHRoaXMgaXMgdGhlCisgKiAgICAgICAgbnVtYmVyIG9mIGlucHV0IHZlcnRpY2VzIGl0IGFjY2VwdHMuICBPdGhlcndpc2UgemVyby4KKyAqCisgKiBXaGVuIG51bV90ZmVlZGJhY2tfZGVjbHMgaXMgbm9uemVybywgaXQgaXMgcGVybWlzc2libGUgZm9yIHRoZSBjb25zdW1lciB0bworICogYmUgTlVMTC4gIEluIHRoaXMgY2FzZSwgdmFyeWluZyBsb2NhdGlvbnMgYXJlIGFzc2lnbmVkIHNvbGVseSBiYXNlZCBvbiB0aGUKKyAqIHJlcXVpcmVtZW50cyBvZiB0cmFuc2Zvcm0gZmVlZGJhY2suCisgKi8KK2Jvb2wKK2Fzc2lnbl92YXJ5aW5nX2xvY2F0aW9ucyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorCQkJIHZvaWQgKm1lbV9jdHgsCisJCQkgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorCQkJIGdsX3NoYWRlciAqcHJvZHVjZXIsIGdsX3NoYWRlciAqY29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3RmZWVkYmFja19kZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZmVlZGJhY2tfZGVjbCAqdGZlZWRiYWNrX2RlY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGdzX2lucHV0X3ZlcnRpY2VzKQoreworICAgdmFyeWluZ19tYXRjaGVzIG1hdGNoZXMoY3R4LT5Db25zdC5EaXNhYmxlVmFyeWluZ1BhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lciAmJiBjb25zdW1lci0+U3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpOworICAgaGFzaF90YWJsZSAqdGZlZWRiYWNrX2NhbmRpZGF0ZXMKKyAgICAgID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfc3RyaW5nX2hhc2gsIGhhc2hfdGFibGVfc3RyaW5nX2NvbXBhcmUpOworICAgaGFzaF90YWJsZSAqY29uc3VtZXJfaW5wdXRzCisgICAgICA9IGhhc2hfdGFibGVfY3RvcigwLCBoYXNoX3RhYmxlX3N0cmluZ19oYXNoLCBoYXNoX3RhYmxlX3N0cmluZ19jb21wYXJlKTsKKyAgIGhhc2hfdGFibGUgKmNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMKKyAgICAgID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfc3RyaW5nX2hhc2gsIGhhc2hfdGFibGVfc3RyaW5nX2NvbXBhcmUpOworICAgaXJfdmFyaWFibGUgKmNvbnN1bWVyX2lucHV0c193aXRoX2xvY2F0aW9uc1tWQVJZSU5HX1NMT1RfTUFYXSA9IHsKKyAgICAgIE5VTEwsCisgICB9OworCisgICAvKiBPcGVyYXRlIGluIGEgdG90YWwgb2YgZm91ciBwYXNzZXMuCisgICAgKgorICAgICogMS4gU29ydCBpbnB1dHMgLyBvdXRwdXRzIGludG8gYSBjYW5vbmljYWwgb3JkZXIuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbworICAgICogICAgdGhhdCBpbnB1dHMgLyBvdXRwdXRzIG9mIHNlcGFyYWJsZSBzaGFkZXJzIHdpbGwgYmUgYXNzaWduZWQKKyAgICAqICAgIHByZWRpY3RhYmxlIGxvY2F0aW9ucyByZWdhcmRsZXNzIG9mIHRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMKKyAgICAqICAgIGFwcGVhcmVkIGluIHRoZSBzaGFkZXIgc291cmNlLgorICAgICoKKyAgICAqIDIuIEFzc2lnbiBsb2NhdGlvbnMgZm9yIGFueSBtYXRjaGluZyBpbnB1dHMgYW5kIG91dHB1dHMuCisgICAgKgorICAgICogMy4gTWFyayBvdXRwdXQgdmFyaWFibGVzIGluIHRoZSBwcm9kdWNlciB0aGF0IGRvIG5vdCBoYXZlIGxvY2F0aW9ucyBhcworICAgICogICAgbm90IGJlaW5nIG91dHB1dHMuICBUaGlzIGxldHMgdGhlIG9wdGltaXplciBlbGltaW5hdGUgdGhlbS4KKyAgICAqCisgICAgKiA0LiBNYXJrIGlucHV0IHZhcmlhYmxlcyBpbiB0aGUgY29uc3VtZXIgdGhhdCBkbyBub3QgaGF2ZSBsb2NhdGlvbnMgYXMKKyAgICAqICAgIG5vdCBiZWluZyBpbnB1dHMuICBUaGlzIGxldHMgdGhlIG9wdGltaXplciBlbGltaW5hdGUgdGhlbS4KKyAgICAqLworICAgaWYgKGNvbnN1bWVyKQorICAgICAgY2Fub25pY2FsaXplX3NoYWRlcl9pbyhjb25zdW1lci0+aXIsIGlyX3Zhcl9zaGFkZXJfaW4pOworCisgICBpZiAocHJvZHVjZXIpCisgICAgICBjYW5vbmljYWxpemVfc2hhZGVyX2lvKHByb2R1Y2VyLT5pciwgaXJfdmFyX3NoYWRlcl9vdXQpOworCisgICBpZiAoY29uc3VtZXIKKyAgICAgICAmJiAhbGlua2VyOjpwb3B1bGF0ZV9jb25zdW1lcl9pbnB1dF9zZXRzKG1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lci0+aXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW5wdXRzX3dpdGhfbG9jYXRpb25zKSkgeworICAgICAgYXNzZXJ0KCEicG9wdWxhdGVfY29uc3VtZXJfaW5wdXRfc2V0cyBmYWlsZWQiKTsKKyAgICAgIGhhc2hfdGFibGVfZHRvcih0ZmVlZGJhY2tfY2FuZGlkYXRlcyk7CisgICAgICBoYXNoX3RhYmxlX2R0b3IoY29uc3VtZXJfaW5wdXRzKTsKKyAgICAgIGhhc2hfdGFibGVfZHRvcihjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgaWYgKHByb2R1Y2VyKSB7CisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgcHJvZHVjZXItPmlyKSB7CisgICAgICAgICBpcl92YXJpYWJsZSAqY29uc3Qgb3V0cHV0X3ZhciA9CisgICAgICAgICAgICAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICAgICBpZiAoKG91dHB1dF92YXIgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAob3V0cHV0X3Zhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9zaGFkZXJfb3V0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICB0ZmVlZGJhY2tfY2FuZGlkYXRlX2dlbmVyYXRvciBnKG1lbV9jdHgsIHRmZWVkYmFja19jYW5kaWRhdGVzKTsKKyAgICAgICAgIGcucHJvY2VzcyhvdXRwdXRfdmFyKTsKKworICAgICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IGlucHV0X3ZhciA9CisgICAgICAgICAgICBsaW5rZXI6OmdldF9tYXRjaGluZ19pbnB1dChtZW1fY3R4LCBvdXRwdXRfdmFyLCBjb25zdW1lcl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW5wdXRzX3dpdGhfbG9jYXRpb25zKTsKKworICAgICAgICAgLyogSWYgYSBtYXRjaGluZyBpbnB1dCB2YXJpYWJsZSB3YXMgZm91bmQsIGFkZCB0aGlzIG91cHR1dCAoYW5kIHRoZQorICAgICAgICAgICogaW5wdXQpIHRvIHRoZSBzZXQuICBJZiB0aGlzIGlzIGEgc2VwYXJhYmxlIHByb2dyYW0gYW5kIHRoZXJlIGlzIG5vCisgICAgICAgICAgKiBjb25zdW1lciBzdGFnZSwgYWRkIHRoZSBvdXRwdXQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmIChpbnB1dF92YXIgfHwgKHByb2ctPlNlcGFyYXRlU2hhZGVyICYmIGNvbnN1bWVyID09IE5VTEwpKSB7CisgICAgICAgICAgICBtYXRjaGVzLnJlY29yZChvdXRwdXRfdmFyLCBpbnB1dF92YXIpOworICAgICAgICAgfQorICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIC8qIElmIHRoZXJlJ3Mgbm8gcHJvZHVjZXIgc3RhZ2UsIHRoZW4gdGhpcyBtdXN0IGJlIGEgc2VwYXJhYmxlIHByb2dyYW0uCisgICAgICAgKiBGb3IgZXhhbXBsZSwgd2UgbWF5IGhhdmUgYSBwcm9ncmFtIHRoYXQgaGFzIGp1c3QgYSBmcmFnbWVudCBzaGFkZXIuCisgICAgICAgKiBMYXRlciB0aGlzIHByb2dyYW0gd2lsbCBiZSB1c2VkIHdpdGggc29tZSBhcmJpdHJhcnkgdmVydGV4IChvcgorICAgICAgICogZ2VvbWV0cnkpIHNoYWRlciBwcm9ncmFtLiAgVGhpcyBtZWFucyB0aGF0IGxvY2F0aW9ucyBtdXN0IGJlIGFzc2lnbmVkCisgICAgICAgKiBmb3IgYWxsIHRoZSBpbnB1dHMuCisgICAgICAgKi8KKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBjb25zdW1lci0+aXIpIHsKKyAgICAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCBpbnB1dF92YXIgPQorICAgICAgICAgICAgKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworICAgICAgICAgaWYgKChpbnB1dF92YXIgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAoaW5wdXRfdmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9pbikpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgbWF0Y2hlcy5yZWNvcmQoTlVMTCwgaW5wdXRfdmFyKTsKKyAgICAgIH0KKyAgIH0KKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV90ZmVlZGJhY2tfZGVjbHM7ICsraSkgeworICAgICAgaWYgKCF0ZmVlZGJhY2tfZGVjbHNbaV0uaXNfdmFyeWluZygpKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGNvbnN0IHRmZWVkYmFja19jYW5kaWRhdGUgKm1hdGNoZWRfY2FuZGlkYXRlCisgICAgICAgICA9IHRmZWVkYmFja19kZWNsc1tpXS5maW5kX2NhbmRpZGF0ZShwcm9nLCB0ZmVlZGJhY2tfY2FuZGlkYXRlcyk7CisKKyAgICAgIGlmIChtYXRjaGVkX2NhbmRpZGF0ZSA9PSBOVUxMKSB7CisgICAgICAgICBoYXNoX3RhYmxlX2R0b3IodGZlZWRiYWNrX2NhbmRpZGF0ZXMpOworICAgICAgICAgaGFzaF90YWJsZV9kdG9yKGNvbnN1bWVyX2lucHV0cyk7CisgICAgICAgICBoYXNoX3RhYmxlX2R0b3IoY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cyk7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChtYXRjaGVkX2NhbmRpZGF0ZS0+dG9wbGV2ZWxfdmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0KQorICAgICAgICAgbWF0Y2hlcy5yZWNvcmQobWF0Y2hlZF9jYW5kaWRhdGUtPnRvcGxldmVsX3ZhciwgTlVMTCk7CisgICB9CisKKyAgIGNvbnN0IHVuc2lnbmVkIHNsb3RzX3VzZWQgPSBtYXRjaGVzLmFzc2lnbl9sb2NhdGlvbnMoKTsKKyAgIG1hdGNoZXMuc3RvcmVfbG9jYXRpb25zKCk7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fdGZlZWRiYWNrX2RlY2xzOyArK2kpIHsKKyAgICAgIGlmICghdGZlZWRiYWNrX2RlY2xzW2ldLmlzX3ZhcnlpbmcoKSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoIXRmZWVkYmFja19kZWNsc1tpXS5hc3NpZ25fbG9jYXRpb24oY3R4LCBwcm9nKSkgeworICAgICAgICAgaGFzaF90YWJsZV9kdG9yKHRmZWVkYmFja19jYW5kaWRhdGVzKTsKKyAgICAgICAgIGhhc2hfdGFibGVfZHRvcihjb25zdW1lcl9pbnB1dHMpOworICAgICAgICAgaGFzaF90YWJsZV9kdG9yKGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMpOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorCisgICBoYXNoX3RhYmxlX2R0b3IodGZlZWRiYWNrX2NhbmRpZGF0ZXMpOworICAgaGFzaF90YWJsZV9kdG9yKGNvbnN1bWVyX2lucHV0cyk7CisgICBoYXNoX3RhYmxlX2R0b3IoY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cyk7CisKKyAgIGlmIChjdHgtPkNvbnN0LkRpc2FibGVWYXJ5aW5nUGFja2luZykgeworICAgICAgLyogVHJhbnNmb3JtIGZlZWRiYWNrIGNvZGUgYXNzdW1lcyB2YXJ5aW5ncyBhcmUgcGFja2VkLCBzbyBpZiB0aGUgZHJpdmVyCisgICAgICAgKiBoYXMgZGlzYWJsZWQgdmFyeWluZyBwYWNraW5nLCBtYWtlIHN1cmUgaXQgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc2Zvcm0KKyAgICAgICAqIGZlZWRiYWNrLgorICAgICAgICovCisgICAgICBhc3NlcnQoIWN0eC0+RXh0ZW5zaW9ucy5FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrKTsKKyAgIH0gZWxzZSB7CisgICAgICBpZiAocHJvZHVjZXIpIHsKKyAgICAgICAgIGxvd2VyX3BhY2tlZF92YXJ5aW5ncyhtZW1fY3R4LCBzbG90c191c2VkLCBpcl92YXJfc2hhZGVyX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBwcm9kdWNlcik7CisgICAgICB9CisgICAgICBpZiAoY29uc3VtZXIpIHsKKyAgICAgICAgIGxvd2VyX3BhY2tlZF92YXJ5aW5ncyhtZW1fY3R4LCBzbG90c191c2VkLCBpcl92YXJfc2hhZGVyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX2lucHV0X3ZlcnRpY2VzLCBjb25zdW1lcik7CisgICAgICB9CisgICB9CisKKyAgIGlmIChjb25zdW1lciAmJiBwcm9kdWNlcikgeworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsIGNvbnN1bWVyLT5pcikgeworICAgICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgICAgIGlmICh2YXIgJiYgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbiAmJgorICAgICAgICAgICAgIHZhci0+ZGF0YS5pc191bm1hdGNoZWRfZ2VuZXJpY19pbm91dCkgeworICAgICAgICAgICAgaWYgKHByb2ctPlZlcnNpb24gPD0gMTIwKSB7CisgICAgICAgICAgICAgICAvKiBPbiBwYWdlIDI1IChwYWdlIDMxIG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDEuMjAgc3BlYzoKKyAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgKiAgICAgT25seSB0aG9zZSB2YXJ5aW5nIHZhcmlhYmxlcyB1c2VkIChpLmUuIHJlYWQpIGluCisgICAgICAgICAgICAgICAgKiAgICAgdGhlIGZyYWdtZW50IHNoYWRlciBleGVjdXRhYmxlIG11c3QgYmUgd3JpdHRlbiB0bworICAgICAgICAgICAgICAgICogICAgIGJ5IHRoZSB2ZXJ0ZXggc2hhZGVyIGV4ZWN1dGFibGU7IGRlY2xhcmluZworICAgICAgICAgICAgICAgICogICAgIHN1cGVyZmx1b3VzIHZhcnlpbmcgdmFyaWFibGVzIGluIGEgdmVydGV4IHNoYWRlciBpcworICAgICAgICAgICAgICAgICogICAgIHBlcm1pc3NpYmxlLgorICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAqIFdlIGludGVycHJldCB0aGlzIHRleHQgYXMgbWVhbmluZyB0aGF0IHRoZSBWUyBtdXN0CisgICAgICAgICAgICAgICAgKiB3cml0ZSB0aGUgdmFyaWFibGUgZm9yIHRoZSBGUyB0byByZWFkIGl0LiAgU2VlCisgICAgICAgICAgICAgICAgKiAiZ2xzbDEtdmFyeWluZyByZWFkIGJ1dCBub3Qgd3JpdHRlbiIgaW4gcGlnbGl0LgorICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiJXMgc2hhZGVyIHZhcnlpbmcgJXMgbm90IHdyaXR0ZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieSAlcyBzaGFkZXJcbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoY29uc3VtZXItPlN0YWdlKSwKKwkJCSAgICB2YXItPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhwcm9kdWNlci0+U3RhZ2UpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQW4gJ2luJyB2YXJpYWJsZSBpcyBvbmx5IHJlYWxseSBhIHNoYWRlciBpbnB1dCBpZiBpdHMKKyAgICAgICAgICAgICAqIHZhbHVlIGlzIHdyaXR0ZW4gYnkgdGhlIHByZXZpb3VzIHN0YWdlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB2YXItPmRhdGEubW9kZSA9IGlyX3Zhcl9hdXRvOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAorY2hlY2tfYWdhaW5zdF9vdXRwdXRfbGltaXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlciAqcHJvZHVjZXIpCit7CisgICB1bnNpZ25lZCBvdXRwdXRfdmVjdG9ycyA9IDA7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCBwcm9kdWNlci0+aXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAodmFyICYmIHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0ICYmCisgICAgICAgICAgaXNfdmFyeWluZ192YXIocHJvZHVjZXItPlN0YWdlLCB2YXIpKSB7CisgICAgICAgICBvdXRwdXRfdmVjdG9ycyArPSB2YXItPnR5cGUtPmNvdW50X2F0dHJpYnV0ZV9zbG90cygpOworICAgICAgfQorICAgfQorCisgICBhc3NlcnQocHJvZHVjZXItPlN0YWdlICE9IE1FU0FfU0hBREVSX0ZSQUdNRU5UKTsKKyAgIHVuc2lnbmVkIG1heF9vdXRwdXRfY29tcG9uZW50cyA9CisgICAgICBjdHgtPkNvbnN0LlByb2dyYW1bcHJvZHVjZXItPlN0YWdlXS5NYXhPdXRwdXRDb21wb25lbnRzOworCisgICBjb25zdCB1bnNpZ25lZCBvdXRwdXRfY29tcG9uZW50cyA9IG91dHB1dF92ZWN0b3JzICogNDsKKyAgIGlmIChvdXRwdXRfY29tcG9uZW50cyA+IG1heF9vdXRwdXRfY29tcG9uZW50cykgeworICAgICAgaWYgKGN0eC0+QVBJID09IEFQSV9PUEVOR0xFUzIgfHwgcHJvZy0+SXNFUykKKyAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAic2hhZGVyIHVzZXMgdG9vIG1hbnkgb3V0cHV0IHZlY3RvcnMgIgorICAgICAgICAgICAgICAgICAgICAgICIoJXUgPiAldSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3ZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF9jb21wb25lbnRzIC8gNCk7CisgICAgICBlbHNlCisgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgInNoYWRlciB1c2VzIHRvbyBtYW55IG91dHB1dCBjb21wb25lbnRzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKCV1ID4gJXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgIG1heF9vdXRwdXRfY29tcG9uZW50cyk7CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2NoZWNrX2FnYWluc3RfaW5wdXRfbGltaXQoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXIgKmNvbnN1bWVyKQoreworICAgdW5zaWduZWQgaW5wdXRfdmVjdG9ycyA9IDA7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCBjb25zdW1lci0+aXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAodmFyICYmIHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4gJiYKKyAgICAgICAgICBpc192YXJ5aW5nX3Zhcihjb25zdW1lci0+U3RhZ2UsIHZhcikpIHsKKyAgICAgICAgIGlucHV0X3ZlY3RvcnMgKz0gdmFyLT50eXBlLT5jb3VudF9hdHRyaWJ1dGVfc2xvdHMoKTsKKyAgICAgIH0KKyAgIH0KKworICAgYXNzZXJ0KGNvbnN1bWVyLT5TdGFnZSAhPSBNRVNBX1NIQURFUl9WRVJURVgpOworICAgdW5zaWduZWQgbWF4X2lucHV0X2NvbXBvbmVudHMgPQorICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW2NvbnN1bWVyLT5TdGFnZV0uTWF4SW5wdXRDb21wb25lbnRzOworCisgICBjb25zdCB1bnNpZ25lZCBpbnB1dF9jb21wb25lbnRzID0gaW5wdXRfdmVjdG9ycyAqIDQ7CisgICBpZiAoaW5wdXRfY29tcG9uZW50cyA+IG1heF9pbnB1dF9jb21wb25lbnRzKSB7CisgICAgICBpZiAoY3R4LT5BUEkgPT0gQVBJX09QRU5HTEVTMiB8fCBwcm9nLT5Jc0VTKQorICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csICJzaGFkZXIgdXNlcyB0b28gbWFueSBpbnB1dCB2ZWN0b3JzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKCV1ID4gJXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3ZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgbWF4X2lucHV0X2NvbXBvbmVudHMgLyA0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAic2hhZGVyIHVzZXMgdG9vIG1hbnkgaW5wdXQgY29tcG9uZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgIigldSA+ICV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgIG1heF9pbnB1dF9jb21wb25lbnRzKTsKKworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua192YXJ5aW5ncy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rX3ZhcnlpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhMjY4MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua192YXJ5aW5ncy5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIEdMU0xfTElOS19WQVJZSU5HU19ICisjZGVmaW5lIEdMU0xfTElOS19WQVJZSU5HU19ICisKKy8qKgorICogXGZpbGUgbGlua192YXJ5aW5ncy5oCisgKgorICogTGlua2VyIGZ1bmN0aW9ucyByZWxhdGVkIHNwZWNpZmljYWxseSB0byBsaW5raW5nIHZhcnlpbmdzIGJldHdlZW4gc2hhZGVyCisgKiBzdGFnZXMuCisgKi8KKworCisjaW5jbHVkZSAibWFpbi9nbGhlYWRlci5oIgorCisKK3N0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbTsKK3N0cnVjdCBnbF9zaGFkZXI7CitjbGFzcyBpcl92YXJpYWJsZTsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSB2YXJ5aW5nIHdoaWNoIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGluIHRyYW5zZm9ybQorICogZmVlZGJhY2suCisgKgorICogRm9yIGV4YW1wbGUsIGlmIHRoZSB2ZXJ0ZXggc2hhZGVyIGNvbnRhaW5zOgorICoKKyAqICAgICBzdHJ1Y3QgUyB7CisgKiAgICAgICB2ZWM0IGZvbzsKKyAqICAgICAgIGZsb2F0WzNdIGJhcjsKKyAqICAgICB9OworICoKKyAqICAgICB2YXJ5aW5nIFNbMl0gdjsKKyAqCisgKiBUaGVuIHRoZXJlIHdvdWxkIGJlIHRmZWVkYmFja19jYW5kaWRhdGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogZm9sbG93aW5nIHZhcnlpbmdzOgorICoKKyAqICAgICB2WzBdLmZvbworICogICAgIHZbMF0uYmFyCisgKiAgICAgdlsxXS5mb28KKyAqICAgICB2WzFdLmJhcgorICovCitzdHJ1Y3QgdGZlZWRiYWNrX2NhbmRpZGF0ZQoreworICAgLyoqCisgICAgKiBUb3BsZXZlbCB2YXJpYWJsZSBjb250YWluaW5nIHRoaXMgdmFyeWluZy4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGlzCisgICAgKiB3b3VsZCBwb2ludCB0byB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHZhcnlpbmcgdi4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKnRvcGxldmVsX3ZhcjsKKworICAgLyoqCisgICAgKiBUeXBlIG9mIHRoaXMgdmFyeWluZy4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGlzIHdvdWxkIHBvaW50IHRvIHRoZQorICAgICogZ2xzbF90eXBlIGZvciAidmVjNCIgb3IgImZsb2F0WzNdIi4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICp0eXBlOworCisgICAvKioKKyAgICAqIE9mZnNldCB3aXRoaW4gdGhlIHRvcGxldmVsIHZhcmlhYmxlIHdoZXJlIHRoaXMgdmFyeWluZyBvY2N1cnMgKGNvdW50ZWQKKyAgICAqIGluIG11bHRpcGxlcyBvZiB0aGUgc2l6ZSBvZiBhIGZsb2F0KS4KKyAgICAqLworICAgdW5zaWduZWQgb2Zmc2V0OworfTsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHRyYWNraW5nIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmb3JtIGZlZWRiYWNrIGRlY2xhcmF0aW9uCisgKiBkdXJpbmcgbGlua2luZy4KKyAqLworY2xhc3MgdGZlZWRiYWNrX2RlY2wKK3sKK3B1YmxpYzoKKyAgIHZvaWQgaW5pdChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBjb25zdCB2b2lkICptZW1fY3R4LCBjb25zdCBjaGFyICppbnB1dCk7CisgICBzdGF0aWMgYm9vbCBpc19zYW1lKGNvbnN0IHRmZWVkYmFja19kZWNsICZ4LCBjb25zdCB0ZmVlZGJhY2tfZGVjbCAmeSk7CisgICBib29sIGFzc2lnbl9sb2NhdGlvbihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKKyAgIHVuc2lnbmVkIGdldF9udW1fb3V0cHV0cygpIGNvbnN0OworICAgYm9vbCBzdG9yZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgIHN0cnVjdCBnbF90cmFuc2Zvcm1fZmVlZGJhY2tfaW5mbyAqaW5mbywgdW5zaWduZWQgYnVmZmVyLAorICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBtYXhfb3V0cHV0cykgY29uc3Q7CisgICBjb25zdCB0ZmVlZGJhY2tfY2FuZGlkYXRlICpmaW5kX2NhbmRpZGF0ZShnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGUgKnRmZWVkYmFja19jYW5kaWRhdGVzKTsKKworICAgYm9vbCBpc19uZXh0X2J1ZmZlcl9zZXBhcmF0b3IoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIHRoaXMtPm5leHRfYnVmZmVyX3NlcGFyYXRvcjsKKyAgIH0KKworICAgYm9vbCBpc192YXJ5aW5nKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiAhdGhpcy0+bmV4dF9idWZmZXJfc2VwYXJhdG9yICYmICF0aGlzLT5za2lwX2NvbXBvbmVudHM7CisgICB9CisKKyAgIC8qKgorICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB2YXJ5aW5nIGNvbXBvbmVudHMgdGFrZW4gdXAgYnkgdGhpcyB2YXJpYWJsZS4gIE9ubHkKKyAgICAqIHZhbGlkIGlmIGFzc2lnbl9sb2NhdGlvbigpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAqLworICAgdW5zaWduZWQgbnVtX2NvbXBvbmVudHMoKSBjb25zdAorICAgeworICAgICAgaWYgKHRoaXMtPmlzX2NsaXBfZGlzdGFuY2VfbWVzYSkKKyAgICAgICAgIHJldHVybiB0aGlzLT5zaXplOworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIHRoaXMtPnZlY3Rvcl9lbGVtZW50cyAqIHRoaXMtPm1hdHJpeF9jb2x1bW5zICogdGhpcy0+c2l6ZTsKKyAgIH0KKworICAgdW5zaWduZWQgZ2V0X2xvY2F0aW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIHRoaXMtPmxvY2F0aW9uOworICAgfQorCitwcml2YXRlOgorICAgLyoqCisgICAgKiBUaGUgbmFtZSB0aGF0IHdhcyBzdXBwbGllZCB0byBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MuICBVc2VkIGZvcgorICAgICogZXJyb3IgcmVwb3J0aW5nIGFuZCBnbEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZygpLgorICAgICovCisgICBjb25zdCBjaGFyICpvcmlnX25hbWU7CisKKyAgIC8qKgorICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCBwYXJzZWQgZnJvbSBvcmlnX25hbWUuCisgICAgKi8KKyAgIGNvbnN0IGNoYXIgKnZhcl9uYW1lOworCisgICAvKioKKyAgICAqIFRydWUgaWYgdGhlIGRlY2xhcmF0aW9uIGluIG9yaWdfbmFtZSByZXByZXNlbnRzIGFuIGFycmF5LgorICAgICovCisgICBib29sIGlzX3N1YnNjcmlwdGVkOworCisgICAvKioKKyAgICAqIElmIGlzX3N1YnNjcmlwdGVkIGlzIHRydWUsIHRoZSBzdWJzY3JpcHQgdGhhdCB3YXMgc3BlY2lmaWVkIGluIG9yaWdfbmFtZS4KKyAgICAqLworICAgdW5zaWduZWQgYXJyYXlfc3Vic2NyaXB0OworCisgICAvKioKKyAgICAqIFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGdsX0NsaXBEaXN0YW5jZSBhbmQgdGhlIGRyaXZlciBsb3dlcnMKKyAgICAqIGdsX0NsaXBEaXN0YW5jZSB0byBnbF9DbGlwRGlzdGFuY2VNRVNBLgorICAgICovCisgICBib29sIGlzX2NsaXBfZGlzdGFuY2VfbWVzYTsKKworICAgLyoqCisgICAgKiBUaGUgdmVydGV4IHNoYWRlciBvdXRwdXQgbG9jYXRpb24gdGhhdCB0aGUgbGlua2VyIGFzc2lnbmVkIGZvciB0aGlzCisgICAgKiB2YXJpYWJsZS4gIC0xIGlmIGEgbG9jYXRpb24gaGFzbid0IGJlZW4gYXNzaWduZWQgeWV0LgorICAgICovCisgICBpbnQgbG9jYXRpb247CisKKyAgIC8qKgorICAgICogSWYgbm9uLXplcm8sIHRoZW4gdGhpcyB2YXJpYWJsZSBtYXkgYmUgcGFja2VkIGFsb25nIHdpdGggb3RoZXIgdmFyaWFibGVzCisgICAgKiBpbnRvIGEgc2luZ2xlIHZhcnlpbmcgc2xvdCwgc28gdGhpcyBvZmZzZXQgc2hvdWxkIGJlIGFwcGxpZWQgd2hlbgorICAgICogYWNjZXNzaW5nIGNvbXBvbmVudHMuICBGb3IgZXhhbXBsZSwgYW4gb2Zmc2V0IG9mIDEgbWVhbnMgdGhhdCB0aGUgeAorICAgICogY29tcG9uZW50IG9mIHRoaXMgdmFyaWFibGUgaXMgYWN0dWFsbHkgc3RvcmVkIGluIGNvbXBvbmVudCB5IG9mIHRoZQorICAgICogbG9jYXRpb24gc3BlY2lmaWVkIGJ5IFxjIGxvY2F0aW9uLgorICAgICoKKyAgICAqIE9ubHkgdmFsaWQgaWYgbG9jYXRpb24gIT0gLTEuCisgICAgKi8KKyAgIHVuc2lnbmVkIGxvY2F0aW9uX2ZyYWM7CisKKyAgIC8qKgorICAgICogSWYgbG9jYXRpb24gIT0gLTEsIHRoZSBudW1iZXIgb2YgdmVjdG9yIGVsZW1lbnRzIGluIHRoaXMgdmFyaWFibGUsIG9yIDEKKyAgICAqIGlmIHRoaXMgdmFyaWFibGUgaXMgYSBzY2FsYXIuCisgICAgKi8KKyAgIHVuc2lnbmVkIHZlY3Rvcl9lbGVtZW50czsKKworICAgLyoqCisgICAgKiBJZiBsb2NhdGlvbiAhPSAtMSwgdGhlIG51bWJlciBvZiBtYXRyaXggY29sdW1ucyBpbiB0aGlzIHZhcmlhYmxlLCBvciAxCisgICAgKiBpZiB0aGlzIHZhcmlhYmxlIGlzIG5vdCBhIG1hdHJpeC4KKyAgICAqLworICAgdW5zaWduZWQgbWF0cml4X2NvbHVtbnM7CisKKyAgIC8qKiBUeXBlIG9mIHRoZSB2YXJ5aW5nIHJldHVybmVkIGJ5IGdsR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nKCkgKi8KKyAgIEdMZW51bSB0eXBlOworCisgICAvKioKKyAgICAqIElmIGxvY2F0aW9uICE9IC0xLCB0aGUgc2l6ZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBieQorICAgICogZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoKS4KKyAgICAqLworICAgdW5zaWduZWQgc2l6ZTsKKworICAgLyoqCisgICAgKiBIb3cgbWFueSBjb21wb25lbnRzIHRvIHNraXAuIElmIG5vbi16ZXJvLCB0aGlzIGlzCisgICAgKiBnbF9Ta2lwQ29tcG9uZW50c3sxLDIsMyw0fSBmcm9tIEFSQl90cmFuc2Zvcm1fZmVlZGJhY2szLgorICAgICovCisgICB1bnNpZ25lZCBza2lwX2NvbXBvbmVudHM7CisKKyAgIC8qKgorICAgICogV2hldGhlciB0aGlzIGlzIGdsX05leHRCdWZmZXIgZnJvbSBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMy4KKyAgICAqLworICAgYm9vbCBuZXh0X2J1ZmZlcl9zZXBhcmF0b3I7CisKKyAgIC8qKgorICAgICogSWYgZmluZF9jYW5kaWRhdGUoKSBoYXMgYmVlbiBjYWxsZWQsIHBvaW50ZXIgdG8gdGhlIHRmZWVkYmFja19jYW5kaWRhdGUKKyAgICAqIGRhdGEgc3RydWN0dXJlIHRoYXQgd2FzIGZvdW5kLiAgT3RoZXJ3aXNlIE5VTEwuCisgICAgKi8KKyAgIGNvbnN0IHRmZWVkYmFja19jYW5kaWRhdGUgKm1hdGNoZWRfY2FuZGlkYXRlOworfTsKKworCit2b2lkCitjcm9zc192YWxpZGF0ZV9vdXRwdXRzX3RvX2lucHV0cyhzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisJCQkJIGdsX3NoYWRlciAqcHJvZHVjZXIsIGdsX3NoYWRlciAqY29uc3VtZXIpOworCitib29sCitwYXJzZV90ZmVlZGJhY2tfZGVjbHMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1lbV9jdHgsIHVuc2lnbmVkIG51bV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFyeWluZ19uYW1lcywgdGZlZWRiYWNrX2RlY2wgKmRlY2xzKTsKKworYm9vbAorc3RvcmVfdGZlZWRiYWNrX2luZm8oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3RmZWVkYmFja19kZWNscywKKyAgICAgICAgICAgICAgICAgICAgIHRmZWVkYmFja19kZWNsICp0ZmVlZGJhY2tfZGVjbHMpOworCitib29sCithc3NpZ25fdmFyeWluZ19sb2NhdGlvbnMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJCSB2b2lkICptZW1fY3R4LAorCQkJIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJCSBnbF9zaGFkZXIgKnByb2R1Y2VyLCBnbF9zaGFkZXIgKmNvbnN1bWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV90ZmVlZGJhY2tfZGVjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGZlZWRiYWNrX2RlY2wgKnRmZWVkYmFja19kZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBnc19pbnB1dF92ZXJ0aWNlcyk7CisKK2Jvb2wKK2NoZWNrX2FnYWluc3Rfb3V0cHV0X2xpbWl0KHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXIgKnByb2R1Y2VyKTsKKworYm9vbAorY2hlY2tfYWdhaW5zdF9pbnB1dF9saW1pdChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlciAqY29uc3VtZXIpOworCisjZW5kaWYgLyogR0xTTF9MSU5LX1ZBUllJTkdTX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua2VyLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTVjN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rZXIuY3BwCkBAIC0wLDAgKzEsMjY0NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgbGlua2VyLmNwcAorICogR0xTTCBsaW5rZXIgaW1wbGVtZW50YXRpb24KKyAqCisgKiBHaXZlbiBhIHNldCBvZiBzaGFkZXJzIHRoYXQgYXJlIHRvIGJlIGxpbmtlZCB0byBnZW5lcmF0ZSBhIGZpbmFsIHByb2dyYW0sCisgKiB0aGVyZSBhcmUgdGhyZWUgZGlzdGluY3Qgc3RhZ2VzLgorICoKKyAqIEluIHRoZSBmaXJzdCBzdGFnZSBzaGFkZXJzIGFyZSBwYXJ0aXRpb25lZCBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgc2hhZGVyCisgKiB0eXBlLiAgQWxsIHNoYWRlcnMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgKGUuZy4sIHZlcnRleCBzaGFkZXJzKSBhcmUgbGlua2VkCisgKiB0b2dldGhlci4KKyAqCisgKiAgIC0gVW5kZWZpbmVkIHJlZmVyZW5jZXMgaW4gZWFjaCBzaGFkZXIgYXJlIHJlc29sdmUgdG8gZGVmaW5pdGlvbnMgaW4KKyAqICAgICBhbm90aGVyIHNoYWRlci4KKyAqICAgLSBUeXBlcyBhbmQgcXVhbGlmaWVycyBvZiB1bmlmb3Jtcywgb3V0cHV0cywgYW5kIGdsb2JhbCB2YXJpYWJsZXMgZGVmaW5lZAorICogICAgIGluIG11bHRpcGxlIHNoYWRlcnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSB2ZXJpZmllZCB0byBiZSB0aGUgc2FtZS4KKyAqICAgLSBJbml0aWFsaXplcnMgZm9yIHVuaWZvcm1zIGFuZCBnbG9iYWwgdmFyaWFibGVzIGRlZmluZWQKKyAqICAgICBpbiBtdWx0aXBsZSBzaGFkZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgdmVyaWZpZWQgdG8gYmUgdGhlIHNhbWUuCisgKgorICogVGhlIHJlc3VsdCwgaW4gdGhlIHRlcm1pbm9sb2d5IG9mIHRoZSBHTFNMIHNwZWMsIGlzIGEgc2V0IG9mIHNoYWRlcgorICogZXhlY3V0YWJsZXMgZm9yIGVhY2ggcHJvY2Vzc2luZyB1bml0LgorICoKKyAqIEFmdGVyIHRoZSBmaXJzdCBzdGFnZSBpcyBjb21wbGV0ZSwgYSBzZXJpZXMgb2Ygc2VtYW50aWMgY2hlY2tzIGFyZSBwZXJmb3JtZWQKKyAqIG9uIGVhY2ggb2YgdGhlIHNoYWRlciBleGVjdXRhYmxlcy4KKyAqCisgKiAgIC0gRWFjaCBzaGFkZXIgZXhlY3V0YWJsZSBtdXN0IGRlZmluZSBhIFxjIG1haW4gZnVuY3Rpb24uCisgKiAgIC0gRWFjaCB2ZXJ0ZXggc2hhZGVyIGV4ZWN1dGFibGUgbXVzdCB3cml0ZSB0byBcYyBnbF9Qb3NpdGlvbi4KKyAqICAgLSBFYWNoIGZyYWdtZW50IHNoYWRlciBleGVjdXRhYmxlIG11c3Qgd3JpdGUgdG8gZWl0aGVyIFxjIGdsX0ZyYWdEYXRhIG9yCisgKiAgICAgXGMgZ2xfRnJhZ0NvbG9yLgorICoKKyAqIEluIHRoZSBmaW5hbCBzdGFnZSBpbmRpdmlkdWFsIHNoYWRlciBleGVjdXRhYmxlcyBhcmUgbGlua2VkIHRvIGNyZWF0ZSBhCisgKiBjb21wbGV0ZSBleGVjdHVhYmxlLgorICoKKyAqICAgLSBUeXBlcyBvZiB1bmlmb3JtcyBkZWZpbmVkIGluIG11bHRpcGxlIHNoYWRlciBzdGFnZXMgd2l0aCB0aGUgc2FtZSBuYW1lCisgKiAgICAgYXJlIHZlcmlmaWVkIHRvIGJlIHRoZSBzYW1lLgorICogICAtIEluaXRpYWxpemVycyBmb3IgdW5pZm9ybXMgZGVmaW5lZCBpbiBtdWx0aXBsZSBzaGFkZXIgc3RhZ2VzIHdpdGggdGhlCisgKiAgICAgc2FtZSBuYW1lIGFyZSB2ZXJpZmllZCB0byBiZSB0aGUgc2FtZS4KKyAqICAgLSBUeXBlcyBhbmQgcXVhbGlmaWVycyBvZiBvdXRwdXRzIGRlZmluZWQgaW4gb25lIHN0YWdlIGFyZSB2ZXJpZmllZCB0bworICogICAgIGJlIHRoZSBzYW1lIGFzIHRoZSB0eXBlcyBhbmQgcXVhbGlmaWVycyBvZiBpbnB1dHMgZGVmaW5lZCB3aXRoIHRoZSBzYW1lCisgKiAgICAgbmFtZSBpbiBhIGxhdGVyIHN0YWdlLgorICoKKyAqIFxhdXRob3IgSWFuIFJvbWFuaWNrIDxpYW4uZC5yb21hbmlja0BpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgImxpYmZucy5oIiAvLyBMdW5hckcgQUREOgorI2luY2x1ZGUgImdsc2xfc3ltYm9sX3RhYmxlLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAibGlua2VyLmgiCisjaW5jbHVkZSAibGlua192YXJ5aW5ncy5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImlyX3J2YWx1ZV92aXNpdG9yLmgiCisjaW5jbHVkZSAic3RhbmRhbG9uZV9zY2FmZm9sZGluZy5oIiAvLyBMdW5hckcgQUREOgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtYWluL2VudW1zLmgiCit9CisKK3ZvaWQgbGlua2VyX2Vycm9yKGdsX3NoYWRlcl9wcm9ncmFtICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBWaXNpdG9yIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIHZhcmlhYmxlIGlzIGV2ZXIgd3JpdHRlbi4KKyAqLworY2xhc3MgZmluZF9hc3NpZ25tZW50X3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgZmluZF9hc3NpZ25tZW50X3Zpc2l0b3IoY29uc3QgY2hhciAqbmFtZSkKKyAgICAgIDogbmFtZShuYW1lKSwgZm91bmQoZmFsc2UpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2Fzc2lnbm1lbnQgKmlyKQorICAgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IGlyLT5saHMtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKworICAgICAgaWYgKHN0cmNtcChuYW1lLCB2YXItPm5hbWUpID09IDApIHsKKwkgZm91bmQgPSB0cnVlOworCSByZXR1cm4gdmlzaXRfc3RvcDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKQorICAgeworICAgICAgZm9yZWFjaF90d29fbGlzdHMoZm9ybWFsX25vZGUsICZpci0+Y2FsbGVlLT5wYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX25vZGUsICZpci0+YWN0dWFsX3BhcmFtZXRlcnMpIHsKKwkgaXJfcnZhbHVlICpwYXJhbV9ydmFsID0gKGlyX3J2YWx1ZSAqKSBhY3R1YWxfbm9kZTsKKwkgaXJfdmFyaWFibGUgKnNpZ19wYXJhbSA9IChpcl92YXJpYWJsZSAqKSBmb3JtYWxfbm9kZTsKKworCSBpZiAoc2lnX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX291dCB8fAorCSAgICAgc2lnX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX2lub3V0KSB7CisJICAgIGlyX3ZhcmlhYmxlICp2YXIgPSBwYXJhbV9ydmFsLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisJICAgIGlmICh2YXIgJiYgc3RyY21wKG5hbWUsIHZhci0+bmFtZSkgPT0gMCkgeworCSAgICAgICBmb3VuZCA9IHRydWU7CisJICAgICAgIHJldHVybiB2aXNpdF9zdG9wOworCSAgICB9CisJIH0KKyAgICAgIH0KKworICAgICAgaWYgKGlyLT5yZXR1cm5fZGVyZWYgIT0gTlVMTCkgeworCSBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gaXItPnJldHVybl9kZXJlZi0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworCisJIGlmIChzdHJjbXAobmFtZSwgdmFyLT5uYW1lKSA9PSAwKSB7CisJICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgcmV0dXJuIHZpc2l0X3N0b3A7CisJIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworICAgfQorCisgICBib29sIHZhcmlhYmxlX2ZvdW5kKCkKKyAgIHsKKyAgICAgIHJldHVybiBmb3VuZDsKKyAgIH0KKworcHJpdmF0ZToKKyAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qKjwgRmluZCB3cml0ZXMgdG8gYSB2YXJpYWJsZSB3aXRoIHRoaXMgbmFtZS4gKi8KKyAgIGJvb2wgZm91bmQ7ICAgICAgICAgICAgIC8qKjwgV2FzIGEgd3JpdGUgdG8gdGhlIHZhcmlhYmxlIGZvdW5kPyAqLworfTsKKworCisvKioKKyAqIFZpc2l0b3IgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgdmFyaWFibGUgaXMgZXZlciByZWFkLgorICovCitjbGFzcyBmaW5kX2RlcmVmX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgZmluZF9kZXJlZl92aXNpdG9yKGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICA6IG5hbWUobmFtZSksIGZvdW5kKGZhbHNlKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqaXIpCisgICB7CisgICAgICBpZiAoc3RyY21wKHRoaXMtPm5hbWUsIGlyLT52YXItPm5hbWUpID09IDApIHsKKwkgdGhpcy0+Zm91bmQgPSB0cnVlOworCSByZXR1cm4gdmlzaXRfc3RvcDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCisgICBib29sIHZhcmlhYmxlX2ZvdW5kKCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiB0aGlzLT5mb3VuZDsKKyAgIH0KKworcHJpdmF0ZToKKyAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qKjwgRmluZCB3cml0ZXMgdG8gYSB2YXJpYWJsZSB3aXRoIHRoaXMgbmFtZS4gKi8KKyAgIGJvb2wgZm91bmQ7ICAgICAgICAgICAgIC8qKjwgV2FzIGEgd3JpdGUgdG8gdGhlIHZhcmlhYmxlIGZvdW5kPyAqLworfTsKKworCitjbGFzcyBnZW9tX2FycmF5X3Jlc2l6ZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIHVuc2lnbmVkIG51bV92ZXJ0aWNlczsKKyAgIGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nOworCisgICBnZW9tX2FycmF5X3Jlc2l6ZV92aXNpdG9yKHVuc2lnbmVkIG51bV92ZXJ0aWNlcywgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCisgICB7CisgICAgICB0aGlzLT5udW1fdmVydGljZXMgPSBudW1fdmVydGljZXM7CisgICAgICB0aGlzLT5wcm9nID0gcHJvZzsKKyAgIH0KKworICAgdmlydHVhbCB+Z2VvbV9hcnJheV9yZXNpemVfdmlzaXRvcigpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX3ZhcmlhYmxlICp2YXIpCisgICB7CisgICAgICBpZiAoIXZhci0+dHlwZS0+aXNfYXJyYXkoKSB8fCB2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfc2hhZGVyX2luKQorICAgICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICAgICB1bnNpZ25lZCBzaXplID0gdmFyLT50eXBlLT5sZW5ndGg7CisKKyAgICAgIC8qIEdlbmVyYXRlIGEgbGluayBlcnJvciBpZiB0aGUgc2hhZGVyIGhhcyBkZWNsYXJlZCB0aGlzIGFycmF5IHdpdGggYW4KKyAgICAgICAqIGluY29ycmVjdCBzaXplLgorICAgICAgICovCisgICAgICBpZiAoc2l6ZSAmJiBzaXplICE9IHRoaXMtPm51bV92ZXJ0aWNlcykgeworICAgICAgICAgbGlua2VyX2Vycm9yKHRoaXMtPnByb2csICJzaXplIG9mIGFycmF5ICVzIGRlY2xhcmVkIGFzICV1LCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ1dCBudW1iZXIgb2YgaW5wdXQgdmVydGljZXMgaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdmFyLT5uYW1lLCBzaXplLCB0aGlzLT5udW1fdmVydGljZXMpOworICAgICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBHZW5lcmF0ZSBhIGxpbmsgZXJyb3IgaWYgdGhlIHNoYWRlciBhdHRlbXB0cyB0byBhY2Nlc3MgYW4gaW5wdXQKKyAgICAgICAqIGFycmF5IHVzaW5nIGFuIGluZGV4IHRvbyBsYXJnZSBmb3IgaXRzIGFjdHVhbCBzaXplIGFzc2lnbmVkIGF0IGxpbmsKKyAgICAgICAqIHRpbWUuCisgICAgICAgKi8KKyAgICAgIGlmICh2YXItPmRhdGEubWF4X2FycmF5X2FjY2VzcyA+PSB0aGlzLT5udW1fdmVydGljZXMpIHsKKyAgICAgICAgIGxpbmtlcl9lcnJvcih0aGlzLT5wcm9nLCAiZ2VvbWV0cnkgc2hhZGVyIGFjY2Vzc2VzIGVsZW1lbnQgJWkgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICIlcywgYnV0IG9ubHkgJWkgaW5wdXQgdmVydGljZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MsIHZhci0+bmFtZSwgdGhpcy0+bnVtX3ZlcnRpY2VzKTsKKyAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdmFyLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UodmFyLT50eXBlLT5lbGVtZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPm51bV92ZXJ0aWNlcyk7CisgICAgICB2YXItPmRhdGEubWF4X2FycmF5X2FjY2VzcyA9IHRoaXMtPm51bV92ZXJ0aWNlcyAtIDE7CisKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgLyogRGVyZWZlcmVuY2VzIG9mIGlucHV0IHZhcmlhYmxlcyBuZWVkIHRvIGJlIHVwZGF0ZWQgc28gdGhhdCB0aGVpciB0eXBlCisgICAgKiBtYXRjaGVzIHRoZSBuZXdseSBhc3NpZ25lZCB0eXBlIG9mIHRoZSB2YXJpYWJsZSB0aGV5IGFyZSBhY2Nlc3NpbmcuICovCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKKyAgIHsKKyAgICAgIGlyLT50eXBlID0gaXItPnZhci0+dHlwZTsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgLyogRGVyZWZlcmVuY2VzIG9mIDJEIGlucHV0IGFycmF5cyBuZWVkIHRvIGJlIHVwZGF0ZWQgc28gdGhhdCB0aGVpciB0eXBlCisgICAgKiBtYXRjaGVzIHRoZSBuZXdseSBhc3NpZ25lZCB0eXBlIG9mIHRoZSBhcnJheSB0aGV5IGFyZSBhY2Nlc3NpbmcuICovCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKKyAgIHsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgdnQgPSBpci0+YXJyYXktPnR5cGU7CisgICAgICBpZiAodnQtPmlzX2FycmF5KCkpCisgICAgICAgICBpci0+dHlwZSA9IHZ0LT5lbGVtZW50X3R5cGUoKTsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KK307CisKKworLyoqCisgKiBWaXNpdG9yIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIHNoYWRlciB1c2VzIGlyX2VuZF9wcmltaXRpdmUuCisgKi8KK2NsYXNzIGZpbmRfZW5kX3ByaW1pdGl2ZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGZpbmRfZW5kX3ByaW1pdGl2ZV92aXNpdG9yKCkKKyAgICAgIDogZm91bmQoZmFsc2UpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2VuZF9wcmltaXRpdmUgKikKKyAgIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIHJldHVybiB2aXNpdF9zdG9wOworICAgfQorCisgICBib29sIGVuZF9wcmltaXRpdmVfZm91bmQoKQorICAgeworICAgICAgcmV0dXJuIGZvdW5kOworICAgfQorCitwcml2YXRlOgorICAgYm9vbCBmb3VuZDsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCit2b2lkCitsaW5rZXJfZXJyb3IoZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgdmFfbGlzdCBhcDsKKworICAgcmFsbG9jX3N0cmNhdCgmcHJvZy0+SW5mb0xvZywgImVycm9yOiAiKTsKKyAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgcmFsbG9jX3Zhc3ByaW50Zl9hcHBlbmQoJnByb2ctPkluZm9Mb2csIGZtdCwgYXApOworICAgdmFfZW5kKGFwKTsKKworICAgcHJvZy0+TGlua1N0YXR1cyA9IGZhbHNlOworfQorCisKK3ZvaWQKK2xpbmtlcl93YXJuaW5nKGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgIHZhX2xpc3QgYXA7CisKKyAgIHJhbGxvY19zdHJjYXQoJnByb2ctPkluZm9Mb2csICJ3YXJuaW5nOiAiKTsKKyAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgcmFsbG9jX3Zhc3ByaW50Zl9hcHBlbmQoJnByb2ctPkluZm9Mb2csIGZtdCwgYXApOworICAgdmFfZW5kKGFwKTsKKworfQorCisKKy8qKgorICogR2l2ZW4gYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBwcm9ncmFtIHJlc291cmNlLCBicmVhayBpdCBpbnRvIGEgYmFzZSBuYW1lCisgKiBhbmQgYW4gb3B0aW9uYWwgYXJyYXkgaW5kZXggaW4gc3F1YXJlIGJyYWNrZXRzLgorICoKKyAqIElmIGFuIGFycmF5IGluZGV4IGlzIHByZXNlbnQsIFxjIG91dF9iYXNlX25hbWVfZW5kIGlzIHNldCB0byBwb2ludCB0byB0aGUKKyAqICJbIiB0aGF0IHByZWNlZGVzIHRoZSBhcnJheSBpbmRleCwgYW5kIHRoZSBhcnJheSBpbmRleCBpdHNlbGYgaXMgcmV0dXJuZWQKKyAqIGFzIGEgbG9uZy4KKyAqCisgKiBJZiBubyBhcnJheSBpbmRleCBpcyBwcmVzZW50IChvciBpZiB0aGUgYXJyYXkgaW5kZXggaXMgbmVnYXRpdmUgb3IKKyAqIG1hbC1mb3JtZWQpLCBcYyBvdXRfYmFzZV9uYW1lX2VuZCwgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBudWxsIHRlcm1pbmF0b3IKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZywgYW5kIC0xIGlzIHJldHVybmVkLgorICoKKyAqIE9ubHkgdGhlIGZpbmFsIGFycmF5IGluZGV4IGlzIHBhcnNlZDsgaWYgdGhlIHN0cmluZyBjb250YWlucyBvdGhlciBhcnJheQorICogaW5kaWNlcyAob3Igc3RydWN0dXJlIGZpZWxkIGFjY2Vzc2VzKSwgdGhleSBhcmUgbGVmdCBpbiB0aGUgYmFzZSBuYW1lLgorICoKKyAqIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBjaGVjayB0aGF0IHRoZSBiYXNlIG5hbWUgaXMgcHJvcGVybHkgZm9ybWVkOworICogdHlwaWNhbGx5IHRoZSBjYWxsZXIgd2lsbCBsb29rIHVwIHRoZSBiYXNlIG5hbWUgaW4gYSBoYXNoIHRhYmxlLCBzbworICogaWxsLWZvcm1lZCBiYXNlIG5hbWVzIHNpbXBseSB0dXJuIGludG8gaGFzaCB0YWJsZSBsb29rdXAgZmFpbHVyZXMuCisgKi8KK2xvbmcKK3BhcnNlX3Byb2dyYW1fcmVzb3VyY2VfbmFtZShjb25zdCBHTGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xjaGFyICoqb3V0X2Jhc2VfbmFtZV9lbmQpCit7CisgICAvKiBTZWN0aW9uIDcuMy4xICgiUHJvZ3JhbSBJbnRlcmZhY2VzIikgb2YgdGhlIE9wZW5HTCA0LjMgc3BlYyBzYXlzOgorICAgICoKKyAgICAqICAgICAiV2hlbiBhbiBpbnRlZ2VyIGFycmF5IGVsZW1lbnQgb3IgYmxvY2sgaW5zdGFuY2UgbnVtYmVyIGlzIHBhcnQgb2YKKyAgICAqICAgICB0aGUgbmFtZSBzdHJpbmcsIGl0IHdpbGwgYmUgc3BlY2lmaWVkIGluIGRlY2ltYWwgZm9ybSB3aXRob3V0IGEgIisiCisgICAgKiAgICAgb3IgIi0iIHNpZ24gb3IgYW55IGV4dHJhIGxlYWRpbmcgemVyb2VzLiBBZGRpdGlvbmFsbHksIHRoZSBuYW1lCisgICAgKiAgICAgc3RyaW5nIHdpbGwgbm90IGluY2x1ZGUgd2hpdGUgc3BhY2UgYW55d2hlcmUgaW4gdGhlIHN0cmluZy4iCisgICAgKi8KKworICAgY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICpvdXRfYmFzZV9uYW1lX2VuZCA9IG5hbWUgKyBsZW47CisKKyAgIGlmIChsZW4gPT0gMCB8fCBuYW1lW2xlbi0xXSAhPSAnXScpCisgICAgICByZXR1cm4gLTE7CisKKyAgIC8qIFdhbGsgYmFja3dhcmRzIG92ZXIgdGhlIHN0cmluZyBsb29raW5nIGZvciBhIG5vbi1kaWdpdCBjaGFyYWN0ZXIuICBUaGlzCisgICAgKiBoYWQgYmV0dGVyIGJlIHRoZSBvcGVuaW5nIGJyYWNrZXQgZm9yIGFuIGFycmF5IGluZGV4LgorICAgICoKKyAgICAqIEluaXRpYWxseSwgaSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSAnXScuICBTaW5jZSB0aGUgc3RyaW5nIG1heQorICAgICogY29udGFpbiBvbmx5IHRoZSAnXScgY2hhcmNhdGVyLCB3YWxrIGJhY2t3YXJkcyB2ZXJ5IGNhcmVmdWxseS4KKyAgICAqLworICAgdW5zaWduZWQgaTsKKyAgIGZvciAoaSA9IGxlbiAtIDE7IChpID4gMCkgJiYgaXNkaWdpdChuYW1lW2ktMV0pOyAtLWkpCisgICAgICAvKiBlbXB0eSAqLyA7CisKKyAgIGlmICgoaSA9PSAwKSB8fCBuYW1lW2ktMV0gIT0gJ1snKQorICAgICAgcmV0dXJuIC0xOworCisgICBsb25nIGFycmF5X2luZGV4ID0gc3RydG9sKCZuYW1lW2ldLCBOVUxMLCAxMCk7CisgICBpZiAoYXJyYXlfaW5kZXggPCAwKQorICAgICAgcmV0dXJuIC0xOworCisgICAqb3V0X2Jhc2VfbmFtZV9lbmQgPSBuYW1lICsgKGkgLSAxKTsKKyAgIHJldHVybiBhcnJheV9pbmRleDsKK30KKworCit2b2lkCitsaW5rX2ludmFsaWRhdGVfdmFyaWFibGVfbG9jYXRpb25zKGV4ZWNfbGlzdCAqaXIpCit7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgaXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAodmFyID09IE5VTEwpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogT25seSBhc3NpZ24gbG9jYXRpb25zIGZvciB2YXJpYWJsZXMgdGhhdCBsYWNrIGFuIGV4cGxpY2l0IGxvY2F0aW9uLgorICAgICAgICogRXhwbGljaXQgbG9jYXRpb25zIGFyZSBzZXQgZm9yIGFsbCBidWlsdC1pbiB2YXJpYWJsZXMsIGdlbmVyaWMgdmVydGV4CisgICAgICAgKiBzaGFkZXIgaW5wdXRzICh2aWEgbGF5b3V0KGxvY2F0aW9uPS4uLikpLCBhbmQgZ2VuZXJpYyBmcmFnbWVudCBzaGFkZXIKKyAgICAgICAqIG91dHB1dHMgKGFsc28gdmlhIGxheW91dChsb2NhdGlvbj0uLi4pKS4KKyAgICAgICAqLworICAgICAgaWYgKCF2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pIHsKKyAgICAgICAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IC0xOworICAgICAgICAgdmFyLT5kYXRhLmxvY2F0aW9uX2ZyYWMgPSAwOworICAgICAgfQorCisgICAgICAvKiBpcl92YXJpYWJsZTo6aXNfdW5tYXRjaGVkX2dlbmVyaWNfaW5vdXQgaXMgdXNlZCBieSB0aGUgbGlua2VyIHdoaWxlCisgICAgICAgKiBjb25uZWN0aW5nIG91dHB1dHMgZnJvbSBvbmUgc3RhZ2UgdG8gaW5wdXRzIG9mIHRoZSBuZXh0IHN0YWdlLgorICAgICAgICoKKyAgICAgICAqIFRoZXJlIGFyZSB0d28gaW1wbGljaXQgYXNzdW1wdGlvbnMgaGVyZS4gIEZpcnN0LCB3ZSBhc3N1bWUgdGhhdCBhbnkKKyAgICAgICAqIGJ1aWx0LWluIHZhcmlhYmxlIChpLmUuLCBub24tZ2VuZXJpYyBpbiBvciBvdXQpIHdpbGwgaGF2ZQorICAgICAgICogZXhwbGljaXRfbG9jYXRpb24gc2V0LiAgU2Vjb25kLCB3ZSBhc3N1bWUgdGhhdCBhbnkgZ2VuZXJpYyBpbiBvciBvdXQKKyAgICAgICAqIHdpbGwgbm90IGhhdmUgZXhwbGljaXRfbG9jYXRpb24gc2V0LgorICAgICAgICoKKyAgICAgICAqIFRoaXMgc2Vjb25kIGFzc3VtcHRpb24gd2lsbCBvbmx5IGJlIHZhbGlkIHVudGlsCisgICAgICAgKiBHTF9BUkJfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMgaXMgc3VwcG9ydGVkLiAgV2hlbiB0aGF0IGV4dGVuc2lvbiBpcworICAgICAgICogaW1wbGVtZW50ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIHNvbWUgbW9kaWZpY2F0aW9ucy4KKyAgICAgICAqLworICAgICAgaWYgKCF2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pIHsKKyAgICAgICAgIHZhci0+ZGF0YS5pc191bm1hdGNoZWRfZ2VuZXJpY19pbm91dCA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICAgdmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0ID0gMDsKKyAgICAgIH0KKyAgIH0KK30KKworCisvKioKKyAqIFNldCBVc2VzQ2xpcERpc3RhbmNlIGFuZCBDbGlwRGlzdGFuY2VBcnJheVNpemUgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlci4KKyAqCisgKiBBbHNvIGNoZWNrIGZvciBlcnJvcnMgYmFzZWQgb24gaW5jb3JyZWN0IHVzYWdlIG9mIGdsX0NsaXBWZXJ0ZXggYW5kCisgKiBnbF9DbGlwRGlzdGFuY2UuCisgKgorICogUmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZC4KKyAqLworc3RhdGljIHZvaWQKK2FuYWx5emVfY2xpcF91c2FnZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyLCBHTGJvb2xlYW4gKlVzZXNDbGlwRGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgR0x1aW50ICpDbGlwRGlzdGFuY2VBcnJheVNpemUpCit7CisgICAqQ2xpcERpc3RhbmNlQXJyYXlTaXplID0gMDsKKworICAgaWYgKCFwcm9nLT5Jc0VTICYmIHByb2ctPlZlcnNpb24gPj0gMTMwKSB7CisgICAgICAvKiBGcm9tIHNlY3Rpb24gNy4xIChWZXJ0ZXggU2hhZGVyIFNwZWNpYWwgVmFyaWFibGVzKSBvZiB0aGUKKyAgICAgICAqIEdMU0wgMS4zMCBzcGVjOgorICAgICAgICoKKyAgICAgICAqICAgIkl0IGlzIGFuIGVycm9yIGZvciBhIHNoYWRlciB0byBzdGF0aWNhbGx5IHdyaXRlIGJvdGgKKyAgICAgICAqICAgZ2xfQ2xpcFZlcnRleCBhbmQgZ2xfQ2xpcERpc3RhbmNlLiIKKyAgICAgICAqCisgICAgICAgKiBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIEdMU0wgRVMgc2hhZGVycywgc2luY2UgR0xTTCBFUyBkZWZpbmVzIG5laXRoZXIKKyAgICAgICAqIGdsX0NsaXBWZXJ0ZXggbm9yIGdsX0NsaXBEaXN0YW5jZS4KKyAgICAgICAqLworICAgICAgZmluZF9hc3NpZ25tZW50X3Zpc2l0b3IgY2xpcF92ZXJ0ZXgoImdsX0NsaXBWZXJ0ZXgiKTsKKyAgICAgIGZpbmRfYXNzaWdubWVudF92aXNpdG9yIGNsaXBfZGlzdGFuY2UoImdsX0NsaXBEaXN0YW5jZSIpOworCisgICAgICBjbGlwX3ZlcnRleC5ydW4oc2hhZGVyLT5pcik7CisgICAgICBjbGlwX2Rpc3RhbmNlLnJ1bihzaGFkZXItPmlyKTsKKyAgICAgIGlmIChjbGlwX3ZlcnRleC52YXJpYWJsZV9mb3VuZCgpICYmIGNsaXBfZGlzdGFuY2UudmFyaWFibGVfZm91bmQoKSkgeworICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csICIlcyBzaGFkZXIgd3JpdGVzIHRvIGJvdGggYGdsX0NsaXBWZXJ0ZXgnICIKKyAgICAgICAgICAgICAgICAgICAgICAiYW5kIGBnbF9DbGlwRGlzdGFuY2UnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoc2hhZGVyLT5TdGFnZSkpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgKlVzZXNDbGlwRGlzdGFuY2UgPSBjbGlwX2Rpc3RhbmNlLnZhcmlhYmxlX2ZvdW5kKCk7CisgICAgICBpcl92YXJpYWJsZSAqY2xpcF9kaXN0YW5jZV92YXIgPQorICAgICAgICAgc2hhZGVyLT5zeW1ib2xzLT5nZXRfdmFyaWFibGUoImdsX0NsaXBEaXN0YW5jZSIpOworICAgICAgaWYgKGNsaXBfZGlzdGFuY2VfdmFyKQorICAgICAgICAgKkNsaXBEaXN0YW5jZUFycmF5U2l6ZSA9IGNsaXBfZGlzdGFuY2VfdmFyLT50eXBlLT5sZW5ndGg7CisgICB9IGVsc2UgeworICAgICAgKlVzZXNDbGlwRGlzdGFuY2UgPSBmYWxzZTsKKyAgIH0KK30KKworCisvKioKKyAqIFZlcmlmeSB0aGF0IGEgdmVydGV4IHNoYWRlciBleGVjdXRhYmxlIG1lZXRzIGFsbCBzZW1hbnRpYyByZXF1aXJlbWVudHMuCisgKgorICogQWxzbyBzZXRzIHByb2ctPlZlcnQuVXNlc0NsaXBEaXN0YW5jZSBhbmQgcHJvZy0+VmVydC5DbGlwRGlzdGFuY2VBcnJheVNpemUKKyAqIGFzIGEgc2lkZSBlZmZlY3QuCisgKgorICogXHBhcmFtIHNoYWRlciAgVmVydGV4IHNoYWRlciBleGVjdXRhYmxlIHRvIGJlIHZlcmlmaWVkCisgKi8KK3ZvaWQKK3ZhbGlkYXRlX3ZlcnRleF9zaGFkZXJfZXhlY3V0YWJsZShzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisJCQkJICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIpCit7CisgICBpZiAoc2hhZGVyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIC8qIEZyb20gdGhlIEdMU0wgMS4xMCBzcGVjLCBwYWdlIDQ4OgorICAgICoKKyAgICAqICAgICAiVGhlIHZhcmlhYmxlIGdsX1Bvc2l0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGluIHRoZSB2ZXJ0ZXgKKyAgICAqICAgICAgbGFuZ3VhZ2UgYW5kIGlzIGludGVuZGVkIGZvciB3cml0aW5nIHRoZSBob21vZ2VuZW91cyB2ZXJ0ZXgKKyAgICAqICAgICAgcG9zaXRpb24uIEFsbCBleGVjdXRpb25zIG9mIGEgd2VsbC1mb3JtZWQgdmVydGV4IHNoYWRlcgorICAgICogICAgICBleGVjdXRhYmxlIG11c3Qgd3JpdGUgYSB2YWx1ZSBpbnRvIHRoaXMgdmFyaWFibGUuIFsuLi5dIFRoZQorICAgICogICAgICB2YXJpYWJsZSBnbF9Qb3NpdGlvbiBpcyBhdmFpbGFibGUgb25seSBpbiB0aGUgdmVydGV4CisgICAgKiAgICAgIGxhbmd1YWdlIGFuZCBpcyBpbnRlbmRlZCBmb3Igd3JpdGluZyB0aGUgaG9tb2dlbmVvdXMgdmVydGV4CisgICAgKiAgICAgIHBvc2l0aW9uLiBBbGwgZXhlY3V0aW9ucyBvZiBhIHdlbGwtZm9ybWVkIHZlcnRleCBzaGFkZXIKKyAgICAqICAgICAgZXhlY3V0YWJsZSBtdXN0IHdyaXRlIGEgdmFsdWUgaW50byB0aGlzIHZhcmlhYmxlLiIKKyAgICAqCisgICAgKiB3aGlsZSBpbiBHTFNMIDEuNDAgdGhpcyB0ZXh0IGlzIGNoYW5nZWQgdG86CisgICAgKgorICAgICogICAgICJUaGUgdmFyaWFibGUgZ2xfUG9zaXRpb24gaXMgYXZhaWxhYmxlIG9ubHkgaW4gdGhlIHZlcnRleAorICAgICogICAgICBsYW5ndWFnZSBhbmQgaXMgaW50ZW5kZWQgZm9yIHdyaXRpbmcgdGhlIGhvbW9nZW5lb3VzIHZlcnRleAorICAgICogICAgICBwb3NpdGlvbi4gSXQgY2FuIGJlIHdyaXR0ZW4gYXQgYW55IHRpbWUgZHVyaW5nIHNoYWRlcgorICAgICogICAgICBleGVjdXRpb24uIEl0IG1heSBhbHNvIGJlIHJlYWQgYmFjayBieSBhIHZlcnRleCBzaGFkZXIKKyAgICAqICAgICAgYWZ0ZXIgYmVpbmcgd3JpdHRlbi4gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgYnkgcHJpbWl0aXZlCisgICAgKiAgICAgIGFzc2VtYmx5LCBjbGlwcGluZywgY3VsbGluZywgYW5kIG90aGVyIGZpeGVkIGZ1bmN0aW9uYWxpdHkKKyAgICAqICAgICAgb3BlcmF0aW9ucywgaWYgcHJlc2VudCwgdGhhdCBvcGVyYXRlIG9uIHByaW1pdGl2ZXMgYWZ0ZXIKKyAgICAqICAgICAgdmVydGV4IHByb2Nlc3NpbmcgaGFzIG9jY3VycmVkLiBJdHMgdmFsdWUgaXMgdW5kZWZpbmVkIGlmCisgICAgKiAgICAgIHRoZSB2ZXJ0ZXggc2hhZGVyIGV4ZWN1dGFibGUgZG9lcyBub3Qgd3JpdGUgZ2xfUG9zaXRpb24uIgorICAgICoKKyAgICAqIEdMU0wgRVMgMy4wMCBpcyBzaW1pbGFyIHRvIEdMU0wgMS40MC0tZmFpbGluZyB0byB3cml0ZSB0byBnbF9Qb3NpdGlvbiBpcworICAgICogbm90IGFuIGVycm9yLgorICAgICovCisgICBpZiAocHJvZy0+VmVyc2lvbiA8IChwcm9nLT5Jc0VTID8gMzAwIDogMTQwKSkgeworICAgICAgZmluZF9hc3NpZ25tZW50X3Zpc2l0b3IgZmluZCgiZ2xfUG9zaXRpb24iKTsKKyAgICAgIGZpbmQucnVuKHNoYWRlci0+aXIpOworICAgICAgaWYgKCFmaW5kLnZhcmlhYmxlX2ZvdW5kKCkpIHsKKwkgbGlua2VyX2Vycm9yKHByb2csICJ2ZXJ0ZXggc2hhZGVyIGRvZXMgbm90IHdyaXRlIHRvIGBnbF9Qb3NpdGlvbidcbiIpOworCSByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIGFuYWx5emVfY2xpcF91c2FnZShwcm9nLCBzaGFkZXIsICZwcm9nLT5WZXJ0LlVzZXNDbGlwRGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgJnByb2ctPlZlcnQuQ2xpcERpc3RhbmNlQXJyYXlTaXplKTsKK30KKworCisvKioKKyAqIFZlcmlmeSB0aGF0IGEgZnJhZ21lbnQgc2hhZGVyIGV4ZWN1dGFibGUgbWVldHMgYWxsIHNlbWFudGljIHJlcXVpcmVtZW50cworICoKKyAqIFxwYXJhbSBzaGFkZXIgIEZyYWdtZW50IHNoYWRlciBleGVjdXRhYmxlIHRvIGJlIHZlcmlmaWVkCisgKi8KK3ZvaWQKK3ZhbGlkYXRlX2ZyYWdtZW50X3NoYWRlcl9leGVjdXRhYmxlKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJCQkgICAgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyKQoreworICAgaWYgKHNoYWRlciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBmaW5kX2Fzc2lnbm1lbnRfdmlzaXRvciBmcmFnX2NvbG9yKCJnbF9GcmFnQ29sb3IiKTsKKyAgIGZpbmRfYXNzaWdubWVudF92aXNpdG9yIGZyYWdfZGF0YSgiZ2xfRnJhZ0RhdGEiKTsKKworICAgZnJhZ19jb2xvci5ydW4oc2hhZGVyLT5pcik7CisgICBmcmFnX2RhdGEucnVuKHNoYWRlci0+aXIpOworCisgICBpZiAoZnJhZ19jb2xvci52YXJpYWJsZV9mb3VuZCgpICYmIGZyYWdfZGF0YS52YXJpYWJsZV9mb3VuZCgpKSB7CisgICAgICBsaW5rZXJfZXJyb3IocHJvZywgICJmcmFnbWVudCBzaGFkZXIgd3JpdGVzIHRvIGJvdGggIgorCQkgICAiYGdsX0ZyYWdDb2xvcicgYW5kIGBnbF9GcmFnRGF0YSdcbiIpOworICAgfQorfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IGEgZ2VvbWV0cnkgc2hhZGVyIGV4ZWN1dGFibGUgbWVldHMgYWxsIHNlbWFudGljIHJlcXVpcmVtZW50cworICoKKyAqIEFsc28gc2V0cyBwcm9nLT5HZW9tLlZlcnRpY2VzSW4sIHByb2ctPkdlb20uVXNlc0NsaXBEaXN0YW5jZSwgYW5kCisgKiBwcm9nLT5HZW9tLkNsaXBEaXN0YW5jZUFycmF5U2l6ZSBhcyBhIHNpZGUgZWZmZWN0LgorICoKKyAqIFxwYXJhbSBzaGFkZXIgR2VvbWV0cnkgc2hhZGVyIGV4ZWN1dGFibGUgdG8gYmUgdmVyaWZpZWQKKyAqLwordm9pZAordmFsaWRhdGVfZ2VvbWV0cnlfc2hhZGVyX2V4ZWN1dGFibGUoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorCQkJCSAgICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIpCit7CisgICBpZiAoc2hhZGVyID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgIHVuc2lnbmVkIG51bV92ZXJ0aWNlcyA9IHZlcnRpY2VzX3Blcl9wcmltKHByb2ctPkdlb20uSW5wdXRUeXBlKTsKKyAgIHByb2ctPkdlb20uVmVydGljZXNJbiA9IG51bV92ZXJ0aWNlczsKKworICAgYW5hbHl6ZV9jbGlwX3VzYWdlKHByb2csIHNoYWRlciwgJnByb2ctPkdlb20uVXNlc0NsaXBEaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAmcHJvZy0+R2VvbS5DbGlwRGlzdGFuY2VBcnJheVNpemUpOworCisgICBmaW5kX2VuZF9wcmltaXRpdmVfdmlzaXRvciBlbmRfcHJpbWl0aXZlOworICAgZW5kX3ByaW1pdGl2ZS5ydW4oc2hhZGVyLT5pcik7CisgICBwcm9nLT5HZW9tLlVzZXNFbmRQcmltaXRpdmUgPSBlbmRfcHJpbWl0aXZlLmVuZF9wcmltaXRpdmVfZm91bmQoKTsKK30KKworCisvKioKKyAqIFBlcmZvcm0gdmFsaWRhdGlvbiBvZiBnbG9iYWwgdmFyaWFibGVzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNoYWRlcnMKKyAqLwordm9pZAorY3Jvc3NfdmFsaWRhdGVfZ2xvYmFscyhzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisJCSAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyICoqc2hhZGVyX2xpc3QsCisJCSAgICAgICB1bnNpZ25lZCBudW1fc2hhZGVycywKKwkJICAgICAgIGJvb2wgdW5pZm9ybXNfb25seSkKK3sKKyAgIC8qIEV4YW1pbmUgYWxsIG9mIHRoZSB1bmlmb3JtcyBpbiBhbGwgb2YgdGhlIHNoYWRlcnMgYW5kIGNyb3NzIHZhbGlkYXRlCisgICAgKiB0aGVtLgorICAgICovCisgICBnbHNsX3N5bWJvbF90YWJsZSB2YXJpYWJsZXM7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3NoYWRlcnM7IGkrKykgeworICAgICAgaWYgKHNoYWRlcl9saXN0W2ldID09IE5VTEwpCisJIGNvbnRpbnVlOworCisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgc2hhZGVyX2xpc3RbaV0tPmlyKSB7CisJIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisJIGlmICh2YXIgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkgaWYgKHVuaWZvcm1zX29ubHkgJiYgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl91bmlmb3JtKSkKKwkgICAgY29udGludWU7CisKKwkgLyogRG9uJ3QgY3Jvc3MgdmFsaWRhdGUgdGVtcG9yYXJpZXMgdGhhdCBhcmUgYXQgZ2xvYmFsIHNjb3BlLiAgVGhlc2UKKwkgICogd2lsbCBldmVudHVhbGx5IGdldCBwdWxsZWQgaW50byB0aGUgc2hhZGVycyAnbWFpbicuCisJICAqLworCSBpZiAodmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3RlbXBvcmFyeSkKKwkgICAgY29udGludWU7CisKKwkgLyogSWYgYSBnbG9iYWwgd2l0aCB0aGlzIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBzZWVuLCB2ZXJpZnkgdGhhdCB0aGUKKwkgICogbmV3IGluc3RhbmNlIGhhcyB0aGUgc2FtZSB0eXBlLiAgSW4gYWRkaXRpb24sIGlmIHRoZSBnbG9iYWxzIGhhdmUKKwkgICogaW5pdGlhbGl6ZXJzLCB0aGUgdmFsdWVzIG9mIHRoZSBpbml0aWFsaXplcnMgbXVzdCBiZSB0aGUgc2FtZS4KKwkgICovCisJIGlyX3ZhcmlhYmxlICpjb25zdCBleGlzdGluZyA9IHZhcmlhYmxlcy5nZXRfdmFyaWFibGUodmFyLT5uYW1lKTsKKwkgaWYgKGV4aXN0aW5nICE9IE5VTEwpIHsKKwkgICAgaWYgKHZhci0+dHlwZSAhPSBleGlzdGluZy0+dHlwZSkgeworCSAgICAgICAvKiBDb25zaWRlciB0aGUgdHlwZXMgdG8gYmUgInRoZSBzYW1lIiBpZiBib3RoIHR5cGVzIGFyZSBhcnJheXMKKwkJKiBvZiB0aGUgc2FtZSB0eXBlIGFuZCBvbmUgb2YgdGhlIGFycmF5cyBpcyBpbXBsaWNpdGx5IHNpemVkLgorCQkqIEluIGFkZGl0aW9uLCBzZXQgdGhlIHR5cGUgb2YgdGhlIGxpbmtlZCB2YXJpYWJsZSB0byB0aGUKKwkJKiBleHBsaWNpdGx5IHNpemVkIGFycmF5LgorCQkqLworCSAgICAgICBpZiAodmFyLT50eXBlLT5pc19hcnJheSgpCisJCSAgICYmIGV4aXN0aW5nLT50eXBlLT5pc19hcnJheSgpCisJCSAgICYmICh2YXItPnR5cGUtPmZpZWxkcy5hcnJheSA9PSBleGlzdGluZy0+dHlwZS0+ZmllbGRzLmFycmF5KQorCQkgICAmJiAoKHZhci0+dHlwZS0+bGVuZ3RoID09IDApCisJCSAgICAgICB8fCAoZXhpc3RpbmctPnR5cGUtPmxlbmd0aCA9PSAwKSkpIHsKKwkJICBpZiAodmFyLT50eXBlLT5sZW5ndGggIT0gMCkgeworCQkgICAgIGV4aXN0aW5nLT50eXBlID0gdmFyLT50eXBlOworCQkgIH0KKyAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFyLT50eXBlLT5pc19yZWNvcmQoKQorCQkgICAmJiBleGlzdGluZy0+dHlwZS0+aXNfcmVjb3JkKCkKKwkJICAgJiYgZXhpc3RpbmctPnR5cGUtPnJlY29yZF9jb21wYXJlKHZhci0+dHlwZSkpIHsKKwkJICBleGlzdGluZy0+dHlwZSA9IHZhci0+dHlwZTsKKwkgICAgICAgfSBlbHNlIHsKKwkJICBsaW5rZXJfZXJyb3IocHJvZywgIiVzIGAlcycgZGVjbGFyZWQgYXMgdHlwZSAiCisJCQkgICAgICAgImAlcycgYW5kIHR5cGUgYCVzJ1xuIiwKKwkJCSAgICAgICBtb2RlX3N0cmluZyh2YXIpLAorCQkJICAgICAgIHZhci0+bmFtZSwgdmFyLT50eXBlLT5uYW1lLAorCQkJICAgICAgIGV4aXN0aW5nLT50eXBlLT5uYW1lKTsKKwkJICByZXR1cm47CisJICAgICAgIH0KKwkgICAgfQorCisJICAgIGlmICh2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pIHsKKwkgICAgICAgaWYgKGV4aXN0aW5nLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uCisJCSAgICYmICh2YXItPmRhdGEubG9jYXRpb24gIT0gZXhpc3RpbmctPmRhdGEubG9jYXRpb24pKSB7CisJCSAgICAgbGlua2VyX2Vycm9yKHByb2csICJleHBsaWNpdCBsb2NhdGlvbnMgZm9yICVzICIKKwkJCQkgICJgJXMnIGhhdmUgZGlmZmVyaW5nIHZhbHVlc1xuIiwKKwkJCQkgIG1vZGVfc3RyaW5nKHZhciksIHZhci0+bmFtZSk7CisJCSAgICAgcmV0dXJuOworCSAgICAgICB9CisKKwkgICAgICAgZXhpc3RpbmctPmRhdGEubG9jYXRpb24gPSB2YXItPmRhdGEubG9jYXRpb247CisJICAgICAgIGV4aXN0aW5nLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uID0gdHJ1ZTsKKwkgICAgfQorCisgICAgICAgICAgICAvKiBGcm9tIHRoZSBHTFNMIDQuMjAgc3BlY2lmaWNhdGlvbjoKKyAgICAgICAgICAgICAqICJBIGxpbmsgZXJyb3Igd2lsbCByZXN1bHQgaWYgdHdvIGNvbXBpbGF0aW9uIHVuaXRzIGluIGEgcHJvZ3JhbQorICAgICAgICAgICAgICogIHNwZWNpZnkgZGlmZmVyZW50IGludGVnZXItY29uc3RhbnQgYmluZGluZ3MgZm9yIHRoZSBzYW1lCisgICAgICAgICAgICAgKiAgb3BhcXVlLXVuaWZvcm0gbmFtZS4gIEhvd2V2ZXIsIGl0IGlzIG5vdCBhbiBlcnJvciB0byBzcGVjaWZ5IGEKKyAgICAgICAgICAgICAqICBiaW5kaW5nIG9uIHNvbWUgYnV0IG5vdCBhbGwgZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtZSBuYW1lIgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodmFyLT5kYXRhLmV4cGxpY2l0X2JpbmRpbmcpIHsKKyAgICAgICAgICAgICAgIGlmIChleGlzdGluZy0+ZGF0YS5leHBsaWNpdF9iaW5kaW5nICYmCisgICAgICAgICAgICAgICAgICAgdmFyLT5kYXRhLmJpbmRpbmcgIT0gZXhpc3RpbmctPmRhdGEuYmluZGluZykgeworICAgICAgICAgICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csICJleHBsaWNpdCBiaW5kaW5ncyBmb3IgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJgJXMnIGhhdmUgZGlmZmVyaW5nIHZhbHVlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX3N0cmluZyh2YXIpLCB2YXItPm5hbWUpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBleGlzdGluZy0+ZGF0YS5iaW5kaW5nID0gdmFyLT5kYXRhLmJpbmRpbmc7CisgICAgICAgICAgICAgICBleGlzdGluZy0+ZGF0YS5leHBsaWNpdF9iaW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhci0+dHlwZS0+Y29udGFpbnNfYXRvbWljKCkgJiYKKyAgICAgICAgICAgICAgICB2YXItPmRhdGEuYXRvbWljLm9mZnNldCAhPSBleGlzdGluZy0+ZGF0YS5hdG9taWMub2Zmc2V0KSB7CisgICAgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgIm9mZnNldCBzcGVjaWZpY2F0aW9ucyBmb3IgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJgJXMnIGhhdmUgZGlmZmVyaW5nIHZhbHVlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX3N0cmluZyh2YXIpLCB2YXItPm5hbWUpOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisJICAgIC8qIFZhbGlkYXRlIGxheW91dCBxdWFsaWZpZXJzIGZvciBnbF9GcmFnRGVwdGguCisJICAgICAqCisJICAgICAqIEZyb20gdGhlIEFNRC9BUkJfY29uc2VydmF0aXZlX2RlcHRoIHNwZWNzOgorCSAgICAgKgorCSAgICAgKiAgICAiSWYgZ2xfRnJhZ0RlcHRoIGlzIHJlZGVjbGFyZWQgaW4gYW55IGZyYWdtZW50IHNoYWRlciBpbiBhCisJICAgICAqICAgIHByb2dyYW0sIGl0IG11c3QgYmUgcmVkZWNsYXJlZCBpbiBhbGwgZnJhZ21lbnQgc2hhZGVycyBpbgorCSAgICAgKiAgICB0aGF0IHByb2dyYW0gdGhhdCBoYXZlIHN0YXRpYyBhc3NpZ25tZW50cyB0bworCSAgICAgKiAgICBnbF9GcmFnRGVwdGguIEFsbCByZWRlY2xhcmF0aW9ucyBvZiBnbF9GcmFnRGVwdGggaW4gYWxsCisJICAgICAqICAgIGZyYWdtZW50IHNoYWRlcnMgaW4gYSBzaW5nbGUgcHJvZ3JhbSBtdXN0IGhhdmUgdGhlIHNhbWUgc2V0CisJICAgICAqICAgIG9mIHF1YWxpZmllcnMuIgorCSAgICAgKi8KKwkgICAgaWYgKHN0cmNtcCh2YXItPm5hbWUsICJnbF9GcmFnRGVwdGgiKSA9PSAwKSB7CisJICAgICAgIGJvb2wgbGF5b3V0X2RlY2xhcmVkID0gdmFyLT5kYXRhLmRlcHRoX2xheW91dCAhPSBpcl9kZXB0aF9sYXlvdXRfbm9uZTsKKwkgICAgICAgYm9vbCBsYXlvdXRfZGlmZmVycyA9CisJCSAgdmFyLT5kYXRhLmRlcHRoX2xheW91dCAhPSBleGlzdGluZy0+ZGF0YS5kZXB0aF9sYXlvdXQ7CisKKwkgICAgICAgaWYgKGxheW91dF9kZWNsYXJlZCAmJiBsYXlvdXRfZGlmZmVycykgeworCQkgIGxpbmtlcl9lcnJvcihwcm9nLAorCQkJICAgICAgICJBbGwgcmVkZWNsYXJhdGlvbnMgb2YgZ2xfRnJhZ0RlcHRoIGluIGFsbCAiCisJCQkgICAgICAgImZyYWdtZW50IHNoYWRlcnMgaW4gYSBzaW5nbGUgcHJvZ3JhbSBtdXN0IGhhdmUgIgorCQkJICAgICAgICJ0aGUgc2FtZSBzZXQgb2YgcXVhbGlmaWVycy4iKTsKKwkgICAgICAgfQorCisJICAgICAgIGlmICh2YXItPmRhdGEudXNlZCAmJiBsYXlvdXRfZGlmZmVycykgeworCQkgIGxpbmtlcl9lcnJvcihwcm9nLAorCQkJICAgICAgICJJZiBnbF9GcmFnRGVwdGggaXMgcmVkZWNsYXJlZCB3aXRoIGEgbGF5b3V0ICIKKwkJCSAgICAgICAicXVhbGlmaWVyIGluIGFueSBmcmFnbWVudCBzaGFkZXIsIGl0IG11c3QgYmUgIgorCQkJICAgICAgICJyZWRlY2xhcmVkIHdpdGggdGhlIHNhbWUgbGF5b3V0IHF1YWxpZmllciBpbiAiCisJCQkgICAgICAgImFsbCBmcmFnbWVudCBzaGFkZXJzIHRoYXQgaGF2ZSBhc3NpZ25tZW50cyB0byAiCisJCQkgICAgICAgImdsX0ZyYWdEZXB0aCIpOworCSAgICAgICB9CisJICAgIH0KKworCSAgICAvKiBQYWdlIDM1IChwYWdlIDQxIG9mIHRoZSBQREYpIG9mIHRoZSBHTFNMIDQuMjAgc3BlYyBzYXlzOgorCSAgICAgKgorCSAgICAgKiAgICAgIklmIGEgc2hhcmVkIGdsb2JhbCBoYXMgbXVsdGlwbGUgaW5pdGlhbGl6ZXJzLCB0aGUKKwkgICAgICogICAgIGluaXRpYWxpemVycyBtdXN0IGFsbCBiZSBjb25zdGFudCBleHByZXNzaW9ucywgYW5kIHRoZXkKKwkgICAgICogICAgIG11c3QgYWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUuIE90aGVyd2lzZSwgYSBsaW5rIGVycm9yIHdpbGwKKwkgICAgICogICAgIHJlc3VsdC4gKEEgc2hhcmVkIGdsb2JhbCBoYXZpbmcgb25seSBvbmUgaW5pdGlhbGl6ZXIgZG9lcworCSAgICAgKiAgICAgbm90IHJlcXVpcmUgdGhhdCBpbml0aWFsaXplciB0byBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24uKSIKKwkgICAgICoKKwkgICAgICogUHJldmlvdXMgdG8gNC4yMCB0aGUgR0xTTCBzcGVjIHNpbXBseSBzYWlkIHRoYXQgaW5pdGlhbGl6ZXJzCisJICAgICAqIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gIEluIHRoaXMgY2FzZSBvZiBub24tY29uc3RhbnQKKwkgICAgICogaW5pdGlhbGl6ZXJzLCB0aGlzIHdhcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZS4gIEFzIGEgcmVzdWx0LAorCSAgICAgKiBubyB2ZW5kb3IgYWN0dWFsbHkgaW1wbGVtZW50ZWQgdGhhdCBiZWhhdmlvci4gIFRoZSA0LjIwCisJICAgICAqIGJlaGF2aW9yIG1hdGNoZXMgdGhlIGltcGxlbWVudGVkIGJlaGF2aW9yIG9mIGF0IGxlYXN0IG9uZSBvdGhlcgorCSAgICAgKiB2ZW5kb3IsIHNvIHdlJ2xsIGltcGxlbWVudCB0aGF0IGZvciBhbGwgR0xTTCB2ZXJzaW9ucy4KKwkgICAgICovCisJICAgIGlmICh2YXItPmNvbnN0YW50X2luaXRpYWxpemVyICE9IE5VTEwpIHsKKwkgICAgICAgaWYgKGV4aXN0aW5nLT5jb25zdGFudF9pbml0aWFsaXplciAhPSBOVUxMKSB7CisJCSAgaWYgKCF2YXItPmNvbnN0YW50X2luaXRpYWxpemVyLT5oYXNfdmFsdWUoZXhpc3RpbmctPmNvbnN0YW50X2luaXRpYWxpemVyKSkgeworCQkgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiaW5pdGlhbGl6ZXJzIGZvciAlcyAiCisJCQkJICAiYCVzJyBoYXZlIGRpZmZlcmluZyB2YWx1ZXNcbiIsCisJCQkJICBtb2RlX3N0cmluZyh2YXIpLCB2YXItPm5hbWUpOworCQkgICAgIHJldHVybjsKKwkJICB9CisJICAgICAgIH0gZWxzZSB7CisJCSAgLyogSWYgdGhlIGZpcnN0LXNlZW4gaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIHVuaWZvcm0gZGlkIG5vdAorCQkgICAqIGhhdmUgYW4gaW5pdGlhbGl6ZXIgYnV0IGEgbGF0ZXIgaW5zdGFuY2UgZG9lcywgY29weSB0aGUKKwkJICAgKiBpbml0aWFsaXplciB0byB0aGUgdmVyc2lvbiBzdG9yZWQgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKwkJICAgKi8KKwkJICAvKiBGSU5JU0hNRTogVGhpcyBpcyB3cm9uZy4gIFRoZSBjb25zdGFudF92YWx1ZSBmaWVsZCBzaG91bGQKKwkJICAgKiBGSU5JU0hNRTogbm90IGJlIG1vZGlmaWVkISAgSW1hZ2luZSBhIGNhc2Ugd2hlcmUgYSBzaGFkZXIKKwkJICAgKiBGSU5JU0hNRTogd2l0aG91dCBhbiBpbml0aWFsaXplciBpcyBsaW5rZWQgaW4gdHdvIGRpZmZlcmVudAorCQkgICAqIEZJTklTSE1FOiBwcm9ncmFtcyB3aXRoIHNoYWRlcnMgdGhhdCBoYXZlIGRpZmZlcmluZworCQkgICAqIEZJTklTSE1FOiBpbml0aWFsaXplcnMuICBMaW5raW5nIHdpdGggdGhlIGZpcnN0IHdpbGwKKwkJICAgKiBGSU5JU0hNRTogbW9kaWZ5IHRoZSBzaGFkZXIsIGFuZCBsaW5raW5nIHdpdGggdGhlIHNlY29uZAorCQkgICAqIEZJTklTSE1FOiB3aWxsIGZhaWwuCisJCSAgICovCisJCSAgZXhpc3RpbmctPmNvbnN0YW50X2luaXRpYWxpemVyID0KKwkJICAgICB2YXItPmNvbnN0YW50X2luaXRpYWxpemVyLT5jbG9uZShyYWxsb2NfcGFyZW50KGV4aXN0aW5nKSwKKwkJCQkJCSAgICAgIE5VTEwpOworCSAgICAgICB9CisJICAgIH0KKworCSAgICBpZiAodmFyLT5kYXRhLmhhc19pbml0aWFsaXplcikgeworCSAgICAgICBpZiAoZXhpc3RpbmctPmRhdGEuaGFzX2luaXRpYWxpemVyCisJCSAgICYmICh2YXItPmNvbnN0YW50X2luaXRpYWxpemVyID09IE5VTEwKKwkJICAgICAgIHx8IGV4aXN0aW5nLT5jb25zdGFudF9pbml0aWFsaXplciA9PSBOVUxMKSkgeworCQkgIGxpbmtlcl9lcnJvcihwcm9nLAorCQkJICAgICAgICJzaGFyZWQgZ2xvYmFsIHZhcmlhYmxlIGAlcycgaGFzIG11bHRpcGxlICIKKwkJCSAgICAgICAibm9uLWNvbnN0YW50IGluaXRpYWxpemVycy5cbiIsCisJCQkgICAgICAgdmFyLT5uYW1lKTsKKwkJICByZXR1cm47CisJICAgICAgIH0KKworCSAgICAgICAvKiBTb21lIGluc3RhbmNlIGhhZCBhbiBpbml0aWFsaXplciwgc28ga2VlcCB0cmFjayBvZiB0aGF0LiAgSW4KKwkJKiB0aGlzIGxvY2F0aW9uLCBhbGwgc29ydHMgb2YgaW5pdGlhbGl6ZXJzIChjb25zdGFudCBvcgorCQkqIG90aGVyd2lzZSkgd2lsbCBwcm9wYWdhdGUgdGhlIGV4aXN0ZW5jZSB0byB0aGUgdmFyaWFibGUKKwkJKiBzdG9yZWQgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKwkJKi8KKwkgICAgICAgZXhpc3RpbmctPmRhdGEuaGFzX2luaXRpYWxpemVyID0gdHJ1ZTsKKwkgICAgfQorCisJICAgIGlmIChleGlzdGluZy0+ZGF0YS5pbnZhcmlhbnQgIT0gdmFyLT5kYXRhLmludmFyaWFudCkgeworCSAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImRlY2xhcmF0aW9ucyBmb3IgJXMgYCVzJyBoYXZlICIKKwkJCSAgICAibWlzbWF0Y2hpbmcgaW52YXJpYW50IHF1YWxpZmllcnNcbiIsCisJCQkgICAgbW9kZV9zdHJpbmcodmFyKSwgdmFyLT5uYW1lKTsKKwkgICAgICAgcmV0dXJuOworCSAgICB9CisgICAgICAgICAgICBpZiAoZXhpc3RpbmctPmRhdGEuY2VudHJvaWQgIT0gdmFyLT5kYXRhLmNlbnRyb2lkKSB7CisgICAgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImRlY2xhcmF0aW9ucyBmb3IgJXMgYCVzJyBoYXZlICIKKwkJCSAgICAibWlzbWF0Y2hpbmcgY2VudHJvaWQgcXVhbGlmaWVyc1xuIiwKKwkJCSAgICBtb2RlX3N0cmluZyh2YXIpLCB2YXItPm5hbWUpOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4aXN0aW5nLT5kYXRhLnNhbXBsZSAhPSB2YXItPmRhdGEuc2FtcGxlKSB7CisgICAgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImRlY2xhcmF0aW9ucyBmb3IgJXMgYCVzYCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzbWF0Y2hpbmcgc2FtcGxlIHF1YWxpZmllcnNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9zdHJpbmcodmFyKSwgdmFyLT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwkgfSBlbHNlCisJICAgIHZhcmlhYmxlcy5hZGRfdmFyaWFibGUodmFyKTsKKyAgICAgIH0KKyAgIH0KK30KKworCisvKioKKyAqIFBlcmZvcm0gdmFsaWRhdGlvbiBvZiB1bmlmb3JtcyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBzaGFkZXIgc3RhZ2VzCisgKi8KK3ZvaWQKK2Nyb3NzX3ZhbGlkYXRlX3VuaWZvcm1zKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIGNyb3NzX3ZhbGlkYXRlX2dsb2JhbHMocHJvZywgcHJvZy0+X0xpbmtlZFNoYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU0FfU0hBREVSX1NUQUdFUywgdHJ1ZSk7Cit9CisKKy8qKgorICogQWNjdW11bGF0ZXMgdGhlIGFycmF5IG9mIHByb2ctPlVuaWZvcm1CbG9ja3MgYW5kIGNoZWNrcyB0aGF0IGFsbAorICogZGVmaW5pdG9ucyBvZiBibG9ja3MgYWdyZWUgb24gdGhlaXIgY29udGVudHMuCisgKi8KK3N0YXRpYyBib29sCitpbnRlcnN0YWdlX2Nyb3NzX3ZhbGlkYXRlX3VuaWZvcm1fYmxvY2tzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIHVuc2lnbmVkIG1heF9udW1fdW5pZm9ybV9ibG9ja3MgPSAwOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0pCisJIG1heF9udW1fdW5pZm9ybV9ibG9ja3MgKz0gcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0tPk51bVVuaWZvcm1CbG9ja3M7CisgICB9CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2ggPSBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXTsKKworICAgICAgcHJvZy0+VW5pZm9ybUJsb2NrU3RhZ2VJbmRleFtpXSA9IHJhbGxvY19hcnJheShwcm9nLCBpbnQsCisJCQkJCQkgICAgIG1heF9udW1fdW5pZm9ybV9ibG9ja3MpOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCBtYXhfbnVtX3VuaWZvcm1fYmxvY2tzOyBqKyspCisJIHByb2ctPlVuaWZvcm1CbG9ja1N0YWdlSW5kZXhbaV1bal0gPSAtMTsKKworICAgICAgaWYgKHNoID09IE5VTEwpCisJIGNvbnRpbnVlOworCisgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IHNoLT5OdW1Vbmlmb3JtQmxvY2tzOyBqKyspIHsKKwkgaW50IGluZGV4ID0gbGlua19jcm9zc192YWxpZGF0ZV91bmlmb3JtX2Jsb2NrKHByb2csCisJCQkJCQkgICAgICAgJnByb2ctPlVuaWZvcm1CbG9ja3MsCisJCQkJCQkgICAgICAgJnByb2ctPk51bVVuaWZvcm1CbG9ja3MsCisJCQkJCQkgICAgICAgJnNoLT5Vbmlmb3JtQmxvY2tzW2pdKTsKKworCSBpZiAoaW5kZXggPT0gLTEpIHsKKwkgICAgbGlua2VyX2Vycm9yKHByb2csICJ1bmlmb3JtIGJsb2NrIGAlcycgaGFzIG1pc21hdGNoaW5nIGRlZmluaXRpb25zIiwKKwkJCSBzaC0+VW5pZm9ybUJsb2Nrc1tqXS5OYW1lKTsKKwkgICAgcmV0dXJuIGZhbHNlOworCSB9CisKKwkgcHJvZy0+VW5pZm9ybUJsb2NrU3RhZ2VJbmRleFtpXVtpbmRleF0gPSBqOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKioKKyAqIFBvcHVsYXRlcyBhIHNoYWRlcnMgc3ltYm9sIHRhYmxlIHdpdGggYWxsIGdsb2JhbCBkZWNsYXJhdGlvbnMKKyAqLwordm9pZAorcG9wdWxhdGVfc3ltYm9sX3RhYmxlKGdsX3NoYWRlciAqc2gpCit7CisgICBzaC0+c3ltYm9scyA9IG5ldyhzaCkgZ2xzbF9zeW1ib2xfdGFibGU7CisKKyAgIGZvcmVhY2hfbGlzdChub2RlLCBzaC0+aXIpIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICpjb25zdCBpbnN0ID0gKGlyX2luc3RydWN0aW9uICopIG5vZGU7CisgICAgICBpcl92YXJpYWJsZSAqdmFyOworICAgICAgaXJfZnVuY3Rpb24gKmZ1bmM7CisKKyAgICAgIGlmICgoZnVuYyA9IGluc3QtPmFzX2Z1bmN0aW9uKCkpICE9IE5VTEwpIHsKKwkgc2gtPnN5bWJvbHMtPmFkZF9mdW5jdGlvbihmdW5jKTsKKyAgICAgIH0gZWxzZSBpZiAoKHZhciA9IGluc3QtPmFzX3ZhcmlhYmxlKCkpICE9IE5VTEwpIHsKKwkgc2gtPnN5bWJvbHMtPmFkZF92YXJpYWJsZSh2YXIpOworICAgICAgfQorICAgfQorfQorCisKKy8qKgorICogUmVtYXAgdmFyaWFibGVzIHJlZmVyZW5jZWQgaW4gYW4gaW5zdHJ1Y3Rpb24gdHJlZQorICoKKyAqIFRoaXMgaXMgdXNlZCB3aGVuIGluc3RydWN0aW9uIHRyZWVzIGFyZSBjbG9uZWQgZnJvbSBvbmUgc2hhZGVyIGFuZCBwbGFjZWQgaW4KKyAqIGFub3RoZXIuICBUaGVzZSB0cmVlcyB3aWxsIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBcYyBpcl92YXJpYWJsZSBub2RlcyB0aGF0CisgKiBkbyBub3QgZXhpc3QgaW4gdGhlIHRhcmdldCBzaGFkZXIuICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZXNlIFxjIGlyX3ZhcmlhYmxlCisgKiByZWZlcmVuY2VzIGFuZCByZXBsYWNlcyB0aGUgcmVmZXJlbmNlcyB3aXRoIG1hdGNoaW5nIHZhcmlhYmxlcyBpbiB0aGUgdGFyZ2V0CisgKiBzaGFkZXIuCisgKgorICogSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBzaGFkZXIsIGEgY2xvbmUgb2YgdGhlCisgKiBcYyBpcl92YXJpYWJsZSBpcyBtYWRlIGFuZCBhZGRlZCB0byB0aGUgdGFyZ2V0IHNoYWRlci4gIFRoZSBuZXcgdmFyaWFibGUgaXMKKyAqIGFkZGVkIHRvIFxiIGJvdGggdGhlIGluc3RydWN0aW9uIHN0cmVhbSBhbmQgdGhlIHN5bWJvbCB0YWJsZS4KKyAqCisgKiBccGFyYW0gaW5zdCAgICAgICAgIElSIHRyZWUgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQuCisgKiBccGFyYW0gc3ltYm9scyAgICAgIFN5bWJvbCB0YWJsZSBjb250YWluaW5nIGdsb2JhbCBzY29wZSBzeW1ib2xzIGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICBsaW5rZWQgc2hhZGVyLgorICogXHBhcmFtIGluc3RydWN0aW9ucyBJbnN0cnVjdGlvbiBzdHJlYW0gd2hlcmUgbmV3IHZhcmlhYmxlIGRlY2xhcmF0aW9ucworICogICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgYWRkZWQuCisgKi8KK3ZvaWQKK3JlbWFwX3ZhcmlhYmxlcyhpcl9pbnN0cnVjdGlvbiAqaW5zdCwgc3RydWN0IGdsX3NoYWRlciAqdGFyZ2V0LAorCQloYXNoX3RhYmxlICp0ZW1wcykKK3sKKyAgIGNsYXNzIHJlbWFwX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworICAgcHVibGljOgorCSByZW1hcF92aXNpdG9yKHN0cnVjdCBnbF9zaGFkZXIgKnRhcmdldCwKKwkJICAgIGhhc2hfdGFibGUgKnRlbXBzKQorICAgICAgeworCSB0aGlzLT50YXJnZXQgPSB0YXJnZXQ7CisJIHRoaXMtPnN5bWJvbHMgPSB0YXJnZXQtPnN5bWJvbHM7CisJIHRoaXMtPmluc3RydWN0aW9ucyA9IHRhcmdldC0+aXI7CisJIHRoaXMtPnRlbXBzID0gdGVtcHM7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQorICAgICAgeworCSBpZiAoaXItPnZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl90ZW1wb3JhcnkpIHsKKwkgICAgaXJfdmFyaWFibGUgKnZhciA9IChpcl92YXJpYWJsZSAqKSBoYXNoX3RhYmxlX2ZpbmQodGVtcHMsIGlyLT52YXIpOworCisJICAgIGFzc2VydCh2YXIgIT0gTlVMTCk7CisJICAgIGlyLT52YXIgPSB2YXI7CisJICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKwkgfQorCisJIGlyX3ZhcmlhYmxlICpjb25zdCBleGlzdGluZyA9CisJICAgIHRoaXMtPnN5bWJvbHMtPmdldF92YXJpYWJsZShpci0+dmFyLT5uYW1lKTsKKwkgaWYgKGV4aXN0aW5nICE9IE5VTEwpCisJICAgIGlyLT52YXIgPSBleGlzdGluZzsKKwkgZWxzZSB7CisJICAgIGlyX3ZhcmlhYmxlICpjb3B5ID0gaXItPnZhci0+Y2xvbmUodGhpcy0+dGFyZ2V0LCBOVUxMKTsKKworCSAgICB0aGlzLT5zeW1ib2xzLT5hZGRfdmFyaWFibGUoY29weSk7CisJICAgIHRoaXMtPmluc3RydWN0aW9ucy0+cHVzaF9oZWFkKGNvcHkpOworCSAgICBpci0+dmFyID0gY29weTsKKwkgfQorCisJIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgICAgIH0KKworICAgcHJpdmF0ZToKKyAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnRhcmdldDsKKyAgICAgIGdsc2xfc3ltYm9sX3RhYmxlICpzeW1ib2xzOworICAgICAgZXhlY19saXN0ICppbnN0cnVjdGlvbnM7CisgICAgICBoYXNoX3RhYmxlICp0ZW1wczsKKyAgIH07CisKKyAgIHJlbWFwX3Zpc2l0b3Igdih0YXJnZXQsIHRlbXBzKTsKKworICAgaW5zdC0+YWNjZXB0KCZ2KTsKK30KKworCisvKioKKyAqIE1vdmUgbm9uLWRlY2xhcmF0aW9ucyBmcm9tIG9uZSBpbnN0cnVjdGlvbiBzdHJlYW0gdG8gYW5vdGhlcgorICoKKyAqIFRoZSBpbnRlbmRlZCB1c2FnZSBwYXR0ZXJuIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gcGFzcyB0aGUgcG9pbnRlciB0byB0aGUKKyAqIGhlYWQgc2VudGluZWwgb2YgYSBsaXN0IChpLmUuLCBhIHBvaW50ZXIgdG8gdGhlIGxpc3QgY2FzdCB0byBhbiBcYyBleGVjX25vZGUKKyAqIHBvaW50ZXIpIGZvciBcYyBsYXN0IGFuZCBcYyBmYWxzZSBmb3IgXGMgbWFrZV9jb3BpZXMgb24gdGhlIGZpcnN0CisgKiBjYWxsLiAgU3VjY2Vzc2l2ZSBjYWxscyBwYXNzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNhbGwgZm9yCisgKiBcYyBsYXN0IGFuZCBcYyB0cnVlIGZvciBcYyBtYWtlX2NvcGllcy4KKyAqCisgKiBccGFyYW0gaW5zdHJ1Y3Rpb25zIFNvdXJjZSBpbnN0cnVjdGlvbiBzdHJlYW0KKyAqIFxwYXJhbSBsYXN0ICAgICAgICAgSW5zdHJ1Y3Rpb24gYWZ0ZXIgd2hpY2ggbmV3IGluc3RydWN0aW9ucyBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgaW4gdGhlIHRhcmdldCBpbnN0cnVjdGlvbiBzdHJlYW0KKyAqIFxwYXJhbSBtYWtlX2NvcGllcyAgRmxhZyBzZWxlY3Rpbmcgd2hldGhlciBpbnN0cnVjdGlvbnMgaW4gXGMgaW5zdHJ1Y3Rpb25zCisgKiAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjb3BpZWQgKHZpYSBcYyBpcl9pbnN0cnVjdGlvbjo6Y2xvbmUpIGludG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgIHRhcmdldCBsaXN0IG9yIG1vdmVkLgorICoKKyAqIFxyZXR1cm4KKyAqIFRoZSBuZXcgImxhc3QiIGluc3RydWN0aW9uIGluIHRoZSB0YXJnZXQgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgVGhpcyBwb2ludGVyCisgKiBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBcYyBsYXN0IHBhcmFtZXRlciBvZiBhIGxhdGVyIGNhbGwgdG8gdGhpcworICogZnVuY3Rpb24uCisgKi8KK2V4ZWNfbm9kZSAqCittb3ZlX25vbl9kZWNsYXJhdGlvbnMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGV4ZWNfbm9kZSAqbGFzdCwKKwkJICAgICAgYm9vbCBtYWtlX2NvcGllcywgZ2xfc2hhZGVyICp0YXJnZXQpCit7CisgICBoYXNoX3RhYmxlICp0ZW1wcyA9IE5VTEw7CisKKyAgIGlmIChtYWtlX2NvcGllcykKKyAgICAgIHRlbXBzID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfcG9pbnRlcl9oYXNoLAorCQkJICAgICAgaGFzaF90YWJsZV9wb2ludGVyX2NvbXBhcmUpOworCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICppbnN0ID0gKGlyX2luc3RydWN0aW9uICopIG5vZGU7CisKKyAgICAgIGlmIChpbnN0LT5hc19mdW5jdGlvbigpKQorCSBjb250aW51ZTsKKworICAgICAgaXJfdmFyaWFibGUgKnZhciA9IGluc3QtPmFzX3ZhcmlhYmxlKCk7CisgICAgICBpZiAoKHZhciAhPSBOVUxMKSAmJiAodmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3RlbXBvcmFyeSkpCisJIGNvbnRpbnVlOworCisgICAgICBhc3NlcnQoaW5zdC0+YXNfYXNzaWdubWVudCgpCisgICAgICAgICAgICAgfHwgaW5zdC0+YXNfY2FsbCgpCisgICAgICAgICAgICAgfHwgaW5zdC0+YXNfaWYoKSAvKiBmb3IgaW5pdGlhbGl6ZXJzIHdpdGggdGhlID86IG9wZXJhdG9yICovCisJICAgICB8fCAoKHZhciAhPSBOVUxMKSAmJiAodmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3RlbXBvcmFyeSkpKTsKKworICAgICAgaWYgKG1ha2VfY29waWVzKSB7CisJIGluc3QgPSBpbnN0LT5jbG9uZSh0YXJnZXQsIE5VTEwpOworCisJIGlmICh2YXIgIT0gTlVMTCkKKwkgICAgaGFzaF90YWJsZV9pbnNlcnQodGVtcHMsIGluc3QsIHZhcik7CisJIGVsc2UKKwkgICAgcmVtYXBfdmFyaWFibGVzKGluc3QsIHRhcmdldCwgdGVtcHMpOworICAgICAgfSBlbHNlIHsKKwkgaW5zdC0+cmVtb3ZlKCk7CisgICAgICB9CisKKyAgICAgIGxhc3QtPmluc2VydF9hZnRlcihpbnN0KTsKKyAgICAgIGxhc3QgPSBpbnN0OworICAgfQorCisgICBpZiAobWFrZV9jb3BpZXMpCisgICAgICBoYXNoX3RhYmxlX2R0b3IodGVtcHMpOworCisgICByZXR1cm4gbGFzdDsKK30KKworLyoqCisgKiBHZXQgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBmb3IgbWFpbiBmcm9tIGEgc2hhZGVyCisgKi8KK3N0YXRpYyBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKgorZ2V0X21haW5fZnVuY3Rpb25fc2lnbmF0dXJlKGdsX3NoYWRlciAqc2gpCit7CisgICBpcl9mdW5jdGlvbiAqY29uc3QgZiA9IHNoLT5zeW1ib2xzLT5nZXRfZnVuY3Rpb24oIm1haW4iKTsKKyAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgIGV4ZWNfbGlzdCB2b2lkX3BhcmFtZXRlcnM7CisKKyAgICAgIC8qIExvb2sgZm9yIHRoZSAndm9pZCBtYWluKCknIHNpZ25hdHVyZSBhbmQgZW5zdXJlIHRoYXQgaXQncyBkZWZpbmVkLgorICAgICAgICogVGhpcyBrZWVwcyB0aGUgbGlua2VyIGZyb20gYWNjaWRlbnRhbGx5IHBpY2sgYSBzaGFkZXIgdGhhdCBqdXN0CisgICAgICAgKiBjb250YWlucyBhIHByb3RvdHlwZSBmb3IgbWFpbi4KKyAgICAgICAqCisgICAgICAgKiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBtYWluIChpbiBtdWx0aXBsZQorICAgICAgICogc2hhZGVycykgYmVjYXVzZSB0aGF0IHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhYm92ZS4KKyAgICAgICAqLworICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPSBmLT5tYXRjaGluZ19zaWduYXR1cmUoTlVMTCwgJnZvaWRfcGFyYW1ldGVycyk7CisgICAgICBpZiAoKHNpZyAhPSBOVUxMKSAmJiBzaWctPmlzX2RlZmluZWQpIHsKKwkgcmV0dXJuIHNpZzsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIG9ubHkgdXNlZCBpbiBsaW5rX2ludHJhc3RhZ2Vfc2hhZGVycygpIGJlbG93IGJ1dCBkZWNsYXJpbmcKKyAqIGl0IGluc2lkZSB0aGF0IGZ1bmN0aW9uIGxlYWRzIHRvIGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggc29tZSB2ZXJzaW9ucyBvZgorICogZ2NjLgorICovCitjbGFzcyBhcnJheV9zaXppbmdfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBhcnJheV9zaXppbmdfdmlzaXRvcigpCisgICAgICA6IG1lbV9jdHgocmFsbG9jX2NvbnRleHQoTlVMTCkpLAorICAgICAgICB1bm5hbWVkX2ludGVyZmFjZXMoaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfcG9pbnRlcl9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKSkKKyAgIHsKKyAgIH0KKworICAgfmFycmF5X3NpemluZ192aXNpdG9yKCkKKyAgIHsKKyAgICAgIGhhc2hfdGFibGVfZHRvcih0aGlzLT51bm5hbWVkX2ludGVyZmFjZXMpOworICAgICAgcmFsbG9jX2ZyZWUodGhpcy0+bWVtX2N0eCk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfdmFyaWFibGUgKnZhcikKKyAgIHsKKyAgICAgIGZpeHVwX3R5cGUoJnZhci0+dHlwZSwgdmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MpOworICAgICAgaWYgKHZhci0+dHlwZS0+aXNfaW50ZXJmYWNlKCkpIHsKKyAgICAgICAgIGlmIChpbnRlcmZhY2VfY29udGFpbnNfdW5zaXplZF9hcnJheXModmFyLT50eXBlKSkgeworICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpuZXdfdHlwZSA9CisgICAgICAgICAgICAgICByZXNpemVfaW50ZXJmYWNlX21lbWJlcnModmFyLT50eXBlLCB2YXItPm1heF9pZmNfYXJyYXlfYWNjZXNzKTsKKyAgICAgICAgICAgIHZhci0+dHlwZSA9IG5ld190eXBlOworICAgICAgICAgICAgdmFyLT5jaGFuZ2VfaW50ZXJmYWNlX3R5cGUobmV3X3R5cGUpOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh2YXItPnR5cGUtPmlzX2FycmF5KCkgJiYKKyAgICAgICAgICAgICAgICAgdmFyLT50eXBlLT5maWVsZHMuYXJyYXktPmlzX2ludGVyZmFjZSgpKSB7CisgICAgICAgICBpZiAoaW50ZXJmYWNlX2NvbnRhaW5zX3Vuc2l6ZWRfYXJyYXlzKHZhci0+dHlwZS0+ZmllbGRzLmFycmF5KSkgeworICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICpuZXdfdHlwZSA9CisgICAgICAgICAgICAgICByZXNpemVfaW50ZXJmYWNlX21lbWJlcnModmFyLT50eXBlLT5maWVsZHMuYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT5tYXhfaWZjX2FycmF5X2FjY2Vzcyk7CisgICAgICAgICAgICB2YXItPmNoYW5nZV9pbnRlcmZhY2VfdHlwZShuZXdfdHlwZSk7CisgICAgICAgICAgICB2YXItPnR5cGUgPQorICAgICAgICAgICAgICAgZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UobmV3X3R5cGUsIHZhci0+dHlwZS0+bGVuZ3RoKTsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY29uc3QgZ2xzbF90eXBlICppZmNfdHlwZSA9IHZhci0+Z2V0X2ludGVyZmFjZV90eXBlKCkpIHsKKyAgICAgICAgIC8qIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgdmFyaWFibGUgaW4gdGhlIHVubmFtZWRfaW50ZXJmYWNlcworICAgICAgICAgICogaGFzaHRhYmxlLgorICAgICAgICAgICovCisgICAgICAgICBpcl92YXJpYWJsZSAqKmludGVyZmFjZV92YXJzID0gKGlyX3ZhcmlhYmxlICoqKQorICAgICAgICAgICAgaGFzaF90YWJsZV9maW5kKHRoaXMtPnVubmFtZWRfaW50ZXJmYWNlcywgaWZjX3R5cGUpOworICAgICAgICAgaWYgKGludGVyZmFjZV92YXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludGVyZmFjZV92YXJzID0gcnphbGxvY19hcnJheShtZW1fY3R4LCBpcl92YXJpYWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY190eXBlLT5sZW5ndGgpOworICAgICAgICAgICAgaGFzaF90YWJsZV9pbnNlcnQodGhpcy0+dW5uYW1lZF9pbnRlcmZhY2VzLCBpbnRlcmZhY2VfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY190eXBlKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHVuc2lnbmVkIGluZGV4ID0gaWZjX3R5cGUtPmZpZWxkX2luZGV4KHZhci0+bmFtZSk7CisgICAgICAgICBhc3NlcnQoaW5kZXggPCBpZmNfdHlwZS0+bGVuZ3RoKTsKKyAgICAgICAgIGFzc2VydChpbnRlcmZhY2VfdmFyc1tpbmRleF0gPT0gTlVMTCk7CisgICAgICAgICBpbnRlcmZhY2VfdmFyc1tpbmRleF0gPSB2YXI7CisgICAgICB9CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIC8qKgorICAgICogRm9yIGVhY2ggdW5uYW1lZCBpbnRlcmZhY2UgYmxvY2sgdGhhdCB3YXMgZGlzY292ZXJlZCB3aGlsZSBydW5uaW5nIHRoZQorICAgICogdmlzaXRvciwgYWRqdXN0IHRoZSBpbnRlcmZhY2UgdHlwZSB0byByZWZsZWN0IHRoZSBuZXdseSBhc3NpZ25lZCBhcnJheQorICAgICogc2l6ZXMsIGFuZCBmaXggdXAgdGhlIGlyX3ZhcmlhYmxlIG5vZGVzIHRvIHBvaW50IHRvIHRoZSBuZXcgaW50ZXJmYWNlCisgICAgKiB0eXBlLgorICAgICovCisgICB2b2lkIGZpeHVwX3VubmFtZWRfaW50ZXJmYWNlX3R5cGVzKCkKKyAgIHsKKyAgICAgIGhhc2hfdGFibGVfY2FsbF9mb3JlYWNoKHRoaXMtPnVubmFtZWRfaW50ZXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3VubmFtZWRfaW50ZXJmYWNlX3R5cGUsIE5VTEwpOworICAgfQorCitwcml2YXRlOgorICAgLyoqCisgICAgKiBJZiB0aGUgdHlwZSBwb2ludGVkIHRvIGJ5IFxjIHR5cGUgcmVwcmVzZW50cyBhbiB1bnNpemVkIGFycmF5LCByZXBsYWNlCisgICAgKiBpdCB3aXRoIGEgc2l6ZWQgYXJyYXkgd2hvc2Ugc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IG1heF9hcnJheV9hY2Nlc3MuCisgICAgKi8KKyAgIHN0YXRpYyB2b2lkIGZpeHVwX3R5cGUoY29uc3QgZ2xzbF90eXBlICoqdHlwZSwgdW5zaWduZWQgbWF4X2FycmF5X2FjY2VzcykKKyAgIHsKKyAgICAgIGlmICgoKnR5cGUpLT5pc191bnNpemVkX2FycmF5KCkpIHsKKyAgICAgICAgICp0eXBlID0gZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UoKCp0eXBlKS0+ZmllbGRzLmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJyYXlfYWNjZXNzICsgMSk7CisgICAgICAgICBhc3NlcnQoKnR5cGUgIT0gTlVMTCk7CisgICAgICB9CisgICB9CisKKyAgIC8qKgorICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGludGVyZmFjZSB0eXBlIGNvbnRhaW5zIHVuc2l6ZWQgYXJyYXlzIChpZgorICAgICogaXQgZG9lc24ndCwgYXJyYXlfc2l6aW5nX3Zpc2l0b3IgZG9lc24ndCBuZWVkIHRvIHByb2Nlc3MgaXQpLgorICAgICovCisgICBzdGF0aWMgYm9vbCBpbnRlcmZhY2VfY29udGFpbnNfdW5zaXplZF9hcnJheXMoY29uc3QgZ2xzbF90eXBlICp0eXBlKQorICAgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHR5cGUtPmxlbmd0aDsgaSsrKSB7CisgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKmVsZW1fdHlwZSA9IHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZTsKKyAgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICAvKioKKyAgICAqIENyZWF0ZSBhIG5ldyBpbnRlcmZhY2UgdHlwZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gdHlwZSwgd2l0aCB1bnNpemVkIGFycmF5cworICAgICogcmVwbGFjZWQgYnkgc2l6ZWQgYXJyYXlzIHdob3NlIHNpemUgaXMgZGV0ZXJtaW5lZCBieQorICAgICogbWF4X2lmY19hcnJheV9hY2Nlc3MuCisgICAgKi8KKyAgIHN0YXRpYyBjb25zdCBnbHNsX3R5cGUgKgorICAgcmVzaXplX2ludGVyZmFjZV9tZW1iZXJzKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqbWF4X2lmY19hcnJheV9hY2Nlc3MpCisgICB7CisgICAgICB1bnNpZ25lZCBudW1fZmllbGRzID0gdHlwZS0+bGVuZ3RoOworICAgICAgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkcyA9IG5ldyBnbHNsX3N0cnVjdF9maWVsZFtudW1fZmllbGRzXTsKKyAgICAgIG1lbWNweShmaWVsZHMsIHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgbnVtX2ZpZWxkcyAqIHNpemVvZigqZmllbGRzKSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2ZpZWxkczsgaSsrKSB7CisgICAgICAgICBmaXh1cF90eXBlKCZmaWVsZHNbaV0udHlwZSwgbWF4X2lmY19hcnJheV9hY2Nlc3NbaV0pOworICAgICAgfQorICAgICAgZ2xzbF9pbnRlcmZhY2VfcGFja2luZyBwYWNraW5nID0KKyAgICAgICAgIChnbHNsX2ludGVyZmFjZV9wYWNraW5nKSB0eXBlLT5pbnRlcmZhY2VfcGFja2luZzsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqbmV3X2lmY190eXBlID0KKyAgICAgICAgIGdsc2xfdHlwZTo6Z2V0X2ludGVyZmFjZV9pbnN0YW5jZShmaWVsZHMsIG51bV9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2luZywgdHlwZS0+bmFtZSk7CisgICAgICBkZWxldGUgW10gZmllbGRzOworICAgICAgcmV0dXJuIG5ld19pZmNfdHlwZTsKKyAgIH0KKworICAgc3RhdGljIHZvaWQgZml4dXBfdW5uYW1lZF9pbnRlcmZhY2VfdHlwZShjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikKKyAgIHsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqaWZjX3R5cGUgPSAoY29uc3QgZ2xzbF90eXBlICopIGtleTsKKyAgICAgIGlyX3ZhcmlhYmxlICoqaW50ZXJmYWNlX3ZhcnMgPSAoaXJfdmFyaWFibGUgKiopIGRhdGE7CisgICAgICB1bnNpZ25lZCBudW1fZmllbGRzID0gaWZjX3R5cGUtPmxlbmd0aDsKKyAgICAgIGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZHMgPSBuZXcgZ2xzbF9zdHJ1Y3RfZmllbGRbbnVtX2ZpZWxkc107CisgICAgICBtZW1jcHkoZmllbGRzLCBpZmNfdHlwZS0+ZmllbGRzLnN0cnVjdHVyZSwKKyAgICAgICAgICAgICBudW1fZmllbGRzICogc2l6ZW9mKCpmaWVsZHMpKTsKKyAgICAgIGJvb2wgaW50ZXJmYWNlX3R5cGVfY2hhbmdlZCA9IGZhbHNlOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9maWVsZHM7IGkrKykgeworICAgICAgICAgaWYgKGludGVyZmFjZV92YXJzW2ldICE9IE5VTEwgJiYKKyAgICAgICAgICAgICBmaWVsZHNbaV0udHlwZSAhPSBpbnRlcmZhY2VfdmFyc1tpXS0+dHlwZSkgeworICAgICAgICAgICAgZmllbGRzW2ldLnR5cGUgPSBpbnRlcmZhY2VfdmFyc1tpXS0+dHlwZTsKKyAgICAgICAgICAgIGludGVyZmFjZV90eXBlX2NoYW5nZWQgPSB0cnVlOworICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFpbnRlcmZhY2VfdHlwZV9jaGFuZ2VkKSB7CisgICAgICAgICBkZWxldGUgW10gZmllbGRzOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZ2xzbF9pbnRlcmZhY2VfcGFja2luZyBwYWNraW5nID0KKyAgICAgICAgIChnbHNsX2ludGVyZmFjZV9wYWNraW5nKSBpZmNfdHlwZS0+aW50ZXJmYWNlX3BhY2tpbmc7CisgICAgICBjb25zdCBnbHNsX3R5cGUgKm5ld19pZmNfdHlwZSA9CisgICAgICAgICBnbHNsX3R5cGU6OmdldF9pbnRlcmZhY2VfaW5zdGFuY2UoZmllbGRzLCBudW1fZmllbGRzLCBwYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY190eXBlLT5uYW1lKTsKKyAgICAgIGRlbGV0ZSBbXSBmaWVsZHM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2ZpZWxkczsgaSsrKSB7CisgICAgICAgICBpZiAoaW50ZXJmYWNlX3ZhcnNbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgIGludGVyZmFjZV92YXJzW2ldLT5jaGFuZ2VfaW50ZXJmYWNlX3R5cGUobmV3X2lmY190eXBlKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyoqCisgICAgKiBNZW1vcnkgY29udGV4dCB1c2VkIHRvIGFsbG9jYXRlIHRoZSBkYXRhIGluIFxjIHVubmFtZWRfaW50ZXJmYWNlcy4KKyAgICAqLworICAgdm9pZCAqbWVtX2N0eDsKKworICAgLyoqCisgICAgKiBIYXNoIHRhYmxlIGZyb20gY29uc3QgZ2xzbF90eXBlICogdG8gYW4gYXJyYXkgb2YgaXJfdmFyaWFibGUgKidzCisgICAgKiBwb2ludGluZyB0byB0aGUgaXJfdmFyaWFibGVzIGNvbnN0aXR1dGluZyBlYWNoIHVubmFtZWQgaW50ZXJmYWNlIGJsb2NrLgorICAgICovCisgICBoYXNoX3RhYmxlICp1bm5hbWVkX2ludGVyZmFjZXM7Cit9OworCisvKioKKyAqIFBlcmZvcm1zIHRoZSBjcm9zcy12YWxpZGF0aW9uIG9mIGxheW91dCBxdWFsaWZpZXJzIHNwZWNpZmllZCBpbgorICogcmVkZWNsYXJhdGlvbiBvZiBnbF9GcmFnQ29vcmQgZm9yIHRoZSBhdHRhY2hlZCBmcmFnbWVudCBzaGFkZXJzLAorICogYW5kIHByb3BhZ2F0ZXMgdGhlbSB0byB0aGUgbGlua2VkIEZTIGFuZCBsaW5rZWQgc2hhZGVyIHByb2dyYW0uCisgKi8KK3N0YXRpYyB2b2lkCitsaW5rX2ZzX2lucHV0X2xheW91dF9xdWFsaWZpZXJzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyICpsaW5rZWRfc2hhZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKipzaGFkZXJfbGlzdCwKKwkgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fc2hhZGVycykKK3sKKyAgIGxpbmtlZF9zaGFkZXItPnJlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkID0gZmFsc2U7CisgICBsaW5rZWRfc2hhZGVyLT51c2VzX2dsX2ZyYWdjb29yZCA9IGZhbHNlOworICAgbGlua2VkX3NoYWRlci0+b3JpZ2luX3VwcGVyX2xlZnQgPSBmYWxzZTsKKyAgIGxpbmtlZF9zaGFkZXItPnBpeGVsX2NlbnRlcl9pbnRlZ2VyID0gZmFsc2U7CisKKyAgIGlmIChsaW5rZWRfc2hhZGVyLT5TdGFnZSAhPSBNRVNBX1NIQURFUl9GUkFHTUVOVCB8fAorICAgICAgIChwcm9nLT5WZXJzaW9uIDwgMTUwICYmICFwcm9nLT5BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnNfZW5hYmxlKSkKKyAgICAgIHJldHVybjsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9zaGFkZXJzOyBpKyspIHsKKyAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciA9IHNoYWRlcl9saXN0W2ldOworICAgICAgLyogRnJvbSB0aGUgR0xTTCAxLjUwIHNwZWMsIHBhZ2UgMzk6CisgICAgICAgKgorICAgICAgICogICAiSWYgZ2xfRnJhZ0Nvb3JkIGlzIHJlZGVjbGFyZWQgaW4gYW55IGZyYWdtZW50IHNoYWRlciBpbiBhIHByb2dyYW0sCisgICAgICAgKiAgICBpdCBtdXN0IGJlIHJlZGVjbGFyZWQgaW4gYWxsIHRoZSBmcmFnbWVudCBzaGFkZXJzIGluIHRoYXQgcHJvZ3JhbQorICAgICAgICogICAgdGhhdCBoYXZlIGEgc3RhdGljIHVzZSBnbF9GcmFnQ29vcmQuIgorICAgICAgICoKKyAgICAgICAqIEV4Y2x1ZGUgdGhlIGNhc2Ugd2hlbiBvbmUgb2YgdGhlICdsaW5rZWRfc2hhZGVyJyBvciAnc2hhZGVyJyByZWRlY2xhcmVzCisgICAgICAgKiBnbF9GcmFnQ29vcmQgd2l0aCBubyBsYXlvdXQgcXVhbGlmaWVycyBidXQgdGhlIG90aGVyIG9uZSBkb2Vzbid0CisgICAgICAgKiByZWRlY2xhcmUgaXQuIElmIHdlIHN0cmljdGx5IGZvbGxvdyBHTFNMIDEuNTAgc3BlYydzIGxhbmd1YWdlLCBpdAorICAgICAgICogc2hvdWxkIGJlIGEgbGluayBlcnJvci4gQnV0LCBnZW5lcmF0aW5nIGxpbmsgZXJyb3IgZm9yIHRoaXMgY2FzZSB3aWxsCisgICAgICAgKiBiZSBhIHdyb25nIGJlaGF2aW91ciB3aGljaCBzcGVjIGRpZG4ndCBpbnRlbmQgdG8gZG8gYW5kIGl0IGNvdWxkIGFsc28KKyAgICAgICAqIGJyZWFrIHNvbWUgYXBwbGljYXRpb25zLgorICAgICAgICovCisgICAgICBpZiAoKGxpbmtlZF9zaGFkZXItPnJlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkCisgICAgICAgICAgICYmICFzaGFkZXItPnJlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkCisgICAgICAgICAgICYmIHNoYWRlci0+dXNlc19nbF9mcmFnY29vcmQKKyAgICAgICAgICAgJiYgKGxpbmtlZF9zaGFkZXItPm9yaWdpbl91cHBlcl9sZWZ0CisgICAgICAgICAgICAgICB8fCBsaW5rZWRfc2hhZGVyLT5waXhlbF9jZW50ZXJfaW50ZWdlcikpCisgICAgICAgICAgfHwgKHNoYWRlci0+cmVkZWNsYXJlc19nbF9mcmFnY29vcmQKKyAgICAgICAgICAgICAgJiYgIWxpbmtlZF9zaGFkZXItPnJlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkCisgICAgICAgICAgICAgICYmIGxpbmtlZF9zaGFkZXItPnVzZXNfZ2xfZnJhZ2Nvb3JkCisgICAgICAgICAgICAgICYmIChzaGFkZXItPm9yaWdpbl91cHBlcl9sZWZ0CisgICAgICAgICAgICAgICAgICB8fCBzaGFkZXItPnBpeGVsX2NlbnRlcl9pbnRlZ2VyKSkpIHsKKyAgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImZyYWdtZW50IHNoYWRlciBkZWZpbmVkIHdpdGggY29uZmxpY3RpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQgcXVhbGlmaWVycyBmb3IgZ2xfRnJhZ0Nvb3JkXG4iKTsKKyAgICAgIH0KKworICAgICAgLyogRnJvbSB0aGUgR0xTTCAxLjUwIHNwZWMsIHBhZ2UgMzk6CisgICAgICAgKgorICAgICAgICogICAiQWxsIHJlZGVjbGFyYXRpb25zIG9mIGdsX0ZyYWdDb29yZCBpbiBhbGwgZnJhZ21lbnQgc2hhZGVycyBpbiBhCisgICAgICAgKiAgICBzaW5nbGUgcHJvZ3JhbSBtdXN0IGhhdmUgdGhlIHNhbWUgc2V0IG9mIHF1YWxpZmllcnMuIgorICAgICAgICovCisgICAgICBpZiAobGlua2VkX3NoYWRlci0+cmVkZWNsYXJlc19nbF9mcmFnY29vcmQgJiYgc2hhZGVyLT5yZWRlY2xhcmVzX2dsX2ZyYWdjb29yZAorICAgICAgICAgICYmIChzaGFkZXItPm9yaWdpbl91cHBlcl9sZWZ0ICE9IGxpbmtlZF9zaGFkZXItPm9yaWdpbl91cHBlcl9sZWZ0CisgICAgICAgICAgfHwgc2hhZGVyLT5waXhlbF9jZW50ZXJfaW50ZWdlciAhPSBsaW5rZWRfc2hhZGVyLT5waXhlbF9jZW50ZXJfaW50ZWdlcikpIHsKKyAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiZnJhZ21lbnQgc2hhZGVyIGRlZmluZWQgd2l0aCBjb25mbGljdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgImxheW91dCBxdWFsaWZpZXJzIGZvciBnbF9GcmFnQ29vcmRcbiIpOworICAgICAgfQorCisgICAgICAvKiBVcGRhdGUgdGhlIGxpbmtlZCBzaGFkZXIgc3RhdGUuICBOb3RlIHRoYXQgdXNlc19nbF9mcmFnY29vcmQgc2hvdWxkCisgICAgICAgKiBhY2N1bXVsYXRlIHRoZSByZXN1bHRzLiAgVGhlIG90aGVyIHZhbHVlcyBzaG91bGQgcmVwbGFjZS4gIElmIHRoZXJlCisgICAgICAgKiBhcmUgbXVsdGlwbGUgcmVkZWNsYXJhdGlvbnMsIGFsbCB0aGUgZmllbGRzIGV4Y2VwdCB1c2VzX2dsX2ZyYWdjb29yZAorICAgICAgICogYXJlIGFscmVhZHkga25vd24gdG8gYmUgdGhlIHNhbWUuCisgICAgICAgKi8KKyAgICAgIGlmIChzaGFkZXItPnJlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkIHx8IHNoYWRlci0+dXNlc19nbF9mcmFnY29vcmQpIHsKKyAgICAgICAgIGxpbmtlZF9zaGFkZXItPnJlZGVjbGFyZXNfZ2xfZnJhZ2Nvb3JkID0KKyAgICAgICAgICAgIHNoYWRlci0+cmVkZWNsYXJlc19nbF9mcmFnY29vcmQ7CisgICAgICAgICBsaW5rZWRfc2hhZGVyLT51c2VzX2dsX2ZyYWdjb29yZCA9IGxpbmtlZF9zaGFkZXItPnVzZXNfZ2xfZnJhZ2Nvb3JkCisgICAgICAgICAgICB8fCBzaGFkZXItPnVzZXNfZ2xfZnJhZ2Nvb3JkOworICAgICAgICAgbGlua2VkX3NoYWRlci0+b3JpZ2luX3VwcGVyX2xlZnQgPSBzaGFkZXItPm9yaWdpbl91cHBlcl9sZWZ0OworICAgICAgICAgbGlua2VkX3NoYWRlci0+cGl4ZWxfY2VudGVyX2ludGVnZXIgPSBzaGFkZXItPnBpeGVsX2NlbnRlcl9pbnRlZ2VyOworICAgICAgfQorICAgfQorfQorCisvKioKKyAqIFBlcmZvcm1zIHRoZSBjcm9zcy12YWxpZGF0aW9uIG9mIGdlb21ldHJ5IHNoYWRlciBtYXhfdmVydGljZXMgYW5kCisgKiBwcmltaXRpdmUgdHlwZSBsYXlvdXQgcXVhbGlmaWVycyBmb3IgdGhlIGF0dGFjaGVkIGdlb21ldHJ5IHNoYWRlcnMsCisgKiBhbmQgcHJvcGFnYXRlcyB0aGVtIHRvIHRoZSBsaW5rZWQgR1MgYW5kIGxpbmtlZCBzaGFkZXIgcHJvZ3JhbS4KKyAqLworc3RhdGljIHZvaWQKK2xpbmtfZ3NfaW5vdXRfbGF5b3V0X3F1YWxpZmllcnMoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorCQkJCXN0cnVjdCBnbF9zaGFkZXIgKmxpbmtlZF9zaGFkZXIsCisJCQkJc3RydWN0IGdsX3NoYWRlciAqKnNoYWRlcl9saXN0LAorCQkJCXVuc2lnbmVkIG51bV9zaGFkZXJzKQoreworICAgbGlua2VkX3NoYWRlci0+R2VvbS5WZXJ0aWNlc091dCA9IDA7CisgICBsaW5rZWRfc2hhZGVyLT5HZW9tLkludm9jYXRpb25zID0gMDsKKyAgIGxpbmtlZF9zaGFkZXItPkdlb20uSW5wdXRUeXBlID0gUFJJTV9VTktOT1dOOworICAgbGlua2VkX3NoYWRlci0+R2VvbS5PdXRwdXRUeXBlID0gUFJJTV9VTktOT1dOOworCisgICAvKiBObyBpbi9vdXQgcXVhbGlmaWVycyBkZWZpbmVkIGZvciBhbnl0aGluZyBidXQgR0xTTCAxLjUwKworICAgICogZ2VvbWV0cnkgc2hhZGVycyBzbyBmYXIuCisgICAgKi8KKyAgIGlmIChsaW5rZWRfc2hhZGVyLT5TdGFnZSAhPSBNRVNBX1NIQURFUl9HRU9NRVRSWSB8fCBwcm9nLT5WZXJzaW9uIDwgMTUwKQorICAgICAgcmV0dXJuOworCisgICAvKiBGcm9tIHRoZSBHTFNMIDEuNTAgc3BlYywgcGFnZSA0NjoKKyAgICAqCisgICAgKiAgICAgIkFsbCBnZW9tZXRyeSBzaGFkZXIgb3V0cHV0IGxheW91dCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9ncmFtCisgICAgKiAgICAgIG11c3QgZGVjbGFyZSB0aGUgc2FtZSBsYXlvdXQgYW5kIHNhbWUgdmFsdWUgZm9yCisgICAgKiAgICAgIG1heF92ZXJ0aWNlcy4gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZ2VvbWV0cnkgb3V0cHV0CisgICAgKiAgICAgIGxheW91dCBkZWNsYXJhdGlvbiBzb21ld2hlcmUgaW4gYSBwcm9ncmFtLCBidXQgbm90IGFsbAorICAgICogICAgICBnZW9tZXRyeSBzaGFkZXJzIChjb21waWxhdGlvbiB1bml0cykgYXJlIHJlcXVpcmVkIHRvCisgICAgKiAgICAgIGRlY2xhcmUgaXQuIgorICAgICovCisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fc2hhZGVyczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIgPSBzaGFkZXJfbGlzdFtpXTsKKworICAgICAgaWYgKHNoYWRlci0+R2VvbS5JbnB1dFR5cGUgIT0gUFJJTV9VTktOT1dOKSB7CisJIGlmIChsaW5rZWRfc2hhZGVyLT5HZW9tLklucHV0VHlwZSAhPSBQUklNX1VOS05PV04gJiYKKwkgICAgIGxpbmtlZF9zaGFkZXItPkdlb20uSW5wdXRUeXBlICE9IHNoYWRlci0+R2VvbS5JbnB1dFR5cGUpIHsKKwkgICAgbGlua2VyX2Vycm9yKHByb2csICJnZW9tZXRyeSBzaGFkZXIgZGVmaW5lZCB3aXRoIGNvbmZsaWN0aW5nICIKKwkJCSAiaW5wdXQgdHlwZXNcbiIpOworCSAgICByZXR1cm47CisJIH0KKwkgbGlua2VkX3NoYWRlci0+R2VvbS5JbnB1dFR5cGUgPSBzaGFkZXItPkdlb20uSW5wdXRUeXBlOworICAgICAgfQorCisgICAgICBpZiAoc2hhZGVyLT5HZW9tLk91dHB1dFR5cGUgIT0gUFJJTV9VTktOT1dOKSB7CisJIGlmIChsaW5rZWRfc2hhZGVyLT5HZW9tLk91dHB1dFR5cGUgIT0gUFJJTV9VTktOT1dOICYmCisJICAgICBsaW5rZWRfc2hhZGVyLT5HZW9tLk91dHB1dFR5cGUgIT0gc2hhZGVyLT5HZW9tLk91dHB1dFR5cGUpIHsKKwkgICAgbGlua2VyX2Vycm9yKHByb2csICJnZW9tZXRyeSBzaGFkZXIgZGVmaW5lZCB3aXRoIGNvbmZsaWN0aW5nICIKKwkJCSAib3V0cHV0IHR5cGVzXG4iKTsKKwkgICAgcmV0dXJuOworCSB9CisJIGxpbmtlZF9zaGFkZXItPkdlb20uT3V0cHV0VHlwZSA9IHNoYWRlci0+R2VvbS5PdXRwdXRUeXBlOworICAgICAgfQorCisgICAgICBpZiAoc2hhZGVyLT5HZW9tLlZlcnRpY2VzT3V0ICE9IDApIHsKKwkgaWYgKGxpbmtlZF9zaGFkZXItPkdlb20uVmVydGljZXNPdXQgIT0gMCAmJgorCSAgICAgbGlua2VkX3NoYWRlci0+R2VvbS5WZXJ0aWNlc091dCAhPSBzaGFkZXItPkdlb20uVmVydGljZXNPdXQpIHsKKwkgICAgbGlua2VyX2Vycm9yKHByb2csICJnZW9tZXRyeSBzaGFkZXIgZGVmaW5lZCB3aXRoIGNvbmZsaWN0aW5nICIKKwkJCSAib3V0cHV0IHZlcnRleCBjb3VudCAoJWQgYW5kICVkKVxuIiwKKwkJCSBsaW5rZWRfc2hhZGVyLT5HZW9tLlZlcnRpY2VzT3V0LAorCQkJIHNoYWRlci0+R2VvbS5WZXJ0aWNlc091dCk7CisJICAgIHJldHVybjsKKwkgfQorCSBsaW5rZWRfc2hhZGVyLT5HZW9tLlZlcnRpY2VzT3V0ID0gc2hhZGVyLT5HZW9tLlZlcnRpY2VzT3V0OworICAgICAgfQorCisgICAgICBpZiAoc2hhZGVyLT5HZW9tLkludm9jYXRpb25zICE9IDApIHsKKwkgaWYgKGxpbmtlZF9zaGFkZXItPkdlb20uSW52b2NhdGlvbnMgIT0gMCAmJgorCSAgICAgbGlua2VkX3NoYWRlci0+R2VvbS5JbnZvY2F0aW9ucyAhPSBzaGFkZXItPkdlb20uSW52b2NhdGlvbnMpIHsKKwkgICAgbGlua2VyX2Vycm9yKHByb2csICJnZW9tZXRyeSBzaGFkZXIgZGVmaW5lZCB3aXRoIGNvbmZsaWN0aW5nICIKKwkJCSAiaW52b2NhdGlvbiBjb3VudCAoJWQgYW5kICVkKVxuIiwKKwkJCSBsaW5rZWRfc2hhZGVyLT5HZW9tLkludm9jYXRpb25zLAorCQkJIHNoYWRlci0+R2VvbS5JbnZvY2F0aW9ucyk7CisJICAgIHJldHVybjsKKwkgfQorCSBsaW5rZWRfc2hhZGVyLT5HZW9tLkludm9jYXRpb25zID0gc2hhZGVyLT5HZW9tLkludm9jYXRpb25zOworICAgICAgfQorICAgfQorCisgICAvKiBKdXN0IGRvIHRoZSBpbnRyYXN0YWdlIC0+IGludGVyc3RhZ2UgcHJvcGFnYXRpb24gcmlnaHQgbm93LAorICAgICogc2luY2Ugd2UgYWxyZWFkeSBrbm93IHdlJ3JlIGluIHRoZSByaWdodCB0eXBlIG9mIHNoYWRlciBwcm9ncmFtCisgICAgKiBmb3IgZG9pbmcgaXQuCisgICAgKi8KKyAgIGlmIChsaW5rZWRfc2hhZGVyLT5HZW9tLklucHV0VHlwZSA9PSBQUklNX1VOS05PV04pIHsKKyAgICAgIGxpbmtlcl9lcnJvcihwcm9nLAorCQkgICAiZ2VvbWV0cnkgc2hhZGVyIGRpZG4ndCBkZWNsYXJlIHByaW1pdGl2ZSBpbnB1dCB0eXBlXG4iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHByb2ctPkdlb20uSW5wdXRUeXBlID0gbGlua2VkX3NoYWRlci0+R2VvbS5JbnB1dFR5cGU7CisKKyAgIGlmIChsaW5rZWRfc2hhZGVyLT5HZW9tLk91dHB1dFR5cGUgPT0gUFJJTV9VTktOT1dOKSB7CisgICAgICBsaW5rZXJfZXJyb3IocHJvZywKKwkJICAgImdlb21ldHJ5IHNoYWRlciBkaWRuJ3QgZGVjbGFyZSBwcmltaXRpdmUgb3V0cHV0IHR5cGVcbiIpOworICAgICAgcmV0dXJuOworICAgfQorICAgcHJvZy0+R2VvbS5PdXRwdXRUeXBlID0gbGlua2VkX3NoYWRlci0+R2VvbS5PdXRwdXRUeXBlOworCisgICBpZiAobGlua2VkX3NoYWRlci0+R2VvbS5WZXJ0aWNlc091dCA9PSAwKSB7CisgICAgICBsaW5rZXJfZXJyb3IocHJvZywKKwkJICAgImdlb21ldHJ5IHNoYWRlciBkaWRuJ3QgZGVjbGFyZSBtYXhfdmVydGljZXNcbiIpOworICAgICAgcmV0dXJuOworICAgfQorICAgcHJvZy0+R2VvbS5WZXJ0aWNlc091dCA9IGxpbmtlZF9zaGFkZXItPkdlb20uVmVydGljZXNPdXQ7CisKKyAgIGlmIChsaW5rZWRfc2hhZGVyLT5HZW9tLkludm9jYXRpb25zID09IDApCisgICAgICBsaW5rZWRfc2hhZGVyLT5HZW9tLkludm9jYXRpb25zID0gMTsKKworICAgcHJvZy0+R2VvbS5JbnZvY2F0aW9ucyA9IGxpbmtlZF9zaGFkZXItPkdlb20uSW52b2NhdGlvbnM7Cit9CisKKworLyoqCisgKiBQZXJmb3JtIGNyb3NzLXZhbGlkYXRpb24gb2YgY29tcHV0ZSBzaGFkZXIgbG9jYWxfc2l6ZV97eCx5LHp9IGxheW91dAorICogcXVhbGlmaWVycyBmb3IgdGhlIGF0dGFjaGVkIGNvbXB1dGUgc2hhZGVycywgYW5kIHByb3BhZ2F0ZSB0aGVtIHRvIHRoZQorICogbGlua2VkIENTIGFuZCBsaW5rZWQgc2hhZGVyIHByb2dyYW0uCisgKi8KK3N0YXRpYyB2b2lkCitsaW5rX2NzX2lucHV0X2xheW91dF9xdWFsaWZpZXJzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqbGlua2VkX3NoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqKnNoYWRlcl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fc2hhZGVycykKK3sKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgbGlua2VkX3NoYWRlci0+Q29tcC5Mb2NhbFNpemVbaV0gPSAwOworCisgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgYWxsIHNoYWRlciBzdGFnZXMsIGJ1dCBpdCBvbmx5IGhhcyBhbiBlZmZlY3QKKyAgICAqIGZvciBjb21wdXRlIHNoYWRlcnMuCisgICAgKi8KKyAgIGlmIChsaW5rZWRfc2hhZGVyLT5TdGFnZSAhPSBNRVNBX1NIQURFUl9DT01QVVRFKQorICAgICAgcmV0dXJuOworCisgICAvKiBGcm9tIHRoZSBBUkJfY29tcHV0ZV9zaGFkZXIgc3BlYywgaW4gdGhlIHNlY3Rpb24gZGVzY3JpYmluZyBsb2NhbCBzaXplCisgICAgKiBkZWNsYXJhdGlvbnM6CisgICAgKgorICAgICogICAgIElmIG11bHRpcGxlIGNvbXB1dGUgc2hhZGVycyBhdHRhY2hlZCB0byBhIHNpbmdsZSBwcm9ncmFtIG9iamVjdAorICAgICogICAgIGRlY2xhcmUgbG9jYWwgd29yay1ncm91cCBzaXplLCB0aGUgZGVjbGFyYXRpb25zIG11c3QgYmUgaWRlbnRpY2FsOworICAgICogICAgIG90aGVyd2lzZSBhIGxpbmstdGltZSBlcnJvciByZXN1bHRzLiBGdXJ0aGVybW9yZSwgaWYgYSBwcm9ncmFtCisgICAgKiAgICAgb2JqZWN0IGNvbnRhaW5zIGFueSBjb21wdXRlIHNoYWRlcnMsIGF0IGxlYXN0IG9uZSBtdXN0IGNvbnRhaW4gYW4KKyAgICAqICAgICBpbnB1dCBsYXlvdXQgcXVhbGlmaWVyIHNwZWNpZnlpbmcgdGhlIGxvY2FsIHdvcmsgc2l6ZXMgb2YgdGhlCisgICAgKiAgICAgcHJvZ3JhbSwgb3IgYSBsaW5rLXRpbWUgZXJyb3Igd2lsbCBvY2N1ci4KKyAgICAqLworICAgZm9yICh1bnNpZ25lZCBzaCA9IDA7IHNoIDwgbnVtX3NoYWRlcnM7IHNoKyspIHsKKyAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciA9IHNoYWRlcl9saXN0W3NoXTsKKworICAgICAgaWYgKHNoYWRlci0+Q29tcC5Mb2NhbFNpemVbMF0gIT0gMCkgeworICAgICAgICAgaWYgKGxpbmtlZF9zaGFkZXItPkNvbXAuTG9jYWxTaXplWzBdICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICBpZiAobGlua2VkX3NoYWRlci0+Q29tcC5Mb2NhbFNpemVbaV0gIT0KKyAgICAgICAgICAgICAgICAgICBzaGFkZXItPkNvbXAuTG9jYWxTaXplW2ldKSB7CisgICAgICAgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImNvbXB1dGUgc2hhZGVyIGRlZmluZWQgd2l0aCBjb25mbGljdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsIHNpemVzXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgbGlua2VkX3NoYWRlci0+Q29tcC5Mb2NhbFNpemVbaV0gPSBzaGFkZXItPkNvbXAuTG9jYWxTaXplW2ldOworICAgICAgfQorICAgfQorCisgICAvKiBKdXN0IGRvIHRoZSBpbnRyYXN0YWdlIC0+IGludGVyc3RhZ2UgcHJvcGFnYXRpb24gcmlnaHQgbm93LAorICAgICogc2luY2Ugd2UgYWxyZWFkeSBrbm93IHdlJ3JlIGluIHRoZSByaWdodCB0eXBlIG9mIHNoYWRlciBwcm9ncmFtCisgICAgKiBmb3IgZG9pbmcgaXQuCisgICAgKi8KKyAgIGlmIChsaW5rZWRfc2hhZGVyLT5Db21wLkxvY2FsU2l6ZVswXSA9PSAwKSB7CisgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImNvbXB1dGUgc2hhZGVyIGRpZG4ndCBkZWNsYXJlIGxvY2FsIHNpemVcbiIpOworICAgICAgcmV0dXJuOworICAgfQorICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICBwcm9nLT5Db21wLkxvY2FsU2l6ZVtpXSA9IGxpbmtlZF9zaGFkZXItPkNvbXAuTG9jYWxTaXplW2ldOworfQorCisKKy8qKgorICogQ29tYmluZSBhIGdyb3VwIG9mIHNoYWRlcnMgZm9yIGEgc2luZ2xlIHN0YWdlIHRvIGdlbmVyYXRlIGEgbGlua2VkIHNoYWRlcgorICoKKyAqIFxub3RlCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBsaWVkIGEgc2luZ2xlIHNoYWRlciwgaXQgaXMgY2xvbmVkLCBhbmQgdGhlIG5ldworICogc2hhZGVyIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgc3RydWN0IGdsX3NoYWRlciAqCitsaW5rX2ludHJhc3RhZ2Vfc2hhZGVycyh2b2lkICptZW1fY3R4LAorCQkJc3RydWN0IGdsX2NvbnRleHQgKmN0eCwKKwkJCXN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJCXN0cnVjdCBnbF9zaGFkZXIgKipzaGFkZXJfbGlzdCwKKwkJCXVuc2lnbmVkIG51bV9zaGFkZXJzKQoreworICAgc3RydWN0IGdsX3VuaWZvcm1fYmxvY2sgKnVuaWZvcm1fYmxvY2tzID0gTlVMTDsKKworICAgLyogQ2hlY2sgdGhhdCBnbG9iYWwgdmFyaWFibGVzIGRlZmluZWQgaW4gbXVsdGlwbGUgc2hhZGVycyBhcmUgY29uc2lzdGVudC4KKyAgICAqLworICAgY3Jvc3NfdmFsaWRhdGVfZ2xvYmFscyhwcm9nLCBzaGFkZXJfbGlzdCwgbnVtX3NoYWRlcnMsIGZhbHNlKTsKKyAgIGlmICghcHJvZy0+TGlua1N0YXR1cykKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBDaGVjayB0aGF0IGludGVyZmFjZSBibG9ja3MgZGVmaW5lZCBpbiBtdWx0aXBsZSBzaGFkZXJzIGFyZSBjb25zaXN0ZW50LgorICAgICovCisgICB2YWxpZGF0ZV9pbnRyYXN0YWdlX2ludGVyZmFjZV9ibG9ja3MocHJvZywgKGNvbnN0IGdsX3NoYWRlciAqKilzaGFkZXJfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2hhZGVycyk7CisgICBpZiAoIXByb2ctPkxpbmtTdGF0dXMpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgLyogTGluayB1cCB1bmlmb3JtIGJsb2NrcyBkZWZpbmVkIHdpdGhpbiB0aGlzIHN0YWdlLiAqLworICAgY29uc3QgdW5zaWduZWQgbnVtX3VuaWZvcm1fYmxvY2tzID0KKyAgICAgIGxpbmtfdW5pZm9ybV9ibG9ja3MobWVtX2N0eCwgcHJvZywgc2hhZGVyX2xpc3QsIG51bV9zaGFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5pZm9ybV9ibG9ja3MpOworCisgICAvKiBDaGVjayB0aGF0IHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgZGVmaW5pdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIHNpZ25hdHVyZQorICAgICogYWNyb3NzIGFsbCBzaGFkZXJzLgorICAgICovCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgKG51bV9zaGFkZXJzIC0gMSk7IGkrKykgeworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsIHNoYWRlcl9saXN0W2ldLT5pcikgeworCSBpcl9mdW5jdGlvbiAqY29uc3QgZiA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX2Z1bmN0aW9uKCk7CisKKwkgaWYgKGYgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkgZm9yICh1bnNpZ25lZCBqID0gaSArIDE7IGogPCBudW1fc2hhZGVyczsgaisrKSB7CisJICAgIGlyX2Z1bmN0aW9uICpjb25zdCBvdGhlciA9CisJICAgICAgIHNoYWRlcl9saXN0W2pdLT5zeW1ib2xzLT5nZXRfZnVuY3Rpb24oZi0+bmFtZSk7CisKKwkgICAgLyogSWYgdGhlIG90aGVyIHNoYWRlciBoYXMgbm8gZnVuY3Rpb24gKGFuZCB0aGVyZWZvcmUgbm8gZnVuY3Rpb24KKwkgICAgICogc2lnbmF0dXJlcykgd2l0aCB0aGUgc2FtZSBuYW1lLCBza2lwIHRvIHRoZSBuZXh0IHNoYWRlci4KKwkgICAgICovCisJICAgIGlmIChvdGhlciA9PSBOVUxMKQorCSAgICAgICBjb250aW51ZTsKKworCSAgICBmb3JlYWNoX2xpc3QobiwgJmYtPnNpZ25hdHVyZXMpIHsKKwkgICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPSAoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopIG47CisKKwkgICAgICAgaWYgKCFzaWctPmlzX2RlZmluZWQgfHwgc2lnLT5pc19idWlsdGluKCkpCisJCSAgY29udGludWU7CisKKwkgICAgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpvdGhlcl9zaWcgPQorCQkgIG90aGVyLT5leGFjdF9tYXRjaGluZ19zaWduYXR1cmUoTlVMTCwgJnNpZy0+cGFyYW1ldGVycyk7CisKKwkgICAgICAgaWYgKChvdGhlcl9zaWcgIT0gTlVMTCkgJiYgb3RoZXJfc2lnLT5pc19kZWZpbmVkCisJCSAgICYmICFvdGhlcl9zaWctPmlzX2J1aWx0aW4oKSkgeworCQkgIGxpbmtlcl9lcnJvcihwcm9nLCAiZnVuY3Rpb24gYCVzJyBpcyBtdWx0aXBseSBkZWZpbmVkIiwKKwkJCSAgICAgICBmLT5uYW1lKTsKKwkJICByZXR1cm4gTlVMTDsKKwkgICAgICAgfQorCSAgICB9CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogRmluZCB0aGUgc2hhZGVyIHRoYXQgZGVmaW5lcyBtYWluLCBhbmQgbWFrZSBhIGNsb25lIG9mIGl0LgorICAgICoKKyAgICAqIFN0YXJ0aW5nIHdpdGggdGhlIGNsb25lLCBzZWFyY2ggZm9yIHVuZGVmaW5lZCByZWZlcmVuY2VzLiAgSWYgb25lIGlzCisgICAgKiBmb3VuZCwgZmluZCB0aGUgc2hhZGVyIHRoYXQgZGVmaW5lcyBpdC4gIENsb25lIHRoZSByZWZlcmVuY2UgYW5kIGFkZAorICAgICogaXQgdG8gdGhlIHNoYWRlci4gIFJlcGVhdCB1bnRpbCB0aGVyZSBhcmUgbm8gdW5kZWZpbmVkIHJlZmVyZW5jZXMgb3IKKyAgICAqIHVudGlsIGEgcmVmZXJlbmNlIGNhbm5vdCBiZSByZXNvbHZlZC4KKyAgICAqLworICAgZ2xfc2hhZGVyICptYWluID0gTlVMTDsKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fc2hhZGVyczsgaSsrKSB7CisgICAgICBpZiAoZ2V0X21haW5fZnVuY3Rpb25fc2lnbmF0dXJlKHNoYWRlcl9saXN0W2ldKSAhPSBOVUxMKSB7CisJIG1haW4gPSBzaGFkZXJfbGlzdFtpXTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGlmIChtYWluID09IE5VTEwpIHsKKyAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiJXMgc2hhZGVyIGxhY2tzIGBtYWluJ1xuIiwKKwkJICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhzaGFkZXJfbGlzdFswXS0+U3RhZ2UpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBnbF9zaGFkZXIgKmxpbmtlZCA9IGN0eC0+RHJpdmVyLk5ld1NoYWRlcihOVUxMLCAwLCBtYWluLT5UeXBlKTsKKyAgIGxpbmtlZC0+aXIgPSBuZXcobGlua2VkKSBleGVjX2xpc3Q7CisgICBjbG9uZV9pcl9saXN0KG1lbV9jdHgsIGxpbmtlZC0+aXIsIG1haW4tPmlyKTsKKworICAgbGlua2VkLT5Vbmlmb3JtQmxvY2tzID0gdW5pZm9ybV9ibG9ja3M7CisgICBsaW5rZWQtPk51bVVuaWZvcm1CbG9ja3MgPSBudW1fdW5pZm9ybV9ibG9ja3M7CisgICByYWxsb2Nfc3RlYWwobGlua2VkLCBsaW5rZWQtPlVuaWZvcm1CbG9ja3MpOworCisgICBsaW5rX2ZzX2lucHV0X2xheW91dF9xdWFsaWZpZXJzKHByb2csIGxpbmtlZCwgc2hhZGVyX2xpc3QsIG51bV9zaGFkZXJzKTsKKyAgIGxpbmtfZ3NfaW5vdXRfbGF5b3V0X3F1YWxpZmllcnMocHJvZywgbGlua2VkLCBzaGFkZXJfbGlzdCwgbnVtX3NoYWRlcnMpOworICAgbGlua19jc19pbnB1dF9sYXlvdXRfcXVhbGlmaWVycyhwcm9nLCBsaW5rZWQsIHNoYWRlcl9saXN0LCBudW1fc2hhZGVycyk7CisKKyAgIHBvcHVsYXRlX3N5bWJvbF90YWJsZShsaW5rZWQpOworCisgICAvKiBUaGUgYSBwb2ludGVyIHRvIHRoZSBtYWluIGZ1bmN0aW9uIGluIHRoZSBmaW5hbCBsaW5rZWQgc2hhZGVyIChpLmUuLCB0aGUKKyAgICAqIGNvcHkgb2YgdGhlIG9yaWdpbmFsIHNoYWRlciB0aGF0IGNvbnRhaW5lZCB0aGUgbWFpbiBmdW5jdGlvbikuCisgICAgKi8KKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqY29uc3QgbWFpbl9zaWcgPSBnZXRfbWFpbl9mdW5jdGlvbl9zaWduYXR1cmUobGlua2VkKTsKKworICAgLyogTW92ZSBhbnkgaW5zdHJ1Y3Rpb25zIG90aGVyIHRoYW4gdmFyaWFibGUgZGVjbGFyYXRpb25zIG9yIGZ1bmN0aW9uCisgICAgKiBkZWNsYXJhdGlvbnMgaW50byBtYWluLgorICAgICovCisgICBleGVjX25vZGUgKmluc2VydGlvbl9wb2ludCA9CisgICAgICBtb3ZlX25vbl9kZWNsYXJhdGlvbnMobGlua2VkLT5pciwgKGV4ZWNfbm9kZSAqKSAmbWFpbl9zaWctPmJvZHksIGZhbHNlLAorCQkJICAgIGxpbmtlZCk7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fc2hhZGVyczsgaSsrKSB7CisgICAgICBpZiAoc2hhZGVyX2xpc3RbaV0gPT0gbWFpbikKKwkgY29udGludWU7CisKKyAgICAgIGluc2VydGlvbl9wb2ludCA9IG1vdmVfbm9uX2RlY2xhcmF0aW9ucyhzaGFkZXJfbGlzdFtpXS0+aXIsCisJCQkJCSAgICAgIGluc2VydGlvbl9wb2ludCwgdHJ1ZSwgbGlua2VkKTsKKyAgIH0KKworICAgLyogQ2hlY2sgaWYgYW55IHNoYWRlciBuZWVkcyBidWlsdC1pbiBmdW5jdGlvbnMuICovCisgICBib29sIG5lZWRfYnVpbHRpbnMgPSBmYWxzZTsKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fc2hhZGVyczsgaSsrKSB7CisgICAgICBpZiAoc2hhZGVyX2xpc3RbaV0tPnVzZXNfYnVpbHRpbl9mdW5jdGlvbnMpIHsKKyAgICAgICAgIG5lZWRfYnVpbHRpbnMgPSB0cnVlOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGJvb2wgb2s7CisgICBpZiAobmVlZF9idWlsdGlucykgeworICAgICAgLyogTWFrZSBhIHRlbXBvcmFyeSBhcnJheSBvbmUgbGFyZ2VyIHRoYW4gc2hhZGVyX2xpc3QsIHdoaWNoIHdpbGwgaG9sZAorICAgICAgICogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIHNoYWRlciBhcyB3ZWxsLgorICAgICAgICovCisgICAgICBnbF9zaGFkZXIgKipsaW5raW5nX3NoYWRlcnMgPSAoZ2xfc2hhZGVyICoqKQorICAgICAgICAgY2FsbG9jKG51bV9zaGFkZXJzICsgMSwgc2l6ZW9mKGdsX3NoYWRlciAqKSk7CisgICAgICBtZW1jcHkobGlua2luZ19zaGFkZXJzLCBzaGFkZXJfbGlzdCwgbnVtX3NoYWRlcnMgKiBzaXplb2YoZ2xfc2hhZGVyICopKTsKKyAgICAgIGxpbmtpbmdfc2hhZGVyc1tudW1fc2hhZGVyc10gPSBfbWVzYV9nbHNsX2dldF9idWlsdGluX2Z1bmN0aW9uX3NoYWRlcigpOworCisgICAgICBvayA9IGxpbmtfZnVuY3Rpb25fY2FsbHMocHJvZywgbGlua2VkLCBsaW5raW5nX3NoYWRlcnMsIG51bV9zaGFkZXJzICsgMSk7CisKKyAgICAgIGZyZWUobGlua2luZ19zaGFkZXJzKTsKKyAgIH0gZWxzZSB7CisgICAgICBvayA9IGxpbmtfZnVuY3Rpb25fY2FsbHMocHJvZywgbGlua2VkLCBzaGFkZXJfbGlzdCwgbnVtX3NoYWRlcnMpOworICAgfQorCisKKyAgIGlmICghb2spIHsKKyAgICAgIGN0eC0+RHJpdmVyLkRlbGV0ZVNoYWRlcihjdHgsIGxpbmtlZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLyogQXQgdGhpcyBwb2ludCBsaW5rZWQgc2hvdWxkIGNvbnRhaW4gYWxsIG9mIHRoZSBsaW5rZWQgSVIsIHNvCisgICAgKiB2YWxpZGF0ZSBpdCB0byBtYWtlIHN1cmUgbm90aGluZyB3ZW50IHdyb25nLgorICAgICovCisgICB2YWxpZGF0ZV9pcl90cmVlKGxpbmtlZC0+aXIpOworCisgICAvKiBTZXQgdGhlIHNpemUgb2YgZ2VvbWV0cnkgc2hhZGVyIGlucHV0IGFycmF5cyAqLworICAgaWYgKGxpbmtlZC0+U3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlkpIHsKKyAgICAgIHVuc2lnbmVkIG51bV92ZXJ0aWNlcyA9IHZlcnRpY2VzX3Blcl9wcmltKHByb2ctPkdlb20uSW5wdXRUeXBlKTsKKyAgICAgIGdlb21fYXJyYXlfcmVzaXplX3Zpc2l0b3IgaW5wdXRfcmVzaXplX3Zpc2l0b3IobnVtX3ZlcnRpY2VzLCBwcm9nKTsKKyAgICAgIGZvcmVhY2hfbGlzdChuLCBsaW5rZWQtPmlyKSB7CisgICAgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKyAgICAgICAgIGlyLT5hY2NlcHQoJmlucHV0X3Jlc2l6ZV92aXNpdG9yKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogTWFrZSBhIHBhc3Mgb3ZlciBhbGwgdmFyaWFibGUgZGVjbGFyYXRpb25zIHRvIGVuc3VyZSB0aGF0IGFycmF5cyB3aXRoCisgICAgKiB1bnNwZWNpZmllZCBzaXplcyBoYXZlIGEgc2l6ZSBzcGVjaWZpZWQuICBUaGUgc2l6ZSBpcyBpbmZlcnJlZCBmcm9tIHRoZQorICAgICogbWF4X2FycmF5X2FjY2VzcyBmaWVsZC4KKyAgICAqLworICAgYXJyYXlfc2l6aW5nX3Zpc2l0b3IgdjsKKyAgIHYucnVuKGxpbmtlZC0+aXIpOworICAgdi5maXh1cF91bm5hbWVkX2ludGVyZmFjZV90eXBlcygpOworCisgICByZXR1cm4gbGlua2VkOworfQorCisvKioKKyAqIFVwZGF0ZSB0aGUgc2l6ZXMgb2YgbGlua2VkIHNoYWRlciB1bmlmb3JtIGFycmF5cyB0byB0aGUgbWF4aW11bQorICogYXJyYXkgaW5kZXggdXNlZC4KKyAqCisgKiBGcm9tIHBhZ2UgODEgKHBhZ2UgOTUgb2YgdGhlIFBERikgb2YgdGhlIE9wZW5HTCAyLjEgc3BlYzoKKyAqCisgKiAgICAgSWYgb25lIG9yIG1vcmUgZWxlbWVudHMgb2YgYW4gYXJyYXkgYXJlIGFjdGl2ZSwKKyAqICAgICBHZXRBY3RpdmVVbmlmb3JtIHdpbGwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhcnJheSBpbiBuYW1lLAorICogICAgIHN1YmplY3QgdG8gdGhlIHJlc3RyaWN0aW9ucyBsaXN0ZWQgYWJvdmUuIFRoZSB0eXBlIG9mIHRoZSBhcnJheQorICogICAgIGlzIHJldHVybmVkIGluIHR5cGUuIFRoZSBzaXplIHBhcmFtZXRlciBjb250YWlucyB0aGUgaGlnaGVzdAorICogICAgIGFycmF5IGVsZW1lbnQgaW5kZXggdXNlZCwgcGx1cyBvbmUuIFRoZSBjb21waWxlciBvciBsaW5rZXIKKyAqICAgICBkZXRlcm1pbmVzIHRoZSBoaWdoZXN0IGluZGV4IHVzZWQuICBUaGVyZSB3aWxsIGJlIG9ubHkgb25lCisgKiAgICAgYWN0aXZlIHVuaWZvcm0gcmVwb3J0ZWQgYnkgdGhlIEdMIHBlciB1bmlmb3JtIGFycmF5LgorCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfYXJyYXlfc2l6ZXMoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisJIGlmIChwcm9nLT5fTGlua2VkU2hhZGVyc1tpXSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKworICAgICAgZm9yZWFjaF9saXN0KG5vZGUsIHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldLT5pcikgeworCSBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworCSBpZiAoKHZhciA9PSBOVUxMKSB8fCAodmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3VuaWZvcm0pIHx8CisJICAgICAhdmFyLT50eXBlLT5pc19hcnJheSgpKQorCSAgICBjb250aW51ZTsKKworCSAvKiBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0IHNheXMgdGhhdCBzdGQxNDAgdW5pZm9ybXMKKwkgICogd2lsbCBub3QgYmUgZWxpbWluYXRlZC4gIFNpbmNlIHdlIGFsd2F5cyBkbyBzdGQxNDAsIGp1c3QKKwkgICogZG9uJ3QgcmVzaXplIGFycmF5cyBpbiBVQk9zLgorICAgICAgICAgICoKKyAgICAgICAgICAqIEF0b21pYyBjb3VudGVycyBhcmUgc3VwcG9zZWQgdG8gZ2V0IGRldGVybWluaXN0aWMKKyAgICAgICAgICAqIGxvY2F0aW9ucyBhc3NpZ25lZCBiYXNlZCBvbiB0aGUgZGVjbGFyYXRpb24gb3JkZXJpbmcgYW5kCisgICAgICAgICAgKiBzaXplcywgYXJyYXkgY29tcGFjdGlvbiB3b3VsZCBtZXNzIHRoYXQgdXAuCisJICAqLworCSBpZiAodmFyLT5pc19pbl91bmlmb3JtX2Jsb2NrKCkgfHwgdmFyLT50eXBlLT5jb250YWluc19hdG9taWMoKSkKKwkgICAgY29udGludWU7CisKKwkgdW5zaWduZWQgaW50IHNpemUgPSB2YXItPmRhdGEubWF4X2FycmF5X2FjY2VzczsKKwkgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaisrKSB7CisJICAgICAgIGlmIChwcm9nLT5fTGlua2VkU2hhZGVyc1tqXSA9PSBOVUxMKQorCQkgIGNvbnRpbnVlOworCisJICAgIGZvcmVhY2hfbGlzdChub2RlMiwgcHJvZy0+X0xpbmtlZFNoYWRlcnNbal0tPmlyKSB7CisJICAgICAgIGlyX3ZhcmlhYmxlICpvdGhlcl92YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUyKS0+YXNfdmFyaWFibGUoKTsKKwkgICAgICAgaWYgKCFvdGhlcl92YXIpCisJCSAgY29udGludWU7CisKKwkgICAgICAgaWYgKHN0cmNtcCh2YXItPm5hbWUsIG90aGVyX3Zhci0+bmFtZSkgPT0gMCAmJgorCQkgICBvdGhlcl92YXItPmRhdGEubWF4X2FycmF5X2FjY2VzcyA+IHNpemUpIHsKKwkJICBzaXplID0gb3RoZXJfdmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3M7CisJICAgICAgIH0KKwkgICAgfQorCSB9CisKKwkgaWYgKHNpemUgKyAxICE9IHZhci0+dHlwZS0+bGVuZ3RoKSB7CisJICAgIC8qIElmIHRoaXMgaXMgYSBidWlsdC1pbiB1bmlmb3JtIChpLmUuLCBpdCdzIGJhY2tlZCBieSBzb21lCisJICAgICAqIGZpeGVkLWZ1bmN0aW9uIHN0YXRlKSwgYWRqdXN0IHRoZSBudW1iZXIgb2Ygc3RhdGUgc2xvdHMgdG8KKwkgICAgICogbWF0Y2ggdGhlIG5ldyBhcnJheSBzaXplLiAgVGhlIG51bWJlciBvZiBzbG90cyBwZXIgYXJyYXkgZW50cnkKKwkgICAgICogaXMgbm90IGtub3duLiAgSXQgc2VlbXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mCisJICAgICAqIHNsb3RzIGlzIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cy4KKwkgICAgICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc2xvdHMgcGVyIGFycmF5IGVsZW1lbnQgYnkgZGl2aWRpbmcgYnkKKwkgICAgICogdGhlIG9sZCAodG90YWwpIHNpemUuCisJICAgICAqLworCSAgICBpZiAodmFyLT5udW1fc3RhdGVfc2xvdHMgPiAwKSB7CisJICAgICAgIHZhci0+bnVtX3N0YXRlX3Nsb3RzID0gKHNpemUgKyAxKQorCQkgICogKHZhci0+bnVtX3N0YXRlX3Nsb3RzIC8gdmFyLT50eXBlLT5sZW5ndGgpOworCSAgICB9CisKKwkgICAgdmFyLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UodmFyLT50eXBlLT5maWVsZHMuYXJyYXksCisJCQkJCQkgICAgICBzaXplICsgMSk7CisJICAgIC8qIEZJTklTSE1FOiBXZSBzaG91bGQgdXBkYXRlIHRoZSB0eXBlcyBvZiBhcnJheQorCSAgICAgKiBkZXJlZmVyZW5jZXMgb2YgdGhpcyB2YXJpYWJsZSBub3cuCisJICAgICAqLworCSB9CisgICAgICB9CisgICB9Cit9CisKKy8qKgorICogRmluZCBhIGNvbnRpZ3VvdXMgc2V0IG9mIGF2YWlsYWJsZSBiaXRzIGluIGEgYml0bWFzay4KKyAqCisgKiBccGFyYW0gdXNlZF9tYXNrICAgICBCaXRzIHJlcHJlc2VudGluZyB1c2VkICgxKSBhbmQgdW51c2VkICgwKSBsb2NhdGlvbnMKKyAqIFxwYXJhbSBuZWVkZWRfY291bnQgIE51bWJlciBvZiBjb250aWd1b3VzIGJpdHMgbmVlZGVkLgorICoKKyAqIFxyZXR1cm4KKyAqIEJhc2UgbG9jYXRpb24gb2YgdGhlIGF2YWlsYWJsZSBiaXRzIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4KKyAqLworaW50CitmaW5kX2F2YWlsYWJsZV9zbG90cyh1bnNpZ25lZCB1c2VkX21hc2ssIHVuc2lnbmVkIG5lZWRlZF9jb3VudCkKK3sKKyAgIHVuc2lnbmVkIG5lZWRlZF9tYXNrID0gKDEgPDwgbmVlZGVkX2NvdW50KSAtIDE7CisgICBjb25zdCBpbnQgbWF4X2JpdF90b190ZXN0ID0gKDggKiBzaXplb2YodXNlZF9tYXNrKSkgLSBuZWVkZWRfY291bnQ7CisKKyAgIC8qIFRoZSBjb21wYXJpc29uIHRvIDMyIGlzIHJlZHVuZGFudCwgYnV0IHdpdGhvdXQgaXQgR0NDIGVtaXRzICJ3YXJuaW5nOgorICAgICogY2Fubm90IG9wdGltaXplIHBvc3NpYmx5IGluZmluaXRlIGxvb3BzIiBmb3IgdGhlIGxvb3AgYmVsb3cuCisgICAgKi8KKyAgIGlmICgobmVlZGVkX2NvdW50ID09IDApIHx8IChtYXhfYml0X3RvX3Rlc3QgPCAwKSB8fCAobWF4X2JpdF90b190ZXN0ID4gMzIpKQorICAgICAgcmV0dXJuIC0xOworCisgICBmb3IgKGludCBpID0gMDsgaSA8PSBtYXhfYml0X3RvX3Rlc3Q7IGkrKykgeworICAgICAgaWYgKChuZWVkZWRfbWFzayAmIH51c2VkX21hc2spID09IG5lZWRlZF9tYXNrKQorCSByZXR1cm4gaTsKKworICAgICAgbmVlZGVkX21hc2sgPDw9IDE7CisgICB9CisKKyAgIHJldHVybiAtMTsKK30KKworCisvKioKKyAqIEFzc2lnbiBsb2NhdGlvbnMgZm9yIGVpdGhlciBWUyBpbnB1dHMgZm9yIEZTIG91dHB1dHMKKyAqCisgKiBccGFyYW0gcHJvZyAgICAgICAgICBTaGFkZXIgcHJvZ3JhbSB3aG9zZSB2YXJpYWJsZXMgbmVlZCBsb2NhdGlvbnMgYXNzaWduZWQKKyAqIFxwYXJhbSB0YXJnZXRfaW5kZXggIFNlbGVjdG9yIGZvciB0aGUgcHJvZ3JhbSB0YXJnZXQgdG8gcmVjZWl2ZSBsb2NhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgYXNzaWdubW5ldHMuICBNdXN0IGJlIGVpdGhlciBcYyBNRVNBX1NIQURFUl9WRVJURVggb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIFxjIE1FU0FfU0hBREVSX0ZSQUdNRU5ULgorICogXHBhcmFtIG1heF9pbmRleCAgICAgTWF4aW11bSBudW1iZXIgb2YgZ2VuZXJpYyBsb2NhdGlvbnMuICBUaGlzIGNvcnJlc3BvbmRzCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBlaXRoZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRyYXcgYnVmZmVycyBvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGdlbmVyaWMgYXR0cmlidXRlcy4KKyAqCisgKiBccmV0dXJuCisgKiBJZiBsb2NhdGlvbnMgYXJlIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCwgdHJ1ZSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSBhbgorICogZXJyb3IgaXMgZW1pdHRlZCB0byB0aGUgc2hhZGVyIGxpbmsgbG9nIGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAqLworYm9vbAorYXNzaWduX2F0dHJpYnV0ZV9vcl9jb2xvcl9sb2NhdGlvbnMoZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisJCQkJICAgIHVuc2lnbmVkIHRhcmdldF9pbmRleCwKKwkJCQkgICAgdW5zaWduZWQgbWF4X2luZGV4KQoreworICAgLyogTWFyayBpbnZhbGlkIGxvY2F0aW9ucyBhcyBiZWluZyB1c2VkLgorICAgICovCisgICB1bnNpZ25lZCB1c2VkX2xvY2F0aW9ucyA9IChtYXhfaW5kZXggPj0gMzIpCisgICAgICA/IH4wIDogfigoMSA8PCBtYXhfaW5kZXgpIC0gMSk7CisKKyAgIGFzc2VydCgodGFyZ2V0X2luZGV4ID09IE1FU0FfU0hBREVSX1ZFUlRFWCkKKwkgIHx8ICh0YXJnZXRfaW5kZXggPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpKTsKKworICAgZ2xfc2hhZGVyICpjb25zdCBzaCA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW3RhcmdldF9pbmRleF07CisgICBpZiAoc2ggPT0gTlVMTCkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAvKiBPcGVyYXRlIGluIGEgdG90YWwgb2YgZm91ciBwYXNzZXMuCisgICAgKgorICAgICogMS4gSW52YWxpZGF0ZSB0aGUgbG9jYXRpb24gYXNzaWdubWVudHMgZm9yIGFsbCB2ZXJ0ZXggc2hhZGVyIGlucHV0cy4KKyAgICAqCisgICAgKiAyLiBBc3NpZ24gbG9jYXRpb25zIGZvciBpbnB1dHMgdGhhdCBoYXZlIHVzZXItZGVmaW5lZCAodmlhCisgICAgKiAgICBnbEJpbmRWZXJ0ZXhBdHRyaWJMb2NhdGlvbikgbG9jYXRpb25zIGFuZCBvdXRwdXRzIHRoYXQgaGF2ZQorICAgICogICAgdXNlci1kZWZpbmVkIGxvY2F0aW9ucyAodmlhIGdsQmluZEZyYWdEYXRhTG9jYXRpb24pLgorICAgICoKKyAgICAqIDMuIFNvcnQgdGhlIGF0dHJpYnV0ZXMgd2l0aG91dCBhc3NpZ25lZCBsb2NhdGlvbnMgYnkgbnVtYmVyIG9mIHNsb3RzCisgICAgKiAgICByZXF1aXJlZCBpbiBkZWNyZWFzaW5nIG9yZGVyLiAgRnJhZ21lbnRhdGlvbiBjYXVzZWQgYnkgYXR0cmlidXRlCisgICAgKiAgICBsb2NhdGlvbnMgYXNzaWduZWQgYnkgdGhlIGFwcGxpY2F0aW9uIG1heSBwcmV2ZW50IGxhcmdlIGF0dHJpYnV0ZXMKKyAgICAqICAgIGZyb20gaGF2aW5nIGVub3VnaCBjb250aWd1b3VzIHNwYWNlLgorICAgICoKKyAgICAqIDQuIEFzc2lnbiBsb2NhdGlvbnMgdG8gYW55IGlucHV0cyB3aXRob3V0IGFzc2lnbmVkIGxvY2F0aW9ucy4KKyAgICAqLworCisgICBjb25zdCBpbnQgZ2VuZXJpY19iYXNlID0gKHRhcmdldF9pbmRleCA9PSBNRVNBX1NIQURFUl9WRVJURVgpCisgICAgICA/IChpbnQpIFZFUlRfQVRUUklCX0dFTkVSSUMwIDogKGludCkgRlJBR19SRVNVTFRfREFUQTA7CisKKyAgIGNvbnN0IGVudW0gaXJfdmFyaWFibGVfbW9kZSBkaXJlY3Rpb24gPQorICAgICAgKHRhcmdldF9pbmRleCA9PSBNRVNBX1NIQURFUl9WRVJURVgpCisgICAgICA/IGlyX3Zhcl9zaGFkZXJfaW4gOiBpcl92YXJfc2hhZGVyX291dDsKKworCisgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBsb2NhdGlvbnMgYXNzaWduZWQuCisgICAgKi8KKyAgIHN0cnVjdCB0ZW1wX2F0dHIgeworICAgICAgdW5zaWduZWQgc2xvdHM7CisgICAgICBpcl92YXJpYWJsZSAqdmFyOworCisgICAgICAvKiBVc2VkIGJlbG93IGluIHRoZSBjYWxsIHRvIHFzb3J0LiAqLworICAgICAgc3RhdGljIGludCBjb21wYXJlKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisgICAgICB7CisJIGNvbnN0IHRlbXBfYXR0ciAqY29uc3QgbCA9IChjb25zdCB0ZW1wX2F0dHIgKikgYTsKKwkgY29uc3QgdGVtcF9hdHRyICpjb25zdCByID0gKGNvbnN0IHRlbXBfYXR0ciAqKSBiOworCisJIC8qIFJldmVyc2VkIGJlY2F1c2Ugd2Ugd2FudCBhIGRlc2NlbmRpbmcgb3JkZXIgc29ydCBiZWxvdy4gKi8KKwkgcmV0dXJuIHItPnNsb3RzIC0gbC0+c2xvdHM7CisgICAgICB9CisgICB9IHRvX2Fzc2lnblsxNl07CisKKyAgIHVuc2lnbmVkIG51bV9hdHRyID0gMDsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsIHNoLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICgodmFyID09IE5VTEwpIHx8ICh2YXItPmRhdGEubW9kZSAhPSAodW5zaWduZWQpIGRpcmVjdGlvbikpCisJIGNvbnRpbnVlOworCisgICAgICBpZiAodmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKSB7CisJIGlmICgodmFyLT5kYXRhLmxvY2F0aW9uID49IChpbnQpKG1heF9pbmRleCArIGdlbmVyaWNfYmFzZSkpCisJICAgICB8fCAodmFyLT5kYXRhLmxvY2F0aW9uIDwgMCkpIHsKKwkgICAgbGlua2VyX2Vycm9yKHByb2csCisJCQkgImludmFsaWQgZXhwbGljaXQgbG9jYXRpb24gJWQgc3BlY2lmaWVkIGZvciBgJXMnXG4iLAorCQkJICh2YXItPmRhdGEubG9jYXRpb24gPCAwKQorCQkJID8gdmFyLT5kYXRhLmxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YXItPmRhdGEubG9jYXRpb24gLSBnZW5lcmljX2Jhc2UsCisJCQkgdmFyLT5uYW1lKTsKKwkgICAgcmV0dXJuIGZhbHNlOworCSB9CisgICAgICB9IGVsc2UgaWYgKHRhcmdldF9pbmRleCA9PSBNRVNBX1NIQURFUl9WRVJURVgpIHsKKwkgdW5zaWduZWQgYmluZGluZzsKKworCSBpZiAocHJvZy0+QXR0cmlidXRlQmluZGluZ3MtPmdldChiaW5kaW5nLCB2YXItPm5hbWUpKSB7CisJICAgIGFzc2VydChiaW5kaW5nID49IFZFUlRfQVRUUklCX0dFTkVSSUMwKTsKKwkgICAgdmFyLT5kYXRhLmxvY2F0aW9uID0gYmluZGluZzsKKyAgICAgICAgICAgIHZhci0+ZGF0YS5pc191bm1hdGNoZWRfZ2VuZXJpY19pbm91dCA9IDA7CisJIH0KKyAgICAgIH0gZWxzZSBpZiAodGFyZ2V0X2luZGV4ID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UKSB7CisJIHVuc2lnbmVkIGJpbmRpbmc7CisJIHVuc2lnbmVkIGluZGV4OworCisJIGlmIChwcm9nLT5GcmFnRGF0YUJpbmRpbmdzLT5nZXQoYmluZGluZywgdmFyLT5uYW1lKSkgeworCSAgICBhc3NlcnQoYmluZGluZyA+PSBGUkFHX1JFU1VMVF9EQVRBMCk7CisJICAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IGJpbmRpbmc7CisgICAgICAgICAgICB2YXItPmRhdGEuaXNfdW5tYXRjaGVkX2dlbmVyaWNfaW5vdXQgPSAwOworCisJICAgIGlmIChwcm9nLT5GcmFnRGF0YUluZGV4QmluZGluZ3MtPmdldChpbmRleCwgdmFyLT5uYW1lKSkgeworCSAgICAgICB2YXItPmRhdGEuaW5kZXggPSBpbmRleDsKKwkgICAgfQorCSB9CisgICAgICB9CisKKyAgICAgIC8qIElmIHRoZSB2YXJpYWJsZSBpcyBub3QgYSBidWlsdC1pbiBhbmQgaGFzIGEgbG9jYXRpb24gc3RhdGljYWxseQorICAgICAgICogYXNzaWduZWQgaW4gdGhlIHNoYWRlciAocHJlc3VtYWJseSB2aWEgYSBsYXlvdXQgcXVhbGlmaWVyKSwgbWFrZSBzdXJlCisgICAgICAgKiB0aGF0IGl0IGRvZXNuJ3QgY29sbGlkZSB3aXRoIG90aGVyIGFzc2lnbmVkIGxvY2F0aW9ucy4gIE90aGVyd2lzZSwKKyAgICAgICAqIGFkZCBpdCB0byB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgdGhhdCBuZWVkIGxpbmtlci1hc3NpZ25lZCBsb2NhdGlvbnMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHVuc2lnbmVkIHNsb3RzID0gdmFyLT50eXBlLT5jb3VudF9hdHRyaWJ1dGVfc2xvdHMoKTsKKyAgICAgIGlmICh2YXItPmRhdGEubG9jYXRpb24gIT0gLTEpIHsKKwkgaWYgKHZhci0+ZGF0YS5sb2NhdGlvbiA+PSBnZW5lcmljX2Jhc2UgJiYgdmFyLT5kYXRhLmluZGV4IDwgMSkgeworCSAgICAvKiBGcm9tIHBhZ2UgNjEgb2YgdGhlIE9wZW5HTCA0LjAgc3BlYzoKKwkgICAgICoKKwkgICAgICogICAgICJMaW5rUHJvZ3JhbSB3aWxsIGZhaWwgaWYgdGhlIGF0dHJpYnV0ZSBiaW5kaW5ncyBhc3NpZ25lZAorCSAgICAgKiAgICAgYnkgQmluZEF0dHJpYkxvY2F0aW9uIGRvIG5vdCBsZWF2ZSBub3QgZW5vdWdoIHNwYWNlIHRvCisJICAgICAqICAgICBhc3NpZ24gYSBsb2NhdGlvbiBmb3IgYW4gYWN0aXZlIG1hdHJpeCBhdHRyaWJ1dGUgb3IgYW4KKwkgICAgICogICAgIGFjdGl2ZSBhdHRyaWJ1dGUgYXJyYXksIGJvdGggb2Ygd2hpY2ggcmVxdWlyZSBtdWx0aXBsZQorCSAgICAgKiAgICAgY29udGlndW91cyBnZW5lcmljIGF0dHJpYnV0ZXMuIgorCSAgICAgKgorCSAgICAgKiBJIHRoaW5rIGFib3ZlIHRleHQgcHJvaGliaXRzIHRoZSBhbGlhc2luZyBvZiBleHBsaWNpdCBhbmQKKwkgICAgICogYXV0b21hdGljIGFzc2lnbm1lbnRzLiBCdXQsIGFsaWFzaW5nIGlzIGFsbG93ZWQgaW4gbWFudWFsCisJICAgICAqIGFzc2lnbm1lbnRzIG9mIGF0dHJpYnV0ZSBsb2NhdGlvbnMuIFNlZSBiZWxvdyBjb21tZW50cyBmb3IKKwkgICAgICogdGhlIGRldGFpbHMuCisJICAgICAqCisJICAgICAqIEZyb20gT3BlbkdMIDQuMCBzcGVjLCBwYWdlIDYxOgorCSAgICAgKgorCSAgICAgKiAgICAgIkl0IGlzIHBvc3NpYmxlIGZvciBhbiBhcHBsaWNhdGlvbiB0byBiaW5kIG1vcmUgdGhhbiBvbmUKKwkgICAgICogICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBzYW1lIGxvY2F0aW9uLiBUaGlzIGlzIHJlZmVycmVkIHRvIGFzCisJICAgICAqICAgICBhbGlhc2luZy4gVGhpcyB3aWxsIG9ubHkgd29yayBpZiBvbmx5IG9uZSBvZiB0aGUgYWxpYXNlZAorCSAgICAgKiAgICAgYXR0cmlidXRlcyBpcyBhY3RpdmUgaW4gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSwgb3IgaWYgbm8KKwkgICAgICogICAgIHBhdGggdGhyb3VnaCB0aGUgc2hhZGVyIGNvbnN1bWVzIG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIG9mCisJICAgICAqICAgICBhIHNldCBvZiBhdHRyaWJ1dGVzIGFsaWFzZWQgdG8gdGhlIHNhbWUgbG9jYXRpb24uIEEgbGluaworCSAgICAgKiAgICAgZXJyb3IgY2FuIG9jY3VyIGlmIHRoZSBsaW5rZXIgZGV0ZXJtaW5lcyB0aGF0IGV2ZXJ5IHBhdGgKKwkgICAgICogICAgIHRocm91Z2ggdGhlIHNoYWRlciBjb25zdW1lcyBtdWx0aXBsZSBhbGlhc2VkIGF0dHJpYnV0ZXMsCisJICAgICAqICAgICBidXQgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3IKKwkgICAgICogICAgIGluIHRoaXMgY2FzZS4iCisJICAgICAqCisJICAgICAqIEZyb20gR0xTTCA0LjMwIHNwZWMsIHBhZ2UgNTQ6CisJICAgICAqCisJICAgICAqICAgICJBIHByb2dyYW0gd2lsbCBmYWlsIHRvIGxpbmsgaWYgYW55IHR3byBub24tdmVydGV4IHNoYWRlcgorCSAgICAgKiAgICAgaW5wdXQgdmFyaWFibGVzIGFyZSBhc3NpZ25lZCB0byB0aGUgc2FtZSBsb2NhdGlvbi4gRm9yCisJICAgICAqICAgICB2ZXJ0ZXggc2hhZGVycywgbXVsdGlwbGUgaW5wdXQgdmFyaWFibGVzIG1heSBiZSBhc3NpZ25lZAorCSAgICAgKiAgICAgdG8gdGhlIHNhbWUgbG9jYXRpb24gdXNpbmcgZWl0aGVyIGxheW91dCBxdWFsaWZpZXJzIG9yIHZpYQorCSAgICAgKiAgICAgdGhlIE9wZW5HTCBBUEkuIEhvd2V2ZXIsIHN1Y2ggYWxpYXNpbmcgaXMgaW50ZW5kZWQgb25seSB0bworCSAgICAgKiAgICAgc3VwcG9ydCB2ZXJ0ZXggc2hhZGVycyB3aGVyZSBlYWNoIGV4ZWN1dGlvbiBwYXRoIGFjY2Vzc2VzCisJICAgICAqICAgICBhdCBtb3N0IG9uZSBpbnB1dCBwZXIgZWFjaCBsb2NhdGlvbi4gSW1wbGVtZW50YXRpb25zIGFyZQorCSAgICAgKiAgICAgcGVybWl0dGVkLCBidXQgbm90IHJlcXVpcmVkLCB0byBnZW5lcmF0ZSBsaW5rLXRpbWUgZXJyb3JzCisJICAgICAqICAgICBpZiB0aGV5IGRldGVjdCB0aGF0IGV2ZXJ5IHBhdGggdGhyb3VnaCB0aGUgdmVydGV4IHNoYWRlcgorCSAgICAgKiAgICAgZXhlY3V0YWJsZSBhY2Nlc3NlcyBtdWx0aXBsZSBpbnB1dHMgYXNzaWduZWQgdG8gYW55IHNpbmdsZQorCSAgICAgKiAgICAgbG9jYXRpb24uIEZvciBhbGwgc2hhZGVyIHR5cGVzLCBhIHByb2dyYW0gd2lsbCBmYWlsIHRvIGxpbmsKKwkgICAgICogICAgIGlmIGV4cGxpY2l0IGxvY2F0aW9uIGFzc2lnbm1lbnRzIGxlYXZlIHRoZSBsaW5rZXIgdW5hYmxlCisJICAgICAqICAgICB0byBmaW5kIHNwYWNlIGZvciBvdGhlciB2YXJpYWJsZXMgd2l0aG91dCBleHBsaWNpdAorCSAgICAgKiAgICAgYXNzaWdubWVudHMuIgorCSAgICAgKgorCSAgICAgKiBGcm9tIE9wZW5HTCBFUyAzLjAgc3BlYywgcGFnZSA1NjoKKwkgICAgICoKKwkgICAgICogICAgIkJpbmRpbmcgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgc2FtZSBsb2NhdGlvbgorCSAgICAgKiAgICAgaXMgcmVmZXJyZWQgdG8gYXMgYWxpYXNpbmcsIGFuZCBpcyBub3QgcGVybWl0dGVkIGluIE9wZW5HTAorCSAgICAgKiAgICAgRVMgU2hhZGluZyBMYW5ndWFnZSAzLjAwIHZlcnRleCBzaGFkZXJzLiBMaW5rUHJvZ3JhbSB3aWxsCisJICAgICAqICAgICBmYWlsIHdoZW4gdGhpcyBjb25kaXRpb24gZXhpc3RzLiBIb3dldmVyLCBhbGlhc2luZyBpcworCSAgICAgKiAgICAgcG9zc2libGUgaW4gT3BlbkdMIEVTIFNoYWRpbmcgTGFuZ3VhZ2UgMS4wMCB2ZXJ0ZXggc2hhZGVycy4KKwkgICAgICogICAgIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgb25seSBvbmUgb2YgdGhlIGFsaWFzZWQgYXR0cmlidXRlcworCSAgICAgKiAgICAgaXMgYWN0aXZlIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0sIG9yIGlmIG5vIHBhdGggdGhyb3VnaAorCSAgICAgKiAgICAgdGhlIHNoYWRlciBjb25zdW1lcyBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSBvZiBhIHNldCBvZgorCSAgICAgKiAgICAgYXR0cmlidXRlcyBhbGlhc2VkIHRvIHRoZSBzYW1lIGxvY2F0aW9uLiBBIGxpbmsgZXJyb3IgY2FuCisJICAgICAqICAgICBvY2N1ciBpZiB0aGUgbGlua2VyIGRldGVybWluZXMgdGhhdCBldmVyeSBwYXRoIHRocm91Z2ggdGhlCisJICAgICAqICAgICBzaGFkZXIgY29uc3VtZXMgbXVsdGlwbGUgYWxpYXNlZCBhdHRyaWJ1dGVzLCBidXQgaW1wbGVtZW4tCisJICAgICAqICAgICB0YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3IgaW4gdGhpcyBjYXNlLiIKKwkgICAgICoKKwkgICAgICogQWZ0ZXIgbG9va2luZyBhdCBhYm92ZSByZWZlcmVuY2VzIGZyb20gT3BlbkdMLCBPcGVuR0wgRVMgYW5kCisJICAgICAqIEdMU0wgc3BlY2lmaWNhdGlvbnMsIHdlIGFsbG93IGFsaWFzaW5nIG9mIHZlcnRleCBpbnB1dCB2YXJpYWJsZXMKKwkgICAgICogaW46IE9wZW5HTCAyLjAgKGFuZCBhYm92ZSkgYW5kIE9wZW5HTCBFUyAyLjAuCisJICAgICAqCisJICAgICAqIE5PVEU6IFRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBzcGVjIGJ1dCBpdHMgd29ydGggbWVudGlvbmluZworCSAgICAgKiBoZXJlIHRoYXQgd2UncmUgbm90IGRvaW5nIGFueXRoaW5nIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIHBhdGgKKwkgICAgICogdGhyb3VnaCB0aGUgdmVydGV4IHNoYWRlciBleGVjdXRhYmxlIGFjY2Vzc2VzIG11bHRpcGxlIGlucHV0cworCSAgICAgKiBhc3NpZ25lZCB0byBhbnkgc2luZ2xlIGxvY2F0aW9uLgorCSAgICAgKi8KKworCSAgICAvKiBNYXNrIHJlcHJlc2VudGluZyB0aGUgY29udGlndW91cyBzbG90cyB0aGF0IHdpbGwgYmUgdXNlZCBieQorCSAgICAgKiB0aGlzIGF0dHJpYnV0ZS4KKwkgICAgICovCisJICAgIGNvbnN0IHVuc2lnbmVkIGF0dHIgPSB2YXItPmRhdGEubG9jYXRpb24gLSBnZW5lcmljX2Jhc2U7CisJICAgIGNvbnN0IHVuc2lnbmVkIHVzZV9tYXNrID0gKDEgPDwgc2xvdHMpIC0gMTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHN0cmluZyA9ICh0YXJnZXRfaW5kZXggPT0gTUVTQV9TSEFERVJfVkVSVEVYKQorICAgICAgICAgICAgICAgPyAidmVydGV4IHNoYWRlciBpbnB1dCIgOiAiZnJhZ21lbnQgc2hhZGVyIG91dHB1dCI7CisKKyAgICAgICAgICAgIC8qIEdlbmVyYXRlIGEgbGluayBlcnJvciBpZiB0aGUgcmVxdWVzdGVkIGxvY2F0aW9ucyBmb3IgdGhpcworICAgICAgICAgICAgICogYXR0cmlidXRlIGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkIGF0dHJpYnV0ZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGF0dHIgKyBzbG90cyA+IG1heF9pbmRleCkgeworICAgICAgICAgICAgICAgbGlua2VyX2Vycm9yKHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdWZmaWNpZW50IGNvbnRpZ3VvdXMgbG9jYXRpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdmFpbGFibGUgZm9yICVzIGAlcycgJWQgJWQgJWQiLCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPm5hbWUsIHVzZWRfbG9jYXRpb25zLCB1c2VfbWFzaywgYXR0cik7CisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKwkgICAgLyogR2VuZXJhdGUgYSBsaW5rIGVycm9yIGlmIHRoZSBzZXQgb2YgYml0cyByZXF1ZXN0ZWQgZm9yIHRoaXMKKwkgICAgICogYXR0cmlidXRlIG92ZXJsYXBzIGFueSBwcmV2aW91c2x5IGFsbG9jYXRlZCBiaXRzLgorCSAgICAgKi8KKwkgICAgaWYgKCh+KHVzZV9tYXNrIDw8IGF0dHIpICYgdXNlZF9sb2NhdGlvbnMpICE9IHVzZWRfbG9jYXRpb25zKSB7CisgICAgICAgICAgICAgICBpZiAodGFyZ2V0X2luZGV4ID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UIHx8CisgICAgICAgICAgICAgICAgICAgKHByb2ctPklzRVMgJiYgcHJvZy0+VmVyc2lvbiA+PSAzMDApKSB7CisgICAgICAgICAgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlcmxhcHBpbmcgbG9jYXRpb24gaXMgYXNzaWduZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byAlcyBgJXMnICVkICVkICVkXG4iLCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT5uYW1lLCB1c2VkX2xvY2F0aW9ucywgdXNlX21hc2ssIGF0dHIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGxpbmtlcl93YXJuaW5nKHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlcmxhcHBpbmcgbG9jYXRpb24gaXMgYXNzaWduZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGAlcycgJWQgJWQgJWRcbiIsIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+bmFtZSwgdXNlZF9sb2NhdGlvbnMsIHVzZV9tYXNrLCBhdHRyKTsKKyAgICAgICAgICAgICAgIH0KKwkgICAgfQorCisJICAgIHVzZWRfbG9jYXRpb25zIHw9ICh1c2VfbWFzayA8PCBhdHRyKTsKKwkgfQorCisJIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB0b19hc3NpZ25bbnVtX2F0dHJdLnNsb3RzID0gc2xvdHM7CisgICAgICB0b19hc3NpZ25bbnVtX2F0dHJdLnZhciA9IHZhcjsKKyAgICAgIG51bV9hdHRyKys7CisgICB9CisKKyAgIC8qIElmIGFsbCBvZiB0aGUgYXR0cmlidXRlcyB3ZXJlIGFzc2lnbmVkIGxvY2F0aW9ucyBieSB0aGUgYXBwbGljYXRpb24gKG9yCisgICAgKiBhcmUgYnVpbHQtaW4gYXR0cmlidXRlcyB3aXRoIGZpeGVkIGxvY2F0aW9ucyksIHJldHVybiBlYXJseS4gIFRoaXMgc2hvdWxkCisgICAgKiBiZSB0aGUgY29tbW9uIGNhc2UuCisgICAgKi8KKyAgIGlmIChudW1fYXR0ciA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgIHFzb3J0KHRvX2Fzc2lnbiwgbnVtX2F0dHIsIHNpemVvZih0b19hc3NpZ25bMF0pLCB0ZW1wX2F0dHI6OmNvbXBhcmUpOworCisgICBpZiAodGFyZ2V0X2luZGV4ID09IE1FU0FfU0hBREVSX1ZFUlRFWCkgeworICAgICAgLyogVkVSVF9BVFRSSUJfR0VORVJJQzAgaXMgYSBwc2V1ZG8tYWxpYXMgZm9yIFZFUlRfQVRUUklCX1BPUy4gIEl0IGNhbgorICAgICAgICogb25seSBiZSBleHBsaWNpdGx5IGFzc2lnbmVkIGJ5IHZpYSBnbEJpbmRBdHRyaWJMb2NhdGlvbi4gIE1hcmsgaXQgYXMKKyAgICAgICAqIHJlc2VydmVkIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlZCBiZWxvdy4KKyAgICAgICAqLworICAgICAgZmluZF9kZXJlZl92aXNpdG9yIGZpbmQoImdsX1ZlcnRleCIpOworICAgICAgZmluZC5ydW4oc2gtPmlyKTsKKyAgICAgIGlmIChmaW5kLnZhcmlhYmxlX2ZvdW5kKCkpCisJIHVzZWRfbG9jYXRpb25zIHw9ICgxIDw8IDApOworICAgfQorCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2F0dHI7IGkrKykgeworICAgICAgLyogTWFzayByZXByZXNlbnRpbmcgdGhlIGNvbnRpZ3VvdXMgc2xvdHMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhpcworICAgICAgICogYXR0cmlidXRlLgorICAgICAgICovCisgICAgICBjb25zdCB1bnNpZ25lZCB1c2VfbWFzayA9ICgxIDw8IHRvX2Fzc2lnbltpXS5zbG90cykgLSAxOworCisgICAgICBpbnQgbG9jYXRpb24gPSBmaW5kX2F2YWlsYWJsZV9zbG90cyh1c2VkX2xvY2F0aW9ucywgdG9fYXNzaWduW2ldLnNsb3RzKTsKKworICAgICAgaWYgKGxvY2F0aW9uIDwgMCkgeworCSBjb25zdCBjaGFyICpjb25zdCBzdHJpbmcgPSAodGFyZ2V0X2luZGV4ID09IE1FU0FfU0hBREVSX1ZFUlRFWCkKKwkgICAgPyAidmVydGV4IHNoYWRlciBpbnB1dCIgOiAiZnJhZ21lbnQgc2hhZGVyIG91dHB1dCI7CisKKwkgbGlua2VyX2Vycm9yKHByb2csCisJCSAgICAgICJpbnN1ZmZpY2llbnQgY29udGlndW91cyBsb2NhdGlvbnMgIgorCQkgICAgICAiYXZhaWxhYmxlIGZvciAlcyBgJXMnIiwKKwkJICAgICAgc3RyaW5nLCB0b19hc3NpZ25baV0udmFyLT5uYW1lKTsKKwkgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0b19hc3NpZ25baV0udmFyLT5kYXRhLmxvY2F0aW9uID0gZ2VuZXJpY19iYXNlICsgbG9jYXRpb247CisgICAgICB0b19hc3NpZ25baV0udmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0ID0gMDsKKyAgICAgIHVzZWRfbG9jYXRpb25zIHw9ICh1c2VfbWFzayA8PCBsb2NhdGlvbik7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCisKKy8qKgorICogRGVtb3RlIHNoYWRlciBpbnB1dHMgYW5kIG91dHB1dHMgdGhhdCBhcmUgbm90IHVzZWQgaW4gb3RoZXIgc3RhZ2VzCisgKi8KK3ZvaWQKK2RlbW90ZV9zaGFkZXJfaW5wdXRzX2FuZF9vdXRwdXRzKGdsX3NoYWRlciAqc2gsIGVudW0gaXJfdmFyaWFibGVfbW9kZSBtb2RlKQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsIHNoLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICgodmFyID09IE5VTEwpIHx8ICh2YXItPmRhdGEubW9kZSAhPSBpbnQobW9kZSkpKQorCSBjb250aW51ZTsKKworICAgICAgLyogQSBzaGFkZXIgJ2luJyBvciAnb3V0JyB2YXJpYWJsZSBpcyBvbmx5IHJlYWxseSBhbiBpbnB1dCBvciBvdXRwdXQgaWYKKyAgICAgICAqIGl0cyB2YWx1ZSBpcyB1c2VkIGJ5IG90aGVyIHNoYWRlciBzdGFnZXMuICBUaGlzIHdpbGwgY2F1c2UgdGhlIHZhcmlhYmxlCisgICAgICAgKiB0byBoYXZlIGEgbG9jYXRpb24gYXNzaWduZWQuCisgICAgICAgKi8KKyAgICAgIGlmICh2YXItPmRhdGEuaXNfdW5tYXRjaGVkX2dlbmVyaWNfaW5vdXQpIHsKKwkgdmFyLT5kYXRhLm1vZGUgPSBpcl92YXJfYXV0bzsKKyAgICAgIH0KKyAgIH0KK30KKworCisvKioKKyAqIFN0b3JlIHRoZSBnbF9GcmFnRGVwdGggbGF5b3V0IGluIHRoZSBnbF9zaGFkZXJfcHJvZ3JhbSBzdHJ1Y3QuCisgKi8KK3N0YXRpYyB2b2lkCitzdG9yZV9mcmFnZGVwdGhfbGF5b3V0KHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZykKK3sKKyAgIGlmIChwcm9nLT5fTGlua2VkU2hhZGVyc1tNRVNBX1NIQURFUl9GUkFHTUVOVF0gPT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICAgfQorCisgICBzdHJ1Y3QgZXhlY19saXN0ICppciA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0ZSQUdNRU5UXS0+aXI7CisKKyAgIC8qIFdlIGRvbid0IGxvb2sgdXAgdGhlIGdsX0ZyYWdEZXB0aCBzeW1ib2wgZGlyZWN0bHkgYmVjYXVzZSBpZgorICAgICogZ2xfRnJhZ0RlcHRoIGlzIG5vdCB1c2VkIGluIHRoZSBzaGFkZXIsIGl0J3MgcmVtb3ZlZCBmcm9tIHRoZSBJUi4KKyAgICAqIEhvd2V2ZXIsIHRoZSBzeW1ib2wgd29uJ3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzeW1ib2wgdGFibGUuCisgICAgKgorICAgICogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBjYXNlcyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgTk9UIHJlbW92ZWQKKyAgICAqIGZyb20gdGhlIElSLgorICAgICovCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgaXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAodmFyID09IE5VTEwgfHwgdmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9vdXQpIHsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoc3RyY21wKHZhci0+bmFtZSwgImdsX0ZyYWdEZXB0aCIpID09IDApIHsKKyAgICAgICAgIHN3aXRjaCAodmFyLT5kYXRhLmRlcHRoX2xheW91dCkgeworICAgICAgICAgY2FzZSBpcl9kZXB0aF9sYXlvdXRfbm9uZToKKyAgICAgICAgICAgIHByb2ctPkZyYWdEZXB0aExheW91dCA9IEZSQUdfREVQVEhfTEFZT1VUX05PTkU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICBjYXNlIGlyX2RlcHRoX2xheW91dF9hbnk6CisgICAgICAgICAgICBwcm9nLT5GcmFnRGVwdGhMYXlvdXQgPSBGUkFHX0RFUFRIX0xBWU9VVF9BTlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICBjYXNlIGlyX2RlcHRoX2xheW91dF9ncmVhdGVyOgorICAgICAgICAgICAgcHJvZy0+RnJhZ0RlcHRoTGF5b3V0ID0gRlJBR19ERVBUSF9MQVlPVVRfR1JFQVRFUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIGNhc2UgaXJfZGVwdGhfbGF5b3V0X2xlc3M6CisgICAgICAgICAgICBwcm9nLT5GcmFnRGVwdGhMYXlvdXQgPSBGUkFHX0RFUFRIX0xBWU9VVF9MRVNTOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgY2FzZSBpcl9kZXB0aF9sYXlvdXRfdW5jaGFuZ2VkOgorICAgICAgICAgICAgcHJvZy0+RnJhZ0RlcHRoTGF5b3V0ID0gRlJBR19ERVBUSF9MQVlPVVRfVU5DSEFOR0VEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KK30KKworLyoqCisgKiBWYWxpZGF0ZSB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgYSBwcm9ncmFtIHZlcnN1cyB0aGUgaW1wbGVtZW50YXRpb24gbGltaXRzCisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19yZXNvdXJjZXMoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKQoreworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaCA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldOworCisgICAgICBpZiAoc2ggPT0gTlVMTCkKKwkgY29udGludWU7CisKKyAgICAgIGlmIChzaC0+bnVtX3NhbXBsZXJzID4gY3R4LT5Db25zdC5Qcm9ncmFtW2ldLk1heFRleHR1cmVJbWFnZVVuaXRzKSB7CisJIGxpbmtlcl9lcnJvcihwcm9nLCAiVG9vIG1hbnkgJXMgc2hhZGVyIHRleHR1cmUgc2FtcGxlcnMiLAorCQkgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKGkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNoLT5udW1fdW5pZm9ybV9jb21wb25lbnRzID4KKyAgICAgICAgICBjdHgtPkNvbnN0LlByb2dyYW1baV0uTWF4VW5pZm9ybUNvbXBvbmVudHMpIHsKKyAgICAgICAgIGlmIChjdHgtPkNvbnN0LkdMU0xTa2lwU3RyaWN0TWF4VW5pZm9ybUxpbWl0Q2hlY2spIHsKKyAgICAgICAgICAgIGxpbmtlcl93YXJuaW5nKHByb2csICJUb28gbWFueSAlcyBzaGFkZXIgZGVmYXVsdCB1bmlmb3JtIGJsb2NrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRzLCBidXQgdGhlIGRyaXZlciB3aWxsIHRyeSB0byBvcHRpbWl6ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlbSBvdXQ7IHRoaXMgaXMgbm9uLXBvcnRhYmxlIG91dC1vZi1zcGVjICIKKwkJCSAgICJiZWhhdmlvclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoaSkpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiVG9vIG1hbnkgJXMgc2hhZGVyIGRlZmF1bHQgdW5pZm9ybSBibG9jayAiCisJCQkgImNvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoaSkpOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc2gtPm51bV9jb21iaW5lZF91bmlmb3JtX2NvbXBvbmVudHMgPgorCSAgY3R4LT5Db25zdC5Qcm9ncmFtW2ldLk1heENvbWJpbmVkVW5pZm9ybUNvbXBvbmVudHMpIHsKKyAgICAgICAgIGlmIChjdHgtPkNvbnN0LkdMU0xTa2lwU3RyaWN0TWF4VW5pZm9ybUxpbWl0Q2hlY2spIHsKKyAgICAgICAgICAgIGxpbmtlcl93YXJuaW5nKHByb2csICJUb28gbWFueSAlcyBzaGFkZXIgdW5pZm9ybSBjb21wb25lbnRzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHRoZSBkcml2ZXIgd2lsbCB0cnkgdG8gb3B0aW1pemUgdGhlbSBvdXQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGlzIG5vbi1wb3J0YWJsZSBvdXQtb2Ytc3BlYyBiZWhhdmlvclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3NoYWRlcl9zdGFnZV90b19zdHJpbmcoaSkpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiVG9vIG1hbnkgJXMgc2hhZGVyIHVuaWZvcm0gY29tcG9uZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX21lc2Ffc2hhZGVyX3N0YWdlX3RvX3N0cmluZyhpKSk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHVuc2lnbmVkIGJsb2Nrc1tNRVNBX1NIQURFUl9TVEFHRVNdID0gezB9OworICAgdW5zaWduZWQgdG90YWxfdW5pZm9ybV9ibG9ja3MgPSAwOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtVW5pZm9ybUJsb2NrczsgaSsrKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgTUVTQV9TSEFERVJfU1RBR0VTOyBqKyspIHsKKwkgaWYgKHByb2ctPlVuaWZvcm1CbG9ja1N0YWdlSW5kZXhbal1baV0gIT0gLTEpIHsKKwkgICAgYmxvY2tzW2pdKys7CisJICAgIHRvdGFsX3VuaWZvcm1fYmxvY2tzKys7CisJIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRvdGFsX3VuaWZvcm1fYmxvY2tzID4gY3R4LT5Db25zdC5NYXhDb21iaW5lZFVuaWZvcm1CbG9ja3MpIHsKKwkgbGlua2VyX2Vycm9yKHByb2csICJUb28gbWFueSBjb21iaW5lZCB1bmlmb3JtIGJsb2NrcyAoJWQvJWQpIiwKKwkJICAgICAgcHJvZy0+TnVtVW5pZm9ybUJsb2NrcywKKwkJICAgICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZFVuaWZvcm1CbG9ja3MpOworICAgICAgfSBlbHNlIHsKKwkgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBtYXhfdW5pZm9ybV9ibG9ja3MgPQorICAgICAgICAgICAgICAgY3R4LT5Db25zdC5Qcm9ncmFtW2ldLk1heFVuaWZvcm1CbG9ja3M7CisJICAgIGlmIChibG9ja3NbaV0gPiBtYXhfdW5pZm9ybV9ibG9ja3MpIHsKKwkgICAgICAgbGlua2VyX2Vycm9yKHByb2csICJUb28gbWFueSAlcyB1bmlmb3JtIGJsb2NrcyAoJWQvJWQpIiwKKwkJCSAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKGkpLAorCQkJICAgIGJsb2Nrc1tpXSwKKwkJCSAgICBtYXhfdW5pZm9ybV9ibG9ja3MpOworCSAgICAgICBicmVhazsKKwkgICAgfQorCSB9CisgICAgICB9CisgICB9Cit9CisKKy8qKgorICogVmFsaWRhdGUgc2hhZGVyIGltYWdlIHJlc291cmNlcy4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2ltYWdlX3Jlc291cmNlcyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCit7CisgICB1bnNpZ25lZCB0b3RhbF9pbWFnZV91bml0cyA9IDA7CisgICB1bnNpZ25lZCBmcmFnbWVudF9vdXRwdXRzID0gMDsKKworICAgaWYgKCFjdHgtPkV4dGVuc2lvbnMuQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlKQorICAgICAgcmV0dXJuOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTUVTQV9TSEFERVJfU1RBR0VTOyBpKyspIHsKKyAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoID0gcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV07CisKKyAgICAgIGlmIChzaCkgeworICAgICAgICAgaWYgKHNoLT5OdW1JbWFnZXMgPiBjdHgtPkNvbnN0LlByb2dyYW1baV0uTWF4SW1hZ2VVbmlmb3JtcykKKyAgICAgICAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiVG9vIG1hbnkgJXMgc2hhZGVyIGltYWdlIHVuaWZvcm1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfbWVzYV9zaGFkZXJfc3RhZ2VfdG9fc3RyaW5nKGkpKTsKKworICAgICAgICAgdG90YWxfaW1hZ2VfdW5pdHMgKz0gc2gtPk51bUltYWdlczsKKworICAgICAgICAgaWYgKGkgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpIHsKKyAgICAgICAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBzaC0+aXIpIHsKKyAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSAoKGlyX2luc3RydWN0aW9uICopbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisgICAgICAgICAgICAgICBpZiAodmFyICYmIHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0KQorICAgICAgICAgICAgICAgICAgZnJhZ21lbnRfb3V0cHV0cyArPSB2YXItPnR5cGUtPmNvdW50X2F0dHJpYnV0ZV9zbG90cygpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBpZiAodG90YWxfaW1hZ2VfdW5pdHMgPiBjdHgtPkNvbnN0Lk1heENvbWJpbmVkSW1hZ2VVbmlmb3JtcykKKyAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiVG9vIG1hbnkgY29tYmluZWQgaW1hZ2UgdW5pZm9ybXMiKTsKKworICAgaWYgKHRvdGFsX2ltYWdlX3VuaXRzICsgZnJhZ21lbnRfb3V0cHV0cyA+CisgICAgICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZEltYWdlVW5pdHNBbmRGcmFnbWVudE91dHB1dHMpCisgICAgICBsaW5rZXJfZXJyb3IocHJvZywgIlRvbyBtYW55IGNvbWJpbmVkIGltYWdlIHVuaWZvcm1zIGFuZCBmcmFnbWVudCBvdXRwdXRzIik7Cit9CisKK3ZvaWQKK2xpbmtfc2hhZGVycyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpCit7CisgICB0ZmVlZGJhY2tfZGVjbCAqdGZlZWRiYWNrX2RlY2xzID0gTlVMTDsKKyAgIHVuc2lnbmVkIG51bV90ZmVlZGJhY2tfZGVjbHMgPSBwcm9nLT5UcmFuc2Zvcm1GZWVkYmFjay5OdW1WYXJ5aW5nOworCisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7IC8vIHRlbXBvcmFyeSBsaW5rZXIgY29udGV4dAorCisgICBwcm9nLT5MaW5rU3RhdHVzID0gdHJ1ZTsgLyogQWxsIGVycm9yIHBhdGhzIHdpbGwgc2V0IHRoaXMgdG8gZmFsc2UgKi8KKyAgIHByb2ctPlZhbGlkYXRlZCA9IGZhbHNlOworICAgcHJvZy0+X1VzZWQgPSBmYWxzZTsKKworICAgcmFsbG9jX2ZyZWUocHJvZy0+SW5mb0xvZyk7CisgICBwcm9nLT5JbmZvTG9nID0gcmFsbG9jX3N0cmR1cChOVUxMLCAiIik7CisKKyAgIHJhbGxvY19mcmVlKHByb2ctPlVuaWZvcm1CbG9ja3MpOworICAgcHJvZy0+VW5pZm9ybUJsb2NrcyA9IE5VTEw7CisgICBwcm9nLT5OdW1Vbmlmb3JtQmxvY2tzID0gMDsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVTQV9TSEFERVJfU1RBR0VTOyBpKyspIHsKKyAgICAgIHJhbGxvY19mcmVlKHByb2ctPlVuaWZvcm1CbG9ja1N0YWdlSW5kZXhbaV0pOworICAgICAgcHJvZy0+VW5pZm9ybUJsb2NrU3RhZ2VJbmRleFtpXSA9IE5VTEw7CisgICB9CisKKyAgIHJhbGxvY19mcmVlKHByb2ctPkF0b21pY0J1ZmZlcnMpOworICAgcHJvZy0+QXRvbWljQnVmZmVycyA9IE5VTEw7CisgICBwcm9nLT5OdW1BdG9taWNCdWZmZXJzID0gMDsKKyAgIHByb2ctPkFSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9uc19lbmFibGUgPSBmYWxzZTsKKworICAgLyogU2VwYXJhdGUgdGhlIHNoYWRlcnMgaW50byBncm91cHMgYmFzZWQgb24gdGhlaXIgdHlwZS4KKyAgICAqLworICAgc3RydWN0IGdsX3NoYWRlciAqKnNoYWRlcl9saXN0W01FU0FfU0hBREVSX1NUQUdFU107CisgICB1bnNpZ25lZCBudW1fc2hhZGVyc1tNRVNBX1NIQURFUl9TVEFHRVNdOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBzaGFkZXJfbGlzdFtpXSA9IChzdHJ1Y3QgZ2xfc2hhZGVyICoqKQorICAgICAgICAgY2FsbG9jKHByb2ctPk51bVNoYWRlcnMsIHNpemVvZihzdHJ1Y3QgZ2xfc2hhZGVyICopKTsKKyAgICAgIG51bV9zaGFkZXJzW2ldID0gMDsKKyAgIH0KKworICAgdW5zaWduZWQgbWluX3ZlcnNpb24gPSBVSU5UX01BWDsKKyAgIHVuc2lnbmVkIG1heF92ZXJzaW9uID0gMDsKKyAgIGNvbnN0IGJvb2wgaXNfZXNfcHJvZyA9CisgICAgICAocHJvZy0+TnVtU2hhZGVycyA+IDAgJiYgcHJvZy0+U2hhZGVyc1swXS0+SXNFUykgPyB0cnVlIDogZmFsc2U7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtU2hhZGVyczsgaSsrKSB7CisgICAgICBtaW5fdmVyc2lvbiA9IE1JTjIobWluX3ZlcnNpb24sIHByb2ctPlNoYWRlcnNbaV0tPlZlcnNpb24pOworICAgICAgbWF4X3ZlcnNpb24gPSBNQVgyKG1heF92ZXJzaW9uLCBwcm9nLT5TaGFkZXJzW2ldLT5WZXJzaW9uKTsKKworICAgICAgaWYgKHByb2ctPlNoYWRlcnNbaV0tPklzRVMgIT0gaXNfZXNfcHJvZykgeworCSBsaW5rZXJfZXJyb3IocHJvZywgImFsbCBzaGFkZXJzIG11c3QgdXNlIHNhbWUgc2hhZGluZyAiCisJCSAgICAgICJsYW5ndWFnZSB2ZXJzaW9uXG4iKTsKKwkgZ290byBkb25lOworICAgICAgfQorCisgICAgICBwcm9nLT5BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnNfZW5hYmxlIHw9CisgICAgICAgICBwcm9nLT5TaGFkZXJzW2ldLT5BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnNfZW5hYmxlOworCisgICAgICBnbF9zaGFkZXJfc3RhZ2Ugc2hhZGVyX3R5cGUgPSBwcm9nLT5TaGFkZXJzW2ldLT5TdGFnZTsKKyAgICAgIHNoYWRlcl9saXN0W3NoYWRlcl90eXBlXVtudW1fc2hhZGVyc1tzaGFkZXJfdHlwZV1dID0gcHJvZy0+U2hhZGVyc1tpXTsKKyAgICAgIG51bV9zaGFkZXJzW3NoYWRlcl90eXBlXSsrOworICAgfQorCisgICAvKiBJbiBkZXNrdG9wIEdMU0wsIGRpZmZlcmVudCBzaGFkZXIgdmVyc2lvbnMgbWF5IGJlIGxpbmtlZCB0b2dldGhlci4gIEluCisgICAgKiBHTFNMIEVTLCBhbGwgc2hhZGVyIHZlcnNpb25zIG11c3QgYmUgdGhlIHNhbWUuCisgICAgKi8KKyAgIGlmIChpc19lc19wcm9nICYmIG1pbl92ZXJzaW9uICE9IG1heF92ZXJzaW9uKSB7CisgICAgICBsaW5rZXJfZXJyb3IocHJvZywgImFsbCBzaGFkZXJzIG11c3QgdXNlIHNhbWUgc2hhZGluZyAiCisJCSAgICJsYW5ndWFnZSB2ZXJzaW9uXG4iKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKworICAgcHJvZy0+VmVyc2lvbiA9IG1heF92ZXJzaW9uOworICAgcHJvZy0+SXNFUyA9IGlzX2VzX3Byb2c7CisKKyAgIC8qIEdlb21ldHJ5IHNoYWRlcnMgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCB2ZXJ0ZXggc2hhZGVycy4KKyAgICAqLworICAgaWYgKG51bV9zaGFkZXJzW01FU0FfU0hBREVSX0dFT01FVFJZXSA+IDAgJiYKKyAgICAgICBudW1fc2hhZGVyc1tNRVNBX1NIQURFUl9WRVJURVhdID09IDAgJiYKKyAgICAgICAhcHJvZy0+U2VwYXJhdGVTaGFkZXIpIHsKKyAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiR2VvbWV0cnkgc2hhZGVyIG11c3QgYmUgbGlua2VkIHdpdGggIgorCQkgICAidmVydGV4IHNoYWRlclxuIik7CisgICAgICBnb3RvIGRvbmU7CisgICB9CisKKyAgIC8qIENvbXB1dGUgc2hhZGVycyBoYXZlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zLiAqLworICAgaWYgKG51bV9zaGFkZXJzW01FU0FfU0hBREVSX0NPTVBVVEVdID4gMCAmJgorICAgICAgIG51bV9zaGFkZXJzW01FU0FfU0hBREVSX0NPTVBVVEVdICE9IHByb2ctPk51bVNoYWRlcnMpIHsKKyAgICAgIGxpbmtlcl9lcnJvcihwcm9nLCAiQ29tcHV0ZSBzaGFkZXJzIG1heSBub3QgYmUgbGlua2VkIHdpdGggYW55IG90aGVyICIKKyAgICAgICAgICAgICAgICAgICAidHlwZSBvZiBzaGFkZXJcbiIpOworICAgfQorCisgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0gIT0gTlVMTCkKKwkgY3R4LT5Ecml2ZXIuRGVsZXRlU2hhZGVyKGN0eCwgcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0pOworCisgICAgICBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXSA9IE5VTEw7CisgICB9CisKKyAgIC8qIExpbmsgYWxsIHNoYWRlcnMgZm9yIGEgcGFydGljdWxhciBzdGFnZSBhbmQgdmFsaWRhdGUgdGhlIHJlc3VsdC4KKyAgICAqLworICAgZm9yIChpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgc3RhZ2UrKykgeworICAgICAgaWYgKG51bV9zaGFkZXJzW3N0YWdlXSA+IDApIHsKKyAgICAgICAgIGdsX3NoYWRlciAqY29uc3Qgc2ggPQorICAgICAgICAgICAgbGlua19pbnRyYXN0YWdlX3NoYWRlcnMobWVtX2N0eCwgY3R4LCBwcm9nLCBzaGFkZXJfbGlzdFtzdGFnZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2hhZGVyc1tzdGFnZV0pOworCisgICAgICAgICBpZiAoIXByb2ctPkxpbmtTdGF0dXMpCisgICAgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgICAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgICAgICAgIGNhc2UgTUVTQV9TSEFERVJfVkVSVEVYOgorICAgICAgICAgICAgdmFsaWRhdGVfdmVydGV4X3NoYWRlcl9leGVjdXRhYmxlKHByb2csIHNoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBNRVNBX1NIQURFUl9HRU9NRVRSWToKKyAgICAgICAgICAgIHZhbGlkYXRlX2dlb21ldHJ5X3NoYWRlcl9leGVjdXRhYmxlKHByb2csIHNoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBNRVNBX1NIQURFUl9GUkFHTUVOVDoKKyAgICAgICAgICAgIHZhbGlkYXRlX2ZyYWdtZW50X3NoYWRlcl9leGVjdXRhYmxlKHByb2csIHNoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgaWYgKCFwcm9nLT5MaW5rU3RhdHVzKQorICAgICAgICAgICAgZ290byBkb25lOworCisgICAgICAgICBfbWVzYV9yZWZlcmVuY2Vfc2hhZGVyKGN0eCwgJnByb2ctPl9MaW5rZWRTaGFkZXJzW3N0YWdlXSwgc2gpOworICAgICAgfQorICAgfQorCisgICBpZiAobnVtX3NoYWRlcnNbTUVTQV9TSEFERVJfR0VPTUVUUlldID4gMCkKKyAgICAgIHByb2ctPkxhc3RDbGlwRGlzdGFuY2VBcnJheVNpemUgPSBwcm9nLT5HZW9tLkNsaXBEaXN0YW5jZUFycmF5U2l6ZTsKKyAgIGVsc2UgaWYgKG51bV9zaGFkZXJzW01FU0FfU0hBREVSX1ZFUlRFWF0gPiAwKQorICAgICAgcHJvZy0+TGFzdENsaXBEaXN0YW5jZUFycmF5U2l6ZSA9IHByb2ctPlZlcnQuQ2xpcERpc3RhbmNlQXJyYXlTaXplOworICAgZWxzZQorICAgICAgcHJvZy0+TGFzdENsaXBEaXN0YW5jZUFycmF5U2l6ZSA9IDA7IC8qIE5vdCB1c2VkICovCisKKyAgIC8qIEhlcmUgYmVnaW5zIHRoZSBpbnRlci1zdGFnZSBsaW5raW5nIHBoYXNlLiAgU29tZSBpbml0aWFsIHZhbGlkYXRpb24gaXMKKyAgICAqIHBlcmZvcm1lZCwgdGhlbiBsb2NhdGlvbnMgYXJlIGFzc2lnbmVkIGZvciB1bmlmb3JtcywgYXR0cmlidXRlcywgYW5kCisgICAgKiB2YXJ5aW5ncy4KKyAgICAqLworICAgY3Jvc3NfdmFsaWRhdGVfdW5pZm9ybXMocHJvZyk7CisgICBpZiAoIXByb2ctPkxpbmtTdGF0dXMpCisgICAgICBnb3RvIGRvbmU7CisKKyAgIHVuc2lnbmVkIHByZXY7CisKKyAgIGZvciAocHJldiA9IDA7IHByZXYgPD0gTUVTQV9TSEFERVJfRlJBR01FTlQ7IHByZXYrKykgeworICAgICAgaWYgKHByb2ctPl9MaW5rZWRTaGFkZXJzW3ByZXZdICE9IE5VTEwpCisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgLyogVmFsaWRhdGUgdGhlIGlucHV0cyBvZiBlYWNoIHN0YWdlIHdpdGggdGhlIG91dHB1dCBvZiB0aGUgcHJlY2VkaW5nCisgICAgKiBzdGFnZS4KKyAgICAqLworICAgZm9yICh1bnNpZ25lZCBpID0gcHJldiArIDE7IGkgPD0gTUVTQV9TSEFERVJfRlJBR01FTlQ7IGkrKykgeworICAgICAgaWYgKHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldID09IE5VTEwpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgdmFsaWRhdGVfaW50ZXJzdGFnZV9pbm91dF9ibG9ja3MocHJvZywgcHJvZy0+X0xpbmtlZFNoYWRlcnNbcHJldl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXSk7CisgICAgICBpZiAoIXByb2ctPkxpbmtTdGF0dXMpCisgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgIGNyb3NzX3ZhbGlkYXRlX291dHB1dHNfdG9faW5wdXRzKHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nLT5fTGlua2VkU2hhZGVyc1twcmV2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldKTsKKyAgICAgIGlmICghcHJvZy0+TGlua1N0YXR1cykKKyAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgcHJldiA9IGk7CisgICB9CisKKyAgIC8qIENyb3NzLXZhbGlkYXRlIHVuaWZvcm0gYmxvY2tzIGJldHdlZW4gc2hhZGVyIHN0YWdlcyAqLworICAgdmFsaWRhdGVfaW50ZXJzdGFnZV91bmlmb3JtX2Jsb2Nrcyhwcm9nLCBwcm9nLT5fTGlua2VkU2hhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTQV9TSEFERVJfU1RBR0VTKTsKKyAgIGlmICghcHJvZy0+TGlua1N0YXR1cykKKyAgICAgIGdvdG8gZG9uZTsKKworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBNRVNBX1NIQURFUl9TVEFHRVM7IGkrKykgeworICAgICAgaWYgKHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldICE9IE5VTEwpCisgICAgICAgICBsb3dlcl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzKG1lbV9jdHgsIHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldKTsKKyAgIH0KKworICAgLyogSW1wbGVtZW50IHRoZSBHTFNMIDEuMzArIHJ1bGUgZm9yIGRpc2NhcmQgdnMgaW5maW5pdGUgbG9vcHMgRG8KKyAgICAqIGl0IGJlZm9yZSBvcHRpbWl6YXRpb24gYmVjYXVzZSB3ZSB3YW50IG1vc3Qgb2YgdGhlIGNoZWNrcyB0byBnZXQKKyAgICAqIGRyb3BwZWQgdGhhbmtzIHRvIGNvbnN0YW50IHByb3BhZ2F0aW9uLgorICAgICoKKyAgICAqIFRoaXMgcnVsZSBhbHNvIGFwcGxpZXMgdG8gR0xTTCBFUyAzLjAwLgorICAgICovCisgICBpZiAobWF4X3ZlcnNpb24gPj0gKGlzX2VzX3Byb2cgPyAzMDAgOiAxMzApKSB7CisgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyICpzaCA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW01FU0FfU0hBREVSX0ZSQUdNRU5UXTsKKyAgICAgIGlmIChzaCkgeworCSBsb3dlcl9kaXNjYXJkX2Zsb3coc2gtPmlyKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKCFpbnRlcnN0YWdlX2Nyb3NzX3ZhbGlkYXRlX3VuaWZvcm1fYmxvY2tzKHByb2cpKQorICAgICAgZ290byBkb25lOworCisgICAvKiBEbyBjb21tb24gb3B0aW1pemF0aW9uIGJlZm9yZSBhc3NpZ25pbmcgc3RvcmFnZSBmb3IgYXR0cmlidXRlcywKKyAgICAqIHVuaWZvcm1zLCBhbmQgdmFyeWluZ3MuICBMYXRlciBvcHRpbWl6YXRpb24gY291bGQgcG9zc2libHkgbWFrZQorICAgICogc29tZSBvZiB0aGF0IHVudXNlZC4KKyAgICAqLworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0gPT0gTlVMTCkKKwkgY29udGludWU7CisKKyAgICAgIGRldGVjdF9yZWN1cnNpb25fbGlua2VkKHByb2csIHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldLT5pcik7CisgICAgICBpZiAoIXByb2ctPkxpbmtTdGF0dXMpCisJIGdvdG8gZG9uZTsKKworICAgICAgaWYgKGN0eC0+U2hhZGVyQ29tcGlsZXJPcHRpb25zW2ldLkxvd2VyQ2xpcERpc3RhbmNlKSB7CisgICAgICAgICBsb3dlcl9jbGlwX2Rpc3RhbmNlKHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKGRvX2NvbW1vbl9vcHRpbWl6YXRpb24ocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0tPmlyLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPlNoYWRlckNvbXBpbGVyT3B0aW9uc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Q29uc3QuTmF0aXZlSW50ZWdlcnMpKQorCSA7CisgICB9CisKKyAgIC8qIE1hcmsgYWxsIGdlbmVyaWMgc2hhZGVyIGlucHV0cyBhbmQgb3V0cHV0cyBhcyB1bnBhaXJlZC4gKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IE1FU0FfU0hBREVSX1ZFUlRFWDsgaSA8PSBNRVNBX1NIQURFUl9GUkFHTUVOVDsgaSsrKSB7CisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0gIT0gTlVMTCkgeworICAgICAgICAgbGlua19pbnZhbGlkYXRlX3ZhcmlhYmxlX2xvY2F0aW9ucyhwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+aXIpOworICAgICAgfQorICAgfQorCisgICAvKiBGSU5JU0hNRTogVGhlIHZhbHVlIG9mIHRoZSBtYXhfYXR0cmlidXRlX2luZGV4IHBhcmFtZXRlciBpcworICAgICogRklOSVNITUU6IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YKKyAgICAqIEZJTklTSE1FOiBHTF9NQVhfVkVSVEVYX0FUVFJJQlMuICBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgbXVzdCBiZQorICAgICogRklOSVNITUU6IGF0IGxlYXN0IDE2LCBzbyBoYXJkY29kZSAxNiBmb3Igbm93LgorICAgICovCisgICBpZiAoIWFzc2lnbl9hdHRyaWJ1dGVfb3JfY29sb3JfbG9jYXRpb25zKHByb2csIE1FU0FfU0hBREVSX1ZFUlRFWCwgMTYpKSB7CisgICAgICBnb3RvIGRvbmU7CisgICB9CisKKyAgIGlmICghYXNzaWduX2F0dHJpYnV0ZV9vcl9jb2xvcl9sb2NhdGlvbnMocHJvZywgTUVTQV9TSEFERVJfRlJBR01FTlQsIE1BWDIoY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycywgY3R4LT5Db25zdC5NYXhEdWFsU291cmNlRHJhd0J1ZmZlcnMpKSkgeworICAgICAgZ290byBkb25lOworICAgfQorCisgICB1bnNpZ25lZCBmaXJzdDsKKyAgIGZvciAoZmlyc3QgPSAwOyBmaXJzdCA8PSBNRVNBX1NIQURFUl9GUkFHTUVOVDsgZmlyc3QrKykgeworICAgICAgaWYgKHByb2ctPl9MaW5rZWRTaGFkZXJzW2ZpcnN0XSAhPSBOVUxMKQorCSBicmVhazsKKyAgIH0KKworICAgaWYgKG51bV90ZmVlZGJhY2tfZGVjbHMgIT0gMCkgeworICAgICAgLyogRnJvbSBHTF9FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrOgorICAgICAgICogICBBIHByb2dyYW0gd2lsbCBmYWlsIHRvIGxpbmsgaWY6CisgICAgICAgKgorICAgICAgICogICAqIHRoZSA8Y291bnQ+IHNwZWNpZmllZCBieSBUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzRVhUIGlzCisgICAgICAgKiAgICAgbm9uLXplcm8sIGJ1dCB0aGUgcHJvZ3JhbSBvYmplY3QgaGFzIG5vIHZlcnRleCBvciBnZW9tZXRyeQorICAgICAgICogICAgIHNoYWRlcjsKKyAgICAgICAqLworICAgICAgaWYgKGZpcnN0ID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UKSB7CisgICAgICAgICBsaW5rZXJfZXJyb3IocHJvZywgIlRyYW5zZm9ybSBmZWVkYmFjayB2YXJ5aW5ncyBzcGVjaWZpZWQsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgIm5vIHZlcnRleCBvciBnZW9tZXRyeSBzaGFkZXIgaXMgcHJlc2VudC4iKTsKKyAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgdGZlZWRiYWNrX2RlY2xzID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsIHRmZWVkYmFja19kZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ctPlRyYW5zZm9ybUZlZWRiYWNrLk51bVZhcnlpbmcpOworICAgICAgaWYgKCFwYXJzZV90ZmVlZGJhY2tfZGVjbHMoY3R4LCBwcm9nLCBtZW1fY3R4LCBudW1fdGZlZWRiYWNrX2RlY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZy0+VHJhbnNmb3JtRmVlZGJhY2suVmFyeWluZ05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZlZWRiYWNrX2RlY2xzKSkKKyAgICAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKworICAgLyogTGlua2luZyB0aGUgc3RhZ2VzIGluIHRoZSBvcHBvc2l0ZSBvcmRlciAoZnJvbSBmcmFnbWVudCB0byB2ZXJ0ZXgpCisgICAgKiBlbnN1cmVzIHRoYXQgaW50ZXItc2hhZGVyIG91dHB1dHMgd3JpdHRlbiB0byBpbiBhbiBlYXJsaWVyIHN0YWdlIGFyZQorICAgICogZWxpbWluYXRlZCBpZiB0aGV5IGFyZSAodHJhbnNpdGl2ZWx5KSBub3QgdXNlZCBpbiBhIGxhdGVyIHN0YWdlLgorICAgICovCisgICBpbnQgbGFzdCwgbmV4dDsKKyAgIGZvciAobGFzdCA9IE1FU0FfU0hBREVSX0ZSQUdNRU5UOyBsYXN0ID49IDA7IGxhc3QtLSkgeworICAgICAgaWYgKHByb2ctPl9MaW5rZWRTaGFkZXJzW2xhc3RdICE9IE5VTEwpCisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKGxhc3QgPj0gMCAmJiBsYXN0IDwgTUVTQV9TSEFERVJfRlJBR01FTlQpIHsKKyAgICAgIGdsX3NoYWRlciAqY29uc3Qgc2ggPSBwcm9nLT5fTGlua2VkU2hhZGVyc1tsYXN0XTsKKworICAgICAgaWYgKG51bV90ZmVlZGJhY2tfZGVjbHMgIT0gMCB8fCBwcm9nLT5TZXBhcmF0ZVNoYWRlcikgeworICAgICAgICAgLyogVGhlcmUgd2FzIG5vIGZyYWdtZW50IHNoYWRlciwgYnV0IHdlIHN0aWxsIGhhdmUgdG8gYXNzaWduIHZhcnlpbmcKKyAgICAgICAgICAqIGxvY2F0aW9ucyBmb3IgdXNlIGJ5IHRyYW5zZm9ybSBmZWVkYmFjay4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKCFhc3NpZ25fdmFyeWluZ19sb2NhdGlvbnMoY3R4LCBtZW1fY3R4LCBwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2gsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGZlZWRiYWNrX2RlY2xzLCB0ZmVlZGJhY2tfZGVjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgZG9fZGVhZF9idWlsdGluX3ZhcnlpbmdzKGN0eCwgc2gsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RmZWVkYmFja19kZWNscywgdGZlZWRiYWNrX2RlY2xzKTsKKworICAgICAgaWYgKCFwcm9nLT5TZXBhcmF0ZVNoYWRlcikKKyAgICAgICAgIGRlbW90ZV9zaGFkZXJfaW5wdXRzX2FuZF9vdXRwdXRzKHNoLCBpcl92YXJfc2hhZGVyX291dCk7CisKKyAgICAgIC8qIEVsaW1pbmF0ZSBjb2RlIHRoYXQgaXMgbm93IGRlYWQgZHVlIHRvIHVudXNlZCBvdXRwdXRzIGJlaW5nIGRlbW90ZWQuCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChkb19kZWFkX2NvZGUoc2gtPmlyLCBmYWxzZSkpCisgICAgICAgICA7CisgICB9CisgICBlbHNlIGlmIChmaXJzdCA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCkgeworICAgICAgLyogSWYgdGhlIHByb2dyYW0gb25seSBjb250YWlucyBhIGZyYWdtZW50IHNoYWRlci4uLgorICAgICAgICovCisgICAgICBnbF9zaGFkZXIgKmNvbnN0IHNoID0gcHJvZy0+X0xpbmtlZFNoYWRlcnNbZmlyc3RdOworCisgICAgICBkb19kZWFkX2J1aWx0aW5fdmFyeWluZ3MoY3R4LCBOVUxMLCBzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGZlZWRiYWNrX2RlY2xzLCB0ZmVlZGJhY2tfZGVjbHMpOworCisgICAgICBpZiAocHJvZy0+U2VwYXJhdGVTaGFkZXIpIHsKKyAgICAgICAgIGlmICghYXNzaWduX3ZhcnlpbmdfbG9jYXRpb25zKGN0eCwgbWVtX2N0eCwgcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogcHJvZHVjZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaCAvKiBjb25zdW1lciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogbnVtX3RmZWVkYmFja19kZWNscyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogdGZlZWRiYWNrX2RlY2xzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBnc19pbnB1dF92ZXJ0aWNlcyAqLykpCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9IGVsc2UKKyAgICAgICAgIGRlbW90ZV9zaGFkZXJfaW5wdXRzX2FuZF9vdXRwdXRzKHNoLCBpcl92YXJfc2hhZGVyX2luKTsKKworICAgICAgd2hpbGUgKGRvX2RlYWRfY29kZShzaC0+aXIsIGZhbHNlKSkKKyAgICAgICAgIDsKKyAgIH0KKworICAgbmV4dCA9IGxhc3Q7CisgICBmb3IgKGludCBpID0gbmV4dCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0gPT0gTlVMTCkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBnbF9zaGFkZXIgKmNvbnN0IHNoX2kgPSBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXTsKKyAgICAgIGdsX3NoYWRlciAqY29uc3Qgc2hfbmV4dCA9IHByb2ctPl9MaW5rZWRTaGFkZXJzW25leHRdOworICAgICAgdW5zaWduZWQgZ3NfaW5wdXRfdmVydGljZXMgPQorICAgICAgICAgbmV4dCA9PSBNRVNBX1NIQURFUl9HRU9NRVRSWSA/IHByb2ctPkdlb20uVmVydGljZXNJbiA6IDA7CisKKyAgICAgIGlmICghYXNzaWduX3ZhcnlpbmdfbG9jYXRpb25zKGN0eCwgbWVtX2N0eCwgcHJvZywgc2hfaSwgc2hfbmV4dCwKKyAgICAgICAgICAgICAgICBuZXh0ID09IE1FU0FfU0hBREVSX0ZSQUdNRU5UID8gbnVtX3RmZWVkYmFja19kZWNscyA6IDAsCisgICAgICAgICAgICAgICAgdGZlZWRiYWNrX2RlY2xzLCBnc19pbnB1dF92ZXJ0aWNlcykpCisgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgIGRvX2RlYWRfYnVpbHRpbl92YXJ5aW5ncyhjdHgsIHNoX2ksIHNoX25leHQsCisgICAgICAgICAgICAgICAgbmV4dCA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCA/IG51bV90ZmVlZGJhY2tfZGVjbHMgOiAwLAorICAgICAgICAgICAgICAgIHRmZWVkYmFja19kZWNscyk7CisKKyAgICAgIGRlbW90ZV9zaGFkZXJfaW5wdXRzX2FuZF9vdXRwdXRzKHNoX2ksIGlyX3Zhcl9zaGFkZXJfb3V0KTsKKyAgICAgIGRlbW90ZV9zaGFkZXJfaW5wdXRzX2FuZF9vdXRwdXRzKHNoX25leHQsIGlyX3Zhcl9zaGFkZXJfaW4pOworCisgICAgICAvKiBFbGltaW5hdGUgY29kZSB0aGF0IGlzIG5vdyBkZWFkIGR1ZSB0byB1bnVzZWQgb3V0cHV0cyBiZWluZyBkZW1vdGVkLgorICAgICAgICovCisgICAgICB3aGlsZSAoZG9fZGVhZF9jb2RlKHNoX2ktPmlyLCBmYWxzZSkpCisgICAgICAgICA7CisgICAgICB3aGlsZSAoZG9fZGVhZF9jb2RlKHNoX25leHQtPmlyLCBmYWxzZSkpCisgICAgICAgICA7CisKKyAgICAgIC8qIFRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIGFsbCBkZWFkIHZhcnlpbmdzIGFyZSBlbGltaW5hdGVkLiAqLworICAgICAgaWYgKCFjaGVja19hZ2FpbnN0X291dHB1dF9saW1pdChjdHgsIHByb2csIHNoX2kpKQorICAgICAgICAgZ290byBkb25lOworICAgICAgaWYgKCFjaGVja19hZ2FpbnN0X2lucHV0X2xpbWl0KGN0eCwgcHJvZywgc2hfbmV4dCkpCisgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgIG5leHQgPSBpOworICAgfQorCisgICBpZiAoIXN0b3JlX3RmZWVkYmFja19pbmZvKGN0eCwgcHJvZywgbnVtX3RmZWVkYmFja19kZWNscywgdGZlZWRiYWNrX2RlY2xzKSkKKyAgICAgIGdvdG8gZG9uZTsKKworICAgdXBkYXRlX2FycmF5X3NpemVzKHByb2cpOworICAgbGlua19hc3NpZ25fdW5pZm9ybV9sb2NhdGlvbnMocHJvZyk7CisgICBsaW5rX2Fzc2lnbl9hdG9taWNfY291bnRlcl9yZXNvdXJjZXMoY3R4LCBwcm9nKTsKKyAgIHN0b3JlX2ZyYWdkZXB0aF9sYXlvdXQocHJvZyk7CisKKyAgIGNoZWNrX3Jlc291cmNlcyhjdHgsIHByb2cpOworICAgY2hlY2tfaW1hZ2VfcmVzb3VyY2VzKGN0eCwgcHJvZyk7CisgICBsaW5rX2NoZWNrX2F0b21pY19jb3VudGVyX3Jlc291cmNlcyhjdHgsIHByb2cpOworCisgICBpZiAoIXByb2ctPkxpbmtTdGF0dXMpCisgICAgICBnb3RvIGRvbmU7CisKKyAgIC8qIE9wZW5HTCBFUyByZXF1aXJlcyB0aGF0IGEgdmVydGV4IHNoYWRlciBhbmQgYSBmcmFnbWVudCBzaGFkZXIgYm90aCBiZQorICAgICogcHJlc2VudCBpbiBhIGxpbmtlZCBwcm9ncmFtLiBHTF9BUkJfRVMyX2NvbXBhdGliaWxpdHkgZG9lc24ndCBzYXkKKyAgICAqIGFueXRoaW5nIGFib3V0IHNoYWRlciBsaW5raW5nIHdoZW4gb25lIG9mIHRoZSBzaGFkZXJzICh2ZXJ0ZXggb3IKKyAgICAqIGZyYWdtZW50IHNoYWRlcikgaXMgYWJzZW50LiBTbywgdGhlIGV4dGVuc2lvbiBzaG91bGRuJ3QgY2hhbmdlIHRoZQorICAgICogYmVoYXZpb3Igc3BlY2lmaWVkIGluIEdMU0wgc3BlY2lmaWNhdGlvbi4KKyAgICAqLworICAgaWYgKCFwcm9nLT5TZXBhcmF0ZVNoYWRlciAmJiBjdHgtPkFQSSA9PSBBUElfT1BFTkdMRVMyKSB7CisgICAgICBpZiAocHJvZy0+X0xpbmtlZFNoYWRlcnNbTUVTQV9TSEFERVJfVkVSVEVYXSA9PSBOVUxMKSB7CisJIGxpbmtlcl9lcnJvcihwcm9nLCAicHJvZ3JhbSBsYWNrcyBhIHZlcnRleCBzaGFkZXJcbiIpOworICAgICAgfSBlbHNlIGlmIChwcm9nLT5fTGlua2VkU2hhZGVyc1tNRVNBX1NIQURFUl9GUkFHTUVOVF0gPT0gTlVMTCkgeworCSBsaW5rZXJfZXJyb3IocHJvZywgInByb2dyYW0gbGFja3MgYSBmcmFnbWVudCBzaGFkZXJcbiIpOworICAgICAgfQorICAgfQorCisgICAvKiBGSU5JU0hNRTogQXNzaWduIGZyYWdtZW50IHNoYWRlciBvdXRwdXQgbG9jYXRpb25zLiAqLworCitkb25lOgorICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKSB7CisgICAgICBmcmVlKHNoYWRlcl9saXN0W2ldKTsKKyAgICAgIGlmIChwcm9nLT5fTGlua2VkU2hhZGVyc1tpXSA9PSBOVUxMKQorCSBjb250aW51ZTsKKworICAgICAgLyogRG8gYSBmaW5hbCB2YWxpZGF0aW9uIHN0ZXAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIElSIHdhc24ndAorICAgICAgICogaW52YWxpZGF0ZWQgYnkgYW55IG1vZGlmaWNhdGlvbnMgcGVyZm9ybWVkIGFmdGVyIGludHJhc3RhZ2UgbGlua2luZy4KKyAgICAgICAqLworICAgICAgdmFsaWRhdGVfaXJfdHJlZShwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+aXIpOworCisgICAgICAvKiBSZXRhaW4gYW55IGxpdmUgSVIsIGJ1dCB0cmFzaCB0aGUgcmVzdC4gKi8KKyAgICAgIHJlcGFyZW50X2lyKHByb2ctPl9MaW5rZWRTaGFkZXJzW2ldLT5pciwgcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0tPmlyKTsKKworICAgICAgLyogVGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgbGlua2VkIHNoYWRlcnMgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0bworICAgICAgICogdmFyaWFibGVzIHRoYXQgd2VyZSByZW1vdmVkIChlLmcuLCB1bnVzZWQgdW5pZm9ybXMpLiAgU2luY2UgaXQgbWF5CisgICAgICAgKiBjb250YWluIGp1bmssIHRoZXJlIGlzIG5vIHBvc3NpYmxlIHZhbGlkIHVzZS4gIERlbGV0ZSBpdCBhbmQgc2V0IHRoZQorICAgICAgICogcG9pbnRlciB0byBOVUxMLgorICAgICAgICovCisgICAgICBkZWxldGUgcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0tPnN5bWJvbHM7CisgICAgICBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+c3ltYm9scyA9IE5VTEw7CisgICB9CisKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saW5rZXIuaCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhOTQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlua2VyLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIEdMU0xfTElOS0VSX0gKKyNkZWZpbmUgR0xTTF9MSU5LRVJfSAorCit2b2lkCitwb3B1bGF0ZV9zeW1ib2xfdGFibGUoZ2xfc2hhZGVyICpzaCk7CisKK2V4dGVybiBib29sCitsaW5rX2Z1bmN0aW9uX2NhbGxzKGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLCBnbF9zaGFkZXIgKm1haW4sCisJCSAgICBnbF9zaGFkZXIgKipzaGFkZXJfbGlzdCwgdW5zaWduZWQgbnVtX3NoYWRlcnMpOworCitleHRlcm4gdm9pZAorbGlua19pbnZhbGlkYXRlX3ZhcmlhYmxlX2xvY2F0aW9ucyhleGVjX2xpc3QgKmlyKTsKKworZXh0ZXJuIHZvaWQKK2xpbmtfYXNzaWduX3VuaWZvcm1fbG9jYXRpb25zKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyk7CisKK2V4dGVybiB2b2lkCitsaW5rX3NldF91bmlmb3JtX2luaXRpYWxpemVycyhzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpOworCitleHRlcm4gaW50CitsaW5rX2Nyb3NzX3ZhbGlkYXRlX3VuaWZvcm1fYmxvY2sodm9pZCAqbWVtX2N0eCwKKwkJCQkgIHN0cnVjdCBnbF91bmlmb3JtX2Jsb2NrICoqbGlua2VkX2Jsb2NrcywKKwkJCQkgIHVuc2lnbmVkIGludCAqbnVtX2xpbmtlZF9ibG9ja3MsCisJCQkJICBzdHJ1Y3QgZ2xfdW5pZm9ybV9ibG9jayAqbmV3X2Jsb2NrKTsKKwordm9pZAorbGlua19hc3NpZ25fdW5pZm9ybV9ibG9ja19vZmZzZXRzKHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcik7CisKK2V4dGVybiBib29sCitsaW5rX3VuaWZvcm1fYmxvY2tzX2FyZV9jb21wYXRpYmxlKGNvbnN0IGdsX3VuaWZvcm1fYmxvY2sgKmEsCisJCQkJICAgY29uc3QgZ2xfdW5pZm9ybV9ibG9jayAqYik7CisKK2V4dGVybiB1bnNpZ25lZAorbGlua191bmlmb3JtX2Jsb2Nrcyh2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKipzaGFkZXJfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3NoYWRlcnMsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF91bmlmb3JtX2Jsb2NrICoqYmxvY2tzX3JldCk7CisKK3ZvaWQKK3ZhbGlkYXRlX2ludHJhc3RhZ2VfaW50ZXJmYWNlX2Jsb2NrcyhzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfc2hhZGVyICoqc2hhZGVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3NoYWRlcnMpOworCit2b2lkCit2YWxpZGF0ZV9pbnRlcnN0YWdlX2lub3V0X2Jsb2NrcyhzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnbF9zaGFkZXIgKnByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xfc2hhZGVyICpjb25zdW1lcik7CisKK3ZvaWQKK3ZhbGlkYXRlX2ludGVyc3RhZ2VfdW5pZm9ybV9ibG9ja3Moc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXIgKipzdGFnZXMsIGludCBudW1fc3RhZ2VzKTsKKworZXh0ZXJuIHZvaWQKK2xpbmtfYXNzaWduX2F0b21pY19jb3VudGVyX3Jlc291cmNlcyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZyk7CisKK2V4dGVybiB2b2lkCitsaW5rX2NoZWNrX2F0b21pY19jb3VudGVyX3Jlc291cmNlcyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nKTsKKworLyoqCisgKiBDbGFzcyBmb3IgcHJvY2Vzc2luZyBhbGwgb2YgdGhlIGxlYWYgZmllbGRzIG9mIGEgdmFyaWFibGUgdGhhdCBjb3JyZXNwb25kcworICogdG8gYSBwcm9ncmFtIHJlc291cmNlLgorICoKKyAqIFRoZSBsZWFmIGZpZWxkcyBhcmUgYWxsIHRoZSBwYXJ0cyBvZiB0aGUgdmFyaWFibGUgdGhhdCB0aGUgYXBwbGljYXRpb24KKyAqIGNvdWxkIHF1ZXJ5IHVzaW5nIFxjIGdsR2V0UHJvZ3JhbVJlc291cmNlSW5kZXggKG9yIHRoYXQgY291bGQgYmUgcmV0dXJuZWQKKyAqIGJ5IFxjIGdsR2V0UHJvZ3JhbVJlc291cmNlTmFtZSkuCisgKgorICogQ2xhc3NlcyBteSBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzIHRvIGltcGxlbWVudCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5LgorICogVGhpcyBjbGFzcyBvbmx5IHByb3ZpZGVzIHRoZSBtZWNoYW5pc20gdG8gaXRlcmF0ZSBvdmVyIHRoZSBsZWF2ZXMuICBEZXJpdmVkCisgKiBjbGFzc2VzIG11c3QgaW1wbGVtZW50IFxjIDo6dmlzaXRfZmllbGQgYW5kIG1heSBvdmVycmlkZSBcYyA6OnByb2Nlc3MuCisgKi8KK2NsYXNzIHByb2dyYW1fcmVzb3VyY2VfdmlzaXRvciB7CitwdWJsaWM6CisgICAvKioKKyAgICAqIEJlZ2luIHByb2Nlc3NpbmcgYSB2YXJpYWJsZQorICAgICoKKyAgICAqIENsYXNzZXMgdGhhdCBvdmVybG9hZCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBjYWxsIFxjIDo6cHJvY2VzcyBmcm9tIHRoZQorICAgICogYmFzZSBjbGFzcyB0byBzdGFydCB0aGUgcmVjdXJzaXZlIHByb2Nlc3Npbmcgb2YgdGhlIHZhcmlhYmxlLgorICAgICoKKyAgICAqIFxwYXJhbSB2YXIgIFRoZSB2YXJpYWJsZSB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZAorICAgICoKKyAgICAqIENhbGxzIFxjIDo6dmlzaXRfZmllbGQgZm9yIGVhY2ggbGVhZiBvZiB0aGUgdmFyaWFibGUuCisgICAgKgorICAgICogXHdhcm5pbmcKKyAgICAqIFdoZW4gcHJvY2Vzc2luZyBhIHVuaWZvcm0gYmxvY2ssIHRoaXMgZW50cnkgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBjYXNlcworICAgICogd2hlcmUgdGhlIHJvdyAvIGNvbHVtbiBvcmRlcmluZyBvZiBtYXRyaWNlcyBpbiB0aGUgYmxvY2sgZG9lcyBub3QKKyAgICAqIG1hdHRlci4gIEZvciBleGFtcGxlLCBlbnVtZXJhdGluZyB0aGUgbmFtZXMgb2YgbWVtYmVycyBvZiB0aGUgYmxvY2ssIGJ1dAorICAgICogbm90IGZvciBkZXRlcm1pbmluZyB0aGUgb2Zmc2V0cyBvZiBtZW1iZXJzLgorICAgICovCisgICB2b2lkIHByb2Nlc3MoaXJfdmFyaWFibGUgKnZhcik7CisKKyAgIC8qKgorICAgICogQmVnaW4gcHJvY2Vzc2luZyBhIHZhcmlhYmxlIG9mIGEgc3RydWN0dXJlZCB0eXBlLgorICAgICoKKyAgICAqIFRoaXMgZmxhdm9yIG9mIFxjIHByb2Nlc3Mgc2hvdWxkIGJlIHVzZWQgdG8gaGFuZGxlIHN0cnVjdHVyZWQgdHlwZXMKKyAgICAqIChpLmUuLCBzdHJ1Y3R1cmVzLCBpbnRlcmZhY2VzLCBvciBhcnJheXMgdGhlcmUgb2YpIHRoYXQgbmVlZCBzcGVjaWFsCisgICAgKiBuYW1lIGhhbmRsaW5nLiAgQSBjb21tb24gdXNhZ2UgaXMgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBibG9jayBuYW1lCisgICAgKiAoaW5zdGVhZCBvZiB0aGUgaW5zdGFuY2UgbmFtZSkgaXMgdXNlZCBmb3IgYW4gaW50ZXJmYWNlIGJsb2NrLgorICAgICoKKyAgICAqIFxwYXJhbSB0eXBlICBUeXBlIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkLCBhc3NvY2lhdGVkIHdpdGggXGMgbmFtZQorICAgICogXHBhcmFtIG5hbWUgIEJhc2UgbmFtZSBvZiB0aGUgc3RydWN0dXJlZCB2YXJpYWJsZSBiZWluZyBwcm9jZXNzZWQKKyAgICAqCisgICAgKiBcbm90ZQorICAgICogXGMgdHlwZSBtdXN0IGJlIFxjIEdMU0xfVFlQRV9SRUNPUkQsIFxjIEdMU0xfVFlQRV9JTlRFUkZBQ0UsIG9yIGFuIGFycmF5CisgICAgKiB0aGVyZSBvZi4KKyAgICAqLworICAgdm9pZCBwcm9jZXNzKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSk7CisKK3Byb3RlY3RlZDoKKyAgIC8qKgorICAgICogTWV0aG9kIGludm9rZWQgZm9yIGVhY2ggbGVhZiBvZiB0aGUgdmFyaWFibGUKKyAgICAqCisgICAgKiBccGFyYW0gdHlwZSAgVHlwZSBvZiB0aGUgZmllbGQuCisgICAgKiBccGFyYW0gbmFtZSAgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICogXHBhcmFtIHJvd19tYWpvciAgRm9yIGEgbWF0cml4IHR5cGUsIGlzIGl0IHN0b3JlZCByb3ctbWFqb3IuCisgICAgKiBccGFyYW0gcmVjb3JkX3R5cGUgIFR5cGUgb2YgdGhlIHJlY29yZCBjb250YWluaW5nIHRoZSBmaWVsZC4KKyAgICAqCisgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IGNhbGxzIHRoZSBvdGhlciBcYyB2aXNpdF9maWVsZCBtZXRob2QuCisgICAgKi8KKyAgIHZpcnR1YWwgdm9pZCB2aXNpdF9maWVsZChjb25zdCBnbHNsX3R5cGUgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByb3dfbWFqb3IsIGNvbnN0IGdsc2xfdHlwZSAqcmVjb3JkX3R5cGUpOworCisgICAvKioKKyAgICAqIE1ldGhvZCBpbnZva2VkIGZvciBlYWNoIGxlYWYgb2YgdGhlIHZhcmlhYmxlCisgICAgKgorICAgICogXHBhcmFtIHR5cGUgIFR5cGUgb2YgdGhlIGZpZWxkLgorICAgICogXHBhcmFtIG5hbWUgIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAqIFxwYXJhbSByb3dfbWFqb3IgIEZvciBhIG1hdHJpeCB0eXBlLCBpcyBpdCBzdG9yZWQgcm93LW1ham9yLgorICAgICovCisgICB2aXJ0dWFsIHZvaWQgdmlzaXRfZmllbGQoY29uc3QgZ2xzbF90eXBlICp0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcm93X21ham9yKSA9IDA7CisKKyAgIC8qKgorICAgICogVmlzaXQgYSByZWNvcmQgYmVmb3JlIHZpc2l0aW5nIGl0cyBmaWVsZHMKKyAgICAqCisgICAgKiBGb3Igc3RydWN0dXJlcy1vZi1zdHJ1Y3R1cmVzIG9yIGludGVyZmFjZXMtb2Ytc3RydWN0dXJlcywgdGhpcyB2aXNpdHMKKyAgICAqIHRoZSBpbm5lciBzdHJ1Y3R1cmUgYmVmb3JlIHZpc2l0aW5nIGl0cyBmaWVsZHMuCisgICAgKgorICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgICovCisgICB2aXJ0dWFsIHZvaWQgdmlzaXRfZmllbGQoY29uc3QgZ2xzbF9zdHJ1Y3RfZmllbGQgKmZpZWxkKTsKKworcHJpdmF0ZToKKyAgIC8qKgorICAgICogXHBhcmFtIG5hbWVfbGVuZ3RoICBMZW5ndGggb2YgdGhlIGN1cnJlbnQgbmFtZSBcYiBub3QgaW5jbHVkaW5nIHRoZQorICAgICogICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGluZyBcYyBOVUwgY2hhcmFjdGVyLgorICAgICovCisgICB2b2lkIHJlY3Vyc2lvbihjb25zdCBnbHNsX3R5cGUgKnQsIGNoYXIgKipuYW1lLCBzaXplX3QgbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICBib29sIHJvd19tYWpvciwgY29uc3QgZ2xzbF90eXBlICpyZWNvcmRfdHlwZSk7Cit9OworCit2b2lkCitsaW5rZXJfZXJyb3IoZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwordm9pZAorbGlua2VyX3dhcm5pbmcoZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworI2VuZGlmIC8qIEdMU0xfTElOS0VSX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlzdC5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0YjY4NgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbGlzdC5oCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDgsIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsaXN0LmgKKyAqIFxicmllZiBEb3VibHktbGlua2VkIGxpc3QgYWJzdHJhY3QgY29udGFpbmVyIHR5cGUuCisgKgorICogRWFjaCBkb3VibHktbGlua2VkIGxpc3QgaGFzIGEgc2VudGluZWwgaGVhZCBhbmQgdGFpbCBub2RlLiAgVGhlc2Ugbm9kZXMKKyAqIGNvbnRhaW4gbm8gZGF0YS4gIFRoZSBoZWFkIHNlbnRpbmVsIGNhbiBiZSBpZGVudGlmaWVkIGJ5IGl0cyBcYyBwcmV2CisgKiBwb2ludGVyIGJlaW5nIFxjIE5VTEwuICBUaGUgdGFpbCBzZW50aW5lbCBjYW4gYmUgaWRlbnRpZmllZCBieSBpdHMKKyAqIFxjIG5leHQgcG9pbnRlciBiZWluZyBcYyBOVUxMLgorICoKKyAqIEEgbGlzdCBpcyBlbXB0eSBpZiBlaXRoZXIgdGhlIGhlYWQgc2VudGluZWwncyBcYyBuZXh0IHBvaW50ZXIgcG9pbnRzIHRvIHRoZQorICogdGFpbCBzZW50aW5lbCBvciB0aGUgdGFpbCBzZW50aW5lbCdzIFxjIHByZXYgcG9pbmVyIHBvaW50cyB0byB0aGUgaGVhZAorICogc2VudGluZWwuCisgKgorICogSW5zdGVhZCBvZiB0cmFja2luZyB0d28gc2VwYXJhdGUgXGMgbm9kZSBzdHJ1Y3R1cmVzIGFuZCBhIFxjIGxpc3Qgc3RydWN0dXJlCisgKiB0aGF0IHBvaW50cyB0byB0aGVtLCB0aGUgc2VudGluZWwgbm9kZXMgYXJlIGluIGEgc2luZ2xlIHN0cnVjdHVyZS4gIE5vdGluZworICogdGhhdCBlYWNoIHNlbnRpbmVsIG5vZGUgYWx3YXlzIGhhcyBvbmUgXGMgTlVMTCBwb2ludGVyLCB0aGUgXGMgTlVMTAorICogcG9pbnRlcnMgb2NjdXB5IHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbi4gIEluIHRoZSBcYyBsaXN0IHN0cnVjdHVyZQorICogY29udGFpbnMgYSB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgLSBBIFxjIGhlYWQgcG9pbnRlciB0aGF0IHJlcHJlc2VudHMgdGhlIFxjIG5leHQgcG9pbnRlciBvZiB0aGUKKyAqICAgICBoZWFkIHNlbnRpbmVsIG5vZGUuCisgKiAgIC0gQSBcYyB0YWlsIHBvaW50ZXIgdGhhdCByZXByZXNlbnRzIHRoZSBcYyBwcmV2IHBvaW50ZXIgb2YgdGhlIGhlYWQKKyAqICAgICBzZW50aW5lbCBub2RlIGFuZCB0aGUgXGMgbmV4dCBwb2ludGVyIG9mIHRoZSB0YWlsIHNlbnRpbmVsIG5vZGUuICBUaGlzCisgKiAgICAgcG9pbnRlciBpcyBcYiBhbHdheXMgXGMgTlVMTC4KKyAqICAgLSBBIFxjIHRhaWxfcHJldiBwb2ludGVyIHRoYXQgcmVwcmVzZW50cyB0aGUgXGMgcHJldiBwb2ludGVyIG9mIHRoZQorICogICAgIHRhaWwgc2VudGluZWwgbm9kZS4KKyAqCisgKiBUaGVyZWZvcmUsIGlmIFxjIGhlYWQtPm5leHQgaXMgXGMgTlVMTCBvciBcYyB0YWlsX3ByZXYtPnByZXYgaXMgXGMgTlVMTCwKKyAqIHRoZSBsaXN0IGlzIGVtcHR5LgorICoKKyAqIFRvIGFueW9uZSBmYW1pbGlhciB3aXRoICJleGVjIGxpc3RzIiBvbiB0aGUgQW1pZ2EsIHRoaXMgc3RydWN0dXJlIHNob3VsZAorICogYmUgaW1tZWRpYXRlbHkgcmVjb2duaXphYmxlLiAgU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgdGhlIG9yaWdpbmFsIEFtaWdhCisgKiBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gb24gdGhlIHN1YmplY3QuCisgKgorICogaHR0cDovL3d3dy5uYXRhbWkubmV0L2Rldi9MaWJyYXJpZXNfTWFudWFsX2d1aWRlL25vZGUwMkQ3Lmh0bWwKKyAqCisgKiBcYXV0aG9yIElhbiBSb21hbmljayA8aWFuLmQucm9tYW5pY2tAaW50ZWwuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBMSVNUX0NPTlRBSU5FUl9ICisjZGVmaW5lIExJU1RfQ09OVEFJTkVSX0gKKworI2lmbmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJyYWxsb2MuaCIKKworc3RydWN0IGV4ZWNfbm9kZSB7CisgICBzdHJ1Y3QgZXhlY19ub2RlICpuZXh0OworICAgc3RydWN0IGV4ZWNfbm9kZSAqcHJldjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKGV4ZWNfbm9kZSkKKworICAgZXhlY19ub2RlKCkgOiBuZXh0KE5VTEwpLCBwcmV2KE5VTEwpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICBjb25zdCBleGVjX25vZGUgKmdldF9uZXh0KCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBuZXh0OworICAgfQorCisgICBleGVjX25vZGUgKmdldF9uZXh0KCkKKyAgIHsKKyAgICAgIHJldHVybiBuZXh0OworICAgfQorCisgICBjb25zdCBleGVjX25vZGUgKmdldF9wcmV2KCkgY29uc3QKKyAgIHsKKyAgICAgIHJldHVybiBwcmV2OworICAgfQorCisgICBleGVjX25vZGUgKmdldF9wcmV2KCkKKyAgIHsKKyAgICAgIHJldHVybiBwcmV2OworICAgfQorCisgICB2b2lkIHJlbW92ZSgpCisgICB7CisgICAgICBuZXh0LT5wcmV2ID0gcHJldjsKKyAgICAgIHByZXYtPm5leHQgPSBuZXh0OworICAgICAgbmV4dCA9IE5VTEw7CisgICAgICBwcmV2ID0gTlVMTDsKKyAgIH0KKworICAgLyoqCisgICAgKiBMaW5rIGEgbm9kZSB3aXRoIGl0c2VsZgorICAgICoKKyAgICAqIFRoaXMgY3JlYXRlcyBhIHNvcnQgb2YgZGVnZW5lcmF0ZSBsaXN0IHRoYXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bC4KKyAgICAqLworICAgdm9pZCBzZWxmX2xpbmsoKQorICAgeworICAgICAgbmV4dCA9IHRoaXM7CisgICAgICBwcmV2ID0gdGhpczsKKyAgIH0KKworICAgLyoqCisgICAgKiBJbnNlcnQgYSBub2RlIGluIHRoZSBsaXN0IGFmdGVyIHRoZSBjdXJyZW50IG5vZGUKKyAgICAqLworICAgdm9pZCBpbnNlcnRfYWZ0ZXIoZXhlY19ub2RlICphZnRlcikKKyAgIHsKKyAgICAgIGFmdGVyLT5uZXh0ID0gdGhpcy0+bmV4dDsKKyAgICAgIGFmdGVyLT5wcmV2ID0gdGhpczsKKworICAgICAgdGhpcy0+bmV4dC0+cHJldiA9IGFmdGVyOworICAgICAgdGhpcy0+bmV4dCA9IGFmdGVyOworICAgfQorICAgLyoqCisgICAgKiBJbnNlcnQgYSBub2RlIGluIHRoZSBsaXN0IGJlZm9yZSB0aGUgY3VycmVudCBub2RlCisgICAgKi8KKyAgIHZvaWQgaW5zZXJ0X2JlZm9yZShleGVjX25vZGUgKmJlZm9yZSkKKyAgIHsKKyAgICAgIGJlZm9yZS0+bmV4dCA9IHRoaXM7CisgICAgICBiZWZvcmUtPnByZXYgPSB0aGlzLT5wcmV2OworCisgICAgICB0aGlzLT5wcmV2LT5uZXh0ID0gYmVmb3JlOworICAgICAgdGhpcy0+cHJldiA9IGJlZm9yZTsKKyAgIH0KKworICAgLyoqCisgICAgKiBJbnNlcnQgYW5vdGhlciBsaXN0IGluIHRoZSBsaXN0IGJlZm9yZSB0aGUgY3VycmVudCBub2RlCisgICAgKi8KKyAgIHZvaWQgaW5zZXJ0X2JlZm9yZShzdHJ1Y3QgZXhlY19saXN0ICpiZWZvcmUpOworCisgICAvKioKKyAgICAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgbm9kZSB3aXRoIHRoZSBnaXZlbiBub2RlLgorICAgICovCisgICB2b2lkIHJlcGxhY2Vfd2l0aChleGVjX25vZGUgKnJlcGxhY2VtZW50KQorICAgeworICAgICAgcmVwbGFjZW1lbnQtPnByZXYgPSB0aGlzLT5wcmV2OworICAgICAgcmVwbGFjZW1lbnQtPm5leHQgPSB0aGlzLT5uZXh0OworCisgICAgICB0aGlzLT5wcmV2LT5uZXh0ID0gcmVwbGFjZW1lbnQ7CisgICAgICB0aGlzLT5uZXh0LT5wcmV2ID0gcmVwbGFjZW1lbnQ7CisgICB9CisKKyAgIC8qKgorICAgICogSXMgdGhpcyB0aGUgc2VudGluZWwgYXQgdGhlIHRhaWwgb2YgdGhlIGxpc3Q/CisgICAgKi8KKyAgIGJvb2wgaXNfdGFpbF9zZW50aW5lbCgpIGNvbnN0CisgICB7CisgICAgICByZXR1cm4gdGhpcy0+bmV4dCA9PSBOVUxMOworICAgfQorCisgICAvKioKKyAgICAqIElzIHRoaXMgdGhlIHNlbnRpbmVsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0PworICAgICovCisgICBib29sIGlzX2hlYWRfc2VudGluZWwoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuIHRoaXMtPnByZXYgPT0gTlVMTDsKKyAgIH0KKyNlbmRpZgorfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKy8qIFRoaXMgbWFjcm8gd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgaWYgYHQnIHVzZXMgdmlydHVhbCBpbmhlcml0YW5jZS4gIElmIHlvdQorICogYXJlIHVzaW5nIHZpcnR1YWwgaW5oZXJpdGFuY2UsIHlvdSBkZXNlcnZlIGEgc2xvdyBhbmQgcGFpbmZ1bCBkZWF0aC4gIEVuam95IQorICovCisjZGVmaW5lIGV4ZWNfbGlzdF9vZmZzZXRvZih0LCBmLCBwKSBcCisgICAoKChjaGFyICopICYoKHQgKikgcCktPmYpIC0gKChjaGFyICopIHApKQorI2Vsc2UKKyNkZWZpbmUgZXhlY19saXN0X29mZnNldG9mKHQsIGYsIHApIG9mZnNldG9mKHQsIGYpCisjZW5kaWYKKworLyoqCisgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbiBleGVjX25vZGUKKyAqCisgKiBHaXZlbiBhIHBvaW50ZXIgdG8gYW4gXGMgZXhlY19ub2RlIGVtYmVkZGVkIGluIGEgc3RydWN0dXJlLCBnZXQgYSBwb2ludGVyIHRvCisgKiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUuCisgKgorICogXHBhcmFtIHR5cGUgIEJhc2UgdHlwZSBvZiB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5vZGUKKyAqIFxwYXJhbSBub2RlICBQb2ludGVyIHRvIHRoZSBcYyBleGVjX25vZGUKKyAqIFxwYXJhbSBmaWVsZCBOYW1lIG9mIHRoZSBmaWVsZCBpbiBcYyB0eXBlIHRoYXQgaXMgdGhlIGVtYmVkZGVkIFxjIGV4ZWNfbm9kZQorICovCisjZGVmaW5lIGV4ZWNfbm9kZV9kYXRhKHR5cGUsIG5vZGUsIGZpZWxkKSBcCisgICAoKHR5cGUgKikgKCgoY2hhciAqKSBub2RlKSAtIGV4ZWNfbGlzdF9vZmZzZXRvZih0eXBlLCBmaWVsZCwgbm9kZSkpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK3N0cnVjdCBleGVjX25vZGU7CisjZW5kaWYKKworc3RydWN0IGV4ZWNfbGlzdCB7CisgICBzdHJ1Y3QgZXhlY19ub2RlICpoZWFkOworICAgc3RydWN0IGV4ZWNfbm9kZSAqdGFpbDsKKyAgIHN0cnVjdCBleGVjX25vZGUgKnRhaWxfcHJlZDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICBERUNMQVJFX1JBTExPQ19DWFhfT1BFUkFUT1JTKGV4ZWNfbGlzdCkKKworICAgZXhlY19saXN0KCkKKyAgIHsKKyAgICAgIG1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgdm9pZCBtYWtlX2VtcHR5KCkKKyAgIHsKKyAgICAgIGhlYWQgPSAoZXhlY19ub2RlICopICYgdGFpbDsKKyAgICAgIHRhaWwgPSBOVUxMOworICAgICAgdGFpbF9wcmVkID0gKGV4ZWNfbm9kZSAqKSAmIGhlYWQ7CisgICB9CisKKyAgIGJvb2wgaXNfZW1wdHkoKSBjb25zdAorICAgeworICAgICAgLyogVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gdGVzdCB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eSBvciBub3QuCisgICAgICAgKgorICAgICAgICogLSBDaGVjayB0byBzZWUgaWYgdGhlIFxjIGhlYWQgcG9pbnRzIHRvIHRoZSBcYyB0YWlsLgorICAgICAgICogLSBDaGVjayB0byBzZWUgaWYgdGhlIFxjIHRhaWxfcHJlZCBwb2ludHMgdG8gdGhlIFxjIGhlYWQuCisgICAgICAgKiAtIENoZWNrIHRvIHNlZSBpZiB0aGUgXGMgaGVhZCBpcyB0aGUgc2VudGluZWwgbm9kZSBieSB0ZXN0IHdoZXRoZXIgaXRzCisgICAgICAgKiAgIFxjIG5leHQgcG9pbnRlciBpcyBcYyBOVUxMLgorICAgICAgICoKKyAgICAgICAqIFRoZSBmaXJzdCB0d28gbWV0aG9kcyB0ZW5kIHRvIGdlbmVyYXRlIGJldHRlciBjb2RlIG9uIG1vZGVybiBzeXN0ZW1zCisgICAgICAgKiBiZWNhdXNlIHRoZXkgc2F2ZSBhIHBvaW50ZXIgZGVyZWZlcmVuY2UuCisgICAgICAgKi8KKyAgICAgIHJldHVybiBoZWFkID09IChleGVjX25vZGUgKikgJnRhaWw7CisgICB9CisKKyAgIGNvbnN0IGV4ZWNfbm9kZSAqZ2V0X2hlYWQoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuICFpc19lbXB0eSgpID8gaGVhZCA6IE5VTEw7CisgICB9CisKKyAgIGV4ZWNfbm9kZSAqZ2V0X2hlYWQoKQorICAgeworICAgICAgcmV0dXJuICFpc19lbXB0eSgpID8gaGVhZCA6IE5VTEw7CisgICB9CisKKyAgIGNvbnN0IGV4ZWNfbm9kZSAqZ2V0X3RhaWwoKSBjb25zdAorICAgeworICAgICAgcmV0dXJuICFpc19lbXB0eSgpID8gdGFpbF9wcmVkIDogTlVMTDsKKyAgIH0KKworICAgZXhlY19ub2RlICpnZXRfdGFpbCgpCisgICB7CisgICAgICByZXR1cm4gIWlzX2VtcHR5KCkgPyB0YWlsX3ByZWQgOiBOVUxMOworICAgfQorCisgICB2b2lkIHB1c2hfaGVhZChleGVjX25vZGUgKm4pCisgICB7CisgICAgICBuLT5uZXh0ID0gaGVhZDsKKyAgICAgIG4tPnByZXYgPSAoZXhlY19ub2RlICopICZoZWFkOworCisgICAgICBuLT5uZXh0LT5wcmV2ID0gbjsKKyAgICAgIGhlYWQgPSBuOworICAgfQorCisgICB2b2lkIHB1c2hfdGFpbChleGVjX25vZGUgKm4pCisgICB7CisgICAgICBuLT5uZXh0ID0gKGV4ZWNfbm9kZSAqKSAmdGFpbDsKKyAgICAgIG4tPnByZXYgPSB0YWlsX3ByZWQ7CisKKyAgICAgIG4tPnByZXYtPm5leHQgPSBuOworICAgICAgdGFpbF9wcmVkID0gbjsKKyAgIH0KKworICAgdm9pZCBwdXNoX2RlZ2VuZXJhdGVfbGlzdF9hdF9oZWFkKGV4ZWNfbm9kZSAqbikKKyAgIHsKKyAgICAgIGFzc2VydChuLT5wcmV2LT5uZXh0ID09IG4pOworCisgICAgICBuLT5wcmV2LT5uZXh0ID0gaGVhZDsKKyAgICAgIGhlYWQtPnByZXYgPSBuLT5wcmV2OworICAgICAgbi0+cHJldiA9IChleGVjX25vZGUgKikgJmhlYWQ7CisgICAgICBoZWFkID0gbjsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZW1vdmUgdGhlIGZpcnN0IG5vZGUgZnJvbSBhIGxpc3QgYW5kIHJldHVybiBpdAorICAgICoKKyAgICAqIFxyZXR1cm4KKyAgICAqIFRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0IG9yIFxjIE5VTEwgaWYgdGhlIGxpc3QgaXMgZW1wdHkuCisgICAgKgorICAgICogXHNhIGV4ZWNfbGlzdDo6Z2V0X2hlYWQKKyAgICAqLworICAgZXhlY19ub2RlICpwb3BfaGVhZCgpCisgICB7CisgICAgICBleGVjX25vZGUgKmNvbnN0IG4gPSB0aGlzLT5nZXRfaGVhZCgpOworICAgICAgaWYgKG4gIT0gTlVMTCkKKwkgbi0+cmVtb3ZlKCk7CisKKyAgICAgIHJldHVybiBuOworICAgfQorCisgICAvKioKKyAgICAqIE1vdmUgYWxsIG9mIHRoZSBub2RlcyBmcm9tIHRoaXMgbGlzdCB0byB0aGUgdGFyZ2V0IGxpc3QKKyAgICAqLworICAgdm9pZCBtb3ZlX25vZGVzX3RvKGV4ZWNfbGlzdCAqdGFyZ2V0KQorICAgeworICAgICAgaWYgKGlzX2VtcHR5KCkpIHsKKwkgdGFyZ2V0LT5tYWtlX2VtcHR5KCk7CisgICAgICB9IGVsc2UgeworCSB0YXJnZXQtPmhlYWQgPSBoZWFkOworCSB0YXJnZXQtPnRhaWwgPSBOVUxMOworCSB0YXJnZXQtPnRhaWxfcHJlZCA9IHRhaWxfcHJlZDsKKworCSB0YXJnZXQtPmhlYWQtPnByZXYgPSAoZXhlY19ub2RlICopICZ0YXJnZXQtPmhlYWQ7CisJIHRhcmdldC0+dGFpbF9wcmVkLT5uZXh0ID0gKGV4ZWNfbm9kZSAqKSAmdGFyZ2V0LT50YWlsOworCisJIG1ha2VfZW1wdHkoKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyoqCisgICAgKiBBcHBlbmQgYWxsIG5vZGVzIGZyb20gdGhlIHNvdXJjZSBsaXN0IHRvIHRoZSB0YXJnZXQgbGlzdAorICAgICovCisgICB2b2lkCisgICBhcHBlbmRfbGlzdChleGVjX2xpc3QgKnNvdXJjZSkKKyAgIHsKKyAgICAgIGlmIChzb3VyY2UtPmlzX2VtcHR5KCkpCisJIHJldHVybjsKKworICAgICAgLyogTGluayB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgc291cmNlIHdpdGggdGhlIGxhc3Qgbm9kZSBvZiB0aGUgdGFyZ2V0IGxpc3QuCisgICAgICAgKi8KKyAgICAgIHRoaXMtPnRhaWxfcHJlZC0+bmV4dCA9IHNvdXJjZS0+aGVhZDsKKyAgICAgIHNvdXJjZS0+aGVhZC0+cHJldiA9IHRoaXMtPnRhaWxfcHJlZDsKKworICAgICAgLyogTWFrZSB0aGUgdGFpbCBvZiB0aGUgc291cmNlIGxpc3QgYmUgdGhlIHRhaWwgb2YgdGhlIHRhcmdldCBsaXN0LgorICAgICAgICovCisgICAgICB0aGlzLT50YWlsX3ByZWQgPSBzb3VyY2UtPnRhaWxfcHJlZDsKKyAgICAgIHRoaXMtPnRhaWxfcHJlZC0+bmV4dCA9IChleGVjX25vZGUgKikgJnRoaXMtPnRhaWw7CisKKyAgICAgIC8qIE1ha2UgdGhlIHNvdXJjZSBsaXN0IGVtcHR5IGZvciBnb29kIG1lYXN1cmUuCisgICAgICAgKi8KKyAgICAgIHNvdXJjZS0+bWFrZV9lbXB0eSgpOworICAgfQorI2VuZGlmCit9OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworaW5saW5lIHZvaWQgZXhlY19ub2RlOjppbnNlcnRfYmVmb3JlKGV4ZWNfbGlzdCAqYmVmb3JlKQoreworICAgaWYgKGJlZm9yZS0+aXNfZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKworICAgYmVmb3JlLT50YWlsX3ByZWQtPm5leHQgPSB0aGlzOworICAgYmVmb3JlLT5oZWFkLT5wcmV2ID0gdGhpcy0+cHJldjsKKworICAgdGhpcy0+cHJldi0+bmV4dCA9IGJlZm9yZS0+aGVhZDsKKyAgIHRoaXMtPnByZXYgPSBiZWZvcmUtPnRhaWxfcHJlZDsKKworICAgYmVmb3JlLT5tYWtlX2VtcHR5KCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBUaGlzIHZlcnNpb24gaXMgc2FmZSBldmVuIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgcmVtb3ZlZC4KKyAqLyAKKyNkZWZpbmUgZm9yZWFjaF9saXN0X3NhZmUoX19ub2RlLCBfX2xpc3QpCQkJICAgICBcCisgICBmb3IgKGV4ZWNfbm9kZSAqIF9fbm9kZSA9IChfX2xpc3QpLT5oZWFkLCAqIF9fbmV4dCA9IF9fbm9kZS0+bmV4dCBcCisJOyBfX25leHQgIT0gTlVMTAkJCQkJICAgICBcCisJOyBfX25vZGUgPSBfX25leHQsIF9fbmV4dCA9IF9fbmV4dC0+bmV4dCkKKworI2RlZmluZSBmb3JlYWNoX2xpc3QoX19ub2RlLCBfX2xpc3QpCQkJXAorICAgZm9yIChleGVjX25vZGUgKiBfX25vZGUgPSAoX19saXN0KS0+aGVhZAkJXAorCTsgKF9fbm9kZSktPm5leHQgIT0gTlVMTCAJCQlcCisJOyAoX19ub2RlKSA9IChfX25vZGUpLT5uZXh0KQorCisvKioKKyAqIEl0ZXJhdGUgdGhyb3VnaCB0d28gbGlzdHMgYXQgb25jZS4gIFN0b3BzIGF0IHRoZSBlbmQgb2YgdGhlIHNob3J0ZXIgbGlzdC4KKyAqCisgKiBUaGlzIGlzIHNhZmUgYWdhaW5zdCBlaXRoZXIgY3VycmVudCBub2RlIGJlaW5nIHJlbW92ZWQgb3IgcmVwbGFjZWQuCisgKi8KKyNkZWZpbmUgZm9yZWFjaF90d29fbGlzdHMoX19ub2RlMSwgX19saXN0MSwgX19ub2RlMiwgX19saXN0MikgXAorICAgZm9yIChleGVjX25vZGUgKiBfX25vZGUxID0gKF9fbGlzdDEpLT5oZWFkLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAqIF9fbm9kZTIgPSAoX19saXN0MiktPmhlYWQsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICogX19uZXh0MSA9IF9fbm9kZTEtPm5leHQsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKiBfX25leHQyID0gX19ub2RlMi0+bmV4dCAgICAgICAgICAgICAgICAgICBcCisJOyBfX25leHQxICE9IE5VTEwgJiYgX19uZXh0MiAhPSBOVUxMICAgICAgICAgICAgICAgICAgXAorCTsgX19ub2RlMSA9IF9fbmV4dDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfX25vZGUyID0gX19uZXh0MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIF9fbmV4dDEgPSBfX25leHQxLT5uZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX19uZXh0MiA9IF9fbmV4dDItPm5leHQpCisKKyNkZWZpbmUgZm9yZWFjaF9saXN0X2NvbnN0KF9fbm9kZSwgX19saXN0KQkJXAorICAgZm9yIChjb25zdCBleGVjX25vZGUgKiBfX25vZGUgPSAoX19saXN0KS0+aGVhZAlcCisJOyAoX19ub2RlKS0+bmV4dCAhPSBOVUxMIAkJCVwKKwk7IChfX25vZGUpID0gKF9fbm9kZSktPm5leHQpCisKKyNkZWZpbmUgZm9yZWFjaF9saXN0X3R5cGVkKF9fdHlwZSwgX19ub2RlLCBfX2ZpZWxkLCBfX2xpc3QpCQlcCisgICBmb3IgKF9fdHlwZSAqIF9fbm9kZSA9CQkJCQkJXAorCSAgIGV4ZWNfbm9kZV9kYXRhKF9fdHlwZSwgKF9fbGlzdCktPmhlYWQsIF9fZmllbGQpOwkJXAorCShfX25vZGUpLT5fX2ZpZWxkLm5leHQgIT0gTlVMTDsgCQkJCVwKKwkoX19ub2RlKSA9IGV4ZWNfbm9kZV9kYXRhKF9fdHlwZSwgKF9fbm9kZSktPl9fZmllbGQubmV4dCwgX19maWVsZCkpCisKKyNkZWZpbmUgZm9yZWFjaF9saXN0X3R5cGVkX2NvbnN0KF9fdHlwZSwgX19ub2RlLCBfX2ZpZWxkLCBfX2xpc3QpCVwKKyAgIGZvciAoY29uc3QgX190eXBlICogX19ub2RlID0JCQkJCQlcCisJICAgZXhlY19ub2RlX2RhdGEoX190eXBlLCAoX19saXN0KS0+aGVhZCwgX19maWVsZCk7CQlcCisJKF9fbm9kZSktPl9fZmllbGQubmV4dCAhPSBOVUxMOyAJCQkJXAorCShfX25vZGUpID0gZXhlY19ub2RlX2RhdGEoX190eXBlLCAoX19ub2RlKS0+X19maWVsZC5uZXh0LCBfX2ZpZWxkKSkKKworI2VuZGlmIC8qIExJU1RfQ09OVEFJTkVSX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG9vcF9hbmFseXNpcy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvb3BfYW5hbHlzaXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTlhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvb3BfYW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJsb29wX2FuYWx5c2lzLmgiCisjaW5jbHVkZSAiaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IuaCIKKworc3RhdGljIGJvb2wgaXNfbG9vcF90ZXJtaW5hdG9yKGlyX2lmICppcik7CisKK3N0YXRpYyBib29sIGFsbF9leHByZXNzaW9uX29wZXJhbmRzX2FyZV9sb29wX2NvbnN0YW50KGlyX3J2YWx1ZSAqLAorCQkJCQkJICAgICAgaGFzaF90YWJsZSAqKTsKKworc3RhdGljIGlyX3J2YWx1ZSAqZ2V0X2Jhc2ljX2luZHVjdGlvbl9pbmNyZW1lbnQoaXJfYXNzaWdubWVudCAqLCBoYXNoX3RhYmxlICopOworCisKKy8qKgorICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlIGdpdmVuIGxvb3AgdmFyaWFibGUgd2FzIHJlZmVyZW5jZWQgaW5zaWRlIHRoZSBsb29wLgorICoKKyAqIFxhcmcgaW5fYXNzaWduZWUgaXMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIHdhcyBvbiB0aGUgTEhTIG9mIGFuIGFzc2lnbm1lbnQuCisgKgorICogXGFyZyBpbl9jb25kaXRpb25hbF9jb2RlX29yX25lc3RlZF9sb29wIGlzIHRydWUgaWYgdGhlIHJlZmVyZW5jZSBvY2N1cnJlZAorICogaW5zaWRlIGFuIGlmIHN0YXRlbWVudCBvciBhIG5lc3RlZCBsb29wLgorICoKKyAqIFxhcmcgY3VycmVudF9hc3NpZ25tZW50IGlzIHRoZSBpcl9hc3NpZ25tZW50IG5vZGUgdGhhdCB0aGUgbG9vcCB2YXJpYWJsZSBpcworICogb24gdGhlIExIUyBvZiwgaWYgYW55IChpZ25vcmVkIGlmIFxjIGluX2Fzc2lnbmVlIGlzIGZhbHNlKS4KKyAqLwordm9pZAorbG9vcF92YXJpYWJsZTo6cmVjb3JkX3JlZmVyZW5jZShib29sIGluX2Fzc2lnbmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbmRpdGlvbmFsX2NvZGVfb3JfbmVzdGVkX2xvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX2Fzc2lnbm1lbnQgKmN1cnJlbnRfYXNzaWdubWVudCkKK3sKKyAgIGlmIChpbl9hc3NpZ25lZSkgeworICAgICAgYXNzZXJ0KGN1cnJlbnRfYXNzaWdubWVudCAhPSBOVUxMKTsKKworICAgICAgaWYgKGluX2NvbmRpdGlvbmFsX2NvZGVfb3JfbmVzdGVkX2xvb3AgfHwKKyAgICAgICAgICBjdXJyZW50X2Fzc2lnbm1lbnQtPmNvbmRpdGlvbiAhPSBOVUxMKSB7CisgICAgICAgICB0aGlzLT5jb25kaXRpb25hbF9vcl9uZXN0ZWRfYXNzaWdubWVudCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLT5maXJzdF9hc3NpZ25tZW50ID09IE5VTEwpIHsKKyAgICAgICAgIGFzc2VydCh0aGlzLT5udW1fYXNzaWdubWVudHMgPT0gMCk7CisKKyAgICAgICAgIHRoaXMtPmZpcnN0X2Fzc2lnbm1lbnQgPSBjdXJyZW50X2Fzc2lnbm1lbnQ7CisgICAgICB9CisKKyAgICAgIHRoaXMtPm51bV9hc3NpZ25tZW50cysrOworICAgfSBlbHNlIGlmICh0aGlzLT5maXJzdF9hc3NpZ25tZW50ID09IGN1cnJlbnRfYXNzaWdubWVudCkgeworICAgICAgLyogVGhpcyBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSBSSFMgb2YgYW4KKyAgICAgICAqIGFzc2lnbm1lbnQgd2hlcmUgaXQgaXMgYWxzbyBpbiB0aGUgTEhTLgorICAgICAgICovCisgICAgICB0aGlzLT5yZWFkX2JlZm9yZV93cml0ZSA9IHRydWU7CisgICB9Cit9CisKKworbG9vcF9zdGF0ZTo6bG9vcF9zdGF0ZSgpCit7CisgICB0aGlzLT5odCA9IGhhc2hfdGFibGVfY3RvcigwLCBoYXNoX3RhYmxlX3BvaW50ZXJfaGFzaCwKKwkJCSAgICAgIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKTsKKyAgIHRoaXMtPm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgIHRoaXMtPmxvb3BfZm91bmQgPSBmYWxzZTsKK30KKworCitsb29wX3N0YXRlOjp+bG9vcF9zdGF0ZSgpCit7CisgICBoYXNoX3RhYmxlX2R0b3IodGhpcy0+aHQpOworICAgcmFsbG9jX2ZyZWUodGhpcy0+bWVtX2N0eCk7Cit9CisKKworbG9vcF92YXJpYWJsZV9zdGF0ZSAqCitsb29wX3N0YXRlOjppbnNlcnQoaXJfbG9vcCAqaXIpCit7CisgICBsb29wX3ZhcmlhYmxlX3N0YXRlICpscyA9IG5ldyh0aGlzLT5tZW1fY3R4KSBsb29wX3ZhcmlhYmxlX3N0YXRlOworCisgICBoYXNoX3RhYmxlX2luc2VydCh0aGlzLT5odCwgbHMsIGlyKTsKKyAgIHRoaXMtPmxvb3BfZm91bmQgPSB0cnVlOworCisgICByZXR1cm4gbHM7Cit9CisKKworbG9vcF92YXJpYWJsZV9zdGF0ZSAqCitsb29wX3N0YXRlOjpnZXQoY29uc3QgaXJfbG9vcCAqaXIpCit7CisgICByZXR1cm4gKGxvb3BfdmFyaWFibGVfc3RhdGUgKikgaGFzaF90YWJsZV9maW5kKHRoaXMtPmh0LCBpcik7Cit9CisKKworbG9vcF92YXJpYWJsZSAqCitsb29wX3ZhcmlhYmxlX3N0YXRlOjpnZXQoY29uc3QgaXJfdmFyaWFibGUgKmlyKQoreworICAgcmV0dXJuIChsb29wX3ZhcmlhYmxlICopIGhhc2hfdGFibGVfZmluZCh0aGlzLT52YXJfaGFzaCwgaXIpOworfQorCisKK2xvb3BfdmFyaWFibGUgKgorbG9vcF92YXJpYWJsZV9zdGF0ZTo6aW5zZXJ0KGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX3BhcmVudCh0aGlzKTsKKyAgIGxvb3BfdmFyaWFibGUgKmx2ID0gcnphbGxvYyhtZW1fY3R4LCBsb29wX3ZhcmlhYmxlKTsKKworICAgbHYtPnZhciA9IHZhcjsKKworICAgaGFzaF90YWJsZV9pbnNlcnQodGhpcy0+dmFyX2hhc2gsIGx2LCBsdi0+dmFyKTsKKyAgIHRoaXMtPnZhcmlhYmxlcy5wdXNoX3RhaWwobHYpOworCisgICByZXR1cm4gbHY7Cit9CisKKworbG9vcF90ZXJtaW5hdG9yICoKK2xvb3BfdmFyaWFibGVfc3RhdGU6Omluc2VydChpcl9pZiAqaWZfc3RtdCkKK3sKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KHRoaXMpOworICAgbG9vcF90ZXJtaW5hdG9yICp0ID0gbmV3KG1lbV9jdHgpIGxvb3BfdGVybWluYXRvcigpOworCisgICB0LT5pciA9IGlmX3N0bXQ7CisgICB0aGlzLT50ZXJtaW5hdG9ycy5wdXNoX3RhaWwodCk7CisKKyAgIHJldHVybiB0OworfQorCisKKy8qKgorICogSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGFscmVhZHkgaXMgcmVjb3JkZWQgaW4gdGhlIHN0YXRlIGZvciB0aGlzIGxvb3AsCisgKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbG9vcF92YXJpYWJsZSBvYmplY3QgdGhhdCByZWNvcmRzIGluZm9ybWF0aW9uCisgKiBhYm91dCBpdC4KKyAqCisgKiBPdGhlcndpc2UsIGNyZWF0ZSBhIG5ldyBsb29wX3ZhcmlhYmxlIG9iamVjdCB0byByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHRoZSB2YXJpYWJsZSwgYW5kIHNldCBpdHMgXGMgcmVhZF9iZWZvcmVfd3JpdGUgZmllbGQgYXBwcm9wcmlhdGVseSBiYXNlZCBvbgorICogXGMgaW5fYXNzaWduZWUuCisgKgorICogXGFyZyBpbl9hc3NpZ25lZSBpcyB0cnVlIGlmIHRoaXMgdmFyaWFibGUgd2FzIGVuY291bnRlcmVkIG9uIHRoZSBMSFMgb2YgYW4KKyAqIGFzc2lnbm1lbnQuCisgKi8KK2xvb3BfdmFyaWFibGUgKgorbG9vcF92YXJpYWJsZV9zdGF0ZTo6Z2V0X29yX2luc2VydChpcl92YXJpYWJsZSAqdmFyLCBib29sIGluX2Fzc2lnbmVlKQoreworICAgbG9vcF92YXJpYWJsZSAqbHYgPSB0aGlzLT5nZXQodmFyKTsKKworICAgaWYgKGx2ID09IE5VTEwpIHsKKyAgICAgIGx2ID0gdGhpcy0+aW5zZXJ0KHZhcik7CisgICAgICBsdi0+cmVhZF9iZWZvcmVfd3JpdGUgPSAhaW5fYXNzaWduZWU7CisgICB9CisKKyAgIHJldHVybiBsdjsKK30KKworCituYW1lc3BhY2UgeworCitjbGFzcyBsb29wX2FuYWx5c2lzIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxvb3BfYW5hbHlzaXMobG9vcF9zdGF0ZSAqbG9vcHMpOworCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2xvb3BfanVtcCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfY2FsbCAqKTsKKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9sb29wICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9sb29wICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9pZiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfaWYgKik7CisKKyAgIGxvb3Bfc3RhdGUgKmxvb3BzOworCisgICBpbnQgaWZfc3RhdGVtZW50X2RlcHRoOworCisgICBpcl9hc3NpZ25tZW50ICpjdXJyZW50X2Fzc2lnbm1lbnQ7CisKKyAgIGV4ZWNfbGlzdCBzdGF0ZTsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitsb29wX2FuYWx5c2lzOjpsb29wX2FuYWx5c2lzKGxvb3Bfc3RhdGUgKmxvb3BzKQorICAgOiBsb29wcyhsb29wcyksIGlmX3N0YXRlbWVudF9kZXB0aCgwKSwgY3VycmVudF9hc3NpZ25tZW50KE5VTEwpCit7CisgICAvKiBlbXB0eSAqLworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb29wX2FuYWx5c2lzOjp2aXNpdChpcl9sb29wX2p1bXAgKmlyKQoreworICAgKHZvaWQpIGlyOworCisgICBhc3NlcnQoIXRoaXMtPnN0YXRlLmlzX2VtcHR5KCkpOworCisgICBsb29wX3ZhcmlhYmxlX3N0YXRlICpjb25zdCBscyA9CisgICAgICAobG9vcF92YXJpYWJsZV9zdGF0ZSAqKSB0aGlzLT5zdGF0ZS5nZXRfaGVhZCgpOworCisgICBscy0+bnVtX2xvb3BfanVtcHMrKzsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb29wX2FuYWx5c2lzOjp2aXNpdF9lbnRlcihpcl9jYWxsICopCit7CisgICAvKiBNYXJrIGV2ZXJ5IGxvb3AgdGhhdCB3ZSdyZSBjdXJyZW50bHkgYW5hbHl6aW5nIGFzIGNvbnRhaW5pbmcgYW4gaXJfY2FsbAorICAgICogKGV2ZW4gdGhvc2UgYXQgb3V0ZXIgbmVzdGluZyBsZXZlbHMpLgorICAgICovCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPnN0YXRlKSB7CisgICAgICBsb29wX3ZhcmlhYmxlX3N0YXRlICpjb25zdCBscyA9IChsb29wX3ZhcmlhYmxlX3N0YXRlICopIG5vZGU7CisgICAgICBscy0+Y29udGFpbnNfY2FsbHMgPSB0cnVlOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2xvb3BfYW5hbHlzaXM6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIC8qIElmIHdlJ3JlIG5vdCBzb21ld2hlcmUgaW5zaWRlIGEgbG9vcCwgdGhlcmUncyBub3RoaW5nIHRvIGRvLgorICAgICovCisgICBpZiAodGhpcy0+c3RhdGUuaXNfZW1wdHkoKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgYm9vbCBuZXN0ZWQgPSBmYWxzZTsKKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5zdGF0ZSkgeworICAgICAgbG9vcF92YXJpYWJsZV9zdGF0ZSAqY29uc3QgbHMgPSAobG9vcF92YXJpYWJsZV9zdGF0ZSAqKSBub2RlOworCisgICAgICBpcl92YXJpYWJsZSAqdmFyID0gaXItPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgICAgIGxvb3BfdmFyaWFibGUgKmx2ID0gbHMtPmdldF9vcl9pbnNlcnQodmFyLCB0aGlzLT5pbl9hc3NpZ25lZSk7CisKKyAgICAgIGx2LT5yZWNvcmRfcmVmZXJlbmNlKHRoaXMtPmluX2Fzc2lnbmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkIHx8IHRoaXMtPmlmX3N0YXRlbWVudF9kZXB0aCA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQpOworICAgICAgbmVzdGVkID0gdHJ1ZTsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworbG9vcF9hbmFseXNpczo6dmlzaXRfZW50ZXIoaXJfbG9vcCAqaXIpCit7CisgICBsb29wX3ZhcmlhYmxlX3N0YXRlICpscyA9IHRoaXMtPmxvb3BzLT5pbnNlcnQoaXIpOworICAgdGhpcy0+c3RhdGUucHVzaF9oZWFkKGxzKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworbG9vcF9hbmFseXNpczo6dmlzaXRfbGVhdmUoaXJfbG9vcCAqaXIpCit7CisgICBsb29wX3ZhcmlhYmxlX3N0YXRlICpjb25zdCBscyA9CisgICAgICAobG9vcF92YXJpYWJsZV9zdGF0ZSAqKSB0aGlzLT5zdGF0ZS5wb3BfaGVhZCgpOworCisgICAvKiBGdW5jdGlvbiBjYWxscyBtYXkgY29udGFpbiBzaWRlIGVmZmVjdHMuICBUaGVzZSBjb3VsZCBhbHRlciBhbnkgb2Ygb3VyCisgICAgKiB2YXJpYWJsZXMgaW4gd2F5cyB0aGF0IGNhbm5vdCBiZSBrbm93biwgYW5kIG1heSBldmVuIHRlcm1pbmF0ZSBzaGFkZXIKKyAgICAqIGV4ZWN1dGlvbiAoc2F5LCBjYWxsaW5nIGRpc2NhcmQgaW4gdGhlIGZyYWdtZW50IHNoYWRlcikuICBTbyB3ZSBjYW4ndAorICAgICogcmVseSBvbiBhbnkgb2Ygb3VyIGFuYWx5c2lzIGFib3V0IGFzc2lnbm1lbnRzIHRvIHZhcmlhYmxlcy4KKyAgICAqCisgICAgKiBXZSBjb3VsZCBwZXJmb3JtIHNvbWUgY29uc2VydmF0aXZlIGFuYWx5c2lzIChwcm92ZSB0aGVyZSdzIG5vIHN0YXRpY2FsbHkKKyAgICAqIHBvc3NpYmxlIGFzc2lnbm1lbnQsIGV0Yy4pIGJ1dCBpdCBpc24ndCB3b3J0aCBpdCBmb3Igbm93OyBmdW5jdGlvbgorICAgICogaW5saW5pbmcgd2lsbCBhbGxvdyB1cyB0byB1bnJvbGwgbG9vcHMgYW55d2F5LgorICAgICovCisgICBpZiAobHMtPmNvbnRhaW5zX2NhbGxzKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJmlyLT5ib2R5X2luc3RydWN0aW9ucykgeworICAgICAgLyogU2tpcCBvdmVyIGRlY2xhcmF0aW9ucyBhdCB0aGUgc3RhcnQgb2YgYSBsb29wLgorICAgICAgICovCisgICAgICBpZiAoKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKSkKKwkgY29udGludWU7CisKKyAgICAgIGlyX2lmICppZl9zdG10ID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfaWYoKTsKKworICAgICAgaWYgKChpZl9zdG10ICE9IE5VTEwpICYmIGlzX2xvb3BfdGVybWluYXRvcihpZl9zdG10KSkKKwkgbHMtPmluc2VydChpZl9zdG10KTsKKyAgICAgIGVsc2UKKwkgYnJlYWs7CisgICB9CisKKworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgJmxzLT52YXJpYWJsZXMpIHsKKyAgICAgIGxvb3BfdmFyaWFibGUgKmx2ID0gKGxvb3BfdmFyaWFibGUgKikgbm9kZTsKKworICAgICAgLyogTW92ZSB2YXJpYWJsZXMgdGhhdCBhcmUgYWxyZWFkeSBtYXJrZWQgYXMgYmVpbmcgbG9vcCBjb25zdGFudCB0bworICAgICAgICogYSBzZXBhcmF0ZSBsaXN0LiAgVGhlc2UgdHJpdmlhbGx5IGRvbid0IG5lZWQgdG8gYmUgdGVzdGVkLgorICAgICAgICovCisgICAgICBpZiAobHYtPmlzX2xvb3BfY29uc3RhbnQoKSkgeworCSBsdi0+cmVtb3ZlKCk7CisJIGxzLT5jb25zdGFudHMucHVzaF90YWlsKGx2KTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogRWFjaCB2YXJpYWJsZSBhc3NpZ25lZCBpbiB0aGUgbG9vcCB0aGF0IGlzbid0IGFscmVhZHkgbWFya2VkIGFzIGJlaW5nIGxvb3AKKyAgICAqIGNvbnN0YW50IG1pZ2h0IHN0aWxsIGJlIGxvb3AgY29uc3RhbnQuICBUaGUgcmVxdWlyZW1lbnRzIGF0IHRoaXMgcG9pbnQKKyAgICAqIGFyZToKKyAgICAqCisgICAgKiAgICAtIFZhcmlhYmxlIGlzIHdyaXR0ZW4gYmVmb3JlIGl0IGlzIHJlYWQuCisgICAgKgorICAgICogICAgLSBPbmx5IG9uZSBhc3NpZ25tZW50IHRvIHRoZSB2YXJpYWJsZS4KKyAgICAqCisgICAgKiAgICAtIEFsbCBvcGVyYW5kcyBvbiB0aGUgUkhTIG9mIHRoZSBhc3NpZ25tZW50IGFyZSBhbHNvIGxvb3AgY29uc3RhbnRzLgorICAgICoKKyAgICAqIFRoZSBsYXN0IHJlcXVpcmVtZW50IGlzIHRoZSByZWFzb24gZm9yIHRoZSBwcm9ncmVzcyBsb29wLiAgQSB2YXJpYWJsZQorICAgICogbWFya2VkIGFzIGEgbG9vcCBjb25zdGFudCBvbiBvbmUgcGFzcyBtYXkgYWxsb3cgb3RoZXIgdmFyaWFibGVzIHRvIGJlCisgICAgKiBtYXJrZWQgYXMgbG9vcCBjb25zdGFudCBvbiBmb2xsb3dpbmcgcGFzc2VzLgorICAgICovCisgICBib29sIHByb2dyZXNzOworICAgZG8geworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgJmxzLT52YXJpYWJsZXMpIHsKKwkgbG9vcF92YXJpYWJsZSAqbHYgPSAobG9vcF92YXJpYWJsZSAqKSBub2RlOworCisJIGlmIChsdi0+Y29uZGl0aW9uYWxfb3JfbmVzdGVkX2Fzc2lnbm1lbnQgfHwgKGx2LT5udW1fYXNzaWdubWVudHMgPiAxKSkKKwkgICAgY29udGludWU7CisKKwkgLyogUHJvY2VzcyB0aGUgUkhTIG9mIHRoZSBhc3NpZ25tZW50LiAgSWYgYWxsIG9mIHRoZSB2YXJpYWJsZXMKKwkgICogYWNjZXNzZWQgdGhlcmUgYXJlIGxvb3AgY29uc3RhbnRzLCB0aGVuIGFkZCB0aGlzCisJICAqLworCSBpcl9ydmFsdWUgKmNvbnN0IHJocyA9IGx2LT5maXJzdF9hc3NpZ25tZW50LT5yaHM7CisJIGlmIChhbGxfZXhwcmVzc2lvbl9vcGVyYW5kc19hcmVfbG9vcF9jb25zdGFudChyaHMsIGxzLT52YXJfaGFzaCkpIHsKKwkgICAgbHYtPnJoc19jbGVhbiA9IHRydWU7CisKKwkgICAgaWYgKGx2LT5pc19sb29wX2NvbnN0YW50KCkpIHsKKwkgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworCisJICAgICAgIGx2LT5yZW1vdmUoKTsKKwkgICAgICAgbHMtPmNvbnN0YW50cy5wdXNoX3RhaWwobHYpOworCSAgICB9CisJIH0KKyAgICAgIH0KKyAgIH0gd2hpbGUgKHByb2dyZXNzKTsKKworICAgLyogVGhlIHJlbWFpbmluZyB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IGxvb3AgaW52YXJpYW50IG1pZ2h0IGJlIGxvb3AKKyAgICAqIGluZHVjdGlvbiB2YXJpYWJsZXMuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsICZscy0+dmFyaWFibGVzKSB7CisgICAgICBsb29wX3ZhcmlhYmxlICpsdiA9IChsb29wX3ZhcmlhYmxlICopIG5vZGU7CisKKyAgICAgIC8qIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYXNzaWdubWVudCB0byBhIHZhcmlhYmxlLCBpdCBjYW5ub3QgYmUgYQorICAgICAgICogbG9vcCBpbmR1Y3Rpb24gdmFyaWFibGUuICBUaGlzIGlzbid0IHN0cmljdGx5IHRydWUsIGJ1dCB0aGlzIGlzIGEKKyAgICAgICAqIHZlcnkgc2ltcGxlIGluZHVjdGlvbiB2YXJpYWJsZSBkZXRlY3RvciwgYW5kIGl0IGNhbid0IGhhbmRsZSBtb3JlCisgICAgICAgKiBjb21wbGV4IGNhc2VzLgorICAgICAgICovCisgICAgICBpZiAobHYtPm51bV9hc3NpZ25tZW50cyA+IDEpCisJIGNvbnRpbnVlOworCisgICAgICAvKiBBbGwgb2YgdGhlIHZhcmlhYmxlcyB3aXRoIHplcm8gYXNzaWdubWVudHMgaW4gdGhlIGxvb3AgYXJlIGxvb3AKKyAgICAgICAqIGludmFyaWFudCwgYW5kIHRoZXkgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGZpbHRlcmVkIG91dC4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KGx2LT5udW1fYXNzaWdubWVudHMgPT0gMSk7CisgICAgICBhc3NlcnQobHYtPmZpcnN0X2Fzc2lnbm1lbnQgIT0gTlVMTCk7CisKKyAgICAgIC8qIFRoZSBhc3NpZ25tZW50IHRvIHRoZSB2YXJpYWJsZSBpbiB0aGUgbG9vcCBtdXN0IGJlIHVuY29uZGl0aW9uYWwgYW5kCisgICAgICAgKiBub3QgaW5zaWRlIGEgbmVzdGVkIGxvb3AuCisgICAgICAgKi8KKyAgICAgIGlmIChsdi0+Y29uZGl0aW9uYWxfb3JfbmVzdGVkX2Fzc2lnbm1lbnQpCisJIGNvbnRpbnVlOworCisgICAgICAvKiBCYXNpYyBsb29wIGluZHVjdGlvbiB2YXJpYWJsZXMgaGF2ZSBhIHNpbmdsZSBhc3NpZ25tZW50IGluIHRoZSBsb29wCisgICAgICAgKiB0aGF0IGhhcyB0aGUgZm9ybSAnVkFSID0gVkFSICsgaScgb3IgJ1ZBUiA9IFZBUiAtIGknIHdoZXJlIGkgaXMgYQorICAgICAgICogbG9vcCBpbnZhcmlhbnQuCisgICAgICAgKi8KKyAgICAgIGlyX3J2YWx1ZSAqY29uc3QgaW5jID0KKwkgZ2V0X2Jhc2ljX2luZHVjdGlvbl9pbmNyZW1lbnQobHYtPmZpcnN0X2Fzc2lnbm1lbnQsIGxzLT52YXJfaGFzaCk7CisgICAgICBpZiAoaW5jICE9IE5VTEwpIHsKKwkgbHYtPmluY3JlbWVudCA9IGluYzsKKworCSBsdi0+cmVtb3ZlKCk7CisJIGxzLT5pbmR1Y3Rpb25fdmFyaWFibGVzLnB1c2hfdGFpbChsdik7CisgICAgICB9CisgICB9CisKKyAgIC8qIFNlYXJjaCB0aGUgbG9vcCB0ZXJtaW5hdGluZyBjb25kaXRpb25zIGZvciB0aG9zZSBvZiB0aGUgZm9ybSAnaSA8IGMnCisgICAgKiB3aGVyZSBpIGlzIGEgbG9vcCBpbmR1Y3Rpb24gdmFyaWFibGUsIGMgaXMgYSBjb25zdGFudCwgYW5kIDwgaXMgYW55CisgICAgKiByZWxhdGl2ZSBvcGVyYXRvci4gIEZyb20gZWFjaCBvZiB0aGVzZSB3ZSBjYW4gaW5mZXIgYW4gaXRlcmF0aW9uIGNvdW50LgorICAgICogQWxzbyBmaWd1cmUgb3V0IHdoaWNoIHRlcm1pbmF0b3IgKGlmIGFueSkgcHJvZHVjZXMgdGhlIHNtYWxsZXN0CisgICAgKiBpdGVyYXRpb24gY291bnQtLXRoaXMgaXMgdGhlIGxpbWl0aW5nIHRlcm1pbmF0b3IuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmbHMtPnRlcm1pbmF0b3JzKSB7CisgICAgICBsb29wX3Rlcm1pbmF0b3IgKnQgPSAobG9vcF90ZXJtaW5hdG9yICopIG5vZGU7CisgICAgICBpcl9pZiAqaWZfc3RtdCA9IHQtPmlyOworCisgICAgICAvKiBJZi1zdGF0ZW1lbnRzIGNhbiBiZSBlaXRoZXIgJ2lmIChleHByKScgb3IgJ2lmIChkZXJlZiknLiAgV2Ugb25seSBjYXJlCisgICAgICAgKiBhYm91dCB0aGUgZm9ybWVyIGhlcmUuCisgICAgICAgKi8KKyAgICAgIGlyX2V4cHJlc3Npb24gKmNvbmQgPSBpZl9zdG10LT5jb25kaXRpb24tPmFzX2V4cHJlc3Npb24oKTsKKyAgICAgIGlmIChjb25kID09IE5VTEwpCisJIGNvbnRpbnVlOworCisgICAgICBzd2l0Y2ggKGNvbmQtPm9wZXJhdGlvbikgeworICAgICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgICAgY2FzZSBpcl9iaW5vcF9ncmVhdGVyOgorICAgICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisgICAgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDogeworCSAvKiBUaGUgZXhwcmVzc2lvbnMgdGhhdCB3ZSBjYXJlIGFib3V0IHdpbGwgZWl0aGVyIGJlIG9mIHRoZSBmb3JtCisJICAqICdjb3VudGVyIDwgbGltaXQnIG9yICdsaW1pdCA8IGNvdW50ZXInLiAgRmlndXJlIG91dCB3aGljaCBpcworCSAgKiB3aGljaC4KKwkgICovCisJIGlyX3J2YWx1ZSAqY291bnRlciA9IGNvbmQtPm9wZXJhbmRzWzBdLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworCSBpcl9jb25zdGFudCAqbGltaXQgPSBjb25kLT5vcGVyYW5kc1sxXS0+YXNfY29uc3RhbnQoKTsKKwkgZW51bSBpcl9leHByZXNzaW9uX29wZXJhdGlvbiBjbXAgPSBjb25kLT5vcGVyYXRpb247CisKKwkgaWYgKGxpbWl0ID09IE5VTEwpIHsKKwkgICAgY291bnRlciA9IGNvbmQtPm9wZXJhbmRzWzFdLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworCSAgICBsaW1pdCA9IGNvbmQtPm9wZXJhbmRzWzBdLT5hc19jb25zdGFudCgpOworCisJICAgIHN3aXRjaCAoY21wKSB7CisJICAgIGNhc2UgaXJfYmlub3BfbGVzczogICAgY21wID0gaXJfYmlub3BfZ3JlYXRlcjsgYnJlYWs7CisJICAgIGNhc2UgaXJfYmlub3BfZ3JlYXRlcjogY21wID0gaXJfYmlub3BfbGVzczsgICAgYnJlYWs7CisJICAgIGNhc2UgaXJfYmlub3BfbGVxdWFsOiAgY21wID0gaXJfYmlub3BfZ2VxdWFsOyAgYnJlYWs7CisJICAgIGNhc2UgaXJfYmlub3BfZ2VxdWFsOiAgY21wID0gaXJfYmlub3BfbGVxdWFsOyAgYnJlYWs7CisJICAgIGRlZmF1bHQ6IGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisJICAgIH0KKwkgfQorCisJIGlmICgoY291bnRlciA9PSBOVUxMKSB8fCAobGltaXQgPT0gTlVMTCkpCisJICAgIGJyZWFrOworCisJIGlyX3ZhcmlhYmxlICp2YXIgPSBjb3VudGVyLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisKKwkgaXJfcnZhbHVlICppbml0ID0gZmluZF9pbml0aWFsX3ZhbHVlKGlyLCB2YXIpOworCisgICAgICAgICBsb29wX3ZhcmlhYmxlICpsdiA9IGxzLT5nZXQodmFyKTsKKyAgICAgICAgIGlmIChsdiAhPSBOVUxMICYmIGx2LT5pc19pbmR1Y3Rpb25fdmFyKCkpIHsKKyAgICAgICAgICAgIHQtPml0ZXJhdGlvbnMgPSBjYWxjdWxhdGVfaXRlcmF0aW9ucyhpbml0LCBsaW1pdCwgbHYtPmluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXApOworCisgICAgICAgICAgICBpZiAodC0+aXRlcmF0aW9ucyA+PSAwICYmCisgICAgICAgICAgICAgICAgKGxzLT5saW1pdGluZ190ZXJtaW5hdG9yID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgdC0+aXRlcmF0aW9ucyA8IGxzLT5saW1pdGluZ190ZXJtaW5hdG9yLT5pdGVyYXRpb25zKSkgeworICAgICAgICAgICAgICAgbHMtPmxpbWl0aW5nX3Rlcm1pbmF0b3IgPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworbG9vcF9hbmFseXNpczo6dmlzaXRfZW50ZXIoaXJfaWYgKmlyKQoreworICAgKHZvaWQpIGlyOworCisgICBpZiAoIXRoaXMtPnN0YXRlLmlzX2VtcHR5KCkpCisgICAgICB0aGlzLT5pZl9zdGF0ZW1lbnRfZGVwdGgrKzsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworbG9vcF9hbmFseXNpczo6dmlzaXRfbGVhdmUoaXJfaWYgKmlyKQoreworICAgKHZvaWQpIGlyOworCisgICBpZiAoIXRoaXMtPnN0YXRlLmlzX2VtcHR5KCkpCisgICAgICB0aGlzLT5pZl9zdGF0ZW1lbnRfZGVwdGgtLTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworbG9vcF9hbmFseXNpczo6dmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICAvKiBJZiB3ZSdyZSBub3Qgc29tZXdoZXJlIGluc2lkZSBhIGxvb3AsIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KKyAgICAqLworICAgaWYgKHRoaXMtPnN0YXRlLmlzX2VtcHR5KCkpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7CisKKyAgIHRoaXMtPmN1cnJlbnRfYXNzaWdubWVudCA9IGlyOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb29wX2FuYWx5c2lzOjp2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIC8qIFNpbmNlIHRoZSB2aXNpdF9lbnRlciBleGl0cyB3aXRoIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50IGZvciB0aGlzCisgICAgKiBjYXNlLCB0aGUgbG9vcCBzdGF0ZSBzdGFjayBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaGVyZS4KKyAgICAqLworICAgYXNzZXJ0KCF0aGlzLT5zdGF0ZS5pc19lbXB0eSgpKTsKKworICAgYXNzZXJ0KHRoaXMtPmN1cnJlbnRfYXNzaWdubWVudCA9PSBpcik7CisgICB0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQgPSBOVUxMOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworY2xhc3MgZXhhbWluZV9yaHMgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgZXhhbWluZV9yaHMoaGFzaF90YWJsZSAqbG9vcF92YXJpYWJsZXMpCisgICB7CisgICAgICB0aGlzLT5vbmx5X3VzZXNfbG9vcF9jb25zdGFudHMgPSB0cnVlOworICAgICAgdGhpcy0+bG9vcF92YXJpYWJsZXMgPSBsb29wX3ZhcmlhYmxlczsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqaXIpCisgICB7CisgICAgICBsb29wX3ZhcmlhYmxlICpsdiA9CisJIChsb29wX3ZhcmlhYmxlICopIGhhc2hfdGFibGVfZmluZCh0aGlzLT5sb29wX3ZhcmlhYmxlcywgaXItPnZhcik7CisKKyAgICAgIGFzc2VydChsdiAhPSBOVUxMKTsKKworICAgICAgaWYgKGx2LT5pc19sb29wX2NvbnN0YW50KCkpIHsKKwkgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKwkgdGhpcy0+b25seV91c2VzX2xvb3BfY29uc3RhbnRzID0gZmFsc2U7CisJIHJldHVybiB2aXNpdF9zdG9wOworICAgICAgfQorICAgfQorCisgICBoYXNoX3RhYmxlICpsb29wX3ZhcmlhYmxlczsKKyAgIGJvb2wgb25seV91c2VzX2xvb3BfY29uc3RhbnRzOworfTsKKworCitib29sCithbGxfZXhwcmVzc2lvbl9vcGVyYW5kc19hcmVfbG9vcF9jb25zdGFudChpcl9ydmFsdWUgKmlyLCBoYXNoX3RhYmxlICp2YXJpYWJsZXMpCit7CisgICBleGFtaW5lX3JocyB2KHZhcmlhYmxlcyk7CisKKyAgIGlyLT5hY2NlcHQoJnYpOworCisgICByZXR1cm4gdi5vbmx5X3VzZXNfbG9vcF9jb25zdGFudHM7Cit9CisKKworaXJfcnZhbHVlICoKK2dldF9iYXNpY19pbmR1Y3Rpb25faW5jcmVtZW50KGlyX2Fzc2lnbm1lbnQgKmlyLCBoYXNoX3RhYmxlICp2YXJfaGFzaCkKK3sKKyAgIC8qIFRoZSBSSFMgbXVzdCBiZSBhIGJpbmFyeSBleHByZXNzaW9uLgorICAgICovCisgICBpcl9leHByZXNzaW9uICpjb25zdCByaHMgPSBpci0+cmhzLT5hc19leHByZXNzaW9uKCk7CisgICBpZiAoKHJocyA9PSBOVUxMKQorICAgICAgIHx8ICgocmhzLT5vcGVyYXRpb24gIT0gaXJfYmlub3BfYWRkKQorCSAgICYmIChyaHMtPm9wZXJhdGlvbiAhPSBpcl9iaW5vcF9zdWIpKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBPbmUgb2YgdGhlIG9mIG9wZXJhbmRzIG9mIHRoZSBleHByZXNzaW9uIG11c3QgYmUgdGhlIHZhcmlhYmxlIGFzc2lnbmVkLgorICAgICogSWYgdGhlIG9wZXJhdGlvbiBpcyBzdWJ0cmFjdGlvbiwgdGhlIHZhcmlhYmxlIGluIHF1ZXN0aW9uIG11c3QgYmUgdGhlCisgICAgKiAibGVmdCIgb3BlcmFuZC4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IGlyLT5saHMtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKworICAgaXJfdmFyaWFibGUgKmNvbnN0IG9wMCA9IHJocy0+b3BlcmFuZHNbMF0tPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCBvcDEgPSByaHMtPm9wZXJhbmRzWzFdLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisKKyAgIGlmICgoKG9wMCAhPSB2YXIpICYmIChvcDEgIT0gdmFyKSkKKyAgICAgICB8fCAoKG9wMSA9PSB2YXIpICYmIChyaHMtPm9wZXJhdGlvbiA9PSBpcl9iaW5vcF9zdWIpKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpcl9ydmFsdWUgKmluYyA9IChvcDAgPT0gdmFyKSA/IHJocy0+b3BlcmFuZHNbMV0gOiByaHMtPm9wZXJhbmRzWzBdOworCisgICBpZiAoaW5jLT5hc19jb25zdGFudCgpID09IE5VTEwpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCBpbmNfdmFyID0gaW5jLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisgICAgICBpZiAoaW5jX3ZhciAhPSBOVUxMKSB7CisJIGxvb3BfdmFyaWFibGUgKmx2ID0KKwkgICAgKGxvb3BfdmFyaWFibGUgKikgaGFzaF90YWJsZV9maW5kKHZhcl9oYXNoLCBpbmNfdmFyKTsKKworCSBpZiAoIWx2LT5pc19sb29wX2NvbnN0YW50KCkpCisJICAgIGluYyA9IE5VTEw7CisgICAgICB9IGVsc2UKKwkgaW5jID0gTlVMTDsKKyAgIH0KKworICAgaWYgKChpbmMgIT0gTlVMTCkgJiYgKHJocy0+b3BlcmF0aW9uID09IGlyX2Jpbm9wX3N1YikpIHsKKyAgICAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KGlyKTsKKworICAgICAgaW5jID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9uZWcsCisJCQkJICAgICAgIGluYy0+dHlwZSwKKwkJCQkgICAgICAgaW5jLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKwkJCQkgICAgICAgTlVMTCk7CisgICB9CisKKyAgIHJldHVybiBpbmM7Cit9CisKKworLyoqCisgKiBEZXRlY3Qgd2hldGhlciBhbiBpZi1zdGF0ZW1lbnQgaXMgYSBsb29wIHRlcm1pbmF0aW5nIGNvbmRpdGlvbgorICoKKyAqIERldGVjdHMgaWYtc3RhdGVtZW50cyBvZiB0aGUgZm9ybQorICoKKyAqICAoaWYgKGV4cHJlc3Npb24gYm9vbCAuLi4pIChicmVhaykpCisgKi8KK2Jvb2wKK2lzX2xvb3BfdGVybWluYXRvcihpcl9pZiAqaXIpCit7CisgICBpZiAoIWlyLT5lbHNlX2luc3RydWN0aW9ucy5pc19lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgaW5zdCA9CisgICAgICAoaXJfaW5zdHJ1Y3Rpb24gKikgaXItPnRoZW5faW5zdHJ1Y3Rpb25zLmdldF9oZWFkKCk7CisgICBpZiAoaW5zdCA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpZiAoaW5zdC0+aXJfdHlwZSAhPSBpcl90eXBlX2xvb3BfanVtcCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaXJfbG9vcF9qdW1wICpjb25zdCBqdW1wID0gKGlyX2xvb3BfanVtcCAqKSBpbnN0OworICAgaWYgKGp1bXAtPm1vZGUgIT0gaXJfbG9vcF9qdW1wOjpqdW1wX2JyZWFrKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworCitsb29wX3N0YXRlICoKK2FuYWx5emVfbG9vcF92YXJpYWJsZXMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBsb29wX3N0YXRlICpsb29wcyA9IG5ldyBsb29wX3N0YXRlOworICAgbG9vcF9hbmFseXNpcyB2KGxvb3BzKTsKKworICAgdi5ydW4oaW5zdHJ1Y3Rpb25zKTsKKyAgIHJldHVybiB2Lmxvb3BzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb29wX2FuYWx5c2lzLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvb3BfYW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVkYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb29wX2FuYWx5c2lzLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIExPT1BfQU5BTFlTSVNfSAorI2RlZmluZSBMT09QX0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisKKy8qKgorICogQW5hbHl6ZSBhbmQgY2xhc3NpZnkgYWxsIHZhcmlhYmxlcyB1c2VkIGluIGFsbCBsb29wcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gbGlzdAorICovCitleHRlcm4gY2xhc3MgbG9vcF9zdGF0ZSAqCithbmFseXplX2xvb3BfdmFyaWFibGVzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKKworCisvKioKKyAqIEZpbGwgaW4gbG9vcCBjb250cm9sIGZpZWxkcworICoKKyAqIEJhc2VkIG9uIGFuYWx5c2lzIG9mIGxvb3AgdmFyaWFibGVzLCB0aGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJlbW92ZQorICogcmVkdW5kYW50IHNlcXVlbmNlcyBpbiB0aGUgbG9vcCBvZiB0aGUgZm9ybQorICoKKyAqICAoaWYgKGV4cHJlc3Npb24gYm9vbCAuLi4pIChicmVhaykpCisgKgorICogRm9yIGV4YW1wbGUsIGlmIGl0IGlzIHByb3ZhYmxlIHRoYXQgb25lIGxvb3AgZXhpdCBjb25kaXRpb24gd2lsbAorICogYWx3YXlzIGJlIHNhdGlzZmllZCBiZWZvcmUgYW5vdGhlciwgdGhlIHVubmVjZXNzYXJ5IGV4aXQgY29uZGl0aW9uIHdpbGwgYmUKKyAqIHJlbW92ZWQuCisgKi8KK2V4dGVybiBib29sCitzZXRfbG9vcF9jb250cm9scyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywgbG9vcF9zdGF0ZSAqbHMpOworCisKK2V4dGVybiBib29sCit1bnJvbGxfbG9vcHMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGxvb3Bfc3RhdGUgKmxzLAorICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucyAqb3B0aW9ucyk7CisKK2lyX3J2YWx1ZSAqCitmaW5kX2luaXRpYWxfdmFsdWUoaXJfbG9vcCAqbG9vcCwgaXJfdmFyaWFibGUgKnZhcik7CisKK2ludAorY2FsY3VsYXRlX2l0ZXJhdGlvbnMoaXJfcnZhbHVlICpmcm9tLCBpcl9ydmFsdWUgKnRvLCBpcl9ydmFsdWUgKmluY3JlbWVudCwKKwkJICAgICBlbnVtIGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG9wKTsKKworCisvKioKKyAqIFRyYWNraW5nIGZvciBhbGwgdmFyaWFibGVzIHVzZWQgaW4gYSBsb29wCisgKi8KK2NsYXNzIGxvb3BfdmFyaWFibGVfc3RhdGUgOiBwdWJsaWMgZXhlY19ub2RlIHsKK3B1YmxpYzoKKyAgIGNsYXNzIGxvb3BfdmFyaWFibGUgKmdldChjb25zdCBpcl92YXJpYWJsZSAqKTsKKyAgIGNsYXNzIGxvb3BfdmFyaWFibGUgKmluc2VydChpcl92YXJpYWJsZSAqKTsKKyAgIGNsYXNzIGxvb3BfdmFyaWFibGUgKmdldF9vcl9pbnNlcnQoaXJfdmFyaWFibGUgKiwgYm9vbCBpbl9hc3NpZ25lZSk7CisgICBjbGFzcyBsb29wX3Rlcm1pbmF0b3IgKmluc2VydChpcl9pZiAqKTsKKworCisgICAvKioKKyAgICAqIFZhcmlhYmxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNsYXNzaWZpZWQKKyAgICAqLworICAgZXhlY19saXN0IHZhcmlhYmxlczsKKworICAgLyoqCisgICAgKiBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIGFyZSBjb25zdGFudCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIGxvb3AKKyAgICAqCisgICAgKiBUaGlzIGxpc3QgY29udGFpbnMgXGMgbG9vcF92YXJpYWJsZSBvYmplY3RzLgorICAgICovCisgICBleGVjX2xpc3QgY29uc3RhbnRzOworCisgICAvKioKKyAgICAqIEluZHVjdGlvbiB2YXJpYWJsZXMgZm9yIHRoaXMgbG9vcAorICAgICoKKyAgICAqIFRoaXMgbGlzdCBjb250YWlucyBcYyBsb29wX3ZhcmlhYmxlIG9iamVjdHMuCisgICAgKi8KKyAgIGV4ZWNfbGlzdCBpbmR1Y3Rpb25fdmFyaWFibGVzOworCisgICAvKioKKyAgICAqIFNpbXBsZSBpZi1zdGF0ZW1lbnRzIHRoYXQgbGVhZCB0byB0aGUgdGVybWluYXRpb24gb2YgdGhlIGxvb3AKKyAgICAqCisgICAgKiBUaGlzIGxpc3QgY29udGFpbnMgXGMgbG9vcF90ZXJtaW5hdG9yIG9iamVjdHMuCisgICAgKgorICAgICogXHNhIGlzX2xvb3BfdGVybWluYXRvcgorICAgICovCisgICBleGVjX2xpc3QgdGVybWluYXRvcnM7CisKKyAgIC8qKgorICAgICogSWYgYW55IG9mIHRoZSB0ZXJtaW5hdG9ycyBpbiBcYyB0ZXJtaW5hdG9ycyBsZWFkcyB0byB0ZXJtaW5hdGlvbiBvZiB0aGUKKyAgICAqIGxvb3AgYWZ0ZXIgYSBjb25zdGFudCBudW1iZXIgb2YgaXRlcmF0aW9ucywgdGhpcyBpcyB0aGUgdGVybWluYXRvciB0aGF0CisgICAgKiBsZWFkcyB0byB0ZXJtaW5hdGlvbiBhZnRlciB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuICBPdGhlcndpc2UKKyAgICAqIE5VTEwuCisgICAgKi8KKyAgIGxvb3BfdGVybWluYXRvciAqbGltaXRpbmdfdGVybWluYXRvcjsKKworICAgLyoqCisgICAgKiBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYWxsIHZhcmlhYmxlcyBhY2Nlc3NlZCBpbiB0aGlzIGxvb3AKKyAgICAqLworICAgaGFzaF90YWJsZSAqdmFyX2hhc2g7CisKKyAgIC8qKgorICAgICogTnVtYmVyIG9mIGlyX2xvb3BfanVtcCBpbnN0cnVjdGlvbnMgdGhhdCBvcGVyYXRlIG9uIHRoaXMgbG9vcAorICAgICovCisgICB1bnNpZ25lZCBudW1fbG9vcF9qdW1wczsKKworICAgLyoqCisgICAgKiBXaGV0aGVyIHRoaXMgbG9vcCBjb250YWlucyBhbnkgZnVuY3Rpb24gY2FsbHMuCisgICAgKi8KKyAgIGJvb2wgY29udGFpbnNfY2FsbHM7CisKKyAgIGxvb3BfdmFyaWFibGVfc3RhdGUoKQorICAgeworICAgICAgdGhpcy0+bnVtX2xvb3BfanVtcHMgPSAwOworICAgICAgdGhpcy0+Y29udGFpbnNfY2FsbHMgPSBmYWxzZTsKKyAgICAgIHRoaXMtPnZhcl9oYXNoID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfcG9pbnRlcl9oYXNoLAorCQkJCSAgICAgICBoYXNoX3RhYmxlX3BvaW50ZXJfY29tcGFyZSk7CisgICAgICB0aGlzLT5saW1pdGluZ190ZXJtaW5hdG9yID0gTlVMTDsKKyAgIH0KKworICAgfmxvb3BfdmFyaWFibGVfc3RhdGUoKQorICAgeworICAgICAgaGFzaF90YWJsZV9kdG9yKHRoaXMtPnZhcl9oYXNoKTsKKyAgIH0KKworICAgc3RhdGljIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgdm9pZCAqY3R4KQorICAgeworICAgICAgdm9pZCAqbHZzID0gcmFsbG9jX3NpemUoY3R4LCBzaXplKTsKKyAgICAgIGFzc2VydChsdnMgIT0gTlVMTCk7CisKKyAgICAgIHJhbGxvY19zZXRfZGVzdHJ1Y3RvcihsdnMsICh2b2lkICgqKSh2b2lkKikpIGRlc3RydWN0b3IpOworCisgICAgICByZXR1cm4gbHZzOworICAgfQorCitwcml2YXRlOgorICAgc3RhdGljIHZvaWQKKyAgIGRlc3RydWN0b3IobG9vcF92YXJpYWJsZV9zdGF0ZSAqbHZzKQorICAgeworICAgICAgbHZzLT5+bG9vcF92YXJpYWJsZV9zdGF0ZSgpOworICAgfQorfTsKKworCitjbGFzcyBsb29wX3ZhcmlhYmxlIDogcHVibGljIGV4ZWNfbm9kZSB7CitwdWJsaWM6CisgICAvKiogVGhlIHZhcmlhYmxlIGluIHF1ZXN0aW9uLiAqLworICAgaXJfdmFyaWFibGUgKnZhcjsKKworICAgLyoqIElzIHRoZSB2YXJpYWJsZSByZWFkIGluIHRoZSBsb29wIGJlZm9yZSBpdCBpcyB3cml0dGVuPyAqLworICAgYm9vbCByZWFkX2JlZm9yZV93cml0ZTsKKworICAgLyoqIEFyZSBhbGwgdmFyaWFibGVzIGluIHRoZSBSSFMgb2YgdGhlIGFzc2lnbm1lbnQgbG9vcCBjb25zdGFudHM/ICovCisgICBib29sIHJoc19jbGVhbjsKKworICAgLyoqCisgICAgKiBJcyB0aGVyZSBhbiBhc3NpZ25tZW50IHRvIHRoZSB2YXJpYWJsZSB0aGF0IGlzIGNvbmRpdGlvbmFsLCBvciBpbnNpZGUgYQorICAgICogbmVzdGVkIGxvb3A/CisgICAgKi8KKyAgIGJvb2wgY29uZGl0aW9uYWxfb3JfbmVzdGVkX2Fzc2lnbm1lbnQ7CisKKyAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGFzc2lnbm1lbnQgdG8gdGhlIHZhcmlhYmxlIGluIHRoZSBsb29wIGJvZHkuICovCisgICBpcl9hc3NpZ25tZW50ICpmaXJzdF9hc3NpZ25tZW50OworCisgICAvKiogTnVtYmVyIG9mIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZSBpbiB0aGUgbG9vcCBib2R5LiAqLworICAgdW5zaWduZWQgbnVtX2Fzc2lnbm1lbnRzOworCisgICAvKioKKyAgICAqIEluY3JlbWVudCB2YWx1ZSBmb3IgYSBsb29wIGluZHVjdGlvbiB2YXJpYWJsZQorICAgICoKKyAgICAqIElmIHRoaXMgaXMgYSBsb29wIGluZHVjdGlvbiB2YXJpYWJsZSwgdGhlIGFtb3VudCBieSB3aGljaCB0aGUgdmFyaWFibGUKKyAgICAqIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uIHRocm91Z2ggdGhlIGxvb3AuCisgICAgKgorICAgICogSWYgdGhpcyBpcyBub3QgYSBsb29wIGluZHVjdGlvbiB2YXJpYWJsZSwgTlVMTC4KKyAgICAqLworICAgaXJfcnZhbHVlICppbmNyZW1lbnQ7CisKKworICAgaW5saW5lIGJvb2wgaXNfaW5kdWN0aW9uX3ZhcigpIGNvbnN0CisgICB7CisgICAgICAvKiBJbmR1Y3Rpb24gdmFyaWFibGVzIGFsd2F5cyBoYXZlIGEgbm9uLW51bGwgaW5jcmVtZW50LCBhbmQgdmljZQorICAgICAgICogdmVyc2EuCisgICAgICAgKi8KKyAgICAgIHJldHVybiB0aGlzLT5pbmNyZW1lbnQgIT0gTlVMTDsKKyAgIH0KKworCisgICBpbmxpbmUgYm9vbCBpc19sb29wX2NvbnN0YW50KCkgY29uc3QKKyAgIHsKKyAgICAgIGNvbnN0IGJvb2wgaXNfY29uc3QgPSAodGhpcy0+bnVtX2Fzc2lnbm1lbnRzID09IDApCisJIHx8ICgodGhpcy0+bnVtX2Fzc2lnbm1lbnRzID09IDEpCisJICAgICAmJiAhdGhpcy0+Y29uZGl0aW9uYWxfb3JfbmVzdGVkX2Fzc2lnbm1lbnQKKwkgICAgICYmICF0aGlzLT5yZWFkX2JlZm9yZV93cml0ZQorCSAgICAgJiYgdGhpcy0+cmhzX2NsZWFuKTsKKworICAgICAgLyogSWYgdGhlIFJIUyBvZiAqdGhlKiBhc3NpZ25tZW50IGlzIGNsZWFuLCB0aGVuIHRoZXJlIG11c3QgYmUgZXhhY3RseQorICAgICAgICogb25lIGFzc2lnbm1lbnQgb2YgdGhlIHZhcmlhYmxlLgorICAgICAgICovCisgICAgICBhc3NlcnQoKHRoaXMtPnJoc19jbGVhbiAmJiAodGhpcy0+bnVtX2Fzc2lnbm1lbnRzID09IDEpKQorCSAgICAgfHwgIXRoaXMtPnJoc19jbGVhbik7CisKKyAgICAgIC8qIFZhcmlhYmxlcyB0aGF0IGFyZSBtYXJrZWQgcmVhZC1vbmx5ICpNVVNUKiBiZSBsb29wIGNvbnN0YW50LgorICAgICAgICovCisgICAgICBhc3NlcnQoIXRoaXMtPnZhci0+ZGF0YS5yZWFkX29ubHkKKyAgICAgICAgICAgIHx8ICh0aGlzLT52YXItPmRhdGEucmVhZF9vbmx5ICYmIGlzX2NvbnN0KSk7CisKKyAgICAgIHJldHVybiBpc19jb25zdDsKKyAgIH0KKworICAgdm9pZCByZWNvcmRfcmVmZXJlbmNlKGJvb2wgaW5fYXNzaWduZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb25kaXRpb25hbF9jb2RlX29yX25lc3RlZF9sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlyX2Fzc2lnbm1lbnQgKmN1cnJlbnRfYXNzaWdubWVudCk7Cit9OworCisKK2NsYXNzIGxvb3BfdGVybWluYXRvciA6IHB1YmxpYyBleGVjX25vZGUgeworcHVibGljOgorICAgbG9vcF90ZXJtaW5hdG9yKCkKKyAgICAgIDogaXIoTlVMTCksIGl0ZXJhdGlvbnMoLTEpCisgICB7CisgICB9CisKKyAgIC8qKgorICAgICogU3RhdGVtZW50IHdoaWNoIHRlcm1pbmF0ZXMgdGhlIGxvb3AuCisgICAgKi8KKyAgIGlyX2lmICppcjsKKworICAgLyoqCisgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYWZ0ZXIgd2hpY2ggdGhlIHRlcm1pbmF0b3IgaXMga25vd24gdG8KKyAgICAqIHRlcm1pbmF0ZSB0aGUgbG9vcCAoaWYgdGhhdCBpcyBhIGZpeGVkIHZhbHVlKS4gIE90aGVyd2lzZSAtMS4KKyAgICAqLworICAgaW50IGl0ZXJhdGlvbnM7Cit9OworCisKK2NsYXNzIGxvb3Bfc3RhdGUgeworcHVibGljOgorICAgfmxvb3Bfc3RhdGUoKTsKKworICAgLyoqCisgICAgKiBHZXQgdGhlIGxvb3AgdmFyaWFibGUgc3RhdGUgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGxvb3AKKyAgICAqLworICAgbG9vcF92YXJpYWJsZV9zdGF0ZSAqZ2V0KGNvbnN0IGlyX2xvb3AgKik7CisKKyAgIGxvb3BfdmFyaWFibGVfc3RhdGUgKmluc2VydChpcl9sb29wICppcik7CisKKyAgIGJvb2wgbG9vcF9mb3VuZDsKKworcHJpdmF0ZToKKyAgIGxvb3Bfc3RhdGUoKTsKKworICAgLyoqCisgICAgKiBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYWxsIGxvb3BzIHRoYXQgaGF2ZSBiZWVuIGFuYWx5emVkLgorICAgICovCisgICBoYXNoX3RhYmxlICpodDsKKworICAgdm9pZCAqbWVtX2N0eDsKKworICAgZnJpZW5kIGxvb3Bfc3RhdGUgKmFuYWx5emVfbG9vcF92YXJpYWJsZXMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworfTsKKworI2VuZGlmIC8qIExPT1BfQU5BTFlTSVNfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb29wX2NvbnRyb2xzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG9vcF9jb250cm9scy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiMDZhZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG9vcF9jb250cm9scy5jcHAKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAibWFpbi9jb21waWxlci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJsb29wX2FuYWx5c2lzLmgiCisjaW5jbHVkZSAiaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IuaCIKKworLyoqCisgKiBGaW5kIGFuIGluaXRpYWxpemVyIG9mIGEgdmFyaWFibGUgb3V0c2lkZSBhIGxvb3AKKyAqCisgKiBXb3JrcyBiYWNrd2FyZHMgZnJvbSB0aGUgbG9vcCB0byBmaW5kIHRoZSBwcmUtbG9vcCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgKiBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB0byBmaW5kIHRoZSBpbml0aWFsIHZhbHVlIG9mIGxvb3AgaW5kdWN0aW9uCisgKiB2YXJpYWJsZXMuCisgKgorICogXHBhcmFtIGxvb3AgIExvb3Agd2hlcmUgXGMgdmFyIGlzIGFuIGluZHVjdGlvbiB2YXJpYWJsZQorICogXHBhcmFtIHZhciAgIFZhcmlhYmxlIHdob3NlIGluaXRpYWxpemVyIGlzIHRvIGJlIGZvdW5kCisgKgorICogXHJldHVybgorICogVGhlIFxjIGlyX3J2YWx1ZSBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGUgb3V0c2lkZSB0aGUgbG9vcC4gIE1heSByZXR1cm4KKyAqIFxjIE5VTEwgaWYgbm8gaW5pdGlhbGl6ZXIgY2FuIGJlIGZvdW5kLgorICovCitpcl9ydmFsdWUgKgorZmluZF9pbml0aWFsX3ZhbHVlKGlyX2xvb3AgKmxvb3AsIGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICBmb3IgKGV4ZWNfbm9kZSAqbm9kZSA9IGxvb3AtPnByZXY7CisJIW5vZGUtPmlzX2hlYWRfc2VudGluZWwoKTsKKwlub2RlID0gbm9kZS0+cHJldikgeworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmlyID0gKGlyX2luc3RydWN0aW9uICopIG5vZGU7CisKKyAgICAgIHN3aXRjaCAoaXItPmlyX3R5cGUpIHsKKyAgICAgIGNhc2UgaXJfdHlwZV9jYWxsOgorICAgICAgY2FzZSBpcl90eXBlX2xvb3A6CisgICAgICBjYXNlIGlyX3R5cGVfbG9vcF9qdW1wOgorICAgICAgY2FzZSBpcl90eXBlX3JldHVybjoKKyAgICAgIGNhc2UgaXJfdHlwZV9pZjoKKwkgcmV0dXJuIE5VTEw7CisKKyAgICAgIGNhc2UgaXJfdHlwZV9mdW5jdGlvbjoKKyAgICAgIGNhc2UgaXJfdHlwZV9mdW5jdGlvbl9zaWduYXR1cmU6CisJIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisJIHJldHVybiBOVUxMOworCisgICAgICBjYXNlIGlyX3R5cGVfYXNzaWdubWVudDogeworCSBpcl9hc3NpZ25tZW50ICphc3NpZ24gPSBpci0+YXNfYXNzaWdubWVudCgpOworCSBpcl92YXJpYWJsZSAqYXNzaWduZWUgPSBhc3NpZ24tPmxocy0+d2hvbGVfdmFyaWFibGVfcmVmZXJlbmNlZCgpOworCisJIGlmIChhc3NpZ25lZSA9PSB2YXIpCisJICAgIHJldHVybiAoYXNzaWduLT5jb25kaXRpb24gIT0gTlVMTCkgPyBOVUxMIDogYXNzaWduLT5yaHM7CisKKwkgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisJIGJyZWFrOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gTlVMTDsKK30KKworCitpbnQKK2NhbGN1bGF0ZV9pdGVyYXRpb25zKGlyX3J2YWx1ZSAqZnJvbSwgaXJfcnZhbHVlICp0bywgaXJfcnZhbHVlICppbmNyZW1lbnQsCisJCSAgICAgZW51bSBpcl9leHByZXNzaW9uX29wZXJhdGlvbiBvcCkKK3sKKyAgIGlmIChmcm9tID09IE5VTEwgfHwgdG8gPT0gTlVMTCB8fCBpbmNyZW1lbnQgPT0gTlVMTCkKKyAgICAgIHJldHVybiAtMTsKKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworCisgICBpcl9leHByZXNzaW9uICpjb25zdCBzdWIgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3Bfc3ViLCBmcm9tLT50eXBlLCB0bywgZnJvbSk7CisKKyAgIGlyX2V4cHJlc3Npb24gKmNvbnN0IGRpdiA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9kaXYsIHN1Yi0+dHlwZSwgc3ViLCBpbmNyZW1lbnQpOworCisgICBpcl9jb25zdGFudCAqaXRlciA9IGRpdi0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworCisgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgcmV0dXJuIC0xOworCisgICBpZiAoIWl0ZXItPnR5cGUtPmlzX2ludGVnZXIoKSkgeworICAgICAgaXJfcnZhbHVlICpjYXN0ID0KKwkgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9mMmksIGdsc2xfdHlwZTo6aW50X3R5cGUsIGl0ZXIsCisJCQkJICAgIE5VTEwpOworCisgICAgICBpdGVyID0gY2FzdC0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworICAgfQorCisgICBpbnQgaXRlcl92YWx1ZSA9IGl0ZXItPmdldF9pbnRfY29tcG9uZW50KDApOworCisgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgY2FsY3VsYXRlZCBudW1iZXIgb2YgaXRlcmF0aW9ucyBzYXRpc2ZpZXMgdGhlIGV4aXQKKyAgICAqIGNvbmRpdGlvbi4gIFRoaXMgaXMgbmVlZGVkIHRvIGNhdGNoIG9mZi1ieS1vbmUgZXJyb3JzIGFuZCBzb21lIHR5cGVzIG9mCisgICAgKiBpbGwtZm9ybWVkIGxvb3BzLiAgRm9yIGV4YW1wbGUsIHdlIG5lZWQgdG8gZGV0ZWN0IHRoYXQgdGhlIGZvbGxvd2luZworICAgICogbG9vcCBkb2VzIG5vdCBoYXZlIGEgbWF4aW11bSBpdGVyYXRpb24gY291bnQuCisgICAgKgorICAgICogICAgZm9yIChmbG9hdCB4ID0gMC4wOyB4ICE9IDAuOTsgeCArPSAwLjIpCisgICAgKiAgICAgICAgOworICAgICovCisgICBjb25zdCBpbnQgYmlhc1tdID0geyAtMSwgMCwgMSB9OworICAgYm9vbCB2YWxpZF9sb29wID0gZmFsc2U7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBFbGVtZW50cyhiaWFzKTsgaSsrKSB7CisgICAgICBpdGVyID0gKGluY3JlbWVudC0+dHlwZS0+aXNfaW50ZWdlcigpKQorCSA/IG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudChpdGVyX3ZhbHVlICsgYmlhc1tpXSkKKwkgOiBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoZmxvYXQoaXRlcl92YWx1ZSArIGJpYXNbaV0pKTsKKworICAgICAgaXJfZXhwcmVzc2lvbiAqY29uc3QgbXVsID0KKwkgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbXVsLCBpbmNyZW1lbnQtPnR5cGUsIGl0ZXIsCisJCQkJICAgIGluY3JlbWVudCk7CisKKyAgICAgIGlyX2V4cHJlc3Npb24gKmNvbnN0IGFkZCA9CisJIG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX2FkZCwgbXVsLT50eXBlLCBtdWwsIGZyb20pOworCisgICAgICBpcl9leHByZXNzaW9uICpjb25zdCBjbXAgPQorCSBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihvcCwgZ2xzbF90eXBlOjpib29sX3R5cGUsIGFkZCwgdG8pOworCisgICAgICBpcl9jb25zdGFudCAqY29uc3QgY21wX3Jlc3VsdCA9IGNtcC0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworCisgICAgICBhc3NlcnQoY21wX3Jlc3VsdCAhPSBOVUxMKTsKKyAgICAgIGlmIChjbXBfcmVzdWx0LT5nZXRfYm9vbF9jb21wb25lbnQoMCkpIHsKKwkgaXRlcl92YWx1ZSArPSBiaWFzW2ldOworCSB2YWxpZF9sb29wID0gdHJ1ZTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworICAgcmV0dXJuICh2YWxpZF9sb29wKSA/IGl0ZXJfdmFsdWUgOiAtMTsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgbG9vcF9jb250cm9sX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgbG9vcF9jb250cm9sX3Zpc2l0b3IobG9vcF9zdGF0ZSAqc3RhdGUpCisgICB7CisgICAgICB0aGlzLT5zdGF0ZSA9IHN0YXRlOworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9sb29wICppcik7CisKKyAgIGxvb3Bfc3RhdGUgKnN0YXRlOworCisgICBib29sIHByb2dyZXNzOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb29wX2NvbnRyb2xfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfbG9vcCAqaXIpCit7CisgICBsb29wX3ZhcmlhYmxlX3N0YXRlICpjb25zdCBscyA9IHRoaXMtPnN0YXRlLT5nZXQoaXIpOworCisgICAvKiBJZiB3ZSd2ZSBlbnRlcmVkIGEgbG9vcCB0aGF0IGhhc24ndCBiZWVuIGFuYWx5emVkLCBzb21ldGhpbmcgcmVhbGx5LAorICAgICogcmVhbGx5IGJhZCBoYXMgaGFwcGVuZWQuCisgICAgKi8KKyAgIGlmIChscyA9PSBOVUxMKSB7CisgICAgICBhc3NlcnQobHMgIT0gTlVMTCk7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIGlmIChscy0+bGltaXRpbmdfdGVybWluYXRvciAhPSBOVUxMKSB7CisgICAgICAvKiBJZiB0aGUgbGltaXRpbmcgdGVybWluYXRvciBoYXMgYW4gaXRlcmF0aW9uIGNvdW50IG9mIHplcm8sIHRoZW4gd2UndmUKKyAgICAgICAqIHByb3ZlbiB0aGF0IHRoZSBsb29wIGNhbm5vdCBydW4sIHNvIGRlbGV0ZSBpdC4KKyAgICAgICAqLworICAgICAgaW50IGl0ZXJhdGlvbnMgPSBscy0+bGltaXRpbmdfdGVybWluYXRvci0+aXRlcmF0aW9uczsKKyAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgIGlyLT5yZW1vdmUoKTsKKyAgICAgICAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogUmVtb3ZlIHRoZSBjb25kaXRpb25hbCBicmVhayBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbGwgdGVybWluYXRvcnMKKyAgICAqIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGZpeGVkIGl0ZXJhdGlvbiBjb3VudCwgZXhjZXB0IGZvciB0aGUgb25lCisgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbWl0aW5nIHRlcm1pbmF0b3ItLXRoYXQgb25lIG5lZWRzIHRvIHN0YXksIHNpbmNlCisgICAgKiBpdCB0ZXJtaW5hdGVzIHRoZSBsb29wLiAgRXhjZXB0aW9uOiBpZiB0aGUgbG9vcCBzdGlsbCBoYXMgYSBub3JtYXRpdmUKKyAgICAqIGJvdW5kLCB0aGVuIHRoYXQgdGVybWluYXRlcyB0aGUgbG9vcCwgc28gd2UgZG9uJ3QgZXZlbiBuZWVkIHRoZSBsaW1pdGluZworICAgICogdGVybWluYXRvci4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG5vZGUsICZscy0+dGVybWluYXRvcnMpIHsKKyAgICAgIGxvb3BfdGVybWluYXRvciAqdCA9IChsb29wX3Rlcm1pbmF0b3IgKikgbm9kZTsKKworICAgICAgaWYgKHQtPml0ZXJhdGlvbnMgPCAwKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICh0ICE9IGxzLT5saW1pdGluZ190ZXJtaW5hdG9yKSB7CisgICAgICAgICB0LT5pci0+cmVtb3ZlKCk7CisKKyAgICAgICAgIGFzc2VydChscy0+bnVtX2xvb3BfanVtcHMgPiAwKTsKKyAgICAgICAgIGxzLT5udW1fbG9vcF9qdW1wcy0tOworCisgICAgICAgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworCitib29sCitzZXRfbG9vcF9jb250cm9scyhleGVjX2xpc3QgKmluc3RydWN0aW9ucywgbG9vcF9zdGF0ZSAqbHMpCit7CisgICBsb29wX2NvbnRyb2xfdmlzaXRvciB2KGxzKTsKKworICAgdi5ydW4oaW5zdHJ1Y3Rpb25zKTsKKworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvb3BfdW5yb2xsLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG9vcF91bnJvbGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTRkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvb3BfdW5yb2xsLmNwcApAQCAtMCwwICsxLDM1NSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAibG9vcF9hbmFseXNpcy5oIgorI2luY2x1ZGUgImlyX2hpZXJhcmNoaWNhbF92aXNpdG9yLmgiCisKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBsb29wX3Vucm9sbF92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxvb3BfdW5yb2xsX3Zpc2l0b3IobG9vcF9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucyAqb3B0aW9ucykKKyAgIHsKKyAgICAgIHRoaXMtPnN0YXRlID0gc3RhdGU7CisgICAgICB0aGlzLT5wcm9ncmVzcyA9IGZhbHNlOworICAgICAgdGhpcy0+b3B0aW9ucyA9IG9wdGlvbnM7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfbG9vcCAqaXIpOworICAgdm9pZCBzaW1wbGVfdW5yb2xsKGlyX2xvb3AgKmlyLCBpbnQgaXRlcmF0aW9ucyk7CisgICB2b2lkIGNvbXBsZXhfdW5yb2xsKGlyX2xvb3AgKmlyLCBpbnQgaXRlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250aW51ZV9mcm9tX3RoZW5fYnJhbmNoKTsKKyAgIHZvaWQgc3BsaWNlX3Bvc3RfaWZfaW5zdHJ1Y3Rpb25zKGlyX2lmICppcl9pZiwgZXhlY19saXN0ICpzcGxpY2VfZGVzdCk7CisKKyAgIGxvb3Bfc3RhdGUgKnN0YXRlOworCisgICBib29sIHByb2dyZXNzOworICAgY29uc3Qgc3RydWN0IGdsX3NoYWRlcl9jb21waWxlcl9vcHRpb25zICpvcHRpb25zOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK3N0YXRpYyBib29sCitpc19icmVhayhpcl9pbnN0cnVjdGlvbiAqaXIpCit7CisgICByZXR1cm4gaXIgIT0gTlVMTCAmJiBpci0+aXJfdHlwZSA9PSBpcl90eXBlX2xvb3BfanVtcAorCQkgICAgICYmICgoaXJfbG9vcF9qdW1wICopIGlyKS0+aXNfYnJlYWsoKTsKK30KKworY2xhc3MgbG9vcF91bnJvbGxfY291bnQgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaW50IG5vZGVzOworICAgLyogSWYgdGhlcmUgYXJlIG5lc3RlZCBsb29wcywgdGhlIG5vZGUgY291bnQgd2lsbCBiZSBpbmFjY3VyYXRlLiAqLworICAgYm9vbCBuZXN0ZWRfbG9vcDsKKworICAgbG9vcF91bnJvbGxfY291bnQoZXhlY19saXN0ICpsaXN0KQorICAgeworICAgICAgbm9kZXMgPSAwOworICAgICAgbmVzdGVkX2xvb3AgPSBmYWxzZTsKKworICAgICAgcnVuKGxpc3QpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2Fzc2lnbm1lbnQgKikKKyAgIHsKKyAgICAgIG5vZGVzKys7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZXhwcmVzc2lvbiAqKQorICAgeworICAgICAgbm9kZXMrKzsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9sb29wICopCisgICB7CisgICAgICBuZXN0ZWRfbG9vcCA9IHRydWU7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9Cit9OworCisKKy8qKgorICogVW5yb2xsIGEgbG9vcCB3aGljaCBkb2VzIG5vdCBjb250YWluIGFueSBqdW1wcy4gIEZvciBleGFtcGxlLCBpZiB0aGUgaW5wdXQKKyAqIGlzOgorICoKKyAqICAgICAobG9vcCAoLi4uKSAuLi5pbnN0cnMuLi4pCisgKgorICogQW5kIHRoZSBpdGVyYXRpb24gY291bnQgaXMgMywgdGhlIG91dHB1dCB3aWxsIGJlOgorICoKKyAqICAgICAuLi5pbnN0cnMuLi4gLi4uaW5zdHJzLi4uIC4uLmluc3Rycy4uLgorICovCit2b2lkCitsb29wX3Vucm9sbF92aXNpdG9yOjpzaW1wbGVfdW5yb2xsKGlyX2xvb3AgKmlyLCBpbnQgaXRlcmF0aW9ucykKK3sKKyAgIHZvaWQgKmNvbnN0IG1lbV9jdHggPSByYWxsb2NfcGFyZW50KGlyKTsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgIGV4ZWNfbGlzdCBjb3B5X2xpc3Q7CisKKyAgICAgIGNvcHlfbGlzdC5tYWtlX2VtcHR5KCk7CisgICAgICBjbG9uZV9pcl9saXN0KG1lbV9jdHgsICZjb3B5X2xpc3QsICZpci0+Ym9keV9pbnN0cnVjdGlvbnMpOworCisgICAgICBpci0+aW5zZXJ0X2JlZm9yZSgmY29weV9saXN0KTsKKyAgIH0KKworICAgLyogVGhlIGxvb3AgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHVucm9sbGVkIGNvcGllcy4gIFJlbW92ZSB0aGUgb3JpZ2luYWwKKyAgICAqIGxvb3AgZnJvbSB0aGUgSVIgc2VxdWVuY2UuCisgICAgKi8KKyAgIGlyLT5yZW1vdmUoKTsKKworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworfQorCisKKy8qKgorICogVW5yb2xsIGEgbG9vcCB3aG9zZSBsYXN0IHN0YXRlbWVudCBpcyBhbiBpcl9pZi4gIElmIFxjCisgKiBjb250aW51ZV9mcm9tX3RoZW5fYnJhbmNoIGlzIHRydWUsIHRoZSBsb29wIGlzIHJlcGVhdGVkIG9ubHkgd2hlbiB0aGUKKyAqICJ0aGVuIiBicmFuY2ggb2YgdGhlIGlmIGlzIHRha2VuOyBvdGhlcndpc2UgaXQgaXMgcmVwZWF0ZWQgb25seSB3aGVuIHRoZQorICogImVsc2UiIGJyYW5jaCBvZiB0aGUgaWYgaXMgdGFrZW4uCisgKgorICogRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnB1dCBpczoKKyAqCisgKiAgICAgKGxvb3AgKC4uLikKKyAqICAgICAgLi4uYm9keS4uLgorICogICAgICAoaWYgKGNvbmQpCisgKiAgICAgICAgICAoLi4udGhlbl9pbnN0cnMuLi4pCisgKiAgICAgICAgKC4uLmVsc2VfaW5zdHJzLi4uKSkpCisgKgorICogQW5kIHRoZSBpdGVyYXRpb24gY291bnQgaXMgMywgYW5kIFxjIGNvbnRpbnVlX2Zyb21fdGhlbl9icmFuY2ggaXMgdHJ1ZSwKKyAqIHRoZW4gdGhlIG91dHB1dCB3aWxsIGJlOgorICoKKyAqICAgICAuLi5ib2R5Li4uCisgKiAgICAgKGlmIChjb25kKQorICogICAgICAgICAoLi4udGhlbl9pbnN0cnMuLi4KKyAqICAgICAgICAgIC4uLmJvZHkuLi4KKyAqICAgICAgICAgIChpZiAoY29uZCkKKyAqICAgICAgICAgICAgICAoLi4udGhlbl9pbnN0cnMuLi4KKyAqICAgICAgICAgICAgICAgLi4uYm9keS4uLgorICogICAgICAgICAgICAgICAoaWYgKGNvbmQpCisgKiAgICAgICAgICAgICAgICAgICAoLi4udGhlbl9pbnN0cnMuLi4pCisgKiAgICAgICAgICAgICAgICAgKC4uLmVsc2VfaW5zdHJzLi4uKSkpCisgKiAgICAgICAgICAgICguLi5lbHNlX2luc3Rycy4uLikpKQorICogICAgICAgKC4uLmVsc2VfaW5zdHJzKSkKKyAqLwordm9pZAorbG9vcF91bnJvbGxfdmlzaXRvcjo6Y29tcGxleF91bnJvbGwoaXJfbG9vcCAqaXIsIGludCBpdGVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250aW51ZV9mcm9tX3RoZW5fYnJhbmNoKQoreworICAgdm9pZCAqY29uc3QgbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworICAgaXJfaW5zdHJ1Y3Rpb24gKmlyX3RvX3JlcGxhY2UgPSBpcjsKKworICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgIGV4ZWNfbGlzdCBjb3B5X2xpc3Q7CisKKyAgICAgIGNvcHlfbGlzdC5tYWtlX2VtcHR5KCk7CisgICAgICBjbG9uZV9pcl9saXN0KG1lbV9jdHgsICZjb3B5X2xpc3QsICZpci0+Ym9keV9pbnN0cnVjdGlvbnMpOworCisgICAgICBpcl9pZiAqaXJfaWYgPSAoKGlyX2luc3RydWN0aW9uICopIGNvcHlfbGlzdC5nZXRfdGFpbCgpKS0+YXNfaWYoKTsKKyAgICAgIGFzc2VydChpcl9pZiAhPSBOVUxMKTsKKworICAgICAgaXJfdG9fcmVwbGFjZS0+aW5zZXJ0X2JlZm9yZSgmY29weV9saXN0KTsKKyAgICAgIGlyX3RvX3JlcGxhY2UtPnJlbW92ZSgpOworCisgICAgICAvKiBwbGFjZWhvbGRlciB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBpdGVyYXRpb24gKi8KKyAgICAgIGlyX3RvX3JlcGxhY2UgPQorICAgICAgICAgbmV3KG1lbV9jdHgpIGlyX2xvb3BfanVtcChpcl9sb29wX2p1bXA6Omp1bXBfY29udGludWUpOworCisgICAgICBleGVjX2xpc3QgKmNvbnN0IGxpc3QgPSAoY29udGludWVfZnJvbV90aGVuX2JyYW5jaCkKKyAgICAgICAgID8gJmlyX2lmLT50aGVuX2luc3RydWN0aW9ucyA6ICZpcl9pZi0+ZWxzZV9pbnN0cnVjdGlvbnM7CisKKyAgICAgIGxpc3QtPnB1c2hfdGFpbChpcl90b19yZXBsYWNlKTsKKyAgIH0KKworICAgaXJfdG9fcmVwbGFjZS0+cmVtb3ZlKCk7CisKKyAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKK30KKworCisvKioKKyAqIE1vdmUgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgd2hpY2ggZm9sbG93IFxjIGlyX2lmIHRvIHRoZSBlbmQgb2YKKyAqIFxjIHNwbGljZV9kZXN0LgorICoKKyAqIEZvciBleGFtcGxlLCBpbiB0aGUgY29kZSBzbmlwcGV0OgorICoKKyAqICAgICAoaWYgKGNvbmQpCisgKiAgICAgICAgICguLi50aGVuX2luc3RydWN0aW9ucy4uLgorICogICAgICAgICAgYnJlYWspCisgKiAgICAgICAoLi4uZWxzZV9pbnN0cnVjdGlvbnMuLi4pKQorICogICAgIC4uLnBvc3RfaWZfaW5zdHJ1Y3Rpb25zLi4uCisgKgorICogSWYgXGMgaXJfaWYgcG9pbnRzIHRvIHRoZSAiaWYiIGluc3RydWN0aW9uLCBhbmQgXGMgc3BsaWNlX2Rlc3QgcG9pbnRzIHRvCisgKiAoLi4uZWxzZV9pbnN0cnVjdGlvbnMuLi4pLCB0aGUgY29kZSBzbmlwcGV0IGlzIHRyYW5zZm9ybWVkIGludG86CisgKgorICogICAgIChpZiAoY29uZCkKKyAqICAgICAgICAgKC4uLnRoZW5faW5zdHJ1Y3Rpb25zLi4uCisgKiAgICAgICAgICBicmVhaykKKyAqICAgICAgICguLi5lbHNlX2luc3RydWN0aW9ucy4uLgorICogICAgICAgIC4uLnBvc3RfaWZfaW5zdHJ1Y3Rpb25zLi4uKSkKKyAqLwordm9pZAorbG9vcF91bnJvbGxfdmlzaXRvcjo6c3BsaWNlX3Bvc3RfaWZfaW5zdHJ1Y3Rpb25zKGlyX2lmICppcl9pZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjX2xpc3QgKnNwbGljZV9kZXN0KQoreworICAgd2hpbGUgKCFpcl9pZi0+Z2V0X25leHQoKS0+aXNfdGFpbF9zZW50aW5lbCgpKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqbW92ZV9pciA9IChpcl9pbnN0cnVjdGlvbiAqKSBpcl9pZi0+Z2V0X25leHQoKTsKKworICAgICAgbW92ZV9pci0+cmVtb3ZlKCk7CisgICAgICBzcGxpY2VfZGVzdC0+cHVzaF90YWlsKG1vdmVfaXIpOworICAgfQorfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb29wX3Vucm9sbF92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9sb29wICppcikKK3sKKyAgIGxvb3BfdmFyaWFibGVfc3RhdGUgKmNvbnN0IGxzID0gdGhpcy0+c3RhdGUtPmdldChpcik7CisgICBpbnQgaXRlcmF0aW9uczsKKworICAgLyogSWYgd2UndmUgZW50ZXJlZCBhIGxvb3AgdGhhdCBoYXNuJ3QgYmVlbiBhbmFseXplZCwgc29tZXRoaW5nIHJlYWxseSwKKyAgICAqIHJlYWxseSBiYWQgaGFzIGhhcHBlbmVkLgorICAgICovCisgICBpZiAobHMgPT0gTlVMTCkgeworICAgICAgYXNzZXJ0KGxzICE9IE5VTEwpOworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCisgICAvKiBEb24ndCB0cnkgdG8gdW5yb2xsIGxvb3BzIHdoZXJlIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyBub3Qga25vd24KKyAgICAqIGF0IGNvbXBpbGUtdGltZS4KKyAgICAqLworICAgaWYgKGxzLT5saW1pdGluZ190ZXJtaW5hdG9yID09IE5VTEwpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGl0ZXJhdGlvbnMgPSBscy0+bGltaXRpbmdfdGVybWluYXRvci0+aXRlcmF0aW9uczsKKworICAgY29uc3QgaW50IG1heF9pdGVyYXRpb25zID0gb3B0aW9ucy0+TWF4VW5yb2xsSXRlcmF0aW9uczsKKworICAgLyogRG9uJ3QgdHJ5IHRvIHVucm9sbCBsb29wcyB0aGF0IGhhdmUgemlsbGlvbnMgb2YgaXRlcmF0aW9ucyBlaXRoZXIuCisgICAgKi8KKyAgIGlmIChpdGVyYXRpb25zID4gbWF4X2l0ZXJhdGlvbnMpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIC8qIERvbid0IHRyeSB0byB1bnJvbGwgbmVzdGVkIGxvb3BzIGFuZCBsb29wcyB3aXRoIGEgaHVnZSBib2R5LgorICAgICovCisgICBsb29wX3Vucm9sbF9jb3VudCBjb3VudCgmaXItPmJvZHlfaW5zdHJ1Y3Rpb25zKTsKKworICAgaWYgKGNvdW50Lm5lc3RlZF9sb29wIHx8IGNvdW50Lm5vZGVzICogaXRlcmF0aW9ucyA+IG1heF9pdGVyYXRpb25zICogNSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgLyogTm90ZTogdGhlIGxpbWl0aW5nIHRlcm1pbmF0b3IgY29udHJpYnV0ZXMgMSB0byBscy0+bnVtX2xvb3BfanVtcHMuCisgICAgKiBXZSdsbCBiZSByZW1vdmluZyB0aGUgbGltaXRpbmcgdGVybWluYXRvciBiZWZvcmUgd2UgdW5yb2xsLgorICAgICovCisgICBhc3NlcnQobHMtPm51bV9sb29wX2p1bXBzID4gMCk7CisgICB1bnNpZ25lZCBwcmVkaWN0ZWRfbnVtX2xvb3BfanVtcHMgPSBscy0+bnVtX2xvb3BfanVtcHMgLSAxOworCisgICBpZiAocHJlZGljdGVkX251bV9sb29wX2p1bXBzID4gMSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaWYgKHByZWRpY3RlZF9udW1fbG9vcF9qdW1wcyA9PSAwKSB7CisgICAgICBscy0+bGltaXRpbmdfdGVybWluYXRvci0+aXItPnJlbW92ZSgpOworICAgICAgc2ltcGxlX3Vucm9sbChpciwgaXRlcmF0aW9ucyk7CisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIGlyX2luc3RydWN0aW9uICpsYXN0X2lyID0gKGlyX2luc3RydWN0aW9uICopIGlyLT5ib2R5X2luc3RydWN0aW9ucy5nZXRfdGFpbCgpOworICAgYXNzZXJ0KGxhc3RfaXIgIT0gTlVMTCk7CisKKyAgIGlmIChpc19icmVhayhsYXN0X2lyKSkgeworICAgICAgLyogSWYgdGhlIG9ubHkgbG9vcC1qdW1wIGlzIGEgYnJlYWsgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgdGhlIGxvb3AKKyAgICAgICAqIHdpbGwgZXhlY3V0ZSBleGFjdGx5IG9uY2UuICBSZW1vdmUgdGhlIGJyZWFrIGFuZCB1c2UgdGhlIHNpbXBsZQorICAgICAgICogdW5yb2xsZXIgd2l0aCBhbiBpdGVyYXRpb24gY291bnQgb2YgMS4KKyAgICAgICAqLworICAgICAgbGFzdF9pci0+cmVtb3ZlKCk7CisKKyAgICAgIGxzLT5saW1pdGluZ190ZXJtaW5hdG9yLT5pci0+cmVtb3ZlKCk7CisgICAgICBzaW1wbGVfdW5yb2xsKGlyLCAxKTsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgZm9yZWFjaF9saXN0KG5vZGUsICZpci0+Ym9keV9pbnN0cnVjdGlvbnMpIHsKKyAgICAgIC8qIHJlY29nbml6ZSBsb29wcyBpbiB0aGUgZm9ybSBwcm9kdWNlZCBieSBpcl9sb3dlcl9qdW1wcyAqLworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmN1cl9pciA9IChpcl9pbnN0cnVjdGlvbiAqKSBub2RlOworCisgICAgICAvKiBTa2lwIHRoZSBsaW1pdGluZyB0ZXJtaW5hdG9yLCBzaW5jZSBpdCB3aWxsIGdvIGF3YXkgd2hlbiB3ZQorICAgICAgICogdW5yb2xsLgorICAgICAgICovCisgICAgICBpZiAoY3VyX2lyID09IGxzLT5saW1pdGluZ190ZXJtaW5hdG9yLT5pcikKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpcl9pZiAqaXJfaWYgPSBjdXJfaXItPmFzX2lmKCk7CisgICAgICBpZiAoaXJfaWYgIT0gTlVMTCkgeworICAgICAgICAgLyogRGV0ZXJtaW5lIHdoaWNoIGlmLXN0YXRlbWVudCBicmFuY2gsIGlmIGFueSwgZW5kcyB3aXRoIGEKKyAgICAgICAgICAqIGJyZWFrLiAgVGhlIGJyYW5jaCB0aGF0IGRpZCAqbm90KiBoYXZlIHRoZSBicmVhayB3aWxsIGdldCBhCisgICAgICAgICAgKiB0ZW1wb3JhcnkgY29udGludWUgaW5zZXJ0ZWQgaW4gZWFjaCBpdGVyYXRpb24gb2YgdGhlIGxvb3AKKyAgICAgICAgICAqIHVucm9sbC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBOb3RlIHRoYXQgc2luY2UgbHMtPm51bV9sb29wX2p1bXBzIGlzIDw9IDEsIGl0IGlzIGltcG9zc2libGUKKyAgICAgICAgICAqIGZvciBib3RoIGJyYW5jaGVzIHRvIGVuZCB3aXRoIGEgYnJlYWsuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlyX2luc3RydWN0aW9uICppcl9pZl9sYXN0ID0KKyAgICAgICAgICAgIChpcl9pbnN0cnVjdGlvbiAqKSBpcl9pZi0+dGhlbl9pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgICAgICAgaWYgKGlzX2JyZWFrKGlyX2lmX2xhc3QpKSB7CisgICAgICAgICAgICBscy0+bGltaXRpbmdfdGVybWluYXRvci0+aXItPnJlbW92ZSgpOworICAgICAgICAgICAgc3BsaWNlX3Bvc3RfaWZfaW5zdHJ1Y3Rpb25zKGlyX2lmLCAmaXJfaWYtPmVsc2VfaW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgIGlyX2lmX2xhc3QtPnJlbW92ZSgpOworICAgICAgICAgICAgY29tcGxleF91bnJvbGwoaXIsIGl0ZXJhdGlvbnMsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpcl9pZl9sYXN0ID0KKyAgICAgICAgICAgICAgIChpcl9pbnN0cnVjdGlvbiAqKSBpcl9pZi0+ZWxzZV9pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgICAgICAgICAgaWYgKGlzX2JyZWFrKGlyX2lmX2xhc3QpKSB7CisgICAgICAgICAgICAgICBscy0+bGltaXRpbmdfdGVybWluYXRvci0+aXItPnJlbW92ZSgpOworICAgICAgICAgICAgICAgc3BsaWNlX3Bvc3RfaWZfaW5zdHJ1Y3Rpb25zKGlyX2lmLCAmaXJfaWYtPnRoZW5faW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgICAgIGlyX2lmX2xhc3QtPnJlbW92ZSgpOworICAgICAgICAgICAgICAgY29tcGxleF91bnJvbGwoaXIsIGl0ZXJhdGlvbnMsIHRydWUpOworICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBEaWQgbm90IGZpbmQgdGhlIGJyZWFrIHN0YXRlbWVudC4gIEl0IG11c3QgYmUgaW4gYSBjb21wbGV4IGlmLW5lc3RpbmcsCisgICAgKiBzbyBkb24ndCB0cnkgdG8gdW5yb2xsLgorICAgICovCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworYm9vbAordW5yb2xsX2xvb3BzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBsb29wX3N0YXRlICpscywKKyAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfc2hhZGVyX2NvbXBpbGVyX29wdGlvbnMgKm9wdGlvbnMpCit7CisgICBsb29wX3Vucm9sbF92aXNpdG9yIHYobHMsIG9wdGlvbnMpOworCisgICB2LnJ1bihpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfY2xpcF9kaXN0YW5jZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX2NsaXBfZGlzdGFuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjEzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX2NsaXBfZGlzdGFuY2UuY3BwCkBAIC0wLDAgKzEsNTQ5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsb3dlcl9jbGlwX2Rpc3RhbmNlLmNwcAorICoKKyAqIFRoaXMgcGFzcyBhY2NvdW50cyBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgd2F5CisgKiBnbF9DbGlwRGlzdGFuY2UgaXMgZGVjbGFyZWQgaW4gc3RhbmRhcmQgR0xTTCAoYXMgYW4gYXJyYXkgb2YKKyAqIGZsb2F0cyksIGFuZCB0aGUgd2F5IGl0IGlzIGZyZXF1ZW50bHkgaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUgKGFzCisgKiBhIHBhaXIgb2YgdmVjNHMsIHdpdGggZm91ciBjbGlwIGRpc3RhbmNlcyBwYWNrZWQgaW50byBlYWNoKS4KKyAqCisgKiBUaGUgZGVjbGFyYXRpb24gb2YgZ2xfQ2xpcERpc3RhbmNlIGlzIHJlcGxhY2VkIHdpdGggYSBkZWNsYXJhdGlvbgorICogb2YgZ2xfQ2xpcERpc3RhbmNlTUVTQSwgYW5kIGFueSByZWZlcmVuY2VzIHRvIGdsX0NsaXBEaXN0YW5jZSBhcmUKKyAqIHRyYW5zbGF0ZWQgdG8gcmVmZXIgdG8gZ2xfQ2xpcERpc3RhbmNlTUVTQSB3aXRoIHRoZSBhcHByb3ByaWF0ZQorICogc3dpenpsaW5nIG9mIGFycmF5IGluZGljZXMuICBGb3IgaW5zdGFuY2U6CisgKgorICogICBnbF9DbGlwRGlzdGFuY2VbaV0KKyAqCisgKiBpcyB0cmFuc2xhdGVkIGludG86CisgKgorICogICBnbF9DbGlwRGlzdGFuY2VNRVNBW2k+PjJdW2kmM10KKyAqCisgKiBTaW5jZSBzb21lIGhhcmR3YXJlIG1heSBub3QgaW50ZXJuYWxseSByZXByZXNlbnQgZ2xfQ2xpcERpc3RhbmNlIGFzIGEgcGFpcgorICogb2YgdmVjNCdzLCB0aGlzIGxvd2VyaW5nIHBhc3MgaXMgb3B0aW9uYWwuICBUbyBlbmFibGUgaXQsIHNldCB0aGUKKyAqIExvd2VyQ2xpcERpc3RhbmNlIGZsYWcgaW4gZ2xfc2hhZGVyX2NvbXBpbGVyX29wdGlvbnMgdG8gdHJ1ZS4KKyAqLworCisjaW5jbHVkZSAiZ2xzbF9zeW1ib2xfdGFibGUuaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9wcm9nX2luc3RydWN0aW9uLmgiIC8qIEZvciBXUklURU1BU0tfKiAqLworCituYW1lc3BhY2UgeworCitjbGFzcyBsb3dlcl9jbGlwX2Rpc3RhbmNlX3Zpc2l0b3IgOiBwdWJsaWMgaXJfcnZhbHVlX3Zpc2l0b3IgeworcHVibGljOgorICAgZXhwbGljaXQgbG93ZXJfY2xpcF9kaXN0YW5jZV92aXNpdG9yKGdsX3NoYWRlcl9zdGFnZSBzaGFkZXJfc3RhZ2UpCisgICAgICA6IHByb2dyZXNzKGZhbHNlKSwgb2xkX2NsaXBfZGlzdGFuY2VfMWRfdmFyKE5VTEwpLAorICAgICAgICBvbGRfY2xpcF9kaXN0YW5jZV8yZF92YXIoTlVMTCksIG5ld19jbGlwX2Rpc3RhbmNlXzFkX3ZhcihOVUxMKSwKKyAgICAgICAgbmV3X2NsaXBfZGlzdGFuY2VfMmRfdmFyKE5VTEwpLCBzaGFkZXJfc3RhZ2Uoc2hhZGVyX3N0YWdlKQorICAgeworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX3ZhcmlhYmxlICopOworICAgdm9pZCBjcmVhdGVfaW5kaWNlcyhpcl9ydmFsdWUqLCBpcl9ydmFsdWUgKiYsIGlyX3J2YWx1ZSAqJik7CisgICBib29sIGlzX2NsaXBfZGlzdGFuY2VfdmVjOChpcl9ydmFsdWUgKmlyKTsKKyAgIGlyX3J2YWx1ZSAqbG93ZXJfY2xpcF9kaXN0YW5jZV92ZWM4KGlyX3J2YWx1ZSAqaXIpOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICopOworICAgdm9pZCB2aXNpdF9uZXdfYXNzaWdubWVudChpcl9hc3NpZ25tZW50ICppcik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2NhbGwgKik7CisKKyAgIHZpcnR1YWwgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSk7CisKKyAgIHZvaWQgZml4X2xocyhpcl9hc3NpZ25tZW50ICopOworCisgICBib29sIHByb2dyZXNzOworCisgICAvKioKKyAgICAqIFBvaW50ZXIgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIGdsX0NsaXBEaXN0YW5jZSwgaWYgZm91bmQuCisgICAgKgorICAgICogTm90ZToKKyAgICAqCisgICAgKiAtIHRoZSAyZF92YXIgaXMgZm9yIGdlb21ldHJ5IHNoYWRlciBpbnB1dCBvbmx5LgorICAgICoKKyAgICAqIC0gc2luY2UgZ2xfQ2xpcERpc3RhbmNlIGlzIGF2YWlsYWJsZSBpbiBnZW9tZXRyeSBzaGFkZXJzIGFzIGJvdGggYW4KKyAgICAqICAgaW5wdXQgYW5kIGFuIG91dHB1dCwgaXQncyBwb3NzaWJsZSBmb3IgYm90aCBvbGRfY2xpcF9kaXN0YW5jZV8xZF92YXIKKyAgICAqICAgYW5kIG9sZF9jbGlwX2Rpc3RhbmNlXzJkX3ZhciB0byBiZSBub24tbnVsbC4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKm9sZF9jbGlwX2Rpc3RhbmNlXzFkX3ZhcjsKKyAgIGlyX3ZhcmlhYmxlICpvbGRfY2xpcF9kaXN0YW5jZV8yZF92YXI7CisKKyAgIC8qKgorICAgICogUG9pbnRlciB0byB0aGUgbmV3bHktY3JlYXRlZCBnbF9DbGlwRGlzdGFuY2VNRVNBIHZhcmlhYmxlLgorICAgICovCisgICBpcl92YXJpYWJsZSAqbmV3X2NsaXBfZGlzdGFuY2VfMWRfdmFyOworICAgaXJfdmFyaWFibGUgKm5ld19jbGlwX2Rpc3RhbmNlXzJkX3ZhcjsKKworICAgLyoqCisgICAgKiBUeXBlIG9mIHNoYWRlciB3ZSBhcmUgY29tcGlsaW5nIChlLmcuIE1FU0FfU0hBREVSX1ZFUlRFWCkKKyAgICAqLworICAgY29uc3QgZ2xfc2hhZGVyX3N0YWdlIHNoYWRlcl9zdGFnZTsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCisvKioKKyAqIFJlcGxhY2UgYW55IGRlY2xhcmF0aW9uIG9mIGdsX0NsaXBEaXN0YW5jZSBhcyBhbiBhcnJheSBvZiBmbG9hdHMgd2l0aCBhCisgKiBkZWNsYXJhdGlvbiBvZiBnbF9DbGlwRGlzdGFuY2VNRVNBIGFzIGFuIGFycmF5IG9mIHZlYzQncy4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK2xvd2VyX2NsaXBfZGlzdGFuY2VfdmlzaXRvcjo6dmlzaXQoaXJfdmFyaWFibGUgKmlyKQoreworICAgaWYgKCFpci0+bmFtZSB8fCBzdHJjbXAoaXItPm5hbWUsICJnbF9DbGlwRGlzdGFuY2UiKSAhPSAwKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgYXNzZXJ0IChpci0+dHlwZS0+aXNfYXJyYXkoKSk7CisKKyAgIGlmICghaXItPnR5cGUtPmVsZW1lbnRfdHlwZSgpLT5pc19hcnJheSgpKSB7CisgICAgICAvKiAxRCBnbF9DbGlwRGlzdGFuY2UgKHVzZWQgZm9yIHZlcnRleCBhbmQgZ2VvbWV0cnkgb3V0cHV0LCBhbmQgZnJhZ21lbnQKKyAgICAgICAqIGlucHV0KS4KKyAgICAgICAqLworICAgICAgaWYgKHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzFkX3ZhcikKKyAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgICAgdGhpcy0+b2xkX2NsaXBfZGlzdGFuY2VfMWRfdmFyID0gaXI7CisgICAgICBhc3NlcnQgKGlyLT50eXBlLT5lbGVtZW50X3R5cGUoKSA9PSBnbHNsX3R5cGU6OmZsb2F0X3R5cGUpOworICAgICAgdW5zaWduZWQgbmV3X3NpemUgPSAoaXItPnR5cGUtPmFycmF5X3NpemUoKSArIDMpIC8gNDsKKworICAgICAgLyogQ2xvbmUgdGhlIG9sZCB2YXIgc28gdGhhdCB3ZSBpbmhlcml0IGFsbCBvZiBpdHMgcHJvcGVydGllcyAqLworICAgICAgdGhpcy0+bmV3X2NsaXBfZGlzdGFuY2VfMWRfdmFyID0gaXItPmNsb25lKHJhbGxvY19wYXJlbnQoaXIpLCBOVUxMKTsKKworICAgICAgLyogQW5kIGNoYW5nZSB0aGUgcHJvcGVydGllcyB0aGF0IHdlIG5lZWQgdG8gY2hhbmdlICovCisgICAgICB0aGlzLT5uZXdfY2xpcF9kaXN0YW5jZV8xZF92YXItPm5hbWUKKyAgICAgICAgID0gcmFsbG9jX3N0cmR1cCh0aGlzLT5uZXdfY2xpcF9kaXN0YW5jZV8xZF92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdsX0NsaXBEaXN0YW5jZU1FU0EiKTsKKyAgICAgIHRoaXMtPm5ld19jbGlwX2Rpc3RhbmNlXzFkX3Zhci0+dHlwZQorICAgICAgICAgPSBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZShnbHNsX3R5cGU6OnZlYzRfdHlwZSwgbmV3X3NpemUpOworICAgICAgdGhpcy0+bmV3X2NsaXBfZGlzdGFuY2VfMWRfdmFyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MKKyAgICAgICAgID0gaXItPmRhdGEubWF4X2FycmF5X2FjY2VzcyAvIDQ7CisKKyAgICAgIGlyLT5yZXBsYWNlX3dpdGgodGhpcy0+bmV3X2NsaXBfZGlzdGFuY2VfMWRfdmFyKTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiAyRCBnbF9DbGlwRGlzdGFuY2UgKHVzZWQgZm9yIGdlb21ldHJ5IGlucHV0KS4gKi8KKyAgICAgIGFzc2VydChpci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4gJiYKKyAgICAgICAgICAgICB0aGlzLT5zaGFkZXJfc3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlkpOworICAgICAgaWYgKHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzJkX3ZhcikKKyAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgICAgdGhpcy0+b2xkX2NsaXBfZGlzdGFuY2VfMmRfdmFyID0gaXI7CisgICAgICBhc3NlcnQgKGlyLT50eXBlLT5lbGVtZW50X3R5cGUoKS0+ZWxlbWVudF90eXBlKCkgPT0gZ2xzbF90eXBlOjpmbG9hdF90eXBlKTsKKyAgICAgIHVuc2lnbmVkIG5ld19zaXplID0gKGlyLT50eXBlLT5lbGVtZW50X3R5cGUoKS0+YXJyYXlfc2l6ZSgpICsgMykgLyA0OworCisgICAgICAvKiBDbG9uZSB0aGUgb2xkIHZhciBzbyB0aGF0IHdlIGluaGVyaXQgYWxsIG9mIGl0cyBwcm9wZXJ0aWVzICovCisgICAgICB0aGlzLT5uZXdfY2xpcF9kaXN0YW5jZV8yZF92YXIgPSBpci0+Y2xvbmUocmFsbG9jX3BhcmVudChpciksIE5VTEwpOworCisgICAgICAvKiBBbmQgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2UgbmVlZCB0byBjaGFuZ2UgKi8KKyAgICAgIHRoaXMtPm5ld19jbGlwX2Rpc3RhbmNlXzJkX3Zhci0+bmFtZQorICAgICAgICAgPSByYWxsb2Nfc3RyZHVwKHRoaXMtPm5ld19jbGlwX2Rpc3RhbmNlXzJkX3ZhciwgImdsX0NsaXBEaXN0YW5jZU1FU0EiKTsKKyAgICAgIHRoaXMtPm5ld19jbGlwX2Rpc3RhbmNlXzJkX3Zhci0+dHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2FycmF5X2luc3RhbmNlKAorICAgICAgICAgZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsCisgICAgICAgICAgICBuZXdfc2l6ZSksCisgICAgICAgICBpci0+dHlwZS0+YXJyYXlfc2l6ZSgpKTsKKyAgICAgIHRoaXMtPm5ld19jbGlwX2Rpc3RhbmNlXzJkX3Zhci0+ZGF0YS5tYXhfYXJyYXlfYWNjZXNzCisgICAgICAgICA9IGlyLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MgLyA0OworCisgICAgICBpci0+cmVwbGFjZV93aXRoKHRoaXMtPm5ld19jbGlwX2Rpc3RhbmNlXzJkX3Zhcik7CisgICB9CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworLyoqCisgKiBDcmVhdGUgdGhlIG5lY2Vzc2FyeSBHTFNMIHJ2YWx1ZXMgdG8gaW5kZXggaW50byBnbF9DbGlwRGlzdGFuY2VNRVNBIGJhc2VkCisgKiBvbiB0aGUgcnZhbHVlIHByZXZpb3VzbHkgdXNlZCB0byBpbmRleCBpbnRvIGdsX0NsaXBEaXN0YW5jZS4KKyAqCisgKiBccGFyYW0gYXJyYXlfaW5kZXggU2VsZWN0cyBvbmUgb2YgdGhlIHZlYzQncyBpbiBnbF9DbGlwRGlzdGFuY2VNRVNBCisgKiBccGFyYW0gc3dpenpsZV9pbmRleCBTZWxlY3RzIGEgY29tcG9uZW50IHdpdGhpbiB0aGUgdmVjNCBzZWxlY3RlZCBieQorICogICAgICAgIGFycmF5X2luZGV4LgorICovCit2b2lkCitsb3dlcl9jbGlwX2Rpc3RhbmNlX3Zpc2l0b3I6OmNyZWF0ZV9pbmRpY2VzKGlyX3J2YWx1ZSAqb2xkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl9ydmFsdWUgKiZhcnJheV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfcnZhbHVlIComc3dpenpsZV9pbmRleCkKK3sKKyAgIHZvaWQgKmN0eCA9IHJhbGxvY19wYXJlbnQob2xkX2luZGV4KTsKKworICAgLyogTWFrZSBzdXJlIG9sZF9pbmRleCBpcyBhIHNpZ25lZCBpbnQgc28gdGhhdCB0aGUgYml0d2lzZSAic2hpZnQiIGFuZAorICAgICogImFuZCIgb3BlcmF0aW9ucyBiZWxvdyB0eXBlIGNoZWNrIHByb3Blcmx5LgorICAgICovCisgICBpZiAob2xkX2luZGV4LT50eXBlICE9IGdsc2xfdHlwZTo6aW50X3R5cGUpIHsKKyAgICAgIGFzc2VydCAob2xkX2luZGV4LT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIG9sZF9pbmRleCA9IG5ldyhjdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF91MmksIG9sZF9pbmRleCk7CisgICB9CisKKyAgIGlyX2NvbnN0YW50ICpvbGRfaW5kZXhfY29uc3RhbnQgPSBvbGRfaW5kZXgtPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKyAgIGlmIChvbGRfaW5kZXhfY29uc3RhbnQpIHsKKyAgICAgIC8qIGdsX0NsaXBEaXN0YW5jZSBpcyBiZWluZyBhY2Nlc3NlZCB2aWEgYSBjb25zdGFudCBpbmRleC4gIERvbid0IGJvdGhlcgorICAgICAgICogY3JlYXRpbmcgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIHRoZSBsb3dlcmVkIGluZGljZXMuICBKdXN0IGNyZWF0ZQorICAgICAgICogY29uc3RhbnRzLgorICAgICAgICovCisgICAgICBpbnQgY29uc3RfdmFsID0gb2xkX2luZGV4X2NvbnN0YW50LT5nZXRfaW50X2NvbXBvbmVudCgwKTsKKyAgICAgIGFycmF5X2luZGV4ID0gbmV3KGN0eCkgaXJfY29uc3RhbnQoY29uc3RfdmFsIC8gNCk7CisgICAgICBzd2l6emxlX2luZGV4ID0gbmV3KGN0eCkgaXJfY29uc3RhbnQoY29uc3RfdmFsICUgNCk7CisgICB9IGVsc2UgeworICAgICAgLyogQ3JlYXRlIGEgdmFyaWFibGUgdG8gaG9sZCB0aGUgdmFsdWUgb2Ygb2xkX2luZGV4IChzbyB0aGF0IHdlCisgICAgICAgKiBkb24ndCBjb21wdXRlIGl0IHR3aWNlKS4KKyAgICAgICAqLworICAgICAgaXJfdmFyaWFibGUgKm9sZF9pbmRleF92YXIgPSBuZXcoY3R4KSBpcl92YXJpYWJsZSgKKyAgICAgICAgIGdsc2xfdHlwZTo6aW50X3R5cGUsICJjbGlwX2Rpc3RhbmNlX2luZGV4IiwgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICB0aGlzLT5iYXNlX2lyLT5pbnNlcnRfYmVmb3JlKG9sZF9pbmRleF92YXIpOworICAgICAgdGhpcy0+YmFzZV9pci0+aW5zZXJ0X2JlZm9yZShuZXcoY3R4KSBpcl9hc3NpZ25tZW50KAorICAgICAgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUob2xkX2luZGV4X3ZhciksIG9sZF9pbmRleCkpOworCisgICAgICAvKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gY2xpcF9kaXN0YW5jZV9pbmRleCAvIDQuICBEbyB0aGlzIGFzIGEgYml0CisgICAgICAgKiBzaGlmdCBiZWNhdXNlIHRoYXQncyBsaWtlbHkgdG8gYmUgbW9yZSBlZmZpY2llbnQuCisgICAgICAgKi8KKyAgICAgIGFycmF5X2luZGV4ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbigKKyAgICAgICAgIGlyX2Jpbm9wX3JzaGlmdCwgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUob2xkX2luZGV4X3ZhciksCisgICAgICAgICBuZXcoY3R4KSBpcl9jb25zdGFudCgyKSk7CisKKyAgICAgIC8qIENyZWF0ZSB0aGUgZXhwcmVzc2lvbiBjbGlwX2Rpc3RhbmNlX2luZGV4ICUgNC4gIERvIHRoaXMgYXMgYSBiaXR3aXNlCisgICAgICAgKiBBTkQgYmVjYXVzZSB0aGF0J3MgbGlrZWx5IHRvIGJlIG1vcmUgZWZmaWNpZW50LgorICAgICAgICovCisgICAgICBzd2l6emxlX2luZGV4ID0gbmV3KGN0eCkgaXJfZXhwcmVzc2lvbigKKyAgICAgICAgIGlyX2Jpbm9wX2JpdF9hbmQsIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKG9sZF9pbmRleF92YXIpLAorICAgICAgICAgbmV3KGN0eCkgaXJfY29uc3RhbnQoMykpOworICAgfQorfQorCisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHJ2YWx1ZSBkZXNjcmliZXMgYW4gYXJyYXkgb2YgOCBmbG9hdHMgdGhhdAorICogbmVlZHMgdG8gYmUgbG93ZXJlZCB0byBhbiBhcnJheSBvZiAyIHZlYzQnczsgdGhhdCBpcywgZGV0ZXJtaW5lIHdoZXRoZXIgaXQKKyAqIG1hdGNoZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybnM6CisgKgorICogLSBnbF9DbGlwRGlzdGFuY2UgKGlmIGdsX0NsaXBEaXN0YW5jZSBpcyAxRCkKKyAqIC0gZ2xfQ2xpcERpc3RhbmNlW2ldIChpZiBnbF9DbGlwRGlzdGFuY2UgaXMgMkQpCisgKi8KK2Jvb2wKK2xvd2VyX2NsaXBfZGlzdGFuY2VfdmlzaXRvcjo6aXNfY2xpcF9kaXN0YW5jZV92ZWM4KGlyX3J2YWx1ZSAqaXIpCit7CisgICAvKiBOb3RlIHRoYXQgZ2VvbWV0cnkgc2hhZGVycyBjb250YWluIGdsX0NsaXBEaXN0YW5jZSBib3RoIGFzIGFuIGlucHV0CisgICAgKiAod2hpY2ggaXMgYSAyRCBhcnJheSkgYW5kIGFuIG91dHB1dCAod2hpY2ggaXMgYSAxRCBhcnJheSksIHNvIGl0J3MKKyAgICAqIHBvc3NpYmxlIGZvciBib3RoIHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzFkX3ZhciBhbmQKKyAgICAqIHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzJkX3ZhciB0byBiZSBub24tTlVMTCBpbiB0aGUgc2FtZSBzaGFkZXIuCisgICAgKi8KKworICAgaWYgKHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzFkX3ZhcikgeworICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnZhcl9yZWYgPSBpci0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgICAgIGlmICh2YXJfcmVmICYmIHZhcl9yZWYtPnZhciA9PSB0aGlzLT5vbGRfY2xpcF9kaXN0YW5jZV8xZF92YXIpCisgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKyAgIGlmICh0aGlzLT5vbGRfY2xpcF9kaXN0YW5jZV8yZF92YXIpIHsKKyAgICAgIC8qIDJEIGNsaXAgZGlzdGFuY2UgaXMgb25seSBwb3NzaWJsZSBhcyBhIGdlb21ldHJ5IGlucHV0ICovCisgICAgICBhc3NlcnQodGhpcy0+c2hhZGVyX3N0YWdlID09IE1FU0FfU0hBREVSX0dFT01FVFJZKTsKKworICAgICAgaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmFycmF5X3JlZiA9IGlyLT5hc19kZXJlZmVyZW5jZV9hcnJheSgpOworICAgICAgaWYgKGFycmF5X3JlZikgeworICAgICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnZhcl9yZWYgPQorICAgICAgICAgICAgYXJyYXlfcmVmLT5hcnJheS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgICAgICAgIGlmICh2YXJfcmVmICYmIHZhcl9yZWYtPnZhciA9PSB0aGlzLT5vbGRfY2xpcF9kaXN0YW5jZV8yZF92YXIpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBmYWxzZTsKK30KKworCisvKioKKyAqIElmIHRoZSBnaXZlbiBpciBzYXRpc2ZpZXMgaXNfY2xpcF9kaXN0YW5jZV92ZWM4KCksIHJldHVybiBuZXcgaXIKKyAqIHJlcHJlc2VudGluZyBpdHMgbG93ZXJlZCBlcXVpdmFsZW50LiAgVGhhdCBpcywgbWFwOgorICoKKyAqIC0gZ2xfQ2xpcERpc3RhbmNlICAgID0+IGdsX0NsaXBEaXN0YW5jZU1FU0EgICAgKGlmIGdsX0NsaXBEaXN0YW5jZSBpcyAxRCkKKyAqIC0gZ2xfQ2xpcERpc3RhbmNlW2ldID0+IGdsX0NsaXBEaXN0YW5jZU1FU0FbaV0gKGlmIGdsX0NsaXBEaXN0YW5jZSBpcyAyRCkKKyAqCisgKiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCisgKi8KK2lyX3J2YWx1ZSAqCitsb3dlcl9jbGlwX2Rpc3RhbmNlX3Zpc2l0b3I6Omxvd2VyX2NsaXBfZGlzdGFuY2VfdmVjOChpcl9ydmFsdWUgKmlyKQoreworICAgaWYgKHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzFkX3ZhcikgeworICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnZhcl9yZWYgPSBpci0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgICAgIGlmICh2YXJfcmVmICYmIHZhcl9yZWYtPnZhciA9PSB0aGlzLT5vbGRfY2xpcF9kaXN0YW5jZV8xZF92YXIpIHsKKyAgICAgICAgIHJldHVybiBuZXcocmFsbG9jX3BhcmVudChpcikpCisgICAgICAgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0aGlzLT5uZXdfY2xpcF9kaXN0YW5jZV8xZF92YXIpOworICAgICAgfQorICAgfQorICAgaWYgKHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzJkX3ZhcikgeworICAgICAgLyogMkQgY2xpcCBkaXN0YW5jZSBpcyBvbmx5IHBvc3NpYmxlIGFzIGEgZ2VvbWV0cnkgaW5wdXQgKi8KKyAgICAgIGFzc2VydCh0aGlzLT5zaGFkZXJfc3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlkpOworCisgICAgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqYXJyYXlfcmVmID0gaXItPmFzX2RlcmVmZXJlbmNlX2FycmF5KCk7CisgICAgICBpZiAoYXJyYXlfcmVmKSB7CisgICAgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqdmFyX3JlZiA9CisgICAgICAgICAgICBhcnJheV9yZWYtPmFycmF5LT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgICAgICAgaWYgKHZhcl9yZWYgJiYgdmFyX3JlZi0+dmFyID09IHRoaXMtPm9sZF9jbGlwX2Rpc3RhbmNlXzJkX3ZhcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyhyYWxsb2NfcGFyZW50KGlyKSkKKyAgICAgICAgICAgICAgIGlyX2RlcmVmZXJlbmNlX2FycmF5KHRoaXMtPm5ld19jbGlwX2Rpc3RhbmNlXzJkX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3JlZi0+YXJyYXlfaW5kZXgpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZAorbG93ZXJfY2xpcF9kaXN0YW5jZV92aXNpdG9yOjpoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2KQoreworICAgaWYgKCpydiA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqY29uc3QgYXJyYXlfZGVyZWYgPSAoKnJ2KS0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKTsKKyAgIGlmIChhcnJheV9kZXJlZiA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICAvKiBSZXBsYWNlIGFueSBleHByZXNzaW9uIHRoYXQgaW5kZXhlcyBvbmUgb2YgdGhlIGZsb2F0cyBpbiBnbF9DbGlwRGlzdGFuY2UKKyAgICAqIHdpdGggYW4gZXhwcmVzc2lvbiB0aGF0IGluZGV4ZXMgaW50byBvbmUgb2YgdGhlIHZlYzQncyBpbgorICAgICogZ2xfQ2xpcERpc3RhbmNlTUVTQSBhbmQgYWNjZXNzZXMgdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudC4KKyAgICAqLworICAgaXJfcnZhbHVlICpsb3dlcmVkX3ZlYzggPQorICAgICAgdGhpcy0+bG93ZXJfY2xpcF9kaXN0YW5jZV92ZWM4KGFycmF5X2RlcmVmLT5hcnJheSk7CisgICBpZiAobG93ZXJlZF92ZWM4ICE9IE5VTEwpIHsKKyAgICAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKKyAgICAgIGlyX3J2YWx1ZSAqYXJyYXlfaW5kZXg7CisgICAgICBpcl9ydmFsdWUgKnN3aXp6bGVfaW5kZXg7CisgICAgICB0aGlzLT5jcmVhdGVfaW5kaWNlcyhhcnJheV9kZXJlZi0+YXJyYXlfaW5kZXgsIGFycmF5X2luZGV4LCBzd2l6emxlX2luZGV4KTsKKyAgICAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfcGFyZW50KGFycmF5X2RlcmVmKTsKKworICAgICAgaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmNvbnN0IG5ld19hcnJheV9kZXJlZiA9CisgICAgICAgICBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkobG93ZXJlZF92ZWM4LCBhcnJheV9pbmRleCk7CisKKyAgICAgIGlyX2V4cHJlc3Npb24gKmNvbnN0IGV4cHIgPQorICAgICAgICAgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfdmVjdG9yX2V4dHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYXJyYXlfZGVyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlX2luZGV4KTsKKworICAgICAgKnJ2ID0gZXhwcjsKKyAgIH0KK30KKwordm9pZAorbG93ZXJfY2xpcF9kaXN0YW5jZV92aXNpdG9yOjpmaXhfbGhzKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgaWYgKGlyLT5saHMtPmlyX3R5cGUgPT0gaXJfdHlwZV9leHByZXNzaW9uKSB7CisgICAgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX3BhcmVudChpcik7CisgICAgICBpcl9leHByZXNzaW9uICpjb25zdCBleHByID0gKGlyX2V4cHJlc3Npb24gKikgaXItPmxoczsKKworICAgICAgLyogVGhlIGV4cHJlc3Npb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKKyAgICAgICAqCisgICAgICAgKiAgICAgKHZlY3Rvcl9leHRyYWN0IGdsX0NsaXBEaXN0YW5jZU1FU0FbaV0sIGopLgorICAgICAgICovCisgICAgICBhc3NlcnQoZXhwci0+b3BlcmF0aW9uID09IGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0KTsKKyAgICAgIGFzc2VydChleHByLT5vcGVyYW5kc1swXS0+aXJfdHlwZSA9PSBpcl90eXBlX2RlcmVmZXJlbmNlX2FycmF5KTsKKyAgICAgIGFzc2VydChleHByLT5vcGVyYW5kc1swXS0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisKKyAgICAgIGlyX2RlcmVmZXJlbmNlICpjb25zdCBuZXdfbGhzID0gKGlyX2RlcmVmZXJlbmNlICopIGV4cHItPm9wZXJhbmRzWzBdOworICAgICAgaXItPnJocyA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQsCisJCQkJCSAgIGdsc2xfdHlwZTo6dmVjNF90eXBlLAorCQkJCQkgICBuZXdfbGhzLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKwkJCQkJICAgaXItPnJocywKKwkJCQkJICAgZXhwci0+b3BlcmFuZHNbMV0pOworICAgICAgaXItPnNldF9saHMobmV3X2xocyk7CisgICAgICBpci0+d3JpdGVfbWFzayA9IFdSSVRFTUFTS19YWVpXOworICAgfQorfQorCisvKioKKyAqIFJlcGxhY2UgYW55IGFzc2lnbm1lbnQgaGF2aW5nIHRoZSAxRCBnbF9DbGlwRGlzdGFuY2UgKHVuZGVyZWZlcmVuY2VkKSBhcworICogaXRzIExIUyBvciBSSFMgd2l0aCBhIHNlcXVlbmNlIG9mIGFzc2lnbm1lbnRzLCBvbmUgZm9yIGVhY2ggY29tcG9uZW50IG9mCisgKiB0aGUgYXJyYXkuICBFYWNoIG9mIHRoZXNlIGFzc2lnbm1lbnRzIGlzIGxvd2VyZWQgdG8gcmVmZXIgdG8KKyAqIGdsX0NsaXBEaXN0YW5jZU1FU0EgYXMgYXBwcm9wcmlhdGUuCisgKgorICogV2UgbmVlZCB0byBkbyBhIHNpbWlsYXIgcmVwbGFjZW1lbnQgZm9yIDJEIGdsX0NsaXBEaXN0YW5jZSwgaG93ZXZlciBzaW5jZQorICogaXQncyBhbiBpbnB1dCwgdGhlIG9ubHkgY2FzZSB3ZSBuZWVkIHRvIGFkZHJlc3MgaXMgd2hlcmUgYSAxRCBzbGljZSBvZiBpdAorICogaXMgdGhlIGVudGlyZSBSSFMgb2YgYW4gYXNzaWdubWVudCwgZS5nLjoKKyAqCisgKiAgICAgZm9vID0gZ2xfaW5baV0uZ2xfQ2xpcERpc3RhbmNlCisgKi8KK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb3dlcl9jbGlwX2Rpc3RhbmNlX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgLyogRmlyc3QgaW52b2tlIHRoZSBiYXNlIGNsYXNzIHZpc2l0b3IuICBUaGlzIGNhdXNlcyBoYW5kbGVfcnZhbHVlKCkgdG8gYmUKKyAgICAqIGNhbGxlZCBvbiBpci0+cmhzIGFuZCBpci0+Y29uZGl0aW9uLgorICAgICovCisgICBpcl9ydmFsdWVfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXIpOworCisgICBpZiAodGhpcy0+aXNfY2xpcF9kaXN0YW5jZV92ZWM4KGlyLT5saHMpIHx8CisgICAgICAgdGhpcy0+aXNfY2xpcF9kaXN0YW5jZV92ZWM4KGlyLT5yaHMpKSB7CisgICAgICAvKiBMSFMgb3IgUkhTIG9mIHRoZSBhc3NpZ25tZW50IGlzIHRoZSBlbnRpcmUgMUQgZ2xfQ2xpcERpc3RhbmNlIGFycmF5CisgICAgICAgKiAob3IgYSAxRCBzbGljZSBvZiBhIDJEIGdsX0NsaXBEaXN0YW5jZSBpbnB1dCBhcnJheSkuICBTaW5jZSB3ZSBhcmUKKyAgICAgICAqIHJlc2hhcGluZyBnbF9DbGlwRGlzdGFuY2UgZnJvbSBhbiBhcnJheSBvZiBmbG9hdHMgdG8gYW4gYXJyYXkgb2YKKyAgICAgICAqIHZlYzQncywgdGhpcyBpc24ndCBnb2luZyB0byB3b3JrIGFzIGEgYnVsayBhc3NpZ25tZW50IGFueW1vcmUsIHNvCisgICAgICAgKiB1bnJvbGwgaXQgdG8gZWxlbWVudC1ieS1lbGVtZW50IGFzc2lnbm1lbnRzIGFuZCBsb3dlciBlYWNoIG9mIHRoZW0uCisgICAgICAgKgorICAgICAgICogTm90ZTogdG8gdW5yb2xsIGludG8gZWxlbWVudC1ieS1lbGVtZW50IGFzc2lnbm1lbnRzLCB3ZSBuZWVkIHRvIG1ha2UKKyAgICAgICAqIGNsb25lcyBvZiB0aGUgTEhTIGFuZCBSSFMuICBUaGlzIGlzIHNhZmUgYmVjYXVzZSBleHByZXNzaW9ucyBhbmQKKyAgICAgICAqIGwtdmFsdWVzIGFyZSBzaWRlLWVmZmVjdCBmcmVlLgorICAgICAgICovCisgICAgICB2b2lkICpjdHggPSByYWxsb2NfcGFyZW50KGlyKTsKKyAgICAgIGludCBhcnJheV9zaXplID0gaXItPmxocy0+dHlwZS0+YXJyYXlfc2l6ZSgpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheV9zaXplOyArK2kpIHsKKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpuZXdfbGhzID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfYXJyYXkoCisgICAgICAgICAgICBpci0+bGhzLT5jbG9uZShjdHgsIE5VTEwpLCBuZXcoY3R4KSBpcl9jb25zdGFudChpKSk7CisgICAgICAgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqbmV3X3JocyA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KAorICAgICAgICAgICAgaXItPnJocy0+Y2xvbmUoY3R4LCBOVUxMKSwgbmV3KGN0eCkgaXJfY29uc3RhbnQoaSkpOworICAgICAgICAgdGhpcy0+aGFuZGxlX3J2YWx1ZSgoaXJfcnZhbHVlICoqKSAmbmV3X3Jocyk7CisKKyAgICAgICAgIC8qIEhhbmRsZSB0aGUgTEhTIGFmdGVyIGNyZWF0aW5nIHRoZSBuZXcgYXNzaWdubWVudC4gIFRoaXMgbXVzdAorICAgICAgICAgICogaGFwcGVuIGluIHRoaXMgb3JkZXIgYmVjYXVzZSBoYW5kbGVfcnZhbHVlIG1heSByZXBsYWNlIHRoZSBvbGQgTEhTCisgICAgICAgICAgKiB3aXRoIGFuIGlyX2V4cHJlc3Npb24gb2YgaXJfYmlub3BfdmVjdG9yX2V4dHJhY3QuICBTaW5jZSB0aGlzIGlzCisgICAgICAgICAgKiBub3QgYSB2YWxpZGUgbC12YWx1ZSwgdGhpcyB3aWxsIGNhdXNlIGFuIGFzc2VydGlvbiBpbiB0aGUKKyAgICAgICAgICAqIGlyX2Fzc2lnbm1lbnQgY29uc3RydWN0b3IgdG8gZmFpbC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBJZiB0aGlzIG9jY3VycywgcmVwbGFjZSB0aGUgbWFuZ2xlZCBMSFMgd2l0aCBhIGRlcmVmZXJlbmNlIG9mIHRoZQorICAgICAgICAgICogdmVjdG9yLCBhbmQgcmVwbGFjZSB0aGUgUkhTIHdpdGggYW4gaXJfdHJpb3BfdmVjdG9yX2luc2VydC4KKyAgICAgICAgICAqLworICAgICAgICAgaXJfYXNzaWdubWVudCAqY29uc3QgYXNzaWduID0gbmV3KGN0eCkgaXJfYXNzaWdubWVudChuZXdfbGhzLCBuZXdfcmhzKTsKKyAgICAgICAgIHRoaXMtPmhhbmRsZV9ydmFsdWUoKGlyX3J2YWx1ZSAqKikgJmFzc2lnbi0+bGhzKTsKKyAgICAgICAgIHRoaXMtPmZpeF9saHMoYXNzaWduKTsKKworICAgICAgICAgdGhpcy0+YmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworICAgICAgfQorICAgICAgaXItPnJlbW92ZSgpOworCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIC8qIEhhbmRsZSB0aGUgTEhTIGFzIGlmIGl0IHdlcmUgYW4gci12YWx1ZS4gIE5vcm1hbGx5CisgICAgKiBydmFsdWVfdmlzaXQoaXJfYXNzaWdubWVudCAqKSBvbmx5IHZpc2l0cyB0aGUgUkhTLCBidXQgd2UgbmVlZCB0byBsb3dlcgorICAgICogZXhwcmVzc2lvbnMgaW4gdGhlIExIUyBhcyB3ZWxsLgorICAgICoKKyAgICAqIFRoaXMgbWF5IGNhdXNlIHRoZSBMSFMgdG8gZ2V0IHJlcGxhY2VkIHdpdGggYW4gaXJfZXhwcmVzc2lvbiBvZgorICAgICogaXJfYmlub3BfdmVjdG9yX2V4dHJhY3QuICBJZiB0aGlzIG9jY3VycywgcmVwbGFjZSBpdCB3aXRoIGEgZGVyZWZlcmVuY2UKKyAgICAqIG9mIHRoZSB2ZWN0b3IsIGFuZCByZXBsYWNlIHRoZSBSSFMgd2l0aCBhbiBpcl90cmlvcF92ZWN0b3JfaW5zZXJ0LgorICAgICovCisgICBoYW5kbGVfcnZhbHVlKChpcl9ydmFsdWUgKiopJmlyLT5saHMpOworICAgdGhpcy0+Zml4X2xocyhpcik7CisKKyAgIHJldHVybiBydmFsdWVfdmlzaXQoaXIpOworfQorCisKKy8qKgorICogU2V0IHVwIGJhc2VfaXIgcHJvcGVybHkgYW5kIGNhbGwgdmlzaXRfbGVhdmUoKSBvbiBhIG5ld2x5IGNyZWF0ZWQKKyAqIGlyX2Fzc2lnbm1lbnQgbm9kZS4gIFRoaXMgaXMgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZSBoYXZlIHRvIGluc2VydCBhbgorICogaXJfYXNzaWdubWVudCBpbiBhIHBsYWNlIHdoZXJlIHdlIGtub3cgdGhlIGhpZXJhcmNoaWNhbCB2aXNpdG9yIHdvbid0IHNlZQorICogaXQuCisgKi8KK3ZvaWQKK2xvd2VyX2NsaXBfZGlzdGFuY2VfdmlzaXRvcjo6dmlzaXRfbmV3X2Fzc2lnbm1lbnQoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpcl9pbnN0cnVjdGlvbiAqb2xkX2Jhc2VfaXIgPSB0aGlzLT5iYXNlX2lyOworICAgdGhpcy0+YmFzZV9pciA9IGlyOworICAgaXItPmFjY2VwdCh0aGlzKTsKKyAgIHRoaXMtPmJhc2VfaXIgPSBvbGRfYmFzZV9pcjsKK30KKworCisvKioKKyAqIElmIGEgMUQgZ2xfQ2xpcERpc3RhbmNlIHZhcmlhYmxlIGFwcGVhcnMgYXMgYW4gYXJndW1lbnQgaW4gYW4gaXJfY2FsbAorICogZXhwcmVzc2lvbiwgcmVwbGFjZSBpdCB3aXRoIGEgdGVtcG9yYXJ5IHZhcmlhYmxlLCBhbmQgbWFrZSBzdXJlIHRoZSBpcl9jYWxsCisgKiBpcyBwcmVjZWRlZCBhbmQvb3IgZm9sbG93ZWQgYnkgYXNzaWdubWVudHMgdGhhdCBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBhbmQvb3IgZnJvbSBnbF9DbGlwRGlzdGFuY2UuICBFYWNoIG9mIHRoZXNlCisgKiBhc3NpZ25tZW50cyBpcyB0aGVuIGxvd2VyZWQgdG8gcmVmZXIgdG8gZ2xfQ2xpcERpc3RhbmNlTUVTQS4KKyAqCisgKiBXZSBuZWVkIHRvIGRvIGEgc2ltaWxhciByZXBsYWNlbWVudCBmb3IgMkQgZ2xfQ2xpcERpc3RhbmNlLCBob3dldmVyIHNpbmNlCisgKiBpdCdzIGFuIGlucHV0LCB0aGUgb25seSBjYXNlIHdlIG5lZWQgdG8gYWRkcmVzcyBpcyB3aGVyZSBhIDFEIHNsaWNlIG9mIGl0CisgKiBpcyBwYXNzZWQgYXMgYW4gImluIiBwYXJhbWV0ZXIgdG8gYW4gaXJfY2FsbCwgZS5nLjoKKyAqCisgKiAgICAgZm9vKGdsX2luW2ldLmdsX0NsaXBEaXN0YW5jZSkKKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK2xvd2VyX2NsaXBfZGlzdGFuY2VfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfY2FsbCAqaXIpCit7CisgICB2b2lkICpjdHggPSByYWxsb2NfcGFyZW50KGlyKTsKKworICAgY29uc3QgZXhlY19ub2RlICpmb3JtYWxfcGFyYW1fbm9kZSA9IGlyLT5jYWxsZWUtPnBhcmFtZXRlcnMuaGVhZDsKKyAgIGNvbnN0IGV4ZWNfbm9kZSAqYWN0dWFsX3BhcmFtX25vZGUgPSBpci0+YWN0dWFsX3BhcmFtZXRlcnMuaGVhZDsKKyAgIHdoaWxlICghYWN0dWFsX3BhcmFtX25vZGUtPmlzX3RhaWxfc2VudGluZWwoKSkgeworICAgICAgaXJfdmFyaWFibGUgKmZvcm1hbF9wYXJhbSA9IChpcl92YXJpYWJsZSAqKSBmb3JtYWxfcGFyYW1fbm9kZTsKKyAgICAgIGlyX3J2YWx1ZSAqYWN0dWFsX3BhcmFtID0gKGlyX3J2YWx1ZSAqKSBhY3R1YWxfcGFyYW1fbm9kZTsKKworICAgICAgLyogQWR2YW5jZSBmb3JtYWxfcGFyYW1fbm9kZSBhbmQgYWN0dWFsX3BhcmFtX25vZGUgbm93IHNvIHRoYXQgd2UgY2FuCisgICAgICAgKiBzYWZlbHkgcmVwbGFjZSBhY3R1YWxfcGFyYW0gd2l0aCBhbm90aGVyIG5vZGUsIGlmIG5lY2Vzc2FyeSwgYmVsb3cuCisgICAgICAgKi8KKyAgICAgIGZvcm1hbF9wYXJhbV9ub2RlID0gZm9ybWFsX3BhcmFtX25vZGUtPm5leHQ7CisgICAgICBhY3R1YWxfcGFyYW1fbm9kZSA9IGFjdHVhbF9wYXJhbV9ub2RlLT5uZXh0OworCisgICAgICBpZiAodGhpcy0+aXNfY2xpcF9kaXN0YW5jZV92ZWM4KGFjdHVhbF9wYXJhbSkpIHsKKyAgICAgICAgIC8qIFVzZXIgaXMgdHJ5aW5nIHRvIHBhc3MgdGhlIHdob2xlIDFEIGdsX0NsaXBEaXN0YW5jZSBhcnJheSAob3IgYSAxRAorICAgICAgICAgICogc2xpY2Ugb2YgYSAyRCBnbF9DbGlwRGlzdGFuY2UgYXJyYXkpIHRvIGEgZnVuY3Rpb24gY2FsbC4gIFNpbmNlIHdlCisgICAgICAgICAgKiBhcmUgcmVzaGFwaW5nIGdsX0NsaXBEaXN0YW5jZSBmcm9tIGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheQorICAgICAgICAgICogb2YgdmVjNCdzLCB0aGlzIGlzbid0IGdvaW5nIHRvIHdvcmsgYW55bW9yZSwgc28gdXNlIGEgdGVtcG9yYXJ5CisgICAgICAgICAgKiBhcnJheSBpbnN0ZWFkLgorICAgICAgICAgICovCisgICAgICAgICBpcl92YXJpYWJsZSAqdGVtcF9jbGlwX2Rpc3RhbmNlID0gbmV3KGN0eCkgaXJfdmFyaWFibGUoCisgICAgICAgICAgICBhY3R1YWxfcGFyYW0tPnR5cGUsICJ0ZW1wX2NsaXBfZGlzdGFuY2UiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgICAgIHRoaXMtPmJhc2VfaXItPmluc2VydF9iZWZvcmUodGVtcF9jbGlwX2Rpc3RhbmNlKTsKKyAgICAgICAgIGFjdHVhbF9wYXJhbS0+cmVwbGFjZV93aXRoKAorICAgICAgICAgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGVtcF9jbGlwX2Rpc3RhbmNlKSk7CisgICAgICAgICBpZiAoZm9ybWFsX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX2luCisgICAgICAgICAgICAgfHwgZm9ybWFsX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX2lub3V0KSB7CisgICAgICAgICAgICAvKiBDb3B5IGZyb20gZ2xfQ2xpcERpc3RhbmNlIHRvIHRoZSB0ZW1wb3JhcnkgYmVmb3JlIHRoZSBjYWxsLgorICAgICAgICAgICAgICogU2luY2Ugd2UgYXJlIGdvaW5nIHRvIGluc2VydCB0aGlzIGNvcHkgYmVmb3JlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgKiBpbnN0cnVjdGlvbiwgd2UgbmVlZCB0byB2aXNpdCBpdCBhZnRlcndhcmRzIHRvIG1ha2Ugc3VyZSBpdAorICAgICAgICAgICAgICogZ2V0cyBsb3dlcmVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpcl9hc3NpZ25tZW50ICpuZXdfYXNzaWdubWVudCA9IG5ldyhjdHgpIGlyX2Fzc2lnbm1lbnQoCisgICAgICAgICAgICAgICBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0ZW1wX2NsaXBfZGlzdGFuY2UpLAorICAgICAgICAgICAgICAgYWN0dWFsX3BhcmFtLT5jbG9uZShjdHgsIE5VTEwpKTsKKyAgICAgICAgICAgIHRoaXMtPmJhc2VfaXItPmluc2VydF9iZWZvcmUobmV3X2Fzc2lnbm1lbnQpOworICAgICAgICAgICAgdGhpcy0+dmlzaXRfbmV3X2Fzc2lnbm1lbnQobmV3X2Fzc2lnbm1lbnQpOworICAgICAgICAgfQorICAgICAgICAgaWYgKGZvcm1hbF9wYXJhbS0+ZGF0YS5tb2RlID09IGlyX3Zhcl9mdW5jdGlvbl9vdXQKKyAgICAgICAgICAgICB8fCBmb3JtYWxfcGFyYW0tPmRhdGEubW9kZSA9PSBpcl92YXJfZnVuY3Rpb25faW5vdXQpIHsKKyAgICAgICAgICAgIC8qIENvcHkgZnJvbSB0aGUgdGVtcG9yYXJ5IHRvIGdsX0NsaXBEaXN0YW5jZSBhZnRlciB0aGUgY2FsbC4KKyAgICAgICAgICAgICAqIFNpbmNlIHZpc2l0X2xpc3RfZWxlbWVudHMoKSBoYXMgYWxyZWFkeSBkZWNpZGVkIHdoaWNoCisgICAgICAgICAgICAgKiBpbnN0cnVjdGlvbiBpdCdzIGdvaW5nIHRvIHZpc2l0IG5leHQsIHdlIG5lZWQgdG8gdmlzaXQKKyAgICAgICAgICAgICAqIGFmdGVyd2FyZHMgdG8gbWFrZSBzdXJlIGl0IGdldHMgbG93ZXJlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaXJfYXNzaWdubWVudCAqbmV3X2Fzc2lnbm1lbnQgPSBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KAorICAgICAgICAgICAgICAgYWN0dWFsX3BhcmFtLT5jbG9uZShjdHgsIE5VTEwpLAorICAgICAgICAgICAgICAgbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGVtcF9jbGlwX2Rpc3RhbmNlKSk7CisgICAgICAgICAgICB0aGlzLT5iYXNlX2lyLT5pbnNlcnRfYWZ0ZXIobmV3X2Fzc2lnbm1lbnQpOworICAgICAgICAgICAgdGhpcy0+dmlzaXRfbmV3X2Fzc2lnbm1lbnQobmV3X2Fzc2lnbm1lbnQpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKworCitib29sCitsb3dlcl9jbGlwX2Rpc3RhbmNlKGdsX3NoYWRlciAqc2hhZGVyKQoreworICAgbG93ZXJfY2xpcF9kaXN0YW5jZV92aXNpdG9yIHYoc2hhZGVyLT5TdGFnZSk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIHNoYWRlci0+aXIpOworCisgICBpZiAodi5uZXdfY2xpcF9kaXN0YW5jZV8xZF92YXIpCisgICAgICBzaGFkZXItPnN5bWJvbHMtPmFkZF92YXJpYWJsZSh2Lm5ld19jbGlwX2Rpc3RhbmNlXzFkX3Zhcik7CisgICBpZiAodi5uZXdfY2xpcF9kaXN0YW5jZV8yZF92YXIpCisgICAgICBzaGFkZXItPnN5bWJvbHMtPmFkZF92YXJpYWJsZSh2Lm5ld19jbGlwX2Rpc3RhbmNlXzJkX3Zhcik7CisKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9kaXNjYXJkLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfZGlzY2FyZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3NTdkMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfZGlzY2FyZC5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGxvd2VyX2Rpc2NhcmQuY3BwCisgKgorICogVGhpcyBwYXNzIG1vdmVzIGRpc2NhcmRzIG91dCBvZiBpZi1zdGF0ZW1lbnRzLgorICoKKyAqIENhc2UgMTogVGhlICJ0aGVuIiBicmFuY2ggY29udGFpbnMgYSBjb25kaXRpb25hbCBkaXNjYXJkOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICAgaWYgKGNvbmQxKSB7CisgKgkgczE7CisgKgkgZGlzY2FyZCBjb25kMjsKKyAqCSBzMjsKKyAqICAgIH0gZWxzZSB7CisgKgkgczM7CisgKiAgICB9CisgKgorICogYmVjb21lczoKKyAqCisgKiAgICB0ZW1wID0gZmFsc2U7CisgKiAgICBpZiAoY29uZDEpIHsKKyAqCSBzMTsKKyAqCSB0ZW1wID0gY29uZDI7CisgKgkgczI7CisgKiAgICB9IGVsc2UgeworICoJIHMzOworICogICAgfQorICogICAgZGlzY2FyZCB0ZW1wOworICoKKyAqIENhc2UgMjogVGhlICJlbHNlIiBicmFuY2ggY29udGFpbnMgYSBjb25kaXRpb25hbCBkaXNjYXJkOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICAgaWYgKGNvbmQxKSB7CisgKgkgczE7CisgKiAgICB9IGVsc2UgeworICoJIHMyOworICoJIGRpc2NhcmQgY29uZDI7CisgKgkgczM7CisgKiAgICB9CisgKgorICogYmVjb21lczoKKyAqCisgKiAgICB0ZW1wID0gZmFsc2U7CisgKiAgICBpZiAoY29uZDEpIHsKKyAqCSBzMTsKKyAqICAgIH0gZWxzZSB7CisgKgkgczI7CisgKgkgdGVtcCA9IGNvbmQyOworICoJIHMzOworICogICAgfQorICogICAgZGlzY2FyZCB0ZW1wOworICoKKyAqIENhc2UgMzogQm90aCBicmFuY2hlcyBjb250YWluIGEgY29uZGl0aW9uYWwgZGlzY2FyZDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgICBpZiAoY29uZDEpIHsKKyAqCSBzMTsKKyAqCSBkaXNjYXJkIGNvbmQyOworICoJIHMyOworICogICAgfSBlbHNlIHsKKyAqCSBzMzsKKyAqCSBkaXNjYXJkIGNvbmQzOworICoJIHM0OworICogICAgfQorICoKKyAqIGJlY29tZXM6CisgKgorICogICAgdGVtcCA9IGZhbHNlOworICogICAgaWYgKGNvbmQxKSB7CisgKgkgczE7CisgKgkgdGVtcCA9IGNvbmQyOworICoJIHMyOworICogICAgfSBlbHNlIHsKKyAqCSBzMzsKKyAqCSB0ZW1wID0gY29uZDM7CisgKgkgczQ7CisgKiAgICB9CisgKiAgICBkaXNjYXJkIHRlbXA7CisgKgorICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvbmRpdGlvbmFsIGRpc2NhcmRzLCB3ZSBuZWVkIG9ubHkgZGVhbCB3aXRoIG9uZSBvZgorICogdGhlbS4gIFJlcGVhdGVkbHkgYXBwbHlpbmcgdGhpcyBwYXNzIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBvdGhlcnMuCisgKgorICogVW5jb25kaXRpb25hbCBkaXNjYXJkcyBhcmUgdHJlYXRlZCBhcyBoYXZpbmcgYSBjb25kaXRpb24gb2YgInRydWUiLgorICovCisKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAiaXIuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgbG93ZXJfZGlzY2FyZF92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxvd2VyX2Rpc2NhcmRfdmlzaXRvcigpCisgICB7CisgICAgICB0aGlzLT5wcm9ncmVzcyA9IGZhbHNlOworICAgfQorCisgICBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9pZiAqKTsKKworICAgYm9vbCBwcm9ncmVzczsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitib29sCitsb3dlcl9kaXNjYXJkKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgbG93ZXJfZGlzY2FyZF92aXNpdG9yIHY7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7CisKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQorCisKK3N0YXRpYyBpcl9kaXNjYXJkICoKK2ZpbmRfZGlzY2FyZChleGVjX2xpc3QgJmluc3RydWN0aW9ucykKK3sKKyAgIGZvcmVhY2hfbGlzdChuLCAmaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9kaXNjYXJkICppciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbiktPmFzX2Rpc2NhcmQoKTsKKyAgICAgIGlmIChpciAhPSBOVUxMKQorCSByZXR1cm4gaXI7CisgICB9CisgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZAorcmVwbGFjZV9kaXNjYXJkKHZvaWQgKm1lbV9jdHgsIGlyX3ZhcmlhYmxlICp2YXIsIGlyX2Rpc2NhcmQgKmlyKQoreworICAgaXJfcnZhbHVlICpjb25kaXRpb24gPSBpci0+Y29uZGl0aW9uOworCisgICAvKiBGb3IgdW5jb25kaXRpb25hbCBkaXNjYXJkcywgdXNlICJ0cnVlIiBhcyB0aGUgY29uZGl0aW9uLiAqLworICAgaWYgKGNvbmRpdGlvbiA9PSBOVUxMKQorICAgICAgY29uZGl0aW9uID0gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KHRydWUpOworCisgICBpcl9hc3NpZ25tZW50ICphc3NpZ25tZW50ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpLAorCQkJCSBjb25kaXRpb24sIE5VTEwpOworCisgICBpci0+cmVwbGFjZV93aXRoKGFzc2lnbm1lbnQpOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb3dlcl9kaXNjYXJkX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2lmICppcikKK3sKKyAgIGlyX2Rpc2NhcmQgKnRoZW5fZGlzY2FyZCA9IGZpbmRfZGlzY2FyZChpci0+dGhlbl9pbnN0cnVjdGlvbnMpOworICAgaXJfZGlzY2FyZCAqZWxzZV9kaXNjYXJkID0gZmluZF9kaXNjYXJkKGlyLT5lbHNlX2luc3RydWN0aW9ucyk7CisKKyAgIGlmICh0aGVuX2Rpc2NhcmQgPT0gTlVMTCAmJiBlbHNlX2Rpc2NhcmQgPT0gTlVMTCkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICBpcl92YXJpYWJsZSAqdGVtcCA9IG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OmJvb2xfdHlwZSwKKwkJCQkJCSJkaXNjYXJkX2NvbmRfdGVtcCIsCisJCQkJCQlpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGlyX2Fzc2lnbm1lbnQgKnRlbXBfaW5pdGlhbGl6ZXIgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRlbXApLAorCQkJCSBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoZmFsc2UpLCBOVUxMKTsKKworICAgaXItPmluc2VydF9iZWZvcmUodGVtcCk7CisgICBpci0+aW5zZXJ0X2JlZm9yZSh0ZW1wX2luaXRpYWxpemVyKTsKKworICAgaWYgKHRoZW5fZGlzY2FyZCAhPSBOVUxMKQorICAgICAgcmVwbGFjZV9kaXNjYXJkKG1lbV9jdHgsIHRlbXAsIHRoZW5fZGlzY2FyZCk7CisKKyAgIGlmIChlbHNlX2Rpc2NhcmQgIT0gTlVMTCkKKyAgICAgIHJlcGxhY2VfZGlzY2FyZChtZW1fY3R4LCB0ZW1wLCBlbHNlX2Rpc2NhcmQpOworCisgICBpcl9kaXNjYXJkICpkaXNjYXJkID0gdGhlbl9kaXNjYXJkICE9IE5VTEwgPyB0aGVuX2Rpc2NhcmQgOiBlbHNlX2Rpc2NhcmQ7CisgICBkaXNjYXJkLT5jb25kaXRpb24gPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGVtcCk7CisgICBpci0+aW5zZXJ0X2FmdGVyKGRpc2NhcmQpOworCisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfZGlzY2FyZF9mbG93LmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfZGlzY2FyZF9mbG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM1NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9kaXNjYXJkX2Zsb3cuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqIEBmaWxlIGxvd2VyX2Rpc2NhcmRfZmxvdy5jcHAKKyAqCisgKiBJbXBsZW1lbnRzIHRoZSBHTFNMIDEuMzAgcmV2aXNpb24gOSBydWxlIGZvciBmcmFnbWVudCBzaGFkZXIKKyAqIGRpc2NhcmQgaGFuZGxpbmc6CisgKgorICogICAgICJDb250cm9sIGZsb3cgZXhpdHMgdGhlIHNoYWRlciwgYW5kIHN1YnNlcXVlbnQgaW1wbGljaXQgb3IKKyAqICAgICAgZXhwbGljaXQgZGVyaXZhdGl2ZXMgYXJlIHVuZGVmaW5lZCB3aGVuIHRoaXMgY29udHJvbCBmbG93IGlzCisgKiAgICAgIG5vbi11bmlmb3JtIChtZWFuaW5nIGRpZmZlcmVudCBmcmFnbWVudHMgd2l0aGluIHRoZSBwcmltaXRpdmUKKyAqICAgICAgdGFrZSBkaWZmZXJlbnQgY29udHJvbCBwYXRocykuIgorICoKKyAqIFRoZXJlIHNlZW0gdG8gYmUgdHdvIGNvbmZsaWN0aW5nIHRoaW5ncyBoZXJlLiAgIkNvbnRyb2wgZmxvdyBleGl0cworICogdGhlIHNoYWRlciIgc291bmRzIGxpa2UgdGhlIGRpc2NhcmRlZCBmcmFnbWVudHMgc2hvdWxkIGVmZmVjdGl2ZWx5CisgKiBqdW1wIHRvIHRoZSBlbmQgb2YgdGhlIHNoYWRlciwgYnV0IHRoYXQgYnJlYWtzIGRlcml2YXRpdmVzIGluIHRoZQorICogY2FzZSBvZiB1bmlmb3JtIGNvbnRyb2wgZmxvdyBhbmQgY2F1c2VzIHJlbmRlcmluZyBmYWlsdXJlIGluIHRoZQorICogYnVzaGVzIGluIFVuaWdpbmUgVHJvcGljcy4KKyAqCisgKiBUaGUgcXVlc3Rpb24sIHRoZW4sIGlzIHdoZXRoZXIgdGhlIGludGVudCB3YXMgImxvb3BzIHN0b3AgYXQgdGhlCisgKiBwb2ludCB0aGF0IHRoZSBvbmx5IGFjdGl2ZSBjaGFubmVscyBsZWZ0IGFyZSBkaXNjYXJkZWQgcGl4ZWxzIiBvcgorICogImRpc2NhcmRlZCBwaXhlbHMgYmVjb21lIGluYWN0aXZlIGF0IHRoZSBwb2ludCB0aGF0IGNvbnRyb2wgZmxvdworICogcmV0dXJucyB0byB0aGUgdG9wIG9mIGEgbG9vcCIuICBUaGlzIGltcGxlbWVudHMgdGhlIHNlY29uZAorICogaW50ZXJwcmV0YXRpb24uCisgKi8KKworI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBsb3dlcl9kaXNjYXJkX2Zsb3dfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBsb3dlcl9kaXNjYXJkX2Zsb3dfdmlzaXRvcihpcl92YXJpYWJsZSAqZGlzY2FyZGVkKQorICAgOiBkaXNjYXJkZWQoZGlzY2FyZGVkKQorICAgeworICAgICAgbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoZGlzY2FyZGVkKTsKKyAgIH0KKworICAgfmxvd2VyX2Rpc2NhcmRfZmxvd192aXNpdG9yKCkKKyAgIHsKKyAgIH0KKworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZGlzY2FyZCAqaXIpOworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfbG9vcF9qdW1wICppcik7CisgICBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9sb29wICppcik7CisgICBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKTsKKworICAgaXJfaWYgKmdlbmVyYXRlX2Rpc2NhcmRfYnJlYWsoKTsKKworICAgaXJfdmFyaWFibGUgKmRpc2NhcmRlZDsKKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworaXJfdmlzaXRvcl9zdGF0dXMKK2xvd2VyX2Rpc2NhcmRfZmxvd192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9sb29wX2p1bXAgKmlyKQoreworICAgaWYgKGlyLT5tb2RlICE9IGlyX2xvb3BfanVtcDo6anVtcF9jb250aW51ZSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaXItPmluc2VydF9iZWZvcmUoZ2VuZXJhdGVfZGlzY2FyZF9icmVhaygpKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworbG93ZXJfZGlzY2FyZF9mbG93X3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Rpc2NhcmQgKmlyKQoreworICAgaXJfZGVyZWZlcmVuY2UgKmxocyA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShkaXNjYXJkZWQpOworICAgaXJfcnZhbHVlICpyaHMgPSBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQodHJ1ZSk7CisgICBpcl9hc3NpZ25tZW50ICphc3NpZ24gPSBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChsaHMsIHJocyk7CisgICBpci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb3dlcl9kaXNjYXJkX2Zsb3dfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfbG9vcCAqaXIpCit7CisgICBpci0+Ym9keV9pbnN0cnVjdGlvbnMucHVzaF90YWlsKGdlbmVyYXRlX2Rpc2NhcmRfYnJlYWsoKSk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2xvd2VyX2Rpc2NhcmRfZmxvd192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgaWYgKHN0cmNtcChpci0+ZnVuY3Rpb25fbmFtZSgpLCAibWFpbiIpICE9IDApCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGlyX2RlcmVmZXJlbmNlICpsaHMgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoZGlzY2FyZGVkKTsKKyAgIGlyX3J2YWx1ZSAqcmhzID0gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGZhbHNlKTsKKyAgIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbiA9IG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KGxocywgcmhzKTsKKyAgIGlyLT5ib2R5LnB1c2hfaGVhZChhc3NpZ24pOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX2lmICoKK2xvd2VyX2Rpc2NhcmRfZmxvd192aXNpdG9yOjpnZW5lcmF0ZV9kaXNjYXJkX2JyZWFrKCkKK3sKKyAgIGlyX3J2YWx1ZSAqaWZfY29uZGl0aW9uID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKGRpc2NhcmRlZCk7CisgICBpcl9pZiAqaWZfaW5zdCA9IG5ldyhtZW1fY3R4KSBpcl9pZihpZl9jb25kaXRpb24pOworCisgICBpcl9pbnN0cnVjdGlvbiAqYnIgPSBuZXcobWVtX2N0eCkgaXJfbG9vcF9qdW1wKGlyX2xvb3BfanVtcDo6anVtcF9icmVhayk7CisgICBpZl9pbnN0LT50aGVuX2luc3RydWN0aW9ucy5wdXNoX3RhaWwoYnIpOworCisgICByZXR1cm4gaWZfaW5zdDsKK30KKwordm9pZAorbG93ZXJfZGlzY2FyZF9mbG93KGV4ZWNfbGlzdCAqaXIpCit7CisgICB2b2lkICptZW1fY3R4ID0gaXI7CisKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjpib29sX3R5cGUsCisJCQkJCSAgICAgICAiZGlzY2FyZGVkIiwKKwkJCQkJICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworCisgICBpci0+cHVzaF9oZWFkKHZhcik7CisKKyAgIGxvd2VyX2Rpc2NhcmRfZmxvd192aXNpdG9yIHYodmFyKTsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaXIpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9pZl90b19jb25kX2Fzc2lnbi5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX2lmX3RvX2NvbmRfYXNzaWduLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTViMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9pZl90b19jb25kX2Fzc2lnbi5jcHAKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGxvd2VyX2lmX3RvX2NvbmRfYXNzaWduLmNwcAorICoKKyAqIFRoaXMgYXR0ZW1wdHMgdG8gZmxhdHRlbiBpZi1zdGF0ZW1lbnRzIHRvIGNvbmRpdGlvbmFsIGFzc2lnbm1lbnRzIGZvcgorICogR1BVcyB3aXRoIGxpbWl0ZWQgb3Igbm8gZmxvdyBjb250cm9sIHN1cHBvcnQuCisgKgorICogSXQgY2FuJ3QgaGFuZGxlIG90aGVyIGNvbnRyb2wgZmxvdyBiZWluZyBpbnNpZGUgb2YgaXRzIGJsb2NrLCBzdWNoCisgKiBhcyBjYWxscyBvciBsb29wcy4gIEhvcGVmdWxseSBsb29wIHVucm9sbGluZyBhbmQgaW5saW5pbmcgd2lsbCB0YWtlCisgKiBjYXJlIG9mIHRob3NlLgorICoKKyAqIERyaXZlcnMgZm9yIEdQVXMgd2l0aCBubyBjb250cm9sIGZsb3cgc3VwcG9ydCBzaG91bGQgc2ltcGx5IGNhbGwKKyAqCisgKiAgICBsb3dlcl9pZl90b19jb25kX2Fzc2lnbihpbnN0cnVjdGlvbnMpCisgKgorICogdG8gYXR0ZW1wdCB0byBmbGF0dGVuIGFsbCBpZi1zdGF0ZW1lbnRzLgorICoKKyAqIFNvbWUgR1BVcyAoc3VjaCBhcyBpOTY1IHByaW9yIHRvIGdlbjYpIGRvIHN1cHBvcnQgY29udHJvbCBmbG93LCBidXQgaGF2ZSBhCisgKiBtYXhpbXVtIG5lc3RpbmcgZGVwdGggTi4gIERyaXZlcnMgZm9yIHN1Y2ggaGFyZHdhcmUgY2FuIGNhbGwKKyAqCisgKiAgICBsb3dlcl9pZl90b19jb25kX2Fzc2lnbihpbnN0cnVjdGlvbnMsIE4pCisgKgorICogdG8gYXR0ZW1wdCB0byBmbGF0dGVuIGFueSBpZi1zdGF0ZW1lbnRzIGFwcGVhcmluZyBhdCBkZXB0aCA+IE4uCisgKi8KKworI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBpcl9pZl90b19jb25kX2Fzc2lnbl92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX2lmX3RvX2NvbmRfYXNzaWduX3Zpc2l0b3IodW5zaWduZWQgbWF4X2RlcHRoKQorICAgeworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIHRoaXMtPm1heF9kZXB0aCA9IG1heF9kZXB0aDsKKyAgICAgIHRoaXMtPmRlcHRoID0gMDsKKworICAgICAgdGhpcy0+Y29uZGl0aW9uX3ZhcmlhYmxlcyA9IGhhc2hfdGFibGVfY3RvcigwLCBoYXNoX3RhYmxlX3BvaW50ZXJfaGFzaCwKKwkJCQkJCSAgaGFzaF90YWJsZV9wb2ludGVyX2NvbXBhcmUpOworICAgfQorCisgICB+aXJfaWZfdG9fY29uZF9hc3NpZ25fdmlzaXRvcigpCisgICB7CisgICAgICBoYXNoX3RhYmxlX2R0b3IodGhpcy0+Y29uZGl0aW9uX3ZhcmlhYmxlcyk7CisgICB9CisKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2lmICopOworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfaWYgKik7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7CisgICB1bnNpZ25lZCBtYXhfZGVwdGg7CisgICB1bnNpZ25lZCBkZXB0aDsKKworICAgc3RydWN0IGhhc2hfdGFibGUgKmNvbmRpdGlvbl92YXJpYWJsZXM7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworYm9vbAorbG93ZXJfaWZfdG9fY29uZF9hc3NpZ24oZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHVuc2lnbmVkIG1heF9kZXB0aCkKK3sKKyAgIGlmIChtYXhfZGVwdGggPT0gVUlOVF9NQVgpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlyX2lmX3RvX2NvbmRfYXNzaWduX3Zpc2l0b3IgdihtYXhfZGVwdGgpOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KKwordm9pZAorY2hlY2tfY29udHJvbF9mbG93KGlyX2luc3RydWN0aW9uICppciwgdm9pZCAqZGF0YSkKK3sKKyAgIGJvb2wgKmZvdW5kX2NvbnRyb2xfZmxvdyA9IChib29sICopZGF0YTsKKyAgIHN3aXRjaCAoaXItPmlyX3R5cGUpIHsKKyAgIGNhc2UgaXJfdHlwZV9jYWxsOgorICAgY2FzZSBpcl90eXBlX2Rpc2NhcmQ6CisgICBjYXNlIGlyX3R5cGVfbG9vcDoKKyAgIGNhc2UgaXJfdHlwZV9sb29wX2p1bXA6CisgICBjYXNlIGlyX3R5cGVfcmV0dXJuOgorICAgICAgKmZvdW5kX2NvbnRyb2xfZmxvdyA9IHRydWU7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KK30KKwordm9pZAorbW92ZV9ibG9ja190b19jb25kX2Fzc2lnbih2b2lkICptZW1fY3R4LAorCQkJICBpcl9pZiAqaWZfaXIsIGlyX3J2YWx1ZSAqY29uZF9leHByLAorCQkJICBleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKwkJCSAgc3RydWN0IGhhc2hfdGFibGUgKmh0KQoreworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZTsKKworICAgICAgaWYgKGlyLT5pcl90eXBlID09IGlyX3R5cGVfYXNzaWdubWVudCkgeworCSBpcl9hc3NpZ25tZW50ICphc3NpZ24gPSAoaXJfYXNzaWdubWVudCAqKWlyOworCisJIGlmIChoYXNoX3RhYmxlX2ZpbmQoaHQsIGFzc2lnbikgPT0gTlVMTCkgeworCSAgICBoYXNoX3RhYmxlX2luc2VydChodCwgYXNzaWduLCBhc3NpZ24pOworCisJICAgIC8qIElmIHRoZSBMSFMgb2YgdGhlIGFzc2lnbm1lbnQgaXMgYSBjb25kaXRpb24gdmFyaWFibGUgdGhhdCB3YXMKKwkgICAgICogcHJldmlvdXNseSBhZGRlZCwgaW5zZXJ0IGFuIGFkZGl0aW9uYWwgYXNzaWdubWVudCBvZiBmYWxzZSB0bworCSAgICAgKiB0aGUgdmFyaWFibGUuCisJICAgICAqLworCSAgICBjb25zdCBib29sIGFzc2lnbl90b19jdiA9CisJICAgICAgIGhhc2hfdGFibGVfZmluZChodCwgYXNzaWduLT5saHMtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKSkgIT0gTlVMTDsKKworCSAgICBpZiAoIWFzc2lnbi0+Y29uZGl0aW9uKSB7CisJICAgICAgIGlmIChhc3NpZ25fdG9fY3YpIHsKKwkJICBhc3NpZ24tPnJocyA9CisJCSAgICAgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbG9naWNfYW5kLAorCQkJCQkJZ2xzbF90eXBlOjpib29sX3R5cGUsCisJCQkJCQljb25kX2V4cHItPmNsb25lKG1lbV9jdHgsIE5VTEwpLAorCQkJCQkJYXNzaWduLT5yaHMpOworCSAgICAgICB9IGVsc2UgeworCQkgIGFzc2lnbi0+Y29uZGl0aW9uID0gY29uZF9leHByLT5jbG9uZShtZW1fY3R4LCBOVUxMKTsKKwkgICAgICAgfQorCSAgICB9IGVsc2UgeworCSAgICAgICBhc3NpZ24tPmNvbmRpdGlvbiA9CisJCSAgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbG9naWNfYW5kLAorCQkJCQkgICAgIGdsc2xfdHlwZTo6Ym9vbF90eXBlLAorCQkJCQkgICAgIGNvbmRfZXhwci0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJCSAgICAgYXNzaWduLT5jb25kaXRpb24pOworCSAgICB9CisJIH0KKyAgICAgIH0KKworICAgICAgLyogTm93LCBtb3ZlIGZyb20gdGhlIGlmIGJsb2NrIHRvIHRoZSBibG9jayBzdXJyb3VuZGluZyBpdC4gKi8KKyAgICAgIGlyLT5yZW1vdmUoKTsKKyAgICAgIGlmX2lyLT5pbnNlcnRfYmVmb3JlKGlyKTsKKyAgIH0KK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2lmX3RvX2NvbmRfYXNzaWduX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2lmICppcikKK3sKKyAgICh2b2lkKSBpcjsKKyAgIHRoaXMtPmRlcHRoKys7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2lmX3RvX2NvbmRfYXNzaWduX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2lmICppcikKK3sKKyAgIC8qIE9ubHkgZmxhdHRlbiB3aGVuIGJleW9uZCB0aGUgR1BVJ3MgbWF4aW11bSBzdXBwb3J0ZWQgbmVzdGluZyBkZXB0aC4gKi8KKyAgIGlmICh0aGlzLT5kZXB0aC0tIDw9IHRoaXMtPm1heF9kZXB0aCkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgYm9vbCBmb3VuZF9jb250cm9sX2Zsb3cgPSBmYWxzZTsKKyAgIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbjsKKworICAgLyogQ2hlY2sgdGhhdCBib3RoIGJsb2NrcyBkb24ndCBjb250YWluIGFueXRoaW5nIHdlIGNhbid0IHN1cHBvcnQuICovCisgICBmb3JlYWNoX2xpc3QobiwgJmlyLT50aGVuX2luc3RydWN0aW9ucykgeworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKnRoZW5faXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKyAgICAgIHZpc2l0X3RyZWUodGhlbl9pciwgY2hlY2tfY29udHJvbF9mbG93LCAmZm91bmRfY29udHJvbF9mbG93KTsKKyAgIH0KKyAgIGZvcmVhY2hfbGlzdChuLCAmaXItPmVsc2VfaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqZWxzZV9pciA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworICAgICAgdmlzaXRfdHJlZShlbHNlX2lyLCBjaGVja19jb250cm9sX2Zsb3csICZmb3VuZF9jb250cm9sX2Zsb3cpOworICAgfQorICAgaWYgKGZvdW5kX2NvbnRyb2xfZmxvdykKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICAvKiBTdG9yZSB0aGUgY29uZGl0aW9uIHRvIGEgdmFyaWFibGUuICBNb3ZlIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZyb20KKyAgICAqIHRoZSB0aGVuLWNsYXVzZSBvZiB0aGUgaWYtc3RhdGVtZW50LiAgVXNlIHRoZSBjb25kaXRpb24gdmFyaWFibGUgYXMgYQorICAgICogY29uZGl0aW9uIGZvciBhbGwgYXNzaWdubWVudHMuCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB0aGVuX3ZhciA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjpib29sX3R5cGUsCisJCQkgICAgICAgImlmX3RvX2NvbmRfYXNzaWduX3RoZW4iLAorCQkJICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgaXItPmluc2VydF9iZWZvcmUodGhlbl92YXIpOworCisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqdGhlbl9jb25kID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0aGVuX3Zhcik7CisKKyAgIGFzc2lnbiA9IG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KHRoZW5fY29uZCwgaXItPmNvbmRpdGlvbik7CisgICBpci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworCisgICBtb3ZlX2Jsb2NrX3RvX2NvbmRfYXNzaWduKG1lbV9jdHgsIGlyLCB0aGVuX2NvbmQsCisJCQkgICAgICZpci0+dGhlbl9pbnN0cnVjdGlvbnMsCisJCQkgICAgIHRoaXMtPmNvbmRpdGlvbl92YXJpYWJsZXMpOworCisgICAvKiBBZGQgdGhlIG5ldyBjb25kaXRpb24gdmFyaWFibGUgdG8gdGhlIGhhc2ggdGFibGUuICBUaGlzIGFsbG93cyB1cyB0bworICAgICogZmluZCB0aGlzIHZhcmlhYmxlIHdoZW4gbG93ZXJpbmcgb3RoZXIgKGVuY2xvc2luZykgaWYtc3RhdGVtZW50cy4KKyAgICAqLworICAgaGFzaF90YWJsZV9pbnNlcnQodGhpcy0+Y29uZGl0aW9uX3ZhcmlhYmxlcywgdGhlbl92YXIsIHRoZW5fdmFyKTsKKworICAgLyogSWYgdGhlcmUgYXJlIGluc3RydWN0aW9ucyBpbiB0aGUgZWxzZS1jbGF1c2UsIHN0b3JlIHRoZSBpbnZlcnNlIG9mIHRoZQorICAgICogY29uZGl0aW9uIHRvIGEgdmFyaWFibGUuICBNb3ZlIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlCisgICAgKiBlbHNlLWNsYXVzZSBpZiB0aGUgaWYtc3RhdGVtZW50LiAgVXNlIHRoZSAoaW52ZXJzZSkgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgKiBhcyBhIGNvbmRpdGlvbiBmb3IgYWxsIGFzc2lnbm1lbnRzLgorICAgICovCisgICBpZiAoIWlyLT5lbHNlX2luc3RydWN0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgZWxzZV92YXIgPQorCSBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjpib29sX3R5cGUsCisJCQkJICAiaWZfdG9fY29uZF9hc3NpZ25fZWxzZSIsCisJCQkJICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgIGlyLT5pbnNlcnRfYmVmb3JlKGVsc2VfdmFyKTsKKworICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmVsc2VfY29uZCA9CisJIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShlbHNlX3Zhcik7CisKKyAgICAgIGlyX3J2YWx1ZSAqaW52ZXJzZSA9CisJIG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX3Vub3BfbG9naWNfbm90LAorCQkJCSAgICB0aGVuX2NvbmQtPmNsb25lKG1lbV9jdHgsIE5VTEwpKTsKKworICAgICAgYXNzaWduID0gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQoZWxzZV9jb25kLCBpbnZlcnNlKTsKKyAgICAgIGlyLT5pbnNlcnRfYmVmb3JlKGFzc2lnbik7CisKKyAgICAgIG1vdmVfYmxvY2tfdG9fY29uZF9hc3NpZ24obWVtX2N0eCwgaXIsIGVsc2VfY29uZCwKKwkJCQkmaXItPmVsc2VfaW5zdHJ1Y3Rpb25zLAorCQkJCXRoaXMtPmNvbmRpdGlvbl92YXJpYWJsZXMpOworCisgICAgICAvKiBBZGQgdGhlIG5ldyBjb25kaXRpb24gdmFyaWFibGUgdG8gdGhlIGhhc2ggdGFibGUuICBUaGlzIGFsbG93cyB1cyB0bworICAgICAgICogZmluZCB0aGlzIHZhcmlhYmxlIHdoZW4gbG93ZXJpbmcgb3RoZXIgKGVuY2xvc2luZykgaWYtc3RhdGVtZW50cy4KKyAgICAgICAqLworICAgICAgaGFzaF90YWJsZV9pbnNlcnQodGhpcy0+Y29uZGl0aW9uX3ZhcmlhYmxlcywgZWxzZV92YXIsIGVsc2VfdmFyKTsKKyAgIH0KKworICAgaXItPnJlbW92ZSgpOworCisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfaW5zdHJ1Y3Rpb25zLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfaW5zdHJ1Y3Rpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZkNjMwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9pbnN0cnVjdGlvbnMuY3BwCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsb3dlcl9pbnN0cnVjdGlvbnMuY3BwCisgKgorICogTWFueSBHUFVzIGxhY2sgbmF0aXZlIGluc3RydWN0aW9ucyBmb3IgY2VydGFpbiBleHByZXNzaW9uIG9wZXJhdGlvbnMsIGFuZAorICogbXVzdCByZXBsYWNlIHRoZW0gd2l0aCBzb21lIG90aGVyIGV4cHJlc3Npb24gdHJlZS4gIFRoaXMgcGFzcyBsb3dlcnMgc29tZQorICogb2YgdGhlIG1vc3QgY29tbW9uIGNhc2VzLCBhbGxvd2luZyB0aGUgbG93ZXJpbmcgY29kZSB0byBiZSBpbXBsZW1lbnRlZCBvbmNlCisgKiByYXRoZXIgdGhhbiBpbiBlYWNoIGRyaXZlciBiYWNrZW5kLgorICoKKyAqIEN1cnJlbnRseSBzdXBwb3J0ZWQgdHJhbnNmb3JtYXRpb25zOgorICogLSBTVUJfVE9fQUREX05FRworICogLSBESVZfVE9fTVVMX1JDUAorICogLSBJTlRfRElWX1RPX01VTF9SQ1AKKyAqIC0gRVhQX1RPX0VYUDIKKyAqIC0gUE9XX1RPX0VYUDIKKyAqIC0gTE9HX1RPX0xPRzIKKyAqIC0gTU9EX1RPX0ZSQUNUCisgKiAtIExERVhQX1RPX0FSSVRICisgKiAtIEJJVEZJRUxEX0lOU0VSVF9UT19CRk1fQkZJCisgKiAtIENBUlJZX1RPX0FSSVRICisgKiAtIEJPUlJPV19UT19BUklUSAorICoKKyAqIFNVQl9UT19BRERfTkVHOgorICogLS0tLS0tLS0tLS0tLS0tCisgKiBCcmVha3MgYW4gaXJfYmlub3Bfc3ViIGV4cHJlc3Npb24gZG93biB0byBhZGQob3AwLCBuZWcob3AxKSkKKyAqCisgKiBUaGlzIHNpbXBsaWZpZXMgZXhwcmVzc2lvbiByZWFzc29jaWF0aW9uLCBhbmQgZm9yIG1hbnkgYmFja2VuZHMKKyAqIHRoZXJlIGlzIG5vIHN1YnRyYWN0IG9wZXJhdGlvbiBzZXBhcmF0ZSBmcm9tIGFkZGluZyB0aGUgbmVnYXRpb24uCisgKiBGb3IgYmFja2VuZHMgd2l0aCBuYXRpdmUgc3VidHJhY3Qgb3BlcmF0aW9ucywgdGhleSB3aWxsIHByb2JhYmx5CisgKiB3YW50IHRvIHJlY29nbml6ZSBhZGQob3AwLCBuZWcob3AxKSkgb3IgdGhlIG90aGVyIHdheSBhcm91bmQgdG8KKyAqIHByb2R1Y2UgYSBzdWJ0cmFjdCBhbnl3YXkuCisgKgorICogRElWX1RPX01VTF9SQ1AgYW5kIElOVF9ESVZfVE9fTVVMX1JDUDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCcmVha3MgYW4gaXJfYmlub3BfZGl2IGV4cHJlc3Npb24gZG93biB0byBvcDAgKiAocmNwKG9wMSkpLgorICoKKyAqIE1hbnkgR1BVcyBkb24ndCBoYXZlIGEgZGl2aWRlIGluc3RydWN0aW9uICg5NDUgYW5kIDk2NSBpbmNsdWRlZCksCisgKiBidXQgdGhleSBkbyBoYXZlIGFuIFJDUCBpbnN0cnVjdGlvbiB0byBjb21wdXRlIGFuIGFwcHJveGltYXRlCisgKiByZWNpcHJvY2FsLiAgQnkgYnJlYWtpbmcgdGhlIG9wZXJhdGlvbiBkb3duLCBjb25zdGFudCByZWNpcHJvY2FscworICogY2FuIGdldCBjb25zdGFudCBmb2xkZWQuCisgKgorICogRElWX1RPX01VTF9SQ1Agb25seSBsb3dlcnMgZmxvYXRpbmcgcG9pbnQgZGl2aXNpb247IElOVF9ESVZfVE9fTVVMX1JDUAorICogaGFuZGxlcyB0aGUgaW50ZWdlciBjYXNlLCBjb252ZXJ0aW5nIHRvIGFuZCBmcm9tIGZsb2F0aW5nIHBvaW50IHNvIHRoYXQKKyAqIFJDUCBpcyBwb3NzaWJsZS4KKyAqCisgKiBFWFBfVE9fRVhQMiBhbmQgTE9HX1RPX0xPRzI6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNYW55IEdQVXMgZG9uJ3QgaGF2ZSBhIGJhc2UgZSBsb2cgb3IgZXhwb25lbnQgaW5zdHJ1Y3Rpb24sIGJ1dCB0aGV5CisgKiBkbyBoYXZlIGJhc2UgMiB2ZXJzaW9ucywgc28gdGhpcyBwYXNzIGNvbnZlcnRzIGV4cCBhbmQgbG9nIHRvIGV4cDIKKyAqIGFuZCBsb2cyIG9wZXJhdGlvbnMuCisgKgorICogUE9XX1RPX0VYUDI6CisgKiAtLS0tLS0tLS0tLQorICogTWFueSBvbGRlciBHUFVzIGRvbid0IGhhdmUgYW4geCoqeSBpbnN0cnVjdGlvbi4gIEZvciB0aGVzZSBHUFVzLCBjb252ZXJ0CisgKiB4Kip5IHRvIDIqKih5ICogbG9nMih4KSkuCisgKgorICogTU9EX1RPX0ZSQUNUOgorICogLS0tLS0tLS0tLS0tLQorICogQnJlYWtzIGFuIGlyX2Jpbm9wX21vZCBleHByZXNzaW9uIGRvd24gdG8gKG9wMSAqIGZyYWN0KG9wMCAvIG9wMSkpCisgKgorICogTWFueSBHUFVzIGRvbid0IGhhdmUgYSBNT0QgaW5zdHJ1Y3Rpb24gKDk0NSBhbmQgOTY1IGluY2x1ZGVkKSwgYW5kCisgKiBpZiB3ZSBoYXZlIHRvIGJyZWFrIGl0IGRvd24gbGlrZSB0aGlzIGFueXdheSwgaXQgZ2l2ZXMgYW4KKyAqIG9wcG9ydHVuaXR5IHRvIGRvIHRoaW5ncyBsaWtlIGNvbnN0YW50IGZvbGQgdGhlICgxLjAgLyBvcDEpIGVhc2lseS4KKyAqCisgKiBMREVYUF9UT19BUklUSDoKKyAqIC0tLS0tLS0tLS0tLS0KKyAqIENvbnZlcnRzIGlyX2Jpbm9wX2xkZXhwIHRvIGFyaXRobWV0aWMgYW5kIGJpdCBvcGVyYXRpb25zLgorICoKKyAqIEJJVEZJRUxEX0lOU0VSVF9UT19CRk1fQkZJOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCcmVha3MgaXJfcXVhZG9wX2JpdGZpZWxkX2luc2VydCBpbnRvIGlyX2Jpbm9wX2JmbSAoYml0ZmllbGQgbWFzaykgYW5kCisgKiBpcl90cmlvcF9iZmkgKGJpdGZpZWxkIGluc2VydCkuCisgKgorICogTWFueSBHUFVzIGltcGxlbWVudCB0aGUgYml0ZmllbGRJbnNlcnQoKSBidWlsdC1pbiBmcm9tIEFSQl9ncHVfc2hhZGVyXzUKKyAqIHdpdGggYSBwYWlyIG9mIGluc3RydWN0aW9ucy4KKyAqCisgKiBDQVJSWV9UT19BUklUSDoKKyAqIC0tLS0tLS0tLS0tLS0tLQorICogQ29udmVydHMgaXJfY2FycnkgaW50byAoeCArIHkpIDwgeC4KKyAqCisgKiBCT1JST1dfVE9fQVJJVEg6CisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKiBDb252ZXJ0cyBpcl9ib3Jyb3cgaW50byAoeCA8IHkpLgorICoKKyAqLworCisjaW5jbHVkZSAibGliZm5zLmgiIC8vIEx1bmFyRyBBREQ6CisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfYnVpbGRlci5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorCit1c2luZyBuYW1lc3BhY2UgaXJfYnVpbGRlcjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgbG93ZXJfaW5zdHJ1Y3Rpb25zX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgbG93ZXJfaW5zdHJ1Y3Rpb25zX3Zpc2l0b3IodW5zaWduZWQgbG93ZXIpCisgICAgICA6IHByb2dyZXNzKGZhbHNlKSwgbG93ZXIobG93ZXIpIHsgfQorCisgICBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9leHByZXNzaW9uICopOworCisgICBib29sIHByb2dyZXNzOworCitwcml2YXRlOgorICAgdW5zaWduZWQgbG93ZXI7IC8qKiBCaXRmaWVsZCBvZiB3aGljaCBvcGVyYXRpb25zIHRvIGxvd2VyICovCisKKyAgIHZvaWQgc3ViX3RvX2FkZF9uZWcoaXJfZXhwcmVzc2lvbiAqKTsKKyAgIHZvaWQgZGl2X3RvX211bF9yY3AoaXJfZXhwcmVzc2lvbiAqKTsKKyAgIHZvaWQgaW50X2Rpdl90b19tdWxfcmNwKGlyX2V4cHJlc3Npb24gKik7CisgICB2b2lkIG1vZF90b19mcmFjdChpcl9leHByZXNzaW9uICopOworICAgdm9pZCBleHBfdG9fZXhwMihpcl9leHByZXNzaW9uICopOworICAgdm9pZCBwb3dfdG9fZXhwMihpcl9leHByZXNzaW9uICopOworICAgdm9pZCBsb2dfdG9fbG9nMihpcl9leHByZXNzaW9uICopOworICAgdm9pZCBiaXRmaWVsZF9pbnNlcnRfdG9fYmZtX2JmaShpcl9leHByZXNzaW9uICopOworICAgdm9pZCBsZGV4cF90b19hcml0aChpcl9leHByZXNzaW9uICopOworICAgdm9pZCBjYXJyeV90b19hcml0aChpcl9leHByZXNzaW9uICopOworICAgdm9pZCBib3Jyb3dfdG9fYXJpdGgoaXJfZXhwcmVzc2lvbiAqKTsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCisvKioKKyAqIERldGVybWluZSBpZiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBsb3dlcmluZyBzaG91bGQgb2NjdXIKKyAqLworI2RlZmluZSBsb3dlcmluZyh4KSAodGhpcy0+bG93ZXIgJiB4KQorCitib29sCitsb3dlcl9pbnN0cnVjdGlvbnMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIHVuc2lnbmVkIHdoYXRfdG9fbG93ZXIpCit7CisgICBsb3dlcl9pbnN0cnVjdGlvbnNfdmlzaXRvciB2KHdoYXRfdG9fbG93ZXIpOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CisKK3ZvaWQKK2xvd2VyX2luc3RydWN0aW9uc192aXNpdG9yOjpzdWJfdG9fYWRkX25lZyhpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlyLT5vcGVyYXRpb24gPSBpcl9iaW5vcF9hZGQ7CisgICBpci0+b3BlcmFuZHNbMV0gPSBuZXcoaXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9uZWcsIGlyLT5vcGVyYW5kc1sxXS0+dHlwZSwKKwkJCQkJICAgaXItPm9wZXJhbmRzWzFdLCBOVUxMKTsKKyAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKK30KKwordm9pZAorbG93ZXJfaW5zdHJ1Y3Rpb25zX3Zpc2l0b3I6OmRpdl90b19tdWxfcmNwKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgYXNzZXJ0KGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+aXNfZmxvYXQoKSk7CisKKyAgIC8qIE5ldyBleHByZXNzaW9uIGZvciB0aGUgMS4wIC8gb3AxICovCisgICBpcl9ydmFsdWUgKmV4cHI7CisgICBleHByID0gbmV3KGlyKSBpcl9leHByZXNzaW9uKGlyX3Vub3BfcmNwLAorCQkJCWlyLT5vcGVyYW5kc1sxXS0+dHlwZSwKKwkJCQlpci0+b3BlcmFuZHNbMV0pOworCisgICAvKiBvcDAgLyBvcDEgLT4gb3AwICogKDEuMCAvIG9wMSkgKi8KKyAgIGlyLT5vcGVyYXRpb24gPSBpcl9iaW5vcF9tdWw7CisgICBpci0+b3BlcmFuZHNbMV0gPSBleHByOworCisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7Cit9CisKK3ZvaWQKK2xvd2VyX2luc3RydWN0aW9uc192aXNpdG9yOjppbnRfZGl2X3RvX211bF9yY3AoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICBhc3NlcnQoaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc19pbnRlZ2VyKCkpOworCisgICAvKiBCZSBjYXJlZnVsIHdpdGggaW50ZWdlciBkaXZpc2lvbiAtLSB3ZSBuZWVkIHRvIGRvIGl0IGFzIGEKKyAgICAqIGZsb2F0IGFuZCByZS10cnVuY2F0ZSwgc2luY2UgcmNwKG4gPiAxKSBvZiBhbiBpbnRlZ2VyIHdvdWxkCisgICAgKiBqdXN0IGJlIDAuCisgICAgKi8KKyAgIGlyX3J2YWx1ZSAqb3AwLCAqb3AxOworICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdmVjX3R5cGU7CisKKyAgIHZlY190eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0ZMT0FULAorCQkJCSAgICAgIGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzLAorCQkJCSAgICAgIGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+bWF0cml4X2NvbHVtbnMpOworCisgICBpZiAoaXItPm9wZXJhbmRzWzFdLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCkKKyAgICAgIG9wMSA9IG5ldyhpcikgaXJfZXhwcmVzc2lvbihpcl91bm9wX2kyZiwgdmVjX3R5cGUsIGlyLT5vcGVyYW5kc1sxXSwgTlVMTCk7CisgICBlbHNlCisgICAgICBvcDEgPSBuZXcoaXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF91MmYsIHZlY190eXBlLCBpci0+b3BlcmFuZHNbMV0sIE5VTEwpOworCisgICBvcDEgPSBuZXcoaXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9yY3AsIG9wMS0+dHlwZSwgb3AxLCBOVUxMKTsKKworICAgdmVjX3R5cGUgPSBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShHTFNMX1RZUEVfRkxPQVQsCisJCQkJICAgICAgaXItPm9wZXJhbmRzWzBdLT50eXBlLT52ZWN0b3JfZWxlbWVudHMsCisJCQkJICAgICAgaXItPm9wZXJhbmRzWzBdLT50eXBlLT5tYXRyaXhfY29sdW1ucyk7CisKKyAgIGlmIChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKQorICAgICAgb3AwID0gbmV3KGlyKSBpcl9leHByZXNzaW9uKGlyX3Vub3BfaTJmLCB2ZWNfdHlwZSwgaXItPm9wZXJhbmRzWzBdLCBOVUxMKTsKKyAgIGVsc2UKKyAgICAgIG9wMCA9IG5ldyhpcikgaXJfZXhwcmVzc2lvbihpcl91bm9wX3UyZiwgdmVjX3R5cGUsIGlyLT5vcGVyYW5kc1swXSwgTlVMTCk7CisKKyAgIHZlY190eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0ZMT0FULAorCQkJCSAgICAgIGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHMsCisJCQkJICAgICAgaXItPnR5cGUtPm1hdHJpeF9jb2x1bW5zKTsKKworICAgb3AwID0gbmV3KGlyKSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX211bCwgdmVjX3R5cGUsIG9wMCwgb3AxKTsKKworICAgaWYgKGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpIHsKKyAgICAgIGlyLT5vcGVyYXRpb24gPSBpcl91bm9wX2YyaTsKKyAgICAgIGlyLT5vcGVyYW5kc1swXSA9IG9wMDsKKyAgIH0gZWxzZSB7CisgICAgICBpci0+b3BlcmF0aW9uID0gaXJfdW5vcF9pMnU7CisgICAgICBpci0+b3BlcmFuZHNbMF0gPSBuZXcoaXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9mMmksIG9wMCk7CisgICB9CisgICBpci0+b3BlcmFuZHNbMV0gPSBOVUxMOworCisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7Cit9CisKK3ZvaWQKK2xvd2VyX2luc3RydWN0aW9uc192aXNpdG9yOjpleHBfdG9fZXhwMihpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlyX2NvbnN0YW50ICpsb2cyX2UgPSBuZXcoaXIpIGlyX2NvbnN0YW50KGZsb2F0KE1fTE9HMkUpKTsKKworICAgaXItPm9wZXJhdGlvbiA9IGlyX3Vub3BfZXhwMjsKKyAgIGlyLT5vcGVyYW5kc1swXSA9IG5ldyhpcikgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tdWwsIGlyLT5vcGVyYW5kc1swXS0+dHlwZSwKKwkJCQkJICAgaXItPm9wZXJhbmRzWzBdLCBsb2cyX2UpOworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworfQorCit2b2lkCitsb3dlcl9pbnN0cnVjdGlvbnNfdmlzaXRvcjo6cG93X3RvX2V4cDIoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICBpcl9leHByZXNzaW9uICpjb25zdCBsb2cyX3ggPQorICAgICAgbmV3KGlyKSBpcl9leHByZXNzaW9uKGlyX3Vub3BfbG9nMiwgaXItPm9wZXJhbmRzWzBdLT50eXBlLAorCQkJICAgIGlyLT5vcGVyYW5kc1swXSk7CisKKyAgIGlyLT5vcGVyYXRpb24gPSBpcl91bm9wX2V4cDI7CisgICBpci0+b3BlcmFuZHNbMF0gPSBuZXcoaXIpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbXVsLCBpci0+b3BlcmFuZHNbMV0tPnR5cGUsCisJCQkJCSAgIGlyLT5vcGVyYW5kc1sxXSwgbG9nMl94KTsKKyAgIGlyLT5vcGVyYW5kc1sxXSA9IE5VTEw7CisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7Cit9CisKK3ZvaWQKK2xvd2VyX2luc3RydWN0aW9uc192aXNpdG9yOjpsb2dfdG9fbG9nMihpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlyLT5vcGVyYXRpb24gPSBpcl9iaW5vcF9tdWw7CisgICBpci0+b3BlcmFuZHNbMF0gPSBuZXcoaXIpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9sb2cyLCBpci0+b3BlcmFuZHNbMF0tPnR5cGUsCisJCQkJCSAgIGlyLT5vcGVyYW5kc1swXSwgTlVMTCk7CisgICBpci0+b3BlcmFuZHNbMV0gPSBuZXcoaXIpIGlyX2NvbnN0YW50KGZsb2F0KDEuMCAvIE1fTE9HMkUpKTsKKyAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKK30KKwordm9pZAorbG93ZXJfaW5zdHJ1Y3Rpb25zX3Zpc2l0b3I6Om1vZF90b19mcmFjdChpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlyX3ZhcmlhYmxlICp0ZW1wID0gbmV3KGlyKSBpcl92YXJpYWJsZShpci0+b3BlcmFuZHNbMV0tPnR5cGUsICJtb2RfYiIsCisJCQkJCSAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgdGhpcy0+YmFzZV9pci0+aW5zZXJ0X2JlZm9yZSh0ZW1wKTsKKworICAgaXJfYXNzaWdubWVudCAqY29uc3QgYXNzaWduID0KKyAgICAgIG5ldyhpcikgaXJfYXNzaWdubWVudChuZXcoaXIpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRlbXApLAorCQkJICAgIGlyLT5vcGVyYW5kc1sxXSwgTlVMTCk7CisKKyAgIHRoaXMtPmJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKKworICAgaXJfZXhwcmVzc2lvbiAqY29uc3QgZGl2X2V4cHIgPQorICAgICAgbmV3KGlyKSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX2RpdiwgaXItPm9wZXJhbmRzWzBdLT50eXBlLAorCQkJICAgIGlyLT5vcGVyYW5kc1swXSwKKwkJCSAgICBuZXcoaXIpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRlbXApKTsKKworICAgLyogRG9uJ3QgZ2VuZXJhdGUgbmV3IElSIHRoYXQgd291bGQgbmVlZCB0byBiZSBsb3dlcmVkIGluIGFuIGFkZGl0aW9uYWwKKyAgICAqIHBhc3MuCisgICAgKi8KKyAgIGlmIChsb3dlcmluZyhESVZfVE9fTVVMX1JDUCkpCisgICAgICBkaXZfdG9fbXVsX3JjcChkaXZfZXhwcik7CisKKyAgIGlyX3J2YWx1ZSAqZXhwciA9IG5ldyhpcikgaXJfZXhwcmVzc2lvbihpcl91bm9wX2ZyYWN0LAorCQkJCQkgICBpci0+b3BlcmFuZHNbMF0tPnR5cGUsCisJCQkJCSAgIGRpdl9leHByLAorCQkJCQkgICBOVUxMKTsKKworICAgaXItPm9wZXJhdGlvbiA9IGlyX2Jpbm9wX211bDsKKyAgIGlyLT5vcGVyYW5kc1swXSA9IG5ldyhpcikgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGVtcCk7CisgICBpci0+b3BlcmFuZHNbMV0gPSBleHByOworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworfQorCit2b2lkCitsb3dlcl9pbnN0cnVjdGlvbnNfdmlzaXRvcjo6Yml0ZmllbGRfaW5zZXJ0X3RvX2JmbV9iZmkoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICAvKiBUcmFuc2xhdGVzCisgICAgKiAgICBpcl9xdWFkb3BfYml0ZmllbGRfaW5zZXJ0IGJhc2UgaW5zZXJ0IG9mZnNldCBiaXRzCisgICAgKiBpbnRvCisgICAgKiAgICBpcl90cmlvcF9iZmkgKGlyX2Jpbm9wX2JmbSBiaXRzIG9mZnNldCkgaW5zZXJ0IGJhc2UKKyAgICAqLworCisgICBpcl9ydmFsdWUgKmJhc2VfZXhwciA9IGlyLT5vcGVyYW5kc1swXTsKKworICAgaXItPm9wZXJhdGlvbiA9IGlyX3RyaW9wX2JmaTsKKyAgIGlyLT5vcGVyYW5kc1swXSA9IG5ldyhpcikgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9iZm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXItPnR5cGUtPmdldF9iYXNlX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpci0+b3BlcmFuZHNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXItPm9wZXJhbmRzWzJdKTsKKyAgIC8qIGlyLT5vcGVyYW5kc1sxXSBpcyBzdGlsbCB0aGUgdmFsdWUgdG8gaW5zZXJ0LiAqLworICAgaXItPm9wZXJhbmRzWzJdID0gYmFzZV9leHByOworICAgaXItPm9wZXJhbmRzWzNdID0gTlVMTDsKKworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworfQorCit2b2lkCitsb3dlcl9pbnN0cnVjdGlvbnNfdmlzaXRvcjo6bGRleHBfdG9fYXJpdGgoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICAvKiBUcmFuc2xhdGVzCisgICAgKiAgICBpcl9iaW5vcF9sZGV4cCB4IGV4cAorICAgICogaW50bworICAgICoKKyAgICAqICAgIGV4dHJhY3RlZF9iaWFzZWRfZXhwID0gcnNoaWZ0KGJpdGNhc3RfZjJpKGFicyh4KSksIGV4cF9zaGlmdCk7CisgICAgKiAgICByZXN1bHRpbmdfYmlhc2VkX2V4cCA9IGV4dHJhY3RlZF9iaWFzZWRfZXhwICsgZXhwOworICAgICoKKyAgICAqICAgIGlmIChyZXN1bHRpbmdfYmlhc2VkX2V4cCA8IDEpIHsKKyAgICAqICAgICAgIHJldHVybiBjb3B5c2lnbigwLjAsIHgpOworICAgICogICAgfQorICAgICoKKyAgICAqICAgIHJldHVybiBiaXRjYXN0X3UyZigoYml0Y2FzdF9mMnUoeCkgJiBzaWduX21hbnRpc3NhX21hc2spIHwKKyAgICAqICAgICAgICAgICAgICAgICAgICAgICBsc2hpZnQoaTJ1KHJlc3VsdGluZ19iaWFzZWRfZXhwKSwgZXhwX3NoaWZ0KSk7CisgICAgKgorICAgICogd2hpY2ggd2UgY2FuJ3QgYWN0dWFsbHkgaW1wbGVtZW50IGFzIHN1Y2gsIHNpbmNlIHRoZSBHTFNMIElSIGRvZXNuJ3QKKyAgICAqIGhhdmUgdmVjdG9yaXplZCBpZi1zdGF0ZW1lbnRzLiBXZSBhY3R1YWxseSBpbXBsZW1lbnQgaXQgd2l0aG91dCBicmFuY2hlcworICAgICogdXNpbmcgY29uZGl0aW9uYWwtc2VsZWN0OgorICAgICoKKyAgICAqICAgIGV4dHJhY3RlZF9iaWFzZWRfZXhwID0gcnNoaWZ0KGJpdGNhc3RfZjJpKGFicyh4KSksIGV4cF9zaGlmdCk7CisgICAgKiAgICByZXN1bHRpbmdfYmlhc2VkX2V4cCA9IGV4dHJhY3RlZF9iaWFzZWRfZXhwICsgZXhwOworICAgICoKKyAgICAqICAgIGlzX25vdF96ZXJvX29yX3VuZGVyZmxvdyA9IGdlcXVhbChyZXN1bHRpbmdfYmlhc2VkX2V4cCwgMSk7CisgICAgKiAgICB4ID0gY3NlbChpc19ub3RfemVyb19vcl91bmRlcmZsb3csIHgsIGNvcHlzaWduKDAuMGYsIHgpKTsKKyAgICAqICAgIHJlc3VsdGluZ19iaWFzZWRfZXhwID0gY3NlbChpc19ub3RfemVyb19vcl91bmRlcmZsb3csCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nX2JpYXNlZF9leHAsIDApOworICAgICoKKyAgICAqICAgIHJldHVybiBiaXRjYXN0X3UyZigoYml0Y2FzdF9mMnUoeCkgJiBzaWduX21hbnRpc3NhX21hc2spIHwKKyAgICAqICAgICAgICAgICAgICAgICAgICAgICBsc2hpZnQoaTJ1KHJlc3VsdGluZ19iaWFzZWRfZXhwKSwgZXhwX3NoaWZ0KSk7CisgICAgKi8KKworICAgY29uc3QgdW5zaWduZWQgdmVjX2VsZW0gPSBpci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOworCisgICAvKiBUeXBlcyAqLworICAgY29uc3QgZ2xzbF90eXBlICppdmVjID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0lOVCwgdmVjX2VsZW0sIDEpOworICAgY29uc3QgZ2xzbF90eXBlICpidmVjID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0JPT0wsIHZlY19lbGVtLCAxKTsKKworICAgLyogQ29uc3RhbnRzICovCisgICBpcl9jb25zdGFudCAqemVyb2kgPSBpcl9jb25zdGFudDo6emVybyhpciwgaXZlYyk7CisKKyAgIGlyX2NvbnN0YW50ICpzaWduX21hc2sgPSBuZXcoaXIpIGlyX2NvbnN0YW50KDB4ODAwMDAwMDB1LCB2ZWNfZWxlbSk7CisKKyAgIGlyX2NvbnN0YW50ICpleHBfc2hpZnQgPSBuZXcoaXIpIGlyX2NvbnN0YW50KDIzKTsKKyAgIGlyX2NvbnN0YW50ICpleHBfd2lkdGggPSBuZXcoaXIpIGlyX2NvbnN0YW50KDgpOworCisgICAvKiBUZW1wb3JhcnkgdmFyaWFibGVzICovCisgICBpcl92YXJpYWJsZSAqeCA9IG5ldyhpcikgaXJfdmFyaWFibGUoaXItPnR5cGUsICJ4IiwgaXJfdmFyX3RlbXBvcmFyeSk7CisgICBpcl92YXJpYWJsZSAqZXhwID0gbmV3KGlyKSBpcl92YXJpYWJsZShpdmVjLCAiZXhwIiwgaXJfdmFyX3RlbXBvcmFyeSk7CisKKyAgIGlyX3ZhcmlhYmxlICp6ZXJvX3NpZ25feCA9IG5ldyhpcikgaXJfdmFyaWFibGUoaXItPnR5cGUsICJ6ZXJvX3NpZ25feCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworCisgICBpcl92YXJpYWJsZSAqZXh0cmFjdGVkX2JpYXNlZF9leHAgPQorICAgICAgbmV3KGlyKSBpcl92YXJpYWJsZShpdmVjLCAiZXh0cmFjdGVkX2JpYXNlZF9leHAiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGlyX3ZhcmlhYmxlICpyZXN1bHRpbmdfYmlhc2VkX2V4cCA9CisgICAgICBuZXcoaXIpIGlyX3ZhcmlhYmxlKGl2ZWMsICJyZXN1bHRpbmdfYmlhc2VkX2V4cCIsIGlyX3Zhcl90ZW1wb3JhcnkpOworCisgICBpcl92YXJpYWJsZSAqaXNfbm90X3plcm9fb3JfdW5kZXJmbG93ID0KKyAgICAgIG5ldyhpcikgaXJfdmFyaWFibGUoYnZlYywgImlzX25vdF96ZXJvX29yX3VuZGVyZmxvdyIsIGlyX3Zhcl90ZW1wb3JhcnkpOworCisgICBpcl9pbnN0cnVjdGlvbiAmaSA9ICpiYXNlX2lyOworCisgICAvKiBDb3B5IDx4PiBhbmQgPGV4cD4gYXJndW1lbnRzLiAqLworICAgaS5pbnNlcnRfYmVmb3JlKHgpOworICAgaS5pbnNlcnRfYmVmb3JlKGFzc2lnbih4LCBpci0+b3BlcmFuZHNbMF0pKTsKKyAgIGkuaW5zZXJ0X2JlZm9yZShleHApOworICAgaS5pbnNlcnRfYmVmb3JlKGFzc2lnbihleHAsIGlyLT5vcGVyYW5kc1sxXSkpOworCisgICAvKiBFeHRyYWN0IHRoZSBiaWFzZWQgZXhwb25lbnQgZnJvbSA8eD4uICovCisgICBpLmluc2VydF9iZWZvcmUoZXh0cmFjdGVkX2JpYXNlZF9leHApOworICAgaS5pbnNlcnRfYmVmb3JlKGFzc2lnbihleHRyYWN0ZWRfYmlhc2VkX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnNoaWZ0KGJpdGNhc3RfZjJpKGFicyh4KSksIGV4cF9zaGlmdCkpKTsKKworICAgaS5pbnNlcnRfYmVmb3JlKHJlc3VsdGluZ19iaWFzZWRfZXhwKTsKKyAgIGkuaW5zZXJ0X2JlZm9yZShhc3NpZ24ocmVzdWx0aW5nX2JpYXNlZF9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZChleHRyYWN0ZWRfYmlhc2VkX2V4cCwgZXhwKSkpOworCisgICAvKiBUZXN0IGlmIHJlc3VsdCBpcyDCsTAuMCwgc3Vibm9ybWFsLCBvciB1bmRlcmZsb3cgYnkgY2hlY2tpbmcgaWYgdGhlCisgICAgKiByZXN1bHRpbmcgYmlhc2VkIGV4cG9uZW50IHdvdWxkIGJlIGxlc3MgdGhhbiAweDEuIElmIHNvLCB0aGUgcmVzdWx0IGlzCisgICAgKiAwLjAgd2l0aCB0aGUgc2lnbiBvZiB4LiAoQWN0dWFsbHksIGludmVydCB0aGUgY29uZGl0aW9ucyBzbyB0aGF0CisgICAgKiBpbW1lZGlhdGUgdmFsdWVzIGFyZSB0aGUgc2Vjb25kIGFyZ3VtZW50cywgd2hpY2ggaXMgYmV0dGVyIGZvciBpOTY1KQorICAgICovCisgICBpLmluc2VydF9iZWZvcmUoemVyb19zaWduX3gpOworICAgaS5pbnNlcnRfYmVmb3JlKGFzc2lnbih6ZXJvX3NpZ25feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYml0Y2FzdF91MmYoYml0X2FuZChiaXRjYXN0X2YydSh4KSwgc2lnbl9tYXNrKSkpKTsKKworICAgaS5pbnNlcnRfYmVmb3JlKGlzX25vdF96ZXJvX29yX3VuZGVyZmxvdyk7CisgICBpLmluc2VydF9iZWZvcmUoYXNzaWduKGlzX25vdF96ZXJvX29yX3VuZGVyZmxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VxdWFsKHJlc3VsdGluZ19iaWFzZWRfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyhpcikgaXJfY29uc3RhbnQoMHgxLCB2ZWNfZWxlbSkpKSk7CisgICBpLmluc2VydF9iZWZvcmUoYXNzaWduKHgsIGNzZWwoaXNfbm90X3plcm9fb3JfdW5kZXJmbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHplcm9fc2lnbl94KSkpOworICAgaS5pbnNlcnRfYmVmb3JlKGFzc2lnbihyZXN1bHRpbmdfYmlhc2VkX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3NlbChpc19ub3RfemVyb19vcl91bmRlcmZsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nX2JpYXNlZF9leHAsIHplcm9pKSkpOworCisgICAvKiBXZSBjb3VsZCB0ZXN0IGZvciBvdmVyZmxvd3MgYnkgY2hlY2tpbmcgaWYgdGhlIHJlc3VsdGluZyBiaWFzZWQgZXhwb25lbnQKKyAgICAqIHdvdWxkIGJlIGdyZWF0ZXIgdGhhbiAweEZFLiBUdXJucyBvdXQgd2UgZG9uJ3QgbmVlZCB0byBiZWNhdXNlIHRoZSBHTFNMCisgICAgKiBzcGVjIHNheXM6CisgICAgKgorICAgICogICAgIklmIHRoaXMgcHJvZHVjdCBpcyB0b28gbGFyZ2UgdG8gYmUgcmVwcmVzZW50ZWQgaW4gdGhlCisgICAgKiAgICAgZmxvYXRpbmctcG9pbnQgdHlwZSwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuIgorICAgICovCisKKyAgIGlyX2NvbnN0YW50ICpleHBfc2hpZnRfY2xvbmUgPSBleHBfc2hpZnQtPmNsb25lKGlyLCBOVUxMKTsKKyAgIGlyLT5vcGVyYXRpb24gPSBpcl91bm9wX2JpdGNhc3RfaTJmOworICAgaXItPm9wZXJhbmRzWzBdID0gYml0ZmllbGRfaW5zZXJ0KGJpdGNhc3RfZjJpKHgpLCByZXN1bHRpbmdfYmlhc2VkX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBfc2hpZnRfY2xvbmUsIGV4cF93aWR0aCk7CisgICBpci0+b3BlcmFuZHNbMV0gPSBOVUxMOworCisgICAvKiBEb24ndCBnZW5lcmF0ZSBuZXcgSVIgdGhhdCB3b3VsZCBuZWVkIHRvIGJlIGxvd2VyZWQgaW4gYW4gYWRkaXRpb25hbAorICAgICogcGFzcy4KKyAgICAqLworICAgaWYgKGxvd2VyaW5nKEJJVEZJRUxEX0lOU0VSVF9UT19CRk1fQkZJKSkKKyAgICAgIGJpdGZpZWxkX2luc2VydF90b19iZm1fYmZpKGlyLT5vcGVyYW5kc1swXS0+YXNfZXhwcmVzc2lvbigpKTsKKworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworfQorCit2b2lkCitsb3dlcl9pbnN0cnVjdGlvbnNfdmlzaXRvcjo6Y2FycnlfdG9fYXJpdGgoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICAvKiBUcmFuc2xhdGVzCisgICAgKiAgIGlyX2Jpbm9wX2NhcnJ5IHggeQorICAgICogaW50bworICAgICogICBzdW0gPSBpcl9iaW5vcF9hZGQgeCB5CisgICAgKiAgIGJjYXJyeSA9IGlyX2Jpbm9wX2xlc3Mgc3VtIHgKKyAgICAqICAgY2FycnkgPSBpcl91bm9wX2IyaSBiY2FycnkKKyAgICAqLworCisgICBpcl9ydmFsdWUgKnhfY2xvbmUgPSBpci0+b3BlcmFuZHNbMF0tPmNsb25lKGlyLCBOVUxMKTsKKyAgIGlyLT5vcGVyYXRpb24gPSBpcl91bm9wX2kydTsKKyAgIGlyLT5vcGVyYW5kc1swXSA9IGIyaShsZXNzKGFkZChpci0+b3BlcmFuZHNbMF0sIGlyLT5vcGVyYW5kc1sxXSksIHhfY2xvbmUpKTsKKyAgIGlyLT5vcGVyYW5kc1sxXSA9IE5VTEw7CisKKyAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKK30KKwordm9pZAorbG93ZXJfaW5zdHJ1Y3Rpb25zX3Zpc2l0b3I6OmJvcnJvd190b19hcml0aChpcl9leHByZXNzaW9uICppcikKK3sKKyAgIC8qIFRyYW5zbGF0ZXMKKyAgICAqICAgaXJfYmlub3BfYm9ycm93IHggeQorICAgICogaW50bworICAgICogICBiY2FycnkgPSBpcl9iaW5vcF9sZXNzIHggeQorICAgICogICBjYXJyeSA9IGlyX3Vub3BfYjJpIGJjYXJyeQorICAgICovCisKKyAgIGlyLT5vcGVyYXRpb24gPSBpcl91bm9wX2kydTsKKyAgIGlyLT5vcGVyYW5kc1swXSA9IGIyaShsZXNzKGlyLT5vcGVyYW5kc1swXSwgaXItPm9wZXJhbmRzWzFdKSk7CisgICBpci0+b3BlcmFuZHNbMV0gPSBOVUxMOworCisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitsb3dlcl9pbnN0cnVjdGlvbnNfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICBzd2l0Y2ggKGlyLT5vcGVyYXRpb24pIHsKKyAgIGNhc2UgaXJfYmlub3Bfc3ViOgorICAgICAgaWYgKGxvd2VyaW5nKFNVQl9UT19BRERfTkVHKSkKKwkgc3ViX3RvX2FkZF9uZWcoaXIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfZGl2OgorICAgICAgaWYgKGlyLT5vcGVyYW5kc1sxXS0+dHlwZS0+aXNfaW50ZWdlcigpICYmIGxvd2VyaW5nKElOVF9ESVZfVE9fTVVMX1JDUCkpCisJIGludF9kaXZfdG9fbXVsX3JjcChpcik7CisgICAgICBlbHNlIGlmIChpci0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX2Zsb2F0KCkgJiYgbG93ZXJpbmcoRElWX1RPX01VTF9SQ1ApKQorCSBkaXZfdG9fbXVsX3JjcChpcik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2V4cDoKKyAgICAgIGlmIChsb3dlcmluZyhFWFBfVE9fRVhQMikpCisJIGV4cF90b19leHAyKGlyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfbG9nOgorICAgICAgaWYgKGxvd2VyaW5nKExPR19UT19MT0cyKSkKKwkgbG9nX3RvX2xvZzIoaXIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbW9kOgorICAgICAgaWYgKGxvd2VyaW5nKE1PRF9UT19GUkFDVCkgJiYgaXItPnR5cGUtPmlzX2Zsb2F0KCkpCisJIG1vZF90b19mcmFjdChpcik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9wb3c6CisgICAgICBpZiAobG93ZXJpbmcoUE9XX1RPX0VYUDIpKQorCSBwb3dfdG9fZXhwMihpcik7CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9xdWFkb3BfYml0ZmllbGRfaW5zZXJ0OgorICAgICAgaWYgKGxvd2VyaW5nKEJJVEZJRUxEX0lOU0VSVF9UT19CRk1fQkZJKSkKKyAgICAgICAgIGJpdGZpZWxkX2luc2VydF90b19iZm1fYmZpKGlyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2xkZXhwOgorICAgICAgaWYgKGxvd2VyaW5nKExERVhQX1RPX0FSSVRIKSkKKyAgICAgICAgIGxkZXhwX3RvX2FyaXRoKGlyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2NhcnJ5OgorICAgICAgaWYgKGxvd2VyaW5nKENBUlJZX1RPX0FSSVRIKSkKKyAgICAgICAgIGNhcnJ5X3RvX2FyaXRoKGlyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX2JvcnJvdzoKKyAgICAgIGlmIChsb3dlcmluZyhCT1JST1dfVE9fQVJJVEgpKQorICAgICAgICAgYm9ycm93X3RvX2FyaXRoKGlyKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX2p1bXBzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfanVtcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjY1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX2p1bXBzLmNwcApAQCAtMCwwICsxLDEwMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBMdWNhIEJhcmJpZXJpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgbG93ZXJfanVtcHMuY3BwCisgKgorICogVGhpcyBwYXNzIGxvd2VycyBqdW1wcyAoYnJlYWssIGNvbnRpbnVlLCBhbmQgcmV0dXJuKSB0byBpZi9lbHNlIHN0cnVjdHVyZXMuCisgKgorICogSXQgY2FuIGJlIGFza2VkIHRvOgorICogMS4gUHVsbCBqdW1wcyBvdXQgb2YgaWZzIHdoZXJlIHBvc3NpYmxlCisgKiAyLiBSZW1vdmUgYWxsICJjb250aW51ZSJzLCByZXBsYWNpbmcgdGhlbSB3aXRoIGFuICJleGVjdXRlIGZsYWciCisgKiAzLiBSZXBsYWNlIGFsbCAiYnJlYWsiIHdpdGggYSBzaW5nbGUgY29uZGl0aW9uYWwgb25lIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AKKyAqIDQuIFJlcGxhY2UgYWxsICJyZXR1cm4icyB3aXRoIGEgc2luZ2xlIHJldHVybiBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwKKyAqICAgIGZvciB0aGUgbWFpbiBmdW5jdGlvbiBhbmQvb3Igb3RoZXIgZnVuY3Rpb25zCisgKgorICogQXBwbHlpbmcgdGhpcyBwYXNzIGdpdmVzIHNldmVyYWwgYmVuZWZpdHM6CisgKiAxLiBBbGwgZnVuY3Rpb25zIGNhbiBiZSBpbmxpbmVkLgorICogMi4gbnY0MCBhbmQgb3RoZXIgcHJlLURYMTAgY2hpcHMgd2l0aG91dCAiY29udGludWUiIGNhbiBiZSBzdXBwb3J0ZWQKKyAqIDMuIG52MzAgYW5kIG90aGVyIHByZS1EWDEwIGNoaXBzIHdpdGggbm8gY29udHJvbCBmbG93IGF0IGFsbCBhcmUgYmV0dGVyCisgKiAgICBzdXBwb3J0ZWQKKyAqCisgKiBDb250aW51ZXMgYXJlIGxvd2VyZWQgYnkgYWRkaW5nIGEgcGVyLWxvb3AgImV4ZWN1dGUgZmxhZyIsIGluaXRpYWxpemVkIHRvCisgKiB0cnVlLCB0aGF0IHdoZW4gY2xlYXJlZCBpbmhpYml0cyBhbGwgZXhlY3V0aW9uIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxvb3AuCisgKgorICogQnJlYWtzIGFyZSBsb3dlcmVkIHRvIGNvbnRpbnVlcywgcGx1cyBzZXR0aW5nIGEgImJyZWFrIGZsYWciIHRoYXQgaXMgY2hlY2tlZAorICogYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgYW5kIHRyaWdnZXIgdGhlIHVuaXF1ZSAiYnJlYWsiLgorICoKKyAqIFJldHVybnMgYXJlIGxvd2VyZWQgdG8gYnJlYWtzL2NvbnRpbnVlcywgcGx1cyBhZGRpbmcgYSAicmV0dXJuIGZsYWciIHRoYXQKKyAqIGNhdXNlcyBsb29wcyB0byBicmVhayBhZ2FpbiBvdXQgb2YgdGhlaXIgZW5jbG9zaW5nIGxvb3BzIHVudGlsIGFsbCB0aGUKKyAqIGxvb3BzIGFyZSBleGl0ZWQ6IHRoZW4gdGhlICJleGVjdXRlIGZsYWciIGxvZ2ljIHdpbGwgaWdub3JlIGV2ZXJ5dGhpbmcKKyAqIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgorICoKKyAqIE5vdGUgdGhhdCAiY29udGludWUiIGFuZCAicmV0dXJuIiBjYW4gYWxzbyBiZSBpbXBsZW1lbnRlZCBieSBhZGRpbmcKKyAqIGEgZHVtbXkgbG9vcCBhbmQgdXNpbmcgYnJlYWsuCisgKiBIb3dldmVyLCB0aGlzIGlzIGJhZCBmb3IgaGFyZHdhcmUgd2l0aCBsaW1pdGVkIG5lc3RpbmcgZGVwdGgsIGFuZAorICogcHJldmVudHMgZnVydGhlciBvcHRpbWl6YXRpb24sIGFuZCB0aHVzIGlzIG5vdCBjdXJyZW50bHkgcGVyZm9ybWVkLgorICovCisKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiaXIuaCIKKworLyoqCisgKiBFbnVtIHJlY29yZGluZyB0aGUgcmVzdWx0IG9mIGFuYWx5emluZyBob3cgY29udHJvbCBmbG93IG1pZ2h0IGV4aXQKKyAqIGFuIElSIG5vZGUuCisgKgorICogRWFjaCBwb3NzaWJsZSB2YWx1ZSBvZiBqdW1wX3N0cmVuZ3RoIGluZGljYXRlcyBhIHN0cmljdGx5IHN0cm9uZ2VyCisgKiBndWFyYW50ZWUgb24gY29udHJvbCBmbG93IHRoYW4gdGhlIHByZXZpb3VzIHZhbHVlLgorICoKKyAqIFRoZSBvcmRlcmluZyBvZiBzdHJlbmd0aHMgcm91Z2hseSByZWZsZWN0cyB0aGUgd2F5IGp1bXBzIGFyZQorICogbG93ZXJlZDoganVtcHMgd2l0aCBoaWdoZXIgc3RyZW5ndGggdGVuZCB0byBiZSBsb3dlcmVkIHRvIGp1bXBzIG9mCisgKiBsb3dlciBzdHJlbmd0aC4gIEFjY29yZGluZ2x5LCBzdHJlbmd0aCBpcyB1c2VkIGFzIGEgaGV1cmlzdGljIHRvCisgKiBkZXRlcm1pbmUgd2hpY2ggbG93ZXJpbmcgdG8gcGVyZm9ybSBmaXJzdC4KKyAqCisgKiBUaGlzIGVudW0gaXMgYWxzbyB1c2VkIGJ5IGdldF9qdW1wX3N0cmVuZ3RoKCkgdG8gY2F0ZWdvcml6ZQorICogaW5zdHJ1Y3Rpb25zIGFzIGVpdGhlciBicmVhaywgY29udGludWUsIHJldHVybiwgb3Igb3RoZXIuICBXaGVuCisgKiB1c2VkIGluIHRoaXMgZmFzaGlvbiwgc3RyZW5ndGhfYWx3YXlzX2NsZWFyc19leGVjdXRlX2ZsYWcgaXMgbm90CisgKiB1c2VkLgorICoKKyAqIFRoZSBjb250cm9sIGZsb3cgYW5hbHlzaXMgbWFkZSBieSB0aGlzIG9wdGltaXphdGlvbiBwYXNzIG1ha2VzIHR3bworICogc2ltcGxpZnlpbmcgYXNzdW1wdGlvbnM6CisgKgorICogLSBJdCBpZ25vcmVzIGRpc2NhcmQgaW5zdHJ1Y3Rpb25zLCBzaW5jZSB0aGV5IGFyZSBsb3dlcmVkIGJ5IGEKKyAqICAgc2VwYXJhdGUgcGFzcyAobG93ZXJfZGlzY2FyZC5jcHApLgorICoKKyAqIC0gSXQgYXNzdW1lcyBpdCBpcyBhbHdheXMgcG9zc2libGUgZm9yIGNvbnRyb2wgdG8gZmxvdyBmcm9tIGEgbG9vcAorICogICB0byB0aGUgaW5zdHJ1Y3Rpb24gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGl0LiAgVGVjaG5pY2FsbHksIHRoaXMKKyAqICAgaXMgbm90IHRydWUgKHNpbmNlIGFsbCBleGVjdXRpb24gcGF0aHMgdGhyb3VnaCB0aGUgbG9vcCBtaWdodAorICogICBqdW1wIGJhY2sgdG8gdGhlIHRvcCwgb3IgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uKS4KKyAqCisgKiBCb3RoIG9mIHRoZXNlIHNpbXBsaWZ5aW5nIGFzc3VtdGlvbnMgYXJlIHNhZmUsIHNpbmNlIHRoZXkgY2FuIG5ldmVyCisgKiBjYXVzZSByZWFjaGFibGUgY29kZSB0byBiZSBpbmNvcnJlY3RseSBjbGFzc2lmaWVkIGFzIHVucmVhY2hhYmxlOworICogdGhleSBjYW4gb25seSBkbyB0aGUgb3Bwb3NpdGUuCisgKi8KK2VudW0ganVtcF9zdHJlbmd0aAoreworICAgLyoqCisgICAgKiBBbmFseXNpcyBoYXMgcHJvZHVjZWQgbm8gZ3VhcmFudGVlIG9uIGhvdyBjb250cm9sIGZsb3cgbWlnaHQKKyAgICAqIGV4aXQgdGhpcyBJUiBub2RlLiAgSXQgbWlnaHQgZmFsbCBvdXQgdGhlIGJvdHRvbSAod2l0aCBvcgorICAgICogd2l0aG91dCBjbGVhcmluZyB0aGUgZXhlY3V0ZSBmbGFnLCBpZiBwcmVzZW50KSwgb3IgaXQgbWlnaHQKKyAgICAqIGNvbnRpbnVlIHRvIHRoZSB0b3Agb2YgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgbG9vcCwgYnJlYWsgb3V0CisgICAgKiBvZiBpdCwgb3IgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uLgorICAgICovCisgICBzdHJlbmd0aF9ub25lLAorCisgICAvKioKKyAgICAqIFRoZSBvbmx5IHdheSBjb250cm9sIGNhbiBmYWxsIG91dCB0aGUgYm90dG9tIG9mIHRoaXMgbm9kZSBpcworICAgICogdGhyb3VnaCBhIGNvZGUgcGF0aCB0aGF0IGNsZWFycyB0aGUgZXhlY3V0ZSBmbGFnLiAgSXQgbWlnaHQgYWxzbworICAgICogY29udGludWUgdG8gdGhlIHRvcCBvZiB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBsb29wLCBicmVhayBvdXQKKyAgICAqIG9mIGl0LCBvciByZXR1cm4gZnJvbSB0aGUgZnVuY3Rpb24uCisgICAgKi8KKyAgIHN0cmVuZ3RoX2Fsd2F5c19jbGVhcnNfZXhlY3V0ZV9mbGFnLAorCisgICAvKioKKyAgICAqIENvbnRyb2wgY2Fubm90IGZhbGwgb3V0IHRoZSBib3R0b20gb2YgdGhpcyBub2RlLiAgSXQgbWlnaHQKKyAgICAqIGNvbnRpbnVlIHRvIHRoZSB0b3Agb2YgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgbG9vcCwgYnJlYWsgb3V0CisgICAgKiBvZiBpdCwgb3IgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uLgorICAgICovCisgICBzdHJlbmd0aF9jb250aW51ZSwKKworICAgLyoqCisgICAgKiBDb250cm9sIGNhbm5vdCBmYWxsIG91dCB0aGUgYm90dG9tIG9mIHRoaXMgbm9kZSwgb3IgY29udGludWUgdGhlCisgICAgKiB0b3Agb2YgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgbG9vcC4gIEl0IGNhbiBvbmx5IGJyZWFrIG91dCBvZgorICAgICogaXQgb3IgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uLgorICAgICovCisgICBzdHJlbmd0aF9icmVhaywKKworICAgLyoqCisgICAgKiBDb250cm9sIGNhbm5vdCBmYWxsIG91dCB0aGUgYm90dG9tIG9mIHRoaXMgbm9kZSwgY29udGludWUgdG8gdGhlCisgICAgKiB0b3Agb2YgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgbG9vcCwgb3IgYnJlYWsgb3V0IG9mIGl0LiAgSXQgY2FuCisgICAgKiBvbmx5IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbi4KKyAgICAqLworICAgc3RyZW5ndGhfcmV0dXJuCit9OworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgYmxvY2tfcmVjb3JkCit7CisgICAvKiBtaW5pbXVtIGp1bXAgc3RyZW5ndGggKG9mIGxvd2VyZWQgSVIsIG5vdCBwcmUtbG93ZXJpbmcgSVIpCisgICAgKgorICAgICogSWYgdGhlIGJsb2NrIGVuZHMgd2l0aCBhIGp1bXAsIG11c3QgYmUgdGhlIHN0cmVuZ3RoIG9mIHRoZSBqdW1wLgorICAgICogT3RoZXJ3aXNlLCB0aGUganVtcCB3b3VsZCBiZSBkZWFkIGFuZCBoYXZlIGJlZW4gZGVsZXRlZCBiZWZvcmUpCisgICAgKgorICAgICogSWYgdGhlIGJsb2NrIGRvZXNuJ3QgZW5kIHdpdGggYSBqdW1wLCBpdCBjYW4gYmUgZGlmZmVyZW50IHRoYW4gc3RyZW5ndGhfbm9uZSBpZiBhbGwgcGF0aHMgYmVmb3JlIGl0IGxlYWQgdG8gc29tZSBqdW1wCisgICAgKiAoZS5nLiBhbiBpZiB3aXRoIGEgcmV0dXJuIGluIG9uZSBicmFuY2gsIGFuZCBhIGJyZWFrIGluIHRoZSBvdGhlciwgd2hpbGUgbm90IGxvd2VyaW5nIHRoZW0pCisgICAgKiBOb3RlIHRoYXQgaWRlbnRpY2FsIGp1bXBzIGFyZSB1c3VhbGx5IHVuaWZpZWQgdGhvdWdoLgorICAgICovCisgICBqdW1wX3N0cmVuZ3RoIG1pbl9zdHJlbmd0aDsKKworICAgLyogY2FuIGFueXRoaW5nIGNsZWFyIHRoZSBleGVjdXRlIGZsYWc/ICovCisgICBib29sIG1heV9jbGVhcl9leGVjdXRlX2ZsYWc7CisKKyAgIGJsb2NrX3JlY29yZCgpCisgICB7CisgICAgICB0aGlzLT5taW5fc3RyZW5ndGggPSBzdHJlbmd0aF9ub25lOworICAgICAgdGhpcy0+bWF5X2NsZWFyX2V4ZWN1dGVfZmxhZyA9IGZhbHNlOworICAgfQorfTsKKworc3RydWN0IGxvb3BfcmVjb3JkCit7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUqIHNpZ25hdHVyZTsKKyAgIGlyX2xvb3AqIGxvb3A7CisKKyAgIC8qIHVzZWQgdG8gYXZvaWQgbG93ZXJpbmcgdGhlIGJyZWFrIHVzZWQgdG8gcmVwcmVzZW50IGxvd2VyZWQgYnJlYWtzICovCisgICB1bnNpZ25lZCBuZXN0aW5nX2RlcHRoOworICAgYm9vbCBpbl9pZl9hdF90aGVfZW5kX29mX3RoZV9sb29wOworCisgICBib29sIG1heV9zZXRfcmV0dXJuX2ZsYWc7CisKKyAgIGlyX3ZhcmlhYmxlKiBicmVha19mbGFnOworICAgaXJfdmFyaWFibGUqIGV4ZWN1dGVfZmxhZzsgLyogY2xlYXJlZCB0byBlbXVsYXRlIGNvbnRpbnVlICovCisKKyAgIGxvb3BfcmVjb3JkKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSogcF9zaWduYXR1cmUgPSAwLCBpcl9sb29wKiBwX2xvb3AgPSAwKQorICAgeworICAgICAgdGhpcy0+c2lnbmF0dXJlID0gcF9zaWduYXR1cmU7CisgICAgICB0aGlzLT5sb29wID0gcF9sb29wOworICAgICAgdGhpcy0+bmVzdGluZ19kZXB0aCA9IDA7CisgICAgICB0aGlzLT5pbl9pZl9hdF90aGVfZW5kX29mX3RoZV9sb29wID0gZmFsc2U7CisgICAgICB0aGlzLT5tYXlfc2V0X3JldHVybl9mbGFnID0gZmFsc2U7CisgICAgICB0aGlzLT5icmVha19mbGFnID0gMDsKKyAgICAgIHRoaXMtPmV4ZWN1dGVfZmxhZyA9IDA7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlKiBnZXRfZXhlY3V0ZV9mbGFnKCkKKyAgIHsKKyAgICAgIC8qIGFsc28gc3VwcG9ydGVkIGZvciB0aGUgImZ1bmN0aW9uIGxvb3AiICovCisgICAgICBpZighdGhpcy0+ZXhlY3V0ZV9mbGFnKSB7CisgICAgICAgICBleGVjX2xpc3QmIGxpc3QgPSB0aGlzLT5sb29wID8gdGhpcy0+bG9vcC0+Ym9keV9pbnN0cnVjdGlvbnMgOiBzaWduYXR1cmUtPmJvZHk7CisgICAgICAgICB0aGlzLT5leGVjdXRlX2ZsYWcgPSBuZXcodGhpcy0+c2lnbmF0dXJlKSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OmJvb2xfdHlwZSwgImV4ZWN1dGVfZmxhZyIsIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgICAgICAgbGlzdC5wdXNoX2hlYWQobmV3KHRoaXMtPnNpZ25hdHVyZSkgaXJfYXNzaWdubWVudChuZXcodGhpcy0+c2lnbmF0dXJlKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShleGVjdXRlX2ZsYWcpLCBuZXcodGhpcy0+c2lnbmF0dXJlKSBpcl9jb25zdGFudCh0cnVlKSwgMCkpOworICAgICAgICAgbGlzdC5wdXNoX2hlYWQodGhpcy0+ZXhlY3V0ZV9mbGFnKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLT5leGVjdXRlX2ZsYWc7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlKiBnZXRfYnJlYWtfZmxhZygpCisgICB7CisgICAgICBhc3NlcnQodGhpcy0+bG9vcCk7CisgICAgICBpZighdGhpcy0+YnJlYWtfZmxhZykgeworICAgICAgICAgdGhpcy0+YnJlYWtfZmxhZyA9IG5ldyh0aGlzLT5zaWduYXR1cmUpIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6Ym9vbF90eXBlLCAiYnJlYWtfZmxhZyIsIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgICAgICAgdGhpcy0+bG9vcC0+aW5zZXJ0X2JlZm9yZSh0aGlzLT5icmVha19mbGFnKTsKKyAgICAgICAgIHRoaXMtPmxvb3AtPmluc2VydF9iZWZvcmUobmV3KHRoaXMtPnNpZ25hdHVyZSkgaXJfYXNzaWdubWVudChuZXcodGhpcy0+c2lnbmF0dXJlKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShicmVha19mbGFnKSwgbmV3KHRoaXMtPnNpZ25hdHVyZSkgaXJfY29uc3RhbnQoZmFsc2UpLCAwKSk7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy0+YnJlYWtfZmxhZzsKKyAgIH0KK307CisKK3N0cnVjdCBmdW5jdGlvbl9yZWNvcmQKK3sKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSogc2lnbmF0dXJlOworICAgaXJfdmFyaWFibGUqIHJldHVybl9mbGFnOyAvKiB1c2VkIHRvIGJyZWFrIG91dCBvZiBhbGwgbG9vcHMgYW5kIHRoZW4ganVtcCB0byB0aGUgcmV0dXJuIGluc3RydWN0aW9uICovCisgICBpcl92YXJpYWJsZSogcmV0dXJuX3ZhbHVlOworICAgYm9vbCBsb3dlcl9yZXR1cm47CisgICB1bnNpZ25lZCBuZXN0aW5nX2RlcHRoOworCisgICBmdW5jdGlvbl9yZWNvcmQoaXJfZnVuY3Rpb25fc2lnbmF0dXJlKiBwX3NpZ25hdHVyZSA9IDAsCisgICAgICAgICAgICAgICAgICAgYm9vbCBsb3dlcl9yZXR1cm4gPSBmYWxzZSkKKyAgIHsKKyAgICAgIHRoaXMtPnNpZ25hdHVyZSA9IHBfc2lnbmF0dXJlOworICAgICAgdGhpcy0+cmV0dXJuX2ZsYWcgPSAwOworICAgICAgdGhpcy0+cmV0dXJuX3ZhbHVlID0gMDsKKyAgICAgIHRoaXMtPm5lc3RpbmdfZGVwdGggPSAwOworICAgICAgdGhpcy0+bG93ZXJfcmV0dXJuID0gbG93ZXJfcmV0dXJuOworICAgfQorCisgICBpcl92YXJpYWJsZSogZ2V0X3JldHVybl9mbGFnKCkKKyAgIHsKKyAgICAgIGlmKCF0aGlzLT5yZXR1cm5fZmxhZykgeworICAgICAgICAgdGhpcy0+cmV0dXJuX2ZsYWcgPSBuZXcodGhpcy0+c2lnbmF0dXJlKSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OmJvb2xfdHlwZSwgInJldHVybl9mbGFnIiwgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICAgICB0aGlzLT5zaWduYXR1cmUtPmJvZHkucHVzaF9oZWFkKG5ldyh0aGlzLT5zaWduYXR1cmUpIGlyX2Fzc2lnbm1lbnQobmV3KHRoaXMtPnNpZ25hdHVyZSkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUocmV0dXJuX2ZsYWcpLCBuZXcodGhpcy0+c2lnbmF0dXJlKSBpcl9jb25zdGFudChmYWxzZSksIDApKTsKKyAgICAgICAgIHRoaXMtPnNpZ25hdHVyZS0+Ym9keS5wdXNoX2hlYWQodGhpcy0+cmV0dXJuX2ZsYWcpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMtPnJldHVybl9mbGFnOworICAgfQorCisgICBpcl92YXJpYWJsZSogZ2V0X3JldHVybl92YWx1ZSgpCisgICB7CisgICAgICBpZighdGhpcy0+cmV0dXJuX3ZhbHVlKSB7CisgICAgICAgICBhc3NlcnQoIXRoaXMtPnNpZ25hdHVyZS0+cmV0dXJuX3R5cGUtPmlzX3ZvaWQoKSk7CisgICAgICAgICByZXR1cm5fdmFsdWUgPSBuZXcodGhpcy0+c2lnbmF0dXJlKSBpcl92YXJpYWJsZSh0aGlzLT5zaWduYXR1cmUtPnJldHVybl90eXBlLCAicmV0dXJuX3ZhbHVlIiwgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICAgICB0aGlzLT5zaWduYXR1cmUtPmJvZHkucHVzaF9oZWFkKHRoaXMtPnJldHVybl92YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy0+cmV0dXJuX3ZhbHVlOworICAgfQorfTsKKworc3RydWN0IGlyX2xvd2VyX2p1bXBzX3Zpc2l0b3IgOiBwdWJsaWMgaXJfY29udHJvbF9mbG93X3Zpc2l0b3IgeworICAgLyogUG9zdGNvbmRpdGlvbnM6IG9uIGV4aXQgb2YgYW55IHZpc2l0KCkgZnVuY3Rpb246CisgICAgKgorICAgICogQU5BTFlTSVM6IHRoaXMtPmJsb2NrLm1pbl9zdHJlbmd0aCwKKyAgICAqIHRoaXMtPmJsb2NrLm1heV9jbGVhcl9leGVjdXRlX2ZsYWcsIGFuZAorICAgICogdGhpcy0+bG9vcC5tYXlfc2V0X3JldHVybl9mbGFnIGFyZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlCisgICAgKiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHZpc2l0ZWQgc3RhdGVtZW50LgorICAgICoKKyAgICAqIERFQURfQ09ERV9FTElNSU5BVElPTjogSWYgdGhpcy0+YmxvY2subWluX3N0cmVuZ3RoIGlzIG5vdAorICAgICogc3RyZW5ndGhfbm9uZSwgdGhlIHZpc2l0ZWQgbm9kZSBpcyBhdCB0aGUgZW5kIG9mIGl0cyBleGVjX2xpc3QuCisgICAgKiBJbiBvdGhlciB3b3JkcywgYW55IHVucmVhY2hhYmxlIHN0YXRlbWVudHMgdGhhdCBmb2xsb3cgdGhlCisgICAgKiB2aXNpdGVkIHN0YXRlbWVudCBpbiBpdHMgZXhlY19saXN0IGhhdmUgYmVlbiByZW1vdmVkLgorICAgICoKKyAgICAqIENPTlRBSU5FRF9KVU1QU19MT1dFUkVEOiBJZiB0aGUgdmlzaXRlZCBzdGF0ZW1lbnQgY29udGFpbnMgb3RoZXIKKyAgICAqIHN0YXRlbWVudHMsIHRoZW4gc2hvdWxkX2xvd2VyX2p1bXAoKSBpcyBmYWxzZSBmb3IgYWxsIG9mIHRoZQorICAgICogcmV0dXJuLCBicmVhaywgb3IgY29udGludWUgc3RhdGVtZW50cyBpdCBjb250YWlucy4KKyAgICAqCisgICAgKiBOb3RlIHRoYXQgdmlzaXRpbmcgYSBqdW1wIGRvZXMgbm90IGxvd2VyIGl0LiAgVGhhdCBpcyB0aGUKKyAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBzdGF0ZW1lbnQgKG9yIGZ1bmN0aW9uIHNpZ25hdHVyZSkgdGhhdAorICAgICogY29udGFpbnMgdGhlIGp1bXAuCisgICAgKi8KKworICAgYm9vbCBwcm9ncmVzczsKKworICAgc3RydWN0IGZ1bmN0aW9uX3JlY29yZCBmdW5jdGlvbjsKKyAgIHN0cnVjdCBsb29wX3JlY29yZCBsb29wOworICAgc3RydWN0IGJsb2NrX3JlY29yZCBibG9jazsKKworICAgYm9vbCBwdWxsX291dF9qdW1wczsKKyAgIGJvb2wgbG93ZXJfY29udGludWU7CisgICBib29sIGxvd2VyX2JyZWFrOworICAgYm9vbCBsb3dlcl9zdWJfcmV0dXJuOworICAgYm9vbCBsb3dlcl9tYWluX3JldHVybjsKKworICAgaXJfbG93ZXJfanVtcHNfdmlzaXRvcigpCisgICAgICA6IHByb2dyZXNzKGZhbHNlKSwKKyAgICAgICAgcHVsbF9vdXRfanVtcHMoZmFsc2UpLAorICAgICAgICBsb3dlcl9jb250aW51ZShmYWxzZSksCisgICAgICAgIGxvd2VyX2JyZWFrKGZhbHNlKSwKKyAgICAgICAgbG93ZXJfc3ViX3JldHVybihmYWxzZSksCisgICAgICAgIGxvd2VyX21haW5fcmV0dXJuKGZhbHNlKQorICAgeworICAgfQorCisgICB2b2lkIHRydW5jYXRlX2FmdGVyX2luc3RydWN0aW9uKGV4ZWNfbm9kZSAqaXIpCisgICB7CisgICAgICBpZiAoIWlyKQorICAgICAgICAgcmV0dXJuOworCisgICAgICB3aGlsZSAoIWlyLT5nZXRfbmV4dCgpLT5pc190YWlsX3NlbnRpbmVsKCkpIHsKKyAgICAgICAgICgoaXJfaW5zdHJ1Y3Rpb24gKilpci0+Z2V0X25leHQoKSktPnJlbW92ZSgpOworICAgICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgICAgfQorICAgfQorCisgICB2b2lkIG1vdmVfb3V0ZXJfYmxvY2tfaW5zaWRlKGlyX2luc3RydWN0aW9uICppciwgZXhlY19saXN0ICppbm5lcl9ibG9jaykKKyAgIHsKKyAgICAgIHdoaWxlICghaXItPmdldF9uZXh0KCktPmlzX3RhaWxfc2VudGluZWwoKSkgeworICAgICAgICAgaXJfaW5zdHJ1Y3Rpb24gKm1vdmVfaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKilpci0+Z2V0X25leHQoKTsKKworICAgICAgICAgbW92ZV9pci0+cmVtb3ZlKCk7CisgICAgICAgICBpbm5lcl9ibG9jay0+cHVzaF90YWlsKG1vdmVfaXIpOworICAgICAgfQorICAgfQorCisgICAvKioKKyAgICAqIEluc2VydCB0aGUgaW5zdHJ1Y3Rpb25zIG5lY2Vzc2FyeSB0byBsb3dlciBhIHJldHVybiBzdGF0ZW1lbnQsCisgICAgKiBiZWZvcmUgdGhlIGdpdmVuIHJldHVybiBpbnN0cnVjdGlvbi4KKyAgICAqLworICAgdm9pZCBpbnNlcnRfbG93ZXJlZF9yZXR1cm4oaXJfcmV0dXJuICppcikKKyAgIHsKKyAgICAgIGlyX3ZhcmlhYmxlKiByZXR1cm5fZmxhZyA9IHRoaXMtPmZ1bmN0aW9uLmdldF9yZXR1cm5fZmxhZygpOworICAgICAgaWYoIXRoaXMtPmZ1bmN0aW9uLnNpZ25hdHVyZS0+cmV0dXJuX3R5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICAgaXJfdmFyaWFibGUqIHJldHVybl92YWx1ZSA9IHRoaXMtPmZ1bmN0aW9uLmdldF9yZXR1cm5fdmFsdWUoKTsKKyAgICAgICAgIGlyLT5pbnNlcnRfYmVmb3JlKAorICAgICAgICAgICAgbmV3KGlyKSBpcl9hc3NpZ25tZW50KAorICAgICAgICAgICAgICAgbmV3IChpcikgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUocmV0dXJuX3ZhbHVlKSwKKyAgICAgICAgICAgICAgIGlyLT52YWx1ZSkpOworICAgICAgfQorICAgICAgaXItPmluc2VydF9iZWZvcmUoCisgICAgICAgICBuZXcoaXIpIGlyX2Fzc2lnbm1lbnQoCisgICAgICAgICAgICBuZXcgKGlyKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShyZXR1cm5fZmxhZyksCisgICAgICAgICAgICBuZXcgKGlyKSBpcl9jb25zdGFudCh0cnVlKSkpOworICAgICAgdGhpcy0+bG9vcC5tYXlfc2V0X3JldHVybl9mbGFnID0gdHJ1ZTsKKyAgIH0KKworICAgLyoqCisgICAgKiBJZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaXMgYSByZXR1cm4sIGxvd2VyIGl0IHRvIGluc3RydWN0aW9ucworICAgICogdGhhdCBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIChpZiB0aGVyZSBpcyBvbmUpLCBzZXQgdGhlIHJldHVybgorICAgICogZmxhZywgYW5kIHRoZW4gYnJlYWsuCisgICAgKgorICAgICogSXQgaXMgc2FmZSB0byBwYXNzIE5VTEwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAqLworICAgdm9pZCBsb3dlcl9yZXR1cm5fdW5jb25kaXRpb25hbGx5KGlyX2luc3RydWN0aW9uICppcikKKyAgIHsKKyAgICAgIGlmIChnZXRfanVtcF9zdHJlbmd0aChpcikgIT0gc3RyZW5ndGhfcmV0dXJuKSB7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpbnNlcnRfbG93ZXJlZF9yZXR1cm4oKGlyX3JldHVybiopaXIpOworICAgICAgaXItPnJlcGxhY2Vfd2l0aChuZXcoaXIpIGlyX2xvb3BfanVtcChpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWspKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBDcmVhdGUgdGhlIG5lY2Vzc2FyeSBpbnN0cnVjdGlvbiB0byByZXBsYWNlIGEgYnJlYWsgaW5zdHJ1Y3Rpb24uCisgICAgKi8KKyAgIGlyX2luc3RydWN0aW9uICpjcmVhdGVfbG93ZXJlZF9icmVhaygpCisgICB7CisgICAgICB2b2lkICpjdHggPSB0aGlzLT5mdW5jdGlvbi5zaWduYXR1cmU7CisgICAgICByZXR1cm4gbmV3KGN0eCkgaXJfYXNzaWdubWVudCgKKyAgICAgICAgICBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0aGlzLT5sb29wLmdldF9icmVha19mbGFnKCkpLAorICAgICAgICAgIG5ldyhjdHgpIGlyX2NvbnN0YW50KHRydWUpLAorICAgICAgICAgIDApOworICAgfQorCisgICAvKioKKyAgICAqIElmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBpcyBhIGJyZWFrLCBsb3dlciBpdCB0byBhbiBpbnN0cnVjdGlvbgorICAgICogdGhhdCBzZXRzIHRoZSBicmVhayBmbGFnLCB3aXRob3V0IGNvbnN1bHRpbmcKKyAgICAqIHNob3VsZF9sb3dlcl9qdW1wKCkuCisgICAgKgorICAgICogSXQgaXMgc2FmZSB0byBwYXNzIE5VTEwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAqLworICAgdm9pZCBsb3dlcl9icmVha191bmNvbmRpdGlvbmFsbHkoaXJfaW5zdHJ1Y3Rpb24gKmlyKQorICAgeworICAgICAgaWYgKGdldF9qdW1wX3N0cmVuZ3RoKGlyKSAhPSBzdHJlbmd0aF9icmVhaykgeworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaXItPnJlcGxhY2Vfd2l0aChjcmVhdGVfbG93ZXJlZF9icmVhaygpKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBJZiB0aGUgYmxvY2sgZW5kcyBpbiBhIGNvbmRpdGlvbmFsIG9yIHVuY29uZGl0aW9uYWwgYnJlYWssIGxvd2VyCisgICAgKiBpdCwgZXZlbiB0aG91Z2ggc2hvdWxkX2xvd2VyX2p1bXAoKSBzYXlzIGl0IG5lZWRuJ3QgYmUgbG93ZXJlZC4KKyAgICAqLworICAgdm9pZCBsb3dlcl9maW5hbF9icmVha3MoZXhlY19saXN0ICpibG9jaykKKyAgIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKSBibG9jay0+Z2V0X3RhaWwoKTsKKyAgICAgIGxvd2VyX2JyZWFrX3VuY29uZGl0aW9uYWxseShpcik7CisgICAgICBpcl9pZiAqaXJfaWYgPSBpci0+YXNfaWYoKTsKKyAgICAgIGlmIChpcl9pZikgeworICAgICAgICAgIGxvd2VyX2JyZWFrX3VuY29uZGl0aW9uYWxseSgKKyAgICAgICAgICAgICAgKGlyX2luc3RydWN0aW9uICopIGlyX2lmLT50aGVuX2luc3RydWN0aW9ucy5nZXRfdGFpbCgpKTsKKyAgICAgICAgICBsb3dlcl9icmVha191bmNvbmRpdGlvbmFsbHkoCisgICAgICAgICAgICAgIChpcl9pbnN0cnVjdGlvbiAqKSBpcl9pZi0+ZWxzZV9pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKSk7CisgICAgICB9CisgICB9CisKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9sb29wX2p1bXAgKiBpcikKKyAgIHsKKyAgICAgIC8qIEVsaW1pbmF0ZSBhbGwgaW5zdHJ1Y3Rpb25zIGFmdGVyIGVhY2ggb25lLCBzaW5jZSB0aGV5IGFyZQorICAgICAgICogdW5yZWFjaGFibGUuICBUaGlzIHNhdGlzZmllcyB0aGUgREVBRF9DT0RFX0VMSU1JTkFUSU9OCisgICAgICAgKiBwb3N0Y29uZGl0aW9uLgorICAgICAgICovCisgICAgICB0cnVuY2F0ZV9hZnRlcl9pbnN0cnVjdGlvbihpcik7CisKKyAgICAgIC8qIFNldCB0aGlzLT5ibG9jay5taW5fc3RyZW5ndGggYmFzZWQgb24gdGhpcyBpbnN0cnVjdGlvbi4gIFRoaXMKKyAgICAgICAqIHNhdGlzZmllcyB0aGUgQU5BTFlTSVMgcG9zdGNvbmRpdGlvbi4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8KKyAgICAgICAqIHVwZGF0ZSB0aGlzLT5ibG9jay5tYXlfY2xlYXJfZXhlY3V0ZV9mbGFnIG9yCisgICAgICAgKiB0aGlzLT5sb29wLm1heV9zZXRfcmV0dXJuX2ZsYWcsIGJlY2F1c2UgYW4gdW5sb3dlcmVkIGp1bXAKKyAgICAgICAqIGluc3RydWN0aW9uIGNhbid0IGNoYW5nZSBhbnkgZmxhZ3MuCisgICAgICAgKi8KKyAgICAgIHRoaXMtPmJsb2NrLm1pbl9zdHJlbmd0aCA9IGlyLT5pc19icmVhaygpID8gc3RyZW5ndGhfYnJlYWsgOiBzdHJlbmd0aF9jb250aW51ZTsKKworICAgICAgLyogVGhlIENPTlRBSU5FRF9KVU1QU19MT1dFUkVEIHBvc3Rjb25kaXRpb24gaXMgYWxyZWFkeQorICAgICAgICogc2F0aXNmaWVkLCBiZWNhdXNlIGp1bXAgc3RhdGVtZW50cyBjYW4ndCBjb250YWluIG90aGVyCisgICAgICAgKiBzdGF0ZW1lbnRzLgorICAgICAgICovCisgICB9CisKKyAgIHZpcnR1YWwgdm9pZCB2aXNpdChjbGFzcyBpcl9yZXR1cm4gKiBpcikKKyAgIHsKKyAgICAgIC8qIEVsaW1pbmF0ZSBhbGwgaW5zdHJ1Y3Rpb25zIGFmdGVyIGVhY2ggb25lLCBzaW5jZSB0aGV5IGFyZQorICAgICAgICogdW5yZWFjaGFibGUuICBUaGlzIHNhdGlzZmllcyB0aGUgREVBRF9DT0RFX0VMSU1JTkFUSU9OCisgICAgICAgKiBwb3N0Y29uZGl0aW9uLgorICAgICAgICovCisgICAgICB0cnVuY2F0ZV9hZnRlcl9pbnN0cnVjdGlvbihpcik7CisKKyAgICAgIC8qIFNldCB0aGlzLT5ibG9jay5taW5fc3RyZW5ndGggYmFzZWQgb24gdGhpcyBpbnN0cnVjdGlvbi4gIFRoaXMKKyAgICAgICAqIHNhdGlzZmllcyB0aGUgQU5BTFlTSVMgcG9zdGNvbmRpdGlvbi4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8KKyAgICAgICAqIHVwZGF0ZSB0aGlzLT5ibG9jay5tYXlfY2xlYXJfZXhlY3V0ZV9mbGFnIG9yCisgICAgICAgKiB0aGlzLT5sb29wLm1heV9zZXRfcmV0dXJuX2ZsYWcsIGJlY2F1c2UgYW4gdW5sb3dlcmVkIHJldHVybgorICAgICAgICogaW5zdHJ1Y3Rpb24gY2FuJ3QgY2hhbmdlIGFueSBmbGFncy4KKyAgICAgICAqLworICAgICAgdGhpcy0+YmxvY2subWluX3N0cmVuZ3RoID0gc3RyZW5ndGhfcmV0dXJuOworCisgICAgICAvKiBUaGUgQ09OVEFJTkVEX0pVTVBTX0xPV0VSRUQgcG9zdGNvbmRpdGlvbiBpcyBhbHJlYWR5CisgICAgICAgKiBzYXRpc2ZpZWQsIGJlY2F1c2UganVtcCBzdGF0ZW1lbnRzIGNhbid0IGNvbnRhaW4gb3RoZXIKKyAgICAgICAqIHN0YXRlbWVudHMuCisgICAgICAgKi8KKyAgIH0KKworICAgdmlydHVhbCB2b2lkIHZpc2l0KGNsYXNzIGlyX2Rpc2NhcmQgKiBpcikKKyAgIHsKKyAgICAgIC8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZS4gIFRoZSBBTkFMWVNJUyBhbmQKKyAgICAgICAqIERFQURfQ09ERV9FTElNSU5BVElPTiBwb3N0Y29uZGl0aW9ucyBhcmUgYWxyZWFkeSBzYXRpc2ZpZWQsCisgICAgICAgKiBiZWNhdXNlIGRpc2NhcmQgc3RhdGVtZW50cyBhcmUgaWdub3JlZCBieSB0aGlzIG9wdGltaXphdGlvbgorICAgICAgICogcGFzcy4gIFRoZSBDT05UQUlORURfSlVNUFNfTE9XRVJFRCBwb3N0Y29uZGl0aW9uIGlzIGFscmVhZHkKKyAgICAgICAqIHNhdGlzZmllZCwgYmVjYXVzZSBkaXNjYXJkIHN0YXRlbWVudHMgY2FuJ3QgY29udGFpbiBvdGhlcgorICAgICAgICogc3RhdGVtZW50cy4KKyAgICAgICAqLworICAgICAgKHZvaWQpIGlyOworICAgfQorCisgICBlbnVtIGp1bXBfc3RyZW5ndGggZ2V0X2p1bXBfc3RyZW5ndGgoaXJfaW5zdHJ1Y3Rpb24qIGlyKQorICAgeworICAgICAgaWYoIWlyKQorICAgICAgICAgcmV0dXJuIHN0cmVuZ3RoX25vbmU7CisgICAgICBlbHNlIGlmKGlyLT5pcl90eXBlID09IGlyX3R5cGVfbG9vcF9qdW1wKSB7CisgICAgICAgICBpZigoKGlyX2xvb3BfanVtcCopaXIpLT5pc19icmVhaygpKQorICAgICAgICAgICAgcmV0dXJuIHN0cmVuZ3RoX2JyZWFrOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHN0cmVuZ3RoX2NvbnRpbnVlOworICAgICAgfSBlbHNlIGlmKGlyLT5pcl90eXBlID09IGlyX3R5cGVfcmV0dXJuKQorICAgICAgICAgcmV0dXJuIHN0cmVuZ3RoX3JldHVybjsKKyAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBzdHJlbmd0aF9ub25lOworICAgfQorCisgICBib29sIHNob3VsZF9sb3dlcl9qdW1wKGlyX2p1bXAqIGlyKQorICAgeworICAgICAgdW5zaWduZWQgc3RyZW5ndGggPSBnZXRfanVtcF9zdHJlbmd0aChpcik7CisgICAgICBib29sIGxvd2VyOworICAgICAgc3dpdGNoKHN0cmVuZ3RoKQorICAgICAgeworICAgICAgY2FzZSBzdHJlbmd0aF9ub25lOgorICAgICAgICAgbG93ZXIgPSBmYWxzZTsgLyogZG9uJ3QgY2hhbmdlIHRoaXMsIGNvZGUgcmVsaWVzIG9uIGl0ICovCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ugc3RyZW5ndGhfY29udGludWU6CisgICAgICAgICBsb3dlciA9IGxvd2VyX2NvbnRpbnVlOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHN0cmVuZ3RoX2JyZWFrOgorICAgICAgICAgYXNzZXJ0KHRoaXMtPmxvb3AubG9vcCk7CisgICAgICAgICAvKiBuZXZlciBsb3dlciAiY2Fub25pY2FsIGJyZWFrIiAqLworICAgICAgICAgaWYoaXItPmdldF9uZXh0KCktPmlzX3RhaWxfc2VudGluZWwoKSAmJiAodGhpcy0+bG9vcC5uZXN0aW5nX2RlcHRoID09IDAKKyAgICAgICAgICAgICAgIHx8ICh0aGlzLT5sb29wLm5lc3RpbmdfZGVwdGggPT0gMSAmJiB0aGlzLT5sb29wLmluX2lmX2F0X3RoZV9lbmRfb2ZfdGhlX2xvb3ApKSkKKyAgICAgICAgICAgIGxvd2VyID0gZmFsc2U7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3dlciA9IGxvd2VyX2JyZWFrOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHN0cmVuZ3RoX3JldHVybjoKKyAgICAgICAgIC8qIG5ldmVyIGxvd2VyIHJldHVybiBhdCB0aGUgZW5kIG9mIGEgdGhpcy0+ZnVuY3Rpb24gKi8KKyAgICAgICAgIGlmKHRoaXMtPmZ1bmN0aW9uLm5lc3RpbmdfZGVwdGggPT0gMCAmJiBpci0+Z2V0X25leHQoKS0+aXNfdGFpbF9zZW50aW5lbCgpKQorICAgICAgICAgICAgbG93ZXIgPSBmYWxzZTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvd2VyID0gdGhpcy0+ZnVuY3Rpb24ubG93ZXJfcmV0dXJuOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gbG93ZXI7CisgICB9CisKKyAgIGJsb2NrX3JlY29yZCB2aXNpdF9ibG9jayhleGVjX2xpc3QqIGxpc3QpCisgICB7CisgICAgICAvKiBOb3RlOiBzaW5jZSB2aXNpdGluZyBhIG5vZGUgbWF5IGNoYW5nZSB0aGF0IG5vZGUncyBuZXh0CisgICAgICAgKiBwb2ludGVyLCB3ZSBjYW4ndCB1c2UgdmlzaXRfZXhlY19saXN0KCksIGJlY2F1c2UKKyAgICAgICAqIHZpc2l0X2V4ZWNfbGlzdCgpIGNhY2hlcyB0aGUgbm9kZSdzIG5leHQgcG9pbnRlciBiZWZvcmUKKyAgICAgICAqIHZpc2l0aW5nIGl0LiAgU28gd2UgdXNlIGZvcmVhY2hfbGlzdCgpIGluc3RlYWQuCisgICAgICAgKgorICAgICAgICogZm9yZWFjaF9saXN0KCkgaXNuJ3Qgc2FmZSBpZiB0aGUgbm9kZSBiZWluZyB2aXNpdGVkIGdldHMKKyAgICAgICAqIHJlbW92ZWQsIGJ1dCBmb3J0dW5hdGVseSB0aGlzIHZpc2l0b3IgZG9lc24ndCBkbyB0aGF0LgorICAgICAgICovCisKKyAgICAgIGJsb2NrX3JlY29yZCBzYXZlZF9ibG9jayA9IHRoaXMtPmJsb2NrOworICAgICAgdGhpcy0+YmxvY2sgPSBibG9ja19yZWNvcmQoKTsKKyAgICAgIGZvcmVhY2hfbGlzdChub2RlLCBsaXN0KSB7CisgICAgICAgICAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hY2NlcHQodGhpcyk7CisgICAgICB9CisgICAgICBibG9ja19yZWNvcmQgcmV0ID0gdGhpcy0+YmxvY2s7CisgICAgICB0aGlzLT5ibG9jayA9IHNhdmVkX2Jsb2NrOworICAgICAgcmV0dXJuIHJldDsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2lmICppcikKKyAgIHsKKyAgICAgIGlmKHRoaXMtPmxvb3AubmVzdGluZ19kZXB0aCA9PSAwICYmIGlyLT5nZXRfbmV4dCgpLT5pc190YWlsX3NlbnRpbmVsKCkpCisgICAgICAgICB0aGlzLT5sb29wLmluX2lmX2F0X3RoZV9lbmRfb2ZfdGhlX2xvb3AgPSB0cnVlOworCisgICAgICArK3RoaXMtPmZ1bmN0aW9uLm5lc3RpbmdfZGVwdGg7CisgICAgICArK3RoaXMtPmxvb3AubmVzdGluZ19kZXB0aDsKKworICAgICAgYmxvY2tfcmVjb3JkIGJsb2NrX3JlY29yZHNbMl07CisgICAgICBpcl9qdW1wKiBqdW1wc1syXTsKKworICAgICAgLyogUmVjdXJzaXZlbHkgbG93ZXIgbmVzdGVkIGp1bXBzLiAgVGhpcyBzYXRpc2ZpZXMgdGhlCisgICAgICAgKiBDT05UQUlORURfSlVNUFNfTE9XRVJFRCBwb3N0Y29uZGl0aW9uLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YKKyAgICAgICAqIHVuY29uZGl0aW9uYWwganVtcHMgYXQgdGhlIGVuZCBvZiBpci0+dGhlbl9pbnN0cnVjdGlvbnMgYW5kCisgICAgICAgKiBpci0+ZWxzZV9pbnN0cnVjdGlvbnMsIHdoaWNoIGFyZSBoYW5kbGVkIGJlbG93LgorICAgICAgICovCisgICAgICBibG9ja19yZWNvcmRzWzBdID0gdmlzaXRfYmxvY2soJmlyLT50aGVuX2luc3RydWN0aW9ucyk7CisgICAgICBibG9ja19yZWNvcmRzWzFdID0gdmlzaXRfYmxvY2soJmlyLT5lbHNlX2luc3RydWN0aW9ucyk7CisKK3JldHJ5OiAvKiB3ZSBnZXQgaGVyZSBpZiB3ZSBwdXQgY29kZSBhZnRlciB0aGUgaWYgaW5zaWRlIGEgYnJhbmNoICovCisKKyAgICAgIC8qIERldGVybWluZSB3aGljaCBvZiBpci0+dGhlbl9pbnN0cnVjdGlvbnMgYW5kCisgICAgICAgKiBpci0+ZWxzZV9pbnN0cnVjdGlvbnMgZW5kIHdpdGggYW4gdW5jb25kaXRpb25hbCBqdW1wLgorICAgICAgICovCisgICAgICBmb3IodW5zaWduZWQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgIGV4ZWNfbGlzdCYgbGlzdCA9IGkgPyBpci0+ZWxzZV9pbnN0cnVjdGlvbnMgOiBpci0+dGhlbl9pbnN0cnVjdGlvbnM7CisgICAgICAgICBqdW1wc1tpXSA9IDA7CisgICAgICAgICBpZighbGlzdC5pc19lbXB0eSgpICYmIGdldF9qdW1wX3N0cmVuZ3RoKChpcl9pbnN0cnVjdGlvbiopbGlzdC5nZXRfdGFpbCgpKSkKKyAgICAgICAgICAgIGp1bXBzW2ldID0gKGlyX2p1bXAqKWxpc3QuZ2V0X3RhaWwoKTsKKyAgICAgIH0KKworICAgICAgLyogTG9vcCB1bnRpbCB3ZSBoYXZlIHNhdGlzZmllZCB0aGUgQ09OVEFJTkVEX0pVTVBTX0xPV0VSRUQKKyAgICAgICAqIHBvc3Rjb25kaXRpb24gYnkgbG93ZXJpbmcganVtcHMgaW4gYm90aCB0aGVuX2luc3RydWN0aW9ucyBhbmQKKyAgICAgICAqIGVsc2VfaW5zdHJ1Y3Rpb25zLgorICAgICAgICovCisgICAgICBmb3IoOzspIHsKKyAgICAgICAgIC8qIERldGVybWluZSB0aGUgdHlwZXMgb2YgdGhlIGp1bXBzIHRoYXQgdGVybWluYXRlCisgICAgICAgICAgKiBpci0+dGhlbl9pbnN0cnVjdGlvbnMgYW5kIGlyLT5lbHNlX2luc3RydWN0aW9ucy4KKyAgICAgICAgICAqLworICAgICAgICAganVtcF9zdHJlbmd0aCBqdW1wX3N0cmVuZ3Roc1syXTsKKworICAgICAgICAgZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgICAgICBpZihqdW1wc1tpXSkgeworICAgICAgICAgICAgICAganVtcF9zdHJlbmd0aHNbaV0gPSBibG9ja19yZWNvcmRzW2ldLm1pbl9zdHJlbmd0aDsKKyAgICAgICAgICAgICAgIGFzc2VydChqdW1wX3N0cmVuZ3Roc1tpXSA9PSBnZXRfanVtcF9zdHJlbmd0aChqdW1wc1tpXSkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICBqdW1wX3N0cmVuZ3Roc1tpXSA9IHN0cmVuZ3RoX25vbmU7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIElmIGJvdGggY29kZSBwYXRocyBlbmQgaW4gYSBqdW1wLCBhbmQgdGhlIGp1bXBzIGFyZSB0aGUKKyAgICAgICAgICAqIHNhbWUsIGFuZCB3ZSBhcmUgcHVsbGluZyBvdXQganVtcHMsIHJlcGxhY2UgdGhlbSB3aXRoIGEKKyAgICAgICAgICAqIHNpbmdsZSBqdW1wIHRoYXQgY29tZXMgYWZ0ZXIgdGhlIGlmIGluc3RydWN0aW9uLiAgVGhlIG5ldworICAgICAgICAgICoganVtcCB3aWxsIGJlIHZpc2l0ZWQgbmV4dCwgYW5kIGl0IHdpbGwgYmUgbG93ZXJlZCBpZgorICAgICAgICAgICogbmVjZXNzYXJ5IGJ5IHRoZSBsb29wIG9yIGNvbmRpdGlvbmFsIHRoYXQgZW5jbG9zZXMgaXQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGlmKHB1bGxfb3V0X2p1bXBzICYmIGp1bXBfc3RyZW5ndGhzWzBdID09IGp1bXBfc3RyZW5ndGhzWzFdKSB7CisgICAgICAgICAgICBib29sIHVuaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmKGp1bXBfc3RyZW5ndGhzWzBdID09IHN0cmVuZ3RoX2NvbnRpbnVlKQorICAgICAgICAgICAgICAgaXItPmluc2VydF9hZnRlcihuZXcoaXIpIGlyX2xvb3BfanVtcChpcl9sb29wX2p1bXA6Omp1bXBfY29udGludWUpKTsKKyAgICAgICAgICAgIGVsc2UgaWYoanVtcF9zdHJlbmd0aHNbMF0gPT0gc3RyZW5ndGhfYnJlYWspCisgICAgICAgICAgICAgICBpci0+aW5zZXJ0X2FmdGVyKG5ldyhpcikgaXJfbG9vcF9qdW1wKGlyX2xvb3BfanVtcDo6anVtcF9icmVhaykpOworICAgICAgICAgICAgLyogRklOSVNITUU6IHVuaWZ5IHJldHVybnMgd2l0aCBpZGVudGljYWwgZXhwcmVzc2lvbnMgKi8KKyAgICAgICAgICAgIGVsc2UgaWYoanVtcF9zdHJlbmd0aHNbMF0gPT0gc3RyZW5ndGhfcmV0dXJuICYmIHRoaXMtPmZ1bmN0aW9uLnNpZ25hdHVyZS0+cmV0dXJuX3R5cGUtPmlzX3ZvaWQoKSkKKyAgICAgICAgICAgICAgIGlyLT5pbnNlcnRfYWZ0ZXIobmV3KGlyKSBpcl9yZXR1cm4oTlVMTCkpOworCSAgICBlbHNlCisJICAgICAgIHVuaWZ5ID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmKHVuaWZ5KSB7CisgICAgICAgICAgICAgICBqdW1wc1swXS0+cmVtb3ZlKCk7CisgICAgICAgICAgICAgICBqdW1wc1sxXS0+cmVtb3ZlKCk7CisgICAgICAgICAgICAgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisKKyAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBqdW1wc1tdIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUganVtcHMKKyAgICAgICAgICAgICAgICAqIGFyZSBnb25lLCBhbmQgdXBkYXRlIGJsb2NrX3JlY29yZHNbXSB0byByZWZsZWN0IHRoZQorICAgICAgICAgICAgICAgICogZmFjdCB0aGF0IGNvbnRyb2wgY2FuIG5vdyBmbG93IHRvIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgKiBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAganVtcHNbMF0gPSAwOworICAgICAgICAgICAgICAganVtcHNbMV0gPSAwOworICAgICAgICAgICAgICAgYmxvY2tfcmVjb3Jkc1swXS5taW5fc3RyZW5ndGggPSBzdHJlbmd0aF9ub25lOworICAgICAgICAgICAgICAgYmxvY2tfcmVjb3Jkc1sxXS5taW5fc3RyZW5ndGggPSBzdHJlbmd0aF9ub25lOworCisgICAgICAgICAgICAgICAvKiBUaGUgQ09OVEFJTkVEX0pVTVBTX0xPV0VSRUQgcG9zdGNvbmRpdGlvbiBpcyBub3cKKyAgICAgICAgICAgICAgICAqIHNhdGlzZmllZCwgc28gd2UgY2FuIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIGxvd2VyIGEganVtcDogaWYgYm90aCBuZWVkIHRvIGxvd2VyZWQsIHN0YXJ0IHdpdGggdGhlIHN0cm9uZ2VzdCBvbmUsIHNvIHRoYXQKKyAgICAgICAgICAqIHdlIG1pZ2h0IGxhdGVyIHVuaWZ5IHRoZSBsb3dlcmVkIHZlcnNpb24gd2l0aCB0aGUgb3RoZXIgb25lCisgICAgICAgICAgKi8KKyAgICAgICAgIGJvb2wgc2hvdWxkX2xvd2VyWzJdOworICAgICAgICAgZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgMjsgKytpKQorICAgICAgICAgICAgc2hvdWxkX2xvd2VyW2ldID0gc2hvdWxkX2xvd2VyX2p1bXAoanVtcHNbaV0pOworCisgICAgICAgICBpbnQgbG93ZXI7CisgICAgICAgICBpZihzaG91bGRfbG93ZXJbMV0gJiYgc2hvdWxkX2xvd2VyWzBdKQorICAgICAgICAgICAgbG93ZXIgPSBqdW1wX3N0cmVuZ3Roc1sxXSA+IGp1bXBfc3RyZW5ndGhzWzBdOworICAgICAgICAgZWxzZSBpZihzaG91bGRfbG93ZXJbMF0pCisgICAgICAgICAgICBsb3dlciA9IDA7CisgICAgICAgICBlbHNlIGlmKHNob3VsZF9sb3dlclsxXSkKKyAgICAgICAgICAgIGxvd2VyID0gMTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qIE5laXRoZXIgY29kZSBwYXRoIGVuZHMgaW4gYSBqdW1wIHRoYXQgbmVlZHMgdG8gYmUKKyAgICAgICAgICAgICAqIGxvd2VyZWQsIHNvIHRoZSBDT05UQUlORURfSlVNUFNfTE9XRVJFRCBwb3N0Y29uZGl0aW9uCisgICAgICAgICAgICAgKiBpcyBzYXRpc2ZpZWQgYW5kIHdlIGNhbiBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBpZihqdW1wX3N0cmVuZ3Roc1tsb3dlcl0gPT0gc3RyZW5ndGhfcmV0dXJuKSB7CisgICAgICAgICAgICAvKiBUbyBsb3dlciBhIHJldHVybiwgd2UgY3JlYXRlIGEgcmV0dXJuIGZsYWcgKGlmIHRoZQorICAgICAgICAgICAgICogZnVuY3Rpb24gZG9lc24ndCBoYXZlIG9uZSBhbHJlYWR5KSBhbmQgYWRkIGluc3RydWN0aW9ucworICAgICAgICAgICAgICogdGhhdDogMS4gc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAoaWYgdGhpcyBmdW5jdGlvbiBoYXMgYQorICAgICAgICAgICAgICogbm9uLXZvaWQgcmV0dXJuKSBhbmQgMi4gc2V0IHRoZSByZXR1cm4gZmxhZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnNlcnRfbG93ZXJlZF9yZXR1cm4oKGlyX3JldHVybiopanVtcHNbbG93ZXJdKTsKKyAgICAgICAgICAgIGlmKHRoaXMtPmxvb3AubG9vcCkgeworICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIGluIGEgbG9vcCwgcmVwbGFjZSB0aGUgcmV0dXJuIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgKiB3aXRoIGEgYnJlYWsgaW5zdHJ1Y3Rpb24sIGFuZCB0aGVuIGxvb3Agc28gdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAqIGJyZWFrIGluc3RydWN0aW9uIGNhbiBiZSBsb3dlcmVkIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgaXJfbG9vcF9qdW1wKiBsb3dlcmVkID0gMDsKKyAgICAgICAgICAgICAgIGxvd2VyZWQgPSBuZXcoaXIpIGlyX2xvb3BfanVtcChpcl9sb29wX2p1bXA6Omp1bXBfYnJlYWspOworICAgICAgICAgICAgICAgLyogTm90ZTogd2UgbXVzdCB1cGRhdGUgYmxvY2tfcmVjb3JkcyBhbmQganVtcHMgdG8KKyAgICAgICAgICAgICAgICAqIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgY29udHJvbCBwYXRoIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgKiBhbHRlcmVkIGZyb20gYSByZXR1cm4gdG8gYSBicmVhay4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgYmxvY2tfcmVjb3Jkc1tsb3dlcl0ubWluX3N0cmVuZ3RoID0gc3RyZW5ndGhfYnJlYWs7CisgICAgICAgICAgICAgICBqdW1wc1tsb3dlcl0tPnJlcGxhY2Vfd2l0aChsb3dlcmVkKTsKKyAgICAgICAgICAgICAgIGp1bXBzW2xvd2VyXSA9IGxvd2VyZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIG5vdCBpbiBhIGxvb3AsIHdlIHRoZW4gcHJvY2VlZCBhcyB3ZSB3b3VsZAorICAgICAgICAgICAgICAgICogZm9yIGEgY29udGludWUgc3RhdGVtZW50IChzZXQgdGhlIGV4ZWN1dGUgZmxhZyB0bworICAgICAgICAgICAgICAgICogZmFsc2UgdG8gcHJldmVudCB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gZnJvbQorICAgICAgICAgICAgICAgICogZXhlY3V0aW5nKS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgZ290byBsb3dlcl9jb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIH0gZWxzZSBpZihqdW1wX3N0cmVuZ3Roc1tsb3dlcl0gPT0gc3RyZW5ndGhfYnJlYWspIHsKKyAgICAgICAgICAgIC8qIFRvIGxvd2VyIGEgYnJlYWssIHdlIGNyZWF0ZSBhIGJyZWFrIGZsYWcgKGlmIHRoZSBsb29wCisgICAgICAgICAgICAgKiBkb2Vzbid0IGhhdmUgb25lIGFscmVhZHkpIGFuZCBhZGQgYW4gaW5zdHJ1Y3Rpb24gdGhhdAorICAgICAgICAgICAgICogc2V0cyBpdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGVuIHdlIHByb2NlZWQgYXMgd2Ugd291bGQgZm9yIGEgY29udGludWUgc3RhdGVtZW50CisgICAgICAgICAgICAgKiAoc2V0IHRoZSBleGVjdXRlIGZsYWcgdG8gZmFsc2UgdG8gcHJldmVudCB0aGUgcmVzdCBvZgorICAgICAgICAgICAgICogdGhlIGxvb3AgYm9keSBmcm9tIGV4ZWN1dGluZykuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIHZpc2l0KCkgZnVuY3Rpb24gZm9yIHRoZSBsb29wIHdpbGwgZW5zdXJlIHRoYXQgdGhlCisgICAgICAgICAgICAgKiBicmVhayBmbGFnIGlzIGNoZWNrZWQgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBsb29wIGJvZHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGp1bXBzW2xvd2VyXS0+aW5zZXJ0X2JlZm9yZShjcmVhdGVfbG93ZXJlZF9icmVhaygpKTsKKyAgICAgICAgICAgIGdvdG8gbG93ZXJfY29udGludWU7CisgICAgICAgICB9IGVsc2UgaWYoanVtcF9zdHJlbmd0aHNbbG93ZXJdID09IHN0cmVuZ3RoX2NvbnRpbnVlKSB7Citsb3dlcl9jb250aW51ZToKKyAgICAgICAgICAgIC8qIFRvIGxvd2VyIGEgY29udGludWUsIHdlIGNyZWF0ZSBhbiBleGVjdXRlIGZsYWcgKGlmIHRoZQorICAgICAgICAgICAgICogbG9vcCBkb2Vzbid0IGhhdmUgb25lIGFscmVhZHkpIGFuZCByZXBsYWNlIHRoZSBjb250aW51ZQorICAgICAgICAgICAgICogd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IGNsZWFycyBpdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2RlIHBhdGggZ2V0cyBleGVyY2lzZWQgd2hlbiBsb3dlcmluZworICAgICAgICAgICAgICogcmV0dXJuIHN0YXRlbWVudHMgdGhhdCBhcmUgbm90IGluc2lkZSBhIGxvb3AsIHNvCisgICAgICAgICAgICAgKiB0aGlzLT5sb29wIG11c3QgYmUgaW5pdGlhbGl6ZWQgZXZlbiBvdXRzaWRlIG9mIGxvb3BzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpcl92YXJpYWJsZSogZXhlY3V0ZV9mbGFnID0gdGhpcy0+bG9vcC5nZXRfZXhlY3V0ZV9mbGFnKCk7CisgICAgICAgICAgICBqdW1wc1tsb3dlcl0tPnJlcGxhY2Vfd2l0aChuZXcoaXIpIGlyX2Fzc2lnbm1lbnQobmV3IChpcikgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoZXhlY3V0ZV9mbGFnKSwgbmV3IChpcikgaXJfY29uc3RhbnQoZmFsc2UpLCAwKSk7CisgICAgICAgICAgICAvKiBOb3RlOiB3ZSBtdXN0IHVwZGF0ZSBibG9ja19yZWNvcmRzIGFuZCBqdW1wcyB0byByZWZsZWN0CisgICAgICAgICAgICAgKiB0aGUgZmFjdCB0aGF0IHRoZSBjb250cm9sIHBhdGggaGFzIGJlZW4gYWx0ZXJlZCB0byBhbgorICAgICAgICAgICAgICogaW5zdHJ1Y3Rpb24gdGhhdCBjbGVhcnMgdGhlIGV4ZWN1dGUgZmxhZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAganVtcHNbbG93ZXJdID0gMDsKKyAgICAgICAgICAgIGJsb2NrX3JlY29yZHNbbG93ZXJdLm1pbl9zdHJlbmd0aCA9IHN0cmVuZ3RoX2Fsd2F5c19jbGVhcnNfZXhlY3V0ZV9mbGFnOworICAgICAgICAgICAgYmxvY2tfcmVjb3Jkc1tsb3dlcl0ubWF5X2NsZWFyX2V4ZWN1dGVfZmxhZyA9IHRydWU7CisgICAgICAgICAgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisKKyAgICAgICAgICAgIC8qIExldCB0aGUgbG9vcCBydW4gYWdhaW4sIGluIGNhc2UgdGhlIG90aGVyIGJyYW5jaCBvZiB0aGUKKyAgICAgICAgICAgICAqIGlmIG5lZWRzIHRvIGJlIGxvd2VyZWQgdG9vLgorICAgICAgICAgICAgICovCisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIG1vdmUgb3V0IGEganVtcCBvdXQgaWYgcG9zc2libGUgKi8KKyAgICAgIGlmKHB1bGxfb3V0X2p1bXBzKSB7CisgICAgICAgICAvKiBJZiBvbmUgb2YgdGhlIGJyYW5jaGVzIGVuZHMgaW4gYSBqdW1wLCBhbmQgY29udHJvbCBjYW5ub3QKKyAgICAgICAgICAqIGZhbGwgb3V0IHRoZSBib3R0b20gb2YgdGhlIG90aGVyIGJyYW5jaCwgdGhlbiB3ZSBjYW4gbW92ZQorICAgICAgICAgICogdGhlIGp1bXAgYWZ0ZXIgdGhlIGlmLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFNldCBtb3ZlX291dCB0byB0aGUgYnJhbmNoIHdlIGFyZSBtb3ZpbmcgYSBqdW1wIG91dCBvZi4KKyAgICAgICAgICAqLworICAgICAgICAgaW50IG1vdmVfb3V0ID0gLTE7CisgICAgICAgICBpZihqdW1wc1swXSAmJiBibG9ja19yZWNvcmRzWzFdLm1pbl9zdHJlbmd0aCA+PSBzdHJlbmd0aF9jb250aW51ZSkKKyAgICAgICAgICAgIG1vdmVfb3V0ID0gMDsKKyAgICAgICAgIGVsc2UgaWYoanVtcHNbMV0gJiYgYmxvY2tfcmVjb3Jkc1swXS5taW5fc3RyZW5ndGggPj0gc3RyZW5ndGhfY29udGludWUpCisgICAgICAgICAgICBtb3ZlX291dCA9IDE7CisKKyAgICAgICAgIGlmKG1vdmVfb3V0ID49IDApCisgICAgICAgICB7CisgICAgICAgICAgICBqdW1wc1ttb3ZlX291dF0tPnJlbW92ZSgpOworICAgICAgICAgICAgaXItPmluc2VydF9hZnRlcihqdW1wc1ttb3ZlX291dF0pOworICAgICAgICAgICAgLyogTm90ZTogd2UgbXVzdCB1cGRhdGUgYmxvY2tfcmVjb3JkcyBhbmQganVtcHMgdG8gcmVmbGVjdAorICAgICAgICAgICAgICogdGhlIGZhY3QgdGhhdCB0aGUganVtcCBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIGlmLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBqdW1wc1ttb3ZlX291dF0gPSAwOworICAgICAgICAgICAgYmxvY2tfcmVjb3Jkc1ttb3ZlX291dF0ubWluX3N0cmVuZ3RoID0gc3RyZW5ndGhfbm9uZTsKKyAgICAgICAgICAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogTm93IHNhdGlzZnkgdGhlIEFOQUxZU0lTIHBvc3Rjb25kaXRpb24gYnkgc2V0dGluZworICAgICAgICogdGhpcy0+YmxvY2subWluX3N0cmVuZ3RoIGFuZAorICAgICAgICogdGhpcy0+YmxvY2subWF5X2NsZWFyX2V4ZWN1dGVfZmxhZyBiYXNlZCBvbiB0aGUKKyAgICAgICAqIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgdHdvIGJyYW5jaGVzLgorICAgICAgICovCisgICAgICBpZihibG9ja19yZWNvcmRzWzBdLm1pbl9zdHJlbmd0aCA8IGJsb2NrX3JlY29yZHNbMV0ubWluX3N0cmVuZ3RoKQorICAgICAgICAgdGhpcy0+YmxvY2subWluX3N0cmVuZ3RoID0gYmxvY2tfcmVjb3Jkc1swXS5taW5fc3RyZW5ndGg7CisgICAgICBlbHNlCisgICAgICAgICB0aGlzLT5ibG9jay5taW5fc3RyZW5ndGggPSBibG9ja19yZWNvcmRzWzFdLm1pbl9zdHJlbmd0aDsKKyAgICAgIHRoaXMtPmJsb2NrLm1heV9jbGVhcl9leGVjdXRlX2ZsYWcgPSB0aGlzLT5ibG9jay5tYXlfY2xlYXJfZXhlY3V0ZV9mbGFnIHx8IGJsb2NrX3JlY29yZHNbMF0ubWF5X2NsZWFyX2V4ZWN1dGVfZmxhZyB8fCBibG9ja19yZWNvcmRzWzFdLm1heV9jbGVhcl9leGVjdXRlX2ZsYWc7CisKKyAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBpbnN0cnVjdGlvbnMgdGhhdCBmb2xsb3cgdGhlCisgICAgICAgKiBpZi4KKyAgICAgICAqCisgICAgICAgKiBJZiB0aG9zZSBpbnN0cnVjdGlvbnMgYXJlIHVucmVhY2hhYmxlLCB0aGVuIHNhdGlzZnkgdGhlCisgICAgICAgKiBERUFEX0NPREVfRUxJTUlOQVRJT04gcG9zdGNvbmRpdGlvbiBieSBlbGltaW5hdGluZyB0aGVtLgorICAgICAgICogT3RoZXJ3aXNlIHRoYXQgcG9zdGNvbmRpdGlvbiBpcyBhbHJlYWR5IHNhdGlzZmllZC4KKyAgICAgICAqLworICAgICAgaWYodGhpcy0+YmxvY2subWluX3N0cmVuZ3RoKQorICAgICAgICAgdHJ1bmNhdGVfYWZ0ZXJfaW5zdHJ1Y3Rpb24oaXIpOworICAgICAgZWxzZSBpZih0aGlzLT5ibG9jay5tYXlfY2xlYXJfZXhlY3V0ZV9mbGFnKQorICAgICAgeworICAgICAgICAgLyogSWYgdGhlICJpZiIgaW5zdHJ1Y3Rpb24gbWlnaHQgY2xlYXIgdGhlIGV4ZWN1dGUgZmxhZywgdGhlbgorICAgICAgICAgICogd2UgbmVlZCB0byBndWFyZCBhbnkgaW5zdHJ1Y3Rpb25zIHRoYXQgZm9sbG93IHNvIHRoYXQgdGhleQorICAgICAgICAgICogYXJlIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGV4ZWN1dGUgZmxhZyBpcyBzZXQuCisgICAgICAgICAgKgorICAgICAgICAgICogSWYgb25lIG9mIHRoZSBicmFuY2hlcyBvZiB0aGUgImlmIiBhbHdheXMgY2xlYXJzIHRoZQorICAgICAgICAgICogZXhlY3V0ZSBmbGFnLCBhbmQgdGhlIG90aGVyIGJyYW5jaCBuZXZlciBjbGVhcnMgaXQsIHRoZW4KKyAgICAgICAgICAqIHRoaXMgaXMgZWFzeToganVzdCBtb3ZlIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIGZvbGxvd2luZyB0aGUKKyAgICAgICAgICAqICJpZiIgaW50byB0aGUgYnJhbmNoIHRoYXQgbmV2ZXIgY2xlYXJzIGl0LgorICAgICAgICAgICovCisgICAgICAgICBpbnQgbW92ZV9pbnRvID0gLTE7CisgICAgICAgICBpZihibG9ja19yZWNvcmRzWzBdLm1pbl9zdHJlbmd0aCAmJiAhYmxvY2tfcmVjb3Jkc1sxXS5tYXlfY2xlYXJfZXhlY3V0ZV9mbGFnKQorICAgICAgICAgICAgbW92ZV9pbnRvID0gMTsKKyAgICAgICAgIGVsc2UgaWYoYmxvY2tfcmVjb3Jkc1sxXS5taW5fc3RyZW5ndGggJiYgIWJsb2NrX3JlY29yZHNbMF0ubWF5X2NsZWFyX2V4ZWN1dGVfZmxhZykKKyAgICAgICAgICAgIG1vdmVfaW50byA9IDA7CisKKyAgICAgICAgIGlmKG1vdmVfaW50byA+PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQoIWJsb2NrX3JlY29yZHNbbW92ZV9pbnRvXS5taW5fc3RyZW5ndGggJiYgIWJsb2NrX3JlY29yZHNbbW92ZV9pbnRvXS5tYXlfY2xlYXJfZXhlY3V0ZV9mbGFnKTsgLyogb3RoZXJ3aXNlLCB3ZSBqdXN0IHRydW5jYXRlZCAqLworCisgICAgICAgICAgICBleGVjX2xpc3QqIGxpc3QgPSBtb3ZlX2ludG8gPyAmaXItPmVsc2VfaW5zdHJ1Y3Rpb25zIDogJmlyLT50aGVuX2luc3RydWN0aW9uczsKKyAgICAgICAgICAgIGV4ZWNfbm9kZSogbmV4dCA9IGlyLT5nZXRfbmV4dCgpOworICAgICAgICAgICAgaWYoIW5leHQtPmlzX3RhaWxfc2VudGluZWwoKSkgeworICAgICAgICAgICAgICAgbW92ZV9vdXRlcl9ibG9ja19pbnNpZGUoaXIsIGxpc3QpOworCisgICAgICAgICAgICAgICAvKiBJZiBhbnkgaW5zdHJ1Y3Rpb25zIG1vdmVkLCB0aGVuIHdlIG5lZWQgdG8gdmlzaXQKKyAgICAgICAgICAgICAgICAqIHRoZW0gKHNpbmNlIHRoZXkgYXJlIG5vdyBpbnNpZGUgdGhlICJpZiIpLiAgU2luY2UKKyAgICAgICAgICAgICAgICAqIGJsb2NrX3JlY29yZHNbbW92ZV9pbnRvXSBpcyBpbiBpdHMgZGVmYXVsdCBzdGF0ZQorICAgICAgICAgICAgICAgICogKHNlZSBhc3NlcnRpb24gYWJvdmUpLCB3ZSBjYW4gc2FmZWx5IHJlcGxhY2UKKyAgICAgICAgICAgICAgICAqIGJsb2NrX3JlY29yZHNbbW92ZV9pbnRvXSB3aXRoIHRoZSByZXN1bHQgb2YgdGhpcworICAgICAgICAgICAgICAgICogYW5hbHlzaXMuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGV4ZWNfbGlzdCBsaXN0OworICAgICAgICAgICAgICAgbGlzdC5oZWFkID0gbmV4dDsKKyAgICAgICAgICAgICAgIGJsb2NrX3JlY29yZHNbbW92ZV9pbnRvXSA9IHZpc2l0X2Jsb2NrKCZsaXN0KTsKKworICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIFRoZW4gd2UgbmVlZCB0byByZS1zdGFydCBvdXIganVtcCBsb3dlcmluZywgc2luY2Ugb25lCisgICAgICAgICAgICAgICAgKiBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHdlIG1vdmVkIG1pZ2h0IGJlIGEganVtcCB0aGF0CisgICAgICAgICAgICAgICAgKiBuZWVkcyB0byBiZSBsb3dlcmVkLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB0aGVuIHRoZSBzaW1wbGUgY2FzZSBkaWRuJ3QgYXBwbHk7IHdlCisgICAgICAgICAgICAgKiBuZWVkIHRvIGFjdHVhbGx5IGd1YXJkIHRoZSBpbnN0cnVjdGlvbnMgdGhhdCBmb2xsb3cuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVG8gYXZvaWQgY3JlYXRpbmcgdW5uZWNlc3NhcmlseS1kZWVwIG5lc3RpbmcsIGZpcnN0CisgICAgICAgICAgICAgKiBsb29rIHRocm91Z2ggdGhlIGluc3RydWN0aW9ucyB0aGF0IGZvbGxvdyBhbmQgdW53cmFwCisgICAgICAgICAgICAgKiBhbnkgaW5zdHJ1Y3Rpb25zIHRoYXQgdGhhdCBhcmUgYWxyZWFkeSB3cmFwcGVkIGluIHRoZQorICAgICAgICAgICAgICogYXBwcm9wcmlhdGUgZ3VhcmQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlyX2luc3RydWN0aW9uKiBpcl9hZnRlcjsKKyAgICAgICAgICAgIGZvcihpcl9hZnRlciA9IChpcl9pbnN0cnVjdGlvbiopaXItPmdldF9uZXh0KCk7ICFpcl9hZnRlci0+aXNfdGFpbF9zZW50aW5lbCgpOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlyX2lmKiBpcl9pZiA9IGlyX2FmdGVyLT5hc19pZigpOworICAgICAgICAgICAgICAgaWYoaXJfaWYgJiYgaXJfaWYtPmVsc2VfaW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKiBpcl9pZl9jb25kX2RlcmVmID0gaXJfaWYtPmNvbmRpdGlvbi0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgICAgICAgICAgICAgICAgIGlmKGlyX2lmX2NvbmRfZGVyZWYgJiYgaXJfaWZfY29uZF9kZXJlZi0+dmFyID09IHRoaXMtPmxvb3AuZXhlY3V0ZV9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICBpcl9pbnN0cnVjdGlvbiogaXJfbmV4dCA9IChpcl9pbnN0cnVjdGlvbiopaXJfYWZ0ZXItPmdldF9uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICBpcl9hZnRlci0+aW5zZXJ0X2JlZm9yZSgmaXJfaWYtPnRoZW5faW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgIGlyX2FmdGVyLT5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgIGlyX2FmdGVyID0gaXJfbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaXJfYWZ0ZXIgPSAoaXJfaW5zdHJ1Y3Rpb24qKWlyX2FmdGVyLT5nZXRfbmV4dCgpOworCisgICAgICAgICAgICAgICAvKiBvbmx5IHNldCB0aGlzIGlmIHdlIGZpbmQgYW55IHVucHJvdGVjdGVkIGluc3RydWN0aW9uICovCisgICAgICAgICAgICAgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRoZW4sIHdyYXAgYWxsIHRoZSBpbnN0cnVjdGlvbnMgdGhhdCBmb2xsb3cgaW4gYSBzaW5nbGUKKyAgICAgICAgICAgICAqIGd1YXJkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZighaXItPmdldF9uZXh0KCktPmlzX3RhaWxfc2VudGluZWwoKSkgeworICAgICAgICAgICAgICAgYXNzZXJ0KHRoaXMtPmxvb3AuZXhlY3V0ZV9mbGFnKTsKKyAgICAgICAgICAgICAgIGlyX2lmKiBpZl9leGVjdXRlID0gbmV3KGlyKSBpcl9pZihuZXcoaXIpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRoaXMtPmxvb3AuZXhlY3V0ZV9mbGFnKSk7CisgICAgICAgICAgICAgICBtb3ZlX291dGVyX2Jsb2NrX2luc2lkZShpciwgJmlmX2V4ZWN1dGUtPnRoZW5faW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgICAgIGlyLT5pbnNlcnRfYWZ0ZXIoaWZfZXhlY3V0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICAtLXRoaXMtPmxvb3AubmVzdGluZ19kZXB0aDsKKyAgICAgIC0tdGhpcy0+ZnVuY3Rpb24ubmVzdGluZ19kZXB0aDsKKyAgIH0KKworICAgdmlydHVhbCB2b2lkIHZpc2l0KGlyX2xvb3AgKmlyKQorICAgeworICAgICAgLyogVmlzaXQgdGhlIGJvZHkgb2YgdGhlIGxvb3AsIHdpdGggYSBmcmVzaCBkYXRhIHN0cnVjdHVyZSBpbgorICAgICAgICogdGhpcy0+bG9vcCBzbyB0aGF0IHRoZSBhbmFseXNpcyB3ZSBkbyBoZXJlIHdvbid0IGJsZWVkIGludG8KKyAgICAgICAqIGVuY2xvc2luZyBsb29wcy4KKyAgICAgICAqCisgICAgICAgKiBXZSBhc3N1bWUgdGhhdCBhbGwgY29kZSBhZnRlciBhIGxvb3AgaXMgcmVhY2hhYmxlIGZyb20gdGhlCisgICAgICAgKiBsb29wIChzZWUgY29tbWVudHMgb24gZW51bSBqdW1wX3N0cmVuZ3RoKSwgc28gdGhlCisgICAgICAgKiBERUFEX0NPREVfRUxJTUlOQVRJT04gcG9zdGNvbmRpdGlvbiBpcyBhdXRvbWF0aWNhbGx5CisgICAgICAgKiBzYXRpc2ZpZWQsIGFzIGlzIHRoZSBibG9jay5taW5fc3RyZW5ndGggcG9ydGlvbiBvZiB0aGUKKyAgICAgICAqIEFOQUxZU0lTIHBvc3Rjb25kaXRpb24uCisgICAgICAgKgorICAgICAgICogVGhlIGJsb2NrLm1heV9jbGVhcl9leGVjdXRlX2ZsYWcgcG9ydGlvbiBvZiB0aGUgQU5BTFlTSVMKKyAgICAgICAqIHBvc3Rjb25kaXRpb24gaXMgYXV0b21hdGljYWxseSBzYXRpc2ZpZWQgYmVjYXVzZSBleGVjdXRlCisgICAgICAgKiBmbGFncyBkbyBub3QgcHJvcGFnYXRlIG91dHNpZGUgb2YgbG9vcHMuCisgICAgICAgKgorICAgICAgICogVGhlIGxvb3AubWF5X3NldF9yZXR1cm5fZmxhZyBwb3J0aW9uIG9mIHRoZSBBTkFMWVNJUworICAgICAgICogcG9zdGNvbmRpdGlvbiBpcyBoYW5kbGVkIGJlbG93LgorICAgICAgICovCisgICAgICArK3RoaXMtPmZ1bmN0aW9uLm5lc3RpbmdfZGVwdGg7CisgICAgICBsb29wX3JlY29yZCBzYXZlZF9sb29wID0gdGhpcy0+bG9vcDsKKyAgICAgIHRoaXMtPmxvb3AgPSBsb29wX3JlY29yZCh0aGlzLT5mdW5jdGlvbi5zaWduYXR1cmUsIGlyKTsKKworICAgICAgLyogUmVjdXJzaXZlbHkgbG93ZXIgbmVzdGVkIGp1bXBzLiAgVGhpcyBzYXRpc2ZpZXMgdGhlCisgICAgICAgKiBDT05UQUlORURfSlVNUFNfTE9XRVJFRCBwb3N0Y29uZGl0aW9uLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YKKyAgICAgICAqIGFuIHVuY29uZGl0aW9uYWwgY29udGludWUgb3IgcmV0dXJuIGF0IHRoZSBib3R0b20gb2YgdGhlCisgICAgICAgKiBsb29wLCB3aGljaCBhcmUgaGFuZGxlZCBiZWxvdy4KKyAgICAgICAqLworICAgICAgYmxvY2tfcmVjb3JkIGJvZHkgPSB2aXNpdF9ibG9jaygmaXItPmJvZHlfaW5zdHJ1Y3Rpb25zKTsKKworICAgICAgLyogSWYgdGhlIGxvb3AgZW5kcyBpbiBhbiB1bmNvbmRpdGlvbmFsIGNvbnRpbnVlLCBlbGltaW5hdGUgaXQKKyAgICAgICAqIGJlY2F1c2UgaXQgaXMgcmVkdW5kYW50LgorICAgICAgICovCisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXJfbGFzdAorICAgICAgICAgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgaXItPmJvZHlfaW5zdHJ1Y3Rpb25zLmdldF90YWlsKCk7CisgICAgICBpZiAoZ2V0X2p1bXBfc3RyZW5ndGgoaXJfbGFzdCkgPT0gc3RyZW5ndGhfY29udGludWUpIHsKKyAgICAgICAgIGlyX2xhc3QtPnJlbW92ZSgpOworICAgICAgfQorCisgICAgICAvKiBJZiB0aGUgbG9vcCBlbmRzIGluIGFuIHVuY29uZGl0aW9uYWwgcmV0dXJuLCBhbmQgd2UgYXJlCisgICAgICAgKiBsb3dlcmluZyByZXR1cm5zLCBsb3dlciBpdC4KKyAgICAgICAqLworICAgICAgaWYgKHRoaXMtPmZ1bmN0aW9uLmxvd2VyX3JldHVybikKKyAgICAgICAgIGxvd2VyX3JldHVybl91bmNvbmRpdGlvbmFsbHkoaXJfbGFzdCk7CisKKyAgICAgIGlmKGJvZHkubWluX3N0cmVuZ3RoID49IHN0cmVuZ3RoX2JyZWFrKSB7CisgICAgICAgICAvKiBGSU5JU0hNRTogSWYgdGhlIG1pbl9zdHJlbmd0aCBvZiB0aGUgbG9vcCBib2R5IGlzCisgICAgICAgICAgKiBzdHJlbmd0aF9icmVhayBvciBzdHJlbmd0aF9yZXR1cm4sIHRoYXQgbWVhbnMgdGhhdCBpdAorICAgICAgICAgICogaXNuJ3QgYSBsb29wIGF0IGFsbCwgc2luY2UgY29udHJvbCBmbG93IGFsd2F5cyBsZWF2ZXMgdGhlCisgICAgICAgICAgKiBib2R5IG9mIHRoZSBsb29wIHZpYSBicmVhayBvciByZXR1cm4uICBJbiBwcmluY2lwbGUgdGhlCisgICAgICAgICAgKiBsb29wIGNvdWxkIGJlIGVsaW1pbmF0ZWQgaW4gdGhpcyBjYXNlLiAgVGhpcyBvcHRpbWl6YXRpb24KKyAgICAgICAgICAqIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisgICAgICAgICAgKi8KKyAgICAgIH0KKworICAgICAgaWYodGhpcy0+bG9vcC5icmVha19mbGFnKSB7CisgICAgICAgICAvKiBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGFyZSBsb3dlcmluZyBicmVha3MgKi8KKyAgICAgICAgIGFzc2VydCAobG93ZXJfYnJlYWspOworCisgICAgICAgICAvKiBJZiBhIGJyZWFrIGZsYWcgd2FzIGdlbmVyYXRlZCB3aGlsZSB2aXNpdGluZyB0aGUgYm9keSBvZgorICAgICAgICAgICogdGhlIGxvb3AsIHRoZW4gYXQgbGVhc3Qgb25lIGJyZWFrIHdhcyBsb3dlcmVkLCBzbyB3ZSBuZWVkCisgICAgICAgICAgKiB0byBnZW5lcmF0ZSBhbiBpZiBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCB0aGF0CisgICAgICAgICAgKiBkb2VzIGEgImJyZWFrIiBpZiB0aGUgYnJlYWsgZmxhZyBpcyBzZXQuICBUaGUgYnJlYWsgd2UKKyAgICAgICAgICAqIGdlbmVyYXRlIHdvbid0IHZpb2xhdGUgdGhlIENPTlRBSU5FRF9KVU1QU19MT1dFUkVECisgICAgICAgICAgKiBwb3N0Y29uZGl0aW9uLCBiZWNhdXNlIHNob3VsZF9sb3dlcl9qdW1wKCkgYWx3YXlzIHJldHVybnMKKyAgICAgICAgICAqIGZhbHNlIGZvciBhIGJyZWFrIHRoYXQgaGFwcGVucyBhdCB0aGUgZW5kIG9mIGEgbG9vcC4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBIb3dldmVyLCBpZiB0aGUgbG9vcCBhbHJlYWR5IGVuZHMgaW4gYSBjb25kaXRpb25hbCBvcgorICAgICAgICAgICogdW5jb25kaXRpb25hbCBicmVhaywgdGhlbiB3ZSBuZWVkIHRvIGxvd2VyIHRoYXQgYnJlYWssCisgICAgICAgICAgKiBiZWNhdXNlIGl0IHdvbid0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AgYW55bW9yZS4KKyAgICAgICAgICAqLworICAgICAgICAgbG93ZXJfZmluYWxfYnJlYWtzKCZpci0+Ym9keV9pbnN0cnVjdGlvbnMpOworCisgICAgICAgICBpcl9pZiogYnJlYWtfaWYgPSBuZXcoaXIpIGlyX2lmKG5ldyhpcikgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGhpcy0+bG9vcC5icmVha19mbGFnKSk7CisgICAgICAgICBicmVha19pZi0+dGhlbl9pbnN0cnVjdGlvbnMucHVzaF90YWlsKG5ldyhpcikgaXJfbG9vcF9qdW1wKGlyX2xvb3BfanVtcDo6anVtcF9icmVhaykpOworICAgICAgICAgaXItPmJvZHlfaW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChicmVha19pZik7CisgICAgICB9CisKKyAgICAgIC8qIElmIHRoZSBib2R5IG9mIHRoZSBsb29wIG1heSBzZXQgdGhlIHJldHVybiBmbGFnLCB0aGVuIGF0CisgICAgICAgKiBsZWFzdCBvbmUgcmV0dXJuIHdhcyBsb3dlcmVkIHRvIGEgYnJlYWssIHNvIHdlIG5lZWQgdG8gZW5zdXJlCisgICAgICAgKiB0aGF0IHRoZSByZXR1cm4gZmxhZyBpcyBjaGVja2VkIGFmdGVyIHRoZSBib2R5IG9mIHRoZSBsb29wIGlzCisgICAgICAgKiBleGVjdXRlZC4KKyAgICAgICAqLworICAgICAgaWYodGhpcy0+bG9vcC5tYXlfc2V0X3JldHVybl9mbGFnKSB7CisgICAgICAgICBhc3NlcnQodGhpcy0+ZnVuY3Rpb24ucmV0dXJuX2ZsYWcpOworICAgICAgICAgLyogR2VuZXJhdGUgdGhlIGlmIHN0YXRlbWVudCB0byBjaGVjayB0aGUgcmV0dXJuIGZsYWcgKi8KKyAgICAgICAgIGlyX2lmKiByZXR1cm5faWYgPSBuZXcoaXIpIGlyX2lmKG5ldyhpcikgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGhpcy0+ZnVuY3Rpb24ucmV0dXJuX2ZsYWcpKTsKKyAgICAgICAgIC8qIE5vdGU6IHdlIGFsc28gbmVlZCB0byBwcm9wYWdhdGUgdGhlIGtub3dsZWRnZSB0aGF0IHRoZQorICAgICAgICAgICogcmV0dXJuIGZsYWcgbWF5IGdldCBzZXQgdG8gdGhlIG91dGVyIGNvbnRleHQuICBUaGlzCisgICAgICAgICAgKiBzYXRpc2ZpZXMgdGhlIGxvb3AubWF5X3NldF9yZXR1cm5fZmxhZyBwYXJ0IG9mIHRoZQorICAgICAgICAgICogQU5BTFlTSVMgcG9zdGNvbmRpdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICAgc2F2ZWRfbG9vcC5tYXlfc2V0X3JldHVybl9mbGFnID0gdHJ1ZTsKKyAgICAgICAgIGlmKHNhdmVkX2xvb3AubG9vcCkKKyAgICAgICAgICAgIC8qIElmIHRoaXMgbG9vcCBpcyBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgb25lLCB0aGVuIHRoZSBpZgorICAgICAgICAgICAgICogc3RhdGVtZW50IHRoYXQgd2UgZ2VuZXJhdGVkIHNob3VsZCBicmVhayBvdXQgb2YgdGhhdAorICAgICAgICAgICAgICogbG9vcCBpZiB0aGUgcmV0dXJuIGZsYWcgaXMgc2V0LiAgQ2FsbGVyIHdpbGwgbG93ZXIgdGhhdAorICAgICAgICAgICAgICogYnJlYWsgc3RhdGVtZW50IGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuX2lmLT50aGVuX2luc3RydWN0aW9ucy5wdXNoX3RhaWwobmV3KGlyKSBpcl9sb29wX2p1bXAoaXJfbG9vcF9qdW1wOjpqdW1wX2JyZWFrKSk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBPdGhlcndpc2UsIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAgICAgICogaW5zdHJ1Y3Rpb25zIHRoYXQgZm9sbG93IGFyZSBvbmx5IGV4ZWN1dGVkIGlmIHRoZQorICAgICAgICAgICAgICogcmV0dXJuIGZsYWcgaXMgY2xlYXIuICBXZSBjYW4gZG8gdGhhdCBieSBtb3ZpbmcgdGhvc2UKKyAgICAgICAgICAgICAqIGluc3RydWN0aW9ucyBpbnRvIHRoZSBlbHNlIGNsYXVzZSBvZiB0aGUgZ2VuZXJhdGVkIGlmCisgICAgICAgICAgICAgKiBzdGF0ZW1lbnQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1vdmVfb3V0ZXJfYmxvY2tfaW5zaWRlKGlyLCAmcmV0dXJuX2lmLT5lbHNlX2luc3RydWN0aW9ucyk7CisgICAgICAgICBpci0+aW5zZXJ0X2FmdGVyKHJldHVybl9pZik7CisgICAgICB9CisKKyAgICAgIHRoaXMtPmxvb3AgPSBzYXZlZF9sb29wOworICAgICAgLS10aGlzLT5mdW5jdGlvbi5uZXN0aW5nX2RlcHRoOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICppcikKKyAgIHsKKyAgICAgIC8qIHRoZXNlIGFyZSBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5ICovCisgICAgICBhc3NlcnQoIXRoaXMtPmZ1bmN0aW9uLnNpZ25hdHVyZSk7CisgICAgICBhc3NlcnQoIXRoaXMtPmxvb3AubG9vcCk7CisKKyAgICAgIGJvb2wgbG93ZXJfcmV0dXJuOworICAgICAgaWYgKHN0cmNtcChpci0+ZnVuY3Rpb25fbmFtZSgpLCAibWFpbiIpID09IDApCisgICAgICAgICBsb3dlcl9yZXR1cm4gPSBsb3dlcl9tYWluX3JldHVybjsKKyAgICAgIGVsc2UKKyAgICAgICAgIGxvd2VyX3JldHVybiA9IGxvd2VyX3N1Yl9yZXR1cm47CisKKyAgICAgIGZ1bmN0aW9uX3JlY29yZCBzYXZlZF9mdW5jdGlvbiA9IHRoaXMtPmZ1bmN0aW9uOworICAgICAgbG9vcF9yZWNvcmQgc2F2ZWRfbG9vcCA9IHRoaXMtPmxvb3A7CisgICAgICB0aGlzLT5mdW5jdGlvbiA9IGZ1bmN0aW9uX3JlY29yZChpciwgbG93ZXJfcmV0dXJuKTsKKyAgICAgIHRoaXMtPmxvb3AgPSBsb29wX3JlY29yZChpcik7CisKKyAgICAgIGFzc2VydCghdGhpcy0+bG9vcC5sb29wKTsKKworICAgICAgLyogVmlzaXQgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIHRvIGxvd2VyIGFueSBqdW1wcyB0aGF0IG9jY3VyCisgICAgICAgKiBpbiBpdCwgZXhjZXB0IHBvc3NpYmx5IGFuIHVuY29uZGl0aW9uYWwgcmV0dXJuIHN0YXRlbWVudCBhdAorICAgICAgICogdGhlIGVuZCBvZiBpdC4KKyAgICAgICAqLworICAgICAgdmlzaXRfYmxvY2soJmlyLT5ib2R5KTsKKworICAgICAgLyogSWYgdGhlIGJvZHkgZW5kZWQgaW4gYW4gdW5jb25kaXRpb25hbCByZXR1cm4gb2Ygbm9uLXZvaWQsCisgICAgICAgKiB0aGVuIHdlIGRvbid0IG5lZWQgdG8gbG93ZXIgaXQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgY2Fub25pY2FsCisgICAgICAgKiByZXR1cm4uCisgICAgICAgKgorICAgICAgICogSWYgdGhlIGJvZHkgZW5kZWQgaW4gYSByZXR1cm4gb2Ygdm9pZCwgZWxpbWluYXRlIGl0IGJlY2F1c2UKKyAgICAgICAqIGl0IGlzIHJlZHVuZGFudC4KKyAgICAgICAqLworICAgICAgaWYgKGlyLT5yZXR1cm5fdHlwZS0+aXNfdm9pZCgpICYmCisgICAgICAgICAgZ2V0X2p1bXBfc3RyZW5ndGgoKGlyX2luc3RydWN0aW9uICopIGlyLT5ib2R5LmdldF90YWlsKCkpKSB7CisgICAgICAgICBpcl9qdW1wICpqdW1wID0gKGlyX2p1bXAgKikgaXItPmJvZHkuZ2V0X3RhaWwoKTsKKyAgICAgICAgIGFzc2VydCAoanVtcC0+aXJfdHlwZSA9PSBpcl90eXBlX3JldHVybik7CisgICAgICAgICBqdW1wLT5yZW1vdmUoKTsKKyAgICAgIH0KKworICAgICAgaWYodGhpcy0+ZnVuY3Rpb24ucmV0dXJuX3ZhbHVlKQorICAgICAgICAgaXItPmJvZHkucHVzaF90YWlsKG5ldyhpcikgaXJfcmV0dXJuKG5ldyAoaXIpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRoaXMtPmZ1bmN0aW9uLnJldHVybl92YWx1ZSkpKTsKKworICAgICAgdGhpcy0+bG9vcCA9IHNhdmVkX2xvb3A7CisgICAgICB0aGlzLT5mdW5jdGlvbiA9IHNhdmVkX2Z1bmN0aW9uOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgdmlzaXQoY2xhc3MgaXJfZnVuY3Rpb24gKiBpcikKKyAgIHsKKyAgICAgIHZpc2l0X2Jsb2NrKCZpci0+c2lnbmF0dXJlcyk7CisgICB9Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworYm9vbAorZG9fbG93ZXJfanVtcHMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsIGJvb2wgcHVsbF9vdXRfanVtcHMsIGJvb2wgbG93ZXJfc3ViX3JldHVybiwgYm9vbCBsb3dlcl9tYWluX3JldHVybiwgYm9vbCBsb3dlcl9jb250aW51ZSwgYm9vbCBsb3dlcl9icmVhaykKK3sKKyAgIGlyX2xvd2VyX2p1bXBzX3Zpc2l0b3IgdjsKKyAgIHYucHVsbF9vdXRfanVtcHMgPSBwdWxsX291dF9qdW1wczsKKyAgIHYubG93ZXJfY29udGludWUgPSBsb3dlcl9jb250aW51ZTsKKyAgIHYubG93ZXJfYnJlYWsgPSBsb3dlcl9icmVhazsKKyAgIHYubG93ZXJfc3ViX3JldHVybiA9IGxvd2VyX3N1Yl9yZXR1cm47CisgICB2Lmxvd2VyX21haW5fcmV0dXJuID0gbG93ZXJfbWFpbl9yZXR1cm47CisKKyAgIGJvb2wgcHJvZ3Jlc3NfZXZlciA9IGZhbHNlOworICAgZG8geworICAgICAgdi5wcm9ncmVzcyA9IGZhbHNlOworICAgICAgdmlzaXRfZXhlY19saXN0KGluc3RydWN0aW9ucywgJnYpOworICAgICAgcHJvZ3Jlc3NfZXZlciA9IHYucHJvZ3Jlc3MgfHwgcHJvZ3Jlc3NfZXZlcjsKKyAgIH0gd2hpbGUgKHYucHJvZ3Jlc3MpOworCisgICByZXR1cm4gcHJvZ3Jlc3NfZXZlcjsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfbWF0X29wX3RvX3ZlYy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX21hdF9vcF90b192ZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNWVlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX21hdF9vcF90b192ZWMuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsb3dlcl9tYXRfb3BfdG9fdmVjLmNwcAorICoKKyAqIEJyZWFrcyBtYXRyaXggb3BlcmF0aW9uIGV4cHJlc3Npb25zIGRvd24gdG8gYSBzZXJpZXMgb2YgdmVjdG9yIG9wZXJhdGlvbnMuCisgKgorICogR2VuZXJhbGx5IHRoaXMgaXMgaG93IHdlIGhhdmUgdG8gY29kZWdlbiBtYXRyaXggb3BlcmF0aW9ucyBmb3IgYQorICogR1BVLCBzbyB0aGlzIGdpdmVzIHVzIHRoZSBjaGFuY2UgdG8gY29uc3RhbnQgZm9sZCBvcGVyYXRpb25zIG9uIGEKKyAqIGNvbHVtbiBvciByb3cuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfZXhwcmVzc2lvbl9mbGF0dGVuaW5nLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBpcl9tYXRfb3BfdG9fdmVjX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfbWF0X29wX3RvX3ZlY192aXNpdG9yKCkKKyAgIHsKKyAgICAgIHRoaXMtPm1hZGVfcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIHRoaXMtPm1lbV9jdHggPSBOVUxMOworICAgfQorCisgICBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICopOworCisgICBpcl9kZXJlZmVyZW5jZSAqZ2V0X2NvbHVtbihpcl9kZXJlZmVyZW5jZSAqdmFsLCBpbnQgY29sKTsKKyAgIGlyX3J2YWx1ZSAqZ2V0X2VsZW1lbnQoaXJfZGVyZWZlcmVuY2UgKnZhbCwgaW50IGNvbCwgaW50IHJvdyk7CisKKyAgIHZvaWQgZG9fbXVsX21hdF9tYXQoaXJfZGVyZWZlcmVuY2UgKnJlc3VsdCwKKwkJICAgICAgIGlyX2RlcmVmZXJlbmNlICphLCBpcl9kZXJlZmVyZW5jZSAqYik7CisgICB2b2lkIGRvX211bF9tYXRfdmVjKGlyX2RlcmVmZXJlbmNlICpyZXN1bHQsCisJCSAgICAgICBpcl9kZXJlZmVyZW5jZSAqYSwgaXJfZGVyZWZlcmVuY2UgKmIpOworICAgdm9pZCBkb19tdWxfdmVjX21hdChpcl9kZXJlZmVyZW5jZSAqcmVzdWx0LAorCQkgICAgICAgaXJfZGVyZWZlcmVuY2UgKmEsIGlyX2RlcmVmZXJlbmNlICpiKTsKKyAgIHZvaWQgZG9fbXVsX21hdF9zY2FsYXIoaXJfZGVyZWZlcmVuY2UgKnJlc3VsdCwKKwkJCSAgaXJfZGVyZWZlcmVuY2UgKmEsIGlyX2RlcmVmZXJlbmNlICpiKTsKKyAgIHZvaWQgZG9fZXF1YWxfbWF0X21hdChpcl9kZXJlZmVyZW5jZSAqcmVzdWx0LCBpcl9kZXJlZmVyZW5jZSAqYSwKKwkJCSBpcl9kZXJlZmVyZW5jZSAqYiwgYm9vbCB0ZXN0X2VxdWFsKTsKKworICAgdm9pZCAqbWVtX2N0eDsKKyAgIGJvb2wgbWFkZV9wcm9ncmVzczsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitzdGF0aWMgYm9vbAorbWF0X29wX3RvX3ZlY19wcmVkaWNhdGUoaXJfaW5zdHJ1Y3Rpb24gKmlyKQoreworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IGlyLT5hc19leHByZXNzaW9uKCk7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgaWYgKCFleHByKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBmb3IgKGkgPSAwOyBpIDwgZXhwci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKyAgICAgIGlmIChleHByLT5vcGVyYW5kc1tpXS0+dHlwZS0+aXNfbWF0cml4KCkpCisJIHJldHVybiB0cnVlOworICAgfQorCisgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK2RvX21hdF9vcF90b192ZWMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBpcl9tYXRfb3BfdG9fdmVjX3Zpc2l0b3IgdjsKKworICAgLyogUHVsbCBvdXQgYW55IG1hdHJpeCBleHByZXNzaW9uIHRvIGEgc2VwYXJhdGUgYXNzaWdubWVudCB0byBhCisgICAgKiB0ZW1wLiAgVGhpcyB3aWxsIG1ha2Ugb3VyIGhhbmRsaW5nIG9mIHRoZSBicmVha2Rvd24gdG8KKyAgICAqIG9wZXJhdGlvbnMgb24gdGhlIG1hdHJpeCdzIHZlY3RvciBjb21wb25lbnRzIG11Y2ggZWFzaWVyLgorICAgICovCisgICBkb19leHByZXNzaW9uX2ZsYXR0ZW5pbmcoaW5zdHJ1Y3Rpb25zLCBtYXRfb3BfdG9fdmVjX3ByZWRpY2F0ZSk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7CisKKyAgIHJldHVybiB2Lm1hZGVfcHJvZ3Jlc3M7Cit9CisKK2lyX3J2YWx1ZSAqCitpcl9tYXRfb3BfdG9fdmVjX3Zpc2l0b3I6OmdldF9lbGVtZW50KGlyX2RlcmVmZXJlbmNlICp2YWwsIGludCBjb2wsIGludCByb3cpCit7CisgICB2YWwgPSBnZXRfY29sdW1uKHZhbCwgY29sKTsKKworICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9zd2l6emxlKHZhbCwgcm93LCAwLCAwLCAwLCAxKTsKK30KKworaXJfZGVyZWZlcmVuY2UgKgoraXJfbWF0X29wX3RvX3ZlY192aXNpdG9yOjpnZXRfY29sdW1uKGlyX2RlcmVmZXJlbmNlICp2YWwsIGludCByb3cpCit7CisgICB2YWwgPSB2YWwtPmNsb25lKG1lbV9jdHgsIE5VTEwpOworCisgICBpZiAodmFsLT50eXBlLT5pc19tYXRyaXgoKSkgeworICAgICAgdmFsID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KHZhbCwKKwkJCQkJICAgICAgbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KHJvdykpOworICAgfQorCisgICByZXR1cm4gdmFsOworfQorCit2b2lkCitpcl9tYXRfb3BfdG9fdmVjX3Zpc2l0b3I6OmRvX211bF9tYXRfbWF0KGlyX2RlcmVmZXJlbmNlICpyZXN1bHQsCisJCQkJCSBpcl9kZXJlZmVyZW5jZSAqYSwKKwkJCQkJIGlyX2RlcmVmZXJlbmNlICpiKQoreworICAgdW5zaWduZWQgYl9jb2wsIGk7CisgICBpcl9hc3NpZ25tZW50ICphc3NpZ247CisgICBpcl9leHByZXNzaW9uICpleHByOworCisgICBmb3IgKGJfY29sID0gMDsgYl9jb2wgPCBiLT50eXBlLT5tYXRyaXhfY29sdW1uczsgYl9jb2wrKykgeworICAgICAgLyogZmlyc3QgY29sdW1uICovCisgICAgICBleHByID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbXVsLAorCQkJCQlnZXRfY29sdW1uKGEsIDApLAorCQkJCQlnZXRfZWxlbWVudChiLCBiX2NvbCwgMCkpOworCisgICAgICAvKiBmb2xsb3dpbmcgY29sdW1ucyAqLworICAgICAgZm9yIChpID0gMTsgaSA8IGEtPnR5cGUtPm1hdHJpeF9jb2x1bW5zOyBpKyspIHsKKwkgaXJfZXhwcmVzc2lvbiAqbXVsX2V4cHI7CisKKwkgbXVsX2V4cHIgPSBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tdWwsCisJCQkJCSAgICAgICBnZXRfY29sdW1uKGEsIGkpLAorCQkJCQkgICAgICAgZ2V0X2VsZW1lbnQoYiwgYl9jb2wsIGkpKTsKKwkgZXhwciA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX2FkZCwKKwkJCQkJICAgZXhwciwKKwkJCQkJICAgbXVsX2V4cHIpOworICAgICAgfQorCisgICAgICBhc3NpZ24gPSBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChnZXRfY29sdW1uKHJlc3VsdCwgYl9jb2wpLCBleHByKTsKKyAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKKyAgIH0KK30KKwordm9pZAoraXJfbWF0X29wX3RvX3ZlY192aXNpdG9yOjpkb19tdWxfbWF0X3ZlYyhpcl9kZXJlZmVyZW5jZSAqcmVzdWx0LAorCQkJCQkgaXJfZGVyZWZlcmVuY2UgKmEsCisJCQkJCSBpcl9kZXJlZmVyZW5jZSAqYikKK3sKKyAgIHVuc2lnbmVkIGk7CisgICBpcl9hc3NpZ25tZW50ICphc3NpZ247CisgICBpcl9leHByZXNzaW9uICpleHByOworCisgICAvKiBmaXJzdCBjb2x1bW4gKi8KKyAgIGV4cHIgPSBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tdWwsCisJCQkJICAgICBnZXRfY29sdW1uKGEsIDApLAorCQkJCSAgICAgZ2V0X2VsZW1lbnQoYiwgMCwgMCkpOworCisgICAvKiBmb2xsb3dpbmcgY29sdW1ucyAqLworICAgZm9yIChpID0gMTsgaSA8IGEtPnR5cGUtPm1hdHJpeF9jb2x1bW5zOyBpKyspIHsKKyAgICAgIGlyX2V4cHJlc3Npb24gKm11bF9leHByOworCisgICAgICBtdWxfZXhwciA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKGlyX2Jpbm9wX211bCwKKwkJCQkJICAgIGdldF9jb2x1bW4oYSwgaSksCisJCQkJCSAgICBnZXRfZWxlbWVudChiLCAwLCBpKSk7CisgICAgICBleHByID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfYWRkLCBleHByLCBtdWxfZXhwcik7CisgICB9CisKKyAgIHJlc3VsdCA9IHJlc3VsdC0+Y2xvbmUobWVtX2N0eCwgTlVMTCk7CisgICBhc3NpZ24gPSBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChyZXN1bHQsIGV4cHIpOworICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworfQorCit2b2lkCitpcl9tYXRfb3BfdG9fdmVjX3Zpc2l0b3I6OmRvX211bF92ZWNfbWF0KGlyX2RlcmVmZXJlbmNlICpyZXN1bHQsCisJCQkJCSBpcl9kZXJlZmVyZW5jZSAqYSwKKwkJCQkJIGlyX2RlcmVmZXJlbmNlICpiKQoreworICAgdW5zaWduZWQgaTsKKworICAgZm9yIChpID0gMDsgaSA8IGItPnR5cGUtPm1hdHJpeF9jb2x1bW5zOyBpKyspIHsKKyAgICAgIGlyX3J2YWx1ZSAqY29sdW1uX3Jlc3VsdDsKKyAgICAgIGlyX2V4cHJlc3Npb24gKmNvbHVtbl9leHByOworICAgICAgaXJfYXNzaWdubWVudCAqY29sdW1uX2Fzc2lnbjsKKworICAgICAgY29sdW1uX3Jlc3VsdCA9IHJlc3VsdC0+Y2xvbmUobWVtX2N0eCwgTlVMTCk7CisgICAgICBjb2x1bW5fcmVzdWx0ID0gbmV3KG1lbV9jdHgpIGlyX3N3aXp6bGUoY29sdW1uX3Jlc3VsdCwgaSwgMCwgMCwgMCwgMSk7CisKKyAgICAgIGNvbHVtbl9leHByID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfZG90LAorCQkJCQkgICAgICAgYS0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJCSAgICAgICBnZXRfY29sdW1uKGIsIGkpKTsKKworICAgICAgY29sdW1uX2Fzc2lnbiA9IG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KGNvbHVtbl9yZXN1bHQsCisJCQkJCQkgY29sdW1uX2V4cHIpOworICAgICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShjb2x1bW5fYXNzaWduKTsKKyAgIH0KK30KKwordm9pZAoraXJfbWF0X29wX3RvX3ZlY192aXNpdG9yOjpkb19tdWxfbWF0X3NjYWxhcihpcl9kZXJlZmVyZW5jZSAqcmVzdWx0LAorCQkJCQkgICAgaXJfZGVyZWZlcmVuY2UgKmEsCisJCQkJCSAgICBpcl9kZXJlZmVyZW5jZSAqYikKK3sKKyAgIHVuc2lnbmVkIGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBhLT50eXBlLT5tYXRyaXhfY29sdW1uczsgaSsrKSB7CisgICAgICBpcl9leHByZXNzaW9uICpjb2x1bW5fZXhwcjsKKyAgICAgIGlyX2Fzc2lnbm1lbnQgKmNvbHVtbl9hc3NpZ247CisKKyAgICAgIGNvbHVtbl9leHByID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbXVsLAorCQkJCQkgICAgICAgZ2V0X2NvbHVtbihhLCBpKSwKKwkJCQkJICAgICAgIGItPmNsb25lKG1lbV9jdHgsIE5VTEwpKTsKKworICAgICAgY29sdW1uX2Fzc2lnbiA9IG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KGdldF9jb2x1bW4ocmVzdWx0LCBpKSwKKwkJCQkJCSBjb2x1bW5fZXhwcik7CisgICAgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGNvbHVtbl9hc3NpZ24pOworICAgfQorfQorCit2b2lkCitpcl9tYXRfb3BfdG9fdmVjX3Zpc2l0b3I6OmRvX2VxdWFsX21hdF9tYXQoaXJfZGVyZWZlcmVuY2UgKnJlc3VsdCwKKwkJCQkJICAgaXJfZGVyZWZlcmVuY2UgKmEsCisJCQkJCSAgIGlyX2RlcmVmZXJlbmNlICpiLAorCQkJCQkgICBib29sIHRlc3RfZXF1YWwpCit7CisgICAvKiBUaGlzIGVzc2VudGlhbGx5IGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBHTFNMOgorICAgICoKKyAgICAqIGJvb2wgZXF1YWwobWF0NCBhLCBtYXQ0IGIpCisgICAgKiB7CisgICAgKiAgIHJldHVybiAhYW55KGJ2ZWM0KGFbMF0gIT0gYlswXSwKKyAgICAqICAgICAgICAgICAgICAgICAgICAgYVsxXSAhPSBiWzFdLAorICAgICogICAgICAgICAgICAgICAgICAgICBhWzJdICE9IGJbMl0sCisgICAgKiAgICAgICAgICAgICAgICAgICAgIGFbM10gIT0gYlszXSk7CisgICAgKiB9CisgICAgKgorICAgICogYm9vbCBuZXF1YWwobWF0NCBhLCBtYXQ0IGIpCisgICAgKiB7CisgICAgKiAgIHJldHVybiBhbnkoYnZlYzQoYVswXSAhPSBiWzBdLAorICAgICogICAgICAgICAgICAgICAgICAgIGFbMV0gIT0gYlsxXSwKKyAgICAqICAgICAgICAgICAgICAgICAgICBhWzJdICE9IGJbMl0sCisgICAgKiAgICAgICAgICAgICAgICAgICAgYVszXSAhPSBiWzNdKTsKKyAgICAqIH0KKyAgICAqLworICAgY29uc3QgdW5zaWduZWQgY29sdW1ucyA9IGEtPnR5cGUtPm1hdHJpeF9jb2x1bW5zOworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCBidmVjX3R5cGUgPQorICAgICAgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoR0xTTF9UWVBFX0JPT0wsIGNvbHVtbnMsIDEpOworCisgICBpcl92YXJpYWJsZSAqY29uc3QgdG1wX2J2ZWMgPQorICAgICAgbmV3KHRoaXMtPm1lbV9jdHgpIGlyX3ZhcmlhYmxlKGJ2ZWNfdHlwZSwgIm1hdF9jbXBfYnZlYyIsCisJCQkJICAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIHRoaXMtPmJhc2VfaXItPmluc2VydF9iZWZvcmUodG1wX2J2ZWMpOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY29sdW1uczsgaSsrKSB7CisgICAgICBpcl9leHByZXNzaW9uICpjb25zdCBjbXAgPQorCSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9hbnlfbmVxdWFsLAorCQkJCQkgIGdldF9jb2x1bW4oYSwgaSksCisJCQkJCSAgZ2V0X2NvbHVtbihiLCBpKSk7CisKKyAgICAgIGlyX2RlcmVmZXJlbmNlICpjb25zdCBsaHMgPQorCSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodG1wX2J2ZWMpOworCisgICAgICBpcl9hc3NpZ25tZW50ICpjb25zdCBhc3NpZ24gPQorCSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfYXNzaWdubWVudChsaHMsIGNtcCwgTlVMTCwgKDFVIDw8IGkpKTsKKworICAgICAgdGhpcy0+YmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworICAgfQorCisgICBpcl9ydmFsdWUgKmNvbnN0IHZhbCA9IG5ldyh0aGlzLT5tZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0bXBfYnZlYyk7CisgICBpcl9leHByZXNzaW9uICphbnkgPSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2FueSwgdmFsKTsKKworICAgaWYgKHRlc3RfZXF1YWwpCisgICAgICBhbnkgPSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2xvZ2ljX25vdCwgYW55KTsKKworICAgaXJfYXNzaWdubWVudCAqY29uc3QgYXNzaWduID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KHJlc3VsdC0+Y2xvbmUobWVtX2N0eCwgTlVMTCksIGFueSk7CisgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGFzc2lnbik7Cit9CisKK3N0YXRpYyBib29sCitoYXNfbWF0cml4X29wZXJhbmQoY29uc3QgaXJfZXhwcmVzc2lvbiAqZXhwciwgdW5zaWduZWQgJmNvbHVtbnMpCit7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZXhwci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKyAgICAgIGlmIChleHByLT5vcGVyYW5kc1tpXS0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKwkgY29sdW1ucyA9IGV4cHItPm9wZXJhbmRzW2ldLT50eXBlLT5tYXRyaXhfY29sdW1uczsKKwkgcmV0dXJuIHRydWU7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBmYWxzZTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfbWF0X29wX3RvX3ZlY192aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICpvcmlnX2Fzc2lnbikKK3sKKyAgIGlyX2V4cHJlc3Npb24gKm9yaWdfZXhwciA9IG9yaWdfYXNzaWduLT5yaHMtPmFzX2V4cHJlc3Npb24oKTsKKyAgIHVuc2lnbmVkIGludCBpLCBtYXRyaXhfY29sdW1ucyA9IDE7CisgICBpcl9kZXJlZmVyZW5jZSAqb3BbMl07CisKKyAgIGlmICghb3JpZ19leHByKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICBpZiAoIWhhc19tYXRyaXhfb3BlcmFuZChvcmlnX2V4cHIsIG1hdHJpeF9jb2x1bW5zKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgYXNzZXJ0KG9yaWdfZXhwci0+Z2V0X251bV9vcGVyYW5kcygpIDw9IDIpOworCisgICBtZW1fY3R4ID0gcmFsbG9jX3BhcmVudChvcmlnX2Fzc2lnbik7CisKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpyZXN1bHQgPQorICAgICAgb3JpZ19hc3NpZ24tPmxocy0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgIGFzc2VydChyZXN1bHQpOworCisgICAvKiBTdG9yZSB0aGUgZXhwcmVzc2lvbiBvcGVyYW5kcyBpbiB0ZW1wcyBzbyB3ZSBjYW4gdXNlIHRoZW0KKyAgICAqIG11bHRpcGxlIHRpbWVzLgorICAgICovCisgICBmb3IgKGkgPSAwOyBpIDwgb3JpZ19leHByLT5nZXRfbnVtX29wZXJhbmRzKCk7IGkrKykgeworICAgICAgaXJfYXNzaWdubWVudCAqYXNzaWduOworICAgICAgaXJfZGVyZWZlcmVuY2UgKmRlcmVmID0gb3JpZ19leHByLT5vcGVyYW5kc1tpXS0+YXNfZGVyZWZlcmVuY2UoKTsKKworICAgICAgLyogQXZvaWQgbWFraW5nIGEgdGVtcG9yYXJ5IGlmIHdlIGRvbid0IG5lZWQgdG8gdG8gYXZvaWQgYWxpYXNpbmcuICovCisgICAgICBpZiAoZGVyZWYgJiYKKwkgIGRlcmVmLT52YXJpYWJsZV9yZWZlcmVuY2VkKCkgIT0gcmVzdWx0LT52YXJpYWJsZV9yZWZlcmVuY2VkKCkpIHsKKwkgb3BbaV0gPSBkZXJlZjsKKwkgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIE90aGVyd2lzZSwgc3RvcmUgdGhlIG9wZXJhbmQgaW4gYSB0ZW1wb3JhcnkgZ2VuZXJhbGx5IGlmIGl0J3MKKyAgICAgICAqIG5vdCBhIGRlcmVmZXJlbmNlLgorICAgICAgICovCisgICAgICBpcl92YXJpYWJsZSAqdmFyID0gbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKG9yaWdfZXhwci0+b3BlcmFuZHNbaV0tPnR5cGUsCisJCQkJCQkgICJtYXRfb3BfdG9fdmVjIiwKKwkJCQkJCSAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKHZhcik7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB3ZSB1c2UgdGhpcyBkZXJlZmVyZW5jZSBmb3IgdGhlIGFzc2lnbm1lbnQuICBUaGF0IG1lYW5zCisgICAgICAgKiB0aGF0IG90aGVycyB0aGF0IHdhbnQgdG8gdXNlIG9wW2ldIGhhdmUgdG8gY2xvbmUgdGhlIGRlcmVmLgorICAgICAgICovCisgICAgICBvcFtpXSA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgICAgYXNzaWduID0gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQob3BbaV0sIG9yaWdfZXhwci0+b3BlcmFuZHNbaV0pOworICAgICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworICAgfQorCisgICAvKiBPSywgdGltZSB0byBicmVhayBkb3duIHRoaXMgbWF0cml4IG9wZXJhdGlvbi4gKi8KKyAgIHN3aXRjaCAob3JpZ19leHByLT5vcGVyYXRpb24pIHsKKyAgIGNhc2UgaXJfdW5vcF9uZWc6IHsKKyAgICAgIC8qIEFwcGx5IHRoZSBvcGVyYXRpb24gdG8gZWFjaCBjb2x1bW4uKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXRyaXhfY29sdW1uczsgaSsrKSB7CisJIGlyX2V4cHJlc3Npb24gKmNvbHVtbl9leHByOworCSBpcl9hc3NpZ25tZW50ICpjb2x1bW5fYXNzaWduOworCisJIGNvbHVtbl9leHByID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24ob3JpZ19leHByLT5vcGVyYXRpb24sCisJCQkJCQkgIGdldF9jb2x1bW4ob3BbMF0sIGkpKTsKKworCSBjb2x1bW5fYXNzaWduID0gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQoZ2V0X2NvbHVtbihyZXN1bHQsIGkpLAorCQkJCQkJICAgIGNvbHVtbl9leHByKTsKKwkgYXNzZXJ0KGNvbHVtbl9hc3NpZ24tPndyaXRlX21hc2sgIT0gMCk7CisJIGJhc2VfaXItPmluc2VydF9iZWZvcmUoY29sdW1uX2Fzc2lnbik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKyAgIGNhc2UgaXJfYmlub3BfYWRkOgorICAgY2FzZSBpcl9iaW5vcF9zdWI6CisgICBjYXNlIGlyX2Jpbm9wX2RpdjoKKyAgIGNhc2UgaXJfYmlub3BfbW9kOiB7CisgICAgICAvKiBGb3IgbW9zdCBvcGVyYXRpb25zLCB0aGUgbWF0cml4IHZlcnNpb24gaXMganVzdCBnb2luZworICAgICAgICogY29sdW1uLXdpc2UgdGhyb3VnaCBhbmQgYXBwbHlpbmcgdGhlIG9wZXJhdGlvbiB0byBlYWNoIGNvbHVtbgorICAgICAgICogaWYgYXZhaWxhYmxlLgorICAgICAgICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF0cml4X2NvbHVtbnM7IGkrKykgeworCSBpcl9leHByZXNzaW9uICpjb2x1bW5fZXhwcjsKKwkgaXJfYXNzaWdubWVudCAqY29sdW1uX2Fzc2lnbjsKKworCSBjb2x1bW5fZXhwciA9IG5ldyhtZW1fY3R4KSBpcl9leHByZXNzaW9uKG9yaWdfZXhwci0+b3BlcmF0aW9uLAorCQkJCQkJICBnZXRfY29sdW1uKG9wWzBdLCBpKSwKKwkJCQkJCSAgZ2V0X2NvbHVtbihvcFsxXSwgaSkpOworCisJIGNvbHVtbl9hc3NpZ24gPSBuZXcobWVtX2N0eCkgaXJfYXNzaWdubWVudChnZXRfY29sdW1uKHJlc3VsdCwgaSksCisJCQkJCQkgICAgY29sdW1uX2V4cHIpOworCSBhc3NlcnQoY29sdW1uX2Fzc2lnbi0+d3JpdGVfbWFzayAhPSAwKTsKKwkgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShjb2x1bW5fYXNzaWduKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgfQorICAgY2FzZSBpcl9iaW5vcF9tdWw6CisgICAgICBpZiAob3BbMF0tPnR5cGUtPmlzX21hdHJpeCgpKSB7CisJIGlmIChvcFsxXS0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKwkgICAgZG9fbXVsX21hdF9tYXQocmVzdWx0LCBvcFswXSwgb3BbMV0pOworCSB9IGVsc2UgaWYgKG9wWzFdLT50eXBlLT5pc192ZWN0b3IoKSkgeworCSAgICBkb19tdWxfbWF0X3ZlYyhyZXN1bHQsIG9wWzBdLCBvcFsxXSk7CisJIH0gZWxzZSB7CisJICAgIGFzc2VydChvcFsxXS0+dHlwZS0+aXNfc2NhbGFyKCkpOworCSAgICBkb19tdWxfbWF0X3NjYWxhcihyZXN1bHQsIG9wWzBdLCBvcFsxXSk7CisJIH0KKyAgICAgIH0gZWxzZSB7CisJIGFzc2VydChvcFsxXS0+dHlwZS0+aXNfbWF0cml4KCkpOworCSBpZiAob3BbMF0tPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisJICAgIGRvX211bF92ZWNfbWF0KHJlc3VsdCwgb3BbMF0sIG9wWzFdKTsKKwkgfSBlbHNlIHsKKwkgICAgYXNzZXJ0KG9wWzBdLT50eXBlLT5pc19zY2FsYXIoKSk7CisJICAgIGRvX211bF9tYXRfc2NhbGFyKHJlc3VsdCwgb3BbMV0sIG9wWzBdKTsKKwkgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfYWxsX2VxdWFsOgorICAgY2FzZSBpcl9iaW5vcF9hbnlfbmVxdWFsOgorICAgICAgZG9fZXF1YWxfbWF0X21hdChyZXN1bHQsIG9wWzFdLCBvcFswXSwKKwkJICAgICAgIChvcmlnX2V4cHItPm9wZXJhdGlvbiA9PSBpcl9iaW5vcF9hbGxfZXF1YWwpKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKCJGSU5JU0hNRTogSGFuZGxlIG1hdHJpeCBvcGVyYXRpb24gZm9yICVzXG4iLAorCSAgICAgb3JpZ19leHByLT5vcGVyYXRvcl9zdHJpbmcoKSk7CisgICAgICBhYm9ydCgpOworICAgfQorICAgb3JpZ19hc3NpZ24tPnJlbW92ZSgpOworICAgdGhpcy0+bWFkZV9wcm9ncmVzcyA9IHRydWU7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfbmFtZWRfaW50ZXJmYWNlX2Jsb2Nrcy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX25hbWVkX2ludGVyZmFjZV9ibG9ja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTBkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX25hbWVkX2ludGVyZmFjZV9ibG9ja3MuY3BwCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgbG93ZXJfbmFtZWRfaW50ZXJmYWNlX2Jsb2Nrcy5jcHAKKyAqCisgKiBUaGlzIGxvd2VyaW5nIHBhc3MgY29udmVydHMgYWxsIGludGVyZmFjZSBibG9ja3Mgd2l0aCBpbnN0YW5jZSBuYW1lcworICogaW50byBpbnRlcmZhY2UgYmxvY2tzIHdpdGhvdXQgYW4gaW5zdGFuY2UgbmFtZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzaGFkZXI6CisgKgorICogICBvdXQgYmxvY2sgeworICogICAgIGZsb2F0IGJsb2NrX3ZhcjsKKyAqICAgfSBpbnN0X25hbWU7CisgKgorICogICBtYWluKCkKKyAqICAgeworICogICAgIGluc3RfbmFtZS5ibG9ja192YXIgPSAwLjA7CisgKiAgIH0KKyAqCisgKiBJcyByZXdyaXR0ZW4gdG86CisgKgorICogICBvdXQgYmxvY2sgeworICogICAgIGZsb2F0IGJsb2NrX3ZhcjsKKyAqICAgfTsKKyAqCisgKiAgIG1haW4oKQorICogICB7CisgKiAgICAgYmxvY2tfdmFyID0gMC4wOworICogICB9CisgKgorICogVGhpcyB0YWtlcyBwbGFjZSBhZnRlciB0aGUgc2hhZGVyIGNvZGUgaGFzIGFscmVhZHkgYmVlbiB2ZXJpZmllZCB3aXRoCisgKiB0aGUgaW50ZXJmYWNlIG5hbWUgaW4gcGxhY2UuCisgKgorICogVGhlIGxpbmtpbmcgcGhhc2Ugd2lsbCB1c2UgdGhlIGludGVyZmFjZSBibG9jayBuYW1lIHJhdGhlciB0aGFuIHRoZQorICogaW50ZXJmYWNlJ3MgaW5zdGFuY2UgbmFtZSB3aGVuIGxpbmtpbmcgaW50ZXJmYWNlcy4KKyAqCisgKiBUaGlzIG1vZGlmaWNhdGlvbiB0byB0aGUgaXIgYWxsb3dzIG91ciBjdXJyZW50bHkgZXhpc3RpbmcgZGVhZCBjb2RlCisgKiBlbGltaW5hdGlvbiB0byB3b3JrIHdpdGggaW50ZXJmYWNlIGJsb2NrcyB3aXRob3V0IGNoYW5nZXMuCisgKi8KKworI2luY2x1ZGUgImdsc2xfc3ltYm9sX3RhYmxlLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBmbGF0dGVuX25hbWVkX2ludGVyZmFjZV9ibG9ja3NfZGVjbGFyYXRpb25zIDogcHVibGljIGlyX3J2YWx1ZV92aXNpdG9yCit7CitwdWJsaWM6CisgICB2b2lkICogY29uc3QgbWVtX2N0eDsKKyAgIGhhc2hfdGFibGUgKmludGVyZmFjZV9uYW1lc3BhY2U7CisKKyAgIGZsYXR0ZW5fbmFtZWRfaW50ZXJmYWNlX2Jsb2Nrc19kZWNsYXJhdGlvbnModm9pZCAqbWVtX2N0eCkKKyAgICAgIDogbWVtX2N0eChtZW1fY3R4KSwKKyAgICAgICAgaW50ZXJmYWNlX25hbWVzcGFjZShOVUxMKQorICAgeworICAgfQorCisgICB2b2lkIHJ1bihleGVjX2xpc3QgKmluc3RydWN0aW9ucyk7CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqKTsKKyAgIHZpcnR1YWwgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSk7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKwordm9pZAorZmxhdHRlbl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzX2RlY2xhcmF0aW9uczo6cnVuKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaW50ZXJmYWNlX25hbWVzcGFjZSA9IGhhc2hfdGFibGVfY3RvcigwLCBoYXNoX3RhYmxlX3N0cmluZ19oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3RhYmxlX3N0cmluZ19jb21wYXJlKTsKKworICAgLyogRmlyc3QgcGFzczogYWRqdXN0IGluc3RhbmNlIGJsb2NrIHZhcmlhYmxlcyB3aXRoIGFuIGluc3RhbmNlIG5hbWUKKyAgICAqIHRvIG5vdCBoYXZlIGFuIGluc3RhbmNlIG5hbWUuCisgICAgKgorICAgICogVGhlIGludGVyZmFjZSBibG9jayB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbiB0aGUgaW50ZXJmYWNlX25hbWVzcGFjZQorICAgICogaGFzaCB0YWJsZSBzbyB0aGV5IGNhbiBiZSB1c2VkIGluIHRoZSBzZWNvbmQgcGFzcy4KKyAgICAqLworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl92YXJpYWJsZSAqdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKyAgICAgIGlmICghdmFyIHx8ICF2YXItPmlzX2ludGVyZmFjZV9pbnN0YW5jZSgpKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIC8qIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBoYW5kbGUgdW5pZm9ybXMgZHVyaW5nIHRoaXMgcGFzcywKKyAgICAgICAqIGJ1dCwgdGhpcyB3aWxsIHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgb3RoZXIgdW5pZm9ybSBibG9jaworICAgICAgICogc3VwcG9ydCBjb2RlLgorICAgICAgICovCisgICAgICBpZiAodmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3VuaWZvcm0pCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgY29uc3QgZ2xzbF90eXBlICogaWZhY2VfdCA9IHZhci0+dHlwZTsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqIGFycmF5X3QgPSBOVUxMOworICAgICAgZXhlY19ub2RlICppbnNlcnRfcG9zID0gdmFyOworCisgICAgICBpZiAoaWZhY2VfdC0+aXNfYXJyYXkoKSkgeworICAgICAgICAgYXJyYXlfdCA9IGlmYWNlX3Q7CisgICAgICAgICBpZmFjZV90ID0gYXJyYXlfdC0+ZmllbGRzLmFycmF5OworICAgICAgfQorCisgICAgICBhc3NlcnQgKGlmYWNlX3QtPmlzX2ludGVyZmFjZSgpKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlmYWNlX3QtPmxlbmd0aDsgaSsrKSB7CisgICAgICAgICBjb25zdCBjaGFyICogZmllbGRfbmFtZSA9IGlmYWNlX3QtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZTsKKyAgICAgICAgIGNoYXIgKmlmYWNlX2ZpZWxkX25hbWUgPQorICAgICAgICAgICAgcmFsbG9jX2FzcHJpbnRmKG1lbV9jdHgsICIlcy4lcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VfdC0+bmFtZSwgdmFyLT5uYW1lLCBmaWVsZF9uYW1lKTsKKworICAgICAgICAgaXJfdmFyaWFibGUgKmZvdW5kX3ZhciA9CisgICAgICAgICAgICAoaXJfdmFyaWFibGUgKikgaGFzaF90YWJsZV9maW5kKGludGVyZmFjZV9uYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlX2ZpZWxkX25hbWUpOworICAgICAgICAgaWYgKCFmb3VuZF92YXIpIHsKKyAgICAgICAgICAgIGlyX3ZhcmlhYmxlICpuZXdfdmFyOworICAgICAgICAgICAgY2hhciAqdmFyX25hbWUgPQorICAgICAgICAgICAgICAgcmFsbG9jX3N0cmR1cChtZW1fY3R4LCBpZmFjZV90LT5maWVsZHMuc3RydWN0dXJlW2ldLm5hbWUpOworICAgICAgICAgICAgaWYgKGFycmF5X3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgbmV3X3ZhciA9CisgICAgICAgICAgICAgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoaWZhY2VfdC0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcl92YXJpYWJsZV9tb2RlKSB2YXItPmRhdGEubW9kZSk7CisgICAgICAgICAgICAgICBuZXdfdmFyLT5kYXRhLmZyb21fbmFtZWRfaWZjX2Jsb2NrX25vbmFycmF5ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBjb25zdCBnbHNsX3R5cGUgKm5ld19hcnJheV90eXBlID0KKyAgICAgICAgICAgICAgICAgIGdsc2xfdHlwZTo6Z2V0X2FycmF5X2luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgaWZhY2VfdC0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdC0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgIG5ld192YXIgPQorICAgICAgICAgICAgICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKG5ld19hcnJheV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcl92YXJpYWJsZV9tb2RlKSB2YXItPmRhdGEubW9kZSk7CisgICAgICAgICAgICAgICBuZXdfdmFyLT5kYXRhLmZyb21fbmFtZWRfaWZjX2Jsb2NrX2FycmF5ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld192YXItPmRhdGEubG9jYXRpb24gPSBpZmFjZV90LT5maWVsZHMuc3RydWN0dXJlW2ldLmxvY2F0aW9uOworICAgICAgICAgICAgbmV3X3Zhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbiA9IChuZXdfdmFyLT5kYXRhLmxvY2F0aW9uID49IDApOworICAgICAgICAgICAgbmV3X3Zhci0+ZGF0YS5pbnRlcnBvbGF0aW9uID0KKyAgICAgICAgICAgICAgIGlmYWNlX3QtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0uaW50ZXJwb2xhdGlvbjsKKyAgICAgICAgICAgIG5ld192YXItPmRhdGEuY2VudHJvaWQgPSBpZmFjZV90LT5maWVsZHMuc3RydWN0dXJlW2ldLmNlbnRyb2lkOworICAgICAgICAgICAgbmV3X3Zhci0+ZGF0YS5zYW1wbGUgPSBpZmFjZV90LT5maWVsZHMuc3RydWN0dXJlW2ldLnNhbXBsZTsKKworICAgICAgICAgICAgbmV3X3Zhci0+aW5pdF9pbnRlcmZhY2VfdHlwZShpZmFjZV90KTsKKyAgICAgICAgICAgIGhhc2hfdGFibGVfaW5zZXJ0KGludGVyZmFjZV9uYW1lc3BhY2UsIG5ld192YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZV9maWVsZF9uYW1lKTsKKyAgICAgICAgICAgIGluc2VydF9wb3MtPmluc2VydF9hZnRlcihuZXdfdmFyKTsKKyAgICAgICAgICAgIGluc2VydF9wb3MgPSBuZXdfdmFyOworICAgICAgICAgfQorICAgICAgfQorICAgICAgdmFyLT5yZW1vdmUoKTsKKyAgIH0KKworICAgLyogU2Vjb25kIHBhc3M6IHZpc2l0IGFsbCBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgaW5zdGFuY2VzLCBhbmQgaWYgdGhleQorICAgICogcmVmZXJlbmNlIGFuIGludGVyZmFjZSBibG9jaywgdGhlbiBmbGF0dGVuIHRoZSByZWZlcmVyZW5jZSBvdXQuCisgICAgKi8KKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgaW5zdHJ1Y3Rpb25zKTsKKyAgIGhhc2hfdGFibGVfZHRvcihpbnRlcmZhY2VfbmFtZXNwYWNlKTsKKyAgIGludGVyZmFjZV9uYW1lc3BhY2UgPSBOVUxMOworfQorCitpcl92aXNpdG9yX3N0YXR1cworZmxhdHRlbl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzX2RlY2xhcmF0aW9uczo6dmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmxoc19yZWMgPSBpci0+bGhzLT5hc19kZXJlZmVyZW5jZV9yZWNvcmQoKTsKKyAgIGlmIChsaHNfcmVjKSB7CisgICAgICBpcl9ydmFsdWUgKmxoc19yZWNfdG1wID0gbGhzX3JlYzsKKyAgICAgIGhhbmRsZV9ydmFsdWUoJmxoc19yZWNfdG1wKTsKKyAgICAgIGlmIChsaHNfcmVjX3RtcCAhPSBsaHNfcmVjKSB7CisgICAgICAgICBpci0+c2V0X2xocyhsaHNfcmVjX3RtcCk7CisgICAgICB9CisgICB9CisgICByZXR1cm4gcnZhbHVlX3Zpc2l0KGlyKTsKK30KKwordm9pZAorZmxhdHRlbl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzX2RlY2xhcmF0aW9uczo6aGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpCit7CisgICBpZiAoKnJ2YWx1ZSA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmlyID0gKCpydmFsdWUpLT5hc19kZXJlZmVyZW5jZV9yZWNvcmQoKTsKKyAgIGlmIChpciA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgICBpcl92YXJpYWJsZSAqdmFyID0gaXItPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIGlmICh2YXIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYgKCF2YXItPmlzX2ludGVyZmFjZV9pbnN0YW5jZSgpKQorICAgICAgcmV0dXJuOworCisgICAvKiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaGFuZGxlIHVuaWZvcm1zIGR1cmluZyB0aGlzIHBhc3MsCisgICAgKiBidXQsIHRoaXMgd2lsbCByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIG90aGVyIHVuaWZvcm0gYmxvY2sKKyAgICAqIHN1cHBvcnQgY29kZS4KKyAgICAqLworICAgaWYgKHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtKQorICAgICAgcmV0dXJuOworCisgICBpZiAodmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKSAhPSBOVUxMKSB7CisgICAgICBjaGFyICppZmFjZV9maWVsZF9uYW1lID0KKyAgICAgICAgIHJhbGxvY19hc3ByaW50ZihtZW1fY3R4LCAiJXMuJXMuJXMiLCB2YXItPmdldF9pbnRlcmZhY2VfdHlwZSgpLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+bmFtZSwgaXItPmZpZWxkKTsKKyAgICAgIC8qIEZpbmQgdGhlIHZhcmlhYmxlIGluIHRoZSBzZXQgb2YgZmxhdHRlbmVkIGludGVyZmFjZSBibG9ja3MgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICpmb3VuZF92YXIgPQorICAgICAgICAgKGlyX3ZhcmlhYmxlICopIGhhc2hfdGFibGVfZmluZChpbnRlcmZhY2VfbmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZV9maWVsZF9uYW1lKTsKKyAgICAgIGFzc2VydChmb3VuZF92YXIpOworCisgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdmFyID0KKyAgICAgICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShmb3VuZF92YXIpOworCisgICAgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqZGVyZWZfYXJyYXkgPQorICAgICAgICAgaXItPnJlY29yZC0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKTsKKyAgICAgIGlmIChkZXJlZl9hcnJheSAhPSBOVUxMKSB7CisgICAgICAgICAqcnZhbHVlID0KKyAgICAgICAgICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheShkZXJlZl92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWZfYXJyYXktPmFycmF5X2luZGV4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAqcnZhbHVlID0gZGVyZWZfdmFyOworICAgICAgfQorICAgfQorfQorCit2b2lkCitsb3dlcl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzKHZvaWQgKm1lbV9jdHgsIGdsX3NoYWRlciAqc2hhZGVyKQoreworICAgZmxhdHRlbl9uYW1lZF9pbnRlcmZhY2VfYmxvY2tzX2RlY2xhcmF0aW9ucyB2X2RlY2wobWVtX2N0eCk7CisgICB2X2RlY2wucnVuKHNoYWRlci0+aXIpOworfQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX25vaXNlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfbm9pc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjU5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX25vaXNlLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsb3dlcl9ub2lzZS5jcHAKKyAqIElSIGxvd2VyIHBhc3MgdG8gcmVtb3ZlIG5vaXNlIG9wY29kZXMuCisgKgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlhbi5kLnJvbWFuaWNrQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorCitjbGFzcyBsb3dlcl9ub2lzZV92aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxvd2VyX25vaXNlX3Zpc2l0b3IoKSA6IHByb2dyZXNzKGZhbHNlKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSkKKyAgIHsKKyAgICAgIGlmICghKnJ2YWx1ZSkKKwkgcmV0dXJuOworCisgICAgICBpcl9leHByZXNzaW9uICpleHByID0gKCpydmFsdWUpLT5hc19leHByZXNzaW9uKCk7CisgICAgICBpZiAoIWV4cHIpCisJIHJldHVybjsKKworICAgICAgLyogSW4gdGhlIGZ1dHVyZSwgaXJfdW5vcF9ub2lzZSBtYXkgYmUgcmVwbGFjZWQgYnkgYSBjYWxsIHRvIGEgZnVuY3Rpb24KKyAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBub2lzZS4gIE5vIGhhcmR3YXJlIGhhcyBhIG5vaXNlIGluc3RydWN0aW9uLgorICAgICAgICovCisgICAgICBpZiAoZXhwci0+b3BlcmF0aW9uID09IGlyX3Vub3Bfbm9pc2UpIHsKKwkgKnJ2YWx1ZSA9IGlyX2NvbnN0YW50Ojp6ZXJvKHJhbGxvY19wYXJlbnQoZXhwciksIGV4cHItPnR5cGUpOworCSB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCisKK2Jvb2wKK2xvd2VyX25vaXNlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgbG93ZXJfbm9pc2VfdmlzaXRvciB2OworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfb2Zmc2V0X2FycmF5LmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfb2Zmc2V0X2FycmF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzIzNWVkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9vZmZzZXRfYXJyYXkuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGJyd19sb3dlcl9vZmZzZXRfYXJyYXkuY3BwCisgKgorICogSVIgbG93ZXIgcGFzcyB0byBkZWNvbXBvc2UgaXJfdGV4dHVyZSBpcl90ZzQgd2l0aCBhbiBhcnJheSBvZiBvZmZzZXRzCisgKiBpbnRvIGZvdXIgaXJfdGc0cyB3aXRoIGEgc2luZ2xlIGl2ZWMyIG9mZnNldCwgc2VsZWN0IHRoZSAudyBjb21wb25lbnQgb2YgZWFjaCwKKyAqIGFuZCByZXR1cm4gdGhvc2UgZm91ciB2YWx1ZXMgcGFja2VkIGludG8gYSBndmVjNC4KKyAqCisgKiBcYXV0aG9yIENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqLworCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfYnVpbGRlci5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImlyX3J2YWx1ZV92aXNpdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBpcl9idWlsZGVyOworCitjbGFzcyBicndfbG93ZXJfb2Zmc2V0X2FycmF5X3Zpc2l0b3IgOiBwdWJsaWMgaXJfcnZhbHVlX3Zpc2l0b3IgeworcHVibGljOgorICAgYnJ3X2xvd2VyX29mZnNldF9hcnJheV92aXNpdG9yKCkKKyAgIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisgICB9CisKKyAgIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydik7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit2b2lkCiticndfbG93ZXJfb2Zmc2V0X2FycmF5X3Zpc2l0b3I6OmhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnYpCit7CisgICBpZiAoKnJ2ID09IE5VTEwgfHwgKCpydiktPmlyX3R5cGUgIT0gaXJfdHlwZV90ZXh0dXJlKQorICAgICAgcmV0dXJuOworCisgICBpcl90ZXh0dXJlICppciA9IChpcl90ZXh0dXJlICopICpydjsKKyAgIGlmIChpci0+b3AgIT0gaXJfdGc0IHx8ICFpci0+b2Zmc2V0IHx8ICFpci0+b2Zmc2V0LT50eXBlLT5pc19hcnJheSgpKQorICAgICAgcmV0dXJuOworCisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX3BhcmVudChpcik7CisKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBuZXcgKG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGlyLT50eXBlLCAicmVzdWx0IiwgaXJfdmFyX2F1dG8pOworICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZSh2YXIpOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaXJfdGV4dHVyZSAqdGV4ID0gaXItPmNsb25lKG1lbV9jdHgsIE5VTEwpOworICAgICAgdGV4LT5vZmZzZXQgPSBuZXcgKG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KHRleC0+b2Zmc2V0LAorICAgICAgICAgICAgbmV3IChtZW1fY3R4KSBpcl9jb25zdGFudChpKSk7CisKKyAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKHZhciwgc3dpenpsZV93KHRleCksIDEgPDwgaSkpOworICAgfQorCisgICAqcnYgPSBuZXcgKG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisKKyAgIHByb2dyZXNzID0gdHJ1ZTsKK30KKworYm9vbAorbG93ZXJfb2Zmc2V0X2FycmF5cyhleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGJyd19sb3dlcl9vZmZzZXRfYXJyYXlfdmlzaXRvciB2OworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfb3V0cHV0X3JlYWRzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfb3V0cHV0X3JlYWRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUxNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9vdXRwdXRfcmVhZHMuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgVmluY2VudCBMZWpldW5lCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJwcm9ncmFtL2hhc2hfdGFibGUuaCIKKworLyoqCisgKiBcZmlsZSBsb3dlcl9vdXRwdXRfcmVhZHMuY3BwCisgKgorICogSW4gR0xTTCwgc2hhZGVyIG91dHB1dCB2YXJpYWJsZXMgKHN1Y2ggYXMgdmFyeWluZ3MpIGNhbiBiZSBib3RoIHJlYWQgYW5kCisgKiB3cml0dGVuLiAgSG93ZXZlciwgb24gc29tZSBoYXJkd2FyZSwgcmVhZGluZyBhbiBvdXRwdXQgcmVnaXN0ZXIgY2F1c2VzCisgKiB0cm91YmxlLgorICoKKyAqIFRoaXMgcGFzcyBjcmVhdGVzIHRlbXBvcmFyeSBzaGFkb3cgY29waWVzIG9mIGV2ZXJ5ICh1c2VkKSBzaGFkZXIgb3V0cHV0LAorICogYW5kIHJlcGxhY2VzIGFsbCBhY2Nlc3NlcyB0byB1c2UgdGhvc2UgaW5zdGVhZC4gIEl0IGFsc28gYWRkcyBjb2RlIHRvIHRoZQorICogbWFpbigpIGZ1bmN0aW9uIHRvIGNvcHkgdGhlIGZpbmFsIHZhbHVlcyB0byB0aGUgYWN0dWFsIHNoYWRlciBvdXRwdXRzLgorICovCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIG91dHB1dF9yZWFkX3JlbW92ZXIgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHJvdGVjdGVkOgorICAgLyoqCisgICAgKiBBIGhhc2ggdGFibGUgbWFwcGluZyBmcm9tIHRoZSBvcmlnaW5hbCBpcl92YXJpYWJsZSBzaGFkZXIgb3V0cHV0cworICAgICogKGlyX3Zhcl9zaGFkZXJfb3V0IG1vZGUpIHRvIHRoZSBuZXcgdGVtcG9yYXJpZXMgdG8gYmUgdXNlZCBpbnN0ZWFkLgorICAgICovCisgICBoYXNoX3RhYmxlICpyZXBsYWNlbWVudHM7CisKKyAgIHZvaWQgKm1lbV9jdHg7CitwdWJsaWM6CisgICBvdXRwdXRfcmVhZF9yZW1vdmVyKCk7CisgICB+b3V0cHV0X3JlYWRfcmVtb3ZlcigpOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChjbGFzcyBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoY2xhc3MgaXJfZW1pdF92ZXJ0ZXggKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX3JldHVybiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKKy8qKgorICogSGFzaCBmdW5jdGlvbiBmb3IgdGhlIG91dHB1dCB2YXJpYWJsZXMgLSBjb21wdXRlcyB0aGUgaGFzaCBvZiB0aGUgbmFtZS4KKyAqIE5PVEU6IFdlJ3JlIHVzaW5nIHRoZSBuYW1lIHN0cmluZyB0byBlbnN1cmUgdGhhdCB0aGUgaGFzaCBkb2Vzbid0IGRlcGVuZAorICogb24gYW55IHJhbmRvbSBmYWN0b3JzLCBvdGhlcndpc2UgdGhlIG91dHB1dF9yZWFkX3JlbW92ZXIgY291bGQgcHJvZHVjZQorICogdGhlIHJhbmRvbSBvcmRlciBvZiB0aGUgYXNzaWdubWVudHMuCisgKgorICogTk9URTogSWYgeW91IHdhbnQgdG8gcmV1c2UgdGhpcyBmdW5jdGlvbiBwbGVhc2UgdGFrZSBpbnRvIGFjY291bnQgdGhhdAorICogZ2VuZXJhbGx5IHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIGFyZSBub24tdW5pcXVlLgorICovCitzdGF0aWMgdW5zaWduZWQKK2hhc2hfdGFibGVfdmFyX2hhc2goY29uc3Qgdm9pZCAqa2V5KQoreworICAgY29uc3QgaXJfdmFyaWFibGUgKiB2YXIgPSBzdGF0aWNfY2FzdDxjb25zdCBpcl92YXJpYWJsZSAqPihrZXkpOworICAgcmV0dXJuIGhhc2hfdGFibGVfc3RyaW5nX2hhc2godmFyLT5uYW1lKTsKK30KKworb3V0cHV0X3JlYWRfcmVtb3Zlcjo6b3V0cHV0X3JlYWRfcmVtb3ZlcigpCit7CisgICBtZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICByZXBsYWNlbWVudHMgPQorICAgICAgaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfdmFyX2hhc2gsIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKTsKK30KKworb3V0cHV0X3JlYWRfcmVtb3Zlcjo6fm91dHB1dF9yZWFkX3JlbW92ZXIoKQoreworICAgaGFzaF90YWJsZV9kdG9yKHJlcGxhY2VtZW50cyk7CisgICByYWxsb2NfZnJlZShtZW1fY3R4KTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK291dHB1dF9yZWFkX3JlbW92ZXI6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIGlmIChpci0+dmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9vdXQpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGlyX3ZhcmlhYmxlICp0ZW1wID0gKGlyX3ZhcmlhYmxlICopIGhhc2hfdGFibGVfZmluZChyZXBsYWNlbWVudHMsIGlyLT52YXIpOworCisgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFuIGV4aXN0aW5nIHRlbXBvcmFyeSwgY3JlYXRlIG9uZS4gKi8KKyAgIGlmICh0ZW1wID09IE5VTEwpIHsKKyAgICAgIHZvaWQgKnZhcl9jdHggPSByYWxsb2NfcGFyZW50KGlyLT52YXIpOworICAgICAgdGVtcCA9IG5ldyh2YXJfY3R4KSBpcl92YXJpYWJsZShpci0+dmFyLT50eXBlLCBpci0+dmFyLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgIGhhc2hfdGFibGVfaW5zZXJ0KHJlcGxhY2VtZW50cywgdGVtcCwgaXItPnZhcik7CisgICAgICBpci0+dmFyLT5pbnNlcnRfYWZ0ZXIodGVtcCk7CisgICB9CisKKyAgIC8qIFVwZGF0ZSB0aGUgZGVyZWZlcmVuY2UgdG8gdXNlIHRoZSB0ZW1wb3JhcnkgKi8KKyAgIGlyLT52YXIgPSB0ZW1wOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGFzc2lnbm1lbnQgdG8gY29weSBhIHRlbXBvcmFyeSB2YWx1ZSBiYWNrIHRvIHRoZSBhY3R1YWwgb3V0cHV0LgorICovCitzdGF0aWMgaXJfYXNzaWdubWVudCAqCitjb3B5KHZvaWQgKmN0eCwgaXJfdmFyaWFibGUgKm91dHB1dCwgaXJfdmFyaWFibGUgKnRlbXApCit7CisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqbGhzID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUob3V0cHV0KTsKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpyaHMgPSBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0ZW1wKTsKKyAgIHJldHVybiBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KGxocywgcmhzKTsKK30KKworLyoqIEluc2VydCBhIGNvcHktYmFjayBhc3NpZ25tZW50IGJlZm9yZSBhICJyZXR1cm4iIHN0YXRlbWVudCBvciBhIGNhbGwgdG8KKyAqIEVtaXRWZXJ0ZXgoKS4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfcmV0dXJuX2NvcHkoY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpkYXRhLCB2b2lkICpjbG9zdXJlKQoreworICAgaXJfcmV0dXJuICppciA9IChpcl9yZXR1cm4gKikgY2xvc3VyZTsKKyAgIGlyLT5pbnNlcnRfYmVmb3JlKGNvcHkoaXIsIChpcl92YXJpYWJsZSAqKSBrZXksIChpcl92YXJpYWJsZSAqKSBkYXRhKSk7Cit9CisKKy8qKiBJbnNlcnQgYSBjb3B5LWJhY2sgYXNzaWdubWVudCBhdCB0aGUgZW5kIG9mIHRoZSBtYWluKCkgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkCitlbWl0X21haW5fY29weShjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsIHZvaWQgKmNsb3N1cmUpCit7CisgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9IChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKikgY2xvc3VyZTsKKyAgIHNpZy0+Ym9keS5wdXNoX3RhaWwoY29weShzaWcsIChpcl92YXJpYWJsZSAqKSBrZXksIChpcl92YXJpYWJsZSAqKSBkYXRhKSk7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitvdXRwdXRfcmVhZF9yZW1vdmVyOjp2aXNpdF9sZWF2ZShpcl9yZXR1cm4gKmlyKQoreworICAgaGFzaF90YWJsZV9jYWxsX2ZvcmVhY2gocmVwbGFjZW1lbnRzLCBlbWl0X3JldHVybl9jb3B5LCBpcik7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitvdXRwdXRfcmVhZF9yZW1vdmVyOjp2aXNpdChpcl9lbWl0X3ZlcnRleCAqaXIpCit7CisgICBoYXNoX3RhYmxlX2NhbGxfZm9yZWFjaChyZXBsYWNlbWVudHMsIGVtaXRfcmV0dXJuX2NvcHksIGlyKTsKKyAgIGhhc2hfdGFibGVfY2xlYXIocmVwbGFjZW1lbnRzKTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK291dHB1dF9yZWFkX3JlbW92ZXI6OnZpc2l0X2xlYXZlKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqc2lnKQoreworICAgaWYgKHN0cmNtcChzaWctPmZ1bmN0aW9uX25hbWUoKSwgIm1haW4iKSAhPSAwKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICBoYXNoX3RhYmxlX2NhbGxfZm9yZWFjaChyZXBsYWNlbWVudHMsIGVtaXRfbWFpbl9jb3B5LCBzaWcpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCit2b2lkCitsb3dlcl9vdXRwdXRfcmVhZHMoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBvdXRwdXRfcmVhZF9yZW1vdmVyIHY7CisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9wYWNrZWRfdmFyeWluZ3MuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl9wYWNrZWRfdmFyeWluZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjU0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3BhY2tlZF92YXJ5aW5ncy5jcHAKQEAgLTAsMCArMSw2ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGxvd2VyX3ZhcnlpbmdzX3RvX3BhY2tlZC5jcHAKKyAqCisgKiBUaGlzIGxvd2VyaW5nIHBhc3MgZ2VuZXJhdGVzIEdMU0wgY29kZSB0aGF0IG1hbnVhbGx5IHBhY2tzIHZhcnlpbmdzIGludG8KKyAqIHZlYzQgc2xvdHMsIGZvciB0aGUgYmVuZWZpdCBvZiBiYWNrLWVuZHMgdGhhdCBkb24ndCBzdXBwb3J0IHBhY2tlZCB2YXJ5aW5ncworICogbmF0aXZlbHkuCisgKgorICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2hhZGVyOgorICoKKyAqICAgb3V0IG1hdDN4MiBmb287ICAvLyBsb2NhdGlvbj00LCBsb2NhdGlvbl9mcmFjPTAKKyAqICAgb3V0IHZlYzMgYmFyWzJdOyAvLyBsb2NhdGlvbj01LCBsb2NhdGlvbl9mcmFjPTIKKyAqCisgKiAgIG1haW4oKQorICogICB7CisgKiAgICAgLi4uCisgKiAgIH0KKyAqCisgKiBJcyByZXdyaXR0ZW4gdG86CisgKgorICogICBtYXQzeDIgZm9vOworICogICB2ZWMzIGJhclsyXTsKKyAqICAgb3V0IHZlYzQgcGFja2VkNDsgLy8gbG9jYXRpb249NCwgbG9jYXRpb25fZnJhYz0wCisgKiAgIG91dCB2ZWM0IHBhY2tlZDU7IC8vIGxvY2F0aW9uPTUsIGxvY2F0aW9uX2ZyYWM9MAorICogICBvdXQgdmVjNCBwYWNrZWQ2OyAvLyBsb2NhdGlvbj02LCBsb2NhdGlvbl9mcmFjPTAKKyAqCisgKiAgIG1haW4oKQorICogICB7CisgKiAgICAgLi4uCisgKiAgICAgcGFja2VkNC54eSA9IGZvb1swXTsKKyAqICAgICBwYWNrZWQ0Lnp3ID0gZm9vWzFdOworICogICAgIHBhY2tlZDUueHkgPSBmb29bMl07CisgKiAgICAgcGFja2VkNS56dyA9IGJhclswXS54eTsKKyAqICAgICBwYWNrZWQ2LnggPSBiYXJbMF0uejsKKyAqICAgICBwYWNrZWQ2Lnl6dyA9IGJhclsxXTsKKyAqICAgfQorICoKKyAqIFRoaXMgbG93ZXJpbmcgcGFzcyBwcm9wZXJseSBoYW5kbGVzICJkb3VibGUgcGFya2luZyIgb2YgYSB2YXJ5aW5nIHZlY3RvcgorICogYWNyb3NzIHR3byB2YXJ5aW5nIHNsb3RzLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBjb2RlIGFib3ZlLCB0d28gb2YgdGhlCisgKiBjb21wb25lbnRzIG9mIGJhclswXSBhcmUgc3RvcmVkIGluIHBhY2tlZDUsIGFuZCB0aGUgcmVtYWluaW5nIGNvbXBvbmVudCBpcworICogc3RvcmVkIGluIHBhY2tlZDYuCisgKgorICogTm90ZSB0aGF0IGluIHRoZW9yeSwgdGhlIGV4dHJhIGluc3RydWN0aW9ucyBtYXkgY2F1c2Ugc29tZSBsb3NzIG9mCisgKiBwZXJmb3JtYW5jZS4gIEhvd2V2ZXIsIGhvcGVmdWxseSBpbiBtb3N0IGNhc2VzIHRoZSBwZXJmb3JtYW5jZSBsb3NzIHdpbGwKKyAqIGVpdGhlciBiZSBhYnNvcmJlZCBieSBhIGxhdGVyIG9wdGltaXphdGlvbiBwYXNzLCBvciBpdCB3aWxsIGJlIG9mZnNldCBieQorICogbWVtb3J5IGJhbmR3aWR0aCBzYXZpbmdzIChiZWNhdXNlIGZld2VyIHZhcnlpbmdzIGFyZSB1c2VkKS4KKyAqCisgKiBUaGlzIGxvd2VyaW5nIHBhc3MgYWxzbyBwYWNrcyBmbGF0IGZsb2F0cywgaW50cywgYW5kIHVpbnRzIHRvZ2V0aGVyLCBieQorICogdXNpbmcgaXZlYzQgYXMgdGhlIGJhc2UgdHlwZSBvZiBmbGF0ICJ2YXJ5aW5ncyIsIGFuZCB1c2luZyBhcHByb3ByaWF0ZQorICogY2FzdHMgdG8gY29udmVydCBmbG9hdHMgYW5kIHVpbnRzIGludG8gaW50cy4KKyAqCisgKiBUaGlzIGxvd2VyaW5nIHBhc3MgYWxzbyBoYW5kbGVzIHZhcnlpbmdzIHdob3NlIHR5cGUgaXMgYSBzdHJ1Y3Qgb3IgYW4gYXJyYXkKKyAqIG9mIHN0cnVjdC4gIFN0cnVjdHMgYXJlIHBhY2tlZCBpbiBvcmRlciBhbmQgd2l0aCBubyBnYXBzLCBzbyB0aGVyZSBtYXkgYmUgYQorICogcGVyZm9ybWFuY2UgcGVuYWx0eSBkdWUgdG8gc3RydWN0dXJlIGVsZW1lbnRzIGJlaW5nIGRvdWJsZS1wYXJrZWQuCisgKgorICogTG93ZXJpbmcgb2YgZ2VvbWV0cnkgc2hhZGVyIGlucHV0cyBpcyBzbGlnaHRseSBtb3JlIGNvbXBsZXgsIHNpbmNlIGdlb21ldHJ5CisgKiBpbnB1dHMgYXJlIGFsd2F5cyBhcnJheXMsIHNvIHdlIG5lZWQgdG8gbG93ZXIgYXJyYXlzIHRvIGFycmF5cy4gIEZvcgorICogZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbnB1dDoKKyAqCisgKiAgIGluIHN0cnVjdCBGb28geworICogICAgIGZsb2F0IGY7CisgKiAgICAgdmVjMyB2OworICogICAgIHZlYzIgYVsyXTsKKyAqICAgfSBhcnJbM107ICAgICAgICAgLy8gbG9jYXRpb249NCwgbG9jYXRpb25fZnJhYz0wCisgKgorICogV291bGQgZ2V0IGxvd2VyZWQgbGlrZSB0aGlzIGlmIGl0IG9jY3VycmVkIGluIGEgZnJhZ21lbnQgc2hhZGVyOgorICoKKyAqICAgc3RydWN0IEZvbyB7CisgKiAgICAgZmxvYXQgZjsKKyAqICAgICB2ZWMzIHY7CisgKiAgICAgdmVjMiBhWzJdOworICogICB9IGFyclszXTsKKyAqICAgaW4gdmVjNCBwYWNrZWQ0OyAgLy8gbG9jYXRpb249NCwgbG9jYXRpb25fZnJhYz0wCisgKiAgIGluIHZlYzQgcGFja2VkNTsgIC8vIGxvY2F0aW9uPTUsIGxvY2F0aW9uX2ZyYWM9MAorICogICBpbiB2ZWM0IHBhY2tlZDY7ICAvLyBsb2NhdGlvbj02LCBsb2NhdGlvbl9mcmFjPTAKKyAqICAgaW4gdmVjNCBwYWNrZWQ3OyAgLy8gbG9jYXRpb249NywgbG9jYXRpb25fZnJhYz0wCisgKiAgIGluIHZlYzQgcGFja2VkODsgIC8vIGxvY2F0aW9uPTgsIGxvY2F0aW9uX2ZyYWM9MAorICogICBpbiB2ZWM0IHBhY2tlZDk7ICAvLyBsb2NhdGlvbj05LCBsb2NhdGlvbl9mcmFjPTAKKyAqCisgKiAgIG1haW4oKQorICogICB7CisgKiAgICAgYXJyWzBdLmYgPSBwYWNrZWQ0Lng7CisgKiAgICAgYXJyWzBdLnYgPSBwYWNrZWQ0Lnl6dzsKKyAqICAgICBhcnJbMF0uYVswXSA9IHBhY2tlZDUueHk7CisgKiAgICAgYXJyWzBdLmFbMV0gPSBwYWNrZWQ1Lnp3OworICogICAgIGFyclsxXS5mID0gcGFja2VkNi54OworICogICAgIGFyclsxXS52ID0gcGFja2VkNi55enc7CisgKiAgICAgYXJyWzFdLmFbMF0gPSBwYWNrZWQ3Lnh5OworICogICAgIGFyclsxXS5hWzFdID0gcGFja2VkNy56dzsKKyAqICAgICBhcnJbMl0uZiA9IHBhY2tlZDgueDsKKyAqICAgICBhcnJbMl0udiA9IHBhY2tlZDgueXp3OworICogICAgIGFyclsyXS5hWzBdID0gcGFja2VkOS54eTsKKyAqICAgICBhcnJbMl0uYVsxXSA9IHBhY2tlZDkuenc7CisgKiAgICAgLi4uCisgKiAgIH0KKyAqCisgKiBCdXQgaXQgd291bGQgZ2V0IGxvd2VyZWQgbGlrZSB0aGlzIGlmIGl0IG9jY3VycmVkIGluIGEgZ2VvbWV0cnkgc2hhZGVyOgorICoKKyAqICAgc3RydWN0IEZvbyB7CisgKiAgICAgZmxvYXQgZjsKKyAqICAgICB2ZWMzIHY7CisgKiAgICAgdmVjMiBhWzJdOworICogICB9IGFyclszXTsKKyAqICAgaW4gdmVjNCBwYWNrZWQ0WzNdOyAgLy8gbG9jYXRpb249NCwgbG9jYXRpb25fZnJhYz0wCisgKiAgIGluIHZlYzQgcGFja2VkNVszXTsgIC8vIGxvY2F0aW9uPTUsIGxvY2F0aW9uX2ZyYWM9MAorICoKKyAqICAgbWFpbigpCisgKiAgIHsKKyAqICAgICBhcnJbMF0uZiA9IHBhY2tlZDRbMF0ueDsKKyAqICAgICBhcnJbMF0udiA9IHBhY2tlZDRbMF0ueXp3OworICogICAgIGFyclswXS5hWzBdID0gcGFja2VkNVswXS54eTsKKyAqICAgICBhcnJbMF0uYVsxXSA9IHBhY2tlZDVbMF0uenc7CisgKiAgICAgYXJyWzFdLmYgPSBwYWNrZWQ0WzFdLng7CisgKiAgICAgYXJyWzFdLnYgPSBwYWNrZWQ0WzFdLnl6dzsKKyAqICAgICBhcnJbMV0uYVswXSA9IHBhY2tlZDVbMV0ueHk7CisgKiAgICAgYXJyWzFdLmFbMV0gPSBwYWNrZWQ1WzFdLnp3OworICogICAgIGFyclsyXS5mID0gcGFja2VkNFsyXS54OworICogICAgIGFyclsyXS52ID0gcGFja2VkNFsyXS55enc7CisgKiAgICAgYXJyWzJdLmFbMF0gPSBwYWNrZWQ1WzJdLnh5OworICogICAgIGFyclsyXS5hWzFdID0gcGFja2VkNVsyXS56dzsKKyAqICAgICAuLi4KKyAqICAgfQorICovCisKKyNpbmNsdWRlICJnbHNsX3N5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogVmlzaXRvciB0aGF0IHBlcmZvcm1zIHZhcnlpbmcgcGFja2luZy4gIEZvciBlYWNoIHZhcnlpbmcgZGVjbGFyZWQgaW4gdGhlCisgKiBzaGFkZXIsIHRoaXMgdmlzaXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgcGFja2VkLiAgSWYgc28sIGl0CisgKiBkZW1vdGVzIGl0IHRvIGFuIG9yZGluYXJ5IGdsb2JhbCwgY3JlYXRlcyBuZXcgcGFja2VkIHZhcnlpbmdzLCBhbmQKKyAqIGdlbmVyYXRlcyBhc3NpZ25tZW50cyB0byBjb252ZXJ0IGJldHdlZW4gdGhlIG9yaWdpbmFsIHZhcnlpbmcgYW5kIHRoZQorICogcGFja2VkIHZhcnlpbmcuCisgKi8KK2NsYXNzIGxvd2VyX3BhY2tlZF92YXJ5aW5nc192aXNpdG9yCit7CitwdWJsaWM6CisgICBsb3dlcl9wYWNrZWRfdmFyeWluZ3NfdmlzaXRvcih2b2lkICptZW1fY3R4LCB1bnNpZ25lZCBsb2NhdGlvbnNfdXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlX21vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGdzX2lucHV0X3ZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY19saXN0ICpvdXRfaW5zdHJ1Y3Rpb25zKTsKKworICAgdm9pZCBydW4oZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCitwcml2YXRlOgorICAgaXJfYXNzaWdubWVudCAqYml0d2lzZV9hc3NpZ25fcGFjayhpcl9ydmFsdWUgKmxocywgaXJfcnZhbHVlICpyaHMpOworICAgaXJfYXNzaWdubWVudCAqYml0d2lzZV9hc3NpZ25fdW5wYWNrKGlyX3J2YWx1ZSAqbGhzLCBpcl9ydmFsdWUgKnJocyk7CisgICB1bnNpZ25lZCBsb3dlcl9ydmFsdWUoaXJfcnZhbHVlICpydmFsdWUsIHVuc2lnbmVkIGZpbmVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGUgKnVucGFja2VkX3ZhciwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdzX2lucHV0X3RvcGxldmVsLCB1bnNpZ25lZCB2ZXJ0ZXhfaW5kZXgpOworICAgdW5zaWduZWQgbG93ZXJfYXJyYXlsaWtlKGlyX3J2YWx1ZSAqcnZhbHVlLCB1bnNpZ25lZCBhcnJheV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZpbmVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGUgKnVucGFja2VkX3ZhciwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdzX2lucHV0X3RvcGxldmVsLCB1bnNpZ25lZCB2ZXJ0ZXhfaW5kZXgpOworICAgaXJfZGVyZWZlcmVuY2UgKmdldF9wYWNrZWRfdmFyeWluZ19kZXJlZih1bnNpZ25lZCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGUgKnVucGFja2VkX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdmVydGV4X2luZGV4KTsKKyAgIGJvb2wgbmVlZHNfbG93ZXJpbmcoaXJfdmFyaWFibGUgKnZhcik7CisKKyAgIC8qKgorICAgICogTWVtb3J5IGNvbnRleHQgdXNlZCB0byBhbGxvY2F0ZSBuZXcgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgc2hhZGVyLgorICAgICovCisgICB2b2lkICogY29uc3QgbWVtX2N0eDsKKworICAgLyoqCisgICAgKiBOdW1iZXIgb2YgZ2VuZXJpYyB2YXJ5aW5nIHNsb3RzIHdoaWNoIGFyZSB1c2VkIGJ5IHRoaXMgc2hhZGVyLiAgVGhpcyBpcworICAgICogdXNlZCB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgaW50ZXJtZWRpYXRlIGRhdGEgc3RydWN0dXJlcy4gIElmIGFueSB2YXJ5aW5nCisgICAgKiB1c2VkIGJ5IHRoaXMgc2hhZGVyIGhhcyBhIGxvY2F0aW9uIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICogVkFSWUlOR19TTE9UX1ZBUjAgKyBsb2NhdGlvbnNfdXNlZCwgYW4gYXNzZXJ0aW9uIHdpbGwgZmlyZS4KKyAgICAqLworICAgY29uc3QgdW5zaWduZWQgbG9jYXRpb25zX3VzZWQ7CisKKyAgIC8qKgorICAgICogQXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBhY2tlZCB2YXJ5aW5ncyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGZvciBlYWNoCisgICAgKiBnZW5lcmljIHZhcnlpbmcgc2xvdC4gIE5VTEwgZW50cmllcyBpbiB0aGlzIGFycmF5IGluZGljYXRlIHZhcnlpbmcgc2xvdHMKKyAgICAqIGZvciB3aGljaCBhIHBhY2tlZCB2YXJ5aW5nIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKipwYWNrZWRfdmFyeWluZ3M7CisKKyAgIC8qKgorICAgICogVHlwZSBvZiB2YXJ5aW5nIHdoaWNoIGlzIGJlaW5nIGxvd2VyZWQgaW4gdGhpcyBwYXNzIChlaXRoZXIKKyAgICAqIGlyX3Zhcl9zaGFkZXJfaW4gb3IgaXJfdmFyX3NoYWRlcl9vdXQpLgorICAgICovCisgICBjb25zdCBpcl92YXJpYWJsZV9tb2RlIG1vZGU7CisKKyAgIC8qKgorICAgICogSWYgd2UgYXJlIGN1cnJlbnRseSBsb3dlcmluZyBnZW9tZXRyeSBzaGFkZXIgaW5wdXRzLCB0aGUgbnVtYmVyIG9mIGlucHV0CisgICAgKiB2ZXJ0aWNlcyB0aGUgZ2VvbWV0cnkgc2hhZGVyIGFjY2VwdHMuICBPdGhlcndpc2UgemVyby4KKyAgICAqLworICAgY29uc3QgdW5zaWduZWQgZ3NfaW5wdXRfdmVydGljZXM7CisKKyAgIC8qKgorICAgICogRXhlYyBsaXN0IGludG8gd2hpY2ggdGhlIHZpc2l0b3Igc2hvdWxkIGluc2VydCB0aGUgcGFja2luZyBpbnN0cnVjdGlvbnMuCisgICAgKiBDYWxsZXIgcHJvdmlkZXMgdGhpcyBsaXN0OyBpdCBzaG91bGQgaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbnMgaW50byB0aGUKKyAgICAqIGFwcHJvcHJpYXRlIHBsYWNlIGluIHRoZSBzaGFkZXIgb25jZSB0aGUgdmlzaXRvciBoYXMgZmluaXNoZWQgcnVubmluZy4KKyAgICAqLworICAgZXhlY19saXN0ICpvdXRfaW5zdHJ1Y3Rpb25zOworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK2xvd2VyX3BhY2tlZF92YXJ5aW5nc192aXNpdG9yOjpsb3dlcl9wYWNrZWRfdmFyeWluZ3NfdmlzaXRvcigKKyAgICAgIHZvaWQgKm1lbV9jdHgsIHVuc2lnbmVkIGxvY2F0aW9uc191c2VkLCBpcl92YXJpYWJsZV9tb2RlIG1vZGUsCisgICAgICB1bnNpZ25lZCBnc19pbnB1dF92ZXJ0aWNlcywgZXhlY19saXN0ICpvdXRfaW5zdHJ1Y3Rpb25zKQorICAgOiBtZW1fY3R4KG1lbV9jdHgpLAorICAgICBsb2NhdGlvbnNfdXNlZChsb2NhdGlvbnNfdXNlZCksCisgICAgIHBhY2tlZF92YXJ5aW5ncygoaXJfdmFyaWFibGUgKiopCisgICAgICAgICAgICAgICAgICAgICByemFsbG9jX2FycmF5X3NpemUobWVtX2N0eCwgc2l6ZW9mKCpwYWNrZWRfdmFyeWluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uc191c2VkKSksCisgICAgIG1vZGUobW9kZSksCisgICAgIGdzX2lucHV0X3ZlcnRpY2VzKGdzX2lucHV0X3ZlcnRpY2VzKSwKKyAgICAgb3V0X2luc3RydWN0aW9ucyhvdXRfaW5zdHJ1Y3Rpb25zKQoreworfQorCit2b2lkCitsb3dlcl9wYWNrZWRfdmFyeWluZ3NfdmlzaXRvcjo6cnVuKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgZm9yZWFjaF9saXN0IChub2RlLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworICAgICAgaWYgKHZhciA9PSBOVUxMKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSAhPSB0aGlzLT5tb2RlIHx8CisgICAgICAgICAgdmFyLT5kYXRhLmxvY2F0aW9uIDwgVkFSWUlOR19TTE9UX1ZBUjAgfHwKKyAgICAgICAgICAhdGhpcy0+bmVlZHNfbG93ZXJpbmcodmFyKSkKKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBUaGlzIGxvd2VyaW5nIHBhc3MgaXMgb25seSBjYXBhYmxlIG9mIHBhY2tpbmcgZmxvYXRzIGFuZCBpbnRzCisgICAgICAgKiB0b2dldGhlciB3aGVuIHRoZWlyIGludGVycG9sYXRpb24gbW9kZSBpcyAiZmxhdCIuICBUaGVyZWZvcmUsIHRvIGJlCisgICAgICAgKiBzYWZlLCBjYWxsZXIgc2hvdWxkIGVuc3VyZSB0aGF0IGludGVncmFsIHZhcnlpbmdzIGFsd2F5cyB1c2UgZmxhdAorICAgICAgICogaW50ZXJwb2xhdGlvbiwgZXZlbiB3aGVuIHRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IEdMU0wuCisgICAgICAgKi8KKyAgICAgIGFzc2VydCh2YXItPmRhdGEuaW50ZXJwb2xhdGlvbiA9PSBJTlRFUlBfUVVBTElGSUVSX0ZMQVQgfHwKKyAgICAgICAgICAgICAhdmFyLT50eXBlLT5jb250YWluc19pbnRlZ2VyKCkpOworCisgICAgICAvKiBDaGFuZ2UgdGhlIG9sZCB2YXJ5aW5nIGludG8gYW4gb3JkaW5hcnkgZ2xvYmFsLiAqLworICAgICAgdmFyLT5kYXRhLm1vZGUgPSBpcl92YXJfYXV0bzsKKworICAgICAgLyogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgdmFyeWluZy4gKi8KKyAgICAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpkZXJlZgorICAgICAgICAgPSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodmFyKTsKKworICAgICAgLyogUmVjdXJzaXZlbHkgcGFjayBvciB1bnBhY2sgaXQuICovCisgICAgICB0aGlzLT5sb3dlcl9ydmFsdWUoZGVyZWYsIHZhci0+ZGF0YS5sb2NhdGlvbiAqIDQgKyB2YXItPmRhdGEubG9jYXRpb25fZnJhYywgdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+bmFtZSwgdGhpcy0+Z3NfaW5wdXRfdmVydGljZXMgIT0gMCwgMCk7CisgICB9Cit9CisKKworLyoqCisgKiBNYWtlIGFuIGlyX2Fzc2lnbm1lbnQgZnJvbSBcYyByaHMgdG8gXGMgbGhzLCBwZXJmb3JtaW5nIGFwcHJvcHJpYXRlCisgKiBiaXRjYXN0cyBpZiBuZWNlc3NhcnkgdG8gbWF0Y2ggdXAgdHlwZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBwYWNraW5nIHZhcnlpbmdzLgorICovCitpcl9hc3NpZ25tZW50ICoKK2xvd2VyX3BhY2tlZF92YXJ5aW5nc192aXNpdG9yOjpiaXR3aXNlX2Fzc2lnbl9wYWNrKGlyX3J2YWx1ZSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfcnZhbHVlICpyaHMpCit7CisgICBpZiAobGhzLT50eXBlLT5iYXNlX3R5cGUgIT0gcmhzLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgICAgIC8qIFNpbmNlIHdlIG9ubHkgbWl4IHR5cGVzIGluIGZsYXQgdmFyeWluZ3MsIGFuZCB3ZSBhbHdheXMgc3RvcmUgZmxhdAorICAgICAgICogdmFyeWluZ3MgYXMgdHlwZSBpdmVjNCwgd2UgbmVlZCBvbmx5IHByb2R1Y2UgY29udmVyc2lvbnMgZnJvbSAodWludAorICAgICAgICogb3IgZmxvYXQpIHRvIGludC4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KGxocy0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpOworICAgICAgc3dpdGNoIChyaHMtPnR5cGUtPmJhc2VfdHlwZSkgeworICAgICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKyAgICAgICAgIHJocyA9IG5ldyh0aGlzLT5tZW1fY3R4KQorICAgICAgICAgICAgaXJfZXhwcmVzc2lvbihpcl91bm9wX3UyaSwgbGhzLT50eXBlLCByaHMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKyAgICAgICAgIHJocyA9IG5ldyh0aGlzLT5tZW1fY3R4KQorICAgICAgICAgICAgaXJfZXhwcmVzc2lvbihpcl91bm9wX2JpdGNhc3RfZjJpLCBsaHMtPnR5cGUsIHJocyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBhc3NlcnQoISJVbmV4cGVjdGVkIHR5cGUgY29udmVyc2lvbiB3aGlsZSBsb3dlcmluZyB2YXJ5aW5ncyIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisgICByZXR1cm4gbmV3KHRoaXMtPm1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCByaHMpOworfQorCisKKy8qKgorICogTWFrZSBhbiBpcl9hc3NpZ25tZW50IGZyb20gXGMgcmhzIHRvIFxjIGxocywgcGVyZm9ybWluZyBhcHByb3ByaWF0ZQorICogYml0Y2FzdHMgaWYgbmVjZXNzYXJ5IHRvIG1hdGNoIHVwIHR5cGVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdW5wYWNraW5nIHZhcnlpbmdzLgorICovCitpcl9hc3NpZ25tZW50ICoKK2xvd2VyX3BhY2tlZF92YXJ5aW5nc192aXNpdG9yOjpiaXR3aXNlX2Fzc2lnbl91bnBhY2soaXJfcnZhbHVlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqcmhzKQoreworICAgaWYgKGxocy0+dHlwZS0+YmFzZV90eXBlICE9IHJocy0+dHlwZS0+YmFzZV90eXBlKSB7CisgICAgICAvKiBTaW5jZSB3ZSBvbmx5IG1peCB0eXBlcyBpbiBmbGF0IHZhcnlpbmdzLCBhbmQgd2UgYWx3YXlzIHN0b3JlIGZsYXQKKyAgICAgICAqIHZhcnlpbmdzIGFzIHR5cGUgaXZlYzQsIHdlIG5lZWQgb25seSBwcm9kdWNlIGNvbnZlcnNpb25zIGZyb20gaW50IHRvCisgICAgICAgKiAodWludCBvciBmbG9hdCkuCisgICAgICAgKi8KKyAgICAgIGFzc2VydChyaHMtPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfSU5UKTsKKyAgICAgIHN3aXRjaCAobGhzLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICAgICByaHMgPSBuZXcodGhpcy0+bWVtX2N0eCkKKyAgICAgICAgICAgIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9pMnUsIGxocy0+dHlwZSwgcmhzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6CisgICAgICAgICByaHMgPSBuZXcodGhpcy0+bWVtX2N0eCkKKyAgICAgICAgICAgIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9iaXRjYXN0X2kyZiwgbGhzLT50eXBlLCByaHMpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgYXNzZXJ0KCEiVW5leHBlY3RlZCB0eXBlIGNvbnZlcnNpb24gd2hpbGUgbG93ZXJpbmcgdmFyeWluZ3MiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgcmV0dXJuIG5ldyh0aGlzLT5tZW1fY3R4KSBpcl9hc3NpZ25tZW50KGxocywgcmhzKTsKK30KKworCisvKioKKyAqIFJlY3Vyc2l2ZWx5IHBhY2sgb3IgdW5wYWNrIHRoZSBnaXZlbiB2YXJ5aW5nIChvciBwb3J0aW9uIG9mIGEgdmFyeWluZykgYnkKKyAqIHRyYXZlcnNpbmcgYWxsIG9mIGl0cyBjb25zdGl0dWVudCB2ZWN0b3JzLgorICoKKyAqIFxwYXJhbSBmaW5lX2xvY2F0aW9uIGlzIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZmlyc3QgY29uc3RpdHVlbnQgdmVjdG9yCisgKiBzaG91bGQgYmUgcGFja2VkLS10aGUgd29yZCAiZmluZSIgaW5kaWNhdGVzIHRoYXQgdGhpcyBsb2NhdGlvbiBpcyBleHByZXNzZWQKKyAqIGluIG11bHRpcGxlcyBvZiBhIGZsb2F0LCByYXRoZXIgdGhhbiBtdWx0aXBsZXMgb2YgYSB2ZWM0IGFzIGlzIHVzZWQKKyAqIGVsc2V3aGVyZSBpbiBNZXNhLgorICoKKyAqIFxwYXJhbSBnc19pbnB1dF90b3BsZXZlbCBzaG91bGQgYmUgc2V0IHRvIHRydWUgaWYgd2UgYXJlIGxvd2VyaW5nIGdlb21ldHJ5CisgKiBzaGFkZXIgaW5wdXRzLCBhbmQgd2UgYXJlIGN1cnJlbnRseSBsb3dlcmluZyB0aGUgd2hvbGUgaW5wdXQgdmFyaWFibGUKKyAqIChpLmUuIHdlIGFyZSBsb3dlcmluZyB0aGUgYXJyYXkgd2hvc2UgaW5kZXggc2VsZWN0cyB0aGUgdmVydGV4KS4KKyAqCisgKiBccGFyYW0gdmVydGV4X2luZGV4OiBpZiB3ZSBhcmUgbG93ZXJpbmcgZ2VvbWV0cnkgc2hhZGVyIGlucHV0cywgYW5kIHRoZQorICogbGV2ZWwgb2YgdGhlIGFycmF5IHRoYXQgd2UgYXJlIGN1cnJlbnRseSBsb3dlcmluZyBpcyAqbm90KiB0aGUgdG9wIGxldmVsLAorICogdGhlbiB0aGlzIGluZGljYXRlcyB3aGljaCB2ZXJ0ZXggd2UgYXJlIGN1cnJlbnRseSBsb3dlcmluZy4gIE90aGVyd2lzZSBpdAorICogaXMgaWdub3JlZC4KKyAqCisgKiBccmV0dXJuIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbmV4dCBjb25zdGl0dWVudCB2ZWN0b3IgKGFmdGVyIHRoaXMgb25lKQorICogc2hvdWxkIGJlIHBhY2tlZC4KKyAqLwordW5zaWduZWQKK2xvd2VyX3BhY2tlZF92YXJ5aW5nc192aXNpdG9yOjpsb3dlcl9ydmFsdWUoaXJfcnZhbHVlICpydmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZpbmVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlICp1bnBhY2tlZF92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ3NfaW5wdXRfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZlcnRleF9pbmRleCkKK3sKKyAgIC8qIFdoZW4gZ3NfaW5wdXRfdG9wbGV2ZWwgaXMgc2V0LCB3ZSBzaG91bGQgYmUgbG9va2luZyBhdCBhIGdlb21ldHJ5IHNoYWRlcgorICAgICogaW5wdXQgYXJyYXkuCisgICAgKi8KKyAgIGFzc2VydCghZ3NfaW5wdXRfdG9wbGV2ZWwgfHwgcnZhbHVlLT50eXBlLT5pc19hcnJheSgpKTsKKworICAgaWYgKHJ2YWx1ZS0+dHlwZS0+aXNfcmVjb3JkKCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydmFsdWUtPnR5cGUtPmxlbmd0aDsgaSsrKSB7CisgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgcnZhbHVlID0gcnZhbHVlLT5jbG9uZSh0aGlzLT5tZW1fY3R4LCBOVUxMKTsKKyAgICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkX25hbWUgPSBydmFsdWUtPnR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZTsKKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqZGVyZWZlcmVuY2VfcmVjb3JkID0gbmV3KHRoaXMtPm1lbV9jdHgpCisgICAgICAgICAgICBpcl9kZXJlZmVyZW5jZV9yZWNvcmQocnZhbHVlLCBmaWVsZF9uYW1lKTsKKyAgICAgICAgIGNoYXIgKmRlcmVmX25hbWUKKyAgICAgICAgICAgID0gcmFsbG9jX2FzcHJpbnRmKHRoaXMtPm1lbV9jdHgsICIlcy4lcyIsIG5hbWUsIGZpZWxkX25hbWUpOworICAgICAgICAgZmluZV9sb2NhdGlvbiA9IHRoaXMtPmxvd2VyX3J2YWx1ZShkZXJlZmVyZW5jZV9yZWNvcmQsIGZpbmVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja2VkX3ZhciwgZGVyZWZfbmFtZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF9pbmRleCk7CisgICAgICB9CisgICAgICByZXR1cm4gZmluZV9sb2NhdGlvbjsKKyAgIH0gZWxzZSBpZiAocnZhbHVlLT50eXBlLT5pc19hcnJheSgpKSB7CisgICAgICAvKiBBcnJheXMgYXJlIHBhY2tlZC91bnBhY2tlZCBieSBjb25zaWRlcmluZyBlYWNoIGFycmF5IGVsZW1lbnQgaW4KKyAgICAgICAqIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXR1cm4gdGhpcy0+bG93ZXJfYXJyYXlsaWtlKHJ2YWx1ZSwgcnZhbHVlLT50eXBlLT5hcnJheV9zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmVfbG9jYXRpb24sIHVucGFja2VkX3ZhciwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfaW5wdXRfdG9wbGV2ZWwsIHZlcnRleF9pbmRleCk7CisgICB9IGVsc2UgaWYgKHJ2YWx1ZS0+dHlwZS0+aXNfbWF0cml4KCkpIHsKKyAgICAgIC8qIE1hdHJpY2VzIGFyZSBwYWNrZWQvdW5wYWNrZWQgYnkgY29uc2lkZXJpbmcgZWFjaCBjb2x1bW4gdmVjdG9yIGluCisgICAgICAgKiBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIHRoaXMtPmxvd2VyX2FycmF5bGlrZShydmFsdWUsIHJ2YWx1ZS0+dHlwZS0+bWF0cml4X2NvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmVfbG9jYXRpb24sIHVucGFja2VkX3ZhciwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHZlcnRleF9pbmRleCk7CisgICB9IGVsc2UgaWYgKHJ2YWx1ZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzICsgZmluZV9sb2NhdGlvbiAlIDQgPiA0KSB7CisgICAgICAvKiBUaGlzIHZlY3RvciBpcyBnb2luZyB0byBiZSAiZG91YmxlIHBhcmtlZCIgYWNyb3NzIHR3byB2YXJ5aW5nIHNsb3RzLAorICAgICAgICogc28gaGFuZGxlIGl0IGFzIHR3byBzZXBhcmF0ZSBhc3NpZ25tZW50cy4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgbGVmdF9jb21wb25lbnRzID0gNCAtIGZpbmVfbG9jYXRpb24gJSA0OworICAgICAgdW5zaWduZWQgcmlnaHRfY29tcG9uZW50cworICAgICAgICAgPSBydmFsdWUtPnR5cGUtPnZlY3Rvcl9lbGVtZW50cyAtIGxlZnRfY29tcG9uZW50czsKKyAgICAgIHVuc2lnbmVkIGxlZnRfc3dpenpsZV92YWx1ZXNbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgIHVuc2lnbmVkIHJpZ2h0X3N3aXp6bGVfdmFsdWVzWzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgICBjaGFyIGxlZnRfc3dpenpsZV9uYW1lWzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgICBjaGFyIHJpZ2h0X3N3aXp6bGVfbmFtZVs0XSA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlZnRfY29tcG9uZW50czsgaSsrKSB7CisgICAgICAgICBsZWZ0X3N3aXp6bGVfdmFsdWVzW2ldID0gaTsKKyAgICAgICAgIGxlZnRfc3dpenpsZV9uYW1lW2ldID0gInh5enciW2ldOworICAgICAgfQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJpZ2h0X2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgcmlnaHRfc3dpenpsZV92YWx1ZXNbaV0gPSBpICsgbGVmdF9jb21wb25lbnRzOworICAgICAgICAgcmlnaHRfc3dpenpsZV9uYW1lW2ldID0gInh5enciW2kgKyBsZWZ0X2NvbXBvbmVudHNdOworICAgICAgfQorICAgICAgaXJfc3dpenpsZSAqbGVmdF9zd2l6emxlID0gbmV3KHRoaXMtPm1lbV9jdHgpCisgICAgICAgICBpcl9zd2l6emxlKHJ2YWx1ZSwgbGVmdF9zd2l6emxlX3ZhbHVlcywgbGVmdF9jb21wb25lbnRzKTsKKyAgICAgIGlyX3N3aXp6bGUgKnJpZ2h0X3N3aXp6bGUgPSBuZXcodGhpcy0+bWVtX2N0eCkKKyAgICAgICAgIGlyX3N3aXp6bGUocnZhbHVlLT5jbG9uZSh0aGlzLT5tZW1fY3R4LCBOVUxMKSwgcmlnaHRfc3dpenpsZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0X2NvbXBvbmVudHMpOworICAgICAgY2hhciAqbGVmdF9uYW1lCisgICAgICAgICA9IHJhbGxvY19hc3ByaW50Zih0aGlzLT5tZW1fY3R4LCAiJXMuJXMiLCBuYW1lLCBsZWZ0X3N3aXp6bGVfbmFtZSk7CisgICAgICBjaGFyICpyaWdodF9uYW1lCisgICAgICAgICA9IHJhbGxvY19hc3ByaW50Zih0aGlzLT5tZW1fY3R4LCAiJXMuJXMiLCBuYW1lLCByaWdodF9zd2l6emxlX25hbWUpOworICAgICAgZmluZV9sb2NhdGlvbiA9IHRoaXMtPmxvd2VyX3J2YWx1ZShsZWZ0X3N3aXp6bGUsIGZpbmVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja2VkX3ZhciwgbGVmdF9uYW1lLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2luZGV4KTsKKyAgICAgIHJldHVybiB0aGlzLT5sb3dlcl9ydmFsdWUocmlnaHRfc3dpenpsZSwgZmluZV9sb2NhdGlvbiwgdW5wYWNrZWRfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9uYW1lLCBmYWxzZSwgdmVydGV4X2luZGV4KTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBObyBzcGVjaWFsIGhhbmRsaW5nIGlzIG5lY2Vzc2FyeTsgcGFjayB0aGUgcnZhbHVlIGludG8gdGhlCisgICAgICAgKiB2YXJ5aW5nLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBzd2l6emxlX3ZhbHVlc1s0XSA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgdW5zaWduZWQgY29tcG9uZW50cyA9IHJ2YWx1ZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOworICAgICAgdW5zaWduZWQgbG9jYXRpb24gPSBmaW5lX2xvY2F0aW9uIC8gNDsKKyAgICAgIHVuc2lnbmVkIGxvY2F0aW9uX2ZyYWMgPSBmaW5lX2xvY2F0aW9uICUgNDsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb21wb25lbnRzOyArK2kpCisgICAgICAgICBzd2l6emxlX3ZhbHVlc1tpXSA9IGkgKyBsb2NhdGlvbl9mcmFjOworICAgICAgaXJfZGVyZWZlcmVuY2UgKnBhY2tlZF9kZXJlZiA9CisgICAgICAgICB0aGlzLT5nZXRfcGFja2VkX3ZhcnlpbmdfZGVyZWYobG9jYXRpb24sIHVucGFja2VkX3ZhciwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfaW5kZXgpOworICAgICAgaXJfc3dpenpsZSAqc3dpenpsZSA9IG5ldyh0aGlzLT5tZW1fY3R4KQorICAgICAgICAgaXJfc3dpenpsZShwYWNrZWRfZGVyZWYsIHN3aXp6bGVfdmFsdWVzLCBjb21wb25lbnRzKTsKKyAgICAgIGlmICh0aGlzLT5tb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0KSB7CisgICAgICAgICBpcl9hc3NpZ25tZW50ICphc3NpZ25tZW50CisgICAgICAgICAgICA9IHRoaXMtPmJpdHdpc2VfYXNzaWduX3BhY2soc3dpenpsZSwgcnZhbHVlKTsKKyAgICAgICAgIHRoaXMtPm91dF9pbnN0cnVjdGlvbnMtPnB1c2hfdGFpbChhc3NpZ25tZW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpcl9hc3NpZ25tZW50ICphc3NpZ25tZW50CisgICAgICAgICAgICA9IHRoaXMtPmJpdHdpc2VfYXNzaWduX3VucGFjayhydmFsdWUsIHN3aXp6bGUpOworICAgICAgICAgdGhpcy0+b3V0X2luc3RydWN0aW9ucy0+cHVzaF90YWlsKGFzc2lnbm1lbnQpOworICAgICAgfQorICAgICAgcmV0dXJuIGZpbmVfbG9jYXRpb24gKyBjb21wb25lbnRzOworICAgfQorfQorCisvKioKKyAqIFJlY3Vyc2l2ZWx5IHBhY2sgb3IgdW5wYWNrIGEgdmFyeWluZyBmb3Igd2hpY2ggd2UgbmVlZCB0byBpdGVyYXRlIG92ZXIgaXRzCisgKiBjb25zdGl0dWVudCBlbGVtZW50cywgYWNjZXNzaW5nIGVhY2ggb25lIHVzaW5nIGFuIGlyX2RlcmVmZXJlbmNlX2FycmF5LgorICogVGhpcyB0YWtlcyBjYXJlIG9mIGJvdGggYXJyYXlzIGFuZCBtYXRyaWNlcywgc2luY2UgaXJfZGVyZWZlcmVuY2VfYXJyYXkKKyAqIHRyZWF0cyBhIG1hdHJpeCBsaWtlIGFuIGFycmF5IG9mIGl0cyBjb2x1bW4gdmVjdG9ycy4KKyAqCisgKiBccGFyYW0gZ3NfaW5wdXRfdG9wbGV2ZWwgc2hvdWxkIGJlIHNldCB0byB0cnVlIGlmIHdlIGFyZSBsb3dlcmluZyBnZW9tZXRyeQorICogc2hhZGVyIGlucHV0cywgYW5kIHdlIGFyZSBjdXJyZW50bHkgbG93ZXJpbmcgdGhlIHdob2xlIGlucHV0IHZhcmlhYmxlCisgKiAoaS5lLiB3ZSBhcmUgbG93ZXJpbmcgdGhlIGFycmF5IHdob3NlIGluZGV4IHNlbGVjdHMgdGhlIHZlcnRleCkuCisgKgorICogXHBhcmFtIHZlcnRleF9pbmRleDogaWYgd2UgYXJlIGxvd2VyaW5nIGdlb21ldHJ5IHNoYWRlciBpbnB1dHMsIGFuZCB0aGUKKyAqIGxldmVsIG9mIHRoZSBhcnJheSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgbG93ZXJpbmcgaXMgKm5vdCogdGhlIHRvcCBsZXZlbCwKKyAqIHRoZW4gdGhpcyBpbmRpY2F0ZXMgd2hpY2ggdmVydGV4IHdlIGFyZSBjdXJyZW50bHkgbG93ZXJpbmcuICBPdGhlcndpc2UgaXQKKyAqIGlzIGlnbm9yZWQuCisgKi8KK3Vuc2lnbmVkCitsb3dlcl9wYWNrZWRfdmFyeWluZ3NfdmlzaXRvcjo6bG93ZXJfYXJyYXlsaWtlKGlyX3J2YWx1ZSAqcnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhcnJheV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmaW5lX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJpYWJsZSAqdW5wYWNrZWRfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdzX2lucHV0X3RvcGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2ZXJ0ZXhfaW5kZXgpCit7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgcnZhbHVlID0gcnZhbHVlLT5jbG9uZSh0aGlzLT5tZW1fY3R4LCBOVUxMKTsKKyAgICAgIGlyX2NvbnN0YW50ICpjb25zdGFudCA9IG5ldyh0aGlzLT5tZW1fY3R4KSBpcl9jb25zdGFudChpKTsKKyAgICAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpkZXJlZmVyZW5jZV9hcnJheSA9IG5ldyh0aGlzLT5tZW1fY3R4KQorICAgICAgICAgaXJfZGVyZWZlcmVuY2VfYXJyYXkocnZhbHVlLCBjb25zdGFudCk7CisgICAgICBpZiAoZ3NfaW5wdXRfdG9wbGV2ZWwpIHsKKyAgICAgICAgIC8qIEdlb21ldHJ5IHNoYWRlciBpbnB1dHMgYXJlIGEgc3BlY2lhbCBjYXNlLiAgSW5zdGVhZCBvZiBzdG9yaW5nCisgICAgICAgICAgKiBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IGF0IGEgZGlmZmVyZW50IGxvY2F0aW9uLCBhbGwgZWxlbWVudHMKKyAgICAgICAgICAqIGFyZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiwgYnV0IHdpdGggYSBkaWZmZXJlbnQgdmVydGV4IGluZGV4LgorICAgICAgICAgICovCisgICAgICAgICAodm9pZCkgdGhpcy0+bG93ZXJfcnZhbHVlKGRlcmVmZXJlbmNlX2FycmF5LCBmaW5lX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tlZF92YXIsIG5hbWUsIGZhbHNlLCBpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBjaGFyICpzdWJzY3JpcHRlZF9uYW1lCisgICAgICAgICAgICA9IHJhbGxvY19hc3ByaW50Zih0aGlzLT5tZW1fY3R4LCAiJXNbJWRdIiwgbmFtZSwgaSk7CisgICAgICAgICBmaW5lX2xvY2F0aW9uID0KKyAgICAgICAgICAgIHRoaXMtPmxvd2VyX3J2YWx1ZShkZXJlZmVyZW5jZV9hcnJheSwgZmluZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tlZF92YXIsIHN1YnNjcmlwdGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHZlcnRleF9pbmRleCk7CisgICAgICB9CisgICB9CisgICByZXR1cm4gZmluZV9sb2NhdGlvbjsKK30KKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgcGFja2VkIHZhcnlpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdmFyeWluZyBsb2NhdGlvbi4KKyAqIElmIG5vIHBhY2tlZCB2YXJ5aW5nIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiB2YXJ5aW5nIGxvY2F0aW9uIHlldCwKKyAqIGNyZWF0ZSBpdCBhbmQgYWRkIGl0IHRvIHRoZSBzaGFkZXIgYmVmb3JlIHJldHVybmluZyBpdC4KKyAqCisgKiBUaGUgbmV3bHkgY3JlYXRlZCB2YXJ5aW5nIGluaGVyaXRzIGl0cyBpbnRlcnBvbGF0aW9uIHBhcmFtZXRlcnMgZnJvbSBcYworICogdW5wYWNrZWRfdmFyLiAgSXRzIGJhc2UgdHlwZSBpcyBpdmVjNCBpZiB3ZSBhcmUgbG93ZXJpbmcgYSBmbGF0IHZhcnlpbmcsCisgKiB2ZWM0IG90aGVyd2lzZS4KKyAqCisgKiBccGFyYW0gdmVydGV4X2luZGV4OiBpZiB3ZSBhcmUgbG93ZXJpbmcgZ2VvbWV0cnkgc2hhZGVyIGlucHV0cywgdGhlbiB0aGlzCisgKiBpbmRpY2F0ZXMgd2hpY2ggdmVydGV4IHdlIGFyZSBjdXJyZW50bHkgbG93ZXJpbmcuICBPdGhlcndpc2UgaXQgaXMgaWdub3JlZC4KKyAqLworaXJfZGVyZWZlcmVuY2UgKgorbG93ZXJfcGFja2VkX3ZhcnlpbmdzX3Zpc2l0b3I6OmdldF9wYWNrZWRfdmFyeWluZ19kZXJlZigKKyAgICAgIHVuc2lnbmVkIGxvY2F0aW9uLCBpcl92YXJpYWJsZSAqdW5wYWNrZWRfdmFyLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgdW5zaWduZWQgdmVydGV4X2luZGV4KQoreworICAgdW5zaWduZWQgc2xvdCA9IGxvY2F0aW9uIC0gVkFSWUlOR19TTE9UX1ZBUjA7CisgICBhc3NlcnQoc2xvdCA8IGxvY2F0aW9uc191c2VkKTsKKyAgIGlmICh0aGlzLT5wYWNrZWRfdmFyeWluZ3Nbc2xvdF0gPT0gTlVMTCkgeworICAgICAgY2hhciAqcGFja2VkX25hbWUgPSByYWxsb2NfYXNwcmludGYodGhpcy0+bWVtX2N0eCwgInBhY2tlZDolcyIsIG5hbWUpOworICAgICAgY29uc3QgZ2xzbF90eXBlICpwYWNrZWRfdHlwZTsKKyAgICAgIGlmICh1bnBhY2tlZF92YXItPmRhdGEuaW50ZXJwb2xhdGlvbiA9PSBJTlRFUlBfUVVBTElGSUVSX0ZMQVQpCisgICAgICAgICBwYWNrZWRfdHlwZSA9IGdsc2xfdHlwZTo6aXZlYzRfdHlwZTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHBhY2tlZF90eXBlID0gZ2xzbF90eXBlOjp2ZWM0X3R5cGU7CisgICAgICBpZiAodGhpcy0+Z3NfaW5wdXRfdmVydGljZXMgIT0gMCkgeworICAgICAgICAgcGFja2VkX3R5cGUgPQorICAgICAgICAgICAgZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UocGFja2VkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5nc19pbnB1dF92ZXJ0aWNlcyk7CisgICAgICB9CisgICAgICBpcl92YXJpYWJsZSAqcGFja2VkX3ZhciA9IG5ldyh0aGlzLT5tZW1fY3R4KQorICAgICAgICAgaXJfdmFyaWFibGUocGFja2VkX3R5cGUsIHBhY2tlZF9uYW1lLCB0aGlzLT5tb2RlKTsKKyAgICAgIGlmICh0aGlzLT5nc19pbnB1dF92ZXJ0aWNlcyAhPSAwKSB7CisgICAgICAgICAvKiBQcmV2ZW50IHVwZGF0ZV9hcnJheV9zaXplcygpIGZyb20gbWVzc2luZyB3aXRoIHRoZSBzaXplIG9mIHRoZQorICAgICAgICAgICogYXJyYXkuCisgICAgICAgICAgKi8KKyAgICAgICAgIHBhY2tlZF92YXItPmRhdGEubWF4X2FycmF5X2FjY2VzcyA9IHRoaXMtPmdzX2lucHV0X3ZlcnRpY2VzIC0gMTsKKyAgICAgIH0KKyAgICAgIHBhY2tlZF92YXItPmRhdGEuY2VudHJvaWQgPSB1bnBhY2tlZF92YXItPmRhdGEuY2VudHJvaWQ7CisgICAgICBwYWNrZWRfdmFyLT5kYXRhLnNhbXBsZSA9IHVucGFja2VkX3Zhci0+ZGF0YS5zYW1wbGU7CisgICAgICBwYWNrZWRfdmFyLT5kYXRhLmludGVycG9sYXRpb24gPSB1bnBhY2tlZF92YXItPmRhdGEuaW50ZXJwb2xhdGlvbjsKKyAgICAgIHBhY2tlZF92YXItPmRhdGEubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICAgIHVucGFja2VkX3Zhci0+aW5zZXJ0X2JlZm9yZShwYWNrZWRfdmFyKTsKKyAgICAgIHRoaXMtPnBhY2tlZF92YXJ5aW5nc1tzbG90XSA9IHBhY2tlZF92YXI7CisgICB9IGVsc2UgeworICAgICAgLyogRm9yIGdlb21ldHJ5IHNoYWRlciBpbnB1dHMsIG9ubHkgdXBkYXRlIHRoZSBwYWNrZWQgdmFyaWFibGUgbmFtZSB0aGUKKyAgICAgICAqIGZpcnN0IHRpbWUgd2UgdmlzaXQgZWFjaCBjb21wb25lbnQuCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLT5nc19pbnB1dF92ZXJ0aWNlcyA9PSAwIHx8IHZlcnRleF9pbmRleCA9PSAwKSB7CisgICAgICAgICByYWxsb2NfYXNwcmludGZfYXBwZW5kKChjaGFyICoqKSAmdGhpcy0+cGFja2VkX3ZhcnlpbmdzW3Nsb3RdLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCVzIiwgbmFtZSk7CisgICAgICB9CisgICB9CisKKyAgIGlyX2RlcmVmZXJlbmNlICpkZXJlZiA9IG5ldyh0aGlzLT5tZW1fY3R4KQorICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGhpcy0+cGFja2VkX3ZhcnlpbmdzW3Nsb3RdKTsKKyAgIGlmICh0aGlzLT5nc19pbnB1dF92ZXJ0aWNlcyAhPSAwKSB7CisgICAgICAvKiBXaGVuIGxvd2VyaW5nIEdTIGlucHV0cywgdGhlIHBhY2tlZCB2YXJpYWJsZSBpcyBhbiBhcnJheSwgc28gd2UgbmVlZAorICAgICAgICogdG8gZGVyZWZlcmVuY2UgaXQgdXNpbmcgdmVydGV4X2luZGV4LgorICAgICAgICovCisgICAgICBpcl9jb25zdGFudCAqY29uc3RhbnQgPSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfY29uc3RhbnQodmVydGV4X2luZGV4KTsKKyAgICAgIGRlcmVmID0gbmV3KHRoaXMtPm1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX2FycmF5KGRlcmVmLCBjb25zdGFudCk7CisgICB9CisgICByZXR1cm4gZGVyZWY7Cit9CisKK2Jvb2wKK2xvd2VyX3BhY2tlZF92YXJ5aW5nc192aXNpdG9yOjpuZWVkc19sb3dlcmluZyhpcl92YXJpYWJsZSAqdmFyKQoreworICAgLyogVGhpbmdzIGNvbXBvc2VkIG9mIHZlYzQncyBhbmQgdmFyeWluZ3Mgd2l0aCBleHBsaWNpdGx5IGFzc2lnbmVkCisgICAgKiBsb2NhdGlvbnMgZG9uJ3QgbmVlZCBsb3dlcmluZy4gIEV2ZXJ5dGhpbmcgZWxzZSBkb2VzLgorICAgICovCisgICBpZiAodmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUgPSB2YXItPnR5cGU7CisgICBpZiAodGhpcy0+Z3NfaW5wdXRfdmVydGljZXMgIT0gMCkgeworICAgICAgYXNzZXJ0KHR5cGUtPmlzX2FycmF5KCkpOworICAgICAgdHlwZSA9IHR5cGUtPmVsZW1lbnRfdHlwZSgpOworICAgfQorICAgaWYgKHR5cGUtPmlzX2FycmF5KCkpCisgICAgICB0eXBlID0gdHlwZS0+ZmllbGRzLmFycmF5OworICAgaWYgKHR5cGUtPnZlY3Rvcl9lbGVtZW50cyA9PSA0KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgcmV0dXJuIHRydWU7Cit9CisKKworLyoqCisgKiBWaXNpdG9yIHRoYXQgc3BsaWNlcyB2YXJ5aW5nIHBhY2tpbmcgY29kZSBiZWZvcmUgZXZlcnkgdXNlIG9mIEVtaXRWZXJ0ZXgoKQorICogaW4gYSBnZW9tZXRyeSBzaGFkZXIuCisgKi8KK2NsYXNzIGxvd2VyX3BhY2tlZF92YXJ5aW5nc19nc19zcGxpY2VyIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yCit7CitwdWJsaWM6CisgICBleHBsaWNpdCBsb3dlcl9wYWNrZWRfdmFyeWluZ3NfZ3Nfc3BsaWNlcih2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2VtaXRfdmVydGV4ICpldik7CisKK3ByaXZhdGU6CisgICAvKioKKyAgICAqIE1lbW9yeSBjb250ZXh0IHVzZWQgdG8gYWxsb2NhdGUgbmV3IGluc3RydWN0aW9ucyBmb3IgdGhlIHNoYWRlci4KKyAgICAqLworICAgdm9pZCAqIGNvbnN0IG1lbV9jdHg7CisKKyAgIC8qKgorICAgICogSW5zdHJ1Y3Rpb25zIHRoYXQgc2hvdWxkIGJlIHNwbGljZWQgaW50byBwbGFjZSBiZWZvcmUgZWFjaCBFbWl0VmVydGV4KCkKKyAgICAqIGNhbGwuCisgICAgKi8KKyAgIGNvbnN0IGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zOworfTsKKworCitsb3dlcl9wYWNrZWRfdmFyeWluZ3NfZ3Nfc3BsaWNlcjo6bG93ZXJfcGFja2VkX3ZhcnlpbmdzX2dzX3NwbGljZXIoCisgICAgICB2b2lkICptZW1fY3R4LCBjb25zdCBleGVjX2xpc3QgKmluc3RydWN0aW9ucykKKyAgIDogbWVtX2N0eChtZW1fY3R4KSwgaW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucykKK3sKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworbG93ZXJfcGFja2VkX3ZhcnlpbmdzX2dzX3NwbGljZXI6OnZpc2l0KGlyX2VtaXRfdmVydGV4ICpldikKK3sKKyAgIGZvcmVhY2hfbGlzdChub2RlLCB0aGlzLT5pbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKSBub2RlOworICAgICAgZXYtPmluc2VydF9iZWZvcmUoaXItPmNsb25lKHRoaXMtPm1lbV9jdHgsIE5VTEwpKTsKKyAgIH0KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworCit2b2lkCitsb3dlcl9wYWNrZWRfdmFyeWluZ3Modm9pZCAqbWVtX2N0eCwgdW5zaWduZWQgbG9jYXRpb25zX3VzZWQsCisgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGVfbW9kZSBtb2RlLCB1bnNpZ25lZCBnc19pbnB1dF92ZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBnbF9zaGFkZXIgKnNoYWRlcikKK3sKKyAgIGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zID0gc2hhZGVyLT5pcjsKKyAgIGlyX2Z1bmN0aW9uICptYWluX2Z1bmMgPSBzaGFkZXItPnN5bWJvbHMtPmdldF9mdW5jdGlvbigibWFpbiIpOworICAgZXhlY19saXN0IHZvaWRfcGFyYW1ldGVyczsKKyAgIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqbWFpbl9mdW5jX3NpZworICAgICAgPSBtYWluX2Z1bmMtPm1hdGNoaW5nX3NpZ25hdHVyZShOVUxMLCAmdm9pZF9wYXJhbWV0ZXJzKTsKKyAgIGV4ZWNfbGlzdCBuZXdfaW5zdHJ1Y3Rpb25zOworICAgbG93ZXJfcGFja2VkX3ZhcnlpbmdzX3Zpc2l0b3IgdmlzaXRvcihtZW1fY3R4LCBsb2NhdGlvbnNfdXNlZCwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfaW5wdXRfdmVydGljZXMsICZuZXdfaW5zdHJ1Y3Rpb25zKTsKKyAgIHZpc2l0b3IucnVuKGluc3RydWN0aW9ucyk7CisgICBpZiAobW9kZSA9PSBpcl92YXJfc2hhZGVyX291dCkgeworICAgICAgaWYgKHNoYWRlci0+U3RhZ2UgPT0gTUVTQV9TSEFERVJfR0VPTUVUUlkpIHsKKyAgICAgICAgIC8qIEZvciBnZW9tZXRyeSBzaGFkZXJzLCBvdXRwdXRzIG5lZWQgdG8gYmUgbG93ZXJlZCBiZWZvcmUgZWFjaCBjYWxsCisgICAgICAgICAgKiB0byBFbWl0VmVydGV4KCkKKyAgICAgICAgICAqLworICAgICAgICAgbG93ZXJfcGFja2VkX3ZhcnlpbmdzX2dzX3NwbGljZXIgc3BsaWNlcihtZW1fY3R4LCAmbmV3X2luc3RydWN0aW9ucyk7CisgICAgICAgICBzcGxpY2VyLnJ1bihpbnN0cnVjdGlvbnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIEZvciBvdGhlciBzaGFkZXIgdHlwZXMsIG91dHB1dHMgbmVlZCB0byBiZSBsb3dlcmVkIGF0IHRoZSBlbmQgb2YKKyAgICAgICAgICAqIG1haW4oKQorICAgICAgICAgICovCisgICAgICAgICBtYWluX2Z1bmNfc2lnLT5ib2R5LmFwcGVuZF9saXN0KCZuZXdfaW5zdHJ1Y3Rpb25zKTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBTaGFkZXIgaW5wdXRzIG5lZWQgdG8gYmUgbG93ZXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIG1haW4oKSAqLworICAgICAgbWFpbl9mdW5jX3NpZy0+Ym9keS5oZWFkLT5pbnNlcnRfYmVmb3JlKCZuZXdfaW5zdHJ1Y3Rpb25zKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfcGFja2luZ19idWlsdGlucy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3BhY2tpbmdfYnVpbHRpbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzNjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3BhY2tpbmdfYnVpbHRpbnMuY3BwCkBAIC0wLDAgKzEsMTMxNCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX2J1aWxkZXIuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorCituYW1lc3BhY2UgeworCit1c2luZyBuYW1lc3BhY2UgaXJfYnVpbGRlcjsKKworLyoqCisgKiBBIHZpc2l0b3IgdGhhdCBsb3dlcnMgYnVpbHQtaW4gZmxvYXRpbmctcG9pbnQgcGFjay91bnBhY2sgZXhwcmVzc2lvbnMKKyAqIHN1Y2ggcGFja1Nub3JtMngxNi4KKyAqLworY2xhc3MgbG93ZXJfcGFja2luZ19idWlsdGluc192aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIC8qKgorICAgICogXHBhcmFtIG9wX21hc2sgaXMgYSBiaXRtYXNrIG9mIGBlbnVtIGxvd2VyX3BhY2tpbmdfYnVpbHRpbnNfb3BgCisgICAgKi8KKyAgIGV4cGxpY2l0IGxvd2VyX3BhY2tpbmdfYnVpbHRpbnNfdmlzaXRvcihpbnQgb3BfbWFzaykKKyAgICAgIDogb3BfbWFzayhvcF9tYXNrKSwKKyAgICAgICAgcHJvZ3Jlc3MoZmFsc2UpCisgICB7CisgICAgICAvKiBNdXR1YWxseSBleGNsdXNpdmUgb3B0aW9ucy4gKi8KKyAgICAgIGFzc2VydCghKChvcF9tYXNrICYgTE9XRVJfUEFDS19IQUxGXzJ4MTYpICYmCisgICAgICAgICAgICAgICAob3BfbWFzayAmIExPV0VSX1BBQ0tfSEFMRl8yeDE2X1RPX1NQTElUKSkpOworCisgICAgICBhc3NlcnQoISgob3BfbWFzayAmIExPV0VSX1VOUEFDS19IQUxGXzJ4MTYpICYmCisgICAgICAgICAgICAgICAob3BfbWFzayAmIExPV0VSX1VOUEFDS19IQUxGXzJ4MTZfVE9fU1BMSVQpKSk7CisKKyAgICAgIGZhY3RvcnkuaW5zdHJ1Y3Rpb25zID0gJmZhY3RvcnlfaW5zdHJ1Y3Rpb25zOworICAgfQorCisgICB2aXJ0dWFsIH5sb3dlcl9wYWNraW5nX2J1aWx0aW5zX3Zpc2l0b3IoKQorICAgeworICAgICAgYXNzZXJ0KGZhY3RvcnlfaW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkpOworICAgfQorCisgICBib29sIGdldF9wcm9ncmVzcygpIHsgcmV0dXJuIHByb2dyZXNzOyB9CisKKyAgIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpCisgICB7CisgICAgICBpZiAoISpydmFsdWUpCisJIHJldHVybjsKKworICAgICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9ICgqcnZhbHVlKS0+YXNfZXhwcmVzc2lvbigpOworICAgICAgaWYgKCFleHByKQorCSByZXR1cm47CisKKyAgICAgIGVudW0gbG93ZXJfcGFja2luZ19idWlsdGluc19vcCBsb3dlcmluZ19vcCA9CisgICAgICAgICBjaG9vc2VfbG93ZXJpbmdfb3AoZXhwci0+b3BlcmF0aW9uKTsKKworICAgICAgaWYgKGxvd2VyaW5nX29wID09IExPV0VSX1BBQ0tfVU5QQUNLX05PTkUpCisgICAgICAgICByZXR1cm47CisKKyAgICAgIHNldHVwX2ZhY3RvcnkocmFsbG9jX3BhcmVudChleHByKSk7CisKKyAgICAgIGlyX3J2YWx1ZSAqb3AwID0gZXhwci0+b3BlcmFuZHNbMF07CisgICAgICByYWxsb2Nfc3RlYWwoZmFjdG9yeS5tZW1fY3R4LCBvcDApOworCisgICAgICBzd2l0Y2ggKGxvd2VyaW5nX29wKSB7CisgICAgICBjYXNlIExPV0VSX1BBQ0tfU05PUk1fMngxNjoKKyAgICAgICAgICpydmFsdWUgPSBsb3dlcl9wYWNrX3Nub3JtXzJ4MTYob3AwKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMT1dFUl9QQUNLX1NOT1JNXzR4ODoKKyAgICAgICAgICpydmFsdWUgPSBsb3dlcl9wYWNrX3Nub3JtXzR4OChvcDApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExPV0VSX1BBQ0tfVU5PUk1fMngxNjoKKyAgICAgICAgICpydmFsdWUgPSBsb3dlcl9wYWNrX3Vub3JtXzJ4MTYob3AwKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMT1dFUl9QQUNLX1VOT1JNXzR4ODoKKyAgICAgICAgICpydmFsdWUgPSBsb3dlcl9wYWNrX3Vub3JtXzR4OChvcDApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExPV0VSX1BBQ0tfSEFMRl8yeDE2OgorICAgICAgICAgKnJ2YWx1ZSA9IGxvd2VyX3BhY2tfaGFsZl8yeDE2KG9wMCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTE9XRVJfUEFDS19IQUxGXzJ4MTZfVE9fU1BMSVQ6CisgICAgICAgICAqcnZhbHVlID0gc3BsaXRfcGFja19oYWxmXzJ4MTYob3AwKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMT1dFUl9VTlBBQ0tfU05PUk1fMngxNjoKKyAgICAgICAgICpydmFsdWUgPSBsb3dlcl91bnBhY2tfc25vcm1fMngxNihvcDApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExPV0VSX1VOUEFDS19TTk9STV80eDg6CisgICAgICAgICAqcnZhbHVlID0gbG93ZXJfdW5wYWNrX3Nub3JtXzR4OChvcDApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExPV0VSX1VOUEFDS19VTk9STV8yeDE2OgorICAgICAgICAgKnJ2YWx1ZSA9IGxvd2VyX3VucGFja191bm9ybV8yeDE2KG9wMCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTE9XRVJfVU5QQUNLX1VOT1JNXzR4ODoKKyAgICAgICAgICpydmFsdWUgPSBsb3dlcl91bnBhY2tfdW5vcm1fNHg4KG9wMCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTE9XRVJfVU5QQUNLX0hBTEZfMngxNjoKKyAgICAgICAgICpydmFsdWUgPSBsb3dlcl91bnBhY2tfaGFsZl8yeDE2KG9wMCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTE9XRVJfVU5QQUNLX0hBTEZfMngxNl9UT19TUExJVDoKKyAgICAgICAgICpydmFsdWUgPSBzcGxpdF91bnBhY2tfaGFsZl8yeDE2KG9wMCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTE9XRVJfUEFDS19VTlBBQ0tfTk9ORToKKyAgICAgICAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdGVhcmRvd25fZmFjdG9yeSgpOworICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgfQorCitwcml2YXRlOgorICAgY29uc3QgaW50IG9wX21hc2s7CisgICBib29sIHByb2dyZXNzOworICAgaXJfZmFjdG9yeSBmYWN0b3J5OworICAgZXhlY19saXN0IGZhY3RvcnlfaW5zdHJ1Y3Rpb25zOworCisgICAvKioKKyAgICAqIERldGVybWluZSB0aGUgbmVlZGVkIGxvd2VyaW5nIG9wZXJhdGlvbiBieSBmaWx0ZXJpbmcgXGEgZXhwcl9vcAorICAgICogdGhyb3VnaCBccmVmIG9wX21hc2suCisgICAgKi8KKyAgIGVudW0gbG93ZXJfcGFja2luZ19idWlsdGluc19vcAorICAgY2hvb3NlX2xvd2VyaW5nX29wKGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIGV4cHJfb3ApCisgICB7CisgICAgICAvKiBDKysgcmVnYXJkcyBpbnQgYW5kIGVudW0gYXMgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMuCisgICAgICAgKiBTbywgd2UgY2FuJ3Qgc2ltcGx5IHJldHVybiBmcm9tIGVhY2ggY2FzZTsgd2UgbXVzdCBjYXN0IHRoZSByZXR1cm4KKyAgICAgICAqIHZhbHVlLgorICAgICAgICovCisgICAgICBpbnQgcmVzdWx0OworCisgICAgICBzd2l0Y2ggKGV4cHJfb3ApIHsKKyAgICAgIGNhc2UgaXJfdW5vcF9wYWNrX3Nub3JtXzJ4MTY6CisgICAgICAgICByZXN1bHQgPSBvcF9tYXNrICYgTE9XRVJfUEFDS19TTk9STV8yeDE2OworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGlyX3Vub3BfcGFja19zbm9ybV80eDg6CisgICAgICAgICByZXN1bHQgPSBvcF9tYXNrICYgTE9XRVJfUEFDS19TTk9STV80eDg7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaXJfdW5vcF9wYWNrX3Vub3JtXzJ4MTY6CisgICAgICAgICByZXN1bHQgPSBvcF9tYXNrICYgTE9XRVJfUEFDS19VTk9STV8yeDE2OworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGlyX3Vub3BfcGFja191bm9ybV80eDg6CisgICAgICAgICByZXN1bHQgPSBvcF9tYXNrICYgTE9XRVJfUEFDS19VTk9STV80eDg7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaXJfdW5vcF9wYWNrX2hhbGZfMngxNjoKKyAgICAgICAgIHJlc3VsdCA9IG9wX21hc2sgJiAoTE9XRVJfUEFDS19IQUxGXzJ4MTYgfCBMT1dFUl9QQUNLX0hBTEZfMngxNl9UT19TUExJVCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaXJfdW5vcF91bnBhY2tfc25vcm1fMngxNjoKKyAgICAgICAgIHJlc3VsdCA9IG9wX21hc2sgJiBMT1dFUl9VTlBBQ0tfU05PUk1fMngxNjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpcl91bm9wX3VucGFja19zbm9ybV80eDg6CisgICAgICAgICByZXN1bHQgPSBvcF9tYXNrICYgTE9XRVJfVU5QQUNLX1NOT1JNXzR4ODsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpcl91bm9wX3VucGFja191bm9ybV8yeDE2OgorICAgICAgICAgcmVzdWx0ID0gb3BfbWFzayAmIExPV0VSX1VOUEFDS19VTk9STV8yeDE2OworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGlyX3Vub3BfdW5wYWNrX3Vub3JtXzR4ODoKKyAgICAgICAgIHJlc3VsdCA9IG9wX21hc2sgJiBMT1dFUl9VTlBBQ0tfVU5PUk1fNHg4OworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNjoKKyAgICAgICAgIHJlc3VsdCA9IG9wX21hc2sgJiAoTE9XRVJfVU5QQUNLX0hBTEZfMngxNiB8IExPV0VSX1VOUEFDS19IQUxGXzJ4MTZfVE9fU1BMSVQpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmVzdWx0ID0gTE9XRVJfUEFDS19VTlBBQ0tfTk9ORTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZW51bSBsb3dlcl9wYWNraW5nX2J1aWx0aW5zX29wPihyZXN1bHQpOworICAgfQorCisgICB2b2lkCisgICBzZXR1cF9mYWN0b3J5KHZvaWQgKm1lbV9jdHgpCisgICB7CisgICAgICBhc3NlcnQoZmFjdG9yeS5tZW1fY3R4ID09IE5VTEwpOworICAgICAgYXNzZXJ0KGZhY3RvcnkuaW5zdHJ1Y3Rpb25zLT5pc19lbXB0eSgpKTsKKworICAgICAgZmFjdG9yeS5tZW1fY3R4ID0gbWVtX2N0eDsKKyAgIH0KKworICAgdm9pZAorICAgdGVhcmRvd25fZmFjdG9yeSgpCisgICB7CisgICAgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGZhY3RvcnkuaW5zdHJ1Y3Rpb25zKTsKKyAgICAgIGFzc2VydChmYWN0b3J5Lmluc3RydWN0aW9ucy0+aXNfZW1wdHkoKSk7CisgICAgICBmYWN0b3J5Lm1lbV9jdHggPSBOVUxMOworICAgfQorCisgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgIGlyX2NvbnN0YW50KgorICAgY29uc3RhbnQoVCB4KQorICAgeworICAgICAgcmV0dXJuIGZhY3RvcnkuY29uc3RhbnQoeCk7CisgICB9CisKKyAgIC8qKgorICAgICogXGJyaWVmIFBhY2sgdHdvIHVpbnQxNidzIGludG8gYSBzaW5nbGUgdWludDMyLgorICAgICoKKyAgICAqIEludGVycHJldCB0aGUgZ2l2ZW4gdXZlYzIgYXMgYSB1aW50MTYgcGFpci4gUGFjayB0aGUgcGFpciBpbnRvIGEgdWludDMyCisgICAgKiB3aGVyZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBzcGVjaWZ5IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBwYWlyLgorICAgICogUmV0dXJuIHRoZSB1aW50MzIuCisgICAgKi8KKyAgIGlyX3J2YWx1ZSoKKyAgIHBhY2tfdXZlYzJfdG9fdWludChpcl9ydmFsdWUgKnV2ZWMyX3J2YWwpCisgICB7CisgICAgICBhc3NlcnQodXZlYzJfcnZhbC0+dHlwZSA9PSBnbHNsX3R5cGU6OnV2ZWMyX3R5cGUpOworCisgICAgICAvKiB1dmVjMiB1ID0gVVZFQzJfUlZBTDsgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICp1ID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp1dmVjMl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF9wYWNrX3V2ZWMyX3RvX3VpbnQiKTsKKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24odSwgdXZlYzJfcnZhbCkpOworCisgICAgICAvKiByZXR1cm4gKHUueSA8PCAxNikgfCAodS54ICYgMHhmZmZmKTsgKi8KKyAgICAgIHJldHVybiBiaXRfb3IobHNoaWZ0KHN3aXp6bGVfeSh1KSwgY29uc3RhbnQoMTZ1KSksCisgICAgICAgICAgICAgICAgICAgIGJpdF9hbmQoc3dpenpsZV94KHUpLCBjb25zdGFudCgweGZmZmZ1KSkpOworICAgfQorCisgICAvKioKKyAgICAqIFxicmllZiBQYWNrIGZvdXIgdWludDgncyBpbnRvIGEgc2luZ2xlIHVpbnQzMi4KKyAgICAqCisgICAgKiBJbnRlcnByZXQgdGhlIGdpdmVuIHV2ZWM0IGFzIGEgdWludDMyIDQtdHlwbGUuIFBhY2sgdGhlIDQtdHVwbGUgaW50byBhCisgICAgKiB1aW50MzIgd2hlcmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgc3BlY2lmeSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUKKyAgICAqIDQtdHVwbGUuIFJldHVybiB0aGUgdWludDMyLgorICAgICovCisgICBpcl9ydmFsdWUqCisgICBwYWNrX3V2ZWM0X3RvX3VpbnQoaXJfcnZhbHVlICp1dmVjNF9ydmFsKQorICAgeworICAgICAgYXNzZXJ0KHV2ZWM0X3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp1dmVjNF90eXBlKTsKKworICAgICAgLyogdXZlYzQgdSA9IFVWRUM0X1JWQUw7ICovCisgICAgICBpcl92YXJpYWJsZSAqdSA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfcGFja191dmVjNF90b191aW50Iik7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKHUsIGJpdF9hbmQodXZlYzRfcnZhbCwgY29uc3RhbnQoMHhmZnUpKSkpOworCisgICAgICAvKiByZXR1cm4gKHUudyA8PCAyNCkgfCAodS56IDw8IDE2KSB8ICh1LnkgPDwgOCkgfCB1Lng7ICovCisgICAgICByZXR1cm4gYml0X29yKGJpdF9vcihsc2hpZnQoc3dpenpsZV93KHUpLCBjb25zdGFudCgyNHUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzaGlmdChzd2l6emxlX3oodSksIGNvbnN0YW50KDE2dSkpKSwKKyAgICAgICAgICAgICAgICAgICAgYml0X29yKGxzaGlmdChzd2l6emxlX3kodSksIGNvbnN0YW50KDh1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlX3godSkpKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBcYnJpZWYgVW5wYWNrIGEgdWludDMyIGludG8gdHdvIHVpbnQxNidzLgorICAgICoKKyAgICAqIEludGVycHJldCB0aGUgZ2l2ZW4gdWludDMyIGFzIGEgdWludDE2IHBhaXIgd2hlcmUgdGhlIHVpbnQzMidzIGxlYXN0CisgICAgKiBzaWduaWZpY2FudCBiaXRzIHNwZWNpZnkgdGhlIHBhaXIncyBmaXJzdCBlbGVtZW50LiBSZXR1cm4gdGhlIHVpbnQxNgorICAgICogcGFpciBhcyBhIHV2ZWMyLgorICAgICovCisgICBpcl9ydmFsdWUqCisgICB1bnBhY2tfdWludF90b191dmVjMihpcl9ydmFsdWUgKnVpbnRfcnZhbCkKKyAgIHsKKyAgICAgIGFzc2VydCh1aW50X3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworCisgICAgICAvKiB1aW50IHUgPSBVSU5UX1JWQUw7ICovCisgICAgICBpcl92YXJpYWJsZSAqdSA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dWludF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF91bnBhY2tfdWludF90b191dmVjMl91Iik7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKHUsIHVpbnRfcnZhbCkpOworCisgICAgICAvKiB1dmVjMiB1MjsgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICp1MiA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dXZlYzJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wX3VucGFja191aW50X3RvX3V2ZWMyX3UyIik7CisKKyAgICAgIC8qIHUyLnggPSB1ICYgMHhmZmZmdTsgKi8KKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24odTIsIGJpdF9hbmQodSwgY29uc3RhbnQoMHhmZmZmdSkpLCBXUklURU1BU0tfWCkpOworCisgICAgICAvKiB1Mi55ID0gdSA+PiAxNnU7ICovCisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKHUyLCByc2hpZnQodSwgY29uc3RhbnQoMTZ1KSksIFdSSVRFTUFTS19ZKSk7CisKKyAgICAgIHJldHVybiBkZXJlZih1MikudmFsOworICAgfQorCisgICAvKioKKyAgICAqIFxicmllZiBVbnBhY2sgYSB1aW50MzIgaW50byBmb3VyIHVpbnQ4J3MuCisgICAgKgorICAgICogSW50ZXJwcmV0IHRoZSBnaXZlbiB1aW50MzIgYXMgYSB1aW50OCA0LXR1cGxlIHdoZXJlIHRoZSB1aW50MzIncyBsZWFzdAorICAgICogc2lnbmlmaWNhbnQgYml0cyBzcGVjaWZ5IHRoZSA0LXR1cGxlJ3MgZmlyc3QgZWxlbWVudC4gUmV0dXJuIHRoZSB1aW50OAorICAgICogNC10dXBsZSBhcyBhIHV2ZWM0LgorICAgICovCisgICBpcl9ydmFsdWUqCisgICB1bnBhY2tfdWludF90b191dmVjNChpcl9ydmFsdWUgKnVpbnRfcnZhbCkKKyAgIHsKKyAgICAgIGFzc2VydCh1aW50X3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworCisgICAgICAvKiB1aW50IHUgPSBVSU5UX1JWQUw7ICovCisgICAgICBpcl92YXJpYWJsZSAqdSA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dWludF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF91bnBhY2tfdWludF90b191dmVjNF91Iik7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKHUsIHVpbnRfcnZhbCkpOworCisgICAgICAvKiB1dmVjNCB1NDsgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICp1NCA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dXZlYzRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wX3VucGFja191aW50X3RvX3V2ZWM0X3U0Iik7CisKKyAgICAgIC8qIHU0LnggPSB1ICYgMHhmZnU7ICovCisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKHU0LCBiaXRfYW5kKHUsIGNvbnN0YW50KDB4ZmZ1KSksIFdSSVRFTUFTS19YKSk7CisKKyAgICAgIC8qIHU0LnkgPSAodSA+PiA4dSkgJiAweGZmdTsgKi8KKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24odTQsIGJpdF9hbmQocnNoaWZ0KHUsIGNvbnN0YW50KDh1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50KDB4ZmZ1KSksIFdSSVRFTUFTS19ZKSk7CisKKyAgICAgIC8qIHU0LnogPSAodSA+PiAxNnUpICYgMHhmZnU7ICovCisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKHU0LCBiaXRfYW5kKHJzaGlmdCh1LCBjb25zdGFudCgxNnUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoMHhmZnUpKSwgV1JJVEVNQVNLX1opKTsKKworICAgICAgLyogdTQudyA9ICh1ID4+IDI0dSkgKi8KKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24odTQsIHJzaGlmdCh1LCBjb25zdGFudCgyNHUpKSwgV1JJVEVNQVNLX1cpKTsKKworICAgICAgcmV0dXJuIGRlcmVmKHU0KS52YWw7CisgICB9CisKKyAgIC8qKgorICAgICogXGJyaWVmIExvd2VyIGEgcGFja1Nub3JtMngxNiBleHByZXNzaW9uLgorICAgICoKKyAgICAqIFxwYXJhbSB2ZWMyX3J2YWwgaXMgcGFja1Nub3JtMngxNidzIGlucHV0CisgICAgKiBccmV0dXJuIHBhY2tTbm9ybTJ4MTYncyBvdXRwdXQgYXMgYSB1aW50IHJ2YWx1ZQorICAgICovCisgICBpcl9ydmFsdWUqCisgICBsb3dlcl9wYWNrX3Nub3JtXzJ4MTYoaXJfcnZhbHVlICp2ZWMyX3J2YWwpCisgICB7CisgICAgICAvKiBGcm9tIHBhZ2UgODggKDk0IG9mIHBkZikgb2YgdGhlIEdMU0wgRVMgMy4wMCBzcGVjOgorICAgICAgICoKKyAgICAgICAqICAgIGhpZ2hwIHVpbnQgcGFja1Nub3JtMngxNih2ZWMyIHYpCisgICAgICAgKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICogICAgRmlyc3QsIGNvbnZlcnRzIGVhY2ggY29tcG9uZW50IG9mIHRoZSBub3JtYWxpemVkIGZsb2F0aW5nLXBvaW50IHZhbHVlCisgICAgICAgKiAgICB2IGludG8gMTYtYml0IGludGVnZXIgdmFsdWVzLiBUaGVuLCB0aGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gdGhlCisgICAgICAgKiAgICByZXR1cm5lZCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4KKyAgICAgICAqCisgICAgICAgKiAgICBUaGUgY29udmVyc2lvbiBmb3IgY29tcG9uZW50IGMgb2YgdiB0byBmaXhlZCBwb2ludCBpcyBkb25lIGFzCisgICAgICAgKiAgICBmb2xsb3dzOgorICAgICAgICoKKyAgICAgICAqICAgICAgIHBhY2tTbm9ybTJ4MTY6IHJvdW5kKGNsYW1wKGMsIC0xLCArMSkgKiAzMjc2Ny4wKQorICAgICAgICoKKyAgICAgICAqICAgIFRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxlYXN0CisgICAgICAgKiAgICBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBvdXRwdXQ7IHRoZSBsYXN0IGNvbXBvbmVudCB3aWxsIGJlIHdyaXR0ZW4gdG8KKyAgICAgICAqICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMuCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgSVIgdGhhdCBhcHByb3hpbWF0ZXMgdGhlIGZvbGxvd2luZyBwc2V1ZG8tR0xTTDoKKyAgICAgICAqCisgICAgICAgKiAgICAgcmV0dXJuIHBhY2tfdXZlYzJfdG9fdWludCgKKyAgICAgICAqICAgICAgICAgdXZlYzIoaXZlYzIoCisgICAgICAgKiAgICAgICAgICAgcm91bmQoY2xhbXAoVkVDMl9SVkFMVUUsIC0xLjBmLCAxLjBmKSAqIDMyNzY3LjBmKSkpKTsKKyAgICAgICAqCisgICAgICAgKiBJdCBpcyBuZWNlc3NhcnkgdG8gZmlyc3QgY29udmVydCB0aGUgdmVjMiB0byBpdmVjMiByYXRoZXIgdGhhbiBkaXJlY3RseQorICAgICAgICogY29udmVydGluZyB2ZWMyIHRvIHV2ZWMyIGJlY2F1c2UgdGhlIGxhdHRlciBjb252ZXJzaW9uIGlzIHVuZGVmaW5lZC4KKyAgICAgICAqIEZyb20gcGFnZSA1NiAoNjIgb2YgcGRmKSBvZiB0aGUgR0xTTCBFUyAzLjAwIHNwZWM6ICJJdCBpcyB1bmRlZmluZWQgdG8KKyAgICAgICAqIGNvbnZlcnQgYSBuZWdhdGl2ZSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBhbiB1aW50Ii4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KHZlYzJfcnZhbC0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisKKyAgICAgIGlyX3J2YWx1ZSAqcmVzdWx0ID0gcGFja191dmVjMl90b191aW50KAorICAgICAgICAgICAgaTJ1KGYyaShyb3VuZF9ldmVuKG11bChjbGFtcCh2ZWMyX3J2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50KC0xLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoMS4wZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCgzMjc2Ny4wZikpKSkpKTsKKworICAgICAgYXNzZXJ0KHJlc3VsdC0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICAvKioKKyAgICAqIFxicmllZiBMb3dlciBhIHBhY2tTbm9ybTR4OCBleHByZXNzaW9uLgorICAgICoKKyAgICAqIFxwYXJhbSB2ZWM0X3J2YWwgaXMgcGFja1Nub3JtNHg4J3MgaW5wdXQKKyAgICAqIFxyZXR1cm4gcGFja1Nub3JtNHg4J3Mgb3V0cHV0IGFzIGEgdWludCBydmFsdWUKKyAgICAqLworICAgaXJfcnZhbHVlKgorICAgbG93ZXJfcGFja19zbm9ybV80eDgoaXJfcnZhbHVlICp2ZWM0X3J2YWwpCisgICB7CisgICAgICAvKiBGcm9tIHBhZ2UgMTM3ICgxNDMgb2YgcGRmKSBvZiB0aGUgR0xTTCA0LjMwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgaGlnaHAgdWludCBwYWNrU25vcm00eDgodmVjNCB2KQorICAgICAgICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICogICAgRmlyc3QsIGNvbnZlcnRzIGVhY2ggY29tcG9uZW50IG9mIHRoZSBub3JtYWxpemVkIGZsb2F0aW5nLXBvaW50IHZhbHVlCisgICAgICAgKiAgICB2IGludG8gOC1iaXQgaW50ZWdlciB2YWx1ZXMuIFRoZW4sIHRoZSByZXN1bHRzIGFyZSBwYWNrZWQgaW50byB0aGUKKyAgICAgICAqICAgIHJldHVybmVkIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorICAgICAgICoKKyAgICAgICAqICAgIFRoZSBjb252ZXJzaW9uIGZvciBjb21wb25lbnQgYyBvZiB2IHRvIGZpeGVkIHBvaW50IGlzIGRvbmUgYXMKKyAgICAgICAqICAgIGZvbGxvd3M6CisgICAgICAgKgorICAgICAgICogICAgICAgcGFja1Nub3JtNHg4OiByb3VuZChjbGFtcChjLCAtMSwgKzEpICogMTI3LjApCisgICAgICAgKgorICAgICAgICogICAgVGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbGVhc3QKKyAgICAgICAqICAgIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIG91dHB1dDsgdGhlIGxhc3QgY29tcG9uZW50IHdpbGwgYmUgd3JpdHRlbiB0bworICAgICAgICogICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBJUiB0aGF0IGFwcHJveGltYXRlcyB0aGUgZm9sbG93aW5nIHBzZXVkby1HTFNMOgorICAgICAgICoKKyAgICAgICAqICAgICByZXR1cm4gcGFja191dmVjNF90b191aW50KAorICAgICAgICogICAgICAgICB1dmVjNChpdmVjNCgKKyAgICAgICAqICAgICAgICAgICByb3VuZChjbGFtcChWRUM0X1JWQUxVRSwgLTEuMGYsIDEuMGYpICogMTI3LjBmKSkpKTsKKyAgICAgICAqCisgICAgICAgKiBJdCBpcyBuZWNlc3NhcnkgdG8gZmlyc3QgY29udmVydCB0aGUgdmVjNCB0byBpdmVjNCByYXRoZXIgdGhhbiBkaXJlY3RseQorICAgICAgICogY29udmVydGluZyB2ZWM0IHRvIHV2ZWM0IGJlY2F1c2UgdGhlIGxhdHRlciBjb252ZXJzaW9uIGlzIHVuZGVmaW5lZC4KKyAgICAgICAqIEZyb20gcGFnZSA4NyAoOTMgb2YgcGRmKSBvZiB0aGUgR0xTTCA0LjMwIHNwZWM6ICJJdCBpcyB1bmRlZmluZWQgdG8KKyAgICAgICAqIGNvbnZlcnQgYSBuZWdhdGl2ZSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBhbiB1aW50Ii4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KHZlYzRfcnZhbC0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzRfdHlwZSk7CisKKyAgICAgIGlyX3J2YWx1ZSAqcmVzdWx0ID0gcGFja191dmVjNF90b191aW50KAorICAgICAgICAgICAgaTJ1KGYyaShyb3VuZF9ldmVuKG11bChjbGFtcCh2ZWM0X3J2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50KC0xLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoMS4wZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCgxMjcuMGYpKSkpKSk7CisKKyAgICAgIGFzc2VydChyZXN1bHQtPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgIH0KKworICAgLyoqCisgICAgKiBcYnJpZWYgTG93ZXIgYW4gdW5wYWNrU25vcm0yeDE2IGV4cHJlc3Npb24uCisgICAgKgorICAgICogXHBhcmFtIHVpbnRfcnZhbCBpcyB1bnBhY2tTbm9ybTJ4MTYncyBpbnB1dAorICAgICogXHJldHVybiB1bnBhY2tTbm9ybTJ4MTYncyBvdXRwdXQgYXMgYSB2ZWMyIHJ2YWx1ZQorICAgICovCisgICBpcl9ydmFsdWUqCisgICBsb3dlcl91bnBhY2tfc25vcm1fMngxNihpcl9ydmFsdWUgKnVpbnRfcnZhbCkKKyAgIHsKKyAgICAgIC8qIEZyb20gcGFnZSA4OCAoOTQgb2YgcGRmKSBvZiB0aGUgR0xTTCBFUyAzLjAwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgaGlnaHAgdmVjMiB1bnBhY2tTbm9ybTJ4MTYgKGhpZ2hwIHVpbnQgcCkKKyAgICAgICAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgKiAgICBGaXJzdCwgdW5wYWNrcyBhIHNpbmdsZSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBwIGludG8gYSBwYWlyIG9mCisgICAgICAgKiAgICAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcnMuIFRoZW4sIGVhY2ggY29tcG9uZW50IGlzIGNvbnZlcnRlZCB0bworICAgICAgICogICAgYSBub3JtYWxpemVkIGZsb2F0aW5nLXBvaW50IHZhbHVlIHRvIGdlbmVyYXRlIHRoZSByZXR1cm5lZAorICAgICAgICogICAgdHdvLWNvbXBvbmVudCB2ZWN0b3IuCisgICAgICAgKgorICAgICAgICogICAgVGhlIGNvbnZlcnNpb24gZm9yIHVucGFja2VkIGZpeGVkLXBvaW50IHZhbHVlIGYgdG8gZmxvYXRpbmcgcG9pbnQgaXMKKyAgICAgICAqICAgIGRvbmUgYXMgZm9sbG93czoKKyAgICAgICAqCisgICAgICAgKiAgICAgICB1bnBhY2tTbm9ybTJ4MTY6IGNsYW1wKGYgLyAzMjc2Ny4wLCAtMSwrMSkKKyAgICAgICAqCisgICAgICAgKiAgICBUaGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgICAqICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGlucHV0OyB0aGUgbGFzdCBjb21wb25lbnQgd2lsbCBiZQorICAgICAgICogICAgZXh0cmFjdGVkIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBJUiB0aGF0IGFwcHJveGltYXRlcyB0aGUgZm9sbG93aW5nIHBzZXVkby1HTFNMOgorICAgICAgICoKKyAgICAgICAqICAgIHJldHVybiBjbGFtcCgKKyAgICAgICAqICAgICAgICgoaXZlYzIodW5wYWNrX3VpbnRfdG9fdXZlYzIoVUlOVF9SVkFMVUUpKSA8PCAxNikgPj4gMTYpIC8gMzI3NjcuMGYsCisgICAgICAgKiAgICAgICAtMS4wZiwgMS4wZik7CisgICAgICAgKgorICAgICAgICogVGhlIGFib3ZlIElSIG1heSBhcHBlYXIgdW5uZWNlc3NhcmlseSBjb21wbGV4LCBidXQgdGhlIGludGVybWVkaWF0ZQorICAgICAgICogY29udmVyc2lvbiB0byBpdmVjMiBhbmQgdGhlIGJpdCBzaGlmdHMgYXJlIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgdW5wYWNrCisgICAgICAgKiBuZWdhdGl2ZSBmbG9hdHMuCisgICAgICAgKgorICAgICAgICogVG8gc2VlIHdoeSwgY29uc2lkZXIgcGFja2luZyBhbmQgdGhlbiB1bnBhY2tpbmcgdmVjMigtMS4wLCAwLjApLgorICAgICAgICogcGFja1Nub3JtMngxNiBlbmNvZGVzIC0xLjAgYXMgdGhlIGludDE2IDB4ZmZmZi4gRHVyaW5nIHVucGFja2luZywgd2UKKyAgICAgICAqIHBsYWNlIHRoYXQgaW50MTYgaW50byBhbiBpbnQzMiwgd2hpY2ggcmVzdWx0cyBpbiB0aGUgKnBvc2l0aXZlKiBpbnRlZ2VyCisgICAgICAgKiAweDAwMDBmZmZmLiAgVGhlIGludDE2J3Mgc2lnbiBiaXQgYmVjb21lcywgaW4gdGhlIGludDMyLCB0aGUgcmF0aGVyCisgICAgICAgKiB1bmltcG9ydGFudCBiaXQgMTYuIFdlIG11c3Qgbm93IGV4dGVuZCB0aGUgaW50MTYncyBzaWduIGJpdCBpbnRvIGJpdHMKKyAgICAgICAqIDE3LTMyLCB3aGljaCBpcyBhY2NvbXBsaXNoZWQgYnkgbGVmdC1zaGlmdGluZyB0aGVuIHJpZ2h0LXNoaWZ0aW5nLgorICAgICAgICovCisKKyAgICAgIGFzc2VydCh1aW50X3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworCisgICAgICBpcl9ydmFsdWUgKnJlc3VsdCA9CisgICAgICAgIGNsYW1wKGRpdihpMmYocnNoaWZ0KGxzaGlmdCh1MmkodW5wYWNrX3VpbnRfdG9fdXZlYzIodWludF9ydmFsKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCgxNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCgxNnUpKSksCisgICAgICAgICAgICAgICAgICBjb25zdGFudCgzMjc2Ny4wZikpLAorICAgICAgICAgICAgICBjb25zdGFudCgtMS4wZiksCisgICAgICAgICAgICAgIGNvbnN0YW50KDEuMGYpKTsKKworICAgICAgYXNzZXJ0KHJlc3VsdC0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICAvKioKKyAgICAqIFxicmllZiBMb3dlciBhbiB1bnBhY2tTbm9ybTR4OCBleHByZXNzaW9uLgorICAgICoKKyAgICAqIFxwYXJhbSB1aW50X3J2YWwgaXMgdW5wYWNrU25vcm00eDgncyBpbnB1dAorICAgICogXHJldHVybiB1bnBhY2tTbm9ybTR4OCdzIG91dHB1dCBhcyBhIHZlYzQgcnZhbHVlCisgICAgKi8KKyAgIGlyX3J2YWx1ZSoKKyAgIGxvd2VyX3VucGFja19zbm9ybV80eDgoaXJfcnZhbHVlICp1aW50X3J2YWwpCisgICB7CisgICAgICAvKiBGcm9tIHBhZ2UgMTM3ICgxNDMgb2YgcGRmKSBvZiB0aGUgR0xTTCA0LjMwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgaGlnaHAgdmVjNCB1bnBhY2tTbm9ybTR4OCAoaGlnaHAgdWludCBwKQorICAgICAgICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICogICAgRmlyc3QsIHVucGFja3MgYSBzaW5nbGUgMzItYml0IHVuc2lnbmVkIGludGVnZXIgcCBpbnRvIGZvdXIKKyAgICAgICAqICAgIDgtYml0IHVuc2lnbmVkIGludGVnZXJzLiBUaGVuLCBlYWNoIGNvbXBvbmVudCBpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICAqICAgIGEgbm9ybWFsaXplZCBmbG9hdGluZy1wb2ludCB2YWx1ZSB0byBnZW5lcmF0ZSB0aGUgcmV0dXJuZWQKKyAgICAgICAqICAgIGZvdXItY29tcG9uZW50IHZlY3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgICBUaGUgY29udmVyc2lvbiBmb3IgdW5wYWNrZWQgZml4ZWQtcG9pbnQgdmFsdWUgZiB0byBmbG9hdGluZyBwb2ludCBpcworICAgICAgICogICAgZG9uZSBhcyBmb2xsb3dzOgorICAgICAgICoKKyAgICAgICAqICAgICAgIHVucGFja1Nub3JtNHg4OiBjbGFtcChmIC8gMTI3LjAsIC0xLCArMSkKKyAgICAgICAqCisgICAgICAgKiAgICBUaGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgICAqICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGlucHV0OyB0aGUgbGFzdCBjb21wb25lbnQgd2lsbCBiZQorICAgICAgICogICAgZXh0cmFjdGVkIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBJUiB0aGF0IGFwcHJveGltYXRlcyB0aGUgZm9sbG93aW5nIHBzZXVkby1HTFNMOgorICAgICAgICoKKyAgICAgICAqICAgIHJldHVybiBjbGFtcCgKKyAgICAgICAqICAgICAgICgoaXZlYzQodW5wYWNrX3VpbnRfdG9fdXZlYzQoVUlOVF9SVkFMVUUpKSA8PCAyNCkgPj4gMjQpIC8gMTI3LjBmLAorICAgICAgICogICAgICAgLTEuMGYsIDEuMGYpOworICAgICAgICoKKyAgICAgICAqIFRoZSBhYm92ZSBJUiBtYXkgYXBwZWFyIHVubmVjZXNzYXJpbHkgY29tcGxleCwgYnV0IHRoZSBpbnRlcm1lZGlhdGUKKyAgICAgICAqIGNvbnZlcnNpb24gdG8gaXZlYzQgYW5kIHRoZSBiaXQgc2hpZnRzIGFyZSBuZWNlc3NhcnkgdG8gY29ycmVjdGx5IHVucGFjaworICAgICAgICogbmVnYXRpdmUgZmxvYXRzLgorICAgICAgICoKKyAgICAgICAqIFRvIHNlZSB3aHksIGNvbnNpZGVyIHBhY2tpbmcgYW5kIHRoZW4gdW5wYWNraW5nIHZlYzQoLTEuMCwgMC4wLCAwLjAsCisgICAgICAgKiAwLjApLiBwYWNrU25vcm00eDggZW5jb2RlcyAtMS4wIGFzIHRoZSBpbnQ4IDB4ZmYuIER1cmluZyB1bnBhY2tpbmcsIHdlCisgICAgICAgKiBwbGFjZSB0aGF0IGludDggaW50byBhbiBpbnQzMiwgd2hpY2ggcmVzdWx0cyBpbiB0aGUgKnBvc2l0aXZlKiBpbnRlZ2VyCisgICAgICAgKiAweDAwMDAwMGZmLiAgVGhlIGludDgncyBzaWduIGJpdCBiZWNvbWVzLCBpbiB0aGUgaW50MzIsIHRoZSByYXRoZXIKKyAgICAgICAqIHVuaW1wb3J0YW50IGJpdCA4LiBXZSBtdXN0IG5vdyBleHRlbmQgdGhlIGludDgncyBzaWduIGJpdCBpbnRvIGJpdHMKKyAgICAgICAqIDktMzIsIHdoaWNoIGlzIGFjY29tcGxpc2hlZCBieSBsZWZ0LXNoaWZ0aW5nIHRoZW4gcmlnaHQtc2hpZnRpbmcuCisgICAgICAgKi8KKworICAgICAgYXNzZXJ0KHVpbnRfcnZhbC0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisKKyAgICAgIGlyX3J2YWx1ZSAqcmVzdWx0ID0KKyAgICAgICAgY2xhbXAoZGl2KGkyZihyc2hpZnQobHNoaWZ0KHUyaSh1bnBhY2tfdWludF90b191dmVjNCh1aW50X3J2YWwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50KDI0dSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCgyNHUpKSksCisgICAgICAgICAgICAgICAgICBjb25zdGFudCgxMjcuMGYpKSwKKyAgICAgICAgICAgICAgY29uc3RhbnQoLTEuMGYpLAorICAgICAgICAgICAgICBjb25zdGFudCgxLjBmKSk7CisKKyAgICAgIGFzc2VydChyZXN1bHQtPnR5cGUgPT0gZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgIH0KKworICAgLyoqCisgICAgKiBcYnJpZWYgTG93ZXIgYSBwYWNrVW5vcm0yeDE2IGV4cHJlc3Npb24uCisgICAgKgorICAgICogXHBhcmFtIHZlYzJfcnZhbCBpcyBwYWNrVW5vcm0yeDE2J3MgaW5wdXQKKyAgICAqIFxyZXR1cm4gcGFja1Vub3JtMngxNidzIG91dHB1dCBhcyBhIHVpbnQgcnZhbHVlCisgICAgKi8KKyAgIGlyX3J2YWx1ZSoKKyAgIGxvd2VyX3BhY2tfdW5vcm1fMngxNihpcl9ydmFsdWUgKnZlYzJfcnZhbCkKKyAgIHsKKyAgICAgIC8qIEZyb20gcGFnZSA4OCAoOTQgb2YgcGRmKSBvZiB0aGUgR0xTTCBFUyAzLjAwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgaGlnaHAgdWludCBwYWNrVW5vcm0yeDE2ICh2ZWMyIHYpCisgICAgICAgKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAqICAgIEZpcnN0LCBjb252ZXJ0cyBlYWNoIGNvbXBvbmVudCBvZiB0aGUgbm9ybWFsaXplZCBmbG9hdGluZy1wb2ludCB2YWx1ZQorICAgICAgICogICAgdiBpbnRvIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcy4gVGhlbiwgdGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIHRoZQorICAgICAgICogICAgcmV0dXJuZWQgMzItYml0IHVuc2lnbmVkIGludGVnZXIuCisgICAgICAgKgorICAgICAgICogICAgVGhlIGNvbnZlcnNpb24gZm9yIGNvbXBvbmVudCBjIG9mIHYgdG8gZml4ZWQgcG9pbnQgaXMgZG9uZSBhcworICAgICAgICogICAgZm9sbG93czoKKyAgICAgICAqCisgICAgICAgKiAgICAgICBwYWNrVW5vcm0yeDE2OiByb3VuZChjbGFtcChjLCAwLCArMSkgKiA2NTUzNS4wKQorICAgICAgICoKKyAgICAgICAqICAgIFRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxlYXN0CisgICAgICAgKiAgICBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBvdXRwdXQ7IHRoZSBsYXN0IGNvbXBvbmVudCB3aWxsIGJlIHdyaXR0ZW4gdG8KKyAgICAgICAqICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMuCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgSVIgdGhhdCBhcHByb3hpbWF0ZXMgdGhlIGZvbGxvd2luZyBwc2V1ZG8tR0xTTDoKKyAgICAgICAqCisgICAgICAgKiAgICAgcmV0dXJuIHBhY2tfdXZlYzJfdG9fdWludCh1dmVjMigKKyAgICAgICAqICAgICAgICAgICAgICAgIHJvdW5kKGNsYW1wKFZFQzJfUlZBTFVFLCAwLjBmLCAxLjBmKSAqIDY1NTM1LjBmKSkpOworICAgICAgICoKKyAgICAgICAqIEhlcmUgaXQgaXMgc2FmZSB0byBkaXJlY3RseSBjb252ZXJ0IHRoZSB2ZWMyIHRvIHV2ZWMyIGJlY2F1c2UgdGhlIHRoZQorICAgICAgICogdmVjMiBoYXMgYmVlbiBjbGFtcGVkIHRvIGEgbm9uLW5lZ2F0aXZlIHJhbmdlLgorICAgICAgICovCisKKyAgICAgIGFzc2VydCh2ZWMyX3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp2ZWMyX3R5cGUpOworCisgICAgICBpcl9ydmFsdWUgKnJlc3VsdCA9IHBhY2tfdXZlYzJfdG9fdWludCgKKyAgICAgICAgIGYydShyb3VuZF9ldmVuKG11bChzYXR1cmF0ZSh2ZWMyX3J2YWwpLCBjb25zdGFudCg2NTUzNS4wZikpKSkpOworCisgICAgICBhc3NlcnQocmVzdWx0LT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisKKyAgIC8qKgorICAgICogXGJyaWVmIExvd2VyIGEgcGFja1Vub3JtNHg4IGV4cHJlc3Npb24uCisgICAgKgorICAgICogXHBhcmFtIHZlYzRfcnZhbCBpcyBwYWNrVW5vcm00eDgncyBpbnB1dAorICAgICogXHJldHVybiBwYWNrVW5vcm00eDgncyBvdXRwdXQgYXMgYSB1aW50IHJ2YWx1ZQorICAgICovCisgICBpcl9ydmFsdWUqCisgICBsb3dlcl9wYWNrX3Vub3JtXzR4OChpcl9ydmFsdWUgKnZlYzRfcnZhbCkKKyAgIHsKKyAgICAgIC8qIEZyb20gcGFnZSAxMzcgKDE0MyBvZiBwZGYpIG9mIHRoZSBHTFNMIDQuMzAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICBoaWdocCB1aW50IHBhY2tVbm9ybTR4OCAodmVjNCB2KQorICAgICAgICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAqICAgIEZpcnN0LCBjb252ZXJ0cyBlYWNoIGNvbXBvbmVudCBvZiB0aGUgbm9ybWFsaXplZCBmbG9hdGluZy1wb2ludCB2YWx1ZQorICAgICAgICogICAgdiBpbnRvIDgtYml0IGludGVnZXIgdmFsdWVzLiBUaGVuLCB0aGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gdGhlCisgICAgICAgKiAgICByZXR1cm5lZCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4KKyAgICAgICAqCisgICAgICAgKiAgICBUaGUgY29udmVyc2lvbiBmb3IgY29tcG9uZW50IGMgb2YgdiB0byBmaXhlZCBwb2ludCBpcyBkb25lIGFzCisgICAgICAgKiAgICBmb2xsb3dzOgorICAgICAgICoKKyAgICAgICAqICAgICAgIHBhY2tVbm9ybTR4ODogcm91bmQoY2xhbXAoYywgMCwgKzEpICogMjU1LjApCisgICAgICAgKgorICAgICAgICogICAgVGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbGVhc3QKKyAgICAgICAqICAgIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIG91dHB1dDsgdGhlIGxhc3QgY29tcG9uZW50IHdpbGwgYmUgd3JpdHRlbiB0bworICAgICAgICogICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBJUiB0aGF0IGFwcHJveGltYXRlcyB0aGUgZm9sbG93aW5nIHBzZXVkby1HTFNMOgorICAgICAgICoKKyAgICAgICAqICAgICByZXR1cm4gcGFja191dmVjNF90b191aW50KHV2ZWM0KAorICAgICAgICogICAgICAgICAgICAgICAgcm91bmQoY2xhbXAoVkVDMl9SVkFMVUUsIDAuMGYsIDEuMGYpICogMjU1LjBmKSkpOworICAgICAgICoKKyAgICAgICAqIEhlcmUgaXQgaXMgc2FmZSB0byBkaXJlY3RseSBjb252ZXJ0IHRoZSB2ZWM0IHRvIHV2ZWM0IGJlY2F1c2UgdGhlIHRoZQorICAgICAgICogdmVjNCBoYXMgYmVlbiBjbGFtcGVkIHRvIGEgbm9uLW5lZ2F0aXZlIHJhbmdlLgorICAgICAgICovCisKKyAgICAgIGFzc2VydCh2ZWM0X3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworCisgICAgICBpcl9ydmFsdWUgKnJlc3VsdCA9IHBhY2tfdXZlYzRfdG9fdWludCgKKyAgICAgICAgIGYydShyb3VuZF9ldmVuKG11bChzYXR1cmF0ZSh2ZWM0X3J2YWwpLCBjb25zdGFudCgyNTUuMGYpKSkpKTsKKworICAgICAgYXNzZXJ0KHJlc3VsdC0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICAvKioKKyAgICAqIFxicmllZiBMb3dlciBhbiB1bnBhY2tVbm9ybTJ4MTYgZXhwcmVzc2lvbi4KKyAgICAqCisgICAgKiBccGFyYW0gdWludF9ydmFsIGlzIHVucGFja1Vub3JtMngxNidzIGlucHV0CisgICAgKiBccmV0dXJuIHVucGFja1Vub3JtMngxNidzIG91dHB1dCBhcyBhIHZlYzIgcnZhbHVlCisgICAgKi8KKyAgIGlyX3J2YWx1ZSoKKyAgIGxvd2VyX3VucGFja191bm9ybV8yeDE2KGlyX3J2YWx1ZSAqdWludF9ydmFsKQorICAgeworICAgICAgLyogRnJvbSBwYWdlIDg5ICg5NSBvZiBwZGYpIG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICBoaWdocCB2ZWMyIHVucGFja1Vub3JtMngxNiAoaGlnaHAgdWludCBwKQorICAgICAgICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAqICAgIEZpcnN0LCB1bnBhY2tzIGEgc2luZ2xlIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHAgaW50byBhIHBhaXIgb2YKKyAgICAgICAqICAgIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gVGhlbiwgZWFjaCBjb21wb25lbnQgaXMgY29udmVydGVkIHRvCisgICAgICAgKiAgICBhIG5vcm1hbGl6ZWQgZmxvYXRpbmctcG9pbnQgdmFsdWUgdG8gZ2VuZXJhdGUgdGhlIHJldHVybmVkCisgICAgICAgKiAgICB0d28tY29tcG9uZW50IHZlY3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgICBUaGUgY29udmVyc2lvbiBmb3IgdW5wYWNrZWQgZml4ZWQtcG9pbnQgdmFsdWUgZiB0byBmbG9hdGluZyBwb2ludCBpcworICAgICAgICogICAgZG9uZSBhcyBmb2xsb3dzOgorICAgICAgICoKKyAgICAgICAqICAgICAgIHVucGFja1Vub3JtMngxNjogZiAvIDY1NTM1LjAKKyAgICAgICAqCisgICAgICAgKiAgICBUaGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgICAqICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGlucHV0OyB0aGUgbGFzdCBjb21wb25lbnQgd2lsbCBiZQorICAgICAgICogICAgZXh0cmFjdGVkIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBJUiB0aGF0IGFwcHJveGltYXRlcyB0aGUgZm9sbG93aW5nIHBzZXVkby1HTFNMOgorICAgICAgICoKKyAgICAgICAqICAgICByZXR1cm4gdmVjMih1bnBhY2tfdWludF90b191dmVjMihVSU5UX1JWQUxVRSkpIC8gNjU1MzUuMDsKKyAgICAgICAqLworCisgICAgICBhc3NlcnQodWludF9ydmFsLT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKworICAgICAgaXJfcnZhbHVlICpyZXN1bHQgPSBkaXYodTJmKHVucGFja191aW50X3RvX3V2ZWMyKHVpbnRfcnZhbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoNjU1MzUuMGYpKTsKKworICAgICAgYXNzZXJ0KHJlc3VsdC0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICAvKioKKyAgICAqIFxicmllZiBMb3dlciBhbiB1bnBhY2tVbm9ybTR4OCBleHByZXNzaW9uLgorICAgICoKKyAgICAqIFxwYXJhbSB1aW50X3J2YWwgaXMgdW5wYWNrVW5vcm00eDgncyBpbnB1dAorICAgICogXHJldHVybiB1bnBhY2tVbm9ybTR4OCdzIG91dHB1dCBhcyBhIHZlYzQgcnZhbHVlCisgICAgKi8KKyAgIGlyX3J2YWx1ZSoKKyAgIGxvd2VyX3VucGFja191bm9ybV80eDgoaXJfcnZhbHVlICp1aW50X3J2YWwpCisgICB7CisgICAgICAvKiBGcm9tIHBhZ2UgMTM3ICgxNDMgb2YgcGRmKSBvZiB0aGUgR0xTTCA0LjMwIHNwZWM6CisgICAgICAgKgorICAgICAgICogICAgaGlnaHAgdmVjNCB1bnBhY2tVbm9ybTR4OCAoaGlnaHAgdWludCBwKQorICAgICAgICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICogICAgRmlyc3QsIHVucGFja3MgYSBzaW5nbGUgMzItYml0IHVuc2lnbmVkIGludGVnZXIgcCBpbnRvIGZvdXIKKyAgICAgICAqICAgIDgtYml0IHVuc2lnbmVkIGludGVnZXJzLiBUaGVuLCBlYWNoIGNvbXBvbmVudCBpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICAqICAgIGEgbm9ybWFsaXplZCBmbG9hdGluZy1wb2ludCB2YWx1ZSB0byBnZW5lcmF0ZSB0aGUgcmV0dXJuZWQKKyAgICAgICAqICAgIHR3by1jb21wb25lbnQgdmVjdG9yLgorICAgICAgICoKKyAgICAgICAqICAgIFRoZSBjb252ZXJzaW9uIGZvciB1bnBhY2tlZCBmaXhlZC1wb2ludCB2YWx1ZSBmIHRvIGZsb2F0aW5nIHBvaW50IGlzCisgICAgICAgKiAgICBkb25lIGFzIGZvbGxvd3M6CisgICAgICAgKgorICAgICAgICogICAgICAgdW5wYWNrVW5vcm00eDg6IGYgLyAyNTUuMAorICAgICAgICoKKyAgICAgICAqICAgIFRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgICAgICogICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgaW5wdXQ7IHRoZSBsYXN0IGNvbXBvbmVudCB3aWxsIGJlCisgICAgICAgKiAgICBleHRyYWN0ZWQgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIElSIHRoYXQgYXBwcm94aW1hdGVzIHRoZSBmb2xsb3dpbmcgcHNldWRvLUdMU0w6CisgICAgICAgKgorICAgICAgICogICAgIHJldHVybiB2ZWM0KHVucGFja191aW50X3RvX3V2ZWM0KFVJTlRfUlZBTFVFKSkgLyAyNTUuMDsKKyAgICAgICAqLworCisgICAgICBhc3NlcnQodWludF9ydmFsLT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKworICAgICAgaXJfcnZhbHVlICpyZXN1bHQgPSBkaXYodTJmKHVucGFja191aW50X3RvX3V2ZWM0KHVpbnRfcnZhbCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoMjU1LjBmKSk7CisKKyAgICAgIGFzc2VydChyZXN1bHQtPnR5cGUgPT0gZ2xzbF90eXBlOjp2ZWM0X3R5cGUpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgIH0KKworICAgLyoqCisgICAgKiBcYnJpZWYgTG93ZXIgdGhlIGNvbXBvbmVudC13aXNlIGNhbGN1bGF0aW9uIG9mIHBhY2tIYWxmMngxNi4KKyAgICAqCisgICAgKiBccGFyYW0gZl9ydmFsIGlzIG9uZSBjb21wb25lbnQgb2YgcGFja0hhZmwyeDE2J3MgaW5wdXQKKyAgICAqIFxwYXJhbSBlX3J2YWwgaXMgdGhlIHVuc2hpZnRlZCBleHBvbmVudCBiaXRzIG9mIGZfcnZhbAorICAgICogXHBhcmFtIG1fcnZhbCBpcyB0aGUgdW5zaGlmdGVkIG1hbnRpc3NhIGJpdHMgb2YgZl9ydmFsCisgICAgKgorICAgICogXHJldHVybiBhIHVpbnQgcnZhbHVlIHRoYXQgZW5jb2RlcyBhIGZsb2F0MTYgaW4gaXRzIGxvd2VyIDE2IGJpdHMKKyAgICAqLworICAgaXJfcnZhbHVlKgorICAgcGFja19oYWxmXzF4MTZfbm9zaWduKGlyX3J2YWx1ZSAqZl9ydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqZV9ydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqbV9ydmFsKQorICAgeworICAgICAgYXNzZXJ0KGVfcnZhbC0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisgICAgICBhc3NlcnQobV9ydmFsLT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKworICAgICAgLyogdWludCB1MTY7ICovCisgICAgICBpcl92YXJpYWJsZSAqdTE2ID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp1aW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF9wYWNrX2hhbGZfMXgxNl91MTYiKTsKKworICAgICAgLyogZmxvYXQgZiA9IEZMT0FUX1JWQUw7ICovCisgICAgICBpcl92YXJpYWJsZSAqZiA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6ZmxvYXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfcGFja19oYWxmXzF4MTZfZiIpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihmLCBmX3J2YWwpKTsKKworICAgICAgLyogdWludCBlID0gRV9SVkFMOyAqLworICAgICAgaXJfdmFyaWFibGUgKmUgPSBmYWN0b3J5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnVpbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfcGFja19oYWxmXzF4MTZfZSIpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihlLCBlX3J2YWwpKTsKKworICAgICAgLyogdWludCBtID0gTV9SVkFMOyAqLworICAgICAgaXJfdmFyaWFibGUgKm0gPSBmYWN0b3J5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnVpbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfcGFja19oYWxmXzF4MTZfbSIpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihtLCBtX3J2YWwpKTsKKworICAgICAgLyogUHJlbGltaW5hcmllcworICAgICAgICogLS0tLS0tLS0tLS0tLQorICAgICAgICoKKyAgICAgICAqIEZvciBhIGZsb2F0MTYsIHRoZSBiaXQgbGF5b3V0IGlzOgorICAgICAgICoKKyAgICAgICAqICAgc2lnbjogICAgIDE1CisgICAgICAgKiAgIGV4cG9uZW50OiAxMDoxNAorICAgICAgICogICBtYW50aXNzYTogMDo5CisgICAgICAgKgorICAgICAgICogTGV0IGYxNiBiZSBhIGZsb2F0MTYgdmFsdWUuIFRoZSBzaWduLCBleHBvbmVudCwgYW5kIG1hbnRpc3NhCisgICAgICAgKiBkZXRlcm1pbmUgaXRzIHZhbHVlIHRodXM6CisgICAgICAgKgorICAgICAgICogICBpZiBlMTYgPSAwIGFuZCBtMTYgPSAwLCB0aGVuIHplcm86ICAgICAgICgtMSleczE2ICogMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyAgICAgICAqICAgaWYgZTE2ID0gMCBhbmQgbTE2IT0gMCwgdGhlbiBzdWJub3JtYWw6ICAoLTEpXnMxNiAqIDJeKGUxNiAtIDE0KSAqIChtMTYgLyAyXjEwKSAgICAgKDIpCisgICAgICAgKiAgIGlmIDAgPCBlMTYgPCAzMSwgdGhlbiBub3JtYWw6ICAgICAgICAgICAgKC0xKV5zMTYgKiAyXihlMTYgLSAxNSkgKiAoMSArIG0xNiAvIDJeMTApICgzKQorICAgICAgICogICBpZiBlMTYgPSAzMSBhbmQgbTE2ID0gMCwgdGhlbiBpbmZpbml0ZTogICgtMSleczE2ICogaW5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCkKKyAgICAgICAqICAgaWYgZTE2ID0gMzEgYW5kIG0xNiAhPSAwLCB0aGVuICAgICAgICAgICBOYU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUpCisgICAgICAgKgorICAgICAgICogd2hlcmUgMCA8PSBtMTYgPCAyXjEwLgorICAgICAgICoKKyAgICAgICAqIEZvciBhIGZsb2F0MzIsIHRoZSBiaXQgbGF5b3V0IGlzOgorICAgICAgICoKKyAgICAgICAqICAgc2lnbjogICAgIDMxCisgICAgICAgKiAgIGV4cG9uZW50OiAyMzozMAorICAgICAgICogICBtYW50aXNzYTogMDoyMgorICAgICAgICoKKyAgICAgICAqIExldCBmMzIgYmUgYSBmbG9hdDMyIHZhbHVlLiBUaGUgc2lnbiwgZXhwb25lbnQsIGFuZCBtYW50aXNzYQorICAgICAgICogZGV0ZXJtaW5lIGl0cyB2YWx1ZSB0aHVzOgorICAgICAgICoKKyAgICAgICAqICAgaWYgZTMyID0gMCBhbmQgbTMyID0gMCwgdGhlbiB6ZXJvOiAgICAgICAgKC0xKV5zICogMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwKQorICAgICAgICogICBpZiBlMzIgPSAwIGFuZCBtMzIgIT0gMCwgdGhlbiBzdWJub3JtYWw6ICAoLTEpXnMgKiAyXihlMzIgLSAxMjYpICogKG0zMiAvIDJeMjMpICAgICAoMTEpCisgICAgICAgKiAgIGlmIDAgPCBlMzIgPCAyNTUsIHRoZW4gbm9ybWFsOiAgICAgICAgICAgICgtMSlecyAqIDJeKGUzMiAtIDEyNykgKiAoMSArIG0zMiAvIDJeMjMpICgxMikKKyAgICAgICAqICAgaWYgZTMyID0gMjU1IGFuZCBtMzIgPSAwLCB0aGVuIGluZmluaXRlOiAgKC0xKV5zICogaW5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEzKQorICAgICAgICogICBpZiBlMzIgPSAyNTUgYW5kIG0zMiAhPSAwLCB0aGVuICAgICAgICAgICBOYU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCisgICAgICAgKgorICAgICAgICogd2hlcmUgMCA8PSBtMzIgPCAyXjIzLgorICAgICAgICoKKyAgICAgICAqIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG5vcm1hbCBmbG9hdDE2IHZhbHVlcyBhcmUKKyAgICAgICAqCisgICAgICAgKiAgIG1pbl9ub3JtMTYgPSAyXigxIC0gMTUpICogKDEgKyAwIC8gMl4xMCkgPSAyXigtMTQpICAgKDIwKQorICAgICAgICogICBtYXhfbm9ybTE2ID0gMl4oMzAgLSAxNSkgKiAoMSArIDEwMjMgLyAyXjEwKSAgICAgICAgICgyMSkKKyAgICAgICAqCisgICAgICAgKiBUaGUgc3RlcCBhdCBtYXhfbm9ybTE2IGlzCisgICAgICAgKgorICAgICAgICogICBtYXhfc3RlcDE2ID0gMl41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyMikKKyAgICAgICAqCisgICAgICAgKiBPYnNlcnZlIHRoYXQgdGhlIGZsb2F0MTYgYm91bmRhcnkgdmFsdWVzIGluIGVxdWF0aW9ucyAyMC0yMSBsaWUgaW4gdGhlCisgICAgICAgKiByYW5nZSBvZiBub3JtYWwgZmxvYXQzMiB2YWx1ZXMuCisgICAgICAgKgorICAgICAgICoKKyAgICAgICAqIFJvdW5kaW5nIEJlaGF2aW9yCisgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICogTm90IGFsbCBmbG9hdDMyIHZhbHVlcyBjYW4gYmUgZXhhY3RseSByZXByZXNlbnRlZCBhcyBhIGZsb2F0MTYuIFdlCisgICAgICAgKiByb3VuZCBhbGwgc3VjaCBpbnRlcm1lZGlhdGUgZmxvYXQzMiB2YWx1ZXMgdG8gdGhlIG5lYXJlc3QgZmxvYXQxNjsgaWYKKyAgICAgICAqIHRoZSBmbG9hdDMyIGlzIGV4YWN0bHkgYmV0d2VlbiB0byBmbG9hdDE2IHZhbHVlcywgd2Ugcm91bmQgdG8gdGhlIG9uZQorICAgICAgICogd2l0aCBhbiBldmVuIG1hbnRpc3NhLiBUaGlzIHJvdW5kaW5nIGJlaGF2aW9yIGhhcyBzZXZlcmFsIGJlbmVmaXRzOgorICAgICAgICoKKyAgICAgICAqICAgLSBJdCBoYXMgbm8gc2lnbiBiaWFzLgorICAgICAgICoKKyAgICAgICAqICAgLSBJdCByZXByb2R1Y2VzIHRoZSBiZWhhdmlvciBvZiByZWFsIGhhcmR3YXJlOiBvcGNvZGUgRjMyVE8xNiBpbiBJbnRlbCdzCisgICAgICAgKiAgICAgR1BVIElTQS4KKyAgICAgICAqCisgICAgICAgKiAgIC0gQnkgcmVwcm9kdWNpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSBHUFUgKGF0IGxlYXN0IG9uIEludGVsIGhhcmR3YXJlKSwKKyAgICAgICAqICAgICBjb21waWxlLXRpbWUgZXZhbHVhdGlvbiBvZiBjb25zdGFudCBwYWNrSGFsZjJ4MTYgR0xTTCBleHByZXNzaW9ucyB3aWxsCisgICAgICAgKiAgICAgcmVzdWx0IGluIHRoZSBzYW1lIHZhbHVlIGFzIGlmIHRoZSBleHByZXNzaW9uIHdlcmUgZXhlY3V0ZWQgb24gdGhlCisgICAgICAgKiAgICAgR1BVLgorICAgICAgICoKKyAgICAgICAqIENhbGN1bGF0aW9uCisgICAgICAgKiAtLS0tLS0tLS0tLQorICAgICAgICogT3VyIHRhc2sgaXMgdG8gY29tcHV0ZSBzMTYsIGUxNiwgbTE2IGdpdmVuIGYzMi4gIFNpbmNlIHRoaXMgZnVuY3Rpb24KKyAgICAgICAqIGlnbm9yZXMgdGhlIHNpZ24gYml0LCBhc3N1bWUgdGhhdCBzMzIgPSBzMTYgPSAwLiAgVGhlcmUgYXJlIHNldmVyYWwKKyAgICAgICAqIGNhc2VzIGNvbnNpZGVyLgorICAgICAgICovCisKKyAgICAgIGZhY3RvcnkuZW1pdCgKKworICAgICAgICAgLyogQ2FzZSAxKSBmMzIgaXMgTmFOCisgICAgICAgICAgKgorICAgICAgICAgICogICBUaGUgcmVzdWx0YW50IGYxNiB3aWxsIGFsc28gYmUgTmFOLgorICAgICAgICAgICovCisKKyAgICAgICAgIC8qIGlmIChlMzIgPT0gMjU1ICYmIG0zMiAhPSAwKSB7ICovCisgICAgICAgICBpZl90cmVlKGxvZ2ljX2FuZChlcXVhbChlLCBjb25zdGFudCgweGZmdSA8PCAyM3UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljX25vdChlcXVhbChtLCBjb25zdGFudCgwdSkpKSksCisKKyAgICAgICAgICAgIGFzc2lnbih1MTYsIGNvbnN0YW50KDB4N2ZmZnUpKSwKKworICAgICAgICAgLyogQ2FzZSAyKSBmMzIgbGllcyBpbiB0aGUgcmFuZ2UgWzAsIG1pbl9ub3JtMTYpLgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgVGhlIHJlc3VsdGFudCBmbG9hdDE2IHdpbGwgYmUgZWl0aGVyIHplcm8sIHN1Ym5vcm1hbCwgb3Igbm9ybWFsLgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgU29sdmluZworICAgICAgICAgICoKKyAgICAgICAgICAqICAgICBmMzIgPSBtaW5fbm9ybTE2ICAgICAgICgzMCkKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgIGdpdmVzCisgICAgICAgICAgKgorICAgICAgICAgICogICAgIGUzMiA9IDExMyBhbmQgbTMyID0gMCAgKDMxKQorICAgICAgICAgICoKKyAgICAgICAgICAqICAgVGhlcmVmb3JlIHRoaXMgY2FzZSBvY2N1cnMgaWYgYW5kIG9ubHkgaWYKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAgZTMyIDwgMTEzICAgICAgICAgICAgICAoMzIpCisgICAgICAgICAgKi8KKworICAgICAgICAgLyogfSBlbHNlIGlmIChlMzIgPCAxMTMpIHsgKi8KKyAgICAgICAgIGlmX3RyZWUobGVzcyhlLCBjb25zdGFudCgxMTN1IDw8IDIzdSkpLAorCisgICAgICAgICAgICAvKiB1MTYgPSB1aW50KHJvdW5kX3RvX2V2ZW4oYWJzKGYzMikgKiBmbG9hdCgxdSA8PCAyNHUpKSk7ICovCisgICAgICAgICAgICBhc3NpZ24odTE2LCBmMnUocm91bmRfZXZlbihtdWwoZXhwcihpcl91bm9wX2FicywgZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoKGZsb2F0KSAoMSA8PCAyNCkpKSkpKSwKKworICAgICAgICAgLyogQ2FzZSAzKSBmMzIgbGllcyBpbiB0aGUgcmFuZ2UKKyAgICAgICAgICAqICAgICAgICAgW21pbl9ub3JtMTYsIG1heF9ub3JtMTYgKyBtYXhfc3RlcDE2KS4KKyAgICAgICAgICAqCisgICAgICAgICAgKiAgIFRoZSByZXN1bHRhbnQgZmxvYXQxNiB3aWxsIGJlIGVpdGhlciBub3JtYWwgb3IgaW5maW5pdGUuCisgICAgICAgICAgKgorICAgICAgICAgICogICBTb2x2aW5nCisgICAgICAgICAgKgorICAgICAgICAgICogICAgIGYzMiA9IG1heF9ub3JtMTYgKyBtYXhfc3RlcDE2ICAgICAgICAgICAoNDApCisgICAgICAgICAgKiAgICAgICAgID0gMl4xNSAqICgxICsgMTAyMyAvIDJeMTApICsgMl41ICAgICg0MSkKKyAgICAgICAgICAqICAgICAgICAgPSAyXjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQyKQorICAgICAgICAgICogICBnaXZlcworICAgICAgICAgICoKKyAgICAgICAgICAqICAgICBlMzIgPSAxNDMgYW5kIG0zMiA9IDAgICAgICAgICAgICAgICAgICAgKDQzKQorICAgICAgICAgICoKKyAgICAgICAgICAqICAgV2UgYWxyZWFkeSBzb2x2ZWQgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbiBmMzIgPSBtaW5fbm9ybTE2IGFib3ZlCisgICAgICAgICAgKiAgIGluIGVxdWF0aW9uIDMxLiBUaGVyZWZvcmUgdGhpcyBjYXNlIG9jY3VycyBpZiBhbmQgb25seSBpZgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgICAxMTMgPD0gZTMyIGFuZCBlMzIgPCAxNDMKKyAgICAgICAgICAqLworCisgICAgICAgICAvKiB9IGVsc2UgaWYgKGUzMiA8IDE0MykgeyAqLworICAgICAgICAgaWZfdHJlZShsZXNzKGUsIGNvbnN0YW50KDE0M3UgPDwgMjN1KSksCisKKyAgICAgICAgICAgIC8qIFRoZSBhZGRpdGlvbiBiZWxvdyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBtYW50aXNzYSByb3VuZHMKKyAgICAgICAgICAgICAqIHVwIHRvIDEwMjQgYW5kIGJ1bXBzIHRoZSBleHBvbmVudC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiB1MTYgPSAoKGUgLSAoMTEydSA8PCAyM3UpKSA+PiAxM3UpCisgICAgICAgICAgICAgKiAgICAgKyByb3VuZF90b19ldmVuKChmbG9hdChtKSAvICgxdSA8PCAxM3UpKTsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNzaWduKHUxNiwgYWRkKHJzaGlmdChzdWIoZSwgY29uc3RhbnQoMTEydSA8PCAyM3UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoMTN1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjJ1KHJvdW5kX2V2ZW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2KHUyZihtKSwgY29uc3RhbnQoKGZsb2F0KSAoMSA8PCAxMykpKSkpKSksCisKKyAgICAgICAgIC8qIENhc2UgNCkgZjMyIGxpZXMgaW4gdGhlIHJhbmdlIFttYXhfbm9ybTE2ICsgbWF4X3N0ZXAxNiwgaW5mXS4KKyAgICAgICAgICAqCisgICAgICAgICAgKiAgIFRoZSByZXN1bHRhbnQgZmxvYXQxNiB3aWxsIGJlIGluZmluaXRlLgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgVGhlIGNhc2VzIGFib3ZlIGNhdWdodCBhbGwgZmxvYXQzMiB2YWx1ZXMgaW4gdGhlIHJhbmdlCisgICAgICAgICAgKiAgIFswLCBtYXhfbm9ybTE2ICsgbWF4X3N0ZXAxNiksIHNvIHRoaXMgaXMgdGhlIGZhbGwtdGhyb3VnaCBjYXNlLgorICAgICAgICAgICovCisKKyAgICAgICAgIC8qIH0gZWxzZSB7ICovCisKKyAgICAgICAgICAgIGFzc2lnbih1MTYsIGNvbnN0YW50KDMxdSA8PCAxMHUpKSkpKSk7CisKKyAgICAgICAgIC8qIH0gKi8KKworICAgICAgIHJldHVybiBkZXJlZih1MTYpLnZhbDsKKyAgIH0KKworICAgLyoqCisgICAgKiBcYnJpZWYgTG93ZXIgYSBwYWNrSGFsZjJ4MTYgZXhwcmVzc2lvbi4KKyAgICAqCisgICAgKiBccGFyYW0gdmVjMl9ydmFsIGlzIHBhY2tIYWxmMngxNidzIGlucHV0CisgICAgKiBccmV0dXJuIHBhY2tIYWxmMngxNidzIG91dHB1dCBhcyBhIHVpbnQgcnZhbHVlCisgICAgKi8KKyAgIGlyX3J2YWx1ZSoKKyAgIGxvd2VyX3BhY2tfaGFsZl8yeDE2KGlyX3J2YWx1ZSAqdmVjMl9ydmFsKQorICAgeworICAgICAgLyogRnJvbSBwYWdlIDg5ICg5NSBvZiBwZGYpIG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICBoaWdocCB1aW50IHBhY2tIYWxmMngxNiAobWVkaXVtcCB2ZWMyIHYpCisgICAgICAgKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgKiAgICBSZXR1cm5zIGFuIHVuc2lnbmVkIGludGVnZXIgb2J0YWluZWQgYnkgY29udmVydGluZyB0aGUgY29tcG9uZW50cyBvZgorICAgICAgICogICAgYSB0d28tY29tcG9uZW50IGZsb2F0aW5nLXBvaW50IHZlY3RvciB0byB0aGUgMTYtYml0IGZsb2F0aW5nLXBvaW50CisgICAgICAgKiAgICByZXByZXNlbnRhdGlvbiBmb3VuZCBpbiB0aGUgT3BlbkdMIEVTIFNwZWNpZmljYXRpb24sIGFuZCB0aGVuIHBhY2tpbmcKKyAgICAgICAqICAgIHRoZXNlIHR3byAxNi1iaXQgaW50ZWdlcnMgaW50byBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorICAgICAgICoKKyAgICAgICAqICAgIFRoZSBmaXJzdCB2ZWN0b3IgY29tcG9uZW50IHNwZWNpZmllcyB0aGUgMTYgbGVhc3QtIHNpZ25pZmljYW50IGJpdHMKKyAgICAgICAqICAgIG9mIHRoZSByZXN1bHQ7IHRoZSBzZWNvbmQgY29tcG9uZW50IHNwZWNpZmllcyB0aGUgMTYgbW9zdC1zaWduaWZpY2FudAorICAgICAgICogICAgYml0cy4KKyAgICAgICAqLworCisgICAgICBhc3NlcnQodmVjMl9ydmFsLT50eXBlID09IGdsc2xfdHlwZTo6dmVjMl90eXBlKTsKKworICAgICAgLyogdmVjMiBmID0gVkVDMl9SVkFMOyAqLworICAgICAgaXJfdmFyaWFibGUgKmYgPSBmYWN0b3J5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnZlYzJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF9wYWNrX2hhbGZfMngxNl9mIik7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKGYsIHZlYzJfcnZhbCkpOworCisgICAgICAvKiB1dmVjMiBmMzIgPSBiaXRjYXN0X2YydShmKTsgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICpmMzIgPSBmYWN0b3J5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnV2ZWMyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfcGFja19oYWxmXzJ4MTZfZjMyIik7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKGYzMiwgZXhwcihpcl91bm9wX2JpdGNhc3RfZjJ1LCBmKSkpOworCisgICAgICAvKiB1dmVjMiBmMTY7ICovCisgICAgICBpcl92YXJpYWJsZSAqZjE2ID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp1dmVjMl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfcGFja19oYWxmXzJ4MTZfZjE2Iik7CisKKyAgICAgIC8qIEdldCBmMzIncyB1bnNoaWZ0ZWQgZXhwb25lbnQgYml0cy4KKyAgICAgICAqCisgICAgICAgKiAgIHV2ZWMyIGUgPSBmMzIgJiAweDdmODAwMDAwdTsKKyAgICAgICAqLworICAgICAgaXJfdmFyaWFibGUgKmUgPSBmYWN0b3J5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnV2ZWMyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wX3BhY2tfaGFsZl8yeDE2X2UiKTsKKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24oZSwgYml0X2FuZChmMzIsIGNvbnN0YW50KDB4N2Y4MDAwMDB1KSkpKTsKKworICAgICAgLyogR2V0IGYzMidzIHVuc2hpZnRlZCBtYW50aXNzYSBiaXRzLgorICAgICAgICoKKyAgICAgICAqICAgdXZlYzIgbSA9IGYzMiAmIDB4MDA3ZmZmZmZ1OworICAgICAgICovCisgICAgICBpcl92YXJpYWJsZSAqbSA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dXZlYzJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfcGFja19oYWxmXzJ4MTZfbSIpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihtLCBiaXRfYW5kKGYzMiwgY29uc3RhbnQoMHgwMDdmZmZmZnUpKSkpOworCisgICAgICAvKiBTZXQgZjE2J3MgZXhwb25lbnQgYW5kIG1hbnRpc3NhIGJpdHMuCisgICAgICAgKgorICAgICAgICogICBmMTYueCA9IHBhY2tfaGFsZl8xeDE2X25vc2lnbihlLngsIG0ueCk7CisgICAgICAgKiAgIGYxNi55ID0gcGFja19oYWxmXzF5MTZfbm9zaWduKGUueSwgbS55KTsKKyAgICAgICAqLworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihmMTYsIHBhY2tfaGFsZl8xeDE2X25vc2lnbihzd2l6emxlX3goZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGVfeChlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZV94KG0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19YKSk7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKGYxNiwgcGFja19oYWxmXzF4MTZfbm9zaWduKHN3aXp6bGVfeShmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZV95KGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlX3kobSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1kpKTsKKworICAgICAgLyogU2V0IGYxNidzIHNpZ24gYml0cy4KKyAgICAgICAqCisgICAgICAgKiAgIGYxNiB8PSAoZjMyICYgKDF1IDw8IDMxdSkgPj4gMTZ1OworICAgICAgICovCisgICAgICBmYWN0b3J5LmVtaXQoCisgICAgICAgICBhc3NpZ24oZjE2LCBiaXRfb3IoZjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaGlmdChiaXRfYW5kKGYzMiwgY29uc3RhbnQoMXUgPDwgMzF1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50KDE2dSkpKSkpOworCisKKyAgICAgIC8qIHJldHVybiAoZjE2LnkgPDwgMTZ1KSB8IGYxNi54OyAqLworICAgICAgaXJfcnZhbHVlICpyZXN1bHQgPSBiaXRfb3IobHNoaWZ0KHN3aXp6bGVfeShmMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50KDE2dSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZV94KGYxNikpOworCisgICAgICBhc3NlcnQocmVzdWx0LT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisKKyAgIC8qKgorICAgICogXGJyaWVmIFNwbGl0IHBhY2tIYWxmMngxNidzIHZlYzIgb3BlcmFuZCBpbnRvIHR3byBmbG9hdHMuCisgICAgKgorICAgICogXHBhcmFtIHZlYzJfcnZhbCBpcyBwYWNrSGFsZjJ4MTYncyBpbnB1dAorICAgICogXHJldHVybiBhIHVpbnQgcnZhbHVlCisgICAgKgorICAgICogU29tZSBjb2RlIGdlbmVyYXRvcnMsIHN1Y2ggYXMgdGhlIGk5NjUgZnJhZ21lbnQgc2hhZGVyLCByZXF1aXJlIHRoYXQgYWxsCisgICAgKiB2ZWN0b3IgZXhwcmVzc2lvbnMgYmUgbG93ZXJlZCB0byBhIHNlcXVlbmNlIG9mIHNjYWxhciBleHByZXNzaW9ucy4KKyAgICAqIEhvd2V2ZXIsIHBhY2tIYWxmMngxNiBjYW5ub3QgYmUgc2NhbGFyaXplZCBieSB0aGUgc2FtZSBtZWNoYW5pc20gYXMKKyAgICAqIGEgdHJ1ZSB2ZWN0b3Igb3BlcmF0aW9uIGJlY2F1c2UgaXRzIGlucHV0IGFuZCBvdXRwdXQgaGF2ZSBhIGRpZmZlcmluZworICAgICogbnVtYmVyIG9mIHZlY3RvciBjb21wb25lbnRzLgorICAgICoKKyAgICAqIFRoaXMgbWV0aG9kIHNjYWxhcml6ZXMgcGFja0hhbGYyeDE2IGJ5IHRyYW5zZm9ybWluZyBpdCBmcm9tIGFuIHVuYXJ5CisgICAgKiBvcGVyYXRpb24gaGF2aW5nIHZlY3RvciBpbnB1dCB0byBhIGJpbmFyeSBvcGVyYXRpb24gaGF2aW5nIHNjYWxhciBpbnB1dC4KKyAgICAqIFRoYXQgaXMsIGl0IHRyYW5zZm9ybXMKKyAgICAqCisgICAgKiAgICBwYWNrSGFsZjJ4MTYoVkVDMl9SVkFMKTsKKyAgICAqCisgICAgKiBpbnRvCisgICAgKgorICAgICogICAgdmVjMiB2ID0gVkVDMl9SVkFMOworICAgICogICAgcmV0dXJuIHBhY2tIYWxmMngxNl9zcGxpdCh2LngsIHYueSk7CisgICAgKi8KKyAgIGlyX3J2YWx1ZSoKKyAgIHNwbGl0X3BhY2tfaGFsZl8yeDE2KGlyX3J2YWx1ZSAqdmVjMl9ydmFsKQorICAgeworICAgICAgYXNzZXJ0KHZlYzJfcnZhbC0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisKKyAgICAgIGlyX3ZhcmlhYmxlICp2ID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfc3BsaXRfcGFja19oYWxmXzJ4MTZfdiIpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbih2LCB2ZWMyX3J2YWwpKTsKKworICAgICAgcmV0dXJuIGV4cHIoaXJfYmlub3BfcGFja19oYWxmXzJ4MTZfc3BsaXQsIHN3aXp6bGVfeCh2KSwgc3dpenpsZV95KHYpKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBcYnJpZWYgTG93ZXIgdGhlIGNvbXBvbmVudC13aXNlIGNhbGN1bGF0aW9uIG9mIHVucGFja0hhbGYyeDE2LgorICAgICoKKyAgICAqIEdpdmVuIGEgdWludCB0aGF0IGVuY29kZXMgYSBmbG9hdDE2IGluIGl0cyBsb3dlciAxNiBiaXRzLCB0aGlzIGZ1bmN0aW9uCisgICAgKiByZXR1cm5zIGEgdWludCB0aGF0IGVuY29kZXMgYSBmbG9hdDMyIHdpdGggdGhlIHNhbWUgdmFsdWUuIFRoZSBzaWduIGJpdAorICAgICogb2YgdGhlIGZsb2F0MTYgaXMgaWdub3JlZC4KKyAgICAqCisgICAgKiBccGFyYW0gZV9ydmFsIGlzIHRoZSB1bnNoaWZ0ZWQgZXhwb25lbnQgYml0cyBvZiBhIGZsb2F0MTYKKyAgICAqIFxwYXJhbSBtX3J2YWwgaXMgdGhlIHVuc2hpZnRlZCBtYW50aXNzYSBiaXRzIG9mIGEgZmxvYXQxNgorICAgICogXHBhcmFtIGEgdWludCBydmFsdWUgdGhhdCBlbmNvZGVzIGEgZmxvYXQzMgorICAgICovCisgICBpcl9ydmFsdWUqCisgICB1bnBhY2tfaGFsZl8xeDE2X25vc2lnbihpcl9ydmFsdWUgKmVfcnZhbCwgaXJfcnZhbHVlICptX3J2YWwpCisgICB7CisgICAgICBhc3NlcnQoZV9ydmFsLT50eXBlID09IGdsc2xfdHlwZTo6dWludF90eXBlKTsKKyAgICAgIGFzc2VydChtX3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworCisgICAgICAvKiB1aW50IHUzMjsgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICp1MzIgPSBmYWN0b3J5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnVpbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wX3VucGFja19oYWxmXzF4MTZfdTMyIik7CisKKyAgICAgIC8qIHVpbnQgZSA9IEVfUlZBTDsgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICplID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp1aW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wX3VucGFja19oYWxmXzF4MTZfZSIpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihlLCBlX3J2YWwpKTsKKworICAgICAgLyogdWludCBtID0gTV9SVkFMOyAqLworICAgICAgaXJfdmFyaWFibGUgKm0gPSBmYWN0b3J5Lm1ha2VfdGVtcChnbHNsX3R5cGU6OnVpbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBfdW5wYWNrX2hhbGZfMXgxNl9tIik7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKG0sIG1fcnZhbCkpOworCisgICAgICAvKiBQcmVsaW1pbmFyaWVzCisgICAgICAgKiAtLS0tLS0tLS0tLS0tCisgICAgICAgKgorICAgICAgICogRm9yIGEgZmxvYXQxNiwgdGhlIGJpdCBsYXlvdXQgaXM6CisgICAgICAgKgorICAgICAgICogICBzaWduOiAgICAgMTUKKyAgICAgICAqICAgZXhwb25lbnQ6IDEwOjE0CisgICAgICAgKiAgIG1hbnRpc3NhOiAwOjkKKyAgICAgICAqCisgICAgICAgKiBMZXQgZjE2IGJlIGEgZmxvYXQxNiB2YWx1ZS4gVGhlIHNpZ24sIGV4cG9uZW50LCBhbmQgbWFudGlzc2EKKyAgICAgICAqIGRldGVybWluZSBpdHMgdmFsdWUgdGh1czoKKyAgICAgICAqCisgICAgICAgKiAgIGlmIGUxNiA9IDAgYW5kIG0xNiA9IDAsIHRoZW4gemVybzogICAgICAgKC0xKV5zMTYgKiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorICAgICAgICogICBpZiBlMTYgPSAwIGFuZCBtMTYhPSAwLCB0aGVuIHN1Ym5vcm1hbDogICgtMSleczE2ICogMl4oZTE2IC0gMTQpICogKG0xNiAvIDJeMTApICAgICAoMikKKyAgICAgICAqICAgaWYgMCA8IGUxNiA8IDMxLCB0aGVuIG5vcm1hbDogICAgICAgICAgICAoLTEpXnMxNiAqIDJeKGUxNiAtIDE1KSAqICgxICsgbTE2IC8gMl4xMCkgKDMpCisgICAgICAgKiAgIGlmIGUxNiA9IDMxIGFuZCBtMTYgPSAwLCB0aGVuIGluZmluaXRlOiAgKC0xKV5zMTYgKiBpbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0KQorICAgICAgICogICBpZiBlMTYgPSAzMSBhbmQgbTE2ICE9IDAsIHRoZW4gICAgICAgICAgIE5hTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSkKKyAgICAgICAqCisgICAgICAgKiB3aGVyZSAwIDw9IG0xNiA8IDJeMTAuCisgICAgICAgKgorICAgICAgICogRm9yIGEgZmxvYXQzMiwgdGhlIGJpdCBsYXlvdXQgaXM6CisgICAgICAgKgorICAgICAgICogICBzaWduOiAzMQorICAgICAgICogICBleHBvbmVudDogMjM6MzAKKyAgICAgICAqICAgbWFudGlzc2E6IDA6MjIKKyAgICAgICAqCisgICAgICAgKiBMZXQgZjMyIGJlIGEgZmxvYXQzMiB2YWx1ZS4gVGhlIHNpZ24sIGV4cG9uZW50LCBhbmQgbWFudGlzc2EKKyAgICAgICAqIGRldGVybWluZSBpdHMgdmFsdWUgdGh1czoKKyAgICAgICAqCisgICAgICAgKiAgIGlmIGUzMiA9IDAgYW5kIG0zMiA9IDAsIHRoZW4gemVybzogICAgICAgICgtMSlecyAqIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMCkKKyAgICAgICAqICAgaWYgZTMyID0gMCBhbmQgbTMyICE9IDAsIHRoZW4gc3Vibm9ybWFsOiAgKC0xKV5zICogMl4oZTMyIC0gMTI2KSAqIChtMzIgLyAyXjIzKSAgICAgKDExKQorICAgICAgICogICBpZiAwIDwgZTMyIDwgMjU1LCB0aGVuIG5vcm1hbDogICAgICAgICAgICAoLTEpXnMgKiAyXihlMzIgLSAxMjcpICogKDEgKyBtMzIgLyAyXjIzKSAoMTIpCisgICAgICAgKiAgIGlmIGUzMiA9IDI1NSBhbmQgbTMyID0gMCwgdGhlbiBpbmZpbml0ZTogICgtMSlecyAqIGluZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMykKKyAgICAgICAqICAgaWYgZTMyID0gMjU1IGFuZCBtMzIgIT0gMCwgdGhlbiAgICAgICAgICAgTmFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE0KQorICAgICAgICoKKyAgICAgICAqIHdoZXJlIDAgPD0gbTMyIDwgMl4yMy4KKyAgICAgICAqCisgICAgICAgKiBDYWxjdWxhdGlvbgorICAgICAgICogLS0tLS0tLS0tLS0KKyAgICAgICAqIE91ciB0YXNrIGlzIHRvIGNvbXB1dGUgczMyLCBlMzIsIG0zMiBnaXZlbiBmMTYuICBTaW5jZSB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiBpZ25vcmVzIHRoZSBzaWduIGJpdCwgYXNzdW1lIHRoYXQgczMyID0gczE2ID0gMC4gIFRoZXJlIGFyZSBzZXZlcmFsCisgICAgICAgKiBjYXNlcyBjb25zaWRlci4KKyAgICAgICAqLworCisgICAgICBmYWN0b3J5LmVtaXQoCisKKyAgICAgICAgIC8qIENhc2UgMSkgZjE2IGlzIHplcm8gb3Igc3Vibm9ybWFsLgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgVGhlIHNpbXBsZXN0IG1ldGhvZCBvZiBjYWxjdWF0aW5nIGYzMiBpbiB0aGlzIGNhc2UgaXMKKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAgZjMyID0gZjE2ICAgICAgICAgICAgICAgICAgICAgICAoMjApCisgICAgICAgICAgKiAgICAgICAgID0gMl4oLTE0KSAqIChtMTYgLyAyXjEwKSAgICAoMjEpCisgICAgICAgICAgKiAgICAgICAgID0gbTE2IC8gMl4oLTI0KSAgICAgICAgICAgICAoMjIpCisgICAgICAgICAgKi8KKworICAgICAgICAgLyogaWYgKGUxNiA9PSAwKSB7ICovCisgICAgICAgICBpZl90cmVlKGVxdWFsKGUsIGNvbnN0YW50KDB1KSksCisKKyAgICAgICAgICAgIC8qIHUzMiA9IGJpdGNhc3RfZjJ1KGZsb2F0KG0pIC8gZmxvYXQoMSA8PCAyNCkpOyAqLworICAgICAgICAgICAgYXNzaWduKHUzMiwgZXhwcihpcl91bm9wX2JpdGNhc3RfZjJ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXYodTJmKG0pLCBjb25zdGFudCgoZmxvYXQpKDEgPDwgMjQpKSkpKSwKKworICAgICAgICAgLyogQ2FzZSAyKSBmMTYgaXMgbm9ybWFsLgorICAgICAgICAgICoKKyAgICAgICAgICAqICAgVGhlIGVxdWF0aW9uCisgICAgICAgICAgKgorICAgICAgICAgICogICAgIGYzMiA9IGYxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMCkKKyAgICAgICAgICAqICAgICAyXihlMzIgLSAxMjcpICogKDEgKyBtMzIgLyAyXjIzKSA9ICAgICAoMzEpCisgICAgICAgICAgKiAgICAgICAyXihlMTYgLSAxNSkgKiAoMSArIG0xNiAvIDJeMTApCisgICAgICAgICAgKgorICAgICAgICAgICogICBjYW4gYmUgZGVjb21wb3NlZCBpbnRvIHR3bworICAgICAgICAgICoKKyAgICAgICAgICAqICAgICAyXihlMzIgLSAxMjcpID0gMl4oZTE2IC0gMTUpICAgICAgICAgICAoMzIpCisgICAgICAgICAgKiAgICAgMSArIG0zMiAvIDJeMjMgPSAxICsgbTE2IC8gMl4xMCAgICAgICAgKDMzKQorICAgICAgICAgICoKKyAgICAgICAgICAqICAgd2hpY2ggc29sdmUgdG8KKyAgICAgICAgICAqCisgICAgICAgICAgKiAgICAgZTMyID0gZTE2ICsgMTEyICAgICAgICAgICAgICAgICAgICAgICAgKDM0KQorICAgICAgICAgICogICAgIG0zMiA9IG0xNiAqIDJeMTMgICAgICAgICAgICAgICAgICAgICAgICgzNSkKKyAgICAgICAgICAqLworCisgICAgICAgICAvKiB9IGVsc2UgaWYgKGUxNiA8IDMxKSkgeyAqLworICAgICAgICAgaWZfdHJlZShsZXNzKGUsIGNvbnN0YW50KDMxdSA8PCAxMHUpKSwKKworICAgICAgICAgICAgICAvKiB1MzIgPSAoKGUgKyAoMTEyIDw8IDEwKSkgfCBtKSA8PCAxMzsKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGFzc2lnbih1MzIsIGxzaGlmdChiaXRfb3IoYWRkKGUsIGNvbnN0YW50KDExMnUgPDwgMTB1KSksIG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoMTN1KSkpLAorCisKKyAgICAgICAgIC8qIENhc2UgMykgZjE2IGlzIGluZmluaXRlLiAqLworICAgICAgICAgaWZfdHJlZShlcXVhbChtLCBjb25zdGFudCgwdSkpLAorCisgICAgICAgICAgICAgICAgIGFzc2lnbih1MzIsIGNvbnN0YW50KDI1NXUgPDwgMjN1KSksCisKKyAgICAgICAgIC8qIENhc2UgNCkgZjE2IGlzIE5hTi4gKi8KKyAgICAgICAgIC8qIH0gZWxzZSB7ICovCisKKyAgICAgICAgICAgIGFzc2lnbih1MzIsIGNvbnN0YW50KDB4N2ZmZmZmZmZ1KSkpKSkpOworCisgICAgICAgICAvKiB9ICovCisKKyAgICAgIHJldHVybiBkZXJlZih1MzIpLnZhbDsKKyAgIH0KKworICAgLyoqCisgICAgKiBcYnJpZWYgTG93ZXIgYW4gdW5wYWNrSGFsZjJ4MTYgZXhwcmVzc2lvbi4KKyAgICAqCisgICAgKiBccGFyYW0gdWludF9ydmFsIGlzIHVucGFja0hhbGYyeDE2J3MgaW5wdXQKKyAgICAqIFxyZXR1cm4gdW5wYWNrSGFsZjJ4MTYncyBvdXRwdXQgYXMgYSB2ZWMyIHJ2YWx1ZQorICAgICovCisgICBpcl9ydmFsdWUqCisgICBsb3dlcl91bnBhY2tfaGFsZl8yeDE2KGlyX3J2YWx1ZSAqdWludF9ydmFsKQorICAgeworICAgICAgLyogRnJvbSBwYWdlIDg5ICg5NSBvZiBwZGYpIG9mIHRoZSBHTFNMIEVTIDMuMDAgc3BlYzoKKyAgICAgICAqCisgICAgICAgKiAgICBtZWRpdW1wIHZlYzIgdW5wYWNrSGFsZjJ4MTYgKGhpZ2hwIHVpbnQgdikKKyAgICAgICAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICogICAgUmV0dXJucyBhIHR3by1jb21wb25lbnQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIHdpdGggY29tcG9uZW50cworICAgICAgICogICAgb2J0YWluZWQgYnkgdW5wYWNraW5nIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgaW50byBhIHBhaXIgb2YgMTYtYml0CisgICAgICAgKiAgICB2YWx1ZXMsIGludGVycHJldGluZyB0aG9zZSB2YWx1ZXMgYXMgMTYtYml0IGZsb2F0aW5nLXBvaW50IG51bWJlcnMKKyAgICAgICAqICAgIGFjY29yZGluZyB0byB0aGUgT3BlbkdMIEVTIFNwZWNpZmljYXRpb24sIGFuZCBjb252ZXJ0aW5nIHRoZW0gdG8KKyAgICAgICAqICAgIDMyLWJpdCBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgICAgICAgKgorICAgICAgICogICAgVGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGlzIG9idGFpbmVkIGZyb20gdGhlCisgICAgICAgKiAgICAxNiBsZWFzdC1zaWduaWZpY2FudCBiaXRzIG9mIHY7IHRoZSBzZWNvbmQgY29tcG9uZW50IGlzIG9idGFpbmVkCisgICAgICAgKiAgICBmcm9tIHRoZSAxNiBtb3N0LXNpZ25pZmljYW50IGJpdHMgb2Ygdi4KKyAgICAgICAqLworICAgICAgYXNzZXJ0KHVpbnRfcnZhbC0+dHlwZSA9PSBnbHNsX3R5cGU6OnVpbnRfdHlwZSk7CisKKyAgICAgIC8qIHVpbnQgdSA9IFJWQUxVRTsKKyAgICAgICAqIHV2ZWMyIGYxNiA9IHV2ZWMyKHUueCAmIDB4ZmZmZiwgdS55ID4+IDE2KTsKKyAgICAgICAqLworICAgICAgaXJfdmFyaWFibGUgKmYxNiA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dXZlYzJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF91bnBhY2tfaGFsZl8yeDE2X2YxNiIpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihmMTYsIHVucGFja191aW50X3RvX3V2ZWMyKHVpbnRfcnZhbCkpKTsKKworICAgICAgLyogdXZlYzIgZjMyOyAqLworICAgICAgaXJfdmFyaWFibGUgKmYzMiA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dXZlYzJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF91bnBhY2tfaGFsZl8yeDE2X2YzMiIpOworCisgICAgICAvKiBHZXQgZjE2J3MgdW5zaGlmdGVkIGV4cG9uZW50IGJpdHMuCisgICAgICAgKgorICAgICAgICogICAgdXZlYzIgZSA9IGYxNiAmIDB4N2MwMHU7CisgICAgICAgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICplID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp1dmVjMl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF91bnBhY2tfaGFsZl8yeDE2X2UiKTsKKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24oZSwgYml0X2FuZChmMTYsIGNvbnN0YW50KDB4N2MwMHUpKSkpOworCisgICAgICAvKiBHZXQgZjE2J3MgdW5zaGlmdGVkIG1hbnRpc3NhIGJpdHMuCisgICAgICAgKgorICAgICAgICogICAgdXZlYzIgbSA9IGYxNiAmIDB4MDNmZnU7CisgICAgICAgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICptID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp1dmVjMl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF91bnBhY2tfaGFsZl8yeDE2X20iKTsKKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24obSwgYml0X2FuZChmMTYsIGNvbnN0YW50KDB4MDNmZnUpKSkpOworCisgICAgICAvKiBTZXQgZjMyJ3MgZXhwb25lbnQgYW5kIG1hbnRpc3NhIGJpdHMuCisgICAgICAgKgorICAgICAgICogICBmMzIueCA9IHVucGFja19oYWxmXzF4MTZfbm9zaWduKGUueCwgbS54KTsKKyAgICAgICAqICAgZjMyLnkgPSB1bnBhY2tfaGFsZl8xeDE2X25vc2lnbihlLnksIG0ueSk7CisgICAgICAgKi8KKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24oZjMyLCB1bnBhY2tfaGFsZl8xeDE2X25vc2lnbihzd2l6emxlX3goZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpenpsZV94KG0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19YKSk7CisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKGYzMiwgdW5wYWNrX2hhbGZfMXgxNl9ub3NpZ24oc3dpenpsZV95KGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXp6bGVfeShtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURU1BU0tfWSkpOworCisgICAgICAvKiBTZXQgZjMyJ3Mgc2lnbiBiaXQuCisgICAgICAgKgorICAgICAgICogICAgZjMyIHw9IChmMTYgJiAweDgwMDB1KSA8PCAxNnU7CisgICAgICAgKi8KKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24oZjMyLCBiaXRfb3IoZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNoaWZ0KGJpdF9hbmQoZjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQoMHg4MDAwdSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50KDE2dSkpKSkpOworCisgICAgICAvKiByZXR1cm4gYml0Y2FzdF91MmYoZjMyKTsgKi8KKyAgICAgIGlyX3J2YWx1ZSAqcmVzdWx0ID0gZXhwcihpcl91bm9wX2JpdGNhc3RfdTJmLCBmMzIpOworICAgICAgYXNzZXJ0KHJlc3VsdC0+dHlwZSA9PSBnbHNsX3R5cGU6OnZlYzJfdHlwZSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICAvKioKKyAgICAqIFxicmllZiBTcGxpdCB1bnBhY2tIYWxmMngxNiBpbnRvIHR3byBvcGVyYXRpb25zLgorICAgICoKKyAgICAqIFxwYXJhbSB1aW50X3J2YWwgaXMgdW5wYWNrSGFsZjJ4MTYncyBpbnB1dAorICAgICogXHJldHVybiBhIHZlYzIgcnZhbHVlCisgICAgKgorICAgICogU29tZSBjb2RlIGdlbmVyYXRvcnMsIHN1Y2ggYXMgdGhlIGk5NjUgZnJhZ21lbnQgc2hhZGVyLCByZXF1aXJlIHRoYXQgYWxsCisgICAgKiB2ZWN0b3IgZXhwcmVzc2lvbnMgYmUgbG93ZXJlZCB0byBhIHNlcXVlbmNlIG9mIHNjYWxhciBleHByZXNzaW9ucy4KKyAgICAqIEhvd2V2ZXIsIHVucGFja0hhbGYyeDE2IGNhbm5vdCBiZSBzY2FsYXJpemVkIGJ5IHRoZSBzYW1lIG1ldGhvZCBhcworICAgICogYSB0cnVlIHZlY3RvciBvcGVyYXRpb24gYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgaXRzIGlucHV0CisgICAgKiBhbmQgb3V0cHV0IGRpZmZlci4KKyAgICAqCisgICAgKiBUaGlzIG1ldGhvZCBzY2FsYXJpemVzIHVucGFja0hhbGYyeDE2IGJ5IHRyYW5zZm9ybWluZyBpdCBmcm9tIGEgc2luZ2xlCisgICAgKiBvcGVyYXRpb24gaGF2aW5nIHZlYzIgb3V0cHV0IHRvIGEgcGFpciBvZiBvcGVyYXRpb25zIGVhY2ggaGF2aW5nIGZsb2F0CisgICAgKiBvdXRwdXQuIFRoYXQgaXMsIGl0IHRyYW5zZm9ybXMKKyAgICAqCisgICAgKiAgIHVucGFja0hhbGYyeDE2KFVJTlRfUlZBTCkKKyAgICAqCisgICAgKiBpbnRvCisgICAgKgorICAgICogICB1aW50IHUgPSBVSU5UX1JWQUw7CisgICAgKiAgIHZlYzIgdjsKKyAgICAqCisgICAgKiAgIHYueCA9IHVucGFja0hhbGYyeDE2X3NwbGl0X3godSk7CisgICAgKiAgIHYueSA9IHVucGFja0hhbGYyeDE2X3NwbGl0X3kodSk7CisgICAgKgorICAgICogICByZXR1cm4gdjsKKyAgICAqLworICAgaXJfcnZhbHVlKgorICAgc3BsaXRfdW5wYWNrX2hhbGZfMngxNihpcl9ydmFsdWUgKnVpbnRfcnZhbCkKKyAgIHsKKyAgICAgIGFzc2VydCh1aW50X3J2YWwtPnR5cGUgPT0gZ2xzbF90eXBlOjp1aW50X3R5cGUpOworCisgICAgICAvKiB1aW50IHUgPSB1aW50X3J2YWw7ICovCisgICAgICBpcl92YXJpYWJsZSAqdSA9IGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6dWludF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcF9zcGxpdF91bnBhY2tfaGFsZl8yeDE2X3UiKTsKKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24odSwgdWludF9ydmFsKSk7CisKKyAgICAgIC8qIHZlYzIgdjsgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICp2ID0gZmFjdG9yeS5tYWtlX3RlbXAoZ2xzbF90eXBlOjp2ZWMyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wX3NwbGl0X3VucGFja19oYWxmXzJ4MTZfdiIpOworCisgICAgICAvKiB2LnggPSB1bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3godSk7ICovCisgICAgICBmYWN0b3J5LmVtaXQoYXNzaWduKHYsIGV4cHIoaXJfdW5vcF91bnBhY2tfaGFsZl8yeDE2X3NwbGl0X3gsIHUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVNQVNLX1gpKTsKKworICAgICAgLyogdi55ID0gdW5wYWNrX2hhbGZfMngxNl9zcGxpdF95KHUpOyAqLworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbih2LCBleHByKGlyX3Vub3BfdW5wYWNrX2hhbGZfMngxNl9zcGxpdF95LCB1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFTUFTS19ZKSk7CisKKyAgICAgIHJldHVybiBkZXJlZih2KS52YWw7CisgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKKworLyoqCisgKiBcYnJpZWYgTG93ZXIgdGhlIGJ1aWx0aW4gcGFja2luZyBmdW5jdGlvbnMuCisgKgorICogXHBhcmFtIG9wX21hc2sgaXMgYSBiaXRtYXNrIG9mIGBlbnVtIGxvd2VyX3BhY2tpbmdfYnVpbHRpbnNfb3BgLgorICovCitib29sCitsb3dlcl9wYWNraW5nX2J1aWx0aW5zKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBpbnQgb3BfbWFzaykKK3sKKyAgIGxvd2VyX3BhY2tpbmdfYnVpbHRpbnNfdmlzaXRvciB2KG9wX21hc2spOworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zLCB0cnVlKTsKKyAgIHJldHVybiB2LmdldF9wcm9ncmVzcygpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl90ZXh0dXJlX3Byb2plY3Rpb24uY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl90ZXh0dXJlX3Byb2plY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDYzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3RleHR1cmVfcHJvamVjdGlvbi5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGxvd2VyX3RleHR1cmVfcHJvamVjdGlvbi5jcHAKKyAqCisgKiBJUiBsb3dlciBwYXNzIHRvIHBlcmZvcm0gdGhlIGRpdmlzaW9uIG9mIHRleHR1cmUgY29vcmRpbmF0ZXMgYnkgdGhlIHRleHR1cmUKKyAqIHByb2plY3RvciBpZiBwcmVzZW50LgorICoKKyAqIE1hbnkgR1BVcyBoYXZlIGEgdGV4dHVyZSBzYW1wbGluZyBvcGNvZGUgdGhhdCB0YWtlcyB0aGUgcHJvamVjdG9yCisgKiBhbmQgZG9lcyB0aGUgZGl2aWRlIGludGVybmFsbHksIHRodXMgdGhlIHByZXNlbmNlIG9mIHRoZSBwcm9qZWN0b3IKKyAqIGluIHRoZSBJUi4gIEZvciBHUFVzIHRoYXQgZG9uJ3QsIHRoaXMgc2F2ZXMgdGhlIGRyaXZlciBuZWVkaW5nIHRoZQorICogbG9naWMgZm9yIGhhbmRsaW5nIHRoZSBkaXZpZGUuCisgKgorICogXGF1dGhvciBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICovCisKKyNpbmNsdWRlICJpci5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBsb3dlcl90ZXh0dXJlX3Byb2plY3Rpb25fdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBsb3dlcl90ZXh0dXJlX3Byb2plY3Rpb25fdmlzaXRvcigpCisgICB7CisgICAgICBwcm9ncmVzcyA9IGZhbHNlOworICAgfQorCisgICBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl90ZXh0dXJlICppcik7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworaXJfdmlzaXRvcl9zdGF0dXMKK2xvd2VyX3RleHR1cmVfcHJvamVjdGlvbl92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl90ZXh0dXJlICppcikKK3sKKyAgIGlmICghaXItPnByb2plY3RvcikKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICBpcl92YXJpYWJsZSAqdmFyID0gbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGlyLT5wcm9qZWN0b3ItPnR5cGUsCisJCQkJCSAgICAgICAicHJvamVjdG9yIiwgaXJfdmFyX2F1dG8pOworICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZSh2YXIpOworICAgaXJfZGVyZWZlcmVuY2UgKmRlcmVmID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICBpcl9leHByZXNzaW9uICpleHByID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfdW5vcF9yY3AsCisJCQkJCQkgICAgaXItPnByb2plY3Rvci0+dHlwZSwKKwkJCQkJCSAgICBpci0+cHJvamVjdG9yLAorCQkJCQkJICAgIE5VTEwpOworICAgaXJfYXNzaWdubWVudCAqYXNzaWduID0gbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQoZGVyZWYsIGV4cHIsIE5VTEwpOworICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworCisgICBkZXJlZiA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgaXItPmNvb3JkaW5hdGUgPSBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl9iaW5vcF9tdWwsCisJCQkJCSAgICAgICBpci0+Y29vcmRpbmF0ZS0+dHlwZSwKKwkJCQkJICAgICAgIGlyLT5jb29yZGluYXRlLAorCQkJCQkgICAgICAgZGVyZWYpOworCisgICBpZiAoaXItPnNoYWRvd19jb21wYXJpdG9yKSB7CisgICAgICBkZXJlZiA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgICAgaXItPnNoYWRvd19jb21wYXJpdG9yID0gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbXVsLAorCQkJCQkJICBpci0+c2hhZG93X2NvbXBhcml0b3ItPnR5cGUsCisJCQkJCQkgIGlyLT5zaGFkb3dfY29tcGFyaXRvciwKKwkJCQkJCSAgZGVyZWYpOworICAgfQorCisgICBpci0+cHJvamVjdG9yID0gTlVMTDsKKworICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitib29sCitkb19sb3dlcl90ZXh0dXJlX3Byb2plY3Rpb24oZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBsb3dlcl90ZXh0dXJlX3Byb2plY3Rpb25fdmlzaXRvciB2OworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfdWJvX3JlZmVyZW5jZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3Vib19yZWZlcmVuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZTY1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3Vib19yZWZlcmVuY2UuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsb3dlcl91Ym9fcmVmZXJlbmNlLmNwcAorICoKKyAqIElSIGxvd2VyIHBhc3MgdG8gcmVwbGFjZSBkZXJlZmVyZW5jZXMgb2YgdmFyaWFibGVzIGluIGEgdW5pZm9ybQorICogYnVmZmVyIG9iamVjdCB3aXRoIHVzYWdlIG9mIGlyX2Jpbm9wX3Vib19sb2FkIGV4cHJlc3Npb25zLCBlYWNoIG9mCisgKiB3aGljaCBjYW4gcmVhZCBkYXRhIHVwIHRvIHRoZSBzaXplIG9mIGEgdmVjNC4KKyAqCisgKiBUaGlzIHJlbGlldmVzIGRyaXZlcnMgb2YgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIGRlYWwgd2l0aCB0cmlja3kgVUJPCisgKiBsYXlvdXQgaXNzdWVzIGxpa2Ugc3RkMTQwIHN0cnVjdHVyZXMgYW5kIHJvd19tYWpvciBtYXRyaWNlcyBvbgorICogdGhlaXIgb3duLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX2J1aWxkZXIuaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBpcl9idWlsZGVyOworCituYW1lc3BhY2UgeworY2xhc3MgbG93ZXJfdWJvX3JlZmVyZW5jZV92aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV9lbnRlcl92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxvd2VyX3Vib19yZWZlcmVuY2VfdmlzaXRvcihzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIpCisgICA6IHNoYWRlcihzaGFkZXIpCisgICB7CisgICB9CisKKyAgIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpOworICAgdm9pZCBlbWl0X3Vib19sb2Fkcyhpcl9kZXJlZmVyZW5jZSAqZGVyZWYsIGlyX3ZhcmlhYmxlICpiYXNlX29mZnNldCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBkZXJlZl9vZmZzZXQpOworICAgaXJfZXhwcmVzc2lvbiAqdWJvX2xvYWQoY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSwKKwkJCSAgIGlyX3J2YWx1ZSAqb2Zmc2V0KTsKKworICAgdm9pZCAqbWVtX2N0eDsKKyAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlcjsKKyAgIHN0cnVjdCBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZSAqdWJvX3ZhcjsKKyAgIHVuc2lnbmVkIHVuaWZvcm1fYmxvY2s7CisgICBib29sIHByb2dyZXNzOworfTsKKworLyoqCisgKiBEZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBibG9jayBmaWVsZAorICoKKyAqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmljIG1lbWJlciBhcyBpdCB3b3VsZCBhcHBlYXIgaW4gdGhlCisgKiBcYyBnbF91bmlmb3JtX2J1ZmZlcl92YXJpYWJsZTo6TmFtZSBmaWVsZCBpbiB0aGUgc2hhZGVyJ3MKKyAqIFxjIFVuaWZvcm1CbG9ja3MgYXJyYXkuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2ludGVyZmFjZV9maWVsZF9uYW1lKHZvaWQgKm1lbV9jdHgsIGNoYXIgKmJhc2VfbmFtZSwgaXJfZGVyZWZlcmVuY2UgKmQpCit7CisgICBpcl9jb25zdGFudCAqcHJldmlvdXNfaW5kZXggPSBOVUxMOworCisgICB3aGlsZSAoZCAhPSBOVUxMKSB7CisgICAgICBzd2l0Y2ggKGQtPmlyX3R5cGUpIHsKKyAgICAgIGNhc2UgaXJfdHlwZV9kZXJlZmVyZW5jZV92YXJpYWJsZTogeworICAgICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnYgPSAoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKikgZDsKKyAgICAgICAgIGlmIChwcmV2aW91c19pbmRleAorICAgICAgICAgICAgICYmIHYtPnZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkKKyAgICAgICAgICAgICAmJiB2LT52YXItPnR5cGUtPmlzX2FycmF5KCkpCisgICAgICAgICAgICByZXR1cm4gcmFsbG9jX2FzcHJpbnRmKG1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1slZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2luZGV4LT5nZXRfdWludF9jb21wb25lbnQoMCkpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGJhc2VfbmFtZTsKKworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgaXJfdHlwZV9kZXJlZmVyZW5jZV9yZWNvcmQ6IHsKKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqciA9IChpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKikgZDsKKworICAgICAgICAgZCA9IHItPnJlY29yZC0+YXNfZGVyZWZlcmVuY2UoKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGlyX3R5cGVfZGVyZWZlcmVuY2VfYXJyYXk6IHsKKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICphID0gKGlyX2RlcmVmZXJlbmNlX2FycmF5ICopIGQ7CisKKyAgICAgICAgIGQgPSBhLT5hcnJheS0+YXNfZGVyZWZlcmVuY2UoKTsKKyAgICAgICAgIHByZXZpb3VzX2luZGV4ID0gYS0+YXJyYXlfaW5kZXgtPmFzX2NvbnN0YW50KCk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKyAgIHJldHVybiBOVUxMOworfQorCit2b2lkCitsb3dlcl91Ym9fcmVmZXJlbmNlX3Zpc2l0b3I6OmhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKQoreworICAgaWYgKCEqcnZhbHVlKQorICAgICAgcmV0dXJuOworCisgICBpcl9kZXJlZmVyZW5jZSAqZGVyZWYgPSAoKnJ2YWx1ZSktPmFzX2RlcmVmZXJlbmNlKCk7CisgICBpZiAoIWRlcmVmKQorICAgICAgcmV0dXJuOworCisgICBpcl92YXJpYWJsZSAqdmFyID0gZGVyZWYtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIGlmICghdmFyIHx8ICF2YXItPmlzX2luX3VuaWZvcm1fYmxvY2soKSkKKyAgICAgIHJldHVybjsKKworICAgbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoKnJ2YWx1ZSk7CisKKyAgIGNvbnN0IGNoYXIgKmNvbnN0IGZpZWxkX25hbWUgPQorICAgICAgaW50ZXJmYWNlX2ZpZWxkX25hbWUobWVtX2N0eCwgKGNoYXIgKikgdmFyLT5nZXRfaW50ZXJmYWNlX3R5cGUoKS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmKTsKKworICAgdGhpcy0+dW5pZm9ybV9ibG9jayA9IC0xOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoYWRlci0+TnVtVW5pZm9ybUJsb2NrczsgaSsrKSB7CisgICAgICBpZiAoc3RyY21wKGZpZWxkX25hbWUsIHNoYWRlci0+VW5pZm9ybUJsb2Nrc1tpXS5OYW1lKSA9PSAwKSB7CisgICAgICAgICB0aGlzLT51bmlmb3JtX2Jsb2NrID0gaTsKKworICAgICAgICAgc3RydWN0IGdsX3VuaWZvcm1fYmxvY2sgKmJsb2NrID0gJnNoYWRlci0+VW5pZm9ybUJsb2Nrc1tpXTsKKworICAgICAgICAgdGhpcy0+dWJvX3ZhciA9IHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkKKyAgICAgICAgICAgID8gJmJsb2NrLT5Vbmlmb3Jtc1swXSA6ICZibG9jay0+VW5pZm9ybXNbdmFyLT5kYXRhLmxvY2F0aW9uXTsKKworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIGFzc2VydCh0aGlzLT51bmlmb3JtX2Jsb2NrICE9ICh1bnNpZ25lZCkgLTEpOworCisgICBpcl9ydmFsdWUgKm9mZnNldCA9IG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudCgwdSk7CisgICB1bnNpZ25lZCBjb25zdF9vZmZzZXQgPSAwOworICAgYm9vbCByb3dfbWFqb3IgPSB1Ym9fdmFyLT5Sb3dNYWpvcjsKKworICAgLyogQ2FsY3VsYXRlIHRoZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gb2YgdGhlIFVCTworICAgICogZGVyZWZlcmVuY2VkIGJ5ICpydmFsdWUuICBUaGlzIG1heSBiZSBhIHZhcmlhYmxlIG9mZnNldCBpZiBhbgorICAgICogYXJyYXkgZGVyZWZlcmVuY2UgaGFzIGEgdmFyaWFibGUgaW5kZXguCisgICAgKi8KKyAgIHdoaWxlIChkZXJlZikgeworICAgICAgc3dpdGNoIChkZXJlZi0+aXJfdHlwZSkgeworICAgICAgY2FzZSBpcl90eXBlX2RlcmVmZXJlbmNlX3ZhcmlhYmxlOiB7CisJIGNvbnN0X29mZnNldCArPSB1Ym9fdmFyLT5PZmZzZXQ7CisJIGRlcmVmID0gTlVMTDsKKwkgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgaXJfdHlwZV9kZXJlZmVyZW5jZV9hcnJheTogeworCSBpcl9kZXJlZmVyZW5jZV9hcnJheSAqZGVyZWZfYXJyYXkgPSAoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKilkZXJlZjsKKwkgdW5zaWduZWQgYXJyYXlfc3RyaWRlOworCSBpZiAoZGVyZWZfYXJyYXktPmFycmF5LT50eXBlLT5pc19tYXRyaXgoKSAmJiByb3dfbWFqb3IpIHsKKwkgICAgLyogV2hlbiBsb2FkaW5nIGEgdmVjdG9yIG91dCBvZiBhIHJvdyBtYWpvciBtYXRyaXgsIHRoZQorCSAgICAgKiBzdGVwIGJldHdlZW4gdGhlIGNvbHVtbnMgKHZlY3RvcnMpIGlzIHRoZSBzaXplIG9mIGEKKwkgICAgICogZmxvYXQsIHdoaWxlIHRoZSBzdGVwIGJldHdlZW4gdGhlIHJvd3MgKGVsZW1lbnRzIG9mIGEKKwkgICAgICogdmVjdG9yKSBpcyBoYW5kbGVkIGJlbG93IGluIGVtaXRfdWJvX2xvYWRzLgorCSAgICAgKi8KKwkgICAgYXJyYXlfc3RyaWRlID0gNDsKKyAgICAgICAgIH0gZWxzZSBpZiAoZGVyZWZfYXJyYXktPnR5cGUtPmlzX2ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAvKiBXZSdyZSBwcm9jZXNzaW5nIGFuIGFycmF5IGRlcmVmZXJlbmNlIG9mIGFuIGludGVyZmFjZSBpbnN0YW5jZQorCSAgICAgKiBhcnJheS4gIFRoZSB0aGluZyBiZWluZyBkZXJlZmVyZW5jZWQgKm11c3QqIGJlIGEgdmFyaWFibGUKKwkgICAgICogZGVyZWZlcmVuY2UgYmVjYXVzZSBpbnRlZmFjZXMgY2Fubm90IGJlIGVtYmVkZGVkIGFuIG90aGVyCisJICAgICAqIHR5cGVzLiAgSW4gdGVybXMgb2YgY2FsY3VsYXRpbmcgdGhlIG9mZnNldHMgZm9yIHRoZSBsb3dlcmluZworCSAgICAgKiBwYXNzLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBhcnJheSBpbmRleC4gIEFsbCBlbGVtZW50cyBvZiBhbgorCSAgICAgKiBpbnRlcmZhY2UgaW5zdGFuY2UgYXJyYXkgd2lsbCBoYXZlIHRoZSBzYW1lIG9mZnNldHMgcmVsYXRpdmUgdG8KKwkgICAgICogdGhlIGJhc2Ugb2YgdGhlIGJsb2NrIHRoYXQgYmFja3MgdGhlbS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNzZXJ0KGRlcmVmX2FycmF5LT5hcnJheS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKSk7CisgICAgICAgICAgICBkZXJlZiA9IGRlcmVmX2FycmF5LT5hcnJheS0+YXNfZGVyZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCSB9IGVsc2UgeworCSAgICBhcnJheV9zdHJpZGUgPSBkZXJlZl9hcnJheS0+dHlwZS0+c3RkMTQwX3NpemUocm93X21ham9yKTsKKwkgICAgYXJyYXlfc3RyaWRlID0gZ2xzbF9hbGlnbihhcnJheV9zdHJpZGUsIDE2KTsKKwkgfQorCisgICAgICAgICBpcl9ydmFsdWUgKmFycmF5X2luZGV4ID0gZGVyZWZfYXJyYXktPmFycmF5X2luZGV4OworICAgICAgICAgaWYgKGFycmF5X2luZGV4LT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0lOVCkKKyAgICAgICAgICAgIGFycmF5X2luZGV4ID0gaTJ1KGFycmF5X2luZGV4KTsKKworCSBpcl9jb25zdGFudCAqY29uc3RfaW5kZXggPSBhcnJheV9pbmRleC0+YXNfY29uc3RhbnQoKTsKKwkgaWYgKGNvbnN0X2luZGV4KSB7CisJICAgIGNvbnN0X29mZnNldCArPSBhcnJheV9zdHJpZGUgKiBjb25zdF9pbmRleC0+dmFsdWUudVswXTsKKwkgfSBlbHNlIHsKKwkgICAgb2Zmc2V0ID0gYWRkKG9mZnNldCwKKwkJCSBtdWwoYXJyYXlfaW5kZXgsCisJCQkgICAgIG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudChhcnJheV9zdHJpZGUpKSk7CisJIH0KKwkgZGVyZWYgPSBkZXJlZl9hcnJheS0+YXJyYXktPmFzX2RlcmVmZXJlbmNlKCk7CisJIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGlyX3R5cGVfZGVyZWZlcmVuY2VfcmVjb3JkOiB7CisJIGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqZGVyZWZfcmVjb3JkID0gKGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqKWRlcmVmOworCSBjb25zdCBnbHNsX3R5cGUgKnN0cnVjdF90eXBlID0gZGVyZWZfcmVjb3JkLT5yZWNvcmQtPnR5cGU7CisJIHVuc2lnbmVkIGludHJhX3N0cnVjdF9vZmZzZXQgPSAwOworCisJIHVuc2lnbmVkIG1heF9maWVsZF9hbGlnbiA9IDE2OworCSBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cnVjdF90eXBlLT5sZW5ndGg7IGkrKykgeworCSAgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUgPSBzdHJ1Y3RfdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS50eXBlOworCSAgICB1bnNpZ25lZCBmaWVsZF9hbGlnbiA9IHR5cGUtPnN0ZDE0MF9iYXNlX2FsaWdubWVudChyb3dfbWFqb3IpOworCSAgICBtYXhfZmllbGRfYWxpZ24gPSBNQVgyKGZpZWxkX2FsaWduLCBtYXhfZmllbGRfYWxpZ24pOworCSAgICBpbnRyYV9zdHJ1Y3Rfb2Zmc2V0ID0gZ2xzbF9hbGlnbihpbnRyYV9zdHJ1Y3Rfb2Zmc2V0LCBmaWVsZF9hbGlnbik7CisKKwkgICAgaWYgKHN0cmNtcChzdHJ1Y3RfdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXS5uYW1lLAorCQkgICAgICAgZGVyZWZfcmVjb3JkLT5maWVsZCkgPT0gMCkKKwkgICAgICAgYnJlYWs7CisJICAgIGludHJhX3N0cnVjdF9vZmZzZXQgKz0gdHlwZS0+c3RkMTQwX3NpemUocm93X21ham9yKTsKKwkgfQorCisJIGNvbnN0X29mZnNldCA9IGdsc2xfYWxpZ24oY29uc3Rfb2Zmc2V0LCBtYXhfZmllbGRfYWxpZ24pOworCSBjb25zdF9vZmZzZXQgKz0gaW50cmFfc3RydWN0X29mZnNldDsKKworCSBkZXJlZiA9IGRlcmVmX3JlY29yZC0+cmVjb3JkLT5hc19kZXJlZmVyZW5jZSgpOworCSBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisJIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisJIGRlcmVmID0gTlVMTDsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIC8qIE5vdyB0aGF0IHdlJ3ZlIGNhbGN1bGF0ZWQgdGhlIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlCisgICAgKiBkZXJlZmVyZW5jZSwgd2FsayBvdmVyIHRoZSB0eXBlIGFuZCBlbWl0IGxvYWRzIGludG8gYSB0ZW1wb3JhcnkuCisgICAgKi8KKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9ICgqcnZhbHVlKS0+dHlwZTsKKyAgIGlyX3ZhcmlhYmxlICpsb2FkX3ZhciA9IG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZSh0eXBlLAorCQkJCQkJICAgICJ1Ym9fbG9hZF90ZW1wIiwKKwkJCQkJCSAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUobG9hZF92YXIpOworCisgICBpcl92YXJpYWJsZSAqbG9hZF9vZmZzZXQgPSBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjp1aW50X3R5cGUsCisJCQkJCQkgICAgICAgInVib19sb2FkX3RlbXBfb2Zmc2V0IiwKKwkJCQkJCSAgICAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUobG9hZF9vZmZzZXQpOworICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24obG9hZF9vZmZzZXQsIG9mZnNldCkpOworCisgICBkZXJlZiA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShsb2FkX3Zhcik7CisgICBlbWl0X3Vib19sb2FkcyhkZXJlZiwgbG9hZF9vZmZzZXQsIGNvbnN0X29mZnNldCk7CisgICAqcnZhbHVlID0gZGVyZWY7CisKKyAgIHByb2dyZXNzID0gdHJ1ZTsKK30KKworaXJfZXhwcmVzc2lvbiAqCitsb3dlcl91Ym9fcmVmZXJlbmNlX3Zpc2l0b3I6OnVib19sb2FkKGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKwkJCQkgICAgICBpcl9ydmFsdWUgKm9mZnNldCkKK3sKKyAgIHJldHVybiBuZXcobWVtX2N0eCkKKyAgICAgIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfdWJvX2xvYWQsCisJCSAgICB0eXBlLAorCQkgICAgbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KHRoaXMtPnVuaWZvcm1fYmxvY2spLAorCQkgICAgb2Zmc2V0KTsKKworfQorCisvKioKKyAqIFRha2VzIExIUyBhbmQgZW1pdHMgYSBzZXJpZXMgb2YgYXNzaWdubWVudHMgaW50byBpdHMgY29tcG9uZW50cworICogZnJvbSB0aGUgVUJPIHZhcmlhYmxlIGF0IHZhcmlhYmxlX29mZnNldCArIGRlcmVmX29mZnNldC4KKyAqCisgKiBSZWN1cnNpdmVseSBjYWxscyBpdHNlbGYgdG8gYnJlYWsgdGhlIGRlcmVmIGRvd24gdG8gdGhlIHBvaW50IHRoYXQKKyAqIHRoZSBpcl9iaW5vcF91Ym9fbG9hZCBleHByZXNzaW9ucyBnZW5lcmF0ZWQgYXJlIGNvbnRpZ3VvdXMgc2NhbGFycworICogb3IgdmVjdG9ycy4KKyAqLwordm9pZAorbG93ZXJfdWJvX3JlZmVyZW5jZV92aXNpdG9yOjplbWl0X3Vib19sb2Fkcyhpcl9kZXJlZmVyZW5jZSAqZGVyZWYsCisJCQkJCSAgICBpcl92YXJpYWJsZSAqYmFzZV9vZmZzZXQsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZGVyZWZfb2Zmc2V0KQoreworICAgaWYgKGRlcmVmLT50eXBlLT5pc19yZWNvcmQoKSkgeworICAgICAgdW5zaWduZWQgaW50IGZpZWxkX29mZnNldCA9IDA7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXJlZi0+dHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgY29uc3Qgc3RydWN0IGdsc2xfc3RydWN0X2ZpZWxkICpmaWVsZCA9CisJICAgICZkZXJlZi0+dHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXTsKKwkgaXJfZGVyZWZlcmVuY2UgKmZpZWxkX2RlcmVmID0KKwkgICAgbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3JlY29yZChkZXJlZi0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJCSAgICAgICBmaWVsZC0+bmFtZSk7CisKKwkgZmllbGRfb2Zmc2V0ID0KKwkgICAgZ2xzbF9hbGlnbihmaWVsZF9vZmZzZXQsCisJCSAgICAgICBmaWVsZC0+dHlwZS0+c3RkMTQwX2Jhc2VfYWxpZ25tZW50KHVib192YXItPlJvd01ham9yKSk7CisKKwkgZW1pdF91Ym9fbG9hZHMoZmllbGRfZGVyZWYsIGJhc2Vfb2Zmc2V0LCBkZXJlZl9vZmZzZXQgKyBmaWVsZF9vZmZzZXQpOworCisJIGZpZWxkX29mZnNldCArPSBmaWVsZC0+dHlwZS0+c3RkMTQwX3NpemUodWJvX3Zhci0+Um93TWFqb3IpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoZGVyZWYtPnR5cGUtPmlzX2FycmF5KCkpIHsKKyAgICAgIHVuc2lnbmVkIGFycmF5X3N0cmlkZSA9CisJIGdsc2xfYWxpZ24oZGVyZWYtPnR5cGUtPmZpZWxkcy5hcnJheS0+c3RkMTQwX3NpemUodWJvX3Zhci0+Um93TWFqb3IpLAorCQkgICAgMTYpOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVyZWYtPnR5cGUtPmxlbmd0aDsgaSsrKSB7CisJIGlyX2NvbnN0YW50ICplbGVtZW50ID0gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGkpOworCSBpcl9kZXJlZmVyZW5jZSAqZWxlbWVudF9kZXJlZiA9CisJICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheShkZXJlZi0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJCSAgICAgIGVsZW1lbnQpOworCSBlbWl0X3Vib19sb2FkcyhlbGVtZW50X2RlcmVmLCBiYXNlX29mZnNldCwKKwkJCWRlcmVmX29mZnNldCArIGkgKiBhcnJheV9zdHJpZGUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoZGVyZWYtPnR5cGUtPmlzX21hdHJpeCgpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVyZWYtPnR5cGUtPm1hdHJpeF9jb2x1bW5zOyBpKyspIHsKKwkgaXJfY29uc3RhbnQgKmNvbCA9IG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudChpKTsKKwkgaXJfZGVyZWZlcmVuY2UgKmNvbF9kZXJlZiA9CisJICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV9hcnJheShkZXJlZi0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJCSAgICAgIGNvbCk7CisKKwkgLyogc3RkMTQwIGFsd2F5cyByb3VuZHMgdGhlIHN0cmlkZSBvZiBhcnJheXMgKGFuZCBtYXRyaWNlcykKKwkgICogdG8gYSB2ZWM0LCBzbyBtYXRyaWNlcyBhcmUgYWx3YXlzIDE2IGJldHdlZW4gY29sdW1ucy9yb3dzLgorCSAgKi8KKwkgZW1pdF91Ym9fbG9hZHMoY29sX2RlcmVmLCBiYXNlX29mZnNldCwgZGVyZWZfb2Zmc2V0ICsgaSAqIDE2KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgYXNzZXJ0KGRlcmVmLT50eXBlLT5pc19zY2FsYXIoKSB8fAorCSAgZGVyZWYtPnR5cGUtPmlzX3ZlY3RvcigpKTsKKworICAgaWYgKCF1Ym9fdmFyLT5Sb3dNYWpvcikgeworICAgICAgaXJfcnZhbHVlICpvZmZzZXQgPSBhZGQoYmFzZV9vZmZzZXQsCisJCQkgICAgICBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoZGVyZWZfb2Zmc2V0KSk7CisgICAgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGFzc2lnbihkZXJlZi0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJICAgIHVib19sb2FkKGRlcmVmLT50eXBlLCBvZmZzZXQpKSk7CisgICB9IGVsc2UgeworICAgICAgLyogV2UncmUgZGVyZWZmaW5nIGEgY29sdW1uIG91dCBvZiBhIHJvdy1tYWpvciBtYXRyaXgsIHNvIHdlCisgICAgICAgKiBnYXRoZXIgdGhlIHZlY3RvciBmcm9tIGVhY2ggc3RvcmVkIHJvdy4KKyAgICAgICovCisgICAgICBhc3NlcnQoZGVyZWYtPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfRkxPQVQpOworICAgICAgLyogTWF0cmljZXMsIHJvd19tYWpvciBvciBub3QsIGFyZSBzdG9yZWQgYXMgaWYgdGhleSB3ZXJlCisgICAgICAgKiBhcnJheXMgb2YgdmVjdG9ycyBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBpbiBzdGQxNDAuCisgICAgICAgKiBBcnJheXMgaGF2ZSB0aGVpciBzdHJpZGVzIHJvdW5kZWQgdXAgdG8gYSB2ZWM0LCBzbyB0aGUKKyAgICAgICAqIG1hdHJpeCBzdHJpZGUgaXMgYWx3YXlzIDE2LgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBtYXRyaXhfc3RyaWRlID0gMTY7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXJlZi0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKwkgaXJfcnZhbHVlICpjaGFuX29mZnNldCA9CisJICAgIGFkZChiYXNlX29mZnNldCwKKwkJbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGRlcmVmX29mZnNldCArIGkgKiBtYXRyaXhfc3RyaWRlKSk7CisKKwkgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24oZGVyZWYtPmNsb25lKG1lbV9jdHgsIE5VTEwpLAorCQkJCSAgICAgICB1Ym9fbG9hZChnbHNsX3R5cGU6OmZsb2F0X3R5cGUsCisJCQkJCQljaGFuX29mZnNldCksCisJCQkJICAgICAgICgxVSA8PCBpKSkpOworICAgICAgfQorICAgfQorfQorCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKK3ZvaWQKK2xvd2VyX3Vib19yZWZlcmVuY2Uoc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyLCBleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGxvd2VyX3Vib19yZWZlcmVuY2VfdmlzaXRvciB2KHNoYWRlcik7CisKKyAgIC8qIExvb3Agb3ZlciB0aGUgaW5zdHJ1Y3Rpb25zIGxvd2VyaW5nIHJlZmVyZW5jZXMsIGJlY2F1c2Ugd2UgdGFrZQorICAgICogYSBkZXJlZiBvZiBhIFVCTyBhcnJheSB1c2luZyBhIFVCTyBkZXJlZmVyZW5jZSBhcyB0aGUgaW5kZXggd2lsbAorICAgICogcHJvZHVjZSBhIGNvbGxlY3Rpb24gb2YgaW5zdHJ1Y3Rpb25zIGFsbCBvZiB3aGljaCBoYXZlIGNsb25lZAorICAgICogVUJPIGRlcmVmZXJlbmNlcyBmb3IgdGhhdCBhcnJheSBpbmRleC4KKyAgICAqLworICAgZG8geworICAgICAgdi5wcm9ncmVzcyA9IGZhbHNlOworICAgICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKyAgIH0gd2hpbGUgKHYucHJvZ3Jlc3MpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl92YXJpYWJsZV9pbmRleF90b19jb25kX2Fzc2lnbi5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3ZhcmlhYmxlX2luZGV4X3RvX2NvbmRfYXNzaWduLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDBkMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl92YXJpYWJsZV9pbmRleF90b19jb25kX2Fzc2lnbi5jcHAKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBMdWNhIEJhcmJpZXJpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgbG93ZXJfdmFyaWFibGVfaW5kZXhfdG9fY29uZF9hc3NpZ24uY3BwCisgKgorICogVHVybnMgbm9uLWNvbnN0YW50IGluZGV4aW5nIGludG8gYXJyYXkgdHlwZXMgdG8gYSBzZXJpZXMgb2YKKyAqIGNvbmRpdGlvbmFsIG1vdmVzIG9mIGVhY2ggZWxlbWVudCBpbnRvIGEgdGVtcG9yYXJ5LgorICoKKyAqIFByZS1EWDEwIEdQVXMgb2Z0ZW4gZG9uJ3QgaGF2ZSBhIG5hdGl2ZSB3YXkgdG8gZG8gdGhpcyBvcGVyYXRpb24sCisgKiBhbmQgdGhpcyB3b3JrcyBhcm91bmQgdGhhdC4KKyAqCisgKiBUaGUgbG93ZXJpbmcgcHJvY2VzcyBwcm9jZWVkcyBhcyBmb2xsb3dzLiAgRWFjaCBub24tY29uc3RhbnQgaW5kZXgKKyAqIGZvdW5kIGluIGFuIHItdmFsdWUgaXMgY29udmVydGVkIHRvIGEgY2Fub25pY2FsIGZvcm0gXGMgYXJyYXlbaV0uICBFYWNoCisgKiBlbGVtZW50IG9mIHRoZSBhcnJheSBpcyBjb25kaXRpb25hbGx5IGFzc2lnbmVkIHRvIGEgdGVtcG9yYXJ5IGJ5IGNvbXBhcmluZworICogXGMgaSB0byBhIGNvbnN0YW50IGluZGV4LiAgVGhpcyBpcyBkb25lIGJ5IGNsb25pbmcgdGhlIGNhbm9uaWNhbCBmb3JtIGFuZAorICogcmVwbGFjaW5nIGFsbCBvY2N1cnJlbmNlcyBvZiBcYyBpIHdpdGggYSBjb25zdGFudC4gIEVhY2ggcmVtYWluaW5nIG9jY3VycmVuY2UKKyAqIG9mIHRoZSBjYW5vbmljYWwgZm9ybSBpbiB0aGUgSVIgaXMgcmVwbGFjZWQgd2l0aCBhIGRlcmVmZXJlbmNlIG9mIHRoZQorICogdGVtcG9yYXJ5IHZhcmlhYmxlLgorICoKKyAqIEwtdmFsdWVzIHdpdGggbm9uLWNvbnN0YW50IGluZGljZXMgYXJlIGhhbmRsZWQgc2ltaWxhcmx5LiAgSW4gdGhpcyBjYXNlLAorICogdGhlIFJIUyBvZiB0aGUgYXNzaWdubWVudCBpcyBhc3NpZ25lZCB0byBhIHRlbXBvcmFyeS4gIFRoZSBub24tY29uc3RhbnQKKyAqIGluZGV4IGlzIHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIGZvcm0gKGp1c3QgbGlrZSBmb3Igci12YWx1ZXMpLiAgVGhlCisgKiB0ZW1wb3JhcnkgaXMgY29uZGl0aW9uYWxseSBhc3NpZ25lZCB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIGNhbm9uaWNhbCBmb3JtCisgKiBieSBjb21wYXJpbmcgXGMgaSB3aXRoIGVhY2ggaW5kZXguICBUaGUgc2FtZSBjbG9uZS1hbmQtcmVwbGFjZSBzY2hlbWUgaXMKKyAqIHVzZWQuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfcnZhbHVlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbXBhcmlzb24gdmFsdWUgZm9yIGEgYmxvY2sgb2YgaW5kaWNlcworICoKKyAqIExvd2VyaW5nIHBhc3NlcyBmb3Igbm9uLWNvbnN0YW50IGluZGV4aW5nIG9mIGFycmF5cywgbWF0cmljZXMsIG9yIHZlY3RvcnMKKyAqIGNhbiB1c2UgdGhpcyB0byBnZW5lcmF0ZSBibG9ja3Mgb2YgaW5kZXggY29tcGFyaXNvbiB2YWx1ZXMuCisgKgorICogXHBhcmFtIGluc3RydWN0aW9ucyAgTGlzdCB3aGVyZSBuZXcgaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgYXBwZW5kZWQKKyAqIFxwYXJhbSBpbmRleCAgICAgICAgIFxjIGlyX3ZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgaW5kZXgKKyAqIFxwYXJhbSBiYXNlICAgICAgICAgIEJhc2UgdmFsdWUgZm9yIHRoaXMgYmxvY2sgb2YgY29tcGFyaXNvbnMKKyAqIFxwYXJhbSBjb21wb25lbnRzICAgIE51bWJlciBvZiB1bmlxdWUgaW5kZXggdmFsdWVzIHRvIGNvbXBhcmUuICBUaGlzIG11c3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIG9uIHRoZSByYW5nZSBbMSwgNF0uCisgKiBccGFyYW0gbWVtX2N0eCAgICAgICByYWxsb2MgbWVtb3J5IGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgYWxsIGFsbG9jYXRpb25zLgorICoKKyAqIFxyZXR1cm5zCisgKiBBbiBcYyBpcl9ydmFsdWUgdGhhdCBcYiBtdXN0IGJlIGNsb25lZCBmb3IgZWFjaCB1c2UgaW4gY29uZGl0aW9uYWwKKyAqIGFzc2lnbm1lbnRzLCBldGMuCisgKi8KK2lyX3J2YWx1ZSAqCitjb21wYXJlX2luZGV4X2Jsb2NrKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBpcl92YXJpYWJsZSAqaW5kZXgsCisJCSAgICB1bnNpZ25lZCBiYXNlLCB1bnNpZ25lZCBjb21wb25lbnRzLCB2b2lkICptZW1fY3R4KQoreworICAgaXJfcnZhbHVlICpicm9hZGNhc3RfaW5kZXggPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoaW5kZXgpOworCisgICBhc3NlcnQoaW5kZXgtPnR5cGUtPmlzX3NjYWxhcigpKTsKKyAgIGFzc2VydChpbmRleC0+dHlwZS0+YmFzZV90eXBlID09IEdMU0xfVFlQRV9JTlQpOworICAgYXNzZXJ0KGNvbXBvbmVudHMgPj0gMSAmJiBjb21wb25lbnRzIDw9IDQpOworCisgICBpZiAoY29tcG9uZW50cyA+IDEpIHsKKyAgICAgIGNvbnN0IGlyX3N3aXp6bGVfbWFzayBtID0geyAwLCAwLCAwLCAwLCBjb21wb25lbnRzLCBmYWxzZSB9OworICAgICAgYnJvYWRjYXN0X2luZGV4ID0gbmV3KG1lbV9jdHgpIGlyX3N3aXp6bGUoYnJvYWRjYXN0X2luZGV4LCBtKTsKKyAgIH0KKworICAgLyogQ29tcGFyZSB0aGUgZGVzaXJlZCBpbmRleCB2YWx1ZSB3aXRoIHRoZSBuZXh0IGJsb2NrIG9mIGZvdXIgaW5kaWNlcy4KKyAgICAqLworICAgaXJfY29uc3RhbnRfZGF0YSB0ZXN0X2luZGljZXNfZGF0YTsKKyAgIG1lbXNldCgmdGVzdF9pbmRpY2VzX2RhdGEsIDAsIHNpemVvZih0ZXN0X2luZGljZXNfZGF0YSkpOworICAgdGVzdF9pbmRpY2VzX2RhdGEuaVswXSA9IGJhc2U7CisgICB0ZXN0X2luZGljZXNfZGF0YS5pWzFdID0gYmFzZSArIDE7CisgICB0ZXN0X2luZGljZXNfZGF0YS5pWzJdID0gYmFzZSArIDI7CisgICB0ZXN0X2luZGljZXNfZGF0YS5pWzNdID0gYmFzZSArIDM7CisKKyAgIGlyX2NvbnN0YW50ICpjb25zdCB0ZXN0X2luZGljZXMgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGJyb2FkY2FzdF9pbmRleC0+dHlwZSwKKwkJCSAgICAgICAmdGVzdF9pbmRpY2VzX2RhdGEpOworCisgICBpcl9ydmFsdWUgKmNvbnN0IGNvbmRpdGlvbl92YWwgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfZXF1YWwsCisJCQkJIGdsc2xfdHlwZTo6YnZlYyhjb21wb25lbnRzKSwKKwkJCQkgYnJvYWRjYXN0X2luZGV4LAorCQkJCSB0ZXN0X2luZGljZXMpOworCisgICBpcl92YXJpYWJsZSAqY29uc3QgY29uZGl0aW9uID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShjb25kaXRpb25fdmFsLT50eXBlLAorCQkJICAgICAgICJkZXJlZmVyZW5jZV9jb25kaXRpb24iLAorCQkJICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwoY29uZGl0aW9uKTsKKworICAgaXJfcnZhbHVlICpjb25zdCBjb25kX2RlcmVmID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShjb25kaXRpb24pOworICAgaW5zdHJ1Y3Rpb25zLT5wdXNoX3RhaWwobmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQoY29uZF9kZXJlZiwgY29uZGl0aW9uX3ZhbCwgMCkpOworCisgICByZXR1cm4gY29uZF9kZXJlZjsKK30KKworc3RhdGljIGlubGluZSBib29sCitpc19hcnJheV9vcl9tYXRyaXgoY29uc3QgaXJfcnZhbHVlICppcikKK3sKKyAgIHJldHVybiAoaXItPnR5cGUtPmlzX2FycmF5KCkgfHwgaXItPnR5cGUtPmlzX21hdHJpeCgpKTsKK30KKworbmFtZXNwYWNlIHsKKy8qKgorICogUmVwbGFjZSBhIGRlcmVmZXJlbmNlIG9mIGEgdmFyaWFibGUgd2l0aCBhIHNwZWNpZmllZCByLXZhbHVlCisgKgorICogRWFjaCB0aW1lIGEgZGVyZWZlcmVuY2Ugb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyByZXBsYWNlZCwgdGhlIHItdmFsdWUKKyAqIHRyZWUgaXMgY2xvbmVkLgorICovCitjbGFzcyBkZXJlZl9yZXBsYWNlciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICBkZXJlZl9yZXBsYWNlcihjb25zdCBpcl92YXJpYWJsZSAqdmFyaWFibGVfdG9fcmVwbGFjZSwgaXJfcnZhbHVlICp2YWx1ZSkKKyAgICAgIDogdmFyaWFibGVfdG9fcmVwbGFjZSh2YXJpYWJsZV90b19yZXBsYWNlKSwgdmFsdWUodmFsdWUpLAorCXByb2dyZXNzKGZhbHNlKQorICAgeworICAgICAgYXNzZXJ0KHRoaXMtPnZhcmlhYmxlX3RvX3JlcGxhY2UgIT0gTlVMTCk7CisgICAgICBhc3NlcnQodGhpcy0+dmFsdWUgIT0gTlVMTCk7CisgICB9CisKKyAgIHZpcnR1YWwgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSkKKyAgIHsKKyAgICAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpjb25zdCBkdiA9ICgqcnZhbHVlKS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKworICAgICAgaWYgKChkdiAhPSBOVUxMKSAmJiAoZHYtPnZhciA9PSB0aGlzLT52YXJpYWJsZV90b19yZXBsYWNlKSkgeworCSB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisJICpydmFsdWUgPSB0aGlzLT52YWx1ZS0+Y2xvbmUocmFsbG9jX3BhcmVudCgqcnZhbHVlKSwgTlVMTCk7CisgICAgICB9CisgICB9CisKKyAgIGNvbnN0IGlyX3ZhcmlhYmxlICp2YXJpYWJsZV90b19yZXBsYWNlOworICAgaXJfcnZhbHVlICp2YWx1ZTsKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCisvKioKKyAqIEZpbmQgYSB2YXJpYWJsZSBpbmRleCBkZXJlZmVyZW5jZSBvZiBhbiBhcnJheSBpbiBhbiBydmFsdWUgdHJlZQorICovCitjbGFzcyBmaW5kX3ZhcmlhYmxlX2luZGV4IDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGZpbmRfdmFyaWFibGVfaW5kZXgoKQorICAgICAgOiBkZXJlZihOVUxMKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9hcnJheSAqaXIpCisgICB7CisgICAgICBpZiAoaXNfYXJyYXlfb3JfbWF0cml4KGlyLT5hcnJheSkKKwkgICYmIChpci0+YXJyYXlfaW5kZXgtPmFzX2NvbnN0YW50KCkgPT0gTlVMTCkpIHsKKwkgdGhpcy0+ZGVyZWYgPSBpcjsKKwkgcmV0dXJuIHZpc2l0X3N0b3A7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgLyoqCisgICAgKiBGaXJzdCBhcnJheSBkZXJlZmVyZW5jZSBmb3VuZCBpbiB0aGUgdHJlZSB0aGF0IGhhcyBhIG5vbi1jb25zdGFudCBpbmRleC4KKyAgICAqLworICAgaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmRlcmVmOworfTsKKworc3RydWN0IGFzc2lnbm1lbnRfZ2VuZXJhdG9yCit7CisgICBpcl9pbnN0cnVjdGlvbiogYmFzZV9pcjsKKyAgIGlyX2RlcmVmZXJlbmNlICpydmFsdWU7CisgICBpcl92YXJpYWJsZSAqb2xkX2luZGV4OworICAgYm9vbCBpc193cml0ZTsKKyAgIHVuc2lnbmVkIGludCB3cml0ZV9tYXNrOworICAgaXJfdmFyaWFibGUqIHZhcjsKKworICAgYXNzaWdubWVudF9nZW5lcmF0b3IoKQorICAgICAgOiBiYXNlX2lyKE5VTEwpLAorICAgICAgICBydmFsdWUoTlVMTCksCisgICAgICAgIG9sZF9pbmRleChOVUxMKSwKKyAgICAgICAgaXNfd3JpdGUoZmFsc2UpLAorICAgICAgICB3cml0ZV9tYXNrKDApLAorICAgICAgICB2YXIoTlVMTCkKKyAgIHsKKyAgIH0KKworICAgdm9pZCBnZW5lcmF0ZSh1bnNpZ25lZCBpLCBpcl9ydmFsdWUqIGNvbmRpdGlvbiwgZXhlY19saXN0ICpsaXN0KSBjb25zdAorICAgeworICAgICAgLyogSnVzdCBjbG9uZSB0aGUgcmVzdCBvZiB0aGUgZGVyZWYgY2hhaW4gd2hlbiB0cnlpbmcgdG8gZ2V0IGF0IHRoZQorICAgICAgICogdW5kZXJseWluZyB2YXJpYWJsZS4KKyAgICAgICAqLworICAgICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoYmFzZV9pcik7CisKKyAgICAgIC8qIENsb25lIHRoZSBvbGQgci12YWx1ZSBpbiBpdHMgZW50aXJldHkuICBUaGVuIHJlcGxhY2UgYW55IG9jY3VycmVuY2VzIG9mCisgICAgICAgKiB0aGUgb2xkIHZhcmlhYmxlIGluZGV4IHdpdGggdGhlIG5ldyBjb25zdGFudCBpbmRleC4KKyAgICAgICAqLworICAgICAgaXJfZGVyZWZlcmVuY2UgKmVsZW1lbnQgPSB0aGlzLT5ydmFsdWUtPmNsb25lKG1lbV9jdHgsIE5VTEwpOworICAgICAgaXJfY29uc3RhbnQgKmNvbnN0IGluZGV4ID0gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGkpOworICAgICAgZGVyZWZfcmVwbGFjZXIgcih0aGlzLT5vbGRfaW5kZXgsIGluZGV4KTsKKyAgICAgIGVsZW1lbnQtPmFjY2VwdCgmcik7CisgICAgICBhc3NlcnQoci5wcm9ncmVzcyk7CisKKyAgICAgIC8qIEdlbmVyYXRlIGEgY29uZGl0aW9uYWwgYXNzaWdubWVudCB0byAob3IgZnJvbSkgdGhlIGNvbnN0YW50IGluZGV4ZWQKKyAgICAgICAqIGFycmF5IGRlcmVmZXJlbmNlLgorICAgICAgICovCisgICAgICBpcl9ydmFsdWUgKnZhcmlhYmxlID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRoaXMtPnZhcik7CisgICAgICBpcl9hc3NpZ25tZW50ICpjb25zdCBhc3NpZ25tZW50ID0gKGlzX3dyaXRlKQorCSA/IG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KGVsZW1lbnQsIHZhcmlhYmxlLCBjb25kaXRpb24sIHdyaXRlX21hc2spCisJIDogbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQodmFyaWFibGUsIGVsZW1lbnQsIGNvbmRpdGlvbik7CisKKyAgICAgIGxpc3QtPnB1c2hfdGFpbChhc3NpZ25tZW50KTsKKyAgIH0KK307CisKK3N0cnVjdCBzd2l0Y2hfZ2VuZXJhdG9yCit7CisgICAvKiBtYWtlIFRGdW5jdGlvbiBhIHRlbXBsYXRlIHBhcmFtZXRlciBpZiB5b3UgbmVlZCB0byB1c2Ugb3RoZXIgZ2VuZXJhdG9ycyAqLworICAgdHlwZWRlZiBhc3NpZ25tZW50X2dlbmVyYXRvciBURnVuY3Rpb247CisgICBjb25zdCBURnVuY3Rpb24mIGdlbmVyYXRvcjsKKworICAgaXJfdmFyaWFibGUqIGluZGV4OworICAgdW5zaWduZWQgbGluZWFyX3NlcXVlbmNlX21heF9sZW5ndGg7CisgICB1bnNpZ25lZCBjb25kaXRpb25fY29tcG9uZW50czsKKworICAgdm9pZCAqbWVtX2N0eDsKKworICAgc3dpdGNoX2dlbmVyYXRvcihjb25zdCBURnVuY3Rpb24mIGdlbmVyYXRvciwgaXJfdmFyaWFibGUgKmluZGV4LAorCQkgICAgdW5zaWduZWQgbGluZWFyX3NlcXVlbmNlX21heF9sZW5ndGgsCisJCSAgICB1bnNpZ25lZCBjb25kaXRpb25fY29tcG9uZW50cykKKyAgICAgIDogZ2VuZXJhdG9yKGdlbmVyYXRvciksIGluZGV4KGluZGV4KSwKKwlsaW5lYXJfc2VxdWVuY2VfbWF4X2xlbmd0aChsaW5lYXJfc2VxdWVuY2VfbWF4X2xlbmd0aCksCisJY29uZGl0aW9uX2NvbXBvbmVudHMoY29uZGl0aW9uX2NvbXBvbmVudHMpCisgICB7CisgICAgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX3BhcmVudChpbmRleCk7CisgICB9CisKKyAgIHZvaWQgbGluZWFyX3NlcXVlbmNlKHVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBlbmQsIGV4ZWNfbGlzdCAqbGlzdCkKKyAgIHsKKyAgICAgIGlmIChiZWdpbiA9PSBlbmQpCisgICAgICAgICByZXR1cm47CisKKyAgICAgIC8qIElmIHRoZSBhcnJheSBhY2Nlc3MgaXMgYSByZWFkLCByZWFkIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgc3VicmVnaW9uCisgICAgICAgKiB1bmNvbmRpdGlvbmFsbHkuICBUaGUgcmVtYWluaW5nIHRlc3RzIHdpbGwgcG9zc2libHkgb3ZlcndyaXRlIHRoaXMKKyAgICAgICAqIHZhbHVlIHdpdGggb25lIG9mIHRoZSBvdGhlciBhcnJheSBlbGVtZW50cy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIG9wdGltaXphdGlvbiBjYW5ub3QgYmUgZG9uZSBmb3Igd3JpdGVzIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSB0aGUKKyAgICAgICAqIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN1YnJlZ2lvbiB0byBiZSB3cml0dGVuIHBvc3NpYmx5ICppbiBhZGRpdGlvbiogdG8KKyAgICAgICAqIG9uZSBvZiB0aGUgb3RoZXIgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGZpcnN0OworICAgICAgaWYgKCF0aGlzLT5nZW5lcmF0b3IuaXNfd3JpdGUpIHsKKwkgdGhpcy0+Z2VuZXJhdG9yLmdlbmVyYXRlKGJlZ2luLCAwLCBsaXN0KTsKKwkgZmlyc3QgPSBiZWdpbiArIDE7CisgICAgICB9IGVsc2UgeworCSBmaXJzdCA9IGJlZ2luOworICAgICAgfQorCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBmaXJzdDsgaSA8IGVuZDsgaSArPSA0KSB7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBjb21wcyA9IE1JTjIoY29uZGl0aW9uX2NvbXBvbmVudHMsIGVuZCAtIGkpOworCisJIGlyX3J2YWx1ZSAqY29uc3QgY29uZF9kZXJlZiA9CisJICAgIGNvbXBhcmVfaW5kZXhfYmxvY2sobGlzdCwgaW5kZXgsIGksIGNvbXBzLCB0aGlzLT5tZW1fY3R4KTsKKworICAgICAgICAgaWYgKGNvbXBzID09IDEpIHsKKyAgICAgICAgICAgIHRoaXMtPmdlbmVyYXRvci5nZW5lcmF0ZShpLCBjb25kX2RlcmVmLT5jbG9uZSh0aGlzLT5tZW1fY3R4LCBOVUxMKSwKKwkJCQkgICAgIGxpc3QpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBjb21wczsgaisrKSB7CisJICAgICAgIGlyX3J2YWx1ZSAqY29uc3QgY29uZF9zd2l6ID0KKwkJICBuZXcodGhpcy0+bWVtX2N0eCkgaXJfc3dpenpsZShjb25kX2RlcmVmLT5jbG9uZSh0aGlzLT5tZW1fY3R4LCBOVUxMKSwKKwkJCQkJCWosIDAsIDAsIDAsIDEpOworCisgICAgICAgICAgICAgICB0aGlzLT5nZW5lcmF0b3IuZ2VuZXJhdGUoaSArIGosIGNvbmRfc3dpeiwgbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHZvaWQgYmlzZWN0KHVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBlbmQsIGV4ZWNfbGlzdCAqbGlzdCkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIG1pZGRsZSA9IChiZWdpbiArIGVuZCkgPj4gMTsKKworICAgICAgYXNzZXJ0KGluZGV4LT50eXBlLT5pc19pbnRlZ2VyKCkpOworCisgICAgICBpcl9jb25zdGFudCAqY29uc3QgbWlkZGxlX2MgPSAoaW5kZXgtPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfVUlOVCkKKwkgPyBuZXcodGhpcy0+bWVtX2N0eCkgaXJfY29uc3RhbnQoKHVuc2lnbmVkKW1pZGRsZSkKKyAgICAgICAgIDogbmV3KHRoaXMtPm1lbV9jdHgpIGlyX2NvbnN0YW50KChpbnQpbWlkZGxlKTsKKworCisgICAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWYgPQorCSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGhpcy0+aW5kZXgpOworCisgICAgICBpcl9leHByZXNzaW9uICpsZXNzID0KKwkgbmV3KHRoaXMtPm1lbV9jdHgpIGlyX2V4cHJlc3Npb24oaXJfYmlub3BfbGVzcywgZ2xzbF90eXBlOjpib29sX3R5cGUsCisJCQkJCSAgZGVyZWYsIG1pZGRsZV9jKTsKKworICAgICAgaXJfaWYgKmlmX2xlc3MgPSBuZXcodGhpcy0+bWVtX2N0eCkgaXJfaWYobGVzcyk7CisKKyAgICAgIGdlbmVyYXRlKGJlZ2luLCBtaWRkbGUsICZpZl9sZXNzLT50aGVuX2luc3RydWN0aW9ucyk7CisgICAgICBnZW5lcmF0ZShtaWRkbGUsIGVuZCwgJmlmX2xlc3MtPmVsc2VfaW5zdHJ1Y3Rpb25zKTsKKworICAgICAgbGlzdC0+cHVzaF90YWlsKGlmX2xlc3MpOworICAgfQorCisgICB2b2lkIGdlbmVyYXRlKHVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBlbmQsIGV4ZWNfbGlzdCAqbGlzdCkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGVuZCAtIGJlZ2luOworICAgICAgaWYgKGxlbmd0aCA8PSB0aGlzLT5saW5lYXJfc2VxdWVuY2VfbWF4X2xlbmd0aCkKKyAgICAgICAgIHJldHVybiBsaW5lYXJfc2VxdWVuY2UoYmVnaW4sIGVuZCwgbGlzdCk7CisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gYmlzZWN0KGJlZ2luLCBlbmQsIGxpc3QpOworICAgfQorfTsKKworLyoqCisgKiBWaXNpdG9yIGNsYXNzIGZvciByZXBsYWNpbmcgZXhwcmVzc2lvbnMgd2l0aCBpcl9jb25zdGFudCB2YWx1ZXMuCisgKi8KKworY2xhc3MgdmFyaWFibGVfaW5kZXhfdG9fY29uZF9hc3NpZ25fdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICB2YXJpYWJsZV9pbmRleF90b19jb25kX2Fzc2lnbl92aXNpdG9yKGJvb2wgbG93ZXJfaW5wdXQsCisJCQkJCSBib29sIGxvd2VyX291dHB1dCwKKwkJCQkJIGJvb2wgbG93ZXJfdGVtcCwKKwkJCQkJIGJvb2wgbG93ZXJfdW5pZm9ybSkKKyAgIHsKKyAgICAgIHRoaXMtPnByb2dyZXNzID0gZmFsc2U7CisgICAgICB0aGlzLT5sb3dlcl9pbnB1dHMgPSBsb3dlcl9pbnB1dDsKKyAgICAgIHRoaXMtPmxvd2VyX291dHB1dHMgPSBsb3dlcl9vdXRwdXQ7CisgICAgICB0aGlzLT5sb3dlcl90ZW1wcyA9IGxvd2VyX3RlbXA7CisgICAgICB0aGlzLT5sb3dlcl91bmlmb3JtcyA9IGxvd2VyX3VuaWZvcm07CisgICB9CisKKyAgIGJvb2wgcHJvZ3Jlc3M7CisgICBib29sIGxvd2VyX2lucHV0czsKKyAgIGJvb2wgbG93ZXJfb3V0cHV0czsKKyAgIGJvb2wgbG93ZXJfdGVtcHM7CisgICBib29sIGxvd2VyX3VuaWZvcm1zOworCisgICBib29sIHN0b3JhZ2VfdHlwZV9uZWVkc19sb3dlcmluZyhpcl9kZXJlZmVyZW5jZV9hcnJheSAqZGVyZWYpIGNvbnN0CisgICB7CisgICAgICAvKiBJZiBhIHZhcmlhYmxlIGlzbid0IGV2ZW50dWFsbHkgdGhlIHRhcmdldCBvZiB0aGlzIGRlcmVmZXJlbmNlLCB0aGVuCisgICAgICAgKiBpdCBtdXN0IGJlIGEgY29uc3RhbnQgb3Igc29tZSBzb3J0IG9mIGFub255bW91cyB0ZW1wb3Jhcnkgc3RvcmFnZS4KKyAgICAgICAqCisgICAgICAgKiBGSU5JU0hNRTogSXMgdGhpcyBjb3JyZWN0PyAgTW9zdCBkcml2ZXJzIHRyZWF0IGFycmF5cyBvZiBjb25zdGFudHMgYXMKKyAgICAgICAqIEZJTklTSE1FOiB1bmlmb3Jtcy4gIEl0IHNlZW1zIGxpa2UgdGhpcyBzaG91bGQgZG8gdGhlIHNhbWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSBkZXJlZi0+YXJyYXktPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgICAgIGlmICh2YXIgPT0gTlVMTCkKKwkgcmV0dXJuIHRoaXMtPmxvd2VyX3RlbXBzOworCisgICAgICBzd2l0Y2ggKHZhci0+ZGF0YS5tb2RlKSB7CisgICAgICBjYXNlIGlyX3Zhcl9hdXRvOgorICAgICAgY2FzZSBpcl92YXJfdGVtcG9yYXJ5OgorCSByZXR1cm4gdGhpcy0+bG93ZXJfdGVtcHM7CisgICAgICBjYXNlIGlyX3Zhcl91bmlmb3JtOgorCSByZXR1cm4gdGhpcy0+bG93ZXJfdW5pZm9ybXM7CisgICAgICBjYXNlIGlyX3Zhcl9mdW5jdGlvbl9pbjoKKyAgICAgIGNhc2UgaXJfdmFyX2NvbnN0X2luOgorICAgICAgICAgcmV0dXJuIHRoaXMtPmxvd2VyX3RlbXBzOworICAgICAgY2FzZSBpcl92YXJfc2hhZGVyX2luOgorICAgICAgICAgcmV0dXJuIHRoaXMtPmxvd2VyX2lucHV0czsKKyAgICAgIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX291dDoKKyAgICAgICAgIHJldHVybiB0aGlzLT5sb3dlcl90ZW1wczsKKyAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9vdXQ6CisgICAgICAgICByZXR1cm4gdGhpcy0+bG93ZXJfb3V0cHV0czsKKyAgICAgIGNhc2UgaXJfdmFyX2Z1bmN0aW9uX2lub3V0OgorCSByZXR1cm4gdGhpcy0+bG93ZXJfdGVtcHM7CisgICAgICB9CisKKyAgICAgIGFzc2VydCghIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGJvb2wgbmVlZHNfbG93ZXJpbmcoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmRlcmVmKSBjb25zdAorICAgeworICAgICAgaWYgKGRlcmVmID09IE5VTEwgfHwgZGVyZWYtPmFycmF5X2luZGV4LT5hc19jb25zdGFudCgpCisJICB8fCAhaXNfYXJyYXlfb3JfbWF0cml4KGRlcmVmLT5hcnJheSkpCisJIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRoaXMtPnN0b3JhZ2VfdHlwZV9uZWVkc19sb3dlcmluZyhkZXJlZik7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICpjb252ZXJ0X2RlcmVmZXJlbmNlX2FycmF5KGlyX2RlcmVmZXJlbmNlX2FycmF5ICpvcmlnX2RlcmVmLAorCQkJCQkgIGlyX2Fzc2lnbm1lbnQqIG9yaWdfYXNzaWduLAorCQkJCQkgIGlyX2RlcmVmZXJlbmNlICpvcmlnX2Jhc2UpCisgICB7CisgICAgICBhc3NlcnQoaXNfYXJyYXlfb3JfbWF0cml4KG9yaWdfZGVyZWYtPmFycmF5KSk7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGxlbmd0aCA9IChvcmlnX2RlcmVmLT5hcnJheS0+dHlwZS0+aXNfYXJyYXkoKSkKKyAgICAgICAgID8gb3JpZ19kZXJlZi0+YXJyYXktPnR5cGUtPmxlbmd0aAorICAgICAgICAgOiBvcmlnX2RlcmVmLT5hcnJheS0+dHlwZS0+bWF0cml4X2NvbHVtbnM7CisKKyAgICAgIHZvaWQgKmNvbnN0IG1lbV9jdHggPSByYWxsb2NfcGFyZW50KGJhc2VfaXIpOworCisgICAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZWl0aGVyIHRoZSByZXN1bHQgb2YgdGhlIGRlcmVmZXJlbmNlIG9mCisgICAgICAgKiB0aGUgYXJyYXksIG9yIHRoZSBSSFMgdGhhdCdzIGJlaW5nIGFzc2lnbmVkIGludG8gdGhlCisgICAgICAgKiBkZXJlZmVyZW5jZSBvZiB0aGUgYXJyYXkuCisgICAgICAgKi8KKyAgICAgIGlyX3ZhcmlhYmxlICp2YXI7CisKKyAgICAgIGlmIChvcmlnX2Fzc2lnbikgeworCSB2YXIgPSBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUob3JpZ19hc3NpZ24tPnJocy0+dHlwZSwKKwkJCQkJImRlcmVmZXJlbmNlX2FycmF5X3ZhbHVlIiwKKwkJCQkJaXJfdmFyX3RlbXBvcmFyeSk7CisJIGJhc2VfaXItPmluc2VydF9iZWZvcmUodmFyKTsKKworCSBpcl9kZXJlZmVyZW5jZSAqbGhzID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisJIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbiA9IG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KGxocywKKwkJCQkJCQkgICAgb3JpZ19hc3NpZ24tPnJocywKKwkJCQkJCQkgICAgTlVMTCk7CisKKyAgICAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKKyAgICAgIH0gZWxzZSB7CisJIHZhciA9IG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShvcmlnX2RlcmVmLT50eXBlLAorCQkJCQkiZGVyZWZlcmVuY2VfYXJyYXlfdmFsdWUiLAorCQkJCQlpcl92YXJfdGVtcG9yYXJ5KTsKKwkgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZSh2YXIpOworICAgICAgfQorCisgICAgICAvKiBTdG9yZSB0aGUgaW5kZXggdG8gYSB0ZW1wb3JhcnkgdG8gYXZvaWQgcmV1c2luZyBpdHMgdHJlZS4gKi8KKyAgICAgIGlyX3ZhcmlhYmxlICppbmRleCA9CisJIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShvcmlnX2RlcmVmLT5hcnJheV9pbmRleC0+dHlwZSwKKwkJCQkgICJkZXJlZmVyZW5jZV9hcnJheV9pbmRleCIsIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShpbmRleCk7CisKKyAgICAgIGlyX2RlcmVmZXJlbmNlICpsaHMgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoaW5kZXgpOworICAgICAgaXJfYXNzaWdubWVudCAqYXNzaWduID0KKwkgbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCBvcmlnX2RlcmVmLT5hcnJheV9pbmRleCwgTlVMTCk7CisgICAgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGFzc2lnbik7CisKKyAgICAgIG9yaWdfZGVyZWYtPmFycmF5X2luZGV4ID0gbGhzLT5jbG9uZShtZW1fY3R4LCBOVUxMKTsKKworICAgICAgYXNzaWdubWVudF9nZW5lcmF0b3IgYWc7CisgICAgICBhZy5ydmFsdWUgPSBvcmlnX2Jhc2U7CisgICAgICBhZy5iYXNlX2lyID0gYmFzZV9pcjsKKyAgICAgIGFnLm9sZF9pbmRleCA9IGluZGV4OworICAgICAgYWcudmFyID0gdmFyOworICAgICAgaWYgKG9yaWdfYXNzaWduKSB7CisJIGFnLmlzX3dyaXRlID0gdHJ1ZTsKKwkgYWcud3JpdGVfbWFzayA9IG9yaWdfYXNzaWduLT53cml0ZV9tYXNrOworICAgICAgfSBlbHNlIHsKKwkgYWcuaXNfd3JpdGUgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoX2dlbmVyYXRvciBzZyhhZywgaW5kZXgsIDQsIDQpOworCisgICAgICAvKiBJZiB0aGUgb3JpZ2luYWwgYXNzaWdubWVudCBoYXMgYSBjb25kaXRpb24sIHJlc3BlY3QgdGhhdCBvcmlnaW5hbAorICAgICAgICogY29uZGl0aW9uISAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgd3JhcHBpbmcgdGhlIG5ldyBjb25kaXRpb25hbAorICAgICAgICogYXNzaWdubWVudHMgaW4gYW4gaWYtc3RhdGVtZW50IHRoYXQgdXNlcyB0aGUgb3JpZ2luYWwgY29uZGl0aW9uLgorICAgICAgICovCisgICAgICBpZiAoKG9yaWdfYXNzaWduICE9IE5VTEwpICYmIChvcmlnX2Fzc2lnbi0+Y29uZGl0aW9uICE9IE5VTEwpKSB7CisJIC8qIE5vIG5lZWQgdG8gY2xvbmUgdGhlIGNvbmRpdGlvbiBiZWNhdXNlIHRoZSBJUiB0aGF0IGl0IGhhbmdzIG9uIGlzCisJICAqIGdvaW5nIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UuCisJICAqLworCSBpcl9pZiAqaWZfc3RtdCA9IG5ldyhtZW1fY3R4KSBpcl9pZihvcmlnX2Fzc2lnbi0+Y29uZGl0aW9uKTsKKworCSBzZy5nZW5lcmF0ZSgwLCBsZW5ndGgsICZpZl9zdG10LT50aGVuX2luc3RydWN0aW9ucyk7CisJIGJhc2VfaXItPmluc2VydF9iZWZvcmUoaWZfc3RtdCk7CisgICAgICB9IGVsc2UgeworCSBleGVjX2xpc3QgbGlzdDsKKworCSBzZy5nZW5lcmF0ZSgwLCBsZW5ndGgsICZsaXN0KTsKKwkgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZSgmbGlzdCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YXI7CisgICB9CisKKyAgIHZpcnR1YWwgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnBpcikKKyAgIHsKKyAgICAgIGlmICh0aGlzLT5pbl9hc3NpZ25lZSkKKwkgcmV0dXJuOworCisgICAgICBpZiAoISpwaXIpCisgICAgICAgICByZXR1cm47CisKKyAgICAgIGlyX2RlcmVmZXJlbmNlX2FycmF5KiBvcmlnX2RlcmVmID0gKCpwaXIpLT5hc19kZXJlZmVyZW5jZV9hcnJheSgpOworICAgICAgaWYgKG5lZWRzX2xvd2VyaW5nKG9yaWdfZGVyZWYpKSB7CisgICAgICAgICBpcl92YXJpYWJsZSAqdmFyID0KKwkgICAgY29udmVydF9kZXJlZmVyZW5jZV9hcnJheShvcmlnX2RlcmVmLCBOVUxMLCBvcmlnX2RlcmVmKTsKKyAgICAgICAgIGFzc2VydCh2YXIpOworICAgICAgICAgKnBpciA9IG5ldyhyYWxsb2NfcGFyZW50KGJhc2VfaXIpKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgICAgfQorICAgfQorCisgICBpcl92aXNpdG9yX3N0YXR1cworICAgdmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqaXIpCisgICB7CisgICAgICBpcl9ydmFsdWVfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXIpOworCisgICAgICBmaW5kX3ZhcmlhYmxlX2luZGV4IGY7CisgICAgICBpci0+bGhzLT5hY2NlcHQoJmYpOworCisgICAgICBpZiAoKGYuZGVyZWYgIT0gTlVMTCkgJiYgc3RvcmFnZV90eXBlX25lZWRzX2xvd2VyaW5nKGYuZGVyZWYpKSB7CisgICAgICAgICBjb252ZXJ0X2RlcmVmZXJlbmNlX2FycmF5KGYuZGVyZWYsIGlyLCBpci0+bGhzKTsKKyAgICAgICAgIGlyLT5yZW1vdmUoKTsKKyAgICAgICAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK2Jvb2wKK2xvd2VyX3ZhcmlhYmxlX2luZGV4X3RvX2NvbmRfYXNzaWduKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJCSAgICBib29sIGxvd2VyX2lucHV0LAorCQkJCSAgICBib29sIGxvd2VyX291dHB1dCwKKwkJCQkgICAgYm9vbCBsb3dlcl90ZW1wLAorCQkJCSAgICBib29sIGxvd2VyX3VuaWZvcm0pCit7CisgICB2YXJpYWJsZV9pbmRleF90b19jb25kX2Fzc2lnbl92aXNpdG9yIHYobG93ZXJfaW5wdXQsCisJCQkJCSAgIGxvd2VyX291dHB1dCwKKwkJCQkJICAgbG93ZXJfdGVtcCwKKwkJCQkJICAgbG93ZXJfdW5pZm9ybSk7CisKKyAgIC8qIENvbnRpbnVlIGxvd2VyaW5nIHVudGlsIG5vIHByb2dyZXNzIGlzIG1hZGUuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAqIGxldmVscyBvZiBpbmRpcmVjdGlvbiAoZS5nLiwgbm9uLWNvbnN0YW50IGluZGV4aW5nIG9mIGFycmF5IGVsZW1lbnRzIGFuZAorICAgICogbWF0cml4IGNvbHVtbnMgb2YgYW4gYXJyYXkgb2YgbWF0cml4KSwgZWFjaCBwYXNzIHdpbGwgb25seSBsb3dlciBvbmUKKyAgICAqIGxldmVsIG9mIGluZGlyZWN0aW9uLgorICAgICovCisgICBib29sIHByb2dyZXNzX2V2ZXIgPSBmYWxzZTsKKyAgIGRvIHsKKyAgICAgIHYucHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7CisgICAgICBwcm9ncmVzc19ldmVyID0gdi5wcm9ncmVzcyB8fCBwcm9ncmVzc19ldmVyOworICAgfSB3aGlsZSAodi5wcm9ncmVzcyk7CisKKyAgIHJldHVybiBwcm9ncmVzc19ldmVyOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ24uY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmEzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3ZlY19pbmRleF90b19jb25kX2Fzc2lnbi5jcHAKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGxvd2VyX3ZlY19pbmRleF90b19jb25kX2Fzc2lnbi5jcHAKKyAqCisgKiBUdXJucyBpbmRleGluZyBpbnRvIHZlY3RvciB0eXBlcyB0byBhIHNlcmllcyBvZiBjb25kaXRpb25hbCBtb3ZlcworICogb2YgZWFjaCBjaGFubmVsJ3Mgc3dpenpsZSBpbnRvIGEgdGVtcG9yYXJ5LgorICoKKyAqIE1vc3QgR1BVcyBkb24ndCBoYXZlIGEgbmF0aXZlIHdheSB0byBkbyB0aGlzIG9wZXJhdGlvbiwgYW5kIHRoaXMKKyAqIHdvcmtzIGFyb3VuZCB0aGF0LiAgRm9yIGRyaXZlcnMgdXNpbmcgYm90aCB0aGlzIHBhc3MgYW5kCisgKiBpcl92ZWNfaW5kZXhfdG9fc3dpenpsZSwgdGhlcmUncyBhIHJpc2sgdGhhdCB0aGlzIHBhc3Mgd2lsbCBoYXBwZW4KKyAqIGJlZm9yZSBzdWZmaWNpZW50IGNvbnN0YW50IGZvbGRpbmcgdG8gZmluZCB0aGF0IHRoZSBhcnJheSBpbmRleCBpcworICogY29uc3RhbnQuICBIb3dldmVyLCB3ZSBob3BlIHRoYXQgb3RoZXIgb3B0aW1pemF0aW9uIHBhc3NlcywKKyAqIHBhcnRpY3VsYXJseSBjb25zdGFudCBmb2xkaW5nIG9mIGFzc2lnbm1lbnQgY29uZGl0aW9ucyBhbmQgY29weQorICogcHJvcGFnYXRpb24sIHdpbGwgcmVzdWx0IGluIHRoZSBzYW1lIGNvZGUgaW4gdGhlIGVuZC4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCituYW1lc3BhY2UgeworCisvKioKKyAqIFZpc2l0b3IgY2xhc3MgZm9yIHJlcGxhY2luZyBleHByZXNzaW9ucyB3aXRoIGlyX2NvbnN0YW50IHZhbHVlcy4KKyAqLworCitjbGFzcyBpcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ25fdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ25fdmlzaXRvcigpCisgICB7CisgICAgICBwcm9ncmVzcyA9IGZhbHNlOworICAgfQorCisgICBpcl9ydmFsdWUgKmNvbnZlcnRfdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduKHZvaWQgKm1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqb3JpZ192ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqb3JpZ19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xzbF90eXBlICp0eXBlKTsKKworICAgaXJfcnZhbHVlICpjb252ZXJ0X3ZlY3Rvcl9leHRyYWN0X3RvX2NvbmRfYXNzaWduKGlyX3J2YWx1ZSAqaXIpOworCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2V4cHJlc3Npb24gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX3N3aXp6bGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX3JldHVybiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfY2FsbCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfaWYgKik7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworaXJfcnZhbHVlICoKK2lyX3ZlY19pbmRleF90b19jb25kX2Fzc2lnbl92aXNpdG9yOjpjb252ZXJ0X3ZlY19pbmRleF90b19jb25kX2Fzc2lnbih2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqb3JpZ192ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfcnZhbHVlICpvcmlnX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSkKK3sKKyAgIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbiwgKnZhbHVlX2Fzc2lnbjsKKyAgIGlyX3ZhcmlhYmxlICppbmRleCwgKnZhciwgKnZhbHVlOworICAgaXJfZGVyZWZlcmVuY2UgKmRlcmVmLCAqZGVyZWZfdmFsdWU7CisgICB1bnNpZ25lZCBpOworCisKKyAgIGV4ZWNfbGlzdCBsaXN0OworCisgICAvKiBTdG9yZSB0aGUgaW5kZXggdG8gYSB0ZW1wb3JhcnkgdG8gYXZvaWQgcmV1c2luZyBpdHMgdHJlZS4gKi8KKyAgIGluZGV4ID0gbmV3KGJhc2VfaXIpIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6aW50X3R5cGUsCisJCQkJICAgICJ2ZWNfaW5kZXhfdG1wX2kiLAorCQkJCSAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgIGxpc3QucHVzaF90YWlsKGluZGV4KTsKKyAgIGRlcmVmID0gbmV3KGJhc2VfaXIpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKGluZGV4KTsKKyAgIGFzc2lnbiA9IG5ldyhiYXNlX2lyKSBpcl9hc3NpZ25tZW50KGRlcmVmLCBvcmlnX2luZGV4LCBOVUxMKTsKKyAgIGxpc3QucHVzaF90YWlsKGFzc2lnbik7CisKKyAgIC8qIFN0b3JlIHRoZSB2YWx1ZSBpbnNpZGUgYSB0ZW1wLCB0aHVzIGF2b2lkaW5nIG1hdHJpeGVzIGR1cGxpY2F0aW9uICovCisgICB2YWx1ZSA9IG5ldyhiYXNlX2lyKSBpcl92YXJpYWJsZShvcmlnX3ZlY3Rvci0+dHlwZSwgInZlY192YWx1ZV90bXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICBsaXN0LnB1c2hfdGFpbCh2YWx1ZSk7CisgICBkZXJlZl92YWx1ZSA9IG5ldyhiYXNlX2lyKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YWx1ZSk7CisgICB2YWx1ZV9hc3NpZ24gPSBuZXcoYmFzZV9pcikgaXJfYXNzaWdubWVudChkZXJlZl92YWx1ZSwgb3JpZ192ZWN0b3IpOworICAgbGlzdC5wdXNoX3RhaWwodmFsdWVfYXNzaWduKTsKKworICAgLyogVGVtcG9yYXJ5IHdoZXJlIHdlIHN0b3JlIHdoaWNoZXZlciB2YWx1ZSB3ZSBzd2l6emxlIG91dC4gKi8KKyAgIHZhciA9IG5ldyhiYXNlX2lyKSBpcl92YXJpYWJsZSh0eXBlLCAidmVjX2luZGV4X3RtcF92IiwKKwkJCQkgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgbGlzdC5wdXNoX3RhaWwodmFyKTsKKworICAgLyogR2VuZXJhdGUgYSBzaW5nbGUgY29tcGFyaXNvbiBjb25kaXRpb24gIm1hc2siIGZvciBhbGwgb2YgdGhlIGNvbXBvbmVudHMKKyAgICAqIGluIHRoZSB2ZWN0b3IuCisgICAgKi8KKyAgIGlyX3J2YWx1ZSAqY29uc3QgY29uZF9kZXJlZiA9CisgICAgICBjb21wYXJlX2luZGV4X2Jsb2NrKCZsaXN0LCBpbmRleCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ192ZWN0b3ItPnR5cGUtPnZlY3Rvcl9lbGVtZW50cywKKwkJCSAgbWVtX2N0eCk7CisKKyAgIC8qIEdlbmVyYXRlIGEgY29uZGl0aW9uYWwgbW92ZSBvZiBlYWNoIHZlY3RvciBlbGVtZW50IHRvIHRoZSB0ZW1wLiAqLworICAgZm9yIChpID0gMDsgaSA8IG9yaWdfdmVjdG9yLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgaXJfcnZhbHVlICpjb25kaXRpb25fc3dpenpsZSA9CisgICAgICAgICBuZXcoYmFzZV9pcikgaXJfc3dpenpsZShjb25kX2RlcmVmLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIDAsIDAsIDAsIDEpOworCisgICAgICAvKiBKdXN0IGNsb25lIHRoZSByZXN0IG9mIHRoZSBkZXJlZiBjaGFpbiB3aGVuIHRyeWluZyB0byBnZXQgYXQgdGhlCisgICAgICAgKiB1bmRlcmx5aW5nIHZhcmlhYmxlLgorICAgICAgICovCisgICAgICBpcl9ydmFsdWUgKnN3aXp6bGUgPQorCSBuZXcoYmFzZV9pcikgaXJfc3dpenpsZShkZXJlZl92YWx1ZS0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJIGksIDAsIDAsIDAsIDEpOworCisgICAgICBkZXJlZiA9IG5ldyhiYXNlX2lyKSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh2YXIpOworICAgICAgYXNzaWduID0gbmV3KGJhc2VfaXIpIGlyX2Fzc2lnbm1lbnQoZGVyZWYsIHN3aXp6bGUsIGNvbmRpdGlvbl9zd2l6emxlKTsKKyAgICAgIGxpc3QucHVzaF90YWlsKGFzc2lnbik7CisgICB9CisKKyAgIC8qIFB1dCBhbGwgb2YgdGhlIG5ldyBpbnN0cnVjdGlvbnMgaW4gdGhlIElSIHN0cmVhbSBiZWZvcmUgdGhlIG9sZAorICAgICogaW5zdHJ1Y3Rpb24uCisgICAgKi8KKyAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoJmxpc3QpOworCisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisgICByZXR1cm4gbmV3KGJhc2VfaXIpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7Cit9CisKK2lyX3J2YWx1ZSAqCitpcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ25fdmlzaXRvcjo6Y29udmVydF92ZWN0b3JfZXh0cmFjdF90b19jb25kX2Fzc2lnbihpcl9ydmFsdWUgKmlyKQoreworICAgaXJfZXhwcmVzc2lvbiAqY29uc3QgZXhwciA9IGlyLT5hc19leHByZXNzaW9uKCk7CisKKyAgIGlmIChleHByID09IE5VTEwgfHwgZXhwci0+b3BlcmF0aW9uICE9IGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0KQorICAgICAgcmV0dXJuIGlyOworCisgICByZXR1cm4gY29udmVydF92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ24ocmFsbG9jX3BhcmVudChpciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+b3BlcmFuZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+b3BlcmFuZHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXItPnR5cGUpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBpci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKyAgICAgIGlyLT5vcGVyYW5kc1tpXSA9IGNvbnZlcnRfdmVjdG9yX2V4dHJhY3RfdG9fY29uZF9hc3NpZ24oaXItPm9wZXJhbmRzW2ldKTsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3N3aXp6bGUgKmlyKQoreworICAgLyogQ2FuJ3QgYmUgaGl0IGZyb20gbm9ybWFsIEdMU0wsIHNpbmNlIHlvdSBjYW4ndCBzd2l6emxlIGEgc2NhbGFyICh3aGljaAorICAgICogdGhlIHJlc3VsdCBvZiBpbmRleGluZyBhIHZlY3RvciBpcy4gIEJ1dCBtYXliZSBhdCBzb21lIHBvaW50IHdlJ2xsIGVuZCB1cAorICAgICogdXNpbmcgc3dpenpsaW5nIG9mIHNjYWxhcnMgZm9yIHZlY3RvciBjb25zdHJ1Y3Rpb24uCisgICAgKi8KKyAgIGlyLT52YWwgPSBjb252ZXJ0X3ZlY3Rvcl9leHRyYWN0X3RvX2NvbmRfYXNzaWduKGlyLT52YWwpOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ25fdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpci0+cmhzID0gY29udmVydF92ZWN0b3JfZXh0cmFjdF90b19jb25kX2Fzc2lnbihpci0+cmhzKTsKKworICAgaWYgKGlyLT5jb25kaXRpb24pIHsKKyAgICAgIGlyLT5jb25kaXRpb24gPSBjb252ZXJ0X3ZlY3Rvcl9leHRyYWN0X3RvX2NvbmRfYXNzaWduKGlyLT5jb25kaXRpb24pOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ25fdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfY2FsbCAqaXIpCit7CisgICBmb3JlYWNoX2xpc3Rfc2FmZShuLCAmaXItPmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisgICAgICBpcl9ydmFsdWUgKnBhcmFtID0gKGlyX3J2YWx1ZSAqKSBuOworICAgICAgaXJfcnZhbHVlICpuZXdfcGFyYW0gPSBjb252ZXJ0X3ZlY3Rvcl9leHRyYWN0X3RvX2NvbmRfYXNzaWduKHBhcmFtKTsKKworICAgICAgaWYgKG5ld19wYXJhbSAhPSBwYXJhbSkgeworCSBwYXJhbS0+cmVwbGFjZV93aXRoKG5ld19wYXJhbSk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY19pbmRleF90b19jb25kX2Fzc2lnbl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9yZXR1cm4gKmlyKQoreworICAgaWYgKGlyLT52YWx1ZSkgeworICAgICAgaXItPnZhbHVlID0gY29udmVydF92ZWN0b3JfZXh0cmFjdF90b19jb25kX2Fzc2lnbihpci0+dmFsdWUpOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ25fdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfaWYgKmlyKQoreworICAgaXItPmNvbmRpdGlvbiA9IGNvbnZlcnRfdmVjdG9yX2V4dHJhY3RfdG9fY29uZF9hc3NpZ24oaXItPmNvbmRpdGlvbik7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworYm9vbAorZG9fdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaXJfdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduX3Zpc2l0b3IgdjsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3ZlY19pbmRleF90b19zd2l6emxlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfdmVjX2luZGV4X3RvX3N3aXp6bGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmIwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3ZlY19pbmRleF90b19zd2l6emxlLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgbG93ZXJfdmVjX2luZGV4X3RvX3N3aXp6bGUuY3BwCisgKgorICogVHVybnMgY29uc3RhbnQgaW5kZXhpbmcgaW50byB2ZWN0b3IgdHlwZXMgdG8gc3dpenpsZXMuICBUaGlzIHdpbGwKKyAqIGxldCBvdGhlciBzd2l6emxlLWF3YXJlIG9wdGltaXphdGlvbiBwYXNzZXMgY2F0Y2ggdGhlc2UgY29uc3RydWN0cywKKyAqIGFuZCBjb2RlZ2VuIGJhY2tlbmRzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgY2FzZS4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisKKy8qKgorICogVmlzaXRvciBjbGFzcyBmb3IgcmVwbGFjaW5nIGV4cHJlc3Npb25zIHdpdGggaXJfY29uc3RhbnQgdmFsdWVzLgorICovCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIGlyX3ZlY19pbmRleF90b19zd2l6emxlX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfdmVjX2luZGV4X3RvX3N3aXp6bGVfdmlzaXRvcigpCisgICB7CisgICAgICBwcm9ncmVzcyA9IGZhbHNlOworICAgfQorCisgICBpcl9ydmFsdWUgKmNvbnZlcnRfdmVjdG9yX2V4dHJhY3RfdG9fc3dpenpsZShpcl9ydmFsdWUgKnZhbCk7CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZXhwcmVzc2lvbiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfc3dpenpsZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfcmV0dXJuICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9jYWxsICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9pZiAqKTsKKworICAgYm9vbCBwcm9ncmVzczsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitpcl9ydmFsdWUgKgoraXJfdmVjX2luZGV4X3RvX3N3aXp6bGVfdmlzaXRvcjo6Y29udmVydF92ZWN0b3JfZXh0cmFjdF90b19zd2l6emxlKGlyX3J2YWx1ZSAqaXIpCit7CisgICBpcl9leHByZXNzaW9uICpjb25zdCBleHByID0gaXItPmFzX2V4cHJlc3Npb24oKTsKKyAgIGlmIChleHByID09IE5VTEwgfHwgZXhwci0+b3BlcmF0aW9uICE9IGlyX2Jpbm9wX3ZlY3Rvcl9leHRyYWN0KQorICAgICAgcmV0dXJuIGlyOworCisgICBpcl9jb25zdGFudCAqY29uc3QgaWR4ID0gZXhwci0+b3BlcmFuZHNbMV0tPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKyAgIGlmIChpZHggPT0gTlVMTCkKKyAgICAgIHJldHVybiBpcjsKKworICAgdm9pZCAqY3R4ID0gcmFsbG9jX3BhcmVudChpcik7CisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisKKyAgIC8qIFBhZ2UgNDAgb2YgdGhlIEdMU0wgMS4yMCBzcGVjIHNheXM6CisgICAgKgorICAgICogICAgICJXaGVuIGluZGV4aW5nIHdpdGggbm9uLWNvbnN0YW50IGV4cHJlc3Npb25zLCBiZWhhdmlvciBpcyB1bmRlZmluZWQKKyAgICAqICAgICBpZiB0aGUgaW5kZXggaXMgbmVnYXRpdmUsIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZgorICAgICogICAgIHRoZSB2ZWN0b3IuIgorICAgICoKKyAgICAqIFRoZSBxdW90ZWQgc3BlYyB0ZXh0IG1lbnRpb25zIG5vbi1jb25zdGFudCBleHByZXNzaW9ucywgYnV0IHRoaXMgY29kZQorICAgICogb3BlcmF0ZXMgb24gY29uc3RhbnRzLiAgVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgcmVzdWx0IG9mIG5vbi1jb25zdGFudAorICAgICogZXhwcmVzc2lvbnMgdGhhdCBoYXZlIGJlZW4gb3B0aW1pemVkIHRvIGNvbnN0YW50cy4gIFRoZSBjb21tb24gY2FzZSBoZXJlCisgICAgKiBpcyBhIGxvb3AgY291bnRlciBmcm9tIGFuIHVucm9sbGVkIGxvb3AgdGhhdCBpcyB1c2VkIHRvIGluZGV4IGEgdmVjdG9yLgorICAgICoKKyAgICAqIFRoZSBpcl9zd2l6emxlIGNvbnN0cnVjdG9yIGdldHMgYW5ncnkgaWYgdGhlIGluZGV4IGlzIG5lZ2F0aXZlIG9yIHRvbworICAgICogbGFyZ2UuICBGb3Igc2ltcGxpY2l0eSBzYWtlLCBqdXN0IGNsYW1wIHRoZSBpbmRleCB0byBbMCwgc2l6ZS0xXS4KKyAgICAqLworICAgY29uc3QgaW50IGkgPSBDTEFNUChpZHgtPnZhbHVlLmlbMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIGV4cHItPm9wZXJhbmRzWzBdLT50eXBlLT52ZWN0b3JfZWxlbWVudHMgLSAxKTsKKworICAgcmV0dXJuIG5ldyhjdHgpIGlyX3N3aXp6bGUoZXhwci0+b3BlcmFuZHNbMF0sIGksIDAsIDAsIDAsIDEpOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjX2luZGV4X3RvX3N3aXp6bGVfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgZm9yIChpID0gMDsgaSA8IGlyLT5nZXRfbnVtX29wZXJhbmRzKCk7IGkrKykgeworICAgICAgaXItPm9wZXJhbmRzW2ldID0gY29udmVydF92ZWN0b3JfZXh0cmFjdF90b19zd2l6emxlKGlyLT5vcGVyYW5kc1tpXSk7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY19pbmRleF90b19zd2l6emxlX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3N3aXp6bGUgKmlyKQoreworICAgLyogQ2FuJ3QgYmUgaGl0IGZyb20gbm9ybWFsIEdMU0wsIHNpbmNlIHlvdSBjYW4ndCBzd2l6emxlIGEgc2NhbGFyICh3aGljaAorICAgICogdGhlIHJlc3VsdCBvZiBpbmRleGluZyBhIHZlY3RvciBpcy4gIEJ1dCBtYXliZSBhdCBzb21lIHBvaW50IHdlJ2xsIGVuZCB1cAorICAgICogdXNpbmcgc3dpenpsaW5nIG9mIHNjYWxhcnMgZm9yIHZlY3RvciBjb25zdHJ1Y3Rpb24uCisgICAgKi8KKyAgIGlyLT52YWwgPSBjb252ZXJ0X3ZlY3Rvcl9leHRyYWN0X3RvX3N3aXp6bGUoaXItPnZhbCk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY19pbmRleF90b19zd2l6emxlX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgaXItPnJocyA9IGNvbnZlcnRfdmVjdG9yX2V4dHJhY3RfdG9fc3dpenpsZShpci0+cmhzKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjX2luZGV4X3RvX3N3aXp6bGVfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfY2FsbCAqaXIpCit7CisgICBmb3JlYWNoX2xpc3Rfc2FmZShuLCAmaXItPmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisgICAgICBpcl9ydmFsdWUgKnBhcmFtID0gKGlyX3J2YWx1ZSAqKSBuOworICAgICAgaXJfcnZhbHVlICpuZXdfcGFyYW0gPSBjb252ZXJ0X3ZlY3Rvcl9leHRyYWN0X3RvX3N3aXp6bGUocGFyYW0pOworCisgICAgICBpZiAobmV3X3BhcmFtICE9IHBhcmFtKSB7CisJIHBhcmFtLT5yZXBsYWNlX3dpdGgobmV3X3BhcmFtKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmVjX2luZGV4X3RvX3N3aXp6bGVfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfcmV0dXJuICppcikKK3sKKyAgIGlmIChpci0+dmFsdWUpIHsKKyAgICAgIGlyLT52YWx1ZSA9IGNvbnZlcnRfdmVjdG9yX2V4dHJhY3RfdG9fc3dpenpsZShpci0+dmFsdWUpOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWNfaW5kZXhfdG9fc3dpenpsZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9pZiAqaXIpCit7CisgICBpci0+Y29uZGl0aW9uID0gY29udmVydF92ZWN0b3JfZXh0cmFjdF90b19zd2l6emxlKGlyLT5jb25kaXRpb24pOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2Jvb2wKK2RvX3ZlY19pbmRleF90b19zd2l6emxlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaXJfdmVjX2luZGV4X3RvX3N3aXp6bGVfdmlzaXRvciB2OworCisgICB2LnJ1bihpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfdmVjdG9yLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbG93ZXJfdmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGViNTVlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl92ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsb3dlcl92ZWN0b3IuY3BwCisgKiBJUiBsb3dlcmluZyBwYXNzIHRvIHJlbW92ZSBzb21lIHR5cGVzIG9mIGlyX3F1YWRvcF92ZWN0b3IKKyAqCisgKiBcYXV0aG9yIElhbiBSb21hbmljayA8aWFuLmQucm9tYW5pY2tAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3J2YWx1ZV92aXNpdG9yLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIGxvd2VyX3ZlY3Rvcl92aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGxvd2VyX3ZlY3Rvcl92aXNpdG9yKCkgOiBkb250X2xvd2VyX3N3eihmYWxzZSksIHByb2dyZXNzKGZhbHNlKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSk7CisKKyAgIC8qKgorICAgICogU2hvdWxkIFNXWi1saWtlIGV4cHJlc3Npb25zIGJlIGxvd2VyZWQ/CisgICAgKi8KKyAgIGJvb2wgZG9udF9sb3dlcl9zd3o7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit9IC8qIGFub255bW91cyBuYW1lc3BhY2UgKi8KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgYW4gSVIgZXhwcmVzc2lvbiB0cmVlIGxvb2tzIGxpa2UgYW4gZXh0ZW5kZWQgc3dpenpsZQorICoKKyAqIEV4dGVuZGVkIHN3aXp6bGVzIGNvbnNpc3Qgb2YgYWNjZXNzIG9mIGEgc2luZ2xlIHZlY3RvciBzb3VyY2UgKHdpdGggcG9zc2libGUKKyAqIHBlciBjb21wb25lbnQgbmVnYXRpb24pIGFuZCB0aGUgY29uc3RhbnRzIC0xLCAwLCBvciAxLgorICovCitib29sCitpc19leHRlbmRlZF9zd2l6emxlKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgLyogVHJhY2sgYW55IHZhcmlhYmxlcyB0aGF0IGFyZSBhY2Nlc3NlZCBieSB0aGlzIGV4cHJlc3Npb24uCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBOVUxMOworCisgICBhc3NlcnQoaXItPm9wZXJhdGlvbiA9PSBpcl9xdWFkb3BfdmVjdG9yKTsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGlyLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGkrKykgeworICAgICAgaXJfcnZhbHVlICpvcCA9IGlyLT5vcGVyYW5kc1tpXTsKKworICAgICAgd2hpbGUgKG9wICE9IE5VTEwpIHsKKwkgc3dpdGNoIChvcC0+aXJfdHlwZSkgeworCSBjYXNlIGlyX3R5cGVfY29uc3RhbnQ6IHsKKwkgICAgY29uc3QgaXJfY29uc3RhbnQgKmNvbnN0IGMgPSBvcC0+YXNfY29uc3RhbnQoKTsKKworCSAgICBpZiAoIWMtPmlzX29uZSgpICYmICFjLT5pc196ZXJvKCkgJiYgIWMtPmlzX25lZ2F0aXZlX29uZSgpKQorCSAgICAgICByZXR1cm4gZmFsc2U7CisKKwkgICAgb3AgPSBOVUxMOworCSAgICBicmVhazsKKwkgfQorCisJIGNhc2UgaXJfdHlwZV9kZXJlZmVyZW5jZV92YXJpYWJsZTogeworCSAgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqY29uc3QgZCA9IChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqKSBvcDsKKworCSAgICBpZiAoKHZhciAhPSBOVUxMKSAmJiAodmFyICE9IGQtPnZhcikpCisJICAgICAgIHJldHVybiBmYWxzZTsKKworCSAgICB2YXIgPSBkLT52YXI7CisJICAgIG9wID0gTlVMTDsKKwkgICAgYnJlYWs7CisJIH0KKworCSBjYXNlIGlyX3R5cGVfZXhwcmVzc2lvbjogeworCSAgICBpcl9leHByZXNzaW9uICpjb25zdCBleCA9IChpcl9leHByZXNzaW9uICopIG9wOworCisJICAgIGlmIChleC0+b3BlcmF0aW9uICE9IGlyX3Vub3BfbmVnKQorCSAgICAgICByZXR1cm4gZmFsc2U7CisKKwkgICAgb3AgPSBleC0+b3BlcmFuZHNbMF07CisJICAgIGJyZWFrOworCSB9CisKKwkgY2FzZSBpcl90eXBlX3N3aXp6bGU6CisJICAgIG9wID0gKChpcl9zd2l6emxlICopIG9wKS0+dmFsOworCSAgICBicmVhazsKKworCSBkZWZhdWx0OgorCSAgICByZXR1cm4gZmFsc2U7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK2xvd2VyX3ZlY3Rvcl92aXNpdG9yOjpoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSkKK3sKKyAgIGlmICghKnJ2YWx1ZSkKKyAgICAgIHJldHVybjsKKworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9ICgqcnZhbHVlKS0+YXNfZXhwcmVzc2lvbigpOworICAgaWYgKChleHByID09IE5VTEwpIHx8IChleHByLT5vcGVyYXRpb24gIT0gaXJfcXVhZG9wX3ZlY3RvcikpCisgICAgICByZXR1cm47CisKKyAgIGlmICh0aGlzLT5kb250X2xvd2VyX3N3eiAmJiBpc19leHRlbmRlZF9zd2l6emxlKGV4cHIpKQorICAgICAgcmV0dXJuOworCisgICAvKiBGSU5JU0hNRTogSXMgdGhpcyB0aGUgcmlnaHQgdGhpbmcgdG8gdXNlIGZvciB0aGUgcmFsbG9jIGNvbnRleHQ/CisgICAgKi8KKyAgIHZvaWQgKmNvbnN0IG1lbV9jdHggPSBleHByOworCisgICBhc3NlcnQoZXhwci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzID09IGV4cHItPmdldF9udW1fb3BlcmFuZHMoKSk7CisKKyAgIC8qIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IHdpdGggdGhlIHNhbWUgdHlwZSBhcyB0aGUgaXJfcXVhZG9wX29wZXJhdGlvbi4KKyAgICAqLworICAgaXJfdmFyaWFibGUgKmNvbnN0IHRlbXAgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGV4cHItPnR5cGUsICJ2ZWNvcF90bXAiLCBpcl92YXJfdGVtcG9yYXJ5KTsKKworICAgdGhpcy0+YmFzZV9pci0+aW5zZXJ0X2JlZm9yZSh0ZW1wKTsKKworICAgLyogQ291bnRlciBvZiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgY29sbGVjdGVkIHNvIGZhci4KKyAgICAqLworICAgdW5zaWduZWQgYXNzaWduZWQ7CisKKyAgIC8qIFdyaXRlLW1hc2sgaW4gdGhlIGRlc3RpbmF0aW9uIHRoYXQgcmVjZWl2ZXMgY291bnRlZCBieSAnYXNzaWduZWQnLgorICAgICovCisgICB1bnNpZ25lZCB3cml0ZV9tYXNrOworCisKKyAgIC8qIEdlbmVyYXRlIHVwIHRvIGZvdXIgYXNzaWdubWVudHMgdG8gdGhhdCB2YXJpYWJsZS4gIFRyeSB0byBncm91cCBjb21wb25lbnQKKyAgICAqIGFzc2lnbm1lbnRzIHRvZ2V0aGVyOgorICAgICoKKyAgICAqIC0gQWxsIGNvbnN0YW50IGNvbXBvbmVudHMgY2FuIGJlIGFzc2lnbmVkIGF0IG9uY2UuCisgICAgKiAtIEFsbCBhc3NpZ21lbnRzIG9mIGNvbXBvbmVudHMgZnJvbSBhIHNpbmdsZSB2YXJpYWJsZSB3aXRoIHRoZSBzYW1lCisgICAgKiAgIHVuYXJ5IG9wZXJhdG9yIGNhbiBiZSBhc3NpZ25lZCBhdCBvbmNlLgorICAgICovCisgICBpcl9jb25zdGFudF9kYXRhIGQgPSB7IHsgMCB9IH07CisKKyAgIGFzc2lnbmVkID0gMDsKKyAgIHdyaXRlX21hc2sgPSAwOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGV4cHItPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICBjb25zdCBpcl9jb25zdGFudCAqY29uc3QgYyA9IGV4cHItPm9wZXJhbmRzW2ldLT5hc19jb25zdGFudCgpOworCisgICAgICBpZiAoYyA9PSBOVUxMKQorCSBjb250aW51ZTsKKworICAgICAgc3dpdGNoIChleHByLT50eXBlLT5iYXNlX3R5cGUpIHsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6ICBkLnVbYXNzaWduZWRdID0gYy0+dmFsdWUudVswXTsgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6ICAgZC5pW2Fzc2lnbmVkXSA9IGMtPnZhbHVlLmlbMF07IGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfRkxPQVQ6IGQuZlthc3NpZ25lZF0gPSBjLT52YWx1ZS5mWzBdOyBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6ICBkLmJbYXNzaWduZWRdID0gYy0+dmFsdWUuYlswXTsgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgYXNzZXJ0KCEiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHdyaXRlX21hc2sgfD0gKDFVIDw8IGkpOworICAgICAgYXNzaWduZWQrKzsKKyAgIH0KKworICAgYXNzZXJ0KCh3cml0ZV9tYXNrID09IDApID09IChhc3NpZ25lZCA9PSAwKSk7CisKKyAgIC8qIElmIHRoZXJlIHdlcmUgY29uc3RhbnQgdmFsdWVzLCBnZW5lcmF0ZSBhbiBhc3NpZ25tZW50LgorICAgICovCisgICBpZiAoYXNzaWduZWQgPiAwKSB7CisgICAgICBpcl9jb25zdGFudCAqY29uc3QgYyA9CisJIG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudChnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShleHByLT50eXBlLT5iYXNlX3R5cGUsCisJCQkJCQkJICBhc3NpZ25lZCwgMSksCisJCQkJICAmZCk7CisgICAgICBpcl9kZXJlZmVyZW5jZSAqY29uc3QgbGhzID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRlbXApOworICAgICAgaXJfYXNzaWdubWVudCAqY29uc3QgYXNzaWduID0KKwkgbmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobGhzLCBjLCBOVUxMLCB3cml0ZV9tYXNrKTsKKworICAgICAgdGhpcy0+YmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworICAgfQorCisgICAvKiBGSU5JU0hNRTogVGhpcyBzaG91bGQgdHJ5IHRvIGNvYWxlc2NlIGFzc2lnbm1lbnRzLgorICAgICovCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZXhwci0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgIGlmIChleHByLT5vcGVyYW5kc1tpXS0+aXJfdHlwZSA9PSBpcl90eXBlX2NvbnN0YW50KQorCSBjb250aW51ZTsKKworICAgICAgaXJfZGVyZWZlcmVuY2UgKmNvbnN0IGxocyA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0ZW1wKTsKKyAgICAgIGlyX2Fzc2lnbm1lbnQgKmNvbnN0IGFzc2lnbiA9CisJIG5ldyhtZW1fY3R4KSBpcl9hc3NpZ25tZW50KGxocywgZXhwci0+b3BlcmFuZHNbaV0sIE5VTEwsICgxVSA8PCBpKSk7CisKKyAgICAgIHRoaXMtPmJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKKyAgICAgIGFzc2lnbmVkKys7CisgICB9CisKKyAgIGFzc2VydChhc3NpZ25lZCA9PSBleHByLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworCisgICAqcnZhbHVlID0gbmV3KG1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRlbXApOworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworfQorCitib29sCitsb3dlcl9xdWFkb3BfdmVjdG9yKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBib29sIGRvbnRfbG93ZXJfc3d6KQoreworICAgbG93ZXJfdmVjdG9yX3Zpc2l0b3IgdjsKKworICAgdi5kb250X2xvd2VyX3N3eiA9IGRvbnRfbG93ZXJfc3d6OworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL2xvd2VyX3ZlY3Rvcl9pbnNlcnQuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl92ZWN0b3JfaW5zZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdjZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9sb3dlcl92ZWN0b3JfaW5zZXJ0LmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl9idWlsZGVyLmgiCisjaW5jbHVkZSAiaXJfcnZhbHVlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKwordXNpbmcgbmFtZXNwYWNlIGlyX2J1aWxkZXI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIHZlY3Rvcl9pbnNlcnRfdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICB2ZWN0b3JfaW5zZXJ0X3Zpc2l0b3IoYm9vbCBsb3dlcl9ub25jb25zdGFudF9pbmRleCkKKyAgICAgIDogcHJvZ3Jlc3MoZmFsc2UpLCBsb3dlcl9ub25jb25zdGFudF9pbmRleChsb3dlcl9ub25jb25zdGFudF9pbmRleCkKKyAgIHsKKyAgICAgIGZhY3RvcnkuaW5zdHJ1Y3Rpb25zID0gJmZhY3RvcnlfaW5zdHJ1Y3Rpb25zOworICAgfQorCisgICB2aXJ0dWFsIH52ZWN0b3JfaW5zZXJ0X3Zpc2l0b3IoKQorICAgeworICAgICAgYXNzZXJ0KGZhY3RvcnlfaW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkpOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydik7CisKKyAgIGlyX2ZhY3RvcnkgZmFjdG9yeTsKKyAgIGV4ZWNfbGlzdCBmYWN0b3J5X2luc3RydWN0aW9uczsKKyAgIGJvb2wgcHJvZ3Jlc3M7CisgICBib29sIGxvd2VyX25vbmNvbnN0YW50X2luZGV4OworfTsKKworfSAvKiBhbm9ueW1vdXMgbmFtZXNwYWNlICovCisKK3ZvaWQKK3ZlY3Rvcl9pbnNlcnRfdmlzaXRvcjo6aGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydikKK3sKKyAgIGlmICgqcnYgPT0gTlVMTCB8fCAoKnJ2KS0+aXJfdHlwZSAhPSBpcl90eXBlX2V4cHJlc3Npb24pCisgICAgICByZXR1cm47CisKKyAgIGlyX2V4cHJlc3Npb24gKmNvbnN0IGV4cHIgPSAoaXJfZXhwcmVzc2lvbiAqKSAqcnY7CisKKyAgIGlmIChsaWtlbHkoZXhwci0+b3BlcmF0aW9uICE9IGlyX3RyaW9wX3ZlY3Rvcl9pbnNlcnQpKQorICAgICAgcmV0dXJuOworCisgICBmYWN0b3J5Lm1lbV9jdHggPSByYWxsb2NfcGFyZW50KGV4cHIpOworCisgICBpcl9jb25zdGFudCAqY29uc3QgaWR4ID0gZXhwci0+b3BlcmFuZHNbMl0tPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKyAgIGlmIChpZHggIT0gTlVMTCkgeworICAgICAgLyogUmVwbGFjZSAodmVjdG9yX2luc2VydCAodmVjKSAoc2NhbGFyKSAoaW5kZXgpKSB3aXRoIGEgZGVyZWZlcmVuY2Ugb2YKKyAgICAgICAqIGEgbmV3IHRlbXBvcmFyeS4gIFRoZSBuZXcgdGVtcG9yYXJ5IGdldHMgYXNzaWduZWQgYXMKKyAgICAgICAqCisgICAgICAgKiAgICAgdCA9IHZlYworICAgICAgICogICAgIHQubWFzayA9IHNjYWxhcgorICAgICAgICoKKyAgICAgICAqIHdoZXJlIG1hc2sgaXMgdGhlIGNvbXBvbmVudCBzZWxlY3RlZCBieSBpbmRleC4KKyAgICAgICAqLworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHRlbXAgPQorICAgICAgICAgZmFjdG9yeS5tYWtlX3RlbXAoZXhwci0+b3BlcmFuZHNbMF0tPnR5cGUsICJ2ZWNfdG1wIik7CisKKyAgICAgIGNvbnN0IGludCBtYXNrID0gMSA8PCBpZHgtPnZhbHVlLmlbMF07CisKKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24odGVtcCwgZXhwci0+b3BlcmFuZHNbMF0pKTsKKyAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24odGVtcCwgZXhwci0+b3BlcmFuZHNbMV0sIG1hc2spKTsKKworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgICAgKnJ2ID0gbmV3KGZhY3RvcnkubWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGVtcCk7CisgICB9IGVsc2UgaWYgKHRoaXMtPmxvd2VyX25vbmNvbnN0YW50X2luZGV4KSB7CisgICAgICAvKiBSZXBsYWNlICh2ZWN0b3JfaW5zZXJ0ICh2ZWMpIChzY2FsYXIpIChpbmRleCkpIHdpdGggYSBkZXJlZmVyZW5jZSBvZgorICAgICAgICogYSBuZXcgdGVtcG9yYXJ5LiAgVGhlIG5ldyB0ZW1wb3JhcnkgZ2V0cyBhc3NpZ25lZCBhcworICAgICAgICoKKyAgICAgICAqICAgICB0ID0gdmVjCisgICAgICAgKiAgICAgaWYgKGluZGV4ID09IDApCisgICAgICAgKiAgICAgICAgIHQueCA9IHNjYWxhcgorICAgICAgICogICAgIGlmIChpbmRleCA9PSAxKQorICAgICAgICogICAgICAgICB0LnkgPSBzY2FsYXIKKyAgICAgICAqICAgICBpZiAoaW5kZXggPT0gMikKKyAgICAgICAqICAgICAgICAgdC56ID0gc2NhbGFyCisgICAgICAgKiAgICAgaWYgKGluZGV4ID09IDMpCisgICAgICAgKiAgICAgICAgIHQudyA9IHNjYWxhcgorICAgICAgICovCisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdGVtcCA9CisgICAgICAgICBmYWN0b3J5Lm1ha2VfdGVtcChleHByLT5vcGVyYW5kc1swXS0+dHlwZSwgInZlY190bXAiKTsKKworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHNyY190ZW1wID0KKyAgICAgICAgIGZhY3RvcnkubWFrZV90ZW1wKGV4cHItPm9wZXJhbmRzWzFdLT50eXBlLCAic3JjX3RlbXAiKTsKKworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbih0ZW1wLCBleHByLT5vcGVyYW5kc1swXSkpOworICAgICAgZmFjdG9yeS5lbWl0KGFzc2lnbihzcmNfdGVtcCwgZXhwci0+b3BlcmFuZHNbMV0pKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGV4cHItPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsgaSsrKSB7CisgICAgICAgICBpcl9jb25zdGFudCAqY29uc3QgY21wX2luZGV4ID0KKyAgICAgICAgICAgIG5ldyhmYWN0b3J5Lm1lbV9jdHgpIGlyX2NvbnN0YW50KGludChpKSk7CisKKyAgICAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCBjbXBfcmVzdWx0ID0KKyAgICAgICAgICAgIGZhY3RvcnkubWFrZV90ZW1wKGdsc2xfdHlwZTo6Ym9vbF90eXBlLCAiaW5kZXhfY29uZGl0aW9uIik7CisKKyAgICAgICAgIGZhY3RvcnkuZW1pdChhc3NpZ24oY21wX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwoZXhwci0+b3BlcmFuZHNbMl0tPmNsb25lKGZhY3RvcnkubWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBfaW5kZXgpKSk7CisKKyAgICAgICAgIGZhY3RvcnkuZW1pdChpZl90cmVlKGNtcF9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24odGVtcCwgc3JjX3RlbXAsIFdSSVRFTUFTS19YIDw8IGkpKSk7CisgICAgICB9CisKKyAgICAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICpydiA9IG5ldyhmYWN0b3J5Lm1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRlbXApOworICAgfQorCisgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKGZhY3RvcnkuaW5zdHJ1Y3Rpb25zKTsKK30KKworYm9vbAorbG93ZXJfdmVjdG9yX2luc2VydChleGVjX2xpc3QgKmluc3RydWN0aW9ucywgYm9vbCBsb3dlcl9ub25jb25zdGFudF9pbmRleCkKK3sKKyAgIHZlY3Rvcl9pbnNlcnRfdmlzaXRvciB2KGxvd2VyX25vbmNvbnN0YW50X2luZGV4KTsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL21haW4uY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQxZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9tYWluLmNwcApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4LCAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisvKiogQGZpbGUgbWFpbi5jcHAKKyAqCisgKiBUaGlzIGZpbGUgaXMgdGhlIG1haW4oKSByb3V0aW5lIGFuZCBzY2FmZm9sZGluZyBmb3IgcHJvZHVjaW5nCisgKiBidWlsdGluX2NvbXBpbGVyICh3aGljaCBkb2Vzbid0IGluY2x1ZGUgYnVpbHRpbnMgaXRzZWxmIGFuZCBpcyB1c2VkCisgKiB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgYnVpbHRpbl9mdW5jdGlvbi5jcHApLCBhbmQKKyAqIGZvciBnbHNsX2NvbXBpbGVyICh3aGljaCBkb2VzIGluY2x1ZGUgYnVpbHRpbnMgYW5kIGNhbiBiZSB1c2VkIHRvCisgKiBvZmZsaW5lIGNvbXBpbGUgR0xTTCBjb2RlIGFuZCBleGFtaW5lIHRoZSByZXN1bHRpbmcgR0xTTCBJUi4KKyAqLworCisjaW5jbHVkZSAiZ3B1LmgiCisjaW5jbHVkZSAicGlwZWxpbmUuaCIKKyNpbmNsdWRlICJjb21waWxlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb21waWxlci9tZXNhLXV0aWxzL3NyYy9nbHNsL3JhbGxvYy5oIgorI2luY2x1ZGUgInBpcGVsaW5lX2NvbXBpbGVyX2ludGVyZmFjZS5oIgorCisKK3N0YXRpYyBjaGFyKiBsb2FkX3Nwdl9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKnBzaXplKQoreworICAgIGxvbmcgaW50IHNpemU7CisgICAgdm9pZCAqc2hhZGVyX2NvZGU7CisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKKyAgICBpZiAoIWZwKSByZXR1cm4gTlVMTDsKKworICAgIGZzZWVrKGZwLCAwTCwgU0VFS19FTkQpOworICAgIHNpemUgPSBmdGVsbChmcCk7CisKKyAgICBmc2VlayhmcCwgMEwsIFNFRUtfU0VUKTsKKworICAgIHNoYWRlcl9jb2RlID0gbWFsbG9jKHNpemUpOworICAgIHNpemVfdCB0bXAgPSBmcmVhZChzaGFkZXJfY29kZSwgc2l6ZSwgMSwgZnApOworICAgICh2b2lkKSB0bXA7CisKKyAgICAqcHNpemUgPSBzaXplOworCisgICAgcmV0dXJuIChjaGFyICopIHNoYWRlcl9jb2RlOworfQorCisKK3N0YXRpYyBjaGFyKiBsb2FkX2dsc2xfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICpwc2l6ZSwgVmtTaGFkZXJTdGFnZUZsYWdCaXRzIHN0YWdlKQoreworICAgIGxvbmcgaW50IHNpemU7CisgICAgdm9pZCAqc2hhZGVyX2NvZGU7CisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmICghZnApIHJldHVybiBOVUxMOworCisgICAgZnNlZWsoZnAsIDBMLCBTRUVLX0VORCk7CisgICAgc2l6ZSA9IGZ0ZWxsKGZwKSArIHNpemVvZihpY2Rfc3B2X2hlYWRlcikgKyAxOworCisgICAgZnNlZWsoZnAsIDBMLCBTRUVLX1NFVCk7CisKKyAgICBzaGFkZXJfY29kZSA9IG1hbGxvYyhzaXplKTsKKyAgICBzaXplX3QgcyA9IGZyZWFkKChjaGFyICopc2hhZGVyX2NvZGUgKyBzaXplb2YoaWNkX3Nwdl9oZWFkZXIpLCBzaXplIC0gc2l6ZW9mKGljZF9zcHZfaGVhZGVyKSwgMSwgZnApOworICAgICh2b2lkKSBzOworICAgICgoY2hhciAqKXNoYWRlcl9jb2RlKVtzaXplLTFdID0gMDsKKworICAgIGljZF9zcHZfaGVhZGVyKiBoZWFkZXIgPSAoaWNkX3Nwdl9oZWFkZXIqKXNoYWRlcl9jb2RlOworICAgIGhlYWRlci0+bWFnaWMgPSBJQ0RfU1BWX01BR0lDOworICAgIGhlYWRlci0+dmVyc2lvbiA9IDA7IC8vIG5vdCBTUFYKKyAgICBoZWFkZXItPmdlbl9tYWdpYyA9IHN0YWdlOworCisgICAgKnBzaXplID0gc2l6ZTsKKworICAgIHJldHVybiAoY2hhciAqKSBzaGFkZXJfY29kZTsKK30KKworaW50IGR1bXBfYXN0ID0gMDsKK2ludCBkdW1wX2hpciA9IDA7CitpbnQgZHVtcF9saXIgPSAwOworaW50IGRvX2xpbmsgPSAwOworCitjb25zdCBzdHJ1Y3Qgb3B0aW9uIGNvbXBpbGVyX29wdHNbXSA9IHsKKyAgIHsgImR1bXAtYXN0Iiwgbm9fYXJndW1lbnQsICZkdW1wX2FzdCwgMSB9LAorICAgeyAiZHVtcC1oaXIiLCBub19hcmd1bWVudCwgJmR1bXBfaGlyLCAxIH0sCisgICB7ICJkdW1wLWxpciIsIG5vX2FyZ3VtZW50LCAmZHVtcF9saXIsIDEgfSwKKyAgIHsgImxpbmsiLCAgICAgbm9fYXJndW1lbnQsICZkb19saW5rLCAgMSB9LAorICAgeyAidmVyc2lvbiIsICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3YnIH0sCisgICB7IE5VTEwsIDAsIE5VTEwsIDAgfQorfTsKKworCitib29sIGNoZWNrRmlsZU5hbWUoY2hhciogZmlsZU5hbWUpCit7CisgICAgY29uc3QgdW5zaWduZWQgZmlsZU5hbWVMZW5ndGggPSBzdHJsZW4oZmlsZU5hbWUpOworICAgIGlmIChmaWxlTmFtZUxlbmd0aCA8IDUgfHwKKyAgICAgICAgICAgIHN0cm5jbXAoIi5zcHYiLCAmZmlsZU5hbWVbZmlsZU5hbWVMZW5ndGggLSA0XSwgNCkgIT0gMCkgeworICAgICAgICBwcmludGYoImZpbGUgbXVzdCBiZSAuc3B2LCAudmVydCwgLmdlb20sIG9yIC5mcmFnXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgY2hlY2tGaWxlRXh0KGNoYXIqIGZpbGVOYW1lLCBjb25zdCBjaGFyKiBleHQpCit7CisgICAgY29uc3QgdW5zaWduZWQgZmlsZU5hbWVMZW5ndGggPSBzdHJsZW4oZmlsZU5hbWUpOworICAgIGlmIChzdHJuY21wKGV4dCwgJmZpbGVOYW1lW2ZpbGVOYW1lTGVuZ3RoIC0gc3RybGVuKGV4dCldLCBzdHJsZW4oZXh0KSkgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgIGludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisKKyAgIHN3aXRjaCAoYXJnYykgeworICAgY2FzZSAyOgorICAgICAgIHsKKyAgICAgICAgICAgLy8gQ2FsbCB2a0NyZWF0ZVNoYWRlciBvbiB0aGUgc2luZ2xlIHNoYWRlcgorCisgICAgICAgICAgIHByaW50ZigiRnJvbnRlbmQgY29tcGlsZSAlc1xuIiwgYXJndlsxXSk7CisgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgIHZvaWQgKnNoYWRlckNvZGUgPSAwOworICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgICAgICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOworCisgICAgICAgICAgIGlmIChjaGVja0ZpbGVFeHQoYXJndlsxXSwgInZlcnQuc3B2IikpIHsKKyAgICAgICAgICAgICAgIHNoYWRlckNvZGUgPSBsb2FkX3Nwdl9maWxlKGFyZ3ZbMV0sICZzaXplKTsKKyAgICAgICAgICAgICAgIHN0YWdlID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7CisgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tGaWxlRXh0KGFyZ3ZbMV0sICJmcmFnLnNwdiIpKSB7CisgICAgICAgICAgICAgICBzaGFkZXJDb2RlID0gbG9hZF9zcHZfZmlsZShhcmd2WzFdLCAmc2l6ZSk7CisgICAgICAgICAgICAgICBzdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tGaWxlRXh0KGFyZ3ZbMV0sICJnZW9tLnNwdiIpKSB7CisgICAgICAgICAgICAgICBzaGFkZXJDb2RlID0gbG9hZF9zcHZfZmlsZShhcmd2WzFdLCAmc2l6ZSk7CisgICAgICAgICAgICAgICBzdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQ7CisgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tGaWxlRXh0KGFyZ3ZbMV0sICIuc3B2IikpIHsKKyAgICAgICAgICAgICAgIHNoYWRlckNvZGUgPSBsb2FkX3Nwdl9maWxlKGFyZ3ZbMV0sICZzaXplKTsKKyAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja0ZpbGVFeHQoYXJndlsxXSwgIi52ZXJ0IikpIHsKKyAgICAgICAgICAgICAgIHN0YWdlID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ7CisgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tGaWxlRXh0KGFyZ3ZbMV0sICIuZ2VvbSIpKSB7CisgICAgICAgICAgICAgICBzdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQ7CisgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tGaWxlRXh0KGFyZ3ZbMV0sICIuZnJhZyIpKSB7CisgICAgICAgICAgICAgICBzdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ7CisgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgaWYgKCFzaGFkZXJDb2RlKQorICAgICAgICAgICAgICAgc2hhZGVyQ29kZSA9IGxvYWRfZ2xzbF9maWxlKGFyZ3ZbMV0sICZzaXplLCBzdGFnZSk7CisKKyAgICAgICAgICAgYXNzZXJ0KHNoYWRlckNvZGUpOworCisgICAgICAgICAgIHN0cnVjdCBpbnRlbF9pciAqc2hhZGVyX3Byb2dyYW0gPSBzaGFkZXJfY3JlYXRlX2lyKE5VTEwsIHNoYWRlckNvZGUsIHNpemUsIHN0YWdlKTsKKyAgICAgICAgICAgYXNzZXJ0KHNoYWRlcl9wcm9ncmFtKTsKKworICAgICAgICAgICAvLyBTZXQgdXAgb25seSB0aGUgZmllbGRzIG5lZWRlZCBmb3IgYmFja2VuZCBjb21waWxlCisgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ncHUgZ3B1ID0geyAwIH07CisgICAgICAgICAgIGdwdS5nZW5fb3BhcXVlID0gSU5URUxfR0VOKDcuNSk7CisgICAgICAgICAgIGdwdS5ndCA9IDM7CisKKyAgICAgICAgICAgcHJpbnRmKCJCYWNrZW5kIGNvbXBpbGUgJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAgICAvLyBzdHJ1Y3QgdGltZXNwZWMgYmVmb3JlOworICAgICAgICAgICAvLyBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmJlZm9yZSk7CisgICAgICAgICAgIC8vIHVpbnQ2NF90IGJlZm9yZU5hbm9TZWNvbmRzID0gYmVmb3JlLnR2X25zZWMgKyBiZWZvcmUudHZfc2VjKklOVDY0X0MoMTAwMDAwMDAwMCk7CisKKyAgICAgICAgICAgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciBwaXBlX3NoYWRlcjsKKyAgICAgICAgICAgVmtSZXN1bHQgcmV0ID0gaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NvbXBpbGUoJnBpcGVfc2hhZGVyLCAmZ3B1LCBOVUxMLCBOVUxMLCBzaGFkZXJfcHJvZ3JhbSk7CisKKyAgICAgICAgICAgLy8gc3RydWN0IHRpbWVzcGVjIGFmdGVyOworICAgICAgICAgICAvLyBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFmdGVyKTsKKyAgICAgICAgICAgLy8gdWludDY0X3QgYWZ0ZXJOYW5vU2Vjb25kcyA9IGFmdGVyLnR2X25zZWMgKyBhZnRlci50dl9zZWMqSU5UNjRfQygxMDAwMDAwMDAwKTsKKyAgICAgICAgICAgLy8gcHJpbnRmKCJmaWxlOiAlcywgaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NvbXBpbGUgPSAlIiBQUkl1NjQgIiBtaWxsaXNlY29uZHNcbiIsIGFyZ3ZbMV0sIChhZnRlck5hbm9TZWNvbmRzIC0gYmVmb3JlTmFub1NlY29uZHMpLzEwMDAwMDApOworICAgICAgICAgICAvLyBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgIGludGVsX3BpcGVsaW5lX3NoYWRlcl9jbGVhbnVwKCZwaXBlX3NoYWRlciwgJmdwdSk7CisgICAgICAgICAgIHNoYWRlcl9kZXN0cm95X2lyKHNoYWRlcl9wcm9ncmFtKTsKKyAgICAgICAgfQorICAgICAgIGJyZWFrOworICAgY2FzZSAzOgorICAgICAgIC8vIENhbGwgdmtDcmVhdGVTaGFkZXIgb24gYm90aCBzaGFkZXJzLCB0aGVuIGNhbGwgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lPworICAgICAgIC8vIE9ubHkgbmVlZCB0byBob29rIHRoaXMgdXAgaWYgd2Ugc3RhcnQgaW52b2tpbmcgdGhlIGJhY2tlbmQgb25jZSBmb3IgdGhlIHdob2xlIHBpcGVsaW5lCisKKyAgICAgICBwcmludGYoIk11bHRpcGxlIHNoYWRlcnMgbm90IGhvb2tlZCB1cCB5ZXRcbiIpOworICAgICAgIGJyZWFrOworCisgICAgICAgLy8gRW5zdXJlIGJvdGggZmlsZW5hbWVzIGhhdmUgYSAuc3B2IGV4dGVuc2lvbgorICAgICAgIGlmICghY2hlY2tGaWxlTmFtZShhcmd2WzFdKSkKKyAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgICAgIGlmICghY2hlY2tGaWxlTmFtZShhcmd2WzJdKSkKKyAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworICAgICAgIHZvaWQgKnNoYWRlckNvZGVbMl07CisgICAgICAgc2l6ZV90IHNpemVbMl07CisgICAgICAgc3RydWN0IGludGVsX2lyICpyZXN1bHRbMl07CisKKyAgICAgICAvLyBDb21waWxlIGZpcnN0IHNoYWRlcgorICAgICAgIHNoYWRlckNvZGVbMF0gPSBsb2FkX3Nwdl9maWxlKGFyZ3ZbMV0sICZzaXplWzBdKTsKKyAgICAgICBhc3NlcnQoc2hhZGVyQ29kZVswXSk7CisgICAgICAgcHJpbnRmKCJDb21waWxpbmcgJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgIHJlc3VsdFswXSA9IHNoYWRlcl9jcmVhdGVfaXIoTlVMTCwgc2hhZGVyQ29kZVswXSwgc2l6ZVswXSwgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQpOworICAgICAgIGFzc2VydChyZXN1bHRbMF0pOworCisgICAgICAgLy8gQ29tcGlsZSBzZWNvbmQgc2hhZGVyCisgICAgICAgc2hhZGVyQ29kZVsxXSA9IGxvYWRfc3B2X2ZpbGUoYXJndlsyXSwgJnNpemVbMV0pOworICAgICAgIGFzc2VydChzaGFkZXJDb2RlWzFdKTsKKyAgICAgICBwcmludGYoIkNvbXBpbGluZyAlc1xuIiwgYXJndlsyXSk7CisgICAgICAgcmVzdWx0WzFdID0gc2hhZGVyX2NyZWF0ZV9pcihOVUxMLCBzaGFkZXJDb2RlWzFdLCBzaXplWzFdLCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUKTsKKyAgICAgICBhc3NlcnQocmVzdWx0WzFdKTsKKworCisgICAgICAgc2hhZGVyX2Rlc3Ryb3lfaXIocmVzdWx0WzBdKTsKKyAgICAgICBzaGFkZXJfZGVzdHJveV9pcihyZXN1bHRbMV0pOworCisgICAgICAgYnJlYWs7CisgICBjYXNlIDA6CisgICBjYXNlIDE6CisgICBkZWZhdWx0OgorICAgICAgIHByaW50ZigiUGxlYXNlIHByb3ZpZGUgb25lIC5zcHYsIC52ZXJ0IG9yIC5mcmFnIGZpbGUgYXMgaW5wdXRcbiIpOworICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9tZW1vcnlfbWFwLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL21lbW9yeV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzEzMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9tZW1vcnlfbWFwLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qIC0qLSBjKysgLSotICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIE1FTU9SWV9NQVBfSAorI2RlZmluZSBNRU1PUllfTUFQX0gKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJyYWxsb2MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHJlYWQgZGF0YQorICoKKyAqIENsYXNzIGNhbiByZWFkIGVpdGhlciBmcm9tIHVzZXIgZ2l2ZW4gbWVtb3J5IG9yIGZyb20gYSBmaWxlLiBPbiBMaW51eAorICogZmlsZSByZWFkaW5nIHdyYXBzIGFyb3VuZCB0aGUgUG9zaXggZnVuY3Rpb25zIGZvciBtYXBwaW5nIGEgZmlsZSBpbnRvCisgKiB0aGUgcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2UuIE90aGVyIE9TIG1heSBuZWVkIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgbWVtb3J5X21hcAoreworcHVibGljOgorICAgbWVtb3J5X21hcCgpIDoKKyAgICAgIGVycm9yKGZhbHNlKSwKKyAgICAgIG1vZGUobWVtb3J5X21hcDo6UkVBRF9NRU0pLAorICAgICAgY2FjaGVfc2l6ZSgwKSwKKyAgICAgIGNhY2hlX21tYXAoTlVMTCksCisgICAgICBjYWNoZV9tbWFwX3AoTlVMTCkKKyAgIHsKKyAgICAgIG1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgIH0KKworICAgLyogcmVhZCBmcm9tIGRpc2sgKi8KKyAgIGludCBtYXAoY29uc3QgY2hhciAqcGF0aCkKKyAgIHsKKyNpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCisgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2luZm87CisgICAgICBpZiAoc3RhdChwYXRoLCAmc3RhdF9pbmZvKSAhPSAwKQorICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICBtb2RlID0gbWVtb3J5X21hcDo6UkVBRF9NQVA7CisgICAgICBjYWNoZV9zaXplID0gc3RhdF9pbmZvLnN0X3NpemU7CisKKyAgICAgIGludCBmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworICAgICAgaWYgKGZkKSB7CisgICAgICAgICBjYWNoZV9tbWFwX3AgPSBjYWNoZV9tbWFwID0gKGNoYXIgKikKKyAgICAgICAgICAgIG1tYXAoTlVMTCwgY2FjaGVfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgcmV0dXJuIChjYWNoZV9tbWFwID09IE1BUF9GQUlMRUQpID8gLTEgOiAwOworICAgICAgfQorI2Vsc2UKKyAgICAgIC8qIEltcGxlbWVudGF0aW9uIGZvciBzeXN0ZW1zIHdpdGhvdXQgbW1hcCgpLiAqLworICAgICAgRklMRSAqaW4gPSBmb3BlbihwYXRoLCAiciIpOworICAgICAgaWYgKGluKSB7CisgICAgICAgICBmc2VlayhpbiwgMCwgU0VFS19FTkQpOworICAgICAgICAgY2FjaGVfc2l6ZSA9IGZ0ZWxsKGluKTsKKyAgICAgICAgIHJld2luZChpbik7CisKKyAgICAgICAgIGNhY2hlX21tYXAgPSByYWxsb2NfYXJyYXkobWVtX2N0eCwgY2hhciwgY2FjaGVfc2l6ZSk7CisKKyAgICAgICAgIGlmICghY2FjaGVfbW1hcCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgaWYgKGZyZWFkKGNhY2hlX21tYXAsIGNhY2hlX3NpemUsIDEsIGluKSAhPSAxKSB7CisgICAgICAgICAgICByYWxsb2NfZnJlZShjYWNoZV9tbWFwKTsKKyAgICAgICAgICAgIGNhY2hlX21tYXAgPSBOVUxMOworICAgICAgICAgfQorICAgICAgICAgY2FjaGVfbW1hcF9wID0gY2FjaGVfbW1hcDsKKyAgICAgICAgIGZjbG9zZShpbik7CisKKyAgICAgICAgIHJldHVybiAoY2FjaGVfbW1hcCA9PSBOVUxMKSA/IC0xIDogMDsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICAvKiByZWFkIGZyb20gbWVtb3J5ICovCisgICB2b2lkIG1hcChjb25zdCB2b2lkICptZW1vcnksIHNpemVfdCBzaXplKQorICAgeworICAgICAgY2FjaGVfbW1hcF9wID0gY2FjaGVfbW1hcCA9IChjaGFyICopIG1lbW9yeTsKKyAgICAgIGNhY2hlX3NpemUgPSBzaXplOworICAgfQorCisgICB+bWVtb3J5X21hcCgpIHsKKyNpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCisgICAgICBpZiAoY2FjaGVfbW1hcCAmJiBtb2RlID09IFJFQURfTUFQKSB7CisgICAgICAgICBtdW5tYXAoY2FjaGVfbW1hcCwgY2FjaGVfc2l6ZSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworICAgfQorCisgICAvKiBtb3ZlIHJlYWQgcG9pbnRlciBmb3J3YXJkICovCisgICBpbmxpbmUgdm9pZCBmZndkKGludCBsZW4pCisgICB7CisgICAgICBjYWNoZV9tbWFwX3AgKz0gbGVuOworICAgfQorCisgICBpbmxpbmUgdm9pZCBqdW1wKHVuc2lnbmVkIHBvcykKKyAgIHsKKyAgICAgIGNhY2hlX21tYXBfcCA9IGNhY2hlX21tYXAgKyBwb3M7CisgICB9CisKKyAgIC8qKgorICAgICogc2FmZXR5IGNoZWNrIHRvIGF2b2lkIHJlYWRpbmcgb3ZlciBjYWNoZV9zaXplLAorICAgICogcmV0dXJucyBib29sIGlmIGl0IGlzIHNhZmUgdG8gY29udGludWUgcmVhZGluZworICAgICovCisgICBib29sIHNhZmVfcmVhZCh1bnNpZ25lZCBzaXplKQorICAgeworICAgICAgaWYgKHBvc2l0aW9uKCkgKyBzaXplID4gY2FjaGVfc2l6ZSkKKyAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgIHJldHVybiAhZXJyb3I7CisgICB9CisKKyAgIC8qIHBvc2l0aW9uIG9mIHJlYWQgcG9pbnRlciAqLworICAgaW5saW5lIHVpbnQzMl90IHBvc2l0aW9uKCkKKyAgIHsKKyAgICAgIHJldHVybiBjYWNoZV9tbWFwX3AgLSBjYWNoZV9tbWFwOworICAgfQorCisgICBpbmxpbmUgY2hhciAqcmVhZF9zdHJpbmcoKQorICAgeworICAgICAgdWludDMyX3QgbGVuID0gcmVhZF91aW50MzJfdCgpOworCisgICAgICAvKiBOVUxMIHBvaW50ZXIgaXMgc3VwcG9ydGVkICovCisgICAgICBpZiAobGVuID09IDApCisgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgLyogZG9uJ3QgcmVhZCBvZmYgdGhlIGVuZCBvZiBjYWNoZSAqLworICAgICAgLyogVE9ETzogVW5kZXJzdGFuZCBob3cgdGhpcyBjYW4gaGFwcGVuIGFuZCBmaXggKi8KKyAgICAgIGlmIChsZW4gKyBwb3NpdGlvbigpID4gY2FjaGVfc2l6ZSkgeworICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIC8qIHZlcmlmeSB0aGF0IGxhc3QgY2hhcmFjdGVyIGlzIHRlcm1pbmF0b3IgKi8KKyAgICAgIGlmICgqKGNhY2hlX21tYXBfcCArIGxlbiAtIDEpICE9ICdcMCcpIHsKKyAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBjaGFyICpzdHIgPSByYWxsb2NfYXJyYXkobWVtX2N0eCwgY2hhciwgbGVuKTsKKyAgICAgIG1lbWNweShzdHIsIGNhY2hlX21tYXBfcCwgbGVuKTsKKyAgICAgIGZmd2QobGVuKTsKKyAgICAgIHJldHVybiBzdHI7CisgICB9CisKKy8qKgorICogcmVhZCBmdW5jdGlvbnMgcGVyIHR5cGUKKyAqLworI2RlZmluZSBERUNMX1JFQURFUih0eXBlKSB0eXBlIHJlYWRfICMjdHlwZSAoKSB7XAorICAgaWYgKCFzYWZlX3JlYWQoc2l6ZW9mKHR5cGUpKSlcCisgICAgICByZXR1cm4gMDtcCisgICBmZndkKHNpemVvZih0eXBlKSk7XAorICAgcmV0dXJuICoodHlwZSAqKSAoY2FjaGVfbW1hcF9wIC0gc2l6ZW9mKHR5cGUpKTtcCit9CisKKyAgIERFQ0xfUkVBREVSKGludDMyX3QpOworICAgREVDTF9SRUFERVIoaW50NjRfdCk7CisgICBERUNMX1JFQURFUih1aW50OF90KTsKKyAgIERFQ0xfUkVBREVSKHVpbnQzMl90KTsKKworICAgaW5saW5lIHVpbnQ4X3QgcmVhZF9ib29sKCkKKyAgIHsKKyAgICAgIHJldHVybiByZWFkX3VpbnQ4X3QoKTsKKyAgIH0KKworICAgaW5saW5lIHZvaWQgcmVhZCh2b2lkICpkc3QsIHNpemVfdCBzaXplKQorICAgeworICAgICAgaWYgKCFzYWZlX3JlYWQoc2l6ZSkpCisgICAgICAgICByZXR1cm47CisgICAgICBtZW1jcHkoZHN0LCBjYWNoZV9tbWFwX3AsIHNpemUpOworICAgICAgZmZ3ZChzaXplKTsKKyAgIH0KKworICAgLyogdG90YWwgc2l6ZSBvZiBtYXBwZWQgbWVtb3J5ICovCisgICBpbmxpbmUgaW50MzJfdCBzaXplKCkKKyAgIHsKKyAgICAgIHJldHVybiBjYWNoZV9zaXplOworICAgfQorCisgICBpbmxpbmUgYm9vbCBlcnJvcnMoKQorICAgeworICAgICAgcmV0dXJuIGVycm9yOworICAgfQorCitwcml2YXRlOgorCisgICB2b2lkICptZW1fY3R4OworCisgICAvKiBpZiBlcnJvcnMgaGF2ZSBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyAqLworICAgYm9vbCBlcnJvcjsKKworICAgLyogc3BlY2lmaWVzIGlmIHdlIGFyZSByZWFkaW5nIG1hcHBlZCBtZW1vcnkgb3IgdXNlciBwYXNzZWQgbWVtICovCisgICBlbnVtIHJlYWRfbW9kZSB7CisgICAgICBSRUFEX01FTSA9IDAsCisgICAgICBSRUFEX01BUAorICAgfTsKKworICAgaW50MzJfdCBtb2RlOworICAgdW5zaWduZWQgY2FjaGVfc2l6ZTsKKyAgIGNoYXIgKmNhY2hlX21tYXA7CisgICBjaGFyICpjYWNoZV9tbWFwX3A7Cit9OworI2VuZGlmIC8qIGlmZGVmIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBNRU1PUllfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbWVtb3J5X3dyaXRlci5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9tZW1vcnlfd3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4ZDExOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvbWVtb3J5X3dyaXRlci5oCkBAIC0wLDAgKzEsMjA0IEBACisvKiAtKi0gYysrIC0qLSAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBNRU1PUllfV1JJVEVSX0gKKyNkZWZpbmUgTUVNT1JZX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm1haW4vaGFzaF90YWJsZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKy8qKgorICogSGVscGVyIGNsYXNzIGZvciB3cml0aW5nIGRhdGEgdG8gbWVtb3J5CisgKgorICogVGhpcyBjbGFzcyBtYWludGFpbnMgYSBkeW5hbWljYWxseS1zaXplZCBtZW1vcnkgYnVmZmVyIGFuZCBhbGxvd3MKKyAqIGZvciBkYXRhIHRvIGJlIGVmZmljaWVudGx5IGFwcGVuZGVkIHRvIGl0IHdpdGggYXV0b21hdGljIHJlc2l6aW5nLgorICovCitjbGFzcyBtZW1vcnlfd3JpdGVyCit7CitwdWJsaWM6CisgICBtZW1vcnlfd3JpdGVyKCkgOgorICAgICAgbWVtb3J5KE5VTEwpLAorICAgICAgY3Vycl9zaXplKDApLAorICAgICAgcG9zKDApLAorICAgICAgdW5pcXVlX2lkX2NvdW50ZXIoMCkKKyAgIHsKKyAgICAgIGRhdGFfaGFzaCA9IF9tZXNhX2hhc2hfdGFibGVfY3JlYXRlKDAsIGludF9lcXVhbCk7CisgICAgICBoYXNoX3ZhbHVlID0gX21lc2FfaGFzaF9kYXRhKHRoaXMsIHNpemVvZihtZW1vcnlfd3JpdGVyKSk7CisgICB9CisKKyAgIH5tZW1vcnlfd3JpdGVyKCkKKyAgIHsKKyAgICAgIGZyZWUobWVtb3J5KTsKKyAgICAgIF9tZXNhX2hhc2hfdGFibGVfZGVzdHJveShkYXRhX2hhc2gsIE5VTEwpOworICAgfQorCisgICAvKiB1c2VyIHdhbnRzIHRvIGNsYWltIHRoZSBtZW1vcnkgKi8KKyAgIGNoYXIgKnJlbGVhc2VfbWVtb3J5KHNpemVfdCAqc2l6ZSkKKyAgIHsKKyAgICAgIC8qIGZpbmFsIHJlYWxsb2MgdG8gZnJlZSBhbGxvY2F0ZWQgYnV0IHVudXNlZCBtZW1vcnkgKi8KKyAgICAgIGNoYXIgKnJlc3VsdCA9IChjaGFyICopIHJlYWxsb2MobWVtb3J5LCBwb3MpOworICAgICAgKnNpemUgPSBwb3M7CisgICAgICBtZW1vcnkgPSBOVUxMOworICAgICAgY3Vycl9zaXplID0gMDsKKyAgICAgIHBvcyA9IDA7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisvKioKKyAqIHdyaXRlIGZ1bmN0aW9ucyBwZXIgdHlwZQorICovCisjZGVmaW5lIERFQ0xfV1JJVEVSKHR5cGUpIHZvaWQgd3JpdGVfICMjdHlwZSAoY29uc3QgdHlwZSBkYXRhKSB7XAorICAgd3JpdGUoJmRhdGEsIHNpemVvZih0eXBlKSk7XAorfQorCisgICBERUNMX1dSSVRFUihpbnQzMl90KTsKKyAgIERFQ0xfV1JJVEVSKGludDY0X3QpOworICAgREVDTF9XUklURVIodWludDhfdCk7CisgICBERUNMX1dSSVRFUih1aW50MzJfdCk7CisKKyAgIHZvaWQgd3JpdGVfYm9vbChib29sIGRhdGEpCisgICB7CisgICAgICB1aW50OF90IHZhbCA9IGRhdGE7CisgICAgICB3cml0ZV91aW50OF90KHZhbCk7CisgICB9CisKKyAgIC8qIHdyaXRlIGZ1bmN0aW9uIHRoYXQgcmVhbGxvY2F0ZXMgbW9yZSBtZW1vcnkgaWYgcmVxdWlyZWQgKi8KKyAgIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgaW50IHNpemUpCisgICB7CisgICAgICBpZiAoIW1lbW9yeSB8fCBwb3MgPiAoY3Vycl9zaXplIC0gc2l6ZSkpCisgICAgICAgICBpZiAoIWdyb3coc2l6ZSkpIHsKKyAgICAgICAgICAgIGFzc2VydCghIk91dCBvZiBtZW1vcnkgd2hpbGUgc2VyaWFsaXppbmcgYSBzaGFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKworICAgICAgbWVtY3B5KG1lbW9yeSArIHBvcywgZGF0YSwgc2l6ZSk7CisKKyAgICAgIHBvcyArPSBzaXplOworICAgfQorCisgICB2b2lkIG92ZXJ3cml0ZShjb25zdCB2b2lkICpkYXRhLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkKKyAgIHsKKyAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIHNpemUgPiBwb3MpIHsKKyAgICAgICAgIGFzc2VydCghIkF0dGVtcHQgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcyB3aGlsZSBzZXJpYWxpemluZyBhIHNoYWRlciIpOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBtZW1jcHkobWVtb3J5ICsgb2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgIH0KKworICAgLyogbGVuZ3RoIGlzIHdyaXR0ZW4gdG8gbWFrZSByZWFkaW5nIHNhZmUsIHdlIHdyaXRlIGxlbiArIDEgdG8gYmUKKyAgICAqIGFibGUgdG8gbWFrZSBkaXN0aW5jdGlvbiBiZXR3ZWVuICIiIGFuZCBOVUxMCisgICAgKi8KKyAgIHZvaWQgd3JpdGVfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKKyAgIHsKKyAgICAgIHVpbnQzMl90IGxlbiA9IHN0ciA/IHN0cmxlbihzdHIpICsgMSA6IDA7CisgICAgICB3cml0ZV91aW50MzJfdChsZW4pOworCisgICAgICAvKiBzZXJpYWxpemUgc3RyaW5nICsgdGVybWluYXRvciBmb3IgbW9yZSBjb252aW5pZW50IHBhcnNpbmcuICovCisgICAgICBpZiAoc3RyKQorICAgICAgICAgd3JpdGUoc3RyLCBsZW4pOworICAgfQorCisgICB1bnNpZ25lZCBwb3NpdGlvbigpCisgICB7CisgICAgICByZXR1cm4gcG9zOworICAgfQorCisgICAvKioKKyAgICAqIENvbnZlcnQgdGhlIGdpdmVuIHBvaW50ZXIgaW50byBhIHNtYWxsIGludGVnZXIgdW5pcXVlIElELiAgSW4gb3RoZXIKKyAgICAqIHdvcmRzLCBpZiBtYWtlX3VuaXF1ZV9pZCgpIGhhcyBwcmV2aW91c2x5IGJlZW4gY2FsbGVkIHdpdGggdGhpcyBwb2ludGVyLAorICAgICogcmV0dXJuIHRoZSBzYW1lIElEIHRoYXQgd2FzIHJldHVybmVkIGxhc3QgdGltZS4gIElmIHRoaXMgaXMgdGhlIGZpcnN0CisgICAgKiBjYWxsIHRvIG1ha2VfdW5pcXVlX2lkKCkgd2l0aCB0aGlzIHBvaW50ZXIsIHJldHVybiBhIGZyZXNoIElELgorICAgICoKKyAgICAqIFJldHVybiB2YWx1ZSBpcyB0cnVlIGlmIHRoZSBwb2ludGVyIGhhcyBiZWVuIHNlZW4gYmVmb3JlLCBmYWxzZQorICAgICogb3RoZXJ3aXNlLgorICAgICovCisgICBib29sIG1ha2VfdW5pcXVlX2lkKGNvbnN0IHZvaWQgKnB0ciwgdWludDMyX3QgKmlkX291dCkKKyAgIHsKKyAgICAgIGhhc2hfZW50cnkgKmVudHJ5ID0KKyAgICAgICAgIF9tZXNhX2hhc2hfdGFibGVfc2VhcmNoKGRhdGFfaGFzaCwgX21lc2FfaGFzaF9wb2ludGVyKHB0ciksIHB0cik7CisgICAgICBpZiAoZW50cnkgIT0gTlVMTCkgeworICAgICAgICAgKmlkX291dCA9ICh1aW50MzJfdCkgKGludHB0cl90KSBlbnRyeS0+ZGF0YTsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIE5vdGU6IGhhc2h0YWJsZSB1c2VzIDAgdG8gcmVwcmVzZW50ICJlbnRyeSBub3QgZm91bmQiIHNvIG91cgorICAgICAgICAgICogdW5pcXVlIElEJ3MgbmVlZCB0byBzdGFydCBhdCAxLiAgSGVuY2UsIHByZWluY3JlbWVudAorICAgICAgICAgICogdW5pcXVlX2lkX2NvdW50ZXIuCisgICAgICAgICAgKi8KKyAgICAgICAgICppZF9vdXQgPSArK3RoaXMtPnVuaXF1ZV9pZF9jb3VudGVyOworICAgICAgICAgX21lc2FfaGFzaF90YWJsZV9pbnNlcnQoZGF0YV9oYXNoLCBfbWVzYV9oYXNoX3BvaW50ZXIocHRyKSwgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgKGludHB0cl90KSAqaWRfb3V0KTsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgIH0KKworcHJpdmF0ZToKKworICAgLyogcmVhbGxvY2F0ZSBtb3JlIG1lbW9yeSAqLworICAgYm9vbCBncm93KGludCBzaXplKQorICAgeworICAgICAgdW5zaWduZWQgbmV3X3NpemUgPSAyICogKGN1cnJfc2l6ZSArIHNpemUpOworICAgICAgY2hhciAqbW9yZV9tZW0gPSAoY2hhciAqKSByZWFsbG9jKG1lbW9yeSwgbmV3X3NpemUpOworICAgICAgaWYgKG1vcmVfbWVtID09IE5VTEwpIHsKKyAgICAgICAgIGZyZWUobWVtb3J5KTsKKyAgICAgICAgIG1lbW9yeSA9IE5VTEw7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICAgbWVtb3J5ID0gbW9yZV9tZW07CisgICAgICAgICBjdXJyX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorCisgICAvKiBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICBjaGFyICptZW1vcnk7CisKKyAgIC8qIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2hvbGUgYWxsb2NhdGlvbiAqLworICAgaW50IGN1cnJfc2l6ZTsKKworICAgLyogd3JpdGUgcG9zaXRpb24gLyBzaXplIG9mIHRoZSBkYXRhIHdyaXR0ZW4gKi8KKyAgIGludCBwb3M7CisKKyAgIC8qIHRoaXMgaGFzaCBjYW4gYmUgdXNlZCB0byByZWZlciB0byBkYXRhIGFscmVhZHkgd3JpdHRlbgorICAgICogdG8gc2tpcCBzZXF1ZW50aWFsIHdyaXRlcyBvZiB0aGUgc2FtZSBkYXRhCisgICAgKi8KKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpkYXRhX2hhc2g7CisgICB1aW50MzJfdCBoYXNoX3ZhbHVlOworICAgdW5zaWduZWQgdW5pcXVlX2lkX2NvdW50ZXI7CisKKyAgIHN0YXRpYyBib29sIGludF9lcXVhbChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQorICAgeworICAgICAgcmV0dXJuIGEgPT0gYjsKKyAgIH0KKworfTsKKworI2VuZGlmIC8qIGlmZGVmIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBNRU1PUllfV1JJVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2FsZ2VicmFpYy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9hbGdlYnJhaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTUzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9hbGdlYnJhaWMuY3BwCkBAIC0wLDAgKzEsNjU3IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfYWxnZWJyYWljLmNwcAorICoKKyAqIFRha2VzIGFkdmFudGFnZSBvZiBhc3NvY2lhdGlvbiwgY29tbXV0aXZpdHksIGFuZCBvdGhlciBhbGdlYnJhaWMKKyAqIHByb3BlcnRpZXMgdG8gc2ltcGxpZnkgZXhwcmVzc2lvbnMuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX3J2YWx1ZV92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAiaXJfYnVpbGRlci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGlyX2J1aWxkZXI7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogVmlzaXRvciBjbGFzcyBmb3IgcmVwbGFjaW5nIGV4cHJlc3Npb25zIHdpdGggaXJfY29uc3RhbnQgdmFsdWVzLgorICovCisKK2NsYXNzIGlyX2FsZ2VicmFpY192aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX2FsZ2VicmFpY192aXNpdG9yKGJvb2wgbmF0aXZlX2ludGVnZXJzKQorICAgeworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIHRoaXMtPm1lbV9jdHggPSBOVUxMOworICAgICAgdGhpcy0+bmF0aXZlX2ludGVnZXJzID0gbmF0aXZlX2ludGVnZXJzOworICAgfQorCisgICB2aXJ0dWFsIH5pcl9hbGdlYnJhaWNfdmlzaXRvcigpCisgICB7CisgICB9CisKKyAgIGlyX3J2YWx1ZSAqaGFuZGxlX2V4cHJlc3Npb24oaXJfZXhwcmVzc2lvbiAqaXIpOworICAgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSk7CisgICBib29sIHJlYXNzb2NpYXRlX2NvbnN0YW50KGlyX2V4cHJlc3Npb24gKmlyMSwKKwkJCSAgICAgaW50IGNvbnN0X2luZGV4LAorCQkJICAgICBpcl9jb25zdGFudCAqY29uc3RhbnQsCisJCQkgICAgIGlyX2V4cHJlc3Npb24gKmlyMik7CisgICB2b2lkIHJlYXNzb2NpYXRlX29wZXJhbmRzKGlyX2V4cHJlc3Npb24gKmlyMSwKKwkJCSAgICAgaW50IG9wMSwKKwkJCSAgICAgaXJfZXhwcmVzc2lvbiAqaXIyLAorCQkJICAgICBpbnQgb3AyKTsKKyAgIGlyX3J2YWx1ZSAqc3dpenpsZV9pZl9yZXF1aXJlZChpcl9leHByZXNzaW9uICpleHByLAorCQkJCSAgaXJfcnZhbHVlICpvcGVyYW5kKTsKKworICAgdm9pZCAqbWVtX2N0eDsKKworICAgYm9vbCBuYXRpdmVfaW50ZWdlcnM7CisgICBib29sIHByb2dyZXNzOworfTsKKworfSAvKiB1bm5hbWVkIG5hbWVzcGFjZSAqLworCitzdGF0aWMgaW5saW5lIGJvb2wKK2lzX3ZlY196ZXJvKGlyX2NvbnN0YW50ICppcikKK3sKKyAgIHJldHVybiAoaXIgPT0gTlVMTCkgPyBmYWxzZSA6IGlyLT5pc196ZXJvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraXNfdmVjX29uZShpcl9jb25zdGFudCAqaXIpCit7CisgICByZXR1cm4gKGlyID09IE5VTEwpID8gZmFsc2UgOiBpci0+aXNfb25lKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraXNfdmVjX3R3byhpcl9jb25zdGFudCAqaXIpCit7CisgICByZXR1cm4gKGlyID09IE5VTEwpID8gZmFsc2UgOiBpci0+aXNfdmFsdWUoMi4wLCAyKTsKK30KKworc3RhdGljIGlubGluZSBib29sCitpc192ZWNfbmVnYXRpdmVfb25lKGlyX2NvbnN0YW50ICppcikKK3sKKyAgIHJldHVybiAoaXIgPT0gTlVMTCkgPyBmYWxzZSA6IGlyLT5pc19uZWdhdGl2ZV9vbmUoKTsKK30KKworc3RhdGljIGlubGluZSBib29sCitpc192ZWNfYmFzaXMoaXJfY29uc3RhbnQgKmlyKQoreworICAgcmV0dXJuIChpciA9PSBOVUxMKSA/IGZhbHNlIDogaXItPmlzX2Jhc2lzKCk7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfdHlwZShpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlmIChpci0+b3BlcmFuZHNbMF0tPnR5cGUtPmlzX3ZlY3RvcigpKQorICAgICAgaXItPnR5cGUgPSBpci0+b3BlcmFuZHNbMF0tPnR5cGU7CisgICBlbHNlCisgICAgICBpci0+dHlwZSA9IGlyLT5vcGVyYW5kc1sxXS0+dHlwZTsKK30KKwordm9pZAoraXJfYWxnZWJyYWljX3Zpc2l0b3I6OnJlYXNzb2NpYXRlX29wZXJhbmRzKGlyX2V4cHJlc3Npb24gKmlyMSwKKwkJCQkJICAgaW50IG9wMSwKKwkJCQkJICAgaXJfZXhwcmVzc2lvbiAqaXIyLAorCQkJCQkgICBpbnQgb3AyKQoreworICAgaXJfcnZhbHVlICp0ZW1wID0gaXIyLT5vcGVyYW5kc1tvcDJdOworICAgaXIyLT5vcGVyYW5kc1tvcDJdID0gaXIxLT5vcGVyYW5kc1tvcDFdOworICAgaXIxLT5vcGVyYW5kc1tvcDFdID0gdGVtcDsKKworICAgLyogVXBkYXRlIHRoZSB0eXBlIG9mIGlyMi4gIFRoZSB0eXBlIG9mIGlyMSB3b24ndCBoYXZlIGNoYW5nZWQgLS0KKyAgICAqIGJhc2UgdHlwZXMgbWF0Y2hlZCwgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIDIKKyAgICAqIGJpbm9wcyBpcyBzdGlsbCBhIHZlY3RvciBpZiBhbnkgb2YgdGhlbSB3ZXJlLgorICAgICovCisgICB1cGRhdGVfdHlwZShpcjIpOworCisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7Cit9CisKKy8qKgorICogUmVhc3NvY2lhdGVzIGEgY29uc3RhbnQgZG93biBhIHRyZWUgb2YgYWRkcyBvciBtdWx0aXBsaWVzLgorICoKKyAqIENvbnNpZGVyICgyICogKGEgKiAoYiAqIDAuNSkpKS4gIFdlIHdhbnQgdG8gc2VuZCB1cCB3aXRoIGEgKiBiLgorICovCitib29sCitpcl9hbGdlYnJhaWNfdmlzaXRvcjo6cmVhc3NvY2lhdGVfY29uc3RhbnQoaXJfZXhwcmVzc2lvbiAqaXIxLCBpbnQgY29uc3RfaW5kZXgsCisJCQkJCSAgIGlyX2NvbnN0YW50ICpjb25zdGFudCwKKwkJCQkJICAgaXJfZXhwcmVzc2lvbiAqaXIyKQoreworICAgaWYgKCFpcjIgfHwgaXIxLT5vcGVyYXRpb24gIT0gaXIyLT5vcGVyYXRpb24pCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIERvbid0IHdhbnQgdG8gZXZlbiB0aGluayBhYm91dCBtYXRyaWNlcy4gKi8KKyAgIGlmIChpcjEtPm9wZXJhbmRzWzBdLT50eXBlLT5pc19tYXRyaXgoKSB8fAorICAgICAgIGlyMS0+b3BlcmFuZHNbMV0tPnR5cGUtPmlzX21hdHJpeCgpIHx8CisgICAgICAgaXIyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfbWF0cml4KCkgfHwKKyAgICAgICBpcjItPm9wZXJhbmRzWzFdLT50eXBlLT5pc19tYXRyaXgoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaXJfY29uc3RhbnQgKmlyMl9jb25zdFsyXTsKKyAgIGlyMl9jb25zdFswXSA9IGlyMi0+b3BlcmFuZHNbMF0tPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKyAgIGlyMl9jb25zdFsxXSA9IGlyMi0+b3BlcmFuZHNbMV0tPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKworICAgaWYgKGlyMl9jb25zdFswXSAmJiBpcjJfY29uc3RbMV0pCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmIChpcjJfY29uc3RbMF0pIHsKKyAgICAgIHJlYXNzb2NpYXRlX29wZXJhbmRzKGlyMSwgY29uc3RfaW5kZXgsIGlyMiwgMSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0gZWxzZSBpZiAoaXIyX2NvbnN0WzFdKSB7CisgICAgICByZWFzc29jaWF0ZV9vcGVyYW5kcyhpcjEsIGNvbnN0X2luZGV4LCBpcjIsIDApOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIGlmIChyZWFzc29jaWF0ZV9jb25zdGFudChpcjEsIGNvbnN0X2luZGV4LCBjb25zdGFudCwKKwkJCSAgICBpcjItPm9wZXJhbmRzWzBdLT5hc19leHByZXNzaW9uKCkpKSB7CisgICAgICB1cGRhdGVfdHlwZShpcjIpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIGlmIChyZWFzc29jaWF0ZV9jb25zdGFudChpcjEsIGNvbnN0X2luZGV4LCBjb25zdGFudCwKKwkJCSAgICBpcjItPm9wZXJhbmRzWzFdLT5hc19leHByZXNzaW9uKCkpKSB7CisgICAgICB1cGRhdGVfdHlwZShpcjIpOworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKKyAgIHJldHVybiBmYWxzZTsKK30KKworLyogV2hlbiBlbGltaW5hdGluZyBhbiBleHByZXNzaW9uIGFuZCBqdXN0IHJldHVybmluZyBvbmUgb2YgaXRzIG9wZXJhbmRzLAorICogd2UgbWF5IG5lZWQgdG8gc3dpenpsZSB0aGF0IG9wZXJhbmQgb3V0IHRvIGEgdmVjdG9yIGlmIHRoZSBleHByZXNzaW9uIHdhcworICogdmVjdG9yIHR5cGUuCisgKi8KK2lyX3J2YWx1ZSAqCitpcl9hbGdlYnJhaWNfdmlzaXRvcjo6c3dpenpsZV9pZl9yZXF1aXJlZChpcl9leHByZXNzaW9uICpleHByLAorCQkJCQkgIGlyX3J2YWx1ZSAqb3BlcmFuZCkKK3sKKyAgIGlmIChleHByLT50eXBlLT5pc192ZWN0b3IoKSAmJiBvcGVyYW5kLT50eXBlLT5pc19zY2FsYXIoKSkgeworICAgICAgcmV0dXJuIG5ldyhtZW1fY3R4KSBpcl9zd2l6emxlKG9wZXJhbmQsIDAsIDAsIDAsIDAsCisJCQkJICAgICBleHByLT50eXBlLT52ZWN0b3JfZWxlbWVudHMpOworICAgfSBlbHNlCisgICAgICByZXR1cm4gb3BlcmFuZDsKK30KKworaXJfcnZhbHVlICoKK2lyX2FsZ2VicmFpY192aXNpdG9yOjpoYW5kbGVfZXhwcmVzc2lvbihpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlyX2NvbnN0YW50ICpvcF9jb25zdFs0XSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKKyAgIGlyX2V4cHJlc3Npb24gKm9wX2V4cHJbNF0gPSB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgYXNzZXJ0KGlyLT5nZXRfbnVtX29wZXJhbmRzKCkgPD0gNCk7CisgICBmb3IgKGkgPSAwOyBpIDwgaXItPmdldF9udW1fb3BlcmFuZHMoKTsgaSsrKSB7CisgICAgICBpZiAoaXItPm9wZXJhbmRzW2ldLT50eXBlLT5pc19tYXRyaXgoKSkKKwkgcmV0dXJuIGlyOworCisgICAgICBvcF9jb25zdFtpXSA9IGlyLT5vcGVyYW5kc1tpXS0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworICAgICAgb3BfZXhwcltpXSA9IGlyLT5vcGVyYW5kc1tpXS0+YXNfZXhwcmVzc2lvbigpOworICAgfQorCisgICBpZiAodGhpcy0+bWVtX2N0eCA9PSBOVUxMKQorICAgICAgdGhpcy0+bWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICBzd2l0Y2ggKGlyLT5vcGVyYXRpb24pIHsKKyAgIGNhc2UgaXJfdW5vcF9iaXRfbm90OgorICAgICAgaWYgKG9wX2V4cHJbMF0gJiYgb3BfZXhwclswXS0+b3BlcmF0aW9uID09IGlyX3Vub3BfYml0X25vdCkKKyAgICAgICAgIHJldHVybiBvcF9leHByWzBdLT5vcGVyYW5kc1swXTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfYWJzOgorICAgICAgaWYgKG9wX2V4cHJbMF0gPT0gTlVMTCkKKwkgYnJlYWs7CisKKyAgICAgIHN3aXRjaCAob3BfZXhwclswXS0+b3BlcmF0aW9uKSB7CisgICAgICBjYXNlIGlyX3Vub3BfYWJzOgorICAgICAgY2FzZSBpcl91bm9wX25lZzoKKyAgICAgICAgIHJldHVybiBhYnMob3BfZXhwclswXS0+b3BlcmFuZHNbMF0pOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9uZWc6CisgICAgICBpZiAob3BfZXhwclswXSA9PSBOVUxMKQorCSBicmVhazsKKworICAgICAgaWYgKG9wX2V4cHJbMF0tPm9wZXJhdGlvbiA9PSBpcl91bm9wX25lZykgeworICAgICAgICAgcmV0dXJuIG9wX2V4cHJbMF0tPm9wZXJhbmRzWzBdOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9leHA6CisgICAgICBpZiAob3BfZXhwclswXSA9PSBOVUxMKQorCSBicmVhazsKKworICAgICAgaWYgKG9wX2V4cHJbMF0tPm9wZXJhdGlvbiA9PSBpcl91bm9wX2xvZykgeworICAgICAgICAgcmV0dXJuIG9wX2V4cHJbMF0tPm9wZXJhbmRzWzBdOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9sb2c6CisgICAgICBpZiAob3BfZXhwclswXSA9PSBOVUxMKQorCSBicmVhazsKKworICAgICAgaWYgKG9wX2V4cHJbMF0tPm9wZXJhdGlvbiA9PSBpcl91bm9wX2V4cCkgeworICAgICAgICAgcmV0dXJuIG9wX2V4cHJbMF0tPm9wZXJhbmRzWzBdOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdW5vcF9leHAyOgorICAgICAgaWYgKG9wX2V4cHJbMF0gPT0gTlVMTCkKKwkgYnJlYWs7CisKKyAgICAgIGlmIChvcF9leHByWzBdLT5vcGVyYXRpb24gPT0gaXJfdW5vcF9sb2cyKSB7CisgICAgICAgICByZXR1cm4gb3BfZXhwclswXS0+b3BlcmFuZHNbMF07CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX2xvZzI6CisgICAgICBpZiAob3BfZXhwclswXSA9PSBOVUxMKQorCSBicmVhazsKKworICAgICAgaWYgKG9wX2V4cHJbMF0tPm9wZXJhdGlvbiA9PSBpcl91bm9wX2V4cDIpIHsKKyAgICAgICAgIHJldHVybiBvcF9leHByWzBdLT5vcGVyYW5kc1swXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3Vub3BfbG9naWNfbm90OiB7CisgICAgICBlbnVtIGlyX2V4cHJlc3Npb25fb3BlcmF0aW9uIG5ld19vcCA9IGlyX3Vub3BfbG9naWNfbm90OworCisgICAgICBpZiAob3BfZXhwclswXSA9PSBOVUxMKQorCSBicmVhazsKKworICAgICAgc3dpdGNoIChvcF9leHByWzBdLT5vcGVyYXRpb24pIHsKKyAgICAgIGNhc2UgaXJfYmlub3BfbGVzczogICAgbmV3X29wID0gaXJfYmlub3BfZ2VxdWFsOyAgYnJlYWs7CisgICAgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6IG5ld19vcCA9IGlyX2Jpbm9wX2xlcXVhbDsgIGJyZWFrOworICAgICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6ICBuZXdfb3AgPSBpcl9iaW5vcF9ncmVhdGVyOyBicmVhazsKKyAgICAgIGNhc2UgaXJfYmlub3BfZ2VxdWFsOiAgbmV3X29wID0gaXJfYmlub3BfbGVzczsgICAgYnJlYWs7CisgICAgICBjYXNlIGlyX2Jpbm9wX2VxdWFsOiAgIG5ld19vcCA9IGlyX2Jpbm9wX25lcXVhbDsgIGJyZWFrOworICAgICAgY2FzZSBpcl9iaW5vcF9uZXF1YWw6ICBuZXdfb3AgPSBpcl9iaW5vcF9lcXVhbDsgICBicmVhazsKKyAgICAgIGNhc2UgaXJfYmlub3BfYWxsX2VxdWFsOiAgIG5ld19vcCA9IGlyX2Jpbm9wX2FueV9uZXF1YWw7ICBicmVhazsKKyAgICAgIGNhc2UgaXJfYmlub3BfYW55X25lcXVhbDogIG5ld19vcCA9IGlyX2Jpbm9wX2FsbF9lcXVhbDsgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkgLyogVGhlIGRlZmF1bHQgY2FzZSBoYW5kbGVyIGlzIGhlcmUgdG8gc2lsZW5jZSBhIHdhcm5pbmcgZnJvbSBHQ0MuCisJICAqLworCSBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKG5ld19vcCAhPSBpcl91bm9wX2xvZ2ljX25vdCkgeworCSByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2V4cHJlc3Npb24obmV3X29wLAorCQkJCQkgICBpci0+dHlwZSwKKwkJCQkJICAgb3BfZXhwclswXS0+b3BlcmFuZHNbMF0sCisJCQkJCSAgIG9wX2V4cHJbMF0tPm9wZXJhbmRzWzFdKTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGNhc2UgaXJfYmlub3BfYWRkOgorICAgICAgaWYgKGlzX3ZlY196ZXJvKG9wX2NvbnN0WzBdKSkKKwkgcmV0dXJuIGlyLT5vcGVyYW5kc1sxXTsKKyAgICAgIGlmIChpc192ZWNfemVybyhvcF9jb25zdFsxXSkpCisJIHJldHVybiBpci0+b3BlcmFuZHNbMF07CisKKyAgICAgIC8qIFJlYXNzb2NpYXRlIGFkZGl0aW9uIG9mIGNvbnN0YW50cyBzbyB0aGF0IHdlIGNhbiBkbyBjb25zdGFudAorICAgICAgICogZm9sZGluZy4KKyAgICAgICAqLworICAgICAgaWYgKG9wX2NvbnN0WzBdICYmICFvcF9jb25zdFsxXSkKKwkgcmVhc3NvY2lhdGVfY29uc3RhbnQoaXIsIDAsIG9wX2NvbnN0WzBdLCBvcF9leHByWzFdKTsKKyAgICAgIGlmIChvcF9jb25zdFsxXSAmJiAhb3BfY29uc3RbMF0pCisJIHJlYXNzb2NpYXRlX2NvbnN0YW50KGlyLCAxLCBvcF9jb25zdFsxXSwgb3BfZXhwclswXSk7CisKKyAgICAgIC8qIFJlcGxhY2UgKC14ICsgeSkgKiBhICsgeCBhbmQgY29tbXV0YXRpdmUgdmFyaWF0aW9ucyB3aXRoIGxycCh4LCB5LCBhKS4KKyAgICAgICAqCisgICAgICAgKiAoLXggKyB5KSAqIGEgKyB4CisgICAgICAgKiAoeCAqIC1hKSArICh5ICogYSkgKyB4CisgICAgICAgKiB4ICsgKHggKiAtYSkgKyAoeSAqIGEpCisgICAgICAgKiB4ICogKDEgLSBhKSArIHkgKiBhCisgICAgICAgKiBscnAoeCwgeSwgYSkKKyAgICAgICAqLworICAgICAgZm9yIChpbnQgbXVsX3BvcyA9IDA7IG11bF9wb3MgPCAyOyBtdWxfcG9zKyspIHsKKyAgICAgICAgIGlyX2V4cHJlc3Npb24gKm11bCA9IG9wX2V4cHJbbXVsX3Bvc107CisKKyAgICAgICAgIGlmICghbXVsIHx8IG11bC0+b3BlcmF0aW9uICE9IGlyX2Jpbm9wX211bCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAvKiBNdWx0aXBseSBmb3VuZCBvbiBvbmUgb2YgdGhlIG9wZXJhbmRzLiBOb3cgY2hlY2sgZm9yIGFuCisgICAgICAgICAgKiBpbm5lciBhZGRpdGlvbiBvcGVyYXRpb24uCisgICAgICAgICAgKi8KKyAgICAgICAgIGZvciAoaW50IGlubmVyX2FkZF9wb3MgPSAwOyBpbm5lcl9hZGRfcG9zIDwgMjsgaW5uZXJfYWRkX3BvcysrKSB7CisgICAgICAgICAgICBpcl9leHByZXNzaW9uICppbm5lcl9hZGQgPQorICAgICAgICAgICAgICAgbXVsLT5vcGVyYW5kc1tpbm5lcl9hZGRfcG9zXS0+YXNfZXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBpZiAoIWlubmVyX2FkZCB8fCBpbm5lcl9hZGQtPm9wZXJhdGlvbiAhPSBpcl9iaW5vcF9hZGQpCisgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLyogSW5uZXIgYWRkaXRpb24gZm91bmQgb24gb25lIG9mIHRoZSBvcGVyYW5kcy4gTm93IGNoZWNrIGZvcgorICAgICAgICAgICAgICogb25lIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5uZXIgYWRkaXRpb24gdG8gYmUgdGhlIG5lZ2F0aXZlCisgICAgICAgICAgICAgKiBvZiB4X29wZXJhbmQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaW50IG5lZ19wb3MgPSAwOyBuZWdfcG9zIDwgMjsgbmVnX3BvcysrKSB7CisgICAgICAgICAgICAgICBpcl9leHByZXNzaW9uICpuZWcgPQorICAgICAgICAgICAgICAgICAgaW5uZXJfYWRkLT5vcGVyYW5kc1tuZWdfcG9zXS0+YXNfZXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICBpZiAoIW5lZyB8fCBuZWctPm9wZXJhdGlvbiAhPSBpcl91bm9wX25lZykKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICBpcl9ydmFsdWUgKnhfb3BlcmFuZCA9IGlyLT5vcGVyYW5kc1sxIC0gbXVsX3Bvc107CisKKyAgICAgICAgICAgICAgIGlmICghbmVnLT5vcGVyYW5kc1swXS0+ZXF1YWxzKHhfb3BlcmFuZCkpCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgaXJfcnZhbHVlICp5X29wZXJhbmQgPSBpbm5lcl9hZGQtPm9wZXJhbmRzWzEgLSBuZWdfcG9zXTsKKyAgICAgICAgICAgICAgIGlyX3J2YWx1ZSAqYV9vcGVyYW5kID0gbXVsLT5vcGVyYW5kc1sxIC0gaW5uZXJfYWRkX3Bvc107CisKKyAgICAgICAgICAgICAgIGlmICh4X29wZXJhbmQtPnR5cGUgIT0geV9vcGVyYW5kLT50eXBlIHx8CisgICAgICAgICAgICAgICAgICAgeF9vcGVyYW5kLT50eXBlICE9IGFfb3BlcmFuZC0+dHlwZSkKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICByZXR1cm4gbHJwKHhfb3BlcmFuZCwgeV9vcGVyYW5kLCBhX29wZXJhbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3Bfc3ViOgorICAgICAgaWYgKGlzX3ZlY196ZXJvKG9wX2NvbnN0WzBdKSkKKwkgcmV0dXJuIG5lZyhpci0+b3BlcmFuZHNbMV0pOworICAgICAgaWYgKGlzX3ZlY196ZXJvKG9wX2NvbnN0WzFdKSkKKwkgcmV0dXJuIGlyLT5vcGVyYW5kc1swXTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX211bDoKKyAgICAgIGlmIChpc192ZWNfb25lKG9wX2NvbnN0WzBdKSkKKwkgcmV0dXJuIGlyLT5vcGVyYW5kc1sxXTsKKyAgICAgIGlmIChpc192ZWNfb25lKG9wX2NvbnN0WzFdKSkKKwkgcmV0dXJuIGlyLT5vcGVyYW5kc1swXTsKKworICAgICAgaWYgKGlzX3ZlY196ZXJvKG9wX2NvbnN0WzBdKSB8fCBpc192ZWNfemVybyhvcF9jb25zdFsxXSkpCisJIHJldHVybiBpcl9jb25zdGFudDo6emVybyhpciwgaXItPnR5cGUpOworCisgICAgICBpZiAoaXNfdmVjX25lZ2F0aXZlX29uZShvcF9jb25zdFswXSkpCisgICAgICAgICByZXR1cm4gbmVnKGlyLT5vcGVyYW5kc1sxXSk7CisgICAgICBpZiAoaXNfdmVjX25lZ2F0aXZlX29uZShvcF9jb25zdFsxXSkpCisgICAgICAgICByZXR1cm4gbmVnKGlyLT5vcGVyYW5kc1swXSk7CisKKworICAgICAgLyogUmVhc3NvY2lhdGUgbXVsdGlwbGljYXRpb24gb2YgY29uc3RhbnRzIHNvIHRoYXQgd2UgY2FuIGRvCisgICAgICAgKiBjb25zdGFudCBmb2xkaW5nLgorICAgICAgICovCisgICAgICBpZiAob3BfY29uc3RbMF0gJiYgIW9wX2NvbnN0WzFdKQorCSByZWFzc29jaWF0ZV9jb25zdGFudChpciwgMCwgb3BfY29uc3RbMF0sIG9wX2V4cHJbMV0pOworICAgICAgaWYgKG9wX2NvbnN0WzFdICYmICFvcF9jb25zdFswXSkKKwkgcmVhc3NvY2lhdGVfY29uc3RhbnQoaXIsIDEsIG9wX2NvbnN0WzFdLCBvcF9leHByWzBdKTsKKworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfZGl2OgorICAgICAgaWYgKGlzX3ZlY19vbmUob3BfY29uc3RbMF0pICYmIGlyLT50eXBlLT5iYXNlX3R5cGUgPT0gR0xTTF9UWVBFX0ZMT0FUKSB7CisJIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpcl91bm9wX3JjcCwKKwkJCQkJICAgaXItPm9wZXJhbmRzWzFdLT50eXBlLAorCQkJCQkgICBpci0+b3BlcmFuZHNbMV0sCisJCQkJCSAgIE5VTEwpOworICAgICAgfQorICAgICAgaWYgKGlzX3ZlY19vbmUob3BfY29uc3RbMV0pKQorCSByZXR1cm4gaXItPm9wZXJhbmRzWzBdOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfZG90OgorICAgICAgaWYgKGlzX3ZlY196ZXJvKG9wX2NvbnN0WzBdKSB8fCBpc192ZWNfemVybyhvcF9jb25zdFsxXSkpCisJIHJldHVybiBpcl9jb25zdGFudDo6emVybyhtZW1fY3R4LCBpci0+dHlwZSk7CisKKyAgICAgIGlmIChpc192ZWNfYmFzaXMob3BfY29uc3RbMF0pKSB7CisJIHVuc2lnbmVkIGNvbXBvbmVudCA9IDA7CisJIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBvcF9jb25zdFswXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOyBjKyspIHsKKwkgICAgaWYgKG9wX2NvbnN0WzBdLT52YWx1ZS5mW2NdID09IDEuMCkKKwkgICAgICAgY29tcG9uZW50ID0gYzsKKwkgfQorCSByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX3N3aXp6bGUoaXItPm9wZXJhbmRzWzFdLCBjb21wb25lbnQsIDAsIDAsIDAsIDEpOworICAgICAgfQorICAgICAgaWYgKGlzX3ZlY19iYXNpcyhvcF9jb25zdFsxXSkpIHsKKwkgdW5zaWduZWQgY29tcG9uZW50ID0gMDsKKwkgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG9wX2NvbnN0WzFdLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7IGMrKykgeworCSAgICBpZiAob3BfY29uc3RbMV0tPnZhbHVlLmZbY10gPT0gMS4wKQorCSAgICAgICBjb21wb25lbnQgPSBjOworCSB9CisJIHJldHVybiBuZXcobWVtX2N0eCkgaXJfc3dpenpsZShpci0+b3BlcmFuZHNbMF0sIGNvbXBvbmVudCwgMCwgMCwgMCwgMSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sZXNzOgorICAgY2FzZSBpcl9iaW5vcF9sZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX2dyZWF0ZXI6CisgICBjYXNlIGlyX2Jpbm9wX2dlcXVhbDoKKyAgIGNhc2UgaXJfYmlub3BfZXF1YWw6CisgICBjYXNlIGlyX2Jpbm9wX25lcXVhbDoKKyAgICAgIGZvciAoaW50IGFkZF9wb3MgPSAwOyBhZGRfcG9zIDwgMjsgYWRkX3BvcysrKSB7CisgICAgICAgICBpcl9leHByZXNzaW9uICphZGQgPSBvcF9leHByW2FkZF9wb3NdOworCisgICAgICAgICBpZiAoIWFkZCB8fCBhZGQtPm9wZXJhdGlvbiAhPSBpcl9iaW5vcF9hZGQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgaXJfY29uc3RhbnQgKnplcm8gPSBvcF9jb25zdFsxIC0gYWRkX3Bvc107CisgICAgICAgICBpZiAoIWlzX3ZlY196ZXJvKHplcm8pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgIHJldHVybiBuZXcobWVtX2N0eCkgaXJfZXhwcmVzc2lvbihpci0+b3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZC0+b3BlcmFuZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnKGFkZC0+b3BlcmFuZHNbMV0pKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX2Jpbm9wX3JzaGlmdDoKKyAgIGNhc2UgaXJfYmlub3BfbHNoaWZ0OgorICAgICAgLyogMCA+PiB4ID09IDAgKi8KKyAgICAgIGlmIChpc192ZWNfemVybyhvcF9jb25zdFswXSkpCisgICAgICAgICByZXR1cm4gaXItPm9wZXJhbmRzWzBdOworICAgICAgLyogeCA+PiAwID09IHggKi8KKyAgICAgIGlmIChpc192ZWNfemVybyhvcF9jb25zdFsxXSkpCisgICAgICAgICByZXR1cm4gaXItPm9wZXJhbmRzWzBdOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfYW5kOgorICAgICAgaWYgKGlzX3ZlY19vbmUob3BfY29uc3RbMF0pKSB7CisJIHJldHVybiBpci0+b3BlcmFuZHNbMV07CisgICAgICB9IGVsc2UgaWYgKGlzX3ZlY19vbmUob3BfY29uc3RbMV0pKSB7CisJIHJldHVybiBpci0+b3BlcmFuZHNbMF07CisgICAgICB9IGVsc2UgaWYgKGlzX3ZlY196ZXJvKG9wX2NvbnN0WzBdKSB8fCBpc192ZWNfemVybyhvcF9jb25zdFsxXSkpIHsKKwkgcmV0dXJuIGlyX2NvbnN0YW50Ojp6ZXJvKG1lbV9jdHgsIGlyLT50eXBlKTsKKyAgICAgIH0gZWxzZSBpZiAob3BfZXhwclswXSAmJiBvcF9leHByWzBdLT5vcGVyYXRpb24gPT0gaXJfdW5vcF9sb2dpY19ub3QgJiYKKyAgICAgICAgICAgICAgICAgb3BfZXhwclsxXSAmJiBvcF9leHByWzFdLT5vcGVyYXRpb24gPT0gaXJfdW5vcF9sb2dpY19ub3QpIHsKKyAgICAgICAgIC8qIERlIE1vcmdhbidzIExhdzoKKyAgICAgICAgICAqICAgIChub3QgQSkgYW5kIChub3QgQikgPT09IG5vdCAoQSBvciBCKQorICAgICAgICAgICovCisgICAgICAgICByZXR1cm4gbG9naWNfbm90KGxvZ2ljX29yKG9wX2V4cHJbMF0tPm9wZXJhbmRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9leHByWzFdLT5vcGVyYW5kc1swXSkpOworICAgICAgfSBlbHNlIGlmIChpci0+b3BlcmFuZHNbMF0tPmVxdWFscyhpci0+b3BlcmFuZHNbMV0pKSB7CisgICAgICAgICAvKiAoYSAmJiBhKSA9PSBhICovCisgICAgICAgICByZXR1cm4gaXItPm9wZXJhbmRzWzBdOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfbG9naWNfeG9yOgorICAgICAgaWYgKGlzX3ZlY196ZXJvKG9wX2NvbnN0WzBdKSkgeworCSByZXR1cm4gaXItPm9wZXJhbmRzWzFdOworICAgICAgfSBlbHNlIGlmIChpc192ZWNfemVybyhvcF9jb25zdFsxXSkpIHsKKwkgcmV0dXJuIGlyLT5vcGVyYW5kc1swXTsKKyAgICAgIH0gZWxzZSBpZiAoaXNfdmVjX29uZShvcF9jb25zdFswXSkpIHsKKwkgcmV0dXJuIGxvZ2ljX25vdChpci0+b3BlcmFuZHNbMV0pOworICAgICAgfSBlbHNlIGlmIChpc192ZWNfb25lKG9wX2NvbnN0WzFdKSkgeworCSByZXR1cm4gbG9naWNfbm90KGlyLT5vcGVyYW5kc1swXSk7CisgICAgICB9IGVsc2UgaWYgKGlyLT5vcGVyYW5kc1swXS0+ZXF1YWxzKGlyLT5vcGVyYW5kc1sxXSkpIHsKKyAgICAgICAgIC8qIChhIF5eIGEpID09IGZhbHNlICovCisJIHJldHVybiBpcl9jb25zdGFudDo6emVybyhtZW1fY3R4LCBpci0+dHlwZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBpcl9iaW5vcF9sb2dpY19vcjoKKyAgICAgIGlmIChpc192ZWNfemVybyhvcF9jb25zdFswXSkpIHsKKwkgcmV0dXJuIGlyLT5vcGVyYW5kc1sxXTsKKyAgICAgIH0gZWxzZSBpZiAoaXNfdmVjX3plcm8ob3BfY29uc3RbMV0pKSB7CisJIHJldHVybiBpci0+b3BlcmFuZHNbMF07CisgICAgICB9IGVsc2UgaWYgKGlzX3ZlY19vbmUob3BfY29uc3RbMF0pIHx8IGlzX3ZlY19vbmUob3BfY29uc3RbMV0pKSB7CisJIGlyX2NvbnN0YW50X2RhdGEgZGF0YTsKKworCSBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMTY7IGkrKykKKwkgICAgZGF0YS5iW2ldID0gdHJ1ZTsKKworCSByZXR1cm4gbmV3KG1lbV9jdHgpIGlyX2NvbnN0YW50KGlyLT50eXBlLCAmZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKG9wX2V4cHJbMF0gJiYgb3BfZXhwclswXS0+b3BlcmF0aW9uID09IGlyX3Vub3BfbG9naWNfbm90ICYmCisgICAgICAgICAgICAgICAgIG9wX2V4cHJbMV0gJiYgb3BfZXhwclsxXS0+b3BlcmF0aW9uID09IGlyX3Vub3BfbG9naWNfbm90KSB7CisgICAgICAgICAvKiBEZSBNb3JnYW4ncyBMYXc6CisgICAgICAgICAgKiAgICAobm90IEEpIG9yIChub3QgQikgPT09IG5vdCAoQSBhbmQgQikKKyAgICAgICAgICAqLworICAgICAgICAgcmV0dXJuIGxvZ2ljX25vdChsb2dpY19hbmQob3BfZXhwclswXS0+b3BlcmFuZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9leHByWzFdLT5vcGVyYW5kc1swXSkpOworICAgICAgfSBlbHNlIGlmIChpci0+b3BlcmFuZHNbMF0tPmVxdWFscyhpci0+b3BlcmFuZHNbMV0pKSB7CisgICAgICAgICAvKiAoYSB8fCBhKSA9PSBhICovCisgICAgICAgICByZXR1cm4gaXItPm9wZXJhbmRzWzBdOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfYmlub3BfcG93OgorICAgICAgLyogMV54ID09IDEgKi8KKyAgICAgIGlmIChpc192ZWNfb25lKG9wX2NvbnN0WzBdKSkKKyAgICAgICAgIHJldHVybiBvcF9jb25zdFswXTsKKworICAgICAgLyogeF4xID09IHggKi8KKyAgICAgIGlmIChpc192ZWNfb25lKG9wX2NvbnN0WzFdKSkKKyAgICAgICAgIHJldHVybiBpci0+b3BlcmFuZHNbMF07CisKKyAgICAgIC8qIHBvdygyLHgpID09IGV4cDIoeCkgKi8KKyAgICAgIGlmIChpc192ZWNfdHdvKG9wX2NvbnN0WzBdKSkKKyAgICAgICAgIHJldHVybiBleHByKGlyX3Vub3BfZXhwMiwgaXItPm9wZXJhbmRzWzFdKTsKKworICAgICAgaWYgKGlzX3ZlY190d28ob3BfY29uc3RbMV0pKSB7CisgICAgICAgICBpcl92YXJpYWJsZSAqeCA9IG5ldyhpcikgaXJfdmFyaWFibGUoaXItPm9wZXJhbmRzWzFdLT50eXBlLCAieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICAgICBiYXNlX2lyLT5pbnNlcnRfYmVmb3JlKHgpOworICAgICAgICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24oeCwgaXItPm9wZXJhbmRzWzBdKSk7CisgICAgICAgICByZXR1cm4gbXVsKHgsIHgpOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgY2FzZSBpcl91bm9wX3JjcDoKKyAgICAgIGlmIChvcF9leHByWzBdICYmIG9wX2V4cHJbMF0tPm9wZXJhdGlvbiA9PSBpcl91bm9wX3JjcCkKKwkgcmV0dXJuIG9wX2V4cHJbMF0tPm9wZXJhbmRzWzBdOworCisgICAgICAvKiBXaGlsZSBpcl90b19tZXNhLmNwcCB3aWxsIGxvd2VyIHNxcnQoeCkgdG8gcmNwKHJzcSh4KSksIGl0IGRvZXMgc28gYXQKKyAgICAgICAqIGl0cyBJUiBsZXZlbCwgc28gd2UgY2FuIGFsd2F5cyBhcHBseSB0aGlzIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICovCisgICAgICBpZiAob3BfZXhwclswXSAmJiBvcF9leHByWzBdLT5vcGVyYXRpb24gPT0gaXJfdW5vcF9yc3EpCisgICAgICAgICByZXR1cm4gc3FydChvcF9leHByWzBdLT5vcGVyYW5kc1swXSk7CisKKyAgICAgIC8qIEFzIGZhciBhcyB3ZSBrbm93LCBhbGwgYmFja2VuZHMgYXJlIE9LIHdpdGggcnNxLiAqLworICAgICAgaWYgKG9wX2V4cHJbMF0gJiYgb3BfZXhwclswXS0+b3BlcmF0aW9uID09IGlyX3Vub3Bfc3FydCkgeworCSByZXR1cm4gcnNxKG9wX2V4cHJbMF0tPm9wZXJhbmRzWzBdKTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgaXJfdHJpb3BfZm1hOgorICAgICAgLyogT3BlcmFuZHMgYXJlIG9wMCAqIG9wMSArIG9wMi4gKi8KKyAgICAgIGlmIChpc192ZWNfemVybyhvcF9jb25zdFswXSkgfHwgaXNfdmVjX3plcm8ob3BfY29uc3RbMV0pKSB7CisgICAgICAgICByZXR1cm4gaXItPm9wZXJhbmRzWzJdOworICAgICAgfSBlbHNlIGlmIChpc192ZWNfemVybyhvcF9jb25zdFsyXSkpIHsKKyAgICAgICAgIHJldHVybiBtdWwoaXItPm9wZXJhbmRzWzBdLCBpci0+b3BlcmFuZHNbMV0pOworICAgICAgfSBlbHNlIGlmIChpc192ZWNfb25lKG9wX2NvbnN0WzBdKSkgeworICAgICAgICAgcmV0dXJuIGFkZChpci0+b3BlcmFuZHNbMV0sIGlyLT5vcGVyYW5kc1syXSk7CisgICAgICB9IGVsc2UgaWYgKGlzX3ZlY19vbmUob3BfY29uc3RbMV0pKSB7CisgICAgICAgICByZXR1cm4gYWRkKGlyLT5vcGVyYW5kc1swXSwgaXItPm9wZXJhbmRzWzJdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2xycDoKKyAgICAgIC8qIE9wZXJhbmRzIGFyZSAoeCwgeSwgYSkuICovCisgICAgICBpZiAoaXNfdmVjX3plcm8ob3BfY29uc3RbMl0pKSB7CisgICAgICAgICByZXR1cm4gaXItPm9wZXJhbmRzWzBdOworICAgICAgfSBlbHNlIGlmIChpc192ZWNfb25lKG9wX2NvbnN0WzJdKSkgeworICAgICAgICAgcmV0dXJuIGlyLT5vcGVyYW5kc1sxXTsKKyAgICAgIH0gZWxzZSBpZiAoaXItPm9wZXJhbmRzWzBdLT5lcXVhbHMoaXItPm9wZXJhbmRzWzFdKSkgeworICAgICAgICAgcmV0dXJuIGlyLT5vcGVyYW5kc1swXTsKKyAgICAgIH0gZWxzZSBpZiAoaXNfdmVjX3plcm8ob3BfY29uc3RbMF0pKSB7CisgICAgICAgICByZXR1cm4gbXVsKGlyLT5vcGVyYW5kc1sxXSwgaXItPm9wZXJhbmRzWzJdKTsKKyAgICAgIH0gZWxzZSBpZiAoaXNfdmVjX3plcm8ob3BfY29uc3RbMV0pKSB7CisgICAgICAgICB1bnNpZ25lZCBvcDJfY29tcG9uZW50cyA9IGlyLT5vcGVyYW5kc1syXS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOworICAgICAgICAgaXJfY29uc3RhbnQgKm9uZSA9IG5ldyhtZW1fY3R4KSBpcl9jb25zdGFudCgxLjBmLCBvcDJfY29tcG9uZW50cyk7CisgICAgICAgICByZXR1cm4gbXVsKGlyLT5vcGVyYW5kc1swXSwgYWRkKG9uZSwgbmVnKGlyLT5vcGVyYW5kc1syXSkpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIGlyX3RyaW9wX2NzZWw6CisgICAgICBpZiAoaXNfdmVjX29uZShvcF9jb25zdFswXSkpCisJIHJldHVybiBpci0+b3BlcmFuZHNbMV07CisgICAgICBpZiAoaXNfdmVjX3plcm8ob3BfY29uc3RbMF0pKQorCSByZXR1cm4gaXItPm9wZXJhbmRzWzJdOworICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIGlyOworfQorCit2b2lkCitpcl9hbGdlYnJhaWNfdmlzaXRvcjo6aGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpCit7CisgICBpZiAoISpydmFsdWUpCisgICAgICByZXR1cm47CisKKyAgIGlyX2V4cHJlc3Npb24gKmV4cHIgPSAoKnJ2YWx1ZSktPmFzX2V4cHJlc3Npb24oKTsKKyAgIGlmICghZXhwciB8fCBleHByLT5vcGVyYXRpb24gPT0gaXJfcXVhZG9wX3ZlY3RvcikKKyAgICAgIHJldHVybjsKKworICAgaXJfcnZhbHVlICpuZXdfcnZhbHVlID0gaGFuZGxlX2V4cHJlc3Npb24oZXhwcik7CisgICBpZiAobmV3X3J2YWx1ZSA9PSAqcnZhbHVlKQorICAgICAgcmV0dXJuOworCisgICAvKiBJZiB0aGUgZXhwciB1c2VkIHRvIGJlIHNvbWUgdmVjIE9QIHNjYWxhciByZXR1cm5pbmcgYSB2ZWN0b3IsIGFuZCB0aGUKKyAgICAqIG9wdGltaXphdGlvbiBnYXZlIHVzIGJhY2sgYSBzY2FsYXIsIHdlIHN0aWxsIG5lZWQgdG8gdHVybiBpdCBpbnRvIGEKKyAgICAqIHZlY3Rvci4KKyAgICAqLworICAgKnJ2YWx1ZSA9IHN3aXp6bGVfaWZfcmVxdWlyZWQoZXhwciwgbmV3X3J2YWx1ZSk7CisKKyAgIHRoaXMtPnByb2dyZXNzID0gdHJ1ZTsKK30KKworYm9vbAorZG9fYWxnZWJyYWljKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBib29sIG5hdGl2ZV9pbnRlZ2VycykKK3sKKyAgIGlyX2FsZ2VicmFpY192aXNpdG9yIHYobmF0aXZlX2ludGVnZXJzKTsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9hcnJheV9zcGxpdHRpbmcuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfYXJyYXlfc3BsaXR0aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QzYTU3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfYXJyYXlfc3BsaXR0aW5nLmNwcApAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgb3B0X2FycmF5X3NwbGl0dGluZy5jcHAKKyAqCisgKiBJZiBhbiBhcnJheSBpcyBhbHdheXMgZGVyZWZlcmVuY2VkIHdpdGggYSBjb25zdGFudCBpbmRleCwgdGhlbgorICogc3BsaXQgaXQgYXBhcnQgaW50byBpdHMgZWxlbWVudHMsIG1ha2luZyBpdCBtb3JlIGFtZW5hYmxlIHRvIG90aGVyCisgKiBvcHRpbWl6YXRpb24gcGFzc2VzLgorICoKKyAqIFRoaXMgc2tpcHMgdW5pZm9ybS92YXJ5aW5nIGFycmF5cywgd2hpY2ggd291bGQgbmVlZCBjYXJlZnVsCisgKiBoYW5kbGluZyBkdWUgdG8gdGhlaXIgaXItPmxvY2F0aW9uIGZpZWxkcyB0eWluZyB0aGVtIHRvIHRoZSBHTCBBUEkKKyAqIGFuZCBvdGhlciBzaGFkZXIgc3RhZ2VzLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworc3RhdGljIGJvb2wgZGVidWcgPSBmYWxzZTsKKworbmFtZXNwYWNlIHsKKworbmFtZXNwYWNlIG9wdF9hcnJheV9zcGxpdHRpbmcgeworCitjbGFzcyB2YXJpYWJsZV9lbnRyeSA6IHB1YmxpYyBleGVjX25vZGUKK3sKK3B1YmxpYzoKKyAgIHZhcmlhYmxlX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpCisgICB7CisgICAgICB0aGlzLT52YXIgPSB2YXI7CisgICAgICB0aGlzLT5zcGxpdCA9IHRydWU7CisgICAgICB0aGlzLT5kZWNsYXJhdGlvbiA9IGZhbHNlOworICAgICAgdGhpcy0+Y29tcG9uZW50cyA9IE5VTEw7CisgICAgICB0aGlzLT5tZW1fY3R4ID0gTlVMTDsKKyAgICAgIGlmICh2YXItPnR5cGUtPmlzX2FycmF5KCkpCisJIHRoaXMtPnNpemUgPSB2YXItPnR5cGUtPmxlbmd0aDsKKyAgICAgIGVsc2UKKwkgdGhpcy0+c2l6ZSA9IHZhci0+dHlwZS0+bWF0cml4X2NvbHVtbnM7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICp2YXI7IC8qIFRoZSBrZXk6IHRoZSB2YXJpYWJsZSdzIHBvaW50ZXIuICovCisgICB1bnNpZ25lZCBzaXplOyAvKiBhcnJheSBsZW5ndGggb3IgbWF0cml4IGNvbHVtbnMgKi8KKworICAgLyoqIFdoZXRoZXIgdGhpcyBhcnJheSBzaG91bGQgYmUgc3BsaXQgb3Igbm90LiAqLworICAgYm9vbCBzcGxpdDsKKworICAgLyogSWYgdGhlIHZhcmlhYmxlIGhhZCBhIGRlY2wgd2UgY2FuIHdvcmsgd2l0aCBpbiB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAqIHN0cmVhbS4gIFdlIGNhbid0IGRvIHNwbGl0dGluZyBvbiBmdW5jdGlvbiBhcmd1bWVudHMsIHdoaWNoCisgICAgKiBkb24ndCBnZXQgdGhpcyB2YXJpYWJsZSBzZXQuCisgICAgKi8KKyAgIGJvb2wgZGVjbGFyYXRpb247CisKKyAgIGlyX3ZhcmlhYmxlICoqY29tcG9uZW50czsKKworICAgLyoqIHJhbGxvY19wYXJlbnQodGhpcy0+dmFyKSAtLSB0aGUgc2hhZGVyJ3MgdGFsbG9jIGNvbnRleHQuICovCisgICB2b2lkICptZW1fY3R4OworfTsKKworfSAvKiBuYW1lc3BhY2UgKi8KKwordXNpbmcgbmFtZXNwYWNlIG9wdF9hcnJheV9zcGxpdHRpbmc7CisKKy8qKgorICogVGhpcyBjbGFzcyBkb2VzIGEgd2FsayBvdmVyIHRoZSB0cmVlLCBjb21pbmcgdXAgd2l0aCB0aGUgc2V0IG9mCisgKiB2YXJpYWJsZXMgdGhhdCBjb3VsZCBiZSBzcGxpdCBieSBsb29raW5nIHRvIHNlZSBpZiB0aGV5IGFyZSBhcnJheXMKKyAqIHRoYXQgYXJlIG9ubHkgZXZlciBjb25zdGFudC1pbmRleCBkZXJlZmVyZW5jZWQuCisgKi8KK2NsYXNzIGlyX2FycmF5X3JlZmVyZW5jZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX2FycmF5X3JlZmVyZW5jZV92aXNpdG9yKHZvaWQpCisgICB7CisgICAgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICAgICB0aGlzLT52YXJpYWJsZV9saXN0Lm1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgfmlyX2FycmF5X3JlZmVyZW5jZV92aXNpdG9yKHZvaWQpCisgICB7CisgICAgICByYWxsb2NfZnJlZShtZW1fY3R4KTsKKyAgIH0KKworICAgYm9vbCBnZXRfc3BsaXRfbGlzdChleGVjX2xpc3QgKmluc3RydWN0aW9ucywgYm9vbCBsaW5rZWQpOworCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX3ZhcmlhYmxlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKTsKKworICAgdmFyaWFibGVfZW50cnkgKmdldF92YXJpYWJsZV9lbnRyeShpcl92YXJpYWJsZSAqdmFyKTsKKworICAgLyogTGlzdCBvZiB2YXJpYWJsZV9lbnRyeSAqLworICAgZXhlY19saXN0IHZhcmlhYmxlX2xpc3Q7CisKKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCit9IC8qIG5hbWVzcGFjZSAqLworCit2YXJpYWJsZV9lbnRyeSAqCitpcl9hcnJheV9yZWZlcmVuY2VfdmlzaXRvcjo6Z2V0X3ZhcmlhYmxlX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICBhc3NlcnQodmFyKTsKKworICAgaWYgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9hdXRvICYmCisgICAgICAgdmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3RlbXBvcmFyeSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAoISh2YXItPnR5cGUtPmlzX2FycmF5KCkgfHwgdmFyLT50eXBlLT5pc19tYXRyaXgoKSkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgLyogSWYgdGhlIGFycmF5IGhhc24ndCBiZWVuIHNpemVkIHlldCwgd2UgY2FuJ3Qgc3BsaXQgaXQuICBBZnRlcgorICAgICogbGlua2luZywgdGhpcyBzaG91bGQgYmUgcmVzb2x2ZWQuCisgICAgKi8KKyAgIGlmICh2YXItPnR5cGUtPmlzX3Vuc2l6ZWRfYXJyYXkoKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBmb3JlYWNoX2xpc3QobiwgJnRoaXMtPnZhcmlhYmxlX2xpc3QpIHsKKyAgICAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9ICh2YXJpYWJsZV9lbnRyeSAqKSBuOworICAgICAgaWYgKGVudHJ5LT52YXIgPT0gdmFyKQorCSByZXR1cm4gZW50cnk7CisgICB9CisKKyAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9IG5ldyhtZW1fY3R4KSB2YXJpYWJsZV9lbnRyeSh2YXIpOworICAgdGhpcy0+dmFyaWFibGVfbGlzdC5wdXNoX3RhaWwoZW50cnkpOworICAgcmV0dXJuIGVudHJ5OworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9hcnJheV9yZWZlcmVuY2VfdmlzaXRvcjo6dmlzaXQoaXJfdmFyaWFibGUgKmlyKQoreworICAgdmFyaWFibGVfZW50cnkgKmVudHJ5ID0gdGhpcy0+Z2V0X3ZhcmlhYmxlX2VudHJ5KGlyKTsKKworICAgaWYgKGVudHJ5KQorICAgICAgZW50cnktPmRlY2xhcmF0aW9uID0gdHJ1ZTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfYXJyYXlfcmVmZXJlbmNlX3Zpc2l0b3I6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9IHRoaXMtPmdldF92YXJpYWJsZV9lbnRyeShpci0+dmFyKTsKKworICAgLyogSWYgd2UgbWFkZSBpdCB0byBoZXJlIHdpdGhvdXQgc2VlaW5nIGFuIGlyX2RlcmVmZXJlbmNlX2FycmF5LAorICAgICogdGhlbiB0aGUgZGVyZWZlcmVuY2Ugb2YgdGhpcyBhcnJheSBkaWRuJ3QgaGF2ZSBhIGNvbnN0YW50IGluZGV4CisgICAgKiAoc2VlIHRoZSB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudCBiZWxvdyksIHNvIHdlIGNhbid0IHNwbGl0CisgICAgKiB0aGUgdmFyaWFibGUuCisgICAgKi8KKyAgIGlmIChlbnRyeSkKKyAgICAgIGVudHJ5LT5zcGxpdCA9IGZhbHNlOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9hcnJheV9yZWZlcmVuY2VfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKmlyKQoreworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmID0gaXItPmFycmF5LT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaWYgKCFkZXJlZikKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgdmFyaWFibGVfZW50cnkgKmVudHJ5ID0gdGhpcy0+Z2V0X3ZhcmlhYmxlX2VudHJ5KGRlcmVmLT52YXIpOworCisgICAvKiBJZiB0aGUgYWNjZXNzIHRvIHRoZSBhcnJheSBoYXMgYSB2YXJpYWJsZSBpbmRleCwgd2Ugd291bGRuJ3QKKyAgICAqIGtub3cgd2hpY2ggc3BsaXQgdmFyaWFibGUgdGhpcyBkZXJlZmVyZW5jZSBzaG91bGQgZ28gdG8uCisgICAgKi8KKyAgIGlmIChlbnRyeSAmJiAhaXItPmFycmF5X2luZGV4LT5hc19jb25zdGFudCgpKQorICAgICAgZW50cnktPnNwbGl0ID0gZmFsc2U7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2FycmF5X3JlZmVyZW5jZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgLyogV2UgZG9uJ3QgaGF2ZSBsb2dpYyBmb3IgYXJyYXktc3BsaXR0aW5nIGZ1bmN0aW9uIGFyZ3VtZW50cywKKyAgICAqIHNvIGp1c3QgbG9vayBhdCB0aGUgYm9keSBpbnN0cnVjdGlvbnMgYW5kIG5vdCB0aGUgcGFyYW1ldGVyCisgICAgKiBkZWNsYXJhdGlvbnMuCisgICAgKi8KKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5ib2R5KTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworYm9vbAoraXJfYXJyYXlfcmVmZXJlbmNlX3Zpc2l0b3I6OmdldF9zcGxpdF9saXN0KGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLAorCQkJCQkgICBib29sIGxpbmtlZCkKK3sKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgaW5zdHJ1Y3Rpb25zKTsKKworICAgLyogSWYgdGhlIHNoYWRlcnMgYXJlbid0IGxpbmtlZCB5ZXQsIHdlIGNhbid0IG1lc3Mgd2l0aCBnbG9iYWwKKyAgICAqIGRlY2xhcmF0aW9ucywgd2hpY2ggbmVlZCB0byBiZSBtYXRjaGVkIGJ5IG5hbWUgYWNyb3NzIHNoYWRlcnMuCisgICAgKi8KKyAgIGlmICghbGlua2VkKSB7CisgICAgICBmb3JlYWNoX2xpc3Qobm9kZSwgaW5zdHJ1Y3Rpb25zKSB7CisJIGlyX3ZhcmlhYmxlICp2YXIgPSAoKGlyX2luc3RydWN0aW9uICopbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisJIGlmICh2YXIpIHsKKwkgICAgdmFyaWFibGVfZW50cnkgKmVudHJ5ID0gZ2V0X3ZhcmlhYmxlX2VudHJ5KHZhcik7CisJICAgIGlmIChlbnRyeSkKKwkgICAgICAgZW50cnktPnJlbW92ZSgpOworCSB9CisgICAgICB9CisgICB9CisKKyAgIC8qIFRyaW0gb3V0IHZhcmlhYmxlcyB3ZSBmb3VuZCB0aGF0IHdlIGNhbid0IHNwbGl0LiAqLworICAgZm9yZWFjaF9saXN0X3NhZmUobiwgJnZhcmlhYmxlX2xpc3QpIHsKKyAgICAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9ICh2YXJpYWJsZV9lbnRyeSAqKSBuOworCisgICAgICBpZiAoZGVidWcpIHsKKwkgcHJpbnRmKCJhcnJheSAlc0AlcDogZGVjbCAlZCwgc3BsaXQgJWRcbiIsCisJCWVudHJ5LT52YXItPm5hbWUsICh2b2lkICopIGVudHJ5LT52YXIsIGVudHJ5LT5kZWNsYXJhdGlvbiwKKwkJZW50cnktPnNwbGl0KTsKKyAgICAgIH0KKworICAgICAgaWYgKCEoZW50cnktPmRlY2xhcmF0aW9uICYmIGVudHJ5LT5zcGxpdCkpIHsKKwkgZW50cnktPnJlbW92ZSgpOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gIXZhcmlhYmxlX2xpc3QuaXNfZW1wdHkoKTsKK30KKworLyoqCisgKiBUaGlzIGNsYXNzIHJld3JpdGVzIHRoZSBkZXJlZmVyZW5jZXMgb2YgYXJyYXlzIHRoYXQgaGF2ZSBiZWVuIHNwbGl0CisgKiB0byB1c2UgdGhlIG5ld2x5IGNyZWF0ZWQgaXJfdmFyaWFibGVzIGZvciBlYWNoIGNvbXBvbmVudC4KKyAqLworY2xhc3MgaXJfYXJyYXlfc3BsaXR0aW5nX3Zpc2l0b3IgOiBwdWJsaWMgaXJfcnZhbHVlX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfYXJyYXlfc3BsaXR0aW5nX3Zpc2l0b3IoZXhlY19saXN0ICp2YXJzKQorICAgeworICAgICAgdGhpcy0+dmFyaWFibGVfbGlzdCA9IHZhcnM7CisgICB9CisKKyAgIHZpcnR1YWwgfmlyX2FycmF5X3NwbGl0dGluZ192aXNpdG9yKCkKKyAgIHsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICopOworCisgICB2b2lkIHNwbGl0X2RlcmVmKGlyX2RlcmVmZXJlbmNlICoqZGVyZWYpOworICAgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSk7CisgICB2YXJpYWJsZV9lbnRyeSAqZ2V0X3NwbGl0dGluZ19lbnRyeShpcl92YXJpYWJsZSAqdmFyKTsKKworICAgZXhlY19saXN0ICp2YXJpYWJsZV9saXN0OworfTsKKwordmFyaWFibGVfZW50cnkgKgoraXJfYXJyYXlfc3BsaXR0aW5nX3Zpc2l0b3I6OmdldF9zcGxpdHRpbmdfZW50cnkoaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGFzc2VydCh2YXIpOworCisgICBmb3JlYWNoX2xpc3QobiwgdGhpcy0+dmFyaWFibGVfbGlzdCkgeworICAgICAgdmFyaWFibGVfZW50cnkgKmVudHJ5ID0gKHZhcmlhYmxlX2VudHJ5ICopIG47CisgICAgICBpZiAoZW50cnktPnZhciA9PSB2YXIpIHsKKwkgcmV0dXJuIGVudHJ5OworICAgICAgfQorICAgfQorCisgICByZXR1cm4gTlVMTDsKK30KKwordm9pZAoraXJfYXJyYXlfc3BsaXR0aW5nX3Zpc2l0b3I6OnNwbGl0X2RlcmVmKGlyX2RlcmVmZXJlbmNlICoqZGVyZWYpCit7CisgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqZGVyZWZfYXJyYXkgPSAoKmRlcmVmKS0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKTsKKyAgIGlmICghZGVyZWZfYXJyYXkpCisgICAgICByZXR1cm47CisKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpkZXJlZl92YXIgPSBkZXJlZl9hcnJheS0+YXJyYXktPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICBpZiAoIWRlcmVmX3ZhcikKKyAgICAgIHJldHVybjsKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBkZXJlZl92YXItPnZhcjsKKworICAgdmFyaWFibGVfZW50cnkgKmVudHJ5ID0gZ2V0X3NwbGl0dGluZ19lbnRyeSh2YXIpOworICAgaWYgKCFlbnRyeSkKKyAgICAgIHJldHVybjsKKworICAgaXJfY29uc3RhbnQgKmNvbnN0YW50ID0gZGVyZWZfYXJyYXktPmFycmF5X2luZGV4LT5hc19jb25zdGFudCgpOworICAgYXNzZXJ0KGNvbnN0YW50KTsKKworICAgaWYgKGNvbnN0YW50LT52YWx1ZS5pWzBdIDwgKGludCllbnRyeS0+c2l6ZSkgeworICAgICAgKmRlcmVmID0gbmV3KGVudHJ5LT5tZW1fY3R4KQorCSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShlbnRyeS0+Y29tcG9uZW50c1tjb25zdGFudC0+dmFsdWUuaVswXV0pOworICAgfSBlbHNlIHsKKyAgICAgIC8qIFRoZXJlIHdhcyBhIGNvbnN0YW50IGFycmF5IGFjY2VzcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAqIGFycmF5LiAgVGhpcyBtaWdodCBoYXZlIGhhcHBlbmVkIGR1ZSB0byBjb25zdGFudCBmb2xkaW5nCisgICAgICAgKiBhZnRlciB0aGUgaW5pdGlhbCBwYXJzZS4gIFRoaXMgcHJvZHVjZXMgYW4gdW5kZWZpbmVkIHZhbHVlLAorICAgICAgICogYnV0IHNob3VsZG4ndCBjcmFzaC4gIEp1c3QgZ2l2ZSB0aGVtIGFuIHVuaW5pdGlhbGl6ZWQKKyAgICAgICAqIHZhcmlhYmxlLgorICAgICAgICovCisgICAgICBpcl92YXJpYWJsZSAqdGVtcCA9IG5ldyhlbnRyeS0+bWVtX2N0eCkgaXJfdmFyaWFibGUoZGVyZWZfYXJyYXktPnR5cGUsCisJCQkJCQkJICAidW5kZWYiLAorCQkJCQkJCSAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICBlbnRyeS0+Y29tcG9uZW50c1swXS0+aW5zZXJ0X2JlZm9yZSh0ZW1wKTsKKyAgICAgICpkZXJlZiA9IG5ldyhlbnRyeS0+bWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGVtcCk7CisgICB9Cit9CisKK3ZvaWQKK2lyX2FycmF5X3NwbGl0dGluZ192aXNpdG9yOjpoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSkKK3sKKyAgIGlmICghKnJ2YWx1ZSkKKyAgICAgIHJldHVybjsKKworICAgaXJfZGVyZWZlcmVuY2UgKmRlcmVmID0gKCpydmFsdWUpLT5hc19kZXJlZmVyZW5jZSgpOworCisgICBpZiAoIWRlcmVmKQorICAgICAgcmV0dXJuOworCisgICBzcGxpdF9kZXJlZigmZGVyZWYpOworICAgKnJ2YWx1ZSA9IGRlcmVmOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfYXJyYXlfc3BsaXR0aW5nX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgLyogVGhlIG5vcm1hbCBydmFsdWUgdmlzaXRvciBza2lwcyB0aGUgTEhTIG9mIGFzc2lnbm1lbnRzLCBidXQgd2UKKyAgICAqIG5lZWQgdG8gcHJvY2VzcyB0aG9zZSBqdXN0IHRoZSBzYW1lLgorICAgICovCisgICBpcl9ydmFsdWUgKmxocyA9IGlyLT5saHM7CisKKyAgIGhhbmRsZV9ydmFsdWUoJmxocyk7CisgICBpci0+bGhzID0gbGhzLT5hc19kZXJlZmVyZW5jZSgpOworCisgICBpci0+bGhzLT5hY2NlcHQodGhpcyk7CisKKyAgIGhhbmRsZV9ydmFsdWUoJmlyLT5yaHMpOworICAgaXItPnJocy0+YWNjZXB0KHRoaXMpOworCisgICBpZiAoaXItPmNvbmRpdGlvbikgeworICAgICAgaGFuZGxlX3J2YWx1ZSgmaXItPmNvbmRpdGlvbik7CisgICAgICBpci0+Y29uZGl0aW9uLT5hY2NlcHQodGhpcyk7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworYm9vbAorb3B0aW1pemVfc3BsaXRfYXJyYXlzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zLCBib29sIGxpbmtlZCkKK3sKKyAgIGlyX2FycmF5X3JlZmVyZW5jZV92aXNpdG9yIHJlZnM7CisgICBpZiAoIXJlZnMuZ2V0X3NwbGl0X2xpc3QoaW5zdHJ1Y3Rpb25zLCBsaW5rZWQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisKKyAgIC8qIFJlcGxhY2UgdGhlIGRlY2xzIG9mIHRoZSBhcnJheXMgdG8gYmUgc3BsaXQgd2l0aCB0aGVpciBzcGxpdAorICAgICogY29tcG9uZW50cy4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG4sICZyZWZzLnZhcmlhYmxlX2xpc3QpIHsKKyAgICAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9ICh2YXJpYWJsZV9lbnRyeSAqKSBuOworICAgICAgY29uc3Qgc3RydWN0IGdsc2xfdHlwZSAqdHlwZSA9IGVudHJ5LT52YXItPnR5cGU7CisgICAgICBjb25zdCBzdHJ1Y3QgZ2xzbF90eXBlICpzdWJ0eXBlOworCisgICAgICBpZiAodHlwZS0+aXNfbWF0cml4KCkpCisJIHN1YnR5cGUgPSB0eXBlLT5jb2x1bW5fdHlwZSgpOworICAgICAgZWxzZQorCSBzdWJ0eXBlID0gdHlwZS0+ZmllbGRzLmFycmF5OworCisgICAgICBlbnRyeS0+bWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoZW50cnktPnZhcik7CisKKyAgICAgIGVudHJ5LT5jb21wb25lbnRzID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsCisJCQkJICAgICAgIGlyX3ZhcmlhYmxlICosCisJCQkJICAgICAgIGVudHJ5LT5zaXplKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBlbnRyeS0+c2l6ZTsgaSsrKSB7CisJIGNvbnN0IGNoYXIgKm5hbWUgPSByYWxsb2NfYXNwcmludGYobWVtX2N0eCwgIiVzXyVkIiwKKwkJCQkJICAgIGVudHJ5LT52YXItPm5hbWUsIGkpOworCisJIGVudHJ5LT5jb21wb25lbnRzW2ldID0KKwkgICAgbmV3KGVudHJ5LT5tZW1fY3R4KSBpcl92YXJpYWJsZShzdWJ0eXBlLCBuYW1lLCBpcl92YXJfdGVtcG9yYXJ5KTsKKwkgZW50cnktPnZhci0+aW5zZXJ0X2JlZm9yZShlbnRyeS0+Y29tcG9uZW50c1tpXSk7CisgICAgICB9CisKKyAgICAgIGVudHJ5LT52YXItPnJlbW92ZSgpOworICAgfQorCisgICBpcl9hcnJheV9zcGxpdHRpbmdfdmlzaXRvciBzcGxpdCgmcmVmcy52YXJpYWJsZV9saXN0KTsKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnNwbGl0LCBpbnN0cnVjdGlvbnMpOworCisgICBpZiAoZGVidWcpCisgICAgICBfbWVzYV9wcmludF9pcihzdGRvdXQsIGluc3RydWN0aW9ucywgTlVMTCk7CisKKyAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworCisgICByZXR1cm4gdHJ1ZTsKKworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfY29uc3RhbnRfZm9sZGluZy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9jb25zdGFudF9mb2xkaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGU1NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfY29uc3RhbnRfZm9sZGluZy5jcHAKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF9jb25zdGFudF9mb2xkaW5nLmNwcAorICogUmVwbGFjZSBjb25zdGFudC12YWx1ZWQgZXhwcmVzc2lvbnMgd2l0aCByZWZlcmVuY2VzIHRvIGNvbnN0YW50IHZhbHVlcy4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfcnZhbHVlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogVmlzaXRvciBjbGFzcyBmb3IgcmVwbGFjaW5nIGV4cHJlc3Npb25zIHdpdGggaXJfY29uc3RhbnQgdmFsdWVzLgorICovCisKK2NsYXNzIGlyX2NvbnN0YW50X2ZvbGRpbmdfdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9jb25zdGFudF9mb2xkaW5nX3Zpc2l0b3IoKQorICAgeworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgdmlydHVhbCB+aXJfY29uc3RhbnRfZm9sZGluZ192aXNpdG9yKCkKKyAgIHsKKyAgICAgIC8qIGVtcHR5ICovCisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqaXIpOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9jYWxsICppcik7CisKKyAgIHZpcnR1YWwgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSk7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKK3ZvaWQKK2lyX2NvbnN0YW50X2ZvbGRpbmdfdmlzaXRvcjo6aGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpCit7CisgICBpZiAoKnJ2YWx1ZSA9PSBOVUxMIHx8ICgqcnZhbHVlKS0+aXJfdHlwZSA9PSBpcl90eXBlX2NvbnN0YW50KQorICAgICAgcmV0dXJuOworCisgICAvKiBOb3RlIHRoYXQgd2UgZG8gcnZhbHVlIHZpc2l0b3Jpbmcgb24gbGVhdmluZy4gIFNvIGlmIGFuCisgICAgKiBleHByZXNzaW9uIGhhcyBhIG5vbi1jb25zdGFudCBvcGVyYW5kLCBubyBuZWVkIHRvIGdvIGxvb2tpbmcKKyAgICAqIGRvd24gaXQgdG8gZmluZCBpZiBpdCdzIGNvbnN0YW50LiAgVGhpcyBjdXRzIHRoZSB0aW1lIG9mIHRoaXMKKyAgICAqIHBhc3MgZG93biBkcmFzdGljYWxseS4KKyAgICAqLworICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9ICgqcnZhbHVlKS0+YXNfZXhwcmVzc2lvbigpOworICAgaWYgKGV4cHIpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZXhwci0+Z2V0X251bV9vcGVyYW5kcygpOyBpKyspIHsKKwkgaWYgKCFleHByLT5vcGVyYW5kc1tpXS0+YXNfY29uc3RhbnQoKSkKKwkgICAgcmV0dXJuOworICAgICAgfQorICAgfQorCisgICBpcl9jb25zdGFudCAqY29uc3RhbnQgPSAoKnJ2YWx1ZSktPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKyAgIGlmIChjb25zdGFudCkgeworICAgICAgKnJ2YWx1ZSA9IGNvbnN0YW50OworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgfSBlbHNlIHsKKyAgICAgICgqcnZhbHVlKS0+YWNjZXB0KHRoaXMpOworICAgfQorfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29uc3RhbnRfZm9sZGluZ192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGlyLT5yaHMtPmFjY2VwdCh0aGlzKTsKKyAgIGhhbmRsZV9ydmFsdWUoJmlyLT5yaHMpOworCisgICBpZiAoaXItPmNvbmRpdGlvbikgeworICAgICAgaXItPmNvbmRpdGlvbi0+YWNjZXB0KHRoaXMpOworICAgICAgaGFuZGxlX3J2YWx1ZSgmaXItPmNvbmRpdGlvbik7CisKKyAgICAgIGlyX2NvbnN0YW50ICpjb25zdF92YWwgPSBpci0+Y29uZGl0aW9uLT5hc19jb25zdGFudCgpOworICAgICAgLyogSWYgdGhlIGNvbmRpdGlvbiBpcyBjb25zdGFudCwgZWl0aGVyIHJlbW92ZSB0aGUgY29uZGl0aW9uIG9yCisgICAgICAgKiByZW1vdmUgdGhlIG5ldmVyLWV4ZWN1dGVkIGFzc2lnbm1lbnQuCisgICAgICAgKi8KKyAgICAgIGlmIChjb25zdF92YWwpIHsKKwkgaWYgKGNvbnN0X3ZhbC0+dmFsdWUuYlswXSkKKwkgICAgaXItPmNvbmRpdGlvbiA9IE5VTEw7CisJIGVsc2UKKwkgICAgaXItPnJlbW92ZSgpOworCSB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIC8qIERvbid0IGRlc2NlbmQgaW50byB0aGUgTEhTIGJlY2F1c2Ugd2Ugd2FudCBpdCB0byBzdGF5IGFzIGEKKyAgICAqIHZhcmlhYmxlIGRlcmVmZXJlbmNlLiAgRklOSVNITUU6IFdlIHByb2JhYmx5IHNob3VsZCB0byBnZXQgYXJyYXkKKyAgICAqIGluZGljZXMgdGhvdWdoLgorICAgICovCisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb25zdGFudF9mb2xkaW5nX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKQoreworICAgLyogQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIHBhcmFtZXRlcnMgKi8KKyAgIGZvcmVhY2hfdHdvX2xpc3RzKGZvcm1hbF9ub2RlLCAmaXItPmNhbGxlZS0+cGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9ub2RlLCAmaXItPmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisgICAgICBpcl9ydmFsdWUgKnBhcmFtX3J2YWwgPSAoaXJfcnZhbHVlICopIGFjdHVhbF9ub2RlOworICAgICAgaXJfdmFyaWFibGUgKnNpZ19wYXJhbSA9IChpcl92YXJpYWJsZSAqKSBmb3JtYWxfbm9kZTsKKworICAgICAgaWYgKHNpZ19wYXJhbS0+ZGF0YS5tb2RlID09IGlyX3Zhcl9mdW5jdGlvbl9pbgorICAgICAgICAgIHx8IHNpZ19wYXJhbS0+ZGF0YS5tb2RlID09IGlyX3Zhcl9jb25zdF9pbikgeworCSBpcl9ydmFsdWUgKm5ld19wYXJhbSA9IHBhcmFtX3J2YWw7CisKKwkgaGFuZGxlX3J2YWx1ZSgmbmV3X3BhcmFtKTsKKwkgaWYgKG5ld19wYXJhbSAhPSBwYXJhbV9ydmFsKSB7CisJICAgIHBhcmFtX3J2YWwtPnJlcGxhY2Vfd2l0aChuZXdfcGFyYW0pOworCSB9CisgICAgICB9CisgICB9CisKKyAgIC8qIE5leHQsIHNlZSBpZiB0aGUgY2FsbCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhbiBhc3NpZ25tZW50IG9mIGEgY29uc3RhbnQgKi8KKyAgIGlyX2NvbnN0YW50ICpjb25zdF92YWwgPSBpci0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworCisgICBpZiAoY29uc3RfdmFsICE9IE5VTEwpIHsKKyAgICAgIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbm1lbnQgPQorCSBuZXcocmFsbG9jX3BhcmVudChpcikpIGlyX2Fzc2lnbm1lbnQoaXItPnJldHVybl9kZXJlZiwgY29uc3RfdmFsKTsKKyAgICAgIGlyLT5yZXBsYWNlX3dpdGgoYXNzaWdubWVudCk7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworYm9vbAorZG9fY29uc3RhbnRfZm9sZGluZyhleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX2NvbnN0YW50X2ZvbGRpbmdfdmlzaXRvciBjb25zdGFudF9mb2xkaW5nOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZjb25zdGFudF9mb2xkaW5nLCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gY29uc3RhbnRfZm9sZGluZy5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NvbnN0YW50X3Byb3BhZ2F0aW9uLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NvbnN0YW50X3Byb3BhZ2F0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY1ZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfY29uc3RhbnRfcHJvcGFnYXRpb24uY3BwCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29uc3RhbnQgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29uc3RhbnQsIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvbnN0YW50cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09OU1RBTlRSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgb3B0X2NvbnN0YW50X3Byb3BhZ2F0aW9uLmNwcAorICoKKyAqIFRyYWNrcyBhc3NpZ25tZW50cyBvZiBjb25zdGFudHMgdG8gY2hhbm5lbHMgb2YgdmFyaWFibGVzLCBhbmQKKyAqIHVzYWdlIG9mIHRob3NlIGNvbnN0YW50IGNoYW5uZWxzIHdpdGggZGlyZWN0IHVzYWdlIG9mIHRoZSBjb25zdGFudHMuCisgKgorICogVGhpcyBjYW4gbGVhZCB0byBjb25zdGFudCBmb2xkaW5nIGFuZCBhbGdlYnJhaWMgb3B0aW1pemF0aW9ucyBpbgorICogdGhvc2UgbGF0ZXIgZXhwcmVzc2lvbnMsIHdoaWxlIGNhdXNpbmcgbm8gaW5jcmVhc2UgaW4gaW5zdHJ1Y3Rpb24KKyAqIGNvdW50IChkdWUgdG8gY29uc3RhbnRzIGJlaW5nIGdlbmVyYWxseSBmcmVlIHRvIGxvYWQgZnJvbSBhCisgKiBjb25zdGFudCBwdXNoIGJ1ZmZlciBvciBhcyBpbnN0cnVjdGlvbiBpbW1lZGlhdGUgdmFsdWVzKSBhbmQKKyAqIHBvc3NpYmx5IHJlZHVjaW5nIHJlZ2lzdGVyIHByZXNzdXJlLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX2Jhc2ljX2Jsb2NrLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBhY3BfZW50cnkgOiBwdWJsaWMgZXhlY19ub2RlCit7CitwdWJsaWM6CisgICBhY3BfZW50cnkoaXJfdmFyaWFibGUgKnZhciwgdW5zaWduZWQgd3JpdGVfbWFzaywgaXJfY29uc3RhbnQgKmNvbnN0YW50KQorICAgeworICAgICAgYXNzZXJ0KHZhcik7CisgICAgICBhc3NlcnQoY29uc3RhbnQpOworICAgICAgdGhpcy0+dmFyID0gdmFyOworICAgICAgdGhpcy0+d3JpdGVfbWFzayA9IHdyaXRlX21hc2s7CisgICAgICB0aGlzLT5jb25zdGFudCA9IGNvbnN0YW50OworICAgICAgdGhpcy0+aW5pdGlhbF92YWx1ZXMgPSB3cml0ZV9tYXNrOworICAgfQorCisgICBhY3BfZW50cnkoY29uc3QgYWNwX2VudHJ5ICpzcmMpCisgICB7CisgICAgICB0aGlzLT52YXIgPSBzcmMtPnZhcjsKKyAgICAgIHRoaXMtPndyaXRlX21hc2sgPSBzcmMtPndyaXRlX21hc2s7CisgICAgICB0aGlzLT5jb25zdGFudCA9IHNyYy0+Y29uc3RhbnQ7CisgICAgICB0aGlzLT5pbml0aWFsX3ZhbHVlcyA9IHNyYy0+aW5pdGlhbF92YWx1ZXM7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICp2YXI7CisgICBpcl9jb25zdGFudCAqY29uc3RhbnQ7CisgICB1bnNpZ25lZCB3cml0ZV9tYXNrOworCisgICAvKiogTWFzayBvZiB2YWx1ZXMgaW5pdGlhbGx5IGF2YWlsYWJsZSBpbiB0aGUgY29uc3RhbnQuICovCisgICB1bnNpZ25lZCBpbml0aWFsX3ZhbHVlczsKK307CisKKworY2xhc3Mga2lsbF9lbnRyeSA6IHB1YmxpYyBleGVjX25vZGUKK3sKK3B1YmxpYzoKKyAgIGtpbGxfZW50cnkoaXJfdmFyaWFibGUgKnZhciwgdW5zaWduZWQgd3JpdGVfbWFzaykKKyAgIHsKKyAgICAgIGFzc2VydCh2YXIpOworICAgICAgdGhpcy0+dmFyID0gdmFyOworICAgICAgdGhpcy0+d3JpdGVfbWFzayA9IHdyaXRlX21hc2s7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICp2YXI7CisgICB1bnNpZ25lZCB3cml0ZV9tYXNrOworfTsKKworY2xhc3MgaXJfY29uc3RhbnRfcHJvcGFnYXRpb25fdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9jb25zdGFudF9wcm9wYWdhdGlvbl92aXNpdG9yKCkKKyAgIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisgICAgICBraWxsZWRfYWxsID0gZmFsc2U7CisgICAgICBtZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoMCk7CisgICAgICB0aGlzLT5hY3AgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgICAgdGhpcy0+a2lsbHMgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgfQorICAgfmlyX2NvbnN0YW50X3Byb3BhZ2F0aW9uX3Zpc2l0b3IoKQorICAgeworICAgICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfbG9vcCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihjbGFzcyBpcl9mdW5jdGlvbiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfYXNzaWdubWVudCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfY2FsbCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfaWYgKik7CisKKyAgIHZvaWQgYWRkX2NvbnN0YW50KGlyX2Fzc2lnbm1lbnQgKmlyKTsKKyAgIHZvaWQga2lsbChpcl92YXJpYWJsZSAqaXIsIHVuc2lnbmVkIHdyaXRlX21hc2spOworICAgdm9pZCBoYW5kbGVfaWZfYmxvY2soZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworICAgdm9pZCBoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSk7CisKKyAgIC8qKiBMaXN0IG9mIGFjcF9lbnRyeTogVGhlIGF2YWlsYWJsZSBjb25zdGFudHMgdG8gcHJvcGFnYXRlICovCisgICBleGVjX2xpc3QgKmFjcDsKKworICAgLyoqCisgICAgKiBMaXN0IG9mIGtpbGxfZW50cnk6IFRoZSBtYXNrcyBvZiB2YXJpYWJsZXMgd2hvc2UgdmFsdWVzIHdlcmUKKyAgICAqIGtpbGxlZCBpbiB0aGlzIGJsb2NrLgorICAgICovCisgICBleGVjX2xpc3QgKmtpbGxzOworCisgICBib29sIHByb2dyZXNzOworCisgICBib29sIGtpbGxlZF9hbGw7CisKKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCisKK3ZvaWQKK2lyX2NvbnN0YW50X3Byb3BhZ2F0aW9uX3Zpc2l0b3I6OmhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKQoreworICAgaWYgKHRoaXMtPmluX2Fzc2lnbmVlIHx8ICEqcnZhbHVlKQorICAgICAgcmV0dXJuOworCisgICBjb25zdCBnbHNsX3R5cGUgKnR5cGUgPSAoKnJ2YWx1ZSktPnR5cGU7CisgICBpZiAoIXR5cGUtPmlzX3NjYWxhcigpICYmICF0eXBlLT5pc192ZWN0b3IoKSkKKyAgICAgIHJldHVybjsKKworICAgaXJfc3dpenpsZSAqc3dpeiA9IE5VTEw7CisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWYgPSAoKnJ2YWx1ZSktPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICBpZiAoIWRlcmVmKSB7CisgICAgICBzd2l6ID0gKCpydmFsdWUpLT5hc19zd2l6emxlKCk7CisgICAgICBpZiAoIXN3aXopCisJIHJldHVybjsKKworICAgICAgZGVyZWYgPSBzd2l6LT52YWwtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICAgICBpZiAoIWRlcmVmKQorCSByZXR1cm47CisgICB9CisKKyAgIGlyX2NvbnN0YW50X2RhdGEgZGF0YTsKKyAgIG1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKworICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0eXBlLT5jb21wb25lbnRzKCk7IGkrKykgeworICAgICAgaW50IGNoYW5uZWw7CisgICAgICBhY3BfZW50cnkgKmZvdW5kID0gTlVMTDsKKworICAgICAgaWYgKHN3aXopIHsKKwkgc3dpdGNoIChpKSB7CisJIGNhc2UgMDogY2hhbm5lbCA9IHN3aXotPm1hc2sueDsgYnJlYWs7CisJIGNhc2UgMTogY2hhbm5lbCA9IHN3aXotPm1hc2sueTsgYnJlYWs7CisJIGNhc2UgMjogY2hhbm5lbCA9IHN3aXotPm1hc2suejsgYnJlYWs7CisJIGNhc2UgMzogY2hhbm5lbCA9IHN3aXotPm1hc2sudzsgYnJlYWs7CisJIGRlZmF1bHQ6IGFzc2VydCghInNob3VsZG4ndCBiZSByZWFjaGVkIik7IGNoYW5uZWwgPSAwOyBicmVhazsKKwkgfQorICAgICAgfSBlbHNlIHsKKwkgY2hhbm5lbCA9IGk7CisgICAgICB9CisKKyAgICAgIGZvcmVhY2hfbGlzdChuLCB0aGlzLT5hY3ApIHsKKwkgYWNwX2VudHJ5ICplbnRyeSA9IChhY3BfZW50cnkgKikgbjsKKwkgaWYgKGVudHJ5LT52YXIgPT0gZGVyZWYtPnZhciAmJiBlbnRyeS0+d3JpdGVfbWFzayAmICgxIDw8IGNoYW5uZWwpKSB7CisJICAgIGZvdW5kID0gZW50cnk7CisJICAgIGJyZWFrOworCSB9CisgICAgICB9CisKKyAgICAgIGlmICghZm91bmQpCisJIHJldHVybjsKKworICAgICAgaW50IHJoc19jaGFubmVsID0gMDsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisJIGlmIChqID09IGNoYW5uZWwpCisJICAgIGJyZWFrOworCSBpZiAoZm91bmQtPmluaXRpYWxfdmFsdWVzICYgKDEgPDwgaikpCisJICAgIHJoc19jaGFubmVsKys7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHlwZS0+YmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgZGF0YS5mW2ldID0gZm91bmQtPmNvbnN0YW50LT52YWx1ZS5mW3Joc19jaGFubmVsXTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisJIGRhdGEuaVtpXSA9IGZvdW5kLT5jb25zdGFudC0+dmFsdWUuaVtyaHNfY2hhbm5lbF07CisJIGJyZWFrOworICAgICAgY2FzZSBHTFNMX1RZUEVfVUlOVDoKKwkgZGF0YS51W2ldID0gZm91bmQtPmNvbnN0YW50LT52YWx1ZS51W3Joc19jaGFubmVsXTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorCSBkYXRhLmJbaV0gPSBmb3VuZC0+Y29uc3RhbnQtPnZhbHVlLmJbcmhzX2NoYW5uZWxdOworCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisJIGJyZWFrOworICAgICAgfQorICAgfQorCisgICAqcnZhbHVlID0gbmV3KHJhbGxvY19wYXJlbnQoZGVyZWYpKSBpcl9jb25zdGFudCh0eXBlLCAmZGF0YSk7CisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb25zdGFudF9wcm9wYWdhdGlvbl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgLyogVHJlYXQgZW50cnkgaW50byBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBhcyBhIGNvbXBsZXRlbHkgc2VwYXJhdGUKKyAgICAqIGJsb2NrLiAgQW55IGluc3RydWN0aW9ucyBhdCBnbG9iYWwgc2NvcGUgd2lsbCBiZSBzaHVmZmxlZCBpbnRvCisgICAgKiBtYWluKCkgYXQgbGluayB0aW1lLCBzbyB0aGV5J3JlIGlycmVsZXZhbnQgdG8gdXMuCisgICAgKi8KKyAgIGV4ZWNfbGlzdCAqb3JpZ19hY3AgPSB0aGlzLT5hY3A7CisgICBleGVjX2xpc3QgKm9yaWdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIGJvb2wgb3JpZ19raWxsZWRfYWxsID0gdGhpcy0+a2lsbGVkX2FsbDsKKworICAgdGhpcy0+YWNwID0gbmV3KG1lbV9jdHgpIGV4ZWNfbGlzdDsKKyAgIHRoaXMtPmtpbGxzID0gbmV3KG1lbV9jdHgpIGV4ZWNfbGlzdDsKKyAgIHRoaXMtPmtpbGxlZF9hbGwgPSBmYWxzZTsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCAmaXItPmJvZHkpOworCisgICB0aGlzLT5raWxscyA9IG9yaWdfa2lsbHM7CisgICB0aGlzLT5hY3AgPSBvcmlnX2FjcDsKKyAgIHRoaXMtPmtpbGxlZF9hbGwgPSBvcmlnX2tpbGxlZF9hbGw7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NvbnN0YW50X3Byb3BhZ2F0aW9uX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgaWYgKHRoaXMtPmluX2Fzc2lnbmVlKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICB1bnNpZ25lZCBraWxsX21hc2sgPSBpci0+d3JpdGVfbWFzazsKKyAgIGlmIChpci0+bGhzLT5hc19kZXJlZmVyZW5jZV9hcnJheSgpKSB7CisgICAgICAvKiBUaGUgTEhTIG9mIHRoZSBhc3NpZ25tZW50IHVzZXMgYW4gYXJyYXkgaW5kZXhpbmcgb3BlcmF0b3IgKGUuZy4gdltpXQorICAgICAgICogPSAuLi47KS4gIFNpbmNlIHdlIG9ubHkgdHJ5IHRvIGNvbnN0YW50IHByb3BhZ2F0ZSB2ZWN0b3JzIGFuZAorICAgICAgICogc2NhbGFycywgdGhpcyBtZWFucyB0aGF0IGVpdGhlciAoYSkgYXJyYXkgaW5kZXhpbmcgaXMgYmVpbmcgdXNlZCB0bworICAgICAgICogc2VsZWN0IGEgdmVjdG9yIGNvbXBvbmVudCwgb3IgKGIpIHRoZSB2YXJpYWJsZSBpbiBxdWVzdGlvbiBpcyBuZWl0aGVyCisgICAgICAgKiBhIHNjYWxhciBvciBhIHZlY3Rvciwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCBpdC4gIEluIHRoZSBmb3JtZXIgY2FzZSwKKyAgICAgICAqIHdlIHdhbnQgdG8ga2lsbCB0aGUgd2hvbGUgdmVjdG9yLCBzaW5jZSBpbiBnZW5lcmFsIHdlIGNhbid0IHByZWRpY3QKKyAgICAgICAqIHdoaWNoIHZlY3RvciBjb21wb25lbnQgd2lsbCBiZSBzZWxlY3RlZCBieSBhcnJheSBpbmRleGluZy4gIEluIHRoZQorICAgICAgICogbGF0dGVyIGNhc2UsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgd2UgZG8sIHNvIGdvIGFoZWFkIGFuZCBraWxsIHRoZQorICAgICAgICogd2hvbGUgdmFyaWFibGUgYW55d2F5LgorICAgICAgICoKKyAgICAgICAqIE5vdGUgdGhhdCBpZiB0aGUgYXJyYXkgaW5kZXggaXMgY29uc3RhbnQgKGUuZy4gdlsyXSA9IC4uLjspLCB3ZSBjb3VsZAorICAgICAgICogaW4gcHJpbmNpcGxlIGJlIHNtYXJ0ZXIsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvLCBiZWNhdXNlIGEgZnV0dXJlCisgICAgICAgKiBvcHRpbWl6YXRpb24gcGFzcyB3aWxsIGNvbnZlcnQgaXQgdG8gYSBzaW1wbGUgYXNzaWdubWVudCB3aXRoIHRoZQorICAgICAgICogY29ycmVjdCBtYXNrLgorICAgICAgICovCisgICAgICBraWxsX21hc2sgPSB+MDsKKyAgIH0KKyAgIGtpbGwoaXItPmxocy0+dmFyaWFibGVfcmVmZXJlbmNlZCgpLCBraWxsX21hc2spOworCisgICBhZGRfY29uc3RhbnQoaXIpOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb25zdGFudF9wcm9wYWdhdGlvbl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbiAqaXIpCit7CisgICAodm9pZCkgaXI7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb25zdGFudF9wcm9wYWdhdGlvbl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9jYWxsICppcikKK3sKKyAgIC8qIERvIGNvbnN0YW50IHByb3BhZ2F0aW9uIG9uIGNhbGwgcGFyYW1ldGVycywgYnV0IHNraXAgYW55IG91dCBwYXJhbXMgKi8KKyAgIGZvcmVhY2hfdHdvX2xpc3RzKGZvcm1hbF9ub2RlLCAmaXItPmNhbGxlZS0+cGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9ub2RlLCAmaXItPmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisgICAgICBpcl92YXJpYWJsZSAqc2lnX3BhcmFtID0gKGlyX3ZhcmlhYmxlICopIGZvcm1hbF9ub2RlOworICAgICAgaXJfcnZhbHVlICpwYXJhbSA9IChpcl9ydmFsdWUgKikgYWN0dWFsX25vZGU7CisgICAgICBpZiAoc2lnX3BhcmFtLT5kYXRhLm1vZGUgIT0gaXJfdmFyX2Z1bmN0aW9uX291dAorICAgICAgICAgICYmIHNpZ19wYXJhbS0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9mdW5jdGlvbl9pbm91dCkgeworCSBpcl9ydmFsdWUgKm5ld19wYXJhbSA9IHBhcmFtOworCSBoYW5kbGVfcnZhbHVlKCZuZXdfcGFyYW0pOworICAgICAgICAgaWYgKG5ld19wYXJhbSAhPSBwYXJhbSkKKwkgICAgcGFyYW0tPnJlcGxhY2Vfd2l0aChuZXdfcGFyYW0pOworCSBlbHNlCisJICAgIHBhcmFtLT5hY2NlcHQodGhpcyk7CisgICAgICB9CisgICB9CisKKyAgIC8qIFNpbmNlIHdlJ3JlIHVubGlua2VkLCB3ZSBkb24ndCAobmVjc3NhcmlseSkga25vdyB0aGUgc2lkZSBlZmZlY3RzIG9mCisgICAgKiB0aGlzIGNhbGwuICBTbyBraWxsIGFsbCBjb3BpZXMuCisgICAgKi8KKyAgIGFjcC0+bWFrZV9lbXB0eSgpOworICAgdGhpcy0+a2lsbGVkX2FsbCA9IHRydWU7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKwordm9pZAoraXJfY29uc3RhbnRfcHJvcGFnYXRpb25fdmlzaXRvcjo6aGFuZGxlX2lmX2Jsb2NrKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgZXhlY19saXN0ICpvcmlnX2FjcCA9IHRoaXMtPmFjcDsKKyAgIGV4ZWNfbGlzdCAqb3JpZ19raWxscyA9IHRoaXMtPmtpbGxzOworICAgYm9vbCBvcmlnX2tpbGxlZF9hbGwgPSB0aGlzLT5raWxsZWRfYWxsOworCisgICB0aGlzLT5hY3AgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbHMgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbGVkX2FsbCA9IGZhbHNlOworCisgICAvKiBQb3B1bGF0ZSB0aGUgaW5pdGlhbCBhY3Agd2l0aCBhIGNvbnN0YW50IG9mIHRoZSBvcmlnaW5hbCAqLworICAgZm9yZWFjaF9saXN0KG4sIG9yaWdfYWNwKSB7CisgICAgICBhY3BfZW50cnkgKmEgPSAoYWNwX2VudHJ5ICopIG47CisgICAgICB0aGlzLT5hY3AtPnB1c2hfdGFpbChuZXcodGhpcy0+bWVtX2N0eCkgYWNwX2VudHJ5KGEpKTsKKyAgIH0KKworICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCBpbnN0cnVjdGlvbnMpOworCisgICBpZiAodGhpcy0+a2lsbGVkX2FsbCkgeworICAgICAgb3JpZ19hY3AtPm1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgZXhlY19saXN0ICpuZXdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIHRoaXMtPmtpbGxzID0gb3JpZ19raWxsczsKKyAgIHRoaXMtPmFjcCA9IG9yaWdfYWNwOworICAgdGhpcy0+a2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGwgfHwgb3JpZ19raWxsZWRfYWxsOworCisgICBmb3JlYWNoX2xpc3QobiwgbmV3X2tpbGxzKSB7CisgICAgICBraWxsX2VudHJ5ICprID0gKGtpbGxfZW50cnkgKikgbjsKKyAgICAgIGtpbGwoay0+dmFyLCBrLT53cml0ZV9tYXNrKTsKKyAgIH0KK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NvbnN0YW50X3Byb3BhZ2F0aW9uX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2lmICppcikKK3sKKyAgIGlyLT5jb25kaXRpb24tPmFjY2VwdCh0aGlzKTsKKyAgIGhhbmRsZV9ydmFsdWUoJmlyLT5jb25kaXRpb24pOworCisgICBoYW5kbGVfaWZfYmxvY2soJmlyLT50aGVuX2luc3RydWN0aW9ucyk7CisgICBoYW5kbGVfaWZfYmxvY2soJmlyLT5lbHNlX2luc3RydWN0aW9ucyk7CisKKyAgIC8qIGhhbmRsZV9pZl9ibG9jaygpIGFscmVhZHkgZGVzY2VuZGVkIGludG8gdGhlIGNoaWxkcmVuLiAqLworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29uc3RhbnRfcHJvcGFnYXRpb25fdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfbG9vcCAqaXIpCit7CisgICBleGVjX2xpc3QgKm9yaWdfYWNwID0gdGhpcy0+YWNwOworICAgZXhlY19saXN0ICpvcmlnX2tpbGxzID0gdGhpcy0+a2lsbHM7CisgICBib29sIG9yaWdfa2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGw7CisKKyAgIC8qIEZJTklTSE1FOiBGb3Igbm93LCB0aGUgaW5pdGlhbCBhY3AgZm9yIGxvb3BzIGlzIHRvdGFsbHkgZW1wdHkuCisgICAgKiBXZSBjb3VsZCBnbyB0aHJvdWdoIG9uY2UsIHRoZW4gZ28gdGhyb3VnaCBhZ2FpbiB3aXRoIHRoZSBhY3AKKyAgICAqIGNsb25lZCBtaW51cyB0aGUga2lsbGVkIGVudHJpZXMgYWZ0ZXIgdGhlIGZpcnN0IHJ1biB0aHJvdWdoLgorICAgICovCisgICB0aGlzLT5hY3AgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbHMgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbGVkX2FsbCA9IGZhbHNlOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKHRoaXMsICZpci0+Ym9keV9pbnN0cnVjdGlvbnMpOworCisgICBpZiAodGhpcy0+a2lsbGVkX2FsbCkgeworICAgICAgb3JpZ19hY3AtPm1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgZXhlY19saXN0ICpuZXdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIHRoaXMtPmtpbGxzID0gb3JpZ19raWxsczsKKyAgIHRoaXMtPmFjcCA9IG9yaWdfYWNwOworICAgdGhpcy0+a2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGwgfHwgb3JpZ19raWxsZWRfYWxsOworCisgICBmb3JlYWNoX2xpc3QobiwgbmV3X2tpbGxzKSB7CisgICAgICBraWxsX2VudHJ5ICprID0gKGtpbGxfZW50cnkgKikgbjsKKyAgICAgIGtpbGwoay0+dmFyLCBrLT53cml0ZV9tYXNrKTsKKyAgIH0KKworICAgLyogYWxyZWFkeSBkZXNjZW5kZWQgaW50byB0aGUgY2hpbGRyZW4uICovCisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKK3ZvaWQKK2lyX2NvbnN0YW50X3Byb3BhZ2F0aW9uX3Zpc2l0b3I6OmtpbGwoaXJfdmFyaWFibGUgKnZhciwgdW5zaWduZWQgd3JpdGVfbWFzaykKK3sKKyAgIGFzc2VydCh2YXIgIT0gTlVMTCk7CisKKyAgIC8qIFdlIGRvbid0IHRyYWNrIG5vbi12ZWN0b3JzLiAqLworICAgaWYgKCF2YXItPnR5cGUtPmlzX3ZlY3RvcigpICYmICF2YXItPnR5cGUtPmlzX3NjYWxhcigpKQorICAgICAgcmV0dXJuOworCisgICAvKiBSZW1vdmUgYW55IGVudHJpZXMgY3VycmVudGx5IGluIHRoZSBBQ1AgZm9yIHRoaXMga2lsbC4gKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG4sIHRoaXMtPmFjcCkgeworICAgICAgYWNwX2VudHJ5ICplbnRyeSA9IChhY3BfZW50cnkgKikgbjsKKworICAgICAgaWYgKGVudHJ5LT52YXIgPT0gdmFyKSB7CisJIGVudHJ5LT53cml0ZV9tYXNrICY9IH53cml0ZV9tYXNrOworCSBpZiAoZW50cnktPndyaXRlX21hc2sgPT0gMCkKKwkgICAgZW50cnktPnJlbW92ZSgpOworICAgICAgfQorICAgfQorCisgICAvKiBBZGQgdGhpcyB3cml0ZW1hc2sgb2YgdGhlIHZhcmlhYmxlIHRvIHRoZSBsaXN0IG9mIGtpbGxlZAorICAgICogdmFyaWFibGVzIGluIHRoaXMgYmxvY2suCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdChuLCB0aGlzLT5raWxscykgeworICAgICAga2lsbF9lbnRyeSAqZW50cnkgPSAoa2lsbF9lbnRyeSAqKSBuOworCisgICAgICBpZiAoZW50cnktPnZhciA9PSB2YXIpIHsKKwkgZW50cnktPndyaXRlX21hc2sgfD0gd3JpdGVfbWFzazsKKwkgcmV0dXJuOworICAgICAgfQorICAgfQorICAgLyogTm90IGFscmVhZHkgaW4gdGhlIGxpc3QuICBNYWtlIG5ldyBlbnRyeS4gKi8KKyAgIHRoaXMtPmtpbGxzLT5wdXNoX3RhaWwobmV3KHRoaXMtPm1lbV9jdHgpIGtpbGxfZW50cnkodmFyLCB3cml0ZV9tYXNrKSk7Cit9CisKKy8qKgorICogQWRkcyBhbiBlbnRyeSB0byB0aGUgYXZhaWxhYmxlIGNvbnN0YW50IGxpc3QgaWYgaXQncyBhIHBsYWluIGFzc2lnbm1lbnQKKyAqIG9mIGEgdmFyaWFibGUgdG8gYSB2YXJpYWJsZS4KKyAqLwordm9pZAoraXJfY29uc3RhbnRfcHJvcGFnYXRpb25fdmlzaXRvcjo6YWRkX2NvbnN0YW50KGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgYWNwX2VudHJ5ICplbnRyeTsKKworICAgaWYgKGlyLT5jb25kaXRpb24pCisgICAgICByZXR1cm47CisKKyAgIGlmICghaXItPndyaXRlX21hc2spCisgICAgICByZXR1cm47CisKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpkZXJlZiA9IGlyLT5saHMtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICBpcl9jb25zdGFudCAqY29uc3RhbnQgPSBpci0+cmhzLT5hc19jb25zdGFudCgpOworCisgICBpZiAoIWRlcmVmIHx8ICFjb25zdGFudCkKKyAgICAgIHJldHVybjsKKworICAgLyogT25seSBkbyBjb25zdGFudCBwcm9wYWdhdGlvbiBvbiB2ZWN0b3JzLiAgQ29uc3RhbnQgbWF0cmljZXMsCisgICAgKiBhcnJheXMsIG9yIHN0cnVjdHVyZXMgd291bGQgcmVxdWlyZSBtb3JlIHdvcmsgZWxzZXdoZXJlLgorICAgICovCisgICBpZiAoIWRlcmVmLT52YXItPnR5cGUtPmlzX3ZlY3RvcigpICYmICFkZXJlZi0+dmFyLT50eXBlLT5pc19zY2FsYXIoKSkKKyAgICAgIHJldHVybjsKKworICAgZW50cnkgPSBuZXcodGhpcy0+bWVtX2N0eCkgYWNwX2VudHJ5KGRlcmVmLT52YXIsIGlyLT53cml0ZV9tYXNrLCBjb25zdGFudCk7CisgICB0aGlzLT5hY3AtPnB1c2hfdGFpbChlbnRyeSk7Cit9CisKK30gLyogdW5uYW1lZCBuYW1lc3BhY2UgKi8KKworLyoqCisgKiBEb2VzIGEgY29uc3RhbnQgcHJvcGFnYXRpb24gcGFzcyBvbiB0aGUgY29kZSBwcmVzZW50IGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uCisgKi8KK2Jvb2wKK2RvX2NvbnN0YW50X3Byb3BhZ2F0aW9uKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaXJfY29uc3RhbnRfcHJvcGFnYXRpb25fdmlzaXRvciB2OworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NvbnN0YW50X3ZhcmlhYmxlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NvbnN0YW50X3ZhcmlhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjFiOGFhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfY29uc3RhbnRfdmFyaWFibGUuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfY29uc3RhbnRfdmFyaWFibGUuY3BwCisgKgorICogTWFya3MgdmFyaWFibGVzIGFzc2lnbmVkIGEgc2luZ2xlIGNvbnN0YW50IHZhbHVlIG92ZXIgdGhlIGNvdXJzZQorICogb2YgdGhlIHByb2dyYW0gYXMgY29uc3RhbnQuCisgKgorICogVGhlIGdvYWwgaGVyZSBpcyB0byB0cmlnZ2VyIGZ1cnRoZXIgY29uc3RhbnQgZm9sZGluZyBhbmQgdGhlbiBkZWFkCisgKiBjb2RlIGVsaW1pbmF0aW9uLiAgVGhpcyBpcyBjb21tb24gd2l0aCB2ZWN0b3IvbWF0cml4IGNvbnN0cnVjdG9ycworICogYW5kIGNhbGxzIHRvIGJ1aWx0aW4gZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBhc3NpZ25tZW50X2VudHJ5IHsKKyAgIGV4ZWNfbm9kZSBsaW5rOworICAgaW50IGFzc2lnbm1lbnRfY291bnQ7CisgICBpcl92YXJpYWJsZSAqdmFyOworICAgaXJfY29uc3RhbnQgKmNvbnN0dmFsOworICAgYm9vbCBvdXJfc2NvcGU7Cit9OworCitjbGFzcyBpcl9jb25zdGFudF92YXJpYWJsZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX3ZhcmlhYmxlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9jYWxsICopOworCisgICBleGVjX2xpc3QgbGlzdDsKK307CisKK30gLyogdW5uYW1lZCBuYW1lc3BhY2UgKi8KKworc3RhdGljIHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5ICoKK2dldF9hc3NpZ25tZW50X2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIsIGV4ZWNfbGlzdCAqbGlzdCkKK3sKKyAgIHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5ICplbnRyeTsKKworICAgZm9yZWFjaF9saXN0X3R5cGVkKHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5LCBlbnRyeSwgbGluaywgbGlzdCkgeworICAgICAgaWYgKGVudHJ5LT52YXIgPT0gdmFyKQorCSByZXR1cm4gZW50cnk7CisgICB9CisKKyAgIGVudHJ5ID0gKHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5ICopY2FsbG9jKDEsIHNpemVvZigqZW50cnkpKTsKKyAgIGVudHJ5LT52YXIgPSB2YXI7CisgICBsaXN0LT5wdXNoX2hlYWQoJmVudHJ5LT5saW5rKTsKKyAgIHJldHVybiBlbnRyeTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NvbnN0YW50X3ZhcmlhYmxlX3Zpc2l0b3I6OnZpc2l0KGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5ICplbnRyeSA9IGdldF9hc3NpZ25tZW50X2VudHJ5KGlyLCAmdGhpcy0+bGlzdCk7CisgICBlbnRyeS0+b3VyX3Njb3BlID0gdHJ1ZTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworLyogU2tpcCBkZXJlZnMgb2YgdmFyaWFibGVzIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBkZWNsYXJhdGlvbnMuICovCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29uc3RhbnRfdmFyaWFibGVfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQoreworICAgKHZvaWQpaXI7CisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb25zdGFudF92YXJpYWJsZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGlyX2NvbnN0YW50ICpjb25zdHZhbDsKKyAgIHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5ICplbnRyeTsKKworICAgZW50cnkgPSBnZXRfYXNzaWdubWVudF9lbnRyeShpci0+bGhzLT52YXJpYWJsZV9yZWZlcmVuY2VkKCksICZ0aGlzLT5saXN0KTsKKyAgIGFzc2VydChlbnRyeSk7CisgICBlbnRyeS0+YXNzaWdubWVudF9jb3VudCsrOworCisgICAvKiBJZiBpdCdzIGFscmVhZHkgY29uc3RhbnQsIGRvbid0IGRvIHRoZSB3b3JrLiAqLworICAgaWYgKGVudHJ5LT52YXItPmNvbnN0YW50X3ZhbHVlKQorICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICAvKiBPSywgbm93IGZpbmQgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhbGwgdGhlIHJpZ2h0IGNvbmRpdGlvbnMgZm9yCisgICAgKiB0aGlzIHRvIGJlIGEgY29uc3RhbnQgdmFsdWUgYXNzaWduZWQgdG8gdGhlIHZhci4KKyAgICAqLworICAgaWYgKGlyLT5jb25kaXRpb24pCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBpci0+d2hvbGVfdmFyaWFibGVfd3JpdHRlbigpOworICAgaWYgKCF2YXIpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGNvbnN0dmFsID0gaXItPnJocy0+Y29uc3RhbnRfZXhwcmVzc2lvbl92YWx1ZSgpOworICAgaWYgKCFjb25zdHZhbCkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgLyogTWFyayB0aGlzIGVudHJ5IGFzIGhhdmluZyBhIGNvbnN0YW50IGFzc2lnbm1lbnQgKGlmIHRoZQorICAgICogYXNzaWdubWVudCBjb3VudCBkb2Vzbid0IGdvID4xKS4gIGRvX2NvbnN0YW50X3ZhcmlhYmxlIHdpbGwgZml4CisgICAgKiB1cCB0aGUgdmFyaWFibGUgd2l0aCB0aGUgY29uc3RhbnQgdmFsdWUgbGF0ZXIuCisgICAgKi8KKyAgIGVudHJ5LT5jb25zdHZhbCA9IGNvbnN0dmFsOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb25zdGFudF92YXJpYWJsZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9jYWxsICppcikKK3sKKyAgIC8qIE1hcmsgYW55IG91dCBwYXJhbWV0ZXJzIGFzIGFzc2lnbmVkIHRvICovCisgICBmb3JlYWNoX3R3b19saXN0cyhmb3JtYWxfbm9kZSwgJmlyLT5jYWxsZWUtPnBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfbm9kZSwgJmlyLT5hY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICpwYXJhbV9ydmFsID0gKGlyX3J2YWx1ZSAqKSBhY3R1YWxfbm9kZTsKKyAgICAgIGlyX3ZhcmlhYmxlICpwYXJhbSA9IChpcl92YXJpYWJsZSAqKSBmb3JtYWxfbm9kZTsKKworICAgICAgaWYgKHBhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX291dCB8fAorCSAgcGFyYW0tPmRhdGEubW9kZSA9PSBpcl92YXJfZnVuY3Rpb25faW5vdXQpIHsKKwkgaXJfdmFyaWFibGUgKnZhciA9IHBhcmFtX3J2YWwtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKwkgc3RydWN0IGFzc2lnbm1lbnRfZW50cnkgKmVudHJ5OworCisJIGFzc2VydCh2YXIpOworCSBlbnRyeSA9IGdldF9hc3NpZ25tZW50X2VudHJ5KHZhciwgJnRoaXMtPmxpc3QpOworCSBlbnRyeS0+YXNzaWdubWVudF9jb3VudCsrOworICAgICAgfQorICAgfQorCisgICAvKiBNYXJrIHRoZSByZXR1cm4gc3RvcmFnZSBhcyBoYXZpbmcgYmVlbiBhc3NpZ25lZCB0byAqLworICAgaWYgKGlyLT5yZXR1cm5fZGVyZWYgIT0gTlVMTCkgeworICAgICAgaXJfdmFyaWFibGUgKnZhciA9IGlyLT5yZXR1cm5fZGVyZWYtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgICAgIHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5ICplbnRyeTsKKworICAgICAgYXNzZXJ0KHZhcik7CisgICAgICBlbnRyeSA9IGdldF9hc3NpZ25tZW50X2VudHJ5KHZhciwgJnRoaXMtPmxpc3QpOworICAgICAgZW50cnktPmFzc2lnbm1lbnRfY291bnQrKzsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisvKioKKyAqIERvZXMgYSBjb3B5IHByb3BhZ2F0aW9uIHBhc3Mgb24gdGhlIGNvZGUgcHJlc2VudCBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLgorICovCitib29sCitkb19jb25zdGFudF92YXJpYWJsZShleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGJvb2wgcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIGlyX2NvbnN0YW50X3ZhcmlhYmxlX3Zpc2l0b3IgdjsKKworICAgdi5ydW4oaW5zdHJ1Y3Rpb25zKTsKKworICAgd2hpbGUgKCF2Lmxpc3QuaXNfZW1wdHkoKSkgeworCisgICAgICBzdHJ1Y3QgYXNzaWdubWVudF9lbnRyeSAqZW50cnk7CisgICAgICBlbnRyeSA9IGV4ZWNfbm9kZV9kYXRhKHN0cnVjdCBhc3NpZ25tZW50X2VudHJ5LCB2Lmxpc3QuaGVhZCwgbGluayk7CisKKyAgICAgIGlmIChlbnRyeS0+YXNzaWdubWVudF9jb3VudCA9PSAxICYmIGVudHJ5LT5jb25zdHZhbCAmJiBlbnRyeS0+b3VyX3Njb3BlKSB7CisJIGVudHJ5LT52YXItPmNvbnN0YW50X3ZhbHVlID0gZW50cnktPmNvbnN0dmFsOworCSBwcm9ncmVzcyA9IHRydWU7CisgICAgICB9CisgICAgICBlbnRyeS0+bGluay5yZW1vdmUoKTsKKyAgICAgIGZyZWUoZW50cnkpOworICAgfQorCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK2Jvb2wKK2RvX2NvbnN0YW50X3ZhcmlhYmxlX3VubGlua2VkKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworCisgICBmb3JlYWNoX2xpc3QobiwgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICBpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKikgbjsKKyAgICAgIGlyX2Z1bmN0aW9uICpmID0gaXItPmFzX2Z1bmN0aW9uKCk7CisgICAgICBpZiAoZikgeworCSBmb3JlYWNoX2xpc3Qoc2lnbm9kZSwgJmYtPnNpZ25hdHVyZXMpIHsKKwkgICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWcgPSAoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopIHNpZ25vZGU7CisJICAgIGlmIChkb19jb25zdGFudF92YXJpYWJsZSgmc2lnLT5ib2R5KSkKKwkgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSB9CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NvcHlfcHJvcGFnYXRpb24uY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfY29weV9wcm9wYWdhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1Y2M4YgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NvcHlfcHJvcGFnYXRpb24uY3BwCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfY29weV9wcm9wYWdhdGlvbi5jcHAKKyAqCisgKiBNb3ZlcyB1c2FnZSBvZiByZWNlbnRseS1jb3BpZWQgdmFyaWFibGVzIHRvIHRoZSBwcmV2aW91cyBjb3B5IG9mCisgKiB0aGUgdmFyaWFibGUuCisgKgorICogVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBudW1iZXIgb2YgTU9WIGluc3RydWN0aW9ucyBpbiB0aGUgZ2VuZXJhdGVkCisgKiBwcm9ncmFtcyB1bmxlc3MgY29weSBwcm9wYWdhdGlvbiBpcyBhbHNvIGRvbmUgb24gdGhlIExJUiwgYW5kIG1heQorICogaGVscCBhbnl3YXkgYnkgdHJpZ2dlcmluZyBvdGhlciBvcHRpbWl6YXRpb25zIHRoYXQgbGl2ZSBpbiB0aGUgSElSLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9iYXNpY19ibG9jay5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgYWNwX2VudHJ5IDogcHVibGljIGV4ZWNfbm9kZQoreworcHVibGljOgorICAgYWNwX2VudHJ5KGlyX3ZhcmlhYmxlICpsaHMsIGlyX3ZhcmlhYmxlICpyaHMpCisgICB7CisgICAgICBhc3NlcnQobGhzKTsKKyAgICAgIGFzc2VydChyaHMpOworICAgICAgdGhpcy0+bGhzID0gbGhzOworICAgICAgdGhpcy0+cmhzID0gcmhzOworICAgfQorCisgICBpcl92YXJpYWJsZSAqbGhzOworICAgaXJfdmFyaWFibGUgKnJoczsKK307CisKKworY2xhc3Mga2lsbF9lbnRyeSA6IHB1YmxpYyBleGVjX25vZGUKK3sKK3B1YmxpYzoKKyAgIGtpbGxfZW50cnkoaXJfdmFyaWFibGUgKnZhcikKKyAgIHsKKyAgICAgIGFzc2VydCh2YXIpOworICAgICAgdGhpcy0+dmFyID0gdmFyOworICAgfQorCisgICBpcl92YXJpYWJsZSAqdmFyOworfTsKKworY2xhc3MgaXJfY29weV9wcm9wYWdhdGlvbl92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX2NvcHlfcHJvcGFnYXRpb25fdmlzaXRvcigpCisgICB7CisgICAgICBwcm9ncmVzcyA9IGZhbHNlOworICAgICAgbWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KDApOworICAgICAgdGhpcy0+YWNwID0gbmV3KG1lbV9jdHgpIGV4ZWNfbGlzdDsKKyAgICAgIHRoaXMtPmtpbGxzID0gbmV3KG1lbV9jdHgpIGV4ZWNfbGlzdDsKKyAgIH0KKyAgIH5pcl9jb3B5X3Byb3BhZ2F0aW9uX3Zpc2l0b3IoKQorICAgeworICAgICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoY2xhc3MgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2xvb3AgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfZnVuY3Rpb24gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX2Fzc2lnbm1lbnQgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2NhbGwgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2lmICopOworCisgICB2b2lkIGFkZF9jb3B5KGlyX2Fzc2lnbm1lbnQgKmlyKTsKKyAgIHZvaWQga2lsbChpcl92YXJpYWJsZSAqaXIpOworICAgdm9pZCBoYW5kbGVfaWZfYmxvY2soZXhlY19saXN0ICppbnN0cnVjdGlvbnMpOworCisgICAvKiogTGlzdCBvZiBhY3BfZW50cnk6IFRoZSBhdmFpbGFibGUgY29waWVzIHRvIHByb3BhZ2F0ZSAqLworICAgZXhlY19saXN0ICphY3A7CisgICAvKioKKyAgICAqIExpc3Qgb2Yga2lsbF9lbnRyeTogVGhlIHZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgd2VyZSBraWxsZWQgaW4gdGhpcworICAgICogYmxvY2suCisgICAgKi8KKyAgIGV4ZWNfbGlzdCAqa2lsbHM7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7CisKKyAgIGJvb2wga2lsbGVkX2FsbDsKKworICAgdm9pZCAqbWVtX2N0eDsKK307CisKK30gLyogdW5uYW1lZCBuYW1lc3BhY2UgKi8KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NvcHlfcHJvcGFnYXRpb25fdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICppcikKK3sKKyAgIC8qIFRyZWF0IGVudHJ5IGludG8gYSBmdW5jdGlvbiBzaWduYXR1cmUgYXMgYSBjb21wbGV0ZWx5IHNlcGFyYXRlCisgICAgKiBibG9jay4gIEFueSBpbnN0cnVjdGlvbnMgYXQgZ2xvYmFsIHNjb3BlIHdpbGwgYmUgc2h1ZmZsZWQgaW50bworICAgICogbWFpbigpIGF0IGxpbmsgdGltZSwgc28gdGhleSdyZSBpcnJlbGV2YW50IHRvIHVzLgorICAgICovCisgICBleGVjX2xpc3QgKm9yaWdfYWNwID0gdGhpcy0+YWNwOworICAgZXhlY19saXN0ICpvcmlnX2tpbGxzID0gdGhpcy0+a2lsbHM7CisgICBib29sIG9yaWdfa2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGw7CisKKyAgIHRoaXMtPmFjcCA9IG5ldyhtZW1fY3R4KSBleGVjX2xpc3Q7CisgICB0aGlzLT5raWxscyA9IG5ldyhtZW1fY3R4KSBleGVjX2xpc3Q7CisgICB0aGlzLT5raWxsZWRfYWxsID0gZmFsc2U7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5ib2R5KTsKKworICAgdGhpcy0+a2lsbHMgPSBvcmlnX2tpbGxzOworICAgdGhpcy0+YWNwID0gb3JpZ19hY3A7CisgICB0aGlzLT5raWxsZWRfYWxsID0gb3JpZ19raWxsZWRfYWxsOworCisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb3B5X3Byb3BhZ2F0aW9uX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAga2lsbChpci0+bGhzLT52YXJpYWJsZV9yZWZlcmVuY2VkKCkpOworCisgICBhZGRfY29weShpcik7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NvcHlfcHJvcGFnYXRpb25fdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZnVuY3Rpb24gKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisvKioKKyAqIFJlcGxhY2VzIGRlcmVmZXJlbmNlcyBvZiBBQ1AgUkhTIHZhcmlhYmxlcyB3aXRoIEFDUCBMSFMgdmFyaWFibGVzLgorICoKKyAqIFRoaXMgaXMgd2hlcmUgdGhlIGFjdHVhbCBjb3B5IHByb3BhZ2F0aW9uIG9jY3Vycy4gIE5vdGUgdGhhdCB0aGUKKyAqIHJld3JpdGluZyBvZiBpcl9kZXJlZmVyZW5jZSBtZWFucyB0aGF0IHRoZSBpcl9kZXJlZmVyZW5jZSBpbnN0YW5jZQorICogbXVzdCBub3QgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIElSIG9wZXJhdGlvbnMhCisgKi8KK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb3B5X3Byb3BhZ2F0aW9uX3Zpc2l0b3I6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIGlmICh0aGlzLT5pbl9hc3NpZ25lZSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaXJfdmFyaWFibGUgKnZhciA9IGlyLT52YXI7CisKKyAgIGZvcmVhY2hfbGlzdChuLCB0aGlzLT5hY3ApIHsKKyAgICAgIGFjcF9lbnRyeSAqZW50cnkgPSAoYWNwX2VudHJ5ICopIG47CisKKyAgICAgIGlmICh2YXIgPT0gZW50cnktPmxocykgeworCSBpci0+dmFyID0gZW50cnktPnJoczsKKwkgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworCSBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb3B5X3Byb3BhZ2F0aW9uX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKQoreworICAgLyogRG8gY29weSBwcm9wYWdhdGlvbiBvbiBjYWxsIHBhcmFtZXRlcnMsIGJ1dCBza2lwIGFueSBvdXQgcGFyYW1zICovCisgICBmb3JlYWNoX3R3b19saXN0cyhmb3JtYWxfbm9kZSwgJmlyLT5jYWxsZWUtPnBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfbm9kZSwgJmlyLT5hY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfdmFyaWFibGUgKnNpZ19wYXJhbSA9IChpcl92YXJpYWJsZSAqKSBmb3JtYWxfbm9kZTsKKyAgICAgIGlyX3J2YWx1ZSAqaXIgPSAoaXJfcnZhbHVlICopIGFjdHVhbF9ub2RlOworICAgICAgaWYgKHNpZ19wYXJhbS0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9mdW5jdGlvbl9vdXQKKyAgICAgICAgICAmJiBzaWdfcGFyYW0tPmRhdGEubW9kZSAhPSBpcl92YXJfZnVuY3Rpb25faW5vdXQpIHsKKyAgICAgICAgIGlyLT5hY2NlcHQodGhpcyk7CisgICAgICB9CisgICB9CisKKyAgIC8qIFNpbmNlIHdlJ3JlIHVubGlua2VkLCB3ZSBkb24ndCAobmVjZXNzYXJpbHkpIGtub3cgdGhlIHNpZGUgZWZmZWN0cyBvZgorICAgICogdGhpcyBjYWxsLiAgU28ga2lsbCBhbGwgY29waWVzLgorICAgICovCisgICBhY3AtPm1ha2VfZW1wdHkoKTsKKyAgIHRoaXMtPmtpbGxlZF9hbGwgPSB0cnVlOworCisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKK3ZvaWQKK2lyX2NvcHlfcHJvcGFnYXRpb25fdmlzaXRvcjo6aGFuZGxlX2lmX2Jsb2NrKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgZXhlY19saXN0ICpvcmlnX2FjcCA9IHRoaXMtPmFjcDsKKyAgIGV4ZWNfbGlzdCAqb3JpZ19raWxscyA9IHRoaXMtPmtpbGxzOworICAgYm9vbCBvcmlnX2tpbGxlZF9hbGwgPSB0aGlzLT5raWxsZWRfYWxsOworCisgICB0aGlzLT5hY3AgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbHMgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbGVkX2FsbCA9IGZhbHNlOworCisgICAvKiBQb3B1bGF0ZSB0aGUgaW5pdGlhbCBhY3Agd2l0aCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsICovCisgICBmb3JlYWNoX2xpc3Qobiwgb3JpZ19hY3ApIHsKKyAgICAgIGFjcF9lbnRyeSAqYSA9IChhY3BfZW50cnkgKikgbjsKKyAgICAgIHRoaXMtPmFjcC0+cHVzaF90YWlsKG5ldyh0aGlzLT5tZW1fY3R4KSBhY3BfZW50cnkoYS0+bGhzLCBhLT5yaHMpKTsKKyAgIH0KKworICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCBpbnN0cnVjdGlvbnMpOworCisgICBpZiAodGhpcy0+a2lsbGVkX2FsbCkgeworICAgICAgb3JpZ19hY3AtPm1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgZXhlY19saXN0ICpuZXdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIHRoaXMtPmtpbGxzID0gb3JpZ19raWxsczsKKyAgIHRoaXMtPmFjcCA9IG9yaWdfYWNwOworICAgdGhpcy0+a2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGwgfHwgb3JpZ19raWxsZWRfYWxsOworCisgICBmb3JlYWNoX2xpc3QobiwgbmV3X2tpbGxzKSB7CisgICAgICBraWxsX2VudHJ5ICprID0gKGtpbGxfZW50cnkgKikgbjsKKyAgICAgIGtpbGwoay0+dmFyKTsKKyAgIH0KK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NvcHlfcHJvcGFnYXRpb25fdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfaWYgKmlyKQoreworICAgaXItPmNvbmRpdGlvbi0+YWNjZXB0KHRoaXMpOworCisgICBoYW5kbGVfaWZfYmxvY2soJmlyLT50aGVuX2luc3RydWN0aW9ucyk7CisgICBoYW5kbGVfaWZfYmxvY2soJmlyLT5lbHNlX2luc3RydWN0aW9ucyk7CisKKyAgIC8qIGhhbmRsZV9pZl9ibG9jaygpIGFscmVhZHkgZGVzY2VuZGVkIGludG8gdGhlIGNoaWxkcmVuLiAqLworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29weV9wcm9wYWdhdGlvbl92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9sb29wICppcikKK3sKKyAgIGV4ZWNfbGlzdCAqb3JpZ19hY3AgPSB0aGlzLT5hY3A7CisgICBleGVjX2xpc3QgKm9yaWdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIGJvb2wgb3JpZ19raWxsZWRfYWxsID0gdGhpcy0+a2lsbGVkX2FsbDsKKworICAgLyogRklOSVNITUU6IEZvciBub3csIHRoZSBpbml0aWFsIGFjcCBmb3IgbG9vcHMgaXMgdG90YWxseSBlbXB0eS4KKyAgICAqIFdlIGNvdWxkIGdvIHRocm91Z2ggb25jZSwgdGhlbiBnbyB0aHJvdWdoIGFnYWluIHdpdGggdGhlIGFjcAorICAgICogY2xvbmVkIG1pbnVzIHRoZSBraWxsZWQgZW50cmllcyBhZnRlciB0aGUgZmlyc3QgcnVuIHRocm91Z2guCisgICAgKi8KKyAgIHRoaXMtPmFjcCA9IG5ldyhtZW1fY3R4KSBleGVjX2xpc3Q7CisgICB0aGlzLT5raWxscyA9IG5ldyhtZW1fY3R4KSBleGVjX2xpc3Q7CisgICB0aGlzLT5raWxsZWRfYWxsID0gZmFsc2U7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5ib2R5X2luc3RydWN0aW9ucyk7CisKKyAgIGlmICh0aGlzLT5raWxsZWRfYWxsKSB7CisgICAgICBvcmlnX2FjcC0+bWFrZV9lbXB0eSgpOworICAgfQorCisgICBleGVjX2xpc3QgKm5ld19raWxscyA9IHRoaXMtPmtpbGxzOworICAgdGhpcy0+a2lsbHMgPSBvcmlnX2tpbGxzOworICAgdGhpcy0+YWNwID0gb3JpZ19hY3A7CisgICB0aGlzLT5raWxsZWRfYWxsID0gdGhpcy0+a2lsbGVkX2FsbCB8fCBvcmlnX2tpbGxlZF9hbGw7CisKKyAgIGZvcmVhY2hfbGlzdChuLCBuZXdfa2lsbHMpIHsKKyAgICAgIGtpbGxfZW50cnkgKmsgPSAoa2lsbF9lbnRyeSAqKSBuOworICAgICAga2lsbChrLT52YXIpOworICAgfQorCisgICAvKiBhbHJlYWR5IGRlc2NlbmRlZCBpbnRvIHRoZSBjaGlsZHJlbi4gKi8KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKwordm9pZAoraXJfY29weV9wcm9wYWdhdGlvbl92aXNpdG9yOjpraWxsKGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICBhc3NlcnQodmFyICE9IE5VTEwpOworCisgICAvKiBSZW1vdmUgYW55IGVudHJpZXMgY3VycmVudGx5IGluIHRoZSBBQ1AgZm9yIHRoaXMga2lsbC4gKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG4sIGFjcCkgeworICAgICAgYWNwX2VudHJ5ICplbnRyeSA9IChhY3BfZW50cnkgKikgbjsKKworICAgICAgaWYgKGVudHJ5LT5saHMgPT0gdmFyIHx8IGVudHJ5LT5yaHMgPT0gdmFyKSB7CisJIGVudHJ5LT5yZW1vdmUoKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogQWRkIHRoZSBMSFMgdmFyaWFibGUgdG8gdGhlIGxpc3Qgb2Yga2lsbGVkIHZhcmlhYmxlcyBpbiB0aGlzIGJsb2NrLgorICAgICovCisgICB0aGlzLT5raWxscy0+cHVzaF90YWlsKG5ldyh0aGlzLT5tZW1fY3R4KSBraWxsX2VudHJ5KHZhcikpOworfQorCisvKioKKyAqIEFkZHMgYW4gZW50cnkgdG8gdGhlIGF2YWlsYWJsZSBjb3B5IGxpc3QgaWYgaXQncyBhIHBsYWluIGFzc2lnbm1lbnQKKyAqIG9mIGEgdmFyaWFibGUgdG8gYSB2YXJpYWJsZS4KKyAqLwordm9pZAoraXJfY29weV9wcm9wYWdhdGlvbl92aXNpdG9yOjphZGRfY29weShpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGFjcF9lbnRyeSAqZW50cnk7CisKKyAgIGlmIChpci0+Y29uZGl0aW9uKQorICAgICAgcmV0dXJuOworCisgICBpcl92YXJpYWJsZSAqbGhzX3ZhciA9IGlyLT53aG9sZV92YXJpYWJsZV93cml0dGVuKCk7CisgICBpcl92YXJpYWJsZSAqcmhzX3ZhciA9IGlyLT5yaHMtPndob2xlX3ZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKworICAgaWYgKChsaHNfdmFyICE9IE5VTEwpICYmIChyaHNfdmFyICE9IE5VTEwpKSB7CisgICAgICBpZiAobGhzX3ZhciA9PSByaHNfdmFyKSB7CisJIC8qIFRoaXMgaXMgYSBkdW1iIGFzc2lnbm1lbnQsIGJ1dCB3ZSd2ZSBjb252ZW5pZW50bHkgbm90aWNlZAorCSAgKiBpdCBoZXJlLiAgUmVtb3ZpbmcgaXQgbm93IHdvdWxkIG1lc3MgdXAgdGhlIGxvb3AgaXRlcmF0aW9uCisJICAqIGNhbGxpbmcgdXMuICBKdXN0IGZsYWcgaXQgdG8gbm90IGV4ZWN1dGUsIGFuZCBzb21lb25lIGVsc2UKKwkgICogd2lsbCBjbGVhbiB1cCB0aGUgbWVzcy4KKwkgICovCisJIGlyLT5jb25kaXRpb24gPSBuZXcocmFsbG9jX3BhcmVudChpcikpIGlyX2NvbnN0YW50KGZhbHNlKTsKKwkgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKwkgZW50cnkgPSBuZXcodGhpcy0+bWVtX2N0eCkgYWNwX2VudHJ5KGxoc192YXIsIHJoc192YXIpOworCSB0aGlzLT5hY3AtPnB1c2hfdGFpbChlbnRyeSk7CisgICAgICB9CisgICB9Cit9CisKKy8qKgorICogRG9lcyBhIGNvcHkgcHJvcGFnYXRpb24gcGFzcyBvbiB0aGUgY29kZSBwcmVzZW50IGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uCisgKi8KK2Jvb2wKK2RvX2NvcHlfcHJvcGFnYXRpb24oZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBpcl9jb3B5X3Byb3BhZ2F0aW9uX3Zpc2l0b3IgdjsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NvcHlfcHJvcGFnYXRpb25fZWxlbWVudHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZDA5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzLmNwcApAQCAtMCwwICsxLDQ5NSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgb3B0X2NvcHlfcHJvcGFnYXRpb25fZWxlbWVudHMuY3BwCisgKgorICogUmVwbGFjZXMgdXNhZ2Ugb2YgcmVjZW50bHktY29waWVkIGNvbXBvbmVudHMgb2YgdmFyaWFibGVzIHdpdGggdGhlCisgKiBwcmV2aW91cyBjb3B5IG9mIHRoZSB2YXJpYWJsZS4KKyAqCisgKiBUaGlzIHBhc3MgY2FuIGJlIGNvbXBhcmVkIHdpdGggb3B0X2NvcHlfcHJvcGFnYXRpb24sIHdoaWNoIG9wZXJhbmRzCisgKiBvbiBhcmJpdHJhcnkgd2hvbGUtdmFyaWFibGUgY29waWVzLiAgSG93ZXZlciwgaW4gb3JkZXIgdG8gaGFuZGxlCisgKiB0aGUgY29weSBwcm9wYWdhdGlvbiBvZiBzd2l6emxlZCB2YXJpYWJsZXMgb3Igd3JpdGVtYXNrZWQgd3JpdGVzLAorICogd2Ugd2FudCB0byB0cmFjayB0aGluZ3Mgb24gYSBjaGFubmVsLXdpc2UgYmFzaXMuICBJIGZvdW5kIHRoYXQKKyAqIHRyeWluZyB0byBtaXggdGhlIHN3aXp6bGVkL3dyaXRlbWFza2VkIHN1cHBvcnQgaGVyZSB3aXRoIHRoZQorICogd2hvbGUtdmFyaWFibGUgc3R1ZmYgaW4gb3B0X2NvcHlfcHJvcGFnYXRpb24uY3BwIGp1c3QgbWFkZSBhIG1lc3MsCisgKiBzbyB0aGlzIGlzIHNlcGFyYXRlIGRlc3BpdGUgdGhlIEFDUCBoYW5kbGluZyBiZWluZyBzb21ld2hhdAorICogc2ltaWxhci4KKyAqCisgKiBUaGlzIHNob3VsZCByZWR1Y2UgdGhlIG51bWJlciBvZiBNT1YgaW5zdHJ1Y3Rpb25zIGluIHRoZSBnZW5lcmF0ZWQKKyAqIHByb2dyYW1zIHVubGVzcyBjb3B5IHByb3BhZ2F0aW9uIGlzIGFsc28gZG9uZSBvbiB0aGUgTElSLCBhbmQgbWF5CisgKiBoZWxwIGFueXdheSBieSB0cmlnZ2VyaW5nIG90aGVyIG9wdGltaXphdGlvbnMgdGhhdCBsaXZlIGluIHRoZSBISVIuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfcnZhbHVlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9iYXNpY19ibG9jay5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworc3RhdGljIGJvb2wgZGVidWcgPSBmYWxzZTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgYWNwX2VudHJ5IDogcHVibGljIGV4ZWNfbm9kZQoreworcHVibGljOgorICAgYWNwX2VudHJ5KGlyX3ZhcmlhYmxlICpsaHMsIGlyX3ZhcmlhYmxlICpyaHMsIGludCB3cml0ZV9tYXNrLCBpbnQgc3dpenpsZVs0XSkKKyAgIHsKKyAgICAgIHRoaXMtPmxocyA9IGxoczsKKyAgICAgIHRoaXMtPnJocyA9IHJoczsKKyAgICAgIHRoaXMtPndyaXRlX21hc2sgPSB3cml0ZV9tYXNrOworICAgICAgbWVtY3B5KHRoaXMtPnN3aXp6bGUsIHN3aXp6bGUsIHNpemVvZih0aGlzLT5zd2l6emxlKSk7CisgICB9CisKKyAgIGFjcF9lbnRyeShhY3BfZW50cnkgKmEpCisgICB7CisgICAgICB0aGlzLT5saHMgPSBhLT5saHM7CisgICAgICB0aGlzLT5yaHMgPSBhLT5yaHM7CisgICAgICB0aGlzLT53cml0ZV9tYXNrID0gYS0+d3JpdGVfbWFzazsKKyAgICAgIG1lbWNweSh0aGlzLT5zd2l6emxlLCBhLT5zd2l6emxlLCBzaXplb2YodGhpcy0+c3dpenpsZSkpOworICAgfQorCisgICBpcl92YXJpYWJsZSAqbGhzOworICAgaXJfdmFyaWFibGUgKnJoczsKKyAgIHVuc2lnbmVkIGludCB3cml0ZV9tYXNrOworICAgaW50IHN3aXp6bGVbNF07Cit9OworCisKK2NsYXNzIGtpbGxfZW50cnkgOiBwdWJsaWMgZXhlY19ub2RlCit7CitwdWJsaWM6CisgICBraWxsX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIsIGludCB3cml0ZV9tYXNrKQorICAgeworICAgICAgdGhpcy0+dmFyID0gdmFyOworICAgICAgdGhpcy0+d3JpdGVfbWFzayA9IHdyaXRlX21hc2s7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICp2YXI7CisgICB1bnNpZ25lZCBpbnQgd3JpdGVfbWFzazsKK307CisKK2NsYXNzIGlyX2NvcHlfcHJvcGFnYXRpb25fZWxlbWVudHNfdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzX3Zpc2l0b3IoKQorICAgeworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIHRoaXMtPmtpbGxlZF9hbGwgPSBmYWxzZTsKKyAgICAgIHRoaXMtPm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgICAgIHRoaXMtPnNoYWRlcl9tZW1fY3R4ID0gTlVMTDsKKyAgICAgIHRoaXMtPmFjcCA9IG5ldyhtZW1fY3R4KSBleGVjX2xpc3Q7CisgICAgICB0aGlzLT5raWxscyA9IG5ldyhtZW1fY3R4KSBleGVjX2xpc3Q7CisgICB9CisgICB+aXJfY29weV9wcm9wYWdhdGlvbl9lbGVtZW50c192aXNpdG9yKCkKKyAgIHsKKyAgICAgIHJhbGxvY19mcmVlKG1lbV9jdHgpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2xvb3AgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfYXNzaWdubWVudCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfY2FsbCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfaWYgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGNsYXNzIGlyX3N3aXp6bGUgKik7CisKKyAgIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpOworCisgICB2b2lkIGFkZF9jb3B5KGlyX2Fzc2lnbm1lbnQgKmlyKTsKKyAgIHZvaWQga2lsbChraWxsX2VudHJ5ICprKTsKKyAgIHZvaWQgaGFuZGxlX2lmX2Jsb2NrKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKTsKKworICAgLyoqIExpc3Qgb2YgYWNwX2VudHJ5OiBUaGUgYXZhaWxhYmxlIGNvcGllcyB0byBwcm9wYWdhdGUgKi8KKyAgIGV4ZWNfbGlzdCAqYWNwOworICAgLyoqCisgICAgKiBMaXN0IG9mIGtpbGxfZW50cnk6IFRoZSB2YXJpYWJsZXMgd2hvc2UgdmFsdWVzIHdlcmUga2lsbGVkIGluIHRoaXMKKyAgICAqIGJsb2NrLgorICAgICovCisgICBleGVjX2xpc3QgKmtpbGxzOworCisgICBib29sIHByb2dyZXNzOworCisgICBib29sIGtpbGxlZF9hbGw7CisKKyAgIC8qIENvbnRleHQgZm9yIG91ciBsb2NhbCBkYXRhIHN0cnVjdHVyZXMuICovCisgICB2b2lkICptZW1fY3R4OworICAgLyogQ29udGV4dCBmb3IgYWxsb2NhdGluZyBuZXcgc2hhZGVyIG5vZGVzLiAqLworICAgdm9pZCAqc2hhZGVyX21lbV9jdHg7Cit9OworCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqaXIpCit7CisgICAvKiBUcmVhdCBlbnRyeSBpbnRvIGEgZnVuY3Rpb24gc2lnbmF0dXJlIGFzIGEgY29tcGxldGVseSBzZXBhcmF0ZQorICAgICogYmxvY2suICBBbnkgaW5zdHJ1Y3Rpb25zIGF0IGdsb2JhbCBzY29wZSB3aWxsIGJlIHNodWZmbGVkIGludG8KKyAgICAqIG1haW4oKSBhdCBsaW5rIHRpbWUsIHNvIHRoZXkncmUgaXJyZWxldmFudCB0byB1cy4KKyAgICAqLworICAgZXhlY19saXN0ICpvcmlnX2FjcCA9IHRoaXMtPmFjcDsKKyAgIGV4ZWNfbGlzdCAqb3JpZ19raWxscyA9IHRoaXMtPmtpbGxzOworICAgYm9vbCBvcmlnX2tpbGxlZF9hbGwgPSB0aGlzLT5raWxsZWRfYWxsOworCisgICB0aGlzLT5hY3AgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbHMgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbGVkX2FsbCA9IGZhbHNlOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKHRoaXMsICZpci0+Ym9keSk7CisKKyAgIHRoaXMtPmtpbGxzID0gb3JpZ19raWxsczsKKyAgIHRoaXMtPmFjcCA9IG9yaWdfYWNwOworICAgdGhpcy0+a2lsbGVkX2FsbCA9IG9yaWdfa2lsbGVkX2FsbDsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29weV9wcm9wYWdhdGlvbl9lbGVtZW50c192aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpsaHMgPSBpci0+bGhzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaXJfdmFyaWFibGUgKnZhciA9IGlyLT5saHMtPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKworICAgaWYgKHZhci0+dHlwZS0+aXNfc2NhbGFyKCkgfHwgdmFyLT50eXBlLT5pc192ZWN0b3IoKSkgeworICAgICAga2lsbF9lbnRyeSAqazsKKworICAgICAgaWYgKGxocykKKwkgayA9IG5ldyhtZW1fY3R4KSBraWxsX2VudHJ5KHZhciwgaXItPndyaXRlX21hc2spOworICAgICAgZWxzZQorCSBrID0gbmV3KG1lbV9jdHgpIGtpbGxfZW50cnkodmFyLCB+MCk7CisKKyAgICAgIGtpbGwoayk7CisgICB9CisKKyAgIGFkZF9jb3B5KGlyKTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29weV9wcm9wYWdhdGlvbl9lbGVtZW50c192aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9zd2l6emxlICopCit7CisgICAvKiBEb24ndCB2aXNpdCB0aGUgdmFsdWVzIG9mIHN3aXp6bGVzIHNpbmNlIHRoZXkgYXJlIGhhbmRsZWQgd2hpbGUKKyAgICAqIHZpc2l0aW5nIHRoZSBzd2l6emxlIGl0c2VsZi4KKyAgICAqLworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisvKioKKyAqIFJlcGxhY2VzIGRlcmVmZXJlbmNlcyBvZiBBQ1AgUkhTIHZhcmlhYmxlcyB3aXRoIEFDUCBMSFMgdmFyaWFibGVzLgorICoKKyAqIFRoaXMgaXMgd2hlcmUgdGhlIGFjdHVhbCBjb3B5IHByb3BhZ2F0aW9uIG9jY3Vycy4gIE5vdGUgdGhhdCB0aGUKKyAqIHJld3JpdGluZyBvZiBpcl9kZXJlZmVyZW5jZSBtZWFucyB0aGF0IHRoZSBpcl9kZXJlZmVyZW5jZSBpbnN0YW5jZQorICogbXVzdCBub3QgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIElSIG9wZXJhdGlvbnMhCisgKi8KK3ZvaWQKK2lyX2NvcHlfcHJvcGFnYXRpb25fZWxlbWVudHNfdmlzaXRvcjo6aGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKippcikKK3sKKyAgIGludCBzd2l6emxlX2NoYW5bNF07CisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWZfdmFyOworICAgaXJfdmFyaWFibGUgKnNvdXJjZVs0XSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKKyAgIGludCBzb3VyY2VfY2hhbls0XSA9IHswLCAwLCAwLCAwfTsKKyAgIGludCBjaGFuczsKKworICAgaWYgKCEqaXIpCisgICAgICByZXR1cm47CisKKyAgIGlyX3N3aXp6bGUgKnN3aXp6bGUgPSAoKmlyKS0+YXNfc3dpenpsZSgpOworICAgaWYgKHN3aXp6bGUpIHsKKyAgICAgIGRlcmVmX3ZhciA9IHN3aXp6bGUtPnZhbC0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgICAgIGlmICghZGVyZWZfdmFyKQorCSByZXR1cm47CisKKyAgICAgIHN3aXp6bGVfY2hhblswXSA9IHN3aXp6bGUtPm1hc2sueDsKKyAgICAgIHN3aXp6bGVfY2hhblsxXSA9IHN3aXp6bGUtPm1hc2sueTsKKyAgICAgIHN3aXp6bGVfY2hhblsyXSA9IHN3aXp6bGUtPm1hc2suejsKKyAgICAgIHN3aXp6bGVfY2hhblszXSA9IHN3aXp6bGUtPm1hc2sudzsKKyAgICAgIGNoYW5zID0gc3dpenpsZS0+dHlwZS0+dmVjdG9yX2VsZW1lbnRzOworICAgfSBlbHNlIHsKKyAgICAgIGRlcmVmX3ZhciA9ICgqaXIpLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgICAgaWYgKCFkZXJlZl92YXIpCisJIHJldHVybjsKKworICAgICAgc3dpenpsZV9jaGFuWzBdID0gMDsKKyAgICAgIHN3aXp6bGVfY2hhblsxXSA9IDE7CisgICAgICBzd2l6emxlX2NoYW5bMl0gPSAyOworICAgICAgc3dpenpsZV9jaGFuWzNdID0gMzsKKyAgICAgIGNoYW5zID0gZGVyZWZfdmFyLT50eXBlLT52ZWN0b3JfZWxlbWVudHM7CisgICB9CisKKyAgIGlmICh0aGlzLT5pbl9hc3NpZ25lZSkKKyAgICAgIHJldHVybjsKKworICAgaXJfdmFyaWFibGUgKnZhciA9IGRlcmVmX3Zhci0+dmFyOworCisgICAvKiBUcnkgdG8gZmluZCBBQ1AgZW50cmllcyBjb3ZlcmluZyBzd2l6emxlX2NoYW5bXSwgaG9waW5nIHRoZXkncmUKKyAgICAqIHRoZSBzYW1lIHNvdXJjZSB2YXJpYWJsZS4KKyAgICAqLworICAgZm9yZWFjaF9saXN0KG4sIHRoaXMtPmFjcCkgeworICAgICAgYWNwX2VudHJ5ICplbnRyeSA9IChhY3BfZW50cnkgKikgbjsKKworICAgICAgaWYgKHZhciA9PSBlbnRyeS0+bGhzKSB7CisJIGZvciAoaW50IGMgPSAwOyBjIDwgY2hhbnM7IGMrKykgeworCSAgICBpZiAoZW50cnktPndyaXRlX21hc2sgJiAoMSA8PCBzd2l6emxlX2NoYW5bY10pKSB7CisJICAgICAgIHNvdXJjZVtjXSA9IGVudHJ5LT5yaHM7CisJICAgICAgIHNvdXJjZV9jaGFuW2NdID0gZW50cnktPnN3aXp6bGVbc3dpenpsZV9jaGFuW2NdXTsKKwkgICAgfQorCSB9CisgICAgICB9CisgICB9CisKKyAgIC8qIE1ha2Ugc3VyZSBhbGwgY2hhbm5lbHMgYXJlIGNvcHlpbmcgZnJvbSB0aGUgc2FtZSBzb3VyY2UgdmFyaWFibGUuICovCisgICBpZiAoIXNvdXJjZVswXSkKKyAgICAgIHJldHVybjsKKyAgIGZvciAoaW50IGMgPSAxOyBjIDwgY2hhbnM7IGMrKykgeworICAgICAgaWYgKHNvdXJjZVtjXSAhPSBzb3VyY2VbMF0pCisJIHJldHVybjsKKyAgIH0KKworICAgaWYgKCFzaGFkZXJfbWVtX2N0eCkKKyAgICAgIHNoYWRlcl9tZW1fY3R4ID0gcmFsbG9jX3BhcmVudChkZXJlZl92YXIpOworCisgICBpZiAoZGVidWcpIHsKKyAgICAgIHByaW50ZigiQ29weSBwcm9wYWdhdGlvbiBmcm9tOlxuIik7CisgICAgICAoKmlyKS0+cHJpbnQoKTsKKyAgIH0KKworICAgZGVyZWZfdmFyID0gbmV3KHNoYWRlcl9tZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShzb3VyY2VbMF0pOworICAgKmlyID0gbmV3KHNoYWRlcl9tZW1fY3R4KSBpcl9zd2l6emxlKGRlcmVmX3ZhciwKKwkJCQkJc291cmNlX2NoYW5bMF0sCisJCQkJCXNvdXJjZV9jaGFuWzFdLAorCQkJCQlzb3VyY2VfY2hhblsyXSwKKwkJCQkJc291cmNlX2NoYW5bM10sCisJCQkJCWNoYW5zKTsKKworICAgaWYgKGRlYnVnKSB7CisgICAgICBwcmludGYoInRvOlxuIik7CisgICAgICAoKmlyKS0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgIH0KK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfY29weV9wcm9wYWdhdGlvbl9lbGVtZW50c192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9jYWxsICppcikKK3sKKyAgIC8qIERvIGNvcHkgcHJvcGFnYXRpb24gb24gY2FsbCBwYXJhbWV0ZXJzLCBidXQgc2tpcCBhbnkgb3V0IHBhcmFtcyAqLworICAgZm9yZWFjaF90d29fbGlzdHMoZm9ybWFsX25vZGUsICZpci0+Y2FsbGVlLT5wYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX25vZGUsICZpci0+YWN0dWFsX3BhcmFtZXRlcnMpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpzaWdfcGFyYW0gPSAoaXJfdmFyaWFibGUgKikgZm9ybWFsX25vZGU7CisgICAgICBpcl9ydmFsdWUgKmlyID0gKGlyX3J2YWx1ZSAqKSBhY3R1YWxfbm9kZTsKKyAgICAgIGlmIChzaWdfcGFyYW0tPmRhdGEubW9kZSAhPSBpcl92YXJfZnVuY3Rpb25fb3V0CisgICAgICAgICAgJiYgc2lnX3BhcmFtLT5kYXRhLm1vZGUgIT0gaXJfdmFyX2Z1bmN0aW9uX2lub3V0KSB7CisgICAgICAgICBpci0+YWNjZXB0KHRoaXMpOworICAgICAgfQorICAgfQorCisgICAvKiBTaW5jZSB3ZSdyZSB1bmxpbmtlZCwgd2UgZG9uJ3QgKG5lY2Vzc2FyaWx5KSBrbm93IHRoZSBzaWRlIGVmZmVjdHMgb2YKKyAgICAqIHRoaXMgY2FsbC4gIFNvIGtpbGwgYWxsIGNvcGllcy4KKyAgICAqLworICAgYWNwLT5tYWtlX2VtcHR5KCk7CisgICB0aGlzLT5raWxsZWRfYWxsID0gdHJ1ZTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCit2b2lkCitpcl9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzX3Zpc2l0b3I6OmhhbmRsZV9pZl9ibG9jayhleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGV4ZWNfbGlzdCAqb3JpZ19hY3AgPSB0aGlzLT5hY3A7CisgICBleGVjX2xpc3QgKm9yaWdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIGJvb2wgb3JpZ19raWxsZWRfYWxsID0gdGhpcy0+a2lsbGVkX2FsbDsKKworICAgdGhpcy0+YWNwID0gbmV3KG1lbV9jdHgpIGV4ZWNfbGlzdDsKKyAgIHRoaXMtPmtpbGxzID0gbmV3KG1lbV9jdHgpIGV4ZWNfbGlzdDsKKyAgIHRoaXMtPmtpbGxlZF9hbGwgPSBmYWxzZTsKKworICAgLyogUG9wdWxhdGUgdGhlIGluaXRpYWwgYWNwIHdpdGggYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCAqLworICAgZm9yZWFjaF9saXN0KG4sIG9yaWdfYWNwKSB7CisgICAgICBhY3BfZW50cnkgKmEgPSAoYWNwX2VudHJ5ICopIG47CisgICAgICB0aGlzLT5hY3AtPnB1c2hfdGFpbChuZXcodGhpcy0+bWVtX2N0eCkgYWNwX2VudHJ5KGEpKTsKKyAgIH0KKworICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCBpbnN0cnVjdGlvbnMpOworCisgICBpZiAodGhpcy0+a2lsbGVkX2FsbCkgeworICAgICAgb3JpZ19hY3AtPm1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgZXhlY19saXN0ICpuZXdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIHRoaXMtPmtpbGxzID0gb3JpZ19raWxsczsKKyAgIHRoaXMtPmFjcCA9IG9yaWdfYWNwOworICAgdGhpcy0+a2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGwgfHwgb3JpZ19raWxsZWRfYWxsOworCisgICAvKiBNb3ZlIHRoZSBuZXcga2lsbHMgaW50byB0aGUgcGFyZW50IGJsb2NrJ3MgbGlzdCwgcmVtb3ZpbmcgdGhlbQorICAgICogZnJvbSB0aGUgcGFyZW50J3MgQUNQIGxpc3QgaW4gdGhlIHByb2Nlc3MuCisgICAgKi8KKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsIG5ld19raWxscykgeworICAgICAga2lsbF9lbnRyeSAqayA9IChraWxsX2VudHJ5ICopbm9kZTsKKyAgICAgIGtpbGwoayk7CisgICB9Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2lmICppcikKK3sKKyAgIGlyLT5jb25kaXRpb24tPmFjY2VwdCh0aGlzKTsKKworICAgaGFuZGxlX2lmX2Jsb2NrKCZpci0+dGhlbl9pbnN0cnVjdGlvbnMpOworICAgaGFuZGxlX2lmX2Jsb2NrKCZpci0+ZWxzZV9pbnN0cnVjdGlvbnMpOworCisgICAvKiBoYW5kbGVfaWZfYmxvY2soKSBhbHJlYWR5IGRlc2NlbmRlZCBpbnRvIHRoZSBjaGlsZHJlbi4gKi8KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2NvcHlfcHJvcGFnYXRpb25fZWxlbWVudHNfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfbG9vcCAqaXIpCit7CisgICBleGVjX2xpc3QgKm9yaWdfYWNwID0gdGhpcy0+YWNwOworICAgZXhlY19saXN0ICpvcmlnX2tpbGxzID0gdGhpcy0+a2lsbHM7CisgICBib29sIG9yaWdfa2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGw7CisKKyAgIC8qIEZJTklTSE1FOiBGb3Igbm93LCB0aGUgaW5pdGlhbCBhY3AgZm9yIGxvb3BzIGlzIHRvdGFsbHkgZW1wdHkuCisgICAgKiBXZSBjb3VsZCBnbyB0aHJvdWdoIG9uY2UsIHRoZW4gZ28gdGhyb3VnaCBhZ2FpbiB3aXRoIHRoZSBhY3AKKyAgICAqIGNsb25lZCBtaW51cyB0aGUga2lsbGVkIGVudHJpZXMgYWZ0ZXIgdGhlIGZpcnN0IHJ1biB0aHJvdWdoLgorICAgICovCisgICB0aGlzLT5hY3AgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbHMgPSBuZXcobWVtX2N0eCkgZXhlY19saXN0OworICAgdGhpcy0+a2lsbGVkX2FsbCA9IGZhbHNlOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKHRoaXMsICZpci0+Ym9keV9pbnN0cnVjdGlvbnMpOworCisgICBpZiAodGhpcy0+a2lsbGVkX2FsbCkgeworICAgICAgb3JpZ19hY3AtPm1ha2VfZW1wdHkoKTsKKyAgIH0KKworICAgZXhlY19saXN0ICpuZXdfa2lsbHMgPSB0aGlzLT5raWxsczsKKyAgIHRoaXMtPmtpbGxzID0gb3JpZ19raWxsczsKKyAgIHRoaXMtPmFjcCA9IG9yaWdfYWNwOworICAgdGhpcy0+a2lsbGVkX2FsbCA9IHRoaXMtPmtpbGxlZF9hbGwgfHwgb3JpZ19raWxsZWRfYWxsOworCisgICBmb3JlYWNoX2xpc3Rfc2FmZShub2RlLCBuZXdfa2lsbHMpIHsKKyAgICAgIGtpbGxfZW50cnkgKmsgPSAoa2lsbF9lbnRyeSAqKW5vZGU7CisgICAgICBraWxsKGspOworICAgfQorCisgICAvKiBhbHJlYWR5IGRlc2NlbmRlZCBpbnRvIHRoZSBjaGlsZHJlbi4gKi8KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworLyogUmVtb3ZlIGFueSBlbnRyaWVzIGN1cnJlbnRseSBpbiB0aGUgQUNQIGZvciB0aGlzIGtpbGwuICovCit2b2lkCitpcl9jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzX3Zpc2l0b3I6OmtpbGwoa2lsbF9lbnRyeSAqaykKK3sKKyAgIGZvcmVhY2hfbGlzdF9zYWZlKG5vZGUsIGFjcCkgeworICAgICAgYWNwX2VudHJ5ICplbnRyeSA9IChhY3BfZW50cnkgKilub2RlOworCisgICAgICBpZiAoZW50cnktPmxocyA9PSBrLT52YXIpIHsKKwkgZW50cnktPndyaXRlX21hc2sgPSBlbnRyeS0+d3JpdGVfbWFzayAmIH5rLT53cml0ZV9tYXNrOworCSBpZiAoZW50cnktPndyaXRlX21hc2sgPT0gMCkgeworCSAgICBlbnRyeS0+cmVtb3ZlKCk7CisJICAgIGNvbnRpbnVlOworCSB9CisgICAgICB9CisgICAgICBpZiAoZW50cnktPnJocyA9PSBrLT52YXIpIHsKKwkgZW50cnktPnJlbW92ZSgpOworICAgICAgfQorICAgfQorCisgICAvKiBJZiB3ZSB3ZXJlIG9uIGEgbGlzdCwgcmVtb3ZlIG91cnNlbHZlcyBiZWZvcmUgaW5zZXJ0aW5nICovCisgICBpZiAoay0+bmV4dCkKKyAgICAgIGstPnJlbW92ZSgpOworCisgICB0aGlzLT5raWxscy0+cHVzaF90YWlsKGspOworfQorCisvKioKKyAqIEFkZHMgZGlyZWN0bHktY29waWVkIGNoYW5uZWxzIGJldHdlZW4gdmVjdG9yIHZhcmlhYmxlcyB0byB0aGUgYXZhaWxhYmxlCisgKiBjb3B5IHByb3BhZ2F0aW9uIGxpc3QuCisgKi8KK3ZvaWQKK2lyX2NvcHlfcHJvcGFnYXRpb25fZWxlbWVudHNfdmlzaXRvcjo6YWRkX2NvcHkoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBhY3BfZW50cnkgKmVudHJ5OworICAgaW50IG9yaWdfc3dpenpsZVs0XSA9IHswLCAxLCAyLCAzfTsKKyAgIGludCBzd2l6emxlWzRdOworCisgICBpZiAoaXItPmNvbmRpdGlvbikKKyAgICAgIHJldHVybjsKKworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmxocyA9IGlyLT5saHMtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICBpZiAoIWxocyB8fCAhKGxocy0+dHlwZS0+aXNfc2NhbGFyKCkgfHwgbGhzLT50eXBlLT5pc192ZWN0b3IoKSkpCisgICAgICByZXR1cm47CisKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpyaHMgPSBpci0+cmhzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaWYgKCFyaHMpIHsKKyAgICAgIGlyX3N3aXp6bGUgKnN3aXogPSBpci0+cmhzLT5hc19zd2l6emxlKCk7CisgICAgICBpZiAoIXN3aXopCisJIHJldHVybjsKKworICAgICAgcmhzID0gc3dpei0+dmFsLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgICAgaWYgKCFyaHMpCisJIHJldHVybjsKKworICAgICAgb3JpZ19zd2l6emxlWzBdID0gc3dpei0+bWFzay54OworICAgICAgb3JpZ19zd2l6emxlWzFdID0gc3dpei0+bWFzay55OworICAgICAgb3JpZ19zd2l6emxlWzJdID0gc3dpei0+bWFzay56OworICAgICAgb3JpZ19zd2l6emxlWzNdID0gc3dpei0+bWFzay53OworICAgfQorCisgICAvKiBNb3ZlIHRoZSBzd2l6emxlIGNoYW5uZWxzIG91dCB0byB0aGUgcG9zaXRpb25zIHRoZXkgbWF0Y2ggaW4gdGhlCisgICAgKiBkZXN0aW5hdGlvbi4gIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byByZXdyaXRlIHRoZSBzd2l6emxlW10KKyAgICAqIGFycmF5IGV2ZXJ5IHRpbWUgd2UgY2xlYXIgYSBiaXQgb2YgdGhlIHdyaXRlX21hc2suCisgICAgKi8KKyAgIGludCBqID0gMDsKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBpZiAoaXItPndyaXRlX21hc2sgJiAoMSA8PCBpKSkKKwkgc3dpenpsZVtpXSA9IG9yaWdfc3dpenpsZVtqKytdOworICAgfQorCisgICBpbnQgd3JpdGVfbWFzayA9IGlyLT53cml0ZV9tYXNrOworICAgaWYgKGxocy0+dmFyID09IHJocy0+dmFyKSB7CisgICAgICAvKiBJZiB0aGlzIGlzIGEgY29weSBmcm9tIHRoZSB2YXJpYWJsZSB0byBpdHNlbGYsIHRoZW4gd2UgbmVlZAorICAgICAgICogdG8gYmUgc3VyZSBub3QgdG8gaW5jbHVkZSB0aGUgdXBkYXRlZCBjaGFubmVscyBmcm9tIHRoaXMKKyAgICAgICAqIGluc3RydWN0aW9uIGluIHRoZSBzZXQgb2YgbmV3IHNvdXJjZSBjaGFubmVscyB0byBiZQorICAgICAgICogY29weS1wcm9wYWdhdGVkIGZyb20uCisgICAgICAgKi8KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJIGlmIChpci0+d3JpdGVfbWFzayAmICgxIDw8IG9yaWdfc3dpenpsZVtpXSkpCisJICAgIHdyaXRlX21hc2sgJj0gfigxIDw8IGkpOworICAgICAgfQorICAgfQorCisgICBlbnRyeSA9IG5ldyh0aGlzLT5tZW1fY3R4KSBhY3BfZW50cnkobGhzLT52YXIsIHJocy0+dmFyLCB3cml0ZV9tYXNrLAorCQkJCQlzd2l6emxlKTsKKyAgIHRoaXMtPmFjcC0+cHVzaF90YWlsKGVudHJ5KTsKK30KKworYm9vbAorZG9fY29weV9wcm9wYWdhdGlvbl9lbGVtZW50cyhleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX2NvcHlfcHJvcGFnYXRpb25fZWxlbWVudHNfdmlzaXRvciB2OworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZ2LCBpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2NzZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9jc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODc4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9jc2UuY3BwCkBAIC0wLDAgKzEsNDIzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfY3NlLmNwcAorICoKKyAqIGNvbnN0YW50IHN1YmV4cHJlc3Npb24gZWxpbWluYXRpb24gYXQgdGhlIEdMU0wgSVIgbGV2ZWwuCisgKgorICogQ29tcGFyZSB0byBicndfZnNfY3NlLmNwcCBmb3IgYSBtb3JlIGNvbXBsZXRlIENTRSBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgb25lCisgKiBpcyBnZW5lcmljIGFuZCBoYW5kbGVzIHRleHR1cmUgb3BlcmF0aW9ucywgYnV0IGl0J3MgcmF0aGVyIHNpbXBsZSBjdXJyZW50bHkKKyAqIGFuZCBkb2Vzbid0IHN1cHBvcnQgbW9kaWZpY2F0aW9uIG9mIHZhcmlhYmxlcyBpbiB0aGUgYXZhaWxhYmxlIGV4cHJlc3Npb25zCisgKiBsaXN0LCBzbyBpdCBjYW4ndCBkbyB2YXJpYWJsZXMgb3RoZXIgdGhhbiB1bmlmb3JtcyBvciBzaGFkZXIgaW5wdXRzLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9ydmFsdWVfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX2Jhc2ljX2Jsb2NrLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAiaXJfYnVpbGRlci5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGlyX2J1aWxkZXI7CisKK3N0YXRpYyBib29sIGRlYnVnID0gZmFsc2U7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogVGhpcyBpcyB0aGUgcmVjb3JkIG9mIGFuIGF2YWlsYWJsZSBleHByZXNzaW9uIGZvciBjb21tb24gc3ViZXhwcmVzc2lvbgorICogZWxpbWluYXRpb24uCisgKi8KK2NsYXNzIGFlX2VudHJ5IDogcHVibGljIGV4ZWNfbm9kZQoreworcHVibGljOgorICAgYWVfZW50cnkoaXJfaW5zdHJ1Y3Rpb24gKmJhc2VfaXIsIGlyX3J2YWx1ZSAqKnZhbCkKKyAgICAgIDogdmFsKHZhbCksIGJhc2VfaXIoYmFzZV9pcikKKyAgIHsKKyAgICAgIGFzc2VydCh2YWwpOworICAgICAgYXNzZXJ0KCp2YWwpOworICAgICAgYXNzZXJ0KGJhc2VfaXIpOworCisgICAgICB2YXIgPSBOVUxMOworICAgfQorCisgICAvKioKKyAgICAqIFRoZSBwb2ludGVyIHRvIHRoZSBleHByZXNzaW9uIHRoYXQgd2UgbWlnaHQgYmUgYWJsZSB0byByZXVzZQorICAgICoKKyAgICAqIE5vdGUgdGhlIGRvdWJsZSBwb2ludGVyIC0tIHRoaXMgaXMgdGhlIHBsYWNlIGluIHRoZSBiYXNlX2lyIGV4cHJlc3Npb24KKyAgICAqIHRyZWUgdGhhdCB3ZSB3b3VsZCByZXdyaXRlIHRvIG1vdmUgdGhlIGV4cHJlc3Npb24gb3V0IHRvIGEgbmV3IHZhcmlhYmxlCisgICAgKiBhc3NpZ25tZW50LgorICAgICovCisgICBpcl9ydmFsdWUgKip2YWw7CisKKyAgIC8qKgorICAgICogUm9vdCBpbnN0cnVjdGlvbiBpbiB0aGUgYmFzaWMgYmxvY2sgd2hlcmUgdGhlIGV4cHJlc3Npb24gYXBwZWFyZWQuCisgICAgKgorICAgICogVGhpcyBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIGluc2VydCB0aGUgbmV3IHZhcmlhYmxlIGRlY2xhcmF0aW9uIGludG8gdGhlCisgICAgKiBpbnN0cnVjdGlvbiBzdHJlYW0gKHNpbmNlICp2YWwgaXMganVzdCBzb21ld2hlcmUgaW4gYmFzZV9pcidzIGV4cHJlc3Npb24KKyAgICAqIHRyZWUpLgorICAgICovCisgICBpcl9pbnN0cnVjdGlvbiAqYmFzZV9pcjsKKworICAgLyoqCisgICAgKiBUaGUgdmFyaWFibGUgdGhhdCB0aGUgZXhwcmVzc2lvbiBoYXMgYmVlbiBzdG9yZWQgaW4sIGlmIGl0J3MgYmVlbiBDU0VkCisgICAgKiBvbmNlIGFscmVhZHkuCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICp2YXI7Cit9OworCitjbGFzcyBjc2VfdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICBjc2VfdmlzaXRvcihleGVjX2xpc3QgKnZhbGlkYXRlX2luc3RydWN0aW9ucykKKyAgICAgIDogdmFsaWRhdGVfaW5zdHJ1Y3Rpb25zKHZhbGlkYXRlX2luc3RydWN0aW9ucykKKyAgIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisgICAgICBtZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICAgICB0aGlzLT5hZSA9IG5ldyhtZW1fY3R4KSBleGVjX2xpc3Q7CisgICB9CisgICB+Y3NlX3Zpc2l0b3IoKQorICAgeworICAgICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICppcik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2xvb3AgKmlyKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfaWYgKmlyKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfY2FsbCAqaXIpOworICAgdmlydHVhbCB2b2lkIGhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKTsKKworICAgYm9vbCBwcm9ncmVzczsKKworcHJpdmF0ZToKKyAgIHZvaWQgKm1lbV9jdHg7CisKKyAgIGlyX3J2YWx1ZSAqdHJ5X2NzZShpcl9ydmFsdWUgKnJ2YWx1ZSk7CisgICB2b2lkIGFkZF90b19hZShpcl9ydmFsdWUgKipydmFsdWUpOworCisgICAvKiogTGlzdCBvZiBhZV9lbnRyeTogVGhlIGF2YWlsYWJsZSBleHByZXNzaW9ucyB0byByZXVzZSAqLworICAgZXhlY19saXN0ICphZTsKKworICAgLyoqCisgICAgKiBUaGUgd2hvbGUgc2hhZGVyLCBzbyB0aGF0IHdlIGNhbiB2YWxpZGF0ZV9pcl90cmVlIGluIGRlYnVnIG1vZGUuCisgICAgKgorICAgICogVGhpcyBwcm92ZWQgcXVpdGUgdXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdHJlZSBtYW5pcHVsYXRpb24KKyAgICAqIHJpZ2h0LgorICAgICovCisgICBleGVjX2xpc3QgKnZhbGlkYXRlX2luc3RydWN0aW9uczsKK307CisKKy8qKgorICogVmlzaXRvciB0byB3YWxrIGFuIGV4cHJlc3Npb24gdHJlZSB0byBjaGVjayB0aGF0IGFsbCB2YXJpYWJsZXMgcmVmZXJlbmNlZAorICogYXJlIGNvbnN0YW50cy4KKyAqLworY2xhc3MgaXNfY3NlX2NhbmRpZGF0ZV92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yCit7CitwdWJsaWM6CisKKyAgIGlzX2NzZV9jYW5kaWRhdGVfdmlzaXRvcigpCisgICAgICA6IG9rKHRydWUpCisgICB7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKTsKKworICAgYm9vbCBvazsKK307CisKKworY2xhc3MgY29udGFpbnNfcnZhbHVlX3Zpc2l0b3IgOiBwdWJsaWMgaXJfcnZhbHVlX3Zpc2l0b3IKK3sKK3B1YmxpYzoKKworICAgY29udGFpbnNfcnZhbHVlX3Zpc2l0b3IoaXJfcnZhbHVlICp2YWwpCisgICAgICA6IHZhbCh2YWwpCisgICB7CisgICAgICBmb3VuZCA9IGZhbHNlOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpOworCisgICBib29sIGZvdW5kOworCitwcml2YXRlOgorICAgaXJfcnZhbHVlICp2YWw7Cit9OworCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKK3N0YXRpYyB2b2lkCitkdW1wX2FlKGV4ZWNfbGlzdCAqYWUpCit7CisgICBpbnQgaSA9IDA7CisKKyAgIHByaW50ZigiQ1NFOiBBRSBjb250ZW50czpcbiIpOworICAgZm9yZWFjaF9saXN0KG5vZGUsIGFlKSB7CisgICAgICBhZV9lbnRyeSAqZW50cnkgPSAoYWVfZW50cnkgKilub2RlOworCisgICAgICBwcmludGYoIkNTRTogICBBRSAlMmQgKCVwKTogIiwgaSwgZW50cnkpOworICAgICAgKCplbnRyeS0+dmFsKS0+cHJpbnQoKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKworICAgICAgaWYgKGVudHJ5LT52YXIpCisgICAgICAgICBwcmludGYoIkNTRTogICAgIGluIHZhciAlcDpcbiIsIGVudHJ5LT52YXIpOworCisgICAgICBpKys7CisgICB9Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpc19jc2VfY2FuZGlkYXRlX3Zpc2l0b3I6OnZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKK3sKKyAgIC8qIEN1cnJlbnRseSwgc2luY2Ugd2UgZG9uJ3QgaGFuZGxlIGtpbGxzIG9mIHRoZSBhZSBiYXNlZCBvbiB2YXJpYWJsZXMKKyAgICAqIGdldHRpbmcgYXNzaWduZWQsIHdlIGNhbiBvbmx5IGhhbmRsZSBjb25zdGFudCB2YXJpYWJsZXMuCisgICAgKi8KKyAgIGlmIChpci0+dmFyLT5kYXRhLnJlYWRfb25seSkgeworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfSBlbHNlIHsKKyAgICAgIG9rID0gZmFsc2U7CisgICAgICByZXR1cm4gdmlzaXRfc3RvcDsKKyAgIH0KK30KKwordm9pZAorY29udGFpbnNfcnZhbHVlX3Zpc2l0b3I6OmhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKQoreworICAgaWYgKCpydmFsdWUgPT0gdmFsKQorICAgICAgZm91bmQgPSB0cnVlOworfQorCitzdGF0aWMgYm9vbAorY29udGFpbnNfcnZhbHVlKGlyX3J2YWx1ZSAqaGF5c3RhY2ssIGlyX3J2YWx1ZSAqbmVlZGxlKQoreworICAgY29udGFpbnNfcnZhbHVlX3Zpc2l0b3IgdihuZWVkbGUpOworICAgaGF5c3RhY2stPmFjY2VwdCgmdik7CisgICByZXR1cm4gdi5mb3VuZDsKK30KKworc3RhdGljIGJvb2wKK2lzX2NzZV9jYW5kaWRhdGUoaXJfcnZhbHVlICppcikKK3sKKyAgIC8qIE91ciB0ZW1wb3JhcnkgdmFyaWFibGUgYXNzaWdubWVudCBnZW5lcmF0aW9uIGlzbid0IHJlYWR5IHRvIGhhbmRsZQorICAgICogYW55dGhpbmcgYmlnZ2VyIHRoYW4gYSB2ZWN0b3IuCisgICAgKi8KKyAgIGlmICghaXItPnR5cGUtPmlzX3ZlY3RvcigpICYmICFpci0+dHlwZS0+aXNfc2NhbGFyKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIE9ubHkgaGFuZGxlIGV4cHJlc3Npb25zIGFuZCB0ZXh0dXJlcyBjdXJyZW50bHkuICBXZSBtYXkgd2FudCB0byBleHRlbmQKKyAgICAqIHRvIHZhcmlhYmxlLWluZGV4IGFycmF5IGRlcmVmZXJlbmNlcyBhdCBzb21lIHBvaW50LgorICAgICovCisgICBzd2l0Y2ggKGlyLT5pcl90eXBlKSB7CisgICBjYXNlIGlyX3R5cGVfZXhwcmVzc2lvbjoKKyAgIGNhc2UgaXJfdHlwZV90ZXh0dXJlOgorICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBpc19jc2VfY2FuZGlkYXRlX3Zpc2l0b3IgdjsKKworICAgaXItPmFjY2VwdCgmdik7CisKKyAgIHJldHVybiB2Lm9rOworfQorCisvKioKKyAqIFRyaWVzIHRvIGZpbmQgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB0byBhIHByZXZpb3VzIGNvbXB1dGF0aW9uIG9mIGEgZ2l2ZW4KKyAqIGV4cHJlc3Npb24uCisgKgorICogV2FsayB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZXhwcmVzc2lvbnMgY2hlY2tpbmcgaWYgYW55IG9mIHRoZW0gbWF0Y2ggdGhlCisgKiBydmFsdWUsIGFuZCBpZiBzbywgbW92ZSB0aGUgcHJldmlvdXMgY29weSBvZiB0aGUgZXhwcmVzc2lvbiB0byBhIHRlbXBvcmFyeQorICogYW5kIHJldHVybiBhIHJlZmVyZW5jZSBvZiB0aGUgdGVtcG9yYXJ5LgorICovCitpcl9ydmFsdWUgKgorY3NlX3Zpc2l0b3I6OnRyeV9jc2UoaXJfcnZhbHVlICpydmFsdWUpCit7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgYWUpIHsKKyAgICAgIGFlX2VudHJ5ICplbnRyeSA9IChhZV9lbnRyeSAqKW5vZGU7CisKKyAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgcHJpbnRmKCJDb21wYXJpbmcgdG8gQUUgJXA6ICIsIGVudHJ5KTsKKyAgICAgICAgICgqZW50cnktPnZhbCktPnByaW50KCk7CisgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICB9CisKKyAgICAgIGlmICghcnZhbHVlLT5lcXVhbHMoKmVudHJ5LT52YWwpKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgcHJpbnRmKCJDU0U6IFJlcGxhY2luZzogIik7CisgICAgICAgICAoKmVudHJ5LT52YWwpLT5wcmludCgpOworICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgcHJpbnRmKCJDU0U6ICAgICAgd2l0aDogIik7CisgICAgICAgICBydmFsdWUtPnByaW50KCk7CisgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICB9CisKKyAgICAgIGlmICghZW50cnktPnZhcikgeworICAgICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmJhc2VfaXIgPSBlbnRyeS0+YmFzZV9pcjsKKworICAgICAgICAgaXJfdmFyaWFibGUgKnZhciA9IG5ldyhydmFsdWUpIGlyX3ZhcmlhYmxlKHJ2YWx1ZS0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfYXV0byk7CisKKyAgICAgICAgIC8qIFdyaXRlIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIHJlc3VsdCBpbnRvIGEgbmV3IHZhcmlhYmxlLiAqLworICAgICAgICAgYmFzZV9pci0+aW5zZXJ0X2JlZm9yZSh2YXIpOworICAgICAgICAgaXJfYXNzaWdubWVudCAqYXNzaWdubWVudCA9IGFzc2lnbih2YXIsICplbnRyeS0+dmFsKTsKKyAgICAgICAgIGJhc2VfaXItPmluc2VydF9iZWZvcmUoYXNzaWdubWVudCk7CisKKyAgICAgICAgIC8qIFJlcGxhY2UgdGhlIGV4cHJlc3Npb24gaW4gdGhlIG9yaWdpbmFsIHRyZWUgd2l0aCBhIGRlcmVmIG9mIHRoZQorICAgICAgICAgICogdmFyaWFibGUsIGJ1dCBrZWVwIHRyYWNraW5nIHRoZSBleHByZXNzaW9uIGZvciBmdXJ0aGVyIHJldXNlLgorICAgICAgICAgICovCisgICAgICAgICAqZW50cnktPnZhbCA9IG5ldyhydmFsdWUpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHZhcik7CisgICAgICAgICBlbnRyeS0+dmFsID0gJmFzc2lnbm1lbnQtPnJoczsKKworICAgICAgICAgZW50cnktPnZhciA9IHZhcjsKKworICAgICAgICAgLyogVXBkYXRlIHRoZSBiYXNlX2lycyBpbiB0aGUgQUUgbGlzdC4gIFdlIGhhdmUgdG8gYmUgc3VyZSB0aGF0CisgICAgICAgICAgKiB0aGV5J3JlIGNvcnJlY3QgLS0gZXhwcmVzc2lvbnMgZnJvbSBvdXIgYmFzZV9pciB0aGF0IHdlcmVuJ3QgbW92ZWQKKyAgICAgICAgICAqIG5lZWQgdG8gc3RheSBpbiB0aGlzIGJhc2VfaXIgKHNvIHRoYXQgbGF0ZXIgY29uc3VtcHRpb24gb2YgdGhlbQorICAgICAgICAgICogcHV0cyBuZXcgdmFyaWFibGVzIGJldHdlZW4gb3VyIG5ldyB2YXJpYWJsZSBhbmQgb3VyIGJhc2VfaXIpLCBidXQKKyAgICAgICAgICAqIGV4cHJlc3Npb25zIGZyb20gb3VyIGJhc2VfaXIgdGhhdCB3ZSAqZGlkKiBtb3ZlIG5lZWQgYmFzZV9pcgorICAgICAgICAgICogdXBkYXRlZCBzbyB0aGF0IGFueSBmdXJ0aGVyIGVsaW1pbmF0aW9uIGZyb20gaW5zaWRlIGdldHMgaXRzIG5ldworICAgICAgICAgICogYXNzaWdubWVudHMgcHV0IGJlZm9yZSBvdXIgbmV3IGFzc2lnbm1lbnQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGZvcmVhY2hfbGlzdChmaXh1cF9ub2RlLCBhZSkgeworICAgICAgICAgICAgYWVfZW50cnkgKmZpeHVwX2VudHJ5ID0gKGFlX2VudHJ5ICopZml4dXBfbm9kZTsKKyAgICAgICAgICAgIGlmIChjb250YWluc19ydmFsdWUoYXNzaWdubWVudC0+cmhzLCAqZml4dXBfZW50cnktPnZhbCkpCisgICAgICAgICAgICAgICBmaXh1cF9lbnRyeS0+YmFzZV9pciA9IGFzc2lnbm1lbnQ7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgIGR1bXBfYWUoYWUpOworICAgICAgfQorCisgICAgICAvKiBSZXBsYWNlIHRoZSBleHByZXNzaW9uIGluIG91ciBjdXJyZW50IHRyZWUgd2l0aCB0aGUgdmFyaWFibGUuICovCisgICAgICByZXR1cm4gbmV3KHJ2YWx1ZSkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUoZW50cnktPnZhcik7CisgICB9CisKKyAgIHJldHVybiBOVUxMOworfQorCisvKiogQWRkIHRoZSBydmFsdWUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGV4cHJlc3Npb25zIGZvciBDU0UuICovCit2b2lkCitjc2VfdmlzaXRvcjo6YWRkX3RvX2FlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSkKK3sKKyAgIGlmIChkZWJ1ZykgeworICAgICAgcHJpbnRmKCJDU0U6IEFkZCB0byBBRTogIik7CisgICAgICAoKnJ2YWx1ZSktPnByaW50KCk7CisgICAgICBwcmludGYoIlxuIik7CisgICB9CisKKyAgIGFlLT5wdXNoX3RhaWwobmV3KG1lbV9jdHgpIGFlX2VudHJ5KGJhc2VfaXIsIHJ2YWx1ZSkpOworCisgICBpZiAoZGVidWcpCisgICAgICBkdW1wX2FlKGFlKTsKK30KKwordm9pZAorY3NlX3Zpc2l0b3I6OmhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKQoreworICAgaWYgKCEqcnZhbHVlKQorICAgICAgcmV0dXJuOworCisgICBpZiAoZGVidWcpIHsKKyAgICAgIHByaW50ZigiQ1NFOiBoYW5kbGVfcnZhbHVlICIpOworICAgICAgKCpydmFsdWUpLT5wcmludCgpOworICAgICAgcHJpbnRmKCJcbiIpOworICAgfQorCisgICBpZiAoIWlzX2NzZV9jYW5kaWRhdGUoKnJ2YWx1ZSkpCisgICAgICByZXR1cm47CisKKyAgIGlyX3J2YWx1ZSAqbmV3X3J2YWx1ZSA9IHRyeV9jc2UoKnJ2YWx1ZSk7CisgICBpZiAobmV3X3J2YWx1ZSkgeworICAgICAgKnJ2YWx1ZSA9IG5ld19ydmFsdWU7CisgICAgICBwcm9ncmVzcyA9IHRydWU7CisKKyAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgIHZhbGlkYXRlX2lyX3RyZWUodmFsaWRhdGVfaW5zdHJ1Y3Rpb25zKTsKKyAgIH0gZWxzZSB7CisgICAgICBhZGRfdG9fYWUocnZhbHVlKTsKKyAgIH0KK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2NzZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9pZiAqaXIpCit7CisgICBoYW5kbGVfcnZhbHVlKCZpci0+Y29uZGl0aW9uKTsKKworICAgYWUtPm1ha2VfZW1wdHkoKTsKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT50aGVuX2luc3RydWN0aW9ucyk7CisKKyAgIGFlLT5tYWtlX2VtcHR5KCk7CisgICB2aXNpdF9saXN0X2VsZW1lbnRzKHRoaXMsICZpci0+ZWxzZV9pbnN0cnVjdGlvbnMpOworCisgICBhZS0+bWFrZV9lbXB0eSgpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworY3NlX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqaXIpCit7CisgICBhZS0+bWFrZV9lbXB0eSgpOworICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCAmaXItPmJvZHkpOworCisgICBhZS0+bWFrZV9lbXB0eSgpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworY3NlX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2xvb3AgKmlyKQoreworICAgYWUtPm1ha2VfZW1wdHkoKTsKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5ib2R5X2luc3RydWN0aW9ucyk7CisKKyAgIGFlLT5tYWtlX2VtcHR5KCk7CisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitjc2VfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfY2FsbCAqKQoreworICAgLyogQmVjYXVzZSBjYWxsIGlzIGFuIGV4ZWNfbGlzdCBvZiBpcl9ydmFsdWVzLCBoYW5kbGVfcnZhbHVlIGdldHMgcGFzc2VkIGEKKyAgICAqIHBvaW50ZXIgdG8gdGhlIChpcl9ydmFsdWUgKikgb24gdGhlIHN0YWNrLiAgU2luY2Ugd2Ugc2F2ZSB0aG9zZSBwb2ludGVycworICAgICogaW4gdGhlIEFFIGxpc3QsIHdlIGNhbid0IGxldCBoYW5kbGVfcnZhbHVlIGdldCBjYWxsZWQuCisgICAgKi8KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworLyoqCisgKiBEb2VzIGEgKHVuaWZvcm0tdmFsdWUpIGNvbnN0YW50IHN1YmV4cHJlc3Npb24gZWxpbWluYXRpb24gcGFzcyBvbiB0aGUgY29kZQorICogcHJlc2VudCBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLgorICovCitib29sCitkb19jc2UoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBjc2VfdmlzaXRvciB2KGluc3RydWN0aW9ucyk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7CisKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfZGVhZF9idWlsdGluX3ZhcnlpbmdzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfYnVpbHRpbl92YXJ5aW5ncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmNzkxZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfYnVpbHRpbl92YXJ5aW5ncy5jcHAKQEAgLTAsMCArMSw1ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBNYXJlayBPbMWhw6FrIDxtYXJhZW9AZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF9kZWFkX2J1aWx0aW5fdmFyeWluZ3MuY3BwCisgKgorICogVGhpcyBlbGltaW5hdGVzIHRoZSBidWlsdC1pbiBzaGFkZXIgb3V0cHV0cyB3aGljaCBhcmUgZWl0aGVyIG5vdCB3cml0dGVuCisgKiBhdCBhbGwgb3Igbm90IHVzZWQgYnkgdGhlIG5leHQgc3RhZ2UuIEl0IGFsc28gZWxpbWluYXRlcyB1bnVzZWQgZWxlbWVudHMKKyAqIG9mIGdsX1RleENvb3JkIGlucHV0cywgd2hpY2ggcmVkdWNlcyB0aGUgb3ZlcmFsbCB2YXJ5aW5nIHVzYWdlLgorICogVGhlIHZhcnlpbmdzIGhhbmRsZWQgaGVyZSBhcmUgdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjb2xvciwgdGhlIGZvZywKKyAqIGFuZCB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyAoZ2xfVGV4Q29vcmQpLgorICoKKyAqIFRoaXMgcGFzcyBpcyBuZWNlc3NhcnksIGJlY2F1c2UgdGhlIE1lc2EgR0xTTCBsaW5rZXIgY2Fubm90IGVsaW1pbmF0ZQorICogYnVpbHQtaW4gdmFyeWluZ3MgbGlrZSBpdCBlbGltaW5hdGVzIHVzZXItZGVmaW5lZCB2YXJ5aW5ncywgYmVjYXVzZQorICogdGhlIGJ1aWx0LWluIHZhcnlpbmdzIGhhdmUgcHJlLWFzc2lnbmVkIGxvY2F0aW9ucy4gQWxzbywgdGhlIGVsaW1pbmF0aW9uCisgKiBvZiB1bnVzZWQgZ2xfVGV4Q29vcmQgZWxlbWVudHMgcmVxdWlyZXMgaXRzIG93biBsb3dlcmluZyBwYXNzIGFueXdheS4KKyAqCisgKiBJdCdzIGltcGxlbWVudGVkIGJ5IHJlcGxhY2luZyBhbGwgb2NjdXJyZW5jZXMgb2YgZGVhZCB2YXJ5aW5ncyB3aXRoCisgKiB0ZW1wb3JhcnkgdmFyaWFibGVzLCB3aGljaCBjcmVhdGVzIGRlYWQgY29kZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcnVuCisgKiBhIGRlYWQtY29kZSBlbGltaW5hdGlvbiBwYXNzIGFmdGVyIHRoaXMuCisgKgorICogSWYgYW55IHRleHR1cmUgY29vcmRpbmF0ZSBzbG90cyBjYW4gYmUgZWxpbWluYXRlZCwgdGhlIGdsX1RleENvb3JkIGFycmF5IGlzCisgKiBicm9rZW4gZG93biBpbnRvIHNlcGFyYXRlIHZlYzQgdmFyaWFibGVzIHdpdGggbG9jYXRpb25zIGVxdWFsIHRvCisgKiBWQVJZSU5HX1NMT1RfVEVYMCArIGkuCisgKgorICogVGhlIHNhbWUgaXMgZG9uZSBmb3IgdGhlIGdsX0ZyYWdEYXRhIGZyYWdtZW50IHNoYWRlciBvdXRwdXQuCisgKi8KKworI2luY2x1ZGUgImxpYmZucy5oIiAvLyBMdW5hckcgQUREOgorI2luY2x1ZGUgImljZC11dGlscy5oIiAvLyBMdW5hckc6IEFERAorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfcnZhbHVlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9vcHRpbWl6YXRpb24uaCIKKyNpbmNsdWRlICJpcl9wcmludF92aXNpdG9yLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgImxpbmtfdmFyeWluZ3MuaCIKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBUaGlzIG9idGFpbnMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYnVpbHQtaW4gdmFyeWluZ3MgZnJvbSBzaGFkZXIgY29kZS4KKyAqLworY2xhc3MgdmFyeWluZ19pbmZvX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgLyogIm1vZGUiIGNhbiBiZSBlaXRoZXIgaXJfdmFyX3NoYWRlcl9pbiBvciBpcl92YXJfc2hhZGVyX291dCAqLworICAgdmFyeWluZ19pbmZvX3Zpc2l0b3IoaXJfdmFyaWFibGVfbW9kZSBtb2RlLCBib29sIGZpbmRfZnJhZ19vdXRwdXRzID0gZmFsc2UpCisgICAgICA6IGxvd2VyX3RleGNvb3JkX2FycmF5KHRydWUpLAorICAgICAgICB0ZXhjb29yZF9hcnJheShOVUxMKSwKKyAgICAgICAgdGV4Y29vcmRfdXNhZ2UoMCksCisgICAgICAgIGZpbmRfZnJhZ19vdXRwdXRzKGZpbmRfZnJhZ19vdXRwdXRzKSwKKyAgICAgICAgbG93ZXJfZnJhZ2RhdGFfYXJyYXkodHJ1ZSksCisgICAgICAgIGZyYWdkYXRhX2FycmF5KE5VTEwpLAorICAgICAgICBmcmFnZGF0YV91c2FnZSgwKSwKKyAgICAgICAgY29sb3JfdXNhZ2UoMCksCisgICAgICAgIHRmZWVkYmFja19jb2xvcl91c2FnZSgwKSwKKyAgICAgICAgZm9nKE5VTEwpLAorICAgICAgICBoYXNfZm9nKGZhbHNlKSwKKyAgICAgICAgdGZlZWRiYWNrX2hhc19mb2coZmFsc2UpLAorICAgICAgICBtb2RlKG1vZGUpCisgICB7CisgICAgICBtZW1zZXQoY29sb3IsIDAsIHNpemVvZihjb2xvcikpOworICAgICAgbWVtc2V0KGJhY2tjb2xvciwgMCwgc2l6ZW9mKGJhY2tjb2xvcikpOworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKKyAgIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSBpci0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworCisgICAgICBpZiAoIXZhciB8fCB2YXItPmRhdGEubW9kZSAhPSB0aGlzLT5tb2RlKQorICAgICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworCisgICAgICBpZiAodGhpcy0+ZmluZF9mcmFnX291dHB1dHMgJiYgdmFyLT5kYXRhLmxvY2F0aW9uID09IEZSQUdfUkVTVUxUX0RBVEEwKSB7CisgICAgICAgICB0aGlzLT5mcmFnZGF0YV9hcnJheSA9IHZhcjsKKworICAgICAgICAgaXJfY29uc3RhbnQgKmluZGV4ID0gaXItPmFycmF5X2luZGV4LT5hc19jb25zdGFudCgpOworICAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgdmFyaWFibGUgaW5kZXhpbmcuICovCisgICAgICAgICAgICB0aGlzLT5mcmFnZGF0YV91c2FnZSB8PSAoMSA8PCB2YXItPnR5cGUtPmFycmF5X3NpemUoKSkgLSAxOworICAgICAgICAgICAgdGhpcy0+bG93ZXJfZnJhZ2RhdGFfYXJyYXkgPSBmYWxzZTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhpcy0+ZnJhZ2RhdGFfdXNhZ2UgfD0gMSA8PCBpbmRleC0+Z2V0X3VpbnRfY29tcG9uZW50KDApOworICAgICAgICAgfQorCisgICAgICAgICAvKiBEb24ndCB2aXNpdCB0aGUgbGVhdmVzIG9mIGlyX2RlcmVmZXJlbmNlX2FycmF5LiAqLworICAgICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMtPmZpbmRfZnJhZ19vdXRwdXRzICYmIHZhci0+ZGF0YS5sb2NhdGlvbiA9PSBWQVJZSU5HX1NMT1RfVEVYMCkgeworICAgICAgICAgdGhpcy0+dGV4Y29vcmRfYXJyYXkgPSB2YXI7CisKKyAgICAgICAgIGlyX2NvbnN0YW50ICppbmRleCA9IGlyLT5hcnJheV9pbmRleC0+YXNfY29uc3RhbnQoKTsKKyAgICAgICAgIGlmIChpbmRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBUaGVyZSBpcyB2YXJpYWJsZSBpbmRleGluZywgd2UgY2FuJ3QgbG93ZXIgdGhlIHRleGNvb3JkIGFycmF5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLT50ZXhjb29yZF91c2FnZSB8PSAoMSA8PCB2YXItPnR5cGUtPmFycmF5X3NpemUoKSkgLSAxOworICAgICAgICAgICAgdGhpcy0+bG93ZXJfdGV4Y29vcmRfYXJyYXkgPSBmYWxzZTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhpcy0+dGV4Y29vcmRfdXNhZ2UgfD0gMSA8PCBpbmRleC0+Z2V0X3VpbnRfY29tcG9uZW50KDApOworICAgICAgICAgfQorCisgICAgICAgICAvKiBEb24ndCB2aXNpdCB0aGUgbGVhdmVzIG9mIGlyX2RlcmVmZXJlbmNlX2FycmF5LiAqLworICAgICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworICAgICAgfQorCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQorICAgeworICAgICAgaXJfdmFyaWFibGUgKnZhciA9IGlyLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSAhPSB0aGlzLT5tb2RlIHx8ICF2YXItPnR5cGUtPmlzX2FycmF5KCkpCisgICAgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgICAgIGlmICh0aGlzLT5maW5kX2ZyYWdfb3V0cHV0cyAmJiB2YXItPmRhdGEubG9jYXRpb24gPT0gRlJBR19SRVNVTFRfREFUQTApIHsKKyAgICAgICAgIC8qIFRoaXMgaXMgYSB3aG9sZSBhcnJheSBkZXJlZmVyZW5jZS4gKi8KKyAgICAgICAgIHRoaXMtPmZyYWdkYXRhX3VzYWdlIHw9ICgxIDw8IHZhci0+dHlwZS0+YXJyYXlfc2l6ZSgpKSAtIDE7CisgICAgICAgICB0aGlzLT5sb3dlcl9mcmFnZGF0YV9hcnJheSA9IGZhbHNlOworICAgICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoIXRoaXMtPmZpbmRfZnJhZ19vdXRwdXRzICYmIHZhci0+ZGF0YS5sb2NhdGlvbiA9PSBWQVJZSU5HX1NMT1RfVEVYMCkgeworICAgICAgICAgLyogVGhpcyBpcyBhIHdob2xlIGFycmF5IGRlcmVmZXJlbmNlIGxpa2UgImdsX1RleENvb3JkID0geDsiLAorICAgICAgICAgICogdGhlcmUncyBwcm9iYWJseSBubyBwb2ludCBpbiBsb3dlcmluZyB0aGF0LgorICAgICAgICAgICovCisgICAgICAgICB0aGlzLT50ZXhjb29yZF91c2FnZSB8PSAoMSA8PCB2YXItPnR5cGUtPmFycmF5X3NpemUoKSkgLSAxOworICAgICAgICAgdGhpcy0+bG93ZXJfdGV4Y29vcmRfYXJyYXkgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl92YXJpYWJsZSAqdmFyKQorICAgeworICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlICE9IHRoaXMtPm1vZGUpCisgICAgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSBmb3IgZnJhZ21lbnQgb3V0cHV0cy4gKi8KKyAgICAgIGlmICh0aGlzLT5maW5kX2ZyYWdfb3V0cHV0cykKKyAgICAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgICAgLyogSGFuZGxlIGNvbG9ycyBhbmQgZm9nLiAqLworICAgICAgc3dpdGNoICh2YXItPmRhdGEubG9jYXRpb24pIHsKKyAgICAgIGNhc2UgVkFSWUlOR19TTE9UX0NPTDA6CisgICAgICAgICB0aGlzLT5jb2xvclswXSA9IHZhcjsKKyAgICAgICAgIHRoaXMtPmNvbG9yX3VzYWdlIHw9IDE7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVkFSWUlOR19TTE9UX0NPTDE6CisgICAgICAgICB0aGlzLT5jb2xvclsxXSA9IHZhcjsKKyAgICAgICAgIHRoaXMtPmNvbG9yX3VzYWdlIHw9IDI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVkFSWUlOR19TTE9UX0JGQzA6CisgICAgICAgICB0aGlzLT5iYWNrY29sb3JbMF0gPSB2YXI7CisgICAgICAgICB0aGlzLT5jb2xvcl91c2FnZSB8PSAxOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZBUllJTkdfU0xPVF9CRkMxOgorICAgICAgICAgdGhpcy0+YmFja2NvbG9yWzFdID0gdmFyOworICAgICAgICAgdGhpcy0+Y29sb3JfdXNhZ2UgfD0gMjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWQVJZSU5HX1NMT1RfRk9HQzoKKyAgICAgICAgIHRoaXMtPmZvZyA9IHZhcjsKKyAgICAgICAgIHRoaXMtPmhhc19mb2cgPSB0cnVlOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgdm9pZCBnZXQoZXhlY19saXN0ICppciwKKyAgICAgICAgICAgIHVuc2lnbmVkIG51bV90ZmVlZGJhY2tfZGVjbHMsCisgICAgICAgICAgICB0ZmVlZGJhY2tfZGVjbCAqdGZlZWRiYWNrX2RlY2xzKQorICAgeworICAgICAgLyogSGFuZGxlIHRoZSB0cmFuc2Zvcm0gZmVlZGJhY2sgdmFyeWluZ3MuICovCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3RmZWVkYmFja19kZWNsczsgaSsrKSB7CisgICAgICAgICBpZiAoIXRmZWVkYmFja19kZWNsc1tpXS5pc192YXJ5aW5nKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgdW5zaWduZWQgbG9jYXRpb24gPSB0ZmVlZGJhY2tfZGVjbHNbaV0uZ2V0X2xvY2F0aW9uKCk7CisKKyAgICAgICAgIHN3aXRjaCAobG9jYXRpb24pIHsKKyAgICAgICAgIGNhc2UgVkFSWUlOR19TTE9UX0NPTDA6CisgICAgICAgICBjYXNlIFZBUllJTkdfU0xPVF9CRkMwOgorICAgICAgICAgICAgdGhpcy0+dGZlZWRiYWNrX2NvbG9yX3VzYWdlIHw9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgVkFSWUlOR19TTE9UX0NPTDE6CisgICAgICAgICBjYXNlIFZBUllJTkdfU0xPVF9CRkMxOgorICAgICAgICAgICAgdGhpcy0+dGZlZWRiYWNrX2NvbG9yX3VzYWdlIHw9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgVkFSWUlOR19TTE9UX0ZPR0M6CisgICAgICAgICAgICB0aGlzLT50ZmVlZGJhY2tfaGFzX2ZvZyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAobG9jYXRpb24gPj0gVkFSWUlOR19TTE9UX1RFWDAgJiYKKyAgICAgICAgICAgICAgICBsb2NhdGlvbiA8PSBWQVJZSU5HX1NMT1RfVEVYNykgeworICAgICAgICAgICAgICAgdGhpcy0+bG93ZXJfdGV4Y29vcmRfYXJyYXkgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyB0aGUgc2hhZGVyLiAqLworICAgICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCBpcik7CisKKyAgICAgIGlmICghdGhpcy0+dGV4Y29vcmRfYXJyYXkpIHsKKyAgICAgICAgIHRoaXMtPmxvd2VyX3RleGNvb3JkX2FycmF5ID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoIXRoaXMtPmZyYWdkYXRhX2FycmF5KSB7CisgICAgICAgICB0aGlzLT5sb3dlcl9mcmFnZGF0YV9hcnJheSA9IGZhbHNlOworICAgICAgfQorICAgfQorCisgICBib29sIGxvd2VyX3RleGNvb3JkX2FycmF5OworICAgaXJfdmFyaWFibGUgKnRleGNvb3JkX2FycmF5OworICAgdW5zaWduZWQgdGV4Y29vcmRfdXNhZ2U7IC8qIGJpdG1hc2sgKi8KKworICAgYm9vbCBmaW5kX2ZyYWdfb3V0cHV0czsgLyogZmFsc2UgaWYgaXQncyBsb29raW5nIGZvciB2YXJ5aW5ncyAqLworICAgYm9vbCBsb3dlcl9mcmFnZGF0YV9hcnJheTsKKyAgIGlyX3ZhcmlhYmxlICpmcmFnZGF0YV9hcnJheTsKKyAgIHVuc2lnbmVkIGZyYWdkYXRhX3VzYWdlOyAvKiBiaXRtYXNrICovCisKKyAgIGlyX3ZhcmlhYmxlICpjb2xvclsyXTsKKyAgIGlyX3ZhcmlhYmxlICpiYWNrY29sb3JbMl07CisgICB1bnNpZ25lZCBjb2xvcl91c2FnZTsgLyogYml0bWFzayAqLworICAgdW5zaWduZWQgdGZlZWRiYWNrX2NvbG9yX3VzYWdlOyAvKiBiaXRtYXNrICovCisKKyAgIGlyX3ZhcmlhYmxlICpmb2c7CisgICBib29sIGhhc19mb2c7CisgICBib29sIHRmZWVkYmFja19oYXNfZm9nOworCisgICBpcl92YXJpYWJsZV9tb2RlIG1vZGU7Cit9OworCisKKy8qKgorICogVGhpcyByZXBsYWNlcyB1bnVzZWQgdmFyeWluZ3Mgd2l0aCB0ZW1wb3JhcnkgdmFyaWFibGVzLgorICoKKyAqIElmICJpciIgaXMgdGhlIHByb2R1Y2VyLCB0aGUgImV4dGVybmFsIiB1c2FnZSBzaG91bGQgY29tZSBmcm9tCisgKiB0aGUgY29uc3VtZXIuIEl0IGFsc28gd29ya3MgdGhlIG90aGVyIHdheSBhcm91bmQuIElmIGVpdGhlciBvbmUgaXMKKyAqIG1pc3NpbmcsIHNldCB0aGUgImV4dGVybmFsIiB1c2FnZSB0byBhIGZ1bGwgbWFzay4KKyAqLworY2xhc3MgcmVwbGFjZV92YXJ5aW5nc192aXNpdG9yIDogcHVibGljIGlyX3J2YWx1ZV92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIHJlcGxhY2VfdmFyeWluZ3NfdmlzaXRvcihleGVjX2xpc3QgKmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcnlpbmdfaW5mb192aXNpdG9yICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGV4dGVybmFsX3RleGNvb3JkX3VzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGV4dGVybmFsX2NvbG9yX3VzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZXJuYWxfaGFzX2ZvZykKKyAgICAgIDogaW5mbyhpbmZvKSwgbmV3X2ZvZyhOVUxMKQorICAgeworICAgICAgdm9pZCAqY29uc3QgY3R4ID0gaXI7CisKKyAgICAgIG1lbXNldCh0aGlzLT5uZXdfZnJhZ2RhdGEsIDAsIHNpemVvZih0aGlzLT5uZXdfZnJhZ2RhdGEpKTsKKyAgICAgIG1lbXNldCh0aGlzLT5uZXdfdGV4Y29vcmQsIDAsIHNpemVvZih0aGlzLT5uZXdfdGV4Y29vcmQpKTsKKyAgICAgIG1lbXNldCh0aGlzLT5uZXdfY29sb3IsIDAsIHNpemVvZih0aGlzLT5uZXdfY29sb3IpKTsKKyAgICAgIG1lbXNldCh0aGlzLT5uZXdfYmFja2NvbG9yLCAwLCBzaXplb2YodGhpcy0+bmV3X2JhY2tjb2xvcikpOworCisgICAgICBjb25zdCBjaGFyICptb2RlX3N0ciA9CisgICAgICAgICBpbmZvLT5tb2RlID09IGlyX3Zhcl9zaGFkZXJfaW4gPyAiaW4iIDogIm91dCI7CisKKyAgICAgIC8qIEhhbmRsZSB0ZXhjb29yZCBvdXRwdXRzLgorICAgICAgICoKKyAgICAgICAqIFdlJ3JlIGdvaW5nIHRvIGJyZWFrIGRvd24gdGhlIGdsX1RleENvb3JkIGFycmF5IGludG8gc2VwYXJhdGUKKyAgICAgICAqIHZhcmlhYmxlcy4gRmlyc3QsIGFkZCBkZWNsYXJhdGlvbnMgb2YgdGhlIG5ldyB2YXJpYWJsZXMgYWxsCisgICAgICAgKiBvY2N1cnJlbmNlcyBvZiBnbF9UZXhDb29yZCB3aWxsIGJlIHJlcGxhY2VkIHdpdGguCisgICAgICAgKi8KKyAgICAgIGlmIChpbmZvLT5sb3dlcl90ZXhjb29yZF9hcnJheSkgeworICAgICAgICAgcHJlcGFyZV9hcnJheShpciwgdGhpcy0+bmV3X3RleGNvb3JkLCBBUlJBWV9TSVpFKHRoaXMtPm5ld190ZXhjb29yZCksCisgICAgICAgICAgICAgICAgICAgICAgIFZBUllJTkdfU0xPVF9URVgwLCAiVGV4Q29vcmQiLCBtb2RlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGV4Y29vcmRfdXNhZ2UsIGV4dGVybmFsX3RleGNvb3JkX3VzYWdlKTsKKyAgICAgIH0KKworICAgICAgLyogSGFuZGxlIGdsX0ZyYWdEYXRhIGluIHRoZSBzYW1lIHdheSBsaWtlIGdsX1RleENvb3JkLiAqLworICAgICAgaWYgKGluZm8tPmxvd2VyX2ZyYWdkYXRhX2FycmF5KSB7CisgICAgICAgICBwcmVwYXJlX2FycmF5KGlyLCB0aGlzLT5uZXdfZnJhZ2RhdGEsIEFSUkFZX1NJWkUodGhpcy0+bmV3X2ZyYWdkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlJBR19SRVNVTFRfREFUQTAsICJGcmFnRGF0YSIsIG1vZGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mcmFnZGF0YV91c2FnZSwgKDEgPDwgTUFYX0RSQVdfQlVGRkVSUykgLSAxKTsKKyAgICAgIH0KKworICAgICAgLyogQ3JlYXRlIGR1bW15IHZhcmlhYmxlcyB3aGljaCB3aWxsIHJlcGxhY2Ugc2V0LWJ1dC11bnVzZWQgY29sb3IgYW5kCisgICAgICAgKiBmb2cgb3V0cHV0cy4KKyAgICAgICAqLworICAgICAgZXh0ZXJuYWxfY29sb3JfdXNhZ2UgfD0gaW5mby0+dGZlZWRiYWNrX2NvbG9yX3VzYWdlOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgY2hhciBuYW1lWzMyXTsKKworICAgICAgICAgaWYgKCEoZXh0ZXJuYWxfY29sb3JfdXNhZ2UgJiAoMSA8PCBpKSkpIHsKKyAgICAgICAgICAgIGlmIChpbmZvLT5jb2xvcltpXSkgeworICAgICAgICAgICAgICAgc25wcmludGYobmFtZSwgMzIsICJnbF8lc19Gcm9udENvbG9yJWlfZHVtbXkiLCBtb2RlX3N0ciwgaSk7CisgICAgICAgICAgICAgICB0aGlzLT5uZXdfY29sb3JbaV0gPQorICAgICAgICAgICAgICAgICAgbmV3IChjdHgpIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6dmVjNF90eXBlLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5mby0+YmFja2NvbG9yW2ldKSB7CisgICAgICAgICAgICAgICBzbnByaW50ZihuYW1lLCAzMiwgImdsXyVzX0JhY2tDb2xvciVpX2R1bW15IiwgbW9kZV9zdHIsIGkpOworICAgICAgICAgICAgICAgdGhpcy0+bmV3X2JhY2tjb2xvcltpXSA9CisgICAgICAgICAgICAgICAgICBuZXcgKGN0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3RlbXBvcmFyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghZXh0ZXJuYWxfaGFzX2ZvZyAmJiAhaW5mby0+dGZlZWRiYWNrX2hhc19mb2cgJiYKKyAgICAgICAgICBpbmZvLT5mb2cpIHsKKyAgICAgICAgIGNoYXIgbmFtZVszMl07CisKKyAgICAgICAgIHNucHJpbnRmKG5hbWUsIDMyLCAiZ2xfJXNfRm9nRnJhZ0Nvb3JkX2R1bW15IiwgbW9kZV9zdHIpOworICAgICAgICAgdGhpcy0+bmV3X2ZvZyA9IG5ldyAoY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OmZsb2F0X3R5cGUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl90ZW1wb3JhcnkpOworICAgICAgfQorCisgICAgICAvKiBOb3cgZG8gdGhlIHJlcGxhY2luZy4gKi8KKyAgICAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgaXIpOworICAgfQorCisgICB2b2lkIHByZXBhcmVfYXJyYXkoZXhlY19saXN0ICppciwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXJfdmFyaWFibGUgKipuZXdfdmFyLAorICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZWxlbWVudHMsIHVuc2lnbmVkIHN0YXJ0X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcl9uYW1lLCBjb25zdCBjaGFyICptb2RlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1c2FnZSwgdW5zaWduZWQgZXh0ZXJuYWxfdXNhZ2UpCisgICB7CisgICAgICB2b2lkICpjb25zdCBjdHggPSBpcjsKKworICAgICAgZm9yIChpbnQgaSA9IG1heF9lbGVtZW50cy0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgaWYgKHVzYWdlICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CisKKyAgICAgICAgICAgIGlmICghKGV4dGVybmFsX3VzYWdlICYgKDEgPDwgaSkpKSB7CisgICAgICAgICAgICAgICAvKiBUaGlzIHZhcnlpbmcgaXMgdW51c2VkIGluIHRoZSBuZXh0IHN0YWdlLiBEZWNsYXJlCisgICAgICAgICAgICAgICAgKiBhIHRlbXBvcmFyeSBpbnN0ZWFkIG9mIGFuIG91dHB1dC4gKi8KKyAgICAgICAgICAgICAgIHNucHJpbnRmKG5hbWUsIDMyLCAiZ2xfJXNfJXMlaV9kdW1teSIsIG1vZGVfc3RyLCB2YXJfbmFtZSwgaSk7CisgICAgICAgICAgICAgICBuZXdfdmFyW2ldID0KKyAgICAgICAgICAgICAgICAgIG5ldyAoY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OnZlYzRfdHlwZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgc25wcmludGYobmFtZSwgMzIsICJnbF8lc18lcyVpIiwgbW9kZV9zdHIsIHZhcl9uYW1lLCBpKTsKKyAgICAgICAgICAgICAgIG5ld192YXJbaV0gPQorICAgICAgICAgICAgICAgICAgbmV3KGN0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjp2ZWM0X3R5cGUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5pbmZvLT5tb2RlKTsKKyAgICAgICAgICAgICAgIG5ld192YXJbaV0tPmRhdGEubG9jYXRpb24gPSBzdGFydF9sb2NhdGlvbiArIGk7CisgICAgICAgICAgICAgICBuZXdfdmFyW2ldLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgIG5ld192YXJbaV0tPmRhdGEuZXhwbGljaXRfaW5kZXggPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpci0+aGVhZC0+aW5zZXJ0X2JlZm9yZShuZXdfdmFyW2ldKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl92YXJpYWJsZSAqdmFyKQorICAgeworICAgICAgLyogUmVtb3ZlIHRoZSBnbF9UZXhDb29yZCBhcnJheS4gKi8KKyAgICAgIGlmICh0aGlzLT5pbmZvLT5sb3dlcl90ZXhjb29yZF9hcnJheSAmJgorICAgICAgICAgIHZhciA9PSB0aGlzLT5pbmZvLT50ZXhjb29yZF9hcnJheSkgeworICAgICAgICAgdmFyLT5yZW1vdmUoKTsKKyAgICAgIH0KKworICAgICAgLyogUmVtb3ZlIHRoZSBnbF9GcmFnRGF0YSBhcnJheS4gKi8KKyAgICAgIGlmICh0aGlzLT5pbmZvLT5sb3dlcl9mcmFnZGF0YV9hcnJheSAmJgorICAgICAgICAgIHZhciA9PSB0aGlzLT5pbmZvLT5mcmFnZGF0YV9hcnJheSkgeworICAgICAgICAgdmFyLT5yZW1vdmUoKTsKKyAgICAgIH0KKworICAgICAgLyogUmVwbGFjZSBzZXQtYnV0LXVudXNlZCBjb2xvciBhbmQgZm9nIG91dHB1dHMgd2l0aCBkdW1teSB2YXJpYWJsZXMuICovCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgaWYgKHZhciA9PSB0aGlzLT5pbmZvLT5jb2xvcltpXSAmJiB0aGlzLT5uZXdfY29sb3JbaV0pIHsKKyAgICAgICAgICAgIHZhci0+cmVwbGFjZV93aXRoKHRoaXMtPm5ld19jb2xvcltpXSk7CisgICAgICAgICB9CisgICAgICAgICBpZiAodmFyID09IHRoaXMtPmluZm8tPmJhY2tjb2xvcltpXSAmJgorICAgICAgICAgICAgIHRoaXMtPm5ld19iYWNrY29sb3JbaV0pIHsKKyAgICAgICAgICAgIHZhci0+cmVwbGFjZV93aXRoKHRoaXMtPm5ld19iYWNrY29sb3JbaV0pOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodmFyID09IHRoaXMtPmluZm8tPmZvZyAmJiB0aGlzLT5uZXdfZm9nKSB7CisgICAgICAgICB2YXItPnJlcGxhY2Vfd2l0aCh0aGlzLT5uZXdfZm9nKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgaGFuZGxlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpCisgICB7CisgICAgICBpZiAoISpydmFsdWUpCisgICAgICAgICByZXR1cm47CisKKyAgICAgIHZvaWQgKmN0eCA9IHJhbGxvY19wYXJlbnQoKnJ2YWx1ZSk7CisKKyAgICAgIC8qIFJlcGxhY2UgYW4gYXJyYXkgZGVyZWZlcmVuY2UgZ2xfVGV4Q29vcmRbaV0gd2l0aCBhIHNpbmdsZQorICAgICAgICogdmFyaWFibGUgZGVyZWZlcmVuY2UgcmVwcmVzZW50aW5nIGdsX1RleENvb3JkW2ldLgorICAgICAgICovCisgICAgICBpZiAodGhpcy0+aW5mby0+bG93ZXJfdGV4Y29vcmRfYXJyYXkpIHsKKyAgICAgICAgIC8qIGdsX1RleENvb3JkW2ldIG9jY3VycmVuY2UgKi8KKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpjb25zdCBkYSA9ICgqcnZhbHVlKS0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKTsKKworICAgICAgICAgaWYgKGRhICYmIGRhLT52YXJpYWJsZV9yZWZlcmVuY2VkKCkgPT0KKyAgICAgICAgICAgICB0aGlzLT5pbmZvLT50ZXhjb29yZF9hcnJheSkgeworICAgICAgICAgICAgdW5zaWduZWQgaSA9IGRhLT5hcnJheV9pbmRleC0+YXNfY29uc3RhbnQoKS0+Z2V0X3VpbnRfY29tcG9uZW50KDApOworCisgICAgICAgICAgICAqcnZhbHVlID0gbmV3KGN0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUodGhpcy0+bmV3X3RleGNvb3JkW2ldKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogU2FtZSBmb3IgZ2xfRnJhZ0RhdGEuICovCisgICAgICBpZiAodGhpcy0+aW5mby0+bG93ZXJfZnJhZ2RhdGFfYXJyYXkpIHsKKyAgICAgICAgIC8qIGdsX0ZyYWdEYXRhW2ldIG9jY3VycmVuY2UgKi8KKyAgICAgICAgIGlyX2RlcmVmZXJlbmNlX2FycmF5ICpjb25zdCBkYSA9ICgqcnZhbHVlKS0+YXNfZGVyZWZlcmVuY2VfYXJyYXkoKTsKKworICAgICAgICAgaWYgKGRhICYmIGRhLT52YXJpYWJsZV9yZWZlcmVuY2VkKCkgPT0gdGhpcy0+aW5mby0+ZnJhZ2RhdGFfYXJyYXkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGkgPSBkYS0+YXJyYXlfaW5kZXgtPmFzX2NvbnN0YW50KCktPmdldF91aW50X2NvbXBvbmVudCgwKTsKKworICAgICAgICAgICAgKnJ2YWx1ZSA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRoaXMtPm5ld19mcmFnZGF0YVtpXSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFJlcGxhY2Ugc2V0LWJ1dC11bnVzZWQgY29sb3IgYW5kIGZvZyBvdXRwdXRzIHdpdGggZHVtbXkgdmFyaWFibGVzLiAqLworICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmNvbnN0IGR2ID0gKCpydmFsdWUpLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgICAgaWYgKCFkdikKKyAgICAgICAgIHJldHVybjsKKworICAgICAgaXJfdmFyaWFibGUgKnZhciA9IGR2LT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICBpZiAodmFyID09IHRoaXMtPmluZm8tPmNvbG9yW2ldICYmIHRoaXMtPm5ld19jb2xvcltpXSkgeworICAgICAgICAgICAgKnJ2YWx1ZSA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRoaXMtPm5ld19jb2xvcltpXSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICAgICBpZiAodmFyID09IHRoaXMtPmluZm8tPmJhY2tjb2xvcltpXSAmJgorICAgICAgICAgICAgIHRoaXMtPm5ld19iYWNrY29sb3JbaV0pIHsKKyAgICAgICAgICAgICpydmFsdWUgPSBuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSh0aGlzLT5uZXdfYmFja2NvbG9yW2ldKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZhciA9PSB0aGlzLT5pbmZvLT5mb2cgJiYgdGhpcy0+bmV3X2ZvZykgeworICAgICAgICAgKnJ2YWx1ZSA9IG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHRoaXMtPm5ld19mb2cpOworICAgICAgfQorICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKmlyKQorICAgeworICAgICAgaGFuZGxlX3J2YWx1ZSgmaXItPnJocyk7CisgICAgICBoYW5kbGVfcnZhbHVlKCZpci0+Y29uZGl0aW9uKTsKKworICAgICAgLyogV2UgaGF2ZSB0byB1c2Ugc2V0X2xocyB3aGVuIGNoYW5naW5nIHRoZSBMSFMgb2YgYW4gYXNzaWdubWVudC4gKi8KKyAgICAgIGlyX3J2YWx1ZSAqbGhzID0gaXItPmxoczsKKworICAgICAgaGFuZGxlX3J2YWx1ZSgmbGhzKTsKKyAgICAgIGlmIChsaHMgIT0gaXItPmxocykgeworICAgICAgICAgaXItPnNldF9saHMobGhzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCitwcml2YXRlOgorICAgY29uc3QgdmFyeWluZ19pbmZvX3Zpc2l0b3IgKmluZm87CisgICBpcl92YXJpYWJsZSAqbmV3X2ZyYWdkYXRhW01BWF9EUkFXX0JVRkZFUlNdOworICAgaXJfdmFyaWFibGUgKm5ld190ZXhjb29yZFtNQVhfVEVYVFVSRV9DT09SRF9VTklUU107CisgICBpcl92YXJpYWJsZSAqbmV3X2NvbG9yWzJdOworICAgaXJfdmFyaWFibGUgKm5ld19iYWNrY29sb3JbMl07CisgICBpcl92YXJpYWJsZSAqbmV3X2ZvZzsKK307CisKK30gLyogYW5vbnltb3VzIG5hbWVzcGFjZSAqLworCitzdGF0aWMgdm9pZAorbG93ZXJfdGV4Y29vcmRfYXJyYXkoZXhlY19saXN0ICppciwgY29uc3QgdmFyeWluZ19pbmZvX3Zpc2l0b3IgKmluZm8pCit7CisgICByZXBsYWNlX3ZhcnlpbmdzX3Zpc2l0b3IoaXIsIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgTUFYX1RFWFRVUkVfQ09PUkRfVU5JVFMpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIHwgMiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitsb3dlcl9mcmFnZGF0YV9hcnJheShleGVjX2xpc3QgKmlyKQoreworICAgdmFyeWluZ19pbmZvX3Zpc2l0b3IgaW5mbyhpcl92YXJfc2hhZGVyX291dCwgdHJ1ZSk7CisgICBpbmZvLmdldChpciwgMCwgTlVMTCk7CisKKyAgIHJlcGxhY2VfdmFyeWluZ3NfdmlzaXRvcihpciwgJmluZm8sIDAsIDAsIDApOworfQorCisKK3ZvaWQKK2RvX2RlYWRfYnVpbHRpbl92YXJ5aW5ncyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdsX3NoYWRlciAqcHJvZHVjZXIsIGdsX3NoYWRlciAqY29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3RmZWVkYmFja19kZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZmVlZGJhY2tfZGVjbCAqdGZlZWRiYWNrX2RlY2xzKQoreworICAgLyogTG93ZXIgdGhlIGdsX0ZyYWdEYXRhIGFycmF5IHRvIHNlcGFyYXRlIHZhcmlhYmxlcy4gKi8KKyAgIGlmIChjb25zdW1lciAmJiBjb25zdW1lci0+U3RhZ2UgPT0gTUVTQV9TSEFERVJfRlJBR01FTlQpIHsKKyAgICAgIGxvd2VyX2ZyYWdkYXRhX2FycmF5KGNvbnN1bWVyLT5pcik7CisgICB9CisKKyAgIC8qIExvd2VyaW5nIG9mIGJ1aWx0LWluIHZhcnlpbmdzIGhhcyBubyBlZmZlY3Qgd2l0aCB0aGUgY29yZSBjb250ZXh0IGFuZAorICAgICogR0xFUzIsIGJlY2F1c2UgdGhleSBhcmUgbm90IGF2YWlsYWJsZSB0aGVyZS4KKyAgICAqLworICAgaWYgKGN0eC0+QVBJID09IEFQSV9PUEVOR0xfQ09SRSB8fAorICAgICAgIGN0eC0+QVBJID09IEFQSV9WSyB8fAorICAgICAgIGN0eC0+QVBJID09IEFQSV9PUEVOR0xFUzIpIHsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogSW5mb3JtYXRpb24gYWJvdXQgYnVpbHQtaW4gdmFyeWluZ3MuICovCisgICB2YXJ5aW5nX2luZm9fdmlzaXRvciBwcm9kdWNlcl9pbmZvKGlyX3Zhcl9zaGFkZXJfb3V0KTsKKyAgIHZhcnlpbmdfaW5mb192aXNpdG9yIGNvbnN1bWVyX2luZm8oaXJfdmFyX3NoYWRlcl9pbik7CisKKyAgIGlmIChwcm9kdWNlcikgeworICAgICAgcHJvZHVjZXJfaW5mby5nZXQocHJvZHVjZXItPmlyLCBudW1fdGZlZWRiYWNrX2RlY2xzLCB0ZmVlZGJhY2tfZGVjbHMpOworCisgICAgICBpZiAoIWNvbnN1bWVyKSB7CisgICAgICAgICAvKiBBdCBsZWFzdCBlbGltaW5hdGUgdW51c2VkIGdsX1RleENvb3JkIGVsZW1lbnRzLiAqLworICAgICAgICAgaWYgKHByb2R1Y2VyX2luZm8ubG93ZXJfdGV4Y29vcmRfYXJyYXkpIHsKKyAgICAgICAgICAgIGxvd2VyX3RleGNvb3JkX2FycmF5KHByb2R1Y2VyLT5pciwgJnByb2R1Y2VyX2luZm8pOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgfQorCisgICBpZiAoY29uc3VtZXIpIHsKKyAgICAgIGNvbnN1bWVyX2luZm8uZ2V0KGNvbnN1bWVyLT5pciwgMCwgTlVMTCk7CisKKyAgICAgIGlmICghcHJvZHVjZXIpIHsKKyAgICAgICAgIC8qIEF0IGxlYXN0IGVsaW1pbmF0ZSB1bnVzZWQgZ2xfVGV4Q29vcmQgZWxlbWVudHMuICovCisgICAgICAgICBpZiAoY29uc3VtZXJfaW5mby5sb3dlcl90ZXhjb29yZF9hcnJheSkgeworICAgICAgICAgICAgbG93ZXJfdGV4Y29vcmRfYXJyYXkoY29uc3VtZXItPmlyLCAmY29uc3VtZXJfaW5mbyk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKyAgIC8qIEVsaW1pbmF0ZSB0aGUgb3V0cHV0cyB1bnVzZWQgYnkgdGhlIGNvbnN1bWVyLiAqLworICAgaWYgKHByb2R1Y2VyX2luZm8ubG93ZXJfdGV4Y29vcmRfYXJyYXkgfHwKKyAgICAgICBwcm9kdWNlcl9pbmZvLmNvbG9yX3VzYWdlIHx8CisgICAgICAgcHJvZHVjZXJfaW5mby5oYXNfZm9nKSB7CisgICAgICByZXBsYWNlX3ZhcnlpbmdzX3Zpc2l0b3IocHJvZHVjZXItPmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9kdWNlcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2luZm8udGV4Y29vcmRfdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW5mby5jb2xvcl91c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbmZvLmhhc19mb2cpOworICAgfQorCisgICAvKiBUaGUgZ2xfVGV4Q29vcmQgZnJhZ21lbnQgc2hhZGVyIGlucHV0cyBjYW4gYmUgaW5pdGlhbGl6ZWQKKyAgICAqIGJ5IEdMX0NPT1JEX1JFUExBQ0UsIHNvIHdlIGNhbid0IGVsaW1pbmF0ZSB0aGVtLgorICAgICoKKyAgICAqIFRoaXMgZG9lc24ndCBwcmV2ZW50IGVsaW1pbmF0aW9uIG9mIHRoZSBnbF9UZXhDb29yZCBlbGVtZW50cyB3aGljaAorICAgICogYXJlIG5vdCByZWFkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXIuIFdlIHdhbnQgdG8gZWxpbWluYXRlIHRob3NlIGFueXdheS4KKyAgICAqLworICAgaWYgKGNvbnN1bWVyLT5TdGFnZSA9PSBNRVNBX1NIQURFUl9GUkFHTUVOVCkgeworICAgICAgcHJvZHVjZXJfaW5mby50ZXhjb29yZF91c2FnZSA9ICgxIDw8IE1BWF9URVhUVVJFX0NPT1JEX1VOSVRTKSAtIDE7CisgICB9CisKKyAgIC8qIEVsaW1pbmF0ZSB0aGUgaW5wdXRzIHVuaW5pdGlhbGl6ZWQgYnkgdGhlIHByb2R1Y2VyLiAqLworICAgaWYgKGNvbnN1bWVyX2luZm8ubG93ZXJfdGV4Y29vcmRfYXJyYXkgfHwKKyAgICAgICBjb25zdW1lcl9pbmZvLmNvbG9yX3VzYWdlIHx8CisgICAgICAgY29uc3VtZXJfaW5mby5oYXNfZm9nKSB7CisgICAgICByZXBsYWNlX3ZhcnlpbmdzX3Zpc2l0b3IoY29uc3VtZXItPmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25zdW1lcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyX2luZm8udGV4Y29vcmRfdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJfaW5mby5jb2xvcl91c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9pbmZvLmhhc19mb2cpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfZGVhZF9jb2RlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkZjUyZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfY29kZS5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF9kZWFkX2NvZGUuY3BwCisgKgorICogRWxpbWluYXRlcyBkZWFkIGFzc2lnbm1lbnRzIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgY29kZS4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfdmFyaWFibGVfcmVmY291bnQuaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisjaW5jbHVkZSAibWFpbi9oYXNoX3RhYmxlLmgiCisKK3N0YXRpYyBib29sIGRlYnVnID0gZmFsc2U7CisKKy8qKgorICogRG8gYSBkZWFkIGNvZGUgcGFzcyBvdmVyIGluc3RydWN0aW9ucyBhbmQgZXZlcnl0aGluZyB0aGF0IGluc3RydWN0aW9ucworICogcmVmZXJlbmNlcy4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJlbW92ZSBhc3NpZ25tZW50cyB0byBnbG9iYWxzLCBzbyBpdCBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciB1c2FnZSBvbiBhbiB1bmxpbmtlZCBpbnN0cnVjdGlvbiBzdHJlYW0uCisgKi8KK2Jvb2wKK2RvX2RlYWRfY29kZShleGVjX2xpc3QgKmluc3RydWN0aW9ucywgYm9vbCB1bmlmb3JtX2xvY2F0aW9uc19hc3NpZ25lZCkKK3sKKyAgIGlyX3ZhcmlhYmxlX3JlZmNvdW50X3Zpc2l0b3IgdjsKKyAgIGJvb2wgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgdi5ydW4oaW5zdHJ1Y3Rpb25zKTsKKworICAgc3RydWN0IGhhc2hfZW50cnkgKmU7CisgICBoYXNoX3RhYmxlX2ZvcmVhY2godi5odCwgZSkgeworICAgICAgaXJfdmFyaWFibGVfcmVmY291bnRfZW50cnkgKmVudHJ5ID0gKGlyX3ZhcmlhYmxlX3JlZmNvdW50X2VudHJ5ICopZS0+ZGF0YTsKKworICAgICAgLyogU2luY2UgZWFjaCBhc3NpZ25tZW50IGlzIGEgcmVmZXJlbmNlLCB0aGUgcmVmZXJlbmNlZCBjb3VudCBtdXN0IGJlCisgICAgICAgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFzc2lnbm1lbnQgY291bnQuICBJZiB0aGV5IGFyZSBlcXVhbCwKKyAgICAgICAqIHRoZW4gYWxsIG9mIHRoZSByZWZlcmVuY2VzIGFyZSBhc3NpZ25tZW50cywgYW5kIHRoZSB2YXJpYWJsZSBpcworICAgICAgICogZGVhZC4KKyAgICAgICAqCisgICAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIHZhcmlhYmxlIGlzIG5laXRoZXIgYXNzaWduZWQgbm9yIHJlZmVyZW5jZWQsIGJvdGgKKyAgICAgICAqIGNvdW50cyB3aWxsIGJlIHplcm8gYW5kIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBlcXVhbGl0eSB0ZXN0LgorICAgICAgICovCisgICAgICBhc3NlcnQoZW50cnktPnJlZmVyZW5jZWRfY291bnQgPj0gZW50cnktPmFzc2lnbmVkX2NvdW50KTsKKworICAgICAgaWYgKGRlYnVnKSB7CisJIHByaW50ZigiJXNAJXA6ICVkIHJlZnMsICVkIGFzc2lnbnMsICVzZGVjbGFyZWQgaW4gb3VyIHNjb3BlXG4iLAorCQllbnRyeS0+dmFyLT5uYW1lLCAodm9pZCAqKSBlbnRyeS0+dmFyLAorCQllbnRyeS0+cmVmZXJlbmNlZF9jb3VudCwgZW50cnktPmFzc2lnbmVkX2NvdW50LAorCQllbnRyeS0+ZGVjbGFyYXRpb24gPyAiIiA6ICJub3QgIik7CisgICAgICB9CisKKyAgICAgIGlmICgoZW50cnktPnJlZmVyZW5jZWRfY291bnQgPiBlbnRyeS0+YXNzaWduZWRfY291bnQpCisJICB8fCAhZW50cnktPmRlY2xhcmF0aW9uKQorCSBjb250aW51ZTsKKworICAgICAgaWYgKGVudHJ5LT5hc3NpZ24pIHsKKwkgLyogUmVtb3ZlIGEgc2luZ2xlIGRlYWQgYXNzaWdubWVudCB0byB0aGUgdmFyaWFibGUgd2UgZm91bmQuCisJICAqIERvbid0IGRvIHNvIGlmIGl0J3MgYSBzaGFkZXIgb3IgZnVuY3Rpb24gb3V0cHV0LCB0aG91Z2guCisJICAqLworCSBpZiAoZW50cnktPnZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9mdW5jdGlvbl9vdXQgJiYKKwkgICAgIGVudHJ5LT52YXItPmRhdGEubW9kZSAhPSBpcl92YXJfZnVuY3Rpb25faW5vdXQgJiYKKyAgICAgICAgICAgICBlbnRyeS0+dmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9vdXQpIHsKKwkgICAgZW50cnktPmFzc2lnbi0+cmVtb3ZlKCk7CisJICAgIHByb2dyZXNzID0gdHJ1ZTsKKworCSAgICBpZiAoZGVidWcpIHsKKwkgICAgICAgcHJpbnRmKCJSZW1vdmVkIGFzc2lnbm1lbnQgdG8gJXNAJXBcbiIsCisJCSAgICAgIGVudHJ5LT52YXItPm5hbWUsICh2b2lkICopIGVudHJ5LT52YXIpOworCSAgICB9CisJIH0KKyAgICAgIH0gZWxzZSB7CisJIC8qIElmIHRoZXJlIGFyZSBubyBhc3NpZ25tZW50cyBvciByZWZlcmVuY2VzIHRvIHRoZSB2YXJpYWJsZSBsZWZ0LAorCSAgKiB0aGVuIHdlIGNhbiByZW1vdmUgaXRzIGRlY2xhcmF0aW9uLgorCSAgKi8KKworCSAvKiB1bmlmb3JtIGluaXRpYWxpemVycyBhcmUgcHJlY2lvdXMsIGFuZCBjb3VsZCBnZXQgdXNlZCBieSBhbm90aGVyCisJICAqIHN0YWdlLiAgQWxzbywgb25jZSB1bmlmb3JtIGxvY2F0aW9ucyBoYXZlIGJlZW4gYXNzaWduZWQsIHRoZQorCSAgKiBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgZGVsZXRlZC4KKwkgICovCisJIGlmIChlbnRyeS0+dmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3VuaWZvcm0gJiYKKwkgICAgICh1bmlmb3JtX2xvY2F0aW9uc19hc3NpZ25lZCB8fAorCSAgICAgIGVudHJ5LT52YXItPmNvbnN0YW50X3ZhbHVlKSkKKwkgICAgY29udGludWU7CisKKwkgZW50cnktPnZhci0+cmVtb3ZlKCk7CisJIHByb2dyZXNzID0gdHJ1ZTsKKworCSBpZiAoZGVidWcpIHsKKwkgICAgcHJpbnRmKCJSZW1vdmVkIGRlY2xhcmF0aW9uIG9mICVzQCVwXG4iLAorCQkgICBlbnRyeS0+dmFyLT5uYW1lLCAodm9pZCAqKSBlbnRyeS0+dmFyKTsKKwkgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKKy8qKgorICogRG9lcyBhIGRlYWQgY29kZSBwYXNzIG9uIHRoZSBmdW5jdGlvbnMgcHJlc2VudCBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLgorICoKKyAqIFRoaXMgaXMgc3VpdGFibGUgZm9yIHVzZSB3aGlsZSB0aGUgcHJvZ3JhbSBpcyBub3QgbGlua2VkLCBhcyBpdCB3aWxsCisgKiBpZ25vcmUgdmFyaWFibGUgZGVjbGFyYXRpb25zIChhbmQgdGhlIGFzc2lnbm1lbnRzIHRvIHRoZW0pIGZvciB2YXJpYWJsZXMKKyAqIHdpdGggZ2xvYmFsIHNjb3BlLgorICovCitib29sCitkb19kZWFkX2NvZGVfdW5saW5rZWQoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisKKyAgIGZvcmVhY2hfbGlzdChuLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworICAgICAgaXJfZnVuY3Rpb24gKmYgPSBpci0+YXNfZnVuY3Rpb24oKTsKKyAgICAgIGlmIChmKSB7CisJIGZvcmVhY2hfbGlzdChzaWdub2RlLCAmZi0+c2lnbmF0dXJlcykgeworCSAgICBpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZyA9IChpcl9mdW5jdGlvbl9zaWduYXR1cmUgKikgc2lnbm9kZTsKKwkgICAgLyogVGhlIHNldHRpbmcgb2YgdGhlIHVuaWZvcm1fbG9jYXRpb25zX2Fzc2lnbmVkIGZsYWcgaGVyZSBpcworCSAgICAgKiBpcnJlbGV2YW50LiAgSWYgdGhlcmUgaXMgYSB1bmlmb3JtIGRlY2xhcmF0aW9uIGVuY291bnRlcmVkCisJICAgICAqIGluc2lkZSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIHNvbWV0aGluZyBoYXMgYWxyZWFkeSBnb25lCisJICAgICAqIHRlcnJpYmx5LCB0ZXJyaWJseSB3cm9uZy4KKwkgICAgICovCisJICAgIGlmIChkb19kZWFkX2NvZGUoJnNpZy0+Ym9keSwgZmFsc2UpKQorCSAgICAgICBwcm9ncmVzcyA9IHRydWU7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfZGVhZF9jb2RlX2xvY2FsLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfY29kZV9sb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3YzUyNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfY29kZV9sb2NhbC5jcHAKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF9kZWFkX2NvZGVfbG9jYWwuY3BwCisgKgorICogRWxpbWluYXRlcyBsb2NhbCBkZWFkIGFzc2lnbm1lbnRzIGZyb20gdGhlIGNvZGUuCisgKgorICogVGhpcyBvcGVyYXRlcyBvbiBiYXNpYyBibG9ja3MsIHRyYWNraW5nIGFzc2lnbm1lbnRzIGFuZCBmaW5kaW5nIGlmCisgKiB0aGV5J3JlIHVzZWQgYmVmb3JlIHRoZSB2YXJpYWJsZSBpcyBjb21wbGV0ZWx5IHJlYXNzaWduZWQuCisgKgorICogQ29tcGFyZSB0aGlzIHRvIGlyX2RlYWRfY29kZS5jcHAsIHdoaWNoIG9wZXJhdGVzIGdsb2JhbGx5IGxvb2tpbmcKKyAqIGZvciBhc3NpZ25tZW50cyB0byB2YXJpYWJsZXMgdGhhdCBhcmUgbmV2ZXIgcmVhZC4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl9iYXNpY19ibG9jay5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworc3RhdGljIGJvb2wgZGVidWcgPSBmYWxzZTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgYXNzaWdubWVudF9lbnRyeSA6IHB1YmxpYyBleGVjX25vZGUKK3sKK3B1YmxpYzoKKyAgIGFzc2lnbm1lbnRfZW50cnkoaXJfdmFyaWFibGUgKmxocywgaXJfYXNzaWdubWVudCAqaXIpCisgICB7CisgICAgICBhc3NlcnQobGhzKTsKKyAgICAgIGFzc2VydChpcik7CisgICAgICB0aGlzLT5saHMgPSBsaHM7CisgICAgICB0aGlzLT5pciA9IGlyOworICAgICAgdGhpcy0+dW51c2VkID0gaXItPndyaXRlX21hc2s7CisgICB9CisKKyAgIGlyX3ZhcmlhYmxlICpsaHM7CisgICBpcl9hc3NpZ25tZW50ICppcjsKKworICAgLyogYml0bWFzayBvZiB4eXp3IGNoYW5uZWxzIHdyaXR0ZW4gdGhhdCBoYXZlbid0IGJlZW4gdXNlZCBzbyBmYXIuICovCisgICBpbnQgdW51c2VkOworfTsKKworY2xhc3Mga2lsbF9mb3JfZGVyZWZzX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAga2lsbF9mb3JfZGVyZWZzX3Zpc2l0b3IoZXhlY19saXN0ICphc3NpZ25tZW50cykKKyAgIHsKKyAgICAgIHRoaXMtPmFzc2lnbm1lbnRzID0gYXNzaWdubWVudHM7CisgICB9CisKKyAgIHZvaWQgdXNlX2NoYW5uZWxzKGlyX3ZhcmlhYmxlICpjb25zdCB2YXIsIGludCB1c2VkKQorICAgeworICAgICAgZm9yZWFjaF9saXN0X3NhZmUobiwgdGhpcy0+YXNzaWdubWVudHMpIHsKKwkgYXNzaWdubWVudF9lbnRyeSAqZW50cnkgPSAoYXNzaWdubWVudF9lbnRyeSAqKSBuOworCisJIGlmIChlbnRyeS0+bGhzID09IHZhcikgeworCSAgICBpZiAodmFyLT50eXBlLT5pc19zY2FsYXIoKSB8fCB2YXItPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisJICAgICAgIGlmIChkZWJ1ZykKKwkJICBwcmludGYoInVzZWQgJXMgKDB4JTAxeCAtIDB4JTAxeClcbiIsIGVudHJ5LT5saHMtPm5hbWUsCisJCQkgZW50cnktPnVudXNlZCwgdXNlZCAmIDB4Zik7CisJICAgICAgIGVudHJ5LT51bnVzZWQgJj0gfnVzZWQ7CisJICAgICAgIGlmICghZW50cnktPnVudXNlZCkKKwkJICBlbnRyeS0+cmVtb3ZlKCk7CisJICAgIH0gZWxzZSB7CisJICAgICAgIGlmIChkZWJ1ZykKKwkJICBwcmludGYoInVzZWQgJXNcbiIsIGVudHJ5LT5saHMtPm5hbWUpOworCSAgICAgICBlbnRyeS0+cmVtb3ZlKCk7CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0KGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICppcikKKyAgIHsKKyAgICAgIHVzZV9jaGFubmVscyhpci0+dmFyLCB+MCk7CisKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl9zd2l6emxlICppcikKKyAgIHsKKyAgICAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpkZXJlZiA9IGlyLT52YWwtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICAgICBpZiAoIWRlcmVmKQorCSByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgICAgIGludCB1c2VkID0gMDsKKyAgICAgIHVzZWQgfD0gMSA8PCBpci0+bWFzay54OworICAgICAgdXNlZCB8PSAxIDw8IGlyLT5tYXNrLnk7CisgICAgICB1c2VkIHw9IDEgPDwgaXItPm1hc2suejsKKyAgICAgIHVzZWQgfD0gMSA8PCBpci0+bWFzay53OworCisgICAgICB1c2VfY2hhbm5lbHMoZGVyZWYtPnZhciwgdXNlZCk7CisKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl9lbWl0X3ZlcnRleCAqKQorICAgeworICAgICAgLyogRm9yIHRoZSBwdXJwb3NlIG9mIGRlYWQgY29kZSBlbGltaW5hdGlvbiwgZW1pdHRpbmcgYSB2ZXJ0ZXggY291bnRzIGFzCisgICAgICAgKiAicmVhZGluZyIgYWxsIG9mIHRoZSBjdXJyZW50bHkgYXNzaWduZWQgb3V0cHV0IHZhcmlhYmxlcy4KKyAgICAgICAqLworICAgICAgZm9yZWFjaF9saXN0X3NhZmUobiwgdGhpcy0+YXNzaWdubWVudHMpIHsKKyAgICAgICAgIGFzc2lnbm1lbnRfZW50cnkgKmVudHJ5ID0gKGFzc2lnbm1lbnRfZW50cnkgKikgbjsKKyAgICAgICAgIGlmIChlbnRyeS0+bGhzLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9vdXQpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgICAgIHByaW50Zigia2lsbCAlc1xuIiwgZW50cnktPmxocy0+bmFtZSk7CisgICAgICAgICAgICBlbnRyeS0+cmVtb3ZlKCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworcHJpdmF0ZToKKyAgIGV4ZWNfbGlzdCAqYXNzaWdubWVudHM7Cit9OworCitjbGFzcyBhcnJheV9pbmRleF92aXNpdCA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBhcnJheV9pbmRleF92aXNpdChpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqdikKKyAgIHsKKyAgICAgIHRoaXMtPnZpc2l0b3IgPSB2OworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKKyAgIHsKKyAgICAgIGlyLT5hcnJheV9pbmRleC0+YWNjZXB0KHZpc2l0b3IpOworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworICAgfQorCisgICBzdGF0aWMgdm9pZCBydW4oaXJfaW5zdHJ1Y3Rpb24gKmlyLCBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqdikKKyAgIHsKKyAgICAgIGFycmF5X2luZGV4X3Zpc2l0IHRvcF92aXNpdCh2KTsKKyAgICAgIGlyLT5hY2NlcHQoJiB0b3BfdmlzaXQpOworICAgfQorCisgICBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciAqdmlzaXRvcjsKK307CisKK30gLyogdW5uYW1lZCBuYW1lc3BhY2UgKi8KKworLyoqCisgKiBBZGRzIGFuIGVudHJ5IHRvIHRoZSBhdmFpbGFibGUgY29weSBsaXN0IGlmIGl0J3MgYSBwbGFpbiBhc3NpZ25tZW50CisgKiBvZiBhIHZhcmlhYmxlIHRvIGEgdmFyaWFibGUuCisgKi8KK3N0YXRpYyBib29sCitwcm9jZXNzX2Fzc2lnbm1lbnQodm9pZCAqY3R4LCBpcl9hc3NpZ25tZW50ICppciwgZXhlY19saXN0ICphc3NpZ25tZW50cykKK3sKKyAgIGlyX3ZhcmlhYmxlICp2YXIgPSBOVUxMOworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworICAga2lsbF9mb3JfZGVyZWZzX3Zpc2l0b3Igdihhc3NpZ25tZW50cyk7CisKKyAgIC8qIEtpbGwgYXNzaWdubWVudCBlbnRyaWVzIGZvciB0aGluZ3MgdXNlZCB0byBwcm9kdWNlIHRoaXMgYXNzaWdubWVudC4gKi8KKyAgIGlyLT5yaHMtPmFjY2VwdCgmdik7CisgICBpZiAoaXItPmNvbmRpdGlvbikgeworICAgICAgaXItPmNvbmRpdGlvbi0+YWNjZXB0KCZ2KTsKKyAgIH0KKworICAgLyogS2lsbCBhc3NpZ25tZW50IGVudGllcyB1c2VkIGFzIGFycmF5IGluZGljZXMuCisgICAgKi8KKyAgIGFycmF5X2luZGV4X3Zpc2l0OjpydW4oaXItPmxocywgJnYpOworICAgdmFyID0gaXItPmxocy0+dmFyaWFibGVfcmVmZXJlbmNlZCgpOworICAgYXNzZXJ0KHZhcik7CisKKyAgIC8qIE5vdywgY2hlY2sgaWYgd2UgZGlkIGEgd2hvbGUtdmFyaWFibGUgYXNzaWdubWVudC4gKi8KKyAgIGlmICghaXItPmNvbmRpdGlvbikgeworICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmX3ZhciA9IGlyLT5saHMtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisKKyAgICAgIC8qIElmIGl0J3MgYSB2ZWN0b3IgdHlwZSwgd2UgY2FuIGRvIHBlci1jaGFubmVsIGVsaW1pbmF0aW9uIG9mCisgICAgICAgKiB1c2Ugb2YgdGhlIFJIUy4KKyAgICAgICAqLworICAgICAgaWYgKGRlcmVmX3ZhciAmJiAoZGVyZWZfdmFyLT52YXItPnR5cGUtPmlzX3NjYWxhcigpIHx8CisJCQlkZXJlZl92YXItPnZhci0+dHlwZS0+aXNfdmVjdG9yKCkpKSB7CisKKwkgaWYgKGRlYnVnKQorCSAgICBwcmludGYoImxvb2tpbmcgZm9yICVzLjB4JTAxeCB0byByZW1vdmVcbiIsIHZhci0+bmFtZSwKKwkJICAgaXItPndyaXRlX21hc2spOworCisJIGZvcmVhY2hfbGlzdF9zYWZlKG4sIGFzc2lnbm1lbnRzKSB7CisJICAgIGFzc2lnbm1lbnRfZW50cnkgKmVudHJ5ID0gKGFzc2lnbm1lbnRfZW50cnkgKikgbjsKKworCSAgICBpZiAoZW50cnktPmxocyAhPSB2YXIpCisJICAgICAgIGNvbnRpbnVlOworCisJICAgIGludCByZW1vdmUgPSBlbnRyeS0+dW51c2VkICYgaXItPndyaXRlX21hc2s7CisJICAgIGlmIChkZWJ1ZykgeworCSAgICAgICBwcmludGYoIiVzIDB4JTAxeCAtIDB4JTAxeCA9IDB4JTAxeFxuIiwKKwkJICAgICAgdmFyLT5uYW1lLAorCQkgICAgICBlbnRyeS0+aXItPndyaXRlX21hc2ssCisJCSAgICAgIHJlbW92ZSwgZW50cnktPmlyLT53cml0ZV9tYXNrICYgfnJlbW92ZSk7CisJICAgIH0KKwkgICAgaWYgKHJlbW92ZSkgeworCSAgICAgICBwcm9ncmVzcyA9IHRydWU7CisKKwkgICAgICAgaWYgKGRlYnVnKSB7CisJCSAgcHJpbnRmKCJyZXdyaXRpbmc6XG4gICIpOworCQkgIGVudHJ5LT5pci0+cHJpbnQoKTsKKwkJICBwcmludGYoIlxuIik7CisJICAgICAgIH0KKworCSAgICAgICBlbnRyeS0+aXItPndyaXRlX21hc2sgJj0gfnJlbW92ZTsKKwkgICAgICAgZW50cnktPnVudXNlZCAmPSB+cmVtb3ZlOworCSAgICAgICBpZiAoZW50cnktPmlyLT53cml0ZV9tYXNrID09IDApIHsKKwkJICAvKiBEZWxldGUgdGhlIGRlYWQgYXNzaWdubWVudC4gKi8KKwkJICBlbnRyeS0+aXItPnJlbW92ZSgpOworCQkgIGVudHJ5LT5yZW1vdmUoKTsKKwkgICAgICAgfSBlbHNlIHsKKwkJICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX3BhcmVudChlbnRyeS0+aXIpOworCQkgIC8qIFJlc3dpenpsZSB0aGUgUkhTIGFyZ3VtZW50cyBhY2NvcmRpbmcgdG8gdGhlIG5ldworCQkgICAqIHdyaXRlX21hc2suCisJCSAgICovCisJCSAgdW5zaWduZWQgY29tcG9uZW50c1s0XTsKKwkJICB1bnNpZ25lZCBjaGFubmVscyA9IDA7CisJCSAgdW5zaWduZWQgbmV4dCA9IDA7CisKKwkJICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCQkgICAgIGlmICgoZW50cnktPmlyLT53cml0ZV9tYXNrIHwgcmVtb3ZlKSAmICgxIDw8IGkpKSB7CisJCQlpZiAoIShyZW1vdmUgJiAoMSA8PCBpKSkpCisJCQkgICBjb21wb25lbnRzW2NoYW5uZWxzKytdID0gbmV4dDsKKwkJCW5leHQrKzsKKwkJICAgICB9CisJCSAgfQorCisJCSAgZW50cnktPmlyLT5yaHMgPSBuZXcobWVtX2N0eCkgaXJfc3dpenpsZShlbnRyeS0+aXItPnJocywKKwkJCQkJCQkgICBjb21wb25lbnRzLAorCQkJCQkJCSAgIGNoYW5uZWxzKTsKKwkJICBpZiAoZGVidWcpIHsKKwkJICAgICBwcmludGYoInRvOlxuICAiKTsKKwkJICAgICBlbnRyeS0+aXItPnByaW50KCk7CisJCSAgICAgcHJpbnRmKCJcbiIpOworCQkgIH0KKwkgICAgICAgfQorCSAgICB9CisJIH0KKyAgICAgIH0gZWxzZSBpZiAoaXItPndob2xlX3ZhcmlhYmxlX3dyaXR0ZW4oKSAhPSBOVUxMKSB7CisJIC8qIFdlIGRpZCBhIHdob2xlLXZhcmlhYmxlIGFzc2lnbm1lbnQuICBTbywgYW55IGluc3RydWN0aW9uIGluCisJICAqIHRoZSBhc3NpZ25tZW50IGxpc3Qgd2l0aCB0aGUgc2FtZSBMSFMgaXMgZGVhZC4KKwkgICovCisJIGlmIChkZWJ1ZykKKwkgICAgcHJpbnRmKCJsb29raW5nIGZvciAlcyB0byByZW1vdmVcbiIsIHZhci0+bmFtZSk7CisJIGZvcmVhY2hfbGlzdF9zYWZlKG4sIGFzc2lnbm1lbnRzKSB7CisJICAgIGFzc2lnbm1lbnRfZW50cnkgKmVudHJ5ID0gKGFzc2lnbm1lbnRfZW50cnkgKikgbjsKKworCSAgICBpZiAoZW50cnktPmxocyA9PSB2YXIpIHsKKwkgICAgICAgaWYgKGRlYnVnKQorCQkgIHByaW50ZigicmVtb3ZpbmcgJXNcbiIsIHZhci0+bmFtZSk7CisJICAgICAgIGVudHJ5LT5pci0+cmVtb3ZlKCk7CisJICAgICAgIGVudHJ5LT5yZW1vdmUoKTsKKwkgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworCSAgICB9CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogQWRkIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gdGhlIGFzc2lnbm1lbnQgbGlzdCBhdmFpbGFibGUgdG8gYmUgcmVtb3ZlZC4gKi8KKyAgIGFzc2lnbm1lbnRfZW50cnkgKmVudHJ5ID0gbmV3KGN0eCkgYXNzaWdubWVudF9lbnRyeSh2YXIsIGlyKTsKKyAgIGFzc2lnbm1lbnRzLT5wdXNoX3RhaWwoZW50cnkpOworCisgICBpZiAoZGVidWcpIHsKKyAgICAgIHByaW50ZigiYWRkICVzXG4iLCB2YXItPm5hbWUpOworCisgICAgICBwcmludGYoImN1cnJlbnQgZW50cmllc1xuIik7CisgICAgICBmb3JlYWNoX2xpc3QobiwgYXNzaWdubWVudHMpIHsKKwkgYXNzaWdubWVudF9lbnRyeSAqZW50cnkgPSAoYXNzaWdubWVudF9lbnRyeSAqKSBuOworCisJIHByaW50ZigiICAgICVzICgweCUwMXgpXG4iLCBlbnRyeS0+bGhzLT5uYW1lLCBlbnRyeS0+dW51c2VkKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHByb2dyZXNzOworfQorCitzdGF0aWMgdm9pZAorZGVhZF9jb2RlX2xvY2FsX2Jhc2ljX2Jsb2NrKGlyX2luc3RydWN0aW9uICpmaXJzdCwKKwkJCSAgICAgaXJfaW5zdHJ1Y3Rpb24gKmxhc3QsCisJCQkgICAgIHZvaWQgKmRhdGEpCit7CisgICBpcl9pbnN0cnVjdGlvbiAqaXIsICppcl9uZXh0OworICAgLyogTGlzdCBvZiBhdmFpYWxibGVfY29weSAqLworICAgZXhlY19saXN0IGFzc2lnbm1lbnRzOworICAgYm9vbCAqb3V0X3Byb2dyZXNzID0gKGJvb2wgKilkYXRhOworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworCisgICB2b2lkICpjdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgIC8qIFNhZmUgbG9vcGluZywgc2luY2UgcHJvY2Vzc19hc3NpZ25tZW50ICovCisgICBmb3IgKGlyID0gZmlyc3QsIGlyX25leHQgPSAoaXJfaW5zdHJ1Y3Rpb24gKilmaXJzdC0+bmV4dDs7CisJaXIgPSBpcl9uZXh0LCBpcl9uZXh0ID0gKGlyX2luc3RydWN0aW9uICopaXItPm5leHQpIHsKKyAgICAgIGlyX2Fzc2lnbm1lbnQgKmlyX2Fzc2lnbiA9IGlyLT5hc19hc3NpZ25tZW50KCk7CisKKyAgICAgIGlmIChkZWJ1ZykgeworCSBpci0+cHJpbnQoKTsKKwkgcHJpbnRmKCJcbiIpOworICAgICAgfQorCisgICAgICBpZiAoaXJfYXNzaWduKSB7CisJIHByb2dyZXNzID0gcHJvY2Vzc19hc3NpZ25tZW50KGN0eCwgaXJfYXNzaWduLCAmYXNzaWdubWVudHMpIHx8IHByb2dyZXNzOworICAgICAgfSBlbHNlIHsKKwkga2lsbF9mb3JfZGVyZWZzX3Zpc2l0b3Iga2lsbCgmYXNzaWdubWVudHMpOworCSBpci0+YWNjZXB0KCZraWxsKTsKKyAgICAgIH0KKworICAgICAgaWYgKGlyID09IGxhc3QpCisJIGJyZWFrOworICAgfQorICAgKm91dF9wcm9ncmVzcyA9IHByb2dyZXNzOworICAgcmFsbG9jX2ZyZWUoY3R4KTsKK30KKworLyoqCisgKiBEb2VzIGEgY29weSBwcm9wYWdhdGlvbiBwYXNzIG9uIHRoZSBjb2RlIHByZXNlbnQgaW4gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4KKyAqLworYm9vbAorZG9fZGVhZF9jb2RlX2xvY2FsKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworCisgICBjYWxsX2Zvcl9iYXNpY19ibG9ja3MoaW5zdHJ1Y3Rpb25zLCBkZWFkX2NvZGVfbG9jYWxfYmFzaWNfYmxvY2ssICZwcm9ncmVzcyk7CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfZnVuY3Rpb25zLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2RlYWRfZnVuY3Rpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmIyNzhlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfZGVhZF9mdW5jdGlvbnMuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfZGVhZF9mdW5jdGlvbnMuY3BwCisgKgorICogRWxpbWluYXRlcyB1bnVzZWQgZnVuY3Rpb25zIGZyb20gdGhlIGxpbmtlZCBwcm9ncmFtLgorICovCisKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJpcl9leHByZXNzaW9uX2ZsYXR0ZW5pbmcuaCIKKyNpbmNsdWRlICJnbHNsX3R5cGVzLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIHNpZ25hdHVyZV9lbnRyeSA6IHB1YmxpYyBleGVjX25vZGUKK3sKK3B1YmxpYzoKKyAgIHNpZ25hdHVyZV9lbnRyeShpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZykKKyAgIHsKKyAgICAgIHRoaXMtPnNpZ25hdHVyZSA9IHNpZzsKKyAgICAgIHRoaXMtPnVzZWQgPSBmYWxzZTsKKyAgIH0KKworICAgaXJfZnVuY3Rpb25fc2lnbmF0dXJlICpzaWduYXR1cmU7CisgICBib29sIHVzZWQ7Cit9OworCitjbGFzcyBpcl9kZWFkX2Z1bmN0aW9uc192aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX2RlYWRfZnVuY3Rpb25zX3Zpc2l0b3IoKQorICAgeworICAgICAgdGhpcy0+bWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworICAgfQorCisgICB+aXJfZGVhZF9mdW5jdGlvbnNfdmlzaXRvcigpCisgICB7CisgICAgICByYWxsb2NfZnJlZSh0aGlzLT5tZW1fY3R4KTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2NhbGwgKik7CisKKyAgIHNpZ25hdHVyZV9lbnRyeSAqZ2V0X3NpZ25hdHVyZV9lbnRyeShpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnZhcik7CisKKyAgIC8qIExpc3Qgb2Ygc2lnbmF0dXJlX2VudHJ5ICovCisgICBleGVjX2xpc3Qgc2lnbmF0dXJlX2xpc3Q7CisgICB2b2lkICptZW1fY3R4OworfTsKKworfSAvKiB1bm5hbWVkIG5hbWVzcGFjZSAqLworCitzaWduYXR1cmVfZW50cnkgKgoraXJfZGVhZF9mdW5jdGlvbnNfdmlzaXRvcjo6Z2V0X3NpZ25hdHVyZV9lbnRyeShpcl9mdW5jdGlvbl9zaWduYXR1cmUgKnNpZykKK3sKKyAgIGZvcmVhY2hfbGlzdChuLCAmdGhpcy0+c2lnbmF0dXJlX2xpc3QpIHsKKyAgICAgIHNpZ25hdHVyZV9lbnRyeSAqZW50cnkgPSAoc2lnbmF0dXJlX2VudHJ5ICopIG47CisgICAgICBpZiAoZW50cnktPnNpZ25hdHVyZSA9PSBzaWcpCisJIHJldHVybiBlbnRyeTsKKyAgIH0KKworICAgc2lnbmF0dXJlX2VudHJ5ICplbnRyeSA9IG5ldyhtZW1fY3R4KSBzaWduYXR1cmVfZW50cnkoc2lnKTsKKyAgIHRoaXMtPnNpZ25hdHVyZV9saXN0LnB1c2hfdGFpbChlbnRyeSk7CisgICByZXR1cm4gZW50cnk7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2RlYWRfZnVuY3Rpb25zX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqaXIpCit7CisgICBzaWduYXR1cmVfZW50cnkgKmVudHJ5ID0gdGhpcy0+Z2V0X3NpZ25hdHVyZV9lbnRyeShpcik7CisKKyAgIGlmIChzdHJjbXAoaXItPmZ1bmN0aW9uX25hbWUoKSwgIm1haW4iKSA9PSAwKSB7CisgICAgICBlbnRyeS0+dXNlZCA9IHRydWU7CisgICB9CisKKworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2RlYWRfZnVuY3Rpb25zX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKQoreworICAgc2lnbmF0dXJlX2VudHJ5ICplbnRyeSA9IHRoaXMtPmdldF9zaWduYXR1cmVfZW50cnkoaXItPmNhbGxlZSk7CisKKyAgIGVudHJ5LT51c2VkID0gdHJ1ZTsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitib29sCitkb19kZWFkX2Z1bmN0aW9ucyhleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX2RlYWRfZnVuY3Rpb25zX3Zpc2l0b3IgdjsKKyAgIGJvb2wgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgdmlzaXRfbGlzdF9lbGVtZW50cygmdiwgaW5zdHJ1Y3Rpb25zKTsKKworICAgLyogTm93IHRoYXQgd2UndmUgZmlndXJlZCBvdXQgd2hpY2ggZnVuY3Rpb24gc2lnbmF0dXJlcyBhcmUgdXNlZCwgcmVtb3ZlCisgICAgKiB0aGUgdW51c2VkIG9uZXMsIGFuZCByZW1vdmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdGhhdCBoYXZlIG5vIG1vcmUKKyAgICAqIHNpZ25hdHVyZXMuCisgICAgKi8KKyAgICBmb3JlYWNoX2xpc3Rfc2FmZShuLCAmdi5zaWduYXR1cmVfbGlzdCkgeworICAgICAgc2lnbmF0dXJlX2VudHJ5ICplbnRyeSA9IChzaWduYXR1cmVfZW50cnkgKikgbjsKKworICAgICAgaWYgKCFlbnRyeS0+dXNlZCkgeworCSBlbnRyeS0+c2lnbmF0dXJlLT5yZW1vdmUoKTsKKwkgZGVsZXRlIGVudHJ5LT5zaWduYXR1cmU7CisJIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZShlbnRyeSk7CisgICB9CisKKyAgIC8qIFdlIGRvbid0IGp1c3QgZG8gdGhpcyBhYm92ZSB3aGVuIHdlIG51a2VkIGEgc2lnbmF0dXJlIGJlY2F1c2Ugb2YKKyAgICAqIGNvbnN0IHBvaW50ZXJzLgorICAgICovCisgICBmb3JlYWNoX2xpc3Rfc2FmZShuLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworICAgICAgaXJfZnVuY3Rpb24gKmZ1bmMgPSBpci0+YXNfZnVuY3Rpb24oKTsKKworICAgICAgaWYgKGZ1bmMgJiYgZnVuYy0+c2lnbmF0dXJlcy5pc19lbXB0eSgpKSB7CisJIC8qIEF0IHRoaXMgcG9pbnQgKHBvc3QtbGlua2luZyksIHRoZSBzeW1ib2wgdGFibGUgaXMgbm8KKwkgICogbG9uZ2VyIGluIHVzZSwgc28gbm90IHJlbW92aW5nIHRoZSBmdW5jdGlvbiBmcm9tIHRoZQorCSAgKiBzeW1ib2wgdGFibGUgc2hvdWxkIGJlIE9LLgorCSAgKi8KKwkgZnVuYy0+cmVtb3ZlKCk7CisJIGRlbGV0ZSBmdW5jOworCSBwcm9ncmVzcyA9IHRydWU7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2ZsYXR0ZW5fbmVzdGVkX2lmX2Jsb2Nrcy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9mbGF0dGVuX25lc3RlZF9pZl9ibG9ja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDIxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9mbGF0dGVuX25lc3RlZF9pZl9ibG9ja3MuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfZmxhdHRlbl9uZXN0ZWRfaWZfYmxvY2tzLmNwcAorICoKKyAqIEZsYXR0ZW5zIG5lc3RlZCBpZiBibG9ja3Mgc3VjaCBhczoKKyAqCisgKiBpZiAoeCkgeworICogICAgaWYgKHkpIHsKKyAqICAgICAgIC4uLgorICogICAgfQorICogfQorICoKKyAqIGludG8gYSBzaW5nbGUgaWYgYmxvY2sgd2l0aCBhIGNvbWJpbmVkIGNvbmRpdGlvbjoKKyAqCisgKiBpZiAoeCAmJiB5KSB7CisgKiAgICAuLi4KKyAqIH0KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl9idWlsZGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBpcl9idWlsZGVyOworCituYW1lc3BhY2UgeworCitjbGFzcyBuZXN0ZWRfaWZfZmxhdHRlbmVyIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIG5lc3RlZF9pZl9mbGF0dGVuZXIoKQorICAgeworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfaWYgKik7CisgICBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICopOworCisgICBib29sIHByb2dyZXNzOworfTsKKworfSAvKiB1bm5hbWVkIG5hbWVzcGFjZSAqLworCisvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHRvcCBsZXZlbCAiaWYiIGluc3RydWN0aW9ucywgc28gZG9uJ3QKKyAqIGRlc2NlbmQgaW50byBleHByZXNzaW9ucy4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK25lc3RlZF9pZl9mbGF0dGVuZXI6OnZpc2l0X2VudGVyKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitib29sCitvcHRfZmxhdHRlbl9uZXN0ZWRfaWZfYmxvY2tzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgbmVzdGVkX2lmX2ZsYXR0ZW5lciB2OworCisgICB2LnJ1bihpbnN0cnVjdGlvbnMpOworICAgcmV0dXJuIHYucHJvZ3Jlc3M7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK25lc3RlZF9pZl9mbGF0dGVuZXI6OnZpc2l0X2xlYXZlKGlyX2lmICppcikKK3sKKyAgIC8qIE9ubHkgaGFuZGxlIGEgc2luZ2xlIGlyX2lmIHdpdGhpbiB0aGUgdGhlbiBjbGF1c2Ugb2YgYW4gaXJfaWYuICBObyBleHRyYQorICAgICogaW5zdHJ1Y3Rpb25zLCBubyBlbHNlIGNsYXVzZXMsIG5vdGhpbmcuCisgICAgKi8KKyAgIGlmIChpci0+dGhlbl9pbnN0cnVjdGlvbnMuaXNfZW1wdHkoKSB8fCAhaXItPmVsc2VfaW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGlyX2lmICppbm5lciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgaXItPnRoZW5faW5zdHJ1Y3Rpb25zLmhlYWQpLT5hc19pZigpOworICAgaWYgKCFpbm5lciB8fCAhaW5uZXItPm5leHQtPmlzX3RhaWxfc2VudGluZWwoKSB8fAorICAgICAgICFpbm5lci0+ZWxzZV9pbnN0cnVjdGlvbnMuaXNfZW1wdHkoKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaXItPmNvbmRpdGlvbiA9IGxvZ2ljX2FuZChpci0+Y29uZGl0aW9uLCBpbm5lci0+Y29uZGl0aW9uKTsKKyAgIGlubmVyLT50aGVuX2luc3RydWN0aW9ucy5tb3ZlX25vZGVzX3RvKCZpci0+dGhlbl9pbnN0cnVjdGlvbnMpOworCisgICBwcm9ncmVzcyA9IHRydWU7CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9mbGlwX21hdHJpY2VzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2ZsaXBfbWF0cmljZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDRmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9mbGlwX21hdHJpY2VzLmNwcApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgb3B0X2ZsaXBfbWF0cmljZXMuY3BwCisgKgorICogQ29udmVydCAobWF0cml4ICogdmVjdG9yKSBvcGVyYXRpb25zIHRvICh2ZWN0b3IgKiBtYXRyaXhUcmFuc3Bvc2UpLAorICogd2hpY2ggY2FuIGJlIGRvbmUgdXNpbmcgZG90IHByb2R1Y3RzIHJhdGhlciB0aGFuIG11bHRpcGxpZXMgYW5kIGFkZHMuCisgKiBPbiBzb21lIGhhcmR3YXJlLCB0aGlzIGlzIG1vcmUgZWZmaWNpZW50LgorICoKKyAqIFRoaXMgY3VycmVudGx5IG9ubHkgZG9lcyB0aGUgY29udmVyc2lvbiBmb3IgYnVpbHQtaW4gbWF0cmljZXMgd2hpY2gKKyAqIGFscmVhZHkgaGF2ZSB0cmFuc3Bvc2VkIGVxdWl2YWxlbnRzLiAgTmFtZWx5LCBnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4CisgKiBhbmQgZ2xfVGV4dHVyZU1hdHJpeC4KKyAqLworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKworbmFtZXNwYWNlIHsKK2NsYXNzIG1hdHJpeF9mbGlwcGVyIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIG1hdHJpeF9mbGlwcGVyKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQorICAgeworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIG12cF90cmFuc3Bvc2UgPSBOVUxMOworICAgICAgdGV4bWF0X3RyYW5zcG9zZSA9IE5VTEw7CisKKyAgICAgIGZvcmVhY2hfbGlzdChuLCBpbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgIGlyX2luc3RydWN0aW9uICppciA9IChpcl9pbnN0cnVjdGlvbiAqKSBuOworICAgICAgICAgaXJfdmFyaWFibGUgKnZhciA9IGlyLT5hc192YXJpYWJsZSgpOworICAgICAgICAgaWYgKCF2YXIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIGlmIChzdHJjbXAodmFyLT5uYW1lLCAiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeFRyYW5zcG9zZSIpID09IDApCisgICAgICAgICAgICBtdnBfdHJhbnNwb3NlID0gdmFyOworICAgICAgICAgaWYgKHN0cmNtcCh2YXItPm5hbWUsICJnbF9UZXh0dXJlTWF0cml4VHJhbnNwb3NlIikgPT0gMCkKKyAgICAgICAgICAgIHRleG1hdF90cmFuc3Bvc2UgPSB2YXI7CisgICAgICB9CisgICB9CisKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2V4cHJlc3Npb24gKmlyKTsKKworICAgYm9vbCBwcm9ncmVzczsKKworcHJpdmF0ZToKKyAgIGlyX3ZhcmlhYmxlICptdnBfdHJhbnNwb3NlOworICAgaXJfdmFyaWFibGUgKnRleG1hdF90cmFuc3Bvc2U7Cit9OworfQorCitpcl92aXNpdG9yX3N0YXR1cworbWF0cml4X2ZsaXBwZXI6OnZpc2l0X2VudGVyKGlyX2V4cHJlc3Npb24gKmlyKQoreworICAgaWYgKGlyLT5vcGVyYXRpb24gIT0gaXJfYmlub3BfbXVsIHx8CisgICAgICAgIWlyLT5vcGVyYW5kc1swXS0+dHlwZS0+aXNfbWF0cml4KCkgfHwKKyAgICAgICAhaXItPm9wZXJhbmRzWzFdLT50eXBlLT5pc192ZWN0b3IoKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaXJfdmFyaWFibGUgKm1hdF92YXIgPSBpci0+b3BlcmFuZHNbMF0tPnZhcmlhYmxlX3JlZmVyZW5jZWQoKTsKKyAgIGlmICghbWF0X3ZhcikKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaWYgKG12cF90cmFuc3Bvc2UgJiYKKyAgICAgICBzdHJjbXAobWF0X3Zhci0+bmFtZSwgImdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgiKSA9PSAwKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmID0gaXItPm9wZXJhbmRzWzBdLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgICAgYXNzZXJ0KGRlcmVmICYmIGRlcmVmLT52YXIgPT0gbWF0X3Zhcik7CisjZW5kaWYKKworICAgICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoaXIpOworCisgICAgICBpci0+b3BlcmFuZHNbMF0gPSBpci0+b3BlcmFuZHNbMV07CisgICAgICBpci0+b3BlcmFuZHNbMV0gPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUobXZwX3RyYW5zcG9zZSk7CisKKyAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgIH0gZWxzZSBpZiAodGV4bWF0X3RyYW5zcG9zZSAmJgorICAgICAgICAgICAgICBzdHJjbXAobWF0X3Zhci0+bmFtZSwgImdsX1RleHR1cmVNYXRyaXgiKSA9PSAwKSB7CisgICAgICBpcl9kZXJlZmVyZW5jZV9hcnJheSAqYXJyYXlfcmVmID0gaXItPm9wZXJhbmRzWzBdLT5hc19kZXJlZmVyZW5jZV9hcnJheSgpOworICAgICAgYXNzZXJ0KGFycmF5X3JlZiAhPSBOVUxMKTsKKyAgICAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICp2YXJfcmVmID0gYXJyYXlfcmVmLT5hcnJheS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKyAgICAgIGFzc2VydCh2YXJfcmVmICYmIHZhcl9yZWYtPnZhciA9PSBtYXRfdmFyKTsKKworICAgICAgaXItPm9wZXJhbmRzWzBdID0gaXItPm9wZXJhbmRzWzFdOworICAgICAgaXItPm9wZXJhbmRzWzFdID0gYXJyYXlfcmVmOworCisgICAgICB2YXJfcmVmLT52YXIgPSB0ZXhtYXRfdHJhbnNwb3NlOworCisgICAgICB0ZXhtYXRfdHJhbnNwb3NlLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MgPQorICAgICAgICAgTUFYMih0ZXhtYXRfdHJhbnNwb3NlLT5kYXRhLm1heF9hcnJheV9hY2Nlc3MsIG1hdF92YXItPmRhdGEubWF4X2FycmF5X2FjY2Vzcyk7CisKKyAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgIH0KKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitib29sCitvcHRfZmxpcF9tYXRyaWNlcyhzdHJ1Y3QgZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBtYXRyaXhfZmxpcHBlciB2KGluc3RydWN0aW9ucyk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7CisKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfZnVuY3Rpb25faW5saW5pbmcuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfZnVuY3Rpb25faW5saW5pbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDIwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9mdW5jdGlvbl9pbmxpbmluZy5jcHAKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF9mdW5jdGlvbl9pbmxpbmluZy5jcHAKKyAqCisgKiBSZXBsYWNlcyBjYWxscyB0byBmdW5jdGlvbnMgd2l0aCB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24uCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX2Z1bmN0aW9uX2lubGluaW5nLmgiCisjaW5jbHVkZSAiaXJfZXhwcmVzc2lvbl9mbGF0dGVuaW5nLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgInByb2dyYW0vaGFzaF90YWJsZS5oIgorCitzdGF0aWMgdm9pZAorZG9fdmFyaWFibGVfcmVwbGFjZW1lbnQoZXhlY19saXN0ICppbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJpYWJsZSAqb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlyX2RlcmVmZXJlbmNlICpyZXBsKTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgaXJfZnVuY3Rpb25faW5saW5pbmdfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9mdW5jdGlvbl9pbmxpbmluZ192aXNpdG9yKCkKKyAgIHsKKyAgICAgIHByb2dyZXNzID0gZmFsc2U7CisgICB9CisKKyAgIHZpcnR1YWwgfmlyX2Z1bmN0aW9uX2lubGluaW5nX3Zpc2l0b3IoKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9leHByZXNzaW9uICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9jYWxsICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9yZXR1cm4gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX3RleHR1cmUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX3N3aXp6bGUgKik7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKK2Jvb2wKK2RvX2Z1bmN0aW9uX2lubGluaW5nKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaXJfZnVuY3Rpb25faW5saW5pbmdfdmlzaXRvciB2OworCisgICB2LnJ1bihpbnN0cnVjdGlvbnMpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KKworc3RhdGljIHZvaWQKK3JlcGxhY2VfcmV0dXJuX3dpdGhfYXNzaWdubWVudChpcl9pbnN0cnVjdGlvbiAqaXIsIHZvaWQgKmRhdGEpCit7CisgICB2b2lkICpjdHggPSByYWxsb2NfcGFyZW50KGlyKTsKKyAgIGlyX2RlcmVmZXJlbmNlICpvcmlnX2RlcmVmID0gKGlyX2RlcmVmZXJlbmNlICopIGRhdGE7CisgICBpcl9yZXR1cm4gKnJldCA9IGlyLT5hc19yZXR1cm4oKTsKKworICAgaWYgKHJldCkgeworICAgICAgaWYgKHJldC0+dmFsdWUpIHsKKwkgaXJfcnZhbHVlICpsaHMgPSBvcmlnX2RlcmVmLT5jbG9uZShjdHgsIE5VTEwpOworCSByZXQtPnJlcGxhY2Vfd2l0aChuZXcoY3R4KSBpcl9hc3NpZ25tZW50KGxocywgcmV0LT52YWx1ZSwgTlVMTCkpOworICAgICAgfSBlbHNlIHsKKwkgLyogdW4tdmFsdWVkIHJldHVybiBoYXMgdG8gYmUgdGhlIGxhc3QgcmV0dXJuLCBvciB3ZSBzaG91bGRuJ3QKKwkgICogaGF2ZSByZWFjaGVkIGhlcmUuIChzZWUgY2FuX2lubGluZSgpKS4KKwkgICovCisJIGFzc2VydChyZXQtPm5leHQtPmlzX3RhaWxfc2VudGluZWwoKSk7CisJIHJldC0+cmVtb3ZlKCk7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQKK2lyX2NhbGw6OmdlbmVyYXRlX2lubGluZShpcl9pbnN0cnVjdGlvbiAqbmV4dF9pcikKK3sKKyAgIHZvaWQgKmN0eCA9IHJhbGxvY19wYXJlbnQodGhpcyk7CisgICBpcl92YXJpYWJsZSAqKnBhcmFtZXRlcnM7CisgICBpbnQgbnVtX3BhcmFtZXRlcnM7CisgICBpbnQgaTsKKyAgIHN0cnVjdCBoYXNoX3RhYmxlICpodDsKKworICAgaHQgPSBoYXNoX3RhYmxlX2N0b3IoMCwgaGFzaF90YWJsZV9wb2ludGVyX2hhc2gsIGhhc2hfdGFibGVfcG9pbnRlcl9jb21wYXJlKTsKKworICAgbnVtX3BhcmFtZXRlcnMgPSAwOworICAgZm9yZWFjaF9saXN0KG4sICZ0aGlzLT5jYWxsZWUtPnBhcmFtZXRlcnMpCisgICAgICBudW1fcGFyYW1ldGVycysrOworCisgICBwYXJhbWV0ZXJzID0gbmV3IGlyX3ZhcmlhYmxlICpbbnVtX3BhcmFtZXRlcnNdOworCisgICAvKiBHZW5lcmF0ZSB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgcGFyYW1ldGVycyB0byBvdXIgaW5saW5lZCBjb2RlLAorICAgICogYW5kIHNldCB1cCB0aGUgbWFwcGluZyBvZiByZWFsIGZ1bmN0aW9uIGJvZHkgdmFyaWFibGVzIHRvIG91cnMuCisgICAgKi8KKyAgIGkgPSAwOworICAgZm9yZWFjaF90d29fbGlzdHMoZm9ybWFsX25vZGUsICZ0aGlzLT5jYWxsZWUtPnBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfbm9kZSwgJnRoaXMtPmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisgICAgICBpcl92YXJpYWJsZSAqc2lnX3BhcmFtID0gKGlyX3ZhcmlhYmxlICopIGZvcm1hbF9ub2RlOworICAgICAgaXJfcnZhbHVlICpwYXJhbSA9IChpcl9ydmFsdWUgKikgYWN0dWFsX25vZGU7CisKKyAgICAgIC8qIEdlbmVyYXRlIGEgbmV3IHZhcmlhYmxlIGZvciB0aGUgcGFyYW1ldGVyLiAqLworICAgICAgaWYgKHNpZ19wYXJhbS0+dHlwZS0+Y29udGFpbnNfb3BhcXVlKCkpIHsKKwkgLyogRm9yIG9wYXF1ZSB0eXBlcywgd2Ugd2FudCB0aGUgaW5saW5lZCB2YXJpYWJsZSByZWZlcmVuY2VzCisJICAqIHJlZmVyZW5jaW5nIHRoZSBwYXNzZWQgaW4gdmFyaWFibGUsIHNpbmNlIHRoYXQgd2lsbCBoYXZlCisJICAqIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgd2hpY2ggYW4gYXNzaWdubWVudCBvZiBhbiBvcGFxdWUKKwkgICogdmFyaWFibGUgd291bGRuJ3QuICBGaXggaXQgdXAgYmVsb3cuCisJICAqLworCSBwYXJhbWV0ZXJzW2ldID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisJIHBhcmFtZXRlcnNbaV0gPSBzaWdfcGFyYW0tPmNsb25lKGN0eCwgaHQpOworCSBwYXJhbWV0ZXJzW2ldLT5kYXRhLm1vZGUgPSBpcl92YXJfYXV0bzsKKworCSAvKiBSZW1vdmUgdGhlIHJlYWQtb25seSBkZWNvcmF0aW9uIGJlY2F1c2Ugd2UncmUgZ29pbmcgdG8gd3JpdGUKKwkgICogZGlyZWN0bHkgdG8gdGhpcyB2YXJpYWJsZS4gIElmIHRoZSBjbG9uZWQgdmFyaWFibGUgaXMgbGVmdAorCSAgKiByZWFkLW9ubHkgYW5kIHRoZSBpbmxpbmVkIGZ1bmN0aW9uIGlzIGluc2lkZSBhIGxvb3AsIHRoZSBsb29wCisJICAqIGFuYWx5c2lzIGNvZGUgd2lsbCBnZXQgY29uZnVzZWQuCisJICAqLworCSBwYXJhbWV0ZXJzW2ldLT5kYXRhLnJlYWRfb25seSA9IGZhbHNlOworCSBuZXh0X2lyLT5pbnNlcnRfYmVmb3JlKHBhcmFtZXRlcnNbaV0pOworICAgICAgfQorCisgICAgICAvKiBNb3ZlIHRoZSBhY3R1YWwgcGFyYW0gaW50byBvdXIgcGFyYW0gdmFyaWFibGUgaWYgaXQncyBhbiAnaW4nIHR5cGUuICovCisgICAgICBpZiAocGFyYW1ldGVyc1tpXSAmJiAoc2lnX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX2luIHx8CisJCQkgICAgc2lnX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2NvbnN0X2luIHx8CisJCQkgICAgc2lnX3BhcmFtLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX2lub3V0KSkgeworCSBpcl9hc3NpZ25tZW50ICphc3NpZ247CisKKwkgYXNzaWduID0gbmV3KGN0eCkgaXJfYXNzaWdubWVudChuZXcoY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShwYXJhbWV0ZXJzW2ldKSwKKwkJCQkJIHBhcmFtLCBOVUxMKTsKKwkgbmV4dF9pci0+aW5zZXJ0X2JlZm9yZShhc3NpZ24pOworICAgICAgfQorCisgICAgICArK2k7CisgICB9CisKKyAgIGV4ZWNfbGlzdCBuZXdfaW5zdHJ1Y3Rpb25zOworCisgICAvKiBHZW5lcmF0ZSB0aGUgaW5saW5lZCBib2R5IG9mIHRoZSBmdW5jdGlvbiB0byBhIG5ldyBsaXN0ICovCisgICBmb3JlYWNoX2xpc3QobiwgJmNhbGxlZS0+Ym9keSkgeworICAgICAgaXJfaW5zdHJ1Y3Rpb24gKmlyID0gKGlyX2luc3RydWN0aW9uICopIG47CisgICAgICBpcl9pbnN0cnVjdGlvbiAqbmV3X2lyID0gaXItPmNsb25lKGN0eCwgaHQpOworCisgICAgICBuZXdfaW5zdHJ1Y3Rpb25zLnB1c2hfdGFpbChuZXdfaXIpOworICAgICAgdmlzaXRfdHJlZShuZXdfaXIsIHJlcGxhY2VfcmV0dXJuX3dpdGhfYXNzaWdubWVudCwgdGhpcy0+cmV0dXJuX2RlcmVmKTsKKyAgIH0KKworICAgLyogSWYgYW55IG9wYXF1ZSB0eXBlcyB3ZXJlIHBhc3NlZCBpbiwgcmVwbGFjZSBhbnkgZGVyZWYgb2YgdGhlCisgICAgKiBvcGFxdWUgdmFyaWFibGUgd2l0aCBhIGRlcmVmIG9mIHRoZSBhcmd1bWVudC4KKyAgICAqLworICAgZm9yZWFjaF90d29fbGlzdHMoZm9ybWFsX25vZGUsICZ0aGlzLT5jYWxsZWUtPnBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfbm9kZSwgJnRoaXMtPmFjdHVhbF9wYXJhbWV0ZXJzKSB7CisgICAgICBpcl9ydmFsdWUgKmNvbnN0IHBhcmFtID0gKGlyX3J2YWx1ZSAqKSBhY3R1YWxfbm9kZTsKKyAgICAgIGlyX3ZhcmlhYmxlICpzaWdfcGFyYW0gPSAoaXJfdmFyaWFibGUgKikgZm9ybWFsX25vZGU7CisKKyAgICAgIGlmIChzaWdfcGFyYW0tPnR5cGUtPmNvbnRhaW5zX29wYXF1ZSgpKSB7CisJIGlyX2RlcmVmZXJlbmNlICpkZXJlZiA9IHBhcmFtLT5hc19kZXJlZmVyZW5jZSgpOworCisJIGFzc2VydChkZXJlZik7CisJIGRvX3ZhcmlhYmxlX3JlcGxhY2VtZW50KCZuZXdfaW5zdHJ1Y3Rpb25zLCBzaWdfcGFyYW0sIGRlcmVmKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogTm93IHB1c2ggdGhvc2UgbmV3IGluc3RydWN0aW9ucyBpbi4gKi8KKyAgIG5leHRfaXItPmluc2VydF9iZWZvcmUoJm5ld19pbnN0cnVjdGlvbnMpOworCisgICAvKiBDb3B5IGJhY2sgdGhlIHZhbHVlIG9mIGFueSAnb3V0JyBwYXJhbWV0ZXJzIGZyb20gdGhlIGZ1bmN0aW9uIGJvZHkKKyAgICAqIHZhcmlhYmxlcyB0byBvdXIgb3duLgorICAgICovCisgICBpID0gMDsKKyAgIGZvcmVhY2hfdHdvX2xpc3RzKGZvcm1hbF9ub2RlLCAmdGhpcy0+Y2FsbGVlLT5wYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX25vZGUsICZ0aGlzLT5hY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICpjb25zdCBwYXJhbSA9IChpcl9ydmFsdWUgKikgYWN0dWFsX25vZGU7CisgICAgICBjb25zdCBpcl92YXJpYWJsZSAqY29uc3Qgc2lnX3BhcmFtID0gKGlyX3ZhcmlhYmxlICopIGZvcm1hbF9ub2RlOworCisgICAgICAvKiBNb3ZlIG91ciBwYXJhbSB2YXJpYWJsZSBpbnRvIHRoZSBhY3R1YWwgcGFyYW0gaWYgaXQncyBhbiAnb3V0JyB0eXBlLiAqLworICAgICAgaWYgKHBhcmFtZXRlcnNbaV0gJiYgKHNpZ19wYXJhbS0+ZGF0YS5tb2RlID09IGlyX3Zhcl9mdW5jdGlvbl9vdXQgfHwKKwkJCSAgICBzaWdfcGFyYW0tPmRhdGEubW9kZSA9PSBpcl92YXJfZnVuY3Rpb25faW5vdXQpKSB7CisJIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbjsKKworCSBhc3NpZ24gPSBuZXcoY3R4KSBpcl9hc3NpZ25tZW50KHBhcmFtLT5jbG9uZShjdHgsIE5VTEwpLT5hc19ydmFsdWUoKSwKKwkJCQkJIG5ldyhjdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKHBhcmFtZXRlcnNbaV0pLAorCQkJCQkgTlVMTCk7CisJIG5leHRfaXItPmluc2VydF9iZWZvcmUoYXNzaWduKTsKKyAgICAgIH0KKworICAgICAgKytpOworICAgfQorCisgICBkZWxldGUgW10gcGFyYW1ldGVyczsKKworICAgaGFzaF90YWJsZV9kdG9yKGh0KTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfZnVuY3Rpb25faW5saW5pbmdfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZXhwcmVzc2lvbiAqaXIpCit7CisgICAodm9pZCkgaXI7CisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2Z1bmN0aW9uX2lubGluaW5nX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3JldHVybiAqaXIpCit7CisgICAodm9pZCkgaXI7CisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2Z1bmN0aW9uX2lubGluaW5nX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3RleHR1cmUgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9mdW5jdGlvbl9pbmxpbmluZ192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9zd2l6emxlICppcikKK3sKKyAgICh2b2lkKSBpcjsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworaXJfZnVuY3Rpb25faW5saW5pbmdfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfY2FsbCAqaXIpCit7CisgICBpZiAoY2FuX2lubGluZShpcikpIHsKKyAgICAgIGlyLT5nZW5lcmF0ZV9pbmxpbmUoaXIpOworICAgICAgaXItPnJlbW92ZSgpOworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworLyoqCisgKiBSZXBsYWNlcyByZWZlcmVuY2VzIHRvIHRoZSAib3JpZyIgdmFyaWFibGUgd2l0aCBhIGNsb25lIG9mICJyZXBsLiIKKyAqCisgKiBGcm9tIHRoZSBzcGVjLCBvcGFxdWUgdHlwZXMgY2FuIGFwcGVhciBpbiB0aGUgdHJlZSBhcyBmdW5jdGlvbgorICogKG5vbi1vdXQpIHBhcmFtZXRlcnMgYW5kIGFzIHRoZSByZXN1bHQgb2YgYXJyYXkgaW5kZXhpbmcgYW5kCisgKiBzdHJ1Y3R1cmUgZmllbGQgc2VsZWN0aW9uLiAgSW4gb3VyIGJ1aWx0aW4gaW1wbGVtZW50YXRpb24sIHRoZXkKKyAqIGFsc28gYXBwZWFyIGluIHRoZSBzYW1wbGVyIGZpZWxkIG9mIGFuIGlyX3RleCBpbnN0cnVjdGlvbi4KKyAqLworCitjbGFzcyBpcl92YXJpYWJsZV9yZXBsYWNlbWVudF92aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX3ZhcmlhYmxlX3JlcGxhY2VtZW50X3Zpc2l0b3IoaXJfdmFyaWFibGUgKm9yaWcsIGlyX2RlcmVmZXJlbmNlICpyZXBsKQorICAgeworICAgICAgdGhpcy0+b3JpZyA9IG9yaWc7CisgICAgICB0aGlzLT5yZXBsID0gcmVwbDsKKyAgIH0KKworICAgdmlydHVhbCB+aXJfdmFyaWFibGVfcmVwbGFjZW1lbnRfdmlzaXRvcigpCisgICB7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfY2FsbCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfZGVyZWZlcmVuY2VfYXJyYXkgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfdGV4dHVyZSAqKTsKKworICAgdm9pZCByZXBsYWNlX2RlcmVmKGlyX2RlcmVmZXJlbmNlICoqZGVyZWYpOworICAgdm9pZCByZXBsYWNlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpOworCisgICBpcl92YXJpYWJsZSAqb3JpZzsKKyAgIGlyX2RlcmVmZXJlbmNlICpyZXBsOworfTsKKwordm9pZAoraXJfdmFyaWFibGVfcmVwbGFjZW1lbnRfdmlzaXRvcjo6cmVwbGFjZV9kZXJlZihpcl9kZXJlZmVyZW5jZSAqKmRlcmVmKQoreworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmX3ZhciA9ICgqZGVyZWYpLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaWYgKGRlcmVmX3ZhciAmJiBkZXJlZl92YXItPnZhciA9PSB0aGlzLT5vcmlnKSB7CisgICAgICAqZGVyZWYgPSB0aGlzLT5yZXBsLT5jbG9uZShyYWxsb2NfcGFyZW50KCpkZXJlZiksIE5VTEwpOworICAgfQorfQorCit2b2lkCitpcl92YXJpYWJsZV9yZXBsYWNlbWVudF92aXNpdG9yOjpyZXBsYWNlX3J2YWx1ZShpcl9ydmFsdWUgKipydmFsdWUpCit7CisgICBpZiAoISpydmFsdWUpCisgICAgICByZXR1cm47CisKKyAgIGlyX2RlcmVmZXJlbmNlICpkZXJlZiA9ICgqcnZhbHVlKS0+YXNfZGVyZWZlcmVuY2UoKTsKKworICAgaWYgKCFkZXJlZikKKyAgICAgIHJldHVybjsKKworICAgcmVwbGFjZV9kZXJlZigmZGVyZWYpOworICAgKnJ2YWx1ZSA9IGRlcmVmOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFyaWFibGVfcmVwbGFjZW1lbnRfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfdGV4dHVyZSAqaXIpCit7CisgICByZXBsYWNlX2RlcmVmKCZpci0+c2FtcGxlcik7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZhcmlhYmxlX3JlcGxhY2VtZW50X3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2RlcmVmZXJlbmNlX2FycmF5ICppcikKK3sKKyAgIHJlcGxhY2VfcnZhbHVlKCZpci0+YXJyYXkpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdmFyaWFibGVfcmVwbGFjZW1lbnRfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICppcikKK3sKKyAgIHJlcGxhY2VfcnZhbHVlKCZpci0+cmVjb3JkKTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZhcmlhYmxlX3JlcGxhY2VtZW50X3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2NhbGwgKmlyKQoreworICAgZm9yZWFjaF9saXN0X3NhZmUobiwgJmlyLT5hY3R1YWxfcGFyYW1ldGVycykgeworICAgICAgaXJfcnZhbHVlICpwYXJhbSA9IChpcl9ydmFsdWUgKikgbjsKKyAgICAgIGlyX3J2YWx1ZSAqbmV3X3BhcmFtID0gcGFyYW07CisgICAgICByZXBsYWNlX3J2YWx1ZSgmbmV3X3BhcmFtKTsKKworICAgICAgaWYgKG5ld19wYXJhbSAhPSBwYXJhbSkgeworCSBwYXJhbS0+cmVwbGFjZV93aXRoKG5ld19wYXJhbSk7CisgICAgICB9CisgICB9CisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK3N0YXRpYyB2b2lkCitkb192YXJpYWJsZV9yZXBsYWNlbWVudChleGVjX2xpc3QgKmluc3RydWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlICpvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgaXJfZGVyZWZlcmVuY2UgKnJlcGwpCit7CisgICBpcl92YXJpYWJsZV9yZXBsYWNlbWVudF92aXNpdG9yIHYob3JpZywgcmVwbCk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9pZl9zaW1wbGlmaWNhdGlvbi5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9pZl9zaW1wbGlmaWNhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1ZjAzMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X2lmX3NpbXBsaWZpY2F0aW9uLmNwcApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgb3B0X2lmX3NpbXBsaWZpY2F0aW9uLmNwcAorICoKKyAqIE1vdmVzIGNvbnN0YW50IGJyYW5jaGVzIG9mIGlmIHN0YXRlbWVudHMgb3V0IHRvIHRoZSBzdXJyb3VuZGluZworICogaW5zdHJ1Y3Rpb24gc3RyZWFtLCBhbmQgaW52ZXJ0cyBpZiBjb25kaXRpb25hbHMgdG8gYXZvaWQgZW1wdHkKKyAqICJ0aGVuIiBibG9ja3MuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIGlyX2lmX3NpbXBsaWZpY2F0aW9uX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfaWZfc2ltcGxpZmljYXRpb25fdmlzaXRvcigpCisgICB7CisgICAgICB0aGlzLT5tYWRlX3Byb2dyZXNzID0gZmFsc2U7CisgICB9CisKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2lmICopOworICAgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqKTsKKworICAgYm9vbCBtYWRlX3Byb2dyZXNzOworfTsKKworfSAvKiB1bm5hbWVkIG5hbWVzcGFjZSAqLworCisvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHRvcCBsZXZlbCAiaWYiIGluc3RydWN0aW9ucywgc28gZG9uJ3QKKyAqIGRlc2NlbmQgaW50byBleHByZXNzaW9ucy4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2lmX3NpbXBsaWZpY2F0aW9uX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Fzc2lnbm1lbnQgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitib29sCitkb19pZl9zaW1wbGlmaWNhdGlvbihleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX2lmX3NpbXBsaWZpY2F0aW9uX3Zpc2l0b3IgdjsKKworICAgdi5ydW4oaW5zdHJ1Y3Rpb25zKTsKKyAgIHJldHVybiB2Lm1hZGVfcHJvZ3Jlc3M7Cit9CisKKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX2lmX3NpbXBsaWZpY2F0aW9uX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2lmICppcikKK3sKKyAgIC8qIElmIHRoZSBpZiBzdGF0ZW1lbnQgaGFzIG5vdGhpbmcgb24gZWl0aGVyIHNpZGUsIHJlbW92ZSBpdC4gKi8KKyAgIGlmIChpci0+dGhlbl9pbnN0cnVjdGlvbnMuaXNfZW1wdHkoKSAmJgorICAgICAgIGlyLT5lbHNlX2luc3RydWN0aW9ucy5pc19lbXB0eSgpKSB7CisgICAgICBpci0+cmVtb3ZlKCk7CisgICAgICB0aGlzLT5tYWRlX3Byb2dyZXNzID0gdHJ1ZTsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgLyogRklOSVNITUU6IElkZWFsbHkgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gbm90ZSB0aGF0IHRoZSBjb25kaXRpb24gcmVzdWx0cworICAgICogRklOSVNITUU6IGluIGEgY29uc3RhbnQgYmVmb3JlIHByb2Nlc3NpbmcgYm90aCBvZiB0aGUgb3RoZXIgc3VidHJlZXMuCisgICAgKiBGSU5JU0hNRTogVGhpcyBjYW4gcHJvYmFibHkgYmUgZG9uZSB3aXRoIHNvbWUgZmxhZ3MsIGJ1dCBpdCB3b3VsZCB0YWtlCisgICAgKiBGSU5JU0hNRTogc29tZSB3b3JrIHRvIGdldCByaWdodC4KKyAgICAqLworICAgaXJfY29uc3RhbnQgKmNvbmRpdGlvbl9jb25zdGFudCA9IGlyLT5jb25kaXRpb24tPmNvbnN0YW50X2V4cHJlc3Npb25fdmFsdWUoKTsKKyAgIGlmIChjb25kaXRpb25fY29uc3RhbnQpIHsKKyAgICAgIC8qIE1vdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbmUgYnJhbmNoIG9mIHRoZSBjb25kaXRpb25hbAorICAgICAgICogdGhhdCBtYXR0ZXJzIG91dC4KKyAgICAgICAqLworICAgICAgaWYgKGNvbmRpdGlvbl9jb25zdGFudC0+dmFsdWUuYlswXSkgeworICAgICAgICAgaXItPmluc2VydF9iZWZvcmUoJmlyLT50aGVuX2luc3RydWN0aW9ucyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgaXItPmluc2VydF9iZWZvcmUoJmlyLT5lbHNlX2luc3RydWN0aW9ucyk7CisgICAgICB9CisgICAgICBpci0+cmVtb3ZlKCk7CisgICAgICB0aGlzLT5tYWRlX3Byb2dyZXNzID0gdHJ1ZTsKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKyAgIH0KKworICAgLyogVHVybjoKKyAgICAqCisgICAgKiAgICAgaWYgKGNvbmQpIHsKKyAgICAqICAgICB9IGVsc2UgeworICAgICogICAgICAgICBkb193b3JrKCk7CisgICAgKiAgICAgfQorICAgICoKKyAgICAqIGludG8gOgorICAgICoKKyAgICAqICAgICBpZiAoIWNvbmQpCisgICAgKiAgICAgICAgIGRvX3dvcmsoKTsKKyAgICAqCisgICAgKiB3aGljaCBhdm9pZHMgY29udHJvbCBmbG93IGZvciAiZWxzZSIgKHdoaWNoIGlzIHVzdWFsbHkgbW9yZQorICAgICogZXhwZW5zaXZlIHRoYW4gbm9ybWFsIG9wZXJhdGlvbnMpLCBhbmQgdGhlICJub3QiIGNhbiB1c3VhbGx5IGJlCisgICAgKiBmb2xkZWQgaW50byB0aGUgZ2VuZXJhdGlvbiBvZiAiY29uZCIgYW55d2F5LgorICAgICovCisgICBpZiAoaXItPnRoZW5faW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkpIHsKKyAgICAgIGlyLT5jb25kaXRpb24gPSBuZXcocmFsbG9jX3BhcmVudChpci0+Y29uZGl0aW9uKSkKKwkgaXJfZXhwcmVzc2lvbihpcl91bm9wX2xvZ2ljX25vdCwgaXItPmNvbmRpdGlvbik7CisgICAgICBpci0+ZWxzZV9pbnN0cnVjdGlvbnMubW92ZV9ub2Rlc190bygmaXItPnRoZW5faW5zdHJ1Y3Rpb25zKTsKKyAgICAgIHRoaXMtPm1hZGVfcHJvZ3Jlc3MgPSB0cnVlOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9ub29wX3N3aXp6bGUuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfbm9vcF9zd2l6emxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODZhZDVlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfbm9vcF9zd2l6emxlLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfbm9vcF9zd2l6emxlLmNwcAorICoKKyAqIElmIGEgc3dpenpsZSBkb2Vzbid0IGNoYW5nZSB0aGUgb3JkZXIgb3IgY291bnQgb2YgY29tcG9uZW50cywgdGhlbgorICogcmVtb3ZlIHRoZSBzd2l6emxlIHNvIHRoYXQgb3RoZXIgb3B0aW1pemF0aW9uIHBhc3NlcyBzZWUgdGhlIHZhbHVlCisgKiBiZWhpbmQgaXQuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX3J2YWx1ZV92aXNpdG9yLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBpcl9ub29wX3N3aXp6bGVfdmlzaXRvciA6IHB1YmxpYyBpcl9ydmFsdWVfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9ub29wX3N3aXp6bGVfdmlzaXRvcigpCisgICB7CisgICAgICB0aGlzLT5wcm9ncmVzcyA9IGZhbHNlOworICAgfQorCisgICB2b2lkIGhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKTsKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKK3ZvaWQKK2lyX25vb3Bfc3dpenpsZV92aXNpdG9yOjpoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSkKK3sKKyAgIGlmICghKnJ2YWx1ZSkKKyAgICAgIHJldHVybjsKKworICAgaXJfc3dpenpsZSAqc3dpeiA9ICgqcnZhbHVlKS0+YXNfc3dpenpsZSgpOworICAgaWYgKCFzd2l6IHx8IHN3aXotPnR5cGUgIT0gc3dpei0+dmFsLT50eXBlKQorICAgICAgcmV0dXJuOworCisgICBpbnQgZWxlbXMgPSBzd2l6LT52YWwtPnR5cGUtPnZlY3Rvcl9lbGVtZW50czsKKyAgIGlmIChzd2l6LT5tYXNrLnggIT0gMCkKKyAgICAgIHJldHVybjsKKyAgIGlmIChlbGVtcyA+PSAyICYmIHN3aXotPm1hc2sueSAhPSAxKQorICAgICAgcmV0dXJuOworICAgaWYgKGVsZW1zID49IDMgJiYgc3dpei0+bWFzay56ICE9IDIpCisgICAgICByZXR1cm47CisgICBpZiAoZWxlbXMgPj0gNCAmJiBzd2l6LT5tYXNrLncgIT0gMykKKyAgICAgIHJldHVybjsKKworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgKnJ2YWx1ZSA9IHN3aXotPnZhbDsKK30KKworYm9vbAorZG9fbm9vcF9zd2l6emxlKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgaXJfbm9vcF9zd2l6emxlX3Zpc2l0b3IgdjsKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHMoJnYsIGluc3RydWN0aW9ucyk7CisKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfcmVkdW5kYW50X2p1bXBzLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X3JlZHVuZGFudF9qdW1wcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzODRkMAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X3JlZHVuZGFudF9qdW1wcy5jcHAKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF9yZWR1bmRhbnRfanVtcHMuY3BwCisgKiBSZW1vdmUgY2VydGFpbiB0eXBlcyBvZiByZWR1bmRhbnQganVtcHMKKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgcmVkdW5kYW50X2p1bXBzX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgcmVkdW5kYW50X2p1bXBzX3Zpc2l0b3IoKQorICAgeworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9sZWF2ZShpcl9pZiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfbG9vcCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqKTsKKworICAgYm9vbCBwcm9ncmVzczsKK307CisKK30gLyogdW5uYW1lZCBuYW1lc3BhY2UgKi8KKworLyogV2Ugb25seSBjYXJlIGFib3V0IHRoZSB0b3AgbGV2ZWwgaW5zdHJ1Y3Rpb25zLCBzbyBkb24ndCBkZXNjZW5kCisgKiBpbnRvIGV4cHJlc3Npb25zLgorICovCitpcl92aXNpdG9yX3N0YXR1cworcmVkdW5kYW50X2p1bXBzX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2Fzc2lnbm1lbnQgKikKK3sKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK3JlZHVuZGFudF9qdW1wc192aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9pZiAqaXIpCit7CisgICAvKiBJZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiBib3RoIGJyYW5jaGVzIGlzIGEgJ2JyZWFrJyBvciBhICdjb250aW51ZScsCisgICAgKiBwdWxsIGl0IG91dCBvZiB0aGUgYnJhbmNoZXMgYW5kIGluc2VydCBpdCBhZnRlciB0aGUgaWYtc3RhdG1lbnQuICBOb3RlCisgICAgKiB0aGF0IGJvdGggbXVzdCBiZSB0aGUgc2FtZSB0eXBlIChlaXRoZXIgJ2JyZWFrJyBvciAnY29udGludWUnKS4KKyAgICAqLworICAgaXJfaW5zdHJ1Y3Rpb24gKmNvbnN0IGxhc3RfdGhlbiA9CisgICAgICAoaXJfaW5zdHJ1Y3Rpb24gKikgaXItPnRoZW5faW5zdHJ1Y3Rpb25zLmdldF90YWlsKCk7CisgICBpcl9pbnN0cnVjdGlvbiAqY29uc3QgbGFzdF9lbHNlID0KKyAgICAgIChpcl9pbnN0cnVjdGlvbiAqKSBpci0+ZWxzZV9pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgaWYgKChsYXN0X3RoZW4gPT0gTlVMTCkgfHwgKGxhc3RfZWxzZSA9PSBOVUxMKSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgaWYgKChsYXN0X3RoZW4tPmlyX3R5cGUgIT0gaXJfdHlwZV9sb29wX2p1bXApCisgICAgICAgfHwgKGxhc3RfZWxzZS0+aXJfdHlwZSAhPSBpcl90eXBlX2xvb3BfanVtcCkpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIGlyX2xvb3BfanVtcCAqY29uc3QgdGhlbl9qdW1wID0gKGlyX2xvb3BfanVtcCAqKSBsYXN0X3RoZW47CisgICBpcl9sb29wX2p1bXAgKmNvbnN0IGVsc2VfanVtcCA9IChpcl9sb29wX2p1bXAgKikgbGFzdF9lbHNlOworCisgICBpZiAodGhlbl9qdW1wLT5tb2RlICE9IGVsc2VfanVtcC0+bW9kZSkKKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKKworICAgdGhlbl9qdW1wLT5yZW1vdmUoKTsKKyAgIGVsc2VfanVtcC0+cmVtb3ZlKCk7CisgICB0aGlzLT5wcm9ncmVzcyA9IHRydWU7CisKKyAgIGlyLT5pbnNlcnRfYWZ0ZXIodGhlbl9qdW1wKTsKKworICAgLyogSWYgYm90aCBicmFuY2hzIG9mIHRoZSBpZi1zdGF0ZW1lbnQgYXJlIG5vdyBlbXB0eSwgcmVtb3ZlIHRoZQorICAgICogaWYtc3RhdGVtZW50LgorICAgICovCisgICBpZiAoaXItPnRoZW5faW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkgJiYgaXItPmVsc2VfaW5zdHJ1Y3Rpb25zLmlzX2VtcHR5KCkpCisgICAgICBpci0+cmVtb3ZlKCk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworCitpcl92aXNpdG9yX3N0YXR1cworcmVkdW5kYW50X2p1bXBzX3Zpc2l0b3I6OnZpc2l0X2xlYXZlKGlyX2xvb3AgKmlyKQoreworICAgLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgYSBsb29wIGJvZHkgaXMgYSAnY29udGludWUnLCByZW1vdmUgaXQuCisgICAgKi8KKyAgIGlyX2luc3RydWN0aW9uICpjb25zdCBsYXN0ID0KKyAgICAgIChpcl9pbnN0cnVjdGlvbiAqKSBpci0+Ym9keV9pbnN0cnVjdGlvbnMuZ2V0X3RhaWwoKTsKKworICAgaWYgKGxhc3QgJiYgKGxhc3QtPmlyX3R5cGUgPT0gaXJfdHlwZV9sb29wX2p1bXApCisgICAgICAgJiYgKCgoaXJfbG9vcF9qdW1wICopIGxhc3QpLT5tb2RlID09IGlyX2xvb3BfanVtcDo6anVtcF9jb250aW51ZSkpIHsKKyAgICAgIGxhc3QtPnJlbW92ZSgpOworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKworYm9vbAorb3B0aW1pemVfcmVkdW5kYW50X2p1bXBzKGV4ZWNfbGlzdCAqaW5zdHJ1Y3Rpb25zKQoreworICAgcmVkdW5kYW50X2p1bXBzX3Zpc2l0b3IgdjsKKworICAgdi5ydW4oaW5zdHJ1Y3Rpb25zKTsKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfc3RydWN0dXJlX3NwbGl0dGluZy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF9zdHJ1Y3R1cmVfc3BsaXR0aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM1MzdiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfc3RydWN0dXJlX3NwbGl0dGluZy5jcHAKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF9zdHJ1Y3R1cmVfc3BsaXR0aW5nLmNwcAorICoKKyAqIElmIGEgc3RydWN0dXJlIGlzIG9ubHkgZXZlciByZWZlcmVuY2VkIGJ5IGl0cyBjb21wb25lbnRzLCB0aGVuCisgKiBzcGxpdCB0aG9zZSBjb21wb25lbnRzIG91dCB0byBpbmRpdmlkdWFsIHZhcmlhYmxlcyBzbyB0aGV5IGNhbiBiZQorICogaGFuZGxlZCBub3JtYWxseSBieSBvdGhlciBvcHRpbWl6YXRpb24gcGFzc2VzLgorICoKKyAqIFRoaXMgc2tpcHMgc3RydWN0dXJlcyBsaWtlIHVuaWZvcm1zLCB3aGljaCBuZWVkIHRvIGJlIGFjY2Vzc2libGUgYXMKKyAqIHN0cnVjdHVyZXMgZm9yIHRoZWlyIGFjY2VzcyBieSB0aGUgR0wuCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX3J2YWx1ZV92aXNpdG9yLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorCituYW1lc3BhY2UgeworCitzdGF0aWMgYm9vbCBkZWJ1ZyA9IGZhbHNlOworCitjbGFzcyB2YXJpYWJsZV9lbnRyeSA6IHB1YmxpYyBleGVjX25vZGUKK3sKK3B1YmxpYzoKKyAgIHZhcmlhYmxlX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpCisgICB7CisgICAgICB0aGlzLT52YXIgPSB2YXI7CisgICAgICB0aGlzLT53aG9sZV9zdHJ1Y3R1cmVfYWNjZXNzID0gMDsKKyAgICAgIHRoaXMtPmRlY2xhcmF0aW9uID0gZmFsc2U7CisgICAgICB0aGlzLT5jb21wb25lbnRzID0gTlVMTDsKKyAgICAgIHRoaXMtPm1lbV9jdHggPSBOVUxMOworICAgfQorCisgICBpcl92YXJpYWJsZSAqdmFyOyAvKiBUaGUga2V5OiB0aGUgdmFyaWFibGUncyBwb2ludGVyLiAqLworCisgICAvKiogTnVtYmVyIG9mIHRpbWVzIHRoZSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkLCBpbmNsdWRpbmcgYXNzaWdubWVudHMuICovCisgICB1bnNpZ25lZCB3aG9sZV9zdHJ1Y3R1cmVfYWNjZXNzOworCisgICAvKiBJZiB0aGUgdmFyaWFibGUgaGFkIGEgZGVjbCB3ZSBjYW4gd29yayB3aXRoIGluIHRoZSBpbnN0cnVjdGlvbgorICAgICogc3RyZWFtLiAgV2UgY2FuJ3QgZG8gc3BsaXR0aW5nIG9uIGZ1bmN0aW9uIGFyZ3VtZW50cywgd2hpY2gKKyAgICAqIGRvbid0IGdldCB0aGlzIHZhcmlhYmxlIHNldC4KKyAgICAqLworICAgYm9vbCBkZWNsYXJhdGlvbjsKKworICAgaXJfdmFyaWFibGUgKipjb21wb25lbnRzOworCisgICAvKiogcmFsbG9jX3BhcmVudCh0aGlzLT52YXIpIC0tIHRoZSBzaGFkZXIncyByYWxsb2MgY29udGV4dC4gKi8KKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCisKK2NsYXNzIGlyX3N0cnVjdHVyZV9yZWZlcmVuY2VfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICBpcl9zdHJ1Y3R1cmVfcmVmZXJlbmNlX3Zpc2l0b3Iodm9pZCkKKyAgIHsKKyAgICAgIHRoaXMtPm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgICAgIHRoaXMtPnZhcmlhYmxlX2xpc3QubWFrZV9lbXB0eSgpOworICAgfQorCisgICB+aXJfc3RydWN0dXJlX3JlZmVyZW5jZV92aXNpdG9yKHZvaWQpCisgICB7CisgICAgICByYWxsb2NfZnJlZShtZW1fY3R4KTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdChpcl92YXJpYWJsZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2RlcmVmZXJlbmNlX3JlY29yZCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICopOworCisgICB2YXJpYWJsZV9lbnRyeSAqZ2V0X3ZhcmlhYmxlX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpOworCisgICAvKiBMaXN0IG9mIHZhcmlhYmxlX2VudHJ5ICovCisgICBleGVjX2xpc3QgdmFyaWFibGVfbGlzdDsKKworICAgdm9pZCAqbWVtX2N0eDsKK307CisKK3ZhcmlhYmxlX2VudHJ5ICoKK2lyX3N0cnVjdHVyZV9yZWZlcmVuY2VfdmlzaXRvcjo6Z2V0X3ZhcmlhYmxlX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpCit7CisgICBhc3NlcnQodmFyKTsKKworICAgaWYgKCF2YXItPnR5cGUtPmlzX3JlY29yZCgpIHx8IHZhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl91bmlmb3JtCisgICAgICAgfHwgdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX3NoYWRlcl9pbiB8fCB2YXItPmRhdGEubW9kZSA9PSBpcl92YXJfc2hhZGVyX291dCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBmb3JlYWNoX2xpc3QobiwgJnRoaXMtPnZhcmlhYmxlX2xpc3QpIHsKKyAgICAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9ICh2YXJpYWJsZV9lbnRyeSAqKSBuOworICAgICAgaWYgKGVudHJ5LT52YXIgPT0gdmFyKQorCSByZXR1cm4gZW50cnk7CisgICB9CisKKyAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9IG5ldyhtZW1fY3R4KSB2YXJpYWJsZV9lbnRyeSh2YXIpOworICAgdGhpcy0+dmFyaWFibGVfbGlzdC5wdXNoX3RhaWwoZW50cnkpOworICAgcmV0dXJuIGVudHJ5OworfQorCisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl9zdHJ1Y3R1cmVfcmVmZXJlbmNlX3Zpc2l0b3I6OnZpc2l0KGlyX3ZhcmlhYmxlICppcikKK3sKKyAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9IHRoaXMtPmdldF92YXJpYWJsZV9lbnRyeShpcik7CisKKyAgIGlmIChlbnRyeSkKKyAgICAgIGVudHJ5LT5kZWNsYXJhdGlvbiA9IHRydWU7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3N0cnVjdHVyZV9yZWZlcmVuY2VfdmlzaXRvcjo6dmlzaXQoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmlyKQoreworICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9IGlyLT52YXJpYWJsZV9yZWZlcmVuY2VkKCk7CisgICB2YXJpYWJsZV9lbnRyeSAqZW50cnkgPSB0aGlzLT5nZXRfdmFyaWFibGVfZW50cnkodmFyKTsKKworICAgaWYgKGVudHJ5KQorICAgICAgZW50cnktPndob2xlX3N0cnVjdHVyZV9hY2Nlc3MrKzsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfc3RydWN0dXJlX3JlZmVyZW5jZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9yZWNvcmQgKmlyKQoreworICAgKHZvaWQpIGlyOworICAgLyogRG9uJ3QgZGVzY2VuZCBpbnRvIHRoZSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSBiZWxvdy4gKi8KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3N0cnVjdHVyZV9yZWZlcmVuY2VfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICAvKiBJZiB0aGVyZSBhcmUgbm8gc3RydWN0dXJlIHJlZmVyZW5jZXMgeWV0LCBubyBuZWVkIHRvIGJvdGhlciB3aXRoCisgICAgKiBwcm9jZXNzaW5nIHRoZSBleHByZXNzaW9uIHRyZWUuCisgICAgKi8KKyAgIGlmICh0aGlzLT52YXJpYWJsZV9saXN0LmlzX2VtcHR5KCkpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7CisKKyAgIGlmIChpci0+bGhzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpICYmCisgICAgICAgaXItPnJocy0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKSAmJgorICAgICAgICFpci0+Y29uZGl0aW9uKSB7CisgICAgICAvKiBXZSdsbCBzcGxpdCBjb3BpZXMgb2YgYSBzdHJ1Y3R1cmUgdG8gY29waWVzIG9mIGNvbXBvbmVudHMsIHNvIGRvbid0CisgICAgICAgKiBkZXNjZW5kIHRvIHRoZSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZXMuCisgICAgICAgKi8KKyAgICAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKKyAgIH0KKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3N0cnVjdHVyZV9yZWZlcmVuY2VfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZnVuY3Rpb25fc2lnbmF0dXJlICppcikKK3sKKyAgIC8qIFdlIGRvbid0IGhhdmUgbG9naWMgZm9yIHN0cnVjdHVyZS1zcGxpdHRpbmcgZnVuY3Rpb24gYXJndW1lbnRzLAorICAgICogc28ganVzdCBsb29rIGF0IHRoZSBib2R5IGluc3RydWN0aW9ucyBhbmQgbm90IHRoZSBwYXJhbWV0ZXIKKyAgICAqIGRlY2xhcmF0aW9ucy4KKyAgICAqLworICAgdmlzaXRfbGlzdF9lbGVtZW50cyh0aGlzLCAmaXItPmJvZHkpOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitjbGFzcyBpcl9zdHJ1Y3R1cmVfc3BsaXR0aW5nX3Zpc2l0b3IgOiBwdWJsaWMgaXJfcnZhbHVlX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfc3RydWN0dXJlX3NwbGl0dGluZ192aXNpdG9yKGV4ZWNfbGlzdCAqdmFycykKKyAgIHsKKyAgICAgIHRoaXMtPnZhcmlhYmxlX2xpc3QgPSB2YXJzOworICAgfQorCisgICB2aXJ0dWFsIH5pcl9zdHJ1Y3R1cmVfc3BsaXR0aW5nX3Zpc2l0b3IoKQorICAgeworICAgfQorCisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2xlYXZlKGlyX2Fzc2lnbm1lbnQgKik7CisKKyAgIHZvaWQgc3BsaXRfZGVyZWYoaXJfZGVyZWZlcmVuY2UgKipkZXJlZik7CisgICB2b2lkIGhhbmRsZV9ydmFsdWUoaXJfcnZhbHVlICoqcnZhbHVlKTsKKyAgIHZhcmlhYmxlX2VudHJ5ICpnZXRfc3BsaXR0aW5nX2VudHJ5KGlyX3ZhcmlhYmxlICp2YXIpOworCisgICBleGVjX2xpc3QgKnZhcmlhYmxlX2xpc3Q7Cit9OworCit2YXJpYWJsZV9lbnRyeSAqCitpcl9zdHJ1Y3R1cmVfc3BsaXR0aW5nX3Zpc2l0b3I6OmdldF9zcGxpdHRpbmdfZW50cnkoaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGFzc2VydCh2YXIpOworCisgICBpZiAoIXZhci0+dHlwZS0+aXNfcmVjb3JkKCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgZm9yZWFjaF9saXN0KG4sIHRoaXMtPnZhcmlhYmxlX2xpc3QpIHsKKyAgICAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9ICh2YXJpYWJsZV9lbnRyeSAqKSBuOworICAgICAgaWYgKGVudHJ5LT52YXIgPT0gdmFyKSB7CisJIHJldHVybiBlbnRyeTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2lyX3N0cnVjdHVyZV9zcGxpdHRpbmdfdmlzaXRvcjo6c3BsaXRfZGVyZWYoaXJfZGVyZWZlcmVuY2UgKipkZXJlZikKK3sKKyAgIGlmICgoKmRlcmVmKS0+aXJfdHlwZSAhPSBpcl90eXBlX2RlcmVmZXJlbmNlX3JlY29yZCkKKyAgICAgIHJldHVybjsKKworICAgaXJfZGVyZWZlcmVuY2VfcmVjb3JkICpkZXJlZl9yZWNvcmQgPSAoaXJfZGVyZWZlcmVuY2VfcmVjb3JkICopKmRlcmVmOworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKmRlcmVmX3ZhciA9IGRlcmVmX3JlY29yZC0+cmVjb3JkLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaWYgKCFkZXJlZl92YXIpCisgICAgICByZXR1cm47CisKKyAgIHZhcmlhYmxlX2VudHJ5ICplbnRyeSA9IGdldF9zcGxpdHRpbmdfZW50cnkoZGVyZWZfdmFyLT52YXIpOworICAgaWYgKCFlbnRyeSkKKyAgICAgIHJldHVybjsKKworICAgdW5zaWduZWQgaW50IGk7CisgICBmb3IgKGkgPSAwOyBpIDwgZW50cnktPnZhci0+dHlwZS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAoZGVyZWZfcmVjb3JkLT5maWVsZCwKKwkJIGVudHJ5LT52YXItPnR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSkgPT0gMCkKKwkgYnJlYWs7CisgICB9CisgICBhc3NlcnQoaSAhPSBlbnRyeS0+dmFyLT50eXBlLT5sZW5ndGgpOworCisgICAqZGVyZWYgPSBuZXcoZW50cnktPm1lbV9jdHgpIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKGVudHJ5LT5jb21wb25lbnRzW2ldKTsKK30KKwordm9pZAoraXJfc3RydWN0dXJlX3NwbGl0dGluZ192aXNpdG9yOjpoYW5kbGVfcnZhbHVlKGlyX3J2YWx1ZSAqKnJ2YWx1ZSkKK3sKKyAgIGlmICghKnJ2YWx1ZSkKKyAgICAgIHJldHVybjsKKworICAgaXJfZGVyZWZlcmVuY2UgKmRlcmVmID0gKCpydmFsdWUpLT5hc19kZXJlZmVyZW5jZSgpOworCisgICBpZiAoIWRlcmVmKQorICAgICAgcmV0dXJuOworCisgICBzcGxpdF9kZXJlZigmZGVyZWYpOworICAgKnJ2YWx1ZSA9IGRlcmVmOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfc3RydWN0dXJlX3NwbGl0dGluZ192aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpsaHNfZGVyZWYgPSBpci0+bGhzLT5hc19kZXJlZmVyZW5jZV92YXJpYWJsZSgpOworICAgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUgKnJoc19kZXJlZiA9IGlyLT5yaHMtPmFzX2RlcmVmZXJlbmNlX3ZhcmlhYmxlKCk7CisgICB2YXJpYWJsZV9lbnRyeSAqbGhzX2VudHJ5ID0gbGhzX2RlcmVmID8gZ2V0X3NwbGl0dGluZ19lbnRyeShsaHNfZGVyZWYtPnZhcikgOiBOVUxMOworICAgdmFyaWFibGVfZW50cnkgKnJoc19lbnRyeSA9IHJoc19kZXJlZiA/IGdldF9zcGxpdHRpbmdfZW50cnkocmhzX2RlcmVmLT52YXIpIDogTlVMTDsKKyAgIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSA9IGlyLT5yaHMtPnR5cGU7CisKKyAgIGlmICgobGhzX2VudHJ5IHx8IHJoc19lbnRyeSkgJiYgIWlyLT5jb25kaXRpb24pIHsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgaXJfZGVyZWZlcmVuY2UgKm5ld19saHMsICpuZXdfcmhzOworCSB2b2lkICptZW1fY3R4ID0gbGhzX2VudHJ5ID8gbGhzX2VudHJ5LT5tZW1fY3R4IDogcmhzX2VudHJ5LT5tZW1fY3R4OworCisJIGlmIChsaHNfZW50cnkpIHsKKwkgICAgbmV3X2xocyA9IG5ldyhtZW1fY3R4KSBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZShsaHNfZW50cnktPmNvbXBvbmVudHNbaV0pOworCSB9IGVsc2UgeworCSAgICBuZXdfbGhzID0gbmV3KG1lbV9jdHgpCisJICAgICAgIGlyX2RlcmVmZXJlbmNlX3JlY29yZChpci0+bGhzLT5jbG9uZShtZW1fY3R4LCBOVUxMKSwKKwkJCQkgICAgIHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSk7CisJIH0KKworCSBpZiAocmhzX2VudHJ5KSB7CisJICAgIG5ld19yaHMgPSBuZXcobWVtX2N0eCkgaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUocmhzX2VudHJ5LT5jb21wb25lbnRzW2ldKTsKKwkgfSBlbHNlIHsKKwkgICAgbmV3X3JocyA9IG5ldyhtZW1fY3R4KQorCSAgICAgICBpcl9kZXJlZmVyZW5jZV9yZWNvcmQoaXItPnJocy0+Y2xvbmUobWVtX2N0eCwgTlVMTCksCisJCQkJICAgICB0eXBlLT5maWVsZHMuc3RydWN0dXJlW2ldLm5hbWUpOworCSB9CisKKwkgaXItPmluc2VydF9iZWZvcmUobmV3KG1lbV9jdHgpIGlyX2Fzc2lnbm1lbnQobmV3X2xocywKKwkJCQkJCSAgICAgIG5ld19yaHMsCisJCQkJCQkgICAgICBOVUxMKSk7CisgICAgICB9CisgICAgICBpci0+cmVtb3ZlKCk7CisgICB9IGVsc2UgeworICAgICAgaGFuZGxlX3J2YWx1ZSgmaXItPnJocyk7CisgICAgICBzcGxpdF9kZXJlZigmaXItPmxocyk7CisgICB9CisKKyAgIGhhbmRsZV9ydmFsdWUoJmlyLT5jb25kaXRpb24pOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK30gLyogdW5uYW1lZCBuYW1lc3BhY2UgKi8KKworYm9vbAorZG9fc3RydWN0dXJlX3NwbGl0dGluZyhleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX3N0cnVjdHVyZV9yZWZlcmVuY2VfdmlzaXRvciByZWZzOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZyZWZzLCBpbnN0cnVjdGlvbnMpOworCisgICAvKiBUcmltIG91dCB2YXJpYWJsZXMgd2UgY2FuJ3Qgc3BsaXQuICovCisgICBmb3JlYWNoX2xpc3Rfc2FmZShuLCAmcmVmcy52YXJpYWJsZV9saXN0KSB7CisgICAgICB2YXJpYWJsZV9lbnRyeSAqZW50cnkgPSAodmFyaWFibGVfZW50cnkgKikgbjsKKworICAgICAgaWYgKGRlYnVnKSB7CisJIHByaW50Zigic3RydWN0dXJlICVzQCVwOiBkZWNsICVkLCB3aG9sZV9hY2Nlc3MgJWRcbiIsCisJCWVudHJ5LT52YXItPm5hbWUsICh2b2lkICopIGVudHJ5LT52YXIsIGVudHJ5LT5kZWNsYXJhdGlvbiwKKwkJZW50cnktPndob2xlX3N0cnVjdHVyZV9hY2Nlc3MpOworICAgICAgfQorCisgICAgICBpZiAoIWVudHJ5LT5kZWNsYXJhdGlvbiB8fCBlbnRyeS0+d2hvbGVfc3RydWN0dXJlX2FjY2VzcykgeworCSBlbnRyeS0+cmVtb3ZlKCk7CisgICAgICB9CisgICB9CisKKyAgIGlmIChyZWZzLnZhcmlhYmxlX2xpc3QuaXNfZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworCisgICAvKiBSZXBsYWNlIHRoZSBkZWNscyBvZiB0aGUgc3RydWN0dXJlcyB0byBiZSBzcGxpdCB3aXRoIHRoZWlyIHNwbGl0CisgICAgKiBjb21wb25lbnRzLgorICAgICovCisgICBmb3JlYWNoX2xpc3Rfc2FmZShuLCAmcmVmcy52YXJpYWJsZV9saXN0KSB7CisgICAgICB2YXJpYWJsZV9lbnRyeSAqZW50cnkgPSAodmFyaWFibGVfZW50cnkgKikgbjsKKyAgICAgIGNvbnN0IHN0cnVjdCBnbHNsX3R5cGUgKnR5cGUgPSBlbnRyeS0+dmFyLT50eXBlOworCisgICAgICBlbnRyeS0+bWVtX2N0eCA9IHJhbGxvY19wYXJlbnQoZW50cnktPnZhcik7CisKKyAgICAgIGVudHJ5LT5jb21wb25lbnRzID0gcmFsbG9jX2FycmF5KG1lbV9jdHgsCisJCQkJICAgICAgIGlyX3ZhcmlhYmxlICosCisJCQkJICAgICAgIHR5cGUtPmxlbmd0aCk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZW50cnktPnZhci0+dHlwZS0+bGVuZ3RoOyBpKyspIHsKKwkgY29uc3QgY2hhciAqbmFtZSA9IHJhbGxvY19hc3ByaW50ZihtZW1fY3R4LCAiJXNfJXMiLAorCQkJCQkgICAgZW50cnktPnZhci0+bmFtZSwKKwkJCQkJICAgIHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0ubmFtZSk7CisKKwkgZW50cnktPmNvbXBvbmVudHNbaV0gPQorCSAgICBuZXcoZW50cnktPm1lbV9jdHgpIGlyX3ZhcmlhYmxlKHR5cGUtPmZpZWxkcy5zdHJ1Y3R1cmVbaV0udHlwZSwKKwkJCQkJICAgIG5hbWUsCisJCQkJCSAgICBpcl92YXJfdGVtcG9yYXJ5KTsKKwkgZW50cnktPnZhci0+aW5zZXJ0X2JlZm9yZShlbnRyeS0+Y29tcG9uZW50c1tpXSk7CisgICAgICB9CisKKyAgICAgIGVudHJ5LT52YXItPnJlbW92ZSgpOworICAgfQorCisgICBpcl9zdHJ1Y3R1cmVfc3BsaXR0aW5nX3Zpc2l0b3Igc3BsaXQoJnJlZnMudmFyaWFibGVfbGlzdCk7CisgICB2aXNpdF9saXN0X2VsZW1lbnRzKCZzcGxpdCwgaW5zdHJ1Y3Rpb25zKTsKKworICAgcmFsbG9jX2ZyZWUobWVtX2N0eCk7CisKKyAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfc3dpenpsZV9zd2l6emxlLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X3N3aXp6bGVfc3dpenpsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2NGM2YgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X3N3aXp6bGVfc3dpenpsZS5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogXGZpbGUgb3B0X3N3aXp6bGVfc3dpenpsZS5jcHAKKyAqCisgKiBFbGltaW5hdGVzIHRoZSBzZWNvbmQgc3dpenpsZSBpbiBhIHN3aXp6bGUgY2hhaW4uCisgKi8KKworI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiaXJfdmlzaXRvci5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgaXJfc3dpenpsZV9zd2l6emxlX3Zpc2l0b3IgOiBwdWJsaWMgaXJfaGllcmFyY2hpY2FsX3Zpc2l0b3IgeworcHVibGljOgorICAgaXJfc3dpenpsZV9zd2l6emxlX3Zpc2l0b3IoKQorICAgeworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9zd2l6emxlICopOworCisgICBib29sIHByb2dyZXNzOworfTsKKworfSAvKiB1bm5hbWVkIG5hbWVzcGFjZSAqLworCitpcl92aXNpdG9yX3N0YXR1cworaXJfc3dpenpsZV9zd2l6emxlX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX3N3aXp6bGUgKmlyKQoreworICAgaW50IG1hc2syWzRdOworCisgICBpcl9zd2l6emxlICpzd2l6MiA9IGlyLT52YWwtPmFzX3N3aXp6bGUoKTsKKyAgIGlmICghc3dpejIpCisgICAgICByZXR1cm4gdmlzaXRfY29udGludWU7CisKKyAgIG1lbXNldCgmbWFzazIsIDAsIHNpemVvZihtYXNrMikpOworICAgaWYgKHN3aXoyLT5tYXNrLm51bV9jb21wb25lbnRzID49IDEpCisgICAgICBtYXNrMlswXSA9IHN3aXoyLT5tYXNrLng7CisgICBpZiAoc3dpejItPm1hc2subnVtX2NvbXBvbmVudHMgPj0gMikKKyAgICAgIG1hc2syWzFdID0gc3dpejItPm1hc2sueTsKKyAgIGlmIChzd2l6Mi0+bWFzay5udW1fY29tcG9uZW50cyA+PSAzKQorICAgICAgbWFzazJbMl0gPSBzd2l6Mi0+bWFzay56OworICAgaWYgKHN3aXoyLT5tYXNrLm51bV9jb21wb25lbnRzID49IDQpCisgICAgICBtYXNrMlszXSA9IHN3aXoyLT5tYXNrLnc7CisKKyAgIGlmIChpci0+bWFzay5udW1fY29tcG9uZW50cyA+PSAxKQorICAgICAgaXItPm1hc2sueCA9IG1hc2syW2lyLT5tYXNrLnhdOworICAgaWYgKGlyLT5tYXNrLm51bV9jb21wb25lbnRzID49IDIpCisgICAgICBpci0+bWFzay55ID0gbWFzazJbaXItPm1hc2sueV07CisgICBpZiAoaXItPm1hc2subnVtX2NvbXBvbmVudHMgPj0gMykKKyAgICAgIGlyLT5tYXNrLnogPSBtYXNrMltpci0+bWFzay56XTsKKyAgIGlmIChpci0+bWFzay5udW1fY29tcG9uZW50cyA+PSA0KQorICAgICAgaXItPm1hc2sudyA9IG1hc2syW2lyLT5tYXNrLnddOworCisgICBpci0+dmFsID0gc3dpejItPnZhbDsKKworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKy8qKgorICogRG9lcyBhIGNvcHkgcHJvcGFnYXRpb24gcGFzcyBvbiB0aGUgY29kZSBwcmVzZW50IGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uCisgKi8KK2Jvb2wKK2RvX3N3aXp6bGVfc3dpenpsZShleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX3N3aXp6bGVfc3dpenpsZV92aXNpdG9yIHY7CisKKyAgIHYucnVuKGluc3RydWN0aW9ucyk7CisKKyAgIHJldHVybiB2LnByb2dyZXNzOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfdHJlZV9ncmFmdGluZy5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF90cmVlX2dyYWZ0aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc2MTNjCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vcHRfdHJlZV9ncmFmdGluZy5jcHAKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIG9wdF90cmVlX2dyYWZ0aW5nLmNwcAorICoKKyAqIFRha2VzIGFzc2lnbm1lbnRzIHRvIHZhcmlhYmxlcyB0aGF0IGFyZSBkZXJlZmVyZW5jZWQgb25seSBvbmNlIGFuZAorICogcGFzdGVzIHRoZSBSSFMgZXhwcmVzc2lvbiBpbnRvIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyBkZXJlZmVyZW5jZWQuCisgKgorICogSW4gdGhlIHByb2Nlc3Mgb2YgdmFyaW91cyBvcGVyYXRpb25zIGxpa2UgZnVuY3Rpb24gaW5saW5pbmcgYW5kCisgKiB0ZXJ0aWFyeSBvcCBoYW5kbGluZywgd2UnbGwgZW5kIHVwIHdpdGggb3VyIGV4cHJlc3Npb24gdHJlZXMgaGF2aW5nCisgKiBiZWVuIGNob3BwZWQgdXAgaW50byBhIHNlcmllcyBvZiBhc3NpZ25tZW50cyBvZiBzaG9ydCBleHByZXNzaW9ucworICogdG8gdGVtcHMuICBPdGhlciBwYXNzZXMgbGlrZSBpcl9hbGdlYnJhaWMuY3BwIHdvdWxkIHByZWZlciB0byBzZWUKKyAqIHRoZSBkZWVwZXN0IGV4cHJlc3Npb24gdHJlZXMgdGhleSBjYW4gdG8gdHJ5IHRvIG9wdGltaXplIHRoZW0uCisgKgorICogVGhpcyBpcyBhIGxvdCBsaWtlIGNvcHkgcHJvcGFnYXRvbi4gIEluIGNvbXBhcmlzb24sIGNvcHkKKyAqIHByb3BhZ2F0aW9uIG9ubHkgYWN0cyBvbiBwbGFpbiBjb3BpZXMsIG5vdCBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgb24KKyAqIHRoZSBSSFMuICBHZW5lcmFsbHksIHdlIHdvdWxkbid0IHdhbnQgdG8gZ28gcGFzdGluZyBzb21lCisgKiBjb21wbGljYXRlZCBleHByZXNzaW9uIGV2ZXJ5d2hlcmUgaXQgZ290IHVzZWQsIHRob3VnaCwgc28gd2UgZG9uJ3QKKyAqIGhhbmRsZSBleHByZXNzaW9ucyBpbiB0aGF0IHBhc3MuCisgKgorICogVGhlIGhhcmQgcGFydCBpcyBtYWtpbmcgc3VyZSB3ZSBkb24ndCBtb3ZlIGFuIGV4cHJlc3Npb24gYWNyb3NzCisgKiBzb21lIG90aGVyIGFzc2lnbm1lbnRzIHRoYXQgd291bGQgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIGV4cHJlc3Npb24uICBTbyB3ZSBzcGxpdCB0aGlzIGludG8gdHdvIHBhc3NlczogRmlyc3QsIGZpbmQgdGhlCisgKiB2YXJpYWJsZXMgaW4gb3VyIHNjb3BlIHdoaWNoIGFyZSB3cml0dGVuIHRvIG9uY2UgYW5kIHJlYWQgb25jZSwgYW5kCisgKiB0aGVuIGdvIHRocm91Z2ggYmFzaWMgYmxvY2tzIHNlZWluZyBpZiB3ZSBmaW5kIGFuIG9wcG9ydHVuaXR5IHRvCisgKiBtb3ZlIHRob3NlIGV4cHJlc3Npb25zIHNhZmVseS4KKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfdmFyaWFibGVfcmVmY291bnQuaCIKKyNpbmNsdWRlICJpcl9iYXNpY19ibG9jay5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgImdsc2xfdHlwZXMuaCIKKworbmFtZXNwYWNlIHsKKworc3RhdGljIGJvb2wgZGVidWcgPSBmYWxzZTsKKworY2xhc3MgaXJfdHJlZV9ncmFmdGluZ192aXNpdG9yIDogcHVibGljIGlyX2hpZXJhcmNoaWNhbF92aXNpdG9yIHsKK3B1YmxpYzoKKyAgIGlyX3RyZWVfZ3JhZnRpbmdfdmlzaXRvcihpcl9hc3NpZ25tZW50ICpncmFmdF9hc3NpZ24sCisJCQkgICAgaXJfdmFyaWFibGUgKmdyYWZ0X3ZhcikKKyAgIHsKKyAgICAgIHRoaXMtPnByb2dyZXNzID0gZmFsc2U7CisgICAgICB0aGlzLT5ncmFmdF9hc3NpZ24gPSBncmFmdF9hc3NpZ247CisgICAgICB0aGlzLT5ncmFmdF92YXIgPSBncmFmdF92YXI7CisgICB9CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoY2xhc3MgaXJfYXNzaWdubWVudCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfY2FsbCAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfZXhwcmVzc2lvbiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfZnVuY3Rpb24gKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2Z1bmN0aW9uX3NpZ25hdHVyZSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoY2xhc3MgaXJfaWYgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX2xvb3AgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX3N3aXp6bGUgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGNsYXNzIGlyX3RleHR1cmUgKik7CisKKyAgIGlyX3Zpc2l0b3Jfc3RhdHVzIGNoZWNrX2dyYWZ0KGlyX2luc3RydWN0aW9uICppciwgaXJfdmFyaWFibGUgKnZhcik7CisKKyAgIGJvb2wgZG9fZ3JhZnQoaXJfcnZhbHVlICoqcnZhbHVlKTsKKworICAgYm9vbCBwcm9ncmVzczsKKyAgIGlyX3ZhcmlhYmxlICpncmFmdF92YXI7CisgICBpcl9hc3NpZ25tZW50ICpncmFmdF9hc3NpZ247Cit9OworCitzdHJ1Y3QgZmluZF9kZXJlZl9pbmZvIHsKKyAgIGlyX3ZhcmlhYmxlICp2YXI7CisgICBib29sIGZvdW5kOworfTsKKwordm9pZAorZGVyZWZlcmVuY2VzX3ZhcmlhYmxlX2NhbGxiYWNrKGlyX2luc3RydWN0aW9uICppciwgdm9pZCAqZGF0YSkKK3sKKyAgIHN0cnVjdCBmaW5kX2RlcmVmX2luZm8gKmluZm8gPSAoc3RydWN0IGZpbmRfZGVyZWZfaW5mbyAqKWRhdGE7CisgICBpcl9kZXJlZmVyZW5jZV92YXJpYWJsZSAqZGVyZWYgPSBpci0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKworICAgaWYgKGRlcmVmICYmIGRlcmVmLT52YXIgPT0gaW5mby0+dmFyKQorICAgICAgaW5mby0+Zm91bmQgPSB0cnVlOworfQorCitzdGF0aWMgYm9vbAorZGVyZWZlcmVuY2VzX3ZhcmlhYmxlKGlyX2luc3RydWN0aW9uICppciwgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIHN0cnVjdCBmaW5kX2RlcmVmX2luZm8gaW5mbzsKKworICAgaW5mby52YXIgPSB2YXI7CisgICBpbmZvLmZvdW5kID0gZmFsc2U7CisKKyAgIHZpc2l0X3RyZWUoaXIsIGRlcmVmZXJlbmNlc192YXJpYWJsZV9jYWxsYmFjaywgJmluZm8pOworCisgICByZXR1cm4gaW5mby5mb3VuZDsKK30KKworYm9vbAoraXJfdHJlZV9ncmFmdGluZ192aXNpdG9yOjpkb19ncmFmdChpcl9ydmFsdWUgKipydmFsdWUpCit7CisgICBpZiAoISpydmFsdWUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlyX2RlcmVmZXJlbmNlX3ZhcmlhYmxlICpkZXJlZiA9ICgqcnZhbHVlKS0+YXNfZGVyZWZlcmVuY2VfdmFyaWFibGUoKTsKKworICAgaWYgKCFkZXJlZiB8fCBkZXJlZi0+dmFyICE9IHRoaXMtPmdyYWZ0X3ZhcikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgaWYgKGRlYnVnKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdSQUZUSU5HOlxuIik7CisgICAgICB0aGlzLT5ncmFmdF9hc3NpZ24tPmZwcmludChzdGRlcnIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJUTzpcbiIpOworICAgICAgKCpydmFsdWUpLT5mcHJpbnQoc3RkZXJyKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgIH0KKworICAgdGhpcy0+Z3JhZnRfYXNzaWduLT5yZW1vdmUoKTsKKyAgICpydmFsdWUgPSB0aGlzLT5ncmFmdF9hc3NpZ24tPnJoczsKKworICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgcmV0dXJuIHRydWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl90cmVlX2dyYWZ0aW5nX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2xvb3AgKmlyKQoreworICAgKHZvaWQpaXI7CisgICAvKiBEbyBub3QgdHJhdmVyc2UgaW50byB0aGUgYm9keSBvZiB0aGUgbG9vcCBzaW5jZSB0aGF0IGlzIGEKKyAgICAqIGRpZmZlcmVudCBiYXNpYyBibG9jay4KKyAgICAqLworICAgcmV0dXJuIHZpc2l0X3N0b3A7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgd2UgY2FuIGNvbnRpbnVlIGdyYWZ0aW5nIGFmdGVyIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS4gIElmIHRoZQorICogZXhwcmVzc2lvbiB3ZSdyZSB0cnlpbmcgdG8gZ3JhZnQgcmVmZXJlbmNlcyB0aGUgdmFyaWFibGUsIHdlIG11c3Qgc3RvcC4KKyAqCisgKiBccGFyYW0gaXIgICBBbiBpbnN0cnVjdGlvbiB0aGF0IHdyaXRlcyB0byBhIHZhcmlhYmxlLgorICogXHBhcmFtIHZhciAgVGhlIHZhcmlhYmxlIGJlaW5nIHVwZGF0ZWQuCisgKi8KK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl90cmVlX2dyYWZ0aW5nX3Zpc2l0b3I6OmNoZWNrX2dyYWZ0KGlyX2luc3RydWN0aW9uICppciwgaXJfdmFyaWFibGUgKnZhcikKK3sKKyAgIGlmIChkZXJlZmVyZW5jZXNfdmFyaWFibGUodGhpcy0+Z3JhZnRfYXNzaWduLT5yaHMsIHZhcikpIHsKKyAgICAgIGlmIChkZWJ1ZykgeworCSBmcHJpbnRmKHN0ZGVyciwgImdyYWZ0IGtpbGxlZCBieTogIik7CisJIGlyLT5mcHJpbnQoc3RkZXJyKTsKKwkgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgfQorICAgICAgcmV0dXJuIHZpc2l0X3N0b3A7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3RyZWVfZ3JhZnRpbmdfdmlzaXRvcjo6dmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpZiAoZG9fZ3JhZnQoJmlyLT5yaHMpIHx8CisgICAgICAgZG9fZ3JhZnQoJmlyLT5jb25kaXRpb24pKQorICAgICAgcmV0dXJuIHZpc2l0X3N0b3A7CisKKyAgIC8qIElmIHRoaXMgYXNzaWdubWVudCB1cGRhdGVzIGEgdmFyaWFibGUgdXNlZCBpbiB0aGUgYXNzaWdubWVudAorICAgICogd2UncmUgdHJ5aW5nIHRvIGdyYWZ0LCB0aGVuIHdlJ3JlIGRvbmUuCisgICAgKi8KKyAgIHJldHVybiBjaGVja19ncmFmdChpciwgaXItPmxocy0+dmFyaWFibGVfcmVmZXJlbmNlZCgpKTsKK30KKworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3RyZWVfZ3JhZnRpbmdfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfZnVuY3Rpb24gKmlyKQoreworICAgKHZvaWQpIGlyOworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdHJlZV9ncmFmdGluZ192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9mdW5jdGlvbl9zaWduYXR1cmUgKmlyKQoreworICAgKHZvaWQpaXI7CisgICByZXR1cm4gdmlzaXRfY29udGludWVfd2l0aF9wYXJlbnQ7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl90cmVlX2dyYWZ0aW5nX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2NhbGwgKmlyKQoreworICAgZm9yZWFjaF90d29fbGlzdHMoZm9ybWFsX25vZGUsICZpci0+Y2FsbGVlLT5wYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX25vZGUsICZpci0+YWN0dWFsX3BhcmFtZXRlcnMpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpzaWdfcGFyYW0gPSAoaXJfdmFyaWFibGUgKikgZm9ybWFsX25vZGU7CisgICAgICBpcl9ydmFsdWUgKmlyID0gKGlyX3J2YWx1ZSAqKSBhY3R1YWxfbm9kZTsKKyAgICAgIGlyX3J2YWx1ZSAqbmV3X2lyID0gaXI7CisKKyAgICAgIGlmIChzaWdfcGFyYW0tPmRhdGEubW9kZSAhPSBpcl92YXJfZnVuY3Rpb25faW4KKyAgICAgICAgICAmJiBzaWdfcGFyYW0tPmRhdGEubW9kZSAhPSBpcl92YXJfY29uc3RfaW4pIHsKKwkgaWYgKGNoZWNrX2dyYWZ0KGlyLCBzaWdfcGFyYW0pID09IHZpc2l0X3N0b3ApCisJICAgIHJldHVybiB2aXNpdF9zdG9wOworCSBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRvX2dyYWZ0KCZuZXdfaXIpKSB7CisJIGlyLT5yZXBsYWNlX3dpdGgobmV3X2lyKTsKKwkgcmV0dXJuIHZpc2l0X3N0b3A7CisgICAgICB9CisgICB9CisKKyAgIGlmIChpci0+cmV0dXJuX2RlcmVmICYmIGNoZWNrX2dyYWZ0KGlyLCBpci0+cmV0dXJuX2RlcmVmLT52YXIpID09IHZpc2l0X3N0b3ApCisgICAgICByZXR1cm4gdmlzaXRfc3RvcDsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdHJlZV9ncmFmdGluZ192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXItPmdldF9udW1fb3BlcmFuZHMoKTsgaSsrKSB7CisgICAgICBpZiAoZG9fZ3JhZnQoJmlyLT5vcGVyYW5kc1tpXSkpCisJIHJldHVybiB2aXNpdF9zdG9wOworICAgfQorCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl90cmVlX2dyYWZ0aW5nX3Zpc2l0b3I6OnZpc2l0X2VudGVyKGlyX2lmICppcikKK3sKKyAgIGlmIChkb19ncmFmdCgmaXItPmNvbmRpdGlvbikpCisgICAgICByZXR1cm4gdmlzaXRfc3RvcDsKKworICAgLyogRG8gbm90IHRyYXZlcnNlIGludG8gdGhlIGJvZHkgb2YgdGhlIGlmLXN0YXRlbWVudCBzaW5jZSB0aGF0IGlzIGEKKyAgICAqIGRpZmZlcmVudCBiYXNpYyBibG9jay4KKyAgICAqLworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdHJlZV9ncmFmdGluZ192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9zd2l6emxlICppcikKK3sKKyAgIGlmIChkb19ncmFmdCgmaXItPnZhbCkpCisgICAgICByZXR1cm4gdmlzaXRfc3RvcDsKKworICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCitpcl92aXNpdG9yX3N0YXR1cworaXJfdHJlZV9ncmFmdGluZ192aXNpdG9yOjp2aXNpdF9lbnRlcihpcl90ZXh0dXJlICppcikKK3sKKyAgIGlmIChkb19ncmFmdCgmaXItPmNvb3JkaW5hdGUpIHx8CisgICAgICAgZG9fZ3JhZnQoJmlyLT5wcm9qZWN0b3IpIHx8CisgICAgICAgZG9fZ3JhZnQoJmlyLT5vZmZzZXQpIHx8CisgICAgICAgZG9fZ3JhZnQoJmlyLT5zaGFkb3dfY29tcGFyaXRvcikpCisJIHJldHVybiB2aXNpdF9zdG9wOworCisgICBzd2l0Y2ggKGlyLT5vcCkgeworICAgY2FzZSBpcl90ZXg6CisgICBjYXNlIGlyX2xvZDoKKyAgIGNhc2UgaXJfcXVlcnlfbGV2ZWxzOgorICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4YjoKKyAgICAgIGlmIChkb19ncmFmdCgmaXItPmxvZF9pbmZvLmJpYXMpKQorCSByZXR1cm4gdmlzaXRfc3RvcDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBpcl90eGY6CisgICBjYXNlIGlyX3R4bDoKKyAgIGNhc2UgaXJfdHhzOgorICAgICAgaWYgKGRvX2dyYWZ0KCZpci0+bG9kX2luZm8ubG9kKSkKKwkgcmV0dXJuIHZpc2l0X3N0b3A7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdHhmX21zOgorICAgICAgaWYgKGRvX2dyYWZ0KCZpci0+bG9kX2luZm8uc2FtcGxlX2luZGV4KSkKKyAgICAgICAgIHJldHVybiB2aXNpdF9zdG9wOworICAgICAgYnJlYWs7CisgICBjYXNlIGlyX3R4ZDoKKyAgICAgIGlmIChkb19ncmFmdCgmaXItPmxvZF9pbmZvLmdyYWQuZFBkeCkgfHwKKwkgIGRvX2dyYWZ0KCZpci0+bG9kX2luZm8uZ3JhZC5kUGR5KSkKKwkgcmV0dXJuIHZpc2l0X3N0b3A7CisgICAgICBicmVhazsKKyAgIGNhc2UgaXJfdGc0OgorICAgICAgaWYgKGRvX2dyYWZ0KCZpci0+bG9kX2luZm8uY29tcG9uZW50KSkKKyAgICAgICAgIHJldHVybiB2aXNpdF9zdG9wOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworc3RydWN0IHRyZWVfZ3JhZnRpbmdfaW5mbyB7CisgICBpcl92YXJpYWJsZV9yZWZjb3VudF92aXNpdG9yICpyZWZzOworICAgYm9vbCBwcm9ncmVzczsKK307CisKK3N0YXRpYyBib29sCit0cnlfdHJlZV9ncmFmdGluZyhpcl9hc3NpZ25tZW50ICpzdGFydCwKKwkJICBpcl92YXJpYWJsZSAqbGhzX3ZhciwKKwkJICBpcl9pbnN0cnVjdGlvbiAqYmJfbGFzdCkKK3sKKyAgIGlyX3RyZWVfZ3JhZnRpbmdfdmlzaXRvciB2KHN0YXJ0LCBsaHNfdmFyKTsKKworICAgaWYgKGRlYnVnKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInRyeWluZyB0byBncmFmdDogIik7CisgICAgICBsaHNfdmFyLT5mcHJpbnQoc3RkZXJyKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgIH0KKworICAgZm9yIChpcl9pbnN0cnVjdGlvbiAqaXIgPSAoaXJfaW5zdHJ1Y3Rpb24gKilzdGFydC0+bmV4dDsKKwlpciAhPSBiYl9sYXN0LT5uZXh0OworCWlyID0gKGlyX2luc3RydWN0aW9uICopaXItPm5leHQpIHsKKworICAgICAgaWYgKGRlYnVnKSB7CisJIGZwcmludGYoc3RkZXJyLCAiLSAiKTsKKwkgaXItPmZwcmludChzdGRlcnIpOworCSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICB9CisKKyAgICAgIGlyX3Zpc2l0b3Jfc3RhdHVzIHMgPSBpci0+YWNjZXB0KCZ2KTsKKyAgICAgIGlmIChzID09IHZpc2l0X3N0b3ApCisJIHJldHVybiB2LnByb2dyZXNzOworICAgfQorCisgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkCit0cmVlX2dyYWZ0aW5nX2Jhc2ljX2Jsb2NrKGlyX2luc3RydWN0aW9uICpiYl9maXJzdCwKKwkJCSAgaXJfaW5zdHJ1Y3Rpb24gKmJiX2xhc3QsCisJCQkgIHZvaWQgKmRhdGEpCit7CisgICBzdHJ1Y3QgdHJlZV9ncmFmdGluZ19pbmZvICppbmZvID0gKHN0cnVjdCB0cmVlX2dyYWZ0aW5nX2luZm8gKilkYXRhOworICAgaXJfaW5zdHJ1Y3Rpb24gKmlyLCAqbmV4dDsKKworICAgZm9yIChpciA9IGJiX2ZpcnN0LCBuZXh0ID0gKGlyX2luc3RydWN0aW9uICopaXItPm5leHQ7CisJaXIgIT0gYmJfbGFzdC0+bmV4dDsKKwlpciA9IG5leHQsIG5leHQgPSAoaXJfaW5zdHJ1Y3Rpb24gKilpci0+bmV4dCkgeworICAgICAgaXJfYXNzaWdubWVudCAqYXNzaWduID0gaXItPmFzX2Fzc2lnbm1lbnQoKTsKKworICAgICAgaWYgKCFhc3NpZ24pCisJIGNvbnRpbnVlOworCisgICAgICBpcl92YXJpYWJsZSAqbGhzX3ZhciA9IGFzc2lnbi0+d2hvbGVfdmFyaWFibGVfd3JpdHRlbigpOworICAgICAgaWYgKCFsaHNfdmFyKQorCSBjb250aW51ZTsKKworICAgICAgaWYgKGxoc192YXItPmRhdGEubW9kZSA9PSBpcl92YXJfZnVuY3Rpb25fb3V0IHx8CisJICBsaHNfdmFyLT5kYXRhLm1vZGUgPT0gaXJfdmFyX2Z1bmN0aW9uX2lub3V0IHx8CisgICAgICAgICAgbGhzX3Zhci0+ZGF0YS5tb2RlID09IGlyX3Zhcl9zaGFkZXJfb3V0KQorCSBjb250aW51ZTsKKworICAgICAgaXJfdmFyaWFibGVfcmVmY291bnRfZW50cnkgKmVudHJ5ID0gaW5mby0+cmVmcy0+Z2V0X3ZhcmlhYmxlX2VudHJ5KGxoc192YXIpOworCisgICAgICBpZiAoIWVudHJ5LT5kZWNsYXJhdGlvbiB8fAorCSAgZW50cnktPmFzc2lnbmVkX2NvdW50ICE9IDEgfHwKKwkgIGVudHJ5LT5yZWZlcmVuY2VkX2NvdW50ICE9IDIpCisJIGNvbnRpbnVlOworCisgICAgICBhc3NlcnQoYXNzaWduID09IGVudHJ5LT5hc3NpZ24pOworCisgICAgICAvKiBGb3VuZCBhIHBvc3NpYmx5IGdyYWZ0YWJsZSBhc3NpZ25tZW50LiAgTm93LCB3YWxrIHRocm91Z2ggdGhlCisgICAgICAgKiByZXN0IG9mIHRoZSBCQiBzZWVpbmcgaWYgdGhlIGRlcmVmIGlzIGhlcmUsIGFuZCBpZiBub3RoaW5nIGludGVyZmVyZWQgd2l0aAorICAgICAgICogcGFzdGluZyBpdHMgZXhwcmVzc2lvbidzIHZhbHVlcyBpbiBiZXR3ZWVuLgorICAgICAgICovCisgICAgICBpbmZvLT5wcm9ncmVzcyB8PSB0cnlfdHJlZV9ncmFmdGluZyhhc3NpZ24sIGxoc192YXIsIGJiX2xhc3QpOworICAgfQorfQorCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKKy8qKgorICogRG9lcyBhIGNvcHkgcHJvcGFnYXRpb24gcGFzcyBvbiB0aGUgY29kZSBwcmVzZW50IGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uCisgKi8KK2Jvb2wKK2RvX3RyZWVfZ3JhZnRpbmcoZXhlY19saXN0ICppbnN0cnVjdGlvbnMpCit7CisgICBpcl92YXJpYWJsZV9yZWZjb3VudF92aXNpdG9yIHJlZnM7CisgICBzdHJ1Y3QgdHJlZV9ncmFmdGluZ19pbmZvIGluZm87CisKKyAgIGluZm8ucHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIGluZm8ucmVmcyA9ICZyZWZzOworCisgICB2aXNpdF9saXN0X2VsZW1lbnRzKGluZm8ucmVmcywgaW5zdHJ1Y3Rpb25zKTsKKworICAgY2FsbF9mb3JfYmFzaWNfYmxvY2tzKGluc3RydWN0aW9ucywgdHJlZV9ncmFmdGluZ19iYXNpY19ibG9jaywgJmluZm8pOworCisgICByZXR1cm4gaW5mby5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3B0X3ZlY3Rvcml6ZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF92ZWN0b3JpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YTNiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL29wdF92ZWN0b3JpemUuY3BwCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBvcHRfdmVjdG9yaXplLmNwcAorICoKKyAqIENvbWJpbmVzIHNjYWxhciBhc3NpZ25tZW50cyBvZiB0aGUgc2FtZSBleHByZXNzaW9uIChtb2R1bG8gc3dpenpsZSkgdG8KKyAqIG11bHRpcGxlIGNoYW5uZWxzIG9mIHRoZSBzYW1lIHZhcmlhYmxlIGludG8gYSBzaW5nbGUgdmVjdG9yaXplZCBleHByZXNzaW9uCisgKiBhbmQgYXNzaWdubWVudC4KKyAqCisgKiBNYW55IGdlbmVyYXRlZCBzaGFkZXJzIGNvbnRhaW4gc2NhbGFyaXplZCBjb2RlLiBUaGF0IGlzLCB0aGV5IGNvbnRhaW4KKyAqCisgKiByMS54ID0gbG9nMih2MC54KTsKKyAqIHIxLnkgPSBsb2cyKHYwLnkpOworICogcjEueiA9IGxvZzIodjAueik7CisgKgorICogcmF0aGVyIHRoYW4KKyAqCisgKiByMS54eXogPSBsb2cyKHYwLnh5eik7CisgKgorICogV2UgbG9vayBmb3IgY29uc2VjdXRpdmUgYXNzaWdubWVudHMgb2YgdGhlIHNhbWUgZXhwcmVzc2lvbiAobW9kdWxvIHN3aXp6bGUpCisgKiB0byBlYWNoIGNoYW5uZWwgb2YgdGhlIHNhbWUgdmFyaWFibGUuCisgKgorICogRm9yIGluc3RhbmNlLCB3ZSB3YW50IHRvIGNvbnZlcnQgdGhlc2UgdGhyZWUgc2NhbGFyIG9wZXJhdGlvbnMKKyAqCisgKiAoYXNzaWduICh4KSAodmFyX3JlZiByMSkgKGV4cHJlc3Npb24gZmxvYXQgbG9nMiAoc3dpeiB4ICh2YXJfcmVmIHYwKSkpKQorICogKGFzc2lnbiAoeSkgKHZhcl9yZWYgcjEpIChleHByZXNzaW9uIGZsb2F0IGxvZzIgKHN3aXogeSAodmFyX3JlZiB2MCkpKSkKKyAqIChhc3NpZ24gKHopICh2YXJfcmVmIHIxKSAoZXhwcmVzc2lvbiBmbG9hdCBsb2cyIChzd2l6IHogKHZhcl9yZWYgdjApKSkpCisgKgorICogaW50byBhIHNpbmdsZSB2ZWN0b3Igb3BlcmF0aW9uCisgKgorICogKGFzc2lnbiAoeHl6KSAodmFyX3JlZiByMSkgKGV4cHJlc3Npb24gdmVjMyBsb2cyIChzd2l6IHh5eiAodmFyX3JlZiB2MCkpKSkKKyAqLworCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJpcl92aXNpdG9yLmgiCisjaW5jbHVkZSAiaXJfb3B0aW1pemF0aW9uLmgiCisjaW5jbHVkZSAiZ2xzbF90eXBlcy5oIgorI2luY2x1ZGUgInByb2dyYW0vcHJvZ19pbnN0cnVjdGlvbi5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBpcl92ZWN0b3JpemVfdmlzaXRvciA6IHB1YmxpYyBpcl9oaWVyYXJjaGljYWxfdmlzaXRvciB7CitwdWJsaWM6CisgICB2b2lkIGNsZWFyKCkKKyAgIHsKKyAgICAgIGFzc2lnbm1lbnRbMF0gPSBOVUxMOworICAgICAgYXNzaWdubWVudFsxXSA9IE5VTEw7CisgICAgICBhc3NpZ25tZW50WzJdID0gTlVMTDsKKyAgICAgIGFzc2lnbm1lbnRbM10gPSBOVUxMOworICAgICAgY3VycmVudF9hc3NpZ25tZW50ID0gTlVMTDsKKyAgICAgIGxhc3RfYXNzaWdubWVudCA9IE5VTEw7CisgICAgICBjaGFubmVscyA9IDA7CisgICAgICBoYXNfc3dpenpsZSA9IGZhbHNlOworICAgfQorCisgICBpcl92ZWN0b3JpemVfdmlzaXRvcigpCisgICB7CisgICAgICBjbGVhcigpOworICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKyAgIH0KKworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9hc3NpZ25tZW50ICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9zd2l6emxlICopOworICAgdmlydHVhbCBpcl92aXNpdG9yX3N0YXR1cyB2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9hcnJheSAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfZXhwcmVzc2lvbiAqKTsKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfZW50ZXIoaXJfaWYgKik7CisgICB2aXJ0dWFsIGlyX3Zpc2l0b3Jfc3RhdHVzIHZpc2l0X2VudGVyKGlyX2xvb3AgKik7CisKKyAgIHZpcnR1YWwgaXJfdmlzaXRvcl9zdGF0dXMgdmlzaXRfbGVhdmUoaXJfYXNzaWdubWVudCAqKTsKKworICAgdm9pZCB0cnlfdmVjdG9yaXplKCk7CisKKyAgIGlyX2Fzc2lnbm1lbnQgKmFzc2lnbm1lbnRbNF07CisgICBpcl9hc3NpZ25tZW50ICpjdXJyZW50X2Fzc2lnbm1lbnQsICpsYXN0X2Fzc2lnbm1lbnQ7CisgICB1bnNpZ25lZCBjaGFubmVsczsKKyAgIGJvb2wgaGFzX3N3aXp6bGU7CisKKyAgIGJvb2wgcHJvZ3Jlc3M7Cit9OworCit9IC8qIHVubmFtZWQgbmFtZXNwYWNlICovCisKKy8qKgorICogUmV3cml0ZXMgdGhlIHN3aXp6bGVzIGFuZCB0eXBlcyBvZiBhIHJpZ2h0LWhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LgorICoKKyAqIEZyb20gdGhlIGV4YW1wbGUgYWJvdmUsIHRoaXMgZnVuY3Rpb24gd291bGQgYmUgY2FsbGVkIChieSB2aXNpdF90cmVlKCkpIG9uCisgKiB0aGUgbm9kZXMgb2YgdGhlIHRyZWUgKGV4cHJlc3Npb24gZmxvYXQgbG9nMiAoc3dpeiB6ICAgKHZhcl9yZWYgdjApKSksCisgKiByZXdyaXRpbmcgaXQgaW50byAgICAgKGV4cHJlc3Npb24gdmVjMyAgbG9nMiAoc3dpeiB4eXogKHZhcl9yZWYgdjApKSkuCisgKgorICogVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIGlyX2V4cHJlc3Npb25zIChhbmQgaXRzIG9wZXJhbmRzKSBhbmQgaXJfc3dpenpsZXMuCisgKiBGb3IgZXhwcmVzc2lvbnMgaXQgc2V0cyBhIG5ldyB0eXBlIGFuZCBzd2l6emxlcyBhbnkgbm9uLWV4cHJlc3Npb24gYW5kIG5vbi0KKyAqIHN3aXp6bGUgc2NhbGFyIG9wZXJhbmRzIGludG8gYXBwcm9wcmlhdGVseSBzaXplZCB2ZWN0b3IgYXJndW1lbnRzLiBGb3IKKyAqIGV4YW1wbGUsIGlmIGNvbWJpbmluZworICoKKyAqIChhc3NpZ24gKHgpICh2YXJfcmVmIHIxKSAoZXhwcmVzc2lvbiBmbG9hdCArIChzd2l6IHggKHZhcl9yZWYgdjApICh2YXJfcmVmIHYxKSkpKQorICogKGFzc2lnbiAoeSkgKHZhcl9yZWYgcjEpIChleHByZXNzaW9uIGZsb2F0ICsgKHN3aXogeSAodmFyX3JlZiB2MCkgKHZhcl9yZWYgdjEpKSkpCisgKgorICogd2hlcmUgdjEgaXMgYSBzY2FsYXIsIHJld3JpdGVfc3dpenpsZSgpIHdvdWxkIGluc2VydCBhIHN3aXp6bGUgb24KKyAqICh2YXJfcmVmIHYxKSBzdWNoIHRoYXQgdGhlIGZpbmFsIHJlc3VsdCB3YXMKKyAqCisgKiAoYXNzaWduICh4eSkgKHZhcl9yZWYgcjEpIChleHByZXNzaW9uIHZlYzIgKyAoc3dpeiB4eSAodmFyX3JlZiB2MCkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3dpeiB4eCAodmFyX3JlZiB2MSkpKSkKKyAqCisgKiBGb3Igc3dpenpsZXMsIGl0IHNldHMgYSBuZXcgdHlwZSwgYW5kIGlmIHRoZSB2YXJpYWJsZSBiZWluZyBzd2l6emxlZCBpcyBhCisgKiB2ZWN0b3IgaXQgb3ZlcndyaXRlcyB0aGUgc3dpenpsZSBtYXNrIHdpdGggdGhlIGlyX3N3aXp6bGVfbWFzayBwYXNzZWQgYXMgdGhlCisgKiBkYXRhIHBhcmFtZXRlci4gSWYgdGhlIHN3aXp6bGVkIHZhcmlhYmxlIGlzIHNjYWxhciwgdGhlbiB0aGUgc3dpenpsZSB3YXMKKyAqIGFkZGVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0byByZXdyaXRlX3N3aXp6bGUoKSBvbiBhbiBleHByZXNzaW9uLCBzbyB0aGUKKyAqIG1hc2sgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KKyAqLworc3RhdGljIHZvaWQKK3Jld3JpdGVfc3dpenpsZShpcl9pbnN0cnVjdGlvbiAqaXIsIHZvaWQgKmRhdGEpCit7CisgICBpcl9zd2l6emxlX21hc2sgKm1hc2sgPSAoaXJfc3dpenpsZV9tYXNrICopZGF0YTsKKworICAgc3dpdGNoIChpci0+aXJfdHlwZSkgeworICAgY2FzZSBpcl90eXBlX3N3aXp6bGU6IHsKKyAgICAgIGlyX3N3aXp6bGUgKnN3eiA9IChpcl9zd2l6emxlICopaXI7CisgICAgICBpZiAoc3d6LT52YWwtPnR5cGUtPmlzX3ZlY3RvcigpKSB7CisgICAgICAgICBzd3otPm1hc2sgPSAqbWFzazsKKyAgICAgIH0KKyAgICAgIHN3ei0+dHlwZSA9IGdsc2xfdHlwZTo6Z2V0X2luc3RhbmNlKHN3ei0+dHlwZS0+YmFzZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzay0+bnVtX2NvbXBvbmVudHMsIDEpOworICAgICAgYnJlYWs7CisgICB9CisgICBjYXNlIGlyX3R5cGVfZXhwcmVzc2lvbjogeworICAgICAgaXJfZXhwcmVzc2lvbiAqZXhwciA9IChpcl9leHByZXNzaW9uICopaXI7CisgICAgICBleHByLT50eXBlID0gZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoZXhwci0+dHlwZS0+YmFzZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2stPm51bV9jb21wb25lbnRzLCAxKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgIGlmIChleHByLT5vcGVyYW5kc1tpXSkgeworICAgICAgICAgICAgaXJfcnZhbHVlICpydmFsID0gZXhwci0+b3BlcmFuZHNbaV0tPmFzX3J2YWx1ZSgpOworICAgICAgICAgICAgaWYgKHJ2YWwgJiYgcnZhbC0+dHlwZS0+aXNfc2NhbGFyKCkgJiYKKyAgICAgICAgICAgICAgICAhcnZhbC0+YXNfZXhwcmVzc2lvbigpICYmICFydmFsLT5hc19zd2l6emxlKCkpIHsKKyAgICAgICAgICAgICAgIGV4cHItPm9wZXJhbmRzW2ldID0gbmV3KGlyKSBpcl9zd2l6emxlKHJ2YWwsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrLT5udW1fY29tcG9uZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KK30KKworLyoqCisgKiBBdHRlbXB0IHRvIHZlY3Rvcml6ZSB0aGUgcHJldmlvdXNseSBzYXZlZCBhc3NpZ25tZW50cywgYW5kIGNsZWFyIHRoZW0gZnJvbQorICogY29uc2lkZXJhdGlvbi4KKyAqCisgKiBJZiB0aGUgYXNzaWdubWVudHMgYXJlIGFibGUgdG8gYmUgY29tYmluZWQsIGl0IG1vZGlmaWVzIGluLXBsYWNlIHRoZSBsYXN0CisgKiBhc3NpZ25tZW50IHNlZW4gdG8gYmUgYW4gZXF1aXZhbGVudCB2ZWN0b3IgZm9ybSBvZiB0aGUgc2NhbGFyIGFzc2lnbm1lbnRzLgorICogSXQgdGhlbiByZW1vdmVzIHRoZSBvdGhlciBub3cgb2Jzb2xldGUgc2NhbGFyIGFzc2lnbm1lbnRzLgorICovCit2b2lkCitpcl92ZWN0b3JpemVfdmlzaXRvcjo6dHJ5X3ZlY3Rvcml6ZSgpCit7CisgICBpZiAodGhpcy0+bGFzdF9hc3NpZ25tZW50ICYmIHRoaXMtPmNoYW5uZWxzID4gMSkgeworICAgICAgaXJfc3dpenpsZV9tYXNrIG1hc2sgPSB7MCwgMCwgMCwgMCwgY2hhbm5lbHMsIDB9OworCisgICAgICB0aGlzLT5sYXN0X2Fzc2lnbm1lbnQtPndyaXRlX21hc2sgPSAwOworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgaWYgKHRoaXMtPmFzc2lnbm1lbnRbaV0pIHsKKyAgICAgICAgICAgIHRoaXMtPmxhc3RfYXNzaWdubWVudC0+d3JpdGVfbWFzayB8PSAxIDw8IGk7CisKKyAgICAgICAgICAgIGlmICh0aGlzLT5hc3NpZ25tZW50W2ldICE9IHRoaXMtPmxhc3RfYXNzaWdubWVudCkgeworICAgICAgICAgICAgICAgdGhpcy0+YXNzaWdubWVudFtpXS0+cmVtb3ZlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoaikgeworICAgICAgICAgICAgY2FzZSAwOiBtYXNrLnggPSBpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogbWFzay55ID0gaTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IG1hc2sueiA9IGk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBtYXNrLncgPSBpOyBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaisrOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICB2aXNpdF90cmVlKHRoaXMtPmxhc3RfYXNzaWdubWVudC0+cmhzLCByZXdyaXRlX3N3aXp6bGUsICZtYXNrKTsKKworICAgICAgdGhpcy0+cHJvZ3Jlc3MgPSB0cnVlOworICAgfQorICAgY2xlYXIoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdyaXRlIG1hc2sgaXMgYSBzaW5nbGUgY2hhbm5lbC4KKyAqLworc3RhdGljIGJvb2wKK3NpbmdsZV9jaGFubmVsX3dyaXRlX21hc2sodW5zaWduZWQgd3JpdGVfbWFzaykKK3sKKyAgIHJldHVybiB3cml0ZV9tYXNrICE9IDAgJiYgKHdyaXRlX21hc2sgJiAod3JpdGVfbWFzayAtIDEpKSA9PSAwOworfQorCisvKioKKyAqIFRyYW5zbGF0ZXMgc2luZ2xlLWNoYW5uZWxlZCB3cml0ZSBtYXNrIHRvIHNpbmdsZS1jaGFubmVsZWQgc3dpenpsZS4KKyAqLworc3RhdGljIHVuc2lnbmVkCit3cml0ZV9tYXNrX3RvX3N3aXp6bGUodW5zaWduZWQgd3JpdGVfbWFzaykKK3sKKyAgIHN3aXRjaCAod3JpdGVfbWFzaykgeworICAgY2FzZSBXUklURU1BU0tfWDogcmV0dXJuIFNXSVpaTEVfWDsKKyAgIGNhc2UgV1JJVEVNQVNLX1k6IHJldHVybiBTV0laWkxFX1k7CisgICBjYXNlIFdSSVRFTUFTS19aOiByZXR1cm4gU1dJWlpMRV9aOworICAgY2FzZSBXUklURU1BU0tfVzogcmV0dXJuIFNXSVpaTEVfVzsKKyAgIH0KKyAgIGFzc2VydCghIm5vdCByZWFjaGVkIik7CisgICB1bnJlYWNoYWJsZSgpOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciBhIHNpbmdsZS1jaGFubmVsZWQgd3JpdGUgbWFzayBtYXRjaGVzIGEgc3dpenpsZS4KKyAqLworc3RhdGljIGJvb2wKK3dyaXRlX21hc2tfbWF0Y2hlc19zd2l6emxlKHVuc2lnbmVkIHdyaXRlX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpcl9zd2l6emxlICpzd3opCit7CisgICByZXR1cm4gKCh3cml0ZV9tYXNrID09IFdSSVRFTUFTS19YICYmIHN3ei0+bWFzay54ID09IFNXSVpaTEVfWCkgfHwKKyAgICAgICAgICAgKHdyaXRlX21hc2sgPT0gV1JJVEVNQVNLX1kgJiYgc3d6LT5tYXNrLnggPT0gU1dJWlpMRV9ZKSB8fAorICAgICAgICAgICAod3JpdGVfbWFzayA9PSBXUklURU1BU0tfWiAmJiBzd3otPm1hc2sueCA9PSBTV0laWkxFX1opIHx8CisgICAgICAgICAgICh3cml0ZV9tYXNrID09IFdSSVRFTUFTS19XICYmIHN3ei0+bWFzay54ID09IFNXSVpaTEVfVykpOworfQorCisvKioKKyAqIFVwb24gZW50ZXJpbmcgYW4gaXJfYXNzaWdubWVudCwgYXR0ZW1wdCB0byB2ZWN0b3JpemUgdGhlIGN1cnJlbnRseSB0cmFja2VkCisgKiBhc3NpZ25tZW50cyBpZiB0aGUgY3VycmVudCBhc3NpZ25tZW50IGlzIG5vdCBzdWl0YWJsZS4gS2VlcCBhIHBvaW50ZXIgdG8KKyAqIHRoZSBjdXJyZW50IGFzc2lnbm1lbnQuCisgKi8KK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWN0b3JpemVfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfYXNzaWdubWVudCAqaXIpCit7CisgICBpcl9kZXJlZmVyZW5jZSAqbGhzID0gdGhpcy0+bGFzdF9hc3NpZ25tZW50ICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmxhc3RfYXNzaWdubWVudC0+bGhzIDogTlVMTDsKKyAgIGlyX3J2YWx1ZSAqcmhzID0gdGhpcy0+bGFzdF9hc3NpZ25tZW50ICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICB0aGlzLT5sYXN0X2Fzc2lnbm1lbnQtPnJocyA6IE5VTEw7CisKKyAgIGlmIChpci0+Y29uZGl0aW9uIHx8CisgICAgICAgdGhpcy0+Y2hhbm5lbHMgPj0gNCB8fAorICAgICAgICFzaW5nbGVfY2hhbm5lbF93cml0ZV9tYXNrKGlyLT53cml0ZV9tYXNrKSB8fAorICAgICAgIHRoaXMtPmFzc2lnbm1lbnRbd3JpdGVfbWFza190b19zd2l6emxlKGlyLT53cml0ZV9tYXNrKV0gIT0gTlVMTCB8fAorICAgICAgIChsaHMgJiYgIWlyLT5saHMtPmVxdWFscyhsaHMpKSB8fAorICAgICAgIChyaHMgJiYgIWlyLT5yaHMtPmVxdWFscyhyaHMsIGlyX3R5cGVfc3dpenpsZSkpKSB7CisgICAgICB0cnlfdmVjdG9yaXplKCk7CisgICB9CisKKyAgIHRoaXMtPmN1cnJlbnRfYXNzaWdubWVudCA9IGlyOworCisgICByZXR1cm4gdmlzaXRfY29udGludWU7Cit9CisKKy8qKgorICogVXBvbiBlbnRlcmluZyBhbiBpcl9zd2l6emxlLCBzZXQgOjpoYXNfc3dpenpsZSBpZiB3ZSdyZSB2aXNpdGluZyBmcm9tIGFuCisgKiBpcl9hc3NpZ25tZW50IChpLmUuLCB0aGF0IDo6Y3VycmVudF9hc3NpZ25tZW50IGlzIHNldCkgYW5kIHRoZSBzd2l6emxlIG1hc2sKKyAqIG1hdGNoZXMgdGhlIGN1cnJlbnQgYXNzaWdubWVudCdzIHdyaXRlIG1hc2suCisgKgorICogSWYgdGhlIHdyaXRlIG1hc2sgZG9lc24ndCBtYXRjaCB0aGUgc3dpenpsZSBtYXNrLCByZW1vdmUgdGhlIGN1cnJlbnQKKyAqIGFzc2lnbm1lbnQgZnJvbSBmdXJ0aGVyIGNvbnNpZGVyYXRpb24uCisgKi8KK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWN0b3JpemVfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfc3dpenpsZSAqaXIpCit7CisgICBpZiAodGhpcy0+Y3VycmVudF9hc3NpZ25tZW50KSB7CisgICAgICBpZiAod3JpdGVfbWFza19tYXRjaGVzX3N3aXp6bGUodGhpcy0+Y3VycmVudF9hc3NpZ25tZW50LT53cml0ZV9tYXNrLCBpcikpIHsKKyAgICAgICAgIHRoaXMtPmhhc19zd2l6emxlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICB0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQgPSBOVUxMOworICAgICAgfQorICAgfQorICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisvKiBVcG9uIGVudGVyaW5nIGFuIGlyX2FycmF5X2RlcmVmZXJlbmNlLCByZW1vdmUgdGhlIGN1cnJlbnQgYXNzaWdubWVudCBmcm9tCisgKiBmdXJ0aGVyIGNvbnNpZGVyYXRpb24uIFNpbmNlIHRoZSBpbmRleCBvZiBhbiBhcnJheSBkZXJlZmVyZW5jZSBtdXN0IHNjYWxhciwKKyAqIHdlIGFyZSBub3QgYWJsZSB0byB2ZWN0b3JpemUgaXQuCisgKgorICogRklOSVNITUU6IElmIGFsbCBvZiBzY2FsYXIgaW5kaWNlcyBhcmUgaWRlbnRpY2FsIHdlIGNvdWxkIHZlY3Rvcml6ZS4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY3Rvcml6ZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9kZXJlZmVyZW5jZV9hcnJheSAqKQoreworICAgdGhpcy0+Y3VycmVudF9hc3NpZ25tZW50ID0gTlVMTDsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworLyoqCisgKiBVcG9uIGVudGVyaW5nIGFuIGlyX2V4cHJlc3Npb24sIHJlbW92ZSB0aGUgY3VycmVudCBhc3NpZ25tZW50IGZyb20gZnVydGhlcgorICogY29uc2lkZXJhdGlvbiBpZiB0aGUgZXhwcmVzc2lvbiBvcGVyYXRlcyBob3Jpem9udGFsbHkgb24gdmVjdG9ycy4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY3Rvcml6ZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9leHByZXNzaW9uICppcikKK3sKKyAgIGlmIChpci0+aXNfaG9yaXpvbnRhbCgpKSB7CisgICAgICB0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQgPSBOVUxMOworICAgICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlX3dpdGhfcGFyZW50OworICAgfQorICAgcmV0dXJuIHZpc2l0X2NvbnRpbnVlOworfQorCisvKiBTaW5jZSB0aGVyZSBpcyBubyBzdGF0ZW1lbnQgdG8gdmlzaXQgYmV0d2VlbiB0aGUgInRoZW4iIGFuZCAiZWxzZSIKKyAqIGluc3RydWN0aW9ucyB0cnkgdG8gdmVjdG9yaXplIGJlZm9yZSwgaW4gYmV0d2VlbiwgYW5kIGFmdGVyIHRoZW0gdG8gYXZvaWQKKyAqIGNvbWJpbmluZyBzdGF0ZW1lbnRzIGZyb20gZGlmZmVyZW50IGJhc2ljIGJsb2Nrcy4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY3Rvcml6ZV92aXNpdG9yOjp2aXNpdF9lbnRlcihpcl9pZiAqaXIpCit7CisgICB0cnlfdmVjdG9yaXplKCk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT50aGVuX2luc3RydWN0aW9ucyk7CisgICB0cnlfdmVjdG9yaXplKCk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5lbHNlX2luc3RydWN0aW9ucyk7CisgICB0cnlfdmVjdG9yaXplKCk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworLyogU2luY2UgdGhlcmUgaXMgbm8gc3RhdGVtZW50IHRvIHZpc2l0IGJldHdlZW4gdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgYm9keSBvZgorICogdGhlIGxvb3AgYW5kIHRoZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgaXQgdHJ5IHRvIHZlY3Rvcml6ZSBiZWZvcmUgYW5kIGFmdGVyIHRoZQorICogYm9keSB0byBhdm9pZCBjb21iaW5pbmcgc3RhdGVtZW50cyBmcm9tIGRpZmZlcmVudCBiYXNpYyBibG9ja3MuCisgKi8KK2lyX3Zpc2l0b3Jfc3RhdHVzCitpcl92ZWN0b3JpemVfdmlzaXRvcjo6dmlzaXRfZW50ZXIoaXJfbG9vcCAqaXIpCit7CisgICB0cnlfdmVjdG9yaXplKCk7CisKKyAgIHZpc2l0X2xpc3RfZWxlbWVudHModGhpcywgJmlyLT5ib2R5X2luc3RydWN0aW9ucyk7CisgICB0cnlfdmVjdG9yaXplKCk7CisKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZV93aXRoX3BhcmVudDsKK30KKworLyoqCisgKiBVcG9uIGxlYXZpbmcgYW4gaXJfYXNzaWdubWVudCwgc2F2ZSBhIHBvaW50ZXIgdG8gaXQgaW4gOjphc3NpZ25tZW50W10gaWYKKyAqIHRoZSBzd2l6emxlIG1hc2socykgZm91bmQgd2VyZSBhcHByb3ByaWF0ZS4gQWxzbyBzYXZlIGEgcG9pbnRlciBpbgorICogOjpsYXN0X2Fzc2lnbm1lbnQgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBmdXR1cmUgYXNzaWdubWVudHMgd2l0aCBpdC4KKyAqCisgKiBGaW5hbGx5LCBjbGVhciA6OmN1cnJlbnRfYXNzaWdubWVudCBhbmQgOjpoYXNfc3dpenpsZS4KKyAqLworaXJfdmlzaXRvcl9zdGF0dXMKK2lyX3ZlY3Rvcml6ZV92aXNpdG9yOjp2aXNpdF9sZWF2ZShpcl9hc3NpZ25tZW50ICppcikKK3sKKyAgIGlmICh0aGlzLT5oYXNfc3dpenpsZSAmJiB0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQpIHsKKyAgICAgIGFzc2VydCh0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQgPT0gaXIpOworCisgICAgICB1bnNpZ25lZCBjaGFubmVsID0gd3JpdGVfbWFza190b19zd2l6emxlKHRoaXMtPmN1cnJlbnRfYXNzaWdubWVudC0+d3JpdGVfbWFzayk7CisgICAgICB0aGlzLT5hc3NpZ25tZW50W2NoYW5uZWxdID0gaXI7CisgICAgICB0aGlzLT5jaGFubmVscysrOworCisgICAgICB0aGlzLT5sYXN0X2Fzc2lnbm1lbnQgPSB0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQ7CisgICB9CisgICB0aGlzLT5jdXJyZW50X2Fzc2lnbm1lbnQgPSBOVUxMOworICAgdGhpcy0+aGFzX3N3aXp6bGUgPSBmYWxzZTsKKyAgIHJldHVybiB2aXNpdF9jb250aW51ZTsKK30KKworLyoqCisgKiBDb21iaW5lcyBzY2FsYXIgYXNzaWdubWVudHMgb2YgdGhlIHNhbWUgZXhwcmVzc2lvbiAobW9kdWxvIHN3aXp6bGUpIHRvCisgKiBtdWx0aXBsZSBjaGFubmVscyBvZiB0aGUgc2FtZSB2YXJpYWJsZSBpbnRvIGEgc2luZ2xlIHZlY3Rvcml6ZWQgZXhwcmVzc2lvbgorICogYW5kIGFzc2lnbm1lbnQuCisgKi8KK2Jvb2wKK2RvX3ZlY3Rvcml6ZShleGVjX2xpc3QgKmluc3RydWN0aW9ucykKK3sKKyAgIGlyX3ZlY3Rvcml6ZV92aXNpdG9yIHY7CisKKyAgIHYucnVuKGluc3RydWN0aW9ucyk7CisKKyAgIC8qIFRyeSB0byB2ZWN0b3JpemUgdGhlIGxhc3QgYXNzaWdubWVudHMgc2Vlbi4gKi8KKyAgIHYudHJ5X3ZlY3Rvcml6ZSgpOworCisgICByZXR1cm4gdi5wcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3Nzb3VyY2UuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9vc3NvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1N2UyNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvb3Nzb3VyY2UuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvLworLy9Db3B5cmlnaHQgKEMpIDIwMDItMjAwNSAgM0RsYWJzIEluYy4gTHRkLgorLy9BbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvL21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy9hcmUgbWV0OgorLy8KKy8vICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKy8vICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorLy8gICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgM0RsYWJzIEluYy4gTHRkLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisvLyAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy9USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvL0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisvL0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisvL0NPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy9JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorLy9CVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisvL0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKy8vQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisvL0xJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisvL0FOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy9QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIExpbnV4LXNwZWNpZmljIGZ1bmN0aW9ucworLy8KKworI2luY2x1ZGUgImdsc2xhbmcvT1NEZXBlbmRlbnQvb3NpbmNsdWRlLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGdsc2xhbmcgeworCitib29sIEluaXRQcm9jZXNzKCk7Citib29sIEluaXRUaHJlYWQoKTsKK2Jvb2wgRGV0YWNoVGhyZWFkKCk7Citib29sIERldGFjaFByb2Nlc3MoKTsKKworLy8KKy8vIFRocmVhZCBjbGVhbnVwCisvLworCisvLworLy8gV3JhcHBlciBmb3IgTGludXggY2FsbCB0byBEZXRhY2hUaHJlYWQuICBUaGlzIGlzIHJlcXVpcmVkIGFzIHB0aHJlYWRfY2xlYW51cF9wdXNoKCkgZXhwZWN0cyAKKy8vIHRoZSBjbGVhbnVwIHJvdXRpbmUgdG8gcmV0dXJuIHZvaWQuCisvLyAKK3ZvaWQgRGV0YWNoVGhyZWFkTGludXgodm9pZCAqKQoreworCURldGFjaFRocmVhZCgpOworfQorCisKKy8vCisvLyBSZWdpc3RlcnMgY2xlYW51cCBoYW5kbGVyLCBzZXRzIGNhbmNlbCB0eXBlIGFuZCBzdGF0ZSwgYW5kIGV4ZWN1dGVzIHRoZSB0aHJlYWQgc3BlY2lmaWMKKy8vIGNsZWFudXAgaGFuZGxlci4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlIFN0YW5kYWxvbmUuY3BwIGZvciByZWdyZXNzaW9uIAorLy8gdGVzdGluZy4gIFdoZW4gT3BlbkdMIGFwcGxpY2F0aW9ucyBhcmUgcnVuIHdpdGggdGhlIGRyaXZlciBjb2RlLCBMaW51eCBPUyBkb2VzIHRoZSAKKy8vIHRocmVhZCBjbGVhbnVwLgorLy8gCit2b2lkIE9TX0NsZWFudXBUaHJlYWREYXRhKHZvaWQpCit7CisJaW50IG9sZF9jYW5jZWxfc3RhdGUsIG9sZF9jYW5jZWxfdHlwZTsKKwl2b2lkICpjbGVhbnVwQXJnID0gTlVMTDsKKworCS8vCisJLy8gU2V0IHRocmVhZCBjYW5jZWwgc3RhdGUgYW5kIHB1c2ggY2xlYW51cCBoYW5kbGVyLgorCS8vCisJcHRocmVhZF9zZXRjYW5jZWxzdGF0ZShQVEhSRUFEX0NBTkNFTF9FTkFCTEUsICZvbGRfY2FuY2VsX3N0YXRlKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaChEZXRhY2hUaHJlYWRMaW51eCwgKHZvaWQgKikgY2xlYW51cEFyZyk7CisKKwkvLworCS8vIFB1dCB0aGUgdGhyZWFkIGluIGRlZmVycmVkIGNhbmNlbGxhdGlvbiBtb2RlLgorCS8vCisJcHRocmVhZF9zZXRjYW5jZWx0eXBlKFBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVELCAmb2xkX2NhbmNlbF90eXBlKTsKKworCS8vCisJLy8gUG9wIGNsZWFudXAgaGFuZGxlciBhbmQgZXhlY3V0ZSBpdCBwcmlvciB0byB1bnJlZ2lzdGVyaW5nIHRoZSBjbGVhbnVwIGhhbmRsZXIuCisJLy8KKwlwdGhyZWFkX2NsZWFudXBfcG9wKDEpOworCisJLy8KKwkvLyBSZXN0b3JlIHRoZSB0aHJlYWQncyBwcmV2aW91cyBjYW5jZWxsYXRpb24gbW9kZS4KKwkvLworCXB0aHJlYWRfc2V0Y2FuY2VsdHlwZShvbGRfY2FuY2VsX3N0YXRlLCBOVUxMKTsKK30KKworCisvLworLy8gVGhyZWFkIExvY2FsIFN0b3JhZ2UgT3BlcmF0aW9ucworLy8KKworaW5saW5lIE9TX1RMU0luZGV4IFB0aHJlYWRLZXlUb1RMU0luZGV4KHB0aHJlYWRfa2V5X3Qga2V5KQoreworICAgICAgIHJldHVybiAoT1NfVExTSW5kZXgpKCh1aW50cHRyX3Qpa2V5ICsgMSk7Cit9CisKK2lubGluZSBwdGhyZWFkX2tleV90IFRMU0luZGV4VG9QdGhyZWFkS2V5KE9TX1RMU0luZGV4IG5JbmRleCkKK3sKKyAgICAgICByZXR1cm4gKHB0aHJlYWRfa2V5X3QpKCh1aW50cHRyX3QpbkluZGV4IC0gMSk7Cit9CisKK09TX1RMU0luZGV4IE9TX0FsbG9jVExTSW5kZXgoKQoreworCXB0aHJlYWRfa2V5X3QgcFBvb2xJbmRleDsKKworCS8vCisJLy8gQ3JlYXRlIGdsb2JhbCBwb29sIGtleS4KKwkvLworCWlmICgocHRocmVhZF9rZXlfY3JlYXRlKCZwUG9vbEluZGV4LCBOVUxMKSkgIT0gMCkgeworCQlhc3NlcnQoMCAmJiAiT1NfQWxsb2NUTFNJbmRleCgpOiBVbmFibGUgdG8gYWxsb2NhdGUgVGhyZWFkIExvY2FsIFN0b3JhZ2UiKTsKKwkJcmV0dXJuIE9TX0lOVkFMSURfVExTX0lOREVYOworCX0KKwllbHNlCisJCXJldHVybiBQdGhyZWFkS2V5VG9UTFNJbmRleChwUG9vbEluZGV4KTsKK30KKworCitib29sIE9TX1NldFRMU1ZhbHVlKE9TX1RMU0luZGV4IG5JbmRleCwgdm9pZCAqbHB2VmFsdWUpCit7CisJaWYgKG5JbmRleCA9PSBPU19JTlZBTElEX1RMU19JTkRFWCkgeworCQlhc3NlcnQoMCAmJiAiT1NfU2V0VExTVmFsdWUoKTogSW52YWxpZCBUTFMgSW5kZXgiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChwdGhyZWFkX3NldHNwZWNpZmljKFRMU0luZGV4VG9QdGhyZWFkS2V5KG5JbmRleCksIGxwdlZhbHVlKSA9PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKwordm9pZCogT1NfR2V0VExTVmFsdWUoT1NfVExTSW5kZXggbkluZGV4KQoreworICAgICAgIC8vCisgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDAgaWYgbkluZGV4IGlzIGludmFsaWQuCisgICAgICAgLy8KKyAgICAgICBhc3NlcnQobkluZGV4ICE9IE9TX0lOVkFMSURfVExTX0lOREVYKTsKKyAgICAgICByZXR1cm4gcHRocmVhZF9nZXRzcGVjaWZpYyhUTFNJbmRleFRvUHRocmVhZEtleShuSW5kZXgpKTsgCit9CisKK2Jvb2wgT1NfRnJlZVRMU0luZGV4KE9TX1RMU0luZGV4IG5JbmRleCkKK3sKKwlpZiAobkluZGV4ID09IE9TX0lOVkFMSURfVExTX0lOREVYKSB7CisJCWFzc2VydCgwICYmICJPU19TZXRUTFNWYWx1ZSgpOiBJbnZhbGlkIFRMUyBJbmRleCIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLy8KKwkvLyBEZWxldGUgdGhlIGdsb2JhbCBwb29sIGtleS4KKwkvLworCWlmIChwdGhyZWFkX2tleV9kZWxldGUoVExTSW5kZXhUb1B0aHJlYWRLZXkobkluZGV4KSkgPT0gMCkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK210eF90IEdsc2xhbmdHbG9iYWxMb2NrID0gX01UWF9JTklUSUFMSVpFUl9OUDsKKwordm9pZCBJbml0R2xvYmFsTG9jaygpIHsKK30KKwordm9pZCBHZXRHbG9iYWxMb2NrKCkgeworICAgbXR4X2xvY2soJkdsc2xhbmdHbG9iYWxMb2NrKTsKK30KKwordm9pZCBSZWxlYXNlR2xvYmFsTG9jaygpIHsKKyAgIG10eF91bmxvY2soJkdsc2xhbmdHbG9iYWxMb2NrKTsKK30KKwordm9pZCogT1NfQ3JlYXRlVGhyZWFkKFRUaHJlYWRFbnRyeXBvaW50IGVudHJ5KQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIE9TX1dhaXRGb3JBbGxUaHJlYWRzKHZvaWQqIHRocmVhZHMsIGludCBudW1UaHJlYWRzKQoreworfQorCit2b2lkIE9TX1NsZWVwKGludCBtaWxsaXNlY29uZHMpCit7Cit9CisKK3ZvaWQgT1NfRHVtcE1lbW9yeUNvdW50ZXJzKCkKK3sKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGdsc2xhbmcKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvcHJvZ3JhbS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9wcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkNzIxZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvcHJvZ3JhbS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOCAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFZNd2FyZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAibGliZm5zLmgiICAvLyBMdW5hckcgQUREOgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiB2b2lkCitfbWVzYV9nbHNsX2NvbXBpbGVfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwKKwkJCSAgYm9vbCBkdW1wX2FzdCwgYm9vbCBkdW1wX1NQViwgYm9vbCBkdW1wX2hpciwKKwkJCSAgYm9vbCBzdHJpcF9TUFYsIGJvb2wgY2Fub25pY2FsaXplX1NQVik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworZXh0ZXJuIHZvaWQKK2xpbmtfc2hhZGVycyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2cpOworCitleHRlcm4gdm9pZAorbGlua2VyX2Vycm9yKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywgY29uc3QgY2hhciAqZm10LCAuLi4pCisgICBQUklOVEZMSUtFKDIsIDMpOworCitleHRlcm4gdm9pZAorbGlua2VyX3dhcm5pbmcoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKyAgIFBSSU5URkxJS0UoMiwgMyk7CisKK2V4dGVybiBsb25nCitwYXJzZV9wcm9ncmFtX3Jlc291cmNlX25hbWUoY29uc3QgR0xjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMY2hhciAqKm91dF9iYXNlX25hbWVfZW5kKTsKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvc19leHByZXNzaW9uLmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvc19leHByZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA2ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zX2V4cHJlc3Npb24uY3BwCkBAIC0wLDAgKzEsMjE5IEBACisvKiAtKi0gYysrIC0qLSAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSAic19leHByZXNzaW9uLmgiCisKK3Nfc3ltYm9sOjpzX3N5bWJvbChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBuKQoreworICAgLyogQXNzdW1lIHRoZSBnaXZlbiBzdHJpbmcgaXMgYWxyZWFkeSBudWwtdGVybWluYXRlZCBhbmQgaW4gbWVtb3J5IHRoYXQKKyAgICAqIHdpbGwgbGl2ZSBhcyBsb25nIGFzIHRoaXMgbm9kZS4KKyAgICAqLworICAgYXNzZXJ0KHN0cltuXSA9PSAnXDAnKTsKKyAgIHRoaXMtPnN0ciA9IHN0cjsKK30KKworc19saXN0OjpzX2xpc3QoKQoreworfQorCitzdGF0aWMgdm9pZAorc2tpcF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKiZzcmMsIGNoYXIgKiZzeW1ib2xfYnVmZmVyKQoreworICAgc2l6ZV90IG4gPSBzdHJzcG4oc3JjLCAiIFx2XHRcclxuIik7CisgICBzcmMgKz0gbjsKKyAgIHN5bWJvbF9idWZmZXIgKz0gbjsKKyAgIC8qIEFsc28gc2tpcCBTY2hlbWUtc3R5bGUgY29tbWVudHM6IHNlbWktY29sb24gJ3RpbCBlbmQgb2YgbGluZSAqLworICAgaWYgKHNyY1swXSA9PSAnOycpIHsKKyAgICAgIG4gPSBzdHJjc3BuKHNyYywgIlxuIik7CisgICAgICBzcmMgKz0gbjsKKyAgICAgIHN5bWJvbF9idWZmZXIgKz0gbjsKKyAgICAgIHNraXBfd2hpdGVzcGFjZShzcmMsIHN5bWJvbF9idWZmZXIpOworICAgfQorfQorCitzdGF0aWMgc19leHByZXNzaW9uICoKK3JlYWRfYXRvbSh2b2lkICpjdHgsIGNvbnN0IGNoYXIgKiZzcmMsIGNoYXIgKiZzeW1ib2xfYnVmZmVyKQoreworICAgc19leHByZXNzaW9uICpleHByID0gTlVMTDsKKworICAgc2tpcF93aGl0ZXNwYWNlKHNyYywgc3ltYm9sX2J1ZmZlcik7CisKKyAgIHNpemVfdCBuID0gc3RyY3NwbihzcmMsICIoIFx2XHRcclxuKTsiKTsKKyAgIGlmIChuID09IDApCisgICAgICByZXR1cm4gTlVMTDsgLy8gbm8gYXRvbQorCisgICAvLyBDaGVjayBmb3IgdGhlIHNwZWNpYWwgc3ltYm9sICcrSU5GJywgd2hpY2ggbWVhbnMgK0luZmluaXR5LiAgTm90ZTogQzk5CisgICAvLyByZXF1aXJlcyBzdHJ0b2YgdG8gcGFyc2UgJytJTkYnIGFzICtJbmZpbml0eSwgYnV0IHdlIHN0aWxsIHN1cHBvcnQgc29tZQorICAgLy8gbm9uLUM5OS1jb21wbGlhbnQgY29tcGlsZXJzIChlLmcuIE1TVkMpLgorICAgaWYgKG4gPT0gNCAmJiBzdHJuY21wKHNyYywgIitJTkYiLCA0KSA9PSAwKSB7CisgICAgICBleHByID0gbmV3KGN0eCkgc19mbG9hdChzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSk7CisgICB9IGVsc2UgeworICAgICAgLy8gQ2hlY2sgaWYgdGhlIGF0b20gaXMgYSBudW1iZXIuCisgICAgICBjaGFyICpmbG9hdF9lbmQgPSBOVUxMOworICAgICAgZmxvYXQgZiA9IGdsc2xfc3RydG9mKHNyYywgJmZsb2F0X2VuZCk7CisgICAgICBpZiAoZmxvYXRfZW5kICE9IHNyYykgeworICAgICAgICAgY2hhciAqaW50X2VuZCA9IE5VTEw7CisgICAgICAgICBpbnQgaSA9IHN0cnRvbChzcmMsICZpbnRfZW5kLCAxMCk7CisgICAgICAgICAvLyBJZiBzdHJ0b2YgbWF0Y2hlZCBtb3JlIGNoYXJhY3RlcnMsIGl0IG11c3QgaGF2ZSBhIGRlY2ltYWwgcGFydAorICAgICAgICAgaWYgKGZsb2F0X2VuZCA+IGludF9lbmQpCisgICAgICAgICAgICBleHByID0gbmV3KGN0eCkgc19mbG9hdChmKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4cHIgPSBuZXcoY3R4KSBzX2ludChpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAvLyBOb3QgYSBudW1iZXI7IHJldHVybiBhIHN5bWJvbC4KKyAgICAgICAgIHN5bWJvbF9idWZmZXJbbl0gPSAnXDAnOworICAgICAgICAgZXhwciA9IG5ldyhjdHgpIHNfc3ltYm9sKHN5bWJvbF9idWZmZXIsIG4pOworICAgICAgfQorICAgfQorCisgICBzcmMgKz0gbjsKKyAgIHN5bWJvbF9idWZmZXIgKz0gbjsKKworICAgcmV0dXJuIGV4cHI7Cit9CisKK3N0YXRpYyBzX2V4cHJlc3Npb24gKgorX19yZWFkX2V4cHJlc3Npb24odm9pZCAqY3R4LCBjb25zdCBjaGFyIComc3JjLCBjaGFyIComc3ltYm9sX2J1ZmZlcikKK3sKKyAgIHNfZXhwcmVzc2lvbiAqYXRvbSA9IHJlYWRfYXRvbShjdHgsIHNyYywgc3ltYm9sX2J1ZmZlcik7CisgICBpZiAoYXRvbSAhPSBOVUxMKQorICAgICAgcmV0dXJuIGF0b207CisKKyAgIHNraXBfd2hpdGVzcGFjZShzcmMsIHN5bWJvbF9idWZmZXIpOworICAgaWYgKHNyY1swXSA9PSAnKCcpIHsKKyAgICAgICsrc3JjOworICAgICAgKytzeW1ib2xfYnVmZmVyOworCisgICAgICBzX2xpc3QgKmxpc3QgPSBuZXcoY3R4KSBzX2xpc3Q7CisgICAgICBzX2V4cHJlc3Npb24gKmV4cHI7CisKKyAgICAgIHdoaWxlICgoZXhwciA9IF9fcmVhZF9leHByZXNzaW9uKGN0eCwgc3JjLCBzeW1ib2xfYnVmZmVyKSkgIT0gTlVMTCkgeworCSBsaXN0LT5zdWJleHByZXNzaW9ucy5wdXNoX3RhaWwoZXhwcik7CisgICAgICB9CisgICAgICBza2lwX3doaXRlc3BhY2Uoc3JjLCBzeW1ib2xfYnVmZmVyKTsKKyAgICAgIGlmIChzcmNbMF0gIT0gJyknKSB7CisJIHByaW50ZigiVW5jbG9zZWQgZXhwcmVzc2lvbiAoY2hlY2sgeW91ciBwYXJlbnRoZXNpcykuXG4iKTsKKwkgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICArK3NyYzsKKyAgICAgICsrc3ltYm9sX2J1ZmZlcjsKKyAgICAgIHJldHVybiBsaXN0OworICAgfQorICAgcmV0dXJuIE5VTEw7Cit9CisKK3NfZXhwcmVzc2lvbiAqCitzX2V4cHJlc3Npb246OnJlYWRfZXhwcmVzc2lvbih2b2lkICpjdHgsIGNvbnN0IGNoYXIgKiZzcmMpCit7CisgICBhc3NlcnQoc3JjICE9IE5VTEwpOworCisgICAvKiBXaGVuIHdlIGVuY291bnRlciBhIFN5bWJvbCwgd2UgbmVlZCB0byBzYXZlIGEgbnVsLXRlcm1pbmF0ZWQgY29weSBvZgorICAgICogdGhlIHN0cmluZy4gIEhvd2V2ZXIsIHJhbGxvY19zdHJuZHVwJ2luZyBldmVyeSBpbmRpdmlkdWFsIFN5bWJvbCBpcworICAgICogZXh0cmVtZWx5IGV4cGVuc2l2ZS4gIFdlIGNvdWxkIGF2b2lkIHRoaXMgYnkgc2ltcGx5IG92ZXJ3cml0aW5nIHRoZQorICAgICogbmV4dCBjaGFyYWN0ZXIgKGd1YXJhbnRlZWQgdG8gYmUgd2hpdGVzcGFjZSwgcGFyZW5zLCBvciBzZW1pY29sb24pIHdpdGgKKyAgICAqIGEgbnVsLWJ5dGUuICBCdXQgb3ZlcndyaXRpbmcgbm9uLXdoaXRlc3BhY2Ugd291bGQgbWVzcyB1cCBwYXJzaW5nLgorICAgICoKKyAgICAqIFNvLCBqdXN0IGNvcHkgdGhlIHdob2xlIGJ1ZmZlciBhaGVhZCBvZiB0aW1lLiAgV2FsayBib3RoLCBsZWF2aW5nIHRoZQorICAgICogb3JpZ2luYWwgc291cmNlIHN0cmluZyB1bm1vZGlmaWVkLCBhbmQgYWx0ZXJpbmcgdGhlIGNvcHkgdG8gY29udGFpbiB0aGUKKyAgICAqIG5lY2Vzc2FyeSBudWwtYnl0ZXMgd2hlbmV2ZXIgd2UgZW5jb3VudGVyIGEgc3ltYm9sLgorICAgICovCisgICBjaGFyICpzeW1ib2xfYnVmZmVyID0gcmFsbG9jX3N0cmR1cChjdHgsIHNyYyk7CisgICByZXR1cm4gX19yZWFkX2V4cHJlc3Npb24oY3R4LCBzcmMsIHN5bWJvbF9idWZmZXIpOworfQorCit2b2lkIHNfaW50OjpwcmludCgpCit7CisgICBwcmludGYoIiVkIiwgdGhpcy0+dmFsKTsKK30KKwordm9pZCBzX2Zsb2F0OjpwcmludCgpCit7CisgICBwcmludGYoIiVmIiwgdGhpcy0+dmFsKTsKK30KKwordm9pZCBzX3N5bWJvbDo6cHJpbnQoKQoreworICAgcHJpbnRmKCIlcyIsIHRoaXMtPnN0cik7Cit9CisKK3ZvaWQgc19saXN0OjpwcmludCgpCit7CisgICBwcmludGYoIigiKTsKKyAgIGZvcmVhY2hfbGlzdChuLCAmdGhpcy0+c3ViZXhwcmVzc2lvbnMpIHsKKyAgICAgIHNfZXhwcmVzc2lvbiAqZXhwciA9IChzX2V4cHJlc3Npb24gKikgbjsKKyAgICAgIGV4cHItPnByaW50KCk7CisgICAgICBpZiAoIWV4cHItPm5leHQtPmlzX3RhaWxfc2VudGluZWwoKSkKKwkgcHJpbnRmKCIgIik7CisgICB9CisgICBwcmludGYoIikiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbAorc19wYXR0ZXJuOjptYXRjaChzX2V4cHJlc3Npb24gKmV4cHIpCit7CisgICBzd2l0Y2ggKHR5cGUpCisgICB7CisgICBjYXNlIEVYUFI6ICAgKnBfZXhwciA9IGV4cHI7IGJyZWFrOworICAgY2FzZSBMSVNUOiAgIGlmIChleHByLT5pc19saXN0KCkpICAgKnBfbGlzdCAgID0gKHNfbGlzdCAqKSAgIGV4cHI7IGJyZWFrOworICAgY2FzZSBTWU1CT0w6IGlmIChleHByLT5pc19zeW1ib2woKSkgKnBfc3ltYm9sID0gKHNfc3ltYm9sICopIGV4cHI7IGJyZWFrOworICAgY2FzZSBOVU1CRVI6IGlmIChleHByLT5pc19udW1iZXIoKSkgKnBfbnVtYmVyID0gKHNfbnVtYmVyICopIGV4cHI7IGJyZWFrOworICAgY2FzZSBJTlQ6ICAgIGlmIChleHByLT5pc19pbnQoKSkgICAgKnBfaW50ICAgID0gKHNfaW50ICopICAgIGV4cHI7IGJyZWFrOworICAgY2FzZSBTVFJJTkc6CisgICAgICBzX3N5bWJvbCAqc3ltID0gU1hfQVNfU1lNQk9MKGV4cHIpOworICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN0cmNtcChzeW0tPnZhbHVlKCksIGxpdGVyYWwpID09IDApCisJIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfTsKKworICAgcmV0dXJuICpwX2V4cHIgPT0gZXhwcjsKK30KKworYm9vbAorc19tYXRjaChzX2V4cHJlc3Npb24gKnRvcCwgdW5zaWduZWQgbiwgc19wYXR0ZXJuICpwYXR0ZXJuLCBib29sIHBhcnRpYWwpCit7CisgICBzX2xpc3QgKmxpc3QgPSBTWF9BU19MSVNUKHRvcCk7CisgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICB1bnNpZ25lZCBpID0gMDsKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmbGlzdC0+c3ViZXhwcmVzc2lvbnMpIHsKKyAgICAgIGlmIChpID49IG4pCisJIHJldHVybiBwYXJ0aWFsOyAvKiBNb3JlIGFjdHVhbCBpdGVtcyB0aGFuIHRoZSBwYXR0ZXJuIGV4cGVjdGVkICovCisKKyAgICAgIHNfZXhwcmVzc2lvbiAqZXhwciA9IChzX2V4cHJlc3Npb24gKikgbm9kZTsKKyAgICAgIGlmIChleHByID09IE5VTEwgfHwgIXBhdHRlcm5baV0ubWF0Y2goZXhwcikpCisJIHJldHVybiBmYWxzZTsKKworICAgICAgaSsrOworICAgfQorCisgICBpZiAoaSA8IG4pCisgICAgICByZXR1cm4gZmFsc2U7IC8qIExlc3MgYWN0dWFsIGl0ZW1zIHRoYW4gdGhlIHBhdHRlcm4gZXhwZWN0ZWQgKi8KKworICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3NfZXhwcmVzc2lvbi5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zX2V4cHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc1MWU0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zX2V4cHJlc3Npb24uaApAQCAtMCwwICsxLDE4MCBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgU19FWFBSRVNTSU9OX0gKKyNkZWZpbmUgU19FWFBSRVNTSU9OX0gKKworI2luY2x1ZGUgImxpYmZucy5oIiAvLyBMdW5hckcgQUREOgorI2luY2x1ZGUgInN0cnRvZC5oIgorI2luY2x1ZGUgImxpc3QuaCIKKworLyogVHlwZS1zYWZlIGRvd25jYXN0aW5nIG1hY3JvcyAoYWxzbyBzYWZlIHRvIHBhc3MgTlVMTCkgKi8KKyNkZWZpbmUgU1hfQVNfKHQseCkgKCh4KSAmJiAoKHNfZXhwcmVzc2lvbiopIHgpLT5pc18jI3QoKSkgPyAoKHNfIyN0KikgKHgpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTAorI2RlZmluZSBTWF9BU19MSVNUKHgpICAgU1hfQVNfKGxpc3QsIHgpCisjZGVmaW5lIFNYX0FTX1NZTUJPTCh4KSBTWF9BU18oc3ltYm9sLCB4KQorI2RlZmluZSBTWF9BU19OVU1CRVIoeCkgU1hfQVNfKG51bWJlciwgeCkKKyNkZWZpbmUgU1hfQVNfSU5UKHgpICAgIFNYX0FTXyhpbnQsIHgpCisKKy8qIFBhdHRlcm4gbWF0Y2hpbmcgbWFjcm9zICovCisjZGVmaW5lIE1BVENIKGxpc3QsIHBhdCkgc19tYXRjaChsaXN0LCBFbGVtZW50cyhwYXQpLCBwYXQsIGZhbHNlKQorI2RlZmluZSBQQVJUSUFMX01BVENIKGxpc3QsIHBhdCkgc19tYXRjaChsaXN0LCBFbGVtZW50cyhwYXQpLCBwYXQsIHRydWUpCisKKy8qIEZvciBvdXIgcHVycG9zZXMsIFMtRXhwcmVzc2lvbnMgYXJlOgorICogLSA8aW50PgorICogLSA8ZmxvYXQ+CisgKiAtIHN5bWJvbAorICogLSAoZXhwcjEgZXhwcjIgLi4uIGV4cHJOKSAgICAgd2hlcmUgZXhwck4gaXMgYW4gUy1FeHByZXNzaW9uCisgKgorICogVW5saWtlIExJU1AvU2NoZW1lLCB3ZSBkbyBub3Qgc3VwcG9ydCAoZm9vIC4gYmFyKSBwYWlycy4KKyAqLworY2xhc3Mgc19leHByZXNzaW9uIDogcHVibGljIGV4ZWNfbm9kZQoreworcHVibGljOgorICAgLyoqCisgICAgKiBSZWFkIGFuIFMtRXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgKiBBZHZhbmNlcyB0aGUgc3VwcGxpZWQgcG9pbnRlciB0byBqdXN0IGFmdGVyIHRoZSBleHByZXNzaW9uIHJlYWQuCisgICAgKgorICAgICogQW55IGFsbG9jYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgd2l0aCAnY3R4JyBhcyB0aGUgcmFsbG9jIG93bmVyLgorICAgICovCisgICBzdGF0aWMgc19leHByZXNzaW9uICpyZWFkX2V4cHJlc3Npb24odm9pZCAqY3R4LCBjb25zdCBjaGFyIComc3JjKTsKKworICAgLyoqCisgICAgKiBQcmludCBvdXQgYW4gUy1FeHByZXNzaW9uLiAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisgICAgKi8KKyAgIHZpcnR1YWwgdm9pZCBwcmludCgpID0gMDsKKworICAgdmlydHVhbCBib29sIGlzX2xpc3QoKSAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICB2aXJ0dWFsIGJvb2wgaXNfc3ltYm9sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgIHZpcnR1YWwgYm9vbCBpc19udW1iZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgdmlydHVhbCBib29sIGlzX2ludCgpICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK3Byb3RlY3RlZDoKKyAgIHNfZXhwcmVzc2lvbigpIHsgfQorfTsKKworLyogQXRvbXMgKi8KKworY2xhc3Mgc19udW1iZXIgOiBwdWJsaWMgc19leHByZXNzaW9uCit7CitwdWJsaWM6CisgICBib29sIGlzX251bWJlcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgdmlydHVhbCBmbG9hdCBmdmFsdWUoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgIHNfbnVtYmVyKCkgeyB9Cit9OworCitjbGFzcyBzX2ludCA6IHB1YmxpYyBzX251bWJlcgoreworcHVibGljOgorICAgc19pbnQoaW50IHgpIDogdmFsKHgpIHsgfQorCisgICBib29sIGlzX2ludCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgZmxvYXQgZnZhbHVlKCkgeyByZXR1cm4gZmxvYXQodGhpcy0+dmFsKTsgfQorICAgaW50IHZhbHVlKCkgeyByZXR1cm4gdGhpcy0+dmFsOyB9CisKKyAgIHZvaWQgcHJpbnQoKTsKKworcHJpdmF0ZToKKyAgIGludCB2YWw7Cit9OworCitjbGFzcyBzX2Zsb2F0IDogcHVibGljIHNfbnVtYmVyCit7CitwdWJsaWM6CisgICBzX2Zsb2F0KGZsb2F0IHgpIDogdmFsKHgpIHsgfQorCisgICBmbG9hdCBmdmFsdWUoKSB7IHJldHVybiB0aGlzLT52YWw7IH0KKworICAgdm9pZCBwcmludCgpOworCitwcml2YXRlOgorICAgZmxvYXQgdmFsOworfTsKKworY2xhc3Mgc19zeW1ib2wgOiBwdWJsaWMgc19leHByZXNzaW9uCit7CitwdWJsaWM6CisgICBzX3N5bWJvbChjb25zdCBjaGFyICosIHNpemVfdCk7CisKKyAgIGJvb2wgaXNfc3ltYm9sKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICBjb25zdCBjaGFyICp2YWx1ZSgpIHsgcmV0dXJuIHRoaXMtPnN0cjsgfQorCisgICB2b2lkIHByaW50KCk7CisKK3ByaXZhdGU6CisgICBjb25zdCBjaGFyICpzdHI7Cit9OworCisvKiBMaXN0cyBvZiBleHByZXNzaW9uczogKGV4cHIxIC4uLiBleHByTikgKi8KK2NsYXNzIHNfbGlzdCA6IHB1YmxpYyBzX2V4cHJlc3Npb24KK3sKK3B1YmxpYzoKKyAgIHNfbGlzdCgpOworCisgICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgdm9pZCBwcmludCgpOworCisgICBleGVjX2xpc3Qgc3ViZXhwcmVzc2lvbnM7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisgKiBQYXJ0IG9mIGEgcGF0dGVybiB0byBtYXRjaCAtIGVzc2VudGlhbGx5IGEgcmVjb3JkIGhvbGRpbmcgYSBwb2ludGVyIHRvIHRoZQorICogc3RvcmFnZSBmb3IgdGhlIGNvbXBvbmVudCB0byBtYXRjaCwgYWxvbmcgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KKyAqLworY2xhc3Mgc19wYXR0ZXJuIHsKK3B1YmxpYzoKKyAgIHNfcGF0dGVybihzX2V4cHJlc3Npb24gKiZzKSA6IHBfZXhwcigmcyksICAgdHlwZShFWFBSKSAgIHsgfQorICAgc19wYXR0ZXJuKHNfbGlzdCAgICAgICAqJnMpIDogcF9saXN0KCZzKSwgICB0eXBlKExJU1QpICAgeyB9CisgICBzX3BhdHRlcm4oc19zeW1ib2wgICAgIComcykgOiBwX3N5bWJvbCgmcyksIHR5cGUoU1lNQk9MKSB7IH0KKyAgIHNfcGF0dGVybihzX251bWJlciAgICAgKiZzKSA6IHBfbnVtYmVyKCZzKSwgdHlwZShOVU1CRVIpIHsgfQorICAgc19wYXR0ZXJuKHNfaW50ICAgICAgICAqJnMpIDogcF9pbnQoJnMpLCAgICB0eXBlKElOVCkgICAgeyB9CisgICBzX3BhdHRlcm4oY29uc3QgY2hhciAqc3RyKSAgOiBsaXRlcmFsKHN0ciksIHR5cGUoU1RSSU5HKSB7IH0KKworICAgYm9vbCBtYXRjaChzX2V4cHJlc3Npb24gKmV4cHIpOworCitwcml2YXRlOgorICAgdW5pb24geworICAgICAgc19leHByZXNzaW9uICoqcF9leHByOworICAgICAgc19saXN0ICAgICAgICoqcF9saXN0OworICAgICAgc19zeW1ib2wgICAgICoqcF9zeW1ib2w7CisgICAgICBzX251bWJlciAgICAgKipwX251bWJlcjsKKyAgICAgIHNfaW50ICAgICAgICAqKnBfaW50OworICAgICAgY29uc3QgY2hhciAqbGl0ZXJhbDsKKyAgIH07CisgICBlbnVtIHsgRVhQUiwgTElTVCwgU1lNQk9MLCBOVU1CRVIsIElOVCwgU1RSSU5HIH0gdHlwZTsKK307CisKK2Jvb2wKK3NfbWF0Y2goc19leHByZXNzaW9uICp0b3AsIHVuc2lnbmVkIG4sIHNfcGF0dGVybiAqcGF0dGVybiwgYm9vbCBwYXJ0aWFsKTsKKworI2VuZGlmIC8qIFNfRVhQUkVTU0lPTl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3NoYWRlcl9jYWNoZS5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zaGFkZXJfY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYyNmQzCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zaGFkZXJfY2FjaGUuaApAQCAtMCwwICsxLDEyNiBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgU0hBREVSX0NBQ0hFX0gKKyNkZWZpbmUgU0hBREVSX0NBQ0hFX0gKKworI2luY2x1ZGUgIm1haW4vc2hhZGVyb2JqLmgiCisjaW5jbHVkZSAibWFpbi91bmlmb3Jtcy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAiaXIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitjb25zdCB1aW50MzJfdCBjYWNoZV92YWxpZGF0aW9uX2RhdGFbXSA9IHsKKyAgIGlyX3R5cGVfbWF4LAorICAgR0xTTF9UWVBFX0VSUk9SLAorICAgc2l6ZW9mKGxvbmcpLAorICAgc2l6ZW9mKGdsX3NoYWRlciksCisgICBzaXplb2YoZ2xfcHJvZ3JhbSksCisgICBzaXplb2YoZ2xfc2hhZGVyX3Byb2dyYW0pLAorICAgc2l6ZW9mKGdsX3VuaWZvcm1fc3RvcmFnZSksCisgICBzaXplb2YoZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCksCisgICBzaXplb2YoZ2xfcHJvZ3JhbV9wYXJhbWV0ZXIpLAorICAgc2l6ZW9mKGlyX3ZhcmlhYmxlKSwKKyAgIHNpemVvZihpcl9hc3NpZ25tZW50KSwKKyAgIHNpemVvZihpcl9jYWxsKSwKKyAgIHNpemVvZihpcl9jb25zdGFudCksCisgICBzaXplb2YoaXJfZGVyZWZlcmVuY2VfYXJyYXkpLAorICAgc2l6ZW9mKGlyX2RlcmVmZXJlbmNlX3JlY29yZCksCisgICBzaXplb2YoaXJfZGVyZWZlcmVuY2VfdmFyaWFibGUpLAorICAgc2l6ZW9mKGlyX2Rpc2NhcmQpLAorICAgc2l6ZW9mKGlyX2V4cHJlc3Npb24pLAorICAgc2l6ZW9mKGlyX2Z1bmN0aW9uKSwKKyAgIHNpemVvZihpcl9mdW5jdGlvbl9zaWduYXR1cmUpLAorICAgc2l6ZW9mKGlyX2lmKSwKKyAgIHNpemVvZihpcl9sb29wKSwKKyAgIHNpemVvZihpcl9sb29wX2p1bXApLAorICAgc2l6ZW9mKGlyX3JldHVybiksCisgICBzaXplb2YoaXJfc3dpenpsZSksCisgICBzaXplb2YoaXJfdGV4dHVyZSksCisgICBzaXplb2YoaXJfZW1pdF92ZXJ0ZXgpLAorICAgc2l6ZW9mKGlyX2VuZF9wcmltaXRpdmUpCit9OworI2RlZmluZSBudW1fY2FjaGVfdmFsaWRhdGlvbl9kYXRhX2l0ZW1zXAorICAgc2l6ZW9mKGNhY2hlX3ZhbGlkYXRpb25fZGF0YSkvc2l6ZW9mKHVpbnQzMl90KQorI2VuZGlmCisKKy8qIEMgQVBJIGZvciB0aGUgY2FjaGUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSB7CisgICBNRVNBX1NIQURFUl9ERVNFUklBTElaRV9SRUFEX0VSUk9SID0gLTEsCisgICBNRVNBX1NIQURFUl9ERVNFUklBTElaRV9WRVJTSU9OX0VSUk9SID0gLTIsCit9OworCitjb25zdCBjaGFyICoKK21lc2FfZ2V0X3NoYWRlcl9jYWNoZV9tYWdpYygpOworCitjaGFyICoKK21lc2Ffc2hhZGVyX3NlcmlhbGl6ZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaXplLCBib29sIHNoYWRlcl9vbmx5KTsKKworY2hhciAqCittZXNhX3Byb2dyYW1fc2VyaWFsaXplKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKKworaW50CittZXNhX3Byb2dyYW1fZGVzZXJpYWxpemUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitpbnQKK21lc2FfcHJvZ3JhbV9sb2FkKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgpOworCitzdHJ1Y3QgZ2xfc2hhZGVyICoKK3JlYWRfc2luZ2xlX3NoYWRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCk7CisKK2ludAorbWVzYV9zaGFkZXJfbG9hZChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgpOworCitzdHJ1Y3QgZ2xfc2hhZGVyICoKK21lc2Ffc2hhZGVyX2Rlc2VyaWFsaXplKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgpOworCisvKioKKyAqIEZlYXR1cmVzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBjYWNoZXMuCisgKi8KK2Jvb2wKK3N1cHBvcnRlZF9ieV9wcm9ncmFtX2NhY2hlKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywgYm9vbCBpc193cml0ZSk7CisKK2Jvb2wKK3N1cHBvcnRlZF9ieV9zaGFkZXJfY2FjaGUoc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyLCBib29sIGlzX3dyaXRlKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIFNIQURFUl9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3NoYWRlcl9kZXNlcmlhbGl6ZS5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3NoYWRlcl9kZXNlcmlhbGl6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhMWZlYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvc2hhZGVyX2Rlc2VyaWFsaXplLmNwcApAQCAtMCwwICsxLDUxMyBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAic2hhZGVyX2NhY2hlLmgiCisjaW5jbHVkZSAiaXJfZGVzZXJpYWxpemVyLmgiCisjaW5jbHVkZSAibWFpbi9jb250ZXh0LmgiCisjaW5jbHVkZSAibWFpbi9zaGFkZXJhcGkuaCIKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCoKK2Rlc2VyaWFsaXplX3Byb2dyYW1fcGFyYW1ldGVycyhtZW1vcnlfbWFwICZtYXApCit7CisgICBzdHJ1Y3QgZ2xfcHJvZ3JhbV9wYXJhbWV0ZXJfbGlzdCAqbGlzdCA9IF9tZXNhX25ld19wYXJhbWV0ZXJfbGlzdCgpOworICAgdWludDhfdCBwYXJfYW1vdW50ID0gbWFwLnJlYWRfdWludDhfdCgpOworCisgICBpZiAocGFyX2Ftb3VudCA9PSAwKQorICAgICAgcmV0dXJuIGxpc3Q7CisKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYXJfYW1vdW50OyBpKyspIHsKKworICAgICAgc3RydWN0IGdsX3Byb2dyYW1fcGFyYW1ldGVyIHBhcjsKKyAgICAgIGdsX2NvbnN0YW50X3ZhbHVlIHZhbHVlc1s0XTsKKworICAgICAgY2hhciAqbmFtZSA9IG1hcC5yZWFkX3N0cmluZygpOworICAgICAgbWFwLnJlYWQoJnBhciwgc2l6ZW9mKHN0cnVjdCBnbF9wcm9ncmFtX3BhcmFtZXRlcikpOworICAgICAgbWFwLnJlYWQodmFsdWVzLCA0ICogc2l6ZW9mKGdsX2NvbnN0YW50X3ZhbHVlKSk7CisKKyAgICAgIF9tZXNhX2FkZF9wYXJhbWV0ZXIobGlzdCwgcGFyLlR5cGUsIG5hbWUsIHBhci5TaXplLCBwYXIuRGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcGFyLlN0YXRlSW5kZXhlcyk7CisgICB9CisgICBsaXN0LT5TdGF0ZUZsYWdzID0gbWFwLnJlYWRfdWludDMyX3QoKTsKKworICAgcmV0dXJuIGxpc3Q7Cit9CisKKworLyoqCisgKiBnbF9wcm9ncmFtIGNvbnRhaW5zIHBvc3QtbGluayBkYXRhIHBvcHVsYXRlZCBieSB0aGUgZHJpdmVyCisgKi8KK3N0YXRpYyBib29sCitkZXNlcmlhbGl6ZV9nbF9wcm9ncmFtKHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwgbWVtb3J5X21hcCAmbWFwKQoreworICAgbWFwLnJlYWQoc2hhZGVyLT5Qcm9ncmFtLCBzaXplb2Yoc3RydWN0IGdsX3Byb2dyYW0pKTsKKyAgIGNoYXIgKnN0ciA9IG1hcC5yZWFkX3N0cmluZygpOworICAgc2hhZGVyLT5Qcm9ncmFtLT5TdHJpbmcgPSAoR0x1Ynl0ZSopIF9tZXNhX3N0cmR1cChzdHIpOworCisgICBzaGFkZXItPlByb2dyYW0tPlBhcmFtZXRlcnMgPSBkZXNlcmlhbGl6ZV9wcm9ncmFtX3BhcmFtZXRlcnMobWFwKTsKKworICAgaWYgKG1hcC5lcnJvcnMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wKK3JlYWRfaGFzaF90YWJsZShzdHJ1Y3Qgc3RyaW5nX3RvX3VpbnRfbWFwICpoYXNoLCBtZW1vcnlfbWFwICptYXApCit7CisgICBpZiAobWFwLT5lcnJvcnMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgdWludDMyX3Qgc2l6ZSA9IG1hcC0+cmVhZF91aW50MzJfdCgpOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKyAgICAgIGNoYXIgKmtleSA9IG1hcC0+cmVhZF9zdHJpbmcoKTsKKyAgICAgIHVpbnQzMl90IHZhbHVlID0gbWFwLT5yZWFkX3VpbnQzMl90KCk7CisKKyAgICAgIC8qIHB1dCgpIGFkZHMgKzEgYmlhcyBvbiB0aGUgdmFsdWUgKHNlZSBoYXNoX3RhYmxlLmgpLCB0aGlzCisgICAgICAgKiBpcyB0YWtlbiBjYXJlIGhlcmUgd2hlbiByZWFkaW5nCisgICAgICAgKi8KKyAgICAgIGhhc2gtPnB1dCh2YWx1ZS0xLCBrZXkpOworCisgICAgICAvKiBicmVhayBvdXQgaW4gY2FzZSBvZiByZWFkIGVycm9ycyAqLworICAgICAgaWYgKG1hcC0+ZXJyb3JzKCkpCisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisgICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgdm9pZAorcmVhZF91bmlmb3JtX3N0b3JhZ2Uodm9pZCAqbWVtX2N0eCwgZ2xfdW5pZm9ybV9zdG9yYWdlICp1bmksIG1lbW9yeV9tYXAgJm1hcCkKK3sKKyAgIG1hcC5yZWFkKHVuaSwgc2l6ZW9mKGdsX3VuaWZvcm1fc3RvcmFnZSkpOworCisgICBjaGFyICpuYW1lID0gbWFwLnJlYWRfc3RyaW5nKCk7CisgICB1bmktPm5hbWUgPSBfbWVzYV9zdHJkdXAobmFtZSk7CisKKyAgIC8qIHR5cGUgaXMgcmVzb2x2ZWQgbGF0ZXIgKi8KKyAgIHVuaS0+dHlwZSA9IE5VTEw7CisgICB1bmktPmRyaXZlcl9zdG9yYWdlID0gTlVMTDsKKworICAgdWludDMyX3Qgc2l6ZSA9IG1hcC5yZWFkX3VpbnQzMl90KCk7CisKKyAgIHVuaS0+c3RvcmFnZSA9IHJ6YWxsb2NfYXJyYXkobWVtX2N0eCwgdW5pb24gZ2xfY29uc3RhbnRfdmFsdWUsIHNpemUpOworCisgICAvKiBpbml0aWFsaXplIHRvIHplcm8gZm9yIG5vdywgaW5pdGlhbGl6ZXJzIHdpbGwgYmUgcHJvcGFnYXRlZCBsYXRlciAqLworICAgbWVtc2V0KHVuaS0+c3RvcmFnZSwgMCwgc2l6ZSAqIHNpemVvZih1bmlvbiBnbF9jb25zdGFudF92YWx1ZSkpOworCisgICAvKiBkcml2ZXIgdW5pZm9ybSBzdG9yYWdlIGdldHMgZ2VuZXJhdGVkIGFuZCBwcm9wYWdhdGVkIGxhdGVyICovCisgICB1bmktPmRyaXZlcl9zdG9yYWdlID0gTlVMTDsKKyAgIHVuaS0+bnVtX2RyaXZlcl9zdG9yYWdlID0gMDsKK30KKworCitzdGF0aWMgaXJfdmFyaWFibGUgKgorc2VhcmNoX3ZhcihzdHJ1Y3QgZXhlY19saXN0ICpsaXN0LCBjb25zdCBjaGFyICpuYW1lKQoreworICAgZm9yZWFjaF9saXN0X3NhZmUobm9kZSwgbGlzdCkgeworICAgICAgaXJfdmFyaWFibGUgKnZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisgICAgICBpZiAodmFyICYmIHN0cmNtcChuYW1lLCB2YXItPm5hbWUpID09IDApCisgICAgICAgICByZXR1cm4gdmFyOworICAgfQorICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiBSZXNvbHZlIGdsc2xfdHlwZXMgZm9yIHVuaWZvcm1fc3RvcmFnZQorICovCitzdGF0aWMgdm9pZAorcmVzb2x2ZV91bmlmb3JtX3R5cGVzKHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywgc3RydWN0IGdsX3NoYWRlciAqc2hhKQoreworICAgLyogZm9yIGVhY2ggc3RvcmFnZSwgZmluZCBjb3JyZXNwb25kaW5nIHVuaWZvcm0gZnJvbSB0aGUgc2hhZGVyICovCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtVXNlclVuaWZvcm1TdG9yYWdlOyBpKyspIHsKKyAgICAgIGlyX3ZhcmlhYmxlICp2YXIgPSBzZWFyY2hfdmFyKHNoYS0+aXIsIHByb2ctPlVuaWZvcm1TdG9yYWdlW2ldLm5hbWUpOworCisgICAgICBpZiAodmFyKSB7CisgICAgICAgICAvKiBmb3IgYXJyYXlzLCB1bmlmb3JtIHN0b3JhZ2UgdHlwZSBjb250YWlucyB0aGUgZWxlbWVudCB0eXBlICovCisgICAgICAgICBpZiAodmFyLT50eXBlLT5pc19hcnJheSgpKQorICAgICAgICAgICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0udHlwZSA9IHZhci0+dHlwZS0+ZWxlbWVudF90eXBlKCk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpXS50eXBlID0gdmFyLT50eXBlOworICAgICAgfQorICAgfQorfQorCisKK3N0YXRpYyBib29sCit2YWxpZGF0ZV9iaW5hcnlfY2FjaGUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgbWVtb3J5X21hcCAmbWFwKQoreworICAgYXNzZXJ0KGN0eCk7CisgICB1aW50MzJfdCBkYXRhW251bV9jYWNoZV92YWxpZGF0aW9uX2RhdGFfaXRlbXNdOworCisgICAvLyByZWFkIHRoZSBjYWNoZSBzZW50aW5lbCBoZXJlLCBlbnN1cmUgaXQgaXMgbm9uLXplcm8sIG1lYW5pbmcKKyAgIC8vIGNhY2hlIGVudHJ5IGlzIGNvbXBsZXRlCisgICB1aW50MzJfdCBjYWNoZV9zZW50aW5lbCA9IDA7CisgICBtYXAucmVhZCgmY2FjaGVfc2VudGluZWwsIHNpemVvZihjYWNoZV9zZW50aW5lbCkpOworICAgaWYgKGNhY2hlX3NlbnRpbmVsID09IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIG1hcC5yZWFkKCZkYXRhLCBzaXplb2YoY2FjaGVfdmFsaWRhdGlvbl9kYXRhKSk7CisKKyAgIC8qIHZhbGlkYXRpb24gZGF0YSAoY29tbW9uIHN0cnVjdCBzaXplcykgbXVzdCBtYXRjaCAqLworICAgaWYgKG1lbWNtcCgmZGF0YSwgY2FjaGVfdmFsaWRhdGlvbl9kYXRhLCBzaXplb2YoY2FjaGVfdmFsaWRhdGlvbl9kYXRhKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGNoYXIgKmNhY2hlX21hZ2ljX2lkID0gbWFwLnJlYWRfc3RyaW5nKCk7CisgICBjaGFyICpjYWNoZV92ZW5kb3IgPSBtYXAucmVhZF9zdHJpbmcoKTsKKyAgIGNoYXIgKmNhY2hlX3JlbmRlcmVyID0gbWFwLnJlYWRfc3RyaW5nKCk7CisKKyAgIGNvbnN0IGNoYXIgKm1lc2FfbWFnaWNfaWQgPSBtZXNhX2dldF9zaGFkZXJfY2FjaGVfbWFnaWMoKTsKKworICAgY29uc3QgY2hhciAqbWVzYV92ZW5kb3IgPQorICAgICAgKGNvbnN0IGNoYXIgKikgY3R4LT5Ecml2ZXIuR2V0U3RyaW5nKGN0eCwgR0xfVkVORE9SKTsKKyAgIGNvbnN0IGNoYXIgKm1lc2FfcmVuZGVyZXIgPQorICAgICAgKGNvbnN0IGNoYXIgKikgY3R4LT5Ecml2ZXIuR2V0U3RyaW5nKGN0eCwgR0xfUkVOREVSRVIpOworCisgICAvLyBFbnN1cmUgd2UgZGlkbid0IGdldCBzb21ldGhpbmcgYmFkIGJhY2sgZnJvbSBjYWNoZSBzb21laG93CisgICBpZiAoISAoY2FjaGVfbWFnaWNfaWQgJiYgY2FjaGVfdmVuZG9yICYmIGNhY2hlX3JlbmRlcmVyICYmCisgICAgICAgICAgIG1lc2FfbWFnaWNfaWQgJiYgbWVzYV92ZW5kb3IgICYmIG1lc2FfcmVuZGVyZXIpKQorICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qIGNoZWNrIGlmIGNhY2hlIHdhcyBjcmVhdGVkIHdpdGggYW5vdGhlciBkcml2ZXIgKi8KKyAgIGlmICgoc3RyY21wKG1lc2FfdmVuZG9yLCBjYWNoZV92ZW5kb3IpKSB8fAorICAgICAgKHN0cmNtcChtZXNhX3JlbmRlcmVyLCBjYWNoZV9yZW5kZXJlcikpKQorICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAvKiBjaGVjayBhZ2FpbnN0IGRpZmZlcmVudCB2ZXJzaW9uIG9mIG1lc2EgKi8KKyAgIGlmIChzdHJjbXAoY2FjaGVfbWFnaWNfaWQsIG1lc2FfbWFnaWNfaWQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiByZWFkIGFuZCBzZXJpYWxpemUgYSBnbF9zaGFkZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2xfc2hhZGVyICoKK3JlYWRfc2hhZGVyX2luX3BsYWNlKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHZvaWQgKm1lbV9jdHgsIG1lbW9yeV9tYXAgJm1hcCwgaXJfZGVzZXJpYWxpemVyICZzLCBzdHJ1Y3QgZ2xfc2hhZGVyICpzaGFkZXIpCit7CisgICBhc3NlcnQoY3R4KTsKKyAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nID0gTlVMTDsKKyAgIGdsX3NoYWRlcl9zdGFnZSBzdGFnZTsKKworICAgLy8gSWYgc2hhZGVyIGlzIE5VTEwsIHdlIGFyZSBpbiBwcm9ncmFtIHBhdGgsIGFuZCBuZWVkIHRvIGNoZWNrIHNlbnRpbmVsCisgICAvLyBJbiBzaGFkZXJfb25seSBwYXRoLCBzZW50aW5lbCBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgYnkgdmFsaWRhdGVfYmluYXJ5X2NhY2hlCisgICBpZiAoc2hhZGVyID09IE5VTEwpIHsKKyAgICAgIHVpbnQzMl90IHNoYWRlcl9zZW50aW5lbCA9IG1hcC5yZWFkX3VpbnQzMl90KCk7CisgICAgICBpZiAoc2hhZGVyX3NlbnRpbmVsID09IDApCisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgdWludDMyX3Qgc2hhZGVyX3NpemUgPSBtYXAucmVhZF91aW50MzJfdCgpOworICAgdWludDMyX3QgdHlwZSA9IG1hcC5yZWFkX3VpbnQzMl90KCk7CisKKyAgIEdMdWludCBuYW1lOworICAgR0xpbnQgcmVmY291bnQ7CisgICBjb25zdCBjaGFyKiBzb3VyY2U7CisKKyAgIGJvb2wgc2hhZGVyX2NsZWFudXAgPSBmYWxzZTsKKyAgIGJvb2wgcHJvZ3JhbV9jbGVhbnVwID0gZmFsc2U7CisKKyAgIC8qIFVzZWZ1bCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nLiAqLworICAgKHZvaWQpIHNoYWRlcl9zaXplOworCisgICAvKiB2ZXJpZnkgdGhhdCB0eXBlIGlzIHN1cHBvcnRlZCAqLworICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIEdMX1ZFUlRFWF9TSEFERVI6CisgICAgICBjYXNlIEdMX0ZSQUdNRU5UX1NIQURFUjoKKyAgICAgIGNhc2UgR0xfR0VPTUVUUllfU0hBREVSOgorICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgZ290byBlcnJvcl9kZXNlcmlhbGl6ZTsKKyAgIH0KKworICAgaWYoIXNoYWRlcikgeworICAgICAgc2hhZGVyX2NsZWFudXAgPSB0cnVlOworICAgICAgc2hhZGVyID0gY3R4LT5Ecml2ZXIuTmV3U2hhZGVyKE5VTEwsIDAsIHR5cGUpOworICAgfQorCisgICBpZiAoIXNoYWRlcikKKyAgICAgIHJldHVybiBOVUxMOworCisgICAvKiBTZXQgdGhlIGZpZWxkcyB3ZSBhbHJlYWR5IGtub3cgKi8KKyAgIG5hbWUgPSBzaGFkZXItPk5hbWU7CisgICByZWZjb3VudCA9IHNoYWRlci0+UmVmQ291bnQ7CisgICBzb3VyY2UgPSBzaGFkZXItPlNvdXJjZTsKKworICAgLyogSWYgYW55dGhpbmcgaGFzIGJlZW4gYWRkZWQgdG8gZ2xfc2hhZGVyX3Byb2dyYW0sIHdlIG5lZWQgdG8gZ3JvayBpdCBmb3IKKyAgICAqIGRlc2VyaWFsaXphdGlvbi4gIGkuZS4gZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNhY2hlIGEgbXV0ZXggaWQ/ICBOby4KKyAgICAqIEJlbG93IGlzIHNpemUgZm9yIG1lc2EtMTAuMi41IHdpdGggZGVmZXJyZWQgY29tcGlsYXRpb24uCisgICAgKi8KKyAgICNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2X18pCisgICAgICBTVEFUSUNfQVNTRVJUKHNpemVvZihnbF9zaGFkZXIpID09IDQwMCk7CisgICAjZWxzZQorICAgICAgU1RBVElDX0FTU0VSVChzaXplb2YoZ2xfc2hhZGVyKSA9PSA0NjQpOworICAgI2VuZGlmCisKKyAgIC8qIFJlYWRpbmcgaW5kaXZpZHVhbCBmaWVsZHMgYW5kIHN0cnVjdHMgd291bGQgc2xvdyB1cyBkb3duIGhlcmUuIFRoaXMgaXMKKyAgICAqIHNsaWdodGx5IGRhbmdlcm91cyB0aG91Z2ggYW5kIHdlIG5lZWQgdG8gdGFrZSBjYXJlIHRvIGluaXRpYWxpemUgYW55CisgICAgKiBwb2ludGVycyBwcm9wZXJseS4KKyAgICAqCisgICAgKiBSZWFkIHVwIHRvIChidXQgZXhjbHVkZSkgZ2xfc2hhZGVyOjpNdXRleCB0byBhdm9pZCByYWNlcy4KKyAgICAqLworICAgbWFwLnJlYWQoc2hhZGVyLCBvZmZzZXRvZihzdHJ1Y3QgZ2xfc2hhZGVyLCBNdXRleCkpOworICAgbWFwLmZmd2Qoc2l6ZW9mKHN0cnVjdCBnbF9zaGFkZXIpIC0gb2Zmc2V0b2Yoc3RydWN0IGdsX3NoYWRlciwgTXV0ZXgpKTsKKworICAgLyogdmVyaWZ5IHRoYXQgdHlwZSBmcm9tIGhlYWRlciBtYXRjaGVzICovCisgICBpZiAoc2hhZGVyLT5UeXBlICE9IHR5cGUpCisgICAgICBnb3RvIGVycm9yX2Rlc2VyaWFsaXplOworCisgICAvKiBTZXQgY29ycmVjdCBuYW1lIGFuZCByZWZjb3VudC4gKi8KKyAgIHNoYWRlci0+TmFtZSA9IG5hbWU7CisgICBzaGFkZXItPlJlZkNvdW50ID0gcmVmY291bnQ7CisgICBzaGFkZXItPlNvdXJjZSA9IHNvdXJjZTsKKworICAgLyogY2xlYXIgYWxsIHBvaW50ZXIgZmllbGRzLCBvbmx5IGRhdGEgcHJlc2VydmVkICovCisgICBzaGFkZXItPkxhYmVsID0gTlVMTDsKKyAgIHNoYWRlci0+UHJvZ3JhbSA9IE5VTEw7CisgICBzaGFkZXItPkluZm9Mb2cgPSByYWxsb2Nfc3RyZHVwKG1lbV9jdHgsICIiKTsKKyAgIHNoYWRlci0+VW5pZm9ybUJsb2NrcyA9IE5VTEw7CisgICBzaGFkZXItPmlyID0gTlVMTDsKKyAgIHNoYWRlci0+c3ltYm9scyA9IE5VTEw7CisKKyAgIHN0YWdlID0gX21lc2Ffc2hhZGVyX2VudW1fdG9fc2hhZGVyX3N0YWdlKHNoYWRlci0+VHlwZSk7CisKKyAgIHByb2cgPQorICAgICAgY3R4LT5Ecml2ZXIuTmV3UHJvZ3JhbShjdHgsIF9tZXNhX3NoYWRlcl9zdGFnZV90b19wcm9ncmFtKHN0YWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyLT5OYW1lKTsKKworICAgaWYgKCFwcm9nKQorICAgICAgZ290byBlcnJvcl9kZXNlcmlhbGl6ZTsKKyAgIGVsc2UKKyAgICAgIHByb2dyYW1fY2xlYW51cCA9IHRydWU7CisKKyAgIF9tZXNhX3JlZmVyZW5jZV9wcm9ncmFtKGN0eCwgJnNoYWRlci0+UHJvZ3JhbSwgcHJvZyk7CisKKyAgIC8qIElSIHRyZWUgKi8KKyAgIGlmICghcy5kZXNlcmlhbGl6ZShjdHgsIG1lbV9jdHgsIHNoYWRlciwgJm1hcCkpCisgICAgICBnb3RvIGVycm9yX2Rlc2VyaWFsaXplOworCisgICByZXR1cm4gc2hhZGVyOworCitlcnJvcl9kZXNlcmlhbGl6ZToKKworICAgaWYgKHNoYWRlciAmJiBzaGFkZXJfY2xlYW51cCkKKyAgICAgIGN0eC0+RHJpdmVyLkRlbGV0ZVNoYWRlcihjdHgsIHNoYWRlcik7CisKKyAgIGlmIChwcm9nICYmIHByb2dyYW1fY2xlYW51cCkKKyAgICAgIF9tZXNhX3JlZmVyZW5jZV9wcm9ncmFtKGN0eCwgJnNoYWRlci0+UHJvZ3JhbSwgTlVMTCk7CisKKyAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBnbF9zaGFkZXIgKgorcmVhZF9zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgdm9pZCAqbWVtX2N0eCwgbWVtb3J5X21hcCAmbWFwLCBpcl9kZXNlcmlhbGl6ZXIgJnMpCit7CisgICBhc3NlcnQoY3R4KTsKKyAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciA9IE5VTEw7CisgICBzaGFkZXIgPSByZWFkX3NoYWRlcl9pbl9wbGFjZShjdHgsIG1lbV9jdHgsIG1hcCwgcywgc2hhZGVyKTsKKyAgIHJldHVybiBzaGFkZXI7Cit9CisKKworLyogcmVhZCBhbmQgc2VyaWFsaXplIGEgZ2xfc2hhZGVyICovCisvKiB0aGlzIHZlcnNpb24gaXMgdXNlZCBleHRlcm5hbGx5IHdpdGhvdXQgcmVxdWlyaW5nCisgKiBjcmVhdGlvbiBvZiBpcl9kZXNlcmlhbGl6ZXIKKyAqLworc3RydWN0IGdsX3NoYWRlciAqCityZWFkX3NpbmdsZV9zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyLCBjb25zdCBjaGFyKiBwYXRoKQoreworICAgYXNzZXJ0KGN0eCk7CisKKyAgIGlyX2Rlc2VyaWFsaXplciBzOworCisgICBtZW1vcnlfbWFwIG1hcDsKKworICAgaWYgKG1hcC5tYXAocGF0aCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaWYgKHZhbGlkYXRlX2JpbmFyeV9jYWNoZShjdHgsIG1hcCkgPT0gZmFsc2UpIHsKKyAgICAgIC8qIENhY2hlIGJpbmFyeSBwcm9kdWNlZCB3aXRoIGEgZGlmZmVyZW50IE1lc2EsIHJlbW92ZSBpdC4gKi8KKyAgICAgIHVubGluayhwYXRoKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gcmVhZF9zaGFkZXJfaW5fcGxhY2UoY3R4LCBzaGFkZXIsIG1hcCwgcywgc2hhZGVyKTsKK30KKworCitzdGF0aWMgaW50CitkZXNlcmlhbGl6ZV9wcm9ncmFtKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywgbWVtb3J5X21hcCAmbWFwKQoreworICAgYXNzZXJ0KGN0eCk7CisKKyAgIGlmICh2YWxpZGF0ZV9iaW5hcnlfY2FjaGUoY3R4LCBtYXApID09IGZhbHNlKQorICAgICAgcmV0dXJuIE1FU0FfU0hBREVSX0RFU0VSSUFMSVpFX1ZFUlNJT05fRVJST1I7CisKKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSB0bXBfcHJvZzsKKworICAgLyogSWYgYW55dGhpbmcgaGFzIGJlZW4gYWRkZWQgdG8gZ2xfc2hhZGVyX3Byb2dyYW0sIHdlIG5lZWQgdG8gZ3JvayBpdCBmb3IKKyAgICAqIGRlc2VyaWFsaXphdGlvbi4gIGkuZS4gZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNhY2hlIGEgbXV0ZXggaWQ/ICBOby4KKyAgICAqIEJlbG93IGlzIHNpemUgZm9yIG1lc2EtMTAuMi41IHdpdGggZGVmZXJyZWQgY29tcGlsYXRpb24uCisgICAgKi8KKyAgICNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2X18pCisgICAgICBTVEFUSUNfQVNTRVJUKHNpemVvZihnbF9zaGFkZXJfcHJvZ3JhbSkgPT0gMjY4KTsKKyAgICNlbHNlCisgICAgICBTVEFUSUNfQVNTRVJUKHNpemVvZihnbF9zaGFkZXJfcHJvZ3JhbSkgPT0gNDA4KTsKKyAgICNlbmRpZgorCisgICAvKiBSZWFkIHVwIHRvIChidXQgZXhjbHVkZSkgZ2xfc2hhZGVyX3Byb2dyYW06Ok11dGV4IHRvIGF2b2lkIHJhY2VzICovCisgICBtYXAucmVhZCgmdG1wX3Byb2csIG9mZnNldG9mKGdsX3NoYWRlcl9wcm9ncmFtLCBNdXRleCkpOworICAgbWFwLmZmd2Qoc2l6ZW9mKGdsX3NoYWRlcl9wcm9ncmFtKSAtIG9mZnNldG9mKGdsX3NoYWRlcl9wcm9ncmFtLCBNdXRleCkpOworCisgICAvKiBDYWNoZSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBhdGliaWxpdHkgZXh0ZW5zaW9ucworICAgICogbGlrZSBBUkJfRVMzX2NvbXBhdGliaWxpdHkgKHlldCkuCisgICAgKi8KKyAgIGlmIChfbWVzYV9pc19kZXNrdG9wX2dsKGN0eCkgJiYgdG1wX3Byb2cuSXNFUykKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9ERVNFUklBTElaRV9SRUFEX0VSUk9SOworCisgICBwcm9nLT5UeXBlID0gdG1wX3Byb2cuVHlwZTsKKyAgIHByb2ctPlZlcnNpb24gPSB0bXBfcHJvZy5WZXJzaW9uOworICAgcHJvZy0+SXNFUyA9IHRtcF9wcm9nLklzRVM7CisgICBwcm9nLT5OdW1Vc2VyVW5pZm9ybVN0b3JhZ2UgPSB0bXBfcHJvZy5OdW1Vc2VyVW5pZm9ybVN0b3JhZ2U7CisgICBwcm9nLT5OdW1Vbmlmb3JtUmVtYXBUYWJsZSA9IHRtcF9wcm9nLk51bVVuaWZvcm1SZW1hcFRhYmxlOworICAgcHJvZy0+TGFzdENsaXBEaXN0YW5jZUFycmF5U2l6ZSA9IHRtcF9wcm9nLkxhc3RDbGlwRGlzdGFuY2VBcnJheVNpemU7CisgICBwcm9nLT5GcmFnRGVwdGhMYXlvdXQgPSB0bXBfcHJvZy5GcmFnRGVwdGhMYXlvdXQ7CisKKyAgIHByb2ctPlVuaWZvcm1TdG9yYWdlID0gTlVMTDsKKyAgIHByb2ctPkxhYmVsID0gTlVMTDsKKworICAgcHJvZy0+VW5pZm9ybUhhc2ggPSBuZXcgc3RyaW5nX3RvX3VpbnRfbWFwOworCisgICAvKiB0aGVzZSBhbHJlYWR5IGFsbG9jYXRlZCBieSBfbWVzYV9pbml0X3NoYWRlcl9wcm9ncmFtICovCisgICByZWFkX2hhc2hfdGFibGUocHJvZy0+QXR0cmlidXRlQmluZGluZ3MsICZtYXApOworICAgcmVhZF9oYXNoX3RhYmxlKHByb2ctPkZyYWdEYXRhQmluZGluZ3MsICZtYXApOworICAgcmVhZF9oYXNoX3RhYmxlKHByb2ctPkZyYWdEYXRhSW5kZXhCaW5kaW5ncywgJm1hcCk7CisKKyAgIHJlYWRfaGFzaF90YWJsZShwcm9nLT5Vbmlmb3JtSGFzaCwgJm1hcCk7CisKKyAgIGlmIChtYXAuZXJyb3JzKCkpCisgICAgICByZXR1cm4gTUVTQV9TSEFERVJfREVTRVJJQUxJWkVfUkVBRF9FUlJPUjsKKworICAgbWVtY3B5KCZwcm9nLT5HZW9tLCAmdG1wX3Byb2cuR2VvbSwgc2l6ZW9mKHByb2ctPkdlb20pKTsKKyAgIG1lbWNweSgmcHJvZy0+VmVydCwgJnRtcF9wcm9nLlZlcnQsIHNpemVvZihwcm9nLT5WZXJ0KSk7CisKKyAgIC8qIHVuaWZvcm0gc3RvcmFnZSAqLworICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2UgPSByemFsbG9jX2FycmF5KHByb2csIHN0cnVjdCBnbF91bmlmb3JtX3N0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZy0+TnVtVXNlclVuaWZvcm1TdG9yYWdlKTsKKworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb2ctPk51bVVzZXJVbmlmb3JtU3RvcmFnZTsgaSsrKQorICAgICAgcmVhZF91bmlmb3JtX3N0b3JhZ2UocHJvZywgJnByb2ctPlVuaWZvcm1TdG9yYWdlW2ldLCBtYXApOworCisgICBwcm9nLT5Vbmlmb3JtUmVtYXBUYWJsZSA9CisgICAgICByemFsbG9jX2FycmF5KHByb2csIGdsX3VuaWZvcm1fc3RvcmFnZSAqLCBwcm9nLT5OdW1Vbmlmb3JtUmVtYXBUYWJsZSk7CisKKyAgIC8qIGFzc2lnbiByZW1hcCBlbnRyaWVzIGZyb20gVW5pZm9ybVN0b3JhZ2UgKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9nLT5OdW1Vc2VyVW5pZm9ybVN0b3JhZ2U7IGkrKykgeworICAgICAgdW5zaWduZWQgZW50cmllcyA9IE1BWDIoMSwgcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0uYXJyYXlfZWxlbWVudHMpOworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGVudHJpZXM7IGorKykKKyAgICAgICAgIHByb2ctPlVuaWZvcm1SZW1hcFRhYmxlW3Byb2ctPlVuaWZvcm1TdG9yYWdlW2ldLnJlbWFwX2xvY2F0aW9uICsgal0gPQorICAgICAgICAgICAgJnByb2ctPlVuaWZvcm1TdG9yYWdlW2ldOworICAgfQorCisgICAvKiBob3cgbWFueSBsaW5rZWQgc2hhZGVycyBkb2VzIHRoZSBiaW5hcnkgY29udGFpbiAqLworICAgdWludDhfdCBzaGFkZXJfYW1vdW50ID0gbWFwLnJlYWRfdWludDhfdCgpOworCisgICAvKiB1c2Ugc2FtZSBkZXNlcmlhbGl6ZXIgdG8gaGF2ZSBzYW1lIHR5cGVfaGFzaCBhY3Jvc3Mgc2hhZGVyIHN0YWdlcyAqLworICAgaXJfZGVzZXJpYWxpemVyIHM7CisKKyAgIC8qIGluaXQgbGlzdCwgY2FjaGUgY2FuIGNvbnRhaW4gb25seSBzb21lIHNoYWRlciB0eXBlcyAqLworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1FU0FfU0hBREVSX1NUQUdFUzsgaSsrKQorICAgICAgcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0gPSBOVUxMOworCisgICAvKiBPbmx5IHJlYWRpbmcgZXJyb3Igb3IgZXJyb3IgY29uc3RydWN0aW5nIGdsX3Byb2dyYW0gY2FuIGNoYW5nZSB0aGlzLiAqLworICAgcHJvZy0+TGlua1N0YXR1cyA9IHRydWU7CisKKyAgIC8qIHJlYWQgX0xpbmtlZFNoYWRlcnMgKi8KKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaGFkZXJfYW1vdW50OyBpKyspIHsKKyAgICAgIHVpbnQzMl90IGluZGV4ID0gbWFwLnJlYWRfdWludDMyX3QoKTsKKworICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2hhID0gcmVhZF9zaGFkZXIoY3R4LCBwcm9nLCBtYXAsIHMpOworCisgICAgICBpZiAoIXNoYSkKKyAgICAgICAgIHJldHVybiBNRVNBX1NIQURFUl9ERVNFUklBTElaRV9SRUFEX0VSUk9SOworCisgICAgICByZXNvbHZlX3VuaWZvcm1fdHlwZXMocHJvZywgc2hhKTsKKworICAgICAgX21lc2FfcmVmZXJlbmNlX3NoYWRlcihjdHgsICZwcm9nLT5fTGlua2VkU2hhZGVyc1tpbmRleF0sIHNoYSk7CisKKyAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpsaW5rZWRfcHJvZyA9IGN0eC0+RHJpdmVyLkdldFByb2dyYW0oY3R4LCBwcm9nLCBzaGEpOworICAgICAgaWYgKGxpbmtlZF9wcm9nKSB7CisgICAgICAgICBfbWVzYV9jb3B5X2xpbmtlZF9wcm9ncmFtX2RhdGEoKGdsX3NoYWRlcl9zdGFnZSkgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZywgbGlua2VkX3Byb2cpOworICAgICAgICAgX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oY3R4LCAmc2hhLT5Qcm9ncmFtLCBsaW5rZWRfcHJvZyk7CisgICAgICAgICBfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShjdHgsICZsaW5rZWRfcHJvZywgTlVMTCk7CisgICAgICB9CisKKyAgIH0KKworICAgLyogc2V0IGRlZmF1bHQgdmFsdWVzIGZvciB1bmlmb3JtcyB0aGF0IGhhdmUgaW5pdGlhbGl6ZXIgKi8KKyAgIGxpbmtfc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXJzKHByb2cpOworCisgICBwcm9nLT5fTGlua2VkID0gR0xfVFJVRTsKKworICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemUgZ2xfc2hhZGVyX3Byb2dyYW0gc3RydWN0dXJlCisgKi8KK2V4dGVybiAiQyIgaW50CittZXNhX3Byb2dyYW1fZGVzZXJpYWxpemUoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICBhc3NlcnQoY3R4KTsKKyAgIG1lbW9yeV9tYXAgbWFwOworICAgbWFwLm1hcCgoY29uc3Qgdm9pZCopIGRhdGEsIHNpemUpOworICAgcmV0dXJuIGRlc2VyaWFsaXplX3Byb2dyYW0oY3R4LCBwcm9nLCBtYXApOworfQorCisKK2V4dGVybiAiQyIgaW50CittZXNhX3Byb2dyYW1fbG9hZChzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKQoreworICAgYXNzZXJ0KGN0eCk7CisgICBtZW1vcnlfbWFwIG1hcDsKKyAgIGludCByZXN1bHQgPSAwOworCisgICBpZiAobWFwLm1hcChwYXRoKSkKKyAgICAgIHJldHVybiAtMTsKKyAgIHJlc3VsdCA9IGRlc2VyaWFsaXplX3Byb2dyYW0oY3R4LCBwcm9nLCBtYXApOworCisgICAvKiBDYWNoZSBiaW5hcnkgcHJvZHVjZWQgd2l0aCBhIGRpZmZlcmVudCBNZXNhLCByZW1vdmUgaXQuICovCisgICBpZiAocmVzdWx0ID09IE1FU0FfU0hBREVSX0RFU0VSSUFMSVpFX1ZFUlNJT05fRVJST1IpCisgICAgICB1bmxpbmsocGF0aCk7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3NoYWRlcl9zZXJpYWxpemUuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zaGFkZXJfc2VyaWFsaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRkMmUwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zaGFkZXJfc2VyaWFsaXplLmNwcApAQCAtMCwwICsxLDIyOSBAQAorLyogLSotIGMrKyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAic2hhZGVyX2NhY2hlLmgiCisjaW5jbHVkZSAiaXJfc2VyaWFsaXplLmgiCisKKyNkZWZpbmUgTUVTQV9TSEFERVJfQ0FDSEVfTUFHSUMgX19EQVRFX18gIiAiIF9fVElNRV9fCisKK2NvbnN0IGNoYXIgKgorbWVzYV9nZXRfc2hhZGVyX2NhY2hlX21hZ2ljKCkKK3sKKyAgIHJldHVybiBNRVNBX1NIQURFUl9DQUNIRV9NQUdJQzsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGdsX3NoYWRlciBzdHJ1Y3R1cmUsIHdyaXRlcyBzaGFkZXIgaGVhZGVyCisgKiBpbmZvcm1hdGlvbiBhbmQgZXhlY19saXN0IG9mIGluc3RydWN0aW9ucworICovCitleHRlcm4gIkMiIGNoYXIgKgorbWVzYV9zaGFkZXJfc2VyaWFsaXplKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciwgc2l6ZV90ICpzaXplLCBib29sIHNoYWRlcl9vbmx5KQoreworICAgYXNzZXJ0KGN0eCk7CisKKyAgIGlmICghc3VwcG9ydGVkX2J5X3NoYWRlcl9jYWNoZShzaGFkZXIsIHRydWUgLyogaXNfd3JpdGUgKi8pKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICpzaXplID0gMDsKKworICAgbWVtb3J5X3dyaXRlciBibG9iOworCisgICAvLyB3cml0ZSB0aGUgc2l6ZSBlYXJseSBmb3IgcXVpY2sgY29tcGxldGVuZXNzIGNoZWNraW5nCisgICBhc3NlcnQoYmxvYi5wb3NpdGlvbigpID09IDApOworICAgdWludDMyX3Qgc2hhZGVyX3NlbnRpbmVsID0gMDsKKyAgIGJsb2Iud3JpdGVfdWludDMyX3Qoc2hhZGVyX3NlbnRpbmVsKTsKKworICAgaWYgKHNoYWRlcl9vbmx5KSB7CisgICAgICAvKiBJZiBvbmx5IHNlcmlhbGl6aW5nIHNoYWRlciwgd2UgbXVzdCBwb3B1bGF0ZSBvdXIgY2FjaGUgaWRlbnRpZmllcnMgKi8KKyAgICAgIGJsb2Iud3JpdGUoJmNhY2hlX3ZhbGlkYXRpb25fZGF0YSwgc2l6ZW9mKGNhY2hlX3ZhbGlkYXRpb25fZGF0YSkpOworCisgICAgICBibG9iLndyaXRlX3N0cmluZyhtZXNhX2dldF9zaGFkZXJfY2FjaGVfbWFnaWMoKSk7CisgICAgICBibG9iLndyaXRlX3N0cmluZygoY29uc3QgY2hhciAqKWN0eC0+RHJpdmVyLkdldFN0cmluZyhjdHgsIEdMX1ZFTkRPUikpOworICAgICAgYmxvYi53cml0ZV9zdHJpbmcoKGNvbnN0IGNoYXIgKiljdHgtPkRyaXZlci5HZXRTdHJpbmcoY3R4LCBHTF9SRU5ERVJFUikpOworICAgfQorCisgICBpbnQzMl90IHN0YXJ0X3BvcyA9IGJsb2IucG9zaXRpb24oKTsKKyAgIHVpbnQzMl90IHNoYWRlcl9kYXRhX2xlbiA9IDA7CisgICB1aW50MzJfdCBzaGFkZXJfdHlwZSA9IHNoYWRlci0+VHlwZTsKKworICAgYmxvYi53cml0ZV91aW50MzJfdChzaGFkZXJfZGF0YV9sZW4pOworICAgYmxvYi53cml0ZV91aW50MzJfdChzaGFkZXJfdHlwZSk7CisKKyAgIGJsb2Iud3JpdGUoc2hhZGVyLCBzaXplb2Yoc3RydWN0IGdsX3NoYWRlcikpOworCisgICAvKiBkdW1wIGFsbCBzaGFkZXIgaW5zdHJ1Y3Rpb25zICovCisgICBzZXJpYWxpemVfbGlzdChzaGFkZXItPmlyLCBibG9iKTsKKworICAgc2hhZGVyX2RhdGFfbGVuID0gYmxvYi5wb3NpdGlvbigpIC0KKyAgICAgIHN0YXJ0X3BvcyAtIHNpemVvZihzaGFkZXJfZGF0YV9sZW4pOworICAgYmxvYi5vdmVyd3JpdGUoJnNoYWRlcl9kYXRhX2xlbiwgc2l6ZW9mKHNoYWRlcl9kYXRhX2xlbiksIHN0YXJ0X3Bvcyk7CisKKyAgIC8vIHdyaXRlIHNoYWRlciBsZW5ndGggdG8gc2VudGluZWwgZm9yIG5vdworICAgc2hhZGVyX3NlbnRpbmVsID0gc2hhZGVyX2RhdGFfbGVuOworICAgYmxvYi5vdmVyd3JpdGUoJnNoYWRlcl9zZW50aW5lbCwgc2l6ZW9mKHNoYWRlcl9zZW50aW5lbCksIDApOworCisgICAqc2l6ZSA9IGJsb2IucG9zaXRpb24oKTsKKworICAgcmV0dXJuIGJsb2IucmVsZWFzZV9tZW1vcnkoc2l6ZSk7Cit9CisKKworLyoqCisgKiBoZWxwZXIgc3RydWN0dXJlIGZvciBoYXNoIHNlcmlhbGl6YXRpb24sIGhhc2ggc2l6ZSBpcworICogY291bnRlZCB0byBpdGVtX2NvdW50IGR1cmluZyBzZXJpYWxpemF0aW9uCisgKi8KK3N0cnVjdCBoYXNoX3NlcmlhbGl6ZV9kYXRhCit7CisgICBoYXNoX3NlcmlhbGl6ZV9kYXRhKHZvaWQgKm1lbW9yeV93cml0ZXIpIDoKKyAgICAgIHdyaXRlcihtZW1vcnlfd3JpdGVyKSwKKyAgICAgIGl0ZW1fY291bnQoMCkgeyB9CisKKyAgIHZvaWQgKndyaXRlcjsKKyAgIHVpbnQzMl90IGl0ZW1fY291bnQ7Cit9OworCisKK3N0YXRpYyB2b2lkCitzZXJpYWxpemVfaGFzaChjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsIHZvaWQgKmNsb3N1cmUpCit7CisgICBoYXNoX3NlcmlhbGl6ZV9kYXRhICpzX2RhdGEgPSAoaGFzaF9zZXJpYWxpemVfZGF0YSAqKSBjbG9zdXJlOworICAgbWVtb3J5X3dyaXRlciAqYmxvYiA9IChtZW1vcnlfd3JpdGVyICopIHNfZGF0YS0+d3JpdGVyOworCisgICB1aW50MzJfdCB2YWx1ZSA9ICgoaW50cHRyX3QpZGF0YSk7CisKKyAgIGJsb2ItPndyaXRlX3N0cmluZygoY2hhciAqKWtleSk7CisgICBibG9iLT53cml0ZV91aW50MzJfdCh2YWx1ZSk7CisKKyAgIHNfZGF0YS0+aXRlbV9jb3VudCsrOworfQorCisKK3N0YXRpYyB2b2lkCitzZXJpYWxpemVfaGFzaF90YWJsZShzdHJ1Y3Qgc3RyaW5nX3RvX3VpbnRfbWFwICptYXAsIG1lbW9yeV93cml0ZXIgKmJsb2IpCit7CisgICBzdHJ1Y3QgaGFzaF9zZXJpYWxpemVfZGF0YSBkYXRhKGJsb2IpOworICAgaW50MzJfdCBwb3MgPSBibG9iLT5wb3NpdGlvbigpOworICAgYmxvYi0+d3JpdGVfdWludDMyX3QoZGF0YS5pdGVtX2NvdW50KTsKKworICAgbWFwLT5pdGVyYXRlKHNlcmlhbGl6ZV9oYXNoLCAmZGF0YSk7CisKKyAgIGJsb2ItPm92ZXJ3cml0ZSgmZGF0YS5pdGVtX2NvdW50LCBzaXplb2YoZGF0YS5pdGVtX2NvdW50KSwgcG9zKTsKK30KKworCitzdGF0aWMgdm9pZAorc2VyaWFsaXplX3VuaWZvcm1fc3RvcmFnZShnbF91bmlmb3JtX3N0b3JhZ2UgKnVuaSwgbWVtb3J5X3dyaXRlciAmYmxvYikKK3sKKyAgIGJsb2Iud3JpdGUodW5pLCBzaXplb2YoZ2xfdW5pZm9ybV9zdG9yYWdlKSk7CisgICBibG9iLndyaXRlX3N0cmluZyh1bmktPm5hbWUpOworCisgICAvKiBub3RlLCB0eXBlIGlzIG5vdCBzZXJpYWxpemVkLCBpdCBpcyByZXNvbHZlZCBkdXJpbmcgcGFyc2luZyAqLworCisgICAvKiBob3cgbWFueSBlbGVtZW50cyAoMSBpZiBub3QgYXJyYXkpICogaG93IG1hbnkgY29tcG9uZW50cyBpbiB0aGUgdHlwZSAqLworICAgY29uc3QgdW5zaWduZWQgZWxlbWVudHMgPSBNQVgyKDEsIHVuaS0+YXJyYXlfZWxlbWVudHMpOworICAgdWludDMyX3Qgc2l6ZSA9IGVsZW1lbnRzICogTUFYMigxLCB1bmktPnR5cGUtPmNvbXBvbmVudHMoKSk7CisKKyAgIGJsb2Iud3JpdGVfdWludDMyX3Qoc2l6ZSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGdsX3NoYWRlcl9wcm9ncmFtIHN0cnVjdHVyZQorICovCitleHRlcm4gIkMiIGNoYXIgKgorbWVzYV9wcm9ncmFtX3NlcmlhbGl6ZShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csIHNpemVfdCAqc2l6ZSkKK3sKKyAgIGFzc2VydChjdHgpOworCisgICBpZiAoIXN1cHBvcnRlZF9ieV9wcm9ncmFtX2NhY2hlKHByb2csIHRydWUgLyogaXNfd3JpdGUgKi8pKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIG1lbW9yeV93cml0ZXIgYmxvYjsKKworICAgLy8gd3JpdGUgdGhlIHNpemUgZWFybHkgZm9yIHF1aWNrIGNvbXBsZXRlbmVzcyBjaGVja2luZworICAgYXNzZXJ0KGJsb2IucG9zaXRpb24oKSA9PSAwKTsKKyAgIHVpbnQzMl90IHByb2dyYW1fc2VudGluZWwgPSAwOworICAgYmxvYi53cml0ZV91aW50MzJfdChwcm9ncmFtX3NlbnRpbmVsKTsKKworICAgYmxvYi53cml0ZSgmY2FjaGVfdmFsaWRhdGlvbl9kYXRhLCBzaXplb2YoY2FjaGVfdmFsaWRhdGlvbl9kYXRhKSk7CisKKyAgIGJsb2Iud3JpdGVfc3RyaW5nKG1lc2FfZ2V0X3NoYWRlcl9jYWNoZV9tYWdpYygpKTsKKyAgIGJsb2Iud3JpdGVfc3RyaW5nKChjb25zdCBjaGFyICopY3R4LT5Ecml2ZXIuR2V0U3RyaW5nKGN0eCwgR0xfVkVORE9SKSk7CisgICBibG9iLndyaXRlX3N0cmluZygoY29uc3QgY2hhciAqKWN0eC0+RHJpdmVyLkdldFN0cmluZyhjdHgsIEdMX1JFTkRFUkVSKSk7CisKKyAgIGJsb2Iud3JpdGUocHJvZywgc2l6ZW9mKGdsX3NoYWRlcl9wcm9ncmFtKSk7CisKKyAgIC8qIGhhc2ggdGFibGVzICovCisgICBzZXJpYWxpemVfaGFzaF90YWJsZShwcm9nLT5BdHRyaWJ1dGVCaW5kaW5ncywgJmJsb2IpOworICAgc2VyaWFsaXplX2hhc2hfdGFibGUocHJvZy0+RnJhZ0RhdGFCaW5kaW5ncywgJmJsb2IpOworICAgc2VyaWFsaXplX2hhc2hfdGFibGUocHJvZy0+RnJhZ0RhdGFJbmRleEJpbmRpbmdzLCAmYmxvYik7CisgICBzZXJpYWxpemVfaGFzaF90YWJsZShwcm9nLT5Vbmlmb3JtSGFzaCwgJmJsb2IpOworCisgICAvKiB1bmlmb3JtIHN0b3JhZ2UgKi8KKyAgIGlmIChwcm9nLT5Vbmlmb3JtU3RvcmFnZSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb2ctPk51bVVzZXJVbmlmb3JtU3RvcmFnZTsgaSsrKQorICAgICAgICAgc2VyaWFsaXplX3VuaWZvcm1fc3RvcmFnZSgmcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0sIGJsb2IpOworICAgfQorCisgICB1aW50OF90IHNoYWRlcl9hbW91bnQgPSAwOworICAgdW5zaWduZWQgc2hhZGVyX2Ftb3VudF9wb3MgPSBibG9iLnBvc2l0aW9uKCk7CisgICBibG9iLndyaXRlX3VpbnQ4X3Qoc2hhZGVyX2Ftb3VudCk7CisKKyAgIC8qIF9MaW5rZWRTaGFkZXJzIElSICovCisgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUVTQV9TSEFERVJfU1RBR0VTOyBpKyspIHsKKyAgICAgIHNpemVfdCBzaGFfc2l6ZSA9IDA7CisKKyAgICAgIGlmICghcHJvZy0+X0xpbmtlZFNoYWRlcnNbaV0pCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogU2V0IHVzZWQgR0xTTCB2ZXJzaW9uIGFuZCBJc0VTIGZsYWcgZnJvbSBnbF9zaGFkZXJfcHJvZ3JhbSwKKyAgICAgICAqIHRoaXMgaXMgcmVxdWlyZWQgd2hlbiBkZXNlcmlhbGl6aW5nIHRoZSBkYXRhLgorICAgICAgICovCisgICAgICBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+VmVyc2lvbiA9IHByb2ctPlZlcnNpb247CisgICAgICBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXS0+SXNFUyA9IHByb2ctPklzRVM7CisKKyAgICAgIGNoYXIgKmRhdGEgPSBtZXNhX3NoYWRlcl9zZXJpYWxpemUoY3R4LCBwcm9nLT5fTGlua2VkU2hhZGVyc1tpXSwgJnNoYV9zaXplLCBmYWxzZSAvKiBzaGFkZXJfb25seSAqLyk7CisKKyAgICAgIGlmICghZGF0YSkKKyAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBzaGFkZXJfYW1vdW50Kys7CisKKyAgICAgIC8qIGluZGV4IGluIF9MaW5rZWRTaGFkZXJzIGxpc3QgKyBzaGFkZXIgYmxvYiAqLworICAgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgIGJsb2Iud3JpdGVfdWludDMyX3QoaSk7CisgICAgICAgICBibG9iLndyaXRlKGRhdGEsIHNoYV9zaXplKTsKKyAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICB9CisgICB9CisKKyAgIGJsb2Iub3ZlcndyaXRlKCZzaGFkZXJfYW1vdW50LCBzaXplb2Yoc2hhZGVyX2Ftb3VudCksIHNoYWRlcl9hbW91bnRfcG9zKTsKKworICAgKnNpemUgPSBibG9iLnBvc2l0aW9uKCk7CisKKyAgIC8vIHdyaXRlIHByb2dyYW0gc2l6ZSB0byBzZW50aW5lbCBmb3Igbm93CisgICBwcm9ncmFtX3NlbnRpbmVsID0gKnNpemU7CisgICBibG9iLm92ZXJ3cml0ZSgmcHJvZ3JhbV9zZW50aW5lbCwgc2l6ZW9mKHByb2dyYW1fc2VudGluZWwpLCAwKTsKKworICAgcmV0dXJuIGJsb2IucmVsZWFzZV9tZW1vcnkoc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0YW5kYWxvbmVfc2NhZmZvbGRpbmcuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zdGFuZGFsb25lX3NjYWZmb2xkaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQwOTNlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci9zdGFuZGFsb25lX3NjYWZmb2xkaW5nLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDExIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qIFRoaXMgZmlsZSBkZWNsYXJlcyBzdHJpcHBlZC1kb3duIHZlcnNpb25zIG9mIGZ1bmN0aW9ucyB0aGF0CisgKiBub3JtYWxseSBleGlzdCBvdXRzaWRlIG9mIHRoZSBnbHNsIGZvbGRlciwgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkCisgKiB3aGVuIHJ1bm5pbmcgdGhlIEdMU0wgY29tcGlsZXIgc3RhbmRhbG9uZSAoZm9yIHVuaXQgdGVzdGluZyBvcgorICogY29tcGlsaW5nIGJ1aWx0aW5zKS4KKyAqLworCisjaW5jbHVkZSAic3RhbmRhbG9uZV9zY2FmZm9sZGluZy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicmFsbG9jLmgiCisKKy8vdm9pZAorLy9fbWVzYV93YXJuaW5nKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorLy97CisvLyAgICB2YV9saXN0IHZhcmdzOworLy8gICAgKHZvaWQpIGN0eDsKKworLy8gICAgdmFfc3RhcnQodmFyZ3MsIGZtdCk7CisKKy8vICAgIC8qIFRoaXMgb3V0cHV0IGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRoYXQncyBnb29kIGVub3VnaCBmb3IgdGhlCisvLyAgICAgKiBzdGFuZGFsb25lIGNvbXBpbGVyLgorLy8gICAgICovCisvLyAgICBmcHJpbnRmKHN0ZGVyciwgIk1lc2Egd2FybmluZzogIik7CisvLyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgdmFyZ3MpOworLy8gICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworCisvLyAgICB2YV9lbmQodmFyZ3MpOworLy99CisKK3ZvaWQKK19tZXNhX3JlZmVyZW5jZV9zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3NoYWRlciAqKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3NoYWRlciAqc2gpCit7CisgICAodm9pZCkgY3R4OworICAgKnB0ciA9IHNoOworfQorCit2b2lkCitfbWVzYV9yZWZlcmVuY2VfcHJvZ3JhbShzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfcHJvZ3JhbSAqKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdsX3Byb2dyYW0gKnByb2cpCit7CisgICAodm9pZCkgY3R4OworICAgKnB0ciA9IHByb2c7Cit9CisKKy8vdm9pZAorLy9fbWVzYV9zaGFkZXJfZGVidWcoc3RydWN0IGdsX2NvbnRleHQgKiwgR0xlbnVtLCBHTHVpbnQgKmlkLAorLy8gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBpbnQpCisvL3sKKy8vfQorCitzdHJ1Y3QgZ2xfc2hhZGVyICoKK19tZXNhX25ld19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUsIEdMZW51bSB0eXBlKQoreworICAgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyOworCisgICAodm9pZCkgY3R4OworCisgICBhc3NlcnQodHlwZSA9PSBHTF9WRVJURVhfU0hBREVSIHx8CisgICAgICAgICAgdHlwZSA9PSBHTF9HRU9NRVRSWV9TSEFERVIgfHwKKyAgICAgICAgICB0eXBlID09IEdMX0ZSQUdNRU5UX1NIQURFUik7CisKKyAgIHNoYWRlciA9IHJ6YWxsb2MoTlVMTCwgc3RydWN0IGdsX3NoYWRlcik7CisgICBpZiAoc2hhZGVyKSB7CisgICAgICBzaGFkZXItPlR5cGUgPSB0eXBlOworICAgICAgc2hhZGVyLT5TdGFnZSA9IF9tZXNhX3NoYWRlcl9lbnVtX3RvX3NoYWRlcl9zdGFnZSh0eXBlKTsKKyAgICAgIHNoYWRlci0+TmFtZSA9IG5hbWU7CisgICAgICAvLyBMdW5hckc6IFZLIGRvZXMgbm90IHVzZSByZWZlcmVuY2UgY291bnRzCisvLyAgICAgIHNoYWRlci0+UmVmQ291bnQgPSAxOworICAgfQorICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBfbWVzYV9kZWxldGVfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKnNoKQoreworICAgZnJlZSgodm9pZCAqKXNoLT5Tb3VyY2UpOworICAgZnJlZShzaC0+TGFiZWwpOworICAgX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oY3R4LCAmc2gtPlByb2dyYW0sIE5VTEwpOworICAgcmFsbG9jX2ZyZWUoc2gpOworfQorCisKK3ZvaWQgaW5pdGlhbGl6ZV9jb250ZXh0X3RvX2RlZmF1bHRzKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIGdsX2FwaSBhcGkpCit7CisgICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCisgICBjdHgtPkFQSSA9IGFwaTsKKworICAgY3R4LT5FeHRlbnNpb25zLmR1bW15X2ZhbHNlID0gZmFsc2U7CisgICBjdHgtPkV4dGVuc2lvbnMuZHVtbXlfdHJ1ZSA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX2NvbXB1dGVfc2hhZGVyID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfY29uc2VydmF0aXZlX2RlcHRoID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfZHJhd19pbnN0YW5jZWQgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9FUzJfY29tcGF0aWJpbGl0eSA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX0VTM19jb21wYXRpYmlsaXR5ID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnMgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl9ncHVfc2hhZGVyNSA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3NhbXBsZV9zaGFkaW5nID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfc2hhZGVyX2JpdF9lbmNvZGluZyA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3NoYWRlcl9zdGVuY2lsX2V4cG9ydCA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3NoYWRlcl90ZXh0dXJlX2xvZCA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjayA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZyA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX2dhdGhlciA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfbXVsdGlzYW1wbGUgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkFSQl90ZXh0dXJlX3F1ZXJ5X2xldmVscyA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuQVJCX3RleHR1cmVfcXVlcnlfbG9kID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0ID0gdHJ1ZTsKKyAgIGN0eC0+RXh0ZW5zaW9ucy5BUkJfdmlld3BvcnRfYXJyYXkgPSB0cnVlOworCisgICBjdHgtPkV4dGVuc2lvbnMuT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA9IHRydWU7CisgICBjdHgtPkV4dGVuc2lvbnMuT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzID0gdHJ1ZTsKKworICAgY3R4LT5FeHRlbnNpb25zLkVYVF9zaGFkZXJfaW50ZWdlcl9taXggPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkVYVF90ZXh0dXJlM0QgPSB0cnVlOworICAgY3R4LT5FeHRlbnNpb25zLkVYVF90ZXh0dXJlX2FycmF5ID0gdHJ1ZTsKKworICAgY3R4LT5FeHRlbnNpb25zLk5WX3RleHR1cmVfcmVjdGFuZ2xlID0gdHJ1ZTsKKworICAgY3R4LT5Db25zdC5HTFNMVmVyc2lvbiA9IDEyMDsKKworICAgLyogMS4yMCBtaW5pbXVtcy4gKi8KKyAgIGN0eC0+Q29uc3QuTWF4TGlnaHRzID0gODsKKyAgIGN0eC0+Q29uc3QuTWF4Q2xpcFBsYW5lcyA9IDY7CisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVVbml0cyA9IDI7CisgICBjdHgtPkNvbnN0Lk1heFRleHR1cmVDb29yZFVuaXRzID0gMjsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9WRVJURVhdLk1heEF0dHJpYnMgPSAxNjsKKworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4VW5pZm9ybUNvbXBvbmVudHMgPSA1MTI7CisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfVkVSVEVYXS5NYXhPdXRwdXRDb21wb25lbnRzID0gMzI7CisgICBjdHgtPkNvbnN0Lk1heFZhcnlpbmcgPSA4OyAvKiA9PSBnbF9NYXhWYXJ5aW5nRmxvYXRzIC8gNCAqLworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX1ZFUlRFWF0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSAwOworICAgY3R4LT5Db25zdC5NYXhDb21iaW5lZFRleHR1cmVJbWFnZVVuaXRzID0gMjsKKyAgIGN0eC0+Q29uc3QuUHJvZ3JhbVtNRVNBX1NIQURFUl9GUkFHTUVOVF0uTWF4VGV4dHVyZUltYWdlVW5pdHMgPSAyOworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhVbmlmb3JtQ29tcG9uZW50cyA9IDY0OworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0ZSQUdNRU5UXS5NYXhJbnB1dENvbXBvbmVudHMgPSAzMjsKKworICAgY3R4LT5Db25zdC5NYXhEcmF3QnVmZmVycyA9IDE7CisgICBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBDb3VudFswXSA9IDY1NTM1OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwQ291bnRbMV0gPSA2NTUzNTsKKyAgIGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cENvdW50WzJdID0gNjU1MzU7CisgICBjdHgtPkNvbnN0Lk1heENvbXB1dGVXb3JrR3JvdXBTaXplWzBdID0gMTAyNDsKKyAgIGN0eC0+Q29uc3QuTWF4Q29tcHV0ZVdvcmtHcm91cFNpemVbMV0gPSAxMDI0OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwU2l6ZVsyXSA9IDY0OworICAgY3R4LT5Db25zdC5NYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMgPSAxMDI0OworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0NPTVBVVEVdLk1heFRleHR1cmVJbWFnZVVuaXRzID0gMTY7CisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfQ09NUFVURV0uTWF4VW5pZm9ybUNvbXBvbmVudHMgPSAxMDI0OworICAgY3R4LT5Db25zdC5Qcm9ncmFtW01FU0FfU0hBREVSX0NPTVBVVEVdLk1heElucHV0Q29tcG9uZW50cyA9IDA7IC8qIG5vdCB1c2VkICovCisgICBjdHgtPkNvbnN0LlByb2dyYW1bTUVTQV9TSEFERVJfQ09NUFVURV0uTWF4T3V0cHV0Q29tcG9uZW50cyA9IDA7IC8qIG5vdCB1c2VkICovCisKKyAgIC8qIFNldCB1cCBkZWZhdWx0IHNoYWRlciBjb21waWxlciBvcHRpb25zLiAqLworICAgc3RydWN0IGdsX3NoYWRlcl9jb21waWxlcl9vcHRpb25zIG9wdGlvbnM7CisgICBtZW1zZXQoJm9wdGlvbnMsIDAsIHNpemVvZihvcHRpb25zKSk7CisgICBvcHRpb25zLk1heFVucm9sbEl0ZXJhdGlvbnMgPSAzMjsKKyAgIG9wdGlvbnMuTWF4SWZEZXB0aCA9IFVJTlRfTUFYOworCisgICAvKiBEZWZhdWx0IHByYWdtYSBzZXR0aW5ncyAqLworICAgb3B0aW9ucy5EZWZhdWx0UHJhZ21hcy5PcHRpbWl6ZSA9IHRydWU7CisKKyAgIGZvciAoaW50IHNoID0gMDsgc2ggPCBNRVNBX1NIQURFUl9TVEFHRVM7ICsrc2gpCisgICAgICBtZW1jcHkoJmN0eC0+U2hhZGVyQ29tcGlsZXJPcHRpb25zW3NoXSwgJm9wdGlvbnMsIHNpemVvZihvcHRpb25zKSk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0YW5kYWxvbmVfc2NhZmZvbGRpbmcuaCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvc3RhbmRhbG9uZV9zY2FmZm9sZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWQ0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0YW5kYWxvbmVfc2NhZmZvbGRpbmcuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyogVGhpcyBmaWxlIGRlY2xhcmVzIHN0cmlwcGVkLWRvd24gdmVyc2lvbnMgb2YgZnVuY3Rpb25zIHRoYXQKKyAqIG5vcm1hbGx5IGV4aXN0IG91dHNpZGUgb2YgdGhlIGdsc2wgZm9sZGVyLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQKKyAqIHdoZW4gcnVubmluZyB0aGUgR0xTTCBjb21waWxlciBzdGFuZGFsb25lIChmb3IgdW5pdCB0ZXN0aW5nIG9yCisgKiBjb21waWxpbmcgYnVpbHRpbnMpLgorICovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBTVEFOREFMT05FX1NDQUZGT0xESU5HX0gKKyNkZWZpbmUgU1RBTkRBTE9ORV9TQ0FGRk9MRElOR19ICisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorCitleHRlcm4gIkMiIHZvaWQKK19tZXNhX3dhcm5pbmcoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqZm10U3RyaW5nLCAuLi4gKTsKKworZXh0ZXJuICJDIiB2b2lkCitfbWVzYV9yZWZlcmVuY2Vfc2hhZGVyKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnbF9zaGFkZXIgKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoKTsKKworLy8gTHVuYXJHIEFERDoKK2V4dGVybiAiQyIgdm9pZAorX21lc2FfcmVmZXJlbmNlX3Byb2dyYW0oc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgc3RydWN0IGdsX3Byb2dyYW0gKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnbF9wcm9ncmFtICpwcm9nKTsKKworZXh0ZXJuICJDIiBzdHJ1Y3QgZ2xfc2hhZGVyICoKK19tZXNhX25ld19zaGFkZXIoc3RydWN0IGdsX2NvbnRleHQgKmN0eCwgR0x1aW50IG5hbWUsIEdMZW51bSB0eXBlKTsKKworLy8gTHVuYXJHIEFERDoKK2V4dGVybiAiQyIgdm9pZAorX21lc2FfZGVsZXRlX3NoYWRlcihzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyICpzaCk7CisKK2V4dGVybiAiQyIgdm9pZAorX21lc2Ffc2hhZGVyX2RlYnVnKHN0cnVjdCBnbF9jb250ZXh0ICpjdHgsIEdMZW51bSB0eXBlLCBHTHVpbnQgKmlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbik7CisKK3N0YXRpYyBpbmxpbmUgZ2xfc2hhZGVyX3N0YWdlCitfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2UoR0xlbnVtIHYpCit7CisgICBzd2l0Y2ggKHYpIHsKKyAgIGNhc2UgR0xfVkVSVEVYX1NIQURFUjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9WRVJURVg7CisgICBjYXNlIEdMX0ZSQUdNRU5UX1NIQURFUjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9GUkFHTUVOVDsKKyAgIGNhc2UgR0xfR0VPTUVUUllfU0hBREVSOgorICAgICAgcmV0dXJuIE1FU0FfU0hBREVSX0dFT01FVFJZOworICAgY2FzZSBHTF9DT01QVVRFX1NIQURFUjoKKyAgICAgIHJldHVybiBNRVNBX1NIQURFUl9DT01QVVRFOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghImJhZCB2YWx1ZSBpbiBfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2UoKSIpOworICAgICAgcmV0dXJuIE1FU0FfU0hBREVSX1ZFUlRFWDsKKyAgIH0KK30KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBnaXZlbiBnbF9jb250ZXh0IHN0cnVjdHVyZSB0byBhIHJlYXNvbmFibGUgc2V0IG9mCisgKiBkZWZhdWx0cyByZXByZXNlbnRpbmcgdGhlIG1pbmltdW0gY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGJ5IHRoZQorICogT3BlbkdMIHNwZWMuCisgKgorICogVGhpcyBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIGJ1aWx0aW4gZnVuY3Rpb25zIGFuZCBpbiB0ZXN0aW5nLCB3aGVuCisgKiB3ZSBkb24ndCBoYXZlIGEgY29ubmVjdGlvbiB0byBhbiBhY3R1YWwgZHJpdmVyLgorICovCit2b2lkIGluaXRpYWxpemVfY29udGV4dF90b19kZWZhdWx0cyhzdHJ1Y3QgZ2xfY29udGV4dCAqY3R4LCBnbF9hcGkgYXBpKTsKKworCisjZW5kaWYgLyogU1RBTkRBTE9ORV9TQ0FGRk9MRElOR19IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0YW5kYWxvbmVfdXRpbHMuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvc3RhbmRhbG9uZV91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjRmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0YW5kYWxvbmVfdXRpbHMuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDgsIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKy8qKiBAZmlsZSBzdGFuZGFsb25lX3V0aWxzLmNwcAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYWxsb2NhdGlvbiBhbmQgbG9nZ2luZyB1dGlscyBuZWVkZWQKKyAqIGJ5IHRoZSBzdGFuZGFsb25lIGNvbXBpbGVyLgorICovCisKKyNpbmNsdWRlICJpbnN0YW5jZS5oIgorCisKK3ZvaWQgKmludGVsX2FsbG9jKGNvbnN0IHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlIHNjb3BlKQoreworICAgIGFzc2VydChpbnRlbF9oYW5kbGVfdmFsaWRhdGUoaGFuZGxlKSk7CisgICAgcmV0dXJuIGljZF9pbnN0YW5jZV9hbGxvYygoKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKikgaGFuZGxlKS0+aW5zdGFuY2UtPmljZCwKKyAgICAgICAgICAgIHNpemUsIGFsaWdubWVudCwgc2NvcGUpOworfQorCit2b2lkIGludGVsX2ZyZWUoY29uc3Qgdm9pZCAqaGFuZGxlLCB2b2lkICpwdHIpCit7CisgICAgYXNzZXJ0KGludGVsX2hhbmRsZV92YWxpZGF0ZShoYW5kbGUpKTsKKyAgICBpY2RfaW5zdGFuY2VfZnJlZSgoKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKikgaGFuZGxlKS0+aW5zdGFuY2UtPmljZCwgcHRyKTsKK30KKwordm9pZCBpbnRlbF9sb2d2KGNvbnN0IHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBWa0ZsYWdzIG1zZ19mbGFncywKKyAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmpfdHlwZSwgdWludDY0X3Qgc3JjX29iamVjdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgIGNoYXIgbXNnWzI1Nl07CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHZzbnByaW50Zihtc2csIHNpemVvZihtc2cpLCBmb3JtYXQsIGFwKTsKKyAgICBpZiAocmV0ID49IHNpemVvZihtc2cpIHx8IHJldCA8IDApCisgICAgICAgIG1zZ1tzaXplb2YobXNnKSAtIDFdID0gJ1wwJzsKKworICAgIGFzc2VydChpbnRlbF9oYW5kbGVfdmFsaWRhdGUoaGFuZGxlKSk7CisgICAgaWNkX2luc3RhbmNlX2xvZygoKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKikgaGFuZGxlKS0+aW5zdGFuY2UtPmljZCwKKyAgICAgICAgICAgICAgICAgICAgIG1zZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgIG9ial90eXBlLCBzcmNfb2JqZWN0LCAgICAgICAgICAgICAgLyogb2JqX3R5cGUsIG9iamVjdCAqLworICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIG1zZ19jb2RlLCAgICAgICAgICAgICAgICAvKiBsb2NhdGlvbiwgbXNnX2NvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgIG1zZyk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0cnRvZC5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0cnRvZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjMjllYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvc3RydG9kLmNwcApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgVk13YXJlLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFZNV0FSRSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaWZkZWYgX19BUFBMRV9fCisjaW5jbHVkZSA8eGxvY2FsZS5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgInN0cnRvZC5oIgorCisjaWYgZGVmaW5lZChfR05VX1NPVVJDRSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmIFwKKyAgICFkZWZpbmVkKF9fSEFJS1VfXykgJiYgIWRlZmluZWQoX19VQ0xJQkNfXykKKyNkZWZpbmUgR0xTTF9IQVZFX0xPQ0FMRV9UCisjZW5kaWYKKworI2lmZGVmIEdMU0xfSEFWRV9MT0NBTEVfVAorc3RhdGljIHN0cnVjdCBsb2NhbGVfaW5pdGlhbGl6ZXIgeworICAgbG9jYWxlX2luaXRpYWxpemVyKCkgeyBsb2MgPSBuZXdsb2NhbGUoTENfQ1RZUEVfTUFTSywgIkMiLCBOVUxMKTsgfQorICAgbG9jYWxlX3QgbG9jOworfSBsb2NfaW5pdDsKKyNlbmRpZgorCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgc3RydG9kIHdoaWNoIHVzZXMgdGhlICJDIiBsb2NhbGUgc28gdGhlIGRlY2ltYWwKKyAqIHBvaW50IGlzIGFsd2F5cyAnLicKKyAqLworZG91YmxlCitnbHNsX3N0cnRvZChjb25zdCBjaGFyICpzLCBjaGFyICoqZW5kKQoreworI2lmZGVmIEdMU0xfSEFWRV9MT0NBTEVfVAorICAgcmV0dXJuIHN0cnRvZF9sKHMsIGVuZCwgbG9jX2luaXQubG9jKTsKKyNlbHNlCisgICByZXR1cm4gc3RydG9kKHMsIGVuZCk7CisjZW5kaWYKK30KKworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIHN0cnRvZiB3aGljaCB1c2VzIHRoZSAiQyIgbG9jYWxlIHNvIHRoZSBkZWNpbWFsCisgKiBwb2ludCBpcyBhbHdheXMgJy4nCisgKi8KK2Zsb2F0CitnbHNsX3N0cnRvZihjb25zdCBjaGFyICpzLCBjaGFyICoqZW5kKQoreworI2lmZGVmIEdMU0xfSEFWRV9MT0NBTEVfVAorICAgcmV0dXJuIHN0cnRvZl9sKHMsIGVuZCwgbG9jX2luaXQubG9jKTsKKyNlbGlmIF9YT1BFTl9TT1VSQ0UgPj0gNjAwIHx8IF9JU09DOTlfU09VUkNFCisgICByZXR1cm4gc3RydG9mKHMsIGVuZCk7CisjZWxzZQorICAgcmV0dXJuIChmbG9hdCkgc3RydG9kKHMsIGVuZCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvc3RydG9kLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0cnRvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODQ3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3N0cnRvZC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBWTXdhcmUsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVk1XQVJFIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBTVFJUT0RfSAorI2RlZmluZSBTVFJUT0RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBkb3VibGUKK2dsc2xfc3RydG9kKGNvbnN0IGNoYXIgKnMsIGNoYXIgKiplbmQpOworCitleHRlcm4gZmxvYXQKK2dsc2xfc3RydG9mKGNvbnN0IGNoYXIgKnMsIGNoYXIgKiplbmQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3QuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWZmOTJlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0LmNwcApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSB0ZXN0LmNwcAorICoKKyAqIFN0YW5kYWxvbmUgdGVzdHMgZm9yIHRoZSBHTFNMIGNvbXBpbGVyLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIHN0YW5kYWxvbmUgZXhlY3V0YWJsZSB3aGljaCBjYW4gYmUgdXNlZCB0bworICogdGVzdCBjb21wb25lbnRzIG9mIHRoZSBHTFNMLgorICoKKyAqIEVhY2ggdGVzdCBpcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzIG1haW4oKS4gIFRoZQorICogbWFpbiBmdW5jdGlvbiBpbnRlcnByZXRzIGl0cyBmaXJzdCBhcmd1bWVudCBhcyB0aGUgbmFtZSBvZiB0aGUgdGVzdAorICogdG8gcnVuLCBzdHJpcHMgb3V0IHRoYXQgYXJndW1lbnQsIGFuZCB0aGVuIGNhbGxzIHRoZSB0ZXN0IGZ1bmN0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidGVzdF9vcHRwYXNzLmgiCisKKy8qKgorICogUHJpbnQgcHJvcGVyIHVzYWdlIGFuZCBleGl0IHdpdGggZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQKK3VzYWdlX2ZhaWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgIHByaW50ZigiKioqIHVzYWdlOiAlcyA8Y29tbWFuZD4gPG9wdGlvbnM+XG4iLCBuYW1lKTsKKyAgIHByaW50ZigiXG4iKTsKKyAgIHByaW50ZigiUG9zc2libGUgY29tbWFuZHMgYXJlOlxuIik7CisgICBwcmludGYoIiAgb3B0cGFzczogdGVzdCBhbiBvcHRpbWl6YXRpb24gcGFzcyBpbiBpc29sYXRpb25cbiIpOworICAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXh0cmFjdF9jb21tYW5kX2Zyb21fYXJndihpbnQgKmFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgaWYgKCphcmdjIDwgMikgeworICAgICAgdXNhZ2VfZmFpbChhcmd2WzBdKTsKKyAgIH0KKyAgIGNvbnN0IGNoYXIgKmNvbW1hbmQgPSBhcmd2WzFdOworICAgLS0qYXJnYzsKKyAgIG1lbW1vdmUoJmFyZ3ZbMV0sICZhcmd2WzJdLCAoKmFyZ2MpICogc2l6ZW9mKGFyZ3ZbMV0pKTsKKyAgIHJldHVybiBjb21tYW5kOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICBjb25zdCBjaGFyICpjb21tYW5kID0gZXh0cmFjdF9jb21tYW5kX2Zyb21fYXJndigmYXJnYywgYXJndik7CisgICBpZiAoc3RyY21wKGNvbW1hbmQsICJvcHRwYXNzIikgPT0gMCkgeworICAgICAgcmV0dXJuIHRlc3Rfb3B0cGFzcyhhcmdjLCBhcmd2KTsKKyAgIH0gZWxzZSB7CisgICAgICB1c2FnZV9mYWlsKGFyZ3ZbMF0pOworICAgfQorCisgICAvKiBFeGVjdXRpb24gc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuICovCisgICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0X29wdHBhc3MuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0X29wdHBhc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNWNiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3Rfb3B0cGFzcy5jcHAKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIHRlc3Rfb3B0cGFzcy5jcHAKKyAqCisgKiBTdGFuZGFsb25lIHRlc3QgZm9yIG9wdGltaXphdGlvbiBwYXNzZXMuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSAib3B0cGFzcyIgY29tbWFuZCBmb3IgdGhlIHN0YW5kYWxvbmUKKyAqIGdsc2xfdGVzdCBhcHAuICBJdCBhY2NlcHRzIGVpdGhlciBHTFNMIG9yIGhpZ2gtbGV2ZWwgSVIgYXMgaW5wdXQsCisgKiBhbmQgcGVyZm9ybXMgdGhlIG9wdGltaWF0aW9uIHBhc3NlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqIEl0IG91dHB1dHMgdGhlIElSLCBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgb3B0aW1pYXRpb25zLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgImFzdC5oIgorI2luY2x1ZGUgImlyX29wdGltaXphdGlvbi5oIgorI2luY2x1ZGUgInByb2dyYW0uaCIKKyNpbmNsdWRlICJpcl9yZWFkZXIuaCIKKyNpbmNsdWRlICJzdGFuZGFsb25lX3NjYWZmb2xkaW5nLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0YXRpYyBzdHJpbmcgcmVhZF9zdGRpbl90b19lb2YoKQoreworICAgc3RyaW5nYnVmIHNiOworICAgY2luLmdldChzYiwgJ1wwJyk7CisgICByZXR1cm4gc2Iuc3RyKCk7Cit9CisKK3N0YXRpYyBHTGJvb2xlYW4KK2RvX29wdGltaXphdGlvbihzdHJ1Y3QgZXhlY19saXN0ICppciwgY29uc3QgY2hhciAqb3B0aW1pemF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBnbF9zaGFkZXJfY29tcGlsZXJfb3B0aW9ucyAqb3B0aW9ucykKK3sKKyAgIGludCBpbnRfMDsKKyAgIGludCBpbnRfMTsKKyAgIGludCBpbnRfMjsKKyAgIGludCBpbnRfMzsKKyAgIGludCBpbnRfNDsKKworICAgaWYgKHNzY2FuZihvcHRpbWl6YXRpb24sICJkb19jb21tb25fb3B0aW1pemF0aW9uICggJWQgKSAiLCAmaW50XzApID09IDEpIHsKKyAgICAgIHJldHVybiBkb19jb21tb25fb3B0aW1pemF0aW9uKGlyLCBpbnRfMCAhPSAwLCBmYWxzZSwgb3B0aW9ucywgdHJ1ZSk7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19hbGdlYnJhaWMiKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fYWxnZWJyYWljKGlyLCB0cnVlKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX2NvbnN0YW50X2ZvbGRpbmciKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fY29uc3RhbnRfZm9sZGluZyhpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19jb25zdGFudF92YXJpYWJsZSIpID09IDApIHsKKyAgICAgIHJldHVybiBkb19jb25zdGFudF92YXJpYWJsZShpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19jb25zdGFudF92YXJpYWJsZV91bmxpbmtlZCIpID09IDApIHsKKyAgICAgIHJldHVybiBkb19jb25zdGFudF92YXJpYWJsZV91bmxpbmtlZChpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19jb3B5X3Byb3BhZ2F0aW9uIikgPT0gMCkgeworICAgICAgcmV0dXJuIGRvX2NvcHlfcHJvcGFnYXRpb24oaXIpOworICAgfSBlbHNlIGlmIChzdHJjbXAob3B0aW1pemF0aW9uLCAiZG9fY29weV9wcm9wYWdhdGlvbl9lbGVtZW50cyIpID09IDApIHsKKyAgICAgIHJldHVybiBkb19jb3B5X3Byb3BhZ2F0aW9uX2VsZW1lbnRzKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX2NvbnN0YW50X3Byb3BhZ2F0aW9uIikgPT0gMCkgeworICAgICAgcmV0dXJuIGRvX2NvbnN0YW50X3Byb3BhZ2F0aW9uKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX2RlYWRfY29kZSIpID09IDApIHsKKyAgICAgIHJldHVybiBkb19kZWFkX2NvZGUoaXIsIGZhbHNlKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX2RlYWRfY29kZV9sb2NhbCIpID09IDApIHsKKyAgICAgIHJldHVybiBkb19kZWFkX2NvZGVfbG9jYWwoaXIpOworICAgfSBlbHNlIGlmIChzdHJjbXAob3B0aW1pemF0aW9uLCAiZG9fZGVhZF9jb2RlX3VubGlua2VkIikgPT0gMCkgeworICAgICAgcmV0dXJuIGRvX2RlYWRfY29kZV91bmxpbmtlZChpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19kZWFkX2Z1bmN0aW9ucyIpID09IDApIHsKKyAgICAgIHJldHVybiBkb19kZWFkX2Z1bmN0aW9ucyhpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19mdW5jdGlvbl9pbmxpbmluZyIpID09IDApIHsKKyAgICAgIHJldHVybiBkb19mdW5jdGlvbl9pbmxpbmluZyhpcik7CisgICB9IGVsc2UgaWYgKHNzY2FuZihvcHRpbWl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAiZG9fbG93ZXJfanVtcHMgKCAlZCAsICVkICwgJWQgLCAlZCAsICVkICkgIiwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfMCwgJmludF8xLCAmaW50XzIsICZpbnRfMywgJmludF80KSA9PSA1KSB7CisgICAgICByZXR1cm4gZG9fbG93ZXJfanVtcHMoaXIsIGludF8wICE9IDAsIGludF8xICE9IDAsIGludF8yICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50XzMgIT0gMCwgaW50XzQgIT0gMCk7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19sb3dlcl90ZXh0dXJlX3Byb2plY3Rpb24iKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fbG93ZXJfdGV4dHVyZV9wcm9qZWN0aW9uKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX2lmX3NpbXBsaWZpY2F0aW9uIikgPT0gMCkgeworICAgICAgcmV0dXJuIGRvX2lmX3NpbXBsaWZpY2F0aW9uKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3NjYW5mKG9wdGltaXphdGlvbiwgImxvd2VyX2lmX3RvX2NvbmRfYXNzaWduICggJWQgKSAiLAorICAgICAgICAgICAgICAgICAgICAgJmludF8wKSA9PSAxKSB7CisgICAgICByZXR1cm4gbG93ZXJfaWZfdG9fY29uZF9hc3NpZ24oaXIsIGludF8wKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX21hdF9vcF90b192ZWMiKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fbWF0X29wX3RvX3ZlYyhpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19ub29wX3N3aXp6bGUiKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fbm9vcF9zd2l6emxlKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX3N0cnVjdHVyZV9zcGxpdHRpbmciKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fc3RydWN0dXJlX3NwbGl0dGluZyhpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb19zd2l6emxlX3N3aXp6bGUiKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fc3dpenpsZV9zd2l6emxlKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX3RyZWVfZ3JhZnRpbmciKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fdHJlZV9ncmFmdGluZyhpcik7CisgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRpbWl6YXRpb24sICJkb192ZWNfaW5kZXhfdG9fY29uZF9hc3NpZ24iKSA9PSAwKSB7CisgICAgICByZXR1cm4gZG9fdmVjX2luZGV4X3RvX2NvbmRfYXNzaWduKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImRvX3ZlY19pbmRleF90b19zd2l6emxlIikgPT0gMCkgeworICAgICAgcmV0dXJuIGRvX3ZlY19pbmRleF90b19zd2l6emxlKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImxvd2VyX2Rpc2NhcmQiKSA9PSAwKSB7CisgICAgICByZXR1cm4gbG93ZXJfZGlzY2FyZChpcik7CisgICB9IGVsc2UgaWYgKHNzY2FuZihvcHRpbWl6YXRpb24sICJsb3dlcl9pbnN0cnVjdGlvbnMgKCAlZCApICIsCisgICAgICAgICAgICAgICAgICAgICAmaW50XzApID09IDEpIHsKKyAgICAgIHJldHVybiBsb3dlcl9pbnN0cnVjdGlvbnMoaXIsIGludF8wKTsKKyAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGltaXphdGlvbiwgImxvd2VyX25vaXNlIikgPT0gMCkgeworICAgICAgcmV0dXJuIGxvd2VyX25vaXNlKGlyKTsKKyAgIH0gZWxzZSBpZiAoc3NjYW5mKG9wdGltaXphdGlvbiwgImxvd2VyX3ZhcmlhYmxlX2luZGV4X3RvX2NvbmRfYXNzaWduICIKKyAgICAgICAgICAgICAgICAgICAgICIoICVkICwgJWQgLCAlZCAsICVkICkgIiwgJmludF8wLCAmaW50XzEsICZpbnRfMiwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfMykgPT0gNCkgeworICAgICAgcmV0dXJuIGxvd2VyX3ZhcmlhYmxlX2luZGV4X3RvX2NvbmRfYXNzaWduKGlyLCBpbnRfMCAhPSAwLCBpbnRfMSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF8yICE9IDAsIGludF8zICE9IDApOworICAgfSBlbHNlIGlmIChzc2NhbmYob3B0aW1pemF0aW9uLCAibG93ZXJfcXVhZG9wX3ZlY3RvciAoICVkICkgIiwKKyAgICAgICAgICAgICAgICAgICAgICZpbnRfMCkgPT0gMSkgeworICAgICAgcmV0dXJuIGxvd2VyX3F1YWRvcF92ZWN0b3IoaXIsIGludF8wICE9IDApOworICAgfSBlbHNlIGlmIChzdHJjbXAob3B0aW1pemF0aW9uLCAib3B0aW1pemVfcmVkdW5kYW50X2p1bXBzIikgPT0gMCkgeworICAgICAgcmV0dXJuIG9wdGltaXplX3JlZHVuZGFudF9qdW1wcyhpcik7CisgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJVbnJlY29nbml6ZWQgb3B0aW1pemF0aW9uICVzXG4iLCBvcHRpbWl6YXRpb24pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitzdGF0aWMgR0xib29sZWFuCitkb19vcHRpbWl6YXRpb25fcGFzc2VzKHN0cnVjdCBleGVjX2xpc3QgKmlyLCBjaGFyICoqb3B0aW1pemF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9vcHRpbWl6YXRpb25zLCBib29sIHF1aWV0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZ2xfc2hhZGVyX2NvbXBpbGVyX29wdGlvbnMgKm9wdGlvbnMpCit7CisgICBHTGJvb2xlYW4gb3ZlcmFsbF9wcm9ncmVzcyA9IGZhbHNlOworCisgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9vcHRpbWl6YXRpb25zOyArK2kpIHsKKyAgICAgIGNvbnN0IGNoYXIgKm9wdGltaXphdGlvbiA9IG9wdGltaXphdGlvbnNbaV07CisgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICBwcmludGYoIioqKiBSdW5uaW5nIG9wdGltaXphdGlvbiAlcy4uLiIsIG9wdGltaXphdGlvbik7CisgICAgICB9CisgICAgICBHTGJvb2xlYW4gcHJvZ3Jlc3MgPSBkb19vcHRpbWl6YXRpb24oaXIsIG9wdGltaXphdGlvbiwgb3B0aW9ucyk7CisgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICBwcmludGYoIiVzXG4iLCBwcm9ncmVzcyA/ICJwcm9ncmVzcyIgOiAibm8gcHJvZ3Jlc3MiKTsKKyAgICAgIH0KKyAgICAgIHZhbGlkYXRlX2lyX3RyZWUoaXIpOworCisgICAgICBvdmVyYWxsX3Byb2dyZXNzID0gb3ZlcmFsbF9wcm9ncmVzcyB8fCBwcm9ncmVzczsKKyAgIH0KKworICAgcmV0dXJuIG92ZXJhbGxfcHJvZ3Jlc3M7Cit9CisKK2ludCB0ZXN0X29wdHBhc3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgaW50IGlucHV0X2Zvcm1hdF9pciA9IDA7IC8qIDA9Z2xzbCwgMT1pciAqLworICAgaW50IGxvb3AgPSAwOworICAgaW50IHNoYWRlcl90eXBlID0gR0xfVkVSVEVYX1NIQURFUjsKKyAgIGludCBxdWlldCA9IDA7CisKKyAgIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0cGFzc19vcHRzW10gPSB7CisgICAgICB7ICJpbnB1dC1pciIsIG5vX2FyZ3VtZW50LCAmaW5wdXRfZm9ybWF0X2lyLCAxIH0sCisgICAgICB7ICJpbnB1dC1nbHNsIiwgbm9fYXJndW1lbnQsICZpbnB1dF9mb3JtYXRfaXIsIDAgfSwKKyAgICAgIHsgImxvb3AiLCBub19hcmd1bWVudCwgJmxvb3AsIDEgfSwKKyAgICAgIHsgInZlcnRleC1zaGFkZXIiLCBub19hcmd1bWVudCwgJnNoYWRlcl90eXBlLCBHTF9WRVJURVhfU0hBREVSIH0sCisgICAgICB7ICJmcmFnbWVudC1zaGFkZXIiLCBub19hcmd1bWVudCwgJnNoYWRlcl90eXBlLCBHTF9GUkFHTUVOVF9TSEFERVIgfSwKKyAgICAgIHsgInF1aWV0Iiwgbm9fYXJndW1lbnQsICZxdWlldCwgMSB9LAorICAgICAgeyBOVUxMLCAwLCBOVUxMLCAwIH0KKyAgIH07CisKKyAgIGludCBpZHggPSAwOworICAgaW50IGM7CisgICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiIiwgb3B0cGFzc19vcHRzLCAmaWR4KSkgIT0gLTEpIHsKKyAgICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgIHByaW50ZigiKioqIHVzYWdlOiAlcyBvcHRwYXNzIDxvcHRpbWl6YXRpb25zPiA8b3B0aW9ucz5cbiIsIGFyZ3ZbMF0pOworICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgcHJpbnRmKCJQb3NzaWJsZSBvcHRpb25zIGFyZTpcbiIpOworICAgICAgICAgcHJpbnRmKCIgIC0taW5wdXQtaXI6IGlucHV0IGZvcm1hdCBpcyBJUlxuIik7CisgICAgICAgICBwcmludGYoIiAgLS1pbnB1dC1nbHNsOiBpbnB1dCBmb3JtYXQgaXMgR0xTTCAodGhlIGRlZmF1bHQpXG4iKTsKKyAgICAgICAgIHByaW50ZigiICAtLWxvb3A6IHJ1biBvcHRpbWl6YXRpb25zIHJlcGVhdGVkbHkgdW50aWwgbm8gcHJvZ3Jlc3NcbiIpOworICAgICAgICAgcHJpbnRmKCIgIC0tdmVydGV4LXNoYWRlcjogdGVzdCB3aXRoIGEgdmVydGV4IHNoYWRlciAodGhlIGRlZmF1bHQpXG4iKTsKKyAgICAgICAgIHByaW50ZigiICAtLWZyYWdtZW50LXNoYWRlcjogdGVzdCB3aXRoIGEgZnJhZ21lbnQgc2hhZGVyXG4iKTsKKyAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKyAgIH0KKworICAgc3RydWN0IGdsX2NvbnRleHQgbG9jYWxfY3R4OworICAgc3RydWN0IGdsX2NvbnRleHQgKmN0eCA9ICZsb2NhbF9jdHg7CisgICBpbml0aWFsaXplX2NvbnRleHRfdG9fZGVmYXVsdHMoY3R4LCBBUElfT1BFTkdMX0NPTVBBVCk7CisKKyAgIGN0eC0+RHJpdmVyLk5ld1NoYWRlciA9IF9tZXNhX25ld19zaGFkZXI7CisKKyAgIHN0cnVjdCBnbF9zaGFkZXIgKnNoYWRlciA9IHJ6YWxsb2MoTlVMTCwgc3RydWN0IGdsX3NoYWRlcik7CisgICBzaGFkZXItPlR5cGUgPSBzaGFkZXJfdHlwZTsKKyAgIHNoYWRlci0+U3RhZ2UgPSBfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2Uoc2hhZGVyX3R5cGUpOworCisgICBzdHJpbmcgaW5wdXQgPSByZWFkX3N0ZGluX3RvX2VvZigpOworCisgICBzdHJ1Y3QgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZSAqc3RhdGUKKyAgICAgID0gbmV3KHNoYWRlcikgX21lc2FfZ2xzbF9wYXJzZV9zdGF0ZShjdHgsIHNoYWRlci0+U3RhZ2UsIHNoYWRlcik7CisKKyAgIGlmIChpbnB1dF9mb3JtYXRfaXIpIHsKKyAgICAgIHNoYWRlci0+aXIgPSBuZXcoc2hhZGVyKSBleGVjX2xpc3Q7CisgICAgICBfbWVzYV9nbHNsX2luaXRpYWxpemVfdHlwZXMoc3RhdGUpOworICAgICAgX21lc2FfZ2xzbF9yZWFkX2lyKHN0YXRlLCBzaGFkZXItPmlyLCBpbnB1dC5jX3N0cigpLCB0cnVlKTsKKyAgIH0gZWxzZSB7CisgICAgICBzaGFkZXItPlNvdXJjZSA9IGlucHV0LmNfc3RyKCk7CisgICAgICBjb25zdCBjaGFyICpzb3VyY2UgPSBzaGFkZXItPlNvdXJjZTsKKyAgICAgIHN0YXRlLT5lcnJvciA9IGdsY3BwX3ByZXByb2Nlc3Moc3RhdGUsICZzb3VyY2UsICZzdGF0ZS0+aW5mb19sb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5leHRlbnNpb25zLCBjdHgpICE9IDA7CisKKyAgICAgIGlmICghc3RhdGUtPmVycm9yKSB7CisgICAgICAgICBfbWVzYV9nbHNsX2xleGVyX2N0b3Ioc3RhdGUsIHNvdXJjZSk7CisgICAgICAgICBfbWVzYV9nbHNsX3BhcnNlKHN0YXRlKTsKKyAgICAgICAgIF9tZXNhX2dsc2xfbGV4ZXJfZHRvcihzdGF0ZSk7CisgICAgICB9CisKKyAgICAgIHNoYWRlci0+aXIgPSBuZXcoc2hhZGVyKSBleGVjX2xpc3Q7CisgICAgICBpZiAoIXN0YXRlLT5lcnJvciAmJiAhc3RhdGUtPnRyYW5zbGF0aW9uX3VuaXQuaXNfZW1wdHkoKSkKKyAgICAgICAgIF9tZXNhX2FzdF90b19oaXIoc2hhZGVyLT5pciwgc3RhdGUpOworICAgfQorCisgICAvKiBQcmludCBvdXQgdGhlIGluaXRpYWwgSVIgKi8KKyAgIGlmICghc3RhdGUtPmVycm9yICYmICFxdWlldCkgeworICAgICAgcHJpbnRmKCIqKiogcHJlLW9wdGltaXphdGlvbiBJUjpcbiIpOworICAgICAgX21lc2FfcHJpbnRfaXIoc3Rkb3V0LCBzaGFkZXItPmlyLCBzdGF0ZSk7CisgICAgICBwcmludGYoIlxuLS1cbiIpOworICAgfQorCisgICAvKiBPcHRpbWl6YXRpb24gcGFzc2VzICovCisgICBpZiAoIXN0YXRlLT5lcnJvcikgeworICAgICAgR0xib29sZWFuIHByb2dyZXNzOworICAgICAgY29uc3Qgc3RydWN0IGdsX3NoYWRlcl9jb21waWxlcl9vcHRpb25zICpvcHRpb25zID0KKyAgICAgICAgICZjdHgtPlNoYWRlckNvbXBpbGVyT3B0aW9uc1tfbWVzYV9zaGFkZXJfZW51bV90b19zaGFkZXJfc3RhZ2Uoc2hhZGVyX3R5cGUpXTsKKyAgICAgIGRvIHsKKyAgICAgICAgIHByb2dyZXNzID0gZG9fb3B0aW1pemF0aW9uX3Bhc3NlcyhzaGFkZXItPmlyLCAmYXJndltvcHRpbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MgLSBvcHRpbmQsIHF1aWV0ICE9IDAsIG9wdGlvbnMpOworICAgICAgfSB3aGlsZSAobG9vcCAmJiBwcm9ncmVzcyk7CisgICB9CisKKyAgIC8qIFByaW50IG91dCB0aGUgcmVzdWx0aW5nIElSICovCisgICBpZiAoIXN0YXRlLT5lcnJvcikgeworICAgICAgaWYgKCFxdWlldCkgeworICAgICAgICAgcHJpbnRmKCIqKiogcmVzdWx0aW5nIElSOlxuIik7CisgICAgICB9CisgICAgICBfbWVzYV9wcmludF9pcihzdGRvdXQsIHNoYWRlci0+aXIsIHN0YXRlKTsKKyAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgIHByaW50ZigiXG4tLVxuIik7CisgICAgICB9CisgICB9CisKKyAgIGlmIChzdGF0ZS0+ZXJyb3IpIHsKKyAgICAgIHByaW50ZigiKioqIGVycm9yKHMpIG9jY3VycmVkOlxuIik7CisgICAgICBwcmludGYoIiVzXG4iLCBzdGF0ZS0+aW5mb19sb2cpOworICAgICAgcHJpbnRmKCItLVxuIik7CisgICB9CisKKyAgIHJhbGxvY19mcmVlKHN0YXRlKTsKKyAgIHJhbGxvY19mcmVlKHNoYWRlcik7CisKKyAgIHJldHVybiBzdGF0ZS0+ZXJyb3I7Cit9CisKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdF9vcHRwYXNzLmggYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3Rfb3B0cGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2NjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3Rfb3B0cGFzcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgVEVTVF9PUFRQQVNTX0gKKyNkZWZpbmUgVEVTVF9PUFRQQVNTX0gKKworaW50IHRlc3Rfb3B0cGFzcyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisjZW5kaWYgLyogVEVTVF9PUFRQQVNTX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvLmdpdGlnbm9yZSBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNlMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorcmFsbG9jLXRlc3QKK3VuaWZvcm0taW5pdGlhbGl6ZXItdGVzdAorc2FtcGxlci10eXBlcy10ZXN0CitnZW5lcmFsLWlyLXRlc3QKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvYnVpbHRpbl92YXJpYWJsZV90ZXN0LmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvYnVpbHRpbl92YXJpYWJsZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRmY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9idWlsdGluX3ZhcmlhYmxlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgInN0YW5kYWxvbmVfc2NhZmZvbGRpbmcuaCIKKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgInJhbGxvYy5oIgorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAiZ2xzbF9wYXJzZXJfZXh0cmFzLmgiCisjaW5jbHVkZSAiZ2xzbF9zeW1ib2xfdGFibGUuaCIKKworY2xhc3MgY29tbW9uX2J1aWx0aW4gOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgIGNvbW1vbl9idWlsdGluKEdMZW51bSBzaGFkZXJfdHlwZSkKKyAgICAgIDogc2hhZGVyX3R5cGUoc2hhZGVyX3R5cGUpCisgICB7CisgICAgICAvKiBlbXB0eSAqLworICAgfQorCisgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKKyAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOworCisgICB2b2lkIHN0cmluZ19zdGFydHNfd2l0aF9wcmVmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpOworICAgdm9pZCBuYW1lc19zdGFydF93aXRoX2dsKCk7CisgICB2b2lkIHVuaWZvcm1zX2FuZF9zeXN0ZW1fdmFsdWVzX2RvbnRfaGF2ZV9leHBsaWNpdF9sb2NhdGlvbigpOworICAgdm9pZCBjb25zdGFudHNfYXJlX2NvbnN0YW50KCk7CisgICB2b2lkIG5vX2ludmFsaWRfdmFyaWFibGVfbW9kZXMoKTsKKworICAgR0xlbnVtIHNoYWRlcl90eXBlOworICAgc3RydWN0IF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUgKnN0YXRlOworICAgc3RydWN0IGdsX3NoYWRlciAqc2hhZGVyOworICAgdm9pZCAqbWVtX2N0eDsKKyAgIGdsX2NvbnRleHQgY3R4OworICAgZXhlY19saXN0IGlyOworfTsKKwordm9pZAorY29tbW9uX2J1aWx0aW46OlNldFVwKCkKK3sKKyAgIHRoaXMtPm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKyAgIHRoaXMtPmlyLm1ha2VfZW1wdHkoKTsKKworICAgaW5pdGlhbGl6ZV9jb250ZXh0X3RvX2RlZmF1bHRzKCZ0aGlzLT5jdHgsIEFQSV9PUEVOR0xfQ09NUEFUKTsKKworICAgdGhpcy0+c2hhZGVyID0gcnphbGxvYyh0aGlzLT5tZW1fY3R4LCBnbF9zaGFkZXIpOworICAgdGhpcy0+c2hhZGVyLT5UeXBlID0gdGhpcy0+c2hhZGVyX3R5cGU7CisgICB0aGlzLT5zaGFkZXItPlN0YWdlID0gX21lc2Ffc2hhZGVyX2VudW1fdG9fc2hhZGVyX3N0YWdlKHRoaXMtPnNoYWRlcl90eXBlKTsKKworICAgdGhpcy0+c3RhdGUgPQorICAgICAgbmV3KG1lbV9jdHgpIF9tZXNhX2dsc2xfcGFyc2Vfc3RhdGUoJnRoaXMtPmN0eCwgdGhpcy0+c2hhZGVyLT5TdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnNoYWRlcik7CisKKyAgIF9tZXNhX2dsc2xfaW5pdGlhbGl6ZV90eXBlcyh0aGlzLT5zdGF0ZSk7CisgICBfbWVzYV9nbHNsX2luaXRpYWxpemVfdmFyaWFibGVzKCZ0aGlzLT5pciwgdGhpcy0+c3RhdGUpOworfQorCit2b2lkCitjb21tb25fYnVpbHRpbjo6VGVhckRvd24oKQoreworICAgcmFsbG9jX2ZyZWUodGhpcy0+bWVtX2N0eCk7CisgICB0aGlzLT5tZW1fY3R4ID0gTlVMTDsKK30KKwordm9pZAorY29tbW9uX2J1aWx0aW46OnN0cmluZ19zdGFydHNfd2l0aF9wcmVmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKHByZWZpeCk7CisgICBjaGFyICpjb25zdCBuYW1lX3ByZWZpeCA9IG5ldyBjaGFyW2xlbiArIDFdOworCisgICBzdHJuY3B5KG5hbWVfcHJlZml4LCBzdHIsIGxlbik7CisgICBuYW1lX3ByZWZpeFtsZW5dID0gJ1wwJzsKKyAgIEVYUEVDVF9TVFJFUShwcmVmaXgsIG5hbWVfcHJlZml4KSA8PCAiQmFkIG5hbWUgIiA8PCBzdHI7CisKKyAgIGRlbGV0ZSBbXSBuYW1lX3ByZWZpeDsKK30KKwordm9pZAorY29tbW9uX2J1aWx0aW46Om5hbWVzX3N0YXJ0X3dpdGhfZ2woKQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIHN0cmluZ19zdGFydHNfd2l0aF9wcmVmaXgodmFyLT5uYW1lLCAiZ2xfIik7CisgICB9Cit9CisKK3ZvaWQKK2NvbW1vbl9idWlsdGluOjp1bmlmb3Jtc19hbmRfc3lzdGVtX3ZhbHVlc19kb250X2hhdmVfZXhwbGljaXRfbG9jYXRpb24oKQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfdW5pZm9ybSAmJiB2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfc3lzdGVtX3ZhbHVlKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIEVYUEVDVF9GQUxTRSh2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pOworICAgICAgRVhQRUNUX0VRKC0xLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgfQorfQorCit2b2lkCitjb21tb25fYnVpbHRpbjo6Y29uc3RhbnRzX2FyZV9jb25zdGFudCgpCit7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmlyKSB7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9hdXRvKQorICAgICAgICAgY29udGludWU7CisKKyAgICAgIEVYUEVDVF9GQUxTRSh2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pOworICAgICAgRVhQRUNUX0VRKC0xLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgICAgRVhQRUNUX1RSVUUodmFyLT5kYXRhLnJlYWRfb25seSk7CisgICB9Cit9CisKK3ZvaWQKK2NvbW1vbl9idWlsdGluOjpub19pbnZhbGlkX3ZhcmlhYmxlX21vZGVzKCkKK3sKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBzd2l0Y2ggKHZhci0+ZGF0YS5tb2RlKSB7CisgICAgICBjYXNlIGlyX3Zhcl9hdXRvOgorICAgICAgY2FzZSBpcl92YXJfdW5pZm9ybToKKyAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9pbjoKKyAgICAgIGNhc2UgaXJfdmFyX3NoYWRlcl9vdXQ6CisgICAgICBjYXNlIGlyX3Zhcl9zeXN0ZW1fdmFsdWU6CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkJ1aWx0LWluIHZhcmlhYmxlICIgPDwgdmFyLT5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIGFuIGludmFsaWQgbW9kZSAiIDw8IGludCh2YXItPmRhdGEubW9kZSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2xhc3MgdmVydGV4X2J1aWx0aW4gOiBwdWJsaWMgY29tbW9uX2J1aWx0aW4geworcHVibGljOgorICAgdmVydGV4X2J1aWx0aW4oKQorICAgICAgOiBjb21tb25fYnVpbHRpbihHTF9WRVJURVhfU0hBREVSKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KK307CisKK1RFU1RfRih2ZXJ0ZXhfYnVpbHRpbiwgbmFtZXNfc3RhcnRfd2l0aF9nbCkKK3sKKyAgIGNvbW1vbl9idWlsdGluOjpuYW1lc19zdGFydF93aXRoX2dsKCk7Cit9CisKK1RFU1RfRih2ZXJ0ZXhfYnVpbHRpbiwgaW5wdXRzX2hhdmVfZXhwbGljaXRfbG9jYXRpb24pCit7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmlyKSB7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9zaGFkZXJfaW4pCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgRVhQRUNUX1RSVUUodmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9ORSgtMSwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9HVChWRVJUX0FUVFJJQl9HRU5FUklDMCwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9FUSgwdSwgdmFyLT5kYXRhLmxvY2F0aW9uX2ZyYWMpOworICAgfQorfQorCitURVNUX0YodmVydGV4X2J1aWx0aW4sIG91dHB1dHNfaGF2ZV9leHBsaWNpdF9sb2NhdGlvbikKK3sKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAodmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9vdXQpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgRVhQRUNUX1RSVUUodmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9ORSgtMSwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9HVChWQVJZSU5HX1NMT1RfVkFSMCwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9FUSgwdSwgdmFyLT5kYXRhLmxvY2F0aW9uX2ZyYWMpOworCisgICAgICAvKiBTZXZlcmFsIHZhcnlpbmdzIG9ubHkgZXhpc3QgaW4gdGhlIGZyYWdtZW50IHNoYWRlci4gIEJlIHN1cmUgdGhhdCBubworICAgICAgICogb3V0cHV0cyB3aXRoIHRoZXNlIGxvY2F0aW9ucyBleGlzdC4KKyAgICAgICAqLworICAgICAgRVhQRUNUX05FKFZBUllJTkdfU0xPVF9QTlRDLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgICAgRVhQRUNUX05FKFZBUllJTkdfU0xPVF9GQUNFLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgICAgRVhQRUNUX05FKFZBUllJTkdfU0xPVF9QUklNSVRJVkVfSUQsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICB9Cit9CisKK1RFU1RfRih2ZXJ0ZXhfYnVpbHRpbiwgdW5pZm9ybXNfYW5kX3N5c3RlbV92YWx1ZXNfZG9udF9oYXZlX2V4cGxpY2l0X2xvY2F0aW9uKQoreworICAgY29tbW9uX2J1aWx0aW46OnVuaWZvcm1zX2FuZF9zeXN0ZW1fdmFsdWVzX2RvbnRfaGF2ZV9leHBsaWNpdF9sb2NhdGlvbigpOworfQorCitURVNUX0YodmVydGV4X2J1aWx0aW4sIGNvbnN0YW50c19hcmVfY29uc3RhbnQpCit7CisgICBjb21tb25fYnVpbHRpbjo6Y29uc3RhbnRzX2FyZV9jb25zdGFudCgpOworfQorCitURVNUX0YodmVydGV4X2J1aWx0aW4sIG5vX2ludmFsaWRfdmFyaWFibGVfbW9kZXMpCit7CisgICBjb21tb25fYnVpbHRpbjo6bm9faW52YWxpZF92YXJpYWJsZV9tb2RlcygpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NsYXNzIGZyYWdtZW50X2J1aWx0aW4gOiBwdWJsaWMgY29tbW9uX2J1aWx0aW4geworcHVibGljOgorICAgZnJhZ21lbnRfYnVpbHRpbigpCisgICAgICA6IGNvbW1vbl9idWlsdGluKEdMX0ZSQUdNRU5UX1NIQURFUikKKyAgIHsKKyAgICAgIC8qIGVtcHR5ICovCisgICB9Cit9OworCitURVNUX0YoZnJhZ21lbnRfYnVpbHRpbiwgbmFtZXNfc3RhcnRfd2l0aF9nbCkKK3sKKyAgIGNvbW1vbl9idWlsdGluOjpuYW1lc19zdGFydF93aXRoX2dsKCk7Cit9CisKK1RFU1RfRihmcmFnbWVudF9idWlsdGluLCBpbnB1dHNfaGF2ZV9leHBsaWNpdF9sb2NhdGlvbikKK3sKKyAgIGZvcmVhY2hfbGlzdChub2RlLCAmdGhpcy0+aXIpIHsKKyAgICAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPSAoKGlyX2luc3RydWN0aW9uICopIG5vZGUpLT5hc192YXJpYWJsZSgpOworCisgICAgICBpZiAodmFyLT5kYXRhLm1vZGUgIT0gaXJfdmFyX3NoYWRlcl9pbikKKwkgY29udGludWU7CisKKyAgICAgIEVYUEVDVF9UUlVFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICAgICBFWFBFQ1RfTkUoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICAgICBFWFBFQ1RfR1QoVkFSWUlOR19TTE9UX1ZBUjAsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICAgICBFWFBFQ1RfRVEoMHUsIHZhci0+ZGF0YS5sb2NhdGlvbl9mcmFjKTsKKworICAgICAgLyogU2V2ZXJhbCB2YXJ5aW5ncyBvbmx5IGV4aXN0IGluIHRoZSB2ZXJ0ZXggLyBnZW9tZXRyeSBzaGFkZXIuICBCZSBzdXJlCisgICAgICAgKiB0aGF0IG5vIGlucHV0cyB3aXRoIHRoZXNlIGxvY2F0aW9ucyBleGlzdC4KKyAgICAgICAqLworICAgICAgRVhQRUNUX1RSVUUoX21lc2FfdmFyeWluZ19zbG90X2luX2ZzKChnbF92YXJ5aW5nX3Nsb3QpIHZhci0+ZGF0YS5sb2NhdGlvbikpOworICAgfQorfQorCitURVNUX0YoZnJhZ21lbnRfYnVpbHRpbiwgb3V0cHV0c19oYXZlX2V4cGxpY2l0X2xvY2F0aW9uKQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfc2hhZGVyX291dCkKKwkgY29udGludWU7CisKKyAgICAgIEVYUEVDVF9UUlVFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICAgICBFWFBFQ1RfTkUoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisKKyAgICAgIC8qIGdsX0ZyYWdEYXRhW10gaGFzIGxvY2F0aW9uIEZSQUdfUkVTVUxUX0RBVEEwLiAgTG9jYXRpb25zIGJleW9uZCB0aGF0CisgICAgICAgKiBhcmUgaW52YWxpZC4KKyAgICAgICAqLworICAgICAgRVhQRUNUX0dFKEZSQUdfUkVTVUxUX0RBVEEwLCB2YXItPmRhdGEubG9jYXRpb24pOworCisgICAgICBFWFBFQ1RfRVEoMHUsIHZhci0+ZGF0YS5sb2NhdGlvbl9mcmFjKTsKKyAgIH0KK30KKworVEVTVF9GKGZyYWdtZW50X2J1aWx0aW4sIHVuaWZvcm1zX2FuZF9zeXN0ZW1fdmFsdWVzX2RvbnRfaGF2ZV9leHBsaWNpdF9sb2NhdGlvbikKK3sKKyAgIGNvbW1vbl9idWlsdGluOjp1bmlmb3Jtc19hbmRfc3lzdGVtX3ZhbHVlc19kb250X2hhdmVfZXhwbGljaXRfbG9jYXRpb24oKTsKK30KKworVEVTVF9GKGZyYWdtZW50X2J1aWx0aW4sIGNvbnN0YW50c19hcmVfY29uc3RhbnQpCit7CisgICBjb21tb25fYnVpbHRpbjo6Y29uc3RhbnRzX2FyZV9jb25zdGFudCgpOworfQorCitURVNUX0YoZnJhZ21lbnRfYnVpbHRpbiwgbm9faW52YWxpZF92YXJpYWJsZV9tb2RlcykKK3sKKyAgIGNvbW1vbl9idWlsdGluOjpub19pbnZhbGlkX3ZhcmlhYmxlX21vZGVzKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2xhc3MgZ2VvbWV0cnlfYnVpbHRpbiA6IHB1YmxpYyBjb21tb25fYnVpbHRpbiB7CitwdWJsaWM6CisgICBnZW9tZXRyeV9idWlsdGluKCkKKyAgICAgIDogY29tbW9uX2J1aWx0aW4oR0xfR0VPTUVUUllfU0hBREVSKQorICAgeworICAgICAgLyogZW1wdHkgKi8KKyAgIH0KK307CisKK1RFU1RfRihnZW9tZXRyeV9idWlsdGluLCBuYW1lc19zdGFydF93aXRoX2dsKQoreworICAgY29tbW9uX2J1aWx0aW46Om5hbWVzX3N0YXJ0X3dpdGhfZ2woKTsKK30KKworVEVTVF9GKGdlb21ldHJ5X2J1aWx0aW4sIGlucHV0c19oYXZlX2V4cGxpY2l0X2xvY2F0aW9uKQoreworICAgZm9yZWFjaF9saXN0KG5vZGUsICZ0aGlzLT5pcikgeworICAgICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9ICgoaXJfaW5zdHJ1Y3Rpb24gKikgbm9kZSktPmFzX3ZhcmlhYmxlKCk7CisKKyAgICAgIGlmICh2YXItPmRhdGEubW9kZSAhPSBpcl92YXJfc2hhZGVyX2luKQorCSBjb250aW51ZTsKKworICAgICAgaWYgKHZhci0+aXNfaW50ZXJmYWNlX2luc3RhbmNlKCkpIHsKKyAgICAgICAgIEVYUEVDVF9TVFJFUSgiZ2xfaW4iLCB2YXItPm5hbWUpOworICAgICAgICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICAgICAgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisKKyAgICAgICAgIEFTU0VSVF9UUlVFKHZhci0+dHlwZS0+aXNfYXJyYXkoKSk7CisKKyAgICAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgaW5zdGFuY2VfdHlwZSA9IHZhci0+dHlwZS0+ZmllbGRzLmFycmF5OworCisgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5zdGFuY2VfdHlwZS0+bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkICpjb25zdCBpbnB1dCA9CisgICAgICAgICAgICAgICAmaW5zdGFuY2VfdHlwZS0+ZmllbGRzLnN0cnVjdHVyZVtpXTsKKworICAgICAgICAgICAgc3RyaW5nX3N0YXJ0c193aXRoX3ByZWZpeChpbnB1dC0+bmFtZSwgImdsXyIpOworICAgICAgICAgICAgRVhQRUNUX05FKC0xLCBpbnB1dC0+bG9jYXRpb24pOworICAgICAgICAgICAgRVhQRUNUX0dUKFZBUllJTkdfU0xPVF9WQVIwLCBpbnB1dC0+bG9jYXRpb24pOworCisgICAgICAgICAgICAvKiBTZXZlcmFsIHZhcnlpbmdzIG9ubHkgZXhpc3QgaW4gdGhlIGZyYWdtZW50IHNoYWRlci4gIEJlIHN1cmUKKyAgICAgICAgICAgICAqIHRoYXQgbm8gaW5wdXRzIHdpdGggdGhlc2UgbG9jYXRpb25zIGV4aXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBFWFBFQ1RfTkUoVkFSWUlOR19TTE9UX1BOVEMsIGlucHV0LT5sb2NhdGlvbik7CisgICAgICAgICAgICBFWFBFQ1RfTkUoVkFSWUlOR19TTE9UX0ZBQ0UsIGlucHV0LT5sb2NhdGlvbik7CisgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgRVhQRUNUX1RSVUUodmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKTsKKyAgICAgICAgIEVYUEVDVF9ORSgtMSwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgICAgIEVYUEVDVF9HVChWQVJZSU5HX1NMT1RfVkFSMCwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgICAgIEVYUEVDVF9FUSgwdSwgdmFyLT5kYXRhLmxvY2F0aW9uX2ZyYWMpOworICAgICAgfQorCisgICAgICAvKiBTZXZlcmFsIHZhcnlpbmdzIG9ubHkgZXhpc3QgaW4gdGhlIGZyYWdtZW50IHNoYWRlci4gIEJlIHN1cmUgdGhhdCBubworICAgICAgICogaW5wdXRzIHdpdGggdGhlc2UgbG9jYXRpb25zIGV4aXN0LgorICAgICAgICovCisgICAgICBFWFBFQ1RfTkUoVkFSWUlOR19TTE9UX1BOVEMsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICAgICBFWFBFQ1RfTkUoVkFSWUlOR19TTE9UX0ZBQ0UsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICB9Cit9CisKK1RFU1RfRihnZW9tZXRyeV9idWlsdGluLCBvdXRwdXRzX2hhdmVfZXhwbGljaXRfbG9jYXRpb24pCit7CisgICBmb3JlYWNoX2xpc3Qobm9kZSwgJnRoaXMtPmlyKSB7CisgICAgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0gKChpcl9pbnN0cnVjdGlvbiAqKSBub2RlKS0+YXNfdmFyaWFibGUoKTsKKworICAgICAgaWYgKHZhci0+ZGF0YS5tb2RlICE9IGlyX3Zhcl9zaGFkZXJfb3V0KQorCSBjb250aW51ZTsKKworICAgICAgRVhQRUNUX1RSVUUodmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9ORSgtMSwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9HVChWQVJZSU5HX1NMT1RfVkFSMCwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKyAgICAgIEVYUEVDVF9FUSgwdSwgdmFyLT5kYXRhLmxvY2F0aW9uX2ZyYWMpOworCisgICAgICAvKiBTZXZlcmFsIHZhcnlpbmdzIG9ubHkgZXhpc3QgaW4gdGhlIGZyYWdtZW50IHNoYWRlci4gIEJlIHN1cmUgdGhhdCBubworICAgICAgICogb3V0cHV0cyB3aXRoIHRoZXNlIGxvY2F0aW9ucyBleGlzdC4KKyAgICAgICAqLworICAgICAgRVhQRUNUX05FKFZBUllJTkdfU0xPVF9QTlRDLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgICAgRVhQRUNUX05FKFZBUllJTkdfU0xPVF9GQUNFLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgfQorfQorCitURVNUX0YoZ2VvbWV0cnlfYnVpbHRpbiwgdW5pZm9ybXNfYW5kX3N5c3RlbV92YWx1ZXNfZG9udF9oYXZlX2V4cGxpY2l0X2xvY2F0aW9uKQoreworICAgY29tbW9uX2J1aWx0aW46OnVuaWZvcm1zX2FuZF9zeXN0ZW1fdmFsdWVzX2RvbnRfaGF2ZV9leHBsaWNpdF9sb2NhdGlvbigpOworfQorCitURVNUX0YoZ2VvbWV0cnlfYnVpbHRpbiwgY29uc3RhbnRzX2FyZV9jb25zdGFudCkKK3sKKyAgIGNvbW1vbl9idWlsdGluOjpjb25zdGFudHNfYXJlX2NvbnN0YW50KCk7Cit9CisKK1RFU1RfRihnZW9tZXRyeV9idWlsdGluLCBub19pbnZhbGlkX3ZhcmlhYmxlX21vZGVzKQoreworICAgY29tbW9uX2J1aWx0aW46Om5vX2ludmFsaWRfdmFyaWFibGVfbW9kZXMoKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvY29tbW9uLmMgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OWY1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2NvbW1vbi5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAibWFpbi9lcnJvcnMuaCIKKwordm9pZAorX21lc2FfZXJyb3Jfbm9fbWVtb3J5KGNvbnN0IGNoYXIgKmNhbGxlcikKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAiTWVzYSBlcnJvcjogb3V0IG9mIG1lbW9yeSBpbiAlcyIsIGNhbGxlcik7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2NvbXBhcmVfaXIgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2NvbXBhcmVfaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwZmM4MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvY29tcGFyZV9pcgpAQCAtMCwwICsxLDU5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgY29kaW5nPXV0Zi04CisjCisjIENvcHlyaWdodCDCqSAyMDExIEludGVsIENvcnBvcmF0aW9uCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisjIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisjIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyMgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyMgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorIyBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyMgQ29tcGFyZSB0d28gZmlsZXMgY29udGFpbmluZyBJUiBjb2RlLiAgSWdub3JlIGZvcm1hdHRpbmcgZGlmZmVyZW5jZXMKKyMgYW5kIGRlY2xhcmF0aW9uIG9yZGVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCisKK2Zyb20gc2V4cHMgaW1wb3J0ICoKKworaWYgbGVuKHN5cy5hcmd2KSAhPSAzOgorICAgIHByaW50ICdVc2FnZTogY29tcGFyZV9pciA8ZmlsZTE+IDxmaWxlMj4nCisgICAgZXhpdCgxKQorCit3aXRoIG9wZW4oc3lzLmFyZ3ZbMV0pIGFzIGY6CisgICAgaXIxID0gc29ydF9kZWNscyhwYXJzZV9zZXhwKGYucmVhZCgpKSkKK3dpdGggb3BlbihzeXMuYXJndlsyXSkgYXMgZjoKKyAgICBpcjIgPSBzb3J0X2RlY2xzKHBhcnNlX3NleHAoZi5yZWFkKCkpKQorCitpZiBpcjEgPT0gaXIyOgorICAgIGV4aXQoMCkKK2Vsc2U6CisgICAgZmlsZTEsIHBhdGgxID0gdGVtcGZpbGUubWtzdGVtcChvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzFdKSkKKyAgICBmaWxlMiwgcGF0aDIgPSB0ZW1wZmlsZS5ta3N0ZW1wKG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMl0pKQorICAgIHRyeToKKyAgICAgICAgb3Mud3JpdGUoZmlsZTEsICd7MH1cbicuZm9ybWF0KHNleHBfdG9fc3RyaW5nKGlyMSkpKQorICAgICAgICBvcy5jbG9zZShmaWxlMSkKKyAgICAgICAgb3Mud3JpdGUoZmlsZTIsICd7MH1cbicuZm9ybWF0KHNleHBfdG9fc3RyaW5nKGlyMikpKQorICAgICAgICBvcy5jbG9zZShmaWxlMikKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFsnZGlmZicsICctdScsIHBhdGgxLCBwYXRoMl0pCisgICAgZmluYWxseToKKyAgICAgICAgb3MucmVtb3ZlKHBhdGgxKQorICAgICAgICBvcy5yZW1vdmUocGF0aDIpCisgICAgZXhpdCgxKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9jb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2VfdGVzdHMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9jb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2VfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjIwODQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2NvcHlfY29uc3RhbnRfdG9fc3RvcmFnZV90ZXN0cy5jcHAKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSAibWFpbi9jb21waWxlci5oIgorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJyYWxsb2MuaCIKKyNpbmNsdWRlICJ1bmlmb3JtX2luaXRpYWxpemVyX3V0aWxzLmgiCisKK25hbWVzcGFjZSBsaW5rZXIgeworZXh0ZXJuIHZvaWQKK2NvcHlfY29uc3RhbnRfdG9fc3RvcmFnZSh1bmlvbiBnbF9jb25zdGFudF92YWx1ZSAqc3RvcmFnZSwKKwkJCSBjb25zdCBpcl9jb25zdGFudCAqdmFsLAorCQkJIGNvbnN0IGVudW0gZ2xzbF9iYXNlX3R5cGUgYmFzZV90eXBlLAorCQkJIGNvbnN0IHVuc2lnbmVkIGludCBlbGVtZW50cyk7Cit9CisKK2NsYXNzIGNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZSA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgdm9pZCBpbnRfdGVzdCh1bnNpZ25lZCByb3dzKTsKKyAgIHZvaWQgdWludF90ZXN0KHVuc2lnbmVkIHJvd3MpOworICAgdm9pZCBib29sX3Rlc3QodW5zaWduZWQgcm93cyk7CisgICB2b2lkIHNhbXBsZXJfdGVzdCgpOworICAgdm9pZCBmbG9hdF90ZXN0KHVuc2lnbmVkIGNvbHVtbnMsIHVuc2lnbmVkIHJvd3MpOworCisgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKKyAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOworCisgICBnbF9jb25zdGFudF92YWx1ZSBzdG9yYWdlWzE3XTsKKyAgIHZvaWQgKm1lbV9jdHg7Cit9OworCit2b2lkCitjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2U6OlNldFVwKCkKK3sKKyAgIHRoaXMtPm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKK30KKwordm9pZAorY29weV9jb25zdGFudF90b19zdG9yYWdlOjpUZWFyRG93bigpCit7CisgICByYWxsb2NfZnJlZSh0aGlzLT5tZW1fY3R4KTsKKyAgIHRoaXMtPm1lbV9jdHggPSBOVUxMOworfQorCit2b2lkCitjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2U6OmludF90ZXN0KHVuc2lnbmVkIHJvd3MpCit7CisgICBpcl9jb25zdGFudCAqdmFsOworICAgZ2VuZXJhdGVfZGF0YShtZW1fY3R4LCBHTFNMX1RZUEVfSU5ULCAxLCByb3dzLCB2YWwpOworCisgICBjb25zdCB1bnNpZ25lZCByZWRfem9uZV9zaXplID0gRWxlbWVudHMoc3RvcmFnZSkgLSB2YWwtPnR5cGUtPmNvbXBvbmVudHMoKTsKKyAgIGZpbGxfc3RvcmFnZV9hcnJheV93aXRoX3NlbnRpbmVscyhzdG9yYWdlLAorCQkJCSAgICAgdmFsLT50eXBlLT5jb21wb25lbnRzKCksCisJCQkJICAgICByZWRfem9uZV9zaXplKTsKKworICAgbGlua2VyOjpjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2Uoc3RvcmFnZSwKKwkJCQkgICAgdmFsLAorCQkJCSAgICB2YWwtPnR5cGUtPmJhc2VfdHlwZSwKKwkJCQkgICAgdmFsLT50eXBlLT5jb21wb25lbnRzKCkpOworCisgICB2ZXJpZnlfZGF0YShzdG9yYWdlLCAwLCB2YWwsIHJlZF96b25lX3NpemUpOworfQorCit2b2lkCitjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2U6OnVpbnRfdGVzdCh1bnNpZ25lZCByb3dzKQoreworICAgaXJfY29uc3RhbnQgKnZhbDsKKyAgIGdlbmVyYXRlX2RhdGEobWVtX2N0eCwgR0xTTF9UWVBFX1VJTlQsIDEsIHJvd3MsIHZhbCk7CisKKyAgIGNvbnN0IHVuc2lnbmVkIHJlZF96b25lX3NpemUgPSBFbGVtZW50cyhzdG9yYWdlKSAtIHZhbC0+dHlwZS0+Y29tcG9uZW50cygpOworICAgZmlsbF9zdG9yYWdlX2FycmF5X3dpdGhfc2VudGluZWxzKHN0b3JhZ2UsCisJCQkJICAgICB2YWwtPnR5cGUtPmNvbXBvbmVudHMoKSwKKwkJCQkgICAgIHJlZF96b25lX3NpemUpOworCisgICBsaW5rZXI6OmNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZShzdG9yYWdlLAorCQkJCSAgICB2YWwsCisJCQkJICAgIHZhbC0+dHlwZS0+YmFzZV90eXBlLAorCQkJCSAgICB2YWwtPnR5cGUtPmNvbXBvbmVudHMoKSk7CisKKyAgIHZlcmlmeV9kYXRhKHN0b3JhZ2UsIDAsIHZhbCwgcmVkX3pvbmVfc2l6ZSk7Cit9CisKK3ZvaWQKK2NvcHlfY29uc3RhbnRfdG9fc3RvcmFnZTo6ZmxvYXRfdGVzdCh1bnNpZ25lZCBjb2x1bW5zLCB1bnNpZ25lZCByb3dzKQoreworICAgaXJfY29uc3RhbnQgKnZhbDsKKyAgIGdlbmVyYXRlX2RhdGEobWVtX2N0eCwgR0xTTF9UWVBFX0ZMT0FULCBjb2x1bW5zLCByb3dzLCB2YWwpOworCisgICBjb25zdCB1bnNpZ25lZCByZWRfem9uZV9zaXplID0gRWxlbWVudHMoc3RvcmFnZSkgLSB2YWwtPnR5cGUtPmNvbXBvbmVudHMoKTsKKyAgIGZpbGxfc3RvcmFnZV9hcnJheV93aXRoX3NlbnRpbmVscyhzdG9yYWdlLAorCQkJCSAgICAgdmFsLT50eXBlLT5jb21wb25lbnRzKCksCisJCQkJICAgICByZWRfem9uZV9zaXplKTsKKworICAgbGlua2VyOjpjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2Uoc3RvcmFnZSwKKwkJCQkgICAgdmFsLAorCQkJCSAgICB2YWwtPnR5cGUtPmJhc2VfdHlwZSwKKwkJCQkgICAgdmFsLT50eXBlLT5jb21wb25lbnRzKCkpOworCisgICB2ZXJpZnlfZGF0YShzdG9yYWdlLCAwLCB2YWwsIHJlZF96b25lX3NpemUpOworfQorCit2b2lkCitjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2U6OmJvb2xfdGVzdCh1bnNpZ25lZCByb3dzKQoreworICAgaXJfY29uc3RhbnQgKnZhbDsKKyAgIGdlbmVyYXRlX2RhdGEobWVtX2N0eCwgR0xTTF9UWVBFX0JPT0wsIDEsIHJvd3MsIHZhbCk7CisKKyAgIGNvbnN0IHVuc2lnbmVkIHJlZF96b25lX3NpemUgPSBFbGVtZW50cyhzdG9yYWdlKSAtIHZhbC0+dHlwZS0+Y29tcG9uZW50cygpOworICAgZmlsbF9zdG9yYWdlX2FycmF5X3dpdGhfc2VudGluZWxzKHN0b3JhZ2UsCisJCQkJICAgICB2YWwtPnR5cGUtPmNvbXBvbmVudHMoKSwKKwkJCQkgICAgIHJlZF96b25lX3NpemUpOworCisgICBsaW5rZXI6OmNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZShzdG9yYWdlLAorCQkJCSAgICB2YWwsCisJCQkJICAgIHZhbC0+dHlwZS0+YmFzZV90eXBlLAorCQkJCSAgICB2YWwtPnR5cGUtPmNvbXBvbmVudHMoKSk7CisKKyAgIHZlcmlmeV9kYXRhKHN0b3JhZ2UsIDAsIHZhbCwgcmVkX3pvbmVfc2l6ZSk7Cit9CisKKy8qKgorICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgdGVzdCBhbmQgaW50X3Rlc3QgaXMgdGhhdCB0aGUgYmFzZSB0eXBlCisgKiBwYXNzZWQgdG8gXGMgbGlua2VyOjpjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UgaXMgaGFyZC1jb2RlZCB0byBcYworICogR0xTTF9UWVBFX1NBTVBMRVIgaW5zdGVhZCBvZiB1c2luZyB0aGUgYmFzZSB0eXBlIGZyb20gdGhlIGNvbnN0YW50LgorICovCit2b2lkCitjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2U6OnNhbXBsZXJfdGVzdCh2b2lkKQoreworICAgaXJfY29uc3RhbnQgKnZhbDsKKyAgIGdlbmVyYXRlX2RhdGEobWVtX2N0eCwgR0xTTF9UWVBFX0lOVCwgMSwgMSwgdmFsKTsKKworICAgY29uc3QgdW5zaWduZWQgcmVkX3pvbmVfc2l6ZSA9IEVsZW1lbnRzKHN0b3JhZ2UpIC0gdmFsLT50eXBlLT5jb21wb25lbnRzKCk7CisgICBmaWxsX3N0b3JhZ2VfYXJyYXlfd2l0aF9zZW50aW5lbHMoc3RvcmFnZSwKKwkJCQkgICAgIHZhbC0+dHlwZS0+Y29tcG9uZW50cygpLAorCQkJCSAgICAgcmVkX3pvbmVfc2l6ZSk7CisKKyAgIGxpbmtlcjo6Y29weV9jb25zdGFudF90b19zdG9yYWdlKHN0b3JhZ2UsCisJCQkJICAgIHZhbCwKKwkJCQkgICAgR0xTTF9UWVBFX1NBTVBMRVIsCisJCQkJICAgIHZhbC0+dHlwZS0+Y29tcG9uZW50cygpKTsKKworICAgdmVyaWZ5X2RhdGEoc3RvcmFnZSwgMCwgdmFsLCByZWRfem9uZV9zaXplKTsKK30KKworVEVTVF9GKGNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZSwgYm9vbF91bmlmb3JtKQoreworICAgYm9vbF90ZXN0KDEpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBidmVjMl91bmlmb3JtKQoreworICAgYm9vbF90ZXN0KDIpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBidmVjM191bmlmb3JtKQoreworICAgYm9vbF90ZXN0KDMpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBidmVjNF91bmlmb3JtKQoreworICAgYm9vbF90ZXN0KDQpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBpbnRfdW5pZm9ybSkKK3sKKyAgIGludF90ZXN0KDEpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBpdmVjMl91bmlmb3JtKQoreworICAgaW50X3Rlc3QoMik7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIGl2ZWMzX3VuaWZvcm0pCit7CisgICBpbnRfdGVzdCgzKTsKK30KKworVEVTVF9GKGNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZSwgaXZlYzRfdW5pZm9ybSkKK3sKKyAgIGludF90ZXN0KDQpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCB1aW50X3VuaWZvcm0pCit7CisgICB1aW50X3Rlc3QoMSk7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIHV2ZWMyX3VuaWZvcm0pCit7CisgICB1aW50X3Rlc3QoMik7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIHV2ZWMzX3VuaWZvcm0pCit7CisgICB1aW50X3Rlc3QoMyk7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIHV2ZWM0X3VuaWZvcm0pCit7CisgICB1aW50X3Rlc3QoNCk7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIGZsb2F0X3VuaWZvcm0pCit7CisgICBmbG9hdF90ZXN0KDEsIDEpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCB2ZWMyX3VuaWZvcm0pCit7CisgICBmbG9hdF90ZXN0KDEsIDIpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCB2ZWMzX3VuaWZvcm0pCit7CisgICBmbG9hdF90ZXN0KDEsIDMpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCB2ZWM0X3VuaWZvcm0pCit7CisgICBmbG9hdF90ZXN0KDEsIDQpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBtYXQyeDJfdW5pZm9ybSkKK3sKKyAgIGZsb2F0X3Rlc3QoMiwgMik7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIG1hdDJ4M191bmlmb3JtKQoreworICAgZmxvYXRfdGVzdCgyLCAzKTsKK30KKworVEVTVF9GKGNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZSwgbWF0Mng0X3VuaWZvcm0pCit7CisgICBmbG9hdF90ZXN0KDIsIDQpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBtYXQzeDJfdW5pZm9ybSkKK3sKKyAgIGZsb2F0X3Rlc3QoMywgMik7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIG1hdDN4M191bmlmb3JtKQoreworICAgZmxvYXRfdGVzdCgzLCAzKTsKK30KKworVEVTVF9GKGNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZSwgbWF0M3g0X3VuaWZvcm0pCit7CisgICBmbG9hdF90ZXN0KDMsIDQpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBtYXQ0eDJfdW5pZm9ybSkKK3sKKyAgIGZsb2F0X3Rlc3QoNCwgMik7Cit9CisKK1RFU1RfRihjb3B5X2NvbnN0YW50X3RvX3N0b3JhZ2UsIG1hdDR4M191bmlmb3JtKQoreworICAgZmxvYXRfdGVzdCg0LCAzKTsKK30KKworVEVTVF9GKGNvcHlfY29uc3RhbnRfdG9fc3RvcmFnZSwgbWF0NHg0X3VuaWZvcm0pCit7CisgICBmbG9hdF90ZXN0KDQsIDQpOworfQorCitURVNUX0YoY29weV9jb25zdGFudF90b19zdG9yYWdlLCBzYW1wbGVyX3VuaWZvcm0pCit7CisgICBzYW1wbGVyX3Rlc3QoKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvZ2VuZXJhbF9pcl90ZXN0LmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvZ2VuZXJhbF9pcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZmNTZiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9nZW5lcmFsX2lyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImljZC11dGlscy5oIiAvLyBMdW5hckcgQUREOgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSAibWFpbi9jb21waWxlci5oIgorI2luY2x1ZGUgIm1haW4vbXR5cGVzLmgiCisjaW5jbHVkZSAibWFpbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJyYWxsb2MuaCIKKyNpbmNsdWRlICJpci5oIgorCitURVNUKGlyX3ZhcmlhYmxlX2NvbnN0cnVjdG9yLCBpbnRlcmZhY2UpCit7CisgICB2b2lkICptZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisKKyAgIHN0YXRpYyBjb25zdCBnbHNsX3N0cnVjdF9maWVsZCBmW10gPSB7CisgICAgICB7CisgICAgICAgICBnbHNsX3R5cGU6OnZlYyg0KSwKKyAgICAgICAgICJ2IiwKKyAgICAgICAgIGZhbHNlCisgICAgICB9CisgICB9OworCisgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGludGVyZmFjZSA9CisgICAgICBnbHNsX3R5cGU6OmdldF9pbnRlcmZhY2VfaW5zdGFuY2UoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMU0xfSU5URVJGQUNFX1BBQ0tJTkdfU1REMTQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW1wbGVfaW50ZXJmYWNlIik7CisKKyAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXSA9ICJuYW1lZF9pbnN0YW5jZSI7CisKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShpbnRlcmZhY2UsIG5hbWUsIGlyX3Zhcl91bmlmb3JtKTsKKworICAgRVhQRUNUX1NUUkVRKG5hbWUsIHYtPm5hbWUpOworICAgRVhQRUNUX05FKG5hbWUsIHYtPm5hbWUpOworICAgRVhQRUNUX0VRKGludGVyZmFjZSwgdi0+dHlwZSk7CisgICBFWFBFQ1RfRVEoaW50ZXJmYWNlLCB2LT5nZXRfaW50ZXJmYWNlX3R5cGUoKSk7Cit9CisKK1RFU1QoaXJfdmFyaWFibGVfY29uc3RydWN0b3IsIGludGVyZmFjZV9hcnJheSkKK3sKKyAgIHZvaWQgKm1lbV9jdHggPSByYWxsb2NfY29udGV4dChOVUxMKTsKKworICAgc3RhdGljIGNvbnN0IGdsc2xfc3RydWN0X2ZpZWxkIGZbXSA9IHsKKyAgICAgIHsKKyAgICAgICAgIGdsc2xfdHlwZTo6dmVjKDQpLAorICAgICAgICAgInYiLAorICAgICAgICAgZmFsc2UKKyAgICAgIH0KKyAgIH07CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgaW50ZXJmYWNlID0KKyAgICAgIGdsc2xfdHlwZTo6Z2V0X2ludGVyZmFjZV9pbnN0YW5jZShmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xTTF9JTlRFUkZBQ0VfUEFDS0lOR19TVEQxNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbXBsZV9pbnRlcmZhY2UiKTsKKworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCBpbnRlcmZhY2VfYXJyYXkgPQorICAgICAgZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UoaW50ZXJmYWNlLCAyKTsKKworICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdID0gImFycmF5X2luc3RhbmNlIjsKKworICAgaXJfdmFyaWFibGUgKmNvbnN0IHYgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGludGVyZmFjZV9hcnJheSwgbmFtZSwgaXJfdmFyX3VuaWZvcm0pOworCisgICBFWFBFQ1RfU1RSRVEobmFtZSwgdi0+bmFtZSk7CisgICBFWFBFQ1RfTkUobmFtZSwgdi0+bmFtZSk7CisgICBFWFBFQ1RfRVEoaW50ZXJmYWNlX2FycmF5LCB2LT50eXBlKTsKKyAgIEVYUEVDVF9FUShpbnRlcmZhY2UsIHYtPmdldF9pbnRlcmZhY2VfdHlwZSgpKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvaW52YWxpZGF0ZV9sb2NhdGlvbnNfdGVzdC5jcHAgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2ludmFsaWRhdGVfbG9jYXRpb25zX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzU5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2ludmFsaWRhdGVfbG9jYXRpb25zX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgIm1haW4vY29tcGlsZXIuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicmFsbG9jLmgiCisjaW5jbHVkZSAiaXIuaCIKKyNpbmNsdWRlICJsaW5rZXIuaCIKKworLyoqCisgKiBcZmlsZSB2YXJ5aW5nc190ZXN0LmNwcAorICoKKyAqIFRlc3QgdmFyaW91cyBhc3BlY3RzIG9mIGxpbmtpbmcgc2hhZGVyIHN0YWdlIGlucHV0cyBhbmQgb3V0cHV0cy4KKyAqLworCitjbGFzcyBpbnZhbGlkYXRlX2xvY2F0aW9ucyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworICAgdm9pZCAqbWVtX2N0eDsKKyAgIGV4ZWNfbGlzdCBpcjsKK307CisKK3ZvaWQKK2ludmFsaWRhdGVfbG9jYXRpb25zOjpTZXRVcCgpCit7CisgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICB0aGlzLT5pci5tYWtlX2VtcHR5KCk7Cit9CisKK3ZvaWQKK2ludmFsaWRhdGVfbG9jYXRpb25zOjpUZWFyRG93bigpCit7CisgICByYWxsb2NfZnJlZSh0aGlzLT5tZW1fY3R4KTsKKyAgIHRoaXMtPm1lbV9jdHggPSBOVUxMOworfQorCitURVNUX0YoaW52YWxpZGF0ZV9sb2NhdGlvbnMsIHNpbXBsZV92ZXJ0ZXhfaW5fZ2VuZXJpYykKK3sKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6dmVjKDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfc2hhZGVyX2luKTsKKworICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisKKyAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IFZFUlRfQVRUUklCX0dFTkVSSUMwOworICAgdmFyLT5kYXRhLmxvY2F0aW9uX2ZyYWMgPSAyOworCisgICBpci5wdXNoX3RhaWwodmFyKTsKKworICAgbGlua19pbnZhbGlkYXRlX3ZhcmlhYmxlX2xvY2F0aW9ucygmaXIpOworCisgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoMHUsIHZhci0+ZGF0YS5sb2NhdGlvbl9mcmFjKTsKKyAgIEVYUEVDVF9GQUxTRSh2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pOworICAgRVhQRUNUX1RSVUUodmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0KTsKK30KKworVEVTVF9GKGludmFsaWRhdGVfbG9jYXRpb25zLCBleHBsaWNpdF9sb2NhdGlvbl92ZXJ0ZXhfaW5fZ2VuZXJpYykKK3sKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6dmVjKDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfc2hhZGVyX2luKTsKKworICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisKKyAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IFZFUlRfQVRUUklCX0dFTkVSSUMwOworICAgdmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uID0gdHJ1ZTsKKworICAgaXIucHVzaF90YWlsKHZhcik7CisKKyAgIGxpbmtfaW52YWxpZGF0ZV92YXJpYWJsZV9sb2NhdGlvbnMoJmlyKTsKKworICAgRVhQRUNUX0VRKFZFUlRfQVRUUklCX0dFTkVSSUMwLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgRVhQRUNUX0VRKDB1LCB2YXItPmRhdGEubG9jYXRpb25fZnJhYyk7CisgICBFWFBFQ1RfVFJVRSh2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pOworICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5pc191bm1hdGNoZWRfZ2VuZXJpY19pbm91dCk7Cit9CisKK1RFU1RfRihpbnZhbGlkYXRlX2xvY2F0aW9ucywgZXhwbGljaXRfbG9jYXRpb25fZnJhY192ZXJ0ZXhfaW5fZ2VuZXJpYykKK3sKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2YXIgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGdsc2xfdHlwZTo6dmVjKDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfc2hhZGVyX2luKTsKKworICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisKKyAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IFZFUlRfQVRUUklCX0dFTkVSSUMwOworICAgdmFyLT5kYXRhLmxvY2F0aW9uX2ZyYWMgPSAyOworICAgdmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uID0gdHJ1ZTsKKworICAgaXIucHVzaF90YWlsKHZhcik7CisKKyAgIGxpbmtfaW52YWxpZGF0ZV92YXJpYWJsZV9sb2NhdGlvbnMoJmlyKTsKKworICAgRVhQRUNUX0VRKFZFUlRfQVRUUklCX0dFTkVSSUMwLCB2YXItPmRhdGEubG9jYXRpb24pOworICAgRVhQRUNUX0VRKDJ1LCB2YXItPmRhdGEubG9jYXRpb25fZnJhYyk7CisgICBFWFBFQ1RfVFJVRSh2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pOworICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5pc191bm1hdGNoZWRfZ2VuZXJpY19pbm91dCk7Cit9CisKK1RFU1RfRihpbnZhbGlkYXRlX2xvY2F0aW9ucywgdmVydGV4X2luX2J1aWx0aW4pCit7CisgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OnZlYyg0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfVmVydGV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfc2hhZGVyX2luKTsKKworICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisKKyAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IFZFUlRfQVRUUklCX1BPUzsKKyAgIHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbiA9IHRydWU7CisKKyAgIGlyLnB1c2hfdGFpbCh2YXIpOworCisgICBsaW5rX2ludmFsaWRhdGVfdmFyaWFibGVfbG9jYXRpb25zKCZpcik7CisKKyAgIEVYUEVDVF9FUShWRVJUX0FUVFJJQl9QT1MsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoMHUsIHZhci0+ZGF0YS5sb2NhdGlvbl9mcmFjKTsKKyAgIEVYUEVDVF9UUlVFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICBFWFBFQ1RfRkFMU0UodmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0KTsKK30KKworVEVTVF9GKGludmFsaWRhdGVfbG9jYXRpb25zLCBzaW1wbGVfdmVydGV4X291dF9nZW5lcmljKQoreworICAgaXJfdmFyaWFibGUgKmNvbnN0IHZhciA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjp2ZWMoNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl9zaGFkZXJfb3V0KTsKKworICAgRVhQRUNUX0ZBTFNFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisKKyAgIHZhci0+ZGF0YS5sb2NhdGlvbiA9IFZBUllJTkdfU0xPVF9WQVIwOworCisgICBpci5wdXNoX3RhaWwodmFyKTsKKworICAgbGlua19pbnZhbGlkYXRlX3ZhcmlhYmxlX2xvY2F0aW9ucygmaXIpOworCisgICBFWFBFQ1RfRVEoLTEsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoMHUsIHZhci0+ZGF0YS5sb2NhdGlvbl9mcmFjKTsKKyAgIEVYUEVDVF9GQUxTRSh2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24pOworICAgRVhQRUNUX1RSVUUodmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0KTsKK30KKworVEVTVF9GKGludmFsaWRhdGVfbG9jYXRpb25zLCB2ZXJ0ZXhfb3V0X2J1aWx0aW4pCit7CisgICBpcl92YXJpYWJsZSAqY29uc3QgdmFyID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OnZlYyg0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfRnJvbnRDb2xvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3NoYWRlcl9vdXQpOworCisgICBFWFBFQ1RfRkFMU0UodmFyLT5kYXRhLmV4cGxpY2l0X2xvY2F0aW9uKTsKKyAgIEVYUEVDVF9FUSgtMSwgdmFyLT5kYXRhLmxvY2F0aW9uKTsKKworICAgdmFyLT5kYXRhLmxvY2F0aW9uID0gVkFSWUlOR19TTE9UX0NPTDA7CisgICB2YXItPmRhdGEuZXhwbGljaXRfbG9jYXRpb24gPSB0cnVlOworCisgICBpci5wdXNoX3RhaWwodmFyKTsKKworICAgbGlua19pbnZhbGlkYXRlX3ZhcmlhYmxlX2xvY2F0aW9ucygmaXIpOworCisgICBFWFBFQ1RfRVEoVkFSWUlOR19TTE9UX0NPTDAsIHZhci0+ZGF0YS5sb2NhdGlvbik7CisgICBFWFBFQ1RfRVEoMHUsIHZhci0+ZGF0YS5sb2NhdGlvbl9mcmFjKTsKKyAgIEVYUEVDVF9UUlVFKHZhci0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbik7CisgICBFWFBFQ1RfRkFMU0UodmFyLT5kYXRhLmlzX3VubWF0Y2hlZF9nZW5lcmljX2lub3V0KTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvLmdpdGlnbm9yZSBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDdjYjIwCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyoub3V0CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2NyZWF0ZV90ZXN0X2Nhc2VzLnB5IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9jcmVhdGVfdGVzdF9jYXNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc0NjgxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9jcmVhdGVfdGVzdF9jYXNlcy5weQpAQCAtMCwwICsxLDY0MyBAQAorIyBjb2Rpbmc9dXRmLTgKKyMKKyMgQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyMgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisjIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyMgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorIyBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorIyBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworIyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisjIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworaW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicpKSAjIEZvciBhY2Nlc3MgdG8gc2V4cHMucHksIHdoaWNoIGlzIGluIHBhcmVudCBkaXIKK2Zyb20gc2V4cHMgaW1wb3J0ICoKKworZGVmIG1ha2VfdGVzdF9jYXNlKGZfbmFtZSwgcmV0X3R5cGUsIGJvZHkpOgorICAgICIiIkNyZWF0ZSBhIHNpbXBsZSBvcHRpbWl6YXRpb24gdGVzdCBjYXNlIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUKKyAgICBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCByZXR1cm4gdHlwZSwgYW5kIGJvZHkuCisKKyAgICBHbG9iYWwgZGVjbGFyYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIGFueSB1bmRlY2xhcmVkCisgICAgdmFyaWFibGVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIGZ1bmN0aW9uLiAgQWxsIHVuZGVjbGFyZWQKKyAgICB2YXJpYWJsZXMgYXJlIGFzc3VtZWQgdG8gYmUgZmxvYXRzLgorICAgICIiIgorICAgIGNoZWNrX3NleHAoYm9keSkKKyAgICBkZWNsYXJhdGlvbnMgPSB7fQorICAgIGRlZiBtYWtlX2RlY2xhcmF0aW9ucyhzZXhwLCBhbHJlYWR5X2RlY2xhcmVkID0gKCkpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNleHAsIGxpc3QpOgorICAgICAgICAgICAgaWYgbGVuKHNleHApID09IDIgYW5kIHNleHBbMF0gPT0gJ3Zhcl9yZWYnOgorICAgICAgICAgICAgICAgIGlmIHNleHBbMV0gbm90IGluIGFscmVhZHlfZGVjbGFyZWQ6CisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uc1tzZXhwWzFdXSA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWNsYXJlJywgWydpbiddLCAnZmxvYXQnLCBzZXhwWzFdXQorICAgICAgICAgICAgZWxpZiBsZW4oc2V4cCkgPT0gNCBhbmQgc2V4cFswXSA9PSAnYXNzaWduJzoKKyAgICAgICAgICAgICAgICBhc3NlcnQgc2V4cFsyXVswXSA9PSAndmFyX3JlZicKKyAgICAgICAgICAgICAgICBpZiBzZXhwWzJdWzFdIG5vdCBpbiBhbHJlYWR5X2RlY2xhcmVkOgorICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnNbc2V4cFsyXVsxXV0gPSBbCisgICAgICAgICAgICAgICAgICAgICAgICAnZGVjbGFyZScsIFsnb3V0J10sICdmbG9hdCcsIHNleHBbMl1bMV1dCisgICAgICAgICAgICAgICAgbWFrZV9kZWNsYXJhdGlvbnMoc2V4cFszXSwgYWxyZWFkeV9kZWNsYXJlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWxyZWFkeV9kZWNsYXJlZCA9IHNldChhbHJlYWR5X2RlY2xhcmVkKQorICAgICAgICAgICAgICAgIGZvciBzIGluIHNleHA6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocywgbGlzdCkgYW5kIGxlbihzKSA+PSA0IGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1swXSA9PSAnZGVjbGFyZSc6CisgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5X2RlY2xhcmVkLmFkZChzWzNdKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9kZWNsYXJhdGlvbnMocywgYWxyZWFkeV9kZWNsYXJlZCkKKyAgICBtYWtlX2RlY2xhcmF0aW9ucyhib2R5KQorICAgIHJldHVybiBkZWNsYXJhdGlvbnMudmFsdWVzKCkgKyBcCisgICAgICAgIFtbJ2Z1bmN0aW9uJywgZl9uYW1lLCBbJ3NpZ25hdHVyZScsIHJldF90eXBlLCBbJ3BhcmFtZXRlcnMnXSwgYm9keV1dXQorCisKKyMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgZXhwcmVzc2lvbnMuCisKK2RlZiBjb25zdF9mbG9hdCh2YWx1ZSk6CisgICAgIiIiQ3JlYXRlIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCB2YWx1ZS4iIiIKKyAgICByZXR1cm4gWydjb25zdGFudCcsICdmbG9hdCcsIFsnezA6LjZmfScuZm9ybWF0KHZhbHVlKV1dCisKK2RlZiBjb25zdF9ib29sKHZhbHVlKToKKyAgICAiIiJDcmVhdGUgYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJvb2xlYW4gdmFsdWUuCisKKyAgICBJZiB2YWx1ZSBpcyBub3QgYSBib29sZWFuLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLiAgU28sIGZvcgorICAgIGluc3RhbmNlLCBjb25zdF9ib29sKDEpIGlzIGVxdWl2YWxlbnQgdG8gY29uc3RfYm9vbChUcnVlKS4KKyAgICAiIiIKKyAgICByZXR1cm4gWydjb25zdGFudCcsICdib29sJywgWyd7MH0nLmZvcm1hdCgxIGlmIHZhbHVlIGVsc2UgMCldXQorCitkZWYgZ3RfemVybyh2YXJfbmFtZSk6CisgICAgIiIiQ3JlYXRlIENvbnN0cnVjdCB0aGUgZXhwcmVzc2lvbiB2YXJfbmFtZSA+IDAiIiIKKyAgICByZXR1cm4gWydleHByZXNzaW9uJywgJ2Jvb2wnLCAnPicsIFsndmFyX3JlZicsIHZhcl9uYW1lXSwgY29uc3RfZmxvYXQoMCldCisKKworIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBidWlsZCBjb21wbGV4IGNvbnRyb2wgZmxvdworIyBzdGF0ZW1lbnRzLiAgQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gc3RhdGVtZW50IGxpc3RzIChldmVuCisjIHRob3NlIHdoaWNoIG9ubHkgY3JlYXRlIGEgc2luZ2xlIHN0YXRlbWVudCksIHNvIHRoYXQgc3RhdGVtZW50cyBjYW4KKyMgYmUgc2VxdWVuY2VkIHRvZ2V0aGVyIHVzaW5nIHRoZSAnKycgb3BlcmF0b3IuCisKK2RlZiByZXR1cm5fKHZhbHVlID0gTm9uZSk6CisgICAgIiIiQ3JlYXRlIGEgcmV0dXJuIHN0YXRlbWVudC4iIiIKKyAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIFtbJ3JldHVybicsIHZhbHVlXV0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gW1sncmV0dXJuJ11dCisKK2RlZiBicmVha18oKToKKyAgICAiIiJDcmVhdGUgYSBicmVhayBzdGF0ZW1lbnQuIiIiCisgICAgcmV0dXJuIFsnYnJlYWsnXQorCitkZWYgY29udGludWVfKCk6CisgICAgIiIiQ3JlYXRlIGEgY29udGludWUgc3RhdGVtZW50LiIiIgorICAgIHJldHVybiBbJ2NvbnRpbnVlJ10KKworZGVmIHNpbXBsZV9pZih2YXJfbmFtZSwgdGhlbl9zdGF0ZW1lbnRzLCBlbHNlX3N0YXRlbWVudHMgPSBOb25lKToKKyAgICAiIiJDcmVhdGUgYSBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0KKworICAgIGlmICh2YXJfbmFtZSA+IDAuMCkgeworICAgICAgIDx0aGVuX3N0YXRlbWVudHM+CisgICAgfSBlbHNlIHsKKyAgICAgICA8ZWxzZV9zdGF0ZW1lbnRzPgorICAgIH0KKworICAgIGVsc2Vfc3RhdGVtZW50cyBtYXkgYmUgb21pdHRlZC4KKyAgICAiIiIKKyAgICBpZiBlbHNlX3N0YXRlbWVudHMgaXMgTm9uZToKKyAgICAgICAgZWxzZV9zdGF0ZW1lbnRzID0gW10KKyAgICBjaGVja19zZXhwKHRoZW5fc3RhdGVtZW50cykKKyAgICBjaGVja19zZXhwKGVsc2Vfc3RhdGVtZW50cykKKyAgICByZXR1cm4gW1snaWYnLCBndF96ZXJvKHZhcl9uYW1lKSwgdGhlbl9zdGF0ZW1lbnRzLCBlbHNlX3N0YXRlbWVudHNdXQorCitkZWYgbG9vcChzdGF0ZW1lbnRzKToKKyAgICAiIiJDcmVhdGUgYSBsb29wIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHN0YXRlbWVudHMgYXMgaXRzIGxvb3AKKyAgICBib2R5LgorICAgICIiIgorICAgIGNoZWNrX3NleHAoc3RhdGVtZW50cykKKyAgICByZXR1cm4gW1snbG9vcCcsIFtdLCBbXSwgW10sIFtdLCBzdGF0ZW1lbnRzXV0KKworZGVmIGRlY2xhcmVfdGVtcCh2YXJfdHlwZSwgdmFyX25hbWUpOgorICAgICIiIkNyZWF0ZSBhIGRlY2xhcmF0aW9uIG9mIHRoZSBmb3JtCisKKyAgICAoZGVjbGFyZSAodGVtcG9yYXJ5KSA8dmFyX3R5cGU+IDx2YXJfbmFtZSkKKyAgICAiIiIKKyAgICByZXR1cm4gW1snZGVjbGFyZScsIFsndGVtcG9yYXJ5J10sIHZhcl90eXBlLCB2YXJfbmFtZV1dCisKK2RlZiBhc3NpZ25feCh2YXJfbmFtZSwgdmFsdWUpOgorICAgICIiIkNyZWF0ZSBhIHN0YXRlbWVudCB0aGF0IGFzc2lnbnMgPHZhbHVlPiB0byB0aGUgdmFyaWFibGUKKyAgICA8dmFyX25hbWU+LiAgVGhlIGFzc2lnbm1lbnQgdXNlcyB0aGUgbWFzayAoeCkuCisgICAgIiIiCisgICAgY2hlY2tfc2V4cCh2YWx1ZSkKKyAgICByZXR1cm4gW1snYXNzaWduJywgWyd4J10sIFsndmFyX3JlZicsIHZhcl9uYW1lXSwgdmFsdWVdXQorCitkZWYgY29tcGxleF9pZih2YXJfcHJlZml4LCBzdGF0ZW1lbnRzKToKKyAgICAiIiJDcmVhdGUgYSBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0KKworICAgIGlmICg8dmFyX3ByZWZpeD5hID4gMC4wKSB7CisgICAgICAgaWYgKDx2YXJfcHJlZml4PmIgPiAwLjApIHsKKyAgICAgICAgICA8c3RhdGVtZW50cz4KKyAgICAgICB9CisgICAgfQorCisgICAgVGhpcyBpcyB1c2VmdWwgaW4gdGVzdGluZyBqdW1wIGxvd2VyaW5nLCBiZWNhdXNlIGlmIDxzdGF0ZW1lbnRzPgorICAgIGVuZHMgaW4gYSBqdW1wLCBsb3dlcl9qdW1wcy5jcHAgd29uJ3QgdHJ5IHRvIGNvbWJpbmUgdGhpcworICAgIGNvbnN0cnVjdCB3aXRoIHRoZSBjb2RlIHRoYXQgZm9sbG93cyBpdCwgYXMgaXQgbWlnaHQgZG8gZm9yIGEKKyAgICBzaW1wbGUgaWYuCisKKyAgICBBbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGlmIHN0YXRlbWVudCBhcmUgcHJlZml4ZWQgd2l0aAorICAgIHZhcl9wcmVmaXguICBUaGlzIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSB1bmlxdWVuZXNzLgorICAgICIiIgorICAgIGNoZWNrX3NleHAoc3RhdGVtZW50cykKKyAgICByZXR1cm4gc2ltcGxlX2lmKHZhcl9wcmVmaXggKyAnYScsIHNpbXBsZV9pZih2YXJfcHJlZml4ICsgJ2InLCBzdGF0ZW1lbnRzKSkKKworZGVmIGRlY2xhcmVfZXhlY3V0ZV9mbGFnKCk6CisgICAgIiIiQ3JlYXRlIHRoZSBzdGF0ZW1lbnRzIHRoYXQgbG93ZXJfanVtcHMuY3BwIHVzZXMgdG8gZGVjbGFyZSBhbmQKKyAgICBpbml0aWFsaXplIHRoZSB0ZW1wb3JhcnkgYm9vbGVhbiBleGVjdXRlX2ZsYWcuCisgICAgIiIiCisgICAgcmV0dXJuIGRlY2xhcmVfdGVtcCgnYm9vbCcsICdleGVjdXRlX2ZsYWcnKSArIFwKKyAgICAgICAgYXNzaWduX3goJ2V4ZWN1dGVfZmxhZycsIGNvbnN0X2Jvb2woVHJ1ZSkpCisKK2RlZiBkZWNsYXJlX3JldHVybl9mbGFnKCk6CisgICAgIiIiQ3JlYXRlIHRoZSBzdGF0ZW1lbnRzIHRoYXQgbG93ZXJfanVtcHMuY3BwIHVzZXMgdG8gZGVjbGFyZSBhbmQKKyAgICBpbml0aWFsaXplIHRoZSB0ZW1wb3JhcnkgYm9vbGVhbiByZXR1cm5fZmxhZy4KKyAgICAiIiIKKyAgICByZXR1cm4gZGVjbGFyZV90ZW1wKCdib29sJywgJ3JldHVybl9mbGFnJykgKyBcCisgICAgICAgIGFzc2lnbl94KCdyZXR1cm5fZmxhZycsIGNvbnN0X2Jvb2woRmFsc2UpKQorCitkZWYgZGVjbGFyZV9yZXR1cm5fdmFsdWUoKToKKyAgICAiIiJDcmVhdGUgdGhlIHN0YXRlbWVudHMgdGhhdCBsb3dlcl9qdW1wcy5jcHAgdXNlcyB0byBkZWNsYXJlIGFuZAorICAgIGluaXRpYWxpemUgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSByZXR1cm5fdmFsdWUuICBBc3N1bWUgdGhhdAorICAgIHJldHVybl92YWx1ZSBpcyBhIGZsb2F0LgorICAgICIiIgorICAgIHJldHVybiBkZWNsYXJlX3RlbXAoJ2Zsb2F0JywgJ3JldHVybl92YWx1ZScpCisKK2RlZiBkZWNsYXJlX2JyZWFrX2ZsYWcoKToKKyAgICAiIiJDcmVhdGUgdGhlIHN0YXRlbWVudHMgdGhhdCBsb3dlcl9qdW1wcy5jcHAgdXNlcyB0byBkZWNsYXJlIGFuZAorICAgIGluaXRpYWxpemUgdGhlIHRlbXBvcmFyeSBib29sZWFuIGJyZWFrX2ZsYWcuCisgICAgIiIiCisgICAgcmV0dXJuIGRlY2xhcmVfdGVtcCgnYm9vbCcsICdicmVha19mbGFnJykgKyBcCisgICAgICAgIGFzc2lnbl94KCdicmVha19mbGFnJywgY29uc3RfYm9vbChGYWxzZSkpCisKK2RlZiBsb3dlcmVkX3JldHVybl9zaW1wbGUodmFsdWUgPSBOb25lKToKKyAgICAiIiJDcmVhdGUgdGhlIHN0YXRlbWVudHMgdGhhdCBsb3dlcl9qdW1wcy5jcHAgbG93ZXJzIGEgcmV0dXJuCisgICAgc3RhdGVtZW50IHRvLCBpbiBzaXR1YXRpb25zIHdoZXJlIGl0IGRvZXMgbm90IG5lZWQgdG8gY2xlYXIgdGhlCisgICAgZXhlY3V0ZSBmbGFnLgorICAgICIiIgorICAgIGlmIHZhbHVlOgorICAgICAgICByZXN1bHQgPSBhc3NpZ25feCgncmV0dXJuX3ZhbHVlJywgdmFsdWUpCisgICAgZWxzZToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICByZXR1cm4gcmVzdWx0ICsgYXNzaWduX3goJ3JldHVybl9mbGFnJywgY29uc3RfYm9vbChUcnVlKSkKKworZGVmIGxvd2VyZWRfcmV0dXJuKHZhbHVlID0gTm9uZSk6CisgICAgIiIiQ3JlYXRlIHRoZSBzdGF0ZW1lbnRzIHRoYXQgbG93ZXJfanVtcHMuY3BwIGxvd2VycyBhIHJldHVybgorICAgIHN0YXRlbWVudCB0bywgaW4gc2l0dWF0aW9ucyB3aGVyZSBpdCBuZWVkcyB0byBjbGVhciB0aGUgZXhlY3V0ZQorICAgIGZsYWcuCisgICAgIiIiCisgICAgcmV0dXJuIGxvd2VyZWRfcmV0dXJuX3NpbXBsZSh2YWx1ZSkgKyBcCisgICAgICAgIGFzc2lnbl94KCdleGVjdXRlX2ZsYWcnLCBjb25zdF9ib29sKEZhbHNlKSkKKworZGVmIGxvd2VyZWRfY29udGludWUoKToKKyAgICAiIiJDcmVhdGUgdGhlIHN0YXRlbWVudCB0aGF0IGxvd2VyX2p1bXBzLmNwcCBsb3dlcnMgYSBjb250aW51ZQorICAgIHN0YXRlbWVudCB0by4KKyAgICAiIiIKKyAgICByZXR1cm4gYXNzaWduX3goJ2V4ZWN1dGVfZmxhZycsIGNvbnN0X2Jvb2woRmFsc2UpKQorCitkZWYgbG93ZXJlZF9icmVha19zaW1wbGUoKToKKyAgICAiIiJDcmVhdGUgdGhlIHN0YXRlbWVudCB0aGF0IGxvd2VyX2p1bXBzLmNwcCBsb3dlcnMgYSBicmVhaworICAgIHN0YXRlbWVudCB0bywgaW4gc2l0dWF0aW9ucyB3aGVyZSBpdCBkb2VzIG5vdCBuZWVkIHRvIGNsZWFyIHRoZQorICAgIGV4ZWN1dGUgZmxhZy4KKyAgICAiIiIKKyAgICByZXR1cm4gYXNzaWduX3goJ2JyZWFrX2ZsYWcnLCBjb25zdF9ib29sKFRydWUpKQorCitkZWYgbG93ZXJlZF9icmVhaygpOgorICAgICIiIkNyZWF0ZSB0aGUgc3RhdGVtZW50IHRoYXQgbG93ZXJfanVtcHMuY3BwIGxvd2VycyBhIGJyZWFrCisgICAgc3RhdGVtZW50IHRvLCBpbiBzaXR1YXRpb25zIHdoZXJlIGl0IG5lZWRzIHRvIGNsZWFyIHRoZSBleGVjdXRlCisgICAgZmxhZy4KKyAgICAiIiIKKyAgICByZXR1cm4gbG93ZXJlZF9icmVha19zaW1wbGUoKSArIGFzc2lnbl94KCdleGVjdXRlX2ZsYWcnLCBjb25zdF9ib29sKEZhbHNlKSkKKworZGVmIGlmX2V4ZWN1dGVfZmxhZyhzdGF0ZW1lbnRzKToKKyAgICAiIiJXcmFwIHN0YXRlbWVudHMgaW4gYW4gaWYgdGVzdCBzbyB0aGF0IHRoZXkgd2lsbCBvbmx5IGV4ZWN1dGUgaWYKKyAgICBleGVjdXRlX2ZsYWcgaXMgVHJ1ZS4KKyAgICAiIiIKKyAgICBjaGVja19zZXhwKHN0YXRlbWVudHMpCisgICAgcmV0dXJuIFtbJ2lmJywgWyd2YXJfcmVmJywgJ2V4ZWN1dGVfZmxhZyddLCBzdGF0ZW1lbnRzLCBbXV1dCisKK2RlZiBpZl9ub3RfcmV0dXJuX2ZsYWcoc3RhdGVtZW50cyk6CisgICAgIiIiV3JhcCBzdGF0ZW1lbnRzIGluIGFuIGlmIHRlc3Qgc28gdGhhdCB0aGV5IHdpbGwgb25seSBleGVjdXRlIGlmCisgICAgcmV0dXJuX2ZsYWcgaXMgRmFsc2UuCisgICAgIiIiCisgICAgY2hlY2tfc2V4cChzdGF0ZW1lbnRzKQorICAgIHJldHVybiBbWydpZicsIFsndmFyX3JlZicsICdyZXR1cm5fZmxhZyddLCBbXSwgc3RhdGVtZW50c11dCisKK2RlZiBmaW5hbF9yZXR1cm4oKToKKyAgICAiIiJDcmVhdGUgdGhlIHJldHVybiBzdGF0ZW1lbnQgdGhhdCBsb3dlcl9qdW1wcy5jcHAgcGxhY2VzIGF0IHRoZQorICAgIGVuZCBvZiBhIGZ1bmN0aW9uIHdoZW4gbG93ZXJpbmcgcmV0dXJucy4KKyAgICAiIiIKKyAgICByZXR1cm4gW1sncmV0dXJuJywgWyd2YXJfcmVmJywgJ3JldHVybl92YWx1ZSddXV0KKworZGVmIGZpbmFsX2JyZWFrKCk6CisgICAgIiIiQ3JlYXRlIHRoZSBjb25kaXRpb25hbCBicmVhayBzdGF0ZW1lbnQgdGhhdCBsb3dlcl9qdW1wcy5jcHAKKyAgICBwbGFjZXMgYXQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHdoZW4gbG93ZXJpbmcgYnJlYWtzLgorICAgICIiIgorICAgIHJldHVybiBbWydpZicsIFsndmFyX3JlZicsICdicmVha19mbGFnJ10sIGJyZWFrXygpLCBbXV1dCisKK2RlZiBiYXNoX3F1b3RlKCphcmdzKToKKyAgICAiIiJRdW90ZSB0aGUgYXJndW1lbnRzIGFwcHJvcHJpYXRlbHkgc28gdGhhdCBiYXNoIHdpbGwgdW5kZXJzdGFuZAorICAgIGVhY2ggYXJndW1lbnQgYXMgYSBzaW5nbGUgd29yZC4KKyAgICAiIiIKKyAgICBkZWYgcXVvdGVfd29yZCh3b3JkKToKKyAgICAgICAgZm9yIGMgaW4gd29yZDoKKyAgICAgICAgICAgIGlmIG5vdCAoYy5pc2FscGhhKCkgb3IgYy5pc2RpZ2l0KCkgb3IgYyBpbiAnQCVfLSs9OiwuLycpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgd29yZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIicnIgorICAgICAgICAgICAgcmV0dXJuIHdvcmQKKyAgICAgICAgcmV0dXJuICInezB9JyIuZm9ybWF0KHdvcmQucmVwbGFjZSgiJyIsICInXCInXCInIikpCisgICAgcmV0dXJuICcgJy5qb2luKHF1b3RlX3dvcmQod29yZCkgZm9yIHdvcmQgaW4gYXJncykKKworZGVmIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgZXhwZWN0ZWRfc2V4cCwgdGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgcHVsbF9vdXRfanVtcHM9RmFsc2UsIGxvd2VyX3N1Yl9yZXR1cm49RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBsb3dlcl9tYWluX3JldHVybj1GYWxzZSwgbG93ZXJfY29udGludWU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBsb3dlcl9icmVhaz1GYWxzZSk6CisgICAgIiIiQ3JlYXRlIGEgdGVzdCBjYXNlIHRoYXQgdmVyaWZpZXMgdGhhdCBkb19sb3dlcl9qdW1wcyB0cmFuc2Zvcm1zCisgICAgdGhlIGdpdmVuIGNvZGUgaW4gdGhlIGV4cGVjdGVkIHdheS4KKyAgICAiIiIKKyAgICBkb2NfbGluZXMgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGRvY19zdHJpbmcuc3BsaXRsaW5lcygpXQorICAgIGRvY19zdHJpbmcgPSAnJy5qb2luKCcjIHswfVxuJy5mb3JtYXQobGluZSkgZm9yIGxpbmUgaW4gZG9jX2xpbmVzIGlmIGxpbmUgIT0gJycpCisgICAgY2hlY2tfc2V4cChpbnB1dF9zZXhwKQorICAgIGNoZWNrX3NleHAoZXhwZWN0ZWRfc2V4cCkKKyAgICBpbnB1dF9zdHIgPSBzZXhwX3RvX3N0cmluZyhzb3J0X2RlY2xzKGlucHV0X3NleHApKQorICAgIGV4cGVjdGVkX291dHB1dCA9IHNleHBfdG9fc3RyaW5nKHNvcnRfZGVjbHMoZXhwZWN0ZWRfc2V4cCkpCisKKyAgICBvcHRpbWl6YXRpb24gPSAoCisgICAgICAgICdkb19sb3dlcl9qdW1wcyh7MDpkfSwgezE6ZH0sIHsyOmR9LCB7MzpkfSwgezQ6ZH0pJy5mb3JtYXQoCisgICAgICAgICAgICBwdWxsX291dF9qdW1wcywgbG93ZXJfc3ViX3JldHVybiwgbG93ZXJfbWFpbl9yZXR1cm4sCisgICAgICAgICAgICBsb3dlcl9jb250aW51ZSwgbG93ZXJfYnJlYWspKQorICAgIGFyZ3MgPSBbJy4uLy4uL2dsc2xfdGVzdCcsICdvcHRwYXNzJywgJy0tcXVpZXQnLCAnLS1pbnB1dC1pcicsIG9wdGltaXphdGlvbl0KKyAgICB0ZXN0X2ZpbGUgPSAnezB9Lm9wdF90ZXN0Jy5mb3JtYXQodGVzdF9uYW1lKQorICAgIHdpdGggb3Blbih0ZXN0X2ZpbGUsICd3JykgYXMgZjoKKyAgICAgICAgZi53cml0ZSgnIyEvdXNyL2Jpbi9lbnYgYmFzaFxuI1xuIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS5cbiNcbicpCisgICAgICAgIGYud3JpdGUoZG9jX3N0cmluZykKKyAgICAgICAgZi53cml0ZSgnezB9IDw8RU9GXG4nLmZvcm1hdChiYXNoX3F1b3RlKCphcmdzKSkpCisgICAgICAgIGYud3JpdGUoJ3swfVxuRU9GXG4nLmZvcm1hdChpbnB1dF9zdHIpKQorICAgIG9zLmNobW9kKHRlc3RfZmlsZSwgMDc3NCkKKyAgICBleHBlY3RlZF9maWxlID0gJ3swfS5vcHRfdGVzdC5leHBlY3RlZCcuZm9ybWF0KHRlc3RfbmFtZSkKKyAgICB3aXRoIG9wZW4oZXhwZWN0ZWRfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgICBmLndyaXRlKCd7MH1cbicuZm9ybWF0KGV4cGVjdGVkX291dHB1dCkpCisKK2RlZiB0ZXN0X2xvd2VyX3JldHVybnNfbWFpbigpOgorICAgIGRvY19zdHJpbmcgPSAiIiJUZXN0IHRoYXQgZG9fbG93ZXJfanVtcHMgcmVzcGVjdHMgdGhlIGxvd2VyX21haW5fcmV0dXJuCisgICAgZmxhZyBpbiBkZWNpZGluZyB3aGV0aGVyIHRvIGxvd2VyIHJldHVybnMgaW4gdGhlIG1haW4KKyAgICBmdW5jdGlvbi4KKyAgICAiIiIKKyAgICBpbnB1dF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGNvbXBsZXhfaWYoJycsIHJldHVybl8oKSkKKyAgICAgICAgICAgICkpCisgICAgZXhwZWN0ZWRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBkZWNsYXJlX2V4ZWN1dGVfZmxhZygpICsKKyAgICAgICAgICAgIGRlY2xhcmVfcmV0dXJuX2ZsYWcoKSArCisgICAgICAgICAgICBjb21wbGV4X2lmKCcnLCBsb3dlcmVkX3JldHVybigpKQorICAgICAgICAgICAgKSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdsb3dlcl9yZXR1cm5zX21haW5fdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICBsb3dlcl9tYWluX3JldHVybj1UcnVlKQorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgaW5wdXRfc2V4cCwgJ2xvd2VyX3JldHVybnNfbWFpbl9mYWxzZScsCisgICAgICAgICAgICAgICAgICAgICBsb3dlcl9tYWluX3JldHVybj1GYWxzZSkKKworZGVmIHRlc3RfbG93ZXJfcmV0dXJuc19zdWIoKToKKyAgICBkb2Nfc3RyaW5nID0gIiIiVGVzdCB0aGF0IGRvX2xvd2VyX2p1bXBzIHJlc3BlY3RzIHRoZSBsb3dlcl9zdWJfcmV0dXJuIGZsYWcKKyAgICBpbiBkZWNpZGluZyB3aGV0aGVyIHRvIGxvd2VyIHJldHVybnMgaW4gc3Vicm91dGluZXMuCisgICAgIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdzdWInLCAndm9pZCcsICgKKyAgICAgICAgICAgIGNvbXBsZXhfaWYoJycsIHJldHVybl8oKSkKKyAgICAgICAgICAgICkpCisgICAgZXhwZWN0ZWRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdzdWInLCAndm9pZCcsICgKKyAgICAgICAgICAgIGRlY2xhcmVfZXhlY3V0ZV9mbGFnKCkgKworICAgICAgICAgICAgZGVjbGFyZV9yZXR1cm5fZmxhZygpICsKKyAgICAgICAgICAgIGNvbXBsZXhfaWYoJycsIGxvd2VyZWRfcmV0dXJuKCkpCisgICAgICAgICAgICApKQorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgZXhwZWN0ZWRfc2V4cCwgJ2xvd2VyX3JldHVybnNfc3ViX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgbG93ZXJfc3ViX3JldHVybj1UcnVlKQorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgaW5wdXRfc2V4cCwgJ2xvd2VyX3JldHVybnNfc3ViX2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgIGxvd2VyX3N1Yl9yZXR1cm49RmFsc2UpCisKK2RlZiB0ZXN0X2xvd2VyX3JldHVybnNfMSgpOgorICAgIGRvY19zdHJpbmcgPSAiIiJUZXN0IHRoYXQgYSB2b2lkIHJldHVybiBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gaXMKKyAgICBlbGltaW5hdGVkLgorICAgICIiIgorICAgIGlucHV0X3NleHAgPSBtYWtlX3Rlc3RfY2FzZSgnbWFpbicsICd2b2lkJywgKAorICAgICAgICAgICAgYXNzaWduX3goJ2EnLCBjb25zdF9mbG9hdCgxKSkgKworICAgICAgICAgICAgcmV0dXJuXygpCisgICAgICAgICAgICApKQorICAgIGV4cGVjdGVkX3NleHAgPSBtYWtlX3Rlc3RfY2FzZSgnbWFpbicsICd2b2lkJywgKAorICAgICAgICAgICAgYXNzaWduX3goJ2EnLCBjb25zdF9mbG9hdCgxKSkKKyAgICAgICAgICAgICkpCisgICAgY3JlYXRlX3Rlc3RfY2FzZShkb2Nfc3RyaW5nLCBpbnB1dF9zZXhwLCBleHBlY3RlZF9zZXhwLCAnbG93ZXJfcmV0dXJuc18xJywKKyAgICAgICAgICAgICAgICAgICAgIGxvd2VyX21haW5fcmV0dXJuPVRydWUpCisKK2RlZiB0ZXN0X2xvd2VyX3JldHVybnNfMigpOgorICAgIGRvY19zdHJpbmcgPSAiIiJUZXN0IHRoYXQgbG93ZXJpbmcgaXMgbm90IHBlcmZvcm1lZCBvbiBhIG5vbi12b2lkIHJldHVybiBhdAorICAgIHRoZSBlbmQgb2Ygc3Vicm91dGluZS4KKyAgICAiIiIKKyAgICBpbnB1dF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ3N1YicsICdmbG9hdCcsICgKKyAgICAgICAgICAgIGFzc2lnbl94KCdhJywgY29uc3RfZmxvYXQoMSkpICsKKyAgICAgICAgICAgIHJldHVybl8oY29uc3RfZmxvYXQoMSkpCisgICAgICAgICAgICApKQorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgaW5wdXRfc2V4cCwgJ2xvd2VyX3JldHVybnNfMicsCisgICAgICAgICAgICAgICAgICAgICBsb3dlcl9zdWJfcmV0dXJuPVRydWUpCisKK2RlZiB0ZXN0X2xvd2VyX3JldHVybnNfMygpOgorICAgIGRvY19zdHJpbmcgPSAiIiJUZXN0IGxvd2VyaW5nIG9mIHJldHVybnMgd2hlbiB0aGVyZSBpcyBvbmUgbmVzdGVkIGluc2lkZSBhCisgICAgY29tcGxleCBzdHJ1Y3R1cmUgb2YgaWZzLCBhbmQgb25lIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KKworICAgIEluIHRoaXMgY2FzZSwgdGhlIGxhdHRlciByZXR1cm4gbmVlZHMgdG8gYmUgbG93ZXJlZCBiZWNhdXNlIGl0CisgICAgd2lsbCBub3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gb25jZSB0aGUgZmluYWwgcmV0dXJuCisgICAgaXMgaW5zZXJ0ZWQuCisgICAgIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdzdWInLCAnZmxvYXQnLCAoCisgICAgICAgICAgICBjb21wbGV4X2lmKCcnLCByZXR1cm5fKGNvbnN0X2Zsb2F0KDEpKSkgKworICAgICAgICAgICAgcmV0dXJuXyhjb25zdF9mbG9hdCgyKSkKKyAgICAgICAgICAgICkpCisgICAgZXhwZWN0ZWRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdzdWInLCAnZmxvYXQnLCAoCisgICAgICAgICAgICBkZWNsYXJlX2V4ZWN1dGVfZmxhZygpICsKKyAgICAgICAgICAgIGRlY2xhcmVfcmV0dXJuX3ZhbHVlKCkgKworICAgICAgICAgICAgZGVjbGFyZV9yZXR1cm5fZmxhZygpICsKKyAgICAgICAgICAgIGNvbXBsZXhfaWYoJycsIGxvd2VyZWRfcmV0dXJuKGNvbnN0X2Zsb2F0KDEpKSkgKworICAgICAgICAgICAgaWZfZXhlY3V0ZV9mbGFnKGxvd2VyZWRfcmV0dXJuKGNvbnN0X2Zsb2F0KDIpKSkgKworICAgICAgICAgICAgZmluYWxfcmV0dXJuKCkKKyAgICAgICAgICAgICkpCisgICAgY3JlYXRlX3Rlc3RfY2FzZShkb2Nfc3RyaW5nLCBpbnB1dF9zZXhwLCBleHBlY3RlZF9zZXhwLCAnbG93ZXJfcmV0dXJuc18zJywKKyAgICAgICAgICAgICAgICAgICAgIGxvd2VyX3N1Yl9yZXR1cm49VHJ1ZSkKKworZGVmIHRlc3RfbG93ZXJfcmV0dXJuc180KCk6CisgICAgZG9jX3N0cmluZyA9ICIiIlRlc3QgdGhhdCByZXR1cm5zIGFyZSBwcm9wZXJseSBsb3dlcmVkIHdoZW4gdGhleSBvY2N1ciBpbgorICAgIGJvdGggYnJhbmNoZXMgb2YgYW4gaWYtc3RhdGVtZW50LgorICAgICIiIgorICAgIGlucHV0X3NleHAgPSBtYWtlX3Rlc3RfY2FzZSgnc3ViJywgJ2Zsb2F0JywgKAorICAgICAgICAgICAgc2ltcGxlX2lmKCdhJywgcmV0dXJuXyhjb25zdF9mbG9hdCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXyhjb25zdF9mbG9hdCgyKSkpCisgICAgICAgICAgICApKQorICAgIGV4cGVjdGVkX3NleHAgPSBtYWtlX3Rlc3RfY2FzZSgnc3ViJywgJ2Zsb2F0JywgKAorICAgICAgICAgICAgZGVjbGFyZV9leGVjdXRlX2ZsYWcoKSArCisgICAgICAgICAgICBkZWNsYXJlX3JldHVybl92YWx1ZSgpICsKKyAgICAgICAgICAgIGRlY2xhcmVfcmV0dXJuX2ZsYWcoKSArCisgICAgICAgICAgICBzaW1wbGVfaWYoJ2EnLCBsb3dlcmVkX3JldHVybihjb25zdF9mbG9hdCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgbG93ZXJlZF9yZXR1cm4oY29uc3RfZmxvYXQoMikpKSArCisgICAgICAgICAgICBmaW5hbF9yZXR1cm4oKQorICAgICAgICAgICAgKSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdsb3dlcl9yZXR1cm5zXzQnLAorICAgICAgICAgICAgICAgICAgICAgbG93ZXJfc3ViX3JldHVybj1UcnVlKQorCitkZWYgdGVzdF9sb3dlcl91bmlmaWVkX3JldHVybnMoKToKKyAgICBkb2Nfc3RyaW5nID0gIiIiSWYgYm90aCBicmFuY2hlcyBvZiBhbiBpZiBzdGF0ZW1lbnQgZW5kIGluIGEgcmV0dXJuLCBhbmQKKyAgICBwdWxsX291dF9qdW1wcyBpcyBUcnVlLCB0aGVuIHRob3NlIHJldHVybnMgc2hvdWxkIGJlIGxpZnRlZAorICAgIG91dHNpZGUgdGhlIGlmIGFuZCB0aGVuIHByb3Blcmx5IGxvd2VyZWQuCisKKyAgICBWZXJpZnkgdGhhdCB0aGlzIGxvd2VyaW5nIG9jY3VycyBkdXJpbmcgdGhlIHNhbWUgcGFzcyBhcyB0aGUKKyAgICBsb3dlcmluZyBvZiBvdGhlciByZXR1cm5zIGJ5IGNoZWNraW5nIHRoYXQgZXh0cmEgdGVtcG9yYXJ5CisgICAgdmFyaWFibGVzIGFyZW4ndCBnZW5lcmF0ZWQuCisgICAgIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBjb21wbGV4X2lmKCdhJywgcmV0dXJuXygpKSArCisgICAgICAgICAgICBzaW1wbGVfaWYoJ2InLCBzaW1wbGVfaWYoJ2MnLCByZXR1cm5fKCksIHJldHVybl8oKSkpCisgICAgICAgICAgICApKQorICAgIGV4cGVjdGVkX3NleHAgPSBtYWtlX3Rlc3RfY2FzZSgnbWFpbicsICd2b2lkJywgKAorICAgICAgICAgICAgZGVjbGFyZV9leGVjdXRlX2ZsYWcoKSArCisgICAgICAgICAgICBkZWNsYXJlX3JldHVybl9mbGFnKCkgKworICAgICAgICAgICAgY29tcGxleF9pZignYScsIGxvd2VyZWRfcmV0dXJuKCkpICsKKyAgICAgICAgICAgIGlmX2V4ZWN1dGVfZmxhZyhzaW1wbGVfaWYoJ2InLCAoc2ltcGxlX2lmKCdjJywgW10sIFtdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyZWRfcmV0dXJuKCkpKSkKKyAgICAgICAgICAgICkpCisgICAgY3JlYXRlX3Rlc3RfY2FzZShkb2Nfc3RyaW5nLCBpbnB1dF9zZXhwLCBleHBlY3RlZF9zZXhwLCAnbG93ZXJfdW5pZmllZF9yZXR1cm5zJywKKyAgICAgICAgICAgICAgICAgICAgIGxvd2VyX21haW5fcmV0dXJuPVRydWUsIHB1bGxfb3V0X2p1bXBzPVRydWUpCisKK2RlZiB0ZXN0X2xvd2VyX3B1bGxlZF9vdXRfanVtcCgpOgorICAgIGRvY19zdHJpbmcgPSAiIiJJZiBvbmUgYnJhbmNoIG9mIGFuIGlmIGVuZHMgaW4gYSBqdW1wLCBhbmQgY29udHJvbCBjYW5ub3QKKyAgICBmYWxsIG91dCB0aGUgYm90dG9tIG9mIHRoZSBvdGhlciBicmFuY2gsIGFuZCBwdWxsX291dF9qdW1wcyBpcworICAgIFRydWUsIHRoZW4gdGhlIGp1bXAgaXMgbGlmdGVkIG91dHNpZGUgdGhlIGlmLgorCisgICAgVmVyaWZ5IHRoYXQgdGhpcyBsb3dlcmluZyBvY2N1cnMgZHVyaW5nIHRoZSBzYW1lIHBhc3MgYXMgdGhlCisgICAgbG93ZXJpbmcgb2Ygb3RoZXIganVtcHMgYnkgY2hlY2tpbmcgdGhhdCBleHRyYSB0ZW1wb3JhcnkKKyAgICB2YXJpYWJsZXMgYXJlbid0IGdlbmVyYXRlZC4KKyAgICAiIiIKKyAgICBpbnB1dF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGNvbXBsZXhfaWYoJ2EnLCByZXR1cm5fKCkpICsKKyAgICAgICAgICAgIGxvb3Aoc2ltcGxlX2lmKCdiJywgc2ltcGxlX2lmKCdjJywgYnJlYWtfKCksIGNvbnRpbnVlXygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl8oKSkpICsKKyAgICAgICAgICAgIGFzc2lnbl94KCdkJywgY29uc3RfZmxvYXQoMSkpCisgICAgICAgICAgICApKQorICAgICMgTm90ZTogb3B0aW1pemF0aW9uIHByb2R1Y2VzIHR3byBvdGhlciBlZmZlY3RzOiB0aGUgYnJlYWsKKyAgICAjIGdldHMgbGlmdGVkIG91dCBvZiB0aGUgaWYgc3RhdGVtZW50cywgYW5kIHRoZSBjb2RlIGFmdGVyIHRoZQorICAgICMgbG9vcCBnZXRzIGd1YXJkZWQgc28gdGhhdCBpdCBvbmx5IGV4ZWN1dGVzIGlmIHRoZSByZXR1cm4KKyAgICAjIGZsYWcgaXMgY2xlYXIuCisgICAgZXhwZWN0ZWRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBkZWNsYXJlX2V4ZWN1dGVfZmxhZygpICsKKyAgICAgICAgICAgIGRlY2xhcmVfcmV0dXJuX2ZsYWcoKSArCisgICAgICAgICAgICBjb21wbGV4X2lmKCdhJywgbG93ZXJlZF9yZXR1cm4oKSkgKworICAgICAgICAgICAgaWZfZXhlY3V0ZV9mbGFnKAorICAgICAgICAgICAgICAgIGxvb3Aoc2ltcGxlX2lmKCdiJywgc2ltcGxlX2lmKCdjJywgW10sIGNvbnRpbnVlXygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmVkX3JldHVybl9zaW1wbGUoKSkgKworICAgICAgICAgICAgICAgICAgICAgYnJlYWtfKCkpICsKKyAgICAgICAgICAgICAgICBpZl9ub3RfcmV0dXJuX2ZsYWcoYXNzaWduX3goJ2QnLCBjb25zdF9mbG9hdCgxKSkpKQorICAgICAgICAgICAgKSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdsb3dlcl9wdWxsZWRfb3V0X2p1bXAnLAorICAgICAgICAgICAgICAgICAgICAgbG93ZXJfbWFpbl9yZXR1cm49VHJ1ZSwgcHVsbF9vdXRfanVtcHM9VHJ1ZSkKKworZGVmIHRlc3RfbG93ZXJfYnJlYWtzXzEoKToKKyAgICBkb2Nfc3RyaW5nID0gIiIiSWYgYSBsb29wIGNvbnRhaW5zIGFuIHVuY29uZGl0aW9uYWwgYnJlYWsgYXQgdGhlIGJvdHRvbSBvZgorICAgIGl0LCBpdCBzaG91bGQgbm90IGJlIGxvd2VyZWQuIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBsb29wKGFzc2lnbl94KCdhJywgY29uc3RfZmxvYXQoMSkpICsKKyAgICAgICAgICAgICAgICAgYnJlYWtfKCkpCisgICAgICAgICAgICApKQorICAgIGV4cGVjdGVkX3NleHAgPSBpbnB1dF9zZXhwCisgICAgY3JlYXRlX3Rlc3RfY2FzZShkb2Nfc3RyaW5nLCBpbnB1dF9zZXhwLCBleHBlY3RlZF9zZXhwLCAnbG93ZXJfYnJlYWtzXzEnLCBsb3dlcl9icmVhaz1UcnVlKQorCitkZWYgdGVzdF9sb3dlcl9icmVha3NfMigpOgorICAgIGRvY19zdHJpbmcgPSAiIiJJZiBhIGxvb3AgY29udGFpbnMgYSBjb25kaXRpb25hbCBicmVhayBhdCB0aGUgYm90dG9tIG9mIGl0LAorICAgIGl0IHNob3VsZCBub3QgYmUgbG93ZXJlZCBpZiBpdCBpcyBpbiB0aGUgdGhlbi1jbGF1c2UuCisgICAgIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBsb29wKGFzc2lnbl94KCdhJywgY29uc3RfZmxvYXQoMSkpICsKKyAgICAgICAgICAgICAgICAgc2ltcGxlX2lmKCdiJywgYnJlYWtfKCkpKQorICAgICAgICAgICAgKSkKKyAgICBleHBlY3RlZF9zZXhwID0gaW5wdXRfc2V4cAorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgZXhwZWN0ZWRfc2V4cCwgJ2xvd2VyX2JyZWFrc18yJywgbG93ZXJfYnJlYWs9VHJ1ZSkKKworZGVmIHRlc3RfbG93ZXJfYnJlYWtzXzMoKToKKyAgICBkb2Nfc3RyaW5nID0gIiIiSWYgYSBsb29wIGNvbnRhaW5zIGEgY29uZGl0aW9uYWwgYnJlYWsgYXQgdGhlIGJvdHRvbSBvZiBpdCwKKyAgICBpdCBzaG91bGQgbm90IGJlIGxvd2VyZWQgaWYgaXQgaXMgaW4gdGhlIHRoZW4tY2xhdXNlLCBldmVuIGlmCisgICAgdGhlcmUgYXJlIHN0YXRlbWVudHMgcHJlY2VkaW5nIHRoZSBicmVhay4KKyAgICAiIiIKKyAgICBpbnB1dF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGxvb3AoYXNzaWduX3goJ2EnLCBjb25zdF9mbG9hdCgxKSkgKworICAgICAgICAgICAgICAgICBzaW1wbGVfaWYoJ2InLCAoYXNzaWduX3goJ2MnLCBjb25zdF9mbG9hdCgxKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtfKCkpKSkKKyAgICAgICAgICAgICkpCisgICAgZXhwZWN0ZWRfc2V4cCA9IGlucHV0X3NleHAKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdsb3dlcl9icmVha3NfMycsIGxvd2VyX2JyZWFrPVRydWUpCisKK2RlZiB0ZXN0X2xvd2VyX2JyZWFrc180KCk6CisgICAgZG9jX3N0cmluZyA9ICIiIklmIGEgbG9vcCBjb250YWlucyBhIGNvbmRpdGlvbmFsIGJyZWFrIGF0IHRoZSBib3R0b20gb2YgaXQsCisgICAgaXQgc2hvdWxkIG5vdCBiZSBsb3dlcmVkIGlmIGl0IGlzIGluIHRoZSBlbHNlLWNsYXVzZS4KKyAgICAiIiIKKyAgICBpbnB1dF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGxvb3AoYXNzaWduX3goJ2EnLCBjb25zdF9mbG9hdCgxKSkgKworICAgICAgICAgICAgICAgICBzaW1wbGVfaWYoJ2InLCBbXSwgYnJlYWtfKCkpKQorICAgICAgICAgICAgKSkKKyAgICBleHBlY3RlZF9zZXhwID0gaW5wdXRfc2V4cAorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgZXhwZWN0ZWRfc2V4cCwgJ2xvd2VyX2JyZWFrc180JywgbG93ZXJfYnJlYWs9VHJ1ZSkKKworZGVmIHRlc3RfbG93ZXJfYnJlYWtzXzUoKToKKyAgICBkb2Nfc3RyaW5nID0gIiIiSWYgYSBsb29wIGNvbnRhaW5zIGEgY29uZGl0aW9uYWwgYnJlYWsgYXQgdGhlIGJvdHRvbSBvZiBpdCwKKyAgICBpdCBzaG91bGQgbm90IGJlIGxvd2VyZWQgaWYgaXQgaXMgaW4gdGhlIGVsc2UtY2xhdXNlLCBldmVuIGlmCisgICAgdGhlcmUgYXJlIHN0YXRlbWVudHMgcHJlY2VkaW5nIHRoZSBicmVhay4KKyAgICAiIiIKKyAgICBpbnB1dF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGxvb3AoYXNzaWduX3goJ2EnLCBjb25zdF9mbG9hdCgxKSkgKworICAgICAgICAgICAgICAgICBzaW1wbGVfaWYoJ2InLCBbXSwgKGFzc2lnbl94KCdjJywgY29uc3RfZmxvYXQoMSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha18oKSkpKQorICAgICAgICAgICAgKSkKKyAgICBleHBlY3RlZF9zZXhwID0gaW5wdXRfc2V4cAorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgZXhwZWN0ZWRfc2V4cCwgJ2xvd2VyX2JyZWFrc181JywgbG93ZXJfYnJlYWs9VHJ1ZSkKKworZGVmIHRlc3RfbG93ZXJfYnJlYWtzXzYoKToKKyAgICBkb2Nfc3RyaW5nID0gIiIiSWYgYSBsb29wIGNvbnRhaW5zIGNvbmRpdGlvbmFsIGJyZWFrcyBhbmQgY29udGludWVzLCBhbmQKKyAgICBlbmRzIGluIGFuIHVuY29uZGl0aW9uYWwgYnJlYWssIHRoZW4gdGhlIHVuY29uZGl0aW9uYWwgYnJlYWsKKyAgICBuZWVkcyB0byBiZSBsb3dlcmVkLCBiZWNhdXNlIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIGF0IHRoZSBlbmQKKyAgICBvZiB0aGUgbG9vcCBhZnRlciB0aGUgZmluYWwgYnJlYWsgaXMgYWRkZWQuCisgICAgIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBsb29wKHNpbXBsZV9pZignYScsIChjb21wbGV4X2lmKCdiJywgY29udGludWVfKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhfaWYoJ2MnLCBicmVha18oKSkpKSArCisgICAgICAgICAgICAgICAgIGJyZWFrXygpKQorICAgICAgICAgICAgKSkKKyAgICBleHBlY3RlZF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGRlY2xhcmVfYnJlYWtfZmxhZygpICsKKyAgICAgICAgICAgIGxvb3AoZGVjbGFyZV9leGVjdXRlX2ZsYWcoKSArCisgICAgICAgICAgICAgICAgIHNpbXBsZV9pZigKKyAgICAgICAgICAgICAgICAgICAgJ2EnLAorICAgICAgICAgICAgICAgICAgICAoY29tcGxleF9pZignYicsIGxvd2VyZWRfY29udGludWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgaWZfZXhlY3V0ZV9mbGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhfaWYoJ2MnLCBsb3dlcmVkX2JyZWFrKCkpKSkpICsKKyAgICAgICAgICAgICAgICAgaWZfZXhlY3V0ZV9mbGFnKGxvd2VyZWRfYnJlYWtfc2ltcGxlKCkpICsKKyAgICAgICAgICAgICAgICAgZmluYWxfYnJlYWsoKSkKKyAgICAgICAgICAgICkpCisgICAgY3JlYXRlX3Rlc3RfY2FzZShkb2Nfc3RyaW5nLCBpbnB1dF9zZXhwLCBleHBlY3RlZF9zZXhwLCAnbG93ZXJfYnJlYWtzXzYnLAorICAgICAgICAgICAgICAgICAgICAgbG93ZXJfYnJlYWs9VHJ1ZSwgbG93ZXJfY29udGludWU9VHJ1ZSkKKworZGVmIHRlc3RfbG93ZXJfZ3VhcmRlZF9jb25kaXRpb25hbF9icmVhaygpOgorICAgIGRvY19zdHJpbmcgPSAiIiJOb3JtYWxseSBhIGNvbmRpdGlvbmFsIGJyZWFrIGF0IHRoZSBlbmQgb2YgYSBsb29wIGlzbid0CisgICAgbG93ZXJlZCwgaG93ZXZlciBpZiB0aGUgY29uZGl0aW9uYWwgYnJlYWsgZ2V0cyBwbGFjZWQgaW5zaWRlCisgICAgYW4gaWYoZXhlY3V0ZV9mbGFnKSBiZWNhdXNlIG9mIGVhcmxpZXIgbG93ZXJpbmcgb2YgY29udGludWVzLAorICAgIHRoZW4gdGhlIGJyZWFrIG5lZWRzIHRvIGJlIGxvd2VyZWQuCisgICAgIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBsb29wKGNvbXBsZXhfaWYoJ2EnLCBjb250aW51ZV8oKSkgKworICAgICAgICAgICAgICAgICBzaW1wbGVfaWYoJ2InLCBicmVha18oKSkpCisgICAgICAgICAgICApKQorICAgIGV4cGVjdGVkX3NleHAgPSBtYWtlX3Rlc3RfY2FzZSgnbWFpbicsICd2b2lkJywgKAorICAgICAgICAgICAgZGVjbGFyZV9icmVha19mbGFnKCkgKworICAgICAgICAgICAgbG9vcChkZWNsYXJlX2V4ZWN1dGVfZmxhZygpICsKKyAgICAgICAgICAgICAgICAgY29tcGxleF9pZignYScsIGxvd2VyZWRfY29udGludWUoKSkgKworICAgICAgICAgICAgICAgICBpZl9leGVjdXRlX2ZsYWcoc2ltcGxlX2lmKCdiJywgbG93ZXJlZF9icmVhaygpKSkgKworICAgICAgICAgICAgICAgICBmaW5hbF9icmVhaygpKQorICAgICAgICAgICAgKSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdsb3dlcl9ndWFyZGVkX2NvbmRpdGlvbmFsX2JyZWFrJywKKyAgICAgICAgICAgICAgICAgICAgIGxvd2VyX2JyZWFrPVRydWUsIGxvd2VyX2NvbnRpbnVlPVRydWUpCisKK2RlZiB0ZXN0X3JlbW92ZV9jb250aW51ZV9hdF9lbmRfb2ZfbG9vcCgpOgorICAgIGRvY19zdHJpbmcgPSAiIiJUZXN0IHRoYXQgYSByZWR1bmRhbnQgY29udGludWUtc3RhdGVtZW50IGF0IHRoZSBlbmQgb2YgYQorICAgIGxvb3AgaXMgcmVtb3ZlZC4KKyAgICAiIiIKKyAgICBpbnB1dF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGxvb3AoYXNzaWduX3goJ2EnLCBjb25zdF9mbG9hdCgxKSkgKworICAgICAgICAgICAgICAgICBjb250aW51ZV8oKSkKKyAgICAgICAgICAgICkpCisgICAgZXhwZWN0ZWRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBsb29wKGFzc2lnbl94KCdhJywgY29uc3RfZmxvYXQoMSkpKQorICAgICAgICAgICAgKSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdyZW1vdmVfY29udGludWVfYXRfZW5kX29mX2xvb3AnKQorCitkZWYgdGVzdF9sb3dlcl9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcCgpOgorICAgIGRvY19zdHJpbmcgPSAiIiJUZXN0IHRoYXQgYSByZXR1cm4gb2Ygdm9pZCBhdCB0aGUgZW5kIG9mIGEgbG9vcCBpcyBwcm9wZXJseQorICAgIGxvd2VyZWQuCisgICAgIiIiCisgICAgaW5wdXRfc2V4cCA9IG1ha2VfdGVzdF9jYXNlKCdtYWluJywgJ3ZvaWQnLCAoCisgICAgICAgICAgICBsb29wKGFzc2lnbl94KCdhJywgY29uc3RfZmxvYXQoMSkpICsKKyAgICAgICAgICAgICAgICAgcmV0dXJuXygpKSArCisgICAgICAgICAgICBhc3NpZ25feCgnYicsIGNvbnN0X2Zsb2F0KDIpKQorICAgICAgICAgICAgKSkKKyAgICBleHBlY3RlZF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ21haW4nLCAndm9pZCcsICgKKyAgICAgICAgICAgIGRlY2xhcmVfcmV0dXJuX2ZsYWcoKSArCisgICAgICAgICAgICBsb29wKGFzc2lnbl94KCdhJywgY29uc3RfZmxvYXQoMSkpICsKKyAgICAgICAgICAgICAgICAgbG93ZXJlZF9yZXR1cm5fc2ltcGxlKCkgKworICAgICAgICAgICAgICAgICBicmVha18oKSkgKworICAgICAgICAgICAgaWZfbm90X3JldHVybl9mbGFnKGFzc2lnbl94KCdiJywgY29uc3RfZmxvYXQoMikpKQorICAgICAgICAgICAgKSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGlucHV0X3NleHAsICdyZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9ub3RoaW5nJykKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdyZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm4nLAorICAgICAgICAgICAgICAgICAgICAgbG93ZXJfbWFpbl9yZXR1cm49VHJ1ZSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdyZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm5fYW5kX2JyZWFrJywKKyAgICAgICAgICAgICAgICAgICAgIGxvd2VyX21haW5fcmV0dXJuPVRydWUsIGxvd2VyX2JyZWFrPVRydWUpCisKK2RlZiB0ZXN0X2xvd2VyX3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcCgpOgorICAgIGRvY19zdHJpbmcgPSAiIiJUZXN0IHRoYXQgYSBub24tdm9pZCByZXR1cm4gYXQgdGhlIGVuZCBvZiBhIGxvb3AgaXMKKyAgICBwcm9wZXJseSBsb3dlcmVkLgorICAgICIiIgorICAgIGlucHV0X3NleHAgPSBtYWtlX3Rlc3RfY2FzZSgnc3ViJywgJ2Zsb2F0JywgKAorICAgICAgICAgICAgbG9vcChhc3NpZ25feCgnYScsIGNvbnN0X2Zsb2F0KDEpKSArCisgICAgICAgICAgICAgICAgIHJldHVybl8oY29uc3RfZmxvYXQoMikpKSArCisgICAgICAgICAgICBhc3NpZ25feCgnYicsIGNvbnN0X2Zsb2F0KDMpKSArCisgICAgICAgICAgICByZXR1cm5fKGNvbnN0X2Zsb2F0KDQpKQorICAgICAgICAgICAgKSkKKyAgICBleHBlY3RlZF9zZXhwID0gbWFrZV90ZXN0X2Nhc2UoJ3N1YicsICdmbG9hdCcsICgKKyAgICAgICAgICAgIGRlY2xhcmVfZXhlY3V0ZV9mbGFnKCkgKworICAgICAgICAgICAgZGVjbGFyZV9yZXR1cm5fdmFsdWUoKSArCisgICAgICAgICAgICBkZWNsYXJlX3JldHVybl9mbGFnKCkgKworICAgICAgICAgICAgbG9vcChhc3NpZ25feCgnYScsIGNvbnN0X2Zsb2F0KDEpKSArCisgICAgICAgICAgICAgICAgIGxvd2VyZWRfcmV0dXJuX3NpbXBsZShjb25zdF9mbG9hdCgyKSkgKworICAgICAgICAgICAgICAgICBicmVha18oKSkgKworICAgICAgICAgICAgaWZfbm90X3JldHVybl9mbGFnKGFzc2lnbl94KCdiJywgY29uc3RfZmxvYXQoMykpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmVkX3JldHVybihjb25zdF9mbG9hdCg0KSkpICsKKyAgICAgICAgICAgIGZpbmFsX3JldHVybigpCisgICAgICAgICAgICApKQorICAgIGNyZWF0ZV90ZXN0X2Nhc2UoZG9jX3N0cmluZywgaW5wdXRfc2V4cCwgaW5wdXRfc2V4cCwgJ3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9ub3RoaW5nJykKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdyZXR1cm5fbm9uX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuJywKKyAgICAgICAgICAgICAgICAgICAgIGxvd2VyX3N1Yl9yZXR1cm49VHJ1ZSkKKyAgICBjcmVhdGVfdGVzdF9jYXNlKGRvY19zdHJpbmcsIGlucHV0X3NleHAsIGV4cGVjdGVkX3NleHAsICdyZXR1cm5fbm9uX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuX2FuZF9icmVhaycsCisgICAgICAgICAgICAgICAgICAgICBsb3dlcl9zdWJfcmV0dXJuPVRydWUsIGxvd2VyX2JyZWFrPVRydWUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9sb3dlcl9yZXR1cm5zX21haW4oKQorICAgIHRlc3RfbG93ZXJfcmV0dXJuc19zdWIoKQorICAgIHRlc3RfbG93ZXJfcmV0dXJuc18xKCkKKyAgICB0ZXN0X2xvd2VyX3JldHVybnNfMigpCisgICAgdGVzdF9sb3dlcl9yZXR1cm5zXzMoKQorICAgIHRlc3RfbG93ZXJfcmV0dXJuc180KCkKKyAgICB0ZXN0X2xvd2VyX3VuaWZpZWRfcmV0dXJucygpCisgICAgdGVzdF9sb3dlcl9wdWxsZWRfb3V0X2p1bXAoKQorICAgIHRlc3RfbG93ZXJfYnJlYWtzXzEoKQorICAgIHRlc3RfbG93ZXJfYnJlYWtzXzIoKQorICAgIHRlc3RfbG93ZXJfYnJlYWtzXzMoKQorICAgIHRlc3RfbG93ZXJfYnJlYWtzXzQoKQorICAgIHRlc3RfbG93ZXJfYnJlYWtzXzUoKQorICAgIHRlc3RfbG93ZXJfYnJlYWtzXzYoKQorICAgIHRlc3RfbG93ZXJfZ3VhcmRlZF9jb25kaXRpb25hbF9icmVhaygpCisgICAgdGVzdF9yZW1vdmVfY29udGludWVfYXRfZW5kX29mX2xvb3AoKQorICAgIHRlc3RfbG93ZXJfcmV0dXJuX3ZvaWRfYXRfZW5kX29mX2xvb3AoKQorICAgIHRlc3RfbG93ZXJfcmV0dXJuX25vbl92b2lkX2F0X2VuZF9vZl9sb29wKCkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzEub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc18xLm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTJiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc18xLm9wdF90ZXN0CkBAIC0wLDAgKzEsMTMgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIElmIGEgbG9vcCBjb250YWlucyBhbiB1bmNvbmRpdGlvbmFsIGJyZWFrIGF0IHRoZSBib3R0b20gb2YKKyMgaXQsIGl0IHNob3VsZCBub3QgYmUgbG93ZXJlZC4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMCwgMCwgMCwgMSknIDw8RU9GCisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkgYnJlYWspKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfMS5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzEub3B0X3Rlc3QuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZjNlNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzEub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSw1IEBACisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkgYnJlYWspKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzIub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc18yLm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZGU4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc18yLm9wdF90ZXN0CkBAIC0wLDAgKzEsMTUgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIElmIGEgbG9vcCBjb250YWlucyBhIGNvbmRpdGlvbmFsIGJyZWFrIGF0IHRoZSBib3R0b20gb2YgaXQsCisjIGl0IHNob3VsZCBub3QgYmUgbG93ZXJlZCBpZiBpdCBpcyBpbiB0aGUgdGhlbi1jbGF1c2UuCisuLi8uLi9nbHNsX3Rlc3Qgb3B0cGFzcyAtLXF1aWV0IC0taW5wdXQtaXIgJ2RvX2xvd2VyX2p1bXBzKDAsIDAsIDAsIDAsIDEpJyA8PEVPRgorKChkZWNsYXJlIChpbikgZmxvYXQgYikgKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkKKyAgICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjAwMDAwMCkpKSAoYnJlYWspCisgICAgICAgKCkpKSkpKSkpCitFT0YKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzIub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc18yLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjMxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc18yLm9wdF90ZXN0LmV4cGVjdGVkCkBAIC0wLDAgKzEsNyBAQAorKChkZWNsYXJlIChpbikgZmxvYXQgYikgKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkKKyAgICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkgKGJyZWFrKQorICAgICAgICgpKSkpKSkpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfMy5vcHRfdGVzdCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzMub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzNjhiYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzMub3B0X3Rlc3QKQEAgLTAsMCArMSwxNyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS4KKyMKKyMgSWYgYSBsb29wIGNvbnRhaW5zIGEgY29uZGl0aW9uYWwgYnJlYWsgYXQgdGhlIGJvdHRvbSBvZiBpdCwKKyMgaXQgc2hvdWxkIG5vdCBiZSBsb3dlcmVkIGlmIGl0IGlzIGluIHRoZSB0aGVuLWNsYXVzZSwgZXZlbiBpZgorIyB0aGVyZSBhcmUgc3RhdGVtZW50cyBwcmVjZWRpbmcgdGhlIGJyZWFrLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAwLCAwLCAwLCAxKScgPDxFT0YKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGIpIChkZWNsYXJlIChvdXQpIGZsb2F0IGEpIChkZWNsYXJlIChvdXQpIGZsb2F0IGMpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChsb29wCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpCisgICAgICAoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYykgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSBicmVhaykKKyAgICAgICAoKSkpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfMy5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzMub3B0X3Rlc3QuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzMWI2NgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzMub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSw4IEBACisoKGRlY2xhcmUgKGluKSBmbG9hdCBiKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBhKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBjKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBjKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpIGJyZWFrKQorICAgICAgICgpKSkpKSkpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfNC5vcHRfdGVzdCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzQub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlMzE5NwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzQub3B0X3Rlc3QKQEAgLTAsMCArMSwxNSBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS4KKyMKKyMgSWYgYSBsb29wIGNvbnRhaW5zIGEgY29uZGl0aW9uYWwgYnJlYWsgYXQgdGhlIGJvdHRvbSBvZiBpdCwKKyMgaXQgc2hvdWxkIG5vdCBiZSBsb3dlcmVkIGlmIGl0IGlzIGluIHRoZSBlbHNlLWNsYXVzZS4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMCwgMCwgMCwgMSknIDw8RU9GCisoKGRlY2xhcmUgKGluKSBmbG9hdCBiKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBhKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpICgpCisgICAgICAgKGJyZWFrKSkpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfNC5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzQub3B0X3Rlc3QuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkY2IzNwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzQub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSw3IEBACisoKGRlY2xhcmUgKGluKSBmbG9hdCBiKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBhKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKSAoKQorICAgICAgIChicmVhaykpKSkpKSkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc181Lm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfNS5vcHRfdGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdiNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfNS5vcHRfdGVzdApAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV90ZXN0X2Nhc2VzLnB5LgorIworIyBJZiBhIGxvb3AgY29udGFpbnMgYSBjb25kaXRpb25hbCBicmVhayBhdCB0aGUgYm90dG9tIG9mIGl0LAorIyBpdCBzaG91bGQgbm90IGJlIGxvd2VyZWQgaWYgaXQgaXMgaW4gdGhlIGVsc2UtY2xhdXNlLCBldmVuIGlmCisjIHRoZXJlIGFyZSBzdGF0ZW1lbnRzIHByZWNlZGluZyB0aGUgYnJlYWsuCisuLi8uLi9nbHNsX3Rlc3Qgb3B0cGFzcyAtLXF1aWV0IC0taW5wdXQtaXIgJ2RvX2xvd2VyX2p1bXBzKDAsIDAsIDAsIDAsIDEpJyA8PEVPRgorKChkZWNsYXJlIChpbikgZmxvYXQgYikgKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkgKGRlY2xhcmUgKG91dCkgZmxvYXQgYykKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkKKyAgICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjAwMDAwMCkpKSAoKQorICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBjKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpIGJyZWFrKSkpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfNS5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzUub3B0X3Rlc3QuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0NmNjYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzUub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSw3IEBACisoKGRlY2xhcmUgKGluKSBmbG9hdCBiKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBhKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBjKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKSAoKQorICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBjKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpIGJyZWFrKSkpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzYub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc182Lm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjdkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2JyZWFrc182Lm9wdF90ZXN0CkBAIC0wLDAgKzEsMjkgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIElmIGEgbG9vcCBjb250YWlucyBjb25kaXRpb25hbCBicmVha3MgYW5kIGNvbnRpbnVlcywgYW5kCisjIGVuZHMgaW4gYW4gdW5jb25kaXRpb25hbCBicmVhaywgdGhlbiB0aGUgdW5jb25kaXRpb25hbCBicmVhaworIyBuZWVkcyB0byBiZSBsb3dlcmVkLCBiZWNhdXNlIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIGF0IHRoZSBlbmQKKyMgb2YgdGhlIGxvb3AgYWZ0ZXIgdGhlIGZpbmFsIGJyZWFrIGlzIGFkZGVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAwLCAwLCAxLCAxKScgPDxFT0YKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGEpIChkZWNsYXJlIChpbikgZmxvYXQgYmEpIChkZWNsYXJlIChpbikgZmxvYXQgYmIpCisgKGRlY2xhcmUgKGluKSBmbG9hdCBjYSkKKyAoZGVjbGFyZSAoaW4pIGZsb2F0IGNiKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYmEpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGJiKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICAgICAgIChjb250aW51ZSkKKyAgICAgICAgICAgKCkpKQorICAgICAgICAgKCkpCisgICAgICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgY2EpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGNiKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICAgICAgIChicmVhaykKKyAgICAgICAgICAgKCkpKQorICAgICAgICAgKCkpKQorICAgICAgICgpKQorICAgICAgYnJlYWspKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9icmVha3NfNi5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzYub3B0X3Rlc3QuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3Y2U2NAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfYnJlYWtzXzYub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSwyOSBAQAorKChkZWNsYXJlIChpbikgZmxvYXQgYSkgKGRlY2xhcmUgKGluKSBmbG9hdCBiYSkgKGRlY2xhcmUgKGluKSBmbG9hdCBiYikKKyAoZGVjbGFyZSAoaW4pIGZsb2F0IGNhKQorIChkZWNsYXJlIChpbikgZmxvYXQgY2IpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgYnJlYWtfZmxhZykKKyAgICAoYXNzaWduICh4KSAodmFyX3JlZiBicmVha19mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKQorICAgIChsb29wCisgICAgICgoZGVjbGFyZSAodGVtcG9yYXJ5KSBib29sIGV4ZWN1dGVfZmxhZykKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiYSkgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGJiKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAgICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkKKyAgICAgICAgICAgKCkpKQorICAgICAgICAgKCkpCisgICAgICAgIChpZiAodmFyX3JlZiBleGVjdXRlX2ZsYWcpCisgICAgICAgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBjYSkgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgY2IpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICAgICAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGJyZWFrX2ZsYWcpIChjb25zdGFudCBib29sICgxKSkpCisgICAgICAgICAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDApKSkpCisgICAgICAgICAgICAgKCkpKQorICAgICAgICAgICAoKSkpCisgICAgICAgICAoKSkpCisgICAgICAgKCkpCisgICAgICAoaWYgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKQorICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBicmVha19mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKSkKKyAgICAgICAoKSkKKyAgICAgIChpZiAodmFyX3JlZiBicmVha19mbGFnKSAoYnJlYWspICgpKSkpKSkpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9ndWFyZGVkX2NvbmRpdGlvbmFsX2JyZWFrLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9ndWFyZGVkX2NvbmRpdGlvbmFsX2JyZWFrLm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDkxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX2d1YXJkZWRfY29uZGl0aW9uYWxfYnJlYWsub3B0X3Rlc3QKQEAgLTAsMCArMSwyMSBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS4KKyMKKyMgTm9ybWFsbHkgYSBjb25kaXRpb25hbCBicmVhayBhdCB0aGUgZW5kIG9mIGEgbG9vcCBpc24ndAorIyBsb3dlcmVkLCBob3dldmVyIGlmIHRoZSBjb25kaXRpb25hbCBicmVhayBnZXRzIHBsYWNlZCBpbnNpZGUKKyMgYW4gaWYoZXhlY3V0ZV9mbGFnKSBiZWNhdXNlIG9mIGVhcmxpZXIgbG93ZXJpbmcgb2YgY29udGludWVzLAorIyB0aGVuIHRoZSBicmVhayBuZWVkcyB0byBiZSBsb3dlcmVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAwLCAwLCAxLCAxKScgPDxFT0YKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGFhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGFiKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChsb29wCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGFhKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYWIpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAgIChjb250aW51ZSkKKyAgICAgICAgICgpKSkKKyAgICAgICAoKSkKKyAgICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjAwMDAwMCkpKSAoYnJlYWspCisgICAgICAgKCkpKSkpKSkpCitFT0YKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfZ3VhcmRlZF9jb25kaXRpb25hbF9icmVhay5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfZ3VhcmRlZF9jb25kaXRpb25hbF9icmVhay5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDEwNzNlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9ndWFyZGVkX2NvbmRpdGlvbmFsX2JyZWFrLm9wdF90ZXN0LmV4cGVjdGVkCkBAIC0wLDAgKzEsMjAgQEAKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGFhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGFiKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgYnJlYWtfZmxhZykKKyAgICAoYXNzaWduICh4KSAodmFyX3JlZiBicmVha19mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKQorICAgIChsb29wCisgICAgICgoZGVjbGFyZSAodGVtcG9yYXJ5KSBib29sIGV4ZWN1dGVfZmxhZykKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYWEpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYWIpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkKKyAgICAgICAgICgpKSkKKyAgICAgICAoKSkKKyAgICAgIChpZiAodmFyX3JlZiBleGVjdXRlX2ZsYWcpCisgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBicmVha19mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDApKSkpCisgICAgICAgICAoKSkpCisgICAgICAgKCkpCisgICAgICAoaWYgKHZhcl9yZWYgYnJlYWtfZmxhZykgKGJyZWFrKSAoKSkpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcHVsbGVkX291dF9qdW1wLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9wdWxsZWRfb3V0X2p1bXAub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1YzA5NgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcHVsbGVkX291dF9qdW1wLm9wdF90ZXN0CkBAIC0wLDAgKzEsMjggQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIElmIG9uZSBicmFuY2ggb2YgYW4gaWYgZW5kcyBpbiBhIGp1bXAsIGFuZCBjb250cm9sIGNhbm5vdAorIyBmYWxsIG91dCB0aGUgYm90dG9tIG9mIHRoZSBvdGhlciBicmFuY2gsIGFuZCBwdWxsX291dF9qdW1wcyBpcworIyBUcnVlLCB0aGVuIHRoZSBqdW1wIGlzIGxpZnRlZCBvdXRzaWRlIHRoZSBpZi4KKyMgVmVyaWZ5IHRoYXQgdGhpcyBsb3dlcmluZyBvY2N1cnMgZHVyaW5nIHRoZSBzYW1lIHBhc3MgYXMgdGhlCisjIGxvd2VyaW5nIG9mIG90aGVyIGp1bXBzIGJ5IGNoZWNraW5nIHRoYXQgZXh0cmEgdGVtcG9yYXJ5CisjIHZhcmlhYmxlcyBhcmVuJ3QgZ2VuZXJhdGVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygxLCAwLCAxLCAwLCAwKScgPDxFT0YKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGFhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGFiKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGRlY2xhcmUgKGluKSBmbG9hdCBjKQorIChkZWNsYXJlIChvdXQpIGZsb2F0IGQpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYWEpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYWIpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAoKHJldHVybikpCisgICAgICAgKCkpKQorICAgICAoKSkKKyAgICAobG9vcAorICAgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYykgKGNvbnN0YW50IGZsb2F0ICgwLjAwMDAwMCkpKSAoYnJlYWspCisgICAgICAgICAoY29udGludWUpKSkKKyAgICAgICAoKHJldHVybikpKSkpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZCkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9wdWxsZWRfb3V0X2p1bXAub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3B1bGxlZF9vdXRfanVtcC5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjJlZjNmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9wdWxsZWRfb3V0X2p1bXAub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSwyNSBAQAorKChkZWNsYXJlIChpbikgZmxvYXQgYWEpIChkZWNsYXJlIChpbikgZmxvYXQgYWIpIChkZWNsYXJlIChpbikgZmxvYXQgYikKKyAoZGVjbGFyZSAoaW4pIGZsb2F0IGMpCisgKGRlY2xhcmUgKG91dCkgZmxvYXQgZCkKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGRlY2xhcmUgKHRlbXBvcmFyeSkgYm9vbCBleGVjdXRlX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgIChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgcmV0dXJuX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpCisgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhYSkgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYWIpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiBleGVjdXRlX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpKQorICAgICAgICgpKSkKKyAgICAgKCkpCisgICAgKGlmICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykKKyAgICAgKChsb29wCisgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGMpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpICgpCisgICAgICAgICAgIChjb250aW51ZSkpKQorICAgICAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKSkpCisgICAgICAgIGJyZWFrKSkKKyAgICAgIChpZiAodmFyX3JlZiByZXR1cm5fZmxhZykgKCkKKyAgICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgZCkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSkpKQorICAgICAoKSkpKSkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfMS5vcHRfdGVzdCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc18xLm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2M1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfMS5vcHRfdGVzdApAQCAtMCwwICsxLDEyIEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV90ZXN0X2Nhc2VzLnB5LgorIworIyBUZXN0IHRoYXQgYSB2b2lkIHJldHVybiBhdCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gaXMKKyMgZWxpbWluYXRlZC4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMCwgMSwgMCwgMCknIDw8RU9GCisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSAocmV0dXJuKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zXzEub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfMS5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM5MTljCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zXzEub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSw0IEBACisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc18yLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zXzIub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyZGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc18yLm9wdF90ZXN0CkBAIC0wLDAgKzEsMTMgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIFRlc3QgdGhhdCBsb3dlcmluZyBpcyBub3QgcGVyZm9ybWVkIG9uIGEgbm9uLXZvaWQgcmV0dXJuIGF0CisjIHRoZSBlbmQgb2Ygc3Vicm91dGluZS4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMSwgMCwgMCwgMCknIDw8RU9GCisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gc3ViCisgIChzaWduYXR1cmUgZmxvYXQgKHBhcmFtZXRlcnMpCisgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgIChyZXR1cm4gKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zXzIub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfMi5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc3OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zXzIub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSw1IEBACisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkKKyAoZnVuY3Rpb24gc3ViCisgIChzaWduYXR1cmUgZmxvYXQgKHBhcmFtZXRlcnMpCisgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgIChyZXR1cm4gKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc18zLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zXzMub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwOTc4MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc18zLm9wdF90ZXN0CkBAIC0wLDAgKzEsMjAgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIFRlc3QgbG93ZXJpbmcgb2YgcmV0dXJucyB3aGVuIHRoZXJlIGlzIG9uZSBuZXN0ZWQgaW5zaWRlIGEKKyMgY29tcGxleCBzdHJ1Y3R1cmUgb2YgaWZzLCBhbmQgb25lIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KKyMgSW4gdGhpcyBjYXNlLCB0aGUgbGF0dGVyIHJldHVybiBuZWVkcyB0byBiZSBsb3dlcmVkIGJlY2F1c2UgaXQKKyMgd2lsbCBub3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gb25jZSB0aGUgZmluYWwgcmV0dXJuCisjIGlzIGluc2VydGVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAxLCAwLCAwLCAwKScgPDxFT0YKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGEpIChkZWNsYXJlIChpbikgZmxvYXQgYikKKyAoZnVuY3Rpb24gc3ViCisgIChzaWduYXR1cmUgZmxvYXQgKHBhcmFtZXRlcnMpCisgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAoKHJldHVybiAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpKQorICAgICAgICgpKSkKKyAgICAgKCkpCisgICAgKHJldHVybiAoY29uc3RhbnQgZmxvYXQgKDIuMDAwMDAwKSkpKSkpKQorRU9GCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfMy5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc18zLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjJiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfMy5vcHRfdGVzdC5leHBlY3RlZApAQCAtMCwwICsxLDIxIEBACisoKGRlY2xhcmUgKGluKSBmbG9hdCBhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGZ1bmN0aW9uIHN1YgorICAoc2lnbmF0dXJlIGZsb2F0IChwYXJhbWV0ZXJzKQorICAgKChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgZXhlY3V0ZV9mbGFnKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAoZGVjbGFyZSAodGVtcG9yYXJ5KSBmbG9hdCByZXR1cm5fdmFsdWUpCisgICAgKGRlY2xhcmUgKHRlbXBvcmFyeSkgYm9vbCByZXR1cm5fZmxhZykKKyAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDApKSkKKyAgICAoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl92YWx1ZSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkKKyAgICAgICAoKSkpCisgICAgICgpKQorICAgIChpZiAodmFyX3JlZiBleGVjdXRlX2ZsYWcpCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fdmFsdWUpIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkKKyAgICAgKCkpCisgICAgKHJldHVybiAodmFyX3JlZiByZXR1cm5fdmFsdWUpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc180Lm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zXzQub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViYjljOAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc180Lm9wdF90ZXN0CkBAIC0wLDAgKzEsMTQgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIFRlc3QgdGhhdCByZXR1cm5zIGFyZSBwcm9wZXJseSBsb3dlcmVkIHdoZW4gdGhleSBvY2N1ciBpbgorIyBib3RoIGJyYW5jaGVzIG9mIGFuIGlmLXN0YXRlbWVudC4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMSwgMCwgMCwgMCknIDw8RU9GCisoKGRlY2xhcmUgKGluKSBmbG9hdCBhKQorIChmdW5jdGlvbiBzdWIKKyAgKHNpZ25hdHVyZSBmbG9hdCAocGFyYW1ldGVycykKKyAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgKChyZXR1cm4gKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSkKKyAgICAgKChyZXR1cm4gKGNvbnN0YW50IGZsb2F0ICgyLjAwMDAwMCkpKSkpKSkpKQorRU9GCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfNC5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc180Lm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzY4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfNC5vcHRfdGVzdC5leHBlY3RlZApAQCAtMCwwICsxLDE2IEBACisoKGRlY2xhcmUgKGluKSBmbG9hdCBhKQorIChmdW5jdGlvbiBzdWIKKyAgKHNpZ25hdHVyZSBmbG9hdCAocGFyYW1ldGVycykKKyAgICgoZGVjbGFyZSAodGVtcG9yYXJ5KSBib29sIGV4ZWN1dGVfZmxhZykKKyAgICAoYXNzaWduICh4KSAodmFyX3JlZiBleGVjdXRlX2ZsYWcpIChjb25zdGFudCBib29sICgxKSkpCisgICAgKGRlY2xhcmUgKHRlbXBvcmFyeSkgZmxvYXQgcmV0dXJuX3ZhbHVlKQorICAgIChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgcmV0dXJuX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpCisgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX3ZhbHVlKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpCisgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDApKSkpCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fdmFsdWUpIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkpCisgICAgKHJldHVybiAodmFyX3JlZiByZXR1cm5fdmFsdWUpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc19tYWluX2ZhbHNlLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zX21haW5fZmFsc2Uub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiMWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc19tYWluX2ZhbHNlLm9wdF90ZXN0CkBAIC0wLDAgKzEsMTcgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIFRlc3QgdGhhdCBkb19sb3dlcl9qdW1wcyByZXNwZWN0cyB0aGUgbG93ZXJfbWFpbl9yZXR1cm4KKyMgZmxhZyBpbiBkZWNpZGluZyB3aGV0aGVyIHRvIGxvd2VyIHJldHVybnMgaW4gdGhlIG1haW4KKyMgZnVuY3Rpb24uCisuLi8uLi9nbHNsX3Rlc3Qgb3B0cGFzcyAtLXF1aWV0IC0taW5wdXQtaXIgJ2RvX2xvd2VyX2p1bXBzKDAsIDAsIDAsIDAsIDApJyA8PEVPRgorKChkZWNsYXJlIChpbikgZmxvYXQgYSkgKGRlY2xhcmUgKGluKSBmbG9hdCBiKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjAwMDAwMCkpKQorICAgICAgICgocmV0dXJuKSkKKyAgICAgICAoKSkpCisgICAgICgpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zX21haW5fZmFsc2Uub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfbWFpbl9mYWxzZS5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNmZTMxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zX21haW5fZmFsc2Uub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSw4IEBACisoKGRlY2xhcmUgKGluKSBmbG9hdCBhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgICAoKHJldHVybikpCisgICAgICAgKCkpKQorICAgICAoKSkpKSkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfbWFpbl90cnVlLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zX21haW5fdHJ1ZS5vcHRfdGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzllYzhiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl9yZXR1cm5zX21haW5fdHJ1ZS5vcHRfdGVzdApAQCAtMCwwICsxLDE3IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV90ZXN0X2Nhc2VzLnB5LgorIworIyBUZXN0IHRoYXQgZG9fbG93ZXJfanVtcHMgcmVzcGVjdHMgdGhlIGxvd2VyX21haW5fcmV0dXJuCisjIGZsYWcgaW4gZGVjaWRpbmcgd2hldGhlciB0byBsb3dlciByZXR1cm5zIGluIHRoZSBtYWluCisjIGZ1bmN0aW9uLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAwLCAxLCAwLCAwKScgPDxFT0YKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGEpIChkZWNsYXJlIChpbikgZmxvYXQgYikKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAoKHJldHVybikpCisgICAgICAgKCkpKQorICAgICAoKSkpKSkpCitFT0YKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc19tYWluX3RydWUub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfbWFpbl90cnVlLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2Y1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfbWFpbl90cnVlLm9wdF90ZXN0LmV4cGVjdGVkCkBAIC0wLDAgKzEsMTMgQEAKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGEpIChkZWNsYXJlIChpbikgZmxvYXQgYikKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGRlY2xhcmUgKHRlbXBvcmFyeSkgYm9vbCBleGVjdXRlX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgIChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgcmV0dXJuX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpCisgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkKKyAgICAgICAoKSkpCisgICAgICgpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc19zdWJfZmFsc2Uub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX2ZhbHNlLm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTRlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX2ZhbHNlLm9wdF90ZXN0CkBAIC0wLDAgKzEsMTYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIFRlc3QgdGhhdCBkb19sb3dlcl9qdW1wcyByZXNwZWN0cyB0aGUgbG93ZXJfc3ViX3JldHVybiBmbGFnCisjIGluIGRlY2lkaW5nIHdoZXRoZXIgdG8gbG93ZXIgcmV0dXJucyBpbiBzdWJyb3V0aW5lcy4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMCwgMCwgMCwgMCknIDw8RU9GCisoKGRlY2xhcmUgKGluKSBmbG9hdCBhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGZ1bmN0aW9uIHN1YgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAoKHJldHVybikpCisgICAgICAgKCkpKQorICAgICAoKSkpKSkpCitFT0YKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc19zdWJfZmFsc2Uub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX2ZhbHNlLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MjQ5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX2ZhbHNlLm9wdF90ZXN0LmV4cGVjdGVkCkBAIC0wLDAgKzEsOCBAQAorKChkZWNsYXJlIChpbikgZmxvYXQgYSkgKGRlY2xhcmUgKGluKSBmbG9hdCBiKQorIChmdW5jdGlvbiBzdWIKKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkKKyAgICAgICAoKHJldHVybikpCisgICAgICAgKCkpKQorICAgICAoKSkpKSkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX3RydWUub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX3RydWUub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5NDE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc19zdWJfdHJ1ZS5vcHRfdGVzdApAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV90ZXN0X2Nhc2VzLnB5LgorIworIyBUZXN0IHRoYXQgZG9fbG93ZXJfanVtcHMgcmVzcGVjdHMgdGhlIGxvd2VyX3N1Yl9yZXR1cm4gZmxhZworIyBpbiBkZWNpZGluZyB3aGV0aGVyIHRvIGxvd2VyIHJldHVybnMgaW4gc3Vicm91dGluZXMuCisuLi8uLi9nbHNsX3Rlc3Qgb3B0cGFzcyAtLXF1aWV0IC0taW5wdXQtaXIgJ2RvX2xvd2VyX2p1bXBzKDAsIDEsIDAsIDAsIDApJyA8PEVPRgorKChkZWNsYXJlIChpbikgZmxvYXQgYSkgKGRlY2xhcmUgKGluKSBmbG9hdCBiKQorIChmdW5jdGlvbiBzdWIKKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgwLjAwMDAwMCkpKQorICAgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICAgKChyZXR1cm4pKQorICAgICAgICgpKSkKKyAgICAgKCkpKSkpKQorRU9GCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX3RydWUub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3JldHVybnNfc3ViX3RydWUub3B0X3Rlc3QuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzZWFlNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfcmV0dXJuc19zdWJfdHJ1ZS5vcHRfdGVzdC5leHBlY3RlZApAQCAtMCwwICsxLDEzIEBACisoKGRlY2xhcmUgKGluKSBmbG9hdCBhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGZ1bmN0aW9uIHN1YgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGRlY2xhcmUgKHRlbXBvcmFyeSkgYm9vbCBleGVjdXRlX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgIChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgcmV0dXJuX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpCisgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAoKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkKKyAgICAgICAoKSkpCisgICAgICgpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfdW5pZmllZF9yZXR1cm5zLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl91bmlmaWVkX3JldHVybnMub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2ZTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvbG93ZXJfdW5pZmllZF9yZXR1cm5zLm9wdF90ZXN0CkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIElmIGJvdGggYnJhbmNoZXMgb2YgYW4gaWYgc3RhdGVtZW50IGVuZCBpbiBhIHJldHVybiwgYW5kCisjIHB1bGxfb3V0X2p1bXBzIGlzIFRydWUsIHRoZW4gdGhvc2UgcmV0dXJucyBzaG91bGQgYmUgbGlmdGVkCisjIG91dHNpZGUgdGhlIGlmIGFuZCB0aGVuIHByb3Blcmx5IGxvd2VyZWQuCisjIFZlcmlmeSB0aGF0IHRoaXMgbG93ZXJpbmcgb2NjdXJzIGR1cmluZyB0aGUgc2FtZSBwYXNzIGFzIHRoZQorIyBsb3dlcmluZyBvZiBvdGhlciByZXR1cm5zIGJ5IGNoZWNraW5nIHRoYXQgZXh0cmEgdGVtcG9yYXJ5CisjIHZhcmlhYmxlcyBhcmVuJ3QgZ2VuZXJhdGVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygxLCAwLCAxLCAwLCAwKScgPDxFT0YKKygoZGVjbGFyZSAoaW4pIGZsb2F0IGFhKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGFiKSAoZGVjbGFyZSAoaW4pIGZsb2F0IGIpCisgKGRlY2xhcmUgKGluKSBmbG9hdCBjKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGFhKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGFiKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICAgKChyZXR1cm4pKQorICAgICAgICgpKSkKKyAgICAgKCkpCisgICAgKGlmIChleHByZXNzaW9uIGJvb2wgPiAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDAuMDAwMDAwKSkpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGMpIChjb25zdGFudCBmbG9hdCAoMC4wMDAwMDApKSkKKyAgICAgICAoKHJldHVybikpCisgICAgICAgKChyZXR1cm4pKSkpCisgICAgICgpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl91bmlmaWVkX3JldHVybnMub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL2xvd2VyX3VuaWZpZWRfcmV0dXJucy5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI1MWUxCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9sb3dlcl91bmlmaWVkX3JldHVybnMub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSwyMSBAQAorKChkZWNsYXJlIChpbikgZmxvYXQgYWEpIChkZWNsYXJlIChpbikgZmxvYXQgYWIpIChkZWNsYXJlIChpbikgZmxvYXQgYikKKyAoZGVjbGFyZSAoaW4pIGZsb2F0IGMpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgZXhlY3V0ZV9mbGFnKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAoZGVjbGFyZSAodGVtcG9yYXJ5KSBib29sIHJldHVybl9mbGFnKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKQorICAgIChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYWEpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGFiKSAoY29uc3RhbnQgZmxvYXQgKDAuMCkpKQorICAgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkKKyAgICAgICAoKSkpCisgICAgICgpKQorICAgIChpZiAodmFyX3JlZiBleGVjdXRlX2ZsYWcpCisgICAgICgoaWYgKGV4cHJlc3Npb24gYm9vbCA+ICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMC4wKSkpCisgICAgICAgKChpZiAoZXhwcmVzc2lvbiBib29sID4gKHZhcl9yZWYgYykgKGNvbnN0YW50IGZsb2F0ICgwLjApKSkgKCkgKCkpCisgICAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiBleGVjdXRlX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpKQorICAgICAgICgpKSkKKyAgICAgKCkpKSkpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZW1vdmVfY29udGludWVfYXRfZW5kX29mX2xvb3Aub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JlbW92ZV9jb250aW51ZV9hdF9lbmRfb2ZfbG9vcC5vcHRfdGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDAzYmIyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZW1vdmVfY29udGludWVfYXRfZW5kX29mX2xvb3Aub3B0X3Rlc3QKQEAgLTAsMCArMSwxMyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS4KKyMKKyMgVGVzdCB0aGF0IGEgcmVkdW5kYW50IGNvbnRpbnVlLXN0YXRlbWVudCBhdCB0aGUgZW5kIG9mIGEKKyMgbG9vcCBpcyByZW1vdmVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAwLCAwLCAwLCAwKScgPDxFT0YKKygoZGVjbGFyZSAob3V0KSBmbG9hdCBhKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSBjb250aW51ZSkpKSkpKQorRU9GCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JlbW92ZV9jb250aW51ZV9hdF9lbmRfb2ZfbG9vcC5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmVtb3ZlX2NvbnRpbnVlX2F0X2VuZF9vZl9sb29wLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Yjc0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JlbW92ZV9jb250aW51ZV9hdF9lbmRfb2ZfbG9vcC5vcHRfdGVzdC5leHBlY3RlZApAQCAtMCwwICsxLDUgQEAKKygoZGVjbGFyZSAob3V0KSBmbG9hdCBhKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSkpKSkpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fbm9uX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfbm90aGluZy5vcHRfdGVzdCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX25vbl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX25vdGhpbmcub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2MmU3MwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX25vbl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX25vdGhpbmcub3B0X3Rlc3QKQEAgLTAsMCArMSwxNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS4KKyMKKyMgVGVzdCB0aGF0IGEgbm9uLXZvaWQgcmV0dXJuIGF0IHRoZSBlbmQgb2YgYSBsb29wIGlzCisjIHByb3Blcmx5IGxvd2VyZWQuCisuLi8uLi9nbHNsX3Rlc3Qgb3B0cGFzcyAtLXF1aWV0IC0taW5wdXQtaXIgJ2RvX2xvd2VyX2p1bXBzKDAsIDAsIDAsIDAsIDApJyA8PEVPRgorKChkZWNsYXJlIChvdXQpIGZsb2F0IGEpIChkZWNsYXJlIChvdXQpIGZsb2F0IGIpCisgKGZ1bmN0aW9uIHN1YgorICAoc2lnbmF0dXJlIGZsb2F0IChwYXJhbWV0ZXJzKQorICAgKChsb29wCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpCisgICAgICAocmV0dXJuIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkpKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMy4wMDAwMDApKSkKKyAgICAocmV0dXJuIChjb25zdGFudCBmbG9hdCAoNC4wMDAwMDApKSkpKSkpCitFT0YKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX25vbl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX25vdGhpbmcub3B0X3Rlc3QuZXhwZWN0ZWQgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9ub3RoaW5nLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MGQzODMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9ub3RoaW5nLm9wdF90ZXN0LmV4cGVjdGVkCkBAIC0wLDAgKzEsOCBAQAorKChkZWNsYXJlIChvdXQpIGZsb2F0IGEpIChkZWNsYXJlIChvdXQpIGZsb2F0IGIpCisgKGZ1bmN0aW9uIHN1YgorICAoc2lnbmF0dXJlIGZsb2F0IChwYXJhbWV0ZXJzKQorICAgKChsb29wCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpCisgICAgICAocmV0dXJuIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkpKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMy4wMDAwMDApKSkKKyAgICAocmV0dXJuIChjb25zdGFudCBmbG9hdCAoNC4wMDAwMDApKSkpKSkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm4ub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm4ub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjNGU3NQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX25vbl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX3JldHVybi5vcHRfdGVzdApAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV90ZXN0X2Nhc2VzLnB5LgorIworIyBUZXN0IHRoYXQgYSBub24tdm9pZCByZXR1cm4gYXQgdGhlIGVuZCBvZiBhIGxvb3AgaXMKKyMgcHJvcGVybHkgbG93ZXJlZC4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMSwgMCwgMCwgMCknIDw8RU9GCisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkgKGRlY2xhcmUgKG91dCkgZmxvYXQgYikKKyAoZnVuY3Rpb24gc3ViCisgIChzaWduYXR1cmUgZmxvYXQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkKKyAgICAgIChyZXR1cm4gKGNvbnN0YW50IGZsb2F0ICgyLjAwMDAwMCkpKSkpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgzLjAwMDAwMCkpKQorICAgIChyZXR1cm4gKGNvbnN0YW50IGZsb2F0ICg0LjAwMDAwMCkpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fbm9uX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuLm9wdF90ZXN0LmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fbm9uX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmNiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm4ub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSwxOSBAQAorKChkZWNsYXJlIChvdXQpIGZsb2F0IGEpIChkZWNsYXJlIChvdXQpIGZsb2F0IGIpCisgKGZ1bmN0aW9uIHN1YgorICAoc2lnbmF0dXJlIGZsb2F0IChwYXJhbWV0ZXJzKQorICAgKChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgZXhlY3V0ZV9mbGFnKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGV4ZWN1dGVfZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAoZGVjbGFyZSAodGVtcG9yYXJ5KSBmbG9hdCByZXR1cm5fdmFsdWUpCisgICAgKGRlY2xhcmUgKHRlbXBvcmFyeSkgYm9vbCByZXR1cm5fZmxhZykKKyAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDApKSkKKyAgICAobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX3ZhbHVlKSAoY29uc3RhbnQgZmxvYXQgKDIuMDAwMDAwKSkpCisgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgIGJyZWFrKSkKKyAgICAoaWYgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpICgpCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDMuMDAwMDAwKSkpCisgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fdmFsdWUpIChjb25zdGFudCBmbG9hdCAoNC4wMDAwMDApKSkKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKSkpCisgICAgKHJldHVybiAodmFyX3JlZiByZXR1cm5fdmFsdWUpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX25vbl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX3JldHVybl9hbmRfYnJlYWsub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm5fYW5kX2JyZWFrLm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZWVmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm5fYW5kX2JyZWFrLm9wdF90ZXN0CkBAIC0wLDAgKzEsMTYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY3JlYXRlX3Rlc3RfY2FzZXMucHkuCisjCisjIFRlc3QgdGhhdCBhIG5vbi12b2lkIHJldHVybiBhdCB0aGUgZW5kIG9mIGEgbG9vcCBpcworIyBwcm9wZXJseSBsb3dlcmVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAxLCAwLCAwLCAxKScgPDxFT0YKKygoZGVjbGFyZSAob3V0KSBmbG9hdCBhKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBiKQorIChmdW5jdGlvbiBzdWIKKyAgKHNpZ25hdHVyZSBmbG9hdCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKQorICAgICAgKHJldHVybiAoY29uc3RhbnQgZmxvYXQgKDIuMDAwMDAwKSkpKSkKKyAgICAoYXNzaWduICh4KSAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDMuMDAwMDAwKSkpCisgICAgKHJldHVybiAoY29uc3RhbnQgZmxvYXQgKDQuMDAwMDAwKSkpKSkpKQorRU9GCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl9ub25fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm5fYW5kX2JyZWFrLm9wdF90ZXN0LmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fbm9uX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuX2FuZF9icmVhay5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJjYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fbm9uX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuX2FuZF9icmVhay5vcHRfdGVzdC5leHBlY3RlZApAQCAtMCwwICsxLDE5IEBACisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkgKGRlY2xhcmUgKG91dCkgZmxvYXQgYikKKyAoZnVuY3Rpb24gc3ViCisgIChzaWduYXR1cmUgZmxvYXQgKHBhcmFtZXRlcnMpCisgICAoKGRlY2xhcmUgKHRlbXBvcmFyeSkgYm9vbCBleGVjdXRlX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgZXhlY3V0ZV9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgIChkZWNsYXJlICh0ZW1wb3JhcnkpIGZsb2F0IHJldHVybl92YWx1ZSkKKyAgICAoZGVjbGFyZSAodGVtcG9yYXJ5KSBib29sIHJldHVybl9mbGFnKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKQorICAgIChsb29wCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpCisgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fdmFsdWUpIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgYnJlYWspKQorICAgIChpZiAodmFyX3JlZiByZXR1cm5fZmxhZykgKCkKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMy4wMDAwMDApKSkKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl92YWx1ZSkgKGNvbnN0YW50IGZsb2F0ICg0LjAwMDAwMCkpKQorICAgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpIChjb25zdGFudCBib29sICgxKSkpCisgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiBleGVjdXRlX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpKSkKKyAgICAocmV0dXJuICh2YXJfcmVmIHJldHVybl92YWx1ZSkpKSkpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9ub3RoaW5nLm9wdF90ZXN0IGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9ub3RoaW5nLm9wdF90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDgyODIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX25vdGhpbmcub3B0X3Rlc3QKQEAgLTAsMCArMSwxNCBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS4KKyMKKyMgVGVzdCB0aGF0IGEgcmV0dXJuIG9mIHZvaWQgYXQgdGhlIGVuZCBvZiBhIGxvb3AgaXMgcHJvcGVybHkKKyMgbG93ZXJlZC4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMCwgMCwgMCwgMCknIDw8RU9GCisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkgKGRlY2xhcmUgKG91dCkgZmxvYXQgYikKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkgKHJldHVybikpKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkpKSkpCitFT0YKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfbm90aGluZy5vcHRfdGVzdC5leHBlY3RlZCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfbm90aGluZy5vcHRfdGVzdC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjkyMTNlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9ub3RoaW5nLm9wdF90ZXN0LmV4cGVjdGVkCkBAIC0wLDAgKzEsNiBAQAorKChkZWNsYXJlIChvdXQpIGZsb2F0IGEpIChkZWNsYXJlIChvdXQpIGZsb2F0IGIpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChsb29wCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpIChyZXR1cm4pKSkKKyAgICAoYXNzaWduICh4KSAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDIuMDAwMDAwKSkpKSkpKQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm4ub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX3JldHVybi5vcHRfdGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2U2NWM4Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm4ub3B0X3Rlc3QKQEAgLTAsMCArMSwxNCBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBjcmVhdGVfdGVzdF9jYXNlcy5weS4KKyMKKyMgVGVzdCB0aGF0IGEgcmV0dXJuIG9mIHZvaWQgYXQgdGhlIGVuZCBvZiBhIGxvb3AgaXMgcHJvcGVybHkKKyMgbG93ZXJlZC4KKy4uLy4uL2dsc2xfdGVzdCBvcHRwYXNzIC0tcXVpZXQgLS1pbnB1dC1pciAnZG9fbG93ZXJfanVtcHMoMCwgMCwgMSwgMCwgMCknIDw8RU9GCisoKGRlY2xhcmUgKG91dCkgZmxvYXQgYSkgKGRlY2xhcmUgKG91dCkgZmxvYXQgYikKKyAoZnVuY3Rpb24gbWFpbgorICAoc2lnbmF0dXJlIHZvaWQgKHBhcmFtZXRlcnMpCisgICAoKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkgKHJldHVybikpKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkpKSkpCitFT0YKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuLm9wdF90ZXN0LmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm4ub3B0X3Rlc3QuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmM2FlYwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuLm9wdF90ZXN0LmV4cGVjdGVkCkBAIC0wLDAgKzEsMTEgQEAKKygoZGVjbGFyZSAob3V0KSBmbG9hdCBhKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBiKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgoZGVjbGFyZSAodGVtcG9yYXJ5KSBib29sIHJldHVybl9mbGFnKQorICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMCkpKQorICAgIChsb29wCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBhKSAoY29uc3RhbnQgZmxvYXQgKDEuMDAwMDAwKSkpCisgICAgICAoYXNzaWduICh4KSAodmFyX3JlZiByZXR1cm5fZmxhZykgKGNvbnN0YW50IGJvb2wgKDEpKSkKKyAgICAgIGJyZWFrKSkKKyAgICAoaWYgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpICgpCisgICAgICgoYXNzaWduICh4KSAodmFyX3JlZiBiKSAoY29uc3RhbnQgZmxvYXQgKDIuMDAwMDAwKSkpKSkpKSkpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX3JldHVybl9hbmRfYnJlYWsub3B0X3Rlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX3JldHVybl9hbmRfYnJlYWsub3B0X3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1ZWZlNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvbG93ZXJfanVtcHMvcmV0dXJuX3ZvaWRfYXRfZW5kX29mX2xvb3BfbG93ZXJfcmV0dXJuX2FuZF9icmVhay5vcHRfdGVzdApAQCAtMCwwICsxLDE0IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV90ZXN0X2Nhc2VzLnB5LgorIworIyBUZXN0IHRoYXQgYSByZXR1cm4gb2Ygdm9pZCBhdCB0aGUgZW5kIG9mIGEgbG9vcCBpcyBwcm9wZXJseQorIyBsb3dlcmVkLgorLi4vLi4vZ2xzbF90ZXN0IG9wdHBhc3MgLS1xdWlldCAtLWlucHV0LWlyICdkb19sb3dlcl9qdW1wcygwLCAwLCAxLCAwLCAxKScgPDxFT0YKKygoZGVjbGFyZSAob3V0KSBmbG9hdCBhKSAoZGVjbGFyZSAob3V0KSBmbG9hdCBiKQorIChmdW5jdGlvbiBtYWluCisgIChzaWduYXR1cmUgdm9pZCAocGFyYW1ldGVycykKKyAgICgobG9vcAorICAgICAoKGFzc2lnbiAoeCkgKHZhcl9yZWYgYSkgKGNvbnN0YW50IGZsb2F0ICgxLjAwMDAwMCkpKSAocmV0dXJuKSkpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgYikgKGNvbnN0YW50IGZsb2F0ICgyLjAwMDAwMCkpKSkpKSkKK0VPRgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm5fYW5kX2JyZWFrLm9wdF90ZXN0LmV4cGVjdGVkIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9sb3dlcl9qdW1wcy9yZXR1cm5fdm9pZF9hdF9lbmRfb2ZfbG9vcF9sb3dlcl9yZXR1cm5fYW5kX2JyZWFrLm9wdF90ZXN0LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjNhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL2xvd2VyX2p1bXBzL3JldHVybl92b2lkX2F0X2VuZF9vZl9sb29wX2xvd2VyX3JldHVybl9hbmRfYnJlYWsub3B0X3Rlc3QuZXhwZWN0ZWQKQEAgLTAsMCArMSwxMSBAQAorKChkZWNsYXJlIChvdXQpIGZsb2F0IGEpIChkZWNsYXJlIChvdXQpIGZsb2F0IGIpCisgKGZ1bmN0aW9uIG1haW4KKyAgKHNpZ25hdHVyZSB2b2lkIChwYXJhbWV0ZXJzKQorICAgKChkZWNsYXJlICh0ZW1wb3JhcnkpIGJvb2wgcmV0dXJuX2ZsYWcpCisgICAgKGFzc2lnbiAoeCkgKHZhcl9yZWYgcmV0dXJuX2ZsYWcpIChjb25zdGFudCBib29sICgwKSkpCisgICAgKGxvb3AKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGEpIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSkKKyAgICAgIChhc3NpZ24gKHgpICh2YXJfcmVmIHJldHVybl9mbGFnKSAoY29uc3RhbnQgYm9vbCAoMSkpKQorICAgICAgYnJlYWspKQorICAgIChpZiAodmFyX3JlZiByZXR1cm5fZmxhZykgKCkKKyAgICAgKChhc3NpZ24gKHgpICh2YXJfcmVmIGIpIChjb25zdGFudCBmbG9hdCAoMi4wMDAwMDApKSkpKSkpKSkKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvb3B0aW1pemF0aW9uLXRlc3QgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL29wdGltaXphdGlvbi10ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTc3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL29wdGltaXphdGlvbi10ZXN0CkBAIC0wLDAgKzEsMzQgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworaWYgWyAhIC16ICIkc3JjZGlyIiBdOyB0aGVuCisgICBjb21wYXJlX2lyPWBwd2RgL3Rlc3RzL2NvbXBhcmVfaXIKK2Vsc2UKKyAgIGNvbXBhcmVfaXI9Li9jb21wYXJlX2lyCitmaQorCit0b3RhbD0wCitwYXNzPTAKKworZWNobyAiPT09PT09IFRlc3Rpbmcgb3B0aW1pemF0aW9uIHBhc3NlcyA9PT09PT0iCitmb3IgdGVzdCBpbiBgZmluZCAuIC1pbmFtZSAnKi5vcHRfdGVzdCdgOyBkbworICAgIGVjaG8gLW4gIlRlc3RpbmcgJHRlc3QuLi4iCisgICAgKGNkIGBkaXJuYW1lICIkdGVzdCJgOyAuL2BiYXNlbmFtZSAiJHRlc3QiYCkgPiAiJHRlc3Qub3V0IiAyPiYxCisgICAgdG90YWw9JCgodG90YWwrMSkpCisgICAgaWYgJFBZVEhPTjIgJFBZVEhPTl9GTEFHUyAkY29tcGFyZV9pciAiJHRlc3QuZXhwZWN0ZWQiICIkdGVzdC5vdXQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICBlY2hvICJQQVNTIgorICAgICAgICBwYXNzPSQoKHBhc3MrMSkpCisgICAgZWxzZQorICAgICAgICBlY2hvICJGQUlMIgorICAgICAgICAkUFlUSE9OMiAkUFlUSE9OX0ZMQUdTICRjb21wYXJlX2lyICIkdGVzdC5leHBlY3RlZCIgIiR0ZXN0Lm91dCIKKyAgICBmaQorZG9uZQorCitlY2hvICIiCitlY2hvICIkcGFzcy8kdG90YWwgdGVzdHMgcmV0dXJuZWQgY29ycmVjdCByZXN1bHRzIgorZWNobyAiIgorCitpZiBbWyAkcGFzcyA9PSAkdG90YWwgXV07IHRoZW4KKyAgICBleGl0IDAKK2Vsc2UKKyAgICBleGl0IDEKK2ZpCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL3JhbGxvY190ZXN0LmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvcmFsbG9jX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTg3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL3JhbGxvY190ZXN0LmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicmFsbG9jLmgiCisKKy8qKgorICogXG5hbWUgQmFzaWMgZnVuY3Rpb25hbGl0eQorICovCisvKkB7Ki8KK1RFU1QocmFsbG9jX3Rlc3QsIG51bGxfcGFyZW50KQoreworICAgdm9pZCAqbWVtX2N0eCA9IHJhbGxvY19jb250ZXh0KE5VTEwpOworCisgICBFWFBFQ1RfRVEoTlVMTCwgcmFsbG9jX3BhcmVudChtZW1fY3R4KSk7Cit9CisvKkB9Ki8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvc2FtcGxlcl90eXBlc190ZXN0LmNwcCBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvc2FtcGxlcl90eXBlc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQzMjlhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9zYW1wbGVyX3R5cGVzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgIm1haW4vY29tcGlsZXIuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicmFsbG9jLmgiCisjaW5jbHVkZSAiaXIuaCIKKworLyoqCisgKiBcZmlsZSBzYW1wbGVyX3R5cGVzX3Rlc3QuY3BwCisgKgorICogVGVzdCB0aGF0IGJ1aWx0LWluIHNhbXBsZXIgdHlwZXMgaGF2ZSB0aGUgcmlnaHQgcHJvcGVydGllcy4KKyAqLworCisjZGVmaW5lIEFSUkFZICAgIEVYUEVDVF9UUlVFKHR5cGUtPnNhbXBsZXJfYXJyYXkpOworI2RlZmluZSBOT05BUlJBWSBFWFBFQ1RfRkFMU0UodHlwZS0+c2FtcGxlcl9hcnJheSk7CisjZGVmaW5lIFNIQURPVyAgIEVYUEVDVF9UUlVFKHR5cGUtPnNhbXBsZXJfc2hhZG93KTsKKyNkZWZpbmUgQ09MT1IgICAgRVhQRUNUX0ZBTFNFKHR5cGUtPnNhbXBsZXJfc2hhZG93KTsKKworI2RlZmluZSBUKFRZUEUsIERJTSwgREFUQV9UWVBFLCBBUlIsIFNIQUQsIENPTVBTKSAgICAgICAgICAgXAorVEVTVChzYW1wbGVyX3R5cGVzLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgY29uc3QgZ2xzbF90eXBlICp0eXBlID0gZ2xzbF90eXBlOjpUWVBFIyNfdHlwZTsgICAgICAgICAgXAorICAgRVhQRUNUX0VRKEdMU0xfVFlQRV9TQU1QTEVSLCB0eXBlLT5iYXNlX3R5cGUpOyAgICAgICAgICAgXAorICAgRVhQRUNUX0VRKERJTSwgdHlwZS0+c2FtcGxlcl9kaW1lbnNpb25hbGl0eSk7ICAgICAgICAgICAgXAorICAgRVhQRUNUX0VRKERBVEFfVFlQRSwgdHlwZS0+c2FtcGxlcl90eXBlKTsgICAgICAgICAgICAgICAgXAorICAgQVJSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgU0hBRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgRVhQRUNUX0VRKENPTVBTLCB0eXBlLT5jb29yZGluYXRlX2NvbXBvbmVudHMoKSk7ICAgICAgICAgXAorfQorCitUKCBzYW1wbGVyMUQsICAgICAgICBHTFNMX1NBTVBMRVJfRElNXzFELCAgIEdMU0xfVFlQRV9GTE9BVCwgTk9OQVJSQVksIENPTE9SLCAgMSkKK1QoIHNhbXBsZXIyRCwgICAgICAgIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgR0xTTF9UWVBFX0ZMT0FULCBOT05BUlJBWSwgQ09MT1IsICAyKQorVCggc2FtcGxlcjNELCAgICAgICAgR0xTTF9TQU1QTEVSX0RJTV8zRCwgICBHTFNMX1RZUEVfRkxPQVQsIE5PTkFSUkFZLCBDT0xPUiwgIDMpCitUKCBzYW1wbGVyQ3ViZSwgICAgICBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIEdMU0xfVFlQRV9GTE9BVCwgTk9OQVJSQVksIENPTE9SLCAgMykKK1QoIHNhbXBsZXIxREFycmF5LCAgIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgR0xTTF9UWVBFX0ZMT0FULCBBUlJBWSwgICAgQ09MT1IsICAyKQorVCggc2FtcGxlcjJEQXJyYXksICAgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICBHTFNMX1RZUEVfRkxPQVQsIEFSUkFZLCAgICBDT0xPUiwgIDMpCitUKCBzYW1wbGVyQ3ViZUFycmF5LCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIEdMU0xfVFlQRV9GTE9BVCwgQVJSQVksICAgIENPTE9SLCAgNCkKK1QoIHNhbXBsZXIyRFJlY3QsICAgIEdMU0xfU0FNUExFUl9ESU1fUkVDVCwgR0xTTF9UWVBFX0ZMT0FULCBOT05BUlJBWSwgQ09MT1IsICAyKQorVCggc2FtcGxlckJ1ZmZlciwgICAgR0xTTF9TQU1QTEVSX0RJTV9CVUYsICBHTFNMX1RZUEVfRkxPQVQsIE5PTkFSUkFZLCBDT0xPUiwgIDEpCitUKCBzYW1wbGVyMkRNUywgICAgICBHTFNMX1NBTVBMRVJfRElNX01TLCAgIEdMU0xfVFlQRV9GTE9BVCwgTk9OQVJSQVksIENPTE9SLCAgMikKK1QoIHNhbXBsZXIyRE1TQXJyYXksIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgR0xTTF9UWVBFX0ZMT0FULCBBUlJBWSwgICAgQ09MT1IsICAzKQorVChpc2FtcGxlcjFELCAgICAgICAgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICBHTFNMX1RZUEVfSU5ULCAgIE5PTkFSUkFZLCBDT0xPUiwgIDEpCitUKGlzYW1wbGVyMkQsICAgICAgICBHTFNMX1NBTVBMRVJfRElNXzJELCAgIEdMU0xfVFlQRV9JTlQsICAgTk9OQVJSQVksIENPTE9SLCAgMikKK1QoaXNhbXBsZXIzRCwgICAgICAgIEdMU0xfU0FNUExFUl9ESU1fM0QsICAgR0xTTF9UWVBFX0lOVCwgICBOT05BUlJBWSwgQ09MT1IsICAzKQorVChpc2FtcGxlckN1YmUsICAgICAgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCBHTFNMX1RZUEVfSU5ULCAgIE5PTkFSUkFZLCBDT0xPUiwgIDMpCitUKGlzYW1wbGVyMURBcnJheSwgICBHTFNMX1NBTVBMRVJfRElNXzFELCAgIEdMU0xfVFlQRV9JTlQsICAgQVJSQVksICAgIENPTE9SLCAgMikKK1QoaXNhbXBsZXIyREFycmF5LCAgIEdMU0xfU0FNUExFUl9ESU1fMkQsICAgR0xTTF9UWVBFX0lOVCwgICBBUlJBWSwgICAgQ09MT1IsICAzKQorVChpc2FtcGxlckN1YmVBcnJheSwgR0xTTF9TQU1QTEVSX0RJTV9DVUJFLCBHTFNMX1RZUEVfSU5ULCAgIEFSUkFZLCAgICBDT0xPUiwgIDQpCitUKGlzYW1wbGVyMkRSZWN0LCAgICBHTFNMX1NBTVBMRVJfRElNX1JFQ1QsIEdMU0xfVFlQRV9JTlQsICAgTk9OQVJSQVksIENPTE9SLCAgMikKK1QoaXNhbXBsZXJCdWZmZXIsICAgIEdMU0xfU0FNUExFUl9ESU1fQlVGLCAgR0xTTF9UWVBFX0lOVCwgICBOT05BUlJBWSwgQ09MT1IsICAxKQorVChpc2FtcGxlcjJETVMsICAgICAgR0xTTF9TQU1QTEVSX0RJTV9NUywgICBHTFNMX1RZUEVfSU5ULCAgIE5PTkFSUkFZLCBDT0xPUiwgIDIpCitUKGlzYW1wbGVyMkRNU0FycmF5LCBHTFNMX1NBTVBMRVJfRElNX01TLCAgIEdMU0xfVFlQRV9JTlQsICAgQVJSQVksICAgIENPTE9SLCAgMykKK1QodXNhbXBsZXIxRCwgICAgICAgIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgR0xTTF9UWVBFX1VJTlQsICBOT05BUlJBWSwgQ09MT1IsICAxKQorVCh1c2FtcGxlcjJELCAgICAgICAgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICBHTFNMX1RZUEVfVUlOVCwgIE5PTkFSUkFZLCBDT0xPUiwgIDIpCitUKHVzYW1wbGVyM0QsICAgICAgICBHTFNMX1NBTVBMRVJfRElNXzNELCAgIEdMU0xfVFlQRV9VSU5ULCAgTk9OQVJSQVksIENPTE9SLCAgMykKK1QodXNhbXBsZXJDdWJlLCAgICAgIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgR0xTTF9UWVBFX1VJTlQsICBOT05BUlJBWSwgQ09MT1IsICAzKQorVCh1c2FtcGxlcjFEQXJyYXksICAgR0xTTF9TQU1QTEVSX0RJTV8xRCwgICBHTFNMX1RZUEVfVUlOVCwgIEFSUkFZLCAgICBDT0xPUiwgIDIpCitUKHVzYW1wbGVyMkRBcnJheSwgICBHTFNMX1NBTVBMRVJfRElNXzJELCAgIEdMU0xfVFlQRV9VSU5ULCAgQVJSQVksICAgIENPTE9SLCAgMykKK1QodXNhbXBsZXJDdWJlQXJyYXksIEdMU0xfU0FNUExFUl9ESU1fQ1VCRSwgR0xTTF9UWVBFX1VJTlQsICBBUlJBWSwgICAgQ09MT1IsICA0KQorVCh1c2FtcGxlcjJEUmVjdCwgICAgR0xTTF9TQU1QTEVSX0RJTV9SRUNULCBHTFNMX1RZUEVfVUlOVCwgIE5PTkFSUkFZLCBDT0xPUiwgIDIpCitUKHVzYW1wbGVyQnVmZmVyLCAgICBHTFNMX1NBTVBMRVJfRElNX0JVRiwgIEdMU0xfVFlQRV9VSU5ULCAgTk9OQVJSQVksIENPTE9SLCAgMSkKK1QodXNhbXBsZXIyRE1TLCAgICAgIEdMU0xfU0FNUExFUl9ESU1fTVMsICAgR0xTTF9UWVBFX1VJTlQsICBOT05BUlJBWSwgQ09MT1IsICAyKQorVCh1c2FtcGxlcjJETVNBcnJheSwgR0xTTF9TQU1QTEVSX0RJTV9NUywgICBHTFNMX1RZUEVfVUlOVCwgIEFSUkFZLCAgICBDT0xPUiwgIDMpCisKK1Qoc2FtcGxlcjFEU2hhZG93LCAgIEdMU0xfU0FNUExFUl9ESU1fMUQsICAgR0xTTF9UWVBFX0ZMT0FULCBOT05BUlJBWSwgU0hBRE9XLCAxKQorVChzYW1wbGVyMkRTaGFkb3csICAgR0xTTF9TQU1QTEVSX0RJTV8yRCwgICBHTFNMX1RZUEVfRkxPQVQsIE5PTkFSUkFZLCBTSEFET1csIDIpCitUKHNhbXBsZXJDdWJlU2hhZG93LCBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIEdMU0xfVFlQRV9GTE9BVCwgTk9OQVJSQVksIFNIQURPVywgMykKKworVChzYW1wbGVyMURBcnJheVNoYWRvdywKKyAgR0xTTF9TQU1QTEVSX0RJTV8xRCwgR0xTTF9UWVBFX0ZMT0FULCBBUlJBWSwgU0hBRE9XLCAyKQorVChzYW1wbGVyMkRBcnJheVNoYWRvdywKKyAgR0xTTF9TQU1QTEVSX0RJTV8yRCwgR0xTTF9UWVBFX0ZMT0FULCBBUlJBWSwgU0hBRE9XLCAzKQorVChzYW1wbGVyQ3ViZUFycmF5U2hhZG93LAorICBHTFNMX1NBTVBMRVJfRElNX0NVQkUsIEdMU0xfVFlQRV9GTE9BVCwgQVJSQVksIFNIQURPVywgNCkKK1Qoc2FtcGxlcjJEUmVjdFNoYWRvdywKKyAgR0xTTF9TQU1QTEVSX0RJTV9SRUNULCBHTFNMX1RZUEVfRkxPQVQsIE5PTkFSUkFZLCBTSEFET1csIDIpCisKK1Qoc2FtcGxlckV4dGVybmFsT0VTLAorICBHTFNMX1NBTVBMRVJfRElNX0VYVEVSTkFMLCBHTFNMX1RZUEVfRkxPQVQsIE5PTkFSUkFZLCBDT0xPUiwgMikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXJfdGVzdHMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy9zZXRfdW5pZm9ybV9pbml0aWFsaXplcl90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMDJiMwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXJfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNTkzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgIm1haW4vY29tcGlsZXIuaCIKKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicmFsbG9jLmgiCisjaW5jbHVkZSAidW5pZm9ybV9pbml0aWFsaXplcl91dGlscy5oIgorCituYW1lc3BhY2UgbGlua2VyIHsKK2V4dGVybiB2b2lkCitzZXRfdW5pZm9ybV9pbml0aWFsaXplcih2b2lkICptZW1fY3R4LCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZywKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKwkJCWlyX2NvbnN0YW50ICp2YWwpOworfQorCitjbGFzcyBzZXRfdW5pZm9ybV9pbml0aWFsaXplciA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKworICAgLyoqCisgICAgKiBJbmRleCBvZiB0aGUgdW5pZm9ybSB0byBiZSB0ZXN0ZWQuCisgICAgKgorICAgICogQWxsIG9mIHRoZSBcYyBzZXRfdW5pZm9ybV9pbml0aWFsaXplciB0ZXN0cyBjcmVhdGUgc2V2ZXJhbCBzbG90cyBmb3IKKyAgICAqIHVuaWZyb21zLiAgQWxsIGJ1dCBvbmUgb2YgdGhlIHNsb3RzIGlzIGZha2UuICBUaGlzIGZpZWxkIGhvbGRzIHRoZSBpbmRleAorICAgICogb2YgdGhlIHNsb3QgZm9yIHRoZSB1bmlmb3JtIGJlaW5nIHRlc3RlZC4KKyAgICAqLworICAgdW5zaWduZWQgYWN0dWFsX2luZGV4OworCisgICAvKioKKyAgICAqIE5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gYmUgdGVzdGVkLgorICAgICovCisgICBjb25zdCBjaGFyICpuYW1lOworCisgICAvKioKKyAgICAqIFNoYWRlciBwcm9ncmFtIHVzZWQgaW4gdGhlIHRlc3QuCisgICAgKi8KKyAgIHN0cnVjdCBnbF9zaGFkZXJfcHJvZ3JhbSAqcHJvZzsKKworICAgLyoqCisgICAgKiBSYWxsb2MgbWVtb3J5IGNvbnRleHQgdXNlZCBmb3IgYWxsIHRlbXBvcmFyeSBhbGxvY2F0aW9ucy4KKyAgICAqLworICAgdm9pZCAqbWVtX2N0eDsKK307CisKK3ZvaWQKK3NldF91bmlmb3JtX2luaXRpYWxpemVyOjpTZXRVcCgpCit7CisgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICB0aGlzLT5wcm9nID0gcnphbGxvYyhOVUxMLCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0pOworCisgICAvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgdXNlZCBieSB0aGUgdGVzdCBjYXNlcy4KKyAgICAqLworICAgdGhpcy0+YWN0dWFsX2luZGV4ID0gMTsKKyAgIHRoaXMtPm5hbWUgPSAiaSI7Cit9CisKK3ZvaWQKK3NldF91bmlmb3JtX2luaXRpYWxpemVyOjpUZWFyRG93bigpCit7CisgICByYWxsb2NfZnJlZSh0aGlzLT5tZW1fY3R4KTsKKyAgIHRoaXMtPm1lbV9jdHggPSBOVUxMOworCisgICByYWxsb2NfZnJlZSh0aGlzLT5wcm9nKTsKKyAgIHRoaXMtPnByb2cgPSBOVUxMOworfQorCisvKioKKyAqIENyZWF0ZSBzb21lIHVuaWZvcm0gc3RvcmFnZSBmb3IgYSBwcm9ncmFtLgorICoKKyAqIFxwYXJhbSBwcm9nICAgICAgICAgIFByb2dyYW0gdG8gZ2V0IHNvbWUgc3RvcmFnZQorICogXHBhcmFtIG51bV9zdG9yYWdlICAgVG90YWwgbnVtYmVyIG9mIHN0b3JhZ2Ugc2xvdHMKKyAqIFxwYXJhbSBpbmRleF90b19zZXQgIFN0b3JhZ2Ugc2xvdCB0aGF0IHdpbGwgYWN0dWFsbHkgZ2V0IGEgdmFsdWUKKyAqIFxwYXJhbSBuYW1lICAgICAgICAgIE5hbWUgZm9yIHRoZSBhY3R1YWwgc3RvcmFnZSBzbG90CisgKiBccGFyYW0gdHlwZSAgICAgICAgICBUeXBlIGZvciB0aGUgZWxlbWVudHMgb2YgdGhlIGFjdHVhbCBzdG9yYWdlIHNsb3QKKyAqIFxwYXJhbSBhcnJheV9zaXplICAgIFNpemUgZm9yIHRoZSBhcnJheSBvZiB0aGUgYWN0dWFsIHN0b3JhZ2Ugc2xvdC4gIFRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB6ZXJvIGZvciBub24tYXJyYXlzLgorICovCitzdGF0aWMgdW5zaWduZWQKK2VzdGFibGlzaF91bmlmb3JtX3N0b3JhZ2Uoc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLCB1bnNpZ25lZCBudW1fc3RvcmFnZSwKKwkJCSAgdW5zaWduZWQgaW5kZXhfdG9fc2V0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICBjb25zdCBnbHNsX3R5cGUgKnR5cGUsIHVuc2lnbmVkIGFycmF5X3NpemUpCit7CisgICBjb25zdCB1bnNpZ25lZCBlbGVtZW50cyA9IE1BWDIoMSwgYXJyYXlfc2l6ZSk7CisgICBjb25zdCB1bnNpZ25lZCBkYXRhX2NvbXBvbmVudHMgPSBlbGVtZW50cyAqIHR5cGUtPmNvbXBvbmVudHMoKTsKKyAgIGNvbnN0IHVuc2lnbmVkIHRvdGFsX2NvbXBvbmVudHMgPSBNQVgyKDE3LCAoZGF0YV9jb21wb25lbnRzCisJCQkJCSAgICAgICArIHR5cGUtPmNvbXBvbmVudHMoKSkpOworICAgY29uc3QgdW5zaWduZWQgcmVkX3pvbmVfY29tcG9uZW50cyA9IHRvdGFsX2NvbXBvbmVudHMgLSBkYXRhX2NvbXBvbmVudHM7CisKKyAgIHByb2ctPlVuaWZvcm1TdG9yYWdlID0gcnphbGxvY19hcnJheShwcm9nLCBzdHJ1Y3QgZ2xfdW5pZm9ybV9zdG9yYWdlLAorCQkJCQludW1fc3RvcmFnZSk7CisgICBwcm9nLT5OdW1Vc2VyVW5pZm9ybVN0b3JhZ2UgPSBudW1fc3RvcmFnZTsKKworICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaW5kZXhfdG9fc2V0XS5uYW1lID0gKGNoYXIgKikgbmFtZTsKKyAgIHByb2ctPlVuaWZvcm1TdG9yYWdlW2luZGV4X3RvX3NldF0udHlwZSA9IHR5cGU7CisgICBwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpbmRleF90b19zZXRdLmFycmF5X2VsZW1lbnRzID0gYXJyYXlfc2l6ZTsKKyAgIHByb2ctPlVuaWZvcm1TdG9yYWdlW2luZGV4X3RvX3NldF0uaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgIGZvciAoaW50IHNoID0gMDsgc2ggPCBNRVNBX1NIQURFUl9TVEFHRVM7IHNoKyspIHsKKyAgICAgIHByb2ctPlVuaWZvcm1TdG9yYWdlW2luZGV4X3RvX3NldF0uc2FtcGxlcltzaF0uaW5kZXggPSB+MDsKKyAgICAgIHByb2ctPlVuaWZvcm1TdG9yYWdlW2luZGV4X3RvX3NldF0uc2FtcGxlcltzaF0uYWN0aXZlID0gZmFsc2U7CisgICB9CisgICBwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpbmRleF90b19zZXRdLm51bV9kcml2ZXJfc3RvcmFnZSA9IDA7CisgICBwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpbmRleF90b19zZXRdLmRyaXZlcl9zdG9yYWdlID0gTlVMTDsKKyAgIHByb2ctPlVuaWZvcm1TdG9yYWdlW2luZGV4X3RvX3NldF0uc3RvcmFnZSA9CisgICAgICByemFsbG9jX2FycmF5KHByb2csIHVuaW9uIGdsX2NvbnN0YW50X3ZhbHVlLCB0b3RhbF9jb21wb25lbnRzKTsKKworICAgZmlsbF9zdG9yYWdlX2FycmF5X3dpdGhfc2VudGluZWxzKHByb2ctPlVuaWZvcm1TdG9yYWdlW2luZGV4X3RvX3NldF0uc3RvcmFnZSwKKwkJCQkgICAgIGRhdGFfY29tcG9uZW50cywKKwkJCQkgICAgIHJlZF96b25lX2NvbXBvbmVudHMpOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3N0b3JhZ2U7IGkrKykgeworICAgICAgaWYgKGkgPT0gaW5kZXhfdG9fc2V0KQorCSBjb250aW51ZTsKKworICAgICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0ubmFtZSA9IChjaGFyICopICJpbnZhbGlkIHNsb3QiOworICAgICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0udHlwZSA9IGdsc2xfdHlwZTo6dm9pZF90eXBlOworICAgICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0uYXJyYXlfZWxlbWVudHMgPSAwOworICAgICAgcHJvZy0+VW5pZm9ybVN0b3JhZ2VbaV0uaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoaW50IHNoID0gMDsgc2ggPCBNRVNBX1NIQURFUl9TVEFHRVM7IHNoKyspIHsKKyAgICAgICAgIHByb2ctPlVuaWZvcm1TdG9yYWdlW2ldLnNhbXBsZXJbc2hdLmluZGV4ID0gfjA7CisgICAgICAgICBwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpXS5zYW1wbGVyW3NoXS5hY3RpdmUgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHByb2ctPlVuaWZvcm1TdG9yYWdlW2ldLm51bV9kcml2ZXJfc3RvcmFnZSA9IDA7CisgICAgICBwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpXS5kcml2ZXJfc3RvcmFnZSA9IE5VTEw7CisgICAgICBwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpXS5zdG9yYWdlID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIHJlZF96b25lX2NvbXBvbmVudHM7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgdGhlIGNvcnJlY3QgdW5pZm9ybSBpcyBtYXJrZWQgYXMgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQuCisgKi8KK3N0YXRpYyB2b2lkCit2ZXJpZnlfaW5pdGlhbGl6YXRpb24oc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLCB1bnNpZ25lZCBhY3R1YWxfaW5kZXgpCit7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvZy0+TnVtVXNlclVuaWZvcm1TdG9yYWdlOyBpKyspIHsKKyAgICAgIGlmIChpID09IGFjdHVhbF9pbmRleCkgeworCSBFWFBFQ1RfVFJVRShwcm9nLT5Vbmlmb3JtU3RvcmFnZVthY3R1YWxfaW5kZXhdLmluaXRpYWxpemVkKTsKKyAgICAgIH0gZWxzZSB7CisJIEVYUEVDVF9GQUxTRShwcm9nLT5Vbmlmb3JtU3RvcmFnZVtpXS5pbml0aWFsaXplZCk7CisgICAgICB9CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitub25fYXJyYXlfdGVzdCh2b2lkICptZW1fY3R4LCBzdHJ1Y3QgZ2xfc2hhZGVyX3Byb2dyYW0gKnByb2csCisJICAgICAgIHVuc2lnbmVkIGFjdHVhbF9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgZW51bSBnbHNsX2Jhc2VfdHlwZSBiYXNlX3R5cGUsCisJICAgICAgIHVuc2lnbmVkIGNvbHVtbnMsIHVuc2lnbmVkIHJvd3MpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHR5cGUgPQorICAgICAgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoYmFzZV90eXBlLCByb3dzLCBjb2x1bW5zKTsKKworICAgdW5zaWduZWQgcmVkX3pvbmVfY29tcG9uZW50cyA9CisgICAgICBlc3RhYmxpc2hfdW5pZm9ybV9zdG9yYWdlKHByb2csIDMsIGFjdHVhbF9pbmRleCwgbmFtZSwgdHlwZSwgMCk7CisKKyAgIGlyX2NvbnN0YW50ICp2YWw7CisgICBnZW5lcmF0ZV9kYXRhKG1lbV9jdHgsIGJhc2VfdHlwZSwgY29sdW1ucywgcm93cywgdmFsKTsKKworICAgbGlua2VyOjpzZXRfdW5pZm9ybV9pbml0aWFsaXplcihtZW1fY3R4LCBwcm9nLCBuYW1lLCB0eXBlLCB2YWwpOworCisgICB2ZXJpZnlfaW5pdGlhbGl6YXRpb24ocHJvZywgYWN0dWFsX2luZGV4KTsKKyAgIHZlcmlmeV9kYXRhKHByb2ctPlVuaWZvcm1TdG9yYWdlW2FjdHVhbF9pbmRleF0uc3RvcmFnZSwgMCwgdmFsLAorCSAgICAgICByZWRfem9uZV9jb21wb25lbnRzKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBpbnRfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgMSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaXZlYzJfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgMik7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaXZlYzNfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgMyk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaXZlYzRfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgNCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgdWludF91bmlmb3JtKQoreworICAgbm9uX2FycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfVUlOVCwgMSwgMSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgdXZlYzJfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX1VJTlQsIDEsIDIpOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIHV2ZWMzX3VuaWZvcm0pCit7CisgICBub25fYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9VSU5ULCAxLCAzKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB1dmVjNF91bmlmb3JtKQoreworICAgbm9uX2FycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfVUlOVCwgMSwgNCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgYm9vbF91bmlmb3JtKQoreworICAgbm9uX2FycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfQk9PTCwgMSwgMSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgYnZlYzJfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0JPT0wsIDEsIDIpOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIGJ2ZWMzX3VuaWZvcm0pCit7CisgICBub25fYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9CT09MLCAxLCAzKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBidmVjNF91bmlmb3JtKQoreworICAgbm9uX2FycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfQk9PTCwgMSwgNCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgZmxvYXRfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCAyKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB2ZWMyX3VuaWZvcm0pCit7CisgICBub25fYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9GTE9BVCwgMSwgMik7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgdmVjM191bmlmb3JtKQoreworICAgbm9uX2FycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfRkxPQVQsIDEsIDMpOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIHZlYzRfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCA0KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQyeDJfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAyLCAyKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQyeDNfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAyLCAzKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQyeDRfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAyLCA0KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQzeDJfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAzLCAyKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQzeDNfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAzLCAzKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQzeDRfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAzLCA0KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQ0eDJfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCA0LCAyKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQ0eDNfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCA0LCAzKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQ0eDRfdW5pZm9ybSkKK3sKKyAgIG5vbl9hcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCA0LCA0KTsKK30KKworc3RhdGljIHZvaWQKK2FycmF5X3Rlc3Qodm9pZCAqbWVtX2N0eCwgc3RydWN0IGdsX3NoYWRlcl9wcm9ncmFtICpwcm9nLAorCSAgIHVuc2lnbmVkIGFjdHVhbF9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICBlbnVtIGdsc2xfYmFzZV90eXBlIGJhc2VfdHlwZSwKKwkgICB1bnNpZ25lZCBjb2x1bW5zLCB1bnNpZ25lZCByb3dzLCB1bnNpZ25lZCBhcnJheV9zaXplLAorCSAgIHVuc2lnbmVkIGV4Y2Vzc19kYXRhX3NpemUpCit7CisgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGVsZW1lbnRfdHlwZSA9CisgICAgICBnbHNsX3R5cGU6OmdldF9pbnN0YW5jZShiYXNlX3R5cGUsIHJvd3MsIGNvbHVtbnMpOworCisgICBjb25zdCB1bnNpZ25lZCByZWRfem9uZV9jb21wb25lbnRzID0KKyAgICAgIGVzdGFibGlzaF91bmlmb3JtX3N0b3JhZ2UocHJvZywgMywgYWN0dWFsX2luZGV4LCBuYW1lLCBlbGVtZW50X3R5cGUsCisJCQkJYXJyYXlfc2l6ZSk7CisKKyAgIC8qIFRoZSBjb25zdGFudCB2YWx1ZSBnZW5lcmF0ZWQgbWF5IGhhdmUgbW9yZSBhcnJheSBlbGVtZW50cyB0aGFuIHRoZQorICAgICogdW5pZm9ybSB0aGF0IGl0IGluaXRpYWxpemVzLiAgSW4gdGhlIHJlYWwgY29tcGlsZXIgYW5kIGxpbmtlciB0aGlzIGNhbgorICAgICogaGFwcGVuIHdoZW4gYSB1bmlmb3JtIGFycmF5IGlzIGNvbXBhY3RlZCBiZWNhdXNlIHNvbWUgb2YgdGhlIHRhaWwKKyAgICAqIGVsZW1lbnRzIGFyZSBub3QgdXNlZC4gIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgb2YgdGhlIHVuaWZvcm0gd2lsbCBiZQorICAgICogbW9kaWZpZWQsIGJ1dCB0aGUgaW5pdGlhbGl6ZXIgd2lsbCBub3QuCisgICAgKi8KKyAgIGlyX2NvbnN0YW50ICp2YWw7CisgICBnZW5lcmF0ZV9hcnJheV9kYXRhKG1lbV9jdHgsIGJhc2VfdHlwZSwgY29sdW1ucywgcm93cywKKwkJICAgICAgIGFycmF5X3NpemUgKyBleGNlc3NfZGF0YV9zaXplLCB2YWwpOworCisgICBsaW5rZXI6OnNldF91bmlmb3JtX2luaXRpYWxpemVyKG1lbV9jdHgsIHByb2csIG5hbWUsIGVsZW1lbnRfdHlwZSwgdmFsKTsKKworICAgdmVyaWZ5X2luaXRpYWxpemF0aW9uKHByb2csIGFjdHVhbF9pbmRleCk7CisgICB2ZXJpZnlfZGF0YShwcm9nLT5Vbmlmb3JtU3RvcmFnZVthY3R1YWxfaW5kZXhdLnN0b3JhZ2UsIGFycmF5X3NpemUsCisJICAgICAgIHZhbCwgcmVkX3pvbmVfY29tcG9uZW50cyk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaW50X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgMSwgNCwgMCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaXZlYzJfYXJyYXlfdW5pZm9ybSkKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfSU5ULCAxLCAyLCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBpdmVjM19hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9JTlQsIDEsIDMsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIGl2ZWM0X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgNCwgNCwgMCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgdWludF9hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9VSU5ULCAxLCAxLCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB1dmVjMl9hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9VSU5ULCAxLCAyLCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB1dmVjM19hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9VSU5ULCAxLCAzLCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB1dmVjNF9hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9VSU5ULCAxLCA0LCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBib29sX2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0JPT0wsIDEsIDEsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIGJ2ZWMyX2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0JPT0wsIDEsIDIsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIGJ2ZWMzX2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0JPT0wsIDEsIDMsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIGJ2ZWM0X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0JPT0wsIDEsIDQsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIGZsb2F0X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCAxLCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB2ZWMyX2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCAyLCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB2ZWMzX2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCAzLCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB2ZWM0X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCA0LCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQyeDJfYXJyYXlfdW5pZm9ybSkKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfRkxPQVQsIDIsIDIsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIG1hdDJ4M19hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9GTE9BVCwgMiwgMywgNCwgMCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgbWF0Mng0X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAyLCA0LCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQzeDJfYXJyYXlfdW5pZm9ybSkKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfRkxPQVQsIDMsIDIsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIG1hdDN4M19hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9GTE9BVCwgMywgMywgNCwgMCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgbWF0M3g0X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAzLCA0LCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQ0eDJfYXJyYXlfdW5pZm9ybSkKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfRkxPQVQsIDQsIDIsIDQsIDApOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIG1hdDR4M19hcnJheV91bmlmb3JtKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9GTE9BVCwgNCwgMywgNCwgMCk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgbWF0NHg0X2FycmF5X3VuaWZvcm0pCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCA0LCA0LCA0LCAwKTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBpbnRfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgMSwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaXZlYzJfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgMiwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaXZlYzNfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgMywgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgaXZlYzRfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0lOVCwgMSwgNCwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgdWludF9hcnJheV91bmlmb3JtX2V4Y2Vzc19pbml0aWFsaXplcikKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfVUlOVCwgMSwgMSwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgdXZlYzJfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX1VJTlQsIDEsIDIsIDQsIDUpOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIHV2ZWMzX2FycmF5X3VuaWZvcm1fZXhjZXNzX2luaXRpYWxpemVyKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9VSU5ULCAxLCAzLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB1dmVjNF9hcnJheV91bmlmb3JtX2V4Y2Vzc19pbml0aWFsaXplcikKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfVUlOVCwgMSwgNCwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgYm9vbF9hcnJheV91bmlmb3JtX2V4Y2Vzc19pbml0aWFsaXplcikKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfQk9PTCwgMSwgMSwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgYnZlYzJfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0JPT0wsIDEsIDIsIDQsIDUpOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIGJ2ZWMzX2FycmF5X3VuaWZvcm1fZXhjZXNzX2luaXRpYWxpemVyKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9CT09MLCAxLCAzLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBidmVjNF9hcnJheV91bmlmb3JtX2V4Y2Vzc19pbml0aWFsaXplcikKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfQk9PTCwgMSwgNCwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgZmxvYXRfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCAxLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCB2ZWMyX2FycmF5X3VuaWZvcm1fZXhjZXNzX2luaXRpYWxpemVyKQoreworICAgYXJyYXlfdGVzdChtZW1fY3R4LCBwcm9nLCBhY3R1YWxfaW5kZXgsIG5hbWUsIEdMU0xfVFlQRV9GTE9BVCwgMSwgMiwgNCwgNSk7Cit9CisKK1RFU1RfRihzZXRfdW5pZm9ybV9pbml0aWFsaXplciwgdmVjM19hcnJheV91bmlmb3JtX2V4Y2Vzc19pbml0aWFsaXplcikKK3sKKyAgIGFycmF5X3Rlc3QobWVtX2N0eCwgcHJvZywgYWN0dWFsX2luZGV4LCBuYW1lLCBHTFNMX1RZUEVfRkxPQVQsIDEsIDMsIDQsIDUpOworfQorCitURVNUX0Yoc2V0X3VuaWZvcm1faW5pdGlhbGl6ZXIsIHZlYzRfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAxLCA0LCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQyeDJfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAyLCAyLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQyeDNfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAyLCAzLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQyeDRfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAyLCA0LCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQzeDJfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAzLCAyLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQzeDNfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAzLCAzLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQzeDRfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCAzLCA0LCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQ0eDJfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCA0LCAyLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQ0eDNfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCA0LCAzLCA0LCA1KTsKK30KKworVEVTVF9GKHNldF91bmlmb3JtX2luaXRpYWxpemVyLCBtYXQ0eDRfYXJyYXlfdW5pZm9ybV9leGNlc3NfaW5pdGlhbGl6ZXIpCit7CisgICBhcnJheV90ZXN0KG1lbV9jdHgsIHByb2csIGFjdHVhbF9pbmRleCwgbmFtZSwgR0xTTF9UWVBFX0ZMT0FULCA0LCA0LCA0LCA1KTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvc2V4cHMucHkgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL3NleHBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTRhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL3NleHBzLnB5CkBAIC0wLDAgKzEsMTAzIEBACisjIGNvZGluZz11dGYtOAorIworIyBDb3B5cmlnaHQgwqkgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorIyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorIyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisjIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorIyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyMgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorIyBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisjIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisjIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisjIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyMgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisjIFRoaXMgZmlsZSBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgc2V4cHMgaW4gUHl0aG9uLgorIworIyBXZSByZXByZXNlbnQgYSBzZXhwIGluIFB5dGhvbiB1c2luZyBuZXN0ZWQgbGlzdHMgY29udGFpbmluZyBzdHJpbmdzLgorIyBTbywgZm9yIGV4YW1wbGUsIHRoZSBzZXhwIChjb25zdGFudCBmbG9hdCAoMS4wMDAwMDApKSBpcyByZXByZXNlbnRlZAorIyBhcyBbJ2NvbnN0YW50JywgJ2Zsb2F0JywgWycxLjAwMDAwMCddXS4KKworaW1wb3J0IHJlCisKK2RlZiBjaGVja19zZXhwKHNleHApOgorICAgICIiIlZlcmlmeSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhIHByb3BlciBzZXhwLgorCisgICAgVGhhdCBpcywgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBzdHJpbmcgb3IgYQorICAgIGxpc3QsIG9yIGlmIGl0IGNvbnRhaW5zIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgc3RyaW5nIG9yIGEgbGlzdCBhdAorICAgIGFueSBuZXN0aW5nIGxldmVsLgorICAgICIiIgorICAgIGlmIGlzaW5zdGFuY2Uoc2V4cCwgbGlzdCk6CisgICAgICAgIGZvciBzIGluIHNleHA6CisgICAgICAgICAgICBjaGVja19zZXhwKHMpCisgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXhwLCBiYXNlc3RyaW5nKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdOb3QgYSBzZXhwOiB7MCFyfScuZm9ybWF0KHNleHApKQorCitkZWYgcGFyc2Vfc2V4cChzZXhwKToKKyAgICAiIiJDb252ZXJ0IGEgc3RyaW5nLCBvZiB0aGUgZm9ybSB0aGF0IHdvdWxkIGJlIG91dHB1dCBieSBtZXNhLAorICAgIGludG8gYSBzZXhwIHJlcHJlc2VudGVkIGFzIG5lc3RlZCBsaXN0cyBjb250YWluaW5nIHN0cmluZ3MuCisgICAgIiIiCisgICAgc2V4cF90b2tlbl9yZWdleHAgPSByZS5jb21waWxlKAorICAgICAgICAnW2EtekEtWl9dKyhAWzAtOV0rKT98WzAtOV0rKFxcLlswLTldKyk/fFteIFxuXScpCisgICAgc3RhY2sgPSBbW11dCisgICAgZm9yIG1hdGNoIGluIHNleHBfdG9rZW5fcmVnZXhwLmZpbmRpdGVyKHNleHApOgorICAgICAgICB0b2tlbiA9IG1hdGNoLmdyb3VwKDApCisgICAgICAgIGlmIHRva2VuID09ICcoJzoKKyAgICAgICAgICAgIHN0YWNrLmFwcGVuZChbXSkKKyAgICAgICAgZWxpZiB0b2tlbiA9PSAnKSc6CisgICAgICAgICAgICBpZiBsZW4oc3RhY2spID09IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdVbm1hdGNoZWQgKScpCisgICAgICAgICAgICBzZXhwID0gc3RhY2sucG9wKCkKKyAgICAgICAgICAgIHN0YWNrWy0xXS5hcHBlbmQoc2V4cCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YWNrWy0xXS5hcHBlbmQodG9rZW4pCisgICAgaWYgbGVuKHN0YWNrKSAhPSAxOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1VubWF0Y2hlZCAoJykKKyAgICBpZiBsZW4oc3RhY2tbMF0pICE9IDE6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignTXVsdGlwbGUgc2V4cHMnKQorICAgIHJldHVybiBzdGFja1swXVswXQorCitkZWYgc2V4cF90b19zdHJpbmcoc2V4cCk6CisgICAgIiIiQ29udmVydCBhIHNleHAsIHJlcHJlc2VudGVkIGFzIG5lc3RlZCBsaXN0cyBjb250YWluaW5nIHN0cmluZ3MsCisgICAgaW50byBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gcGFyc2VhYmxlIGJ5IG1lc2EuCisgICAgIiIiCisgICAgaWYgaXNpbnN0YW5jZShzZXhwLCBiYXNlc3RyaW5nKToKKyAgICAgICAgcmV0dXJuIHNleHAKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShzZXhwLCBsaXN0KQorICAgIHJlc3VsdCA9ICcnCisgICAgZm9yIHMgaW4gc2V4cDoKKyAgICAgICAgc3ViX3Jlc3VsdCA9IHNleHBfdG9fc3RyaW5nKHMpCisgICAgICAgIGlmIHJlc3VsdCA9PSAnJzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHN1Yl9yZXN1bHQKKyAgICAgICAgZWxpZiAnXG4nIG5vdCBpbiByZXN1bHQgYW5kICdcbicgbm90IGluIHN1Yl9yZXN1bHQgYW5kIFwKKyAgICAgICAgICAgICAgICBsZW4ocmVzdWx0KSArIGxlbihzdWJfcmVzdWx0KSArIDEgPD0gNzA6CisgICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgc3ViX3Jlc3VsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ICs9ICdcbicgKyBzdWJfcmVzdWx0CisgICAgcmV0dXJuICcoezB9KScuZm9ybWF0KHJlc3VsdC5yZXBsYWNlKCdcbicsICdcbiAnKSkKKworZGVmIHNvcnRfZGVjbHMoc2V4cCk6CisgICAgIiIiU29ydCBhbGwgdG9wbGV2ZWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGluIHNleHAuCisKKyAgICBUaGlzIGlzIHVzZWQgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdAorICAgIGlyX3JlYWRlcjo6cmVhZF9pbnN0cnVjdGlvbnMgcmVvcmRlcnMgZGVjbGFyYXRpb25zLgorICAgICIiIgorICAgIGFzc2VydCBpc2luc3RhbmNlKHNleHAsIGxpc3QpCisgICAgZGVjbHMgPSBbXQorICAgIG90aGVyX2NvZGUgPSBbXQorICAgIGZvciBzIGluIHNleHA6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocywgbGlzdCkgYW5kIGxlbihzKSA+PSA0IGFuZCBzWzBdID09ICdkZWNsYXJlJzoKKyAgICAgICAgICAgIGRlY2xzLmFwcGVuZChzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RoZXJfY29kZS5hcHBlbmQocykKKyAgICByZXR1cm4gc29ydGVkKGRlY2xzKSArIG90aGVyX2NvZGUKKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy90aHJlYWRwb29sX3Rlc3QuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy90aHJlYWRwb29sX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjU1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL3RocmVhZHBvb2xfdGVzdC5jcHAKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiYzExL3RocmVhZHMuaCIKKworI2luY2x1ZGUgInRocmVhZHBvb2wuaCIKKworI2RlZmluZSBOVU1fVEhSRUFEUyAxMAorI2RlZmluZSBPUFNfUEVSX1RIUkVBRCAxMDAKKyNkZWZpbmUgTUFYX1RBU0tTIDEwCisKK3N0YXRpYyB2b2lkCityYWNlX2NiKHZvaWQgKmRhdGEpCit7CisgICB1c2xlZXAoMTAwMCAqIDUpOworfQorCitzdGF0aWMgaW50CityYWNlX3JhbmRvbV9vcCh2b2lkICpkYXRhKQoreworICAgc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wgPSAoc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKikgZGF0YTsKKyAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2sgKnRhc2tzW01BWF9UQVNLU107CisgICBpbnQgbnVtX3Rhc2tzID0gMDsKKyAgIGludCBudW1fb3BzID0gMDsKKyAgIGludCBpOworCisgICB3aGlsZSAobnVtX29wcyA8IE9QU19QRVJfVEhSRUFEKSB7CisgICAgICBpbnQgb3AgPSAocmFuZG9tKCkgJSAxMDAwKTsKKworICAgICAgaWYgKG9wIDwgNDgwKSB7IC8qIDQ4JSAqLworICAgICAgICAgaWYgKG51bV90YXNrcyA8IE1BWF9UQVNLUykgeworICAgICAgICAgICAgdGFza3NbbnVtX3Rhc2tzKytdID0KKyAgICAgICAgICAgICAgIF9tZXNhX3RocmVhZHBvb2xfcXVldWVfdGFzayhwb29sLCByYWNlX2NiLCBOVUxMKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG9wIDwgOTgwKSB7IC8qIDUwJSAqLworICAgICAgICAgaWYgKG51bV90YXNrcykKKyAgICAgICAgICAgIF9tZXNhX3RocmVhZHBvb2xfY29tcGxldGVfdGFzayhwb29sLCB0YXNrc1stLW51bV90YXNrc10pOworICAgICAgfQorICAgICAgZWxzZSBpZiAob3AgPCA5OTUpIHsgLyogMS41JSAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90YXNrczsgaSsrKQorICAgICAgICAgICAgX21lc2FfdGhyZWFkcG9vbF9jb21wbGV0ZV90YXNrKHBvb2wsIHRhc2tzW2ldKTsKKyAgICAgICAgIG51bV90YXNrcyA9IDA7CisgICAgICB9CisgICAgICBlbHNlIHsgLyogMC41JSAqLworICAgICAgICAgX21lc2FfdGhyZWFkcG9vbF9qb2luKHBvb2wsIChvcCA8IDk5OCkpOworICAgICAgfQorCisgICAgICBudW1fb3BzKys7CisgICB9CisKKyAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGFza3M7IGkrKykKKyAgICAgIF9tZXNhX3RocmVhZHBvb2xfY29tcGxldGVfdGFzayhwb29sLCB0YXNrc1tpXSk7CisKKyAgIF9tZXNhX3RocmVhZHBvb2xfdW5yZWYocG9vbCk7CisKKyAgIHJldHVybiAwOworfQorCisvKioKKyAqIFxuYW1lIFRocmVhZCBzYWZldHkKKyAqLworLypAeyovCitURVNUKHRocmVhZHBvb2xfdGVzdCwgcmFjZSkKK3sKKyAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sICpwb29sOworICAgdGhyZF90IHRocmVhZHNbTlVNX1RIUkVBRFNdOworICAgaW50IGk7CisKKyAgIHNyYW5kb20odGltZShOVUxMKSk7CisgICBwb29sID0gX21lc2FfdGhyZWFkcG9vbF9jcmVhdGUoNCk7CisgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgeworICAgICAgdGhyZF9jcmVhdGUoJnRocmVhZHNbaV0sIHJhY2VfcmFuZG9tX29wLAorICAgICAgICAgICAgKHZvaWQgKikgX21lc2FfdGhyZWFkcG9vbF9yZWYocG9vbCkpOworICAgfQorICAgX21lc2FfdGhyZWFkcG9vbF91bnJlZihwb29sKTsKKworICAgZm9yIChpID0gMDsgaSA8IE5VTV9USFJFQURTOyBpKyspCisgICAgICB0aHJkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7CisKKyAgIC8qIHRoaXMgaXMgbm90IHJlYWxseSBhIHVuaXQgdGVzdCAqLworICAgRVhQRUNUX1RSVUUodHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitiYXNpY19jYih2b2lkICpkYXRhKQoreworICAgaW50ICp2YWwgPSAoaW50ICopIGRhdGE7CisKKyAgIHVzbGVlcCgxMDAwICogNSk7CisgICAqdmFsID0gMTsKK30KKworVEVTVCh0aHJlYWRwb29sX3Rlc3QsIGJhc2ljKQoreworICAgc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2w7CisgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICp0YXNrc1syXTsKKyAgIGludCB2YWxzWzJdOworCisgICBwb29sID0gX21lc2FfdGhyZWFkcG9vbF9jcmVhdGUoMik7CisKKyAgIHZhbHNbMF0gPSB2YWxzWzFdID0gMDsKKyAgIHRhc2tzWzBdID0gX21lc2FfdGhyZWFkcG9vbF9xdWV1ZV90YXNrKHBvb2wsIGJhc2ljX2NiLCAodm9pZCAqKSAmdmFsc1swXSk7CisgICB0YXNrc1sxXSA9IF9tZXNhX3RocmVhZHBvb2xfcXVldWVfdGFzayhwb29sLCBiYXNpY19jYiwgKHZvaWQgKikgJnZhbHNbMV0pOworICAgX21lc2FfdGhyZWFkcG9vbF9jb21wbGV0ZV90YXNrKHBvb2wsIHRhc2tzWzBdKTsKKyAgIF9tZXNhX3RocmVhZHBvb2xfY29tcGxldGVfdGFzayhwb29sLCB0YXNrc1sxXSk7CisgICBFWFBFQ1RfVFJVRSh2YWxzWzBdID09IDEgJiYgdmFsc1sxXSA9PSAxKTsKKworICAgX21lc2FfdGhyZWFkcG9vbF91bnJlZihwb29sKTsKK30KKworLypAfSovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL3VuaWZvcm1faW5pdGlhbGl6ZXJfdXRpbHMuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy91bmlmb3JtX2luaXRpYWxpemVyX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg2YzI0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy91bmlmb3JtX2luaXRpYWxpemVyX3V0aWxzLmNwcApAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlICJtYWluL210eXBlcy5oIgorI2luY2x1ZGUgIm1haW4vbWFjcm9zLmgiCisjaW5jbHVkZSAicmFsbG9jLmgiCisjaW5jbHVkZSAidW5pZm9ybV9pbml0aWFsaXplcl91dGlscy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3ZvaWQKK2ZpbGxfc3RvcmFnZV9hcnJheV93aXRoX3NlbnRpbmVscyhnbF9jb25zdGFudF92YWx1ZSAqc3RvcmFnZSwKKwkJCQkgIHVuc2lnbmVkIGRhdGFfc2l6ZSwKKwkJCQkgIHVuc2lnbmVkIHJlZF96b25lX3NpemUpCit7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YV9zaXplOyBpKyspCisgICAgICBzdG9yYWdlW2ldLnUgPSAweERFQURCRUVGOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVkX3pvbmVfc2l6ZTsgaSsrKQorICAgICAgc3RvcmFnZVtkYXRhX3NpemUgKyBpXS51ID0gMHhCQUREQzBERTsKK30KKworLyoqCisgKiBWZXJmaXkgdGhhdCBtYXJrZXJzIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmVhbCB1bmlmb3JtIGFyZSB1bm1vZGlmaWVkCisgKi8KK3N0YXRpYyA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdAorcmVkX3pvbmVfaXNfaW50YWN0KGdsX2NvbnN0YW50X3ZhbHVlICpzdG9yYWdlLAorCQkgICB1bnNpZ25lZCBkYXRhX3NpemUsCisJCSAgIHVuc2lnbmVkIHJlZF96b25lX3NpemUpCit7CisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVkX3pvbmVfc2l6ZTsgaSsrKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBpZHggPSBkYXRhX3NpemUgKyBpOworCisgICAgICBpZiAoc3RvcmFnZVtpZHhdLnUgIT0gMHhCQUREQzBERSkKKwkgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisJICAgIDw8ICJzdG9yYWdlWyIgPDwgaWR4IDw8ICJdLnUgPSAiICA8PCBzdG9yYWdlW2lkeF0udQorCSAgICA8PCAiLCBleGVwZWN0ZWQgZGF0YSB2YWx1ZXMgPSAiIDw8IGRhdGFfc2l6ZQorCSAgICA8PCAiLCByZWQtem9uZSBzaXplID0gIiA8PCByZWRfem9uZV9zaXplOworICAgfQorCisgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgdmFsdWVzW10gPSB7CisgICAyLCAwLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5LCAzMSwgMzcsIDQxLCA0MywgNDcsIDUzCit9OworCisvKioKKyAqIEdlbmVyYXRlIGEgc2luZ2xlIGRhdGEgZWxlbWVudC4KKyAqCisgKiBUaGlzIGlzIGJ5IGJvdGggXGMgZ2VuZXJhdGVfZGF0YSBhbmQgXGMgZ2VuZXJhdGVfYXJyYXlfZGF0YSB0byBjcmVhdGUgdGhlCisgKiBkYXRhLgorICovCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfZGF0YV9lbGVtZW50KHZvaWQgKm1lbV9jdHgsIGNvbnN0IGdsc2xfdHlwZSAqdHlwZSwKKwkJICAgICAgaXJfY29uc3RhbnQgKiZ2YWwsIHVuc2lnbmVkIGRhdGFfaW5kZXhfYmFzZSkKK3sKKyAgIC8qIFNldCB0aGUgaW5pdGlhbCBkYXRhIHZhbHVlcyBmb3IgdGhlIGdlbmVyYXRlZCBjb25zdGFudC4KKyAgICAqLworICAgaXJfY29uc3RhbnRfZGF0YSBkYXRhOworICAgbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHR5cGUtPmNvbXBvbmVudHMoKTsgaSsrKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBpZHggPSAoaSArIGRhdGFfaW5kZXhfYmFzZSkgJSBFbGVtZW50cyh2YWx1ZXMpOworICAgICAgc3dpdGNoICh0eXBlLT5iYXNlX3R5cGUpIHsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlQ6CisgICAgICBjYXNlIEdMU0xfVFlQRV9TQU1QTEVSOgorCSBkYXRhLmlbaV0gPSB2YWx1ZXNbaWR4XTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgZGF0YS5mW2ldID0gZmxvYXQodmFsdWVzW2lkeF0pOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0JPT0w6CisJIGRhdGEuYltpXSA9IGJvb2wodmFsdWVzW2lkeF0pOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0FUT01JQ19VSU5UOgorICAgICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOgorICAgICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6CisgICAgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlRFUkZBQ0U6CisJIEFTU0VSVF9UUlVFKGZhbHNlKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIC8qIEdlbmVyYXRlIGFuZCB2ZXJpZnkgdGhlIGNvbnN0YW50LgorICAgICovCisgICB2YWwgPSBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQodHlwZSwgJmRhdGEpOworCisgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdHlwZS0+Y29tcG9uZW50cygpOyBpKyspIHsKKyAgICAgIHN3aXRjaCAodHlwZS0+YmFzZV90eXBlKSB7CisgICAgICBjYXNlIEdMU0xfVFlQRV9VSU5UOgorICAgICAgY2FzZSBHTFNMX1RZUEVfSU5UOgorICAgICAgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKwkgQVNTRVJUX0VRKGRhdGEuaVtpXSwgdmFsLT52YWx1ZS5pW2ldKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9GTE9BVDoKKwkgQVNTRVJUX0VRKGRhdGEuZltpXSwgdmFsLT52YWx1ZS5mW2ldKTsKKwkgYnJlYWs7CisgICAgICBjYXNlIEdMU0xfVFlQRV9CT09MOgorCSBBU1NFUlRfRVEoZGF0YS5iW2ldLCB2YWwtPnZhbHVlLmJbaV0pOworCSBicmVhazsKKyAgICAgIGNhc2UgR0xTTF9UWVBFX0FUT01JQ19VSU5UOgorICAgICAgY2FzZSBHTFNMX1RZUEVfU1RSVUNUOgorICAgICAgY2FzZSBHTFNMX1RZUEVfQVJSQVk6CisgICAgICBjYXNlIEdMU0xfVFlQRV9WT0lEOgorICAgICAgY2FzZSBHTFNMX1RZUEVfRVJST1I6CisgICAgICBjYXNlIEdMU0xfVFlQRV9JTlRFUkZBQ0U6CisJIEFTU0VSVF9UUlVFKGZhbHNlKTsKKwkgYnJlYWs7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQKK2dlbmVyYXRlX2RhdGEodm9pZCAqbWVtX2N0eCwgZW51bSBnbHNsX2Jhc2VfdHlwZSBiYXNlX3R5cGUsCisJICAgICAgdW5zaWduZWQgY29sdW1ucywgdW5zaWduZWQgcm93cywKKwkgICAgICBpcl9jb25zdGFudCAqJnZhbCkKK3sKKyAgIC8qIERldGVybWluZSB3aGF0IHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgY29uc3RhbnQgc2hvdWxkIGJlLgorICAgICovCisgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IHR5cGUgPQorICAgICAgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoYmFzZV90eXBlLCByb3dzLCBjb2x1bW5zKTsKKyAgIEFTU0VSVF9GQUxTRSh0eXBlLT5pc19lcnJvcigpKTsKKworICAgZ2VuZXJhdGVfZGF0YV9lbGVtZW50KG1lbV9jdHgsIHR5cGUsIHZhbCwgMCk7Cit9CisKK3ZvaWQKK2dlbmVyYXRlX2FycmF5X2RhdGEodm9pZCAqbWVtX2N0eCwgZW51bSBnbHNsX2Jhc2VfdHlwZSBiYXNlX3R5cGUsCisJCSAgICB1bnNpZ25lZCBjb2x1bW5zLCB1bnNpZ25lZCByb3dzLCB1bnNpZ25lZCBhcnJheV9zaXplLAorCQkgICAgaXJfY29uc3RhbnQgKiZ2YWwpCit7CisgICAvKiBEZXRlcm1pbmUgd2hhdCB0aGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIGNvbnN0YW50IHNob3VsZCBiZS4KKyAgICAqLworICAgY29uc3QgZ2xzbF90eXBlICpjb25zdCBlbGVtZW50X3R5cGUgPQorICAgICAgZ2xzbF90eXBlOjpnZXRfaW5zdGFuY2UoYmFzZV90eXBlLCByb3dzLCBjb2x1bW5zKTsKKyAgIEFTU0VSVF9GQUxTRShlbGVtZW50X3R5cGUtPmlzX2Vycm9yKCkpOworCisgICBjb25zdCBnbHNsX3R5cGUgKmNvbnN0IGFycmF5X3R5cGUgPQorICAgICAgZ2xzbF90eXBlOjpnZXRfYXJyYXlfaW5zdGFuY2UoZWxlbWVudF90eXBlLCBhcnJheV9zaXplKTsKKyAgIEFTU0VSVF9GQUxTRShhcnJheV90eXBlLT5pc19lcnJvcigpKTsKKworICAgLyogU2V0IHRoZSBpbml0aWFsIGRhdGEgdmFsdWVzIGZvciB0aGUgZ2VuZXJhdGVkIGNvbnN0YW50LgorICAgICovCisgICBleGVjX2xpc3QgdmFsdWVzX2Zvcl9hcnJheTsKKyAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhcnJheV9zaXplOyBpKyspIHsKKyAgICAgIGlyX2NvbnN0YW50ICplbGVtZW50OworCisgICAgICBnZW5lcmF0ZV9kYXRhX2VsZW1lbnQobWVtX2N0eCwgZWxlbWVudF90eXBlLCBlbGVtZW50LCBpKTsKKyAgICAgIHZhbHVlc19mb3JfYXJyYXkucHVzaF90YWlsKGVsZW1lbnQpOworICAgfQorCisgICB2YWwgPSBuZXcobWVtX2N0eCkgaXJfY29uc3RhbnQoYXJyYXlfdHlwZSwgJnZhbHVlc19mb3JfYXJyYXkpOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IHRoZSBkYXRhIHN0b3JlZCBmb3IgdGhlIHVuaWZvcm0gbWF0Y2hlcyB0aGUgaW5pdGlhbGl6ZXIKKyAqCisgKiBccGFyYW0gc3RvcmFnZSAgICAgICAgICAgICAgQmFja2luZyBzdG9yYWdlIGZvciB0aGUgdW5pZm9ybQorICogXHBhcmFtIHN0b3JhZ2VfYXJyYXlfc2l6ZSAgQXJyYXkgc2l6ZSBvZiB0aGUgYmFja2luZyBzdG9yYWdlLiAgVGhpcyBtdXN0IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFycmF5IHNpemUgb2YgdGhlIHR5cGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFxjIHZhbC4gIElmIFxjIHZhbCBpcyBub3QgYW4gYXJyYXksIHRoaXMgbXVzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgemVyby4KKyAqIFxwYXJhbSB2YWwgICAgICAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBpbml0aWFsaXplciBmb3IgdGhlIHVuaWZyb20uCisgKiBccGFyYW0gcmVkX3pvbmUKKyAqLwordm9pZAordmVyaWZ5X2RhdGEoZ2xfY29uc3RhbnRfdmFsdWUgKnN0b3JhZ2UsIHVuc2lnbmVkIHN0b3JhZ2VfYXJyYXlfc2l6ZSwKKwkgICAgaXJfY29uc3RhbnQgKnZhbCwgdW5zaWduZWQgcmVkX3pvbmVfc2l6ZSkKK3sKKyAgIGlmICh2YWwtPnR5cGUtPmJhc2VfdHlwZSA9PSBHTFNMX1RZUEVfQVJSQVkpIHsKKyAgICAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgZWxlbWVudF90eXBlID0gdmFsLT5hcnJheV9lbGVtZW50c1swXS0+dHlwZTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHN0b3JhZ2VfYXJyYXlfc2l6ZTsgaSsrKSB7CisJIHZlcmlmeV9kYXRhKHN0b3JhZ2UgKyAoaSAqIGVsZW1lbnRfdHlwZS0+Y29tcG9uZW50cygpKSwgMCwKKwkJICAgICB2YWwtPmFycmF5X2VsZW1lbnRzW2ldLCAwKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgdW5zaWduZWQgY29tcG9uZW50cyA9IGVsZW1lbnRfdHlwZS0+Y29tcG9uZW50cygpOworCisgICAgICBpZiAocmVkX3pvbmVfc2l6ZSA+IDApIHsKKwkgRVhQRUNUX1RSVUUocmVkX3pvbmVfaXNfaW50YWN0KHN0b3JhZ2UsCisJCQkJCXN0b3JhZ2VfYXJyYXlfc2l6ZSAqIGNvbXBvbmVudHMsCisJCQkJCXJlZF96b25lX3NpemUpKTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfRVEoMHUsIHN0b3JhZ2VfYXJyYXlfc2l6ZSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFsLT50eXBlLT5jb21wb25lbnRzKCk7IGkrKykgeworCSBzd2l0Y2ggKHZhbC0+dHlwZS0+YmFzZV90eXBlKSB7CisJIGNhc2UgR0xTTF9UWVBFX1VJTlQ6CisJIGNhc2UgR0xTTF9UWVBFX0lOVDoKKwkgY2FzZSBHTFNMX1RZUEVfU0FNUExFUjoKKwkgICAgRVhQRUNUX0VRKHZhbC0+dmFsdWUuaVtpXSwgc3RvcmFnZVtpXS5pKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgR0xTTF9UWVBFX0ZMT0FUOgorCSAgICBFWFBFQ1RfRVEodmFsLT52YWx1ZS5mW2ldLCBzdG9yYWdlW2ldLmYpOworCSAgICBicmVhazsKKwkgY2FzZSBHTFNMX1RZUEVfQk9PTDoKKwkgICAgRVhQRUNUX0VRKGludCh2YWwtPnZhbHVlLmJbaV0pLCBzdG9yYWdlW2ldLmkpOworCSAgICBicmVhazsKKyAgICAgICAgIGNhc2UgR0xTTF9UWVBFX0FUT01JQ19VSU5UOgorCSBjYXNlIEdMU0xfVFlQRV9TVFJVQ1Q6CisJIGNhc2UgR0xTTF9UWVBFX0FSUkFZOgorCSBjYXNlIEdMU0xfVFlQRV9WT0lEOgorCSBjYXNlIEdMU0xfVFlQRV9FUlJPUjoKKwkgY2FzZSBHTFNMX1RZUEVfSU5URVJGQUNFOgorCSAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisJICAgIGJyZWFrOworCSB9CisgICAgICB9CisKKyAgICAgIGlmIChyZWRfem9uZV9zaXplID4gMCkgeworCSBFWFBFQ1RfVFJVRShyZWRfem9uZV9pc19pbnRhY3Qoc3RvcmFnZSwKKwkJCQkJdmFsLT50eXBlLT5jb21wb25lbnRzKCksCisJCQkJCXJlZF96b25lX3NpemUpKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvdW5pZm9ybV9pbml0aWFsaXplcl91dGlscy5oIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy91bmlmb3JtX2luaXRpYWxpemVyX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjMDZkMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGVzdHMvdW5pZm9ybV9pbml0aWFsaXplcl91dGlscy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInByb2dyYW0vcHJvZ19wYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJpci5oIgorI2luY2x1ZGUgImlyX3VuaWZvcm0uaCIKKworZXh0ZXJuIHZvaWQKK2ZpbGxfc3RvcmFnZV9hcnJheV93aXRoX3NlbnRpbmVscyhnbF9jb25zdGFudF92YWx1ZSAqc3RvcmFnZSwKKwkJCQkgIHVuc2lnbmVkIGRhdGFfc2l6ZSwKKwkJCQkgIHVuc2lnbmVkIHJlZF96b25lX3NpemUpOworCitleHRlcm4gdm9pZAorZ2VuZXJhdGVfZGF0YSh2b2lkICptZW1fY3R4LCBlbnVtIGdsc2xfYmFzZV90eXBlIGJhc2VfdHlwZSwKKwkgICAgICB1bnNpZ25lZCBjb2x1bW5zLCB1bnNpZ25lZCByb3dzLAorCSAgICAgIGlyX2NvbnN0YW50IComdmFsKTsKKworZXh0ZXJuIHZvaWQKK2dlbmVyYXRlX2FycmF5X2RhdGEodm9pZCAqbWVtX2N0eCwgZW51bSBnbHNsX2Jhc2VfdHlwZSBiYXNlX3R5cGUsCisJCSAgICB1bnNpZ25lZCBjb2x1bW5zLCB1bnNpZ25lZCByb3dzLCB1bnNpZ25lZCBhcnJheV9zaXplLAorCQkgICAgaXJfY29uc3RhbnQgKiZ2YWwpOworCitleHRlcm4gdm9pZAordmVyaWZ5X2RhdGEoZ2xfY29uc3RhbnRfdmFsdWUgKnN0b3JhZ2UsIHVuc2lnbmVkIHN0b3JhZ2VfYXJyYXlfc2l6ZSwKKwkgICAgaXJfY29uc3RhbnQgKnZhbCwgdW5zaWduZWQgcmVkX3pvbmVfc2l6ZSk7CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3Rlc3RzL3ZhcnlpbmdzX3Rlc3QuY3BwIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy92YXJ5aW5nc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjJmYzBlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2NvbXBpbGVyL3NoYWRlci90ZXN0cy92YXJ5aW5nc190ZXN0LmNwcApAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAibWFpbi9tdHlwZXMuaCIKKyNpbmNsdWRlICJtYWluL21hY3Jvcy5oIgorI2luY2x1ZGUgInJhbGxvYy5oIgorI2luY2x1ZGUgImlyLmgiCisjaW5jbHVkZSAicHJvZ3JhbS9oYXNoX3RhYmxlLmgiCisKKy8qKgorICogXGZpbGUgdmFyeWluZ3NfdGVzdC5jcHAKKyAqCisgKiBUZXN0IHZhcmlvdXMgYXNwZWN0cyBvZiBsaW5raW5nIHNoYWRlciBzdGFnZSBpbnB1dHMgYW5kIG91dHB1dHMuCisgKi8KKworbmFtZXNwYWNlIGxpbmtlciB7Citib29sCitwb3B1bGF0ZV9jb25zdW1lcl9pbnB1dF9zZXRzKHZvaWQgKm1lbV9jdHgsIGV4ZWNfbGlzdCAqaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGUgKmNvbnN1bWVyX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF90YWJsZSAqY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyaWFibGUgKmNvbnN1bWVyX2lucHV0c193aXRoX2xvY2F0aW9uc1tWQVJZSU5HX1NMT1RfTUFYXSk7CisKK2lyX3ZhcmlhYmxlICoKK2dldF9tYXRjaGluZ19pbnB1dCh2b2lkICptZW1fY3R4LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGlyX3ZhcmlhYmxlICpvdXRwdXRfdmFyLAorICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGUgKmNvbnN1bWVyX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICBoYXNoX3RhYmxlICpjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgIGlyX3ZhcmlhYmxlICpjb25zdW1lcl9pbnB1dHNfd2l0aF9sb2NhdGlvbnNbVkFSWUlOR19TTE9UX01BWF0pOworfQorCitjbGFzcyBsaW5rX3ZhcnlpbmdzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICBsaW5rX3ZhcnlpbmdzKCk7CisKKyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOworICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7CisKKyAgIGNoYXIgKmludGVyZmFjZV9maWVsZF9uYW1lKGNvbnN0IGdsc2xfdHlwZSAqaWZhY2UsIHVuc2lnbmVkIGZpZWxkID0gMCkKKyAgIHsKKyAgICAgIHJldHVybiByYWxsb2NfYXNwcmludGYobWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlLT5maWVsZHMuc3RydWN0dXJlW2ZpZWxkXS5uYW1lKTsKKyAgIH0KKworICAgdm9pZCAqbWVtX2N0eDsKKyAgIGV4ZWNfbGlzdCBpcjsKKyAgIGhhc2hfdGFibGUgKmNvbnN1bWVyX2lucHV0czsKKyAgIGhhc2hfdGFibGUgKmNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHM7CisKKyAgIGNvbnN0IGdsc2xfdHlwZSAqc2ltcGxlX2ludGVyZmFjZTsKKyAgIGlyX3ZhcmlhYmxlICpqdW5rW1ZBUllJTkdfU0xPVF9NQVhdOworfTsKKworbGlua192YXJ5aW5nczo6bGlua192YXJ5aW5ncygpCit7CisgICBzdGF0aWMgY29uc3QgZ2xzbF9zdHJ1Y3RfZmllbGQgZltdID0geworICAgICAgeworICAgICAgICAgZ2xzbF90eXBlOjp2ZWMoNCksCisgICAgICAgICAidiIsCisgICAgICAgICBmYWxzZSwKKyAgICAgICAgIDAsCisgICAgICAgICAwLAorICAgICAgICAgMCwKKyAgICAgICAgIDAKKyAgICAgIH0KKyAgIH07CisKKyAgIHRoaXMtPnNpbXBsZV9pbnRlcmZhY2UgPQorICAgICAgZ2xzbF90eXBlOjpnZXRfaW50ZXJmYWNlX2luc3RhbmNlKGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFNMX0lOVEVSRkFDRV9QQUNLSU5HX1NURDE0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2ltcGxlX2ludGVyZmFjZSIpOworfQorCit2b2lkCitsaW5rX3ZhcnlpbmdzOjpTZXRVcCgpCit7CisgICB0aGlzLT5tZW1fY3R4ID0gcmFsbG9jX2NvbnRleHQoTlVMTCk7CisgICB0aGlzLT5pci5tYWtlX2VtcHR5KCk7CisKKyAgIHRoaXMtPmNvbnN1bWVyX2lucHV0cworICAgICAgPSBoYXNoX3RhYmxlX2N0b3IoMCwgaGFzaF90YWJsZV9zdHJpbmdfaGFzaCwgaGFzaF90YWJsZV9zdHJpbmdfY29tcGFyZSk7CisKKyAgIHRoaXMtPmNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMKKyAgICAgID0gaGFzaF90YWJsZV9jdG9yKDAsIGhhc2hfdGFibGVfc3RyaW5nX2hhc2gsIGhhc2hfdGFibGVfc3RyaW5nX2NvbXBhcmUpOworfQorCit2b2lkCitsaW5rX3ZhcnlpbmdzOjpUZWFyRG93bigpCit7CisgICByYWxsb2NfZnJlZSh0aGlzLT5tZW1fY3R4KTsKKyAgIHRoaXMtPm1lbV9jdHggPSBOVUxMOworCisgICBoYXNoX3RhYmxlX2R0b3IodGhpcy0+Y29uc3VtZXJfaW5wdXRzKTsKKyAgIHRoaXMtPmNvbnN1bWVyX2lucHV0cyA9IE5VTEw7CisgICBoYXNoX3RhYmxlX2R0b3IodGhpcy0+Y29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cyk7CisgICB0aGlzLT5jb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzID0gTlVMTDsKK30KKworLyoqCisgKiBIYXNoIHRhYmxlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY291bnRzIHRoZSBlbGVtZW50cyBpbiB0aGUgdGFibGUKKyAqCisgKiBcc2EgbnVtX2VsZW1lbnRzCisgKi8KK3N0YXRpYyB2b2lkCitodF9jb3VudF9jYWxsYmFjayhjb25zdCB2b2lkICosIHZvaWQgKiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgIHVuc2lnbmVkIGludCAqY291bnRlciA9ICh1bnNpZ25lZCBpbnQgKikgY2xvc3VyZTsKKworICAgKCpjb3VudGVyKSsrOworfQorCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBjb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgaGFzaCB0YWJsZS4KKyAqLworc3RhdGljIHVuc2lnbmVkCitudW1fZWxlbWVudHMoaGFzaF90YWJsZSAqaHQpCit7CisgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7CisKKyAgIGhhc2hfdGFibGVfY2FsbF9mb3JlYWNoKGh0LCBodF9jb3VudF9jYWxsYmFjaywgKHZvaWQgKikgJmNvdW50ZXIpOworCisgICByZXR1cm4gY291bnRlcjsKK30KKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBoYXNoIHRhYmxlIGlzIGVtcHR5LgorICovCitzdGF0aWMgYm9vbAoraXNfZW1wdHkoaGFzaF90YWJsZSAqaHQpCit7CisgICByZXR1cm4gbnVtX2VsZW1lbnRzKGh0KSA9PSAwOworfQorCitURVNUX0YobGlua192YXJ5aW5ncywgc2luZ2xlX3NpbXBsZV9pbnB1dCkKK3sKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCB2ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OnZlYyg0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3NoYWRlcl9pbik7CisKKworICAgaXIucHVzaF90YWlsKHYpOworCisgICBBU1NFUlRfVFJVRShsaW5rZXI6OnBvcHVsYXRlX2NvbnN1bWVyX2lucHV0X3NldHMobWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuaykpOworCisgICBFWFBFQ1RfRVEoKHZvaWQgKikgdiwgaGFzaF90YWJsZV9maW5kKGNvbnN1bWVyX2lucHV0cywgImEiKSk7CisgICBFWFBFQ1RfRVEoMXUsIG51bV9lbGVtZW50cyhjb25zdW1lcl9pbnB1dHMpKTsKKyAgIEVYUEVDVF9UUlVFKGlzX2VtcHR5KGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMpKTsKK30KKworVEVTVF9GKGxpbmtfdmFyeWluZ3MsIGdsX0NsaXBEaXN0YW5jZSkKK3sKKyAgIGNvbnN0IGdsc2xfdHlwZSAqY29uc3QgYXJyYXlfOF9vZl9mbG9hdCA9CisgICAgICBnbHNsX3R5cGU6OmdldF9hcnJheV9pbnN0YW5jZShnbHNsX3R5cGU6OnZlYygxKSwgOCk7CisKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCBjbGlwZGlzdGFuY2UgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKGFycmF5Xzhfb2ZfZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsX0NsaXBEaXN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3NoYWRlcl9pbik7CisKKyAgIGNsaXBkaXN0YW5jZS0+ZGF0YS5leHBsaWNpdF9sb2NhdGlvbiA9IHRydWU7CisgICBjbGlwZGlzdGFuY2UtPmRhdGEubG9jYXRpb24gPSBWQVJZSU5HX1NMT1RfQ0xJUF9ESVNUMDsKKyAgIGNsaXBkaXN0YW5jZS0+ZGF0YS5leHBsaWNpdF9pbmRleCA9IDA7CisKKyAgIGlyLnB1c2hfdGFpbChjbGlwZGlzdGFuY2UpOworCisgICBBU1NFUlRfVFJVRShsaW5rZXI6OnBvcHVsYXRlX2NvbnN1bWVyX2lucHV0X3NldHMobWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuaykpOworCisgICBFWFBFQ1RfRVEoY2xpcGRpc3RhbmNlLCBqdW5rW1ZBUllJTkdfU0xPVF9DTElQX0RJU1QwXSk7CisgICBFWFBFQ1RfVFJVRShpc19lbXB0eShjb25zdW1lcl9pbnB1dHMpKTsKKyAgIEVYUEVDVF9UUlVFKGlzX2VtcHR5KGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMpKTsKK30KKworVEVTVF9GKGxpbmtfdmFyeWluZ3MsIHNpbmdsZV9pbnRlcmZhY2VfaW5wdXQpCit7CisgICBpcl92YXJpYWJsZSAqY29uc3QgdiA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoc2ltcGxlX2ludGVyZmFjZS0+ZmllbGRzLnN0cnVjdHVyZVswXS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9pbnRlcmZhY2UtPmZpZWxkcy5zdHJ1Y3R1cmVbMF0ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfc2hhZGVyX2luKTsKKworICAgdi0+aW5pdF9pbnRlcmZhY2VfdHlwZShzaW1wbGVfaW50ZXJmYWNlKTsKKworICAgaXIucHVzaF90YWlsKHYpOworCisgICBBU1NFUlRfVFJVRShsaW5rZXI6OnBvcHVsYXRlX2NvbnN1bWVyX2lucHV0X3NldHMobWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuaykpOworICAgY2hhciAqY29uc3QgZnVsbF9uYW1lID0gaW50ZXJmYWNlX2ZpZWxkX25hbWUoc2ltcGxlX2ludGVyZmFjZSk7CisKKyAgIEVYUEVDVF9FUSgodm9pZCAqKSB2LCBoYXNoX3RhYmxlX2ZpbmQoY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cywgZnVsbF9uYW1lKSk7CisgICBFWFBFQ1RfRVEoMXUsIG51bV9lbGVtZW50cyhjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzKSk7CisgICBFWFBFQ1RfVFJVRShpc19lbXB0eShjb25zdW1lcl9pbnB1dHMpKTsKK30KKworVEVTVF9GKGxpbmtfdmFyeWluZ3MsIG9uZV9pbnRlcmZhY2VfYW5kX29uZV9zaW1wbGVfaW5wdXQpCit7CisgICBpcl92YXJpYWJsZSAqY29uc3QgdiA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjp2ZWMoNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl9zaGFkZXJfaW4pOworCisKKyAgIGlyLnB1c2hfdGFpbCh2KTsKKworICAgaXJfdmFyaWFibGUgKmNvbnN0IGlmYWNlID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShzaW1wbGVfaW50ZXJmYWNlLT5maWVsZHMuc3RydWN0dXJlWzBdLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX2ludGVyZmFjZS0+ZmllbGRzLnN0cnVjdHVyZVswXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl9zaGFkZXJfaW4pOworCisgICBpZmFjZS0+aW5pdF9pbnRlcmZhY2VfdHlwZShzaW1wbGVfaW50ZXJmYWNlKTsKKworICAgaXIucHVzaF90YWlsKGlmYWNlKTsKKworICAgQVNTRVJUX1RSVUUobGlua2VyOjpwb3B1bGF0ZV9jb25zdW1lcl9pbnB1dF9zZXRzKG1lbV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmspKTsKKworICAgY2hhciAqY29uc3QgaWZhY2VfZmllbGRfbmFtZSA9IGludGVyZmFjZV9maWVsZF9uYW1lKHNpbXBsZV9pbnRlcmZhY2UpOworCisgICBFWFBFQ1RfRVEoKHZvaWQgKikgaWZhY2UsIGhhc2hfdGFibGVfZmluZChjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VfZmllbGRfbmFtZSkpOworICAgRVhQRUNUX0VRKDF1LCBudW1fZWxlbWVudHMoY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cykpOworCisgICBFWFBFQ1RfRVEoKHZvaWQgKikgdiwgaGFzaF90YWJsZV9maW5kKGNvbnN1bWVyX2lucHV0cywgImEiKSk7CisgICBFWFBFQ1RfRVEoMXUsIG51bV9lbGVtZW50cyhjb25zdW1lcl9pbnB1dHMpKTsKK30KKworVEVTVF9GKGxpbmtfdmFyeWluZ3MsIGludmFsaWRfaW50ZXJmYWNlX2lucHV0KQoreworICAgaXJfdmFyaWFibGUgKmNvbnN0IHYgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKHNpbXBsZV9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWVkX2ludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3NoYWRlcl9pbik7CisKKyAgIEFTU0VSVF9FUShzaW1wbGVfaW50ZXJmYWNlLCB2LT5nZXRfaW50ZXJmYWNlX3R5cGUoKSk7CisKKyAgIGlyLnB1c2hfdGFpbCh2KTsKKworICAgRVhQRUNUX0ZBTFNFKGxpbmtlcjo6cG9wdWxhdGVfY29uc3VtZXJfaW5wdXRfc2V0cyhtZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2ludGVyZmFjZV9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmspKTsKK30KKworVEVTVF9GKGxpbmtfdmFyeWluZ3MsIGludGVyZmFjZV9maWVsZF9kb2VzbnRfbWF0Y2hfbm9uaW50ZXJmYWNlKQoreworICAgY2hhciAqY29uc3QgaWZhY2VfZmllbGRfbmFtZSA9IGludGVyZmFjZV9maWVsZF9uYW1lKHNpbXBsZV9pbnRlcmZhY2UpOworCisgICAvKiBUaGUgaW5wdXQgc2hhZGVyIGhhcyBhIHNpbmdsZSBpbnB1dCB2YXJpYWJsZSBuYW1lICJhLnYiCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICpjb25zdCBpbl92ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShnbHNsX3R5cGU6OnZlYyg0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZV9maWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl9zaGFkZXJfaW4pOworCisgICBpci5wdXNoX3RhaWwoaW5fdik7CisKKyAgIEFTU0VSVF9UUlVFKGxpbmtlcjo6cG9wdWxhdGVfY29uc3VtZXJfaW5wdXRfc2V0cyhtZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5rKSk7CisKKyAgIC8qIENyZWF0ZSBhbiBvdXRwdXQgdmFyaWFibGUsICJ2IiwgdGhhdCBpcyBwYXJ0IG9mIGFuIGludGVyZmFjZSBibG9jayBuYW1lZAorICAgICogImEiLiAgVGhleSBzaG91bGQgbm90IG1hdGNoLgorICAgICovCisgICBpcl92YXJpYWJsZSAqY29uc3Qgb3V0X3YgPQorICAgICAgbmV3KG1lbV9jdHgpIGlyX3ZhcmlhYmxlKHNpbXBsZV9pbnRlcmZhY2UtPmZpZWxkcy5zdHJ1Y3R1cmVbMF0udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfaW50ZXJmYWNlLT5maWVsZHMuc3RydWN0dXJlWzBdLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJfdmFyX3NoYWRlcl9pbik7CisKKyAgIG91dF92LT5pbml0X2ludGVyZmFjZV90eXBlKHNpbXBsZV9pbnRlcmZhY2UpOworCisgICBpcl92YXJpYWJsZSAqY29uc3QgbWF0Y2ggPQorICAgICAgbGlua2VyOjpnZXRfbWF0Y2hpbmdfaW5wdXQobWVtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmspOworCisgICBFWFBFQ1RfRVEoTlVMTCwgbWF0Y2gpOworfQorCitURVNUX0YobGlua192YXJ5aW5ncywgaW50ZXJmYWNlX2ZpZWxkX2RvZXNudF9tYXRjaF9ub25pbnRlcmZhY2VfdmljZV92ZXJzYSkKK3sKKyAgIGNoYXIgKmNvbnN0IGlmYWNlX2ZpZWxkX25hbWUgPSBpbnRlcmZhY2VfZmllbGRfbmFtZShzaW1wbGVfaW50ZXJmYWNlKTsKKworICAgLyogSW4gaW5wdXQgc2hhZGVyIGhhcyBhIHNpbmdsZSB2YXJpYWJsZSwgInYiLCB0aGF0IGlzIHBhcnQgb2YgYW4gaW50ZXJmYWNlCisgICAgKiBibG9jayBuYW1lZCAiYSIuCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICpjb25zdCBpbl92ID0KKyAgICAgIG5ldyhtZW1fY3R4KSBpcl92YXJpYWJsZShzaW1wbGVfaW50ZXJmYWNlLT5maWVsZHMuc3RydWN0dXJlWzBdLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX2ludGVyZmFjZS0+ZmllbGRzLnN0cnVjdHVyZVswXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyX3Zhcl9zaGFkZXJfaW4pOworCisgICBpbl92LT5pbml0X2ludGVyZmFjZV90eXBlKHNpbXBsZV9pbnRlcmZhY2UpOworCisgICBpci5wdXNoX3RhaWwoaW5fdik7CisKKyAgIEFTU0VSVF9UUlVFKGxpbmtlcjo6cG9wdWxhdGVfY29uc3VtZXJfaW5wdXRfc2V0cyhtZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfaW50ZXJmYWNlX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5rKSk7CisKKyAgIC8qIENyZWF0ZSBhbiBvdXRwdXQgdmFyaWFibGUgImEudiIuICBUaGV5IHNob3VsZCBub3QgbWF0Y2guCisgICAgKi8KKyAgIGlyX3ZhcmlhYmxlICpjb25zdCBvdXRfdiA9CisgICAgICBuZXcobWVtX2N0eCkgaXJfdmFyaWFibGUoZ2xzbF90eXBlOjp2ZWMoNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2VfZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcl92YXJfc2hhZGVyX291dCk7CisKKyAgIGlyX3ZhcmlhYmxlICpjb25zdCBtYXRjaCA9CisgICAgICBsaW5rZXI6OmdldF9tYXRjaGluZ19pbnB1dChtZW1fY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9pbnRlcmZhY2VfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuayk7CisKKyAgIEVYUEVDVF9FUShOVUxMLCBtYXRjaCk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3RocmVhZHBvb2wuYyBiL2ljZC9pbnRlbC9jb21waWxlci9zaGFkZXIvdGhyZWFkcG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWQ4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvY29tcGlsZXIvc2hhZGVyL3RocmVhZHBvb2wuYwpAQCAtMCwwICsxLDU0OCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgIEx1bmFyRywgSW5jLiAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSAiYzExL3RocmVhZHMuaCIKKyNpbmNsdWRlICJtYWluL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAibWFpbi9zaW1wbGVfbGlzdC5oIgorI2luY2x1ZGUgInRocmVhZHBvb2wuaCIKKworZW51bSBfbWVzYV90aHJlYWRwb29sX2NvbnRyb2wgeworICAgTUVTQV9USFJFQURQT09MX05PUk1BTCwgICAgLyogdGhyZWFkcyB3YWl0IHdoZW4gdGhlcmUgaXMgbm8gdGFzayAqLworICAgTUVTQV9USFJFQURQT09MX1FVSVQsICAgICAgLyogdGhyZWFkcyBxdWl0IHdoZW4gdGhlcmUgaXMgbm8gdGFzayAqLworICAgTUVTQV9USFJFQURQT09MX1FVSVRfTk9XICAgLyogdGhyZWFkcyBxdWl0IGFzIHNvb24gYXMgcG9zc2libGUgKi8KK307CisKK2VudW0gX21lc2FfdGhyZWFkcG9vbF90YXNrX3N0YXRlIHsKKyAgIE1FU0FfVEhSRUFEUE9PTF9UQVNLX1BFTkRJTkcsICAgIC8qIHRhc2sgaXMgb24gdGhlIHBlbmRpbmcgbGlzdCAqLworICAgTUVTQV9USFJFQURQT09MX1RBU0tfQUNUSVZFLCAgICAgLyogdGFzayBpcyBiZWluZyB3b3JrZWQgb24gKi8KKyAgIE1FU0FfVEhSRUFEUE9PTF9UQVNLX0NPTVBMRVRFRCwgIC8qIHRhc2sgaGFzIGJlZW4gY29tcGxldGVkICovCisgICBNRVNBX1RIUkVBRFBPT0xfVEFTS19DQU5DRUxMRUQgICAvKiB0YXNrIGlzIGNhbmNlbGxlZCAqLworfTsKKworc3RydWN0IF9tZXNhX3RocmVhZHBvb2xfdGFzayB7CisgICAvKiB0aGVzZSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBwb29sJ3MgbXV0ZXggKi8KKyAgIHN0cnVjdCBzaW1wbGVfbm9kZSBsaW5rOyAvKiBtdXN0IGJlIHRoZSBmaXJzdCAqLworICAgZW51bSBfbWVzYV90aHJlYWRwb29sX3Rhc2tfc3RhdGUgc3RhdGU7CisgICBjbmRfdCBjb21wbGV0ZWQ7CisKKyAgIHZvaWQgKCpmdW5jKSh2b2lkICopOworICAgdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBfbWVzYV90aHJlYWRwb29sIHsKKyAgIG10eF90IG11dGV4OworICAgaW50IHJlZmNudDsKKyAgIGJvb2wgc2h1dGRvd247CisKKyAgIGVudW0gX21lc2FfdGhyZWFkcG9vbF9jb250cm9sIHRocmVhZF9jb250cm9sOworICAgdGhyZF90ICp0aHJlYWRzOworICAgaW50IG51bV90aHJlYWRzLCBtYXhfdGhyZWFkczsKKyAgIGludCBpZGxlX3RocmVhZHM7IC8qIG51bWJlciBvZiB0aHJlYWRzIHRoYXQgYXJlIGlkbGUgKi8KKyAgIGNuZF90IHRocmVhZF93YWtldXA7CisgICBjbmRfdCB0aHJlYWRfam9pbmVkOworCisgICBzdHJ1Y3Qgc2ltcGxlX25vZGUgcGVuZGluZ190YXNrczsKKyAgIGludCBudW1fcGVuZGluZ190YXNrczsKKyAgIGludCBudW1fdGFza3M7Cit9OworCitzdGF0aWMgc3RydWN0IF9tZXNhX3RocmVhZHBvb2xfdGFzayAqCit0YXNrX2NyZWF0ZSh2b2lkKQoreworICAgc3RydWN0IF9tZXNhX3RocmVhZHBvb2xfdGFzayAqdGFzazsKKworICAgdGFzayA9IG1hbGxvYyhzaXplb2YoKnRhc2spKTsKKyAgIGlmICghdGFzaykKKyAgICAgIHJldHVybiBOVUxMOworCisgICBpZiAoY25kX2luaXQoJnRhc2stPmNvbXBsZXRlZCkpIHsKKyAgICAgIGZyZWUodGFzayk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgdGFzay0+c3RhdGUgPSBNRVNBX1RIUkVBRFBPT0xfVEFTS19QRU5ESU5HOworCisgICByZXR1cm4gdGFzazsKK30KKworc3RhdGljIHZvaWQKK3Rhc2tfZGVzdHJveShzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICp0YXNrKQoreworICAgY25kX2Rlc3Ryb3koJnRhc2stPmNvbXBsZXRlZCk7CisgICBmcmVlKHRhc2spOworfQorCitzdGF0aWMgdm9pZAorcG9vbF9leGVjX3Rhc2soc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICp0YXNrKQoreworICAgYXNzZXJ0KHRhc2stPnN0YXRlID09IE1FU0FfVEhSRUFEUE9PTF9UQVNLX1BFTkRJTkcpOworCisgICByZW1vdmVfZnJvbV9saXN0KCZ0YXNrLT5saW5rKTsKKyAgIHBvb2wtPm51bV9wZW5kaW5nX3Rhc2tzLS07CisKKyAgIHRhc2stPnN0YXRlID0gTUVTQV9USFJFQURQT09MX1RBU0tfQUNUSVZFOworCisgICAvKiBkbyB0aGUgd29yayEgKi8KKyAgIG10eF91bmxvY2soJnBvb2wtPm11dGV4KTsKKyAgIHRhc2stPmZ1bmModGFzay0+ZGF0YSk7CisgICBtdHhfbG9jaygmcG9vbC0+bXV0ZXgpOworCisgICB0YXNrLT5zdGF0ZSA9IE1FU0FfVEhSRUFEUE9PTF9UQVNLX0NPTVBMRVRFRDsKK30KKworc3RhdGljIGludAorX21lc2FfdGhyZWFkcG9vbF93b3JrZXIodm9pZCAqYXJnKQoreworICAgc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wgPSAoc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKikgYXJnOworCisgICBtdHhfbG9jaygmcG9vbC0+bXV0ZXgpOworCisgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3RydWN0IF9tZXNhX3RocmVhZHBvb2xfdGFzayAqdGFzazsKKworICAgICAgLyogd2FpdCB1bnRpbCB0aGVyZSBhcmUgdGFza3MgKi8KKyAgICAgIHdoaWxlIChpc19lbXB0eV9saXN0KCZwb29sLT5wZW5kaW5nX3Rhc2tzKSAmJgorICAgICAgICAgICAgIHBvb2wtPnRocmVhZF9jb250cm9sID09IE1FU0FfVEhSRUFEUE9PTF9OT1JNQUwpIHsKKyAgICAgICAgIHBvb2wtPmlkbGVfdGhyZWFkcysrOworICAgICAgICAgY25kX3dhaXQoJnBvb2wtPnRocmVhZF93YWtldXAsICZwb29sLT5tdXRleCk7CisgICAgICAgICBwb29sLT5pZGxlX3RocmVhZHMtLTsKKyAgICAgIH0KKworICAgICAgaWYgKHBvb2wtPnRocmVhZF9jb250cm9sICE9IE1FU0FfVEhSRUFEUE9PTF9OT1JNQUwpIHsKKyAgICAgICAgIGlmIChwb29sLT50aHJlYWRfY29udHJvbCA9PSBNRVNBX1RIUkVBRFBPT0xfUVVJVF9OT1cgfHwKKyAgICAgICAgICAgICBpc19lbXB0eV9saXN0KCZwb29sLT5wZW5kaW5nX3Rhc2tzKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBhc3NlcnQoIWlzX2VtcHR5X2xpc3QoJnBvb2wtPnBlbmRpbmdfdGFza3MpKTsKKyAgICAgIHRhc2sgPSAoc3RydWN0IF9tZXNhX3RocmVhZHBvb2xfdGFzayAqKQorICAgICAgICAgZmlyc3RfZWxlbSgmcG9vbC0+cGVuZGluZ190YXNrcyk7CisKKyAgICAgIHBvb2xfZXhlY190YXNrKHBvb2wsIHRhc2spOworICAgICAgY25kX3NpZ25hbCgmdGFzay0+Y29tcGxldGVkKTsKKyAgIH0KKworICAgbXR4X3VubG9jaygmcG9vbC0+bXV0ZXgpOworCisgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBRdWV1ZSBhIG5ldyB0YXNrLgorICovCitzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICoKK19tZXNhX3RocmVhZHBvb2xfcXVldWVfdGFzayhzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKyAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2sgKnRhc2s7CisKKyAgIHRhc2sgPSB0YXNrX2NyZWF0ZSgpOworICAgaWYgKCF0YXNrKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIHRhc2stPmZ1bmMgPSBmdW5jOworICAgdGFzay0+ZGF0YSA9IGRhdGE7CisKKyAgIG10eF9sb2NrKCZwb29sLT5tdXRleCk7CisKKyAgIGlmICh1bmxpa2VseShwb29sLT5zaHV0ZG93bikpIHsKKyAgICAgIG10eF91bmxvY2soJnBvb2wtPm11dGV4KTsKKyAgICAgIGZyZWUodGFzayk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLyogc29tZW9uZSBpcyBqb2luaW5nIHdpdGggdGhlIHRocmVhZHMgKi8KKyAgIHdoaWxlICh1bmxpa2VseShwb29sLT50aHJlYWRfY29udHJvbCAhPSBNRVNBX1RIUkVBRFBPT0xfTk9STUFMKSkKKyAgICAgIGNuZF93YWl0KCZwb29sLT50aHJlYWRfam9pbmVkLCAmcG9vbC0+bXV0ZXgpOworCisgICAvKiBzcGF3biB0aHJlYWRzIGFzIG5lZWRlZCAqLworICAgaWYgKHBvb2wtPmlkbGVfdGhyZWFkcyA8PSBwb29sLT5udW1fcGVuZGluZ190YXNrcyAmJgorICAgICAgIHBvb2wtPm51bV90aHJlYWRzIDwgcG9vbC0+bWF4X3RocmVhZHMpIHsKKyAgICAgIGludCBlcnI7CisKKyAgICAgIGVyciA9IHRocmRfY3JlYXRlKCZwb29sLT50aHJlYWRzW3Bvb2wtPm51bV90aHJlYWRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNhX3RocmVhZHBvb2xfd29ya2VyLCAodm9pZCAqKSBwb29sKTsKKyAgICAgIGlmICghZXJyKQorICAgICAgICAgcG9vbC0+bnVtX3RocmVhZHMrKzsKKworICAgICAgaWYgKCFwb29sLT5udW1fdGhyZWFkcykgeworICAgICAgICAgbXR4X3VubG9jaygmcG9vbC0+bXV0ZXgpOworICAgICAgICAgdGFza19kZXN0cm95KHRhc2spOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIGluc2VydF9hdF90YWlsKCZwb29sLT5wZW5kaW5nX3Rhc2tzLCAmdGFzay0+bGluayk7CisgICBwb29sLT5udW1fdGFza3MrKzsKKyAgIHBvb2wtPm51bV9wZW5kaW5nX3Rhc2tzKys7CisgICBjbmRfc2lnbmFsKCZwb29sLT50aHJlYWRfd2FrZXVwKTsKKworICAgbXR4X3VubG9jaygmcG9vbC0+bXV0ZXgpOworCisgICByZXR1cm4gdGFzazsKK30KKworLyoqCisgKiBXYWl0IGFuZCBkZXN0cm95IHRoZSB0YXNrcy4KKyAqLworc3RhdGljIGJvb2wKK3Bvb2xfd2FpdF90YXNrcyhzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICoqdGFza3MsCisgICAgICAgICAgICAgICAgaW50IG51bV90YXNrcykKK3sKKyAgIGJvb2wgYWxsX2NvbXBsZXRlZCA9IHRydWU7CisgICBpbnQgaTsKKworICAgZm9yIChpID0gMDsgaSA8IG51bV90YXNrczsgaSsrKSB7CisgICAgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICp0YXNrID0gdGFza3NbaV07CisKKyAgICAgIHdoaWxlICh0YXNrLT5zdGF0ZSAhPSBNRVNBX1RIUkVBRFBPT0xfVEFTS19DT01QTEVURUQgJiYKKyAgICAgICAgICAgICB0YXNrLT5zdGF0ZSAhPSBNRVNBX1RIUkVBRFBPT0xfVEFTS19DQU5DRUxMRUQpCisgICAgICAgICBjbmRfd2FpdCgmdGFzay0+Y29tcGxldGVkLCAmcG9vbC0+bXV0ZXgpOworCisgICAgICBpZiAodGFzay0+c3RhdGUgIT0gTUVTQV9USFJFQURQT09MX1RBU0tfQ09NUExFVEVEKQorICAgICAgICAgYWxsX2NvbXBsZXRlZCA9IGZhbHNlOworCisgICAgICB0YXNrX2Rlc3Ryb3kodGFzayk7CisgICB9CisKKyAgIHBvb2wtPm51bV90YXNrcyAtPSBudW1fdGFza3M7CisKKyAgIHJldHVybiBhbGxfY29tcGxldGVkOworfQorCisvKioKKyAqIFdhaXQgZm9yIFxwIHRhc2tzIHRvIGNvbXBsZXRlLCBhbmQgZGVzdHJveSB0aGVtLiAgSWYgc29tZSBvZiBccCB0YXNrcworICogY2Fubm90IG5vdCBiZSBjb21wbGV0ZWQsIHJldHVybiBmYWxzZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIHdvcmtlciB0aHJlYWRzLgorICovCitib29sCitfbWVzYV90aHJlYWRwb29sX2NvbXBsZXRlX3Rhc2tzKHN0cnVjdCBfbWVzYV90aHJlYWRwb29sICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbF90YXNrICoqdGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fdGFza3MpCit7CisgICBib29sIHByaW9yaXRpemVkID0gZmFsc2UsIGNvbXBsZXRlZDsKKyAgIGludCBpOworCisgICBtdHhfbG9jaygmcG9vbC0+bXV0ZXgpOworCisgICAvKiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0YXNrcyB0aGF0IGFyZSBwZW5kaW5nICovCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Rhc2tzOyBpKyspIHsKKyAgICAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2sgKnRhc2sgPSB0YXNrc1tpXTsKKworICAgICAgaWYgKHRhc2stPnN0YXRlICE9IE1FU0FfVEhSRUFEUE9PTF9UQVNLX1BFTkRJTkcpCisgICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogbW92ZSB0aGVtIHRvIHRoZSBoZWFkIHNvIHRoYXQgdGhleSBhcmUgZXhlY3V0ZWQgbmV4dCAqLworICAgICAgaWYgKCFwcmlvcml0aXplZCkgeworICAgICAgICAgaW50IGo7CisKKyAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbnVtX3Rhc2tzOyBqKyspIHsKKyAgICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZSA9PSBNRVNBX1RIUkVBRFBPT0xfVEFTS19QRU5ESU5HKQorICAgICAgICAgICAgICAgbW92ZV90b19oZWFkKCZwb29sLT5wZW5kaW5nX3Rhc2tzLCAmdGFzay0+bGluayk7CisgICAgICAgICB9CisgICAgICAgICBwcmlvcml0aXplZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgKiBFeGVjdXRlIHJpZ2h0IGF3YXkgZm9yIHdlIHdvdWxkIGhhdmUgdG8gd2FpdCBmb3IgdGhlIHdvcmtlciB0aHJlYWRzCisgICAgICAgKiBvdGhlcndpc2UsIHdoaWNoIGlzIG5vIGZhc3Rlci4gIE1vcmUgaW1wb3J0YW50bHksIHdoZW4gdGhpcyBpcyBjYWxsZWQKKyAgICAgICAqIGZyb20gd2l0aGluIHdvcmtlciB0aHJlYWRzLCB0aGVyZSBtYXkgYmUgbm8gaWRsZSB0aHJlYWQgYXZhaWxhYmxlIHRvCisgICAgICAgKiBleGVjdXRlIHRoZW0uCisgICAgICAgKi8KKyAgICAgIHBvb2xfZXhlY190YXNrKHBvb2wsIHRhc2spOworICAgfQorCisgICBjb21wbGV0ZWQgPSBwb29sX3dhaXRfdGFza3MocG9vbCwgdGFza3MsIG51bV90YXNrcyk7CisKKyAgIG10eF91bmxvY2soJnBvb2wtPm11dGV4KTsKKworICAgcmV0dXJuIGNvbXBsZXRlZDsKK30KKworLyoqCisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBccCBfbWVzYV90aHJlYWRwb29sX2NvbXBsZXRlX3Rhc2tzIHdpdGggb25lCisgKiB0YXNrLgorICovCitib29sCitfbWVzYV90aHJlYWRwb29sX2NvbXBsZXRlX3Rhc2soc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9tZXNhX3RocmVhZHBvb2xfdGFzayAqdGFzaykKK3sKKyAgIGJvb2wgY29tcGxldGVkOworCisgICBtdHhfbG9jaygmcG9vbC0+bXV0ZXgpOworCisgICBpZiAodGFzay0+c3RhdGUgPT0gTUVTQV9USFJFQURQT09MX1RBU0tfUEVORElORykKKyAgICAgIHBvb2xfZXhlY190YXNrKHBvb2wsIHRhc2spOworCisgICBjb21wbGV0ZWQgPSBwb29sX3dhaXRfdGFza3MocG9vbCwgJnRhc2ssIDEpOworCisgICBtdHhfdW5sb2NrKCZwb29sLT5tdXRleCk7CisKKyAgIHJldHVybiBjb21wbGV0ZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitwb29sX2NhbmNlbF9wZW5kaW5nX3Rhc2tzKHN0cnVjdCBfbWVzYV90aHJlYWRwb29sICpwb29sKQoreworICAgc3RydWN0IHNpbXBsZV9ub2RlICpub2RlLCAqdGVtcDsKKworICAgaWYgKGlzX2VtcHR5X2xpc3QoJnBvb2wtPnBlbmRpbmdfdGFza3MpKQorICAgICAgcmV0dXJuOworCisgICBmb3JlYWNoX3Mobm9kZSwgdGVtcCwgJnBvb2wtPnBlbmRpbmdfdGFza3MpIHsKKyAgICAgIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2sgKnRhc2sgPQorICAgICAgICAgKHN0cnVjdCBfbWVzYV90aHJlYWRwb29sX3Rhc2sgKikgbm9kZTsKKworICAgICAgcmVtb3ZlX2Zyb21fbGlzdCgmdGFzay0+bGluayk7CisgICAgICB0YXNrLT5zdGF0ZSA9IE1FU0FfVEhSRUFEUE9PTF9UQVNLX0NBTkNFTExFRDsKKworICAgICAgLyogaW4gY2FzZSBzb21lIHRocmVhZCBpcyBhbHJlYWR5IHdhaXRpbmcgKi8KKyAgICAgIGNuZF9zaWduYWwoJnRhc2stPmNvbXBsZXRlZCk7CisgICB9CisKKyAgIHBvb2wtPm51bV9wZW5kaW5nX3Rhc2tzID0gMDsKK30KKworc3RhdGljIHZvaWQKK3Bvb2xfam9pbl90aHJlYWRzKHN0cnVjdCBfbWVzYV90aHJlYWRwb29sICpwb29sLCBib29sIGdyYWNlZnVsKQoreworICAgaW50IGpvaW5lZF90aHJlYWRzID0gMDsKKworICAgaWYgKCFwb29sLT5udW1fdGhyZWFkcykKKyAgICAgIHJldHVybjsKKworICAgcG9vbC0+dGhyZWFkX2NvbnRyb2wgPSAoZ3JhY2VmdWwpID8KKyAgICAgIE1FU0FfVEhSRUFEUE9PTF9RVUlUIDogTUVTQV9USFJFQURQT09MX1FVSVRfTk9XOworCisgICB3aGlsZSAoam9pbmVkX3RocmVhZHMgPCBwb29sLT5udW1fdGhyZWFkcykgeworICAgICAgaW50IGkgPSBqb2luZWRfdGhyZWFkcywgbnVtX3RocmVhZHMgPSBwb29sLT5udW1fdGhyZWFkczsKKworICAgICAgY25kX2Jyb2FkY2FzdCgmcG9vbC0+dGhyZWFkX3dha2V1cCk7CisgICAgICBtdHhfdW5sb2NrKCZwb29sLT5tdXRleCk7CisgICAgICB3aGlsZSAoaSA8IG51bV90aHJlYWRzKQorICAgICAgICAgdGhyZF9qb2luKHBvb2wtPnRocmVhZHNbaSsrXSwgTlVMTCk7CisgICAgICBtdHhfbG9jaygmcG9vbC0+bXV0ZXgpOworCisgICAgICBqb2luZWRfdGhyZWFkcyA9IG51bV90aHJlYWRzOworICAgfQorCisgICBwb29sLT50aHJlYWRfY29udHJvbCA9IE1FU0FfVEhSRUFEUE9PTF9OT1JNQUw7CisgICBwb29sLT5udW1fdGhyZWFkcyA9IDA7CisgICBhc3NlcnQoIXBvb2wtPmlkbGVfdGhyZWFkcyk7Cit9CisKKy8qKgorICogSm9pbiB3aXRoIGFsbCBwb29sIHRocmVhZHMuICBXaGVuIFxwIGdyYWNlZnVsIGlzIHRydWUsIHdhaXQgZm9yIHRoZSBwZW5kaW5nCisgKiB0YXNrcyB0byBiZSBjb21wbGV0ZWQuCisgKi8KK3ZvaWQKK19tZXNhX3RocmVhZHBvb2xfam9pbihzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCwgYm9vbCBncmFjZWZ1bCkKK3sKKyAgIG10eF9sb2NrKCZwb29sLT5tdXRleCk7CisKKyAgIC8qIHNvbWVvbmUgaXMgYWxyZWFkeSBqb2luaW5nIHdpdGggdGhlIHRocmVhZHMgKi8KKyAgIHdoaWxlICh1bmxpa2VseShwb29sLT50aHJlYWRfY29udHJvbCAhPSBNRVNBX1RIUkVBRFBPT0xfTk9STUFMKSkKKyAgICAgIGNuZF93YWl0KCZwb29sLT50aHJlYWRfam9pbmVkLCAmcG9vbC0+bXV0ZXgpOworCisgICBpZiAocG9vbC0+bnVtX3RocmVhZHMpIHsKKyAgICAgIHBvb2xfam9pbl90aHJlYWRzKHBvb2wsIGdyYWNlZnVsKTsKKyAgICAgIC8qIHdha2UgdXAgd2hvZXZlciBpcyB3YWl0aW5nICovCisgICAgICBjbmRfYnJvYWRjYXN0KCZwb29sLT50aHJlYWRfam9pbmVkKTsKKyAgIH0KKworICAgaWYgKCFncmFjZWZ1bCkKKyAgICAgIHBvb2xfY2FuY2VsX3BlbmRpbmdfdGFza3MocG9vbCk7CisKKyAgIGFzc2VydChwb29sLT5udW1fdGhyZWFkcyA9PSAwKTsKKyAgIGFzc2VydChpc19lbXB0eV9saXN0KCZwb29sLT5wZW5kaW5nX3Rhc2tzKSAmJiAhcG9vbC0+bnVtX3BlbmRpbmdfdGFza3MpOworCisgICBtdHhfdW5sb2NrKCZwb29sLT5tdXRleCk7Cit9CisKKy8qKgorICogQWZ0ZXIgdGhpcyBjYWxsLCBubyB0YXNrIGNhbiBiZSBxdWV1ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitfbWVzYV90aHJlYWRwb29sX3NldF9zaHV0ZG93bihzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCkKK3sKKyAgIG10eF9sb2NrKCZwb29sLT5tdXRleCk7CisgICBwb29sLT5zaHV0ZG93biA9IHRydWU7CisgICBtdHhfdW5sb2NrKCZwb29sLT5tdXRleCk7Cit9CisKKy8qKgorICogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudC4gIERlc3Ryb3kgXHAgcG9vbCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQKKyAqIHJlYWNoZXMgemVyby4KKyAqLwordm9pZAorX21lc2FfdGhyZWFkcG9vbF91bnJlZihzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbCkKK3sKKyAgIGJvb2wgZGVzdHJveSA9IGZhbHNlOworCisgICBtdHhfbG9jaygmcG9vbC0+bXV0ZXgpOworICAgcG9vbC0+cmVmY250LS07CisgICBkZXN0cm95ID0gKHBvb2wtPnJlZmNudCA9PSAwKTsKKyAgIG10eF91bmxvY2soJnBvb2wtPm11dGV4KTsKKworICAgaWYgKGRlc3Ryb3kpIHsKKyAgICAgIF9tZXNhX3RocmVhZHBvb2xfam9pbihwb29sLCBmYWxzZSk7CisKKyAgICAgIGlmIChwb29sLT5udW1fdGFza3MpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGhyZWFkIHBvb2wgZGVzdHJveWVkIHdpdGggJWQgdGFza3NcbiIsCisgICAgICAgICAgICAgICBwb29sLT5udW1fdGFza3MpOworICAgICAgfQorCisgICAgICBmcmVlKHBvb2wtPnRocmVhZHMpOworICAgICAgY25kX2Rlc3Ryb3koJnBvb2wtPnRocmVhZF9qb2luZWQpOworICAgICAgY25kX2Rlc3Ryb3koJnBvb2wtPnRocmVhZF93YWtldXApOworICAgICAgbXR4X2Rlc3Ryb3koJnBvb2wtPm11dGV4KTsKKyAgICAgIGZyZWUocG9vbCk7CisgICB9Cit9CisKKy8qKgorICogSW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudC4KKyAqLworc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKgorX21lc2FfdGhyZWFkcG9vbF9yZWYoc3RydWN0IF9tZXNhX3RocmVhZHBvb2wgKnBvb2wpCit7CisgICBtdHhfbG9jaygmcG9vbC0+bXV0ZXgpOworICAgcG9vbC0+cmVmY250Kys7CisgICBtdHhfdW5sb2NrKCZwb29sLT5tdXRleCk7CisKKyAgIHJldHVybiBwb29sOworfQorCisvKioKKyAqIENyZWF0ZSBhIHRocmVhZCBwb29sLiAgQXMgdGhyZWFkcyBhcmUgc3Bhd25lZCBhcyBuZWVkZWQsIHRoaXMgaXMKKyAqIGluZXhwZW5zaXZlLgorICovCitzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqCitfbWVzYV90aHJlYWRwb29sX2NyZWF0ZShpbnQgbWF4X3RocmVhZHMpCit7CisgICBzdHJ1Y3QgX21lc2FfdGhyZWFkcG9vbCAqcG9vbDsKKworICAgaWYgKG1heF90aHJlYWRzIDwgMSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBwb29sID0gY2FsbG9jKDEsIHNpemVvZigqcG9vbCkpOworICAgaWYgKCFwb29sKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGlmIChtdHhfaW5pdCgmcG9vbC0+bXV0ZXgsIG10eF9wbGFpbikpIHsKKyAgICAgIGZyZWUocG9vbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgcG9vbC0+cmVmY250ID0gMTsKKworICAgaWYgKGNuZF9pbml0KCZwb29sLT50aHJlYWRfd2FrZXVwKSkgeworICAgICAgbXR4X2Rlc3Ryb3koJnBvb2wtPm11dGV4KTsKKyAgICAgIGZyZWUocG9vbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgaWYgKGNuZF9pbml0KCZwb29sLT50aHJlYWRfam9pbmVkKSkgeworICAgICAgY25kX2Rlc3Ryb3koJnBvb2wtPnRocmVhZF93YWtldXApOworICAgICAgbXR4X2Rlc3Ryb3koJnBvb2wtPm11dGV4KTsKKyAgICAgIGZyZWUocG9vbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgcG9vbC0+dGhyZWFkX2NvbnRyb2wgPSBNRVNBX1RIUkVBRFBPT0xfTk9STUFMOworCisgICBwb29sLT50aHJlYWRzID0gbWFsbG9jKHNpemVvZihwb29sLT50aHJlYWRzWzBdKSAqIG1heF90aHJlYWRzKTsKKyAgIGlmICghcG9vbC0+dGhyZWFkcykgeworICAgICAgY25kX2Rlc3Ryb3koJnBvb2wtPnRocmVhZF9qb2luZWQpOworICAgICAgY25kX2Rlc3Ryb3koJnBvb2wtPnRocmVhZF93YWtldXApOworICAgICAgbXR4X2Rlc3Ryb3koJnBvb2wtPm11dGV4KTsKKyAgICAgIGZyZWUocG9vbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgcG9vbC0+bWF4X3RocmVhZHMgPSBtYXhfdGhyZWFkczsKKworICAgbWFrZV9lbXB0eV9saXN0KCZwb29sLT5wZW5kaW5nX3Rhc2tzKTsKKworICAgcmV0dXJuIHBvb2w7Cit9CisKK3N0YXRpYyBtdHhfdCB0aHJlYWRwb29sX2xvY2sgPSBfTVRYX0lOSVRJQUxJWkVSX05QOworc3RhdGljIHN0cnVjdCBfbWVzYV90aHJlYWRwb29sICp0aHJlYWRwb29sOworCisvKioKKyAqIEdldCB0aGUgc2luZ2xldG9uIEdMU0wgdGhyZWFkIHBvb2wuICBccCBtYXhfdGhyZWFkcyBpcyBob25vcmVkIG9ubHkgYnkgdGhlCisgKiBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBfbWVzYV90aHJlYWRwb29sICoKK19tZXNhX2dsc2xfZ2V0X3RocmVhZHBvb2woaW50IG1heF90aHJlYWRzKQoreworICAgbXR4X2xvY2soJnRocmVhZHBvb2xfbG9jayk7CisgICBpZiAoIXRocmVhZHBvb2wpCisgICAgICB0aHJlYWRwb29sID0gX21lc2FfdGhyZWFkcG9vbF9jcmVhdGUobWF4X3RocmVhZHMpOworICAgaWYgKHRocmVhZHBvb2wpCisgICAgICBfbWVzYV90aHJlYWRwb29sX3JlZih0aHJlYWRwb29sKTsKKyAgIG10eF91bmxvY2soJnRocmVhZHBvb2xfbG9jayk7CisKKyAgIHJldHVybiB0aHJlYWRwb29sOworfQorCisvKioKKyAqIFdhaXQgdW50aWwgYWxsIHRhc2tzIGFyZSBjb21wbGV0ZWQgYW5kIHRocmVhZHMgYXJlIGpvaW5lZC4KKyAqLwordm9pZAorX21lc2FfZ2xzbF93YWl0X3RocmVhZHBvb2wodm9pZCkKK3sKKyAgIG10eF9sb2NrKCZ0aHJlYWRwb29sX2xvY2spOworICAgaWYgKHRocmVhZHBvb2wpCisgICAgICBfbWVzYV90aHJlYWRwb29sX2pvaW4odGhyZWFkcG9vbCwgdHJ1ZSk7CisgICBtdHhfdW5sb2NrKCZ0aHJlYWRwb29sX2xvY2spOworfQorCisvKioKKyAqIERlc3Ryb3kgdGhlIEdMU0wgdGhyZWFkIHBvb2wuCisgKi8KK3ZvaWQKK19tZXNhX2dsc2xfZGVzdHJveV90aHJlYWRwb29sKHZvaWQpCit7CisgICBtdHhfbG9jaygmdGhyZWFkcG9vbF9sb2NrKTsKKyAgIGlmICh0aHJlYWRwb29sKSB7CisgICAgICAvKgorICAgICAgICogVGhpcyBpcyBjYWxsZWQgZnJvbSBfbWVzYV9kZXN0cm95X3NoYWRlcl9jb21waWxlcigpLiAgTm8gbmV3IHRhc2sgaXMKKyAgICAgICAqIGFsbG93ZWQgc2luY2UgdGhpcyBwb2ludC4gIEJ1dCBjb250ZXh0cywgd2hvIGFsc28gb3duIHJlZmVyZW5jZXMgdG8KKyAgICAgICAqIHRoZSBwb29sLCBjYW4gc3RpbGwgY29tcGxldGUgdGFza3MgdGhhdCBoYXZlIGJlZW4gcXVldWVkLgorICAgICAgICovCisgICAgICBfbWVzYV90aHJlYWRwb29sX3NldF9zaHV0ZG93bih0aHJlYWRwb29sKTsKKworICAgICAgX21lc2FfdGhyZWFkcG9vbF9qb2luKHRocmVhZHBvb2wsIGZhbHNlKTsKKyAgICAgIF9tZXNhX3RocmVhZHBvb2xfdW5yZWYodGhyZWFkcG9vbCk7CisgICAgICB0aHJlYWRwb29sID0gTlVMTDsKKyAgIH0KKyAgIG10eF91bmxvY2soJnRocmVhZHBvb2xfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZGVzYy5jIGIvaWNkL2ludGVsL2Rlc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjM4MDJiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2Rlc2MuYwpAQCAtMCwwICsxLDEwMTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJidWYuaCIKKyNpbmNsdWRlICJjbWQuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJncHUuaCIKKyNpbmNsdWRlICJpbWcuaCIKKyNpbmNsdWRlICJzYW1wbGVyLmgiCisjaW5jbHVkZSAidmlldy5oIgorI2luY2x1ZGUgImRlc2MuaCIKKworZW51bSBpbnRlbF9kZXNjX3N1cmZhY2VfdHlwZSB7CisgICAgSU5URUxfREVTQ19TVVJGQUNFX1VOVVNFRCwKKyAgICBJTlRFTF9ERVNDX1NVUkZBQ0VfQlVGLAorICAgIElOVEVMX0RFU0NfU1VSRkFDRV9JTUcsCit9OworCitzdHJ1Y3QgaW50ZWxfZGVzY19zdXJmYWNlIHsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfbWVtICptZW07CisgICAgYm9vbCByZWFkX29ubHk7CisKKyAgICBlbnVtIGludGVsX2Rlc2Nfc3VyZmFjZV90eXBlIHR5cGU7CisgICAgdW5pb24geworICAgICAgICBjb25zdCB2b2lkICp1bnVzZWQ7CisgICAgICAgIHN0cnVjdCBpbnRlbF9idWZfdmlldyBidWY7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWdfdmlldyAqaW1nOworICAgIH0gdTsKK307CisKK3N0cnVjdCBpbnRlbF9kZXNjX3NhbXBsZXIgeworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9zYW1wbGVyICpzYW1wbGVyOworfTsKKworYm9vbCBpbnRlbF9kZXNjX2l0ZXJfaW5pdF9mb3JfYmluZGluZyhzdHJ1Y3QgaW50ZWxfZGVzY19pdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmluZGluZ19pbmRleCwgdWludDMyX3QgYXJyYXlfYmFzZSkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXRfYmluZGluZyAqYmluZGluZzsKKyAgICB1aW50MzJfdCBpOworCisgICAgLyogc2hvdWxkIHdlIHdhc3RlIHNvbWUgbWVtb3J5IHRvIGdldCByaWQgb2YgdGhpcyBsb29wPyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsYXlvdXQtPmJpbmRpbmdfY291bnQ7IGkrKykgeworICAgICAgICBpZiAobGF5b3V0LT5iaW5kaW5nc1tpXS5iaW5kaW5nID09IGJpbmRpbmdfaW5kZXgpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSA+PSBsYXlvdXQtPmJpbmRpbmdfY291bnQgfHwKKyAgICAgICAgYXJyYXlfYmFzZSA+PSBsYXlvdXQtPmJpbmRpbmdzW2ldLmFycmF5X3NpemUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJpbmRpbmcgPSAmbGF5b3V0LT5iaW5kaW5nc1tpXTsKKworICAgIGl0ZXItPnR5cGUgPSBiaW5kaW5nLT50eXBlOworICAgIGl0ZXItPmluY3JlbWVudCA9IGJpbmRpbmctPmluY3JlbWVudDsKKyAgICBpdGVyLT5zaXplID0gYmluZGluZy0+YXJyYXlfc2l6ZTsKKworICAgIGludGVsX2Rlc2Nfb2Zmc2V0X21hZCgmaXRlci0+YmVnaW4sICZiaW5kaW5nLT5pbmNyZW1lbnQsCisgICAgICAgICAgICAmYmluZGluZy0+b2Zmc2V0LCBhcnJheV9iYXNlKTsKKyAgICBpbnRlbF9kZXNjX29mZnNldF9hZGQoJml0ZXItPmVuZCwgJml0ZXItPmJlZ2luLCAmYmluZGluZy0+aW5jcmVtZW50KTsKKyAgICBpdGVyLT5jdXIgPSBhcnJheV9iYXNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGRlc2NfaXRlcl9pbml0X2Zvcl93cml0aW5nKHN0cnVjdCBpbnRlbF9kZXNjX2l0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpbmRpbmdfaW5kZXgsIHVpbnQzMl90IGFycmF5X2Jhc2UpCit7CisgICAgaWYgKCFpbnRlbF9kZXNjX2l0ZXJfaW5pdF9mb3JfYmluZGluZyhpdGVyLCBzZXQtPmxheW91dCwKKyAgICAgICAgICAgICAgICBiaW5kaW5nX2luZGV4LCBhcnJheV9iYXNlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50ZWxfZGVzY19vZmZzZXRfYWRkKCZpdGVyLT5iZWdpbiwgJml0ZXItPmJlZ2luLCAmc2V0LT5yZWdpb25fYmVnaW4pOworICAgIGludGVsX2Rlc2Nfb2Zmc2V0X2FkZCgmaXRlci0+ZW5kLCAmaXRlci0+ZW5kLCAmc2V0LT5yZWdpb25fYmVnaW4pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaW50ZWxfZGVzY19pdGVyX2FkdmFuY2Uoc3RydWN0IGludGVsX2Rlc2NfaXRlciAqaXRlcikKK3sKKyAgICBpZiAoaXRlci0+Y3VyID49IGl0ZXItPnNpemUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGl0ZXItPmN1cisrOworCisgICAgaXRlci0+YmVnaW4gPSBpdGVyLT5lbmQ7CisgICAgaW50ZWxfZGVzY19vZmZzZXRfYWRkKCZpdGVyLT5lbmQsICZpdGVyLT5lbmQsICZpdGVyLT5pbmNyZW1lbnQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGRlc2NfcmVnaW9uX2luaXRfZGVzY19zaXplcyhzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpCit7CisgICAgcmVnaW9uLT5zdXJmYWNlX2Rlc2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW50ZWxfZGVzY19zdXJmYWNlKTsKKyAgICByZWdpb24tPnNhbXBsZXJfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBpbnRlbF9kZXNjX3NhbXBsZXIpOworfQorCitWa1Jlc3VsdCBpbnRlbF9kZXNjX3JlZ2lvbl9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICoqcmVnaW9uX3JldCkKK3sKKyAgICBjb25zdCB1aW50MzJfdCBzdXJmYWNlX2NvdW50ID0gMTAyNCoxMDI0OworICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsZXJfY291bnQgPSAxMDI0KjEwMjQ7CisgICAgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb247CisKKyAgICByZWdpb24gPSBpbnRlbF9hbGxvYyhkZXYsIHNpemVvZigqcmVnaW9uKSwgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0RFVklDRSk7CisgICAgaWYgKCFyZWdpb24pCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBtZW1zZXQocmVnaW9uLCAwLCBzaXplb2YoKnJlZ2lvbikpOworCisgICAgZGVzY19yZWdpb25faW5pdF9kZXNjX3NpemVzKHJlZ2lvbiwgZGV2LT5ncHUpOworCisgICAgaW50ZWxfZGVzY19vZmZzZXRfc2V0KCZyZWdpb24tPnNpemUsCisgICAgICAgICAgICByZWdpb24tPnN1cmZhY2VfZGVzY19zaXplICogc3VyZmFjZV9jb3VudCwKKyAgICAgICAgICAgIHJlZ2lvbi0+c2FtcGxlcl9kZXNjX3NpemUgKiBzYW1wbGVyX2NvdW50KTsKKworICAgIHJlZ2lvbi0+c3VyZmFjZXMgPSBpbnRlbF9hbGxvYyhkZXYsIHJlZ2lvbi0+c2l6ZS5zdXJmYWNlLAorICAgICAgICAgICAgNjQsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0RFVklDRSk7CisgICAgaWYgKCFyZWdpb24tPnN1cmZhY2VzKSB7CisgICAgICAgIGludGVsX2ZyZWUoZGV2LCByZWdpb24pOworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKworICAgIHJlZ2lvbi0+c2FtcGxlcnMgPSBpbnRlbF9hbGxvYyhkZXYsIHJlZ2lvbi0+c2l6ZS5zYW1wbGVyLAorICAgICAgICAgICAgNjQsIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0RFVklDRSk7CisgICAgaWYgKCFyZWdpb24tPnNhbXBsZXJzKSB7CisgICAgICAgIGludGVsX2ZyZWUoZGV2LCByZWdpb24tPnN1cmZhY2VzKTsKKyAgICAgICAgaW50ZWxfZnJlZShkZXYsIHJlZ2lvbik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorCisgICAgKnJlZ2lvbl9yZXQgPSByZWdpb247CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9kZXNjX3JlZ2lvbl9kZXN0cm95KHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbikKK3sKKyAgICBpbnRlbF9mcmVlKGRldiwgcmVnaW9uLT5zYW1wbGVycyk7CisgICAgaW50ZWxfZnJlZShkZXYsIHJlZ2lvbi0+c3VyZmFjZXMpOworICAgIGludGVsX2ZyZWUoZGV2LCByZWdpb24pOworfQorCisvKioKKyAqIEdldCB0aGUgc2l6ZSBvZiBhIGRlc2NyaXB0b3IgaW4gdGhlIHJlZ2lvbi4KKyAqLworc3RhdGljIFZrUmVzdWx0IGRlc2NfcmVnaW9uX2dldF9kZXNjX3NpemUoY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGVzY3JpcHRvclR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpzaXplKQoreworICAgIHVpbnQzMl90IHN1cmZhY2Vfc2l6ZSA9IDAsIHNhbXBsZXJfc2l6ZSA9IDA7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVSOgorICAgICAgICBzYW1wbGVyX3NpemUgPSByZWdpb24tPnNhbXBsZXJfZGVzY19zaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOgorICAgICAgICBzdXJmYWNlX3NpemUgPSByZWdpb24tPnN1cmZhY2VfZGVzY19zaXplOworICAgICAgICBzYW1wbGVyX3NpemUgPSByZWdpb24tPnNhbXBsZXJfZGVzY19zaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0U6CisgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI6CisgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVI6CisgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVI6CisgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI6CisgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOgorICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX0lOUFVUX0FUVEFDSE1FTlQ6CisgICAgICAgIHN1cmZhY2Vfc2l6ZSA9IHJlZ2lvbi0+c3VyZmFjZV9kZXNjX3NpemU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCghInVua25vd24gZGVzY3JpcHRvciB0eXBlIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGludGVsX2Rlc2Nfb2Zmc2V0X3NldChzaXplLCBzdXJmYWNlX3NpemUsIHNhbXBsZXJfc2l6ZSk7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVmtSZXN1bHQgaW50ZWxfZGVzY19yZWdpb25fYWxsb2Moc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqZW5kKQoreworICAgIHVpbnQzMl90IHN1cmZhY2Vfc2l6ZSA9IDAsIHNhbXBsZXJfc2l6ZSA9IDA7CisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IGFsbG9jOworICAgIHVpbnQzMl90IGk7CisKKyAgICAvKiBjYWxjdWxhdGUgc2l6ZXMgbmVlZGVkICovCisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPnBvb2xTaXplQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sU2l6ZSAqdGMgPSAmaW5mby0+cFBvb2xTaXplc1tpXTsKKyAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IHNpemU7CisgICAgICAgIFZrUmVzdWx0IHJldDsKKworICAgICAgICByZXQgPSBkZXNjX3JlZ2lvbl9nZXRfZGVzY19zaXplKHJlZ2lvbiwgdGMtPnR5cGUsICZzaXplKTsKKyAgICAgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBzdXJmYWNlX3NpemUgKz0gc2l6ZS5zdXJmYWNlICogdGMtPmRlc2NyaXB0b3JDb3VudDsKKyAgICAgICAgc2FtcGxlcl9zaXplICs9IHNpemUuc2FtcGxlciAqIHRjLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgfQorCisgICAgc3VyZmFjZV9zaXplICo9IG1heF9zZXRzOworICAgIHNhbXBsZXJfc2l6ZSAqPSBtYXhfc2V0czsKKworICAgIGludGVsX2Rlc2Nfb2Zmc2V0X3NldCgmYWxsb2MsIHN1cmZhY2Vfc2l6ZSwgc2FtcGxlcl9zaXplKTsKKworICAgICpiZWdpbiA9IHJlZ2lvbi0+Y3VyOworICAgIGludGVsX2Rlc2Nfb2Zmc2V0X2FkZChlbmQsICZyZWdpb24tPmN1ciwgJmFsbG9jKTsKKworICAgIGlmICghaW50ZWxfZGVzY19vZmZzZXRfd2l0aGluKGVuZCwgJnJlZ2lvbi0+c2l6ZSkpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICAvKiBpbmNyZW1lbnQgdGhlIHdyaXRlciBwb2ludGVyICovCisgICAgcmVnaW9uLT5jdXIgPSAqZW5kOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGRlc2NfcmVnaW9uX3ZhbGlkYXRlX2JlZ2luX2VuZChjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqZW5kKQoreworICAgIGFzc2VydChiZWdpbi0+c3VyZmFjZSAlIHJlZ2lvbi0+c3VyZmFjZV9kZXNjX3NpemUgPT0gMCAmJgorICAgICAgICAgICBiZWdpbi0+c2FtcGxlciAlIHJlZ2lvbi0+c2FtcGxlcl9kZXNjX3NpemUgPT0gMCk7CisgICAgYXNzZXJ0KGVuZC0+c3VyZmFjZSAlIHJlZ2lvbi0+c3VyZmFjZV9kZXNjX3NpemUgPT0gMCAmJgorICAgICAgICAgICBlbmQtPnNhbXBsZXIgJSByZWdpb24tPnNhbXBsZXJfZGVzY19zaXplID09IDApOworICAgIGFzc2VydChpbnRlbF9kZXNjX29mZnNldF93aXRoaW4oZW5kLCAmcmVnaW9uLT5zaXplKSk7Cit9CisKK3ZvaWQgaW50ZWxfZGVzY19yZWdpb25fZnJlZShzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqZW5kKQoreworICAgIGRlc2NfcmVnaW9uX3ZhbGlkYXRlX2JlZ2luX2VuZChyZWdpb24sIGJlZ2luLCBlbmQpOworCisgICAgLyogaXMgaXQgb2sgbm90IHRvIHJlY2xhaW0/ICovCit9CisKK3ZvaWQgaW50ZWxfZGVzY19yZWdpb25fdXBkYXRlKHN0cnVjdCBpbnRlbF9kZXNjX3JlZ2lvbiAqcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfc3VyZmFjZSAqc3VyZmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19zYW1wbGVyICpzYW1wbGVycykKK3sKKyAgICBkZXNjX3JlZ2lvbl92YWxpZGF0ZV9iZWdpbl9lbmQocmVnaW9uLCBiZWdpbiwgZW5kKTsKKworICAgIGlmIChiZWdpbi0+c3VyZmFjZSA8IGVuZC0+c3VyZmFjZSkgeworICAgICAgICBtZW1jcHkoKGNoYXIgKikgcmVnaW9uLT5zdXJmYWNlcyArIGJlZ2luLT5zdXJmYWNlLCBzdXJmYWNlcywKKyAgICAgICAgICAgICAgICBlbmQtPnN1cmZhY2UgLSBiZWdpbi0+c3VyZmFjZSk7CisgICAgfQorCisgICAgaWYgKGJlZ2luLT5zYW1wbGVyIDwgZW5kLT5zYW1wbGVyKSB7CisgICAgICAgIG1lbWNweSgoY2hhciAqKSByZWdpb24tPnNhbXBsZXJzICsgYmVnaW4tPnNhbXBsZXIsIHNhbXBsZXJzLAorICAgICAgICAgICAgICAgIGVuZC0+c2FtcGxlciAtIGJlZ2luLT5zYW1wbGVyKTsKKyAgICB9Cit9CisKK3ZvaWQgaW50ZWxfZGVzY19yZWdpb25fY29weShzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqc3JjKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBzcmNfZW5kOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2UgKnN1cmZhY2VzOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3NhbXBsZXIgKnNhbXBsZXJzOworCisgICAgLyogbm8gb3ZlcmxhcCAqLworICAgIGFzc2VydChpbnRlbF9kZXNjX29mZnNldF93aXRoaW4oc3JjLCBiZWdpbikgfHwKKyAgICAgICAgICAgaW50ZWxfZGVzY19vZmZzZXRfd2l0aGluKGVuZCwgc3JjKSk7CisKKyAgICAvKiBubyByZWFkIHBhc3QgcmVnaW9uICovCisgICAgaW50ZWxfZGVzY19vZmZzZXRfc3ViKCZzcmNfZW5kLCBlbmQsIGJlZ2luKTsKKyAgICBpbnRlbF9kZXNjX29mZnNldF9hZGQoJnNyY19lbmQsIHNyYywgJnNyY19lbmQpOworICAgIGFzc2VydChpbnRlbF9kZXNjX29mZnNldF93aXRoaW4oJnNyY19lbmQsICZyZWdpb24tPnNpemUpKTsKKworICAgIHN1cmZhY2VzID0gKGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2UgKikKKyAgICAgICAgKChjb25zdCBjaGFyICopIHJlZ2lvbi0+c3VyZmFjZXMgKyBzcmMtPnN1cmZhY2UpOworICAgIHNhbXBsZXJzID0gKGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3NhbXBsZXIgKikKKyAgICAgICAgKChjb25zdCBjaGFyICopIHJlZ2lvbi0+c2FtcGxlcnMgKyBzcmMtPnNhbXBsZXIpOworCisgICAgaW50ZWxfZGVzY19yZWdpb25fdXBkYXRlKHJlZ2lvbiwgYmVnaW4sIGVuZCwgc3VyZmFjZXMsIHNhbXBsZXJzKTsKK30KKwordm9pZCBpbnRlbF9kZXNjX3JlZ2lvbl9yZWFkX3N1cmZhY2UoY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9tZW0gKiptZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZWFkX29ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjbWRfbGVuKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2UgKmRlc2M7CisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IGVuZDsKKworICAgIGludGVsX2Rlc2Nfb2Zmc2V0X3NldCgmZW5kLAorICAgICAgICAgICAgb2Zmc2V0LT5zdXJmYWNlICsgcmVnaW9uLT5zdXJmYWNlX2Rlc2Nfc2l6ZSwgb2Zmc2V0LT5zYW1wbGVyKTsKKyAgICBkZXNjX3JlZ2lvbl92YWxpZGF0ZV9iZWdpbl9lbmQocmVnaW9uLCBvZmZzZXQsICZlbmQpOworCisgICAgZGVzYyA9IChjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19zdXJmYWNlICopCisgICAgICAgICgoY29uc3QgY2hhciAqKSByZWdpb24tPnN1cmZhY2VzICsgb2Zmc2V0LT5zdXJmYWNlKTsKKworICAgICptZW0gPSBkZXNjLT5tZW07CisgICAgKnJlYWRfb25seSA9IGRlc2MtPnJlYWRfb25seTsKKyAgICBzd2l0Y2ggKGRlc2MtPnR5cGUpIHsKKyAgICBjYXNlIElOVEVMX0RFU0NfU1VSRkFDRV9CVUY6CisgICAgICAgICpjbWQgPSAoc3RhZ2UgPT0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCkgPworICAgICAgICAgICAgZGVzYy0+dS5idWYuZnNfY21kIDogZGVzYy0+dS5idWYuY21kOworICAgICAgICAqY21kX2xlbiA9IGRlc2MtPnUuYnVmLmNtZF9sZW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVTQ19TVVJGQUNFX0lNRzoKKyAgICAgICAgKmNtZCA9IGRlc2MtPnUuaW1nLT5jbWQ7CisgICAgICAgICpjbWRfbGVuID0gZGVzYy0+dS5pbWctPmNtZF9sZW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfREVTQ19TVVJGQUNFX1VOVVNFRDoKKyAgICBkZWZhdWx0OgorICAgICAgICAqY21kID0gTlVMTDsKKyAgICAgICAgKmNtZF9sZW4gPSAwOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgaW50ZWxfZGVzY19yZWdpb25fcmVhZF9zYW1wbGVyKGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3JlZ2lvbiAqcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqKnNhbXBsZXIpCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfc2FtcGxlciAqZGVzYzsKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgZW5kOworCisgICAgaW50ZWxfZGVzY19vZmZzZXRfc2V0KCZlbmQsCisgICAgICAgICAgICBvZmZzZXQtPnN1cmZhY2UsIG9mZnNldC0+c2FtcGxlciArIHJlZ2lvbi0+c2FtcGxlcl9kZXNjX3NpemUpOworICAgIGRlc2NfcmVnaW9uX3ZhbGlkYXRlX2JlZ2luX2VuZChyZWdpb24sIG9mZnNldCwgJmVuZCk7CisKKyAgICBkZXNjID0gKGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3NhbXBsZXIgKikKKyAgICAgICAgKChjb25zdCBjaGFyICopIHJlZ2lvbi0+c2FtcGxlcnMgKyBvZmZzZXQtPnNhbXBsZXIpOworCisgICAgKnNhbXBsZXIgPSBkZXNjLT5zYW1wbGVyOworfQorCitzdGF0aWMgdm9pZCBkZXNjX3Bvb2xfZGVzdHJveShzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqcG9vbCA9IGludGVsX2Rlc2NfcG9vbF9mcm9tX29iaihvYmopOworCisgICAgaW50ZWxfZGVzY19wb29sX2Rlc3Ryb3kocG9vbCk7Cit9CisKK1ZrUmVzdWx0IGludGVsX2Rlc2NfcG9vbF9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqKnBvb2xfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9kZXNjX3Bvb2wgKnBvb2w7CisgICAgVmtSZXN1bHQgcmV0OworCisgICAgcG9vbCA9IChzdHJ1Y3QgaW50ZWxfZGVzY19wb29sICopIGludGVsX2Jhc2VfY3JlYXRlKCZkZXYtPmJhc2UuaGFuZGxlLAorICAgICAgICAgICAgc2l6ZW9mKCpwb29sKSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQsCisgICAgICAgICAgICBpbmZvLCAwKTsKKyAgICBpZiAoIXBvb2wpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBwb29sLT5kZXYgPSBkZXY7CisKKyAgICByZXQgPSBpbnRlbF9kZXNjX3JlZ2lvbl9hbGxvYyhkZXYtPmRlc2NfcmVnaW9uLCBpbmZvLT5tYXhTZXRzLCBpbmZvLAorICAgICAgICAgICAgJnBvb2wtPnJlZ2lvbl9iZWdpbiwgJnBvb2wtPnJlZ2lvbl9lbmQpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJnBvb2wtPm9iai5iYXNlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBwb2ludCB0byBoZWFkICovCisgICAgcG9vbC0+Y3VyID0gcG9vbC0+cmVnaW9uX2JlZ2luOworCisgICAgcG9vbC0+b2JqLmRlc3Ryb3kgPSBkZXNjX3Bvb2xfZGVzdHJveTsKKworICAgICpwb29sX3JldCA9IHBvb2w7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9kZXNjX3Bvb2xfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZGVzY19wb29sICpwb29sKQoreworICAgIGludGVsX2Rlc2NfcmVnaW9uX2ZyZWUocG9vbC0+ZGV2LT5kZXNjX3JlZ2lvbiwKKyAgICAgICAgICAgICZwb29sLT5yZWdpb25fYmVnaW4sICZwb29sLT5yZWdpb25fZW5kKTsKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJnBvb2wtPm9iai5iYXNlKTsKK30KKworVmtSZXN1bHQgaW50ZWxfZGVzY19wb29sX2FsbG9jKHN0cnVjdCBpbnRlbF9kZXNjX3Bvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmVuZCkKK3sKKyAgICAqYmVnaW4gPSBwb29sLT5jdXI7CisgICAgaW50ZWxfZGVzY19vZmZzZXRfYWRkKGVuZCwgJnBvb2wtPmN1ciwgJmxheW91dC0+cmVnaW9uX3NpemUpOworCisgICAgaWYgKCFpbnRlbF9kZXNjX29mZnNldF93aXRoaW4oZW5kLCAmcG9vbC0+cmVnaW9uX2VuZCkpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICAvKiBpbmNyZW1lbnQgdGhlIHdyaXRlciBwb2ludGVyICovCisgICAgcG9vbC0+Y3VyID0gKmVuZDsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2Rlc2NfcG9vbF9yZXNldChzdHJ1Y3QgaW50ZWxfZGVzY19wb29sICpwb29sKQoreworICAgIC8qIHJlc2V0IHRvIGhlYWQgKi8KKyAgICBwb29sLT5jdXIgPSBwb29sLT5yZWdpb25fYmVnaW47Cit9CisKK3N0YXRpYyB2b2lkIGRlc2Nfc2V0X2Rlc3Ryb3koc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXNjX3NldCAqc2V0ID0gaW50ZWxfZGVzY19zZXRfZnJvbV9vYmoob2JqKTsKKworICAgIGludGVsX2Rlc2Nfc2V0X2Rlc3Ryb3koc2V0KTsKK30KKworVmtSZXN1bHQgaW50ZWxfZGVzY19zZXRfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19wb29sICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX3NldCAqKnNldF9yZXQpCit7CisgICAgc3RydWN0IGludGVsX2Rlc2Nfc2V0ICpzZXQ7CisgICAgVmtSZXN1bHQgcmV0OworCisgICAgc2V0ID0gKHN0cnVjdCBpbnRlbF9kZXNjX3NldCAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqc2V0KSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCwKKyAgICAgICAgICAgIE5VTEwsIDApOworICAgIGlmICghc2V0KQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgc2V0LT5yZWdpb24gPSBkZXYtPmRlc2NfcmVnaW9uOworICAgIHJldCA9IGludGVsX2Rlc2NfcG9vbF9hbGxvYyhwb29sLCBsYXlvdXQsCisgICAgICAgICAgICAmc2V0LT5yZWdpb25fYmVnaW4sICZzZXQtPnJlZ2lvbl9lbmQpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJnNldC0+b2JqLmJhc2UpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHNldC0+bGF5b3V0ID0gbGF5b3V0OworCisgICAgc2V0LT5vYmouZGVzdHJveSA9IGRlc2Nfc2V0X2Rlc3Ryb3k7CisKKyAgICAqc2V0X3JldCA9IHNldDsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2Rlc2Nfc2V0X2Rlc3Ryb3koc3RydWN0IGludGVsX2Rlc2Nfc2V0ICpzZXQpCit7CisgICAgaW50ZWxfYmFzZV9kZXN0cm95KCZzZXQtPm9iai5iYXNlKTsKK30KKworc3RhdGljIGJvb2wgZGVzY19zZXRfaW1nX2xheW91dF9yZWFkX29ubHkoVmtJbWFnZUxheW91dCBsYXlvdXQpCit7CisgICAgc3dpdGNoIChsYXlvdXQpIHsKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX1JFQURfT05MWV9PUFRJTUFMOgorICAgIGNhc2UgVktfSU1BR0VfTEFZT1VUX1NIQURFUl9SRUFEX09OTFlfT1BUSU1BTDoKKyAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVzY19zZXRfd3JpdGVfc2FtcGxlcihzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfaXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3NhbXBsZXIgKnNhbXBsZXIpCit7CisgICAgc3RydWN0IGludGVsX2Rlc2Nfc2FtcGxlciBkZXNjOworCisgICAgZGVzYy5zYW1wbGVyID0gc2FtcGxlcjsKKyAgICBpbnRlbF9kZXNjX3JlZ2lvbl91cGRhdGUoc2V0LT5yZWdpb24sICZpdGVyLT5iZWdpbiwgJml0ZXItPmVuZCwKKyAgICAgICAgICAgIE5VTEwsICZkZXNjKTsKK30KKworc3RhdGljIHZvaWQgZGVzY19zZXRfd3JpdGVfY29tYmluZWRfaW1hZ2Vfc2FtcGxlcihzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfaXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ltZ192aWV3ICppbWdfdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbWdfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqc2FtcGxlcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19zdXJmYWNlIHZpZXdfZGVzYzsKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19zYW1wbGVyIHNhbXBsZXJfZGVzYzsKKworICAgIHZpZXdfZGVzYy5tZW0gPSBpbWdfdmlldy0+aW1nLT5vYmoubWVtOworICAgIHZpZXdfZGVzYy5yZWFkX29ubHkgPSBkZXNjX3NldF9pbWdfbGF5b3V0X3JlYWRfb25seShpbWdfbGF5b3V0KTsKKyAgICB2aWV3X2Rlc2MudHlwZSA9IElOVEVMX0RFU0NfU1VSRkFDRV9JTUc7CisgICAgdmlld19kZXNjLnUuaW1nID0gaW1nX3ZpZXc7CisKKyAgICBzYW1wbGVyX2Rlc2Muc2FtcGxlciA9IHNhbXBsZXI7CisKKyAgICBpbnRlbF9kZXNjX3JlZ2lvbl91cGRhdGUoc2V0LT5yZWdpb24sICZpdGVyLT5iZWdpbiwgJml0ZXItPmVuZCwKKyAgICAgICAgICAgICZ2aWV3X2Rlc2MsICZzYW1wbGVyX2Rlc2MpOworfQorCitzdGF0aWMgdm9pZCBkZXNjX3NldF93cml0ZV9pbWFnZShzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX2l0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfaW1nX3ZpZXcgKmltZ192aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBpbWdfbGF5b3V0KQoreworICAgIHN0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2UgZGVzYzsKKworICAgIGRlc2MubWVtID0gaW1nX3ZpZXctPmltZy0+b2JqLm1lbTsKKyAgICBkZXNjLnJlYWRfb25seSA9IGRlc2Nfc2V0X2ltZ19sYXlvdXRfcmVhZF9vbmx5KGltZ19sYXlvdXQpOworICAgIGRlc2MudHlwZSA9IElOVEVMX0RFU0NfU1VSRkFDRV9JTUc7CisgICAgZGVzYy51LmltZyA9IGltZ192aWV3OworICAgIGludGVsX2Rlc2NfcmVnaW9uX3VwZGF0ZShzZXQtPnJlZ2lvbiwgJml0ZXItPmJlZ2luLCAmaXRlci0+ZW5kLAorICAgICAgICAgICAgJmRlc2MsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBkZXNjX3NldF93cml0ZV9idWZmZXIoc3RydWN0IGludGVsX2Rlc2Nfc2V0ICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfaXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKmJ1Zl92aWV3KQoreworICAgIHN0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2UgZGVzYzsKKworICAgIGRlc2MubWVtID0gYnVmX3ZpZXctPmJ1Zi0+b2JqLm1lbTsKKyAgICBkZXNjLnJlYWRfb25seSA9IGZhbHNlOworICAgIGRlc2MudHlwZSA9IElOVEVMX0RFU0NfU1VSRkFDRV9CVUY7CisgICAgbWVtY3B5KCh2b2lkKikmZGVzYy51LmJ1ZiwgYnVmX3ZpZXcsIHNpemVvZigqYnVmX3ZpZXcpKTsKKyAgICBpbnRlbF9kZXNjX3JlZ2lvbl91cGRhdGUoc2V0LT5yZWdpb24sICZpdGVyLT5iZWdpbiwgJml0ZXItPmVuZCwKKyAgICAgICAgICAgICZkZXNjLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZGVzY19sYXlvdXRfZGVzdHJveShzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICpsYXlvdXQgPSBpbnRlbF9kZXNjX2xheW91dF9mcm9tX29iaihvYmopOworCisgICAgaW50ZWxfZGVzY19sYXlvdXRfZGVzdHJveShsYXlvdXQpOworfQorCitzdGF0aWMgVmtSZXN1bHQgZGVzY19sYXlvdXRfaW5pdF9iaW5kaW5ncyhzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gKmluZm8pCit7CisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IG9mZnNldDsKKyAgICB1aW50MzJfdCBpOworICAgIFZrUmVzdWx0IHJldDsKKworICAgIGludGVsX2Rlc2Nfb2Zmc2V0X3NldCgmb2Zmc2V0LCAwLCAwKTsKKworICAgIC8qIGFsbG9jYXRlIGJpbmRpbmdzICovCisgICAgbGF5b3V0LT5iaW5kaW5ncyA9IGludGVsX2FsbG9jKGxheW91dCwgc2l6ZW9mKGxheW91dC0+YmluZGluZ3NbMF0pICoKKyAgICAgICAgICAgIGluZm8tPmJpbmRpbmdDb3VudCwgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgaWYgKCFsYXlvdXQtPmJpbmRpbmdzKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgbWVtc2V0KGxheW91dC0+YmluZGluZ3MsIDAsCisgICAgICAgICAgICBzaXplb2YobGF5b3V0LT5iaW5kaW5nc1swXSkgKiBpbmZvLT5iaW5kaW5nQ291bnQpOworICAgIGxheW91dC0+YmluZGluZ19jb3VudCA9IGluZm8tPmJpbmRpbmdDb3VudDsKKworICAgIC8qIGluaXRpYWxpemUgYmluZGluZ3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+YmluZGluZ0NvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyAqbGIgPSAmaW5mby0+cEJpbmRpbmdzW2ldOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXRfYmluZGluZyAqYmluZGluZyA9ICZsYXlvdXQtPmJpbmRpbmdzW2ldOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgc2l6ZTsKKworICAgICAgICBzd2l0Y2ggKGxiLT5kZXNjcmlwdG9yVHlwZSkgeworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUl9EWU5BTUlDOgorICAgICAgICAgICAgbGF5b3V0LT5keW5hbWljX2Rlc2NfY291bnQgKz0gbGItPmRlc2NyaXB0b3JDb3VudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBsYi0+c3RhZ2VGbGFncyBkb2VzIG5vdCBnYWluIHVzIGFueXRoaW5nICovCisgICAgICAgIGJpbmRpbmctPmJpbmRpbmcgPSBsYi0+YmluZGluZzsKKyAgICAgICAgYmluZGluZy0+dHlwZSA9IGxiLT5kZXNjcmlwdG9yVHlwZTsKKyAgICAgICAgYmluZGluZy0+YXJyYXlfc2l6ZSA9IGxiLT5kZXNjcmlwdG9yQ291bnQ7CisgICAgICAgIGJpbmRpbmctPm9mZnNldCA9IG9mZnNldDsKKworICAgICAgICByZXQgPSBkZXNjX3JlZ2lvbl9nZXRfZGVzY19zaXplKHJlZ2lvbiwKKyAgICAgICAgICAgICAgICBsYi0+ZGVzY3JpcHRvclR5cGUsICZzaXplKTsKKyAgICAgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBiaW5kaW5nLT5pbmNyZW1lbnQgPSBzaXplOworCisgICAgICAgIC8qIGNvcHkgaW1tdXRhYmxlIHNhbXBsZXJzICovCisgICAgICAgIGlmIChsYi0+cEltbXV0YWJsZVNhbXBsZXJzKSB7CisgICAgICAgICAgICBib29sIHNoYXJlZCA9IHRydWU7CisgICAgICAgICAgICB1aW50MzJfdCBqOworCisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgbGItPmRlc2NyaXB0b3JDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxiLT5wSW1tdXRhYmxlU2FtcGxlcnNbal0gIT0gbGItPnBJbW11dGFibGVTYW1wbGVyc1swXSkgeworICAgICAgICAgICAgICAgICAgICBzaGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2hhcmVkKSB7CisgICAgICAgICAgICAgICAgYmluZGluZy0+c2hhcmVkX2ltbXV0YWJsZV9zYW1wbGVyID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZWxfc2FtcGxlcigoVmtTYW1wbGVyKSBsYi0+cEltbXV0YWJsZVNhbXBsZXJzWzBdKTsKKyAgICAgICAgICAgICAgICAvKiBzZXQgc2FtcGxlciBvZmZzZXQgaW5jcmVtZW50IHRvIDAgKi8KKyAgICAgICAgICAgICAgICBpbnRlbF9kZXNjX29mZnNldF9zZXQoJmJpbmRpbmctPmluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmctPmluY3JlbWVudC5zdXJmYWNlLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmluZGluZy0+aW1tdXRhYmxlX3NhbXBsZXJzID0gaW50ZWxfYWxsb2MobGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJpbmRpbmctPmltbXV0YWJsZV9zYW1wbGVyc1swXSkgKiBsYi0+ZGVzY3JpcHRvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgICAgICAgICAgICAgaWYgKCFiaW5kaW5nLT5pbW11dGFibGVfc2FtcGxlcnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGItPmRlc2NyaXB0b3JDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmctPmltbXV0YWJsZV9zYW1wbGVyc1tqXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbF9zYW1wbGVyKChWa1NhbXBsZXIpIGxiLT5wSW1tdXRhYmxlU2FtcGxlcnNbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGluY3JlbWVudCBvZmZzZXQgKi8KKyAgICAgICAgaW50ZWxfZGVzY19vZmZzZXRfbWFkKCZzaXplLCAmYmluZGluZy0+aW5jcmVtZW50LCAmc2l6ZSwKKyAgICAgICAgICAgICAgICBsYi0+ZGVzY3JpcHRvckNvdW50IC0gMSk7CisgICAgICAgIGludGVsX2Rlc2Nfb2Zmc2V0X2FkZCgmb2Zmc2V0LCAmb2Zmc2V0LCAmc2l6ZSk7CisgICAgfQorCisgICAgbGF5b3V0LT5yZWdpb25fc2l6ZSA9IG9mZnNldDsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWa1Jlc3VsdCBpbnRlbF9kZXNjX2xheW91dF9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dCAqKmxheW91dF9yZXQpCit7CisgICAgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICpsYXlvdXQ7CisgICAgVmtSZXN1bHQgcmV0OworCisgICAgbGF5b3V0ID0gKHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dCAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqbGF5b3V0KSwgZGV2LT5iYXNlLmRiZywKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhULCBpbmZvLCAwKTsKKyAgICBpZiAoIWxheW91dCkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIHJldCA9IGRlc2NfbGF5b3V0X2luaXRfYmluZGluZ3MobGF5b3V0LCBkZXYtPmRlc2NfcmVnaW9uLCBpbmZvKTsKKyAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgaW50ZWxfZGVzY19sYXlvdXRfZGVzdHJveShsYXlvdXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGxheW91dC0+b2JqLmRlc3Ryb3kgPSBkZXNjX2xheW91dF9kZXN0cm95OworCisgICAgKmxheW91dF9yZXQgPSBsYXlvdXQ7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9kZXNjX2xheW91dF9kZXN0cm95KHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dCAqbGF5b3V0KQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGF5b3V0LT5iaW5kaW5nX2NvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0X2JpbmRpbmcgKmJpbmRpbmcgPSAmbGF5b3V0LT5iaW5kaW5nc1tpXTsKKworICAgICAgICBpZiAoYmluZGluZy0+aW1tdXRhYmxlX3NhbXBsZXJzKQorICAgICAgICAgICAgaW50ZWxfZnJlZShsYXlvdXQsIGJpbmRpbmctPmltbXV0YWJsZV9zYW1wbGVycyk7CisgICAgfQorICAgIGludGVsX2ZyZWUobGF5b3V0LCBsYXlvdXQtPmJpbmRpbmdzKTsKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJmxheW91dC0+b2JqLmJhc2UpOworfQorCitzdGF0aWMgdm9pZCBwaXBlbGluZV9sYXlvdXRfZGVzdHJveShzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgc3RydWN0IGludGVsX3BpcGVsaW5lX2xheW91dCAqcGlwZWxpbmVfbGF5b3V0ID0KKyAgICAgICAgaW50ZWxfcGlwZWxpbmVfbGF5b3V0X2Zyb21fb2JqKG9iaik7CisKKyAgICBpbnRlbF9waXBlbGluZV9sYXlvdXRfZGVzdHJveShwaXBlbGluZV9sYXlvdXQpOworfQorCitWa1Jlc3VsdCBpbnRlbF9waXBlbGluZV9sYXlvdXRfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgICAgICAgICAgICAgICAgICAgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8gICAqcFBpcGVsaW5lQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3BpcGVsaW5lX2xheW91dCAgICAgICoqcGlwZWxpbmVfbGF5b3V0X3JldCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfbGF5b3V0ICpwaXBlbGluZV9sYXlvdXQ7CisgICAgdWludDMyX3QgY291bnQgPSBwUGlwZWxpbmVDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudDsKKyAgICB1aW50MzJfdCBpOworCisgICAgcGlwZWxpbmVfbGF5b3V0ID0gKHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKikgaW50ZWxfYmFzZV9jcmVhdGUoCisgICAgICAgICZkZXYtPmJhc2UuaGFuZGxlLCBzaXplb2YoKnBpcGVsaW5lX2xheW91dCksIGRldi0+YmFzZS5kYmcsCisgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhULCBOVUxMLCAwKTsKKworICAgIGlmICghcGlwZWxpbmVfbGF5b3V0KQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICBwaXBlbGluZV9sYXlvdXQtPmxheW91dHMgPSBpbnRlbF9hbGxvYyhwaXBlbGluZV9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaXBlbGluZV9sYXlvdXQtPmxheW91dHNbMF0pICogY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgICAgICBpZiAoIXBpcGVsaW5lX2xheW91dC0+bGF5b3V0cykgeworICAgICAgICAgICAgaW50ZWxfcGlwZWxpbmVfbGF5b3V0X2Rlc3Ryb3kocGlwZWxpbmVfbGF5b3V0KTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBwaXBlbGluZV9sYXlvdXQtPmR5bmFtaWNfZGVzY19pbmRpY2VzID0gaW50ZWxfYWxsb2MocGlwZWxpbmVfbGF5b3V0LAorICAgICAgICAgICAgICAgIHNpemVvZihwaXBlbGluZV9sYXlvdXQtPmR5bmFtaWNfZGVzY19pbmRpY2VzWzBdKSAqIGNvdW50LAorICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgICAgICBpZiAoIXBpcGVsaW5lX2xheW91dC0+ZHluYW1pY19kZXNjX2luZGljZXMpIHsKKyAgICAgICAgICAgIGludGVsX3BpcGVsaW5lX2xheW91dF9kZXN0cm95KHBpcGVsaW5lX2xheW91dCk7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgcGlwZWxpbmVfbGF5b3V0LT5sYXlvdXRzW2ldID0gaW50ZWxfZGVzY19sYXlvdXQocFBpcGVsaW5lQ3JlYXRlSW5mby0+cFNldExheW91dHNbaV0pOworICAgICAgICBwaXBlbGluZV9sYXlvdXQtPmR5bmFtaWNfZGVzY19pbmRpY2VzW2ldID0gcGlwZWxpbmVfbGF5b3V0LT50b3RhbF9keW5hbWljX2Rlc2NfY291bnQ7CisKKyAgICAgICAgcGlwZWxpbmVfbGF5b3V0LT50b3RhbF9keW5hbWljX2Rlc2NfY291bnQgKz0KKyAgICAgICAgICAgIHBpcGVsaW5lX2xheW91dC0+bGF5b3V0c1tpXS0+ZHluYW1pY19kZXNjX2NvdW50OworICAgIH0KKworICAgIHBpcGVsaW5lX2xheW91dC0+bGF5b3V0X2NvdW50ID0gY291bnQ7CisKKyAgICBwaXBlbGluZV9sYXlvdXQtPm9iai5kZXN0cm95ID0gcGlwZWxpbmVfbGF5b3V0X2Rlc3Ryb3k7CisKKyAgICAqcGlwZWxpbmVfbGF5b3V0X3JldCA9IHBpcGVsaW5lX2xheW91dDsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX3BpcGVsaW5lX2xheW91dF9kZXN0cm95KHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKnBpcGVsaW5lX2xheW91dCkKK3sKKyAgICBpZiAocGlwZWxpbmVfbGF5b3V0LT5keW5hbWljX2Rlc2NfaW5kaWNlcykKKyAgICAgICAgaW50ZWxfZnJlZShwaXBlbGluZV9sYXlvdXQsIHBpcGVsaW5lX2xheW91dC0+ZHluYW1pY19kZXNjX2luZGljZXMpOworICAgIGlmIChwaXBlbGluZV9sYXlvdXQtPmxheW91dHMpCisgICAgICAgIGludGVsX2ZyZWUocGlwZWxpbmVfbGF5b3V0LCBwaXBlbGluZV9sYXlvdXQtPmxheW91dHMpOworICAgIGludGVsX2Jhc2VfZGVzdHJveSgmcGlwZWxpbmVfbGF5b3V0LT5vYmouYmFzZSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqICAgICAgICAgICAgICAgICAgIHBTZXRMYXlvdXQpCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gaW50ZWxfZGVzY19sYXlvdXRfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICoqKSBwU2V0TGF5b3V0KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yU2V0TGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQorCit7CisgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKGRlc2NyaXB0b3JTZXRMYXlvdXQpOworCisgICAgb2JqLT5kZXN0cm95KG9iaik7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUxheW91dENyZWF0ZUluZm8qICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVMYXlvdXQpCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gaW50ZWxfcGlwZWxpbmVfbGF5b3V0X2NyZWF0ZShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKiopIHBQaXBlbGluZUxheW91dCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVBpcGVsaW5lTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lTGF5b3V0LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQorCit7CisgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKHBpcGVsaW5lTGF5b3V0KTsKKworICAgIG9iai0+ZGVzdHJveShvYmopOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JQb29sKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIGludGVsX2Rlc2NfcG9vbF9jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfZGVzY19wb29sICoqKSBwRGVzY3JpcHRvclBvb2wpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGVzY3JpcHRvclBvb2wgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKKworeworICAgIHN0cnVjdCBpbnRlbF9vYmogKm9iaiA9IGludGVsX29iaihkZXNjcmlwdG9yUG9vbCk7CisKKyAgICBvYmotPmRlc3Ryb3kob2JqKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUmVzZXREZXNjcmlwdG9yUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclBvb2wsCisgICAgVmtEZXNjcmlwdG9yUG9vbFJlc2V0RmxhZ3MgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisgICAgc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqcG9vbCA9IGludGVsX2Rlc2NfcG9vbChkZXNjcmlwdG9yUG9vbCk7CisKKyAgICBpbnRlbF9kZXNjX3Bvb2xfcmVzZXQocG9vbCk7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpCit7CisgICAgc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqcG9vbCA9IGludGVsX2Rlc2NfcG9vbChwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCk7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gcG9vbC0+ZGV2OworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXQgKmxheW91dCA9CisgICAgICAgICAgICBpbnRlbF9kZXNjX2xheW91dCgoVmtEZXNjcmlwdG9yU2V0TGF5b3V0KSBwQWxsb2NhdGVJbmZvLT5wU2V0TGF5b3V0c1tpXSk7CisKKyAgICAgICAgcmV0ID0gaW50ZWxfZGVzY19zZXRfY3JlYXRlKGRldiwgcG9vbCwgbGF5b3V0LAorICAgICAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKiopICZwRGVzY3JpcHRvclNldHNbaV0pOworICAgICAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtGcmVlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cykKK3sKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlc2NyaXB0b3JTZXRDb3VudDsgaSsrKSB7CisgICAgICAgIGludGVsX2Rlc2Nfc2V0X2Rlc3Ryb3koCisgICAgICAgICAgICooc3RydWN0IGludGVsX2Rlc2Nfc2V0ICoqKSAmcERlc2NyaXB0b3JTZXRzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yQ29waWVzKQoreworICAgIHVpbnQzMl90IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCAqd3JpdGUgPSAmcERlc2NyaXB0b3JXcml0ZXNbaV07CisgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX3NldCAqc2V0ID0gaW50ZWxfZGVzY19zZXQod3JpdGUtPmRzdFNldCk7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dF9iaW5kaW5nICpiaW5kaW5nOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19pdGVyIGl0ZXI7CisKKyAgICAgICAgZGVzY19pdGVyX2luaXRfZm9yX3dyaXRpbmcoJml0ZXIsIHNldCwgd3JpdGUtPmRzdEJpbmRpbmcsCisgICAgICAgICAgICAgICAgICAgIHdyaXRlLT5kc3RBcnJheUVsZW1lbnQpOworCisgICAgICAgIHN3aXRjaCAod3JpdGUtPmRlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI6CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd3JpdGUtPmRlc2NyaXB0b3JDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvICppbmZvID0gJndyaXRlLT5wSW1hZ2VJbmZvW2pdOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9zYW1wbGVyICpzYW1wbGVyID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZWxfc2FtcGxlcihpbmZvLT5zYW1wbGVyKTsKKworICAgICAgICAgICAgICAgIGRlc2Nfc2V0X3dyaXRlX3NhbXBsZXIoc2V0LCAmaXRlciwgc2FtcGxlcik7CisKKyAgICAgICAgICAgICAgICBpbnRlbF9kZXNjX2l0ZXJfYWR2YW5jZSgmaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjoKKyAgICAgICAgICAgIGJpbmRpbmcgPSAmc2V0LT5sYXlvdXQtPmJpbmRpbmdzW3dyaXRlLT5kc3RCaW5kaW5nXTsKKworICAgICAgICAgICAgLyogd3JpdGUgdGhlIHNoYXJlZCBpbW11dGFibGUgc2FtcGxlciAqLworICAgICAgICAgICAgaWYgKGJpbmRpbmctPnNoYXJlZF9pbW11dGFibGVfc2FtcGxlcikgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBlbmQ7CisgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfc2FtcGxlciBzYW1wbGVyX2Rlc2M7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIWl0ZXIuaW5jcmVtZW50LnNhbXBsZXIpOworICAgICAgICAgICAgICAgIGludGVsX2Rlc2Nfb2Zmc2V0X3NldCgmZW5kLCBpdGVyLmJlZ2luLnN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmJlZ2luLnNhbXBsZXIgKyBzZXQtPnJlZ2lvbi0+c2FtcGxlcl9kZXNjX3NpemUpOworCisgICAgICAgICAgICAgICAgc2FtcGxlcl9kZXNjLnNhbXBsZXIgPSBiaW5kaW5nLT5zaGFyZWRfaW1tdXRhYmxlX3NhbXBsZXI7CisgICAgICAgICAgICAgICAgaW50ZWxfZGVzY19yZWdpb25fdXBkYXRlKHNldC0+cmVnaW9uLCAmaXRlci5iZWdpbiwgJmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzYW1wbGVyX2Rlc2MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd3JpdGUtPmRlc2NyaXB0b3JDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9ySW1hZ2VJbmZvICppbmZvID0gJndyaXRlLT5wSW1hZ2VJbmZvW2pdOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWdfdmlldyAqaW1nX3ZpZXcgPQorICAgICAgICAgICAgICAgICAgICBpbnRlbF9pbWdfdmlldyhpbmZvLT5pbWFnZVZpZXcpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9zYW1wbGVyICpzYW1wbGVyID0KKyAgICAgICAgICAgICAgICAgICAgKGJpbmRpbmctPmltbXV0YWJsZV9zYW1wbGVycykgPworICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLT5pbW11dGFibGVfc2FtcGxlcnNbd3JpdGUtPmRzdEFycmF5RWxlbWVudCArIGpdIDoKKyAgICAgICAgICAgICAgICAgICAgaW50ZWxfc2FtcGxlcihpbmZvLT5zYW1wbGVyKTsKKworICAgICAgICAgICAgICAgIGRlc2Nfc2V0X3dyaXRlX2NvbWJpbmVkX2ltYWdlX3NhbXBsZXIoc2V0LCAmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltZ192aWV3LCBpbmZvLT5pbWFnZUxheW91dCwgc2FtcGxlcik7CisKKyAgICAgICAgICAgICAgICBpbnRlbF9kZXNjX2l0ZXJfYWR2YW5jZSgmaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRToKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3cml0ZS0+ZGVzY3JpcHRvckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JJbWFnZUluZm8gKmluZm8gPSAmd3JpdGUtPnBJbWFnZUluZm9bal07CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ltZ192aWV3ICppbWdfdmlldyA9CisgICAgICAgICAgICAgICAgICAgIGludGVsX2ltZ192aWV3KGluZm8tPmltYWdlVmlldyk7CisKKyAgICAgICAgICAgICAgICBkZXNjX3NldF93cml0ZV9pbWFnZShzZXQsICZpdGVyLCBpbWdfdmlldywgaW5mby0+aW1hZ2VMYXlvdXQpOworCisgICAgICAgICAgICAgICAgaW50ZWxfZGVzY19pdGVyX2FkdmFuY2UoJml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3cml0ZS0+ZGVzY3JpcHRvckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKmJ1Zl92aWV3ID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZWxfYnVmX3ZpZXcod3JpdGUtPnBUZXhlbEJ1ZmZlclZpZXdbal0pOworCisgICAgICAgICAgICAgICAgZGVzY19zZXRfd3JpdGVfYnVmZmVyKHNldCwgJml0ZXIsIGJ1Zl92aWV3KTsKKworICAgICAgICAgICAgICAgIGludGVsX2Rlc2NfaXRlcl9hZHZhbmNlKCZpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI6CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM6CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisgICAgICAgICAgICAgICAgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyB2aWV3X2luZm87CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ2aWV3X2luZm8sIDAsIHNpemVvZih2aWV3X2luZm8pKTsKKyAgICAgICAgICAgICAgICB2aWV3X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfVklFV19DUkVBVEVfSU5GTzsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3cml0ZS0+ZGVzY3JpcHRvckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyAqaW5mbyA9ICZ3cml0ZS0+cEJ1ZmZlckluZm9bal07CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9idWZfdmlldyBidWZfdmlldzsKKworICAgICAgICAgICAgICAgICAgICB2aWV3X2luZm8uYnVmZmVyID0gaW5mby0+YnVmZmVyOworICAgICAgICAgICAgICAgICAgICB2aWV3X2luZm8ub2Zmc2V0ID0gaW5mby0+b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB2aWV3X2luZm8ucmFuZ2UgPSBpbmZvLT5yYW5nZTsKKworICAgICAgICAgICAgICAgICAgICBpbnRlbF9idWZfdmlld19pbml0KGRldiwgJnZpZXdfaW5mbywgJmJ1Zl92aWV3LCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICBkZXNjX3NldF93cml0ZV9idWZmZXIoc2V0LCAmaXRlciwgJmJ1Zl92aWV3KTsKKworICAgICAgICAgICAgICAgICAgICBpbnRlbF9kZXNjX2l0ZXJfYWR2YW5jZSgmaXRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ29weUNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCAqY29weSA9ICZwRGVzY3JpcHRvckNvcGllc1tpXTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfc2V0ICpzcmNfc2V0ID0gaW50ZWxfZGVzY19zZXQoY29weS0+c3JjU2V0KTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfc2V0ICpkc3Rfc2V0ID0gaW50ZWxfZGVzY19zZXQoY29weS0+ZHN0U2V0KTsKKyAgICAgICAgc3RydWN0IGludGVsX2Rlc2NfaXRlciBzcmNfaXRlciwgZHN0X2l0ZXI7CisgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBzcmNfYmVnaW4sIGRzdF9iZWdpbjsKKworICAgICAgICBkZXNjX2l0ZXJfaW5pdF9mb3Jfd3JpdGluZygmc3JjX2l0ZXIsIHNyY19zZXQsCisgICAgICAgICAgICAgICAgICAgIGNvcHktPnNyY0JpbmRpbmcsIGNvcHktPnNyY0FycmF5RWxlbWVudCk7CisgICAgICAgIGRlc2NfaXRlcl9pbml0X2Zvcl93cml0aW5nKCZkc3RfaXRlciwgZHN0X3NldCwKKyAgICAgICAgICAgICAgICAgICAgY29weS0+ZHN0QmluZGluZywgY29weS0+ZHN0QXJyYXlFbGVtZW50KTsKKworICAgICAgICAvKiBzYXZlIHRoZSBiZWdpbiBvZmZzZXRzICovCisgICAgICAgIHNyY19iZWdpbiA9IHNyY19pdGVyLmJlZ2luOworICAgICAgICBkc3RfYmVnaW4gPSBkc3RfaXRlci5iZWdpbjsKKworICAgICAgICBpbnRlbF9kZXNjX3JlZ2lvbl9jb3B5KGRzdF9zZXQtPnJlZ2lvbiwgJmRzdF9iZWdpbiwKKyAgICAgICAgICAgICAgICAmZHN0X2l0ZXIuZW5kLCAmc3JjX2JlZ2luKTsKKyAgICB9CisKKy8vICAgIHJldHVybiBWS19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2Rlc2MuaCBiL2ljZC9pbnRlbC9kZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzMjY1MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9kZXNjLmgKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBERVNDX0gKKyNkZWZpbmUgREVTQ19ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorI2luY2x1ZGUgIm9iai5oIgorCitzdHJ1Y3QgaW50ZWxfY21kOworc3RydWN0IGludGVsX2RldjsKKworLyoqCisgKiBPcGFxdWUgZGVzY3JpcHRvcnMuCisgKi8KK3N0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2U7CitzdHJ1Y3QgaW50ZWxfZGVzY19zYW1wbGVyOworCisvKioKKyAqIERlc2NyaXB0b3IgcmVnaW9uIG9mZnNldCAob3Igc2l6ZSkgaW4gYnl0ZXMuCisgKi8KK3N0cnVjdCBpbnRlbF9kZXNjX29mZnNldCB7CisgICAgdWludDMyX3Qgc3VyZmFjZTsKKyAgICB1aW50MzJfdCBzYW1wbGVyOworfTsKKworc3RydWN0IGludGVsX2Rlc2NfaXRlciB7CisgICAgVmtEZXNjcmlwdG9yVHlwZSB0eXBlOworICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBpbmNyZW1lbnQ7CisgICAgdWludDMyX3Qgc2l6ZTsKKworICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBiZWdpbjsKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgZW5kOworICAgIHVpbnQzMl90IGN1cjsKK307CisKKy8qKgorICogUGVyLWRldmljZSBkZXNjcmlwdG9yIHJlZ2lvbi4KKyAqLworc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uIHsKKyAgICAvKiB0aGlzIGlzIG5vdCBhbiBpbnRlbF9vYmogKi8KKworICAgIHVpbnQzMl90IHN1cmZhY2VfZGVzY19zaXplOworICAgIHVpbnQzMl90IHNhbXBsZXJfZGVzY19zaXplOworCisgICAgLyogc3VyZmFjZSBkZXNjcmlwdG9ycyAoaW4gc3lzdGVtIG1lbW9yeSB1bnRpbCBSUyBpcyBlbmFibGVkKSAqLworICAgIHN0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2UgKnN1cmZhY2VzOworICAgIC8qIHNhbXBsZXIgZGVzY2lwdG9ycyAqLworICAgIHN0cnVjdCBpbnRlbF9kZXNjX3NhbXBsZXIgKnNhbXBsZXJzOworCisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IHNpemU7CisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IGN1cjsKK307CisKK3N0cnVjdCBpbnRlbF9kZXNjX3Bvb2wgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgc3RydWN0IGludGVsX2RldiAqZGV2OworCisgICAgLyogcG9pbnQgdG8gYSBjb250aW51b3VzIGFyZWEgaW4gdGhlIGRldmljZSdzIHJlZ2lvbiAqLworICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCByZWdpb25fYmVnaW47CisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IHJlZ2lvbl9lbmQ7CisKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgY3VyOworfTsKKworc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0OworCitzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgLyogc3ViYWxsb2NhdGVkIGZyb20gYSBwb29sICovCisgICAgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb247CisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IHJlZ2lvbl9iZWdpbjsKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgcmVnaW9uX2VuZDsKKworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dCAqbGF5b3V0OworfTsKKworc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0IHsKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqIG9iajsKKworICAgIC8qIGhvbW9nZW5lb3VzIGJpbmRpbmdzIGluIHRoaXMgbGF5b3V0ICovCisgICAgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0X2JpbmRpbmcgeworICAgICAgICB1aW50MzJfdCBiaW5kaW5nOworICAgICAgICBWa0Rlc2NyaXB0b3JUeXBlIHR5cGU7CisgICAgICAgIHVpbnQzMl90IGFycmF5X3NpemU7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9zYW1wbGVyICoqaW1tdXRhYmxlX3NhbXBsZXJzOworICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqc2hhcmVkX2ltbXV0YWJsZV9zYW1wbGVyOworCisgICAgICAgIC8qIHRvIGluaXRpYWxpemUgaW50ZWxfZGVzY19pdGVyICovCisgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBvZmZzZXQ7CisgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCBpbmNyZW1lbnQ7CisgICAgfSAqYmluZGluZ3M7CisgICAgdWludDMyX3QgYmluZGluZ19jb3VudDsKKworICAgIC8qIGNvdW50IG9mIF9EWU5BTUlDIGRlc2NyaXB0b3JzICovCisgICAgdWludDMyX3QgZHluYW1pY19kZXNjX2NvdW50OworCisgICAgLyogdGhlIHNpemUgb2YgdGhlIGxheW91dCBpbiB0aGUgcmVnaW9uICovCisgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IHJlZ2lvbl9zaXplOworfTsKKworc3RydWN0IGludGVsX3BpcGVsaW5lX2xheW91dCB7CisgICAgc3RydWN0IGludGVsX29iaiBvYmo7CisKKyAgICBzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXQgKipsYXlvdXRzOworICAgIHVpbnQzMl90ICpkeW5hbWljX2Rlc2NfaW5kaWNlczsKKyAgICB1aW50MzJfdCBsYXlvdXRfY291bnQ7CisKKyAgICB1aW50MzJfdCB0b3RhbF9keW5hbWljX2Rlc2NfY291bnQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9kZXNjX3Bvb2wgKmludGVsX2Rlc2NfcG9vbChWa0Rlc2NyaXB0b3JQb29sIHBvb2wpCit7CisgICAgcmV0dXJuICooc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqKikgJnBvb2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqaW50ZWxfZGVzY19wb29sX2Zyb21fb2JqKHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9kZXNjX3Bvb2wgKikgb2JqOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9kZXNjX3NldCAqaW50ZWxfZGVzY19zZXQoVmtEZXNjcmlwdG9yU2V0IHNldCkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKiopICZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2Rlc2Nfc2V0ICppbnRlbF9kZXNjX3NldF9mcm9tX29iaihzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKikgb2JqOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9kZXNjX2xheW91dCAqaW50ZWxfZGVzY19sYXlvdXQoVmtEZXNjcmlwdG9yU2V0TGF5b3V0IGxheW91dCkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXQgKiopICZsYXlvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICppbnRlbF9kZXNjX2xheW91dF9mcm9tX29iaihzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfZGVzY19sYXlvdXQgKikgb2JqOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKmludGVsX3BpcGVsaW5lX2xheW91dChWa1BpcGVsaW5lTGF5b3V0IHBpcGVsaW5lX2xheW91dCkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfbGF5b3V0ICoqKSAmcGlwZWxpbmVfbGF5b3V0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKmludGVsX3BpcGVsaW5lX2xheW91dF9mcm9tX29iaihzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfbGF5b3V0ICopIG9iajsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGludGVsX2Rlc2Nfb2Zmc2V0X3NldChzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VyZmFjZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZXJfb2Zmc2V0KQoreworICAgIG9mZnNldC0+c3VyZmFjZSA9IHN1cmZhY2Vfb2Zmc2V0OworICAgIG9mZnNldC0+c2FtcGxlciA9IHNhbXBsZXJfb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfZGVzY19vZmZzZXRfYWRkKHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpyaHMpCit7CisgICAgb2Zmc2V0LT5zdXJmYWNlID0gbGhzLT5zdXJmYWNlICsgcmhzLT5zdXJmYWNlOworICAgIG9mZnNldC0+c2FtcGxlciA9IGxocy0+c2FtcGxlciArIHJocy0+c2FtcGxlcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGludGVsX2Rlc2Nfb2Zmc2V0X3N1YihzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqcmhzKQoreworICAgIG9mZnNldC0+c3VyZmFjZSA9IGxocy0+c3VyZmFjZSAtIHJocy0+c3VyZmFjZTsKKyAgICBvZmZzZXQtPnNhbXBsZXIgPSBsaHMtPnNhbXBsZXIgLSByaHMtPnNhbXBsZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9kZXNjX29mZnNldF9tYWQoc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGhzX3NjYWxlKQoreworICAgIG9mZnNldC0+c3VyZmFjZSA9IGxocy0+c3VyZmFjZSAqIGxoc19zY2FsZSArIHJocy0+c3VyZmFjZTsKKyAgICBvZmZzZXQtPnNhbXBsZXIgPSBsaHMtPnNhbXBsZXIgKiBsaHNfc2NhbGUgKyByaHMtPnNhbXBsZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9kZXNjX29mZnNldF93aXRoaW4oY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqb3RoZXIpCit7CisgICAgcmV0dXJuIChvZmZzZXQtPnN1cmZhY2UgPD0gb3RoZXItPnN1cmZhY2UgJiYKKyAgICAgICAgICAgIG9mZnNldC0+c2FtcGxlciA8PSBvdGhlci0+c2FtcGxlcik7Cit9CisKK2Jvb2wgaW50ZWxfZGVzY19pdGVyX2luaXRfZm9yX2JpbmRpbmcoc3RydWN0IGludGVsX2Rlc2NfaXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpbmRpbmdfaW5kZXgsIHVpbnQzMl90IGFycmF5X2Jhc2UpOworCitib29sIGludGVsX2Rlc2NfaXRlcl9hZHZhbmNlKHN0cnVjdCBpbnRlbF9kZXNjX2l0ZXIgKml0ZXIpOworCitWa1Jlc3VsdCBpbnRlbF9kZXNjX3JlZ2lvbl9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICoqcmVnaW9uX3JldCk7Cit2b2lkIGludGVsX2Rlc2NfcmVnaW9uX2Rlc3Ryb3koc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX3JlZ2lvbiAqcmVnaW9uKTsKKworVmtSZXN1bHQgaW50ZWxfZGVzY19yZWdpb25fYWxsb2Moc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqZW5kKTsKK3ZvaWQgaW50ZWxfZGVzY19yZWdpb25fZnJlZShzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqZW5kKTsKKwordm9pZCBpbnRlbF9kZXNjX3JlZ2lvbl9jbGVhcihzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICplbmQpOworCit2b2lkIGludGVsX2Rlc2NfcmVnaW9uX3VwZGF0ZShzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3N1cmZhY2UgKnN1cmZhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfc2FtcGxlciAqc2FtcGxlcnMpOworCit2b2lkIGludGVsX2Rlc2NfcmVnaW9uX2NvcHkoc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKnNyYyk7CisKK3ZvaWQgaW50ZWxfZGVzY19yZWdpb25fcmVhZF9zdXJmYWNlKGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX3JlZ2lvbiAqcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfbWVtICoqbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVhZF9vbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKipjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY21kX2xlbik7Cit2b2lkIGludGVsX2Rlc2NfcmVnaW9uX3JlYWRfc2FtcGxlcihjb25zdCBzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb24gKnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXNjX29mZnNldCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3NhbXBsZXIgKipzYW1wbGVyKTsKKworVmtSZXN1bHQgaW50ZWxfZGVzY19wb29sX2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqKnBvb2xfcmV0KTsKK3ZvaWQgaW50ZWxfZGVzY19wb29sX2Rlc3Ryb3koc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqcG9vbCk7CisKK1ZrUmVzdWx0IGludGVsX2Rlc2NfcG9vbF9hbGxvYyhzdHJ1Y3QgaW50ZWxfZGVzY19wb29sICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgKmJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0ICplbmQpOwordm9pZCBpbnRlbF9kZXNjX3Bvb2xfcmVzZXQoc3RydWN0IGludGVsX2Rlc2NfcG9vbCAqcG9vbCk7CisKK1ZrUmVzdWx0IGludGVsX2Rlc2Nfc2V0X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19wb29sICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKipzZXRfcmV0KTsKK3ZvaWQgaW50ZWxfZGVzY19zZXRfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZGVzY19zZXQgKnNldCk7CisKK1ZrUmVzdWx0IGludGVsX2Rlc2NfbGF5b3V0X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICoqbGF5b3V0X3JldCk7Cit2b2lkIGludGVsX2Rlc2NfbGF5b3V0X2Rlc3Ryb3koc3RydWN0IGludGVsX2Rlc2NfbGF5b3V0ICpsYXlvdXQpOworCitWa1Jlc3VsdCBpbnRlbF9waXBlbGluZV9sYXlvdXRfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvICAqcFBpcGVsaW5lQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZV9sYXlvdXQgKipwaXBlbGluZV9sYXlvdXRfcmV0KTsKK3ZvaWQgaW50ZWxfcGlwZWxpbmVfbGF5b3V0X2Rlc3Ryb3koc3RydWN0IGludGVsX3BpcGVsaW5lX2xheW91dCAqcGlwZWxpbmVfbGF5b3V0KTsKKworI2VuZGlmIC8qIERFU0NfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2Rldi5jIGIvaWNkL2ludGVsL2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTIzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZGV2LmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImttZC93aW5zeXMuaCIKKyNpbmNsdWRlICJkZXNjLmgiCisjaW5jbHVkZSAiZ3B1LmgiCisjaW5jbHVkZSAicGlwZWxpbmUuaCIKKyNpbmNsdWRlICJxdWV1ZS5oIgorI2luY2x1ZGUgImRldi5oIgorCitzdGF0aWMgdm9pZCBkZXZfZGVzdHJveV9tZXRhX3NoYWRlcnMoc3RydWN0IGludGVsX2RldiAqZGV2KQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXYtPmNtZF9tZXRhX3NoYWRlcnMpOyBpKyspIHsKKyAgICAgICAgaWYgKCFkZXYtPmNtZF9tZXRhX3NoYWRlcnNbaV0pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpbnRlbF9waXBlbGluZV9zaGFkZXJfZGVzdHJveShkZXYsIGRldi0+Y21kX21ldGFfc2hhZGVyc1tpXSk7CisgICAgICAgIGRldi0+Y21kX21ldGFfc2hhZGVyc1tpXSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBkZXZfY3JlYXRlX21ldGFfc2hhZGVycyhzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYpCit7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldi0+Y21kX21ldGFfc2hhZGVycyk7IGkrKykgeworICAgICAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpzaDsKKworICAgICAgICBzaCA9IGludGVsX3BpcGVsaW5lX3NoYWRlcl9jcmVhdGVfbWV0YShkZXYsIGkpOworICAgICAgICBpZiAoIXNoKSB7CisgICAgICAgICAgICBkZXZfZGVzdHJveV9tZXRhX3NoYWRlcnMoZGV2KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRldi0+Y21kX21ldGFfc2hhZGVyc1tpXSA9IHNoOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgVmtSZXN1bHQgZGV2X2NyZWF0ZV9xdWV1ZXMoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvICpxdWV1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQpCit7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvICpxID0gJnF1ZXVlc1tpXTsKKyAgICAgICAgVmtSZXN1bHQgcmV0ID0gVktfU1VDQ0VTUzsKKworICAgICAgICBhc3NlcnQoKHEtPnF1ZXVlRmFtaWx5SW5kZXggPCBJTlRFTF9HUFVfRU5HSU5FX0NPVU5UICYmCisgICAgICAgICAgICBxLT5xdWV1ZUNvdW50ID09IDEgJiYgIWRldi0+cXVldWVzW3EtPnF1ZXVlRmFtaWx5SW5kZXhdKSAmJiAiSW52YWxpZCBRdWV1ZSByZXF1ZXN0Iik7CisgICAgICAgIC8qIEhlbHAgY2F0Y2ggcGxhY2VzIHdoZXJlIHdlIGZvcmdvdCB0byBpbml0aWFsaXplIHBRdWV1ZVByaW9yaXRpZXMgKi8KKyAgICAgICAgYXNzZXJ0KHEtPnBRdWV1ZVByaW9yaXRpZXMpOworICAgICAgICByZXQgPSBpbnRlbF9xdWV1ZV9jcmVhdGUoZGV2LCBxLT5xdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAmZGV2LT5xdWV1ZXNbcS0+cXVldWVGYW1pbHlJbmRleF0pOworCisgICAgICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgdWludDMyX3QgajsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICAgICAgaW50ZWxfcXVldWVfZGVzdHJveShkZXYtPnF1ZXVlc1tqXSk7CisKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVmtSZXN1bHQgaW50ZWxfZGV2X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2RldiAqKmRldl9yZXQpCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2OworICAgIHVpbnQzMl90IGk7CisgICAgVmtSZXN1bHQgcmV0OworCisgICAgLy8gSUNEIGxpbWl0ZWQgdG8gYSBzaW5nbGUgdmlydHVhbCBkZXZpY2UKKyAgICBpZiAoZ3B1LT53aW5zeXMpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisKKyAgICBkZXYgPSAoc3RydWN0IGludGVsX2RldiAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZ3B1LT5oYW5kbGUsCisgICAgICAgICAgICBzaXplb2YoKmRldiksIGZhbHNlLAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQsIGluZm8sIHNpemVvZihzdHJ1Y3QgaW50ZWxfZGV2X2RiZykpOworICAgIGlmICghZGV2KQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGVudW0gaW50ZWxfcGh5X2Rldl9leHRfdHlwZSBleHQgPQorICAgICAgICAgICAgaW50ZWxfZ3B1X2xvb2t1cF9waHlfZGV2X2V4dGVuc2lvbihncHUsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKworICAgICAgICBpZiAoZXh0ICE9IElOVEVMX1BIWV9ERVZfRVhUX0lOVkFMSUQpCisgICAgICAgICAgICBkZXYtPnBoeV9kZXZfZXh0c1tleHRdID0gdHJ1ZTsKKyAgICB9CisKKyAgICBkZXYtPmdwdSA9IGdwdTsKKworICAgIHJldCA9IGludGVsX2dwdV9pbml0X3dpbnN5cyhncHUpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBpbnRlbF9kZXZfZGVzdHJveShkZXYpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGRldi0+d2luc3lzID0gZ3B1LT53aW5zeXM7CisKKyAgICBkZXYtPmNtZF9zY3JhdGNoX2JvID0gaW50ZWxfd2luc3lzX2FsbG9jX2JvKGRldi0+d2luc3lzLAorICAgICAgICAgICAgImNvbW1hbmQgYnVmZmVyIHNjcmF0Y2giLCA0MDk2LCBmYWxzZSk7CisgICAgaWYgKCFkZXYtPmNtZF9zY3JhdGNoX2JvKSB7CisgICAgICAgIGludGVsX2Rldl9kZXN0cm95KGRldik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfREVWSUNFX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoIWRldl9jcmVhdGVfbWV0YV9zaGFkZXJzKGRldikpIHsKKyAgICAgICAgaW50ZWxfZGV2X2Rlc3Ryb3koZGV2KTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlbF9kZXNjX3JlZ2lvbl9jcmVhdGUoZGV2LCAmZGV2LT5kZXNjX3JlZ2lvbik7CisgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIGludGVsX2Rldl9kZXN0cm95KGRldik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50ZWxfcGlwZWxpbmVfaW5pdF9kZWZhdWx0X3NhbXBsZV9wYXR0ZXJucyhkZXYsCisgICAgICAgICAgICAodWludDhfdCAqKSAmZGV2LT5zYW1wbGVfcGF0dGVybl8xeCwKKyAgICAgICAgICAgICh1aW50OF90ICopICZkZXYtPnNhbXBsZV9wYXR0ZXJuXzJ4LAorICAgICAgICAgICAgKHVpbnQ4X3QgKikgJmRldi0+c2FtcGxlX3BhdHRlcm5fNHgsCisgICAgICAgICAgICAodWludDhfdCAqKSBkZXYtPnNhbXBsZV9wYXR0ZXJuXzh4LAorICAgICAgICAgICAgKHVpbnQ4X3QgKikgZGV2LT5zYW1wbGVfcGF0dGVybl8xNngpOworCisgICAgcmV0ID0gZGV2X2NyZWF0ZV9xdWV1ZXMoZGV2LCBpbmZvLT5wUXVldWVDcmVhdGVJbmZvcywKKyAgICAgICAgICAgIGluZm8tPnF1ZXVlQ3JlYXRlSW5mb0NvdW50KTsKKyAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgaW50ZWxfZGV2X2Rlc3Ryb3koZGV2KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqZGV2X3JldCA9IGRldjsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2Rldl9kZXN0cm95KHN0cnVjdCBpbnRlbF9kZXYgKmRldikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUgPSBkZXYtPmdwdTsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2LT5xdWV1ZXMpOyBpKyspIHsKKyAgICAgICAgaWYgKGRldi0+cXVldWVzW2ldKQorICAgICAgICAgICAgaW50ZWxfcXVldWVfZGVzdHJveShkZXYtPnF1ZXVlc1tpXSk7CisgICAgfQorCisgICAgaWYgKGRldi0+ZGVzY19yZWdpb24pCisgICAgICAgIGludGVsX2Rlc2NfcmVnaW9uX2Rlc3Ryb3koZGV2LCBkZXYtPmRlc2NfcmVnaW9uKTsKKworICAgIGRldl9kZXN0cm95X21ldGFfc2hhZGVycyhkZXYpOworCisgICAgaW50ZWxfYm9fdW5yZWYoZGV2LT5jbWRfc2NyYXRjaF9ibyk7CisKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJmRldi0+YmFzZSk7CisKKyAgICBpZiAoZ3B1LT53aW5zeXMpCisgICAgICAgIGludGVsX2dwdV9jbGVhbnVwX3dpbnN5cyhncHUpOworfQorCit2b2lkIGludGVsX2Rldl9sb2coc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgIFZrRmxhZ3MgbXNnX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9iYXNlICpzcmNfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgIHNpemVfdCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ19jb2RlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICBpbnRlbF9sb2d2KGRldiwgbXNnX2ZsYWdzLAorICAgICAgICAgICAgICAgKHNyY19vYmplY3QtPmRiZyA/IHNyY19vYmplY3QtPmRiZy0+dHlwZSA6IDApLAorICAgICAgICAgICAgICAgKHVpbnQ2NF90KSBzcmNfb2JqZWN0LAorICAgICAgICAgICAgICAgbG9jYXRpb24sIG1zZ19jb2RlLAorICAgICAgICAgICAgICAgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGV2aWNlKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgIGdwdV8sCisgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUgPSBpbnRlbF9ncHUoZ3B1Xyk7CisKKyAgICByZXR1cm4gaW50ZWxfZGV2X2NyZWF0ZShncHUsIHBDcmVhdGVJbmZvLCAoc3RydWN0IGludGVsX2RldiAqKikgcERldmljZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURldmljZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisKKyAgICBpbnRlbF9kZXZfZGVzdHJveShkZXYpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldERldmljZVF1ZXVlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseUluZGV4LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXgsCisgICAgVmtRdWV1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworCisgICAgKnBRdWV1ZSA9IChWa1F1ZXVlKSBkZXYtPnF1ZXVlc1txdWV1ZUZhbWlseUluZGV4XTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRGV2aWNlV2FpdElkbGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldi0+cXVldWVzKTsgaSsrKSB7CisgICAgICAgIGlmIChkZXYtPnF1ZXVlc1tpXSkgeworICAgICAgICAgICAgY29uc3QgVmtSZXN1bHQgciA9IGludGVsX3F1ZXVlX3dhaXQoZGV2LT5xdWV1ZXNbaV0sIC0xKTsKKyAgICAgICAgICAgIGlmIChyICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgcmV0ID0gcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZGV2LmggYi9pY2QvaW50ZWwvZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NDg4NgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9kZXYuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIERFVl9ICisjZGVmaW5lIERFVl9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorI2luY2x1ZGUgImdwdS5oIgorI2luY2x1ZGUgIm9iai5oIgorCitzdHJ1Y3QgaW50ZWxfZGVzY19yZWdpb247CitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyOworc3RydWN0IGludGVsX3F1ZXVlOworc3RydWN0IGludGVsX3dpbnN5czsKKworZW51bSBpbnRlbF9kZXZfbWV0YV9zaGFkZXIgeworICAgIC8qCisgICAgICogVGhpcyBleHBlY3RzIGFuIGl2ZWMyIHRvIGJlIHB1c2hlZDoKKyAgICAgKgorICAgICAqICAueCBpcyBtZW1vcnkgb2Zmc2V0CisgICAgICogIC55IGlzIGZpbGwgdmFsdWUKKyAgICAgKgorICAgICAqIGFzIHdlbGwgYXMgR0VONl9WRkNPTVBfU1RPUkVfVklELgorICAgICAqLworICAgIElOVEVMX0RFVl9NRVRBX1ZTX0ZJTExfTUVNLAorCisgICAgLyoKKyAgICAgKiBUaGVzZSBleHBlY3QgYW4gaXZlYzIgdG8gYmUgcHVzaGVkOgorICAgICAqCisgICAgICogIC54IGlzIGRzdCBtZW1vcnkgb2Zmc2V0CisgICAgICogIC55IGlzIHNyYyBtZW1vcnkgb2Zmc2V0CisgICAgICoKKyAgICAgKiBhcyB3ZWxsIGFzIEdFTjZfVkZDT01QX1NUT1JFX1ZJRC4KKyAgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTSwKKyAgICBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX01FTV9VTkFMSUdORUQsCisKKyAgICAvKgorICAgICAqIFRoaXMgZXhwZWN0cyBhbiBpdmVjNCB0byBiZSBwdXNoZWQ6CisgICAgICoKKyAgICAgKiAgLnh5IGlzIGFkZGVkIHRvIGZhcmdtZW50IGNvb3JkIHRvIGZvcm0gKHUsIHYpCisgICAgICogIC56IGlzIGV4dGVudCB3aWR0aAorICAgICAqICAudyBpcyBkc3QgbWVtb3J5IG9mZnNldAorICAgICAqCisgICAgICogYXMgd2VsbCBhcyBHRU42X1ZGQ09NUF9TVE9SRV9WSUQuCisgICAgICovCisgICAgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SOF9UT19NRU0sCisgICAgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMTZfVE9fTUVNLAorICAgIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfUjMyX1RPX01FTSwKKyAgICBJTlRFTF9ERVZfTUVUQV9WU19DT1BZX1IzMkczMl9UT19NRU0sCisgICAgSU5URUxfREVWX01FVEFfVlNfQ09QWV9SMzJHMzJCMzJBMzJfVE9fTUVNLAorCisgICAgLyoKKyAgICAgKiBUaGVzZSBleHBlY3QgYW4gaXZlYzQgdG8gYmUgcHVzaGVkOgorICAgICAqCisgICAgICogIC54eSBpcyBhZGRlZCB0byBmcmFnbWVudCBjb29yZCB0byBmb3JtICh1LCB2KQorICAgICAqICAueiBpcyBhaQorICAgICAqICAudyBpcyBsb2QKKyAgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DT1BZX01FTSwgICAgICAgICAgICAgLyogbGRfbHoodSkgICAgICAgICAgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFELCAgICAgICAgICAgICAgLyogbGQodSwgbG9kKSAgICAgICAgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzFEX0FSUkFZLCAgICAgICAgLyogbGQodSwgbG9kLCBhaSkgICAgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJELCAgICAgICAgICAgICAgLyogbGQodSwgbG9kLCB2KSAgICAgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX0FSUkFZLCAgICAgICAgLyogbGQodSwgbG9kLCB2LCBhaSkgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DT1BZXzJEX01TLCAgICAgICAgICAgLyogbGRfbWNzKCkgKyBsZDJkbXMoKSAgKi8KKworICAgIC8qCisgICAgICogVGhlc2UgZXhwZWN0IGEgc2Vjb25kIGl2ZWM0IHRvIGJlIHB1c2hlZDoKKyAgICAgKgorICAgICAqICAueCBpcyBtZW1vcnkgb2Zmc2V0CisgICAgICogIC55IGlzIGV4dGVudCB3aWR0aAorICAgICAqCisgICAgICogVGhlIHNlY29uZCBpdmVjNCBpcyB0byBjb252ZXJ0IGxpbmVhciBmcmFnbWVudCBjb29yZCB0byAodSwgdikuCisgICAgICovCisgICAgSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRF9UT19NRU0sICAgICAgIC8qIGxkKHUsIGxvZCkgICAgICAgICAgICovCisgICAgSU5URUxfREVWX01FVEFfRlNfQ09QWV8xRF9BUlJBWV9UT19NRU0sIC8qIGxkKHUsIGxvZCwgYWkpICAgICAgICovCisgICAgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9UT19NRU0sICAgICAgIC8qIGxkKHUsIGxvZCwgdikgICAgICAgICovCisgICAgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9BUlJBWV9UT19NRU0sIC8qIGxkKHUsIGxvZCwgdiwgYWkpICAgICovCisgICAgSU5URUxfREVWX01FVEFfRlNfQ09QWV8yRF9NU19UT19NRU0sICAgIC8qIGxkX21jcygpICsgbGQyZG1zKCkgICovCisKKyAgICAvKgorICAgICAqIFRoaXMgZXhwZWN0cyBhbiBpdmVjNCB0byBiZSBwdXNoZWQ6CisgICAgICoKKyAgICAgKiAgLnh5IGlzIGFkZGVkIHRvIGZhcmdtZW50IGNvb3JkIHRvIGZvcm0gKHUsIHYpCisgICAgICogIC56IGlzIGV4dGVudCB3aWR0aAorICAgICAqCisgICAgICogLnogaXMgdXNlZCB0byBsaW5lYXJpemUgKHUsIHYpLgorICAgICAqLworICAgIElOVEVMX0RFVl9NRVRBX0ZTX0NPUFlfTUVNX1RPX0lNRywgICAgICAvKiBsZF9seih1KSAgICAgICAgICAgICAqLworCisgICAgLyoKKyAgICAgKiBUaGVzZSBleHBlY3QgdGhlIGNsZWFyIHZhbHVlIHRvIGJlIHB1c2hlZCwgYW5kIHNldCBmcmFnbWVudCBjb2xvciBvcgorICAgICAqIGRlcHRoIHRvIHRoZSBjbGVhciB2YWx1ZS4KKyAgICAgKi8KKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DTEVBUl9DT0xPUiwKKyAgICBJTlRFTF9ERVZfTUVUQV9GU19DTEVBUl9ERVBUSCwKKworICAgIC8qCisgICAgICogVGhlc2UgZXhwZWN0IGFuIGl2ZWM0IHRvIGJlIHB1c2hlZDoKKyAgICAgKgorICAgICAqICAueHkgaXMgYWRkZWQgdG8gZnJhZ21lbnQgY29vcmQgdG8gZm9ybSAodSwgdikKKyAgICAgKgorICAgICAqIEFsbCBzYW1wbGVzIGFyZSBmZXRjaGVkIGFuZCBhdmVyYWdlZC4gIFRoZSBmcmFnbWVudCBjb2xvciBpcyBzZXQgdG8gdGhlCisgICAgICogYXZlcmFnZWQgdmFsdWUuCisgICAgICovCisgICAgSU5URUxfREVWX01FVEFfRlNfUkVTT0xWRV8yWCwKKyAgICBJTlRFTF9ERVZfTUVUQV9GU19SRVNPTFZFXzRYLAorICAgIElOVEVMX0RFVl9NRVRBX0ZTX1JFU09MVkVfOFgsCisgICAgSU5URUxfREVWX01FVEFfRlNfUkVTT0xWRV8xNlgsCisKKyAgICBJTlRFTF9ERVZfTUVUQV9TSEFERVJfQ09VTlQsCit9OworCitzdHJ1Y3QgaW50ZWxfZGV2X2RiZyB7CisgICAgc3RydWN0IGludGVsX2Jhc2VfZGJnIGJhc2U7Cit9OworCitzdHJ1Y3QgaW50ZWxfZGV2IHsKKyAgICBzdHJ1Y3QgaW50ZWxfYmFzZSBiYXNlOworCisgICAgYm9vbCBwaHlfZGV2X2V4dHNbSU5URUxfUEhZX0RFVl9FWFRfQ09VTlRdOworCisgICAgc3RydWN0IGludGVsX2dwdSAqZ3B1OworICAgIHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5czsKKworICAgIHN0cnVjdCBpbnRlbF9ibyAqY21kX3NjcmF0Y2hfYm87CisgICAgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqY21kX21ldGFfc2hhZGVyc1tJTlRFTF9ERVZfTUVUQV9TSEFERVJfQ09VTlRdOworCisgICAgc3RydWN0IGludGVsX2Rlc2NfcmVnaW9uICpkZXNjX3JlZ2lvbjsKKworICAgIHVpbnQzMl90IHNhbXBsZV9wYXR0ZXJuXzF4OworICAgIHVpbnQzMl90IHNhbXBsZV9wYXR0ZXJuXzJ4OworICAgIHVpbnQzMl90IHNhbXBsZV9wYXR0ZXJuXzR4OworICAgIHVpbnQzMl90IHNhbXBsZV9wYXR0ZXJuXzh4WzJdOworICAgIHVpbnQzMl90IHNhbXBsZV9wYXR0ZXJuXzE2eFs0XTsKKworICAgIHN0cnVjdCBpbnRlbF9xdWV1ZSAqcXVldWVzW0lOVEVMX0dQVV9FTkdJTkVfQ09VTlRdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZGV2ICppbnRlbF9kZXYoVmtEZXZpY2UgZGV2KQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX2RldiAqKSBkZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2Rldl9kYmcgKmludGVsX2Rldl9kYmcoc3RydWN0IGludGVsX2RldiAqZGV2KQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX2Rldl9kYmcgKikgZGV2LT5iYXNlLmRiZzsKK30KKworVmtSZXN1bHQgaW50ZWxfZGV2X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXYgKipkZXZfcmV0KTsKK3ZvaWQgaW50ZWxfZGV2X2Rlc3Ryb3koc3RydWN0IGludGVsX2RldiAqZGV2KTsKKwordm9pZCBpbnRlbF9kZXZfbG9nKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICBWa0ZsYWdzIG1zZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYmFzZSAqc3JjX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqaW50ZWxfZGV2X2dldF9tZXRhX3NoYWRlcihjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9kZXZfbWV0YV9zaGFkZXIgaWQpCit7CisgICAgYXNzZXJ0KGlkIDwgSU5URUxfREVWX01FVEFfU0hBREVSX0NPVU5UKTsKKyAgICByZXR1cm4gZGV2LT5jbWRfbWV0YV9zaGFkZXJzW2lkXTsKK30KKworI2VuZGlmIC8qIERFVl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZXZlbnQuYyBiL2ljZC9pbnRlbC9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjcyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZXZlbnQuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAiZXZlbnQuaCIKKworc3RhdGljIFZrUmVzdWx0IGV2ZW50X21hcChzdHJ1Y3QgaW50ZWxfZXZlbnQgKmV2ZW50LCB1aW50MzJfdCAqKnB0cl9yZXQpCit7CisgICAgdm9pZCAqcHRyOworCisgICAgLyoKKyAgICAgKiBUaGlzIGlzIGFuIHVuc3luY2hyb25vdXMgbWFwcGluZy4gIEl0IGRvZXNuJ3QgbG9vayBsaWtlIHdlIHdhbnQgYQorICAgICAqIHN5bmNocm9ub3VzIG1hcHBpbmcuICBCdXQgaXQgaXMgYWxzbyB1bmNsZWFyIHdoYXQgd291bGQgaGFwcGVuIHdoZW4gR1BVCisgICAgICogd3JpdGVzIHRvIGl0IGF0IHRoZSBzYW1lIHRpbWUuICBXZSBuZWVkIGF0b21pY3kgaGVyZS4KKyAgICAgKi8KKyAgICBwdHIgPSBpbnRlbF9tZW1fbWFwKGV2ZW50LT5vYmoubWVtLCAwKTsKKyAgICBpZiAoIXB0cikKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX01FTU9SWV9NQVBfRkFJTEVEOworCisgICAgKnB0cl9yZXQgPSAodWludDMyX3QgKikgKCh1aW50OF90ICopIHB0ciArIGV2ZW50LT5vYmoub2Zmc2V0KTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBldmVudF91bm1hcChzdHJ1Y3QgaW50ZWxfZXZlbnQgKmV2ZW50KQoreworICAgIGludGVsX21lbV91bm1hcChldmVudC0+b2JqLm1lbSk7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBldmVudF93cml0ZShzdHJ1Y3QgaW50ZWxfZXZlbnQgKmV2ZW50LCB1aW50MzJfdCB2YWwpCit7CisgICAgVmtSZXN1bHQgcmV0OworICAgIHVpbnQzMl90ICpwdHI7CisKKyAgICByZXQgPSBldmVudF9tYXAoZXZlbnQsICZwdHIpOworICAgIGlmIChyZXQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICAqcHRyID0gdmFsOworICAgICAgICBldmVudF91bm1hcChldmVudCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFZrUmVzdWx0IGV2ZW50X3JlYWQoc3RydWN0IGludGVsX2V2ZW50ICpldmVudCwgdWludDMyX3QgKnZhbCkKK3sKKyAgICBWa1Jlc3VsdCByZXQ7CisgICAgdWludDMyX3QgKnB0cjsKKworICAgIHJldCA9IGV2ZW50X21hcChldmVudCwgJnB0cik7CisgICAgaWYgKHJldCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICp2YWwgPSAqcHRyOworICAgICAgICBldmVudF91bm1hcChldmVudCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXZlbnRfZGVzdHJveShzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgc3RydWN0IGludGVsX2V2ZW50ICpldmVudCA9IGludGVsX2V2ZW50X2Zyb21fb2JqKG9iaik7CisKKyAgICBpbnRlbF9ldmVudF9kZXN0cm95KGV2ZW50KTsKK30KKworVmtSZXN1bHQgaW50ZWxfZXZlbnRfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2V2ZW50ICoqZXZlbnRfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9ldmVudCAqZXZlbnQ7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtX3JlcXM7CisKKyAgICBldmVudCA9IChzdHJ1Y3QgaW50ZWxfZXZlbnQgKikgaW50ZWxfYmFzZV9jcmVhdGUoJmRldi0+YmFzZS5oYW5kbGUsCisgICAgICAgICAgICBzaXplb2YoKmV2ZW50KSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVCwgaW5mbywgMCk7CisgICAgaWYgKCFldmVudCkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIG1lbV9yZXFzLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk87CisgICAgbWVtX3JlcXMuYWxsb2NhdGlvblNpemUgPSA0OyAvLyBXZSBrbm93IGFsbG9jYXRpb24gaXMgcGFnZSBhbGlnbm5lZAorICAgIG1lbV9yZXFzLnBOZXh0ID0gTlVMTDsKKyAgICBtZW1fcmVxcy5tZW1vcnlUeXBlSW5kZXggPSAwOworICAgIGludGVsX21lbV9hbGxvYyhkZXYsICZtZW1fcmVxcywgJmV2ZW50LT5vYmoubWVtKTsKKworICAgIGV2ZW50LT5vYmouZGVzdHJveSA9IGV2ZW50X2Rlc3Ryb3k7CisKKyAgICAqZXZlbnRfcmV0ID0gZXZlbnQ7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9ldmVudF9kZXN0cm95KHN0cnVjdCBpbnRlbF9ldmVudCAqZXZlbnQpCit7CisgICAgaW50ZWxfYmFzZV9kZXN0cm95KCZldmVudC0+b2JqLmJhc2UpOworfQorCitWa1Jlc3VsdCBpbnRlbF9ldmVudF9zZXQoc3RydWN0IGludGVsX2V2ZW50ICpldmVudCkKK3sKKyAgICByZXR1cm4gZXZlbnRfd3JpdGUoZXZlbnQsIDEpOworfQorCitWa1Jlc3VsdCBpbnRlbF9ldmVudF9yZXNldChzdHJ1Y3QgaW50ZWxfZXZlbnQgKmV2ZW50KQoreworICAgIHJldHVybiBldmVudF93cml0ZShldmVudCwgMCk7Cit9CisKK1ZrUmVzdWx0IGludGVsX2V2ZW50X2dldF9zdGF0dXMoc3RydWN0IGludGVsX2V2ZW50ICpldmVudCkKK3sKKyAgICBWa1Jlc3VsdCByZXQ7CisgICAgdWludDMyX3QgdmFsOworCisgICAgcmV0ID0gZXZlbnRfcmVhZChldmVudCwgJnZhbCk7CisgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuICh2YWwpID8gVktfRVZFTlRfU0VUIDogVktfRVZFTlRfUkVTRVQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyogICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50KQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIGludGVsX2V2ZW50X2NyZWF0ZShkZXYsIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9ldmVudCAqKikgcEV2ZW50KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCisKKyB7CisgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKGV2ZW50KTsKKworICAgIGludGVsX21lbV9mcmVlKG9iai0+bWVtKTsKKyAgICBvYmotPmRlc3Ryb3kob2JqKTsKKyB9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldEV2ZW50U3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF8pCit7CisgICAgc3RydWN0IGludGVsX2V2ZW50ICpldmVudCA9IGludGVsX2V2ZW50KGV2ZW50Xyk7CisKKyAgICByZXR1cm4gaW50ZWxfZXZlbnRfZ2V0X3N0YXR1cyhldmVudCk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1NldEV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF8pCit7CisgICAgc3RydWN0IGludGVsX2V2ZW50ICpldmVudCA9IGludGVsX2V2ZW50KGV2ZW50Xyk7CisKKyAgICByZXR1cm4gaW50ZWxfZXZlbnRfc2V0KGV2ZW50KTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUmVzZXRFdmVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfKQoreworICAgIHN0cnVjdCBpbnRlbF9ldmVudCAqZXZlbnQgPSBpbnRlbF9ldmVudChldmVudF8pOworCisgICAgcmV0dXJuIGludGVsX2V2ZW50X3Jlc2V0KGV2ZW50KTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9ldmVudC5oIGIvaWNkL2ludGVsL2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzNzc1MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9ldmVudC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBFVkVOVF9ICisjZGVmaW5lIEVWRU5UX0gKKworI2luY2x1ZGUgImludGVsLmgiCisjaW5jbHVkZSAib2JqLmgiCisKK3N0cnVjdCBpbnRlbF9kZXY7CisKK3N0cnVjdCBpbnRlbF9ldmVudCB7CisgICAgc3RydWN0IGludGVsX29iaiBvYmo7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9ldmVudCAqaW50ZWxfZXZlbnQoVmtFdmVudCBldmVudCkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfZXZlbnQgKiopICZldmVudDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZXZlbnQgKmludGVsX2V2ZW50X2Zyb21fb2JqKHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9ldmVudCAqKSBvYmo7Cit9CisKK1ZrUmVzdWx0IGludGVsX2V2ZW50X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0V2ZW50Q3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ldmVudCAqKmV2ZW50X3JldCk7Cit2b2lkIGludGVsX2V2ZW50X2Rlc3Ryb3koc3RydWN0IGludGVsX2V2ZW50ICpldmVudCk7CisKK1ZrUmVzdWx0IGludGVsX2V2ZW50X3NldChzdHJ1Y3QgaW50ZWxfZXZlbnQgKmV2ZW50KTsKK1ZrUmVzdWx0IGludGVsX2V2ZW50X3Jlc2V0KHN0cnVjdCBpbnRlbF9ldmVudCAqZXZlbnQpOworVmtSZXN1bHQgaW50ZWxfZXZlbnRfZ2V0X3N0YXR1cyhzdHJ1Y3QgaW50ZWxfZXZlbnQgKmV2ZW50KTsKKworI2VuZGlmIC8qIEVWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9leHRlbnNpb25faW5mby5oIGIvaWNkL2ludGVsL2V4dGVuc2lvbl9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhNDEyNAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9leHRlbnNpb25faW5mby5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBFWFRFTlNJT05fSU5GT19ICisjZGVmaW5lIEVYVEVOU0lPTl9JTkZPX0gKKworI2luY2x1ZGUgImludGVsLmgiCisKK2VudW0gaW50ZWxfcGh5X2Rldl9leHRfdHlwZSB7CisgICAgSU5URUxfUEhZX0RFVl9FWFRfV1NJX1NXQVBDSEFJTiwKKworICAgIElOVEVMX1BIWV9ERVZfRVhUX0NPVU5ULAorICAgIElOVEVMX1BIWV9ERVZfRVhUX0lOVkFMSUQgPSBJTlRFTF9QSFlfREVWX0VYVF9DT1VOVCwKK307CisKK2VudW0gaW50ZWxfZ2xvYmFsX2V4dF90eXBlIHsKKyAgICBJTlRFTF9QSFlfREVWX0VYVF9ERUJVR19SRVBPUlQsCisgICAgSU5URUxfR0xPQkFMX0VYVF9XU0lfU1VSRkFDRSwKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIElOVEVMX0dMT0JBTF9FWFRfV1NJX1hDQl9TVVJGQUNFLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgSU5URUxfR0xPQkFMX0VYVF9XU0lfWExJQl9TVVJGQUNFLAorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIElOVEVMX0dMT0JBTF9FWFRfQ09VTlQsCisgICAgSU5URUxfR0xPQkFMX0VYVF9JTlZBTElEID0gSU5URUxfR0xPQkFMX0VYVF9DT1VOVCwKK307CisKK2V4dGVybiBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgaW50ZWxfcGh5X2Rldl9ncHVfZXh0c1tJTlRFTF9QSFlfREVWX0VYVF9DT1VOVF07CitleHRlcm4gY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIGludGVsX2dsb2JhbF9leHRzW0lOVEVMX0dMT0JBTF9FWFRfQ09VTlRdOworCitib29sIGNvbXBhcmVfdmtfZXh0ZW5zaW9uX3Byb3BlcnRpZXMoCisgICAgICAgIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqb3AxLAorICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbk5hbWUpOworI2VuZGlmIC8qIEVYVEVOU0lPTl9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9leHRlbnNpb25fdXRpbHMuYyBiL2ljZC9pbnRlbC9leHRlbnNpb25fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDhjZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2V4dGVuc2lvbl91dGlscy5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogSWFuIEVsbGlvdHQgPGlhbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJleHRlbnNpb25faW5mby5oIgorCitjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgaW50ZWxfZ2xvYmFsX2V4dHNbSU5URUxfR0xPQkFMX0VYVF9DT1VOVF0gPSB7CisgICAgeworICAgICAgICAuZXh0ZW5zaW9uTmFtZSA9IFZLX0VYVF9ERUJVR19SRVBPUlRfRVhURU5TSU9OX05BTUUsCisgICAgICAgIC5zcGVjVmVyc2lvbiA9IFZLX0VYVF9ERUJVR19SRVBPUlRfU1BFQ19WRVJTSU9OLAorICAgIH0sCisgICAgeworICAgICAgICAuZXh0ZW5zaW9uTmFtZSA9IFZLX0tIUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAuc3BlY1ZlcnNpb24gPSBWS19LSFJfU1VSRkFDRV9TUEVDX1ZFUlNJT04sCisgICAgfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgLHsKKyAgICAgICAgLmV4dGVuc2lvbk5hbWUgPSBWS19LSFJfWENCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisgICAgICAgIC5zcGVjVmVyc2lvbiA9IFZLX0tIUl9YQ0JfU1VSRkFDRV9TUEVDX1ZFUlNJT04sCisgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgLHsKKyAgICAgICAgLmV4dGVuc2lvbk5hbWUgPSBWS19LSFJfWExJQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FLAorICAgICAgICAuc3BlY1ZlcnNpb24gPSBWS19LSFJfWExJQl9TVVJGQUNFX1NQRUNfVkVSU0lPTiwKKyAgICB9CisjZW5kaWYKKyNpZiAwCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01JUl9LSFIKKyAgICAseworICAgICAgICAuZXh0ZW5zaW9uTmFtZSA9IFZLX0tIUl9NSVJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgLnNwZWNWZXJzaW9uID0gVktfS0hSX01JUl9TVVJGQUNFX1NQRUNfVkVSU0lPTiwKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICAseworICAgICAgICAuZXh0ZW5zaW9uTmFtZSA9IFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUsCisgICAgICAgIC5zcGVjVmVyc2lvbiA9IFZLX0tIUl9XQVlMQU5EX1NVUkZBQ0VfU1BFQ19WRVJTSU9OLAorICAgIH0KKyNlbmRpZgorI2VuZGlmCit9OworCitjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgaW50ZWxfcGh5X2Rldl9ncHVfZXh0c1tJTlRFTF9QSFlfREVWX0VYVF9DT1VOVF0gPSB7CisgICAgeworICAgICAgICAuZXh0ZW5zaW9uTmFtZSA9IFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUsCisgICAgICAgIC5zcGVjVmVyc2lvbiA9IFZLX0tIUl9TV0FQQ0hBSU5fU1BFQ19WRVJTSU9OLAorICAgIH0KK307CisKK2Jvb2wgY29tcGFyZV92a19leHRlbnNpb25fcHJvcGVydGllcygKKyAgICAgICAgY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpvcDEsCisgICAgICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbk5hbWUpCit7CisgICAgcmV0dXJuIHN0cmNtcChvcDEtPmV4dGVuc2lvbk5hbWUsIGV4dGVuc2lvbk5hbWUpID09IDAgPyB0cnVlIDogZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZmIuYyBiL2ljZC9pbnRlbC9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzFmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZmIuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaHJpcyBGb3JiZXMgPGNocmlzZkBpancuY28ubno+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgIm9iai5oIgorI2luY2x1ZGUgInZpZXcuaCIKKyNpbmNsdWRlICJpbWcuaCIKKyNpbmNsdWRlICJmYi5oIgorCitzdGF0aWMgdm9pZCBmYl9kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZmIgKmZiID0gaW50ZWxfZmJfZnJvbV9vYmoob2JqKTsKKworICAgIGludGVsX2ZiX2Rlc3Ryb3koZmIpOworfQorCitWa1Jlc3VsdCBpbnRlbF9mYl9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9mYiAqKmZiX3JldCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZmIgKmZiOworICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQsIGFycmF5X3NpemUsIGk7CisKKyAgICBmYiA9IChzdHJ1Y3QgaW50ZWxfZmIgKikgaW50ZWxfYmFzZV9jcmVhdGUoJmRldi0+YmFzZS5oYW5kbGUsCisgICAgICAgICAgICBzaXplb2YoKmZiKSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZSQU1FQlVGRkVSX0VYVCwgaW5mbywgMCk7CisgICAgaWYgKCFmYikKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIGZiLT52aWV3X2NvdW50ID0gaW5mby0+YXR0YWNobWVudENvdW50OworICAgIGZiLT52aWV3cyA9IGludGVsX2FsbG9jKGZiLCBzaXplb2YoZmItPnZpZXdzWzBdKSAqIGZiLT52aWV3X2NvdW50LCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgaWYgKCFmYi0+dmlld3MpIHsKKyAgICAgICAgaW50ZWxfZmJfZGVzdHJveShmYik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorCisgICAgd2lkdGggPSBpbmZvLT53aWR0aDsKKyAgICBoZWlnaHQgPSBpbmZvLT5oZWlnaHQ7CisgICAgYXJyYXlfc2l6ZSA9IGluZm8tPmxheWVyczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5hdHRhY2htZW50Q291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0ltYWdlVmlldyAqYXR0ID0gJmluZm8tPnBBdHRhY2htZW50c1tpXTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ltZ192aWV3ICp2aWV3ID0gaW50ZWxfaW1nX3ZpZXcoKmF0dCk7CisKKyAgICAgICAgaWYgKGFycmF5X3NpemUgPiB2aWV3LT5hdHRfdmlldy5hcnJheV9zaXplKQorICAgICAgICAgICAgYXJyYXlfc2l6ZSA9IHZpZXctPmF0dF92aWV3LmFycmF5X3NpemU7CisKKyAgICAgICAgZmItPnZpZXdzW2ldID0gJnZpZXctPmF0dF92aWV3OworICAgIH0KKworICAgIGZiLT53aWR0aCA9IHdpZHRoOworICAgIGZiLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZmItPmFycmF5X3NpemUgPSBhcnJheV9zaXplOworCisgICAgZmItPm9iai5kZXN0cm95ID0gZmJfZGVzdHJveTsKKworICAgICpmYl9yZXQgPSBmYjsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2ZiX2Rlc3Ryb3koc3RydWN0IGludGVsX2ZiICpmYikKK3sKKyAgICBpZiAoZmItPnZpZXdzKQorICAgICAgICBpbnRlbF9mcmVlKGZiLCBmYi0+dmlld3MpOworICAgIGludGVsX2Jhc2VfZGVzdHJveSgmZmItPm9iai5iYXNlKTsKK30KKworc3RhdGljIHZvaWQgcmVuZGVyX3Bhc3NfZGVzdHJveShzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICpycCA9IGludGVsX3JlbmRlcl9wYXNzX2Zyb21fb2JqKG9iaik7CisKKyAgICBpbnRlbF9yZW5kZXJfcGFzc19kZXN0cm95KHJwKTsKK30KKworVmtSZXN1bHQgaW50ZWxfcmVuZGVyX3Bhc3NfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzcyAqKnJwX3JldCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3MgKnJwOworICAgIHVpbnQzMl90IGk7CisKKyAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3Igc3VicGFzcyBkZXBlbmRlbmNpZXMKKyAgICBhc3NlcnQoIShpbmZvLT5kZXBlbmRlbmN5Q291bnQpICYmICJObyBJQ0Qgc3VwcG9ydCBmb3Igc3VicGFzcyBkZXBlbmRlbmNpZXMiKTsKKworICAgIHJwID0gKHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzcyAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqcnApLCBkZXYtPmJhc2UuZGJnLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhULCBpbmZvLCAwKTsKKyAgICBpZiAoIXJwKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgcnAtPmF0dGFjaG1lbnRfY291bnQgPSBpbmZvLT5hdHRhY2htZW50Q291bnQ7CisgICAgcnAtPnN1YnBhc3NfY291bnQgPSBpbmZvLT5zdWJwYXNzQ291bnQ7CisKKyAgICBycC0+YXR0YWNobWVudHMgPSBpbnRlbF9hbGxvYyhycCwKKyAgICAgICAgICAgIHNpemVvZihycC0+YXR0YWNobWVudHNbMF0pICogcnAtPmF0dGFjaG1lbnRfY291bnQgKworICAgICAgICAgICAgc2l6ZW9mKHJwLT5zdWJwYXNzZXNbMF0pICogcnAtPnN1YnBhc3NfY291bnQsIHNpemVvZihpbnQpLAorICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICBpZiAoIXJwLT5hdHRhY2htZW50cykgeworICAgICAgICBpbnRlbF9yZW5kZXJfcGFzc19kZXN0cm95KHJwKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisKKyAgICBycC0+c3VicGFzc2VzID0gKHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzc19zdWJwYXNzICopCisgICAgICAgIChycC0+YXR0YWNobWVudHMgKyBycC0+YXR0YWNobWVudF9jb3VudCk7CisKKyAgICBycC0+b2JqLmRlc3Ryb3kgPSByZW5kZXJfcGFzc19kZXN0cm95OworCisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPmF0dGFjaG1lbnRDb3VudDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzc19hdHRhY2htZW50ICphdHQgPSAmcnAtPmF0dGFjaG1lbnRzW2ldOworCisgICAgICAgIGF0dC0+Zm9ybWF0ID0gaW5mby0+cEF0dGFjaG1lbnRzW2ldLmZvcm1hdDsKKyAgICAgICAgYXR0LT5zYW1wbGVfY291bnQgPSAodWludDMyX3QpIGluZm8tPnBBdHRhY2htZW50c1tpXS5zYW1wbGVzOworICAgICAgICBhdHQtPmluaXRpYWxfbGF5b3V0ID0gaW5mby0+cEF0dGFjaG1lbnRzW2ldLmluaXRpYWxMYXlvdXQ7CisgICAgICAgIGF0dC0+ZmluYWxfbGF5b3V0ID0gaW5mby0+cEF0dGFjaG1lbnRzW2ldLmZpbmFsTGF5b3V0OworCisgICAgICAgIGF0dC0+Y2xlYXJfb25fbG9hZCA9IChpbmZvLT5wQXR0YWNobWVudHNbaV0ubG9hZE9wID09CisgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSKTsKKyAgICAgICAgYXR0LT5kaXNhYmxlX3N0b3JlID0gKGluZm8tPnBBdHRhY2htZW50c1tpXS5zdG9yZU9wID09CisgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUpOworCisgICAgICAgIGF0dC0+c3RlbmNpbF9jbGVhcl9vbl9sb2FkID0gKGluZm8tPnBBdHRhY2htZW50c1tpXS5zdGVuY2lsTG9hZE9wID09CisgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSKTsKKyAgICAgICAgYXR0LT5zdGVuY2lsX2Rpc2FibGVfc3RvcmUgPSAoaW5mby0+cEF0dGFjaG1lbnRzW2ldLnN0ZW5jaWxTdG9yZU9wID09CisgICAgICAgICAgICAgICAgVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBycC0+c3VicGFzc19jb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uICpzdWJwYXNzX2luZm8gPSAmaW5mby0+cFN1YnBhc3Nlc1tpXTsKKyAgICAgICAgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzX3N1YnBhc3MgKnN1YnBhc3MgPSAmcnAtPnN1YnBhc3Nlc1tpXTsKKyAgICAgICAgdWludDMyX3QgajsKKworICAgICAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgSW5wdXQgQXR0YWNobWVudCBSZWZlcmVuY2VzCisgICAgICAgIGFzc2VydCghKHN1YnBhc3NfaW5mby0+aW5wdXRBdHRhY2htZW50Q291bnQpICYmICJObyBJQ0Qgc3VwcG9ydCBmb3IgSW5wdXQgQXR0YWNobWVudHMiKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3VicGFzc19pbmZvLT5jb2xvckF0dGFjaG1lbnRDb3VudDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgKmNvbG9yX3JlZiA9CisgICAgICAgICAgICAgICAgJnN1YnBhc3NfaW5mby0+cENvbG9yQXR0YWNobWVudHNbal07CisgICAgICAgICAgICBjb25zdCBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgKnJlc29sdmVfcmVmID0KKyAgICAgICAgICAgICAgICAoc3VicGFzc19pbmZvLT5wUmVzb2x2ZUF0dGFjaG1lbnRzKSA/CisgICAgICAgICAgICAgICAgJnN1YnBhc3NfaW5mby0+cFJlc29sdmVBdHRhY2htZW50c1tqXSA6IE5VTEw7CisKKyAgICAgICAgICAgIHN1YnBhc3MtPmNvbG9yX2luZGljZXNbal0gPSBjb2xvcl9yZWYtPmF0dGFjaG1lbnQ7CisgICAgICAgICAgICBzdWJwYXNzLT5yZXNvbHZlX2luZGljZXNbal0gPSAocmVzb2x2ZV9yZWYpID8KKyAgICAgICAgICAgICAgICByZXNvbHZlX3JlZi0+YXR0YWNobWVudCA6IFZLX0FUVEFDSE1FTlRfVU5VU0VEOworICAgICAgICAgICAgc3VicGFzcy0+Y29sb3JfbGF5b3V0c1tqXSA9IGNvbG9yX3JlZi0+bGF5b3V0OworICAgICAgICB9CisKKyAgICAgICAgc3VicGFzcy0+Y29sb3JfY291bnQgPSBzdWJwYXNzX2luZm8tPmNvbG9yQXR0YWNobWVudENvdW50OworCisgICAgICAgIGlmIChzdWJwYXNzX2luZm8tPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSB7CisgICAgICAgICAgICBzdWJwYXNzLT5kc19pbmRleCA9CisgICAgICAgICAgICAgICAgc3VicGFzc19pbmZvLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+YXR0YWNobWVudDsKKyAgICAgICAgICAgIHN1YnBhc3MtPmRzX2xheW91dCA9CisgICAgICAgICAgICAgICAgc3VicGFzc19pbmZvLT5wRGVwdGhTdGVuY2lsQXR0YWNobWVudC0+bGF5b3V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VicGFzcy0+ZHNfaW5kZXggPSBWS19BVFRBQ0hNRU5UX1VOVVNFRDsKKyAgICAgICAgICAgIHN1YnBhc3MtPmRzX2xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQ7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHN1YnBhc3MtPmRzX2xheW91dCkgeworICAgICAgICBjYXNlIFZLX0lNQUdFX0xBWU9VVF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfT1BUSU1BTDoKKyAgICAgICAgY2FzZSBWS19JTUFHRV9MQVlPVVRfREVQVEhfU1RFTkNJTF9SRUFEX09OTFlfT1BUSU1BTDoKKyAgICAgICAgICAgIHN1YnBhc3MtPmRzX29wdGltYWwgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdWJwYXNzLT5kc19vcHRpbWFsID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpycF9yZXQgPSBycDsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX3JlbmRlcl9wYXNzX2Rlc3Ryb3koc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICpycCkKK3sKKyAgICBpZiAocnAtPmF0dGFjaG1lbnRzKQorICAgICAgICBpbnRlbF9mcmVlKHJwLCBycC0+YXR0YWNobWVudHMpOworCisgICAgaW50ZWxfYmFzZV9kZXN0cm95KCZycC0+b2JqLmJhc2UpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRnJhbWVidWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZWJ1ZmZlcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYgPSBpbnRlbF9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBpbnRlbF9mYl9jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfZmIgKiopIHBGcmFtZWJ1ZmZlcik7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUZyYW1lYnVmZmVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGcmFtZWJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQorCit7CisgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKGZyYW1lYnVmZmVyKTsKKworICAgIG9iai0+ZGVzdHJveShvYmopOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvKiAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIGludGVsX3JlbmRlcl9wYXNzX2NyZWF0ZShkZXYsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLAorICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzcyAqKikgcFJlbmRlclBhc3MpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lSZW5kZXJQYXNzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqICpvYmogPSBpbnRlbF9vYmoocmVuZGVyUGFzcyk7CisKKyAgICBvYmotPmRlc3Ryb3kob2JqKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9mYi5oIGIvaWNkL2ludGVsL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZDBiMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9mYi5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIEZCX0gKKyNkZWZpbmUgRkJfSAorCisjaW5jbHVkZSAiaW50ZWwuaCIKKyNpbmNsdWRlICJvYmouaCIKKworc3RydWN0IGludGVsX2ZiIHsKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqIG9iajsKKworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqKnZpZXdzOworICAgIHVpbnQzMl90IHZpZXdfY291bnQ7CisKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKK307CisKK3N0cnVjdCBpbnRlbF9yZW5kZXJfcGFzc19hdHRhY2htZW50IHsKKyAgICBWa0Zvcm1hdCBmb3JtYXQ7CisgICAgdWludDMyX3Qgc2FtcGxlX2NvdW50OworCisgICAgVmtJbWFnZUxheW91dCBpbml0aWFsX2xheW91dDsKKyAgICBWa0ltYWdlTGF5b3V0IGZpbmFsX2xheW91dDsKKworICAgIGJvb2wgY2xlYXJfb25fbG9hZDsKKyAgICBib29sIGRpc2FibGVfc3RvcmU7CisKKyAgICBib29sIHN0ZW5jaWxfY2xlYXJfb25fbG9hZDsKKyAgICBib29sIHN0ZW5jaWxfZGlzYWJsZV9zdG9yZTsKK307CisKK3N0cnVjdCBpbnRlbF9yZW5kZXJfcGFzc19zdWJwYXNzIHsKKyAgICB1aW50MzJfdCBjb2xvcl9pbmRpY2VzW0lOVEVMX01BWF9SRU5ERVJfVEFSR0VUU107CisgICAgdWludDMyX3QgcmVzb2x2ZV9pbmRpY2VzW0lOVEVMX01BWF9SRU5ERVJfVEFSR0VUU107CisgICAgVmtJbWFnZUxheW91dCBjb2xvcl9sYXlvdXRzW0lOVEVMX01BWF9SRU5ERVJfVEFSR0VUU107CisgICAgdWludDMyX3QgY29sb3JfY291bnQ7CisKKyAgICB1aW50MzJfdCBkc19pbmRleDsKKyAgICBWa0ltYWdlTGF5b3V0IGRzX2xheW91dDsKKyAgICBib29sIGRzX29wdGltYWw7Cit9OworCitzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3MgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzX2F0dGFjaG1lbnQgKmF0dGFjaG1lbnRzOworICAgIHVpbnQzMl90IGF0dGFjaG1lbnRfY291bnQ7CisKKyAgICBzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3Nfc3VicGFzcyAqc3VicGFzc2VzOworICAgIHVpbnQzMl90IHN1YnBhc3NfY291bnQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9mYiAqaW50ZWxfZmIoVmtGcmFtZWJ1ZmZlciBmYikKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfZmIgKiopICZmYjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZmIgKmludGVsX2ZiX2Zyb21fb2JqKHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9mYiAqKSBvYmo7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICppbnRlbF9yZW5kZXJfcGFzcyhWa1JlbmRlclBhc3MgcnApCit7CisgICAgcmV0dXJuICooc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICoqKSAmcnA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICppbnRlbF9yZW5kZXJfcGFzc19mcm9tX29iaihzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfcmVuZGVyX3Bhc3MgKikgb2JqOworfQorCitWa1Jlc3VsdCBpbnRlbF9mYl9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZmIgKipmYl9yZXQpOwordm9pZCBpbnRlbF9mYl9kZXN0cm95KHN0cnVjdCBpbnRlbF9mYiAqZmIpOworCitWa1Jlc3VsdCBpbnRlbF9yZW5kZXJfcGFzc19jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8gKnBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9yZW5kZXJfcGFzcyAqKnJwX3JldCk7Cit2b2lkIGludGVsX3JlbmRlcl9wYXNzX2Rlc3Ryb3koc3RydWN0IGludGVsX3JlbmRlcl9wYXNzICpycCk7CisKKyNlbmRpZiAvKiBGQl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZmVuY2UuYyBiL2ljZC9pbnRlbC9mZW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTNjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZmVuY2UuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAia21kL3dpbnN5cy5oIgorI2luY2x1ZGUgImNtZC5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgIndzaS5oIgorI2luY2x1ZGUgImZlbmNlLmgiCisjaW5jbHVkZSAiaW5zdGFuY2UuaCIKKworc3RhdGljIHZvaWQgZmVuY2VfZGVzdHJveShzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSA9IGludGVsX2ZlbmNlX2Zyb21fb2JqKG9iaik7CisKKyAgICBpbnRlbF9mZW5jZV9kZXN0cm95KGZlbmNlKTsKK30KKworVmtSZXN1bHQgaW50ZWxfZmVuY2VfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2ZlbmNlICoqZmVuY2VfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2U7CisKKyAgICBmZW5jZSA9IChzdHJ1Y3QgaW50ZWxfZmVuY2UgKikgaW50ZWxfYmFzZV9jcmVhdGUoJmRldi0+YmFzZS5oYW5kbGUsCisgICAgICAgICAgICBzaXplb2YoKmZlbmNlKSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVCwgaW5mbywgMCk7CisgICAgaWYgKCFmZW5jZSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIGlmIChkZXYtPmJhc2UuaGFuZGxlLmluc3RhbmNlLT5nbG9iYWxfZXh0c1tJTlRFTF9HTE9CQUxfRVhUX1dTSV9TVVJGQUNFXSkgeworICAgICAgICBWa1Jlc3VsdCByZXQgPSBpbnRlbF93c2lfZmVuY2VfaW5pdChmZW5jZSk7CisgICAgICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgaW50ZWxfZmVuY2VfZGVzdHJveShmZW5jZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgZmVuY2UtPm9iai5kZXN0cm95ID0gZmVuY2VfZGVzdHJveTsKKworICAgICpmZW5jZV9yZXQgPSBmZW5jZTsKKyAgICBmZW5jZS0+c2lnbmFsZWQgPSAoaW5mby0+ZmxhZ3MgJiBWS19GRU5DRV9DUkVBVEVfU0lHTkFMRURfQklUKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2ZlbmNlX2Rlc3Ryb3koc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSkKK3sKKyAgICBpZiAoZmVuY2UtPndzaV9kYXRhKQorICAgICAgICBpbnRlbF93c2lfZmVuY2VfY2xlYW51cChmZW5jZSk7CisKKyAgICBpbnRlbF9ib191bnJlZihmZW5jZS0+c2Vxbm9fYm8pOworCisgICAgaW50ZWxfYmFzZV9kZXN0cm95KCZmZW5jZS0+b2JqLmJhc2UpOworfQorCit2b2lkIGludGVsX2ZlbmNlX2NvcHkoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZmVuY2UgKnNyYykKK3sKKyAgICBpbnRlbF93c2lfZmVuY2VfY29weShmZW5jZSwgc3JjKTsKKyAgICBpbnRlbF9mZW5jZV9zZXRfc2Vxbm8oZmVuY2UsIHNyYy0+c2Vxbm9fYm8pOworfQorCit2b2lkIGludGVsX2ZlbmNlX3NldF9zZXFubyhzdHJ1Y3QgaW50ZWxfZmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpzZXFub19ibykKK3sKKyAgICBpbnRlbF9ib191bnJlZihmZW5jZS0+c2Vxbm9fYm8pOworICAgIGZlbmNlLT5zZXFub19ibyA9IGludGVsX2JvX3JlZihzZXFub19ibyk7CisKKyAgICBmZW5jZS0+c2lnbmFsZWQgPSBmYWxzZTsKK30KKworVmtSZXN1bHQgaW50ZWxfZmVuY2Vfd2FpdChzdHJ1Y3QgaW50ZWxfZmVuY2UgKmZlbmNlLCBpbnQ2NF90IHRpbWVvdXRfbnMpCit7CisgICAgVmtSZXN1bHQgcmV0OworCisgICAgcmV0ID0gaW50ZWxfd3NpX2ZlbmNlX3dhaXQoZmVuY2UsIHRpbWVvdXRfbnMpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChmZW5jZS0+c2lnbmFsZWQpIHsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKGZlbmNlLT5zZXFub19ibykgeworICAgICAgICByZXQgPSAoaW50ZWxfYm9fd2FpdChmZW5jZS0+c2Vxbm9fYm8sIHRpbWVvdXRfbnMpKSA/CisgICAgICAgICAgICBWS19OT1RfUkVBRFkgOiBWS19TVUNDRVNTOworICAgICAgICBpZiAocmV0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGZlbmNlLT5zaWduYWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBmZW5jZSBzdGF0dXMiKTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gaW50ZWxfZmVuY2VfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IGludGVsX2ZlbmNlICoqKSBwRmVuY2UpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lGZW5jZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKKworIHsKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqICpvYmogPSBpbnRlbF9vYmooZmVuY2UpOworCisgICAgb2JqLT5kZXN0cm95KG9iaik7CisgfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRGZW5jZVN0YXR1cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VfKQoreworICAgIHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2UgPSBpbnRlbF9mZW5jZShmZW5jZV8pOworCisgICAgcmV0dXJuIGludGVsX2ZlbmNlX3dhaXQoZmVuY2UsIDApOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtXYWl0Rm9yRmVuY2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlQ291bnQsCisgICAgY29uc3QgVmtGZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZlbmNlcywKKyAgICBWa0Jvb2wzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBbGwsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KQoreworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmZW5jZUNvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSA9IGludGVsX2ZlbmNlKHBGZW5jZXNbaV0pOworICAgICAgICBpbnQ2NF90IG5zOworICAgICAgICBWa1Jlc3VsdCByOworCisgICAgICAgIC8qIHRpbWVvdXQgaW4gbmFubyBzZWNvbmRzICovCisgICAgICAgIG5zID0gKHRpbWVvdXQgPD0gKHVpbnQ2NF90KSBJTlQ2NF9NQVgpID8gdGltZW91dCA6IC0xOworICAgICAgICByID0gaW50ZWxfZmVuY2Vfd2FpdChmZW5jZSwgbnMpOworCisgICAgICAgIGlmICghd2FpdEFsbCAmJiByID09IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKworICAgICAgICAvKiBUcmFuc2xhdGUgcmV0dXJuIHZhbHVlIGFjY29yZGluZyB0byBzcGVjICovCisgICAgICAgIGlmIChyID09IFZLX05PVF9SRUFEWSkKKyAgICAgICAgICAgIHIgPSBWS19USU1FT1VUOworCisgICAgICAgIGlmIChyICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICByZXQgPSByOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldEZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzKQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmVuY2VDb3VudDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2UgPSBpbnRlbF9mZW5jZShwRmVuY2VzW2ldKTsKKyAgICAgICAgZmVuY2UtPnNpZ25hbGVkID0gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZmVuY2UuaCBiL2ljZC9pbnRlbC9mZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTcyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZmVuY2UuaApAQCAtMCwwICsxLDYzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKgorICovCisKKyNpZm5kZWYgRkVOQ0VfSAorI2RlZmluZSBGRU5DRV9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorI2luY2x1ZGUgIm9iai5oIgorCitzdHJ1Y3QgaW50ZWxfYm87CitzdHJ1Y3QgaW50ZWxfZGV2OworCitzdHJ1Y3QgaW50ZWxfZmVuY2UgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgc3RydWN0IGludGVsX2JvICpzZXFub19ibzsKKyAgICBib29sICAgIHNpZ25hbGVkOworCisgICAgdm9pZCAqd3NpX2RhdGE7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9mZW5jZSAqaW50ZWxfZmVuY2UoVmtGZW5jZSBmZW5jZSkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfZmVuY2UgKiopICZmZW5jZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZmVuY2UgKmludGVsX2ZlbmNlX2Zyb21fb2JqKHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9mZW5jZSAqKSBvYmo7Cit9CisKK1ZrUmVzdWx0IGludGVsX2ZlbmNlX2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ZlbmNlQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9mZW5jZSAqKmZlbmNlX3JldCk7Cit2b2lkIGludGVsX2ZlbmNlX2Rlc3Ryb3koc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSk7CisKK1ZrUmVzdWx0IGludGVsX2ZlbmNlX3dhaXQoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSwgaW50NjRfdCB0aW1lb3V0X25zKTsKKwordm9pZCBpbnRlbF9mZW5jZV9jb3B5KHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ZlbmNlICpzcmMpOworCit2b2lkIGludGVsX2ZlbmNlX3NldF9zZXFubyhzdHJ1Y3QgaW50ZWxfZmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpzZXFub19ibyk7CisKKyNlbmRpZiAvKiBGRU5DRV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZm9ybWF0LmMgYi9pY2QvaW50ZWwvZm9ybWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNWExMgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9mb3JtYXQuYwpAQCAtMCwwICsxLDczMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJnZW5ody9nZW5ody5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImdwdS5oIgorI2luY2x1ZGUgImZvcm1hdC5oIgorCitzdHJ1Y3QgaW50ZWxfdmZfY2FwIHsKKyAgIGludCB2ZXJ0ZXhfZWxlbWVudDsKK307CisKK3N0cnVjdCBpbnRlbF9zYW1wbGVyX2NhcCB7CisgICBpbnQgc2FtcGxpbmc7CisgICBpbnQgZmlsdGVyaW5nOworICAgaW50IHNoYWRvd19tYXA7CisgICBpbnQgY2hyb21hX2tleTsKK307CisKK3N0cnVjdCBpbnRlbF9kcF9jYXAgeworICAgaW50IHJ0X3dyaXRlOworICAgaW50IHJ0X3dyaXRlX2JsZW5kaW5nOworICAgaW50IHR5cGVkX3dyaXRlOworICAgaW50IG1lZGlhX2NvbG9yX3Byb2Nlc3Npbmc7Cit9OworCisvKgorICogVGhpcyB0YWJsZSBpcyBiYXNlZCBvbjoKKyAqCisgKiAgLSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDg4LTk3CisgKiAgLSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSA5Ny05OQorICogIC0gdGhlIEhhc3dlbGwgUFJNLCB2b2x1bWUgNywgcGFnZSA0NjctNDcwCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfdmZfY2FwIGludGVsX3ZmX2NhcHNbXSA9IHsKKyNkZWZpbmUgQ0FQKHZlcnRleF9lbGVtZW50KSB7IElOVEVMX0dFTih2ZXJ0ZXhfZWxlbWVudCkgfQorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9GTE9BVF0gICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVF0gICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlRdICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9VTk9STV0gICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfU05PUk1dICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjY0RzY0X0ZMT0FUXSAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9TU0NBTEVEXSAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfVVNDQUxFRF0gICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX1NGSVhFRF0gICAgICA9IENBUCg3LjUpLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMl9GTE9BVF0gICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJfU0lOVF0gICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyQjMyX1VJTlRdICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMl9VTk9STV0gICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJfU05PUk1dICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyQjMyX1NTQ0FMRURdICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMl9VU0NBTEVEXSAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJfU0ZJWEVEXSAgICAgICAgID0gQ0FQKDcuNSksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNXSAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9TTk9STV0gICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0lOVF0gICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlRdICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVF0gICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJfRkxPQVRdICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyX1NJTlRdICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMkczMl9VSU5UXSAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJfVU5PUk1dICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyX1NOT1JNXSAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I2NF9GTE9BVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRF0gICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRURdICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMkczMl9TU0NBTEVEXSAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJfVVNDQUxFRF0gICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyX1NGSVhFRF0gICAgICAgICAgICA9IENBUCg3LjUpLAorICAgW0dFTjZfRk9STUFUX0I4RzhSOEE4X1VOT1JNXSAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STV0gICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjEwRzEwQjEwQTJfVUlOVF0gICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxMEcxMEIxMF9TTk9STV9BMl9VTk9STV0gPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhBOF9VTk9STV0gICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjhHOEI4QThfU05PUk1dICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOEE4X1NJTlRdICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhBOF9VSU5UXSAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2X1VOT1JNXSAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNl9TTk9STV0gICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZfU0lOVF0gICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2X1VJTlRdICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNl9GTE9BVF0gICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9VTk9STV0gICAgICAgID0gQ0FQKDcuNSksCisgICBbR0VONl9GT1JNQVRfUjExRzExQjEwX0ZMT0FUXSAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMl9TSU5UXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJfVUlOVF0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyX0ZMT0FUXSAgICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IzMl9VTk9STV0gICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJfU05PUk1dICAgICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjEwRzEwQjEwWDJfVVNDQUxFRF0gICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOEE4X1NTQ0FMRURdICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhBOF9VU0NBTEVEXSAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2X1NTQ0FMRURdICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNl9VU0NBTEVEXSAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJfU1NDQUxFRF0gICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjMyX1VTQ0FMRURdICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4RzhfVU5PUk1dICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4X1NOT1JNXSAgICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjhHOF9TSU5UXSAgICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4RzhfVUlOVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZfVU5PUk1dICAgICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2X1NOT1JNXSAgICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNl9TSU5UXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZfVUlOVF0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2X0ZMT0FUXSAgICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4RzhfU1NDQUxFRF0gICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4X1VTQ0FMRURdICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2X1NTQ0FMRURdICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNl9VU0NBTEVEXSAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOF9VTk9STV0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjhfU05PUk1dICAgICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4X1NJTlRdICAgICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOF9VSU5UXSAgICAgICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjhfU1NDQUxFRF0gICAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4X1VTQ0FMRURdICAgICAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhfVU5PUk1dICAgICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjhHOEI4X1NOT1JNXSAgICAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOF9TU0NBTEVEXSAgICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhfVVNDQUxFRF0gICAgICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjY0RzY0QjY0QTY0X0ZMT0FUXSAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1I2NEc2NEI2NF9GTE9BVF0gICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZfRkxPQVRdICAgICAgICAgID0gQ0FQKCAgNiksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2X1VOT1JNXSAgICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNkIxNl9TTk9STV0gICAgICAgICAgPSBDQVAoICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRF0gICAgICAgID0gQ0FQKCAgMSksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRURdICAgICAgICA9IENBUCggIDEpLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNkIxNl9VSU5UXSAgICAgICAgICAgPSBDQVAoNy41KSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZfU0lOVF0gICAgICAgICAgID0gQ0FQKDcuNSksCisgICBbR0VONl9GT1JNQVRfUjMyX1NGSVhFRF0gICAgICAgICAgICAgICA9IENBUCg3LjUpLAorICAgW0dFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1NOT1JNXSAgICAgICAgPSBDQVAoNy41KSwKKyAgIFtHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VU0NBTEVEXSAgICAgID0gQ0FQKDcuNSksCisgICBbR0VONl9GT1JNQVRfUjEwRzEwQjEwQTJfU1NDQUxFRF0gICAgICA9IENBUCg3LjUpLAorICAgW0dFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1NJTlRdICAgICAgICAgPSBDQVAoNy41KSwKKyAgIFtHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9TTk9STV0gICAgICAgID0gQ0FQKDcuNSksCisgICBbR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfVVNDQUxFRF0gICAgICA9IENBUCg3LjUpLAorICAgW0dFTjZfRk9STUFUX0IxMEcxMFIxMEEyX1NTQ0FMRURdICAgICAgPSBDQVAoNy41KSwKKyAgIFtHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9VSU5UXSAgICAgICAgID0gQ0FQKDcuNSksCisgICBbR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfU0lOVF0gICAgICAgICA9IENBUCg3LjUpLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOF9VSU5UXSAgICAgICAgICAgICAgPSBDQVAoNy41KSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhfU0lOVF0gICAgICAgICAgICAgID0gQ0FQKDcuNSksCisjdW5kZWYgQ0FQCit9OworCisvKgorICogVGhpcyB0YWJsZSBpcyBiYXNlZCBvbjoKKyAqCisgKiAgLSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDg4LTk3CisgKiAgLSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA4NC04NworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3NhbXBsZXJfY2FwIGludGVsX3NhbXBsZXJfY2Fwc1tdID0geworI2RlZmluZSBDQVAoc2FtcGxpbmcsIGZpbHRlcmluZywgc2hhZG93X21hcCwgY2hyb21hX2tleSkgXAorICAgeyBJTlRFTF9HRU4oc2FtcGxpbmcpLCBJTlRFTF9HRU4oZmlsdGVyaW5nKSwgSU5URUxfR0VOKHNoYWRvd19tYXApLCBJTlRFTF9HRU4oY2hyb21hX2tleSkgfQorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9GTE9BVF0gICAgICAgPSBDQVAoICAxLCAgIDUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVF0gICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlRdICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMlgzMl9GTE9BVF0gICAgICAgPSBDQVAoICAxLCAgIDUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJfRkxPQVRdICAgICAgICAgID0gQ0FQKCAgMSwgICA1LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyQjMyX1NJTlRdICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMl9VSU5UXSAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk1dICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNXSAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UXSAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfVUlOVF0gICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X0ZMT0FUXSAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMkczMl9GTE9BVF0gICAgICAgICAgICAgPSBDQVAoICAxLCAgIDUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJfU0lOVF0gICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyX1VJTlRdICAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMl9GTE9BVF9YOFgyNF9UWVBFTEVTU10gPSBDQVAoICAxLCAgIDUsICAgMSwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9YMzJfVFlQRUxFU1NfRzhYMjRfVUlOVF0gID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfTDMyQTMyX0ZMT0FUXSAgICAgICAgICAgICA9IENBUCggIDEsICAgNSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNkIxNlgxNl9VTk9STV0gICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZYMTZfRkxPQVRdICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQTMyWDMyX0ZMT0FUXSAgICAgICAgICAgICA9IENBUCggIDEsICAgNSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0wzMlgzMl9GTE9BVF0gICAgICAgICAgICAgPSBDQVAoICAxLCAgIDUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9JMzJYMzJfRkxPQVRdICAgICAgICAgICAgID0gQ0FQKCAgMSwgICA1LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQjhHOFI4QThfVU5PUk1dICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDEpLAorICAgW0dFTjZfRk9STUFUX0I4RzhSOEE4X1VOT1JNX1NSR0JdICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STV0gICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk1fU1JHQl0gICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1VJTlRdICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTBHMTBCMTBfU05PUk1fQTJfVU5PUk1dID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhHOEI4QThfVU5PUk1dICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOEE4X1VOT1JNX1NSR0JdICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhBOF9TTk9STV0gICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhHOEI4QThfU0lOVF0gICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOEE4X1VJTlRdICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZfVU5PUk1dICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2X1NOT1JNXSAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNl9TSU5UXSAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZfVUlOVF0gICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2X0ZMT0FUXSAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0IxMEcxMFIxMEEyX1VOT1JNXSAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9VTk9STV9TUkdCXSAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjExRzExQjEwX0ZMT0FUXSAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMl9TSU5UXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJfVUlOVF0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjMyX0ZMT0FUXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgNSwgICAxLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IyNF9VTk9STV9YOF9UWVBFTEVTU10gICAgPSBDQVAoICAxLCAgIDUsICAgMSwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9YMjRfVFlQRUxFU1NfRzhfVUlOVF0gICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfTDE2QTE2X1VOT1JNXSAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0kyNFg4X1VOT1JNXSAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDUsICAgMSwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9MMjRYOF9VTk9STV0gICAgICAgICAgICAgID0gQ0FQKCAgMSwgICA1LCAgIDEsICAgMCksCisgICBbR0VONl9GT1JNQVRfQTI0WDhfVU5PUk1dICAgICAgICAgICAgICA9IENBUCggIDEsICAgNSwgICAxLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0kzMl9GTE9BVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDUsICAgMSwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9MMzJfRkxPQVRdICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICA1LCAgIDEsICAgMCksCisgICBbR0VONl9GT1JNQVRfQTMyX0ZMT0FUXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgNSwgICAxLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0I4RzhSOFg4X1VOT1JNXSAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9COEc4UjhYOF9VTk9STV9TUkdCXSAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhHOEI4WDhfVU5PUk1dICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOFg4X1VOT1JNX1NSR0JdICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOUc5QjlFNV9TSEFSRURFWFBdICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQjEwRzEwUjEwWDJfVU5PUk1dICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0wxNkExNl9GTE9BVF0gICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9CNUc2UjVfVU5PUk1dICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMSksCisgICBbR0VONl9GT1JNQVRfQjVHNlI1X1VOT1JNX1NSR0JdICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0I1RzVSNUExX1VOT1JNXSAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9CNUc1UjVBMV9VTk9STV9TUkdCXSAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQjRHNFI0QTRfVU5PUk1dICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDEpLAorICAgW0dFTjZfRk9STUFUX0I0RzRSNEE0X1VOT1JNX1NSR0JdICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4X1VOT1JNXSAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhHOF9TTk9STV0gICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDEpLAorICAgW0dFTjZfRk9STUFUX1I4RzhfU0lOVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4X1VJTlRdICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2X1VOT1JNXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAxLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNl9TTk9STV0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZfU0lOVF0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2X1VJTlRdICAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNl9GTE9BVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9BOFA4X1VOT1JNX1BBTEVUVEUwXSAgICAgID0gQ0FQKCAgNSwgICA1LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQThQOF9VTk9STV9QQUxFVFRFMV0gICAgICA9IENBUCggIDUsICAgNSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0kxNl9VTk9STV0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMSwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9MMTZfVU5PUk1dICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDEsICAgMCksCisgICBbR0VONl9GT1JNQVRfQTE2X1VOT1JNXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAxLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0w4QThfVU5PUk1dICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9JMTZfRkxPQVRdICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDEsICAgMCksCisgICBbR0VONl9GT1JNQVRfTDE2X0ZMT0FUXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAxLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0ExNl9GTE9BVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMSwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9MOEE4X1VOT1JNX1NSR0JdICAgICAgICAgID0gQ0FQKDQuNSwgNC41LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjVHNV9TTk9STV9CNl9VTk9STV0gICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDEpLAorICAgW0dFTjZfRk9STUFUX1A4QThfVU5PUk1fUEFMRVRURTBdICAgICAgPSBDQVAoICA1LCAgIDUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9QOEE4X1VOT1JNX1BBTEVUVEUxXSAgICAgID0gQ0FQKCAgNSwgICA1LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhfVU5PUk1dICAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCA0LjUpLAorICAgW0dFTjZfRk9STUFUX1I4X1NOT1JNXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOF9TSU5UXSAgICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhfVUlOVF0gICAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0E4X1VOT1JNXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9JOF9VTk9STV0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfTDhfVU5PUk1dICAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDEpLAorICAgW0dFTjZfRk9STUFUX1A0QTRfVU5PUk1fUEFMRVRURTBdICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9BNFA0X1VOT1JNX1BBTEVUVEUwXSAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUDhfVU5PUk1fUEFMRVRURTBdICAgICAgICA9IENBUCg0LjUsIDQuNSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0w4X1VOT1JNX1NSR0JdICAgICAgICAgICAgPSBDQVAoNC41LCA0LjUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9QOF9VTk9STV9QQUxFVFRFMV0gICAgICAgID0gQ0FQKDQuNSwgNC41LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUDRBNF9VTk9STV9QQUxFVFRFMV0gICAgICA9IENBUCg0LjUsIDQuNSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0E0UDRfVU5PUk1fUEFMRVRURTFdICAgICAgPSBDQVAoNC41LCA0LjUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9EWFQxX1JHQl9TUkdCXSAgICAgICAgICAgID0gQ0FQKDQuNSwgNC41LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjFfVU5PUk1dICAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1lDUkNCX05PUk1BTF0gICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9ZQ1JDQl9TV0FQVVZZXSAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMSksCisgICBbR0VONl9GT1JNQVRfUDJfVU5PUk1fUEFMRVRURTBdICAgICAgICA9IENBUCg0LjUsIDQuNSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1AyX1VOT1JNX1BBTEVUVEUxXSAgICAgICAgPSBDQVAoNC41LCA0LjUsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9CQzFfVU5PUk1dICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMSksCisgICBbR0VONl9GT1JNQVRfQkMyX1VOT1JNXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDEpLAorICAgW0dFTjZfRk9STUFUX0JDM19VTk9STV0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAxKSwKKyAgIFtHRU42X0ZPUk1BVF9CQzRfVU5PUk1dICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQkM1X1VOT1JNXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0JDMV9VTk9STV9TUkdCXSAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9CQzJfVU5PUk1fU1JHQl0gICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQkMzX1VOT1JNX1NSR0JdICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX01PTk84XSAgICAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9ZQ1JDQl9TV0FQVVZdICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfWUNSQ0JfU1dBUFldICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0RYVDFfUkdCXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9GWFQxXSAgICAgICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQkM0X1NOT1JNXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0JDNV9TTk9STV0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZfRkxPQVRdICAgICAgICAgID0gQ0FQKCAgNSwgICA1LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQkM2SF9TRjE2XSAgICAgICAgICAgICAgICA9IENBUCggIDcsICAgNywgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0JDN19VTk9STV0gICAgICAgICAgICAgICAgPSBDQVAoICA3LCAgIDcsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9CQzdfVU5PUk1fU1JHQl0gICAgICAgICAgID0gQ0FQKCAgNywgICA3LCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQkM2SF9VRjE2XSAgICAgICAgICAgICAgICA9IENBUCggIDcsICAgNywgICAwLCAgIDApLAorI3VuZGVmIENBUAorfTsKKworLyoKKyAqIFRoaXMgdGFibGUgaXMgYmFzZWQgb246CisgKgorICogIC0gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA4OC05NworICogIC0gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgMTcyLCAyNTItMjUzLCBhbmQgMjc3LTI3OAorICogIC0gdGhlIEhhc3dlbGwgUFJNLCB2b2x1bWUgNywgcGFnZSAyNjItMjY0CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZHBfY2FwIGludGVsX2RwX2NhcHNbXSA9IHsKKyNkZWZpbmUgQ0FQKHJ0X3dyaXRlLCBydF93cml0ZV9ibGVuZGluZywgdHlwZWRfd3JpdGUsIG1lZGlhX2NvbG9yX3Byb2Nlc3NpbmcpIFwKKyAgIHsgSU5URUxfR0VOKHJ0X3dyaXRlKSwgSU5URUxfR0VOKHJ0X3dyaXRlX2JsZW5kaW5nKSwgSU5URUxfR0VOKHR5cGVkX3dyaXRlKSwgSU5URUxfR0VOKG1lZGlhX2NvbG9yX3Byb2Nlc3NpbmcpIH0KKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfRkxPQVRdICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlRdICAgICAgICA9IENBUCggIDEsICAgMCwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9VSU5UXSAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk1dICAgICAgID0gQ0FQKCAgMSwgNC41LCAgIDcsICAgNiksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNXSAgICAgICA9IENBUCggIDEsICAgNiwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UXSAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfVUlOVF0gICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X0ZMT0FUXSAgICAgICA9IENBUCggIDEsICAgMSwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMkczMl9GTE9BVF0gICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJHMzJfU0lOVF0gICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjMyRzMyX1VJTlRdICAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX0I4RzhSOEE4X1VOT1JNXSAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgNywgICA2KSwKKyAgIFtHRU42X0ZPUk1BVF9COEc4UjhBOF9VTk9STV9TUkdCXSAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk1dICAgICAgICA9IENBUCggIDEsICAgMSwgICA3LCAgIDYpLAorICAgW0dFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNX1NSR0JdICAgPSBDQVAoICAwLCAgIDAsICAgMCwgICA2KSwKKyAgIFtHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VSU5UXSAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhHOEI4QThfVU5PUk1dICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICA3LCAgIDYpLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOEE4X1VOT1JNX1NSR0JdICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICA2KSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4QjhBOF9TTk9STV0gICAgICAgICAgID0gQ0FQKCAgMSwgICA2LCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhHOEI4QThfU0lOVF0gICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1I4RzhCOEE4X1VJTlRdICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZfVU5PUk1dICAgICAgICAgICAgID0gQ0FQKCAgMSwgNC41LCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2X1NOT1JNXSAgICAgICAgICAgICA9IENBUCggIDEsICAgNiwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNkcxNl9TSU5UXSAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZHMTZfVUlOVF0gICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2RzE2X0ZMT0FUXSAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX0IxMEcxMFIxMEEyX1VOT1JNXSAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgNywgICA2KSwKKyAgIFtHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9VTk9STV9TUkdCXSAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgNiksCisgICBbR0VONl9GT1JNQVRfUjExRzExQjEwX0ZMT0FUXSAgICAgICAgICA9IENBUCggIDEsICAgMSwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IzMl9TSU5UXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMzJfVUlOVF0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjMyX0ZMT0FUXSAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX0I4RzhSOFg4X1VOT1JNXSAgICAgICAgICAgPSBDQVAoICAwLCAgIDAsICAgMCwgICA2KSwKKyAgIFtHRU42X0ZPUk1BVF9CNUc2UjVfVU5PUk1dICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfQjVHNlI1X1VOT1JNX1NSR0JdICAgICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX0I1RzVSNUExX1VOT1JNXSAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9CNUc1UjVBMV9VTk9STV9TUkdCXSAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDAsICAgMCksCisgICBbR0VONl9GT1JNQVRfQjRHNFI0QTRfVU5PUk1dICAgICAgICAgICA9IENBUCggIDEsICAgMSwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX0I0RzRSNEE0X1VOT1JNX1NSR0JdICAgICAgPSBDQVAoICAxLCAgIDEsICAgMCwgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4X1VOT1JNXSAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhHOF9TTk9STV0gICAgICAgICAgICAgICA9IENBUCggIDEsICAgNiwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1I4RzhfU0lOVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOEc4X1VJTlRdICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2X1VOT1JNXSAgICAgICAgICAgICAgICA9IENBUCggIDEsIDQuNSwgICA3LCAgIDcpLAorICAgW0dFTjZfRk9STUFUX1IxNl9TTk9STV0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDYsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SMTZfU0lOVF0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjE2X1VJTlRdICAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1IxNl9GTE9BVF0gICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9CNUc1UjVYMV9VTk9STV0gICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfQjVHNVI1WDFfVU5PUk1fU1JHQl0gICAgICA9IENBUCggIDEsICAgMSwgICAwLCAgIDApLAorICAgW0dFTjZfRk9STUFUX1I4X1VOT1JNXSAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDEsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9SOF9TTk9STV0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICA2LCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfUjhfU0lOVF0gICAgICAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICA3LCAgIDApLAorICAgW0dFTjZfRk9STUFUX1I4X1VJTlRdICAgICAgICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgNywgICAwKSwKKyAgIFtHRU42X0ZPUk1BVF9BOF9VTk9STV0gICAgICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAxLCAgIDcsICAgMCksCisgICBbR0VONl9GT1JNQVRfWUNSQ0JfTk9STUFMXSAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDYpLAorICAgW0dFTjZfRk9STUFUX1lDUkNCX1NXQVBVVlldICAgICAgICAgICAgPSBDQVAoICAxLCAgIDAsICAgMCwgICA2KSwKKyAgIFtHRU42X0ZPUk1BVF9ZQ1JDQl9TV0FQVVZdICAgICAgICAgICAgID0gQ0FQKCAgMSwgICAwLCAgIDAsICAgNiksCisgICBbR0VONl9GT1JNQVRfWUNSQ0JfU1dBUFldICAgICAgICAgICAgICA9IENBUCggIDEsICAgMCwgICAwLCAgIDYpLAorI3VuZGVmIENBUAorfTsKKworc3RhdGljIGNvbnN0IGludCBpbnRlbF9jb2xvcl9tYXBwaW5nW1ZLX0ZPUk1BVF9SQU5HRV9TSVpFXSA9IHsKKyAgICBbVktfRk9STUFUX1I0RzRfVU5PUk1fUEFDSzhdICAgICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTZdICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0I0RzRSNEE0X1VOT1JNX1BBQ0sxNl0gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNl0gICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2XSAgICAgICAgID0gR0VONl9GT1JNQVRfQjVHNlI1X1VOT1JNLAorICAgIFtWS19GT1JNQVRfUjVHNUI1QTFfVU5PUk1fUEFDSzE2XSAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9CNUc1UjVBMV9VTk9STV9QQUNLMTZdICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0ExUjVHNUI1X1VOT1JNX1BBQ0sxNl0gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfUjhfVU5PUk1dICAgICAgICAgICAgID0gR0VONl9GT1JNQVRfUjhfVU5PUk0sCisgICAgW1ZLX0ZPUk1BVF9SOF9TTk9STV0gICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SOF9TTk9STSwKKyAgICBbVktfRk9STUFUX1I4X1VTQ0FMRURdICAgICAgICAgICA9IEdFTjZfRk9STUFUX1I4X1VTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SOF9TU0NBTEVEXSAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SOF9TU0NBTEVELAorICAgIFtWS19GT1JNQVRfUjhfVUlOVF0gICAgICAgICAgICAgID0gR0VONl9GT1JNQVRfUjhfVUlOVCwKKyAgICBbVktfRk9STUFUX1I4X1NJTlRdICAgICAgICAgICAgICA9IEdFTjZfRk9STUFUX1I4X1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SOF9TUkdCXSAgICAgICAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfUjhHOF9VTk9STV0gICAgICAgICAgID0gR0VONl9GT1JNQVRfUjhHOF9VTk9STSwKKyAgICBbVktfRk9STUFUX1I4RzhfU05PUk1dICAgICAgICAgICA9IEdFTjZfRk9STUFUX1I4RzhfU05PUk0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1VTQ0FMRURdICAgICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4X1VTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1NTQ0FMRURdICAgICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4X1NTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1VJTlRdICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4X1VJTlQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1NJTlRdICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4X1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4X1NSR0JdICAgICAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfUjhHOEI4X1VOT1JNXSAgICAgICAgID0gR0VONl9GT1JNQVRfUjhHOEI4X1VOT1JNLAorICAgIFtWS19GT1JNQVRfUjhHOEI4X1NOT1JNXSAgICAgICAgID0gR0VONl9GT1JNQVRfUjhHOEI4X1NOT1JNLAorICAgIFtWS19GT1JNQVRfUjhHOEI4X1VTQ0FMRURdICAgICAgID0gR0VONl9GT1JNQVRfUjhHOEI4X1VTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfU1NDQUxFRF0gICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4QjhfU1NDQUxFRCwKKyAgICBbVktfRk9STUFUX1I4RzhCOF9VSU5UXSAgICAgICAgICA9IEdFTjZfRk9STUFUX1I4RzhCOF9VSU5ULAorICAgIFtWS19GT1JNQVRfUjhHOEI4X1NJTlRdICAgICAgICAgID0gR0VONl9GT1JNQVRfUjhHOEI4X1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhfU1JHQl0gICAgICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4QjhfVU5PUk1fU1JHQiwKKyAgICBbVktfRk9STUFUX0I4RzhSOF9VTk9STV0gICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhfU05PUk1dICAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQjhHOFI4X1VTQ0FMRURdICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0I4RzhSOF9TU0NBTEVEXSAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhfVUlOVF0gICAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQjhHOFI4X1NJTlRdICAgICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0I4RzhSOF9TUkdCXSAgICAgICAgICA9IEdFTjZfRk9STUFUX0I1RzZSNV9VTk9STV9TUkdCLAorICAgIFtWS19GT1JNQVRfUjhHOEI4QThfVU5PUk1dICAgICAgID0gR0VONl9GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhBOF9TTk9STV0gICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4QjhBOF9TTk9STSwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1VTQ0FMRURdICAgICA9IEdFTjZfRk9STUFUX1I4RzhCOEE4X1VTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhBOF9TU0NBTEVEXSAgICAgPSBHRU42X0ZPUk1BVF9SOEc4QjhBOF9TU0NBTEVELAorICAgIFtWS19GT1JNQVRfUjhHOEI4QThfVUlOVF0gICAgICAgID0gR0VONl9GT1JNQVRfUjhHOEI4QThfVUlOVCwKKyAgICBbVktfRk9STUFUX1I4RzhCOEE4X1NJTlRdICAgICAgICA9IEdFTjZfRk9STUFUX1I4RzhCOEE4X1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SOEc4QjhBOF9TUkdCXSAgICAgICAgPSBHRU42X0ZPUk1BVF9SOEc4QjhBOF9VTk9STV9TUkdCLAorICAgIFtWS19GT1JNQVRfQjhHOFI4QThfVU5PUk1dICAgICAgID0gR0VONl9GT1JNQVRfQjhHOFI4QThfVU5PUk0sCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhBOF9TTk9STV0gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQjhHOFI4QThfVVNDQUxFRF0gICAgID0gMCwKKyAgICBbVktfRk9STUFUX0I4RzhSOEE4X1NTQ0FMRURdICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9COEc4UjhBOF9VSU5UXSAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQjhHOFI4QThfU0lOVF0gICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0I4RzhSOEE4X1NSR0JdICAgICAgICA9IEdFTjZfRk9STUFUX0I4RzhSOEE4X1VOT1JNX1NSR0IsCisgICAgW1ZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzJdICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0E4QjhHOFI4X1NOT1JNX1BBQ0szMl0gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfVVNDQUxFRF9QQUNLMzJdICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BOEI4RzhSOF9TU0NBTEVEX1BBQ0szMl0gICAgID0gMCwKKyAgICBbVktfRk9STUFUX0E4QjhHOFI4X1VJTlRfUEFDSzMyXSAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQThCOEc4UjhfU0lOVF9QQUNLMzJdICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BOEI4RzhSOF9TUkdCX1BBQ0szMl0gICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0EyUjEwRzEwQjEwX1VOT1JNX1BBQ0szMl0gICAgPSBHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9VTk9STSwKKyAgICBbVktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMl0gICAgPSBHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9TTk9STSwKKyAgICBbVktfRk9STUFUX0EyUjEwRzEwQjEwX1VTQ0FMRURfUEFDSzMyXSAgPSBHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9VU0NBTEVELAorICAgIFtWS19GT1JNQVRfQTJSMTBHMTBCMTBfU1NDQUxFRF9QQUNLMzJdICA9IEdFTjZfRk9STUFUX0IxMEcxMFIxMEEyX1NTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VSU5UX1BBQ0szMl0gICAgID0gR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfVUlOVCwKKyAgICBbVktfRk9STUFUX0EyUjEwRzEwQjEwX1NJTlRfUEFDSzMyXSAgICAgPSBHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9TSU5ULAorICAgIFtWS19GT1JNQVRfQTJCMTBHMTBSMTBfVU5PUk1fUEFDSzMyXSAgICA9IEdFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNLAorICAgIFtWS19GT1JNQVRfQTJCMTBHMTBSMTBfU05PUk1fUEFDSzMyXSAgICA9IEdFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1NOT1JNLAorICAgIFtWS19GT1JNQVRfQTJCMTBHMTBSMTBfVVNDQUxFRF9QQUNLMzJdICA9IEdFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1VTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TU0NBTEVEX1BBQ0szMl0gID0gR0VONl9GT1JNQVRfUjEwRzEwQjEwQTJfU1NDQUxFRCwKKyAgICBbVktfRk9STUFUX0EyQjEwRzEwUjEwX1VJTlRfUEFDSzMyXSAgICAgPSBHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VSU5ULAorICAgIFtWS19GT1JNQVRfQTJCMTBHMTBSMTBfU0lOVF9QQUNLMzJdICAgICA9IEdFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SMTZfVU5PUk1dICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SMTZfVU5PUk0sCisgICAgW1ZLX0ZPUk1BVF9SMTZfU05PUk1dICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SMTZfU05PUk0sCisgICAgW1ZLX0ZPUk1BVF9SMTZfVVNDQUxFRF0gICAgICAgICAgPSBHRU42X0ZPUk1BVF9SMTZfVVNDQUxFRCwKKyAgICBbVktfRk9STUFUX1IxNl9TU0NBTEVEXSAgICAgICAgICA9IEdFTjZfRk9STUFUX1IxNl9TU0NBTEVELAorICAgIFtWS19GT1JNQVRfUjE2X1VJTlRdICAgICAgICAgICAgID0gR0VONl9GT1JNQVRfUjE2X1VJTlQsCisgICAgW1ZLX0ZPUk1BVF9SMTZfU0lOVF0gICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SMTZfU0lOVCwKKyAgICBbVktfRk9STUFUX1IxNl9TRkxPQVRdICAgICAgICAgICA9IEdFTjZfRk9STUFUX1IxNl9GTE9BVCwKKyAgICBbVktfRk9STUFUX1IxNkcxNl9VTk9STV0gICAgICAgICA9IEdFTjZfRk9STUFUX1IxNkcxNl9VTk9STSwKKyAgICBbVktfRk9STUFUX1IxNkcxNl9TTk9STV0gICAgICAgICA9IEdFTjZfRk9STUFUX1IxNkcxNl9TTk9STSwKKyAgICBbVktfRk9STUFUX1IxNkcxNl9VU0NBTEVEXSAgICAgICA9IEdFTjZfRk9STUFUX1IxNkcxNl9VU0NBTEVELAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1NTQ0FMRURdICAgICAgID0gR0VONl9GT1JNQVRfUjE2RzE2X1NTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SMTZHMTZfVUlOVF0gICAgICAgICAgPSBHRU42X0ZPUk1BVF9SMTZHMTZfVUlOVCwKKyAgICBbVktfRk9STUFUX1IxNkcxNl9TSU5UXSAgICAgICAgICA9IEdFTjZfRk9STUFUX1IxNkcxNl9TSU5ULAorICAgIFtWS19GT1JNQVRfUjE2RzE2X1NGTE9BVF0gICAgICAgID0gR0VONl9GT1JNQVRfUjE2RzE2X0ZMT0FULAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1VOT1JNXSAgICAgID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2X1VOT1JNLAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNXSAgICAgID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2X1NOT1JNLAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRURdICAgID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRF0gICAgPSBHRU42X0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRCwKKyAgICBbVktfRk9STUFUX1IxNkcxNkIxNl9VSU5UXSAgICAgICA9IEdFTjZfRk9STUFUX1IxNkcxNkIxNl9VSU5ULAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2X1NJTlRdICAgICAgID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2X1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SMTZHMTZCMTZfU0ZMT0FUXSAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNXSAgID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNLAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNXSAgID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNLAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRURdID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1VTQ0FMRUQsCisgICAgW1ZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRF0gPSBHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRCwKKyAgICBbVktfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UXSAgICA9IEdFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5ULAorICAgIFtWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlRdICAgID0gR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FUXSAgPSBHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfRkxPQVQsCisgICAgW1ZLX0ZPUk1BVF9SMzJfVUlOVF0gICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SMzJfVUlOVCwKKyAgICBbVktfRk9STUFUX1IzMl9TSU5UXSAgICAgICAgICAgICA9IEdFTjZfRk9STUFUX1IzMl9TSU5ULAorICAgIFtWS19GT1JNQVRfUjMyX1NGTE9BVF0gICAgICAgICAgID0gR0VONl9GT1JNQVRfUjMyX0ZMT0FULAorICAgIFtWS19GT1JNQVRfUjMyRzMyX1VJTlRdICAgICAgICAgID0gR0VONl9GT1JNQVRfUjMyRzMyX1VJTlQsCisgICAgW1ZLX0ZPUk1BVF9SMzJHMzJfU0lOVF0gICAgICAgICAgPSBHRU42X0ZPUk1BVF9SMzJHMzJfU0lOVCwKKyAgICBbVktfRk9STUFUX1IzMkczMl9TRkxPQVRdICAgICAgICA9IEdFTjZfRk9STUFUX1IzMkczMl9GTE9BVCwKKyAgICBbVktfRk9STUFUX1IzMkczMkIzMl9VSU5UXSAgICAgICA9IEdFTjZfRk9STUFUX1IzMkczMkIzMl9VSU5ULAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlRdICAgICAgID0gR0VONl9GT1JNQVRfUjMyRzMyQjMyX1NJTlQsCisgICAgW1ZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUXSAgICAgPSBHRU42X0ZPUk1BVF9SMzJHMzJCMzJfRkxPQVQsCisgICAgW1ZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVF0gICAgPSBHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVCwKKyAgICBbVktfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5UXSAgICA9IEdFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9TSU5ULAorICAgIFtWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVF0gID0gR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX0ZMT0FULAorICAgIFtWS19GT1JNQVRfUjY0X1VJTlRdICAgICAgICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX1I2NF9TSU5UXSAgICAgICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9SNjRfU0ZMT0FUXSAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9SNjRfRkxPQVQsCisgICAgW1ZLX0ZPUk1BVF9SNjRHNjRfVUlOVF0gICAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfUjY0RzY0X1NJTlRdICAgICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX1I2NEc2NF9TRkxPQVRdICAgICAgICA9IEdFTjZfRk9STUFUX1I2NEc2NF9GTE9BVCwKKyAgICBbVktfRk9STUFUX1I2NEc2NEI2NF9VSU5UXSAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9SNjRHNjRCNjRfU0lOVF0gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0X1NGTE9BVF0gICAgID0gR0VONl9GT1JNQVRfUjY0RzY0QjY0X0ZMT0FULAorICAgIFtWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1VJTlRdICAgID0gMCwKKyAgICBbVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TSU5UXSAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfU0ZMT0FUXSAgPSBHRU42X0ZPUk1BVF9SNjRHNjRCNjRBNjRfRkxPQVQsCisgICAgW1ZLX0ZPUk1BVF9CMTBHMTFSMTFfVUZMT0FUX1BBQ0szMl0gICAgID0gR0VONl9GT1JNQVRfUjExRzExQjEwX0ZMT0FULAorICAgIFtWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMl0gICAgICA9IEdFTjZfRk9STUFUX1I5RzlCOUU1X1NIQVJFREVYUCwKKyAgICBbVktfRk9STUFUX0JDMV9SR0JfVU5PUk1fQkxPQ0tdICAgICAgICA9IEdFTjZfRk9STUFUX0RYVDFfUkdCLAorICAgIFtWS19GT1JNQVRfQkMxX1JHQl9TUkdCX0JMT0NLXSAgICAgICAgID0gR0VONl9GT1JNQVRfRFhUMV9SR0JfU1JHQiwKKyAgICBbVktfRk9STUFUX0JDMl9VTk9STV9CTE9DS10gICAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDMl9VTk9STSwKKyAgICBbVktfRk9STUFUX0JDMV9SR0JBX1VOT1JNX0JMT0NLXSAgICAgICA9IEdFTjZfRk9STUFUX0JDMV9VTk9STSwKKyAgICBbVktfRk9STUFUX0JDMV9SR0JBX1NSR0JfQkxPQ0tdICAgICAgICA9IEdFTjZfRk9STUFUX0JDMV9VTk9STV9TUkdCLAorICAgIFtWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0tdICAgICAgICAgICAgID0gR0VONl9GT1JNQVRfQkMyX1VOT1JNX1NSR0IsCisgICAgW1ZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0tdICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9CQzNfVU5PUk0sCisgICAgW1ZLX0ZPUk1BVF9CQzNfU1JHQl9CTE9DS10gICAgICAgICAgICAgPSBHRU42X0ZPUk1BVF9CQzNfVU5PUk1fU1JHQiwKKyAgICBbVktfRk9STUFUX0JDNF9VTk9STV9CTE9DS10gICAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDNF9VTk9STSwKKyAgICBbVktfRk9STUFUX0JDNF9TTk9STV9CTE9DS10gICAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDNF9TTk9STSwKKyAgICBbVktfRk9STUFUX0JDNV9VTk9STV9CTE9DS10gICAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDNV9VTk9STSwKKyAgICBbVktfRk9STUFUX0JDNV9TTk9STV9CTE9DS10gICAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDNV9TTk9STSwKKyAgICBbVktfRk9STUFUX0JDNkhfVUZMT0FUX0JMT0NLXSAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDNkhfVUYxNiwKKyAgICBbVktfRk9STUFUX0JDNkhfU0ZMT0FUX0JMT0NLXSAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDNkhfU0YxNiwKKyAgICBbVktfRk9STUFUX0JDN19VTk9STV9CTE9DS10gICAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDN19VTk9STSwKKyAgICBbVktfRk9STUFUX0JDN19TUkdCX0JMT0NLXSAgICAgICAgICAgICA9IEdFTjZfRk9STUFUX0JDN19VTk9STV9TUkdCLAorICAgIC8qIFRPRE86IEltcGxlbWVudCBmb3IgcmVtYWluaW5nIGNvbXByZXNzZWQgZm9ybWF0cy4gKi8KKyAgICBbVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLXSAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1VOT1JNX0JMT0NLXSAgPSAwLAorICAgIFtWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9VTk9STV9CTE9DS10gID0gMCwKKyAgICBbVktfRk9STUFUX0VBQ19SMTFfVU5PUk1fQkxPQ0tdICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9FQUNfUjExX1NOT1JNX0JMT0NLXSAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfRUFDX1IxMUcxMV9VTk9STV9CTE9DS10gICAgID0gMCwKKyAgICBbVktfRk9STUFUX0VBQ19SMTFHMTFfU05PUk1fQkxPQ0tdICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzR4NF9VTk9STV9CTE9DS10gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DS10gICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLXSAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzV4NF9TUkdCX0JMT0NLXSAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ181eDVfVU5PUk1fQkxPQ0tdICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfNXg1X1NSR0JfQkxPQ0tdICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzZ4NV9VTk9STV9CTE9DS10gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DS10gICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLXSAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzZ4Nl9TUkdCX0JMT0NLXSAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ184eDVfVU5PUk1fQkxPQ0tdICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfOHg1X1NSR0JfQkxPQ0tdICAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzh4Nl9VTk9STV9CTE9DS10gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DS10gICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLXSAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzh4OF9TUkdCX0JMT0NLXSAgICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ18xMHg1X1VOT1JNX0JMT0NLXSAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLXSAgICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEweDZfVU5PUk1fQkxPQ0tdICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ18xMHg2X1NSR0JfQkxPQ0tdICAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfMTB4OF9VTk9STV9CTE9DS10gICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DS10gICAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ18xMHgxMF9VTk9STV9CTE9DS10gICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfMTB4MTBfU1JHQl9CTE9DS10gICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEyeDEwX1VOT1JNX0JMT0NLXSAgICAgPSAwLAorICAgIFtWS19GT1JNQVRfQVNUQ18xMngxMF9TUkdCX0JMT0NLXSAgICAgID0gMCwKKyAgICBbVktfRk9STUFUX0FTVENfMTJ4MTJfVU5PUk1fQkxPQ0tdICAgICA9IDAsCisgICAgW1ZLX0ZPUk1BVF9BU1RDXzEyeDEyX1NSR0JfQkxPQ0tdICAgICAgPSAwLAorfTsKKworaW50IGludGVsX2Zvcm1hdF90cmFuc2xhdGVfY29sb3IoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZm9ybWF0KQoreworICAgIGludCBmbXQ7CisKKyAgICBhc3NlcnQoIWljZF9mb3JtYXRfaXNfdW5kZWYoZm9ybWF0KSk7CisgICAgYXNzZXJ0KCFpY2RfZm9ybWF0X2lzX2RzKGZvcm1hdCkpOworCisgICAgZm10ID0gaW50ZWxfY29sb3JfbWFwcGluZ1tmb3JtYXRdOworICAgIC8qIFRPRE86IEltcGxlbWVudCBmb3IgcmVtYWluaW5nIGNvbXByZXNzZWQgZm9ybWF0cy4gKi8KKworICAgIC8qIEdFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9GTE9BVCBoYXBwZW5zIHRvIGJlIDAgKi8KKyAgICBpZiAoZm9ybWF0ID09IFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0ZMT0FUKQorICAgICAgICBhc3NlcnQoZm10ID09IDApOworICAgIGVsc2UgaWYgKCFmbXQpCisgICAgICAgIGZtdCA9IC0xOworCisgICAgcmV0dXJuIGZtdDsKK30KKworc3RhdGljIFZrRmxhZ3MgaW50ZWxfZm9ybWF0X2dldF9jb2xvcl9mZWF0dXJlcyhjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZm9ybWF0KQoreworICAgIGNvbnN0IGludCBmbXQgPSBpbnRlbF9mb3JtYXRfdHJhbnNsYXRlX2NvbG9yKGdwdSwgZm9ybWF0KTsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfdmZfY2FwICp2ZjsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfc2FtcGxlcl9jYXAgKnNhbXBsZXI7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2RwX2NhcCAqZHA7CisgICAgVmtGbGFncyBmZWF0dXJlczsKKworICAgIGlmIChmbXQgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNhbXBsZXIgPSAoZm10IDwgQVJSQVlfU0laRShpbnRlbF9zYW1wbGVyX2NhcHMpKSA/CisgICAgICAgICZpbnRlbF9zYW1wbGVyX2NhcHNbZm10XSA6IE5VTEw7CisgICAgdmYgPSAoZm10IDwgQVJSQVlfU0laRShpbnRlbF92Zl9jYXBzKSkgPyAgJmludGVsX3ZmX2NhcHNbZm10XSA6IE5VTEw7CisgICAgZHAgPSAoZm10IDwgQVJSQVlfU0laRShpbnRlbF9kcF9jYXBzKSkgPyAgJmludGVsX2RwX2NhcHNbZm10XSA6IE5VTEw7CisKKyAgICBmZWF0dXJlcyA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NUT1JBR0VfSU1BR0VfQklUOworCisjZGVmaW5lIFRFU1QoZ3B1LCBmdW5jLCBjYXApICgoZnVuYykgJiYgKGZ1bmMpLT5jYXAgJiYgXAorICAgICAgICBpbnRlbF9ncHVfZ2VuKGdwdSkgPj0gKGZ1bmMpLT5jYXApCisgICAgaWYgKFRFU1QoZ3B1LCB2ZiwgdmVydGV4X2VsZW1lbnQpKSB7CisgICAgICAgIC8qIG5vIGZlYXR1cmUgYml0IHRvIHNldCAqLworICAgIH0KKworICAgIGlmIChURVNUKGdwdSwgc2FtcGxlciwgc2FtcGxpbmcpKSB7CisgICAgICAgIGlmIChpY2RfZm9ybWF0X2lzX2ludChmb3JtYXQpIHx8CisgICAgICAgICAgICBURVNUKGdwdSwgc2FtcGxlciwgZmlsdGVyaW5nKSkKKyAgICAgICAgICAgIGZlYXR1cmVzIHw9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDsKKyAgICB9CisKKyAgICBpZiAoVEVTVChncHUsIGRwLCB0eXBlZF93cml0ZSkpCisgICAgICAgIGZlYXR1cmVzIHw9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUIHwgVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9GSUxURVJfTElORUFSX0JJVDsKKworICAgIGlmIChURVNUKGdwdSwgZHAsIHJ0X3dyaXRlKSkgeworICAgICAgICBmZWF0dXJlcyB8PSBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVDsKKworICAgICAgICBpZiAoVEVTVChncHUsIGRwLCBydF93cml0ZV9ibGVuZGluZykpCisgICAgICAgICAgICBmZWF0dXJlcyB8PSBWS19GT1JNQVRfRkVBVFVSRV9DT0xPUl9BVFRBQ0hNRU5UX0JMRU5EX0JJVDsKKworICAgICAgICBpZiAoZmVhdHVyZXMgJiBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0JJVCkgeworICAgICAgICAgICAgZmVhdHVyZXMgfD0gVktfRk9STUFUX0ZFQVRVUkVfU0FNUExFRF9JTUFHRV9CSVQgfCBWS19GT1JNQVRfRkVBVFVSRV9TQU1QTEVEX0lNQUdFX0ZJTFRFUl9MSU5FQVJfQklUOworICAgICAgICB9CisgICAgfQorI3VuZGVmIFRFU1QKKworICAgIHJldHVybiBmZWF0dXJlczsKK30KKworc3RhdGljIFZrRmxhZ3MgaW50ZWxfZm9ybWF0X2dldF9kc19mZWF0dXJlcyhjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZm9ybWF0KQoreworICAgIFZrRmxhZ3MgZmVhdHVyZXM7CisKKyAgICBhc3NlcnQoaWNkX2Zvcm1hdF9pc19kcyhmb3JtYXQpKTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfUzhfVUlOVDoKKyAgICAgICAgZmVhdHVyZXMgPSBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUOzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19GT1JNQVRfRDE2X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVDoKKyAgICAgICAgZmVhdHVyZXMgPSBWS19GT1JNQVRfRkVBVFVSRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk1fUzhfVUlOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQ6CisgICAgICAgIGZlYXR1cmVzID0gVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCB8CisgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmVhdHVyZXMgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmVhdHVyZXM7Cit9CisKK3N0YXRpYyBWa0ZsYWdzIGludGVsX2Zvcm1hdF9nZXRfcmF3X2ZlYXR1cmVzKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZm9ybWF0KQoreworICAgIHJldHVybiAoZm9ybWF0ID09IFZLX0ZPUk1BVF9VTkRFRklORUQpID8KKyAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9JTUFHRV9CSVQgOiAwOworfQorCisvLyBUaGVzZSBmb3JtYXQgZmVhdHVyZXMgZmxhZ3MgYXJlIHN1cHBvcnRlZCBieSBidWZmZXJzLiAgUmVtYWluaW5nIGZsYWdzCisvLyBhcmUgc3VwcG9ydGVkIGJ5IG9wdGltYWwvbGluZWFyIHRpbGluZyBpbWFnZXMuCitzdGF0aWMgVmtGbGFncyBidWZmZXJGb3JtYXRzRmxhZ01hc2sgPSAgVktfRk9STUFUX0ZFQVRVUkVfVU5JRk9STV9URVhFTF9CVUZGRVJfQklUICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQklUICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfU1RPUkFHRV9URVhFTF9CVUZGRVJfQVRPTUlDX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfVkVSVEVYX0JVRkZFUl9CSVQ7CisKK3N0YXRpYyB2b2lkIGludGVsX2Zvcm1hdF9nZXRfcHJvcHMoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0UHJvcGVydGllcyAqcHJvcHMpCit7CisgICAgaWYgKGljZF9mb3JtYXRfaXNfdW5kZWYoZm9ybWF0KSkgeworICAgICAgICBwcm9wcy0+bGluZWFyVGlsaW5nRmVhdHVyZXMgID0gaW50ZWxfZm9ybWF0X2dldF9yYXdfZmVhdHVyZXMoZ3B1LCBmb3JtYXQpOworICAgICAgICBwcm9wcy0+b3B0aW1hbFRpbGluZ0ZlYXR1cmVzID0gMDsKKyAgICAgICAgcHJvcHMtPmJ1ZmZlckZlYXR1cmVzICAgICAgICA9IDA7CisgICAgfSBlbHNlIGlmKGljZF9mb3JtYXRfaXNfY29sb3IoZm9ybWF0KSkgeworICAgICAgICBWa0ZsYWdzIGZvcm1hdEZsYWdzID0gMDsKKyAgICAgICAgZm9ybWF0RmxhZ3MgPSBpbnRlbF9mb3JtYXRfZ2V0X2NvbG9yX2ZlYXR1cmVzKGdwdSwgZm9ybWF0KTsKKyAgICAgICAgcHJvcHMtPmxpbmVhclRpbGluZ0ZlYXR1cmVzICA9IGZvcm1hdEZsYWdzICYgfmJ1ZmZlckZvcm1hdHNGbGFnTWFzazsKKyAgICAgICAgcHJvcHMtPm9wdGltYWxUaWxpbmdGZWF0dXJlcyA9IGZvcm1hdEZsYWdzICYgfmJ1ZmZlckZvcm1hdHNGbGFnTWFzazsKKyAgICAgICAgcHJvcHMtPmJ1ZmZlckZlYXR1cmVzICAgICAgICA9IGZvcm1hdEZsYWdzICYgIGJ1ZmZlckZvcm1hdHNGbGFnTWFzazsKKyAgICB9IGVsc2UgaWYoaWNkX2Zvcm1hdF9pc19kcyhmb3JtYXQpKSB7CisgICAgICAgIHByb3BzLT5saW5lYXJUaWxpbmdGZWF0dXJlcyAgPSAwOworICAgICAgICBwcm9wcy0+b3B0aW1hbFRpbGluZ0ZlYXR1cmVzID0gaW50ZWxfZm9ybWF0X2dldF9kc19mZWF0dXJlcyhncHUsIGZvcm1hdCk7CisgICAgICAgIHByb3BzLT5idWZmZXJGZWF0dXJlcyAgICAgICAgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHByb3BzLT5saW5lYXJUaWxpbmdGZWF0dXJlcyAgPSAwOworICAgICAgICBwcm9wcy0+b3B0aW1hbFRpbGluZ0ZlYXR1cmVzID0gMDsKKyAgICAgICAgcHJvcHMtPmJ1ZmZlckZlYXR1cmVzICAgICAgICA9IDA7CisgICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdEluZm8pCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1ID0gaW50ZWxfZ3B1KHBoeXNpY2FsRGV2aWNlKTsKKworICAgIGludGVsX2Zvcm1hdF9nZXRfcHJvcHMoZ3B1LCBmb3JtYXQsIHBGb3JtYXRJbmZvKTsKK30KKworLy8gRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSAxIHBhcnQgMSwgcGFnZSAxMDU6CisvLworLy8gICAgICJJbiBhZGRpdGlvbiB0byByZXN0cmljdGlvbnMgb24gbWF4aW11bSBoZWlnaHQsIHdpZHRoLCBhbmQgZGVwdGgsCisvLyAgICAgIHN1cmZhY2VzIGFyZSBhbHNvIHJlc3RyaWN0ZWQgdG8gYSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMuIFRoaXMKKy8vICAgICAgbWF4aW11bSBpcyAyIEdCIGZvciBhbGwgcHJvZHVjdHMgYW5kIGFsbCBzdXJmYWNlIHR5cGVzLiIKK3N0YXRpYyBjb25zdCBzaXplX3QgaW50ZWxfbWF4X3Jlc291cmNlX3NpemUgPSAxdSA8PCAzMTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBtZW1zZXQocEltYWdlRm9ybWF0UHJvcGVydGllcywgMCwgc2l6ZW9mKCpwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKSk7CisKKyAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3Igc3BlY2lmaWMgZm9ybWF0cy4gRm9yIG5vdywgcmVwZWF0IGluZm8gZnJvbQorICAgIC8vICAgICAgIGxpbWl0cyBpbiBncHUuYyBmb3IgQUxMIGZvcm1hdHMKKyAgICAvLyBGb3JtYXQtc3BlY2lmaWMgdmFsdWVzIGNhbiBiZSBhIHN1cGVyc2V0IG9mIHJldHVybmVkIERldmljZUxpbWl0cworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heEV4dGVudC53aWR0aCAgPSA4MTkyOworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heEV4dGVudC5oZWlnaHQgPSA4MTkyOworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heEV4dGVudC5kZXB0aCAgPSA4MTkyOworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heEFycmF5TGF5ZXJzICAgPSAyMDQ4OworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heE1pcExldmVscwkgPSAxNDsKKyAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLT5tYXhBcnJheUxheWVycyAgID0gMjA0ODsKKyAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLT5zYW1wbGVDb3VudHMJID0gVktfU0FNUExFX0NPVU5UXzFfQklUIHwgVktfU0FNUExFX0NPVU5UXzJfQklUIHwgVktfU0FNUExFX0NPVU5UXzRfQklUIHwgVktfU0FNUExFX0NPVU5UXzhfQklUOworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heFJlc291cmNlU2l6ZSAgPSBpbnRlbF9tYXhfcmVzb3VyY2Vfc2l6ZTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2Zvcm1hdC5oIGIvaWNkL2ludGVsL2Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Y2FhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZm9ybWF0LmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBKZXJlbXkgSGF5ZXMgPGplcmVteUBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIEZPUk1BVF9ICisjZGVmaW5lIEZPUk1BVF9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorCitzdHJ1Y3QgaW50ZWxfZ3B1OworCitzdGF0aWMgaW5saW5lIGJvb2wgaW50ZWxfZm9ybWF0X2hhc19kZXB0aChjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQpCit7CisgICAgYm9vbCBoYXNfZGVwdGggPSBmYWxzZTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBWS19GT1JNQVRfRDE2X1VOT1JNOgorICAgIGNhc2UgVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzI6CisgICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVDoKKyAgICAvKiBWS19GT1JNQVRfRDE2X1VOT1JNX1M4X1VJTlQgaXMgdW5zdXBwb3J0ZWQgKi8KKyAgICBjYXNlIFZLX0ZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVDoKKyAgICBjYXNlIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQ6CisgICAgICAgIGhhc19kZXB0aCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBoYXNfZGVwdGg7Cit9CisKK2ludCBpbnRlbF9mb3JtYXRfdHJhbnNsYXRlX2NvbG9yKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCk7CisKKyNlbmRpZiAvKiBGT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2dlbmh3L2dlbl9ibGl0dGVyLnhtbC5oIGIvaWNkL2ludGVsL2dlbmh3L2dlbl9ibGl0dGVyLnhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNThlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX2JsaXR0ZXIueG1sLmgKQEAgLTAsMCArMSwxMjkgQEAKKyNpZm5kZWYgR0VOX0JMSVRURVJfWE1MCisjZGVmaW5lIEdFTl9CTElUVEVSX1hNTAorCisvKiBBdXRvZ2VuZXJhdGVkIGZpbGUsIERPIE5PVCBFRElUIG1hbnVhbGx5IQorCitUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgcnVsZXMtbmctbmcgaGVhZGVyZ2VuIHRvb2wgaW4gdGhpcyBnaXQgcmVwb3NpdG9yeToKK2h0dHBzOi8vZ2l0aHViLmNvbS9vbHZhZmZlL2Vudnl0b29scy8KK2dpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vb2x2YWZmZS9lbnZ5dG9vbHMuZ2l0CisKK0NvcHlyaWdodCAoQykgMjAxNC0yMDE1IGJ5IHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKy0gQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4gKG9sdikKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKworI2RlZmluZSBHRU42X0JMSVRURVJfVFlQRV9fTUFTSwkJCQkJMHhlMDAwMDAwMAorI2RlZmluZSBHRU42X0JMSVRURVJfVFlQRV9fU0hJRlQJCQkJMjkKKyNkZWZpbmUgR0VONl9CTElUVEVSX1RZUEVfQkxJVFRFUgkJCQkoMHgyIDw8IDI5KQorI2RlZmluZSBHRU42X0JMSVRURVJfT1BDT0RFX19NQVNLCQkJCTB4MWZjMDAwMDAKKyNkZWZpbmUgR0VONl9CTElUVEVSX09QQ09ERV9fU0hJRlQJCQkJMjIKKyNkZWZpbmUgR0VONl9CTElUVEVSX09QQ09ERV9DT0xPUl9CTFQJCQkJKDB4NDAgPDwgMjIpCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9PUENPREVfU1JDX0NPUFlfQkxUCQkJKDB4NDMgPDwgMjIpCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9PUENPREVfWFlfQ09MT1JfQkxUCQkJKDB4NTAgPDwgMjIpCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9PUENPREVfWFlfU1JDX0NPUFlfQkxUCQkJKDB4NTMgPDwgMjIpCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9CUjAwX1dSSVRFX0EJCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMDBfV1JJVEVfUkdCCQkJCSgweDEgPDwgMjApCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9CUjAwX1NSQ19USUxFRAkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBHRU42X0JMSVRURVJfQlIwMF9EU1RfVElMRUQJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgR0VONl9CTElUVEVSX0xFTkdUSF9fTUFTSwkJCQkweDAwMDAwMDNmCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9MRU5HVEhfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTNfRElSX1JUTAkJCQkoMHgxIDw8IDMwKQorI2RlZmluZSBHRU42X0JMSVRURVJfQlIxM19DTElQX0VOQUJMRQkJCQkoMHgxIDw8IDMwKQorI2RlZmluZSBHRU42X0JMSVRURVJfQlIxM19GT1JNQVRfX01BU0sJCQkJMHgwMzAwMDAwMAorI2RlZmluZSBHRU42X0JMSVRURVJfQlIxM19GT1JNQVRfX1NISUZUCQkJCTI0CisjZGVmaW5lIEdFTjZfQkxJVFRFUl9CUjEzX0ZPUk1BVF84CQkJCSgweDAgPDwgMjQpCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9CUjEzX0ZPUk1BVF81NjUJCQkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTNfRk9STUFUXzE1NTUJCQkJKDB4MiA8PCAyNCkKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTNfRk9STUFUXzg4ODgJCQkJKDB4MyA8PCAyNCkKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTNfUk9QX19NQVNLCQkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTNfUk9QX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIxM19ST1BfU1JDQ09QWQkJCQkoMHhjYyA8PCAxNikKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTNfUk9QX1BBVENPUFkJCQkJKDB4ZjAgPDwgMTYpCisjZGVmaW5lIEdFTjZfQkxJVFRFUl9CUjEzX0RTVF9QSVRDSF9fTUFTSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTNfRFNUX1BJVENIX19TSElGVAkJCTAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTFfU1JDX1BJVENIX19NQVNLCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIxMV9TUkNfUElUQ0hfX1NISUZUCQkJMAorI2RlZmluZSBHRU42X0JMSVRURVJfQlIxNF9EU1RfSEVJR0hUX19NQVNLCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU42X0JMSVRURVJfQlIxNF9EU1RfSEVJR0hUX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjZfQkxJVFRFUl9CUjE0X0RTVF9XSURUSF9fTUFTSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMTRfRFNUX1dJRFRIX19TSElGVAkJCTAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMjJfRFNUX1kxX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMjJfRFNUX1kxX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIyMl9EU1RfWDFfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIyMl9EU1RfWDFfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMjNfRFNUX1kyX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMjNfRFNUX1kyX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIyM19EU1RfWDJfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIyM19EU1RfWDJfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMjZfU1JDX1kxX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9CTElUVEVSX0JSMjZfU1JDX1kxX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIyNl9TUkNfWDFfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X0JMSVRURVJfQlIyNl9TUkNfWDFfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9DT0xPUl9CTFRfX1NJWkUJCQkJCTYKKworCisKKworCisKKworCisjZGVmaW5lIEdFTjZfU1JDX0NPUFlfQkxUX19TSVpFCQkJCQk4CisKKworCisKKworCisKKworCisKKworI2RlZmluZSBHRU42X1hZX0NPTE9SX0JMVF9fU0laRQkJCQkJNworCisKKworCisKKworCisKKworI2RlZmluZSBHRU42X1hZX1NSQ19DT1BZX0JMVF9fU0laRQkJCQkxMAorCisKKworCisKKworCisKKworCisKKworCisKKworI2VuZGlmIC8qIEdFTl9CTElUVEVSX1hNTCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2dlbmh3L2dlbl9ldV9pc2EueG1sLmggYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX2V1X2lzYS54bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTFmYTVmCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2dlbmh3L2dlbl9ldV9pc2EueG1sLmgKQEAgLTAsMCArMSw1NjMgQEAKKyNpZm5kZWYgR0VOX0VVX0lTQV9YTUwKKyNkZWZpbmUgR0VOX0VVX0lTQV9YTUwKKworLyogQXV0b2dlbmVyYXRlZCBmaWxlLCBETyBOT1QgRURJVCBtYW51YWxseSEKKworVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHJ1bGVzLW5nLW5nIGhlYWRlcmdlbiB0b29sIGluIHRoaXMgZ2l0IHJlcG9zaXRvcnk6CitodHRwczovL2dpdGh1Yi5jb20vb2x2YWZmZS9lbnZ5dG9vbHMvCitnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL29sdmFmZmUvZW52eXRvb2xzLmdpdAorCitDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CistIENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+IChvbHYpCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKK3BvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqLworCisKK2VudW0gZ2VuX2V1X29wY29kZSB7CisgICAgR0VONl9PUENPREVfSUxMRUdBTAkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9PUENPREVfTU9WCQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X09QQ09ERV9TRUwJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfT1BDT0RFX01PVkkJCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfT1BDT0RFX05PVAkJCQkJICAgICAgPSAweDQsCisgICAgR0VONl9PUENPREVfQU5ECQkJCQkgICAgICA9IDB4NSwKKyAgICBHRU42X09QQ09ERV9PUgkJCQkJICAgICAgPSAweDYsCisgICAgR0VONl9PUENPREVfWE9SCQkJCQkgICAgICA9IDB4NywKKyAgICBHRU42X09QQ09ERV9TSFIJCQkJCSAgICAgID0gMHg4LAorICAgIEdFTjZfT1BDT0RFX1NITAkJCQkJICAgICAgPSAweDksCisgICAgR0VONl9PUENPREVfRElNCQkJCQkgICAgICA9IDB4YSwKKyAgICBHRU42X09QQ09ERV9BU1IJCQkJCSAgICAgID0gMHhjLAorICAgIEdFTjZfT1BDT0RFX0NNUAkJCQkJICAgICAgPSAweDEwLAorICAgIEdFTjZfT1BDT0RFX0NNUE4JCQkJCSAgICAgID0gMHgxMSwKKyAgICBHRU43X09QQ09ERV9DU0VMCQkJCQkgICAgICA9IDB4MTIsCisgICAgR0VON19PUENPREVfRjMyVE8xNgkJCQkJICAgICAgPSAweDEzLAorICAgIEdFTjdfT1BDT0RFX0YxNlRPMzIJCQkJCSAgICAgID0gMHgxNCwKKyAgICBHRU43X09QQ09ERV9CRlJFVgkJCQkJICAgICAgPSAweDE3LAorICAgIEdFTjdfT1BDT0RFX0JGRQkJCQkJICAgICAgPSAweDE4LAorICAgIEdFTjdfT1BDT0RFX0JGSTEJCQkJCSAgICAgID0gMHgxOSwKKyAgICBHRU43X09QQ09ERV9CRkkyCQkJCQkgICAgICA9IDB4MWEsCisgICAgR0VONl9PUENPREVfSk1QSQkJCQkJICAgICAgPSAweDIwLAorICAgIEdFTjdfT1BDT0RFX0JSRAkJCQkJICAgICAgPSAweDIxLAorICAgIEdFTjZfT1BDT0RFX0lGCQkJCQkgICAgICA9IDB4MjIsCisgICAgR0VON19PUENPREVfQlJDCQkJCQkgICAgICA9IDB4MjMsCisgICAgR0VONl9PUENPREVfRUxTRQkJCQkJICAgICAgPSAweDI0LAorICAgIEdFTjZfT1BDT0RFX0VORElGCQkJCQkgICAgICA9IDB4MjUsCisgICAgR0VONl9PUENPREVfQ0FTRQkJCQkJICAgICAgPSAweDI2LAorICAgIEdFTjZfT1BDT0RFX1dISUxFCQkJCQkgICAgICA9IDB4MjcsCisgICAgR0VONl9PUENPREVfQlJFQUsJCQkJCSAgICAgID0gMHgyOCwKKyAgICBHRU42X09QQ09ERV9DT05UCQkJCQkgICAgICA9IDB4MjksCisgICAgR0VONl9PUENPREVfSEFMVAkJCQkJICAgICAgPSAweDJhLAorICAgIEdFTjc1X09QQ09ERV9DQUxMQQkJCQkJICAgICAgPSAweDJiLAorICAgIEdFTjZfT1BDT0RFX0NBTEwJCQkJCSAgICAgID0gMHgyYywKKyAgICBHRU42X09QQ09ERV9SRVRVUk4JCQkJCSAgICAgID0gMHgyZCwKKyAgICBHRU44X09QQ09ERV9HT1RPCQkJCQkgICAgICA9IDB4MmUsCisgICAgR0VONl9PUENPREVfV0FJVAkJCQkJICAgICAgPSAweDMwLAorICAgIEdFTjZfT1BDT0RFX1NFTkQJCQkJCSAgICAgID0gMHgzMSwKKyAgICBHRU42X09QQ09ERV9TRU5EQwkJCQkJICAgICAgPSAweDMyLAorICAgIEdFTjZfT1BDT0RFX01BVEgJCQkJCSAgICAgID0gMHgzOCwKKyAgICBHRU42X09QQ09ERV9BREQJCQkJCSAgICAgID0gMHg0MCwKKyAgICBHRU42X09QQ09ERV9NVUwJCQkJCSAgICAgID0gMHg0MSwKKyAgICBHRU42X09QQ09ERV9BVkcJCQkJCSAgICAgID0gMHg0MiwKKyAgICBHRU42X09QQ09ERV9GUkMJCQkJCSAgICAgID0gMHg0MywKKyAgICBHRU42X09QQ09ERV9STkRVCQkJCQkgICAgICA9IDB4NDQsCisgICAgR0VONl9PUENPREVfUk5ERAkJCQkJICAgICAgPSAweDQ1LAorICAgIEdFTjZfT1BDT0RFX1JOREUJCQkJCSAgICAgID0gMHg0NiwKKyAgICBHRU42X09QQ09ERV9STkRaCQkJCQkgICAgICA9IDB4NDcsCisgICAgR0VONl9PUENPREVfTUFDCQkJCQkgICAgICA9IDB4NDgsCisgICAgR0VONl9PUENPREVfTUFDSAkJCQkJICAgICAgPSAweDQ5LAorICAgIEdFTjZfT1BDT0RFX0xaRAkJCQkJICAgICAgPSAweDRhLAorICAgIEdFTjdfT1BDT0RFX0ZCSAkJCQkJICAgICAgPSAweDRiLAorICAgIEdFTjdfT1BDT0RFX0ZCTAkJCQkJICAgICAgPSAweDRjLAorICAgIEdFTjdfT1BDT0RFX0NCSVQJCQkJCSAgICAgID0gMHg0ZCwKKyAgICBHRU43X09QQ09ERV9BRERDCQkJCQkgICAgICA9IDB4NGUsCisgICAgR0VON19PUENPREVfU1VCQgkJCQkJICAgICAgPSAweDRmLAorICAgIEdFTjZfT1BDT0RFX1NBRDIJCQkJCSAgICAgID0gMHg1MCwKKyAgICBHRU42X09QQ09ERV9TQURBMgkJCQkJICAgICAgPSAweDUxLAorICAgIEdFTjZfT1BDT0RFX0RQNAkJCQkJICAgICAgPSAweDU0LAorICAgIEdFTjZfT1BDT0RFX0RQSAkJCQkJICAgICAgPSAweDU1LAorICAgIEdFTjZfT1BDT0RFX0RQMwkJCQkJICAgICAgPSAweDU2LAorICAgIEdFTjZfT1BDT0RFX0RQMgkJCQkJICAgICAgPSAweDU3LAorICAgIEdFTjZfT1BDT0RFX0xJTkUJCQkJCSAgICAgID0gMHg1OSwKKyAgICBHRU42X09QQ09ERV9QTE4JCQkJCSAgICAgID0gMHg1YSwKKyAgICBHRU42X09QQ09ERV9NQUQJCQkJCSAgICAgID0gMHg1YiwKKyAgICBHRU42X09QQ09ERV9MUlAJCQkJCSAgICAgID0gMHg1YywKKyAgICBHRU42X09QQ09ERV9OT1AJCQkJCSAgICAgID0gMHg3ZSwKK307CisKK2VudW0gZ2VuX2V1X2FjY2Vzc19tb2RlIHsKKyAgICBHRU42X0FMSUdOXzEJCQkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfQUxJR05fMTYJCQkJCSAgICAgID0gMHgxLAorfTsKKworZW51bSBnZW5fZXVfbWFza19jb250cm9sIHsKKyAgICBHRU42X01BU0tDVFJMX05PUk1BTAkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X01BU0tDVFJMX05PTUFTSwkJCQkgICAgICA9IDB4MSwKK307CisKK2VudW0gZ2VuX2V1X2RlcGVuZGVuY3lfY29udHJvbCB7CisgICAgR0VONl9ERVBDVFJMX05PUk1BTAkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9ERVBDVFJMX05PRERDTFIJCQkJICAgICAgPSAweDEsCisgICAgR0VONl9ERVBDVFJMX05PRERDSEsJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9ERVBDVFJMX05FSVRIRVIJCQkJICAgICAgPSAweDMsCit9OworCitlbnVtIGdlbl9ldV9xdWFydGVyX2NvbnRyb2wgeworICAgIEdFTjZfUVRSQ1RSTF8xUQkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9RVFJDVFJMXzJRCQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X1FUUkNUUkxfM1EJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfUVRSQ1RSTF80UQkJCQkJICAgICAgPSAweDMsCisgICAgR0VONl9RVFJDVFJMXzFICQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X1FUUkNUUkxfMkgJCQkJCSAgICAgID0gMHgyLAorfTsKKworZW51bSBnZW5fZXVfdGhyZWFkX2NvbnRyb2wgeworICAgIEdFTjZfVEhSRUFEQ1RSTF9OT1JNQUwJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9USFJFQURDVFJMX0FUT01JQwkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X1RIUkVBRENUUkxfU1dJVENICQkJCSAgICAgID0gMHgyLAorfTsKKworZW51bSBnZW5fZXVfcHJlZGljYXRlX2NvbnRyb2wgeworICAgIEdFTjZfUFJFRENUUkxfTk9ORQkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9QUkVEQ1RSTF9OT1JNQUwJCQkJICAgICAgPSAweDEsCisgICAgR0VONl9QUkVEQ1RSTF9BTllWCQkJCQkgICAgICA9IDB4MiwKKyAgICBHRU42X1BSRURDVFJMX0FMTFYJCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfUFJFRENUUkxfQU5ZMkgJCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfUFJFRENUUkxfQUxMMkgJCQkJCSAgICAgID0gMHg1LAorICAgIEdFTjZfUFJFRENUUkxfWAkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9QUkVEQ1RSTF9ZCQkJCQkgICAgICA9IDB4MywKKyAgICBHRU42X1BSRURDVFJMX1oJCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfUFJFRENUUkxfVwkJCQkJICAgICAgPSAweDUsCisgICAgR0VONl9QUkVEQ1RSTF9BTlk0SAkJCQkJICAgICAgPSAweDYsCisgICAgR0VONl9QUkVEQ1RSTF9BTEw0SAkJCQkJICAgICAgPSAweDcsCisgICAgR0VONl9QUkVEQ1RSTF9BTlk4SAkJCQkJICAgICAgPSAweDgsCisgICAgR0VONl9QUkVEQ1RSTF9BTEw4SAkJCQkJICAgICAgPSAweDksCisgICAgR0VONl9QUkVEQ1RSTF9BTlkxNkgJCQkJICAgICAgPSAweGEsCisgICAgR0VONl9QUkVEQ1RSTF9BTEwxNkgJCQkJICAgICAgPSAweGIsCisgICAgR0VON19QUkVEQ1RSTF9BTlkzMkgJCQkJICAgICAgPSAweGMsCisgICAgR0VON19QUkVEQ1RSTF9BTEwzMkgJCQkJICAgICAgPSAweGQsCit9OworCitlbnVtIGdlbl9ldV9leGVjX3NpemUgeworICAgIEdFTjZfRVhFQ1NJWkVfMQkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9FWEVDU0laRV8yCQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X0VYRUNTSVpFXzQJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfRVhFQ1NJWkVfOAkJCQkJICAgICAgPSAweDMsCisgICAgR0VONl9FWEVDU0laRV8xNgkJCQkJICAgICAgPSAweDQsCisgICAgR0VONl9FWEVDU0laRV8zMgkJCQkJICAgICAgPSAweDUsCit9OworCitlbnVtIGdlbl9ldV9jb25kaXRpb25fbW9kaWZpZXIgeworICAgIEdFTjZfQ09ORF9OT05FCQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X0NPTkRfWgkJCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfQ09ORF9OWgkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9DT05EX0cJCQkJCQkgICAgICA9IDB4MywKKyAgICBHRU42X0NPTkRfR0UJCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfQ09ORF9MCQkJCQkJICAgICAgPSAweDUsCisgICAgR0VONl9DT05EX0xFCQkJCQkgICAgICA9IDB4NiwKKyAgICBHRU42X0NPTkRfTwkJCQkJCSAgICAgID0gMHg4LAorICAgIEdFTjZfQ09ORF9VCQkJCQkJICAgICAgPSAweDksCit9OworCitlbnVtIGdlbl9ldV9tYXRoX2Z1bmN0aW9uX2NvbnRyb2wgeworICAgIEdFTjZfTUFUSF9JTlYJCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfTUFUSF9MT0cJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfTUFUSF9FWFAJCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfTUFUSF9TUVJUCQkJCQkgICAgICA9IDB4NCwKKyAgICBHRU42X01BVEhfUlNRCQkJCQkgICAgICA9IDB4NSwKKyAgICBHRU42X01BVEhfU0lOCQkJCQkgICAgICA9IDB4NiwKKyAgICBHRU42X01BVEhfQ09TCQkJCQkgICAgICA9IDB4NywKKyAgICBHRU42X01BVEhfRkRJVgkJCQkJICAgICAgPSAweDksCisgICAgR0VONl9NQVRIX1BPVwkJCQkJICAgICAgPSAweGEsCisgICAgR0VONl9NQVRIX0lOVF9ESVYJCQkJCSAgICAgID0gMHhiLAorICAgIEdFTjZfTUFUSF9JTlRfRElWX1FVT1RJRU5UCQkJCSAgICAgID0gMHhjLAorICAgIEdFTjZfTUFUSF9JTlRfRElWX1JFTUFJTkRFUgkJCQkgICAgICA9IDB4ZCwKKyAgICBHRU44X01BVEhfSU5WTQkJCQkJICAgICAgPSAweGUsCisgICAgR0VOOF9NQVRIX1JTUVJUTQkJCQkJICAgICAgPSAweGYsCit9OworCitlbnVtIGdlbl9ldV9zaGFyZWRfZnVuY3Rpb25faWQgeworICAgIEdFTjZfU0ZJRF9OVUxMCQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X1NGSURfU0FNUExFUgkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9TRklEX0dBVEVXQVkJCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfU0ZJRF9EUF9TQU1QTEVSCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfU0ZJRF9EUF9SQwkJCQkJICAgICAgPSAweDUsCisgICAgR0VONl9TRklEX1VSQgkJCQkJICAgICAgPSAweDYsCisgICAgR0VONl9TRklEX1NQQVdORVIJCQkJCSAgICAgID0gMHg3LAorICAgIEdFTjZfU0ZJRF9WTUUJCQkJCSAgICAgID0gMHg4LAorICAgIEdFTjZfU0ZJRF9EUF9DQwkJCQkJICAgICAgPSAweDksCisgICAgR0VON19TRklEX0RQX0RDMAkJCQkJICAgICAgPSAweGEsCisgICAgR0VON19TRklEX1BJCQkJCQkgICAgICA9IDB4YiwKKyAgICBHRU43NV9TRklEX0RQX0RDMQkJCQkJICAgICAgPSAweGMsCit9OworCitlbnVtIGdlbl9ldV9yZWdfZmlsZSB7CisgICAgR0VONl9GSUxFX0FSRgkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9GSUxFX0dSRgkJCQkJICAgICAgPSAweDEsCisgICAgR0VONl9GSUxFX01SRgkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9GSUxFX0lNTQkJCQkJICAgICAgPSAweDMsCit9OworCitlbnVtIGdlbl9ldV9yZWdfdHlwZSB7CisgICAgR0VONl9UWVBFX1VECQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X1RZUEVfRAkJCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfVFlQRV9VVwkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9UWVBFX1cJCQkJCQkgICAgICA9IDB4MywKKyAgICBHRU42X1RZUEVfVUIJCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfVFlQRV9CCQkJCQkJICAgICAgPSAweDUsCisgICAgR0VON19UWVBFX0RGCQkJCQkgICAgICA9IDB4NiwKKyAgICBHRU42X1RZUEVfRgkJCQkJCSAgICAgID0gMHg3LAorICAgIEdFTjhfVFlQRV9VUQkJCQkJICAgICAgPSAweDgsCisgICAgR0VOOF9UWVBFX1EJCQkJCQkgICAgICA9IDB4OSwKKyAgICBHRU44X1RZUEVfSEYJCQkJCSAgICAgID0gMHhhLAorICAgIEdFTjZfVFlQRV9VVl9JTU0JCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfVFlQRV9WRl9JTU0JCQkJCSAgICAgID0gMHg1LAorICAgIEdFTjZfVFlQRV9WX0lNTQkJCQkJICAgICAgPSAweDYsCisgICAgR0VOOF9UWVBFX0RGX0lNTQkJCQkJICAgICAgPSAweGEsCisgICAgR0VOOF9UWVBFX0hGX0lNTQkJCQkJICAgICAgPSAweGIsCisgICAgR0VON19UWVBFX0ZfM1NSQwkJCQkJICAgICAgPSAweDAsCisgICAgR0VON19UWVBFX0RfM1NSQwkJCQkJICAgICAgPSAweDEsCisgICAgR0VON19UWVBFX1VEXzNTUkMJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjdfVFlQRV9ERl8zU1JDCQkJCQkgICAgICA9IDB4MywKK307CisKK2VudW0gZ2VuX2V1X3ZlcnRpY2FsX3N0cmlkZSB7CisgICAgR0VONl9WRVJUU1RSSURFXzAJCQkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfVkVSVFNUUklERV8xCQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X1ZFUlRTVFJJREVfMgkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9WRVJUU1RSSURFXzQJCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfVkVSVFNUUklERV84CQkJCQkgICAgICA9IDB4NCwKKyAgICBHRU42X1ZFUlRTVFJJREVfMTYJCQkJCSAgICAgID0gMHg1LAorICAgIEdFTjZfVkVSVFNUUklERV8zMgkJCQkJICAgICAgPSAweDYsCisgICAgR0VONl9WRVJUU1RSSURFX1ZYSAkJCQkJICAgICAgPSAweGYsCit9OworCitlbnVtIGdlbl9ldV93aWR0aCB7CisgICAgR0VONl9XSURUSF8xCQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X1dJRFRIXzIJCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfV0lEVEhfNAkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9XSURUSF84CQkJCQkgICAgICA9IDB4MywKKyAgICBHRU42X1dJRFRIXzE2CQkJCQkgICAgICA9IDB4NCwKK307CisKK2VudW0gZ2VuX2V1X2hvcml6b250YWxfc3RyaWRlIHsKKyAgICBHRU42X0hPUlpTVFJJREVfMAkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9IT1JaU1RSSURFXzEJCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfSE9SWlNUUklERV8yCQkJCQkgICAgICA9IDB4MiwKKyAgICBHRU42X0hPUlpTVFJJREVfNAkJCQkJICAgICAgPSAweDMsCit9OworCitlbnVtIGdlbl9ldV9hZGRyZXNzaW5nX21vZGUgeworICAgIEdFTjZfQUREUk1PREVfRElSRUNUCQkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfQUREUk1PREVfSU5ESVJFQ1QJCQkJICAgICAgPSAweDEsCit9OworCitlbnVtIGdlbl9ldV9zd2l6emxlIHsKKyAgICBHRU42X1NXSVpaTEVfWAkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9TV0laWkxFX1kJCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfU1dJWlpMRV9aCQkJCQkgICAgICA9IDB4MiwKKyAgICBHRU42X1NXSVpaTEVfVwkJCQkJICAgICAgPSAweDMsCit9OworCitlbnVtIGdlbl9ldV9hcmZfcmVnIHsKKyAgICBHRU42X0FSRl9OVUxMCQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X0FSRl9BMAkJCQkJCSAgICAgID0gMHgxMCwKKyAgICBHRU42X0FSRl9BQ0MwCQkJCQkgICAgICA9IDB4MjAsCisgICAgR0VONl9BUkZfRjAJCQkJCQkgICAgICA9IDB4MzAsCisgICAgR0VONl9BUkZfU1IwCQkJCQkgICAgICA9IDB4NzAsCisgICAgR0VONl9BUkZfQ1IwCQkJCQkgICAgICA9IDB4ODAsCisgICAgR0VONl9BUkZfTjAJCQkJCQkgICAgICA9IDB4OTAsCisgICAgR0VONl9BUkZfSVAJCQkJCQkgICAgICA9IDB4YTAsCisgICAgR0VONl9BUkZfVERSCQkJCQkgICAgICA9IDB4YjAsCisgICAgR0VON19BUkZfVE0wCQkJCQkgICAgICA9IDB4YzAsCit9OworCisjZGVmaW5lIEdFTjZfSU5TVF9TQVRVUkFURQkJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VONl9JTlNUX0RFQlVHQ1RSTAkJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VONl9JTlNUX0NNUFRDVFJMCQkJCQkoMHgxIDw8IDI5KQorI2RlZmluZSBHRU44X0lOU1RfQlJBTkNIQ1RSTAkJCQkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR0VONl9JTlNUX0FDQ1dSQ1RSTAkJCQkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR0VONl9JTlNUX0NPTkRNT0RJRklFUl9fTUFTSwkJCQkweDBmMDAwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9DT05ETU9ESUZJRVJfX1NISUZUCQkJCTI0CisjZGVmaW5lIEdFTjZfSU5TVF9TRklEX19NQVNLCQkJCQkweDBmMDAwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9TRklEX19TSElGVAkJCQkJMjQKKyNkZWZpbmUgR0VONl9JTlNUX0ZDX19NQVNLCQkJCQkweDBmMDAwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9GQ19fU0hJRlQJCQkJCTI0CisjZGVmaW5lIEdFTjZfSU5TVF9FWEVDU0laRV9fTUFTSwkJCQkweDAwZTAwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9FWEVDU0laRV9fU0hJRlQJCQkJMjEKKyNkZWZpbmUgR0VONl9JTlNUX1BSRURJTlYJCQkJCSgweDEgPDwgMjApCisjZGVmaW5lIEdFTjZfSU5TVF9QUkVEQ1RSTF9fTUFTSwkJCQkweDAwMGYwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9QUkVEQ1RSTF9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9JTlNUX1RIUkVBRENUUkxfX01BU0sJCQkJMHgwMDAwYzAwMAorI2RlZmluZSBHRU42X0lOU1RfVEhSRUFEQ1RSTF9fU0hJRlQJCQkJMTQKKyNkZWZpbmUgR0VONl9JTlNUX1FUUkNUUkxfX01BU0sJCQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgR0VONl9JTlNUX1FUUkNUUkxfX1NISUZUCQkJCTEyCisjZGVmaW5lIEdFTjZfSU5TVF9ERVBDVFJMX19NQVNLCQkJCQkweDAwMDAwYzAwCisjZGVmaW5lIEdFTjZfSU5TVF9ERVBDVFJMX19TSElGVAkJCQkxMAorI2RlZmluZSBHRU42X0lOU1RfTUFTS0NUUkxfX01BU0sJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBHRU42X0lOU1RfTUFTS0NUUkxfX1NISUZUCQkJCTkKKyNkZWZpbmUgR0VOOF9JTlNUX05JQkNUUkwJCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjhfSU5TVF9ERVBDVFJMX19NQVNLCQkJCQkweDAwMDAwNjAwCisjZGVmaW5lIEdFTjhfSU5TVF9ERVBDVFJMX19TSElGVAkJCQk5CisjZGVmaW5lIEdFTjZfSU5TVF9BQ0NFU1NNT0RFX19NQVNLCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR0VONl9JTlNUX0FDQ0VTU01PREVfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VONl9JTlNUX09QQ09ERV9fTUFTSwkJCQkJMHgwMDAwMDA3ZgorI2RlZmluZSBHRU42X0lOU1RfT1BDT0RFX19TSElGVAkJCQkJMAorI2RlZmluZSBHRU42X0lOU1RfRFNUX0FERFJNT0RFX19NQVNLCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9BRERSTU9ERV9fU0hJRlQJCQkJMzEKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9IT1JaU1RSSURFX19NQVNLCQkJCTB4NjAwMDAwMDAKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9IT1JaU1RSSURFX19TSElGVAkJCQkyOQorI2RlZmluZSBHRU42X0lOU1RfRFNUX1JFR19fTUFTSwkJCQkJMHgxZmUwMDAwMAorI2RlZmluZSBHRU42X0lOU1RfRFNUX1JFR19fU0hJRlQJCQkJMjEKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9TVUJSRUdfX01BU0sJCQkJMHgwMDFmMDAwMAorI2RlZmluZSBHRU42X0lOU1RfRFNUX1NVQlJFR19fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9BRERSX1NVQlJFR19fTUFTSwkJCQkweDFjMDAwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9EU1RfQUREUl9TVUJSRUdfX1NISUZUCQkJMjYKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9BRERSX0lNTV9fTUFTSwkJCQkweDAzZmYwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9EU1RfQUREUl9JTU1fX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfQUREUl9TVUJSRUdfX01BU0sJCQkJMHgxZTAwMDAwMAorI2RlZmluZSBHRU44X0lOU1RfRFNUX0FERFJfU1VCUkVHX19TSElGVAkJCTI1CisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfQUREUl9JTU1fX01BU0sJCQkJMHgwMWZmMDAwMAorI2RlZmluZSBHRU44X0lOU1RfRFNUX0FERFJfSU1NX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0lOU1RfRFNUX1NVQlJFR19BTElHTjE2X19NQVNLCQkJMHgwMDEwMDAwMAorI2RlZmluZSBHRU42X0lOU1RfRFNUX1NVQlJFR19BTElHTjE2X19TSElGVAkJCTIwCisjZGVmaW5lIEdFTjZfSU5TVF9EU1RfU1VCUkVHX0FMSUdOMTZfX1NIUgkJCTQKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9BRERSX0lNTV9BTElHTjE2X19NQVNLCQkJMHgwM2YwMDAwMAorI2RlZmluZSBHRU42X0lOU1RfRFNUX0FERFJfSU1NX0FMSUdOMTZfX1NISUZUCQkJMjAKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9BRERSX0lNTV9BTElHTjE2X19TSFIJCQk0CisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfQUREUl9JTU1fQUxJR04xNl9fTUFTSwkJCTB4MDFmMDAwMDAKKyNkZWZpbmUgR0VOOF9JTlNUX0RTVF9BRERSX0lNTV9BTElHTjE2X19TSElGVAkJCTIwCisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfQUREUl9JTU1fQUxJR04xNl9fU0hSCQkJNAorI2RlZmluZSBHRU42X0lOU1RfRFNUX1dSSVRFTUFTS19fTUFTSwkJCQkweDAwMGYwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9EU1RfV1JJVEVNQVNLX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU43X0lOU1RfTklCQ1RSTAkJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgR0VONl9JTlNUX1NSQzFfVFlQRV9fTUFTSwkJCQkweDAwMDA3MDAwCisjZGVmaW5lIEdFTjZfSU5TVF9TUkMxX1RZUEVfX1NISUZUCQkJCTEyCisjZGVmaW5lIEdFTjZfSU5TVF9TUkMxX0ZJTEVfX01BU0sJCQkJMHgwMDAwMGMwMAorI2RlZmluZSBHRU42X0lOU1RfU1JDMV9GSUxFX19TSElGVAkJCQkxMAorI2RlZmluZSBHRU42X0lOU1RfU1JDMF9UWVBFX19NQVNLCQkJCTB4MDAwMDAzODAKKyNkZWZpbmUgR0VONl9JTlNUX1NSQzBfVFlQRV9fU0hJRlQJCQkJNworI2RlZmluZSBHRU42X0lOU1RfU1JDMF9GSUxFX19NQVNLCQkJCTB4MDAwMDAwNjAKKyNkZWZpbmUgR0VONl9JTlNUX1NSQzBfRklMRV9fU0hJRlQJCQkJNQorI2RlZmluZSBHRU42X0lOU1RfRFNUX1RZUEVfX01BU0sJCQkJMHgwMDAwMDAxYworI2RlZmluZSBHRU42X0lOU1RfRFNUX1RZUEVfX1NISUZUCQkJCTIKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9GSUxFX19NQVNLCQkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR0VONl9JTlNUX0RTVF9GSUxFX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfQUREUl9JTU1fQklUOV9fTUFTSwkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgR0VOOF9JTlNUX0RTVF9BRERSX0lNTV9CSVQ5X19TSElGVAkJCTE1CisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfQUREUl9JTU1fQklUOV9fU0hSCQkJOQorI2RlZmluZSBHRU44X0lOU1RfU1JDMF9UWVBFX19NQVNLCQkJCTB4MDAwMDc4MDAKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQzBfVFlQRV9fU0hJRlQJCQkJMTEKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQzBfRklMRV9fTUFTSwkJCQkweDAwMDAwNjAwCisjZGVmaW5lIEdFTjhfSU5TVF9TUkMwX0ZJTEVfX1NISUZUCQkJCTkKKyNkZWZpbmUgR0VOOF9JTlNUX0RTVF9UWVBFX19NQVNLCQkJCTB4MDAwMDAxZTAKKyNkZWZpbmUgR0VOOF9JTlNUX0RTVF9UWVBFX19TSElGVAkJCQk1CisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfRklMRV9fTUFTSwkJCQkweDAwMDAwMDE4CisjZGVmaW5lIEdFTjhfSU5TVF9EU1RfRklMRV9fU0hJRlQJCQkJMworI2RlZmluZSBHRU44X0lOU1RfTUFTS0NUUkxfX01BU0sJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBHRU44X0lOU1RfTUFTS0NUUkxfX1NISUZUCQkJCTIKKyNkZWZpbmUgR0VOOF9JTlNUX0ZMQUdfUkVHX19NQVNLCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0VOOF9JTlNUX0ZMQUdfUkVHX19TSElGVAkJCQkxCisjZGVmaW5lIEdFTjhfSU5TVF9GTEFHX1NVQlJFR19fTUFTSwkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdFTjhfSU5TVF9GTEFHX1NVQlJFR19fU0hJRlQJCQkJMAorI2RlZmluZSBHRU43X0lOU1RfRkxBR19SRUdfX01BU0sJCQkJMHgwNDAwMDAwMAorI2RlZmluZSBHRU43X0lOU1RfRkxBR19SRUdfX1NISUZUCQkJCTI2CisjZGVmaW5lIEdFTjZfSU5TVF9GTEFHX1NVQlJFR19fTUFTSwkJCQkweDAyMDAwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9GTEFHX1NVQlJFR19fU0hJRlQJCQkJMjUKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQzBfQUREUl9JTU1fQklUOV9fTUFTSwkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQzBfQUREUl9JTU1fQklUOV9fU0hJRlQJCQkzMQorI2RlZmluZSBHRU44X0lOU1RfU1JDMF9BRERSX0lNTV9CSVQ5X19TSFIJCQk5CisjZGVmaW5lIEdFTjhfSU5TVF9TUkMxX1RZUEVfX01BU0sJCQkJMHg3ODAwMDAwMAorI2RlZmluZSBHRU44X0lOU1RfU1JDMV9UWVBFX19TSElGVAkJCQkyNworI2RlZmluZSBHRU44X0lOU1RfU1JDMV9GSUxFX19NQVNLCQkJCTB4MDYwMDAwMDAKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQzFfRklMRV9fU0hJRlQJCQkJMjUKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQzFfQUREUl9JTU1fQklUOV9fTUFTSwkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQzFfQUREUl9JTU1fQklUOV9fU0hJRlQJCQkyNQorI2RlZmluZSBHRU44X0lOU1RfU1JDMV9BRERSX0lNTV9CSVQ5X19TSFIJCQk5CisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfVkVSVFNUUklERV9fTUFTSwkJCQkweDAxZTAwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfVkVSVFNUUklERV9fU0hJRlQJCQkJMjEKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19XSURUSF9fTUFTSwkJCQkweDAwMWMwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfV0lEVEhfX1NISUZUCQkJCTE4CisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfSE9SWlNUUklERV9fTUFTSwkJCQkweDAwMDMwMDAwCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfSE9SWlNUUklERV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19TV0laWkxFX1dfX01BU0sJCQkJMHgwMDBjMDAwMAorI2RlZmluZSBHRU42X0lOU1RfU1JDX1NXSVpaTEVfV19fU0hJRlQJCQkJMTgKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19TV0laWkxFX1pfX01BU0sJCQkJMHgwMDAzMDAwMAorI2RlZmluZSBHRU42X0lOU1RfU1JDX1NXSVpaTEVfWl9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19BRERSTU9ERV9fTUFTSwkJCQkweDAwMDA4MDAwCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfQUREUk1PREVfX1NISUZUCQkJCTE1CisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfTkVHQVRFCQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBHRU42X0lOU1RfU1JDX0FCU09MVVRFCQkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBHRU42X0lOU1RfU1JDX1JFR19fTUFTSwkJCQkJMHgwMDAwMWZlMAorI2RlZmluZSBHRU42X0lOU1RfU1JDX1JFR19fU0hJRlQJCQkJNQorI2RlZmluZSBHRU42X0lOU1RfU1JDX1NVQlJFR19fTUFTSwkJCQkweDAwMDAwMDFmCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfU1VCUkVHX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfQUREUl9TVUJSRUdfX01BU0sJCQkJMHgwMDAwMWMwMAorI2RlZmluZSBHRU42X0lOU1RfU1JDX0FERFJfU1VCUkVHX19TSElGVAkJCTEwCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfQUREUl9JTU1fX01BU0sJCQkJMHgwMDAwMDNmZgorI2RlZmluZSBHRU42X0lOU1RfU1JDX0FERFJfSU1NX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjhfSU5TVF9TUkNfQUREUl9TVUJSRUdfX01BU0sJCQkJMHgwMDAwMWUwMAorI2RlZmluZSBHRU44X0lOU1RfU1JDX0FERFJfU1VCUkVHX19TSElGVAkJCTkKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQ19BRERSX0lNTV9fTUFTSwkJCQkweDAwMDAwMWZmCisjZGVmaW5lIEdFTjhfSU5TVF9TUkNfQUREUl9JTU1fX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19TVUJSRUdfQUxJR04xNl9fTUFTSwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19TVUJSRUdfQUxJR04xNl9fU0hJRlQJCQk0CisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfU1VCUkVHX0FMSUdOMTZfX1NIUgkJCTQKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19BRERSX0lNTV9BTElHTjE2X19NQVNLCQkJMHgwMDAwMDNmMAorI2RlZmluZSBHRU42X0lOU1RfU1JDX0FERFJfSU1NX0FMSUdOMTZfX1NISUZUCQkJNAorI2RlZmluZSBHRU42X0lOU1RfU1JDX0FERFJfSU1NX0FMSUdOMTZfX1NIUgkJCTQKKyNkZWZpbmUgR0VOOF9JTlNUX1NSQ19BRERSX0lNTV9BTElHTjE2X19NQVNLCQkJMHgwMDAwMDFmMAorI2RlZmluZSBHRU44X0lOU1RfU1JDX0FERFJfSU1NX0FMSUdOMTZfX1NISUZUCQkJNAorI2RlZmluZSBHRU44X0lOU1RfU1JDX0FERFJfSU1NX0FMSUdOMTZfX1NIUgkJCTQKKyNkZWZpbmUgR0VONl9JTlNUX1NSQ19TV0laWkxFX1lfX01BU0sJCQkJMHgwMDAwMDAwYworI2RlZmluZSBHRU42X0lOU1RfU1JDX1NXSVpaTEVfWV9fU0hJRlQJCQkJMgorI2RlZmluZSBHRU42X0lOU1RfU1JDX1NXSVpaTEVfWF9fTUFTSwkJCQkweDAwMDAwMDAzCisjZGVmaW5lIEdFTjZfSU5TVF9TUkNfU1dJWlpMRV9YX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjZfM1NSQ19EU1RfUkVHX19NQVNLCQkJCQkweGZmMDAwMDAwCisjZGVmaW5lIEdFTjZfM1NSQ19EU1RfUkVHX19TSElGVAkJCQkyNAorI2RlZmluZSBHRU42XzNTUkNfRFNUX1NVQlJFR19fTUFTSwkJCQkweDAwZTAwMDAwCisjZGVmaW5lIEdFTjZfM1NSQ19EU1RfU1VCUkVHX19TSElGVAkJCQkyMQorI2RlZmluZSBHRU42XzNTUkNfRFNUX1NVQlJFR19fU0hSCQkJCTIKKyNkZWZpbmUgR0VONl8zU1JDX0RTVF9XUklURU1BU0tfX01BU0sJCQkJMHgwMDFlMDAwMAorI2RlZmluZSBHRU42XzNTUkNfRFNUX1dSSVRFTUFTS19fU0hJRlQJCQkJMTcKKyNkZWZpbmUgR0VON18zU1JDX05JQkNUUkwJCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIEdFTjdfM1NSQ19EU1RfVFlQRV9fTUFTSwkJCQkweDAwMDAzMDAwCisjZGVmaW5lIEdFTjdfM1NSQ19EU1RfVFlQRV9fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VON18zU1JDX1NSQ19UWVBFX19NQVNLCQkJCTB4MDAwMDBjMDAKKyNkZWZpbmUgR0VON18zU1JDX1NSQ19UWVBFX19TSElGVAkJCQkxMAorI2RlZmluZSBHRU42XzNTUkNfU1JDMl9ORUdBVEUJCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR0VONl8zU1JDX1NSQzJfQUJTT0xVVEUJCQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VONl8zU1JDX1NSQzFfTkVHQVRFCQkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIEdFTjZfM1NSQ19TUkMxX0FCU09MVVRFCQkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIEdFTjZfM1NSQ19TUkMwX05FR0FURQkJCQkJKDB4MSA8PCA1KQorI2RlZmluZSBHRU42XzNTUkNfU1JDMF9BQlNPTFVURQkJCQkJKDB4MSA8PCA0KQorI2RlZmluZSBHRU43XzNTUkNfRkxBR19SRUdfX01BU0sJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBHRU43XzNTUkNfRkxBR19SRUdfX1NISUZUCQkJCTIKKyNkZWZpbmUgR0VONl8zU1JDX0ZMQUdfU1VCUkVHX19NQVNLCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0VONl8zU1JDX0ZMQUdfU1VCUkVHX19TSElGVAkJCQkxCisjZGVmaW5lIEdFTjZfM1NSQ19EU1RfRklMRV9NUkYJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgR0VOOF8zU1JDX0RTVF9UWVBFX19NQVNLCQkJCTB4MDAwMWMwMDAKKyNkZWZpbmUgR0VOOF8zU1JDX0RTVF9UWVBFX19TSElGVAkJCQkxNAorI2RlZmluZSBHRU44XzNTUkNfU1JDX1RZUEVfX01BU0sJCQkJMHgwMDAwMzgwMAorI2RlZmluZSBHRU44XzNTUkNfU1JDX1RZUEVfX1NISUZUCQkJCTExCisjZGVmaW5lIEdFTjhfM1NSQ19TUkMyX05FR0FURQkJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgR0VOOF8zU1JDX1NSQzJfQUJTT0xVVEUJCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR0VOOF8zU1JDX1NSQzFfTkVHQVRFCQkJCQkoMHgxIDw8IDgpCisjZGVmaW5lIEdFTjhfM1NSQ19TUkMxX0FCU09MVVRFCQkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIEdFTjhfM1NSQ19TUkMwX05FR0FURQkJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBHRU44XzNTUkNfU1JDMF9BQlNPTFVURQkJCQkJKDB4MSA8PCA1KQorI2RlZmluZSBHRU44XzNTUkNfTUFTS0NUUkxfX01BU0sJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBHRU44XzNTUkNfTUFTS0NUUkxfX1NISUZUCQkJCTIKKyNkZWZpbmUgR0VOOF8zU1JDX0ZMQUdfUkVHX19NQVNLCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0VOOF8zU1JDX0ZMQUdfUkVHX19TSElGVAkJCQkxCisjZGVmaW5lIEdFTjhfM1NSQ19GTEFHX1NVQlJFR19fTUFTSwkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdFTjhfM1NSQ19GTEFHX1NVQlJFR19fU0hJRlQJCQkJMAorI2RlZmluZSBHRU42XzNTUkNfU1JDX1JFR19fTUFTSwkJCQkJMHgwMDBmZjAwMAorI2RlZmluZSBHRU42XzNTUkNfU1JDX1JFR19fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VONl8zU1JDX1NSQ19TVUJSRUdfX01BU0sJCQkJMHgwMDAwMGUwMAorI2RlZmluZSBHRU42XzNTUkNfU1JDX1NVQlJFR19fU0hJRlQJCQkJOQorI2RlZmluZSBHRU42XzNTUkNfU1JDX1NVQlJFR19fU0hSCQkJCTIKKyNkZWZpbmUgR0VONl8zU1JDX1NSQ19TV0laWkxFX1dfX01BU0sJCQkJMHgwMDAwMDE4MAorI2RlZmluZSBHRU42XzNTUkNfU1JDX1NXSVpaTEVfV19fU0hJRlQJCQkJNworI2RlZmluZSBHRU42XzNTUkNfU1JDX1NXSVpaTEVfWl9fTUFTSwkJCQkweDAwMDAwMDYwCisjZGVmaW5lIEdFTjZfM1NSQ19TUkNfU1dJWlpMRV9aX19TSElGVAkJCQk1CisjZGVmaW5lIEdFTjZfM1NSQ19TUkNfU1dJWlpMRV9ZX19NQVNLCQkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgR0VONl8zU1JDX1NSQ19TV0laWkxFX1lfX1NISUZUCQkJCTMKKyNkZWZpbmUgR0VONl8zU1JDX1NSQ19TV0laWkxFX1hfX01BU0sJCQkJMHgwMDAwMDAwNgorI2RlZmluZSBHRU42XzNTUkNfU1JDX1NXSVpaTEVfWF9fU0hJRlQJCQkJMQorI2RlZmluZSBHRU42XzNTUkNfU1JDX1JFUENUUkwJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgR0VONl9DT01QQUNUX1NSQzFfUkVHX19NQVNLCQkJMHhmZjAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIEdFTjZfQ09NUEFDVF9TUkMxX1JFR19fU0hJRlQJCQkJNTYKKyNkZWZpbmUgR0VONl9DT01QQUNUX1NSQzBfUkVHX19NQVNLCQkJMHgwMGZmMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIEdFTjZfQ09NUEFDVF9TUkMwX1JFR19fU0hJRlQJCQkJNDgKKyNkZWZpbmUgR0VONl9DT01QQUNUX0RTVF9SRUdfX01BU0sJCQkweDAwMDBmZjAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgR0VONl9DT01QQUNUX0RTVF9SRUdfX1NISUZUCQkJCTQwCisjZGVmaW5lIEdFTjZfQ09NUEFDVF9TUkMxX0lOREVYX19NQVNLCQkJMHgwMDAwMDBmODAwMDAwMDAwVUxMCisjZGVmaW5lIEdFTjZfQ09NUEFDVF9TUkMxX0lOREVYX19TSElGVAkJCQkzNQorI2RlZmluZSBHRU42X0NPTVBBQ1RfU1JDMF9JTkRFWF9fTUFTSwkJCTB4MDAwMDAwMDdjMDAwMDAwMFVMTAorI2RlZmluZSBHRU42X0NPTVBBQ1RfU1JDMF9JTkRFWF9fU0hJRlQJCQkJMzAKKyNkZWZpbmUgR0VONl9DT01QQUNUX0NNUFRDVFJMCQkJCQkoMHgxIDw8IDI5KQorI2RlZmluZSBHRU42X0NPTVBBQ1RfRkxBR19TVUJSRUdfX01BU0sJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBHRU42X0NPTVBBQ1RfRkxBR19TVUJSRUdfX1NISUZUCQkJCTI4CisjZGVmaW5lIEdFTjZfQ09NUEFDVF9DT05ETU9ESUZJRVJfX01BU0sJCQkJMHgwZjAwMDAwMAorI2RlZmluZSBHRU42X0NPTVBBQ1RfQ09ORE1PRElGSUVSX19TSElGVAkJCTI0CisjZGVmaW5lIEdFTjZfQ09NUEFDVF9BQ0NXUkNUUkwJCQkJCSgweDEgPDwgMjMpCisjZGVmaW5lIEdFTjZfQ09NUEFDVF9TVUJSRUdfSU5ERVhfX01BU0sJCQkJMHgwMDdjMDAwMAorI2RlZmluZSBHRU42X0NPTVBBQ1RfU1VCUkVHX0lOREVYX19TSElGVAkJCTE4CisjZGVmaW5lIEdFTjZfQ09NUEFDVF9EQVRBVFlQRV9JTkRFWF9fTUFTSwkJCTB4MDAwM2UwMDAKKyNkZWZpbmUgR0VONl9DT01QQUNUX0RBVEFUWVBFX0lOREVYX19TSElGVAkJCTEzCisjZGVmaW5lIEdFTjZfQ09NUEFDVF9DT05UUk9MX0lOREVYX19NQVNLCQkJMHgwMDAwMWYwMAorI2RlZmluZSBHRU42X0NPTVBBQ1RfQ09OVFJPTF9JTkRFWF9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjZfQ09NUEFDVF9ERUJVR0NUUkwJCQkJCSgweDEgPDwgNykKKyNkZWZpbmUgR0VONl9DT01QQUNUX09QQ09ERV9fTUFTSwkJCQkweDAwMDAwMDdmCisjZGVmaW5lIEdFTjZfQ09NUEFDVF9PUENPREVfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMl9SRUdfX01BU0sJCTB4ZmUwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMyX1JFR19fU0hJRlQJCQk1NworI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMyX1JFR19fU0hSCQkJCTEKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMV9SRUdfX01BU0sJCTB4MDFmYzAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMxX1JFR19fU0hJRlQJCQk1MAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMxX1JFR19fU0hSCQkJCTEKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMF9SRUdfX01BU0sJCTB4MDAwM2Y4MDAwMDAwMDAwMFVMTAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMwX1JFR19fU0hJRlQJCQk0MworI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMwX1JFR19fU0hSCQkJCTEKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMl9TVUJSRUdfX01BU0sJCTB4MDAwMDA3MDAwMDAwMDAwMFVMTAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMyX1NVQlJFR19fU0hJRlQJCQk0MAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMyX1NVQlJFR19fU0hSCQkJMgorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TUkMxX1NVQlJFR19fTUFTSwkJMHgwMDAwMDBlMDAwMDAwMDAwVUxMCisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX1NSQzFfU1VCUkVHX19TSElGVAkJCTM3CisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX1NSQzFfU1VCUkVHX19TSFIJCQkyCisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX1NSQzBfU1VCUkVHX19NQVNLCQkweDAwMDAwMDFjMDAwMDAwMDBVTEwKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMF9TVUJSRUdfX1NISUZUCQkJMzQKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMF9TVUJSRUdfX1NIUgkJCTIKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMl9SRVBDVFJMCQkJCSgweDFVTEwgPDwgMzMpCisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX1NSQzFfUkVQQ1RSTAkJCQkoMHgxVUxMIDw8IDMyKQorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19TQVRVUkFURQkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19ERUJVR0NUUkwJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfQ01QVENUUkwJCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU1JDMF9SRVBDVFJMCQkJCSgweDEgPDwgMjgpCisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX0RTVF9SRUdfX01BU0sJCQkJMHgwMDA3ZjAwMAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19EU1RfUkVHX19TSElGVAkJCTEyCisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX1NPVVJDRV9JTkRFWF9fTUFTSwkJCTB4MDAwMDBjMDAKKyNkZWZpbmUgR0VOOF9DT01QQUNUXzNTUkNfU09VUkNFX0lOREVYX19TSElGVAkJCTEwCisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX0NPTlRST0xfSU5ERVhfX01BU0sJCQkweDAwMDAwMzAwCisjZGVmaW5lIEdFTjhfQ09NUEFDVF8zU1JDX0NPTlRST0xfSU5ERVhfX1NISUZUCQkJOAorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19PUENPREVfX01BU0sJCQkJMHgwMDAwMDA3ZgorI2RlZmluZSBHRU44X0NPTVBBQ1RfM1NSQ19PUENPREVfX1NISUZUCQkJCTAKKworCisKKworCisKKworCisjZGVmaW5lIEdFTjZfM1NSQ19TUkNfMl9fTUFTSwkJCQkweDdmZmZmYzAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgR0VONl8zU1JDX1NSQ18yX19TSElGVAkJCQkJNDIKKyNkZWZpbmUgR0VONl8zU1JDX1NSQ18xX19NQVNLCQkJCTB4MDAwMDAzZmZmZmUwMDAwMFVMTAorI2RlZmluZSBHRU42XzNTUkNfU1JDXzFfX1NISUZUCQkJCQkyMQorI2RlZmluZSBHRU42XzNTUkNfU1JDXzBfX01BU0sJCQkJCTB4MDAxZmZmZmYKKyNkZWZpbmUgR0VONl8zU1JDX1NSQ18wX19TSElGVAkJCQkJMAorCisKKworCisKKworI2VuZGlmIC8qIEdFTl9FVV9JU0FfWE1MICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZ2VuaHcvZ2VuX2V1X21lc3NhZ2UueG1sLmggYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX2V1X21lc3NhZ2UueG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4YjI2OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9nZW5ody9nZW5fZXVfbWVzc2FnZS54bWwuaApAQCAtMCwwICsxLDMyOSBAQAorI2lmbmRlZiBHRU5fRVVfTUVTU0FHRV9YTUwKKyNkZWZpbmUgR0VOX0VVX01FU1NBR0VfWE1MCisKKy8qIEF1dG9nZW5lcmF0ZWQgZmlsZSwgRE8gTk9UIEVESVQgbWFudWFsbHkhCisKK1RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBydWxlcy1uZy1uZyBoZWFkZXJnZW4gdG9vbCBpbiB0aGlzIGdpdCByZXBvc2l0b3J5OgoraHR0cHM6Ly9naXRodWIuY29tL29sdmFmZmUvZW52eXRvb2xzLworZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9vbHZhZmZlL2Vudnl0b29scy5naXQKKworQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorLSBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPiAob2x2KQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKK25leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCitwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCitlbnVtIGdlbl9ldV91cmJfb3AgeworICAgIEdFTjZfTVNHX1VSQl9XUklURQkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9NU0dfVVJCX0ZGX1NZTkMJCQkJICAgICAgPSAweDEsCisgICAgR0VON19NU0dfVVJCX1dSSVRFX0hXT1JECQkJCSAgICAgID0gMHgwLAorICAgIEdFTjdfTVNHX1VSQl9XUklURV9PV09SRAkJCQkgICAgICA9IDB4MSwKKyAgICBHRU43X01TR19VUkJfUkVBRF9IV09SRAkJCQkgICAgICA9IDB4MiwKKyAgICBHRU43X01TR19VUkJfUkVBRF9PV09SRAkJCQkgICAgICA9IDB4MywKKyAgICBHRU43X01TR19VUkJfQVRPTUlDX01PVgkJCQkgICAgICA9IDB4NCwKKyAgICBHRU43X01TR19VUkJfQVRPTUlDX0lOQwkJCQkgICAgICA9IDB4NSwKKyAgICBHRU44X01TR19VUkJfU0lNRDhfV1JJVEUJCQkJICAgICAgPSAweDcsCit9OworCitlbnVtIGdlbl9ldV9waV9zaW1kIHsKKyAgICBHRU43X01TR19QSV9TSU1EOAkJCQkJICAgICAgPSAweDAsCisgICAgR0VON19NU0dfUElfU0lNRDE2CQkJCQkgICAgICA9IDB4MSwKK307CisKK2VudW0gZ2VuX2V1X3BpX29wIHsKKyAgICBHRU43X01TR19QSV9FVkFMX1NOQVBQRURfSU1NCQkJICAgICAgPSAweDAsCisgICAgR0VON19NU0dfUElfRVZBTF9TSU5ERVgJCQkJICAgICAgPSAweDEsCisgICAgR0VON19NU0dfUElfRVZBTF9DRU5UUk9JRAkJCQkgICAgICA9IDB4MiwKKyAgICBHRU43X01TR19QSV9FVkFMX1NOQVBQRUQJCQkJICAgICAgPSAweDMsCit9OworCitlbnVtIGdlbl9ldV9zYW1wbGVyX3NpbWQgeworICAgIEdFTjZfTVNHX1NBTVBMRVJfU0lNRDRYMgkJCQkgICAgICA9IDB4MCwKKyAgICBHRU45X01TR19TQU1QTEVSX1NJTUQ4RAkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X01TR19TQU1QTEVSX1NJTUQ4CQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfTVNHX1NBTVBMRVJfU0lNRDE2CQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfTVNHX1NBTVBMRVJfU0lNRDMyXzY0CQkJCSAgICAgID0gMHgzLAorfTsKKworZW51bSBnZW5fZXVfc2FtcGxlcl9vcCB7CisgICAgR0VONl9NU0dfU0FNUExFUl9TQU1QTEUJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9NU0dfU0FNUExFUl9TQU1QTEVfQgkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X01TR19TQU1QTEVSX1NBTVBMRV9MCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfTVNHX1NBTVBMRVJfU0FNUExFX0MJCQkJICAgICAgPSAweDMsCisgICAgR0VONl9NU0dfU0FNUExFUl9TQU1QTEVfRAkJCQkgICAgICA9IDB4NCwKKyAgICBHRU42X01TR19TQU1QTEVSX1NBTVBMRV9CX0MJCQkJICAgICAgPSAweDUsCisgICAgR0VONl9NU0dfU0FNUExFUl9TQU1QTEVfTF9DCQkJCSAgICAgID0gMHg2LAorICAgIEdFTjZfTVNHX1NBTVBMRVJfTEQJCQkJCSAgICAgID0gMHg3LAorICAgIEdFTjZfTVNHX1NBTVBMRVJfR0FUSEVSNAkJCQkgICAgICA9IDB4OCwKKyAgICBHRU42X01TR19TQU1QTEVSX0xPRAkJCQkgICAgICA9IDB4OSwKKyAgICBHRU42X01TR19TQU1QTEVSX1JFU0lORk8JCQkJICAgICAgPSAweGEsCisgICAgR0VONl9NU0dfU0FNUExFUl9TQU1QTEVJTkZPCQkJCSAgICAgID0gMHhiLAorICAgIEdFTjdfTVNHX1NBTVBMRVJfR0FUSEVSNF9DCQkJCSAgICAgID0gMHgxMCwKKyAgICBHRU43X01TR19TQU1QTEVSX0dBVEhFUjRfUE8JCQkJICAgICAgPSAweDExLAorICAgIEdFTjdfTVNHX1NBTVBMRVJfR0FUSEVSNF9QT19DCQkJICAgICAgPSAweDEyLAorICAgIEdFTjdfTVNHX1NBTVBMRVJfU0FNUExFX0RfQwkJCQkgICAgICA9IDB4MTQsCisgICAgR0VON19NU0dfU0FNUExFUl9TQU1QTEVfTFoJCQkJICAgICAgPSAweDE4LAorICAgIEdFTjdfTVNHX1NBTVBMRVJfU0FNUExFX0NfTEMJCQkgICAgICA9IDB4MTksCisgICAgR0VON19NU0dfU0FNUExFUl9MRF9MWgkJCQkgICAgICA9IDB4MWEsCisgICAgR0VON19NU0dfU0FNUExFUl9MRF9NQ1MJCQkJICAgICAgPSAweDFkLAorICAgIEdFTjdfTVNHX1NBTVBMRVJfTEQyRE1TCQkJCSAgICAgID0gMHgxZSwKKyAgICBHRU43X01TR19TQU1QTEVSX0xEMkRTUwkJCQkgICAgICA9IDB4MWYsCit9OworCitlbnVtIGdlbl9ldV9kcF9vcCB7CisgICAgR0VONl9NU0dfRFBfT1dPUkRfQkxPQ0tfUkVBRAkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfTVNHX0RQX1JUX1VOT1JNX1JFQUQJCQkJICAgICAgPSAweDEsCisgICAgR0VONl9NU0dfRFBfT1dPUkRfRFVBTF9CTE9DS19SRUFECQkJICAgICAgPSAweDIsCisgICAgR0VONl9NU0dfRFBfTUVESUFfQkxPQ0tfUkVBRAkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfTVNHX0RQX1VOQUxJR05FRF9PV09SRF9CTE9DS19SRUFECQkgICAgICA9IDB4NSwKKyAgICBHRU42X01TR19EUF9EV09SRF9TQ0FUVEVSRURfUkVBRAkJCSAgICAgID0gMHg2LAorICAgIEdFTjZfTVNHX0RQX0RXT1JEX0FUT01JQ19XUklURQkJCSAgICAgID0gMHg3LAorICAgIEdFTjZfTVNHX0RQX09XT1JEX0JMT0NLX1dSSVRFCQkJICAgICAgPSAweDgsCisgICAgR0VONl9NU0dfRFBfT1dPUkRfRFVBTF9CTE9DS19XUklURQkJCSAgICAgID0gMHg5LAorICAgIEdFTjZfTVNHX0RQX01FRElBX0JMT0NLX1dSSVRFCQkJICAgICAgPSAweGEsCisgICAgR0VONl9NU0dfRFBfRFdPUkRfU0NBVFRFUkVEX1dSSVRFCQkJICAgICAgPSAweGIsCisgICAgR0VONl9NU0dfRFBfUlRfV1JJVEUJCQkJICAgICAgPSAweGMsCisgICAgR0VONl9NU0dfRFBfU1ZCX1dSSVRFCQkJCSAgICAgID0gMHhkLAorICAgIEdFTjZfTVNHX0RQX1JUX1VOT1JNX1dSSVRFCQkJCSAgICAgID0gMHhlLAorICAgIEdFTjdfTVNHX0RQX1NBTVBMRVJfVU5BTElHTkVEX09XT1JEX0JMT0NLX1JFQUQJICAgICAgPSAweDEsCisgICAgR0VON19NU0dfRFBfU0FNUExFUl9NRURJQV9CTE9DS19SRUFECQkgICAgICA9IDB4NCwKKyAgICBHRU43X01TR19EUF9SQ19NRURJQV9CTE9DS19SRUFECQkJICAgICAgPSAweDQsCisgICAgR0VON19NU0dfRFBfUkNfVFlQRURfU1VSRkFDRV9SRUFECQkJICAgICAgPSAweDUsCisgICAgR0VON19NU0dfRFBfUkNfVFlQRURfQVRPTUlDX09QCQkJICAgICAgPSAweDYsCisgICAgR0VON19NU0dfRFBfUkNfTUVNT1JZX0ZFTkNFCQkJCSAgICAgID0gMHg3LAorICAgIEdFTjdfTVNHX0RQX1JDX01FRElBX0JMT0NLX1dSSVRFCQkJICAgICAgPSAweGEsCisgICAgR0VON19NU0dfRFBfUkNfUlRfV1JJVEUJCQkJICAgICAgPSAweGMsCisgICAgR0VON19NU0dfRFBfUkNfVFlQRURfU1VSRkFDRV9XUklURQkJCSAgICAgID0gMHhkLAorICAgIEdFTjdfTVNHX0RQX0NDX09XT1JEX0JMT0NLX1JFQUQJCQkgICAgICA9IDB4MCwKKyAgICBHRU43X01TR19EUF9DQ19VTkFMSUdORURfT1dPUkRfQkxPQ0tfUkVBRAkJICAgICAgPSAweDEsCisgICAgR0VON19NU0dfRFBfQ0NfT1dPUkRfRFVBTF9CTE9DS19SRUFECQkgICAgICA9IDB4MiwKKyAgICBHRU43X01TR19EUF9DQ19EV09SRF9TQ0FUVEVSRURfUkVBRAkJCSAgICAgID0gMHgzLAorICAgIEdFTjdfTVNHX0RQX0RDMF9PV09SRF9CTE9DS19SRUFECQkJICAgICAgPSAweDAsCisgICAgR0VON19NU0dfRFBfREMwX1VOQUxJR05FRF9PV09SRF9CTE9DS19SRUFECQkgICAgICA9IDB4MSwKKyAgICBHRU43X01TR19EUF9EQzBfT1dPUkRfRFVBTF9CTE9DS19SRUFECQkgICAgICA9IDB4MiwKKyAgICBHRU43X01TR19EUF9EQzBfRFdPUkRfU0NBVFRFUkVEX1JFQUQJCSAgICAgID0gMHgzLAorICAgIEdFTjdfTVNHX0RQX0RDMF9CWVRFX1NDQVRURVJFRF9SRUFECQkJICAgICAgPSAweDQsCisgICAgR0VON19NU0dfRFBfREMwX1VOVFlQRURfU1VSRkFDRV9SRUFECQkgICAgICA9IDB4NSwKKyAgICBHRU43X01TR19EUF9EQzBfVU5UWVBFRF9BVE9NSUNfT1AJCQkgICAgICA9IDB4NiwKKyAgICBHRU43X01TR19EUF9EQzBfTUVNT1JZX0ZFTkNFCQkJICAgICAgPSAweDcsCisgICAgR0VON19NU0dfRFBfREMwX09XT1JEX0JMT0NLX1dSSVRFCQkJICAgICAgPSAweDgsCisgICAgR0VON19NU0dfRFBfREMwX09XT1JEX0RVQUxfQkxPQ0tfV1JJVEUJCSAgICAgID0gMHhhLAorICAgIEdFTjdfTVNHX0RQX0RDMF9EV09SRF9TQ0FUVEVSRURfV1JJVEUJCSAgICAgID0gMHhiLAorICAgIEdFTjdfTVNHX0RQX0RDMF9CWVRFX1NDQVRURVJFRF9XUklURQkJICAgICAgPSAweGMsCisgICAgR0VON19NU0dfRFBfREMwX1VOVFlQRURfU1VSRkFDRV9XUklURQkJICAgICAgPSAweGQsCisgICAgR0VONzVfTVNHX0RQX1NBTVBMRVJfUkVBRF9TVVJGQUNFX0lORk8JCSAgICAgID0gMHgwLAorICAgIEdFTjc1X01TR19EUF9TQU1QTEVSX1VOQUxJR05FRF9PV09SRF9CTE9DS19SRUFECSAgICAgID0gMHgxLAorICAgIEdFTjc1X01TR19EUF9TQU1QTEVSX01FRElBX0JMT0NLX1JFQUQJCSAgICAgID0gMHg0LAorICAgIEdFTjc1X01TR19EUF9SQ19NRURJQV9CTE9DS19SRUFECQkJICAgICAgPSAweDQsCisgICAgR0VONzVfTVNHX0RQX1JDX01FTU9SWV9GRU5DRQkJCSAgICAgID0gMHg3LAorICAgIEdFTjc1X01TR19EUF9SQ19NRURJQV9CTE9DS19XUklURQkJCSAgICAgID0gMHhhLAorICAgIEdFTjc1X01TR19EUF9SQ19SVF9XUklURQkJCQkgICAgICA9IDB4YywKKyAgICBHRU43NV9NU0dfRFBfQ0NfT1dPUkRfQkxPQ0tfUkVBRAkJCSAgICAgID0gMHgwLAorICAgIEdFTjc1X01TR19EUF9DQ19VTkFMSUdORURfT1dPUkRfQkxPQ0tfUkVBRAkJICAgICAgPSAweDEsCisgICAgR0VONzVfTVNHX0RQX0NDX09XT1JEX0RVQUxfQkxPQ0tfUkVBRAkJICAgICAgPSAweDIsCisgICAgR0VONzVfTVNHX0RQX0NDX0RXT1JEX1NDQVRURVJFRF9SRUFECQkgICAgICA9IDB4MywKKyAgICBHRU43NV9NU0dfRFBfREMwX09XT1JEX0JMT0NLX1JFQUQJCQkgICAgICA9IDB4MCwKKyAgICBHRU43NV9NU0dfRFBfREMwX1VOQUxJR05FRF9PV09SRF9CTE9DS19SRUFECQkgICAgICA9IDB4MSwKKyAgICBHRU43NV9NU0dfRFBfREMwX09XT1JEX0RVQUxfQkxPQ0tfUkVBRAkJICAgICAgPSAweDIsCisgICAgR0VONzVfTVNHX0RQX0RDMF9EV09SRF9TQ0FUVEVSRURfUkVBRAkJICAgICAgPSAweDMsCisgICAgR0VONzVfTVNHX0RQX0RDMF9CWVRFX1NDQVRURVJFRF9SRUFECQkgICAgICA9IDB4NCwKKyAgICBHRU43NV9NU0dfRFBfREMwX01FTU9SWV9GRU5DRQkJCSAgICAgID0gMHg3LAorICAgIEdFTjc1X01TR19EUF9EQzBfT1dPUkRfQkxPQ0tfV1JJVEUJCQkgICAgICA9IDB4OCwKKyAgICBHRU43NV9NU0dfRFBfREMwX09XT1JEX0RVQUxfQkxPQ0tfV1JJVEUJCSAgICAgID0gMHhhLAorICAgIEdFTjc1X01TR19EUF9EQzBfRFdPUkRfU0NBVFRFUkVEX1dSSVRFCQkgICAgICA9IDB4YiwKKyAgICBHRU43NV9NU0dfRFBfREMwX0JZVEVfU0NBVFRFUkVEX1dSSVRFCQkgICAgICA9IDB4YywKKyAgICBHRU43NV9NU0dfRFBfREMxX1VOVFlQRURfU1VSRkFDRV9SRUFECQkgICAgICA9IDB4MSwKKyAgICBHRU43NV9NU0dfRFBfREMxX1VOVFlQRURfQVRPTUlDX09QCQkJICAgICAgPSAweDIsCisgICAgR0VONzVfTVNHX0RQX0RDMV9VTlRZUEVEX0FUT01JQ19PUF9TSU1ENFgyCQkgICAgICA9IDB4MywKKyAgICBHRU43NV9NU0dfRFBfREMxX01FRElBX0JMT0NLX1JFQUQJCQkgICAgICA9IDB4NCwKKyAgICBHRU43NV9NU0dfRFBfREMxX1RZUEVEX1NVUkZBQ0VfUkVBRAkJCSAgICAgID0gMHg1LAorICAgIEdFTjc1X01TR19EUF9EQzFfVFlQRURfQVRPTUlDX09QCQkJICAgICAgPSAweDYsCisgICAgR0VONzVfTVNHX0RQX0RDMV9UWVBFRF9BVE9NSUNfT1BfU0lNRDRYMgkJICAgICAgPSAweDcsCisgICAgR0VONzVfTVNHX0RQX0RDMV9VTlRZUEVEX1NVUkZBQ0VfV1JJVEUJCSAgICAgID0gMHg5LAorICAgIEdFTjc1X01TR19EUF9EQzFfTUVESUFfQkxPQ0tfV1JJVEUJCQkgICAgICA9IDB4YSwKKyAgICBHRU43NV9NU0dfRFBfREMxX0FUT01JQ19DT1VOVEVSX09QCQkJICAgICAgPSAweGIsCisgICAgR0VONzVfTVNHX0RQX0RDMV9BVE9NSUNfQ09VTlRFUl9PUF9TSU1ENFgyCQkgICAgICA9IDB4YywKKyAgICBHRU43NV9NU0dfRFBfREMxX1RZUEVEX1NVUkZBQ0VfV1JJVEUJCSAgICAgID0gMHhkLAorfTsKKworZW51bSBnZW5fZXVfZHBfYW9wIHsKKyAgICBHRU43X01TR19EUF9BT1BfQ01QV1I4QgkJCQkgICAgICA9IDB4MCwKKyAgICBHRU43X01TR19EUF9BT1BfQU5ECQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU43X01TR19EUF9BT1BfT1IJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjdfTVNHX0RQX0FPUF9YT1IJCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjdfTVNHX0RQX0FPUF9NT1YJCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjdfTVNHX0RQX0FPUF9JTkMJCQkJCSAgICAgID0gMHg1LAorICAgIEdFTjdfTVNHX0RQX0FPUF9ERUMJCQkJCSAgICAgID0gMHg2LAorICAgIEdFTjdfTVNHX0RQX0FPUF9BREQJCQkJCSAgICAgID0gMHg3LAorICAgIEdFTjdfTVNHX0RQX0FPUF9TVUIJCQkJCSAgICAgID0gMHg4LAorICAgIEdFTjdfTVNHX0RQX0FPUF9SRVZTVUIJCQkJICAgICAgPSAweDksCisgICAgR0VON19NU0dfRFBfQU9QX0lNQVgJCQkJICAgICAgPSAweGEsCisgICAgR0VON19NU0dfRFBfQU9QX0lNSU4JCQkJICAgICAgPSAweGIsCisgICAgR0VON19NU0dfRFBfQU9QX1VNQVgJCQkJICAgICAgPSAweGMsCisgICAgR0VON19NU0dfRFBfQU9QX1VNSU4JCQkJICAgICAgPSAweGQsCisgICAgR0VON19NU0dfRFBfQU9QX0NNUFdSCQkJCSAgICAgID0gMHhlLAorICAgIEdFTjdfTVNHX0RQX0FPUF9QUkVERUMJCQkJICAgICAgPSAweGYsCit9OworCisjZGVmaW5lIEdFTjZfTVNHX0VPVAkJCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjZfTVNHX01MRU5fX01BU0sJCQkJCTB4MWUwMDAwMDAKKyNkZWZpbmUgR0VONl9NU0dfTUxFTl9fU0hJRlQJCQkJCTI1CisjZGVmaW5lIEdFTjZfTVNHX1JMRU5fX01BU0sJCQkJCTB4MDFmMDAwMDAKKyNkZWZpbmUgR0VONl9NU0dfUkxFTl9fU0hJRlQJCQkJCTIwCisjZGVmaW5lIEdFTjZfTVNHX0hFQURFUl9QUkVTRU5UCQkJCQkoMHgxIDw8IDE5KQorI2RlZmluZSBHRU42X01TR19GVU5DVElPTl9DT05UUk9MX19NQVNLCQkJCTB4MDAwN2ZmZmYKKyNkZWZpbmUgR0VONl9NU0dfRlVOQ1RJT05fQ09OVFJPTF9fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjZfTVNHX1VSQl9DT01QTEVURQkJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgR0VONl9NU0dfVVJCX1VTRUQJCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIEdFTjZfTVNHX1VSQl9BTExPQ0FURQkJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgR0VONl9NU0dfVVJCX0lOVEVSTEVBVkVECQkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjZfTVNHX1VSQl9PRkZTRVRfX01BU0sJCQkJMHgwMDAwMDNmMAorI2RlZmluZSBHRU42X01TR19VUkJfT0ZGU0VUX19TSElGVAkJCQk0CisjZGVmaW5lIEdFTjZfTVNHX1VSQl9PUF9fTUFTSwkJCQkJMHgwMDAwMDAwZgorI2RlZmluZSBHRU42X01TR19VUkJfT1BfX1NISUZUCQkJCQkwCisjZGVmaW5lIEdFTjdfTVNHX1VSQl9QRVJfU0xPVF9PRkZTRVQJCQkJKDB4MSA8PCAxNikKKyNkZWZpbmUgR0VON19NU0dfVVJCX0NPTVBMRVRFCQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBHRU43X01TR19VUkJfSU5URVJMRUFWRUQJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgR0VON19NU0dfVVJCX0dMT0JBTF9PRkZTRVRfX01BU0sJCQkweDAwMDAzZmY4CisjZGVmaW5lIEdFTjdfTVNHX1VSQl9HTE9CQUxfT0ZGU0VUX19TSElGVAkJCTMKKyNkZWZpbmUgR0VON19NU0dfVVJCX09QX19NQVNLCQkJCQkweDAwMDAwMDA3CisjZGVmaW5lIEdFTjdfTVNHX1VSQl9PUF9fU0hJRlQJCQkJCTAKKyNkZWZpbmUgR0VOOF9NU0dfVVJCX1BFUl9TTE9UX09GRlNFVAkJCQkoMHgxIDw8IDE3KQorI2RlZmluZSBHRU44X01TR19VUkJfSU5URVJMRUFWRUQJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgR0VOOF9NU0dfVVJCX0dMT0JBTF9PRkZTRVRfX01BU0sJCQkweDAwMDA3ZmYwCisjZGVmaW5lIEdFTjhfTVNHX1VSQl9HTE9CQUxfT0ZGU0VUX19TSElGVAkJCTQKKyNkZWZpbmUgR0VOOF9NU0dfVVJCX09QX19NQVNLCQkJCQkweDAwMDAwMDBmCisjZGVmaW5lIEdFTjhfTVNHX1VSQl9PUF9fU0hJRlQJCQkJCTAKKyNkZWZpbmUgR0VON19NU0dfUElfU0lNRF9fTUFTSwkJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBHRU43X01TR19QSV9TSU1EX19TSElGVAkJCQkJMTYKKyNkZWZpbmUgR0VON19NU0dfUElfTElORUFSX0lOVEVSUAkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBHRU43X01TR19QSV9PUF9fTUFTSwkJCQkJMHgwMDAwMzAwMAorI2RlZmluZSBHRU43X01TR19QSV9PUF9fU0hJRlQJCQkJCTEyCisjZGVmaW5lIEdFTjdfTVNHX1BJX1NMT1RHUlBfSEkJCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjdfTVNHX1BJX09GRlNFVF9ZX19NQVNLCQkJCTB4MDAwMDAwZjAKKyNkZWZpbmUgR0VON19NU0dfUElfT0ZGU0VUX1lfX1NISUZUCQkJCTQKKyNkZWZpbmUgR0VON19NU0dfUElfT0ZGU0VUX1hfX01BU0sJCQkJMHgwMDAwMDAwZgorI2RlZmluZSBHRU43X01TR19QSV9PRkZTRVRfWF9fU0hJRlQJCQkJMAorI2RlZmluZSBHRU43X01TR19QSV9TQU1QTEVfSU5ERVhfX01BU0sJCQkJMHgwMDAwMDBmMAorI2RlZmluZSBHRU43X01TR19QSV9TQU1QTEVfSU5ERVhfX1NISUZUCQkJCTQKKyNkZWZpbmUgR0VONl9NU0dfU0FNUExFUl9TSU1EX19NQVNLCQkJCTB4MDAwMzAwMDAKKyNkZWZpbmUgR0VONl9NU0dfU0FNUExFUl9TSU1EX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X01TR19TQU1QTEVSX09QX19NQVNLCQkJCTB4MDAwMGYwMDAKKyNkZWZpbmUgR0VONl9NU0dfU0FNUExFUl9PUF9fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VON19NU0dfU0FNUExFUl9TSU1EX19NQVNLCQkJCTB4MDAwNjAwMDAKKyNkZWZpbmUgR0VON19NU0dfU0FNUExFUl9TSU1EX19TSElGVAkJCQkxNworI2RlZmluZSBHRU43X01TR19TQU1QTEVSX09QX19NQVNLCQkJCTB4MDAwMWYwMDAKKyNkZWZpbmUgR0VON19NU0dfU0FNUExFUl9PUF9fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VONl9NU0dfU0FNUExFUl9JTkRFWF9fTUFTSwkJCQkweDAwMDAwZjAwCisjZGVmaW5lIEdFTjZfTVNHX1NBTVBMRVJfSU5ERVhfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VONl9NU0dfU0FNUExFUl9TVVJGQUNFX19NQVNLCQkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgR0VONl9NU0dfU0FNUExFUl9TVVJGQUNFX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjZfTVNHX0RQX1NFTkRfV1JJVEVfQ09NTUlUCQkJCSgweDEgPDwgMTcpCisjZGVmaW5lIEdFTjZfTVNHX0RQX09QX19NQVNLCQkJCQkweDAwMDFlMDAwCisjZGVmaW5lIEdFTjZfTVNHX0RQX09QX19TSElGVAkJCQkJMTMKKyNkZWZpbmUgR0VONl9NU0dfRFBfQ1RSTF9fTUFTSwkJCQkJMHgwMDAwMWYwMAorI2RlZmluZSBHRU42X01TR19EUF9DVFJMX19TSElGVAkJCQkJOAorI2RlZmluZSBHRU43X01TR19EUF9DQVRFR09SWQkJCQkJKDB4MSA8PCAxOCkKKyNkZWZpbmUgR0VON19NU0dfRFBfT1BfX01BU0sJCQkJCTB4MDAwM2MwMDAKKyNkZWZpbmUgR0VON19NU0dfRFBfT1BfX1NISUZUCQkJCQkxNAorI2RlZmluZSBHRU43X01TR19EUF9DVFJMX19NQVNLCQkJCQkweDAwMDAzZjAwCisjZGVmaW5lIEdFTjdfTVNHX0RQX0NUUkxfX1NISUZUCQkJCQk4CisjZGVmaW5lIEdFTjdfTVNHX0RQX09XT1JEX0JMT0NLX1JFQURfSU5WQUxJREFURQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIEdFTjZfTVNHX0RQX09XT1JEX0JMT0NLX1NJWkVfX01BU0sJCQkweDAwMDAwNzAwCisjZGVmaW5lIEdFTjZfTVNHX0RQX09XT1JEX0JMT0NLX1NJWkVfX1NISUZUCQkJOAorI2RlZmluZSBHRU42X01TR19EUF9PV09SRF9CTE9DS19TSVpFXzFfTE8JCQkoMHgwIDw8IDgpCisjZGVmaW5lIEdFTjZfTVNHX0RQX09XT1JEX0JMT0NLX1NJWkVfMV9ISQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfT1dPUkRfQkxPQ0tfU0laRV8yCQkJCSgweDIgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfT1dPUkRfQkxPQ0tfU0laRV80CQkJCSgweDMgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfT1dPUkRfQkxPQ0tfU0laRV84CQkJCSgweDQgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfVU5BTElHTkVEX09XT1JEX0JMT0NLX1NJWkVfX01BU0sJCTB4MDAwMDA3MDAKKyNkZWZpbmUgR0VONl9NU0dfRFBfVU5BTElHTkVEX09XT1JEX0JMT0NLX1NJWkVfX1NISUZUCQk4CisjZGVmaW5lIEdFTjZfTVNHX0RQX1VOQUxJR05FRF9PV09SRF9CTE9DS19TSVpFXzFfTE8JCSgweDAgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfVU5BTElHTkVEX09XT1JEX0JMT0NLX1NJWkVfMV9ISQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU42X01TR19EUF9VTkFMSUdORURfT1dPUkRfQkxPQ0tfU0laRV8yCQkoMHgyIDw8IDgpCisjZGVmaW5lIEdFTjZfTVNHX0RQX1VOQUxJR05FRF9PV09SRF9CTE9DS19TSVpFXzQJCSgweDMgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfVU5BTElHTkVEX09XT1JEX0JMT0NLX1NJWkVfOAkJKDB4NCA8PCA4KQorI2RlZmluZSBHRU43X01TR19EUF9PV09SRF9EVUFMX0JMT0NLX1JFQURfSU5WQUxJREFURQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgR0VONl9NU0dfRFBfT1dPUkRfRFVBTF9CTE9DS19TSVpFX19NQVNLCQkJMHgwMDAwMDMwMAorI2RlZmluZSBHRU42X01TR19EUF9PV09SRF9EVUFMX0JMT0NLX1NJWkVfX1NISUZUCQk4CisjZGVmaW5lIEdFTjZfTVNHX0RQX09XT1JEX0RVQUxfQkxPQ0tfU0laRV8xCQkJKDB4MCA8PCA4KQorI2RlZmluZSBHRU42X01TR19EUF9PV09SRF9EVUFMX0JMT0NLX1NJWkVfNAkJCSgweDIgPDwgOCkKKyNkZWZpbmUgR0VON19NU0dfRFBfRFdPUkRfU0NBVFRFUkVEX1JFQURfSU5WQUxJREFURQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgR0VONl9NU0dfRFBfRFdPUkRfU0NBVFRFUkVEX0JMT0NLX1NJWkVfX01BU0sJCTB4MDAwMDAzMDAKKyNkZWZpbmUgR0VONl9NU0dfRFBfRFdPUkRfU0NBVFRFUkVEX0JMT0NLX1NJWkVfX1NISUZUCQk4CisjZGVmaW5lIEdFTjZfTVNHX0RQX0RXT1JEX1NDQVRURVJFRF9CTE9DS19TSVpFXzgJCSgweDIgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfRFdPUkRfU0NBVFRFUkVEX0JMT0NLX1NJWkVfMTYJCSgweDMgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfQllURV9TQ0FUVEVSRURfREFUQV9TSVpFX19NQVNLCQkweDAwMDAwNjAwCisjZGVmaW5lIEdFTjZfTVNHX0RQX0JZVEVfU0NBVFRFUkVEX0RBVEFfU0laRV9fU0hJRlQJCTkKKyNkZWZpbmUgR0VONl9NU0dfRFBfQllURV9TQ0FUVEVSRURfREFUQV9TSVpFXzEJCQkoMHgwIDw8IDkpCisjZGVmaW5lIEdFTjZfTVNHX0RQX0JZVEVfU0NBVFRFUkVEX0RBVEFfU0laRV8yCQkJKDB4MSA8PCA5KQorI2RlZmluZSBHRU42X01TR19EUF9CWVRFX1NDQVRURVJFRF9EQVRBX1NJWkVfNAkJCSgweDIgPDwgOSkKKyNkZWZpbmUgR0VONl9NU0dfRFBfQllURV9TQ0FUVEVSRURfTU9ERV9fTUFTSwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR0VONl9NU0dfRFBfQllURV9TQ0FUVEVSRURfTU9ERV9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjZfTVNHX0RQX0JZVEVfU0NBVFRFUkVEX01PREVfU0lNRDgJCQkoMHgwIDw8IDgpCisjZGVmaW5lIEdFTjZfTVNHX0RQX0JZVEVfU0NBVFRFUkVEX01PREVfU0lNRDE2CQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU42X01TR19EUF9SVF9MQVNUCQkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBHRU42X01TR19EUF9SVF9TTE9UR1JQX0hJCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjZfTVNHX0RQX1JUX01PREVfX01BU0sJCQkJMHgwMDAwMDcwMAorI2RlZmluZSBHRU42X01TR19EUF9SVF9NT0RFX19TSElGVAkJCQk4CisjZGVmaW5lIEdFTjZfTVNHX0RQX1JUX01PREVfU0lNRDE2CQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfUlRfTU9ERV9TSU1EMTZfUkVQREFUQQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VONl9NU0dfRFBfUlRfTU9ERV9TSU1EOF9EVUFMU1JDX0xPCQkJKDB4MiA8PCA4KQorI2RlZmluZSBHRU42X01TR19EUF9SVF9NT0RFX1NJTUQ4X0RVQUxTUkNfSEkJCQkoMHgzIDw8IDgpCisjZGVmaW5lIEdFTjZfTVNHX0RQX1JUX01PREVfU0lNRDhfTE8JCQkJKDB4NCA8PCA4KQorI2RlZmluZSBHRU42X01TR19EUF9SVF9NT0RFX1NJTUQ4X0lNQUdFX1dSCQkJKDB4NSA8PCA4KQorI2RlZmluZSBHRU43X01TR19EUF9UWVBFRF9TTE9UR1JQX0hJCQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIEdFTjdfTVNHX0RQX1RZUEVEX01BU0tfX01BU0sJCQkJMHgwMDAwMGYwMAorI2RlZmluZSBHRU43X01TR19EUF9UWVBFRF9NQVNLX19TSElGVAkJCQk4CisjZGVmaW5lIEdFTjdfTVNHX0RQX1VOVFlQRURfTU9ERV9fTUFTSwkJCQkweDAwMDAzMDAwCisjZGVmaW5lIEdFTjdfTVNHX0RQX1VOVFlQRURfTU9ERV9fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VON19NU0dfRFBfVU5UWVBFRF9NT0RFX1NJTUQ0WDIJCQkoMHgwIDw8IDEyKQorI2RlZmluZSBHRU43X01TR19EUF9VTlRZUEVEX01PREVfU0lNRDE2CQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIEdFTjdfTVNHX0RQX1VOVFlQRURfTU9ERV9TSU1EOAkJCQkoMHgyIDw8IDEyKQorI2RlZmluZSBHRU43X01TR19EUF9VTlRZUEVEX01BU0tfX01BU0sJCQkJMHgwMDAwMGYwMAorI2RlZmluZSBHRU43X01TR19EUF9VTlRZUEVEX01BU0tfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VON19NU0dfRFBfQVRPTUlDX1JFVFVSTl9EQVRBX0VOQUJMRQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIEdFTjdfTVNHX0RQX0FUT01JQ19UWVBFRF9TTE9UR1JQX0hJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgR0VON19NU0dfRFBfQVRPTUlDX1VOVFlQRURfTU9ERV9fTUFTSwkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgR0VON19NU0dfRFBfQVRPTUlDX1VOVFlQRURfTU9ERV9fU0hJRlQJCQkxMgorI2RlZmluZSBHRU43X01TR19EUF9BVE9NSUNfVU5UWVBFRF9NT0RFX1NJTUQxNgkJCSgweDAgPDwgMTIpCisjZGVmaW5lIEdFTjdfTVNHX0RQX0FUT01JQ19VTlRZUEVEX01PREVfU0lNRDgJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBHRU43X01TR19EUF9BVE9NSUNfT1BfX01BU0sJCQkJMHgwMDAwMGYwMAorI2RlZmluZSBHRU43X01TR19EUF9BVE9NSUNfT1BfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VONl9NU0dfRFBfU1VSRkFDRV9fTUFTSwkJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjZfTVNHX0RQX1NVUkZBQ0VfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9NU0dfVFNfUkVTT1VSQ0VfU0VMRUNUX19NQVNLCQkJMHgwMDAwMDAxMAorI2RlZmluZSBHRU42X01TR19UU19SRVNPVVJDRV9TRUxFQ1RfX1NISUZUCQkJNAorI2RlZmluZSBHRU42X01TR19UU19SRVNPVVJDRV9TRUxFQ1RfQ0hJTEQJCQkoMHgwIDw8IDQpCisjZGVmaW5lIEdFTjZfTVNHX1RTX1JFU09VUkNFX1NFTEVDVF9ST09UCQkJKDB4MSA8PCA0KQorI2RlZmluZSBHRU42X01TR19UU19SRVNPVVJDRV9TRUxFQ1RfREVSRUYJCQkoMHgwIDw8IDQpCisjZGVmaW5lIEdFTjZfTVNHX1RTX1JFU09VUkNFX1NFTEVDVF9OT19ERVJFRgkJCSgweDEgPDwgNCkKKyNkZWZpbmUgR0VONl9NU0dfVFNfUkVRVUVTVEVSX1RZUEVfX01BU0sJCQkweDAwMDAwMDAyCisjZGVmaW5lIEdFTjZfTVNHX1RTX1JFUVVFU1RFUl9UWVBFX19TSElGVAkJCTEKKyNkZWZpbmUgR0VONl9NU0dfVFNfUkVRVUVTVEVSX1RZUEVfUk9PVAkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIEdFTjZfTVNHX1RTX1JFUVVFU1RFUl9UWVBFX0NISUxECQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU42X01TR19UU19PUENPREVfX01BU0sJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBHRU42X01TR19UU19PUENPREVfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9NU0dfVFNfT1BDT0RFX0RFUkVGCQkJCTB4MAorI2RlZmluZSBHRU42X01TR19UU19PUENPREVfU1BBV04JCQkJMHgxCisKKyNlbmRpZiAvKiBHRU5fRVVfTUVTU0FHRV9YTUwgKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9nZW5ody9nZW5fbWkueG1sLmggYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX21pLnhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDcyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX21pLnhtbC5oCkBAIC0wLDAgKzEsMjYxIEBACisjaWZuZGVmIEdFTl9NSV9YTUwKKyNkZWZpbmUgR0VOX01JX1hNTAorCisvKiBBdXRvZ2VuZXJhdGVkIGZpbGUsIERPIE5PVCBFRElUIG1hbnVhbGx5IQorCitUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgcnVsZXMtbmctbmcgaGVhZGVyZ2VuIHRvb2wgaW4gdGhpcyBnaXQgcmVwb3NpdG9yeToKK2h0dHBzOi8vZ2l0aHViLmNvbS9vbHZhZmZlL2Vudnl0b29scy8KK2dpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vb2x2YWZmZS9lbnZ5dG9vbHMuZ2l0CisKK0NvcHlyaWdodCAoQykgMjAxNC0yMDE1IGJ5IHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKy0gQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4gKG9sdikKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKworZW51bSBnZW5fbWlfYWx1X29wY29kZSB7CisgICAgR0VONzVfTUlfQUxVX05PT1AJCQkJCSAgICAgID0gMHgwLAorICAgIEdFTjc1X01JX0FMVV9MT0FECQkJCQkgICAgICA9IDB4ODAsCisgICAgR0VONzVfTUlfQUxVX0xPQURJTlYJCQkJICAgICAgPSAweDQ4MCwKKyAgICBHRU43NV9NSV9BTFVfTE9BRDAJCQkJCSAgICAgID0gMHg4MSwKKyAgICBHRU43NV9NSV9BTFVfTE9BRDEJCQkJCSAgICAgID0gMHg0ODEsCisgICAgR0VONzVfTUlfQUxVX0FERAkJCQkJICAgICAgPSAweDEwMCwKKyAgICBHRU43NV9NSV9BTFVfU1VCCQkJCQkgICAgICA9IDB4MTAxLAorICAgIEdFTjc1X01JX0FMVV9BTkQJCQkJCSAgICAgID0gMHgxMDIsCisgICAgR0VONzVfTUlfQUxVX09SCQkJCQkgICAgICA9IDB4MTAzLAorICAgIEdFTjc1X01JX0FMVV9YT1IJCQkJCSAgICAgID0gMHgxMDQsCisgICAgR0VONzVfTUlfQUxVX1NUT1JFCQkJCQkgICAgICA9IDB4MTgwLAorICAgIEdFTjc1X01JX0FMVV9TVE9SRUlOVgkJCQkgICAgICA9IDB4NTgwLAorfTsKKworZW51bSBnZW5fbWlfYWx1X29wZXJhbmQgeworICAgIEdFTjc1X01JX0FMVV9SMAkJCQkJICAgICAgPSAweDAsCisgICAgR0VONzVfTUlfQUxVX1IxCQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU43NV9NSV9BTFVfUjIJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjc1X01JX0FMVV9SMwkJCQkJICAgICAgPSAweDMsCisgICAgR0VONzVfTUlfQUxVX1I0CQkJCQkgICAgICA9IDB4NCwKKyAgICBHRU43NV9NSV9BTFVfUjUJCQkJCSAgICAgID0gMHg1LAorICAgIEdFTjc1X01JX0FMVV9SNgkJCQkJICAgICAgPSAweDYsCisgICAgR0VONzVfTUlfQUxVX1I3CQkJCQkgICAgICA9IDB4NywKKyAgICBHRU43NV9NSV9BTFVfUjgJCQkJCSAgICAgID0gMHg4LAorICAgIEdFTjc1X01JX0FMVV9SOQkJCQkJICAgICAgPSAweDksCisgICAgR0VONzVfTUlfQUxVX1IxMAkJCQkJICAgICAgPSAweGEsCisgICAgR0VONzVfTUlfQUxVX1IxMQkJCQkJICAgICAgPSAweGIsCisgICAgR0VONzVfTUlfQUxVX1IxMgkJCQkJICAgICAgPSAweGMsCisgICAgR0VONzVfTUlfQUxVX1IxMwkJCQkJICAgICAgPSAweGQsCisgICAgR0VONzVfTUlfQUxVX1IxNAkJCQkJICAgICAgPSAweGUsCisgICAgR0VONzVfTUlfQUxVX1IxNQkJCQkJICAgICAgPSAweGYsCisgICAgR0VONzVfTUlfQUxVX1NSQ0EJCQkJCSAgICAgID0gMHgyMCwKKyAgICBHRU43NV9NSV9BTFVfU1JDQgkJCQkJICAgICAgPSAweDIxLAorICAgIEdFTjc1X01JX0FMVV9BQ0NVCQkJCQkgICAgICA9IDB4MzEsCisgICAgR0VONzVfTUlfQUxVX1pGCQkJCQkgICAgICA9IDB4MzIsCisgICAgR0VONzVfTUlfQUxVX0NGCQkJCQkgICAgICA9IDB4MzMsCit9OworCisjZGVmaW5lIEdFTjZfTUlfVFlQRV9fTUFTSwkJCQkJMHhlMDAwMDAwMAorI2RlZmluZSBHRU42X01JX1RZUEVfX1NISUZUCQkJCQkyOQorI2RlZmluZSBHRU42X01JX1RZUEVfTUkJCQkJCQkoMHgwIDw8IDI5KQorI2RlZmluZSBHRU42X01JX09QQ09ERV9fTUFTSwkJCQkJMHgxZjgwMDAwMAorI2RlZmluZSBHRU42X01JX09QQ09ERV9fU0hJRlQJCQkJCTIzCisjZGVmaW5lIEdFTjZfTUlfT1BDT0RFX01JX05PT1AJCQkJCSgweDAgPDwgMjMpCisjZGVmaW5lIEdFTjc1X01JX09QQ09ERV9NSV9TRVRfUFJFRElDQVRFCQkJKDB4MSA8PCAyMykKKyNkZWZpbmUgR0VONzVfTUlfT1BDT0RFX01JX1JTX0NPTlRST0wJCQkJKDB4NiA8PCAyMykKKyNkZWZpbmUgR0VONzVfTUlfT1BDT0RFX01JX1VSQl9BVE9NSUNfQUxMT0MJCQkoMHg5IDw8IDIzKQorI2RlZmluZSBHRU42X01JX09QQ09ERV9NSV9CQVRDSF9CVUZGRVJfRU5ECQkJKDB4YSA8PCAyMykKKyNkZWZpbmUgR0VON19NSV9PUENPREVfTUlfUFJFRElDQVRFCQkJCSgweGMgPDwgMjMpCisjZGVmaW5lIEdFTjdfTUlfT1BDT0RFX01JX1VSQl9DTEVBUgkJCQkoMHgxOSA8PCAyMykKKyNkZWZpbmUgR0VONzVfTUlfT1BDT0RFX01JX01BVEgJCQkJCSgweDFhIDw8IDIzKQorI2RlZmluZSBHRU42X01JX09QQ09ERV9NSV9TVE9SRV9EQVRBX0lNTQkJCSgweDIwIDw8IDIzKQorI2RlZmluZSBHRU42X01JX09QQ09ERV9NSV9MT0FEX1JFR0lTVEVSX0lNTQkJCSgweDIyIDw8IDIzKQorI2RlZmluZSBHRU42X01JX09QQ09ERV9NSV9TVE9SRV9SRUdJU1RFUl9NRU0JCQkoMHgyNCA8PCAyMykKKyNkZWZpbmUgR0VONl9NSV9PUENPREVfTUlfRkxVU0hfRFcJCQkJKDB4MjYgPDwgMjMpCisjZGVmaW5lIEdFTjZfTUlfT1BDT0RFX01JX1JFUE9SVF9QRVJGX0NPVU5UCQkJKDB4MjggPDwgMjMpCisjZGVmaW5lIEdFTjdfTUlfT1BDT0RFX01JX0xPQURfUkVHSVNURVJfTUVNCQkJKDB4MjkgPDwgMjMpCisjZGVmaW5lIEdFTjc1X01JX09QQ09ERV9NSV9MT0FEX1JFR0lTVEVSX1JFRwkJCSgweDJhIDw8IDIzKQorI2RlZmluZSBHRU43NV9NSV9PUENPREVfTUlfTE9BRF9VUkJfTUVNCQkJCSgweDJjIDw8IDIzKQorI2RlZmluZSBHRU43NV9NSV9PUENPREVfTUlfU1RPUkVfVVJCX01FTQkJCSgweDJkIDw8IDIzKQorI2RlZmluZSBHRU42X01JX09QQ09ERV9NSV9CQVRDSF9CVUZGRVJfU1RBUlQJCQkoMHgzMSA8PCAyMykKKyNkZWZpbmUgR0VONl9NSV9MRU5HVEhfX01BU0sJCQkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgR0VONl9NSV9MRU5HVEhfX1NISUZUCQkJCQkwCisjZGVmaW5lIEdFTjZfTUlfTk9PUF9fU0laRQkJCQkJMQorCisjZGVmaW5lIEdFTjc1X01JX1NFVF9QUkVESUNBVEVfX1NJWkUJCQkJMQorI2RlZmluZSBHRU43NV9NSV9TRVRfUFJFRElDQVRFX0RXMF9QUkVESUNBVEVfX01BU0sJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR0VONzVfTUlfU0VUX1BSRURJQ0FURV9EVzBfUFJFRElDQVRFX19TSElGVAkJMAorI2RlZmluZSBHRU43NV9NSV9TRVRfUFJFRElDQVRFX0RXMF9QUkVESUNBVEVfQUxXQVlTCQkweDAKKyNkZWZpbmUgR0VONzVfTUlfU0VUX1BSRURJQ0FURV9EVzBfUFJFRElDQVRFX09OX0NMRUFSCQkweDEKKyNkZWZpbmUgR0VONzVfTUlfU0VUX1BSRURJQ0FURV9EVzBfUFJFRElDQVRFX09OX1NFVAkJMHgyCisjZGVmaW5lIEdFTjc1X01JX1NFVF9QUkVESUNBVEVfRFcwX1BSRURJQ0FURV9ESVNBQkxFCQkweDMKKworI2RlZmluZSBHRU43NV9NSV9SU19DT05UUk9MX19TSVpFCQkJCTEKKyNkZWZpbmUgR0VONzVfTUlfUlNfQ09OVFJPTF9EVzBfRU5BQkxFCQkJCSgweDEgPDwgMCkKKworI2RlZmluZSBHRU43NV9NSV9VUkJfQVRPTUlDX0FMTE9DX19TSVpFCQkJCTEKKyNkZWZpbmUgR0VONzVfTUlfVVJCX0FUT01JQ19BTExPQ19EVzBfT0ZGU0VUX19NQVNLCQkweDAwMGZmMDAwCisjZGVmaW5lIEdFTjc1X01JX1VSQl9BVE9NSUNfQUxMT0NfRFcwX09GRlNFVF9fU0hJRlQJCTEyCisjZGVmaW5lIEdFTjc1X01JX1VSQl9BVE9NSUNfQUxMT0NfRFcwX1NJWkVfX01BU0sJCTB4MDAwMDAxZmYKKyNkZWZpbmUgR0VONzVfTUlfVVJCX0FUT01JQ19BTExPQ19EVzBfU0laRV9fU0hJRlQJCTAKKworI2RlZmluZSBHRU42X01JX0JBVENIX0JVRkZFUl9FTkRfX1NJWkUJCQkJMQorCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX19TSVpFCQkJCQkxCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX0RXMF9MT0FET1BfX01BU0sJCQkweDAwMDAwMGMwCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX0RXMF9MT0FET1BfX1NISUZUCQkJNgorI2RlZmluZSBHRU43X01JX1BSRURJQ0FURV9EVzBfTE9BRE9QX0tFRVAJCQkoMHgwIDw8IDYpCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX0RXMF9MT0FET1BfTE9BRAkJCSgweDIgPDwgNikKKyNkZWZpbmUgR0VON19NSV9QUkVESUNBVEVfRFcwX0xPQURPUF9MT0FESU5WCQkJKDB4MyA8PCA2KQorI2RlZmluZSBHRU43X01JX1BSRURJQ0FURV9EVzBfQ09NQklORU9QX19NQVNLCQkJMHgwMDAwMDAxOAorI2RlZmluZSBHRU43X01JX1BSRURJQ0FURV9EVzBfQ09NQklORU9QX19TSElGVAkJCTMKKyNkZWZpbmUgR0VON19NSV9QUkVESUNBVEVfRFcwX0NPTUJJTkVPUF9TRVQJCQkoMHgwIDw8IDMpCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX0RXMF9DT01CSU5FT1BfQU5ECQkJKDB4MSA8PCAzKQorI2RlZmluZSBHRU43X01JX1BSRURJQ0FURV9EVzBfQ09NQklORU9QX09SCQkJKDB4MiA8PCAzKQorI2RlZmluZSBHRU43X01JX1BSRURJQ0FURV9EVzBfQ09NQklORU9QX1hPUgkJCSgweDMgPDwgMykKKyNkZWZpbmUgR0VON19NSV9QUkVESUNBVEVfRFcwX0NPTVBBUkVPUF9fTUFTSwkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR0VON19NSV9QUkVESUNBVEVfRFcwX0NPTVBBUkVPUF9fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX0RXMF9DT01QQVJFT1BfVFJVRQkJCTB4MAorI2RlZmluZSBHRU43X01JX1BSRURJQ0FURV9EVzBfQ09NUEFSRU9QX0ZBTFNFCQkJMHgxCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX0RXMF9DT01QQVJFT1BfU1JDU19FUVVBTAkJMHgyCisjZGVmaW5lIEdFTjdfTUlfUFJFRElDQVRFX0RXMF9DT01QQVJFT1BfREVMVEFTX0VRVUFMCQkweDMKKworI2RlZmluZSBHRU43X01JX1VSQl9DTEVBUl9fU0laRQkJCQkJMgorCisjZGVmaW5lIEdFTjdfTUlfVVJCX0NMRUFSX0RXMV9MRU5HVEhfX01BU0sJCQkweDNmZmYwMDAwCisjZGVmaW5lIEdFTjdfTUlfVVJCX0NMRUFSX0RXMV9MRU5HVEhfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VON19NSV9VUkJfQ0xFQVJfRFcxX09GRlNFVF9fTUFTSwkJCTB4MDAwMDdmZmYKKyNkZWZpbmUgR0VON19NSV9VUkJfQ0xFQVJfRFcxX09GRlNFVF9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VONzVfTUlfTUFUSF9fU0laRQkJCQkJNjUKKworI2RlZmluZSBHRU43NV9NSV9NQVRIX0RXX09QX19NQVNLCQkJCTB4ZmZmMDAwMDAKKyNkZWZpbmUgR0VONzVfTUlfTUFUSF9EV19PUF9fU0hJRlQJCQkJMjAKKyNkZWZpbmUgR0VONzVfTUlfTUFUSF9EV19TUkMxX19NQVNLCQkJCTB4MDAwZmZjMDAKKyNkZWZpbmUgR0VONzVfTUlfTUFUSF9EV19TUkMxX19TSElGVAkJCQkxMAorI2RlZmluZSBHRU43NV9NSV9NQVRIX0RXX1NSQzJfX01BU0sJCQkJMHgwMDAwMDdmZgorI2RlZmluZSBHRU43NV9NSV9NQVRIX0RXX1NSQzJfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU42X01JX1NUT1JFX0RBVEFfSU1NX19TSVpFCQkJCTYKKyNkZWZpbmUgR0VONl9NSV9TVE9SRV9EQVRBX0lNTV9EVzBfVVNFX0dHVFQJCQkoMHgxIDw8IDIyKQorCisKKyNkZWZpbmUgR0VONl9NSV9TVE9SRV9EQVRBX0lNTV9EVzJfQUREUl9fTUFTSwkJCTB4ZmZmZmZmZmMKKyNkZWZpbmUgR0VONl9NSV9TVE9SRV9EQVRBX0lNTV9EVzJfQUREUl9fU0hJRlQJCQkyCisjZGVmaW5lIEdFTjZfTUlfU1RPUkVfREFUQV9JTU1fRFcyX0FERFJfX1NIUgkJCTIKKworCisKKworI2RlZmluZSBHRU42X01JX0xPQURfUkVHSVNURVJfSU1NX19TSVpFCQkJCTMKKyNkZWZpbmUgR0VONl9NSV9MT0FEX1JFR0lTVEVSX0lNTV9EVzBfV1JJVEVfRElTQUJMRVNfX01BU0sJMHgwMDAwMGYwMAorI2RlZmluZSBHRU42X01JX0xPQURfUkVHSVNURVJfSU1NX0RXMF9XUklURV9ESVNBQkxFU19fU0hJRlQJOAorCisjZGVmaW5lIEdFTjZfTUlfTE9BRF9SRUdJU1RFUl9JTU1fRFcxX1JFR19fTUFTSwkJCTB4MDA3ZmZmZmMKKyNkZWZpbmUgR0VONl9NSV9MT0FEX1JFR0lTVEVSX0lNTV9EVzFfUkVHX19TSElGVAkJMgorI2RlZmluZSBHRU42X01JX0xPQURfUkVHSVNURVJfSU1NX0RXMV9SRUdfX1NIUgkJCTIKKworCisjZGVmaW5lIEdFTjZfTUlfU1RPUkVfUkVHSVNURVJfTUVNX19TSVpFCQkJNAorI2RlZmluZSBHRU42X01JX1NUT1JFX1JFR0lTVEVSX01FTV9EVzBfVVNFX0dHVFQJCQkoMHgxIDw8IDIyKQorI2RlZmluZSBHRU43NV9NSV9TVE9SRV9SRUdJU1RFUl9NRU1fRFcwX1BSRURJQ0FURV9FTkFCTEUJKDB4MSA8PCAyMSkKKworI2RlZmluZSBHRU42X01JX1NUT1JFX1JFR0lTVEVSX01FTV9EVzFfUkVHX19NQVNLCQkweDAwN2ZmZmZjCisjZGVmaW5lIEdFTjZfTUlfU1RPUkVfUkVHSVNURVJfTUVNX0RXMV9SRUdfX1NISUZUCQkyCisjZGVmaW5lIEdFTjZfTUlfU1RPUkVfUkVHSVNURVJfTUVNX0RXMV9SRUdfX1NIUgkJCTIKKworI2RlZmluZSBHRU42X01JX1NUT1JFX1JFR0lTVEVSX01FTV9EVzJfQUREUl9fTUFTSwkJMHhmZmZmZmZmYworI2RlZmluZSBHRU42X01JX1NUT1JFX1JFR0lTVEVSX01FTV9EVzJfQUREUl9fU0hJRlQJCTIKKyNkZWZpbmUgR0VONl9NSV9TVE9SRV9SRUdJU1RFUl9NRU1fRFcyX0FERFJfX1NIUgkJMgorCisKKyNkZWZpbmUgR0VONl9NSV9GTFVTSF9EV19fU0laRQkJCQkJNAorCisKKworCisjZGVmaW5lIEdFTjZfTUlfUkVQT1JUX1BFUkZfQ09VTlRfX1NJWkUJCQkJMworCisjZGVmaW5lIEdFTjZfTUlfUkVQT1JUX1BFUkZfQ09VTlRfRFcxX0NPUkVfTU9ERV9FTkFCTEUJCSgweDEgPDwgNCkKKyNkZWZpbmUgR0VONl9NSV9SRVBPUlRfUEVSRl9DT1VOVF9EVzFfVVNFX0dHVFQJCQkoMHgxIDw8IDApCisjZGVmaW5lIEdFTjZfTUlfUkVQT1JUX1BFUkZfQ09VTlRfRFcxX0FERFJfX01BU0sJCTB4ZmZmZmZmYzAKKyNkZWZpbmUgR0VONl9NSV9SRVBPUlRfUEVSRl9DT1VOVF9EVzFfQUREUl9fU0hJRlQJCTYKKyNkZWZpbmUgR0VONl9NSV9SRVBPUlRfUEVSRl9DT1VOVF9EVzFfQUREUl9fU0hSCQkJNgorCisKKyNkZWZpbmUgR0VON19NSV9MT0FEX1JFR0lTVEVSX01FTV9fU0laRQkJCQk0CisjZGVmaW5lIEdFTjdfTUlfTE9BRF9SRUdJU1RFUl9NRU1fRFcwX1VTRV9HR1RUCQkJKDB4MSA8PCAyMikKKyNkZWZpbmUgR0VON19NSV9MT0FEX1JFR0lTVEVSX01FTV9EVzBfQVNZTkNfTU9ERV9FTkFCTEUJCSgweDEgPDwgMjEpCisKKyNkZWZpbmUgR0VON19NSV9MT0FEX1JFR0lTVEVSX01FTV9EVzFfUkVHX19NQVNLCQkJMHgwMDdmZmZmYworI2RlZmluZSBHRU43X01JX0xPQURfUkVHSVNURVJfTUVNX0RXMV9SRUdfX1NISUZUCQkyCisjZGVmaW5lIEdFTjdfTUlfTE9BRF9SRUdJU1RFUl9NRU1fRFcxX1JFR19fU0hSCQkJMgorCisjZGVmaW5lIEdFTjdfTUlfTE9BRF9SRUdJU1RFUl9NRU1fRFcyX0FERFJfX01BU0sJCTB4ZmZmZmZmZmMKKyNkZWZpbmUgR0VON19NSV9MT0FEX1JFR0lTVEVSX01FTV9EVzJfQUREUl9fU0hJRlQJCTIKKyNkZWZpbmUgR0VON19NSV9MT0FEX1JFR0lTVEVSX01FTV9EVzJfQUREUl9fU0hSCQkJMgorCisKKyNkZWZpbmUgR0VONzVfTUlfTE9BRF9SRUdJU1RFUl9SRUdfX1NJWkUJCQkzCisKKyNkZWZpbmUgR0VONzVfTUlfTE9BRF9SRUdJU1RFUl9SRUdfRFcxX1NSQ19SRUdfX01BU0sJCTB4MDA3ZmZmZmMKKyNkZWZpbmUgR0VONzVfTUlfTE9BRF9SRUdJU1RFUl9SRUdfRFcxX1NSQ19SRUdfX1NISUZUCQkyCisjZGVmaW5lIEdFTjc1X01JX0xPQURfUkVHSVNURVJfUkVHX0RXMV9TUkNfUkVHX19TSFIJCTIKKworI2RlZmluZSBHRU43NV9NSV9MT0FEX1JFR0lTVEVSX1JFR19EVzJfRFNUX1JFR19fTUFTSwkJMHgwMDdmZmZmYworI2RlZmluZSBHRU43NV9NSV9MT0FEX1JFR0lTVEVSX1JFR19EVzJfRFNUX1JFR19fU0hJRlQJCTIKKyNkZWZpbmUgR0VONzVfTUlfTE9BRF9SRUdJU1RFUl9SRUdfRFcyX0RTVF9SRUdfX1NIUgkJMgorCisjZGVmaW5lIEdFTjc1X01JX0xPQURfVVJCX01FTV9fU0laRQkJCQk0CisKKyNkZWZpbmUgR0VONzVfTUlfTE9BRF9VUkJfTUVNX0RXMV9BRERSX19NQVNLCQkJMHgwMDAwN2ZmYworI2RlZmluZSBHRU43NV9NSV9MT0FEX1VSQl9NRU1fRFcxX0FERFJfX1NISUZUCQkJMgorI2RlZmluZSBHRU43NV9NSV9MT0FEX1VSQl9NRU1fRFcxX0FERFJfX1NIUgkJCTIKKworI2RlZmluZSBHRU43NV9NSV9MT0FEX1VSQl9NRU1fRFcyX0FERFJfX01BU0sJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjc1X01JX0xPQURfVVJCX01FTV9EVzJfQUREUl9fU0hJRlQJCQk2CisjZGVmaW5lIEdFTjc1X01JX0xPQURfVVJCX01FTV9EVzJfQUREUl9fU0hSCQkJNgorCisKKyNkZWZpbmUgR0VONzVfTUlfU1RPUkVfVVJCX01FTV9fU0laRQkJCQk0CisKKyNkZWZpbmUgR0VONzVfTUlfU1RPUkVfVVJCX01FTV9EVzFfQUREUl9fTUFTSwkJCTB4MDAwMDdmZmMKKyNkZWZpbmUgR0VONzVfTUlfU1RPUkVfVVJCX01FTV9EVzFfQUREUl9fU0hJRlQJCQkyCisjZGVmaW5lIEdFTjc1X01JX1NUT1JFX1VSQl9NRU1fRFcxX0FERFJfX1NIUgkJCTIKKworI2RlZmluZSBHRU43NV9NSV9TVE9SRV9VUkJfTUVNX0RXMl9BRERSX19NQVNLCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU43NV9NSV9TVE9SRV9VUkJfTUVNX0RXMl9BRERSX19TSElGVAkJCTYKKyNkZWZpbmUgR0VONzVfTUlfU1RPUkVfVVJCX01FTV9EVzJfQUREUl9fU0hSCQkJNgorCisKKyNkZWZpbmUgR0VONl9NSV9CQVRDSF9CVUZGRVJfU1RBUlRfX1NJWkUJCQkzCisjZGVmaW5lIEdFTjc1X01JX0JBVENIX0JVRkZFUl9TVEFSVF9EVzBfU0VDT05EX0xFVkVMCQkoMHgxIDw8IDIyKQorI2RlZmluZSBHRU43NV9NSV9CQVRDSF9CVUZGRVJfU1RBUlRfRFcwX0FERF9PRkZTRVRfRU5BQkxFCSgweDEgPDwgMTYpCisjZGVmaW5lIEdFTjc1X01JX0JBVENIX0JVRkZFUl9TVEFSVF9EVzBfUFJFRElDQVRJT05fRU5BQkxFCSgweDEgPDwgMTUpCisjZGVmaW5lIEdFTjc1X01JX0JBVENIX0JVRkZFUl9TVEFSVF9EVzBfTk9OX1BSSVZJTEVHRUQJCSgweDEgPDwgMTMpCisjZGVmaW5lIEdFTjZfTUlfQkFUQ0hfQlVGRkVSX1NUQVJUX0RXMF9DTEVBUl9DT01NQU5EX0JVRkZFUgkoMHgxIDw8IDExKQorI2RlZmluZSBHRU42X01JX0JBVENIX0JVRkZFUl9TVEFSVF9EVzBfVVNFX1BQR1RUCQkoMHgxIDw8IDgpCisKKyNkZWZpbmUgR0VONl9NSV9CQVRDSF9CVUZGRVJfU1RBUlRfRFcxX0FERFJfX01BU0sJCTB4ZmZmZmZmZmMKKyNkZWZpbmUgR0VONl9NSV9CQVRDSF9CVUZGRVJfU1RBUlRfRFcxX0FERFJfX1NISUZUCQkyCisjZGVmaW5lIEdFTjZfTUlfQkFUQ0hfQlVGRkVSX1NUQVJUX0RXMV9BRERSX19TSFIJCTIKKworCisKKyNlbmRpZiAvKiBHRU5fTUlfWE1MICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZ2VuaHcvZ2VuX3JlZ3MueG1sLmggYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX3JlZ3MueG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkZDcyYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9nZW5ody9nZW5fcmVncy54bWwuaApAQCAtMCwwICsxLDE3MiBAQAorI2lmbmRlZiBHRU5fUkVHU19YTUwKKyNkZWZpbmUgR0VOX1JFR1NfWE1MCisKKy8qIEF1dG9nZW5lcmF0ZWQgZmlsZSwgRE8gTk9UIEVESVQgbWFudWFsbHkhCisKK1RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBydWxlcy1uZy1uZyBoZWFkZXJnZW4gdG9vbCBpbiB0aGlzIGdpdCByZXBvc2l0b3J5OgoraHR0cHM6Ly9naXRodWIuY29tL29sdmFmZmUvZW52eXRvb2xzLworZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9vbHZhZmZlL2Vudnl0b29scy5naXQKKworQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorLSBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPiAob2x2KQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKK25leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCitwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCisjZGVmaW5lIEdFTjZfUkVHX01BU0tfX01BU0sJCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9SRUdfTUFTS19fU0hJRlQJCQkJCTE2CisjZGVmaW5lIEdFTjZfUkVHX19TSVpFCQkJCQkJMHg0MDAwMDAKKyNkZWZpbmUgR0VON19SRUdfSFNfSU5WT0NBVElPTl9DT1VOVAkJCQkweDIzMDAKKworI2RlZmluZSBHRU43X1JFR19EU19JTlZPQ0FUSU9OX0NPVU5UCQkJCTB4MjMwOAorCisjZGVmaW5lIEdFTjZfUkVHX0lBX1ZFUlRJQ0VTX0NPVU5UCQkJCTB4MjMxMAorCisjZGVmaW5lIEdFTjZfUkVHX0lBX1BSSU1JVElWRVNfQ09VTlQJCQkJMHgyMzE4CisKKyNkZWZpbmUgR0VONl9SRUdfVlNfSU5WT0NBVElPTl9DT1VOVAkJCQkweDIzMjAKKworI2RlZmluZSBHRU42X1JFR19HU19JTlZPQ0FUSU9OX0NPVU5UCQkJCTB4MjMyOAorCisjZGVmaW5lIEdFTjZfUkVHX0dTX1BSSU1JVElWRVNfQ09VTlQJCQkJMHgyMzMwCisKKyNkZWZpbmUgR0VONl9SRUdfQ0xfSU5WT0NBVElPTl9DT1VOVAkJCQkweDIzMzgKKworI2RlZmluZSBHRU42X1JFR19DTF9QUklNSVRJVkVTX0NPVU5UCQkJCTB4MjM0MAorCisjZGVmaW5lIEdFTjZfUkVHX1BTX0lOVk9DQVRJT05fQ09VTlQJCQkJMHgyMzQ4CisKKyNkZWZpbmUgR0VONl9SRUdfUFNfREVQVEhfQ09VTlQJCQkJCTB4MjM1MAorCisjZGVmaW5lIEdFTjZfUkVHX1RJTUVTVEFNUAkJCQkJMHgyMzU4CisKKyNkZWZpbmUgR0VONl9SRUdfT0FDT05UUk9MCQkJCQkweDIzNjAKKyNkZWZpbmUgR0VONl9SRUdfT0FDT05UUk9MX0NPVU5URVJfU0VMRUNUX19NQVNLCQkJMHgwMDAwMDAxYworI2RlZmluZSBHRU42X1JFR19PQUNPTlRST0xfQ09VTlRFUl9TRUxFQ1RfX1NISUZUCQkyCisjZGVmaW5lIEdFTjZfUkVHX09BQ09OVFJPTF9QRVJGT1JNQU5DRV9DT1VOVEVSX0VOQUJMRQkJKDB4MSA8PCAwKQorCisKKyNkZWZpbmUgR0VON19SRUdfTUlfUFJFRElDQVRFX1NSQzAJCQkJMHgyNDAwCisKKyNkZWZpbmUgR0VON19SRUdfTUlfUFJFRElDQVRFX1NSQzEJCQkJMHgyNDA4CisKKyNkZWZpbmUgR0VON19SRUdfTUlfUFJFRElDQVRFX0RBVEEJCQkJMHgyNDEwCisKKyNkZWZpbmUgR0VON19SRUdfTUlfUFJFRElDQVRFX1JFU1VMVAkJCQkweDI0MTgKKworI2RlZmluZSBHRU43NV9SRUdfTUlfUFJFRElDQVRFX1JFU1VMVF8xCQkJCTB4MjQxYworCisjZGVmaW5lIEdFTjc1X1JFR19NSV9QUkVESUNBVEVfUkVTVUxUXzIJCQkJMHgyMjE0CisKKyNkZWZpbmUgR0VON19SRUdfM0RQUklNX0VORF9PRkZTRVQJCQkJMHgyNDIwCisKKyNkZWZpbmUgR0VON19SRUdfM0RQUklNX1NUQVJUX1ZFUlRFWAkJCQkweDI0MzAKKworI2RlZmluZSBHRU43X1JFR18zRFBSSU1fVkVSVEVYX0NPVU5UCQkJCTB4MjQzNAorCisjZGVmaW5lIEdFTjdfUkVHXzNEUFJJTV9JTlNUQU5DRV9DT1VOVAkJCQkweDI0MzgKKworI2RlZmluZSBHRU43X1JFR18zRFBSSU1fU1RBUlRfSU5TVEFOQ0UJCQkJMHgyNDNjCisKKyNkZWZpbmUgR0VON19SRUdfM0RQUklNX0JBU0VfVkVSVEVYCQkJCTB4MjQ0MAorCisjZGVmaW5lIEdFTjc1X1JFR19DU19HUFIoaTApCQkJCQkoMHgyNjAwICsgMHg4KihpMCkpCisjZGVmaW5lIEdFTjc1X1JFR19DU19HUFJfX0VTSVpFCQkJCQkweDgKKyNkZWZpbmUgR0VONzVfUkVHX0NTX0dQUl9fTEVOCQkJCQkweDEwCisKKworI2RlZmluZSBHRU42X1JFR19TT19QUklNX1NUT1JBR0VfTkVFREVECQkJCTB4MjI4MAorCisjZGVmaW5lIEdFTjZfUkVHX1NPX05VTV9QUklNU19XUklUVEVOCQkJCTB4MjI4OAorCisKKyNkZWZpbmUgR0VON19SRUdfU09fTlVNX1BSSU1TX1dSSVRURU4oaTApCQkJKDB4NTIwMCArIDB4OCooaTApKQorI2RlZmluZSBHRU43X1JFR19TT19OVU1fUFJJTVNfV1JJVFRFTl9fRVNJWkUJCQkweDgKKyNkZWZpbmUgR0VON19SRUdfU09fTlVNX1BSSU1TX1dSSVRURU5fX0xFTgkJCTB4NAorCisjZGVmaW5lIEdFTjdfUkVHX1NPX1BSSU1fU1RPUkFHRV9ORUVERUQoaTApCQkJKDB4NTI0MCArIDB4OCooaTApKQorI2RlZmluZSBHRU43X1JFR19TT19QUklNX1NUT1JBR0VfTkVFREVEX19FU0laRQkJCTB4OAorI2RlZmluZSBHRU43X1JFR19TT19QUklNX1NUT1JBR0VfTkVFREVEX19MRU4JCQkweDQKKworI2RlZmluZSBHRU43X1JFR19TT19XUklURV9PRkZTRVQoaTApCQkJCSgweDUyODAgKyAweDgqKGkwKSkKKyNkZWZpbmUgR0VON19SRUdfU09fV1JJVEVfT0ZGU0VUX19FU0laRQkJCQkweDgKKyNkZWZpbmUgR0VON19SRUdfU09fV1JJVEVfT0ZGU0VUX19MRU4JCQkJMHg0CisKKworI2RlZmluZSBHRU43X1JFR19DQUNIRV9NT0RFXzAJCQkJCTB4NzAwMAorI2RlZmluZSBHRU43X1JFR19DQUNIRV9NT0RFXzBfSElaX1JBV19TVEFMTF9PUFRfRElTQUJMRQkJKDB4MSA8PCAyKQorCisjZGVmaW5lIEdFTjdfUkVHX0NBQ0hFX01PREVfMQkJCQkJMHg3MDA0CisjZGVmaW5lIEdFTjhfUkVHX0NBQ0hFX01PREVfMV9ISVpfTlBfRUFSTFlfWl9GQUlMU19ESVNBQkxFCSgweDEgPDwgMTMpCisjZGVmaW5lIEdFTjhfUkVHX0NBQ0hFX01PREVfMV9ISVpfTlBfUE1BX0ZJWF9FTkFCTEUJCSgweDEgPDwgMTEpCisKKworI2RlZmluZSBHRU44X1JFR19MM0NOVExSRUcJCQkJCTB4NzAzNAorCisKKyNkZWZpbmUgR0VON19SRUdfTDNTUUNSRUcxCQkJCQkweGIwMTAKKyNkZWZpbmUgR0VON19SRUdfTDNTUUNSRUcxX0NPTjREQ1VOQwkJCQkoMHgxIDw8IDI0KQorI2RlZmluZSBHRU43X1JFR19MM1NRQ1JFRzFfU1FHSFBDSV9fTUFTSwkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgR0VON19SRUdfTDNTUUNSRUcxX1NRR0hQQ0lfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VON19SRUdfTDNTUUNSRUcxX1NRR0hQQ0lfMThfNgkJCQkoMHg3MyA8PCAxNikKKyNkZWZpbmUgR0VONzVfUkVHX0wzU1FDUkVHMV9TUUdQQ0lfX01BU0sJCQkweDAwZjgwMDAwCisjZGVmaW5lIEdFTjc1X1JFR19MM1NRQ1JFRzFfU1FHUENJX19TSElGVAkJCTE5CisjZGVmaW5lIEdFTjc1X1JFR19MM1NRQ1JFRzFfU1FHUENJXzI0CQkJCSgweGMgPDwgMTkpCisjZGVmaW5lIEdFTjc1X1JFR19MM1NRQ1JFRzFfU1FIUENJX19NQVNLCQkJMHgwMDA3YzAwMAorI2RlZmluZSBHRU43NV9SRUdfTDNTUUNSRUcxX1NRSFBDSV9fU0hJRlQJCQkxNAorI2RlZmluZSBHRU43NV9SRUdfTDNTUUNSRUcxX1NRSFBDSV84CQkJCSgweDQgPDwgMTQpCisKKyNkZWZpbmUgR0VON19SRUdfTDNTUUNSRUcyCQkJCQkweGIwMTQKKworI2RlZmluZSBHRU43X1JFR19MM1NRQ1JFRzMJCQkJCTB4YjAxOAorCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzEJCQkJCTB4YjAxYworCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzIJCQkJCTB4YjAyMAorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUcyX0RDV0FTTE1CCQkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzJfRENXQVNTX19NQVNLCQkJMHgwN2UwMDAwMAorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUcyX0RDV0FTU19fU0hJRlQJCQkyMQorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUcyX1JPQ1BTTE1CCQkJCSgweDEgPDwgMjApCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzJfUkRPQ1BMX19NQVNLCQkJMHgwMDBmYzAwMAorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUcyX1JET0NQTF9fU0hJRlQJCQkxNAorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUcyX1VSQlNMTUIJCQkJKDB4MSA8PCA3KQorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUcyX1VSQkFMTF9fTUFTSwkJCTB4MDAwMDAwN2UKKyNkZWZpbmUgR0VON19SRUdfTDNDTlRMUkVHMl9VUkJBTExfX1NISUZUCQkJMQorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUcyX1NMTU1FTkIJCQkJKDB4MSA8PCAwKQorCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzMJCQkJCTB4YjAyNAorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUczX1RXQUxTTE1CCQkJCSgweDEgPDwgMjEpCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzNfVFhXWUFMTF9fTUFTSwkJCTB4MDAxZjgwMDAKKyNkZWZpbmUgR0VON19SRUdfTDNDTlRMUkVHM19UWFdZQUxMX19TSElGVAkJCTE1CisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzNfQ1dBU0xNQgkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUczX0NUV1lBTExfX01BU0sJCQkweDAwMDAzZjAwCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzNfQ1RXWUFMTF9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzNfSVNXWVNMTUIJCQkJKDB4MSA8PCA3KQorI2RlZmluZSBHRU43X1JFR19MM0NOVExSRUczX0lTV1lBTExfX01BU0sJCQkweDAwMDAwMDdlCisjZGVmaW5lIEdFTjdfUkVHX0wzQ05UTFJFRzNfSVNXWUFMTF9fU0hJRlQJCQkxCisKKyNkZWZpbmUgR0VONl9SRUdfQkNTX1NXQ1RSTAkJCQkJMHgyMjIwMAorI2RlZmluZSBHRU42X1JFR19CQ1NfU1dDVFJMX0RTVF9USUxJTkdfWQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VONl9SRUdfQkNTX1NXQ1RSTF9TUkNfVElMSU5HX1kJCQkoMHgxIDw8IDApCisKKworI2VuZGlmIC8qIEdFTl9SRUdTX1hNTCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2dlbmh3L2dlbl9yZW5kZXIueG1sLmggYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX3JlbmRlci54bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg2YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2dlbmh3L2dlbl9yZW5kZXIueG1sLmgKQEAgLTAsMCArMSwyOTQgQEAKKyNpZm5kZWYgR0VOX1JFTkRFUl9YTUwKKyNkZWZpbmUgR0VOX1JFTkRFUl9YTUwKKworLyogQXV0b2dlbmVyYXRlZCBmaWxlLCBETyBOT1QgRURJVCBtYW51YWxseSEKKworVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHJ1bGVzLW5nLW5nIGhlYWRlcmdlbiB0b29sIGluIHRoaXMgZ2l0IHJlcG9zaXRvcnk6CitodHRwczovL2dpdGh1Yi5jb20vb2x2YWZmZS9lbnZ5dG9vbHMvCitnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL29sdmFmZmUvZW52eXRvb2xzLmdpdAorCitDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CistIENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+IChvbHYpCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKK3BvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqLworCisKKyNkZWZpbmUgR0VONl9SRU5ERVJfVFlQRV9fTUFTSwkJCQkJMHhlMDAwMDAwMAorI2RlZmluZSBHRU42X1JFTkRFUl9UWVBFX19TSElGVAkJCQkJMjkKKyNkZWZpbmUgR0VONl9SRU5ERVJfVFlQRV9SRU5ERVIJCQkJCSgweDMgPDwgMjkpCisjZGVmaW5lIEdFTjZfUkVOREVSX1NVQlRZUEVfX01BU0sJCQkJMHgxODAwMDAwMAorI2RlZmluZSBHRU42X1JFTkRFUl9TVUJUWVBFX19TSElGVAkJCQkyNworI2RlZmluZSBHRU42X1JFTkRFUl9TVUJUWVBFX0NPTU1PTgkJCQkoMHgwIDw8IDI3KQorI2RlZmluZSBHRU42X1JFTkRFUl9TVUJUWVBFX1NJTkdMRV9EVwkJCQkoMHgxIDw8IDI3KQorI2RlZmluZSBHRU42X1JFTkRFUl9TVUJUWVBFX01FRElBCQkJCSgweDIgPDwgMjcpCisjZGVmaW5lIEdFTjZfUkVOREVSX1NVQlRZUEVfM0QJCQkJCSgweDMgPDwgMjcpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV9fTUFTSwkJCQkweDA3ZmYwMDAwCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFX1NUQVRFX0JBU0VfQUREUkVTUwkJCSgweDEwMSA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFX1NUQVRFX1NJUAkJCQkoMHgxMDIgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1ZGX1NUQVRJU1RJQ1MJCSgweGIgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV9QSVBFTElORV9TRUxFQ1QJCQkoMHgxMDQgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV9NRURJQV9WRkVfU1RBVEUJCQkoMHgwIDw8IDE2KQorI2RlZmluZSBHRU42X1JFTkRFUl9PUENPREVfTUVESUFfQ1VSQkVfTE9BRAkJCSgweDEgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV9NRURJQV9JTlRFUkZBQ0VfREVTQ1JJUFRPUl9MT0FECSgweDIgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV9NRURJQV9TVEFURV9GTFVTSAkJCSgweDQgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV9HUEdQVV9XQUxLRVIJCQkJKDB4MTA1IDw8IDE2KQorI2RlZmluZSBHRU42X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTCSgweDEgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NBTVBMRVJfU1RBVEVfUE9JTlRFUlMJKDB4MiA8PCAxNikKKyNkZWZpbmUgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQ0xFQVJfUEFSQU1TCQkJKDB4NCA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfVVJCCQkJCSgweDUgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX0RFUFRIX0JVRkZFUgkJCSgweDUgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NURU5DSUxfQlVGRkVSCQkoMHg2IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUgkJKDB4NyA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfVkVSVEVYX0JVRkZFUlMJCSgweDggPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUwkJKDB4OSA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfSU5ERVhfQlVGRkVSCQkJKDB4YSA8PCAxNikKKyNkZWZpbmUgR0VONzVfUkVOREVSX09QQ09ERV8zRFNUQVRFX1ZGCQkJCSgweGMgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTCSgweGQgPDwgMTYpCisjZGVmaW5lIEdFTjhfUkVOREVSX09QQ09ERV8zRFNUQVRFX01VTFRJU0FNUExFCQkJKDB4ZCA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQ0NfU1RBVEVfUE9JTlRFUlMJCSgweGUgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NDSVNTT1JfU1RBVEVfUE9JTlRFUlMJKDB4ZiA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfVlMJCQkJKDB4MTAgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0dTCQkJCSgweDExIDw8IDE2KQorI2RlZmluZSBHRU42X1JFTkRFUl9PUENPREVfM0RTVEFURV9DTElQCQkJCSgweDEyIDw8IDE2KQorI2RlZmluZSBHRU42X1JFTkRFUl9PUENPREVfM0RTVEFURV9TRgkJCQkoMHgxMyA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfV00JCQkJKDB4MTQgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NPTlNUQU5UX1ZTCQkJKDB4MTUgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NPTlNUQU5UX0dTCQkJKDB4MTYgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NPTlNUQU5UX1BTCQkJKDB4MTcgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NBTVBMRV9NQVNLCQkJKDB4MTggPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NPTlNUQU5UX0hTCQkJKDB4MTkgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NPTlNUQU5UX0RTCQkJKDB4MWEgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX0hTCQkJCSgweDFiIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9URQkJCQkoMHgxYyA8PCAxNikKKyNkZWZpbmUgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfRFMJCQkJKDB4MWQgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NUUkVBTU9VVAkJCSgweDFlIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TQkUJCQkJKDB4MWYgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1BTCQkJCSgweDIwIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19TRl9DTElQCSgweDIxIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19DQwkoMHgyMyA8PCAxNikKKyNkZWZpbmUgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQkxFTkRfU1RBVEVfUE9JTlRFUlMJCSgweDI0IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9ERVBUSF9TVEVOQ0lMX1NUQVRFX1BPSU5URVJTCSgweDI1IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX1ZTCSgweDI2IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0hTCSgweDI3IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0RTCSgweDI4IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0dTCSgweDI5IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX1BTCSgweDJhIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX1ZTCSgweDJiIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX0hTCSgweDJjIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX0RTCSgweDJkIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX0dTCSgweDJlIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX1BTCSgweDJmIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9VUkJfVlMJCQkoMHgzMCA8PCAxNikKKyNkZWZpbmUgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfVVJCX0hTCQkJKDB4MzEgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1VSQl9EUwkJCSgweDMyIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9VUkJfR1MJCQkoMHgzMyA8PCAxNikKKyNkZWZpbmUgR0VOOF9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfVkZfSU5TVEFOQ0lORwkJKDB4NDkgPDwgMTYpCisjZGVmaW5lIEdFTjhfUkVOREVSX09QQ09ERV8zRFNUQVRFX1ZGX1NHVlMJCQkoMHg0YSA8PCAxNikKKyNkZWZpbmUgR0VOOF9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfVkZfVE9QT0xPR1kJCQkoMHg0YiA8PCAxNikKKyNkZWZpbmUgR0VOOF9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfV01fQ0hST01BS0VZCQkJKDB4NGMgPDwgMTYpCisjZGVmaW5lIEdFTjhfUkVOREVSX09QQ09ERV8zRFNUQVRFX1BTX0JMRU5ECQkJKDB4NGQgPDwgMTYpCisjZGVmaW5lIEdFTjhfUkVOREVSX09QQ09ERV8zRFNUQVRFX1dNX0RFUFRIX1NURU5DSUwJCSgweDRlIDw8IDE2KQorI2RlZmluZSBHRU44X1JFTkRFUl9PUENPREVfM0RTVEFURV9QU19FWFRSQQkJCSgweDRmIDw8IDE2KQorI2RlZmluZSBHRU44X1JFTkRFUl9PUENPREVfM0RTVEFURV9SQVNURVIJCQkoMHg1MCA8PCAxNikKKyNkZWZpbmUgR0VOOF9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfU0JFX1NXSVoJCQkoMHg1MSA8PCAxNikKKyNkZWZpbmUgR0VOOF9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfV01fSFpfT1AJCQkoMHg1MiA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEUJCSgweDEwMCA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfREVQVEhfQlVGRkVSCQkJKDB4MTA1IDw8IDE2KQorI2RlZmluZSBHRU42X1JFTkRFUl9PUENPREVfM0RTVEFURV9QT0xZX1NUSVBQTEVfT0ZGU0VUCQkoMHgxMDYgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1BPTFlfU1RJUFBMRV9QQVRURVJOCQkoMHgxMDcgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0xJTkVfU1RJUFBMRQkJCSgweDEwOCA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfQUFfTElORV9QQVJBTUVURVJTCQkoMHgxMGEgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0dTX1NWQl9JTkRFWAkJCSgweDEwYiA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfTVVMVElTQU1QTEUJCQkoMHgxMGQgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NURU5DSUxfQlVGRkVSCQkoMHgxMGUgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSCQkoMHgxMGYgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFNUQVRFX0NMRUFSX1BBUkFNUwkJCSgweDExMCA8PCAxNikKKyNkZWZpbmUgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19WUwkoMHgxMTIgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1BVU0hfQ09OU1RBTlRfQUxMT0NfSFMJKDB4MTEzIDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9QVVNIX0NPTlNUQU5UX0FMTE9DX0RTCSgweDExNCA8PCAxNikKKyNkZWZpbmUgR0VON19SRU5ERVJfT1BDT0RFXzNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19HUwkoMHgxMTUgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1BVU0hfQ09OU1RBTlRfQUxMT0NfUFMJKDB4MTE2IDw8IDE2KQorI2RlZmluZSBHRU43X1JFTkRFUl9PUENPREVfM0RTVEFURV9TT19ERUNMX0xJU1QJCQkoMHgxMTcgPDwgMTYpCisjZGVmaW5lIEdFTjdfUkVOREVSX09QQ09ERV8zRFNUQVRFX1NPX0JVRkZFUgkJCSgweDExOCA8PCAxNikKKyNkZWZpbmUgR0VOOF9SRU5ERVJfT1BDT0RFXzNEU1RBVEVfU0FNUExFX1BBVFRFUk4JCSgweDExYyA8PCAxNikKKyNkZWZpbmUgR0VONl9SRU5ERVJfT1BDT0RFX1BJUEVfQ09OVFJPTAkJCQkoMHgyMDAgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX09QQ09ERV8zRFBSSU1JVElWRQkJCQkoMHgzMDAgPDwgMTYpCisjZGVmaW5lIEdFTjZfUkVOREVSX0xFTkdUSF9fTUFTSwkJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjZfUkVOREVSX0xFTkdUSF9fU0hJRlQJCQkJMAorI2RlZmluZSBHRU42X01PQ1NfTExDX19NQVNLCQkJCQkweDAwMDAwMDAzCisjZGVmaW5lIEdFTjZfTU9DU19MTENfX1NISUZUCQkJCQkwCisjZGVmaW5lIEdFTjZfTU9DU19MTENfUFRFCQkJCQkweDAKKyNkZWZpbmUgR0VONl9NT0NTX0xMQ19VQwkJCQkJMHgxCisjZGVmaW5lIEdFTjZfTU9DU19MTENfV0IJCQkJCTB4MgorI2RlZmluZSBHRU43X01PQ1NfTExDX19NQVNLCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIEdFTjdfTU9DU19MTENfX1NISUZUCQkJCQkxCisjZGVmaW5lIEdFTjdfTU9DU19MTENfUFRFCQkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIEdFTjdfTU9DU19MTENfV0IJCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VONzVfTU9DU19MTENfX01BU0sJCQkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgR0VONzVfTU9DU19MTENfX1NISUZUCQkJCQkxCisjZGVmaW5lIEdFTjc1X01PQ1NfTExDX1BURQkJCQkJKDB4MCA8PCAxKQorI2RlZmluZSBHRU43NV9NT0NTX0xMQ19VQwkJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU43NV9NT0NTX0xMQ19XQgkJCQkJKDB4MiA8PCAxKQorI2RlZmluZSBHRU43NV9NT0NTX0xMQ19FTExDCQkJCQkoMHgzIDw8IDEpCisjZGVmaW5lIEdFTjdfTU9DU19MM19fTUFTSwkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBHRU43X01PQ1NfTDNfX1NISUZUCQkJCQkwCisjZGVmaW5lIEdFTjdfTU9DU19MM19VQwkJCQkJCTB4MAorI2RlZmluZSBHRU43X01PQ1NfTDNfV0IJCQkJCQkweDEKKyNkZWZpbmUgR0VOOF9NT0NTX01UX19NQVNLCQkJCQkweDAwMDAwMDYwCisjZGVmaW5lIEdFTjhfTU9DU19NVF9fU0hJRlQJCQkJCTUKKyNkZWZpbmUgR0VOOF9NT0NTX01UX1BURQkJCQkJKDB4MCA8PCA1KQorI2RlZmluZSBHRU44X01PQ1NfTVRfVUMJCQkJCQkoMHgxIDw8IDUpCisjZGVmaW5lIEdFTjhfTU9DU19NVF9XVAkJCQkJCSgweDIgPDwgNSkKKyNkZWZpbmUgR0VOOF9NT0NTX01UX1dCCQkJCQkJKDB4MyA8PCA1KQorI2RlZmluZSBHRU44X01PQ1NfQ1RfX01BU0sJCQkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgR0VOOF9NT0NTX0NUX19TSElGVAkJCQkJMworI2RlZmluZSBHRU44X01PQ1NfQ1RfRUxMQwkJCQkJKDB4MCA8PCAzKQorI2RlZmluZSBHRU44X01PQ1NfQ1RfTExDX09OTFkJCQkJCSgweDEgPDwgMykKKyNkZWZpbmUgR0VOOF9NT0NTX0NUX0xMQwkJCQkJKDB4MiA8PCAzKQorI2RlZmluZSBHRU44X01PQ1NfQ1RfTDMJCQkJCQkoMHgzIDw8IDMpCisjZGVmaW5lIEdFTjlfTU9DU19fTUFTSwkJCQkJCTB4MDAwMDAwN2YKKyNkZWZpbmUgR0VOOV9NT0NTX19TSElGVAkJCQkJMAorI2RlZmluZSBHRU45X01PQ1NfTVRfV1RfQ1RfTDMJCQkJCTB4NQorI2RlZmluZSBHRU45X01PQ1NfTVRfV0JfQ1RfTDMJCQkJCTB4OQorI2RlZmluZSBHRU42X1NCQV9BRERSX19NQVNLCQkJCQkweGZmZmZmMDAwCisjZGVmaW5lIEdFTjZfU0JBX0FERFJfX1NISUZUCQkJCQkxMgorI2RlZmluZSBHRU42X1NCQV9BRERSX19TSFIJCQkJCTEyCisjZGVmaW5lIEdFTjZfU0JBX01PQ1NfX01BU0sJCQkJCTB4MDAwMDBmMDAKKyNkZWZpbmUgR0VONl9TQkFfTU9DU19fU0hJRlQJCQkJCTgKKyNkZWZpbmUgR0VOOF9TQkFfTU9DU19fTUFTSwkJCQkJMHgwMDAwMDdmMAorI2RlZmluZSBHRU44X1NCQV9NT0NTX19TSElGVAkJCQkJNAorI2RlZmluZSBHRU42X1NCQV9BRERSX01PRElGSUVECQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIEdFTjZfQklORElOR19UQUJMRV9BRERSX19NQVNLCQkJCTB4MDAwMGZmZTAKKyNkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX0FERFJfX1NISUZUCQkJCTUKKyNkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX0FERFJfX1NIUgkJCQk1CisjZGVmaW5lIEdFTjZfU1RBVEVfQkFTRV9BRERSRVNTX19TSVpFCQkJCTE5CisKKworI2RlZmluZSBHRU42X1NCQV9EVzFfR0VORVJBTF9TVEFURUxFU1NfTU9DU19fTUFTSwkJMHgwMDAwMDBmMAorI2RlZmluZSBHRU42X1NCQV9EVzFfR0VORVJBTF9TVEFURUxFU1NfTU9DU19fU0hJRlQJCTQKKyNkZWZpbmUgR0VONl9TQkFfRFcxX0dFTkVSQUxfU1RBVEVMRVNTX0ZPUkNFX1dSSVRFX1RIUlUJCSgweDEgPDwgMykKKworCisKKworCisKKworCisKKworCisKKworI2RlZmluZSBHRU44X1NCQV9EVzNfU1RBVEVMRVNTX01PQ1NfX01BU0sJCQkweDAwN2YwMDAwCisjZGVmaW5lIEdFTjhfU0JBX0RXM19TVEFURUxFU1NfTU9DU19fU0hJRlQJCQkxNgorCisKKworCisKKworCisKKworCisKKworCisKKworCisjZGVmaW5lIEdFTjZfU1RBVEVfU0lQX19TSVpFCQkJCQkzCisKKworI2RlZmluZSBHRU42X1NJUF9EVzFfS0VSTkVMX0FERFJfX01BU0sJCQkJMHhmZmZmZmZmMAorI2RlZmluZSBHRU42X1NJUF9EVzFfS0VSTkVMX0FERFJfX1NISUZUCQkJCTQKKyNkZWZpbmUgR0VONl9TSVBfRFcxX0tFUk5FTF9BRERSX19TSFIJCQkJNAorCisKKyNkZWZpbmUgR0VONl9QSVBFTElORV9TRUxFQ1RfX1NJWkUJCQkJMQorCisjZGVmaW5lIEdFTjZfUElQRUxJTkVfU0VMRUNUX0RXMF9TRUxFQ1RfX01BU0sJCQkweDAwMDAwMDAzCisjZGVmaW5lIEdFTjZfUElQRUxJTkVfU0VMRUNUX0RXMF9TRUxFQ1RfX1NISUZUCQkJMAorI2RlZmluZSBHRU42X1BJUEVMSU5FX1NFTEVDVF9EVzBfU0VMRUNUXzNECQkJMHgwCisjZGVmaW5lIEdFTjZfUElQRUxJTkVfU0VMRUNUX0RXMF9TRUxFQ1RfTUVESUEJCQkweDEKKyNkZWZpbmUgR0VON19QSVBFTElORV9TRUxFQ1RfRFcwX1NFTEVDVF9HUEdQVQkJCTB4MgorI2RlZmluZSBHRU45X1BJUEVMSU5FX1NFTEVDVF9EVzBfU0VMRUNUX19NQVNLCQkJMHgwMDAwMDcwMAorI2RlZmluZSBHRU45X1BJUEVMSU5FX1NFTEVDVF9EVzBfU0VMRUNUX19TSElGVAkJCTgKKyNkZWZpbmUgR0VOOV9QSVBFTElORV9TRUxFQ1RfRFcwX1NFTEVDVF8zRAkJCSgweDMgPDwgOCkKKworI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9fU0laRQkJCQkJNgorCisKKyNkZWZpbmUgR0VON19QSVBFX0NPTlRST0xfVVNFX0dHVFQJCQkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgR0VON19QSVBFX0NPTlRST0xfTFJJX1dSSVRFX19NQVNLCQkJMHgwMDgwMDAwMAorI2RlZmluZSBHRU43X1BJUEVfQ09OVFJPTF9MUklfV1JJVEVfX1NISUZUCQkJMjMKKyNkZWZpbmUgR0VON19QSVBFX0NPTlRST0xfTFJJX1dSSVRFX05PTkUJCQkoMHgwIDw8IDIzKQorI2RlZmluZSBHRU43X1BJUEVfQ09OVFJPTF9MUklfV1JJVEVfSU1NCQkJCSgweDEgPDwgMjMpCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX1BST1RFQ1RFRF9NRU1PUllfRU5BQkxFCQkoMHgxIDw8IDIyKQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9TVE9SRV9EQVRBX0lOREVYCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR0VONl9QSVBFX0NPTlRST0xfQ1NfU1RBTEwJCQkJKDB4MSA8PCAyMCkKKyNkZWZpbmUgR0VONl9QSVBFX0NPTlRST0xfR0xPQkFMX1NOQVBTSE9UX0NPVU5UX1JFU0VUCQkoMHgxIDw8IDE5KQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9UTEJfSU5WQUxJREFURQkJCSgweDEgPDwgMTgpCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX1NZTkNfR0ZEVF9TVVJGQUNFCQkJKDB4MSA8PCAxNykKKyNkZWZpbmUgR0VONl9QSVBFX0NPTlRST0xfR0VORVJJQ19NRURJQV9TVEFURV9DTEVBUgkJKDB4MSA8PCAxNikKKyNkZWZpbmUgR0VONl9QSVBFX0NPTlRST0xfV1JJVEVfX01BU0sJCQkJMHgwMDAwYzAwMAorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9XUklURV9fU0hJRlQJCQkJMTQKKyNkZWZpbmUgR0VONl9QSVBFX0NPTlRST0xfV1JJVEVfTk9ORQkJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9XUklURV9JTU0JCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgR0VONl9QSVBFX0NPTlRST0xfV1JJVEVfUFNfREVQVEhfQ09VTlQJCQkoMHgyIDw8IDE0KQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9XUklURV9USU1FU1RBTVAJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9ERVBUSF9TVEFMTAkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9SRU5ERVJfQ0FDSEVfRkxVU0gJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9JTlNUUlVDVElPTl9DQUNIRV9JTlZBTElEQVRFCQkoMHgxIDw8IDExKQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9URVhUVVJFX0NBQ0hFX0lOVkFMSURBVEUJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX0lORElSRUNUX1NUQVRFX1BPSU5URVJTX0RJU0FCTEUJKDB4MSA8PCA5KQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9OT1RJRllfRU5BQkxFCQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VON19QSVBFX0NPTlRST0xfV1JJVEVfSU1NX0ZMVVNICQkJKDB4MSA8PCA3KQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9QUk9URUNURURfTUVNT1JZX0FQUF9JRF9fTUFTSwkJMHgwMDAwMDA0MAorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9QUk9URUNURURfTUVNT1JZX0FQUF9JRF9fU0hJRlQJNgorI2RlZmluZSBHRU43X1BJUEVfQ09OVFJPTF9EQ19GTFVTSAkJCQkoMHgxIDw8IDUpCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX1ZGX0NBQ0hFX0lOVkFMSURBVEUJCQkoMHgxIDw8IDQpCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX0NPTlNUQU5UX0NBQ0hFX0lOVkFMSURBVEUJCSgweDEgPDwgMykKKyNkZWZpbmUgR0VONl9QSVBFX0NPTlRST0xfU1RBVEVfQ0FDSEVfSU5WQUxJREFURQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9QSVhFTF9TQ09SRUJPQVJEX1NUQUxMCQkoMHgxIDw8IDEpCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX0RFUFRIX0NBQ0hFX0ZMVVNICQkJKDB4MSA8PCAwKQorCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX0RXMl9VU0VfR0dUVAkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX0RXMl9BRERSX19NQVNLCQkJMHhmZmZmZmZmOAorI2RlZmluZSBHRU42X1BJUEVfQ09OVFJPTF9EVzJfQUREUl9fU0hJRlQJCQkzCisjZGVmaW5lIEdFTjZfUElQRV9DT05UUk9MX0RXMl9BRERSX19TSFIJCQkJMworCisjZGVmaW5lIEdFTjdfUElQRV9DT05UUk9MX0RXMl9BRERSX19NQVNLCQkJMHhmZmZmZmZmYworI2RlZmluZSBHRU43X1BJUEVfQ09OVFJPTF9EVzJfQUREUl9fU0hJRlQJCQkyCisjZGVmaW5lIEdFTjdfUElQRV9DT05UUk9MX0RXMl9BRERSX19TSFIJCQkJMgorCisjZGVmaW5lIEdFTjhfUElQRV9DT05UUk9MX0RXMl9BRERSX19NQVNLCQkJMHhmZmZmZmZmYworI2RlZmluZSBHRU44X1BJUEVfQ09OVFJPTF9EVzJfQUREUl9fU0hJRlQJCQkyCisjZGVmaW5lIEdFTjhfUElQRV9DT05UUk9MX0RXMl9BRERSX19TSFIJCQkJMgorCisKKworCisKKyNlbmRpZiAvKiBHRU5fUkVOREVSX1hNTCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2dlbmh3L2dlbl9yZW5kZXJfM2QueG1sLmggYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX3JlbmRlcl8zZC54bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjU1NDJlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2dlbmh3L2dlbl9yZW5kZXJfM2QueG1sLmgKQEAgLTAsMCArMSwxNzk3IEBACisjaWZuZGVmIEdFTl9SRU5ERVJfM0RfWE1MCisjZGVmaW5lIEdFTl9SRU5ERVJfM0RfWE1MCisKKy8qIEF1dG9nZW5lcmF0ZWQgZmlsZSwgRE8gTk9UIEVESVQgbWFudWFsbHkhCisKK1RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBydWxlcy1uZy1uZyBoZWFkZXJnZW4gdG9vbCBpbiB0aGlzIGdpdCByZXBvc2l0b3J5OgoraHR0cHM6Ly9naXRodWIuY29tL29sdmFmZmUvZW52eXRvb2xzLworZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9vbHZhZmZlL2Vudnl0b29scy5naXQKKworQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorLSBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPiAob2x2KQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKK25leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCitwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCitlbnVtIGdlbl9wcmltX3R5cGUgeworICAgIEdFTjZfM0RQUklNX1BPSU5UTElTVAkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42XzNEUFJJTV9MSU5FTElTVAkJCQkgICAgICA9IDB4MiwKKyAgICBHRU42XzNEUFJJTV9MSU5FU1RSSVAJCQkJICAgICAgPSAweDMsCisgICAgR0VONl8zRFBSSU1fVFJJTElTVAkJCQkJICAgICAgPSAweDQsCisgICAgR0VONl8zRFBSSU1fVFJJU1RSSVAJCQkJICAgICAgPSAweDUsCisgICAgR0VONl8zRFBSSU1fVFJJRkFOCQkJCQkgICAgICA9IDB4NiwKKyAgICBHRU42XzNEUFJJTV9RVUFETElTVAkJCQkgICAgICA9IDB4NywKKyAgICBHRU42XzNEUFJJTV9RVUFEU1RSSVAJCQkJICAgICAgPSAweDgsCisgICAgR0VONl8zRFBSSU1fTElORUxJU1RfQURKCQkJCSAgICAgID0gMHg5LAorICAgIEdFTjZfM0RQUklNX0xJTkVTVFJJUF9BREoJCQkJICAgICAgPSAweGEsCisgICAgR0VONl8zRFBSSU1fVFJJTElTVF9BREoJCQkJICAgICAgPSAweGIsCisgICAgR0VONl8zRFBSSU1fVFJJU1RSSVBfQURKCQkJCSAgICAgID0gMHhjLAorICAgIEdFTjZfM0RQUklNX1RSSVNUUklQX1JFVkVSU0UJCQkgICAgICA9IDB4ZCwKKyAgICBHRU42XzNEUFJJTV9QT0xZR09OCQkJCQkgICAgICA9IDB4ZSwKKyAgICBHRU42XzNEUFJJTV9SRUNUTElTVAkJCQkgICAgICA9IDB4ZiwKKyAgICBHRU42XzNEUFJJTV9MSU5FTE9PUAkJCQkgICAgICA9IDB4MTAsCisgICAgR0VONl8zRFBSSU1fUE9JTlRMSVNUX0JGCQkJCSAgICAgID0gMHgxMSwKKyAgICBHRU42XzNEUFJJTV9MSU5FU1RSSVBfQ09OVAkJCQkgICAgICA9IDB4MTIsCisgICAgR0VONl8zRFBSSU1fTElORVNUUklQX0JGCQkJCSAgICAgID0gMHgxMywKKyAgICBHRU42XzNEUFJJTV9MSU5FU1RSSVBfQ09OVF9CRgkJCSAgICAgID0gMHgxNCwKKyAgICBHRU42XzNEUFJJTV9UUklGQU5fTk9TVElQUExFCQkJICAgICAgPSAweDE2LAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8xCQkJCSAgICAgID0gMHgyMCwKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMgkJCQkgICAgICA9IDB4MjEsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzMJCQkJICAgICAgPSAweDIyLAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF80CQkJCSAgICAgID0gMHgyMywKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfNQkJCQkgICAgICA9IDB4MjQsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzYJCQkJICAgICAgPSAweDI1LAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF83CQkJCSAgICAgID0gMHgyNiwKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfOAkJCQkgICAgICA9IDB4MjcsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzkJCQkJICAgICAgPSAweDI4LAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8xMAkJCQkgICAgICA9IDB4MjksCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzExCQkJCSAgICAgID0gMHgyYSwKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMTIJCQkJICAgICAgPSAweDJiLAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8xMwkJCQkgICAgICA9IDB4MmMsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzE0CQkJCSAgICAgID0gMHgyZCwKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMTUJCQkJICAgICAgPSAweDJlLAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8xNgkJCQkgICAgICA9IDB4MmYsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzE3CQkJCSAgICAgID0gMHgzMCwKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMTgJCQkJICAgICAgPSAweDMxLAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8xOQkJCQkgICAgICA9IDB4MzIsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzIwCQkJCSAgICAgID0gMHgzMywKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMjEJCQkJICAgICAgPSAweDM0LAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8yMgkJCQkgICAgICA9IDB4MzUsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzIzCQkJCSAgICAgID0gMHgzNiwKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMjQJCQkJICAgICAgPSAweDM3LAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8yNQkJCQkgICAgICA9IDB4MzgsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzI2CQkJCSAgICAgID0gMHgzOSwKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMjcJCQkJICAgICAgPSAweDNhLAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8yOAkJCQkgICAgICA9IDB4M2IsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzI5CQkJCSAgICAgID0gMHgzYywKKyAgICBHRU43XzNEUFJJTV9QQVRDSExJU1RfMzAJCQkJICAgICAgPSAweDNkLAorICAgIEdFTjdfM0RQUklNX1BBVENITElTVF8zMQkJCQkgICAgICA9IDB4M2UsCisgICAgR0VON18zRFBSSU1fUEFUQ0hMSVNUXzMyCQkJCSAgICAgID0gMHgzZiwKK307CisKK2VudW0gZ2VuX3N0YXRlX2FsaWdubWVudCB7CisgICAgR0VONl9BTElHTk1FTlRfQ09MT1JfQ0FMQ19TVEFURQkJCSAgICAgID0gMHg0MCwKKyAgICBHRU42X0FMSUdOTUVOVF9ERVBUSF9TVEVOQ0lMX1NUQVRFCQkJICAgICAgPSAweDQwLAorICAgIEdFTjZfQUxJR05NRU5UX0JMRU5EX1NUQVRFCQkJCSAgICAgID0gMHg0MCwKKyAgICBHRU42X0FMSUdOTUVOVF9DTElQX1ZJRVdQT1JUCQkJICAgICAgPSAweDIwLAorICAgIEdFTjZfQUxJR05NRU5UX1NGX1ZJRVdQT1JUCQkJCSAgICAgID0gMHgyMCwKKyAgICBHRU43X0FMSUdOTUVOVF9TRl9DTElQX1ZJRVdQT1JUCQkJICAgICAgPSAweDQwLAorICAgIEdFTjZfQUxJR05NRU5UX0NDX1ZJRVdQT1JUCQkJCSAgICAgID0gMHgyMCwKKyAgICBHRU42X0FMSUdOTUVOVF9TQ0lTU09SX1JFQ1QJCQkJICAgICAgPSAweDIwLAorICAgIEdFTjZfQUxJR05NRU5UX0JJTkRJTkdfVEFCTEVfU1RBVEUJCQkgICAgICA9IDB4MjAsCisgICAgR0VONl9BTElHTk1FTlRfU0FNUExFUl9CT1JERVJfQ09MT1JfU1RBVEUJCSAgICAgID0gMHgyMCwKKyAgICBHRU44X0FMSUdOTUVOVF9TQU1QTEVSX0JPUkRFUl9DT0xPUl9TVEFURQkJICAgICAgPSAweDQwLAorICAgIEdFTjZfQUxJR05NRU5UX1NBTVBMRVJfU1RBVEUJCQkgICAgICA9IDB4MjAsCisgICAgR0VONl9BTElHTk1FTlRfU1VSRkFDRV9TVEFURQkJCSAgICAgID0gMHgyMCwKKyAgICBHRU44X0FMSUdOTUVOVF9TVVJGQUNFX1NUQVRFCQkJICAgICAgPSAweDQwLAorfTsKKworZW51bSBnZW5fdmZfY29tcG9uZW50IHsKKyAgICBHRU42X1ZGQ09NUF9OT1NUT1JFCQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X1ZGQ09NUF9TVE9SRV9TUkMJCQkJICAgICAgPSAweDEsCisgICAgR0VONl9WRkNPTVBfU1RPUkVfMAkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9WRkNPTVBfU1RPUkVfMV9GUAkJCQkgICAgICA9IDB4MywKKyAgICBHRU42X1ZGQ09NUF9TVE9SRV8xX0lOVAkJCQkgICAgICA9IDB4NCwKKyAgICBHRU42X1ZGQ09NUF9TVE9SRV9WSUQJCQkJICAgICAgPSAweDUsCisgICAgR0VONl9WRkNPTVBfU1RPUkVfSUlECQkJCSAgICAgID0gMHg2LAorfTsKKworZW51bSBnZW5fZGVwdGhfZm9ybWF0IHsKKyAgICBHRU42X1pGT1JNQVRfRDMyX0ZMT0FUX1M4WDI0X1VJTlQJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X1pGT1JNQVRfRDMyX0ZMT0FUCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfWkZPUk1BVF9EMjRfVU5PUk1fUzhfVUlOVAkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfWkZPUk1BVF9EMjRfVU5PUk1fWDhfVUlOVAkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfWkZPUk1BVF9EMTZfVU5PUk0JCQkJICAgICAgPSAweDUsCit9OworCisjZGVmaW5lIEdFTjZfSU5URVJQX05PTlBFUlNQRUNUSVZFX1NBTVBMRQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgR0VONl9JTlRFUlBfTk9OUEVSU1BFQ1RJVkVfQ0VOVFJPSUQJCQkoMHgxIDw8IDQpCisjZGVmaW5lIEdFTjZfSU5URVJQX05PTlBFUlNQRUNUSVZFX1BJWEVMCQkJKDB4MSA8PCAzKQorI2RlZmluZSBHRU42X0lOVEVSUF9QRVJTUEVDVElWRV9TQU1QTEUJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU42X0lOVEVSUF9QRVJTUEVDVElWRV9DRU5UUk9JRAkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VONl9JTlRFUlBfUEVSU1BFQ1RJVkVfUElYRUwJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBHRU42X1BTX0RJU1BBVENIXzMyCQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIEdFTjZfUFNfRElTUEFUQ0hfMTYJCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VONl9QU19ESVNQQVRDSF84CQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIEdFTjZfVEhSRUFERElTUF9TUEYJCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjZfVEhSRUFERElTUF9WTUUJCQkJCSgweDEgPDwgMzApCisjZGVmaW5lIEdFTjZfVEhSRUFERElTUF9TQU1QTEVSX0NPVU5UX19NQVNLCQkJMHgzODAwMDAwMAorI2RlZmluZSBHRU42X1RIUkVBRERJU1BfU0FNUExFUl9DT1VOVF9fU0hJRlQJCQkyNworI2RlZmluZSBHRU43X1RIUkVBRERJU1BfREVOT1JNQUxfX01BU0sJCQkJMHgwNDAwMDAwMAorI2RlZmluZSBHRU43X1RIUkVBRERJU1BfREVOT1JNQUxfX1NISUZUCQkJCTI2CisjZGVmaW5lIEdFTjdfVEhSRUFERElTUF9ERU5PUk1BTF9GVFoJCQkJKDB4MCA8PCAyNikKKyNkZWZpbmUgR0VON19USFJFQURESVNQX0RFTk9STUFMX1JFVAkJCQkoMHgxIDw8IDI2KQorI2RlZmluZSBHRU42X1RIUkVBRERJU1BfQklORElOR19UQUJMRV9TSVpFX19NQVNLCQkweDAzZmMwMDAwCisjZGVmaW5lIEdFTjZfVEhSRUFERElTUF9CSU5ESU5HX1RBQkxFX1NJWkVfX1NISUZUCQkxOAorI2RlZmluZSBHRU42X1RIUkVBRERJU1BfUFJJT1JJVFlfSElHSAkJCQkoMHgxIDw8IDE3KQorI2RlZmluZSBHRU42X1RIUkVBRERJU1BfRlBfTU9ERV9BTFQJCQkJKDB4MSA8PCAxNikKKyNkZWZpbmUgR0VON19ST1VORElOR19NT0RFX19NQVNLCQkJCTB4MDAwMGMwMDAKKyNkZWZpbmUgR0VON19ST1VORElOR19NT0RFX19TSElGVAkJCQkxNAorI2RlZmluZSBHRU43X1JPVU5ESU5HX01PREVfUlRORQkJCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgR0VON19ST1VORElOR19NT0RFX1JVCQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBHRU43X1JPVU5ESU5HX01PREVfUkQJCQkJCSgweDIgPDwgMTQpCisjZGVmaW5lIEdFTjdfUk9VTkRJTkdfTU9ERV9SVFoJCQkJCSgweDMgPDwgMTQpCisjZGVmaW5lIEdFTjZfVEhSRUFERElTUF9JTExFR0FMX0NPREVfRVhDRVBUSU9OCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgR0VONzVfVEhSRUFERElTUF9BQ0NFU1NfVUFWCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIEdFTjZfVEhSRUFERElTUF9NQVNLX1NUQUNLX0VYQ0VQVElPTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjZfVEhSRUFERElTUF9TT0ZUV0FSRV9FWENFUFRJT04JCQkoMHgxIDw8IDcpCisjZGVmaW5lIEdFTjZfVEhSRUFEU0NSQVRDSF9BRERSX19NQVNLCQkJCTB4ZmZmZmZjMDAKKyNkZWZpbmUgR0VONl9USFJFQURTQ1JBVENIX0FERFJfX1NISUZUCQkJCTEwCisjZGVmaW5lIEdFTjZfVEhSRUFEU0NSQVRDSF9BRERSX19TSFIJCQkJMTAKKyNkZWZpbmUgR0VONl9USFJFQURTQ1JBVENIX1NQQUNFX1BFUl9USFJFQURfX01BU0sJCTB4MDAwMDAwMGYKKyNkZWZpbmUgR0VONl9USFJFQURTQ1JBVENIX1NQQUNFX1BFUl9USFJFQURfX1NISUZUCQkwCisjZGVmaW5lIEdFTjZfM0RTVEFURV9WRl9TVEFUSVNUSUNTX19TSVpFCQkJMQorCisjZGVmaW5lIEdFTjZfVkZfU1RBVFNfRFcwX0VOQUJMRQkJCQkoMHgxIDw8IDApCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNfX1NJWkUJCTQKKworI2RlZmluZSBHRU42X0JJTkRJTkdfVEFCTEVfUFRSX0RXMF9QU19DSEFOR0VECQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX1BUUl9EVzBfR1NfQ0hBTkdFRAkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX1BUUl9EVzBfVlNfQ0hBTkdFRAkJCSgweDEgPDwgOCkKKworCisKKworI2RlZmluZSBHRU42XzNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19fU0laRQkJNAorCisjZGVmaW5lIEdFTjZfU0FNUExFUl9QVFJfRFcwX1BTX0NIQU5HRUQJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgR0VONl9TQU1QTEVSX1BUUl9EVzBfR1NfQ0hBTkdFRAkJCQkoMHgxIDw8IDkpCisjZGVmaW5lIEdFTjZfU0FNUExFUl9QVFJfRFcwX1ZTX0NIQU5HRUQJCQkJKDB4MSA8PCA4KQorCisjZGVmaW5lIEdFTjZfU0FNUExFUl9QVFJfRFcxX1ZTX0FERFJfX01BU0sJCQkweGZmZmZmZmUwCisjZGVmaW5lIEdFTjZfU0FNUExFUl9QVFJfRFcxX1ZTX0FERFJfX1NISUZUCQkJNQorI2RlZmluZSBHRU42X1NBTVBMRVJfUFRSX0RXMV9WU19BRERSX19TSFIJCQk1CisKKyNkZWZpbmUgR0VONl9TQU1QTEVSX1BUUl9EVzJfR1NfQUREUl9fTUFTSwkJCTB4ZmZmZmZmZTAKKyNkZWZpbmUgR0VONl9TQU1QTEVSX1BUUl9EVzJfR1NfQUREUl9fU0hJRlQJCQk1CisjZGVmaW5lIEdFTjZfU0FNUExFUl9QVFJfRFcyX0dTX0FERFJfX1NIUgkJCTUKKworI2RlZmluZSBHRU42X1NBTVBMRVJfUFRSX0RXM19QU19BRERSX19NQVNLCQkJMHhmZmZmZmZlMAorI2RlZmluZSBHRU42X1NBTVBMRVJfUFRSX0RXM19QU19BRERSX19TSElGVAkJCTUKKyNkZWZpbmUgR0VONl9TQU1QTEVSX1BUUl9EVzNfUFNfQUREUl9fU0hSCQkJNQorCisjZGVmaW5lIEdFTjZfM0RTVEFURV9VUkJfX1NJWkUJCQkJCTMKKworCisjZGVmaW5lIEdFTjZfVVJCX0RXMV9WU19FTlRSWV9TSVpFX19NQVNLCQkJMHgwMGZmMDAwMAorI2RlZmluZSBHRU42X1VSQl9EVzFfVlNfRU5UUllfU0laRV9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU42X1VSQl9EVzFfVlNfRU5UUllfQ09VTlRfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfVVJCX0RXMV9WU19FTlRSWV9DT1VOVF9fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjZfVVJCX0RXMV9WU19FTlRSWV9DT1VOVF9fQUxJR04JCQk0CisKKyNkZWZpbmUgR0VONl9VUkJfRFcyX0dTX0VOVFJZX0NPVU5UX19NQVNLCQkJMHgwMDAzZmYwMAorI2RlZmluZSBHRU42X1VSQl9EVzJfR1NfRU5UUllfQ09VTlRfX1NISUZUCQkJOAorI2RlZmluZSBHRU42X1VSQl9EVzJfR1NfRU5UUllfQ09VTlRfX0FMSUdOCQkJNAorI2RlZmluZSBHRU42X1VSQl9EVzJfR1NfRU5UUllfU0laRV9fTUFTSwkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgR0VONl9VUkJfRFcyX0dTX0VOVFJZX1NJWkVfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjdfM0RTVEFURV9VUkJfQU5ZX19TSVpFCQkJCTIKKworCisjZGVmaW5lIEdFTjdfVVJCX0RXMV9PRkZTRVRfX01BU0sJCQkJMHgzZTAwMDAwMAorI2RlZmluZSBHRU43X1VSQl9EVzFfT0ZGU0VUX19TSElGVAkJCQkyNQorI2RlZmluZSBHRU43X1VSQl9EVzFfRU5UUllfU0laRV9fTUFTSwkJCQkweDAxZmYwMDAwCisjZGVmaW5lIEdFTjdfVVJCX0RXMV9FTlRSWV9TSVpFX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU43X1VSQl9EVzFfRU5UUllfQ09VTlRfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU43X1VSQl9EVzFfRU5UUllfQ09VTlRfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU43XzNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19BTllfX1NJWkUJCTIKKworCisjZGVmaW5lIEdFTjdfUENCX0FMTE9DX0RXMV9PRkZTRVRfX01BU0sJCQkJMHgwMDBmMDAwMAorI2RlZmluZSBHRU43X1BDQl9BTExPQ19EVzFfT0ZGU0VUX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjdfUENCX0FMTE9DX0RXMV9TSVpFX19NQVNLCQkJCTB4MDAwMDAwMWYKKyNkZWZpbmUgR0VON19QQ0JfQUxMT0NfRFcxX1NJWkVfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU43NV9QQ0JfQUxMT0NfRFcxX09GRlNFVF9fTUFTSwkJCTB4MDAxZjAwMDAKKyNkZWZpbmUgR0VONzVfUENCX0FMTE9DX0RXMV9PRkZTRVRfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VONzVfUENCX0FMTE9DX0RXMV9TSVpFX19NQVNLCQkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgR0VONzVfUENCX0FMTE9DX0RXMV9TSVpFX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX1ZFUlRFWF9CVUZGRVJTX19TSVpFCQkJMTMzCisKKworCisjZGVmaW5lIEdFTjZfVkJfRFcwX0lOREVYX19NQVNLCQkJCQkweGZjMDAwMDAwCisjZGVmaW5lIEdFTjZfVkJfRFcwX0lOREVYX19TSElGVAkJCQkyNgorI2RlZmluZSBHRU44X1ZCX0RXMF9NT0NTX19NQVNLCQkJCQkweDAwN2YwMDAwCisjZGVmaW5lIEdFTjhfVkJfRFcwX01PQ1NfX1NISUZUCQkJCQkxNgorI2RlZmluZSBHRU42X1ZCX0RXMF9BQ0NFU1NfX01BU0sJCQkJMHgwMDEwMDAwMAorI2RlZmluZSBHRU42X1ZCX0RXMF9BQ0NFU1NfX1NISUZUCQkJCTIwCisjZGVmaW5lIEdFTjZfVkJfRFcwX0FDQ0VTU19WRVJURVhEQVRBCQkJCSgweDAgPDwgMjApCisjZGVmaW5lIEdFTjZfVkJfRFcwX0FDQ0VTU19JTlNUQU5DRURBVEEJCQkJKDB4MSA8PCAyMCkKKyNkZWZpbmUgR0VONl9WQl9EVzBfTU9DU19fTUFTSwkJCQkJMHgwMDBmMDAwMAorI2RlZmluZSBHRU42X1ZCX0RXMF9NT0NTX19TSElGVAkJCQkJMTYKKyNkZWZpbmUgR0VON19WQl9EVzBfQUREUl9NT0RJRklFRAkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBHRU42X1ZCX0RXMF9JU19OVUxMCQkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBHRU42X1ZCX0RXMF9DQUNIRV9JTlZBTElEQVRFCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIEdFTjZfVkJfRFcwX1BJVENIX19NQVNLCQkJCQkweDAwMDAwZmZmCisjZGVmaW5lIEdFTjZfVkJfRFcwX1BJVENIX19TSElGVAkJCQkwCisKKworCisKKworCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX1ZFUlRFWF9FTEVNRU5UU19fU0laRQkJCTY5CisKKworCisjZGVmaW5lIEdFTjZfVkVfRFcwX1ZCX0lOREVYX19NQVNLCQkJCTB4ZmMwMDAwMDAKKyNkZWZpbmUgR0VONl9WRV9EVzBfVkJfSU5ERVhfX1NISUZUCQkJCTI2CisjZGVmaW5lIEdFTjZfVkVfRFcwX1ZBTElECQkJCQkoMHgxIDw8IDI1KQorI2RlZmluZSBHRU42X1ZFX0RXMF9GT1JNQVRfX01BU0sJCQkJMHgwMWZmMDAwMAorI2RlZmluZSBHRU42X1ZFX0RXMF9GT1JNQVRfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjZfVkVfRFcwX0VER0VfRkxBR19FTkFCTEUJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgR0VONl9WRV9EVzBfVkJfT0ZGU0VUX19NQVNLCQkJCTB4MDAwMDA3ZmYKKyNkZWZpbmUgR0VONl9WRV9EVzBfVkJfT0ZGU0VUX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjc1X1ZFX0RXMF9WQl9PRkZTRVRfX01BU0sJCQkJMHgwMDAwMGZmZgorI2RlZmluZSBHRU43NV9WRV9EVzBfVkJfT0ZGU0VUX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9WRV9EVzFfQ09NUDBfX01BU0sJCQkJCTB4NzAwMDAwMDAKKyNkZWZpbmUgR0VONl9WRV9EVzFfQ09NUDBfX1NISUZUCQkJCTI4CisjZGVmaW5lIEdFTjZfVkVfRFcxX0NPTVAxX19NQVNLCQkJCQkweDA3MDAwMDAwCisjZGVmaW5lIEdFTjZfVkVfRFcxX0NPTVAxX19TSElGVAkJCQkyNAorI2RlZmluZSBHRU42X1ZFX0RXMV9DT01QMl9fTUFTSwkJCQkJMHgwMDcwMDAwMAorI2RlZmluZSBHRU42X1ZFX0RXMV9DT01QMl9fU0hJRlQJCQkJMjAKKyNkZWZpbmUgR0VONl9WRV9EVzFfQ09NUDNfX01BU0sJCQkJCTB4MDAwNzAwMDAKKyNkZWZpbmUgR0VONl9WRV9EVzFfQ09NUDNfX1NISUZUCQkJCTE2CisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX0lOREVYX0JVRkZFUl9fU0laRQkJCQk1CisKKyNkZWZpbmUgR0VONl9JQl9EVzBfTU9DU19fTUFTSwkJCQkJMHgwMDAwZjAwMAorI2RlZmluZSBHRU42X0lCX0RXMF9NT0NTX19TSElGVAkJCQkJMTIKKyNkZWZpbmUgR0VONl9JQl9EVzBfQ1VUX0lOREVYX0VOQUJMRQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU42X0lCX0RXMF9GT1JNQVRfX01BU0sJCQkJMHgwMDAwMDMwMAorI2RlZmluZSBHRU42X0lCX0RXMF9GT1JNQVRfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VONl9JQl9EVzBfRk9STUFUX0JZVEUJCQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgR0VONl9JQl9EVzBfRk9STUFUX1dPUkQJCQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VONl9JQl9EVzBfRk9STUFUX0RXT1JECQkJCSgweDIgPDwgOCkKKworCisKKworCisjZGVmaW5lIEdFTjhfSUJfRFcxX0ZPUk1BVF9fTUFTSwkJCQkweDAwMDAwMzAwCisjZGVmaW5lIEdFTjhfSUJfRFcxX0ZPUk1BVF9fU0hJRlQJCQkJOAorI2RlZmluZSBHRU44X0lCX0RXMV9GT1JNQVRfQllURQkJCQkJKDB4MCA8PCA4KQorI2RlZmluZSBHRU44X0lCX0RXMV9GT1JNQVRfV09SRAkJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU44X0lCX0RXMV9GT1JNQVRfRFdPUkQJCQkJKDB4MiA8PCA4KQorI2RlZmluZSBHRU44X0lCX0RXMV9NT0NTX19NQVNLCQkJCQkweDAwMDAwMDdmCisjZGVmaW5lIEdFTjhfSUJfRFcxX01PQ1NfX1NISUZUCQkJCQkwCisKKworCisKKyNkZWZpbmUgR0VONzVfM0RTVEFURV9WRl9fU0laRQkJCQkJMgorCisjZGVmaW5lIEdFTjc1X1ZGX0RXMF9DVVRfSU5ERVhfRU5BQkxFCQkJCSgweDEgPDwgOCkKKworCisjZGVmaW5lIEdFTjhfM0RTVEFURV9WRl9JTlNUQU5DSU5HX19TSVpFCQkJMworCisKKyNkZWZpbmUgR0VOOF9JTlNUQU5DSU5HX0RXMV9FTkFCTEUJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU44X0lOU1RBTkNJTkdfRFcxX1ZCX0lOREVYX19NQVNLCQkJMHgwMDAwMDAzZgorI2RlZmluZSBHRU44X0lOU1RBTkNJTkdfRFcxX1ZCX0lOREVYX19TSElGVAkJCTAKKworCisjZGVmaW5lIEdFTjhfM0RTVEFURV9WRl9TR1ZTX19TSVpFCQkJCTIKKworCisjZGVmaW5lIEdFTjhfU0dWU19EVzFfSUlEX0VOQUJMRQkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU44X1NHVlNfRFcxX0lJRF9WRV9DT01QX19NQVNLCQkJCTB4NjAwMDAwMDAKKyNkZWZpbmUgR0VOOF9TR1ZTX0RXMV9JSURfVkVfQ09NUF9fU0hJRlQJCQkyOQorI2RlZmluZSBHRU44X1NHVlNfRFcxX0lJRF9WRV9JTkRFWF9fTUFTSwkJCTB4MDAzZjAwMDAKKyNkZWZpbmUgR0VOOF9TR1ZTX0RXMV9JSURfVkVfSU5ERVhfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VOOF9TR1ZTX0RXMV9WSURfRU5BQkxFCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIEdFTjhfU0dWU19EVzFfVklEX1ZFX0NPTVBfX01BU0sJCQkJMHgwMDAwNjAwMAorI2RlZmluZSBHRU44X1NHVlNfRFcxX1ZJRF9WRV9DT01QX19TSElGVAkJCTEzCisjZGVmaW5lIEdFTjhfU0dWU19EVzFfVklEX1ZFX0lOREVYX19NQVNLCQkJMHgwMDAwMDAzZgorI2RlZmluZSBHRU44X1NHVlNfRFcxX1ZJRF9WRV9JTkRFWF9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VOOF8zRFNUQVRFX1ZGX1RPUE9MT0dZX19TSVpFCQkJCTIKKworCisjZGVmaW5lIEdFTjhfVE9QT0xPR1lfRFcxX1RZUEVfX01BU0sJCQkJMHgwMDAwMDAzZgorI2RlZmluZSBHRU44X1RPUE9MT0dZX0RXMV9UWVBFX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX19TSVpFCQk0CisKKyNkZWZpbmUgR0VONl9WUF9QVFJfRFcwX0NDX0NIQU5HRUQJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgR0VONl9WUF9QVFJfRFcwX1NGX0NIQU5HRUQJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgR0VONl9WUF9QVFJfRFcwX0NMSVBfQ0hBTkdFRAkJCQkoMHgxIDw8IDEwKQorCisjZGVmaW5lIEdFTjZfVlBfUFRSX0RXMV9DTElQX0FERFJfX01BU0sJCQkJMHhmZmZmZmZlMAorI2RlZmluZSBHRU42X1ZQX1BUUl9EVzFfQ0xJUF9BRERSX19TSElGVAkJCTUKKyNkZWZpbmUgR0VONl9WUF9QVFJfRFcxX0NMSVBfQUREUl9fU0hSCQkJCTUKKworI2RlZmluZSBHRU42X1ZQX1BUUl9EVzJfU0ZfQUREUl9fTUFTSwkJCQkweGZmZmZmZmUwCisjZGVmaW5lIEdFTjZfVlBfUFRSX0RXMl9TRl9BRERSX19TSElGVAkJCQk1CisjZGVmaW5lIEdFTjZfVlBfUFRSX0RXMl9TRl9BRERSX19TSFIJCQkJNQorCisjZGVmaW5lIEdFTjZfVlBfUFRSX0RXM19DQ19BRERSX19NQVNLCQkJCTB4ZmZmZmZmZTAKKyNkZWZpbmUgR0VONl9WUF9QVFJfRFczX0NDX0FERFJfX1NISUZUCQkJCTUKKyNkZWZpbmUgR0VONl9WUF9QVFJfRFczX0NDX0FERFJfX1NIUgkJCQk1CisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTX19TSVpFCQkJNAorCisKKyNkZWZpbmUgR0VONl9DQ19QVFJfRFcxX0JMRU5EX0NIQU5HRUQJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBHRU42X0NDX1BUUl9EVzFfQkxFTkRfQUREUl9fTUFTSwkJCTB4ZmZmZmZmYzAKKyNkZWZpbmUgR0VONl9DQ19QVFJfRFcxX0JMRU5EX0FERFJfX1NISUZUCQkJNgorI2RlZmluZSBHRU42X0NDX1BUUl9EVzFfQkxFTkRfQUREUl9fU0hSCQkJCTYKKworI2RlZmluZSBHRU42X0NDX1BUUl9EVzJfWlNfQ0hBTkdFRAkJCQkoMHgxIDw8IDApCisjZGVmaW5lIEdFTjZfQ0NfUFRSX0RXMl9aU19BRERSX19NQVNLCQkJCTB4ZmZmZmZmYzAKKyNkZWZpbmUgR0VONl9DQ19QVFJfRFcyX1pTX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VONl9DQ19QVFJfRFcyX1pTX0FERFJfX1NIUgkJCQk2CisKKyNkZWZpbmUgR0VONl9DQ19QVFJfRFczX0NDX0NIQU5HRUQJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBHRU42X0NDX1BUUl9EVzNfQ0NfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjZfQ0NfUFRSX0RXM19DQ19BRERSX19TSElGVAkJCQk2CisjZGVmaW5lIEdFTjZfQ0NfUFRSX0RXM19DQ19BRERSX19TSFIJCQkJNgorCisjZGVmaW5lIEdFTjZfM0RTVEFURV9TQ0lTU09SX1NUQVRFX1BPSU5URVJTX19TSVpFCQkyCisKKworI2RlZmluZSBHRU42X1NDSVNTT1JfUFRSX0RXMV9BRERSX19NQVNLCQkJCTB4ZmZmZmZmZTAKKyNkZWZpbmUgR0VONl9TQ0lTU09SX1BUUl9EVzFfQUREUl9fU0hJRlQJCQk1CisjZGVmaW5lIEdFTjZfU0NJU1NPUl9QVFJfRFcxX0FERFJfX1NIUgkJCQk1CisKKyNkZWZpbmUgR0VON18zRFNUQVRFX1BPSU5URVJTX0FOWV9fU0laRQkJCQkyCisKKworCisjZGVmaW5lIEdFTjZfM0RTVEFURV9WU19fU0laRQkJCQkJOQorCisKKyNkZWZpbmUgR0VONl9WU19EVzFfS0VSTkVMX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU42X1ZTX0RXMV9LRVJORUxfQUREUl9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU42X1ZTX0RXMV9LRVJORUxfQUREUl9fU0hSCQkJCTYKKworCisKKyNkZWZpbmUgR0VONl9WU19EVzRfVVJCX0dSRl9TVEFSVF9fTUFTSwkJCQkweDAxZjAwMDAwCisjZGVmaW5lIEdFTjZfVlNfRFc0X1VSQl9HUkZfU1RBUlRfX1NISUZUCQkJMjAKKyNkZWZpbmUgR0VONl9WU19EVzRfVVJCX1JFQURfTEVOX19NQVNLCQkJCTB4MDAwMWY4MDAKKyNkZWZpbmUgR0VONl9WU19EVzRfVVJCX1JFQURfTEVOX19TSElGVAkJCQkxMQorI2RlZmluZSBHRU42X1ZTX0RXNF9VUkJfUkVBRF9PRkZTRVRfX01BU0sJCQkweDAwMDAwM2YwCisjZGVmaW5lIEdFTjZfVlNfRFc0X1VSQl9SRUFEX09GRlNFVF9fU0hJRlQJCQk0CisKKyNkZWZpbmUgR0VONl9WU19EVzVfTUFYX1RIUkVBRFNfX01BU0sJCQkJMHhmZTAwMDAwMAorI2RlZmluZSBHRU42X1ZTX0RXNV9NQVhfVEhSRUFEU19fU0hJRlQJCQkJMjUKKyNkZWZpbmUgR0VONzVfVlNfRFc1X01BWF9USFJFQURTX19NQVNLCQkJCTB4ZmY4MDAwMDAKKyNkZWZpbmUgR0VONzVfVlNfRFc1X01BWF9USFJFQURTX19TSElGVAkJCQkyMworI2RlZmluZSBHRU42X1ZTX0RXNV9TVEFUSVNUSUNTCQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU42X1ZTX0RXNV9DQUNIRV9ESVNBQkxFCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VONl9WU19EVzVfVlNfRU5BQkxFCQkJCQkoMHgxIDw8IDApCisKKworCisjZGVmaW5lIEdFTjhfVlNfRFcxX0tFUk5FTF9BRERSX19NQVNLCQkJCTB4ZmZmZmZmYzAKKyNkZWZpbmUgR0VOOF9WU19EVzFfS0VSTkVMX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VOOF9WU19EVzFfS0VSTkVMX0FERFJfX1NIUgkJCQk2CisKKworCisKKworI2RlZmluZSBHRU44X1ZTX0RXNl9VUkJfR1JGX1NUQVJUX19NQVNLCQkJCTB4MDFmMDAwMDAKKyNkZWZpbmUgR0VOOF9WU19EVzZfVVJCX0dSRl9TVEFSVF9fU0hJRlQJCQkyMAorI2RlZmluZSBHRU44X1ZTX0RXNl9VUkJfUkVBRF9MRU5fX01BU0sJCQkJMHgwMDAxZjgwMAorI2RlZmluZSBHRU44X1ZTX0RXNl9VUkJfUkVBRF9MRU5fX1NISUZUCQkJCTExCisjZGVmaW5lIEdFTjhfVlNfRFc2X1VSQl9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAwMDAzZjAKKyNkZWZpbmUgR0VOOF9WU19EVzZfVVJCX1JFQURfT0ZGU0VUX19TSElGVAkJCTQKKworI2RlZmluZSBHRU44X1ZTX0RXN19NQVhfVEhSRUFEU19fTUFTSwkJCQkweGZmODAwMDAwCisjZGVmaW5lIEdFTjhfVlNfRFc3X01BWF9USFJFQURTX19TSElGVAkJCQkyMworI2RlZmluZSBHRU44X1ZTX0RXN19TVEFUSVNUSUNTCQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU44X1ZTX0RXN19TSU1EOF9FTkFCTEUJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU44X1ZTX0RXN19DQUNIRV9ESVNBQkxFCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VOOF9WU19EVzdfVlNfRU5BQkxFCQkJCQkoMHgxIDw8IDApCisKKyNkZWZpbmUgR0VOOF9WU19EVzhfVVJCX1dSSVRFX09GRlNFVF9fTUFTSwkJCTB4MDNlMDAwMDAKKyNkZWZpbmUgR0VOOF9WU19EVzhfVVJCX1dSSVRFX09GRlNFVF9fU0hJRlQJCQkyMQorI2RlZmluZSBHRU44X1ZTX0RXOF9VUkJfV1JJVEVfTEVOX19NQVNLCQkJCTB4MDAxZjAwMDAKKyNkZWZpbmUgR0VOOF9WU19EVzhfVVJCX1dSSVRFX0xFTl9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU44X1ZTX0RXOF9VQ1BfQ0xJUF9FTkFCTEVTX19NQVNLCQkJMHgwMDAwZmYwMAorI2RlZmluZSBHRU44X1ZTX0RXOF9VQ1BfQ0xJUF9FTkFCTEVTX19TSElGVAkJCTgKKworI2RlZmluZSBHRU43XzNEU1RBVEVfSFNfX1NJWkUJCQkJCTkKKworCisjZGVmaW5lIEdFTjdfSFNfRFcxX0RJU1BBVENIX01BWF9USFJFQURTX19NQVNLCQkJMHgwMDAwMDA3ZgorI2RlZmluZSBHRU43X0hTX0RXMV9ESVNQQVRDSF9NQVhfVEhSRUFEU19fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjc1X0hTX0RXMV9ESVNQQVRDSF9NQVhfVEhSRUFEU19fTUFTSwkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgR0VONzVfSFNfRFcxX0RJU1BBVENIX01BWF9USFJFQURTX19TSElGVAkJMAorCisjZGVmaW5lIEdFTjdfSFNfRFcyX0hTX0VOQUJMRQkJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VON19IU19EVzJfU1RBVElTVElDUwkJCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VON19IU19EVzJfSU5TVEFOQ0VfQ09VTlRfX01BU0sJCQkweDAwMDAwMDBmCisjZGVmaW5lIEdFTjdfSFNfRFcyX0lOU1RBTkNFX0NPVU5UX19TSElGVAkJCTAKKworI2RlZmluZSBHRU43X0hTX0RXM19LRVJORUxfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjdfSFNfRFczX0tFUk5FTF9BRERSX19TSElGVAkJCQk2CisjZGVmaW5lIEdFTjdfSFNfRFczX0tFUk5FTF9BRERSX19TSFIJCQkJNgorCisKKyNkZWZpbmUgR0VON19IU19EVzVfU1BGCQkJCQkJKDB4MSA8PCAyNykKKyNkZWZpbmUgR0VON19IU19EVzVfVk1FCQkJCQkJKDB4MSA8PCAyNikKKyNkZWZpbmUgR0VONzVfSFNfRFc1X0FDQ0VTU19VQVYJCQkJCSgweDEgPDwgMjUpCisjZGVmaW5lIEdFTjdfSFNfRFc1X0lOQ0xVREVfVkVSVEVYX0hBTkRMRVMJCQkoMHgxIDw8IDI0KQorI2RlZmluZSBHRU43X0hTX0RXNV9VUkJfR1JGX1NUQVJUX19NQVNLCQkJCTB4MDBmODAwMDAKKyNkZWZpbmUgR0VON19IU19EVzVfVVJCX0dSRl9TVEFSVF9fU0hJRlQJCQkxOQorI2RlZmluZSBHRU43X0hTX0RXNV9VUkJfUkVBRF9MRU5fX01BU0sJCQkJMHgwMDAxZjgwMAorI2RlZmluZSBHRU43X0hTX0RXNV9VUkJfUkVBRF9MRU5fX1NISUZUCQkJCTExCisjZGVmaW5lIEdFTjdfSFNfRFc1X1VSQl9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAwMDAzZjAKKyNkZWZpbmUgR0VON19IU19EVzVfVVJCX1JFQURfT0ZGU0VUX19TSElGVAkJCTQKKworI2RlZmluZSBHRU43X0hTX0RXNl9VUkJfU0VNQVBIT1JFX0FERFJfX01BU0sJCQkweDAwMDAwZmZmCisjZGVmaW5lIEdFTjdfSFNfRFc2X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjdfSFNfRFc2X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hSCQkJNgorI2RlZmluZSBHRU43NV9IU19EVzZfVVJCX1NFTUFQSE9SRV9BRERSX19NQVNLCQkJMHgwMDAwMWZmZgorI2RlZmluZSBHRU43NV9IU19EVzZfVVJCX1NFTUFQSE9SRV9BRERSX19TSElGVAkJCTAKKyNkZWZpbmUgR0VONzVfSFNfRFc2X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hSCQkJNgorCisKKworI2RlZmluZSBHRU44X0hTX0RXMV9ESVNQQVRDSF9NQVhfVEhSRUFEU19fTUFTSwkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgR0VOOF9IU19EVzFfRElTUEFUQ0hfTUFYX1RIUkVBRFNfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjhfSFNfRFcyX0hTX0VOQUJMRQkJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VOOF9IU19EVzJfU1RBVElTVElDUwkJCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VOOF9IU19EVzJfSU5TVEFOQ0VfQ09VTlRfX01BU0sJCQkweDAwMDAwMDBmCisjZGVmaW5lIEdFTjhfSFNfRFcyX0lOU1RBTkNFX0NPVU5UX19TSElGVAkJCTAKKworI2RlZmluZSBHRU44X0hTX0RXM19LRVJORUxfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjhfSFNfRFczX0tFUk5FTF9BRERSX19TSElGVAkJCQk2CisjZGVmaW5lIEdFTjhfSFNfRFczX0tFUk5FTF9BRERSX19TSFIJCQkJNgorCisKKworCisjZGVmaW5lIEdFTjhfSFNfRFc3X1NQRgkJCQkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjhfSFNfRFc3X1ZNRQkJCQkJCSgweDEgPDwgMjYpCisjZGVmaW5lIEdFTjhfSFNfRFc3X0FDQ0VTU19VQVYJCQkJCSgweDEgPDwgMjUpCisjZGVmaW5lIEdFTjhfSFNfRFc3X0lOQ0xVREVfVkVSVEVYX0hBTkRMRVMJCQkoMHgxIDw8IDI0KQorI2RlZmluZSBHRU44X0hTX0RXN19VUkJfR1JGX1NUQVJUX19NQVNLCQkJCTB4MDBmODAwMDAKKyNkZWZpbmUgR0VOOF9IU19EVzdfVVJCX0dSRl9TVEFSVF9fU0hJRlQJCQkxOQorI2RlZmluZSBHRU44X0hTX0RXN19VUkJfUkVBRF9MRU5fX01BU0sJCQkJMHgwMDAxZjgwMAorI2RlZmluZSBHRU44X0hTX0RXN19VUkJfUkVBRF9MRU5fX1NISUZUCQkJCTExCisjZGVmaW5lIEdFTjhfSFNfRFc3X1VSQl9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAwMDAzZjAKKyNkZWZpbmUgR0VOOF9IU19EVzdfVVJCX1JFQURfT0ZGU0VUX19TSElGVAkJCTQKKworI2RlZmluZSBHRU44X0hTX0RXOF9VUkJfU0VNQVBIT1JFX0FERFJfX01BU0sJCQkweDAwMDAxZmZmCisjZGVmaW5lIEdFTjhfSFNfRFc4X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjhfSFNfRFc4X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hSCQkJNgorCisjZGVmaW5lIEdFTjdfM0RTVEFURV9URV9fU0laRQkJCQkJNAorCisKKyNkZWZpbmUgR0VON19URV9EVzFfUEFSVElUSU9OSU5HX19NQVNLCQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgR0VON19URV9EVzFfUEFSVElUSU9OSU5HX19TSElGVAkJCQkxMgorI2RlZmluZSBHRU43X1RFX0RXMV9QQVJUSVRJT05JTkdfSU5URUdFUgkJCSgweDAgPDwgMTIpCisjZGVmaW5lIEdFTjdfVEVfRFcxX1BBUlRJVElPTklOR19PRERfRlJBQ1RJT05BTAkJCSgweDEgPDwgMTIpCisjZGVmaW5lIEdFTjdfVEVfRFcxX1BBUlRJVElPTklOR19FVkVOX0ZSQUNUSU9OQUwJCSgweDIgPDwgMTIpCisjZGVmaW5lIEdFTjdfVEVfRFcxX09VVFBVVF9UT1BPX19NQVNLCQkJCTB4MDAwMDAzMDAKKyNkZWZpbmUgR0VON19URV9EVzFfT1VUUFVUX1RPUE9fX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VON19URV9EVzFfT1VUUFVUX1RPUE9fUE9JTlQJCQkJKDB4MCA8PCA4KQorI2RlZmluZSBHRU43X1RFX0RXMV9PVVRQVVRfVE9QT19MSU5FCQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VON19URV9EVzFfT1VUUFVUX1RPUE9fVFJJX0NXCQkJCSgweDIgPDwgOCkKKyNkZWZpbmUgR0VON19URV9EVzFfT1VUUFVUX1RPUE9fVFJJX0NDVwkJCQkoMHgzIDw8IDgpCisjZGVmaW5lIEdFTjdfVEVfRFcxX0RPTUFJTl9fTUFTSwkJCQkweDAwMDAwMDMwCisjZGVmaW5lIEdFTjdfVEVfRFcxX0RPTUFJTl9fU0hJRlQJCQkJNAorI2RlZmluZSBHRU43X1RFX0RXMV9ET01BSU5fUVVBRAkJCQkJKDB4MCA8PCA0KQorI2RlZmluZSBHRU43X1RFX0RXMV9ET01BSU5fVFJJCQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIEdFTjdfVEVfRFcxX0RPTUFJTl9JU09MSU5FCQkJCSgweDIgPDwgNCkKKyNkZWZpbmUgR0VON19URV9EVzFfTU9ERV9fTUFTSwkJCQkJMHgwMDAwMDAwNgorI2RlZmluZSBHRU43X1RFX0RXMV9NT0RFX19TSElGVAkJCQkJMQorI2RlZmluZSBHRU43X1RFX0RXMV9NT0RFX0hXCQkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIEdFTjdfVEVfRFcxX01PREVfU1cJCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VON19URV9EVzFfVEVfRU5BQkxFCQkJCQkoMHgxIDw8IDApCisKKworCisjZGVmaW5lIEdFTjdfM0RTVEFURV9EU19fU0laRQkJCQkJMTEKKworCisjZGVmaW5lIEdFTjdfRFNfRFcxX0tFUk5FTF9BRERSX19NQVNLCQkJCTB4ZmZmZmZmYzAKKyNkZWZpbmUgR0VON19EU19EVzFfS0VSTkVMX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VON19EU19EVzFfS0VSTkVMX0FERFJfX1NIUgkJCQk2CisKKworCisjZGVmaW5lIEdFTjdfRFNfRFc0X1VSQl9HUkZfU1RBUlRfX01BU0sJCQkJMHgwMWYwMDAwMAorI2RlZmluZSBHRU43X0RTX0RXNF9VUkJfR1JGX1NUQVJUX19TSElGVAkJCTIwCisjZGVmaW5lIEdFTjdfRFNfRFc0X1VSQl9SRUFEX0xFTl9fTUFTSwkJCQkweDAwMDNmODAwCisjZGVmaW5lIEdFTjdfRFNfRFc0X1VSQl9SRUFEX0xFTl9fU0hJRlQJCQkJMTEKKyNkZWZpbmUgR0VON19EU19EVzRfVVJCX1JFQURfT0ZGU0VUX19NQVNLCQkJMHgwMDAwMDNmMAorI2RlZmluZSBHRU43X0RTX0RXNF9VUkJfUkVBRF9PRkZTRVRfX1NISUZUCQkJNAorCisjZGVmaW5lIEdFTjdfRFNfRFc1X01BWF9USFJFQURTX19NQVNLCQkJCTB4ZmUwMDAwMDAKKyNkZWZpbmUgR0VON19EU19EVzVfTUFYX1RIUkVBRFNfX1NISUZUCQkJCTI1CisjZGVmaW5lIEdFTjc1X0RTX0RXNV9NQVhfVEhSRUFEU19fTUFTSwkJCQkweDNmZTAwMDAwCisjZGVmaW5lIEdFTjc1X0RTX0RXNV9NQVhfVEhSRUFEU19fU0hJRlQJCQkJMjEKKyNkZWZpbmUgR0VON19EU19EVzVfU1RBVElTVElDUwkJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgR0VON19EU19EVzVfQ09NUFVURV9XCQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIEdFTjdfRFNfRFc1X0NBQ0hFX0RJU0FCTEUJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU43X0RTX0RXNV9EU19FTkFCTEUJCQkJCSgweDEgPDwgMCkKKworCisKKyNkZWZpbmUgR0VOOF9EU19EVzFfS0VSTkVMX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU44X0RTX0RXMV9LRVJORUxfQUREUl9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU44X0RTX0RXMV9LRVJORUxfQUREUl9fU0hSCQkJCTYKKworCisKKworCisjZGVmaW5lIEdFTjhfRFNfRFc2X1VSQl9HUkZfU1RBUlRfX01BU0sJCQkJMHgwMWYwMDAwMAorI2RlZmluZSBHRU44X0RTX0RXNl9VUkJfR1JGX1NUQVJUX19TSElGVAkJCTIwCisjZGVmaW5lIEdFTjhfRFNfRFc2X1VSQl9SRUFEX0xFTl9fTUFTSwkJCQkweDAwMDNmODAwCisjZGVmaW5lIEdFTjhfRFNfRFc2X1VSQl9SRUFEX0xFTl9fU0hJRlQJCQkJMTEKKyNkZWZpbmUgR0VOOF9EU19EVzZfVVJCX1JFQURfT0ZGU0VUX19NQVNLCQkJMHgwMDAwMDNmMAorI2RlZmluZSBHRU44X0RTX0RXNl9VUkJfUkVBRF9PRkZTRVRfX1NISUZUCQkJNAorCisjZGVmaW5lIEdFTjhfRFNfRFc3X01BWF9USFJFQURTX19NQVNLCQkJCTB4M2ZlMDAwMDAKKyNkZWZpbmUgR0VOOF9EU19EVzdfTUFYX1RIUkVBRFNfX1NISUZUCQkJCTIxCisjZGVmaW5lIEdFTjhfRFNfRFc3X1NUQVRJU1RJQ1MJCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjhfRFNfRFc3X0NPTVBVVEVfVwkJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU44X0RTX0RXN19DQUNIRV9ESVNBQkxFCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VOOF9EU19EVzdfRFNfRU5BQkxFCQkJCQkoMHgxIDw8IDApCisKKyNkZWZpbmUgR0VOOF9EU19EVzhfVVJCX1dSSVRFX09GRlNFVF9fTUFTSwkJCTB4MDNlMDAwMDAKKyNkZWZpbmUgR0VOOF9EU19EVzhfVVJCX1dSSVRFX09GRlNFVF9fU0hJRlQJCQkyMQorI2RlZmluZSBHRU44X0RTX0RXOF9VUkJfV1JJVEVfTEVOX19NQVNLCQkJCTB4MDAxZjAwMDAKKyNkZWZpbmUgR0VOOF9EU19EVzhfVVJCX1dSSVRFX0xFTl9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU44X0RTX0RXOF9VQ1BfQ0xJUF9FTkFCTEVTX19NQVNLCQkJMHgwMDAwZmYwMAorI2RlZmluZSBHRU44X0RTX0RXOF9VQ1BfQ0xJUF9FTkFCTEVTX19TSElGVAkJCTgKKworCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX0dTX19TSVpFCQkJCQkxMAorCisKKyNkZWZpbmUgR0VONl9HU19EVzFfS0VSTkVMX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU42X0dTX0RXMV9LRVJORUxfQUREUl9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU42X0dTX0RXMV9LRVJORUxfQUREUl9fU0hSCQkJCTYKKworCisKKyNkZWZpbmUgR0VONl9HU19EVzRfVVJCX1JFQURfTEVOX19NQVNLCQkJCTB4MDAwMWY4MDAKKyNkZWZpbmUgR0VONl9HU19EVzRfVVJCX1JFQURfTEVOX19TSElGVAkJCQkxMQorI2RlZmluZSBHRU42X0dTX0RXNF9VUkJfUkVBRF9PRkZTRVRfX01BU0sJCQkweDAwMDAwM2YwCisjZGVmaW5lIEdFTjZfR1NfRFc0X1VSQl9SRUFEX09GRlNFVF9fU0hJRlQJCQk0CisjZGVmaW5lIEdFTjZfR1NfRFc0X1VSQl9HUkZfU1RBUlRfX01BU0sJCQkJMHgwMDAwMDAwZgorI2RlZmluZSBHRU42X0dTX0RXNF9VUkJfR1JGX1NUQVJUX19TSElGVAkJCTAKKworI2RlZmluZSBHRU42X0dTX0RXNV9NQVhfVEhSRUFEU19fTUFTSwkJCQkweGZlMDAwMDAwCisjZGVmaW5lIEdFTjZfR1NfRFc1X01BWF9USFJFQURTX19TSElGVAkJCQkyNQorI2RlZmluZSBHRU42X0dTX0RXNV9TVEFUSVNUSUNTCQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU42X0dTX0RXNV9TT19TVEFUSVNUSUNTCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR0VONl9HU19EVzVfUkVOREVSX0VOQUJMRQkJCQkoMHgxIDw8IDgpCisKKyNkZWZpbmUgR0VONl9HU19EVzZfUkVPUkRFUl9FTkFCTEUJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VONl9HU19EVzZfRElTQ0FSRF9BREpBQ0VOQ1kJCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VONl9HU19EVzZfU1ZCSV9QQVlMT0FEX0VOQUJMRQkJCQkoMHgxIDw8IDI4KQorI2RlZmluZSBHRU42X0dTX0RXNl9TVkJJX1BPU1RfSU5DX0VOQUJMRQkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjZfR1NfRFc2X1NWQklfUE9TVF9JTkNfVkFMX19NQVNLCQkJMHgwM2ZmMDAwMAorI2RlZmluZSBHRU42X0dTX0RXNl9TVkJJX1BPU1RfSU5DX1ZBTF9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU42X0dTX0RXNl9HU19FTkFCTEUJCQkJCSgweDEgPDwgMTUpCisKKworCisjZGVmaW5lIEdFTjdfR1NfRFcxX0tFUk5FTF9BRERSX19NQVNLCQkJCTB4ZmZmZmZmYzAKKyNkZWZpbmUgR0VON19HU19EVzFfS0VSTkVMX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VON19HU19EVzFfS0VSTkVMX0FERFJfX1NIUgkJCQk2CisKKworCisjZGVmaW5lIEdFTjdfR1NfRFc0X09VVFBVVF9TSVpFX19NQVNLCQkJCTB4MWY4MDAwMDAKKyNkZWZpbmUgR0VON19HU19EVzRfT1VUUFVUX1NJWkVfX1NISUZUCQkJCTIzCisjZGVmaW5lIEdFTjdfR1NfRFc0X09VVFBVVF9UT1BPX19NQVNLCQkJCTB4MDA3ZTAwMDAKKyNkZWZpbmUgR0VON19HU19EVzRfT1VUUFVUX1RPUE9fX1NISUZUCQkJCTE3CisjZGVmaW5lIEdFTjdfR1NfRFc0X1VSQl9SRUFEX0xFTl9fTUFTSwkJCQkweDAwMDFmODAwCisjZGVmaW5lIEdFTjdfR1NfRFc0X1VSQl9SRUFEX0xFTl9fU0hJRlQJCQkJMTEKKyNkZWZpbmUgR0VON19HU19EVzRfSU5DTFVERV9WRVJURVhfSEFORExFUwkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjdfR1NfRFc0X1VSQl9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAwMDAzZjAKKyNkZWZpbmUgR0VON19HU19EVzRfVVJCX1JFQURfT0ZGU0VUX19TSElGVAkJCTQKKyNkZWZpbmUgR0VON19HU19EVzRfVVJCX0dSRl9TVEFSVF9fTUFTSwkJCQkweDAwMDAwMDBmCisjZGVmaW5lIEdFTjdfR1NfRFc0X1VSQl9HUkZfU1RBUlRfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjdfR1NfRFc1X01BWF9USFJFQURTX19NQVNLCQkJCTB4ZmUwMDAwMDAKKyNkZWZpbmUgR0VON19HU19EVzVfTUFYX1RIUkVBRFNfX1NISUZUCQkJCTI1CisjZGVmaW5lIEdFTjdfR1NfRFc1X0dTQ1RSTF9fTUFTSwkJCQkweDAxMDAwMDAwCisjZGVmaW5lIEdFTjdfR1NfRFc1X0dTQ1RSTF9fU0hJRlQJCQkJMjQKKyNkZWZpbmUgR0VON19HU19EVzVfR1NDVFJMX0NVVAkJCQkJKDB4MCA8PCAyNCkKKyNkZWZpbmUgR0VON19HU19EVzVfR1NDVFJMX1NJRAkJCQkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgR0VONzVfR1NfRFc1X01BWF9USFJFQURTX19NQVNLCQkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgR0VONzVfR1NfRFc1X01BWF9USFJFQURTX19TSElGVAkJCQkyNAorI2RlZmluZSBHRU43X0dTX0RXNV9DT05UUk9MX0RBVEFfSEVBREVSX1NJWkVfX01BU0sJCTB4MDBmMDAwMDAKKyNkZWZpbmUgR0VON19HU19EVzVfQ09OVFJPTF9EQVRBX0hFQURFUl9TSVpFX19TSElGVAkJMjAKKyNkZWZpbmUgR0VON19HU19EVzVfSU5TVEFOQ0VfQ09OVFJPTF9fTUFTSwkJCTB4MDAwZjgwMDAKKyNkZWZpbmUgR0VON19HU19EVzVfSU5TVEFOQ0VfQ09OVFJPTF9fU0hJRlQJCQkxNQorI2RlZmluZSBHRU43X0dTX0RXNV9ERUZBVUxUX1NUUkVBTV9JRF9fTUFTSwkJCTB4MDAwMDYwMDAKKyNkZWZpbmUgR0VON19HU19EVzVfREVGQVVMVF9TVFJFQU1fSURfX1NISUZUCQkJMTMKKyNkZWZpbmUgR0VON19HU19EVzVfRElTUEFUQ0hfTU9ERV9fTUFTSwkJCQkweDAwMDAxODAwCisjZGVmaW5lIEdFTjdfR1NfRFc1X0RJU1BBVENIX01PREVfX1NISUZUCQkJMTEKKyNkZWZpbmUgR0VON19HU19EVzVfRElTUEFUQ0hfTU9ERV9TSU5HTEUJCQkoMHgwIDw8IDExKQorI2RlZmluZSBHRU43X0dTX0RXNV9ESVNQQVRDSF9NT0RFX0RVQUxfSU5TVEFOQ0UJCQkoMHgxIDw8IDExKQorI2RlZmluZSBHRU43X0dTX0RXNV9ESVNQQVRDSF9NT0RFX0RVQUxfT0JKRUNUCQkJKDB4MiA8PCAxMSkKKyNkZWZpbmUgR0VON19HU19EVzVfU1RBVElTVElDUwkJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgR0VON19HU19EVzVfSU5WT0NBVElPTl9JTkNSX19NQVNLCQkJMHgwMDAwMDNlMAorI2RlZmluZSBHRU43X0dTX0RXNV9JTlZPQ0FUSU9OX0lOQ1JfX1NISUZUCQkJNQorI2RlZmluZSBHRU43X0dTX0RXNV9JTkNMVURFX1BSSU1JVElWRV9JRAkJCSgweDEgPDwgNCkKKyNkZWZpbmUgR0VON19HU19EVzVfSElOVAkJCQkJKDB4MSA8PCAzKQorI2RlZmluZSBHRU43X0dTX0RXNV9SRU9SREVSX0VOQUJMRQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIEdFTjc1X0dTX0RXNV9SRU9SREVSX19NQVNLCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0VONzVfR1NfRFc1X1JFT1JERVJfX1NISUZUCQkJCTIKKyNkZWZpbmUgR0VONzVfR1NfRFc1X1JFT1JERVJfTEVBRElORwkJCQkoMHgwIDw8IDIpCisjZGVmaW5lIEdFTjc1X0dTX0RXNV9SRU9SREVSX1RSQUlMSU5HCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgR0VON19HU19EVzVfRElTQ0FSRF9BREpBQ0VOQ1kJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU43X0dTX0RXNV9HU19FTkFCTEUJCQkJCSgweDEgPDwgMCkKKworI2RlZmluZSBHRU43NV9HU19EVzZfR1NDVFJMX19NQVNLCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgR0VONzVfR1NfRFc2X0dTQ1RSTF9fU0hJRlQJCQkJMzEKKyNkZWZpbmUgR0VONzVfR1NfRFc2X0dTQ1RSTF9DVVQJCQkJCSgweDAgPDwgMzEpCisjZGVmaW5lIEdFTjc1X0dTX0RXNl9HU0NUUkxfU0lECQkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU43X0dTX0RXNl9VUkJfU0VNQVBIT1JFX0FERFJfX01BU0sJCQkweDAwMDAwZmZmCisjZGVmaW5lIEdFTjdfR1NfRFc2X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjdfR1NfRFc2X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hSCQkJNgorI2RlZmluZSBHRU43NV9HU19EVzZfVVJCX1NFTUFQSE9SRV9BRERSX19NQVNLCQkJMHgwMDAwMWZmZgorI2RlZmluZSBHRU43NV9HU19EVzZfVVJCX1NFTUFQSE9SRV9BRERSX19TSElGVAkJCTAKKyNkZWZpbmUgR0VONzVfR1NfRFc2X1VSQl9TRU1BUEhPUkVfQUREUl9fU0hSCQkJNgorCisKKworI2RlZmluZSBHRU44X0dTX0RXMV9LRVJORUxfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjhfR1NfRFcxX0tFUk5FTF9BRERSX19TSElGVAkJCQk2CisjZGVmaW5lIEdFTjhfR1NfRFcxX0tFUk5FTF9BRERSX19TSFIJCQkJNgorCisKKyNkZWZpbmUgR0VOOF9HU19EVzNfRVhQRUNURURfVkVSVEVYX0NPVU5UX19NQVNLCQkJMHgwMDAwMDA3ZgorI2RlZmluZSBHRU44X0dTX0RXM19FWFBFQ1RFRF9WRVJURVhfQ09VTlRfX1NISUZUCQkwCisKKworCisjZGVmaW5lIEdFTjhfR1NfRFc2X09VVFBVVF9TSVpFX19NQVNLCQkJCTB4MWY4MDAwMDAKKyNkZWZpbmUgR0VOOF9HU19EVzZfT1VUUFVUX1NJWkVfX1NISUZUCQkJCTIzCisjZGVmaW5lIEdFTjhfR1NfRFc2X09VVFBVVF9UT1BPX19NQVNLCQkJCTB4MDA3ZTAwMDAKKyNkZWZpbmUgR0VOOF9HU19EVzZfT1VUUFVUX1RPUE9fX1NISUZUCQkJCTE3CisjZGVmaW5lIEdFTjhfR1NfRFc2X1VSQl9SRUFEX0xFTl9fTUFTSwkJCQkweDAwMDFmODAwCisjZGVmaW5lIEdFTjhfR1NfRFc2X1VSQl9SRUFEX0xFTl9fU0hJRlQJCQkJMTEKKyNkZWZpbmUgR0VOOF9HU19EVzZfSU5DTFVERV9WRVJURVhfSEFORExFUwkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjhfR1NfRFc2X1VSQl9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAwMDAzZjAKKyNkZWZpbmUgR0VOOF9HU19EVzZfVVJCX1JFQURfT0ZGU0VUX19TSElGVAkJCTQKKyNkZWZpbmUgR0VOOF9HU19EVzZfVVJCX0dSRl9TVEFSVF9fTUFTSwkJCQkweDAwMDAwMDBmCisjZGVmaW5lIEdFTjhfR1NfRFc2X1VSQl9HUkZfU1RBUlRfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjhfR1NfRFc3X01BWF9USFJFQURTX19NQVNLCQkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgR0VOOF9HU19EVzdfTUFYX1RIUkVBRFNfX1NISUZUCQkJCTI0CisjZGVmaW5lIEdFTjhfR1NfRFc3X0NPTlRST0xfREFUQV9IRUFERVJfU0laRV9fTUFTSwkJMHgwMGYwMDAwMAorI2RlZmluZSBHRU44X0dTX0RXN19DT05UUk9MX0RBVEFfSEVBREVSX1NJWkVfX1NISUZUCQkyMAorI2RlZmluZSBHRU44X0dTX0RXN19JTlNUQU5DRV9DT05UUk9MX19NQVNLCQkJMHgwMDBmODAwMAorI2RlZmluZSBHRU44X0dTX0RXN19JTlNUQU5DRV9DT05UUk9MX19TSElGVAkJCTE1CisjZGVmaW5lIEdFTjhfR1NfRFc3X0RFRkFVTFRfU1RSRUFNX0lEX19NQVNLCQkJMHgwMDAwNjAwMAorI2RlZmluZSBHRU44X0dTX0RXN19ERUZBVUxUX1NUUkVBTV9JRF9fU0hJRlQJCQkxMworI2RlZmluZSBHRU44X0dTX0RXN19ESVNQQVRDSF9NT0RFX19NQVNLCQkJCTB4MDAwMDE4MDAKKyNkZWZpbmUgR0VOOF9HU19EVzdfRElTUEFUQ0hfTU9ERV9fU0hJRlQJCQkxMQorI2RlZmluZSBHRU44X0dTX0RXN19ESVNQQVRDSF9NT0RFX1NJTkdMRQkJCSgweDAgPDwgMTEpCisjZGVmaW5lIEdFTjhfR1NfRFc3X0RJU1BBVENIX01PREVfRFVBTF9JTlNUQU5DRQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjhfR1NfRFc3X0RJU1BBVENIX01PREVfRFVBTF9PQkpFQ1QJCQkoMHgyIDw8IDExKQorI2RlZmluZSBHRU44X0dTX0RXN19TVEFUSVNUSUNTCQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU44X0dTX0RXN19JTlZPQ0FUSU9OX0lOQ1JfX01BU0sJCQkweDAwMDAwM2UwCisjZGVmaW5lIEdFTjhfR1NfRFc3X0lOVk9DQVRJT05fSU5DUl9fU0hJRlQJCQk1CisjZGVmaW5lIEdFTjhfR1NfRFc3X0lOQ0xVREVfUFJJTUlUSVZFX0lECQkJKDB4MSA8PCA0KQorI2RlZmluZSBHRU44X0dTX0RXN19ISU5UCQkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIEdFTjhfR1NfRFc3X1JFT1JERVJfX01BU0sJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBHRU44X0dTX0RXN19SRU9SREVSX19TSElGVAkJCQkyCisjZGVmaW5lIEdFTjhfR1NfRFc3X1JFT1JERVJfTEVBRElORwkJCQkoMHgwIDw8IDIpCisjZGVmaW5lIEdFTjhfR1NfRFc3X1JFT1JERVJfVFJBSUxJTkcJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU44X0dTX0RXN19ESVNDQVJEX0FESkFDRU5DWQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIEdFTjhfR1NfRFc3X0dTX0VOQUJMRQkJCQkJKDB4MSA8PCAwKQorCisjZGVmaW5lIEdFTjhfR1NfRFc4X0dTQ1RSTF9fTUFTSwkJCQkweDgwMDAwMDAwCisjZGVmaW5lIEdFTjhfR1NfRFc4X0dTQ1RSTF9fU0hJRlQJCQkJMzEKKyNkZWZpbmUgR0VOOF9HU19EVzhfR1NDVFJMX0NVVAkJCQkJKDB4MCA8PCAzMSkKKyNkZWZpbmUgR0VOOF9HU19EVzhfR1NDVFJMX1NJRAkJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VOOF9HU19EVzhfVVJCX1NFTUFQSE9SRV9BRERSX19NQVNLCQkJMHgwMDAwMWZmZgorI2RlZmluZSBHRU44X0dTX0RXOF9VUkJfU0VNQVBIT1JFX0FERFJfX1NISUZUCQkJMAorI2RlZmluZSBHRU44X0dTX0RXOF9VUkJfU0VNQVBIT1JFX0FERFJfX1NIUgkJCTYKKyNkZWZpbmUgR0VOOV9HU19EVzhfTUFYX1RIUkVBRFNfX01BU0sJCQkJMHgwMDAwMWZmZgorI2RlZmluZSBHRU45X0dTX0RXOF9NQVhfVEhSRUFEU19fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjhfR1NfRFc5X1VSQl9XUklURV9PRkZTRVRfX01BU0sJCQkweDAzZTAwMDAwCisjZGVmaW5lIEdFTjhfR1NfRFc5X1VSQl9XUklURV9PRkZTRVRfX1NISUZUCQkJMjEKKyNkZWZpbmUgR0VOOF9HU19EVzlfVVJCX1dSSVRFX0xFTl9fTUFTSwkJCQkweDAwMWYwMDAwCisjZGVmaW5lIEdFTjhfR1NfRFc5X1VSQl9XUklURV9MRU5fX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VOOF9HU19EVzlfVUNQX0NMSVBfRU5BQkxFU19fTUFTSwkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgR0VOOF9HU19EVzlfVUNQX0NMSVBfRU5BQkxFU19fU0hJRlQJCQk4CisKKyNkZWZpbmUgR0VON18zRFNUQVRFX1NUUkVBTU9VVF9fU0laRQkJCQk1CisKKworI2RlZmluZSBHRU43X1NPX0RXMV9TT19FTkFCTEUJCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjdfU09fRFcxX1JFTkRFUl9ESVNBQkxFCQkJCSgweDEgPDwgMzApCisjZGVmaW5lIEdFTjdfU09fRFcxX1JFTkRFUl9TVFJFQU1fU0VMRUNUX19NQVNLCQkJMHgxODAwMDAwMAorI2RlZmluZSBHRU43X1NPX0RXMV9SRU5ERVJfU1RSRUFNX1NFTEVDVF9fU0hJRlQJCQkyNworI2RlZmluZSBHRU43X1NPX0RXMV9SRU9SREVSX19NQVNLCQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgR0VON19TT19EVzFfUkVPUkRFUl9fU0hJRlQJCQkJMjYKKyNkZWZpbmUgR0VON19TT19EVzFfUkVPUkRFUl9MRUFESU5HCQkJCSgweDAgPDwgMjYpCisjZGVmaW5lIEdFTjdfU09fRFcxX1JFT1JERVJfVFJBSUxJTkcJCQkJKDB4MSA8PCAyNikKKyNkZWZpbmUgR0VON19TT19EVzFfU1RBVElTVElDUwkJCQkJKDB4MSA8PCAyNSkKKyNkZWZpbmUgR0VON19TT19EVzFfQlVGRkVSX0VOQUJMRVNfX01BU0sJCQkweDAwMDAwZjAwCisjZGVmaW5lIEdFTjdfU09fRFcxX0JVRkZFUl9FTkFCTEVTX19TSElGVAkJCTgKKworI2RlZmluZSBHRU43X1NPX0RXMl9TVFJFQU0zX1JFQURfT0ZGU0VUX19NQVNLCQkJMHgyMDAwMDAwMAorI2RlZmluZSBHRU43X1NPX0RXMl9TVFJFQU0zX1JFQURfT0ZGU0VUX19TSElGVAkJCTI5CisjZGVmaW5lIEdFTjdfU09fRFcyX1NUUkVBTTNfUkVBRF9MRU5fX01BU0sJCQkweDFmMDAwMDAwCisjZGVmaW5lIEdFTjdfU09fRFcyX1NUUkVBTTNfUkVBRF9MRU5fX1NISUZUCQkJMjQKKyNkZWZpbmUgR0VON19TT19EVzJfU1RSRUFNMl9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgR0VON19TT19EVzJfU1RSRUFNMl9SRUFEX09GRlNFVF9fU0hJRlQJCQkyMQorI2RlZmluZSBHRU43X1NPX0RXMl9TVFJFQU0yX1JFQURfTEVOX19NQVNLCQkJMHgwMDFmMDAwMAorI2RlZmluZSBHRU43X1NPX0RXMl9TVFJFQU0yX1JFQURfTEVOX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjdfU09fRFcyX1NUUkVBTTFfUkVBRF9PRkZTRVRfX01BU0sJCQkweDAwMDAyMDAwCisjZGVmaW5lIEdFTjdfU09fRFcyX1NUUkVBTTFfUkVBRF9PRkZTRVRfX1NISUZUCQkJMTMKKyNkZWZpbmUgR0VON19TT19EVzJfU1RSRUFNMV9SRUFEX0xFTl9fTUFTSwkJCTB4MDAwMDFmMDAKKyNkZWZpbmUgR0VON19TT19EVzJfU1RSRUFNMV9SRUFEX0xFTl9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjdfU09fRFcyX1NUUkVBTTBfUkVBRF9PRkZTRVRfX01BU0sJCQkweDAwMDAwMDIwCisjZGVmaW5lIEdFTjdfU09fRFcyX1NUUkVBTTBfUkVBRF9PRkZTRVRfX1NISUZUCQkJNQorI2RlZmluZSBHRU43X1NPX0RXMl9TVFJFQU0wX1JFQURfTEVOX19NQVNLCQkJMHgwMDAwMDAxZgorI2RlZmluZSBHRU43X1NPX0RXMl9TVFJFQU0wX1JFQURfTEVOX19TSElGVAkJCTAKKworI2RlZmluZSBHRU44X1NPX0RXM19CVUZGRVIxX1BJVENIX19NQVNLCQkJCTB4MGZmZjAwMDAKKyNkZWZpbmUgR0VOOF9TT19EVzNfQlVGRkVSMV9QSVRDSF9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU44X1NPX0RXM19CVUZGRVIwX1BJVENIX19NQVNLCQkJCTB4MDAwMDBmZmYKKyNkZWZpbmUgR0VOOF9TT19EVzNfQlVGRkVSMF9QSVRDSF9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VOOF9TT19EVzRfQlVGRkVSM19QSVRDSF9fTUFTSwkJCQkweDBmZmYwMDAwCisjZGVmaW5lIEdFTjhfU09fRFc0X0JVRkZFUjNfUElUQ0hfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VOOF9TT19EVzRfQlVGRkVSMl9QSVRDSF9fTUFTSwkJCQkweDAwMDAwZmZmCisjZGVmaW5lIEdFTjhfU09fRFc0X0JVRkZFUjJfUElUQ0hfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjdfM0RTVEFURV9TT19ERUNMX0xJU1RfX1NJWkUJCQkJMjU5CisKKworI2RlZmluZSBHRU43X1NPX0RFQ0xfRFcxX1NUUkVBTTNfQlVGRkVSX1NFTEVDVFNfX01BU0sJCTB4MDAwMGYwMDAKKyNkZWZpbmUgR0VON19TT19ERUNMX0RXMV9TVFJFQU0zX0JVRkZFUl9TRUxFQ1RTX19TSElGVAkJMTIKKyNkZWZpbmUgR0VON19TT19ERUNMX0RXMV9TVFJFQU0yX0JVRkZFUl9TRUxFQ1RTX19NQVNLCQkweDAwMDAwZjAwCisjZGVmaW5lIEdFTjdfU09fREVDTF9EVzFfU1RSRUFNMl9CVUZGRVJfU0VMRUNUU19fU0hJRlQJCTgKKyNkZWZpbmUgR0VON19TT19ERUNMX0RXMV9TVFJFQU0xX0JVRkZFUl9TRUxFQ1RTX19NQVNLCQkweDAwMDAwMGYwCisjZGVmaW5lIEdFTjdfU09fREVDTF9EVzFfU1RSRUFNMV9CVUZGRVJfU0VMRUNUU19fU0hJRlQJCTQKKyNkZWZpbmUgR0VON19TT19ERUNMX0RXMV9TVFJFQU0wX0JVRkZFUl9TRUxFQ1RTX19NQVNLCQkweDAwMDAwMDBmCisjZGVmaW5lIEdFTjdfU09fREVDTF9EVzFfU1RSRUFNMF9CVUZGRVJfU0VMRUNUU19fU0hJRlQJCTAKKworI2RlZmluZSBHRU43X1NPX0RFQ0xfRFcyX1NUUkVBTTNfRU5UUllfQ09VTlRfX01BU0sJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgR0VON19TT19ERUNMX0RXMl9TVFJFQU0zX0VOVFJZX0NPVU5UX19TSElGVAkJMjQKKyNkZWZpbmUgR0VON19TT19ERUNMX0RXMl9TVFJFQU0yX0VOVFJZX0NPVU5UX19NQVNLCQkweDAwZmYwMDAwCisjZGVmaW5lIEdFTjdfU09fREVDTF9EVzJfU1RSRUFNMl9FTlRSWV9DT1VOVF9fU0hJRlQJCTE2CisjZGVmaW5lIEdFTjdfU09fREVDTF9EVzJfU1RSRUFNMV9FTlRSWV9DT1VOVF9fTUFTSwkJMHgwMDAwZmYwMAorI2RlZmluZSBHRU43X1NPX0RFQ0xfRFcyX1NUUkVBTTFfRU5UUllfQ09VTlRfX1NISUZUCQk4CisjZGVmaW5lIEdFTjdfU09fREVDTF9EVzJfU1RSRUFNMF9FTlRSWV9DT1VOVF9fTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBHRU43X1NPX0RFQ0xfRFcyX1NUUkVBTTBfRU5UUllfQ09VTlRfX1NISUZUCQkwCisKKyNkZWZpbmUgR0VON19TT19ERUNMX0hJR0hfX01BU0sJCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VON19TT19ERUNMX0hJR0hfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjdfU09fREVDTF9PVVRQVVRfU0xPVF9fTUFTSwkJCQkweDAwMDAzMDAwCisjZGVmaW5lIEdFTjdfU09fREVDTF9PVVRQVVRfU0xPVF9fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VON19TT19ERUNMX0hPTEVfRkxBRwkJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgR0VON19TT19ERUNMX1JFR19JTkRFWF9fTUFTSwkJCQkweDAwMDAwM2YwCisjZGVmaW5lIEdFTjdfU09fREVDTF9SRUdfSU5ERVhfX1NISUZUCQkJCTQKKyNkZWZpbmUgR0VON19TT19ERUNMX0NPTVBPTkVOVF9NQVNLX19NQVNLCQkJMHgwMDAwMDAwZgorI2RlZmluZSBHRU43X1NPX0RFQ0xfQ09NUE9ORU5UX01BU0tfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjdfM0RTVEFURV9TT19CVUZGRVJfX1NJWkUJCQkJOAorCisKKyNkZWZpbmUgR0VOOF9TT19CVUZfRFcxX0VOQUJMRQkJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VON19TT19CVUZfRFcxX0lOREVYX19NQVNLCQkJCTB4NjAwMDAwMDAKKyNkZWZpbmUgR0VON19TT19CVUZfRFcxX0lOREVYX19TSElGVAkJCQkyOQorI2RlZmluZSBHRU43X1NPX0JVRl9EVzFfTU9DU19fTUFTSwkJCQkweDFlMDAwMDAwCisjZGVmaW5lIEdFTjdfU09fQlVGX0RXMV9NT0NTX19TSElGVAkJCQkyNQorI2RlZmluZSBHRU44X1NPX0JVRl9EVzFfTU9DU19fTUFTSwkJCQkweDFmYzAwMDAwCisjZGVmaW5lIEdFTjhfU09fQlVGX0RXMV9NT0NTX19TSElGVAkJCQkyMgorI2RlZmluZSBHRU44X1NPX0JVRl9EVzFfT0ZGU0VUX1dSSVRFX0VOQUJMRQkJCSgweDEgPDwgMjEpCisjZGVmaW5lIEdFTjhfU09fQlVGX0RXMV9PRkZTRVRfRU5BQkxFCQkJCSgweDEgPDwgMjApCisjZGVmaW5lIEdFTjdfU09fQlVGX0RXMV9QSVRDSF9fTUFTSwkJCQkweDAwMDAwZmZmCisjZGVmaW5lIEdFTjdfU09fQlVGX0RXMV9QSVRDSF9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjdfU09fQlVGX0RXMl9TVEFSVF9BRERSX19NQVNLCQkJMHhmZmZmZmZmYworI2RlZmluZSBHRU43X1NPX0JVRl9EVzJfU1RBUlRfQUREUl9fU0hJRlQJCQkyCisjZGVmaW5lIEdFTjdfU09fQlVGX0RXMl9TVEFSVF9BRERSX19TSFIJCQkJMgorCisjZGVmaW5lIEdFTjdfU09fQlVGX0RXM19FTkRfQUREUl9fTUFTSwkJCQkweGZmZmZmZmZjCisjZGVmaW5lIEdFTjdfU09fQlVGX0RXM19FTkRfQUREUl9fU0hJRlQJCQkJMgorI2RlZmluZSBHRU43X1NPX0JVRl9EVzNfRU5EX0FERFJfX1NIUgkJCQkyCisKKyNkZWZpbmUgR0VOOF9TT19CVUZfRFcyX0FERFJfX01BU0sJCQkJMHhmZmZmZmZmYworI2RlZmluZSBHRU44X1NPX0JVRl9EVzJfQUREUl9fU0hJRlQJCQkJMgorI2RlZmluZSBHRU44X1NPX0JVRl9EVzJfQUREUl9fU0hSCQkJCTIKKworCisKKyNkZWZpbmUgR0VOOF9TT19CVUZfRFc1X09GRlNFVF9BRERSX19NQVNLCQkJMHhmZmZmZmZmYworI2RlZmluZSBHRU44X1NPX0JVRl9EVzVfT0ZGU0VUX0FERFJfX1NISUZUCQkJMgorI2RlZmluZSBHRU44X1NPX0JVRl9EVzVfT0ZGU0VUX0FERFJfX1NIUgkJCTIKKworCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX0NMSVBfX1NJWkUJCQkJCTQKKworCisjZGVmaW5lIEdFTjdfQ0xJUF9EVzFfRlJPTlRXSU5ESU5HX19NQVNLCQkJMHgwMDEwMDAwMAorI2RlZmluZSBHRU43X0NMSVBfRFcxX0ZST05UV0lORElOR19fU0hJRlQJCQkyMAorI2RlZmluZSBHRU43X0NMSVBfRFcxX0ZST05UV0lORElOR19DVwkJCQkoMHgwIDw8IDIwKQorI2RlZmluZSBHRU43X0NMSVBfRFcxX0ZST05UV0lORElOR19DQ1cJCQkJKDB4MSA8PCAyMCkKKyNkZWZpbmUgR0VON19DTElQX0RXMV9TVUJQSVhFTF9fTUFTSwkJCQkweDAwMDgwMDAwCisjZGVmaW5lIEdFTjdfQ0xJUF9EVzFfU1VCUElYRUxfX1NISUZUCQkJCTE5CisjZGVmaW5lIEdFTjdfQ0xJUF9EVzFfU1VCUElYRUxfOEJJVFMJCQkJKDB4MCA8PCAxOSkKKyNkZWZpbmUgR0VON19DTElQX0RXMV9TVUJQSVhFTF80QklUUwkJCQkoMHgxIDw8IDE5KQorI2RlZmluZSBHRU43X0NMSVBfRFcxX0VBUkxZX0NVTExfRU5BQkxFCQkJCSgweDEgPDwgMTgpCisjZGVmaW5lIEdFTjdfQ0xJUF9EVzFfQ1VMTE1PREVfX01BU0sJCQkJMHgwMDAzMDAwMAorI2RlZmluZSBHRU43X0NMSVBfRFcxX0NVTExNT0RFX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU43X0NMSVBfRFcxX0NVTExNT0RFX0JPVEgJCQkJKDB4MCA8PCAxNikKKyNkZWZpbmUgR0VON19DTElQX0RXMV9DVUxMTU9ERV9OT05FCQkJCSgweDEgPDwgMTYpCisjZGVmaW5lIEdFTjdfQ0xJUF9EVzFfQ1VMTE1PREVfRlJPTlQJCQkJKDB4MiA8PCAxNikKKyNkZWZpbmUgR0VON19DTElQX0RXMV9DVUxMTU9ERV9CQUNLCQkJCSgweDMgPDwgMTYpCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzFfU1RBVElTVElDUwkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU42X0NMSVBfRFcxX1VDUF9DVUxMX0VOQUJMRVNfX01BU0sJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzFfVUNQX0NVTExfRU5BQkxFU19fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VONl9DTElQX0RXMl9DTElQX0VOQUJMRQkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU42X0NMSVBfRFcyX0FQSU1PREVfX01BU0sJCQkJMHg0MDAwMDAwMAorI2RlZmluZSBHRU42X0NMSVBfRFcyX0FQSU1PREVfX1NISUZUCQkJCTMwCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzJfQVBJTU9ERV9PR0wJCQkJKDB4MCA8PCAzMCkKKyNkZWZpbmUgR0VONl9DTElQX0RXMl9BUElNT0RFX0QzRAkJCQkoMHgxIDw8IDMwKQorI2RlZmluZSBHRU42X0NMSVBfRFcyX1hZX1RFU1RfRU5BQkxFCQkJCSgweDEgPDwgMjgpCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzJfWl9URVNUX0VOQUJMRQkJCQkoMHgxIDw8IDI3KQorI2RlZmluZSBHRU42X0NMSVBfRFcyX0dCX1RFU1RfRU5BQkxFCQkJCSgweDEgPDwgMjYpCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzJfVUNQX0NMSVBfRU5BQkxFU19fTUFTSwkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgR0VONl9DTElQX0RXMl9VQ1BfQ0xJUF9FTkFCTEVTX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjZfQ0xJUF9EVzJfQ0xJUE1PREVfX01BU0sJCQkJMHgwMDAwZTAwMAorI2RlZmluZSBHRU42X0NMSVBfRFcyX0NMSVBNT0RFX19TSElGVAkJCQkxMworI2RlZmluZSBHRU42X0NMSVBfRFcyX0NMSVBNT0RFX05PUk1BTAkJCQkoMHgwIDw8IDEzKQorI2RlZmluZSBHRU42X0NMSVBfRFcyX0NMSVBNT0RFX1JFSkVDVF9BTEwJCQkoMHgzIDw8IDEzKQorI2RlZmluZSBHRU42X0NMSVBfRFcyX0NMSVBNT0RFX0FDQ0VQVF9BTEwJCQkoMHg0IDw8IDEzKQorI2RlZmluZSBHRU42X0NMSVBfRFcyX1BFUlNQRUNUSVZFX0RJVklERV9ESVNBQkxFCQkoMHgxIDw8IDkpCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzJfTk9OUEVSU1BFQ1RJVkVfQkFSWUNFTlRSSUNfRU5BQkxFCQkoMHgxIDw8IDgpCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzJfVFJJX1BST1ZPS0VfX01BU0sJCQkJMHgwMDAwMDAzMAorI2RlZmluZSBHRU42X0NMSVBfRFcyX1RSSV9QUk9WT0tFX19TSElGVAkJCTQKKyNkZWZpbmUgR0VONl9DTElQX0RXMl9MSU5FX1BST1ZPS0VfX01BU0sJCQkweDAwMDAwMDBjCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzJfTElORV9QUk9WT0tFX19TSElGVAkJCTIKKyNkZWZpbmUgR0VONl9DTElQX0RXMl9UUklGQU5fUFJPVk9LRV9fTUFTSwkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR0VONl9DTElQX0RXMl9UUklGQU5fUFJPVk9LRV9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VONl9DTElQX0RXM19NSU5fUE9JTlRfV0lEVEhfX01BU0sJCQkweDBmZmUwMDAwCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzNfTUlOX1BPSU5UX1dJRFRIX19TSElGVAkJCTE3CisjZGVmaW5lIEdFTjZfQ0xJUF9EVzNfTUlOX1BPSU5UX1dJRFRIX19SQURJWAkJCTMKKyNkZWZpbmUgR0VONl9DTElQX0RXM19NQVhfUE9JTlRfV0lEVEhfX01BU0sJCQkweDAwMDFmZmMwCisjZGVmaW5lIEdFTjZfQ0xJUF9EVzNfTUFYX1BPSU5UX1dJRFRIX19TSElGVAkJCTYKKyNkZWZpbmUgR0VONl9DTElQX0RXM19NQVhfUE9JTlRfV0lEVEhfX1JBRElYCQkJMworI2RlZmluZSBHRU42X0NMSVBfRFczX1JUQUlOREVYX0ZPUkNFRF9aRVJPCQkJKDB4MSA8PCA1KQorI2RlZmluZSBHRU42X0NMSVBfRFczX01BWF9WUElOREVYX19NQVNLCQkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgR0VONl9DTElQX0RXM19NQVhfVlBJTkRFWF9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX1NGX0RXMV9EVzNfX1NJWkUJCQkJMworCisjZGVmaW5lIEdFTjdfU0ZfRFcxX0RFUFRIX0ZPUk1BVF9fTUFTSwkJCQkweDAwMDA3MDAwCisjZGVmaW5lIEdFTjdfU0ZfRFcxX0RFUFRIX0ZPUk1BVF9fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VOOV9TRl9EVzFfTElORV9XSURUSF9fTUFTSwkJCQkweDNmZmZmMDAwCisjZGVmaW5lIEdFTjlfU0ZfRFcxX0xJTkVfV0lEVEhfX1NISUZUCQkJCTEyCisjZGVmaW5lIEdFTjlfU0ZfRFcxX0xJTkVfV0lEVEhfX1JBRElYCQkJCTcKKyNkZWZpbmUgR0VON19TRl9EVzFfTEVHQUNZX0RFUFRIX09GRlNFVAkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBHRU43X1NGX0RXMV9TVEFUSVNUSUNTCQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU43X1NGX0RXMV9ERVBUSF9PRkZTRVRfU09MSUQJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBHRU43X1NGX0RXMV9ERVBUSF9PRkZTRVRfV0lSRUZSQU1FCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU43X1NGX0RXMV9ERVBUSF9PRkZTRVRfUE9JTlQJCQkJKDB4MSA8PCA3KQorI2RlZmluZSBHRU43X1NGX0RXMV9GUk9OVEZBQ0VfX01BU0sJCQkJMHgwMDAwMDA2MAorI2RlZmluZSBHRU43X1NGX0RXMV9GUk9OVEZBQ0VfX1NISUZUCQkJCTUKKyNkZWZpbmUgR0VON19TRl9EVzFfRlJPTlRGQUNFX1NPTElECQkJCSgweDAgPDwgNSkKKyNkZWZpbmUgR0VON19TRl9EVzFfRlJPTlRGQUNFX1dJUkVGUkFNRQkJCQkoMHgxIDw8IDUpCisjZGVmaW5lIEdFTjdfU0ZfRFcxX0ZST05URkFDRV9QT0lOVAkJCQkoMHgyIDw8IDUpCisjZGVmaW5lIEdFTjdfU0ZfRFcxX0JBQ0tGQUNFX19NQVNLCQkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgR0VON19TRl9EVzFfQkFDS0ZBQ0VfX1NISUZUCQkJCTMKKyNkZWZpbmUgR0VON19TRl9EVzFfQkFDS0ZBQ0VfU09MSUQJCQkJKDB4MCA8PCAzKQorI2RlZmluZSBHRU43X1NGX0RXMV9CQUNLRkFDRV9XSVJFRlJBTUUJCQkJKDB4MSA8PCAzKQorI2RlZmluZSBHRU43X1NGX0RXMV9CQUNLRkFDRV9QT0lOVAkJCQkoMHgyIDw8IDMpCisjZGVmaW5lIEdFTjdfU0ZfRFcxX1ZJRVdQT1JUX0VOQUJMRQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIEdFTjdfU0ZfRFcxX0ZST05UV0lORElOR19fTUFTSwkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdFTjdfU0ZfRFcxX0ZST05UV0lORElOR19fU0hJRlQJCQkJMAorI2RlZmluZSBHRU43X1NGX0RXMV9GUk9OVFdJTkRJTkdfQ1cJCQkJMHgwCisjZGVmaW5lIEdFTjdfU0ZfRFcxX0ZST05UV0lORElOR19DQ1cJCQkJMHgxCisKKyNkZWZpbmUgR0VON19TRl9EVzJfQUFfTElORV9FTkFCTEUJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VON19TRl9EVzJfQ1VMTE1PREVfX01BU0sJCQkJMHg2MDAwMDAwMAorI2RlZmluZSBHRU43X1NGX0RXMl9DVUxMTU9ERV9fU0hJRlQJCQkJMjkKKyNkZWZpbmUgR0VON19TRl9EVzJfQ1VMTE1PREVfQk9USAkJCQkoMHgwIDw8IDI5KQorI2RlZmluZSBHRU43X1NGX0RXMl9DVUxMTU9ERV9OT05FCQkJCSgweDEgPDwgMjkpCisjZGVmaW5lIEdFTjdfU0ZfRFcyX0NVTExNT0RFX0ZST05UCQkJCSgweDIgPDwgMjkpCisjZGVmaW5lIEdFTjdfU0ZfRFcyX0NVTExNT0RFX0JBQ0sJCQkJKDB4MyA8PCAyOSkKKyNkZWZpbmUgR0VON19TRl9EVzJfTElORV9XSURUSF9fTUFTSwkJCQkweDBmZmMwMDAwCisjZGVmaW5lIEdFTjdfU0ZfRFcyX0xJTkVfV0lEVEhfX1NISUZUCQkJCTE4CisjZGVmaW5lIEdFTjdfU0ZfRFcyX0xJTkVfV0lEVEhfX1JBRElYCQkJCTcKKyNkZWZpbmUgR0VON19TRl9EVzJfQUFfTElORV9DQVBfX01BU0sJCQkJMHgwMDAzMDAwMAorI2RlZmluZSBHRU43X1NGX0RXMl9BQV9MSU5FX0NBUF9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VON19TRl9EVzJfQUFfTElORV9DQVBfMF81CQkJCSgweDAgPDwgMTYpCisjZGVmaW5lIEdFTjdfU0ZfRFcyX0FBX0xJTkVfQ0FQXzFfMAkJCQkoMHgxIDw8IDE2KQorI2RlZmluZSBHRU43X1NGX0RXMl9BQV9MSU5FX0NBUF8yXzAJCQkJKDB4MiA8PCAxNikKKyNkZWZpbmUgR0VON19TRl9EVzJfQUFfTElORV9DQVBfNF8wCQkJCSgweDMgPDwgMTYpCisjZGVmaW5lIEdFTjc1X1NGX0RXMl9MSU5FX1NUSVBQTEVfRU5BQkxFCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgR0VON19TRl9EVzJfU0NJU1NPUl9FTkFCTEUJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgR0VON19TRl9EVzJfTVNSQVNUTU9ERV9fTUFTSwkJCQkweDAwMDAwMzAwCisjZGVmaW5lIEdFTjdfU0ZfRFcyX01TUkFTVE1PREVfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VON19TRl9EVzJfTVNSQVNUTU9ERV9PRkZfUElYRUwJCQkoMHgwIDw8IDgpCisjZGVmaW5lIEdFTjdfU0ZfRFcyX01TUkFTVE1PREVfT0ZGX1BBVFRFUk4JCQkoMHgxIDw8IDgpCisjZGVmaW5lIEdFTjdfU0ZfRFcyX01TUkFTVE1PREVfT05fUElYRUwJCQkJKDB4MiA8PCA4KQorI2RlZmluZSBHRU43X1NGX0RXMl9NU1JBU1RNT0RFX09OX1BBVFRFUk4JCQkoMHgzIDw8IDgpCisKKyNkZWZpbmUgR0VON19TRl9EVzNfTElORV9MQVNUX1BJWEVMX0VOQUJMRQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjdfU0ZfRFczX1RSSV9QUk9WT0tFX19NQVNLCQkJCTB4NjAwMDAwMDAKKyNkZWZpbmUgR0VON19TRl9EVzNfVFJJX1BST1ZPS0VfX1NISUZUCQkJCTI5CisjZGVmaW5lIEdFTjdfU0ZfRFczX0xJTkVfUFJPVk9LRV9fTUFTSwkJCQkweDE4MDAwMDAwCisjZGVmaW5lIEdFTjdfU0ZfRFczX0xJTkVfUFJPVk9LRV9fU0hJRlQJCQkJMjcKKyNkZWZpbmUgR0VON19TRl9EVzNfVFJJRkFOX1BST1ZPS0VfX01BU0sJCQkweDA2MDAwMDAwCisjZGVmaW5lIEdFTjdfU0ZfRFczX1RSSUZBTl9QUk9WT0tFX19TSElGVAkJCTI1CisjZGVmaW5lIEdFTjdfU0ZfRFczX1RSVUVfQUFfTElORV9ESVNUQU5DRQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIEdFTjdfU0ZfRFczX1NVQlBJWEVMX19NQVNLCQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgR0VON19TRl9EVzNfU1VCUElYRUxfX1NISUZUCQkJCTEyCisjZGVmaW5lIEdFTjdfU0ZfRFczX1NVQlBJWEVMXzhCSVRTCQkJCSgweDAgPDwgMTIpCisjZGVmaW5lIEdFTjdfU0ZfRFczX1NVQlBJWEVMXzRCSVRTCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIEdFTjdfU0ZfRFczX1VTRV9QT0lOVF9XSURUSAkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBHRU43X1NGX0RXM19QT0lOVF9XSURUSF9fTUFTSwkJCQkweDAwMDAwN2ZmCisjZGVmaW5lIEdFTjdfU0ZfRFczX1BPSU5UX1dJRFRIX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjdfU0ZfRFczX1BPSU5UX1dJRFRIX19SQURJWAkJCQkzCisKKyNkZWZpbmUgR0VON18zRFNUQVRFX1NCRV9EVzFfX1NJWkUJCQkJMTMKKworI2RlZmluZSBHRU44X1NCRV9EVzFfVVNFX1VSQl9SRUFEX0xFTgkJCQkoMHgxIDw8IDI5KQorI2RlZmluZSBHRU44X1NCRV9EVzFfVVNFX1VSQl9SRUFEX09GRlNFVAkJCSgweDEgPDwgMjgpCisjZGVmaW5lIEdFTjdfU0JFX0RXMV9BVFRSX1NXSVpaTEVfX01BU0sJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBHRU43X1NCRV9EVzFfQVRUUl9TV0laWkxFX19TSElGVAkJCTI4CisjZGVmaW5lIEdFTjdfU0JFX0RXMV9BVFRSX1NXSVpaTEVfMF8xNQkJCQkoMHgwIDw8IDI4KQorI2RlZmluZSBHRU43X1NCRV9EVzFfQVRUUl9TV0laWkxFXzE2XzMxCQkJCSgweDEgPDwgMjgpCisjZGVmaW5lIEdFTjdfU0JFX0RXMV9BVFRSX0NPVU5UX19NQVNLCQkJCTB4MGZjMDAwMDAKKyNkZWZpbmUgR0VON19TQkVfRFcxX0FUVFJfQ09VTlRfX1NISUZUCQkJCTIyCisjZGVmaW5lIEdFTjdfU0JFX0RXMV9BVFRSX1NXSVpaTEVfRU5BQkxFCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR0VON19TQkVfRFcxX1BPSU5UX1NQUklURV9URVhDT09SRF9fTUFTSwkJMHgwMDEwMDAwMAorI2RlZmluZSBHRU43X1NCRV9EVzFfUE9JTlRfU1BSSVRFX1RFWENPT1JEX19TSElGVAkJMjAKKyNkZWZpbmUgR0VON19TQkVfRFcxX1BPSU5UX1NQUklURV9URVhDT09SRF9VUFBFUkxFRlQJCSgweDAgPDwgMjApCisjZGVmaW5lIEdFTjdfU0JFX0RXMV9QT0lOVF9TUFJJVEVfVEVYQ09PUkRfTE9XRVJMRUZUCQkoMHgxIDw8IDIwKQorI2RlZmluZSBHRU43X1NCRV9EVzFfVVJCX1JFQURfTEVOX19NQVNLCQkJCTB4MDAwMGY4MDAKKyNkZWZpbmUgR0VON19TQkVfRFcxX1VSQl9SRUFEX0xFTl9fU0hJRlQJCQkxMQorI2RlZmluZSBHRU43X1NCRV9EVzFfVVJCX1JFQURfT0ZGU0VUX19NQVNLCQkJMHgwMDAwMDNmMAorI2RlZmluZSBHRU43X1NCRV9EVzFfVVJCX1JFQURfT0ZGU0VUX19TSElGVAkJCTQKKyNkZWZpbmUgR0VOOF9TQkVfRFcxX1VSQl9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAwMDA3ZTAKKyNkZWZpbmUgR0VOOF9TQkVfRFcxX1VSQl9SRUFEX09GRlNFVF9fU0hJRlQJCQk1CisKKyNkZWZpbmUgR0VOOF8zRFNUQVRFX1NCRV9TV0laX0RXMV9EVzhfX1NJWkUJCQk4CisKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9ISUdIX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9ISUdIX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU44X1NCRV9TV0laX09WRVJSSURFX1cJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9PVkVSUklERV9aCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIEdFTjhfU0JFX1NXSVpfT1ZFUlJJREVfWQkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBHRU44X1NCRV9TV0laX09WRVJSSURFX1gJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9DT05TVF9fTUFTSwkJCQkweDAwMDAwNjAwCisjZGVmaW5lIEdFTjhfU0JFX1NXSVpfQ09OU1RfX1NISUZUCQkJCTkKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9DT05TVF8wMDAwCQkJCSgweDAgPDwgOSkKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9DT05TVF8wMDAxX0ZMT0FUCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9DT05TVF8xMTExX0ZMT0FUCQkJCSgweDIgPDwgOSkKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9DT05TVF9QUklNX0lECQkJCSgweDMgPDwgOSkKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9JTlBVVEFUVFJfX01BU0sJCQkJMHgwMDAwMDBjMAorI2RlZmluZSBHRU44X1NCRV9TV0laX0lOUFVUQVRUUl9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU44X1NCRV9TV0laX0lOUFVUQVRUUl9OT1JNQUwJCQkJKDB4MCA8PCA2KQorI2RlZmluZSBHRU44X1NCRV9TV0laX0lOUFVUQVRUUl9GQUNJTkcJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBHRU44X1NCRV9TV0laX0lOUFVUQVRUUl9XCQkJCSgweDIgPDwgNikKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9JTlBVVEFUVFJfRkFDSU5HX1cJCQkoMHgzIDw8IDYpCisjZGVmaW5lIEdFTjhfU0JFX1NXSVpfVVJCX0VOVFJZX09GRlNFVF9fTUFTSwkJCTB4MDAwMDAwMWYKKyNkZWZpbmUgR0VOOF9TQkVfU1dJWl9VUkJfRU5UUllfT0ZGU0VUX19TSElGVAkJCTAKKworI2RlZmluZSBHRU42XzNEU1RBVEVfU0ZfX1NJWkUJCQkJCTIwCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworI2RlZmluZSBHRU43XzNEU1RBVEVfU0JFX19TSVpFCQkJCQkxNAorCisKKworCisKKworCisKKworCisKKworI2RlZmluZSBHRU45X1NCRV9EV19BQ1RJVkVfQ09NUE9ORU5UX19NQVNLCQkJMHgwMDAwMDAwMworI2RlZmluZSBHRU45X1NCRV9EV19BQ1RJVkVfQ09NUE9ORU5UX19TSElGVAkJCTAKKyNkZWZpbmUgR0VOOV9TQkVfRFdfQUNUSVZFX0NPTVBPTkVOVF9OT05FCQkJMHgwCisjZGVmaW5lIEdFTjlfU0JFX0RXX0FDVElWRV9DT01QT05FTlRfWFkJCQkJMHgxCisjZGVmaW5lIEdFTjlfU0JFX0RXX0FDVElWRV9DT01QT05FTlRfWFlaCQkJMHgyCisjZGVmaW5lIEdFTjlfU0JFX0RXX0FDVElWRV9DT01QT05FTlRfWFlaVwkJCTB4MworCisjZGVmaW5lIEdFTjhfM0RTVEFURV9TQkVfU1dJWl9fU0laRQkJCQkxMQorCisKKworCisjZGVmaW5lIEdFTjhfM0RTVEFURV9SQVNURVJfX1NJWkUJCQkJNQorCisKKyNkZWZpbmUgR0VOOV9SQVNURVJfRFcxX1pfVEVTVF9GQVJfRU5BQkxFCQkJKDB4MSA8PCAyNikKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX0ZST05UV0lORElOR19fTUFTSwkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX0ZST05UV0lORElOR19fU0hJRlQJCQkyMQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfRlJPTlRXSU5ESU5HX0NXCQkJCSgweDAgPDwgMjEpCisjZGVmaW5lIEdFTjhfUkFTVEVSX0RXMV9GUk9OVFdJTkRJTkdfQ0NXCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX0NVTExNT0RFX19NQVNLCQkJCTB4MDAwMzAwMDAKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX0NVTExNT0RFX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQ1VMTE1PREVfQk9USAkJCQkoMHgwIDw8IDE2KQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQ1VMTE1PREVfTk9ORQkJCQkoMHgxIDw8IDE2KQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQ1VMTE1PREVfRlJPTlQJCQkJKDB4MiA8PCAxNikKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX0NVTExNT0RFX0JBQ0sJCQkJKDB4MyA8PCAxNikKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX1NNT09USF9QT0lOVF9FTkFCTEUJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQVBJX01VTFRJU0FNUExFX0VOQUJMRQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIEdFTjhfUkFTVEVSX0RXMV9ERVBUSF9PRkZTRVRfU09MSUQJCQkoMHgxIDw8IDkpCisjZGVmaW5lIEdFTjhfUkFTVEVSX0RXMV9ERVBUSF9PRkZTRVRfV0lSRUZSQU1FCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfREVQVEhfT0ZGU0VUX1BPSU5UCQkJKDB4MSA8PCA3KQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfRlJPTlRGQUNFX19NQVNLCQkJCTB4MDAwMDAwNjAKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX0ZST05URkFDRV9fU0hJRlQJCQk1CisjZGVmaW5lIEdFTjhfUkFTVEVSX0RXMV9GUk9OVEZBQ0VfU09MSUQJCQkJKDB4MCA8PCA1KQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfRlJPTlRGQUNFX1dJUkVGUkFNRQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgR0VOOF9SQVNURVJfRFcxX0ZST05URkFDRV9QT0lOVAkJCQkoMHgyIDw8IDUpCisjZGVmaW5lIEdFTjhfUkFTVEVSX0RXMV9CQUNLRkFDRV9fTUFTSwkJCQkweDAwMDAwMDE4CisjZGVmaW5lIEdFTjhfUkFTVEVSX0RXMV9CQUNLRkFDRV9fU0hJRlQJCQkJMworI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQkFDS0ZBQ0VfU09MSUQJCQkJKDB4MCA8PCAzKQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQkFDS0ZBQ0VfV0lSRUZSQU1FCQkJKDB4MSA8PCAzKQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQkFDS0ZBQ0VfUE9JTlQJCQkJKDB4MiA8PCAzKQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfQUFfTElORV9FTkFCTEUJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfU0NJU1NPUl9FTkFCTEUJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU44X1JBU1RFUl9EVzFfWl9URVNUX0VOQUJMRQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIEdFTjlfUkFTVEVSX0RXMV9aX1RFU1RfTkVBUl9FTkFCTEUJCQkoMHgxIDw8IDApCisKKworCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX1dNX19TSVpFCQkJCQk5CisKKworI2RlZmluZSBHRU42X1dNX0RXMV9LRVJORUwwX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU42X1dNX0RXMV9LRVJORUwwX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VONl9XTV9EVzFfS0VSTkVMMF9BRERSX19TSFIJCQkJNgorCisKKworI2RlZmluZSBHRU42X1dNX0RXNF9TVEFUSVNUSUNTCQkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU42X1dNX0RXNF9ERVBUSF9DTEVBUgkJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VONl9XTV9EVzRfREVQVEhfUkVTT0xWRQkJCQkoMHgxIDw8IDI4KQorI2RlZmluZSBHRU42X1dNX0RXNF9ISVpfUkVTT0xWRQkJCQkJKDB4MSA8PCAyNykKKyNkZWZpbmUgR0VONl9XTV9EVzRfVVJCX0dSRl9TVEFSVDBfX01BU0sJCQkweDAwN2YwMDAwCisjZGVmaW5lIEdFTjZfV01fRFc0X1VSQl9HUkZfU1RBUlQwX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjZfV01fRFc0X1VSQl9HUkZfU1RBUlQxX19NQVNLCQkJMHgwMDAwN2YwMAorI2RlZmluZSBHRU42X1dNX0RXNF9VUkJfR1JGX1NUQVJUMV9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjZfV01fRFc0X1VSQl9HUkZfU1RBUlQyX19NQVNLCQkJMHgwMDAwMDA3ZgorI2RlZmluZSBHRU42X1dNX0RXNF9VUkJfR1JGX1NUQVJUMl9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VONl9XTV9EVzVfTUFYX1RIUkVBRFNfX01BU0sJCQkJMHhmZTAwMDAwMAorI2RlZmluZSBHRU42X1dNX0RXNV9NQVhfVEhSRUFEU19fU0hJRlQJCQkJMjUKKyNkZWZpbmUgR0VONl9XTV9EVzVfTEVHQUNZX0xJTkVfUkFTVAkJCQkoMHgxIDw8IDIzKQorI2RlZmluZSBHRU42X1dNX0RXNV9QU19LSUxMX1BJWEVMCQkJCSgweDEgPDwgMjIpCisjZGVmaW5lIEdFTjZfV01fRFc1X1BTX0NPTVBVVEVfREVQVEgJCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR0VONl9XTV9EVzVfUFNfVVNFX0RFUFRICQkJCSgweDEgPDwgMjApCisjZGVmaW5lIEdFTjZfV01fRFc1X1BTX0RJU1BBVENIX0VOQUJMRQkJCQkoMHgxIDw8IDE5KQorI2RlZmluZSBHRU42X1dNX0RXNV9BQV9MSU5FX0NBUF9fTUFTSwkJCQkweDAwMDMwMDAwCisjZGVmaW5lIEdFTjZfV01fRFc1X0FBX0xJTkVfQ0FQX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X1dNX0RXNV9BQV9MSU5FX0NBUF8wXzUJCQkJKDB4MCA8PCAxNikKKyNkZWZpbmUgR0VONl9XTV9EVzVfQUFfTElORV9DQVBfMV8wCQkJCSgweDEgPDwgMTYpCisjZGVmaW5lIEdFTjZfV01fRFc1X0FBX0xJTkVfQ0FQXzJfMAkJCQkoMHgyIDw8IDE2KQorI2RlZmluZSBHRU42X1dNX0RXNV9BQV9MSU5FX0NBUF80XzAJCQkJKDB4MyA8PCAxNikKKyNkZWZpbmUgR0VONl9XTV9EVzVfQUFfTElORV9XSURUSF9fTUFTSwkJCQkweDAwMDBjMDAwCisjZGVmaW5lIEdFTjZfV01fRFc1X0FBX0xJTkVfV0lEVEhfX1NISUZUCQkJMTQKKyNkZWZpbmUgR0VONl9XTV9EVzVfQUFfTElORV9XSURUSF8wXzUJCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgR0VONl9XTV9EVzVfQUFfTElORV9XSURUSF8xXzAJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgR0VONl9XTV9EVzVfQUFfTElORV9XSURUSF8yXzAJCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgR0VONl9XTV9EVzVfQUFfTElORV9XSURUSF80XzAJCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgR0VONl9XTV9EVzVfUE9MWV9TVElQUExFX0VOQUJMRQkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBHRU42X1dNX0RXNV9MSU5FX1NUSVBQTEVfRU5BQkxFCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjZfV01fRFc1X1BTX0NPTVBVVEVfT01BU0sJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBHRU42X1dNX0RXNV9QU19VU0VfVwkJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU42X1dNX0RXNV9QU19EVUFMX1NPVVJDRV9CTEVORAkJCSgweDEgPDwgNykKKyNkZWZpbmUgR0VONl9XTV9EVzVfUFNfRElTUEFUQ0hfTU9ERV9fTUFTSwkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgR0VONl9XTV9EVzVfUFNfRElTUEFUQ0hfTU9ERV9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VONl9XTV9EVzZfU0ZfQVRUUl9DT1VOVF9fTUFTSwkJCQkweDAzZjAwMDAwCisjZGVmaW5lIEdFTjZfV01fRFc2X1NGX0FUVFJfQ09VTlRfX1NISUZUCQkJMjAKKyNkZWZpbmUgR0VONl9XTV9EVzZfUFNfUE9TT0ZGU0VUX19NQVNLCQkJCTB4MDAwYzAwMDAKKyNkZWZpbmUgR0VONl9XTV9EVzZfUFNfUE9TT0ZGU0VUX19TSElGVAkJCQkxOAorI2RlZmluZSBHRU42X1dNX0RXNl9QU19QT1NPRkZTRVRfTk9ORQkJCQkoMHgwIDw8IDE4KQorI2RlZmluZSBHRU42X1dNX0RXNl9QU19QT1NPRkZTRVRfQ0VOVFJPSUQJCQkoMHgyIDw8IDE4KQorI2RlZmluZSBHRU42X1dNX0RXNl9QU19QT1NPRkZTRVRfU0FNUExFCQkJCSgweDMgPDwgMTgpCisjZGVmaW5lIEdFTjZfV01fRFc2X1pXX0lOVEVSUF9fTUFTSwkJCQkweDAwMDMwMDAwCisjZGVmaW5lIEdFTjZfV01fRFc2X1pXX0lOVEVSUF9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9XTV9EVzZfWldfSU5URVJQX1BJWEVMCQkJCSgweDAgPDwgMTYpCisjZGVmaW5lIEdFTjZfV01fRFc2X1pXX0lOVEVSUF9DRU5UUk9JRAkJCQkoMHgyIDw8IDE2KQorI2RlZmluZSBHRU42X1dNX0RXNl9aV19JTlRFUlBfU0FNUExFCQkJCSgweDMgPDwgMTYpCisjZGVmaW5lIEdFTjZfV01fRFc2X0JBUllDRU5UUklDX0lOVEVSUF9fTUFTSwkJCTB4MDAwMGZjMDAKKyNkZWZpbmUgR0VONl9XTV9EVzZfQkFSWUNFTlRSSUNfSU5URVJQX19TSElGVAkJCTEwCisjZGVmaW5lIEdFTjZfV01fRFc2X1BPSU5UX1JBU1RSVUxFX19NQVNLCQkJMHgwMDAwMDIwMAorI2RlZmluZSBHRU42X1dNX0RXNl9QT0lOVF9SQVNUUlVMRV9fU0hJRlQJCQk5CisjZGVmaW5lIEdFTjZfV01fRFc2X1BPSU5UX1JBU1RSVUxFX1VQUEVSX0xFRlQJCQkoMHgwIDw8IDkpCisjZGVmaW5lIEdFTjZfV01fRFc2X1BPSU5UX1JBU1RSVUxFX1VQUEVSX1JJR0hUCQkJKDB4MSA8PCA5KQorI2RlZmluZSBHRU42X1dNX0RXNl9NU1JBU1RNT0RFX19NQVNLCQkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgR0VONl9XTV9EVzZfTVNSQVNUTU9ERV9fU0hJRlQJCQkJMQorI2RlZmluZSBHRU42X1dNX0RXNl9NU1JBU1RNT0RFX09GRl9QSVhFTAkJCSgweDAgPDwgMSkKKyNkZWZpbmUgR0VONl9XTV9EVzZfTVNSQVNUTU9ERV9PRkZfUEFUVEVSTgkJCSgweDEgPDwgMSkKKyNkZWZpbmUgR0VONl9XTV9EVzZfTVNSQVNUTU9ERV9PTl9QSVhFTAkJCQkoMHgyIDw8IDEpCisjZGVmaW5lIEdFTjZfV01fRFc2X01TUkFTVE1PREVfT05fUEFUVEVSTgkJCSgweDMgPDwgMSkKKyNkZWZpbmUgR0VONl9XTV9EVzZfTVNESVNQTU9ERV9fTUFTSwkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdFTjZfV01fRFc2X01TRElTUE1PREVfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9XTV9EVzZfTVNESVNQTU9ERV9QRVJTQU1QTEUJCQkweDAKKyNkZWZpbmUgR0VONl9XTV9EVzZfTVNESVNQTU9ERV9QRVJQSVhFTAkJCQkweDEKKworI2RlZmluZSBHRU42X1dNX0RXN19LRVJORUwxX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU42X1dNX0RXN19LRVJORUwxX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VONl9XTV9EVzdfS0VSTkVMMV9BRERSX19TSFIJCQkJNgorCisjZGVmaW5lIEdFTjZfV01fRFc4X0tFUk5FTDJfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjZfV01fRFc4X0tFUk5FTDJfQUREUl9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU42X1dNX0RXOF9LRVJORUwyX0FERFJfX1NIUgkJCQk2CisKKworI2RlZmluZSBHRU43X1dNX0RXMV9TVEFUSVNUSUNTCQkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU43X1dNX0RXMV9ERVBUSF9DTEVBUgkJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VON19XTV9EVzFfUFNfRElTUEFUQ0hfRU5BQkxFCQkJCSgweDEgPDwgMjkpCisjZGVmaW5lIEdFTjdfV01fRFcxX0RFUFRIX1JFU09MVkUJCQkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR0VON19XTV9EVzFfSElaX1JFU09MVkUJCQkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjdfV01fRFcxX0xFR0FDWV9MSU5FX1JBU1QJCQkJKDB4MSA8PCAyNikKKyNkZWZpbmUgR0VON19XTV9EVzFfUFNfS0lMTF9QSVhFTAkJCQkoMHgxIDw8IDI1KQorI2RlZmluZSBHRU43X1dNX0RXMV9QU0NERVBUSF9fTUFTSwkJCQkweDAxODAwMDAwCisjZGVmaW5lIEdFTjdfV01fRFcxX1BTQ0RFUFRIX19TSElGVAkJCQkyMworI2RlZmluZSBHRU43X1dNX0RXMV9QU0NERVBUSF9PRkYJCQkJKDB4MCA8PCAyMykKKyNkZWZpbmUgR0VON19XTV9EVzFfUFNDREVQVEhfT04JCQkJCSgweDEgPDwgMjMpCisjZGVmaW5lIEdFTjdfV01fRFcxX1BTQ0RFUFRIX09OX0dFCQkJCSgweDIgPDwgMjMpCisjZGVmaW5lIEdFTjdfV01fRFcxX1BTQ0RFUFRIX09OX0xFCQkJCSgweDMgPDwgMjMpCisjZGVmaW5lIEdFTjdfV01fRFcxX0VEU0NfX01BU0sJCQkJCTB4MDA2MDAwMDAKKyNkZWZpbmUgR0VON19XTV9EVzFfRURTQ19fU0hJRlQJCQkJCTIxCisjZGVmaW5lIEdFTjdfV01fRFcxX0VEU0NfTk9STUFMCQkJCQkoMHgwIDw8IDIxKQorI2RlZmluZSBHRU43X1dNX0RXMV9FRFNDX1BTRVhFQwkJCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR0VON19XTV9EVzFfRURTQ19QUkVQUwkJCQkJKDB4MiA8PCAyMSkKKyNkZWZpbmUgR0VON19XTV9EVzFfUFNfVVNFX0RFUFRICQkJCSgweDEgPDwgMjApCisjZGVmaW5lIEdFTjdfV01fRFcxX1BTX1VTRV9XCQkJCQkoMHgxIDw8IDE5KQorI2RlZmluZSBHRU43X1dNX0RXMV9aV19JTlRFUlBfX01BU0sJCQkJMHgwMDA2MDAwMAorI2RlZmluZSBHRU43X1dNX0RXMV9aV19JTlRFUlBfX1NISUZUCQkJCTE3CisjZGVmaW5lIEdFTjdfV01fRFcxX1pXX0lOVEVSUF9QSVhFTAkJCQkoMHgwIDw8IDE3KQorI2RlZmluZSBHRU43X1dNX0RXMV9aV19JTlRFUlBfQ0VOVFJPSUQJCQkJKDB4MiA8PCAxNykKKyNkZWZpbmUgR0VON19XTV9EVzFfWldfSU5URVJQX1NBTVBMRQkJCQkoMHgzIDw8IDE3KQorI2RlZmluZSBHRU43X1dNX0RXMV9CQVJZQ0VOVFJJQ19JTlRFUlBfX01BU0sJCQkweDAwMDFmODAwCisjZGVmaW5lIEdFTjdfV01fRFcxX0JBUllDRU5UUklDX0lOVEVSUF9fU0hJRlQJCQkxMQorI2RlZmluZSBHRU43X1dNX0RXMV9QU19VU0VfQ09WRVJBR0VfTUFTSwkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjdfV01fRFcxX0FBX0xJTkVfQ0FQX19NQVNLCQkJCTB4MDAwMDAzMDAKKyNkZWZpbmUgR0VON19XTV9EVzFfQUFfTElORV9DQVBfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VON19XTV9EVzFfQUFfTElORV9DQVBfMF81CQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgR0VON19XTV9EVzFfQUFfTElORV9DQVBfMV8wCQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VON19XTV9EVzFfQUFfTElORV9DQVBfMl8wCQkJCSgweDIgPDwgOCkKKyNkZWZpbmUgR0VON19XTV9EVzFfQUFfTElORV9DQVBfNF8wCQkJCSgweDMgPDwgOCkKKyNkZWZpbmUgR0VON19XTV9EVzFfQUFfTElORV9XSURUSF9fTUFTSwkJCQkweDAwMDAwMGMwCisjZGVmaW5lIEdFTjdfV01fRFcxX0FBX0xJTkVfV0lEVEhfX1NISUZUCQkJNgorI2RlZmluZSBHRU43X1dNX0RXMV9BQV9MSU5FX1dJRFRIXzBfNQkJCQkoMHgwIDw8IDYpCisjZGVmaW5lIEdFTjdfV01fRFcxX0FBX0xJTkVfV0lEVEhfMV8wCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgR0VON19XTV9EVzFfQUFfTElORV9XSURUSF8yXzAJCQkJKDB4MiA8PCA2KQorI2RlZmluZSBHRU43X1dNX0RXMV9BQV9MSU5FX1dJRFRIXzRfMAkJCQkoMHgzIDw8IDYpCisjZGVmaW5lIEdFTjc1X1dNX0RXMV9SVF9JTkRFUEVOREVOVF9SQVNUCQkJKDB4MSA8PCA1KQorI2RlZmluZSBHRU43X1dNX0RXMV9QT0xZX1NUSVBQTEVfRU5BQkxFCQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgR0VON19XTV9EVzFfTElORV9TVElQUExFX0VOQUJMRQkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIEdFTjdfV01fRFcxX1BPSU5UX1JBU1RSVUxFX19NQVNLCQkJMHgwMDAwMDAwNAorI2RlZmluZSBHRU43X1dNX0RXMV9QT0lOVF9SQVNUUlVMRV9fU0hJRlQJCQkyCisjZGVmaW5lIEdFTjdfV01fRFcxX1BPSU5UX1JBU1RSVUxFX1VQUEVSX0xFRlQJCQkoMHgwIDw8IDIpCisjZGVmaW5lIEdFTjdfV01fRFcxX1BPSU5UX1JBU1RSVUxFX1VQUEVSX1JJR0hUCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU43X1dNX0RXMV9NU1JBU1RNT0RFX19NQVNLCQkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR0VON19XTV9EVzFfTVNSQVNUTU9ERV9fU0hJRlQJCQkJMAorI2RlZmluZSBHRU43X1dNX0RXMV9NU1JBU1RNT0RFX09GRl9QSVhFTAkJCTB4MAorI2RlZmluZSBHRU43X1dNX0RXMV9NU1JBU1RNT0RFX09GRl9QQVRURVJOCQkJMHgxCisjZGVmaW5lIEdFTjdfV01fRFcxX01TUkFTVE1PREVfT05fUElYRUwJCQkJMHgyCisjZGVmaW5lIEdFTjdfV01fRFcxX01TUkFTVE1PREVfT05fUEFUVEVSTgkJCTB4MworCisjZGVmaW5lIEdFTjdfV01fRFcyX01TRElTUE1PREVfX01BU0sJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBHRU43X1dNX0RXMl9NU0RJU1BNT0RFX19TSElGVAkJCQkzMQorI2RlZmluZSBHRU43X1dNX0RXMl9NU0RJU1BNT0RFX1BFUlNBTVBMRQkJCSgweDAgPDwgMzEpCisjZGVmaW5lIEdFTjdfV01fRFcyX01TRElTUE1PREVfUEVSUElYRUwJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VONzVfV01fRFcyX1BTX1VBVl9PTkxZCQkJCSgweDEgPDwgMzApCisKKyNkZWZpbmUgR0VOOF8zRFNUQVRFX1dNX0NIUk9NQUtFWV9fU0laRQkJCQkyCisKKworCisjZGVmaW5lIEdFTjhfM0RTVEFURV9XTV9ERVBUSF9TVEVOQ0lMX19TSVpFCQkJNAorCisKKyNkZWZpbmUgR0VOOF9aU19EVzFfU1RFTkNJTDBfRkFJTF9PUF9fTUFTSwkJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgR0VOOF9aU19EVzFfU1RFTkNJTDBfRkFJTF9PUF9fU0hJRlQJCQkyOQorI2RlZmluZSBHRU44X1pTX0RXMV9TVEVOQ0lMMF9aRkFJTF9PUF9fTUFTSwkJCTB4MWMwMDAwMDAKKyNkZWZpbmUgR0VOOF9aU19EVzFfU1RFTkNJTDBfWkZBSUxfT1BfX1NISUZUCQkJMjYKKyNkZWZpbmUgR0VOOF9aU19EVzFfU1RFTkNJTDBfWlBBU1NfT1BfX01BU0sJCQkweDAzODAwMDAwCisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUwwX1pQQVNTX09QX19TSElGVAkJCTIzCisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUwxX0ZVTkNfX01BU0sJCQkJMHgwMDcwMDAwMAorI2RlZmluZSBHRU44X1pTX0RXMV9TVEVOQ0lMMV9GVU5DX19TSElGVAkJCTIwCisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUwxX0ZBSUxfT1BfX01BU0sJCQkweDAwMGUwMDAwCisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUwxX0ZBSUxfT1BfX1NISUZUCQkJMTcKKyNkZWZpbmUgR0VOOF9aU19EVzFfU1RFTkNJTDFfWkZBSUxfT1BfX01BU0sJCQkweDAwMDFjMDAwCisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUwxX1pGQUlMX09QX19TSElGVAkJCTE0CisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUwxX1pQQVNTX09QX19NQVNLCQkJMHgwMDAwMzgwMAorI2RlZmluZSBHRU44X1pTX0RXMV9TVEVOQ0lMMV9aUEFTU19PUF9fU0hJRlQJCQkxMQorI2RlZmluZSBHRU44X1pTX0RXMV9TVEVOQ0lMMF9GVU5DX19NQVNLCQkJCTB4MDAwMDA3MDAKKyNkZWZpbmUgR0VOOF9aU19EVzFfU1RFTkNJTDBfRlVOQ19fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjhfWlNfRFcxX0RFUFRIX0ZVTkNfX01BU0sJCQkJMHgwMDAwMDBlMAorI2RlZmluZSBHRU44X1pTX0RXMV9ERVBUSF9GVU5DX19TSElGVAkJCQk1CisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUwxX0VOQUJMRQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIEdFTjhfWlNfRFcxX1NURU5DSUxfVEVTVF9FTkFCTEUJCQkJKDB4MSA8PCAzKQorI2RlZmluZSBHRU44X1pTX0RXMV9TVEVOQ0lMX1dSSVRFX0VOQUJMRQkJCSgweDEgPDwgMikKKyNkZWZpbmUgR0VOOF9aU19EVzFfREVQVEhfVEVTVF9FTkFCTEUJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU44X1pTX0RXMV9ERVBUSF9XUklURV9FTkFCTEUJCQkJKDB4MSA8PCAwKQorCisjZGVmaW5lIEdFTjhfWlNfRFcyX1NURU5DSUwwX1ZBTFVFTUFTS19fTUFTSwkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgR0VOOF9aU19EVzJfU1RFTkNJTDBfVkFMVUVNQVNLX19TSElGVAkJCTI0CisjZGVmaW5lIEdFTjhfWlNfRFcyX1NURU5DSUwwX1dSSVRFTUFTS19fTUFTSwkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgR0VOOF9aU19EVzJfU1RFTkNJTDBfV1JJVEVNQVNLX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjhfWlNfRFcyX1NURU5DSUwxX1ZBTFVFTUFTS19fTUFTSwkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgR0VOOF9aU19EVzJfU1RFTkNJTDFfVkFMVUVNQVNLX19TSElGVAkJCTgKKyNkZWZpbmUgR0VOOF9aU19EVzJfU1RFTkNJTDFfV1JJVEVNQVNLX19NQVNLCQkJMHgwMDAwMDBmZgorI2RlZmluZSBHRU44X1pTX0RXMl9TVEVOQ0lMMV9XUklURU1BU0tfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjlfWlNfRFczX1NURU5DSUwwX1JFRl9fTUFTSwkJCQkweDAwMDBmZjAwCisjZGVmaW5lIEdFTjlfWlNfRFczX1NURU5DSUwwX1JFRl9fU0hJRlQJCQkJOAorI2RlZmluZSBHRU45X1pTX0RXM19TVEVOQ0lMMV9SRUZfX01BU0sJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBHRU45X1pTX0RXM19TVEVOQ0lMMV9SRUZfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU44XzNEU1RBVEVfV01fSFpfT1BfX1NJWkUJCQkJNQorCisKKyNkZWZpbmUgR0VOOF9XTV9IWl9EVzFfU1RFTkNJTF9DTEVBUgkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU44X1dNX0haX0RXMV9ERVBUSF9DTEVBUgkJCQkoMHgxIDw8IDMwKQorI2RlZmluZSBHRU44X1dNX0haX0RXMV9ERVBUSF9SRVNPTFZFCQkJCSgweDEgPDwgMjgpCisjZGVmaW5lIEdFTjhfV01fSFpfRFcxX0hJWl9SRVNPTFZFCQkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjhfV01fSFpfRFcxX1BJWEVMX09GRlNFVF9FTkFCTEUJCQkoMHgxIDw8IDI2KQorI2RlZmluZSBHRU44X1dNX0haX0RXMV9GVUxMX1NVUkZBQ0VfREVQVEhfQ0xFQVIJCQkoMHgxIDw8IDI1KQorI2RlZmluZSBHRU44X1dNX0haX0RXMV9TVEVOQ0lMX0NMRUFSX1ZBTFVFX19NQVNLCQkweDAwZmYwMDAwCisjZGVmaW5lIEdFTjhfV01fSFpfRFcxX1NURU5DSUxfQ0xFQVJfVkFMVUVfX1NISUZUCQkxNgorI2RlZmluZSBHRU44X1dNX0haX0RXMV9OVU1TQU1QTEVTX19NQVNLCQkJCTB4MDAwMGUwMDAKKyNkZWZpbmUgR0VOOF9XTV9IWl9EVzFfTlVNU0FNUExFU19fU0hJRlQJCQkxMworI2RlZmluZSBHRU44X1dNX0haX0RXMV9OVU1TQU1QTEVTXzEJCQkJKDB4MCA8PCAxMykKKyNkZWZpbmUgR0VOOF9XTV9IWl9EVzFfTlVNU0FNUExFU18yCQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIEdFTjhfV01fSFpfRFcxX05VTVNBTVBMRVNfNAkJCQkoMHgyIDw8IDEzKQorI2RlZmluZSBHRU44X1dNX0haX0RXMV9OVU1TQU1QTEVTXzgJCQkJKDB4MyA8PCAxMykKKyNkZWZpbmUgR0VOOF9XTV9IWl9EVzFfTlVNU0FNUExFU18xNgkJCQkoMHg0IDw8IDEzKQorCisjZGVmaW5lIEdFTjhfV01fSFpfRFcyX1JFQ1RfTUlOX1lfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU44X1dNX0haX0RXMl9SRUNUX01JTl9ZX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjhfV01fSFpfRFcyX1JFQ1RfTUlOX1hfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU44X1dNX0haX0RXMl9SRUNUX01JTl9YX19TSElGVAkJCTAKKworI2RlZmluZSBHRU44X1dNX0haX0RXM19SRUNUX01BWF9ZX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VOOF9XTV9IWl9EVzNfUkVDVF9NQVhfWV9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU44X1dNX0haX0RXM19SRUNUX01BWF9YX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VOOF9XTV9IWl9EVzNfUkVDVF9NQVhfWF9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VOOF9XTV9IWl9EVzRfU0FNUExFX01BU0tfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjhfV01fSFpfRFc0X1NBTVBMRV9NQVNLX19TSElGVAkJCTAKKworI2RlZmluZSBHRU43XzNEU1RBVEVfUFNfX1NJWkUJCQkJCTEyCisKKworI2RlZmluZSBHRU43X1BTX0RXMV9LRVJORUwwX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU43X1BTX0RXMV9LRVJORUwwX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VON19QU19EVzFfS0VSTkVMMF9BRERSX19TSFIJCQkJNgorCisKKworI2RlZmluZSBHRU43X1BTX0RXNF9NQVhfVEhSRUFEU19fTUFTSwkJCQkweGZmMDAwMDAwCisjZGVmaW5lIEdFTjdfUFNfRFc0X01BWF9USFJFQURTX19TSElGVAkJCQkyNAorI2RlZmluZSBHRU43NV9QU19EVzRfTUFYX1RIUkVBRFNfX01BU0sJCQkJMHhmZjgwMDAwMAorI2RlZmluZSBHRU43NV9QU19EVzRfTUFYX1RIUkVBRFNfX1NISUZUCQkJCTIzCisjZGVmaW5lIEdFTjc1X1BTX0RXNF9TQU1QTEVfTUFTS19fTUFTSwkJCQkweDAwMGZmMDAwCisjZGVmaW5lIEdFTjc1X1BTX0RXNF9TQU1QTEVfTUFTS19fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VON19QU19EVzRfUFVTSF9DT05TVEFOVF9FTkFCTEUJCQkoMHgxIDw8IDExKQorI2RlZmluZSBHRU43X1BTX0RXNF9BVFRSX0VOQUJMRQkJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgR0VON19QU19EVzRfQ09NUFVURV9PTUFTSwkJCQkoMHgxIDw8IDkpCisjZGVmaW5lIEdFTjdfUFNfRFc0X1JUX0ZBU1RfQ0xFQVIJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU43X1BTX0RXNF9EVUFMX1NPVVJDRV9CTEVORAkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIEdFTjdfUFNfRFc0X1JUX1JFU09MVkUJCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgR0VONzVfUFNfRFc0X0FDQ0VTU19VQVYJCQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgR0VON19QU19EVzRfUE9TT0ZGU0VUX19NQVNLCQkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgR0VON19QU19EVzRfUE9TT0ZGU0VUX19TSElGVAkJCQkzCisjZGVmaW5lIEdFTjdfUFNfRFc0X1BPU09GRlNFVF9OT05FCQkJCSgweDAgPDwgMykKKyNkZWZpbmUgR0VON19QU19EVzRfUE9TT0ZGU0VUX0NFTlRST0lECQkJCSgweDIgPDwgMykKKyNkZWZpbmUgR0VON19QU19EVzRfUE9TT0ZGU0VUX1NBTVBMRQkJCQkoMHgzIDw8IDMpCisjZGVmaW5lIEdFTjdfUFNfRFc0X0RJU1BBVENIX01PREVfX01BU0sJCQkJMHgwMDAwMDAwNworI2RlZmluZSBHRU43X1BTX0RXNF9ESVNQQVRDSF9NT0RFX19TSElGVAkJCTAKKworI2RlZmluZSBHRU43X1BTX0RXNV9VUkJfR1JGX1NUQVJUMF9fTUFTSwkJCTB4MDA3ZjAwMDAKKyNkZWZpbmUgR0VON19QU19EVzVfVVJCX0dSRl9TVEFSVDBfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VON19QU19EVzVfVVJCX0dSRl9TVEFSVDFfX01BU0sJCQkweDAwMDA3ZjAwCisjZGVmaW5lIEdFTjdfUFNfRFc1X1VSQl9HUkZfU1RBUlQxX19TSElGVAkJCTgKKyNkZWZpbmUgR0VON19QU19EVzVfVVJCX0dSRl9TVEFSVDJfX01BU0sJCQkweDAwMDAwMDdmCisjZGVmaW5lIEdFTjdfUFNfRFc1X1VSQl9HUkZfU1RBUlQyX19TSElGVAkJCTAKKworI2RlZmluZSBHRU43X1BTX0RXNl9LRVJORUwxX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU43X1BTX0RXNl9LRVJORUwxX0FERFJfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VON19QU19EVzZfS0VSTkVMMV9BRERSX19TSFIJCQkJNgorCisjZGVmaW5lIEdFTjdfUFNfRFc3X0tFUk5FTDJfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjdfUFNfRFc3X0tFUk5FTDJfQUREUl9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU43X1BTX0RXN19LRVJORUwyX0FERFJfX1NIUgkJCQk2CisKKworCisjZGVmaW5lIEdFTjhfUFNfRFcxX0tFUk5FTDBfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjhfUFNfRFcxX0tFUk5FTDBfQUREUl9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU44X1BTX0RXMV9LRVJORUwwX0FERFJfX1NIUgkJCQk2CisKKworCisKKworI2RlZmluZSBHRU44X1BTX0RXNl9NQVhfVEhSRUFEU19fTUFTSwkJCQkweGZmODAwMDAwCisjZGVmaW5lIEdFTjhfUFNfRFc2X01BWF9USFJFQURTX19TSElGVAkJCQkyMworI2RlZmluZSBHRU44X1BTX0RXNl9QVVNIX0NPTlNUQU5UX0VOQUJMRQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjhfUFNfRFc2X1JUX0ZBU1RfQ0xFQVIJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU44X1BTX0RXNl9SVF9SRVNPTFZFCQkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIEdFTjhfUFNfRFc2X1BPU09GRlNFVF9fTUFTSwkJCQkweDAwMDAwMDE4CisjZGVmaW5lIEdFTjhfUFNfRFc2X1BPU09GRlNFVF9fU0hJRlQJCQkJMworI2RlZmluZSBHRU44X1BTX0RXNl9QT1NPRkZTRVRfTk9ORQkJCQkoMHgwIDw8IDMpCisjZGVmaW5lIEdFTjhfUFNfRFc2X1BPU09GRlNFVF9DRU5UUk9JRAkJCQkoMHgyIDw8IDMpCisjZGVmaW5lIEdFTjhfUFNfRFc2X1BPU09GRlNFVF9TQU1QTEUJCQkJKDB4MyA8PCAzKQorI2RlZmluZSBHRU44X1BTX0RXNl9ESVNQQVRDSF9NT0RFX19NQVNLCQkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgR0VOOF9QU19EVzZfRElTUEFUQ0hfTU9ERV9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VOOF9QU19EVzdfVVJCX0dSRl9TVEFSVDBfX01BU0sJCQkweDAwN2YwMDAwCisjZGVmaW5lIEdFTjhfUFNfRFc3X1VSQl9HUkZfU1RBUlQwX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjhfUFNfRFc3X1VSQl9HUkZfU1RBUlQxX19NQVNLCQkJMHgwMDAwN2YwMAorI2RlZmluZSBHRU44X1BTX0RXN19VUkJfR1JGX1NUQVJUMV9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjhfUFNfRFc3X1VSQl9HUkZfU1RBUlQyX19NQVNLCQkJMHgwMDAwMDA3ZgorI2RlZmluZSBHRU44X1BTX0RXN19VUkJfR1JGX1NUQVJUMl9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VOOF9QU19EVzhfS0VSTkVMMV9BRERSX19NQVNLCQkJCTB4ZmZmZmZmYzAKKyNkZWZpbmUgR0VOOF9QU19EVzhfS0VSTkVMMV9BRERSX19TSElGVAkJCQk2CisjZGVmaW5lIEdFTjhfUFNfRFc4X0tFUk5FTDFfQUREUl9fU0hSCQkJCTYKKworCisjZGVmaW5lIEdFTjhfUFNfRFcxMF9LRVJORUwyX0FERFJfX01BU0sJCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU44X1BTX0RXMTBfS0VSTkVMMl9BRERSX19TSElGVAkJCTYKKyNkZWZpbmUgR0VOOF9QU19EVzEwX0tFUk5FTDJfQUREUl9fU0hSCQkJCTYKKworCisjZGVmaW5lIEdFTjhfM0RTVEFURV9QU19FWFRSQV9fU0laRQkJCQkyCisKKworI2RlZmluZSBHRU44X1BTWF9EVzFfRElTUEFUQ0hfRU5BQkxFCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9VQVZfT05MWQkJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VOOF9QU1hfRFcxX0NPTVBVVEVfT01BU0sJCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VOOF9QU1hfRFcxX0tJTExfUElYRUwJCQkJCSgweDEgPDwgMjgpCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9QU0NERVBUSF9fTUFTSwkJCQkweDBjMDAwMDAwCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9QU0NERVBUSF9fU0hJRlQJCQkJMjYKKyNkZWZpbmUgR0VOOF9QU1hfRFcxX1BTQ0RFUFRIX09GRgkJCQkoMHgwIDw8IDI2KQorI2RlZmluZSBHRU44X1BTWF9EVzFfUFNDREVQVEhfT04JCQkJKDB4MSA8PCAyNikKKyNkZWZpbmUgR0VOOF9QU1hfRFcxX1BTQ0RFUFRIX09OX0dFCQkJCSgweDIgPDwgMjYpCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9QU0NERVBUSF9PTl9MRQkJCQkoMHgzIDw8IDI2KQorI2RlZmluZSBHRU44X1BTWF9EVzFfRk9SQ0VfQ09NUFVURV9ERVBUSAkJCSgweDEgPDwgMjUpCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9VU0VfREVQVEgJCQkJCSgweDEgPDwgMjQpCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9VU0VfVwkJCQkJKDB4MSA8PCAyMykKKyNkZWZpbmUgR0VOOF9QU1hfRFcxX0FUVFJfRU5BQkxFCQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VOOF9QU1hfRFcxX0RJU0FCTEVfQUxQSEFfVE9fQ09WRVJBR0UJCQkoMHgxIDw8IDcpCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9QRVJfU0FNUExFCQkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIEdFTjhfUFNYX0RXMV9DT01QVVRFX1NURU5DSUwJCQkJKDB4MSA8PCA1KQorI2RlZmluZSBHRU44X1BTWF9EVzFfQUNDRVNTX1VBVgkJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU44X1BTWF9EVzFfVVNFX0NPVkVSQUdFX01BU0sJCQkJKDB4MSA8PCAxKQorCisjZGVmaW5lIEdFTjhfM0RTVEFURV9QU19CTEVORF9fU0laRQkJCQkyCisKKworI2RlZmluZSBHRU44X1BTX0JMRU5EX0RXMV9BTFBIQV9UT19DT1ZFUkFHRQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFcxX1dSSVRBQkxFX1JUCQkJCSgweDEgPDwgMzApCisjZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFcxX0JMRU5EX0VOQUJMRQkJCQkoMHgxIDw8IDI5KQorI2RlZmluZSBHRU44X1BTX0JMRU5EX0RXMV9TUkNfQUxQSEFfRkFDVE9SX19NQVNLCQkweDFmMDAwMDAwCisjZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFcxX1NSQ19BTFBIQV9GQUNUT1JfX1NISUZUCQkyNAorI2RlZmluZSBHRU44X1BTX0JMRU5EX0RXMV9EU1RfQUxQSEFfRkFDVE9SX19NQVNLCQkweDAwZjgwMDAwCisjZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFcxX0RTVF9BTFBIQV9GQUNUT1JfX1NISUZUCQkxOQorI2RlZmluZSBHRU44X1BTX0JMRU5EX0RXMV9TUkNfQ09MT1JfRkFDVE9SX19NQVNLCQkweDAwMDdjMDAwCisjZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFcxX1NSQ19DT0xPUl9GQUNUT1JfX1NISUZUCQkxNAorI2RlZmluZSBHRU44X1BTX0JMRU5EX0RXMV9EU1RfQ09MT1JfRkFDVE9SX19NQVNLCQkweDAwMDAzZTAwCisjZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFcxX0RTVF9DT0xPUl9GQUNUT1JfX1NISUZUCQk5CisjZGVmaW5lIEdFTjhfUFNfQkxFTkRfRFcxX0FMUEhBX1RFU1RfRU5BQkxFCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU44X1BTX0JMRU5EX0RXMV9JTkRFUEVOREVOVF9BTFBIQV9FTkFCTEUJCSgweDEgPDwgNykKKworI2RlZmluZSBHRU42XzNEU1RBVEVfQ09OU1RBTlRfQU5ZX19TSVpFCQkJCTExCisKKyNkZWZpbmUgR0VONl9DT05TVEFOVF9EVzBfQlVGRkVSX0VOQUJMRVNfX01BU0sJCQkweDAwMDBmMDAwCisjZGVmaW5lIEdFTjZfQ09OU1RBTlRfRFcwX0JVRkZFUl9FTkFCTEVTX19TSElGVAkJCTEyCisjZGVmaW5lIEdFTjZfQ09OU1RBTlRfRFcwX01PQ1NfX01BU0sJCQkJMHgwMDAwMGYwMAorI2RlZmluZSBHRU42X0NPTlNUQU5UX0RXMF9NT0NTX19TSElGVAkJCQk4CisKKyNkZWZpbmUgR0VONl9DT05TVEFOVF9EV19BRERSX1JFQURfTEVOX19NQVNLCQkJMHgwMDAwMDAxZgorI2RlZmluZSBHRU42X0NPTlNUQU5UX0RXX0FERFJfUkVBRF9MRU5fX1NISUZUCQkJMAorI2RlZmluZSBHRU42X0NPTlNUQU5UX0RXX0FERFJfQUREUl9fTUFTSwkJCTB4ZmZmZmZmZTAKKyNkZWZpbmUgR0VONl9DT05TVEFOVF9EV19BRERSX0FERFJfX1NISUZUCQkJNQorI2RlZmluZSBHRU42X0NPTlNUQU5UX0RXX0FERFJfQUREUl9fU0hSCQkJCTUKKworCisKKyNkZWZpbmUgR0VON19DT05TVEFOVF9EVzFfQlVGRkVSMV9SRUFEX0xFTl9fTUFTSwkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU43X0NPTlNUQU5UX0RXMV9CVUZGRVIxX1JFQURfTEVOX19TSElGVAkJMTYKKyNkZWZpbmUgR0VON19DT05TVEFOVF9EVzFfQlVGRkVSMF9SRUFEX0xFTl9fTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU43X0NPTlNUQU5UX0RXMV9CVUZGRVIwX1JFQURfTEVOX19TSElGVAkJMAorCisjZGVmaW5lIEdFTjdfQ09OU1RBTlRfRFcyX0JVRkZFUjNfUkVBRF9MRU5fX01BU0sJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VON19DT05TVEFOVF9EVzJfQlVGRkVSM19SRUFEX0xFTl9fU0hJRlQJCTE2CisjZGVmaW5lIEdFTjdfQ09OU1RBTlRfRFcyX0JVRkZFUjJfUkVBRF9MRU5fX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VON19DT05TVEFOVF9EVzJfQlVGRkVSMl9SRUFEX0xFTl9fU0hJRlQJCTAKKworI2RlZmluZSBHRU43X0NPTlNUQU5UX0RXX0FERFJfTU9DU19fTUFTSwkJCTB4MDAwMDAwMWYKKyNkZWZpbmUgR0VON19DT05TVEFOVF9EV19BRERSX01PQ1NfX1NISUZUCQkJMAorI2RlZmluZSBHRU43X0NPTlNUQU5UX0RXX0FERFJfQUREUl9fTUFTSwkJCTB4ZmZmZmZmZTAKKyNkZWZpbmUgR0VON19DT05TVEFOVF9EV19BRERSX0FERFJfX1NISUZUCQkJNQorI2RlZmluZSBHRU43X0NPTlNUQU5UX0RXX0FERFJfQUREUl9fU0hSCQkJCTUKKworI2RlZmluZSBHRU44X0NPTlNUQU5UX0RXX0FERFJfQUREUl9fTUFTSwkJCTB4ZmZmZmZmZTAKKyNkZWZpbmUgR0VOOF9DT05TVEFOVF9EV19BRERSX0FERFJfX1NISUZUCQkJNQorI2RlZmluZSBHRU44X0NPTlNUQU5UX0RXX0FERFJfQUREUl9fU0hSCQkJCTUKKworI2RlZmluZSBHRU42XzNEU1RBVEVfU0FNUExFX01BU0tfX1NJWkUJCQkJMgorCisKKyNkZWZpbmUgR0VONl9TQU1QTEVfTUFTS19EVzFfVkFMX19NQVNLCQkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgR0VONl9TQU1QTEVfTUFTS19EVzFfVkFMX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjdfU0FNUExFX01BU0tfRFcxX1ZBTF9fTUFTSwkJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjdfU0FNUExFX01BU0tfRFcxX1ZBTF9fU0hJRlQJCQkJMAorI2RlZmluZSBHRU44X1NBTVBMRV9NQVNLX0RXMV9WQUxfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU44X1NBTVBMRV9NQVNLX0RXMV9WQUxfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU42XzNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEVfX1NJWkUJCQk0CisKKworI2RlZmluZSBHRU42X0RSQVdJTkdfUkVDVEFOR0xFX0RXMV9NSU5fWV9fTUFTSwkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9EUkFXSU5HX1JFQ1RBTkdMRV9EVzFfTUlOX1lfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VONl9EUkFXSU5HX1JFQ1RBTkdMRV9EVzFfTUlOX1hfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfRFJBV0lOR19SRUNUQU5HTEVfRFcxX01JTl9YX19TSElGVAkJCTAKKworI2RlZmluZSBHRU42X0RSQVdJTkdfUkVDVEFOR0xFX0RXMl9NQVhfWV9fTUFTSwkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9EUkFXSU5HX1JFQ1RBTkdMRV9EVzJfTUFYX1lfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VONl9EUkFXSU5HX1JFQ1RBTkdMRV9EVzJfTUFYX1hfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfRFJBV0lOR19SRUNUQU5HTEVfRFcyX01BWF9YX19TSElGVAkJCTAKKworI2RlZmluZSBHRU42X0RSQVdJTkdfUkVDVEFOR0xFX0RXM19PUklHSU5fWV9fTUFTSwkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU42X0RSQVdJTkdfUkVDVEFOR0xFX0RXM19PUklHSU5fWV9fU0hJRlQJCTE2CisjZGVmaW5lIEdFTjZfRFJBV0lOR19SRUNUQU5HTEVfRFczX09SSUdJTl9YX19NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfRFJBV0lOR19SRUNUQU5HTEVfRFczX09SSUdJTl9YX19TSElGVAkJMAorCisjZGVmaW5lIEdFTjZfM0RTVEFURV9ERVBUSF9CVUZGRVJfX1NJWkUJCQkJOAorCisKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzFfVFlQRV9fTUFTSwkJCQkweGUwMDAwMDAwCisjZGVmaW5lIEdFTjZfREVQVEhfRFcxX1RZUEVfX1NISUZUCQkJCTI5CisjZGVmaW5lIEdFTjZfREVQVEhfRFcxX1RJTElOR19fTUFTSwkJCQkweDBjMDAwMDAwCisjZGVmaW5lIEdFTjZfREVQVEhfRFcxX1RJTElOR19fU0hJRlQJCQkJMjYKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzFfU1RSX01PREVfX01BU0sJCQkJMHgwMTgwMDAwMAorI2RlZmluZSBHRU42X0RFUFRIX0RXMV9TVFJfTU9ERV9fU0hJRlQJCQkJMjMKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzFfSElaX0VOQUJMRQkJCQkoMHgxIDw8IDIyKQorI2RlZmluZSBHRU42X0RFUFRIX0RXMV9TRVBBUkFURV9TVEVOQ0lMCQkJCSgweDEgPDwgMjEpCisjZGVmaW5lIEdFTjZfREVQVEhfRFcxX0ZPUk1BVF9fTUFTSwkJCQkweDAwMWMwMDAwCisjZGVmaW5lIEdFTjZfREVQVEhfRFcxX0ZPUk1BVF9fU0hJRlQJCQkJMTgKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzFfUElUQ0hfX01BU0sJCQkJMHgwMDAxZmZmZgorI2RlZmluZSBHRU42X0RFUFRIX0RXMV9QSVRDSF9fU0hJRlQJCQkJMAorCisKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzNfSEVJR0hUX19NQVNLCQkJCTB4ZmZmODAwMDAKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzNfSEVJR0hUX19TSElGVAkJCQkxOQorI2RlZmluZSBHRU42X0RFUFRIX0RXM19XSURUSF9fTUFTSwkJCQkweDAwMDdmZmMwCisjZGVmaW5lIEdFTjZfREVQVEhfRFczX1dJRFRIX19TSElGVAkJCQk2CisjZGVmaW5lIEdFTjZfREVQVEhfRFczX0xPRF9fTUFTSwkJCQkweDAwMDAwMDNjCisjZGVmaW5lIEdFTjZfREVQVEhfRFczX0xPRF9fU0hJRlQJCQkJMgorI2RlZmluZSBHRU42X0RFUFRIX0RXM19NSVBMQVlPVVRfX01BU0sJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBHRU42X0RFUFRIX0RXM19NSVBMQVlPVVRfX1NISUZUCQkJCTEKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzNfTUlQTEFZT1VUX0JFTE9XCQkJCSgweDAgPDwgMSkKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzNfTUlQTEFZT1VUX1JJR0hUCQkJCSgweDEgPDwgMSkKKworI2RlZmluZSBHRU42X0RFUFRIX0RXNF9ERVBUSF9fTUFTSwkJCQkweGZmZTAwMDAwCisjZGVmaW5lIEdFTjZfREVQVEhfRFc0X0RFUFRIX19TSElGVAkJCQkyMQorI2RlZmluZSBHRU42X0RFUFRIX0RXNF9NSU5fQVJSQVlfRUxFTUVOVF9fTUFTSwkJCTB4MDAxZmZjMDAKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzRfTUlOX0FSUkFZX0VMRU1FTlRfX1NISUZUCQkJMTAKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzRfUlRfVklFV19FWFRFTlRfX01BU0sJCQkweDAwMDAwM2ZlCisjZGVmaW5lIEdFTjZfREVQVEhfRFc0X1JUX1ZJRVdfRVhURU5UX19TSElGVAkJCTEKKworI2RlZmluZSBHRU42X0RFUFRIX0RXNV9PRkZTRVRfWV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIEdFTjZfREVQVEhfRFc1X09GRlNFVF9ZX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0RFUFRIX0RXNV9PRkZTRVRfWF9fTUFTSwkJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfREVQVEhfRFc1X09GRlNFVF9YX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9ERVBUSF9EVzZfTU9DU19fTUFTSwkJCQkweGY4MDAwMDAwCisjZGVmaW5lIEdFTjZfREVQVEhfRFc2X01PQ1NfX1NISUZUCQkJCTI3CisKKworCisjZGVmaW5lIEdFTjdfREVQVEhfRFcxX1RZUEVfX01BU0sJCQkJMHhlMDAwMDAwMAorI2RlZmluZSBHRU43X0RFUFRIX0RXMV9UWVBFX19TSElGVAkJCQkyOQorI2RlZmluZSBHRU43X0RFUFRIX0RXMV9ERVBUSF9XUklURV9FTkFCTEUJCQkoMHgxIDw8IDI4KQorI2RlZmluZSBHRU43X0RFUFRIX0RXMV9TVEVOQ0lMX1dSSVRFX0VOQUJMRQkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjdfREVQVEhfRFcxX0hJWl9FTkFCTEUJCQkJKDB4MSA8PCAyMikKKyNkZWZpbmUgR0VON19ERVBUSF9EVzFfRk9STUFUX19NQVNLCQkJCTB4MDAxYzAwMDAKKyNkZWZpbmUgR0VON19ERVBUSF9EVzFfRk9STUFUX19TSElGVAkJCQkxOAorI2RlZmluZSBHRU43X0RFUFRIX0RXMV9QSVRDSF9fTUFTSwkJCQkweDAwMDNmZmZmCisjZGVmaW5lIEdFTjdfREVQVEhfRFcxX1BJVENIX19TSElGVAkJCQkwCisKKworI2RlZmluZSBHRU43X0RFUFRIX0RXM19IRUlHSFRfX01BU0sJCQkJMHhmZmZjMDAwMAorI2RlZmluZSBHRU43X0RFUFRIX0RXM19IRUlHSFRfX1NISUZUCQkJCTE4CisjZGVmaW5lIEdFTjdfREVQVEhfRFczX1dJRFRIX19NQVNLCQkJCTB4MDAwM2ZmZjAKKyNkZWZpbmUgR0VON19ERVBUSF9EVzNfV0lEVEhfX1NISUZUCQkJCTQKKyNkZWZpbmUgR0VON19ERVBUSF9EVzNfTE9EX19NQVNLCQkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgR0VON19ERVBUSF9EVzNfTE9EX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VON19ERVBUSF9EVzRfREVQVEhfX01BU0sJCQkJMHhmZmUwMDAwMAorI2RlZmluZSBHRU43X0RFUFRIX0RXNF9ERVBUSF9fU0hJRlQJCQkJMjEKKyNkZWZpbmUgR0VON19ERVBUSF9EVzRfTUlOX0FSUkFZX0VMRU1FTlRfX01BU0sJCQkweDAwMWZmYzAwCisjZGVmaW5lIEdFTjdfREVQVEhfRFc0X01JTl9BUlJBWV9FTEVNRU5UX19TSElGVAkJCTEwCisjZGVmaW5lIEdFTjdfREVQVEhfRFc0X01PQ1NfX01BU0sJCQkJMHgwMDAwMDAwZgorI2RlZmluZSBHRU43X0RFUFRIX0RXNF9NT0NTX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VON19ERVBUSF9EVzVfT0ZGU0VUX1lfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU43X0RFUFRIX0RXNV9PRkZTRVRfWV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VON19ERVBUSF9EVzVfT0ZGU0VUX1hfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU43X0RFUFRIX0RXNV9PRkZTRVRfWF9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjdfREVQVEhfRFc2X1JUX1ZJRVdfRVhURU5UX19NQVNLCQkJMHhmZmUwMDAwMAorI2RlZmluZSBHRU43X0RFUFRIX0RXNl9SVF9WSUVXX0VYVEVOVF9fU0hJRlQJCQkyMQorCisKKworI2RlZmluZSBHRU44X0RFUFRIX0RXMV9UWVBFX19NQVNLCQkJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzFfVFlQRV9fU0hJRlQJCQkJMjkKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzFfREVQVEhfV1JJVEVfRU5BQkxFCQkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzFfU1RFTkNJTF9XUklURV9FTkFCTEUJCQkoMHgxIDw8IDI3KQorI2RlZmluZSBHRU44X0RFUFRIX0RXMV9ISVpfRU5BQkxFCQkJCSgweDEgPDwgMjIpCisjZGVmaW5lIEdFTjhfREVQVEhfRFcxX0ZPUk1BVF9fTUFTSwkJCQkweDAwMWMwMDAwCisjZGVmaW5lIEdFTjhfREVQVEhfRFcxX0ZPUk1BVF9fU0hJRlQJCQkJMTgKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzFfUElUQ0hfX01BU0sJCQkJMHgwMDAzZmZmZgorI2RlZmluZSBHRU44X0RFUFRIX0RXMV9QSVRDSF9fU0hJRlQJCQkJMAorCisKKworI2RlZmluZSBHRU44X0RFUFRIX0RXNF9IRUlHSFRfX01BU0sJCQkJMHhmZmZjMDAwMAorI2RlZmluZSBHRU44X0RFUFRIX0RXNF9IRUlHSFRfX1NISUZUCQkJCTE4CisjZGVmaW5lIEdFTjhfREVQVEhfRFc0X1dJRFRIX19NQVNLCQkJCTB4MDAwM2ZmZjAKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzRfV0lEVEhfX1NISUZUCQkJCTQKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzRfTE9EX19NQVNLCQkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzRfTE9EX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzVfREVQVEhfX01BU0sJCQkJMHhmZmUwMDAwMAorI2RlZmluZSBHRU44X0RFUFRIX0RXNV9ERVBUSF9fU0hJRlQJCQkJMjEKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzVfTUlOX0FSUkFZX0VMRU1FTlRfX01BU0sJCQkweDAwMWZmYzAwCisjZGVmaW5lIEdFTjhfREVQVEhfRFc1X01JTl9BUlJBWV9FTEVNRU5UX19TSElGVAkJCTEwCisjZGVmaW5lIEdFTjhfREVQVEhfRFc1X01PQ1NfX01BU0sJCQkJMHgwMDAwMDA3ZgorI2RlZmluZSBHRU44X0RFUFRIX0RXNV9NT0NTX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzZfT0ZGU0VUX1lfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU44X0RFUFRIX0RXNl9PRkZTRVRfWV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VOOF9ERVBUSF9EVzZfT0ZGU0VUX1hfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU44X0RFUFRIX0RXNl9PRkZTRVRfWF9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjhfREVQVEhfRFc3X1JUX1ZJRVdfRVhURU5UX19NQVNLCQkJMHhmZmUwMDAwMAorI2RlZmluZSBHRU44X0RFUFRIX0RXN19SVF9WSUVXX0VYVEVOVF9fU0hJRlQJCQkyMQorI2RlZmluZSBHRU44X0RFUFRIX0RXN19RUElUQ0hfX01BU0sJCQkJMHgwMDAwN2ZmZgorI2RlZmluZSBHRU44X0RFUFRIX0RXN19RUElUQ0hfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU42XzNEU1RBVEVfUE9MWV9TVElQUExFX09GRlNFVF9fU0laRQkJCTIKKworCisjZGVmaW5lIEdFTjZfUE9MWV9TVElQUExFX09GRlNFVF9EVzFfWF9fTUFTSwkJCTB4MDAwMDFmMDAKKyNkZWZpbmUgR0VONl9QT0xZX1NUSVBQTEVfT0ZGU0VUX0RXMV9YX19TSElGVAkJCTgKKyNkZWZpbmUgR0VONl9QT0xZX1NUSVBQTEVfT0ZGU0VUX0RXMV9ZX19NQVNLCQkJMHgwMDAwMDAxZgorI2RlZmluZSBHRU42X1BPTFlfU1RJUFBMRV9PRkZTRVRfRFcxX1lfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjZfM0RTVEFURV9QT0xZX1NUSVBQTEVfUEFUVEVSTl9fU0laRQkJCTMzCisKKworCisjZGVmaW5lIEdFTjZfM0RTVEFURV9MSU5FX1NUSVBQTEVfX1NJWkUJCQkJMworCisKKyNkZWZpbmUgR0VONl9MSU5FX1NUSVBQTEVfRFcxX1BBVFRFUk5fX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfTElORV9TVElQUExFX0RXMV9QQVRURVJOX19TSElGVAkJCTAKKworI2RlZmluZSBHRU42X0xJTkVfU1RJUFBMRV9EVzJfSU5WRVJTRV9SRVBFQVRfQ09VTlRfX01BU0sJMHhmZmZmMDAwMAorI2RlZmluZSBHRU42X0xJTkVfU1RJUFBMRV9EVzJfSU5WRVJTRV9SRVBFQVRfQ09VTlRfX1NISUZUCTE2CisjZGVmaW5lIEdFTjZfTElORV9TVElQUExFX0RXMl9JTlZFUlNFX1JFUEVBVF9DT1VOVF9fUkFESVgJMTMKKyNkZWZpbmUgR0VON19MSU5FX1NUSVBQTEVfRFcyX0lOVkVSU0VfUkVQRUFUX0NPVU5UX19NQVNLCTB4ZmZmZjgwMDAKKyNkZWZpbmUgR0VON19MSU5FX1NUSVBQTEVfRFcyX0lOVkVSU0VfUkVQRUFUX0NPVU5UX19TSElGVAkxNQorI2RlZmluZSBHRU43X0xJTkVfU1RJUFBMRV9EVzJfSU5WRVJTRV9SRVBFQVRfQ09VTlRfX1JBRElYCTE2CisjZGVmaW5lIEdFTjZfTElORV9TVElQUExFX0RXMl9SRVBFQVRfQ09VTlRfX01BU0sJCTB4MDAwMDAxZmYKKyNkZWZpbmUgR0VONl9MSU5FX1NUSVBQTEVfRFcyX1JFUEVBVF9DT1VOVF9fU0hJRlQJCTAKKworI2RlZmluZSBHRU42XzNEU1RBVEVfQUFfTElORV9QQVJBTUVURVJTX19TSVpFCQkJMworCisKKyNkZWZpbmUgR0VONl9BQV9MSU5FX0RXMV9CSUFTX19NQVNLCQkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgR0VONl9BQV9MSU5FX0RXMV9CSUFTX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0FBX0xJTkVfRFcxX0JJQVNfX1JBRElYCQkJCTgKKyNkZWZpbmUgR0VONl9BQV9MSU5FX0RXMV9TTE9QRV9fTUFTSwkJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjZfQUFfTElORV9EVzFfU0xPUEVfX1NISUZUCQkJCTAKKyNkZWZpbmUgR0VONl9BQV9MSU5FX0RXMV9TTE9QRV9fUkFESVgJCQkJOAorCisjZGVmaW5lIEdFTjZfQUFfTElORV9EVzJfQ0FQX0JJQVNfX01BU0sJCQkJMHgwMGZmMDAwMAorI2RlZmluZSBHRU42X0FBX0xJTkVfRFcyX0NBUF9CSUFTX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjZfQUFfTElORV9EVzJfQ0FQX0JJQVNfX1JBRElYCQkJOAorI2RlZmluZSBHRU42X0FBX0xJTkVfRFcyX0NBUF9TTE9QRV9fTUFTSwkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgR0VONl9BQV9MSU5FX0RXMl9DQVBfU0xPUEVfX1NISUZUCQkJMAorI2RlZmluZSBHRU42X0FBX0xJTkVfRFcyX0NBUF9TTE9QRV9fUkFESVgJCQk4CisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX0dTX1NWQl9JTkRFWF9fU0laRQkJCQk0CisKKworI2RlZmluZSBHRU42X1NWQklfRFcxX0lOREVYX19NQVNLCQkJCTB4NjAwMDAwMDAKKyNkZWZpbmUgR0VONl9TVkJJX0RXMV9JTkRFWF9fU0hJRlQJCQkJMjkKKyNkZWZpbmUgR0VONl9TVkJJX0RXMV9MT0FEX0lOVEVSTkFMX1ZFUlRFWF9DT1VOVAkJKDB4MSA8PCAwKQorCisKKworI2RlZmluZSBHRU42XzNEU1RBVEVfTVVMVElTQU1QTEVfX1NJWkUJCQkJNAorCisKKyNkZWZpbmUgR0VONzVfTVVMVElTQU1QTEVfRFcxX0RYOV9NVUxUSVNBTVBMRV9FTkFCTEUJCSgweDEgPDwgNSkKKyNkZWZpbmUgR0VONl9NVUxUSVNBTVBMRV9EVzFfUElYTE9DX19NQVNLCQkJMHgwMDAwMDAxMAorI2RlZmluZSBHRU42X01VTFRJU0FNUExFX0RXMV9QSVhMT0NfX1NISUZUCQkJNAorI2RlZmluZSBHRU42X01VTFRJU0FNUExFX0RXMV9QSVhMT0NfQ0VOVEVSCQkJKDB4MCA8PCA0KQorI2RlZmluZSBHRU42X01VTFRJU0FNUExFX0RXMV9QSVhMT0NfVUxfQ09STkVSCQkJKDB4MSA8PCA0KQorI2RlZmluZSBHRU42X01VTFRJU0FNUExFX0RXMV9OVU1TQU1QTEVTX19NQVNLCQkJMHgwMDAwMDAwZQorI2RlZmluZSBHRU42X01VTFRJU0FNUExFX0RXMV9OVU1TQU1QTEVTX19TSElGVAkJCTEKKyNkZWZpbmUgR0VONl9NVUxUSVNBTVBMRV9EVzFfTlVNU0FNUExFU18xCQkJKDB4MCA8PCAxKQorI2RlZmluZSBHRU44X01VTFRJU0FNUExFX0RXMV9OVU1TQU1QTEVTXzIJCQkoMHgxIDw8IDEpCisjZGVmaW5lIEdFTjZfTVVMVElTQU1QTEVfRFcxX05VTVNBTVBMRVNfNAkJCSgweDIgPDwgMSkKKyNkZWZpbmUgR0VON19NVUxUSVNBTVBMRV9EVzFfTlVNU0FNUExFU184CQkJKDB4MyA8PCAxKQorI2RlZmluZSBHRU44X01VTFRJU0FNUExFX0RXMV9OVU1TQU1QTEVTXzE2CQkJKDB4NCA8PCAxKQorCisKKworI2RlZmluZSBHRU44XzNEU1RBVEVfU0FNUExFX1BBVFRFUk5fX1NJWkUJCQk5CisKKworCisKKworI2RlZmluZSBHRU44X1NBTVBMRV9QQVRURVJOX0RXOF8xWF9fTUFTSwkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgR0VOOF9TQU1QTEVfUEFUVEVSTl9EVzhfMVhfX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VOOF9TQU1QTEVfUEFUVEVSTl9EVzhfMlhfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjhfU0FNUExFX1BBVFRFUk5fRFc4XzJYX19TSElGVAkJCTAKKworI2RlZmluZSBHRU42XzNEU1RBVEVfU1RFTkNJTF9CVUZGRVJfX1NJWkUJCQk1CisKKworI2RlZmluZSBHRU43NV9TVEVOQ0lMX0RXMV9TVEVOQ0lMX0JVRkZFUl9FTkFCTEUJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU42X1NURU5DSUxfRFcxX01PQ1NfX01BU0sJCQkJMHgxZTAwMDAwMAorI2RlZmluZSBHRU42X1NURU5DSUxfRFcxX01PQ1NfX1NISUZUCQkJCTI1CisjZGVmaW5lIEdFTjhfU1RFTkNJTF9EVzFfTU9DU19fTUFTSwkJCQkweDFmYzAwMDAwCisjZGVmaW5lIEdFTjhfU1RFTkNJTF9EVzFfTU9DU19fU0hJRlQJCQkJMjIKKyNkZWZpbmUgR0VONl9TVEVOQ0lMX0RXMV9QSVRDSF9fTUFTSwkJCQkweDAwMDFmZmZmCisjZGVmaW5lIEdFTjZfU1RFTkNJTF9EVzFfUElUQ0hfX1NISUZUCQkJCTAKKworCisKKyNkZWZpbmUgR0VOOF9TVEVOQ0lMX0RXNF9RUElUQ0hfX01BU0sJCQkJMHgwMDAwN2ZmZgorI2RlZmluZSBHRU44X1NURU5DSUxfRFc0X1FQSVRDSF9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjZfM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUl9fU0laRQkJCTUKKworCisjZGVmaW5lIEdFTjZfSElaX0RXMV9NT0NTX19NQVNLCQkJCQkweDFlMDAwMDAwCisjZGVmaW5lIEdFTjZfSElaX0RXMV9NT0NTX19TSElGVAkJCQkyNQorI2RlZmluZSBHRU44X0hJWl9EVzFfTU9DU19fTUFTSwkJCQkJMHhmZTAwMDAwMAorI2RlZmluZSBHRU44X0hJWl9EVzFfTU9DU19fU0hJRlQJCQkJMjUKKyNkZWZpbmUgR0VONl9ISVpfRFcxX1BJVENIX19NQVNLCQkJCTB4MDAwMWZmZmYKKyNkZWZpbmUgR0VONl9ISVpfRFcxX1BJVENIX19TSElGVAkJCQkwCisKKworCisjZGVmaW5lIEdFTjhfSElaX0RXNF9RUElUQ0hfX01BU0sJCQkJMHgwMDAwN2ZmZgorI2RlZmluZSBHRU44X0hJWl9EVzRfUVBJVENIX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl8zRFNUQVRFX0NMRUFSX1BBUkFNU19fU0laRQkJCQkzCisKKyNkZWZpbmUgR0VONl9DTEVBUl9QQVJBTVNfRFcwX1ZBTElECQkJCSgweDEgPDwgMTUpCisKKworCisjZGVmaW5lIEdFTjdfQ0xFQVJfUEFSQU1TX0RXMl9WQUxJRAkJCQkoMHgxIDw8IDApCisKKyNkZWZpbmUgR0VONl8zRFBSSU1JVElWRV9fU0laRQkJCQkJNworCisjZGVmaW5lIEdFTjZfM0RQUklNX0RXMF9BQ0NFU1NfX01BU0sJCQkJMHgwMDAwODAwMAorI2RlZmluZSBHRU42XzNEUFJJTV9EVzBfQUNDRVNTX19TSElGVAkJCQkxNQorI2RlZmluZSBHRU42XzNEUFJJTV9EVzBfQUNDRVNTX1NFUVVFTlRJQUwJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBHRU42XzNEUFJJTV9EVzBfQUNDRVNTX1JBTkRPTQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBHRU42XzNEUFJJTV9EVzBfVFlQRV9fTUFTSwkJCQkweDAwMDA3YzAwCisjZGVmaW5lIEdFTjZfM0RQUklNX0RXMF9UWVBFX19TSElGVAkJCQkxMAorI2RlZmluZSBHRU42XzNEUFJJTV9EVzBfVVNFX0lOVEVSTkFMX1ZFUlRFWF9DT1VOVAkJKDB4MSA8PCA5KQorCisKKworCisKKworCisjZGVmaW5lIEdFTjdfM0RQUklNX0RXMF9JTkRJUkVDVF9QQVJBTV9FTkFCTEUJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU43NV8zRFBSSU1fRFcwX1VBVl9DT0hFUkVOQ1lfUkVRVUlSRUQJCQkoMHgxIDw8IDkpCisjZGVmaW5lIEdFTjdfM0RQUklNX0RXMF9QUkVESUNBVEVfRU5BQkxFCQkJKDB4MSA8PCA4KQorCisjZGVmaW5lIEdFTjdfM0RQUklNX0RXMV9FTkRfT0ZGU0VUX0VOQUJMRQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR0VON18zRFBSSU1fRFcxX0FDQ0VTU19fTUFTSwkJCQkweDAwMDAwMTAwCisjZGVmaW5lIEdFTjdfM0RQUklNX0RXMV9BQ0NFU1NfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VON18zRFBSSU1fRFcxX0FDQ0VTU19TRVFVRU5USUFMCQkJKDB4MCA8PCA4KQorI2RlZmluZSBHRU43XzNEUFJJTV9EVzFfQUNDRVNTX1JBTkRPTQkJCQkoMHgxIDw8IDgpCisjZGVmaW5lIEdFTjdfM0RQUklNX0RXMV9UWVBFX19NQVNLCQkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgR0VON18zRFBSSU1fRFcxX1RZUEVfX1NISUZUCQkJCTAKKworCisKKworCisKKworI2VuZGlmIC8qIEdFTl9SRU5ERVJfM0RfWE1MICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZ2VuaHcvZ2VuX3JlbmRlcl9keW5hbWljLnhtbC5oIGIvaWNkL2ludGVsL2dlbmh3L2dlbl9yZW5kZXJfZHluYW1pYy54bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgxNWJlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2dlbmh3L2dlbl9yZW5kZXJfZHluYW1pYy54bWwuaApAQCAtMCwwICsxLDUyNiBAQAorI2lmbmRlZiBHRU5fUkVOREVSX0RZTkFNSUNfWE1MCisjZGVmaW5lIEdFTl9SRU5ERVJfRFlOQU1JQ19YTUwKKworLyogQXV0b2dlbmVyYXRlZCBmaWxlLCBETyBOT1QgRURJVCBtYW51YWxseSEKKworVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHJ1bGVzLW5nLW5nIGhlYWRlcmdlbiB0b29sIGluIHRoaXMgZ2l0IHJlcG9zaXRvcnk6CitodHRwczovL2dpdGh1Yi5jb20vb2x2YWZmZS9lbnZ5dG9vbHMvCitnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL29sdmFmZmUvZW52eXRvb2xzLmdpdAorCitDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBieSB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CistIENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+IChvbHYpCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKK3BvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqLworCisKK2VudW0gZ2VuX2NvbXBhcmVfZnVuY3Rpb24geworICAgIEdFTjZfQ09NUEFSRUZVTkNUSU9OX0FMV0FZUwkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X0NPTVBBUkVGVU5DVElPTl9ORVZFUgkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X0NPTVBBUkVGVU5DVElPTl9MRVNTCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfQ09NUEFSRUZVTkNUSU9OX0VRVUFMCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfQ09NUEFSRUZVTkNUSU9OX0xFUVVBTAkJCQkgICAgICA9IDB4NCwKKyAgICBHRU42X0NPTVBBUkVGVU5DVElPTl9HUkVBVEVSCQkJICAgICAgPSAweDUsCisgICAgR0VONl9DT01QQVJFRlVOQ1RJT05fTk9URVFVQUwJCQkgICAgICA9IDB4NiwKKyAgICBHRU42X0NPTVBBUkVGVU5DVElPTl9HRVFVQUwJCQkJICAgICAgPSAweDcsCit9OworCitlbnVtIGdlbl9zdGVuY2lsX29wIHsKKyAgICBHRU42X1NURU5DSUxPUF9LRUVQCQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU42X1NURU5DSUxPUF9aRVJPCQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X1NURU5DSUxPUF9SRVBMQUNFCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfU1RFTkNJTE9QX0lOQ1JTQVQJCQkJICAgICAgPSAweDMsCisgICAgR0VONl9TVEVOQ0lMT1BfREVDUlNBVAkJCQkgICAgICA9IDB4NCwKKyAgICBHRU42X1NURU5DSUxPUF9JTkNSCQkJCQkgICAgICA9IDB4NSwKKyAgICBHRU42X1NURU5DSUxPUF9ERUNSCQkJCQkgICAgICA9IDB4NiwKKyAgICBHRU42X1NURU5DSUxPUF9JTlZFUlQJCQkJICAgICAgPSAweDcsCit9OworCitlbnVtIGdlbl9ibGVuZF9mYWN0b3IgeworICAgIEdFTjZfQkxFTkRGQUNUT1JfT05FCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfQkxFTkRGQUNUT1JfU1JDX0NPTE9SCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfQkxFTkRGQUNUT1JfU1JDX0FMUEhBCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfQkxFTkRGQUNUT1JfRFNUX0FMUEhBCQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfQkxFTkRGQUNUT1JfRFNUX0NPTE9SCQkJCSAgICAgID0gMHg1LAorICAgIEdFTjZfQkxFTkRGQUNUT1JfU1JDX0FMUEhBX1NBVFVSQVRFCQkJICAgICAgPSAweDYsCisgICAgR0VONl9CTEVOREZBQ1RPUl9DT05TVF9DT0xPUgkJCSAgICAgID0gMHg3LAorICAgIEdFTjZfQkxFTkRGQUNUT1JfQ09OU1RfQUxQSEEJCQkgICAgICA9IDB4OCwKKyAgICBHRU42X0JMRU5ERkFDVE9SX1NSQzFfQ09MT1IJCQkJICAgICAgPSAweDksCisgICAgR0VONl9CTEVOREZBQ1RPUl9TUkMxX0FMUEhBCQkJCSAgICAgID0gMHhhLAorICAgIEdFTjZfQkxFTkRGQUNUT1JfWkVSTwkJCQkgICAgICA9IDB4MTEsCisgICAgR0VONl9CTEVOREZBQ1RPUl9JTlZfU1JDX0NPTE9SCQkJICAgICAgPSAweDEyLAorICAgIEdFTjZfQkxFTkRGQUNUT1JfSU5WX1NSQ19BTFBIQQkJCSAgICAgID0gMHgxMywKKyAgICBHRU42X0JMRU5ERkFDVE9SX0lOVl9EU1RfQUxQSEEJCQkgICAgICA9IDB4MTQsCisgICAgR0VONl9CTEVOREZBQ1RPUl9JTlZfRFNUX0NPTE9SCQkJICAgICAgPSAweDE1LAorICAgIEdFTjZfQkxFTkRGQUNUT1JfSU5WX0NPTlNUX0NPTE9SCQkJICAgICAgPSAweDE3LAorICAgIEdFTjZfQkxFTkRGQUNUT1JfSU5WX0NPTlNUX0FMUEhBCQkJICAgICAgPSAweDE4LAorICAgIEdFTjZfQkxFTkRGQUNUT1JfSU5WX1NSQzFfQ09MT1IJCQkgICAgICA9IDB4MTksCisgICAgR0VONl9CTEVOREZBQ1RPUl9JTlZfU1JDMV9BTFBIQQkJCSAgICAgID0gMHgxYSwKK307CisKK2VudW0gZ2VuX2JsZW5kX2Z1bmN0aW9uIHsKKyAgICBHRU42X0JMRU5ERlVOQ1RJT05fQURECQkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfQkxFTkRGVU5DVElPTl9TVUJUUkFDVAkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X0JMRU5ERlVOQ1RJT05fUkVWRVJTRV9TVUJUUkFDVAkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfQkxFTkRGVU5DVElPTl9NSU4JCQkJICAgICAgPSAweDMsCisgICAgR0VONl9CTEVOREZVTkNUSU9OX01BWAkJCQkgICAgICA9IDB4NCwKK307CisKK2VudW0gZ2VuX2xvZ2ljb3BfZnVuY3Rpb24geworICAgIEdFTjZfTE9HSUNPUF9DTEVBUgkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9MT0dJQ09QX05PUgkJCQkJICAgICAgPSAweDEsCisgICAgR0VONl9MT0dJQ09QX0FORF9JTlZFUlRFRAkJCQkgICAgICA9IDB4MiwKKyAgICBHRU42X0xPR0lDT1BfQ09QWV9JTlZFUlRFRAkJCQkgICAgICA9IDB4MywKKyAgICBHRU42X0xPR0lDT1BfQU5EX1JFVkVSU0UJCQkJICAgICAgPSAweDQsCisgICAgR0VONl9MT0dJQ09QX0lOVkVSVAkJCQkJICAgICAgPSAweDUsCisgICAgR0VONl9MT0dJQ09QX1hPUgkJCQkJICAgICAgPSAweDYsCisgICAgR0VONl9MT0dJQ09QX05BTkQJCQkJCSAgICAgID0gMHg3LAorICAgIEdFTjZfTE9HSUNPUF9BTkQJCQkJCSAgICAgID0gMHg4LAorICAgIEdFTjZfTE9HSUNPUF9FUVVJVgkJCQkJICAgICAgPSAweDksCisgICAgR0VONl9MT0dJQ09QX05PT1AJCQkJCSAgICAgID0gMHhhLAorICAgIEdFTjZfTE9HSUNPUF9PUl9JTlZFUlRFRAkJCQkgICAgICA9IDB4YiwKKyAgICBHRU42X0xPR0lDT1BfQ09QWQkJCQkJICAgICAgPSAweGMsCisgICAgR0VONl9MT0dJQ09QX09SX1JFVkVSU0UJCQkJICAgICAgPSAweGQsCisgICAgR0VONl9MT0dJQ09QX09SCQkJCQkgICAgICA9IDB4ZSwKKyAgICBHRU42X0xPR0lDT1BfU0VUCQkJCQkgICAgICA9IDB4ZiwKK307CisKK2VudW0gZ2VuX3NhbXBsZXJfbWlwX2ZpbHRlciB7CisgICAgR0VONl9NSVBGSUxURVJfTk9ORQkJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9NSVBGSUxURVJfTkVBUkVTVAkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X01JUEZJTFRFUl9MSU5FQVIJCQkJICAgICAgPSAweDMsCit9OworCitlbnVtIGdlbl9zYW1wbGVyX21hcF9maWx0ZXIgeworICAgIEdFTjZfTUFQRklMVEVSX05FQVJFU1QJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9NQVBGSUxURVJfTElORUFSCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfTUFQRklMVEVSX0FOSVNPVFJPUElDCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfTUFQRklMVEVSX01PTk8JCQkJCSAgICAgID0gMHg2LAorfTsKKworZW51bSBnZW5fc2FtcGxlcl9hbmlzb19yYXRpbyB7CisgICAgR0VONl9BTklTT1JBVElPXzIJCQkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfQU5JU09SQVRJT180CQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X0FOSVNPUkFUSU9fNgkJCQkJICAgICAgPSAweDIsCisgICAgR0VONl9BTklTT1JBVElPXzgJCQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfQU5JU09SQVRJT18xMAkJCQkJICAgICAgPSAweDQsCisgICAgR0VONl9BTklTT1JBVElPXzEyCQkJCQkgICAgICA9IDB4NSwKKyAgICBHRU42X0FOSVNPUkFUSU9fMTQJCQkJCSAgICAgID0gMHg2LAorICAgIEdFTjZfQU5JU09SQVRJT18xNgkJCQkJICAgICAgPSAweDcsCit9OworCitlbnVtIGdlbl9zYW1wbGVyX3RleGNvb3JkX21vZGUgeworICAgIEdFTjZfVEVYQ09PUkRNT0RFX1dSQVAJCQkJICAgICAgPSAweDAsCisgICAgR0VONl9URVhDT09SRE1PREVfTUlSUk9SCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfVEVYQ09PUkRNT0RFX0NMQU1QCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfVEVYQ09PUkRNT0RFX0NVQkUJCQkJICAgICAgPSAweDMsCisgICAgR0VONl9URVhDT09SRE1PREVfQ0xBTVBfQk9SREVSCQkJICAgICAgPSAweDQsCisgICAgR0VONl9URVhDT09SRE1PREVfTUlSUk9SX09OQ0UJCQkgICAgICA9IDB4NSwKKyAgICBHRU44X1RFWENPT1JETU9ERV9IQUxGX0JPUkRFUgkJCSAgICAgID0gMHg2LAorfTsKKworZW51bSBnZW5fc2FtcGxlcl9rZXlfZmlsdGVyIHsKKyAgICBHRU42X0tFWUZJTFRFUl9LSUxMX09OX0FOWV9NQVRDSAkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfS0VZRklMVEVSX1JFUExBQ0VfQkxBQ0sJCQkgICAgICA9IDB4MSwKK307CisKKyNkZWZpbmUgR0VONl9DT0xPUl9DQUxDX1NUQVRFX19TSVpFCQkJCTYKKworI2RlZmluZSBHRU42X0NDX0RXMF9TVEVOQ0lMMF9SRUZfX01BU0sJCQkJMHhmZjAwMDAwMAorI2RlZmluZSBHRU42X0NDX0RXMF9TVEVOQ0lMMF9SRUZfX1NISUZUCQkJCTI0CisjZGVmaW5lIEdFTjZfQ0NfRFcwX1NURU5DSUwxX1JFRl9fTUFTSwkJCQkweDAwZmYwMDAwCisjZGVmaW5lIEdFTjZfQ0NfRFcwX1NURU5DSUwxX1JFRl9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9DQ19EVzBfUk9VTkRfRElTQUJMRV9ESVNBQkxFCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgR0VONl9DQ19EVzBfQUxQSEFURVNUX19NQVNLCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0VONl9DQ19EVzBfQUxQSEFURVNUX19TSElGVAkJCQkwCisjZGVmaW5lIEdFTjZfQ0NfRFcwX0FMUEhBVEVTVF9VTk9STTgJCQkJMHgwCisjZGVmaW5lIEdFTjZfQ0NfRFcwX0FMUEhBVEVTVF9GTE9BVDMyCQkJCTB4MQorCisKKworCisKKworI2RlZmluZSBHRU42X0RFUFRIX1NURU5DSUxfU1RBVEVfX1NJWkUJCQkJMworCisjZGVmaW5lIEdFTjZfWlNfRFcwX1NURU5DSUxfVEVTVF9FTkFCTEUJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDBfRlVOQ19fTUFTSwkJCQkweDcwMDAwMDAwCisjZGVmaW5lIEdFTjZfWlNfRFcwX1NURU5DSUwwX0ZVTkNfX1NISUZUCQkJMjgKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDBfRkFJTF9PUF9fTUFTSwkJCTB4MGUwMDAwMDAKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDBfRkFJTF9PUF9fU0hJRlQJCQkyNQorI2RlZmluZSBHRU42X1pTX0RXMF9TVEVOQ0lMMF9aRkFJTF9PUF9fTUFTSwkJCTB4MDFjMDAwMDAKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDBfWkZBSUxfT1BfX1NISUZUCQkJMjIKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDBfWlBBU1NfT1BfX01BU0sJCQkweDAwMzgwMDAwCisjZGVmaW5lIEdFTjZfWlNfRFcwX1NURU5DSUwwX1pQQVNTX09QX19TSElGVAkJCTE5CisjZGVmaW5lIEdFTjZfWlNfRFcwX1NURU5DSUxfV1JJVEVfRU5BQkxFCQkJKDB4MSA8PCAxOCkKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDFfRU5BQkxFCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIEdFTjZfWlNfRFcwX1NURU5DSUwxX0ZVTkNfX01BU0sJCQkJMHgwMDAwNzAwMAorI2RlZmluZSBHRU42X1pTX0RXMF9TVEVOQ0lMMV9GVU5DX19TSElGVAkJCTEyCisjZGVmaW5lIEdFTjZfWlNfRFcwX1NURU5DSUwxX0ZBSUxfT1BfX01BU0sJCQkweDAwMDAwZTAwCisjZGVmaW5lIEdFTjZfWlNfRFcwX1NURU5DSUwxX0ZBSUxfT1BfX1NISUZUCQkJOQorI2RlZmluZSBHRU42X1pTX0RXMF9TVEVOQ0lMMV9aRkFJTF9PUF9fTUFTSwkJCTB4MDAwMDAxYzAKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDFfWkZBSUxfT1BfX1NISUZUCQkJNgorI2RlZmluZSBHRU42X1pTX0RXMF9TVEVOQ0lMMV9aUEFTU19PUF9fTUFTSwkJCTB4MDAwMDAwMzgKKyNkZWZpbmUgR0VONl9aU19EVzBfU1RFTkNJTDFfWlBBU1NfT1BfX1NISUZUCQkJMworCisjZGVmaW5lIEdFTjZfWlNfRFcxX1NURU5DSUwwX1ZBTFVFTUFTS19fTUFTSwkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgR0VONl9aU19EVzFfU1RFTkNJTDBfVkFMVUVNQVNLX19TSElGVAkJCTI0CisjZGVmaW5lIEdFTjZfWlNfRFcxX1NURU5DSUwwX1dSSVRFTUFTS19fTUFTSwkJCTB4MDBmZjAwMDAKKyNkZWZpbmUgR0VONl9aU19EVzFfU1RFTkNJTDBfV1JJVEVNQVNLX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjZfWlNfRFcxX1NURU5DSUwxX1ZBTFVFTUFTS19fTUFTSwkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgR0VONl9aU19EVzFfU1RFTkNJTDFfVkFMVUVNQVNLX19TSElGVAkJCTgKKyNkZWZpbmUgR0VONl9aU19EVzFfU1RFTkNJTDFfV1JJVEVNQVNLX19NQVNLCQkJMHgwMDAwMDBmZgorI2RlZmluZSBHRU42X1pTX0RXMV9TVEVOQ0lMMV9XUklURU1BU0tfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjZfWlNfRFcyX0RFUFRIX1RFU1RfRU5BQkxFCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjZfWlNfRFcyX0RFUFRIX0ZVTkNfX01BU0sJCQkJMHgzODAwMDAwMAorI2RlZmluZSBHRU42X1pTX0RXMl9ERVBUSF9GVU5DX19TSElGVAkJCQkyNworI2RlZmluZSBHRU42X1pTX0RXMl9ERVBUSF9XUklURV9FTkFCTEUJCQkJKDB4MSA8PCAyNikKKworI2RlZmluZSBHRU42X0JMRU5EX1NUQVRFX19TSVpFCQkJCQkxNworCisKKyNkZWZpbmUgR0VONl9SVF9EVzBfQkxFTkRfRU5BQkxFCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjZfUlRfRFcwX0lOREVQRU5ERU5UX0FMUEhBX0VOQUJMRQkJCSgweDEgPDwgMzApCisjZGVmaW5lIEdFTjZfUlRfRFcwX0FMUEhBX0ZVTkNfX01BU0sJCQkJMHgxYzAwMDAwMAorI2RlZmluZSBHRU42X1JUX0RXMF9BTFBIQV9GVU5DX19TSElGVAkJCQkyNgorI2RlZmluZSBHRU42X1JUX0RXMF9TUkNfQUxQSEFfRkFDVE9SX19NQVNLCQkJMHgwMWYwMDAwMAorI2RlZmluZSBHRU42X1JUX0RXMF9TUkNfQUxQSEFfRkFDVE9SX19TSElGVAkJCTIwCisjZGVmaW5lIEdFTjZfUlRfRFcwX0RTVF9BTFBIQV9GQUNUT1JfX01BU0sJCQkweDAwMGY4MDAwCisjZGVmaW5lIEdFTjZfUlRfRFcwX0RTVF9BTFBIQV9GQUNUT1JfX1NISUZUCQkJMTUKKyNkZWZpbmUgR0VONl9SVF9EVzBfQ09MT1JfRlVOQ19fTUFTSwkJCQkweDAwMDAzODAwCisjZGVmaW5lIEdFTjZfUlRfRFcwX0NPTE9SX0ZVTkNfX1NISUZUCQkJCTExCisjZGVmaW5lIEdFTjZfUlRfRFcwX1NSQ19DT0xPUl9GQUNUT1JfX01BU0sJCQkweDAwMDAwM2UwCisjZGVmaW5lIEdFTjZfUlRfRFcwX1NSQ19DT0xPUl9GQUNUT1JfX1NISUZUCQkJNQorI2RlZmluZSBHRU42X1JUX0RXMF9EU1RfQ09MT1JfRkFDVE9SX19NQVNLCQkJMHgwMDAwMDAxZgorI2RlZmluZSBHRU42X1JUX0RXMF9EU1RfQ09MT1JfRkFDVE9SX19TSElGVAkJCTAKKworI2RlZmluZSBHRU42X1JUX0RXMV9BTFBIQV9UT19DT1ZFUkFHRQkJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU42X1JUX0RXMV9BTFBIQV9UT19PTkUJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VONl9SVF9EVzFfQUxQSEFfVE9fQ09WRVJBR0VfRElUSEVSCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VONl9SVF9EVzFfV1JJVEVfRElTQUJMRV9BCQkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjZfUlRfRFcxX1dSSVRFX0RJU0FCTEVfUgkJCQkoMHgxIDw8IDI2KQorI2RlZmluZSBHRU42X1JUX0RXMV9XUklURV9ESVNBQkxFX0cJCQkJKDB4MSA8PCAyNSkKKyNkZWZpbmUgR0VONl9SVF9EVzFfV1JJVEVfRElTQUJMRV9CCQkJCSgweDEgPDwgMjQpCisjZGVmaW5lIEdFTjZfUlRfRFcxX0xPR0lDT1BfRU5BQkxFCQkJCSgweDEgPDwgMjIpCisjZGVmaW5lIEdFTjZfUlRfRFcxX0xPR0lDT1BfRlVOQ19fTUFTSwkJCQkweDAwM2MwMDAwCisjZGVmaW5lIEdFTjZfUlRfRFcxX0xPR0lDT1BfRlVOQ19fU0hJRlQJCQkJMTgKKyNkZWZpbmUgR0VONl9SVF9EVzFfQUxQSEFfVEVTVF9FTkFCTEUJCQkJKDB4MSA8PCAxNikKKyNkZWZpbmUgR0VONl9SVF9EVzFfQUxQSEFfVEVTVF9GVU5DX19NQVNLCQkJMHgwMDAwZTAwMAorI2RlZmluZSBHRU42X1JUX0RXMV9BTFBIQV9URVNUX0ZVTkNfX1NISUZUCQkJMTMKKyNkZWZpbmUgR0VONl9SVF9EVzFfRElUSEVSX0VOQUJMRQkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBHRU42X1JUX0RXMV9YX0RJVEhFUl9PRkZTRVRfX01BU0sJCQkweDAwMDAwYzAwCisjZGVmaW5lIEdFTjZfUlRfRFcxX1hfRElUSEVSX09GRlNFVF9fU0hJRlQJCQkxMAorI2RlZmluZSBHRU42X1JUX0RXMV9ZX0RJVEhFUl9PRkZTRVRfX01BU0sJCQkweDAwMDAwMzAwCisjZGVmaW5lIEdFTjZfUlRfRFcxX1lfRElUSEVSX09GRlNFVF9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjZfUlRfRFcxX0NPTE9SQ0xBTVBfX01BU0sJCQkJMHgwMDAwMDAwYworI2RlZmluZSBHRU42X1JUX0RXMV9DT0xPUkNMQU1QX19TSElGVAkJCQkyCisjZGVmaW5lIEdFTjZfUlRfRFcxX0NPTE9SQ0xBTVBfVU5PUk0JCQkJKDB4MCA8PCAyKQorI2RlZmluZSBHRU42X1JUX0RXMV9DT0xPUkNMQU1QX1NOT1JNCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgR0VONl9SVF9EVzFfQ09MT1JDTEFNUF9SVEZPUk1BVAkJCQkoMHgyIDw8IDIpCisjZGVmaW5lIEdFTjZfUlRfRFcxX1BSRV9CTEVORF9DTEFNUAkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIEdFTjZfUlRfRFcxX1BPU1RfQkxFTkRfQ0xBTVAJCQkJKDB4MSA8PCAwKQorCisKKyNkZWZpbmUgR0VOOF9CTEVORF9EVzBfQUxQSEFfVE9fQ09WRVJBR0UJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBHRU44X0JMRU5EX0RXMF9JTkRFUEVOREVOVF9BTFBIQV9FTkFCTEUJCQkoMHgxIDw8IDMwKQorI2RlZmluZSBHRU44X0JMRU5EX0RXMF9BTFBIQV9UT19PTkUJCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VOOF9CTEVORF9EVzBfQUxQSEFfVE9fQ09WRVJBR0VfRElUSEVSCQkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR0VOOF9CTEVORF9EVzBfQUxQSEFfVEVTVF9FTkFCTEUJCQkoMHgxIDw8IDI3KQorI2RlZmluZSBHRU44X0JMRU5EX0RXMF9BTFBIQV9URVNUX0ZVTkNfX01BU0sJCQkweDA3MDAwMDAwCisjZGVmaW5lIEdFTjhfQkxFTkRfRFcwX0FMUEhBX1RFU1RfRlVOQ19fU0hJRlQJCQkyNAorI2RlZmluZSBHRU44X0JMRU5EX0RXMF9ESVRIRVJfRU5BQkxFCQkJCSgweDEgPDwgMjMpCisjZGVmaW5lIEdFTjhfQkxFTkRfRFcwX1hfRElUSEVSX09GRlNFVF9fTUFTSwkJCTB4MDA2MDAwMDAKKyNkZWZpbmUgR0VOOF9CTEVORF9EVzBfWF9ESVRIRVJfT0ZGU0VUX19TSElGVAkJCTIxCisjZGVmaW5lIEdFTjhfQkxFTkRfRFcwX1lfRElUSEVSX09GRlNFVF9fTUFTSwkJCTB4MDAxODAwMDAKKyNkZWZpbmUgR0VOOF9CTEVORF9EVzBfWV9ESVRIRVJfT0ZGU0VUX19TSElGVAkJCTE5CisKKworI2RlZmluZSBHRU44X1JUX0RXMF9CTEVORF9FTkFCTEUJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VOOF9SVF9EVzBfU1JDX0NPTE9SX0ZBQ1RPUl9fTUFTSwkJCTB4N2MwMDAwMDAKKyNkZWZpbmUgR0VOOF9SVF9EVzBfU1JDX0NPTE9SX0ZBQ1RPUl9fU0hJRlQJCQkyNgorI2RlZmluZSBHRU44X1JUX0RXMF9EU1RfQ09MT1JfRkFDVE9SX19NQVNLCQkJMHgwM2UwMDAwMAorI2RlZmluZSBHRU44X1JUX0RXMF9EU1RfQ09MT1JfRkFDVE9SX19TSElGVAkJCTIxCisjZGVmaW5lIEdFTjhfUlRfRFcwX0NPTE9SX0ZVTkNfX01BU0sJCQkJMHgwMDFjMDAwMAorI2RlZmluZSBHRU44X1JUX0RXMF9DT0xPUl9GVU5DX19TSElGVAkJCQkxOAorI2RlZmluZSBHRU44X1JUX0RXMF9TUkNfQUxQSEFfRkFDVE9SX19NQVNLCQkJMHgwMDAzZTAwMAorI2RlZmluZSBHRU44X1JUX0RXMF9TUkNfQUxQSEFfRkFDVE9SX19TSElGVAkJCTEzCisjZGVmaW5lIEdFTjhfUlRfRFcwX0RTVF9BTFBIQV9GQUNUT1JfX01BU0sJCQkweDAwMDAxZjAwCisjZGVmaW5lIEdFTjhfUlRfRFcwX0RTVF9BTFBIQV9GQUNUT1JfX1NISUZUCQkJOAorI2RlZmluZSBHRU44X1JUX0RXMF9BTFBIQV9GVU5DX19NQVNLCQkJCTB4MDAwMDAwZTAKKyNkZWZpbmUgR0VOOF9SVF9EVzBfQUxQSEFfRlVOQ19fU0hJRlQJCQkJNQorI2RlZmluZSBHRU44X1JUX0RXMF9XUklURV9ESVNBQkxFX0EJCQkJKDB4MSA8PCAzKQorI2RlZmluZSBHRU44X1JUX0RXMF9XUklURV9ESVNBQkxFX1IJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU44X1JUX0RXMF9XUklURV9ESVNBQkxFX0cJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU44X1JUX0RXMF9XUklURV9ESVNBQkxFX0IJCQkJKDB4MSA8PCAwKQorCisjZGVmaW5lIEdFTjhfUlRfRFcxX0xPR0lDT1BfRU5BQkxFCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjhfUlRfRFcxX0xPR0lDT1BfRlVOQ19fTUFTSwkJCQkweDc4MDAwMDAwCisjZGVmaW5lIEdFTjhfUlRfRFcxX0xPR0lDT1BfRlVOQ19fU0hJRlQJCQkJMjcKKyNkZWZpbmUgR0VOOF9SVF9EVzFfUFJFX0JMRU5EX0NMQU1QX1NSQ19PTkxZCQkJKDB4MSA8PCA0KQorI2RlZmluZSBHRU44X1JUX0RXMV9DT0xPUkNMQU1QX19NQVNLCQkJCTB4MDAwMDAwMGMKKyNkZWZpbmUgR0VOOF9SVF9EVzFfQ09MT1JDTEFNUF9fU0hJRlQJCQkJMgorI2RlZmluZSBHRU44X1JUX0RXMV9DT0xPUkNMQU1QX1VOT1JNCQkJCSgweDAgPDwgMikKKyNkZWZpbmUgR0VOOF9SVF9EVzFfQ09MT1JDTEFNUF9TTk9STQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIEdFTjhfUlRfRFcxX0NPTE9SQ0xBTVBfUlRGT1JNQVQJCQkJKDB4MiA8PCAyKQorI2RlZmluZSBHRU44X1JUX0RXMV9QUkVfQkxFTkRfQ0xBTVAJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBHRU44X1JUX0RXMV9QT1NUX0JMRU5EX0NMQU1QCQkJCSgweDEgPDwgMCkKKworI2RlZmluZSBHRU42X0NMSVBfVklFV1BPUlRfX1NJWkUJCQkJNjQKKworCisKKworCisKKyNkZWZpbmUgR0VONl9TRl9WSUVXUE9SVF9fU0laRQkJCQkJMTI4CisKKworCisKKworCisKKworCisKKyNkZWZpbmUgR0VON19TRl9DTElQX1ZJRVdQT1JUX19TSVpFCQkJCTI1NgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworI2RlZmluZSBHRU42X0NDX1ZJRVdQT1JUX19TSVpFCQkJCQkzMgorCisKKworCisjZGVmaW5lIEdFTjZfU0NJU1NPUl9SRUNUX19TSVpFCQkJCQkzMgorCisKKyNkZWZpbmUgR0VONl9TQ0lTU09SX0RXMF9NSU5fWV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIEdFTjZfU0NJU1NPUl9EVzBfTUlOX1lfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjZfU0NJU1NPUl9EVzBfTUlOX1hfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X1NDSVNTT1JfRFcwX01JTl9YX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9TQ0lTU09SX0RXMV9NQVhfWV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIEdFTjZfU0NJU1NPUl9EVzFfTUFYX1lfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjZfU0NJU1NPUl9EVzFfTUFYX1hfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X1NDSVNTT1JfRFcxX01BWF9YX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0JPUkRFUl9DT0xPUl9TVEFURV9fU0laRQkJCTIwCisKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFcwX0FfX01BU0sJCQkJMHhmZjAwMDAwMAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzBfQV9fU0hJRlQJCQkJMjQKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFcwX0JfX01BU0sJCQkJMHgwMGZmMDAwMAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzBfQl9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFcwX0dfX01BU0sJCQkJMHgwMDAwZmYwMAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzBfR19fU0hJRlQJCQkJOAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzBfUl9fTUFTSwkJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXMF9SX19TSElGVAkJCQkwCisKKworCisKKworI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzVfR19fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXNV9HX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzVfUl9fTUFTSwkJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXNV9SX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFc2X0FfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzZfQV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFc2X0JfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzZfQl9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXN19HX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFc3X0dfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXN19SX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFc3X1JfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzhfQV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXOF9BX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzhfQl9fTUFTSwkJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXOF9CX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFc5X0dfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzlfR19fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFc5X1JfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzlfUl9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXMTBfQV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXMTBfQV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFcxMF9CX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFcxMF9CX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFcxMV9BX19NQVNLCQkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgR0VONl9CT1JERVJfQ09MT1JfRFcxMV9BX19TSElGVAkJCQkyNAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzExX0JfX01BU0sJCQkJMHgwMGZmMDAwMAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzExX0JfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXMTFfR19fTUFTSwkJCQkweDAwMDBmZjAwCisjZGVmaW5lIEdFTjZfQk9SREVSX0NPTE9SX0RXMTFfR19fU0hJRlQJCQkJOAorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzExX1JfX01BU0sJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBHRU42X0JPUkRFUl9DT0xPUl9EVzExX1JfX1NISUZUCQkJCTAKKworCisKKworCisKKworCisjZGVmaW5lIEdFTjZfU0FNUExFUl9TVEFURV9fU0laRQkJCQk0CisKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMF9ESVNBQkxFCQkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzBfQk9SREVSX0NPTE9SX01PREVfX01BU0sJCTB4MjAwMDAwMDAKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXMF9CT1JERVJfQ09MT1JfTU9ERV9fU0hJRlQJCTI5CisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzBfQk9SREVSX0NPTE9SX01PREVfRFgxMF9PR0wJCSgweDAgPDwgMjkpCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzBfQk9SREVSX0NPTE9SX01PREVfRFg5CQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMF9MT0RfUFJFQ0xBTVBfRU5BQkxFCQkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMF9NSU5fTUFHX05PVF9FUVVBTAkJCSgweDEgPDwgMjcpCisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzBfTE9EX1BSRUNMQU1QX0VOQUJMRV9fTUFTSwkJMHgxODAwMDAwMAorI2RlZmluZSBHRU44X1NBTVBMRVJfRFcwX0xPRF9QUkVDTEFNUF9FTkFCTEVfX1NISUZUCQkyNworI2RlZmluZSBHRU42X1NBTVBMRVJfRFcwX0JBU0VfTE9EX19NQVNLCQkJCTB4MDdjMDAwMDAKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMF9CQVNFX0xPRF9fU0hJRlQJCQkyMgorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcwX01JUF9GSUxURVJfX01BU0sJCQkweDAwMzAwMDAwCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzBfTUlQX0ZJTFRFUl9fU0hJRlQJCQkyMAorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcwX01BR19GSUxURVJfX01BU0sJCQkweDAwMGUwMDAwCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzBfTUFHX0ZJTFRFUl9fU0hJRlQJCQkxNworI2RlZmluZSBHRU42X1NBTVBMRVJfRFcwX01JTl9GSUxURVJfX01BU0sJCQkweDAwMDFjMDAwCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzBfTUlOX0ZJTFRFUl9fU0hJRlQJCQkxNAorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcwX0xPRF9CSUFTX19NQVNLCQkJCTB4MDAwMDNmZjgKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMF9MT0RfQklBU19fU0hJRlQJCQkzCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzBfTE9EX0JJQVNfX1JBRElYCQkJNgorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcwX1NIQURPV19GVU5DX19NQVNLCQkJMHgwMDAwMDAwNworI2RlZmluZSBHRU42X1NBTVBMRVJfRFcwX1NIQURPV19GVU5DX19TSElGVAkJCTAKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXMF9MT0RfQklBU19fTUFTSwkJCQkweDAwMDAzZmZlCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzBfTE9EX0JJQVNfX1NISUZUCQkJMQorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcwX0xPRF9CSUFTX19SQURJWAkJCTgKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXMF9BTklTT19BTEdPX19NQVNLCQkJMHgwMDAwMDAwMQorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcwX0FOSVNPX0FMR09fX1NISUZUCQkJMAorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcwX0FOSVNPX0FMR09fTEVHQUNZCQkJMHgwCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzBfQU5JU09fQUxHT19FV0EJCQkJMHgxCisKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9NSU5fTE9EX19NQVNLCQkJCTB4ZmZjMDAwMDAKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9NSU5fTE9EX19TSElGVAkJCQkyMgorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcxX01JTl9MT0RfX1JBRElYCQkJCTYKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9NQVhfTE9EX19NQVNLCQkJCTB4MDAzZmYwMDAKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9NQVhfTE9EX19TSElGVAkJCQkxMgorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcxX01BWF9MT0RfX1JBRElYCQkJCTYKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9DVUJFQ1RSTE1PREVfX01BU0sJCQkweDAwMDAwMjAwCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzFfQ1VCRUNUUkxNT0RFX19TSElGVAkJCTkKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9DVUJFQ1RSTE1PREVfUFJPR1JBTU1FRAkJKDB4MCA8PCA5KQorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcxX0NVQkVDVFJMTU9ERV9PVkVSUklERQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9VX1dSQVBfX01BU0sJCQkJMHgwMDAwMDFjMAorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcxX1VfV1JBUF9fU0hJRlQJCQkJNgorI2RlZmluZSBHRU42X1NBTVBMRVJfRFcxX1ZfV1JBUF9fTUFTSwkJCQkweDAwMDAwMDM4CisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzFfVl9XUkFQX19TSElGVAkJCQkzCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzFfUl9XUkFQX19NQVNLCQkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXMV9SX1dSQVBfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU43X1NBTVBMRVJfRFcxX01JTl9MT0RfX01BU0sJCQkJMHhmZmYwMDAwMAorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcxX01JTl9MT0RfX1NISUZUCQkJCTIwCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzFfTUlOX0xPRF9fUkFESVgJCQkJOAorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcxX01BWF9MT0RfX01BU0sJCQkJMHgwMDBmZmYwMAorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcxX01BWF9MT0RfX1NISUZUCQkJCTgKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXMV9NQVhfTE9EX19SQURJWAkJCQk4CisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzFfQ0hST01BS0VZX0VOQUJMRQkJCSgweDEgPDwgNykKKyNkZWZpbmUgR0VOOF9TQU1QTEVSX0RXMV9DSFJPTUFLRVlfSU5ERVhfX01BU0sJCQkweDAwMDAwMDYwCisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzFfQ0hST01BS0VZX0lOREVYX19TSElGVAkJCTUKKyNkZWZpbmUgR0VOOF9TQU1QTEVSX0RXMV9DSFJPTUFLRVlfTU9ERV9fTUFTSwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgR0VOOF9TQU1QTEVSX0RXMV9DSFJPTUFLRVlfTU9ERV9fU0hJRlQJCQk0CisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzFfU0hBRE9XX0ZVTkNfX01BU0sJCQkweDAwMDAwMDBlCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzFfU0hBRE9XX0ZVTkNfX1NISUZUCQkJMQorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcxX0NVQkVDVFJMTU9ERV9fTUFTSwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXMV9DVUJFQ1RSTE1PREVfX1NISUZUCQkJMAorI2RlZmluZSBHRU43X1NBTVBMRVJfRFcxX0NVQkVDVFJMTU9ERV9QUk9HUkFNTUVECQkweDAKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXMV9DVUJFQ1RSTE1PREVfT1ZFUlJJREUJCQkweDEKKworI2RlZmluZSBHRU42X1NBTVBMRVJfRFcyX0JPUkRFUl9DT0xPUl9BRERSX19NQVNLCQkweGZmZmZmZmUwCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzJfQk9SREVSX0NPTE9SX0FERFJfX1NISUZUCQk1CisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzJfQk9SREVSX0NPTE9SX0FERFJfX1NIUgkJCTUKKworI2RlZmluZSBHRU44X1NBTVBMRVJfRFcyX1NFUF9GSUxURVJfQ09FRkZfVEFCTEVfU0laRV9fTUFTSwkweGMwMDAwMDAwCisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfU0VQX0ZJTFRFUl9DT0VGRl9UQUJMRV9TSVpFX19TSElGVAkzMAorI2RlZmluZSBHRU44X1NBTVBMRVJfRFcyX1NFUF9GSUxURVJfV0lEVEhfX01BU0sJCQkweDMwMDAwMDAwCisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfU0VQX0ZJTFRFUl9XSURUSF9fU0hJRlQJCTI4CisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfU0VQX0ZJTFRFUl9IRUlHSFRfX01BU0sJCTB4MGMwMDAwMDAKKyNkZWZpbmUgR0VOOF9TQU1QTEVSX0RXMl9TRVBfRklMVEVSX0hFSUdIVF9fU0hJRlQJCTI2CisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfSU5ESVJFQ1RfU1RBVEVfQUREUl9fTUFTSwkJMHgwMGZmZmZjMAorI2RlZmluZSBHRU44X1NBTVBMRVJfRFcyX0lORElSRUNUX1NUQVRFX0FERFJfX1NISUZUCQk2CisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfSU5ESVJFQ1RfU1RBVEVfQUREUl9fU0hSCQk2CisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfRkxFWElCTEVfRklMVEVSX01PREUJCQkoMHgxIDw8IDQpCisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfRkxFWElCTEVfRklMVEVSX0NPRUZGX1NJWkUJCSgweDEgPDwgMykKKyNkZWZpbmUgR0VOOF9TQU1QTEVSX0RXMl9GTEVYSUJMRV9GSUxURVJfSEFMSUdOCQkJKDB4MSA8PCAyKQorI2RlZmluZSBHRU44X1NBTVBMRVJfRFcyX0ZMRVhJQkxFX0ZJTFRFUl9WQUxJR04JCQkoMHgxIDw8IDEpCisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzJfTE9EX0NMQU1QX01BR19NT0RFCQkJKDB4MSA8PCAwKQorCisjZGVmaW5lIEdFTjhfU0FNUExFUl9EVzNfTk9OX1NFUF9GSUxURVJfRk9PVFBSSU5UX01BU0tfX01BU0sJMHhmZjAwMDAwMAorI2RlZmluZSBHRU44X1NBTVBMRVJfRFczX05PTl9TRVBfRklMVEVSX0ZPT1RQUklOVF9NQVNLX19TSElGVAkyNAorI2RlZmluZSBHRU42X1NBTVBMRVJfRFczX0NIUk9NQUtFWV9FTkFCTEUJCQkoMHgxIDw8IDI1KQorI2RlZmluZSBHRU42X1NBTVBMRVJfRFczX0NIUk9NQUtFWV9JTkRFWF9fTUFTSwkJCTB4MDE4MDAwMDAKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXM19DSFJPTUFLRVlfSU5ERVhfX1NISUZUCQkJMjMKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXM19DSFJPTUFLRVlfTU9ERV9fTUFTSwkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXM19DSFJPTUFLRVlfTU9ERV9fU0hJRlQJCQkyMgorI2RlZmluZSBHRU42X1NBTVBMRVJfRFczX01BWF9BTklTT19fTUFTSwkJCTB4MDAzODAwMDAKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXM19NQVhfQU5JU09fX1NISUZUCQkJMTkKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXM19VX01BR19ST1VORAkJCQkoMHgxIDw8IDE4KQorI2RlZmluZSBHRU42X1NBTVBMRVJfRFczX1VfTUlOX1JPVU5ECQkJCSgweDEgPDwgMTcpCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzNfVl9NQUdfUk9VTkQJCQkJKDB4MSA8PCAxNikKKyNkZWZpbmUgR0VONl9TQU1QTEVSX0RXM19WX01JTl9ST1VORAkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBHRU42X1NBTVBMRVJfRFczX1JfTUFHX1JPVU5ECQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIEdFTjZfU0FNUExFUl9EVzNfUl9NSU5fUk9VTkQJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXM19UUklRVUFMX19NQVNLCQkJCTB4MDAwMDE4MDAKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXM19UUklRVUFMX19TSElGVAkJCQkxMQorI2RlZmluZSBHRU43X1NBTVBMRVJfRFczX1RSSVFVQUxfRlVMTAkJCQkoMHgwIDw8IDExKQorI2RlZmluZSBHRU43NV9TQU1QTEVSX0RXM19UUklRVUFMX0hJR0gJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXM19UUklRVUFMX01FRAkJCQkoMHgyIDw8IDExKQorI2RlZmluZSBHRU43X1NBTVBMRVJfRFczX1RSSVFVQUxfTE9XCQkJCSgweDMgPDwgMTEpCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzNfTk9OX05PUk1BTElaRURfQ09PUkQJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU43X1NBTVBMRVJfRFczX1VfV1JBUF9fTUFTSwkJCQkweDAwMDAwMWMwCisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzNfVV9XUkFQX19TSElGVAkJCQk2CisjZGVmaW5lIEdFTjdfU0FNUExFUl9EVzNfVl9XUkFQX19NQVNLCQkJCTB4MDAwMDAwMzgKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXM19WX1dSQVBfX1NISUZUCQkJCTMKKyNkZWZpbmUgR0VON19TQU1QTEVSX0RXM19SX1dSQVBfX01BU0sJCQkJMHgwMDAwMDAwNworI2RlZmluZSBHRU43X1NBTVBMRVJfRFczX1JfV1JBUF9fU0hJRlQJCQkJMAorI2RlZmluZSBHRU42X1NBTVBMRVJfRFczX05PTl9OT1JNQUxJWkVEX0NPT1JECQkJKDB4MSA8PCAwKQorCisKKyNlbmRpZiAvKiBHRU5fUkVOREVSX0RZTkFNSUNfWE1MICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZ2VuaHcvZ2VuX3JlbmRlcl9tZWRpYS54bWwuaCBiL2ljZC9pbnRlbC9nZW5ody9nZW5fcmVuZGVyX21lZGlhLnhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZDgzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuX3JlbmRlcl9tZWRpYS54bWwuaApAQCAtMCwwICsxLDMxMSBAQAorI2lmbmRlZiBHRU5fUkVOREVSX01FRElBX1hNTAorI2RlZmluZSBHRU5fUkVOREVSX01FRElBX1hNTAorCisvKiBBdXRvZ2VuZXJhdGVkIGZpbGUsIERPIE5PVCBFRElUIG1hbnVhbGx5IQorCitUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgcnVsZXMtbmctbmcgaGVhZGVyZ2VuIHRvb2wgaW4gdGhpcyBnaXQgcmVwb3NpdG9yeToKK2h0dHBzOi8vZ2l0aHViLmNvbS9vbHZhZmZlL2Vudnl0b29scy8KK2dpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vb2x2YWZmZS9lbnZ5dG9vbHMuZ2l0CisKK0NvcHlyaWdodCAoQykgMjAxNC0yMDE1IGJ5IHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKy0gQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4gKG9sdikKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKworI2RlZmluZSBHRU42X0lOVEVSRkFDRV9ERVNDUklQVE9SX0RBVEFfX1NJWkUJCQk4CisKKyNkZWZpbmUgR0VONl9JRFJUX0RXMF9LRVJORUxfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjZfSURSVF9EVzBfS0VSTkVMX0FERFJfX1NISUZUCQkJNgorI2RlZmluZSBHRU42X0lEUlRfRFcwX0tFUk5FTF9BRERSX19TSFIJCQkJNgorCisjZGVmaW5lIEdFTjZfSURSVF9EVzFfU1BGCQkJCQkoMHgxIDw8IDE4KQorI2RlZmluZSBHRU42X0lEUlRfRFcxX1BSSU9SSVRZX0hJR0gJCQkJKDB4MSA8PCAxNykKKyNkZWZpbmUgR0VONl9JRFJUX0RXMV9GUF9NT0RFX0FMVAkJCQkoMHgxIDw8IDE2KQorI2RlZmluZSBHRU42X0lEUlRfRFcxX0lMTEVHQUxfQ09ERV9FWENFUFRJT04JCQkoMHgxIDw8IDEzKQorI2RlZmluZSBHRU42X0lEUlRfRFcxX01BU0tfU1RBQ0tfRVhDRVBUSU9OCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgR0VONl9JRFJUX0RXMV9TT0ZUV0FSRV9FWENFUFRJT04JCQkoMHgxIDw8IDcpCisKKyNkZWZpbmUgR0VONl9JRFJUX0RXMl9TQU1QTEVSX0NPVU5UX19NQVNLCQkJMHgwMDAwMDAxYworI2RlZmluZSBHRU42X0lEUlRfRFcyX1NBTVBMRVJfQ09VTlRfX1NISUZUCQkJMgorI2RlZmluZSBHRU42X0lEUlRfRFcyX1NBTVBMRVJfQUREUl9fTUFTSwkJCTB4ZmZmZmZmZTAKKyNkZWZpbmUgR0VONl9JRFJUX0RXMl9TQU1QTEVSX0FERFJfX1NISUZUCQkJNQorI2RlZmluZSBHRU42X0lEUlRfRFcyX1NBTVBMRVJfQUREUl9fU0hSCQkJCTUKKworI2RlZmluZSBHRU42X0lEUlRfRFczX0JJTkRJTkdfVEFCTEVfU0laRV9fTUFTSwkJCTB4MDAwMDAwMWYKKyNkZWZpbmUgR0VONl9JRFJUX0RXM19CSU5ESU5HX1RBQkxFX1NJWkVfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjZfSURSVF9EVzRfQ1VSQkVfUkVBRF9MRU5fX01BU0sJCQkweGZmZmYwMDAwCisjZGVmaW5lIEdFTjZfSURSVF9EVzRfQ1VSQkVfUkVBRF9MRU5fX1NISUZUCQkJMTYKKyNkZWZpbmUgR0VONl9JRFJUX0RXNF9DVVJCRV9SRUFEX09GRlNFVF9fTUFTSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VONl9JRFJUX0RXNF9DVVJCRV9SRUFEX09GRlNFVF9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VONl9JRFJUX0RXNV9CQVJSSUVSX0lEX19NQVNLCQkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgR0VONl9JRFJUX0RXNV9CQVJSSUVSX0lEX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VON19JRFJUX0RXNV9CQVJSSUVSX1JFVFVSTl9HUkZfX01BU0sJCQkweGZmMDAwMDAwCisjZGVmaW5lIEdFTjdfSURSVF9EVzVfQkFSUklFUl9SRVRVUk5fR1JGX19TSElGVAkJCTI0CisjZGVmaW5lIEdFTjdfSURSVF9EVzVfUk9VTkRJTkdfTU9ERV9fTUFTSwkJCTB4MDBjMDAwMDAKKyNkZWZpbmUgR0VON19JRFJUX0RXNV9ST1VORElOR19NT0RFX19TSElGVAkJCTIyCisjZGVmaW5lIEdFTjdfSURSVF9EVzVfUk9VTkRJTkdfTU9ERV9SVE5FCQkJKDB4MCA8PCAyMikKKyNkZWZpbmUgR0VON19JRFJUX0RXNV9ST1VORElOR19NT0RFX1JVCQkJCSgweDEgPDwgMjIpCisjZGVmaW5lIEdFTjdfSURSVF9EVzVfUk9VTkRJTkdfTU9ERV9SRAkJCQkoMHgyIDw8IDIyKQorI2RlZmluZSBHRU43X0lEUlRfRFc1X1JPVU5ESU5HX01PREVfUlRaCQkJCSgweDMgPDwgMjIpCisjZGVmaW5lIEdFTjdfSURSVF9EVzVfQkFSUklFUl9FTkFCTEUJCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR0VON19JRFJUX0RXNV9TTE1fU0laRV9fTUFTSwkJCQkweDAwMWYwMDAwCisjZGVmaW5lIEdFTjdfSURSVF9EVzVfU0xNX1NJWkVfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjdfSURSVF9EVzVfQkFSUklFUl9SRVRVUk5fQllURV9fTUFTSwkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgR0VON19JRFJUX0RXNV9CQVJSSUVSX1JFVFVSTl9CWVRFX19TSElGVAkJOAorI2RlZmluZSBHRU43X0lEUlRfRFc1X1RIUkVBRF9HUk9VUF9TSVpFX19NQVNLCQkJMHgwMDAwMDBmZgorI2RlZmluZSBHRU43X0lEUlRfRFc1X1RIUkVBRF9HUk9VUF9TSVpFX19TSElGVAkJCTAKKworI2RlZmluZSBHRU43NV9JRFJUX0RXNl9DUk9TU19USFJFQURfQ1VSQkVfUkVBRF9MRU5fX01BU0sJMHgwMDAwMDBmZgorI2RlZmluZSBHRU43NV9JRFJUX0RXNl9DUk9TU19USFJFQURfQ1VSQkVfUkVBRF9MRU5fX1NISUZUCTAKKworCisKKyNkZWZpbmUgR0VOOF9JRFJUX0RXMF9LRVJORUxfQUREUl9fTUFTSwkJCQkweGZmZmZmZmMwCisjZGVmaW5lIEdFTjhfSURSVF9EVzBfS0VSTkVMX0FERFJfX1NISUZUCQkJNgorI2RlZmluZSBHRU44X0lEUlRfRFcwX0tFUk5FTF9BRERSX19TSFIJCQkJNgorCisKKyNkZWZpbmUgR0VOOF9JRFJUX0RXMl9USFJFQURfUFJFRU1QVElPTl9ESVNBQkxFCQkJKDB4MSA8PCAyMCkKKyNkZWZpbmUgR0VOOF9JRFJUX0RXMl9ERU5PUk1fX01BU0sJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBHRU44X0lEUlRfRFcyX0RFTk9STV9fU0hJRlQJCQkJMTkKKyNkZWZpbmUgR0VOOF9JRFJUX0RXMl9ERU5PUk1fRlRaCQkJCSgweDAgPDwgMTkpCisjZGVmaW5lIEdFTjhfSURSVF9EVzJfREVOT1JNX1JFVAkJCQkoMHgxIDw8IDE5KQorI2RlZmluZSBHRU44X0lEUlRfRFcyX1NQRgkJCQkJKDB4MSA8PCAxOCkKKyNkZWZpbmUgR0VOOF9JRFJUX0RXMl9QUklPUklUWV9ISUdICQkJCSgweDEgPDwgMTcpCisjZGVmaW5lIEdFTjhfSURSVF9EVzJfRlBfTU9ERV9BTFQJCQkJKDB4MSA8PCAxNikKKyNkZWZpbmUgR0VOOF9JRFJUX0RXMl9JTExFR0FMX0NPREVfRVhDRVBUSU9OCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgR0VOOF9JRFJUX0RXMl9NQVNLX1NUQUNLX0VYQ0VQVElPTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjhfSURSVF9EVzJfU09GVFdBUkVfRVhDRVBUSU9OCQkJKDB4MSA8PCA3KQorCisjZGVmaW5lIEdFTjhfSURSVF9EVzNfU0FNUExFUl9DT1VOVF9fTUFTSwkJCTB4MDAwMDAwMWMKKyNkZWZpbmUgR0VOOF9JRFJUX0RXM19TQU1QTEVSX0NPVU5UX19TSElGVAkJCTIKKyNkZWZpbmUgR0VOOF9JRFJUX0RXM19TQU1QTEVSX0FERFJfX01BU0sJCQkweGZmZmZmZmUwCisjZGVmaW5lIEdFTjhfSURSVF9EVzNfU0FNUExFUl9BRERSX19TSElGVAkJCTUKKyNkZWZpbmUgR0VOOF9JRFJUX0RXM19TQU1QTEVSX0FERFJfX1NIUgkJCQk1CisKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNF9CSU5ESU5HX1RBQkxFX1NJWkVfX01BU0sJCQkweDAwMDAwMDFmCisjZGVmaW5lIEdFTjhfSURSVF9EVzRfQklORElOR19UQUJMRV9TSVpFX19TSElGVAkJCTAKKworI2RlZmluZSBHRU44X0lEUlRfRFc1X0NVUkJFX1JFQURfTEVOX19NQVNLCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU44X0lEUlRfRFc1X0NVUkJFX1JFQURfTEVOX19TSElGVAkJCTE2CisKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNl9ST1VORElOR19NT0RFX19NQVNLCQkJMHgwMGMwMDAwMAorI2RlZmluZSBHRU44X0lEUlRfRFc2X1JPVU5ESU5HX01PREVfX1NISUZUCQkJMjIKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNl9ST1VORElOR19NT0RFX1JUTkUJCQkoMHgwIDw8IDIyKQorI2RlZmluZSBHRU44X0lEUlRfRFc2X1JPVU5ESU5HX01PREVfUlUJCQkJKDB4MSA8PCAyMikKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNl9ST1VORElOR19NT0RFX1JECQkJCSgweDIgPDwgMjIpCisjZGVmaW5lIEdFTjhfSURSVF9EVzZfUk9VTkRJTkdfTU9ERV9SVFoJCQkJKDB4MyA8PCAyMikKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNl9CQVJSSUVSX0VOQUJMRQkJCQkoMHgxIDw8IDIxKQorI2RlZmluZSBHRU44X0lEUlRfRFc2X1NMTV9TSVpFX19NQVNLCQkJCTB4MDAxZjAwMDAKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNl9TTE1fU0laRV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNl9USFJFQURfR1JPVVBfU0laRV9fTUFTSwkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgR0VOOF9JRFJUX0RXNl9USFJFQURfR1JPVVBfU0laRV9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VOOF9JRFJUX0RXN19DUk9TU19USFJFQURfQ1VSQkVfUkVBRF9MRU5fX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgR0VOOF9JRFJUX0RXN19DUk9TU19USFJFQURfQ1VSQkVfUkVBRF9MRU5fX1NISUZUCTAKKworI2RlZmluZSBHRU42X01FRElBX1ZGRV9TVEFURV9fU0laRQkJCQk5CisKKworI2RlZmluZSBHRU42X1ZGRV9EVzFfU0NSQVRDSF9TVEFDS19TSVpFX19NQVNLCQkJMHgwMDAwMDBmMAorI2RlZmluZSBHRU42X1ZGRV9EVzFfU0NSQVRDSF9TVEFDS19TSVpFX19TSElGVAkJCTQKKyNkZWZpbmUgR0VONl9WRkVfRFcxX1NDUkFUQ0hfU1BBQ0VfUEVSX1RIUkVBRF9fTUFTSwkJMHgwMDAwMDAwZgorI2RlZmluZSBHRU42X1ZGRV9EVzFfU0NSQVRDSF9TUEFDRV9QRVJfVEhSRUFEX19TSElGVAkJMAorI2RlZmluZSBHRU42X1ZGRV9EVzFfU0NSQVRDSF9BRERSX19NQVNLCQkJCTB4ZmZmZmZjMDAKKyNkZWZpbmUgR0VONl9WRkVfRFcxX1NDUkFUQ0hfQUREUl9fU0hJRlQJCQkxMAorI2RlZmluZSBHRU42X1ZGRV9EVzFfU0NSQVRDSF9BRERSX19TSFIJCQkJMTAKKworI2RlZmluZSBHRU42X1ZGRV9EVzJfTUFYX1RIUkVBRFNfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBHRU42X1ZGRV9EVzJfTUFYX1RIUkVBRFNfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjZfVkZFX0RXMl9VUkJfRU5UUllfQ09VTlRfX01BU0sJCQkweDAwMDBmZjAwCisjZGVmaW5lIEdFTjZfVkZFX0RXMl9VUkJfRU5UUllfQ09VTlRfX1NISUZUCQkJOAorI2RlZmluZSBHRU42X1ZGRV9EVzJfUkVTRVRfR0FURVdBWV9USU1FUgkJCSgweDEgPDwgNykKKyNkZWZpbmUgR0VONl9WRkVfRFcyX0JZUEFTU19HQVRFV0FZX0NPTlRST0wJCQkoMHgxIDw8IDYpCisjZGVmaW5lIEdFTjZfVkZFX0RXMl9GQVNUX1BSRUVNUFQJCQkJKDB4MSA8PCA1KQorI2RlZmluZSBHRU43X1ZGRV9EVzJfR0FURVdBWV9NTUlPX19NQVNLCQkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgR0VON19WRkVfRFcyX0dBVEVXQVlfTU1JT19fU0hJRlQJCQkzCisjZGVmaW5lIEdFTjdfVkZFX0RXMl9HQVRFV0FZX01NSU9fTk9ORQkJCQkoMHgwIDw8IDMpCisjZGVmaW5lIEdFTjdfVkZFX0RXMl9HQVRFV0FZX01NSU9fQU5ZCQkJCSgweDIgPDwgMykKKyNkZWZpbmUgR0VON19WRkVfRFcyX0dQR1BVX01PREUJCQkJCSgweDEgPDwgMikKKworI2RlZmluZSBHRU43NV9WRkVfRFczX0hBTEZfU0xJQ0VfRElTQUJMRV9fTUFTSwkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR0VONzVfVkZFX0RXM19IQUxGX1NMSUNFX0RJU0FCTEVfX1NISUZUCQkJMAorI2RlZmluZSBHRU43NV9WRkVfRFczX0hBTEZfU0xJQ0VfRElTQUJMRV9OT05FCQkJMHgwCisjZGVmaW5lIEdFTjc1X1ZGRV9EVzNfSEFMRl9TTElDRV9ESVNBQkxFXzIzCQkJMHgxCisjZGVmaW5lIEdFTjc1X1ZGRV9EVzNfSEFMRl9TTElDRV9ESVNBQkxFXzEyMwkJCTB4MworCisjZGVmaW5lIEdFTjZfVkZFX0RXNF9VUkJfRU5UUllfU0laRV9fTUFTSwkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VONl9WRkVfRFc0X1VSQl9FTlRSWV9TSVpFX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjZfVkZFX0RXNF9DVVJCRV9TSVpFX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VONl9WRkVfRFc0X0NVUkJFX1NJWkVfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU42X1ZGRV9EVzVfU0NPUkVCT0FSRF9FTkFCTEUJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VONl9WRkVfRFc1X1NDT1JFQk9BUkRfVFlQRV9fTUFTSwkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgR0VONl9WRkVfRFc1X1NDT1JFQk9BUkRfVFlQRV9fU0hJRlQJCQkzMAorI2RlZmluZSBHRU42X1ZGRV9EVzVfU0NPUkVCT0FSRF9UWVBFX1NUQUxMSU5HCQkJKDB4MCA8PCAzMCkKKyNkZWZpbmUgR0VONl9WRkVfRFc1X1NDT1JFQk9BUkRfVFlQRV9OT05fU1RBTExJTkcJCSgweDEgPDwgMzApCisjZGVmaW5lIEdFTjZfVkZFX0RXNV9TQ09SRUJPQVJEX01BU0tfX01BU0sJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjZfVkZFX0RXNV9TQ09SRUJPQVJEX01BU0tfX1NISUZUCQkJMAorCisKKworCisjZGVmaW5lIEdFTjhfVkZFX0RXMV9TQ1JBVENIX1NUQUNLX1NJWkVfX01BU0sJCQkweDAwMDAwMGYwCisjZGVmaW5lIEdFTjhfVkZFX0RXMV9TQ1JBVENIX1NUQUNLX1NJWkVfX1NISUZUCQkJNAorI2RlZmluZSBHRU44X1ZGRV9EVzFfU0NSQVRDSF9TUEFDRV9QRVJfVEhSRUFEX19NQVNLCQkweDAwMDAwMDBmCisjZGVmaW5lIEdFTjhfVkZFX0RXMV9TQ1JBVENIX1NQQUNFX1BFUl9USFJFQURfX1NISUZUCQkwCisjZGVmaW5lIEdFTjhfVkZFX0RXMV9TQ1JBVENIX0FERFJfX01BU0sJCQkJMHhmZmZmZmMwMAorI2RlZmluZSBHRU44X1ZGRV9EVzFfU0NSQVRDSF9BRERSX19TSElGVAkJCTEwCisjZGVmaW5lIEdFTjhfVkZFX0RXMV9TQ1JBVENIX0FERFJfX1NIUgkJCQkxMAorCisKKyNkZWZpbmUgR0VOOF9WRkVfRFczX01BWF9USFJFQURTX19NQVNLCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VOOF9WRkVfRFczX01BWF9USFJFQURTX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU44X1ZGRV9EVzNfVVJCX0VOVFJZX0NPVU5UX19NQVNLCQkJMHgwMDAwZmYwMAorI2RlZmluZSBHRU44X1ZGRV9EVzNfVVJCX0VOVFJZX0NPVU5UX19TSElGVAkJCTgKKyNkZWZpbmUgR0VOOF9WRkVfRFczX1JFU0VUX0dBVEVXQVlfVElNRVIJCQkoMHgxIDw8IDcpCisjZGVmaW5lIEdFTjhfVkZFX0RXM19CWVBBU1NfR0FURVdBWV9DT05UUk9MCQkJKDB4MSA8PCA2KQorCisjZGVmaW5lIEdFTjhfVkZFX0RXNF9IQUxGX1NMSUNFX0RJU0FCTEVfX01BU0sJCQkweDAwMDAwMDAzCisjZGVmaW5lIEdFTjhfVkZFX0RXNF9IQUxGX1NMSUNFX0RJU0FCTEVfX1NISUZUCQkJMAorI2RlZmluZSBHRU44X1ZGRV9EVzRfSEFMRl9TTElDRV9ESVNBQkxFX05PTkUJCQkweDAKKyNkZWZpbmUgR0VOOF9WRkVfRFc0X0hBTEZfU0xJQ0VfRElTQUJMRV8yMwkJCTB4MQorI2RlZmluZSBHRU44X1ZGRV9EVzRfSEFMRl9TTElDRV9ESVNBQkxFXzEyMwkJCTB4MworCisjZGVmaW5lIEdFTjhfVkZFX0RXNV9VUkJfRU5UUllfU0laRV9fTUFTSwkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgR0VOOF9WRkVfRFc1X1VSQl9FTlRSWV9TSVpFX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjhfVkZFX0RXNV9DVVJCRV9TSVpFX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgR0VOOF9WRkVfRFc1X0NVUkJFX1NJWkVfX1NISUZUCQkJCTAKKworI2RlZmluZSBHRU44X1ZGRV9EVzZfU0NPUkVCT0FSRF9FTkFCTEUJCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VOOF9WRkVfRFc2X1NDT1JFQk9BUkRfVFlQRV9fTUFTSwkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgR0VOOF9WRkVfRFc2X1NDT1JFQk9BUkRfVFlQRV9fU0hJRlQJCQkzMAorI2RlZmluZSBHRU44X1ZGRV9EVzZfU0NPUkVCT0FSRF9UWVBFX1NUQUxMSU5HCQkJKDB4MCA8PCAzMCkKKyNkZWZpbmUgR0VOOF9WRkVfRFc2X1NDT1JFQk9BUkRfVFlQRV9OT05fU1RBTExJTkcJCSgweDEgPDwgMzApCisjZGVmaW5lIEdFTjhfVkZFX0RXNl9TQ09SRUJPQVJEX01BU0tfX01BU0sJCQkweDAwMDAwMGZmCisjZGVmaW5lIEdFTjhfVkZFX0RXNl9TQ09SRUJPQVJEX01BU0tfX1NISUZUCQkJMAorCisKKyNkZWZpbmUgR0VONl9NRURJQV9DVVJCRV9MT0FEX19TSVpFCQkJCTQKKworCisKKyNkZWZpbmUgR0VONl9DVVJCRV9MT0FEX0RXMl9MRU5fX01BU0sJCQkJMHgwMDAxZmZmZgorI2RlZmluZSBHRU42X0NVUkJFX0xPQURfRFcyX0xFTl9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjZfQ1VSQkVfTE9BRF9EVzNfQUREUl9fTUFTSwkJCQkweGZmZmZmZmUwCisjZGVmaW5lIEdFTjZfQ1VSQkVfTE9BRF9EVzNfQUREUl9fU0hJRlQJCQkJNQorI2RlZmluZSBHRU42X0NVUkJFX0xPQURfRFczX0FERFJfX1NIUgkJCQk1CisKKyNkZWZpbmUgR0VONl9NRURJQV9JTlRFUkZBQ0VfREVTQ1JJUFRPUl9MT0FEX19TSVpFCQk0CisKKworCisjZGVmaW5lIEdFTjZfSURSVF9MT0FEX0RXMl9MRU5fX01BU0sJCQkJMHgwMDAxZmZmZgorI2RlZmluZSBHRU42X0lEUlRfTE9BRF9EVzJfTEVOX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VONl9JRFJUX0xPQURfRFczX0FERFJfX01BU0sJCQkJMHhmZmZmZmZlMAorI2RlZmluZSBHRU42X0lEUlRfTE9BRF9EVzNfQUREUl9fU0hJRlQJCQkJNQorI2RlZmluZSBHRU42X0lEUlRfTE9BRF9EVzNfQUREUl9fU0hSCQkJCTUKKworI2RlZmluZSBHRU42X01FRElBX1NUQVRFX0ZMVVNIX19TSVpFCQkJCTIKKworCisjZGVmaW5lIEdFTjZfTUVESUFfRkxVU0hfRFcxX1RIUkVBRF9DT1VOVF9XQVRFUk1BUktfX01BU0sJMHgwMGZmMDAwMAorI2RlZmluZSBHRU42X01FRElBX0ZMVVNIX0RXMV9USFJFQURfQ09VTlRfV0FURVJNQVJLX19TSElGVAkxNgorI2RlZmluZSBHRU42X01FRElBX0ZMVVNIX0RXMV9CQVJSSUVSX01BU0tfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIEdFTjZfTUVESUFfRkxVU0hfRFcxX0JBUlJJRVJfTUFTS19fU0hJRlQJCTAKKworI2RlZmluZSBHRU43X01FRElBX0ZMVVNIX0RXMV9ESVNBQkxFX1BSRUVNUFRJT04JCQkoMHgxIDw8IDgpCisjZGVmaW5lIEdFTjc1X01FRElBX0ZMVVNIX0RXMV9GTFVTSF9UT19HTwkJCSgweDEgPDwgNykKKyNkZWZpbmUgR0VON19NRURJQV9GTFVTSF9EVzFfV0FURVJNQVJLX1JFUVVJUkVECQkJKDB4MSA8PCA2KQorI2RlZmluZSBHRU43X01FRElBX0ZMVVNIX0RXMV9JRFJUX09GRlNFVF9fTUFTSwkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgR0VON19NRURJQV9GTFVTSF9EVzFfSURSVF9PRkZTRVRfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjdfR1BHUFVfV0FMS0VSX19TSVpFCQkJCQkxNQorCisjZGVmaW5lIEdFTjdfR1BHUFVfRFcwX0lORElSRUNUX1BBUkFNX0VOQUJMRQkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjdfR1BHUFVfRFcwX1BSRURJQ0FURV9FTkFCTEUJCQkJKDB4MSA8PCA4KQorCisjZGVmaW5lIEdFTjdfR1BHUFVfRFcxX0lEUlRfT0ZGU0VUX19NQVNLCQkJMHgwMDAwMDAzZgorI2RlZmluZSBHRU43X0dQR1BVX0RXMV9JRFJUX09GRlNFVF9fU0hJRlQJCQkwCisKKyNkZWZpbmUgR0VON19HUEdQVV9EVzJfU0lNRF9TSVpFX19NQVNLCQkJCTB4YzAwMDAwMDAKKyNkZWZpbmUgR0VON19HUEdQVV9EVzJfU0lNRF9TSVpFX19TSElGVAkJCQkzMAorI2RlZmluZSBHRU43X0dQR1BVX0RXMl9TSU1EX1NJWkVfU0lNRDgJCQkJKDB4MCA8PCAzMCkKKyNkZWZpbmUgR0VON19HUEdQVV9EVzJfU0lNRF9TSVpFX1NJTUQxNgkJCQkoMHgxIDw8IDMwKQorI2RlZmluZSBHRU43X0dQR1BVX0RXMl9TSU1EX1NJWkVfU0lNRDMyCQkJCSgweDIgPDwgMzApCisjZGVmaW5lIEdFTjdfR1BHUFVfRFcyX1RIUkVBRF9NQVhfWl9fTUFTSwkJCTB4MDAzZjAwMDAKKyNkZWZpbmUgR0VON19HUEdQVV9EVzJfVEhSRUFEX01BWF9aX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjdfR1BHUFVfRFcyX1RIUkVBRF9NQVhfWV9fTUFTSwkJCTB4MDAwMDNmMDAKKyNkZWZpbmUgR0VON19HUEdQVV9EVzJfVEhSRUFEX01BWF9ZX19TSElGVAkJCTgKKyNkZWZpbmUgR0VON19HUEdQVV9EVzJfVEhSRUFEX01BWF9YX19NQVNLCQkJMHgwMDAwMDAzZgorI2RlZmluZSBHRU43X0dQR1BVX0RXMl9USFJFQURfTUFYX1hfX1NISUZUCQkJMAorCisKKworCisKKworCisKKworCisjZGVmaW5lIEdFTjhfR1BHUFVfRFcwX0lORElSRUNUX1BBUkFNX0VOQUJMRQkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjhfR1BHUFVfRFcwX1BSRURJQ0FURV9FTkFCTEUJCQkJKDB4MSA8PCA4KQorCisjZGVmaW5lIEdFTjhfR1BHUFVfRFcxX0lEUlRfT0ZGU0VUX19NQVNLCQkJMHgwMDAwMDAzZgorI2RlZmluZSBHRU44X0dQR1BVX0RXMV9JRFJUX09GRlNFVF9fU0hJRlQJCQkwCisKKworI2RlZmluZSBHRU44X0dQR1BVX0RXM19JTkRJUkVDVF9BRERSX19NQVNLCQkJMHhmZmZmZmZlMAorI2RlZmluZSBHRU44X0dQR1BVX0RXM19JTkRJUkVDVF9BRERSX19TSElGVAkJCTUKKyNkZWZpbmUgR0VOOF9HUEdQVV9EVzNfSU5ESVJFQ1RfQUREUl9fU0hSCQkJNQorCisjZGVmaW5lIEdFTjhfR1BHUFVfRFc0X1NJTURfU0laRV9fTUFTSwkJCQkweGMwMDAwMDAwCisjZGVmaW5lIEdFTjhfR1BHUFVfRFc0X1NJTURfU0laRV9fU0hJRlQJCQkJMzAKKyNkZWZpbmUgR0VOOF9HUEdQVV9EVzRfU0lNRF9TSVpFX1NJTUQ4CQkJCSgweDAgPDwgMzApCisjZGVmaW5lIEdFTjhfR1BHUFVfRFc0X1NJTURfU0laRV9TSU1EMTYJCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR0VOOF9HUEdQVV9EVzRfU0lNRF9TSVpFX1NJTUQzMgkJCQkoMHgyIDw8IDMwKQorI2RlZmluZSBHRU44X0dQR1BVX0RXNF9USFJFQURfTUFYX1pfX01BU0sJCQkweDAwM2YwMDAwCisjZGVmaW5lIEdFTjhfR1BHUFVfRFc0X1RIUkVBRF9NQVhfWl9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU44X0dQR1BVX0RXNF9USFJFQURfTUFYX1lfX01BU0sJCQkweDAwMDAzZjAwCisjZGVmaW5lIEdFTjhfR1BHUFVfRFc0X1RIUkVBRF9NQVhfWV9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjhfR1BHUFVfRFc0X1RIUkVBRF9NQVhfWF9fTUFTSwkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgR0VOOF9HUEdQVV9EVzRfVEhSRUFEX01BWF9YX19TSElGVAkJCTAKKworCisKKworCisKKworCisKKworCisKKyNlbmRpZiAvKiBHRU5fUkVOREVSX01FRElBX1hNTCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2dlbmh3L2dlbl9yZW5kZXJfc3VyZmFjZS54bWwuaCBiL2ljZC9pbnRlbC9nZW5ody9nZW5fcmVuZGVyX3N1cmZhY2UueG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyMzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9nZW5ody9nZW5fcmVuZGVyX3N1cmZhY2UueG1sLmgKQEAgLTAsMCArMSw1MTggQEAKKyNpZm5kZWYgR0VOX1JFTkRFUl9TVVJGQUNFX1hNTAorI2RlZmluZSBHRU5fUkVOREVSX1NVUkZBQ0VfWE1MCisKKy8qIEF1dG9nZW5lcmF0ZWQgZmlsZSwgRE8gTk9UIEVESVQgbWFudWFsbHkhCisKK1RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBydWxlcy1uZy1uZyBoZWFkZXJnZW4gdG9vbCBpbiB0aGlzIGdpdCByZXBvc2l0b3J5OgoraHR0cHM6Ly9naXRodWIuY29tL29sdmFmZmUvZW52eXRvb2xzLworZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9vbHZhZmZlL2Vudnl0b29scy5naXQKKworQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgYnkgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorLSBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPiAob2x2KQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKK25leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCitwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCitlbnVtIGdlbl9zdXJmYWNlX2Zvcm1hdCB7CisgICAgR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX0ZMT0FUCQkJICAgICAgPSAweDAsCisgICAgR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX1NJTlQJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfVUlOVAkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9VTk9STQkJCSAgICAgID0gMHgzLAorICAgIEdFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9TTk9STQkJCSAgICAgID0gMHg0LAorICAgIEdFTjZfRk9STUFUX1I2NEc2NF9GTE9BVAkJCQkgICAgICA9IDB4NSwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJCMzJYMzJfRkxPQVQJCQkgICAgICA9IDB4NiwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJCMzJBMzJfU1NDQUxFRAkJCSAgICAgID0gMHg3LAorICAgIEdFTjZfRk9STUFUX1IzMkczMkIzMkEzMl9VU0NBTEVECQkJICAgICAgPSAweDgsCisgICAgR0VONl9GT1JNQVRfUjMyRzMyQjMyQTMyX1NGSVhFRAkJCSAgICAgID0gMHgyMCwKKyAgICBHRU42X0ZPUk1BVF9SNjRHNjRfUEFTU1RIUlUJCQkJICAgICAgPSAweDIxLAorICAgIEdFTjZfRk9STUFUX1IzMkczMkIzMl9GTE9BVAkJCQkgICAgICA9IDB4NDAsCisgICAgR0VONl9GT1JNQVRfUjMyRzMyQjMyX1NJTlQJCQkJICAgICAgPSAweDQxLAorICAgIEdFTjZfRk9STUFUX1IzMkczMkIzMl9VSU5UCQkJCSAgICAgID0gMHg0MiwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJCMzJfVU5PUk0JCQkJICAgICAgPSAweDQzLAorICAgIEdFTjZfRk9STUFUX1IzMkczMkIzMl9TTk9STQkJCQkgICAgICA9IDB4NDQsCisgICAgR0VONl9GT1JNQVRfUjMyRzMyQjMyX1NTQ0FMRUQJCQkgICAgICA9IDB4NDUsCisgICAgR0VONl9GT1JNQVRfUjMyRzMyQjMyX1VTQ0FMRUQJCQkgICAgICA9IDB4NDYsCisgICAgR0VONl9GT1JNQVRfUjMyRzMyQjMyX1NGSVhFRAkJCSAgICAgID0gMHg1MCwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZCMTZBMTZfVU5PUk0JCQkgICAgICA9IDB4ODAsCisgICAgR0VONl9GT1JNQVRfUjE2RzE2QjE2QTE2X1NOT1JNCQkJICAgICAgPSAweDgxLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UCQkJICAgICAgPSAweDgyLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9VSU5UCQkJICAgICAgPSAweDgzLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVAkJCSAgICAgID0gMHg4NCwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJfRkxPQVQJCQkJICAgICAgPSAweDg1LAorICAgIEdFTjZfRk9STUFUX1IzMkczMl9TSU5UCQkJCSAgICAgID0gMHg4NiwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJfVUlOVAkJCQkgICAgICA9IDB4ODcsCisgICAgR0VONl9GT1JNQVRfUjMyX0ZMT0FUX1g4WDI0X1RZUEVMRVNTCQkgICAgICA9IDB4ODgsCisgICAgR0VONl9GT1JNQVRfWDMyX1RZUEVMRVNTX0c4WDI0X1VJTlQJCQkgICAgICA9IDB4ODksCisgICAgR0VONl9GT1JNQVRfTDMyQTMyX0ZMT0FUCQkJCSAgICAgID0gMHg4YSwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJfVU5PUk0JCQkJICAgICAgPSAweDhiLAorICAgIEdFTjZfRk9STUFUX1IzMkczMl9TTk9STQkJCQkgICAgICA9IDB4OGMsCisgICAgR0VONl9GT1JNQVRfUjY0X0ZMT0FUCQkJCSAgICAgID0gMHg4ZCwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZCMTZYMTZfVU5PUk0JCQkgICAgICA9IDB4OGUsCisgICAgR0VONl9GT1JNQVRfUjE2RzE2QjE2WDE2X0ZMT0FUCQkJICAgICAgPSAweDhmLAorICAgIEdFTjZfRk9STUFUX0EzMlgzMl9GTE9BVAkJCQkgICAgICA9IDB4OTAsCisgICAgR0VONl9GT1JNQVRfTDMyWDMyX0ZMT0FUCQkJCSAgICAgID0gMHg5MSwKKyAgICBHRU42X0ZPUk1BVF9JMzJYMzJfRkxPQVQJCQkJICAgICAgPSAweDkyLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9TU0NBTEVECQkJICAgICAgPSAweDkzLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNkIxNkExNl9VU0NBTEVECQkJICAgICAgPSAweDk0LAorICAgIEdFTjZfRk9STUFUX1IzMkczMl9TU0NBTEVECQkJCSAgICAgID0gMHg5NSwKKyAgICBHRU42X0ZPUk1BVF9SMzJHMzJfVVNDQUxFRAkJCQkgICAgICA9IDB4OTYsCisgICAgR0VONl9GT1JNQVRfUjMyRzMyX1NGSVhFRAkJCQkgICAgICA9IDB4YTAsCisgICAgR0VONl9GT1JNQVRfUjY0X1BBU1NUSFJVCQkJCSAgICAgID0gMHhhMSwKKyAgICBHRU42X0ZPUk1BVF9COEc4UjhBOF9VTk9STQkJCQkgICAgICA9IDB4YzAsCisgICAgR0VONl9GT1JNQVRfQjhHOFI4QThfVU5PUk1fU1JHQgkJCSAgICAgID0gMHhjMSwKKyAgICBHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STQkJCSAgICAgID0gMHhjMiwKKyAgICBHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STV9TUkdCCQkJICAgICAgPSAweGMzLAorICAgIEdFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1VJTlQJCQkgICAgICA9IDB4YzQsCisgICAgR0VONl9GT1JNQVRfUjEwRzEwQjEwX1NOT1JNX0EyX1VOT1JNCQkgICAgICA9IDB4YzUsCisgICAgR0VONl9GT1JNQVRfUjhHOEI4QThfVU5PUk0JCQkJICAgICAgPSAweGM3LAorICAgIEdFTjZfRk9STUFUX1I4RzhCOEE4X1VOT1JNX1NSR0IJCQkgICAgICA9IDB4YzgsCisgICAgR0VONl9GT1JNQVRfUjhHOEI4QThfU05PUk0JCQkJICAgICAgPSAweGM5LAorICAgIEdFTjZfRk9STUFUX1I4RzhCOEE4X1NJTlQJCQkJICAgICAgPSAweGNhLAorICAgIEdFTjZfRk9STUFUX1I4RzhCOEE4X1VJTlQJCQkJICAgICAgPSAweGNiLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNl9VTk9STQkJCQkgICAgICA9IDB4Y2MsCisgICAgR0VONl9GT1JNQVRfUjE2RzE2X1NOT1JNCQkJCSAgICAgID0gMHhjZCwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZfU0lOVAkJCQkgICAgICA9IDB4Y2UsCisgICAgR0VONl9GT1JNQVRfUjE2RzE2X1VJTlQJCQkJICAgICAgPSAweGNmLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNl9GTE9BVAkJCQkgICAgICA9IDB4ZDAsCisgICAgR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfVU5PUk0JCQkgICAgICA9IDB4ZDEsCisgICAgR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfVU5PUk1fU1JHQgkJCSAgICAgID0gMHhkMiwKKyAgICBHRU42X0ZPUk1BVF9SMTFHMTFCMTBfRkxPQVQJCQkJICAgICAgPSAweGQzLAorICAgIEdFTjZfRk9STUFUX1IzMl9TSU5UCQkJCSAgICAgID0gMHhkNiwKKyAgICBHRU42X0ZPUk1BVF9SMzJfVUlOVAkJCQkgICAgICA9IDB4ZDcsCisgICAgR0VONl9GT1JNQVRfUjMyX0ZMT0FUCQkJCSAgICAgID0gMHhkOCwKKyAgICBHRU42X0ZPUk1BVF9SMjRfVU5PUk1fWDhfVFlQRUxFU1MJCQkgICAgICA9IDB4ZDksCisgICAgR0VONl9GT1JNQVRfWDI0X1RZUEVMRVNTX0c4X1VJTlQJCQkgICAgICA9IDB4ZGEsCisgICAgR0VONl9GT1JNQVRfTDMyX1VOT1JNCQkJCSAgICAgID0gMHhkZCwKKyAgICBHRU42X0ZPUk1BVF9BMzJfVU5PUk0JCQkJICAgICAgPSAweGRlLAorICAgIEdFTjZfRk9STUFUX0wxNkExNl9VTk9STQkJCQkgICAgICA9IDB4ZGYsCisgICAgR0VONl9GT1JNQVRfSTI0WDhfVU5PUk0JCQkJICAgICAgPSAweGUwLAorICAgIEdFTjZfRk9STUFUX0wyNFg4X1VOT1JNCQkJCSAgICAgID0gMHhlMSwKKyAgICBHRU42X0ZPUk1BVF9BMjRYOF9VTk9STQkJCQkgICAgICA9IDB4ZTIsCisgICAgR0VONl9GT1JNQVRfSTMyX0ZMT0FUCQkJCSAgICAgID0gMHhlMywKKyAgICBHRU42X0ZPUk1BVF9MMzJfRkxPQVQJCQkJICAgICAgPSAweGU0LAorICAgIEdFTjZfRk9STUFUX0EzMl9GTE9BVAkJCQkgICAgICA9IDB4ZTUsCisgICAgR0VONl9GT1JNQVRfWDhCOF9VTk9STV9HOFI4X1NOT1JNCQkJICAgICAgPSAweGU2LAorICAgIEdFTjZfRk9STUFUX0E4WDhfVU5PUk1fRzhSOF9TTk9STQkJCSAgICAgID0gMHhlNywKKyAgICBHRU42X0ZPUk1BVF9COFg4X1VOT1JNX0c4UjhfU05PUk0JCQkgICAgICA9IDB4ZTgsCisgICAgR0VONl9GT1JNQVRfQjhHOFI4WDhfVU5PUk0JCQkJICAgICAgPSAweGU5LAorICAgIEdFTjZfRk9STUFUX0I4RzhSOFg4X1VOT1JNX1NSR0IJCQkgICAgICA9IDB4ZWEsCisgICAgR0VONl9GT1JNQVRfUjhHOEI4WDhfVU5PUk0JCQkJICAgICAgPSAweGViLAorICAgIEdFTjZfRk9STUFUX1I4RzhCOFg4X1VOT1JNX1NSR0IJCQkgICAgICA9IDB4ZWMsCisgICAgR0VONl9GT1JNQVRfUjlHOUI5RTVfU0hBUkVERVhQCQkJICAgICAgPSAweGVkLAorICAgIEdFTjZfRk9STUFUX0IxMEcxMFIxMFgyX1VOT1JNCQkJICAgICAgPSAweGVlLAorICAgIEdFTjZfRk9STUFUX0wxNkExNl9GTE9BVAkJCQkgICAgICA9IDB4ZjAsCisgICAgR0VONl9GT1JNQVRfUjMyX1VOT1JNCQkJCSAgICAgID0gMHhmMSwKKyAgICBHRU42X0ZPUk1BVF9SMzJfU05PUk0JCQkJICAgICAgPSAweGYyLAorICAgIEdFTjZfRk9STUFUX1IxMEcxMEIxMFgyX1VTQ0FMRUQJCQkgICAgICA9IDB4ZjMsCisgICAgR0VONl9GT1JNQVRfUjhHOEI4QThfU1NDQUxFRAkJCSAgICAgID0gMHhmNCwKKyAgICBHRU42X0ZPUk1BVF9SOEc4QjhBOF9VU0NBTEVECQkJICAgICAgPSAweGY1LAorICAgIEdFTjZfRk9STUFUX1IxNkcxNl9TU0NBTEVECQkJCSAgICAgID0gMHhmNiwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZfVVNDQUxFRAkJCQkgICAgICA9IDB4ZjcsCisgICAgR0VONl9GT1JNQVRfUjMyX1NTQ0FMRUQJCQkJICAgICAgPSAweGY4LAorICAgIEdFTjZfRk9STUFUX1IzMl9VU0NBTEVECQkJCSAgICAgID0gMHhmOSwKKyAgICBHRU42X0ZPUk1BVF9CNUc2UjVfVU5PUk0JCQkJICAgICAgPSAweDEwMCwKKyAgICBHRU42X0ZPUk1BVF9CNUc2UjVfVU5PUk1fU1JHQgkJCSAgICAgID0gMHgxMDEsCisgICAgR0VONl9GT1JNQVRfQjVHNVI1QTFfVU5PUk0JCQkJICAgICAgPSAweDEwMiwKKyAgICBHRU42X0ZPUk1BVF9CNUc1UjVBMV9VTk9STV9TUkdCCQkJICAgICAgPSAweDEwMywKKyAgICBHRU42X0ZPUk1BVF9CNEc0UjRBNF9VTk9STQkJCQkgICAgICA9IDB4MTA0LAorICAgIEdFTjZfRk9STUFUX0I0RzRSNEE0X1VOT1JNX1NSR0IJCQkgICAgICA9IDB4MTA1LAorICAgIEdFTjZfRk9STUFUX1I4RzhfVU5PUk0JCQkJICAgICAgPSAweDEwNiwKKyAgICBHRU42X0ZPUk1BVF9SOEc4X1NOT1JNCQkJCSAgICAgID0gMHgxMDcsCisgICAgR0VONl9GT1JNQVRfUjhHOF9TSU5UCQkJCSAgICAgID0gMHgxMDgsCisgICAgR0VONl9GT1JNQVRfUjhHOF9VSU5UCQkJCSAgICAgID0gMHgxMDksCisgICAgR0VONl9GT1JNQVRfUjE2X1VOT1JNCQkJCSAgICAgID0gMHgxMGEsCisgICAgR0VONl9GT1JNQVRfUjE2X1NOT1JNCQkJCSAgICAgID0gMHgxMGIsCisgICAgR0VONl9GT1JNQVRfUjE2X1NJTlQJCQkJICAgICAgPSAweDEwYywKKyAgICBHRU42X0ZPUk1BVF9SMTZfVUlOVAkJCQkgICAgICA9IDB4MTBkLAorICAgIEdFTjZfRk9STUFUX1IxNl9GTE9BVAkJCQkgICAgICA9IDB4MTBlLAorICAgIEdFTjZfRk9STUFUX0E4UDhfVU5PUk1fUEFMRVRURTAJCQkgICAgICA9IDB4MTBmLAorICAgIEdFTjZfRk9STUFUX0E4UDhfVU5PUk1fUEFMRVRURTEJCQkgICAgICA9IDB4MTEwLAorICAgIEdFTjZfRk9STUFUX0kxNl9VTk9STQkJCQkgICAgICA9IDB4MTExLAorICAgIEdFTjZfRk9STUFUX0wxNl9VTk9STQkJCQkgICAgICA9IDB4MTEyLAorICAgIEdFTjZfRk9STUFUX0ExNl9VTk9STQkJCQkgICAgICA9IDB4MTEzLAorICAgIEdFTjZfRk9STUFUX0w4QThfVU5PUk0JCQkJICAgICAgPSAweDExNCwKKyAgICBHRU42X0ZPUk1BVF9JMTZfRkxPQVQJCQkJICAgICAgPSAweDExNSwKKyAgICBHRU42X0ZPUk1BVF9MMTZfRkxPQVQJCQkJICAgICAgPSAweDExNiwKKyAgICBHRU42X0ZPUk1BVF9BMTZfRkxPQVQJCQkJICAgICAgPSAweDExNywKKyAgICBHRU42X0ZPUk1BVF9MOEE4X1VOT1JNX1NSR0IJCQkJICAgICAgPSAweDExOCwKKyAgICBHRU42X0ZPUk1BVF9SNUc1X1NOT1JNX0I2X1VOT1JNCQkJICAgICAgPSAweDExOSwKKyAgICBHRU42X0ZPUk1BVF9CNUc1UjVYMV9VTk9STQkJCQkgICAgICA9IDB4MTFhLAorICAgIEdFTjZfRk9STUFUX0I1RzVSNVgxX1VOT1JNX1NSR0IJCQkgICAgICA9IDB4MTFiLAorICAgIEdFTjZfRk9STUFUX1I4RzhfU1NDQUxFRAkJCQkgICAgICA9IDB4MTFjLAorICAgIEdFTjZfRk9STUFUX1I4RzhfVVNDQUxFRAkJCQkgICAgICA9IDB4MTFkLAorICAgIEdFTjZfRk9STUFUX1IxNl9TU0NBTEVECQkJCSAgICAgID0gMHgxMWUsCisgICAgR0VONl9GT1JNQVRfUjE2X1VTQ0FMRUQJCQkJICAgICAgPSAweDExZiwKKyAgICBHRU42X0ZPUk1BVF9QOEE4X1VOT1JNX1BBTEVUVEUwCQkJICAgICAgPSAweDEyMiwKKyAgICBHRU42X0ZPUk1BVF9QOEE4X1VOT1JNX1BBTEVUVEUxCQkJICAgICAgPSAweDEyMywKKyAgICBHRU42X0ZPUk1BVF9BMUI1RzVSNV9VTk9STQkJCQkgICAgICA9IDB4MTI0LAorICAgIEdFTjZfRk9STUFUX0E0QjRHNFI0X1VOT1JNCQkJCSAgICAgID0gMHgxMjUsCisgICAgR0VONl9GT1JNQVRfTDhBOF9VSU5UCQkJCSAgICAgID0gMHgxMjYsCisgICAgR0VONl9GT1JNQVRfTDhBOF9TSU5UCQkJCSAgICAgID0gMHgxMjcsCisgICAgR0VONl9GT1JNQVRfUjhfVU5PUk0JCQkJICAgICAgPSAweDE0MCwKKyAgICBHRU42X0ZPUk1BVF9SOF9TTk9STQkJCQkgICAgICA9IDB4MTQxLAorICAgIEdFTjZfRk9STUFUX1I4X1NJTlQJCQkJCSAgICAgID0gMHgxNDIsCisgICAgR0VONl9GT1JNQVRfUjhfVUlOVAkJCQkJICAgICAgPSAweDE0MywKKyAgICBHRU42X0ZPUk1BVF9BOF9VTk9STQkJCQkgICAgICA9IDB4MTQ0LAorICAgIEdFTjZfRk9STUFUX0k4X1VOT1JNCQkJCSAgICAgID0gMHgxNDUsCisgICAgR0VONl9GT1JNQVRfTDhfVU5PUk0JCQkJICAgICAgPSAweDE0NiwKKyAgICBHRU42X0ZPUk1BVF9QNEE0X1VOT1JNX1BBTEVUVEUwCQkJICAgICAgPSAweDE0NywKKyAgICBHRU42X0ZPUk1BVF9BNFA0X1VOT1JNX1BBTEVUVEUwCQkJICAgICAgPSAweDE0OCwKKyAgICBHRU42X0ZPUk1BVF9SOF9TU0NBTEVECQkJCSAgICAgID0gMHgxNDksCisgICAgR0VONl9GT1JNQVRfUjhfVVNDQUxFRAkJCQkgICAgICA9IDB4MTRhLAorICAgIEdFTjZfRk9STUFUX1A4X1VOT1JNX1BBTEVUVEUwCQkJICAgICAgPSAweDE0YiwKKyAgICBHRU42X0ZPUk1BVF9MOF9VTk9STV9TUkdCCQkJCSAgICAgID0gMHgxNGMsCisgICAgR0VONl9GT1JNQVRfUDhfVU5PUk1fUEFMRVRURTEJCQkgICAgICA9IDB4MTRkLAorICAgIEdFTjZfRk9STUFUX1A0QTRfVU5PUk1fUEFMRVRURTEJCQkgICAgICA9IDB4MTRlLAorICAgIEdFTjZfRk9STUFUX0E0UDRfVU5PUk1fUEFMRVRURTEJCQkgICAgICA9IDB4MTRmLAorICAgIEdFTjZfRk9STUFUX1k4X1VOT1JNCQkJCSAgICAgID0gMHgxNTAsCisgICAgR0VONl9GT1JNQVRfTDhfVUlOVAkJCQkJICAgICAgPSAweDE1MiwKKyAgICBHRU42X0ZPUk1BVF9MOF9TSU5UCQkJCQkgICAgICA9IDB4MTUzLAorICAgIEdFTjZfRk9STUFUX0k4X1VJTlQJCQkJCSAgICAgID0gMHgxNTQsCisgICAgR0VONl9GT1JNQVRfSThfU0lOVAkJCQkJICAgICAgPSAweDE1NSwKKyAgICBHRU42X0ZPUk1BVF9EWFQxX1JHQl9TUkdCCQkJCSAgICAgID0gMHgxODAsCisgICAgR0VONl9GT1JNQVRfUjFfVU5PUk0JCQkJICAgICAgPSAweDE4MSwKKyAgICBHRU42X0ZPUk1BVF9ZQ1JDQl9OT1JNQUwJCQkJICAgICAgPSAweDE4MiwKKyAgICBHRU42X0ZPUk1BVF9ZQ1JDQl9TV0FQVVZZCQkJCSAgICAgID0gMHgxODMsCisgICAgR0VONl9GT1JNQVRfUDJfVU5PUk1fUEFMRVRURTAJCQkgICAgICA9IDB4MTg0LAorICAgIEdFTjZfRk9STUFUX1AyX1VOT1JNX1BBTEVUVEUxCQkJICAgICAgPSAweDE4NSwKKyAgICBHRU42X0ZPUk1BVF9CQzFfVU5PUk0JCQkJICAgICAgPSAweDE4NiwKKyAgICBHRU42X0ZPUk1BVF9CQzJfVU5PUk0JCQkJICAgICAgPSAweDE4NywKKyAgICBHRU42X0ZPUk1BVF9CQzNfVU5PUk0JCQkJICAgICAgPSAweDE4OCwKKyAgICBHRU42X0ZPUk1BVF9CQzRfVU5PUk0JCQkJICAgICAgPSAweDE4OSwKKyAgICBHRU42X0ZPUk1BVF9CQzVfVU5PUk0JCQkJICAgICAgPSAweDE4YSwKKyAgICBHRU42X0ZPUk1BVF9CQzFfVU5PUk1fU1JHQgkJCQkgICAgICA9IDB4MThiLAorICAgIEdFTjZfRk9STUFUX0JDMl9VTk9STV9TUkdCCQkJCSAgICAgID0gMHgxOGMsCisgICAgR0VONl9GT1JNQVRfQkMzX1VOT1JNX1NSR0IJCQkJICAgICAgPSAweDE4ZCwKKyAgICBHRU42X0ZPUk1BVF9NT05POAkJCQkJICAgICAgPSAweDE4ZSwKKyAgICBHRU42X0ZPUk1BVF9ZQ1JDQl9TV0FQVVYJCQkJICAgICAgPSAweDE4ZiwKKyAgICBHRU42X0ZPUk1BVF9ZQ1JDQl9TV0FQWQkJCQkgICAgICA9IDB4MTkwLAorICAgIEdFTjZfRk9STUFUX0RYVDFfUkdCCQkJCSAgICAgID0gMHgxOTEsCisgICAgR0VONl9GT1JNQVRfRlhUMQkJCQkJICAgICAgPSAweDE5MiwKKyAgICBHRU42X0ZPUk1BVF9SOEc4QjhfVU5PUk0JCQkJICAgICAgPSAweDE5MywKKyAgICBHRU42X0ZPUk1BVF9SOEc4QjhfU05PUk0JCQkJICAgICAgPSAweDE5NCwKKyAgICBHRU42X0ZPUk1BVF9SOEc4QjhfU1NDQUxFRAkJCQkgICAgICA9IDB4MTk1LAorICAgIEdFTjZfRk9STUFUX1I4RzhCOF9VU0NBTEVECQkJCSAgICAgID0gMHgxOTYsCisgICAgR0VONl9GT1JNQVRfUjY0RzY0QjY0QTY0X0ZMT0FUCQkJICAgICAgPSAweDE5NywKKyAgICBHRU42X0ZPUk1BVF9SNjRHNjRCNjRfRkxPQVQJCQkJICAgICAgPSAweDE5OCwKKyAgICBHRU42X0ZPUk1BVF9CQzRfU05PUk0JCQkJICAgICAgPSAweDE5OSwKKyAgICBHRU42X0ZPUk1BVF9CQzVfU05PUk0JCQkJICAgICAgPSAweDE5YSwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZCMTZfRkxPQVQJCQkJICAgICAgPSAweDE5YiwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZCMTZfVU5PUk0JCQkJICAgICAgPSAweDE5YywKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZCMTZfU05PUk0JCQkJICAgICAgPSAweDE5ZCwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZCMTZfU1NDQUxFRAkJCSAgICAgID0gMHgxOWUsCisgICAgR0VONl9GT1JNQVRfUjE2RzE2QjE2X1VTQ0FMRUQJCQkgICAgICA9IDB4MTlmLAorICAgIEdFTjZfRk9STUFUX0JDNkhfU0YxNgkJCQkgICAgICA9IDB4MWExLAorICAgIEdFTjZfRk9STUFUX0JDN19VTk9STQkJCQkgICAgICA9IDB4MWEyLAorICAgIEdFTjZfRk9STUFUX0JDN19VTk9STV9TUkdCCQkJCSAgICAgID0gMHgxYTMsCisgICAgR0VONl9GT1JNQVRfQkM2SF9VRjE2CQkJCSAgICAgID0gMHgxYTQsCisgICAgR0VONl9GT1JNQVRfUExBTkFSXzQyMF84CQkJCSAgICAgID0gMHgxYTUsCisgICAgR0VONl9GT1JNQVRfUjhHOEI4X1VOT1JNX1NSR0IJCQkgICAgICA9IDB4MWE4LAorICAgIEdFTjZfRk9STUFUX0VUQzFfUkdCOAkJCQkgICAgICA9IDB4MWE5LAorICAgIEdFTjZfRk9STUFUX0VUQzJfUkdCOAkJCQkgICAgICA9IDB4MWFhLAorICAgIEdFTjZfRk9STUFUX0VBQ19SMTEJCQkJCSAgICAgID0gMHgxYWIsCisgICAgR0VONl9GT1JNQVRfRUFDX1JHMTEJCQkJICAgICAgPSAweDFhYywKKyAgICBHRU42X0ZPUk1BVF9FQUNfU0lHTkVEX1IxMQkJCQkgICAgICA9IDB4MWFkLAorICAgIEdFTjZfRk9STUFUX0VBQ19TSUdORURfUkcxMQkJCQkgICAgICA9IDB4MWFlLAorICAgIEdFTjZfRk9STUFUX0VUQzJfU1JHQjgJCQkJICAgICAgPSAweDFhZiwKKyAgICBHRU42X0ZPUk1BVF9SMTZHMTZCMTZfVUlOVAkJCQkgICAgICA9IDB4MWIwLAorICAgIEdFTjZfRk9STUFUX1IxNkcxNkIxNl9TSU5UCQkJCSAgICAgID0gMHgxYjEsCisgICAgR0VONl9GT1JNQVRfUjMyX1NGSVhFRAkJCQkgICAgICA9IDB4MWIyLAorICAgIEdFTjZfRk9STUFUX1IxMEcxMEIxMEEyX1NOT1JNCQkJICAgICAgPSAweDFiMywKKyAgICBHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9VU0NBTEVECQkJICAgICAgPSAweDFiNCwKKyAgICBHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9TU0NBTEVECQkJICAgICAgPSAweDFiNSwKKyAgICBHRU42X0ZPUk1BVF9SMTBHMTBCMTBBMl9TSU5UCQkJICAgICAgPSAweDFiNiwKKyAgICBHRU42X0ZPUk1BVF9CMTBHMTBSMTBBMl9TTk9STQkJCSAgICAgID0gMHgxYjcsCisgICAgR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfVVNDQUxFRAkJCSAgICAgID0gMHgxYjgsCisgICAgR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfU1NDQUxFRAkJCSAgICAgID0gMHgxYjksCisgICAgR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfVUlOVAkJCSAgICAgID0gMHgxYmEsCisgICAgR0VONl9GT1JNQVRfQjEwRzEwUjEwQTJfU0lOVAkJCSAgICAgID0gMHgxYmIsCisgICAgR0VONl9GT1JNQVRfUjY0RzY0QjY0QTY0X1BBU1NUSFJVCQkJICAgICAgPSAweDFiYywKKyAgICBHRU42X0ZPUk1BVF9SNjRHNjRCNjRfUEFTU1RIUlUJCQkgICAgICA9IDB4MWJkLAorICAgIEdFTjZfRk9STUFUX0VUQzJfUkdCOF9QVEEJCQkJICAgICAgPSAweDFjMCwKKyAgICBHRU42X0ZPUk1BVF9FVEMyX1NSR0I4X1BUQQkJCQkgICAgICA9IDB4MWMxLAorICAgIEdFTjZfRk9STUFUX0VUQzJfRUFDX1JHQkE4CQkJCSAgICAgID0gMHgxYzIsCisgICAgR0VONl9GT1JNQVRfRVRDMl9FQUNfU1JHQjhfQTgJCQkgICAgICA9IDB4MWMzLAorICAgIEdFTjZfRk9STUFUX1I4RzhCOF9VSU5UCQkJCSAgICAgID0gMHgxYzgsCisgICAgR0VONl9GT1JNQVRfUjhHOEI4X1NJTlQJCQkJICAgICAgPSAweDFjOSwKKyAgICBHRU42X0ZPUk1BVF9SQVcJCQkJCSAgICAgID0gMHgxZmYsCit9OworCitlbnVtIGdlbl9zdXJmYWNlX3R5cGUgeworICAgIEdFTjZfU1VSRlRZUEVfMUQJCQkJCSAgICAgID0gMHgwLAorICAgIEdFTjZfU1VSRlRZUEVfMkQJCQkJCSAgICAgID0gMHgxLAorICAgIEdFTjZfU1VSRlRZUEVfM0QJCQkJCSAgICAgID0gMHgyLAorICAgIEdFTjZfU1VSRlRZUEVfQ1VCRQkJCQkJICAgICAgPSAweDMsCisgICAgR0VONl9TVVJGVFlQRV9CVUZGRVIJCQkJICAgICAgPSAweDQsCisgICAgR0VON19TVVJGVFlQRV9TVFJCVUYJCQkJICAgICAgPSAweDUsCisgICAgR0VONl9TVVJGVFlQRV9OVUxMCQkJCQkgICAgICA9IDB4NywKK307CisKK2VudW0gZ2VuX3N1cmZhY2VfdGlsaW5nIHsKKyAgICBHRU42X1RJTElOR19OT05FCQkJCQkgICAgICA9IDB4MCwKKyAgICBHRU44X1RJTElOR19XCQkJCQkgICAgICA9IDB4MSwKKyAgICBHRU42X1RJTElOR19YCQkJCQkgICAgICA9IDB4MiwKKyAgICBHRU42X1RJTElOR19ZCQkJCQkgICAgICA9IDB4MywKK307CisKK2VudW0gZ2VuX3N1cmZhY2VfY2xlYXJfY29sb3IgeworICAgIEdFTjdfQ0xFQVJfQ09MT1JfWkVSTwkJCQkgICAgICA9IDB4MCwKKyAgICBHRU43X0NMRUFSX0NPTE9SX09ORQkJCQkgICAgICA9IDB4MSwKK307CisKK2VudW0gZ2VuX3N1cmZhY2Vfc2NzIHsKKyAgICBHRU43NV9TQ1NfWkVSTwkJCQkJICAgICAgPSAweDAsCisgICAgR0VONzVfU0NTX09ORQkJCQkJICAgICAgPSAweDEsCisgICAgR0VONzVfU0NTX1JFRAkJCQkJICAgICAgPSAweDQsCisgICAgR0VONzVfU0NTX0dSRUVOCQkJCQkgICAgICA9IDB4NSwKKyAgICBHRU43NV9TQ1NfQkxVRQkJCQkJICAgICAgPSAweDYsCisgICAgR0VONzVfU0NTX0FMUEhBCQkJCQkgICAgICA9IDB4NywKK307CisKKyNkZWZpbmUgR0VONl9TVVJGQUNFX1NUQVRFX19TSVpFCQkJCTE2CisKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMF9UWVBFX19NQVNLCQkJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMF9UWVBFX19TSElGVAkJCQkyOQorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcwX0ZPUk1BVF9fTUFTSwkJCQkweDA3ZmMwMDAwCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzBfRk9STUFUX19TSElGVAkJCQkxOAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcwX1ZTVFJJREUJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMF9WU1RSSURFX09GRlNFVAkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcwX01JUExBWU9VVF9fTUFTSwkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMF9NSVBMQVlPVVRfX1NISUZUCQkJMTAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMF9NSVBMQVlPVVRfQkVMT1cJCQkoMHgwIDw8IDEwKQorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcwX01JUExBWU9VVF9SSUdIVAkJCSgweDEgPDwgMTApCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzBfQ1VCRV9NQVBfQ09STkVSX01PREUJCQkoMHgxIDw8IDkpCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzBfUkVOREVSX0NBQ0hFX1JXCQkJKDB4MSA8PCA4KQorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcwX01FRElBX0JPVU5EQVJZX1BJWEVMX01PREVfX01BU0sJMHgwMDAwMDBjMAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcwX01FRElBX0JPVU5EQVJZX1BJWEVMX01PREVfX1NISUZUCTYKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMF9DVUJFX0ZBQ0VfRU5BQkxFU19fTUFTSwkJMHgwMDAwMDAzZgorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcwX0NVQkVfRkFDRV9FTkFCTEVTX19TSElGVAkJMAorCisKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMl9IRUlHSFRfX01BU0sJCQkJMHhmZmY4MDAwMAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcyX0hFSUdIVF9fU0hJRlQJCQkJMTkKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMl9XSURUSF9fTUFTSwkJCQkweDAwMDdmZmMwCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzJfV0lEVEhfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMl9NSVBfQ09VTlRfTE9EX19NQVNLCQkJMHgwMDAwMDAzYworI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcyX01JUF9DT1VOVF9MT0RfX1NISUZUCQkJMgorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFcyX1JUUk9UQVRFX19NQVNLCQkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMl9SVFJPVEFURV9fU0hJRlQJCQkwCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzJfUlRST1RBVEVfMERFRwkJCQkweDAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMl9SVFJPVEFURV85MERFRwkJCQkweDEKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXMl9SVFJPVEFURV8yNzBERUcJCQkweDMKKworI2RlZmluZSBHRU42X1NVUkZBQ0VfRFczX0RFUFRIX19NQVNLCQkJCTB4ZmZlMDAwMDAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXM19ERVBUSF9fU0hJRlQJCQkJMjEKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXM19QSVRDSF9fTUFTSwkJCQkweDAwMGZmZmY4CisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzNfUElUQ0hfX1NISUZUCQkJCTMKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXM19USUxJTkdfX01BU0sJCQkJMHgwMDAwMDAwMworI2RlZmluZSBHRU42X1NVUkZBQ0VfRFczX1RJTElOR19fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzRfTUlOX0xPRF9fTUFTSwkJCQkweGYwMDAwMDAwCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzRfTUlOX0xPRF9fU0hJRlQJCQkJMjgKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNF9NSU5fQVJSQVlfRUxFTUVOVF9fTUFTSwkJMHgwZmZlMDAwMAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFc0X01JTl9BUlJBWV9FTEVNRU5UX19TSElGVAkJMTcKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNF9SVF9WSUVXX0VYVEVOVF9fTUFTSwkJCTB4MDAwMWZmMDAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNF9SVF9WSUVXX0VYVEVOVF9fU0hJRlQJCQk4CisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzRfTVVMVElTQU1QTEVDT1VOVF9fTUFTSwkJCTB4MDAwMDAwNzAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNF9NVUxUSVNBTVBMRUNPVU5UX19TSElGVAkJNAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFc0X01VTFRJU0FNUExFQ09VTlRfMQkJCSgweDAgPDwgNCkKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNF9NVUxUSVNBTVBMRUNPVU5UXzQJCQkoMHgyIDw8IDQpCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzRfTVNQT1NfSU5ERVhfX01BU0sJCQkweDAwMDAwMDA3CisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzRfTVNQT1NfSU5ERVhfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzVfWF9PRkZTRVRfX01BU0sJCQkJMHhmZTAwMDAwMAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFc1X1hfT0ZGU0VUX19TSElGVAkJCTI1CisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzVfWF9PRkZTRVRfX1NIUgkJCQkyCisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzVfVkFMSUdOX19NQVNLCQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNV9WQUxJR05fX1NISUZUCQkJCTI0CisjZGVmaW5lIEdFTjZfU1VSRkFDRV9EVzVfVkFMSUdOXzIJCQkJKDB4MCA8PCAyNCkKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNV9WQUxJR05fNAkJCQkoMHgxIDw8IDI0KQorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFc1X1lfT0ZGU0VUX19NQVNLCQkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgR0VONl9TVVJGQUNFX0RXNV9ZX09GRlNFVF9fU0hJRlQJCQkyMAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFc1X1lfT0ZGU0VUX19TSFIJCQkJMQorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFc1X01PQ1NfX01BU0sJCQkJMHgwMDBmMDAwMAorI2RlZmluZSBHRU42X1NVUkZBQ0VfRFc1X01PQ1NfX1NISUZUCQkJCTE2CisKKworI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX1RZUEVfX01BU0sJCQkJMHhlMDAwMDAwMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX1RZUEVfX1NISUZUCQkJCTI5CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzBfSVNfQVJSQVkJCQkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9GT1JNQVRfX01BU0sJCQkJMHgwN2ZjMDAwMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX0ZPUk1BVF9fU0hJRlQJCQkJMTgKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9WQUxJR05fX01BU0sJCQkJMHgwMDAzMDAwMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX1ZBTElHTl9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9WQUxJR05fMgkJCQkoMHgwIDw8IDE2KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX1ZBTElHTl80CQkJCSgweDEgPDwgMTYpCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzBfVkFMSUdOXzgJCQkJKDB4MiA8PCAxNikKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXMF9WQUxJR05fMTYJCQkJKDB4MyA8PCAxNikKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9IQUxJR05fX01BU0sJCQkJMHgwMDAwODAwMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX0hBTElHTl9fU0hJRlQJCQkJMTUKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9IQUxJR05fNAkJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX0hBTElHTl84CQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzBfVElMSU5HX19NQVNLCQkJCTB4MDAwMDYwMDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9USUxJTkdfX1NISUZUCQkJCTEzCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzBfVlNUUklERQkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX1ZTVFJJREVfT0ZGU0VUCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzBfQVJZU1BDX19NQVNLCQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9BUllTUENfX1NISUZUCQkJCTEwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzBfQVJZU1BDX0ZVTEwJCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9BUllTUENfTE9EMAkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHRU44X1NVUkZBQ0VfRFcwX0hBTElHTl9fTUFTSwkJCQkweDAwMDBjMDAwCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzBfSEFMSUdOX19TSElGVAkJCQkxNAorI2RlZmluZSBHRU44X1NVUkZBQ0VfRFcwX0hBTElHTl80CQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzBfSEFMSUdOXzgJCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXMF9IQUxJR05fMTYJCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXMF9USUxJTkdfX01BU0sJCQkJMHgwMDAwMzAwMAorI2RlZmluZSBHRU44X1NVUkZBQ0VfRFcwX1RJTElOR19fU0hJRlQJCQkJMTIKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXMF9WU1RSSURFCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzBfVlNUUklERV9PRkZTRVQJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXMF9TQU1QTEVSX0wyX0JZUEFTU19NT0RFCQkJKDB4MSA8PCA5KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcwX1JFTkRFUl9DQUNIRV9SVwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9NRURJQV9CT1VOREFSWV9QSVhFTF9NT0RFX19NQVNLCTB4MDAwMDAwYzAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9NRURJQV9CT1VOREFSWV9QSVhFTF9NT0RFX19TSElGVAk2CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzBfQ1VCRV9GQUNFX0VOQUJMRVNfX01BU0sJCTB4MDAwMDAwM2YKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMF9DVUJFX0ZBQ0VfRU5BQkxFU19fU0hJRlQJCTAKKworCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzFfTU9DU19fTUFTSwkJCQkweDdmMDAwMDAwCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzFfTU9DU19fU0hJRlQJCQkJMjQKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXMV9CQVNFX0xPRF9fTUFTSwkJCQkweDAwZjgwMDAwCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzFfQkFTRV9MT0RfX1NISUZUCQkJMTkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXMV9RUElUQ0hfX01BU0sJCQkJMHgwMDAwN2ZmZgorI2RlZmluZSBHRU44X1NVUkZBQ0VfRFcxX1FQSVRDSF9fU0hJRlQJCQkJMAorCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzJfSEVJR0hUX19NQVNLCQkJCTB4M2ZmZjAwMDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXMl9IRUlHSFRfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzJfV0lEVEhfX01BU0sJCQkJMHgwMDAwM2ZmZgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFcyX1dJRFRIX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXM19ERVBUSF9fTUFTSwkJCQkweGZmZTAwMDAwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzNfREVQVEhfX1NISUZUCQkJCTIxCisjZGVmaW5lIEdFTjc1X1NVUkZBQ0VfRFczX0lOVEVHRVJfU1VSRkFDRV9GT1JNQVRfX01BU0sJCTB4MDAxYzAwMDAKKyNkZWZpbmUgR0VONzVfU1VSRkFDRV9EVzNfSU5URUdFUl9TVVJGQUNFX0ZPUk1BVF9fU0hJRlQJCTE4CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzNfUElUQ0hfX01BU0sJCQkJMHgwMDAzZmZmZgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFczX1BJVENIX19TSElGVAkJCQkwCisKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9SVFJPVEFURV9fTUFTSwkJCQkweDYwMDAwMDAwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzRfUlRST1RBVEVfX1NISUZUCQkJMjkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9SVFJPVEFURV8wREVHCQkJCSgweDAgPDwgMjkpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzRfUlRST1RBVEVfOTBERUcJCQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9SVFJPVEFURV8yNzBERUcJCQkoMHgzIDw8IDI5KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X01JTl9BUlJBWV9FTEVNRU5UX19NQVNLCQkweDFmZmMwMDAwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzRfTUlOX0FSUkFZX0VMRU1FTlRfX1NISUZUCQkxOAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X1JUX1ZJRVdfRVhURU5UX19NQVNLCQkJMHgwMDAzZmY4MAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X1JUX1ZJRVdfRVhURU5UX19TSElGVAkJCTcKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9NU0ZNVF9fTUFTSwkJCQkweDAwMDAwMDQwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzRfTVNGTVRfX1NISUZUCQkJCTYKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9NU0ZNVF9NU1MJCQkJKDB4MCA8PCA2KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X01TRk1UX0RFUFRIX1NURU5DSUwJCQkoMHgxIDw8IDYpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzRfTVVMVElTQU1QTEVDT1VOVF9fTUFTSwkJCTB4MDAwMDAwMzgKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9NVUxUSVNBTVBMRUNPVU5UX19TSElGVAkJMworI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X01VTFRJU0FNUExFQ09VTlRfMQkJCSgweDAgPDwgMykKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXNF9NVUxUSVNBTVBMRUNPVU5UXzIJCQkoMHgxIDw8IDMpCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzRfTVVMVElTQU1QTEVDT1VOVF80CQkJKDB4MiA8PCAzKQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X01VTFRJU0FNUExFQ09VTlRfOAkJCSgweDMgPDwgMykKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXNF9NVUxUSVNBTVBMRUNPVU5UXzE2CQkJKDB4NCA8PCAzKQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X01TUE9TX0lOREVYX19NQVNLCQkJMHgwMDAwMDAwNworI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc0X01TUE9TX0lOREVYX19TSElGVAkJCTAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9NSU5fQVJSQVlfRUxFTUVOVF9TVFJCVUZfX01BU0sJCTB4MDdmZmZmZmYKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNF9NSU5fQVJSQVlfRUxFTUVOVF9TVFJCVUZfX1NISUZUCTAKKworI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X1hfT0ZGU0VUX19NQVNLCQkJCTB4ZmUwMDAwMDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNV9YX09GRlNFVF9fU0hJRlQJCQkyNQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X1hfT0ZGU0VUX19TSFIJCQkJMgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X1lfT0ZGU0VUX19NQVNLCQkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNV9ZX09GRlNFVF9fU0hJRlQJCQkyMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X1lfT0ZGU0VUX19TSFIJCQkJMQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X01PQ1NfX01BU0sJCQkJMHgwMDBmMDAwMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X01PQ1NfX1NISUZUCQkJCTE2CisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzVfWV9PRkZTRVRfX01BU0sJCQkJMHgwMGUwMDAwMAorI2RlZmluZSBHRU44X1NVUkZBQ0VfRFc1X1lfT0ZGU0VUX19TSElGVAkJCTIxCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzVfWV9PRkZTRVRfX1NIUgkJCQkxCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzVfQ1VCRV9FV0EJCQkJKDB4MSA8PCAyMCkKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXNV9DT0hFUkVOQ1lfVFlQRQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X01JTl9MT0RfX01BU0sJCQkJMHgwMDAwMDBmMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X01JTl9MT0RfX1NISUZUCQkJCTQKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNV9NSVBfQ09VTlRfTE9EX19NQVNLCQkJMHgwMDAwMDAwZgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc1X01JUF9DT1VOVF9MT0RfX1NISUZUCQkJMAorCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzZfU0VQQVJBVEVfVVZfRU5BQkxFCQkJKDB4MSA8PCAzMSkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNl9VVl9YX09GRlNFVF9fTUFTSwkJCTB4M2ZmZjAwMDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNl9VVl9YX09GRlNFVF9fU0hJRlQJCQkxNgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc2X1VWX1lfT0ZGU0VUX19NQVNLCQkJMHgwMDAwM2ZmZgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc2X1VWX1lfT0ZGU0VUX19TSElGVAkJCTAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNl9NQ1NfQUREUl9fTUFTSwkJCQkweGZmZmZmMDAwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzZfTUNTX0FERFJfX1NISUZUCQkJMTIKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNl9NQ1NfQUREUl9fU0hSCQkJCTEyCisjZGVmaW5lIEdFTjhfU1VSRkFDRV9EVzZfQVVYX1FQSVRDSF9fTUFTSwkJCTB4N2ZmZjAwMDAKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXNl9BVVhfUVBJVENIX19TSElGVAkJCTE2CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzZfQVVYX1BJVENIX19NQVNLCQkJMHgwMDAwMGZmOAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc2X0FVWF9QSVRDSF9fU0hJRlQJCQkzCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzZfQVBQRU5EX0NPVU5URVJfQUREUl9fTUFTSwkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc2X0FQUEVORF9DT1VOVEVSX0FERFJfX1NISUZUCQk2CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzZfQVBQRU5EX0NPVU5URVJfQUREUl9fU0hSCQk2CisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzZfQVVYX01PREVfX01BU0sJCQkJMHgwMDAwMDAwNworI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc2X0FVWF9NT0RFX19TSElGVAkJCTAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNl9BVVhfTU9ERV9OT05FCQkJCTB4MAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc2X0FVWF9NT0RFX01DUwkJCQkweDEKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXNl9BVVhfTU9ERV9BUFBFTkQJCQkweDIKKyNkZWZpbmUgR0VOOF9TVVJGQUNFX0RXNl9BVVhfTU9ERV9ISVoJCQkJMHgzCisKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXN19DQ19SX19NQVNLCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXN19DQ19SX19TSElGVAkJCQkzMQorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc3X0NDX0dfX01BU0sJCQkJMHg0MDAwMDAwMAorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc3X0NDX0dfX1NISUZUCQkJCTMwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzdfQ0NfQl9fTUFTSwkJCQkweDIwMDAwMDAwCisjZGVmaW5lIEdFTjdfU1VSRkFDRV9EVzdfQ0NfQl9fU0hJRlQJCQkJMjkKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXN19DQ19BX19NQVNLCQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgR0VON19TVVJGQUNFX0RXN19DQ19BX19TSElGVAkJCQkyOAorI2RlZmluZSBHRU43NV9TVVJGQUNFX0RXN19TQ1NfUl9fTUFTSwkJCQkweDBlMDAwMDAwCisjZGVmaW5lIEdFTjc1X1NVUkZBQ0VfRFc3X1NDU19SX19TSElGVAkJCQkyNQorI2RlZmluZSBHRU43NV9TVVJGQUNFX0RXN19TQ1NfR19fTUFTSwkJCQkweDAxYzAwMDAwCisjZGVmaW5lIEdFTjc1X1NVUkZBQ0VfRFc3X1NDU19HX19TSElGVAkJCQkyMgorI2RlZmluZSBHRU43NV9TVVJGQUNFX0RXN19TQ1NfQl9fTUFTSwkJCQkweDAwMzgwMDAwCisjZGVmaW5lIEdFTjc1X1NVUkZBQ0VfRFc3X1NDU19CX19TSElGVAkJCQkxOQorI2RlZmluZSBHRU43NV9TVVJGQUNFX0RXN19TQ1NfQV9fTUFTSwkJCQkweDAwMDcwMDAwCisjZGVmaW5lIEdFTjc1X1NVUkZBQ0VfRFc3X1NDU19BX19TSElGVAkJCQkxNgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc3X1JFU19NSU5fTE9EX19NQVNLCQkJMHgwMDAwMGZmZgorI2RlZmluZSBHRU43X1NVUkZBQ0VfRFc3X1JFU19NSU5fTE9EX19TSElGVAkJCTAKKworCisKKworCisKKworCisKKyNkZWZpbmUgR0VONl9CSU5ESU5HX1RBQkxFX1NUQVRFX19TSVpFCQkJCTI1NgorCisjZGVmaW5lIEdFTjZfQklORElOR19UQUJMRV9EV19BRERSX19NQVNLCQkJMHhmZmZmZmZlMAorI2RlZmluZSBHRU42X0JJTkRJTkdfVEFCTEVfRFdfQUREUl9fU0hJRlQJCQk1CisjZGVmaW5lIEdFTjZfQklORElOR19UQUJMRV9EV19BRERSX19TSFIJCQkJNQorCisjZGVmaW5lIEdFTjhfQklORElOR19UQUJMRV9EV19BRERSX19NQVNLCQkJMHhmZmZmZmZjMAorI2RlZmluZSBHRU44X0JJTkRJTkdfVEFCTEVfRFdfQUREUl9fU0hJRlQJCQk2CisjZGVmaW5lIEdFTjhfQklORElOR19UQUJMRV9EV19BRERSX19TSFIJCQkJNgorCisKKyNlbmRpZiAvKiBHRU5fUkVOREVSX1NVUkZBQ0VfWE1MICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvZ2VuaHcvZ2VuaHcuaCBiL2ljZC9pbnRlbC9nZW5ody9nZW5ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZ2VuaHcvZ2VuaHcuaApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEdFTkhXX0gKKyNkZWZpbmUgR0VOSFdfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiZ2VuX3JlZ3MueG1sLmgiCisjaW5jbHVkZSAiZ2VuX21pLnhtbC5oIgorI2luY2x1ZGUgImdlbl9ibGl0dGVyLnhtbC5oIgorI2luY2x1ZGUgImdlbl9yZW5kZXIueG1sLmgiCisjaW5jbHVkZSAiZ2VuX3JlbmRlcl9zdXJmYWNlLnhtbC5oIgorI2luY2x1ZGUgImdlbl9yZW5kZXJfZHluYW1pYy54bWwuaCIKKyNpbmNsdWRlICJnZW5fcmVuZGVyXzNkLnhtbC5oIgorI2luY2x1ZGUgImdlbl9yZW5kZXJfbWVkaWEueG1sLmgiCisjaW5jbHVkZSAiZ2VuX2V1X2lzYS54bWwuaCIKKyNpbmNsdWRlICJnZW5fZXVfbWVzc2FnZS54bWwuaCIKKworI2RlZmluZSBHRU5fTUlfQ01EKGdlbiwgb3ApIChHRU42X01JX1RZUEVfTUkgfCBnZW4gIyMgX01JX09QQ09ERV8gIyMgb3ApCisjZGVmaW5lIEdFTjZfTUlfQ01EKG9wKSBHRU5fTUlfQ01EKEdFTjYsIG9wKQorI2RlZmluZSBHRU43X01JX0NNRChvcCkgR0VOX01JX0NNRChHRU43LCBvcCkKKworI2RlZmluZSBHRU5fQkxJVFRFUl9DTUQoZ2VuLCBvcCkgXAorICAgKEdFTjZfQkxJVFRFUl9UWVBFX0JMSVRURVIgfCBnZW4gIyMgX0JMSVRURVJfT1BDT0RFXyAjIyBvcCkKKyNkZWZpbmUgR0VONl9CTElUVEVSX0NNRChvcCkgR0VOX0JMSVRURVJfQ01EKEdFTjYsIG9wKQorCisjZGVmaW5lIEdFTl9SRU5ERVJfQ01EKHN1YnR5cGUsIGdlbiwgb3ApICBcCisgICAoR0VONl9SRU5ERVJfVFlQRV9SRU5ERVIgfCAgICAgICAgICAgICBcCisgICAgR0VONl9SRU5ERVJfU1VCVFlQRV8gIyMgc3VidHlwZSB8ICAgICBcCisgICAgZ2VuICMjIF9SRU5ERVJfT1BDT0RFXyAjIyBvcCkKKyNkZWZpbmUgR0VONl9SRU5ERVJfQ01EKHN1YnR5cGUsIG9wKSBHRU5fUkVOREVSX0NNRChzdWJ0eXBlLCBHRU42LCBvcCkKKyNkZWZpbmUgR0VON19SRU5ERVJfQ01EKHN1YnR5cGUsIG9wKSBHRU5fUkVOREVSX0NNRChzdWJ0eXBlLCBHRU43LCBvcCkKKyNkZWZpbmUgR0VONzVfUkVOREVSX0NNRChzdWJ0eXBlLCBvcCkgR0VOX1JFTkRFUl9DTUQoc3VidHlwZSwgR0VONzUsIG9wKQorI2RlZmluZSBHRU44X1JFTkRFUl9DTUQoc3VidHlwZSwgb3ApIEdFTl9SRU5ERVJfQ01EKHN1YnR5cGUsIEdFTjgsIG9wKQorCisjZGVmaW5lIEdFTl9FWFRSQUNUKGJpdHMsIGZpZWxkKSAoKChiaXRzKSAmIGZpZWxkICMjIF9fTUFTSykgPj4gZmllbGQgIyMgX19TSElGVCkKKyNkZWZpbmUgR0VOX1NISUZUMzIoYml0cywgZmllbGQpIGdlbl9zaGlmdDMyKGJpdHMsIGZpZWxkICMjIF9fTUFTSywgZmllbGQgIyMgX19TSElGVCkKKworc3RhdGljIGlubGluZSB1aW50MzJfdAorZ2VuX3NoaWZ0MzIodWludDMyX3QgYml0cywgdWludDMyX3QgbWFzaywgaW50IHNoaWZ0KQoreworICAgYml0cyA8PD0gc2hpZnQ7CisKKyAgIGFzc2VydCgoYml0cyAmIG1hc2spID09IGJpdHMpOworICAgcmV0dXJuIGJpdHMgJiBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2dlbl9pc19zbmIoaW50IGRldmlkKQoreworICAgcmV0dXJuIChkZXZpZCA9PSAweDAxMDIgfHwgLyogR1QxIGRlc2t0b3AgKi8KKyAgICAgICAgICAgZGV2aWQgPT0gMHgwMTEyIHx8IC8qIEdUMiBkZXNrdG9wICovCisgICAgICAgICAgIGRldmlkID09IDB4MDEyMiB8fCAvKiBHVDJfUExVUyBkZXNrdG9wICovCisgICAgICAgICAgIGRldmlkID09IDB4MDEwNiB8fCAvKiBHVDEgbW9iaWxlICovCisgICAgICAgICAgIGRldmlkID09IDB4MDExNiB8fCAvKiBHVDIgbW9iaWxlICovCisgICAgICAgICAgIGRldmlkID09IDB4MDEyNiB8fCAvKiBHVDJfUExVUyBtb2JpbGUgKi8KKyAgICAgICAgICAgZGV2aWQgPT0gMHgwMTBhKTsgIC8qIEdUMSBzZXJ2ZXIgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQKK2dlbl9nZXRfc25iX2d0KGludCBkZXZpZCkKK3sKKyAgIGFzc2VydChnZW5faXNfc25iKGRldmlkKSk7CisgICByZXR1cm4gKGRldmlkICYgMHgzMCkgPyAyIDogMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitnZW5faXNfaXZiKGludCBkZXZpZCkKK3sKKyAgIHJldHVybiAoZGV2aWQgPT0gMHgwMTUyIHx8IC8qIEdUMSBkZXNrdG9wICovCisgICAgICAgICAgIGRldmlkID09IDB4MDE2MiB8fCAvKiBHVDIgZGVza3RvcCAqLworICAgICAgICAgICBkZXZpZCA9PSAweDAxNTYgfHwgLyogR1QxIG1vYmlsZSAqLworICAgICAgICAgICBkZXZpZCA9PSAweDAxNjYgfHwgLyogR1QyIG1vYmlsZSAqLworICAgICAgICAgICBkZXZpZCA9PSAweDAxNWEgfHwgLyogR1QxIHNlcnZlciAqLworICAgICAgICAgICBkZXZpZCA9PSAweDAxNmEpOyAgLyogR1QyIHNlcnZlciAqLworfQorCitzdGF0aWMgaW5saW5lIGludAorZ2VuX2dldF9pdmJfZ3QoaW50IGRldmlkKQoreworICAgYXNzZXJ0KGdlbl9pc19pdmIoZGV2aWQpKTsKKyAgIHJldHVybiAoZGV2aWQgJiAweDMwKSA+PiA0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2dlbl9pc19oc3coaW50IGRldmlkKQoreworICAgcmV0dXJuIChkZXZpZCA9PSAweDA0MDIgfHwgLyogR1QxIGRlc2t0b3AgKi8KKyAgICAgICAgICAgZGV2aWQgPT0gMHgwNDEyIHx8IC8qIEdUMiBkZXNrdG9wICovCisgICAgICAgICAgIGRldmlkID09IDB4MDQyMiB8fCAvKiBHVDMgZGVza3RvcCAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MDYgfHwgLyogR1QxIG1vYmlsZSAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MTYgfHwgLyogR1QyIG1vYmlsZSAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MjYgfHwgLyogR1QyIG1vYmlsZSAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MGEgfHwgLyogR1QxIHNlcnZlciAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MWEgfHwgLyogR1QyIHNlcnZlciAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MmEgfHwgLyogR1QzIHNlcnZlciAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MGIgfHwgLyogR1QxIHJlc2VydmVkICovCisgICAgICAgICAgIGRldmlkID09IDB4MDQxYiB8fCAvKiBHVDIgcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgZGV2aWQgPT0gMHgwNDJiIHx8IC8qIEdUMyByZXNlcnZlZCAqLworICAgICAgICAgICBkZXZpZCA9PSAweDA0MGUgfHwgLyogR1QxIHJlc2VydmVkICovCisgICAgICAgICAgIGRldmlkID09IDB4MDQxZSB8fCAvKiBHVDIgcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgZGV2aWQgPT0gMHgwNDJlIHx8IC8qIEdUMyByZXNlcnZlZCAqLworICAgICAgICAgICBkZXZpZCA9PSAweDBjMDIgfHwgLyogU0RWICovCisgICAgICAgICAgIGRldmlkID09IDB4MGMxMiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBjMjIgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYzA2IHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGMxNiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBjMjYgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYzBhIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGMxYSB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBjMmEgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYzBiIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGMxYiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBjMmIgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYzBlIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGMxZSB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBjMmUgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYTAyIHx8IC8qIFVMVCAqLworICAgICAgICAgICBkZXZpZCA9PSAweDBhMTIgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYTIyIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGEwNiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBhMTYgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYTI2IHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGEwYSB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBhMWEgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYTJhIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGEwYiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBhMWIgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYTJiIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGEwZSB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBhMWUgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwYTJlIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGQwMiB8fCAvKiBDUlcgKi8KKyAgICAgICAgICAgZGV2aWQgPT0gMHgwZDEyIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGQyMiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBkMDYgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwZDE2IHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGQyNiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBkMGEgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwZDFhIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGQyYSB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBkMGIgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwZDFiIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGQyYiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBkMGUgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwZDFlIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGQyZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitnZW5fZ2V0X2hzd19ndChpbnQgZGV2aWQpCit7CisgICBhc3NlcnQoZ2VuX2lzX2hzdyhkZXZpZCkpOworICAgcmV0dXJuICgoZGV2aWQgJiAweDMwKSA+PiA0KSArIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ2VuX2lzX2JkdyhpbnQgZGV2aWQpCit7CisgICByZXR1cm4gKGRldmlkID09IDB4MTYwMiB8fCAvKiBHVDEgVUxUICovCisgICAgICAgICAgIGRldmlkID09IDB4MTYwNiB8fCAvKiBHVDEgVUxUICovCisgICAgICAgICAgIGRldmlkID09IDB4MTYwYSB8fCAvKiBHVDEgc2VydmVyICovCisgICAgICAgICAgIGRldmlkID09IDB4MTYwYiB8fCAvKiBHVDEgSXJpcyAqLworICAgICAgICAgICBkZXZpZCA9PSAweDE2MGQgfHwgLyogR1QxIHdvcmtzdGF0aW9uICovCisgICAgICAgICAgIGRldmlkID09IDB4MTYwZSB8fCAvKiBHVDEgVUxYICovCisgICAgICAgICAgIGRldmlkID09IDB4MTYxMiB8fCAvKiBHVDIgKi8KKyAgICAgICAgICAgZGV2aWQgPT0gMHgxNjE2IHx8CisgICAgICAgICAgIGRldmlkID09IDB4MTYxYSB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDE2MWIgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgxNjFkIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MTYxZSB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDE2MjIgfHwgLyogR1QzICovCisgICAgICAgICAgIGRldmlkID09IDB4MTYyNiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDE2MmEgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgxNjJiIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MTYyZCB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDE2MmUpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZ2VuX2dldF9iZHdfZ3QoaW50IGRldmlkKQoreworICAgYXNzZXJ0KGdlbl9pc19iZHcoZGV2aWQpKTsKKyAgIHJldHVybiAoKGRldmlkICYgMHgzMCkgPj4gNCkgKyAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2dlbl9pc192bHYoaW50IGRldmlkKQoreworICAgcmV0dXJuIChkZXZpZCA9PSAweDBmMzAgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwZjMxIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MGYzMiB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDBmMzMgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgwMTU3IHx8CisgICAgICAgICAgIGRldmlkID09IDB4MDE1NSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ2VuX2lzX2NodihpbnQgZGV2aWQpCit7CisgICByZXR1cm4gKGRldmlkID09IDB4MjJiMCB8fAorICAgICAgICAgICBkZXZpZCA9PSAweDIyYjEgfHwKKyAgICAgICAgICAgZGV2aWQgPT0gMHgyMmIyIHx8CisgICAgICAgICAgIGRldmlkID09IDB4MjJiMyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ2VuX2lzX2F0b20oaW50IGRldmlkKQoreworICAgcmV0dXJuIChnZW5faXNfdmx2KGRldmlkKSB8fAorICAgICAgICAgICBnZW5faXNfY2h2KGRldmlkKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ2VuX2lzX2Rlc2t0b3AoaW50IGRldmlkKQoreworICAgYXNzZXJ0KCFnZW5faXNfYXRvbShkZXZpZCkpOworICAgcmV0dXJuICgoZGV2aWQgJiAweGYpID09IDB4Mik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ2VuX2lzX21vYmlsZShpbnQgZGV2aWQpCit7CisgICBhc3NlcnQoIWdlbl9pc19hdG9tKGRldmlkKSk7CisgICByZXR1cm4gKChkZXZpZCAmIDB4ZikgPT0gMHg2KTsKK30KKworc3RhdGljIGlubGluZSBib29sCitnZW5faXNfc2VydmVyKGludCBkZXZpZCkKK3sKKyAgIGFzc2VydCghZ2VuX2lzX2F0b20oZGV2aWQpKTsKKyAgIHJldHVybiAoKGRldmlkICYgMHhmKSA9PSAweGEpOworfQorCisjZW5kaWYgLyogR0VOSFdfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2dwdS5jIGIvaWNkL2ludGVsL2dwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzRjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZ3B1LmMKQEAgLTAsMCArMSw1NTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImdlbmh3L2dlbmh3LmgiCisjaW5jbHVkZSAia21kL3dpbnN5cy5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAiZ3B1LmgiCisjaW5jbHVkZSAiaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJ3c2kuaCIKKyNpbmNsdWRlICJpY2QuaCIKKworc3RhdGljIGludCBncHVfb3Blbl9wcmltYXJ5X25vZGUoc3RydWN0IGludGVsX2dwdSAqZ3B1KQoreworICAgIGlmIChncHUtPnByaW1hcnlfZmRfaW50ZXJuYWwgPCAwKQorICAgICAgICBncHUtPnByaW1hcnlfZmRfaW50ZXJuYWwgPSBvcGVuKGdwdS0+cHJpbWFyeV9ub2RlLCBPX1JEV1IpOworCisgICAgcmV0dXJuIGdwdS0+cHJpbWFyeV9mZF9pbnRlcm5hbDsKK30KKworc3RhdGljIHZvaWQgZ3B1X2Nsb3NlX3ByaW1hcnlfbm9kZShzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpCit7CisgICAgaWYgKGdwdS0+cHJpbWFyeV9mZF9pbnRlcm5hbCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGdwdS0+cHJpbWFyeV9mZF9pbnRlcm5hbCk7CisgICAgICAgIGdwdS0+cHJpbWFyeV9mZF9pbnRlcm5hbCA9IC0xOworICAgIH0KK30KKworc3RhdGljIGludCBncHVfb3Blbl9yZW5kZXJfbm9kZShzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpCit7CisgICAgaWYgKGdwdS0+cmVuZGVyX2ZkX2ludGVybmFsIDwgMCAmJiBncHUtPnJlbmRlcl9ub2RlKSB7CisgICAgICAgIGdwdS0+cmVuZGVyX2ZkX2ludGVybmFsID0gb3BlbihncHUtPnJlbmRlcl9ub2RlLCBPX1JEV1IpOworICAgICAgICBpZiAoZ3B1LT5yZW5kZXJfZmRfaW50ZXJuYWwgPCAwKSB7CisgICAgICAgICAgICBpbnRlbF9sb2coZ3B1LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwgVktfTlVMTF9IQU5ETEUsIDAsCisgICAgICAgICAgICAgICAgICAgIDAsICJmYWlsZWQgdG8gb3BlbiAlcyIsIGdwdS0+cmVuZGVyX25vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGdwdS0+cmVuZGVyX2ZkX2ludGVybmFsOworfQorCitzdGF0aWMgdm9pZCBncHVfY2xvc2VfcmVuZGVyX25vZGUoc3RydWN0IGludGVsX2dwdSAqZ3B1KQoreworICAgIGlmIChncHUtPnJlbmRlcl9mZF9pbnRlcm5hbCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGdwdS0+cmVuZGVyX2ZkX2ludGVybmFsKTsKKyAgICAgICAgZ3B1LT5yZW5kZXJfZmRfaW50ZXJuYWwgPSAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpncHVfZ2V0X25hbWUoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1KQoreworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisgICAgaWYgKGdlbl9pc19oc3coZ3B1LT5kZXZpZCkpIHsKKyAgICAgICAgaWYgKGdlbl9pc19kZXNrdG9wKGdwdS0+ZGV2aWQpKQorICAgICAgICAgICAgbmFtZSA9ICJJbnRlbChSKSBIYXN3ZWxsIERlc2t0b3AiOworICAgICAgICBlbHNlIGlmIChnZW5faXNfbW9iaWxlKGdwdS0+ZGV2aWQpKQorICAgICAgICAgICAgbmFtZSA9ICJJbnRlbChSKSBIYXN3ZWxsIE1vYmlsZSI7CisgICAgICAgIGVsc2UgaWYgKGdlbl9pc19zZXJ2ZXIoZ3B1LT5kZXZpZCkpCisgICAgICAgICAgICBuYW1lID0gIkludGVsKFIpIEhhc3dlbGwgU2VydmVyIjsKKyAgICB9CisgICAgZWxzZSBpZiAoZ2VuX2lzX2l2YihncHUtPmRldmlkKSkgeworICAgICAgICBpZiAoZ2VuX2lzX2Rlc2t0b3AoZ3B1LT5kZXZpZCkpCisgICAgICAgICAgICBuYW1lID0gIkludGVsKFIpIEl2eWJyaWRnZSBEZXNrdG9wIjsKKyAgICAgICAgZWxzZSBpZiAoZ2VuX2lzX21vYmlsZShncHUtPmRldmlkKSkKKyAgICAgICAgICAgIG5hbWUgPSAiSW50ZWwoUikgSXZ5YnJpZGdlIE1vYmlsZSI7CisgICAgICAgIGVsc2UgaWYgKGdlbl9pc19zZXJ2ZXIoZ3B1LT5kZXZpZCkpCisgICAgICAgICAgICBuYW1lID0gIkludGVsKFIpIEl2eWJyaWRnZSBTZXJ2ZXIiOworICAgIH0KKyAgICBlbHNlIGlmIChnZW5faXNfc25iKGdwdS0+ZGV2aWQpKSB7CisgICAgICAgIGlmIChnZW5faXNfZGVza3RvcChncHUtPmRldmlkKSkKKyAgICAgICAgICAgIG5hbWUgPSAiSW50ZWwoUikgU2FuZHlicmlkZ2UgRGVza3RvcCI7CisgICAgICAgIGVsc2UgaWYgKGdlbl9pc19tb2JpbGUoZ3B1LT5kZXZpZCkpCisgICAgICAgICAgICBuYW1lID0gIkludGVsKFIpIFNhbmR5YnJpZGdlIE1vYmlsZSI7CisgICAgICAgIGVsc2UgaWYgKGdlbl9pc19zZXJ2ZXIoZ3B1LT5kZXZpZCkpCisgICAgICAgICAgICBuYW1lID0gIkludGVsKFIpIFNhbmR5YnJpZGdlIFNlcnZlciI7CisgICAgfQorCisgICAgaWYgKCFuYW1lKQorICAgICAgICBuYW1lID0gIlVua25vd24gSW50ZWwgQ2hpcHNldCI7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKwordm9pZCBpbnRlbF9ncHVfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpCit7CisgICAgaW50ZWxfd3NpX2dwdV9jbGVhbnVwKGdwdSk7CisKKyAgICBpbnRlbF9ncHVfY2xlYW51cF93aW5zeXMoZ3B1KTsKKworICAgIGludGVsX2ZyZWUoZ3B1LCBncHUtPnByaW1hcnlfbm9kZSk7CisgICAgaW50ZWxfZnJlZShncHUsIGdwdSk7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWRfdG9fZ2VuKGludCBkZXZpZCkKK3sKKyAgICBpbnQgZ2VuOworCisgICAgaWYgKGdlbl9pc19oc3coZGV2aWQpKQorICAgICAgICBnZW4gPSBJTlRFTF9HRU4oNy41KTsKKyAgICBlbHNlIGlmIChnZW5faXNfaXZiKGRldmlkKSkKKyAgICAgICAgZ2VuID0gSU5URUxfR0VOKDcpOworICAgIGVsc2UgaWYgKGdlbl9pc19zbmIoZGV2aWQpKQorICAgICAgICBnZW4gPSBJTlRFTF9HRU4oNik7CisgICAgZWxzZQorICAgICAgICBnZW4gPSAtMTsKKworI2lmZGVmIElOVEVMX0dFTl9TUEVDSUFMSVpFRAorICAgIGlmIChnZW4gIT0gSU5URUxfR0VOKElOVEVMX0dFTl9TUEVDSUFMSVpFRCkpCisgICAgICAgIGdlbiA9IC0xOworI2VuZGlmCisKKyAgICByZXR1cm4gZ2VuOworfQorCitWa1Jlc3VsdCBpbnRlbF9ncHVfY3JlYXRlKGNvbnN0IHN0cnVjdCBpbnRlbF9pbnN0YW5jZSAqaW5zdGFuY2UsIGludCBkZXZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcmltYXJ5X25vZGUsIGNvbnN0IGNoYXIgKnJlbmRlcl9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ncHUgKipncHVfcmV0KQoreworICAgIGNvbnN0IGludCBnZW4gPSBkZXZpZF90b19nZW4oZGV2aWQpOworICAgIHNpemVfdCBwcmltYXJ5X2xlbiwgcmVuZGVyX2xlbjsKKyAgICBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHU7CisKKyAgICBpZiAoZ2VuIDwgMCkgeworICAgICAgICBpbnRlbF9sb2coaW5zdGFuY2UsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsIDAsCisgICAgICAgICAgICAgICAgVktfTlVMTF9IQU5ETEUsIDAsIDAsICJ1bnN1cHBvcnRlZCBkZXZpY2UgaWQgMHglMDR4IiwgZGV2aWQpOworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKworICAgIGdwdSA9IGludGVsX2FsbG9jKGluc3RhbmNlLCBzaXplb2YoKmdwdSksIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICAgaWYgKCFncHUpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBtZW1zZXQoZ3B1LCAwLCBzaXplb2YoKmdwdSkpOworICAgIC8qIHRoZXJlIGlzIG5vIFZLX0RCR19PQkpFQ1RfR1BVICovCisgICAgaW50ZWxfaGFuZGxlX2luaXQoJmdwdS0+aGFuZGxlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUEhZU0lDQUxfREVWSUNFX0VYVCwgaW5zdGFuY2UpOworCisgICAgZ3B1LT5kZXZpZCA9IGRldmlkOworCisgICAgcHJpbWFyeV9sZW4gPSBzdHJsZW4ocHJpbWFyeV9ub2RlKTsKKyAgICByZW5kZXJfbGVuID0gKHJlbmRlcl9ub2RlKSA/IHN0cmxlbihyZW5kZXJfbm9kZSkgOiAwOworCisgICAgZ3B1LT5wcmltYXJ5X25vZGUgPSBpbnRlbF9hbGxvYyhncHUsIHByaW1hcnlfbGVuICsgMSArCisgICAgICAgICAgICAoKHJlbmRlcl9sZW4pID8gKHJlbmRlcl9sZW4gKyAxKSA6IDApLCBzaXplb2YoaW50KSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgIGlmICghZ3B1LT5wcmltYXJ5X25vZGUpIHsKKyAgICAgICAgaW50ZWxfZnJlZShpbnN0YW5jZSwgZ3B1KTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1jcHkoZ3B1LT5wcmltYXJ5X25vZGUsIHByaW1hcnlfbm9kZSwgcHJpbWFyeV9sZW4gKyAxKTsKKworICAgIGlmIChyZW5kZXJfbm9kZSkgeworICAgICAgICBncHUtPnJlbmRlcl9ub2RlID0gZ3B1LT5wcmltYXJ5X25vZGUgKyBwcmltYXJ5X2xlbiArIDE7CisgICAgICAgIG1lbWNweShncHUtPnJlbmRlcl9ub2RlLCByZW5kZXJfbm9kZSwgcmVuZGVyX2xlbiArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdwdS0+cmVuZGVyX25vZGUgPSBncHUtPnByaW1hcnlfbm9kZTsKKyAgICB9CisKKyAgICBncHUtPmdlbl9vcGFxdWUgPSBnZW47CisKKyAgICBzd2l0Y2ggKGludGVsX2dwdV9nZW4oZ3B1KSkgeworICAgIGNhc2UgSU5URUxfR0VOKDcuNSk6CisgICAgICAgIGdwdS0+Z3QgPSBnZW5fZ2V0X2hzd19ndChkZXZpZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfR0VOKDcpOgorICAgICAgICBncHUtPmd0ID0gZ2VuX2dldF9pdmJfZ3QoZGV2aWQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0dFTig2KToKKyAgICAgICAgZ3B1LT5ndCA9IGdlbl9nZXRfc25iX2d0KGRldmlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogMTUwSyBkd29yZHMgKi8KKyAgICBncHUtPm1heF9iYXRjaF9idWZmZXJfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKiAxNTAqMTAyNDsKKworICAgIC8qIHRoZSB3aW5zeXMgaXMgcHJlcGFyZWQgZm9yIG9uZSByZWxvYyBldmVyeSB0d28gZHdvcmRzLCB0aGVuIG1pbnVzIDIgKi8KKyAgICBncHUtPmJhdGNoX2J1ZmZlcl9yZWxvY19jb3VudCA9CisgICAgICAgIGdwdS0+bWF4X2JhdGNoX2J1ZmZlcl9zaXplIC8gc2l6ZW9mKHVpbnQzMl90KSAvIDIgLSAyOworCisgICAgZ3B1LT5wcmltYXJ5X2ZkX2ludGVybmFsID0gLTE7CisgICAgZ3B1LT5yZW5kZXJfZmRfaW50ZXJuYWwgPSAtMTsKKworICAgICpncHVfcmV0ID0gZ3B1OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaW50ZWxfZ3B1X2dldF9saW1pdHMoVmtQaHlzaWNhbERldmljZUxpbWl0cyAqcExpbWl0cykKK3sKKyAgICAvLyBUT0RPOiBmaWxsIG91dCBtb3JlIGxpbWl0cworICAgIG1lbXNldChwTGltaXRzLCAwLCBzaXplb2YoKnBMaW1pdHMpKTsKKworICAgIC8vIG5vIHNpemUgbGltaXQsIGJ1dCBubyBib3VuZGVkIGJ1ZmZlciBjb3VsZCBleGNlZWQgMkdCCisgICAgcExpbWl0cy0+bWF4Qm91bmREZXNjcmlwdG9yU2V0cyAgICAgICAgID0gMTsKKyAgICBwTGltaXRzLT5tYXhDb21wdXRlV29ya0dyb3VwSW52b2NhdGlvbnMgPSA1MTI7CisKKyAgICAvLyBpbmNyZW1lbnRlZCBldmVyeSA4MG5zCisgICAgcExpbWl0cy0+dGltZXN0YW1wUGVyaW9kID0gODAuMGY7CisKKyAgICAvLyBoYXJkd2FyZSBpcyBsaW1pdGVkIHRvIDE2IHZpZXdwb3J0cworICAgIHBMaW1pdHMtPm1heFZpZXdwb3J0cyAgICAgICAgPSBJTlRFTF9NQVhfVklFV1BPUlRTOworICAgIHBMaW1pdHMtPm1heENvbG9yQXR0YWNobWVudHMgPSBJTlRFTF9NQVhfUkVOREVSX1RBUkdFVFM7CisKKyAgICAvLyA/CisgICAgcExpbWl0cy0+bWF4SW1hZ2VEaW1lbnNpb24xRCAgID0gODE5MjsKKyAgICBwTGltaXRzLT5tYXhJbWFnZURpbWVuc2lvbjJEICAgPSA4MTkyOworICAgIHBMaW1pdHMtPm1heEltYWdlRGltZW5zaW9uM0QgICA9IDgxOTI7CisgICAgcExpbWl0cy0+bWF4SW1hZ2VEaW1lbnNpb25DdWJlID0gODE5MjsKKyAgICBwTGltaXRzLT5tYXhJbWFnZUFycmF5TGF5ZXJzICAgPSAyMDQ4OworICAgIHBMaW1pdHMtPm1heFRleGVsQnVmZmVyRWxlbWVudHMgPSAxMjggKiAxMDI0ICogMTAyNDsgIC8vIDEyOE0gdGV4ZWxzIGhhcmQgbGltaXQKKyAgICBwTGltaXRzLT5tYXhVbmlmb3JtQnVmZmVyUmFuZ2UgPSA2NCAqIDEwMjQ7ICAgICAgICAgIC8vIG5vdCBoYXJkIGxpbWl0CisKKyAgICAvKiBIVyBoYXMgdHdvIHBlci1zdGFnZSByZXNvdXJjZSB0YWJsZXM6CisgICAgICogLSBzYW1wbGVycywgMTYgcGVyIHN0YWdlIG9uIElWQjsgYmxvY2tzIG9mIDE2IG9uIEhTVysgdmlhIHNoYWRlciBoYWNrLCBhcyB0aGUKKyAgICAgKiAgIHRhYmxlIGJhc2UgcHRyIHVzZWQgYnkgdGhlIHNhbXBsZXIgaHcgaXMgdW5kZXIgc2hhZGVyIHN3IGNvbnRyb2wuCisgICAgICoKKyAgICAgKiAtIGJpbmRpbmcgdGFibGUgZW50cmllcywgMjUwIHRvdGFsIG9uIGFsbCBnZW5zLCBzaGFyZWQgYmV0d2VlbgorICAgICAqICAgdGV4dHVyZXMsIFJULCBpbWFnZXMsIFNTQk8sIFVCTywgLi4uCisgICAgICogICB0aGUgdG9wIGZldyBpbmRpY2VzICgyNTAtMjU1KSBhcmUgdXNlZCBmb3IgJ3N0YXRlbGVzcycgYWNjZXNzIHdpdGggdmFyaW91cyBjYWNoZQorICAgICAqICAgb3B0aW9ucywgYW5kIGZvciBTTE0gYWNjZXNzLgorICAgICAqLworICAgIHBMaW1pdHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZXJzICAgICAgID0gMTY7ICAgICAgICAvLyB0ZWNobmljYWxseSBtb3JlIG9uIEhTVysuLgorICAgIHBMaW1pdHMtPm1heERlc2NyaXB0b3JTZXRTYW1wbGVycyAgICAgICAgICAgID0gMTY7CisKKyAgICBwTGltaXRzLT5tYXhQZXJTdGFnZURlc2NyaXB0b3JVbmlmb3JtQnVmZmVycyA9IDEyODsKKyAgICBwTGltaXRzLT5tYXhEZXNjcmlwdG9yU2V0VW5pZm9ybUJ1ZmZlcnMgICAgICA9IDEyODsKKworICAgIHBMaW1pdHMtPm1heFBlclN0YWdlRGVzY3JpcHRvclNhbXBsZWRJbWFnZXMgID0gMTI4OworICAgIHBMaW1pdHMtPm1heERlc2NyaXB0b3JTZXRTYW1wbGVkSW1hZ2VzICAgICAgID0gMTI4OworCisgICAgLy8gc3RvcmFnZSBpbWFnZXMgYW5kIGJ1ZmZlcnMgbm90IGltcGxlbWVudGVkOyBsZWZ0IGF0IHplcm8KKworICAgIHBMaW1pdHMtPm1heFBlclN0YWdlUmVzb3VyY2VzICA9IDI1MDsKKworICAgIC8vIHJlcXVpcmVkIHRvIHN1cHBvcnQgYXQgbGVhc3QgdHdvIHF1ZXVlIHByaW9yaXRpZXMKKyAgICBwTGltaXRzLT5kaXNjcmV0ZVF1ZXVlUHJpb3JpdGllcyA9IDI7Cit9CisKK3ZvaWQgaW50ZWxfZ3B1X2dldF9wcm9wcyhjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgKnByb3BzKQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgc2l6ZV90IG5hbWVfbGVuOworCisgICAgcHJvcHMtPmFwaVZlcnNpb24gPSBJTlRFTF9BUElfVkVSU0lPTjsKKyAgICBwcm9wcy0+ZHJpdmVyVmVyc2lvbiA9IElOVEVMX0RSSVZFUl9WRVJTSU9OOworCisgICAgcHJvcHMtPnZlbmRvcklEID0gMHg4MDg2OworICAgIHByb3BzLT5kZXZpY2VJRCA9IGdwdS0+ZGV2aWQ7CisKKyAgICBwcm9wcy0+ZGV2aWNlVHlwZSA9IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0lOVEVHUkFURURfR1BVOworCisgICAgLyogY29weSBHUFUgbmFtZSAqLworICAgIG5hbWUgPSBncHVfZ2V0X25hbWUoZ3B1KTsKKyAgICBuYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBpZiAobmFtZV9sZW4gPiBzaXplb2YocHJvcHMtPmRldmljZU5hbWUpIC0gMSkKKyAgICAgICAgbmFtZV9sZW4gPSBzaXplb2YocHJvcHMtPmRldmljZU5hbWUpIC0gMTsKKyAgICBtZW1jcHkocHJvcHMtPmRldmljZU5hbWUsIG5hbWUsIG5hbWVfbGVuKTsKKyAgICBwcm9wcy0+ZGV2aWNlTmFtZVtuYW1lX2xlbl0gPSAnXDAnOworCisgICAgaW50ZWxfZ3B1X2dldF9saW1pdHMoJnByb3BzLT5saW1pdHMpOworCisgICAgaW50ZWxfZ3B1X2dldF9zcGFyc2VfcHJvcGVydGllcygmcHJvcHMtPnNwYXJzZVByb3BlcnRpZXMpOworfQorCit2b2lkIGludGVsX2dwdV9nZXRfcXVldWVfcHJvcHMoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfZ3B1X2VuZ2luZV90eXBlIGVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAqcHJvcHMpCit7CisgICAgc3dpdGNoIChlbmdpbmUpIHsKKyAgICBjYXNlIElOVEVMX0dQVV9FTkdJTkVfM0Q6CisgICAgICAgIHByb3BzLT5xdWV1ZUZsYWdzID0gVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfQ09NUFVURV9CSVQ7CisgICAgICAgIHByb3BzLT5xdWV1ZUNvdW50ID0gMTsKKyAgICAgICAgcHJvcHMtPnRpbWVzdGFtcFZhbGlkQml0cyA9IDA7CisgICAgICAgIHByb3BzLT5taW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkud2lkdGggPSAxOworICAgICAgICBwcm9wcy0+bWluSW1hZ2VUcmFuc2ZlckdyYW51bGFyaXR5LmhlaWdodCA9IDE7CisgICAgICAgIHByb3BzLT5taW5JbWFnZVRyYW5zZmVyR3JhbnVsYXJpdHkuZGVwdGggPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bmtub3duIGVuZ2luZSB0eXBlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgaW50ZWxfZ3B1X2dldF9tZW1vcnlfcHJvcHMoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyAqcHJvcHMpCit7CisgICAgbWVtc2V0KHByb3BzLCAwLCBzaXplb2YoVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMpKTsKKyAgICBwcm9wcy0+bWVtb3J5VHlwZUNvdW50ID0gSU5URUxfTUVNT1JZX1RZUEVfQ09VTlQ7CisgICAgcHJvcHMtPm1lbW9yeUhlYXBDb3VudCA9IElOVEVMX01FTU9SWV9IRUFQX0NPVU5UOworCisgICAgLy8gRm9yIG5vdywgSW50ZWwgd2lsbCBzdXBwb3J0IG9uZSBtZW1vcnkgdHlwZQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwcm9wcy0+bWVtb3J5VHlwZUNvdW50OyBpKyspIHsKKyAgICAgICAgYXNzZXJ0KHByb3BzLT5tZW1vcnlUeXBlQ291bnQgPT0gMSk7CisgICAgICAgIHByb3BzLT5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzID0gSU5URUxfTUVNT1JZX1BST1BFUlRZX0FMTDsKKyAgICAgICAgcHJvcHMtPm1lbW9yeVR5cGVzW2ldLmhlYXBJbmRleCAgICAgPSBpOworICAgIH0KKworICAgIC8vIEZvciBub3csIEludGVsIHdpbGwgc3VwcG9ydCBhIHNpbmdsZSBoZWFwIHdpdGggYWxsIGF2YWlsYWJsZSBtZW1vcnkKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcHJvcHMtPm1lbW9yeUhlYXBDb3VudDsgaSsrKSB7CisgICAgICAgIGFzc2VydChwcm9wcy0+bWVtb3J5SGVhcENvdW50ID09IDEpOworICAgICAgICBwcm9wcy0+bWVtb3J5SGVhcHNbMF0uc2l6ZSA9IElOVEVMX01FTU9SWV9IRUFQX1NJWkU7CisgICAgfQorfQorCitpbnQgaW50ZWxfZ3B1X2dldF9tYXhfdGhyZWFkcyhjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpCit7CisgICAgc3dpdGNoIChpbnRlbF9ncHVfZ2VuKGdwdSkpIHsKKyAgICBjYXNlIElOVEVMX0dFTig3LjUpOgorICAgICAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKGdwdS0+Z3QgPj0gMikgPyAyODAgOiA3MDsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOgorICAgICAgICAgICAgLyogdmFsdWVzIGZyb20gaWxvX2dwZV9pbml0X2dzX2Nzb19nZW43ICovCisgICAgICAgICAgICByZXR1cm4gKGdwdS0+Z3QgPj0gMikgPyAyNTYgOiA3MDsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOgorICAgICAgICAgICAgcmV0dXJuIChncHUtPmd0ID09IDMpID8gNDA4IDoKKyAgICAgICAgICAgICAgICAgICAoZ3B1LT5ndCA9PSAyKSA/IDIwNCA6IDEwMjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URUxfR0VOKDcpOgorICAgICAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKGdwdS0+Z3QgPT0gMikgPyAxMjggOiAzNjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOgorICAgICAgICAgICAgLyogdmFsdWVzIGZyb20gaWxvX2dwZV9pbml0X2dzX2Nzb19nZW43ICovCisgICAgICAgICAgICByZXR1cm4gKGdwdS0+Z3QgPT0gMikgPyAxMjggOiAzNjsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOgorICAgICAgICAgICAgcmV0dXJuIChncHUtPmd0ID09IDIpID8gMTcyIDogNDg7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVMX0dFTig2KToKKyAgICAgICAgc3dpdGNoIChzdGFnZSkgeworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOgorICAgICAgICAgICAgcmV0dXJuIChncHUtPmd0ID09IDIpID8gNjAgOiAyNDsKKyAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOgorICAgICAgICAgICAgLyogdmFsdWVzIGZyb20gaWxvX2dwZV9pbml0X2dzX2Nzb19nZW42ICovCisgICAgICAgICAgICByZXR1cm4gKGdwdS0+Z3QgPT0gMikgPyAyOCA6IDIxOworICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKGdwdS0+Z3QgPT0gMikgPyA4MCA6IDQwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW50ZWxfbG9nKGdwdSwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsIDAsIFZLX05VTExfSEFORExFLAorICAgICAgICAgICAgMCwgMCwgInVua25vd24gR2VuIG9yIHNoYWRlciBzdGFnZSIpOworCisgICAgc3dpdGNoIChzdGFnZSkgeworICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQ6CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0dFT01FVFJZX0JJVDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOgorICAgICAgICByZXR1cm4gNDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK2ludCBpbnRlbF9ncHVfZ2V0X3ByaW1hcnlfZmQoc3RydWN0IGludGVsX2dwdSAqZ3B1KQoreworICAgIHJldHVybiBncHVfb3Blbl9wcmltYXJ5X25vZGUoZ3B1KTsKK30KKworVmtSZXN1bHQgaW50ZWxfZ3B1X2luaXRfd2luc3lzKHN0cnVjdCBpbnRlbF9ncHUgKmdwdSkKK3sKKyAgICBpbnQgZmQ7CisKKyAgICBhc3NlcnQoIWdwdS0+d2luc3lzKTsKKworICAgIGZkID0gZ3B1X29wZW5fcmVuZGVyX25vZGUoZ3B1KTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworCisgICAgZ3B1LT53aW5zeXMgPSBpbnRlbF93aW5zeXNfY3JlYXRlX2Zvcl9mZChncHUtPmhhbmRsZS5pbnN0YW5jZS0+aWNkLCBmZCk7CisgICAgaWYgKCFncHUtPndpbnN5cykgeworICAgICAgICBpbnRlbF9sb2coZ3B1LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwgMCwKKyAgICAgICAgICAgICAgICBWS19OVUxMX0hBTkRMRSwgMCwgMCwgImZhaWxlZCB0byBjcmVhdGUgR1BVIHdpbnN5cyIpOworICAgICAgICBncHVfY2xvc2VfcmVuZGVyX25vZGUoZ3B1KTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9ncHVfY2xlYW51cF93aW5zeXMoc3RydWN0IGludGVsX2dwdSAqZ3B1KQoreworICAgIGlmIChncHUtPndpbnN5cykgeworICAgICAgICBpbnRlbF93aW5zeXNfZGVzdHJveShncHUtPndpbnN5cyk7CisgICAgICAgIGdwdS0+d2luc3lzID0gTlVMTDsKKyAgICB9CisKKyAgICBncHVfY2xvc2VfcHJpbWFyeV9ub2RlKGdwdSk7CisgICAgZ3B1X2Nsb3NlX3JlbmRlcl9ub2RlKGdwdSk7Cit9CisKK2VudW0gaW50ZWxfcGh5X2Rldl9leHRfdHlwZSBpbnRlbF9ncHVfbG9va3VwX3BoeV9kZXZfZXh0ZW5zaW9uKAorICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgIGNvbnN0IGNoYXIgKmV4dCkKK3sKKyAgICB1aW50MzJfdCB0eXBlOworICAgIHVpbnQzMl90IGFycmF5X3NpemUgPSBBUlJBWV9TSVpFKGludGVsX3BoeV9kZXZfZ3B1X2V4dHMpOworCisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IGFycmF5X3NpemU7IHR5cGUrKykgeworICAgICAgICBpZiAoY29tcGFyZV92a19leHRlbnNpb25fcHJvcGVydGllcygmaW50ZWxfcGh5X2Rldl9ncHVfZXh0c1t0eXBlXSwgZXh0KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGFzc2VydCh0eXBlIDwgYXJyYXlfc2l6ZSB8fCB0eXBlID09IElOVEVMX1BIWV9ERVZfRVhUX0lOVkFMSUQpOworCisgICAgcmV0dXJuIHR5cGU7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgZ3B1XywKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogcFByb3BlcnRpZXMpCit7CisgICAgc3RydWN0IGludGVsX2dwdSAqZ3B1ID0gaW50ZWxfZ3B1KGdwdV8pOworCisgICAgaW50ZWxfZ3B1X2dldF9wcm9wcyhncHUsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlIGdwdV8sCisgICAgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKQoreworICAgc3RydWN0IGludGVsX2dwdSAqZ3B1ID0gaW50ZWxfZ3B1KGdwdV8pOworICAgaW50IGVuZ2luZTsKKworICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAqcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCA9IElOVEVMX0dQVV9FTkdJTkVfQ09VTlQ7CisgICAgICAgcmV0dXJuOworICAgfQorCisgICBmb3IgKGVuZ2luZSA9IDA7IGVuZ2luZSA8ICpwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50OyBlbmdpbmUrKykgeworICAgICAgIGludGVsX2dwdV9nZXRfcXVldWVfcHJvcHMoZ3B1LCBlbmdpbmUsIHBQcm9wZXJ0aWVzKTsKKyAgICAgICBwUHJvcGVydGllcysrOworICAgfQorfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlIGdwdV8sCisgICAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKQoreworICAgc3RydWN0IGludGVsX2dwdSAqZ3B1ID0gaW50ZWxfZ3B1KGdwdV8pOworCisgICBpbnRlbF9ncHVfZ2V0X21lbW9yeV9wcm9wcyhncHUsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMqIHBGZWF0dXJlcykKK3sKKyAgICAvKiBUT0RPOiBmaWxsIG91dCBmZWF0dXJlcyAqLworICAgIG1lbXNldChwRmVhdHVyZXMsIDAsIHNpemVvZigqcEZlYXR1cmVzKSk7CisgICAgcEZlYXR1cmVzLT5zaGFkZXJDbGlwRGlzdGFuY2UgPSAxOworICAgIHBGZWF0dXJlcy0+b2NjbHVzaW9uUXVlcnlQcmVjaXNlID0gMTsKK30KKwordm9pZCBpbnRlbF9ncHVfZ2V0X3NwYXJzZV9wcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzICpwUHJvcHMpCit7CisgICAgbWVtc2V0KHBQcm9wcywgMCwgc2l6ZW9mKCpwUHJvcHMpKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICAgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJOYW1lLAorICAgICAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgIHVpbnQzMl90IGNvcHlfc2l6ZTsKKyAgICB1aW50MzJfdCBleHRlbnNpb25fY291bnQgPSBBUlJBWV9TSVpFKGludGVsX3BoeV9kZXZfZ3B1X2V4dHMpOworCisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gSU5URUxfUEhZX0RFVl9FWFRfQ09VTlQ7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGNvcHlfc2l6ZSA9ICpwUHJvcGVydHlDb3VudCA8IGV4dGVuc2lvbl9jb3VudCA/ICpwUHJvcGVydHlDb3VudCA6IGV4dGVuc2lvbl9jb3VudDsKKyAgICBtZW1jcHkocFByb3BlcnRpZXMsIGludGVsX3BoeV9kZXZfZ3B1X2V4dHMsIGNvcHlfc2l6ZSAqIHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpKTsKKyAgICAqcFByb3BlcnR5Q291bnQgPSBjb3B5X3NpemU7CisgICAgaWYgKGNvcHlfc2l6ZSA8IGV4dGVuc2lvbl9jb3VudCkgeworICAgICAgICByZXR1cm4gVktfSU5DT01QTEVURTsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKAorICAgICAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgICAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgICpwUHJvcGVydHlDb3VudCA9IDA7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLAorICAgIFZrSW1hZ2VVc2FnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyogICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgICpwUHJvcGVydHlDb3VudCA9IDA7Cit9CisKK0lDRF9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBJQ0RfRVhQT1JUIFZLQVBJX0NBTEwgdmtfaWNkTmVnb3RpYXRlTG9hZGVySUNESW50ZXJmYWNlVmVyc2lvbih1aW50MzJfdCAqcFZlcnNpb24pCit7CisgICAgaWYgKCpwVmVyc2lvbiA+IDIpIHsKKyAgICAgICpwVmVyc2lvbiA9IDI7CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2dwdS5oIGIvaWNkL2ludGVsL2dwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDBiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvZ3B1LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBHUFVfSAorI2RlZmluZSBHUFVfSAorCisjaW5jbHVkZSAiaW50ZWwuaCIKKyNpbmNsdWRlICJleHRlbnNpb25faW5mby5oIgorCisjZGVmaW5lIElOVEVMX0dQVV9BU1NFUlQoZ3B1LCBtaW5fZ2VuLCBtYXhfZ2VuKSAgIFwKKyAgICAgICBhc3NlcnQoaW50ZWxfZ3B1X2dlbihncHUpID49IElOVEVMX0dFTihtaW5fZ2VuKSAmJiBcCisgICAgICAgICAgICAgIGludGVsX2dwdV9nZW4oZ3B1KSA8PSBJTlRFTF9HRU4obWF4X2dlbikpCisKK2VudW0gaW50ZWxfZ3B1X2VuZ2luZV90eXBlIHsKKyAgICAvKiBUT0RPIEJMVCBzdXBwb3J0ICovCisgICAgSU5URUxfR1BVX0VOR0lORV8zRCwKKworICAgIElOVEVMX0dQVV9FTkdJTkVfQ09VTlQKK307CisKK3N0cnVjdCBpbnRlbF9pbnN0YW5jZTsKK3N0cnVjdCBpbnRlbF93c2lfZGlzcGxheTsKK3N0cnVjdCBpbnRlbF93aW5zeXM7CisKKy8qCisgKiBpbnRlbF9ncHUgaXMgdGhlIG9ubHkgb2JqZWN0IHRoYXQgZG9lcyBub3QgaW5oZXJpdCBmcm9tIGludGVsX2Jhc2UuCisgKi8KK3N0cnVjdCBpbnRlbF9ncHUgeworICAgIHN0cnVjdCBpbnRlbF9oYW5kbGUgaGFuZGxlOworCisgICAgc3RydWN0IGludGVsX2dwdSAqbmV4dDsKKworICAgIGludCBkZXZpZDsgICAgICAgICAgLyogUENJIGRldmljZSBJRCAqLworICAgIGNoYXIgKnByaW1hcnlfbm9kZTsgLyogcGF0aCB0byB0aGUgcHJpbWFyeSBub2RlICovCisgICAgY2hhciAqcmVuZGVyX25vZGU7ICAvKiBwYXRoIHRvIHRoZSByZW5kZXIgbm9kZSAqLworICAgIGludCBnZW5fb3BhcXVlOyAgICAgLyogYWx3YXlzIHJlYWQgdGhpcyB3aXRoIGludGVsX2dwdV9nZW4oKSAqLworICAgIGludCBndDsKKworICAgIFZrRGV2aWNlU2l6ZSBtYXhfYmF0Y2hfYnVmZmVyX3NpemU7CisgICAgdWludDMyX3QgYmF0Y2hfYnVmZmVyX3JlbG9jX2NvdW50OworCisgICAgLyoKKyAgICAgKiBUaGUgZW5hYmxlZCBoYXJkd2FyZSBmZWF0dXJlcyBjb3VsZCBiZSBsaW1pdGVkIGJ5IHRoZSBrZXJuZWwuICBUaGVzZQorICAgICAqIG11dGFibGUgZmRzIGFsbG93cyB1cyB0byB0YWxrIHRvIHRoZSBrZXJuZWwgYmVmb3JlIHRoZSBkZXZpY2UgaXMKKyAgICAgKiBjcmVhdGVkLgorICAgICAqLworICAgIGludCBwcmltYXJ5X2ZkX2ludGVybmFsOworICAgIGludCByZW5kZXJfZmRfaW50ZXJuYWw7CisKKyAgICBzdHJ1Y3QgaW50ZWxfd2luc3lzICp3aW5zeXM7CisKKyAgICBzdHJ1Y3QgaW50ZWxfd3NpX2Rpc3BsYXkgKipkaXNwbGF5czsKKyAgICB1aW50MzJfdCBkaXNwbGF5X2NvdW50OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZ3B1ICppbnRlbF9ncHUoVmtQaHlzaWNhbERldmljZSBncHUpCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfZ3B1ICopIGdwdTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW50ZWxfZ3B1X2dlbihjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpCit7CisjaWZkZWYgSU5URUxfR0VOX1NQRUNJQUxJWkVECisgICAgcmV0dXJuIElOVEVMX0dFTihJTlRFTF9HRU5fU1BFQ0lBTElaRUQpOworI2Vsc2UKKyAgICByZXR1cm4gZ3B1LT5nZW5fb3BhcXVlOworI2VuZGlmCit9CisKK1ZrUmVzdWx0IGludGVsX2dwdV9jcmVhdGUoY29uc3Qgc3RydWN0IGludGVsX2luc3RhbmNlICppbnN0YW5jZSwgaW50IGRldmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByaW1hcnlfbm9kZSwgY29uc3QgY2hhciAqcmVuZGVyX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2dwdSAqKmdwdV9yZXQpOwordm9pZCBpbnRlbF9ncHVfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpOworCisKK3ZvaWQgaW50ZWxfZ3B1X2dldF9wcm9wcyhjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMgKnByb3BzKTsKKwordm9pZCBpbnRlbF9ncHVfZ2V0X3NwYXJzZV9wcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2VTcGFyc2VQcm9wZXJ0aWVzICpwUHJvcHMpOworCit2b2lkIGludGVsX2dwdV9nZXRfbGltaXRzKFZrUGh5c2ljYWxEZXZpY2VMaW1pdHMgKnBMaW1pdHMpOworCit2b2lkIGludGVsX2dwdV9nZXRfcXVldWVfcHJvcHMoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfZ3B1X2VuZ2luZV90eXBlIGVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyAqcHJvcHMpOwordm9pZCBpbnRlbF9ncHVfZ2V0X21lbW9yeV9wcm9wcyhjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzICpwcm9wcyk7CisKK2ludCBpbnRlbF9ncHVfZ2V0X21heF90aHJlYWRzKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSk7CisKK2ludCBpbnRlbF9ncHVfZ2V0X3ByaW1hcnlfZmQoc3RydWN0IGludGVsX2dwdSAqZ3B1KTsKKworVmtSZXN1bHQgaW50ZWxfZ3B1X2luaXRfd2luc3lzKHN0cnVjdCBpbnRlbF9ncHUgKmdwdSk7Cit2b2lkIGludGVsX2dwdV9jbGVhbnVwX3dpbnN5cyhzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpOworCitlbnVtIGludGVsX3BoeV9kZXZfZXh0X3R5cGUgaW50ZWxfZ3B1X2xvb2t1cF9waHlfZGV2X2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbk5hbWUpOworCisjZW5kaWYgLyogR1BVX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9pbWcuYyBiL2ljZC9pbnRlbC9pbWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThmMjMyYgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9pbWcuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJrbWQvd2luc3lzLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiZ3B1LmgiCisjaW5jbHVkZSAid3NpLmgiCisjaW5jbHVkZSAiaW1nLmgiCisKKy8qCisgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDEgcGFydCAxLCBwYWdlIDEwNToKKyAqCisgKiAgICAgIkluIGFkZGl0aW9uIHRvIHJlc3RyaWN0aW9ucyBvbiBtYXhpbXVtIGhlaWdodCwgd2lkdGgsIGFuZCBkZXB0aCwKKyAqICAgICAgc3VyZmFjZXMgYXJlIGFsc28gcmVzdHJpY3RlZCB0byBhIG1heGltdW0gc2l6ZSBpbiBieXRlcy4gVGhpcworICogICAgICBtYXhpbXVtIGlzIDIgR0IgZm9yIGFsbCBwcm9kdWN0cyBhbmQgYWxsIHN1cmZhY2UgdHlwZXMuIgorICovCitzdGF0aWMgY29uc3Qgc2l6ZV90IGludGVsX21heF9yZXNvdXJjZV9zaXplID0gMXUgPDwgMzE7CisKK3N0YXRpYyB2b2lkIGltZ19kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWcgPSBpbnRlbF9pbWdfZnJvbV9vYmoob2JqKTsKKworICAgIGludGVsX2ltZ19kZXN0cm95KGltZyk7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBpbWdfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMoc3RydWN0IGludGVsX2Jhc2UgKmJhc2UsIFZrTWVtb3J5UmVxdWlyZW1lbnRzICpwUmVxdWlyZW1lbnRzKQoreworICAgIHN0cnVjdCBpbnRlbF9pbWcgKmltZyA9IGludGVsX2ltZ19mcm9tX2Jhc2UoYmFzZSk7CisKKyAgICBwUmVxdWlyZW1lbnRzLT5zaXplID0gaW1nLT50b3RhbF9zaXplOworICAgIHBSZXF1aXJlbWVudHMtPmFsaWdubWVudCA9IDQwOTY7CisgICAgcFJlcXVpcmVtZW50cy0+bWVtb3J5VHlwZUJpdHMgPSAoMSA8PCBJTlRFTF9NRU1PUllfVFlQRV9DT1VOVCkgLSAxOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZrUmVzdWx0IGludGVsX2ltZ19jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2Nhbm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2ltZyAqKmltZ19yZXQpCit7CisgICAgc3RydWN0IGludGVsX2ltZyAqaW1nOworICAgIHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dDsKKworICAgIGltZyA9IChzdHJ1Y3QgaW50ZWxfaW1nICopIGludGVsX2Jhc2VfY3JlYXRlKCZkZXYtPmJhc2UuaGFuZGxlLAorICAgICAgICAgICAgc2l6ZW9mKCppbWcpLCBkZXYtPmJhc2UuZGJnLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhULCBpbmZvLCAwKTsKKyAgICBpZiAoIWltZykKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIGxheW91dCA9ICZpbWctPmxheW91dDsKKworICAgIGltZy0+dHlwZSA9IGluZm8tPmltYWdlVHlwZTsKKyAgICBpbWctPmRlcHRoID0gaW5mby0+ZXh0ZW50LmRlcHRoOworICAgIGltZy0+bWlwX2xldmVscyA9IGluZm8tPm1pcExldmVsczsKKyAgICBpbWctPmFycmF5X3NpemUgPSBpbmZvLT5hcnJheUxheWVyczsKKyAgICBpbWctPnVzYWdlID0gaW5mby0+dXNhZ2U7CisgICAgaW1nLT5zYW1wbGVfY291bnQgPSAodWludDMyX3QpIGluZm8tPnNhbXBsZXM7CisgICAgaW50ZWxfbGF5b3V0X2luaXQobGF5b3V0LCBkZXYsIGluZm8sIHNjYW5vdXQpOworCisgICAgaW1nLT50b3RhbF9zaXplID0gaW1nLT5sYXlvdXQuYm9fc3RyaWRlICogaW1nLT5sYXlvdXQuYm9faGVpZ2h0OworCisgICAgaWYgKGxheW91dC0+YXV4ICE9IElOVEVMX0xBWU9VVF9BVVhfTk9ORSkgeworICAgICAgICBpbWctPmF1eF9vZmZzZXQgPSB1X2FsaWduKGltZy0+dG90YWxfc2l6ZSwgNDA5Nik7CisgICAgICAgIGltZy0+dG90YWxfc2l6ZSA9IGltZy0+YXV4X29mZnNldCArCisgICAgICAgICAgICBsYXlvdXQtPmF1eF9zdHJpZGUgKiBsYXlvdXQtPmF1eF9oZWlnaHQ7CisgICAgfQorCisgICAgaWYgKGxheW91dC0+c2VwYXJhdGVfc3RlbmNpbCkgeworICAgICAgICBWa0ltYWdlQ3JlYXRlSW5mbyBzOF9pbmZvOworCisgICAgICAgIGltZy0+czhfbGF5b3V0ID0gaW50ZWxfYWxsb2MoaW1nLCBzaXplb2YoKmltZy0+czhfbGF5b3V0KSwgc2l6ZW9mKGludCksCisgICAgICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICAgICAgaWYgKCFpbWctPnM4X2xheW91dCkgeworICAgICAgICAgICAgaW50ZWxfaW1nX2Rlc3Ryb3koaW1nKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBzOF9pbmZvID0gKmluZm87CisgICAgICAgIHM4X2luZm8uZm9ybWF0ID0gVktfRk9STUFUX1M4X1VJTlQ7CisgICAgICAgIC8qIG5vIHN0ZW5jaWwgdGV4dHVyaW5nICovCisgICAgICAgIHM4X2luZm8udXNhZ2UgJj0gflZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUOworICAgICAgICBhc3NlcnQoaWNkX2Zvcm1hdF9pc19kcyhpbmZvLT5mb3JtYXQpKTsKKworICAgICAgICBpbnRlbF9sYXlvdXRfaW5pdChpbWctPnM4X2xheW91dCwgZGV2LCAmczhfaW5mbywgc2Nhbm91dCk7CisKKyAgICAgICAgaW1nLT5zOF9vZmZzZXQgPSB1X2FsaWduKGltZy0+dG90YWxfc2l6ZSwgNDA5Nik7CisgICAgICAgIGltZy0+dG90YWxfc2l6ZSA9IGltZy0+czhfb2Zmc2V0ICsKKyAgICAgICAgICAgIGltZy0+czhfbGF5b3V0LT5ib19zdHJpZGUgKiBpbWctPnM4X2xheW91dC0+Ym9faGVpZ2h0OworICAgIH0KKworICAgIGlmIChzY2Fub3V0KSB7CisgICAgICAgIFZrUmVzdWx0IHJldCA9IGludGVsX3dzaV9pbWdfaW5pdChpbWcpOworICAgICAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGludGVsX2ltZ19kZXN0cm95KGltZyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaW1nLT5vYmouZGVzdHJveSA9IGltZ19kZXN0cm95OworICAgIGltZy0+b2JqLmJhc2UuZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMgPSBpbWdfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHM7CisKKyAgICAqaW1nX3JldCA9IGltZzsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2ltZ19kZXN0cm95KHN0cnVjdCBpbnRlbF9pbWcgKmltZykKK3sKKyAgICBpZiAoaW1nLT53c2lfZGF0YSkKKyAgICAgICAgaW50ZWxfd3NpX2ltZ19jbGVhbnVwKGltZyk7CisKKyAgICBpZiAoaW1nLT5zOF9sYXlvdXQpCisgICAgICAgIGludGVsX2ZyZWUoaW1nLCBpbWctPnM4X2xheW91dCk7CisKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJmltZy0+b2JqLmJhc2UpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYgPSBpbnRlbF9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBpbnRlbF9pbWdfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIGZhbHNlLAorICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9pbWcgKiopIHBJbWFnZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUltYWdlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQorCisgeworICAgIHN0cnVjdCBpbnRlbF9vYmogKm9iaiA9IGludGVsX29iaihpbWFnZSk7CisKKyAgICBvYmotPmRlc3Ryb3kob2JqKTsKKyB9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZSogICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLAorICAgIFZrU3VicmVzb3VyY2VMYXlvdXQqICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfaW1nICppbWcgPSBpbnRlbF9pbWcoaW1hZ2UpOworICAgIHVuc2lnbmVkIHgsIHk7CisKKyAgICBpbnRlbF9sYXlvdXRfZ2V0X3NsaWNlX3BvcygmaW1nLT5sYXlvdXQsIHBTdWJyZXNvdXJjZS0+bWlwTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLT5hcnJheUxheWVyLCAmeCwgJnkpOworICAgIGludGVsX2xheW91dF9wb3NfdG9fbWVtKCZpbWctPmxheW91dCwgeCwgeSwgJngsICZ5KTsKKworICAgIHBMYXlvdXQtPm9mZnNldCA9IGludGVsX2xheW91dF9tZW1fdG9fbGluZWFyKCZpbWctPmxheW91dCwgeCwgeSk7CisgICAgcExheW91dC0+c2l6ZSA9IGludGVsX2xheW91dF9nZXRfc2xpY2Vfc2l6ZSgmaW1nLT5sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdWJyZXNvdXJjZS0+bWlwTGV2ZWwpOworICAgIHBMYXlvdXQtPnJvd1BpdGNoID0gaW1nLT5sYXlvdXQuYm9fc3RyaWRlOworICAgIHBMYXlvdXQtPmRlcHRoUGl0Y2ggPSBpbnRlbF9sYXlvdXRfZ2V0X3NsaWNlX3N0cmlkZSgmaW1nLT5sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1YnJlc291cmNlLT5taXBMZXZlbCk7CisgICAgcExheW91dC0+YXJyYXlQaXRjaCA9IGludGVsX2xheW91dF9nZXRfc2xpY2Vfc3RyaWRlKCZpbWctPmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VicmVzb3VyY2UtPmFycmF5TGF5ZXIpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCwKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgKnBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50ID0gMDsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9pbWcuaCBiL2ljZC9pbnRlbC9pbWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFmN2JjCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2ltZy5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBJTUdfSAorI2RlZmluZSBJTUdfSAorCisjaW5jbHVkZSAia21kL3dpbnN5cy5oIgorI2luY2x1ZGUgImludGVsLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAib2JqLmgiCisKK3N0cnVjdCBpbnRlbF9pbWcgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgVmtJbWFnZVR5cGUgdHlwZTsKKyAgICBpbnQzMl90IGRlcHRoOworICAgIHVpbnQzMl90IG1pcF9sZXZlbHM7CisgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKyAgICBWa0ZsYWdzIHVzYWdlOworICAgIHVpbnQzMl90IHNhbXBsZV9jb3VudDsKKyAgICBzdHJ1Y3QgaW50ZWxfbGF5b3V0IGxheW91dDsKKworICAgIC8qIGxheW91dCBvZiBzZXBhcmF0ZSBzdGVuY2lsICovCisgICAgc3RydWN0IGludGVsX2xheW91dCAqczhfbGF5b3V0OworCisgICAgc2l6ZV90IHRvdGFsX3NpemU7CisgICAgc2l6ZV90IGF1eF9vZmZzZXQ7CisgICAgc2l6ZV90IHM4X29mZnNldDsKKworICAgIHZvaWQgKndzaV9kYXRhOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfaW1nICppbnRlbF9pbWcoVmtJbWFnZSBpbWFnZSkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfaW1nICoqKSAmaW1hZ2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2ltZyAqaW50ZWxfaW1nX2Zyb21fYmFzZShzdHJ1Y3QgaW50ZWxfYmFzZSAqYmFzZSkKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9pbWcgKikgYmFzZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfaW1nICppbnRlbF9pbWdfZnJvbV9vYmooc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHJldHVybiBpbnRlbF9pbWdfZnJvbV9iYXNlKCZvYmotPmJhc2UpOworfQorCitWa1Jlc3VsdCBpbnRlbF9pbWdfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNjYW5vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9pbWcgKippbWdfcmV0KTsKKwordm9pZCBpbnRlbF9pbWdfZGVzdHJveShzdHJ1Y3QgaW50ZWxfaW1nICppbWcpOworCitzdGF0aWMgaW5saW5lIGJvb2wgaW50ZWxfaW1nX2Nhbl9lbmFibGVfaGl6KGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGV2ZWwpCit7CisgICAgcmV0dXJuIChpbWctPmxheW91dC5hdXggPT0gSU5URUxfTEFZT1VUX0FVWF9ISVogJiYKKyAgICAgICAgICAgIGltZy0+bGF5b3V0LmF1eF9lbmFibGVzICYgKDEgPDwgbGV2ZWwpKTsKK30KKworI2VuZGlmIC8qIElNR19IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvaW5zdGFuY2UuYyBiL2ljZC9pbnRlbC9pbnN0YW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjRjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvaW5zdGFuY2UuYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiaWNkLWVudW1lcmF0ZS1kcm0uaCIKKyNpbmNsdWRlICJncHUuaCIKKyNpbmNsdWRlICJpbnN0YW5jZS5oIgorCitzdGF0aWMgaW50IGludGVsX2RldmlkX292ZXJyaWRlOworaW50IGludGVsX2RlYnVnID0gLTE7CisKK3ZvaWQgKmludGVsX2FsbG9jKGNvbnN0IHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU3lzdGVtQWxsb2NhdGlvblNjb3BlIHNjb3BlKQoreworICAgIGFzc2VydChpbnRlbF9oYW5kbGVfdmFsaWRhdGUoaGFuZGxlKSk7CisgICAgcmV0dXJuIGljZF9pbnN0YW5jZV9hbGxvYygoKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKikgaGFuZGxlKS0+aW5zdGFuY2UtPmljZCwKKyAgICAgICAgICAgIHNpemUsIGFsaWdubWVudCwgc2NvcGUpOworfQorCit2b2lkIGludGVsX2ZyZWUoY29uc3Qgdm9pZCAqaGFuZGxlLCB2b2lkICpwdHIpCit7CisgICAgYXNzZXJ0KGludGVsX2hhbmRsZV92YWxpZGF0ZShoYW5kbGUpKTsKKyAgICBpY2RfaW5zdGFuY2VfZnJlZSgoKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKikgaGFuZGxlKS0+aW5zdGFuY2UtPmljZCwgcHRyKTsKK30KKwordm9pZCBpbnRlbF9sb2d2KGNvbnN0IHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBWa0ZsYWdzIG1zZ19mbGFncywKKyAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmpfdHlwZSwgdWludDY0X3Qgc3JjX29iamVjdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnX2NvZGUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgIGNoYXIgbXNnWzI1Nl07CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHZzbnByaW50Zihtc2csIHNpemVvZihtc2cpLCBmb3JtYXQsIGFwKTsKKyAgICBpZiAocmV0ID49IHNpemVvZihtc2cpIHx8IHJldCA8IDApCisgICAgICAgIG1zZ1tzaXplb2YobXNnKSAtIDFdID0gJ1wwJzsKKworICAgIGFzc2VydChpbnRlbF9oYW5kbGVfdmFsaWRhdGUoaGFuZGxlKSk7CisgICAgaWNkX2luc3RhbmNlX2xvZygoKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKikgaGFuZGxlKS0+aW5zdGFuY2UtPmljZCwKKyAgICAgICAgICAgICAgICAgICAgIG1zZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgIG9ial90eXBlLCBzcmNfb2JqZWN0LCAgICAgICAgICAgICAgLyogb2JqX3R5cGUsIG9iamVjdCAqLworICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIG1zZ19jb2RlLCAgICAgICAgICAgICAgICAvKiBsb2NhdGlvbiwgbXNnX2NvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2RlYnVnX2luaXQodm9pZCkKK3sKKyAgICBjb25zdCBjaGFyICplbnY7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgPj0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50ZWxfZGVidWcgPSAwOworCisgICAgLyogcGFyc2UgY29tbWEtc2VwYXJhdGVkIGRlYnVnIG9wdGlvbnMgKi8KKyAgICBlbnYgPSBnZXRlbnYoIlZLX0lOVEVMX0RFQlVHIik7CisgICAgd2hpbGUgKGVudikgeworICAgICAgICBjb25zdCBjaGFyICpwID0gc3RyY2hyKGVudiwgJywnKTsKKyAgICAgICAgc2l6ZV90IGxlbjsKKworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGxlbiA9IHAgLSBlbnY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbihlbnYpOworCisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChlbnYsICJiYXRjaCIsIGxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgIGludGVsX2RlYnVnIHw9IElOVEVMX0RFQlVHX0JBVENIOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKGVudiwgIm5vaHciLCBsZW4pID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnRlbF9kZWJ1ZyB8PSBJTlRFTF9ERUJVR19OT0hXOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKGVudiwgIm5vY2FjaGUiLCBsZW4pID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnRlbF9kZWJ1ZyB8PSBJTlRFTF9ERUJVR19OT0NBQ0hFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKGVudiwgIm5vaGl6IiwgbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50ZWxfZGVidWcgfD0gSU5URUxfREVCVUdfTk9ISVo7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoZW52LCAiaGFuZyIsIGxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgIGludGVsX2RlYnVnIHw9IElOVEVMX0RFQlVHX0hBTkc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoZW52LCAiMHgiLCAyKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50ZWxfZGVidWcgfD0gSU5URUxfREVCVUdfTk9IVzsKKyAgICAgICAgICAgICAgICBpbnRlbF9kZXZpZF9vdmVycmlkZSA9IHN0cnRvbChlbnYsIE5VTEwsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGVudiA9IHAgKyAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaW50ZWxfaW5zdGFuY2VfYWRkX2dwdShzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpCit7CisgICAgZ3B1LT5uZXh0ID0gaW5zdGFuY2UtPmdwdXM7CisgICAgaW5zdGFuY2UtPmdwdXMgPSBncHU7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2luc3RhbmNlX3JlbW92ZV9ncHVzKHN0cnVjdCBpbnRlbF9pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisgICAgc3RydWN0IGludGVsX2dwdSAqZ3B1ID0gaW5zdGFuY2UtPmdwdXM7CisKKyAgICB3aGlsZSAoZ3B1KSB7CisgICAgICAgIHN0cnVjdCBpbnRlbF9ncHUgKm5leHQgPSBncHUtPm5leHQ7CisKKyAgICAgICAgaW50ZWxfZ3B1X2Rlc3Ryb3koZ3B1KTsKKyAgICAgICAgZ3B1ID0gbmV4dDsKKyAgICB9CisKKyAgICBpbnN0YW5jZS0+Z3B1cyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2luc3RhbmNlX2Rlc3Ryb3koc3RydWN0IGludGVsX2luc3RhbmNlICppbnN0YW5jZSkKK3sKKyAgICBzdHJ1Y3QgaWNkX2luc3RhbmNlICppY2QgPSBpbnN0YW5jZS0+aWNkOworCisgICAgaW50ZWxfaW5zdGFuY2VfcmVtb3ZlX2dwdXMoaW5zdGFuY2UpOworICAgIGljZF9pbnN0YW5jZV9mcmVlKGljZCwgaW5zdGFuY2UpOworCisgICAgaWNkX2luc3RhbmNlX2Rlc3Ryb3koaWNkKTsKK30KKworc3RhdGljIFZrUmVzdWx0IGludGVsX2luc3RhbmNlX2NyZWF0ZSgKKyAgICAgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIGluZm8sCisgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogYWxsb2NhdG9yLAorICAgICAgICBzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKipwSW5zdGFuY2UpCit7CisgICAgc3RydWN0IGludGVsX2luc3RhbmNlICppbnN0YW5jZTsKKyAgICBzdHJ1Y3QgaWNkX2luc3RhbmNlICppY2Q7CisgICAgdWludDMyX3QgaTsKKworICAgIGludGVsX2RlYnVnX2luaXQoKTsKKworICAgIGljZCA9IGljZF9pbnN0YW5jZV9jcmVhdGUoaW5mby0+cEFwcGxpY2F0aW9uSW5mbywgYWxsb2NhdG9yKTsKKyAgICBpZiAoIWljZCkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIGluc3RhbmNlID0gaWNkX2luc3RhbmNlX2FsbG9jKGljZCwgc2l6ZW9mKCppbnN0YW5jZSksIHNpemVvZihpbnQpLAorICAgICAgICAgICAgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfSU5TVEFOQ0UpOworICAgIGlmICghaW5zdGFuY2UpIHsKKyAgICAgICAgaWNkX2luc3RhbmNlX2Rlc3Ryb3koaWNkKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQoaW5zdGFuY2UsIDAsIHNpemVvZigqaW5zdGFuY2UpKTsKKyAgICBpbnRlbF9oYW5kbGVfaW5pdCgmaW5zdGFuY2UtPmhhbmRsZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lOU1RBTkNFX0VYVCwgaW5zdGFuY2UpOworCisgICAgaW5zdGFuY2UtPmljZCA9IGljZDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBlbnVtIGludGVsX2dsb2JhbF9leHRfdHlwZSBleHQgPQorICAgICAgICAgICAgaW50ZWxfZ3B1X2xvb2t1cF9nbG9iYWxfZXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisKKyAgICAgICAgaWYgKGV4dCAhPSBJTlRFTF9HTE9CQUxfRVhUX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIGluc3RhbmNlLT5nbG9iYWxfZXh0c1tleHRdID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZhaWwgY3JlYXRlIGlmIGV4dGVuc2lvbnMgYXJlIHNwZWNpZmllZCB0aGF0CisgICAgICAgICAgICAgKiBJQ0QgY2Fubm90IHNhdGlzZnkuIExvYWRlciB3aWxsIGZpbHRlciBvdXQgZXh0ZW5zaW9ucyAvIGxheWVycworICAgICAgICAgICAgICogbm90IG1lYW50IGJ5IHRoZSBJQ0QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGljZF9pbnN0YW5jZV9kZXN0cm95KGljZCk7CisgICAgICAgICAgICBpbnRlbF9pbnN0YW5jZV9kZXN0cm95KGluc3RhbmNlKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9FWFRFTlNJT05fTk9UX1BSRVNFTlQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoaXMgSUNEIGRvZXMgbm90IHN1cHBvcnQgYW55IGxheWVycy4KKyAgICAgKi8KKyAgICBpZiAoaW5mby0+ZW5hYmxlZExheWVyQ291bnQgPiAwKSB7CisgICAgICAgIGljZF9pbnN0YW5jZV9kZXN0cm95KGljZCk7CisgICAgICAgIGludGVsX2luc3RhbmNlX2Rlc3Ryb3koaW5zdGFuY2UpOworICAgICAgICByZXR1cm4gVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQ7CisgICAgfQorCisgICAgKnBJbnN0YW5jZSA9IGluc3RhbmNlOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK2VudW0gaW50ZWxfZ2xvYmFsX2V4dF90eXBlIGludGVsX2dwdV9sb29rdXBfZ2xvYmFsX2V4dGVuc2lvbigKKyAgICAgICAgY29uc3QgY2hhciAqZXh0ZW5zaW9uTmFtZSkKK3sKKyAgICBlbnVtIGludGVsX2dsb2JhbF9leHRfdHlwZSB0eXBlOworCisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IEFSUkFZX1NJWkUoaW50ZWxfZ2xvYmFsX2V4dHMpOyB0eXBlKyspIHsKKyAgICAgICAgaWYgKGNvbXBhcmVfdmtfZXh0ZW5zaW9uX3Byb3BlcnRpZXMoJmludGVsX2dsb2JhbF9leHRzW3R5cGVdLCBleHRlbnNpb25OYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGFzc2VydCh0eXBlIDwgSU5URUxfR0xPQkFMX0VYVF9DT1VOVCB8fCB0eXBlID09IElOVEVMX0dMT0JBTF9FWFRfSU5WQUxJRCk7CisKKyAgICByZXR1cm4gdHlwZTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0luc3RhbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UpCit7CisgICAgcmV0dXJuIGludGVsX2luc3RhbmNlX2NyZWF0ZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwKKyAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKiopIHBJbnN0YW5jZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUluc3RhbmNlKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIHN0cnVjdCBpbnRlbF9pbnN0YW5jZSAqaW5zdGFuY2UgPSBpbnRlbF9pbnN0YW5jZShwSW5zdGFuY2UpOworCisgICAgaW50ZWxfaW5zdGFuY2VfZGVzdHJveShpbnN0YW5jZSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJOYW1lLAorICAgICAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMqICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgIHVpbnQzMl90IGNvcHlfc2l6ZTsKKworICAgIGlmIChwUHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICpwUHJvcGVydHlDb3VudCA9IElOVEVMX0dMT0JBTF9FWFRfQ09VTlQ7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGNvcHlfc2l6ZSA9ICpwUHJvcGVydHlDb3VudCA8IElOVEVMX0dMT0JBTF9FWFRfQ09VTlQgPyAqcFByb3BlcnR5Q291bnQgOiBJTlRFTF9HTE9CQUxfRVhUX0NPVU5UOworICAgIG1lbWNweShwUHJvcGVydGllcywgaW50ZWxfZ2xvYmFsX2V4dHMsIGNvcHlfc2l6ZSAqIHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpKTsKKyAgICAqcFByb3BlcnR5Q291bnQgPSBjb3B5X3NpemU7CisgICAgaWYgKGNvcHlfc2l6ZSA8IElOVEVMX0dMT0JBTF9FWFRfQ09VTlQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKAorICAgICAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgICAgICBWa0xheWVyUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzKQoreworICAgICpwUHJvcGVydHlDb3VudCA9IDA7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsR1BVID0gMDsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlXywKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICBwUGh5c2ljYWxEZXZpY2VzKQoreworICAgIHN0cnVjdCBpbnRlbF9pbnN0YW5jZSAqaW5zdGFuY2UgPSBpbnRlbF9pbnN0YW5jZShpbnN0YW5jZV8pOworICAgIHN0cnVjdCBpY2RfZHJtX2RldmljZSAqZGV2aWNlcywgKmRldjsKKyAgICBWa1Jlc3VsdCByZXQ7CisgICAgdWludDMyX3QgY291bnQ7CisKKyAgICBpZiAocFBoeXNpY2FsRGV2aWNlcyA9PSBOVUxMKSB7CisgICAgICAgICpwUGh5c2ljYWxEZXZpY2VDb3VudCA9IDE7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChwaHlzaWNhbEdQVSkKKyAgICB7CisgICAgICAgICpwUGh5c2ljYWxEZXZpY2VDb3VudCA9IDE7CisgICAgICAgIHBQaHlzaWNhbERldmljZXNbMF0gPSBwaHlzaWNhbEdQVTsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgaW50ZWxfaW5zdGFuY2VfcmVtb3ZlX2dwdXMoaW5zdGFuY2UpOworCisgICAgZGV2aWNlcyA9IGljZF9kcm1fZW51bWVyYXRlKGluc3RhbmNlLT5pY2QsIDB4ODA4Nik7CisKKyAgICBjb3VudCA9IDA7CisgICAgZGV2ID0gZGV2aWNlczsKKyAgICB3aGlsZSAoZGV2KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnByaW1hcnlfbm9kZSwgKnJlbmRlcl9ub2RlOworICAgICAgICBpbnQgZGV2aWQ7CisgICAgICAgIHN0cnVjdCBpbnRlbF9ncHUgKmdwdTsKKworICAgICAgICBwcmltYXJ5X25vZGUgPSBpY2RfZHJtX2dldF9kZXZub2RlKGRldiwgSUNEX0RSTV9NSU5PUl9MRUdBQ1kpOworICAgICAgICBpZiAoIXByaW1hcnlfbm9kZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJlbmRlcl9ub2RlID0gaWNkX2RybV9nZXRfZGV2bm9kZShkZXYsIElDRF9EUk1fTUlOT1JfUkVOREVSKTsKKworICAgICAgICBkZXZpZCA9IChpbnRlbF9kZXZpZF9vdmVycmlkZSkgPyBpbnRlbF9kZXZpZF9vdmVycmlkZSA6IGRldi0+ZGV2aWQ7CisgICAgICAgIHJldCA9IGludGVsX2dwdV9jcmVhdGUoaW5zdGFuY2UsIGRldmlkLAorICAgICAgICAgICAgICAgIHByaW1hcnlfbm9kZSwgcmVuZGVyX25vZGUsICZncHUpOworICAgICAgICBpZiAocmV0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGludGVsX2luc3RhbmNlX2FkZF9ncHUoaW5zdGFuY2UsIGdwdSk7CisKKyAgICAgICAgICAgIHBQaHlzaWNhbERldmljZXNbY291bnQrK10gPSAoVmtQaHlzaWNhbERldmljZSkgZ3B1OworICAgICAgICAgICAgcGh5c2ljYWxHUFUgPSAoVmtQaHlzaWNhbERldmljZSkgZ3B1OworICAgICAgICAgICAgaWYgKGNvdW50ID49ICpwUGh5c2ljYWxEZXZpY2VDb3VudCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRldiA9IGRldi0+bmV4dDsKKyAgICB9CisKKyAgICBpY2RfZHJtX3JlbGVhc2UoaW5zdGFuY2UtPmljZCwgZGV2aWNlcyk7CisKKyAgICAqcFBoeXNpY2FsRGV2aWNlQ291bnQgPSBjb3VudDsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgICpwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCogICAgICAgICAgICAgICAgIHBDYWxsYmFjaykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKmluc3QgPSBpbnRlbF9pbnN0YW5jZShpbnN0YW5jZSk7CisKKyAgICByZXR1cm4gaWNkX2luc3RhbmNlX2NyZWF0ZV9sb2dnZXIoaW5zdC0+aWNkLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcENhbGxiYWNrKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCgKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgICAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgICAgICAgICAgICAgICAqcEFsbG9jYXRvcikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKmluc3QgPSBpbnRlbF9pbnN0YW5jZShpbnN0YW5jZSk7CisKKyAgICBpY2RfaW5zdGFuY2VfZGVzdHJveV9sb2dnZXIoaW5zdC0+aWNkLCBjYWxsYmFjaywgcEFsbG9jYXRvcik7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVidWdSZXBvcnRNZXNzYWdlRVhUKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrRGVidWdSZXBvcnRGbGFnc0VYVCAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUICAgICAgICAgICAgICAgIG9ialR5cGUsCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvZGUsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyUHJlZml4LAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2cpCit7CisgICAgLy8gSW50ZW50aW9uYWxseSBkb2VzIG5vdGhpbmcuCisgICAgLy8gTG9hZGVyIHdpbGwgY2FsbCByZWdpc3RlcmVkIGNhbGxiYWNrcyBhZnRlciBhbGwKKyAgICAvLyBJQ0RzIGhhdmUgYmVlbiBub3RpZmllZC4KK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9pbnN0YW5jZS5oIGIvaWNkL2ludGVsL2luc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0ZTYwNQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9pbnN0YW5jZS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBJTlNUQU5DRV9ICisjZGVmaW5lIElOU1RBTkNFX0gKKworI2luY2x1ZGUgImludGVsLmgiCisjaW5jbHVkZSAiZXh0ZW5zaW9uX2luZm8uaCIKKworc3RydWN0IGludGVsX2dwdTsKKworc3RydWN0IGludGVsX2luc3RhbmNlIHsKKyAgICBzdHJ1Y3QgaW50ZWxfaGFuZGxlIGhhbmRsZTsKKworICAgIHN0cnVjdCBpY2RfaW5zdGFuY2UgKmljZDsKKworICAgIHN0cnVjdCBpbnRlbF9ncHUgKmdwdXM7CisgICAgYm9vbCBnbG9iYWxfZXh0c1tJTlRFTF9HTE9CQUxfRVhUX0NPVU5UXTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2luc3RhbmNlICppbnRlbF9pbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlKQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX2luc3RhbmNlICopIGluc3RhbmNlOworfQorCitlbnVtIGludGVsX2dsb2JhbF9leHRfdHlwZSBpbnRlbF9ncHVfbG9va3VwX2dsb2JhbF9leHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uTmFtZSk7CisjZW5kaWYgLyogSU5TVEFOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2ludGVsLmggYi9pY2QvaW50ZWwvaW50ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2QyYjRiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2ludGVsLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSmVyZW15IEhheWVzIDxqZXJlbXlAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIElOVEVMX0gKKyNkZWZpbmUgSU5URUxfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+CisjaW5jbHVkZSA8dnVsa2FuL3ZrX2ljZC5oPgorCisjaW5jbHVkZSAiaWNkLmgiCisjaW5jbHVkZSAiaWNkLXNwdi5oIgorI2luY2x1ZGUgImljZC1mb3JtYXQuaCIKKyNpbmNsdWRlICJpY2QtaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJpY2QtdXRpbHMuaCIKKworI2RlZmluZSBJTlRFTF9BUElfVkVSU0lPTiBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pCisjZGVmaW5lIElOVEVMX0RSSVZFUl9WRVJTSU9OIDAKKworI2RlZmluZSBJTlRFTF9HRU4oZ2VuKSAoKGludCkgKChnZW4pICogMTAwKSkKKworI2RlZmluZSBJTlRFTF9NQVhfVkVSVEVYX0JJTkRJTkdfQ09VTlQgMzMKKyNkZWZpbmUgSU5URUxfTUFYX1ZFUlRFWF9FTEVNRU5UX0NPVU5UIChJTlRFTF9NQVhfVkVSVEVYX0JJTkRJTkdfQ09VTlQgKyAxKQorI2RlZmluZSBJTlRFTF9NQVhfUkVOREVSX1RBUkdFVFMgOAorI2RlZmluZSBJTlRFTF9NQVhfVklFV1BPUlRTIDE2CisKKyNkZWZpbmUgSU5URUxfTUVNT1JZX1BST1BFUlRZX0FMTCAoVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQgfCBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCB8XAorICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCB8IFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NBQ0hFRF9CSVQpCisjZGVmaW5lIElOVEVMX01FTU9SWV9IRUFQX0NPVU5UICAgMQorI2RlZmluZSBJTlRFTF9NRU1PUllfSEVBUF9TSVpFICAgICgydSA8PCAzMCkKKyNkZWZpbmUgSU5URUxfTUVNT1JZX1RZUEVfQ09VTlQgICAxCisKK2VudW0gaW50ZWxfZGVidWdfZmxhZ3MgeworICAgIElOVEVMX0RFQlVHX0JBVENIICAgICAgID0gMSA8PCAwLAorCisgICAgSU5URUxfREVCVUdfTk9IVyAgICAgICAgPSAxIDw8IDIwLAorICAgIElOVEVMX0RFQlVHX05PQ0FDSEUgICAgID0gMSA8PCAyMSwKKyAgICBJTlRFTF9ERUJVR19OT0hJWiAgICAgICA9IDEgPDwgMjIsCisgICAgSU5URUxfREVCVUdfSEFORyAgICAgICAgPSAxIDw8IDIzLAorfTsKKworc3RydWN0IGludGVsX2luc3RhbmNlOworCitzdHJ1Y3QgaW50ZWxfaGFuZGxlIHsKKyAgICAvKiB0aGUgbG9hZGVyIGV4cGVjdHMgYSAidm9pZCAqIiBhdCB0aGUgYmVnaW5uaW5nICovCisgICAgdm9pZCAqbG9hZGVyX2RhdGE7CisKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKmluc3RhbmNlOworfTsKKworZXh0ZXJuIGludCBpbnRlbF9kZWJ1ZzsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGludGVsX2hhbmRsZV9tYWdpYyA9IDB4NDk0ZTU0NGM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9oYW5kbGVfaW5pdChzdHJ1Y3QgaW50ZWxfaGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKmluc3RhbmNlKQoreworICAgIHNldF9sb2FkZXJfbWFnaWNfdmFsdWUoKHZvaWQgKiloYW5kbGUpOworCisgICAgaGFuZGxlLT5tYWdpYyA9IGludGVsX2hhbmRsZV9tYWdpYyArIHR5cGU7CisgICAgaGFuZGxlLT5pbnN0YW5jZSA9IGluc3RhbmNlOworfQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIFxwIGhhbmRsZSBpcyBhIHZhbGlkIGludGVsX2hhbmRsZS4gIFRoaXMgYXNzdW1lcyB0aGUgZmlyc3QKKyAqIHNpemVvZihpbnRlbF9oYW5kbGUpIGJ5dGVzIGFyZSByZWFkYWJsZSwgYW5kIHRoZXkgZG9lcyBub3QgaGFwcGVuIHRvIGhhdmUKKyAqIG91ciBtYWdpYyB2YWx1ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9oYW5kbGVfdmFsaWRhdGUoY29uc3Qgdm9pZCAqaGFuZGxlKQoreworLy8gICAgY29uc3QgdWludDMyX3QgaGFuZGxlX3R5cGUgPQorLy8gICAgICAgICgoY29uc3Qgc3RydWN0IGludGVsX2hhbmRsZSAqKSBoYW5kbGUpLT5tYWdpYyAtIGludGVsX2hhbmRsZV9tYWdpYzsKKworICAgIC8qIFRPRE86IHRoaXMgZG9lcyBub3Qgd29yayBmb3IgZXh0ZW5zaW9ucywgbmVlZHMgYWRqdXN0aW5nICovCisvLyAgICByZXR1cm4gKGhhbmRsZV90eXBlIDw9IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FTkRfUkFOR0UpOworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIFxwIGhhbmRsZSBpcyBhIHZhbGlkIGludGVsX2hhbmRsZSBvZiBccCB0eXBlLgorICoKKyAqIFxzZWUgaW50ZWxfaGFuZGxlX3ZhbGlkYXRlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9oYW5kbGVfdmFsaWRhdGVfdHlwZShjb25zdCB2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdHlwZSkKK3sKKyAgICBjb25zdCB1aW50MzJfdCBoYW5kbGVfdHlwZSA9CisgICAgICAgICgoY29uc3Qgc3RydWN0IGludGVsX2hhbmRsZSAqKSBoYW5kbGUpLT5tYWdpYyAtIGludGVsX2hhbmRsZV9tYWdpYzsKKworICAgIHJldHVybiAoaGFuZGxlX3R5cGUgPT0gKHVpbnQzMl90KSB0eXBlKTsKK30KKwordm9pZCAqaW50ZWxfYWxsb2MoY29uc3Qgdm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICBWa1N5c3RlbUFsbG9jYXRpb25TY29wZSBzY29wZSk7CisKK3ZvaWQgaW50ZWxfZnJlZShjb25zdCB2b2lkICpoYW5kbGUsIHZvaWQgKnB0cik7CisKK3ZvaWQgaW50ZWxfbG9ndihjb25zdCB2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgVmtGbGFncyBtc2dfZmxhZ3MsCisgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsIHVpbnQ2NF90IHNyY19vYmplY3QsCisgICAgICAgICAgICAgICAgc2l6ZV90IGxvY2F0aW9uLCBpbnQzMl90IG1zZ19jb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9sb2coY29uc3Qgdm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ZsYWdzIG1zZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqX3R5cGUsIHVpbnQ2NF90IHNyY19vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtc2dfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICAgIGludGVsX2xvZ3YoaGFuZGxlLCBtc2dfZmxhZ3MsIG9ial90eXBlLCBzcmNfb2JqZWN0LAorICAgICAgICAgICAgICAgbG9jYXRpb24sIG1zZ19jb2RlLCBmb3JtYXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworfQorCisjZW5kaWYgLyogSU5URUxfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2ludGVsX2ljZC5qc29uIGIvaWNkL2ludGVsL2ludGVsX2ljZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjNiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvaW50ZWxfaWNkLmpzb24KQEAgLTAsMCArMSw3IEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iOiAiMS4wLjAiLAorICAgICJJQ0QiOiB7CisgICAgICAgICJsaWJyYXJ5X3BhdGgiOiAiLi9saWJWS19pOTY1LnNvIiwKKyAgICAgICAgImFwaV92ZXJzaW9uIjogIjEuMC4yMSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL0NNYWtlTGlzdHMudHh0IGIvaWNkL2ludGVsL2ttZC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWViM2U2Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2ttZC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDUzIEBACitzZXQoc291cmNlcyAiIikKK3NldChpbmNsdWRlX2RpcnMgIiIpCitzZXQoZGVmaW5pdGlvbnMgIiIpCitzZXQobGlicmFyaWVzIGljZCkKKworaWYoVU5JWCkKKyAgICBzZXQobGliZHJtX3NvdXJjZXMKKyAgICAgICAgbGliZHJtL3hmODZkcm0uYworICAgICAgICBsaWJkcm0veGY4NmRybUhhc2guYworICAgICAgICBsaWJkcm0veGY4NmRybU1vZGUuYworICAgICAgICBsaWJkcm0veGY4NmRybVJhbmRvbS5jCisgICAgICAgIGxpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3IuYworICAgICAgICBsaWJkcm0vaW50ZWwvaW50ZWxfYnVmbWdyX2dlbS5jCisgICAgICAgIGxpYmRybS9pbnRlbC9pbnRlbF9kZWNvZGUuYykKKworICAgIGxpc3QoQVBQRU5EIHNvdXJjZXMKKyAgICAgICAgd2luc3lzX2RybS5jCisgICAgICAgICR7bGliZHJtX3NvdXJjZXN9KQorCisgICAgbGlzdChBUFBFTkQgaW5jbHVkZV9kaXJzCisgICAgICAgIGxpYmRybQorICAgICAgICBsaWJkcm0vaW5jbHVkZS9kcm0KKyAgICAgICAgbGliZHJtL2ludGVsKQorCisgICAgbGlzdChBUFBFTkQgZGVmaW5pdGlvbnMKKyAgICAgICAgLURfR05VX1NPVVJDRQorICAgICAgICAtREhBVkVfTElCRFJNX0FUT01JQ19QUklNSVRJVkVTPTEpCisKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtsaWJkcm1fc291cmNlc30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTCisgICAgICAgICItc3RkPWdudTk5IC1Xbm8tdHlwZS1saW1pdHMgLVduby11bnVzZWQtdmFyaWFibGUiKQorCisgICAgZmluZF9wYWNrYWdlKFB0aHJlYWRTdHVicyBSRVFVSVJFRCkKKyAgICBsaXN0KEFQUEVORCBpbmNsdWRlX2RpcnMgJHtQVEhSRUFEU1RVQlNfSU5DTFVERV9ESVJTfSkKKyAgICBsaXN0KEFQUEVORCBsaWJyYXJpZXMgJHtQVEhSRUFEU1RVQlNfTElCUkFSSUVTfSkKKworICAgIGZpbmRfcGFja2FnZShQQ0lBY2Nlc3MgUkVRVUlSRUQpCisgICAgbGlzdChBUFBFTkQgaW5jbHVkZV9kaXJzICR7UENJQUNDRVNTX0lOQ0xVREVfRElSU30pCisgICAgbGlzdChBUFBFTkQgbGlicmFyaWVzICR7UENJQUNDRVNTX0xJQlJBUklFU30pCisKKyAgICBmaW5kX3BhY2thZ2UoVmFsZ3JpbmQpCisgICAgaWYoVkFMR1JJTkRfRk9VTkQgQU5EIENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgICAgICAgbGlzdChBUFBFTkQgZGVmaW5pdGlvbnMgLURIQVZFX1ZBTEdSSU5EPTEpCisgICAgICAgIGxpc3QoQVBQRU5EIGluY2x1ZGVfZGlycyAke1ZBTEdSSU5EX0lOQ0xVREVfRElSU30pCisgICAgICAgIGxpc3QoQVBQRU5EIGxpYnJhcmllcyAke1ZBTEdSSU5EX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorZW5kaWYoKQorCithZGRfbGlicmFyeShpbnRlbGttZCBTVEFUSUMgJHtzb3VyY2VzfSkKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKGludGVsa21kIFBSSVZBVEUgJHtpbmNsdWRlX2RpcnN9KQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoaW50ZWxrbWQgUFVCTElDICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKK3RhcmdldF9jb21waWxlX2RlZmluaXRpb25zKGludGVsa21kIFBSSVZBVEUgJHtkZWZpbml0aW9uc30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoaW50ZWxrbWQgJHtsaWJyYXJpZXN9KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGludGVsa21kIFBST1BFUlRJRVMgUE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERSBPTikKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9rbWQvbGliZHJtL2luY2x1ZGUvZHJtL2RybS5oIGIvaWNkL2ludGVsL2ttZC9saWJkcm0vaW5jbHVkZS9kcm0vZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5YTI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2luY2x1ZGUvZHJtL2RybS5oCkBAIC0wLDAgKzEsODU2IEBACisvKioKKyAqIFxmaWxlIGRybS5oCisgKiBIZWFkZXIgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIKKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqIFxwYXIgQWNrbm93bGVkZ21lbnRzOgorICogRGVjIDE5OTksIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdHdpZGRsZS5uZXQ+LCBtb3ZlIHRvIGdlbmVyaWMgXGMgY21weGNoZy4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fSF8KKyNkZWZpbmUgX0RSTV9IXworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgordHlwZWRlZiB1bnNpZ25lZCBpbnQgZHJtX2hhbmRsZV90OworCisjZWxzZSAvKiBPbmUgb2YgdGhlIEJTRHMgKi8KKworI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK3R5cGVkZWYgaW50OF90ICAgX19zODsKK3R5cGVkZWYgdWludDhfdCAgX191ODsKK3R5cGVkZWYgaW50MTZfdCAgX19zMTY7Cit0eXBlZGVmIHVpbnQxNl90IF9fdTE2OwordHlwZWRlZiBpbnQzMl90ICBfX3MzMjsKK3R5cGVkZWYgdWludDMyX3QgX191MzI7Cit0eXBlZGVmIGludDY0X3QgIF9fczY0OwordHlwZWRlZiB1aW50NjRfdCBfX3U2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkcm1faGFuZGxlX3Q7CisKKyNlbmRpZgorCisjZGVmaW5lIERSTV9OQU1FCSJkcm0iCSAgLyoqPCBOYW1lIGluIGtlcm5lbCwgL2RldiwgYW5kIC9wcm9jICovCisjZGVmaW5lIERSTV9NSU5fT1JERVIJNQkgIC8qKjwgQXQgbGVhc3QgMl41IGJ5dGVzID0gMzIgYnl0ZXMgKi8KKyNkZWZpbmUgRFJNX01BWF9PUkRFUgkyMgkgIC8qKjwgVXAgdG8gMl4yMiBieXRlcyA9IDRNQiAqLworI2RlZmluZSBEUk1fUkFNX1BFUkNFTlQgMTAJICAvKio8IEhvdyBtdWNoIHN5c3RlbSByYW0gY2FuIHdlIGxvY2s/ICovCisKKyNkZWZpbmUgX0RSTV9MT0NLX0hFTEQJMHg4MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGhlbGQgKi8KKyNkZWZpbmUgX0RSTV9MT0NLX0NPTlQJMHg0MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGNvbnRlbmRlZCAqLworI2RlZmluZSBfRFJNX0xPQ0tfSVNfSEVMRChsb2NrKQkgICAoKGxvY2spICYgX0RSTV9MT0NLX0hFTEQpCisjZGVmaW5lIF9EUk1fTE9DS19JU19DT05UKGxvY2spCSAgICgobG9jaykgJiBfRFJNX0xPQ0tfQ09OVCkKKyNkZWZpbmUgX0RSTV9MT0NLSU5HX0NPTlRFWFQobG9jaykgKChsb2NrKSAmIH4oX0RSTV9MT0NLX0hFTER8X0RSTV9MT0NLX0NPTlQpKQorCit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fY29udGV4dF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZHJtX2RyYXdhYmxlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fbWFnaWNfdDsKKworLyoqCisgKiBDbGlwcmVjdC4KKyAqCisgKiBcd2FybmluZzogSWYgeW91IGNoYW5nZSB0aGlzIHN0cnVjdHVyZSwgbWFrZSBzdXJlIHlvdSBjaGFuZ2UKKyAqIFhGODZEUklDbGlwUmVjdFJlYyBpbiB0aGUgc2VydmVyIGFzIHdlbGwKKyAqCisgKiBcbm90ZSBLVzogQWN0dWFsbHkgaXQncyBpbGxlZ2FsIHRvIGNoYW5nZSBlaXRoZXIgZm9yCisgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSByZWFzb25zLgorICovCitzdHJ1Y3QgZHJtX2NsaXBfcmVjdCB7CisJdW5zaWduZWQgc2hvcnQgeDE7CisJdW5zaWduZWQgc2hvcnQgeTE7CisJdW5zaWduZWQgc2hvcnQgeDI7CisJdW5zaWduZWQgc2hvcnQgeTI7Cit9OworCisvKioKKyAqIERyYXdhYmxlIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8geworCXVuc2lnbmVkIGludCBudW1fcmVjdHM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzOworfTsKKworLyoqCisgKiBUZXh0dXJlIHJlZ2lvbiwKKyAqLworc3RydWN0IGRybV90ZXhfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyIG5leHQ7CisJdW5zaWduZWQgY2hhciBwcmV2OworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOworCXVuc2lnbmVkIGNoYXIgcGFkZGluZzsKKwl1bnNpZ25lZCBpbnQgYWdlOworfTsKKworLyoqCisgKiBIYXJkd2FyZSBsb2NrLgorICoKKyAqIFRoZSBsb2NrIHN0cnVjdHVyZSBpcyBhIHNpbXBsZSBjYWNoZS1saW5lIGFsaWduZWQgaW50ZWdlci4gIFRvIGF2b2lkCisgKiBwcm9jZXNzb3IgYnVzIGNvbnRlbnRpb24gb24gYSBtdWx0aXByb2Nlc3NvciBzeXN0ZW0sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55CisgKiBvdGhlciBkYXRhIHN0b3JlZCBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICovCitzdHJ1Y3QgZHJtX2h3X2xvY2sgeworCV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgbG9jazsJCS8qKjwgbG9jayB2YXJpYWJsZSAqLworCWNoYXIgcGFkZGluZ1s2MF07CQkJLyoqPCBQYWQgdG8gY2FjaGUgbGluZSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfVkVSU0lPTiBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1HZXRWZXJzaW9uKCkuCisgKi8KK3N0cnVjdCBkcm1fdmVyc2lvbiB7CisJaW50IHZlcnNpb25fbWFqb3I7CSAgLyoqPCBNYWpvciB2ZXJzaW9uICovCisJaW50IHZlcnNpb25fbWlub3I7CSAgLyoqPCBNaW5vciB2ZXJzaW9uICovCisJaW50IHZlcnNpb25fcGF0Y2hsZXZlbDsJICAvKio8IFBhdGNoIGxldmVsICovCisJc2l6ZV90IG5hbWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIG5hbWUgYnVmZmVyICovCisJY2hhciAqbmFtZTsJICAvKio8IE5hbWUgb2YgZHJpdmVyICovCisJc2l6ZV90IGRhdGVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRhdGUgYnVmZmVyICovCisJY2hhciAqZGF0ZTsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGF0ZSAqLworCXNpemVfdCBkZXNjX2xlbjsJICAvKio8IExlbmd0aCBvZiBkZXNjIGJ1ZmZlciAqLworCWNoYXIgKmRlc2M7CSAgLyoqPCBVc2VyLXNwYWNlIGJ1ZmZlciB0byBob2xkIGRlc2MgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9VTklRVUUgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtR2V0QnVzaWQoKSBhbmQgZHJtU2V0QnVzSWQoKS4KKyAqLworc3RydWN0IGRybV91bmlxdWUgeworCXNpemVfdCB1bmlxdWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSAqLworCWNoYXIgKnVuaXF1ZTsJICAvKio8IFVuaXF1ZSBuYW1lIGZvciBkcml2ZXIgaW5zdGFudGlhdGlvbiAqLworfTsKKworc3RydWN0IGRybV9saXN0IHsKKwlpbnQgY291bnQ7CQkgIC8qKjwgTGVuZ3RoIG9mIHVzZXItc3BhY2Ugc3RydWN0dXJlcyAqLworCXN0cnVjdCBkcm1fdmVyc2lvbiAqdmVyc2lvbjsKK307CisKK3N0cnVjdCBkcm1fYmxvY2sgeworCWludCB1bnVzZWQ7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9DT05UUk9MIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUN0bEluc3RIYW5kbGVyKCkgYW5kIGRybUN0bFVuaW5zdEhhbmRsZXIoKS4KKyAqLworc3RydWN0IGRybV9jb250cm9sIHsKKwllbnVtIHsKKwkJRFJNX0FERF9DT01NQU5ELAorCQlEUk1fUk1fQ09NTUFORCwKKwkJRFJNX0lOU1RfSEFORExFUiwKKwkJRFJNX1VOSU5TVF9IQU5ETEVSCisJfSBmdW5jOworCWludCBpcnE7Cit9OworCisvKioKKyAqIFR5cGUgb2YgbWVtb3J5IHRvIG1hcC4KKyAqLworZW51bSBkcm1fbWFwX3R5cGUgeworCV9EUk1fRlJBTUVfQlVGRkVSID0gMCwJICAvKio8IFdDIChubyBjYWNoaW5nKSwgbm8gY29yZSBkdW1wICovCisJX0RSTV9SRUdJU1RFUlMgPSAxLAkgIC8qKjwgbm8gY2FjaGluZywgbm8gY29yZSBkdW1wICovCisJX0RSTV9TSE0gPSAyLAkJICAvKio8IHNoYXJlZCwgY2FjaGVkICovCisJX0RSTV9BR1AgPSAzLAkJICAvKio8IEFHUC9HQVJUICovCisJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQsICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLworCV9EUk1fQ09OU0lTVEVOVCA9IDUsCSAgLyoqPCBDb25zaXN0ZW50IG1lbW9yeSBmb3IgUENJIERNQSAqLworCV9EUk1fR0VNID0gNgkJICAvKio8IEdFTSBvYmplY3QgKi8KK307CisKKy8qKgorICogTWVtb3J5IG1hcHBpbmcgZmxhZ3MuCisgKi8KK2VudW0gZHJtX21hcF9mbGFncyB7CisJX0RSTV9SRVNUUklDVEVEID0gMHgwMSwJICAgICAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gdXNlci12aXJ0dWFsICovCisJX0RSTV9SRUFEX09OTFkgPSAweDAyLAorCV9EUk1fTE9DS0VEID0gMHgwNCwJICAgICAvKio8IHNoYXJlZCwgY2FjaGVkLCBsb2NrZWQgKi8KKwlfRFJNX0tFUk5FTCA9IDB4MDgsCSAgICAgLyoqPCBrZXJuZWwgcmVxdWlyZXMgYWNjZXNzICovCisJX0RSTV9XUklURV9DT01CSU5JTkcgPSAweDEwLCAvKio8IHVzZSB3cml0ZS1jb21iaW5pbmcgaWYgYXZhaWxhYmxlICovCisJX0RSTV9DT05UQUlOU19MT0NLID0gMHgyMCwgICAvKio8IFNITSBwYWdlIHRoYXQgY29udGFpbnMgbG9jayAqLworCV9EUk1fUkVNT1ZBQkxFID0gMHg0MCwJICAgICAvKio8IFJlbW92YWJsZSBtYXBwaW5nICovCisJX0RSTV9EUklWRVIgPSAweDgwCSAgICAgLyoqPCBNYW5hZ2VkIGJ5IGRyaXZlciAqLworfTsKKworc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgeworCXVuc2lnbmVkIGludCBjdHhfaWQ7CSAvKio8IENvbnRleHQgcmVxdWVzdGluZyBwcml2YXRlIG1hcHBpbmcgKi8KKwl2b2lkICpoYW5kbGU7CQkgLyoqPCBIYW5kbGUgb2YgbWFwICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfTUFQLCBEUk1fSU9DVExfQUREX01BUCBhbmQgRFJNX0lPQ1RMX1JNX01BUCBpb2N0bHMKKyAqIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFkZE1hcCgpLgorICovCitzdHJ1Y3QgZHJtX21hcCB7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBhZGRyZXNzICgwIGZvciBTQVJFQSkqLworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJIC8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIHNpemUgKGJ5dGVzKSAqLworCWVudW0gZHJtX21hcF90eXBlIHR5cGU7CSAvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLworCWVudW0gZHJtX21hcF9mbGFncyBmbGFnczsJIC8qKjwgRmxhZ3MgKi8KKwl2b2lkICpoYW5kbGU7CQkgLyoqPCBVc2VyLXNwYWNlOiAiSGFuZGxlIiB0byBwYXNzIHRvIG1tYXAoKSAqLworCQkJCSAvKio8IEtlcm5lbC1zcGFjZToga2VybmVsLXZpcnR1YWwgYWRkcmVzcyAqLworCWludCBtdHJyOwkJIC8qKjwgTVRSUiBzbG90IHVzZWQgKi8KKwkvKiAgIFByaXZhdGUgZGF0YSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX0NMSUVOVCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2NsaWVudCB7CisJaW50IGlkeDsJCS8qKjwgV2hpY2ggY2xpZW50IGRlc2lyZWQ/ICovCisJaW50IGF1dGg7CQkvKio8IElzIGNsaWVudCBhdXRoZW50aWNhdGVkPyAqLworCXVuc2lnbmVkIGxvbmcgcGlkOwkvKio8IFByb2Nlc3MgSUQgKi8KKwl1bnNpZ25lZCBsb25nIHVpZDsJLyoqPCBVc2VyIElEICovCisJdW5zaWduZWQgbG9uZyBtYWdpYzsJLyoqPCBNYWdpYyAqLworCXVuc2lnbmVkIGxvbmcgaW9jczsJLyoqPCBJb2N0bCBjb3VudCAqLworfTsKKworZW51bSBkcm1fc3RhdF90eXBlIHsKKwlfRFJNX1NUQVRfTE9DSywKKwlfRFJNX1NUQVRfT1BFTlMsCisJX0RSTV9TVEFUX0NMT1NFUywKKwlfRFJNX1NUQVRfSU9DVExTLAorCV9EUk1fU1RBVF9MT0NLUywKKwlfRFJNX1NUQVRfVU5MT0NLUywKKwlfRFJNX1NUQVRfVkFMVUUsCS8qKjwgR2VuZXJpYyB2YWx1ZSAqLworCV9EUk1fU1RBVF9CWVRFLAkJLyoqPCBHZW5lcmljIGJ5dGUgY291bnRlciAoMTAyNGJ5dGVzL0spICovCisJX0RSTV9TVEFUX0NPVU5ULAkvKio8IEdlbmVyaWMgbm9uLWJ5dGUgY291bnRlciAoMTAwMC9rKSAqLworCisJX0RSTV9TVEFUX0lSUSwJCS8qKjwgSVJRICovCisJX0RSTV9TVEFUX1BSSU1BUlksCS8qKjwgUHJpbWFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfU0VDT05EQVJZLAkvKio8IFNlY29uZGFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfRE1BLAkJLyoqPCBETUEgKi8KKwlfRFJNX1NUQVRfU1BFQ0lBTCwJLyoqPCBTcGVjaWFsIERNQSAoZS5nLiwgcHJpb3JpdHkgb3IgcG9sbGVkKSAqLworCV9EUk1fU1RBVF9NSVNTRUQJLyoqPCBNaXNzZWQgRE1BIG9wcG9ydHVuaXR5ICovCisJICAgIC8qIEFkZCB0byB0aGUgKkVORCogb2YgdGhlIGxpc3QgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9TVEFUUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJCWVudW0gZHJtX3N0YXRfdHlwZSB0eXBlOworCX0gZGF0YVsxNV07Cit9OworCisvKioKKyAqIEhhcmR3YXJlIGxvY2tpbmcgZmxhZ3MuCisgKi8KK2VudW0gZHJtX2xvY2tfZmxhZ3MgeworCV9EUk1fTE9DS19SRUFEWSA9IDB4MDEsCSAgICAgLyoqPCBXYWl0IHVudGlsIGhhcmR3YXJlIGlzIHJlYWR5IGZvciBETUEgKi8KKwlfRFJNX0xPQ0tfUVVJRVNDRU5UID0gMHgwMiwgIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KKwlfRFJNX0xPQ0tfRkxVU0ggPSAweDA0LAkgICAgIC8qKjwgRmx1c2ggdGhpcyBjb250ZXh0J3MgRE1BIHF1ZXVlIGZpcnN0ICovCisJX0RSTV9MT0NLX0ZMVVNIX0FMTCA9IDB4MDgsICAvKio8IEZsdXNoIGFsbCBETUEgcXVldWVzIGZpcnN0ICovCisJLyogVGhlc2UgKkhBTFQqIGZsYWdzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0CisJICAgLS0gdGhleSB3aWxsIGJlIHVzZWQgdG8gc3VwcG9ydCB0aGUKKwkgICBmdWxsLXNjcmVlbiBER0EtbGlrZSBtb2RlLiAqLworCV9EUk1fSEFMVF9BTExfUVVFVUVTID0gMHgxMCwgLyoqPCBIYWx0IGFsbCBjdXJyZW50IGFuZCBmdXR1cmUgcXVldWVzICovCisJX0RSTV9IQUxUX0NVUl9RVUVVRVMgPSAweDIwICAvKio8IEhhbHQgYWxsIGN1cnJlbnQgcXVldWVzICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9MT0NLLCBEUk1fSU9DVExfVU5MT0NLIGFuZCBEUk1fSU9DVExfRklOSVNIIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUdldExvY2soKSBhbmQgZHJtVW5sb2NrKCkuCisgKi8KK3N0cnVjdCBkcm1fbG9jayB7CisJaW50IGNvbnRleHQ7CisJZW51bSBkcm1fbG9ja19mbGFncyBmbGFnczsKK307CisKKy8qKgorICogRE1BIGZsYWdzCisgKgorICogXHdhcm5pbmcKKyAqIFRoZXNlIHZhbHVlcyBcZSBtdXN0IG1hdGNoIHhmODZkcm0uaC4KKyAqCisgKiBcc2EgZHJtX2RtYS4KKyAqLworZW51bSBkcm1fZG1hX2ZsYWdzIHsKKwkvKiBGbGFncyBmb3IgRE1BIGJ1ZmZlciBkaXNwYXRjaCAqLworCV9EUk1fRE1BX0JMT0NLID0gMHgwMSwJICAgICAgLyoqPAorCQkJCSAgICAgICAqIEJsb2NrIHVudGlsIGJ1ZmZlciBkaXNwYXRjaGVkLgorCQkJCSAgICAgICAqCisJCQkJICAgICAgICogXG5vdGUgVGhlIGJ1ZmZlciBtYXkgbm90IHlldCBoYXZlCisJCQkJICAgICAgICogYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlIC0tCisJCQkJICAgICAgICogZ2V0dGluZyBhIGhhcmR3YXJlIGxvY2sgd2l0aCB0aGUKKwkJCQkgICAgICAgKiBoYXJkd2FyZSBxdWllc2NlbnQgd2lsbCBlbnN1cmUKKwkJCQkgICAgICAgKiB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4KKwkJCQkgICAgICAgKiBwcm9jZXNzZWQuCisJCQkJICAgICAgICovCisJX0RSTV9ETUFfV0hJTEVfTE9DS0VEID0gMHgwMiwgLyoqPCBEaXNwYXRjaCB3aGlsZSBsb2NrIGhlbGQgKi8KKwlfRFJNX0RNQV9QUklPUklUWSA9IDB4MDQsICAgICAvKio8IEhpZ2ggcHJpb3JpdHkgZGlzcGF0Y2ggKi8KKworCS8qIEZsYWdzIGZvciBETUEgYnVmZmVyIHJlcXVlc3QgKi8KKwlfRFJNX0RNQV9XQUlUID0gMHgxMCwJICAgICAgLyoqPCBXYWl0IGZvciBmcmVlIGJ1ZmZlcnMgKi8KKwlfRFJNX0RNQV9TTUFMTEVSX09LID0gMHgyMCwgICAvKio8IFNtYWxsZXItdGhhbi1yZXF1ZXN0ZWQgYnVmZmVycyBPSyAqLworCV9EUk1fRE1BX0xBUkdFUl9PSyA9IDB4NDAgICAgIC8qKjwgTGFyZ2VyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FERF9CVUZTIGFuZCBEUk1fSU9DVExfTUFSS19CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFkZEJ1ZnMoKS4KKyAqLworc3RydWN0IGRybV9idWZfZGVzYyB7CisJaW50IGNvdW50OwkJIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgb2YgdGhpcyBzaXplICovCisJaW50IHNpemU7CQkgLyoqPCBTaXplIGluIGJ5dGVzICovCisJaW50IGxvd19tYXJrOwkJIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KKwlpbnQgaGlnaF9tYXJrOwkJIC8qKjwgSGlnaCB3YXRlciBtYXJrICovCisJZW51bSB7CisJCV9EUk1fUEFHRV9BTElHTiA9IDB4MDEsCS8qKjwgQWxpZ24gb24gcGFnZSBib3VuZGFyaWVzIGZvciBETUEgKi8KKwkJX0RSTV9BR1BfQlVGRkVSID0gMHgwMiwJLyoqPCBCdWZmZXIgaXMgaW4gQUdQIHNwYWNlICovCisJCV9EUk1fU0dfQlVGRkVSID0gMHgwNCwJLyoqPCBTY2F0dGVyL2dhdGhlciBtZW1vcnkgYnVmZmVyICovCisJCV9EUk1fRkJfQlVGRkVSID0gMHgwOCwJLyoqPCBCdWZmZXIgaXMgaW4gZnJhbWUgYnVmZmVyICovCisJCV9EUk1fUENJX0JVRkZFUl9STyA9IDB4MTAgLyoqPCBNYXAgUENJIERNQSBidWZmZXIgcmVhZC1vbmx5ICovCisJfSBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGFncF9zdGFydDsgLyoqPAorCQkJCSAgKiBTdGFydCBhZGRyZXNzIG9mIHdoZXJlIHRoZSBBR1AgYnVmZmVycyBhcmUKKwkJCQkgICogaW4gdGhlIEFHUCBhcGVydHVyZQorCQkJCSAgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0lORk9fQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKKwlpbnQgY291bnQ7CQkvKio8IEVudHJpZXMgaW4gbGlzdCAqLworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgKmxpc3Q7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9GUkVFX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9idWZfZnJlZSB7CisJaW50IGNvdW50OworCWludCAqbGlzdDsKK307CisKKy8qKgorICogQnVmZmVyIGluZm9ybWF0aW9uCisgKgorICogXHNhIGRybV9idWZfbWFwLgorICovCitzdHJ1Y3QgZHJtX2J1Zl9wdWIgeworCWludCBpZHg7CQkgICAgICAgLyoqPCBJbmRleCBpbnRvIHRoZSBtYXN0ZXIgYnVmZmVyIGxpc3QgKi8KKwlpbnQgdG90YWw7CQkgICAgICAgLyoqPCBCdWZmZXIgc2l6ZSAqLworCWludCB1c2VkOwkJICAgICAgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisJdm9pZCAqYWRkcmVzczsJICAgICAgIC8qKjwgQWRkcmVzcyBvZiBidWZmZXIgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX01BUF9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fYnVmX21hcCB7CisJaW50IGNvdW50OwkJLyoqPCBMZW5ndGggb2YgdGhlIGJ1ZmZlciBsaXN0ICovCisjaWZkZWYgX19jcGx1c3BsdXMKKwl2b2lkICp2aXJ0OworI2Vsc2UKKwl2b2lkICp2aXJ0dWFsOwkJLyoqPCBNbWFwJ2QgYXJlYSBpbiB1c2VyLXZpcnR1YWwgKi8KKyNlbmRpZgorCXN0cnVjdCBkcm1fYnVmX3B1YiAqbGlzdDsJLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0RNQSBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIEluZGljZXMgaGVyZSByZWZlciB0byB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBsaXN0IGluIGRybV9idWZfZ2V0LgorICoKKyAqIFxzYSBkcm1ETUEoKS4KKyAqLworc3RydWN0IGRybV9kbWEgeworCWludCBjb250ZXh0OwkJCSAgLyoqPCBDb250ZXh0IGhhbmRsZSAqLworCWludCBzZW5kX2NvdW50OwkJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyB0byBzZW5kICovCisJaW50ICpzZW5kX2luZGljZXM7CSAgLyoqPCBMaXN0IG9mIGhhbmRsZXMgdG8gYnVmZmVycyAqLworCWludCAqc2VuZF9zaXplczsJCSAgLyoqPCBMZW5ndGhzIG9mIGRhdGEgdG8gc2VuZCAqLworCWVudW0gZHJtX2RtYV9mbGFncyBmbGFnczsJICAvKio8IEZsYWdzICovCisJaW50IHJlcXVlc3RfY291bnQ7CQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCisJaW50IHJlcXVlc3Rfc2l6ZTsJCSAgLyoqPCBEZXNpcmVkIHNpemUgZm9yIGJ1ZmZlcnMgKi8KKwlpbnQgKnJlcXVlc3RfaW5kaWNlczsJICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCWludCAqcmVxdWVzdF9zaXplczsKKwlpbnQgZ3JhbnRlZF9jb3VudDsJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBncmFudGVkICovCit9OworCitlbnVtIGRybV9jdHhfZmxhZ3MgeworCV9EUk1fQ09OVEVYVF9QUkVTRVJWRUQgPSAweDAxLAorCV9EUk1fQ09OVEVYVF8yRE9OTFkgPSAweDAyCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BRERfQ1RYIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUNyZWF0ZUNvbnRleHQoKSBhbmQgZHJtRGVzdHJveUNvbnRleHQoKS4KKyAqLworc3RydWN0IGRybV9jdHggeworCWRybV9jb250ZXh0X3QgaGFuZGxlOworCWVudW0gZHJtX2N0eF9mbGFncyBmbGFnczsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX1JFU19DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9jdHhfcmVzIHsKKwlpbnQgY291bnQ7CisJc3RydWN0IGRybV9jdHggKmNvbnRleHRzOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUREX0RSQVcgYW5kIERSTV9JT0NUTF9STV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fZHJhdyB7CisJZHJtX2RyYXdhYmxlX3QgaGFuZGxlOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfVVBEQVRFX0RSQVcgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlEUk1fRFJBV0FCTEVfQ0xJUFJFQ1RTCit9IGRybV9kcmF3YWJsZV9pbmZvX3R5cGVfdDsKKworc3RydWN0IGRybV91cGRhdGVfZHJhdyB7CisJZHJtX2RyYXdhYmxlX3QgaGFuZGxlOworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBudW07CisJdW5zaWduZWQgbG9uZyBsb25nIGRhdGE7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfTUFHSUMgYW5kIERSTV9JT0NUTF9BVVRIX01BR0lDIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fYXV0aCB7CisJZHJtX21hZ2ljX3QgbWFnaWM7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9JUlFfQlVTSUQgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtR2V0SW50ZXJydXB0RnJvbUJ1c0lEKCkuCisgKi8KK3N0cnVjdCBkcm1faXJxX2J1c2lkIHsKKwlpbnQgaXJxOwkvKio8IElSUSBudW1iZXIgKi8KKwlpbnQgYnVzbnVtOwkvKio8IGJ1cyBudW1iZXIgKi8KKwlpbnQgZGV2bnVtOwkvKio8IGRldmljZSBudW1iZXIgKi8KKwlpbnQgZnVuY251bTsJLyoqPCBmdW5jdGlvbiBudW1iZXIgKi8KK307CisKK2VudW0gZHJtX3ZibGFua19zZXFfdHlwZSB7CisJX0RSTV9WQkxBTktfQUJTT0xVVEUgPSAweDAsCS8qKjwgV2FpdCBmb3Igc3BlY2lmaWMgdmJsYW5rIHNlcXVlbmNlIG51bWJlciAqLworCV9EUk1fVkJMQU5LX1JFTEFUSVZFID0gMHgxLAkvKio8IFdhaXQgZm9yIGdpdmVuIG51bWJlciBvZiB2YmxhbmtzICovCisJX0RSTV9WQkxBTktfRVZFTlQgPSAweDQwMDAwMDAsICAgLyoqPCBTZW5kIGV2ZW50IGluc3RlYWQgb2YgYmxvY2tpbmcgKi8KKwlfRFJNX1ZCTEFOS19GTElQID0gMHg4MDAwMDAwLCAgIC8qKjwgU2NoZWR1bGVkIGJ1ZmZlciBzd2FwIHNob3VsZCBmbGlwICovCisJX0RSTV9WQkxBTktfTkVYVE9OTUlTUyA9IDB4MTAwMDAwMDAsCS8qKjwgSWYgbWlzc2VkLCB3YWl0IGZvciBuZXh0IHZibGFuayAqLworCV9EUk1fVkJMQU5LX1NFQ09OREFSWSA9IDB4MjAwMDAwMDAsCS8qKjwgU2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlciAqLworCV9EUk1fVkJMQU5LX1NJR05BTCA9IDB4NDAwMDAwMDAJLyoqPCBTZW5kIHNpZ25hbCBpbnN0ZWFkIG9mIGJsb2NraW5nLCB1bnN1cHBvcnRlZCAqLworfTsKKworI2RlZmluZSBfRFJNX1ZCTEFOS19UWVBFU19NQVNLIChfRFJNX1ZCTEFOS19BQlNPTFVURSB8IF9EUk1fVkJMQU5LX1JFTEFUSVZFKQorI2RlZmluZSBfRFJNX1ZCTEFOS19GTEFHU19NQVNLIChfRFJNX1ZCTEFOS19FVkVOVCB8IF9EUk1fVkJMQU5LX1NJR05BTCB8IFwKKwkJCQlfRFJNX1ZCTEFOS19TRUNPTkRBUlkgfCBfRFJNX1ZCTEFOS19ORVhUT05NSVNTKQorCitzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgeworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIHNpZ25hbDsKK307CisKK3N0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgeworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwlsb25nIHR2YWxfc2VjOworCWxvbmcgdHZhbF91c2VjOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfV0FJVF9WQkxBTksgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtV2FpdFZCbGFuaygpLgorICovCit1bmlvbiBkcm1fd2FpdF92YmxhbmsgeworCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgcmVwbHk7Cit9OworCisjZGVmaW5lIF9EUk1fUFJFX01PREVTRVQgMQorI2RlZmluZSBfRFJNX1BPU1RfTU9ERVNFVCAyCisKKy8qKgorICogRFJNX0lPQ1RMX01PREVTRVRfQ1RMIGlvY3RsIGFyZ3VtZW50IHR5cGUKKyAqCisgKiBcc2EgZHJtTW9kZXNldEN0bCgpLgorICovCitzdHJ1Y3QgZHJtX21vZGVzZXRfY3RsIHsKKwlfX3UzMiBjcnRjOworCV9fdTMyIGNtZDsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FHUF9FTkFCTEUgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwRW5hYmxlKCkuCisgKi8KK3N0cnVjdCBkcm1fYWdwX21vZGUgeworCXVuc2lnbmVkIGxvbmcgbW9kZTsJLyoqPCBBR1AgbW9kZSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0FMTE9DIGFuZCBEUk1fSU9DVExfQUdQX0ZSRUUgaW9jdGxzIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFncEFsbG9jKCkgYW5kIGRybUFncEZyZWUoKS4KKyAqLworc3RydWN0IGRybV9hZ3BfYnVmZmVyIHsKKwl1bnNpZ25lZCBsb25nIHNpemU7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgVXNlZCBmb3IgYmluZGluZyAvIHVuYmluZGluZyAqLworCXVuc2lnbmVkIGxvbmcgdHlwZTsJLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAqLworCXVuc2lnbmVkIGxvbmcgcGh5c2ljYWw7CS8qKjwgUGh5c2ljYWwgdXNlZCBieSBpODEwICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfQklORCBhbmQgRFJNX0lPQ1RMX0FHUF9VTkJJTkQgaW9jdGxzIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFncEJpbmQoKSBhbmQgZHJtQWdwVW5iaW5kKCkuCisgKi8KK3N0cnVjdCBkcm1fYWdwX2JpbmRpbmcgeworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IEZyb20gZHJtX2FncF9idWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldDsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFncFZlcnNpb25NYWpvcigpLCBkcm1BZ3BWZXJzaW9uTWlub3IoKSwgZHJtQWdwR2V0TW9kZSgpLAorICogZHJtQWdwQmFzZSgpLCBkcm1BZ3BTaXplKCksIGRybUFncE1lbW9yeVVzZWQoKSwgZHJtQWdwTWVtb3J5QXZhaWwoKSwKKyAqIGRybUFncFZlbmRvcklkKCkgYW5kIGRybUFncERldmljZUlkKCkuCisgKi8KK3N0cnVjdCBkcm1fYWdwX2luZm8geworCWludCBhZ3BfdmVyc2lvbl9tYWpvcjsKKwlpbnQgYWdwX3ZlcnNpb25fbWlub3I7CisJdW5zaWduZWQgbG9uZyBtb2RlOworCXVuc2lnbmVkIGxvbmcgYXBlcnR1cmVfYmFzZTsJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcgYXBlcnR1cmVfc2l6ZTsJLyogYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIG1lbW9yeV9hbGxvd2VkOwkvKiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgbWVtb3J5X3VzZWQ7CisKKwkvKiBQQ0kgaW5mb3JtYXRpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBpZF92ZW5kb3I7CisJdW5zaWduZWQgc2hvcnQgaWRfZGV2aWNlOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfU0dfQUxMT0MgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciB7CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIG1hcHBpbmcgLyB1bm1hcHBpbmcgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX1NFVF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fc2V0X3ZlcnNpb24geworCWludCBkcm1fZGlfbWFqb3I7CisJaW50IGRybV9kaV9taW5vcjsKKwlpbnQgZHJtX2RkX21ham9yOworCWludCBkcm1fZGRfbWlub3I7Cit9OworCisvKiogRFJNX0lPQ1RMX0dFTV9DTE9TRSBpb2N0bCBhcmd1bWVudCB0eXBlICovCitzdHJ1Y3QgZHJtX2dlbV9jbG9zZSB7CisJLyoqIEhhbmRsZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGNsb3NlZC4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworfTsKKworLyoqIERSTV9JT0NUTF9HRU1fRkxJTksgaW9jdGwgYXJndW1lbnQgdHlwZSAqLworc3RydWN0IGRybV9nZW1fZmxpbmsgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgbmFtZWQgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogUmV0dXJuZWQgZ2xvYmFsIG5hbWUgKi8KKwlfX3UzMiBuYW1lOworfTsKKworLyoqIERSTV9JT0NUTF9HRU1fT1BFTiBpb2N0bCBhcmd1bWVudCB0eXBlICovCitzdHJ1Y3QgZHJtX2dlbV9vcGVuIHsKKwkvKiogTmFtZSBvZiBvYmplY3QgYmVpbmcgb3BlbmVkICovCisJX191MzIgbmFtZTsKKworCS8qKiBSZXR1cm5lZCBoYW5kbGUgZm9yIHRoZSBvYmplY3QgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogUmV0dXJuZWQgc2l6ZSBvZiB0aGUgb2JqZWN0ICovCisJX191NjQgc2l6ZTsKK307CisKKy8qKiBEUk1fSU9DVExfR0VUX0NBUCBpb2N0bCBhcmd1bWVudCB0eXBlICovCitzdHJ1Y3QgZHJtX2dldF9jYXAgeworCV9fdTY0IGNhcGFiaWxpdHk7CisJX191NjQgdmFsdWU7Cit9OworCisvKioKKyAqIERSTV9DTElFTlRfQ0FQX1NURVJFT18zRAorICoKKyAqIGlmIHNldCB0byAxLCB0aGUgRFJNIGNvcmUgd2lsbCBleHBvc2UgdGhlIHN0ZXJlbyAzRCBjYXBhYmlsaXRpZXMgb2YgdGhlCisgKiBtb25pdG9yIGJ5IGFkdmVydGlzaW5nIHRoZSBzdXBwb3J0ZWQgM0QgbGF5b3V0cyBpbiB0aGUgZmxhZ3Mgb2Ygc3RydWN0CisgKiBkcm1fbW9kZV9tb2RlaW5mby4KKyAqLworI2RlZmluZSBEUk1fQ0xJRU5UX0NBUF9TVEVSRU9fM0QJMQorCisvKioKKyAqIERSTV9DTElFTlRfQ0FQX1VOSVZFUlNBTF9QTEFORVMKKyAqCisgKiBpZiBzZXQgdG8gMSwgdGhlIERSTSBjb3JlIHdpbGwgZXhwb3NlIHRoZSBmdWxsIHVuaXZlcnNhbCBwbGFuZSBsaXN0CisgKiAoaW5jbHVkaW5nIHByaW1hcnkgYW5kIGN1cnNvciBwbGFuZXMpLgorICovCisjZGVmaW5lIERSTV9DTElFTlRfQ0FQX1VOSVZFUlNBTF9QTEFORVMgMgorCisvKiogRFJNX0lPQ1RMX1NFVF9DTElFTlRfQ0FQIGlvY3RsIGFyZ3VtZW50IHR5cGUgKi8KK3N0cnVjdCBkcm1fc2V0X2NsaWVudF9jYXAgeworCV9fdTY0IGNhcGFiaWxpdHk7CisJX191NjQgdmFsdWU7Cit9OworCisjZGVmaW5lIERSTV9DTE9FWEVDIE9fQ0xPRVhFQworc3RydWN0IGRybV9wcmltZV9oYW5kbGUgeworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBGbGFncy4uIG9ubHkgYXBwbGljYWJsZSBmb3IgaGFuZGxlLT5mZCAqLworCV9fdTMyIGZsYWdzOworCisJLyoqIFJldHVybmVkIGRtYWJ1ZiBmaWxlIGRlc2NyaXB0b3IgKi8KKwlfX3MzMiBmZDsKK307CisKKyNpbmNsdWRlICJkcm1fbW9kZS5oIgorCisjZGVmaW5lIERSTV9JT0NUTF9CQVNFCQkJJ2QnCisjZGVmaW5lIERSTV9JTyhucikJCQlfSU8oRFJNX0lPQ1RMX0JBU0UsbnIpCisjZGVmaW5lIERSTV9JT1IobnIsdHlwZSkJCV9JT1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKyNkZWZpbmUgRFJNX0lPVyhucix0eXBlKQkJX0lPVyhEUk1fSU9DVExfQkFTRSxucix0eXBlKQorI2RlZmluZSBEUk1fSU9XUihucix0eXBlKQkJX0lPV1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKworI2RlZmluZSBEUk1fSU9DVExfVkVSU0lPTgkJRFJNX0lPV1IoMHgwMCwgc3RydWN0IGRybV92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1VOSVFVRQkJRFJNX0lPV1IoMHgwMSwgc3RydWN0IGRybV91bmlxdWUpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFHSUMJCURSTV9JT1IoIDB4MDIsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0lSUV9CVVNJRAkJRFJNX0lPV1IoMHgwMywgc3RydWN0IGRybV9pcnFfYnVzaWQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFQICAgICAgICAgICAgICAgRFJNX0lPV1IoMHgwNCwgc3RydWN0IGRybV9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UICAgICAgICAgICAgRFJNX0lPV1IoMHgwNSwgc3RydWN0IGRybV9jbGllbnQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU1RBVFMgICAgICAgICAgICAgRFJNX0lPUiggMHgwNiwgc3RydWN0IGRybV9zdGF0cykKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9WRVJTSU9OCQlEUk1fSU9XUigweDA3LCBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERVNFVF9DVEwgICAgICAgICAgIERSTV9JT1coMHgwOCwgc3RydWN0IGRybV9tb2Rlc2V0X2N0bCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFTV9DTE9TRQkJRFJNX0lPVyAoMHgwOSwgc3RydWN0IGRybV9nZW1fY2xvc2UpCisjZGVmaW5lIERSTV9JT0NUTF9HRU1fRkxJTksJCURSTV9JT1dSKDB4MGEsIHN0cnVjdCBkcm1fZ2VtX2ZsaW5rKQorI2RlZmluZSBEUk1fSU9DVExfR0VNX09QRU4JCURSTV9JT1dSKDB4MGIsIHN0cnVjdCBkcm1fZ2VtX29wZW4pCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0FQCQlEUk1fSU9XUigweDBjLCBzdHJ1Y3QgZHJtX2dldF9jYXApCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfQ0xJRU5UX0NBUAlEUk1fSU9XKCAweDBkLCBzdHJ1Y3QgZHJtX3NldF9jbGllbnRfY2FwKQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBzdHJ1Y3QgZHJtX3VuaXF1ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FVVEhfTUFHSUMJCURSTV9JT1coIDB4MTEsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0JMT0NLCQkJRFJNX0lPV1IoMHgxMiwgc3RydWN0IGRybV9ibG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIHN0cnVjdCBkcm1fYmxvY2spCisjZGVmaW5lIERSTV9JT0NUTF9DT05UUk9MCQlEUk1fSU9XKCAweDE0LCBzdHJ1Y3QgZHJtX2NvbnRyb2wpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfTUFQCQlEUk1fSU9XUigweDE1LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfTUFSS19CVUZTCQlEUk1fSU9XKCAweDE3LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTCQlEUk1fSU9XUigweDE4LCBzdHJ1Y3QgZHJtX2J1Zl9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIHN0cnVjdCBkcm1fYnVmX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZSRUVfQlVGUwkJRFJNX0lPVyggMHgxYSwgc3RydWN0IGRybV9idWZfZnJlZSkKKworI2RlZmluZSBEUk1fSU9DVExfUk1fTUFQCQlEUk1fSU9XKCAweDFiLCBzdHJ1Y3QgZHJtX21hcCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWAkJRFJNX0lPVyggMHgxYywgc3RydWN0IGRybV9jdHhfcHJpdl9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYIAlEUk1fSU9XUigweDFkLCBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX01BU1RFUiAgICAgICAgICAgIERSTV9JTygweDFlKQorI2RlZmluZSBEUk1fSU9DVExfRFJPUF9NQVNURVIgICAgICAgICAgIERSTV9JTygweDFmKQorCisjZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0NUWAkJRFJNX0lPV1IoMHgyMSwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RfQ1RYCQlEUk1fSU9XKCAweDIyLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfU1dJVENIX0NUWAkJRFJNX0lPVyggMHgyNCwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9ORVdfQ1RYCQlEUk1fSU9XKCAweDI1LCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIHN0cnVjdCBkcm1fY3R4X3JlcykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9EUkFXCQlEUk1fSU9XUigweDI3LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9STV9EUkFXCQlEUk1fSU9XUigweDI4LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBzdHJ1Y3QgZHJtX2RtYSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0xPQ0sJCQlEUk1fSU9XKCAweDJhLCBzdHJ1Y3QgZHJtX2xvY2spCisjZGVmaW5lIERSTV9JT0NUTF9VTkxPQ0sJCURSTV9JT1coIDB4MmIsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgc3RydWN0IGRybV9sb2NrKQorCisjZGVmaW5lIERSTV9JT0NUTF9QUklNRV9IQU5ETEVfVE9fRkQgICAgRFJNX0lPV1IoMHgyZCwgc3RydWN0IGRybV9wcmltZV9oYW5kbGUpCisjZGVmaW5lIERSTV9JT0NUTF9QUklNRV9GRF9UT19IQU5ETEUgICAgRFJNX0lPV1IoMHgyZSwgc3RydWN0IGRybV9wcmltZV9oYW5kbGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFCQlEUk1fSU8oICAweDMwKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX1JFTEVBU0UJCURSTV9JTyggIDB4MzEpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfRU5BQkxFCQlEUk1fSU9XKCAweDMyLCBzdHJ1Y3QgZHJtX2FncF9tb2RlKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8JCURSTV9JT1IoIDB4MzMsIHN0cnVjdCBkcm1fYWdwX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQUxMT0MJCURSTV9JT1dSKDB4MzQsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9GUkVFCQlEUk1fSU9XKCAweDM1LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORAkJRFJNX0lPVyggMHgzNiwgc3RydWN0IGRybV9hZ3BfYmluZGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQJCURSTV9JT1coIDB4MzcsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NHX0FMTE9DCQlEUk1fSU9XUigweDM4LCBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyKQorI2RlZmluZSBEUk1fSU9DVExfU0dfRlJFRQkJRFJNX0lPVyggMHgzOSwgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlcikKKworI2RlZmluZSBEUk1fSU9DVExfV0FJVF9WQkxBTksJCURSTV9JT1dSKDB4M2EsIHVuaW9uIGRybV93YWl0X3ZibGFuaykKKworI2RlZmluZSBEUk1fSU9DVExfVVBEQVRFX0RSQVcJCURSTV9JT1coMHgzZiwgc3RydWN0IGRybV91cGRhdGVfZHJhdykKKworI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRSRVNPVVJDRVMJRFJNX0lPV1IoMHhBMCwgc3RydWN0IGRybV9tb2RlX2NhcmRfcmVzKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRDUlRDCQlEUk1fSU9XUigweEExLCBzdHJ1Y3QgZHJtX21vZGVfY3J0YykKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfU0VUQ1JUQwkJRFJNX0lPV1IoMHhBMiwgc3RydWN0IGRybV9tb2RlX2NydGMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0NVUlNPUgkJRFJNX0lPV1IoMHhBMywgc3RydWN0IGRybV9tb2RlX2N1cnNvcikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUR0FNTUEJCURSTV9JT1dSKDB4QTQsIHN0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfU0VUR0FNTUEJCURSTV9JT1dSKDB4QTUsIHN0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VURU5DT0RFUglEUk1fSU9XUigweEE2LCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVENPTk5FQ1RPUglEUk1fSU9XUigweEE3LCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Nvbm5lY3RvcikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQVRUQUNITU9ERQlEUk1fSU9XUigweEE4LCBzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0RFVEFDSE1PREUJRFJNX0lPV1IoMHhBOSwgc3RydWN0IGRybV9tb2RlX21vZGVfY21kKQorCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVFBST1BFUlRZCURSTV9JT1dSKDB4QUEsIHN0cnVjdCBkcm1fbW9kZV9nZXRfcHJvcGVydHkpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1NFVFBST1BFUlRZCURSTV9JT1dSKDB4QUIsIHN0cnVjdCBkcm1fbW9kZV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5KQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRQUk9QQkxPQglEUk1fSU9XUigweEFDLCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Jsb2IpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVEZCCQlEUk1fSU9XUigweEFELCBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9BRERGQgkJRFJNX0lPV1IoMHhBRSwgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfUk1GQgkJRFJNX0lPV1IoMHhBRiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9QQUdFX0ZMSVAJRFJNX0lPV1IoMHhCMCwgc3RydWN0IGRybV9tb2RlX2NydGNfcGFnZV9mbGlwKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9ESVJUWUZCCQlEUk1fSU9XUigweEIxLCBzdHJ1Y3QgZHJtX21vZGVfZmJfZGlydHlfY21kKQorCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0NSRUFURV9EVU1CIERSTV9JT1dSKDB4QjIsIHN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfTUFQX0RVTUIgICAgRFJNX0lPV1IoMHhCMywgc3RydWN0IGRybV9tb2RlX21hcF9kdW1iKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9ERVNUUk9ZX0RVTUIgICAgRFJNX0lPV1IoMHhCNCwgc3RydWN0IGRybV9tb2RlX2Rlc3Ryb3lfZHVtYikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUUExBTkVSRVNPVVJDRVMgRFJNX0lPV1IoMHhCNSwgc3RydWN0IGRybV9tb2RlX2dldF9wbGFuZV9yZXMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVFBMQU5FCURSTV9JT1dSKDB4QjYsIHN0cnVjdCBkcm1fbW9kZV9nZXRfcGxhbmUpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1NFVFBMQU5FCURSTV9JT1dSKDB4QjcsIHN0cnVjdCBkcm1fbW9kZV9zZXRfcGxhbmUpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0FEREZCMgkJRFJNX0lPV1IoMHhCOCwgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX09CSl9HRVRQUk9QRVJUSUVTCURSTV9JT1dSKDB4QjksIHN0cnVjdCBkcm1fbW9kZV9vYmpfZ2V0X3Byb3BlcnRpZXMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX09CSl9TRVRQUk9QRVJUWQlEUk1fSU9XUigweEJBLCBzdHJ1Y3QgZHJtX21vZGVfb2JqX3NldF9wcm9wZXJ0eSkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQ1VSU09SMgkJRFJNX0lPV1IoMHhCQiwgc3RydWN0IGRybV9tb2RlX2N1cnNvcjIpCisKKy8qKgorICogRGV2aWNlIHNwZWNpZmljIGlvY3RscyBzaG91bGQgb25seSBiZSBpbiB0aGVpciByZXNwZWN0aXZlIGhlYWRlcnMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgZnJvbSAweDQwIHRvIDB4OTkuCisgKiBHZW5lcmljIElPQ1RMUyByZXN0YXJ0IGF0IDB4QTAuCisgKgorICogXHNhIGRybUNvbW1hbmROb25lKCksIGRybUNvbW1hbmRSZWFkKCksIGRybUNvbW1hbmRXcml0ZSgpLCBhbmQKKyAqIGRybUNvbW1hbmRSZWFkV3JpdGUoKS4KKyAqLworI2RlZmluZSBEUk1fQ09NTUFORF9CQVNFICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRFJNX0NPTU1BTkRfRU5ECQkJMHhBMAorCisvKioKKyAqIEhlYWRlciBmb3IgZXZlbnRzIHdyaXR0ZW4gYmFjayB0byB1c2Vyc3BhY2Ugb24gdGhlIGRybSBmZC4gIFRoZQorICogdHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIGV2ZW50LCB0aGUgbGVuZ3RoIHNwZWNpZmllcyB0aGUgdG90YWwKKyAqIGxlbmd0aCBvZiB0aGUgZXZlbnQgKGluY2x1ZGluZyB0aGUgaGVhZGVyKSwgYW5kIHVzZXJfZGF0YSBpcworICogdHlwaWNhbGx5IGEgNjQgYml0IHZhbHVlIHBhc3NlZCB3aXRoIHRoZSBpb2N0bCB0aGF0IHRyaWdnZXJlZCB0aGUKKyAqIGV2ZW50LiAgQSByZWFkIG9uIHRoZSBkcm0gZmQgd2lsbCBhbHdheXMgb25seSByZXR1cm4gY29tcGxldGUKKyAqIGV2ZW50cywgdGhhdCBpcywgaWYgZm9yIGV4YW1wbGUgdGhlIHJlYWQgYnVmZmVyIGlzIDEwMCBieXRlcywgYW5kCisgKiB0aGVyZSBhcmUgdHdvIDY0IGJ5dGUgZXZlbnRzIHBlbmRpbmcsIG9ubHkgb25lIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogRXZlbnQgdHlwZXMgMCAtIDB4N2ZmZmZmZmYgYXJlIGdlbmVyaWMgZHJtIGV2ZW50cywgMHg4MDAwMDAwMCBhbmQKKyAqIHVwIGFyZSBjaGlwc2V0IHNwZWNpZmljLgorICovCitzdHJ1Y3QgZHJtX2V2ZW50IHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGxlbmd0aDsKK307CisKKyNkZWZpbmUgRFJNX0VWRU5UX1ZCTEFOSyAweDAxCisjZGVmaW5lIERSTV9FVkVOVF9GTElQX0NPTVBMRVRFIDB4MDIKKworc3RydWN0IGRybV9ldmVudF92YmxhbmsgeworCXN0cnVjdCBkcm1fZXZlbnQgYmFzZTsKKwlfX3U2NCB1c2VyX2RhdGE7CisJX191MzIgdHZfc2VjOworCV9fdTMyIHR2X3VzZWM7CisJX191MzIgc2VxdWVuY2U7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCisjZGVmaW5lIERSTV9DQVBfRFVNQl9CVUZGRVIgMHgxCisjZGVmaW5lIERSTV9DQVBfVkJMQU5LX0hJR0hfQ1JUQyAgIDB4MgorI2RlZmluZSBEUk1fQ0FQX0RVTUJfUFJFRkVSUkVEX0RFUFRIIDB4MworI2RlZmluZSBEUk1fQ0FQX0RVTUJfUFJFRkVSX1NIQURPVyAweDQKKyNkZWZpbmUgRFJNX0NBUF9QUklNRSAweDUKKyNkZWZpbmUgRFJNX0NBUF9USU1FU1RBTVBfTU9OT1RPTklDIDB4NgorI2RlZmluZSBEUk1fQ0FQX0FTWU5DX1BBR0VfRkxJUCAweDcKKworI2RlZmluZSBEUk1fUFJJTUVfQ0FQX0lNUE9SVCAweDEKKyNkZWZpbmUgRFJNX1BSSU1FX0NBUF9FWFBPUlQgMHgyCisKKy8qIHR5cGVkZWYgYXJlYSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBkcm1fY2xpcF9yZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyBkcm1fZHJhd2FibGVfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3RleF9yZWdpb24gZHJtX3RleF9yZWdpb25fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9od19sb2NrIGRybV9od19sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdmVyc2lvbiBkcm1fdmVyc2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VuaXF1ZSBkcm1fdW5pcXVlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbGlzdCBkcm1fbGlzdF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2Jsb2NrIGRybV9ibG9ja190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NvbnRyb2wgZHJtX2NvbnRyb2xfdDsKK3R5cGVkZWYgZW51bSBkcm1fbWFwX3R5cGUgZHJtX21hcF90eXBlX3Q7Cit0eXBlZGVmIGVudW0gZHJtX21hcF9mbGFncyBkcm1fbWFwX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIGRybV9jdHhfcHJpdl9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9tYXAgZHJtX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaWVudCBkcm1fY2xpZW50X3Q7Cit0eXBlZGVmIGVudW0gZHJtX3N0YXRfdHlwZSBkcm1fc3RhdF90eXBlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc3RhdHMgZHJtX3N0YXRzX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2xvY2tfZmxhZ3MgZHJtX2xvY2tfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9sb2NrIGRybV9sb2NrX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2RtYV9mbGFncyBkcm1fZG1hX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2Rlc2MgZHJtX2J1Zl9kZXNjX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2luZm8gZHJtX2J1Zl9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2ZyZWUgZHJtX2J1Zl9mcmVlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX3B1YiBkcm1fYnVmX3B1Yl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9tYXAgZHJtX2J1Zl9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kbWEgZHJtX2RtYV90OwordHlwZWRlZiB1bmlvbiBkcm1fd2FpdF92YmxhbmsgZHJtX3dhaXRfdmJsYW5rX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21vZGUgZHJtX2FncF9tb2RlX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2N0eF9mbGFncyBkcm1fY3R4X2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4IGRybV9jdHhfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcmVzIGRybV9jdHhfcmVzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZHJhdyBkcm1fZHJhd190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IGRybV91cGRhdGVfZHJhd190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2F1dGggZHJtX2F1dGhfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9pcnFfYnVzaWQgZHJtX2lycV9idXNpZF90OwordHlwZWRlZiBlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgZHJtX3ZibGFua19zZXFfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciBkcm1fYWdwX2J1ZmZlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIGRybV9hZ3BfYmluZGluZ190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9pbmZvIGRybV9hZ3BfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIGRybV9zY2F0dGVyX2dhdGhlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIGRybV9zZXRfdmVyc2lvbl90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9rbWQvbGliZHJtL2luY2x1ZGUvZHJtL2RybV9tb2RlLmggYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YzM5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgorICogQ29weXJpZ2h0IChjKSAyMDA3IEpha29iIEJvcm5lY3JhbnR6IDx3YWxsYnJha2VyQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFJNX01PREVfSAorI2RlZmluZSBfRFJNX01PREVfSAorCisjZGVmaW5lIERSTV9ESVNQTEFZX0lORk9fTEVOCTMyCisjZGVmaW5lIERSTV9DT05ORUNUT1JfTkFNRV9MRU4JMzIKKyNkZWZpbmUgRFJNX0RJU1BMQVlfTU9ERV9MRU4JMzIKKyNkZWZpbmUgRFJNX1BST1BfTkFNRV9MRU4JMzIKKworI2RlZmluZSBEUk1fTU9ERV9UWVBFX0JVSUxUSU4JKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQ0xPQ0tfQwkoKDE8PDEpIHwgRFJNX01PREVfVFlQRV9CVUlMVElOKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX0NSVENfQwkoKDE8PDIpIHwgRFJNX01PREVfVFlQRV9CVUlMVElOKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRAkoMTw8MykKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9ERUZBVUxUCSgxPDw0KQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX1VTRVJERUYJKDE8PDUpCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfRFJJVkVSCSgxPDw2KQorCisvKiBWaWRlbyBtb2RlIGZsYWdzICovCisvKiBiaXQgY29tcGF0aWJsZSB3aXRoIHRoZSB4b3JnIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BIU1lOQwkJCSgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05IU1lOQwkJCSgxPDwxKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BWU1lOQwkJCSgxPDwyKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05WU1lOQwkJCSgxPDwzKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRQkJCSgxPDw0KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0RCTFNDQU4JCQkoMTw8NSkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19DU1lOQwkJCSgxPDw2KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BDU1lOQwkJCSgxPDw3KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05DU1lOQwkJCSgxPDw4KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0hTS0VXCQkJKDE8PDkpIC8qIGhza2V3IHByb3ZpZGVkICovCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfQkNBU1QJCQkoMTw8MTApCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUElYTVVYCQkJKDE8PDExKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0RCTENMSwkJCSgxPDwxMikKKyNkZWZpbmUgRFJNX01PREVfRkxBR19DTEtESVYyCQkJKDE8PDEzKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHXzNEX01BU0sJCQkoMHgxZjw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX05PTkUJCQkoMDw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0ZSQU1FX1BBQ0tJTkcJCSgxPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfRklFTERfQUxURVJOQVRJVkUJKDI8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9MSU5FX0FMVEVSTkFUSVZFCSgzPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfU0lERV9CWV9TSURFX0ZVTEwJKDQ8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9MX0RFUFRICQkoNTw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0xfREVQVEhfR0ZYX0dGWF9ERVBUSAkoNjw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX1RPUF9BTkRfQk9UVE9NCSg3PDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfU0lERV9CWV9TSURFX0hBTEYJKDg8PDE0KQorCisKKy8qIERQTVMgZmxhZ3MgKi8KKy8qIGJpdCBjb21wYXRpYmxlIHdpdGggdGhlIHhvcmcgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfT04JMAorI2RlZmluZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlkJMQorI2RlZmluZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQJMgorI2RlZmluZSBEUk1fTU9ERV9EUE1TX09GRgkzCisKKy8qIFNjYWxpbmcgbW9kZSBvcHRpb25zICovCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX05PTkUJCTAgLyogVW5tb2RpZmllZCB0aW1pbmcgKGRpc3BsYXkgb3IKKwkJCQkJICAgICBzb2Z0d2FyZSBjYW4gc3RpbGwgc2NhbGUpICovCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU4JMSAvKiBGdWxsIHNjcmVlbiwgaWdub3JlIGFzcGVjdCAqLworI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9DRU5URVIJCTIgLyogQ2VudGVyZWQsIG5vIHNjYWxpbmcgKi8KKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfQVNQRUNUCQkzIC8qIEZ1bGwgc2NyZWVuLCBwcmVzZXJ2ZSBhc3BlY3QgKi8KKworLyogRGl0aGVyaW5nIG1vZGUgb3B0aW9ucyAqLworI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT0ZGCTAKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX09OCTEKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX0FVVE8gMgorCisvKiBEaXJ0eSBpbmZvIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfRElSVFlfT0ZGICAgICAgMAorI2RlZmluZSBEUk1fTU9ERV9ESVJUWV9PTiAgICAgICAxCisjZGVmaW5lIERSTV9NT0RFX0RJUlRZX0FOTk9UQVRFIDIKKworc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIHsKKwlfX3UzMiBjbG9jazsKKwlfX3UxNiBoZGlzcGxheSwgaHN5bmNfc3RhcnQsIGhzeW5jX2VuZCwgaHRvdGFsLCBoc2tldzsKKwlfX3UxNiB2ZGlzcGxheSwgdnN5bmNfc3RhcnQsIHZzeW5jX2VuZCwgdnRvdGFsLCB2c2NhbjsKKworCV9fdTMyIHZyZWZyZXNoOworCisJX191MzIgZmxhZ3M7CisJX191MzIgdHlwZTsKKwljaGFyIG5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU5dOworfTsKKworc3RydWN0IGRybV9tb2RlX2NhcmRfcmVzIHsKKwlfX3U2NCBmYl9pZF9wdHI7CisJX191NjQgY3J0Y19pZF9wdHI7CisJX191NjQgY29ubmVjdG9yX2lkX3B0cjsKKwlfX3U2NCBlbmNvZGVyX2lkX3B0cjsKKwlfX3UzMiBjb3VudF9mYnM7CisJX191MzIgY291bnRfY3J0Y3M7CisJX191MzIgY291bnRfY29ubmVjdG9yczsKKwlfX3UzMiBjb3VudF9lbmNvZGVyczsKKwlfX3UzMiBtaW5fd2lkdGgsIG1heF93aWR0aDsKKwlfX3UzMiBtaW5faGVpZ2h0LCBtYXhfaGVpZ2h0OworfTsKKworc3RydWN0IGRybV9tb2RlX2NydGMgeworCV9fdTY0IHNldF9jb25uZWN0b3JzX3B0cjsKKwlfX3UzMiBjb3VudF9jb25uZWN0b3JzOworCisJX191MzIgY3J0Y19pZDsgLyoqPCBJZCAqLworCV9fdTMyIGZiX2lkOyAvKio8IElkIG9mIGZyYW1lYnVmZmVyICovCisKKwlfX3UzMiB4LCB5OyAvKio8IFBvc2l0aW9uIG9uIHRoZSBmcmFtZXVmZmVyICovCisKKwlfX3UzMiBnYW1tYV9zaXplOworCV9fdTMyIG1vZGVfdmFsaWQ7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIG1vZGU7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX1BSRVNFTlRfVE9QX0ZJRUxEICAgICAoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfUFJFU0VOVF9CT1RUT01fRklFTEQgICgxPDwxKQorCisvKiBQbGFuZXMgYmxlbmQgd2l0aCBvciBvdmVycmlkZSBvdGhlciBiaXRzIG9uIHRoZSBDUlRDICovCitzdHJ1Y3QgZHJtX21vZGVfc2V0X3BsYW5lIHsKKwlfX3UzMiBwbGFuZV9pZDsKKwlfX3UzMiBjcnRjX2lkOworCV9fdTMyIGZiX2lkOyAvKiBmYiBvYmplY3QgY29udGFpbnMgc3VyZmFjZSBmb3JtYXQgdHlwZSAqLworCV9fdTMyIGZsYWdzOworCisJLyogU2lnbmVkIGRlc3QgbG9jYXRpb24gYWxsb3dzIGl0IHRvIGJlIHBhcnRpYWxseSBvZmYgc2NyZWVuICovCisJX19zMzIgY3J0Y194LCBjcnRjX3k7CisJX191MzIgY3J0Y193LCBjcnRjX2g7CisKKwkvKiBTb3VyY2UgdmFsdWVzIGFyZSAxNi4xNiBmaXhlZCBwb2ludCAqLworCV9fdTMyIHNyY194LCBzcmNfeTsKKwlfX3UzMiBzcmNfaCwgc3JjX3c7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X3BsYW5lIHsKKwlfX3UzMiBwbGFuZV9pZDsKKworCV9fdTMyIGNydGNfaWQ7CisJX191MzIgZmJfaWQ7CisKKwlfX3UzMiBwb3NzaWJsZV9jcnRjczsKKwlfX3UzMiBnYW1tYV9zaXplOworCisJX191MzIgY291bnRfZm9ybWF0X3R5cGVzOworCV9fdTY0IGZvcm1hdF90eXBlX3B0cjsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9nZXRfcGxhbmVfcmVzIHsKKwlfX3U2NCBwbGFuZV9pZF9wdHI7CisJX191MzIgY291bnRfcGxhbmVzOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX05PTkUJMAorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0RBQwkxCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVE1EUwkyCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfTFZEUwkzCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVFZEQUMJNAorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1ZJUlRVQUwgNQorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0RTSQk2CisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfRFBNU1QJNworCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIgeworCV9fdTMyIGVuY29kZXJfaWQ7CisJX191MzIgZW5jb2Rlcl90eXBlOworCisJX191MzIgY3J0Y19pZDsgLyoqPCBJZCBvZiBjcnRjICovCisKKwlfX3UzMiBwb3NzaWJsZV9jcnRjczsKKwlfX3UzMiBwb3NzaWJsZV9jbG9uZXM7Cit9OworCisvKiBUaGlzIGlzIGZvciBjb25uZWN0b3JzIHdpdGggbXVsdGlwbGUgc2lnbmFsIHR5cGVzLiAqLworLyogVHJ5IHRvIG1hdGNoIERSTV9NT0RFX0NPTk5FQ1RPUl9YIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuICovCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9BdXRvbWF0aWMJMAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfVW5rbm93bgkwCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklECTMKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUEJNAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9zaXRlCTUKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTwk2CisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb25lbnQJOAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfU0NBUlQJOQorCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duCTAKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1ZHQQkJMQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSQkJMgorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRAkJMworI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQQkJNAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlCTUKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTwk2CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTCQk3CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb25lbnQJOAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfOVBpbkRJTgk5CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydAkxMAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEJMTEKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCCTEyCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9UVgkJMTMKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX2VEUAkJMTQKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUwgICAgICAxNQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFNJCQkxNgorCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Nvbm5lY3RvciB7CisKKwlfX3U2NCBlbmNvZGVyc19wdHI7CisJX191NjQgbW9kZXNfcHRyOworCV9fdTY0IHByb3BzX3B0cjsKKwlfX3U2NCBwcm9wX3ZhbHVlc19wdHI7CisKKwlfX3UzMiBjb3VudF9tb2RlczsKKwlfX3UzMiBjb3VudF9wcm9wczsKKwlfX3UzMiBjb3VudF9lbmNvZGVyczsKKworCV9fdTMyIGVuY29kZXJfaWQ7IC8qKjwgQ3VycmVudCBFbmNvZGVyICovCisJX191MzIgY29ubmVjdG9yX2lkOyAvKio8IElkICovCisJX191MzIgY29ubmVjdG9yX3R5cGU7CisJX191MzIgY29ubmVjdG9yX3R5cGVfaWQ7CisKKwlfX3UzMiBjb25uZWN0aW9uOworCV9fdTMyIG1tX3dpZHRoLCBtbV9oZWlnaHQ7IC8qKjwgSHhXIGluIG1pbGxpbWV0ZXJzICovCisJX191MzIgc3VicGl4ZWw7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX1BST1BfUEVORElORwkoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9SQU5HRQkoMTw8MSkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9JTU1VVEFCTEUJKDE8PDIpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfRU5VTQkoMTw8MykgLyogZW51bWVyYXRlZCB0eXBlIHdpdGggdGV4dCBzdHJpbmdzICovCisjZGVmaW5lIERSTV9NT0RFX1BST1BfQkxPQgkoMTw8NCkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9CSVRNQVNLCSgxPDw1KSAvKiBiaXRtYXNrIG9mIGVudW1lcmF0ZWQgdHlwZXMgKi8KKworLyogbm9uLWV4dGVuZGVkIHR5cGVzOiBsZWdhY3kgYml0bWFzaywgb25lIGJpdCBwZXIgdHlwZTogKi8KKyNkZWZpbmUgRFJNX01PREVfUFJPUF9MRUdBQ1lfVFlQRSAgKCBcCisJCURSTV9NT0RFX1BST1BfUkFOR0UgfCBcCisJCURSTV9NT0RFX1BST1BfRU5VTSB8IFwKKwkJRFJNX01PREVfUFJPUF9CTE9CIHwgXAorCQlEUk1fTU9ERV9QUk9QX0JJVE1BU0spCisKKy8qIGV4dGVuZGVkLXR5cGVzOiByYXRoZXIgdGhhbiBjb250aW51ZSB0byBjb25zdW1lIGEgYml0IHBlciB0eXBlLAorICogZ3JhYiBhIGNodW5rIG9mIHRoZSBiaXRzIHRvIHVzZSBhcyBpbnRlZ2VyIHR5cGUgaWQuCisgKi8KKyNkZWZpbmUgRFJNX01PREVfUFJPUF9FWFRFTkRFRF9UWVBFCTB4MDAwMGZmYzAKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9UWVBFKG4pCQkoKG4pIDw8IDYpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfT0JKRUNUCQlEUk1fTU9ERV9QUk9QX1RZUEUoMSkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9TSUdORURfUkFOR0UJRFJNX01PREVfUFJPUF9UWVBFKDIpCisKK3N0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtIHsKKwlfX3U2NCB2YWx1ZTsKKwljaGFyIG5hbWVbRFJNX1BST1BfTkFNRV9MRU5dOworfTsKKworc3RydWN0IGRybV9tb2RlX2dldF9wcm9wZXJ0eSB7CisJX191NjQgdmFsdWVzX3B0cjsgLyogdmFsdWVzIGFuZCBibG9iIGxlbmd0aHMgKi8KKwlfX3U2NCBlbnVtX2Jsb2JfcHRyOyAvKiBlbnVtIGFuZCBibG9iIGlkIHB0cnMgKi8KKworCV9fdTMyIHByb3BfaWQ7CisJX191MzIgZmxhZ3M7CisJY2hhciBuYW1lW0RSTV9QUk9QX05BTUVfTEVOXTsKKworCV9fdTMyIGNvdW50X3ZhbHVlczsKKwlfX3UzMiBjb3VudF9lbnVtX2Jsb2JzOworfTsKKworc3RydWN0IGRybV9tb2RlX2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkgeworCV9fdTY0IHZhbHVlOworCV9fdTMyIHByb3BfaWQ7CisJX191MzIgY29ubmVjdG9yX2lkOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyAweGNjY2NjY2NjCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9DT05ORUNUT1IgMHhjMGMwYzBjMAorI2RlZmluZSBEUk1fTU9ERV9PQkpFQ1RfRU5DT0RFUiAweGUwZTBlMGUwCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9NT0RFIDB4ZGVkZWRlZGUKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX1BST1BFUlRZIDB4YjBiMGIwYjAKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0ZCIDB4ZmJmYmZiZmIKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0JMT0IgMHhiYmJiYmJiYgorI2RlZmluZSBEUk1fTU9ERV9PQkpFQ1RfUExBTkUgMHhlZWVlZWVlZQorCitzdHJ1Y3QgZHJtX21vZGVfb2JqX2dldF9wcm9wZXJ0aWVzIHsKKwlfX3U2NCBwcm9wc19wdHI7CisJX191NjQgcHJvcF92YWx1ZXNfcHRyOworCV9fdTMyIGNvdW50X3Byb3BzOworCV9fdTMyIG9ial9pZDsKKwlfX3UzMiBvYmpfdHlwZTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9vYmpfc2V0X3Byb3BlcnR5IHsKKwlfX3U2NCB2YWx1ZTsKKwlfX3UzMiBwcm9wX2lkOworCV9fdTMyIG9ial9pZDsKKwlfX3UzMiBvYmpfdHlwZTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9nZXRfYmxvYiB7CisJX191MzIgYmxvYl9pZDsKKwlfX3UzMiBsZW5ndGg7CisJX191NjQgZGF0YTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9mYl9jbWQgeworCV9fdTMyIGZiX2lkOworCV9fdTMyIHdpZHRoLCBoZWlnaHQ7CisJX191MzIgcGl0Y2g7CisJX191MzIgYnBwOworCV9fdTMyIGRlcHRoOworCS8qIGRyaXZlciBzcGVjaWZpYyBoYW5kbGUgKi8KKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX0ZCX0lOVEVSTEFDRUQgKDE8PDApIC8qIGZvciBpbnRlcmxhY2VkIGZyYW1lYnVmZmVycyAqLworCitzdHJ1Y3QgZHJtX21vZGVfZmJfY21kMiB7CisJX191MzIgZmJfaWQ7CisJX191MzIgd2lkdGgsIGhlaWdodDsKKwlfX3UzMiBwaXhlbF9mb3JtYXQ7IC8qIGZvdXJjYyBjb2RlIGZyb20gZHJtX2ZvdXJjYy5oICovCisJX191MzIgZmxhZ3M7CisKKwkvKgorCSAqIEluIGNhc2Ugb2YgcGxhbmFyIGZvcm1hdHMsIHRoaXMgaW9jdGwgYWxsb3dzIHVwIHRvIDQKKwkgKiBidWZmZXIgb2JqZWN0cyB3aXRoIG9mZnNldHMgYW5kIHBpdGNoZXMgcGVyIHBsYW5lLgorCSAqIFRoZSBwaXRjaCBhbmQgb2Zmc2V0IG9yZGVyIGlzIGRpY3RhdGVkIGJ5IHRoZSBmb3VyY2MsCisJICogZS5nLiBOVjEyIChodHRwOi8vZm91cmNjLm9yZy95dXYucGhwI05WMTIpIGlzIGRlc2NyaWJlZCBhczoKKwkgKgorCSAqICAgWVVWIDQ6MjowIGltYWdlIHdpdGggYSBwbGFuZSBvZiA4IGJpdCBZIHNhbXBsZXMKKwkgKiAgIGZvbGxvd2VkIGJ5IGFuIGludGVybGVhdmVkIFUvViBwbGFuZSBjb250YWluaW5nCisJICogICA4IGJpdCAyeDIgc3Vic2FtcGxlZCBjb2xvdXIgZGlmZmVyZW5jZSBzYW1wbGVzLgorCSAqCisJICogU28gaXQgd291bGQgY29uc2lzdCBvZiBZIGFzIG9mZnNldFswXSBhbmQgVVYgYXMKKwkgKiBvZmZzZXRbMV0uICBOb3RlIHRoYXQgb2Zmc2V0WzBdIHdpbGwgZ2VuZXJhbGx5CisJICogYmUgMC4KKwkgKi8KKwlfX3UzMiBoYW5kbGVzWzRdOworCV9fdTMyIHBpdGNoZXNbNF07IC8qIHBpdGNoIGZvciBlYWNoIHBsYW5lICovCisJX191MzIgb2Zmc2V0c1s0XTsgLyogb2Zmc2V0IG9mIGVhY2ggcGxhbmUgKi8KK307CisKKyNkZWZpbmUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfQ09QWSAweDAxCisjZGVmaW5lIERSTV9NT0RFX0ZCX0RJUlRZX0FOTk9UQVRFX0ZJTEwgMHgwMgorI2RlZmluZSBEUk1fTU9ERV9GQl9ESVJUWV9GTEFHUyAgICAgICAgIDB4MDMKKworLyoKKyAqIE1hcmsgYSByZWdpb24gb2YgYSBmcmFtZWJ1ZmZlciBhcyBkaXJ0eS4KKyAqCisgKiBTb21lIGhhcmR3YXJlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlIGRpc3BsYXkgY29udGVudHMKKyAqIGFzIGEgaGFyZHdhcmUgb3Igc29mdHdhcmUgZHJhdyB0byBhIGZyYW1lYnVmZmVyLiBUaGlzIGlvY3RsCisgKiBhbGxvd3MgdXNlcnNwYWNlIHRvIHRlbGwgdGhlIGtlcm5lbCBhbmQgdGhlIGhhcmR3YXJlIHdoYXQKKyAqIHJlZ2lvbnMgb2YgdGhlIGZyYW1lYnVmZmVyIGhhdmUgY2hhbmdlZC4KKyAqCisgKiBUaGUga2VybmVsIG9yIGhhcmR3YXJlIGlzIGZyZWUgdG8gdXBkYXRlIG1vcmUgdGhlbiBqdXN0IHRoZQorICogcmVnaW9uIHNwZWNpZmllZCBieSB0aGUgY2xpcCByZWN0cy4gVGhlIGtlcm5lbCBvciBoYXJkd2FyZQorICogbWF5IGFsc28gZGVsYXkgYW5kL29yIGNvYWxlc2NlIHNldmVyYWwgY2FsbHMgdG8gZGlydHkgaW50byBhCisgKiBzaW5nbGUgdXBkYXRlLgorICoKKyAqIFVzZXJzcGFjZSBtYXkgYW5ub3RhdGUgdGhlIHVwZGF0ZXMsIHRoZSBhbm5vdGF0ZXMgYXJlIGEKKyAqIHByb21pc2UgbWFkZSBieSB0aGUgY2FsbGVyIHRoYXQgdGhlIGNoYW5nZSBpcyBlaXRoZXIgYSBjb3B5CisgKiBvZiBwaXhlbHMgb3IgYSBmaWxsIG9mIGEgc2luZ2xlIGNvbG9yIGluIHRoZSByZWdpb24gc3BlY2lmaWVkLgorICoKKyAqIElmIHRoZSBEUk1fTU9ERV9GQl9ESVJUWV9BTk5PVEFURV9DT1BZIGZsYWcgaXMgZ2l2ZW4gdGhlbgorICogdGhlIG51bWJlciBvZiB1cGRhdGVkIHJlZ2lvbnMgYXJlIGhhbGYgb2YgbnVtX2NsaXBzIGdpdmVuLAorICogd2hlcmUgdGhlIGNsaXAgcmVjdHMgYXJlIHBhaXJlZCBpbiBzcmMgYW5kIGRzdC4gVGhlIHdpZHRoIGFuZAorICogaGVpZ2h0IG9mIGVhY2ggb25lIG9mIHRoZSBwYWlycyBtdXN0IG1hdGNoLgorICoKKyAqIElmIHRoZSBEUk1fTU9ERV9GQl9ESVJUWV9BTk5PVEFURV9GSUxMIGZsYWcgaXMgZ2l2ZW4gdGhlIGNhbGxlcgorICogcHJvbWlzZXMgdGhhdCB0aGUgcmVnaW9uIHNwZWNpZmllZCBvZiB0aGUgY2xpcCByZWN0cyBpcyBmaWxsZWQKKyAqIGNvbXBsZXRlbHkgd2l0aCBhIHNpbmdsZSBjb2xvciBhcyBnaXZlbiBpbiB0aGUgY29sb3IgYXJndW1lbnQuCisgKi8KKworc3RydWN0IGRybV9tb2RlX2ZiX2RpcnR5X2NtZCB7CisJX191MzIgZmJfaWQ7CisJX191MzIgZmxhZ3M7CisJX191MzIgY29sb3I7CisJX191MzIgbnVtX2NsaXBzOworCV9fdTY0IGNsaXBzX3B0cjsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9tb2RlX2NtZCB7CisJX191MzIgY29ubmVjdG9yX2lkOworCXN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbyBtb2RlOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9DVVJTT1JfQk8JKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX0NVUlNPUl9NT1ZFCSgxPDwxKQorCisvKgorICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBpbiBmbGFncyBkaWZmZXJlbnQgbWVtYmVycyBhcmUgdXNlZC4KKyAqCisgKiBDVVJTT1JfQk8gdXNlcworICogICAgY3J0YworICogICAgd2lkdGgKKyAqICAgIGhlaWdodAorICogICAgaGFuZGxlIC0gaWYgMCB0dXJucyB0aGUgY3Vyc29yIG9mCisgKgorICogQ1VSU09SX01PVkUgdXNlcworICogICAgY3J0YworICogICAgeAorICogICAgeQorICovCitzdHJ1Y3QgZHJtX21vZGVfY3Vyc29yIHsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjcnRjX2lkOworCV9fczMyIHg7CisJX19zMzIgeTsKKwlfX3UzMiB3aWR0aDsKKwlfX3UzMiBoZWlnaHQ7CisJLyogZHJpdmVyIHNwZWNpZmljIGhhbmRsZSAqLworCV9fdTMyIGhhbmRsZTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9jdXJzb3IyIHsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjcnRjX2lkOworCV9fczMyIHg7CisJX19zMzIgeTsKKwlfX3UzMiB3aWR0aDsKKwlfX3UzMiBoZWlnaHQ7CisJLyogZHJpdmVyIHNwZWNpZmljIGhhbmRsZSAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3MzMiBob3RfeDsKKwlfX3MzMiBob3RfeTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCB7CisJX191MzIgY3J0Y19pZDsKKwlfX3UzMiBnYW1tYV9zaXplOworCisJLyogcG9pbnRlcnMgdG8gYXJyYXlzICovCisJX191NjQgcmVkOworCV9fdTY0IGdyZWVuOworCV9fdTY0IGJsdWU7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9FVkVOVCAweDAxCisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9BU1lOQyAweDAyCisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9GTEFHUyAoRFJNX01PREVfUEFHRV9GTElQX0VWRU5UfERSTV9NT0RFX1BBR0VfRkxJUF9BU1lOQykKKworLyoKKyAqIFJlcXVlc3QgYSBwYWdlIGZsaXAgb24gdGhlIHNwZWNpZmllZCBjcnRjLgorICoKKyAqIFRoaXMgaW9jdGwgd2lsbCBhc2sgS01TIHRvIHNjaGVkdWxlIGEgcGFnZSBmbGlwIGZvciB0aGUgc3BlY2lmaWVkCisgKiBjcnRjLiAgT25jZSBhbnkgcGVuZGluZyByZW5kZXJpbmcgdGFyZ2V0aW5nIHRoZSBzcGVjaWZpZWQgZmIgKGFzIG9mCisgKiBpb2N0bCB0aW1lKSBoYXMgY29tcGxldGVkLCB0aGUgY3J0YyB3aWxsIGJlIHJlcHJvZ3JhbW1lZCB0byBkaXNwbGF5CisgKiB0aGF0IGZiIGFmdGVyIHRoZSBuZXh0IHZlcnRpY2FsIHJlZnJlc2guICBUaGUgaW9jdGwgcmV0dXJucworICogaW1tZWRpYXRlbHksIGJ1dCBzdWJzZXF1ZW50IHJlbmRlcmluZyB0byB0aGUgY3VycmVudCBmYiB3aWxsIGJsb2NrCisgKiBpbiB0aGUgZXhlY2J1ZmZlciBpb2N0bCB1bnRpbCB0aGUgcGFnZSBmbGlwIGhhcHBlbnMuICBJZiBhIHBhZ2UKKyAqIGZsaXAgaXMgYWxyZWFkeSBwZW5kaW5nIGFzIHRoZSBpb2N0bCBpcyBjYWxsZWQsIEVCVVNZIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIFRoZSBpb2N0bCBzdXBwb3J0cyBvbmUgZmxhZywgRFJNX01PREVfUEFHRV9GTElQX0VWRU5ULCB3aGljaCB3aWxsCisgKiByZXF1ZXN0IHRoYXQgZHJtIHNlbmRzIGJhY2sgYSB2YmxhbmsgZXZlbnQgKHNlZSBkcm0uaDogc3RydWN0CisgKiBkcm1fZXZlbnRfdmJsYW5rKSB3aGVuIHRoZSBwYWdlIGZsaXAgaXMgZG9uZS4gIFRoZSB1c2VyX2RhdGEgZmllbGQKKyAqIHBhc3NlZCBpbiB3aXRoIHRoaXMgaW9jdGwgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgdXNlcl9kYXRhIGZpZWxkCisgKiBpbiB0aGUgdmJsYW5rIGV2ZW50IHN0cnVjdC4KKyAqCisgKiBUaGUgcmVzZXJ2ZWQgZmllbGQgbXVzdCBiZSB6ZXJvIHVudGlsIHdlIGZpZ3VyZSBvdXQgc29tZXRoaW5nCisgKiBjbGV2ZXIgdG8gdXNlIGl0IGZvci4KKyAqLworCitzdHJ1Y3QgZHJtX21vZGVfY3J0Y19wYWdlX2ZsaXAgeworCV9fdTMyIGNydGNfaWQ7CisJX191MzIgZmJfaWQ7CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgdXNlcl9kYXRhOworfTsKKworLyogY3JlYXRlIGEgZHVtYiBzY2Fub3V0IGJ1ZmZlciAqLworc3RydWN0IGRybV9tb2RlX2NyZWF0ZV9kdW1iIHsKKyAgICAgICAgX191MzIgaGVpZ2h0OworICAgICAgICBfX3UzMiB3aWR0aDsKKyAgICAgICAgX191MzIgYnBwOworICAgICAgICBfX3UzMiBmbGFnczsKKyAgICAgICAgLyogaGFuZGxlLCBwaXRjaCwgc2l6ZSB3aWxsIGJlIHJldHVybmVkICovCisgICAgICAgIF9fdTMyIGhhbmRsZTsKKyAgICAgICAgX191MzIgcGl0Y2g7CisgICAgICAgIF9fdTY0IHNpemU7Cit9OworCisvKiBzZXQgdXAgZm9yIG1tYXAgb2YgYSBkdW1iIHNjYW5vdXQgYnVmZmVyICovCitzdHJ1Y3QgZHJtX21vZGVfbWFwX2R1bWIgeworICAgICAgICAvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1hcHBlZC4gKi8KKyAgICAgICAgX191MzIgaGFuZGxlOworICAgICAgICBfX3UzMiBwYWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGYWtlIG9mZnNldCB0byB1c2UgZm9yIHN1YnNlcXVlbnQgbW1hcCBjYWxsCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgaXMgYSBmaXhlZC1zaXplIHR5cGUgZm9yIDMyLzY0IGNvbXBhdGliaWxpdHkuCisgICAgICAgICAqLworICAgICAgICBfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZGVzdHJveV9kdW1iIHsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9rbWQvbGliZHJtL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmggYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbmNsdWRlL2RybS9pOTE1X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmRhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbmNsdWRlL2RybS9pOTE1X2RybS5oCkBAIC0wLDAgKzEsMTEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0k5MTVfRFJNX0hfCisjZGVmaW5lIF9JOTE1X0RSTV9IXworCisjaW5jbHVkZSA8ZHJtLmg+CisKKy8qIFBsZWFzZSBub3RlIHRoYXQgbW9kaWZpY2F0aW9ucyB0byBhbGwgc3RydWN0cyBkZWZpbmVkIGhlcmUgYXJlCisgKiBzdWJqZWN0IHRvIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGNvbnN0cmFpbnRzLgorICovCisKKy8qKgorICogRE9DOiB1ZXZlbnRzIGdlbmVyYXRlZCBieSBpOTE1IG9uIGl0J3MgZGV2aWNlIG5vZGUKKyAqCisgKiBJOTE1X0wzX1BBUklUWV9VRVZFTlQgLSBHZW5lcmF0ZWQgd2hlbiB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgcGFyaXR5IG1pc21hdGNoCisgKglldmVudCBmcm9tIHRoZSBncHUgbDMgY2FjaGUuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VwcGxpZWQgaXMgUk9XLAorICoJQkFOSywgU1VCQkFOSywgU0xJQ0Ugb2YgdGhlIGFmZmVjdGVkIGNhY2hlbGluZS4gVXNlcnNwYWNlIHNob3VsZCBrZWVwCisgKgl0cmFjayBvZiB0aGVzZSBldmVudHMgYW5kIGlmIGEgc3BlY2lmaWMgY2FjaGUtbGluZSBzZWVtcyB0byBoYXZlIGEKKyAqCXBlcnNpc3RlbnQgZXJyb3IgcmVtYXAgaXQgd2l0aCB0aGUgbDMgcmVtYXBwaW5nIHRvb2wgc3VwcGxpZWQgaW4KKyAqCWludGVsLWdwdS10b29scy4gIFRoZSB2YWx1ZSBzdXBwbGllZCB3aXRoIHRoZSBldmVudCBpcyBhbHdheXMgMS4KKyAqCisgKiBJOTE1X0VSUk9SX1VFVkVOVCAtIEdlbmVyYXRlZCB1cG9uIGVycm9yIGRldGVjdGlvbiwgY3VycmVudGx5IG9ubHkgdmlhCisgKgloYW5nY2hlY2suIFRoZSBlcnJvciBkZXRlY3Rpb24gZXZlbnQgaXMgYSBnb29kIGluZGljYXRvciBvZiB3aGVuIHRoaW5ncworICoJYmVnYW4gdG8gZ28gYmFkbHkuIFRoZSB2YWx1ZSBzdXBwbGllZCB3aXRoIHRoZSBldmVudCBpcyBhIDEgdXBvbiBlcnJvcgorICoJZGV0ZWN0aW9uLCBhbmQgYSAwIHVwb24gcmVzZXQgY29tcGxldGlvbiwgc2lnbmlmeWluZyBubyBtb3JlIGVycm9yCisgKglleGlzdHMuIE5PVEU6IERpc2FibGluZyBoYW5nY2hlY2sgb3IgcmVzZXQgdmlhIG1vZHVsZSBwYXJhbWV0ZXIgd2lsbAorICoJY2F1c2UgdGhlIHJlbGF0ZWQgZXZlbnRzIHRvIG5vdCBiZSBzZWVuLgorICoKKyAqIEk5MTVfUkVTRVRfVUVWRU5UIC0gRXZlbnQgaXMgZ2VuZXJhdGVkIGp1c3QgYmVmb3JlIGFuIGF0dGVtcHQgdG8gcmVzZXQgdGhlCisgKgl0aGUgR1BVLiBUaGUgdmFsdWUgc3VwcGxpZWQgd2l0aCB0aGUgZXZlbnQgaXMgYWx3YXlzIDEuIE5PVEU6IERpc2FibGUKKyAqCXJlc2V0IHZpYSBtb2R1bGUgcGFyYW1ldGVyIHdpbGwgY2F1c2UgdGhpcyBldmVudCB0byBub3QgYmUgc2Vlbi4KKyAqLworI2RlZmluZSBJOTE1X0wzX1BBUklUWV9VRVZFTlQJCSJMM19QQVJJVFlfRVJST1IiCisjZGVmaW5lIEk5MTVfRVJST1JfVUVWRU5UCQkiRVJST1IiCisjZGVmaW5lIEk5MTVfUkVTRVRfVUVWRU5UCQkiUkVTRVQiCisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiAxNmssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCAyNTUgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJOTE1X05SX1RFWF9SRUdJT05TIDI1NQkvKiB0YWJsZSBzaXplIDJrIC0gbWF4aW11bSBkdWUgdG8gdXNlCisJCQkJICogb2YgY2hhcnMgZm9yIG5leHQvcHJldiBpbmRpY2VzICovCisjZGVmaW5lIEk5MTVfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTQKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X2luaXQgeworCWVudW0geworCQlJOTE1X0lOSVRfRE1BID0gMHgwMSwKKwkJSTkxNV9DTEVBTlVQX0RNQSA9IDB4MDIsCisJCUk5MTVfUkVTVU1FX0RNQSA9IDB4MDMKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCB3OworCXVuc2lnbmVkIGludCBoOworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2hfYml0czsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IGNwcDsKKwl1bnNpZ25lZCBpbnQgY2hpcHNldDsKK30gZHJtX2k5MTVfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfc2FyZWEgeworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W0k5MTVfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlpbnQgbGFzdF91cGxvYWQ7CS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLworCWludCBsYXN0X2VucXVldWU7CS8qIGxhc3QgdGltZSBhIGJ1ZmZlciB3YXMgZW5xdWV1ZWQgKi8KKwlpbnQgbGFzdF9kaXNwYXRjaDsJLyogYWdlIG9mIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYnVmZmVyICovCisJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLworCWludCB0ZXhBZ2U7CisJaW50IHBmX2VuYWJsZWQ7CQkvKiBpcyBwYWdlZmxpcHBpbmcgYWxsb3dlZD8gKi8KKwlpbnQgcGZfYWN0aXZlOworCWludCBwZl9jdXJyZW50X3BhZ2U7CS8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCisJaW50IHBlcmZfYm94ZXM7CQkvKiBwZXJmb3JtYW5jZSBib3hlcyB0byBiZSBkaXNwbGF5ZWQgKi8KKwlpbnQgd2lkdGgsIGhlaWdodDsgICAgICAvKiBzY3JlZW4gc2l6ZSBpbiBwaXhlbHMgKi8KKworCWRybV9oYW5kbGVfdCBmcm9udF9oYW5kbGU7CisJaW50IGZyb250X29mZnNldDsKKwlpbnQgZnJvbnRfc2l6ZTsKKworCWRybV9oYW5kbGVfdCBiYWNrX2hhbmRsZTsKKwlpbnQgYmFja19vZmZzZXQ7CisJaW50IGJhY2tfc2l6ZTsKKworCWRybV9oYW5kbGVfdCBkZXB0aF9oYW5kbGU7CisJaW50IGRlcHRoX29mZnNldDsKKwlpbnQgZGVwdGhfc2l6ZTsKKworCWRybV9oYW5kbGVfdCB0ZXhfaGFuZGxlOworCWludCB0ZXhfb2Zmc2V0OworCWludCB0ZXhfc2l6ZTsKKwlpbnQgbG9nX3RleF9ncmFudWxhcml0eTsKKwlpbnQgcGl0Y2g7CisJaW50IHJvdGF0aW9uOyAgICAgICAgICAgLyogMCwgOTAsIDE4MCBvciAyNzAgKi8KKwlpbnQgcm90YXRlZF9vZmZzZXQ7CisJaW50IHJvdGF0ZWRfc2l6ZTsKKwlpbnQgcm90YXRlZF9waXRjaDsKKwlpbnQgdmlydHVhbFgsIHZpcnR1YWxZOworCisJdW5zaWduZWQgaW50IGZyb250X3RpbGVkOworCXVuc2lnbmVkIGludCBiYWNrX3RpbGVkOworCXVuc2lnbmVkIGludCBkZXB0aF90aWxlZDsKKwl1bnNpZ25lZCBpbnQgcm90YXRlZF90aWxlZDsKKwl1bnNpZ25lZCBpbnQgcm90YXRlZDJfdGlsZWQ7CisKKwlpbnQgcGlwZUFfeDsKKwlpbnQgcGlwZUFfeTsKKwlpbnQgcGlwZUFfdzsKKwlpbnQgcGlwZUFfaDsKKwlpbnQgcGlwZUJfeDsKKwlpbnQgcGlwZUJfeTsKKwlpbnQgcGlwZUJfdzsKKwlpbnQgcGlwZUJfaDsKKworCS8qIGZpbGwgb3V0IHNvbWUgc3BhY2UgZm9yIG9sZCB1c2Vyc3BhY2UgdHJpcGxlIGJ1ZmZlciAqLworCWRybV9oYW5kbGVfdCB1bnVzZWRfaGFuZGxlOworCV9fdTMyIHVudXNlZDEsIHVudXNlZDIsIHVudXNlZDM7CisKKwkvKiBidWZmZXIgb2JqZWN0IGhhbmRsZXMgZm9yIHN0YXRpYyBidWZmZXJzLiBNYXkgY2hhbmdlCisJICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNsaWVudC4KKwkgKi8KKwlfX3UzMiBmcm9udF9ib19oYW5kbGU7CisJX191MzIgYmFja19ib19oYW5kbGU7CisJX191MzIgdW51c2VkX2JvX2hhbmRsZTsKKwlfX3UzMiBkZXB0aF9ib19oYW5kbGU7CisKK30gZHJtX2k5MTVfc2FyZWFfdDsKKworLyogZHVlIHRvIHVzZXJzcGFjZSBidWlsZGluZyBhZ2FpbnN0IHRoZXNlIGhlYWRlcnMgd2UgbmVlZCBzb21lIGNvbXBhdCBoZXJlICovCisjZGVmaW5lIHBsYW5lQV94IHBpcGVBX3gKKyNkZWZpbmUgcGxhbmVBX3kgcGlwZUFfeQorI2RlZmluZSBwbGFuZUFfdyBwaXBlQV93CisjZGVmaW5lIHBsYW5lQV9oIHBpcGVBX2gKKyNkZWZpbmUgcGxhbmVCX3ggcGlwZUJfeAorI2RlZmluZSBwbGFuZUJfeSBwaXBlQl95CisjZGVmaW5lIHBsYW5lQl93IHBpcGVCX3cKKyNkZWZpbmUgcGxhbmVCX2ggcGlwZUJfaAorCisvKiBGbGFncyBmb3IgcGVyZl9ib3hlcworICovCisjZGVmaW5lIEk5MTVfQk9YX1JJTkdfRU1QVFkgICAgMHgxCisjZGVmaW5lIEk5MTVfQk9YX0ZMSVAgICAgICAgICAgMHgyCisjZGVmaW5lIEk5MTVfQk9YX1dBSVQgICAgICAgICAgMHg0CisjZGVmaW5lIEk5MTVfQk9YX1RFWFRVUkVfTE9BRCAgMHg4CisjZGVmaW5lIEk5MTVfQk9YX0xPU1RfQ09OVEVYVCAgMHgxMAorCisvKiBJOTE1IHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX0k5MTVfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fSTkxNV9GTFVTSAkJMHgwMQorI2RlZmluZSBEUk1fSTkxNV9GTElQCQkweDAyCisjZGVmaW5lIERSTV9JOTE1X0JBVENIQlVGRkVSCTB4MDMKKyNkZWZpbmUgRFJNX0k5MTVfSVJRX0VNSVQJMHgwNAorI2RlZmluZSBEUk1fSTkxNV9JUlFfV0FJVAkweDA1CisjZGVmaW5lIERSTV9JOTE1X0dFVFBBUkFNCTB4MDYKKyNkZWZpbmUgRFJNX0k5MTVfU0VUUEFSQU0JMHgwNworI2RlZmluZSBEUk1fSTkxNV9BTExPQwkJMHgwOAorI2RlZmluZSBEUk1fSTkxNV9GUkVFCQkweDA5CisjZGVmaW5lIERSTV9JOTE1X0lOSVRfSEVBUAkweDBhCisjZGVmaW5lIERSTV9JOTE1X0NNREJVRkZFUgkweDBiCisjZGVmaW5lIERSTV9JOTE1X0RFU1RST1lfSEVBUAkweDBjCisjZGVmaW5lIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRQkweDBkCisjZGVmaW5lIERSTV9JOTE1X0dFVF9WQkxBTktfUElQRQkweDBlCisjZGVmaW5lIERSTV9JOTE1X1ZCTEFOS19TV0FQCTB4MGYKKyNkZWZpbmUgRFJNX0k5MTVfSFdTX0FERFIJMHgxMQorI2RlZmluZSBEUk1fSTkxNV9HRU1fSU5JVAkweDEzCisjZGVmaW5lIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSCTB4MTQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1BJTgkweDE1CisjZGVmaW5lIERSTV9JOTE1X0dFTV9VTlBJTgkweDE2CisjZGVmaW5lIERSTV9JOTE1X0dFTV9CVVNZCTB4MTcKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1RIUk9UVExFCTB4MTgKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0VOVEVSVlQJMHgxOQorI2RlZmluZSBEUk1fSTkxNV9HRU1fTEVBVkVWVAkweDFhCisjZGVmaW5lIERSTV9JOTE1X0dFTV9DUkVBVEUJMHgxYgorI2RlZmluZSBEUk1fSTkxNV9HRU1fUFJFQUQJMHgxYworI2RlZmluZSBEUk1fSTkxNV9HRU1fUFdSSVRFCTB4MWQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX01NQVAJMHgxZQorI2RlZmluZSBEUk1fSTkxNV9HRU1fU0VUX0RPTUFJTgkweDFmCisjZGVmaW5lIERSTV9JOTE1X0dFTV9TV19GSU5JU0gJMHgyMAorI2RlZmluZSBEUk1fSTkxNV9HRU1fU0VUX1RJTElORwkweDIxCisjZGVmaW5lIERSTV9JOTE1X0dFTV9HRVRfVElMSU5HCTB4MjIKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSAweDIzCisjZGVmaW5lIERSTV9JOTE1X0dFTV9NTUFQX0dUVAkweDI0CisjZGVmaW5lIERSTV9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRAkweDI1CisjZGVmaW5lIERSTV9JOTE1X0dFTV9NQURWSVNFCTB4MjYKKyNkZWZpbmUgRFJNX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UJMHgyNworI2RlZmluZSBEUk1fSTkxNV9PVkVSTEFZX0FUVFJTCTB4MjgKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIyCTB4MjkKKyNkZWZpbmUgRFJNX0k5MTVfR0VUX1NQUklURV9DT0xPUktFWQkweDJhCisjZGVmaW5lIERSTV9JOTE1X1NFVF9TUFJJVEVfQ09MT1JLRVkJMHgyYgorI2RlZmluZSBEUk1fSTkxNV9HRU1fV0FJVAkweDJjCisjZGVmaW5lIERSTV9JOTE1X0dFTV9DT05URVhUX0NSRUFURQkweDJkCisjZGVmaW5lIERSTV9JOTE1X0dFTV9DT05URVhUX0RFU1RST1kJMHgyZQorI2RlZmluZSBEUk1fSTkxNV9HRU1fU0VUX0NBQ0hJTkcJMHgyZgorI2RlZmluZSBEUk1fSTkxNV9HRU1fR0VUX0NBQ0hJTkcJMHgzMAorI2RlZmluZSBEUk1fSTkxNV9SRUdfUkVBRAkJMHgzMQorI2RlZmluZSBEUk1fSTkxNV9HRVRfUkVTRVRfU1RBVFMJMHgzMgorI2RlZmluZSBEUk1fSTkxNV9HRU1fVVNFUlBUUgkJMHgzMworI2RlZmluZSBEUk1fSTkxNV9HRU1fQ09OVEVYVF9HRVRQQVJBTQkweDM0CisjZGVmaW5lIERSTV9JOTE1X0dFTV9DT05URVhUX1NFVFBBUkFNCTB4MzUKKworI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVCwgZHJtX2k5MTVfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTElQCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxJUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQkFUQ0hCVUZGRVIJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0JBVENIQlVGRkVSLCBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JUlFfRU1JVCAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JUlFfRU1JVCwgZHJtX2k5MTVfaXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSVJRX1dBSVQgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSVJRX1dBSVQsIGRybV9pOTE1X2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFVFBBUkFNLCBkcm1faTkxNV9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRQQVJBTSAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9TRVRQQVJBTSwgZHJtX2k5MTVfc2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQUxMT0MgICAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfQUxMT0MsIGRybV9pOTE1X21lbV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GUkVFICAgICAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GUkVFLCBkcm1faTkxNV9tZW1fZnJlZV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUX0hFQVAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklUX0hFQVAsIGRybV9pOTE1X21lbV9pbml0X2hlYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQ01EQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9DTURCVUZGRVIsIGRybV9pOTE1X2NtZGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9ERVNUUk9ZX0hFQVAJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0RFU1RST1lfSEVBUCwgZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRfVkJMQU5LX1BJUEUJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRSwgZHJtX2k5MTVfdmJsYW5rX3BpcGVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VUX1ZCTEFOS19QSVBFCURSTV9JT1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfVkJMQU5LX1BJUEUsIGRybV9pOTE1X3ZibGFua19waXBlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1ZCTEFOS19TV0FQCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9WQkxBTktfU1dBUCwgZHJtX2k5MTVfdmJsYW5rX3N3YXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSFdTX0FERFIJCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0hXU19BRERSLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2luaXQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9JTklUCQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fSU5JVCwgc3RydWN0IGRybV9pOTE1X2dlbV9pbml0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fRVhFQ0JVRkZFUiwgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIyLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fUElOCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1BJTiwgc3RydWN0IGRybV9pOTE1X2dlbV9waW4pCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9VTlBJTglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fVU5QSU4sIHN0cnVjdCBkcm1faTkxNV9nZW1fdW5waW4pCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9CVVNZCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0JVU1ksIHN0cnVjdCBkcm1faTkxNV9nZW1fYnVzeSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9DQUNISU5HCQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fU0VUX0NBQ0hJTkcsIHN0cnVjdCBkcm1faTkxNV9nZW1fY2FjaGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9DQUNISU5HCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0dFVF9DQUNISU5HLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NhY2hpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9USFJPVFRMRQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1RIUk9UVExFKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRU5URVJWVAlEUk1fSU8oRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9FTlRFUlZUKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fTEVBVkVWVAlEUk1fSU8oRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9MRUFWRVZUKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQ1JFQVRFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fQ1JFQVRFLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NyZWF0ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1BSRUFECURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fUFJFQUQsIHN0cnVjdCBkcm1faTkxNV9nZW1fcHJlYWQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9QV1JJVEUJRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9QV1JJVEUsIHN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9NTUFQLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXApCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQX0dUVAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX01NQVBfR1RULCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX0RPTUFJTglEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NFVF9ET01BSU4sIHN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbikKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1NXX0ZJTklTSAlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NXX0ZJTklTSCwgc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2gpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfVElMSU5HCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NFVF9USUxJTkcsIHN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X3RpbGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fR0VUX1RJTElORywgc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX0FQRVJUVVJFCURSTV9JT1IgIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSwgc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfYXBlcnR1cmUpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lELCBzdHJ1Y3QgZHJtX2k5MTVfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fTUFEVklTRQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX01BRFZJU0UsIHN0cnVjdCBkcm1faTkxNV9nZW1fbWFkdmlzZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UsIHN0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9wdXRfaW1hZ2UpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X09WRVJMQVlfQVRUUlMJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X09WRVJMQVlfQVRUUlMsIHN0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9hdHRycykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfU0VUX1NQUklURV9DT0xPUktFWSBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfU0VUX1NQUklURV9DT0xPUktFWSwgc3RydWN0IGRybV9pbnRlbF9zcHJpdGVfY29sb3JrZXkpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9TUFJJVEVfQ09MT1JLRVkgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X1NFVF9TUFJJVEVfQ09MT1JLRVksIHN0cnVjdCBkcm1faW50ZWxfc3ByaXRlX2NvbG9ya2V5KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fV0FJVAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9XQUlULCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3dhaXQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0NSRUFURQlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9DT05URVhUX0NSRUFURSwgc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2NyZWF0ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfREVTVFJPWQlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0NPTlRFWFRfREVTVFJPWSwgc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2Rlc3Ryb3kpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1JFR19SRUFECQkJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9SRUdfUkVBRCwgc3RydWN0IGRybV9pOTE1X3JlZ19yZWFkKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRfUkVTRVRfU1RBVFMJCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1JFU0VUX1NUQVRTLCBzdHJ1Y3QgZHJtX2k5MTVfcmVzZXRfc3RhdHMpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSCQkJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fVVNFUlBUUiwgc3RydWN0IGRybV9pOTE1X2dlbV91c2VycHRyKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9HRVRQQVJBTQlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9DT05URVhUX0dFVFBBUkFNLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0pCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX1NFVFBBUkFNCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0NPTlRFWFRfU0VUUEFSQU0sIHN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9wYXJhbSkKKworLyogQWxsb3cgZHJpdmVycyB0byBzdWJtaXQgYmF0Y2hidWZmZXJzIGRpcmVjdGx5IHRvIGhhcmR3YXJlLCByZWx5aW5nCisgKiBvbiB0aGUgc2VjdXJpdHkgbWVjaGFuaXNtcyBwcm92aWRlZCBieSBoYXJkd2FyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfYmF0Y2hidWZmZXIgeworCWludCBzdGFydDsJCS8qIGFncCBvZmZzZXQgKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90OworCisvKiBBcyBhYm92ZSwgYnV0IHBhc3MgYSBwb2ludGVyIHRvIHVzZXJzcGFjZSBidWZmZXIgd2hpY2ggY2FuIGJlCisgKiB2YWxpZGF0ZWQgYnkgdGhlIGtlcm5lbCBwcmlvciB0byBzZW5kaW5nIHRvIGhhcmR3YXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfY21kYnVmZmVyIHsKKwljaGFyICpidWY7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNvbW1hbmQgYnVmZmVyICovCisJaW50IHN6OwkJCS8qIG5yIGJ5dGVzIGluIGJ1ZiAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9jbWRidWZmZXJfdDsKKworLyogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX2VtaXQgeworCWludCAqaXJxX3NlcTsKK30gZHJtX2k5MTVfaXJxX2VtaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX3dhaXQgeworCWludCBpcnFfc2VxOworfSBkcm1faTkxNV9pcnFfd2FpdF90OworCisvKiBJb2N0bCB0byBxdWVyeSBrZXJuZWwgcGFyYW1zOgorICovCisjZGVmaW5lIEk5MTVfUEFSQU1fSVJRX0FDVElWRSAgICAgICAgICAgIDEKKyNkZWZpbmUgSTkxNV9QQVJBTV9BTExPV19CQVRDSEJVRkZFUiAgICAgMgorI2RlZmluZSBJOTE1X1BBUkFNX0xBU1RfRElTUEFUQ0ggICAgICAgICAzCisjZGVmaW5lIEk5MTVfUEFSQU1fQ0hJUFNFVF9JRCAgICAgICAgICAgIDQKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfR0VNICAgICAgICAgICAgICAgNQorI2RlZmluZSBJOTE1X1BBUkFNX05VTV9GRU5DRVNfQVZBSUwgICAgICA2CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX09WRVJMQVkgICAgICAgICAgIDcKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUEFHRUZMSVBQSU5HCSA4CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0VYRUNCVUYyICAgICAgICAgIDkKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQlNECQkgMTAKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQkxUCQkgMTEKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUkVMQVhFRF9GRU5DSU5HCSAxMgorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19DT0hFUkVOVF9SSU5HUwkgMTMKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19DT05TVEFOVFMJIDE0CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1JFTEFYRURfREVMVEEJIDE1CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0dFTjdfU09MX1JFU0VUCSAxNgorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19MTEMgICAgIAkgCSAxNworI2RlZmluZSBJOTE1X1BBUkFNX0hBU19BTElBU0lOR19QUEdUVAkgMTgKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfV0FJVF9USU1FT1VUCSAxOQorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19TRU1BUEhPUkVTCSAyMAorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19QUklNRV9WTUFQX0ZMVVNICSAyMQorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19WRUJPWAkJIDIyCisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1NFQ1VSRV9CQVRDSEVTCSAyMworI2RlZmluZSBJOTE1X1BBUkFNX0hBU19QSU5ORURfQkFUQ0hFUwkgMjQKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19OT19SRUxPQwkgMjUKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19IQU5ETEVfTFVUICAgMjYKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfV1QgICAgIAkgCSAyNworI2RlZmluZSBJOTE1X1BBUkFNX0NNRF9QQVJTRVJfVkVSU0lPTgkgMjgKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQ09IRVJFTlRfUEhZU19HVFQgMjkKKyNkZWZpbmUgSTkxNV9QQVJBTV9NTUFQX1ZFUlNJT04gICAgICAgICAgMzAKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQlNEMgkJIDMxCisjZGVmaW5lIEk5MTVfUEFSQU1fUkVWSVNJT04gICAgICAgICAgICAgIDMyCisjZGVmaW5lIEk5MTVfUEFSQU1fU1VCU0xJQ0VfVE9UQUwJIDMzCisjZGVmaW5lIEk5MTVfUEFSQU1fRVVfVE9UQUwJCSAzNAorCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9nZXRwYXJhbSB7CisJaW50IHBhcmFtOworCWludCAqdmFsdWU7Cit9IGRybV9pOTE1X2dldHBhcmFtX3Q7CisKKy8qIElvY3RsIHRvIHNldCBrZXJuZWwgcGFyYW1zOgorICovCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fVVNFX01JX0JBVENIQlVGRkVSX1NUQVJUICAgICAgICAgICAgMQorI2RlZmluZSBJOTE1X1NFVFBBUkFNX1RFWF9MUlVfTE9HX0dSQU5VTEFSSVRZICAgICAgICAgICAgIDIKKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9BTExPV19CQVRDSEJVRkZFUiAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fTlVNX1VTRURfRkVOQ0VTICAgICAgICAgICAgICAgICAgICAgNAorCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9zZXRwYXJhbSB7CisJaW50IHBhcmFtOworCWludCB2YWx1ZTsKK30gZHJtX2k5MTVfc2V0cGFyYW1fdDsKKworLyogQSBtZW1vcnkgbWFuYWdlciBmb3IgcmVnaW9ucyBvZiBzaGFyZWQgbWVtb3J5OgorICovCisjZGVmaW5lIEk5MTVfTUVNX1JFR0lPTl9BR1AgMQorCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1fYWxsb2MgeworCWludCByZWdpb247CisJaW50IGFsaWdubWVudDsKKwlpbnQgc2l6ZTsKKwlpbnQgKnJlZ2lvbl9vZmZzZXQ7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZiIG9yIGFncCAqLworfSBkcm1faTkxNV9tZW1fYWxsb2NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2ZyZWUgeworCWludCByZWdpb247CisJaW50IHJlZ2lvbl9vZmZzZXQ7Cit9IGRybV9pOTE1X21lbV9mcmVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X21lbV9pbml0X2hlYXAgeworCWludCByZWdpb247CisJaW50IHNpemU7CisJaW50IHN0YXJ0OworfSBkcm1faTkxNV9tZW1faW5pdF9oZWFwX3Q7CisKKy8qIEFsbG93IG1lbW9yeSBtYW5hZ2VyIHRvIGJlIHRvcm4gZG93biBhbmQgcmUtaW5pdGlhbGl6ZWQgKGVnIG9uCisgKiByb3RhdGUpOgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1fZGVzdHJveV9oZWFwIHsKKwlpbnQgcmVnaW9uOworfSBkcm1faTkxNV9tZW1fZGVzdHJveV9oZWFwX3Q7CisKKy8qIEFsbG93IFggc2VydmVyIHRvIGNvbmZpZ3VyZSB3aGljaCBwaXBlcyB0byBtb25pdG9yIGZvciB2Ymxhbmsgc2lnbmFscworICovCisjZGVmaW5lCURSTV9JOTE1X1ZCTEFOS19QSVBFX0EJMQorI2RlZmluZQlEUk1fSTkxNV9WQkxBTktfUElQRV9CCTIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfdmJsYW5rX3BpcGUgeworCWludCBwaXBlOworfSBkcm1faTkxNV92YmxhbmtfcGlwZV90OworCisvKiBTY2hlZHVsZSBidWZmZXIgc3dhcCBhdCBnaXZlbiB2ZXJ0aWNhbCBibGFuazoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfdmJsYW5rX3N3YXAgeworCWRybV9kcmF3YWJsZV90IGRyYXdhYmxlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSBzZXF0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKK30gZHJtX2k5MTVfdmJsYW5rX3N3YXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaHdzX2FkZHIgeworCV9fdTY0IGFkZHI7Cit9IGRybV9pOTE1X2h3c19hZGRyX3Q7CisKK3N0cnVjdCBkcm1faTkxNV9nZW1faW5pdCB7CisJLyoqCisJICogQmVnaW5uaW5nIG9mZnNldCBpbiB0aGUgR1RUIHRvIGJlIG1hbmFnZWQgYnkgdGhlIERSTSBtZW1vcnkKKwkgKiBtYW5hZ2VyLgorCSAqLworCV9fdTY0IGd0dF9zdGFydDsKKwkvKioKKwkgKiBFbmRpbmcgb2Zmc2V0IGluIHRoZSBHVFQgdG8gYmUgbWFuYWdlZCBieSB0aGUgRFJNIG1lbW9yeQorCSAqIG1hbmFnZXIuCisJICovCisJX191NjQgZ3R0X2VuZDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fY3JlYXRlIHsKKwkvKioKKwkgKiBSZXF1ZXN0ZWQgc2l6ZSBmb3IgdGhlIG9iamVjdC4KKwkgKgorCSAqIFRoZSAocGFnZS1hbGlnbmVkKSBhbGxvY2F0ZWQgc2l6ZSBmb3IgdGhlIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLgorCSAqLworCV9fdTY0IHNpemU7CisJLyoqCisJICogUmV0dXJuZWQgaGFuZGxlIGZvciB0aGUgb2JqZWN0LgorCSAqCisJICogT2JqZWN0IGhhbmRsZXMgYXJlIG5vbnplcm8uCisJICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fcHJlYWQgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgcmVhZC4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCS8qKiBPZmZzZXQgaW50byB0aGUgb2JqZWN0IHRvIHJlYWQgZnJvbSAqLworCV9fdTY0IG9mZnNldDsKKwkvKiogTGVuZ3RoIG9mIGRhdGEgdG8gcmVhZCAqLworCV9fdTY0IHNpemU7CisJLyoqCisJICogUG9pbnRlciB0byB3cml0ZSB0aGUgZGF0YSBpbnRvLgorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlfX3U2NCBkYXRhX3B0cjsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIHdyaXR0ZW4gdG8uICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwkvKiogT2Zmc2V0IGludG8gdGhlIG9iamVjdCB0byB3cml0ZSB0byAqLworCV9fdTY0IG9mZnNldDsKKwkvKiogTGVuZ3RoIG9mIGRhdGEgdG8gd3JpdGUgKi8KKwlfX3U2NCBzaXplOworCS8qKgorCSAqIFBvaW50ZXIgdG8gcmVhZCB0aGUgZGF0YSBmcm9tLgorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlfX3U2NCBkYXRhX3B0cjsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtYXBwZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwkvKiogT2Zmc2V0IGluIHRoZSBvYmplY3QgdG8gbWFwLiAqLworCV9fdTY0IG9mZnNldDsKKwkvKioKKwkgKiBMZW5ndGggb2YgZGF0YSB0byBtYXAuCisJICoKKwkgKiBUaGUgdmFsdWUgd2lsbCBiZSBwYWdlLWFsaWduZWQuCisJICovCisJX191NjQgc2l6ZTsKKwkvKioKKwkgKiBSZXR1cm5lZCBwb2ludGVyIHRoZSBkYXRhIHdhcyBtYXBwZWQgYXQuCisJICoKKwkgKiBUaGlzIGlzIGEgZml4ZWQtc2l6ZSB0eXBlIGZvciAzMi82NCBjb21wYXRpYmlsaXR5LgorCSAqLworCV9fdTY0IGFkZHJfcHRyOworCisJLyoqCisJICogRmxhZ3MgZm9yIGV4dGVuZGVkIGJlaGF2aW91ci4KKwkgKgorCSAqIEFkZGVkIGluIHZlcnNpb24gMi4KKwkgKi8KKwlfX3U2NCBmbGFnczsKKyNkZWZpbmUgSTkxNV9NTUFQX1dDIDB4MQorfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwX2d0dCB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtYXBwZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwkvKioKKwkgKiBGYWtlIG9mZnNldCB0byB1c2UgZm9yIHN1YnNlcXVlbnQgbW1hcCBjYWxsCisJICoKKwkgKiBUaGlzIGlzIGEgZml4ZWQtc2l6ZSB0eXBlIGZvciAzMi82NCBjb21wYXRpYmlsaXR5LgorCSAqLworCV9fdTY0IG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbiB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBOZXcgcmVhZCBkb21haW5zICovCisJX191MzIgcmVhZF9kb21haW5zOworCisJLyoqIE5ldyB3cml0ZSBkb21haW4gKi8KKwlfX3UzMiB3cml0ZV9kb21haW47Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3N3X2ZpbmlzaCB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCAqLworCV9fdTMyIGhhbmRsZTsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSB7CisJLyoqCisJICogSGFuZGxlIG9mIHRoZSBidWZmZXIgYmVpbmcgcG9pbnRlZCB0byBieSB0aGlzIHJlbG9jYXRpb24gZW50cnkuCisJICoKKwkgKiBJdCdzIGFwcGVhbGluZyB0byBtYWtlIHRoaXMgYmUgYW4gaW5kZXggaW50byB0aGUgbW1fdmFsaWRhdGVfZW50cnkKKwkgKiBsaXN0IHRvIHJlZmVyIHRvIHRoZSBidWZmZXIsIGJ1dCB0aGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIGNyZWF0ZQorCSAqIGEgcmVsb2NhdGlvbiBsaXN0IGZvciBzdGF0ZSBidWZmZXJzIGFuZCBub3QgcmUtd3JpdGUgaXQgcGVyCisJICogZXhlYyB1c2luZyB0aGUgYnVmZmVyLgorCSAqLworCV9fdTMyIHRhcmdldF9oYW5kbGU7CisKKwkvKioKKwkgKiBWYWx1ZSB0byBiZSBhZGRlZCB0byB0aGUgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgYnVmZmVyIHRvIG1ha2UgdXAKKwkgKiB0aGUgcmVsb2NhdGlvbiBlbnRyeS4KKwkgKi8KKwlfX3UzMiBkZWx0YTsKKworCS8qKiBPZmZzZXQgaW4gdGhlIGJ1ZmZlciB0aGUgcmVsb2NhdGlvbiBlbnRyeSB3aWxsIGJlIHdyaXR0ZW4gaW50byAqLworCV9fdTY0IG9mZnNldDsKKworCS8qKgorCSAqIE9mZnNldCB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGJ1ZmZlciB0aGF0IHRoZSByZWxvY2F0aW9uIGVudHJ5IHdhcyBsYXN0CisJICogd3JpdHRlbiBhcy4KKwkgKgorCSAqIElmIHRoZSBidWZmZXIgaGFzIHRoZSBzYW1lIG9mZnNldCBhcyBsYXN0IHRpbWUsIHdlIGNhbiBza2lwIHN5bmNpbmcKKwkgKiBhbmQgd3JpdGluZyB0aGUgcmVsb2NhdGlvbi4gIFRoaXMgdmFsdWUgaXMgd3JpdHRlbiBiYWNrIG91dCBieQorCSAqIHRoZSBleGVjYnVmZmVyIGlvY3RsIHdoZW4gdGhlIHJlbG9jYXRpb24gaXMgd3JpdHRlbi4KKwkgKi8KKwlfX3U2NCBwcmVzdW1lZF9vZmZzZXQ7CisKKwkvKioKKwkgKiBUYXJnZXQgbWVtb3J5IGRvbWFpbnMgcmVhZCBieSB0aGlzIG9wZXJhdGlvbi4KKwkgKi8KKwlfX3UzMiByZWFkX2RvbWFpbnM7CisKKwkvKioKKwkgKiBUYXJnZXQgbWVtb3J5IGRvbWFpbnMgd3JpdHRlbiBieSB0aGlzIG9wZXJhdGlvbi4KKwkgKgorCSAqIE5vdGUgdGhhdCBvbmx5IG9uZSBkb21haW4gbWF5IGJlIHdyaXR0ZW4gYnkgdGhlIHdob2xlCisJICogZXhlY2J1ZmZlciBvcGVyYXRpb24sIHNvIHRoYXQgd2hlcmUgdGhlcmUgYXJlIGNvbmZsaWN0cywKKwkgKiB0aGUgYXBwbGljYXRpb24gd2lsbCBnZXQgLUVJTlZBTCBiYWNrLgorCSAqLworCV9fdTMyIHdyaXRlX2RvbWFpbjsKK307CisKKy8qKiBAeworICogSW50ZWwgbWVtb3J5IGRvbWFpbnMKKyAqCisgKiBNb3N0IG9mIHRoZXNlIGp1c3QgYWxpZ24gd2l0aCB0aGUgdmFyaW91cyBjYWNoZXMgaW4KKyAqIHRoZSBzeXN0ZW0gYW5kIGFyZSB1c2VkIHRvIGZsdXNoIGFuZCBpbnZhbGlkYXRlIGFzCisgKiBvYmplY3RzIGVuZCB1cCBjYWNoZWQgaW4gZGlmZmVyZW50IGRvbWFpbnMuCisgKi8KKy8qKiBDUFUgY2FjaGUgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX0NQVQkJMHgwMDAwMDAwMQorLyoqIFJlbmRlciBjYWNoZSwgdXNlZCBieSAyRCBhbmQgM0QgZHJhd2luZyAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fUkVOREVSCQkweDAwMDAwMDAyCisvKiogU2FtcGxlciBjYWNoZSwgdXNlZCBieSB0ZXh0dXJlIGVuZ2luZSAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fU0FNUExFUgkJMHgwMDAwMDAwNAorLyoqIENvbW1hbmQgcXVldWUsIHVzZWQgdG8gbG9hZCBiYXRjaCBidWZmZXJzICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9DT01NQU5ECQkweDAwMDAwMDA4CisvKiogSW5zdHJ1Y3Rpb24gY2FjaGUsIHVzZWQgYnkgc2hhZGVyIHByb2dyYW1zICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTgkweDAwMDAwMDEwCisvKiogVmVydGV4IGFkZHJlc3MgY2FjaGUgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX1ZFUlRFWAkJMHgwMDAwMDAyMAorLyoqIEdUVCBkb21haW4gLSBhcGVydHVyZSBhbmQgc2Nhbm91dCAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fR1RUCQkweDAwMDAwMDQwCisvKiogQH0gKi8KKworc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdCB7CisJLyoqCisJICogVXNlcidzIGhhbmRsZSBmb3IgYSBidWZmZXIgdG8gYmUgYm91bmQgaW50byB0aGUgR1RUIGZvciB0aGlzCisJICogb3BlcmF0aW9uLgorCSAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBOdW1iZXIgb2YgcmVsb2NhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgYnVmZmVyICovCisJX191MzIgcmVsb2NhdGlvbl9jb3VudDsKKwkvKioKKwkgKiBQb2ludGVyIHRvIGFycmF5IG9mIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSBjb250YWluaW5nCisJICogdGhlIHJlbG9jYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBpbiB0aGlzIGJ1ZmZlci4KKwkgKi8KKwlfX3U2NCByZWxvY3NfcHRyOworCisJLyoqIFJlcXVpcmVkIGFsaWdubWVudCBpbiBncmFwaGljcyBhcGVydHVyZSAqLworCV9fdTY0IGFsaWdubWVudDsKKworCS8qKgorCSAqIFJldHVybmVkIHZhbHVlIG9mIHRoZSB1cGRhdGVkIG9mZnNldCBvZiB0aGUgb2JqZWN0LCBmb3IgZnV0dXJlCisJICogcHJlc3VtZWRfb2Zmc2V0IHdyaXRlcy4KKwkgKi8KKwlfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIgeworCS8qKgorCSAqIExpc3Qgb2YgYnVmZmVycyB0byBiZSB2YWxpZGF0ZWQgd2l0aCB0aGVpciByZWxvY2F0aW9ucyB0byBiZQorCSAqIHBlcmZvcm1lbmQgb24gdGhlbS4KKwkgKgorCSAqIFRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN0cnVjdCBkcm1faTkxNV9nZW1fdmFsaWRhdGVfZW50cnkuCisJICoKKwkgKiBUaGVzZSBidWZmZXJzIG11c3QgYmUgbGlzdGVkIGluIGFuIG9yZGVyIHN1Y2ggdGhhdCBhbGwgcmVsb2NhdGlvbnMKKwkgKiBhIGJ1ZmZlciBpcyBwZXJmb3JtaW5nIHJlZmVyIHRvIGJ1ZmZlcnMgdGhhdCBoYXZlIGFscmVhZHkgYXBwZWFyZWQKKwkgKiBpbiB0aGUgdmFsaWRhdGUgbGlzdC4KKwkgKi8KKwlfX3U2NCBidWZmZXJzX3B0cjsKKwlfX3UzMiBidWZmZXJfY291bnQ7CisKKwkvKiogT2Zmc2V0IGluIHRoZSBiYXRjaGJ1ZmZlciB0byBzdGFydCBleGVjdXRpb24gZnJvbS4gKi8KKwlfX3UzMiBiYXRjaF9zdGFydF9vZmZzZXQ7CisJLyoqIEJ5dGVzIHVzZWQgaW4gYmF0Y2hidWZmZXIgZnJvbSBiYXRjaF9zdGFydF9vZmZzZXQgKi8KKwlfX3UzMiBiYXRjaF9sZW47CisJX191MzIgRFIxOworCV9fdTMyIERSNDsKKwlfX3UzMiBudW1fY2xpcHJlY3RzOworCS8qKiBUaGlzIGlzIGEgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cyAqLworCV9fdTY0IGNsaXByZWN0c19wdHI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiB7CisJLyoqCisJICogVXNlcidzIGhhbmRsZSBmb3IgYSBidWZmZXIgdG8gYmUgYm91bmQgaW50byB0aGUgR1RUIGZvciB0aGlzCisJICogb3BlcmF0aW9uLgorCSAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBOdW1iZXIgb2YgcmVsb2NhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgYnVmZmVyICovCisJX191MzIgcmVsb2NhdGlvbl9jb3VudDsKKwkvKioKKwkgKiBQb2ludGVyIHRvIGFycmF5IG9mIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSBjb250YWluaW5nCisJICogdGhlIHJlbG9jYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBpbiB0aGlzIGJ1ZmZlci4KKwkgKi8KKwlfX3U2NCByZWxvY3NfcHRyOworCisJLyoqIFJlcXVpcmVkIGFsaWdubWVudCBpbiBncmFwaGljcyBhcGVydHVyZSAqLworCV9fdTY0IGFsaWdubWVudDsKKworCS8qKgorCSAqIFJldHVybmVkIHZhbHVlIG9mIHRoZSB1cGRhdGVkIG9mZnNldCBvZiB0aGUgb2JqZWN0LCBmb3IgZnV0dXJlCisJICogcHJlc3VtZWRfb2Zmc2V0IHdyaXRlcy4KKwkgKi8KKwlfX3U2NCBvZmZzZXQ7CisKKyNkZWZpbmUgRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0UgKDE8PDApCisjZGVmaW5lIEVYRUNfT0JKRUNUX05FRURTX0dUVAkoMTw8MSkKKyNkZWZpbmUgRVhFQ19PQkpFQ1RfV1JJVEUJKDE8PDIpCisjZGVmaW5lIF9fRVhFQ19PQkpFQ1RfVU5LTk9XTl9GTEFHUyAtKEVYRUNfT0JKRUNUX1dSSVRFPDwxKQorCV9fdTY0IGZsYWdzOworCisJX191NjQgcnN2ZDE7CisJX191NjQgcnN2ZDI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIHsKKwkvKioKKwkgKiBMaXN0IG9mIGdlbV9leGVjX29iamVjdDIgc3RydWN0cworCSAqLworCV9fdTY0IGJ1ZmZlcnNfcHRyOworCV9fdTMyIGJ1ZmZlcl9jb3VudDsKKworCS8qKiBPZmZzZXQgaW4gdGhlIGJhdGNoYnVmZmVyIHRvIHN0YXJ0IGV4ZWN1dGlvbiBmcm9tLiAqLworCV9fdTMyIGJhdGNoX3N0YXJ0X29mZnNldDsKKwkvKiogQnl0ZXMgdXNlZCBpbiBiYXRjaGJ1ZmZlciBmcm9tIGJhdGNoX3N0YXJ0X29mZnNldCAqLworCV9fdTMyIGJhdGNoX2xlbjsKKwlfX3UzMiBEUjE7CisJX191MzIgRFI0OworCV9fdTMyIG51bV9jbGlwcmVjdHM7CisJLyoqIFRoaXMgaXMgYSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzICovCisJX191NjQgY2xpcHJlY3RzX3B0cjsKKyNkZWZpbmUgSTkxNV9FWEVDX1JJTkdfTUFTSyAgICAgICAgICAgICAgKDc8PDApCisjZGVmaW5lIEk5MTVfRVhFQ19ERUZBVUxUICAgICAgICAgICAgICAgICgwPDwwKQorI2RlZmluZSBJOTE1X0VYRUNfUkVOREVSICAgICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSTkxNV9FWEVDX0JTRCAgICAgICAgICAgICAgICAgICAgKDI8PDApCisjZGVmaW5lIEk5MTVfRVhFQ19CTFQgICAgICAgICAgICAgICAgICAgICgzPDwwKQorI2RlZmluZSBJOTE1X0VYRUNfVkVCT1ggICAgICAgICAgICAgICAgICAoNDw8MCkKKworLyogVXNlZCBmb3Igc3dpdGNoaW5nIHRoZSBjb25zdGFudHMgYWRkcmVzc2luZyBtb2RlIG9uIGdlbjQrIFJFTkRFUiByaW5nLgorICogR2VuNisgb25seSBzdXBwb3J0cyByZWxhdGl2ZSBhZGRyZXNzaW5nIHRvIGR5bmFtaWMgc3RhdGUgKGRlZmF1bHQpIGFuZAorICogYWJzb2x1dGUgYWRkcmVzc2luZy4KKyAqCisgKiBUaGVzZSBmbGFncyBhcmUgaWdub3JlZCBmb3IgdGhlIEJTRCBhbmQgQkxUIHJpbmdzLgorICovCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfTUFTSyAJKDM8PDYpCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX0dFTkVSQUwgKDA8PDYpIC8qIGRlZmF1bHQgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX0NPTlNUQU5UU19BQlNPTFVURSAJKDE8PDYpCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX1NVUkZBQ0UgKDI8PDYpIC8qIGdlbjQvNSBvbmx5ICovCisJX191NjQgZmxhZ3M7CisJX191NjQgcnN2ZDE7IC8qIG5vdyB1c2VkIGZvciBjb250ZXh0IGluZm8gKi8KKwlfX3U2NCByc3ZkMjsKK307CisKKy8qKiBSZXNldHMgdGhlIFNPIHdyaXRlIG9mZnNldCByZWdpc3RlcnMgZm9yIHRyYW5zZm9ybSBmZWVkYmFjayBvbiBnZW43LiAqLworI2RlZmluZSBJOTE1X0VYRUNfR0VON19TT0xfUkVTRVQJKDE8PDgpCisKKy8qKiBSZXF1ZXN0IGEgcHJpdmlsZWdlZCAoInNlY3VyZSIpIGJhdGNoIGJ1ZmZlci4gTm90ZSBvbmx5IGF2YWlsYWJsZSBmb3IKKyAqIERSTV9ST09UX09OTFkgfCBEUk1fTUFTVEVSIHByb2Nlc3Nlcy4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfU0VDVVJFCQkoMTw8OSkKKworLyoqIEluZm9ybSB0aGUga2VybmVsIHRoYXQgdGhlIGJhdGNoIGlzIGFuZCB3aWxsIGFsd2F5cyBiZSBwaW5uZWQuIFRoaXMKKyAqIG5lZ2F0ZXMgdGhlIHJlcXVpcmVtZW50IGZvciBhIHdvcmthcm91bmQgdG8gYmUgcGVyZm9ybWVkIHRvIGF2b2lkCisgKiBhbiBpbmNvaGVyZW50IENTIChzdWNoIGFzIGNhbiBiZSBmb3VuZCBvbiA4MzAvODQ1KS4gSWYgdGhpcyBmbGFnIGlzCisgKiBub3QgcGFzc2VkLCB0aGUga2VybmVsIHdpbGwgZW5kZWF2b3VyIHRvIG1ha2Ugc3VyZSB0aGUgYmF0Y2ggaXMKKyAqIGNvaGVyZW50IHdpdGggdGhlIENTIGJlZm9yZSBleGVjdXRpb24uIElmIHRoaXMgZmxhZyBpcyBwYXNzZWQsCisgKiB1c2Vyc3BhY2UgYXNzdW1lcyB0aGUgcmVzcG9uc2liaWxpdHkgZm9yIGVuc3VyaW5nIHRoZSBzYW1lLgorICovCisjZGVmaW5lIEk5MTVfRVhFQ19JU19QSU5ORUQJCSgxPDwxMCkKKworLyoqIFByb3ZpZGUgYSBoaW50IHRvIHRoZSBrZXJuZWwgdGhhdCB0aGUgY29tbWFuZCBzdHJlYW0gYW5kIGF1eGlsaWFyeQorICogc3RhdGUgYnVmZmVycyBhbHJlYWR5IGhvbGRzIHRoZSBjb3JyZWN0IHByZXN1bWVkIGFkZHJlc3NlcyBhbmQgc28gdGhlCisgKiByZWxvY2F0aW9uIHByb2Nlc3MgbWF5IGJlIHNraXBwZWQgaWYgbm8gYnVmZmVycyBuZWVkIHRvIGJlIG1vdmVkIGluCisgKiBwcmVwYXJhdGlvbiBmb3IgdGhlIGV4ZWNidWZmZXIuCisgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX05PX1JFTE9DCQkoMTw8MTEpCisKKy8qKiBVc2UgdGhlIHJlbG9jLmhhbmRsZSBhcyBhbiBpbmRleCBpbnRvIHRoZSBleGVjIG9iamVjdCBhcnJheSByYXRoZXIKKyAqIHRoYW4gYXMgdGhlIHBlci1maWxlIGhhbmRsZS4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfSEFORExFX0xVVAkJKDE8PDEyKQorCisvKiogVXNlZCBmb3Igc3dpdGNoaW5nIEJTRCByaW5ncyBvbiB0aGUgcGxhdGZvcm1zIHdpdGggdHdvIEJTRCByaW5ncyAqLworI2RlZmluZSBJOTE1X0VYRUNfQlNEX01BU0sJCSgzPDwxMykKKyNkZWZpbmUgSTkxNV9FWEVDX0JTRF9ERUZBVUxUCQkoMDw8MTMpIC8qIGRlZmF1bHQgcGluZy1wb25nIG1vZGUgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX0JTRF9SSU5HMQkJKDE8PDEzKQorI2RlZmluZSBJOTE1X0VYRUNfQlNEX1JJTkcyCQkoMjw8MTMpCisKKyNkZWZpbmUgX19JOTE1X0VYRUNfVU5LTk9XTl9GTEFHUyAtKDE8PDE1KQorCisjZGVmaW5lIEk5MTVfRVhFQ19DT05URVhUX0lEX01BU0sJKDB4ZmZmZmZmZmYpCisjZGVmaW5lIGk5MTVfZXhlY2J1ZmZlcjJfc2V0X2NvbnRleHRfaWQoZWIyLCBjb250ZXh0KSBcCisJKGViMikucnN2ZDEgPSBjb250ZXh0ICYgSTkxNV9FWEVDX0NPTlRFWFRfSURfTUFTSworI2RlZmluZSBpOTE1X2V4ZWNidWZmZXIyX2dldF9jb250ZXh0X2lkKGViMikgXAorCSgoZWIyKS5yc3ZkMSAmIEk5MTVfRVhFQ19DT05URVhUX0lEX01BU0spCisKK3N0cnVjdCBkcm1faTkxNV9nZW1fcGluIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gYmUgcGlubmVkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisKKwkvKiogYWxpZ25tZW50IHJlcXVpcmVkIHdpdGhpbiB0aGUgYXBlcnR1cmUgKi8KKwlfX3U2NCBhbGlnbm1lbnQ7CisKKwkvKiogUmV0dXJuZWQgR1RUIG9mZnNldCBvZiB0aGUgYnVmZmVyLiAqLworCV9fdTY0IG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fdW5waW4geworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBiZSB1bnBpbm5lZC4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9idXN5IHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gY2hlY2sgZm9yIGJ1c3kgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogUmV0dXJuIGJ1c3kgc3RhdHVzICgxIGlmIGJ1c3ksIDAgaWYgaWRsZSkuCisJICogVGhlIGhpZ2ggd29yZCBpcyB1c2VkIHRvIGluZGljYXRlIG9uIHdoaWNoIHJpbmdzIHRoZSBvYmplY3QKKwkgKiBjdXJyZW50bHkgcmVzaWRlczoKKwkgKiAgMTY6MzEgLSBidXN5IChyIG9yIHIvdykgcmluZ3MgKDE2IHJlbmRlciwgMTcgYnNkLCAxOCBibHQsIGV0YykKKwkgKi8KKwlfX3UzMiBidXN5OworfTsKKworLyoqCisgKiBJOTE1X0NBQ0hJTkdfTk9ORQorICoKKyAqIEdQVSBhY2Nlc3MgaXMgbm90IGNvaGVyZW50IHdpdGggY3B1IGNhY2hlcy4gRGVmYXVsdCBmb3IgbWFjaGluZXMgd2l0aG91dCBhbgorICogTExDLgorICovCisjZGVmaW5lIEk5MTVfQ0FDSElOR19OT05FCQkwCisvKioKKyAqIEk5MTVfQ0FDSElOR19DQUNIRUQKKyAqCisgKiBHUFUgYWNjZXNzIGlzIGNvaGVyZW50IHdpdGggY3B1IGNhY2hlcyBhbmQgZnVydGhlcm1vcmUgdGhlIGRhdGEgaXMgY2FjaGVkIGluCisgKiBsYXN0LWxldmVsIGNhY2hlcyBzaGFyZWQgYmV0d2VlbiBjcHUgY29yZXMgYW5kIHRoZSBncHUgR1QuIERlZmF1bHQgb24KKyAqIG1hY2hpbmVzIHdpdGggSEFTX0xMQy4KKyAqLworI2RlZmluZSBJOTE1X0NBQ0hJTkdfQ0FDSEVECQkxCisvKioKKyAqIEk5MTVfQ0FDSElOR19ESVNQTEFZCisgKgorICogU3BlY2lhbCBHUFUgY2FjaGluZyBtb2RlIHdoaWNoIGlzIGNvaGVyZW50IHdpdGggdGhlIHNjYW5vdXQgZW5naW5lcy4KKyAqIFRyYW5zcGFyZW50bHkgZmFsbHMgYmFjayB0byBJOTE1X0NBQ0hJTkdfTk9ORSBvbiBwbGF0Zm9ybXMgd2hlcmUgbm8gc3BlY2lhbAorICogY2FjaGUgbW9kZSAobGlrZSB3cml0ZS10aHJvdWdoIG9yIGdmZHQgZmx1c2hpbmcpIGlzIGF2YWlsYWJsZS4gVGhlIGtlcm5lbAorICogYXV0b21hdGljYWxseSBzZXRzIHRoaXMgbW9kZSB3aGVuIHVzaW5nIGEgYnVmZmVyIGFzIGEgc2Nhbm91dCB0YXJnZXQuCisgKiBVc2Vyc3BhY2UgY2FuIG1hbnVhbGx5IHNldCB0aGlzIG1vZGUgdG8gYXZvaWQgYSBjb3N0bHkgc3RhbGwgYW5kIGNsZmx1c2ggaW4KKyAqIHRoZSBob3RwYXRoIG9mIGRyYXdpbmcgdGhlIGZpcnN0IGZyYW1lLgorICovCisjZGVmaW5lIEk5MTVfQ0FDSElOR19ESVNQTEFZCQkyCisKK3N0cnVjdCBkcm1faTkxNV9nZW1fY2FjaGluZyB7CisJLyoqCisJICogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gc2V0L2dldCB0aGUgY2FjaGluZyBsZXZlbCBvZi4gKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKioKKwkgKiBDYWNoZWluZyBsZXZlbCB0byBhcHBseSBvciByZXR1cm4gdmFsdWUKKwkgKgorCSAqIGJpdHMwLTE1IGFyZSBmb3IgZ2VuZXJpYyBjYWNoaW5nIGNvbnRyb2wgKGkuZS4gdGhlIGFib3ZlIGRlZmluZWQKKwkgKiB2YWx1ZXMpLiBiaXRzMTYtMzEgYXJlIHJlc2VydmVkIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyB2YXJpYXRpb25zCisJICogKGUuZy4gbDMkIGNhY2hpbmcgb24gZ2VuNykuICovCisJX191MzIgY2FjaGluZzsKK307CisKKyNkZWZpbmUgSTkxNV9USUxJTkdfTk9ORQkwCisjZGVmaW5lIEk5MTVfVElMSU5HX1gJCTEKKyNkZWZpbmUgSTkxNV9USUxJTkdfWQkJMgorCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV9OT05FCQkwCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85CQkxCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwCQkyCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzExCQkzCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzExCTQKKy8qIE5vdCBzZWVuIGJ5IHVzZXJsYW5kICovCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOCTUKKy8qIFNlZW4gYnkgdXNlcmxhbmQuICovCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzE3CQk2CisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzE3CTcKKworc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfdGlsaW5nIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gaGF2ZSBpdHMgdGlsaW5nIHN0YXRlIHVwZGF0ZWQgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKioKKwkgKiBUaWxpbmcgbW9kZSBmb3IgdGhlIG9iamVjdCAoSTkxNV9USUxJTkdfTk9ORSwgSTkxNV9USUxJTkdfWCwKKwkgKiBJOTE1X1RJTElOR19ZKS4KKwkgKgorCSAqIFRoaXMgdmFsdWUgaXMgdG8gYmUgc2V0IG9uIHJlcXVlc3QsIGFuZCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlCisJICoga2VybmVsIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHdpdGggdGhlIGFjdHVhbCBjaG9zZW4gdGlsaW5nIGxheW91dC4KKwkgKgorCSAqIFRoZSB0aWxpbmcgbW9kZSBtYXkgYmUgZGVtb3RlZCB0byBJOTE1X1RJTElOR19OT05FIHdoZW4gdGhlIHN5c3RlbQorCSAqIGhhcyBiaXQgNiBzd2l6emxpbmcgdGhhdCBjYW4ndCBiZSBtYW5hZ2VkIGNvcnJlY3RseSBieSBHRU0uCisJICoKKwkgKiBCdWZmZXIgY29udGVudHMgYmVjb21lIHVuZGVmaW5lZCB3aGVuIGNoYW5naW5nIHRpbGluZ19tb2RlLgorCSAqLworCV9fdTMyIHRpbGluZ19tb2RlOworCisJLyoqCisJICogU3RyaWRlIGluIGJ5dGVzIGZvciB0aGUgb2JqZWN0IHdoZW4gaW4gSTkxNV9USUxJTkdfWCBvcgorCSAqIEk5MTVfVElMSU5HX1kuCisJICovCisJX191MzIgc3RyaWRlOworCisJLyoqCisJICogUmV0dXJuZWQgYWRkcmVzcyBiaXQgNiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIENQVSBhY2Nlc3MgdGhyb3VnaAorCSAqIG1tYXAgbWFwcGluZy4KKwkgKi8KKwlfX3UzMiBzd2l6emxlX21vZGU7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF90aWxpbmcgeworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBnZXQgdGlsaW5nIHN0YXRlIGZvci4gKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKioKKwkgKiBDdXJyZW50IHRpbGluZyBtb2RlIGZvciB0aGUgb2JqZWN0IChJOTE1X1RJTElOR19OT05FLCBJOTE1X1RJTElOR19YLAorCSAqIEk5MTVfVElMSU5HX1kpLgorCSAqLworCV9fdTMyIHRpbGluZ19tb2RlOworCisJLyoqCisJICogUmV0dXJuZWQgYWRkcmVzcyBiaXQgNiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIENQVSBhY2Nlc3MgdGhyb3VnaAorCSAqIG1tYXAgbWFwcGluZy4KKwkgKi8KKwlfX3UzMiBzd2l6emxlX21vZGU7CisKKwkvKioKKwkgKiBSZXR1cm5lZCBhZGRyZXNzIGJpdCA2IHN3aXp6bGluZyByZXF1aXJlZCBmb3IgQ1BVIGFjY2VzcyB0aHJvdWdoCisJICogbW1hcCBtYXBwaW5nIHdoaWxzdCBib3VuZC4KKwkgKi8KKwlfX3UzMiBwaHlzX3N3aXp6bGVfbW9kZTsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X2FwZXJ0dXJlIHsKKwkvKiogVG90YWwgc2l6ZSBvZiB0aGUgYXBlcnR1cmUgdXNlZCBieSBpOTE1X2dlbV9leGVjYnVmZmVyLCBpbiBieXRlcyAqLworCV9fdTY0IGFwZXJfc2l6ZTsKKworCS8qKgorCSAqIEF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgYXBlcnR1cmUgdXNlZCBieSBpOTE1X2dlbV9leGVjYnVmZmVyLCBpbgorCSAqIGJ5dGVzCisJICovCisJX191NjQgYXBlcl9hdmFpbGFibGVfc2l6ZTsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZXRfcGlwZV9mcm9tX2NydGNfaWQgeworCS8qKiBJRCBvZiBDUlRDIGJlaW5nIHJlcXVlc3RlZCAqKi8KKwlfX3UzMiBjcnRjX2lkOworCisJLyoqIHBpcGUgb2YgcmVxdWVzdGVkIENSVEMgKiovCisJX191MzIgcGlwZTsKK307CisKKyNkZWZpbmUgSTkxNV9NQURWX1dJTExORUVEIDAKKyNkZWZpbmUgSTkxNV9NQURWX0RPTlRORUVEIDEKKyNkZWZpbmUgX19JOTE1X01BRFZfUFVSR0VEIDIgLyogaW50ZXJuYWwgc3RhdGUgKi8KKworc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gY2hhbmdlIHRoZSBiYWNraW5nIHN0b3JlIGFkdmljZSAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qIEFkdmljZTogZWl0aGVyIHRoZSBidWZmZXIgd2lsbCBiZSBuZWVkZWQgYWdhaW4gaW4gdGhlIG5lYXIgZnV0dXJlLAorCSAqICAgICAgICAgb3Igd29uJ3QgYmUgYW5kIGNvdWxkIGJlIGRpc2NhcmRlZCB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisJICovCisJX191MzIgbWFkdjsKKworCS8qKiBXaGV0aGVyIHRoZSBiYWNraW5nIHN0b3JlIHN0aWxsIGV4aXN0cy4gKi8KKwlfX3UzMiByZXRhaW5lZDsKK307CisKKy8qIGZsYWdzICovCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9UWVBFX01BU0sgCQkweGZmCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVZfUExBTkFSIAkweDAxCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVZfUEFDS0VEIAkweDAyCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IJCTB4MDMKKworI2RlZmluZSBJOTE1X09WRVJMQVlfREVQVEhfTUFTSwkJMHhmZjAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IyNAkJMHgxMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IxNgkJMHgyMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IxNQkJMHgzMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MjIJCTB4MDEwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWNDExCQkweDAyMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lVVjQyMAkJMHgwMzAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MTAJCTB4MDQwMAorCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9TV0FQX01BU0sJCTB4ZmYwMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9OT19TV0FQCQkweDAwMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfVVZfU1dBUAkJMHgwMTAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lfU1dBUAkJMHgwMjAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lfQU5EX1VWX1NXQVAJMHgwMzAwMDAKKworI2RlZmluZSBJOTE1X09WRVJMQVlfRkxBR1NfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfRU5BQkxFCQkweDAxMDAwMDAwCisKK3N0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9wdXRfaW1hZ2UgeworCS8qIHZhcmlvdXMgZmxhZ3MgYW5kIHNyYyBmb3JtYXQgZGVzY3JpcHRpb24gKi8KKwlfX3UzMiBmbGFnczsKKwkvKiBzb3VyY2UgcGljdHVyZSBkZXNjcmlwdGlvbiAqLworCV9fdTMyIGJvX2hhbmRsZTsKKwkvKiBzdHJpZGUgdmFsdWVzIGFuZCBvZmZzZXRzIGFyZSBpbiBieXRlcywgYnVmZmVyIHJlbGF0aXZlICovCisJX191MTYgc3RyaWRlX1k7IC8qIHN0cmlkZSBmb3IgcGFja2VkIGZvcm1hdHMgKi8KKwlfX3UxNiBzdHJpZGVfVVY7CisJX191MzIgb2Zmc2V0X1k7IC8qIG9mZnNldCBmb3IgcGFja2V0IGZvcm1hdHMgKi8KKwlfX3UzMiBvZmZzZXRfVTsKKwlfX3UzMiBvZmZzZXRfVjsKKwkvKiBpbiBwaXhlbHMgKi8KKwlfX3UxNiBzcmNfd2lkdGg7CisJX191MTYgc3JjX2hlaWdodDsKKwkvKiB0byBjb21wZW5zYXRlIHRoZSBzY2FsaW5nIGZhY3RvcnMgZm9yIHBhcnRpYWxseSBjb3ZlcmVkIHN1cmZhY2VzICovCisJX191MTYgc3JjX3NjYW5fd2lkdGg7CisJX191MTYgc3JjX3NjYW5faGVpZ2h0OworCS8qIG91dHB1dCBjcnRjIGRlc2NyaXB0aW9uICovCisJX191MzIgY3J0Y19pZDsKKwlfX3UxNiBkc3RfeDsKKwlfX3UxNiBkc3RfeTsKKwlfX3UxNiBkc3Rfd2lkdGg7CisJX191MTYgZHN0X2hlaWdodDsKK307CisKKy8qIGZsYWdzICovCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9VUERBVEVfQVRUUlMJKDE8PDApCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9VUERBVEVfR0FNTUEJKDE8PDEpCitzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfYXR0cnMgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNvbG9yX2tleTsKKwlfX3MzMiBicmlnaHRuZXNzOworCV9fdTMyIGNvbnRyYXN0OworCV9fdTMyIHNhdHVyYXRpb247CisJX191MzIgZ2FtbWEwOworCV9fdTMyIGdhbW1hMTsKKwlfX3UzMiBnYW1tYTI7CisJX191MzIgZ2FtbWEzOworCV9fdTMyIGdhbW1hNDsKKwlfX3UzMiBnYW1tYTU7Cit9OworCisvKgorICogSW50ZWwgc3ByaXRlIGhhbmRsaW5nCisgKgorICogQ29sb3Iga2V5aW5nIHdvcmtzIHdpdGggYSBtaW4vbWFzay9tYXggdHVwbGUuICBCb3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAqIGNvbG9yIGtleWluZyBpcyBhbGxvd2VkLgorICoKKyAqIFNvdXJjZSBrZXlpbmc6CisgKiBTcHJpdGUgcGl4ZWxzIHdpdGhpbiB0aGUgbWluICYgbWF4IHZhbHVlcywgbWFza2VkIGFnYWluc3QgdGhlIGNvbG9yIGNoYW5uZWxzCisgKiBzcGVjaWZpZWQgaW4gdGhlIG1hc2sgZmllbGQsIHdpbGwgYmUgdHJhbnNwYXJlbnQuICBBbGwgb3RoZXIgcGl4ZWxzIHdpbGwKKyAqIGJlIGRpc3BsYXllZCBvbiB0b3Agb2YgdGhlIHByaW1hcnkgcGxhbmUuICBGb3IgUkdCIHN1cmZhY2VzLCBvbmx5IHRoZSBtaW4KKyAqIGFuZCBtYXNrIGZpZWxkcyB3aWxsIGJlIHVzZWQ7IHJhbmdlZCBjb21wYXJlcyBhcmUgbm90IGFsbG93ZWQuCisgKgorICogRGVzdGluYXRpb24ga2V5aW5nOgorICogUHJpbWFyeSBwbGFuZSBwaXhlbHMgdGhhdCBtYXRjaCB0aGUgbWluIHZhbHVlLCBtYXNrZWQgYWdhaW5zdCB0aGUgY29sb3IKKyAqIGNoYW5uZWxzIHNwZWNpZmllZCBpbiB0aGUgbWFzayBmaWVsZCwgd2lsbCBiZSByZXBsYWNlZCBieSBjb3JyZXNwb25kaW5nCisgKiBwaXhlbHMgZnJvbSB0aGUgc3ByaXRlIHBsYW5lLgorICoKKyAqIE5vdGUgdGhhdCBzb3VyY2UgJiBkZXN0aW5hdGlvbiBrZXlpbmcgYXJlIGV4Y2x1c2l2ZTsgb25seSBvbmUgY2FuIGJlCisgKiBhY3RpdmUgb24gYSBnaXZlbiBwbGFuZS4KKyAqLworCisjZGVmaW5lIEk5MTVfU0VUX0NPTE9SS0VZX05PTkUJCSgxPDwwKSAvKiBkaXNhYmxlIGNvbG9yIGtleSBtYXRjaGluZyAqLworI2RlZmluZSBJOTE1X1NFVF9DT0xPUktFWV9ERVNUSU5BVElPTgkoMTw8MSkKKyNkZWZpbmUgSTkxNV9TRVRfQ09MT1JLRVlfU09VUkNFCSgxPDwyKQorc3RydWN0IGRybV9pbnRlbF9zcHJpdGVfY29sb3JrZXkgeworCV9fdTMyIHBsYW5lX2lkOworCV9fdTMyIG1pbl92YWx1ZTsKKwlfX3UzMiBjaGFubmVsX21hc2s7CisJX191MzIgbWF4X3ZhbHVlOworCV9fdTMyIGZsYWdzOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV93YWl0IHsKKwkvKiogSGFuZGxlIG9mIEJPIHdlIHNoYWxsIHdhaXQgb24gKi8KKwlfX3UzMiBib19oYW5kbGU7CisJX191MzIgZmxhZ3M7CisJLyoqIE51bWJlciBvZiBuYW5vc2Vjb25kcyB0byB3YWl0LCBSZXR1cm5zIHRpbWUgcmVtYWluaW5nLiAqLworCV9fczY0IHRpbWVvdXRfbnM7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfY3JlYXRlIHsKKwkvKiAgb3V0cHV0OiBpZCBvZiBuZXcgY29udGV4dCovCisJX191MzIgY3R4X2lkOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9kZXN0cm95IHsKKwlfX3UzMiBjdHhfaWQ7CisJX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV9pOTE1X3JlZ19yZWFkIHsKKwlfX3U2NCBvZmZzZXQ7CisJX191NjQgdmFsOyAvKiBSZXR1cm4gdmFsdWUgKi8KK307CisKK3N0cnVjdCBkcm1faTkxNV9yZXNldF9zdGF0cyB7CisJX191MzIgY3R4X2lkOworCV9fdTMyIGZsYWdzOworCisJLyogQWxsIHJlc2V0cyBzaW5jZSBib290L21vZHVsZSByZWxvYWQsIGZvciBhbGwgY29udGV4dHMgKi8KKwlfX3UzMiByZXNldF9jb3VudDsKKworCS8qIE51bWJlciBvZiBiYXRjaGVzIGxvc3Qgd2hlbiBhY3RpdmUgaW4gR1BVLCBmb3IgdGhpcyBjb250ZXh0ICovCisJX191MzIgYmF0Y2hfYWN0aXZlOworCisJLyogTnVtYmVyIG9mIGJhdGNoZXMgbG9zdCBwZW5kaW5nIGZvciBleGVjdXRpb24sIGZvciB0aGlzIGNvbnRleHQgKi8KKwlfX3UzMiBiYXRjaF9wZW5kaW5nOworCisJX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV91c2VycHRyIHsKKwlfX3U2NCB1c2VyX3B0cjsKKwlfX3U2NCB1c2VyX3NpemU7CisJX191MzIgZmxhZ3M7CisjZGVmaW5lIEk5MTVfVVNFUlBUUl9SRUFEX09OTFkgMHgxCisjZGVmaW5lIEk5MTVfVVNFUlBUUl9VTlNZTkNIUk9OSVpFRCAweDgwMDAwMDAwCisJLyoqCisJICogUmV0dXJuZWQgaGFuZGxlIGZvciB0aGUgb2JqZWN0LgorCSAqCisJICogT2JqZWN0IGhhbmRsZXMgYXJlIG5vbnplcm8uCisJICovCisJX191MzIgaGFuZGxlOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtIHsKKwlfX3UzMiBjdHhfaWQ7CisJX191MzIgc2l6ZTsKKwlfX3U2NCBwYXJhbTsKKyNkZWZpbmUgSTkxNV9DT05URVhUX1BBUkFNX0JBTl9QRVJJT0QgMHgxCisJX191NjQgdmFsdWU7Cit9OworCisjZW5kaWYgLyogX0k5MTVfRFJNX0hfICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9hdWIuaCBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2ludGVsL2ludGVsX2F1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGFiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9hdWIuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisvKiogQGZpbGUgaW50ZWxfYXViLmgKKyAqCisgKiBUaGUgQVVCIGZpbGUgaXMgYSBmaWxlIGZvcm1hdCB1c2VkIGJ5IEludGVsJ3MgaW50ZXJuYWwgc2ltdWxhdGlvbgorICogYW5kIG90aGVyIHZhbGlkYXRpb24gdG9vbHMuICBJdCBjYW4gYmUgdXNlZCBhdCB2YXJpb3VzIGxldmVscyBieSBhCisgKiBkcml2ZXIgdG8gaW5wdXQgc3RhdGUgdG8gdGhlIHNpbXVsYXRlZCBoYXJkd2FyZSBvciBhIHJlcGxheWluZworICogZGVidWdnZXIuCisgKgorICogV2UgY2hvb3NlIHRvIGR1bXAgQVVCIGZpbGVzIHVzaW5nIHRoZSB0cmFjZSBibG9jayBmb3JtYXQgZm9yIGVhc2UKKyAqIG9mIGltcGxlbWVudGF0aW9uIC0tIGR1bXAgb3V0IHRoZSBibG9ja3Mgb2YgbWVtb3J5IGFzIHBsYWluIGJsb2JzCisgKiBhbmQgaW5zZXJ0IHJpbmcgY29tbWFuZHMgdG8gZXhlY3V0ZSB0aGUgYmF0Y2hidWZmZXIgYmxvYi4KKyAqLworCisjaWZuZGVmIF9JTlRFTF9BVUJfSAorI2RlZmluZSBfSU5URUxfQVVCX0gKKworI2RlZmluZSBBVUJfTUlfTk9PUAkJCSgwKQorI2RlZmluZSBBVUJfTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIAkoMHgzMSA8PCAyMykKKyNkZWZpbmUgQVVCX1BJUEVfQ09OVFJPTAkJKDB4N2EwMDAwMDIpCisKKy8qIERXMDogaW5zdHJ1Y3Rpb24gdHlwZS4gKi8KKworI2RlZmluZSBDTURfQVVCCQkJKDcgPDwgMjkpCisKKyNkZWZpbmUgQ01EX0FVQl9IRUFERVIJCShDTURfQVVCIHwgKDEgPDwgMjMpIHwgKDB4MDUgPDwgMTYpKQorLyogRFcxICovCisjIGRlZmluZSBBVUJfSEVBREVSX01BSk9SX1NISUZUCQkyNAorIyBkZWZpbmUgQVVCX0hFQURFUl9NSU5PUl9TSElGVAkJMTYKKworI2RlZmluZSBDTURfQVVCX1RSQUNFX0hFQURFUl9CTE9DSyAoQ01EX0FVQiB8ICgxIDw8IDIzKSB8ICgweDQxIDw8IDE2KSkKKyNkZWZpbmUgQ01EX0FVQl9EVU1QX0JNUCAgICAgICAgICAgKENNRF9BVUIgfCAoMSA8PCAyMykgfCAoMHg5ZSA8PCAxNikpCisKKy8qIERXMSAqLworI2RlZmluZSBBVUJfVFJBQ0VfT1BFUkFUSU9OX01BU0sJMHgwMDAwMDBmZgorI2RlZmluZSBBVUJfVFJBQ0VfT1BfQ09NTUVOVAkJMHgwMDAwMDAwMAorI2RlZmluZSBBVUJfVFJBQ0VfT1BfREFUQV9XUklURQkJMHgwMDAwMDAwMQorI2RlZmluZSBBVUJfVFJBQ0VfT1BfQ09NTUFORF9XUklURQkweDAwMDAwMDAyCisjZGVmaW5lIEFVQl9UUkFDRV9PUF9NTUlPX1dSSVRFCQkweDAwMDAwMDAzCisvLyBvcGVyYXRpb24gPSBUUkFDRV9EQVRBX1dSSVRFLCBUeXBlCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX01BU0sJCTB4MDAwMGZmMDAKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfTk9UWVBFCQkoMCA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9CQVRDSAkJKDEgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfVkVSVEVYX0JVRkZFUgkoNSA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV8yRF9NQVAJCSg2IDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0NVQkVfTUFQCQkoNyA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9WT0xVTUVfTUFQCSg5IDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFXzFEX01BUAkJKDEwIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0NPTlNUQU5UX0JVRkZFUgkoMTEgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfQ09OU1RBTlRfVVJCCSgxMiA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9JTkRFWF9CVUZGRVIJKDEzIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwJCSgxNCA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9TVVJGQUNFCQkoMTUgPDwgOCkKKworCisvLyBvcGVyYXRpb24gPSBUUkFDRV9DT01NQU5EX1dSSVRFLCBUeXBlID0KKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfUklOR19IV0IJCSgxIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX1JJTkdfUFJCMAkoMiA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9SSU5HX1BSQjEJKDMgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfUklOR19QUkIyCSg0IDw8IDgpCisKKy8vIEFkZHJlc3Mgc3BhY2UKKyNkZWZpbmUgQVVCX1RSQUNFX0FERFJFU1NfU1BBQ0VfTUFTSwkweDAwZmYwMDAwCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX0dUVAkJKDAgPDwgMTYpCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX0xPQ0FMCQkoMSA8PCAxNikKKyNkZWZpbmUgQVVCX1RSQUNFX01FTVRZUEVfTk9OTE9DQUwJKDIgPDwgMTYpCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX1BDSQkJKDMgPDwgMTYpCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX0dUVF9FTlRSWSAgICAgKDQgPDwgMTYpCisKKy8qIERXMiAqLworCisvKioKKyAqIGF1Yl9zdGF0ZV9zdHJ1Y3RfdHlwZSBlbnVtIHZhbHVlcyBhcmUgZW5jb2RlZCB3aXRoIHRoZSB0b3AgMTYgYml0cworICogcmVwcmVzZW50aW5nIHRoZSB0eXBlIHRvIGJlIGRlbGl2ZXJlZCB0byB0aGUgLmF1YiBmaWxlLCBhbmQgdGhlIGJvdHRvbSAxNgorICogYml0cyByZXByZXNlbnRpbmcgdGhlIHN1YnR5cGUuICBUaGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBlbmNvZGluZy4KKyAqLworI2RlZmluZSBFTkNPREVfU1NfVFlQRSh0eXBlLCBzdWJ0eXBlKSAoKCh0eXBlKSA8PCAxNikgfCAoc3VidHlwZSkpCisKK2VudW0gYXViX3N0YXRlX3N0cnVjdF90eXBlIHsKKyAgIEFVQl9UUkFDRV9WU19TVEFURSA9CQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMSksCisgICBBVUJfVFJBQ0VfR1NfU1RBVEUgPQkJCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDIpLAorICAgQVVCX1RSQUNFX0NMSVBfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMyksCisgICBBVUJfVFJBQ0VfU0ZfU1RBVEUgPQkJCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDQpLAorICAgQVVCX1RSQUNFX1dNX1NUQVRFID0JCQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCA1KSwKKyAgIEFVQl9UUkFDRV9DQ19TVEFURSA9CQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgNiksCisgICBBVUJfVFJBQ0VfQ0xJUF9WUF9TVEFURSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCA3KSwKKyAgIEFVQl9UUkFDRV9TRl9WUF9TVEFURSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCA4KSwKKyAgIEFVQl9UUkFDRV9DQ19WUF9TVEFURSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCAweDkpLAorICAgQVVCX1RSQUNFX1NBTVBMRVJfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHhhKSwKKyAgIEFVQl9UUkFDRV9LRVJORUxfSU5TVFJVQ1RJT05TID0JRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHhiKSwKKyAgIEFVQl9UUkFDRV9TQ1JBVENIX1NQQUNFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4YyksCisgICBBVUJfVFJBQ0VfU0FNUExFUl9ERUZBVUxUX0NPTE9SID0JRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHhkKSwKKworICAgQVVCX1RSQUNFX1NDSVNTT1JfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHgxNSksCisgICBBVUJfVFJBQ0VfQkxFTkRfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHgxNiksCisgICBBVUJfVFJBQ0VfREVQVEhfU1RFTkNJTF9TVEFURSA9CUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4MTcpLAorCisgICBBVUJfVFJBQ0VfVkVSVEVYX0JVRkZFUiA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9WRVJURVhfQlVGRkVSLCAwKSwKKyAgIEFVQl9UUkFDRV9CSU5ESU5HX1RBQkxFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX1NVUkZBQ0UsIDB4MTAwKSwKKyAgIEFVQl9UUkFDRV9TVVJGQUNFX1NUQVRFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX1NVUkZBQ0UsIDB4MjAwKSwKKyAgIEFVQl9UUkFDRV9WU19DT05TVEFOVFMgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfQ09OU1RBTlRfQlVGRkVSLCAwKSwKKyAgIEFVQl9UUkFDRV9XTV9DT05TVEFOVFMgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfQ09OU1RBTlRfQlVGRkVSLCAxKSwKK307CisKKyN1bmRlZiBFTkNPREVfU1NfVFlQRQorCisvKioKKyAqIERlY29kZSBhIGF1Yl9zdGF0ZV9zdHJ1Y3RfdHlwZSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUKKyAqIHN0b3JlZCBpbiB0aGUgLmF1YiBmaWxlLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEFVQl9UUkFDRV9UWVBFKGVudW0gYXViX3N0YXRlX3N0cnVjdF90eXBlIHNzX3R5cGUpCit7CisgICByZXR1cm4gKHNzX3R5cGUgJiAweEZGRkYwMDAwKSA+PiAxNjsKK30KKworLyoqCisgKiBEZWNvZGUgYSBzdGF0ZV9zdHJ1Y3RfdHlwZSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHN1YnR5cGUgdGhhdCBzaG91bGQgYmUKKyAqIHN0b3JlZCBpbiB0aGUgLmF1YiBmaWxlLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEFVQl9UUkFDRV9TVUJUWVBFKGVudW0gYXViX3N0YXRlX3N0cnVjdF90eXBlIHNzX3R5cGUpCit7CisgICByZXR1cm4gc3NfdHlwZSAmIDB4RkZGRjsKK30KKworLyogRFczOiBhZGRyZXNzICovCisvKiBEVzQ6IGxlbiAqLworCisjZW5kaWYgLyogX0lOVEVMX0FVQl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3IuYyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2ludGVsL2ludGVsX2J1Zm1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNGNkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3IuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRybS5oPgorI2luY2x1ZGUgPGk5MTVfZHJtLmg+CisjaW5jbHVkZSA8cGNpYWNjZXNzLmg+CisjaW5jbHVkZSAibGliZHJtLmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmbWdyLmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmbWdyX3ByaXYuaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisKKy8qKiBAZmlsZSBpbnRlbF9idWZtZ3IuYworICoKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgYnVmZmVyIG1hbmFnZW1lbnQgbWV0aG9kcy4KKyAqLworCitkcm1fcHVibGljIGRybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfYm9fYWxsb2MoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpCit7CisJcmV0dXJuIGJ1Zm1nci0+Ym9fYWxsb2MoYnVmbWdyLCBuYW1lLCBzaXplLCBhbGlnbm1lbnQpOworfQorCitkcm1fcHVibGljIGRybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfYm9fYWxsb2NfZm9yX3JlbmRlcihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpCit7CisJcmV0dXJuIGJ1Zm1nci0+Ym9fYWxsb2NfZm9yX3JlbmRlcihidWZtZ3IsIG5hbWUsIHNpemUsIGFsaWdubWVudCk7Cit9CisKK2RybV9wdWJsaWMgZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9ib19hbGxvY191c2VycHRyKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmFkZHIsCisJCQkgICB1aW50MzJfdCB0aWxpbmdfbW9kZSwKKwkJCSAgIHVpbnQzMl90IHN0cmlkZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaWYgKGJ1Zm1nci0+Ym9fYWxsb2NfdXNlcnB0cikKKwkJcmV0dXJuIGJ1Zm1nci0+Ym9fYWxsb2NfdXNlcnB0cihidWZtZ3IsIG5hbWUsIGFkZHIsIHRpbGluZ19tb2RlLAorCQkJCQkJc3RyaWRlLCBzaXplLCBmbGFncyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2RybV9wdWJsaWMgZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9ib19hbGxvY190aWxlZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCBjcHAsIHVpbnQzMl90ICp0aWxpbmdfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnBpdGNoLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBidWZtZ3ItPmJvX2FsbG9jX3RpbGVkKGJ1Zm1nciwgbmFtZSwgeCwgeSwgY3BwLAorCQkJCSAgICAgIHRpbGluZ19tb2RlLCBwaXRjaCwgZmxhZ3MpOworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9ib19yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibykKK3sKKwliby0+YnVmbWdyLT5ib19yZWZlcmVuY2UoYm8pOworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9ib191bnJlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKQoreworCWlmIChibyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwliby0+YnVmbWdyLT5ib191bnJlZmVyZW5jZShibyk7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfYm9fbWFwKGRybV9pbnRlbF9ibyAqYnVmLCBpbnQgd3JpdGVfZW5hYmxlKQoreworCXJldHVybiBidWYtPmJ1Zm1nci0+Ym9fbWFwKGJ1Ziwgd3JpdGVfZW5hYmxlKTsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9ib191bm1hcChkcm1faW50ZWxfYm8gKmJ1ZikKK3sKKwlyZXR1cm4gYnVmLT5idWZtZ3ItPmJvX3VubWFwKGJ1Zik7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfYm9fc3ViZGF0YShkcm1faW50ZWxfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX3N1YmRhdGEoYm8sIG9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfYm9fZ2V0X3N1YmRhdGEoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisJaWYgKGJvLT5idWZtZ3ItPmJvX2dldF9zdWJkYXRhKQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fZ2V0X3N1YmRhdGEoYm8sIG9mZnNldCwgc2l6ZSwgZGF0YSk7CisKKwlpZiAoc2l6ZSA9PSAwIHx8IGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBkcm1faW50ZWxfYm9fbWFwKGJvLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW1lbWNweShkYXRhLCAodW5zaWduZWQgY2hhciAqKWJvLT52aXJ0dWFsICsgb2Zmc2V0LCBzaXplKTsKKwlkcm1faW50ZWxfYm9fdW5tYXAoYm8pOworCXJldHVybiAwOworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9ib193YWl0X3JlbmRlcmluZyhkcm1faW50ZWxfYm8gKmJvKQoreworCWJvLT5idWZtZ3ItPmJvX3dhaXRfcmVuZGVyaW5nKGJvKTsKK30KKworZHJtX3B1YmxpYyB2b2lkCitkcm1faW50ZWxfYnVmbWdyX2Rlc3Ryb3koZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWJ1Zm1nci0+ZGVzdHJveShidWZtZ3IpOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX2V4ZWMoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCSAgZHJtX2NsaXBfcmVjdF90ICogY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCkKK3sKKwlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fZXhlYyhibywgdXNlZCwgY2xpcHJlY3RzLCBudW1fY2xpcHJlY3RzLCBEUjQpOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX21yYl9leGVjKGRybV9pbnRlbF9ibyAqYm8sIGludCB1c2VkLAorCQlkcm1fY2xpcF9yZWN0X3QgKmNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsIGludCBEUjQsCisJCXVuc2lnbmVkIGludCByaW5ncykKK3sKKwlpZiAoYm8tPmJ1Zm1nci0+Ym9fbXJiX2V4ZWMpCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19tcmJfZXhlYyhibywgdXNlZCwKKwkJCQkJY2xpcHJlY3RzLCBudW1fY2xpcHJlY3RzLCBEUjQsCisJCQkJCXJpbmdzKTsKKworCXN3aXRjaCAocmluZ3MpIHsKKwljYXNlIEk5MTVfRVhFQ19ERUZBVUxUOgorCWNhc2UgSTkxNV9FWEVDX1JFTkRFUjoKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX2V4ZWMoYm8sIHVzZWQsCisJCQkJCSAgIGNsaXByZWN0cywgbnVtX2NsaXByZWN0cywgRFI0KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9Cit9CisKK2RybV9wdWJsaWMgdm9pZAorZHJtX2ludGVsX2J1Zm1ncl9zZXRfZGVidWcoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgZW5hYmxlX2RlYnVnKQoreworCWJ1Zm1nci0+ZGVidWcgPSBlbmFibGVfZGVidWc7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KQoreworCXJldHVybiBib19hcnJheVswXS0+YnVmbWdyLT5jaGVja19hcGVydHVyZV9zcGFjZShib19hcnJheSwgY291bnQpOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX2ZsaW5rKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogbmFtZSkKK3sKKwlpZiAoYm8tPmJ1Zm1nci0+Ym9fZmxpbmspCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19mbGluayhibywgbmFtZSk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9ib19lbWl0X3JlbG9jKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCWRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvLCB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkJdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pCit7CisJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX2VtaXRfcmVsb2MoYm8sIG9mZnNldCwKKwkJCQkJIHRhcmdldF9ibywgdGFyZ2V0X29mZnNldCwKKwkJCQkJIHJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluKTsKK30KKworLyogRm9yIGZlbmNlIHJlZ2lzdGVycywgbm90IEdMIGZlbmNlcyAqLworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9ib19lbWl0X3JlbG9jX2ZlbmNlKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCSAgICAgIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvLCB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkJICAgICAgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pCit7CisJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX2VtaXRfcmVsb2NfZmVuY2UoYm8sIG9mZnNldCwKKwkJCQkJICAgICAgIHRhcmdldF9ibywgdGFyZ2V0X29mZnNldCwKKwkJCQkJICAgICAgIHJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluKTsKK30KKworCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX3Bpbihkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBhbGlnbm1lbnQpCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX3BpbikKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX3BpbihibywgYWxpZ25tZW50KTsKKworCXJldHVybiAtRU5PREVWOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX3VucGluKGRybV9pbnRlbF9ibyAqYm8pCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX3VucGluKQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fdW5waW4oYm8pOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfYm9fc2V0X3RpbGluZyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAorCQkJdWludDMyX3Qgc3RyaWRlKQoreworCWlmIChiby0+YnVmbWdyLT5ib19zZXRfdGlsaW5nKQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fc2V0X3RpbGluZyhibywgdGlsaW5nX21vZGUsIHN0cmlkZSk7CisKKwkqdGlsaW5nX21vZGUgPSBJOTE1X1RJTElOR19OT05FOworCXJldHVybiAwOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX2dldF90aWxpbmcoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiB0aWxpbmdfbW9kZSwKKwkJCXVpbnQzMl90ICogc3dpenpsZV9tb2RlKQoreworCWlmIChiby0+YnVmbWdyLT5ib19nZXRfdGlsaW5nKQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fZ2V0X3RpbGluZyhibywgdGlsaW5nX21vZGUsIHN3aXp6bGVfbW9kZSk7CisKKwkqdGlsaW5nX21vZGUgPSBJOTE1X1RJTElOR19OT05FOworCSpzd2l6emxlX21vZGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwlyZXR1cm4gMDsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9ib19kaXNhYmxlX3JldXNlKGRybV9pbnRlbF9ibyAqYm8pCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX2Rpc2FibGVfcmV1c2UpCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19kaXNhYmxlX3JldXNlKGJvKTsKKwlyZXR1cm4gMDsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9ib19pc19yZXVzYWJsZShkcm1faW50ZWxfYm8gKmJvKQoreworCWlmIChiby0+YnVmbWdyLT5ib19pc19yZXVzYWJsZSkKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX2lzX3JldXNhYmxlKGJvKTsKKwlyZXR1cm4gMDsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9ib19idXN5KGRybV9pbnRlbF9ibyAqYm8pCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX2J1c3kpCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19idXN5KGJvKTsKKwlyZXR1cm4gMDsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9ib19tYWR2aXNlKGRybV9pbnRlbF9ibyAqYm8sIGludCBtYWR2KQoreworCWlmIChiby0+YnVmbWdyLT5ib19tYWR2aXNlKQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fbWFkdmlzZShibywgbWFkdik7CisJcmV0dXJuIC0xOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX3JlZmVyZW5jZXMoZHJtX2ludGVsX2JvICpibywgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8pCit7CisJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX3JlZmVyZW5jZXMoYm8sIHRhcmdldF9ibyk7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGNydGNfaWQpCit7CisJaWYgKGJ1Zm1nci0+Z2V0X3BpcGVfZnJvbV9jcnRjX2lkKQorCQlyZXR1cm4gYnVmbWdyLT5nZXRfcGlwZV9mcm9tX2NydGNfaWQoYnVmbWdyLCBjcnRjX2lkKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzaXplX3QKK2RybV9pbnRlbF9wcm9iZV9hZ3BfYXBlcnR1cmVfc2l6ZShpbnQgZmQpCit7CisJc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXY7CisJc2l6ZV90IHNpemUgPSAwOworCWludCByZXQ7CisKKwlyZXQgPSBwY2lfc3lzdGVtX2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIFhYWCBoYW5kbGUgbXVsdGlwbGUgYWRhcHRvcnM/ICovCisJcGNpX2RldiA9IHBjaV9kZXZpY2VfZmluZF9ieV9zbG90KDAsIDAsIDIsIDApOworCWlmIChwY2lfZGV2ID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJcmV0ID0gcGNpX2RldmljZV9wcm9iZShwY2lfZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXNpemUgPSBwY2lfZGV2LT5yZWdpb25zWzJdLnNpemU7CitlcnI6CisJcGNpX3N5c3RlbV9jbGVhbnVwICgpOworCXJldHVybiBzaXplOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2dldF9hcGVydHVyZV9zaXplcyhpbnQgZmQsIHNpemVfdCAqbWFwcGFibGUsIHNpemVfdCAqdG90YWwpCit7CisKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF9hcGVydHVyZSBhcGVydHVyZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfQVBFUlRVUkUsICZhcGVydHVyZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSptYXBwYWJsZSA9IDA7CisJLyogWFhYIGFkZCBhIHF1ZXJ5IGZvciB0aGUga2VybmVsIHZhbHVlPyAqLworCWlmICgqbWFwcGFibGUgPT0gMCkKKwkJKm1hcHBhYmxlID0gZHJtX2ludGVsX3Byb2JlX2FncF9hcGVydHVyZV9zaXplKGZkKTsKKwlpZiAoKm1hcHBhYmxlID09IDApCisJCSptYXBwYWJsZSA9IDY0ICogMTAyNCAqIDEwMjQ7IC8qIG1pbmltdW0gcG9zc2libGUgdmFsdWUgKi8KKwkqdG90YWwgPSBhcGVydHVyZS5hcGVyX3NpemU7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3IuaCBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2ludGVsL2ludGVsX2J1Zm1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWJkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3IuaApAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4LTIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKy8qKgorICogQGZpbGUgaW50ZWxfYnVmbWdyLmgKKyAqCisgKiBQdWJsaWMgZGVmaW5pdGlvbnMgb2YgSW50ZWwtc3BlY2lmaWMgYnVmbWdyIGZ1bmN0aW9ucy4KKyAqLworCisjaWZuZGVmIElOVEVMX0JVRk1HUl9ICisjZGVmaW5lIElOVEVMX0JVRk1HUl9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0cnVjdCBkcm1fY2xpcF9yZWN0OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2J1Zm1nciBkcm1faW50ZWxfYnVmbWdyOwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9jb250ZXh0IGRybV9pbnRlbF9jb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9ibyBkcm1faW50ZWxfYm87CisKK3N0cnVjdCBfZHJtX2ludGVsX2JvIHsKKwkvKioKKwkgKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgb2JqZWN0LgorCSAqCisJICogVGhlIHNpemUgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG9yaWdpbmFsbHkgcmVxdWVzdGVkIGZvciB0aGUKKwkgKiBhbGxvY2F0aW9uLCBzdWNoIGFzIGJlaW5nIGFsaWduZWQgdG8gcGFnZSBzaXplLgorCSAqLworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCS8qKgorCSAqIEFsaWdubWVudCByZXF1aXJlbWVudCBmb3Igb2JqZWN0CisJICoKKwkgKiBVc2VkIGZvciBHVFQgbWFwcGluZyAmIHBpbm5pbmcgdGhlIG9iamVjdC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGFsaWduOworCisJLyoqCisJICogRGVwcmVjYXRlZCBmaWVsZCBjb250YWluaW5nIChwb3NzaWJseSB0aGUgbG93IDMyLWJpdHMgb2YpIHRoZSBsYXN0CisJICogc2VlbiB2aXJ0dWFsIGNhcmQgYWRkcmVzcy4gIFVzZSBvZmZzZXQ2NCBpbnN0ZWFkLgorCSAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJLyoqCisJICogVmlydHVhbCBhZGRyZXNzIGZvciBhY2Nlc3NpbmcgdGhlIGJ1ZmZlciBkYXRhLiAgT25seSB2YWxpZCB3aGlsZQorCSAqIG1hcHBlZC4KKwkgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworCXZvaWQgKnZpcnQ7CisjZWxzZQorCXZvaWQgKnZpcnR1YWw7CisjZW5kaWYKKworCS8qKiBCdWZmZXIgbWFuYWdlciBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1ZmZlciBvYmplY3QgKi8KKwlkcm1faW50ZWxfYnVmbWdyICpidWZtZ3I7CisKKwkvKioKKwkgKiBNTS1zcGVjaWZpYyBoYW5kbGUgZm9yIGFjY2Vzc2luZyBvYmplY3QKKwkgKi8KKwlpbnQgaGFuZGxlOworCisJLyoqCisJICogTGFzdCBzZWVuIGNhcmQgdmlydHVhbCBhZGRyZXNzIChvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCSAqIGFwZXJ0dXJlKSBmb3IgdGhlIG9iamVjdC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gZmlsbCByZWxvY2F0aW9uCisJICogZW50cmllcyB3aGVuIGNhbGxpbmcgZHJtX2ludGVsX2JvX2VtaXRfcmVsb2MoKQorCSAqLworCXVpbnQ2NF90IG9mZnNldDY0OworfTsKKworZW51bSBhdWJfZHVtcF9ibXBfZm9ybWF0IHsKKwlBVUJfRFVNUF9CTVBfRk9STUFUXzhCSVQgPSAxLAorCUFVQl9EVU1QX0JNUF9GT1JNQVRfQVJHQl80NDQ0ID0gNCwKKwlBVUJfRFVNUF9CTVBfRk9STUFUX0FSR0JfMDg4OCA9IDYsCisJQVVCX0RVTVBfQk1QX0ZPUk1BVF9BUkdCXzg4ODggPSA3LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9hdWJfYW5ub3RhdGlvbiB7CisJdWludDMyX3QgdHlwZTsKKwl1aW50MzJfdCBzdWJ0eXBlOworCXVpbnQzMl90IGVuZGluZ19vZmZzZXQ7Cit9IGRybV9pbnRlbF9hdWJfYW5ub3RhdGlvbjsKKworI2RlZmluZSBCT19BTExPQ19GT1JfUkVOREVSICgxPDwwKQorCitkcm1faW50ZWxfYm8gKmRybV9pbnRlbF9ib19hbGxvYyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IGFsaWdubWVudCk7Citkcm1faW50ZWxfYm8gKmRybV9pbnRlbF9ib19hbGxvY19mb3JfcmVuZGVyKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KTsKK2RybV9pbnRlbF9ibyAqZHJtX2ludGVsX2JvX2FsbG9jX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCQl2b2lkICphZGRyLCB1aW50MzJfdCB0aWxpbmdfbW9kZSwKKwkJCQkJdWludDMyX3Qgc3RyaWRlLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZHJtX2ludGVsX2JvICpkcm1faW50ZWxfYm9fYWxsb2NfdGlsZWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgICBpbnQgeCwgaW50IHksIGludCBjcHAsCisJCQkJICAgICAgIHVpbnQzMl90ICp0aWxpbmdfbW9kZSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcGl0Y2gsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCBkcm1faW50ZWxfYm9fcmVmZXJlbmNlKGRybV9pbnRlbF9ibyAqYm8pOwordm9pZCBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibyk7CitpbnQgZHJtX2ludGVsX2JvX21hcChkcm1faW50ZWxfYm8gKmJvLCBpbnQgd3JpdGVfZW5hYmxlKTsKK2ludCBkcm1faW50ZWxfYm9fdW5tYXAoZHJtX2ludGVsX2JvICpibyk7CisKK2ludCBkcm1faW50ZWxfYm9fc3ViZGF0YShkcm1faW50ZWxfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworaW50IGRybV9pbnRlbF9ib19nZXRfc3ViZGF0YShkcm1faW50ZWxfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKTsKK3ZvaWQgZHJtX2ludGVsX2JvX3dhaXRfcmVuZGVyaW5nKGRybV9pbnRlbF9ibyAqYm8pOworCit2b2lkIGRybV9pbnRlbF9idWZtZ3Jfc2V0X2RlYnVnKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGVuYWJsZV9kZWJ1Zyk7Cit2b2lkIGRybV9pbnRlbF9idWZtZ3JfZGVzdHJveShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOworaW50IGRybV9pbnRlbF9ib19leGVjKGRybV9pbnRlbF9ibyAqYm8sIGludCB1c2VkLAorCQkgICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCk7CitpbnQgZHJtX2ludGVsX2JvX21yYl9leGVjKGRybV9pbnRlbF9ibyAqYm8sIGludCB1c2VkLAorCQkJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsIGludCBEUjQsCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpOworaW50IGRybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoZHJtX2ludGVsX2JvICoqIGJvX2FycmF5LCBpbnQgY291bnQpOworCitpbnQgZHJtX2ludGVsX2JvX2VtaXRfcmVsb2MoZHJtX2ludGVsX2JvICpibywgdWludDMyX3Qgb2Zmc2V0LAorCQkJICAgIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvLCB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkJICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKTsKK2ludCBkcm1faW50ZWxfYm9fZW1pdF9yZWxvY19mZW5jZShkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCisJCQkJICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywKKwkJCQkgIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCisJCQkJICB1aW50MzJfdCByZWFkX2RvbWFpbnMsIHVpbnQzMl90IHdyaXRlX2RvbWFpbik7CitpbnQgZHJtX2ludGVsX2JvX3Bpbihkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBhbGlnbm1lbnQpOworaW50IGRybV9pbnRlbF9ib191bnBpbihkcm1faW50ZWxfYm8gKmJvKTsKK2ludCBkcm1faW50ZWxfYm9fc2V0X3RpbGluZyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAorCQkJICAgIHVpbnQzMl90IHN0cmlkZSk7CitpbnQgZHJtX2ludGVsX2JvX2dldF90aWxpbmcoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiB0aWxpbmdfbW9kZSwKKwkJCSAgICB1aW50MzJfdCAqIHN3aXp6bGVfbW9kZSk7CitpbnQgZHJtX2ludGVsX2JvX2ZsaW5rKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogbmFtZSk7CitpbnQgZHJtX2ludGVsX2JvX2J1c3koZHJtX2ludGVsX2JvICpibyk7CitpbnQgZHJtX2ludGVsX2JvX21hZHZpc2UoZHJtX2ludGVsX2JvICpibywgaW50IG1hZHYpOworCitpbnQgZHJtX2ludGVsX2JvX2Rpc2FibGVfcmV1c2UoZHJtX2ludGVsX2JvICpibyk7CitpbnQgZHJtX2ludGVsX2JvX2lzX3JldXNhYmxlKGRybV9pbnRlbF9ibyAqYm8pOworaW50IGRybV9pbnRlbF9ib19yZWZlcmVuY2VzKGRybV9pbnRlbF9ibyAqYm8sIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvKTsKKworLyogZHJtX2ludGVsX2J1Zm1ncl9nZW0uYyAqLworZHJtX2ludGVsX2J1Zm1nciAqZHJtX2ludGVsX2J1Zm1ncl9nZW1faW5pdChpbnQgZmQsIGludCBiYXRjaF9zaXplKTsKK2RybV9pbnRlbF9ibyAqZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9uYW1lKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQl1bnNpZ25lZCBpbnQgaGFuZGxlKTsKK3ZvaWQgZHJtX2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3JldXNlKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncik7Cit2b2lkIGRybV9pbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9mZW5jZWRfcmVsb2NzKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncik7Cit2b2lkIGRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF92bWFfY2FjaGVfc2l6ZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCSAgICAgaW50IGxpbWl0KTsKK2ludCBkcm1faW50ZWxfZ2VtX2JvX21hcF91bnN5bmNocm9uaXplZChkcm1faW50ZWxfYm8gKmJvKTsKK2ludCBkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoZHJtX2ludGVsX2JvICpibyk7CitpbnQgZHJtX2ludGVsX2dlbV9ib191bm1hcF9ndHQoZHJtX2ludGVsX2JvICpibyk7CisKK2ludCBkcm1faW50ZWxfZ2VtX2JvX21hcF91bnN5bmNocm9uaXplZF9ub25fZ3R0KGRybV9pbnRlbF9ibyAqYm8pOworCitpbnQgZHJtX2ludGVsX2dlbV9ib19nZXRfcmVsb2NfY291bnQoZHJtX2ludGVsX2JvICpibyk7Cit2b2lkIGRybV9pbnRlbF9nZW1fYm9fY2xlYXJfcmVsb2NzKGRybV9pbnRlbF9ibyAqYm8sIGludCBzdGFydCk7Cit2b2lkIGRybV9pbnRlbF9nZW1fYm9fc3RhcnRfZ3R0X2FjY2Vzcyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgd3JpdGVfZW5hYmxlKTsKKwordm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9maWxlbmFtZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2R1bXAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgZW5hYmxlKTsKK3ZvaWQgZHJtX2ludGVsX2dlbV9ib19hdWJfZHVtcF9ibXAoZHJtX2ludGVsX2JvICpibywKKwkJCQkgICBpbnQgeDEsIGludCB5MSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgIGVudW0gYXViX2R1bXBfYm1wX2Zvcm1hdCBmb3JtYXQsCisJCQkJICAgaW50IHBpdGNoLCBpbnQgb2Zmc2V0KTsKK3ZvaWQKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfYW5ub3RhdGlvbnMoZHJtX2ludGVsX2JvICpibywKKwkJCQkJIGRybV9pbnRlbF9hdWJfYW5ub3RhdGlvbiAqYW5ub3RhdGlvbnMsCisJCQkJCSB1bnNpZ25lZCBjb3VudCk7CisKK2ludCBkcm1faW50ZWxfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGNydGNfaWQpOworCitpbnQgZHJtX2ludGVsX2dldF9hcGVydHVyZV9zaXplcyhpbnQgZmQsIHNpemVfdCAqbWFwcGFibGUsIHNpemVfdCAqdG90YWwpOworaW50IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2dldF9kZXZpZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOworaW50IGRybV9pbnRlbF9nZW1fYm9fd2FpdChkcm1faW50ZWxfYm8gKmJvLCBpbnQ2NF90IHRpbWVvdXRfbnMpOworCitkcm1faW50ZWxfY29udGV4dCAqZHJtX2ludGVsX2dlbV9jb250ZXh0X2NyZWF0ZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOwordm9pZCBkcm1faW50ZWxfZ2VtX2NvbnRleHRfZGVzdHJveShkcm1faW50ZWxfY29udGV4dCAqY3R4KTsKK2ludCBkcm1faW50ZWxfZ2VtX2JvX2NvbnRleHRfZXhlYyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfY29udGV4dCAqY3R4LAorCQkJCSAgaW50IHVzZWQsIHVuc2lnbmVkIGludCBmbGFncyk7CisKK2ludCBkcm1faW50ZWxfYm9fZ2VtX2V4cG9ydF90b19wcmltZShkcm1faW50ZWxfYm8gKmJvLCBpbnQgKnByaW1lX2ZkKTsKK2RybV9pbnRlbF9ibyAqZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9wcmltZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCQlpbnQgcHJpbWVfZmQsIGludCBzaXplKTsKKworLyogZHJtX2ludGVsX2J1Zm1ncl9mYWtlLmMgKi8KK2RybV9pbnRlbF9idWZtZ3IgKmRybV9pbnRlbF9idWZtZ3JfZmFrZV9pbml0KGludCBmZCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGxvd19vZmZzZXQsCisJCQkJCSAgICAgdm9pZCAqbG93X3ZpcnR1YWwsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludAorCQkJCQkgICAgICpsYXN0X2Rpc3BhdGNoKTsKK3ZvaWQgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3NldF9sYXN0X2Rpc3BhdGNoKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJICAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQKKwkJCQkJICAgICAqbGFzdF9kaXNwYXRjaCk7Cit2b2lkIGRybV9pbnRlbF9idWZtZ3JfZmFrZV9zZXRfZXhlY19jYWxsYmFjayhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCSAgICAgaW50ICgqZXhlYykgKGRybV9pbnRlbF9ibyAqYm8sCisJCQkJCQkJICB1bnNpZ25lZCBpbnQgdXNlZCwKKwkJCQkJCQkgIHZvaWQgKnByaXYpLAorCQkJCQkgICAgIHZvaWQgKnByaXYpOwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2ZlbmNlX2NhbGxiYWNrKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50ICgqZW1pdCkgKHZvaWQgKnByaXYpLAorCQkJCQkgICAgICB2b2lkICgqd2FpdCkgKHVuc2lnbmVkIGludCBmZW5jZSwKKwkJCQkJCQkgICAgdm9pZCAqcHJpdiksCisJCQkJCSAgICAgIHZvaWQgKnByaXYpOworZHJtX2ludGVsX2JvICpkcm1faW50ZWxfYm9fZmFrZV9hbGxvY19zdGF0aWMoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICp2aXJ0KTsKK3ZvaWQgZHJtX2ludGVsX2JvX2Zha2VfZGlzYWJsZV9iYWNraW5nX3N0b3JlKGRybV9pbnRlbF9ibyAqYm8sCisJCQkJCSAgICAgdm9pZCAoKmludmFsaWRhdGVfY2IpIChkcm1faW50ZWxfYm8KKwkJCQkJCQkJICAgICogYm8sCisJCQkJCQkJCSAgICB2b2lkICpwdHIpLAorCQkJCQkgICAgIHZvaWQgKnB0cik7CisKK3ZvaWQgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2NvbnRlbmRlZF9sb2NrX3Rha2UoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKTsKK3ZvaWQgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2V2aWN0X2FsbChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOworCitzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqZHJtX2ludGVsX2RlY29kZV9jb250ZXh0X2FsbG9jKHVpbnQzMl90IGRldmlkKTsKK3ZvaWQgZHJtX2ludGVsX2RlY29kZV9jb250ZXh0X2ZyZWUoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCk7Cit2b2lkIGRybV9pbnRlbF9kZWNvZGVfc2V0X2JhdGNoX3BvaW50ZXIoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJCQkJdm9pZCAqZGF0YSwgdWludDMyX3QgaHdfb2Zmc2V0LAorCQkJCQlpbnQgY291bnQpOwordm9pZCBkcm1faW50ZWxfZGVjb2RlX3NldF9kdW1wX3Bhc3RfZW5kKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsCisJCQkJCWludCBkdW1wX3Bhc3RfZW5kKTsKK3ZvaWQgZHJtX2ludGVsX2RlY29kZV9zZXRfaGVhZF90YWlsKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsCisJCQkJICAgIHVpbnQzMl90IGhlYWQsIHVpbnQzMl90IHRhaWwpOwordm9pZCBkcm1faW50ZWxfZGVjb2RlX3NldF9vdXRwdXRfZmlsZShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCBGSUxFICpvdXQpOwordm9pZCBkcm1faW50ZWxfZGVjb2RlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpOworCitpbnQgZHJtX2ludGVsX3JlZ19yZWFkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJICAgICAgIHVpbnQzMl90IG9mZnNldCwKKwkJICAgICAgIHVpbnQ2NF90ICpyZXN1bHQpOworCitpbnQgZHJtX2ludGVsX2dldF9yZXNldF9zdGF0cyhkcm1faW50ZWxfY29udGV4dCAqY3R4LAorCQkJICAgICAgdWludDMyX3QgKnJlc2V0X2NvdW50LAorCQkJICAgICAgdWludDMyX3QgKmFjdGl2ZSwKKwkJCSAgICAgIHVpbnQzMl90ICpwZW5kaW5nKTsKKworaW50IGRybV9pbnRlbF9nZXRfc3Vic2xpY2VfdG90YWwoaW50IGZkLCB1bnNpZ25lZCBpbnQgKnN1YnNsaWNlX3RvdGFsKTsKK2ludCBkcm1faW50ZWxfZ2V0X2V1X3RvdGFsKGludCBmZCwgdW5zaWduZWQgaW50ICpldV90b3RhbCk7CisKKy8qKiBAeyBDb21wYXRpYmlsaXR5IGRlZmluZXMgdG8ga2VlcCBvbGQgY29kZSBidWlsZGluZyBkZXNwaXRlIHRoZSBzeW1ib2wgcmVuYW1lCisgKiBmcm9tIGRyaV8qIHRvIGRybV9pbnRlbF8qCisgKi8KKyNkZWZpbmUgZHJpX2JvIGRybV9pbnRlbF9ibworI2RlZmluZSBkcmlfYnVmbWdyIGRybV9pbnRlbF9idWZtZ3IKKyNkZWZpbmUgZHJpX2JvX2FsbG9jIGRybV9pbnRlbF9ib19hbGxvYworI2RlZmluZSBkcmlfYm9fcmVmZXJlbmNlIGRybV9pbnRlbF9ib19yZWZlcmVuY2UKKyNkZWZpbmUgZHJpX2JvX3VucmVmZXJlbmNlIGRybV9pbnRlbF9ib191bnJlZmVyZW5jZQorI2RlZmluZSBkcmlfYm9fbWFwIGRybV9pbnRlbF9ib19tYXAKKyNkZWZpbmUgZHJpX2JvX3VubWFwIGRybV9pbnRlbF9ib191bm1hcAorI2RlZmluZSBkcmlfYm9fc3ViZGF0YSBkcm1faW50ZWxfYm9fc3ViZGF0YQorI2RlZmluZSBkcmlfYm9fZ2V0X3N1YmRhdGEgZHJtX2ludGVsX2JvX2dldF9zdWJkYXRhCisjZGVmaW5lIGRyaV9ib193YWl0X3JlbmRlcmluZyBkcm1faW50ZWxfYm9fd2FpdF9yZW5kZXJpbmcKKyNkZWZpbmUgZHJpX2J1Zm1ncl9zZXRfZGVidWcgZHJtX2ludGVsX2J1Zm1ncl9zZXRfZGVidWcKKyNkZWZpbmUgZHJpX2J1Zm1ncl9kZXN0cm95IGRybV9pbnRlbF9idWZtZ3JfZGVzdHJveQorI2RlZmluZSBkcmlfYm9fZXhlYyBkcm1faW50ZWxfYm9fZXhlYworI2RlZmluZSBkcmlfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlIGRybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UKKyNkZWZpbmUgZHJpX2JvX2VtaXRfcmVsb2MocmVsb2NfYm8sIHJlYWQsIHdyaXRlLCB0YXJnZXRfb2Zmc2V0LAkJXAorCQkJICByZWxvY19vZmZzZXQsIHRhcmdldF9ibykJCQlcCisJZHJtX2ludGVsX2JvX2VtaXRfcmVsb2MocmVsb2NfYm8sIHJlbG9jX29mZnNldCwJCQlcCisJCQkJdGFyZ2V0X2JvLCB0YXJnZXRfb2Zmc2V0LAkJXAorCQkJCXJlYWQsIHdyaXRlKTsKKyNkZWZpbmUgZHJpX2JvX3BpbiBkcm1faW50ZWxfYm9fcGluCisjZGVmaW5lIGRyaV9ib191bnBpbiBkcm1faW50ZWxfYm9fdW5waW4KKyNkZWZpbmUgZHJpX2JvX2dldF90aWxpbmcgZHJtX2ludGVsX2JvX2dldF90aWxpbmcKKyNkZWZpbmUgZHJpX2JvX3NldF90aWxpbmcoYm8sIG1vZGUpIGRybV9pbnRlbF9ib19zZXRfdGlsaW5nKGJvLCBtb2RlLCAwKQorI2RlZmluZSBkcmlfYm9fZmxpbmsgZHJtX2ludGVsX2JvX2ZsaW5rCisjZGVmaW5lIGludGVsX2J1Zm1ncl9nZW1faW5pdCBkcm1faW50ZWxfYnVmbWdyX2dlbV9pbml0CisjZGVmaW5lIGludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9uYW1lIGRybV9pbnRlbF9ib19nZW1fY3JlYXRlX2Zyb21fbmFtZQorI2RlZmluZSBpbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9yZXVzZSBkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfcmV1c2UKKyNkZWZpbmUgaW50ZWxfYnVmbWdyX2Zha2VfaW5pdCBkcm1faW50ZWxfYnVmbWdyX2Zha2VfaW5pdAorI2RlZmluZSBpbnRlbF9idWZtZ3JfZmFrZV9zZXRfbGFzdF9kaXNwYXRjaCBkcm1faW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2xhc3RfZGlzcGF0Y2gKKyNkZWZpbmUgaW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2V4ZWNfY2FsbGJhY2sgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3NldF9leGVjX2NhbGxiYWNrCisjZGVmaW5lIGludGVsX2J1Zm1ncl9mYWtlX3NldF9mZW5jZV9jYWxsYmFjayBkcm1faW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2ZlbmNlX2NhbGxiYWNrCisjZGVmaW5lIGludGVsX2JvX2Zha2VfYWxsb2Nfc3RhdGljIGRybV9pbnRlbF9ib19mYWtlX2FsbG9jX3N0YXRpYworI2RlZmluZSBpbnRlbF9ib19mYWtlX2Rpc2FibGVfYmFja2luZ19zdG9yZSBkcm1faW50ZWxfYm9fZmFrZV9kaXNhYmxlX2JhY2tpbmdfc3RvcmUKKyNkZWZpbmUgaW50ZWxfYnVmbWdyX2Zha2VfY29udGVuZGVkX2xvY2tfdGFrZSBkcm1faW50ZWxfYnVmbWdyX2Zha2VfY29udGVuZGVkX2xvY2tfdGFrZQorI2RlZmluZSBpbnRlbF9idWZtZ3JfZmFrZV9ldmljdF9hbGwgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2V2aWN0X2FsbAorCisvKiogQHsgKi8KKworI2VuZGlmIC8qIElOVEVMX0JVRk1HUl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3JfZ2VtLmMgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3JfZ2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0MzIyNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2ludGVsL2ludGVsX2J1Zm1ncl9nZW0uYwpAQCAtMCwwICsxLDM3NDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCCpIDIwMDcgUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgqSAyMDA3LTIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQXV0aG9yczogVGhvbWFzIEhlbGxzdHL2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KKyAqICAgICAgICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHctYXQtdHVuZ3N0ZW5ncmFwaGljcy1kb3QtY29tPgorICoJICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgkgICAgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHhmODZhdG9taWMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSAiZXJybm8uaCIKKyNpZm5kZWYgRVRJTUUKKyNkZWZpbmUgRVRJTUUgRVRJTUVET1VUCisjZW5kaWYKKyNpbmNsdWRlICJsaWJkcm0uaCIKKyNpbmNsdWRlICJsaWJkcm1fbGlzdHMuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3JfcHJpdi5oIgorI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKKyNpbmNsdWRlICJpbnRlbF9hdWIuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKworI2luY2x1ZGUgImk5MTVfZHJtLmgiCisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisjaW5jbHVkZSA8dmFsZ3JpbmQuaD4KKyNpbmNsdWRlIDxtZW1jaGVjay5oPgorI2RlZmluZSBWRyh4KSB4CisjZWxzZQorI2RlZmluZSBWRyh4KQorI2VuZGlmCisKKyNkZWZpbmUgbWVtY2xlYXIocykgbWVtc2V0KCZzLCAwLCBzaXplb2YocykpCisKKyNkZWZpbmUgREJHKC4uLikgZG8gewkJCQkJXAorCWlmIChidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcpCQkJXAorCQlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9ib19nZW0gZHJtX2ludGVsX2JvX2dlbTsKKworc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0IHsKKwlkcm1NTUxpc3RIZWFkIGhlYWQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9idWZtZ3JfZ2VtIHsKKwlkcm1faW50ZWxfYnVmbWdyIGJ1Zm1ncjsKKworCWF0b21pY190IHJlZmNvdW50OworCisJaW50IGZkOworCisJaW50IG1heF9yZWxvY3M7CisKKwlwdGhyZWFkX211dGV4X3QgbG9jazsKKworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QgKmV4ZWNfb2JqZWN0czsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlYzJfb2JqZWN0czsKKwlkcm1faW50ZWxfYm8gKipleGVjX2JvczsKKwlpbnQgZXhlY19zaXplOworCWludCBleGVjX2NvdW50OworCisJLyoqIEFycmF5IG9mIGxpc3RzIG9mIGNhY2hlZCBnZW0gb2JqZWN0cyBvZiBwb3dlci1vZi10d28gc2l6ZXMgKi8KKwlzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgY2FjaGVfYnVja2V0WzE0ICogNF07CisJaW50IG51bV9idWNrZXRzOworCXRpbWVfdCB0aW1lOworCisJZHJtTU1MaXN0SGVhZCBtYW5hZ2VyczsKKworCWRybU1NTGlzdEhlYWQgbmFtZWQ7CisJZHJtTU1MaXN0SGVhZCB2bWFfY2FjaGU7CisJaW50IHZtYV9jb3VudCwgdm1hX29wZW4sIHZtYV9tYXg7CisKKwl1aW50NjRfdCBndHRfc2l6ZTsKKwlpbnQgYXZhaWxhYmxlX2ZlbmNlczsKKwlpbnQgcGNpX2RldmljZTsKKwlpbnQgZ2VuOworCXVuc2lnbmVkIGludCBoYXNfYnNkIDogMTsKKwl1bnNpZ25lZCBpbnQgaGFzX2JsdCA6IDE7CisJdW5zaWduZWQgaW50IGhhc19yZWxheGVkX2ZlbmNpbmcgOiAxOworCXVuc2lnbmVkIGludCBoYXNfbGxjIDogMTsKKwl1bnNpZ25lZCBpbnQgaGFzX3dhaXRfdGltZW91dCA6IDE7CisJdW5zaWduZWQgaW50IGJvX3JldXNlIDogMTsKKwl1bnNpZ25lZCBpbnQgbm9fZXhlYyA6IDE7CisJdW5zaWduZWQgaW50IGhhc192ZWJveCA6IDE7CisJYm9vbCBmZW5jZWRfcmVsb2NzOworCisJY2hhciAqYXViX2ZpbGVuYW1lOworCUZJTEUgKmF1Yl9maWxlOworCXVpbnQzMl90IGF1Yl9vZmZzZXQ7Cit9IGRybV9pbnRlbF9idWZtZ3JfZ2VtOworCisjZGVmaW5lIERSTV9JTlRFTF9SRUxPQ19GRU5DRSAoMTw8MCkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9yZWxvY190YXJnZXRfaW5mbyB7CisJZHJtX2ludGVsX2JvICpibzsKKwlpbnQgZmxhZ3M7Cit9IGRybV9pbnRlbF9yZWxvY190YXJnZXQ7CisKK3N0cnVjdCBfZHJtX2ludGVsX2JvX2dlbSB7CisJZHJtX2ludGVsX2JvIGJvOworCisJYXRvbWljX3QgcmVmY291bnQ7CisJdWludDMyX3QgZ2VtX2hhbmRsZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyoqCisJICogS2VuZWwtYXNzaWduZWQgZ2xvYmFsIG5hbWUgZm9yIHRoaXMgb2JqZWN0CisgICAgICAgICAqCisgICAgICAgICAqIExpc3QgY29udGFpbnMgYm90aCBmbGluayBuYW1lZCBhbmQgcHJpbWUgZmQnZCBvYmplY3RzCisJICovCisJdW5zaWduZWQgaW50IGdsb2JhbF9uYW1lOworCWRybU1NTGlzdEhlYWQgbmFtZV9saXN0OworCisJLyoqCisJICogSW5kZXggb2YgdGhlIGJ1ZmZlciB3aXRoaW4gdGhlIHZhbGlkYXRpb24gbGlzdCB3aGlsZSBwcmVwYXJpbmcgYQorCSAqIGJhdGNoYnVmZmVyIGV4ZWN1dGlvbi4KKwkgKi8KKwlpbnQgdmFsaWRhdGVfaW5kZXg7CisKKwkvKioKKwkgKiBDdXJyZW50IHRpbGluZyBtb2RlCisJICovCisJdWludDMyX3QgdGlsaW5nX21vZGU7CisJdWludDMyX3Qgc3dpenpsZV9tb2RlOworCXVuc2lnbmVkIGxvbmcgc3RyaWRlOworCisJdGltZV90IGZyZWVfdGltZTsKKworCS8qKiBBcnJheSBwYXNzZWQgdG8gdGhlIERSTSBjb250YWluaW5nIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uICovCisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5ICpyZWxvY3M7CisJLyoqCisJICogQXJyYXkgb2YgaW5mbyBzdHJ1Y3RzIGNvcnJlc3BvbmRpbmcgdG8gcmVsb2NzW2ldLnRhcmdldF9oYW5kbGUgZXRjCisJICovCisJZHJtX2ludGVsX3JlbG9jX3RhcmdldCAqcmVsb2NfdGFyZ2V0X2luZm87CisJLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHJlbG9jcyAqLworCWludCByZWxvY19jb3VudDsKKwkvKiogTWFwcGVkIGFkZHJlc3MgZm9yIHRoZSBidWZmZXIsIHNhdmVkIGFjcm9zcyBtYXAvdW5tYXAgY3ljbGVzICovCisJdm9pZCAqbWVtX3ZpcnR1YWw7CisJLyoqIEdUVCB2aXJ0dWFsIGFkZHJlc3MgZm9yIHRoZSBidWZmZXIsIHNhdmVkIGFjcm9zcyBtYXAvdW5tYXAgY3ljbGVzICovCisJdm9pZCAqZ3R0X3ZpcnR1YWw7CisJLyoqCisJICogVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5IHVzZXIsIHVzZWQgZm9yIHVzZXJwdHIKKwkgKiBvYmplY3RzIG9ubHkuCisJICovCisJdm9pZCAqdXNlcl92aXJ0dWFsOworCWludCBtYXBfY291bnQ7CisJZHJtTU1MaXN0SGVhZCB2bWFfbGlzdDsKKworCS8qKiBCTyBjYWNoZSBsaXN0ICovCisJZHJtTU1MaXN0SGVhZCBoZWFkOworCisJLyoqCisJICogQm9vbGVhbiBvZiB3aGV0aGVyIHRoaXMgQk8gYW5kIGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gaW5jbHVkZWQgaW4KKwkgKiB0aGUgY3VycmVudCBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgdG90YWwuCisJICovCisJYm9vbCBpbmNsdWRlZF9pbl9jaGVja19hcGVydHVyZTsKKworCS8qKgorCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIGJ1ZmZlciBoYXMgYmVlbiB1c2VkIGFzIGEgcmVsb2NhdGlvbgorCSAqIHRhcmdldCBhbmQgaGFkIGl0cyBzaXplIGFjY291bnRlZCBmb3IsIGFuZCB0aHVzIGNhbid0IGhhdmUgYW55CisJICogZnVydGhlciByZWxvY2F0aW9ucyBhZGRlZCB0byBpdC4KKwkgKi8KKwlib29sIHVzZWRfYXNfcmVsb2NfdGFyZ2V0OworCisJLyoqCisJICogQm9vbGVhbiBvZiB3aGV0aGVyIHdlIGhhdmUgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hpbHN0IGJ1aWxkaW5nIHRoZSByZWxvY2F0aW9uIHRyZWUuCisJICovCisJYm9vbCBoYXNfZXJyb3I7CisKKwkvKioKKwkgKiBCb29sZWFuIG9mIHdoZXRoZXIgdGhpcyBidWZmZXIgY2FuIGJlIHJlLXVzZWQKKwkgKi8KKwlib29sIHJldXNhYmxlOworCisJLyoqCisJICogQm9vbGVhbiBvZiB3aGV0aGVyIHRoZSBHUFUgaXMgZGVmaW5pdGVseSBub3QgYWNjZXNzaW5nIHRoZSBidWZmZXIuCisJICoKKwkgKiBUaGlzIGlzIG9ubHkgdmFsaWQgd2hlbiByZXVzYWJsZSwgc2luY2Ugbm9uLXJldXNhYmxlCisJICogYnVmZmVycyBhcmUgdGhvc2UgdGhhdCBoYXZlIGJlZW4gc2hhcmVkIHd0aCBvdGhlcgorCSAqIHByb2Nlc3Nlcywgc28gd2UgZG9uJ3Qga25vdyB0aGVpciBzdGF0ZS4KKwkgKi8KKwlib29sIGlkbGU7CisKKwkvKioKKwkgKiBCb29sZWFuIG9mIHdoZXRoZXIgdGhpcyBidWZmZXIgd2FzIGFsbG9jYXRlZCB3aXRoIHVzZXJwdHIKKwkgKi8KKwlib29sIGlzX3VzZXJwdHI7CisKKwkvKioKKwkgKiBTaXplIGluIGJ5dGVzIG9mIHRoaXMgYnVmZmVyIGFuZCBpdHMgcmVsb2NhdGlvbiBkZXNjZW5kZW50cy4KKwkgKgorCSAqIFVzZWQgdG8gYXZvaWQgY29zdGx5IHRyZWUgd2Fsa2luZyBpbgorCSAqIGRybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmUgaW4gdGhlIGNvbW1vbiBjYXNlLgorCSAqLworCWludCByZWxvY190cmVlX3NpemU7CisKKwkvKioKKwkgKiBOdW1iZXIgb2YgcG90ZW50aWFsIGZlbmNlIHJlZ2lzdGVycyByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBhbmQgaXRzCisJICogcmVsb2NhdGlvbnMuCisJICovCisJaW50IHJlbG9jX3RyZWVfZmVuY2VzOworCisJLyoqIEZsYWdzIHRoYXQgd2UgbWF5IG5lZWQgdG8gZG8gdGhlIFNXX0ZJTlNJSCBpb2N0bCBvbiB1bm1hcC4gKi8KKwlib29sIG1hcHBlZF9jcHVfd3JpdGU7CisKKwl1aW50MzJfdCBhdWJfb2Zmc2V0OworCisJZHJtX2ludGVsX2F1Yl9hbm5vdGF0aW9uICphdWJfYW5ub3RhdGlvbnM7CisJdW5zaWduZWQgYXViX2Fubm90YXRpb25fY291bnQ7Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50Citkcm1faW50ZWxfZ2VtX2VzdGltYXRlX2JhdGNoX3NwYWNlKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KTsKKworc3RhdGljIHVuc2lnbmVkIGludAorZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KTsKKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19nZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCisJCQkgICAgdWludDMyX3QgKiBzd2l6emxlX21vZGUpOworCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoZHJtX2ludGVsX2JvICpibywKKwkJCQkgICAgIHVpbnQzMl90IHRpbGluZ19tb2RlLAorCQkJCSAgICAgdWludDMyX3Qgc3RyaWRlKTsKKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9sb2NrZWRfdGltZWQoZHJtX2ludGVsX2JvICpibywKKwkJCQkJCSAgICAgIHRpbWVfdCB0aW1lKTsKKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKTsKKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19mcmVlKGRybV9pbnRlbF9ibyAqYm8pOworCitzdGF0aWMgdW5zaWduZWQgbG9uZworZHJtX2ludGVsX2dlbV9ib190aWxlX3NpemUoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgIHVpbnQzMl90ICp0aWxpbmdfbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbl9zaXplLCBtYXhfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJCXJldHVybiBzaXplOworCisJLyogOTY1KyBqdXN0IG5lZWQgbXVsdGlwbGVzIG9mIHBhZ2Ugc2l6ZSBmb3IgdGlsaW5nICovCisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA0KQorCQlyZXR1cm4gUk9VTkRfVVBfVE8oc2l6ZSwgNDA5Nik7CisKKwkvKiBPbGRlciBjaGlwcyBuZWVkIHBvd2VycyBvZiB0d28sIG9mIGF0IGxlYXN0IDUxMmsgb3IgMU0gKi8KKwlpZiAoYnVmbWdyX2dlbS0+Z2VuID09IDMpIHsKKwkJbWluX3NpemUgPSAxMDI0KjEwMjQ7CisJCW1heF9zaXplID0gMTI4KjEwMjQqMTAyNDsKKwl9IGVsc2UgeworCQltaW5fc2l6ZSA9IDUxMioxMDI0OworCQltYXhfc2l6ZSA9IDY0KjEwMjQqMTAyNDsKKwl9CisKKwlpZiAoc2l6ZSA+IG1heF9zaXplKSB7CisJCSp0aWxpbmdfbW9kZSA9IEk5MTVfVElMSU5HX05PTkU7CisJCXJldHVybiBzaXplOworCX0KKworCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgZXZlcnkgcGFnZSBmb3IgdGhlIGZlbmNlPyAqLworCWlmIChidWZtZ3JfZ2VtLT5oYXNfcmVsYXhlZF9mZW5jaW5nKQorCQlyZXR1cm4gUk9VTkRfVVBfVE8oc2l6ZSwgNDA5Nik7CisKKwlmb3IgKGkgPSBtaW5fc2l6ZTsgaSA8IHNpemU7IGkgPDw9IDEpCisJCTsKKworCXJldHVybiBpOworfQorCisvKgorICogUm91bmQgYSBnaXZlbiBwaXRjaCB1cCB0byB0aGUgbWluaW11bSByZXF1aXJlZCBmb3IgWCB0aWxpbmcgb24gYQorICogZ2l2ZW4gY2hpcC4gIFdlIHVzZSA1MTIgYXMgdGhlIG1pbmltdW0gdG8gYWxsb3cgZm9yIGEgbGF0ZXIgdGlsaW5nCisgKiBjaGFuZ2UuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitkcm1faW50ZWxfZ2VtX2JvX3RpbGVfcGl0Y2goZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCisJCQkgICAgdW5zaWduZWQgbG9uZyBwaXRjaCwgdWludDMyX3QgKnRpbGluZ19tb2RlKQoreworCXVuc2lnbmVkIGxvbmcgdGlsZV93aWR0aDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwkvKiBJZiB1bnRpbGVkLCB0aGVuIGp1c3QgYWxpZ24gaXQgc28gdGhhdCB3ZSBjYW4gZG8gcmVuZGVyaW5nCisJICogdG8gaXQgd2l0aCB0aGUgM0QgZW5naW5lLgorCSAqLworCWlmICgqdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJcmV0dXJuIEFMSUdOKHBpdGNoLCA2NCk7CisKKwlpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1gKKwkJCXx8IChJU185MTUoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkKKwkJCSAgICAmJiAqdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSkpCisJCXRpbGVfd2lkdGggPSA1MTI7CisJZWxzZQorCQl0aWxlX3dpZHRoID0gMTI4OworCisJLyogOTY1IGlzIGZsZXhpYmxlICovCisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA0KQorCQlyZXR1cm4gUk9VTkRfVVBfVE8ocGl0Y2gsIHRpbGVfd2lkdGgpOworCisJLyogVGhlIG9sZGVyIGhhcmR3YXJlIGhhcyBhIG1heGltdW0gcGl0Y2ggb2YgODE5MiB3aXRoIHRpbGVkCisJICogc3VyZmFjZXMsIHNvIGZhbGxiYWNrIHRvIHVudGlsZWQgaWYgaXQncyB0b28gbGFyZ2UuCisJICovCisJaWYgKHBpdGNoID4gODE5MikgeworCQkqdGlsaW5nX21vZGUgPSBJOTE1X1RJTElOR19OT05FOworCQlyZXR1cm4gQUxJR04ocGl0Y2gsIDY0KTsKKwl9CisKKwkvKiBQcmUtOTY1IG5lZWRzIHBvd2VyIG9mIHR3byB0aWxlIHdpZHRoICovCisJZm9yIChpID0gdGlsZV93aWR0aDsgaSA8IHBpdGNoOyBpIDw8PSAxKQorCQk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqCitkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldF9mb3Jfc2l6ZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzOyBpKyspIHsKKwkJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQgPQorCQkgICAgJmJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXTsKKwkJaWYgKGJ1Y2tldC0+c2l6ZSA+PSBzaXplKSB7CisJCQlyZXR1cm4gYnVja2V0OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZ2VtX2R1bXBfdmFsaWRhdGlvbl9saXN0KGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm8gKmJvID0gYnVmbWdyX2dlbS0+ZXhlY19ib3NbaV07CisJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJCWlmIChib19nZW0tPnJlbG9jcyA9PSBOVUxMKSB7CisJCQlEQkcoIiUyZDogJWQgKCVzKVxuIiwgaSwgYm9fZ2VtLT5nZW1faGFuZGxlLAorCQkJICAgIGJvX2dlbS0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBib19nZW0tPnJlbG9jX2NvdW50OyBqKyspIHsKKwkJCWRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvID0gYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tqXS5ibzsKKwkJCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9nZW0gPQorCQkJICAgIChkcm1faW50ZWxfYm9fZ2VtICopIHRhcmdldF9ibzsKKworCQkJREJHKCIlMmQ6ICVkICglcylAMHglMDhsbHggLT4gIgorCQkJICAgICIlZCAoJXMpQDB4JTA4bHggKyAweCUwOHhcbiIsCisJCQkgICAgaSwKKwkJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJvX2dlbS0+cmVsb2NzW2pdLm9mZnNldCwKKwkJCSAgICB0YXJnZXRfZ2VtLT5nZW1faGFuZGxlLAorCQkJICAgIHRhcmdldF9nZW0tPm5hbWUsCisJCQkgICAgdGFyZ2V0X2JvLT5vZmZzZXQ2NCwKKwkJCSAgICBib19nZW0tPnJlbG9jc1tqXS5kZWx0YSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKworCWF0b21pY19pbmMoJmJvX2dlbS0+cmVmY291bnQpOworfQorCisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzIHRvIGJlIHZhbGlkYXRlZCAobW92ZWQgaW50byB0aGUKKyAqIGFwcHJvcHJpYXRlIG1lbW9yeSB0eXBlKSB3aXRoIHRoZSBuZXh0IGJhdGNoIHN1Ym1pc3Npb24uCisgKgorICogSWYgYSBidWZmZXIgaXMgdmFsaWRhdGVkIG11bHRpcGxlIHRpbWVzIGluIGEgYmF0Y2ggc3VibWlzc2lvbiwgaXQgZW5kcyB1cAorICogd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBtZW1vcnkgdHlwZSBmbGFncyBhbmQgdGhlIHVuaW9uIG9mIHRoZQorICogYWNjZXNzIGZsYWdzLgorICovCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2FkZF92YWxpZGF0ZV9idWZmZXIoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCBpbmRleDsKKworCWlmIChib19nZW0tPnZhbGlkYXRlX2luZGV4ICE9IC0xKQorCQlyZXR1cm47CisKKwkvKiBFeHRlbmQgdGhlIGFycmF5IG9mIHZhbGlkYXRpb24gZW50cmllcyBhcyBuZWNlc3NhcnkuICovCisJaWYgKGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQgPT0gYnVmbWdyX2dlbS0+ZXhlY19zaXplKSB7CisJCWludCBuZXdfc2l6ZSA9IGJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSAqIDI7CisKKwkJaWYgKG5ld19zaXplID09IDApCisJCQluZXdfc2l6ZSA9IDU7CisKKwkJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzID0KKwkJICAgIHJlYWxsb2MoYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzLAorCQkJICAgIHNpemVvZigqYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzKSAqIG5ld19zaXplKTsKKwkJYnVmbWdyX2dlbS0+ZXhlY19ib3MgPQorCQkgICAgcmVhbGxvYyhidWZtZ3JfZ2VtLT5leGVjX2JvcywKKwkJCSAgICBzaXplb2YoKmJ1Zm1ncl9nZW0tPmV4ZWNfYm9zKSAqIG5ld19zaXplKTsKKwkJYnVmbWdyX2dlbS0+ZXhlY19zaXplID0gbmV3X3NpemU7CisJfQorCisJaW5kZXggPSBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OworCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSBpbmRleDsKKwkvKiBGaWxsIGluIGFycmF5IGVudHJ5ICovCisJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5yZWxvY2F0aW9uX2NvdW50ID0gYm9fZ2VtLT5yZWxvY19jb3VudDsKKwlidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaW5kZXhdLnJlbG9jc19wdHIgPSAodWludHB0cl90KSBib19nZW0tPnJlbG9jczsKKwlidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaW5kZXhdLmFsaWdubWVudCA9IDA7CisJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5vZmZzZXQgPSAwOworCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2luZGV4XSA9IGJvOworCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgbmVlZF9mZW5jZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKilibzsKKwlpbnQgaW5kZXg7CisKKwlpZiAoYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCAhPSAtMSkgeworCQlpZiAobmVlZF9mZW5jZSkKKwkJCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbYm9fZ2VtLT52YWxpZGF0ZV9pbmRleF0uZmxhZ3MgfD0KKwkJCQlFWEVDX09CSkVDVF9ORUVEU19GRU5DRTsKKwkJcmV0dXJuOworCX0KKworCS8qIEV4dGVuZCB0aGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBlbnRyaWVzIGFzIG5lY2Vzc2FyeS4gKi8KKwlpZiAoYnVmbWdyX2dlbS0+ZXhlY19jb3VudCA9PSBidWZtZ3JfZ2VtLT5leGVjX3NpemUpIHsKKwkJaW50IG5ld19zaXplID0gYnVmbWdyX2dlbS0+ZXhlY19zaXplICogMjsKKworCQlpZiAobmV3X3NpemUgPT0gMCkKKwkJCW5ld19zaXplID0gNTsKKworCQlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzID0KKwkJCXJlYWxsb2MoYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0cywKKwkJCQlzaXplb2YoKmJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHMpICogbmV3X3NpemUpOworCQlidWZtZ3JfZ2VtLT5leGVjX2JvcyA9CisJCQlyZWFsbG9jKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zLAorCQkJCXNpemVvZigqYnVmbWdyX2dlbS0+ZXhlY19ib3MpICogbmV3X3NpemUpOworCQlidWZtZ3JfZ2VtLT5leGVjX3NpemUgPSBuZXdfc2l6ZTsKKwl9CisKKwlpbmRleCA9IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7CisJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IGluZGV4OworCS8qIEZpbGwgaW4gYXJyYXkgZW50cnkgKi8KKwlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ucmVsb2NhdGlvbl9jb3VudCA9IGJvX2dlbS0+cmVsb2NfY291bnQ7CisJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ucmVsb2NzX3B0ciA9ICh1aW50cHRyX3QpYm9fZ2VtLT5yZWxvY3M7CisJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0uYWxpZ25tZW50ID0gMDsKKwlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5vZmZzZXQgPSAwOworCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2luZGV4XSA9IGJvOworCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaW5kZXhdLmZsYWdzID0gMDsKKwlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5yc3ZkMSA9IDA7CisJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ucnN2ZDIgPSAwOworCWlmIChuZWVkX2ZlbmNlKSB7CisJCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaW5kZXhdLmZsYWdzIHw9CisJCQlFWEVDX09CSkVDVF9ORUVEU19GRU5DRTsKKwl9CisJYnVmbWdyX2dlbS0+ZXhlY19jb3VudCsrOworfQorCisjZGVmaW5lIFJFTE9DX0JVRl9TSVpFKHgpICgoSTkxNV9SRUxPQ19IRUFERVIgKyB4ICogSTkxNV9SRUxPQzBfU1RSSURFKSAqIFwKKwlzaXplb2YodWludDMyX3QpKQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2JvX2dlbV9zZXRfaW5fYXBlcnR1cmVfc2l6ZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKKwkJCQkgICAgICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0pCit7CisJaW50IHNpemU7CisKKwlhc3NlcnQoIWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQpOworCisJLyogVGhlIG9sZGVyIGNoaXBzZXRzIGFyZSBmYXItbGVzcyBmbGV4aWJsZSBpbiB0ZXJtcyBvZiB0aWxpbmcsCisJICogYW5kIHJlcXVpcmUgdGlsZWQgYnVmZmVyIHRvIGJlIHNpemUgYWxpZ25lZCBpbiB0aGUgYXBlcnR1cmUuCisJICogVGhpcyBtZWFucyB0aGF0IGluIHRoZSB3b3JzdCBwb3NzaWJsZSBjYXNlIHdlIHdpbGwgbmVlZCBhIGhvbGUKKwkgKiB0d2ljZSBhcyBsYXJnZSBhcyB0aGUgb2JqZWN0IGluIG9yZGVyIGZvciBpdCB0byBmaXQgaW50byB0aGUKKwkgKiBhcGVydHVyZS4gT3B0aW1hbCBwYWNraW5nIGlzIGZvciB3aW1wcy4KKwkgKi8KKwlzaXplID0gYm9fZ2VtLT5iby5zaXplOworCWlmIChidWZtZ3JfZ2VtLT5nZW4gPCA0ICYmIGJvX2dlbS0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgeworCQlpbnQgbWluX3NpemU7CisKKwkJaWYgKGJ1Zm1ncl9nZW0tPmhhc19yZWxheGVkX2ZlbmNpbmcpIHsKKwkJCWlmIChidWZtZ3JfZ2VtLT5nZW4gPT0gMykKKwkJCQltaW5fc2l6ZSA9IDEwMjQqMTAyNDsKKwkJCWVsc2UKKwkJCQltaW5fc2l6ZSA9IDUxMioxMDI0OworCisJCQl3aGlsZSAobWluX3NpemUgPCBzaXplKQorCQkJCW1pbl9zaXplICo9IDI7CisJCX0gZWxzZQorCQkJbWluX3NpemUgPSBzaXplOworCisJCS8qIEFjY291bnQgZm9yIHdvcnN0LWNhc2UgYWxpZ25tZW50LiAqLworCQlzaXplID0gMiAqIG1pbl9zaXplOworCX0KKworCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplID0gc2l6ZTsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX3NldHVwX3JlbG9jX2xpc3QoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCXVuc2lnbmVkIGludCBtYXhfcmVsb2NzID0gYnVmbWdyX2dlbS0+bWF4X3JlbG9jczsKKworCWlmIChiby0+c2l6ZSAvIDQgPCBtYXhfcmVsb2NzKQorCQltYXhfcmVsb2NzID0gYm8tPnNpemUgLyA0OworCisJYm9fZ2VtLT5yZWxvY3MgPSBtYWxsb2MobWF4X3JlbG9jcyAqCisJCQkJc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSkpOworCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8gPSBtYWxsb2MobWF4X3JlbG9jcyAqCisJCQkJCSAgIHNpemVvZihkcm1faW50ZWxfcmVsb2NfdGFyZ2V0KSk7CisJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgfHwgYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9PSBOVUxMKSB7CisJCWJvX2dlbS0+aGFzX2Vycm9yID0gdHJ1ZTsKKworCQlmcmVlIChib19nZW0tPnJlbG9jcyk7CisJCWJvX2dlbS0+cmVsb2NzID0gTlVMTDsKKworCQlmcmVlIChib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvKTsKKwkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9IE5VTEw7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fYnVzeShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9idXN5IGJ1c3k7CisJaW50IHJldDsKKworCWlmIChib19nZW0tPnJldXNhYmxlICYmIGJvX2dlbS0+aWRsZSkKKwkJcmV0dXJuIGZhbHNlOworCisJbWVtY2xlYXIoYnVzeSk7CisJYnVzeS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0JVU1ksICZidXN5KTsKKwlpZiAocmV0ID09IDApIHsKKwkJYm9fZ2VtLT5pZGxlID0gIWJ1c3kuYnVzeTsKKwkJcmV0dXJuIGJ1c3kuYnVzeTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiAocmV0ID09IDAgJiYgYnVzeS5idXN5KTsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19tYWR2aXNlX2ludGVybmFsKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAorCQkJCSAgZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlIG1hZHY7CisKKwltZW1jbGVhcihtYWR2KTsKKwltYWR2LmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwltYWR2Lm1hZHYgPSBzdGF0ZTsKKwltYWR2LnJldGFpbmVkID0gMTsKKwlkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX01BRFZJU0UsICZtYWR2KTsKKworCXJldHVybiBtYWR2LnJldGFpbmVkOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2UoZHJtX2ludGVsX2JvICpibywgaW50IG1hZHYpCit7CisJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZV9pbnRlcm5hbAorCQkoKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3IsCisJCSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibywKKwkJIG1hZHYpOworfQorCisvKiBkcm9wIHRoZSBvbGRlc3QgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBwdXJnZWQgYnkgdGhlIGtlcm5lbCAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fY2FjaGVfcHVyZ2VfYnVja2V0KGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgKmJ1Y2tldCkKK3sKKwl3aGlsZSAoIURSTUxJU1RFTVBUWSgmYnVja2V0LT5oZWFkKSkgeworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CisKKwkJYm9fZ2VtID0gRFJNTElTVEVOVFJZKGRybV9pbnRlbF9ib19nZW0sCisJCQkJICAgICAgYnVja2V0LT5oZWFkLm5leHQsIGhlYWQpOworCQlpZiAoZHJtX2ludGVsX2dlbV9ib19tYWR2aXNlX2ludGVybmFsCisJCSAgICAoYnVmbWdyX2dlbSwgYm9fZ2VtLCBJOTE1X01BRFZfRE9OVE5FRUQpKQorCQkJYnJlYWs7CisKKwkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKKwkJZHJtX2ludGVsX2dlbV9ib19mcmVlKCZib19nZW0tPmJvKTsKKwl9Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorZHJtX2ludGVsX2dlbV9ib19hbGxvY19pbnRlcm5hbChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQl1aW50MzJfdCB0aWxpbmdfbW9kZSwKKwkJCQl1bnNpZ25lZCBsb25nIHN0cmlkZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOworCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworCWludCByZXQ7CisJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQ7CisJYm9vbCBhbGxvY19mcm9tX2NhY2hlOworCXVuc2lnbmVkIGxvbmcgYm9fc2l6ZTsKKwlib29sIGZvcl9yZW5kZXIgPSBmYWxzZTsKKworCWlmIChmbGFncyAmIEJPX0FMTE9DX0ZPUl9SRU5ERVIpCisJCWZvcl9yZW5kZXIgPSB0cnVlOworCisJLyogUm91bmQgdGhlIGFsbG9jYXRlZCBzaXplIHVwIHRvIGEgcG93ZXIgb2YgdHdvIG51bWJlciBvZiBwYWdlcy4gKi8KKwlidWNrZXQgPSBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldF9mb3Jfc2l6ZShidWZtZ3JfZ2VtLCBzaXplKTsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgY2FjaGluZyBhdCB0aGlzIHNpemUsIGRvbid0IGFjdHVhbGx5IHJvdW5kIHRoZQorCSAqIGFsbG9jYXRpb24gdXAuCisJICovCisJaWYgKGJ1Y2tldCA9PSBOVUxMKSB7CisJCWJvX3NpemUgPSBzaXplOworCQlpZiAoYm9fc2l6ZSA8IHBhZ2Vfc2l6ZSkKKwkJCWJvX3NpemUgPSBwYWdlX3NpemU7CisJfSBlbHNlIHsKKwkJYm9fc2l6ZSA9IGJ1Y2tldC0+c2l6ZTsKKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCS8qIEdldCBhIGJ1ZmZlciBvdXQgb2YgdGhlIGNhY2hlIGlmIGF2YWlsYWJsZSAqLworcmV0cnk6CisJYWxsb2NfZnJvbV9jYWNoZSA9IGZhbHNlOworCWlmIChidWNrZXQgIT0gTlVMTCAmJiAhRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CisJCWlmIChmb3JfcmVuZGVyKSB7CisJCQkvKiBBbGxvY2F0ZSBuZXcgcmVuZGVyLXRhcmdldCBCT3MgZnJvbSB0aGUgdGFpbCAoTVJVKQorCQkJICogb2YgdGhlIGxpc3QsIGFzIGl0IHdpbGwgbGlrZWx5IGJlIGhvdCBpbiB0aGUgR1BVCisJCQkgKiBjYWNoZSBhbmQgaW4gdGhlIGFwZXJ0dXJlIGZvciB1cy4KKwkJCSAqLworCQkJYm9fZ2VtID0gRFJNTElTVEVOVFJZKGRybV9pbnRlbF9ib19nZW0sCisJCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5wcmV2LCBoZWFkKTsKKwkJCURSTUxJU1RERUwoJmJvX2dlbS0+aGVhZCk7CisJCQlhbGxvY19mcm9tX2NhY2hlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZvciBub24tcmVuZGVyLXRhcmdldCBCT3MgKHdoZXJlIHdlJ3JlIHByb2JhYmx5CisJCQkgKiBnb2luZyB0byBtYXAgaXQgZmlyc3QgdGhpbmcgaW4gb3JkZXIgdG8gZmlsbCBpdAorCQkJICogd2l0aCBkYXRhKSwgY2hlY2sgaWYgdGhlIGxhc3QgQk8gaW4gdGhlIGNhY2hlIGlzCisJCQkgKiB1bmJ1c3ksIGFuZCBvbmx5IHJldXNlIGluIHRoYXQgY2FzZS4gT3RoZXJ3aXNlLAorCQkJICogYWxsb2NhdGluZyBhIG5ldyBidWZmZXIgaXMgcHJvYmFibHkgZmFzdGVyIHRoYW4KKwkJCSAqIHdhaXRpbmcgZm9yIHRoZSBHUFUgdG8gZmluaXNoLgorCQkJICovCisJCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKKwkJCQkJICAgICAgYnVja2V0LT5oZWFkLm5leHQsIGhlYWQpOworCQkJaWYgKCFkcm1faW50ZWxfZ2VtX2JvX2J1c3koJmJvX2dlbS0+Ym8pKSB7CisJCQkJYWxsb2NfZnJvbV9jYWNoZSA9IHRydWU7CisJCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKKwkJCX0KKwkJfQorCisJCWlmIChhbGxvY19mcm9tX2NhY2hlKSB7CisJCQlpZiAoIWRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZV9pbnRlcm5hbAorCQkJICAgIChidWZtZ3JfZ2VtLCBib19nZW0sIEk5MTVfTUFEVl9XSUxMTkVFRCkpIHsKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOworCQkJCWRybV9pbnRlbF9nZW1fYm9fY2FjaGVfcHVyZ2VfYnVja2V0KGJ1Zm1ncl9nZW0sCisJCQkJCQkJCSAgICBidWNrZXQpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisKKwkJCWlmIChkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoJmJvX2dlbS0+Ym8sCisJCQkJCQkJCSB0aWxpbmdfbW9kZSwKKwkJCQkJCQkJIHN0cmlkZSkpIHsKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJaWYgKCFhbGxvY19mcm9tX2NhY2hlKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fY3JlYXRlIGNyZWF0ZTsKKworCQlib19nZW0gPSBjYWxsb2MoMSwgc2l6ZW9mKCpib19nZW0pKTsKKwkJaWYgKCFib19nZW0pCisJCQlyZXR1cm4gTlVMTDsKKworCQlib19nZW0tPmJvLnNpemUgPSBib19zaXplOworCisJCW1lbWNsZWFyKGNyZWF0ZSk7CisJCWNyZWF0ZS5zaXplID0gYm9fc2l6ZTsKKworCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fQ1JFQVRFLAorCQkJICAgICAgICZjcmVhdGUpOworCQlib19nZW0tPmdlbV9oYW5kbGUgPSBjcmVhdGUuaGFuZGxlOworCQlib19nZW0tPmJvLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlmcmVlKGJvX2dlbSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlib19nZW0tPmJvLmJ1Zm1nciA9IGJ1Zm1ncjsKKworCQlib19nZW0tPnRpbGluZ19tb2RlID0gSTkxNV9USUxJTkdfTk9ORTsKKwkJYm9fZ2VtLT5zd2l6emxlX21vZGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJYm9fZ2VtLT5zdHJpZGUgPSAwOworCisJCS8qIGRybV9pbnRlbF9nZW1fYm9fZnJlZSBjYWxscyBEUk1MSVNUREVMKCkgZm9yIGFuIHVuaW5pdGlhbGl6ZWQKKwkJICAgbGlzdCAodm1hX2xpc3QpLCBzbyBiZXR0ZXIgc2V0IHRoZSBsaXN0IGhlYWQgaGVyZSAqLworCQlEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+bmFtZV9saXN0KTsKKwkJRFJNSU5JVExJU1RIRUFEKCZib19nZW0tPnZtYV9saXN0KTsKKwkJaWYgKGRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZ19pbnRlcm5hbCgmYm9fZ2VtLT5ibywKKwkJCQkJCQkgdGlsaW5nX21vZGUsCisJCQkJCQkJIHN0cmlkZSkpIHsKKwkJICAgIGRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CisJCSAgICByZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWJvX2dlbS0+bmFtZSA9IG5hbWU7CisJYXRvbWljX3NldCgmYm9fZ2VtLT5yZWZjb3VudCwgMSk7CisJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOworCWJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAwOworCWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSBmYWxzZTsKKwlib19nZW0tPmhhc19lcnJvciA9IGZhbHNlOworCWJvX2dlbS0+cmV1c2FibGUgPSB0cnVlOworCWJvX2dlbS0+YXViX2Fubm90YXRpb25zID0gTlVMTDsKKwlib19nZW0tPmF1Yl9hbm5vdGF0aW9uX2NvdW50ID0gMDsKKworCWRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKKworCURCRygiYm9fY3JlYXRlOiBidWYgJWQgKCVzKSAlbGRiXG4iLAorCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgc2l6ZSk7CisKKwlyZXR1cm4gJmJvX2dlbS0+Ym87Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorZHJtX2ludGVsX2dlbV9ib19hbGxvY19mb3JfcmVuZGVyKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KQoreworCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2ludGVybmFsKGJ1Zm1nciwgbmFtZSwgc2l6ZSwKKwkJCQkJICAgICAgIEJPX0FMTE9DX0ZPUl9SRU5ERVIsCisJCQkJCSAgICAgICBJOTE1X1RJTElOR19OT05FLCAwKTsKK30KKworc3RhdGljIGRybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfZ2VtX2JvX2FsbG9jKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KQoreworCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2ludGVybmFsKGJ1Zm1nciwgbmFtZSwgc2l6ZSwgMCwKKwkJCQkJICAgICAgIEk5MTVfVElMSU5HX05PTkUsIDApOworfQorCitzdGF0aWMgZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9nZW1fYm9fYWxsb2NfdGlsZWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBpbnQgeCwgaW50IHksIGludCBjcHAsIHVpbnQzMl90ICp0aWxpbmdfbW9kZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyAqcGl0Y2gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CisJdW5zaWduZWQgbG9uZyBzaXplLCBzdHJpZGU7CisJdWludDMyX3QgdGlsaW5nOworCisJZG8geworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfeSwgaGVpZ2h0X2FsaWdubWVudDsKKworCQl0aWxpbmcgPSAqdGlsaW5nX21vZGU7CisKKwkJLyogSWYgd2UncmUgdGlsZWQsIG91ciBhbGxvY2F0aW9ucyBhcmUgaW4gOCBvciAzMi1yb3cgYmxvY2tzLAorCQkgKiBzbyBmYWlsdXJlIHRvIGFsaWduIG91ciBoZWlnaHQgbWVhbnMgdGhhdCB3ZSB3b24ndCBhbGxvY2F0ZQorCQkgKiBlbm91Z2ggcGFnZXMuCisJCSAqCisJCSAqIElmIHdlJ3JlIHVudGlsZWQsIHdlIHN0aWxsIGhhdmUgdG8gYWxpZ24gdG8gMiByb3dzIGhpZ2gKKwkJICogYmVjYXVzZSB0aGUgZGF0YSBwb3J0IGFjY2Vzc2VzIDJ4MiBibG9ja3MgZXZlbiBpZiB0aGUKKwkJICogYm90dG9tIHJvdyBpc24ndCB0byBiZSByZW5kZXJlZCwgc28gZmFpbHVyZSB0byBhbGlnbiBtZWFucworCQkgKiB3ZSBjb3VsZCB3YWxrIG9mZiB0aGUgZW5kIG9mIHRoZSBHVFQgYW5kIGZhdWx0LiAgVGhpcyBpcworCQkgKiBkb2N1bWVudGVkIG9uIDk2NSwgYW5kIG1heSBiZSB0aGUgY2FzZSBvbiBvbGRlciBjaGlwc2V0cworCQkgKiB0b28gc28gd2UgdHJ5IHRvIGJlIGNhcmVmdWwuCisJCSAqLworCQlhbGlnbmVkX3kgPSB5OworCQloZWlnaHRfYWxpZ25tZW50ID0gMjsKKworCQlpZiAoKGJ1Zm1ncl9nZW0tPmdlbiA9PSAyKSAmJiB0aWxpbmcgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJCWhlaWdodF9hbGlnbm1lbnQgPSAxNjsKKwkJZWxzZSBpZiAodGlsaW5nID09IEk5MTVfVElMSU5HX1gKKwkJCXx8IChJU185MTUoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkKKwkJCSAgICAmJiB0aWxpbmcgPT0gSTkxNV9USUxJTkdfWSkpCisJCQloZWlnaHRfYWxpZ25tZW50ID0gODsKKwkJZWxzZSBpZiAodGlsaW5nID09IEk5MTVfVElMSU5HX1kpCisJCQloZWlnaHRfYWxpZ25tZW50ID0gMzI7CisJCWFsaWduZWRfeSA9IEFMSUdOKHksIGhlaWdodF9hbGlnbm1lbnQpOworCisJCXN0cmlkZSA9IHggKiBjcHA7CisJCXN0cmlkZSA9IGRybV9pbnRlbF9nZW1fYm9fdGlsZV9waXRjaChidWZtZ3JfZ2VtLCBzdHJpZGUsIHRpbGluZ19tb2RlKTsKKwkJc2l6ZSA9IHN0cmlkZSAqIGFsaWduZWRfeTsKKwkJc2l6ZSA9IGRybV9pbnRlbF9nZW1fYm9fdGlsZV9zaXplKGJ1Zm1ncl9nZW0sIHNpemUsIHRpbGluZ19tb2RlKTsKKwl9IHdoaWxlICgqdGlsaW5nX21vZGUgIT0gdGlsaW5nKTsKKwkqcGl0Y2ggPSBzdHJpZGU7CisKKwlpZiAodGlsaW5nID09IEk5MTVfVElMSU5HX05PTkUpCisJCXN0cmlkZSA9IDA7CisKKwlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hbGxvY19pbnRlcm5hbChidWZtZ3IsIG5hbWUsIHNpemUsIGZsYWdzLAorCQkJCQkgICAgICAgdGlsaW5nLCBzdHJpZGUpOworfQorCitzdGF0aWMgZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9nZW1fYm9fYWxsb2NfdXNlcnB0cihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQl2b2lkICphZGRyLAorCQkJCXVpbnQzMl90IHRpbGluZ19tb2RlLAorCQkJCXVpbnQzMl90IHN0cmlkZSwKKwkJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOworCWludCByZXQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV91c2VycHRyIHVzZXJwdHI7CisKKwkvKiBUaWxpbmcgd2l0aCB1c2VycHRyIHN1cmZhY2VzIGlzIG5vdCBzdXBwb3J0ZWQKKwkgKiBvbiBhbGwgaGFyZHdhcmUgc28gcmVmdXNlIGl0IGZvciB0aW1lIGJlaW5nLgorCSAqLworCWlmICh0aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQorCQlyZXR1cm4gTlVMTDsKKworCWJvX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJvX2dlbSkpOworCWlmICghYm9fZ2VtKQorCQlyZXR1cm4gTlVMTDsKKworCWJvX2dlbS0+Ym8uc2l6ZSA9IHNpemU7CisKKwltZW1jbGVhcih1c2VycHRyKTsKKwl1c2VycHRyLnVzZXJfcHRyID0gKF9fdTY0KSgodW5zaWduZWQgbG9uZylhZGRyKTsKKwl1c2VycHRyLnVzZXJfc2l6ZSA9IHNpemU7CisJdXNlcnB0ci5mbGFncyA9IGZsYWdzOworCisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCQlEUk1fSU9DVExfSTkxNV9HRU1fVVNFUlBUUiwKKwkJCSZ1c2VycHRyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJREJHKCJib19jcmVhdGVfdXNlcnB0cjogIgorCQkgICAgImlvY3RsIGZhaWxlZCB3aXRoIHVzZXIgcHRyICVwIHNpemUgMHglbHgsICIKKwkJICAgICJ1c2VyIGZsYWdzIDB4JWx4XG4iLCBhZGRyLCBzaXplLCBmbGFncyk7CisJCWZyZWUoYm9fZ2VtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYm9fZ2VtLT5nZW1faGFuZGxlID0gdXNlcnB0ci5oYW5kbGU7CisJYm9fZ2VtLT5iby5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJYm9fZ2VtLT5iby5idWZtZ3IgICAgPSBidWZtZ3I7CisJYm9fZ2VtLT5pc191c2VycHRyICAgPSB0cnVlOworCWJvX2dlbS0+Ym8udmlydHVhbCAgID0gYWRkcjsKKwkvKiBTYXZlIHRoZSBhZGRyZXNzIHByb3ZpZGVkIGJ5IHVzZXIgKi8KKwlib19nZW0tPnVzZXJfdmlydHVhbCA9IGFkZHI7CisJYm9fZ2VtLT50aWxpbmdfbW9kZSAgPSBJOTE1X1RJTElOR19OT05FOworCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJYm9fZ2VtLT5zdHJpZGUgICAgICAgPSAwOworCisJRFJNSU5JVExJU1RIRUFEKCZib19nZW0tPm5hbWVfbGlzdCk7CisJRFJNSU5JVExJU1RIRUFEKCZib19nZW0tPnZtYV9saXN0KTsKKworCWJvX2dlbS0+bmFtZSA9IG5hbWU7CisJYXRvbWljX3NldCgmYm9fZ2VtLT5yZWZjb3VudCwgMSk7CisJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOworCWJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAwOworCWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSBmYWxzZTsKKwlib19nZW0tPmhhc19lcnJvciA9IGZhbHNlOworCWJvX2dlbS0+cmV1c2FibGUgPSBmYWxzZTsKKworCWRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKKworCURCRygiYm9fY3JlYXRlX3VzZXJwdHI6ICIKKwkgICAgInB0ciAlcCBidWYgJWQgKCVzKSBzaXplICVsZGIsIHN0cmlkZSAweCV4LCB0aWxlIG1vZGUgJWRcbiIsCisJCWFkZHIsIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAorCQlzaXplLCBzdHJpZGUsIHRpbGluZ19tb2RlKTsKKworCXJldHVybiAmYm9fZ2VtLT5ibzsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgZHJtX2ludGVsX2JvIHdyYXBwaW5nIHRoZSBnaXZlbiBidWZmZXIgb2JqZWN0IGhhbmRsZS4KKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gb25lIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHBhc3MgYSBidWZmZXIgb2JqZWN0CisgKiB0byBhbm90aGVyLgorICovCitkcm1fcHVibGljIGRybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgIHVuc2lnbmVkIGludCBoYW5kbGUpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKKwlpbnQgcmV0OworCXN0cnVjdCBkcm1fZ2VtX29wZW4gb3Blbl9hcmc7CisJc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nIGdldF90aWxpbmc7CisJZHJtTU1MaXN0SGVhZCAqbGlzdDsKKworCS8qIEF0IHRoZSBtb21lbnQgbW9zdCBhcHBsaWNhdGlvbnMgb25seSBoYXZlIGEgZmV3IG5hbWVkIGJvLgorCSAqIEZvciBpbnN0YW5jZSwgaW4gYSBEUkkgY2xpZW50IG9ubHkgdGhlIHJlbmRlciBidWZmZXJzIHBhc3NlZAorCSAqIGJldHdlZW4gWCBhbmQgdGhlIGNsaWVudCBhcmUgbmFtZWQuIEFuZCBzaW5jZSBYIHJldHVybnMgdGhlCisJICogYWx0ZXJuYXRpbmcgbmFtZXMgZm9yIHRoZSBmcm9udC9iYWNrIGJ1ZmZlciBhIGxpbmVhciBzZWFyY2gKKwkgKiBwcm92aWRlcyBhIHN1ZmZpY2llbnRseSBmYXN0IG1hdGNoLgorCSAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJZm9yIChsaXN0ID0gYnVmbWdyX2dlbS0+bmFtZWQubmV4dDsKKwkgICAgIGxpc3QgIT0gJmJ1Zm1ncl9nZW0tPm5hbWVkOworCSAgICAgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJYm9fZ2VtID0gRFJNTElTVEVOVFJZKGRybV9pbnRlbF9ib19nZW0sIGxpc3QsIG5hbWVfbGlzdCk7CisJCWlmIChib19nZW0tPmdsb2JhbF9uYW1lID09IGhhbmRsZSkgeworCQkJZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UoJmJvX2dlbS0+Ym8pOworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCQkJcmV0dXJuICZib19nZW0tPmJvOworCQl9CisJfQorCisJbWVtY2xlYXIob3Blbl9hcmcpOworCW9wZW5fYXJnLm5hbWUgPSBoYW5kbGU7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfR0VNX09QRU4sCisJCSAgICAgICAmb3Blbl9hcmcpOworCWlmIChyZXQgIT0gMCkgeworCQlEQkcoIkNvdWxkbid0IHJlZmVyZW5jZSAlcyBoYW5kbGUgMHglMDh4OiAlc1xuIiwKKwkJICAgIG5hbWUsIGhhbmRsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisgICAgICAgIC8qIE5vdyBzZWUgaWYgc29tZW9uZSBoYXMgdXNlZCBhIHByaW1lIGhhbmRsZSB0byBnZXQgdGhpcworICAgICAgICAgKiBvYmplY3QgZnJvbSB0aGUga2VybmVsIGJlZm9yZSBieSBsb29raW5nIHRocm91Z2ggdGhlIGxpc3QKKyAgICAgICAgICogYWdhaW4gZm9yIGEgbWF0Y2hpbmcgZ2VtX2hhbmRsZQorICAgICAgICAgKi8KKwlmb3IgKGxpc3QgPSBidWZtZ3JfZ2VtLT5uYW1lZC5uZXh0OworCSAgICAgbGlzdCAhPSAmYnVmbWdyX2dlbS0+bmFtZWQ7CisJICAgICBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwgbGlzdCwgbmFtZV9saXN0KTsKKwkJaWYgKGJvX2dlbS0+Z2VtX2hhbmRsZSA9PSBvcGVuX2FyZy5oYW5kbGUpIHsKKwkJCWRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKCZib19nZW0tPmJvKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwkJCXJldHVybiAmYm9fZ2VtLT5ibzsKKwkJfQorCX0KKworCWJvX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJvX2dlbSkpOworCWlmICghYm9fZ2VtKSB7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYm9fZ2VtLT5iby5zaXplID0gb3Blbl9hcmcuc2l6ZTsKKwlib19nZW0tPmJvLm9mZnNldCA9IDA7CisJYm9fZ2VtLT5iby5vZmZzZXQ2NCA9IDA7CisJYm9fZ2VtLT5iby52aXJ0dWFsID0gTlVMTDsKKwlib19nZW0tPmJvLmJ1Zm1nciA9IGJ1Zm1ncjsKKwlib19nZW0tPm5hbWUgPSBuYW1lOworCWF0b21pY19zZXQoJmJvX2dlbS0+cmVmY291bnQsIDEpOworCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKKwlib19nZW0tPmdlbV9oYW5kbGUgPSBvcGVuX2FyZy5oYW5kbGU7CisJYm9fZ2VtLT5iby5oYW5kbGUgPSBvcGVuX2FyZy5oYW5kbGU7CisJYm9fZ2VtLT5nbG9iYWxfbmFtZSA9IGhhbmRsZTsKKwlib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CisKKwltZW1jbGVhcihnZXRfdGlsaW5nKTsKKwlnZXRfdGlsaW5nLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfVElMSU5HLAorCQkgICAgICAgJmdldF90aWxpbmcpOworCWlmIChyZXQgIT0gMCkgeworCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlKCZib19nZW0tPmJvKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYm9fZ2VtLT50aWxpbmdfbW9kZSA9IGdldF90aWxpbmcudGlsaW5nX21vZGU7CisJYm9fZ2VtLT5zd2l6emxlX21vZGUgPSBnZXRfdGlsaW5nLnN3aXp6bGVfbW9kZTsKKwkvKiBYWFggc3RyaWRlIGlzIHVua25vd24gKi8KKwlkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisKKwlEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOworCURSTUxJU1RBRERUQUlMKCZib19nZW0tPm5hbWVfbGlzdCwgJmJ1Zm1ncl9nZW0tPm5hbWVkKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJREJHKCJib19jcmVhdGVfZnJvbV9oYW5kbGU6ICVkICglcylcbiIsIGhhbmRsZSwgYm9fZ2VtLT5uYW1lKTsKKworCXJldHVybiAmYm9fZ2VtLT5ibzsKK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fZnJlZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9nZW1fY2xvc2UgY2xvc2U7CisJaW50IHJldDsKKworCURSTUxJU1RERUwoJmJvX2dlbS0+dm1hX2xpc3QpOworCWlmIChib19nZW0tPm1lbV92aXJ0dWFsKSB7CisJCVZHKFZBTEdSSU5EX0ZSRUVMSUtFX0JMT0NLKGJvX2dlbS0+bWVtX3ZpcnR1YWwsIDApKTsKKwkJZHJtX211bm1hcChib19nZW0tPm1lbV92aXJ0dWFsLCBib19nZW0tPmJvLnNpemUpOworCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKKwl9CisJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpIHsKKwkJZHJtX211bm1hcChib19nZW0tPmd0dF92aXJ0dWFsLCBib19nZW0tPmJvLnNpemUpOworCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKKwl9CisKKwkvKiBDbG9zZSB0aGlzIG9iamVjdCAqLworCW1lbWNsZWFyKGNsb3NlKTsKKwljbG9zZS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZjbG9zZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCURCRygiRFJNX0lPQ1RMX0dFTV9DTE9TRSAlZCBmYWlsZWQgKCVzKTogJXNcbiIsCisJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJZnJlZShib19nZW0tPmF1Yl9hbm5vdGF0aW9ucyk7CisJZnJlZShibyk7Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChkcm1faW50ZWxfYm8gKmJvKQoreworI2lmIEhBVkVfVkFMR1JJTkQKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKworCWlmIChib19nZW0tPm1lbV92aXJ0dWFsKQorCQlWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUyhib19nZW0tPm1lbV92aXJ0dWFsLCBiby0+c2l6ZSk7CisKKwlpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCkKKwkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm8tPnNpemUpOworI2VuZGlmCit9CisKKy8qKiBGcmVlcyBhbGwgY2FjaGVkIGJ1ZmZlcnMgc2lnbmlmaWNhbnRseSBvbGRlciB0aGFuIEB0aW1lLiAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fY2xlYW51cF9ib19jYWNoZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwgdGltZV90IHRpbWUpCit7CisJaW50IGk7CisKKwlpZiAoYnVmbWdyX2dlbS0+dGltZSA9PSB0aW1lKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+bnVtX2J1Y2tldHM7IGkrKykgeworCQlzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgKmJ1Y2tldCA9CisJCSAgICAmYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldOworCisJCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CisJCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CisKKwkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAorCQkJCQkgICAgICBidWNrZXQtPmhlYWQubmV4dCwgaGVhZCk7CisJCQlpZiAodGltZSAtIGJvX2dlbS0+ZnJlZV90aW1lIDw9IDEpCisJCQkJYnJlYWs7CisKKwkJCURSTUxJU1RERUwoJmJvX2dlbS0+aGVhZCk7CisKKwkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CisJCX0KKwl9CisKKwlidWZtZ3JfZ2VtLT50aW1lID0gdGltZTsKK30KKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19wdXJnZV92bWFfY2FjaGUoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCit7CisJaW50IGxpbWl0OworCisJREJHKCIlczogY2FjaGVkPSVkLCBvcGVuPSVkLCBsaW1pdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBidWZtZ3JfZ2VtLT52bWFfY291bnQsIGJ1Zm1ncl9nZW0tPnZtYV9vcGVuLCBidWZtZ3JfZ2VtLT52bWFfbWF4KTsKKworCWlmIChidWZtZ3JfZ2VtLT52bWFfbWF4IDwgMCkKKwkJcmV0dXJuOworCisJLyogV2UgbWF5IG5lZWQgdG8gZXZpY3QgYSBmZXcgZW50cmllcyBpbiBvcmRlciB0byBjcmVhdGUgbmV3IG1tYXBzICovCisJbGltaXQgPSBidWZtZ3JfZ2VtLT52bWFfbWF4IC0gMipidWZtZ3JfZ2VtLT52bWFfb3BlbjsKKwlpZiAobGltaXQgPCAwKQorCQlsaW1pdCA9IDA7CisKKwl3aGlsZSAoYnVmbWdyX2dlbS0+dm1hX2NvdW50ID4gbGltaXQpIHsKKwkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOworCisJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAorCQkJCSAgICAgIGJ1Zm1ncl9nZW0tPnZtYV9jYWNoZS5uZXh0LAorCQkJCSAgICAgIHZtYV9saXN0KTsKKwkJYXNzZXJ0KGJvX2dlbS0+bWFwX2NvdW50ID09IDApOworCQlEUk1MSVNUREVMSU5JVCgmYm9fZ2VtLT52bWFfbGlzdCk7CisKKwkJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpIHsKKwkJCWRybV9tdW5tYXAoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKKwkJCWJvX2dlbS0+bWVtX3ZpcnR1YWwgPSBOVUxMOworCQkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJCX0KKwkJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpIHsKKwkJCWRybV9tdW5tYXAoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKKwkJCWJvX2dlbS0+Z3R0X3ZpcnR1YWwgPSBOVUxMOworCQkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAorCQkJCSAgICAgICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0pCit7CisJYnVmbWdyX2dlbS0+dm1hX29wZW4tLTsKKwlEUk1MSVNUQUREVEFJTCgmYm9fZ2VtLT52bWFfbGlzdCwgJmJ1Zm1ncl9nZW0tPnZtYV9jYWNoZSk7CisJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpCisJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudCsrOworCWlmIChib19nZW0tPmd0dF92aXJ0dWFsKQorCQlidWZtZ3JfZ2VtLT52bWFfY291bnQrKzsKKwlkcm1faW50ZWxfZ2VtX2JvX3B1cmdlX3ZtYV9jYWNoZShidWZtZ3JfZ2VtKTsKK30KKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKKwkJCQkgICAgICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0pCit7CisJYnVmbWdyX2dlbS0+dm1hX29wZW4rKzsKKwlEUk1MSVNUREVMKCZib19nZW0tPnZtYV9saXN0KTsKKwlpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkKKwkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpCisJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOworCWRybV9pbnRlbF9nZW1fYm9fcHVyZ2Vfdm1hX2NhY2hlKGJ1Zm1ncl9nZW0pOworfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9maW5hbChkcm1faW50ZWxfYm8gKmJvLCB0aW1lX3QgdGltZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0OworCWludCBpOworCisJLyogVW5yZWZlcmVuY2UgYWxsIHRoZSB0YXJnZXQgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKKwkJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8gIT0gYm8pIHsKKwkJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKGJvX2dlbS0+CisJCQkJCQkJCSAgcmVsb2NfdGFyZ2V0X2luZm9baV0uYm8sCisJCQkJCQkJCSAgdGltZSk7CisJCX0KKwl9CisJYm9fZ2VtLT5yZWxvY19jb3VudCA9IDA7CisJYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCA9IGZhbHNlOworCisJREJHKCJib191bnJlZmVyZW5jZSBmaW5hbDogJWQgKCVzKVxuIiwKKwkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUpOworCisJLyogcmVsZWFzZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0ICovCisJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8pIHsKKwkJZnJlZShib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvKTsKKwkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9IE5VTEw7CisJfQorCWlmIChib19nZW0tPnJlbG9jcykgeworCQlmcmVlKGJvX2dlbS0+cmVsb2NzKTsKKwkJYm9fZ2VtLT5yZWxvY3MgPSBOVUxMOworCX0KKworCS8qIENsZWFyIGFueSBsZWZ0LW92ZXIgbWFwcGluZ3MgKi8KKwlpZiAoYm9fZ2VtLT5tYXBfY291bnQpIHsKKwkJREJHKCJibyBmcmVlZCB3aXRoIG5vbi16ZXJvIG1hcC1jb3VudCAlZFxuIiwgYm9fZ2VtLT5tYXBfY291bnQpOworCQlib19nZW0tPm1hcF9jb3VudCA9IDA7CisJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisJCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKKwl9CisKKwlEUk1MSVNUREVMKCZib19nZW0tPm5hbWVfbGlzdCk7CisKKwlidWNrZXQgPSBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldF9mb3Jfc2l6ZShidWZtZ3JfZ2VtLCBiby0+c2l6ZSk7CisJLyogUHV0IHRoZSBidWZmZXIgaW50byBvdXIgaW50ZXJuYWwgY2FjaGUgZm9yIHJldXNlIGlmIHdlIGNhbi4gKi8KKwlpZiAoYnVmbWdyX2dlbS0+Ym9fcmV1c2UgJiYgYm9fZ2VtLT5yZXVzYWJsZSAmJiBidWNrZXQgIT0gTlVMTCAmJgorCSAgICBkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwoYnVmbWdyX2dlbSwgYm9fZ2VtLAorCQkJCQkgICAgICBJOTE1X01BRFZfRE9OVE5FRUQpKSB7CisJCWJvX2dlbS0+ZnJlZV90aW1lID0gdGltZTsKKworCQlib19nZW0tPm5hbWUgPSBOVUxMOworCQlib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gLTE7CisKKwkJRFJNTElTVEFERFRBSUwoJmJvX2dlbS0+aGVhZCwgJmJ1Y2tldC0+aGVhZCk7CisJfSBlbHNlIHsKKwkJZHJtX2ludGVsX2dlbV9ib19mcmVlKGJvKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKGRybV9pbnRlbF9ibyAqYm8sCisJCQkJCQkgICAgICB0aW1lX3QgdGltZSkKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKworCWFzc2VydChhdG9taWNfcmVhZCgmYm9fZ2VtLT5yZWZjb3VudCkgPiAwKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYm9fZ2VtLT5yZWZjb3VudCkpCisJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfZmluYWwoYm8sIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlhc3NlcnQoYXRvbWljX3JlYWQoJmJvX2dlbS0+cmVmY291bnQpID4gMCk7CisKKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoJmJvX2dlbS0+cmVmY291bnQsIC0xLCAxKSkgeworCQlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9CisJCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwkJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lKTsKKworCQlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZib19nZW0tPnJlZmNvdW50KSkgeworCQkJZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9maW5hbChibywgdGltZS50dl9zZWMpOworCQkJZHJtX2ludGVsX2dlbV9jbGVhbnVwX2JvX2NhY2hlKGJ1Zm1ncl9nZW0sIHRpbWUudHZfc2VjKTsKKwkJfQorCisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHJtX2ludGVsX2dlbV9ib19tYXAoZHJtX2ludGVsX2JvICpibywgaW50IHdyaXRlX2VuYWJsZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbiBzZXRfZG9tYWluOworCWludCByZXQ7CisKKwlpZiAoYm9fZ2VtLT5pc191c2VycHRyKSB7CisJCS8qIFJldHVybiB0aGUgc2FtZSB1c2VyIHB0ciAqLworCQliby0+dmlydHVhbCA9IGJvX2dlbS0+dXNlcl92aXJ0dWFsOworCQlyZXR1cm4gMDsKKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJaWYgKGJvX2dlbS0+bWFwX2NvdW50KysgPT0gMCkKKwkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCisJaWYgKCFib19nZW0tPm1lbV92aXJ0dWFsKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCBtbWFwX2FyZzsKKworCQlEQkcoImJvX21hcDogJWQgKCVzKSwgbWFwX2NvdW50PSVkXG4iLAorCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIGJvX2dlbS0+bWFwX2NvdW50KTsKKworCQltZW1jbGVhcihtbWFwX2FyZyk7CisJCW1tYXBfYXJnLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwkJbW1hcF9hcmcuc2l6ZSA9IGJvLT5zaXplOworCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUCwKKwkJCSAgICAgICAmbW1hcF9hcmcpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldCA9IC1lcnJubzsKKwkJCURCRygiJXM6JWQ6IEVycm9yIG1hcHBpbmcgYnVmZmVyICVkICglcyk6ICVzIC5cbiIsCisJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCisJCQkgICAgYm9fZ2VtLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlWRyhWQUxHUklORF9NQUxMT0NMSUtFX0JMT0NLKG1tYXBfYXJnLmFkZHJfcHRyLCBtbWFwX2FyZy5zaXplLCAwLCAxKSk7CisJCWJvX2dlbS0+bWVtX3ZpcnR1YWwgPSAodm9pZCAqKSh1aW50cHRyX3QpIG1tYXBfYXJnLmFkZHJfcHRyOworCX0KKwlEQkcoImJvX21hcDogJWQgKCVzKSAtPiAlcFxuIiwgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCisJICAgIGJvX2dlbS0+bWVtX3ZpcnR1YWwpOworCWJvLT52aXJ0dWFsID0gYm9fZ2VtLT5tZW1fdmlydHVhbDsKKworCW1lbWNsZWFyKHNldF9kb21haW4pOworCXNldF9kb21haW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlpZiAod3JpdGVfZW5hYmxlKQorCQlzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJZWxzZQorCQlzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IDA7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX0RPTUFJTiwKKwkJICAgICAgICZzZXRfZG9tYWluKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJREJHKCIlczolZDogRXJyb3Igc2V0dGluZyB0byBDUFUgZG9tYWluICVkOiAlc1xuIiwKKwkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlpZiAod3JpdGVfZW5hYmxlKQorCQlib19nZW0tPm1hcHBlZF9jcHVfd3JpdGUgPSB0cnVlOworCisJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOworCVZHKFZBTEdSSU5EX01BS0VfTUVNX0RFRklORUQoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm8tPnNpemUpKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXBfYm8oZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCByZXQ7CisKKwlpZiAoYm9fZ2VtLT5tYXBfY291bnQrKyA9PSAwKQorCQlkcm1faW50ZWxfZ2VtX2JvX29wZW5fdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisKKwlpZiAoIWJvX2dlbS0+bWVtX3ZpcnR1YWwpIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwIG1tYXBfYXJnOworCisJCURCRygiYm9fbWFwOiAlZCAoJXMpLCBtYXBfY291bnQ9JWRcbiIsCisJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOworCisJCW1lbWNsZWFyKG1tYXBfYXJnKTsKKwkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCQltbWFwX2FyZy5zaXplID0gYm8tPnNpemU7CisJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQLAorCQkJICAgICAgICZtbWFwX2FyZyk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcmV0ID0gLWVycm5vOworCQkJREJHKCIlczolZDogRXJyb3IgbWFwcGluZyBidWZmZXIgJWQgKCVzKTogJXMgLlxuIiwKKwkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwKKwkJCSAgICBib19nZW0tPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQorCQkJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCVZHKFZBTEdSSU5EX01BTExPQ0xJS0VfQkxPQ0sobW1hcF9hcmcuYWRkcl9wdHIsIG1tYXBfYXJnLnNpemUsIDAsIDEpKTsKKwkJYm9fZ2VtLT5tZW1fdmlydHVhbCA9ICh2b2lkICopKHVpbnRwdHJfdCkgbW1hcF9hcmcuYWRkcl9wdHI7CisJfQorCURCRygiYm9fbWFwOiAlZCAoJXMpIC0+ICVwXG4iLCBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKKwkgICAgYm9fZ2VtLT5tZW1fdmlydHVhbCk7CisJYm8tPnZpcnR1YWwgPSBib19nZW0tPm1lbV92aXJ0dWFsOworCisJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOworCVZHKFZBTEdSSU5EX01BS0VfTUVNX0RFRklORUQoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm8tPnNpemUpKTsKKworCXJldHVybiAwOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2dlbV9ib19tYXBfdW5zeW5jaHJvbml6ZWRfbm9uX2d0dChkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJaW50IHJldDsKKworCWlmICghYnVmbWdyX2dlbS0+aGFzX2xsYykKKwkJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fbWFwKGJvLCB0cnVlKTsKKworCWlmIChib19nZW0tPmlzX3VzZXJwdHIpIHsKKwkJLyogUmV0dXJuIHRoZSBzYW1lIHVzZXIgcHRyICovCisJCWJvLT52aXJ0dWFsID0gYm9fZ2VtLT51c2VyX3ZpcnR1YWw7CisJCXJldHVybiAwOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJcmV0ID0gbWFwX2JvKGJvKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CittYXBfZ3R0KGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlpbnQgcmV0OworCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYm9fZ2VtLT5tYXBfY291bnQrKyA9PSAwKQorCQlkcm1faW50ZWxfZ2VtX2JvX29wZW5fdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisKKwkvKiBHZXQgYSBtYXBwaW5nIG9mIHRoZSBidWZmZXIgaWYgd2UgaGF2ZW4ndCBiZWZvcmUuICovCisJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwgPT0gTlVMTCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0IG1tYXBfYXJnOworCisJCURCRygiYm9fbWFwX2d0dDogbW1hcCAlZCAoJXMpLCBtYXBfY291bnQ9JWRcbiIsCisJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOworCisJCW1lbWNsZWFyKG1tYXBfYXJnKTsKKwkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCisJCS8qIEdldCB0aGUgZmFrZSBvZmZzZXQgYmFjay4uLiAqLworCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUF9HVFQsCisJCQkgICAgICAgJm1tYXBfYXJnKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlyZXQgPSAtZXJybm87CisJCQlEQkcoIiVzOiVkOiBFcnJvciBwcmVwYXJpbmcgYnVmZmVyIG1hcCAlZCAoJXMpOiAlcyAuXG4iLAorCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIGFuZCBtbWFwIGl0ICovCisJCWJvX2dlbS0+Z3R0X3ZpcnR1YWwgPSBkcm1fbW1hcCgwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQkJICAgICAgIE1BUF9TSEFSRUQsIGJ1Zm1ncl9nZW0tPmZkLAorCQkJCQkgICAgICAgbW1hcF9hcmcub2Zmc2V0KTsKKwkJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwgPT0gTUFQX0ZBSUxFRCkgeworCQkJYm9fZ2VtLT5ndHRfdmlydHVhbCA9IE5VTEw7CisJCQlyZXQgPSAtZXJybm87CisJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAorCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWJvLT52aXJ0dWFsID0gYm9fZ2VtLT5ndHRfdmlydHVhbDsKKworCURCRygiYm9fbWFwX2d0dDogJWQgKCVzKSAtPiAlcFxuIiwgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCisJICAgIGJvX2dlbS0+Z3R0X3ZpcnR1YWwpOworCisJcmV0dXJuIDA7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbiBzZXRfZG9tYWluOworCWludCByZXQ7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0ID0gbWFwX2d0dChibyk7CisJaWYgKHJldCkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogTm93IG1vdmUgaXQgdG8gdGhlIEdUVCBkb21haW4gc28gdGhhdCB0aGUgR1BVIGFuZCBDUFUKKwkgKiBjYWNoZXMgYXJlIGZsdXNoZWQgYW5kIHRoZSBHUFUgaXNuJ3QgYWN0aXZlbHkgdXNpbmcgdGhlCisJICogYnVmZmVyLgorCSAqCisJICogVGhlIHBhZ2VmYXVsdCBoYW5kbGVyIGRvZXMgdGhpcyBkb21haW4gY2hhbmdlIGZvciB1cyB3aGVuCisJICogaXQgaGFzIHVuYm91bmQgdGhlIEJPIGZyb20gdGhlIEdUVCwgYnV0IGl0J3MgdXAgdG8gdXMgdG8KKwkgKiB0ZWxsIGl0IHdoZW4gd2UncmUgYWJvdXQgdG8gdXNlIHRoaW5ncyBpZiB3ZSBoYWQgZG9uZQorCSAqIHJlbmRlcmluZyBhbmQgaXQgc3RpbGwgaGFwcGVucyB0byBiZSBib3VuZCB0byB0aGUgR1RULgorCSAqLworCW1lbWNsZWFyKHNldF9kb21haW4pOworCXNldF9kb21haW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwlzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX0RPTUFJTiwKKwkJICAgICAgICZzZXRfZG9tYWluKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJREJHKCIlczolZDogRXJyb3Igc2V0dGluZyBkb21haW4gJWQ6ICVzXG4iLAorCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0KKworCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKKwlWRyhWQUxHUklORF9NQUtFX01FTV9ERUZJTkVEKGJvX2dlbS0+Z3R0X3ZpcnR1YWwsIGJvLT5zaXplKSk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGVyZm9ybXMgYSBtYXBwaW5nIG9mIHRoZSBidWZmZXIgb2JqZWN0IGxpa2UgdGhlIG5vcm1hbCBHVFQKKyAqIG1hcHBpbmcsIGJ1dCBhdm9pZHMgd2FpdGluZyBmb3IgdGhlIEdQVSB0byBiZSBkb25lIHJlYWRpbmcgZnJvbSBvcgorICogcmVuZGVyaW5nIHRvIHRoZSBidWZmZXIuCisgKgorICogVGhpcyBpcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHTF9BUkJfbWFwX2J1ZmZlcl9yYW5nZTogVGhlCisgKiB1c2VyIGFza3MgdG8gY3JlYXRlIGEgYnVmZmVyLCB0aGVuIGRvZXMgYSBtYXBwaW5nLCBmaWxscyBzb21lCisgKiBzcGFjZSwgcnVucyBhIGRyYXdpbmcgY29tbWFuZCwgdGhlbiBhc2tzIHRvIG1hcCBpdCBhZ2FpbiB3aXRob3V0CisgKiBzeW5jaHJvbml6aW5nIGJlY2F1c2UgaXQgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IHdyaXRlIG92ZXIgdGhlCisgKiBkYXRhIHRoYXQgdGhlIEdQVSBpcyBidXN5IHVzaW5nIChvciwgbW9yZSBzcGVjaWZpY2FsbHksIHRoYXQgaWYgaXQKKyAqIGRvZXMgd3JpdGUgb3ZlciB0aGUgZGF0YSwgaXQgYWNrbm93bGVkZ2VzIHRoYXQgcmVuZGVyaW5nIGlzCisgKiB1bmRlZmluZWQpLgorICovCisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX21hcF91bnN5bmNocm9uaXplZChkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisjaWZkZWYgSEFWRV9WQUxHUklORAorCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworI2VuZGlmCisJaW50IHJldDsKKworCS8qIElmIHRoZSBDUFUgY2FjaGUgaXNuJ3QgY29oZXJlbnQgd2l0aCB0aGUgR1RULCB0aGVuIHVzZSBhCisJICogcmVndWxhciBzeW5jaHJvbml6ZWQgbWFwcGluZy4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgZG9uJ3QKKwkgKiB0cmFjayB3aGVyZSB0aGUgYnVmZmVyIHdhcyBsYXN0IHVzZWQgb24gdGhlIENQVSBzaWRlIGluCisJICogdGVybXMgb2YgZHJtX2ludGVsX2JvX21hcCB2cyBkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQsIHNvCisJICogd2Ugd291bGQgcG90ZW50aWFsbHkgY29ycnVwdCB0aGUgYnVmZmVyIGV2ZW4gd2hlbiB0aGUgdXNlcgorCSAqIGRvZXMgcmVhc29uYWJsZSB0aGluZ3MuCisJICovCisJaWYgKCFidWZtZ3JfZ2VtLT5oYXNfbGxjKQorCQlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0KGJvKTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlyZXQgPSBtYXBfZ3R0KGJvKTsKKwlpZiAocmV0ID09IDApIHsKKwkJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOworCQlWRyhWQUxHUklORF9NQUtFX01FTV9ERUZJTkVEKGJvX2dlbS0+Z3R0X3ZpcnR1YWwsIGJvLT5zaXplKSk7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcm1faW50ZWxfZ2VtX2JvX3VubWFwKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW07CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJaW50IHJldCA9IDA7CisKKwlpZiAoYm8gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYm9fZ2VtLT5pc191c2VycHRyKQorCQlyZXR1cm4gMDsKKworCWJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlpZiAoYm9fZ2VtLT5tYXBfY291bnQgPD0gMCkgeworCQlEQkcoImF0dGVtcHRlZCB0byB1bm1hcCBhbiB1bm1hcHBlZCBib1xuIik7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwkJLyogUHJlc2VydmUgdGhlIG9sZCBiZWhhdmlvdXIgb2YganVzdCB0cmVhdGluZyB0aGlzIGFzIGEKKwkJICogbm8tb3AgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHRoZSBlcnJvci4KKwkJICovCisJCXJldHVybiAwOworCX0KKworCWlmIChib19nZW0tPm1hcHBlZF9jcHVfd3JpdGUpIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2ggc3dfZmluaXNoOworCisJCS8qIENhdXNlIGEgZmx1c2ggdG8gaGFwcGVuIGlmIHRoZSBidWZmZXIncyBwaW5uZWQgZm9yCisJCSAqIHNjYW5vdXQsIHNvIHRoZSByZXN1bHRzIHNob3cgdXAgaW4gYSB0aW1lbHkgbWFubmVyLgorCQkgKiBVbmxpa2UgR1RUIHNldCBkb21haW5zLCB0aGlzIG9ubHkgZG9lcyB3b3JrIGlmIHRoZQorCQkgKiBidWZmZXIgc2hvdWxkIGJlIHNjYW5vdXQtcmVsYXRlZC4KKwkJICovCisJCW1lbWNsZWFyKHN3X2ZpbmlzaCk7CisJCXN3X2ZpbmlzaC5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9TV19GSU5JU0gsCisJCQkgICAgICAgJnN3X2ZpbmlzaCk7CisJCXJldCA9IHJldCA9PSAtMSA/IC1lcnJubyA6IDA7CisKKwkJYm9fZ2VtLT5tYXBwZWRfY3B1X3dyaXRlID0gZmFsc2U7CisJfQorCisJLyogV2UgbmVlZCB0byB1bm1hcCBhZnRlciBldmVyeSBpbm5vdmF0aW9uIGFzIHdlIGNhbm5vdCB0cmFjaworCSAqIGFuIG9wZW4gdm1hIGZvciBldmVyeSBibyBhcyB0aGF0IHdpbGwgZXhoYWFzdXQgdGhlIHN5c3RlbQorCSAqIGxpbWl0cyBhbmQgY2F1c2UgbGF0ZXIgZmFpbHVyZXMuCisJICovCisJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkgeworCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CisJCWJvLT52aXJ0dWFsID0gTlVMTDsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fdW5tYXBfZ3R0KGRybV9pbnRlbF9ibyAqYm8pCit7CisJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fdW5tYXAoYm8pOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX3N1YmRhdGEoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCB2b2lkICpkYXRhKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgcHdyaXRlOworCWludCByZXQ7CisKKwlpZiAoYm9fZ2VtLT5pc191c2VycHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNsZWFyKHB3cml0ZSk7CisJcHdyaXRlLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwlwd3JpdGUub2Zmc2V0ID0gb2Zmc2V0OworCXB3cml0ZS5zaXplID0gc2l6ZTsKKwlwd3JpdGUuZGF0YV9wdHIgPSAodWludDY0X3QpICh1aW50cHRyX3QpIGRhdGE7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fUFdSSVRFLAorCQkgICAgICAgJnB3cml0ZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXJldCA9IC1lcnJubzsKKwkJREJHKCIlczolZDogRXJyb3Igd3JpdGluZyBkYXRhIHRvIGJ1ZmZlciAlZDogKCVkICVkKSAlcyAuXG4iLAorCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsIChpbnQpb2Zmc2V0LAorCQkgICAgKGludClzaXplLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGNydGNfaWQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOworCXN0cnVjdCBkcm1faTkxNV9nZXRfcGlwZV9mcm9tX2NydGNfaWQgZ2V0X3BpcGVfZnJvbV9jcnRjX2lkOworCWludCByZXQ7CisKKwltZW1jbGVhcihnZXRfcGlwZV9mcm9tX2NydGNfaWQpOworCWdldF9waXBlX2Zyb21fY3J0Y19pZC5jcnRjX2lkID0gY3J0Y19pZDsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCwKKwkJICAgICAgICZnZXRfcGlwZV9mcm9tX2NydGNfaWQpOworCWlmIChyZXQgIT0gMCkgeworCQkvKiBXZSByZXR1cm4gLTEgaGVyZSB0byBzaWduYWwgdGhhdCB3ZSBkb24ndAorCQkgKiBrbm93IHdoaWNoIHBpcGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3J0Yy4KKwkJICogVGhpcyBsZXRzIHRoZSBjYWxsZXIga25vdyB0aGF0IHRoaXMgaW5mb3JtYXRpb24KKwkJICogaXNuJ3QgYXZhaWxhYmxlOyB1c2luZyB0aGUgd3JvbmcgcGlwZSBmb3IKKwkJICogdmJsYW5rIHdhaXRpbmcgY2FuIGNhdXNlIHRoZSBjaGlwc2V0IHRvIGxvY2sgdXAKKwkJICovCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gZ2V0X3BpcGVfZnJvbV9jcnRjX2lkLnBpcGU7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZ2V0X3N1YmRhdGEoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fcHJlYWQgcHJlYWQ7CisJaW50IHJldDsKKworCWlmIChib19nZW0tPmlzX3VzZXJwdHIpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtY2xlYXIocHJlYWQpOworCXByZWFkLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwlwcmVhZC5vZmZzZXQgPSBvZmZzZXQ7CisJcHJlYWQuc2l6ZSA9IHNpemU7CisJcHJlYWQuZGF0YV9wdHIgPSAodWludDY0X3QpICh1aW50cHRyX3QpIGRhdGE7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fUFJFQUQsCisJCSAgICAgICAmcHJlYWQpOworCWlmIChyZXQgIT0gMCkgeworCQlyZXQgPSAtZXJybm87CisJCURCRygiJXM6JWQ6IEVycm9yIHJlYWRpbmcgZGF0YSBmcm9tIGJ1ZmZlciAlZDogKCVkICVkKSAlcyAuXG4iLAorCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsIChpbnQpb2Zmc2V0LAorCQkgICAgKGludClzaXplLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKiBXYWl0cyBmb3IgYWxsIEdQVSByZW5kZXJpbmcgd2l0aCB0aGUgb2JqZWN0IHRvIGhhdmUgY29tcGxldGVkLiAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fd2FpdF9yZW5kZXJpbmcoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfZ2VtX2JvX3N0YXJ0X2d0dF9hY2Nlc3MoYm8sIDEpOworfQorCisvKioKKyAqIFdhaXRzIG9uIGEgQk8gZm9yIHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZS4KKyAqCisgKiBAYm86IGJ1ZmZlciBvYmplY3QgdG8gd2FpdCBmb3IKKyAqIEB0aW1lb3V0X25zOiBhbW91bnQgb2YgdGltZSB0byB3YWl0IGluIG5hbm9zZWNvbmRzLgorICogICBJZiB2YWx1ZSBpcyBsZXNzIHRoYW4gMCwgYW4gaW5maW5pdGUgd2FpdCB3aWxsIG9jY3VyLgorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgd2FpdCB3YXMgc3VjY2Vzc2Z1bCBpZS4gdGhlIGxhc3QgYmF0Y2ggcmVmZXJlbmNpbmcgdGhlCisgKiBvYmplY3QgaGFzIGNvbXBsZXRlZCB3aXRoaW4gdGhlIGFsbG90dGVkIHRpbWUuIE90aGVyd2lzZSBzb21lIG5lZ2F0aXZlIHJldHVybgorICogdmFsdWUgZGVzY3JpYmVzIHRoZSBlcnJvci4gT2YgcGFydGljdWxhciBpbnRlcmVzdCBpcyAtRVRJTUUgd2hlbiB0aGUgd2FpdCBoYXMKKyAqIGZhaWxlZCB0byB5aWVsZCB0aGUgZGVzaXJlZCByZXN1bHQuCisgKgorICogU2ltaWxhciB0byBkcm1faW50ZWxfZ2VtX2JvX3dhaXRfcmVuZGVyaW5nIGV4Y2VwdCBhIHRpbWVvdXQgcGFyYW1ldGVyIGFsbG93cworICogdGhlIG9wZXJhdGlvbiB0byBnaXZlIHVwIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4gQW5vdGhlciBzdWJ0bGUKKyAqIGRpZmZlcmVuY2UgaXMgdGhlIGludGVybmFsIGxvY2tpbmcgc2VtYW50aWNzIGFyZSBkaWZmZXJlbnQgKHRoaXMgdmFyaWFudCBkb2VzCisgKiBub3QgaG9sZCB0aGUgbG9jayBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3YWl0KS4gVGhpcyBtYWtlcyB0aGUgd2FpdCBzdWJqZWN0CisgKiB0byBhIGxhcmdlciB1c2Vyc3BhY2UgcmFjZSB3aW5kb3cuCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIHNoYWxsIHdhaXQgdW50aWwgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgYWN0aXZlbHkKKyAqIHJlZmVyZW5jZWQgd2l0aGluIGEgYmF0Y2ggYnVmZmVyIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsLiBUaGUgd2FpdCB3aWxsCisgKiBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciBpcyByZS1pc3N1ZWQgdmlhIGFub3RoZXIgdGhyZWFkLCBvciBhbiBmbGlua2VkCisgKiBoYW5kbGUuIFVzZXJzcGFjZSBtdXN0IG1ha2Ugc3VyZSB0aGlzIHJhY2UgZG9lcyBub3Qgb2NjdXIgaWYgc3VjaCBwcmVjaXNpb24KKyAqIGlzIGltcG9ydGFudC4KKyAqCisgKiBOb3RlIHRoYXQgc29tZSBrZXJuZWxzIGhhdmUgYnJva2VuIHRoZSBpbmlmaXRlIHdhaXQgZm9yIG5lZ2F0aXZlIHZhbHVlcworICogcHJvbWlzZSwgdXBncmFkZSB0byBsYXRlc3Qgc3RhYmxlIGtlcm5lbHMgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAqLworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fd2FpdChkcm1faW50ZWxfYm8gKmJvLCBpbnQ2NF90IHRpbWVvdXRfbnMpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3dhaXQgd2FpdDsKKwlpbnQgcmV0OworCisJaWYgKCFidWZtZ3JfZ2VtLT5oYXNfd2FpdF90aW1lb3V0KSB7CisJCURCRygiJXM6JWQ6IFRpbWVkIHdhaXQgaXMgbm90IHN1cHBvcnRlZC4gRmFsbGluZyBiYWNrIHRvICIKKwkJICAgICJpbmZpbml0ZSB3YWl0XG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQlpZiAodGltZW91dF9ucykgeworCQkJZHJtX2ludGVsX2dlbV9ib193YWl0X3JlbmRlcmluZyhibyk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX2J1c3koYm8pID8gLUVUSU1FIDogMDsKKwkJfQorCX0KKworCW1lbWNsZWFyKHdhaXQpOworCXdhaXQuYm9faGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCXdhaXQudGltZW91dF9ucyA9IHRpbWVvdXRfbnM7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9XQUlULCAmd2FpdCk7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC1lcnJubzsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogU2V0cyB0aGUgb2JqZWN0IHRvIHRoZSBHVFQgcmVhZCBhbmQgcG9zc2libHkgd3JpdGUgZG9tYWluLCB1c2VkIGJ5IHRoZSBYCisgKiAyRCBkcml2ZXIgaW4gdGhlIGFic2VuY2Ugb2Yga2VybmVsIHN1cHBvcnQgdG8gZG8gZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0KCkuCisgKgorICogSW4gY29tYmluYXRpb24gd2l0aCBkcm1faW50ZWxfZ2VtX2JvX3BpbigpIGFuZCBtYW51YWwgZmVuY2UgbWFuYWdlbWVudCwgd2UKKyAqIGNhbiBkbyB0aWxlZCBwaXhtYXBzIHRoaXMgd2F5LgorICovCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fc3RhcnRfZ3R0X2FjY2Vzcyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgd3JpdGVfZW5hYmxlKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluIHNldF9kb21haW47CisJaW50IHJldDsKKworCW1lbWNsZWFyKHNldF9kb21haW4pOworCXNldF9kb21haW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwlzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IHdyaXRlX2VuYWJsZSA/IEk5MTVfR0VNX0RPTUFJTl9HVFQgOiAwOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9ET01BSU4sCisJCSAgICAgICAmc2V0X2RvbWFpbik7CisJaWYgKHJldCAhPSAwKSB7CisJCURCRygiJXM6JWQ6IEVycm9yIHNldHRpbmcgbWVtb3J5IGRvbWFpbnMgJWQgKCUwOHggJTA4eCk6ICVzIC5cbiIsCisJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwKKwkJICAgIHNldF9kb21haW4ucmVhZF9kb21haW5zLCBzZXRfZG9tYWluLndyaXRlX2RvbWFpbiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fZGVzdHJveShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOworCWludCBpOworCisJZnJlZShidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzKTsKKwlmcmVlKGJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0cyk7CisJZnJlZShidWZtZ3JfZ2VtLT5leGVjX2Jvcyk7CisJZnJlZShidWZtZ3JfZ2VtLT5hdWJfZmlsZW5hbWUpOworCisJcHRocmVhZF9tdXRleF9kZXN0cm95KCZidWZtZ3JfZ2VtLT5sb2NrKTsKKworCS8qIEZyZWUgYW55IGNhY2hlZCBidWZmZXIgb2JqZWN0cyB3ZSB3ZXJlIGdvaW5nIHRvIHJldXNlICovCisJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzOyBpKyspIHsKKwkJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQgPQorCQkgICAgJmJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXTsKKwkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOworCisJCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CisJCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKKwkJCQkJICAgICAgYnVja2V0LT5oZWFkLm5leHQsIGhlYWQpOworCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKKworCQkJZHJtX2ludGVsX2dlbV9ib19mcmVlKCZib19nZW0tPmJvKTsKKwkJfQorCX0KKworCWZyZWUoYnVmbWdyKTsKK30KKworLyoqCisgKiBBZGRzIHRoZSB0YXJnZXQgYnVmZmVyIHRvIHRoZSB2YWxpZGF0aW9uIGxpc3QgYW5kIGFkZHMgdGhlIHJlbG9jYXRpb24KKyAqIHRvIHRoZSByZWxvY19idWZmZXIncyByZWxvY2F0aW9uIGxpc3QuCisgKgorICogVGhlIHJlbG9jYXRpb24gZW50cnkgYXQgdGhlIGdpdmVuIG9mZnNldCBtdXN0IGFscmVhZHkgY29udGFpbiB0aGUKKyAqIHByZWNvbXB1dGVkIHJlbG9jYXRpb24gdmFsdWUsIGJlY2F1c2UgdGhlIGtlcm5lbCB3aWxsIG9wdGltaXplIG91dAorICogdGhlIHJlbG9jYXRpb24gZW50cnkgd3JpdGUgd2hlbiB0aGUgYnVmZmVyIGhhc24ndCBtb3ZlZCBmcm9tIHRoZQorICogbGFzdCBrbm93biBvZmZzZXQgaW4gdGFyZ2V0X2JvLgorICovCitzdGF0aWMgaW50Citkb19ib19lbWl0X3JlbG9jKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvLCB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4sCisJCSBib29sIG5lZWRfZmVuY2UpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgdGFyZ2V0X2JvOworCWJvb2wgZmVuY2VkX2NvbW1hbmQ7CisKKwlpZiAoYm9fZ2VtLT5oYXNfZXJyb3IpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHRhcmdldF9ib19nZW0tPmhhc19lcnJvcikgeworCQlib19nZW0tPmhhc19lcnJvciA9IHRydWU7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFdlIG5ldmVyIHVzZSBIVyBmZW5jZXMgZm9yIHJlbmRlcmluZyBvbiA5NjUrICovCisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA0KQorCQluZWVkX2ZlbmNlID0gZmFsc2U7CisKKwlmZW5jZWRfY29tbWFuZCA9IG5lZWRfZmVuY2U7CisJaWYgKHRhcmdldF9ib19nZW0tPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJCW5lZWRfZmVuY2UgPSBmYWxzZTsKKworCS8qIENyZWF0ZSBhIG5ldyByZWxvY2F0aW9uIGxpc3QgaWYgbmVlZGVkICovCisJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgJiYgZHJtX2ludGVsX3NldHVwX3JlbG9jX2xpc3QoYm8pKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIENoZWNrIG92ZXJmbG93ICovCisJYXNzZXJ0KGJvX2dlbS0+cmVsb2NfY291bnQgPCBidWZtZ3JfZ2VtLT5tYXhfcmVsb2NzKTsKKworCS8qIENoZWNrIGFyZ3MgKi8KKwlhc3NlcnQob2Zmc2V0IDw9IGJvLT5zaXplIC0gNCk7CisJYXNzZXJ0KCh3cml0ZV9kb21haW4gJiAod3JpdGVfZG9tYWluIC0gMSkpID09IDApOworCisJLyogQW4gb2JqZWN0IG5lZWRpbmcgYSBmZW5jZSBpcyBhIHRpbGVkIGJ1ZmZlciwgc28gaXQgd29uJ3QgaGF2ZQorCSAqIHJlbG9jcyB0byBvdGhlciBidWZmZXJzLgorCSAqLworCWlmIChuZWVkX2ZlbmNlKSB7CisJCWFzc2VydCh0YXJnZXRfYm9fZ2VtLT5yZWxvY19jb3VudCA9PSAwKTsKKwkJdGFyZ2V0X2JvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAxOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIG5vdCBhZGRpbmcgYSByZWxvYyB0byBzb21ldGhpbmcgd2hvc2Ugc2l6ZSBoYXMKKwkgKiBhbHJlYWR5IGJlZW4gYWNjb3VudGVkIGZvci4KKwkgKi8KKwlhc3NlcnQoIWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQpOworCWlmICh0YXJnZXRfYm9fZ2VtICE9IGJvX2dlbSkgeworCQl0YXJnZXRfYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCA9IHRydWU7CisJCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplICs9IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfc2l6ZTsKKwkJYm9fZ2VtLT5yZWxvY190cmVlX2ZlbmNlcyArPSB0YXJnZXRfYm9fZ2VtLT5yZWxvY190cmVlX2ZlbmNlczsKKwl9CisKKwlib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS5vZmZzZXQgPSBvZmZzZXQ7CisJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0uZGVsdGEgPSB0YXJnZXRfb2Zmc2V0OworCWJvX2dlbS0+cmVsb2NzW2JvX2dlbS0+cmVsb2NfY291bnRdLnRhcmdldF9oYW5kbGUgPQorCSAgICB0YXJnZXRfYm9fZ2VtLT5nZW1faGFuZGxlOworCWJvX2dlbS0+cmVsb2NzW2JvX2dlbS0+cmVsb2NfY291bnRdLnJlYWRfZG9tYWlucyA9IHJlYWRfZG9tYWluczsKKwlib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS53cml0ZV9kb21haW4gPSB3cml0ZV9kb21haW47CisJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ucHJlc3VtZWRfb2Zmc2V0ID0gdGFyZ2V0X2JvLT5vZmZzZXQ2NDsKKworCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9bYm9fZ2VtLT5yZWxvY19jb3VudF0uYm8gPSB0YXJnZXRfYm87CisJaWYgKHRhcmdldF9ibyAhPSBibykKKwkJZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UodGFyZ2V0X2JvKTsKKwlpZiAoZmVuY2VkX2NvbW1hbmQpCisJCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9bYm9fZ2VtLT5yZWxvY19jb3VudF0uZmxhZ3MgPQorCQkJRFJNX0lOVEVMX1JFTE9DX0ZFTkNFOworCWVsc2UKKwkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tib19nZW0tPnJlbG9jX2NvdW50XS5mbGFncyA9IDA7CisKKwlib19nZW0tPnJlbG9jX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19lbWl0X3JlbG9jKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCSAgICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKKwkJCSAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsIHVpbnQzMl90IHdyaXRlX2RvbWFpbikKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7CisKKwlyZXR1cm4gZG9fYm9fZW1pdF9yZWxvYyhibywgb2Zmc2V0LCB0YXJnZXRfYm8sIHRhcmdldF9vZmZzZXQsCisJCQkJcmVhZF9kb21haW5zLCB3cml0ZV9kb21haW4sCisJCQkJIWJ1Zm1ncl9nZW0tPmZlbmNlZF9yZWxvY3MpOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2VtaXRfcmVsb2NfZmVuY2UoZHJtX2ludGVsX2JvICpibywgdWludDMyX3Qgb2Zmc2V0LAorCQkJCSAgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sCisJCQkJICB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkJCSAgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pCit7CisJcmV0dXJuIGRvX2JvX2VtaXRfcmVsb2MoYm8sIG9mZnNldCwgdGFyZ2V0X2JvLCB0YXJnZXRfb2Zmc2V0LAorCQkJCXJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLCB0cnVlKTsKK30KKworZHJtX3B1YmxpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZ2V0X3JlbG9jX2NvdW50KGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlyZXR1cm4gYm9fZ2VtLT5yZWxvY19jb3VudDsKK30KKworLyoqCisgKiBSZW1vdmVzIGV4aXN0aW5nIHJlbG9jYXRpb24gZW50cmllcyBpbiB0aGUgQk8gYWZ0ZXIgInN0YXJ0Ii4KKyAqCisgKiBUaGlzIGFsbG93cyBhIHVzZXIgdG8gYXZvaWQgYSB0d28tc3RlcCBwcm9jZXNzIGZvciBzdGF0ZSBzZXR1cCB3aXRoCisgKiBjb3VudGluZyB1cCBhbGwgdGhlIGJ1ZmZlciBvYmplY3RzIGFuZCBkb2luZyBhCisgKiBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgYmVmb3JlIGVtaXR0aW5nIGFueSBvZiB0aGUKKyAqIHJlbG9jYXRpb25zIGZvciB0aGUgc3RhdGUgc2V0dXAuICBJbnN0ZWFkLCBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUKKyAqIGJhdGNoYnVmZmVyIGluY2x1ZGluZyBkcm1faW50ZWxfZ2VtX2dldF9yZWxvY19jb3VudCgpLCBlbWl0IGFsbCB0aGUKKyAqIHN0YXRlLCBhbmQgdGhlbiBjaGVjayBpZiBpdCBzdGlsbCBmaXRzIGluIHRoZSBhcGVydHVyZS4KKyAqCisgKiBBbnkgZnVydGhlciBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgcXVlcmllcworICogaW52b2x2aW5nIHRoaXMgYnVmZmVyIGluIHRoZSB0cmVlIGFyZSB1bmRlZmluZWQgYWZ0ZXIgdGhpcyBjYWxsLgorICovCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fY2xlYXJfcmVsb2NzKGRybV9pbnRlbF9ibyAqYm8sIGludCBzdGFydCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCBpOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lKTsKKworCWFzc2VydChib19nZW0tPnJlbG9jX2NvdW50ID49IHN0YXJ0KTsKKworCS8qIFVucmVmZXJlbmNlIHRoZSBjbGVhcmVkIHRhcmdldCBidWZmZXJzICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKworCWZvciAoaSA9IHN0YXJ0OyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKSB7CisJCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9ib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvOworCQlpZiAoJnRhcmdldF9ib19nZW0tPmJvICE9IGJvKSB7CisJCQlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzIC09IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOworCQkJZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9sb2NrZWRfdGltZWQoJnRhcmdldF9ib19nZW0tPmJvLAorCQkJCQkJCQkgIHRpbWUudHZfc2VjKTsKKwkJfQorCX0KKwlib19nZW0tPnJlbG9jX2NvdW50ID0gc3RhcnQ7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKK30KKworLyoqCisgKiBXYWxrIHRoZSB0cmVlIG9mIHJlbG9jYXRpb25zIHJvb3RlZCBhdCBCTyBhbmQgYWNjdW11bGF0ZSB0aGUgbGlzdCBvZgorICogdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGFuZCB1cGRhdGUgdGhlIHJlbG9jYXRpb24gYnVmZmVycyB3aXRoCisgKiBpbmRleCB2YWx1ZXMgaW50byB0aGUgdmFsaWRhdGlvbiBsaXN0LgorICovCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJaW50IGk7CisKKwlpZiAoYm9fZ2VtLT5yZWxvY3MgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm8gKnRhcmdldF9ibyA9IGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm87CisKKwkJaWYgKHRhcmdldF9ibyA9PSBibykKKwkJCWNvbnRpbnVlOworCisJCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKKworCQkvKiBDb250aW51ZSB3YWxraW5nIHRoZSB0cmVlIGRlcHRoLWZpcnN0LiAqLworCQlkcm1faW50ZWxfZ2VtX2JvX3Byb2Nlc3NfcmVsb2ModGFyZ2V0X2JvKTsKKworCQkvKiBBZGQgdGhlIHRhcmdldCB0byB0aGUgdmFsaWRhdGUgbGlzdCAqLworCQlkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcih0YXJnZXRfYm8pOworCX0KK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYzIoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOworCWludCBpOworCisJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKKwkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvOworCQlpbnQgbmVlZF9mZW5jZTsKKworCQlpZiAodGFyZ2V0X2JvID09IGJvKQorCQkJY29udGludWU7CisKKwkJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOworCisJCS8qIENvbnRpbnVlIHdhbGtpbmcgdGhlIHRyZWUgZGVwdGgtZmlyc3QuICovCisJCWRybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYzIodGFyZ2V0X2JvKTsKKworCQluZWVkX2ZlbmNlID0gKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uZmxhZ3MgJgorCQkJICAgICAgRFJNX0lOVEVMX1JFTE9DX0ZFTkNFKTsKKworCQkvKiBBZGQgdGhlIHRhcmdldCB0byB0aGUgdmFsaWRhdGUgbGlzdCAqLworCQlkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcjIodGFyZ2V0X2JvLCBuZWVkX2ZlbmNlKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF91cGRhdGVfYnVmZmVyX29mZnNldHMoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CisJCWRybV9pbnRlbF9ibyAqYm8gPSBidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpXTsKKwkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwkJLyogVXBkYXRlIHRoZSBidWZmZXIgb2Zmc2V0ICovCisJCWlmIChidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaV0ub2Zmc2V0ICE9IGJvLT5vZmZzZXQ2NCkgeworCQkJREJHKCJCTyAlZCAoJXMpIG1pZ3JhdGVkOiAweCUwOGx4IC0+IDB4JTA4bGx4XG4iLAorCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLCBiby0+b2Zmc2V0NjQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaV0uCisJCQkgICAgb2Zmc2V0KTsKKwkJCWJvLT5vZmZzZXQ2NCA9IGJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpXS5vZmZzZXQ7CisJCQliby0+b2Zmc2V0ID0gYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2ldLm9mZnNldDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF91cGRhdGVfYnVmZmVyX29mZnNldHMyIChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OyBpKyspIHsKKwkJZHJtX2ludGVsX2JvICpibyA9IGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldOworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOworCisJCS8qIFVwZGF0ZSB0aGUgYnVmZmVyIG9mZnNldCAqLworCQlpZiAoYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpXS5vZmZzZXQgIT0gYm8tPm9mZnNldDY0KSB7CisJCQlEQkcoIkJPICVkICglcykgbWlncmF0ZWQ6IDB4JTA4bHggLT4gMHglMDhsbHhcbiIsCisJCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIGJvLT5vZmZzZXQ2NCwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0KTsKKwkJCWJvLT5vZmZzZXQ2NCA9IGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0OworCQkJYm8tPm9mZnNldCA9IGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0OworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorYXViX291dChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwgdWludDMyX3QgZGF0YSkKK3sKKwlmd3JpdGUoJmRhdGEsIDEsIDQsIGJ1Zm1ncl9nZW0tPmF1Yl9maWxlKTsKK30KKworc3RhdGljIHZvaWQKK2F1Yl9vdXRfZGF0YShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJZndyaXRlKGRhdGEsIDEsIHNpemUsIGJ1Zm1ncl9nZW0tPmF1Yl9maWxlKTsKK30KKworc3RhdGljIHZvaWQKK2F1Yl93cml0ZV9ib19kYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXVpbnQzMl90ICpkYXRhOworCXVuc2lnbmVkIGludCBpOworCisJZGF0YSA9IG1hbGxvYyhiby0+c2l6ZSk7CisJZHJtX2ludGVsX2JvX2dldF9zdWJkYXRhKGJvLCBvZmZzZXQsIHNpemUsIGRhdGEpOworCisJLyogRWFzeSBtb2RlOiB3cml0ZSBvdXQgYm8gd2l0aCBubyByZWxvY2F0aW9ucyAqLworCWlmICghYm9fZ2VtLT5yZWxvY19jb3VudCkgeworCQlhdWJfb3V0X2RhdGEoYnVmbWdyX2dlbSwgZGF0YSwgc2l6ZSk7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBPdGhlcndpc2UsIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgd2hpbGUgd3JpdGluZy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIDQ7IGkrKykgeworCQlpbnQgcjsKKwkJZm9yIChyID0gMDsgciA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IHIrKykgeworCQkJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5ICpyZWxvYzsKKwkJCWRybV9pbnRlbF9yZWxvY190YXJnZXQgKmluZm87CisKKwkJCXJlbG9jID0gJmJvX2dlbS0+cmVsb2NzW3JdOworCQkJaW5mbyA9ICZib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW3JdOworCisJCQlpZiAocmVsb2MtPm9mZnNldCA9PSBvZmZzZXQgKyBpICogNCkgeworCQkJCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9nZW07CisJCQkJdWludDMyX3QgdmFsOworCisJCQkJdGFyZ2V0X2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopaW5mby0+Ym87CisKKwkJCQl2YWwgPSByZWxvYy0+ZGVsdGE7CisJCQkJdmFsICs9IHRhcmdldF9nZW0tPmF1Yl9vZmZzZXQ7CisKKwkJCQlhdWJfb3V0KGJ1Zm1ncl9nZW0sIHZhbCk7CisJCQkJZGF0YVtpXSA9IHZhbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAociA9PSBib19nZW0tPnJlbG9jX2NvdW50KSB7CisJCQkvKiBubyByZWxvY2F0aW9uLCBqdXN0IHRoZSBkYXRhICovCisJCQlhdWJfb3V0KGJ1Zm1ncl9nZW0sIGRhdGFbaV0pOworCQl9CisJfQorCisJZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2F1Yl9ib19nZXRfYWRkcmVzcyhkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwkvKiBHaXZlIHRoZSBvYmplY3QgYSBncmFwaGljcyBhZGRyZXNzIGluIHRoZSBBVUIgZmlsZS4gIFdlCisJICogZG9uJ3QganVzdCB1c2UgdGhlIEdFTSBvYmplY3QgYWRkcmVzcyBiZWNhdXNlIHdlIGRvIEFVQgorCSAqIGR1bXBpbmcgYmVmb3JlIGV4ZWN1dGlvbiAtLSB3ZSB3YW50IHRvIHN1Y2Nlc3NmdWxseSBsb2cKKwkgKiB3aGVuIHRoZSBoYXJkd2FyZSBtaWdodCBoYW5nLCBhbmQgd2UgbWlnaHQgZXZlbiB3YW50IHRvIGF1YgorCSAqIGNhcHR1cmUgZm9yIGEgZHJpdmVyIHRyeWluZyB0byBleGVjdXRlIG9uIGEgZGlmZmVyZW50CisJICogZ2VuZXJhdGlvbiBvZiBoYXJkd2FyZSBieSBkaXNhYmxpbmcgdGhlIGFjdHVhbCBrZXJuZWwgZXhlYworCSAqIGNhbGwuCisJICovCisJYm9fZ2VtLT5hdWJfb2Zmc2V0ID0gYnVmbWdyX2dlbS0+YXViX29mZnNldDsKKwlidWZtZ3JfZ2VtLT5hdWJfb2Zmc2V0ICs9IGJvLT5zaXplOworCS8qIFhYWDogSGFuZGxlIGFwZXJ0dXJlIG92ZXJmbG93LiAqLworCWFzc2VydChidWZtZ3JfZ2VtLT5hdWJfb2Zmc2V0IDwgMjU2ICogMTAyNCAqIDEwMjQpOworfQorCitzdGF0aWMgdm9pZAorYXViX3dyaXRlX3RyYWNlX2Jsb2NrKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHN1YnR5cGUsCisJCSAgICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJYXViX291dChidWZtZ3JfZ2VtLAorCQlDTURfQVVCX1RSQUNFX0hFQURFUl9CTE9DSyB8CisJCSgoYnVmbWdyX2dlbS0+Z2VuID49IDggPyA2IDogNSkgLSAyKSk7CisJYXViX291dChidWZtZ3JfZ2VtLAorCQlBVUJfVFJBQ0VfTUVNVFlQRV9HVFQgfCB0eXBlIHwgQVVCX1RSQUNFX09QX0RBVEFfV1JJVEUpOworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgc3VidHlwZSk7CisJYXViX291dChidWZtZ3JfZ2VtLCBib19nZW0tPmF1Yl9vZmZzZXQgKyBvZmZzZXQpOworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgc2l6ZSk7CisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA4KQorCQlhdWJfb3V0KGJ1Zm1ncl9nZW0sIDApOworCWF1Yl93cml0ZV9ib19kYXRhKGJvLCBvZmZzZXQsIHNpemUpOworfQorCisvKioKKyAqIEJyZWFrIHVwIGxhcmdlIG9iamVjdHMgaW50byBtdWx0aXBsZSB3cml0ZXMuICBPdGhlcndpc2UgYSAxMjhrYiBWQk8KKyAqIHdvdWxkIG92ZXJmbG93IHRoZSAxNiBiaXRzIG9mIHNpemUgZmllbGQgaW4gdGhlIHBhY2tldCBoZWFkZXIgYW5kCisgKiBldmVyeXRoaW5nIGdvZXMgYmFkbHkgYWZ0ZXIgdGhhdC4KKyAqLworc3RhdGljIHZvaWQKK2F1Yl93cml0ZV9sYXJnZV90cmFjZV9ibG9jayhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzdWJ0eXBlLAorCQkJICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkKK3sKKwl1aW50MzJfdCBibG9ja19zaXplOworCXVpbnQzMl90IHN1Yl9vZmZzZXQ7CisKKwlmb3IgKHN1Yl9vZmZzZXQgPSAwOyBzdWJfb2Zmc2V0IDwgc2l6ZTsgc3ViX29mZnNldCArPSBibG9ja19zaXplKSB7CisJCWJsb2NrX3NpemUgPSBzaXplIC0gc3ViX29mZnNldDsKKworCQlpZiAoYmxvY2tfc2l6ZSA+IDggKiA0MDk2KQorCQkJYmxvY2tfc2l6ZSA9IDggKiA0MDk2OworCisJCWF1Yl93cml0ZV90cmFjZV9ibG9jayhibywgdHlwZSwgc3VidHlwZSwgb2Zmc2V0ICsgc3ViX29mZnNldCwKKwkJCQkgICAgICBibG9ja19zaXplKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithdWJfd3JpdGVfYm8oZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGk7CisKKwlhdWJfYm9fZ2V0X2FkZHJlc3MoYm8pOworCisJLyogV3JpdGUgb3V0IGVhY2ggYW5ub3RhdGVkIHNlY3Rpb24gc2VwYXJhdGVseS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5hdWJfYW5ub3RhdGlvbl9jb3VudDsgKytpKSB7CisJCWRybV9pbnRlbF9hdWJfYW5ub3RhdGlvbiAqYW5ub3RhdGlvbiA9CisJCQkmYm9fZ2VtLT5hdWJfYW5ub3RhdGlvbnNbaV07CisJCXVpbnQzMl90IGVuZGluZ19vZmZzZXQgPSBhbm5vdGF0aW9uLT5lbmRpbmdfb2Zmc2V0OworCQlpZiAoZW5kaW5nX29mZnNldCA+IGJvLT5zaXplKQorCQkJZW5kaW5nX29mZnNldCA9IGJvLT5zaXplOworCQlpZiAoZW5kaW5nX29mZnNldCA+IG9mZnNldCkgeworCQkJYXViX3dyaXRlX2xhcmdlX3RyYWNlX2Jsb2NrKGJvLCBhbm5vdGF0aW9uLT50eXBlLAorCQkJCQkJICAgIGFubm90YXRpb24tPnN1YnR5cGUsCisJCQkJCQkgICAgb2Zmc2V0LAorCQkJCQkJICAgIGVuZGluZ19vZmZzZXQgLSBvZmZzZXQpOworCQkJb2Zmc2V0ID0gZW5kaW5nX29mZnNldDsKKwkJfQorCX0KKworCS8qIFdyaXRlIG91dCBhbnkgcmVtYWluaW5nIHVuYW5ub3RhdGVkIGRhdGEgKi8KKwlpZiAob2Zmc2V0IDwgYm8tPnNpemUpIHsKKwkJYXViX3dyaXRlX2xhcmdlX3RyYWNlX2Jsb2NrKGJvLCBBVUJfVFJBQ0VfVFlQRV9OT1RZUEUsIDAsCisJCQkJCSAgICBvZmZzZXQsIGJvLT5zaXplIC0gb2Zmc2V0KTsKKwl9Cit9CisKKy8qCisgKiBNYWtlIGEgcmluZ2J1ZmZlciBvbiBmbHkgYW5kIGR1bXAgaXQKKyAqLworc3RhdGljIHZvaWQKK2F1Yl9idWlsZF9kdW1wX3JpbmdidWZmZXIoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCisJCQkgIHVpbnQzMl90IGJhdGNoX2J1ZmZlciwgaW50IHJpbmdfZmxhZykKK3sKKwl1aW50MzJfdCByaW5nYnVmZmVyWzQwOTZdOworCWludCByaW5nID0gQVVCX1RSQUNFX1RZUEVfUklOR19QUkIwOyAvKiBUaGUgZGVmYXVsdCByaW5nICovCisJaW50IHJpbmdfY291bnQgPSAwOworCisJaWYgKHJpbmdfZmxhZyA9PSBJOTE1X0VYRUNfQlNEKQorCQlyaW5nID0gQVVCX1RSQUNFX1RZUEVfUklOR19QUkIxOworCWVsc2UgaWYgKHJpbmdfZmxhZyA9PSBJOTE1X0VYRUNfQkxUKQorCQlyaW5nID0gQVVCX1RSQUNFX1RZUEVfUklOR19QUkIyOworCisJLyogTWFrZSBhIHJpbmcgYnVmZmVyIHRvIGV4ZWN1dGUgb3VyIGJhdGNoYnVmZmVyLiAqLworCW1lbXNldChyaW5nYnVmZmVyLCAwLCBzaXplb2YocmluZ2J1ZmZlcikpOworCWlmIChidWZtZ3JfZ2VtLT5nZW4gPj0gOCkgeworCQlyaW5nYnVmZmVyW3JpbmdfY291bnQrK10gPSBBVUJfTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDMgLSAyKTsKKwkJcmluZ2J1ZmZlcltyaW5nX2NvdW50KytdID0gYmF0Y2hfYnVmZmVyOworCQlyaW5nYnVmZmVyW3JpbmdfY291bnQrK10gPSAwOworCX0gZWxzZSB7CisJCXJpbmdidWZmZXJbcmluZ19jb3VudCsrXSA9IEFVQl9NSV9CQVRDSF9CVUZGRVJfU1RBUlQ7CisJCXJpbmdidWZmZXJbcmluZ19jb3VudCsrXSA9IGJhdGNoX2J1ZmZlcjsKKwl9CisKKwkvKiBXcml0ZSBvdXQgdGhlIHJpbmcuICBUaGlzIGFwcGVhcnMgdG8gdHJpZ2dlciBleGVjdXRpb24gb2YKKwkgKiB0aGUgcmluZyBpbiB0aGUgc2ltdWxhdG9yLgorCSAqLworCWF1Yl9vdXQoYnVmbWdyX2dlbSwKKwkJQ01EX0FVQl9UUkFDRV9IRUFERVJfQkxPQ0sgfAorCQkoKGJ1Zm1ncl9nZW0tPmdlbiA+PSA4ID8gNiA6IDUpIC0gMikpOworCWF1Yl9vdXQoYnVmbWdyX2dlbSwKKwkJQVVCX1RSQUNFX01FTVRZUEVfR1RUIHwgcmluZyB8IEFVQl9UUkFDRV9PUF9DT01NQU5EX1dSSVRFKTsKKwlhdWJfb3V0KGJ1Zm1ncl9nZW0sIDApOyAvKiBnZW5lcmFsL3N1cmZhY2Ugc3VidHlwZSAqLworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgYnVmbWdyX2dlbS0+YXViX29mZnNldCk7CisJYXViX291dChidWZtZ3JfZ2VtLCByaW5nX2NvdW50ICogNCk7CisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA4KQorCQlhdWJfb3V0KGJ1Zm1ncl9nZW0sIDApOworCisJLyogRklYTUU6IE5lZWQgc29tZSBmbHVzaCBvcGVyYXRpb25zIGhlcmU/ICovCisJYXViX291dF9kYXRhKGJ1Zm1ncl9nZW0sIHJpbmdidWZmZXIsIHJpbmdfY291bnQgKiA0KTsKKworCS8qIFVwZGF0ZSBvZmZzZXQgcG9pbnRlciAqLworCWJ1Zm1ncl9nZW0tPmF1Yl9vZmZzZXQgKz0gNDA5NjsKK30KKworZHJtX3B1YmxpYyB2b2lkCitkcm1faW50ZWxfZ2VtX2JvX2F1Yl9kdW1wX2JtcChkcm1faW50ZWxfYm8gKmJvLAorCQkJICAgICAgaW50IHgxLCBpbnQgeTEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCSAgICAgIGVudW0gYXViX2R1bXBfYm1wX2Zvcm1hdCBmb3JtYXQsCisJCQkgICAgICBpbnQgcGl0Y2gsIGludCBvZmZzZXQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOworCXVpbnQzMl90IGNwcDsKKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBBVUJfRFVNUF9CTVBfRk9STUFUXzhCSVQ6CisJCWNwcCA9IDE7CisJCWJyZWFrOworCWNhc2UgQVVCX0RVTVBfQk1QX0ZPUk1BVF9BUkdCXzQ0NDQ6CisJCWNwcCA9IDI7CisJCWJyZWFrOworCWNhc2UgQVVCX0RVTVBfQk1QX0ZPUk1BVF9BUkdCXzA4ODg6CisJY2FzZSBBVUJfRFVNUF9CTVBfRk9STUFUX0FSR0JfODg4ODoKKwkJY3BwID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIEFVQiBkdW1wIGZvcm1hdCAlZFxuIiwgZm9ybWF0KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghYnVmbWdyX2dlbS0+YXViX2ZpbGUpCisJCXJldHVybjsKKworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgQ01EX0FVQl9EVU1QX0JNUCB8IDQpOworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgKHkxIDw8IDE2KSB8IHgxKTsKKwlhdWJfb3V0KGJ1Zm1ncl9nZW0sCisJCShmb3JtYXQgPDwgMjQpIHwKKwkJKGNwcCA8PCAxOSkgfAorCQlwaXRjaCAvIDQpOworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgKGhlaWdodCA8PCAxNikgfCB3aWR0aCk7CisJYXViX291dChidWZtZ3JfZ2VtLCBib19nZW0tPmF1Yl9vZmZzZXQgKyBvZmZzZXQpOworCWF1Yl9vdXQoYnVmbWdyX2dlbSwKKwkJKChib19nZW0tPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpID8gKDEgPDwgMikgOiAwKSB8CisJCSgoYm9fZ2VtLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKSA/ICgxIDw8IDMpIDogMCkpOworfQorCitzdGF0aWMgdm9pZAorYXViX2V4ZWMoZHJtX2ludGVsX2JvICpibywgaW50IHJpbmdfZmxhZywgaW50IHVzZWQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlpbnQgaTsKKwlib29sIGJhdGNoX2J1ZmZlcl9uZWVkc19hbm5vdGF0aW9uczsKKworCWlmICghYnVmbWdyX2dlbS0+YXViX2ZpbGUpCisJCXJldHVybjsKKworCS8qIElmIGJhdGNoIGJ1ZmZlciBpcyBub3QgYW5ub3RhdGVkLCBhbm5vdGF0ZSBpdCB0aGUgYmVzdCB3ZQorCSAqIGNhbi4KKwkgKi8KKwliYXRjaF9idWZmZXJfbmVlZHNfYW5ub3RhdGlvbnMgPSBib19nZW0tPmF1Yl9hbm5vdGF0aW9uX2NvdW50ID09IDA7CisJaWYgKGJhdGNoX2J1ZmZlcl9uZWVkc19hbm5vdGF0aW9ucykgeworCQlkcm1faW50ZWxfYXViX2Fubm90YXRpb24gYW5ub3RhdGlvbnNbMl0gPSB7CisJCQl7IEFVQl9UUkFDRV9UWVBFX0JBVENILCAwLCB1c2VkIH0sCisJCQl7IEFVQl9UUkFDRV9UWVBFX05PVFlQRSwgMCwgYm8tPnNpemUgfQorCQl9OworCQlkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2Fubm90YXRpb25zKGJvLCBhbm5vdGF0aW9ucywgMik7CisJfQorCisJLyogV3JpdGUgb3V0IGFsbCBidWZmZXJzIHRvIEFVQiBtZW1vcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CisJCWF1Yl93cml0ZV9ibyhidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpXSk7CisJfQorCisJLyogUmVtb3ZlIGFueSBhbm5vdGF0aW9ucyB3ZSBhZGRlZCAqLworCWlmIChiYXRjaF9idWZmZXJfbmVlZHNfYW5ub3RhdGlvbnMpCisJCWRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfYW5ub3RhdGlvbnMoYm8sIE5VTEwsIDApOworCisJLyogRHVtcCByaW5nIGJ1ZmZlciAqLworCWF1Yl9idWlsZF9kdW1wX3JpbmdidWZmZXIoYnVmbWdyX2dlbSwgYm9fZ2VtLT5hdWJfb2Zmc2V0LCByaW5nX2ZsYWcpOworCisJZmZsdXNoKGJ1Zm1ncl9nZW0tPmF1Yl9maWxlKTsKKworCS8qCisJICogT25lIGZyYW1lIGhhcyBiZWVuIGR1bXBlZC4gU28gcmVzZXQgdGhlIGF1Yl9vZmZzZXQgZm9yIHRoZSBuZXh0IGZyYW1lLgorCSAqCisJICogRklYTUU6IENhbiB3ZSBkbyB0aGlzPworCSAqLworCWJ1Zm1ncl9nZW0tPmF1Yl9vZmZzZXQgPSAweDEwMDAwOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2V4ZWMoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCSAgICAgIGRybV9jbGlwX3JlY3RfdCAqIGNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsIGludCBEUjQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIgZXhlY2J1ZjsKKwlpbnQgcmV0LCBpOworCisJaWYgKGJvX2dlbS0+aGFzX2Vycm9yKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJLyogVXBkYXRlIGluZGljZXMgYW5kIHNldCB1cCB0aGUgdmFsaWRhdGUgbGlzdC4gKi8KKwlkcm1faW50ZWxfZ2VtX2JvX3Byb2Nlc3NfcmVsb2MoYm8pOworCisJLyogQWRkIHRoZSBiYXRjaCBidWZmZXIgdG8gdGhlIHZhbGlkYXRpb24gbGlzdC4gIFRoZXJlIGFyZSBubworCSAqIHJlbG9jYXRpb25zIHBvaW50aW5nIHRvIGl0LgorCSAqLworCWRybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyKGJvKTsKKworCW1lbWNsZWFyKGV4ZWNidWYpOworCWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodWludHB0cl90KSBidWZtZ3JfZ2VtLT5leGVjX29iamVjdHM7CisJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OworCWV4ZWNidWYuYmF0Y2hfc3RhcnRfb2Zmc2V0ID0gMDsKKwlleGVjYnVmLmJhdGNoX2xlbiA9IHVzZWQ7CisJZXhlY2J1Zi5jbGlwcmVjdHNfcHRyID0gKHVpbnRwdHJfdCkgY2xpcHJlY3RzOworCWV4ZWNidWYubnVtX2NsaXByZWN0cyA9IG51bV9jbGlwcmVjdHM7CisJZXhlY2J1Zi5EUjEgPSAwOworCWV4ZWNidWYuRFI0ID0gRFI0OworCisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUiwKKwkJICAgICAgICZleGVjYnVmKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0ID0gLWVycm5vOworCQlpZiAoZXJybm8gPT0gRU5PU1BDKSB7CisJCQlEQkcoIkV4ZWNidWZmZXIgZmFpbHMgdG8gcGluLiAiCisJCQkgICAgIkVzdGltYXRlOiAldS4gQWN0dWFsOiAldS4gQXZhaWxhYmxlOiAldVxuIiwKKwkJCSAgICBkcm1faW50ZWxfZ2VtX2VzdGltYXRlX2JhdGNoX3NwYWNlKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zLAorCQkJCQkJCSAgICAgICBidWZtZ3JfZ2VtLT4KKwkJCQkJCQkgICAgICAgZXhlY19jb3VudCksCisJCQkgICAgZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zLAorCQkJCQkJCSAgICAgIGJ1Zm1ncl9nZW0tPgorCQkJCQkJCSAgICAgIGV4ZWNfY291bnQpLAorCQkJICAgICh1bnNpZ25lZCBpbnQpYnVmbWdyX2dlbS0+Z3R0X3NpemUpOworCQl9CisJfQorCWRybV9pbnRlbF91cGRhdGVfYnVmZmVyX29mZnNldHMoYnVmbWdyX2dlbSk7CisKKwlpZiAoYnVmbWdyX2dlbS0+YnVmbWdyLmRlYnVnKQorCQlkcm1faW50ZWxfZ2VtX2R1bXBfdmFsaWRhdGlvbl9saXN0KGJ1Zm1ncl9nZW0pOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm8gKmJvID0gYnVmbWdyX2dlbS0+ZXhlY19ib3NbaV07CisJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJCWJvX2dlbS0+aWRsZSA9IGZhbHNlOworCisJCS8qIERpc2Nvbm5lY3QgdGhlIGJ1ZmZlciBmcm9tIHRoZSB2YWxpZGF0ZSBsaXN0ICovCisJCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKKwkJYnVmbWdyX2dlbS0+ZXhlY19ib3NbaV0gPSBOVUxMOworCX0KKwlidWZtZ3JfZ2VtLT5leGVjX2NvdW50ID0gMDsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citkb19leGVjMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwgZHJtX2ludGVsX2NvbnRleHQgKmN0eCwKKwkgZHJtX2NsaXBfcmVjdF90ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLCBpbnQgRFI0LAorCSB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKiliby0+YnVmbWdyOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCXN3aXRjaCAoZmxhZ3MgJiAweDcpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEk5MTVfRVhFQ19CTFQ6CisJCWlmICghYnVmbWdyX2dlbS0+aGFzX2JsdCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEk5MTVfRVhFQ19CU0Q6CisJCWlmICghYnVmbWdyX2dlbS0+aGFzX2JzZCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEk5MTVfRVhFQ19WRUJPWDoKKwkJaWYgKCFidWZtZ3JfZ2VtLT5oYXNfdmVib3gpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0VYRUNfUkVOREVSOgorCWNhc2UgSTkxNV9FWEVDX0RFRkFVTFQ6CisJCWJyZWFrOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJLyogVXBkYXRlIGluZGljZXMgYW5kIHNldCB1cCB0aGUgdmFsaWRhdGUgbGlzdC4gKi8KKwlkcm1faW50ZWxfZ2VtX2JvX3Byb2Nlc3NfcmVsb2MyKGJvKTsKKworCS8qIEFkZCB0aGUgYmF0Y2ggYnVmZmVyIHRvIHRoZSB2YWxpZGF0aW9uIGxpc3QuICBUaGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMKKwkgKiBwb2ludGluZyB0byBpdC4KKwkgKi8KKwlkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcjIoYm8sIDApOworCisJbWVtY2xlYXIoZXhlY2J1Zik7CisJZXhlY2J1Zi5idWZmZXJzX3B0ciA9ICh1aW50cHRyX3QpYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0czsKKwlleGVjYnVmLmJ1ZmZlcl9jb3VudCA9IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7CisJZXhlY2J1Zi5iYXRjaF9zdGFydF9vZmZzZXQgPSAwOworCWV4ZWNidWYuYmF0Y2hfbGVuID0gdXNlZDsKKwlleGVjYnVmLmNsaXByZWN0c19wdHIgPSAodWludHB0cl90KWNsaXByZWN0czsKKwlleGVjYnVmLm51bV9jbGlwcmVjdHMgPSBudW1fY2xpcHJlY3RzOworCWV4ZWNidWYuRFIxID0gMDsKKwlleGVjYnVmLkRSNCA9IERSNDsKKwlleGVjYnVmLmZsYWdzID0gZmxhZ3M7CisJaWYgKGN0eCA9PSBOVUxMKQorCQlpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0X2lkKGV4ZWNidWYsIDApOworCWVsc2UKKwkJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVmLCBjdHgtPmN0eF9pZCk7CisJZXhlY2J1Zi5yc3ZkMiA9IDA7CisKKwlhdWJfZXhlYyhibywgZmxhZ3MsIHVzZWQpOworCisJaWYgKGJ1Zm1ncl9nZW0tPm5vX2V4ZWMpCisJCWdvdG8gc2tpcF9leGVjdXRpb247CisKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwKKwkJICAgICAgICZleGVjYnVmKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0ID0gLWVycm5vOworCQlpZiAocmV0ID09IC1FTk9TUEMpIHsKKwkJCURCRygiRXhlY2J1ZmZlciBmYWlscyB0byBwaW4uICIKKwkJCSAgICAiRXN0aW1hdGU6ICV1LiBBY3R1YWw6ICV1LiBBdmFpbGFibGU6ICV1XG4iLAorCQkJICAgIGRybV9pbnRlbF9nZW1fZXN0aW1hdGVfYmF0Y2hfc3BhY2UoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCisJCQkJCQkJICAgICAgIGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQpLAorCQkJICAgIGRybV9pbnRlbF9nZW1fY29tcHV0ZV9iYXRjaF9zcGFjZShidWZtZ3JfZ2VtLT5leGVjX2JvcywKKwkJCQkJCQkgICAgICBidWZtZ3JfZ2VtLT5leGVjX2NvdW50KSwKKwkJCSAgICAodW5zaWduZWQgaW50KSBidWZtZ3JfZ2VtLT5ndHRfc2l6ZSk7CisJCX0KKwl9CisJZHJtX2ludGVsX3VwZGF0ZV9idWZmZXJfb2Zmc2V0czIoYnVmbWdyX2dlbSk7CisKK3NraXBfZXhlY3V0aW9uOgorCWlmIChidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcpCisJCWRybV9pbnRlbF9nZW1fZHVtcF92YWxpZGF0aW9uX2xpc3QoYnVmbWdyX2dlbSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CisJCWRybV9pbnRlbF9ibyAqYm8gPSBidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpXTsKKwkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKilibzsKKworCQlib19nZW0tPmlkbGUgPSBmYWxzZTsKKworCQkvKiBEaXNjb25uZWN0IHRoZSBidWZmZXIgZnJvbSB0aGUgdmFsaWRhdGUgbGlzdCAqLworCQlib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gLTE7CisJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldID0gTlVMTDsKKwl9CisJYnVmbWdyX2dlbS0+ZXhlY19jb3VudCA9IDA7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19leGVjMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwKKwkJICAgICAgIGRybV9jbGlwX3JlY3RfdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywKKwkJICAgICAgIGludCBEUjQpCit7CisJcmV0dXJuIGRvX2V4ZWMyKGJvLCB1c2VkLCBOVUxMLCBjbGlwcmVjdHMsIG51bV9jbGlwcmVjdHMsIERSNCwKKwkJCUk5MTVfRVhFQ19SRU5ERVIpOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX21yYl9leGVjMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwKKwkJCWRybV9jbGlwX3JlY3RfdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCwKKwkJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIE5VTEwsIGNsaXByZWN0cywgbnVtX2NsaXByZWN0cywgRFI0LAorCQkJZmxhZ3MpOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2dlbV9ib19jb250ZXh0X2V4ZWMoZHJtX2ludGVsX2JvICpibywgZHJtX2ludGVsX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIGludCB1c2VkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGRvX2V4ZWMyKGJvLCB1c2VkLCBjdHgsIE5VTEwsIDAsIDAsIGZsYWdzKTsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19waW4oZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgYWxpZ25tZW50KQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9waW4gcGluOworCWludCByZXQ7CisKKwltZW1jbGVhcihwaW4pOworCXBpbi5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJcGluLmFsaWdubWVudCA9IGFsaWdubWVudDsKKworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1BJTiwKKwkJICAgICAgICZwaW4pOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWJvLT5vZmZzZXQ2NCA9IHBpbi5vZmZzZXQ7CisJYm8tPm9mZnNldCA9IHBpbi5vZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fdW5waW4oZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fdW5waW4gdW5waW47CisJaW50IHJldDsKKworCW1lbWNsZWFyKHVucGluKTsKKwl1bnBpbi5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX1VOUElOLCAmdW5waW4pOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIC1lcnJubzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoZHJtX2ludGVsX2JvICpibywKKwkJCQkgICAgIHVpbnQzMl90IHRpbGluZ19tb2RlLAorCQkJCSAgICAgdWludDMyX3Qgc3RyaWRlKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfdGlsaW5nIHNldF90aWxpbmc7CisJaW50IHJldDsKKworCWlmIChib19nZW0tPmdsb2JhbF9uYW1lID09IDAgJiYKKwkgICAgdGlsaW5nX21vZGUgPT0gYm9fZ2VtLT50aWxpbmdfbW9kZSAmJgorCSAgICBzdHJpZGUgPT0gYm9fZ2VtLT5zdHJpZGUpCisJCXJldHVybiAwOworCisJbWVtc2V0KCZzZXRfdGlsaW5nLCAwLCBzaXplb2Yoc2V0X3RpbGluZykpOworCWRvIHsKKwkJLyogc2V0X3RpbGluZyBpcyBzbGlnaHRseSBicm9rZW4gYW5kIG92ZXJ3cml0ZXMgdGhlCisJCSAqIGlucHV0IG9uIHRoZSBlcnJvciBwYXRoLCBzbyB3ZSBoYXZlIHRvIG9wZW4gY29kZQorCQkgKiBybUlvY3RsLgorCQkgKi8KKwkJc2V0X3RpbGluZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJCXNldF90aWxpbmcudGlsaW5nX21vZGUgPSB0aWxpbmdfbW9kZTsKKwkJc2V0X3RpbGluZy5zdHJpZGUgPSBzdHJpZGU7CisKKwkJcmV0ID0gaW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCQkgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9USUxJTkcsCisJCQkgICAgJnNldF90aWxpbmcpOworCX0gd2hpbGUgKHJldCA9PSAtMSAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSk7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC1lcnJubzsKKworCWJvX2dlbS0+dGlsaW5nX21vZGUgPSBzZXRfdGlsaW5nLnRpbGluZ19tb2RlOworCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gc2V0X3RpbGluZy5zd2l6emxlX21vZGU7CisJYm9fZ2VtLT5zdHJpZGUgPSBzZXRfdGlsaW5nLnN0cmlkZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19zZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCisJCQkgICAgdWludDMyX3Qgc3RyaWRlKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJaW50IHJldDsKKworCS8qIFRpbGluZyB3aXRoIHVzZXJwdHIgc3VyZmFjZXMgaXMgbm90IHN1cHBvcnRlZAorCSAqIG9uIGFsbCBoYXJkd2FyZSBzbyByZWZ1c2UgaXQgZm9yIHRpbWUgYmVpbmcuCisJICovCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBMaW5lYXIgYnVmZmVycyBoYXZlIG5vIHN0cmlkZS4gQnkgZW5zdXJpbmcgdGhhdCB3ZSBvbmx5IGV2ZXIgdXNlCisJICogc3RyaWRlIDAgd2l0aCBsaW5lYXIgYnVmZmVycywgd2Ugc2ltcGxpZnkgb3VyIGNvZGUuCisJICovCisJaWYgKCp0aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQorCQlzdHJpZGUgPSAwOworCisJcmV0ID0gZHJtX2ludGVsX2dlbV9ib19zZXRfdGlsaW5nX2ludGVybmFsKGJvLCAqdGlsaW5nX21vZGUsIHN0cmlkZSk7CisJaWYgKHJldCA9PSAwKQorCQlkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisKKwkqdGlsaW5nX21vZGUgPSBib19nZW0tPnRpbGluZ19tb2RlOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZ2V0X3RpbGluZyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAorCQkJICAgIHVpbnQzMl90ICogc3dpenpsZV9tb2RlKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJKnRpbGluZ19tb2RlID0gYm9fZ2VtLT50aWxpbmdfbW9kZTsKKwkqc3dpenpsZV9tb2RlID0gYm9fZ2VtLT5zd2l6emxlX21vZGU7CisJcmV0dXJuIDA7Cit9CisKK2RybV9wdWJsaWMgZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9ib19nZW1fY3JlYXRlX2Zyb21fcHJpbWUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgcHJpbWVfZmQsIGludCBzaXplKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKKwlpbnQgcmV0OworCXVpbnQzMl90IGhhbmRsZTsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CisJc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nIGdldF90aWxpbmc7CisJZHJtTU1MaXN0SGVhZCAqbGlzdDsKKworCXJldCA9IGRybVByaW1lRkRUb0hhbmRsZShidWZtZ3JfZ2VtLT5mZCwgcHJpbWVfZmQsICZoYW5kbGUpOworCisJLyoKKwkgKiBTZWUgaWYgdGhlIGtlcm5lbCBoYXMgYWxyZWFkeSByZXR1cm5lZCB0aGlzIGJ1ZmZlciB0byB1cy4gSnVzdCBhcworCSAqIGZvciBuYW1lZCBidWZmZXJzLCB3ZSBtdXN0IG5vdCBjcmVhdGUgdHdvIGJvJ3MgcG9pbnRpbmcgYXQgdGhlIHNhbWUKKwkgKiBrZXJuZWwgb2JqZWN0CisJICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwlmb3IgKGxpc3QgPSBidWZtZ3JfZ2VtLT5uYW1lZC5uZXh0OworCSAgICAgbGlzdCAhPSAmYnVmbWdyX2dlbS0+bmFtZWQ7CisJICAgICBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwgbGlzdCwgbmFtZV9saXN0KTsKKwkJaWYgKGJvX2dlbS0+Z2VtX2hhbmRsZSA9PSBoYW5kbGUpIHsKKwkJCWRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKCZib19nZW0tPmJvKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwkJCXJldHVybiAmYm9fZ2VtLT5ibzsKKwkJfQorCX0KKworCWlmIChyZXQpIHsKKwkgIGZwcmludGYoc3RkZXJyLCJyZXQgaXMgJWQgJWRcbiIsIHJldCwgZXJybm8pOworCSAgcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlib19nZW0gPSBjYWxsb2MoMSwgc2l6ZW9mKCpib19nZW0pKTsKKwlpZiAoIWJvX2dlbSkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBEZXRlcm1pbmUgc2l6ZSBvZiBiby4gIFRoZSBmZC10by1oYW5kbGUgaW9jdGwgcmVhbGx5IHNob3VsZAorCSAqIHJldHVybiB0aGUgc2l6ZSwgYnV0IGl0IGRvZXNuJ3QuICBJZiB3ZSBoYXZlIGtlcm5lbCAzLjEyIG9yCisJICogbGF0ZXIsIHdlIGNhbiBsc2VlayBvbiB0aGUgcHJpbWUgZmQgdG8gZ2V0IHRoZSBzaXplLiAgT2xkZXIKKwkgKiBrZXJuZWxzIHdpbGwganVzdCBmYWlsLCBpbiB3aGljaCBjYXNlIHdlIGZhbGwgYmFjayB0byB0aGUKKwkgKiBwcm92aWRlZCAoZXN0aW1hdGVkIG9yIGd1ZXNzIHNpemUpLiAqLworCXJldCA9IGxzZWVrKHByaW1lX2ZkLCAwLCBTRUVLX0VORCk7CisJaWYgKHJldCAhPSAtMSkKKwkJYm9fZ2VtLT5iby5zaXplID0gcmV0OworCWVsc2UKKwkJYm9fZ2VtLT5iby5zaXplID0gc2l6ZTsKKworCWJvX2dlbS0+Ym8uaGFuZGxlID0gaGFuZGxlOworCWJvX2dlbS0+Ym8uYnVmbWdyID0gYnVmbWdyOworCisJYm9fZ2VtLT5nZW1faGFuZGxlID0gaGFuZGxlOworCisJYXRvbWljX3NldCgmYm9fZ2VtLT5yZWZjb3VudCwgMSk7CisKKwlib19nZW0tPm5hbWUgPSAicHJpbWUiOworCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKKwlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzID0gMDsKKwlib19nZW0tPnVzZWRfYXNfcmVsb2NfdGFyZ2V0ID0gZmFsc2U7CisJYm9fZ2VtLT5oYXNfZXJyb3IgPSBmYWxzZTsKKwlib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CisKKwlEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOworCURSTUxJU1RBRERUQUlMKCZib19nZW0tPm5hbWVfbGlzdCwgJmJ1Zm1ncl9nZW0tPm5hbWVkKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwltZW1jbGVhcihnZXRfdGlsaW5nKTsKKwlnZXRfdGlsaW5nLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfVElMSU5HLAorCQkgICAgICAgJmdldF90aWxpbmcpOworCWlmIChyZXQgIT0gMCkgeworCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlKCZib19nZW0tPmJvKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWJvX2dlbS0+dGlsaW5nX21vZGUgPSBnZXRfdGlsaW5nLnRpbGluZ19tb2RlOworCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gZ2V0X3RpbGluZy5zd2l6emxlX21vZGU7CisJLyogWFhYIHN0cmlkZSBpcyB1bmtub3duICovCisJZHJtX2ludGVsX2JvX2dlbV9zZXRfaW5fYXBlcnR1cmVfc2l6ZShidWZtZ3JfZ2VtLCBib19nZW0pOworCisJcmV0dXJuICZib19nZW0tPmJvOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2JvX2dlbV9leHBvcnRfdG9fcHJpbWUoZHJtX2ludGVsX2JvICpibywgaW50ICpwcmltZV9mZCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKyAgICAgICAgaWYgKERSTUxJU1RFTVBUWSgmYm9fZ2VtLT5uYW1lX2xpc3QpKQorICAgICAgICAgICAgICAgIERSTUxJU1RBRERUQUlMKCZib19nZW0tPm5hbWVfbGlzdCwgJmJ1Zm1ncl9nZW0tPm5hbWVkKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlpZiAoZHJtUHJpbWVIYW5kbGVUb0ZEKGJ1Zm1ncl9nZW0tPmZkLCBib19nZW0tPmdlbV9oYW5kbGUsCisJCQkgICAgICAgRFJNX0NMT0VYRUMsIHByaW1lX2ZkKSAhPSAwKQorCQlyZXR1cm4gLWVycm5vOworCisJYm9fZ2VtLT5yZXVzYWJsZSA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZmxpbmsoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiBuYW1lKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJaW50IHJldDsKKworCWlmICghYm9fZ2VtLT5nbG9iYWxfbmFtZSkgeworCQlzdHJ1Y3QgZHJtX2dlbV9mbGluayBmbGluazsKKworCQltZW1jbGVhcihmbGluayk7CisJCWZsaW5rLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKworCQlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfR0VNX0ZMSU5LLCAmZmxpbmspOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwkJCXJldHVybiAtZXJybm87CisJCX0KKworCQlib19nZW0tPmdsb2JhbF9uYW1lID0gZmxpbmsubmFtZTsKKwkJYm9fZ2VtLT5yZXVzYWJsZSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKERSTUxJU1RFTVBUWSgmYm9fZ2VtLT5uYW1lX2xpc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgRFJNTElTVEFERFRBSUwoJmJvX2dlbS0+bmFtZV9saXN0LCAmYnVmbWdyX2dlbS0+bmFtZWQpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJfQorCisJKm5hbWUgPSBib19nZW0tPmdsb2JhbF9uYW1lOworCXJldHVybiAwOworfQorCisvKioKKyAqIEVuYWJsZXMgdW5saW1pdGVkIGNhY2hpbmcgb2YgYnVmZmVyIG9iamVjdHMgZm9yIHJldXNlLgorICoKKyAqIFRoaXMgaXMgcG90ZW50aWFsbHkgdmVyeSBtZW1vcnkgZXhwZW5zaXZlLCBhcyB0aGUgY2FjaGUgYXQgZWFjaCBidWNrZXQKKyAqIHNpemUgaXMgb25seSBib3VuZGVkIGJ5IGhvdyBtYW55IGJ1ZmZlcnMgb2YgdGhhdCBzaXplIHdlJ3ZlIG1hbmFnZWQgdG8gaGF2ZQorICogaW4gZmxpZ2h0IGF0IG9uY2UuCisgKi8KK2RybV9wdWJsaWMgdm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3JldXNlKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7CisKKwlidWZtZ3JfZ2VtLT5ib19yZXVzZSA9IHRydWU7Cit9CisKKy8qKgorICogRW5hYmxlIHVzZSBvZiBmZW5jZWQgcmVsb2MgdHlwZS4KKyAqCisgKiBOZXcgY29kZSBzaG91bGQgZW5hYmxlIHRoaXMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZmVuY2UgcmVnaXN0ZXIKKyAqIGFsbG9jYXRpb24uICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgZW5hYmxlZCwgYWxsIHJlbG9jcyB3aWxsIGhhdmUgZmVuY2UKKyAqIHJlZ2lzdGVyIGFsbG9jYXRlZC4KKyAqLworZHJtX3B1YmxpYyB2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfZmVuY2VkX3JlbG9jcyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CisKKwlpZiAoYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2V4ZWMgPT0gZHJtX2ludGVsX2dlbV9ib19leGVjMikKKwkJYnVmbWdyX2dlbS0+ZmVuY2VkX3JlbG9jcyA9IHRydWU7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBhZGRpdGlvbmFsIGFwZXJ0dXJlIHNwYWNlIHJlcXVpcmVkIGJ5IHRoZSB0cmVlIG9mIGJ1ZmZlciBvYmplY3RzCisgKiByb290ZWQgYXQgYm8uCisgKi8KK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJaW50IGk7CisJaW50IHRvdGFsID0gMDsKKworCWlmIChibyA9PSBOVUxMIHx8IGJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUpCisJCXJldHVybiAwOworCisJdG90YWwgKz0gYm8tPnNpemU7CisJYm9fZ2VtLT5pbmNsdWRlZF9pbl9jaGVja19hcGVydHVyZSA9IHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKQorCQl0b3RhbCArPQorCQkgICAgZHJtX2ludGVsX2dlbV9ib19nZXRfYXBlcnR1cmVfc3BhY2UoYm9fZ2VtLT4KKwkJCQkJCQlyZWxvY190YXJnZXRfaW5mb1tpXS5ibyk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogQ291bnQgdGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoaXMgbGlzdCB0aGF0IG5lZWQgYSBmZW5jZSByZWcKKyAqCisgKiBJZiB0aGUgY291bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHJlZ3MsIHdlJ2xsIGhhdmUKKyAqIHRvIGFzayB0aGUgY2FsbGVyIHRvIHJlc3VibWl0IGEgYmF0Y2ggd2l0aCBmZXdlciB0aWxlZCBidWZmZXJzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gb3Zlci1jb3VudHMgaWYgdGhlIHNhbWUgYnVmZmVyIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2RybV9pbnRlbF9nZW1fdG90YWxfZmVuY2VzKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19hcnJheVtpXTsKKworCQlpZiAoYm9fZ2VtID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQl0b3RhbCArPSBib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOworCX0KKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogQ2xlYXIgdGhlIGZsYWcgc2V0IGJ5IGRybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKCkgc28gd2UncmUgcmVhZHkKKyAqIGZvciB0aGUgbmV4dCBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgY2FsbC4KKyAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fY2xlYXJfYXBlcnR1cmVfc3BhY2VfZmxhZyhkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCBpOworCisJaWYgKGJvID09IE5VTEwgfHwgIWJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUpCisJCXJldHVybjsKKworCWJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUgPSBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspCisJCWRybV9pbnRlbF9nZW1fYm9fY2xlYXJfYXBlcnR1cmVfc3BhY2VfZmxhZyhib19nZW0tPgorCQkJCQkJCSAgIHJlbG9jX3RhcmdldF9pbmZvW2ldLmJvKTsKK30KKworLyoqCisgKiBSZXR1cm4gYSBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgZm9yIHRoZSBhbW91bnQgb2YgYXBlcnR1cmUgcmVxdWlyZWQKKyAqIGZvciBhIGNvbGxlY3Rpb24gb2YgYnVmZmVycy4gVGhpcyBtYXkgZG91YmxlLWNvdW50IHNvbWUgYnVmZmVycy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShkcm1faW50ZWxfYm8gKipib19hcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19hcnJheVtpXTsKKwkJaWYgKGJvX2dlbSAhPSBOVUxMKQorCQkJdG90YWwgKz0gYm9fZ2VtLT5yZWxvY190cmVlX3NpemU7CisJfQorCXJldHVybiB0b3RhbDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBhcGVydHVyZSBuZWVkZWQgZm9yIGEgY29sbGVjdGlvbiBvZiBidWZmZXJzLgorICogVGhpcyBhdm9pZHMgZG91YmxlIGNvdW50aW5nIGFueSBidWZmZXJzLCBhdCB0aGUgY29zdCBvZiBsb29raW5nCisgKiBhdCBldmVyeSBidWZmZXIgaW4gdGhlIHNldC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGRybV9pbnRlbF9ibyAqKmJvX2FycmF5LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHRvdGFsID0gMDsKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbTsKKworCWlmIChjb3VudCA9PSAwKQorCSAgICByZXR1cm4gMDsKKworCS8qIFByb3RlY3QgYWNjZXNzZXMgdG8gYXBlcnR1cmUgY291bnRpbmcgZmxhZ3MuCisJICovCisJYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBib19hcnJheVswXS0+YnVmbWdyOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl0b3RhbCArPSBkcm1faW50ZWxfZ2VtX2JvX2dldF9hcGVydHVyZV9zcGFjZShib19hcnJheVtpXSk7CisJCS8qIEZvciB0aGUgZmlyc3QgYnVmZmVyIG9iamVjdCBpbiB0aGUgYXJyYXksIHdlIGdldCBhbgorCQkgKiBhY2N1cmF0ZSBjb3VudCBiYWNrIGZvciBpdHMgcmVsb2NfdHJlZSBzaXplIChzaW5jZSBub3RoaW5nCisJCSAqIGhhZCBiZWVuIGZsYWdnZWQgYXMgYmVpbmcgY291bnRlZCB5ZXQpLiAgV2UgY2FuIHNhdmUgdGhhdAorCQkgKiB2YWx1ZSBvdXQgYXMgYSBtb3JlIGNvbnNlcnZhdGl2ZSByZWxvY190cmVlX3NpemUgdGhhdAorCQkgKiBhdm9pZHMgZG91YmxlLWNvdW50aW5nIHRhcmdldCBidWZmZXJzLiAgU2luY2UgdGhlIGZpcnN0CisJCSAqIGJ1ZmZlciBoYXBwZW5zIHRvIHVzdWFsbHkgYmUgdGhlIGJhdGNoIGJ1ZmZlciBpbiBvdXIKKwkJICogY2FsbGVycywgdGhpcyBjYW4gcHVsbCB1cyBiYWNrIGZyb20gZG9pbmcgdGhlIHRyZWUKKwkJICogd2FsayBvbiBldmVyeSBuZXcgYmF0Y2ggZW1pdC4KKwkJICovCisJCWlmIChpID09IDApIHsKKwkJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9CisJCQkgICAgKGRybV9pbnRlbF9ib19nZW0gKikgYm9fYXJyYXlbaV07CisJCQlib19nZW0tPnJlbG9jX3RyZWVfc2l6ZSA9IHRvdGFsOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWRybV9pbnRlbF9nZW1fYm9fY2xlYXJfYXBlcnR1cmVfc3BhY2VfZmxhZyhib19hcnJheVtpXSk7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogUmV0dXJuIC0xIGlmIHRoZSBiYXRjaGJ1ZmZlciBzaG91bGQgYmUgZmx1c2hlZCBiZWZvcmUgYXR0ZW1wdGluZyB0bworICogZW1pdCByZW5kZXJpbmcgcmVmZXJlbmNpbmcgdGhlIGJ1ZmZlcnMgcG9pbnRlZCB0byBieSBib19hcnJheS4KKyAqCisgKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgaWYgd2UgdHJ5IHRvIGVtaXQgYSBiYXRjaGJ1ZmZlciB3aXRoIHJlbG9jYXRpb25zCisgKiB0byBhIHRyZWUgb2YgYnVmZmVycyB0aGF0IHdvbid0IHNpbXVsdGFuZW91c2x5IGZpdCBpbiB0aGUgYXBlcnR1cmUsCisgKiB0aGUgcmVuZGVyaW5nIHdpbGwgcmV0dXJuIGFuIGVycm9yIGF0IGEgcG9pbnQgd2hlcmUgdGhlIHNvZnR3YXJlIGlzIG5vdAorICogcHJlcGFyZWQgdG8gcmVjb3ZlciBmcm9tIGl0LgorICoKKyAqIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBlbWl0IHRoZSBiYXRjaGJ1ZmZlciBzaWduaWZpY2FudGx5IGJlZm9yZSB3ZSByZWFjaAorICogdGhlIGxpbWl0LCBhcyBhIHNlcmllcyBvZiBiYXRjaGJ1ZmZlcnMgZWFjaCBvZiB3aGljaCByZWZlcmVuY2VzIGJ1ZmZlcnMKKyAqIGNvdmVyaW5nIGFsbW9zdCBhbGwgb2YgdGhlIGFwZXJ0dXJlIG1lYW5zIHRoYXQgYXQgZWFjaCBlbWl0IHdlIGVuZCB1cAorICogd2FpdGluZyB0byBldmljdCBhIGJ1ZmZlciBmcm9tIHRoZSBsYXN0IHJlbmRlcmluZywgYW5kIHdlIGdldCBzeW5jaHJvbm91cworICogcGVyZm9ybWFuY2UuICBCeSBlbWl0dGluZyBzbWFsbGVyIGJhdGNoYnVmZmVycywgd2UgZWF0IHNvbWUgQ1BVIG92ZXJoZWFkIHRvCisgKiBnZXQgYmV0dGVyIHBhcmFsbGVsaXNtLgorICovCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKGRybV9pbnRlbF9ibyAqKmJvX2FycmF5LCBpbnQgY291bnQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm9fYXJyYXlbMF0tPmJ1Zm1ncjsKKwl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOworCXVuc2lnbmVkIGludCB0aHJlc2hvbGQgPSBidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAqIDMgLyA0OworCWludCB0b3RhbF9mZW5jZXM7CisKKwkvKiBDaGVjayBmb3IgZmVuY2UgcmVnIGNvbnN0cmFpbnRzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzKSB7CisJCXRvdGFsX2ZlbmNlcyA9IGRybV9pbnRlbF9nZW1fdG90YWxfZmVuY2VzKGJvX2FycmF5LCBjb3VudCk7CisJCWlmICh0b3RhbF9mZW5jZXMgPiBidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJdG90YWwgPSBkcm1faW50ZWxfZ2VtX2VzdGltYXRlX2JhdGNoX3NwYWNlKGJvX2FycmF5LCBjb3VudCk7CisKKwlpZiAodG90YWwgPiB0aHJlc2hvbGQpCisJCXRvdGFsID0gZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGJvX2FycmF5LCBjb3VudCk7CisKKwlpZiAodG90YWwgPiB0aHJlc2hvbGQpIHsKKwkJREJHKCJjaGVja19zcGFjZTogb3ZlcmZsb3dlZCBhdmFpbGFibGUgYXBlcnR1cmUsICIKKwkJICAgICIlZGtiIHZzICVka2JcbiIsCisJCSAgICB0b3RhbCAvIDEwMjQsIChpbnQpYnVmbWdyX2dlbS0+Z3R0X3NpemUgLyAxMDI0KTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfSBlbHNlIHsKKwkJREJHKCJkcm1fY2hlY2tfc3BhY2U6IHRvdGFsICVka2IgdnMgYnVmZ3IgJWRrYlxuIiwgdG90YWwgLyAxMDI0LAorCQkgICAgKGludClidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAvIDEwMjQpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBEaXNhYmxlIGJ1ZmZlciByZXVzZSBmb3Igb2JqZWN0cyB3aGljaCBhcmUgc2hhcmVkIHdpdGggdGhlIGtlcm5lbAorICogYXMgc2Nhbm91dCBidWZmZXJzCisgKi8KK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZGlzYWJsZV9yZXVzZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJYm9fZ2VtLT5yZXVzYWJsZSA9IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2lzX3JldXNhYmxlKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlyZXR1cm4gYm9fZ2VtLT5yZXVzYWJsZTsKK30KKworc3RhdGljIGludAorX2RybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlcyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKKwkJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8gPT0gdGFyZ2V0X2JvKQorCQkJcmV0dXJuIDE7CisJCWlmIChibyA9PSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvKQorCQkJY29udGludWU7CisJCWlmIChfZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2VzKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8sCisJCQkJCQl0YXJnZXRfYm8pKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiBSZXR1cm4gdHJ1ZSBpZiB0YXJnZXRfYm8gaXMgcmVmZXJlbmNlZCBieSBibydzIHJlbG9jYXRpb24gdHJlZS4gKi8KK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlcyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgdGFyZ2V0X2JvOworCisJaWYgKGJvID09IE5VTEwgfHwgdGFyZ2V0X2JvID09IE5VTEwpCisJCXJldHVybiAwOworCWlmICh0YXJnZXRfYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCkKKwkJcmV0dXJuIF9kcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXMoYm8sIHRhcmdldF9ibyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfYnVja2V0KGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IGJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzOworCisJYXNzZXJ0KGkgPCBBUlJBWV9TSVpFKGJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldCkpOworCisJRFJNSU5JVExJU1RIRUFEKCZidWZtZ3JfZ2VtLT5jYWNoZV9idWNrZXRbaV0uaGVhZCk7CisJYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldLnNpemUgPSBzaXplOworCWJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzKys7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X2NhY2hlX2J1Y2tldHMoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCit7CisJdW5zaWduZWQgbG9uZyBzaXplLCBjYWNoZV9tYXhfc2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CisKKwkvKiBPSywgc28gcG93ZXIgb2YgdHdvIGJ1Y2tldHMgd2FzIHRvbyB3YXN0ZWZ1bCBvZiBtZW1vcnkuCisJICogR2l2ZSAzIG90aGVyIHNpemVzIGJldHdlZW4gZWFjaCBwb3dlciBvZiB0d28sIHRvIGhvcGVmdWxseQorCSAqIGNvdmVyIHRoaW5ncyBhY2N1cmF0ZWx5IGVub3VnaC4gIChUaGUgYWx0ZXJuYXRpdmUgaXMKKwkgKiBwcm9iYWJseSB0byBqdXN0IGdvIGZvciBleGFjdCBtYXRjaGluZyBvZiBzaXplcywgYW5kIGFzc3VtZQorCSAqIHRoYXQgZm9yIHRoaW5ncyBsaWtlIGNvbXBvc2l0ZWQgd2luZG93IHJlc2l6ZSB0aGUgdGlsZWQKKwkgKiB3aWR0aC9oZWlnaHQgYWxpZ25tZW50IGFuZCByb3VuZGluZyBvZiBzaXplcyB0byBwYWdlcyB3aWxsCisJICogZ2V0IHVzIHVzZWZ1bCBjYWNoZSBoaXQgcmF0ZXMgYW55d2F5KQorCSAqLworCWFkZF9idWNrZXQoYnVmbWdyX2dlbSwgNDA5Nik7CisJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCA0MDk2ICogMik7CisJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCA0MDk2ICogMyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdHMgZm9yIEJPIHJldXNlIGNhY2hlLiAqLworCWZvciAoc2l6ZSA9IDQgKiA0MDk2OyBzaXplIDw9IGNhY2hlX21heF9zaXplOyBzaXplICo9IDIpIHsKKwkJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCBzaXplKTsKKworCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMSAvIDQpOworCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMiAvIDQpOworCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMyAvIDQpOworCX0KK30KKworZHJtX3B1YmxpYyB2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfdm1hX2NhY2hlX3NpemUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgbGltaXQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CisKKwlidWZtZ3JfZ2VtLT52bWFfbWF4ID0gbGltaXQ7CisKKwlkcm1faW50ZWxfZ2VtX2JvX3B1cmdlX3ZtYV9jYWNoZShidWZtZ3JfZ2VtKTsKK30KKworLyoqCisgKiBHZXQgdGhlIFBDSSBJRCBmb3IgdGhlIGRldmljZS4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUKKyAqIElOVEVMX0RFVklEX09WRVJSSURFIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBkZXNpcmVkIElELgorICovCitzdGF0aWMgaW50CitnZXRfcGNpX2RldmljZV9pZChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKK3sKKwljaGFyICpkZXZpZF9vdmVycmlkZTsKKwlpbnQgZGV2aWQgPSAwOworCWludCByZXQ7CisJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKKworCWlmIChnZXRldWlkKCkgPT0gZ2V0dWlkKCkpIHsKKwkJZGV2aWRfb3ZlcnJpZGUgPSBnZXRlbnYoIklOVEVMX0RFVklEX09WRVJSSURFIik7CisJCWlmIChkZXZpZF9vdmVycmlkZSkgeworCQkJYnVmbWdyX2dlbS0+bm9fZXhlYyA9IHRydWU7CisJCQlyZXR1cm4gc3RydG9kKGRldmlkX292ZXJyaWRlLCBOVUxMKTsKKwkJfQorCX0KKworCW1lbWNsZWFyKGdwKTsKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fQ0hJUFNFVF9JRDsKKwlncC52YWx1ZSA9ICZkZXZpZDsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJaWYgKHJldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImdldCBjaGlwIGlkIGZhaWxlZDogJWQgWyVkXVxuIiwgcmV0LCBlcnJubyk7CisJCWZwcmludGYoc3RkZXJyLCAicGFyYW06ICVkLCB2YWw6ICVkXG4iLCBncC5wYXJhbSwgKmdwLnZhbHVlKTsKKwl9CisJcmV0dXJuIGRldmlkOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fZ2V0X2RldmlkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncjsKKworCXJldHVybiBidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlOworfQorCisvKioKKyAqIFNldHMgdGhlIEFVQiBmaWxlbmFtZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIGRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfZHVtcCgpCisgKiBmb3IgaXQgdG8gaGF2ZSBhbnkgZWZmZWN0LgorICovCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfZmlsZW5hbWUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCisJZnJlZShidWZtZ3JfZ2VtLT5hdWJfZmlsZW5hbWUpOworCWlmIChmaWxlbmFtZSkKKwkJYnVmbWdyX2dlbS0+YXViX2ZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKK30KKworLyoqCisgKiBTZXRzIHVwIEFVQiBkdW1waW5nLgorICoKKyAqIFRoaXMgaXMgYSB0cmFjZSBmaWxlIGZvcm1hdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIHNpbXVsYXRvci4KKyAqIFBhY2tldHMgYXJlIGVtaXR0ZWQgaW4gYSBmb3JtYXQgc29tZXdoYXQgbGlrZSBHUFUgY29tbWFuZCBwYWNrZXRzLgorICogWW91IGNhbiBzZXQgdXAgYSBHVFQgYW5kIHVwbG9hZCB5b3VyIG9iamVjdHMgaW50byB0aGUgcmVmZXJlbmNlZAorICogc3BhY2UsIHRoZW4gc2VuZCBvZmYgYmF0Y2hidWZmZXJzIGFuZCBnZXQgQk1QcyBvdXQgdGhlIG90aGVyIGVuZC4KKyAqLworZHJtX3B1YmxpYyB2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2R1bXAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgZW5hYmxlKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCWludCBlbnRyeSA9IDB4MjAwMDAzOworCWludCBpOworCWludCBndHRfc2l6ZSA9IDB4MTAwMDA7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisKKwlpZiAoIWVuYWJsZSkgeworCQlpZiAoYnVmbWdyX2dlbS0+YXViX2ZpbGUpIHsKKwkJCWZjbG9zZShidWZtZ3JfZ2VtLT5hdWJfZmlsZSk7CisJCQlidWZtZ3JfZ2VtLT5hdWJfZmlsZSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmIChnZXRldWlkKCkgIT0gZ2V0dWlkKCkpCisJCXJldHVybjsKKworCWlmIChidWZtZ3JfZ2VtLT5hdWJfZmlsZW5hbWUpCisJCWZpbGVuYW1lID0gYnVmbWdyX2dlbS0+YXViX2ZpbGVuYW1lOworCWVsc2UKKwkJZmlsZW5hbWUgPSAiaW50ZWwuYXViIjsKKwlidWZtZ3JfZ2VtLT5hdWJfZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAidysiKTsKKwlpZiAoIWJ1Zm1ncl9nZW0tPmF1Yl9maWxlKQorCQlyZXR1cm47CisKKwkvKiBTdGFydCBhbGxvY2F0aW5nIG9iamVjdHMgZnJvbSBqdXN0IGFmdGVyIHRoZSBHVFQuICovCisJYnVmbWdyX2dlbS0+YXViX29mZnNldCA9IGd0dF9zaXplOworCisJLyogU3RhcnQgd2l0aCBhIChyZXF1aXJlZCkgdmVyc2lvbiBwYWNrZXQuICovCisJYXViX291dChidWZtZ3JfZ2VtLCBDTURfQVVCX0hFQURFUiB8ICgxMyAtIDIpKTsKKwlhdWJfb3V0KGJ1Zm1ncl9nZW0sCisJCSg0IDw8IEFVQl9IRUFERVJfTUFKT1JfU0hJRlQpIHwKKwkJKDAgPDwgQVVCX0hFQURFUl9NSU5PUl9TSElGVCkpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYXViX291dChidWZtZ3JfZ2VtLCAwKTsgLyogYXBwIG5hbWUgKi8KKwl9CisJYXViX291dChidWZtZ3JfZ2VtLCAwKTsgLyogdGltZXN0YW1wICovCisJYXViX291dChidWZtZ3JfZ2VtLCAwKTsgLyogdGltZXN0YW1wICovCisJYXViX291dChidWZtZ3JfZ2VtLCAwKTsgLyogY29tbWVudCBsZW4gKi8KKworCS8qIFNldCB1cCB0aGUgR1RULiBUaGUgbWF4IHdlIGNhbiBoYW5kbGUgaXMgMjU2TSAqLworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgQ01EX0FVQl9UUkFDRV9IRUFERVJfQkxPQ0sgfCAoKGJ1Zm1ncl9nZW0tPmdlbiA+PSA4ID8gNiA6IDUpIC0gMikpOworCS8qIE5lZWQgdG8gdXNlIEdUVF9FTlRSWSB0eXBlIGZvciByZWNlbnQgZW11bGF0b3IgKi8KKwlhdWJfb3V0KGJ1Zm1ncl9nZW0sIEFVQl9UUkFDRV9NRU1UWVBFX0dUVF9FTlRSWSB8IDAgfCBBVUJfVFJBQ0VfT1BfREFUQV9XUklURSk7CisJYXViX291dChidWZtZ3JfZ2VtLCAwKTsgLyogc3VidHlwZSAqLworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgMCk7IC8qIG9mZnNldCAqLworCWF1Yl9vdXQoYnVmbWdyX2dlbSwgZ3R0X3NpemUpOyAvKiBzaXplICovCisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA4KQorCQlhdWJfb3V0KGJ1Zm1ncl9nZW0sIDApOworCWZvciAoaSA9IDB4MDAwOyBpIDwgZ3R0X3NpemU7IGkgKz0gNCwgZW50cnkgKz0gMHgxMDAwKSB7CisJCWF1Yl9vdXQoYnVmbWdyX2dlbSwgZW50cnkpOworCX0KK30KKworZHJtX3B1YmxpYyBkcm1faW50ZWxfY29udGV4dCAqCitkcm1faW50ZWxfZ2VtX2NvbnRleHRfY3JlYXRlKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfY3JlYXRlIGNyZWF0ZTsKKwlkcm1faW50ZWxfY29udGV4dCAqY29udGV4dCA9IE5VTEw7CisJaW50IHJldDsKKworCWNvbnRleHQgPSBjYWxsb2MoMSwgc2l6ZW9mKCpjb250ZXh0KSk7CisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNsZWFyKGNyZWF0ZSk7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0NSRUFURSwgJmNyZWF0ZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCURCRygiRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfQ1JFQVRFIGZhaWxlZDogJXNcbiIsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlmcmVlKGNvbnRleHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljb250ZXh0LT5jdHhfaWQgPSBjcmVhdGUuY3R4X2lkOworCWNvbnRleHQtPmJ1Zm1nciA9IGJ1Zm1ncjsKKworCXJldHVybiBjb250ZXh0OworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9nZW1fY29udGV4dF9kZXN0cm95KGRybV9pbnRlbF9jb250ZXh0ICpjdHgpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW07CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2Rlc3Ryb3kgZGVzdHJveTsKKwlpbnQgcmV0OworCisJaWYgKGN0eCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1jbGVhcihkZXN0cm95KTsKKworCWJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKiljdHgtPmJ1Zm1ncjsKKwlkZXN0cm95LmN0eF9pZCA9IGN0eC0+Y3R4X2lkOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9ERVNUUk9ZLAorCQkgICAgICAgJmRlc3Ryb3kpOworCWlmIChyZXQgIT0gMCkKKwkJZnByaW50ZihzdGRlcnIsICJEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9ERVNUUk9ZIGZhaWxlZDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCisJZnJlZShjdHgpOworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2dldF9yZXNldF9zdGF0cyhkcm1faW50ZWxfY29udGV4dCAqY3R4LAorCQkJICB1aW50MzJfdCAqcmVzZXRfY291bnQsCisJCQkgIHVpbnQzMl90ICphY3RpdmUsCisJCQkgIHVpbnQzMl90ICpwZW5kaW5nKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOworCXN0cnVjdCBkcm1faTkxNV9yZXNldF9zdGF0cyBzdGF0czsKKwlpbnQgcmV0OworCisJaWYgKGN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNsZWFyKHN0YXRzKTsKKworCWJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKiljdHgtPmJ1Zm1ncjsKKwlzdGF0cy5jdHhfaWQgPSBjdHgtPmN0eF9pZDsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFVF9SRVNFVF9TVEFUUywKKwkJICAgICAgICZzdGF0cyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChyZXNldF9jb3VudCAhPSBOVUxMKQorCQkJKnJlc2V0X2NvdW50ID0gc3RhdHMucmVzZXRfY291bnQ7CisKKwkJaWYgKGFjdGl2ZSAhPSBOVUxMKQorCQkJKmFjdGl2ZSA9IHN0YXRzLmJhdGNoX2FjdGl2ZTsKKworCQlpZiAocGVuZGluZyAhPSBOVUxMKQorCQkJKnBlbmRpbmcgPSBzdGF0cy5iYXRjaF9wZW5kaW5nOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfcmVnX3JlYWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkgICB1aW50MzJfdCBvZmZzZXQsCisJCSAgIHVpbnQ2NF90ICpyZXN1bHQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CisJc3RydWN0IGRybV9pOTE1X3JlZ19yZWFkIHJlZ19yZWFkOworCWludCByZXQ7CisKKwltZW1jbGVhcihyZWdfcmVhZCk7CisJcmVnX3JlYWQub2Zmc2V0ID0gb2Zmc2V0OworCisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X1JFR19SRUFELCAmcmVnX3JlYWQpOworCisJKnJlc3VsdCA9IHJlZ19yZWFkLnZhbDsKKwlyZXR1cm4gcmV0OworfQorCitkcm1fcHVibGljIGludAorZHJtX2ludGVsX2dldF9zdWJzbGljZV90b3RhbChpbnQgZmQsIHVuc2lnbmVkIGludCAqc3Vic2xpY2VfdG90YWwpCit7CisJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIoZ3ApOworCWdwLnZhbHVlID0gKGludCopc3Vic2xpY2VfdG90YWw7CisJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX1NVQlNMSUNFX1RPVEFMOworCXJldCA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLWVycm5vOworCisJcmV0dXJuIDA7Cit9CisKK2RybV9wdWJsaWMgaW50Citkcm1faW50ZWxfZ2V0X2V1X3RvdGFsKGludCBmZCwgdW5zaWduZWQgaW50ICpldV90b3RhbCkKK3sKKwlkcm1faTkxNV9nZXRwYXJhbV90IGdwOworCWludCByZXQ7CisKKwltZW1jbGVhcihncCk7CisJZ3AudmFsdWUgPSAoaW50KilldV90b3RhbDsKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fRVVfVE9UQUw7CisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWlmIChyZXQpCisJCXJldHVybiAtZXJybm87CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBbm5vdGF0ZSB0aGUgZ2l2ZW4gYm8gZm9yIHVzZSBpbiBhdWIgZHVtcGluZy4KKyAqCisgKiBccGFyYW0gYW5ub3RhdGlvbnMgaXMgYW4gYXJyYXkgb2YgZHJtX2ludGVsX2F1Yl9hbm5vdGF0aW9uIG9iamVjdHMKKyAqIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgZGF0YSBpbiB2YXJpb3VzIHNlY3Rpb25zIG9mIHRoZSBiby4gIEVhY2gKKyAqIGVsZW1lbnQgb2YgdGhlIGFycmF5IHNwZWNpZmllcyB0aGUgdHlwZSBhbmQgc3VidHlwZSBvZiBhIHNlY3Rpb24gb2YKKyAqIHRoZSBibywgYW5kIHRoZSBwYXN0LXRoZS1lbmQgb2Zmc2V0IG9mIHRoYXQgc2VjdGlvbi4gIFRoZSBlbGVtZW50cworICogb2YgXGMgYW5ub3RhdGlvbnMgbXVzdCBiZSBzb3J0ZWQgc28gdGhhdCBlbmRpbmdfb2Zmc2V0IGlzCisgKiBpbmNyZWFzaW5nLgorICoKKyAqIFxwYXJhbSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBcYyBhbm5vdGF0aW9ucyBhcnJheS4KKyAqIElmIFxjIGNvdW50IGlzIHplcm8sIHRoZW4gXGMgYW5ub3RhdGlvbnMgd2lsbCBub3QgYmUgZGVyZWZlcmVuY2VkLgorICoKKyAqIEFubm90YXRpb25zIGFyZSBjb3BpZWQgaW50byBhIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIHNvIGNhbGxlciBtYXkKKyAqIHJlLXVzZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgXGMgYW5ub3RhdGlvbnMgYWZ0ZXIgdGhlIGNhbGwKKyAqIHJldHVybnMuCisgKgorICogQW5ub3RhdGlvbnMgYXJlIHN0b3JlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBibzsgdG8gcmVzZXQgdG8gdGhlCisgKiBkZWZhdWx0IHN0YXRlIChubyBhbm5vdGF0aW9ucyksIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgXGMgY291bnQKKyAqIG9mIHplcm8uCisgKi8KK2RybV9wdWJsaWMgdm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9hbm5vdGF0aW9ucyhkcm1faW50ZWxfYm8gKmJvLAorCQkJCQkgZHJtX2ludGVsX2F1Yl9hbm5vdGF0aW9uICphbm5vdGF0aW9ucywKKwkJCQkJIHVuc2lnbmVkIGNvdW50KQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXVuc2lnbmVkIHNpemUgPSBzaXplb2YoKmFubm90YXRpb25zKSAqIGNvdW50OworCWRybV9pbnRlbF9hdWJfYW5ub3RhdGlvbiAqbmV3X2Fubm90YXRpb25zID0KKwkJY291bnQgPiAwID8gcmVhbGxvYyhib19nZW0tPmF1Yl9hbm5vdGF0aW9ucywgc2l6ZSkgOiBOVUxMOworCWlmIChuZXdfYW5ub3RhdGlvbnMgPT0gTlVMTCkgeworCQlmcmVlKGJvX2dlbS0+YXViX2Fubm90YXRpb25zKTsKKwkJYm9fZ2VtLT5hdWJfYW5ub3RhdGlvbnMgPSBOVUxMOworCQlib19nZW0tPmF1Yl9hbm5vdGF0aW9uX2NvdW50ID0gMDsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkobmV3X2Fubm90YXRpb25zLCBhbm5vdGF0aW9ucywgc2l6ZSk7CisJYm9fZ2VtLT5hdWJfYW5ub3RhdGlvbnMgPSBuZXdfYW5ub3RhdGlvbnM7CisJYm9fZ2VtLT5hdWJfYW5ub3RhdGlvbl9jb3VudCA9IGNvdW50OworfQorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGJ1Zm1ncl9saXN0X211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBkcm1NTUxpc3RIZWFkIGJ1Zm1ncl9saXN0ID0geyAmYnVmbWdyX2xpc3QsICZidWZtZ3JfbGlzdCB9OworCitzdGF0aWMgZHJtX2ludGVsX2J1Zm1ncl9nZW0gKgorZHJtX2ludGVsX2J1Zm1ncl9nZW1fZmluZChpbnQgZmQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW07CisKKwlEUk1MSVNURk9SRUFDSEVOVFJZKGJ1Zm1ncl9nZW0sICZidWZtZ3JfbGlzdCwgbWFuYWdlcnMpIHsKKwkJaWYgKGJ1Zm1ncl9nZW0tPmZkID09IGZkKSB7CisJCQlhdG9taWNfaW5jKCZidWZtZ3JfZ2VtLT5yZWZjb3VudCk7CisJCQlyZXR1cm4gYnVmbWdyX2dlbTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fdW5yZWYoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCisJaWYgKGF0b21pY19hZGRfdW5sZXNzKCZidWZtZ3JfZ2VtLT5yZWZjb3VudCwgLTEsIDEpKSB7CisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2xpc3RfbXV0ZXgpOworCisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZidWZtZ3JfZ2VtLT5yZWZjb3VudCkpIHsKKwkJCURSTUxJU1RERUwoJmJ1Zm1ncl9nZW0tPm1hbmFnZXJzKTsKKwkJCWRybV9pbnRlbF9idWZtZ3JfZ2VtX2Rlc3Ryb3koYnVmbWdyKTsKKwkJfQorCisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfbGlzdF9tdXRleCk7CisJfQorfQorCitzdGF0aWMgYm9vbAoraGFzX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCit7CisJaW50IHJldDsKKwl2b2lkICpwdHI7CisJbG9uZyBwZ3N6OworCXN0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0ciB1c2VycHRyOworCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIGNsb3NlX2JvOworCisJcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKwlhc3NlcnQocGdzeiA+IDApOworCisJcmV0ID0gcG9zaXhfbWVtYWxpZ24oJnB0ciwgcGdzeiwgcGdzeik7CisJaWYgKHJldCkgeworCQlEQkcoIkZhaWxlZCB0byBnZXQgYSBwYWdlICglbGQpIGZvciB1c2VycHRyIGRldGVjdGlvbiFcbiIsCisJCQlwZ3N6KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW1lbWNsZWFyKHVzZXJwdHIpOworCXVzZXJwdHIudXNlcl9wdHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpcHRyOworCXVzZXJwdHIudXNlcl9zaXplID0gcGdzejsKKworcmV0cnk6CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSLCAmdXNlcnB0cik7CisJaWYgKHJldCkgeworCQlpZiAoZXJybm8gPT0gRU5PREVWICYmIHVzZXJwdHIuZmxhZ3MgPT0gMCkgeworCQkJdXNlcnB0ci5mbGFncyA9IEk5MTVfVVNFUlBUUl9VTlNZTkNIUk9OSVpFRDsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJZnJlZShwdHIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbWVtY2xlYXIoY2xvc2VfYm8pOworCWNsb3NlX2JvLmhhbmRsZSA9IHVzZXJwdHIuaGFuZGxlOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmY2xvc2VfYm8pOworCWZyZWUocHRyKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlbGVhc2UgdGVzdCB1c2VycHRyIG9iamVjdCEgKCVkKSAiCisJCQkJImk5MTUga2VybmVsIGRyaXZlciBtYXkgbm90IGJlIHNhbmUhXG4iLCBlcnJubyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgR0VNIGJ1ZmZlciBtYW5hZ2VyLCB3aGljaCB1c2VzIHRoZSBrZXJuZWwgdG8gYWxsb2NhdGUsIG1hcCwKKyAqIGFuZCBtYW5hZ2UgbWFwIGJ1ZmZlciBvYmplY3Rpb25zLgorICoKKyAqIFxwYXJhbSBmZCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG9wZW5lZCBEUk0gZGV2aWNlLgorICovCitkcm1fcHVibGljIGRybV9pbnRlbF9idWZtZ3IgKgorZHJtX2ludGVsX2J1Zm1ncl9nZW1faW5pdChpbnQgZmQsIGludCBiYXRjaF9zaXplKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X2FwZXJ0dXJlIGFwZXJ0dXJlOworCWRybV9pOTE1X2dldHBhcmFtX3QgZ3A7CisJaW50IHJldCwgdG1wOworCWJvb2wgZXhlYzIgPSBmYWxzZTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2xpc3RfbXV0ZXgpOworCisJYnVmbWdyX2dlbSA9IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2ZpbmQoZmQpOworCWlmIChidWZtZ3JfZ2VtKQorCQlnb3RvIGV4aXQ7CisKKwlidWZtZ3JfZ2VtID0gY2FsbG9jKDEsIHNpemVvZigqYnVmbWdyX2dlbSkpOworCWlmIChidWZtZ3JfZ2VtID09IE5VTEwpCisJCWdvdG8gZXhpdDsKKworCWJ1Zm1ncl9nZW0tPmZkID0gZmQ7CisJYXRvbWljX3NldCgmYnVmbWdyX2dlbS0+cmVmY291bnQsIDEpOworCisJaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCgmYnVmbWdyX2dlbS0+bG9jaywgTlVMTCkgIT0gMCkgeworCQlmcmVlKGJ1Zm1ncl9nZW0pOworCQlidWZtZ3JfZ2VtID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCW1lbWNsZWFyKGFwZXJ0dXJlKTsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfQVBFUlRVUkUsCisJCSAgICAgICAmYXBlcnR1cmUpOworCisJaWYgKHJldCA9PSAwKQorCQlidWZtZ3JfZ2VtLT5ndHRfc2l6ZSA9IGFwZXJ0dXJlLmFwZXJfYXZhaWxhYmxlX3NpemU7CisJZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiRFJNX0lPQ1RMX0k5MTVfR0VNX0FQRVJUVVJFIGZhaWxlZDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlidWZtZ3JfZ2VtLT5ndHRfc2l6ZSA9IDEyOCAqIDEwMjQgKiAxMDI0OworCQlmcHJpbnRmKHN0ZGVyciwgIkFzc3VtaW5nICVka0IgYXZhaWxhYmxlIGFwZXJ0dXJlIHNpemUuXG4iCisJCQkiTWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSBvciBpbmNvcnJlY3QgIgorCQkJInJlbmRlcmluZy5cbiIsCisJCQkoaW50KWJ1Zm1ncl9nZW0tPmd0dF9zaXplIC8gMTAyNCk7CisJfQorCisJYnVmbWdyX2dlbS0+cGNpX2RldmljZSA9IGdldF9wY2lfZGV2aWNlX2lkKGJ1Zm1ncl9nZW0pOworCisJaWYgKElTX0dFTjIoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCisJCWJ1Zm1ncl9nZW0tPmdlbiA9IDI7CisJZWxzZSBpZiAoSVNfR0VOMyhidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKKwkJYnVmbWdyX2dlbS0+Z2VuID0gMzsKKwllbHNlIGlmIChJU19HRU40KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQorCQlidWZtZ3JfZ2VtLT5nZW4gPSA0OworCWVsc2UgaWYgKElTX0dFTjUoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCisJCWJ1Zm1ncl9nZW0tPmdlbiA9IDU7CisJZWxzZSBpZiAoSVNfR0VONihidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKKwkJYnVmbWdyX2dlbS0+Z2VuID0gNjsKKwllbHNlIGlmIChJU19HRU43KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQorCQlidWZtZ3JfZ2VtLT5nZW4gPSA3OworCWVsc2UgaWYgKElTX0dFTjgoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCisJCWJ1Zm1ncl9nZW0tPmdlbiA9IDg7CisJZWxzZSBpZiAoSVNfR0VOOShidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKKwkJYnVmbWdyX2dlbS0+Z2VuID0gOTsKKwllbHNlIHsKKwkJZnJlZShidWZtZ3JfZ2VtKTsKKwkJYnVmbWdyX2dlbSA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoSVNfR0VOMyhidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSAmJgorCSAgICBidWZtZ3JfZ2VtLT5ndHRfc2l6ZSA+IDI1NioxMDI0KjEwMjQpIHsKKwkJLyogVGhlIHVubWFwcGFibGUgcGFydCBvZiBndHQgb24gZ2VuIDMgKGkuZS4gYWJvdmUgMjU2TUIpIGNhbid0CisJCSAqIGJlIHVzZWQgZm9yIHRpbGVkIGJsaXRzLiBUbyBzaW1wbGlmeSB0aGUgYWNjb3VudGluZywganVzdAorCQkgKiBzdWJ0cmFjdCB0aGUgdW5tYXBwYWJsZSBwYXJ0IChmaXhlZCB0byAyNTZNQiBvbiBhbGwga25vd24KKwkJICogZ2VuMyBkZXZpY2VzKSBpZiB0aGUga2VybmVsIGFkdmVydGlzZXMgaXQuICovCisJCWJ1Zm1ncl9nZW0tPmd0dF9zaXplIC09IDI1NioxMDI0KjEwMjQ7CisJfQorCisJbWVtY2xlYXIoZ3ApOworCWdwLnZhbHVlID0gJnRtcDsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfRVhFQ0JVRjI7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWlmICghcmV0KQorCQlleGVjMiA9IHRydWU7CisKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fSEFTX0JTRDsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJYnVmbWdyX2dlbS0+aGFzX2JzZCA9IHJldCA9PSAwOworCisJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19CTFQ7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWJ1Zm1ncl9nZW0tPmhhc19ibHQgPSByZXQgPT0gMDsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfUkVMQVhFRF9GRU5DSU5HOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKKwlidWZtZ3JfZ2VtLT5oYXNfcmVsYXhlZF9mZW5jaW5nID0gcmV0ID09IDA7CisKKwlpZiAoaGFzX3VzZXJwdHIoYnVmbWdyX2dlbSkpCisJCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19hbGxvY191c2VycHRyID0KKwkJCWRybV9pbnRlbF9nZW1fYm9fYWxsb2NfdXNlcnB0cjsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfV0FJVF9USU1FT1VUOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKKwlidWZtZ3JfZ2VtLT5oYXNfd2FpdF90aW1lb3V0ID0gcmV0ID09IDA7CisKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fSEFTX0xMQzsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJaWYgKHJldCAhPSAwKSB7CisJCS8qIEtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0cyBIQVNfTExDIHF1ZXJ5LCBmYWxsYmFjayB0byBHUFUKKwkJICogZ2VuZXJhdGlvbiBkZXRlY3Rpb24gYW5kIGFzc3VtZSB0aGF0IHdlIGhhdmUgTExDIG9uIEdFTjYvNworCQkgKi8KKwkJYnVmbWdyX2dlbS0+aGFzX2xsYyA9IChJU19HRU42KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpIHwKKwkJCQlJU19HRU43KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKTsKKwl9IGVsc2UKKwkJYnVmbWdyX2dlbS0+aGFzX2xsYyA9ICpncC52YWx1ZTsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfVkVCT1g7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWJ1Zm1ncl9nZW0tPmhhc192ZWJveCA9IChyZXQgPT0gMCkgJiAoKmdwLnZhbHVlID4gMCk7CisKKwlpZiAoYnVmbWdyX2dlbS0+Z2VuIDwgNCkgeworCQlncC5wYXJhbSA9IEk5MTVfUEFSQU1fTlVNX0ZFTkNFU19BVkFJTDsKKwkJZ3AudmFsdWUgPSAmYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlczsKKwkJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCQlpZiAocmV0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImdldCBmZW5jZXMgZmFpbGVkOiAlZCBbJWRdXG4iLCByZXQsCisJCQkJZXJybm8pOworCQkJZnByaW50ZihzdGRlcnIsICJwYXJhbTogJWQsIHZhbDogJWRcbiIsIGdwLnBhcmFtLAorCQkJCSpncC52YWx1ZSk7CisJCQlidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFhYWCBUaGUga2VybmVsIHJlcG9ydHMgdGhlIHRvdGFsIG51bWJlciBvZiBmZW5jZXMsCisJCQkgKiBpbmNsdWRpbmcgYW55IHRoYXQgbWF5IGJlIHBpbm5lZC4KKwkJCSAqCisJCQkgKiBXZSBwcmVzdW1lIHRoYXQgdGhlcmUgd2lsbCBiZSBhdCBsZWFzdCBvbmUgcGlubmVkCisJCQkgKiBmZW5jZSBmb3IgdGhlIHNjYW5vdXQgYnVmZmVyLCBidXQgdGhlcmUgbWF5IGJlIG1vcmUKKwkJCSAqIHRoYW4gb25lIHNjYW5vdXQgYW5kIHRoZSB1c2VyIG1heSBiZSBtYW51YWxseQorCQkJICogcGlubmluZyBidWZmZXJzLiBMZXQncyBtb3ZlIHRvIGV4ZWNidWZmZXIyIGFuZAorCQkJICogdGhlcmVieSBmb3JnZXQgdGhlIGluc2FuaXR5IG9mIHVzaW5nIGZlbmNlcy4uLgorCQkJICovCisJCQlidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzIC09IDI7CisJCQlpZiAoYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlcyA8IDApCisJCQkJYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlcyA9IDA7CisJCX0KKwl9CisKKwkvKiBMZXQncyBnbyB3aXRoIG9uZSByZWxvY2F0aW9uIHBlciBldmVyeSAyIGR3b3JkcyAoYnV0IHJvdW5kIGRvd24gYSBiaXQKKwkgKiBzaW5jZSBhIHBvd2VyIG9mIHR3byB3aWxsIG1lYW4gYW4gZXh0cmEgcGFnZSBhbGxvY2F0aW9uIGZvciB0aGUgcmVsb2MKKwkgKiBidWZmZXIpLgorCSAqCisJICogRXZlcnkgNCB3YXMgdG9vIGZldyBmb3IgdGhlIGJsZW5kZXIgYmVuY2htYXJrLgorCSAqLworCWJ1Zm1ncl9nZW0tPm1heF9yZWxvY3MgPSBiYXRjaF9zaXplIC8gc2l6ZW9mKHVpbnQzMl90KSAvIDIgLSAyOworCisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2FsbG9jID0gZHJtX2ludGVsX2dlbV9ib19hbGxvYzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfZm9yX3JlbmRlciA9CisJICAgIGRybV9pbnRlbF9nZW1fYm9fYWxsb2NfZm9yX3JlbmRlcjsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfdGlsZWQgPSBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3RpbGVkOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19yZWZlcmVuY2UgPSBkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZTsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fdW5yZWZlcmVuY2UgPSBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19tYXAgPSBkcm1faW50ZWxfZ2VtX2JvX21hcDsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fdW5tYXAgPSBkcm1faW50ZWxfZ2VtX2JvX3VubWFwOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19zdWJkYXRhID0gZHJtX2ludGVsX2dlbV9ib19zdWJkYXRhOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19nZXRfc3ViZGF0YSA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3N1YmRhdGE7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3dhaXRfcmVuZGVyaW5nID0gZHJtX2ludGVsX2dlbV9ib193YWl0X3JlbmRlcmluZzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZW1pdF9yZWxvYyA9IGRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvYzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZW1pdF9yZWxvY19mZW5jZSA9IGRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvY19mZW5jZTsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fcGluID0gZHJtX2ludGVsX2dlbV9ib19waW47CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3VucGluID0gZHJtX2ludGVsX2dlbV9ib191bnBpbjsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZ2V0X3RpbGluZyA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3RpbGluZzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fc2V0X3RpbGluZyA9IGRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZmxpbmsgPSBkcm1faW50ZWxfZ2VtX2JvX2ZsaW5rOworCS8qIFVzZSB0aGUgbmV3IG9uZSBpZiBhdmFpbGFibGUgKi8KKwlpZiAoZXhlYzIpIHsKKwkJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2V4ZWMgPSBkcm1faW50ZWxfZ2VtX2JvX2V4ZWMyOworCQlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fbXJiX2V4ZWMgPSBkcm1faW50ZWxfZ2VtX2JvX21yYl9leGVjMjsKKwl9IGVsc2UKKwkJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2V4ZWMgPSBkcm1faW50ZWxfZ2VtX2JvX2V4ZWM7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2J1c3kgPSBkcm1faW50ZWxfZ2VtX2JvX2J1c3k7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX21hZHZpc2UgPSBkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2U7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmRlc3Ryb3kgPSBkcm1faW50ZWxfYnVmbWdyX2dlbV91bnJlZjsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcgPSAwOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5jaGVja19hcGVydHVyZV9zcGFjZSA9CisJICAgIGRybV9pbnRlbF9nZW1fY2hlY2tfYXBlcnR1cmVfc3BhY2U7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2Rpc2FibGVfcmV1c2UgPSBkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfcmV1c2U7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2lzX3JldXNhYmxlID0gZHJtX2ludGVsX2dlbV9ib19pc19yZXVzYWJsZTsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuZ2V0X3BpcGVfZnJvbV9jcnRjX2lkID0KKwkgICAgZHJtX2ludGVsX2dlbV9nZXRfcGlwZV9mcm9tX2NydGNfaWQ7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3JlZmVyZW5jZXMgPSBkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXM7CisKKwlEUk1JTklUTElTVEhFQUQoJmJ1Zm1ncl9nZW0tPm5hbWVkKTsKKwlpbml0X2NhY2hlX2J1Y2tldHMoYnVmbWdyX2dlbSk7CisKKwlEUk1JTklUTElTVEhFQUQoJmJ1Zm1ncl9nZW0tPnZtYV9jYWNoZSk7CisJYnVmbWdyX2dlbS0+dm1hX21heCA9IC0xOyAvKiB1bmxpbWl0ZWQgYnkgZGVmYXVsdCAqLworCisJRFJNTElTVEFERCgmYnVmbWdyX2dlbS0+bWFuYWdlcnMsICZidWZtZ3JfbGlzdCk7CisKK2V4aXQ6CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9saXN0X211dGV4KTsKKworCXJldHVybiBidWZtZ3JfZ2VtICE9IE5VTEwgPyAmYnVmbWdyX2dlbS0+YnVmbWdyIDogTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9rbWQvbGliZHJtL2ludGVsL2ludGVsX2J1Zm1ncl9wcml2LmggYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3JfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZWJkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9idWZtZ3JfcHJpdi5oCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKy8qKgorICogQGZpbGUgaW50ZWxfYnVmbWdyX3ByaXYuaAorICoKKyAqIFByaXZhdGUgZGVmaW5pdGlvbnMgb2YgSW50ZWwtc3BlY2lmaWMgYnVmbWdyIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcy4KKyAqLworCisjaWZuZGVmIElOVEVMX0JVRk1HUl9QUklWX0gKKyNkZWZpbmUgSU5URUxfQlVGTUdSX1BSSVZfSAorCisvKioKKyAqIENvbnRleHQgZm9yIGEgYnVmZmVyIG1hbmFnZXIgaW5zdGFuY2UuCisgKgorICogQ29udGFpbnMgcHVibGljIG1ldGhvZHMgZm9sbG93ZWQgYnkgcHJpdmF0ZSBzdG9yYWdlIGZvciB0aGUgYnVmZmVyIG1hbmFnZXIuCisgKi8KK3N0cnVjdCBfZHJtX2ludGVsX2J1Zm1nciB7CisJLyoqCisJICogQWxsb2NhdGUgYSBidWZmZXIgb2JqZWN0LgorCSAqCisJICogQnVmZmVyIG9iamVjdHMgYXJlIG5vdCBuZWNlc3NhcmlseSBpbml0aWFsbHkgbWFwcGVkIGludG8gQ1BVIHZpcnR1YWwKKwkgKiBhZGRyZXNzIHNwYWNlIG9yIGdyYXBoaWNzIGRldmljZSBhcGVydHVyZS4gIFRoZXkgbXVzdCBiZSBtYXBwZWQKKwkgKiB1c2luZyBib19tYXAoKSBvciBkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoKSB0byBiZSB1c2VkIGJ5IHRoZSBDUFUuCisJICovCisJZHJtX2ludGVsX2JvICooKmJvX2FsbG9jKSAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IGFsaWdubWVudCk7CisKKwkvKioKKwkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvYmplY3QsIGhpbnRpbmcgdGhhdCBpdCB3aWxsIGJlIHVzZWQgYXMgYQorCSAqIHJlbmRlciB0YXJnZXQuCisJICoKKwkgKiBUaGlzIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBhcyBib19hbGxvYy4KKwkgKi8KKwlkcm1faW50ZWxfYm8gKigqYm9fYWxsb2NfZm9yX3JlbmRlcikgKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KTsKKworCS8qKgorCSAqIEFsbG9jYXRlIGEgYnVmZmVyIG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIHVzZXIgYWNjZXNzaWJsZQorCSAqIGFkZHJlc3MgbWFsbG9jJ2Qgd2l0aCB0aGUgcHJvdmlkZWQgc2l6ZS4KKwkgKiBBbGlnbm1lbnQgaXMgdXNlZCB3aGVuIG1hcHBpbmcgdG8gdGhlIGd0dC4KKwkgKiBGbGFncyBtYXkgYmUgSTkxNV9WTUFQX1JFQURfT05MWSBvciBJOTE1X1VTRVJQVFJfVU5TWU5DSFJPTklaRUQKKwkgKi8KKwlkcm1faW50ZWxfYm8gKigqYm9fYWxsb2NfdXNlcnB0cikoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmFkZHIsCisJCQkJCSAgdWludDMyX3QgdGlsaW5nX21vZGUsIHVpbnQzMl90IHN0cmlkZSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKwkvKioKKwkgKiBBbGxvY2F0ZSBhIHRpbGVkIGJ1ZmZlciBvYmplY3QuCisJICoKKwkgKiBBbGlnbm1lbnQgZm9yIHRpbGVkIG9iamVjdHMgaXMgc2V0IGF1dG9tYXRpY2FsbHk7IHRoZSAnZmxhZ3MnCisJICogYXJndW1lbnQgcHJvdmlkZXMgYSBoaW50IGFib3V0IGhvdyB0aGUgb2JqZWN0IHdpbGwgYmUgdXNlZCBpbml0aWFsbHkuCisJICoKKwkgKiBWYWxpZCB0aWxpbmcgZm9ybWF0cyBhcmU6CisJICogIEk5MTVfVElMSU5HX05PTkUKKwkgKiAgSTkxNV9USUxJTkdfWAorCSAqICBJOTE1X1RJTElOR19ZCisJICoKKwkgKiBOb3RlIHRoZSB0aWxpbmcgZm9ybWF0IG1heSBiZSByZWplY3RlZDsgY2FsbGVycyBzaG91bGQgY2hlY2sgdGhlCisJICogJ3RpbGluZ19tb2RlJyBmaWVsZCBvbiByZXR1cm4sIGFzIHdlbGwgYXMgdGhlIHBpdGNoIHZhbHVlLCB3aGljaAorCSAqIG1heSBoYXZlIGJlZW4gcm91bmRlZCB1cCB0byBhY2NvbW1vZGF0ZSBmb3IgdGlsaW5nIHJlc3RyaWN0aW9ucy4KKwkgKi8KKwlkcm1faW50ZWxfYm8gKigqYm9fYWxsb2NfdGlsZWQpIChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgaW50IHgsIGludCB5LCBpbnQgY3BwLAorCQkJCQkgdWludDMyX3QgKnRpbGluZ19tb2RlLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqcGl0Y2gsCisJCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworCS8qKiBUYWtlcyBhIHJlZmVyZW5jZSBvbiBhIGJ1ZmZlciBvYmplY3QgKi8KKwl2b2lkICgqYm9fcmVmZXJlbmNlKSAoZHJtX2ludGVsX2JvICpibyk7CisKKwkvKioKKwkgKiBSZWxlYXNlcyBhIHJlZmVyZW5jZSBvbiBhIGJ1ZmZlciBvYmplY3QsIGZyZWVpbmcgdGhlIGRhdGEgaWYKKwkgKiBubyByZWZlcmVuY2VzIHJlbWFpbi4KKwkgKi8KKwl2b2lkICgqYm9fdW5yZWZlcmVuY2UpIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIE1hcHMgdGhlIGJ1ZmZlciBpbnRvIHVzZXJzcGFjZS4KKwkgKgorCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB3YWl0aW5nIGZvciBhbnkgZXhpc3RpbmcgZXhlY3V0aW9uIG9uIHRoZQorCSAqIGJ1ZmZlciB0byBjb21wbGV0ZSwgZmlyc3QuICBUaGUgcmVzdWx0aW5nIG1hcHBpbmcgaXMgYXZhaWxhYmxlIGF0CisJICogYnVmLT52aXJ0dWFsLgorCSAqLworCWludCAoKmJvX21hcCkgKGRybV9pbnRlbF9ibyAqYm8sIGludCB3cml0ZV9lbmFibGUpOworCisJLyoqCisJICogUmVkdWNlcyB0aGUgcmVmY291bnQgb24gdGhlIHVzZXJzcGFjZSBtYXBwaW5nIG9mIHRoZSBidWZmZXIKKwkgKiBvYmplY3QuCisJICovCisJaW50ICgqYm9fdW5tYXApIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIFdyaXRlIGRhdGEgaW50byBhbiBvYmplY3QuCisJICoKKwkgKiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uLCBpZiBtaXNzaW5nLAorCSAqIGRybV9pbnRlbF9ibyB3aWxsIG1hcC9tZW1jcHkvdW5tYXAuCisJICovCisJaW50ICgqYm9fc3ViZGF0YSkgKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCB2b2lkICpkYXRhKTsKKworCS8qKgorCSAqIFJlYWQgZGF0YSBmcm9tIGFuIG9iamVjdAorCSAqCisJICogVGhpcyBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbiwgaWYgbWlzc2luZywKKwkgKiBkcm1faW50ZWxfYm8gd2lsbCBtYXAvbWVtY3B5L3VubWFwLgorCSAqLworCWludCAoKmJvX2dldF9zdWJkYXRhKSAoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKTsKKworCS8qKgorCSAqIFdhaXRzIGZvciByZW5kZXJpbmcgdG8gYW4gb2JqZWN0IGJ5IHRoZSBHUFUgdG8gaGF2ZSBjb21wbGV0ZWQuCisJICoKKwkgKiBUaGlzIGlzIG5vdCByZXF1aXJlZCBmb3IgYW55IGFjY2VzcyB0byB0aGUgQk8gYnkgYm9fbWFwLAorCSAqIGJvX3N1YmRhdGEsIGV0Yy4gIEl0IGlzIG1lcmVseSBhIHdheSBmb3IgdGhlIGRyaXZlciB0byBpbXBsZW1lbnQKKwkgKiBnbEZpbmlzaC4KKwkgKi8KKwl2b2lkICgqYm9fd2FpdF9yZW5kZXJpbmcpIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIFRlYXJzIGRvd24gdGhlIGJ1ZmZlciBtYW5hZ2VyIGluc3RhbmNlLgorCSAqLworCXZvaWQgKCpkZXN0cm95KSAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKTsKKworCS8qKgorCSAqIEFkZCByZWxvY2F0aW9uIGVudHJ5IGluIHJlbG9jX2J1Ziwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlCisJICogdGFyZ2V0IGJ1ZmZlcidzIHJlYWwgb2Zmc2V0IG9uIG9uIGNvbW1hbmQgc3VibWlzc2lvbi4KKwkgKgorCSAqIFJlbG9jYXRpb25zIHJlbWFpbiBpbiBwbGFjZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBidWZmZXIgb2JqZWN0LgorCSAqCisJICogXHBhcmFtIGJvIEJ1ZmZlciB0byB3cml0ZSB0aGUgcmVsb2NhdGlvbiBpbnRvLgorCSAqIFxwYXJhbSBvZmZzZXQgQnl0ZSBvZmZzZXQgd2l0aGluIHJlbG9jX2JvIG9mIHRoZSBwb2ludGVyIHRvCisJICoJCQl0YXJnZXRfYm8uCisJICogXHBhcmFtIHRhcmdldF9ibyBCdWZmZXIgd2hvc2Ugb2Zmc2V0IHNob3VsZCBiZSB3cml0dGVuIGludG8gdGhlCisJICogICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIGVudHJ5LgorCSAqIFxwYXJhbSB0YXJnZXRfb2Zmc2V0IENvbnN0YW50IHZhbHVlIHRvIGJlIGFkZGVkIHRvIHRhcmdldF9ibydzCisJICoJCQlvZmZzZXQgaW4gcmVsb2NhdGlvbiBlbnRyeS4KKwkgKiBccGFyYW0gcmVhZF9kb21haW5zIEdFTSByZWFkIGRvbWFpbnMgd2hpY2ggdGhlIGJ1ZmZlciB3aWxsIGJlCisJICoJCQlyZWFkIGludG8gYnkgdGhlIGNvbW1hbmQgdGhhdCB0aGlzIHJlbG9jYXRpb24KKwkgKgkJCWlzIHBhcnQgb2YuCisJICogXHBhcmFtIHdyaXRlX2RvbWFpbnMgR0VNIHJlYWQgZG9tYWlucyB3aGljaCB0aGUgYnVmZmVyIHdpbGwgYmUKKwkgKgkJCWRpcnRpZWQgaW4gYnkgdGhlIGNvbW1hbmQgdGhhdCB0aGlzCisJICoJCQlyZWxvY2F0aW9uIGlzIHBhcnQgb2YuCisJICovCisJaW50ICgqYm9fZW1pdF9yZWxvYykgKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCSAgICAgIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvLCB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkJICAgICAgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pOworCWludCAoKmJvX2VtaXRfcmVsb2NfZmVuY2UpKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCQkgICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywKKwkJCQkgICB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkJCSAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywKKwkJCQkgICB1aW50MzJfdCB3cml0ZV9kb21haW4pOworCisJLyoqIEV4ZWN1dGVzIHRoZSBjb21tYW5kIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGJvLiAqLworCWludCAoKmJvX2V4ZWMpIChkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwKKwkJCWRybV9jbGlwX3JlY3RfdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywKKwkJCWludCBEUjQpOworCisJLyoqIEV4ZWN1dGVzIHRoZSBjb21tYW5kIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGJvIG9uIHRoZSBzZWxlY3RlZAorCSAqIHJpbmcgYnVmZmVyCisJICovCisJaW50ICgqYm9fbXJiX2V4ZWMpIChkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwKKwkJCSAgICBkcm1fY2xpcF9yZWN0X3QgKmNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsCisJCQkgICAgaW50IERSNCwgdW5zaWduZWQgZmxhZ3MpOworCisJLyoqCisJICogUGluIGEgYnVmZmVyIHRvIHRoZSBhcGVydHVyZSBhbmQgZml4IHRoZSBvZmZzZXQgdW50aWwgdW5waW5uZWQKKwkgKgorCSAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHBpbgorCSAqIFxwYXJhbSBhbGlnbm1lbnQgUmVxdWlyZWQgYWxpZ25tZW50IGZvciBhcGVydHVyZSwgaW4gYnl0ZXMKKwkgKi8KKwlpbnQgKCpib19waW4pIChkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBhbGlnbm1lbnQpOworCisJLyoqCisJICogVW5waW4gYSBidWZmZXIgZnJvbSB0aGUgYXBlcnR1cmUsIGFsbG93aW5nIGl0IHRvIGJlIHJlbW92ZWQKKwkgKgorCSAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHVucGluCisJICovCisJaW50ICgqYm9fdW5waW4pIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIEFzayB0aGF0IHRoZSBidWZmZXIgYmUgcGxhY2VkIGluIHRpbGluZyBtb2RlCisJICoKKwkgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byBzZXQgdGlsaW5nIG1vZGUgZm9yCisJICogXHBhcmFtIHRpbGluZ19tb2RlIGRlc2lyZWQsIGFuZCByZXR1cm5lZCB0aWxpbmcgbW9kZQorCSAqLworCWludCAoKmJvX3NldF90aWxpbmcpIChkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAorCQkJICAgICAgdWludDMyX3Qgc3RyaWRlKTsKKworCS8qKgorCSAqIEdldCB0aGUgY3VycmVudCB0aWxpbmcgKGFuZCByZXN1bHRpbmcgc3dpenpsaW5nKSBtb2RlIGZvciB0aGUgYm8uCisJICoKKwkgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byBnZXQgdGlsaW5nIG1vZGUgZm9yCisJICogXHBhcmFtIHRpbGluZ19tb2RlIHJldHVybmVkIHRpbGluZyBtb2RlCisJICogXHBhcmFtIHN3aXp6bGVfbW9kZSByZXR1cm5lZCBzd2l6emxpbmcgbW9kZQorCSAqLworCWludCAoKmJvX2dldF90aWxpbmcpIChkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAorCQkJICAgICAgdWludDMyX3QgKiBzd2l6emxlX21vZGUpOworCisJLyoqCisJICogQ3JlYXRlIGEgdmlzaWJsZSBuYW1lIGZvciBhIGJ1ZmZlciB3aGljaCBjYW4gYmUgdXNlZCBieSBvdGhlciBhcHBzCisJICoKKwkgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byBjcmVhdGUgYSBuYW1lIGZvcgorCSAqIFxwYXJhbSBuYW1lIFJldHVybmVkIG5hbWUKKwkgKi8KKwlpbnQgKCpib19mbGluaykgKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogbmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIDEgaWYgbWFwcGluZyB0aGUgYnVmZmVyIGZvciB3cml0ZSBjb3VsZCBjYXVzZSB0aGUgcHJvY2VzcworCSAqIHRvIGJsb2NrLCBkdWUgdG8gdGhlIG9iamVjdCBiZWluZyBhY3RpdmUgaW4gdGhlIEdQVS4KKwkgKi8KKwlpbnQgKCpib19idXN5KSAoZHJtX2ludGVsX2JvICpibyk7CisKKwkvKioKKwkgKiBTcGVjaWZ5IHRoZSB2b2xhdGlsaXR5IG9mIHRoZSBidWZmZXIuCisJICogXHBhcmFtIGJvIEJ1ZmZlciB0byBjcmVhdGUgYSBuYW1lIGZvcgorCSAqIFxwYXJhbSBtYWR2IFRoZSBwdXJnZWFibGUgc3RhdHVzCisJICoKKwkgKiBVc2UgSTkxNV9NQURWX0RPTlRORUVEIHRvIG1hcmsgdGhlIGJ1ZmZlciBhcyBwdXJnZWFibGUsIGFuZCBpdCB3aWxsIGJlCisJICogcmVjbGFpbWVkIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS4gSWYgeW91IHN1YnNlcXVlbnRseSByZXF1aXJlIHRoZSBidWZmZXIsCisJICogdGhlbiB5b3UgbXVzdCBwYXNzIEk5MTVfTUFEVl9XSUxMTkVFRCB0byBtYXJrIHRoZSBidWZmZXIgYXMgcmVxdWlyZWQuCisJICoKKwkgKiBSZXR1cm5zIDEgaWYgdGhlIGJ1ZmZlciB3YXMgcmV0YWluZWQsIG9yIDAgaWYgaXQgd2FzIGRpc2NhcmRlZCB3aGlsc3QKKwkgKiBtYXJrZWQgYXMgSTkxNV9NQURWX0RPTlRORUVELgorCSAqLworCWludCAoKmJvX21hZHZpc2UpIChkcm1faW50ZWxfYm8gKmJvLCBpbnQgbWFkdik7CisKKwlpbnQgKCpjaGVja19hcGVydHVyZV9zcGFjZSkgKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KTsKKworCS8qKgorCSAqIERpc2FibGUgYnVmZmVyIHJldXNlIGZvciBidWZmZXJzIHdoaWNoIHdpbGwgYmUgc2hhcmVkIGluIHNvbWUgd2F5LAorCSAqIGFzIHdpdGggc2Nhbm91dCBidWZmZXJzLiBXaGVuIHRoZSBidWZmZXIgcmVmZXJlbmNlIGNvdW50IGdvZXMgdG8KKwkgKiB6ZXJvLCBpdCB3aWxsIGJlIGZyZWVkIGFuZCBub3QgcGxhY2VkIGluIHRoZSByZXVzZSBsaXN0LgorCSAqCisJICogXHBhcmFtIGJvIEJ1ZmZlciB0byBkaXNhYmxlIHJldXNlIGZvcgorCSAqLworCWludCAoKmJvX2Rpc2FibGVfcmV1c2UpIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIFF1ZXJ5IHdoZXRoZXIgYSBidWZmZXIgaXMgcmV1c2FibGUuCisJICoKKwkgKiBccGFyYW0gYm8gQnVmZmVyIHRvIHF1ZXJ5CisJICovCisJaW50ICgqYm9faXNfcmV1c2FibGUpIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqCisJICogUmV0dXJuIHRoZSBwaXBlIGFzc29jaWF0ZWQgd2l0aCBhIGNydGNfaWQgc28gdGhhdCB2YmxhbmsKKwkgKiBzeW5jaHJvbml6YXRpb24gY2FuIHVzZSB0aGUgY29ycmVjdCBkYXRhIGluIHRoZSByZXF1ZXN0LgorCSAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEtNUyBhbmQgZ2VtIGF0IHRoaXMgcG9pbnQsIHdoZW4KKwkgKiB1bnN1cHBvcnRlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIC0xIGFuZCBsZWF2ZXMgdGhlIGRlY2lzaW9uCisJICogb2Ygd2hhdCB0byBkbyBpbiB0aGF0IGNhc2UgdG8gdGhlIGNhbGxlcgorCSAqCisJICogXHBhcmFtIGJ1Zm1nciB0aGUgYXNzb2NpYXRlZCBidWZmZXIgbWFuYWdlcgorCSAqIFxwYXJhbSBjcnRjX2lkIHRoZSBjcnRjIGlkZW50aWZpZXIKKwkgKi8KKwlpbnQgKCpnZXRfcGlwZV9mcm9tX2NydGNfaWQpIChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCBjcnRjX2lkKTsKKworCS8qKiBSZXR1cm5zIHRydWUgaWYgdGFyZ2V0X2JvIGlzIGluIHRoZSByZWxvY2F0aW9uIHRyZWUgcm9vdGVkIGF0IGJvLiAqLworCWludCAoKmJvX3JlZmVyZW5jZXMpIChkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibyk7CisKKwkvKio8IEVuYWJsZXMgdmVyYm9zZSBkZWJ1Z2dpbmcgcHJpbnRvdXRzICovCisJaW50IGRlYnVnOworfTsKKworc3RydWN0IF9kcm1faW50ZWxfY29udGV4dCB7CisJdW5zaWduZWQgaW50IGN0eF9pZDsKKwlzdHJ1Y3QgX2RybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncjsKK307CisKKyNkZWZpbmUgQUxJR04odmFsdWUsIGFsaWdubWVudCkJKCh2YWx1ZSArIGFsaWdubWVudCAtIDEpICYgfihhbGlnbm1lbnQgLSAxKSkKKyNkZWZpbmUgUk9VTkRfVVBfVE8oeCwgeSkJKCgoeCkgKyAoeSkgLSAxKSAvICh5KSAqICh5KSkKKyNkZWZpbmUgUk9VTkRfVVBfVE9fTUIoeCkJUk9VTkRfVVBfVE8oKHgpLCAxMDI0KjEwMjQpCisKKyNlbmRpZiAvKiBJTlRFTF9CVUZNR1JfUFJJVl9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9jaGlwc2V0LmggYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9jaGlwc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyYTg2NwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2ludGVsL2ludGVsX2NoaXBzZXQuaApAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9JTlRFTF9DSElQU0VUX0gKKyNkZWZpbmUgX0lOVEVMX0NISVBTRVRfSAorCisjZGVmaW5lIFBDSV9DSElQX0k4MTAJCQkweDcxMjEKKyNkZWZpbmUgUENJX0NISVBfSTgxMF9EQzEwMAkJMHg3MTIzCisjZGVmaW5lIFBDSV9DSElQX0k4MTBfRQkJCTB4NzEyNQorI2RlZmluZSBQQ0lfQ0hJUF9JODE1CQkJMHgxMTMyCisKKyNkZWZpbmUgUENJX0NISVBfSTgzMF9NCQkJMHgzNTc3CisjZGVmaW5lIFBDSV9DSElQXzg0NV9HCQkJMHgyNTYyCisjZGVmaW5lIFBDSV9DSElQX0k4NTVfR00JCTB4MzU4MgorI2RlZmluZSBQQ0lfQ0hJUF9JODY1X0cJCQkweDI1NzIKKworI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0cJCQkweDI1ODIKKyNkZWZpbmUgUENJX0NISVBfRTcyMjFfRwkJMHgyNThBCisjZGVmaW5lIFBDSV9DSElQX0k5MTVfR00JCTB4MjU5MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0cJCQkweDI3NzIKKyNkZWZpbmUgUENJX0NISVBfSTk0NV9HTQkJMHgyN0EyCisjZGVmaW5lIFBDSV9DSElQX0k5NDVfR01FCQkweDI3QUUKKworI2RlZmluZSBQQ0lfQ0hJUF9RMzVfRwkJCTB4MjlCMgorI2RlZmluZSBQQ0lfQ0hJUF9HMzNfRwkJCTB4MjlDMgorI2RlZmluZSBQQ0lfQ0hJUF9RMzNfRwkJCTB4MjlEMgorCisjZGVmaW5lIFBDSV9DSElQX0lHRF9HTQkJCTB4QTAxMQorI2RlZmluZSBQQ0lfQ0hJUF9JR0RfRwkJCTB4QTAwMQorCisjZGVmaW5lIElTX0lHREdNKGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSUdEX0dNKQorI2RlZmluZSBJU19JR0RHKGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSUdEX0cpCisjZGVmaW5lIElTX0lHRChkZXZpZCkJCShJU19JR0RHKGRldmlkKSB8fCBJU19JR0RHTShkZXZpZCkpCisKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HCQkJMHgyOUEyCisjZGVmaW5lIFBDSV9DSElQX0k5NjVfUQkJCTB4Mjk5MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X0dfMQkJMHgyOTgyCisjZGVmaW5lIFBDSV9DSElQX0k5NDZfR1oJCTB4Mjk3MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X0dNCQkweDJBMDIKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HTUUJCTB4MkExMgorCisjZGVmaW5lIFBDSV9DSElQX0dNNDVfR00JCTB4MkE0MgorCisjZGVmaW5lIFBDSV9DSElQX0lHRF9FX0cJCTB4MkUwMgorI2RlZmluZSBQQ0lfQ0hJUF9RNDVfRwkJCTB4MkUxMgorI2RlZmluZSBQQ0lfQ0hJUF9HNDVfRwkJCTB4MkUyMgorI2RlZmluZSBQQ0lfQ0hJUF9HNDFfRwkJCTB4MkUzMgorCisjZGVmaW5lIFBDSV9DSElQX0lMRF9HCQkJMHgwMDQyCisjZGVmaW5lIFBDSV9DSElQX0lMTV9HCQkJMHgwMDQ2CisKKyNkZWZpbmUgUENJX0NISVBfU0FORFlCUklER0VfR1QxCTB4MDEwMiAvKiBkZXNrdG9wICovCisjZGVmaW5lIFBDSV9DSElQX1NBTkRZQlJJREdFX0dUMgkweDAxMTIKKyNkZWZpbmUgUENJX0NISVBfU0FORFlCUklER0VfR1QyX1BMVVMJMHgwMTIyCisjZGVmaW5lIFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QxCTB4MDEwNiAvKiBtb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfU0FORFlCUklER0VfTV9HVDIJMHgwMTE2CisjZGVmaW5lIFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QyX1BMVVMJMHgwMTI2CisjZGVmaW5lIFBDSV9DSElQX1NBTkRZQlJJREdFX1MJCTB4MDEwQSAvKiBzZXJ2ZXIgKi8KKworI2RlZmluZSBQQ0lfQ0hJUF9JVllCUklER0VfR1QxCQkweDAxNTIgLyogZGVza3RvcCAqLworI2RlZmluZSBQQ0lfQ0hJUF9JVllCUklER0VfR1QyCQkweDAxNjIKKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX01fR1QxCTB4MDE1NiAvKiBtb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX01fR1QyCTB4MDE2NgorI2RlZmluZSBQQ0lfQ0hJUF9JVllCUklER0VfUwkJMHgwMTVhIC8qIHNlcnZlciAqLworI2RlZmluZSBQQ0lfQ0hJUF9JVllCUklER0VfU19HVDIJMHgwMTZhIC8qIHNlcnZlciAqLworCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfR1QxCQkweDA0MDIgLyogRGVza3RvcCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0dUMgkJMHgwNDEyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfR1QzCQkweDA0MjIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9NX0dUMQkJMHgwNDA2IC8qIE1vYmlsZSAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX01fR1QyCQkweDA0MTYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9NX0dUMwkJMHgwNDI2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU19HVDEJCTB4MDQwQSAvKiBTZXJ2ZXIgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TX0dUMgkJMHgwNDFBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU19HVDMJCTB4MDQyQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0JfR1QxCQkweDA0MEIgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9CX0dUMgkJMHgwNDFCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQl9HVDMJCTB4MDQyQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0VfR1QxCQkweDA0MEUgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9FX0dUMgkJMHgwNDFFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfRV9HVDMJCTB4MDQyRQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9HVDEJMHgwQzAyIC8qIERlc2t0b3AgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfR1QyCTB4MEMxMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9HVDMJMHgwQzIyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX01fR1QxCTB4MEMwNiAvKiBNb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfTV9HVDIJMHgwQzE2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX01fR1QzCTB4MEMyNgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMQkweDBDMEEgLyogU2VydmVyICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX1NfR1QyCTB4MEMxQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMwkweDBDMkEKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfQl9HVDEJMHgwQzBCIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX0JfR1QyCTB4MEMxQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9CX0dUMwkweDBDMkIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfRV9HVDEJMHgwQzBFIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX0VfR1QyCTB4MEMxRQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9FX0dUMwkweDBDMkUKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfR1QxCTB4MEEwMiAvKiBEZXNrdG9wICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0dUMgkweDBBMTIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfR1QzCTB4MEEyMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMQkweDBBMDYgLyogTW9iaWxlICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX01fR1QyCTB4MEExNgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMwkweDBBMjYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfU19HVDEJMHgwQTBBIC8qIFNlcnZlciAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9TX0dUMgkweDBBMUEKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfU19HVDMJMHgwQTJBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0JfR1QxCTB4MEEwQiAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9CX0dUMgkweDBBMUIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDMJMHgwQTJCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0VfR1QxCTB4MEEwRSAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9FX0dUMgkweDBBMUUKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfRV9HVDMJMHgwQTJFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0dUMQkweDBEMDIgLyogRGVza3RvcCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19HVDIJMHgwRDEyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0dUMwkweDBEMjIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfTV9HVDEJMHgwRDA2IC8qIE1vYmlsZSAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19NX0dUMgkweDBEMTYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfTV9HVDMJMHgwRDI2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX1NfR1QxCTB4MEQwQSAvKiBTZXJ2ZXIgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfU19HVDIJMHgwRDFBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX1NfR1QzCTB4MEQyQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19CX0dUMQkweDBEMEIgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfQl9HVDIJMHgwRDFCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0JfR1QzCTB4MEQyQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19FX0dUMQkweDBEMEUgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfRV9HVDIJMHgwRDFFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QzCTB4MEQyRQorI2RlZmluZSBCRFdfU1BBUkUJCQkweDIKKyNkZWZpbmUgQkRXX1VMVAkJCQkweDYKKyNkZWZpbmUgQkRXX1NFUlZFUgkJCTB4YQorI2RlZmluZSBCRFdfSVJJUwkJCTB4YgorI2RlZmluZSBCRFdfV09SS1NUQVRJT04JCQkweGQKKyNkZWZpbmUgQkRXX1VMWAkJCQkweGUKKworI2RlZmluZSBQQ0lfQ0hJUF9WQUxMRVlWSUVXX1BPCQkweDBmMzAgLyogVkxWIFBPIGJvYXJkICovCisjZGVmaW5lIFBDSV9DSElQX1ZBTExFWVZJRVdfMQkJMHgwZjMxCisjZGVmaW5lIFBDSV9DSElQX1ZBTExFWVZJRVdfMgkJMHgwZjMyCisjZGVmaW5lIFBDSV9DSElQX1ZBTExFWVZJRVdfMwkJMHgwZjMzCisKKyNkZWZpbmUgUENJX0NISVBfQ0hFUlJZVklFV18wCQkweDIyYjAKKyNkZWZpbmUgUENJX0NISVBfQ0hFUlJZVklFV18xCQkweDIyYjEKKyNkZWZpbmUgUENJX0NISVBfQ0hFUlJZVklFV18yCQkweDIyYjIKKyNkZWZpbmUgUENJX0NISVBfQ0hFUlJZVklFV18zCQkweDIyYjMKKworI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1VMVF9HVDIJMHgxOTE2CisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfVUxUX0dUMQkweDE5MDYKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9VTFRfR1QzCTB4MTkyNgorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1VMVF9HVDJGCTB4MTkyMQorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1VMWF9HVDEJMHgxOTBFCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfVUxYX0dUMgkweDE5MUUKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9EVF9HVDIJCTB4MTkxMgorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX0RUX0dUMQkJMHgxOTAyCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfSEFMT19HVDIJMHgxOTFCCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfSEFMT19HVDMJMHgxOTJCCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfSEFMT19HVDEgCTB4MTkwQgorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1NSVl9HVDIJMHgxOTFBCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUMwkweDE5MkEKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9TUlZfR1QxCTB4MTkwQQorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1dLU19HVDIgCTB4MTkxRAorCisjZGVmaW5lIElTX01PQklMRShkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfSTg1NV9HTSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTkxNV9HTSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk0NV9HTSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk0NV9HTUUgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k5NjVfR00gfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k5NjVfR01FIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9HTTQ1X0dNIHx8IElTX0lHRChkZXZpZCkgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0lWWUJSSURHRV9NX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSVZZQlJJREdFX01fR1QyKQorCisjZGVmaW5lIElTX0c0NShkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0lHRF9FX0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1E0NV9HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9HNDVfRyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfRzQxX0cpCisjZGVmaW5lIElTX0dNNDUoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9HTTQ1X0dNKQorI2RlZmluZSBJU19HNFgoZGV2aWQpCQkoSVNfRzQ1KGRldmlkKSB8fCBJU19HTTQ1KGRldmlkKSkKKworI2RlZmluZSBJU19JTEQoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JTERfRykKKyNkZWZpbmUgSVNfSUxNKGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSUxNX0cpCisKKyNkZWZpbmUgSVNfOTE1KGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSTkxNV9HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9FNzIyMV9HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTE1X0dNKQorCisjZGVmaW5lIElTXzk0NUdNKGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSTk0NV9HTSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk0NV9HTUUpCisKKyNkZWZpbmUgSVNfOTQ1KGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSTk0NV9HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTQ1X0dNIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTQ1X0dNRSB8fCBcCisJCQkJIElTX0czMyhkZXZpZCkpCisKKyNkZWZpbmUgSVNfRzMzKGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfRzMzX0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1EzM19HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9RMzVfRyB8fCBJU19JR0QoZGV2aWQpKQorCisjZGVmaW5lIElTX0dFTjIoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JODMwX00gfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQXzg0NV9HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JODU1X0dNIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JODY1X0cpCisKKyNkZWZpbmUgSVNfR0VOMyhkZXZpZCkJCShJU185NDUoZGV2aWQpIHx8IElTXzkxNShkZXZpZCkpCisKKyNkZWZpbmUgSVNfR0VONChkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0k5NjVfRyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk2NV9RIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTY1X0dfMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk2NV9HTSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk2NV9HTUUgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k5NDZfR1ogfHwgXAorCQkJCSBJU19HNFgoZGV2aWQpKQorCisjZGVmaW5lIElTX0dFTjUoZGV2aWQpCQkoSVNfSUxEKGRldmlkKSB8fCBJU19JTE0oZGV2aWQpKQorCisjZGVmaW5lIElTX0dFTjYoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NBTkRZQlJJREdFX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0FORFlCUklER0VfR1QyX1BMVVMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9NX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0FORFlCUklER0VfTV9HVDJfUExVUyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0FORFlCUklER0VfUykKKworI2RlZmluZSBJU19HRU43KGRldmlkKQkJKElTX0lWWUJSSURHRShkZXZpZCkgfHwgXAorCQkJCSBJU19IQVNXRUxMKGRldmlkKSB8fCBcCisJCQkJIElTX1ZBTExFWVZJRVcoZGV2aWQpKQorCisjZGVmaW5lIElTX0lWWUJSSURHRShkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfSVZZQlJJREdFX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSVZZQlJJREdFX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSVZZQlJJREdFX01fR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JVllCUklER0VfTV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0lWWUJSSURHRV9TIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JVllCUklER0VfU19HVDIpCisKKyNkZWZpbmUgSVNfVkFMTEVZVklFVyhkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfVkFMTEVZVklFV19QTyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfVkFMTEVZVklFV18xIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9WQUxMRVlWSUVXXzIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1ZBTExFWVZJRVdfMykKKworI2RlZmluZSBJU19IU1dfR1QxKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9NX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9CX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9FX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9NX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfU19HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0JfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9FX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfU19HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX0JfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9FX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19NX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfU19HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0JfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19FX0dUMSkKKyNkZWZpbmUgSVNfSFNXX0dUMihkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfTV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU19HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQl9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfRV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfTV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX1NfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9CX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfRV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfTV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX1NfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9CX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfRV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfTV9HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX1NfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19CX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfRV9HVDIpCisjZGVmaW5lIElTX0hTV19HVDMoZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX01fR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0JfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0VfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX01fR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfQl9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0VfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX01fR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9TX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX0VfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX01fR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19TX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfQl9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QzKQorCisjZGVmaW5lIElTX0hBU1dFTEwoZGV2aWQpCShJU19IU1dfR1QxKGRldmlkKSB8fCBcCisJCQkJIElTX0hTV19HVDIoZGV2aWQpIHx8IFwKKwkJCQkgSVNfSFNXX0dUMyhkZXZpZCkpCisKKyNkZWZpbmUgSVNfQlJPQURXRUxMKGRldmlkKSAgICAgKCgoZGV2aWQgJiAweGZmMDApICE9IDB4MTYwMCkgPyAwIDogXAorCQkJCSgoKGRldmlkICYgMHgwMGYwKSA+PiA0KSA+IDMpID8gMCA6IFwKKwkJCQkoKGRldmlkICYgMHgwMDBmKSA9PSBCRFdfU1BBUkUpID8gMSA6IFwKKwkJCQkoKGRldmlkICYgMHgwMDBmKSA9PSBCRFdfVUxUKSA/IDEgOiBcCisJCQkJKChkZXZpZCAmIDB4MDAwZikgPT0gQkRXX0lSSVMpID8gMSA6IFwKKwkJCQkoKGRldmlkICYgMHgwMDBmKSA9PSBCRFdfU0VSVkVSKSA/IDEgOiBcCisJCQkJKChkZXZpZCAmIDB4MDAwZikgPT0gQkRXX1dPUktTVEFUSU9OKSA/IDEgOiBcCisJCQkJKChkZXZpZCAmIDB4MDAwZikgPT0gQkRXX1VMWCkgPyAxIDogMCkKKworI2RlZmluZSBJU19DSEVSUllWSUVXKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9DSEVSUllWSUVXXzAgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0NIRVJSWVZJRVdfMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfQ0hFUlJZVklFV18yIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DSEVSUllWSUVXXzMpCisKKyNkZWZpbmUgSVNfR0VOOChkZXZpZCkJCShJU19CUk9BRFdFTEwoZGV2aWQpIHx8IFwKKwkJCQkgSVNfQ0hFUlJZVklFVyhkZXZpZCkpCisKKyNkZWZpbmUgSVNfU0tMX0dUMShkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9VTFRfR1QxCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1VMWF9HVDEJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfRFRfR1QxCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX0hBTE9fR1QxCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1NSVl9HVDEpCisKKyNkZWZpbmUgSVNfU0tMX0dUMihkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9VTFRfR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1VMVF9HVDJGCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1VMWF9HVDIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfRFRfR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX0hBTE9fR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1NSVl9HVDIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfV0tTX0dUMikKKworI2RlZmluZSBJU19TS0xfR1QzKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1VMVF9HVDMJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfSEFMT19HVDMJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUMykKKworI2RlZmluZSBJU19TS1lMQUtFKGRldmlkKQkoSVNfU0tMX0dUMShkZXZpZCkgfHwgXAorCQkJCSBJU19TS0xfR1QyKGRldmlkKSB8fCBcCisJCQkJIElTX1NLTF9HVDMoZGV2aWQpKQorCisjZGVmaW5lIElTX0dFTjkoZGV2aWQpCQlJU19TS1lMQUtFKGRldmlkKQorCisjZGVmaW5lIElTXzlYWChkZXYpCQkoSVNfR0VOMyhkZXYpIHx8IFwKKwkJCQkgSVNfR0VONChkZXYpIHx8IFwKKwkJCQkgSVNfR0VONShkZXYpIHx8IFwKKwkJCQkgSVNfR0VONihkZXYpIHx8IFwKKwkJCQkgSVNfR0VONyhkZXYpIHx8IFwKKwkJCQkgSVNfR0VOOChkZXYpIHx8IFwKKwkJCQkgSVNfR0VOOShkZXYpKQorCisKKyNlbmRpZiAvKiBfSU5URUxfQ0hJUFNFVF9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9kZWNvZGUuYyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2ludGVsL2ludGVsX2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZDQ3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS9pbnRlbC9pbnRlbF9kZWNvZGUuYwpAQCAtMCwwICsxLDM5ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZHJtLmgiCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKworLyogU3RydWN0IGZvciB0cmFja2luZyBkcm1faW50ZWxfZGVjb2RlIHN0YXRlLiAqLworc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgeworCS8qKiBzdGRpbyBmaWxlIHdoZXJlIHRoZSBvdXRwdXQgc2hvdWxkIGxhbmQuICBEZWZhdWx0cyB0byBzdGRvdXQuICovCisJRklMRSAqb3V0OworCisJLyoqIFBDSSBkZXZpY2UgSUQuICovCisJdWludDMyX3QgZGV2aWQ7CisKKwkvKioKKwkgKiBTaG9ydGhhbmQgZGV2aWNlIGlkZW50aWZpZXI6IDMgaXMgOTE1LCA0IGlzIDk2NSwgNSBpcworCSAqIElyb25sYWtlLCBldGMuCisJICovCisJaW50IGdlbjsKKworCS8qKiBHUFUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGFja2V0LiAqLworCXVpbnQzMl90IGh3X29mZnNldDsKKwkvKiogQ1BVIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGFja2V0LiAqLworCXVpbnQzMl90ICpkYXRhOworCS8qKiBEV09SRHMgb2YgcmVtYWluaW5nIGJhdGNoYnVmZmVyIGRhdGEgc3RhcnRpbmcgZnJvbSB0aGUgcGFja2V0LiAqLworCXVpbnQzMl90IGNvdW50OworCisJLyoqIEdQVSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgYmF0Y2hidWZmZXIgZGF0YS4gKi8KKwl1aW50MzJfdCBiYXNlX2h3X29mZnNldDsKKwkvKiogQ1BVIFZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGJhdGNoYnVmZmVyIGRhdGEuICovCisJdWludDMyX3QgKmJhc2VfZGF0YTsKKwkvKiogTnVtYmVyIG9mIERXT1JEcyBvZiBiYXRjaGJ1ZmZlciBkYXRhLiAqLworCXVpbnQzMl90IGJhc2VfY291bnQ7CisKKwkvKiogQHsKKwkgKiBHUFUgaGVhZCBhbmQgdGFpbCBwb2ludGVycywgd2hpY2ggd2lsbCBiZSBub3RlZCBpbiB0aGUgZHVtcCwgb3IgfjAuCisJICovCisJdWludDMyX3QgaGVhZCwgdGFpbDsKKwkvKiogQH0gKi8KKworCS8qKgorCSAqIFdoZXRoZXIgdG8gZHVtcCB0aGUgZHdvcmRzIGFmdGVyIE1JX0JBVENIQlVGRkVSX0VORC4KKwkgKgorCSAqIFRoaXMgc29tZXRpbWVzIHByb3ZpZGVzIGNsdWVzIGluIGNvcnJ1cHRlZCBiYXRjaGJ1ZmZlcnMsCisJICogYW5kIGlzIHVzZWQgYnkgdGhlIGludGVsLWdwdS10b29scy4KKwkgKi8KKwlib29sIGR1bXBfcGFzdF9lbmQ7CisKKwlib29sIG92ZXJmbG93ZWQ7Cit9OworCitzdGF0aWMgRklMRSAqb3V0Oworc3RhdGljIHVpbnQzMl90IHNhdmVkX3MyID0gMCwgc2F2ZWRfczQgPSAwOworc3RhdGljIGNoYXIgc2F2ZWRfczJfc2V0ID0gMCwgc2F2ZWRfczRfc2V0ID0gMDsKK3N0YXRpYyB1aW50MzJfdCBoZWFkX29mZnNldCA9IDB4ZmZmZmZmZmY7CS8qIHVuZGVmaW5lZCAqLworc3RhdGljIHVpbnQzMl90IHRhaWxfb2Zmc2V0ID0gMHhmZmZmZmZmZjsJLyogdW5kZWZpbmVkICovCisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKEEpIChzaXplb2YoQSkvc2l6ZW9mKEFbMF0pKQorI2VuZGlmCisKKyNkZWZpbmUgQlVGRkVSX0ZBSUwoX2NvdW50LCBfbGVuLCBfbmFtZSkgZG8gewkJCVwKKyAgICBmcHJpbnRmKG91dCwgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCBpbiAlcyAoJWQgPCAlZClcbiIsCVwKKwkgICAgKF9uYW1lKSwgKF9jb3VudCksIChfbGVuKSk7CQkJCVwKKyAgICByZXR1cm4gX2NvdW50OwkJCQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBmbG9hdCBpbnRfYXNfZmxvYXQodWludDMyX3QgaW50dmFsKQoreworCXVuaW9uIGludGZsb2F0IHsKKwkJdWludDMyX3QgaTsKKwkJZmxvYXQgZjsKKwl9IHV2YWw7CisKKwl1dmFsLmkgPSBpbnR2YWw7CisJcmV0dXJuIHV2YWwuZjsKK30KKworc3RhdGljIHZvaWQgRFJNX1BSSU5URkxJS0UoMywgNCkKK2luc3RyX291dChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCWNvbnN0IGNoYXIgKnBhcnNlaW5mbzsKKwl1aW50MzJfdCBvZmZzZXQgPSBjdHgtPmh3X29mZnNldCArIGluZGV4ICogNDsKKworCWlmIChpbmRleCA+IGN0eC0+Y291bnQpIHsKKwkJaWYgKCFjdHgtPm92ZXJmbG93ZWQpIHsKKwkJCWZwcmludGYob3V0LCAiRVJST1I6IERlY29kZSBhdHRlbXB0ZWQgdG8gY29udGludWUgYmV5b25kIGVuZCBvZiBiYXRjaGJ1ZmZlclxuIik7CisJCQljdHgtPm92ZXJmbG93ZWQgPSB0cnVlOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAob2Zmc2V0ID09IGhlYWRfb2Zmc2V0KQorCQlwYXJzZWluZm8gPSAiSEVBRCI7CisJZWxzZSBpZiAob2Zmc2V0ID09IHRhaWxfb2Zmc2V0KQorCQlwYXJzZWluZm8gPSAiVEFJTCI7CisJZWxzZQorCQlwYXJzZWluZm8gPSAiICAgICI7CisKKwlmcHJpbnRmKG91dCwgIjB4JTA4eDogJXMgMHglMDh4OiAlcyIsIG9mZnNldCwgcGFyc2VpbmZvLAorCQljdHgtPmRhdGFbaW5kZXhdLCBpbmRleCA9PSAwID8gIiIgOiAiICAgIik7CisJdmFfc3RhcnQodmEsIGZtdCk7CisJdmZwcmludGYob3V0LCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfTUlfU0VUX0NPTlRFWFQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1aW50MzJfdCBkYXRhID0gY3R4LT5kYXRhWzFdOworCWlmIChjdHgtPmdlbiA+IDcpCisJCXJldHVybiAxOworCisJaW5zdHJfb3V0KGN0eCwgMCwgIk1JX1NFVF9DT05URVhUXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAiZ3R0IG9mZnNldCA9IDB4JXglcyVzXG4iLAorCQkgIGRhdGEgJiB+MHhmZmYsCisJCSAgZGF0YSAmICgxPDwxKT8gIiwgRm9yY2UgUmVzdG9yZSI6ICIiLAorCQkgIGRhdGEgJiAoMTw8MCk/ICIsIFJlc3RvcmUgSW5oaWJpdCI6ICIiKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfTUlfV0FJVF9GT1JfRVZFTlQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwljb25zdCBjaGFyICpjY193YWl0OworCWludCBjY19zaGlmdCA9IDA7CisJdWludDMyX3QgZGF0YSA9IGN0eC0+ZGF0YVswXTsKKworCWlmIChjdHgtPmdlbiA8PSA1KQorCQljY19zaGlmdCA9IDk7CisJZWxzZQorCQljY19zaGlmdCA9IDE2OworCisJc3dpdGNoICgoZGF0YSA+PiBjY19zaGlmdCkgJiAweDFmKSB7CisJY2FzZSAxOgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCAxIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCAyIjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCAzIjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCA0IjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCA0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2Nfd2FpdCA9ICIiOworCQlicmVhazsKKwl9CisKKwlpZiAoY3R4LT5nZW4gPD0gNSkgeworCQlpbnN0cl9vdXQoY3R4LCAwLCAiTUlfV0FJVF9GT1JfRVZFTlQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkJICBkYXRhICYgKDE8PDE4KT8gIiwgcGlwZSBCIHN0YXJ0IHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8MTcpPyAiLCBwaXBlIEEgc3RhcnQgdmJsYW5rIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwxNik/ICIsIG92ZXJsYXkgZmxpcCBwZW5kaW5nIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwxNCk/ICIsIHBpcGUgQiBoYmxhbmsgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDEzKT8gIiwgcGlwZSBBIGhibGFuayB3YWl0IjogIiIsCisJCQkgIGNjX3dhaXQsCisJCQkgIGRhdGEgJiAoMTw8OCk/ICIsIHBsYW5lIEMgcGVuZGluZyBmbGlwIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDw3KT8gIiwgcGlwZSBCIHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8Nik/ICIsIHBsYW5lIEIgcGVuZGluZyBmbGlwIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDw1KT8gIiwgcGlwZSBCIHNjYW4gbGluZSB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8NCk/ICIsIGZiYyBpZGxlIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwzKT8gIiwgcGlwZSBBIHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8Mik/ICIsIHBsYW5lIEEgcGVuZGluZyBmbGlwIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwxKT8gIiwgcGxhbmUgQSBzY2FuIGxpbmUgd2FpdCI6ICIiKTsKKwl9IGVsc2UgeworCQlpbnN0cl9vdXQoY3R4LCAwLCAiTUlfV0FJVF9GT1JfRVZFTlQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCQkgIGRhdGEgJiAoMTw8MjApPyAiLCBzcHJpdGUgQyBwZW5kaW5nIGZsaXAgd2FpdCI6ICIiLCAvKiBpdmIgKi8KKwkJCSAgY2Nfd2FpdCwKKwkJCSAgZGF0YSAmICgxPDwxMyk/ICIsIHBpcGUgQiBoYmxhbmsgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDExKT8gIiwgcGlwZSBCIHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8MTApPyAiLCBzcHJpdGUgQiBwZW5kaW5nIGZsaXAgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDkpPyAiLCBwbGFuZSBCIHBlbmRpbmcgZmxpcCB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8OCk/ICIsIHBsYW5lIEIgc2NhbiBsaW5lIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDw1KT8gIiwgcGlwZSBBIGhibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8Myk/ICIsIHBpcGUgQSB2Ymxhbmsgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDIpPyAiLCBzcHJpdGUgQSBwZW5kaW5nIGZsaXAgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDEpPyAiLCBwbGFuZSBBIHBlbmRpbmcgZmxpcCB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8MCk/ICIsIHBsYW5lIEEgc2NhbiBsaW5lIHdhaXQiOiAiIik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV9taShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXVuc2lnbmVkIGludCBvcGNvZGUsIGxlbiA9IC0xOworCWNvbnN0IGNoYXIgKnBvc3Rfc3luY19vcCA9ICIiOworCXVpbnQzMl90ICpkYXRhID0gY3R4LT5kYXRhOworCisJc3RydWN0IHsKKwkJdWludDMyX3Qgb3Bjb2RlOworCQlpbnQgbGVuX21hc2s7CisJCXVuc2lnbmVkIGludCBtaW5fbGVuOworCQl1bnNpZ25lZCBpbnQgbWF4X2xlbjsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJaW50ICgqZnVuYykoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCk7CisJfSBvcGNvZGVzX21pW10gPSB7CisJCXsgMHgwOCwgMCwgMSwgMSwgIk1JX0FSQl9PTl9PRkYiIH0sCisJCXsgMHgwYSwgMCwgMSwgMSwgIk1JX0JBVENIX0JVRkZFUl9FTkQiIH0sCisJCXsgMHgzMCwgMHgzZiwgMywgMywgIk1JX0JBVENIX0JVRkZFUiIgfSwKKwkJeyAweDMxLCAweDNmLCAyLCAyLCAiTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIiB9LAorCQl7IDB4MTQsIDB4M2YsIDMsIDMsICJNSV9ESVNQTEFZX0JVRkZFUl9JTkZPIiB9LAorCQl7IDB4MDQsIDAsIDEsIDEsICJNSV9GTFVTSCIgfSwKKwkJeyAweDIyLCAweDFmLCAzLCAzLCAiTUlfTE9BRF9SRUdJU1RFUl9JTU0iIH0sCisJCXsgMHgxMywgMHgzZiwgMiwgMiwgIk1JX0xPQURfU0NBTl9MSU5FU19FWENMIiB9LAorCQl7IDB4MTIsIDB4M2YsIDIsIDIsICJNSV9MT0FEX1NDQU5fTElORVNfSU5DTCIgfSwKKwkJeyAweDAwLCAwLCAxLCAxLCAiTUlfTk9PUCIgfSwKKwkJeyAweDExLCAweDNmLCAyLCAyLCAiTUlfT1ZFUkxBWV9GTElQIiB9LAorCQl7IDB4MDcsIDAsIDEsIDEsICJNSV9SRVBPUlRfSEVBRCIgfSwKKwkJeyAweDE4LCAweDNmLCAyLCAyLCAiTUlfU0VUX0NPTlRFWFQiLCBkZWNvZGVfTUlfU0VUX0NPTlRFWFQgfSwKKwkJeyAweDIwLCAweDNmLCAzLCA0LCAiTUlfU1RPUkVfREFUQV9JTU0iIH0sCisJCXsgMHgyMSwgMHgzZiwgMywgNCwgIk1JX1NUT1JFX0RBVEFfSU5ERVgiIH0sCisJCXsgMHgyNCwgMHgzZiwgMywgMywgIk1JX1NUT1JFX1JFR0lTVEVSX01FTSIgfSwKKwkJeyAweDAyLCAwLCAxLCAxLCAiTUlfVVNFUl9JTlRFUlJVUFQiIH0sCisJCXsgMHgwMywgMCwgMSwgMSwgIk1JX1dBSVRfRk9SX0VWRU5UIiwgZGVjb2RlX01JX1dBSVRfRk9SX0VWRU5UIH0sCisJCXsgMHgxNiwgMHg3ZiwgMywgMywgIk1JX1NFTUFQSE9SRV9NQk9YIiB9LAorCQl7IDB4MjYsIDB4MWYsIDMsIDQsICJNSV9GTFVTSF9EVyIgfSwKKwkJeyAweDI4LCAweDNmLCAzLCAzLCAiTUlfUkVQT1JUX1BFUkZfQ09VTlQiIH0sCisJCXsgMHgyOSwgMHhmZiwgMywgMywgIk1JX0xPQURfUkVHSVNURVJfTUVNIiB9LAorCQl7IDB4MGIsIDAsIDEsIDEsICJNSV9TVVNQRU5EX0ZMVVNIIn0sCisJfSwgKm9wY29kZV9taSA9IE5VTEw7CisKKwkvKiBjaGVjayBpbnN0cnVjdGlvbiBsZW5ndGggKi8KKwlmb3IgKG9wY29kZSA9IDA7IG9wY29kZSA8IHNpemVvZihvcGNvZGVzX21pKSAvIHNpemVvZihvcGNvZGVzX21pWzBdKTsKKwkgICAgIG9wY29kZSsrKSB7CisJCWlmICgoZGF0YVswXSAmIDB4MWY4MDAwMDApID4+IDIzID09IG9wY29kZXNfbWlbb3Bjb2RlXS5vcGNvZGUpIHsKKwkJCWxlbiA9IDE7CisJCQlpZiAob3Bjb2Rlc19taVtvcGNvZGVdLm1heF9sZW4gPiAxKSB7CisJCQkJbGVuID0KKwkJCQkgICAgKGRhdGFbMF0gJiBvcGNvZGVzX21pW29wY29kZV0ubGVuX21hc2spICsgMjsKKwkJCQlpZiAobGVuIDwgb3Bjb2Rlc19taVtvcGNvZGVdLm1pbl9sZW4KKwkJCQkgICAgfHwgbGVuID4gb3Bjb2Rlc19taVtvcGNvZGVdLm1heF9sZW4pIHsKKwkJCQkJZnByaW50ZihvdXQsCisJCQkJCQkiQmFkIGxlbmd0aCAoJWQpIGluICVzLCBbJWQsICVkXVxuIiwKKwkJCQkJCWxlbiwgb3Bjb2Rlc19taVtvcGNvZGVdLm5hbWUsCisJCQkJCQlvcGNvZGVzX21pW29wY29kZV0ubWluX2xlbiwKKwkJCQkJCW9wY29kZXNfbWlbb3Bjb2RlXS5tYXhfbGVuKTsKKwkJCQl9CisJCQl9CisJCQlvcGNvZGVfbWkgPSAmb3Bjb2Rlc19taVtvcGNvZGVdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAob3Bjb2RlX21pICYmIG9wY29kZV9taS0+ZnVuYykKKwkJcmV0dXJuIG9wY29kZV9taS0+ZnVuYyhjdHgpOworCisJc3dpdGNoICgoZGF0YVswXSAmIDB4MWY4MDAwMDApID4+IDIzKSB7CisJY2FzZSAweDBhOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiTUlfQkFUQ0hfQlVGRkVSX0VORFxuIik7CisJCXJldHVybiAtMTsKKwljYXNlIDB4MTY6CisJCWluc3RyX291dChjdHgsIDAsICJNSV9TRU1BUEhPUkVfTUJPWCVzJXMlcyVzICV1XG4iLAorCQkJICBkYXRhWzBdICYgKDEgPDwgMjIpID8gIiBnbG9iYWwgZ3R0LCIgOiAiIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDIxKSA/ICIgdXBkYXRlIHNlbWFwaG9yZSwiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAyMCkgPyAiIGNvbXBhcmUgc2VtYXBob3JlLCIgOiAiIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDE4KSA/ICIgdXNlIGNvbXBhcmUgcmVnIiA6ICIiLAorCQkJICAoZGF0YVswXSAmICgweDMgPDwgMTYpKSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDEsICJ2YWx1ZVxuIik7CisJCWluc3RyX291dChjdHgsIDIsICJhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MjE6CisJCWluc3RyX291dChjdHgsIDAsICJNSV9TVE9SRV9EQVRBX0lOREVYJXNcbiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAyMSkgPyAiIHVzZSBwZXItcHJvY2VzcyBIV1MsIiA6ICIiKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgImluZGV4XG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImR3b3JkXG4iKTsKKwkJaWYgKGxlbiA9PSA0KQorCQkJaW5zdHJfb3V0KGN0eCwgMywgInVwcGVyIGR3b3JkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDA6CisJCWlmIChkYXRhWzBdICYgKDEgPDwgMjIpKQorCQkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCQkgICJNSV9OT09QIHdyaXRlIE5PUElEIHJlZywgdmFsPTB4JXhcbiIsCisJCQkJICBkYXRhWzBdICYgKCgxIDw8IDIyKSAtIDEpKTsKKwkJZWxzZQorCQkJaW5zdHJfb3V0KGN0eCwgMCwgIk1JX05PT1BcbiIpOworCQlyZXR1cm4gbGVuOworCWNhc2UgMHgyNjoKKwkJc3dpdGNoIChkYXRhWzBdICYgKDB4MyA8PCAxNCkpIHsKKwkJY2FzZSAoMCA8PCAxNCk6CisJCQlwb3N0X3N5bmNfb3AgPSAibm8gd3JpdGUiOworCQkJYnJlYWs7CisJCWNhc2UgKDEgPDwgMTQpOgorCQkJcG9zdF9zeW5jX29wID0gIndyaXRlIGRhdGEiOworCQkJYnJlYWs7CisJCWNhc2UgKDIgPDwgMTQpOgorCQkJcG9zdF9zeW5jX29wID0gInJlc2VydmVkIjsKKwkJCWJyZWFrOworCQljYXNlICgzIDw8IDE0KToKKwkJCXBvc3Rfc3luY19vcCA9ICJ3cml0ZSBUSU1FU1RBTVAiOworCQkJYnJlYWs7CisJCX0KKwkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCSAgIk1JX0ZMVVNIX0RXJXMlcyVzJXMgcG9zdF9zeW5jX29wPSclcycgJXMlc1xuIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDIyKSA/CisJCQkgICIgZW5hYmxlIHByb3RlY3RlZCBtZW0gKEJDUy1vbmx5KSwiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAyMSkgPyAiIHN0b3JlIGluIGh3cywiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAxOCkgPyAiIGludmFsaWRhdGUgdGxiLCIgOiAiIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDE3KSA/ICIgZmx1c2ggZ2ZkdCwiIDogIiIsCisJCQkgIHBvc3Rfc3luY19vcCwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDgpID8gIiBlbmFibGUgbm90aWZ5IGludGVycnVwdCwiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCA3KSA/CisJCQkgICIgaW52YWxpZGF0ZSB2aWRlbyBzdGF0ZSAoQkNTLW9ubHkpLCIgOiAiIik7CisJCWlmIChkYXRhWzBdICYgKDEgPDwgMjEpKQorCQkJaW5zdHJfb3V0KGN0eCwgMSwgImh3cyBpbmRleFxuIik7CisJCWVsc2UKKwkJCWluc3RyX291dChjdHgsIDEsICJhZGRyZXNzXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImR3b3JkXG4iKTsKKwkJaWYgKGxlbiA9PSA0KQorCQkJaW5zdHJfb3V0KGN0eCwgMywgInVwcGVyIGR3b3JkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlmb3IgKG9wY29kZSA9IDA7IG9wY29kZSA8IHNpemVvZihvcGNvZGVzX21pKSAvIHNpemVvZihvcGNvZGVzX21pWzBdKTsKKwkgICAgIG9wY29kZSsrKSB7CisJCWlmICgoZGF0YVswXSAmIDB4MWY4MDAwMDApID4+IDIzID09IG9wY29kZXNfbWlbb3Bjb2RlXS5vcGNvZGUpIHsKKwkJCXVuc2lnbmVkIGludCBpOworCisJCQlpbnN0cl9vdXQoY3R4LCAwLCAiJXNcbiIsCisJCQkJICBvcGNvZGVzX21pW29wY29kZV0ubmFtZSk7CisJCQlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiZHdvcmQgJWRcbiIsIGkpOworCQkJfQorCisJCQlyZXR1cm4gbGVuOworCQl9CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMCwgIk1JIFVOS05PV05cbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZGVjb2RlXzJkX2JyMDAoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwgY29uc3QgY2hhciAqY21kKQoreworCWluc3RyX291dChjdHgsIDAsCisJCSAgIiVzIChyZ2IgJXNhYmxlZCwgYWxwaGEgJXNhYmxlZCwgc3JjIHRpbGUgJWQsIGRzdCB0aWxlICVkKVxuIiwKKwkJICBjbWQsCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDIwKSkgPyAiZW4iIDogImRpcyIsCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDIxKSkgPyAiZW4iIDogImRpcyIsCisJCSAgKGN0eC0+ZGF0YVswXSA+PiAxNSkgJiAxLAorCQkgIChjdHgtPmRhdGFbMF0gPj4gMTEpICYgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWNvZGVfMmRfYnIwMShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWNvbnN0IGNoYXIgKmZvcm1hdDsKKwlzd2l0Y2ggKChjdHgtPmRhdGFbMV0gPj4gMjQpICYgMHgzKSB7CisJY2FzZSAwOgorCQlmb3JtYXQgPSAiOCI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZm9ybWF0ID0gIjU2NSI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZm9ybWF0ID0gIjE1NTUiOworCQlicmVhazsKKwljYXNlIDM6CisJCWZvcm1hdCA9ICI4ODg4IjsKKwkJYnJlYWs7CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMSwKKwkJICAiZm9ybWF0ICVzLCBwaXRjaCAlZCwgcm9wIDB4JTAyeCwgIgorCQkgICJjbGlwcGluZyAlc2FibGVkLCAlcyVzIFxuIiwKKwkJICBmb3JtYXQsCisJCSAgKHNob3J0KShjdHgtPmRhdGFbMV0gJiAweGZmZmYpLAorCQkgIChjdHgtPmRhdGFbMV0gPj4gMTYpICYgMHhmZiwKKwkJICBjdHgtPmRhdGFbMV0gJiAoMSA8PCAzMCkgPyAiZW4iIDogImRpcyIsCisJCSAgY3R4LT5kYXRhWzFdICYgKDEgPDwgMzEpID8gInNvbGlkIHBhdHRlcm4gZW5hYmxlZCwgIiA6ICIiLAorCQkgIGN0eC0+ZGF0YVsxXSAmICgxIDw8IDMxKSA/CisJCSAgIm1vbm8gcGF0dGVybiB0cmFuc3BhcmVuY3kgZW5hYmxlZCwgIiA6ICIiKTsKKworfQorCitzdGF0aWMgaW50CitkZWNvZGVfMmQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgb3Bjb2RlLCBsZW47CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBvcGNvZGU7CisJCXVuc2lnbmVkIGludCBtaW5fbGVuOworCQl1bnNpZ25lZCBpbnQgbWF4X2xlbjsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwl9IG9wY29kZXNfMmRbXSA9IHsKKwkJeyAweDQwLCA1LCA1LCAiQ09MT1JfQkxUIiB9LAorCQl7IDB4NDMsIDYsIDYsICJTUkNfQ09QWV9CTFQiIH0sCisJCXsgMHgwMSwgOCwgOCwgIlhZX1NFVFVQX0JMVCIgfSwKKwkJeyAweDExLCA5LCA5LCAiWFlfU0VUVVBfTU9OT19QQVRURVJOX1NMX0JMVCIgfSwKKwkJeyAweDAzLCAzLCAzLCAiWFlfU0VUVVBfQ0xJUF9CTFQiIH0sCisJCXsgMHgyNCwgMiwgMiwgIlhZX1BJWEVMX0JMVCIgfSwKKwkJeyAweDI1LCAzLCAzLCAiWFlfU0NBTkxJTkVTX0JMVCIgfSwKKwkJeyAweDI2LCA0LCA0LCAiWV9URVhUX0JMVCIgfSwKKwkJeyAweDMxLCA1LCAxMzQsICJYWV9URVhUX0lNTUVESUFURV9CTFQiIH0sCisJCXsgMHg1MCwgNiwgNiwgIlhZX0NPTE9SX0JMVCIgfSwKKwkJeyAweDUxLCA2LCA2LCAiWFlfUEFUX0JMVCIgfSwKKwkJeyAweDc2LCA4LCA4LCAiWFlfUEFUX0NIUk9NQV9CTFQiIH0sCisJCXsgMHg3MiwgNywgMTM1LCAiWFlfUEFUX0JMVF9JTU1FRElBVEUiIH0sCisJCXsgMHg3NywgOSwgMTM3LCAiWFlfUEFUX0NIUk9NQV9CTFRfSU1NRURJQVRFIiB9LAorCQl7IDB4NTIsIDksIDksICJYWV9NT05PX1BBVF9CTFQiIH0sCisJCXsgMHg1OSwgNywgNywgIlhZX01PTk9fUEFUX0ZJWEVEX0JMVCIgfSwKKwkJeyAweDUzLCA4LCA4LCAiWFlfU1JDX0NPUFlfQkxUIiB9LAorCQl7IDB4NTQsIDgsIDgsICJYWV9NT05PX1NSQ19DT1BZX0JMVCIgfSwKKwkJeyAweDcxLCA5LCAxMzcsICJYWV9NT05PX1NSQ19DT1BZX0lNTUVESUFURV9CTFQiIH0sCisJCXsgMHg1NSwgOSwgOSwgIlhZX0ZVTExfQkxUIiB9LAorCQl7IDB4NTUsIDksIDEzNywgIlhZX0ZVTExfSU1NRURJQVRFX1BBVFRFUk5fQkxUIiB9LAorCQl7IDB4NTYsIDksIDksICJYWV9GVUxMX01PTk9fU1JDX0JMVCIgfSwKKwkJeyAweDc1LCAxMCwgMTM4LCAiWFlfRlVMTF9NT05PX1NSQ19JTU1FRElBVEVfUEFUVEVSTl9CTFQiIH0sCisJCXsgMHg1NywgMTIsIDEyLCAiWFlfRlVMTF9NT05PX1BBVFRFUk5fQkxUIiB9LAorCQl7IDB4NTgsIDEyLCAxMiwgIlhZX0ZVTExfTU9OT19QQVRURVJOX01PTk9fU1JDX0JMVCJ9LAorCX07CisKKwlzd2l0Y2ggKChkYXRhWzBdICYgMHgxZmMwMDAwMCkgPj4gMjIpIHsKKwljYXNlIDB4MjU6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICJYWV9TQ0FOTElORVNfQkxUIChwYXR0ZXJuIHNlZWQgKCVkLCAlZCksIGRzdCB0aWxlICVkKVxuIiwKKwkJCSAgKGRhdGFbMF0gPj4gMTIpICYgMHg4LAorCQkJICAoZGF0YVswXSA+PiA4KSAmIDB4OCwgKGRhdGFbMF0gPj4gMTEpICYgMSk7CisKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCWlmIChsZW4gIT0gMykKKwkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFhZX1NDQU5MSU5FU19CTFRcbiIpOworCisJCWluc3RyX291dChjdHgsIDEsICJkZXN0ICglZCwlZClcbiIsCisJCQkgIGRhdGFbMV0gJiAweGZmZmYsIGRhdGFbMV0gPj4gMTYpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiZGVzdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCBkYXRhWzJdID4+IDE2KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDE6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NFVFVQX0JMVCIpOworCisJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCQlpZiAobGVuICE9IDgpCisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBYWV9TRVRVUF9CTFRcbiIpOworCisJCWRlY29kZV8yZF9icjAxKGN0eCk7CisJCWluc3RyX291dChjdHgsIDIsICJjbGlwcmVjdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCBkYXRhWzJdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgImNsaXByZWN0ICglZCwlZClcbiIsCisJCQkgIGRhdGFbM10gJiAweGZmZmYsIGRhdGFbM10gPj4gMTYpOworCQlpbnN0cl9vdXQoY3R4LCA0LCAic2V0dXAgZHN0IG9mZnNldCAweCUwOHhcbiIsCisJCQkgIGRhdGFbNF0pOworCQlpbnN0cl9vdXQoY3R4LCA1LCAic2V0dXAgYmFja2dyb3VuZCBjb2xvclxuIik7CisJCWluc3RyX291dChjdHgsIDYsICJzZXR1cCBmb3JlZ3JvdW5kIGNvbG9yXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgNywgImNvbG9yIHBhdHRlcm4gb2Zmc2V0XG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDM6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NFVFVQX0NMSVBfQkxUIik7CisKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCWlmIChsZW4gIT0gMykKKwkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFhZX1NFVFVQX0NMSVBfQkxUXG4iKTsKKworCQlpbnN0cl9vdXQoY3R4LCAxLCAiY2xpcHJlY3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsxXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDIsICJjbGlwcmVjdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCBkYXRhWzNdID4+IDE2KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MTE6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NFVFVQX01PTk9fUEFUVEVSTl9TTF9CTFQiKTsKKworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwZmYpICsgMjsKKwkJaWYgKGxlbiAhPSA5KQorCQkJZnByaW50ZihvdXQsCisJCQkJIkJhZCBjb3VudCBpbiBYWV9TRVRVUF9NT05PX1BBVFRFUk5fU0xfQkxUXG4iKTsKKworCQlkZWNvZGVfMmRfYnIwMShjdHgpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiY2xpcHJlY3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsyXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDMsICJjbGlwcmVjdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzNdICYgMHhmZmZmLCBkYXRhWzNdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwgInNldHVwIGRzdCBvZmZzZXQgMHglMDh4XG4iLAorCQkJICBkYXRhWzRdKTsKKwkJaW5zdHJfb3V0KGN0eCwgNSwgInNldHVwIGJhY2tncm91bmQgY29sb3JcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA2LCAic2V0dXAgZm9yZWdyb3VuZCBjb2xvclxuIik7CisJCWluc3RyX291dChjdHgsIDcsICJtb25vIHBhdHRlcm4gZHcwXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgOCwgIm1vbm8gcGF0dGVybiBkdzFcbiIpOworCQlyZXR1cm4gbGVuOworCWNhc2UgMHg1MDoKKwkJZGVjb2RlXzJkX2JyMDAoY3R4LCAiWFlfQ09MT1JfQkxUIik7CisKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCWlmIChsZW4gIT0gNikKKwkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFhZX0NPTE9SX0JMVFxuIik7CisKKwkJZGVjb2RlXzJkX2JyMDEoY3R4KTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgIiglZCwlZClcbiIsCisJCQkgIGRhdGFbMl0gJiAweGZmZmYsIGRhdGFbMl0gPj4gMTYpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAiKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVszXSAmIDB4ZmZmZiwgZGF0YVszXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDQsICJvZmZzZXQgMHglMDh4XG4iLCBkYXRhWzRdKTsKKwkJaW5zdHJfb3V0KGN0eCwgNSwgImNvbG9yXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NTM6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NSQ19DT1BZX0JMVCIpOworCisJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCQlpZiAobGVuICE9IDgpCisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBYWV9TUkNfQ09QWV9CTFRcbiIpOworCisJCWRlY29kZV8yZF9icjAxKGN0eCk7CisJCWluc3RyX291dChjdHgsIDIsICJkc3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsyXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDMsICJkc3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVszXSAmIDB4ZmZmZiwgZGF0YVszXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDQsICJkc3Qgb2Zmc2V0IDB4JTA4eFxuIiwgZGF0YVs0XSk7CisJCWluc3RyX291dChjdHgsIDUsICJzcmMgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVs1XSAmIDB4ZmZmZiwgZGF0YVs1XSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDYsICJzcmMgcGl0Y2ggJWRcbiIsCisJCQkgIChzaG9ydCkoZGF0YVs2XSAmIDB4ZmZmZikpOworCQlpbnN0cl9vdXQoY3R4LCA3LCAic3JjIG9mZnNldCAweCUwOHhcbiIsIGRhdGFbN10pOworCQlyZXR1cm4gbGVuOworCX0KKworCWZvciAob3Bjb2RlID0gMDsgb3Bjb2RlIDwgc2l6ZW9mKG9wY29kZXNfMmQpIC8gc2l6ZW9mKG9wY29kZXNfMmRbMF0pOworCSAgICAgb3Bjb2RlKyspIHsKKwkJaWYgKChkYXRhWzBdICYgMHgxZmMwMDAwMCkgPj4gMjIgPT0gb3Bjb2Rlc18yZFtvcGNvZGVdLm9wY29kZSkgeworCQkJdW5zaWduZWQgaW50IGk7CisKKwkJCWxlbiA9IDE7CisJCQlpbnN0cl9vdXQoY3R4LCAwLCAiJXNcbiIsCisJCQkJICBvcGNvZGVzXzJkW29wY29kZV0ubmFtZSk7CisJCQlpZiAob3Bjb2Rlc18yZFtvcGNvZGVdLm1heF9sZW4gPiAxKSB7CisJCQkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCQkJaWYgKGxlbiA8IG9wY29kZXNfMmRbb3Bjb2RlXS5taW5fbGVuIHx8CisJCQkJICAgIGxlbiA+IG9wY29kZXNfMmRbb3Bjb2RlXS5tYXhfbGVuKSB7CisJCQkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLAorCQkJCQkJb3Bjb2Rlc18yZFtvcGNvZGVdLm5hbWUpOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaW5zdHJfb3V0KGN0eCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkJCX0KKworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKworCWluc3RyX291dChjdHgsIDAsICIyRCBVTktOT1dOXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkXzFjKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisJdWludDMyX3Qgb3Bjb2RlOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweDAwZjgwMDAwKSA+PiAxOTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSAweDExOgorCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJICAiM0RTVEFURV9ERVBUSF9TVUJSRUNUQU5HTEVfRElTQUJMRVxuIik7CisJCXJldHVybiAxOworCWNhc2UgMHgxMDoKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfU0NJU1NPUl9FTkFCTEUgJXNcbiIsCisJCQkgIGRhdGFbMF0gJiAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCXJldHVybiAxOworCWNhc2UgMHgwMToKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfTUFQX0NPT1JEX1NFVF9JODMwXG4iKTsKKwkJcmV0dXJuIDE7CisJY2FzZSAweDBhOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9NQVBfQ1VCRV9JODMwXG4iKTsKKwkJcmV0dXJuIDE7CisJY2FzZSAweDA1OgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9NQVBfVEVYX1NUUkVBTV9JODMwXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEIFVOS05PV046IDNkXzFjIG9wY29kZSA9IDB4JXhcbiIsCisJCSAgb3Bjb2RlKTsKKwlyZXR1cm4gMTsKK30KKworLyoqIFNldHMgdGhlIHN0cmluZyBkc3RuYW1lIHRvIGRlc2NyaWJlIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgUFMgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCitpOTE1X2dldF9pbnN0cnVjdGlvbl9kc3QodWludDMyX3QgKmRhdGEsIGludCBpLCBjaGFyICpkc3RuYW1lLCBpbnQgZG9fbWFzaykKK3sKKwl1aW50MzJfdCBhMCA9IGRhdGFbaV07CisJaW50IGRzdF9uciA9IChhMCA+PiAxNCkgJiAweGY7CisJY2hhciBkc3RtYXNrWzhdOworCWNvbnN0IGNoYXIgKnNhdDsKKworCWlmIChkb19tYXNrKSB7CisJCWlmICgoKGEwID4+IDEwKSAmIDB4ZikgPT0gMHhmKSB7CisJCQlkc3RtYXNrWzBdID0gMDsKKwkJfSBlbHNlIHsKKwkJCWludCBkc3RtYXNrX2luZGV4ID0gMDsKKworCQkJZHN0bWFza1tkc3RtYXNrX2luZGV4KytdID0gJy4nOworCQkJaWYgKGEwICYgKDEgPDwgMTApKQorCQkJCWRzdG1hc2tbZHN0bWFza19pbmRleCsrXSA9ICd4JzsKKwkJCWlmIChhMCAmICgxIDw8IDExKSkKKwkJCQlkc3RtYXNrW2RzdG1hc2tfaW5kZXgrK10gPSAneSc7CisJCQlpZiAoYTAgJiAoMSA8PCAxMikpCisJCQkJZHN0bWFza1tkc3RtYXNrX2luZGV4KytdID0gJ3onOworCQkJaWYgKGEwICYgKDEgPDwgMTMpKQorCQkJCWRzdG1hc2tbZHN0bWFza19pbmRleCsrXSA9ICd3JzsKKwkJCWRzdG1hc2tbZHN0bWFza19pbmRleCsrXSA9IDA7CisJCX0KKworCQlpZiAoYTAgJiAoMSA8PCAyMikpCisJCQlzYXQgPSAiLnNhdCI7CisJCWVsc2UKKwkJCXNhdCA9ICIiOworCX0gZWxzZSB7CisJCWRzdG1hc2tbMF0gPSAwOworCQlzYXQgPSAiIjsKKwl9CisKKwlzd2l0Y2ggKChhMCA+PiAxOSkgJiAweDcpIHsKKwljYXNlIDA6CisJCWlmIChkc3RfbnIgPiAxNSkKKwkJCWZwcmludGYob3V0LCAiYmFkIGRlc3RpbmF0aW9uIHJlZyBSJWRcbiIsIGRzdF9ucik7CisJCXNwcmludGYoZHN0bmFtZSwgIlIlZCVzJXMiLCBkc3RfbnIsIGRzdG1hc2ssIHNhdCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaWYgKGRzdF9uciA+IDApCisJCQlmcHJpbnRmKG91dCwgImJhZCBkZXN0aW5hdGlvbiByZWcgb0MlZFxuIiwgZHN0X25yKTsKKwkJc3ByaW50Zihkc3RuYW1lLCAib0MlcyVzIiwgZHN0bWFzaywgc2F0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlpZiAoZHN0X25yID4gMCkKKwkJCWZwcmludGYob3V0LCAiYmFkIGRlc3RpbmF0aW9uIHJlZyBvRCVkXG4iLCBkc3RfbnIpOworCQlzcHJpbnRmKGRzdG5hbWUsICJvRCVzJXMiLCBkc3RtYXNrLCBzYXQpOworCQlicmVhazsKKwljYXNlIDY6CisJCWlmIChkc3RfbnIgPiAzKQorCQkJZnByaW50ZihvdXQsICJiYWQgZGVzdGluYXRpb24gcmVnIFUlZFxuIiwgZHN0X25yKTsKKwkJc3ByaW50Zihkc3RuYW1lLCAiVSVkJXMlcyIsIGRzdF9uciwgZHN0bWFzaywgc2F0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ByaW50Zihkc3RuYW1lLCAiUkVTRVJWRUQiKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUodWludDMyX3Qgc2VsZWN0KQoreworCXN3aXRjaCAoc2VsZWN0ICYgMHg3KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gKHNlbGVjdCAmIDgpID8gIi14IiA6ICJ4IjsKKwljYXNlIDE6CisJCXJldHVybiAoc2VsZWN0ICYgOCkgPyAiLXkiIDogInkiOworCWNhc2UgMjoKKwkJcmV0dXJuIChzZWxlY3QgJiA4KSA/ICIteiIgOiAieiI7CisJY2FzZSAzOgorCQlyZXR1cm4gKHNlbGVjdCAmIDgpID8gIi13IiA6ICJ3IjsKKwljYXNlIDQ6CisJCXJldHVybiAoc2VsZWN0ICYgOCkgPyAiLTAiIDogIjAiOworCWNhc2UgNToKKwkJcmV0dXJuIChzZWxlY3QgJiA4KSA/ICItMSIgOiAiMSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChzZWxlY3QgJiA4KSA/ICItYmFkIiA6ICJiYWQiOworCX0KK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2V0X2luc3RydWN0aW9uX3NyY19uYW1lKHVpbnQzMl90IHNyY190eXBlLCB1aW50MzJfdCBzcmNfbnIsIGNoYXIgKm5hbWUpCit7CisJc3dpdGNoIChzcmNfdHlwZSkgeworCWNhc2UgMDoKKwkJc3ByaW50ZihuYW1lLCAiUiVkIiwgc3JjX25yKTsKKwkJaWYgKHNyY19uciA+IDE1KQorCQkJZnByaW50ZihvdXQsICJiYWQgc3JjIHJlZyAlc1xuIiwgbmFtZSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKHNyY19uciA8IDgpCisJCQlzcHJpbnRmKG5hbWUsICJUJWQiLCBzcmNfbnIpOworCQllbHNlIGlmIChzcmNfbnIgPT0gOCkKKwkJCXNwcmludGYobmFtZSwgIkRJRkZVU0UiKTsKKwkJZWxzZSBpZiAoc3JjX25yID09IDkpCisJCQlzcHJpbnRmKG5hbWUsICJTUEVDVUxBUiIpOworCQllbHNlIGlmIChzcmNfbnIgPT0gMTApCisJCQlzcHJpbnRmKG5hbWUsICJGT0ciKTsKKwkJZWxzZSB7CisJCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnIFQlZFxuIiwgc3JjX25yKTsKKwkJCXNwcmludGYobmFtZSwgIlJFU0VSVkVEIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzcHJpbnRmKG5hbWUsICJDJWQiLCBzcmNfbnIpOworCQlpZiAoc3JjX25yID4gMzEpCisJCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnICVzXG4iLCBuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzcHJpbnRmKG5hbWUsICJvQyIpOworCQlpZiAoc3JjX25yID4gMCkKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgb0MlZFxuIiwgc3JjX25yKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzcHJpbnRmKG5hbWUsICJvRCIpOworCQlpZiAoc3JjX25yID4gMCkKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgb0QlZFxuIiwgc3JjX25yKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzcHJpbnRmKG5hbWUsICJVJWQiLCBzcmNfbnIpOworCQlpZiAoc3JjX25yID4gMykKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgJXNcbiIsIG5hbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnIHR5cGUgJWRcbiIsIHNyY190eXBlKTsKKwkJc3ByaW50ZihuYW1lLCAiUkVTRVJWRUQiKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmMwKHVpbnQzMl90ICpkYXRhLCBpbnQgaSwgY2hhciAqc3JjbmFtZSkKK3sKKwl1aW50MzJfdCBhMCA9IGRhdGFbaV07CisJdWludDMyX3QgYTEgPSBkYXRhW2kgKyAxXTsKKwlpbnQgc3JjX25yID0gKGEwID4+IDIpICYgMHgxZjsKKwljb25zdCBjaGFyICpzd2l6emxlX3ggPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGExID4+IDI4KSAmIDB4Zik7CisJY29uc3QgY2hhciAqc3dpenpsZV95ID0gaTkxNV9nZXRfY2hhbm5lbF9zd2l6emxlKChhMSA+PiAyNCkgJiAweGYpOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeiA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTEgPj4gMjApICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3cgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGExID4+IDE2KSAmIDB4Zik7CisJY2hhciBzd2l6emxlWzEwMF07CisKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmNfbmFtZSgoYTAgPj4gNykgJiAweDcsIHNyY19uciwgc3JjbmFtZSk7CisJc3ByaW50Zihzd2l6emxlLCAiLiVzJXMlcyVzIiwgc3dpenpsZV94LCBzd2l6emxlX3ksIHN3aXp6bGVfeiwKKwkJc3dpenpsZV93KTsKKwlpZiAoc3RyY21wKHN3aXp6bGUsICIueHl6dyIpICE9IDApCisJCXN0cmNhdChzcmNuYW1lLCBzd2l6emxlKTsKK30KKworc3RhdGljIHZvaWQgaTkxNV9nZXRfaW5zdHJ1Y3Rpb25fc3JjMSh1aW50MzJfdCAqZGF0YSwgaW50IGksIGNoYXIgKnNyY25hbWUpCit7CisJdWludDMyX3QgYTEgPSBkYXRhW2kgKyAxXTsKKwl1aW50MzJfdCBhMiA9IGRhdGFbaSArIDJdOworCWludCBzcmNfbnIgPSAoYTEgPj4gOCkgJiAweDFmOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeCA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTEgPj4gNCkgJiAweGYpOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeSA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTEgPj4gMCkgJiAweGYpOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeiA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTIgPj4gMjgpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3cgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDI0KSAmIDB4Zik7CisJY2hhciBzd2l6emxlWzEwMF07CisKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmNfbmFtZSgoYTEgPj4gMTMpICYgMHg3LCBzcmNfbnIsIHNyY25hbWUpOworCXNwcmludGYoc3dpenpsZSwgIi4lcyVzJXMlcyIsIHN3aXp6bGVfeCwgc3dpenpsZV95LCBzd2l6emxlX3osCisJCXN3aXp6bGVfdyk7CisJaWYgKHN0cmNtcChzd2l6emxlLCAiLnh5enciKSAhPSAwKQorCQlzdHJjYXQoc3JjbmFtZSwgc3dpenpsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzIodWludDMyX3QgKmRhdGEsIGludCBpLCBjaGFyICpzcmNuYW1lKQoreworCXVpbnQzMl90IGEyID0gZGF0YVtpICsgMl07CisJaW50IHNyY19uciA9IChhMiA+PiAxNikgJiAweDFmOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeCA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTIgPj4gMTIpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3kgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDgpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3ogPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDQpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3cgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDApICYgMHhmKTsKKwljaGFyIHN3aXp6bGVbMTAwXTsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyY19uYW1lKChhMiA+PiAyMSkgJiAweDcsIHNyY19uciwgc3JjbmFtZSk7CisJc3ByaW50Zihzd2l6emxlLCAiLiVzJXMlcyVzIiwgc3dpenpsZV94LCBzd2l6emxlX3ksIHN3aXp6bGVfeiwKKwkJc3dpenpsZV93KTsKKwlpZiAoc3RyY21wKHN3aXp6bGUsICIueHl6dyIpICE9IDApCisJCXN0cmNhdChzcmNuYW1lLCBzd2l6emxlKTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2V0X2luc3RydWN0aW9uX2FkZHIodWludDMyX3Qgc3JjX3R5cGUsIHVpbnQzMl90IHNyY19uciwgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKHNyY190eXBlKSB7CisJY2FzZSAwOgorCQlzcHJpbnRmKG5hbWUsICJSJWQiLCBzcmNfbnIpOworCQlpZiAoc3JjX25yID4gMTUpCisJCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnICVzXG4iLCBuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoc3JjX25yIDwgOCkKKwkJCXNwcmludGYobmFtZSwgIlQlZCIsIHNyY19ucik7CisJCWVsc2UgaWYgKHNyY19uciA9PSA4KQorCQkJc3ByaW50ZihuYW1lLCAiRElGRlVTRSIpOworCQllbHNlIGlmIChzcmNfbnIgPT0gOSkKKwkJCXNwcmludGYobmFtZSwgIlNQRUNVTEFSIik7CisJCWVsc2UgaWYgKHNyY19uciA9PSAxMCkKKwkJCXNwcmludGYobmFtZSwgIkZPRyIpOworCQllbHNlIHsKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgVCVkXG4iLCBzcmNfbnIpOworCQkJc3ByaW50ZihuYW1lLCAiUkVTRVJWRUQiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDQ6CisJCXNwcmludGYobmFtZSwgIm9DIik7CisJCWlmIChzcmNfbnIgPiAwKQorCQkJZnByaW50ZihvdXQsICJiYWQgc3JjIHJlZyBvQyVkXG4iLCBzcmNfbnIpOworCQlicmVhazsKKwljYXNlIDU6CisJCXNwcmludGYobmFtZSwgIm9EIik7CisJCWlmIChzcmNfbnIgPiAwKQorCQkJZnByaW50ZihvdXQsICJiYWQgc3JjIHJlZyBvRCVkXG4iLCBzcmNfbnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnIHR5cGUgJWRcbiIsIHNyY190eXBlKTsKKwkJc3ByaW50ZihuYW1lLCAiUkVTRVJWRUQiKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfYWx1MShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkgaW50IGksIGNoYXIgKmluc3RyX3ByZWZpeCwgY29uc3QgY2hhciAqb3BfbmFtZSkKK3sKKwljaGFyIGRzdFsxMDBdLCBzcmMwWzEwMF07CisKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9kc3QoY3R4LT5kYXRhLCBpLCBkc3QsIDEpOworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzAoY3R4LT5kYXRhLCBpLCBzcmMwKTsKKworCWluc3RyX291dChjdHgsIGkrKywgIiVzOiAlcyAlcywgJXNcbiIsIGluc3RyX3ByZWZpeCwKKwkJICBvcF9uYW1lLCBkc3QsIHNyYzApOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfYWx1MihzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkgaW50IGksIGNoYXIgKmluc3RyX3ByZWZpeCwgY29uc3QgY2hhciAqb3BfbmFtZSkKK3sKKwljaGFyIGRzdFsxMDBdLCBzcmMwWzEwMF0sIHNyYzFbMTAwXTsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX2RzdChjdHgtPmRhdGEsIGksIGRzdCwgMSk7CisJaTkxNV9nZXRfaW5zdHJ1Y3Rpb25fc3JjMChjdHgtPmRhdGEsIGksIHNyYzApOworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzEoY3R4LT5kYXRhLCBpLCBzcmMxKTsKKworCWluc3RyX291dChjdHgsIGkrKywgIiVzOiAlcyAlcywgJXMsICVzXG4iLCBpbnN0cl9wcmVmaXgsCisJCSAgb3BfbmFtZSwgZHN0LCBzcmMwLCBzcmMxKTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZGVjb2RlX2FsdTMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJIGludCBpLCBjaGFyICppbnN0cl9wcmVmaXgsIGNvbnN0IGNoYXIgKm9wX25hbWUpCit7CisJY2hhciBkc3RbMTAwXSwgc3JjMFsxMDBdLCBzcmMxWzEwMF0sIHNyYzJbMTAwXTsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX2RzdChjdHgtPmRhdGEsIGksIGRzdCwgMSk7CisJaTkxNV9nZXRfaW5zdHJ1Y3Rpb25fc3JjMChjdHgtPmRhdGEsIGksIHNyYzApOworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzEoY3R4LT5kYXRhLCBpLCBzcmMxKTsKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmMyKGN0eC0+ZGF0YSwgaSwgc3JjMik7CisKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogJXMgJXMsICVzLCAlcywgJXNcbiIsIGluc3RyX3ByZWZpeCwKKwkJICBvcF9uYW1lLCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIpOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfdGV4KHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIGludCBpLAorCQljb25zdCBjaGFyICppbnN0cl9wcmVmaXgsIGNvbnN0IGNoYXIgKnRleF9uYW1lKQoreworCXVpbnQzMl90IHQwID0gY3R4LT5kYXRhW2ldOworCXVpbnQzMl90IHQxID0gY3R4LT5kYXRhW2kgKyAxXTsKKwljaGFyIGRzdF9uYW1lWzEwMF07CisJY2hhciBhZGRyX25hbWVbMTAwXTsKKwlpbnQgc2FtcGxlcl9ucjsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX2RzdChjdHgtPmRhdGEsIGksIGRzdF9uYW1lLCAwKTsKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9hZGRyKCh0MSA+PiAyNCkgJiAweDcsCisJCQkJICAodDEgPj4gMTcpICYgMHhmLCBhZGRyX25hbWUpOworCXNhbXBsZXJfbnIgPSB0MCAmIDB4ZjsKKworCWluc3RyX291dChjdHgsIGkrKywgIiVzOiAlcyAlcywgUyVkLCAlc1xuIiwgaW5zdHJfcHJlZml4LAorCQkgIHRleF9uYW1lLCBkc3RfbmFtZSwgc2FtcGxlcl9uciwgYWRkcl9uYW1lKTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZGVjb2RlX2RjbChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCBpbnQgaSwgY2hhciAqaW5zdHJfcHJlZml4KQoreworCXVpbnQzMl90IGQwID0gY3R4LT5kYXRhW2ldOworCWNvbnN0IGNoYXIgKnNhbXBsZXR5cGU7CisJaW50IGRjbF9uciA9IChkMCA+PiAxNCkgJiAweGY7CisJY29uc3QgY2hhciAqZGNsX3ggPSBkMCAmICgxIDw8IDEwKSA/ICJ4IiA6ICIiOworCWNvbnN0IGNoYXIgKmRjbF95ID0gZDAgJiAoMSA8PCAxMSkgPyAieSIgOiAiIjsKKwljb25zdCBjaGFyICpkY2xfeiA9IGQwICYgKDEgPDwgMTIpID8gInoiIDogIiI7CisJY29uc3QgY2hhciAqZGNsX3cgPSBkMCAmICgxIDw8IDEzKSA/ICJ3IiA6ICIiOworCWNoYXIgZGNsX21hc2tbMTBdOworCisJc3dpdGNoICgoZDAgPj4gMTkpICYgMHgzKSB7CisJY2FzZSAxOgorCQlzcHJpbnRmKGRjbF9tYXNrLCAiLiVzJXMlcyVzIiwgZGNsX3gsIGRjbF95LCBkY2xfeiwgZGNsX3cpOworCQlpZiAoc3RyY21wKGRjbF9tYXNrLCAiLiIpID09IDApCisJCQlmcHJpbnRmKG91dCwgImJhZCAoZW1wdHkpIGRjbCBtYXNrXG4iKTsKKworCQlpZiAoZGNsX25yID4gMTApCisJCQlmcHJpbnRmKG91dCwgImJhZCBUJWQgZGNsIHJlZ2lzdGVyIG51bWJlclxuIiwgZGNsX25yKTsKKwkJaWYgKGRjbF9uciA8IDgpIHsKKwkJCWlmIChzdHJjbXAoZGNsX21hc2ssICIueCIpICE9IDAgJiYKKwkJCSAgICBzdHJjbXAoZGNsX21hc2ssICIueHkiKSAhPSAwICYmCisJCQkgICAgc3RyY21wKGRjbF9tYXNrLCAiLnh6IikgIT0gMCAmJgorCQkJICAgIHN0cmNtcChkY2xfbWFzaywgIi53IikgIT0gMCAmJgorCQkJICAgIHN0cmNtcChkY2xfbWFzaywgIi54eXp3IikgIT0gMCkgeworCQkJCWZwcmludGYob3V0LCAiYmFkIFQlZC4lcyBkY2wgbWFza1xuIiwgZGNsX25yLAorCQkJCQlkY2xfbWFzayk7CisJCQl9CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogRENMIFQlZCVzXG4iLAorCQkJCSAgaW5zdHJfcHJlZml4LCBkY2xfbnIsIGRjbF9tYXNrKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoZGNsX21hc2ssICIueHoiKSA9PSAwKQorCQkJCWZwcmludGYob3V0LCAiZXJyYXRhZWQgYmFkIGRjbCBtYXNrICVzXG4iLAorCQkJCQlkY2xfbWFzayk7CisJCQllbHNlIGlmIChzdHJjbXAoZGNsX21hc2ssICIueHciKSA9PSAwKQorCQkJCWZwcmludGYob3V0LCAiZXJyYXRhZWQgYmFkIGRjbCBtYXNrICVzXG4iLAorCQkJCQlkY2xfbWFzayk7CisJCQllbHNlIGlmIChzdHJjbXAoZGNsX21hc2ssICIueHp3IikgPT0gMCkKKwkJCQlmcHJpbnRmKG91dCwgImVycmF0YWVkIGJhZCBkY2wgbWFzayAlc1xuIiwKKwkJCQkJZGNsX21hc2spOworCisJCQlpZiAoZGNsX25yID09IDgpIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIiVzOiBEQ0wgRElGRlVTRSVzXG4iLCBpbnN0cl9wcmVmaXgsCisJCQkJCSAgZGNsX21hc2spOworCQkJfSBlbHNlIGlmIChkY2xfbnIgPT0gOSkgeworCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJICAiJXM6IERDTCBTUEVDVUxBUiVzXG4iLCBpbnN0cl9wcmVmaXgsCisJCQkJCSAgZGNsX21hc2spOworCQkJfSBlbHNlIGlmIChkY2xfbnIgPT0gMTApIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIiVzOiBEQ0wgRk9HJXNcbiIsIGluc3RyX3ByZWZpeCwKKwkJCQkJICBkY2xfbWFzayk7CisJCQl9CisJCX0KKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwljYXNlIDM6CisJCXN3aXRjaCAoKGQwID4+IDIyKSAmIDB4MykgeworCQljYXNlIDA6CisJCQlzYW1wbGV0eXBlID0gIjJEIjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzYW1wbGV0eXBlID0gIkNVQkUiOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXNhbXBsZXR5cGUgPSAiM0QiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzYW1wbGV0eXBlID0gIlJFU0VSVkVEIjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkY2xfbnIgPiAxNSkKKwkJCWZwcmludGYob3V0LCAiYmFkIFMlZCBkY2wgcmVnaXN0ZXIgbnVtYmVyXG4iLCBkY2xfbnIpOworCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogRENMIFMlZCAlc1xuIiwKKwkJCSAgaW5zdHJfcHJlZml4LCBkY2xfbnIsIHNhbXBsZXR5cGUpOworCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzOiBEQ0wgUkVTRVJWRUQlZFxuIiwKKwkJCSAgaW5zdHJfcHJlZml4LCBkY2xfbnIpOworCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJfQorfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfaW5zdHJ1Y3Rpb24oc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJCWludCBpLCBjaGFyICppbnN0cl9wcmVmaXgpCit7CisJc3dpdGNoICgoY3R4LT5kYXRhW2ldID4+IDI0KSAmIDB4MWYpIHsKKwljYXNlIDB4MDoKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXM6IE5PUFxuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJBREQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiTU9WIik7CisJCWJyZWFrOworCWNhc2UgMHgwMzoKKwkJaTkxNV9kZWNvZGVfYWx1MihjdHgsIGksIGluc3RyX3ByZWZpeCwgIk1VTCIpOworCQlicmVhazsKKwljYXNlIDB4MDQ6CisJCWk5MTVfZGVjb2RlX2FsdTMoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJNQUQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDA1OgorCQlpOTE1X2RlY29kZV9hbHUzKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiRFAyQUREIik7CisJCWJyZWFrOworCWNhc2UgMHgwNjoKKwkJaTkxNV9kZWNvZGVfYWx1MihjdHgsIGksIGluc3RyX3ByZWZpeCwgIkRQMyIpOworCQlicmVhazsKKwljYXNlIDB4MDc6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJEUDQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDA4OgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiRlJDIik7CisJCWJyZWFrOworCWNhc2UgMHgwOToKKwkJaTkxNV9kZWNvZGVfYWx1MShjdHgsIGksIGluc3RyX3ByZWZpeCwgIlJDUCIpOworCQlicmVhazsKKwljYXNlIDB4MGE6CisJCWk5MTVfZGVjb2RlX2FsdTEoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJSU1EiKTsKKwkJYnJlYWs7CisJY2FzZSAweDBiOgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiRVhQIik7CisJCWJyZWFrOworCWNhc2UgMHgwYzoKKwkJaTkxNV9kZWNvZGVfYWx1MShjdHgsIGksIGluc3RyX3ByZWZpeCwgIkxPRyIpOworCQlicmVhazsKKwljYXNlIDB4MGQ6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJDTVAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDBlOgorCQlpOTE1X2RlY29kZV9hbHUyKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiTUlOIik7CisJCWJyZWFrOworCWNhc2UgMHgwZjoKKwkJaTkxNV9kZWNvZGVfYWx1MihjdHgsIGksIGluc3RyX3ByZWZpeCwgIk1BWCIpOworCQlicmVhazsKKwljYXNlIDB4MTA6CisJCWk5MTVfZGVjb2RlX2FsdTEoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJGTFIiKTsKKwkJYnJlYWs7CisJY2FzZSAweDExOgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiTU9EIik7CisJCWJyZWFrOworCWNhc2UgMHgxMjoKKwkJaTkxNV9kZWNvZGVfYWx1MShjdHgsIGksIGluc3RyX3ByZWZpeCwgIlRSQyIpOworCQlicmVhazsKKwljYXNlIDB4MTM6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJTR0UiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE0OgorCQlpOTE1X2RlY29kZV9hbHUyKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiU0xUIik7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJaTkxNV9kZWNvZGVfdGV4KGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiVEVYTEQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE2OgorCQlpOTE1X2RlY29kZV90ZXgoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJURVhMRFAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE3OgorCQlpOTE1X2RlY29kZV90ZXgoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJURVhMREIiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE5OgorCQlpOTE1X2RlY29kZV9kY2woY3R4LCBpLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogdW5rbm93blxuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlY29kZV9jb21wYXJlX2Z1bmModWludDMyX3Qgb3ApCit7CisJc3dpdGNoIChvcCAmIDB4NykgeworCWNhc2UgMDoKKwkJcmV0dXJuICJhbHdheXMiOworCWNhc2UgMToKKwkJcmV0dXJuICJuZXZlciI7CisJY2FzZSAyOgorCQlyZXR1cm4gImxlc3MiOworCWNhc2UgMzoKKwkJcmV0dXJuICJlcXVhbCI7CisJY2FzZSA0OgorCQlyZXR1cm4gImxlcXVhbCI7CisJY2FzZSA1OgorCQlyZXR1cm4gImdyZWF0ZXIiOworCWNhc2UgNjoKKwkJcmV0dXJuICJub3RlcXVhbCI7CisJY2FzZSA3OgorCQlyZXR1cm4gImdlcXVhbCI7CisJfQorCXJldHVybiAiIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVjb2RlX3N0ZW5jaWxfb3AodWludDMyX3Qgb3ApCit7CisJc3dpdGNoIChvcCAmIDB4NykgeworCWNhc2UgMDoKKwkJcmV0dXJuICJrZWVwIjsKKwljYXNlIDE6CisJCXJldHVybiAiemVybyI7CisJY2FzZSAyOgorCQlyZXR1cm4gInJlcGxhY2UiOworCWNhc2UgMzoKKwkJcmV0dXJuICJpbmNyX3NhdCI7CisJY2FzZSA0OgorCQlyZXR1cm4gImRlY3Jfc2F0IjsKKwljYXNlIDU6CisJCXJldHVybiAiZ3JlYXRlciI7CisJY2FzZSA2OgorCQlyZXR1cm4gImluY3IiOworCWNhc2UgNzoKKwkJcmV0dXJuICJkZWNyIjsKKwl9CisJcmV0dXJuICIiOworfQorCisjaWYgMAorc3RhdGljIGNvbnN0IGNoYXIgKgorZGVjb2RlX2xvZ2ljX29wKHVpbnQzMl90IG9wKQoreworCXN3aXRjaCAob3AgJiAweGYpIHsKKwljYXNlIDA6CisJCXJldHVybiAiY2xlYXIiOworCWNhc2UgMToKKwkJcmV0dXJuICJub3IiOworCWNhc2UgMjoKKwkJcmV0dXJuICJhbmRfaW52IjsKKwljYXNlIDM6CisJCXJldHVybiAiY29weV9pbnYiOworCWNhc2UgNDoKKwkJcmV0dXJuICJhbmRfcnZyc2UiOworCWNhc2UgNToKKwkJcmV0dXJuICJpbnYiOworCWNhc2UgNjoKKwkJcmV0dXJuICJ4b3IiOworCWNhc2UgNzoKKwkJcmV0dXJuICJuYW5kIjsKKwljYXNlIDg6CisJCXJldHVybiAiYW5kIjsKKwljYXNlIDk6CisJCXJldHVybiAiZXF1aXYiOworCWNhc2UgMTA6CisJCXJldHVybiAibm9vcCI7CisJY2FzZSAxMToKKwkJcmV0dXJuICJvcl9pbnYiOworCWNhc2UgMTI6CisJCXJldHVybiAiY29weSI7CisJY2FzZSAxMzoKKwkJcmV0dXJuICJvcl9ydnJzZSI7CisJY2FzZSAxNDoKKwkJcmV0dXJuICJvciI7CisJY2FzZSAxNToKKwkJcmV0dXJuICJzZXQiOworCX0KKwlyZXR1cm4gIiI7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVjb2RlX2JsZW5kX2ZhY3QodWludDMyX3Qgb3ApCit7CisJc3dpdGNoIChvcCAmIDB4ZikgeworCWNhc2UgMToKKwkJcmV0dXJuICJ6ZXJvIjsKKwljYXNlIDI6CisJCXJldHVybiAib25lIjsKKwljYXNlIDM6CisJCXJldHVybiAic3JjX2NvbHIiOworCWNhc2UgNDoKKwkJcmV0dXJuICJpbnZfc3JjX2NvbHIiOworCWNhc2UgNToKKwkJcmV0dXJuICJzcmNfYWxwaGEiOworCWNhc2UgNjoKKwkJcmV0dXJuICJpbnZfc3JjX2FscGhhIjsKKwljYXNlIDc6CisJCXJldHVybiAiZHN0X2FscGhhIjsKKwljYXNlIDg6CisJCXJldHVybiAiaW52X2RzdF9hbHBoYSI7CisJY2FzZSA5OgorCQlyZXR1cm4gImRzdF9jb2xyIjsKKwljYXNlIDEwOgorCQlyZXR1cm4gImludl9kc3RfY29sciI7CisJY2FzZSAxMToKKwkJcmV0dXJuICJzcmNfYWxwaGFfc2F0IjsKKwljYXNlIDEyOgorCQlyZXR1cm4gImNuc3RfY29sciI7CisJY2FzZSAxMzoKKwkJcmV0dXJuICJpbnZfY25zdF9jb2xyIjsKKwljYXNlIDE0OgorCQlyZXR1cm4gImNuc3RfYWxwaGEiOworCWNhc2UgMTU6CisJCXJldHVybiAiaW52X2NvbnN0X2FscGhhIjsKKwl9CisJcmV0dXJuICIiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitkZWNvZGVfdGV4X2Nvb3JkX21vZGUodWludDMyX3QgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUgJiAweDcpIHsKKwljYXNlIDA6CisJCXJldHVybiAid3JhcCI7CisJY2FzZSAxOgorCQlyZXR1cm4gIm1pcnJvciI7CisJY2FzZSAyOgorCQlyZXR1cm4gImNsYW1wX2VkZ2UiOworCWNhc2UgMzoKKwkJcmV0dXJuICJjdWJlIjsKKwljYXNlIDQ6CisJCXJldHVybiAiY2xhbXBfYm9yZGVyIjsKKwljYXNlIDU6CisJCXJldHVybiAibWlycm9yX29uY2UiOworCX0KKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlY29kZV9zYW1wbGVfZmlsdGVyKHVpbnQzMl90IG1vZGUpCit7CisJc3dpdGNoIChtb2RlICYgMHg3KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gIm5lYXJlc3QiOworCWNhc2UgMToKKwkJcmV0dXJuICJsaW5lYXIiOworCWNhc2UgMjoKKwkJcmV0dXJuICJhbmlzb3Ryb3BpYyI7CisJY2FzZSAzOgorCQlyZXR1cm4gIjR4NF8xIjsKKwljYXNlIDQ6CisJCXJldHVybiAiNHg0XzIiOworCWNhc2UgNToKKwkJcmV0dXJuICI0eDRfZmxhdCI7CisJY2FzZSA2OgorCQlyZXR1cm4gIjZ4NV9tb25vIjsKKwl9CisJcmV0dXJuICIiOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfM2RfMWQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLCBpLCBjLCBpZHgsIHdvcmQsIG1hcCwgc2FtcGxlciwgaW5zdHI7CisJY29uc3QgY2hhciAqZm9ybWF0LCAqemZvcm1hdCwgKnR5cGU7CisJdWludDMyX3Qgb3Bjb2RlOworCXVpbnQzMl90ICpkYXRhID0gY3R4LT5kYXRhOworCXVpbnQzMl90IGRldmlkID0gY3R4LT5kZXZpZDsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IG9wY29kZTsKKwkJaW50IGk4MzBfb25seTsKKwkJdW5zaWduZWQgaW50IG1pbl9sZW47CisJCXVuc2lnbmVkIGludCBtYXhfbGVuOworCQljb25zdCBjaGFyICpuYW1lOworCX0gb3Bjb2Rlc18zZF8xZFtdID0geworCQl7IDB4ODYsIDAsIDQsIDQsICIzRFNUQVRFX0NIUk9NQV9LRVkiIH0sCisJCXsgMHg4OCwgMCwgMiwgMiwgIjNEU1RBVEVfQ09OU1RBTlRfQkxFTkRfQ09MT1IiIH0sCisJCXsgMHg5OSwgMCwgMiwgMiwgIjNEU1RBVEVfREVGQVVMVF9ESUZGVVNFIiB9LAorCQl7IDB4OWEsIDAsIDIsIDIsICIzRFNUQVRFX0RFRkFVTFRfU1BFQ1VMQVIiIH0sCisJCXsgMHg5OCwgMCwgMiwgMiwgIjNEU1RBVEVfREVGQVVMVF9aIiB9LAorCQl7IDB4OTcsIDAsIDIsIDIsICIzRFNUQVRFX0RFUFRIX09GRlNFVF9TQ0FMRSIgfSwKKwkJeyAweDlkLCAwLCA2NSwgNjUsICIzRFNUQVRFX0ZJTFRFUl9DT0VGRklDSUVOVFNfNFg0IiB9LAorCQl7IDB4OWUsIDAsIDQsIDQsICIzRFNUQVRFX01PTk9fRklMVEVSIiB9LAorCQl7IDB4ODksIDAsIDQsIDQsICIzRFNUQVRFX0ZPR19NT0RFIiB9LAorCQl7IDB4OGYsIDAsIDIsIDE2LCAiM0RTVEFURV9NQVBfUEFMTEVURV9MT0FEXzMyIiB9LAorCQl7IDB4ODMsIDAsIDIsIDIsICIzRFNUQVRFX1NQQU5fU1RJUFBMRSIgfSwKKwkJeyAweDhjLCAxLCAyLCAyLCAiM0RTVEFURV9NQVBfQ09PUkRfVFJBTlNGT1JNX0k4MzAiIH0sCisJCXsgMHg4YiwgMSwgMiwgMiwgIjNEU1RBVEVfTUFQX1ZFUlRFWF9UUkFOU0ZPUk1fSTgzMCIgfSwKKwkJeyAweDhkLCAxLCAzLCAzLCAiM0RTVEFURV9XX1NUQVRFX0k4MzAiIH0sCisJCXsgMHgwMSwgMSwgMiwgMiwgIjNEU1RBVEVfQ09MT1JfRkFDVE9SX0k4MzAiIH0sCisJCXsgMHgwMiwgMSwgMiwgMiwgIjNEU1RBVEVfTUFQX0NPT1JEX1NFVEJJTkRfSTgzMCJ9LAorCX0sICpvcGNvZGVfM2RfMWQ7CisKKwlvcGNvZGUgPSAoZGF0YVswXSAmIDB4MDBmZjAwMDApID4+IDE2OworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIDB4MDc6CisJCS8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgdW51c3VhbC4gIEEgMCBsZW5ndGggbWVhbnMganVzdAorCQkgKiAxIERXT1JEIGluc3RlYWQgb2YgMi4gIFRoZSAwIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4KKwkJICogb25lIHBsYWNlIHRvIGJlIHVuc3VwcG9ydGVkLCBidXQgc3RhdGVkIHRvIGJlCisJCSAqIHJlcXVpcmVkIGluIGFub3RoZXIsIGFuZCAwIGxlbmd0aCBMT0FEX0lORElSRUNUcworCQkgKiBhcHBlYXIgdG8gY2F1c2Ugbm8gaGFybSBhdCBsZWFzdC4KKwkJICovCisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0xPQURfSU5ESVJFQ1RcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwZmYpICsgMTsKKwkJaSA9IDE7CisJCWlmIChkYXRhWzBdICYgKDB4MDEgPDwgOCkpIHsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIlNJUy4wXG4iKTsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIlNJUy4xXG4iKTsKKwkJfQorCQlpZiAoZGF0YVswXSAmICgweDAyIDw8IDgpKSB7CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICJESVMuMFxuIik7CisJCX0KKwkJaWYgKGRhdGFbMF0gJiAoMHgwNCA8PCA4KSkgeworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiU1NCLjBcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiU1NCLjFcbiIpOworCQl9CisJCWlmIChkYXRhWzBdICYgKDB4MDggPDwgOCkpIHsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIk1TQi4wXG4iKTsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIk1TQi4xXG4iKTsKKwkJfQorCQlpZiAoZGF0YVswXSAmICgweDEwIDw8IDgpKSB7CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICJQU1AuMFxuIik7CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICJQU1AuMVxuIik7CisJCX0KKwkJaWYgKGRhdGFbMF0gJiAoMHgyMCA8PCA4KSkgeworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiUFNDLjBcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiUFNDLjFcbiIpOworCQl9CisJCWlmIChsZW4gIT0gaSkgeworCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9MT0FEX0lORElSRUNUXG4iKTsKKwkJCXJldHVybiBsZW47CisJCX0KKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDQ6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzFcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKwkJaSA9IDE7CisJCWZvciAod29yZCA9IDA7IHdvcmQgPD0gODsgd29yZCsrKSB7CisJCQlpZiAoZGF0YVswXSAmICgxIDw8ICg0ICsgd29yZCkpKSB7CisJCQkJLyogc2F2ZSB2ZXJ0ZXggc3RhdGUgZm9yIGRlY29kZSAqLworCQkJCWlmICghSVNfR0VOMihkZXZpZCkpIHsKKwkJCQkJaW50IHRleF9udW07CisKKwkJCQkJaWYgKHdvcmQgPT0gMikgeworCQkJCQkJc2F2ZWRfczJfc2V0ID0gMTsKKwkJCQkJCXNhdmVkX3MyID0gZGF0YVtpXTsKKwkJCQkJfQorCQkJCQlpZiAod29yZCA9PSA0KSB7CisJCQkJCQlzYXZlZF9zNF9zZXQgPSAxOworCQkJCQkJc2F2ZWRfczQgPSBkYXRhW2ldOworCQkJCQl9CisKKwkJCQkJc3dpdGNoICh3b3JkKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJICAiUzA6IHZibyBvZmZzZXQ6IDB4JTA4eCVzXG4iLAorCQkJCQkJCSAgZGF0YVtpXSAmICh+MSksCisJCQkJCQkJICBkYXRhW2ldICYgMSA/CisJCQkJCQkJICAiLCBhdXRvIGNhY2hlIGludmFsaWRhdGUgZGlzYWJsZWQiCisJCQkJCQkJICA6ICIiKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIlMxOiB2ZXJ0ZXggd2lkdGg6ICVpLCB2ZXJ0ZXggcGl0Y2g6ICVpXG4iLAorCQkJCQkJCSAgKGRhdGFbaV0gPj4gMjQpICYKKwkJCQkJCQkgIDB4M2YsCisJCQkJCQkJICAoZGF0YVtpXSA+PiAxNikgJgorCQkJCQkJCSAgMHgzZik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCQkgICJTMjogdGV4Y29vcmQgZm9ybWF0czogIik7CisJCQkJCQlmb3IgKHRleF9udW0gPSAwOworCQkJCQkJICAgICB0ZXhfbnVtIDwgODsgdGV4X251bSsrKSB7CisJCQkJCQkJc3dpdGNoICgoZGF0YVtpXSA+PgorCQkJCQkJCQkgdGV4X251bSAqCisJCQkJCQkJCSA0KSAmIDB4ZikgeworCQkJCQkJCWNhc2UgMDoKKwkJCQkJCQkJZnByaW50ZihvdXQsCisJCQkJCQkJCQkiJWk9MkQgIiwKKwkJCQkJCQkJCXRleF9udW0pOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCWZwcmludGYob3V0LAorCQkJCQkJCQkJIiVpPTNEICIsCisJCQkJCQkJCQl0ZXhfbnVtKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlmcHJpbnRmKG91dCwKKwkJCQkJCQkJCSIlaT00RCAiLAorCQkJCQkJCQkJdGV4X251bSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJZnByaW50ZihvdXQsCisJCQkJCQkJCQkiJWk9MUQgIiwKKwkJCQkJCQkJCXRleF9udW0pOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDQ6CisJCQkJCQkJCWZwcmludGYob3V0LAorCQkJCQkJCQkJIiVpPTJEXzE2ICIsCisJCQkJCQkJCQl0ZXhfbnVtKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA1OgorCQkJCQkJCQlmcHJpbnRmKG91dCwKKwkJCQkJCQkJCSIlaT00RF8xNiAiLAorCQkJCQkJCQkJdGV4X251bSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMHhmOgorCQkJCQkJCQlmcHJpbnRmKG91dCwKKwkJCQkJCQkJCSIlaT1OUCAiLAorCQkJCQkJCQkJdGV4X251bSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWZwcmludGYob3V0LCAiXG4iKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMzoKKwkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJICAiUzM6IG5vdCBkb2N1bWVudGVkXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQl7CisJCQkJCQkJY29uc3QgY2hhciAqY3VsbG1vZGUgPSAiIjsKKwkJCQkJCQljb25zdCBjaGFyICp2Zm10X3h5encgPSAiIjsKKwkJCQkJCQlzd2l0Y2ggKChkYXRhW2ldID4+IDEzKQorCQkJCQkJCQkmIDB4MykgeworCQkJCQkJCWNhc2UgMDoKKwkJCQkJCQkJY3VsbG1vZGUgPQorCQkJCQkJCQkgICAgImJvdGgiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCWN1bGxtb2RlID0KKwkJCQkJCQkJICAgICJub25lIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQljdWxsbW9kZSA9ICJjdyI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJY3VsbG1vZGUgPQorCQkJCQkJCQkgICAgImNjdyI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlzd2l0Y2ggKGRhdGFbaV0gJgorCQkJCQkJCQkoNyA8PCA2IHwgMSA8PAorCQkJCQkJCQkgMikpIHsKKwkJCQkJCQljYXNlIDEgPDwgNjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWVosIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyIDw8IDY6CisJCQkJCQkJCXZmbXRfeHl6dyA9CisJCQkJCQkJCSAgICAiWFlaVywiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDMgPDwgNjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWSwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDQgPDwgNjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWVcsIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxIDw8IDYgfCAxIDw8IDI6CisJCQkJCQkJCXZmbXRfeHl6dyA9CisJCQkJCQkJCSAgICAiWFlaRiwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDIgPDwgNiB8IDEgPDwgMjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWVpXRiwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDMgPDwgNiB8IDEgPDwgMjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWUYsIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA0IDw8IDYgfCAxIDw8IDI6CisJCQkJCQkJCXZmbXRfeHl6dyA9CisJCQkJCQkJCSAgICAiWFlXRiwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCQkJICAiUzQ6IHBvaW50X3dpZHRoPSVpLCBsaW5lX3dpZHRoPSUuMWYsIgorCQkJCQkJCQkgICIlcyVzJXMlcyVzIGN1bGxtb2RlPSVzLCB2Zm10PSVzJXMlcyVzJXMlcyAiCisJCQkJCQkJCSAgIiVzJXMlcyVzJXNcbiIsCisJCQkJCQkJCSAgKGRhdGFbaV0gPj4KKwkJCQkJCQkJICAgMjMpICYgMHgxZmYsCisJCQkJCQkJCSAgKChkYXRhW2ldID4+CisJCQkJCQkJCSAgICAxOSkgJiAweGYpIC8KKwkJCQkJCQkJICAyLjAsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgweGYKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTUpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICIgZmxhdHNoYWRlPSIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAxOCkKKwkJCQkJCQkJICA/ICJBbHBoYSwiIDoKKwkJCQkJCQkJICAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTcpCisJCQkJCQkJCSAgPyAiRm9nLCIgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTYpCisJCQkJCQkJCSAgPyAiU3BlY3VsYXIsIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDE1KQorCQkJCQkJCQkgID8gIkNvbG9yLCIgOgorCQkJCQkJCQkgICIiLCBjdWxsbW9kZSwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTIpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJQb2ludFdpZHRoLCIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAxMSkKKwkJCQkJCQkJICA/ICJTcGVjRm9nLCIgOgorCQkJCQkJCQkgICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAxMCkKKwkJCQkJCQkJICA/ICJDb2xvciwiIDoKKwkJCQkJCQkJICAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgOSkKKwkJCQkJCQkJICA/ICJEZXB0aE9mcywiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICB2Zm10X3h5encsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDkpCisJCQkJCQkJCSAgPyAiRm9nUGFyYW0sIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDUpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJmb3JjZSBkZWZhdWx0IGRpZmZ1c2UsICIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICA0KQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAiZm9yY2UgZGVmYXVsdCBzcGVjdWxhciwgIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDMpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJsb2NhbCBkZXB0aCBvZnMgZW5hYmxlLCAiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMSkKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgInBvaW50IHNwcml0ZSBlbmFibGUsICIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAwKQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAibGluZSBBQSBlbmFibGUsICIKKwkJCQkJCQkJICA6ICIiKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJY2FzZSA1OgorCQkJCQkJeworCQkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJCSAgIlM1OiVzJXMlcyVzJXMiCisJCQkJCQkJCSAgIiVzJXMlcyVzIHN0ZW5jaWxfcmVmPTB4JXgsIHN0ZW5jaWxfdGVzdD0lcywgIgorCQkJCQkJCQkgICJzdGVuY2lsX2ZhaWw9JXMsIHN0ZW5jaWxfcGFzc196X2ZhaWw9JXMsICIKKwkJCQkJCQkJICAic3RlbmNpbF9wYXNzX3pfcGFzcz0lcywgJXMlcyVzJXNcbiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgweGYKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMjgpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICIgd3JpdGVfZGlzYWJsZT0iCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMzEpCisJCQkJCQkJCSAgPyAiQWxwaGEsIiA6CisJCQkJCQkJCSAgIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDMwKQorCQkJCQkJCQkgID8gIlJlZCwiIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDI5KQorCQkJCQkJCQkgID8gIkdyZWVuLCIgOgorCQkJCQkJCQkgICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyOCkKKwkJCQkJCQkJICA/ICJCbHVlLCIgOgorCQkJCQkJCQkgICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyNykKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgIiBmb3JjZSBkZWZhdWx0IHBvaW50IHNpemUsIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDI2KQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAiIGxhc3QgcGl4ZWwgZW5hYmxlLCIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyNSkKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgIiBnbG9iYWwgZGVwdGggb2ZzIGVuYWJsZSwiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMjQpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICIgZm9nIGVuYWJsZSwiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICAxNikgJiAweGZmLAorCQkJCQkJCQkgIGRlY29kZV9jb21wYXJlX2Z1bmMKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICAxMyksCisJCQkJCQkJCSAgZGVjb2RlX3N0ZW5jaWxfb3AKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICAxMCksCisJCQkJCQkJCSAgZGVjb2RlX3N0ZW5jaWxfb3AKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICA3KSwKKwkJCQkJCQkJICBkZWNvZGVfc3RlbmNpbF9vcAorCQkJCQkJCQkgIChkYXRhW2ldID4+CisJCQkJCQkJCSAgIDQpLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAzKQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAic3RlbmNpbCB3cml0ZSBlbmFibGUsICIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyKQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAic3RlbmNpbCB0ZXN0IGVuYWJsZSwgIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDEpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJjb2xvciBkaXRoZXIgZW5hYmxlLCAiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMCkKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgImxvZ2ljb3AgZW5hYmxlLCAiCisJCQkJCQkJCSAgOiAiIik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA2OgorCQkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCQkgICJTNjogJXNhbHBoYV90ZXN0PSVzLCBhbHBoYV9yZWY9MHgleCwgIgorCQkJCQkJCSAgImRlcHRoX3Rlc3Q9JXMsICVzc3JjX2JsbmRfZmN0PSVzLCBkc3RfYmxuZF9mY3Q9JXMsICIKKwkJCQkJCQkgICIlcyVzdHJpc3RyaXBfcHJvdm9raW5nX3ZlcnRleD0laVxuIiwKKwkJCQkJCQkgIGRhdGFbaV0gJiAoMSA8PCAzMSkgPworCQkJCQkJCSAgImFscGhhIHRlc3QgZW5hYmxlLCAiCisJCQkJCQkJICA6ICIiLAorCQkJCQkJCSAgZGVjb2RlX2NvbXBhcmVfZnVuYworCQkJCQkJCSAgKGRhdGFbaV0gPj4gMjgpLAorCQkJCQkJCSAgZGF0YVtpXSAmICgweGZmIDw8CisJCQkJCQkJCSAgICAgMjApLAorCQkJCQkJCSAgZGVjb2RlX2NvbXBhcmVfZnVuYworCQkJCQkJCSAgKGRhdGFbaV0gPj4gMTYpLAorCQkJCQkJCSAgZGF0YVtpXSAmICgxIDw8IDE1KSA/CisJCQkJCQkJICAiY2J1ZiBibGVuZCBlbmFibGUsICIKKwkJCQkJCQkgIDogIiIsCisJCQkJCQkJICBkZWNvZGVfYmxlbmRfZmFjdChkYXRhCisJCQkJCQkJCQkgICAgW2ldCisJCQkJCQkJCQkgICAgPj4KKwkJCQkJCQkJCSAgICA4KSwKKwkJCQkJCQkgIGRlY29kZV9ibGVuZF9mYWN0KGRhdGEKKwkJCQkJCQkJCSAgICBbaV0KKwkJCQkJCQkJCSAgICA+PgorCQkJCQkJCQkJICAgIDQpLAorCQkJCQkJCSAgZGF0YVtpXSAmICgxIDw8IDMpID8KKwkJCQkJCQkgICJkZXB0aCB3cml0ZSBlbmFibGUsICIKKwkJCQkJCQkgIDogIiIsCisJCQkJCQkJICBkYXRhW2ldICYgKDEgPDwgMikgPworCQkJCQkJCSAgImNidWYgd3JpdGUgZW5hYmxlLCAiCisJCQkJCQkJICA6ICIiLAorCQkJCQkJCSAgZGF0YVtpXSAmICgweDMpKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDc6CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIlM3OiBkZXB0aCBvZmZzZXQgY29uc3RhbnQ6IDB4JTA4eFxuIiwKKwkJCQkJCQkgIGRhdGFbaV0pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJICAiUyVkOiAweCUwOHhcbiIsIHdvcmQsIGRhdGFbaV0pOworCQkJCX0KKwkJCQlpKys7CisJCQl9CisJCX0KKwkJaWYgKGxlbiAhPSBpKSB7CisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMVxuIik7CisJCX0KKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDM6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzJcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKwkJaSA9IDE7CisJCWZvciAod29yZCA9IDY7IHdvcmQgPD0gMTQ7IHdvcmQrKykgeworCQkJaWYgKGRhdGFbMF0gJiAoMSA8PCB3b3JkKSkgeworCQkJCWlmICh3b3JkID09IDYpCisJCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJCSAgIlRCQ0ZcbiIpOworCQkJCWVsc2UgaWYgKHdvcmQgPj0gNyAmJiB3b3JkIDw9IDEwKSB7CisJCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJCSAgIlRCJWRDXG4iLCB3b3JkIC0gNyk7CisJCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJCSAgIlRCJWRBXG4iLCB3b3JkIC0gNyk7CisJCQkJfSBlbHNlIGlmICh3b3JkID49IDExICYmIHdvcmQgPD0gMTQpIHsKKwkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCSAgIlRNJWRTMDogb2Zmc2V0PTB4JTA4eCwgJXNcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSwKKwkJCQkJCSAgZGF0YVtpXSAmIDB4ZmZmZmZmZmUsCisJCQkJCQkgIGRhdGFbaV0gJiAxID8gInVzZSBmZW5jZSIgOgorCQkJCQkJICAiIik7CisJCQkJCWkrKzsKKwkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCSAgIlRNJWRTMTogaGVpZ2h0PSVpLCB3aWR0aD0laSwgJXNcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSwgZGF0YVtpXSA+PiAyMSwKKwkJCQkJCSAgKGRhdGFbaV0gPj4gMTApICYgMHgzZmYsCisJCQkJCQkgIGRhdGFbaV0gJiAyID8gKGRhdGFbaV0gJiAxID8KKwkJCQkJCQkJICJ5LXRpbGVkIiA6CisJCQkJCQkJCSAieC10aWxlZCIpIDoKKwkJCQkJCSAgIiIpOworCQkJCQlpKys7CisJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkgICJUTSVkUzI6IHBpdGNoPSVpLCBcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSwKKwkJCQkJCSAgKChkYXRhW2ldID4+IDIxKSArIDEpICogNCk7CisJCQkJCWkrKzsKKwkJCQkJaW5zdHJfb3V0KGN0eCwgaSsrLAorCQkJCQkJICAiVE0lZFMzXG4iLCB3b3JkIC0gMTEpOworCQkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCQkgICJUTSVkUzQ6IGRmbHQgY29sb3JcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChsZW4gIT0gaSkgeworCQkJZnByaW50ZihvdXQsCisJCQkJIkJhZCBjb3VudCBpbiAzRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzJcbiIpOworCQl9CisJCXJldHVybiBsZW47CisJY2FzZSAweDAwOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9NQVBfU1RBVEVcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwM2YpICsgMjsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIm1hc2tcbiIpOworCisJCWkgPSAyOworCQlmb3IgKG1hcCA9IDA7IG1hcCA8PSAxNTsgbWFwKyspIHsKKwkJCWlmIChkYXRhWzFdICYgKDEgPDwgbWFwKSkgeworCQkJCWludCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCwgZHdvcmQ7CisJCQkJY29uc3QgY2hhciAqdGlsaW5nOworCisJCQkJZHdvcmQgPSBkYXRhW2ldOworCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJICAibWFwICVkIE1TMiAlcyVzJXNcbiIsIG1hcCwKKwkJCQkJICBkd29yZCAmICgxIDw8IDMxKSA/CisJCQkJCSAgInVudHJ1c3RlZCBzdXJmYWNlLCAiIDogIiIsCisJCQkJCSAgZHdvcmQgJiAoMSA8PCAxKSA/CisJCQkJCSAgInZlcnRpY2FsIGxpbmUgc3RyaWRlIGVuYWJsZSwgIiA6ICIiLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMCkgPworCQkJCQkgICJ2ZXJ0aWNhbCBvZnMgZW5hYmxlLCAiIDogIiIpOworCisJCQkJZHdvcmQgPSBkYXRhW2ldOworCQkJCXdpZHRoID0gKChkd29yZCA+PiAxMCkgJiAoKDEgPDwgMTEpIC0gMSkpICsgMTsKKwkJCQloZWlnaHQgPSAoKGR3b3JkID4+IDIxKSAmICgoMSA8PCAxMSkgLSAxKSkgKyAxOworCisJCQkJdGlsaW5nID0gIm5vbmUiOworCQkJCWlmIChkd29yZCAmICgxIDw8IDIpKQorCQkJCQl0aWxpbmcgPSAiZmVuY2VkIjsKKwkJCQllbHNlIGlmIChkd29yZCAmICgxIDw8IDEpKQorCQkJCQl0aWxpbmcgPSBkd29yZCAmICgxIDw8IDApID8gIlkiIDogIlgiOworCQkJCXR5cGUgPSAiIEJBRCI7CisJCQkJZm9ybWF0ID0gIkJBRCI7CisJCQkJc3dpdGNoICgoZHdvcmQgPj4gNykgJiAweDcpIHsKKwkJCQljYXNlIDE6CisJCQkJCXR5cGUgPSAiOGIiOworCQkJCQlzd2l0Y2ggKChkd29yZCA+PiAzKSAmIDB4ZikgeworCQkJCQljYXNlIDA6CisJCQkJCQlmb3JtYXQgPSAiSSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIkwiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCWZvcm1hdCA9ICJBIjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDU6CisJCQkJCQlmb3JtYXQgPSAiIG1vbm8iOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQl0eXBlID0gIjE2YiI7CisJCQkJCXN3aXRjaCAoKGR3b3JkID4+IDMpICYgMHhmKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCWZvcm1hdCA9ICIgcmdiNTY1IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlmb3JtYXQgPSAiIGFyZ2IxNTU1IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlmb3JtYXQgPSAiIGFyZ2I0NDQ0IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDU6CisJCQkJCQlmb3JtYXQgPSAiIGF5ODgiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNjoKKwkJCQkJCWZvcm1hdCA9ICIgYnVtcDY1NSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA3OgorCQkJCQkJZm9ybWF0ID0gIkkiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgODoKKwkJCQkJCWZvcm1hdCA9ICJMIjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDk6CisJCQkJCQlmb3JtYXQgPSAiQSI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCXR5cGUgPSAiMzJiIjsKKwkJCQkJc3dpdGNoICgoZHdvcmQgPj4gMykgJiAweGYpIHsKKwkJCQkJY2FzZSAwOgorCQkJCQkJZm9ybWF0ID0gIiBhcmdiODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIiBhYmdyODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJZm9ybWF0ID0gIiB4cmdiODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAzOgorCQkJCQkJZm9ybWF0ID0gIiB4YmdyODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJZm9ybWF0ID0gIiBxd3Z1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA1OgorCQkJCQkJZm9ybWF0ID0gIiBheHZ1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA2OgorCQkJCQkJZm9ybWF0ID0gIiBseHZ1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA3OgorCQkJCQkJZm9ybWF0ID0gIiB4bHZ1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA4OgorCQkJCQkJZm9ybWF0ID0gIiBhcmdiMjEwMTAxMCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA5OgorCQkJCQkJZm9ybWF0ID0gIiBhYmdyMjEwMTAxMCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMDoKKwkJCQkJCWZvcm1hdCA9ICIgYXd2dTIxMDEwMTAiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTE6CisJCQkJCQlmb3JtYXQgPSAiIGdyMTYxNiI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMjoKKwkJCQkJCWZvcm1hdCA9ICIgdnUxNjE2IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDEzOgorCQkJCQkJZm9ybWF0ID0gIiB4STgyNCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxNDoKKwkJCQkJCWZvcm1hdCA9ICIgeEE4MjQiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTU6CisJCQkJCQlmb3JtYXQgPSAiIHhMODI0IjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToKKwkJCQkJdHlwZSA9ICI0MjIiOworCQkJCQlzd2l0Y2ggKChkd29yZCA+PiAzKSAmIDB4ZikgeworCQkJCQljYXNlIDA6CisJCQkJCQlmb3JtYXQgPSAiIHl1dl9zd2FweSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIiB5dXYiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCWZvcm1hdCA9ICIgeXV2X3N3YXB1diI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAzOgorCQkJCQkJZm9ybWF0ID0gIiB5dXZfc3dhcHV2eSI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCXR5cGUgPSAiY29tcHJlc3NlZCI7CisJCQkJCXN3aXRjaCAoKGR3b3JkID4+IDMpICYgMHg3KSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCWZvcm1hdCA9ICIgZHh0MSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIiBkeHQyXzMiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCWZvcm1hdCA9ICIgZHh0NF81IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDM6CisJCQkJCQlmb3JtYXQgPSAiIGZ4dDEiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCWZvcm1hdCA9ICIgZHh0MV9yYiI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDc6CisJCQkJCXR5cGUgPSAiNGIgaW5kZXhlZCI7CisJCQkJCXN3aXRjaCAoKGR3b3JkID4+IDMpICYgMHhmKSB7CisJCQkJCWNhc2UgNzoKKwkJCQkJCWZvcm1hdCA9ICIgYXJnYjg4ODgiOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWR3b3JkID0gZGF0YVtpXTsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIm1hcCAlZCBNUzMgW3dpZHRoPSVkLCBoZWlnaHQ9JWQsIGZvcm1hdD0lcyVzLCB0aWxpbmc9JXMlc11cbiIsCisJCQkJCSAgbWFwLCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBmb3JtYXQsCisJCQkJCSAgdGlsaW5nLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgOSkgPyAiIHBhbGV0dGUgc2VsZWN0IiA6CisJCQkJCSAgIiIpOworCisJCQkJZHdvcmQgPSBkYXRhW2ldOworCQkJCXBpdGNoID0KKwkJCQkgICAgNCAqICgoKGR3b3JkID4+IDIxKSAmICgoMSA8PCAxMSkgLSAxKSkgKyAxKTsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIm1hcCAlZCBNUzQgW3BpdGNoPSVkLCBtYXhfbG9kPSVpLCB2b2xfZGVwdGg9JWksIGN1YmVfZmFjZV9lbmE9JXgsICVzXVxuIiwKKwkJCQkJICBtYXAsIHBpdGNoLCAoZHdvcmQgPj4gOSkgJiAweDNmLAorCQkJCQkgIGR3b3JkICYgMHhmZiwgKGR3b3JkID4+IDE1KSAmIDB4M2YsCisJCQkJCSAgZHdvcmQgJiAoMSA8PCA4KSA/ICJtaXBsYXlvdXQgbGVnYWN5IgorCQkJCQkgIDogIm1pcGxheW91dCByaWdodCIpOworCQkJfQorCQl9CisJCWlmIChsZW4gIT0gaSkgeworCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9NQVBfU1RBVEVcbiIpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCQlyZXR1cm4gbGVuOworCWNhc2UgMHgwNjoKKwkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCSAgIjNEU1RBVEVfUElYRUxfU0hBREVSX0NPTlNUQU5UU1xuIik7CisJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCisJCWkgPSAyOworCQlmb3IgKGMgPSAwOyBjIDw9IDMxOyBjKyspIHsKKwkJCWlmIChkYXRhWzFdICYgKDEgPDwgYykpIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlggPSAlZlxuIiwgYywKKwkJCQkJICBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlkgPSAlZlxuIiwKKwkJCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlogPSAlZlxuIiwKKwkJCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlcgPSAlZlxuIiwKKwkJCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCQlpZiAobGVuICE9IGkpIHsKKwkJCWZwcmludGYob3V0LAorCQkJCSJCYWQgY291bnQgaW4gM0RTVEFURV9QSVhFTF9TSEFERVJfQ09OU1RBTlRTXG4iKTsKKwkJfQorCQlyZXR1cm4gbGVuOworCWNhc2UgMHgwNToKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfUElYRUxfU0hBREVSX1BST0dSQU1cbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwZmYpICsgMjsKKwkJaWYgKChsZW4gLSAxKSAlIDMgIT0gMCB8fCBsZW4gPiAzNzApIHsKKwkJCWZwcmludGYob3V0LAorCQkJCSJCYWQgY291bnQgaW4gM0RTVEFURV9QSVhFTF9TSEFERVJfUFJPR1JBTVxuIik7CisJCX0KKwkJaSA9IDE7CisJCWZvciAoaW5zdHIgPSAwOyBpbnN0ciA8IChsZW4gLSAxKSAvIDM7IGluc3RyKyspIHsKKwkJCWNoYXIgaW5zdHJfcHJlZml4WzEwXTsKKworCQkJc3ByaW50ZihpbnN0cl9wcmVmaXgsICJQUyUwM2QiLCBpbnN0cik7CisJCQlpOTE1X2RlY29kZV9pbnN0cnVjdGlvbihjdHgsIGksCisJCQkJCQlpbnN0cl9wcmVmaXgpOworCQkJaSArPSAzOworCQl9CisJCXJldHVybiBsZW47CisJY2FzZSAweDAxOgorCQlpZiAoSVNfR0VOMihkZXZpZCkpCisJCQlicmVhazsKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfU0FNUExFUl9TVEFURVxuIik7CisJCWluc3RyX291dChjdHgsIDEsICJtYXNrXG4iKTsKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMDNmKSArIDI7CisJCWkgPSAyOworCQlmb3IgKHNhbXBsZXIgPSAwOyBzYW1wbGVyIDw9IDE1OyBzYW1wbGVyKyspIHsKKwkJCWlmIChkYXRhWzFdICYgKDEgPDwgc2FtcGxlcikpIHsKKwkJCQl1aW50MzJfdCBkd29yZDsKKwkJCQljb25zdCBjaGFyICptaXBfZmlsdGVyID0gIiI7CisKKwkJCQlkd29yZCA9IGRhdGFbaV07CisJCQkJc3dpdGNoICgoZHdvcmQgPj4gMjApICYgMHgzKSB7CisJCQkJY2FzZSAwOgorCQkJCQltaXBfZmlsdGVyID0gIm5vbmUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCW1pcF9maWx0ZXIgPSAibmVhcmVzdCI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJbWlwX2ZpbHRlciA9ICJsaW5lYXIiOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaW5zdHJfb3V0KGN0eCwgaSsrLAorCQkJCQkgICJzYW1wbGVyICVkIFNTMjolcyVzJXMgIgorCQkJCQkgICJiYXNlX21pcF9sZXZlbD0laSwgbWlwX2ZpbHRlcj0lcywgbWFnX2ZpbHRlcj0lcywgbWluX2ZpbHRlcj0lcyAiCisJCQkJCSAgImxvZF9iaWFzPSUuMmYsJXMgbWF4X2FuaXNvPSVpLCBzaGFkb3dfZnVuYz0lc1xuIiwKKwkJCQkJICBzYW1wbGVyLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMzEpID8gIiByZXZlcnNlIGdhbW1hLCIKKwkJCQkJICA6ICIiLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMzApID8gIiBwYWNrZWQycGxhbmFyLCIKKwkJCQkJICA6ICIiLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMjkpID8KKwkJCQkJICAiIGNvbG9yc3BhY2UgY29udmVyc2lvbiwiIDogIiIsCisJCQkJCSAgKGR3b3JkID4+IDIyKSAmIDB4MWYsIG1pcF9maWx0ZXIsCisJCQkJCSAgZGVjb2RlX3NhbXBsZV9maWx0ZXIoZHdvcmQgPj4gMTcpLAorCQkJCQkgIGRlY29kZV9zYW1wbGVfZmlsdGVyKGR3b3JkID4+IDE0KSwKKwkJCQkJICAoKGR3b3JkID4+IDUpICYgMHgxZmYpIC8gKDB4MTAgKiAxLjApLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgNCkgPyAiIHNoYWRvdywiIDogIiIsCisJCQkJCSAgZHdvcmQgJiAoMSA8PCAzKSA/IDQgOiAyLAorCQkJCQkgIGRlY29kZV9jb21wYXJlX2Z1bmMoZHdvcmQpKTsKKwkJCQlkd29yZCA9IGRhdGFbaV07CisJCQkJaW5zdHJfb3V0KGN0eCwgaSsrLAorCQkJCQkgICJzYW1wbGVyICVkIFNTMzogbWluX2xvZD0lLjJmLCVzICIKKwkJCQkJICAidGNtb2RlX3g9JXMsIHRjbW9kZV95PSVzLCB0Y21vZGVfej0lcywlcyB0ZXhtYXBfaWR4PSVpLCVzXG4iLAorCQkJCQkgIHNhbXBsZXIsCisJCQkJCSAgKChkd29yZCA+PiAyNCkgJiAweGZmKSAvICgweDEwICogMS4wKSwKKwkJCQkJICBkd29yZCAmICgxIDw8IDE3KSA/CisJCQkJCSAgIiBraWxsIHBpeGVsIGVuYWJsZSwiIDogIiIsCisJCQkJCSAgZGVjb2RlX3RleF9jb29yZF9tb2RlKGR3b3JkID4+IDEyKSwKKwkJCQkJICBkZWNvZGVfdGV4X2Nvb3JkX21vZGUoZHdvcmQgPj4gOSksCisJCQkJCSAgZGVjb2RlX3RleF9jb29yZF9tb2RlKGR3b3JkID4+IDYpLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgNSkgPworCQkJCQkgICIgbm9ybWFsaXplZCBjb29yZHMsIiA6ICIiLAorCQkJCQkgIChkd29yZCA+PiAxKSAmIDB4ZiwKKwkJCQkJICBkd29yZCAmICgxIDw8IDApID8gIiBkZWludGVybGFjZXIsIiA6CisJCQkJCSAgIiIpOworCQkJCWR3b3JkID0gZGF0YVtpXTsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgInNhbXBsZXIgJWQgU1M0OiBib3JkZXIgY29sb3JcbiIsCisJCQkJCSAgc2FtcGxlcik7CisJCQl9CisJCX0KKwkJaWYgKGxlbiAhPSBpKSB7CisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAzRFNUQVRFX1NBTVBMRVJfU1RBVEVcbiIpOworCQl9CisJCXJldHVybiBsZW47CisJY2FzZSAweDg1OgorCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKworCQlpZiAobGVuICE9IDIpCisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfREVTVF9CVUZGRVJfVkFSSUFCTEVTXG4iKTsKKworCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJICAiM0RTVEFURV9ERVNUX0JVRkZFUl9WQVJJQUJMRVNcbiIpOworCisJCXN3aXRjaCAoKGRhdGFbMV0gPj4gOCkgJiAweGYpIHsKKwkJY2FzZSAweDA6CisJCQlmb3JtYXQgPSAiZzgiOworCQkJYnJlYWs7CisJCWNhc2UgMHgxOgorCQkJZm9ybWF0ID0gIngxcjVnNWI1IjsKKwkJCWJyZWFrOworCQljYXNlIDB4MjoKKwkJCWZvcm1hdCA9ICJyNWc2YjUiOworCQkJYnJlYWs7CisJCWNhc2UgMHgzOgorCQkJZm9ybWF0ID0gImE4cjhnOGI4IjsKKwkJCWJyZWFrOworCQljYXNlIDB4NDoKKwkJCWZvcm1hdCA9ICJ5Y3JjYl9zd2FweSI7CisJCQlicmVhazsKKwkJY2FzZSAweDU6CisJCQlmb3JtYXQgPSAieWNyY2Jfbm9ybWFsIjsKKwkJCWJyZWFrOworCQljYXNlIDB4NjoKKwkJCWZvcm1hdCA9ICJ5Y3JjYl9zd2FwdXYiOworCQkJYnJlYWs7CisJCWNhc2UgMHg3OgorCQkJZm9ybWF0ID0gInljcmNiX3N3YXB1dnkiOworCQkJYnJlYWs7CisJCWNhc2UgMHg4OgorCQkJZm9ybWF0ID0gImE0cjRnNGI0IjsKKwkJCWJyZWFrOworCQljYXNlIDB4OToKKwkJCWZvcm1hdCA9ICJhMXI1ZzViNSI7CisJCQlicmVhazsKKwkJY2FzZSAweGE6CisJCQlmb3JtYXQgPSAiYTJyMTBnMTBiMTAiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmb3JtYXQgPSAiQkFEIjsKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoKGRhdGFbMV0gPj4gMikgJiAweDMpIHsKKwkJY2FzZSAweDA6CisJCQl6Zm9ybWF0ID0gInUxNiI7CisJCQlicmVhazsKKwkJY2FzZSAweDE6CisJCQl6Zm9ybWF0ID0gImYxNiI7CisJCQlicmVhazsKKwkJY2FzZSAweDI6CisJCQl6Zm9ybWF0ID0gInUyNHg4IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJemZvcm1hdCA9ICJCQUQiOworCQkJYnJlYWs7CisJCX0KKwkJaW5zdHJfb3V0KGN0eCwgMSwKKwkJCSAgIiVzIGZvcm1hdCwgJXMgZGVwdGggZm9ybWF0LCBlYXJseSBaICVzYWJsZWRcbiIsCisJCQkgIGZvcm1hdCwgemZvcm1hdCwKKwkJCSAgKGRhdGFbMV0gJiAoMSA8PCAzMSkpID8gImVuIiA6ICJkaXMiKTsKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg4ZToKKwkJeworCQkJY29uc3QgY2hhciAqbmFtZSwgKnRpbGluZzsKKworCQkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMDBmKSArIDI7CisJCQlpZiAobGVuICE9IDMpCisJCQkJZnByaW50ZihvdXQsCisJCQkJCSJCYWQgY291bnQgaW4gM0RTVEFURV9CVUZGRVJfSU5GT1xuIik7CisKKwkJCXN3aXRjaCAoKGRhdGFbMV0gPj4gMjQpICYgMHg3KSB7CisJCQljYXNlIDB4MzoKKwkJCQluYW1lID0gImNvbG9yIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg3OgorCQkJCW5hbWUgPSAiZGVwdGgiOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQluYW1lID0gInVua25vd24iOworCQkJCWJyZWFrOworCQkJfQorCisJCQl0aWxpbmcgPSAibm9uZSI7CisJCQlpZiAoZGF0YVsxXSAmICgxIDw8IDIzKSkKKwkJCQl0aWxpbmcgPSAiZmVuY2VkIjsKKwkJCWVsc2UgaWYgKGRhdGFbMV0gJiAoMSA8PCAyMikpCisJCQkJdGlsaW5nID0gZGF0YVsxXSAmICgxIDw8IDIxKSA/ICJZIiA6ICJYIjsKKworCQkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfQlVGRkVSX0lORk9cbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMSwKKwkJCQkgICIlcywgdGlsaW5nID0gJXMsIHBpdGNoPSVkXG4iLCBuYW1lLCB0aWxpbmcsCisJCQkJICBkYXRhWzFdICYgMHhmZmZmKTsKKworCQkJaW5zdHJfb3V0KGN0eCwgMiwgImFkZHJlc3NcbiIpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCWNhc2UgMHg4MToKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMDBmKSArIDI7CisKKwkJaWYgKGxlbiAhPSAzKQorCQkJZnByaW50ZihvdXQsCisJCQkJIkJhZCBjb3VudCBpbiAzRFNUQVRFX1NDSVNTT1JfUkVDVEFOR0xFXG4iKTsKKworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9TQ0lTU09SX1JFQ1RBTkdMRVxuIik7CisJCWluc3RyX291dChjdHgsIDEsICIoJWQsJWQpXG4iLAorCQkJICBkYXRhWzFdICYgMHhmZmZmLCBkYXRhWzFdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgIiglZCwlZClcbiIsCisJCQkgIGRhdGFbMl0gJiAweGZmZmYsIGRhdGFbMl0gPj4gMTYpOworCisJCXJldHVybiBsZW47CisJY2FzZSAweDgwOgorCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKworCQlpZiAobGVuICE9IDUpCisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEVcbiIpOworCisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIiVzXG4iLAorCQkJICBkYXRhWzFdICYgKDEgPDwgMzApID8gImRlcHRoIG9mcyBkaXNhYmxlZCAiIDogIiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsyXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDMsICIoJWQsJWQpXG4iLAorCQkJICBkYXRhWzNdICYgMHhmZmZmLCBkYXRhWzNdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwgIiglZCwlZClcbiIsCisJCQkgIGRhdGFbNF0gJiAweGZmZmYsIGRhdGFbNF0gPj4gMTYpOworCisJCXJldHVybiBsZW47CisJY2FzZSAweDljOgorCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKworCQlpZiAobGVuICE9IDcpCisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAzRFNUQVRFX0NMRUFSX1BBUkFNRVRFUlNcbiIpOworCisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0NMRUFSX1BBUkFNRVRFUlNcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLCAicHJpbV90eXBlPSVzLCBjbGVhcj0lcyVzJXNcbiIsCisJCQkgIGRhdGFbMV0gJiAoMSA8PCAxNikgPyAiQ0xFQVJfUkVDVCIgOiAiWk9ORV9JTklUIiwKKwkJCSAgZGF0YVsxXSAmICgxIDw8IDIpID8gImNvbG9yLCIgOiAiIiwKKwkJCSAgZGF0YVsxXSAmICgxIDw8IDEpID8gImRlcHRoLCIgOiAiIiwKKwkJCSAgZGF0YVsxXSAmICgxIDw8IDApID8gInN0ZW5jaWwsIiA6ICIiKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImNsZWFyIGNvbG9yXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgImNsZWFyIGRlcHRoL3N0ZW5jaWxcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA0LCAiY29sb3IgdmFsdWUgKHJnYmE4ODg4KVxuIik7CisJCWluc3RyX291dChjdHgsIDUsICJkZXB0aCB2YWx1ZSAlZlxuIiwKKwkJCSAgaW50X2FzX2Zsb2F0KGRhdGFbNV0pKTsKKwkJaW5zdHJfb3V0KGN0eCwgNiwgImNsZWFyIHN0ZW5jaWxcbiIpOworCQlyZXR1cm4gbGVuOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShvcGNvZGVzXzNkXzFkKTsgaWR4KyspIHsKKwkJb3Bjb2RlXzNkXzFkID0gJm9wY29kZXNfM2RfMWRbaWR4XTsKKwkJaWYgKG9wY29kZV8zZF8xZC0+aTgzMF9vbmx5ICYmICFJU19HRU4yKGRldmlkKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoKGRhdGFbMF0gJiAweDAwZmYwMDAwKSA+PiAxNikgPT0gb3Bjb2RlXzNkXzFkLT5vcGNvZGUpIHsKKwkJCWxlbiA9IDE7CisKKwkJCWluc3RyX291dChjdHgsIDAsICIlc1xuIiwKKwkJCQkgIG9wY29kZV8zZF8xZC0+bmFtZSk7CisJCQlpZiAob3Bjb2RlXzNkXzFkLT5tYXhfbGVuID4gMSkgeworCQkJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwZmZmZikgKyAyOworCQkJCWlmIChsZW4gPCBvcGNvZGVfM2RfMWQtPm1pbl9sZW4gfHwKKwkJCQkgICAgbGVuID4gb3Bjb2RlXzNkXzFkLT5tYXhfbGVuKSB7CisJCQkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLAorCQkJCQkJb3Bjb2RlXzNkXzFkLT5uYW1lKTsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkJCWluc3RyX291dChjdHgsIGksICJkd29yZCAlZFxuIiwgaSk7CisJCQl9CisKKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0QgVU5LTk9XTjogM2RfMWQgb3Bjb2RlID0gMHgleFxuIiwKKwkJICBvcGNvZGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfM2RfcHJpbWl0aXZlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisJdWludDMyX3QgY291bnQgPSBjdHgtPmNvdW50OworCWNoYXIgaW1tZWRpYXRlID0gKGRhdGFbMF0gJiAoMSA8PCAyMykpID09IDA7CisJdW5zaWduZWQgaW50IGxlbiwgaSwgaiwgcmV0OworCWNvbnN0IGNoYXIgKnByaW10eXBlOworCWludCBvcmlnaW5hbF9zMiA9IHNhdmVkX3MyOworCWludCBvcmlnaW5hbF9zNCA9IHNhdmVkX3M0OworCisJc3dpdGNoICgoZGF0YVswXSA+PiAxOCkgJiAweGYpIHsKKwljYXNlIDB4MDoKKwkJcHJpbXR5cGUgPSAiVFJJTElTVCI7CisJCWJyZWFrOworCWNhc2UgMHgxOgorCQlwcmltdHlwZSA9ICJUUklTVFJJUCI7CisJCWJyZWFrOworCWNhc2UgMHgyOgorCQlwcmltdHlwZSA9ICJUUklTVFJJUF9SRVZFUlNFIjsKKwkJYnJlYWs7CisJY2FzZSAweDM6CisJCXByaW10eXBlID0gIlRSSUZBTiI7CisJCWJyZWFrOworCWNhc2UgMHg0OgorCQlwcmltdHlwZSA9ICJQT0xZR09OIjsKKwkJYnJlYWs7CisJY2FzZSAweDU6CisJCXByaW10eXBlID0gIkxJTkVMSVNUIjsKKwkJYnJlYWs7CisJY2FzZSAweDY6CisJCXByaW10eXBlID0gIkxJTkVTVFJJUCI7CisJCWJyZWFrOworCWNhc2UgMHg3OgorCQlwcmltdHlwZSA9ICJSRUNUTElTVCI7CisJCWJyZWFrOworCWNhc2UgMHg4OgorCQlwcmltdHlwZSA9ICJQT0lOVExJU1QiOworCQlicmVhazsKKwljYXNlIDB4OToKKwkJcHJpbXR5cGUgPSAiRElCIjsKKwkJYnJlYWs7CisJY2FzZSAweGE6CisJCXByaW10eXBlID0gIkNMRUFSX1JFQ1QiOworCQlzYXZlZF9zNCA9IDMgPDwgNjsKKwkJc2F2ZWRfczIgPSB+MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbXR5cGUgPSAidW5rbm93biI7CisJCWJyZWFrOworCX0KKworCS8qIFhYWDogM0RQUklNX0RJQiBub3Qgc3VwcG9ydGVkICovCisJaWYgKGltbWVkaWF0ZSkgeworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwM2ZmZmYpICsgMjsKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEUFJJTUlUSVZFIGlubGluZSAlc1xuIiwKKwkJCSAgcHJpbXR5cGUpOworCQlpZiAoY291bnQgPCBsZW4pCisJCQlCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAiM0RQUklNSVRJVkUgaW5saW5lIik7CisJCWlmICghc2F2ZWRfczJfc2V0IHx8ICFzYXZlZF9zNF9zZXQpIHsKKwkJCWZwcmludGYob3V0LCAidW5rbm93biB2ZXJ0ZXggZm9ybWF0XG4iKTsKKwkJCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCSAgIiAgICAgICAgICAgdmVydGV4IGRhdGEgKCVmIGZsb2F0KVxuIiwKKwkJCQkJICBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IHZlcnRleCA9IDA7CisJCQlmb3IgKGkgPSAxOyBpIDwgbGVuOykgeworCQkJCXVuc2lnbmVkIGludCB0YzsKKworI2RlZmluZSBWRVJURVhfT1VUKGZtdCwgLi4uKSBkbyB7CQkJCQlcCisgICAgaWYgKGkgPCBsZW4pCQkJCQkJCVwKKwlpbnN0cl9vdXQoY3R4LCBpLCAiIFYlZC4iZm10IlxuIiwgdmVydGV4LCBfX1ZBX0FSR1NfXyk7IFwKKyAgICBlbHNlCQkJCQkJCQlcCisJZnByaW50ZihvdXQsICIgbWlzc2luZyBkYXRhIGluIFYlZFxuIiwgdmVydGV4KTsJCQlcCisgICAgaSsrOwkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworCQkJCVZFUlRFWF9PVVQoIlggPSAlZiIsIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJVkVSVEVYX09VVCgiWSA9ICVmIiwgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJCQlzd2l0Y2ggKHNhdmVkX3M0ID4+IDYgJiAweDcpIHsKKwkJCQljYXNlIDB4MToKKwkJCQkJVkVSVEVYX09VVCgiWiA9ICVmIiwKKwkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgyOgorCQkJCQlWRVJURVhfT1VUKCJaID0gJWYiLAorCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJCQkJVkVSVEVYX09VVCgiVyA9ICVmIiwKKwkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgzOgorCQkJCQlicmVhazsKKwkJCQljYXNlIDB4NDoKKwkJCQkJVkVSVEVYX09VVCgiVyA9ICVmIiwKKwkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWZwcmludGYob3V0LCAiYmFkIFM0IHBvc2l0aW9uIG1hc2tcbiIpOworCQkJCX0KKworCQkJCWlmIChzYXZlZF9zNCAmICgxIDw8IDEwKSkgeworCQkJCQlWRVJURVhfT1VUCisJCQkJCSAgICAoImNvbG9yID0gKEE9MHglMDJ4LCBSPTB4JTAyeCwgRz0weCUwMngsICIKKwkJCQkJICAgICAiQj0weCUwMngpIiwgZGF0YVtpXSA+PiAyNCwKKwkJCQkJICAgICAoZGF0YVtpXSA+PiAxNikgJiAweGZmLAorCQkJCQkgICAgIChkYXRhW2ldID4+IDgpICYgMHhmZiwKKwkJCQkJICAgICBkYXRhW2ldICYgMHhmZik7CisJCQkJfQorCQkJCWlmIChzYXZlZF9zNCAmICgxIDw8IDExKSkgeworCQkJCQlWRVJURVhfT1VUCisJCQkJCSAgICAoInNwZWMgPSAoQT0weCUwMngsIFI9MHglMDJ4LCBHPTB4JTAyeCwgIgorCQkJCQkgICAgICJCPTB4JTAyeCkiLCBkYXRhW2ldID4+IDI0LAorCQkJCQkgICAgIChkYXRhW2ldID4+IDE2KSAmIDB4ZmYsCisJCQkJCSAgICAgKGRhdGFbaV0gPj4gOCkgJiAweGZmLAorCQkJCQkgICAgIGRhdGFbaV0gJiAweGZmKTsKKwkJCQl9CisJCQkJaWYgKHNhdmVkX3M0ICYgKDEgPDwgMTIpKQorCQkJCQlWRVJURVhfT1VUKCJ3aWR0aCA9IDB4JTA4eCkiLCBkYXRhW2ldKTsKKworCQkJCWZvciAodGMgPSAwOyB0YyA8PSA3OyB0YysrKSB7CisJCQkJCXN3aXRjaCAoKHNhdmVkX3MyID4+ICh0YyAqIDQpKSAmIDB4ZikgeworCQkJCQljYXNlIDB4MDoKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5YID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlWRVJURVhfT1VUKCJUJWQuWSA9ICVmIiwgdGMsCisJCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGEKKwkJCQkJCQkJCVtpXSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMHgxOgorCQkJCQkJVkVSVEVYX09VVCgiVCVkLlggPSAlZiIsIHRjLAorCQkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhCisJCQkJCQkJCQlbaV0pKTsKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5ZID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlWRVJURVhfT1VUKCJUJWQuWiA9ICVmIiwgdGMsCisJCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGEKKwkJCQkJCQkJCVtpXSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMHgyOgorCQkJCQkJVkVSVEVYX09VVCgiVCVkLlggPSAlZiIsIHRjLAorCQkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhCisJCQkJCQkJCQlbaV0pKTsKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5ZID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlWRVJURVhfT1VUKCJUJWQuWiA9ICVmIiwgdGMsCisJCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGEKKwkJCQkJCQkJCVtpXSkpOworCQkJCQkJVkVSVEVYX09VVCgiVCVkLlcgPSAlZiIsIHRjLAorCQkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhCisJCQkJCQkJCQlbaV0pKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDB4MzoKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5YID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAweDQ6CisJCQkJCQlWRVJURVhfT1VUCisJCQkJCQkgICAgKCJUJWQuWFkgPSAweCUwOHggaGFsZi1mbG9hdCIsCisJCQkJCQkgICAgIHRjLCBkYXRhW2ldKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDB4NToKKwkJCQkJCVZFUlRFWF9PVVQKKwkJCQkJCSAgICAoIlQlZC5YWSA9IDB4JTA4eCBoYWxmLWZsb2F0IiwKKwkJCQkJCSAgICAgdGMsIGRhdGFbaV0pOworCQkJCQkJVkVSVEVYX09VVAorCQkJCQkJICAgICgiVCVkLlpXID0gMHglMDh4IGhhbGYtZmxvYXQiLAorCQkJCQkJICAgICB0YywgZGF0YVtpXSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAweGY6CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWZwcmludGYob3V0LAorCQkJCQkJCSJiYWQgUzIuVCVkIGZvcm1hdFxuIiwKKwkJCQkJCQl0Yyk7CisJCQkJCX0KKwkJCQl9CisJCQkJdmVydGV4Kys7CisJCQl9CisJCX0KKworCQlyZXQgPSBsZW47CisJfSBlbHNlIHsKKwkJLyogaW5kaXJlY3QgdmVydGljZXMgKi8KKwkJbGVuID0gZGF0YVswXSAmIDB4MDAwMGZmZmY7CS8qIGluZGV4IGNvdW50ICovCisJCWlmIChkYXRhWzBdICYgKDEgPDwgMTcpKSB7CisJCQkvKiByYW5kb20gdmVydGV4IGFjY2VzcyAqLworCQkJaWYgKGNvdW50IDwgKGxlbiArIDEpIC8gMiArIDEpIHsKKwkJCQlCVUZGRVJfRkFJTChjb3VudCwgKGxlbiArIDEpIC8gMiArIDEsCisJCQkJCSAgICAiM0RQUklNSVRJVkUgcmFuZG9tIGluZGlyZWN0Iik7CisJCQl9CisJCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJCSAgIjNEUFJJTUlUSVZFIHJhbmRvbSBpbmRpcmVjdCAlcyAoJWQpXG4iLAorCQkJCSAgcHJpbXR5cGUsIGxlbik7CisJCQlpZiAobGVuID09IDApIHsKKwkJCQkvKiB2ZXJ0ZXggaW5kaWNlcyBjb250aW51ZSB1bnRpbCAweGZmZmYgaXMKKwkJCQkgKiBmb3VuZAorCQkJCSAqLworCQkJCWZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCWlmICgoZGF0YVtpXSAmIDB4ZmZmZikgPT0gMHhmZmZmKSB7CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIiAgICBpbmRpY2VzOiAodGVybWluYXRvcilcbiIpOworCQkJCQkJcmV0ID0gaTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9IGVsc2UgaWYgKChkYXRhW2ldID4+IDE2KSA9PSAweGZmZmYpIHsKKwkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJICAiICAgIGluZGljZXM6IDB4JTA0eCwgKHRlcm1pbmF0b3IpXG4iLAorCQkJCQkJCSAgZGF0YVtpXSAmIDB4ZmZmZik7CisJCQkJCQlyZXQgPSBpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIiAgICBpbmRpY2VzOiAweCUwNHgsIDB4JTA0eFxuIiwKKwkJCQkJCQkgIGRhdGFbaV0gJiAweGZmZmYsCisJCQkJCQkJICBkYXRhW2ldID4+IDE2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmcHJpbnRmKG91dCwKKwkJCQkJIjNEUFJJTUlUSVZFOiBubyB0ZXJtaW5hdG9yIGZvdW5kIGluIGluZGV4IGJ1ZmZlclxuIik7CisJCQkJcmV0ID0gY291bnQ7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCS8qIGZpeGVkIHNpemUgdmVydGV4IGluZGV4IGJ1ZmZlciAqLworCQkJCWZvciAoaiA9IDEsIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIsIGorKykgeworCQkJCQlpZiAoaSAqIDIgPT0gbGVuIC0gMSkgeworCQkJCQkJaW5zdHJfb3V0KGN0eCwgaiwKKwkJCQkJCQkgICIgICAgaW5kaWNlczogMHglMDR4XG4iLAorCQkJCQkJCSAgZGF0YVtqXSAmIDB4ZmZmZik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBqLAorCQkJCQkJCSAgIiAgICBpbmRpY2VzOiAweCUwNHgsIDB4JTA0eFxuIiwKKwkJCQkJCQkgIGRhdGFbal0gJiAweGZmZmYsCisJCQkJCQkJICBkYXRhW2pdID4+IDE2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldCA9IChsZW4gKyAxKSAvIDIgKyAxOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQkvKiBzZXF1ZW50aWFsIHZlcnRleCBhY2Nlc3MgKi8KKwkJCWluc3RyX291dChjdHgsIDAsCisJCQkJICAiM0RQUklNSVRJVkUgc2VxdWVudGlhbCBpbmRpcmVjdCAlcywgJWQgc3RhcnRpbmcgZnJvbSAiCisJCQkJICAiJWRcbiIsIHByaW10eXBlLCBsZW4sIGRhdGFbMV0gJiAweGZmZmYpOworCQkJaW5zdHJfb3V0KGN0eCwgMSwgIiAgICAgICAgICAgc3RhcnRcbiIpOworCQkJcmV0ID0gMjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJc2F2ZWRfczIgPSBvcmlnaW5hbF9zMjsKKwlzYXZlZF9zNCA9IG9yaWdpbmFsX3M0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV8zZChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXVpbnQzMl90IG9wY29kZTsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVpbnQzMl90ICpkYXRhID0gY3R4LT5kYXRhOworCisJc3RydWN0IHsKKwkJdWludDMyX3Qgb3Bjb2RlOworCQl1bnNpZ25lZCBpbnQgbWluX2xlbjsKKwkJdW5zaWduZWQgaW50IG1heF9sZW47CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJfSBvcGNvZGVzXzNkW10gPSB7CisJCXsgMHgwNiwgMSwgMSwgIjNEU1RBVEVfQU5USV9BTElBU0lORyIgfSwKKwkJeyAweDA4LCAxLCAxLCAiM0RTVEFURV9CQUNLRkFDRV9TVEVOQ0lMX09QUyIgfSwKKwkJeyAweDA5LCAxLCAxLCAiM0RTVEFURV9CQUNLRkFDRV9TVEVOQ0lMX01BU0tTIiB9LAorCQl7IDB4MTYsIDEsIDEsICIzRFNUQVRFX0NPT1JEX1NFVF9CSU5ESU5HUyIgfSwKKwkJeyAweDE1LCAxLCAxLCAiM0RTVEFURV9GT0dfQ09MT1IiIH0sCisJCXsgMHgwYiwgMSwgMSwgIjNEU1RBVEVfSU5ERVBFTkRFTlRfQUxQSEFfQkxFTkQiIH0sCisJCXsgMHgwZCwgMSwgMSwgIjNEU1RBVEVfTU9ERVNfNCIgfSwKKwkJeyAweDBjLCAxLCAxLCAiM0RTVEFURV9NT0RFU181IiB9LAorCQl7IDB4MDcsIDEsIDEsICIzRFNUQVRFX1JBU1RFUklaQVRJT05fUlVMRVMifSwKKwl9LCAqb3Bjb2RlXzNkOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweDFmMDAwMDAwKSA+PiAyNDsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSAweDFmOgorCQlyZXR1cm4gZGVjb2RlXzNkX3ByaW1pdGl2ZShjdHgpOworCWNhc2UgMHgxZDoKKwkJcmV0dXJuIGRlY29kZV8zZF8xZChjdHgpOworCWNhc2UgMHgxYzoKKwkJcmV0dXJuIGRlY29kZV8zZF8xYyhjdHgpOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShvcGNvZGVzXzNkKTsgaWR4KyspIHsKKwkJb3Bjb2RlXzNkID0gJm9wY29kZXNfM2RbaWR4XTsKKwkJaWYgKG9wY29kZSA9PSBvcGNvZGVfM2QtPm9wY29kZSkgeworCQkJdW5zaWduZWQgaW50IGxlbiA9IDEsIGk7CisKKwkJCWluc3RyX291dChjdHgsIDAsICIlc1xuIiwgb3Bjb2RlXzNkLT5uYW1lKTsKKwkJCWlmIChvcGNvZGVfM2QtPm1heF9sZW4gPiAxKSB7CisJCQkJbGVuID0gKGRhdGFbMF0gJiAweGZmKSArIDI7CisJCQkJaWYgKGxlbiA8IG9wY29kZV8zZC0+bWluX2xlbiB8fAorCQkJCSAgICBsZW4gPiBvcGNvZGVfM2QtPm1heF9sZW4pIHsKKwkJCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gJXNcbiIsCisJCQkJCQlvcGNvZGVfM2QtPm5hbWUpOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaW5zdHJfb3V0KGN0eCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkJCX0KKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0QgVU5LTk9XTjogM2Qgb3Bjb2RlID0gMHgleFxuIiwgb3Bjb2RlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF85NjVfc3VyZmFjZXR5cGUodW5zaWduZWQgaW50IHN1cmZhY2V0eXBlKQoreworCXN3aXRjaCAoc3VyZmFjZXR5cGUpIHsKKwljYXNlIDA6CisJCXJldHVybiAiMUQiOworCWNhc2UgMToKKwkJcmV0dXJuICIyRCI7CisJY2FzZSAyOgorCQlyZXR1cm4gIjNEIjsKKwljYXNlIDM6CisJCXJldHVybiAiQ1VCRSI7CisJY2FzZSA0OgorCQlyZXR1cm4gIkJVRkZFUiI7CisJY2FzZSA3OgorCQlyZXR1cm4gIk5VTEwiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0Xzk2NV9kZXB0aGZvcm1hdCh1bnNpZ25lZCBpbnQgZGVwdGhmb3JtYXQpCit7CisJc3dpdGNoIChkZXB0aGZvcm1hdCkgeworCWNhc2UgMDoKKwkJcmV0dXJuICJzOF96MjRmbG9hdCI7CisJY2FzZSAxOgorCQlyZXR1cm4gInozMmZsb2F0IjsKKwljYXNlIDI6CisJCXJldHVybiAiejI0czgiOworCWNhc2UgNToKKwkJcmV0dXJuICJ6MTYiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0Xzk2NV9lbGVtZW50X2NvbXBvbmVudCh1aW50MzJfdCBkYXRhLCBpbnQgY29tcG9uZW50KQoreworCXVpbnQzMl90IGNvbXBvbmVudF9jb250cm9sID0gKGRhdGEgPj4gKDE2ICsgKDMgLSBjb21wb25lbnQpICogNCkpICYgMHg3OworCisJc3dpdGNoIChjb21wb25lbnRfY29udHJvbCkgeworCWNhc2UgMDoKKwkJcmV0dXJuICJub3N0b3JlIjsKKwljYXNlIDE6CisJCXN3aXRjaCAoY29tcG9uZW50KSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAiWCI7CisJCWNhc2UgMToKKwkJCXJldHVybiAiWSI7CisJCWNhc2UgMjoKKwkJCXJldHVybiAiWiI7CisJCWNhc2UgMzoKKwkJCXJldHVybiAiVyI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gImZhaWwiOworCQl9CisJY2FzZSAyOgorCQlyZXR1cm4gIjAuMCI7CisJY2FzZSAzOgorCQlyZXR1cm4gIjEuMCI7CisJY2FzZSA0OgorCQlyZXR1cm4gIjB4MSI7CisJY2FzZSA1OgorCQlyZXR1cm4gIlZJRCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJmYWlsIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfOTY1X3ByaW1fdHlwZSh1aW50MzJfdCBwcmltdHlwZSkKK3sKKwlzd2l0Y2ggKHByaW10eXBlKSB7CisJY2FzZSAweDAxOgorCQlyZXR1cm4gInBvaW50IGxpc3QiOworCWNhc2UgMHgwMjoKKwkJcmV0dXJuICJsaW5lIGxpc3QiOworCWNhc2UgMHgwMzoKKwkJcmV0dXJuICJsaW5lIHN0cmlwIjsKKwljYXNlIDB4MDQ6CisJCXJldHVybiAidHJpIGxpc3QiOworCWNhc2UgMHgwNToKKwkJcmV0dXJuICJ0cmkgc3RyaXAiOworCWNhc2UgMHgwNjoKKwkJcmV0dXJuICJ0cmkgZmFuIjsKKwljYXNlIDB4MDc6CisJCXJldHVybiAicXVhZCBsaXN0IjsKKwljYXNlIDB4MDg6CisJCXJldHVybiAicXVhZCBzdHJpcCI7CisJY2FzZSAweDA5OgorCQlyZXR1cm4gImxpbmUgbGlzdCBhZGoiOworCWNhc2UgMHgwYToKKwkJcmV0dXJuICJsaW5lIHN0cmlwIGFkaiI7CisJY2FzZSAweDBiOgorCQlyZXR1cm4gInRyaSBsaXN0IGFkaiI7CisJY2FzZSAweDBjOgorCQlyZXR1cm4gInRyaSBzdHJpcCBhZGoiOworCWNhc2UgMHgwZDoKKwkJcmV0dXJuICJ0cmkgc3RyaXAgcmV2ZXJzZSI7CisJY2FzZSAweDBlOgorCQlyZXR1cm4gInBvbHlnb24iOworCWNhc2UgMHgwZjoKKwkJcmV0dXJuICJyZWN0IGxpc3QiOworCWNhc2UgMHgxMDoKKwkJcmV0dXJuICJsaW5lIGxvb3AiOworCWNhc2UgMHgxMToKKwkJcmV0dXJuICJwb2ludCBsaXN0IGJmIjsKKwljYXNlIDB4MTI6CisJCXJldHVybiAibGluZSBzdHJpcCBjb250IjsKKwljYXNlIDB4MTM6CisJCXJldHVybiAibGluZSBzdHJpcCBiZiI7CisJY2FzZSAweDE0OgorCQlyZXR1cm4gImxpbmUgc3RyaXAgY29udCBiZiI7CisJY2FzZSAweDE1OgorCQlyZXR1cm4gInRyaSBmYW4gbm8gc3RpcHBsZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJmYWlsIjsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2k5NjVfZGVjb2RlX3VyYl9mZW5jZShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCBpbnQgbGVuKQoreworCXVpbnQzMl90IHZzX2ZlbmNlLCBjbGlwX2ZlbmNlLCBnc19mZW5jZSwgc2ZfZmVuY2UsIHZmZV9mZW5jZSwgY3NfZmVuY2U7CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisKKwlpZiAobGVuICE9IDMpCisJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFVSQl9GRU5DRVxuIik7CisKKwl2c19mZW5jZSA9IGRhdGFbMV0gJiAweDNmZjsKKwlnc19mZW5jZSA9IChkYXRhWzFdID4+IDEwKSAmIDB4M2ZmOworCWNsaXBfZmVuY2UgPSAoZGF0YVsxXSA+PiAyMCkgJiAweDNmZjsKKwlzZl9mZW5jZSA9IGRhdGFbMl0gJiAweDNmZjsKKwl2ZmVfZmVuY2UgPSAoZGF0YVsyXSA+PiAxMCkgJiAweDNmZjsKKwljc19mZW5jZSA9IChkYXRhWzJdID4+IDIwKSAmIDB4N2ZmOworCisJaW5zdHJfb3V0KGN0eCwgMCwgIlVSQl9GRU5DRTogJXMlcyVzJXMlcyVzXG4iLAorCQkgIChkYXRhWzBdID4+IDEzKSAmIDEgPyAiY3MgIiA6ICIiLAorCQkgIChkYXRhWzBdID4+IDEyKSAmIDEgPyAidmZlICIgOiAiIiwKKwkJICAoZGF0YVswXSA+PiAxMSkgJiAxID8gInNmICIgOiAiIiwKKwkJICAoZGF0YVswXSA+PiAxMCkgJiAxID8gImNsaXAgIiA6ICIiLAorCQkgIChkYXRhWzBdID4+IDkpICYgMSA/ICJncyAiIDogIiIsCisJCSAgKGRhdGFbMF0gPj4gOCkgJiAxID8gInZzICIgOiAiIik7CisJaW5zdHJfb3V0KGN0eCwgMSwKKwkJICAidnMgZmVuY2U6ICVkLCBjbGlwX2ZlbmNlOiAlZCwgZ3NfZmVuY2U6ICVkXG4iLAorCQkgIHZzX2ZlbmNlLCBjbGlwX2ZlbmNlLCBnc19mZW5jZSk7CisJaW5zdHJfb3V0KGN0eCwgMiwKKwkJICAic2YgZmVuY2U6ICVkLCB2ZmVfZmVuY2U6ICVkLCBjc19mZW5jZTogJWRcbiIsCisJCSAgc2ZfZmVuY2UsIHZmZV9mZW5jZSwgY3NfZmVuY2UpOworCWlmIChnc19mZW5jZSA8IHZzX2ZlbmNlKQorCQlmcHJpbnRmKG91dCwgImdzIGZlbmNlIDwgdnMgZmVuY2UhXG4iKTsKKwlpZiAoY2xpcF9mZW5jZSA8IGdzX2ZlbmNlKQorCQlmcHJpbnRmKG91dCwgImNsaXAgZmVuY2UgPCBncyBmZW5jZSFcbiIpOworCWlmIChzZl9mZW5jZSA8IGNsaXBfZmVuY2UpCisJCWZwcmludGYob3V0LCAic2YgZmVuY2UgPCBjbGlwIGZlbmNlIVxuIik7CisJaWYgKGNzX2ZlbmNlIDwgc2ZfZmVuY2UpCisJCWZwcmludGYob3V0LCAiY3MgZmVuY2UgPCBzZiBmZW5jZSFcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQKK3N0YXRlX2Jhc2Vfb3V0KHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIHVuc2lnbmVkIGludCBpbmRleCwKKwkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY3R4LT5kYXRhW2luZGV4XSAmIDEpIHsKKwkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsCisJCQkgICIlcyBzdGF0ZSBiYXNlIGFkZHJlc3MgMHglMDh4XG4iLCBuYW1lLAorCQkJICBjdHgtPmRhdGFbaW5kZXhdICYgfjEpOworCX0gZWxzZSB7CisJCWluc3RyX291dChjdHgsIGluZGV4LCAiJXMgc3RhdGUgYmFzZSBub3QgdXBkYXRlZFxuIiwKKwkJCSAgbmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc3RhdGVfbWF4X291dChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY3R4LT5kYXRhW2luZGV4XSAmIDEpIHsKKwkJaWYgKGN0eC0+ZGF0YVtpbmRleF0gPT0gMSkgeworCQkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsCisJCQkJICAiJXMgc3RhdGUgdXBwZXIgYm91bmQgZGlzYWJsZWRcbiIsIG5hbWUpOworCQl9IGVsc2UgeworCQkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsCisJCQkJICAiJXMgc3RhdGUgdXBwZXIgYm91bmQgMHglMDh4XG4iLCBuYW1lLAorCQkJCSAgY3R4LT5kYXRhW2luZGV4XSAmIH4xKTsKKwkJfQorCX0gZWxzZSB7CisJCWluc3RyX291dChjdHgsIGluZGV4LAorCQkJICAiJXMgc3RhdGUgdXBwZXIgYm91bmQgbm90IHVwZGF0ZWRcbiIsIG5hbWUpOworCX0KK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX0NDKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlNfQ0NcbiIpOworCWluc3RyX291dChjdHgsIDEsICJwb2ludGVyIHRvIENDIHZpZXdwb3J0XG4iKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlNfU0ZfQ0xJUChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX1NGX0NMSVBcbiIpOworCWluc3RyX291dChjdHgsIDEsICJwb2ludGVyIHRvIFNGX0NMSVAgdmlld3BvcnRcbiIpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9CTEVORF9TVEFURV9QT0lOVEVSUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0JMRU5EX1NUQVRFX1BPSU5URVJTXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAicG9pbnRlciB0byBCTEVORF9TVEFURSBhdCAweCUwOHggKCVzKVxuIiwKKwkJICBjdHgtPmRhdGFbMV0gJiB+MSwKKwkJICAoY3R4LT5kYXRhWzFdICYgMSkgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIik7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX0RFUFRIX1NURU5DSUxfU1RBVEVfUE9JTlRFUlMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9ERVBUSF9TVEVOQ0lMX1NUQVRFX1BPSU5URVJTXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLAorCQkgICJwb2ludGVyIHRvIERFUFRIX1NURU5DSUxfU1RBVEUgYXQgMHglMDh4ICglcylcbiIsCisJCSAgY3R4LT5kYXRhWzFdICYgfjEsCisJCSAgKGN0eC0+ZGF0YVsxXSAmIDEpID8gImNoYW5nZWQiIDogInVuY2hhbmdlZCIpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUihzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAicGl0Y2ggJWRiXG4iLAorCQkgIChjdHgtPmRhdGFbMV0gJiAweDFmZmZmKSArIDEpOworCWluc3RyX291dChjdHgsIDIsICJwb2ludGVyIHRvIEhpWiBidWZmZXJcbiIpOworCisJcmV0dXJuIDM7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjZfM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAiYmxlbmQgY2hhbmdlICVkXG4iLCBjdHgtPmRhdGFbMV0gJiAxKTsKKwlpbnN0cl9vdXQoY3R4LCAyLCAiZGVwdGggc3RlbmNpbCBjaGFuZ2UgJWRcbiIsCisJCSAgY3R4LT5kYXRhWzJdICYgMSk7CisJaW5zdHJfb3V0KGN0eCwgMywgImNjIGNoYW5nZSAlZFxuIiwgY3R4LT5kYXRhWzNdICYgMSk7CisKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfQ0NfU1RBVEVfUE9JTlRFUlNcbiIpOworCWluc3RyX291dChjdHgsIDEsICJwb2ludGVyIHRvIENPTE9SX0NBTENfU1RBVEUgYXQgMHglMDh4ICIKKwkJICAiKCVzKVxuIiwKKwkJICBjdHgtPmRhdGFbMV0gJiB+MSwKKwkJICAoY3R4LT5kYXRhWzFdICYgMSkgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIik7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX1VSQl91bml0KHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIGNvbnN0IGNoYXIgKnVuaXQpCit7CisgICAgaW50IHN0YXJ0X2tiID0gKChjdHgtPmRhdGFbMV0gPj4gMjUpICYgMHgzZikgKiA4OworICAgIC8qIHRoZSBmaWVsZCBpcyAjIG9mIDUxMi1iaXQgcm93cyAtIDEsIHdlIHByaW50IGJ5dGVzICovCisgICAgaW50IGVudHJ5X3NpemUgPSAoKChjdHgtPmRhdGFbMV0gPj4gMTYpICYgMHgxZmYpICsgMSk7CisgICAgaW50IG5yX2VudHJpZXMgPSBjdHgtPmRhdGFbMV0gJiAweGZmZmY7CisKKyAgICBpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9VUkJfJXNcbiIsIHVuaXQpOworICAgIGluc3RyX291dChjdHgsIDEsCisJICAgICAgIiVkS0Igc3RhcnQsIHNpemU9JWQgNjRCIHJvd3MsIG5yX2VudHJpZXM9JWQsIHRvdGFsIHNpemUgJWRCXG4iLAorCSAgICAgIHN0YXJ0X2tiLCBlbnRyeV9zaXplLCBucl9lbnRyaWVzLCBucl9lbnRyaWVzICogNjQgKiBlbnRyeV9zaXplKTsKKworICAgIHJldHVybiAyOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX1ZTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJWUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX0hTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJIUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX0RTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJEUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX0dTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJHUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfQ09OU1RBTlQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwgY29uc3QgY2hhciAqdW5pdCkKK3sKKwlpbnQgcmxlbls0XTsKKworCXJsZW5bMF0gPSAoY3R4LT5kYXRhWzFdID4+IDApICYgMHhmZmZmOworCXJsZW5bMV0gPSAoY3R4LT5kYXRhWzFdID4+IDE2KSAmIDB4ZmZmZjsKKwlybGVuWzJdID0gKGN0eC0+ZGF0YVsyXSA+PiAwKSAmIDB4ZmZmZjsKKwlybGVuWzNdID0gKGN0eC0+ZGF0YVsyXSA+PiAxNikgJiAweGZmZmY7CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9DT05TVEFOVF8lc1xuIiwgdW5pdCk7CisJaW5zdHJfb3V0KGN0eCwgMSwgImxlbiAwID0gJWQsIGxlbiAxID0gJWRcbiIsIHJsZW5bMF0sIHJsZW5bMV0pOworCWluc3RyX291dChjdHgsIDIsICJsZW4gMiA9ICVkLCBsZW4gMyA9ICVkXG4iLCBybGVuWzJdLCBybGVuWzNdKTsKKwlpbnN0cl9vdXQoY3R4LCAzLCAicG9pbnRlciB0byBjb25zdGJ1ZiAwXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA0LCAicG9pbnRlciB0byBjb25zdGJ1ZiAxXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA1LCAicG9pbnRlciB0byBjb25zdGJ1ZiAyXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA2LCAicG9pbnRlciB0byBjb25zdGJ1ZiAzXG4iKTsKKworCXJldHVybiA3OworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfQ09OU1RBTlRfVlMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlyZXR1cm4gZ2VuN18zRFNUQVRFX0NPTlNUQU5UKGN0eCwgIlZTIik7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9DT05TVEFOVF9HUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXJldHVybiBnZW43XzNEU1RBVEVfQ09OU1RBTlQoY3R4LCAiR1MiKTsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX0NPTlNUQU5UX1BTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9DT05TVEFOVChjdHgsICJQUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfQ09OU1RBTlRfRFMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlyZXR1cm4gZ2VuN18zRFNUQVRFX0NPTlNUQU5UKGN0eCwgIkRTIik7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9DT05TVEFOVF9IUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXJldHVybiBnZW43XzNEU1RBVEVfQ09OU1RBTlQoY3R4LCAiSFMiKTsKK30KKworCitzdGF0aWMgaW50CitnZW42XzNEU1RBVEVfV00oc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9XTVxuIik7CisJaW5zdHJfb3V0KGN0eCwgMSwgImtlcm5lbCBzdGFydCBwb2ludGVyIDBcbiIpOworCWluc3RyX291dChjdHgsIDIsCisJCSAgIlNQRj0lZCwgVk1FPSVkLCBTYW1wbGVyIENvdW50ICVkLCAiCisJCSAgIkJpbmRpbmcgdGFibGUgY291bnQgJWRcbiIsCisJCSAgKGN0eC0+ZGF0YVsyXSA+PiAzMSkgJiAxLAorCQkgIChjdHgtPmRhdGFbMl0gPj4gMzApICYgMSwKKwkJICAoY3R4LT5kYXRhWzJdID4+IDI3KSAmIDcsCisJCSAgKGN0eC0+ZGF0YVsyXSA+PiAxOCkgJiAweGZmKTsKKwlpbnN0cl9vdXQoY3R4LCAzLCAic2NyYXRjaCBvZmZzZXRcbiIpOworCWluc3RyX291dChjdHgsIDQsCisJCSAgIkRlcHRoIENsZWFyICVkLCBEZXB0aCBSZXNvbHZlICVkLCBIaVogUmVzb2x2ZSAlZCwgIgorCQkgICJEaXNwYXRjaCBHUkYgc3RhcnRbMF0gJWQsIHN0YXJ0WzFdICVkLCBzdGFydFsyXSAlZFxuIiwKKwkJICAoY3R4LT5kYXRhWzRdICYgKDEgPDwgMzApKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNF0gJiAoMSA8PCAyOCkpICE9IDAsCisJCSAgKGN0eC0+ZGF0YVs0XSAmICgxIDw8IDI3KSkgIT0gMCwKKwkJICAoY3R4LT5kYXRhWzRdID4+IDE2KSAmIDB4N2YsCisJCSAgKGN0eC0+ZGF0YVs0XSA+PiA4KSAmIDB4N2YsCisJCSAgKGN0eC0+ZGF0YVs0XSAmIDB4N2YpKTsKKwlpbnN0cl9vdXQoY3R4LCA1LAorCQkgICJNYXhUaHJlYWRzICVkLCBQUyBLaWxsUGl4ZWwgJWQsIFBTIGNvbXB1dGVkIFogJWQsICIKKwkJICAiUFMgdXNlIHNvdXJjZVogJWQsIFRocmVhZCBEaXNwYXRjaCAlZCwgUFMgdXNlIHNvdXJjZVcgJWQsICIKKwkJICAiRGlzcGF0Y2gzMiAlZCwgRGlzcGF0Y2gxNiAlZCwgRGlzcGF0Y2g4ICVkXG4iLAorCQkgICgoY3R4LT5kYXRhWzVdID4+IDI1KSAmIDB4N2YpICsgMSwKKwkJICAoY3R4LT5kYXRhWzVdICYgKDEgPDwgMjIpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNV0gJiAoMSA8PCAyMSkpICE9IDAsCisJCSAgKGN0eC0+ZGF0YVs1XSAmICgxIDw8IDIwKSkgIT0gMCwKKwkJICAoY3R4LT5kYXRhWzVdICYgKDEgPDwgMTkpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNV0gJiAoMSA8PCA4KSkgIT0gMCwKKwkJICAoY3R4LT5kYXRhWzVdICYgKDEgPDwgMikpICE9IDAsCisJCSAgKGN0eC0+ZGF0YVs1XSAmICgxIDw8IDEpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNV0gJiAoMSA8PCAwKSkgIT0gMCk7CisJaW5zdHJfb3V0KGN0eCwgNiwKKwkJICAiTnVtIFNGIG91dHB1dCAlZCwgUG9zIFhZIG9mZnNldCAlZCwgWlcgaW50ZXJwIG1vZGUgJWQgLCAiCisJCSAgIkJhcnljZW50cmljIGludGVycCBtb2RlIDB4JXgsIFBvaW50IHJhc3RlciBydWxlICVkLCAiCisJCSAgIk11bHRpc2FtcGxlIG1vZGUgJWQsICIKKwkJICAiTXVsdGlzYW1wbGUgRGlzcGF0Y2ggbW9kZSAlZFxuIiwKKwkJICAoY3R4LT5kYXRhWzZdID4+IDIwKSAmIDB4M2YsCisJCSAgKGN0eC0+ZGF0YVs2XSA+PiAxOCkgJiAzLAorCQkgIChjdHgtPmRhdGFbNl0gPj4gMTYpICYgMywKKwkJICAoY3R4LT5kYXRhWzZdID4+IDEwKSAmIDB4M2YsCisJCSAgKGN0eC0+ZGF0YVs2XSAmICgxIDw8IDkpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNl0gPj4gMSkgJiAzLAorCQkgIChjdHgtPmRhdGFbNl0gJiAxKSk7CisJaW5zdHJfb3V0KGN0eCwgNywgImtlcm5lbCBzdGFydCBwb2ludGVyIDFcbiIpOworCWluc3RyX291dChjdHgsIDgsICJrZXJuZWwgc3RhcnQgcG9pbnRlciAyXG4iKTsKKworCXJldHVybiA5OworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfV00oc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwljb25zdCBjaGFyICpjb21wdXRlZF9kZXB0aCA9ICIiOworCWNvbnN0IGNoYXIgKmVhcmx5X2RlcHRoID0gIiI7CisJY29uc3QgY2hhciAqendfaW50ZXJwID0gIiI7CisKKwlzd2l0Y2ggKChjdHgtPmRhdGFbMV0gPj4gMjMpICYgMHgzKSB7CisJY2FzZSAwOgorCQljb21wdXRlZF9kZXB0aCA9ICIiOworCQlicmVhazsKKwljYXNlIDE6CisJCWNvbXB1dGVkX2RlcHRoID0gImNvbXB1dGVkIGRlcHRoIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljb21wdXRlZF9kZXB0aCA9ICJjb21wdXRlZCBkZXB0aCA+PSI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY29tcHV0ZWRfZGVwdGggPSAiY29tcHV0ZWQgZGVwdGggPD0iOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKChjdHgtPmRhdGFbMV0gPj4gMjEpICYgMHgzKSB7CisJY2FzZSAwOgorCQllYXJseV9kZXB0aCA9ICIiOworCQlicmVhazsKKwljYXNlIDE6CisJCWVhcmx5X2RlcHRoID0gIiwgRURTQ19QU0VYRUMiOworCQlicmVhazsKKwljYXNlIDI6CisJCWVhcmx5X2RlcHRoID0gIiwgRURTQ19QUkVQUyI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZWFybHlfZGVwdGggPSAiLCBCQUQgRURTQyI7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoKGN0eC0+ZGF0YVsxXSA+PiAxNykgJiAweDMpIHsKKwljYXNlIDA6CisJCWVhcmx5X2RlcHRoID0gIiI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZWFybHlfZGVwdGggPSAiLCBCQUQgWlcgaW50ZXJwIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQllYXJseV9kZXB0aCA9ICIsIFpXIGNlbnRyb2lkIjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllYXJseV9kZXB0aCA9ICIsIFpXIHNhbXBsZSI7CisJCWJyZWFrOworCX0KKworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1dNXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAiKCVzJXMlcyVzJXMlcyklcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAxMSkpID8gIlBQICIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMTIpKSA/ICJQQyAiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDEzKSkgPyAiUFMgIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAxNCkpID8gIk5QUCAiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDE1KSkgPyAiTlBDICIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMTYpKSA/ICJOUFMgIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAzMCkpID8gIiwgZGVwdGggY2xlYXIiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDI5KSkgPyAiIiA6ICIsIGRpc2FibGVkIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMjgpKSA/ICIsIGRlcHRoIHJlc29sdmUiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDI3KSkgPyAiLCBoaXogcmVzb2x2ZSIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMjUpKSA/ICIsIGtpbGwiIDogIiIsCisJCSAgY29tcHV0ZWRfZGVwdGgsCisJCSAgZWFybHlfZGVwdGgsCisJCSAgendfaW50ZXJwLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAyMCkpID8gIiwgc291cmNlIGRlcHRoIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAxOSkpID8gIiwgc291cmNlIFciIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDEwKSkgPyAiLCBjb3ZlcmFnZSIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgNCkpID8gIiwgcG9seSBzdGlwcGxlIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAzKSkgPyAiLCBsaW5lIHN0aXBwbGUiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDIpKSA/ICIsIHBvaW50IFVMIiA6ICIsIHBvaW50IFVSIgorCQkgICk7CisJaW5zdHJfb3V0KGN0eCwgMiwgIk1TXG4iKTsKKworCXJldHVybiAzOworfQorCitzdGF0aWMgaW50CitnZW40XzNEUFJJTUlUSVZFKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJaW5zdHJfb3V0KGN0eCwgMCwKKwkJICAiM0RQUklNSVRJVkU6ICVzICVzXG4iLAorCQkgIGdldF85NjVfcHJpbV90eXBlKChjdHgtPmRhdGFbMF0gPj4gMTApICYgMHgxZiksCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDE1KSkgPyAicmFuZG9tIiA6ICJzZXF1ZW50aWFsIik7CisJaW5zdHJfb3V0KGN0eCwgMSwgInZlcnRleCBjb3VudFxuIik7CisJaW5zdHJfb3V0KGN0eCwgMiwgInN0YXJ0IHZlcnRleFxuIik7CisJaW5zdHJfb3V0KGN0eCwgMywgImluc3RhbmNlIGNvdW50XG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA0LCAic3RhcnQgaW5zdGFuY2VcbiIpOworCWluc3RyX291dChjdHgsIDUsICJpbmRleCBiaWFzXG4iKTsKKworCXJldHVybiA2OworfQorCitzdGF0aWMgaW50CitnZW43XzNEUFJJTUlUSVZFKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJYm9vbCBpbmRpcmVjdCA9ICEhKGN0eC0+ZGF0YVswXSAmICgxIDw8IDEwKSk7CisKKwlpbnN0cl9vdXQoY3R4LCAwLAorCQkgICIzRFBSSU1JVElWRTogJXMlc1xuIiwKKwkJICBpbmRpcmVjdCA/ICIgaW5kaXJlY3QiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDgpKSA/ICIgcHJlZGljYXRlZCIgOiAiIik7CisJaW5zdHJfb3V0KGN0eCwgMSwgIiVzICVzXG4iLAorCQkgIGdldF85NjVfcHJpbV90eXBlKGN0eC0+ZGF0YVsxXSAmIDB4M2YpLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCA4KSkgPyAicmFuZG9tIiA6ICJzZXF1ZW50aWFsIik7CisJaW5zdHJfb3V0KGN0eCwgMiwgaW5kaXJlY3QgPyAiaWdub3JlZCIgOiAidmVydGV4IGNvdW50XG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAzLCBpbmRpcmVjdCA/ICJpZ25vcmVkIiA6ICJzdGFydCB2ZXJ0ZXhcbiIpOworCWluc3RyX291dChjdHgsIDQsIGluZGlyZWN0ID8gImlnbm9yZWQiIDogImluc3RhbmNlIGNvdW50XG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA1LCBpbmRpcmVjdCA/ICJpZ25vcmVkIiA6ICJzdGFydCBpbnN0YW5jZVxuIik7CisJaW5zdHJfb3V0KGN0eCwgNiwgaW5kaXJlY3QgPyAiaWdub3JlZCIgOiAiaW5kZXggYmlhc1xuIik7CisKKwlyZXR1cm4gNzsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkXzk2NShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXVpbnQzMl90IG9wY29kZTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBpLCBqLCBzYmFfbGVuOworCWNvbnN0IGNoYXIgKmRlc2MxID0gTlVMTDsKKwl1aW50MzJfdCAqZGF0YSA9IGN0eC0+ZGF0YTsKKwl1aW50MzJfdCBkZXZpZCA9IGN0eC0+ZGV2aWQ7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBvcGNvZGU7CisJCXVpbnQzMl90IGxlbl9tYXNrOworCQlpbnQgdW5zaWduZWQgbWluX2xlbjsKKwkJaW50IHVuc2lnbmVkIG1heF9sZW47CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWludCBnZW47CisJCWludCAoKmZ1bmMpKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpOworCX0gb3Bjb2Rlc18zZFtdID0geworCQl7IDB4NjAwMCwgMHgwMGZmLCAzLCAzLCAiVVJCX0ZFTkNFIiB9LAorCQl7IDB4NjAwMSwgMHhmZmZmLCAyLCAyLCAiQ1NfVVJCX1NUQVRFIiB9LAorCQl7IDB4NjAwMiwgMHgwMGZmLCAyLCAyLCAiQ09OU1RBTlRfQlVGRkVSIiB9LAorCQl7IDB4NjEwMSwgMHhmZmZmLCA2LCAxMCwgIlNUQVRFX0JBU0VfQUREUkVTUyIgfSwKKwkJeyAweDYxMDIsIDB4ZmZmZiwgMiwgMiwgIlNUQVRFX1NJUCIgfSwKKwkJeyAweDYxMDQsIDB4ZmZmZiwgMSwgMSwgIjNEU1RBVEVfUElQRUxJTkVfU0VMRUNUIiB9LAorCQl7IDB4NjgwYiwgMHhmZmZmLCAxLCAxLCAiM0RTVEFURV9WRl9TVEFUSVNUSUNTIiB9LAorCQl7IDB4NjkwNCwgMHhmZmZmLCAxLCAxLCAiM0RTVEFURV9QSVBFTElORV9TRUxFQ1QiIH0sCisJCXsgMHg3ODAwLCAweGZmZmYsIDcsIDcsICIzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MDEsIDB4MDBmZiwgNCwgNiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MDIsIDB4MDBmZiwgNCwgNCwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MDUsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfREVQVEhfQlVGRkVSIiwgNyB9LAorCQl7IDB4NzgwNSwgMHgwMGZmLCAzLCAzLCAiM0RTVEFURV9VUkIiIH0sCisJCXsgMHg3ODA0LCAweDAwZmYsIDMsIDMsICIzRFNUQVRFX0NMRUFSX1BBUkFNUyIgfSwKKwkJeyAweDc4MDYsIDB4MDBmZiwgMywgMywgIjNEU1RBVEVfU1RFTkNJTF9CVUZGRVIiIH0sCisJCXsgMHg3OTBmLCAweDAwZmYsIDMsIDMsICIzRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSIiwgNiB9LAorCQl7IDB4NzgwNywgMHgwMGZmLCAzLCAzLCAiM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUiIsIDcsIGdlbjdfM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUiB9LAorCQl7IDB4NzgwOCwgMHgwMGZmLCA1LCAyNTcsICIzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTIiB9LAorCQl7IDB4NzgwOSwgMHgwMGZmLCAzLCAyNTYsICIzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUyIgfSwKKwkJeyAweDc4MGEsIDB4MDBmZiwgMywgMywgIjNEU1RBVEVfSU5ERVhfQlVGRkVSIiB9LAorCQl7IDB4NzgwYiwgMHhmZmZmLCAxLCAxLCAiM0RTVEFURV9WRl9TVEFUSVNUSUNTIiB9LAorCQl7IDB4NzgwZCwgMHgwMGZmLCA0LCA0LCAiM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MGUsIDB4ZmZmZiwgNCwgNCwgTlVMTCwgNiwgZ2VuNl8zRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTIH0sCisJCXsgMHg3ODBlLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUyB9LAorCQl7IDB4NzgwZiwgMHgwMGZmLCAyLCAyLCAiM0RTVEFURV9TQ0lTU09SX1BPSU5URVJTIiB9LAorCQl7IDB4NzgxMCwgMHgwMGZmLCA2LCA2LCAiM0RTVEFURV9WUyIgfSwKKwkJeyAweDc4MTEsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfR1MiIH0sCisJCXsgMHg3ODEyLCAweDAwZmYsIDQsIDQsICIzRFNUQVRFX0NMSVAiIH0sCisJCXsgMHg3ODEzLCAweDAwZmYsIDIwLCAyMCwgIjNEU1RBVEVfU0YiLCA2IH0sCisJCXsgMHg3ODEzLCAweDAwZmYsIDcsIDcsICIzRFNUQVRFX1NGIiwgNyB9LAorCQl7IDB4NzgxNCwgMHgwMGZmLCAzLCAzLCAiM0RTVEFURV9XTSIsIDcsIGdlbjdfM0RTVEFURV9XTSB9LAorCQl7IDB4NzgxNCwgMHgwMGZmLCA5LCA5LCAiM0RTVEFURV9XTSIsIDYsIGdlbjZfM0RTVEFURV9XTSB9LAorCQl7IDB4NzgxNSwgMHgwMGZmLCA1LCA1LCAiM0RTVEFURV9DT05TVEFOVF9WU19TVEFURSIsIDYgfSwKKwkJeyAweDc4MTUsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfQ09OU1RBTlRfVlMiLCA3LCBnZW43XzNEU1RBVEVfQ09OU1RBTlRfVlMgfSwKKwkJeyAweDc4MTYsIDB4MDBmZiwgNSwgNSwgIjNEU1RBVEVfQ09OU1RBTlRfR1NfU1RBVEUiLCA2IH0sCisJCXsgMHg3ODE2LCAweDAwZmYsIDcsIDcsICIzRFNUQVRFX0NPTlNUQU5UX0dTIiwgNywgZ2VuN18zRFNUQVRFX0NPTlNUQU5UX0dTIH0sCisJCXsgMHg3ODE3LCAweDAwZmYsIDUsIDUsICIzRFNUQVRFX0NPTlNUQU5UX1BTX1NUQVRFIiwgNiB9LAorCQl7IDB4NzgxNywgMHgwMGZmLCA3LCA3LCAiM0RTVEFURV9DT05TVEFOVF9QUyIsIDcsIGdlbjdfM0RTVEFURV9DT05TVEFOVF9QUyB9LAorCQl7IDB4NzgxOCwgMHhmZmZmLCAyLCAyLCAiM0RTVEFURV9TQU1QTEVfTUFTSyIgfSwKKwkJeyAweDc4MTksIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfQ09OU1RBTlRfSFMiLCA3LCBnZW43XzNEU1RBVEVfQ09OU1RBTlRfSFMgfSwKKwkJeyAweDc4MWEsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfQ09OU1RBTlRfRFMiLCA3LCBnZW43XzNEU1RBVEVfQ09OU1RBTlRfRFMgfSwKKwkJeyAweDc4MWIsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfSFMiIH0sCisJCXsgMHg3ODFjLCAweDAwZmYsIDQsIDQsICIzRFNUQVRFX1RFIiB9LAorCQl7IDB4NzgxZCwgMHgwMGZmLCA2LCA2LCAiM0RTVEFURV9EUyIgfSwKKwkJeyAweDc4MWUsIDB4MDBmZiwgMywgMywgIjNEU1RBVEVfU1RSRUFNT1VUIiB9LAorCQl7IDB4NzgxZiwgMHgwMGZmLCAxNCwgMTQsICIzRFNUQVRFX1NCRSIgfSwKKwkJeyAweDc4MjAsIDB4MDBmZiwgOCwgOCwgIjNEU1RBVEVfUFMiIH0sCisJCXsgMHg3ODIxLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19TRl9DTElQIH0sCisJCXsgMHg3ODIzLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19DQyB9LAorCQl7IDB4NzgyNCwgMHgwMGZmLCAyLCAyLCBOVUxMLCA3LCBnZW43XzNEU1RBVEVfQkxFTkRfU1RBVEVfUE9JTlRFUlMgfSwKKwkJeyAweDc4MjUsIDB4MDBmZiwgMiwgMiwgTlVMTCwgNywgZ2VuN18zRFNUQVRFX0RFUFRIX1NURU5DSUxfU1RBVEVfUE9JTlRFUlMgfSwKKwkJeyAweDc4MjYsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19WUyIgfSwKKwkJeyAweDc4MjcsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19IUyIgfSwKKwkJeyAweDc4MjgsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19EUyIgfSwKKwkJeyAweDc4MjksIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19HUyIgfSwKKwkJeyAweDc4MmEsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19QUyIgfSwKKwkJeyAweDc4MmIsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19WUyIgfSwKKwkJeyAweDc4MmMsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19IUyIgfSwKKwkJeyAweDc4MmQsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19EUyIgfSwKKwkJeyAweDc4MmUsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19HUyIgfSwKKwkJeyAweDc4MmYsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19QUyIgfSwKKwkJeyAweDc4MzAsIDB4MDBmZiwgMiwgMiwgTlVMTCwgNywgZ2VuN18zRFNUQVRFX1VSQl9WUyB9LAorCQl7IDB4NzgzMSwgMHgwMGZmLCAyLCAyLCBOVUxMLCA3LCBnZW43XzNEU1RBVEVfVVJCX0hTIH0sCisJCXsgMHg3ODMyLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9VUkJfRFMgfSwKKwkJeyAweDc4MzMsIDB4MDBmZiwgMiwgMiwgTlVMTCwgNywgZ2VuN18zRFNUQVRFX1VSQl9HUyB9LAorCQl7IDB4NzkwMCwgMHhmZmZmLCA0LCA0LCAiM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRSIgfSwKKwkJeyAweDc5MDEsIDB4ZmZmZiwgNSwgNSwgIjNEU1RBVEVfQ09OU1RBTlRfQ09MT1IiIH0sCisJCXsgMHg3OTA1LCAweGZmZmYsIDUsIDcsICIzRFNUQVRFX0RFUFRIX0JVRkZFUiIgfSwKKwkJeyAweDc5MDYsIDB4ZmZmZiwgMiwgMiwgIjNEU1RBVEVfUE9MWV9TVElQUExFX09GRlNFVCIgfSwKKwkJeyAweDc5MDcsIDB4ZmZmZiwgMzMsIDMzLCAiM0RTVEFURV9QT0xZX1NUSVBQTEVfUEFUVEVSTiIgfSwKKwkJeyAweDc5MDgsIDB4ZmZmZiwgMywgMywgIjNEU1RBVEVfTElORV9TVElQUExFIiB9LAorCQl7IDB4NzkwOSwgMHhmZmZmLCAyLCAyLCAiM0RTVEFURV9HTE9CQUxfREVQVEhfT0ZGU0VUX0NMQU1QIiB9LAorCQl7IDB4NzkwOSwgMHhmZmZmLCAyLCAyLCAiM0RTVEFURV9DTEVBUl9QQVJBTVMiIH0sCisJCXsgMHg3OTBhLCAweGZmZmYsIDMsIDMsICIzRFNUQVRFX0FBX0xJTkVfUEFSQU1FVEVSUyIgfSwKKwkJeyAweDc5MGIsIDB4ZmZmZiwgNCwgNCwgIjNEU1RBVEVfR1NfU1ZCX0lOREVYIiB9LAorCQl7IDB4NzkwZCwgMHhmZmZmLCAzLCAzLCAiM0RTVEFURV9NVUxUSVNBTVBMRSIsIDYgfSwKKwkJeyAweDc5MGQsIDB4ZmZmZiwgNCwgNCwgIjNEU1RBVEVfTVVMVElTQU1QTEUiLCA3IH0sCisJCXsgMHg3OTEwLCAweDAwZmYsIDIsIDIsICIzRFNUQVRFX0NMRUFSX1BBUkFNUyIgfSwKKwkJeyAweDc5MTIsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19WUyIgfSwKKwkJeyAweDc5MTMsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19IUyIgfSwKKwkJeyAweDc5MTQsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19EUyIgfSwKKwkJeyAweDc5MTUsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19HUyIgfSwKKwkJeyAweDc5MTYsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19QUyIgfSwKKwkJeyAweDc5MTcsIDB4MDBmZiwgMiwgMisxMjgqMiwgIjNEU1RBVEVfU09fREVDTF9MSVNUIiB9LAorCQl7IDB4NzkxOCwgMHgwMGZmLCA0LCA0LCAiM0RTVEFURV9TT19CVUZGRVIiIH0sCisJCXsgMHg3YTAwLCAweDAwZmYsIDQsIDYsICJQSVBFX0NPTlRST0wiIH0sCisJCXsgMHg3YjAwLCAweDAwZmYsIDcsIDcsIE5VTEwsIDcsIGdlbjdfM0RQUklNSVRJVkUgfSwKKwkJeyAweDdiMDAsIDB4MDBmZiwgNiwgNiwgTlVMTCwgMCwgZ2VuNF8zRFBSSU1JVElWRSB9LAorCX0sICpvcGNvZGVfM2QgPSBOVUxMOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweGZmZmYwMDAwKSA+PiAxNjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wY29kZXNfM2QpOyBpKyspIHsKKwkJaWYgKG9wY29kZSAhPSBvcGNvZGVzXzNkW2ldLm9wY29kZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIGl0J3MgbWFya2VkIGFzIG5vdCBvdXIgZ2VuLCBza2lwLiAqLworCQlpZiAob3Bjb2Rlc18zZFtpXS5nZW4gJiYgb3Bjb2Rlc18zZFtpXS5nZW4gIT0gY3R4LT5nZW4pCisJCQljb250aW51ZTsKKworCQlvcGNvZGVfM2QgPSAmb3Bjb2Rlc18zZFtpXTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9wY29kZV8zZCkgeworCQlpZiAob3Bjb2RlXzNkLT5tYXhfbGVuID09IDEpCisJCQlsZW4gPSAxOworCQllbHNlCisJCQlsZW4gPSAoZGF0YVswXSAmIG9wY29kZV8zZC0+bGVuX21hc2spICsgMjsKKworCQlpZiAobGVuIDwgb3Bjb2RlXzNkLT5taW5fbGVuIHx8CisJCSAgICBsZW4gPiBvcGNvZGVfM2QtPm1heF9sZW4pIHsKKwkJCWZwcmludGYob3V0LCAiQmFkIGxlbmd0aCAlZCBpbiAlcywgZXhwZWN0ZWQgJWQtJWRcbiIsCisJCQkJbGVuLCBvcGNvZGVfM2QtPm5hbWUsCisJCQkJb3Bjb2RlXzNkLT5taW5fbGVuLCBvcGNvZGVfM2QtPm1heF9sZW4pOworCQl9CisJfSBlbHNlIHsKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDBmZmZmKSArIDI7CisJfQorCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIDB4NjAwMDoKKwkJcmV0dXJuIGk5NjVfZGVjb2RlX3VyYl9mZW5jZShjdHgsIGxlbik7CisJY2FzZSAweDYwMDE6CisJCWluc3RyX291dChjdHgsIDAsICJDU19VUkJfU1RBVEVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAiZW50cnlfc2l6ZTogJWQgWyVkIGJ5dGVzXSwgbl9lbnRyaWVzOiAlZFxuIiwKKwkJCSAgKGRhdGFbMV0gPj4gNCkgJiAweDFmLAorCQkJICAoKChkYXRhWzFdID4+IDQpICYgMHgxZikgKyAxKSAqIDY0LCBkYXRhWzFdICYgMHg3KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NjAwMjoKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIkNPTlNUQU5UX0JVRkZFUjogJXNcbiIsCisJCQkgIChkYXRhWzBdID4+IDgpICYgMSA/ICJ2YWxpZCIgOiAiaW52YWxpZCIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAib2Zmc2V0OiAweCUwOHgsIGxlbmd0aDogJWQgYnl0ZXNcbiIsIGRhdGFbMV0gJiB+MHgzZiwKKwkJCSAgKChkYXRhWzFdICYgMHgzZikgKyAxKSAqIDY0KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NjEwMToKKwkJaSA9IDA7CisJCWluc3RyX291dChjdHgsIDAsICJTVEFURV9CQVNFX0FERFJFU1NcbiIpOworCQlpKys7CisKKwkJaWYgKElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKQorCQkJc2JhX2xlbiA9IDEwOworCQllbHNlIGlmIChJU19HRU41KGRldmlkKSkKKwkJCXNiYV9sZW4gPSA4OworCQllbHNlCisJCQlzYmFfbGVuID0gNjsKKwkJaWYgKGxlbiAhPSBzYmFfbGVuKQorCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gU1RBVEVfQkFTRV9BRERSRVNTXG4iKTsKKworCQlzdGF0ZV9iYXNlX291dChjdHgsIGkrKywgImdlbmVyYWwiKTsKKwkJc3RhdGVfYmFzZV9vdXQoY3R4LCBpKyssICJzdXJmYWNlIik7CisJCWlmIChJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkKKwkJCXN0YXRlX2Jhc2Vfb3V0KGN0eCwgaSsrLCAiZHluYW1pYyIpOworCQlzdGF0ZV9iYXNlX291dChjdHgsIGkrKywgImluZGlyZWN0Iik7CisJCWlmIChJU19HRU41KGRldmlkKSB8fCBJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkKKwkJCXN0YXRlX2Jhc2Vfb3V0KGN0eCwgaSsrLCAiaW5zdHJ1Y3Rpb24iKTsKKworCQlzdGF0ZV9tYXhfb3V0KGN0eCwgaSsrLCAiZ2VuZXJhbCIpOworCQlpZiAoSVNfR0VONihkZXZpZCkgfHwgSVNfR0VONyhkZXZpZCkpCisJCQlzdGF0ZV9tYXhfb3V0KGN0eCwgaSsrLCAiZHluYW1pYyIpOworCQlzdGF0ZV9tYXhfb3V0KGN0eCwgaSsrLCAiaW5kaXJlY3QiKTsKKwkJaWYgKElTX0dFTjUoZGV2aWQpIHx8IElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKQorCQkJc3RhdGVfbWF4X291dChjdHgsIGkrKywgImluc3RydWN0aW9uIik7CisKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NzgwMDoKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIlZTIHN0YXRlXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgIkdTIHN0YXRlXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgIkNsaXAgc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA0LCAiU0Ygc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA1LCAiV00gc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA2LCAiQ0Mgc3RhdGVcbiIpOworCQlyZXR1cm4gbGVuOworCWNhc2UgMHg3ODAxOgorCQlpZiAobGVuICE9IDYgJiYgbGVuICE9IDQpCisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU1xuIik7CisJCWlmIChsZW4gPT0gNikgeworCQkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCQkgICIzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMSwgIlZTIGJpbmRpbmcgdGFibGVcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMiwgIkdTIGJpbmRpbmcgdGFibGVcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMywgIkNsaXAgYmluZGluZyB0YWJsZVxuIik7CisJCQlpbnN0cl9vdXQoY3R4LCA0LCAiU0YgYmluZGluZyB0YWJsZVxuIik7CisJCQlpbnN0cl9vdXQoY3R4LCA1LCAiV00gYmluZGluZyB0YWJsZVxuIik7CisJCX0gZWxzZSB7CisJCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJCSAgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUzogVlMgbW9kICVkLCAiCisJCQkJICAiR1MgbW9kICVkLCBQUyBtb2QgJWRcbiIsCisJCQkJICAoZGF0YVswXSAmICgxIDw8IDgpKSAhPSAwLAorCQkJCSAgKGRhdGFbMF0gJiAoMSA8PCA5KSkgIT0gMCwKKwkJCQkgIChkYXRhWzBdICYgKDEgPDwgMTIpKSAhPSAwKTsKKwkJCWluc3RyX291dChjdHgsIDEsICJWUyBiaW5kaW5nIHRhYmxlXG4iKTsKKwkJCWluc3RyX291dChjdHgsIDIsICJHUyBiaW5kaW5nIHRhYmxlXG4iKTsKKwkJCWluc3RyX291dChjdHgsIDMsICJXTSBiaW5kaW5nIHRhYmxlXG4iKTsKKwkJfQorCisJCXJldHVybiBsZW47CisJY2FzZSAweDc4MDI6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX1NBTVBMRVJfU1RBVEVfUE9JTlRFUlM6IFZTIG1vZCAlZCwgIgorCQkJICAiR1MgbW9kICVkLCBQUyBtb2QgJWRcbiIsIChkYXRhWzBdICYgKDEgPDwgOCkpICE9IDAsCisJCQkgIChkYXRhWzBdICYgKDEgPDwgOSkpICE9IDAsCisJCQkgIChkYXRhWzBdICYgKDEgPDwgMTIpKSAhPSAwKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIlZTIHNhbXBsZXIgc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiR1Mgc2FtcGxlciBzdGF0ZVxuIik7CisJCWluc3RyX291dChjdHgsIDMsICJXTSBzYW1wbGVyIHN0YXRlXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NzgwNToKKwkJLyogQWN0dWFsbHkgM0RTVEFURV9ERVBUSF9CVUZGRVIgb24gZ2VuNy4gKi8KKwkJaWYgKGN0eC0+Z2VuID09IDcpCisJCQlicmVhazsKKworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9VUkJcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAiVlMgZW50cmllcyAlZCwgYWxsb2Mgc2l6ZSAlZCAoMTAyNGJpdCByb3cpXG4iLAorCQkJICBkYXRhWzFdICYgMHhmZmZmLCAoKGRhdGFbMV0gPj4gMTYpICYgMHgwN2YpICsgMSk7CisJCWluc3RyX291dChjdHgsIDIsCisJCQkgICJHUyBlbnRyaWVzICVkLCBhbGxvYyBzaXplICVkICgxMDI0Yml0IHJvdylcbiIsCisJCQkgIChkYXRhWzJdID4+IDgpICYgMHgzZmYsIChkYXRhWzJdICYgNykgKyAxKTsKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3ODA4OgorCQlpZiAoKGxlbiAtIDEpICUgNCAhPSAwKQorCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9WRVJURVhfQlVGRkVSU1xuIik7CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTXG4iKTsKKworCQlmb3IgKGkgPSAxOyBpIDwgbGVuOykgeworCQkJaW50IGlkeCwgYWNjZXNzOworCQkJaWYgKElTX0dFTjYoZGV2aWQpKSB7CisJCQkJaWR4ID0gMjY7CisJCQkJYWNjZXNzID0gMjA7CisJCQl9IGVsc2UgeworCQkJCWlkeCA9IDI3OworCQkJCWFjY2VzcyA9IDI2OworCQkJfQorCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkgICJidWZmZXIgJWQ6ICVzLCBwaXRjaCAlZGJcbiIsIGRhdGFbaV0gPj4gaWR4LAorCQkJCSAgZGF0YVtpXSAmICgxIDw8IGFjY2VzcykgPyAicmFuZG9tIiA6CisJCQkJICAic2VxdWVudGlhbCIsIGRhdGFbaV0gJiAweDA3ZmYpOworCQkJaSsrOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiYnVmZmVyIGFkZHJlc3NcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAibWF4IGluZGV4XG4iKTsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIm1ielxuIik7CisJCX0KKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3ODA5OgorCQlpZiAoKGxlbiArIDEpICUgMiAhPSAwKQorCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9WRVJURVhfRUxFTUVOVFNcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9WRVJURVhfRUxFTUVOVFNcbiIpOworCisJCWZvciAoaSA9IDE7IGkgPCBsZW47KSB7CisJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCSAgImJ1ZmZlciAlZDogJXN2YWxpZCwgdHlwZSAweCUwNHgsICIKKwkJCQkgICJzcmMgb2Zmc2V0IDB4JTA0eCBieXRlc1xuIiwKKwkJCQkgIGRhdGFbaV0gPj4gKChJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkgPyAyNiA6IDI3KSwKKwkJCQkgIGRhdGFbaV0gJiAoMSA8PCAoKElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKSA/IDI1IDogMjYpKSA/CisJCQkJICAiIiA6ICJpbiIsIChkYXRhW2ldID4+IDE2KSAmIDB4MWZmLAorCQkJCSAgZGF0YVtpXSAmIDB4MDdmZik7CisJCQlpKys7CisJCQlpbnN0cl9vdXQoY3R4LCBpLCAiKCVzLCAlcywgJXMsICVzKSwgIgorCQkJCSAgImRzdCBvZmZzZXQgMHglMDJ4IGJ5dGVzXG4iLAorCQkJCSAgZ2V0Xzk2NV9lbGVtZW50X2NvbXBvbmVudChkYXRhW2ldLCAwKSwKKwkJCQkgIGdldF85NjVfZWxlbWVudF9jb21wb25lbnQoZGF0YVtpXSwgMSksCisJCQkJICBnZXRfOTY1X2VsZW1lbnRfY29tcG9uZW50KGRhdGFbaV0sIDIpLAorCQkJCSAgZ2V0Xzk2NV9lbGVtZW50X2NvbXBvbmVudChkYXRhW2ldLCAzKSwKKwkJCQkgIChkYXRhW2ldICYgMHhmZikgKiA0KTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MGQ6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgImNsaXBcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAic2ZcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAiY2NcbiIpOworCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MGE6CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0lOREVYX0JVRkZFUlxuIik7CisJCWluc3RyX291dChjdHgsIDEsICJiZWdpbm5pbmcgYnVmZmVyIGFkZHJlc3NcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiZW5kaW5nIGJ1ZmZlciBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3ODBmOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9TQ0lTU09SX1BPSU5URVJTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgInNjaXNzb3IgcmVjdCBvZmZzZXRcbiIpOworCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MTA6CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1ZTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgImtlcm5lbCBwb2ludGVyXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwKKwkJCSAgIlNQRj0lZCwgVk1FPSVkLCBTYW1wbGVyIENvdW50ICVkLCAiCisJCQkgICJCaW5kaW5nIHRhYmxlIGNvdW50ICVkXG4iLCAoZGF0YVsyXSA+PiAzMSkgJiAxLAorCQkJICAoZGF0YVsyXSA+PiAzMCkgJiAxLCAoZGF0YVsyXSA+PiAyNykgJiA3LAorCQkJICAoZGF0YVsyXSA+PiAxOCkgJiAweGZmKTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgInNjcmF0Y2ggb2Zmc2V0XG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwKKwkJCSAgIkRpc3BhdGNoIEdSRiBzdGFydCAlZCwgVlVFIHJlYWQgbGVuZ3RoICVkLCAiCisJCQkgICJWVUUgcmVhZCBvZmZzZXQgJWRcbiIsIChkYXRhWzRdID4+IDIwKSAmIDB4MWYsCisJCQkgIChkYXRhWzRdID4+IDExKSAmIDB4M2YsIChkYXRhWzRdID4+IDQpICYgMHgzZik7CisJCWluc3RyX291dChjdHgsIDUsCisJCQkgICJNYXggVGhyZWFkcyAlZCwgVmVydGV4IENhY2hlICVzYWJsZSwgIgorCQkJICAiVlMgZnVuYyAlc2FibGVcbiIsICgoZGF0YVs1XSA+PiAyNSkgJiAweDdmKSArIDEsCisJCQkgIChkYXRhWzVdICYgKDEgPDwgMSkpICE9IDAgPyAiZGlzIiA6ICJlbiIsCisJCQkgIChkYXRhWzVdICYgMSkgIT0gMCA/ICJlbiIgOiAiZGlzIik7CisJCXJldHVybiBsZW47CisKKwljYXNlIDB4NzgxMToKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfR1NcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLCAia2VybmVsIHBvaW50ZXJcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLAorCQkJICAiU1BGPSVkLCBWTUU9JWQsIFNhbXBsZXIgQ291bnQgJWQsICIKKwkJCSAgIkJpbmRpbmcgdGFibGUgY291bnQgJWRcbiIsIChkYXRhWzJdID4+IDMxKSAmIDEsCisJCQkgIChkYXRhWzJdID4+IDMwKSAmIDEsIChkYXRhWzJdID4+IDI3KSAmIDcsCisJCQkgIChkYXRhWzJdID4+IDE4KSAmIDB4ZmYpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAic2NyYXRjaCBvZmZzZXRcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA0LAorCQkJICAiRGlzcGF0Y2ggR1JGIHN0YXJ0ICVkLCBWVUUgcmVhZCBsZW5ndGggJWQsICIKKwkJCSAgIlZVRSByZWFkIG9mZnNldCAlZFxuIiwgKGRhdGFbNF0gJiAweGYpLAorCQkJICAoZGF0YVs0XSA+PiAxMSkgJiAweDNmLCAoZGF0YVs0XSA+PiA0KSAmIDB4M2YpOworCQlpbnN0cl9vdXQoY3R4LCA1LAorCQkJICAiTWF4IFRocmVhZHMgJWQsIFJlbmRlcmluZyAlc2FibGVcbiIsCisJCQkgICgoZGF0YVs1XSA+PiAyNSkgJiAweDdmKSArIDEsCisJCQkgIChkYXRhWzVdICYgKDEgPDwgOCkpICE9IDAgPyAiZW4iIDogImRpcyIpOworCQlpbnN0cl9vdXQoY3R4LCA2LAorCQkJICAiUmVvcmRlciAlc2FibGUsIERpc2NhcmQgQWRqYWNlbnkgJXNhYmxlLCAiCisJCQkgICJHUyAlc2FibGVcbiIsCisJCQkgIChkYXRhWzZdICYgKDEgPDwgMzApKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVs2XSAmICgxIDw8IDI5KSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbNl0gJiAoMSA8PCAxNSkpICE9IDAgPyAiZW4iIDogImRpcyIpOworCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MTI6CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0NMSVBcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAiVXNlckNsaXAgZGlzdGFuY2UgY3VsbCB0ZXN0IG1hc2sgMHgleFxuIiwKKwkJCSAgZGF0YVsxXSAmIDB4ZmYpOworCQlpbnN0cl9vdXQoY3R4LCAyLAorCQkJICAiQ2xpcCAlc2FibGUsIEFQSSBtb2RlICVzLCBWaWV3cG9ydCBYWSB0ZXN0ICVzYWJsZSwgIgorCQkJICAiVmlld3BvcnQgWiB0ZXN0ICVzYWJsZSwgR3VhcmRiYW5kIHRlc3QgJXNhYmxlLCBDbGlwIG1vZGUgJWQsICIKKwkJCSAgIlBlcnNwZWN0aXZlIERpdmlkZSAlc2FibGUsIE5vbi1QZXJzcGVjdGl2ZSBCYXJ5Y2VudHJpYyAlc2FibGUsICIKKwkJCSAgIlRyaSBQcm92b2tpbmcgJWQsIExpbmUgUHJvdm9raW5nICVkLCBUcmlmYW4gUHJvdm9raW5nICVkXG4iLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDMxKSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbMl0gJiAoMSA8PCAzMCkpICE9IDAgPyAiRDNEIiA6ICJPR0wiLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDI4KSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbMl0gJiAoMSA8PCAyNykpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzJdICYgKDEgPDwgMjYpKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVsyXSA+PiAxMykgJiA3LAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDkpKSAhPSAwID8gImRpcyIgOiAiZW4iLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDgpKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVsyXSA+PiA0KSAmIDMsIChkYXRhWzJdID4+IDIpICYgMywKKwkJCSAgKGRhdGFbMl0gJiAzKSk7CisJCWluc3RyX291dChjdHgsIDMsCisJCQkgICJNaW4gUG9pbnRXaWR0aCAlZCwgTWF4IFBvaW50V2lkdGggJWQsICIKKwkJCSAgIkZvcmNlIFplcm8gUlRBSW5kZXggJXNhYmxlLCBNYXggVlBJbmRleCAlZFxuIiwKKwkJCSAgKGRhdGFbM10gPj4gMTcpICYgMHg3ZmYsIChkYXRhWzNdID4+IDYpICYgMHg3ZmYsCisJCQkgIChkYXRhWzNdICYgKDEgPDwgNSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzNdICYgMHhmKSk7CisJCXJldHVybiBsZW47CisKKwljYXNlIDB4NzgxMzoKKwkJaWYgKGN0eC0+Z2VuID09IDcpCisJCQlicmVhazsKKworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9TRlxuIik7CisJCWluc3RyX291dChjdHgsIDEsCisJCQkgICJBdHRyaWIgT3V0ICVkLCBBdHRyaWIgU3dpenpsZSAlc2FibGUsIFZVRSByZWFkIGxlbmd0aCAlZCwgIgorCQkJICAiVlVFIHJlYWQgb2Zmc2V0ICVkXG4iLCAoZGF0YVsxXSA+PiAyMikgJiAweDNmLAorCQkJICAoZGF0YVsxXSAmICgxIDw8IDIxKSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbMV0gPj4gMTEpICYgMHgxZiwgKGRhdGFbMV0gPj4gNCkgJiAweDNmKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwKKwkJCSAgIkxlZ2FjeSBHbG9iYWwgRGVwdGhCaWFzICVzYWJsZSwgRnJvbnRGYWNlIGZpbGwgJWQsIEJGIGZpbGwgJWQsICIKKwkJCSAgIlZQIHRyYW5zZm9ybSAlc2FibGUsIEZyb250V2luZGluZ18lc1xuIiwKKwkJCSAgKGRhdGFbMl0gJiAoMSA8PCAxMSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzJdID4+IDUpICYgMywgKGRhdGFbMl0gPj4gMykgJiAzLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDEpKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVsyXSAmIDEpICE9IDAgPyAiQ0NXIiA6ICJDVyIpOworCQlpbnN0cl9vdXQoY3R4LCAzLAorCQkJICAiQUEgJXNhYmxlLCBDdWxsTW9kZSAlZCwgU2Npc3NvciAlc2FibGUsIE11bHRpc2FtcGxlIG0gb2RlICVkXG4iLAorCQkJICAoZGF0YVszXSAmICgxIDw8IDMxKSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbM10gPj4gMjkpICYgMywKKwkJCSAgKGRhdGFbM10gJiAoMSA8PCAxMSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzNdID4+IDgpICYgMyk7CisJCWluc3RyX291dChjdHgsIDQsCisJCQkgICJMYXN0IFBpeGVsICVzYWJsZSwgU3ViUGl4ZWwgUHJlY2lzaW9uICVkLCBVc2UgUGl4ZWxXaWR0aCAlZFxuIiwKKwkJCSAgKGRhdGFbNF0gJiAoMSA8PCAzMSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzRdICYgKDEgPDwgMTIpKSAhPSAwID8gNCA6IDgsCisJCQkgIChkYXRhWzRdICYgKDEgPDwgMTEpKSAhPSAwKTsKKwkJaW5zdHJfb3V0KGN0eCwgNSwKKwkJCSAgIkdsb2JhbCBEZXB0aCBPZmZzZXQgQ29uc3RhbnQgJWZcbiIsCisJCQkgICooZmxvYXQgKikoJmRhdGFbNV0pKTsKKwkJaW5zdHJfb3V0KGN0eCwgNiwgIkdsb2JhbCBEZXB0aCBPZmZzZXQgU2NhbGUgJWZcbiIsCisJCQkgICooZmxvYXQgKikoJmRhdGFbNl0pKTsKKwkJaW5zdHJfb3V0KGN0eCwgNywgIkdsb2JhbCBEZXB0aCBPZmZzZXQgQ2xhbXAgJWZcbiIsCisJCQkgICooZmxvYXQgKikoJmRhdGFbN10pKTsKKworCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDg7IGkrKywgaiArPSAyKQorCQkJaW5zdHJfb3V0KGN0eCwgaSArIDgsCisJCQkJICAiQXR0cmliICVkIChPdmVycmlkZSAlcyVzJXMlcywgQ29uc3QgU291cmNlICVkLCBTd2l6emxlIFNlbGVjdCAlZCwgIgorCQkJCSAgIlNvdXJjZSAlZCk7IEF0dHJpYiAlZCAoT3ZlcnJpZGUgJXMlcyVzJXMsIENvbnN0IFNvdXJjZSAlZCwgU3dpenpsZSBTZWxlY3QgJWQsIFNvdXJjZSAlZClcbiIsCisJCQkJICBqICsgMSwKKwkJCQkgIChkYXRhWzggKyBpXSAmICgxIDw8IDMxKSkgIT0gMCA/ICJXIiA6ICIiLAorCQkJCSAgKGRhdGFbOCArIGldICYgKDEgPDwgMzApKSAhPSAwID8gIloiIDogIiIsCisJCQkJICAoZGF0YVs4ICsgaV0gJiAoMSA8PCAyOSkpICE9IDAgPyAiWSIgOiAiIiwKKwkJCQkgIChkYXRhWzggKyBpXSAmICgxIDw8IDI4KSkgIT0gMCA/ICJYIiA6ICIiLAorCQkJCSAgKGRhdGFbOCArIGldID4+IDI1KSAmIDMsCisJCQkJICAoZGF0YVs4ICsgaV0gPj4gMjIpICYgMywKKwkJCQkgIChkYXRhWzggKyBpXSA+PiAxNikgJiAweDFmLCBqLAorCQkJCSAgKGRhdGFbOCArIGldICYgKDEgPDwgMTUpKSAhPSAwID8gIlciIDogIiIsCisJCQkJICAoZGF0YVs4ICsgaV0gJiAoMSA8PCAxNCkpICE9IDAgPyAiWiIgOiAiIiwKKwkJCQkgIChkYXRhWzggKyBpXSAmICgxIDw8IDEzKSkgIT0gMCA/ICJZIiA6ICIiLAorCQkJCSAgKGRhdGFbOCArIGldICYgKDEgPDwgMTIpKSAhPSAwID8gIlgiIDogIiIsCisJCQkJICAoZGF0YVs4ICsgaV0gPj4gOSkgJiAzLAorCQkJCSAgKGRhdGFbOCArIGldID4+IDYpICYgMywgKGRhdGFbOCArIGldICYgMHgxZikpOworCQlpbnN0cl9vdXQoY3R4LCAxNiwKKwkJCSAgIlBvaW50IFNwcml0ZSBUZXhDb29yZCBFbmFibGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxNywgIkNvbnN0IEludGVycCBFbmFibGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxOCwKKwkJCSAgIkF0dHJpYiA3LTAgV3JhcFNob3J0ZXN0IEVuYWJsZVxuIik7CisJCWluc3RyX291dChjdHgsIDE5LAorCQkJICAiQXR0cmliIDE1LTggV3JhcFNob3J0ZXN0IEVuYWJsZVxuIik7CisKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3OTAwOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRVxuIik7CisJCWluc3RyX291dChjdHgsIDEsICJ0b3AgbGVmdDogJWQsJWRcbiIsCisJCQkgIGRhdGFbMV0gJiAweGZmZmYsIChkYXRhWzFdID4+IDE2KSAmIDB4ZmZmZik7CisJCWluc3RyX291dChjdHgsIDIsICJib3R0b20gcmlnaHQ6ICVkLCVkXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCAoZGF0YVsyXSA+PiAxNikgJiAweGZmZmYpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAib3JpZ2luOiAlZCwlZFxuIiwKKwkJCSAgKGludClkYXRhWzNdICYgMHhmZmZmLCAoKGludClkYXRhWzNdID4+IDE2KSAmIDB4ZmZmZik7CisKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3OTA1OgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9ERVBUSF9CVUZGRVJcbiIpOworCQlpZiAoSVNfR0VONShkZXZpZCkgfHwgSVNfR0VONihkZXZpZCkpCisJCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJCSAgIiVzLCAlcywgcGl0Y2ggPSAlZCBieXRlcywgJXN0aWxlZCwgSGlaICVkLCBTZXBhcmF0ZSBTdGVuY2lsICVkXG4iLAorCQkJCSAgZ2V0Xzk2NV9zdXJmYWNldHlwZShkYXRhWzFdID4+IDI5KSwKKwkJCQkgIGdldF85NjVfZGVwdGhmb3JtYXQoKGRhdGFbMV0gPj4gMTgpICYgMHg3KSwKKwkJCQkgIChkYXRhWzFdICYgMHgwMDAxZmZmZikgKyAxLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDI3KSA/ICIiIDogIm5vdCAiLAorCQkJCSAgKGRhdGFbMV0gJiAoMSA8PCAyMikpICE9IDAsCisJCQkJICAoZGF0YVsxXSAmICgxIDw8IDIxKSkgIT0gMCk7CisJCWVsc2UKKwkJCWluc3RyX291dChjdHgsIDEsCisJCQkJICAiJXMsICVzLCBwaXRjaCA9ICVkIGJ5dGVzLCAlc3RpbGVkXG4iLAorCQkJCSAgZ2V0Xzk2NV9zdXJmYWNldHlwZShkYXRhWzFdID4+IDI5KSwKKwkJCQkgIGdldF85NjVfZGVwdGhmb3JtYXQoKGRhdGFbMV0gPj4gMTgpICYgMHg3KSwKKwkJCQkgIChkYXRhWzFdICYgMHgwMDAxZmZmZikgKyAxLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDI3KSA/ICIiIDogIm5vdCAiKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImRlcHRoIG9mZnNldFxuIik7CisJCWluc3RyX291dChjdHgsIDMsICIlZHglZFxuIiwKKwkJCSAgKChkYXRhWzNdICYgMHgwMDA3ZmZjMCkgPj4gNikgKyAxLAorCQkJICAoKGRhdGFbM10gJiAweGZmZjgwMDAwKSA+PiAxOSkgKyAxKTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwgInZvbHVtZSBkZXB0aFxuIik7CisJCWlmIChsZW4gPj0gNikKKwkJCWluc3RyX291dChjdHgsIDUsICJcbiIpOworCQlpZiAobGVuID49IDcpIHsKKwkJCWlmIChJU19HRU42KGRldmlkKSkKKwkJCQlpbnN0cl9vdXQoY3R4LCA2LCAiXG4iKTsKKwkJCWVsc2UKKwkJCQlpbnN0cl9vdXQoY3R4LCA2LAorCQkJCQkgICJyZW5kZXIgdGFyZ2V0IHZpZXcgZXh0ZW50XG4iKTsKKwkJfQorCisJCXJldHVybiBsZW47CisKKwljYXNlIDB4N2EwMDoKKwkJaWYgKElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKSB7CisJCQl1bnNpZ25lZCBpbnQgaTsKKwkJCWlmIChsZW4gIT0gNCAmJiBsZW4gIT0gNSkKKwkJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBQSVBFX0NPTlRST0xcbiIpOworCisJCQlzd2l0Y2ggKChkYXRhWzFdID4+IDE0KSAmIDB4MykgeworCQkJY2FzZSAwOgorCQkJCWRlc2MxID0gIm5vIHdyaXRlIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlkZXNjMSA9ICJxd29yZCB3cml0ZSI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJZGVzYzEgPSAiUFNfREVQVEhfQ09VTlQgd3JpdGUiOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWRlc2MxID0gIlRJTUVTVEFNUCB3cml0ZSI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpbnN0cl9vdXQoY3R4LCAwLCAiUElQRV9DT05UUk9MXG4iKTsKKwkJCWluc3RyX291dChjdHgsIDEsCisJCQkJICAiJXMsICVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkJCSAgZGVzYzEsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMjApID8gImNzIHN0YWxsLCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMTkpID8KKwkJCQkgICJnbG9iYWwgc25hcHNob3QgY291bnQgcmVzZXQsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxOCkgPyAidGxiIGludmFsaWRhdGUsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxNykgPyAiZ2ZkdCBmbHVzaCwgIiA6ICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDE3KSA/ICJtZWRpYSBzdGF0ZSBjbGVhciwgIiA6CisJCQkJICAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxMykgPyAiZGVwdGggc3RhbGwsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxMikgPworCQkJCSAgInJlbmRlciB0YXJnZXQgY2FjaGUgZmx1c2gsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxMSkgPworCQkJCSAgImluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGUsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxMCkgPworCQkJCSAgInRleHR1cmUgY2FjaGUgaW52YWxpZGF0ZSwgIiA6ICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDkpID8KKwkJCQkgICJpbmRpcmVjdCBzdGF0ZSBpbnZhbGlkYXRlLCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgOCkgPyAibm90aWZ5IGlycSwgIiA6ICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDcpID8gIlBJUEVfQ09OVFJPTCBmbHVzaCwgIiA6CisJCQkJICAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCA2KSA/ICJwcm90ZWN0IG1lbSBhcHBfaWQsICIgOgorCQkJCSAgIiIsIGRhdGFbMV0gJiAoMSA8PCA1KSA/ICJEQyBmbHVzaCwgIiA6ICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDQpID8gInZmIGZldGNoIGludmFsaWRhdGUsICIgOgorCQkJCSAgIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMykgPworCQkJCSAgImNvbnN0YW50IGNhY2hlIGludmFsaWRhdGUsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAyKSA/CisJCQkJICAic3RhdGUgY2FjaGUgaW52YWxpZGF0ZSwgIiA6ICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDEpID8gInN0YWxsIGF0IHNjb3JlYm9hcmQsICIgOgorCQkJCSAgIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMCkgPyAiZGVwdGggY2FjaGUgZmx1c2gsICIgOgorCQkJCSAgIiIpOworCQkJaWYgKGxlbiA9PSA1KSB7CisJCQkJaW5zdHJfb3V0KGN0eCwgMiwKKwkJCQkJICAiZGVzdGluYXRpb24gYWRkcmVzc1xuIik7CisJCQkJaW5zdHJfb3V0KGN0eCwgMywKKwkJCQkJICAiaW1tZWRpYXRlIGR3b3JkIGxvd1xuIik7CisJCQkJaW5zdHJfb3V0KGN0eCwgNCwKKwkJCQkJICAiaW1tZWRpYXRlIGR3b3JkIGhpZ2hcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGkgPSAyOyBpIDwgbGVuOyBpKyspIHsKKwkJCQkJaW5zdHJfb3V0KGN0eCwgaSwgIlxuIik7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGxlbjsKKwkJfSBlbHNlIHsKKwkJCWlmIChsZW4gIT0gNCkKKwkJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBQSVBFX0NPTlRST0xcbiIpOworCisJCQlzd2l0Y2ggKChkYXRhWzBdID4+IDE0KSAmIDB4MykgeworCQkJY2FzZSAwOgorCQkJCWRlc2MxID0gIm5vIHdyaXRlIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlkZXNjMSA9ICJxd29yZCB3cml0ZSI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJZGVzYzEgPSAiUFNfREVQVEhfQ09VTlQgd3JpdGUiOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWRlc2MxID0gIlRJTUVTVEFNUCB3cml0ZSI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJCSAgIlBJUEVfQ09OVFJPTDogJXMsICVzZGVwdGggc3RhbGwsICVzUkMgd3JpdGUgZmx1c2gsICIKKwkJCQkgICIlc2luc3QgZmx1c2hcbiIsCisJCQkJICBkZXNjMSwKKwkJCQkgIGRhdGFbMF0gJiAoMSA8PCAxMykgPyAiIiA6ICJubyAiLAorCQkJCSAgZGF0YVswXSAmICgxIDw8IDEyKSA/ICIiIDogIm5vICIsCisJCQkJICBkYXRhWzBdICYgKDEgPDwgMTEpID8gIiIgOiAibm8gIik7CisJCQlpbnN0cl9vdXQoY3R4LCAxLCAiZGVzdGluYXRpb24gYWRkcmVzc1xuIik7CisJCQlpbnN0cl9vdXQoY3R4LCAyLCAiaW1tZWRpYXRlIGR3b3JkIGxvd1xuIik7CisJCQlpbnN0cl9vdXQoY3R4LCAzLCAiaW1tZWRpYXRlIGR3b3JkIGhpZ2hcbiIpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKworCWlmIChvcGNvZGVfM2QpIHsKKwkJaWYgKG9wY29kZV8zZC0+ZnVuYykgeworCQkJcmV0dXJuIG9wY29kZV8zZC0+ZnVuYyhjdHgpOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IGk7CisKKwkJCWluc3RyX291dChjdHgsIDAsICIlc1xuIiwgb3Bjb2RlXzNkLT5uYW1lKTsKKworCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaW5zdHJfb3V0KGN0eCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkJCX0KKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0QgVU5LTk9XTjogM2RfOTY1IG9wY29kZSA9IDB4JXhcbiIsCisJCSAgb3Bjb2RlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkX2k4MzAoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVpbnQzMl90IG9wY29kZTsKKwl1aW50MzJfdCAqZGF0YSA9IGN0eC0+ZGF0YTsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IG9wY29kZTsKKwkJdW5zaWduZWQgaW50IG1pbl9sZW47CisJCXVuc2lnbmVkIGludCBtYXhfbGVuOworCQljb25zdCBjaGFyICpuYW1lOworCX0gb3Bjb2Rlc18zZFtdID0geworCQl7IDB4MDIsIDEsIDEsICIzRFNUQVRFX01PREVTXzMiIH0sCisJCXsgMHgwMywgMSwgMSwgIjNEU1RBVEVfRU5BQkxFU18xIiB9LAorCQl7IDB4MDQsIDEsIDEsICIzRFNUQVRFX0VOQUJMRVNfMiIgfSwKKwkJeyAweDA1LCAxLCAxLCAiM0RTVEFURV9WRlQwIiB9LAorCQl7IDB4MDYsIDEsIDEsICIzRFNUQVRFX0FBIiB9LAorCQl7IDB4MDcsIDEsIDEsICIzRFNUQVRFX1JBU1RFUklaQVRJT05fUlVMRVMiIH0sCisJCXsgMHgwOCwgMSwgMSwgIjNEU1RBVEVfTU9ERVNfMSIgfSwKKwkJeyAweDA5LCAxLCAxLCAiM0RTVEFURV9TVEVOQ0lMX1RFU1QiIH0sCisJCXsgMHgwYSwgMSwgMSwgIjNEU1RBVEVfVkZUMSIgfSwKKwkJeyAweDBiLCAxLCAxLCAiM0RTVEFURV9JTkRQVF9BTFBIQV9CTEVORCIgfSwKKwkJeyAweDBjLCAxLCAxLCAiM0RTVEFURV9NT0RFU181IiB9LAorCQl7IDB4MGQsIDEsIDEsICIzRFNUQVRFX01BUF9CTEVORF9PUCIgfSwKKwkJeyAweDBlLCAxLCAxLCAiM0RTVEFURV9NQVBfQkxFTkRfQVJHIiB9LAorCQl7IDB4MGYsIDEsIDEsICIzRFNUQVRFX01PREVTXzIiIH0sCisJCXsgMHgxNSwgMSwgMSwgIjNEU1RBVEVfRk9HX0NPTE9SIiB9LAorCQl7IDB4MTYsIDEsIDEsICIzRFNUQVRFX01PREVTXzQifSwKKwl9LCAqb3Bjb2RlXzNkOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweDFmMDAwMDAwKSA+PiAyNDsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSAweDFmOgorCQlyZXR1cm4gZGVjb2RlXzNkX3ByaW1pdGl2ZShjdHgpOworCWNhc2UgMHgxZDoKKwkJcmV0dXJuIGRlY29kZV8zZF8xZChjdHgpOworCWNhc2UgMHgxYzoKKwkJcmV0dXJuIGRlY29kZV8zZF8xYyhjdHgpOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShvcGNvZGVzXzNkKTsgaWR4KyspIHsKKwkJb3Bjb2RlXzNkID0gJm9wY29kZXNfM2RbaWR4XTsKKwkJaWYgKChkYXRhWzBdICYgMHgxZjAwMDAwMCkgPj4gMjQgPT0gb3Bjb2RlXzNkLT5vcGNvZGUpIHsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSAxLCBpOworCisJCQlpbnN0cl9vdXQoY3R4LCAwLCAiJXNcbiIsIG9wY29kZV8zZC0+bmFtZSk7CisJCQlpZiAob3Bjb2RlXzNkLT5tYXhfbGVuID4gMSkgeworCQkJCWxlbiA9IChkYXRhWzBdICYgMHhmZikgKyAyOworCQkJCWlmIChsZW4gPCBvcGNvZGVfM2QtPm1pbl9sZW4gfHwKKwkJCQkgICAgbGVuID4gb3Bjb2RlXzNkLT5tYXhfbGVuKSB7CisJCQkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLAorCQkJCQkJb3Bjb2RlXzNkLT5uYW1lKTsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkJCWluc3RyX291dChjdHgsIGksICJkd29yZCAlZFxuIiwgaSk7CisJCQl9CisJCQlyZXR1cm4gbGVuOworCQl9CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEIFVOS05PV046IDNkX2k4MzAgb3Bjb2RlID0gMHgleFxuIiwKKwkJICBvcGNvZGUpOworCXJldHVybiAxOworfQorCitkcm1fcHVibGljIHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICoKK2RybV9pbnRlbF9kZWNvZGVfY29udGV4dF9hbGxvYyh1aW50MzJfdCBkZXZpZCkKK3sKKwlzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4OworCisJY3R4ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSkpOworCWlmICghY3R4KQorCQlyZXR1cm4gTlVMTDsKKworCWN0eC0+ZGV2aWQgPSBkZXZpZDsKKwljdHgtPm91dCA9IHN0ZG91dDsKKworCWlmIChJU19HRU45KGRldmlkKSkKKwkJY3R4LT5nZW4gPSA5OworCWVsc2UgaWYgKElTX0dFTjgoZGV2aWQpKQorCQljdHgtPmdlbiA9IDg7CisJZWxzZSBpZiAoSVNfR0VONyhkZXZpZCkpCisJCWN0eC0+Z2VuID0gNzsKKwllbHNlIGlmIChJU19HRU42KGRldmlkKSkKKwkJY3R4LT5nZW4gPSA2OworCWVsc2UgaWYgKElTX0dFTjUoZGV2aWQpKQorCQljdHgtPmdlbiA9IDU7CisJZWxzZSBpZiAoSVNfR0VONChkZXZpZCkpCisJCWN0eC0+Z2VuID0gNDsKKwllbHNlIGlmIChJU185WFgoZGV2aWQpKQorCQljdHgtPmdlbiA9IDM7CisJZWxzZSB7CisJCWFzc2VydChJU19HRU4yKGRldmlkKSk7CisJCWN0eC0+Z2VuID0gMjsKKwl9CisKKwlyZXR1cm4gY3R4OworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9kZWNvZGVfY29udGV4dF9mcmVlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJZnJlZShjdHgpOworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9kZWNvZGVfc2V0X2R1bXBfcGFzdF9lbmQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJCQkgICBpbnQgZHVtcF9wYXN0X2VuZCkKK3sKKwljdHgtPmR1bXBfcGFzdF9lbmQgPSAhIWR1bXBfcGFzdF9lbmQ7Cit9CisKK2RybV9wdWJsaWMgdm9pZAorZHJtX2ludGVsX2RlY29kZV9zZXRfYmF0Y2hfcG9pbnRlcihzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkJCSAgIHZvaWQgKmRhdGEsIHVpbnQzMl90IGh3X29mZnNldCwgaW50IGNvdW50KQoreworCWN0eC0+YmFzZV9kYXRhID0gZGF0YTsKKwljdHgtPmJhc2VfaHdfb2Zmc2V0ID0gaHdfb2Zmc2V0OworCWN0eC0+YmFzZV9jb3VudCA9IGNvdW50OworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9kZWNvZGVfc2V0X2hlYWRfdGFpbChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkJICAgICAgIHVpbnQzMl90IGhlYWQsIHVpbnQzMl90IHRhaWwpCit7CisJY3R4LT5oZWFkID0gaGVhZDsKKwljdHgtPnRhaWwgPSB0YWlsOworfQorCitkcm1fcHVibGljIHZvaWQKK2RybV9pbnRlbF9kZWNvZGVfc2V0X291dHB1dF9maWxlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsCisJCQkJIEZJTEUgKm91dCkKK3sKKwljdHgtPm91dCA9IG91dDsKK30KKworLyoqCisgKiBEZWNvZGVzIGFuIGk4MzAtaTkxNSBiYXRjaCBidWZmZXIsIHdyaXRpbmcgdGhlIG91dHB1dCB0byBzdGRvdXQuCisgKgorICogXHBhcmFtIGRhdGEgYmF0Y2ggYnVmZmVyIGNvbnRlbnRzCisgKiBccGFyYW0gY291bnQgbnVtYmVyIG9mIERXT1JEcyB0byBkZWNvZGUgaW4gdGhlIGJhdGNoIGJ1ZmZlcgorICogXHBhcmFtIGh3X29mZnNldCBoYXJkd2FyZSBhZGRyZXNzIGZvciB0aGUgYnVmZmVyCisgKi8KK2RybV9wdWJsaWMgdm9pZAorZHJtX2ludGVsX2RlY29kZShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKwl1aW50MzJfdCBkZXZpZDsKKwlpbnQgc2l6ZSA9IGN0eC0+YmFzZV9jb3VudCAqIDQ7CisJdm9pZCAqdGVtcDsKKworCWlmICghY3R4KQorCQlyZXR1cm47CisKKwkvKiBQdXQgYSBzY3JhdGNoIHBhZ2UgZnVsbCBvZiBvYnZpb3VzbHkgdW5kZWZpbmVkIGRhdGEgYWZ0ZXIKKwkgKiB0aGUgYmF0Y2hidWZmZXIuICBUaGlzIGxldHMgdXMgYXZvaWQgYSBidW5jaCBvZiBsZW5ndGgKKwkgKiBjaGVja2luZyBpbiBzdGF0aWNhbGx5IHNpemVkIHBhY2tldHMuCisJICovCisJdGVtcCA9IG1hbGxvYyhzaXplICsgNDA5Nik7CisJbWVtY3B5KHRlbXAsIGN0eC0+YmFzZV9kYXRhLCBzaXplKTsKKwltZW1zZXQoKGNoYXIgKil0ZW1wICsgc2l6ZSwgMHhkMCwgNDA5Nik7CisJY3R4LT5kYXRhID0gdGVtcDsKKworCWN0eC0+aHdfb2Zmc2V0ID0gY3R4LT5iYXNlX2h3X29mZnNldDsKKwljdHgtPmNvdW50ID0gY3R4LT5iYXNlX2NvdW50OworCisJZGV2aWQgPSBjdHgtPmRldmlkOworCWhlYWRfb2Zmc2V0ID0gY3R4LT5oZWFkOworCXRhaWxfb2Zmc2V0ID0gY3R4LT50YWlsOworCW91dCA9IGN0eC0+b3V0OworCisJc2F2ZWRfczJfc2V0ID0gMDsKKwlzYXZlZF9zNF9zZXQgPSAxOworCisJd2hpbGUgKGN0eC0+Y291bnQgPiAwKSB7CisJCWluZGV4ID0gMDsKKworCQlzd2l0Y2ggKChjdHgtPmRhdGFbaW5kZXhdICYgMHhlMDAwMDAwMCkgPj4gMjkpIHsKKwkJY2FzZSAweDA6CisJCQlyZXQgPSBkZWNvZGVfbWkoY3R4KTsKKworCQkJLyogSWYgTUlfQkFUQ0hCVUZGRVJfRU5EIGhhcHBlbmVkLCB0aGVuIGR1bXAKKwkJCSAqIHRoZSByZXN0IG9mIHRoZSBvdXRwdXQgaW4gY2FzZSB3ZSBzb21lIGRheQorCQkJICogd2FudCBpdCBpbiBkZWJ1Z2dpbmcsIGJ1dCBkb24ndCBkZWNvZGUgaXQKKwkJCSAqIHNpbmNlIGl0J2xsIGp1c3QgY29uZnVzZSBpbiB0aGUgY29tbW9uCisJCQkgKiBjYXNlLgorCQkJICovCisJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJaWYgKGN0eC0+ZHVtcF9wYXN0X2VuZCkgeworCQkJCQlpbmRleCsrOworCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoaW5kZXggPSBpbmRleCArIDE7IGluZGV4IDwgY3R4LT5jb3VudDsKKwkJCQkJICAgICBpbmRleCsrKSB7CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpbmRleCwgIlxuIik7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlpbmRleCArPSByZXQ7CisJCQlicmVhazsKKwkJY2FzZSAweDI6CisJCQlpbmRleCArPSBkZWNvZGVfMmQoY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIDB4MzoKKwkJCWlmIChJU185WFgoZGV2aWQpICYmICFJU19HRU4zKGRldmlkKSkgeworCQkJCWluZGV4ICs9CisJCQkJICAgIGRlY29kZV8zZF85NjUoY3R4KTsKKwkJCX0gZWxzZSBpZiAoSVNfR0VOMyhkZXZpZCkpIHsKKwkJCQlpbmRleCArPSBkZWNvZGVfM2QoY3R4KTsKKwkJCX0gZWxzZSB7CisJCQkJaW5kZXggKz0KKwkJCQkgICAgZGVjb2RlXzNkX2k4MzAoY3R4KTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsICJVTktOT1dOXG4iKTsKKwkJCWluZGV4Kys7CisJCQlicmVhazsKKwkJfQorCQlmZmx1c2gob3V0KTsKKworCQlpZiAoY3R4LT5jb3VudCA8IGluZGV4KQorCQkJYnJlYWs7CisKKwkJY3R4LT5jb3VudCAtPSBpbmRleDsKKwkJY3R4LT5kYXRhICs9IGluZGV4OworCQljdHgtPmh3X29mZnNldCArPSA0ICogaW5kZXg7CisJfQorCisJZnJlZSh0ZW1wKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9rbWQvbGliZHJtL2xpYmRybS5oIGIvaWNkL2ludGVsL2ttZC9saWJkcm0vbGliZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzY2Q1OQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL2xpYmRybS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIExJQkRSTV9MSUJEUk1fSAorI2RlZmluZSBMSUJEUk1fTElCRFJNX0gKKworI2lmIGRlZmluZWQoSEFWRV9WSVNJQklMSVRZKQorIyAgZGVmaW5lIGRybV9wcml2YXRlIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyMgIGRlZmluZSBkcm1fcHVibGljIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorIyAgZGVmaW5lIGRybV9wcml2YXRlCisjICBkZWZpbmUgZHJtX3B1YmxpYworI2VuZGlmCisKKworLyoqCisgKiBTdGF0aWMgKGNvbXBpbGUtdGltZSkgYXNzZXJ0aW9uLgorICogQmFzaWNhbGx5LCB1c2UgQ09ORCB0byBkaW1lbnNpb24gYW4gYXJyYXkuICBJZiBDT05EIGlzIGZhbHNlL3plcm8gdGhlCisgKiBhcnJheSBzaXplIHdpbGwgYmUgLTEgYW5kIHdlJ2xsIGdldCBhIGNvbXBpbGF0aW9uIGVycm9yLgorICovCisjZGVmaW5lIFNUQVRJQ19BU1NFUlQoQ09ORCkgXAorICAgZG8geyBcCisgICAgICAodm9pZCkgc2l6ZW9mKGNoYXIgWzEgLSAyKiEoQ09ORCldKTsgXAorICAgfSB3aGlsZSAoMCkKKworCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmIGRlZmluZWQoQU5EUk9JRCkgJiYgIWRlZmluZWQoX19MUDY0X18pCisjaW5jbHVkZSA8ZXJybm8uaD4gLyogZm9yIEVJTlZBTCAqLworCitleHRlcm4gdm9pZCAqX19tbWFwMih2b2lkICosIHNpemVfdCwgaW50LCBpbnQsIGludCwgc2l6ZV90KTsKKworc3RhdGljIGlubGluZSB2b2lkICpkcm1fbW1hcCh2b2lkICphZGRyLCBzaXplX3QgbGVuZ3RoLCBpbnQgcHJvdCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIGxvZmZfdCBvZmZzZXQpCit7CisgICAvKiBvZmZzZXQgbXVzdCBiZSBhbGlnbmVkIHRvIDQwOTYgKG5vdCBuZWNlc3NhcmlseSB0aGUgcGFnZSBzaXplKSAqLworICAgaWYgKG9mZnNldCAmIDQwOTUpIHsKKyAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgcmV0dXJuIE1BUF9GQUlMRUQ7CisgICB9CisKKyAgIHJldHVybiBfX21tYXAyKGFkZHIsIGxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLCAoc2l6ZV90KSAob2Zmc2V0ID4+IDEyKSk7Cit9CisKKyMgIGRlZmluZSBkcm1fbXVubWFwKGFkZHIsIGxlbmd0aCkgXAorICAgICAgICAgICAgICBtdW5tYXAoYWRkciwgbGVuZ3RoKQorCisKKyNlbHNlCisKKy8qIGFzc3VtZSBsYXJnZSBmaWxlIHN1cHBvcnQgZXhpc3RzICovCisjICBkZWZpbmUgZHJtX21tYXAoYWRkciwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCkgXAorICAgICAgICAgICAgICBtbWFwKGFkZHIsIGxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQpCisKKworc3RhdGljIGlubGluZSBpbnQgZHJtX211bm1hcCh2b2lkICphZGRyLCBzaXplX3QgbGVuZ3RoKQoreworICAgLyogQ29waWVkIGZyb20gY29uZmlndXJlIGNvZGUgZ2VuZXJhdGVkIGJ5IEFDX1NZU19MQVJHRUZJTEUgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgoKG9mZl90KSAxIDw8IDMxKSA8PCAzMSkgLSAxICsgXAorICAgICAgICAgICAgICAgICAgICAgKCgob2ZmX3QpIDEgPDwgMzEpIDw8IDMxKSkKKyAgIFNUQVRJQ19BU1NFUlQoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMSAmJgorICAgICAgICAgICAgICAgICBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSk7CisjdW5kZWYgTEFSR0VfT0ZGX1QKKworICAgcmV0dXJuIG11bm1hcChhZGRyLCBsZW5ndGgpOworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2ttZC9saWJkcm0vbGliZHJtX2xpc3RzLmggYi9pY2QvaW50ZWwva21kL2xpYmRybS9saWJkcm1fbGlzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI2ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2ttZC9saWJkcm0vbGliZHJtX2xpc3RzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuIFVTQS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICovCisKKy8qCisgKiBMaXN0IG1hY3JvcyBoZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBMaW51eCBrZXJuZWwKKyAqIGxpc3QgaGFuZGxpbmcuIE5vIGxpc3QgbG9vcGluZyB5ZXQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit0eXBlZGVmIHN0cnVjdCBfZHJtTU1MaXN0SGVhZAoreworICAgIHN0cnVjdCBfZHJtTU1MaXN0SGVhZCAqcHJldjsKKyAgICBzdHJ1Y3QgX2RybU1NTGlzdEhlYWQgKm5leHQ7Cit9IGRybU1NTGlzdEhlYWQ7CisKKyNkZWZpbmUgRFJNSU5JVExJU1RIRUFEKF9faXRlbSkJCSAgICAgICBcCisgIGRvewkJCQkJICAgICAgIFwKKyAgICAoX19pdGVtKS0+cHJldiA9IChfX2l0ZW0pOwkJICAgICAgIFwKKyAgICAoX19pdGVtKS0+bmV4dCA9IChfX2l0ZW0pOwkJICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBEUk1MSVNUQUREKF9faXRlbSwgX19saXN0KQkJXAorICBkbyB7CQkJCQkJXAorICAgIChfX2l0ZW0pLT5wcmV2ID0gKF9fbGlzdCk7CQkJXAorICAgIChfX2l0ZW0pLT5uZXh0ID0gKF9fbGlzdCktPm5leHQ7CQlcCisgICAgKF9fbGlzdCktPm5leHQtPnByZXYgPSAoX19pdGVtKTsJCVwKKyAgICAoX19saXN0KS0+bmV4dCA9IChfX2l0ZW0pOwkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBEUk1MSVNUQUREVEFJTChfX2l0ZW0sIF9fbGlzdCkJCVwKKyAgZG8gewkJCQkJCVwKKyAgICAoX19pdGVtKS0+bmV4dCA9IChfX2xpc3QpOwkJCVwKKyAgICAoX19pdGVtKS0+cHJldiA9IChfX2xpc3QpLT5wcmV2OwkJXAorICAgIChfX2xpc3QpLT5wcmV2LT5uZXh0ID0gKF9faXRlbSk7CQlcCisgICAgKF9fbGlzdCktPnByZXYgPSAoX19pdGVtKTsJCQlcCisgIH0gd2hpbGUoMCkKKworI2RlZmluZSBEUk1MSVNUREVMKF9faXRlbSkJCQlcCisgIGRvIHsJCQkJCQlcCisgICAgKF9faXRlbSktPnByZXYtPm5leHQgPSAoX19pdGVtKS0+bmV4dDsJXAorICAgIChfX2l0ZW0pLT5uZXh0LT5wcmV2ID0gKF9faXRlbSktPnByZXY7CVwKKyAgfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTUxJU1RERUxJTklUKF9faXRlbSkJCQlcCisgIGRvIHsJCQkJCQlcCisgICAgKF9faXRlbSktPnByZXYtPm5leHQgPSAoX19pdGVtKS0+bmV4dDsJXAorICAgIChfX2l0ZW0pLT5uZXh0LT5wcmV2ID0gKF9faXRlbSktPnByZXY7CVwKKyAgICAoX19pdGVtKS0+bmV4dCA9IChfX2l0ZW0pOwkJCVwKKyAgICAoX19pdGVtKS0+cHJldiA9IChfX2l0ZW0pOwkJCVwKKyAgfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTUxJU1RFTlRSWShfX3R5cGUsIF9faXRlbSwgX19maWVsZCkgICBcCisgICAgKChfX3R5cGUgKikoKChjaGFyICopIChfX2l0ZW0pKSAtIG9mZnNldG9mKF9fdHlwZSwgX19maWVsZCkpKQorCisjZGVmaW5lIERSTUxJU1RFTVBUWShfX2l0ZW0pICgoX19pdGVtKS0+bmV4dCA9PSAoX19pdGVtKSkKKworI2RlZmluZSBEUk1MSVNUU0lOR0xFKF9fbGlzdCkgXAorCSghRFJNTElTVEVNUFRZKF9fbGlzdCkgJiYgKChfX2xpc3QpLT5uZXh0ID09IChfX2xpc3QpLT5wcmV2KSkKKworI2RlZmluZSBEUk1MSVNURk9SRUFDSChfX2l0ZW0sIF9fbGlzdCkJCQkJCVwKKwlmb3IgKChfX2l0ZW0pID0gKF9fbGlzdCktPm5leHQ7CQkJCQlcCisJICAgICAoX19pdGVtKSAhPSAoX19saXN0KTsgKF9faXRlbSkgPSAoX19pdGVtKS0+bmV4dCkKKworI2RlZmluZSBEUk1MSVNURk9SRUFDSFNBRkUoX19pdGVtLCBfX3RlbXAsIF9fbGlzdCkJCQlcCisJZm9yICgoX19pdGVtKSA9IChfX2xpc3QpLT5uZXh0LCAoX190ZW1wKSA9IChfX2l0ZW0pLT5uZXh0OwlcCisJICAgICAoX19pdGVtKSAhPSAoX19saXN0KTsJCQkJCVwKKwkgICAgIChfX2l0ZW0pID0gKF9fdGVtcCksIChfX3RlbXApID0gKF9faXRlbSktPm5leHQpCisKKyNkZWZpbmUgRFJNTElTVEZPUkVBQ0hTQUZFUkVWRVJTRShfX2l0ZW0sIF9fdGVtcCwgX19saXN0KQkJXAorCWZvciAoKF9faXRlbSkgPSAoX19saXN0KS0+cHJldiwgKF9fdGVtcCkgPSAoX19pdGVtKS0+cHJldjsJXAorCSAgICAgKF9faXRlbSkgIT0gKF9fbGlzdCk7CQkJCQlcCisJICAgICAoX19pdGVtKSA9IChfX3RlbXApLCAoX190ZW1wKSA9IChfX2l0ZW0pLT5wcmV2KQorCisjZGVmaW5lIERSTUxJU1RGT1JFQUNIRU5UUlkoX19pdGVtLCBfX2xpc3QsIF9faGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWZvciAoKF9faXRlbSkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAoX19saXN0KS0+bmV4dCwgX19oZWFkKTsgXAorCSAgICAgJihfX2l0ZW0pLT5fX2hlYWQgIT0gKF9fbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgKF9faXRlbSkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKF9faXRlbSktPl9faGVhZC5uZXh0LCBfX2hlYWQpKQorCisjZGVmaW5lIERSTUxJU1RGT1JFQUNIRU5UUllTQUZFKF9faXRlbSwgX190ZW1wLCBfX2xpc3QsIF9faGVhZCkgICAgICAgICAgICAgICAgXAorCWZvciAoKF9faXRlbSkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAoX19saXN0KS0+bmV4dCwgX19oZWFkKSwgXAorCSAgICAgKF9fdGVtcCkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKF9faXRlbSktPl9faGVhZC5uZXh0LCBfX2hlYWQpOyAgICAgICAgICAgXAorCSAgICAgJihfX2l0ZW0pLT5fX2hlYWQgIT0gKF9fbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgKF9faXRlbSkgPSAoX190ZW1wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgKF9fdGVtcCkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKF9fdGVtcCktPl9faGVhZC5uZXh0LCBfX2hlYWQpKQorCisjZGVmaW5lIERSTUxJU1RKT0lOKF9fbGlzdCwgX19qb2luKSBpZiAoIURSTUxJU1RFTVBUWShfX2xpc3QpKSB7CVwKKwkoX19saXN0KS0+bmV4dC0+cHJldiA9IChfX2pvaW4pOwkJCQlcCisJKF9fbGlzdCktPnByZXYtPm5leHQgPSAoX19qb2luKS0+bmV4dDsJCQkJXAorCShfX2pvaW4pLT5uZXh0LT5wcmV2ID0gKF9fbGlzdCktPnByZXY7CQkJCVwKKwkoX19qb2luKS0+bmV4dCA9IChfX2xpc3QpLT5uZXh0OwkJCQlcCit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2YXRvbWljLmggYi9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2YXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0NTU0YwotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZhdG9taWMuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KKyAqCisgKi8KKworLyoqCisgKiBAZmlsZSB4Zjg2YXRvbWljcy5oCisgKgorICogUHJpdmF0ZSBkZWZpbml0aW9ucyBmb3IgYXRvbWljIG9wZXJhdGlvbnMKKyAqLworCisjaWZuZGVmIExJQkRSTV9BVE9NSUNTX0gKKyNkZWZpbmUgTElCRFJNX0FUT01JQ1NfSAorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBIQVZFX0xJQkRSTV9BVE9NSUNfUFJJTUlUSVZFUworCisjZGVmaW5lIEhBU19BVE9NSUNfT1BTIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBhdG9taWM7Cit9IGF0b21pY190OworCisjIGRlZmluZSBhdG9taWNfcmVhZCh4KSAoKHgpLT5hdG9taWMpCisjIGRlZmluZSBhdG9taWNfc2V0KHgsIHZhbCkgKCh4KS0+YXRvbWljID0gKHZhbCkpCisjIGRlZmluZSBhdG9taWNfaW5jKHgpICgodm9pZCkgX19zeW5jX2ZldGNoX2FuZF9hZGQgKCYoeCktPmF0b21pYywgMSkpCisjIGRlZmluZSBhdG9taWNfaW5jX3JldHVybih4KSAoX19zeW5jX2FkZF9hbmRfZmV0Y2ggKCYoeCktPmF0b21pYywgMSkpCisjIGRlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHgpIChfX3N5bmNfYWRkX2FuZF9mZXRjaCAoJih4KS0+YXRvbWljLCAtMSkgPT0gMCkKKyMgZGVmaW5lIGF0b21pY19hZGQoeCwgdikgKCh2b2lkKSBfX3N5bmNfYWRkX2FuZF9mZXRjaCgmKHgpLT5hdG9taWMsICh2KSkpCisjIGRlZmluZSBhdG9taWNfZGVjKHgsIHYpICgodm9pZCkgX19zeW5jX3N1Yl9hbmRfZmV0Y2goJih4KS0+YXRvbWljLCAodikpKQorIyBkZWZpbmUgYXRvbWljX2NtcHhjaGcoeCwgb2xkdiwgbmV3dikgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwICgmKHgpLT5hdG9taWMsIG9sZHYsIG5ld3YpCisKKyNlbmRpZgorCisjaWYgSEFWRV9MSUJfQVRPTUlDX09QUworI2luY2x1ZGUgPGF0b21pY19vcHMuaD4KKworI2RlZmluZSBIQVNfQVRPTUlDX09QUyAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlBT190IGF0b21pYzsKK30gYXRvbWljX3Q7CisKKyMgZGVmaW5lIGF0b21pY19yZWFkKHgpIEFPX2xvYWRfZnVsbCgmKHgpLT5hdG9taWMpCisjIGRlZmluZSBhdG9taWNfc2V0KHgsIHZhbCkgQU9fc3RvcmVfZnVsbCgmKHgpLT5hdG9taWMsICh2YWwpKQorIyBkZWZpbmUgYXRvbWljX2luYyh4KSAoKHZvaWQpIEFPX2ZldGNoX2FuZF9hZGQxX2Z1bGwoJih4KS0+YXRvbWljKSkKKyMgZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHgpIChBT19mZXRjaF9hbmRfYWRkMV9mdWxsKCYoeCktPmF0b21pYykgKyAxKQorIyBkZWZpbmUgYXRvbWljX2FkZCh4LCB2KSAoKHZvaWQpIEFPX2ZldGNoX2FuZF9hZGRfZnVsbCgmKHgpLT5hdG9taWMsICh2KSkpCisjIGRlZmluZSBhdG9taWNfZGVjKHgsIHYpICgodm9pZCkgQU9fZmV0Y2hfYW5kX2FkZF9mdWxsKCYoeCktPmF0b21pYywgLSh2KSkpCisjIGRlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHgpIChBT19mZXRjaF9hbmRfc3ViMV9mdWxsKCYoeCktPmF0b21pYykgPT0gMSkKKyMgZGVmaW5lIGF0b21pY19jbXB4Y2hnKHgsIG9sZHYsIG5ld3YpIEFPX2NvbXBhcmVfYW5kX3N3YXBfZnVsbCgmKHgpLT5hdG9taWMsIG9sZHYsIG5ld3YpCisKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19OZXRCU0RfXykpICYmICFkZWZpbmVkKEhBU19BVE9NSUNfT1BTKSAgLyogU29sYXJpcyAmIE9wZW5Tb2xhcmlzICYgTmV0QlNEICovCisKKyNpbmNsdWRlIDxzeXMvYXRvbWljLmg+CisjZGVmaW5lIEhBU19BVE9NSUNfT1BTIDEKKworI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKyNkZWZpbmUgTElCRFJNX0FUT01JQ19UWVBFIGludAorI2Vsc2UKKyNkZWZpbmUgTElCRFJNX0FUT01JQ19UWVBFIHVpbnRfdAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsgTElCRFJNX0FUT01JQ19UWVBFIGF0b21pYzsgfSBhdG9taWNfdDsKKworIyBkZWZpbmUgYXRvbWljX3JlYWQoeCkgKGludCkgKCh4KS0+YXRvbWljKQorIyBkZWZpbmUgYXRvbWljX3NldCh4LCB2YWwpICgoeCktPmF0b21pYyA9IChMSUJEUk1fQVRPTUlDX1RZUEUpKHZhbCkpCisjIGRlZmluZSBhdG9taWNfaW5jKHgpIChhdG9taWNfaW5jX3VpbnQgKCYoeCktPmF0b21pYykpCisjIGRlZmluZSBhdG9taWNfaW5jX3JldHVybiAoYXRvbWljX2luY191aW50X252KCYoeCktPmF0b21pYykpCisjIGRlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHgpIChhdG9taWNfZGVjX3VpbnRfbnYoJih4KS0+YXRvbWljKSA9PSAwKQorIyBkZWZpbmUgYXRvbWljX2FkZCh4LCB2KSAoYXRvbWljX2FkZF9pbnQoJih4KS0+YXRvbWljLCAodikpKQorIyBkZWZpbmUgYXRvbWljX2RlYyh4LCB2KSAoYXRvbWljX2FkZF9pbnQoJih4KS0+YXRvbWljLCAtKHYpKSkKKyMgZGVmaW5lIGF0b21pY19jbXB4Y2hnKHgsIG9sZHYsIG5ld3YpIGF0b21pY19jYXNfdWludCAoJih4KS0+YXRvbWljLCBvbGR2LCBuZXd2KQorCisjZW5kaWYKKworI2lmICEgSEFTX0FUT01JQ19PUFMKKyNlcnJvciBsaWJkcm0gcmVxdWlyZXMgYXRvbWljIG9wZXJhdGlvbnMsIHBsZWFzZSBkZWZpbmUgdGhlbSBmb3IgeW91ciBDUFUvY29tcGlsZXIuCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF91bmxlc3MoYXRvbWljX3QgKnYsIGludCBhZGQsIGludCB1bmxlc3MpCit7CisJaW50IGMsIG9sZDsKKwljID0gYXRvbWljX3JlYWQodik7CisJd2hpbGUgKGMgIT0gdW5sZXNzICYmIChvbGQgPSBhdG9taWNfY21weGNoZyh2LCBjLCBjICsgYWRkKSkgIT0gYykKKwkJYyA9IG9sZDsKKwlyZXR1cm4gYyA9PSB1bmxlc3M7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybS5jIGIvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzUzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtLmMKQEAgLTAsMCArMSwyODE5IEBACisvKioKKyAqIFxmaWxlIHhmODZkcm0uYyAKKyAqIFVzZXItbGV2ZWwgaW50ZXJmYWNlIHRvIERSTSBkZXZpY2UKKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNkZWZpbmUgc3RhdF90IHN0cnVjdCBzdGF0CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZmRlZiBIQVZFX1NZU19NS0RFVl9ICisjIGluY2x1ZGUgPHN5cy9ta2Rldi5oPiAvKiBkZWZpbmVzIG1ham9yKCksIG1pbm9yKCksIGFuZCBtYWtlZGV2KCkgb24gU29sYXJpcyAqLworI2VuZGlmCisKKy8qIE5vdCBhbGwgc3lzdGVtcyBoYXZlIE1BUF9GQUlMRUQgZGVmaW5lZCAqLworI2lmbmRlZiBNQVBfRkFJTEVECisjZGVmaW5lIE1BUF9GQUlMRUQgKCh2b2lkICopLTEpCisjZW5kaWYKKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJsaWJkcm0uaCIKKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjZGVmaW5lIERSTV9NQUpPUiAxNDUKKyNlbmRpZgorCisjaWZkZWYgX19OZXRCU0RfXworI2RlZmluZSBEUk1fTUFKT1IgMzQKKyNlbmRpZgorCisjIGlmZGVmIF9fT3BlbkJTRF9fCisjICBkZWZpbmUgRFJNX01BSk9SIDgxCisjIGVuZGlmCisKKyNpZm5kZWYgRFJNX01BSk9SCisjZGVmaW5lIERSTV9NQUpPUiAyMjYJCS8qIExpbnV4ICovCisjZW5kaWYKKworLyoKKyAqIFRoaXMgZGVmaW5pdGlvbiBuZWVkcyB0byBiZSBjaGFuZ2VkIG9uIHNvbWUgc3lzdGVtcyBpZiBkZXZfdCBpcyBhIHN0cnVjdHVyZS4KKyAqIElmIHRoZXJlIGlzIGEgaGVhZGVyIGZpbGUgd2UgY2FuIGdldCBpdCBmcm9tLCB0aGVyZSB3b3VsZCBiZSBiZXN0LgorICovCisjaWZuZGVmIG1ha2VkZXYKKyNkZWZpbmUgbWFrZWRldih4LHkpICAgICgoZGV2X3QpKCgoeCkgPDwgOCkgfCAoeSkpKQorI2VuZGlmCisKKyNkZWZpbmUgRFJNX01TR19WRVJCT1NJVFkgMworCisjZGVmaW5lIG1lbWNsZWFyKHMpIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKQorCitzdGF0aWMgZHJtU2VydmVySW5mb1B0ciBkcm1fc2VydmVyX2luZm87CisKK3ZvaWQgZHJtU2V0U2VydmVySW5mbyhkcm1TZXJ2ZXJJbmZvUHRyIGluZm8pCit7CisgICAgZHJtX3NlcnZlcl9pbmZvID0gaW5mbzsKK30KKworLyoqCisgKiBPdXRwdXQgYSBtZXNzYWdlIHRvIHN0ZGVyci4KKyAqCisgKiBccGFyYW0gZm9ybWF0IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB2ZnByaW50ZigpLgorICovCisKK3N0YXRpYyBpbnQgRFJNX1BSSU5URkxJS0UoMSwgMCkKK2RybURlYnVnUHJpbnQoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgIHJldHVybiB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXApOworfQorCit2b2lkCitkcm1Nc2coY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdAlhcDsKKyAgICBjb25zdCBjaGFyICplbnY7CisgICAgaWYgKCgoZW52ID0gZ2V0ZW52KCJMSUJHTF9ERUJVRyIpKSAmJiBzdHJzdHIoZW52LCAidmVyYm9zZSIpKSB8fCBkcm1fc2VydmVyX2luZm8pCisgICAgeworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCWlmIChkcm1fc2VydmVyX2luZm8pIHsKKwkgIGRybV9zZXJ2ZXJfaW5mby0+ZGVidWdfcHJpbnQoZm9ybWF0LGFwKTsKKwl9IGVsc2UgeworCSAgZHJtRGVidWdQcmludChmb3JtYXQsIGFwKTsKKwl9CisJdmFfZW5kKGFwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkICpkcm1IYXNoVGFibGUgPSBOVUxMOyAvKiBDb250ZXh0IHN3aXRjaCBjYWxsYmFja3MgKi8KKwordm9pZCAqZHJtR2V0SGFzaFRhYmxlKHZvaWQpCit7CisgICAgcmV0dXJuIGRybUhhc2hUYWJsZTsKK30KKwordm9pZCAqZHJtTWFsbG9jKGludCBzaXplKQoreworICAgIHZvaWQgKnB0OworICAgIGlmICgocHQgPSBtYWxsb2Moc2l6ZSkpKQorCW1lbXNldChwdCwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIHB0OworfQorCit2b2lkIGRybUZyZWUodm9pZCAqcHQpCit7CisgICAgaWYgKHB0KQorCWZyZWUocHQpOworfQorCisvKioKKyAqIENhbGwgaW9jdGwsIHJlc3RhcnRpbmcgaWYgaXQgaXMgaW50ZXJ1cHRlZAorICovCitpbnQKK2RybUlvY3RsKGludCBmZCwgdW5zaWduZWQgbG9uZyByZXF1ZXN0LCB2b2lkICphcmcpCit7CisgICAgaW50CXJldDsKKworICAgIGRvIHsKKwlyZXQgPSBpb2N0bChmZCwgcmVxdWVzdCwgYXJnKTsKKyAgICB9IHdoaWxlIChyZXQgPT0gLTEgJiYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRybUdldEtleUZyb21GZChpbnQgZmQpCit7CisgICAgc3RhdF90ICAgICBzdDsKKworICAgIHN0LnN0X3JkZXYgPSAwOworICAgIGZzdGF0KGZkLCAmc3QpOworICAgIHJldHVybiBzdC5zdF9yZGV2OworfQorCitkcm1IYXNoRW50cnkgKmRybUdldEVudHJ5KGludCBmZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGtleSA9IGRybUdldEtleUZyb21GZChmZCk7CisgICAgdm9pZCAgICAgICAgICAqdmFsdWU7CisgICAgZHJtSGFzaEVudHJ5ICAqZW50cnk7CisKKyAgICBpZiAoIWRybUhhc2hUYWJsZSkKKwlkcm1IYXNoVGFibGUgPSBkcm1IYXNoQ3JlYXRlKCk7CisKKyAgICBpZiAoZHJtSGFzaExvb2t1cChkcm1IYXNoVGFibGUsIGtleSwgJnZhbHVlKSkgeworCWVudHJ5ICAgICAgICAgICA9IGRybU1hbGxvYyhzaXplb2YoKmVudHJ5KSk7CisJZW50cnktPmZkICAgICAgID0gZmQ7CisJZW50cnktPmYgICAgICAgID0gTlVMTDsKKwllbnRyeS0+dGFnVGFibGUgPSBkcm1IYXNoQ3JlYXRlKCk7CisJZHJtSGFzaEluc2VydChkcm1IYXNoVGFibGUsIGtleSwgZW50cnkpOworICAgIH0gZWxzZSB7CisJZW50cnkgPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5OworfQorCisvKioKKyAqIENvbXBhcmUgdHdvIGJ1c2lkIHN0cmluZ3MKKyAqCisgKiBccGFyYW0gZmlyc3QKKyAqIFxwYXJhbSBzZWNvbmQKKyAqCisgKiBccmV0dXJuIDEgaWYgbWF0Y2hlZC4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgdHdvIGJ1cyBJRCBzdHJpbmdzLiAgSXQgdW5kZXJzdGFuZHMgdGhlIG9sZGVyCisgKiBQQ0k6YjpkOmYgZm9ybWF0IGFuZCB0aGUgbmV3ZXIgcGNpOm9vb286YmI6ZGQuZiBmb3JtYXQuICBJbiB0aGUgZm9ybWF0LCBvIGlzCisgKiBkb21haW4sIGIgaXMgYnVzLCBkIGlzIGRldmljZSwgZiBpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBkcm1NYXRjaEJ1c0lEKGNvbnN0IGNoYXIgKmlkMSwgY29uc3QgY2hhciAqaWQyLCBpbnQgcGNpX2RvbWFpbl9vaykKK3sKKyAgICAvKiBGaXJzdCwgY2hlY2sgaWYgdGhlIElEcyBhcmUgZXhhY3RseSB0aGUgc2FtZSAqLworICAgIGlmIChzdHJjYXNlY21wKGlkMSwgaWQyKSA9PSAwKQorCXJldHVybiAxOworCisgICAgLyogVHJ5IHRvIG1hdGNoIG9sZC9uZXctc3R5bGUgUENJIGJ1cyBJRHMuICovCisgICAgaWYgKHN0cm5jYXNlY21wKGlkMSwgInBjaSIsIDMpID09IDApIHsKKwl1bnNpZ25lZCBpbnQgbzEsIGIxLCBkMSwgZjE7CisJdW5zaWduZWQgaW50IG8yLCBiMiwgZDIsIGYyOworCWludCByZXQ7CisKKwlyZXQgPSBzc2NhbmYoaWQxLCAicGNpOiUwNHg6JTAyeDolMDJ4LiV1IiwgJm8xLCAmYjEsICZkMSwgJmYxKTsKKwlpZiAocmV0ICE9IDQpIHsKKwkgICAgbzEgPSAwOworCSAgICByZXQgPSBzc2NhbmYoaWQxLCAiUENJOiV1OiV1OiV1IiwgJmIxLCAmZDEsICZmMSk7CisJICAgIGlmIChyZXQgIT0gMykKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gc3NjYW5mKGlkMiwgInBjaTolMDR4OiUwMng6JTAyeC4ldSIsICZvMiwgJmIyLCAmZDIsICZmMik7CisJaWYgKHJldCAhPSA0KSB7CisJICAgIG8yID0gMDsKKwkgICAgcmV0ID0gc3NjYW5mKGlkMiwgIlBDSToldToldToldSIsICZiMiwgJmQyLCAmZjIpOworCSAgICBpZiAocmV0ICE9IDMpCisJCXJldHVybiAwOworCX0KKworCS8qIElmIGRvbWFpbnMgYXJlbid0IHByb3Blcmx5IHN1cHBvcnRlZCBieSB0aGUga2VybmVsIGludGVyZmFjZSwKKwkgKiBqdXN0IGlnbm9yZSB0aGVtLCB3aGljaCBzdWNrcyBsZXNzIHRoYW4gcGlja2luZyBhIHRvdGFsbHkgcmFuZG9tCisJICogY2FyZCB3aXRoICJvcGVuIGJ5IG5hbWUiCisJICovCisJaWYgKCFwY2lfZG9tYWluX29rKQorCQlvMSA9IG8yID0gMDsKKworCWlmICgobzEgIT0gbzIpIHx8IChiMSAhPSBiMikgfHwgKGQxICE9IGQyKSB8fCAoZjEgIT0gZjIpKQorCSAgICByZXR1cm4gMDsKKwllbHNlCisJICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGVzIGVycm9yIGNoZWNraW5nIGZvciBjaG93biBjYWxsLgorICoKKyAqIFxwYXJhbSBwYXRoIHRvIGZpbGUuCisgKiBccGFyYW0gaWQgb2YgdGhlIG5ldyBvd25lci4KKyAqIFxwYXJhbSBpZCBvZiB0aGUgbmV3IGdyb3VwLgorICoKKyAqIFxyZXR1cm4gemVybyBpZiBzdWNjZXNzIG9yIC0xIGlmIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBDaGVja3MgZm9yIGZhaWx1cmUuIElmIGZhaWx1cmUgd2FzIGNhdXNlZCBieSBzaWduYWwgY2FsbCBjaG93biBhZ2Fpbi4KKyAqIElmIGFueSBvdGhlciBmYWlsdXJlIGhhcHBlbmVkIHRoZW4gaXQgd2lsbCBvdXRwdXQgZXJyb3IgbWVzYWdlIHVzaW5nCisgKiBkcm1Nc2coKSBjYWxsLgorICovCisjaWYgIWRlZmluZWQoVURFVikKK3N0YXRpYyBpbnQgY2hvd25fY2hlY2tfcmV0dXJuKGNvbnN0IGNoYXIgKnBhdGgsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCkKK3sKKwlpbnQgcnY7CisKKwlkbyB7CisJCXJ2ID0gY2hvd24ocGF0aCwgb3duZXIsIGdyb3VwKTsKKwl9IHdoaWxlIChydiAhPSAwICYmIGVycm5vID09IEVJTlRSKTsKKworCWlmIChydiA9PSAwKQorCQlyZXR1cm4gMDsKKworCWRybU1zZygiRmFpbGVkIHRvIGNoYW5nZSBvd25lciBvciBncm91cCBmb3IgZmlsZSAlcyEgJWQ6ICVzXG4iLAorCQkJcGF0aCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKKy8qKgorICogT3BlbiB0aGUgRFJNIGRldmljZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICoKKyAqIFxwYXJhbSBkZXYgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgb2YgdGhlIGRldmljZS4KKyAqIFxwYXJhbSBtaW5vciBtaW5vciBudW1iZXIgb2YgdGhlIGRldmljZS4KKyAqIAorICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgorICoKKyAqIFxpbnRlcm5hbAorICogQXNzZW1ibGVzIHRoZSBkZXZpY2UgbmFtZSBmcm9tIFxwIG1pbm9yIGFuZCBvcGVucyBpdCwgY3JlYXRpbmcgdGhlIGRldmljZQorICogc3BlY2lhbCBmaWxlIG5vZGUgd2l0aCB0aGUgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgc3BlY2lmaWVkIGJ5IFxwIGRldiBhbmQKKyAqIHBhcmVudCBkaXJlY3RvcnkgaWYgbmVjZXNzYXJ5IGFuZCB3YXMgY2FsbGVkIGJ5IHJvb3QuCisgKi8KK3N0YXRpYyBpbnQgZHJtT3BlbkRldmljZShkZXZfdCBkZXYsIGludCBtaW5vciwgaW50IHR5cGUpCit7CisgICAgc3RhdF90ICAgICAgICAgIHN0OworICAgIGNvbnN0IGNoYXIgICAgICAqZGV2X25hbWU7CisgICAgY2hhciAgICAgICAgICAgIGJ1Zls2NF07CisgICAgaW50ICAgICAgICAgICAgIGZkOworICAgIG1vZGVfdCAgICAgICAgICBkZXZtb2RlID0gRFJNX0RFVl9NT0RFLCBzZXJ2X21vZGU7CisgICAgZ2lkX3QgICAgICAgICAgIHNlcnZfZ3JvdXA7CisjaWYgIWRlZmluZWQoVURFVikKKyAgICBpbnQgICAgICAgICAgICAgaXNyb290ICA9ICFnZXRldWlkKCk7CisgICAgdWlkX3QgICAgICAgICAgIHVzZXIgICAgPSBEUk1fREVWX1VJRDsKKyAgICBnaWRfdCAgICAgICAgICAgZ3JvdXAgICA9IERSTV9ERVZfR0lEOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERSTV9OT0RFX1BSSU1BUlk6CisJICAgIGRldl9uYW1lID0gRFJNX0RFVl9OQU1FOworCSAgICBicmVhazsKKyAgICBjYXNlIERSTV9OT0RFX0NPTlRST0w6CisJICAgIGRldl9uYW1lID0gRFJNX0NPTlRST0xfREVWX05BTUU7CisJICAgIGJyZWFrOworICAgIGNhc2UgRFJNX05PREVfUkVOREVSOgorCSAgICBkZXZfbmFtZSA9IERSTV9SRU5ERVJfREVWX05BTUU7CisJICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJICAgIHJldHVybiAtRUlOVkFMOworICAgIH07CisKKyAgICBzcHJpbnRmKGJ1ZiwgZGV2X25hbWUsIERSTV9ESVJfTkFNRSwgbWlub3IpOworICAgIGRybU1zZygiZHJtT3BlbkRldmljZTogbm9kZSBuYW1lIGlzICVzXG4iLCBidWYpOworCisgICAgaWYgKGRybV9zZXJ2ZXJfaW5mbykgeworCWRybV9zZXJ2ZXJfaW5mby0+Z2V0X3Blcm1zKCZzZXJ2X2dyb3VwLCAmc2Vydl9tb2RlKTsKKwlkZXZtb2RlICA9IHNlcnZfbW9kZSA/IHNlcnZfbW9kZSA6IERSTV9ERVZfTU9ERTsKKwlkZXZtb2RlICY9IH4oU19JWFVTUnxTX0lYR1JQfFNfSVhPVEgpOworICAgIH0KKworI2lmICFkZWZpbmVkKFVERVYpCisgICAgaWYgKHN0YXQoRFJNX0RJUl9OQU1FLCAmc3QpKSB7CisJaWYgKCFpc3Jvb3QpCisJICAgIHJldHVybiBEUk1fRVJSX05PVF9ST09UOworCW1rZGlyKERSTV9ESVJfTkFNRSwgRFJNX0RFVl9ESVJNT0RFKTsKKwljaG93bl9jaGVja19yZXR1cm4oRFJNX0RJUl9OQU1FLCAwLCAwKTsgLyogcm9vdDpyb290ICovCisJY2htb2QoRFJNX0RJUl9OQU1FLCBEUk1fREVWX0RJUk1PREUpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBkZXZpY2Ugbm9kZSBleGlzdHMgYW5kIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkuICovCisgICAgaWYgKHN0YXQoYnVmLCAmc3QpKSB7CisJaWYgKCFpc3Jvb3QpCisJICAgIHJldHVybiBEUk1fRVJSX05PVF9ST09UOworCXJlbW92ZShidWYpOworCW1rbm9kKGJ1ZiwgU19JRkNIUiB8IGRldm1vZGUsIGRldik7CisgICAgfQorCisgICAgaWYgKGRybV9zZXJ2ZXJfaW5mbykgeworCWdyb3VwID0gKHNlcnZfZ3JvdXAgPj0gMCkgPyBzZXJ2X2dyb3VwIDogRFJNX0RFVl9HSUQ7CisJY2hvd25fY2hlY2tfcmV0dXJuKGJ1ZiwgdXNlciwgZ3JvdXApOworCWNobW9kKGJ1ZiwgZGV2bW9kZSk7CisgICAgfQorI2Vsc2UKKyAgICAvKiBpZiB3ZSBtb2Rwcm9iZWQgdGhlbiB3YWl0IGZvciB1ZGV2ICovCisgICAgeworCWludCB1ZGV2X2NvdW50ID0gMDsKK3dhaXRfZm9yX3VkZXY6CisgICAgICAgIGlmIChzdGF0KERSTV9ESVJfTkFNRSwgJnN0KSkgeworCQl1c2xlZXAoMjApOworCQl1ZGV2X2NvdW50Kys7CisKKwkJaWYgKHVkZXZfY291bnQgPT0gNTApCisJCQlyZXR1cm4gLTE7CisJCWdvdG8gd2FpdF9mb3JfdWRldjsKKwl9CisKKyAgICAJaWYgKHN0YXQoYnVmLCAmc3QpKSB7CisJCXVzbGVlcCgyMCk7CisJCXVkZXZfY291bnQrKzsKKworCQlpZiAodWRldl9jb3VudCA9PSA1MCkKKwkJCXJldHVybiAtMTsKKwkJZ290byB3YWl0X2Zvcl91ZGV2OworICAgIAl9CisgICAgfQorI2VuZGlmCisKKyAgICBmZCA9IG9wZW4oYnVmLCBPX1JEV1IsIDApOworICAgIGRybU1zZygiZHJtT3BlbkRldmljZTogb3BlbiByZXN1bHQgaXMgJWQsICglcylcbiIsCisJCWZkLCBmZCA8IDAgPyBzdHJlcnJvcihlcnJubykgOiAiT0siKTsKKyAgICBpZiAoZmQgPj0gMCkKKwlyZXR1cm4gZmQ7CisKKyNpZiAhZGVmaW5lZChVREVWKQorICAgIC8qIENoZWNrIGlmIHRoZSBkZXZpY2Ugbm9kZSBpcyBub3Qgd2hhdCB3ZSBleHBlY3QgaXQgdG8gYmUsIGFuZCByZWNyZWF0ZSBpdAorICAgICAqIGFuZCB0cnkgYWdhaW4gaWYgc28uCisgICAgICovCisgICAgaWYgKHN0LnN0X3JkZXYgIT0gZGV2KSB7CisJaWYgKCFpc3Jvb3QpCisJICAgIHJldHVybiBEUk1fRVJSX05PVF9ST09UOworCXJlbW92ZShidWYpOworCW1rbm9kKGJ1ZiwgU19JRkNIUiB8IGRldm1vZGUsIGRldik7CisJaWYgKGRybV9zZXJ2ZXJfaW5mbykgeworCSAgICBjaG93bl9jaGVja19yZXR1cm4oYnVmLCB1c2VyLCBncm91cCk7CisJICAgIGNobW9kKGJ1ZiwgZGV2bW9kZSk7CisJfQorICAgIH0KKyAgICBmZCA9IG9wZW4oYnVmLCBPX1JEV1IsIDApOworICAgIGRybU1zZygiZHJtT3BlbkRldmljZTogb3BlbiByZXN1bHQgaXMgJWQsICglcylcbiIsCisJCWZkLCBmZCA8IDAgPyBzdHJlcnJvcihlcnJubykgOiAiT0siKTsKKyAgICBpZiAoZmQgPj0gMCkKKwlyZXR1cm4gZmQ7CisKKyAgICBkcm1Nc2coImRybU9wZW5EZXZpY2U6IE9wZW4gZmFpbGVkXG4iKTsKKyAgICByZW1vdmUoYnVmKTsKKyNlbmRpZgorICAgIHJldHVybiAtZXJybm87Cit9CisKKworLyoqCisgKiBPcGVuIHRoZSBEUk0gZGV2aWNlCisgKgorICogXHBhcmFtIG1pbm9yIGRldmljZSBtaW5vciBudW1iZXIuCisgKiBccGFyYW0gY3JlYXRlIGFsbG93IHRvIGNyZWF0ZSB0aGUgZGV2aWNlIGlmIHNldC4KKyAqCisgKiBccmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKiAKKyAqIFxpbnRlcm5hbAorICogQ2FsbHMgZHJtT3BlbkRldmljZSgpIGlmIFxwIGNyZWF0ZSBpcyBzZXQsIG90aGVyd2lzZSBhc3NlbWJsZXMgdGhlIGRldmljZQorICogbmFtZSBmcm9tIFxwIG1pbm9yIGFuZCBvcGVucyBpdC4KKyAqLworc3RhdGljIGludCBkcm1PcGVuTWlub3IoaW50IG1pbm9yLCBpbnQgY3JlYXRlLCBpbnQgdHlwZSkKK3sKKyAgICBpbnQgIGZkOworICAgIGNoYXIgYnVmWzY0XTsKKyAgICBjb25zdCBjaGFyICpkZXZfbmFtZTsKKyAgICAKKyAgICBpZiAoY3JlYXRlKQorCXJldHVybiBkcm1PcGVuRGV2aWNlKG1ha2VkZXYoRFJNX01BSk9SLCBtaW5vciksIG1pbm9yLCB0eXBlKTsKKyAgICAKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERSTV9OT0RFX1BSSU1BUlk6CisJICAgIGRldl9uYW1lID0gRFJNX0RFVl9OQU1FOworCSAgICBicmVhazsKKyAgICBjYXNlIERSTV9OT0RFX0NPTlRST0w6CisJICAgIGRldl9uYW1lID0gRFJNX0NPTlRST0xfREVWX05BTUU7CisJICAgIGJyZWFrOworICAgIGNhc2UgRFJNX05PREVfUkVOREVSOgorCSAgICBkZXZfbmFtZSA9IERSTV9SRU5ERVJfREVWX05BTUU7CisJICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJICAgIHJldHVybiAtRUlOVkFMOworICAgIH07CisKKyAgICBzcHJpbnRmKGJ1ZiwgZGV2X25hbWUsIERSTV9ESVJfTkFNRSwgbWlub3IpOworICAgIGlmICgoZmQgPSBvcGVuKGJ1ZiwgT19SRFdSLCAwKSkgPj0gMCkKKwlyZXR1cm4gZmQ7CisgICAgcmV0dXJuIC1lcnJubzsKK30KKworCisvKioKKyAqIERldGVybWluZSB3aGV0aGVyIHRoZSBEUk0ga2VybmVsIGRyaXZlciBoYXMgYmVlbiBsb2FkZWQuCisgKiAKKyAqIFxyZXR1cm4gMSBpZiB0aGUgRFJNIGRyaXZlciBpcyBsb2FkZWQsIDAgb3RoZXJ3aXNlLgorICoKKyAqIFxpbnRlcm5hbCAKKyAqIERldGVybWluZSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGtlcm5lbCBkcml2ZXIgYnkgYXR0ZW1wdGluZyB0byBvcGVuIHRoZSAwCisgKiBtaW5vciBhbmQgZ2V0IHZlcnNpb24gaW5mb3JtYXRpb24uICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCisgKiBMaW51eCBpbXBsZW1lbnRhdGlvbnMsIC9wcm9jL2RyaSBpcyBhbHNvIGNoZWNrZWQuCisgKi8KK2ludCBkcm1BdmFpbGFibGUodm9pZCkKK3sKKyAgICBkcm1WZXJzaW9uUHRyIHZlcnNpb247CisgICAgaW50ICAgICAgICAgICByZXR2YWwgPSAwOworICAgIGludCAgICAgICAgICAgZmQ7CisKKyAgICBpZiAoKGZkID0gZHJtT3Blbk1pbm9yKDAsIDEsIERSTV9OT0RFX1BSSU1BUlkpKSA8IDApIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkvKiBUcnkgcHJvYyBmb3IgYmFja3dhcmQgTGludXggY29tcGF0aWJpbGl0eSAqLworCWlmICghYWNjZXNzKCIvcHJvYy9kcmkvMCIsIFJfT0spKQorCSAgICByZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBpZiAoKHZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKGZkKSkpIHsKKwlyZXR2YWwgPSAxOworCWRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworICAgIH0KKyAgICBjbG9zZShmZCk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGRybUdldE1pbm9yQmFzZShpbnQgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERSTV9OT0RFX1BSSU1BUlk6CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgRFJNX05PREVfQ09OVFJPTDoKKyAgICAgICAgcmV0dXJuIDY0OworICAgIGNhc2UgRFJNX05PREVfUkVOREVSOgorICAgICAgICByZXR1cm4gMTI4OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9OworfQorCitzdGF0aWMgaW50IGRybUdldE1pbm9yVHlwZShpbnQgbWlub3IpCit7CisgICAgaW50IHR5cGUgPSBtaW5vciA+PiA2OworCisgICAgaWYgKG1pbm9yIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBEUk1fTk9ERV9QUklNQVJZOgorICAgIGNhc2UgRFJNX05PREVfQ09OVFJPTDoKKyAgICBjYXNlIERSTV9OT0RFX1JFTkRFUjoKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRybUdldE1pbm9yTmFtZShpbnQgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERSTV9OT0RFX1BSSU1BUlk6CisgICAgICAgIHJldHVybiAiY2FyZCI7CisgICAgY2FzZSBEUk1fTk9ERV9DT05UUk9MOgorICAgICAgICByZXR1cm4gImNvbnRyb2xEIjsKKyAgICBjYXNlIERSTV9OT0RFX1JFTkRFUjoKKyAgICAgICAgcmV0dXJuICJyZW5kZXJEIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKy8qKgorICogT3BlbiB0aGUgZGV2aWNlIGJ5IGJ1cyBJRC4KKyAqCisgKiBccGFyYW0gYnVzaWQgYnVzIElELgorICogXHBhcmFtIHR5cGUgZGV2aWNlIG5vZGUgdHlwZS4KKyAqCisgKiBccmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIG9wZW4gZXZlcnkgcG9zc2libGUgbWlub3IgKHVwIHRvIERSTV9NQVhfTUlOT1IpLAorICogY29tcGFyaW5nIHRoZSBkZXZpY2UgYnVzIElEIHdpdGggdGhlIG9uZSBzdXBwbGllZC4KKyAqCisgKiBcc2EgZHJtT3Blbk1pbm9yKCkgYW5kIGRybUdldEJ1c2lkKCkuCisgKi8KK3N0YXRpYyBpbnQgZHJtT3BlbkJ5QnVzaWQoY29uc3QgY2hhciAqYnVzaWQsIGludCB0eXBlKQoreworICAgIGludCAgICAgICAgaSwgcGNpX2RvbWFpbl9vayA9IDE7CisgICAgaW50ICAgICAgICBmZDsKKyAgICBjb25zdCBjaGFyICpidWY7CisgICAgZHJtU2V0VmVyc2lvbiBzdjsKKyAgICBpbnQgICAgICAgIGJhc2UgPSBkcm1HZXRNaW5vckJhc2UodHlwZSk7CisKKyAgICBpZiAoYmFzZSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGRybU1zZygiZHJtT3BlbkJ5QnVzaWQ6IFNlYXJjaGluZyBmb3IgQnVzSUQgJXNcbiIsIGJ1c2lkKTsKKyAgICBmb3IgKGkgPSBiYXNlOyBpIDwgYmFzZSArIERSTV9NQVhfTUlOT1I7IGkrKykgeworCWZkID0gZHJtT3Blbk1pbm9yKGksIDEsIHR5cGUpOworCWRybU1zZygiZHJtT3BlbkJ5QnVzaWQ6IGRybU9wZW5NaW5vciByZXR1cm5zICVkXG4iLCBmZCk7CisJaWYgKGZkID49IDApIHsKKwkgICAgLyogV2UgbmVlZCB0byB0cnkgZm9yIDEuNCBmaXJzdCBmb3IgcHJvcGVyIFBDSSBkb21haW4gc3VwcG9ydAorCSAgICAgKiBhbmQgaWYgdGhhdCBmYWlscywgd2Uga25vdyB0aGUga2VybmVsIGlzIGJ1c3RlZAorCSAgICAgKi8KKwkgICAgc3YuZHJtX2RpX21ham9yID0gMTsKKwkgICAgc3YuZHJtX2RpX21pbm9yID0gNDsKKwkgICAgc3YuZHJtX2RkX21ham9yID0gLTE7CS8qIERvbid0IGNhcmUgKi8KKwkgICAgc3YuZHJtX2RkX21pbm9yID0gLTE7CS8qIERvbid0IGNhcmUgKi8KKwkgICAgaWYgKGRybVNldEludGVyZmFjZVZlcnNpb24oZmQsICZzdikpIHsKKyNpZm5kZWYgX19hbHBoYV9fCisJCXBjaV9kb21haW5fb2sgPSAwOworI2VuZGlmCisJCXN2LmRybV9kaV9tYWpvciA9IDE7CisJCXN2LmRybV9kaV9taW5vciA9IDE7CisJCXN2LmRybV9kZF9tYWpvciA9IC0xOyAgICAgICAvKiBEb24ndCBjYXJlICovCisJCXN2LmRybV9kZF9taW5vciA9IC0xOyAgICAgICAvKiBEb24ndCBjYXJlICovCisJCWRybU1zZygiZHJtT3BlbkJ5QnVzaWQ6IEludGVyZmFjZSAxLjQgZmFpbGVkLCB0cnlpbmcgMS4xXG4iKTsKKwkJZHJtU2V0SW50ZXJmYWNlVmVyc2lvbihmZCwgJnN2KTsKKwkgICAgfQorCSAgICBidWYgPSBkcm1HZXRCdXNpZChmZCk7CisJICAgIGRybU1zZygiZHJtT3BlbkJ5QnVzaWQ6IGRybUdldEJ1c2lkIHJlcG9ydHMgJXNcbiIsIGJ1Zik7CisJICAgIGlmIChidWYgJiYgZHJtTWF0Y2hCdXNJRChidWYsIGJ1c2lkLCBwY2lfZG9tYWluX29rKSkgeworCQlkcm1GcmVlQnVzaWQoYnVmKTsKKwkJcmV0dXJuIGZkOworCSAgICB9CisJICAgIGlmIChidWYpCisJCWRybUZyZWVCdXNpZChidWYpOworCSAgICBjbG9zZShmZCk7CisJfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBPcGVuIHRoZSBkZXZpY2UgYnkgbmFtZS4KKyAqCisgKiBccGFyYW0gbmFtZSBkcml2ZXIgbmFtZS4KKyAqIFxwYXJhbSB0eXBlIHRoZSBkZXZpY2Ugbm9kZSB0eXBlLgorICogCisgKiBccmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZmlyc3QgbWlub3IgbnVtYmVyIHRoYXQgbWF0Y2hlcyB0aGUgZHJpdmVyIG5hbWUgYW5kCisgKiBpc24ndCBhbHJlYWR5IGluIHVzZS4gIElmIGl0J3MgaW4gdXNlIGl0IHRoZW4gaXQgd2lsbCBhbHJlYWR5IGhhdmUgYSBidXMgSUQKKyAqIGFzc2lnbmVkLgorICogCisgKiBcc2EgZHJtT3Blbk1pbm9yKCksIGRybUdldFZlcnNpb24oKSBhbmQgZHJtR2V0QnVzaWQoKS4KKyAqLworc3RhdGljIGludCBkcm1PcGVuQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCB0eXBlKQoreworICAgIGludCAgICAgICAgICAgaTsKKyAgICBpbnQgICAgICAgICAgIGZkOworICAgIGRybVZlcnNpb25QdHIgdmVyc2lvbjsKKyAgICBjaGFyICogICAgICAgIGlkOworICAgIGludCAgICAgICAgICAgYmFzZSA9IGRybUdldE1pbm9yQmFzZSh0eXBlKTsKKworICAgIGlmIChiYXNlIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiBPcGVuIHRoZSBmaXJzdCBtaW5vciBudW1iZXIgdGhhdCBtYXRjaGVzIHRoZSBkcml2ZXIgbmFtZSBhbmQgaXNuJ3QKKyAgICAgKiBhbHJlYWR5IGluIHVzZS4gIElmIGl0J3MgaW4gdXNlIGl0IHdpbGwgaGF2ZSBhIGJ1c2lkIGFzc2lnbmVkIGFscmVhZHkuCisgICAgICovCisgICAgZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyBEUk1fTUFYX01JTk9SOyBpKyspIHsKKwlpZiAoKGZkID0gZHJtT3Blbk1pbm9yKGksIDEsIHR5cGUpKSA+PSAwKSB7CisJICAgIGlmICgodmVyc2lvbiA9IGRybUdldFZlcnNpb24oZmQpKSkgeworCQlpZiAoIXN0cmNtcCh2ZXJzaW9uLT5uYW1lLCBuYW1lKSkgeworCQkgICAgZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisJCSAgICBpZCA9IGRybUdldEJ1c2lkKGZkKTsKKwkJICAgIGRybU1zZygiZHJtR2V0QnVzaWQgcmV0dXJuZWQgJyVzJ1xuIiwgaWQgPyBpZCA6ICJOVUxMIik7CisJCSAgICBpZiAoIWlkIHx8ICEqaWQpIHsKKwkJCWlmIChpZCkKKwkJCSAgICBkcm1GcmVlQnVzaWQoaWQpOworCQkJcmV0dXJuIGZkOworCQkgICAgfSBlbHNlIHsKKwkJCWRybUZyZWVCdXNpZChpZCk7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBkcm1GcmVlVmVyc2lvbih2ZXJzaW9uKTsKKwkJfQorCSAgICB9CisJICAgIGNsb3NlKGZkKTsKKwl9CisgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgLyogQmFja3dhcmQtY29tcGF0aWJpbGl0eSAvcHJvYyBzdXBwb3J0ICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCWNoYXIgcHJvY19uYW1lWzY0XSwgYnVmWzUxMl07CisJY2hhciAqZHJpdmVyLCAqcHQsICpkZXZzdHJpbmc7CisJaW50ICByZXRjb2RlOworCQorCXNwcmludGYocHJvY19uYW1lLCAiL3Byb2MvZHJpLyVkL25hbWUiLCBpKTsKKwlpZiAoKGZkID0gb3Blbihwcm9jX25hbWUsIDAsIDApKSA+PSAwKSB7CisJICAgIHJldGNvZGUgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpLTEpOworCSAgICBjbG9zZShmZCk7CisJICAgIGlmIChyZXRjb2RlKSB7CisJCWJ1ZltyZXRjb2RlLTFdID0gJ1wwJzsKKwkJZm9yIChkcml2ZXIgPSBwdCA9IGJ1ZjsgKnB0ICYmICpwdCAhPSAnICc7ICsrcHQpCisJCSAgICA7CisJCWlmICgqcHQpIHsgLyogRGV2aWNlIGlzIG5leHQgKi8KKwkJICAgICpwdCA9ICdcMCc7CisJCSAgICBpZiAoIXN0cmNtcChkcml2ZXIsIG5hbWUpKSB7IC8qIE1hdGNoICovCisJCQlmb3IgKGRldnN0cmluZyA9ICsrcHQ7ICpwdCAmJiAqcHQgIT0gJyAnOyArK3B0KQorCQkJICAgIDsKKwkJCWlmICgqcHQpIHsgLyogRm91bmQgYnVzaWQgKi8KKwkJCSAgICByZXR1cm4gZHJtT3BlbkJ5QnVzaWQoKytwdCwgdHlwZSk7CisJCQl9IGVsc2UgeyAvKiBObyBidXNpZCAqLworCQkJICAgIHJldHVybiBkcm1PcGVuRGV2aWNlKHN0cnRvbChkZXZzdHJpbmcsIE5VTEwsIDApLGksIHR5cGUpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBPcGVuIHRoZSBEUk0gZGV2aWNlLgorICoKKyAqIExvb2tzIHVwIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYnVzIElELCBhbmQgb3BlbnMgdGhlIGRldmljZSBmb3VuZC4gIFRoZQorICogZW50cnkgaW4gL2Rldi9kcmkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkgYW5kIGlmIGNhbGxlZCBieSByb290LgorICoKKyAqIFxwYXJhbSBuYW1lIGRyaXZlciBuYW1lLiBOb3QgcmVmZXJlbmNlZCBpZiBidXMgSUQgaXMgc3VwcGxpZWQuCisgKiBccGFyYW0gYnVzaWQgYnVzIElELiBaZXJvIGlmIG5vdCBrbm93bi4KKyAqIAorICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgorICogCisgKiBcaW50ZXJuYWwKKyAqIEl0IGNhbGxzIGRybU9wZW5CeUJ1c2lkKCkgaWYgXHAgYnVzaWQgaXMgc3BlY2lmaWVkIG9yIGRybU9wZW5CeU5hbWUoKQorICogb3RoZXJ3aXNlLgorICovCitpbnQgZHJtT3Blbihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpidXNpZCkKK3sKKyAgICByZXR1cm4gZHJtT3BlbldpdGhUeXBlKG5hbWUsIGJ1c2lkLCBEUk1fTk9ERV9QUklNQVJZKTsKK30KKworLyoqCisgKiBPcGVuIHRoZSBEUk0gZGV2aWNlIHdpdGggc3BlY2lmaWVkIHR5cGUuCisgKgorICogTG9va3MgdXAgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBidXMgSUQsIGFuZCBvcGVucyB0aGUgZGV2aWNlIGZvdW5kLiAgVGhlCisgKiBlbnRyeSBpbiAvZGV2L2RyaSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeSBhbmQgaWYgY2FsbGVkIGJ5IHJvb3QuCisgKgorICogXHBhcmFtIG5hbWUgZHJpdmVyIG5hbWUuIE5vdCByZWZlcmVuY2VkIGlmIGJ1cyBJRCBpcyBzdXBwbGllZC4KKyAqIFxwYXJhbSBidXNpZCBidXMgSUQuIFplcm8gaWYgbm90IGtub3duLgorICogXHBhcmFtIHR5cGUgdGhlIGRldmljZSBub2RlIHR5cGUgdG8gb3BlbiwgUFJJTUFSWSwgQ09OVFJPTCBvciBSRU5ERVIKKyAqCisgKiBccmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKgorICogXGludGVybmFsCisgKiBJdCBjYWxscyBkcm1PcGVuQnlCdXNpZCgpIGlmIFxwIGJ1c2lkIGlzIHNwZWNpZmllZCBvciBkcm1PcGVuQnlOYW1lKCkKKyAqIG90aGVyd2lzZS4KKyAqLworaW50IGRybU9wZW5XaXRoVHlwZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpidXNpZCwgaW50IHR5cGUpCit7CisgICAgaWYgKCFkcm1BdmFpbGFibGUoKSAmJiBuYW1lICE9IE5VTEwgJiYgZHJtX3NlcnZlcl9pbmZvKSB7CisJLyogdHJ5IHRvIGxvYWQgdGhlIGtlcm5lbCBtb2R1bGUgKi8KKwlpZiAoIWRybV9zZXJ2ZXJfaW5mby0+bG9hZF9tb2R1bGUobmFtZSkpIHsKKwkgICAgZHJtTXNnKCJbZHJtXSBmYWlsZWQgdG8gbG9hZCBrZXJuZWwgbW9kdWxlIFwiJXNcIlxuIiwgbmFtZSk7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgaWYgKGJ1c2lkKSB7CisJaW50IGZkID0gZHJtT3BlbkJ5QnVzaWQoYnVzaWQsIHR5cGUpOworCWlmIChmZCA+PSAwKQorCSAgICByZXR1cm4gZmQ7CisgICAgfQorICAgIAorICAgIGlmIChuYW1lKQorCXJldHVybiBkcm1PcGVuQnlOYW1lKG5hbWUsIHR5cGUpOworCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgZHJtT3BlbkNvbnRyb2woaW50IG1pbm9yKQoreworICAgIHJldHVybiBkcm1PcGVuTWlub3IobWlub3IsIDAsIERSTV9OT0RFX0NPTlRST0wpOworfQorCitpbnQgZHJtT3BlblJlbmRlcihpbnQgbWlub3IpCit7CisgICAgcmV0dXJuIGRybU9wZW5NaW5vcihtaW5vciwgMCwgRFJNX05PREVfUkVOREVSKTsKK30KKworLyoqCisgKiBGcmVlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IGRybUdldFZlcnNpb24oKS4KKyAqCisgKiBccGFyYW0gdiBwb2ludGVyIHRvIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICoKKyAqIFxpbnRlcm5hbAorICogSXQgZnJlZXMgdGhlIG1lbW9yeSBwb2ludGVkIGJ5IFxwICV2IGFzIHdlbGwgYXMgYWxsIHRoZSBub24tbnVsbCBzdHJpbmdzCisgKiBwb2ludGVycyBpbiBpdC4KKyAqLwordm9pZCBkcm1GcmVlVmVyc2lvbihkcm1WZXJzaW9uUHRyIHYpCit7CisgICAgaWYgKCF2KQorCXJldHVybjsKKyAgICBkcm1GcmVlKHYtPm5hbWUpOworICAgIGRybUZyZWUodi0+ZGF0ZSk7CisgICAgZHJtRnJlZSh2LT5kZXNjKTsKKyAgICBkcm1GcmVlKHYpOworfQorCisKKy8qKgorICogRnJlZSB0aGUgbm9uLXB1YmxpYyB2ZXJzaW9uIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBrZXJuZWwuCisgKgorICogXHBhcmFtIHYgcG9pbnRlciB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFVzZWQgYnkgZHJtR2V0VmVyc2lvbigpIHRvIGZyZWUgdGhlIG1lbW9yeSBwb2ludGVkIGJ5IFxwICV2IGFzIHdlbGwgYXMgYWxsCisgKiB0aGUgbm9uLW51bGwgc3RyaW5ncyBwb2ludGVycyBpbiBpdC4KKyAqLworc3RhdGljIHZvaWQgZHJtRnJlZUtlcm5lbFZlcnNpb24oZHJtX3ZlcnNpb25fdCAqdikKK3sKKyAgICBpZiAoIXYpCisJcmV0dXJuOworICAgIGRybUZyZWUodi0+bmFtZSk7CisgICAgZHJtRnJlZSh2LT5kYXRlKTsKKyAgICBkcm1GcmVlKHYtPmRlc2MpOworICAgIGRybUZyZWUodik7Cit9CisKKworLyoqCisgKiBDb3B5IHZlcnNpb24gaW5mb3JtYXRpb24uCisgKiAKKyAqIFxwYXJhbSBkIGRlc3RpbmF0aW9uIHBvaW50ZXIuCisgKiBccGFyYW0gcyBzb3VyY2UgcG9pbnRlci4KKyAqIAorICogXGludGVybmFsCisgKiBVc2VkIGJ5IGRybUdldFZlcnNpb24oKSB0byB0cmFuc2xhdGUgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBpb2N0bAorICogaW50ZXJmYWNlIGluIGEgcHJpdmF0ZSBzdHJ1Y3R1cmUgaW50byB0aGUgcHVibGljIHN0cnVjdHVyZSBjb3VudGVycGFydC4KKyAqLworc3RhdGljIHZvaWQgZHJtQ29weVZlcnNpb24oZHJtVmVyc2lvblB0ciBkLCBjb25zdCBkcm1fdmVyc2lvbl90ICpzKQoreworICAgIGQtPnZlcnNpb25fbWFqb3IgICAgICA9IHMtPnZlcnNpb25fbWFqb3I7CisgICAgZC0+dmVyc2lvbl9taW5vciAgICAgID0gcy0+dmVyc2lvbl9taW5vcjsKKyAgICBkLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBzLT52ZXJzaW9uX3BhdGNobGV2ZWw7CisgICAgZC0+bmFtZV9sZW4gICAgICAgICAgID0gcy0+bmFtZV9sZW47CisgICAgZC0+bmFtZSAgICAgICAgICAgICAgID0gc3RyZHVwKHMtPm5hbWUpOworICAgIGQtPmRhdGVfbGVuICAgICAgICAgICA9IHMtPmRhdGVfbGVuOworICAgIGQtPmRhdGUgICAgICAgICAgICAgICA9IHN0cmR1cChzLT5kYXRlKTsKKyAgICBkLT5kZXNjX2xlbiAgICAgICAgICAgPSBzLT5kZXNjX2xlbjsKKyAgICBkLT5kZXNjICAgICAgICAgICAgICAgPSBzdHJkdXAocy0+ZGVzYyk7Cit9CisKKworLyoqCisgKiBRdWVyeSB0aGUgZHJpdmVyIHZlcnNpb24gaW5mb3JtYXRpb24uCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogXHJldHVybiBwb2ludGVyIHRvIGEgZHJtVmVyc2lvbiBzdHJ1Y3R1cmUgd2hpY2ggc2hvdWxkIGJlIGZyZWVkIHdpdGgKKyAqIGRybUZyZWVWZXJzaW9uKCkuCisgKiAKKyAqIFxub3RlIFNpbWlsYXIgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHZpYSAvcHJvYy9kcmkuCisgKiAKKyAqIFxpbnRlcm5hbAorICogSXQgZ2V0cyB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiB2aWEgc3VjY2Vzc2l2ZSBEUk1fSU9DVExfVkVSU0lPTiBpb2N0bHMsCisgKiBmaXJzdCB3aXRoIHplcm9zIHRvIGdldCB0aGUgc3RyaW5nIGxlbmd0aHMsIGFuZCB0aGVuIHRoZSBhY3R1YWxseSBzdHJpbmdzLgorICogSXQgYWxzbyBudWxsLXRlcm1pbmF0ZXMgdGhlbSBzaW5jZSB0aGV5IG1pZ2h0IG5vdCBiZSBhbHJlYWR5LgorICovCitkcm1WZXJzaW9uUHRyIGRybUdldFZlcnNpb24oaW50IGZkKQoreworICAgIGRybVZlcnNpb25QdHIgcmV0dmFsOworICAgIGRybV92ZXJzaW9uX3QgKnZlcnNpb24gPSBkcm1NYWxsb2Moc2l6ZW9mKCp2ZXJzaW9uKSk7CisKKyAgICBtZW1jbGVhcigqdmVyc2lvbik7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9WRVJTSU9OLCB2ZXJzaW9uKSkgeworCWRybUZyZWVLZXJuZWxWZXJzaW9uKHZlcnNpb24pOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICh2ZXJzaW9uLT5uYW1lX2xlbikKKwl2ZXJzaW9uLT5uYW1lICAgID0gZHJtTWFsbG9jKHZlcnNpb24tPm5hbWVfbGVuICsgMSk7CisgICAgaWYgKHZlcnNpb24tPmRhdGVfbGVuKQorCXZlcnNpb24tPmRhdGUgICAgPSBkcm1NYWxsb2ModmVyc2lvbi0+ZGF0ZV9sZW4gKyAxKTsKKyAgICBpZiAodmVyc2lvbi0+ZGVzY19sZW4pCisJdmVyc2lvbi0+ZGVzYyAgICA9IGRybU1hbGxvYyh2ZXJzaW9uLT5kZXNjX2xlbiArIDEpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfVkVSU0lPTiwgdmVyc2lvbikpIHsKKwlkcm1Nc2coIkRSTV9JT0NUTF9WRVJTSU9OOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlkcm1GcmVlS2VybmVsVmVyc2lvbih2ZXJzaW9uKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBUaGUgcmVzdWx0cyBtaWdodCBub3QgYmUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MsIHNvIHRlcm1pbmF0ZSB0aGVtLiAqLworICAgIGlmICh2ZXJzaW9uLT5uYW1lX2xlbikgdmVyc2lvbi0+bmFtZVt2ZXJzaW9uLT5uYW1lX2xlbl0gPSAnXDAnOworICAgIGlmICh2ZXJzaW9uLT5kYXRlX2xlbikgdmVyc2lvbi0+ZGF0ZVt2ZXJzaW9uLT5kYXRlX2xlbl0gPSAnXDAnOworICAgIGlmICh2ZXJzaW9uLT5kZXNjX2xlbikgdmVyc2lvbi0+ZGVzY1t2ZXJzaW9uLT5kZXNjX2xlbl0gPSAnXDAnOworCisgICAgcmV0dmFsID0gZHJtTWFsbG9jKHNpemVvZigqcmV0dmFsKSk7CisgICAgZHJtQ29weVZlcnNpb24ocmV0dmFsLCB2ZXJzaW9uKTsKKyAgICBkcm1GcmVlS2VybmVsVmVyc2lvbih2ZXJzaW9uKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKgorICogR2V0IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEUk0gdXNlciBzcGFjZSBsaWJyYXJ5LgorICogCisgKiBUaGlzIHZlcnNpb24gbnVtYmVyIGlzIGRyaXZlciBpbmRlcGVuZGVudC4KKyAqIAorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIHZlcnNpb24gaW5mb3JtYXRpb24uCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW5kIGZpbGxzIGEgZHJtX3ZlcnNpb24gc3RydWN0dXJlIHdpdGggYSBoYXJkIGNvZGVkCisgKiB2ZXJzaW9uIG51bWJlci4KKyAqLworZHJtVmVyc2lvblB0ciBkcm1HZXRMaWJWZXJzaW9uKGludCBmZCkKK3sKKyAgICBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uID0gZHJtTWFsbG9jKHNpemVvZigqdmVyc2lvbikpOworCisgICAgLyogVmVyc2lvbiBoaXN0b3J5OgorICAgICAqICAgTk9URSBUSElTIE1VU1QgTk9UIEdPIEFCT1ZFIFZFUlNJT04gMS5YIGR1ZSB0byBkcml2ZXJzIG5lZWRpbmcgaXQKKyAgICAgKiAgIHJldmlzaW9uIDEuMC54ID0gb3JpZ2luYWwgRFJNIGludGVyZmFjZSB3aXRoIG5vIGRybUdldExpYlZlcnNpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZW50cnkgcG9pbnQgYW5kIG1hbnkgZHJtPERldmljZT4gZXh0ZW5zaW9ucworICAgICAqICAgcmV2aXNpb24gMS4xLnggPSBhZGRlZCBkcm1Db21tYW5kIGVudHJ5IHBvaW50cyBmb3IgZGV2aWNlIGV4dGVuc2lvbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYWRkZWQgZHJtR2V0TGliVmVyc2lvbiB0byBpZGVudGlmeSBsaWJkcm0uYSB2ZXJzaW9uCisgICAgICogICByZXZpc2lvbiAxLjIueCA9IGFkZGVkIGRybVNldEludGVyZmFjZVZlcnNpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgZHJtT3BlbiB0byBoYW5kbGUgYm90aCBidXNpZCBhbmQgbmFtZQorICAgICAqICAgcmV2aXNpb24gMS4zLnggPSBhZGRlZCBzZXJ2ZXIgKyBtZW1vcnkgbWFuYWdlcgorICAgICAqLworICAgIHZlcnNpb24tPnZlcnNpb25fbWFqb3IgICAgICA9IDE7CisgICAgdmVyc2lvbi0+dmVyc2lvbl9taW5vciAgICAgID0gMzsKKyAgICB2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSAwOworCisgICAgcmV0dXJuIChkcm1WZXJzaW9uUHRyKXZlcnNpb247Cit9CisKK2ludCBkcm1HZXRDYXAoaW50IGZkLCB1aW50NjRfdCBjYXBhYmlsaXR5LCB1aW50NjRfdCAqdmFsdWUpCit7CisJc3RydWN0IGRybV9nZXRfY2FwIGNhcDsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIoY2FwKTsKKwljYXAuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7CisKKwlyZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9DQVAsICZjYXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqdmFsdWUgPSBjYXAudmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TZXRDbGllbnRDYXAoaW50IGZkLCB1aW50NjRfdCBjYXBhYmlsaXR5LCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX3NldF9jbGllbnRfY2FwIGNhcDsKKworCW1lbWNsZWFyKGNhcCk7CisJY2FwLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5OworCWNhcC52YWx1ZSA9IHZhbHVlOworCisJcmV0dXJuIGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU0VUX0NMSUVOVF9DQVAsICZjYXApOworfQorCisvKioKKyAqIEZyZWUgdGhlIGJ1cyBJRCBpbmZvcm1hdGlvbi4KKyAqCisgKiBccGFyYW0gYnVzaWQgYnVzIElEIGluZm9ybWF0aW9uIHN0cmluZyBhcyBnaXZlbiBieSBkcm1HZXRCdXNpZCgpLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGZyZWVzIHRoZSBtZW1vcnkgcG9pbnRlZCBieSBccCBidXNpZC4KKyAqLwordm9pZCBkcm1GcmVlQnVzaWQoY29uc3QgY2hhciAqYnVzaWQpCit7CisgICAgZHJtRnJlZSgodm9pZCAqKWJ1c2lkKTsKK30KKworCisvKioKKyAqIEdldCB0aGUgYnVzIElEIG9mIHRoZSBkZXZpY2UuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIGJ1cyBJRCBzdHJpbmcuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGJ1cyBJRCB2aWEgc3VjY2Vzc2l2ZSBEUk1fSU9DVExfR0VUX1VOSVFVRSBpb2N0bHMgdG8KKyAqIGdldCB0aGUgc3RyaW5nIGxlbmd0aCBhbmQgZGF0YSwgcGFzc2luZyB0aGUgYXJndW1lbnRzIGluIGEgZHJtX3VuaXF1ZQorICogc3RydWN0dXJlLgorICovCitjaGFyICpkcm1HZXRCdXNpZChpbnQgZmQpCit7CisgICAgZHJtX3VuaXF1ZV90IHU7CisKKyAgICBtZW1jbGVhcih1KTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9VTklRVUUsICZ1KSkKKwlyZXR1cm4gTlVMTDsKKyAgICB1LnVuaXF1ZSA9IGRybU1hbGxvYyh1LnVuaXF1ZV9sZW4gKyAxKTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9HRVRfVU5JUVVFLCAmdSkpCisJcmV0dXJuIE5VTEw7CisgICAgdS51bmlxdWVbdS51bmlxdWVfbGVuXSA9ICdcMCc7CisKKyAgICByZXR1cm4gdS51bmlxdWU7Cit9CisKKworLyoqCisgKiBTZXQgdGhlIGJ1cyBJRCBvZiB0aGUgZGV2aWNlLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gYnVzaWQgYnVzIElEIHN0cmluZy4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX1NFVF9VTklRVUUgaW9jdGwsIHBhc3NpbmcKKyAqIHRoZSBhcmd1bWVudHMgaW4gYSBkcm1fdW5pcXVlIHN0cnVjdHVyZS4KKyAqLworaW50IGRybVNldEJ1c2lkKGludCBmZCwgY29uc3QgY2hhciAqYnVzaWQpCit7CisgICAgZHJtX3VuaXF1ZV90IHU7CisKKyAgICBtZW1jbGVhcih1KTsKKyAgICB1LnVuaXF1ZSAgICAgPSAoY2hhciAqKWJ1c2lkOworICAgIHUudW5pcXVlX2xlbiA9IHN0cmxlbihidXNpZCk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TRVRfVU5JUVVFLCAmdSkpIHsKKwlyZXR1cm4gLWVycm5vOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybUdldE1hZ2ljKGludCBmZCwgZHJtX21hZ2ljX3QgKiBtYWdpYykKK3sKKyAgICBkcm1fYXV0aF90IGF1dGg7CisKKyAgICBtZW1jbGVhcihhdXRoKTsKKworICAgICptYWdpYyA9IDA7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX01BR0lDLCAmYXV0aCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICAqbWFnaWMgPSBhdXRoLm1hZ2ljOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtQXV0aE1hZ2ljKGludCBmZCwgZHJtX21hZ2ljX3QgbWFnaWMpCit7CisgICAgZHJtX2F1dGhfdCBhdXRoOworCisgICAgbWVtY2xlYXIoYXV0aCk7CisgICAgYXV0aC5tYWdpYyA9IG1hZ2ljOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FVVEhfTUFHSUMsICZhdXRoKSkKKwlyZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFNwZWNpZmllcyBhIHJhbmdlIG9mIG1lbW9yeSB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgbWFwcGluZyBieSBhCisgKiBub24tcm9vdCBwcm9jZXNzLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gb2Zmc2V0IHVzdWFsbHkgdGhlIHBoeXNpY2FsIGFkZHJlc3MuIFRoZSBhY3R1YWwgbWVhbmluZyBkZXBlbmRzIG9mCisgKiB0aGUgXHAgdHlwZSBwYXJhbWV0ZXIuIFNlZSBiZWxvdy4KKyAqIFxwYXJhbSBzaXplIG9mIHRoZSBtZW1vcnkgaW4gYnl0ZXMuCisgKiBccGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBtZW1vcnkgdG8gYmUgbWFwcGVkLgorICogXHBhcmFtIGZsYWdzIGNvbWJpbmF0aW9uIG9mIHNldmVyYWwgZmxhZ3MgdG8gbW9kaWZ5IHRoZSBmdW5jdGlvbiBhY3Rpb25zLgorICogXHBhcmFtIGhhbmRsZSB3aWxsIGJlIHNldCB0byBhIHZhbHVlIHRoYXQgbWF5IGJlIHVzZWQgYXMgdGhlIG9mZnNldAorICogcGFyYW1ldGVyIGZvciBtbWFwKCkuCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKgorICogXHBhciBNYXBwaW5nIHRoZSBmcmFtZSBidWZmZXIKKyAqIEZvciB0aGUgZnJhbWUgYnVmZmVyCisgKiAtIFxwIG9mZnNldCB3aWxsIGJlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUgYnVmZmVyLAorICogLSBccCBzaXplIHdpbGwgYmUgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGJ1ZmZlciBpbiBieXRlcywgYW5kCisgKiAtIFxwIHR5cGUgd2lsbCBiZSBEUk1fRlJBTUVfQlVGRkVSLgorICoKKyAqIFxwYXIKKyAqIFRoZSBhcmVhIG1hcHBlZCB3aWxsIGJlIHVuY2FjaGVkLiBJZiBNVFJSIHN1cHBvcnQgaXMgYXZhaWxhYmxlIGluIHRoZQorICoga2VybmVsLCB0aGUgZnJhbWUgYnVmZmVyIGFyZWEgd2lsbCBiZSBzZXQgdG8gd3JpdGUgY29tYmluaW5nLiAKKyAqCisgKiBccGFyIE1hcHBpbmcgdGhlIE1NSU8gcmVnaXN0ZXIgYXJlYQorICogRm9yIHRoZSBNTUlPIHJlZ2lzdGVyIGFyZWEsCisgKiAtIFxwIG9mZnNldCB3aWxsIGJlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgcmVnaXN0ZXIgYXJlYSwKKyAqIC0gXHAgc2l6ZSB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSByZWdpc3RlciBhcmVhIGJ5dGVzLCBhbmQKKyAqIC0gXHAgdHlwZSB3aWxsIGJlIERSTV9SRUdJU1RFUlMuCisgKiBccGFyCisgKiBUaGUgYXJlYSBtYXBwZWQgd2lsbCBiZSB1bmNhY2hlZC4gCisgKiAKKyAqIFxwYXIgTWFwcGluZyB0aGUgU0FSRUEKKyAqIEZvciB0aGUgU0FSRUEsCisgKiAtIFxwIG9mZnNldCB3aWxsIGJlIGlnbm9yZWQgYW5kIHNob3VsZCBiZSBzZXQgdG8gemVybywKKyAqIC0gXHAgc2l6ZSB3aWxsIGJlIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIFNBUkVBIGluIGJ5dGVzLAorICogLSBccCB0eXBlIHdpbGwgYmUgRFJNX1NITS4KKyAqIAorICogXHBhcgorICogQSBzaGFyZWQgbWVtb3J5IGFyZWEgb2YgdGhlIHJlcXVlc3RlZCBzaXplIHdpbGwgYmUgY3JlYXRlZCBhbmQgbG9ja2VkIGluCisgKiBrZXJuZWwgbWVtb3J5LiBUaGlzIGFyZWEgbWF5IGJlIG1hcHBlZCBpbnRvIGNsaWVudC1zcGFjZSBieSB1c2luZyB0aGUgaGFuZGxlCisgKiByZXR1cm5lZC4gCisgKiAKKyAqIFxub3RlIE1heSBvbmx5IGJlIGNhbGxlZCBieSByb290LgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUREX01BUCBpb2N0bCwgcGFzc2luZworICogdGhlIGFyZ3VtZW50cyBpbiBhIGRybV9tYXAgc3RydWN0dXJlLgorICovCitpbnQgZHJtQWRkTWFwKGludCBmZCwgZHJtX2hhbmRsZV90IG9mZnNldCwgZHJtU2l6ZSBzaXplLCBkcm1NYXBUeXBlIHR5cGUsCisJICAgICAgZHJtTWFwRmxhZ3MgZmxhZ3MsIGRybV9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIGRybV9tYXBfdCBtYXA7CisKKyAgICBtZW1jbGVhcihtYXApOworICAgIG1hcC5vZmZzZXQgID0gb2Zmc2V0OworICAgIG1hcC5zaXplICAgID0gc2l6ZTsKKyAgICBtYXAudHlwZSAgICA9IHR5cGU7CisgICAgbWFwLmZsYWdzICAgPSBmbGFnczsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BRERfTUFQLCAmbWFwKSkKKwlyZXR1cm4gLWVycm5vOworICAgIGlmIChoYW5kbGUpCisJKmhhbmRsZSA9IChkcm1faGFuZGxlX3QpKHVpbnRwdHJfdCltYXAuaGFuZGxlOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtUm1NYXAoaW50IGZkLCBkcm1faGFuZGxlX3QgaGFuZGxlKQoreworICAgIGRybV9tYXBfdCBtYXA7CisKKyAgICBtZW1jbGVhcihtYXApOworICAgIG1hcC5oYW5kbGUgPSAodm9pZCAqKSh1aW50cHRyX3QpaGFuZGxlOworCisgICAgaWYoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9STV9NQVAsICZtYXApKQorCXJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogTWFrZSBidWZmZXJzIGF2YWlsYWJsZSBmb3IgRE1BIHRyYW5zZmVycy4KKyAqIAorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBjb3VudCBudW1iZXIgb2YgYnVmZmVycy4KKyAqIFxwYXJhbSBzaXplIHNpemUgb2YgZWFjaCBidWZmZXIuCisgKiBccGFyYW0gZmxhZ3MgYnVmZmVyIGFsbG9jYXRpb24gZmxhZ3MuCisgKiBccGFyYW0gYWdwX29mZnNldCBvZmZzZXQgaW4gdGhlIEFHUCBhcGVydHVyZSAKKyAqCisgKiBccmV0dXJuIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCwgbmVnYXRpdmUgb24gZXJyb3IuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgRFJNX0lPQ1RMX0FERF9CVUZTIGlvY3RsLgorICoKKyAqIFxzYSBkcm1fYnVmX2Rlc2MuCisgKi8KK2ludCBkcm1BZGRCdWZzKGludCBmZCwgaW50IGNvdW50LCBpbnQgc2l6ZSwgZHJtQnVmRGVzY0ZsYWdzIGZsYWdzLAorCSAgICAgICBpbnQgYWdwX29mZnNldCkKK3sKKyAgICBkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCisgICAgbWVtY2xlYXIocmVxdWVzdCk7CisgICAgcmVxdWVzdC5jb3VudCAgICAgPSBjb3VudDsKKyAgICByZXF1ZXN0LnNpemUgICAgICA9IHNpemU7CisgICAgcmVxdWVzdC5mbGFncyAgICAgPSBmbGFnczsKKyAgICByZXF1ZXN0LmFncF9zdGFydCA9IGFncF9vZmZzZXQ7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BRERfQlVGUywgJnJlcXVlc3QpKQorCXJldHVybiAtZXJybm87CisgICAgcmV0dXJuIHJlcXVlc3QuY291bnQ7Cit9CisKK2ludCBkcm1NYXJrQnVmcyhpbnQgZmQsIGRvdWJsZSBsb3csIGRvdWJsZSBoaWdoKQoreworICAgIGRybV9idWZfaW5mb190IGluZm87CisgICAgaW50ICAgICAgICAgICAgaTsKKworICAgIG1lbWNsZWFyKGluZm8pOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSU5GT19CVUZTLCAmaW5mbykpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIWluZm8uY291bnQpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIShpbmZvLmxpc3QgPSBkcm1NYWxsb2MoaW5mby5jb3VudCAqIHNpemVvZigqaW5mby5saXN0KSkpKQorCXJldHVybiAtRU5PTUVNOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSU5GT19CVUZTLCAmaW5mbykpIHsKKwlpbnQgcmV0dmFsID0gLWVycm5vOworCWRybUZyZWUoaW5mby5saXN0KTsKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLmNvdW50OyBpKyspIHsKKwlpbmZvLmxpc3RbaV0ubG93X21hcmsgID0gbG93ICAqIGluZm8ubGlzdFtpXS5jb3VudDsKKwlpbmZvLmxpc3RbaV0uaGlnaF9tYXJrID0gaGlnaCAqIGluZm8ubGlzdFtpXS5jb3VudDsKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NQVJLX0JVRlMsICZpbmZvLmxpc3RbaV0pKSB7CisJICAgIGludCByZXR2YWwgPSAtZXJybm87CisJICAgIGRybUZyZWUoaW5mby5saXN0KTsKKwkgICAgcmV0dXJuIHJldHZhbDsKKwl9CisgICAgfQorICAgIGRybUZyZWUoaW5mby5saXN0KTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEZyZWUgYnVmZmVycy4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGNvdW50IG51bWJlciBvZiBidWZmZXJzIHRvIGZyZWUuCisgKiBccGFyYW0gbGlzdCBsaXN0IG9mIGJ1ZmZlcnMgdG8gYmUgZnJlZWQuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqIAorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBwcmltYXJpbHkgdXNlZCBmb3IgZGVidWdnaW5nLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0ZSRUVfQlVGUyBpb2N0bCwgcGFzc2luZworICogdGhlIGFyZ3VtZW50cyBpbiBhIGRybV9idWZfZnJlZSBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1GcmVlQnVmcyhpbnQgZmQsIGludCBjb3VudCwgaW50ICpsaXN0KQoreworICAgIGRybV9idWZfZnJlZV90IHJlcXVlc3Q7CisKKyAgICBtZW1jbGVhcihyZXF1ZXN0KTsKKyAgICByZXF1ZXN0LmNvdW50ID0gY291bnQ7CisgICAgcmVxdWVzdC5saXN0ICA9IGxpc3Q7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfRlJFRV9CVUZTLCAmcmVxdWVzdCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIENsb3NlIHRoZSBkZXZpY2UuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKi8KK2ludCBkcm1DbG9zZShpbnQgZmQpCit7CisgICAgdW5zaWduZWQgbG9uZyBrZXkgICAgPSBkcm1HZXRLZXlGcm9tRmQoZmQpOworICAgIGRybUhhc2hFbnRyeSAgKmVudHJ5ID0gZHJtR2V0RW50cnkoZmQpOworCisgICAgZHJtSGFzaERlc3Ryb3koZW50cnktPnRhZ1RhYmxlKTsKKyAgICBlbnRyeS0+ZmQgICAgICAgPSAwOworICAgIGVudHJ5LT5mICAgICAgICA9IE5VTEw7CisgICAgZW50cnktPnRhZ1RhYmxlID0gTlVMTDsKKworICAgIGRybUhhc2hEZWxldGUoZHJtSGFzaFRhYmxlLCBrZXkpOworICAgIGRybUZyZWUoZW50cnkpOworCisgICAgcmV0dXJuIGNsb3NlKGZkKTsKK30KKworCisvKioKKyAqIE1hcCBhIHJlZ2lvbiBvZiBtZW1vcnkuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBoYW5kbGUgaGFuZGxlIHJldHVybmVkIGJ5IGRybUFkZE1hcCgpLgorICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcy4gTXVzdCBtYXRjaCB0aGUgc2l6ZSB1c2VkIGJ5IGRybUFkZE1hcCgpLgorICogXHBhcmFtIGFkZHJlc3Mgd2lsbCBjb250YWluIHRoZSB1c2VyLXNwYWNlIHZpcnR1YWwgYWRkcmVzcyB3aGVyZSB0aGUgbWFwcGluZworICogYmVnaW5zLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgZm9yIG1tYXAoKS4KKyAqLworaW50IGRybU1hcChpbnQgZmQsIGRybV9oYW5kbGVfdCBoYW5kbGUsIGRybVNpemUgc2l6ZSwgZHJtQWRkcmVzc1B0ciBhZGRyZXNzKQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2VzaXplX21hc2sgPSAwOworCisgICAgaWYgKGZkIDwgMCkKKwlyZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghcGFnZXNpemVfbWFzaykKKwlwYWdlc2l6ZV9tYXNrID0gZ2V0cGFnZXNpemUoKSAtIDE7CisKKyAgICBzaXplID0gKHNpemUgKyBwYWdlc2l6ZV9tYXNrKSAmIH5wYWdlc2l6ZV9tYXNrOworCisgICAgKmFkZHJlc3MgPSBkcm1fbW1hcCgwLCBzaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIGhhbmRsZSk7CisgICAgaWYgKCphZGRyZXNzID09IE1BUF9GQUlMRUQpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIFVubWFwIG1hcHBpbmdzIG9idGFpbmVkIHdpdGggZHJtTWFwKCkuCisgKgorICogXHBhcmFtIGFkZHJlc3MgYWRkcmVzcyBhcyBnaXZlbiBieSBkcm1NYXAoKS4KKyAqIFxwYXJhbSBzaXplIHNpemUgaW4gYnl0ZXMuIE11c3QgbWF0Y2ggdGhlIHNpemUgdXNlZCBieSBkcm1NYXAoKS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciBtdW5tYXAoKS4KKyAqLworaW50IGRybVVubWFwKGRybUFkZHJlc3MgYWRkcmVzcywgZHJtU2l6ZSBzaXplKQoreworICAgIHJldHVybiBkcm1fbXVubWFwKGFkZHJlc3MsIHNpemUpOworfQorCitkcm1CdWZJbmZvUHRyIGRybUdldEJ1ZkluZm8oaW50IGZkKQoreworICAgIGRybV9idWZfaW5mb190IGluZm87CisgICAgZHJtQnVmSW5mb1B0ciAgcmV0dmFsOworICAgIGludCAgICAgICAgICAgIGk7CisKKyAgICBtZW1jbGVhcihpbmZvKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0lORk9fQlVGUywgJmluZm8pKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKGluZm8uY291bnQpIHsKKwlpZiAoIShpbmZvLmxpc3QgPSBkcm1NYWxsb2MoaW5mby5jb3VudCAqIHNpemVvZigqaW5mby5saXN0KSkpKQorCSAgICByZXR1cm4gTlVMTDsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0lORk9fQlVGUywgJmluZm8pKSB7CisJICAgIGRybUZyZWUoaW5mby5saXN0KTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dmFsID0gZHJtTWFsbG9jKHNpemVvZigqcmV0dmFsKSk7CisJcmV0dmFsLT5jb3VudCA9IGluZm8uY291bnQ7CisJcmV0dmFsLT5saXN0ICA9IGRybU1hbGxvYyhpbmZvLmNvdW50ICogc2l6ZW9mKCpyZXR2YWwtPmxpc3QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby5jb3VudDsgaSsrKSB7CisJICAgIHJldHZhbC0+bGlzdFtpXS5jb3VudCAgICAgPSBpbmZvLmxpc3RbaV0uY291bnQ7CisJICAgIHJldHZhbC0+bGlzdFtpXS5zaXplICAgICAgPSBpbmZvLmxpc3RbaV0uc2l6ZTsKKwkgICAgcmV0dmFsLT5saXN0W2ldLmxvd19tYXJrICA9IGluZm8ubGlzdFtpXS5sb3dfbWFyazsKKwkgICAgcmV0dmFsLT5saXN0W2ldLmhpZ2hfbWFyayA9IGluZm8ubGlzdFtpXS5oaWdoX21hcms7CisJfQorCWRybUZyZWUoaW5mby5saXN0KTsKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBNYXAgYWxsIERNQSBidWZmZXJzIGludG8gY2xpZW50LXZpcnR1YWwgc3BhY2UuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIGEgcG9pbnRlciB0byBhIDo6ZHJtQnVmTWFwIHN0cnVjdHVyZS4KKyAqCisgKiBcbm90ZSBUaGUgY2xpZW50IG1heSBub3QgdXNlIHRoZXNlIGJ1ZmZlcnMgdW50aWwgb2J0YWluaW5nIGJ1ZmZlciBpbmRpY2VzCisgKiB3aXRoIGRybURNQSgpLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIERSTV9JT0NUTF9NQVBfQlVGUyBpb2N0bCBhbmQgY29waWVzIHRoZSByZXR1cm5lZAorICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJ1ZmZlcnMgaW4gYSBkcm1fYnVmX21hcCBzdHJ1Y3R1cmUgaW50byB0aGUKKyAqIGNsaWVudC12aXNpYmxlIGRhdGEgc3RydWN0dXJlcy4KKyAqLyAKK2RybUJ1Zk1hcFB0ciBkcm1NYXBCdWZzKGludCBmZCkKK3sKKyAgICBkcm1fYnVmX21hcF90IGJ1ZnM7CisgICAgZHJtQnVmTWFwUHRyICByZXR2YWw7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgbWVtY2xlYXIoYnVmcyk7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTUFQX0JVRlMsICZidWZzKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICghYnVmcy5jb3VudCkKKwlyZXR1cm4gTlVMTDsKKworCWlmICghKGJ1ZnMubGlzdCA9IGRybU1hbGxvYyhidWZzLmNvdW50ICogc2l6ZW9mKCpidWZzLmxpc3QpKSkpCisJICAgIHJldHVybiBOVUxMOworCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTUFQX0JVRlMsICZidWZzKSkgeworCSAgICBkcm1GcmVlKGJ1ZnMubGlzdCk7CisJICAgIHJldHVybiBOVUxMOworCX0KKworCXJldHZhbCA9IGRybU1hbGxvYyhzaXplb2YoKnJldHZhbCkpOworCXJldHZhbC0+Y291bnQgPSBidWZzLmNvdW50OworCXJldHZhbC0+bGlzdCAgPSBkcm1NYWxsb2MoYnVmcy5jb3VudCAqIHNpemVvZigqcmV0dmFsLT5saXN0KSk7CisJZm9yIChpID0gMDsgaSA8IGJ1ZnMuY291bnQ7IGkrKykgeworCSAgICByZXR2YWwtPmxpc3RbaV0uaWR4ICAgICA9IGJ1ZnMubGlzdFtpXS5pZHg7CisJICAgIHJldHZhbC0+bGlzdFtpXS50b3RhbCAgID0gYnVmcy5saXN0W2ldLnRvdGFsOworCSAgICByZXR2YWwtPmxpc3RbaV0udXNlZCAgICA9IDA7CisJICAgIHJldHZhbC0+bGlzdFtpXS5hZGRyZXNzID0gYnVmcy5saXN0W2ldLmFkZHJlc3M7CisJfQorCisJZHJtRnJlZShidWZzLmxpc3QpOworCQorCXJldHVybiByZXR2YWw7Cit9CisKKworLyoqCisgKiBVbm1hcCBidWZmZXJzIGFsbG9jYXRlZCB3aXRoIGRybU1hcEJ1ZnMoKS4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIENhbGxzIG11bm1hcCgpIGZvciBldmVyeSBidWZmZXIgc3RvcmVkIGluIFxwIGJ1ZnMgYW5kIGZyZWVzIHRoZQorICogbWVtb3J5IGFsbG9jYXRlZCBieSBkcm1NYXBCdWZzKCkuCisgKi8KK2ludCBkcm1Vbm1hcEJ1ZnMoZHJtQnVmTWFwUHRyIGJ1ZnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmcy0+Y291bnQ7IGkrKykgeworCWRybV9tdW5tYXAoYnVmcy0+bGlzdFtpXS5hZGRyZXNzLCBidWZzLT5saXN0W2ldLnRvdGFsKTsKKyAgICB9CisKKyAgICBkcm1GcmVlKGJ1ZnMtPmxpc3QpOworICAgIGRybUZyZWUoYnVmcyk7CisJCisgICAgcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBEUk1fRE1BX1JFVFJZCQkxNgorCisvKioKKyAqIFJlc2VydmUgRE1BIGJ1ZmZlcnMuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSByZXF1ZXN0IAorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogQXNzZW1ibGUgdGhlIGFyZ3VtZW50cyBpbnRvIGEgZHJtX2RtYSBzdHJ1Y3R1cmUgYW5kIGtlZXBzIGlzc3VpbmcgdGhlCisgKiBEUk1fSU9DVExfRE1BIGlvY3RsIHVudGlsIHN1Y2Nlc3Mgb3IgdW50aWwgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy4KKyAqLworaW50IGRybURNQShpbnQgZmQsIGRybURNQVJlcVB0ciByZXF1ZXN0KQoreworICAgIGRybV9kbWFfdCBkbWE7CisgICAgaW50IHJldCwgaSA9IDA7CisKKyAgICBkbWEuY29udGV4dCAgICAgICAgID0gcmVxdWVzdC0+Y29udGV4dDsKKyAgICBkbWEuc2VuZF9jb3VudCAgICAgID0gcmVxdWVzdC0+c2VuZF9jb3VudDsKKyAgICBkbWEuc2VuZF9pbmRpY2VzICAgID0gcmVxdWVzdC0+c2VuZF9saXN0OworICAgIGRtYS5zZW5kX3NpemVzICAgICAgPSByZXF1ZXN0LT5zZW5kX3NpemVzOworICAgIGRtYS5mbGFncyAgICAgICAgICAgPSByZXF1ZXN0LT5mbGFnczsKKyAgICBkbWEucmVxdWVzdF9jb3VudCAgID0gcmVxdWVzdC0+cmVxdWVzdF9jb3VudDsKKyAgICBkbWEucmVxdWVzdF9zaXplICAgID0gcmVxdWVzdC0+cmVxdWVzdF9zaXplOworICAgIGRtYS5yZXF1ZXN0X2luZGljZXMgPSByZXF1ZXN0LT5yZXF1ZXN0X2xpc3Q7CisgICAgZG1hLnJlcXVlc3Rfc2l6ZXMgICA9IHJlcXVlc3QtPnJlcXVlc3Rfc2l6ZXM7CisgICAgZG1hLmdyYW50ZWRfY291bnQgICA9IDA7CisKKyAgICBkbyB7CisJcmV0ID0gaW9jdGwoIGZkLCBEUk1fSU9DVExfRE1BLCAmZG1hICk7CisgICAgfSB3aGlsZSAoIHJldCAmJiBlcnJubyA9PSBFQUdBSU4gJiYgaSsrIDwgRFJNX0RNQV9SRVRSWSApOworCisgICAgaWYgKCByZXQgPT0gMCApIHsKKwlyZXF1ZXN0LT5ncmFudGVkX2NvdW50ID0gZG1hLmdyYW50ZWRfY291bnQ7CisJcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gLWVycm5vOworICAgIH0KK30KKworCisvKioKKyAqIE9idGFpbiBoZWF2eXdlaWdodCBoYXJkd2FyZSBsb2NrLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gY29udGV4dCBjb250ZXh0LgorICogXHBhcmFtIGZsYWdzIGZsYWdzIHRoYXQgZGV0ZXJtaW5lIHRoZSBzYXRlIG9mIHRoZSBoYXJkd2FyZSB3aGVuIHRoZSBmdW5jdGlvbgorICogcmV0dXJucy4KKyAqIAorICogXHJldHVybiBhbHdheXMgemVyby4KKyAqIAorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIGFyZ3VtZW50cyBpbnRvIGEgZHJtX2xvY2sgc3RydWN0dXJlIGFuZCBpc3N1ZQorICogdGhlIERSTV9JT0NUTF9MT0NLIGlvY3RsIHVudGlsIHRoZSBsb2NrIGlzIHN1Y2Nlc3NmdWxseSBhY3F1aXJlZC4KKyAqLworaW50IGRybUdldExvY2soaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQsIGRybUxvY2tGbGFncyBmbGFncykKK3sKKyAgICBkcm1fbG9ja190IGxvY2s7CisKKyAgICBtZW1jbGVhcihsb2NrKTsKKyAgICBsb2NrLmNvbnRleHQgPSBjb250ZXh0OworICAgIGxvY2suZmxhZ3MgICA9IDA7CisgICAgaWYgKGZsYWdzICYgRFJNX0xPQ0tfUkVBRFkpICAgICAgbG9jay5mbGFncyB8PSBfRFJNX0xPQ0tfUkVBRFk7CisgICAgaWYgKGZsYWdzICYgRFJNX0xPQ0tfUVVJRVNDRU5UKSAgbG9jay5mbGFncyB8PSBfRFJNX0xPQ0tfUVVJRVNDRU5UOworICAgIGlmIChmbGFncyAmIERSTV9MT0NLX0ZMVVNIKSAgICAgIGxvY2suZmxhZ3MgfD0gX0RSTV9MT0NLX0ZMVVNIOworICAgIGlmIChmbGFncyAmIERSTV9MT0NLX0ZMVVNIX0FMTCkgIGxvY2suZmxhZ3MgfD0gX0RSTV9MT0NLX0ZMVVNIX0FMTDsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fSEFMVF9BTExfUVVFVUVTKSBsb2NrLmZsYWdzIHw9IF9EUk1fSEFMVF9BTExfUVVFVUVTOworICAgIGlmIChmbGFncyAmIERSTV9IQUxUX0NVUl9RVUVVRVMpIGxvY2suZmxhZ3MgfD0gX0RSTV9IQUxUX0NVUl9RVUVVRVM7CisKKyAgICB3aGlsZSAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9MT0NLLCAmbG9jaykpCisJOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIGhhcmR3YXJlIGxvY2suCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBjb250ZXh0IGNvbnRleHQuCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfVU5MT0NLIGlvY3RsLCBwYXNzaW5nIHRoZQorICogYXJndW1lbnQgaW4gYSBkcm1fbG9jayBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1VbmxvY2soaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQpCit7CisgICAgZHJtX2xvY2tfdCBsb2NrOworCisgICAgbWVtY2xlYXIobG9jayk7CisgICAgbG9jay5jb250ZXh0ID0gY29udGV4dDsKKyAgICByZXR1cm4gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9VTkxPQ0ssICZsb2NrKTsKK30KKworZHJtX2NvbnRleHRfdCAqZHJtR2V0UmVzZXJ2ZWRDb250ZXh0TGlzdChpbnQgZmQsIGludCAqY291bnQpCit7CisgICAgZHJtX2N0eF9yZXNfdCByZXM7CisgICAgZHJtX2N0eF90ICAgICAqbGlzdDsKKyAgICBkcm1fY29udGV4dF90ICogcmV0dmFsOworICAgIGludCAgICAgICAgICAgaTsKKworICAgIG1lbWNsZWFyKHJlcyk7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfUkVTX0NUWCwgJnJlcykpCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIXJlcy5jb3VudCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICghKGxpc3QgICA9IGRybU1hbGxvYyhyZXMuY291bnQgKiBzaXplb2YoKmxpc3QpKSkpCisJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEocmV0dmFsID0gZHJtTWFsbG9jKHJlcy5jb3VudCAqIHNpemVvZigqcmV0dmFsKSkpKSB7CisJZHJtRnJlZShsaXN0KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXMuY29udGV4dHMgPSBsaXN0OworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1JFU19DVFgsICZyZXMpKQorCXJldHVybiBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IHJlcy5jb3VudDsgaSsrKQorCXJldHZhbFtpXSA9IGxpc3RbaV0uaGFuZGxlOworICAgIGRybUZyZWUobGlzdCk7CisKKyAgICAqY291bnQgPSByZXMuY291bnQ7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBkcm1GcmVlUmVzZXJ2ZWRDb250ZXh0TGlzdChkcm1fY29udGV4dF90ICpwdCkKK3sKKyAgICBkcm1GcmVlKHB0KTsKK30KKworLyoqCisgKiBDcmVhdGUgY29udGV4dC4KKyAqCisgKiBVc2VkIGJ5IHRoZSBYIHNlcnZlciBkdXJpbmcgR0xYQ29udGV4dCBpbml0aWFsaXphdGlvbi4gVGhpcyBjYXVzZXMKKyAqIHBlci1jb250ZXh0IGtlcm5lbC1sZXZlbCByZXNvdXJjZXMgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gaGFuZGxlIGlzIHNldCBvbiBzdWNjZXNzLiBUbyBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgd2hlbiByZXF1ZXN0aW5nIERNQQorICogZGlzcGF0Y2ggd2l0aCBkcm1ETUEoKS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqIAorICogXG5vdGUgTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3QuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUREX0NUWCBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50IGluIGEgZHJtX2N0eCBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1DcmVhdGVDb250ZXh0KGludCBmZCwgZHJtX2NvbnRleHRfdCAqaGFuZGxlKQoreworICAgIGRybV9jdHhfdCBjdHg7CisKKyAgICBtZW1jbGVhcihjdHgpOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FERF9DVFgsICZjdHgpKQorCXJldHVybiAtZXJybm87CisgICAgKmhhbmRsZSA9IGN0eC5oYW5kbGU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1Td2l0Y2hUb0NvbnRleHQoaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQpCit7CisgICAgZHJtX2N0eF90IGN0eDsKKworICAgIG1lbWNsZWFyKGN0eCk7CisgICAgY3R4LmhhbmRsZSA9IGNvbnRleHQ7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU1dJVENIX0NUWCwgJmN0eCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybVNldENvbnRleHRGbGFncyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCwgZHJtX2NvbnRleHRfdEZsYWdzIGZsYWdzKQoreworICAgIGRybV9jdHhfdCBjdHg7CisKKyAgICAvKgorICAgICAqIENvbnRleHQgcHJlc2VydmluZyBtZWFucyB0aGF0IG5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGRvbmUgYmV0d2VlbiBETUEKKyAgICAgKiBidWZmZXJzIGZyb20gb25lIGNvbnRleHQgYW5kIHRoZSBuZXh0LiAgVGhpcyBpcyBzdWl0YWJsZSBmb3IgdXNlIGluIHRoZQorICAgICAqIFggc2VydmVyICh3aGljaCBwcm9taXNlcyB0byBtYWludGFpbiBoYXJkd2FyZSBjb250ZXh0KSwgb3IgaW4gdGhlCisgICAgICogY2xpZW50LXNpZGUgbGlicmFyeSB3aGVuIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgb24gYmVoYWxmIG9mIHR3byB0aHJlYWRzLgorICAgICAqLworICAgIG1lbWNsZWFyKGN0eCk7CisgICAgY3R4LmhhbmRsZSA9IGNvbnRleHQ7CisgICAgaWYgKGZsYWdzICYgRFJNX0NPTlRFWFRfUFJFU0VSVkVEKQorCWN0eC5mbGFncyB8PSBfRFJNX0NPTlRFWFRfUFJFU0VSVkVEOworICAgIGlmIChmbGFncyAmIERSTV9DT05URVhUXzJET05MWSkKKwljdHguZmxhZ3MgfD0gX0RSTV9DT05URVhUXzJET05MWTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RfQ1RYLCAmY3R4KSkKKwlyZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtR2V0Q29udGV4dEZsYWdzKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBkcm1fY29udGV4dF90RmxhZ3NQdHIgZmxhZ3MpCit7CisgICAgZHJtX2N0eF90IGN0eDsKKworICAgIG1lbWNsZWFyKGN0eCk7CisgICAgY3R4LmhhbmRsZSA9IGNvbnRleHQ7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX0NUWCwgJmN0eCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICAqZmxhZ3MgPSAwOworICAgIGlmIChjdHguZmxhZ3MgJiBfRFJNX0NPTlRFWFRfUFJFU0VSVkVEKQorCSpmbGFncyB8PSBEUk1fQ09OVEVYVF9QUkVTRVJWRUQ7CisgICAgaWYgKGN0eC5mbGFncyAmIF9EUk1fQ09OVEVYVF8yRE9OTFkpCisJKmZsYWdzIHw9IERSTV9DT05URVhUXzJET05MWTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEZXN0cm95IGNvbnRleHQuCisgKgorICogRnJlZSBhbnkga2VybmVsLWxldmVsIHJlc291cmNlcyBhbGxvY2F0ZWQgd2l0aCBkcm1DcmVhdGVDb250ZXh0KCkgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgY29udGV4dC4KKyAqIAorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBoYW5kbGUgaGFuZGxlIGdpdmVuIGJ5IGRybUNyZWF0ZUNvbnRleHQoKS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqIAorICogXG5vdGUgTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3QuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfUk1fQ1RYIGlvY3RsLCBwYXNzaW5nIHRoZQorICogYXJndW1lbnQgaW4gYSBkcm1fY3R4IHN0cnVjdHVyZS4KKyAqLworaW50IGRybURlc3Ryb3lDb250ZXh0KGludCBmZCwgZHJtX2NvbnRleHRfdCBoYW5kbGUpCit7CisgICAgZHJtX2N0eF90IGN0eDsKKworICAgIG1lbWNsZWFyKGN0eCk7CisgICAgY3R4LmhhbmRsZSA9IGhhbmRsZTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9STV9DVFgsICZjdHgpKQorCXJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1DcmVhdGVEcmF3YWJsZShpbnQgZmQsIGRybV9kcmF3YWJsZV90ICpoYW5kbGUpCit7CisgICAgZHJtX2RyYXdfdCBkcmF3OworCisgICAgbWVtY2xlYXIoZHJhdyk7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUREX0RSQVcsICZkcmF3KSkKKwlyZXR1cm4gLWVycm5vOworICAgICpoYW5kbGUgPSBkcmF3LmhhbmRsZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybURlc3Ryb3lEcmF3YWJsZShpbnQgZmQsIGRybV9kcmF3YWJsZV90IGhhbmRsZSkKK3sKKyAgICBkcm1fZHJhd190IGRyYXc7CisKKyAgICBtZW1jbGVhcihkcmF3KTsKKyAgICBkcmF3LmhhbmRsZSA9IGhhbmRsZTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9STV9EUkFXLCAmZHJhdykpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybVVwZGF0ZURyYXdhYmxlSW5mbyhpbnQgZmQsIGRybV9kcmF3YWJsZV90IGhhbmRsZSwKKwkJCSAgIGRybV9kcmF3YWJsZV9pbmZvX3R5cGVfdCB0eXBlLCB1bnNpZ25lZCBpbnQgbnVtLAorCQkJICAgdm9pZCAqZGF0YSkKK3sKKyAgICBkcm1fdXBkYXRlX2RyYXdfdCB1cGRhdGU7CisKKyAgICBtZW1jbGVhcih1cGRhdGUpOworICAgIHVwZGF0ZS5oYW5kbGUgPSBoYW5kbGU7CisgICAgdXBkYXRlLnR5cGUgPSB0eXBlOworICAgIHVwZGF0ZS5udW0gPSBudW07CisgICAgdXBkYXRlLmRhdGEgPSAodW5zaWduZWQgbG9uZyBsb25nKSh1bnNpZ25lZCBsb25nKWRhdGE7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9VUERBVEVfRFJBVywgJnVwZGF0ZSkpCisJcmV0dXJuIC1lcnJubzsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEFjcXVpcmUgdGhlIEFHUCBkZXZpY2UuCisgKgorICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgQUdQIHJlbGF0ZWQgY2FsbHMuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqIAorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfQUNRVUlSRSBpb2N0bC4KKyAqLworaW50IGRybUFncEFjcXVpcmUoaW50IGZkKQoreworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFLCBOVUxMKSkKKwlyZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogUmVsZWFzZSB0aGUgQUdQIGRldmljZS4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9SRUxFQVNFIGlvY3RsLgorICovCitpbnQgZHJtQWdwUmVsZWFzZShpbnQgZmQpCit7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX1JFTEVBU0UsIE5VTEwpKQorCXJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBTZXQgdGhlIEFHUCBtb2RlLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gbW9kZSBBR1AgbW9kZS4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqIAorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfRU5BQkxFIGlvY3RsLCBwYXNzaW5nIHRoZQorICogYXJndW1lbnQgaW4gYSBkcm1fYWdwX21vZGUgc3RydWN0dXJlLgorICovCitpbnQgZHJtQWdwRW5hYmxlKGludCBmZCwgdW5zaWduZWQgbG9uZyBtb2RlKQoreworICAgIGRybV9hZ3BfbW9kZV90IG07CisKKyAgICBtZW1jbGVhcihtKTsKKyAgICBtLm1vZGUgPSBtb2RlOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9FTkFCTEUsICZtKSkKKwlyZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogQWxsb2NhdGUgYSBjaHVuayBvZiBBR1AgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gc2l6ZSByZXF1ZXN0ZWQgbWVtb3J5IHNpemUgaW4gYnl0ZXMuIFdpbGwgYmUgcm91bmRlZCB0byBwYWdlIGJvdW5kYXJ5LgorICogXHBhcmFtIHR5cGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgKiBccGFyYW0gYWRkcmVzcyBpZiBub3QgemVybywgd2lsbCBiZSBzZXQgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisgKiBhbGxvY2F0ZWQgbWVtb3J5LgorICogXHBhcmFtIGhhbmRsZSBvbiBzdWNjZXNzIHdpbGwgYmUgc2V0IHRvIGEgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9BTExPQyBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50cyBpbiBhIGRybV9hZ3BfYnVmZmVyIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUFncEFsbG9jKGludCBmZCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHR5cGUsCisJCXVuc2lnbmVkIGxvbmcgKmFkZHJlc3MsIGRybV9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIGRybV9hZ3BfYnVmZmVyX3QgYjsKKworICAgIG1lbWNsZWFyKGIpOworICAgICpoYW5kbGUgPSBEUk1fQUdQX05PX0hBTkRMRTsKKyAgICBiLnNpemUgICA9IHNpemU7CisgICAgYi50eXBlICAgPSB0eXBlOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9BTExPQywgJmIpKQorCXJldHVybiAtZXJybm87CisgICAgaWYgKGFkZHJlc3MgIT0gMFVMKQorCSphZGRyZXNzID0gYi5waHlzaWNhbDsKKyAgICAqaGFuZGxlID0gYi5oYW5kbGU7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBGcmVlIGEgY2h1bmsgb2YgQUdQIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGhhbmRsZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnksIGFzIGdpdmVuIGJ5IGRybUFncEFsbG9jYXRlKCkuCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0ZSRUUgaW9jdGwsIHBhc3NpbmcgdGhlCisgKiBhcmd1bWVudCBpbiBhIGRybV9hZ3BfYnVmZmVyIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUFncEZyZWUoaW50IGZkLCBkcm1faGFuZGxlX3QgaGFuZGxlKQoreworICAgIGRybV9hZ3BfYnVmZmVyX3QgYjsKKworICAgIG1lbWNsZWFyKGIpOworICAgIGIuaGFuZGxlID0gaGFuZGxlOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9GUkVFLCAmYikpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIEJpbmQgYSBjaHVuayBvZiBBR1AgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gaGFuZGxlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgYXMgZ2l2ZW4gYnkgZHJtQWdwQWxsb2NhdGUoKS4KKyAqIFxwYXJhbSBvZmZzZXQgb2Zmc2V0IGluIGJ5dGVzLiBJdCB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkuCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0JJTkQgaW9jdGwsIHBhc3NpbmcgdGhlCisgKiBhcmd1bWVudCBpbiBhIGRybV9hZ3BfYmluZGluZyBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1BZ3BCaW5kKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisgICAgZHJtX2FncF9iaW5kaW5nX3QgYjsKKworICAgIG1lbWNsZWFyKGIpOworICAgIGIuaGFuZGxlID0gaGFuZGxlOworICAgIGIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9CSU5ELCAmYikpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIFVuYmluZCBhIGNodW5rIG9mIEFHUCBtZW1vcnkuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBoYW5kbGUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBhcyBnaXZlbiBieSBkcm1BZ3BBbGxvY2F0ZSgpLgorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQgaW9jdGwsIHBhc3NpbmcKKyAqIHRoZSBhcmd1bWVudCBpbiBhIGRybV9hZ3BfYmluZGluZyBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1BZ3BVbmJpbmQoaW50IGZkLCBkcm1faGFuZGxlX3QgaGFuZGxlKQoreworICAgIGRybV9hZ3BfYmluZGluZ190IGI7CisKKyAgICBtZW1jbGVhcihiKTsKKyAgICBiLmhhbmRsZSA9IGhhbmRsZTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfVU5CSU5ELCAmYikpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIEdldCBBR1AgZHJpdmVyIG1ham9yIHZlcnNpb24gbnVtYmVyLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiAKKyAqIFxyZXR1cm4gbWFqb3IgdmVyc2lvbiBudW1iZXIgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLi4KKyAqIAorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1BZ3BWZXJzaW9uTWFqb3IoaW50IGZkKQoreworICAgIGRybV9hZ3BfaW5mb190IGk7CisKKyAgICBtZW1jbGVhcihpKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9JTkZPLCAmaSkpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gaS5hZ3BfdmVyc2lvbl9tYWpvcjsKK30KKworCisvKioKKyAqIEdldCBBR1AgZHJpdmVyIG1pbm9yIHZlcnNpb24gbnVtYmVyLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiAKKyAqIFxyZXR1cm4gbWlub3IgdmVyc2lvbiBudW1iZXIgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsLCBnZXR0aW5nIHRoZQorICogbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluIGEgZHJtX2FncF9pbmZvIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUFncFZlcnNpb25NaW5vcihpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKwlyZXR1cm4gLWVycm5vOworICAgIHJldHVybiBpLmFncF92ZXJzaW9uX21pbm9yOworfQorCisKKy8qKgorICogR2V0IEFHUCBtb2RlLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiAKKyAqIFxyZXR1cm4gbW9kZSBvbiBzdWNjZXNzLCBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwsIGdldHRpbmcgdGhlCisgKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gYSBkcm1fYWdwX2luZm8gc3RydWN0dXJlLgorICovCit1bnNpZ25lZCBsb25nIGRybUFncEdldE1vZGUoaW50IGZkKQoreworICAgIGRybV9hZ3BfaW5mb190IGk7CisKKyAgICBtZW1jbGVhcihpKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9JTkZPLCAmaSkpCisJcmV0dXJuIDA7CisgICAgcmV0dXJuIGkubW9kZTsKK30KKworCisvKioKKyAqIEdldCBBR1AgYXBlcnR1cmUgYmFzZS4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBccmV0dXJuIGFwZXJ0dXJlIGJhc2Ugb24gc3VjY2VzcywgemVybyBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsLCBnZXR0aW5nIHRoZQorICogbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluIGEgZHJtX2FncF9pbmZvIHN0cnVjdHVyZS4KKyAqLwordW5zaWduZWQgbG9uZyBkcm1BZ3BCYXNlKGludCBmZCkKK3sKKyAgICBkcm1fYWdwX2luZm9fdCBpOworCisgICAgbWVtY2xlYXIoaSk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfSU5GTywgJmkpKQorCXJldHVybiAwOworICAgIHJldHVybiBpLmFwZXJ0dXJlX2Jhc2U7Cit9CisKKworLyoqCisgKiBHZXQgQUdQIGFwZXJ0dXJlIHNpemUuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogXHJldHVybiBhcGVydHVyZSBzaXplIG9uIHN1Y2Nlc3MsIHplcm8gb24gZmFpbHVyZS4KKyAqIAorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgZHJtQWdwU2l6ZShpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gaS5hcGVydHVyZV9zaXplOworfQorCisKKy8qKgorICogR2V0IHVzZWQgQUdQIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBccmV0dXJuIG1lbW9yeSB1c2VkIG9uIHN1Y2Nlc3MsIG9yIHplcm8gb24gZmFpbHVyZS4KKyAqIAorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgZHJtQWdwTWVtb3J5VXNlZChpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gaS5tZW1vcnlfdXNlZDsKK30KKworCisvKioKKyAqIEdldCBhdmFpbGFibGUgQUdQIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBccmV0dXJuIG1lbW9yeSBhdmFpbGFibGUgb24gc3VjY2Vzcywgb3IgemVybyBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsLCBnZXR0aW5nIHRoZQorICogbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluIGEgZHJtX2FncF9pbmZvIHN0cnVjdHVyZS4KKyAqLwordW5zaWduZWQgbG9uZyBkcm1BZ3BNZW1vcnlBdmFpbChpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gaS5tZW1vcnlfYWxsb3dlZDsKK30KKworCisvKioKKyAqIEdldCBoYXJkd2FyZSB2ZW5kb3IgSUQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogXHJldHVybiB2ZW5kb3IgSUQgb24gc3VjY2Vzcywgb3IgemVybyBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsLCBnZXR0aW5nIHRoZQorICogbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluIGEgZHJtX2FncF9pbmZvIHN0cnVjdHVyZS4KKyAqLwordW5zaWduZWQgaW50IGRybUFncFZlbmRvcklkKGludCBmZCkKK3sKKyAgICBkcm1fYWdwX2luZm9fdCBpOworCisgICAgbWVtY2xlYXIoaSk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfSU5GTywgJmkpKQorCXJldHVybiAwOworICAgIHJldHVybiBpLmlkX3ZlbmRvcjsKK30KKworCisvKioKKyAqIEdldCBoYXJkd2FyZSBkZXZpY2UgSUQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIHplcm8gb24gZmFpbHVyZS4KKyAqIAorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3Vuc2lnbmVkIGludCBkcm1BZ3BEZXZpY2VJZChpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gaS5pZF9kZXZpY2U7Cit9CisKK2ludCBkcm1TY2F0dGVyR2F0aGVyQWxsb2MoaW50IGZkLCB1bnNpZ25lZCBsb25nIHNpemUsIGRybV9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIGRybV9zY2F0dGVyX2dhdGhlcl90IHNnOworCisgICAgbWVtY2xlYXIoc2cpOworCisgICAgKmhhbmRsZSA9IDA7CisgICAgc2cuc2l6ZSAgID0gc2l6ZTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TR19BTExPQywgJnNnKSkKKwlyZXR1cm4gLWVycm5vOworICAgICpoYW5kbGUgPSBzZy5oYW5kbGU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TY2F0dGVyR2F0aGVyRnJlZShpbnQgZmQsIGRybV9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgZHJtX3NjYXR0ZXJfZ2F0aGVyX3Qgc2c7CisKKyAgICBtZW1jbGVhcihzZyk7CisgICAgc2cuaGFuZGxlID0gaGFuZGxlOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1NHX0ZSRUUsICZzZykpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBXYWl0IGZvciBWQkxBTksuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSB2YmwgcG9pbnRlciB0byBhIGRybVZCbGFuayBzdHJ1Y3R1cmUuCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfV0FJVF9WQkxBTksgaW9jdGwuCisgKi8KK2ludCBkcm1XYWl0VkJsYW5rKGludCBmZCwgZHJtVkJsYW5rUHRyIHZibCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dCwgY3VyOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRpbWVvdXQpOworICAgIGlmIChyZXQgPCAwKSB7CisJZnByaW50ZihzdGRlcnIsICJjbG9ja19nZXR0aW1lIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJZ290byBvdXQ7CisgICAgfQorICAgIHRpbWVvdXQudHZfc2VjKys7CisKKyAgICBkbyB7CisgICAgICAgcmV0ID0gaW9jdGwoZmQsIERSTV9JT0NUTF9XQUlUX1ZCTEFOSywgdmJsKTsKKyAgICAgICB2YmwtPnJlcXVlc3QudHlwZSAmPSB+RFJNX1ZCTEFOS19SRUxBVElWRTsKKyAgICAgICBpZiAocmV0ICYmIGVycm5vID09IEVJTlRSKSB7CisJICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmY3VyKTsKKwkgICAgICAgLyogVGltZW91dCBhZnRlciAxcyAqLworCSAgICAgICBpZiAoY3VyLnR2X3NlYyA+IHRpbWVvdXQudHZfc2VjICsgMSB8fAorCQkgICAoY3VyLnR2X3NlYyA9PSB0aW1lb3V0LnR2X3NlYyAmJiBjdXIudHZfbnNlYyA+PQorCQkgICAgdGltZW91dC50dl9uc2VjKSkgeworCQkgICAgICAgZXJybm8gPSBFQlVTWTsKKwkJICAgICAgIHJldCA9IC0xOworCQkgICAgICAgYnJlYWs7CisJICAgICAgIH0KKyAgICAgICB9CisgICAgfSB3aGlsZSAocmV0ICYmIGVycm5vID09IEVJTlRSKTsKKworb3V0OgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBkcm1FcnJvcihpbnQgZXJyLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKyAgICBzd2l0Y2ggKGVycikgeworICAgIGNhc2UgRFJNX0VSUl9OT19ERVZJQ0U6CisJZnByaW50ZihzdGRlcnIsICIlczogbm8gZGV2aWNlXG4iLCBsYWJlbCk7CisJYnJlYWs7CisgICAgY2FzZSBEUk1fRVJSX05PX0FDQ0VTUzoKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBubyBhY2Nlc3NcbiIsIGxhYmVsKTsKKwlicmVhazsKKyAgICBjYXNlIERSTV9FUlJfTk9UX1JPT1Q6CisJZnByaW50ZihzdGRlcnIsICIlczogbm90IHJvb3RcbiIsIGxhYmVsKTsKKwlicmVhazsKKyAgICBjYXNlIERSTV9FUlJfSU5WQUxJRDoKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIGFyZ3NcbiIsIGxhYmVsKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChlcnIgPCAwKQorCSAgICBlcnIgPSAtZXJyOworCWZwcmludGYoIHN0ZGVyciwgIiVzOiBlcnJvciAlZCAoJXMpXG4iLCBsYWJlbCwgZXJyLCBzdHJlcnJvcihlcnIpICk7CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogSW5zdGFsbCBJUlEgaGFuZGxlci4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGlycSBJUlEgbnVtYmVyLgorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0NPTlRST0wgaW9jdGwsIHBhc3NpbmcgdGhlCisgKiBhcmd1bWVudCBpbiBhIGRybV9jb250cm9sIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUN0bEluc3RIYW5kbGVyKGludCBmZCwgaW50IGlycSkKK3sKKyAgICBkcm1fY29udHJvbF90IGN0bDsKKworICAgIG1lbWNsZWFyKGN0bCk7CisgICAgY3RsLmZ1bmMgID0gRFJNX0lOU1RfSEFORExFUjsKKyAgICBjdGwuaXJxICAgPSBpcnE7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQ09OVFJPTCwgJmN0bCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIFVuaW5zdGFsbCBJUlEgaGFuZGxlci4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0NPTlRST0wgaW9jdGwsIHBhc3NpbmcgdGhlCisgKiBhcmd1bWVudCBpbiBhIGRybV9jb250cm9sIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUN0bFVuaW5zdEhhbmRsZXIoaW50IGZkKQoreworICAgIGRybV9jb250cm9sX3QgY3RsOworCisgICAgbWVtY2xlYXIoY3RsKTsKKyAgICBjdGwuZnVuYyAgPSBEUk1fVU5JTlNUX0hBTkRMRVI7CisgICAgY3RsLmlycSAgID0gMDsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9DT05UUk9MLCAmY3RsKSkKKwlyZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtRmluaXNoKGludCBmZCwgaW50IGNvbnRleHQsIGRybUxvY2tGbGFncyBmbGFncykKK3sKKyAgICBkcm1fbG9ja190IGxvY2s7CisKKyAgICBtZW1jbGVhcihsb2NrKTsKKyAgICBsb2NrLmNvbnRleHQgPSBjb250ZXh0OworICAgIGlmIChmbGFncyAmIERSTV9MT0NLX1JFQURZKSAgICAgIGxvY2suZmxhZ3MgfD0gX0RSTV9MT0NLX1JFQURZOworICAgIGlmIChmbGFncyAmIERSTV9MT0NLX1FVSUVTQ0VOVCkgIGxvY2suZmxhZ3MgfD0gX0RSTV9MT0NLX1FVSUVTQ0VOVDsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fTE9DS19GTFVTSCkgICAgICBsb2NrLmZsYWdzIHw9IF9EUk1fTE9DS19GTFVTSDsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fTE9DS19GTFVTSF9BTEwpICBsb2NrLmZsYWdzIHw9IF9EUk1fTE9DS19GTFVTSF9BTEw7CisgICAgaWYgKGZsYWdzICYgRFJNX0hBTFRfQUxMX1FVRVVFUykgbG9jay5mbGFncyB8PSBfRFJNX0hBTFRfQUxMX1FVRVVFUzsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fSEFMVF9DVVJfUVVFVUVTKSBsb2NrLmZsYWdzIHw9IF9EUk1fSEFMVF9DVVJfUVVFVUVTOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0ZJTklTSCwgJmxvY2spKQorCXJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IElSUSBmcm9tIGJ1cyBJRC4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGJ1c251bSBidXMgbnVtYmVyLgorICogXHBhcmFtIGRldm51bSBkZXZpY2UgbnVtYmVyLgorICogXHBhcmFtIGZ1bmNudW0gZnVuY3Rpb24gbnVtYmVyLgorICogCisgKiBccmV0dXJuIElSUSBudW1iZXIgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0lSUV9CVVNJRCBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50cyBpbiBhIGRybV9pcnFfYnVzaWQgc3RydWN0dXJlLgorICovCitpbnQgZHJtR2V0SW50ZXJydXB0RnJvbUJ1c0lEKGludCBmZCwgaW50IGJ1c251bSwgaW50IGRldm51bSwgaW50IGZ1bmNudW0pCit7CisgICAgZHJtX2lycV9idXNpZF90IHA7CisKKyAgICBtZW1jbGVhcihwKTsKKyAgICBwLmJ1c251bSAgPSBidXNudW07CisgICAgcC5kZXZudW0gID0gZGV2bnVtOworICAgIHAuZnVuY251bSA9IGZ1bmNudW07CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSVJRX0JVU0lELCAmcCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gcC5pcnE7Cit9CisKK2ludCBkcm1BZGRDb250ZXh0VGFnKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0LCB2b2lkICp0YWcpCit7CisgICAgZHJtSGFzaEVudHJ5ICAqZW50cnkgPSBkcm1HZXRFbnRyeShmZCk7CisKKyAgICBpZiAoZHJtSGFzaEluc2VydChlbnRyeS0+dGFnVGFibGUsIGNvbnRleHQsIHRhZykpIHsKKwlkcm1IYXNoRGVsZXRlKGVudHJ5LT50YWdUYWJsZSwgY29udGV4dCk7CisJZHJtSGFzaEluc2VydChlbnRyeS0+dGFnVGFibGUsIGNvbnRleHQsIHRhZyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgZHJtRGVsQ29udGV4dFRhZyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCkKK3sKKyAgICBkcm1IYXNoRW50cnkgICplbnRyeSA9IGRybUdldEVudHJ5KGZkKTsKKworICAgIHJldHVybiBkcm1IYXNoRGVsZXRlKGVudHJ5LT50YWdUYWJsZSwgY29udGV4dCk7Cit9CisKK3ZvaWQgKmRybUdldENvbnRleHRUYWcoaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQpCit7CisgICAgZHJtSGFzaEVudHJ5ICAqZW50cnkgPSBkcm1HZXRFbnRyeShmZCk7CisgICAgdm9pZCAgICAgICAgICAqdmFsdWU7CisKKyAgICBpZiAoZHJtSGFzaExvb2t1cChlbnRyeS0+dGFnVGFibGUsIGNvbnRleHQsICZ2YWx1ZSkpCisJcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2ludCBkcm1BZGRDb250ZXh0UHJpdmF0ZU1hcHBpbmcoaW50IGZkLCBkcm1fY29udGV4dF90IGN0eF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBkcm1fY3R4X3ByaXZfbWFwX3QgbWFwOworCisgICAgbWVtY2xlYXIobWFwKTsKKyAgICBtYXAuY3R4X2lkID0gY3R4X2lkOworICAgIG1hcC5oYW5kbGUgPSAodm9pZCAqKSh1aW50cHRyX3QpaGFuZGxlOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWCwgJm1hcCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybUdldENvbnRleHRQcml2YXRlTWFwcGluZyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY3R4X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1faGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBkcm1fY3R4X3ByaXZfbWFwX3QgbWFwOworCisgICAgbWVtY2xlYXIobWFwKTsKKyAgICBtYXAuY3R4X2lkID0gY3R4X2lkOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCwgJm1hcCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICBpZiAoaGFuZGxlKQorCSpoYW5kbGUgPSAoZHJtX2hhbmRsZV90KSh1aW50cHRyX3QpbWFwLmhhbmRsZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtR2V0TWFwKGludCBmZCwgaW50IGlkeCwgZHJtX2hhbmRsZV90ICpvZmZzZXQsIGRybVNpemUgKnNpemUsCisJICAgICAgZHJtTWFwVHlwZSAqdHlwZSwgZHJtTWFwRmxhZ3MgKmZsYWdzLCBkcm1faGFuZGxlX3QgKmhhbmRsZSwKKwkgICAgICBpbnQgKm10cnIpCit7CisgICAgZHJtX21hcF90IG1hcDsKKworICAgIG1lbWNsZWFyKG1hcCk7CisgICAgbWFwLm9mZnNldCA9IGlkeDsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9HRVRfTUFQLCAmbWFwKSkKKwlyZXR1cm4gLWVycm5vOworICAgICpvZmZzZXQgPSBtYXAub2Zmc2V0OworICAgICpzaXplICAgPSBtYXAuc2l6ZTsKKyAgICAqdHlwZSAgID0gbWFwLnR5cGU7CisgICAgKmZsYWdzICA9IG1hcC5mbGFnczsKKyAgICAqaGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpbWFwLmhhbmRsZTsKKyAgICAqbXRyciAgID0gbWFwLm10cnI7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1HZXRDbGllbnQoaW50IGZkLCBpbnQgaWR4LCBpbnQgKmF1dGgsIGludCAqcGlkLCBpbnQgKnVpZCwKKwkJIHVuc2lnbmVkIGxvbmcgKm1hZ2ljLCB1bnNpZ25lZCBsb25nICppb2NzKQoreworICAgIGRybV9jbGllbnRfdCBjbGllbnQ7CisKKyAgICBtZW1jbGVhcihjbGllbnQpOworICAgIGNsaWVudC5pZHggPSBpZHg7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX0NMSUVOVCwgJmNsaWVudCkpCisJcmV0dXJuIC1lcnJubzsKKyAgICAqYXV0aCAgICAgID0gY2xpZW50LmF1dGg7CisgICAgKnBpZCAgICAgICA9IGNsaWVudC5waWQ7CisgICAgKnVpZCAgICAgICA9IGNsaWVudC51aWQ7CisgICAgKm1hZ2ljICAgICA9IGNsaWVudC5tYWdpYzsKKyAgICAqaW9jcyAgICAgID0gY2xpZW50LmlvY3M7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1HZXRTdGF0cyhpbnQgZmQsIGRybVN0YXRzVCAqc3RhdHMpCit7CisgICAgZHJtX3N0YXRzX3QgczsKKyAgICB1bnNpZ25lZCAgICBpOworCisgICAgbWVtY2xlYXIocyk7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX1NUQVRTLCAmcykpCisJcmV0dXJuIC1lcnJubzsKKworICAgIHN0YXRzLT5jb3VudCA9IDA7CisgICAgbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisgICAgaWYgKHMuY291bnQgPiBzaXplb2Yoc3RhdHMtPmRhdGEpL3NpemVvZihzdGF0cy0+ZGF0YVswXSkpCisJcmV0dXJuIC0xOworCisjZGVmaW5lIFNFVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX2Zvcm1hdCA9ICIlLTIwLjIwcyI7ICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfZm9ybWF0ID0gIiU4LjhzIjsgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0uaXN2YWx1ZSAgICAgPSAxOyAgICAgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS52ZXJib3NlICAgICA9IDAKKworI2RlZmluZSBTRVRfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19mb3JtYXQgPSAiJS0yMC4yMHMiOyAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX2Zvcm1hdCA9ICIlNS41cyI7ICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLmlzdmFsdWUgICAgID0gMDsgICAgICAgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0ubXVsdF9uYW1lcyAgPSAia2dtIjsgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5tdWx0ICAgICAgICA9IDEwMDA7ICAgICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLnZlcmJvc2UgICAgID0gMAorCisjZGVmaW5lIFNFVF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX2Zvcm1hdCA9ICIlLTIwLjIwcyI7ICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfZm9ybWF0ID0gIiU1LjVzIjsgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0uaXN2YWx1ZSAgICAgPSAwOyAgICAgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5tdWx0X25hbWVzICA9ICJLR00iOyAgICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLm11bHQgICAgICAgID0gMTAyNDsgICAgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0udmVyYm9zZSAgICAgPSAwCisKKworICAgIHN0YXRzLT5jb3VudCA9IHMuY291bnQ7CisgICAgZm9yIChpID0gMDsgaSA8IHMuY291bnQ7IGkrKykgeworCXN0YXRzLT5kYXRhW2ldLnZhbHVlID0gcy5kYXRhW2ldLnZhbHVlOworCXN3aXRjaCAocy5kYXRhW2ldLnR5cGUpIHsKKwljYXNlIF9EUk1fU1RBVF9MT0NLOgorCSAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiTG9jayI7CisJICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJMb2NrIjsKKwkgICAgU0VUX1ZBTFVFOworCSAgICBicmVhazsKKwljYXNlIF9EUk1fU1RBVF9PUEVOUzoKKwkgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIk9wZW5zIjsKKwkgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIk8iOworCSAgICBTRVRfQ09VTlQ7CisJICAgIHN0YXRzLT5kYXRhW2ldLnZlcmJvc2UgICA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgX0RSTV9TVEFUX0NMT1NFUzoKKwkgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIkNsb3NlcyI7CisJICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJMb2NrIjsKKwkgICAgU0VUX0NPVU5UOworCSAgICBzdGF0cy0+ZGF0YVtpXS52ZXJib3NlICAgPSAxOworCSAgICBicmVhazsKKwljYXNlIF9EUk1fU1RBVF9JT0NUTFM6CisJICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJJb2N0bHMiOworCSAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiSW9jL3MiOworCSAgICBTRVRfQ09VTlQ7CisJICAgIGJyZWFrOworCWNhc2UgX0RSTV9TVEFUX0xPQ0tTOgorCSAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiTG9ja3MiOworCSAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiTGNrL3MiOworCSAgICBTRVRfQ09VTlQ7CisJICAgIGJyZWFrOworCWNhc2UgX0RSTV9TVEFUX1VOTE9DS1M6CisJICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJVbmxvY2tzIjsKKwkgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIlVubC9zIjsKKwkgICAgU0VUX0NPVU5UOworCSAgICBicmVhazsKKwljYXNlIF9EUk1fU1RBVF9JUlE6CisJICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJJUlFzIjsKKwkgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIklSUS9zIjsKKwkgICAgU0VUX0NPVU5UOworCSAgICBicmVhazsKKwljYXNlIF9EUk1fU1RBVF9QUklNQVJZOgorCSAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiUHJpbWFyeSBCeXRlcyI7CisJICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJQQi9zIjsKKwkgICAgU0VUX0JZVEU7CisJICAgIGJyZWFrOworCWNhc2UgX0RSTV9TVEFUX1NFQ09OREFSWToKKwkgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIlNlY29uZGFyeSBCeXRlcyI7CisJICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJTQi9zIjsKKwkgICAgU0VUX0JZVEU7CisJICAgIGJyZWFrOworCWNhc2UgX0RSTV9TVEFUX0RNQToKKwkgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIkRNQSI7CisJICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJETUEvcyI7CisJICAgIFNFVF9DT1VOVDsKKwkgICAgYnJlYWs7CisJY2FzZSBfRFJNX1NUQVRfU1BFQ0lBTDoKKwkgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIlNwZWNpYWwgRE1BIjsKKwkgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gImRtYS9zIjsKKwkgICAgU0VUX0NPVU5UOworCSAgICBicmVhazsKKwljYXNlIF9EUk1fU1RBVF9NSVNTRUQ6CisJICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJNaXNzIjsKKwkgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIk1zL3MiOworCSAgICBTRVRfQ09VTlQ7CisJICAgIGJyZWFrOworCWNhc2UgX0RSTV9TVEFUX1ZBTFVFOgorCSAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiVmFsdWUiOworCSAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiVmFsdWUiOworCSAgICBTRVRfVkFMVUU7CisJICAgIGJyZWFrOworCWNhc2UgX0RSTV9TVEFUX0JZVEU6CisJICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJCeXRlcyI7CisJICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJCL3MiOworCSAgICBTRVRfQllURTsKKwkgICAgYnJlYWs7CisJY2FzZSBfRFJNX1NUQVRfQ09VTlQ6CisJZGVmYXVsdDoKKwkgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIkNvdW50IjsKKwkgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIkNudC9zIjsKKwkgICAgU0VUX0NPVU5UOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIElzc3VlIGEgc2V0LXZlcnNpb24gaW9jdGwuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBkcm1Db21tYW5kSW5kZXggY29tbWFuZCBpbmRleCAKKyAqIFxwYXJhbSBkYXRhIHNvdXJjZSBwb2ludGVyIG9mIHRoZSBkYXRhIHRvIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisgKiBccGFyYW0gc2l6ZSBzaXplIG9mIHRoZSBkYXRhIHRvIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgcmVhZC13cml0ZSBpb2N0bCBnaXZlbiBieSAKKyAqIFxjb2RlIERSTV9DT01NQU5EX0JBU0UgKyBkcm1Db21tYW5kSW5kZXggXGVuZGNvZGUuCisgKi8KK2ludCBkcm1TZXRJbnRlcmZhY2VWZXJzaW9uKGludCBmZCwgZHJtU2V0VmVyc2lvbiAqdmVyc2lvbikKK3sKKyAgICBpbnQgcmV0Y29kZSA9IDA7CisgICAgZHJtX3NldF92ZXJzaW9uX3Qgc3Y7CisKKyAgICBtZW1jbGVhcihzdik7CisgICAgc3YuZHJtX2RpX21ham9yID0gdmVyc2lvbi0+ZHJtX2RpX21ham9yOworICAgIHN2LmRybV9kaV9taW5vciA9IHZlcnNpb24tPmRybV9kaV9taW5vcjsKKyAgICBzdi5kcm1fZGRfbWFqb3IgPSB2ZXJzaW9uLT5kcm1fZGRfbWFqb3I7CisgICAgc3YuZHJtX2RkX21pbm9yID0gdmVyc2lvbi0+ZHJtX2RkX21pbm9yOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU0VUX1ZFUlNJT04sICZzdikpIHsKKwlyZXRjb2RlID0gLWVycm5vOworICAgIH0KKworICAgIHZlcnNpb24tPmRybV9kaV9tYWpvciA9IHN2LmRybV9kaV9tYWpvcjsKKyAgICB2ZXJzaW9uLT5kcm1fZGlfbWlub3IgPSBzdi5kcm1fZGlfbWlub3I7CisgICAgdmVyc2lvbi0+ZHJtX2RkX21ham9yID0gc3YuZHJtX2RkX21ham9yOworICAgIHZlcnNpb24tPmRybV9kZF9taW5vciA9IHN2LmRybV9kZF9taW5vcjsKKworICAgIHJldHVybiByZXRjb2RlOworfQorCisvKioKKyAqIFNlbmQgYSBkZXZpY2Utc3BlY2lmaWMgY29tbWFuZC4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGRybUNvbW1hbmRJbmRleCBjb21tYW5kIGluZGV4IAorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICogCisgKiBcaW50ZXJuYWwKKyAqIEl0IGlzc3VlcyBhIGlvY3RsIGdpdmVuIGJ5IAorICogXGNvZGUgRFJNX0NPTU1BTkRfQkFTRSArIGRybUNvbW1hbmRJbmRleCBcZW5kY29kZS4KKyAqLworaW50IGRybUNvbW1hbmROb25lKGludCBmZCwgdW5zaWduZWQgbG9uZyBkcm1Db21tYW5kSW5kZXgpCit7CisgICAgdW5zaWduZWQgbG9uZyByZXF1ZXN0OworCisgICAgcmVxdWVzdCA9IERSTV9JTyggRFJNX0NPTU1BTkRfQkFTRSArIGRybUNvbW1hbmRJbmRleCk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIHJlcXVlc3QsIE5VTEwpKSB7CisJcmV0dXJuIC1lcnJubzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBTZW5kIGEgZGV2aWNlLXNwZWNpZmljIHJlYWQgY29tbWFuZC4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGRybUNvbW1hbmRJbmRleCBjb21tYW5kIGluZGV4IAorICogXHBhcmFtIGRhdGEgZGVzdGluYXRpb24gcG9pbnRlciBvZiB0aGUgZGF0YSB0byBiZSByZWFkLgorICogXHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgZGF0YSB0byBiZSByZWFkLgorICogCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgcmVhZCBpb2N0bCBnaXZlbiBieSAKKyAqIFxjb2RlIERSTV9DT01NQU5EX0JBU0UgKyBkcm1Db21tYW5kSW5kZXggXGVuZGNvZGUuCisgKi8KK2ludCBkcm1Db21tYW5kUmVhZChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgZHJtQ29tbWFuZEluZGV4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJlcXVlc3Q7CisKKyAgICByZXF1ZXN0ID0gRFJNX0lPQyggRFJNX0lPQ19SRUFELCBEUk1fSU9DVExfQkFTRSwgCisJRFJNX0NPTU1BTkRfQkFTRSArIGRybUNvbW1hbmRJbmRleCwgc2l6ZSk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIHJlcXVlc3QsIGRhdGEpKSB7CisJcmV0dXJuIC1lcnJubzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBTZW5kIGEgZGV2aWNlLXNwZWNpZmljIHdyaXRlIGNvbW1hbmQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBkcm1Db21tYW5kSW5kZXggY29tbWFuZCBpbmRleCAKKyAqIFxwYXJhbSBkYXRhIHNvdXJjZSBwb2ludGVyIG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgKiBccGFyYW0gc2l6ZSBzaXplIG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgd3JpdGUgaW9jdGwgZ2l2ZW4gYnkgCisgKiBcY29kZSBEUk1fQ09NTUFORF9CQVNFICsgZHJtQ29tbWFuZEluZGV4IFxlbmRjb2RlLgorICovCitpbnQgZHJtQ29tbWFuZFdyaXRlKGludCBmZCwgdW5zaWduZWQgbG9uZyBkcm1Db21tYW5kSW5kZXgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJlcXVlc3Q7CisKKyAgICByZXF1ZXN0ID0gRFJNX0lPQyggRFJNX0lPQ19XUklURSwgRFJNX0lPQ1RMX0JBU0UsIAorCURSTV9DT01NQU5EX0JBU0UgKyBkcm1Db21tYW5kSW5kZXgsIHNpemUpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCByZXF1ZXN0LCBkYXRhKSkgeworCXJldHVybiAtZXJybm87CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogU2VuZCBhIGRldmljZS1zcGVjaWZpYyByZWFkLXdyaXRlIGNvbW1hbmQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBkcm1Db21tYW5kSW5kZXggY29tbWFuZCBpbmRleCAKKyAqIFxwYXJhbSBkYXRhIHNvdXJjZSBwb2ludGVyIG9mIHRoZSBkYXRhIHRvIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisgKiBccGFyYW0gc2l6ZSBzaXplIG9mIHRoZSBkYXRhIHRvIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisgKiAKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKiAKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgcmVhZC13cml0ZSBpb2N0bCBnaXZlbiBieSAKKyAqIFxjb2RlIERSTV9DT01NQU5EX0JBU0UgKyBkcm1Db21tYW5kSW5kZXggXGVuZGNvZGUuCisgKi8KK2ludCBkcm1Db21tYW5kV3JpdGVSZWFkKGludCBmZCwgdW5zaWduZWQgbG9uZyBkcm1Db21tYW5kSW5kZXgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgdW5zaWduZWQgbG9uZyByZXF1ZXN0OworCisgICAgcmVxdWVzdCA9IERSTV9JT0MoIERSTV9JT0NfUkVBRHxEUk1fSU9DX1dSSVRFLCBEUk1fSU9DVExfQkFTRSwgCisJRFJNX0NPTU1BTkRfQkFTRSArIGRybUNvbW1hbmRJbmRleCwgc2l6ZSk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIHJlcXVlc3QsIGRhdGEpKQorCXJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRFJNX01BWF9GRFMgMTYKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNoYXIgKkJ1c0lEOworICAgIGludCBmZDsKKyAgICBpbnQgcmVmY291bnQ7CisgICAgaW50IHR5cGU7Cit9IGNvbm5lY3Rpb25bRFJNX01BWF9GRFNdOworCitzdGF0aWMgaW50IG5yX2ZkcyA9IDA7CisKK2ludCBkcm1PcGVuT25jZSh2b2lkICp1bnVzZWQsIAorCQljb25zdCBjaGFyICpCdXNJRCwKKwkJaW50ICpuZXdseW9wZW5lZCkKK3sKKyAgICByZXR1cm4gZHJtT3Blbk9uY2VXaXRoVHlwZShCdXNJRCwgbmV3bHlvcGVuZWQsIERSTV9OT0RFX1BSSU1BUlkpOworfQorCitpbnQgZHJtT3Blbk9uY2VXaXRoVHlwZShjb25zdCBjaGFyICpCdXNJRCwgaW50ICpuZXdseW9wZW5lZCwgaW50IHR5cGUpCit7CisgICAgaW50IGk7CisgICAgaW50IGZkOworICAgCisgICAgZm9yIChpID0gMDsgaSA8IG5yX2ZkczsgaSsrKQorCWlmICgoc3RyY21wKEJ1c0lELCBjb25uZWN0aW9uW2ldLkJ1c0lEKSA9PSAwKSAmJgorCSAgICAoY29ubmVjdGlvbltpXS50eXBlID09IHR5cGUpKSB7CisJICAgIGNvbm5lY3Rpb25baV0ucmVmY291bnQrKzsKKwkgICAgKm5ld2x5b3BlbmVkID0gMDsKKwkgICAgcmV0dXJuIGNvbm5lY3Rpb25baV0uZmQ7CisJfQorCisgICAgZmQgPSBkcm1PcGVuV2l0aFR5cGUoTlVMTCwgQnVzSUQsIHR5cGUpOworICAgIGlmIChmZCA8PSAwIHx8IG5yX2ZkcyA9PSBEUk1fTUFYX0ZEUykKKwlyZXR1cm4gZmQ7CisgICAKKyAgICBjb25uZWN0aW9uW25yX2Zkc10uQnVzSUQgPSBzdHJkdXAoQnVzSUQpOworICAgIGNvbm5lY3Rpb25bbnJfZmRzXS5mZCA9IGZkOworICAgIGNvbm5lY3Rpb25bbnJfZmRzXS5yZWZjb3VudCA9IDE7CisgICAgY29ubmVjdGlvbltucl9mZHNdLnR5cGUgPSB0eXBlOworICAgICpuZXdseW9wZW5lZCA9IDE7CisKKyAgICBpZiAoMCkKKwlmcHJpbnRmKHN0ZGVyciwgInNhdmVkIGNvbm5lY3Rpb24gJWQgZm9yICVzICVkXG4iLCAKKwkJbnJfZmRzLCBjb25uZWN0aW9uW25yX2Zkc10uQnVzSUQsIAorCQlzdHJjbXAoQnVzSUQsIGNvbm5lY3Rpb25bbnJfZmRzXS5CdXNJRCkpOworCisgICAgbnJfZmRzKys7CisKKyAgICByZXR1cm4gZmQ7Cit9CisKK3ZvaWQgZHJtQ2xvc2VPbmNlKGludCBmZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucl9mZHM7IGkrKykgeworCWlmIChmZCA9PSBjb25uZWN0aW9uW2ldLmZkKSB7CisJICAgIGlmICgtLWNvbm5lY3Rpb25baV0ucmVmY291bnQgPT0gMCkgeworCQlkcm1DbG9zZShjb25uZWN0aW9uW2ldLmZkKTsKKwkJZnJlZShjb25uZWN0aW9uW2ldLkJ1c0lEKTsKKwkgICAgCisJCWlmIChpIDwgLS1ucl9mZHMpIAorCQkgICAgY29ubmVjdGlvbltpXSA9IGNvbm5lY3Rpb25bbnJfZmRzXTsKKworCQlyZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorfQorCitpbnQgZHJtU2V0TWFzdGVyKGludCBmZCkKK3sKKwlyZXR1cm4gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TRVRfTUFTVEVSLCBOVUxMKTsKK30KKworaW50IGRybURyb3BNYXN0ZXIoaW50IGZkKQoreworCXJldHVybiBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0RST1BfTUFTVEVSLCBOVUxMKTsKK30KKworY2hhciAqZHJtR2V0RGV2aWNlTmFtZUZyb21GZChpbnQgZmQpCit7CisJY2hhciBuYW1lWzEyOF07CisJc3RydWN0IHN0YXQgc2J1ZjsKKwlkZXZfdCBkOworCWludCBpOworCisJLyogVGhlIHdob2xlIGRybU9wZW4gdGhpbmcgaXMgYSBmaWFzY28gYW5kIHdlIG5lZWQgdG8gZmluZCBhIHdheQorCSAqIGJhY2sgdG8ganVzdCB1c2luZyBvcGVuKDIpLiAgRm9yIG5vdywgaG93ZXZlciwgbGV0cyBqdXN0IG1ha2UKKwkgKiB0aGluZ3Mgd29yc2Ugd2l0aCBldmVuIG1vcmUgYWQgaG9jIGRpcmVjdG9yeSB3YWxraW5nIGNvZGUgdG8KKwkgKiBkaXNjb3ZlciB0aGUgZGV2aWNlIGZpbGUgbmFtZS4gKi8KKworCWZzdGF0KGZkLCAmc2J1Zik7CisJZCA9IHNidWYuc3RfcmRldjsKKworCWZvciAoaSA9IDA7IGkgPCBEUk1fTUFYX01JTk9SOyBpKyspIHsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsIERSTV9ERVZfTkFNRSwgRFJNX0RJUl9OQU1FLCBpKTsKKwkJaWYgKHN0YXQobmFtZSwgJnNidWYpID09IDAgJiYgc2J1Zi5zdF9yZGV2ID09IGQpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gRFJNX01BWF9NSU5PUikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gc3RyZHVwKG5hbWUpOworfQorCitpbnQgZHJtR2V0Tm9kZVR5cGVGcm9tRmQoaW50IGZkKQoreworCXN0cnVjdCBzdGF0IHNidWY7CisJaW50IG1haiwgbWluLCB0eXBlOworCisJaWYgKGZzdGF0KGZkLCAmc2J1ZikpCisJCXJldHVybiAtMTsKKworCW1haiA9IG1ham9yKHNidWYuc3RfcmRldik7CisJbWluID0gbWlub3Ioc2J1Zi5zdF9yZGV2KTsKKworCWlmIChtYWogIT0gRFJNX01BSk9SIHx8ICFTX0lTQ0hSKHNidWYuc3RfbW9kZSkpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwl0eXBlID0gZHJtR2V0TWlub3JUeXBlKG1pbik7CisJaWYgKHR5cGUgPT0gLTEpCisJCWVycm5vID0gRU5PREVWOworCXJldHVybiB0eXBlOworfQorCitpbnQgZHJtUHJpbWVIYW5kbGVUb0ZEKGludCBmZCwgdWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCBmbGFncywgaW50ICpwcmltZV9mZCkKK3sKKwlzdHJ1Y3QgZHJtX3ByaW1lX2hhbmRsZSBhcmdzOworCWludCByZXQ7CisKKwlhcmdzLmhhbmRsZSA9IGhhbmRsZTsKKwlhcmdzLmZsYWdzID0gZmxhZ3M7CisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9QUklNRV9IQU5ETEVfVE9fRkQsICZhcmdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJKnByaW1lX2ZkID0gYXJncy5mZDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRybVByaW1lRkRUb0hhbmRsZShpbnQgZmQsIGludCBwcmltZV9mZCwgdWludDMyX3QgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX3ByaW1lX2hhbmRsZSBhcmdzOworCWludCByZXQ7CisKKwlhcmdzLmZkID0gcHJpbWVfZmQ7CisJYXJncy5mbGFncyA9IDA7CisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9QUklNRV9GRF9UT19IQU5ETEUsICZhcmdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJKmhhbmRsZSA9IGFyZ3MuaGFuZGxlOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqZHJtR2V0TWlub3JOYW1lRm9yRkQoaW50IGZkLCBpbnQgdHlwZSkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKwlESVIgKnN5c2RpcjsKKwlzdHJ1Y3QgZGlyZW50ICpwZW50LCAqZW50OworCXN0cnVjdCBzdGF0IHNidWY7CisJY29uc3QgY2hhciAqbmFtZSA9IGRybUdldE1pbm9yTmFtZSh0eXBlKTsKKwlpbnQgbGVuOworCWNoYXIgZGV2X25hbWVbNjRdLCBidWZbNjRdOworCWxvbmcgbmFtZV9tYXg7CisJaW50IG1haiwgbWluOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHN0cmxlbihuYW1lKTsKKworCWlmIChmc3RhdChmZCwgJnNidWYpKQorCQlyZXR1cm4gTlVMTDsKKworCW1haiA9IG1ham9yKHNidWYuc3RfcmRldik7CisJbWluID0gbWlub3Ioc2J1Zi5zdF9yZGV2KTsKKworCWlmIChtYWogIT0gRFJNX01BSk9SIHx8ICFTX0lTQ0hSKHNidWYuc3RfbW9kZSkpCisJCXJldHVybiBOVUxMOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9zeXMvZGV2L2NoYXIvJWQ6JWQvZGV2aWNlL2RybSIsIG1haiwgbWluKTsKKworCXN5c2RpciA9IG9wZW5kaXIoYnVmKTsKKwlpZiAoIXN5c2RpcikKKwkJcmV0dXJuIE5VTEw7CisKKwluYW1lX21heCA9IGZwYXRoY29uZihkaXJmZChzeXNkaXIpLCBfUENfTkFNRV9NQVgpOworCWlmIChuYW1lX21heCA9PSAtMSkKKwkJZ290byBvdXRfY2xvc2VfZGlyOworCisJcGVudCA9IG1hbGxvYyhvZmZzZXRvZihzdHJ1Y3QgZGlyZW50LCBkX25hbWUpICsgbmFtZV9tYXggKyAxKTsKKwlpZiAocGVudCA9PSBOVUxMKQorCQkgZ290byBvdXRfY2xvc2VfZGlyOworCisJd2hpbGUgKHJlYWRkaXJfcihzeXNkaXIsIHBlbnQsICZlbnQpID09IDAgJiYgZW50ICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAoZW50LT5kX25hbWUsIG5hbWUsIGxlbikgPT0gMCkgeworCQkJZnJlZShwZW50KTsKKwkJCWNsb3NlZGlyKHN5c2Rpcik7CisKKwkJCXNucHJpbnRmKGRldl9uYW1lLCBzaXplb2YoZGV2X25hbWUpLCBEUk1fRElSX05BTUUgIi8lcyIsCisJCQkJIGVudC0+ZF9uYW1lKTsKKwkJCXJldHVybiBzdHJkdXAoZGV2X25hbWUpOworCQl9CisJfQorCisJZnJlZShwZW50KTsKKworb3V0X2Nsb3NlX2RpcjoKKwljbG9zZWRpcihzeXNkaXIpOworI2VuZGlmCisJcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKmRybUdldFByaW1hcnlEZXZpY2VOYW1lRnJvbUZkKGludCBmZCkKK3sKKwlyZXR1cm4gZHJtR2V0TWlub3JOYW1lRm9yRkQoZmQsIERSTV9OT0RFX1BSSU1BUlkpOworfQorCitjaGFyICpkcm1HZXRSZW5kZXJEZXZpY2VOYW1lRnJvbUZkKGludCBmZCkKK3sKKwlyZXR1cm4gZHJtR2V0TWlub3JOYW1lRm9yRkQoZmQsIERSTV9OT0RFX1JFTkRFUik7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtLmggYi9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjNTVjOQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZkcm0uaApAQCAtMCwwICsxLDc1OSBAQAorLyoqCisgKiBcZmlsZSB4Zjg2ZHJtLmggCisgKiBPUy1pbmRlcGVuZGVudCBoZWFkZXIgZm9yIERSTSB1c2VyLWxldmVsIGxpYnJhcnkgaW50ZXJmYWNlLgorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKi8KKyAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfWEY4NkRSTV9IXworI2RlZmluZSBfWEY4NkRSTV9IXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZHJtLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIERSTV9NQVhfTUlOT1IKKyNkZWZpbmUgRFJNX01BWF9NSU5PUiAgIDE2CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorCisjZGVmaW5lIERSTV9JT0NUTF9OUihuKQkJX0lPQ19OUihuKQorI2RlZmluZSBEUk1fSU9DX1ZPSUQJCV9JT0NfTk9ORQorI2RlZmluZSBEUk1fSU9DX1JFQUQJCV9JT0NfUkVBRAorI2RlZmluZSBEUk1fSU9DX1dSSVRFCQlfSU9DX1dSSVRFCisjZGVmaW5lIERSTV9JT0NfUkVBRFdSSVRFCV9JT0NfUkVBRHxfSU9DX1dSSVRFCisjZGVmaW5lIERSTV9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpIF9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpCisKKyNlbHNlIC8qIE9uZSBvZiB0aGUgKkJTRHMgKi8KKworI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNkZWZpbmUgRFJNX0lPQ1RMX05SKG4pICAgICAgICAgKChuKSAmIDB4ZmYpCisjZGVmaW5lIERSTV9JT0NfVk9JRCAgICAgICAgICAgIElPQ19WT0lECisjZGVmaW5lIERSTV9JT0NfUkVBRCAgICAgICAgICAgIElPQ19PVVQKKyNkZWZpbmUgRFJNX0lPQ19XUklURSAgICAgICAgICAgSU9DX0lOCisjZGVmaW5lIERSTV9JT0NfUkVBRFdSSVRFICAgICAgIElPQ19JTk9VVAorI2RlZmluZSBEUk1fSU9DKGRpciwgZ3JvdXAsIG5yLCBzaXplKSBfSU9DKGRpciwgZ3JvdXAsIG5yLCBzaXplKQorCisjZW5kaWYKKworCQkJCS8qIERlZmF1bHRzLCBpZiBub3RoaW5nIHNldCBpbiB4Zjg2Y29uZmlnICovCisjZGVmaW5lIERSTV9ERVZfVUlECSAwCisjZGVmaW5lIERSTV9ERVZfR0lECSAwCisvKiBEZWZhdWx0IC9kZXYvZHJpIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyAwNzU1ICovCisjZGVmaW5lIERSTV9ERVZfRElSTU9ERQkgCVwKKwkoU19JUlVTUnxTX0lXVVNSfFNfSVhVU1J8U19JUkdSUHxTX0lYR1JQfFNfSVJPVEh8U19JWE9USCkKKyNkZWZpbmUgRFJNX0RFVl9NT0RFCSAoU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JV0dSUCkKKworI2RlZmluZSBEUk1fRElSX05BTUUgICIvZGV2L2RyaSIKKyNkZWZpbmUgRFJNX0RFVl9OQU1FICAiJXMvY2FyZCVkIgorI2RlZmluZSBEUk1fQ09OVFJPTF9ERVZfTkFNRSAgIiVzL2NvbnRyb2xEJWQiCisjZGVmaW5lIERSTV9SRU5ERVJfREVWX05BTUUgICIlcy9yZW5kZXJEJWQiCisjZGVmaW5lIERSTV9QUk9DX05BTUUgIi9wcm9jL2RyaS8iIC8qIEZvciBiYWNrd2FyZCBMaW51eCBjb21wYXRpYmlsaXR5ICovCisKKyNkZWZpbmUgRFJNX0VSUl9OT19ERVZJQ0UgICgtMTAwMSkKKyNkZWZpbmUgRFJNX0VSUl9OT19BQ0NFU1MgICgtMTAwMikKKyNkZWZpbmUgRFJNX0VSUl9OT1RfUk9PVCAgICgtMTAwMykKKyNkZWZpbmUgRFJNX0VSUl9JTlZBTElEICAgICgtMTAwNCkKKyNkZWZpbmUgRFJNX0VSUl9OT19GRCAgICAgICgtMTAwNSkKKworI2RlZmluZSBEUk1fQUdQX05PX0hBTkRMRSAwCisKK3R5cGVkZWYgdW5zaWduZWQgaW50ICBkcm1TaXplLCAgICAgKmRybVNpemVQdHI7CSAgICAvKio8IEZvciBtYXBwZWQgcmVnaW9ucyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICpkcm1BZGRyZXNzLCAqKmRybUFkZHJlc3NQdHI7IC8qKjwgRm9yIG1hcHBlZCByZWdpb25zICovCisKKyNpZiAoX19HTlVDX18gPj0gMykKKyNkZWZpbmUgRFJNX1BSSU5URkxJS0UoZiwgYSkgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChfX3ByaW50Zl9fLCBmLCBhKSkpCisjZWxzZQorI2RlZmluZSBEUk1fUFJJTlRGTElLRShmLCBhKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9kcm1TZXJ2ZXJJbmZvIHsKKyAgaW50ICgqZGVidWdfcHJpbnQpKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkgRFJNX1BSSU5URkxJS0UoMSwwKTsKKyAgaW50ICgqbG9hZF9tb2R1bGUpKGNvbnN0IGNoYXIgKm5hbWUpOworICB2b2lkICgqZ2V0X3Blcm1zKShnaWRfdCAqLCBtb2RlX3QgKik7Cit9IGRybVNlcnZlckluZm8sICpkcm1TZXJ2ZXJJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBkcm1IYXNoRW50cnkgeworICAgIGludCAgICAgIGZkOworICAgIHZvaWQgICAgICgqZikoaW50LCB2b2lkICosIHZvaWQgKik7CisgICAgdm9pZCAgICAgKnRhZ1RhYmxlOworfSBkcm1IYXNoRW50cnk7CisKK2V4dGVybiBpbnQgZHJtSW9jdGwoaW50IGZkLCB1bnNpZ25lZCBsb25nIHJlcXVlc3QsIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCAqZHJtR2V0SGFzaFRhYmxlKHZvaWQpOworZXh0ZXJuIGRybUhhc2hFbnRyeSAqZHJtR2V0RW50cnkoaW50IGZkKTsKKworLyoqCisgKiBEcml2ZXIgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBcc2EgZHJtR2V0VmVyc2lvbigpIGFuZCBkcm1TZXRWZXJzaW9uKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1WZXJzaW9uIHsKKyAgICBpbnQgICAgIHZlcnNpb25fbWFqb3I7ICAgICAgICAvKio8IE1ham9yIHZlcnNpb24gKi8KKyAgICBpbnQgICAgIHZlcnNpb25fbWlub3I7ICAgICAgICAvKio8IE1pbm9yIHZlcnNpb24gKi8KKyAgICBpbnQgICAgIHZlcnNpb25fcGF0Y2hsZXZlbDsgICAvKio8IFBhdGNoIGxldmVsICovCisgICAgaW50ICAgICBuYW1lX2xlbjsgCSAgICAgICAgICAvKio8IExlbmd0aCBvZiBuYW1lIGJ1ZmZlciAqLworICAgIGNoYXIgICAgKm5hbWU7CSAgICAgICAgICAvKio8IE5hbWUgb2YgZHJpdmVyICovCisgICAgaW50ICAgICBkYXRlX2xlbjsgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgZGF0ZSBidWZmZXIgKi8KKyAgICBjaGFyICAgICpkYXRlOyAgICAgICAgICAgICAgICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGF0ZSAqLworICAgIGludCAgICAgZGVzY19sZW47CSAgICAgICAgICAvKio8IExlbmd0aCBvZiBkZXNjIGJ1ZmZlciAqLworICAgIGNoYXIgICAgKmRlc2M7ICAgICAgICAgICAgICAgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkZXNjICovCit9IGRybVZlcnNpb24sICpkcm1WZXJzaW9uUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtU3RhdHMgeworICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7CSAgICAgLyoqPCBOdW1iZXIgb2YgZGF0YSAqLworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsJICAgICAvKio8IFZhbHVlIGZyb20ga2VybmVsICovCisJY29uc3QgY2hhciAgICAqbG9uZ19mb3JtYXQ7ICAvKio8IFN1Z2dlc3RlZCBmb3JtYXQgZm9yIGxvbmdfbmFtZSAqLworCWNvbnN0IGNoYXIgICAgKmxvbmdfbmFtZTsgICAgLyoqPCBMb25nIG5hbWUgZm9yIHZhbHVlICovCisJY29uc3QgY2hhciAgICAqcmF0ZV9mb3JtYXQ7ICAvKio8IFN1Z2dlc3RlZCBmb3JtYXQgZm9yIHJhdGVfbmFtZSAqLworCWNvbnN0IGNoYXIgICAgKnJhdGVfbmFtZTsgICAgLyoqPCBTaG9ydCBuYW1lIGZvciB2YWx1ZSBwZXIgc2Vjb25kICovCisJaW50ICAgICAgICAgICBpc3ZhbHVlOyAgICAgICAvKio8IFRydWUgaWYgdmFsdWUgKHZzLiBjb3VudGVyKSAqLworCWNvbnN0IGNoYXIgICAgKm11bHRfbmFtZXM7ICAgLyoqPCBNdWx0aXBsaWVyIG5hbWVzIChlLmcuLCAiS0dNIikgKi8KKwlpbnQgICAgICAgICAgIG11bHQ7ICAgICAgICAgIC8qKjwgTXVsdGlwbGllciB2YWx1ZSAoZS5nLiwgMTAyNCkgKi8KKwlpbnQgICAgICAgICAgIHZlcmJvc2U7ICAgICAgIC8qKjwgU3VnZ2VzdCBvbmx5IGluIHZlcmJvc2Ugb3V0cHV0ICovCisgICAgfSBkYXRhWzE1XTsKK30gZHJtU3RhdHNUOworCisKKwkJCQkvKiBBbGwgb2YgdGhlc2UgZW51bXMgKk1VU1QqIG1hdGNoIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAtLSBzbyBkbyAqTk9UKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgdGhlbSEgIChUaGUgZHJtbGliIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwganVzdCBjb3B5IHRoZSBmbGFncyBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW5nIHRoZW0uKSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBEUk1fRlJBTUVfQlVGRkVSICAgID0gMCwgICAgICAvKio8IFdDLCBubyBjYWNoaW5nLCBubyBjb3JlIGR1bXAgKi8KKyAgICBEUk1fUkVHSVNURVJTICAgICAgID0gMSwgICAgICAvKio8IG5vIGNhY2hpbmcsIG5vIGNvcmUgZHVtcCAqLworICAgIERSTV9TSE0gICAgICAgICAgICAgPSAyLCAgICAgIC8qKjwgc2hhcmVkLCBjYWNoZWQgKi8KKyAgICBEUk1fQUdQICAgICAgICAgICAgID0gMywJICAvKio8IEFHUC9HQVJUICovCisgICAgRFJNX1NDQVRURVJfR0FUSEVSICA9IDQsCSAgLyoqPCBQQ0kgc2NhdHRlci9nYXRoZXIgKi8KKyAgICBEUk1fQ09OU0lTVEVOVCAgICAgID0gNQkgIC8qKjwgUENJIGNvbnNpc3RlbnQgKi8KK30gZHJtTWFwVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBEUk1fUkVTVFJJQ1RFRCAgICAgID0gMHgwMDAxLCAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gY2xpZW50LXZpcnR1YWwgKi8KKyAgICBEUk1fUkVBRF9PTkxZICAgICAgID0gMHgwMDAyLCAvKio8IFJlYWQtb25seSBpbiBjbGllbnQtdmlydHVhbCAqLworICAgIERSTV9MT0NLRUQgICAgICAgICAgPSAweDAwMDQsIC8qKjwgUGh5c2ljYWwgcGFnZXMgbG9ja2VkICovCisgICAgRFJNX0tFUk5FTCAgICAgICAgICA9IDB4MDAwOCwgLyoqPCBLZXJuZWwgcmVxdWlyZXMgYWNjZXNzICovCisgICAgRFJNX1dSSVRFX0NPTUJJTklORyA9IDB4MDAxMCwgLyoqPCBVc2Ugd3JpdGUtY29tYmluaW5nLCBpZiBhdmFpbGFibGUgKi8KKyAgICBEUk1fQ09OVEFJTlNfTE9DSyAgID0gMHgwMDIwLCAvKio8IFNITSBwYWdlIHRoYXQgY29udGFpbnMgbG9jayAqLworICAgIERSTV9SRU1PVkFCTEUJPSAweDAwNDAgIC8qKjwgUmVtb3ZhYmxlIG1hcHBpbmcgKi8KK30gZHJtTWFwRmxhZ3M7CisKKy8qKgorICogXHdhcm5pbmcgVGhlc2UgdmFsdWVzICpNVVNUKiBtYXRjaCBkcm0uaAorICovCit0eXBlZGVmIGVudW0geworICAgIC8qKiBcbmFtZSBGbGFncyBmb3IgRE1BIGJ1ZmZlciBkaXNwYXRjaCAqLworICAgIC8qQHsqLworICAgIERSTV9ETUFfQkxPQ0sgICAgICAgID0gMHgwMSwgLyoqPCAKKwkJCQkgICogQmxvY2sgdW50aWwgYnVmZmVyIGRpc3BhdGNoZWQuCisJCQkJICAqIAorCQkJCSAgKiBcbm90ZSB0aGUgYnVmZmVyIG1heSBub3QgeWV0IGhhdmUgYmVlbgorCQkJCSAgKiBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlIC0tIGdldHRpbmcgYQorCQkJCSAgKiBoYXJkd2FyZSBsb2NrIHdpdGggdGhlIGhhcmR3YXJlIHF1aWVzY2VudAorCQkJCSAgKiB3aWxsIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4KKwkJCQkgICogcHJvY2Vzc2VkLgorCQkJCSAgKi8KKyAgICBEUk1fRE1BX1dISUxFX0xPQ0tFRCA9IDB4MDIsIC8qKjwgRGlzcGF0Y2ggd2hpbGUgbG9jayBoZWxkICovCisgICAgRFJNX0RNQV9QUklPUklUWSAgICAgPSAweDA0LCAvKio8IEhpZ2ggcHJpb3JpdHkgZGlzcGF0Y2ggKi8KKyAgICAvKkB9Ki8KKworICAgIC8qKiBcbmFtZSBGbGFncyBmb3IgRE1BIGJ1ZmZlciByZXF1ZXN0ICovCisgICAgLypAeyovCisgICAgRFJNX0RNQV9XQUlUICAgICAgICAgPSAweDEwLCAvKio8IFdhaXQgZm9yIGZyZWUgYnVmZmVycyAqLworICAgIERSTV9ETUFfU01BTExFUl9PSyAgID0gMHgyMCwgLyoqPCBTbWFsbGVyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KKyAgICBEUk1fRE1BX0xBUkdFUl9PSyAgICA9IDB4NDAgIC8qKjwgTGFyZ2VyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KKyAgICAvKkB9Ki8KK30gZHJtRE1BRmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRFJNX1BBR0VfQUxJR04gICAgICAgPSAweDAxLAorICAgIERSTV9BR1BfQlVGRkVSICAgICAgID0gMHgwMiwKKyAgICBEUk1fU0dfQlVGRkVSICAgICAgICA9IDB4MDQsCisgICAgRFJNX0ZCX0JVRkZFUiAgICAgICAgPSAweDA4LAorICAgIERSTV9QQ0lfQlVGRkVSX1JPICAgID0gMHgxMAorfSBkcm1CdWZEZXNjRmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRFJNX0xPQ0tfUkVBRFkgICAgICA9IDB4MDEsIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBpcyByZWFkeSBmb3IgRE1BICovCisgICAgRFJNX0xPQ0tfUVVJRVNDRU5UICA9IDB4MDIsIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KKyAgICBEUk1fTE9DS19GTFVTSCAgICAgID0gMHgwNCwgLyoqPCBGbHVzaCB0aGlzIGNvbnRleHQncyBETUEgcXVldWUgZmlyc3QgKi8KKyAgICBEUk1fTE9DS19GTFVTSF9BTEwgID0gMHgwOCwgLyoqPCBGbHVzaCBhbGwgRE1BIHF1ZXVlcyBmaXJzdCAqLworCQkJCS8qIFRoZXNlICpIQUxUKiBmbGFncyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0aGV5IHdpbGwgYmUgdXNlZCB0byBzdXBwb3J0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsLXNjcmVlbiBER0EtbGlrZSBtb2RlLiAqLworICAgIERSTV9IQUxUX0FMTF9RVUVVRVMgPSAweDEwLCAvKio8IEhhbHQgYWxsIGN1cnJlbnQgYW5kIGZ1dHVyZSBxdWV1ZXMgKi8KKyAgICBEUk1fSEFMVF9DVVJfUVVFVUVTID0gMHgyMCAgLyoqPCBIYWx0IGFsbCBjdXJyZW50IHF1ZXVlcyAqLworfSBkcm1Mb2NrRmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRFJNX0NPTlRFWFRfUFJFU0VSVkVEID0gMHgwMSwgLyoqPCBUaGlzIGNvbnRleHQgaXMgcHJlc2VydmVkIGFuZAorCQkJCSAgICAgbmV2ZXIgc3dhcHBlZC4gKi8KKyAgICBEUk1fQ09OVEVYVF8yRE9OTFkgICAgPSAweDAyICAvKio8IFRoaXMgY29udGV4dCBpcyBmb3IgMkQgcmVuZGVyaW5nIG9ubHkuICovCit9IGRybV9jb250ZXh0X3RGbGFncywgKmRybV9jb250ZXh0X3RGbGFnc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybUJ1ZkRlc2MgeworICAgIGludCAgICAgICAgICAgICAgY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBvZiB0aGlzIHNpemUgKi8KKyAgICBpbnQgICAgICAgICAgICAgIHNpemU7CSAgLyoqPCBTaXplIGluIGJ5dGVzICovCisgICAgaW50ICAgICAgICAgICAgICBsb3dfbWFyazsJICAvKio8IExvdyB3YXRlciBtYXJrICovCisgICAgaW50ICAgICAgICAgICAgICBoaWdoX21hcms7CSAgLyoqPCBIaWdoIHdhdGVyIG1hcmsgKi8KK30gZHJtQnVmRGVzYywgKmRybUJ1ZkRlc2NQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1CdWZJbmZvIHsKKyAgICBpbnQgICAgICAgICAgICAgIGNvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGluIGxpc3QgKi8KKyAgICBkcm1CdWZEZXNjUHRyICAgIGxpc3Q7CSAgLyoqPCBMaXN0IG9mIGJ1ZmZlciBkZXNjcmlwdGlvbnMgKi8KK30gZHJtQnVmSW5mbywgKmRybUJ1ZkluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1CdWYgeworICAgIGludCAgICAgICAgICAgICAgaWR4OwkgIC8qKjwgSW5kZXggaW50byB0aGUgbWFzdGVyIGJ1ZmZlciBsaXN0ICovCisgICAgaW50ICAgICAgICAgICAgICB0b3RhbDsJICAvKio8IEJ1ZmZlciBzaXplICovCisgICAgaW50ICAgICAgICAgICAgICB1c2VkOwkgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisgICAgZHJtQWRkcmVzcyAgICAgICBhZGRyZXNzOwkgIC8qKjwgQWRkcmVzcyAqLworfSBkcm1CdWYsICpkcm1CdWZQdHI7CisKKy8qKgorICogQnVmZmVyIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgKgorICogVXNlZCBieSBkcm1NYXBCdWZzKCkgYW5kIGRybVVubWFwQnVmcygpIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogbWFwcGVkIGJ1ZmZlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1CdWZNYXAgeworICAgIGludCAgICAgICAgICAgICAgY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBtYXBwZWQgKi8KKyAgICBkcm1CdWZQdHIgICAgICAgIGxpc3Q7CSAgLyoqPCBCdWZmZXJzICovCit9IGRybUJ1Zk1hcCwgKmRybUJ1Zk1hcFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybUxvY2sgeworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1s2MF07CisgICAgLyogVGhpcyBpcyBiaWcgZW5vdWdoIGZvciBtb3N0IGN1cnJlbnQgKGFuZCBmdXR1cmU/KSBhcmNoaXRlY3R1cmVzOgorICAgICAgIERFQyBBbHBoYTogICAgICAgICAgICAgIDMyIGJ5dGVzCisgICAgICAgSW50ZWwgTWVyY2VkOiAgICAgICAgICAgPworICAgICAgIEludGVsIFA1L1BQcm8vUElJL1BJSUk6IDMyIGJ5dGVzCisgICAgICAgSW50ZWwgU3Ryb25nQVJNOiAgICAgICAgMzIgYnl0ZXMKKyAgICAgICBJbnRlbCBpMzg2L2k0ODY6ICAgICAgICAxNiBieXRlcworICAgICAgIE1JUFM6ICAgICAgICAgICAgICAgICAgIDMyIGJ5dGVzICg/KQorICAgICAgIE1vdG9yb2xhIDY4azogICAgICAgICAgIDE2IGJ5dGVzCisgICAgICAgTW90b3JvbGEgUG93ZXJQQzogICAgICAgMzIgYnl0ZXMKKyAgICAgICBTdW4gU1BBUkM6ICAgICAgICAgICAgICAzMiBieXRlcworICAgICovCit9IGRybUxvY2ssICpkcm1Mb2NrUHRyOworCisvKioKKyAqIEluZGljZXMgaGVyZSByZWZlciB0byB0aGUgb2Zmc2V0IGludG8KKyAqIGxpc3QgaW4gZHJtQnVmSW5mbworICovCit0eXBlZGVmIHN0cnVjdCBfZHJtRE1BUmVxIHsKKyAgICBkcm1fY29udGV4dF90ICAgIGNvbnRleHQ7ICAJICAvKio8IENvbnRleHQgaGFuZGxlICovCisgICAgaW50ICAgICAgICAgICBzZW5kX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyB0byBzZW5kICovCisgICAgaW50ICAgICAgICAgICAqc2VuZF9saXN0OyAgICAgLyoqPCBMaXN0IG9mIGhhbmRsZXMgdG8gYnVmZmVycyAqLworICAgIGludCAgICAgICAgICAgKnNlbmRfc2l6ZXM7ICAgIC8qKjwgTGVuZ3RocyBvZiBkYXRhIHRvIHNlbmQsIGluIGJ5dGVzICovCisgICAgZHJtRE1BRmxhZ3MgICBmbGFnczsgICAgICAgICAgLyoqPCBGbGFncyAqLworICAgIGludCAgICAgICAgICAgcmVxdWVzdF9jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCisgICAgaW50ICAgICAgICAgICByZXF1ZXN0X3NpemU7CSAgLyoqPCBEZXNpcmVkIHNpemUgb2YgYnVmZmVycyByZXF1ZXN0ZWQgKi8KKyAgICBpbnQgICAgICAgICAgICpyZXF1ZXN0X2xpc3Q7ICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworICAgIGludCAgICAgICAgICAgKnJlcXVlc3Rfc2l6ZXM7IC8qKjwgTWluaW11bSBhY2NlcHRhYmxlIHNpemVzICovCisgICAgaW50ICAgICAgICAgICBncmFudGVkX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBncmFudGVkIGF0IHRoaXMgc2l6ZSAqLworfSBkcm1ETUFSZXEsICpkcm1ETUFSZXFQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1SZWdpb24geworICAgIGRybV9oYW5kbGVfdCAgICAgaGFuZGxlOworICAgIHVuc2lnbmVkIGludCAgb2Zmc2V0OworICAgIGRybVNpemUgICAgICAgc2l6ZTsKKyAgICBkcm1BZGRyZXNzICAgIG1hcDsKK30gZHJtUmVnaW9uLCAqZHJtUmVnaW9uUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtVGV4dHVyZVJlZ2lvbiB7CisgICAgdW5zaWduZWQgY2hhciBuZXh0OworICAgIHVuc2lnbmVkIGNoYXIgcHJldjsKKyAgICB1bnNpZ25lZCBjaGFyIGluX3VzZTsKKyAgICB1bnNpZ25lZCBjaGFyIHBhZGRpbmc7CS8qKjwgRXhwbGljaXRseSBwYWQgdGhpcyBvdXQgKi8KKyAgICB1bnNpZ25lZCBpbnQgIGFnZTsKK30gZHJtVGV4dHVyZVJlZ2lvbiwgKmRybVRleHR1cmVSZWdpb25QdHI7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBEUk1fVkJMQU5LX0FCU09MVVRFID0gMHgwLAkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBEUk1fVkJMQU5LX1JFTEFUSVZFID0gMHgxLAkvKio8IFdhaXQgZm9yIGdpdmVuIG51bWJlciBvZiB2YmxhbmtzICovCisgICAgLyogYml0cyAxLTYgYXJlIHJlc2VydmVkIGZvciBoaWdoIGNydGNzICovCisgICAgRFJNX1ZCTEFOS19ISUdIX0NSVENfTUFTSyA9IDB4MDAwMDAwM2UsCisgICAgRFJNX1ZCTEFOS19FVkVOVCA9IDB4NDAwMDAwMCwJLyoqPCBTZW5kIGV2ZW50IGluc3RlYWQgb2YgYmxvY2tpbmcgKi8KKyAgICBEUk1fVkJMQU5LX0ZMSVAgPSAweDgwMDAwMDAsCS8qKjwgU2NoZWR1bGVkIGJ1ZmZlciBzd2FwIHNob3VsZCBmbGlwICovCisgICAgRFJNX1ZCTEFOS19ORVhUT05NSVNTID0gMHgxMDAwMDAwMCwJLyoqPCBJZiBtaXNzZWQsIHdhaXQgZm9yIG5leHQgdmJsYW5rICovCisgICAgRFJNX1ZCTEFOS19TRUNPTkRBUlkgPSAweDIwMDAwMDAwLAkvKio8IFNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKyAgICBEUk1fVkJMQU5LX1NJR05BTCAgID0gMHg0MDAwMDAwMAkvKiBTZW5kIHNpZ25hbCBpbnN0ZWFkIG9mIGJsb2NraW5nICovCit9IGRybVZCbGFua1NlcVR5cGU7CisjZGVmaW5lIERSTV9WQkxBTktfSElHSF9DUlRDX1NISUZUIDEKKwordHlwZWRlZiBzdHJ1Y3QgX2RybVZCbGFua1JlcSB7CisJZHJtVkJsYW5rU2VxVHlwZSB0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIHNpZ25hbDsKK30gZHJtVkJsYW5rUmVxLCAqZHJtVkJsYW5rUmVxUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtVkJsYW5rUmVwbHkgeworCWRybVZCbGFua1NlcVR5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJbG9uZyB0dmFsX3NlYzsKKwlsb25nIHR2YWxfdXNlYzsKK30gZHJtVkJsYW5rUmVwbHksICpkcm1WQmxhbmtSZXBseVB0cjsKKwordHlwZWRlZiB1bmlvbiBfZHJtVkJsYW5rIHsKKwlkcm1WQmxhbmtSZXEgcmVxdWVzdDsKKwlkcm1WQmxhbmtSZXBseSByZXBseTsKK30gZHJtVkJsYW5rLCAqZHJtVkJsYW5rUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtU2V0VmVyc2lvbiB7CisJaW50IGRybV9kaV9tYWpvcjsKKwlpbnQgZHJtX2RpX21pbm9yOworCWludCBkcm1fZGRfbWFqb3I7CisJaW50IGRybV9kZF9taW5vcjsKK30gZHJtU2V0VmVyc2lvbiwgKmRybVNldFZlcnNpb25QdHI7CisKKyNkZWZpbmUgX19kcm1fZHVtbXlfbG9jayhsb2NrKSAoKihfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICopbG9jaykKKworI2RlZmluZSBEUk1fTE9DS19IRUxEICAweDgwMDAwMDAwVSAvKio8IEhhcmR3YXJlIGxvY2sgaXMgaGVsZCAqLworI2RlZmluZSBEUk1fTE9DS19DT05UICAweDQwMDAwMDAwVSAvKio8IEhhcmR3YXJlIGxvY2sgaXMgY29udGVuZGVkICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMikKKyMgaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19BTUQ2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKQorCQkJCS8qIFJlZmxlY3QgY2hhbmdlcyBoZXJlIHRvIGRybVAuaCAqLworI2RlZmluZSBEUk1fQ0FTKGxvY2ssb2xkLG5ldyxfX3JldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBfX2R1bW15OwkvKiBDYW4ndCBtYXJrIGVheCBhcyBjbG9iYmVyZWQgKi8gICAgICBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkibG9jayA7IGNtcHhjaGcgJTQsJTFcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXRueiAlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJOiAiPWQiIChfX3JldCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAJCQkgICI9bSIgKF9fZHJtX2R1bW15X2xvY2sobG9jaykpLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIj1hIiAoX19kdW1teSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJOiAiMiIgKG9sZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkgICJyIiAobmV3KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlICgwKQorCisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKworI2RlZmluZQlEUk1fQ0FTKGxvY2ssIG9sZCwgbmV3LCByZXQpCQlcCisJZG8gewkJCQkJXAorCQlpbnQgdG1wLCBvbGQzMjsJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJXAorCQkiCWFkZGwJJDMxLCAlNSwgJTNcbiIJXAorCQkiMToJbGRsX2wJJTAsICUyXG4iCVwKKwkJIgljbXBlcQklMCwgJTMsICUxXG4iCVwKKwkJIgliZXEJJTEsIDJmXG4iCVwKKwkJIgltb3YJJTQsICUwXG4iCVwKKwkJIglzdGxfYwklMCwgJTJcbiIJXAorCQkiCWJlcQklMCwgM2ZcbiIJXAorCQkiCW1iXG4iCQkJXAorCQkiMjoJY21wZXEJJTEsIDAsICUxXG4iCVwKKwkJIi5zdWJzZWN0aW9uIDJcbiIJCVwKKwkJIjM6CWJyCTFiXG4iCQlcCisJCSIucHJldmlvdXMiCQkJXAorCQk6ICI9JnIiKHRtcCksICI9JnIiKHJldCksCVwKKwkJICAiPW0iKF9fZHJtX2R1bW15X2xvY2sobG9jaykpLAlcCisJCSAgIj0mciIob2xkMzIpCQkJXAorCQk6ICJyIihuZXcpLCAiciIob2xkKQkJXAorCQk6ICJtZW1vcnkiKTsJCQlcCisJfSB3aGlsZSAoMCkKKworI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcsX19yZXQpCQkJCVwKK2RvIHsJcmVnaXN0ZXIgdW5zaWduZWQgaW50IF9fb2xkIF9fYXNtKCJvMCIpOwkJXAorCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX25ldyBfX2FzbSgibzEiKTsJCVwKKwlyZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKl9fbG9jayBfX2FzbSgibzIiKTsJXAorCV9fb2xkID0gb2xkOwkJCQkJCVwKKwlfX25ldyA9IG5ldzsJCQkJCQlcCisJX19sb2NrID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWxvY2s7CQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCQkvKiJjYXMgWyUyXSwgJTMsICUwIiovCQkJCVwKKwkJIi53b3JkIDB4ZDNlMjkwMDhcblx0IgkJCQlcCisJCS8qIm1lbWJhciAjU3RvcmVTdG9yZSB8ICNTdG9yZUxvYWQiKi8JCVwKKwkJIi53b3JkIDB4ODE0M2UwMGEiCQkJCVwKKwkJOiAiPSZyIiAoX19uZXcpCQkJCQlcCisJCTogIjAiIChfX25ldyksCQkJCQlcCisJCSAgInIiIChfX2xvY2spLAkJCQkJXAorCQkgICJyIiAoX19vbGQpCQkJCQlcCisJCTogIm1lbW9yeSIpOwkJCQkJXAorCV9fcmV0ID0gKF9fbmV3ICE9IF9fb2xkKTsJCQkJXAorfSB3aGlsZSgwKQorCisjZWxpZiBkZWZpbmVkKF9faWE2NF9fKQorCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorLyogdGhpcyBjdXJyZW50bHkgZ2VuZXJhdGVzIGJhZCBjb2RlIChtaXNzaW5nIHN0b3AgYml0cykuLi4gKi8KKyNpbmNsdWRlIDxpYTY0aW50cmluLmg+CisKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcsX19yZXQpCQkJCQkgICAgICBcCisJZG8gewkJCQkJCQkJICAgICAgXAorCQl1bnNpZ25lZCBsb25nIF9fcmVzdWx0LCBfX29sZCA9IChvbGQpICYgMHhmZmZmZmZmZjsJCVwKKwkJX19tZigpOwkJCQkJCQkgICAgICAJXAorCQlfX3Jlc3VsdCA9IF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZV9hY3EoJl9fZHJtX2R1bW15X2xvY2sobG9jayksIChuZXcpLCBfX29sZCk7XAorCQlfX3JldCA9IChfX3Jlc3VsdCkgIT0gKF9fb2xkKTsJCQkJCVwKKy8qCQlfX3JldCA9IChfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJl9fZHJtX2R1bW15X2xvY2sobG9jayksIFwKKwkJCQkJCSAgICAgKG9sZCksIChuZXcpKQkgICAgICBcCisJCQkgIT0gKG9sZCkpOwkJCQkJICAgICAgKi9cCisJfSB3aGlsZSAoMCkKKworI2Vsc2UKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcsX19yZXQpCQkJCQkgIFwKKwlkbyB7CQkJCQkJCQkgIFwKKwkJdW5zaWduZWQgaW50IF9fcmVzdWx0LCBfX29sZCA9IChvbGQpOwkJCSAgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCSAgXAorCQkJIm1mXG4iCQkJCQkJICBcCisJCQkibW92IGFyLmNjdj0lMlxuIgkJCQkgIFwKKwkJCSI7O1xuIgkJCQkJCSAgXAorCQkJImNtcHhjaGc0LmFjcSAlMD0lMSwlMyxhci5jY3YiCQkJICBcCisJCQk6ICI9ciIgKF9fcmVzdWx0KSwgIj1tIiAoX19kcm1fZHVtbXlfbG9jayhsb2NrKSkgIFwKKwkJCTogInIiICgodW5zaWduZWQgbG9uZylfX29sZCksICJyIiAobmV3KQkJCSAgXAorCQkJOiAibWVtb3J5Iik7CQkJCQkgIFwKKwkJX19yZXQgPSAoX19yZXN1bHQpICE9IChfX29sZCk7CQkJCSAgXAorCX0gd2hpbGUgKDApCisKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorCisjZGVmaW5lIERSTV9DQVMobG9jayxvbGQsbmV3LF9fcmV0KQkJCVwKKwlkbyB7CQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCQkic3luYzsiCQkJCVwKKwkJCSIwOiAgICBsd2FyeCAlMCwwLCUxOyIJCVwKKwkJCSIgICAgICB4b3IuICUwLCUzLCUwOyIJCVwKKwkJCSIgICAgICBibmUgMWY7IgkJCVwKKwkJCSIgICAgICBzdHdjeC4gJTIsMCwlMTsiCQlcCisJCQkiICAgICAgYm5lLSAwYjsiCQlcCisJCQkiMTogICAgIgkJCVwKKwkJCSJzeW5jOyIJCQkJXAorCQk6ICI9JnIiKF9fcmV0KQkJCQlcCisJCTogInIiKGxvY2spLCAiciIobmV3KSwgInIiKG9sZCkJCVwKKwkJOiAiY3IwIiwgIm1lbW9yeSIpOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogYXJjaGl0ZWN0dXJlICovCisjZW5kaWYgLyogX19HTlVDX18gPj0gMiAqLworCisjaWZuZGVmIERSTV9DQVMKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcscmV0KSBkbyB7IHJldD0xOyB9IHdoaWxlICgwKSAvKiBGQVNUIExPQ0sgRkFJTFMgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisjZGVmaW5lIERSTV9DQVNfUkVTVUxUKF9yZXN1bHQpCQlsb25nIF9yZXN1bHQKKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCisjZGVmaW5lIERSTV9DQVNfUkVTVUxUKF9yZXN1bHQpCQlpbnQgX3Jlc3VsdAorI2Vsc2UKKyNkZWZpbmUgRFJNX0NBU19SRVNVTFQoX3Jlc3VsdCkJCWNoYXIgX3Jlc3VsdAorI2VuZGlmCisKKyNkZWZpbmUgRFJNX0xJR0hUX0xPQ0soZmQsbG9jayxjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBEUk1fQ0FTX1JFU1VMVChfX3JldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKGxvY2ssY29udGV4dCxEUk1fTE9DS19IRUxEfGNvbnRleHQsX19yZXQpOyAgICAgXAorICAgICAgICAgICAgICAgIGlmIChfX3JldCkgZHJtR2V0TG9jayhmZCxjb250ZXh0LDApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUoMCkKKworCQkJCS8qIFRoaXMgb25lIGNvdW50cyBmYXN0IGxvY2tzIC0tIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmtpbmcgb25seS4gKi8KKyNkZWZpbmUgRFJNX0xJR0hUX0xPQ0tfQ09VTlQoZmQsbG9jayxjb250ZXh0LGNvdW50KSAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBEUk1fQ0FTX1JFU1VMVChfX3JldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKGxvY2ssY29udGV4dCxEUk1fTE9DS19IRUxEfGNvbnRleHQsX19yZXQpOyAgICAgXAorICAgICAgICAgICAgICAgIGlmIChfX3JldCkgZHJtR2V0TG9jayhmZCxjb250ZXh0LDApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICArK2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTV9MT0NLKGZkLGxvY2ssY29udGV4dCxmbGFncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChmbGFncykgZHJtR2V0TG9jayhmZCxjb250ZXh0LGZsYWdzKTsgICAgICAgICAgICAgICBcCisJCWVsc2UgICAgICAgRFJNX0xJR0hUX0xPQ0soZmQsbG9jayxjb250ZXh0KTsgICAgICAgICAgICBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTV9VTkxPQ0soZmQsbG9jayxjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRFJNX0NBU19SRVNVTFQoX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJRFJNX0NBUyhsb2NrLERSTV9MT0NLX0hFTER8Y29udGV4dCxjb250ZXh0LF9fcmV0KTsgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoX19yZXQpIGRybVVubG9jayhmZCxjb250ZXh0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IHdoaWxlKDApCisKKwkJCQkvKiBTaW1wbGUgc3BpbiBsb2NrcyAqLworI2RlZmluZSBEUk1fU1BJTkxPQ0soc3Bpbix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRFJNX0NBU19SRVNVTFQoX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKHNwaW4sMCx2YWwsX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQpIHdoaWxlICgoc3BpbiktPmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICB9IHdoaWxlIChfX3JldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRFJNX1NQSU5MT0NLX1RBS0Uoc3Bpbix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIERSTV9DQVNfUkVTVUxUKF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50ICBjdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGN1ciA9ICgqc3BpbikubG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCURSTV9DQVMoc3BpbixjdXIsdmFsLF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIH0gd2hpbGUgKF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBEUk1fU1BJTkxPQ0tfQ09VTlQoc3Bpbix2YWwsY291bnQsX19yZXQpICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50ICBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX3JldCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19yZXQgJiYgX19pIDwgY291bnQ7IF9faSsrKSB7ICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKHNwaW4sMCx2YWwsX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQpIGZvciAoO19faSA8IGNvdW50ICYmIChzcGluKS0+bG9jazsgX19pKyspOyAgXAorCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRFJNX1NQSU5VTkxPQ0soc3Bpbix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIERSTV9DQVNfUkVTVUxUKF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCgqc3BpbikubG9jayA9PSB2YWwpIHsgLyogZWxzZSBzZXJ2ZXIgc3RvbGUgbG9jayAqLyAgICBcCisJICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgRFJNX0NBUyhzcGluLHZhbCwwLF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgfSB3aGlsZSAoX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUoMCkKKworCisKKy8qIEdlbmVyYWwgdXNlci1sZXZlbCBwcm9ncmFtbWVyJ3MgQVBJOiB1bnByaXZpbGVnZWQgKi8KK2V4dGVybiBpbnQgICAgICAgICAgIGRybUF2YWlsYWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybU9wZW4oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYnVzaWQpOworCisjZGVmaW5lIERSTV9OT0RFX1BSSU1BUlkgMAorI2RlZmluZSBEUk1fTk9ERV9DT05UUk9MIDEKKyNkZWZpbmUgRFJNX05PREVfUkVOREVSICAyCitleHRlcm4gaW50ICAgICAgICAgICBkcm1PcGVuV2l0aFR5cGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYnVzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpOworCitleHRlcm4gaW50ICAgICAgICAgICBkcm1PcGVuQ29udHJvbChpbnQgbWlub3IpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtT3BlblJlbmRlcihpbnQgbWlub3IpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ2xvc2UoaW50IGZkKTsKK2V4dGVybiBkcm1WZXJzaW9uUHRyIGRybUdldFZlcnNpb24oaW50IGZkKTsKK2V4dGVybiBkcm1WZXJzaW9uUHRyIGRybUdldExpYlZlcnNpb24oaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldENhcChpbnQgZmQsIHVpbnQ2NF90IGNhcGFiaWxpdHksIHVpbnQ2NF90ICp2YWx1ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1GcmVlVmVyc2lvbihkcm1WZXJzaW9uUHRyKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldE1hZ2ljKGludCBmZCwgZHJtX21hZ2ljX3QgKiBtYWdpYyk7CitleHRlcm4gY2hhciAgICAgICAgICAqZHJtR2V0QnVzaWQoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldEludGVycnVwdEZyb21CdXNJRChpbnQgZmQsIGludCBidXNudW0sIGludCBkZXZudW0sCisJCQkJCSAgICAgIGludCBmdW5jbnVtKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldE1hcChpbnQgZmQsIGludCBpZHgsIGRybV9oYW5kbGVfdCAqb2Zmc2V0LAorCQkJICAgICAgIGRybVNpemUgKnNpemUsIGRybU1hcFR5cGUgKnR5cGUsCisJCQkgICAgICAgZHJtTWFwRmxhZ3MgKmZsYWdzLCBkcm1faGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgICBpbnQgKm10cnIpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtR2V0Q2xpZW50KGludCBmZCwgaW50IGlkeCwgaW50ICphdXRoLCBpbnQgKnBpZCwKKwkJCQkgIGludCAqdWlkLCB1bnNpZ25lZCBsb25nICptYWdpYywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKmlvY3MpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtR2V0U3RhdHMoaW50IGZkLCBkcm1TdGF0c1QgKnN0YXRzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNldEludGVyZmFjZVZlcnNpb24oaW50IGZkLCBkcm1TZXRWZXJzaW9uICp2ZXJzaW9uKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUNvbW1hbmROb25lKGludCBmZCwgdW5zaWduZWQgbG9uZyBkcm1Db21tYW5kSW5kZXgpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ29tbWFuZFJlYWQoaW50IGZkLCB1bnNpZ25lZCBsb25nIGRybUNvbW1hbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1Db21tYW5kV3JpdGUoaW50IGZkLCB1bnNpZ25lZCBsb25nIGRybUNvbW1hbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ29tbWFuZFdyaXRlUmVhZChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgZHJtQ29tbWFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworCisvKiBHZW5lcmFsIHVzZXItbGV2ZWwgcHJvZ3JhbW1lcidzIEFQSTogWCBzZXJ2ZXIgKHJvb3QpIG9ubHkgICovCitleHRlcm4gdm9pZCAgICAgICAgICBkcm1GcmVlQnVzaWQoY29uc3QgY2hhciAqYnVzaWQpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtU2V0QnVzaWQoaW50IGZkLCBjb25zdCBjaGFyICpidXNpZCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BdXRoTWFnaWMoaW50IGZkLCBkcm1fbWFnaWNfdCBtYWdpYyk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZGRNYXAoaW50IGZkLAorCQkJICAgICAgIGRybV9oYW5kbGVfdCBvZmZzZXQsCisJCQkgICAgICAgZHJtU2l6ZSBzaXplLAorCQkJICAgICAgIGRybU1hcFR5cGUgdHlwZSwKKwkJCSAgICAgICBkcm1NYXBGbGFncyBmbGFncywKKwkJCSAgICAgICBkcm1faGFuZGxlX3QgKiBoYW5kbGUpOworZXh0ZXJuIGludAkgICAgIGRybVJtTWFwKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSk7CitleHRlcm4gaW50CSAgICAgZHJtQWRkQ29udGV4dFByaXZhdGVNYXBwaW5nKGludCBmZCwgZHJtX2NvbnRleHRfdCBjdHhfaWQsCisJCQkJCQkgZHJtX2hhbmRsZV90IGhhbmRsZSk7CisKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFkZEJ1ZnMoaW50IGZkLCBpbnQgY291bnQsIGludCBzaXplLAorCQkJCWRybUJ1ZkRlc2NGbGFncyBmbGFncywKKwkJCQlpbnQgYWdwX29mZnNldCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1NYXJrQnVmcyhpbnQgZmQsIGRvdWJsZSBsb3csIGRvdWJsZSBoaWdoKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUNyZWF0ZUNvbnRleHQoaW50IGZkLCBkcm1fY29udGV4dF90ICogaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNldENvbnRleHRGbGFncyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCwKKwkJCQkJZHJtX2NvbnRleHRfdEZsYWdzIGZsYWdzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldENvbnRleHRGbGFncyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCwKKwkJCQkJZHJtX2NvbnRleHRfdEZsYWdzUHRyIGZsYWdzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFkZENvbnRleHRUYWcoaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQsIHZvaWQgKnRhZyk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1EZWxDb250ZXh0VGFnKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICpkcm1HZXRDb250ZXh0VGFnKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0KTsKK2V4dGVybiBkcm1fY29udGV4dF90ICogZHJtR2V0UmVzZXJ2ZWRDb250ZXh0TGlzdChpbnQgZmQsIGludCAqY291bnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtRnJlZVJlc2VydmVkQ29udGV4dExpc3QoZHJtX2NvbnRleHRfdCAqKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVN3aXRjaFRvQ29udGV4dChpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1EZXN0cm95Q29udGV4dChpbnQgZmQsIGRybV9jb250ZXh0X3QgaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUNyZWF0ZURyYXdhYmxlKGludCBmZCwgZHJtX2RyYXdhYmxlX3QgKiBoYW5kbGUpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtRGVzdHJveURyYXdhYmxlKGludCBmZCwgZHJtX2RyYXdhYmxlX3QgaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVVwZGF0ZURyYXdhYmxlSW5mbyhpbnQgZmQsIGRybV9kcmF3YWJsZV90IGhhbmRsZSwKKwkJCQkJICAgZHJtX2RyYXdhYmxlX2luZm9fdHlwZV90IHR5cGUsCisJCQkJCSAgIHVuc2lnbmVkIGludCBudW0sIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ3RsSW5zdEhhbmRsZXIoaW50IGZkLCBpbnQgaXJxKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUN0bFVuaW5zdEhhbmRsZXIoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNldENsaWVudENhcChpbnQgZmQsIHVpbnQ2NF90IGNhcGFiaWxpdHksCisJCQkJICAgICB1aW50NjRfdCB2YWx1ZSk7CisKKy8qIEdlbmVyYWwgdXNlci1sZXZlbCBwcm9ncmFtbWVyJ3MgQVBJOiBhdXRoZW50aWNhdGVkIGNsaWVudCBhbmQvb3IgWCAqLworZXh0ZXJuIGludCAgICAgICAgICAgZHJtTWFwKGludCBmZCwKKwkJCSAgICBkcm1faGFuZGxlX3QgaGFuZGxlLAorCQkJICAgIGRybVNpemUgc2l6ZSwKKwkJCSAgICBkcm1BZGRyZXNzUHRyIGFkZHJlc3MpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtVW5tYXAoZHJtQWRkcmVzcyBhZGRyZXNzLCBkcm1TaXplIHNpemUpOworZXh0ZXJuIGRybUJ1ZkluZm9QdHIgZHJtR2V0QnVmSW5mbyhpbnQgZmQpOworZXh0ZXJuIGRybUJ1Zk1hcFB0ciAgZHJtTWFwQnVmcyhpbnQgZmQpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtVW5tYXBCdWZzKGRybUJ1Zk1hcFB0ciBidWZzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybURNQShpbnQgZmQsIGRybURNQVJlcVB0ciByZXF1ZXN0KTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUZyZWVCdWZzKGludCBmZCwgaW50IGNvdW50LCBpbnQgKmxpc3QpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtR2V0TG9jayhpbnQgZmQsCisJCQkgICAgICAgIGRybV9jb250ZXh0X3QgY29udGV4dCwKKwkJCSAgICAgICAgZHJtTG9ja0ZsYWdzIGZsYWdzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVVubG9jayhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1GaW5pc2goaW50IGZkLCBpbnQgY29udGV4dCwgZHJtTG9ja0ZsYWdzIGZsYWdzKTsKK2V4dGVybiBpbnQJICAgICBkcm1HZXRDb250ZXh0UHJpdmF0ZU1hcHBpbmcoaW50IGZkLCBkcm1fY29udGV4dF90IGN0eF9pZCwgCisJCQkJCQkgZHJtX2hhbmRsZV90ICogaGFuZGxlKTsKKworLyogQUdQL0dBUlQgc3VwcG9ydDogWCBzZXJ2ZXIgKHJvb3QpIG9ubHkgKi8KK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncEFjcXVpcmUoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncFJlbGVhc2UoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncEVuYWJsZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgbW9kZSk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZ3BBbGxvYyhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgdW5zaWduZWQgbG9uZyB0eXBlLCB1bnNpZ25lZCBsb25nICphZGRyZXNzLAorCQkJCSBkcm1faGFuZGxlX3QgKmhhbmRsZSk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZ3BGcmVlKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSk7CitleHRlcm4gaW50IAkgICAgIGRybUFncEJpbmQoaW50IGZkLCBkcm1faGFuZGxlX3QgaGFuZGxlLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncFVuYmluZChpbnQgZmQsIGRybV9oYW5kbGVfdCBoYW5kbGUpOworCisvKiBBR1AvR0FSVCBpbmZvOiBhdXRoZW50aWNhdGVkIGNsaWVudCBhbmQvb3IgWCAqLworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQWdwVmVyc2lvbk1ham9yKGludCBmZCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZ3BWZXJzaW9uTWlub3IoaW50IGZkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncEdldE1vZGUoaW50IGZkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncEJhc2UoaW50IGZkKTsgLyogUGh5c2ljYWwgbG9jYXRpb24gKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncFNpemUoaW50IGZkKTsgLyogQnl0ZXMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncE1lbW9yeVVzZWQoaW50IGZkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncE1lbW9yeUF2YWlsKGludCBmZCk7CitleHRlcm4gdW5zaWduZWQgaW50ICBkcm1BZ3BWZW5kb3JJZChpbnQgZmQpOworZXh0ZXJuIHVuc2lnbmVkIGludCAgZHJtQWdwRGV2aWNlSWQoaW50IGZkKTsKKworLyogUENJIHNjYXR0ZXIvZ2F0aGVyIHN1cHBvcnQ6IFggc2VydmVyIChyb290KSBvbmx5ICovCitleHRlcm4gaW50ICAgICAgICAgICBkcm1TY2F0dGVyR2F0aGVyQWxsb2MoaW50IGZkLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgIGRybV9oYW5kbGVfdCAqaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNjYXR0ZXJHYXRoZXJGcmVlKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSk7CisKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVdhaXRWQmxhbmsoaW50IGZkLCBkcm1WQmxhbmtQdHIgdmJsKTsKKworLyogU3VwcG9ydCByb3V0aW5lcyAqLworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtU2V0U2VydmVySW5mbyhkcm1TZXJ2ZXJJbmZvUHRyIGluZm8pOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtRXJyb3IoaW50IGVyciwgY29uc3QgY2hhciAqbGFiZWwpOworZXh0ZXJuIHZvaWQgICAgICAgICAgKmRybU1hbGxvYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1GcmVlKHZvaWQgKnB0KTsKKworLyogSGFzaCB0YWJsZSByb3V0aW5lcyAqLworZXh0ZXJuIHZvaWQgKmRybUhhc2hDcmVhdGUodm9pZCk7CitleHRlcm4gaW50ICBkcm1IYXNoRGVzdHJveSh2b2lkICp0KTsKK2V4dGVybiBpbnQgIGRybUhhc2hMb29rdXAodm9pZCAqdCwgdW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKip2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1IYXNoSW5zZXJ0KHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICp2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1IYXNoRGVsZXRlKHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcga2V5KTsKK2V4dGVybiBpbnQgIGRybUhhc2hGaXJzdCh2b2lkICp0LCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1IYXNoTmV4dCh2b2lkICp0LCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSk7CisKKy8qIFBSTkcgcm91dGluZXMgKi8KK2V4dGVybiB2b2lkICAgICAgICAgICpkcm1SYW5kb21DcmVhdGUodW5zaWduZWQgbG9uZyBzZWVkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVJhbmRvbURlc3Ryb3kodm9pZCAqc3RhdGUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtUmFuZG9tKHZvaWQgKnN0YXRlKTsKK2V4dGVybiBkb3VibGUgICAgICAgIGRybVJhbmRvbURvdWJsZSh2b2lkICpzdGF0ZSk7CisKKy8qIFNraXAgbGlzdCByb3V0aW5lcyAqLworCitleHRlcm4gdm9pZCAqZHJtU0xDcmVhdGUodm9pZCk7CitleHRlcm4gaW50ICBkcm1TTERlc3Ryb3kodm9pZCAqbCk7CitleHRlcm4gaW50ICBkcm1TTExvb2t1cCh2b2lkICpsLCB1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqKnZhbHVlKTsKK2V4dGVybiBpbnQgIGRybVNMSW5zZXJ0KHZvaWQgKmwsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICp2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1TTERlbGV0ZSh2b2lkICpsLCB1bnNpZ25lZCBsb25nIGtleSk7CitleHRlcm4gaW50ICBkcm1TTE5leHQodm9pZCAqbCwgdW5zaWduZWQgbG9uZyAqa2V5LCB2b2lkICoqdmFsdWUpOworZXh0ZXJuIGludCAgZHJtU0xGaXJzdCh2b2lkICpsLCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSk7CitleHRlcm4gdm9pZCBkcm1TTER1bXAodm9pZCAqbCk7CitleHRlcm4gaW50ICBkcm1TTExvb2t1cE5laWdoYm9ycyh2b2lkICpsLCB1bnNpZ25lZCBsb25nIGtleSwKKwkJCQkgdW5zaWduZWQgbG9uZyAqcHJldl9rZXksIHZvaWQgKipwcmV2X3ZhbHVlLAorCQkJCSB1bnNpZ25lZCBsb25nICpuZXh0X2tleSwgdm9pZCAqKm5leHRfdmFsdWUpOworCitleHRlcm4gaW50IGRybU9wZW5PbmNlKHZvaWQgKnVudXNlZCwgY29uc3QgY2hhciAqQnVzSUQsIGludCAqbmV3bHlvcGVuZWQpOworZXh0ZXJuIGludCBkcm1PcGVuT25jZVdpdGhUeXBlKGNvbnN0IGNoYXIgKkJ1c0lELCBpbnQgKm5ld2x5b3BlbmVkLCBpbnQgdHlwZSk7CitleHRlcm4gdm9pZCBkcm1DbG9zZU9uY2UoaW50IGZkKTsKK2V4dGVybiB2b2lkIGRybU1zZyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgRFJNX1BSSU5URkxJS0UoMSwgMik7CisKK2V4dGVybiBpbnQgZHJtU2V0TWFzdGVyKGludCBmZCk7CitleHRlcm4gaW50IGRybURyb3BNYXN0ZXIoaW50IGZkKTsKKworI2RlZmluZSBEUk1fRVZFTlRfQ09OVEVYVF9WRVJTSU9OIDIKKwordHlwZWRlZiBzdHJ1Y3QgX2RybUV2ZW50Q29udGV4dCB7CisKKwkvKiBUaGlzIHN0cnVjdCBpcyB2ZXJzaW9uZWQgc28gd2UgY2FuIGFkZCBtb3JlIHBvaW50ZXJzIGlmIHdlCisJICogYWRkIG1vcmUgZXZlbnRzLiAqLworCWludCB2ZXJzaW9uOworCisJdm9pZCAoKnZibGFua19oYW5kbGVyKShpbnQgZmQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlLCAKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdHZfc2VjLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0dl91c2VjLAorCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKwl2b2lkICgqcGFnZV9mbGlwX2hhbmRsZXIpKGludCBmZCwKKwkJCQkgIHVuc2lnbmVkIGludCBzZXF1ZW5jZSwKKwkJCQkgIHVuc2lnbmVkIGludCB0dl9zZWMsCisJCQkJICB1bnNpZ25lZCBpbnQgdHZfdXNlYywKKwkJCQkgIHZvaWQgKnVzZXJfZGF0YSk7CisKK30gZHJtRXZlbnRDb250ZXh0LCAqZHJtRXZlbnRDb250ZXh0UHRyOworCitleHRlcm4gaW50IGRybUhhbmRsZUV2ZW50KGludCBmZCwgZHJtRXZlbnRDb250ZXh0UHRyIGV2Y3R4KTsKKworZXh0ZXJuIGNoYXIgKmRybUdldERldmljZU5hbWVGcm9tRmQoaW50IGZkKTsKK2V4dGVybiBpbnQgZHJtR2V0Tm9kZVR5cGVGcm9tRmQoaW50IGZkKTsKKworZXh0ZXJuIGludCBkcm1QcmltZUhhbmRsZVRvRkQoaW50IGZkLCB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IGZsYWdzLCBpbnQgKnByaW1lX2ZkKTsKK2V4dGVybiBpbnQgZHJtUHJpbWVGRFRvSGFuZGxlKGludCBmZCwgaW50IHByaW1lX2ZkLCB1aW50MzJfdCAqaGFuZGxlKTsKKworZXh0ZXJuIGNoYXIgKmRybUdldFByaW1hcnlEZXZpY2VOYW1lRnJvbUZkKGludCBmZCk7CitleHRlcm4gY2hhciAqZHJtR2V0UmVuZGVyRGV2aWNlTmFtZUZyb21GZChpbnQgZmQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybUhhc2guYyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZkcm1IYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4N2U2MQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZkcm1IYXNoLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qIHhmODZkcm1IYXNoLmMgLS0gU21hbGwgaGFzaCB0YWJsZSBzdXBwb3J0IGZvciBpbnRlZ2VyIC0+IGludGVnZXIgbWFwcGluZworICogQ3JlYXRlZDogU3VuIEFwciAxOCAwOTozNTo0NSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgYSBmaXhlZC1zaXplZAorICogaGFzaCB0YWJsZSB1c2luZyBzZWxmLW9yZ2FuaXppbmcgbGlua2VkIGxpc3RzIFtLbnV0aDczLCBwcC4gMzk4LTM5OV0gZm9yCisgKiBjb2xsaXNpb24gcmVzb2x1dGlvbi4gIFRoZXJlIGFyZSB0d28gcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgdGhpbmdzCisgKiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uOgorICoKKyAqIDEpIFRoZSB0YWJsZSBpcyBwb3dlci1vZi10d28gc2l6ZWQuICBQcmltZSBzaXplZCB0YWJsZXMgYXJlIG1vcmUKKyAqIHRyYWRpdGlvbmFsLCBidXQgZG8gbm90IGhhdmUgYSBzaWduaWZpY2FudCBhZHZhbnRhZ2Ugb3ZlciBwb3dlci1vZi10d28KKyAqIHNpemVkIHRhYmxlLCBlc3BlY2lhbGx5IHdoZW4gZG91YmxlIGhhc2hpbmcgaXMgbm90IHVzZWQgZm9yIGNvbGxpc2lvbgorICogcmVzb2x1dGlvbi4KKyAqCisgKiAyKSBUaGUgaGFzaCBjb21wdXRhdGlvbiB1c2VzIGEgdGFibGUgb2YgcmFuZG9tIGludGVnZXJzIFtIYW5zb245NywKKyAqIHBwLiAzOS00MV0uCisgKgorICogRlVUVVJFIEVOSEFOQ0VNRU5UUworICoKKyAqIFdpdGggYSB0YWJsZSBzaXplIG9mIDUxMiwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgc3VmZmljaWVudCBmb3IgYQorICogZmV3IGh1bmRyZWQga2V5cy4gIFNpbmNlIHRoaXMgaXMgd2VsbCBhYm92ZSB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUKKyAqIHRhYmxlcyBmb3Igd2hpY2ggdGhpcyBpbXBsZW1lbnRhdGlvbiB3YXMgZGVzaWduZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogZHluYW1pYyBoYXNoIHRhYmxlcyB3YXMgcG9zdHBvbmVkIHVudGlsIHRoZSBuZWVkIGFyaXNlcy4gIEEgY29tbW9uIChhbmQKKyAqIG5haXZlKSBhcHByb2FjaCB0byBkeW5hbWljIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNyZWF0ZXMgYQorICogbmV3IGhhc2ggdGFibGUgd2hlbiBuZWNlc3NhcnksIHJlaGFzaGVzIGFsbCB0aGUgZGF0YSBpbnRvIHRoZSBuZXcgdGFibGUsCisgKiBhbmQgZGVzdHJveXMgdGhlIG9sZCB0YWJsZS4gIFRoZSBhcHByb2FjaCBpbiBbTGFyc29uODhdIGlzIHN1cGVyaW9yIGluCisgKiB0d28gd2F5czogMSkgb25seSBhIHBvcnRpb24gb2YgdGhlIHRhYmxlIGlzIGV4cGFuZGVkIHdoZW4gbmVlZGVkLAorICogZGlzdHJpYnV0aW5nIHRoZSBleHBhbnNpb24gY29zdCBvdmVyIHNldmVyYWwgaW5zZXJ0aW9ucywgYW5kIDIpIHBvcnRpb25zCisgKiBvZiB0aGUgdGFibGUgY2FuIGJlIGxvY2tlZCwgZW5hYmxpbmcgYSBzY2FsYWJsZSB0aHJlYWQtc2FmZQorICogaW1wbGVtZW50YXRpb24uCisgKgorICogUkVGRVJFTkNFUworICoKKyAqIFtIYW5zb245N10gRGF2aWQgUi4gSGFuc29uLiAgQyBJbnRlcmZhY2VzIGFuZCBJbXBsZW1lbnRhdGlvbnM6CisgKiBUZWNobmlxdWVzIGZvciBDcmVhdGluZyBSZXVzYWJsZSBTb2Z0d2FyZS4gIFJlYWRpbmcsIE1hc3NhY2h1c2V0dHM6CisgKiBBZGRpc29uLVdlc2xleSwgMTk5Ny4KKyAqCisgKiBbS251dGg3M10gRG9uYWxkIEUuIEtudXRoLiBUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nLiAgVm9sdW1lIDM6CisgKiBTb3J0aW5nIGFuZCBTZWFyY2hpbmcuICBSZWFkaW5nLCBNYXNzYWNodXNldHRzOiBBZGRpc29uLVdlc2xleSwgMTk3My4KKyAqCisgKiBbTGFyc29uODhdIFBlci1Ba2UgTGFyc29uLiAiRHluYW1pYyBIYXNoIFRhYmxlcyIuICBDQUNNIDMxKDQpLCBBcHJpbAorICogMTk4OCwgcHAuIDQ0Ni00NTcuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgInhmODZkcm1IYXNoLmgiCisKKyNkZWZpbmUgSEFTSF9NQUdJQyAweGRlYWRiZWVmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEhhc2hIYXNoKHVuc2lnbmVkIGxvbmcga2V5KQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgIGhhc2ggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgIHRtcCAgPSBrZXk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgaW5pdCA9IDA7CisgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgc2NhdHRlclsyNTZdOworICAgIGludCAgICAgICAgICAgICAgICAgIGk7CisKKyAgICBpZiAoIWluaXQpIHsKKwl2b2lkICpzdGF0ZTsKKwlzdGF0ZSA9IGRybVJhbmRvbUNyZWF0ZSgzNyk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBzY2F0dGVyW2ldID0gZHJtUmFuZG9tKHN0YXRlKTsKKwlkcm1SYW5kb21EZXN0cm95KHN0YXRlKTsKKwkrK2luaXQ7CisgICAgfQorCisgICAgd2hpbGUgKHRtcCkgeworCWhhc2ggPSAoaGFzaCA8PCAxKSArIHNjYXR0ZXJbdG1wICYgMHhmZl07CisJdG1wID4+PSA4OworICAgIH0KKworICAgIGhhc2ggJT0gSEFTSF9TSVpFOworI2lmIERFQlVHCisgICAgcHJpbnRmKCAiSGFzaCglbHUpID0gJWx1XG4iLCBrZXksIGhhc2gpOworI2VuZGlmCisgICAgcmV0dXJuIGhhc2g7Cit9CisKK3ZvaWQgKmRybUhhc2hDcmVhdGUodm9pZCkKK3sKKyAgICBIYXNoVGFibGVQdHIgdGFibGU7CisgICAgaW50ICAgICAgICAgIGk7CisKKyAgICB0YWJsZSAgICAgICAgICAgPSBkcm1NYWxsb2Moc2l6ZW9mKCp0YWJsZSkpOworICAgIGlmICghdGFibGUpIHJldHVybiBOVUxMOworICAgIHRhYmxlLT5tYWdpYyAgICA9IEhBU0hfTUFHSUM7CisgICAgdGFibGUtPmVudHJpZXMgID0gMDsKKyAgICB0YWJsZS0+aGl0cyAgICAgPSAwOworICAgIHRhYmxlLT5wYXJ0aWFscyA9IDA7CisgICAgdGFibGUtPm1pc3NlcyAgID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7IGkrKykgdGFibGUtPmJ1Y2tldHNbaV0gPSBOVUxMOworICAgIHJldHVybiB0YWJsZTsKK30KKworaW50IGRybUhhc2hEZXN0cm95KHZvaWQgKnQpCit7CisgICAgSGFzaFRhYmxlUHRyICB0YWJsZSA9IChIYXNoVGFibGVQdHIpdDsKKyAgICBIYXNoQnVja2V0UHRyIGJ1Y2tldDsKKyAgICBIYXNoQnVja2V0UHRyIG5leHQ7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgaWYgKHRhYmxlLT5tYWdpYyAhPSBIQVNIX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgaSsrKSB7CisJZm9yIChidWNrZXQgPSB0YWJsZS0+YnVja2V0c1tpXTsgYnVja2V0OykgeworCSAgICBuZXh0ID0gYnVja2V0LT5uZXh0OworCSAgICBkcm1GcmVlKGJ1Y2tldCk7CisJICAgIGJ1Y2tldCA9IG5leHQ7CisJfQorICAgIH0KKyAgICBkcm1GcmVlKHRhYmxlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogRmluZCB0aGUgYnVja2V0IGFuZCBvcmdhbml6ZSB0aGUgbGlzdCBzbyB0aGF0IHRoaXMgYnVja2V0IGlzIGF0IHRoZQorICAgdG9wLiAqLworCitzdGF0aWMgSGFzaEJ1Y2tldFB0ciBIYXNoRmluZChIYXNoVGFibGVQdHIgdGFibGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGtleSwgdW5zaWduZWQgbG9uZyAqaCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGhhc2ggPSBIYXNoSGFzaChrZXkpOworICAgIEhhc2hCdWNrZXRQdHIgcHJldiA9IE5VTEw7CisgICAgSGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisKKyAgICBpZiAoaCkgKmggPSBoYXNoOworCisgICAgZm9yIChidWNrZXQgPSB0YWJsZS0+YnVja2V0c1toYXNoXTsgYnVja2V0OyBidWNrZXQgPSBidWNrZXQtPm5leHQpIHsKKwlpZiAoYnVja2V0LT5rZXkgPT0ga2V5KSB7CisJICAgIGlmIChwcmV2KSB7CisJCQkJLyogT3JnYW5pemUgKi8KKwkJcHJldi0+bmV4dCAgICAgICAgICAgPSBidWNrZXQtPm5leHQ7CisJCWJ1Y2tldC0+bmV4dCAgICAgICAgID0gdGFibGUtPmJ1Y2tldHNbaGFzaF07CisJCXRhYmxlLT5idWNrZXRzW2hhc2hdID0gYnVja2V0OworCQkrK3RhYmxlLT5wYXJ0aWFsczsKKwkgICAgfSBlbHNlIHsKKwkJKyt0YWJsZS0+aGl0czsKKwkgICAgfQorCSAgICByZXR1cm4gYnVja2V0OworCX0KKwlwcmV2ID0gYnVja2V0OworICAgIH0KKyAgICArK3RhYmxlLT5taXNzZXM7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBkcm1IYXNoTG9va3VwKHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICoqdmFsdWUpCit7CisgICAgSGFzaFRhYmxlUHRyICB0YWJsZSA9IChIYXNoVGFibGVQdHIpdDsKKyAgICBIYXNoQnVja2V0UHRyIGJ1Y2tldDsKKworICAgIGlmICghdGFibGUgfHwgdGFibGUtPm1hZ2ljICE9IEhBU0hfTUFHSUMpIHJldHVybiAtMTsgLyogQmFkIG1hZ2ljICovCisKKyAgICBidWNrZXQgPSBIYXNoRmluZCh0YWJsZSwga2V5LCBOVUxMKTsKKyAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIDE7CS8qIE5vdCBmb3VuZCAqLworICAgICp2YWx1ZSA9IGJ1Y2tldC0+dmFsdWU7CisgICAgcmV0dXJuIDA7CQkJLyogRm91bmQgKi8KK30KKworaW50IGRybUhhc2hJbnNlcnQodm9pZCAqdCwgdW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKnZhbHVlKQoreworICAgIEhhc2hUYWJsZVB0ciAgdGFibGUgPSAoSGFzaFRhYmxlUHRyKXQ7CisgICAgSGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoOworCisgICAgaWYgKHRhYmxlLT5tYWdpYyAhPSBIQVNIX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgaWYgKEhhc2hGaW5kKHRhYmxlLCBrZXksICZoYXNoKSkgcmV0dXJuIDE7IC8qIEFscmVhZHkgaW4gdGFibGUgKi8KKworICAgIGJ1Y2tldCAgICAgICAgICAgICAgID0gZHJtTWFsbG9jKHNpemVvZigqYnVja2V0KSk7CisgICAgaWYgKCFidWNrZXQpIHJldHVybiAtMTsJLyogRXJyb3IgKi8KKyAgICBidWNrZXQtPmtleSAgICAgICAgICA9IGtleTsKKyAgICBidWNrZXQtPnZhbHVlICAgICAgICA9IHZhbHVlOworICAgIGJ1Y2tldC0+bmV4dCAgICAgICAgID0gdGFibGUtPmJ1Y2tldHNbaGFzaF07CisgICAgdGFibGUtPmJ1Y2tldHNbaGFzaF0gPSBidWNrZXQ7CisjaWYgREVCVUcKKyAgICBwcmludGYoIkluc2VydGVkICVsdSBhdCAlbHUvJXBcbiIsIGtleSwgaGFzaCwgYnVja2V0KTsKKyNlbmRpZgorICAgIHJldHVybiAwOwkJCS8qIEFkZGVkIHRvIHRhYmxlICovCit9CisKK2ludCBkcm1IYXNoRGVsZXRlKHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcga2V5KQoreworICAgIEhhc2hUYWJsZVB0ciAgdGFibGUgPSAoSGFzaFRhYmxlUHRyKXQ7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoOworICAgIEhhc2hCdWNrZXRQdHIgYnVja2V0OworCisgICAgaWYgKHRhYmxlLT5tYWdpYyAhPSBIQVNIX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgYnVja2V0ID0gSGFzaEZpbmQodGFibGUsIGtleSwgJmhhc2gpOworCisgICAgaWYgKCFidWNrZXQpIHJldHVybiAxOwkvKiBOb3QgZm91bmQgKi8KKworICAgIHRhYmxlLT5idWNrZXRzW2hhc2hdID0gYnVja2V0LT5uZXh0OworICAgIGRybUZyZWUoYnVja2V0KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybUhhc2hOZXh0KHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcgKmtleSwgdm9pZCAqKnZhbHVlKQoreworICAgIEhhc2hUYWJsZVB0ciAgdGFibGUgPSAoSGFzaFRhYmxlUHRyKXQ7CisKKyAgICB3aGlsZSAodGFibGUtPnAwIDwgSEFTSF9TSVpFKSB7CisJaWYgKHRhYmxlLT5wMSkgeworCSAgICAqa2V5ICAgICAgID0gdGFibGUtPnAxLT5rZXk7CisJICAgICp2YWx1ZSAgICAgPSB0YWJsZS0+cDEtPnZhbHVlOworCSAgICB0YWJsZS0+cDEgID0gdGFibGUtPnAxLT5uZXh0OworCSAgICByZXR1cm4gMTsKKwl9CisJdGFibGUtPnAxID0gdGFibGUtPmJ1Y2tldHNbdGFibGUtPnAwXTsKKwkrK3RhYmxlLT5wMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1IYXNoRmlyc3Qodm9pZCAqdCwgdW5zaWduZWQgbG9uZyAqa2V5LCB2b2lkICoqdmFsdWUpCit7CisgICAgSGFzaFRhYmxlUHRyICB0YWJsZSA9IChIYXNoVGFibGVQdHIpdDsKKworICAgIGlmICh0YWJsZS0+bWFnaWMgIT0gSEFTSF9NQUdJQykgcmV0dXJuIC0xOyAvKiBCYWQgbWFnaWMgKi8KKworICAgIHRhYmxlLT5wMCA9IDA7CisgICAgdGFibGUtPnAxID0gdGFibGUtPmJ1Y2tldHNbMF07CisgICAgcmV0dXJuIGRybUhhc2hOZXh0KHRhYmxlLCBrZXksIHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZkcm1IYXNoLmggYi9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtSGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZmQ4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtSGFzaC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjZGVmaW5lIEhBU0hfU0laRSAgNTEyCQkvKiBHb29kIGZvciBhYm91dCAxMDAgZW50cmllcyAqLworCQkJCS8qIElmIHlvdSBjaGFuZ2UgdGhpcyB2YWx1ZSwgeW91IHByb2JhYmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdG8gY2hhbmdlIHRoZSBIYXNoSGFzaCBoYXNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uISAqLworCit0eXBlZGVmIHN0cnVjdCBIYXNoQnVja2V0IHsKKyAgICB1bnNpZ25lZCBsb25nICAgICBrZXk7CisgICAgdm9pZCAgICAgICAgICAgICAgKnZhbHVlOworICAgIHN0cnVjdCBIYXNoQnVja2V0ICpuZXh0OworfSBIYXNoQnVja2V0LCAqSGFzaEJ1Y2tldFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgSGFzaFRhYmxlIHsKKyAgICB1bnNpZ25lZCBsb25nICAgIG1hZ2ljOworICAgIHVuc2lnbmVkIGxvbmcgICAgZW50cmllczsKKyAgICB1bnNpZ25lZCBsb25nICAgIGhpdHM7CS8qIEF0IHRvcCBvZiBsaW5rZWQgbGlzdCAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgcGFydGlhbHM7CS8qIE5vdCBhdCB0b3Agb2YgbGlua2VkIGxpc3QgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIG1pc3NlczsJLyogTm90IGluIHRhYmxlICovCisgICAgSGFzaEJ1Y2tldFB0ciAgICBidWNrZXRzW0hBU0hfU0laRV07CisgICAgaW50ICAgICAgICAgICAgICBwMDsKKyAgICBIYXNoQnVja2V0UHRyICAgIHAxOworfSBIYXNoVGFibGUsICpIYXNoVGFibGVQdHI7CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtTW9kZS5jIGIvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybU1vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDYyNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybU1vZGUuYwpAQCAtMCwwICsxLDExMzIgQEAKKy8qCisgKiBcZmlsZSB4Zjg2ZHJtTW9kZS5jCisgKiBIZWFkZXIgZm9yIERSTSBtb2Rlc2V0dGluZyBpbnRlcmZhY2UuCisgKgorICogXGF1dGhvciBKYWtvYiBCb3JuZWNyYW50eiA8d2FsbGJyYWtlckBnbWFpbC5jb20+CisgKgorICogXHBhciBBY2tub3dsZWRnZW1lbnRzOgorICogRmViIDIwMDcsIERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEpha29iIEJvcm5lY3JhbnR6IDx3YWxsYnJha2VyQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKy8qCisgKiBUT0RPIHRoZSB0eXBlcyB3ZSBhcmUgYWZ0ZXIgYXJlIGRlZmluZWQgaW4gZGlmZmVyZW50IGhlYWRlcnMgb24gZGlmZmVyZW50CisgKiBwbGF0Zm9ybXMgZmluZCB3aGljaCBoZWFkZXJzIHRvIGluY2x1ZGUgdG8gZ2V0IHVpbnQzMl90CisgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ4Zjg2ZHJtTW9kZS5oIgorI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlIDxkcm0uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgSEFWRV9WQUxHUklORAorI2luY2x1ZGUgPHZhbGdyaW5kLmg+CisjaW5jbHVkZSA8bWVtY2hlY2suaD4KKyNkZWZpbmUgVkcoeCkgeAorI2Vsc2UKKyNkZWZpbmUgVkcoeCkKKyNlbmRpZgorCisjZGVmaW5lIG1lbWNsZWFyKHMpIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKQorCisjZGVmaW5lIFU2NDJWT0lEKHgpICgodm9pZCAqKSh1bnNpZ25lZCBsb25nKSh4KSkKKyNkZWZpbmUgVk9JRDJVNjQoeCkgKCh1aW50NjRfdCkodW5zaWduZWQgbG9uZykoeCkpCisKK3N0YXRpYyBpbmxpbmUgaW50IERSTV9JT0NUTChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcpCit7CisJaW50IHJldCA9IGRybUlvY3RsKGZkLCBjbWQsIGFyZyk7CisJcmV0dXJuIHJldCA8IDAgPyAtZXJybm8gOiByZXQ7Cit9CisKKy8qCisgKiBVdGlsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkKiBkcm1BbGxvY0NweShjaGFyICphcnJheSwgaW50IGNvdW50LCBpbnQgZW50cnlfc2l6ZSkKK3sKKwljaGFyICpyOworCWludCBpOworCisJaWYgKCFjb3VudCB8fCAhYXJyYXkgfHwgIWVudHJ5X3NpemUpCisJCXJldHVybiAwOworCisJaWYgKCEociA9IGRybU1hbGxvYyhjb3VudCplbnRyeV9zaXplKSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCW1lbWNweShyKyhlbnRyeV9zaXplKmkpLCBhcnJheSsoZW50cnlfc2l6ZSppKSwgZW50cnlfc2l6ZSk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEEgY291cGxlIG9mIGZyZWUgZnVuY3Rpb25zLgorICovCisKK3ZvaWQgZHJtTW9kZUZyZWVNb2RlSW5mbyhkcm1Nb2RlTW9kZUluZm9QdHIgcHRyKQoreworCWlmICghcHRyKQorCQlyZXR1cm47CisKKwlkcm1GcmVlKHB0cik7Cit9CisKK3ZvaWQgZHJtTW9kZUZyZWVSZXNvdXJjZXMoZHJtTW9kZVJlc1B0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKworCWRybUZyZWUocHRyLT5mYnMpOworCWRybUZyZWUocHRyLT5jcnRjcyk7CisJZHJtRnJlZShwdHItPmNvbm5lY3RvcnMpOworCWRybUZyZWUocHRyLT5lbmNvZGVycyk7CisJZHJtRnJlZShwdHIpOworCit9CisKK3ZvaWQgZHJtTW9kZUZyZWVGQihkcm1Nb2RlRkJQdHIgcHRyKQoreworCWlmICghcHRyKQorCQlyZXR1cm47CisKKwkvKiB3ZSBtaWdodCBhZGQgbW9yZSBmcmVlcyBsYXRlci4gKi8KKwlkcm1GcmVlKHB0cik7Cit9CisKK3ZvaWQgZHJtTW9kZUZyZWVDcnRjKGRybU1vZGVDcnRjUHRyIHB0cikKK3sKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJZHJtRnJlZShwdHIpOworCit9CisKK3ZvaWQgZHJtTW9kZUZyZWVDb25uZWN0b3IoZHJtTW9kZUNvbm5lY3RvclB0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKworCWRybUZyZWUocHRyLT5lbmNvZGVycyk7CisJZHJtRnJlZShwdHItPnByb3BfdmFsdWVzKTsKKwlkcm1GcmVlKHB0ci0+cHJvcHMpOworCWRybUZyZWUocHRyLT5tb2Rlcyk7CisJZHJtRnJlZShwdHIpOworCit9CisKK3ZvaWQgZHJtTW9kZUZyZWVFbmNvZGVyKGRybU1vZGVFbmNvZGVyUHRyIHB0cikKK3sKKwlkcm1GcmVlKHB0cik7Cit9CisKKy8qCisgKiBNb2RlU2V0dGluZyBmdW5jdGlvbnMuCisgKi8KKworZHJtTW9kZVJlc1B0ciBkcm1Nb2RlR2V0UmVzb3VyY2VzKGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY2FyZF9yZXMgcmVzLCBjb3VudHM7CisJZHJtTW9kZVJlc1B0ciByID0gMDsKKworcmV0cnk6CisJbWVtY2xlYXIocmVzKTsKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFJFU09VUkNFUywgJnJlcykpCisJCXJldHVybiAwOworCisJY291bnRzID0gcmVzOworCisJaWYgKHJlcy5jb3VudF9mYnMpIHsKKwkJcmVzLmZiX2lkX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhyZXMuY291bnRfZmJzKnNpemVvZih1aW50MzJfdCkpKTsKKwkJaWYgKCFyZXMuZmJfaWRfcHRyKQorCQkJZ290byBlcnJfYWxsb2NzOworCX0KKwlpZiAocmVzLmNvdW50X2NydGNzKSB7CisJCXJlcy5jcnRjX2lkX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhyZXMuY291bnRfY3J0Y3Mqc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIXJlcy5jcnRjX2lkX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisJaWYgKHJlcy5jb3VudF9jb25uZWN0b3JzKSB7CisJCXJlcy5jb25uZWN0b3JfaWRfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKHJlcy5jb3VudF9jb25uZWN0b3JzKnNpemVvZih1aW50MzJfdCkpKTsKKwkJaWYgKCFyZXMuY29ubmVjdG9yX2lkX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisJaWYgKHJlcy5jb3VudF9lbmNvZGVycykgeworCQlyZXMuZW5jb2Rlcl9pZF9wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MocmVzLmNvdW50X2VuY29kZXJzKnNpemVvZih1aW50MzJfdCkpKTsKKwkJaWYgKCFyZXMuZW5jb2Rlcl9pZF9wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRSRVNPVVJDRVMsICZyZXMpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwkvKiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb25uZWN0b3JzIGFuZCBldGMgbWF5IGhhdmUgY2hhbmdlZCB3aXRoIGEKKwkgKiBob3RwbHVnIGV2ZW50IGluIGJldHdlZW4gdGhlIGlvY3RscywgaW4gd2hpY2ggY2FzZSB0aGUgZmllbGQgaXMKKwkgKiBzaWxlbnRseSBpZ25vcmVkIGJ5IHRoZSBrZXJuZWwuCisJICovCisJaWYgKGNvdW50cy5jb3VudF9mYnMgPCByZXMuY291bnRfZmJzIHx8CisJICAgIGNvdW50cy5jb3VudF9jcnRjcyA8IHJlcy5jb3VudF9jcnRjcyB8fAorCSAgICBjb3VudHMuY291bnRfY29ubmVjdG9ycyA8IHJlcy5jb3VudF9jb25uZWN0b3JzIHx8CisJICAgIGNvdW50cy5jb3VudF9lbmNvZGVycyA8IHJlcy5jb3VudF9lbmNvZGVycykKKwl7CisJCWRybUZyZWUoVTY0MlZPSUQocmVzLmZiX2lkX3B0cikpOworCQlkcm1GcmVlKFU2NDJWT0lEKHJlcy5jcnRjX2lkX3B0cikpOworCQlkcm1GcmVlKFU2NDJWT0lEKHJlcy5jb25uZWN0b3JfaWRfcHRyKSk7CisJCWRybUZyZWUoVTY0MlZPSUQocmVzLmVuY29kZXJfaWRfcHRyKSk7CisKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIHJldHVybgorCSAqLworCWlmICghKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwlyLT5taW5fd2lkdGggICAgID0gcmVzLm1pbl93aWR0aDsKKwlyLT5tYXhfd2lkdGggICAgID0gcmVzLm1heF93aWR0aDsKKwlyLT5taW5faGVpZ2h0ICAgID0gcmVzLm1pbl9oZWlnaHQ7CisJci0+bWF4X2hlaWdodCAgICA9IHJlcy5tYXhfaGVpZ2h0OworCXItPmNvdW50X2ZicyAgICAgPSByZXMuY291bnRfZmJzOworCXItPmNvdW50X2NydGNzICAgPSByZXMuY291bnRfY3J0Y3M7CisJci0+Y291bnRfY29ubmVjdG9ycyA9IHJlcy5jb3VudF9jb25uZWN0b3JzOworCXItPmNvdW50X2VuY29kZXJzID0gcmVzLmNvdW50X2VuY29kZXJzOworCisJci0+ZmJzICAgICAgICA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKHJlcy5mYl9pZF9wdHIpLCByZXMuY291bnRfZmJzLCBzaXplb2YodWludDMyX3QpKTsKKwlyLT5jcnRjcyAgICAgID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocmVzLmNydGNfaWRfcHRyKSwgcmVzLmNvdW50X2NydGNzLCBzaXplb2YodWludDMyX3QpKTsKKwlyLT5jb25uZWN0b3JzID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocmVzLmNvbm5lY3Rvcl9pZF9wdHIpLCByZXMuY291bnRfY29ubmVjdG9ycywgc2l6ZW9mKHVpbnQzMl90KSk7CisJci0+ZW5jb2RlcnMgICA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKHJlcy5lbmNvZGVyX2lkX3B0ciksIHJlcy5jb3VudF9lbmNvZGVycywgc2l6ZW9mKHVpbnQzMl90KSk7CisJaWYgKChyZXMuY291bnRfZmJzICYmICFyLT5mYnMpIHx8CisJICAgIChyZXMuY291bnRfY3J0Y3MgJiYgIXItPmNydGNzKSB8fAorCSAgICAocmVzLmNvdW50X2Nvbm5lY3RvcnMgJiYgIXItPmNvbm5lY3RvcnMpIHx8CisJICAgIChyZXMuY291bnRfZW5jb2RlcnMgJiYgIXItPmVuY29kZXJzKSkKKwl7CisJCWRybUZyZWUoci0+ZmJzKTsKKwkJZHJtRnJlZShyLT5jcnRjcyk7CisJCWRybUZyZWUoci0+Y29ubmVjdG9ycyk7CisJCWRybUZyZWUoci0+ZW5jb2RlcnMpOworCQlkcm1GcmVlKHIpOworCQlyID0gMDsKKwl9CisKK2Vycl9hbGxvY3M6CisJZHJtRnJlZShVNjQyVk9JRChyZXMuZmJfaWRfcHRyKSk7CisJZHJtRnJlZShVNjQyVk9JRChyZXMuY3J0Y19pZF9wdHIpKTsKKwlkcm1GcmVlKFU2NDJWT0lEKHJlcy5jb25uZWN0b3JfaWRfcHRyKSk7CisJZHJtRnJlZShVNjQyVk9JRChyZXMuZW5jb2Rlcl9pZF9wdHIpKTsKKworCXJldHVybiByOworfQorCitpbnQgZHJtTW9kZUFkZEZCKGludCBmZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDhfdCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgdWludDhfdCBicHAsIHVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBib19oYW5kbGUsCisJCSB1aW50MzJfdCAqYnVmX2lkKQoreworCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgZjsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIoZik7CisJZi53aWR0aCAgPSB3aWR0aDsKKwlmLmhlaWdodCA9IGhlaWdodDsKKwlmLnBpdGNoICA9IHBpdGNoOworCWYuYnBwICAgID0gYnBwOworCWYuZGVwdGggID0gZGVwdGg7CisJZi5oYW5kbGUgPSBib19oYW5kbGU7CisKKwlpZiAoKHJldCA9IERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfQURERkIsICZmKSkpCisJCXJldHVybiByZXQ7CisKKwkqYnVmX2lkID0gZi5mYl9pZDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRybU1vZGVBZGRGQjIoaW50IGZkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorCQkgIHVpbnQzMl90IHBpeGVsX2Zvcm1hdCwgdWludDMyX3QgYm9faGFuZGxlc1s0XSwKKwkJICB1aW50MzJfdCBwaXRjaGVzWzRdLCB1aW50MzJfdCBvZmZzZXRzWzRdLAorCQkgIHVpbnQzMl90ICpidWZfaWQsIHVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyIGY7CisJaW50IHJldDsKKworCW1lbWNsZWFyKGYpOworCWYud2lkdGggID0gd2lkdGg7CisJZi5oZWlnaHQgPSBoZWlnaHQ7CisJZi5waXhlbF9mb3JtYXQgPSBwaXhlbF9mb3JtYXQ7CisJZi5mbGFncyA9IGZsYWdzOworCW1lbWNweShmLmhhbmRsZXMsIGJvX2hhbmRsZXMsIDQgKiBzaXplb2YoYm9faGFuZGxlc1swXSkpOworCW1lbWNweShmLnBpdGNoZXMsIHBpdGNoZXMsIDQgKiBzaXplb2YocGl0Y2hlc1swXSkpOworCW1lbWNweShmLm9mZnNldHMsIG9mZnNldHMsIDQgKiBzaXplb2Yob2Zmc2V0c1swXSkpOworCisJaWYgKChyZXQgPSBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0FEREZCMiwgJmYpKSkKKwkJcmV0dXJuIHJldDsKKworCSpidWZfaWQgPSBmLmZiX2lkOworCXJldHVybiAwOworfQorCitpbnQgZHJtTW9kZVJtRkIoaW50IGZkLCB1aW50MzJfdCBidWZmZXJJZCkKK3sKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9STUZCLCAmYnVmZmVySWQpOworfQorCitkcm1Nb2RlRkJQdHIgZHJtTW9kZUdldEZCKGludCBmZCwgdWludDMyX3QgYnVmKQoreworCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgaW5mbzsKKwlkcm1Nb2RlRkJQdHIgcjsKKworCW1lbWNsZWFyKGluZm8pOworCWluZm8uZmJfaWQgPSBidWY7CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVEZCLCAmaW5mbykpCisJCXJldHVybiBOVUxMOworCisJaWYgKCEociA9IGRybU1hbGxvYyhzaXplb2YoKnIpKSkpCisJCXJldHVybiBOVUxMOworCisJci0+ZmJfaWQgPSBpbmZvLmZiX2lkOworCXItPndpZHRoID0gaW5mby53aWR0aDsKKwlyLT5oZWlnaHQgPSBpbmZvLmhlaWdodDsKKwlyLT5waXRjaCA9IGluZm8ucGl0Y2g7CisJci0+YnBwID0gaW5mby5icHA7CisJci0+aGFuZGxlID0gaW5mby5oYW5kbGU7CisJci0+ZGVwdGggPSBpbmZvLmRlcHRoOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkcm1Nb2RlRGlydHlGQihpbnQgZmQsIHVpbnQzMl90IGJ1ZmZlcklkLAorCQkgICBkcm1Nb2RlQ2xpcFB0ciBjbGlwcywgdWludDMyX3QgbnVtX2NsaXBzKQoreworCXN0cnVjdCBkcm1fbW9kZV9mYl9kaXJ0eV9jbWQgZGlydHk7CisKKwltZW1jbGVhcihkaXJ0eSk7CisJZGlydHkuZmJfaWQgPSBidWZmZXJJZDsKKwlkaXJ0eS5jbGlwc19wdHIgPSBWT0lEMlU2NChjbGlwcyk7CisJZGlydHkubnVtX2NsaXBzID0gbnVtX2NsaXBzOworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfRElSVFlGQiwgJmRpcnR5KTsKK30KKworCisvKgorICogQ3J0YyBmdW5jdGlvbnMKKyAqLworCitkcm1Nb2RlQ3J0Y1B0ciBkcm1Nb2RlR2V0Q3J0YyhpbnQgZmQsIHVpbnQzMl90IGNydGNJZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3J0YyBjcnRjOworCWRybU1vZGVDcnRjUHRyIHI7CisKKwltZW1jbGVhcihjcnRjKTsKKwljcnRjLmNydGNfaWQgPSBjcnRjSWQ7CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVENSVEMsICZjcnRjKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIHJldHVybgorCSAqLworCisJaWYgKCEociA9IGRybU1hbGxvYyhzaXplb2YoKnIpKSkpCisJCXJldHVybiAwOworCisJci0+Y3J0Y19pZCAgICAgICAgID0gY3J0Yy5jcnRjX2lkOworCXItPnggICAgICAgICAgICAgICA9IGNydGMueDsKKwlyLT55ICAgICAgICAgICAgICAgPSBjcnRjLnk7CisJci0+bW9kZV92YWxpZCAgICAgID0gY3J0Yy5tb2RlX3ZhbGlkOworCWlmIChyLT5tb2RlX3ZhbGlkKSB7CisJCW1lbWNweSgmci0+bW9kZSwgJmNydGMubW9kZSwgc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbykpOworCQlyLT53aWR0aCA9IGNydGMubW9kZS5oZGlzcGxheTsKKwkJci0+aGVpZ2h0ID0gY3J0Yy5tb2RlLnZkaXNwbGF5OworCX0KKwlyLT5idWZmZXJfaWQgICAgICAgPSBjcnRjLmZiX2lkOworCXItPmdhbW1hX3NpemUgICAgICA9IGNydGMuZ2FtbWFfc2l6ZTsKKwlyZXR1cm4gcjsKK30KKworCitpbnQgZHJtTW9kZVNldENydGMoaW50IGZkLCB1aW50MzJfdCBjcnRjSWQsIHVpbnQzMl90IGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90ICpjb25uZWN0b3JzLCBpbnQgY291bnQsCisJCSAgIGRybU1vZGVNb2RlSW5mb1B0ciBtb2RlKQoreworCXN0cnVjdCBkcm1fbW9kZV9jcnRjIGNydGM7CisKKwltZW1jbGVhcihjcnRjKTsKKwljcnRjLnggICAgICAgICAgICAgPSB4OworCWNydGMueSAgICAgICAgICAgICA9IHk7CisJY3J0Yy5jcnRjX2lkICAgICAgID0gY3J0Y0lkOworCWNydGMuZmJfaWQgICAgICAgICA9IGJ1ZmZlcklkOworCWNydGMuc2V0X2Nvbm5lY3RvcnNfcHRyID0gVk9JRDJVNjQoY29ubmVjdG9ycyk7CisJY3J0Yy5jb3VudF9jb25uZWN0b3JzID0gY291bnQ7CisJaWYgKG1vZGUpIHsKKwkgIG1lbWNweSgmY3J0Yy5tb2RlLCBtb2RlLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvKSk7CisJICBjcnRjLm1vZGVfdmFsaWQgPSAxOworCX0KKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX1NFVENSVEMsICZjcnRjKTsKK30KKworLyoKKyAqIEN1cnNvciBtYW5pcHVsYXRpb24KKyAqLworCitpbnQgZHJtTW9kZVNldEN1cnNvcihpbnQgZmQsIHVpbnQzMl90IGNydGNJZCwgdWludDMyX3QgYm9faGFuZGxlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQoreworCXN0cnVjdCBkcm1fbW9kZV9jdXJzb3IgYXJnOworCisJbWVtY2xlYXIoYXJnKTsKKwlhcmcuZmxhZ3MgPSBEUk1fTU9ERV9DVVJTT1JfQk87CisJYXJnLmNydGNfaWQgPSBjcnRjSWQ7CisJYXJnLndpZHRoID0gd2lkdGg7CisJYXJnLmhlaWdodCA9IGhlaWdodDsKKwlhcmcuaGFuZGxlID0gYm9faGFuZGxlOworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfQ1VSU09SLCAmYXJnKTsKK30KKworaW50IGRybU1vZGVTZXRDdXJzb3IyKGludCBmZCwgdWludDMyX3QgY3J0Y0lkLCB1aW50MzJfdCBib19oYW5kbGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludDMyX3QgaG90X3gsIGludDMyX3QgaG90X3kpCit7CisJc3RydWN0IGRybV9tb2RlX2N1cnNvcjIgYXJnOworCisJbWVtY2xlYXIoYXJnKTsKKwlhcmcuZmxhZ3MgPSBEUk1fTU9ERV9DVVJTT1JfQk87CisJYXJnLmNydGNfaWQgPSBjcnRjSWQ7CisJYXJnLndpZHRoID0gd2lkdGg7CisJYXJnLmhlaWdodCA9IGhlaWdodDsKKwlhcmcuaGFuZGxlID0gYm9faGFuZGxlOworCWFyZy5ob3RfeCA9IGhvdF94OworCWFyZy5ob3RfeSA9IGhvdF95OworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfQ1VSU09SMiwgJmFyZyk7Cit9CisKK2ludCBkcm1Nb2RlTW92ZUN1cnNvcihpbnQgZmQsIHVpbnQzMl90IGNydGNJZCwgaW50IHgsIGludCB5KQoreworCXN0cnVjdCBkcm1fbW9kZV9jdXJzb3IgYXJnOworCisJbWVtY2xlYXIoYXJnKTsKKwlhcmcuZmxhZ3MgPSBEUk1fTU9ERV9DVVJTT1JfTU9WRTsKKwlhcmcuY3J0Y19pZCA9IGNydGNJZDsKKwlhcmcueCA9IHg7CisJYXJnLnkgPSB5OworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfQ1VSU09SLCAmYXJnKTsKK30KKworLyoKKyAqIEVuY29kZXIgZ2V0CisgKi8KK2RybU1vZGVFbmNvZGVyUHRyIGRybU1vZGVHZXRFbmNvZGVyKGludCBmZCwgdWludDMyX3QgZW5jb2Rlcl9pZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIgZW5jOworCWRybU1vZGVFbmNvZGVyUHRyIHIgPSBOVUxMOworCisJbWVtY2xlYXIoZW5jKTsKKwllbmMuZW5jb2Rlcl9pZCA9IGVuY29kZXJfaWQ7CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVEVOQ09ERVIsICZlbmMpKQorCQlyZXR1cm4gMDsKKworCWlmICghKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKQorCQlyZXR1cm4gMDsKKworCXItPmVuY29kZXJfaWQgPSBlbmMuZW5jb2Rlcl9pZDsKKwlyLT5jcnRjX2lkID0gZW5jLmNydGNfaWQ7CisJci0+ZW5jb2Rlcl90eXBlID0gZW5jLmVuY29kZXJfdHlwZTsKKwlyLT5wb3NzaWJsZV9jcnRjcyA9IGVuYy5wb3NzaWJsZV9jcnRjczsKKwlyLT5wb3NzaWJsZV9jbG9uZXMgPSBlbmMucG9zc2libGVfY2xvbmVzOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDb25uZWN0b3IgbWFuaXB1bGF0aW9uCisgKi8KKworZHJtTW9kZUNvbm5lY3RvclB0ciBkcm1Nb2RlR2V0Q29ubmVjdG9yKGludCBmZCwgdWludDMyX3QgY29ubmVjdG9yX2lkKQoreworCXN0cnVjdCBkcm1fbW9kZV9nZXRfY29ubmVjdG9yIGNvbm4sIGNvdW50czsKKwlkcm1Nb2RlQ29ubmVjdG9yUHRyIHIgPSBOVUxMOworCityZXRyeToKKwltZW1jbGVhcihjb25uKTsKKwljb25uLmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VUQ09OTkVDVE9SLCAmY29ubikpCisJCXJldHVybiAwOworCisJY291bnRzID0gY29ubjsKKworCWlmIChjb25uLmNvdW50X3Byb3BzKSB7CisJCWNvbm4ucHJvcHNfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKGNvbm4uY291bnRfcHJvcHMqc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIWNvbm4ucHJvcHNfcHRyKQorCQkJZ290byBlcnJfYWxsb2NzOworCQljb25uLnByb3BfdmFsdWVzX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhjb25uLmNvdW50X3Byb3BzKnNpemVvZih1aW50NjRfdCkpKTsKKwkJaWYgKCFjb25uLnByb3BfdmFsdWVzX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisKKwlpZiAoY29ubi5jb3VudF9tb2RlcykgeworCQljb25uLm1vZGVzX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhjb25uLmNvdW50X21vZGVzKnNpemVvZihzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8pKSk7CisJCWlmICghY29ubi5tb2Rlc19wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKGNvbm4uY291bnRfZW5jb2RlcnMpIHsKKwkJY29ubi5lbmNvZGVyc19wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MoY29ubi5jb3VudF9lbmNvZGVycypzaXplb2YodWludDMyX3QpKSk7CisJCWlmICghY29ubi5lbmNvZGVyc19wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRDT05ORUNUT1IsICZjb25uKSkKKwkJZ290byBlcnJfYWxsb2NzOworCisJLyogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29ubmVjdG9ycyBhbmQgZXRjIG1heSBoYXZlIGNoYW5nZWQgd2l0aCBhCisJICogaG90cGx1ZyBldmVudCBpbiBiZXR3ZWVuIHRoZSBpb2N0bHMsIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGlzCisJICogc2lsZW50bHkgaWdub3JlZCBieSB0aGUga2VybmVsLgorCSAqLworCWlmIChjb3VudHMuY291bnRfcHJvcHMgPCBjb25uLmNvdW50X3Byb3BzIHx8CisJICAgIGNvdW50cy5jb3VudF9tb2RlcyA8IGNvbm4uY291bnRfbW9kZXMgfHwKKwkgICAgY291bnRzLmNvdW50X2VuY29kZXJzIDwgY29ubi5jb3VudF9lbmNvZGVycykgeworCQlkcm1GcmVlKFU2NDJWT0lEKGNvbm4ucHJvcHNfcHRyKSk7CisJCWRybUZyZWUoVTY0MlZPSUQoY29ubi5wcm9wX3ZhbHVlc19wdHIpKTsKKwkJZHJtRnJlZShVNjQyVk9JRChjb25uLm1vZGVzX3B0cikpOworCQlkcm1GcmVlKFU2NDJWT0lEKGNvbm4uZW5jb2RlcnNfcHRyKSk7CisKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZighKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKSB7CisJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisKKwlyLT5jb25uZWN0b3JfaWQgPSBjb25uLmNvbm5lY3Rvcl9pZDsKKwlyLT5lbmNvZGVyX2lkID0gY29ubi5lbmNvZGVyX2lkOworCXItPmNvbm5lY3Rpb24gICA9IGNvbm4uY29ubmVjdGlvbjsKKwlyLT5tbVdpZHRoICAgICAgPSBjb25uLm1tX3dpZHRoOworCXItPm1tSGVpZ2h0ICAgICA9IGNvbm4ubW1faGVpZ2h0OworCS8qIGNvbnZlcnQgc3VicGl4ZWwgZnJvbSBrZXJuZWwgdG8gdXNlcnNwYWNlICovCisJci0+c3VicGl4ZWwgICAgID0gY29ubi5zdWJwaXhlbCArIDE7CisJci0+Y291bnRfbW9kZXMgID0gY29ubi5jb3VudF9tb2RlczsKKwlyLT5jb3VudF9wcm9wcyAgPSBjb25uLmNvdW50X3Byb3BzOworCXItPnByb3BzICAgICAgICA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKGNvbm4ucHJvcHNfcHRyKSwgY29ubi5jb3VudF9wcm9wcywgc2l6ZW9mKHVpbnQzMl90KSk7CisJci0+cHJvcF92YWx1ZXMgID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQoY29ubi5wcm9wX3ZhbHVlc19wdHIpLCBjb25uLmNvdW50X3Byb3BzLCBzaXplb2YodWludDY0X3QpKTsKKwlyLT5tb2RlcyAgICAgICAgPSBkcm1BbGxvY0NweShVNjQyVk9JRChjb25uLm1vZGVzX3B0ciksIGNvbm4uY291bnRfbW9kZXMsIHNpemVvZihzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8pKTsKKwlyLT5jb3VudF9lbmNvZGVycyA9IGNvbm4uY291bnRfZW5jb2RlcnM7CisJci0+ZW5jb2RlcnMgICAgID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQoY29ubi5lbmNvZGVyc19wdHIpLCBjb25uLmNvdW50X2VuY29kZXJzLCBzaXplb2YodWludDMyX3QpKTsKKwlyLT5jb25uZWN0b3JfdHlwZSAgPSBjb25uLmNvbm5lY3Rvcl90eXBlOworCXItPmNvbm5lY3Rvcl90eXBlX2lkID0gY29ubi5jb25uZWN0b3JfdHlwZV9pZDsKKworCWlmICgoci0+Y291bnRfcHJvcHMgJiYgIXItPnByb3BzKSB8fAorCSAgICAoci0+Y291bnRfcHJvcHMgJiYgIXItPnByb3BfdmFsdWVzKSB8fAorCSAgICAoci0+Y291bnRfbW9kZXMgJiYgIXItPm1vZGVzKSB8fAorCSAgICAoci0+Y291bnRfZW5jb2RlcnMgJiYgIXItPmVuY29kZXJzKSkgeworCQlkcm1GcmVlKHItPnByb3BzKTsKKwkJZHJtRnJlZShyLT5wcm9wX3ZhbHVlcyk7CisJCWRybUZyZWUoci0+bW9kZXMpOworCQlkcm1GcmVlKHItPmVuY29kZXJzKTsKKwkJZHJtRnJlZShyKTsKKwkJciA9IDA7CisJfQorCitlcnJfYWxsb2NzOgorCWRybUZyZWUoVTY0MlZPSUQoY29ubi5wcm9wX3ZhbHVlc19wdHIpKTsKKwlkcm1GcmVlKFU2NDJWT0lEKGNvbm4ucHJvcHNfcHRyKSk7CisJZHJtRnJlZShVNjQyVk9JRChjb25uLm1vZGVzX3B0cikpOworCWRybUZyZWUoVTY0MlZPSUQoY29ubi5lbmNvZGVyc19wdHIpKTsKKworCXJldHVybiByOworfQorCitpbnQgZHJtTW9kZUF0dGFjaE1vZGUoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JfaWQsIGRybU1vZGVNb2RlSW5mb1B0ciBtb2RlX2luZm8pCit7CisJc3RydWN0IGRybV9tb2RlX21vZGVfY21kIHJlczsKKworCW1lbWNsZWFyKHJlcyk7CisJbWVtY3B5KCZyZXMubW9kZSwgbW9kZV9pbmZvLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvKSk7CisJcmVzLmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0FUVEFDSE1PREUsICZyZXMpOworfQorCitpbnQgZHJtTW9kZURldGFjaE1vZGUoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JfaWQsIGRybU1vZGVNb2RlSW5mb1B0ciBtb2RlX2luZm8pCit7CisJc3RydWN0IGRybV9tb2RlX21vZGVfY21kIHJlczsKKworCW1lbWNsZWFyKHJlcyk7CisJbWVtY3B5KCZyZXMubW9kZSwgbW9kZV9pbmZvLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvKSk7CisJcmVzLmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0RFVEFDSE1PREUsICZyZXMpOworfQorCisKK2RybU1vZGVQcm9wZXJ0eVB0ciBkcm1Nb2RlR2V0UHJvcGVydHkoaW50IGZkLCB1aW50MzJfdCBwcm9wZXJ0eV9pZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ2V0X3Byb3BlcnR5IHByb3A7CisJZHJtTW9kZVByb3BlcnR5UHRyIHI7CisKKwltZW1jbGVhcihwcm9wKTsKKwlwcm9wLnByb3BfaWQgPSBwcm9wZXJ0eV9pZDsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEVSVFksICZwcm9wKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocHJvcC5jb3VudF92YWx1ZXMpCisJCXByb3AudmFsdWVzX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhwcm9wLmNvdW50X3ZhbHVlcyAqIHNpemVvZih1aW50NjRfdCkpKTsKKworCWlmIChwcm9wLmNvdW50X2VudW1fYmxvYnMgJiYgKHByb3AuZmxhZ3MgJiAoRFJNX01PREVfUFJPUF9FTlVNIHwgRFJNX01PREVfUFJPUF9CSVRNQVNLKSkpCisJCXByb3AuZW51bV9ibG9iX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhwcm9wLmNvdW50X2VudW1fYmxvYnMgKiBzaXplb2Yoc3RydWN0IGRybV9tb2RlX3Byb3BlcnR5X2VudW0pKSk7CisKKwlpZiAocHJvcC5jb3VudF9lbnVtX2Jsb2JzICYmIChwcm9wLmZsYWdzICYgRFJNX01PREVfUFJPUF9CTE9CKSkgeworCQlwcm9wLnZhbHVlc19wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MocHJvcC5jb3VudF9lbnVtX2Jsb2JzICogc2l6ZW9mKHVpbnQzMl90KSkpOworCQlwcm9wLmVudW1fYmxvYl9wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MocHJvcC5jb3VudF9lbnVtX2Jsb2JzICogc2l6ZW9mKHVpbnQzMl90KSkpOworCX0KKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEVSVFksICZwcm9wKSkgeworCQlyID0gTlVMTDsKKwkJZ290byBlcnJfYWxsb2NzOworCX0KKworCWlmICghKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKQorCQlyZXR1cm4gTlVMTDsKKworCXItPnByb3BfaWQgPSBwcm9wLnByb3BfaWQ7CisJci0+Y291bnRfdmFsdWVzID0gcHJvcC5jb3VudF92YWx1ZXM7CisKKwlyLT5mbGFncyA9IHByb3AuZmxhZ3M7CisJaWYgKHByb3AuY291bnRfdmFsdWVzKQorCQlyLT52YWx1ZXMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChwcm9wLnZhbHVlc19wdHIpLCBwcm9wLmNvdW50X3ZhbHVlcywgc2l6ZW9mKHVpbnQ2NF90KSk7CisJaWYgKHByb3AuZmxhZ3MgJiAoRFJNX01PREVfUFJPUF9FTlVNIHwgRFJNX01PREVfUFJPUF9CSVRNQVNLKSkgeworCQlyLT5jb3VudF9lbnVtcyA9IHByb3AuY291bnRfZW51bV9ibG9iczsKKwkJci0+ZW51bXMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChwcm9wLmVudW1fYmxvYl9wdHIpLCBwcm9wLmNvdW50X2VudW1fYmxvYnMsIHNpemVvZihzdHJ1Y3QgZHJtX21vZGVfcHJvcGVydHlfZW51bSkpOworCX0gZWxzZSBpZiAocHJvcC5mbGFncyAmIERSTV9NT0RFX1BST1BfQkxPQikgeworCQlyLT52YWx1ZXMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChwcm9wLnZhbHVlc19wdHIpLCBwcm9wLmNvdW50X2VudW1fYmxvYnMsIHNpemVvZih1aW50MzJfdCkpOworCQlyLT5ibG9iX2lkcyA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKHByb3AuZW51bV9ibG9iX3B0ciksIHByb3AuY291bnRfZW51bV9ibG9icywgc2l6ZW9mKHVpbnQzMl90KSk7CisJCXItPmNvdW50X2Jsb2JzID0gcHJvcC5jb3VudF9lbnVtX2Jsb2JzOworCX0KKwlzdHJuY3B5KHItPm5hbWUsIHByb3AubmFtZSwgRFJNX1BST1BfTkFNRV9MRU4pOworCXItPm5hbWVbRFJNX1BST1BfTkFNRV9MRU4tMV0gPSAwOworCitlcnJfYWxsb2NzOgorCWRybUZyZWUoVTY0MlZPSUQocHJvcC52YWx1ZXNfcHRyKSk7CisJZHJtRnJlZShVNjQyVk9JRChwcm9wLmVudW1fYmxvYl9wdHIpKTsKKworCXJldHVybiByOworfQorCit2b2lkIGRybU1vZGVGcmVlUHJvcGVydHkoZHJtTW9kZVByb3BlcnR5UHRyIHB0cikKK3sKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJZHJtRnJlZShwdHItPnZhbHVlcyk7CisJZHJtRnJlZShwdHItPmVudW1zKTsKKwlkcm1GcmVlKHB0cik7Cit9CisKK2RybU1vZGVQcm9wZXJ0eUJsb2JQdHIgZHJtTW9kZUdldFByb3BlcnR5QmxvYihpbnQgZmQsIHVpbnQzMl90IGJsb2JfaWQpCit7CisJc3RydWN0IGRybV9tb2RlX2dldF9ibG9iIGJsb2I7CisJZHJtTW9kZVByb3BlcnR5QmxvYlB0ciByOworCisJbWVtY2xlYXIoYmxvYik7CisJYmxvYi5ibG9iX2lkID0gYmxvYl9pZDsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEJMT0IsICZibG9iKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYmxvYi5sZW5ndGgpCisJCWJsb2IuZGF0YSA9IFZPSUQyVTY0KGRybU1hbGxvYyhibG9iLmxlbmd0aCkpOworCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRQUk9QQkxPQiwgJmJsb2IpKSB7CisJCXIgPSBOVUxMOworCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKCEociA9IGRybU1hbGxvYyhzaXplb2YoKnIpKSkpCisJCWdvdG8gZXJyX2FsbG9jczsKKworCXItPmlkID0gYmxvYi5ibG9iX2lkOworCXItPmxlbmd0aCA9IGJsb2IubGVuZ3RoOworCXItPmRhdGEgPSBkcm1BbGxvY0NweShVNjQyVk9JRChibG9iLmRhdGEpLCAxLCBibG9iLmxlbmd0aCk7CisKK2Vycl9hbGxvY3M6CisJZHJtRnJlZShVNjQyVk9JRChibG9iLmRhdGEpKTsKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkcm1Nb2RlRnJlZVByb3BlcnR5QmxvYihkcm1Nb2RlUHJvcGVydHlCbG9iUHRyIHB0cikKK3sKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJZHJtRnJlZShwdHItPmRhdGEpOworCWRybUZyZWUocHRyKTsKK30KKworaW50IGRybU1vZGVDb25uZWN0b3JTZXRQcm9wZXJ0eShpbnQgZmQsIHVpbnQzMl90IGNvbm5lY3Rvcl9pZCwgdWludDMyX3QgcHJvcGVydHlfaWQsCisJCQkgICAgIHVpbnQ2NF90IHZhbHVlKQoreworCXN0cnVjdCBkcm1fbW9kZV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5IG9zcDsKKworCW1lbWNsZWFyKG9zcCk7CisJb3NwLmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKKwlvc3AucHJvcF9pZCA9IHByb3BlcnR5X2lkOworCW9zcC52YWx1ZSA9IHZhbHVlOworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfU0VUUFJPUEVSVFksICZvc3ApOworfQorCisvKgorICogY2hlY2tzIGlmIGEgbW9kZXNldHRpbmcgY2FwYWJsZSBkcml2ZXIgaGFzIGF0dGFjaGVkIHRvIHRoZSBwY2kgaWQKKyAqIHJldHVybnMgMCBpZiBtb2Rlc2V0dGluZyBzdXBwb3J0ZWQuCisgKiAgLUVJTlZBTCBvciBpbnZhbGlkIGJ1cyBpZAorICogIC1FTk9TWVMgaWYgbm8gbW9kZXNldHRpbmcgc3VwcG9ydAorKi8KK2ludCBkcm1DaGVja01vZGVzZXR0aW5nU3VwcG9ydGVkKGNvbnN0IGNoYXIgKmJ1c2lkKQoreworI2lmIGRlZmluZWQgKF9fbGludXhfXykKKwljaGFyIHBjaV9kZXZfZGlyWzEwMjRdOworCWludCBkb21haW4sIGJ1cywgZGV2LCBmdW5jOworCURJUiAqc3lzZGlyOworCXN0cnVjdCBkaXJlbnQgKmRlbnQ7CisJaW50IGZvdW5kID0gMCwgcmV0OworCisJcmV0ID0gc3NjYW5mKGJ1c2lkLCAicGNpOiUwNHg6JTAyeDolMDJ4LiVkIiwgJmRvbWFpbiwgJmJ1cywgJmRldiwgJmZ1bmMpOworCWlmIChyZXQgIT0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcHJpbnRmKHBjaV9kZXZfZGlyLCAiL3N5cy9idXMvcGNpL2RldmljZXMvJTA0eDolMDJ4OiUwMnguJWQvZHJtIiwKKwkJZG9tYWluLCBidXMsIGRldiwgZnVuYyk7CisKKwlzeXNkaXIgPSBvcGVuZGlyKHBjaV9kZXZfZGlyKTsKKwlpZiAoc3lzZGlyKSB7CisJCWRlbnQgPSByZWFkZGlyKHN5c2Rpcik7CisJCXdoaWxlIChkZW50KSB7CisJCQlpZiAoIXN0cm5jbXAoZGVudC0+ZF9uYW1lLCAiY29udHJvbEQiLCA4KSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVudCA9IHJlYWRkaXIoc3lzZGlyKTsKKwkJfQorCQljbG9zZWRpcihzeXNkaXIpOworCQlpZiAoZm91bmQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlzcHJpbnRmKHBjaV9kZXZfZGlyLCAiL3N5cy9idXMvcGNpL2RldmljZXMvJTA0eDolMDJ4OiUwMnguJWQvIiwKKwkJZG9tYWluLCBidXMsIGRldiwgZnVuYyk7CisKKwlzeXNkaXIgPSBvcGVuZGlyKHBjaV9kZXZfZGlyKTsKKwlpZiAoIXN5c2RpcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZW50ID0gcmVhZGRpcihzeXNkaXIpOworCXdoaWxlIChkZW50KSB7CisJCWlmICghc3RybmNtcChkZW50LT5kX25hbWUsICJkcm06Y29udHJvbEQiLCAxMikpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVudCA9IHJlYWRkaXIoc3lzZGlyKTsKKwl9CisKKwljbG9zZWRpcihzeXNkaXIpOworCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisjZWxpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19GcmVlQlNEX2tlcm5lbF9fKQorCWNoYXIga2J1c2lkWzEwMjRdLCBzYnVzaWRbMTAyNF07CisJY2hhciBvaWRbMTI4XTsKKwlpbnQgZG9tYWluLCBidXMsIGRldiwgZnVuYzsKKwlpbnQgaSwgbW9kZXNldHRpbmcsIHJldDsKKwlzaXplX3QgbGVuOworCisJcmV0ID0gc3NjYW5mKGJ1c2lkLCAicGNpOiUwNHg6JTAyeDolMDJ4LiVkIiwgJmRvbWFpbiwgJmJ1cywgJmRldiwKKwkgICAgJmZ1bmMpOworCWlmIChyZXQgIT0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc25wcmludGYoa2J1c2lkLCBzaXplb2Yoa2J1c2lkKSwgInBjaTolMDR4OiUwMng6JTAyeC4lZCIsIGRvbWFpbiwgYnVzLAorCSAgICBkZXYsIGZ1bmMpOworCisJLyogSG93IG1hbnkgR1BVcyBkbyB3ZSBleHBlY3QgaW4gdGhlIG1hY2hpbmUgPyAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXNucHJpbnRmKG9pZCwgc2l6ZW9mKG9pZCksICJody5kcmkuJWQuYnVzaWQiLCBpKTsKKwkJbGVuID0gc2l6ZW9mKHNidXNpZCk7CisJCXJldCA9IHN5c2N0bGJ5bmFtZShvaWQsIHNidXNpZCwgJmxlbiwgTlVMTCwgMCk7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoc3RyY21wKHNidXNpZCwga2J1c2lkKSAhPSAwKQorCQkJY29udGludWU7CisJCXNucHJpbnRmKG9pZCwgc2l6ZW9mKG9pZCksICJody5kcmkuJWQubW9kZXNldHRpbmciLCBpKTsKKwkJbGVuID0gc2l6ZW9mKG1vZGVzZXR0aW5nKTsKKwkJcmV0ID0gc3lzY3RsYnluYW1lKG9pZCwgJm1vZGVzZXR0aW5nLCAmbGVuLCBOVUxMLCAwKTsKKwkJaWYgKHJldCA9PSAtMSB8fCBsZW4gIT0gc2l6ZW9mKG1vZGVzZXR0aW5nKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gKG1vZGVzZXR0aW5nID8gMCA6IC1FTk9TWVMpOworCX0KKyNlbGlmIGRlZmluZWQoX19EcmFnb25GbHlfXykKKwlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHVybiAtRU5PU1lTOworCit9CisKK2ludCBkcm1Nb2RlQ3J0Y0dldEdhbW1hKGludCBmZCwgdWludDMyX3QgY3J0Y19pZCwgdWludDMyX3Qgc2l6ZSwKKwkJCXVpbnQxNl90ICpyZWQsIHVpbnQxNl90ICpncmVlbiwgdWludDE2X3QgKmJsdWUpCit7CisJc3RydWN0IGRybV9tb2RlX2NydGNfbHV0IGw7CisKKwltZW1jbGVhcihsKTsKKwlsLmNydGNfaWQgPSBjcnRjX2lkOworCWwuZ2FtbWFfc2l6ZSA9IHNpemU7CisJbC5yZWQgPSBWT0lEMlU2NChyZWQpOworCWwuZ3JlZW4gPSBWT0lEMlU2NChncmVlbik7CisJbC5ibHVlID0gVk9JRDJVNjQoYmx1ZSk7CisKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRHQU1NQSwgJmwpOworfQorCitpbnQgZHJtTW9kZUNydGNTZXRHYW1tYShpbnQgZmQsIHVpbnQzMl90IGNydGNfaWQsIHVpbnQzMl90IHNpemUsCisJCQl1aW50MTZfdCAqcmVkLCB1aW50MTZfdCAqZ3JlZW4sIHVpbnQxNl90ICpibHVlKQoreworCXN0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCBsOworCisJbWVtY2xlYXIobCk7CisJbC5jcnRjX2lkID0gY3J0Y19pZDsKKwlsLmdhbW1hX3NpemUgPSBzaXplOworCWwucmVkID0gVk9JRDJVNjQocmVkKTsKKwlsLmdyZWVuID0gVk9JRDJVNjQoZ3JlZW4pOworCWwuYmx1ZSA9IFZPSUQyVTY0KGJsdWUpOworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfU0VUR0FNTUEsICZsKTsKK30KKworaW50IGRybUhhbmRsZUV2ZW50KGludCBmZCwgZHJtRXZlbnRDb250ZXh0UHRyIGV2Y3R4KQoreworCWNoYXIgYnVmZmVyWzEwMjRdOworCWludCBsZW4sIGk7CisJc3RydWN0IGRybV9ldmVudCAqZTsKKwlzdHJ1Y3QgZHJtX2V2ZW50X3ZibGFuayAqdmJsYW5rOworCQorCS8qIFRoZSBEUk0gcmVhZCBzZW1hbnRpY3MgZ3VhcmFudGVlcyB0aGF0IHdlIGFsd2F5cyBnZXQgb25seQorCSAqIGNvbXBsZXRlIGV2ZW50cy4gKi8KKworCWxlbiA9IHJlYWQoZmQsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlcik7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAobGVuIDwgKGludClzaXplb2YgKmUpCisJCXJldHVybiAtMTsKKworCWkgPSAwOworCXdoaWxlIChpIDwgbGVuKSB7CisJCWUgPSAoc3RydWN0IGRybV9ldmVudCAqKSAmYnVmZmVyW2ldOworCQlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBEUk1fRVZFTlRfVkJMQU5LOgorCQkJaWYgKGV2Y3R4LT52ZXJzaW9uIDwgMSB8fAorCQkJICAgIGV2Y3R4LT52YmxhbmtfaGFuZGxlciA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJdmJsYW5rID0gKHN0cnVjdCBkcm1fZXZlbnRfdmJsYW5rICopIGU7CisJCQlldmN0eC0+dmJsYW5rX2hhbmRsZXIoZmQsCisJCQkJCSAgICAgIHZibGFuay0+c2VxdWVuY2UsIAorCQkJCQkgICAgICB2YmxhbmstPnR2X3NlYywKKwkJCQkJICAgICAgdmJsYW5rLT50dl91c2VjLAorCQkJCQkgICAgICBVNjQyVk9JRCAodmJsYW5rLT51c2VyX2RhdGEpKTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9FVkVOVF9GTElQX0NPTVBMRVRFOgorCQkJaWYgKGV2Y3R4LT52ZXJzaW9uIDwgMiB8fAorCQkJICAgIGV2Y3R4LT5wYWdlX2ZsaXBfaGFuZGxlciA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJdmJsYW5rID0gKHN0cnVjdCBkcm1fZXZlbnRfdmJsYW5rICopIGU7CisJCQlldmN0eC0+cGFnZV9mbGlwX2hhbmRsZXIoZmQsCisJCQkJCQkgdmJsYW5rLT5zZXF1ZW5jZSwKKwkJCQkJCSB2YmxhbmstPnR2X3NlYywKKwkJCQkJCSB2YmxhbmstPnR2X3VzZWMsCisJCQkJCQkgVTY0MlZPSUQgKHZibGFuay0+dXNlcl9kYXRhKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWkgKz0gZS0+bGVuZ3RoOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZHJtTW9kZVBhZ2VGbGlwKGludCBmZCwgdWludDMyX3QgY3J0Y19pZCwgdWludDMyX3QgZmJfaWQsCisJCSAgICB1aW50MzJfdCBmbGFncywgdm9pZCAqdXNlcl9kYXRhKQoreworCXN0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcCBmbGlwOworCisJbWVtY2xlYXIoZmxpcCk7CisJZmxpcC5mYl9pZCA9IGZiX2lkOworCWZsaXAuY3J0Y19pZCA9IGNydGNfaWQ7CisJZmxpcC51c2VyX2RhdGEgPSBWT0lEMlU2NCh1c2VyX2RhdGEpOworCWZsaXAuZmxhZ3MgPSBmbGFnczsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX1BBR0VfRkxJUCwgJmZsaXApOworfQorCitpbnQgZHJtTW9kZVNldFBsYW5lKGludCBmZCwgdWludDMyX3QgcGxhbmVfaWQsIHVpbnQzMl90IGNydGNfaWQsCisJCSAgICB1aW50MzJfdCBmYl9pZCwgdWludDMyX3QgZmxhZ3MsCisJCSAgICBpbnQzMl90IGNydGNfeCwgaW50MzJfdCBjcnRjX3ksCisJCSAgICB1aW50MzJfdCBjcnRjX3csIHVpbnQzMl90IGNydGNfaCwKKwkJICAgIHVpbnQzMl90IHNyY194LCB1aW50MzJfdCBzcmNfeSwKKwkJICAgIHVpbnQzMl90IHNyY193LCB1aW50MzJfdCBzcmNfaCkKKworeworCXN0cnVjdCBkcm1fbW9kZV9zZXRfcGxhbmUgczsKKworCW1lbWNsZWFyKHMpOworCXMucGxhbmVfaWQgPSBwbGFuZV9pZDsKKwlzLmNydGNfaWQgPSBjcnRjX2lkOworCXMuZmJfaWQgPSBmYl9pZDsKKwlzLmZsYWdzID0gZmxhZ3M7CisJcy5jcnRjX3ggPSBjcnRjX3g7CisJcy5jcnRjX3kgPSBjcnRjX3k7CisJcy5jcnRjX3cgPSBjcnRjX3c7CisJcy5jcnRjX2ggPSBjcnRjX2g7CisJcy5zcmNfeCA9IHNyY194OworCXMuc3JjX3kgPSBzcmNfeTsKKwlzLnNyY193ID0gc3JjX3c7CisJcy5zcmNfaCA9IHNyY19oOworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfU0VUUExBTkUsICZzKTsKK30KKworCitkcm1Nb2RlUGxhbmVQdHIgZHJtTW9kZUdldFBsYW5lKGludCBmZCwgdWludDMyX3QgcGxhbmVfaWQpCit7CisJc3RydWN0IGRybV9tb2RlX2dldF9wbGFuZSBvdnIsIGNvdW50czsKKwlkcm1Nb2RlUGxhbmVQdHIgciA9IDA7CisKK3JldHJ5OgorCW1lbWNsZWFyKG92cik7CisJb3ZyLnBsYW5lX2lkID0gcGxhbmVfaWQ7CisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRQTEFORSwgJm92cikpCisJCXJldHVybiAwOworCisJY291bnRzID0gb3ZyOworCisJaWYgKG92ci5jb3VudF9mb3JtYXRfdHlwZXMpIHsKKwkJb3ZyLmZvcm1hdF90eXBlX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhvdnIuY291bnRfZm9ybWF0X3R5cGVzICoKKwkJCQkJCQkgc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIW92ci5mb3JtYXRfdHlwZV9wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRQTEFORSwgJm92cikpCisJCWdvdG8gZXJyX2FsbG9jczsKKworCWlmIChjb3VudHMuY291bnRfZm9ybWF0X3R5cGVzIDwgb3ZyLmNvdW50X2Zvcm1hdF90eXBlcykgeworCQlkcm1GcmVlKFU2NDJWT0lEKG92ci5mb3JtYXRfdHlwZV9wdHIpKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZiAoIShyID0gZHJtTWFsbG9jKHNpemVvZigqcikpKSkKKwkJZ290byBlcnJfYWxsb2NzOworCisJci0+Y291bnRfZm9ybWF0cyA9IG92ci5jb3VudF9mb3JtYXRfdHlwZXM7CisJci0+cGxhbmVfaWQgPSBvdnIucGxhbmVfaWQ7CisJci0+Y3J0Y19pZCA9IG92ci5jcnRjX2lkOworCXItPmZiX2lkID0gb3ZyLmZiX2lkOworCXItPnBvc3NpYmxlX2NydGNzID0gb3ZyLnBvc3NpYmxlX2NydGNzOworCXItPmdhbW1hX3NpemUgPSBvdnIuZ2FtbWFfc2l6ZTsKKwlyLT5mb3JtYXRzID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQob3ZyLmZvcm1hdF90eXBlX3B0ciksCisJCQkJIG92ci5jb3VudF9mb3JtYXRfdHlwZXMsIHNpemVvZih1aW50MzJfdCkpOworCWlmIChvdnIuY291bnRfZm9ybWF0X3R5cGVzICYmICFyLT5mb3JtYXRzKSB7CisJCWRybUZyZWUoci0+Zm9ybWF0cyk7CisJCWRybUZyZWUocik7CisJCXIgPSAwOworCX0KKworZXJyX2FsbG9jczoKKwlkcm1GcmVlKFU2NDJWT0lEKG92ci5mb3JtYXRfdHlwZV9wdHIpKTsKKworCXJldHVybiByOworfQorCit2b2lkIGRybU1vZGVGcmVlUGxhbmUoZHJtTW9kZVBsYW5lUHRyIHB0cikKK3sKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJZHJtRnJlZShwdHItPmZvcm1hdHMpOworCWRybUZyZWUocHRyKTsKK30KKworZHJtTW9kZVBsYW5lUmVzUHRyIGRybU1vZGVHZXRQbGFuZVJlc291cmNlcyhpbnQgZmQpCit7CisJc3RydWN0IGRybV9tb2RlX2dldF9wbGFuZV9yZXMgcmVzLCBjb3VudHM7CisJZHJtTW9kZVBsYW5lUmVzUHRyIHIgPSAwOworCityZXRyeToKKwltZW1jbGVhcihyZXMpOworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VUUExBTkVSRVNPVVJDRVMsICZyZXMpKQorCQlyZXR1cm4gMDsKKworCWNvdW50cyA9IHJlczsKKworCWlmIChyZXMuY291bnRfcGxhbmVzKSB7CisJCXJlcy5wbGFuZV9pZF9wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MocmVzLmNvdW50X3BsYW5lcyAqCisJCQkJCQkJc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIXJlcy5wbGFuZV9pZF9wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRQTEFORVJFU09VUkNFUywgJnJlcykpCisJCWdvdG8gZXJyX2FsbG9jczsKKworCWlmIChjb3VudHMuY291bnRfcGxhbmVzIDwgcmVzLmNvdW50X3BsYW5lcykgeworCQlkcm1GcmVlKFU2NDJWT0lEKHJlcy5wbGFuZV9pZF9wdHIpKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZiAoIShyID0gZHJtTWFsbG9jKHNpemVvZigqcikpKSkKKwkJZ290byBlcnJfYWxsb2NzOworCisJci0+Y291bnRfcGxhbmVzID0gcmVzLmNvdW50X3BsYW5lczsKKwlyLT5wbGFuZXMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChyZXMucGxhbmVfaWRfcHRyKSwKKwkJCQkgIHJlcy5jb3VudF9wbGFuZXMsIHNpemVvZih1aW50MzJfdCkpOworCWlmIChyZXMuY291bnRfcGxhbmVzICYmICFyLT5wbGFuZXMpIHsKKwkJZHJtRnJlZShyLT5wbGFuZXMpOworCQlkcm1GcmVlKHIpOworCQlyID0gMDsKKwl9CisKK2Vycl9hbGxvY3M6CisJZHJtRnJlZShVNjQyVk9JRChyZXMucGxhbmVfaWRfcHRyKSk7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkcm1Nb2RlRnJlZVBsYW5lUmVzb3VyY2VzKGRybU1vZGVQbGFuZVJlc1B0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKworCWRybUZyZWUocHRyLT5wbGFuZXMpOworCWRybUZyZWUocHRyKTsKK30KKworZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHIgZHJtTW9kZU9iamVjdEdldFByb3BlcnRpZXMoaW50IGZkLAorCQkJCQkJICAgICAgdWludDMyX3Qgb2JqZWN0X2lkLAorCQkJCQkJICAgICAgdWludDMyX3Qgb2JqZWN0X3R5cGUpCit7CisJc3RydWN0IGRybV9tb2RlX29ial9nZXRfcHJvcGVydGllcyBwcm9wZXJ0aWVzOworCWRybU1vZGVPYmplY3RQcm9wZXJ0aWVzUHRyIHJldCA9IE5VTEw7CisJdWludDMyX3QgY291bnQ7CisKK3JldHJ5OgorCW1lbWNsZWFyKHByb3BlcnRpZXMpOworCXByb3BlcnRpZXMub2JqX2lkID0gb2JqZWN0X2lkOworCXByb3BlcnRpZXMub2JqX3R5cGUgPSBvYmplY3RfdHlwZTsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfT0JKX0dFVFBST1BFUlRJRVMsICZwcm9wZXJ0aWVzKSkKKwkJcmV0dXJuIDA7CisKKwljb3VudCA9IHByb3BlcnRpZXMuY291bnRfcHJvcHM7CisKKwlpZiAoY291bnQpIHsKKwkJcHJvcGVydGllcy5wcm9wc19wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MoY291bnQgKgorCQkJCQkJCSAgc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIXByb3BlcnRpZXMucHJvcHNfcHRyKQorCQkJZ290byBlcnJfYWxsb2NzOworCQlwcm9wZXJ0aWVzLnByb3BfdmFsdWVzX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhjb3VudCAqCisJCQkJCQkgICAgICBzaXplb2YodWludDY0X3QpKSk7CisJCWlmICghcHJvcGVydGllcy5wcm9wX3ZhbHVlc19wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9PQkpfR0VUUFJPUEVSVElFUywgJnByb3BlcnRpZXMpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwlpZiAoY291bnQgPCBwcm9wZXJ0aWVzLmNvdW50X3Byb3BzKSB7CisJCWRybUZyZWUoVTY0MlZPSUQocHJvcGVydGllcy5wcm9wc19wdHIpKTsKKwkJZHJtRnJlZShVNjQyVk9JRChwcm9wZXJ0aWVzLnByb3BfdmFsdWVzX3B0cikpOworCQlnb3RvIHJldHJ5OworCX0KKwljb3VudCA9IHByb3BlcnRpZXMuY291bnRfcHJvcHM7CisKKwlyZXQgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyZXQpKTsKKwlpZiAoIXJldCkKKwkJZ290byBlcnJfYWxsb2NzOworCisJcmV0LT5jb3VudF9wcm9wcyA9IGNvdW50OworCXJldC0+cHJvcHMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChwcm9wZXJ0aWVzLnByb3BzX3B0ciksCisJCQkJIGNvdW50LCBzaXplb2YodWludDMyX3QpKTsKKwlyZXQtPnByb3BfdmFsdWVzID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocHJvcGVydGllcy5wcm9wX3ZhbHVlc19wdHIpLAorCQkJCSAgICAgICBjb3VudCwgc2l6ZW9mKHVpbnQ2NF90KSk7CisJaWYgKHJldC0+Y291bnRfcHJvcHMgJiYgKCFyZXQtPnByb3BzIHx8ICFyZXQtPnByb3BfdmFsdWVzKSkgeworCQlkcm1GcmVlKHJldC0+cHJvcHMpOworCQlkcm1GcmVlKHJldC0+cHJvcF92YWx1ZXMpOworCQlkcm1GcmVlKHJldCk7CisJCXJldCA9IE5VTEw7CisJfQorCitlcnJfYWxsb2NzOgorCWRybUZyZWUoVTY0MlZPSUQocHJvcGVydGllcy5wcm9wc19wdHIpKTsKKwlkcm1GcmVlKFU2NDJWT0lEKHByb3BlcnRpZXMucHJvcF92YWx1ZXNfcHRyKSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBkcm1Nb2RlRnJlZU9iamVjdFByb3BlcnRpZXMoZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHIgcHRyKQoreworCWlmICghcHRyKQorCQlyZXR1cm47CisJZHJtRnJlZShwdHItPnByb3BzKTsKKwlkcm1GcmVlKHB0ci0+cHJvcF92YWx1ZXMpOworCWRybUZyZWUocHRyKTsKK30KKworaW50IGRybU1vZGVPYmplY3RTZXRQcm9wZXJ0eShpbnQgZmQsIHVpbnQzMl90IG9iamVjdF9pZCwgdWludDMyX3Qgb2JqZWN0X3R5cGUsCisJCQkgICAgIHVpbnQzMl90IHByb3BlcnR5X2lkLCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqX3NldF9wcm9wZXJ0eSBwcm9wOworCisJbWVtY2xlYXIocHJvcCk7CisJcHJvcC52YWx1ZSA9IHZhbHVlOworCXByb3AucHJvcF9pZCA9IHByb3BlcnR5X2lkOworCXByb3Aub2JqX2lkID0gb2JqZWN0X2lkOworCXByb3Aub2JqX3R5cGUgPSBvYmplY3RfdHlwZTsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX09CSl9TRVRQUk9QRVJUWSwgJnByb3ApOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybU1vZGUuaCBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZkcm1Nb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMDE4NAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZkcm1Nb2RlLmgKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBcZmlsZSB4Zjg2ZHJtTW9kZS5oCisgKiBIZWFkZXIgZm9yIERSTSBtb2Rlc2V0dGluZyBpbnRlcmZhY2UuCisgKgorICogXGF1dGhvciBKYWtvYiBCb3JuZWNyYW50eiA8d2FsbGJyYWtlckBnbWFpbC5jb20+CisgKgorICogXHBhciBBY2tub3dsZWRnZW1lbnRzOgorICogRmViIDIwMDcsIERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEpha29iIEJvcm5lY3JhbnR6IDx3YWxsYnJha2VyQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1hGODZEUk1NT0RFX0hfCisjZGVmaW5lIF9YRjg2RFJNTU9ERV9IXworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPGRybS5oPgorCisvKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBtb2Rlc2V0dGluZyBmb3IgZHJtLgorICoKKyAqIEluIG9yZGVyIHRvIHVzZSB0aGlzIGludGVyZmFjZSB5b3UgbXVzdCBpbmNsdWRlIGVpdGhlciA8c3RkaW50Lmg+IG9yIGFub3RoZXIKKyAqIGhlYWRlciBkZWZpbmluZyB1aW50MzJfdCwgaW50MzJfdCBhbmQgdWludDE2X3QuCisgKgorICogSXQgYWltcyB0byBwcm92aWRlIGEgcmFuZHIxLjIgY29tcGF0aWJsZSBpbnRlcmZhY2UgZm9yIG1vZGVzZXR0aW5ncyBpbiB0aGUKKyAqIGtlcm5lbCwgdGhlIGludGVyZmFjZSBpcyBhbHNvIG1lbnQgdG8gYmUgdXNlZCBieSBsaWJyYXJpZXMgbGlrZSBFR0wuCisgKgorICogTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gcmFuZHJwcm90by50eHQgd2hpY2ggY2FuIGJlIGZvdW5kIGhlcmU6CisgKiBodHRwOi8vZ2l0d2ViLmZyZWVkZXNrdG9wLm9yZy8/cD14b3JnL3Byb3RvL3JhbmRycHJvdG8uZ2l0CisgKgorICogVGhlcmUgYXJlIHNvbWUgbWFqb3IgZGlmZnJlbmNlcyB0byBiZSBub3RlZC4gVW5saWtlIHRoZSByYW5kcjEuMiBwcm90byB5b3UKKyAqIG5lZWQgdG8gY3JlYXRlIHRoZSBtZW1vcnkgb2JqZWN0IG9mIHRoZSBmcmFtZWJ1ZmZlciB5b3Vyc2VsZiB3aXRoIHRoZSB0dG0KKyAqIGJ1ZmZlciBvYmplY3QgaW50ZXJmYWNlLiBUaGlzIG9iamVjdCBuZWVkcyB0byBiZSBwaW5uZWQuCisgKi8KKworLyoKKyAqIElmIHdlIHBpY2t1cCBhbiBvbGQgdmVyc2lvbiBvZiBkcm0uaCB3aGljaCBkb2Vzbid0IGluY2x1ZGUgZHJtX21vZGUuaAorICogd2Ugc2hvdWxkIHJlZGVmaW5lIGRlZmluZXMuIFRoaXMgaXMgc28gdGhhdCBidWlsZHMgZG9lc24ndCBicmVha3Mgd2l0aAorICogbmV3IGxpYmRybSBvbiBvbGQga2VybmVscy4KKyAqLworI2lmbmRlZiBfRFJNX01PREVfSAorCisjZGVmaW5lIERSTV9ESVNQTEFZX0lORk9fTEVOICAgIDMyCisjZGVmaW5lIERSTV9DT05ORUNUT1JfTkFNRV9MRU4gIDMyCisjZGVmaW5lIERSTV9ESVNQTEFZX01PREVfTEVOICAgIDMyCisjZGVmaW5lIERSTV9QUk9QX05BTUVfTEVOICAgICAgIDMyCisKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9CVUlMVElOICAgKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQ0xPQ0tfQyAgICgoMTw8MSkgfCBEUk1fTU9ERV9UWVBFX0JVSUxUSU4pCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQ1JUQ19DICAgICgoMTw8MikgfCBEUk1fTU9ERV9UWVBFX0JVSUxUSU4pCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEICgxPDwzKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX0RFRkFVTFQgICAoMTw8NCkKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9VU0VSREVGICAgKDE8PDUpCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfRFJJVkVSICAgICgxPDw2KQorCisvKiBWaWRlbyBtb2RlIGZsYWdzICovCisvKiBiaXQgY29tcGF0aWJsZSB3aXRoIHRoZSB4b3JnIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BIU1lOQwkJCSgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05IU1lOQwkJCSgxPDwxKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BWU1lOQwkJCSgxPDwyKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05WU1lOQwkJCSgxPDwzKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRQkJCSgxPDw0KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0RCTFNDQU4JCQkoMTw8NSkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19DU1lOQwkJCSgxPDw2KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BDU1lOQwkJCSgxPDw3KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05DU1lOQwkJCSgxPDw4KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0hTS0VXCQkJKDE8PDkpIC8qIGhza2V3IHByb3ZpZGVkICovCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfQkNBU1QJCQkoMTw8MTApCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUElYTVVYCQkJKDE8PDExKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0RCTENMSwkJCSgxPDwxMikKKyNkZWZpbmUgRFJNX01PREVfRkxBR19DTEtESVYyCQkJKDE8PDEzKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHXzNEX01BU0sJCQkoMHgxZjw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX05PTkUJCQkoMDw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0ZSQU1FX1BBQ0tJTkcJCSgxPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfRklFTERfQUxURVJOQVRJVkUJKDI8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9MSU5FX0FMVEVSTkFUSVZFCSgzPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfU0lERV9CWV9TSURFX0ZVTEwJKDQ8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9MX0RFUFRICQkoNTw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0xfREVQVEhfR0ZYX0dGWF9ERVBUSAkoNjw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX1RPUF9BTkRfQk9UVE9NCSg3PDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfU0lERV9CWV9TSURFX0hBTEYJKDg8PDE0KQorCisvKiBEUE1TIGZsYWdzICovCisvKiBiaXQgY29tcGF0aWJsZSB3aXRoIHRoZSB4b3JnIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBEUk1fTU9ERV9EUE1TX09OICAgICAgICAwCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfU1RBTkRCWSAgIDEKKyNkZWZpbmUgRFJNX01PREVfRFBNU19TVVNQRU5EICAgMgorI2RlZmluZSBEUk1fTU9ERV9EUE1TX09GRiAgICAgICAzCisKKy8qIFNjYWxpbmcgbW9kZSBvcHRpb25zICovCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX05PTl9HUFUgICAgICAgICAgMAorI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9GVUxMU0NSRUVOICAgICAgIDEKKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfTk9fU0NBTEUgICAgICAgICAyCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX0FTUEVDVCAgICAgICAgICAgMworCisvKiBEaXRoZXJpbmcgbW9kZSBvcHRpb25zICovCisjZGVmaW5lIERSTV9NT0RFX0RJVEhFUklOR19PRkYgIDAKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX09OICAgMQorCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfTk9ORSAgIDAKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EQUMgICAgMQorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1RNRFMgICAyCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfTFZEUyAgIDMKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UVkRBQyAgNAorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1ZJUlRVQUwgNQorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0RTSQk2CisKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0F1dG9tYXRpYyAwCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Vbmtub3duICAgMAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfRFZJRCAgICAgIDMKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUEgICAgICA0CisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb3NpdGUgNQorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfU1ZJREVPICAgIDYKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvbmVudCA4CisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TQ0FSVCAgICAgOQorCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duICAgICAgMAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBICAgICAgICAgIDEKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0RWSUkgICAgICAgICAyCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEICAgICAgICAgMworI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQSAgICAgICAgIDQKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZSAgICA1CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8gICAgICAgNgorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyAgICAgICAgIDcKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudCAgICA4CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl85UGluRElOICAgICAgOQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQgIDEwCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQSAgICAgICAgMTEKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCICAgICAgICAxMgorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVFYJCTEzCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9lRFAJCTE0CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9WSVJUVUFMICAgICAgMTUKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0RTSSAgICAgICAgICAxNgorCisjZGVmaW5lIERSTV9NT0RFX1BST1BfUEVORElORyAgICgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9QUk9QX1JBTkdFICAgICAoMTw8MSkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9JTU1VVEFCTEUgKDE8PDIpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfRU5VTSAgICAgICgxPDwzKSAvKiBlbnVtZXJhdGVkIHR5cGUgd2l0aCB0ZXh0IHN0cmluZ3MgKi8KKyNkZWZpbmUgRFJNX01PREVfUFJPUF9CTE9CICAgICAgKDE8PDQpCisKKyNkZWZpbmUgRFJNX01PREVfQ1VSU09SX0JPICAgICAgKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX0NVUlNPUl9NT1ZFICAgICgxPDwxKQorCisjZW5kaWYgLyogX0RSTV9NT0RFX0ggKi8KKworCisvKgorICogRmVhdHVyZSBkZWZpbmVzCisgKgorICogSnVzdCBiZWNhdXNlIHRoZXNlIGFyZSBkZWZpbmVkIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBrZXJuZWwKKyAqIGNhbiBkbyB0aGF0IGZlYXR1cmUsIGl0cyBqdXN0IGZvciBuZXcgY29kZSB2cyBvbGQgbGliZHJtLgorICovCisjZGVmaW5lIERSTV9NT0RFX0ZFQVRVUkVfS01TCQkxCisjZGVmaW5lIERSTV9NT0RFX0ZFQVRVUkVfRElSVFlGQgkxCisKKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVSZXMgeworCisJaW50IGNvdW50X2ZiczsKKwl1aW50MzJfdCAqZmJzOworCisJaW50IGNvdW50X2NydGNzOworCXVpbnQzMl90ICpjcnRjczsKKworCWludCBjb3VudF9jb25uZWN0b3JzOworCXVpbnQzMl90ICpjb25uZWN0b3JzOworCisJaW50IGNvdW50X2VuY29kZXJzOworCXVpbnQzMl90ICplbmNvZGVyczsKKworCXVpbnQzMl90IG1pbl93aWR0aCwgbWF4X3dpZHRoOworCXVpbnQzMl90IG1pbl9oZWlnaHQsIG1heF9oZWlnaHQ7Cit9IGRybU1vZGVSZXMsICpkcm1Nb2RlUmVzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZU1vZGVJbmZvIHsKKwl1aW50MzJfdCBjbG9jazsKKwl1aW50MTZfdCBoZGlzcGxheSwgaHN5bmNfc3RhcnQsIGhzeW5jX2VuZCwgaHRvdGFsLCBoc2tldzsKKwl1aW50MTZfdCB2ZGlzcGxheSwgdnN5bmNfc3RhcnQsIHZzeW5jX2VuZCwgdnRvdGFsLCB2c2NhbjsKKworCXVpbnQzMl90IHZyZWZyZXNoOworCisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgdHlwZTsKKwljaGFyIG5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU5dOworfSBkcm1Nb2RlTW9kZUluZm8sICpkcm1Nb2RlTW9kZUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1Nb2RlRkIgeworCXVpbnQzMl90IGZiX2lkOworCXVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisJdWludDMyX3QgcGl0Y2g7CisJdWludDMyX3QgYnBwOworCXVpbnQzMl90IGRlcHRoOworCS8qIGRyaXZlciBzcGVjaWZpYyBoYW5kbGUgKi8KKwl1aW50MzJfdCBoYW5kbGU7Cit9IGRybU1vZGVGQiwgKmRybU1vZGVGQlB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBkcm1Nb2RlQ2xpcCwgKmRybU1vZGVDbGlwUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZVByb3BlcnR5QmxvYiB7CisJdWludDMyX3QgaWQ7CisJdWludDMyX3QgbGVuZ3RoOworCXZvaWQgKmRhdGE7Cit9IGRybU1vZGVQcm9wZXJ0eUJsb2JSZXMsICpkcm1Nb2RlUHJvcGVydHlCbG9iUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZVByb3BlcnR5IHsKKwl1aW50MzJfdCBwcm9wX2lkOworCXVpbnQzMl90IGZsYWdzOworCWNoYXIgbmFtZVtEUk1fUFJPUF9OQU1FX0xFTl07CisJaW50IGNvdW50X3ZhbHVlczsKKwl1aW50NjRfdCAqdmFsdWVzOyAvKiBzdG9yZSB0aGUgYmxvYiBsZW5ndGhzICovCisJaW50IGNvdW50X2VudW1zOworCXN0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtICplbnVtczsKKwlpbnQgY291bnRfYmxvYnM7CisJdWludDMyX3QgKmJsb2JfaWRzOyAvKiBzdG9yZSB0aGUgYmxvYiBJRHMgKi8KK30gZHJtTW9kZVByb3BlcnR5UmVzLCAqZHJtTW9kZVByb3BlcnR5UHRyOworCitzdGF0aWMgX19pbmxpbmUgaW50IGRybV9wcm9wZXJ0eV90eXBlX2lzKGRybU1vZGVQcm9wZXJ0eVB0ciBwcm9wZXJ0eSwKKwkJdWludDMyX3QgdHlwZSkKK3sKKwkvKiBpbnN0YW5jZW9mIGZvciBwcm9wcy4uIGhhbmRsZXMgZXh0ZW5kZWQgdHlwZSB2cyBvcmlnaW5hbCB0eXBlczogKi8KKwlpZiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9FWFRFTkRFRF9UWVBFKQorCQlyZXR1cm4gKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfRVhURU5ERURfVFlQRSkgPT0gdHlwZTsKKwlyZXR1cm4gcHJvcGVydHktPmZsYWdzICYgdHlwZTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVDcnRjIHsKKwl1aW50MzJfdCBjcnRjX2lkOworCXVpbnQzMl90IGJ1ZmZlcl9pZDsgLyoqPCBGQiBpZCB0byBjb25uZWN0IHRvIDAgPSBkaXNjb25uZWN0ICovCisKKwl1aW50MzJfdCB4LCB5OyAvKio8IFBvc2l0aW9uIG9uIHRoZSBmcmFtZWJ1ZmZlciAqLworCXVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisJaW50IG1vZGVfdmFsaWQ7CisJZHJtTW9kZU1vZGVJbmZvIG1vZGU7CisKKwlpbnQgZ2FtbWFfc2l6ZTsgLyoqPCBOdW1iZXIgb2YgZ2FtbWEgc3RvcHMgKi8KKworfSBkcm1Nb2RlQ3J0YywgKmRybU1vZGVDcnRjUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZUVuY29kZXIgeworCXVpbnQzMl90IGVuY29kZXJfaWQ7CisJdWludDMyX3QgZW5jb2Rlcl90eXBlOworCXVpbnQzMl90IGNydGNfaWQ7CisJdWludDMyX3QgcG9zc2libGVfY3J0Y3M7CisJdWludDMyX3QgcG9zc2libGVfY2xvbmVzOworfSBkcm1Nb2RlRW5jb2RlciwgKmRybU1vZGVFbmNvZGVyUHRyOworCit0eXBlZGVmIGVudW0geworCURSTV9NT0RFX0NPTk5FQ1RFRCAgICAgICAgID0gMSwKKwlEUk1fTU9ERV9ESVNDT05ORUNURUQgICAgICA9IDIsCisJRFJNX01PREVfVU5LTk9XTkNPTk5FQ1RJT04gPSAzCit9IGRybU1vZGVDb25uZWN0aW9uOworCit0eXBlZGVmIGVudW0geworCURSTV9NT0RFX1NVQlBJWEVMX1VOS05PV04gICAgICAgID0gMSwKKwlEUk1fTU9ERV9TVUJQSVhFTF9IT1JJWk9OVEFMX1JHQiA9IDIsCisJRFJNX01PREVfU1VCUElYRUxfSE9SSVpPTlRBTF9CR1IgPSAzLAorCURSTV9NT0RFX1NVQlBJWEVMX1ZFUlRJQ0FMX1JHQiAgID0gNCwKKwlEUk1fTU9ERV9TVUJQSVhFTF9WRVJUSUNBTF9CR1IgICA9IDUsCisJRFJNX01PREVfU1VCUElYRUxfTk9ORSAgICAgICAgICAgPSA2Cit9IGRybU1vZGVTdWJQaXhlbDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVDb25uZWN0b3IgeworCXVpbnQzMl90IGNvbm5lY3Rvcl9pZDsKKwl1aW50MzJfdCBlbmNvZGVyX2lkOyAvKio8IEVuY29kZXIgY3VycmVudGx5IGNvbm5lY3RlZCB0byAqLworCXVpbnQzMl90IGNvbm5lY3Rvcl90eXBlOworCXVpbnQzMl90IGNvbm5lY3Rvcl90eXBlX2lkOworCWRybU1vZGVDb25uZWN0aW9uIGNvbm5lY3Rpb247CisJdWludDMyX3QgbW1XaWR0aCwgbW1IZWlnaHQ7IC8qKjwgSHhXIGluIG1pbGxpbWV0ZXJzICovCisJZHJtTW9kZVN1YlBpeGVsIHN1YnBpeGVsOworCisJaW50IGNvdW50X21vZGVzOworCWRybU1vZGVNb2RlSW5mb1B0ciBtb2RlczsKKworCWludCBjb3VudF9wcm9wczsKKwl1aW50MzJfdCAqcHJvcHM7IC8qKjwgTGlzdCBvZiBwcm9wZXJ0eSBpZHMgKi8KKwl1aW50NjRfdCAqcHJvcF92YWx1ZXM7IC8qKjwgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgKi8KKworCWludCBjb3VudF9lbmNvZGVyczsKKwl1aW50MzJfdCAqZW5jb2RlcnM7IC8qKjwgTGlzdCBvZiBlbmNvZGVyIGlkcyAqLworfSBkcm1Nb2RlQ29ubmVjdG9yLCAqZHJtTW9kZUNvbm5lY3RvclB0cjsKKworI2RlZmluZSBEUk1fUExBTkVfVFlQRV9PVkVSTEFZIDAKKyNkZWZpbmUgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSAxCisjZGVmaW5lIERSTV9QTEFORV9UWVBFX0NVUlNPUiAgMgorCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZU9iamVjdFByb3BlcnRpZXMgeworCXVpbnQzMl90IGNvdW50X3Byb3BzOworCXVpbnQzMl90ICpwcm9wczsKKwl1aW50NjRfdCAqcHJvcF92YWx1ZXM7Cit9IGRybU1vZGVPYmplY3RQcm9wZXJ0aWVzLCAqZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1Nb2RlUGxhbmUgeworCXVpbnQzMl90IGNvdW50X2Zvcm1hdHM7CisJdWludDMyX3QgKmZvcm1hdHM7CisJdWludDMyX3QgcGxhbmVfaWQ7CisKKwl1aW50MzJfdCBjcnRjX2lkOworCXVpbnQzMl90IGZiX2lkOworCisJdWludDMyX3QgY3J0Y194LCBjcnRjX3k7CisJdWludDMyX3QgeCwgeTsKKworCXVpbnQzMl90IHBvc3NpYmxlX2NydGNzOworCXVpbnQzMl90IGdhbW1hX3NpemU7Cit9IGRybU1vZGVQbGFuZSwgKmRybU1vZGVQbGFuZVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVQbGFuZVJlcyB7CisJdWludDMyX3QgY291bnRfcGxhbmVzOworCXVpbnQzMl90ICpwbGFuZXM7Cit9IGRybU1vZGVQbGFuZVJlcywgKmRybU1vZGVQbGFuZVJlc1B0cjsKKworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVNb2RlSW5mbyggZHJtTW9kZU1vZGVJbmZvUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVSZXNvdXJjZXMoIGRybU1vZGVSZXNQdHIgcHRyICk7CitleHRlcm4gdm9pZCBkcm1Nb2RlRnJlZUZCKCBkcm1Nb2RlRkJQdHIgcHRyICk7CitleHRlcm4gdm9pZCBkcm1Nb2RlRnJlZUNydGMoIGRybU1vZGVDcnRjUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVDb25uZWN0b3IoIGRybU1vZGVDb25uZWN0b3JQdHIgcHRyICk7CitleHRlcm4gdm9pZCBkcm1Nb2RlRnJlZUVuY29kZXIoIGRybU1vZGVFbmNvZGVyUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVQbGFuZSggZHJtTW9kZVBsYW5lUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVQbGFuZVJlc291cmNlcyhkcm1Nb2RlUGxhbmVSZXNQdHIgcHRyKTsKKworLyoqCisgKiBSZXRyaXZlcyBhbGwgb2YgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBjYXJkLgorICovCitleHRlcm4gZHJtTW9kZVJlc1B0ciBkcm1Nb2RlR2V0UmVzb3VyY2VzKGludCBmZCk7CisKKy8qCisgKiBGcmFtZUJ1ZmZlciBtYW5pcHVsYXRpb24uCisgKi8KKworLyoqCisgKiBSZXRyaXZlIGluZm9ybWF0aW9uIGFib3V0IGZyYW1lYnVmZmVyIGJ1ZmZlcklkCisgKi8KK2V4dGVybiBkcm1Nb2RlRkJQdHIgZHJtTW9kZUdldEZCKGludCBmZCwgdWludDMyX3QgYnVmZmVySWQpOworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZnJhbWVidWZmZXIgd2l0aCBhbiBidWZmZXIgb2JqZWN0IGFzIGl0cyBzY2Fub3V0IGJ1ZmZlci4KKyAqLworZXh0ZXJuIGludCBkcm1Nb2RlQWRkRkIoaW50IGZkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50OF90IGRlcHRoLAorCQkJdWludDhfdCBicHAsIHVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBib19oYW5kbGUsCisJCQl1aW50MzJfdCAqYnVmX2lkKTsKKy8qIC4uLndpdGggYSBzcGVjaWZpYyBwaXhlbCBmb3JtYXQgKi8KK2V4dGVybiBpbnQgZHJtTW9kZUFkZEZCMihpbnQgZmQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisJCQkgdWludDMyX3QgcGl4ZWxfZm9ybWF0LCB1aW50MzJfdCBib19oYW5kbGVzWzRdLAorCQkJIHVpbnQzMl90IHBpdGNoZXNbNF0sIHVpbnQzMl90IG9mZnNldHNbNF0sCisJCQkgdWludDMyX3QgKmJ1Zl9pZCwgdWludDMyX3QgZmxhZ3MpOworLyoqCisgKiBEZXN0cm9pZXMgdGhlIGdpdmVuIGZyYW1lYnVmZmVyLgorICovCitleHRlcm4gaW50IGRybU1vZGVSbUZCKGludCBmZCwgdWludDMyX3QgYnVmZmVySWQpOworCisvKioKKyAqIE1hcmsgYSByZWdpb24gb2YgYSBmcmFtZWJ1ZmZlciBhcyBkaXJ0eS4KKyAqLworZXh0ZXJuIGludCBkcm1Nb2RlRGlydHlGQihpbnQgZmQsIHVpbnQzMl90IGJ1ZmZlcklkLAorCQkJICBkcm1Nb2RlQ2xpcFB0ciBjbGlwcywgdWludDMyX3QgbnVtX2NsaXBzKTsKKworCisvKgorICogQ3J0YyBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIFJldHJpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN0cnQgY3J0Y0lkCisgKi8KK2V4dGVybiBkcm1Nb2RlQ3J0Y1B0ciBkcm1Nb2RlR2V0Q3J0YyhpbnQgZmQsIHVpbnQzMl90IGNydGNJZCk7CisKKy8qKgorICogU2V0IHRoZSBtb2RlIG9uIGEgY3J0YyBjcnRjSWQgd2l0aCB0aGUgZ2l2ZW4gbW9kZSBtb2RlSWQuCisgKi8KK2ludCBkcm1Nb2RlU2V0Q3J0YyhpbnQgZmQsIHVpbnQzMl90IGNydGNJZCwgdWludDMyX3QgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgKmNvbm5lY3RvcnMsIGludCBjb3VudCwKKwkJICAgZHJtTW9kZU1vZGVJbmZvUHRyIG1vZGUpOworCisvKgorICogQ3Vyc29yIGZ1bmN0aW9ucworICovCisKKy8qKgorICogU2V0IHRoZSBjdXJzb3Igb24gY3J0YworICovCitpbnQgZHJtTW9kZVNldEN1cnNvcihpbnQgZmQsIHVpbnQzMl90IGNydGNJZCwgdWludDMyX3QgYm9faGFuZGxlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKworaW50IGRybU1vZGVTZXRDdXJzb3IyKGludCBmZCwgdWludDMyX3QgY3J0Y0lkLCB1aW50MzJfdCBib19oYW5kbGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludDMyX3QgaG90X3gsIGludDMyX3QgaG90X3kpOworLyoqCisgKiBNb3ZlIHRoZSBjdXJzb3Igb24gY3J0YworICovCitpbnQgZHJtTW9kZU1vdmVDdXJzb3IoaW50IGZkLCB1aW50MzJfdCBjcnRjSWQsIGludCB4LCBpbnQgeSk7CisKKy8qKgorICogRW5jb2RlciBmdW5jdGlvbnMKKyAqLworZHJtTW9kZUVuY29kZXJQdHIgZHJtTW9kZUdldEVuY29kZXIoaW50IGZkLCB1aW50MzJfdCBlbmNvZGVyX2lkKTsKKworLyoKKyAqIENvbm5lY3RvciBtYW5pcHVsYXRpb24KKyAqLworCisvKioKKyAqIFJldHJpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3RvciBjb25uZWN0b3JJZC4KKyAqLworZXh0ZXJuIGRybU1vZGVDb25uZWN0b3JQdHIgZHJtTW9kZUdldENvbm5lY3RvcihpbnQgZmQsCisJCXVpbnQzMl90IGNvbm5lY3RvcklkKTsKKworLyoqCisgKiBBdHRhY2hlcyB0aGUgZ2l2ZW4gbW9kZSB0byBhbiBjb25uZWN0b3IuCisgKi8KK2V4dGVybiBpbnQgZHJtTW9kZUF0dGFjaE1vZGUoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JJZCwgZHJtTW9kZU1vZGVJbmZvUHRyIG1vZGVfaW5mbyk7CisKKy8qKgorICogRGV0YWNoZXMgYSBtb2RlIGZyb20gdGhlIGNvbm5lY3RvcgorICogbXVzdCBiZSB1bnVzZWQsIGJ5IHRoZSBnaXZlbiBtb2RlLgorICovCitleHRlcm4gaW50IGRybU1vZGVEZXRhY2hNb2RlKGludCBmZCwgdWludDMyX3QgY29ubmVjdG9ySWQsIGRybU1vZGVNb2RlSW5mb1B0ciBtb2RlX2luZm8pOworCitleHRlcm4gZHJtTW9kZVByb3BlcnR5UHRyIGRybU1vZGVHZXRQcm9wZXJ0eShpbnQgZmQsIHVpbnQzMl90IHByb3BlcnR5SWQpOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVQcm9wZXJ0eShkcm1Nb2RlUHJvcGVydHlQdHIgcHRyKTsKKworZXh0ZXJuIGRybU1vZGVQcm9wZXJ0eUJsb2JQdHIgZHJtTW9kZUdldFByb3BlcnR5QmxvYihpbnQgZmQsIHVpbnQzMl90IGJsb2JfaWQpOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVQcm9wZXJ0eUJsb2IoZHJtTW9kZVByb3BlcnR5QmxvYlB0ciBwdHIpOworZXh0ZXJuIGludCBkcm1Nb2RlQ29ubmVjdG9yU2V0UHJvcGVydHkoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JfaWQsIHVpbnQzMl90IHByb3BlcnR5X2lkLAorCQkJCSAgICB1aW50NjRfdCB2YWx1ZSk7CitleHRlcm4gaW50IGRybUNoZWNrTW9kZXNldHRpbmdTdXBwb3J0ZWQoY29uc3QgY2hhciAqYnVzaWQpOworCitleHRlcm4gaW50IGRybU1vZGVDcnRjU2V0R2FtbWEoaW50IGZkLCB1aW50MzJfdCBjcnRjX2lkLCB1aW50MzJfdCBzaXplLAorCQkJICAgICAgIHVpbnQxNl90ICpyZWQsIHVpbnQxNl90ICpncmVlbiwgdWludDE2X3QgKmJsdWUpOworZXh0ZXJuIGludCBkcm1Nb2RlQ3J0Y0dldEdhbW1hKGludCBmZCwgdWludDMyX3QgY3J0Y19pZCwgdWludDMyX3Qgc2l6ZSwKKwkJCSAgICAgICB1aW50MTZfdCAqcmVkLCB1aW50MTZfdCAqZ3JlZW4sIHVpbnQxNl90ICpibHVlKTsKK2V4dGVybiBpbnQgZHJtTW9kZVBhZ2VGbGlwKGludCBmZCwgdWludDMyX3QgY3J0Y19pZCwgdWludDMyX3QgZmJfaWQsCisJCQkgICB1aW50MzJfdCBmbGFncywgdm9pZCAqdXNlcl9kYXRhKTsKKworZXh0ZXJuIGRybU1vZGVQbGFuZVJlc1B0ciBkcm1Nb2RlR2V0UGxhbmVSZXNvdXJjZXMoaW50IGZkKTsKK2V4dGVybiBkcm1Nb2RlUGxhbmVQdHIgZHJtTW9kZUdldFBsYW5lKGludCBmZCwgdWludDMyX3QgcGxhbmVfaWQpOworZXh0ZXJuIGludCBkcm1Nb2RlU2V0UGxhbmUoaW50IGZkLCB1aW50MzJfdCBwbGFuZV9pZCwgdWludDMyX3QgY3J0Y19pZCwKKwkJCSAgIHVpbnQzMl90IGZiX2lkLCB1aW50MzJfdCBmbGFncywKKwkJCSAgIGludDMyX3QgY3J0Y194LCBpbnQzMl90IGNydGNfeSwKKwkJCSAgIHVpbnQzMl90IGNydGNfdywgdWludDMyX3QgY3J0Y19oLAorCQkJICAgdWludDMyX3Qgc3JjX3gsIHVpbnQzMl90IHNyY195LAorCQkJICAgdWludDMyX3Qgc3JjX3csIHVpbnQzMl90IHNyY19oKTsKKworZXh0ZXJuIGRybU1vZGVPYmplY3RQcm9wZXJ0aWVzUHRyIGRybU1vZGVPYmplY3RHZXRQcm9wZXJ0aWVzKGludCBmZCwKKwkJCQkJCQl1aW50MzJfdCBvYmplY3RfaWQsCisJCQkJCQkJdWludDMyX3Qgb2JqZWN0X3R5cGUpOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVPYmplY3RQcm9wZXJ0aWVzKGRybU1vZGVPYmplY3RQcm9wZXJ0aWVzUHRyIHB0cik7CitleHRlcm4gaW50IGRybU1vZGVPYmplY3RTZXRQcm9wZXJ0eShpbnQgZmQsIHVpbnQzMl90IG9iamVjdF9pZCwKKwkJCQkgICAgdWludDMyX3Qgb2JqZWN0X3R5cGUsIHVpbnQzMl90IHByb3BlcnR5X2lkLAorCQkJCSAgICB1aW50NjRfdCB2YWx1ZSk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtUmFuZG9tLmMgYi9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtUmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmMDMwMQotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9rbWQvbGliZHJtL3hmODZkcm1SYW5kb20uYwpAQCAtMCwwICsxLDEzNyBAQAorLyogeGY4NmRybVJhbmRvbS5jIC0tICJNaW5pbWFsIFN0YW5kYXJkIiBQUk5HIEltcGxlbWVudGF0aW9uCisgKiBDcmVhdGVkOiBNb24gQXByIDE5IDA4OjI4OjEzIDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKiBBdXRob3JzOiBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNpbXBsZSwgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJrCisgKiAmIE1pbGxlciAiTWluaW1hbCBTdGFuZGFyZCIgUFJORyBbUE04OCwgUE1TOTNdLCB3aGljaCBpcyBhIExlaG1lcgorICogbXVsdGlwbGljYXRpdmUgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgKE1MQ0cpIHdpdGggYSBwZXJpb2Qgb2YKKyAqIDJeMzEtMS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSByZWxpYWJsZSwgcG9ydGFibGUgUFJORworICogdGhhdCBpcyBzdWl0YWJsZSBmb3IgdGVzdGluZyBhIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gYW5kIGZvcgorICogaW1wbGVtZW50aW5nIHNraXAgbGlzdHMuCisgKgorICogRlVUVVJFIEVOSEFOQ0VNRU5UUworICoKKyAqIElmIGluaXRpYWwgc2VlZHMgYXJlIG5vdCBzZWxlY3RlZCByYW5kb21seSwgdHdvIGluc3RhbmNlcyBvZiB0aGUgUFJORworICogY2FuIGJlIGNvcnJlbGF0ZWQuICBbS251dGg4MSwgcHAuIDMyLTMzXSBkZXNjcmliZXMgYSBzaHVmZmxpbmcgdGVjaG5pcXVlCisgKiB0aGF0IGNhbiBlbGltaW5hdGUgdGhpcyBwcm9ibGVtLgorICoKKyAqIElmIFBSTkdzIGFyZSB1c2VkIGZvciBzaW11bGF0aW9uLCB0aGUgcGVyaW9kIG9mIHRoZSBjdXJyZW50CisgKiBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgdG9vIHNob3J0LiAgW0xFODhdIGRpc2N1c3NlcyBtZXRob2RzIG9mIGNvbWJpbmluZworICogTUxDR3MgdG8gcHJvZHVjZSBtdWNoIGxvbmdlciBwZXJpb2RzLCBhbmQgc3VnZ2VzdHMgc29tZSBhbHRlcm5hdGl2ZQorICogdmFsdWVzIGZvciBBIGFuZCBNLiAgW0xFOTAgYW5kIFNjaDkyXSBhbHNvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24KKyAqIGxvbmctcGVyaW9kIFBSTkdzLgorICoKKyAqIFJFRkVSRU5DRVMKKyAqCisgKiBbS251dGg4MV0gRG9uYWxkIEUuIEtudXRoLiBUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nLiAgVm9sdW1lIDI6CisgKiBTZW1pbnVtZXJpY2FsIEFsZ29yaXRobXMuICBSZWFkaW5nLCBNYXNzYWNodXNldHRzOiBBZGRpc29uLVdlc2xleSwgMTk4MS4KKyAqCisgKiBbTEU4OF0gUGllcnJlIEwnRWN1eWVyLiAiRWZmaWNpZW50IGFuZCBQb3J0YWJsZSBDb21iaW5lZCBSYW5kb20gTnVtYmVyCisgKiBHZW5lcmF0b3JzIi4gIENBQ00gMzEoNiksIEp1bmUgMTk4OCwgcHAuIDc0Mi03NzQuCisgKgorICogW0xFOTBdIFBpZXJyZSBMJ0VjdXllci4gIlJhbmRvbSBOdW1iZXJzIGZvciBTaW11bGF0aW9uIi4gQ0FDTSAzMygxMCwKKyAqIE9jdG9iZXIgMTk5MCwgcHAuIDg1LTk3LgorICoKKyAqIFtQTTg4XSBTdGVwaGVuIEsuIFBhcmsgYW5kIEtlaXRoIFcuIE1pbGxlci4gIlJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yczoKKyAqIEdvb2QgT25lcyBhcmUgSGFyZCB0byBGaW5kIi4gQ0FDTSAzMSgxMCksIE9jdG9iZXIgMTk4OCwgcHAuIDExOTItMTIwMS4KKyAqCisgKiBbU2NoOTJdIEJydWNlIFNjaG5laWVyLiAiUHNldWRvLVJhbnNvbSBTZXF1ZW5jZSBHZW5lcmF0b3IgZm9yIDMyLUJpdAorICogQ1BVcyIuICBEci4gRG9iYidzIEpvdXJuYWwgMTcoMiksIEZlYnJ1YXJ5IDE5OTIsIHBwLiAzNCwgMzctMzgsIDQwLgorICoKKyAqIFtQTVM5M10gU3RlcGhlbiBLLiBQYXJrLCBLZWl0aCBXLiBNaWxsZXIsIGFuZCBQYXVsIEsuIFN0b2NrbWV5ZXIuICBJbgorICogIlRlY2huaWNhbCBDb3JyZXNwb25kZW5jZTogUmVtYXJrcyBvbiBDaG9vc2luZyBhbmQgSW1wbGVtZW50aW5nIFJhbmRvbQorICogTnVtYmVyIEdlbmVyYXRvcnMiLiBDQUNNIDM2KDcpLCBKdWx5IDE5OTMsIHBwLiAxMDUtMTEwLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtUmFuZG9tLmgiCisKKyNkZWZpbmUgUkFORE9NX01BR0lDIDB4ZmVlZGJlZWYKKwordm9pZCAqZHJtUmFuZG9tQ3JlYXRlKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKyAgICBSYW5kb21TdGF0ZSAgKnN0YXRlOworCisgICAgc3RhdGUgICAgICAgICAgID0gZHJtTWFsbG9jKHNpemVvZigqc3RhdGUpKTsKKyAgICBpZiAoIXN0YXRlKSByZXR1cm4gTlVMTDsKKyAgICBzdGF0ZS0+bWFnaWMgICAgPSBSQU5ET01fTUFHSUM7CisjaWYgMAorCQkJCS8qIFBhcmsgJiBNaWxsZXIsIE9jdG9iZXIgMTk4OCAqLworICAgIHN0YXRlLT5hICAgICAgICA9IDE2ODA3OworICAgIHN0YXRlLT5tICAgICAgICA9IDIxNDc0ODM2NDc7CisgICAgc3RhdGUtPmNoZWNrICAgID0gMTA0MzYxODA2NTsgLyogQWZ0ZXIgMTAwMDAgaXRlcmF0aW9ucyAqLworI2Vsc2UKKwkJCQkvKiBQYXJrLCBNaWxsZXIsIGFuZCBTdG9ja21leWVyLCBKdWx5IDE5OTMgKi8KKyAgICBzdGF0ZS0+YSAgICAgICAgPSA0ODI3MTsKKyAgICBzdGF0ZS0+bSAgICAgICAgPSAyMTQ3NDgzNjQ3OworICAgIHN0YXRlLT5jaGVjayAgICA9IDM5OTI2ODUzNzsgLyogQWZ0ZXIgMTAwMDAgaXRlcmF0aW9ucyAqLworI2VuZGlmCisgICAgc3RhdGUtPnEgICAgICAgID0gc3RhdGUtPm0gLyBzdGF0ZS0+YTsKKyAgICBzdGF0ZS0+ciAgICAgICAgPSBzdGF0ZS0+bSAlIHN0YXRlLT5hOworCisgICAgc3RhdGUtPnNlZWQgICAgID0gc2VlZDsKKwkJCQkvKiBDaGVjayBmb3IgaWxsZWdhbCBib3VuZGFyeSBjb25kaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY2hvb3NlIGNsb3Nlc3QgbGVnYWwgdmFsdWUuICovCisgICAgaWYgKHN0YXRlLT5zZWVkIDw9IDApICAgICAgICBzdGF0ZS0+c2VlZCA9IDE7CisgICAgaWYgKHN0YXRlLT5zZWVkID49IHN0YXRlLT5tKSBzdGF0ZS0+c2VlZCA9IHN0YXRlLT5tIC0gMTsKKworICAgIHJldHVybiBzdGF0ZTsKK30KKworaW50IGRybVJhbmRvbURlc3Ryb3kodm9pZCAqc3RhdGUpCit7CisgICAgZHJtRnJlZShzdGF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZHJtUmFuZG9tKHZvaWQgKnN0YXRlKQoreworICAgIFJhbmRvbVN0YXRlICAgKnMgPSAoUmFuZG9tU3RhdGUgKilzdGF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIGhpOworICAgIHVuc2lnbmVkIGxvbmcgbG87CisKKyAgICBoaSAgICAgID0gcy0+c2VlZCAvIHMtPnE7CisgICAgbG8gICAgICA9IHMtPnNlZWQgJSBzLT5xOworICAgIHMtPnNlZWQgPSBzLT5hICogbG8gLSBzLT5yICogaGk7CisgICAgaWYgKChzLT5hICogbG8pIDw9IChzLT5yICogaGkpKSBzLT5zZWVkICs9IHMtPm07CisKKyAgICByZXR1cm4gcy0+c2VlZDsKK30KKworZG91YmxlIGRybVJhbmRvbURvdWJsZSh2b2lkICpzdGF0ZSkKK3sKKyAgICBSYW5kb21TdGF0ZSAqcyA9IChSYW5kb21TdGF0ZSAqKXN0YXRlOworICAgIAorICAgIHJldHVybiAoZG91YmxlKWRybVJhbmRvbShzdGF0ZSkvKGRvdWJsZSlzLT5tOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybVJhbmRvbS5oIGIvaWNkL2ludGVsL2ttZC9saWJkcm0veGY4NmRybVJhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjczMGMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL2xpYmRybS94Zjg2ZHJtUmFuZG9tLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICovCisKK3R5cGVkZWYgc3RydWN0IFJhbmRvbVN0YXRlIHsKKyAgICB1bnNpZ25lZCBsb25nIG1hZ2ljOworICAgIHVuc2lnbmVkIGxvbmcgYTsKKyAgICB1bnNpZ25lZCBsb25nIG07CisgICAgdW5zaWduZWQgbG9uZyBxOwkJLyogbSBkaXYgYSAqLworICAgIHVuc2lnbmVkIGxvbmcgcjsJCS8qIG0gbW9kIGEgKi8KKyAgICB1bnNpZ25lZCBsb25nIGNoZWNrOworICAgIHVuc2lnbmVkIGxvbmcgc2VlZDsKK30gUmFuZG9tU3RhdGU7CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL3dpbnN5cy5oIGIvaWNkL2ludGVsL2ttZC93aW5zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOThiNTNkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2ttZC93aW5zeXMuaApAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICovCisKKyNpZm5kZWYgSU5URUxfV0lOU1lTX0gKKyNkZWZpbmUgSU5URUxfV0lOU1lTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLyogdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggaTkxNV9kcm0uaCdzIGRlZmluaXRpb25zICovCitlbnVtIGludGVsX3JpbmdfdHlwZSB7CisgICBJTlRFTF9SSU5HX1JFTkRFUiAgICA9IDEsCisgICBJTlRFTF9SSU5HX0JTRCAgICAgICA9IDIsCisgICBJTlRFTF9SSU5HX0JMVCAgICAgICA9IDMsCisgICBJTlRFTF9SSU5HX1ZFQk9YICAgICA9IDQsCit9OworCisvKiB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCBpOTE1X2RybS5oJ3MgZGVmaW5pdGlvbnMgKi8KK2VudW0gaW50ZWxfZXhlY19mbGFnIHsKKyAgIElOVEVMX0VYRUNfR0VON19TT0xfUkVTRVQgID0gMSA8PCA4LAorfTsKKworLyogdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggaTkxNV9kcm0uaCdzIGRlZmluaXRpb25zICovCitlbnVtIGludGVsX3JlbG9jX2ZsYWcgeworICAgSU5URUxfUkVMT0NfRkVOQ0UgICAgICAgICAgPSAxIDw8IDAsCisgICBJTlRFTF9SRUxPQ19HR1RUICAgICAgICAgICA9IDEgPDwgMSwKKyAgIElOVEVMX1JFTE9DX1dSSVRFICAgICAgICAgID0gMSA8PCAyLAorfTsKKworLyogdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggaTkxNV9kcm0uaCdzIGRlZmluaXRpb25zICovCitlbnVtIGludGVsX3RpbGluZ19tb2RlIHsKKyAgIElOVEVMX1RJTElOR19OT05FID0gMCwKKyAgIElOVEVMX1RJTElOR19YICAgID0gMSwKKyAgIElOVEVMX1RJTElOR19ZICAgID0gMiwKK307CisKK2VudW0gaW50ZWxfd2luc3lzX2hhbmRsZV90eXBlIHsKKyAgIElOVEVMX1dJTlNZU19IQU5ETEVfU0hBUkVELAorICAgSU5URUxfV0lOU1lTX0hBTkRMRV9LTVMsCisgICBJTlRFTF9XSU5TWVNfSEFORExFX0ZELAorfTsKKworc3RydWN0IGljZF9pbnN0YW5jZTsKK3N0cnVjdCBpbnRlbF93aW5zeXM7CitzdHJ1Y3QgaW50ZWxfYm87CisKK3N0cnVjdCBpbnRlbF93aW5zeXNfaW5mbyB7CisgICBpbnQgZGV2aWQ7CisKKyAgIC8qIHRoZSBzaXplcyBvZiB0aGUgYXBlcnR1cmUgaW4gYnl0ZXMgKi8KKyAgIHNpemVfdCBhcGVydHVyZV90b3RhbDsKKyAgIHNpemVfdCBhcGVydHVyZV9tYXBwYWJsZTsKKworICAgYm9vbCBoYXNfbGxjOworICAgYm9vbCBoYXNfYWRkcmVzc19zd2l6emxpbmc7CisgICBib29sIGhhc19sb2dpY2FsX2NvbnRleHQ7CisgICBib29sIGhhc19wcGd0dDsKKworICAgLyogdmFsaWQgcmVnaXN0ZXJzIGZvciBpbnRlbF93aW5zeXNfcmVhZF9yZWcoKSAqLworICAgYm9vbCBoYXNfdGltZXN0YW1wOworCisgICAvKiB2YWxpZCBmbGFncyBmb3IgaW50ZWxfd2luc3lzX3N1Ym1pdF9ibygpICovCisgICBib29sIGhhc19nZW43X3NvbF9yZXNldDsKK307CisKK3N0cnVjdCBpbnRlbF93aW5zeXNfaGFuZGxlIHsKKyAgICBlbnVtIGludGVsX3dpbnN5c19oYW5kbGVfdHlwZSB0eXBlOworICAgIHVuc2lnbmVkIGhhbmRsZTsKKyAgICB1bnNpZ25lZCBzdHJpZGU7Cit9OworCitzdHJ1Y3QgaW50ZWxfd2luc3lzICoKK2ludGVsX3dpbnN5c19jcmVhdGVfZm9yX2ZkKGNvbnN0IHN0cnVjdCBpY2RfaW5zdGFuY2UgKmluc3RhbmNlLCBpbnQgZmQpOworCit2b2lkCitpbnRlbF93aW5zeXNfZGVzdHJveShzdHJ1Y3QgaW50ZWxfd2luc3lzICp3aW5zeXMpOworCitjb25zdCBzdHJ1Y3QgaW50ZWxfd2luc3lzX2luZm8gKgoraW50ZWxfd2luc3lzX2dldF9pbmZvKGNvbnN0IHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cyk7CisKKy8qKgorICogUmVhZCBhIHJlZ2lzdGVyLiAgT25seSByZWdpc3RlcnMgdGhhdCBhcmUgY29uc2lkZXJlZCBzYWZlLCBzdWNoIGFzCisgKgorICogICBUSU1FU1RBTVAgKDB4MjM1OCkKKyAqCisgKiBjYW4gYmUgcmVhZC4KKyAqLworaW50CitpbnRlbF93aW5zeXNfcmVhZF9yZWcoc3RydWN0IGludGVsX3dpbnN5cyAqd2luc3lzLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZywgdWludDY0X3QgKnZhbCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXJzIG9mIHN1Ym1pc3Npb25zIGxvc3QgZHVlIHRvIEdQVSByZXNldC4KKyAqCisgKiBccGFyYW0gYWN0aXZlX2xvc3QgICAgICBOdW1iZXIgb2YgbG9zdCBhY3RpdmUvZ3VpbHR5IHN1Ym1pc3Npb25zCisgKiBccGFyYW0gcGVuZGluZ19sb3N0ICAgICBOdW1iZXIgb2YgbG9zdCBwZW5kaW5nL2lubm9jZW50IHN1Ym1pc3Npb25zCisgKi8KK2ludAoraW50ZWxfd2luc3lzX2dldF9yZXNldF9zdGF0cyhzdHJ1Y3QgaW50ZWxfd2luc3lzICp3aW5zeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICphY3RpdmVfbG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBlbmRpbmdfbG9zdCk7CisvKioKKyAqIEFsbG9jYXRlIGEgYnVmZmVyIG9iamVjdC4KKyAqCisgKiBccGFyYW0gbmFtZSAgICAgICAgICAgICBJbmZvcm1hdGl2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgYm8uCisgKiBccGFyYW0gc2l6ZSAgICAgICAgICAgICBTaXplIG9mIHRoZSBiby4KKyAqIFxwYXJhbSBjcHVfaW5pdCAgICAgICAgIFdpbGwgYmUgaW5pdGlhbGl6ZWQgYnkgQ1BVLgorICovCitzdHJ1Y3QgaW50ZWxfYm8gKgoraW50ZWxfd2luc3lzX2FsbG9jX2JvKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGNwdV9pbml0KTsKKworLyoqCisgKiBDcmVhdGUgYSBibyBmcm9tIGEgd2luc3lzIGhhbmRsZS4KKyAqLworc3RydWN0IGludGVsX2JvICoKK2ludGVsX3dpbnN5c19pbXBvcnRfaGFuZGxlKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfd2luc3lzX2hhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX3RpbGluZ19tb2RlICp0aWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpwaXRjaCk7CisKKy8qKgorICogRXhwb3J0IFxwIGJvIGFzIGEgd2luc3lzIGhhbmRsZSBmb3IgaW50ZXItcHJvY2VzcyBzaGFyaW5nLiAgXHAgdGlsaW5nIGFuZAorICogXHAgcGl0Y2ggbXVzdCBtYXRjaCB0aG9zZSBzZXQgYnkgXHAgaW50ZWxfYm9fc2V0X3RpbGluZygpLgorICovCitpbnQKK2ludGVsX3dpbnN5c19leHBvcnRfaGFuZGxlKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX3RpbGluZ19tb2RlIHRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF93aW5zeXNfaGFuZGxlICpoYW5kbGUpOworCisvKioKKyAqIFJldHVybiB0cnVlIHdoZW4gYnVmZmVyIG9iamVjdHMgZGlyZWN0bHkgc3BlY2lmaWVkIGluIFxwIGJvX2FycmF5LCBhbmQKKyAqIHRob3NlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBieSB0aGVtLCBjYW4gZml0IGluIHRoZSBhcGVydHVyZSBzcGFjZS4KKyAqLworYm9vbAoraW50ZWxfd2luc3lzX2Nhbl9zdWJtaXRfYm8oc3RydWN0IGludGVsX3dpbnN5cyAqd2luc3lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICoqYm9fYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOworCisvKioKKyAqIFN1Ym1pdCBccCBibyBmb3IgZXhlY3V0aW9uLgorICoKKyAqIFxwIGJvIGFuZCBhbGwgYm9zIHJlZmVyZW5jZWQgYnkgXHAgYm8gd2lsbCBiZSBjb25zaWRlcmVkIGJ1c3kgdW50aWwgYWxsCisgKiBjb21tYW5kcyBhcmUgcGFyc2VkIGFuZCBleGVjdXRlZC4gIFxwIGN0eCBpcyBpZ25vcmVkIHdoZW4gdGhlIGJvIGlzIG5vdAorICogc3VibWl0dGVkIHRvIHRoZSByZW5kZXIgcmluZy4KKyAqLworaW50CitpbnRlbF93aW5zeXNfc3VibWl0X2JvKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9yaW5nX3R5cGUgcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpibywgaW50IHVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisvKioKKyAqIERlY29kZSB0aGUgY29tbWFuZHMgY29udGFpbmVkIGluIFxwIGJvLiAgRm9yIGRlYnVnZ2luZy4KKyAqCisgKiBccGFyYW0gYm8gICAgICBCYXRjaCBidWZmZXIgdG8gZGVjb2RlLgorICogXHBhcmFtIHVzZWQgICAgU2l6ZSBvZiB0aGUgY29tbWFuZHMgaW4gYnl0ZXMuCisgKi8KK3ZvaWQKK2ludGVsX3dpbnN5c19kZWNvZGVfYm8oc3RydWN0IGludGVsX3dpbnN5cyAqd2luc3lzLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvLCBpbnQgdXNlZCk7CisKKy8qKgorICogSW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBccCBiby4gIE5vLW9wIHdoZW4gXHAgYm8gaXMgTlVMTC4KKyAqLworc3RydWN0IGludGVsX2JvICoKK2ludGVsX2JvX3JlZihzdHJ1Y3QgaW50ZWxfYm8gKmJvKTsKKworLyoqCisgKiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIFxwIGJvLiAgV2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMKKyAqIHplcm8sIFxwIGJvIGlzIGRlc3Ryb3llZC4gIE5vLW9wIHdoZW4gXHAgYm8gaXMgTlVMTC4KKyAqLwordm9pZAoraW50ZWxfYm9fdW5yZWYoc3RydWN0IGludGVsX2JvICpibyk7CisKKy8qKgorICogU2V0IHRoZSB0aWxpbmcgb2YgXHAgYm8uICBUaGUgaW5mbyBpcyB1c2VkIGJ5IEdUVCBtYXBwaW5nIGFuZCBibyBleHBvcnQuCisgKi8KK2ludAoraW50ZWxfYm9fc2V0X3RpbGluZyhzdHJ1Y3QgaW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX3RpbGluZ19tb2RlIHRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwaXRjaCk7CisKKy8qKgorICogTWFwIFxwIGJvIGZvciBDUFUgYWNjZXNzLiAgUmVjdXJzaXZlIG1hcHBpbmcgaXMgYWxsb3dlZC4KKyAqCisgKiBtYXAoKSBtYXBzIHRoZSBiYWNraW5nIHN0b3JlIGludG8gQ1BVIGFkZHJlc3Mgc3BhY2UsIGNhY2hlZC4gIEl0IHdpbGwgYmxvY2sKKyAqIGlmIHRoZSBibyBpcyBidXN5LiAgVGhpcyB2YXJpYW50IGFsbG93cyBmYXN0ZXN0IHJhbmRvbSByZWFkcyBhbmQgd3JpdGVzLAorICogYnV0IHRoZSBjYWxsZXIgbmVlZHMgdG8gaGFuZGxlIHRpbGluZyBvciBzd2l6emxpbmcgbWFudWFsbHkgaWYgdGhlIGJvIGlzCisgKiB0aWxlZCBvciBzd2l6emxlZC4gIElmIHdyaXRlIGlzIGVuYWJsZWQgYW5kIHRoZXJlIGlzIG5vIHNoYXJlZCBsYXN0LWxldmVsCisgKiBjYWNoZSAoTExDKSwgdGhlIENQVSBjYWNoZSB3aWxsIGJlIGZsdXNoZWQsIHdoaWNoIGlzIGV4cGVuc2l2ZS4KKyAqCisgKiBtYXBfZ3R0KCkgbWFwcyB0aGUgYm8gZm9yIE1NSU8gYWNjZXNzLCB1bmNhY2hlZCBidXQgd3JpdGUtY29tYmluZWQuICBJdAorICogd2lsbCBibG9jayBpZiB0aGUgYm8gaXMgYnVzeS4gIFRoaXMgdmFyaWFudCBwcm9taXNlcyBhIHJlYXNvbmFibGUgc3BlZWQgZm9yCisgKiBzZXF1ZW50aWFsIHdyaXRlcywgYnV0IHJlYWRzIHdvdWxkIGJlIHZlcnkgc2xvdy4gIENhbGxlcnMgYWx3YXlzIGhhdmUgYQorICogbGluZWFyIHZpZXcgb2YgdGhlIGJvLgorICoKKyAqIG1hcF9hc3luYygpIGFuZCBtYXBfZ3R0X2FzeW5jKCkgd29yayBzaW1pbGFyIHRvIG1hcCgpIGFuZCBtYXBfZ3R0KCkKKyAqIHJlc3BlY3RpdmVseSwgZXhjZXB0IHRoYXQgdGhleSBkbyBub3QgYmxvY2suCisgKi8KK3ZvaWQgKgoraW50ZWxfYm9fbWFwKHN0cnVjdCBpbnRlbF9ibyAqYm8sIGJvb2wgd3JpdGVfZW5hYmxlKTsKKwordm9pZCAqCitpbnRlbF9ib19tYXBfYXN5bmMoc3RydWN0IGludGVsX2JvICpibyk7CisKK3ZvaWQgKgoraW50ZWxfYm9fbWFwX2d0dChzdHJ1Y3QgaW50ZWxfYm8gKmJvKTsKKwordm9pZCAqCitpbnRlbF9ib19tYXBfZ3R0X2FzeW5jKHN0cnVjdCBpbnRlbF9ibyAqYm8pOworCisvKioKKyAqIFVubWFwIFxwIGJvLgorICovCit2b2lkCitpbnRlbF9ib191bm1hcChzdHJ1Y3QgaW50ZWxfYm8gKmJvKTsKKworLyoqCisgKiBXcml0ZSBkYXRhIHRvIFxwIGJvLgorICovCitpbnQKK2ludGVsX2JvX3B3cml0ZShzdHJ1Y3QgaW50ZWxfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworCisvKioKKyAqIFJlYWQgZGF0YSBmcm9tIHRoZSBiby4KKyAqLworaW50CitpbnRlbF9ib19wcmVhZChzdHJ1Y3QgaW50ZWxfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSk7CisKKy8qKgorICogQWRkIFxwIHRhcmdldF9ibyB0byB0aGUgcmVsb2NhdGlvbiBsaXN0LgorICoKKyAqIFdoZW4gXHAgYm8gaXMgc3VibWl0dGVkIGZvciBleGVjdXRpb24sIGFuZCBpZiBccCB0YXJnZXRfYm8gaGFzIG1vdmVkLAorICogdGhlIGtlcm5lbCB3aWxsIHBhdGNoIFxwIGJvIGF0IFxwIG9mZnNldCB0byBccCB0YXJnZXRfYm8tPm9mZnNldCBwbHVzCisgKiBccCB0YXJnZXRfb2Zmc2V0LgorICoKKyAqIFxwIHByZXN1bWVkX29mZnNldCBzaG91bGQgYmUgd3JpdHRlbiB0byBccCBibyBhdCBccCBvZmZzZXQuCisgKi8KK2ludAoraW50ZWxfYm9fYWRkX3JlbG9jKHN0cnVjdCBpbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYm8gKnRhcmdldF9ibywgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywgdWludDY0X3QgKnByZXN1bWVkX29mZnNldCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiByZWxvY2F0aW9ucy4KKyAqLworaW50CitpbnRlbF9ib19nZXRfcmVsb2NfY291bnQoc3RydWN0IGludGVsX2JvICpibyk7CisKKy8qKgorICogVHJ1bmNhdGUgYWxsIHJlbG9jYXRpb25zIGV4Y2VwdCB0aGUgZmlyc3QgXHAgc3RhcnQgb25lcy4KKyAqCisgKiBDb21iaW5lZCB3aXRoIFxwIGludGVsX2JvX2dldF9yZWxvY19jb3VudCgpLCB0aGV5IGNhbiBiZSB1c2VkIHRvIHVuZG8gdGhlCisgKiBccCBpbnRlbF9ib19hZGRfcmVsb2MoKSBjYWxscyB0aGF0IHdlcmUganVzdCBtYWRlLgorICovCit2b2lkCitpbnRlbF9ib190cnVuY2F0ZV9yZWxvY3Moc3RydWN0IGludGVsX2JvICpibywgaW50IHN0YXJ0KTsKKworLyoqCisgKiBSZXR1cm4gdHJ1ZSBpZiBccCB0YXJnZXRfYm8gaXMgb24gdGhlIHJlbG9jYXRpb24gbGlzdCBvZiBccCBibywgb3Igb24KKyAqIHRoZSByZWxvY2F0aW9uIGxpc3Qgb2Ygc29tZSBibyB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgXHAgYm8uCisgKi8KK2Jvb2wKK2ludGVsX2JvX2hhc19yZWxvYyhzdHJ1Y3QgaW50ZWxfYm8gKmJvLCBzdHJ1Y3QgaW50ZWxfYm8gKnRhcmdldF9ibyk7CisKKy8qKgorICogV2FpdCB1bnRpbCBcYm8gaXMgaWRsZSwgb3IgXHAgdGltZW91dCBuYW5vc2Vjb25kcyBoYXZlIHBhc3NlZC4gIEEKKyAqIG5lZ2F0aXZlIHRpbWVvdXQgbWVhbnMgdG8gd2FpdCBpbmRlZmluaXRlbHkuCisgKgorICogXHJldHVybiAwIG9ubHkgd2hlbiBccCBibyBpcyBpZGxlCisgKi8KK2ludAoraW50ZWxfYm9fd2FpdChzdHJ1Y3QgaW50ZWxfYm8gKmJvLCBpbnQ2NF90IHRpbWVvdXQpOworCisvKioKKyAqIFJldHVybiB0cnVlIGlmIFxwIGJvIGlzIGJ1c3kuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAoraW50ZWxfYm9faXNfYnVzeShzdHJ1Y3QgaW50ZWxfYm8gKmJvKQoreworICAgcmV0dXJuIChpbnRlbF9ib193YWl0KGJvLCAwKSAhPSAwKTsKK30KKworI2VuZGlmIC8qIElOVEVMX1dJTlNZU19IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwva21kL3dpbnN5c19kcm0uYyBiL2ljZC9pbnRlbC9rbWQvd2luc3lzX2RybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOWViYzcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwva21kL3dpbnN5c19kcm0uYwpAQCAtMCwwICsxLDYwMyBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBMdW5hckcsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmbmRlZiBFVElNRQorI2RlZmluZSBFVElNRSBFVElNRURPVVQKKyNlbmRpZgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPGk5MTVfZHJtLmg+CisjaW5jbHVkZSA8aW50ZWxfYnVmbWdyLmg+CisKKyNpbmNsdWRlICJpY2QtaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJpY2QtdXRpbHMuaCIKKyNpbmNsdWRlICJ3aW5zeXMuaCIKKworc3RydWN0IGludGVsX3dpbnN5cyB7CisgICBjb25zdCBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZTsKKyAgIGludCBmZDsKKyAgIGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncjsKKyAgIHN0cnVjdCBpbnRlbF93aW5zeXNfaW5mbyBpbmZvOworCisgICBkcm1faW50ZWxfY29udGV4dCAqY3R4OworfTsKKworc3RhdGljIGRybV9pbnRlbF9ibyAqCitnZW1fYm8oY29uc3Qgc3RydWN0IGludGVsX2JvICpibykKK3sKKyAgIHJldHVybiAoZHJtX2ludGVsX2JvICopIGJvOworfQorCitzdGF0aWMgYm9vbAorZ2V0X3BhcmFtKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywgaW50IHBhcmFtLCBpbnQgKnZhbHVlKQoreworICAgc3RydWN0IGRybV9pOTE1X2dldHBhcmFtIGdwOworICAgaW50IGVycjsKKworICAgKnZhbHVlID0gMDsKKworICAgbWVtc2V0KCZncCwgMCwgc2l6ZW9mKGdwKSk7CisgICBncC5wYXJhbSA9IHBhcmFtOworICAgZ3AudmFsdWUgPSB2YWx1ZTsKKworICAgZXJyID0gZHJtQ29tbWFuZFdyaXRlUmVhZCh3aW5zeXMtPmZkLCBEUk1fSTkxNV9HRVRQQVJBTSwgJmdwLCBzaXplb2YoZ3ApKTsKKyAgIGlmIChlcnIpIHsKKyAgICAgICp2YWx1ZSA9IDA7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAordGVzdF9hZGRyZXNzX3N3aXp6bGluZyhzdHJ1Y3QgaW50ZWxfd2luc3lzICp3aW5zeXMpCit7CisgICBkcm1faW50ZWxfYm8gKmJvOworICAgdWludDMyX3QgdGlsaW5nID0gSTkxNV9USUxJTkdfWCwgc3dpenpsZTsKKyAgIHVuc2lnbmVkIGxvbmcgcGl0Y2g7CisKKyAgIGJvID0gZHJtX2ludGVsX2JvX2FsbG9jX3RpbGVkKHdpbnN5cy0+YnVmbWdyLAorICAgICAgICAgImFkZHJlc3Mgc3dpenpsaW5nIHRlc3QiLCA2NCwgNjQsIDQsICZ0aWxpbmcsICZwaXRjaCwgMCk7CisgICBpZiAoYm8pIHsKKyAgICAgIGRybV9pbnRlbF9ib19nZXRfdGlsaW5nKGJvLCAmdGlsaW5nLCAmc3dpenpsZSk7CisgICAgICBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoYm8pOworICAgfQorICAgZWxzZSB7CisgICAgICBzd2l6emxlID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisgICB9CisKKyAgIHJldHVybiAoc3dpenpsZSAhPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORSk7Cit9CisKK3N0YXRpYyBib29sCit0ZXN0X3JlZ19yZWFkKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywgdWludDMyX3QgcmVnKQoreworICAgdWludDY0X3QgZHVtbXk7CisKKyAgIHJldHVybiAhZHJtX2ludGVsX3JlZ19yZWFkKHdpbnN5cy0+YnVmbWdyLCByZWcsICZkdW1teSk7Cit9CisKK3N0YXRpYyBib29sCitwcm9iZV93aW5zeXMoc3RydWN0IGludGVsX3dpbnN5cyAqd2luc3lzKQoreworICAgc3RydWN0IGludGVsX3dpbnN5c19pbmZvICppbmZvID0gJndpbnN5cy0+aW5mbzsKKyAgIGludCB2YWw7CisKKyAgIC8qCisgICAgKiBXaGVuIHdlIG5lZWQgdGhlIE50aCB2ZXJ0ZXggZnJvbSBhIHVzZXIgdmVydGV4IGJ1ZmZlciwgYW5kIHRoZSB2ZXJ0ZXggaXMKKyAgICAqIHVwbG9hZGVkIHRvLCBzYXksIHRoZSBiZWdpbm5pbmcgb2YgYSBibywgd2Ugd2FudCB0aGUgZmlyc3QgdmVydGV4IGluIHRoZQorICAgICogYm8gdG8gYmUgZmV0Y2hlZC4gIE9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0byBzZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUKKyAgICAqIHZlcnRleCBidWZmZXIgdG8KKyAgICAqCisgICAgKiAgIGJvLT5vZmZzZXQ2NCArICh2Yi0+YnVmZmVyX29mZnNldCAtIHZiLT5zdHJpZGUgKiBOKS4KKyAgICAqCisgICAgKiBUaGUgc2Vjb25kIHRlcm0gbWF5IGJlIG5lZ2F0aXZlLCBhbmQgd2UgbmVlZCBrZXJuZWwgc3VwcG9ydCB0byBkbyB0aGF0LgorICAgICoKKyAgICAqIFRoaXMgY2hlY2sgaXMgdGFrZW4gZnJvbSB0aGUgY2xhc3NpYyBkcml2ZXIuICB1X3ZidWZfdXBsb2FkX2J1ZmZlcnMoKQorICAgICogZ3VhcmFudGVlcyB0aGUgdGVybSBpcyBuZXZlciBuZWdhdGl2ZSwgYnV0IGl0IGlzIGdvb2QgdG8gcmVxdWlyZSBhCisgICAgKiByZWNlbnQga2VybmVsLgorICAgICovCisgICBnZXRfcGFyYW0od2luc3lzLCBJOTE1X1BBUkFNX0hBU19SRUxBWEVEX0RFTFRBLCAmdmFsKTsKKyAgIGlmICghdmFsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGluZm8tPmRldmlkID0gZHJtX2ludGVsX2J1Zm1ncl9nZW1fZ2V0X2RldmlkKHdpbnN5cy0+YnVmbWdyKTsKKworICAgaWYgKGRybV9pbnRlbF9nZXRfYXBlcnR1cmVfc2l6ZXMod2luc3lzLT5mZCwKKyAgICAgICAgICAgICAgICZpbmZvLT5hcGVydHVyZV9tYXBwYWJsZSwgJmluZm8tPmFwZXJ0dXJlX3RvdGFsKSkgeworICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgZ2V0X3BhcmFtKHdpbnN5cywgSTkxNV9QQVJBTV9IQVNfTExDLCAmdmFsKTsKKyAgIGluZm8tPmhhc19sbGMgPSB2YWw7CisgICBpbmZvLT5oYXNfYWRkcmVzc19zd2l6emxpbmcgPSB0ZXN0X2FkZHJlc3Nfc3dpenpsaW5nKHdpbnN5cyk7CisKKyAgIHdpbnN5cy0+Y3R4ID0gZHJtX2ludGVsX2dlbV9jb250ZXh0X2NyZWF0ZSh3aW5zeXMtPmJ1Zm1ncik7CisgICBpZiAoIXdpbnN5cy0+Y3R4KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICBpbmZvLT5oYXNfbG9naWNhbF9jb250ZXh0ID0gKHdpbnN5cy0+Y3R4ICE9IE5VTEwpOworCisgICBnZXRfcGFyYW0od2luc3lzLCBJOTE1X1BBUkFNX0hBU19BTElBU0lOR19QUEdUVCwgJnZhbCk7CisgICBpbmZvLT5oYXNfcHBndHQgPSB2YWw7CisKKyAgIC8qIHRlc3QgVElNRVNUQU1QIHJlYWQgKi8KKyAgIGluZm8tPmhhc190aW1lc3RhbXAgPSB0ZXN0X3JlZ19yZWFkKHdpbnN5cywgMHgyMzU4KTsKKworICAgZ2V0X3BhcmFtKHdpbnN5cywgSTkxNV9QQVJBTV9IQVNfR0VON19TT0xfUkVTRVQsICZ2YWwpOworICAgaW5mby0+aGFzX2dlbjdfc29sX3Jlc2V0ID0gdmFsOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IGludGVsX3dpbnN5cyAqCitpbnRlbF93aW5zeXNfY3JlYXRlX2Zvcl9mZChjb25zdCBzdHJ1Y3QgaWNkX2luc3RhbmNlICppbnN0YW5jZSwgaW50IGZkKQoreworICAgLyogc28gdGhhdCB3ZSBjYW4gaGF2ZSBlbm91Z2ggcmVsb2NzIHBlciBibyAqLworICAgY29uc3QgaW50IGJhdGNoX3NpemUgPSBzaXplb2YodWludDMyX3QpICogMTUwICogMTAyNDsKKyAgIHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5czsKKworICAgd2luc3lzID0gaWNkX2luc3RhbmNlX2FsbG9jKGluc3RhbmNlLCBzaXplb2YoKndpbnN5cyksIHNpemVvZihpbnQpLAorICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9JTlNUQU5DRSk7CisgICBpZiAoIXdpbnN5cykKKyAgICAgIHJldHVybiBOVUxMOworCisgICBtZW1zZXQod2luc3lzLCAwLCBzaXplb2YoKndpbnN5cykpOworCisgICB3aW5zeXMtPmluc3RhbmNlID0gaW5zdGFuY2U7CisgICB3aW5zeXMtPmZkID0gZmQ7CisKKyAgIHdpbnN5cy0+YnVmbWdyID0gZHJtX2ludGVsX2J1Zm1ncl9nZW1faW5pdCh3aW5zeXMtPmZkLCBiYXRjaF9zaXplKTsKKyAgIGlmICghd2luc3lzLT5idWZtZ3IpIHsKKyAgICAgIGljZF9pbnN0YW5jZV9mcmVlKGluc3RhbmNlLCB3aW5zeXMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGlmICghcHJvYmVfd2luc3lzKHdpbnN5cykpIHsKKyAgICAgIGRybV9pbnRlbF9idWZtZ3JfZGVzdHJveSh3aW5zeXMtPmJ1Zm1ncik7CisgICAgICBpY2RfaW5zdGFuY2VfZnJlZShpbnN0YW5jZSwgd2luc3lzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICAvKgorICAgICogTm8gbmVlZCB0byBpbXBsaWNpdGx5IHNldCB1cCBhIGZlbmNlIHJlZ2lzdGVyIGZvciBlYWNoIG5vbi1saW5lYXIgcmVsb2MKKyAgICAqIGVudHJ5LiAgSU5URUxfUkVMT0NfRkVOQ0Ugd2lsbCBiZSBzZXQgb24gcmVsb2MgZW50cmllcyB0aGF0IG5lZWQgdGhlbS4KKyAgICAqLworICAgZHJtX2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX2ZlbmNlZF9yZWxvY3Mod2luc3lzLT5idWZtZ3IpOworCisgICBkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfcmV1c2Uod2luc3lzLT5idWZtZ3IpOworICAgZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X3ZtYV9jYWNoZV9zaXplKHdpbnN5cy0+YnVmbWdyLCAtMSk7CisKKyAgIHJldHVybiB3aW5zeXM7Cit9CisKK3ZvaWQKK2ludGVsX3dpbnN5c19kZXN0cm95KHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cykKK3sKKyAgIGRybV9pbnRlbF9nZW1fY29udGV4dF9kZXN0cm95KHdpbnN5cy0+Y3R4KTsKKyAgIGRybV9pbnRlbF9idWZtZ3JfZGVzdHJveSh3aW5zeXMtPmJ1Zm1ncik7CisgICBpY2RfaW5zdGFuY2VfZnJlZSh3aW5zeXMtPmluc3RhbmNlLCB3aW5zeXMpOworfQorCitjb25zdCBzdHJ1Y3QgaW50ZWxfd2luc3lzX2luZm8gKgoraW50ZWxfd2luc3lzX2dldF9pbmZvKGNvbnN0IHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cykKK3sKKyAgIHJldHVybiAmd2luc3lzLT5pbmZvOworfQorCitpbnQKK2ludGVsX3dpbnN5c19yZWFkX3JlZyhzdHJ1Y3QgaW50ZWxfd2luc3lzICp3aW5zeXMsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnLCB1aW50NjRfdCAqdmFsKQoreworICAgcmV0dXJuIGRybV9pbnRlbF9yZWdfcmVhZCh3aW5zeXMtPmJ1Zm1nciwgcmVnLCB2YWwpOworfQorCitpbnQKK2ludGVsX3dpbnN5c19nZXRfcmVzZXRfc3RhdHMoc3RydWN0IGludGVsX3dpbnN5cyAqd2luc3lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqYWN0aXZlX2xvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwZW5kaW5nX2xvc3QpCit7CisgICB1aW50MzJfdCByZXNldF9jb3VudDsKKworICAgcmV0dXJuIGRybV9pbnRlbF9nZXRfcmVzZXRfc3RhdHMod2luc3lzLT5jdHgsCisgICAgICAgICAmcmVzZXRfY291bnQsIGFjdGl2ZV9sb3N0LCBwZW5kaW5nX2xvc3QpOworfQorCitzdHJ1Y3QgaW50ZWxfYm8gKgoraW50ZWxfd2luc3lzX2FsbG9jX2JvKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGNwdV9pbml0KQoreworICAgY29uc3QgdW5zaWduZWQgaW50IGFsaWdubWVudCA9IDQwOTY7IC8qIGFsd2F5cyBwYWdlLWFsaWduZWQgKi8KKyAgIGRybV9pbnRlbF9ibyAqYm87CisKKyAgIGlmIChjcHVfaW5pdCkgeworICAgICAgYm8gPSBkcm1faW50ZWxfYm9fYWxsb2Mod2luc3lzLT5idWZtZ3IsIG5hbWUsIHNpemUsIGFsaWdubWVudCk7CisgICB9IGVsc2UgeworICAgICAgYm8gPSBkcm1faW50ZWxfYm9fYWxsb2NfZm9yX3JlbmRlcih3aW5zeXMtPmJ1Zm1nciwKKyAgICAgICAgICAgIG5hbWUsIHNpemUsIGFsaWdubWVudCk7CisgICB9CisKKyAgIHJldHVybiAoc3RydWN0IGludGVsX2JvICopIGJvOworfQorCitzdHJ1Y3QgaW50ZWxfYm8gKgoraW50ZWxfd2luc3lzX2ltcG9ydF9oYW5kbGUoc3RydWN0IGludGVsX3dpbnN5cyAqd2luc3lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF93aW5zeXNfaGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfdGlsaW5nX21vZGUgKnRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnBpdGNoKQoreworICAgdWludDMyX3QgcmVhbF90aWxpbmcsIHN3aXp6bGU7CisgICBkcm1faW50ZWxfYm8gKmJvOworICAgaW50IGVycjsKKworICAgc3dpdGNoIChoYW5kbGUtPnR5cGUpIHsKKyAgIGNhc2UgSU5URUxfV0lOU1lTX0hBTkRMRV9TSEFSRUQ6CisgICAgICB7CisgICAgICAgICBjb25zdCB1aW50MzJfdCBnZW1fbmFtZSA9IGhhbmRsZS0+aGFuZGxlOworICAgICAgICAgYm8gPSBkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUod2luc3lzLT5idWZtZ3IsCisgICAgICAgICAgICAgICBuYW1lLCBnZW1fbmFtZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgSU5URUxfV0lOU1lTX0hBTkRMRV9GRDoKKyAgICAgIHsKKyAgICAgICAgIGNvbnN0IGludCBmZCA9IChpbnQpIGhhbmRsZS0+aGFuZGxlOworICAgICAgICAgYm8gPSBkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX3ByaW1lKHdpbnN5cy0+YnVmbWdyLAorICAgICAgICAgICAgICAgZmQsIGhlaWdodCAqIGhhbmRsZS0+c3RyaWRlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGJvID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBpZiAoIWJvKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgIGVyciA9IGRybV9pbnRlbF9ib19nZXRfdGlsaW5nKGJvLCAmcmVhbF90aWxpbmcsICZzd2l6emxlKTsKKyAgIGlmIChlcnIpIHsKKyAgICAgIGRybV9pbnRlbF9ib191bnJlZmVyZW5jZShibyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgKnRpbGluZyA9IHJlYWxfdGlsaW5nOworICAgKnBpdGNoID0gaGFuZGxlLT5zdHJpZGU7CisKKyAgIHJldHVybiAoc3RydWN0IGludGVsX2JvICopIGJvOworfQorCitpbnQKK2ludGVsX3dpbnN5c19leHBvcnRfaGFuZGxlKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX3RpbGluZ19tb2RlIHRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF93aW5zeXNfaGFuZGxlICpoYW5kbGUpCit7CisgICBpbnQgZXJyID0gMDsKKworICAgc3dpdGNoIChoYW5kbGUtPnR5cGUpIHsKKyAgIGNhc2UgSU5URUxfV0lOU1lTX0hBTkRMRV9TSEFSRUQ6CisgICAgICB7CisgICAgICAgICB1aW50MzJfdCBuYW1lOworCisgICAgICAgICBlcnIgPSBkcm1faW50ZWxfYm9fZmxpbmsoZ2VtX2JvKGJvKSwgJm5hbWUpOworICAgICAgICAgaWYgKCFlcnIpCisgICAgICAgICAgICBoYW5kbGUtPmhhbmRsZSA9IG5hbWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgSU5URUxfV0lOU1lTX0hBTkRMRV9LTVM6CisgICAgICBoYW5kbGUtPmhhbmRsZSA9IGdlbV9ibyhibyktPmhhbmRsZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBJTlRFTF9XSU5TWVNfSEFORExFX0ZEOgorICAgICAgeworICAgICAgICAgaW50IGZkOworCisgICAgICAgICBlcnIgPSBkcm1faW50ZWxfYm9fZ2VtX2V4cG9ydF90b19wcmltZShnZW1fYm8oYm8pLCAmZmQpOworICAgICAgICAgaWYgKCFlcnIpCisgICAgICAgICAgICBoYW5kbGUtPmhhbmRsZSA9IGZkOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgZXJyID0gLUVJTlZBTDsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBpZiAoZXJyKQorICAgICAgcmV0dXJuIGVycjsKKworICAgaGFuZGxlLT5zdHJpZGUgPSBwaXRjaDsKKworICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wKK2ludGVsX3dpbnN5c19jYW5fc3VibWl0X2JvKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqKmJvX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQoreworICAgcmV0dXJuICFkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKChkcm1faW50ZWxfYm8gKiopIGJvX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKK30KKworaW50CitpbnRlbF93aW5zeXNfc3VibWl0X2JvKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9yaW5nX3R5cGUgcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpibywgaW50IHVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisgICBjb25zdCB1bnNpZ25lZCBsb25nIGV4ZWNfZmxhZ3MgPSAodW5zaWduZWQgbG9uZykgcmluZyB8IGZsYWdzOworICAgZHJtX2ludGVsX2NvbnRleHQgKmN0eDsKKworICAgLyogbG9naWNhbCBjb250ZXh0cyBhcmUgb25seSBhdmFpbGFibGUgZm9yIHRoZSByZW5kZXIgcmluZyAqLworICAgY3R4ID0gKHJpbmcgPT0gSU5URUxfUklOR19SRU5ERVIpID8gd2luc3lzLT5jdHggOiBOVUxMOworCisgICBpZiAoY3R4KSB7CisgICAgICByZXR1cm4gZHJtX2ludGVsX2dlbV9ib19jb250ZXh0X2V4ZWMoZ2VtX2JvKGJvKSwKKyAgICAgICAgICAgIGN0eCwgdXNlZCwgZXhlY19mbGFncyk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIHJldHVybiBkcm1faW50ZWxfYm9fbXJiX2V4ZWMoZ2VtX2JvKGJvKSwKKyAgICAgICAgICAgIHVzZWQsIE5VTEwsIDAsIDAsIGV4ZWNfZmxhZ3MpOworICAgfQorfQorCit2b2lkCitpbnRlbF93aW5zeXNfZGVjb2RlX2JvKHN0cnVjdCBpbnRlbF93aW5zeXMgKndpbnN5cywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpibywgaW50IHVzZWQpCit7CisgICBzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqZGVjb2RlOworICAgdm9pZCAqcHRyOworCisgICBwdHIgPSBpbnRlbF9ib19tYXAoYm8sIGZhbHNlKTsKKyAgIGlmICghcHRyKSB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGRlY29kZSA9IGRybV9pbnRlbF9kZWNvZGVfY29udGV4dF9hbGxvYyh3aW5zeXMtPmluZm8uZGV2aWQpOworICAgaWYgKCFkZWNvZGUpIHsKKyAgICAgIGludGVsX2JvX3VubWFwKGJvKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZHJtX2ludGVsX2RlY29kZV9zZXRfb3V0cHV0X2ZpbGUoZGVjb2RlLCBzdGRlcnIpOworCisgICAvKiBpbiBkd29yZHMgKi8KKyAgIHVzZWQgLz0gNDsKKworICAgZHJtX2ludGVsX2RlY29kZV9zZXRfYmF0Y2hfcG9pbnRlcihkZWNvZGUsCisgICAgICAgICBwdHIsIGdlbV9ibyhibyktPm9mZnNldDY0LCB1c2VkKTsKKworICAgZHJtX2ludGVsX2RlY29kZShkZWNvZGUpOworICAgZnJlZShkZWNvZGUpOworICAgaW50ZWxfYm9fdW5tYXAoYm8pOworfQorCitzdHJ1Y3QgaW50ZWxfYm8gKgoraW50ZWxfYm9fcmVmKHN0cnVjdCBpbnRlbF9ibyAqYm8pCit7CisgICBpZiAoYm8pCisgICAgICBkcm1faW50ZWxfYm9fcmVmZXJlbmNlKGdlbV9ibyhibykpOworCisgICByZXR1cm4gYm87Cit9CisKK3ZvaWQKK2ludGVsX2JvX3VucmVmKHN0cnVjdCBpbnRlbF9ibyAqYm8pCit7CisgICBpZiAoYm8pCisgICAgICBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoZ2VtX2JvKGJvKSk7Cit9CisKK2ludAoraW50ZWxfYm9fc2V0X3RpbGluZyhzdHJ1Y3QgaW50ZWxfYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX3RpbGluZ19tb2RlIHRpbGluZywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwaXRjaCkKK3sKKyAgIHVpbnQzMl90IHJlYWxfdGlsaW5nID0gdGlsaW5nOworICAgaW50IGVycjsKKworICAgc3dpdGNoICh0aWxpbmcpIHsKKyAgIGNhc2UgSU5URUxfVElMSU5HX1g6CisgICAgICBpZiAocGl0Y2ggJSA1MTIpCisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgIGNhc2UgSU5URUxfVElMSU5HX1k6CisgICAgICBpZiAocGl0Y2ggJSAxMjgpCisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KKworICAgZXJyID0gZHJtX2ludGVsX2JvX3NldF90aWxpbmcoZ2VtX2JvKGJvKSwgJnJlYWxfdGlsaW5nLCBwaXRjaCk7CisgICBpZiAoZXJyIHx8IHJlYWxfdGlsaW5nICE9IHRpbGluZykgeworICAgICAgYXNzZXJ0KCEidGlsaW5nIG1pc21hdGNoIik7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIHJldHVybiAwOworfQorCit2b2lkICoKK2ludGVsX2JvX21hcChzdHJ1Y3QgaW50ZWxfYm8gKmJvLCBib29sIHdyaXRlX2VuYWJsZSkKK3sKKyAgIGludCBlcnI7CisKKyAgIGVyciA9IGRybV9pbnRlbF9ib19tYXAoZ2VtX2JvKGJvKSwgd3JpdGVfZW5hYmxlKTsKKyAgIGlmIChlcnIpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICByZXR1cm4gZ2VtX2JvKGJvKS0+dmlydHVhbDsKK30KKwordm9pZCAqCitpbnRlbF9ib19tYXBfYXN5bmMoc3RydWN0IGludGVsX2JvICpibykKK3sKKyAgIGludCBlcnI7CisKKyAgIGVyciA9IGRybV9pbnRlbF9nZW1fYm9fbWFwX3Vuc3luY2hyb25pemVkX25vbl9ndHQoZ2VtX2JvKGJvKSk7CisgICBpZiAoZXJyKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIGdlbV9ibyhibyktPnZpcnR1YWw7Cit9CisKK3ZvaWQgKgoraW50ZWxfYm9fbWFwX2d0dChzdHJ1Y3QgaW50ZWxfYm8gKmJvKQoreworICAgaW50IGVycjsKKworICAgZXJyID0gZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0KGdlbV9ibyhibykpOworICAgaWYgKGVycikgeworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHJldHVybiBnZW1fYm8oYm8pLT52aXJ0dWFsOworfQorCit2b2lkICoKK2ludGVsX2JvX21hcF9ndHRfYXN5bmMoc3RydWN0IGludGVsX2JvICpibykKK3sKKyAgIGludCBlcnI7CisKKyAgIGVyciA9IGRybV9pbnRlbF9nZW1fYm9fbWFwX3Vuc3luY2hyb25pemVkKGdlbV9ibyhibykpOworICAgaWYgKGVycikgeworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHJldHVybiBnZW1fYm8oYm8pLT52aXJ0dWFsOworfQorCit2b2lkCitpbnRlbF9ib191bm1hcChzdHJ1Y3QgaW50ZWxfYm8gKmJvKQoreworICAgaW50IGVyciBVX0FTU0VSVF9PTkxZOworCisgICBlcnIgPSBkcm1faW50ZWxfYm9fdW5tYXAoZ2VtX2JvKGJvKSk7CisgICBhc3NlcnQoIWVycik7Cit9CisKK2ludAoraW50ZWxfYm9fcHdyaXRlKHN0cnVjdCBpbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgIHJldHVybiBkcm1faW50ZWxfYm9fc3ViZGF0YShnZW1fYm8oYm8pLCBvZmZzZXQsIHNpemUsIGRhdGEpOworfQorCitpbnQKK2ludGVsX2JvX3ByZWFkKHN0cnVjdCBpbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKQoreworICAgcmV0dXJuIGRybV9pbnRlbF9ib19nZXRfc3ViZGF0YShnZW1fYm8oYm8pLCBvZmZzZXQsIHNpemUsIGRhdGEpOworfQorCitpbnQKK2ludGVsX2JvX2FkZF9yZWxvYyhzdHJ1Y3QgaW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICp0YXJnZXRfYm8sIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIHVpbnQ2NF90ICpwcmVzdW1lZF9vZmZzZXQpCit7CisgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsIHdyaXRlX2RvbWFpbjsKKyAgIGludCBlcnI7CisKKyAgIGlmIChmbGFncyAmIElOVEVMX1JFTE9DX1dSSVRFKSB7CisgICAgICAvKgorICAgICAgICogQmVjYXVzZSBvZiB0aGUgdHJhbnNsYXRpb24gdG8gZG9tYWlucywgSU5URUxfUkVMT0NfR0dUVCBzaG91bGQgb25seQorICAgICAgICogYmUgc2V0IG9uIEdFTjYgd2hlbiB0aGUgYm8gaXMgd3JpdHRlbiBieSBNSV8qIG9yIFBJUEVfQ09OVFJPTC4gIFRoZQorICAgICAgICoga2VybmVsIHdpbGwgdHJhbnNsYXRlIGl0IGJhY2sgdG8gSU5URUxfUkVMT0NfR0dUVC4KKyAgICAgICAqLworICAgICAgd3JpdGVfZG9tYWluID0gKGZsYWdzICYgSU5URUxfUkVMT0NfR0dUVCkgPworICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OIDogSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKKyAgICAgIHJlYWRfZG9tYWlucyA9IHdyaXRlX2RvbWFpbjsKKyAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9kb21haW4gPSAwOworICAgICAgcmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiB8CisgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fU0FNUExFUiB8CisgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04gfAorICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX1ZFUlRFWDsKKyAgIH0KKworICAgaWYgKGZsYWdzICYgSU5URUxfUkVMT0NfRkVOQ0UpIHsKKyAgICAgIGVyciA9IGRybV9pbnRlbF9ib19lbWl0X3JlbG9jX2ZlbmNlKGdlbV9ibyhibyksIG9mZnNldCwKKyAgICAgICAgICAgIGdlbV9ibyh0YXJnZXRfYm8pLCB0YXJnZXRfb2Zmc2V0LAorICAgICAgICAgICAgcmVhZF9kb21haW5zLCB3cml0ZV9kb21haW4pOworICAgfSBlbHNlIHsKKyAgICAgIGVyciA9IGRybV9pbnRlbF9ib19lbWl0X3JlbG9jKGdlbV9ibyhibyksIG9mZnNldCwKKyAgICAgICAgICAgIGdlbV9ibyh0YXJnZXRfYm8pLCB0YXJnZXRfb2Zmc2V0LAorICAgICAgICAgICAgcmVhZF9kb21haW5zLCB3cml0ZV9kb21haW4pOworICAgfQorCisgICAqcHJlc3VtZWRfb2Zmc2V0ID0gZ2VtX2JvKHRhcmdldF9ibyktPm9mZnNldDY0ICsgdGFyZ2V0X29mZnNldDsKKworICAgcmV0dXJuIGVycjsKK30KKworaW50CitpbnRlbF9ib19nZXRfcmVsb2NfY291bnQoc3RydWN0IGludGVsX2JvICpibykKK3sKKyAgIHJldHVybiBkcm1faW50ZWxfZ2VtX2JvX2dldF9yZWxvY19jb3VudChnZW1fYm8oYm8pKTsKK30KKwordm9pZAoraW50ZWxfYm9fdHJ1bmNhdGVfcmVsb2NzKHN0cnVjdCBpbnRlbF9ibyAqYm8sIGludCBzdGFydCkKK3sKKyAgIGRybV9pbnRlbF9nZW1fYm9fY2xlYXJfcmVsb2NzKGdlbV9ibyhibyksIHN0YXJ0KTsKK30KKworYm9vbAoraW50ZWxfYm9faGFzX3JlbG9jKHN0cnVjdCBpbnRlbF9ibyAqYm8sIHN0cnVjdCBpbnRlbF9ibyAqdGFyZ2V0X2JvKQoreworICAgcmV0dXJuIGRybV9pbnRlbF9ib19yZWZlcmVuY2VzKGdlbV9ibyhibyksIGdlbV9ibyh0YXJnZXRfYm8pKTsKK30KKworaW50CitpbnRlbF9ib193YWl0KHN0cnVjdCBpbnRlbF9ibyAqYm8sIGludDY0X3QgdGltZW91dCkKK3sKKyAgIGludCBlcnIgPSAwOworCisgICBpZiAodGltZW91dCA+PSAwKQorICAgICAgIGVyciA9IGRybV9pbnRlbF9nZW1fYm9fd2FpdChnZW1fYm8oYm8pLCB0aW1lb3V0KTsKKyAgIGVsc2UKKyAgICAgICBkcm1faW50ZWxfYm9fd2FpdF9yZW5kZXJpbmcoZ2VtX2JvKGJvKSk7CisKKyAgIC8qIGNvbnNpZGVyIHRoZSBibyBpZGxlIG9uIGVycm9ycyAqLworICAgaWYgKGVyciAmJiBlcnIgIT0gLUVUSU1FKQorICAgICAgZXJyID0gMDsKKworICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9sYXlvdXQuYyBiL2ljZC9pbnRlbC9sYXlvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmI2ODFiCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2xheW91dC5jCkBAIC0wLDAgKzEsMTQwMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiZm9ybWF0LmgiCisjaW5jbHVkZSAiZ3B1LmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisKK2VudW0geworICAgTEFZT1VUX1RJTElOR19OT05FID0gMSA8PCBHRU42X1RJTElOR19OT05FLAorICAgTEFZT1VUX1RJTElOR19YID0gMSA8PCBHRU42X1RJTElOR19YLAorICAgTEFZT1VUX1RJTElOR19ZID0gMSA8PCBHRU42X1RJTElOR19ZLAorICAgTEFZT1VUX1RJTElOR19XID0gMSA8PCBHRU44X1RJTElOR19XLAorCisgICBMQVlPVVRfVElMSU5HX0FMTCA9IChMQVlPVVRfVElMSU5HX05PTkUgfAorICAgICAgICAgICAgICAgICAgICAgICAgTEFZT1VUX1RJTElOR19YIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIExBWU9VVF9USUxJTkdfWSB8CisgICAgICAgICAgICAgICAgICAgICAgICBMQVlPVVRfVElMSU5HX1cpCit9OworCitzdHJ1Y3QgaW50ZWxfbGF5b3V0X3BhcmFtcyB7CisgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXY7CisKKyAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdTsKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvOworICAgYm9vbCBzY2Fub3V0OworCisgICBib29sIGNvbXByZXNzZWQ7CisKKyAgIHVuc2lnbmVkIGgwLCBoMTsKKyAgIHVuc2lnbmVkIG1heF94LCBtYXhfeTsKK307CisKK3N0YXRpYyB2b2lkCitsYXlvdXRfZ2V0X3NsaWNlX3NpemUoY29uc3Qgc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9sYXlvdXRfcGFyYW1zICpwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkICp3aWR0aCwgdW5zaWduZWQgKmhlaWdodCkKK3sKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvID0gcGFyYW1zLT5pbmZvOworICAgdW5zaWduZWQgdywgaDsKKworICAgdyA9IHVfbWluaWZ5KGxheW91dC0+d2lkdGgwLCBsZXZlbCk7CisgICBoID0gdV9taW5pZnkobGF5b3V0LT5oZWlnaHQwLCBsZXZlbCk7CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDEsIHBhZ2UgMTE0OgorICAgICoKKyAgICAqICAgICAiVGhlIGRpbWVuc2lvbnMgb2YgdGhlIG1pcCBtYXBzIGFyZSBmaXJzdCBkZXRlcm1pbmVkIGJ5IGFwcGx5aW5nIHRoZQorICAgICogICAgICBzaXppbmcgYWxnb3JpdGhtIHByZXNlbnRlZCBpbiBOb24tUG93ZXItb2YtVHdvIE1pcG1hcHMgYWJvdmUuIFRoZW4sCisgICAgKiAgICAgIGlmIG5lY2Vzc2FyeSwgdGhleSBhcmUgcGFkZGVkIG91dCB0byBjb21wcmVzc2lvbiBibG9jayBib3VuZGFyaWVzLiIKKyAgICAqLworICAgdyA9IHVfYWxpZ24odywgbGF5b3V0LT5ibG9ja193aWR0aCk7CisgICBoID0gdV9hbGlnbihoLCBsYXlvdXQtPmJsb2NrX2hlaWdodCk7CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDEsIHBhZ2UgMTExOgorICAgICoKKyAgICAqICAgICAiSWYgdGhlIHN1cmZhY2UgaXMgbXVsdGlzYW1wbGVkICg0eCksIHRoZXNlIHZhbHVlcyBtdXN0IGJlIGFkanVzdGVkCisgICAgKiAgICAgIGFzIGZvbGxvd3MgYmVmb3JlIHByb2NlZWRpbmc6CisgICAgKgorICAgICogICAgICAgIFdfTCA9IGNlaWxpbmcoV19MIC8gMikgKiA0CisgICAgKiAgICAgICAgSF9MID0gY2VpbGluZyhIX0wgLyAyKSAqIDQiCisgICAgKgorICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSAxIHBhcnQgMSwgcGFnZSAxMDg6CisgICAgKgorICAgICogICAgICJJZiB0aGUgc3VyZmFjZSBpcyBtdWx0aXNhbXBsZWQgYW5kIGl0IGlzIGEgZGVwdGggb3Igc3RlbmNpbCBzdXJmYWNlCisgICAgKiAgICAgIG9yIE11bHRpc2FtcGxlZCBTdXJmYWNlIFN0b3JhZ2VGb3JtYXQgaW4gU1VSRkFDRV9TVEFURSBpcworICAgICogICAgICBNU0ZNVF9ERVBUSF9TVEVOQ0lMLCBXX0wgYW5kIEhfTCBtdXN0IGJlIGFkanVzdGVkIGFzIGZvbGxvd3MgYmVmb3JlCisgICAgKiAgICAgIHByb2NlZWRpbmc6CisgICAgKgorICAgICogICAgICAgICNzYW1wbGVzICBXX0wgPSAgICAgICAgICAgICAgICAgICAgSF9MID0KKyAgICAqICAgICAgICAyICAgICAgICAgY2VpbGluZyhXX0wgLyAyKSAqIDQgICAgIEhMIFtubyBhZGp1c3RtZW50XQorICAgICogICAgICAgIDQgICAgICAgICBjZWlsaW5nKFdfTCAvIDIpICogNCAgICAgY2VpbGluZyhIX0wgLyAyKSAqIDQKKyAgICAqICAgICAgICA4ICAgICAgICAgY2VpbGluZyhXX0wgLyAyKSAqIDggICAgIGNlaWxpbmcoSF9MIC8gMikgKiA0CisgICAgKiAgICAgICAgMTYgICAgICAgIGNlaWxpbmcoV19MIC8gMikgKiA4ICAgICBjZWlsaW5nKEhfTCAvIDIpICogOCIKKyAgICAqCisgICAgKiBGb3IgaW50ZXJsZWF2ZWQgc2FtcGxlcyAoNHgpLCB3aGVyZSBwaXhlbHMKKyAgICAqCisgICAgKiAgICh4LCB5ICApICh4KzEsIHkgICkKKyAgICAqICAgKHgsIHkrMSkgKHgrMSwgeSsxKQorICAgICoKKyAgICAqIHdvdWxkIGJlIGlzIG9jY3VwaWVkIGJ5CisgICAgKgorICAgICogICAoeCwgeSAgLCBzaTApICh4KzEsIHkgICwgc2kwKSAoeCwgeSAgLCBzaTEpICh4KzEsIHkgICwgc2kxKQorICAgICogICAoeCwgeSsxLCBzaTApICh4KzEsIHkrMSwgc2kwKSAoeCwgeSsxLCBzaTEpICh4KzEsIHkrMSwgc2kxKQorICAgICogICAoeCwgeSAgLCBzaTIpICh4KzEsIHkgICwgc2kyKSAoeCwgeSAgLCBzaTMpICh4KzEsIHkgICwgc2kzKQorICAgICogICAoeCwgeSsxLCBzaTIpICh4KzEsIHkrMSwgc2kyKSAoeCwgeSsxLCBzaTMpICh4KzEsIHkrMSwgc2kzKQorICAgICoKKyAgICAqIFRodXMgdGhlIG5lZWQgdG8KKyAgICAqCisgICAgKiAgIHcgPSBhbGlnbih3LCAyKSAqIDI7CisgICAgKiAgIHkgPSBhbGlnbih5LCAyKSAqIDI7CisgICAgKi8KKyAgIGlmIChsYXlvdXQtPmludGVybGVhdmVkX3NhbXBsZXMpIHsKKyAgICAgIHN3aXRjaCAoaW5mby0+c2FtcGxlcykgeworICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfMV9CSVQ6CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzJfQklUOgorICAgICAgICAgdyA9IHVfYWxpZ24odywgMikgKiAyOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZLX1NBTVBMRV9DT1VOVF80X0JJVDoKKyAgICAgICAgIHcgPSB1X2FsaWduKHcsIDIpICogMjsKKyAgICAgICAgIGggPSB1X2FsaWduKGgsIDIpICogMjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfOF9CSVQ6CisgICAgICAgICB3ID0gdV9hbGlnbih3LCAyKSAqIDQ7CisgICAgICAgICBoID0gdV9hbGlnbihoLCAyKSAqIDI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzE2X0JJVDoKKyAgICAgICAgIHcgPSB1X2FsaWduKHcsIDIpICogNDsKKyAgICAgICAgIGggPSB1X2FsaWduKGgsIDIpICogNDsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFzc2VydCghInVuc3VwcG9ydGVkIHNhbXBsZSBjb3VudCIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDEgcGFydCAxLCBwYWdlIDEwODoKKyAgICAqCisgICAgKiAgICAgIkZvciBzZXBhcmF0ZSBzdGVuY2lsIGJ1ZmZlciwgdGhlIHdpZHRoIG11c3QgYmUgbXV0aXBsaWVkIGJ5IDIgYW5kCisgICAgKiAgICAgIGhlaWdodCBkaXZpZGVkIGJ5IDIuLi4iCisgICAgKgorICAgICogVG8gbWFrZSB0aGluZ3MgZWFzaWVyIChmb3IgdHJhbnNmZXIpLCB3ZSB3aWxsIGp1c3QgZG91YmxlIHRoZSBzdGVuY2lsCisgICAgKiBzdHJpZGUgaW4gM0RTVEFURV9TVEVOQ0lMX0JVRkZFUi4KKyAgICAqLworICAgdyA9IHVfYWxpZ24odywgbGF5b3V0LT5hbGlnbl9pKTsKKyAgIGggPSB1X2FsaWduKGgsIGxheW91dC0+YWxpZ25faik7CisKKyAgICp3aWR0aCA9IHc7CisgICAqaGVpZ2h0ID0gaDsKK30KKworc3RhdGljIHVuc2lnbmVkCitsYXlvdXRfZ2V0X251bV9sYXllcnMoY29uc3Qgc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9sYXlvdXRfcGFyYW1zICpwYXJhbXMpCit7CisgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaW5mbyA9IHBhcmFtcy0+aW5mbzsKKyAgIHVuc2lnbmVkIG51bV9sYXllcnMgPSBpbmZvLT5hcnJheUxheWVyczsKKworICAgLyogc2FtcGxlcyBvZiB0aGUgc2FtZSBpbmRleCBhcmUgc3RvcmVkIGluIGEgbGF5ZXIgKi8KKyAgIGlmIChpbmZvLT5zYW1wbGVzICE9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCAmJiAhbGF5b3V0LT5pbnRlcmxlYXZlZF9zYW1wbGVzKQorICAgICAgbnVtX2xheWVycyAqPSAodWludDMyX3QpIGluZm8tPnNhbXBsZXM7CisKKyAgIHJldHVybiBudW1fbGF5ZXJzOworfQorCitzdGF0aWMgdm9pZAorbGF5b3V0X2luaXRfbGF5ZXJfaGVpZ2h0KHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbGF5b3V0X3BhcmFtcyAqcGFyYW1zKQoreworICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmluZm8gPSBwYXJhbXMtPmluZm87CisgICB1bnNpZ25lZCBudW1fbGF5ZXJzOworCisgICBpZiAobGF5b3V0LT53YWxrICE9IElOVEVMX0xBWU9VVF9XQUxLX0xBWUVSKQorICAgICAgcmV0dXJuOworCisgICBudW1fbGF5ZXJzID0gbGF5b3V0X2dldF9udW1fbGF5ZXJzKGxheW91dCwgcGFyYW1zKTsKKyAgIGlmIChudW1fbGF5ZXJzIDw9IDEpCisgICAgICByZXR1cm47CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDEsIHBhZ2UgMTE1OgorICAgICoKKyAgICAqICAgICAiVGhlIGZvbGxvd2luZyBlcXVhdGlvbiBpcyB1c2VkIGZvciBzdXJmYWNlIGZvcm1hdHMgb3RoZXIgdGhhbgorICAgICogICAgICBjb21wcmVzc2VkIHRleHR1cmVzOgorICAgICoKKyAgICAqICAgICAgICBRUGl0Y2ggPSAoaDAgKyBoMSArIDExaikiCisgICAgKgorICAgICogICAgICJUaGUgZXF1YXRpb24gZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKEJDKiBhbmQgRlhUMSBzdXJmYWNlIGZvcm1hdHMpCisgICAgKiAgICAgIGZvbGxvd3M6CisgICAgKgorICAgICogICAgICAgIFFQaXRjaCA9IChoMCArIGgxICsgMTFqKSAvIDQiCisgICAgKgorICAgICogICAgICJbRGV2U05CXSBFcnJhdGE6IFNhbXBsZXIgTVNBQSBRcGl0Y2ggd2lsbCBiZSA0IGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAqICAgICAgdmFsdWUgY2FsY3VsYXRlZCBpbiB0aGUgZXF1YXRpb24gYWJvdmUsIGZvciBldmVyeSBvdGhlciBvZGQgU3VyZmFjZQorICAgICogICAgICBIZWlnaHQgc3RhcnRpbmcgZnJvbSAxIGkuZS4gMSw1LDksMTMiCisgICAgKgorICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSAxIHBhcnQgMSwgcGFnZSAxMTEtMTEyOgorICAgICoKKyAgICAqICAgICAiSWYgU3VyZmFjZSBBcnJheSBTcGFjaW5nIGlzIHNldCB0byBBUllTUENfRlVMTCAobm90ZSB0aGF0IHRoZSBkZXB0aAorICAgICogICAgICBidWZmZXIgYW5kIHN0ZW5jaWwgYnVmZmVyIGhhdmUgYW4gaW1wbGllZCB2YWx1ZSBvZiBBUllTUENfRlVMTCk6CisgICAgKgorICAgICogICAgICAgIFFQaXRjaCA9IChoMCArIGgxICsgMTJqKQorICAgICogICAgICAgIFFQaXRjaCA9IChoMCArIGgxICsgMTJqKSAvIDQgKGNvbXByZXNzZWQpCisgICAgKgorICAgICogICAgICAoVGhlcmUgYXJlIG1hbnkgdHlwb3Mgb3IgbWlzc2luZyB3b3JkcyBoZXJlLi4uKSIKKyAgICAqCisgICAgKiBUbyBhY2Nlc3MgdGhlIE4tdGggc2xpY2UsIGFuIG9mZnNldCBvZiAoU3RyaWRlICogUVBpdGNoICogTikgaXMgYWRkZWQgdG8KKyAgICAqIHRoZSBiYXNlIGFkZHJlc3MuICBUaGUgUFJNIGRpdmlkZXMgUVBpdGNoIGJ5IDQgZm9yIGNvbXByZXNzZWQgZm9ybWF0cworICAgICogYmVjYXVzZSB0aGUgYmxvY2sgaGVpZ2h0IGZvciB0aG9zZSBmb3JtYXRzIGFyZSA0LCBhbmQgaXQgd2FudHMgUVBpdGNoIHRvCisgICAgKiBtZWFuIHRoZSBudW1iZXIgb2YgbWVtb3J5IHJvd3MsIGFzIG9wcG9zZWQgdG8gdGV4ZWwgcm93cywgYmV0d2VlbgorICAgICogc2xpY2VzLiAgU2luY2Ugd2UgdXNlIHRleGVsIHJvd3MgZXZlcnl3aGVyZSwgd2UgZG8gbm90IG5lZWQgdG8gZGl2aWRlCisgICAgKiBRUGl0Y2ggYnkgNC4KKyAgICAqLworICAgbGF5b3V0LT5sYXllcl9oZWlnaHQgPSBwYXJhbXMtPmgwICsgcGFyYW1zLT5oMSArCisgICAgICAoKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig3KSkgPyAxMiA6IDExKSAqIGxheW91dC0+YWxpZ25fajsKKworICAgaWYgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID09IElOVEVMX0dFTig2KSAmJgorICAgICAgIGluZm8tPnNhbXBsZXMgIT0gVktfU0FNUExFX0NPVU5UXzFfQklUICYmCisgICAgICAgbGF5b3V0LT5oZWlnaHQwICUgNCA9PSAxKQorICAgICAgbGF5b3V0LT5sYXllcl9oZWlnaHQgKz0gNDsKKworICAgcGFyYW1zLT5tYXhfeSArPSBsYXlvdXQtPmxheWVyX2hlaWdodCAqIChudW1fbGF5ZXJzIC0gMSk7Cit9CisKK3N0YXRpYyB2b2lkCitsYXlvdXRfaW5pdF9sb2RzKHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvID0gcGFyYW1zLT5pbmZvOworICAgdW5zaWduZWQgY3VyX3gsIGN1cl95OworICAgdW5zaWduZWQgbHY7CisKKyAgIGN1cl94ID0gMDsKKyAgIGN1cl95ID0gMDsKKyAgIGZvciAobHYgPSAwOyBsdiA8IGluZm8tPm1pcExldmVsczsgbHYrKykgeworICAgICAgdW5zaWduZWQgbG9kX3csIGxvZF9oOworCisgICAgICBsYXlvdXRfZ2V0X3NsaWNlX3NpemUobGF5b3V0LCBwYXJhbXMsIGx2LCAmbG9kX3csICZsb2RfaCk7CisKKyAgICAgIGxheW91dC0+bG9kc1tsdl0ueCA9IGN1cl94OworICAgICAgbGF5b3V0LT5sb2RzW2x2XS55ID0gY3VyX3k7CisgICAgICBsYXlvdXQtPmxvZHNbbHZdLnNsaWNlX3dpZHRoID0gbG9kX3c7CisgICAgICBsYXlvdXQtPmxvZHNbbHZdLnNsaWNlX2hlaWdodCA9IGxvZF9oOworCisgICAgICBzd2l0Y2ggKGxheW91dC0+d2FsaykgeworICAgICAgY2FzZSBJTlRFTF9MQVlPVVRfV0FMS19MT0Q6CisgICAgICAgICBsb2RfaCAqPSBsYXlvdXRfZ2V0X251bV9sYXllcnMobGF5b3V0LCBwYXJhbXMpOworICAgICAgICAgaWYgKGx2ID09IDEpCisgICAgICAgICAgICBjdXJfeCArPSBsb2RfdzsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN1cl95ICs9IGxvZF9oOworCisgICAgICAgICAvKiBldmVyeSBMT0QgYmVnaW5zIGF0IHRpbGUgYm91bmRhcmllcyAqLworICAgICAgICAgaWYgKGluZm8tPm1pcExldmVscyA+IDEpIHsKKyAgICAgICAgICAgIGFzc2VydChsYXlvdXQtPmZvcm1hdCA9PSBWS19GT1JNQVRfUzhfVUlOVCk7CisgICAgICAgICAgICBjdXJfeCA9IHVfYWxpZ24oY3VyX3gsIDY0KTsKKyAgICAgICAgICAgIGN1cl95ID0gdV9hbGlnbihjdXJfeSwgNjQpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElOVEVMX0xBWU9VVF9XQUxLX0xBWUVSOgorICAgICAgICAgLyogTUlQTEFZT1VUX0JFTE9XICovCisgICAgICAgICBpZiAobHYgPT0gMSkKKyAgICAgICAgICAgIGN1cl94ICs9IGxvZF93OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgY3VyX3kgKz0gbG9kX2g7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSU5URUxfTEFZT1VUX1dBTEtfM0Q6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBudW1fc2xpY2VzID0gdV9taW5pZnkoaW5mby0+ZXh0ZW50LmRlcHRoLCBsdik7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBudW1fc2xpY2VzX3Blcl9yb3cgPSAxIDw8IGx2OworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbnVtX3Jvd3MgPQorICAgICAgICAgICAgICAgKG51bV9zbGljZXMgKyBudW1fc2xpY2VzX3Blcl9yb3cgLSAxKSAvIG51bV9zbGljZXNfcGVyX3JvdzsKKworICAgICAgICAgICAgbG9kX3cgKj0gbnVtX3NsaWNlc19wZXJfcm93OworICAgICAgICAgICAgbG9kX2ggKj0gbnVtX3Jvd3M7CisKKyAgICAgICAgICAgIGN1cl95ICs9IGxvZF9oOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChwYXJhbXMtPm1heF94IDwgbGF5b3V0LT5sb2RzW2x2XS54ICsgbG9kX3cpCisgICAgICAgICBwYXJhbXMtPm1heF94ID0gbGF5b3V0LT5sb2RzW2x2XS54ICsgbG9kX3c7CisgICAgICBpZiAocGFyYW1zLT5tYXhfeSA8IGxheW91dC0+bG9kc1tsdl0ueSArIGxvZF9oKQorICAgICAgICAgcGFyYW1zLT5tYXhfeSA9IGxheW91dC0+bG9kc1tsdl0ueSArIGxvZF9oOworICAgfQorCisgICBpZiAobGF5b3V0LT53YWxrID09IElOVEVMX0xBWU9VVF9XQUxLX0xBWUVSKSB7CisgICAgICBwYXJhbXMtPmgwID0gbGF5b3V0LT5sb2RzWzBdLnNsaWNlX2hlaWdodDsKKworICAgICAgaWYgKGluZm8tPm1pcExldmVscyA+IDEpCisgICAgICAgICBwYXJhbXMtPmgxID0gbGF5b3V0LT5sb2RzWzFdLnNsaWNlX2hlaWdodDsKKyAgICAgIGVsc2UKKyAgICAgICAgIGxheW91dF9nZXRfc2xpY2Vfc2l6ZShsYXlvdXQsIHBhcmFtcywgMSwgJmN1cl94LCAmcGFyYW1zLT5oMSk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsYXlvdXRfaW5pdF9hbGlnbm1lbnRzKHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvID0gcGFyYW1zLT5pbmZvOworCisgICAvKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDEgcGFydCAxLCBwYWdlIDExMzoKKyAgICAqCisgICAgKiAgICAgInN1cmZhY2UgZm9ybWF0ICAgICAgICAgICBhbGlnbl9pICAgICBhbGlnbl9qCisgICAgKiAgICAgIFlVViA0OjI6MiBmb3JtYXRzICAgICAgICA0ICAgICAgICAgICAqc2VlIGJlbG93CisgICAgKiAgICAgIEJDMS01ICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICA0CisgICAgKiAgICAgIEZYVDEgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgICA0CisgICAgKiAgICAgIGFsbCBvdGhlciBmb3JtYXRzICAgICAgICA0ICAgICAgICAgICAqc2VlIGJlbG93IgorICAgICoKKyAgICAqICAgICAiLSBhbGlnbl9qID0gNCBmb3IgYW55IGRlcHRoIGJ1ZmZlcgorICAgICogICAgICAtIGFsaWduX2ogPSAyIGZvciBzZXBhcmF0ZSBzdGVuY2lsIGJ1ZmZlcgorICAgICogICAgICAtIGFsaWduX2ogPSA0IGZvciBhbnkgcmVuZGVyIHRhcmdldCBzdXJmYWNlIGlzIG11bHRpc2FtcGxlZCAoNHgpCisgICAgKiAgICAgIC0gYWxpZ25faiA9IDQgZm9yIGFueSByZW5kZXIgdGFyZ2V0IHN1cmZhY2Ugd2l0aCBTdXJmYWNlIFZlcnRpY2FsCisgICAgKiAgICAgICAgQWxpZ25tZW50ID0gVkFMSUdOXzQKKyAgICAqICAgICAgLSBhbGlnbl9qID0gMiBmb3IgYW55IHJlbmRlciB0YXJnZXQgc3VyZmFjZSB3aXRoIFN1cmZhY2UgVmVydGljYWwKKyAgICAqICAgICAgICBBbGlnbm1lbnQgPSBWQUxJR05fMgorICAgICogICAgICAtIGFsaWduX2ogPSAyIGZvciBhbGwgb3RoZXIgcmVuZGVyIHRhcmdldCBzdXJmYWNlCisgICAgKiAgICAgIC0gYWxpZ25faiA9IDIgZm9yIGFueSBzYW1wbGluZyBlbmdpbmUgc3VyZmFjZSB3aXRoIFN1cmZhY2UgVmVydGljYWwKKyAgICAqICAgICAgICBBbGlnbm1lbnQgPSBWQUxJR05fMgorICAgICogICAgICAtIGFsaWduX2ogPSA0IGZvciBhbnkgc2FtcGxpbmcgZW5naW5lIHN1cmZhY2Ugd2l0aCBTdXJmYWNlIFZlcnRpY2FsCisgICAgKiAgICAgICAgQWxpZ25tZW50ID0gVkFMSUdOXzQiCisgICAgKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDg2OgorICAgICoKKyAgICAqICAgICAiVGhpcyBmaWVsZCAoU3VyZmFjZSBWZXJ0aWNhbCBBbGlnbm1lbnQpIG11c3QgYmUgc2V0IHRvIFZBTElHTl8yIGlmCisgICAgKiAgICAgIHRoZSBTdXJmYWNlIEZvcm1hdCBpcyA5NiBiaXRzIHBlciBlbGVtZW50IChCUEUpLiIKKyAgICAqCisgICAgKiBUaGV5IGNhbiBiZSByZXBocmFzZWQgYXMKKyAgICAqCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbl9pICAgICAgICBhbGlnbl9qCisgICAgKiAgIGNvbXByZXNzZWQgZm9ybWF0cyAgICAgICAgICAgICBibG9jayB3aWR0aCAgICBibG9jayBoZWlnaHQKKyAgICAqICAgUElQRV9GT1JNQVRfUzhfVUlOVCAgICAgICAgICAgIDQgICAgICAgICAgICAgIDIKKyAgICAqICAgb3RoZXIgZGVwdGgvc3RlbmNpbCBmb3JtYXRzICAgIDQgICAgICAgICAgICAgIDQKKyAgICAqICAgNHggbXVsdGlzYW1wbGVkICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgIDQKKyAgICAqICAgYnBwIDk2ICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgIDIKKyAgICAqICAgb3RoZXJzICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgIDIgb3IgNAorICAgICovCisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDEgcGFydCAxLCBwYWdlIDExMDoKKyAgICAqCisgICAgKiAgICAgInN1cmZhY2UgZGVmaW5lZCBieSAgICAgIHN1cmZhY2UgZm9ybWF0ICAgICBhbGlnbl9pICAgICBhbGlnbl9qCisgICAgKiAgICAgIDNEU1RBVEVfREVQVEhfQlVGRkVSICAgIEQxNl9VTk9STSAgICAgICAgICA4ICAgICAgICAgICA0CisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBEMTZfVU5PUk0gICAgICA0ICAgICAgICAgICA0CisgICAgKiAgICAgIDNEU1RBVEVfU1RFTkNJTF9CVUZGRVIgIE4vQSAgICAgICAgICAgICAgICA4ICAgICAgICAgICA4CisgICAgKiAgICAgIFNVUkZBQ0VfU1RBVEUgICAgICAgICAgIEJDKiwgRVRDKiwgRUFDKiAgICA0ICAgICAgICAgICA0CisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVDEgICAgICAgICAgICAgICA4ICAgICAgICAgICA0CisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBvdGhlcnMgICAgICAgICAoc2V0IGJ5IFNVUkZBQ0VfU1RBVEUpIgorICAgICoKKyAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgNjM6CisgICAgKgorICAgICogICAgICItIFRoaXMgZmllbGQgKFN1cmZhY2UgVmVydGljYWwgQWxpZ21lbnQpIGlzIGludGVuZGVkIHRvIGJlIHNldCB0bworICAgICogICAgICAgIFZBTElHTl80IGlmIHRoZSBzdXJmYWNlIHdhcyByZW5kZXJlZCBhcyBhIGRlcHRoIGJ1ZmZlciwgZm9yIGEKKyAgICAqICAgICAgICBtdWx0aXNhbXBsZWQgKDR4KSByZW5kZXIgdGFyZ2V0LCBvciBmb3IgYSBtdWx0aXNhbXBsZWQgKDh4KQorICAgICogICAgICAgIHJlbmRlciB0YXJnZXQsIHNpbmNlIHRoZXNlIHN1cmZhY2VzIHN1cHBvcnQgb25seSBhbGlnbm1lbnQgb2YgNC4KKyAgICAqICAgICAgLSBVc2Ugb2YgVkFMSUdOXzQgZm9yIG90aGVyIHN1cmZhY2VzIGlzIHN1cHBvcnRlZCwgYnV0IHVzZXMgbW9yZQorICAgICogICAgICAgIG1lbW9yeS4KKyAgICAqICAgICAgLSBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIFZBTElHTl80IGZvciBhbGwgdGlsZWQgWSBSZW5kZXIgVGFyZ2V0CisgICAgKiAgICAgICAgc3VyZmFjZXMuCisgICAgKiAgICAgIC0gVmFsdWUgb2YgMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBmb3JtYXQgWUNSQ0JfTk9STUFMICgweDE4MiksCisgICAgKiAgICAgICAgWUNSQ0JfU1dBUFVWWSAoMHgxODMpLCBZQ1JDQl9TV0FQVVYgKDB4MThmKSwgWUNSQ0JfU1dBUFkgKDB4MTkwKQorICAgICogICAgICAtIElmIE51bWJlciBvZiBNdWx0aXNhbXBsZXMgaXMgbm90IE1VTFRJU0FNUExFQ09VTlRfMSwgdGhpcyBmaWVsZAorICAgICogICAgICAgIG11c3QgYmUgc2V0IHRvIFZBTElHTl80LiIKKyAgICAqICAgICAgLSBWQUxJR05fNCBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdXJmYWNlIGZvcm1hdCBSMzJHMzJCMzJfRkxPQVQuIgorICAgICoKKyAgICAqICAgICAiLSBUaGlzIGZpZWxkIChTdXJmYWNlIEhvcml6b250YWwgQWxpZ21lbnQpIGlzIGludGVuZGVkIHRvIGJlIHNldCB0bworICAgICogICAgICAgIEhBTElHTl84IG9ubHkgaWYgdGhlIHN1cmZhY2Ugd2FzIHJlbmRlcmVkIGFzIGEgZGVwdGggYnVmZmVyIHdpdGgKKyAgICAqICAgICAgICBaMTYgZm9ybWF0IG9yIGEgc3RlbmNpbCBidWZmZXIsIHNpbmNlIHRoZXNlIHN1cmZhY2VzIHN1cHBvcnQgb25seQorICAgICogICAgICAgIGFsaWdubWVudCBvZiA4LgorICAgICogICAgICAtIFVzZSBvZiBIQUxJR05fOCBmb3Igb3RoZXIgc3VyZmFjZXMgaXMgc3VwcG9ydGVkLCBidXQgdXNlcyBtb3JlCisgICAgKiAgICAgICAgbWVtb3J5LgorICAgICogICAgICAtIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gSEFMSUdOXzQgaWYgdGhlIFN1cmZhY2UgRm9ybWF0IGlzIEJDKi4KKyAgICAqICAgICAgLSBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIEhBTElHTl84IGlmIHRoZSBTdXJmYWNlIEZvcm1hdCBpcworICAgICogICAgICAgIEZYVDEuIgorICAgICoKKyAgICAqIFRoZXkgY2FuIGJlIHJlcGhyYXNlZCBhcworICAgICoKKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduX2kgICAgICAgIGFsaWduX2oKKyAgICAqICBjb21wcmVzc2VkIGZvcm1hdHMgICAgICAgICAgICAgIGJsb2NrIHdpZHRoICAgIGJsb2NrIGhlaWdodAorICAgICogIFBJUEVfRk9STUFUX1oxNl9VTk9STSAgICAgICAgICAgOCAgICAgICAgICAgICAgNAorICAgICogIFBJUEVfRk9STUFUX1M4X1VJTlQgICAgICAgICAgICAgOCAgICAgICAgICAgICAgOAorICAgICogIG90aGVyIGRlcHRoL3N0ZW5jaWwgZm9ybWF0cyAgICAgNCAgICAgICAgICAgICAgNAorICAgICogIDJ4IG9yIDR4IG11bHRpc2FtcGxlZCAgICAgICAgICAgNCBvciA4ICAgICAgICAgNAorICAgICogIHRpbGVkIFkgICAgICAgICAgICAgICAgICAgICAgICAgNCBvciA4ICAgICAgICAgNCAoaWYgcnQpCisgICAgKiAgUElQRV9GT1JNQVRfUjMyRzMyQjMyX0ZMT0FUICAgICA0IG9yIDggICAgICAgICAyCisgICAgKiAgb3RoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICA0IG9yIDggICAgICAgICAyIG9yIDQKKyAgICAqLworCisgICBpZiAocGFyYW1zLT5jb21wcmVzc2VkKSB7CisgICAgICAvKiB0aGlzIGhhcHBlbnMgdG8gYmUgdGhlIGNhc2UgKi8KKyAgICAgIGxheW91dC0+YWxpZ25faSA9IGxheW91dC0+YmxvY2tfd2lkdGg7CisgICAgICBsYXlvdXQtPmFsaWduX2ogPSBsYXlvdXQtPmJsb2NrX2hlaWdodDsKKyAgIH0gZWxzZSBpZiAoaW5mby0+dXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSB7CisgICAgICBpZiAoaW50ZWxfZ3B1X2dlbihwYXJhbXMtPmdwdSkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICAgICBzd2l0Y2ggKGxheW91dC0+Zm9ybWF0KSB7CisgICAgICAgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk06CisgICAgICAgICAgICBsYXlvdXQtPmFsaWduX2kgPSA4OworICAgICAgICAgICAgbGF5b3V0LT5hbGlnbl9qID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBWS19GT1JNQVRfUzhfVUlOVDoKKyAgICAgICAgICAgIGxheW91dC0+YWxpZ25faSA9IDg7CisgICAgICAgICAgICBsYXlvdXQtPmFsaWduX2ogPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbGF5b3V0LT5hbGlnbl9pID0gNDsKKyAgICAgICAgICAgIGxheW91dC0+YWxpZ25faiA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBzd2l0Y2ggKGxheW91dC0+Zm9ybWF0KSB7CisgICAgICAgICBjYXNlIFZLX0ZPUk1BVF9TOF9VSU5UOgorICAgICAgICAgICAgbGF5b3V0LT5hbGlnbl9pID0gNDsKKyAgICAgICAgICAgIGxheW91dC0+YWxpZ25faiA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsYXlvdXQtPmFsaWduX2kgPSA0OworICAgICAgICAgICAgbGF5b3V0LT5hbGlnbl9qID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGJvb2wgdmFsaWduXzQgPQorICAgICAgICAgKGluZm8tPnNhbXBsZXMgIT0gVktfU0FNUExFX0NPVU5UXzFfQklUKSB8fAorICAgICAgICAgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig4KSkgfHwKKyAgICAgICAgIChpbnRlbF9ncHVfZ2VuKHBhcmFtcy0+Z3B1KSA+PSBJTlRFTF9HRU4oNykgJiYKKyAgICAgICAgICBsYXlvdXQtPnRpbGluZyA9PSBHRU42X1RJTElOR19ZICYmCisgICAgICAgICAgKGluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQpKTsKKworICAgICAgaWYgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig3KSAmJgorICAgICAgICAgIGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpIDw9IElOVEVMX0dFTig3LjUpICYmIHZhbGlnbl80KQorICAgICAgICAgYXNzZXJ0KGxheW91dC0+Zm9ybWF0ICE9IFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUKTsKKworICAgICAgbGF5b3V0LT5hbGlnbl9pID0gNDsKKyAgICAgIGxheW91dC0+YWxpZ25faiA9ICh2YWxpZ25fNCkgPyA0IDogMjsKKyAgIH0KKworICAgLyoKKyAgICAqIHRoZSBmYWN0IHRoYXQgYWxpZ24gaSBhbmQgaiBhcmUgbXVsdGlwbGVzIG9mIGJsb2NrIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAqIHJlc3BlY3RpdmVseSBpcyB3aGF0IG1ha2VzIHRoZSBzaXplIG9mIHRoZSBibyBhIG11bHRpcGxlIG9mIHRoZSBibG9jaworICAgICogc2l6ZSwgc2xpY2VzIHN0YXJ0IGF0IGJsb2NrIGJvdW5kYXJpZXMsIGFuZCBtYW55IG9mIHRoZSBjb21wdXRhdGlvbnMKKyAgICAqIHdvcmsuCisgICAgKi8KKyAgIGFzc2VydChsYXlvdXQtPmFsaWduX2kgJSBsYXlvdXQtPmJsb2NrX3dpZHRoID09IDApOworICAgYXNzZXJ0KGxheW91dC0+YWxpZ25faiAlIGxheW91dC0+YmxvY2tfaGVpZ2h0ID09IDApOworCisgICAvKiBtYWtlIHN1cmUgdV9hbGlnbigpIHdvcmtzICovCisgICBhc3NlcnQodV9pc19wb3cyKGxheW91dC0+YWxpZ25faSkgJiYKKyAgICAgICAgICB1X2lzX3BvdzIobGF5b3V0LT5hbGlnbl9qKSk7CisgICBhc3NlcnQodV9pc19wb3cyKGxheW91dC0+YmxvY2tfd2lkdGgpICYmCisgICAgICAgICAgdV9pc19wb3cyKGxheW91dC0+YmxvY2tfaGVpZ2h0KSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorbGF5b3V0X2dldF92YWxpZF90aWxpbmdzKGNvbnN0IHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0X3BhcmFtcyAqcGFyYW1zKQoreworICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmluZm8gPSBwYXJhbXMtPmluZm87CisgICBjb25zdCBWa0Zvcm1hdCBmb3JtYXQgPSBsYXlvdXQtPmZvcm1hdDsKKyAgIHVuc2lnbmVkIHZhbGlkX3RpbGluZ3MgPSBMQVlPVVRfVElMSU5HX0FMTDsKKworICAgLyoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSAxIHBhcnQgMiwgcGFnZSAzMjoKKyAgICAqCisgICAgKiAgICAgIkRpc3BsYXkvT3ZlcmxheSAgIFktTWFqb3Igbm90IHN1cHBvcnRlZC4KKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgWC1NYWpvciByZXF1aXJlZCBmb3IgQXN5bmMgRmxpcHMiCisgICAgKi8KKyAgIGlmIChwYXJhbXMtPnNjYW5vdXQpCisgICAgICAgdmFsaWRfdGlsaW5ncyAmPSBMQVlPVVRfVElMSU5HX1g7CisKKyAgIGlmIChpbmZvLT50aWxpbmcgPT0gVktfSU1BR0VfVElMSU5HX0xJTkVBUikKKyAgICAgICB2YWxpZF90aWxpbmdzICY9IExBWU9VVF9USUxJTkdfTk9ORTsKKworICAgLyoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSAzMTg6CisgICAgKgorICAgICogICAgICJbRGV2U05CK106IFRoaXMgZmllbGQgKFRpbGVkIFN1cmZhY2UpIG11c3QgYmUgc2V0IHRvIFRSVUUuIExpbmVhcgorICAgICogICAgICBEZXB0aCBCdWZmZXIgaXMgbm90IHN1cHBvcnRlZC4iCisgICAgKgorICAgICogICAgICJUaGUgRGVwdGggQnVmZmVyLCBpZiB0aWxlZCwgbXVzdCB1c2UgWS1NYWpvciB0aWxpbmcuIgorICAgICoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSAxIHBhcnQgMiwgcGFnZSAyMjoKKyAgICAqCisgICAgKiAgICAgIlctTWFqb3IgVGlsZSBGb3JtYXQgaXMgdXNlZCBmb3Igc2VwYXJhdGUgc3RlbmNpbC4iCisgICAgKi8KKyAgIGlmIChpbmZvLT51c2FnZSAmIFZLX0lNQUdFX1VTQUdFX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF9CSVQpIHsKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICBjYXNlIFZLX0ZPUk1BVF9TOF9VSU5UOgorICAgICAgICAgdmFsaWRfdGlsaW5ncyAmPSBMQVlPVVRfVElMSU5HX1c7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICB2YWxpZF90aWxpbmdzICY9IExBWU9VVF9USUxJTkdfWTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorCisgICBpZiAoaW5mby0+dXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCkgeworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSAxIHBhcnQgMiwgcGFnZSAzMjoKKyAgICAgICAqCisgICAgICAgKiAgICAgIk5PVEU6IDEyOEJQRSBGb3JtYXQgQ29sb3IgYnVmZmVyICggcmVuZGVyIHRhcmdldCApIE1VU1QgYmUKKyAgICAgICAqICAgICAgZWl0aGVyIFRpbGVYIG9yIExpbmVhci4iCisgICAgICAgKgorICAgICAgICogRnJvbSB0aGUgSGFzd2VsbCBQUk0sIHZvbHVtZSA1LCBwYWdlIDMyOgorICAgICAgICoKKyAgICAgICAqICAgICAiTk9URTogMTI4IEJQUCBmb3JtYXQgY29sb3IgYnVmZmVyIChyZW5kZXIgdGFyZ2V0KSBzdXBwb3J0cworICAgICAgICogICAgICBMaW5lYXIsIFRpbGVkWCBhbmQgVGlsZWRZLiIKKyAgICAgICAqLworICAgICAgaWYgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpIDwgSU5URUxfR0VOKDcuNSkgJiYgbGF5b3V0LT5ibG9ja19zaXplID09IDE2KQorICAgICAgICAgdmFsaWRfdGlsaW5ncyAmPSB+TEFZT1VUX1RJTElOR19ZOworCisgICAgICAvKgorICAgICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA2MzoKKyAgICAgICAqCisgICAgICAgKiAgICAgIlRoaXMgZmllbGQgKFN1cmZhY2UgVmVydGljYWwgQWxpZ21lbnQpIG11c3QgYmUgc2V0IHRvIFZBTElHTl80CisgICAgICAgKiAgICAgIGZvciBhbGwgdGlsZWQgWSBSZW5kZXIgVGFyZ2V0IHN1cmZhY2VzLiIKKyAgICAgICAqCisgICAgICAgKiAgICAgIlZBTElHTl80IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHN1cmZhY2UgZm9ybWF0IFIzMkczMkIzMl9GTE9BVC4iCisgICAgICAgKi8KKyAgICAgIGlmIChpbnRlbF9ncHVfZ2VuKHBhcmFtcy0+Z3B1KSA+PSBJTlRFTF9HRU4oNykgJiYKKyAgICAgICAgICBpbnRlbF9ncHVfZ2VuKHBhcmFtcy0+Z3B1KSA8PSBJTlRFTF9HRU4oNy41KSAmJgorICAgICAgICAgIGxheW91dC0+Zm9ybWF0ID09IFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUKQorICAgICAgICAgdmFsaWRfdGlsaW5ncyAmPSB+TEFZT1VUX1RJTElOR19ZOworCisgICAgICB2YWxpZF90aWxpbmdzICY9IH5MQVlPVVRfVElMSU5HX1c7CisgICB9CisKKyAgIGlmIChpbmZvLT51c2FnZSAmIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUKSB7CisgICAgICBpZiAoaW50ZWxfZ3B1X2dlbihwYXJhbXMtPmdwdSkgPCBJTlRFTF9HRU4oOCkpCisgICAgICAgICB2YWxpZF90aWxpbmdzICY9IH5MQVlPVVRfVElMSU5HX1c7CisgICB9CisKKyAgIC8qIG5vIGNvbmZsaWN0aW5nIGJpbmRpbmcgZmxhZ3MgKi8KKyAgIGFzc2VydCh2YWxpZF90aWxpbmdzKTsKKworICAgcmV0dXJuIHZhbGlkX3RpbGluZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitsYXlvdXRfaW5pdF90aWxpbmcoc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9sYXlvdXRfcGFyYW1zICpwYXJhbXMpCit7CisgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaW5mbyA9IHBhcmFtcy0+aW5mbzsKKyAgIHVuc2lnbmVkIHByZWZlcnJlZF90aWxpbmdzOworCisgICBsYXlvdXQtPnZhbGlkX3RpbGluZ3MgPSBsYXlvdXRfZ2V0X3ZhbGlkX3RpbGluZ3MobGF5b3V0LCBwYXJhbXMpOworCisgICBwcmVmZXJyZWRfdGlsaW5ncyA9IGxheW91dC0+dmFsaWRfdGlsaW5nczsKKworICAgLyogbm8gZmVuY2luZyBub3IgQkxUIHN1cHBvcnQgKi8KKyAgIGlmIChwcmVmZXJyZWRfdGlsaW5ncyAmIH5MQVlPVVRfVElMSU5HX1cpCisgICAgICBwcmVmZXJyZWRfdGlsaW5ncyAmPSB+TEFZT1VUX1RJTElOR19XOworCisgICBpZiAoaW5mby0+dXNhZ2UgJiAoVktfSU1BR0VfVVNBR0VfQ09MT1JfQVRUQUNITUVOVF9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklUKSkgeworICAgICAgLyoKKyAgICAgICAqIGhldXJpc3RpY2FsbHkgc2V0IGEgbWluaW11bSB3aWR0aC9oZWlnaHQgZm9yIGVuYWJsaW5nIHRpbGluZworICAgICAgICovCisgICAgICBpZiAobGF5b3V0LT53aWR0aDAgPCA2NCAmJiAocHJlZmVycmVkX3RpbGluZ3MgJiB+TEFZT1VUX1RJTElOR19YKSkKKyAgICAgICAgIHByZWZlcnJlZF90aWxpbmdzICY9IH5MQVlPVVRfVElMSU5HX1g7CisKKyAgICAgIGlmICgobGF5b3V0LT53aWR0aDAgPCAzMiB8fCBsYXlvdXQtPmhlaWdodDAgPCAxNikgJiYKKyAgICAgICAgICAobGF5b3V0LT53aWR0aDAgPCAxNiB8fCBsYXlvdXQtPmhlaWdodDAgPCAzMikgJiYKKyAgICAgICAgICAocHJlZmVycmVkX3RpbGluZ3MgJiB+TEFZT1VUX1RJTElOR19ZKSkKKyAgICAgICAgIHByZWZlcnJlZF90aWxpbmdzICY9IH5MQVlPVVRfVElMSU5HX1k7CisgICB9IGVsc2UgeworICAgICAgLyogZm9yY2UgbGluZWFyIGlmIHdlIGFyZSBub3Qgc3VyZSB3aGVyZSB0aGUgdGV4dHVyZSBpcyBib3VuZCB0byAqLworICAgICAgaWYgKHByZWZlcnJlZF90aWxpbmdzICYgTEFZT1VUX1RJTElOR19OT05FKQorICAgICAgICAgcHJlZmVycmVkX3RpbGluZ3MgJj0gTEFZT1VUX1RJTElOR19OT05FOworICAgfQorCisgICAvKiBwcmVmZXIgdGlsZWQgb3ZlciBsaW5lYXIgKi8KKyAgIGlmIChwcmVmZXJyZWRfdGlsaW5ncyAmIExBWU9VVF9USUxJTkdfWSkKKyAgICAgIGxheW91dC0+dGlsaW5nID0gR0VONl9USUxJTkdfWTsKKyAgIGVsc2UgaWYgKHByZWZlcnJlZF90aWxpbmdzICYgTEFZT1VUX1RJTElOR19YKQorICAgICAgbGF5b3V0LT50aWxpbmcgPSBHRU42X1RJTElOR19YOworICAgZWxzZSBpZiAocHJlZmVycmVkX3RpbGluZ3MgJiBMQVlPVVRfVElMSU5HX1cpCisgICAgICBsYXlvdXQtPnRpbGluZyA9IEdFTjhfVElMSU5HX1c7CisgICBlbHNlCisgICAgICBsYXlvdXQtPnRpbGluZyA9IEdFTjZfVElMSU5HX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitsYXlvdXRfaW5pdF93YWxrX2dlbjcoc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvID0gcGFyYW1zLT5pbmZvOworCisgICAvKgorICAgICogSXQgaXMgbm90IGV4cGxpY2l0bHkgc3RhdGVzLCBidXQgcmVuZGVyIHRhcmdldHMgYXJlIGV4cGVjdGVkIHRvIGJlCisgICAgKiBVTVMvQ01TIChzYW1wbGVzIG5vbi1pbnRlcmxlYXZlZCkgYW5kIGRlcHRoL3N0ZW5jaWwgYnVmZmVycyBhcmUgZXhwZWN0ZWQKKyAgICAqIHRvIGJlIElNUyAoc2FtcGxlcyBpbnRlcmxlYXZlZCkuCisgICAgKgorICAgICogU2VlICJNdWx0aXNhbXBsZWQgU3VyZmFjZSBTdG9yYWdlIEZvcm1hdCIgZmllbGQgb2YgU1VSRkFDRV9TVEFURS4KKyAgICAqLworICAgaWYgKGluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkgeworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDEsIHBhZ2UgMTExOgorICAgICAgICoKKyAgICAgICAqICAgICAibm90ZSB0aGF0IHRoZSBkZXB0aCBidWZmZXIgYW5kIHN0ZW5jaWwgYnVmZmVyIGhhdmUgYW4gaW1wbGllZAorICAgICAgICogICAgICB2YWx1ZSBvZiBBUllTUENfRlVMTCIKKyAgICAgICAqLworICAgICAgbGF5b3V0LT53YWxrID0gKGluZm8tPmltYWdlVHlwZSA9PSBWS19JTUFHRV9UWVBFXzNEKSA/CisgICAgICAgICBJTlRFTF9MQVlPVVRfV0FMS18zRCA6IElOVEVMX0xBWU9VVF9XQUxLX0xBWUVSOworCisgICAgICBsYXlvdXQtPmludGVybGVhdmVkX3NhbXBsZXMgPSB0cnVlOworICAgfSBlbHNlIHsKKyAgICAgIC8qCisgICAgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDY2OgorICAgICAgICoKKyAgICAgICAqICAgICAiSWYgTXVsdGlzYW1wbGVkIFN1cmZhY2UgU3RvcmFnZSBGb3JtYXQgaXMgTVNGTVRfTVNTIGFuZCBOdW1iZXIKKyAgICAgICAqICAgICAgb2YgTXVsdGlzYW1wbGVzIGlzIG5vdCBNVUxUSVNBTVBMRUNPVU5UXzEsIHRoaXMgZmllbGQgKFN1cmZhY2UKKyAgICAgICAqICAgICAgQXJyYXkgU3BhY2luZykgbXVzdCBiZSBzZXQgdG8gQVJZU1BDX0xPRDAuIgorICAgICAgICoKKyAgICAgICAqIEFzIG11bHRpc2FtcGxlZCByZXNvdXJjZXMgYXJlIG5vdCBtaXBtYXBwZWQsIHdlIG5ldmVyIHVzZQorICAgICAgICogQVJZU1BDX0ZVTEwgZm9yIHRoZW0uCisgICAgICAgKi8KKyAgICAgIGlmIChpbmZvLT5zYW1wbGVzICE9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCkKKyAgICAgICAgIGFzc2VydChpbmZvLT5taXBMZXZlbHMgPT0gMSk7CisKKyAgICAgIGxheW91dC0+d2FsayA9CisgICAgICAgICAoaW5mby0+aW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfM0QpID8gSU5URUxfTEFZT1VUX1dBTEtfM0QgOgorICAgICAgICAgKGluZm8tPm1pcExldmVscyA+IDEpID8gSU5URUxfTEFZT1VUX1dBTEtfTEFZRVIgOgorICAgICAgICAgSU5URUxfTEFZT1VUX1dBTEtfTE9EOworCisgICAgICBsYXlvdXQtPmludGVybGVhdmVkX3NhbXBsZXMgPSBmYWxzZTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQKK2xheW91dF9pbml0X3dhbGtfZ2VuNihzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDEsIHBhZ2UgMTE1OgorICAgICoKKyAgICAqICAgICAiVGhlIHNlcGFyYXRlIHN0ZW5jaWwgYnVmZmVyIGRvZXMgbm90IHN1cHBvcnQgbWlwIG1hcHBpbmcsIHRodXMgdGhlCisgICAgKiAgICAgIHN0b3JhZ2UgZm9yIExPRHMgb3RoZXIgdGhhbiBMT0QgMCBpcyBub3QgbmVlZGVkLiBUaGUgZm9sbG93aW5nCisgICAgKiAgICAgIFFQaXRjaCBlcXVhdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIHNlcGFyYXRlIHN0ZW5jaWwgYnVmZmVyOgorICAgICoKKyAgICAqICAgICAgICBRUGl0Y2ggPSBoXzAiCisgICAgKgorICAgICogR0VONiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBhY3Qgc3BhY2luZyBvdGhlcndpc2UuCisgICAgKi8KKyAgIGxheW91dC0+d2FsayA9CisgICAgICAocGFyYW1zLT5pbmZvLT5pbWFnZVR5cGUgPT0gVktfSU1BR0VfVFlQRV8zRCkgPyBJTlRFTF9MQVlPVVRfV0FMS18zRCA6CisgICAgICAobGF5b3V0LT5mb3JtYXQgPT0gVktfRk9STUFUX1M4X1VJTlQpID8gSU5URUxfTEFZT1VUX1dBTEtfTE9EIDoKKyAgICAgIElOVEVMX0xBWU9VVF9XQUxLX0xBWUVSOworCisgICAvKiBHRU42IHN1cHBvcnRzIG9ubHkgaW50ZXJsZWF2ZWQgc2FtcGxlcyAqLworICAgbGF5b3V0LT5pbnRlcmxlYXZlZF9zYW1wbGVzID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK2xheW91dF9pbml0X3dhbGsoc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbGF5b3V0X3BhcmFtcyAqcGFyYW1zKQoreworICAgaWYgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig3KSkKKyAgICAgIGxheW91dF9pbml0X3dhbGtfZ2VuNyhsYXlvdXQsIHBhcmFtcyk7CisgICBlbHNlCisgICAgICBsYXlvdXRfaW5pdF93YWxrX2dlbjYobGF5b3V0LCBwYXJhbXMpOworfQorCitzdGF0aWMgdm9pZAorbGF5b3V0X2luaXRfc2l6ZV9hbmRfZm9ybWF0KHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbGF5b3V0X3BhcmFtcyAqcGFyYW1zKQoreworICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmluZm8gPSBwYXJhbXMtPmluZm87CisgICBWa0Zvcm1hdCBmb3JtYXQgPSBpbmZvLT5mb3JtYXQ7CisgICBib29sIHJlcXVpcmVfc2VwYXJhdGVfc3RlbmNpbCA9IGZhbHNlOworCisgICBsYXlvdXQtPndpZHRoMCA9IGluZm8tPmV4dGVudC53aWR0aDsKKyAgIGxheW91dC0+aGVpZ2h0MCA9IGluZm8tPmV4dGVudC5oZWlnaHQ7CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzE3OgorICAgICoKKyAgICAqICAgICAiVGhpcyBmaWVsZCAoU2VwYXJhdGUgU3RlbmNpbCBCdWZmZXIgRW5hYmxlKSBtdXN0IGJlIHNldCB0byB0aGUgc2FtZQorICAgICogICAgICB2YWx1ZSAoZW5hYmxlZCBvciBkaXNhYmxlZCkgYXMgSGllcmFyY2hpY2FsIERlcHRoIEJ1ZmZlciBFbmFibGUuIgorICAgICoKKyAgICAqIEdFTjcrIHJlcXVpcmVzIHNlcGFyYXRlIHN0ZW5jaWwgYnVmZmVycy4KKyAgICAqLworICAgaWYgKGluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkgeworICAgICAgaWYgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig3KSkKKyAgICAgICAgIHJlcXVpcmVfc2VwYXJhdGVfc3RlbmNpbCA9IHRydWU7CisgICAgICBlbHNlCisgICAgICAgICByZXF1aXJlX3NlcGFyYXRlX3N0ZW5jaWwgPSAobGF5b3V0LT5hdXggPT0gSU5URUxfTEFZT1VUX0FVWF9ISVopOworICAgfQorCisgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgY2FzZSBWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQ6CisgICAgICBpZiAocmVxdWlyZV9zZXBhcmF0ZV9zdGVuY2lsKSB7CisgICAgICAgICBmb3JtYXQgPSBWS19GT1JNQVRfWDhfRDI0X1VOT1JNX1BBQ0szMjsKKyAgICAgICAgIGxheW91dC0+c2VwYXJhdGVfc3RlbmNpbCA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgVktfRk9STUFUX0QzMl9TRkxPQVRfUzhfVUlOVDoKKyAgICAgIGlmIChyZXF1aXJlX3NlcGFyYXRlX3N0ZW5jaWwpIHsKKyAgICAgICAgIGZvcm1hdCA9IFZLX0ZPUk1BVF9EMzJfU0ZMT0FUOworICAgICAgICAgbGF5b3V0LT5zZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgfQorCisgICBsYXlvdXQtPmZvcm1hdCA9IGZvcm1hdDsKKyAgIGxheW91dC0+YmxvY2tfd2lkdGggPSBpY2RfZm9ybWF0X2dldF9ibG9ja193aWR0aChmb3JtYXQpOworICAgbGF5b3V0LT5ibG9ja19oZWlnaHQgPSBsYXlvdXQtPmJsb2NrX3dpZHRoOworICAgbGF5b3V0LT5ibG9ja19zaXplID0gaWNkX2Zvcm1hdF9nZXRfc2l6ZShmb3JtYXQpOworCisgICBwYXJhbXMtPmNvbXByZXNzZWQgPSBpY2RfZm9ybWF0X2lzX2NvbXByZXNzZWQoZm9ybWF0KTsKK30KKworc3RhdGljIGJvb2wKK2xheW91dF93YW50X21jcyhzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvID0gcGFyYW1zLT5pbmZvOworICAgYm9vbCB3YW50X21jcyA9IGZhbHNlOworCisgICAvKiBNQ1MgaXMgZm9yIFJUIG9uIEdFTjcrICovCisgICBpZiAoaW50ZWxfZ3B1X2dlbihwYXJhbXMtPmdwdSkgPCBJTlRFTF9HRU4oNykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmIChpbmZvLT5pbWFnZVR5cGUgIT0gVktfSU1BR0VfVFlQRV8yRCB8fAorICAgICAgICEoaW5mby0+dXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDc3OgorICAgICoKKyAgICAqICAgICAiRm9yIFJlbmRlciBUYXJnZXQgYW5kIFNhbXBsaW5nIEVuZ2luZSBTdXJmYWNlczpJZiB0aGUgc3VyZmFjZSBpcworICAgICogICAgICBtdWx0aXNhbXBsZWQgKE51bWJlciBvZiBNdWx0aXNhbXBsZXMgYW55IHZhbHVlIG90aGVyIHRoYW4KKyAgICAqICAgICAgTVVMVElTQU1QTEVDT1VOVF8xKSwgdGhpcyBmaWVsZCAoTUNTIEVuYWJsZSkgbXVzdCBiZSBlbmFibGVkLiIKKyAgICAqCisgICAgKiAgICAgIlRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gMCBmb3IgYWxsIFNJTlQgTVNSVHMgd2hlbiBhbGwgUlQgY2hhbm5lbHMKKyAgICAqICAgICAgYXJlIG5vdCB3cml0dGVuIgorICAgICovCisgICBpZiAoaW5mby0+c2FtcGxlcyAhPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQgJiYKKyAgICAgICAhaWNkX2Zvcm1hdF9pc19pbnQoaW5mby0+Zm9ybWF0KSkgeworICAgICAgd2FudF9tY3MgPSB0cnVlOworICAgfSBlbHNlIGlmIChpbmZvLT5zYW1wbGVzID09IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCkgeworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzI2OgorICAgICAgICoKKyAgICAgICAqICAgICAiV2hlbiBNQ1MgaXMgYnVmZmVyIGlzIHVzZWQgZm9yIGNvbG9yIGNsZWFyIG9mIG5vbi1tdWx0aXNhbXBsZXIKKyAgICAgICAqICAgICAgcmVuZGVyIHRhcmdldCwgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnMgYXBwbHkuCisgICAgICAgKiAgICAgIC0gU3VwcG9ydCBpcyBsaW1pdGVkIHRvIHRpbGVkIHJlbmRlciB0YXJnZXRzLgorICAgICAgICogICAgICAtIFN1cHBvcnQgaXMgZm9yIG5vbi1taXAtbWFwcGVkIGFuZCBub24tYXJyYXkgc3VyZmFjZSB0eXBlcworICAgICAgICogICAgICAgIG9ubHkuCisgICAgICAgKiAgICAgIC0gQ2xlYXIgaXMgc3VwcG9ydGVkIG9ubHkgb24gdGhlIGZ1bGwgUlQ7IGkuZS4sIG5vIHBhcnRpYWwgY2xlYXIKKyAgICAgICAqICAgICAgICBvciBvdmVybGFwcGluZyBjbGVhcnMuCisgICAgICAgKiAgICAgIC0gTUNTIGJ1ZmZlciBmb3Igbm9uLU1TUlQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIFJUIGZvcm1hdHMKKyAgICAgICAqICAgICAgICAzMmJwcCwgNjRicHAgYW5kIDEyOGJwcC4KKyAgICAgICAqICAgICAgLi4uIgorICAgICAgICovCisgICAgICBpZiAobGF5b3V0LT50aWxpbmcgIT0gR0VONl9USUxJTkdfTk9ORSAmJgorICAgICAgICAgIGluZm8tPm1pcExldmVscyA9PSAxICYmIGluZm8tPmFycmF5TGF5ZXJzID09IDEpIHsKKyAgICAgICAgIHN3aXRjaCAobGF5b3V0LT5ibG9ja19zaXplKSB7CisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICBjYXNlIDg6CisgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgd2FudF9tY3MgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiB3YW50X21jczsKK30KKworc3RhdGljIGJvb2wKK2xheW91dF93YW50X2hpeihjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvID0gcGFyYW1zLT5pbmZvOworCisgICBpZiAoaW50ZWxfZGVidWcgJiBJTlRFTF9ERUJVR19OT0hJWikKKyAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICghKGluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UX0JJVCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgIGlmICghaW50ZWxfZm9ybWF0X2hhc19kZXB0aChwYXJhbXMtPmdwdSwgaW5mby0+Zm9ybWF0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgLyoKKyAgICAqIEhpWiBpbXBsaWVzIHNlcGFyYXRlIHN0ZW5jaWwgb24gR2VuNi4gIFdlIGRvIG5vdCB3YW50IHRvIGNvcHkgc3RlbmNpbHMKKyAgICAqIHZhbHVlcyBiZXR3ZWVuIGNvbWJpbmVkIGFuZCBzZXBhcmF0ZSBzdGVuY2lsIGJ1ZmZlcnMgd2hlbiBIaVogaXMgZW5hYmxlZAorICAgICogb3IgZGlzYWJsZWQuCisgICAgKi8KKyAgIGlmIChpbnRlbF9ncHVfZ2VuKHBhcmFtcy0+Z3B1KSA9PSBJTlRFTF9HRU4oNikpCisgICAgICAgcmV0dXJuIGZhbHNlOworCisgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK2xheW91dF9pbml0X2F1eChzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIGlmIChsYXlvdXRfd2FudF9oaXoobGF5b3V0LCBwYXJhbXMpKQorICAgICAgbGF5b3V0LT5hdXggPSBJTlRFTF9MQVlPVVRfQVVYX0hJWjsKKyAgIGVsc2UgaWYgKGxheW91dF93YW50X21jcyhsYXlvdXQsIHBhcmFtcykpCisgICAgICBsYXlvdXQtPmF1eCA9IElOVEVMX0xBWU9VVF9BVVhfTUNTOworfQorCitzdGF0aWMgdm9pZAorbGF5b3V0X2FsaWduKHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwgc3RydWN0IGludGVsX2xheW91dF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvID0gcGFyYW1zLT5pbmZvOworICAgaW50IGFsaWduX3cgPSAxLCBhbGlnbl9oID0gMSwgcGFkX2ggPSAwOworCisgICAvKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDEgcGFydCAxLCBwYWdlIDExODoKKyAgICAqCisgICAgKiAgICAgIlRvIGRldGVybWluZSB0aGUgbmVjZXNzYXJ5IHBhZGRpbmcgb24gdGhlIGJvdHRvbSBhbmQgcmlnaHQgc2lkZSBvZgorICAgICogICAgICB0aGUgc3VyZmFjZSwgcmVmZXIgdG8gdGhlIHRhYmxlIGluIFNlY3Rpb24gNy4xOC4zLjQgZm9yIHRoZSBpIGFuZCBqCisgICAgKiAgICAgIHBhcmFtZXRlcnMgZm9yIHRoZSBzdXJmYWNlIGZvcm1hdCBpbiB1c2UuIFRoZSBzdXJmYWNlIG11c3QgdGhlbiBiZQorICAgICogICAgICBleHRlbmRlZCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiB0aGUgYWxpZ25tZW50IHVuaXQgc2l6ZSBpbiBlYWNoCisgICAgKiAgICAgIGRpbWVuc2lvbiwgYW5kIGFsbCB0ZXhlbHMgY29udGFpbmVkIGluIHRoaXMgZXh0ZW5kZWQgc3VyZmFjZSBtdXN0CisgICAgKiAgICAgIGhhdmUgdmFsaWQgR1RUIGVudHJpZXMuIgorICAgICoKKyAgICAqICAgICAiRm9yIGN1YmUgc3VyZmFjZXMsIGFuIGFkZGl0aW9uYWwgdHdvIHJvd3Mgb2YgcGFkZGluZyBhcmUgcmVxdWlyZWQKKyAgICAqICAgICAgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3VyZmFjZS4gVGhpcyBtdXN0IGJlIGVuc3VyZWQgcmVnYXJkbGVzcyBvZgorICAgICogICAgICB3aGV0aGVyIHRoZSBzdXJmYWNlIGlzIHN0b3JlZCB0aWxlZCBvciBsaW5lYXIuICBUaGlzIGlzIGR1ZSB0byB0aGUKKyAgICAqICAgICAgcG90ZW50aWFsIHJvdGF0aW9uIG9mIGNhY2hlIGxpbmUgb3JpZW50YXRpb24gZnJvbSBtZW1vcnkgdG8gY2FjaGUuIgorICAgICoKKyAgICAqICAgICAiRm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKEJDKiBhbmQgRlhUMSBzdXJmYWNlIGZvcm1hdHMpLCBwYWRkaW5nIGF0CisgICAgKiAgICAgIHRoZSBib3R0b20gb2YgdGhlIHN1cmZhY2UgaXMgdG8gYW4gZXZlbiBjb21wcmVzc2VkIHJvdywgd2hpY2ggaXMKKyAgICAqICAgICAgZXF1YWwgdG8gYSBtdWx0aXBsZSBvZiA4IHVuY29tcHJlc3NlZCB0ZXhlbCByb3dzLiBUaHVzLCBmb3IgcGFkZGluZworICAgICogICAgICBwdXJwb3NlcywgdGhlc2Ugc3VyZmFjZXMgYmVoYXZlIGFzIGlmIGogPSA4IG9ubHkgZm9yIHN1cmZhY2UKKyAgICAqICAgICAgcGFkZGluZyBwdXJwb3Nlcy4gVGhlIHZhbHVlIG9mIDQgZm9yIGogc3RpbGwgYXBwbGllcyBmb3IgbWlwIGxldmVsCisgICAgKiAgICAgIGFsaWdubWVudCBhbmQgUVBpdGNoIGNhbGN1bGF0aW9uLiIKKyAgICAqLworICAgaWYgKGluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQpIHsKKyAgICAgIGlmIChhbGlnbl93IDwgbGF5b3V0LT5hbGlnbl9pKQorICAgICAgICAgIGFsaWduX3cgPSBsYXlvdXQtPmFsaWduX2k7CisgICAgICBpZiAoYWxpZ25faCA8IGxheW91dC0+YWxpZ25faikKKyAgICAgICAgICBhbGlnbl9oID0gbGF5b3V0LT5hbGlnbl9qOworCisgICAgICAvKiBpbiBjYXNlIGl0IGlzIHVzZWQgYXMgYSBjdWJlICovCisgICAgICBpZiAoaW5mby0+aW1hZ2VUeXBlID09IFZLX0lNQUdFX1RZUEVfMkQpCisgICAgICAgICBwYWRfaCArPSAyOworCisgICAgICBpZiAocGFyYW1zLT5jb21wcmVzc2VkICYmIGFsaWduX2ggPCBsYXlvdXQtPmFsaWduX2ogKiAyKQorICAgICAgICAgYWxpZ25faCA9IGxheW91dC0+YWxpZ25faiAqIDI7CisgICB9CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDEsIHBhZ2UgMTE4OgorICAgICoKKyAgICAqICAgICAiSWYgdGhlIHN1cmZhY2UgY29udGFpbnMgYW4gb2RkIG51bWJlciBvZiByb3dzIG9mIGRhdGEsIGEgZmluYWwgcm93CisgICAgKiAgICAgIGJlbG93IHRoZSBzdXJmYWNlIG11c3QgYmUgYWxsb2NhdGVkLiIKKyAgICAqLworICAgaWYgKChpbmZvLT51c2FnZSAmIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUKSAmJiBhbGlnbl9oIDwgMikKKyAgICAgIGFsaWduX2ggPSAyOworCisgICAvKgorICAgICogRGVwdGggQnVmZmVyIENsZWFyL1Jlc29sdmUgd29ya3MgaW4gOHg0IHNhbXBsZSBibG9ja3MuICBJbgorICAgICogaW50ZWxfdGV4dHVyZV9jYW5fZW5hYmxlX2hpeigpLCB3ZSBhbHdheXMgcmV0dXJuIHRydWUgZm9yIHRoZSBmaXJzdCBzbGljZS4KKyAgICAqIFRvIGF2b2lkIG91dC1vZi1ib3VuZCBhY2Nlc3MsIHdlIGhhdmUgdG8gcGFkLgorICAgICovCisgICBpZiAobGF5b3V0LT5hdXggPT0gSU5URUxfTEFZT1VUX0FVWF9ISVogJiYKKyAgICAgICBpbmZvLT5taXBMZXZlbHMgPT0gMSAmJgorICAgICAgIGluZm8tPmFycmF5TGF5ZXJzID09IDEgJiYKKyAgICAgICBpbmZvLT5leHRlbnQuZGVwdGggPT0gMSkgeworICAgICAgaWYgKGFsaWduX3cgPCA4KQorICAgICAgICAgIGFsaWduX3cgPSA4OworICAgICAgaWYgKGFsaWduX2ggPCA0KQorICAgICAgICAgIGFsaWduX2ggPSA0OworICAgfQorCisgICBwYXJhbXMtPm1heF94ID0gdV9hbGlnbihwYXJhbXMtPm1heF94LCBhbGlnbl93KTsKKyAgIHBhcmFtcy0+bWF4X3kgPSB1X2FsaWduKHBhcmFtcy0+bWF4X3kgKyBwYWRfaCwgYWxpZ25faCk7Cit9CisKKy8qIG5vdGUgdGhhdCB0aGlzIG1heSBmb3JjZSB0aGUgdGV4dHVyZSB0byBiZSBsaW5lYXIgKi8KK3N0YXRpYyB2b2lkCitsYXlvdXRfY2FsY3VsYXRlX2JvX3NpemUoc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9sYXlvdXRfcGFyYW1zICpwYXJhbXMpCit7CisgICBhc3NlcnQocGFyYW1zLT5tYXhfeCAlIGxheW91dC0+YmxvY2tfd2lkdGggPT0gMCk7CisgICBhc3NlcnQocGFyYW1zLT5tYXhfeSAlIGxheW91dC0+YmxvY2tfaGVpZ2h0ID09IDApOworICAgYXNzZXJ0KGxheW91dC0+bGF5ZXJfaGVpZ2h0ICUgbGF5b3V0LT5ibG9ja19oZWlnaHQgPT0gMCk7CisKKyAgIGxheW91dC0+Ym9fc3RyaWRlID0KKyAgICAgIChwYXJhbXMtPm1heF94IC8gbGF5b3V0LT5ibG9ja193aWR0aCkgKiBsYXlvdXQtPmJsb2NrX3NpemU7CisgICBsYXlvdXQtPmJvX2hlaWdodCA9IHBhcmFtcy0+bWF4X3kgLyBsYXlvdXQtPmJsb2NrX2hlaWdodDsKKworICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHVuc2lnbmVkIHcgPSBsYXlvdXQtPmJvX3N0cmlkZSwgaCA9IGxheW91dC0+Ym9faGVpZ2h0OworICAgICAgdW5zaWduZWQgYWxpZ25fdywgYWxpZ25faDsKKworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIEhhc3dlbGwgUFJNLCB2b2x1bWUgNSwgcGFnZSAxNjM6CisgICAgICAgKgorICAgICAgICogICAgICJGb3IgbGluZWFyIHN1cmZhY2VzLCBhZGRpdGlvbmFsIHBhZGRpbmcgb2YgNjQgYnl0ZXMgaXMgcmVxdWlyZWQKKyAgICAgICAqICAgICAgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3VyZmFjZS4gVGhpcyBpcyBpbiBhZGRpdGlvbiB0byB0aGUgcGFkZGluZworICAgICAgICogICAgICByZXF1aXJlZCBhYm92ZS4iCisgICAgICAgKi8KKyAgICAgIGlmIChpbnRlbF9ncHVfZ2VuKHBhcmFtcy0+Z3B1KSA+PSBJTlRFTF9HRU4oNy41KSAmJgorICAgICAgICAgIChwYXJhbXMtPmluZm8tPnVzYWdlICYgVktfSU1BR0VfVVNBR0VfU0FNUExFRF9CSVQpICYmCisgICAgICAgICAgbGF5b3V0LT50aWxpbmcgPT0gR0VONl9USUxJTkdfTk9ORSkKKyAgICAgICAgIGggKz0gKDY0ICsgbGF5b3V0LT5ib19zdHJpZGUgLSAxKSAvIGxheW91dC0+Ym9fc3RyaWRlOworCisgICAgICAvKgorICAgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDgxOgorICAgICAgICoKKyAgICAgICAqICAgICAiLSBGb3IgbGluZWFyIHJlbmRlciB0YXJnZXQgc3VyZmFjZXMsIHRoZSBwaXRjaCBtdXN0IGJlIGEKKyAgICAgICAqICAgICAgICBtdWx0aXBsZSBvZiB0aGUgZWxlbWVudCBzaXplIGZvciBub24tWVVWIHN1cmZhY2UgZm9ybWF0cy4KKyAgICAgICAqICAgICAgICBQaXRjaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqIGVsZW1lbnQgc2l6ZSBmb3IgWVVWIHN1cmZhY2UKKyAgICAgICAqICAgICAgICBmb3JtYXRzLgorICAgICAgICogICAgICAtIEZvciBvdGhlciBsaW5lYXIgc3VyZmFjZXMsIHRoZSBwaXRjaCBjYW4gYmUgYW55IG11bHRpcGxlIG9mCisgICAgICAgKiAgICAgICAgYnl0ZXMuCisgICAgICAgKiAgICAgIC0gRm9yIHRpbGVkIHN1cmZhY2VzLCB0aGUgcGl0Y2ggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSB0aWxlCisgICAgICAgKiAgICAgICAgd2lkdGguIgorICAgICAgICoKKyAgICAgICAqIERpZmZlcmVudCByZXF1aXJlbWVudHMgbWF5IGV4aXN0IHdoZW4gdGhlIGJvIGlzIHVzZWQgaW4gZGlmZmVyZW50CisgICAgICAgKiBwbGFjZXMsIGJ1dCBvdXIgYWxpZ25tZW50cyBoZXJlIHNob3VsZCBiZSBnb29kIGVub3VnaCB0aGF0IHdlIGRvIG5vdAorICAgICAgICogbmVlZCB0byBjaGVjayBsYXlvdXQtPmluZm8tPnVzYWdlLgorICAgICAgICovCisgICAgICBzd2l0Y2ggKGxheW91dC0+dGlsaW5nKSB7CisgICAgICBjYXNlIEdFTjZfVElMSU5HX1g6CisgICAgICAgICBhbGlnbl93ID0gNTEyOworICAgICAgICAgYWxpZ25faCA9IDg7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0VONl9USUxJTkdfWToKKyAgICAgICAgIGFsaWduX3cgPSAxMjg7CisgICAgICAgICBhbGlnbl9oID0gMzI7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0VOOF9USUxJTkdfVzoKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDIsIHBhZ2UgMjI6CisgICAgICAgICAgKgorICAgICAgICAgICogICAgICJBIDRLQiB0aWxlIGlzIHN1YmRpdmlkZWQgaW50byA4LWhpZ2ggYnkgOC13aWRlIGFycmF5IG9mCisgICAgICAgICAgKiAgICAgIEJsb2NrcyBmb3IgVy1NYWpvciBUaWxlcyAoVyBUaWxlcykuIEVhY2ggQmxvY2sgaXMgOCByb3dzIGJ5IDgKKyAgICAgICAgICAqICAgICAgYnl0ZXMuIgorICAgICAgICAgICovCisgICAgICAgICBhbGlnbl93ID0gNjQ7CisgICAgICAgICBhbGlnbl9oID0gNjQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBhc3NlcnQobGF5b3V0LT50aWxpbmcgPT0gR0VONl9USUxJTkdfTk9ORSk7CisgICAgICAgICAvKiBzb21lIGdvb2QgZW5vdWdoIHZhbHVlcyAqLworICAgICAgICAgYWxpZ25fdyA9IDY0OworICAgICAgICAgYWxpZ25faCA9IDI7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdyA9IHVfYWxpZ24odywgYWxpZ25fdyk7CisgICAgICBoID0gdV9hbGlnbihoLCBhbGlnbl9oKTsKKworICAgICAgLyogbWFrZSBzdXJlIHRoZSBibyBpcyBtYXBwYWJsZSAqLworICAgICAgaWYgKGxheW91dC0+dGlsaW5nICE9IEdFTjZfVElMSU5HX05PTkUpIHsKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBVc3VhbGx5IG9ubHkgdGhlIGZpcnN0IDI1Nk1CIG9mIHRoZSBHVFQgaXMgbWFwcGFibGUuCisgICAgICAgICAgKgorICAgICAgICAgICogU2VlIGFsc28gaG93IGludGVsX2NvbnRleHQ6Om1heF9ndHRfbWFwX29iamVjdF9zaXplIGlzIGNhbGN1bGF0ZWQuCisgICAgICAgICAgKi8KKyAgICAgICAgIGNvbnN0IHNpemVfdCBtYXBwYWJsZV9ndHRfc2l6ZSA9IDI1NiAqIDEwMjQgKiAxMDI0OworCisgICAgICAgICAvKgorICAgICAgICAgICogQmUgY29uc2VydmF0aXZlLiAgV2UgbWF5IGJlIGFibGUgdG8gc3dpdGNoIGZyb20gVkFMSUdOXzQgdG8KKyAgICAgICAgICAqIFZBTElHTl8yIGlmIHRoZSBsYXlvdXQgd2FzIFktdGlsZWQsIGJ1dCBsZXQncyBrZWVwIGl0IHNpbXBsZS4KKyAgICAgICAgICAqLworICAgICAgICAgaWYgKG1hcHBhYmxlX2d0dF9zaXplIC8gdyAvIDQgPCBoKSB7CisgICAgICAgICAgICBpZiAobGF5b3V0LT52YWxpZF90aWxpbmdzICYgTEFZT1VUX1RJTElOR19OT05FKSB7CisgICAgICAgICAgICAgICBsYXlvdXQtPnRpbGluZyA9IEdFTjZfVElMSU5HX05PTkU7CisgICAgICAgICAgICAgICAvKiBNQ1Mgc3VwcG9ydCBmb3Igbm9uLU1TUlRzIGlzIGxpbWl0ZWQgdG8gdGlsZWQgUlRzICovCisgICAgICAgICAgICAgICBpZiAobGF5b3V0LT5hdXggPT0gSU5URUxfTEFZT1VUX0FVWF9NQ1MgJiYKKyAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmluZm8tPnNhbXBsZXMgPT0gVktfU0FNUExFX0NPVU5UXzFfQklUKQorICAgICAgICAgICAgICAgICAgbGF5b3V0LT5hdXggPSBJTlRFTF9MQVlPVVRfQVVYX05PTkU7CisKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIC8qIG1hcHBpbmcgd2lsbCBmYWlsICovCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxheW91dC0+Ym9fc3RyaWRlID0gdzsKKyAgICAgIGxheW91dC0+Ym9faGVpZ2h0ID0gaDsKKyAgICAgIGJyZWFrOworICAgfQorfQorCitzdGF0aWMgdm9pZAorbGF5b3V0X2NhbGN1bGF0ZV9oaXpfc2l6ZShzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9sYXlvdXRfcGFyYW1zICpwYXJhbXMpCit7CisgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaW5mbyA9IHBhcmFtcy0+aW5mbzsKKyAgIGNvbnN0IHVuc2lnbmVkIGh6X2FsaWduX2ogPSA4OworICAgZW51bSBpbnRlbF9sYXlvdXRfd2Fsa190eXBlIGh6X3dhbGs7CisgICB1bnNpZ25lZCBoel93aWR0aCwgaHpfaGVpZ2h0LCBsdjsKKyAgIHVuc2lnbmVkIGh6X2NsZWFyX3csIGh6X2NsZWFyX2g7CisKKyAgIGFzc2VydChsYXlvdXQtPmF1eCA9PSBJTlRFTF9MQVlPVVRfQVVYX0hJWik7CisKKyAgIGFzc2VydChsYXlvdXQtPndhbGsgPT0gSU5URUxfTEFZT1VUX1dBTEtfTEFZRVIgfHwKKyAgICAgICAgICBsYXlvdXQtPndhbGsgPT0gSU5URUxfTEFZT1VUX1dBTEtfM0QpOworCisgICAvKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDMxMjoKKyAgICAqCisgICAgKiAgICAgIlRoZSBoaWVyYXJjaGljYWwgZGVwdGggYnVmZmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIExPRCBmaWVsZCwgaXQgaXMKKyAgICAqICAgICAgYXNzdW1lZCBieSBoYXJkd2FyZSB0byBiZSB6ZXJvLiBBIHNlcGFyYXRlIGhpZXJhcmFjaGljYWwgZGVwdGgKKyAgICAqICAgICAgYnVmZmVyIGlzIHJlcXVpcmVkIGZvciBlYWNoIExPRCB1c2VkLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAqICAgICAgYnVmZmVyJ3Mgc3RhdGUgZGVsaXZlcmVkIHRvIGhhcmR3YXJlIGVhY2ggdGltZSBhIG5ldyBkZXB0aCBidWZmZXIKKyAgICAqICAgICAgc3RhdGUgd2l0aCBtb2RpZmllZCBMT0QgaXMgZGVsaXZlcmVkLiIKKyAgICAqCisgICAgKiBXZSB3aWxsIHB1dCBhbGwgTE9EcyBpbiBhIHNpbmdsZSBibyB3aXRoIElOVEVMX0xBWU9VVF9XQUxLX0xPRC4KKyAgICAqLworICAgaWYgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig3KSkKKyAgICAgIGh6X3dhbGsgPSBsYXlvdXQtPndhbGs7CisgICBlbHNlCisgICAgICBoel93YWxrID0gSU5URUxfTEFZT1VUX1dBTEtfTE9EOworCisgICAvKgorICAgICogU2VlIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzEyLCBhbmQgdGhlIEl2eSBCcmlkZ2UKKyAgICAqIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDMxMi0zMTMuCisgICAgKgorICAgICogSXQgc2VlbXMgSGlaIGJ1ZmZlciBpcyBhbGlnbmVkIHRvIDh4OCwgd2l0aCBldmVyeSB0d28gcm93cyBwYWNrZWQgaW50byBhCisgICAgKiBtZW1vcnkgcm93LgorICAgICovCisgICBzd2l0Y2ggKGh6X3dhbGspIHsKKyAgIGNhc2UgSU5URUxfTEFZT1VUX1dBTEtfTE9EOgorICAgICAgeworICAgICAgICAgdW5zaWduZWQgbG9kX3R4W0lOVEVMX0xBWU9VVF9NQVhfTEVWRUxTXTsKKyAgICAgICAgIHVuc2lnbmVkIGxvZF90eVtJTlRFTF9MQVlPVVRfTUFYX0xFVkVMU107CisgICAgICAgICB1bnNpZ25lZCBjdXJfdHgsIGN1cl90eTsKKworICAgICAgICAgLyogZmlndXJlIG91dCB0aGUgdGlsZSBvZmZzZXRzIG9mIExPRHMgKi8KKyAgICAgICAgIGh6X3dpZHRoID0gMDsKKyAgICAgICAgIGh6X2hlaWdodCA9IDA7CisgICAgICAgICBjdXJfdHggPSAwOworICAgICAgICAgY3VyX3R5ID0gMDsKKyAgICAgICAgIGZvciAobHYgPSAwOyBsdiA8IGluZm8tPm1pcExldmVsczsgbHYrKykgeworICAgICAgICAgICAgdW5zaWduZWQgdHcsIHRoOworCisgICAgICAgICAgICBsb2RfdHhbbHZdID0gY3VyX3R4OworICAgICAgICAgICAgbG9kX3R5W2x2XSA9IGN1cl90eTsKKworICAgICAgICAgICAgdHcgPSB1X2FsaWduKGxheW91dC0+bG9kc1tsdl0uc2xpY2Vfd2lkdGgsIDE2KTsKKyAgICAgICAgICAgIHRoID0gdV9hbGlnbihsYXlvdXQtPmxvZHNbbHZdLnNsaWNlX2hlaWdodCwgaHpfYWxpZ25faikgKgorICAgICAgICAgICAgICAgaW5mby0+YXJyYXlMYXllcnMgLyAyOworICAgICAgICAgICAgLyogY29udmVydCB0byBZLXRpbGVzICovCisgICAgICAgICAgICB0dyA9IHVfYWxpZ24odHcsIDEyOCkgLyAxMjg7CisgICAgICAgICAgICB0aCA9IHVfYWxpZ24odGgsIDMyKSAvIDMyOworCisgICAgICAgICAgICBpZiAoaHpfd2lkdGggPCBjdXJfdHggKyB0dykKKyAgICAgICAgICAgICAgIGh6X3dpZHRoID0gY3VyX3R4ICsgdHc7CisgICAgICAgICAgICBpZiAoaHpfaGVpZ2h0IDwgY3VyX3R5ICsgdGgpCisgICAgICAgICAgICAgICBoel9oZWlnaHQgPSBjdXJfdHkgKyB0aDsKKworICAgICAgICAgICAgaWYgKGx2ID09IDEpCisgICAgICAgICAgICAgICBjdXJfdHggKz0gdHc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBjdXJfdHkgKz0gdGg7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIGNvbnZlcnQgdGlsZSBvZmZzZXRzIHRvIG1lbW9yeSBvZmZzZXRzICovCisgICAgICAgICBmb3IgKGx2ID0gMDsgbHYgPCBpbmZvLT5taXBMZXZlbHM7IGx2KyspIHsKKyAgICAgICAgICAgIGxheW91dC0+YXV4X29mZnNldHNbbHZdID0KKyAgICAgICAgICAgICAgIChsb2RfdHlbbHZdICogaHpfd2lkdGggKyBsb2RfdHhbbHZdKSAqIDQwOTY7CisgICAgICAgICB9CisgICAgICAgICBoel93aWR0aCAqPSAxMjg7CisgICAgICAgICBoel9oZWlnaHQgKj0gMzI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgSU5URUxfTEFZT1VUX1dBTEtfTEFZRVI6CisgICAgICB7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBoMCA9IHVfYWxpZ24ocGFyYW1zLT5oMCwgaHpfYWxpZ25faik7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBoMSA9IHVfYWxpZ24ocGFyYW1zLT5oMSwgaHpfYWxpZ25faik7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBodGFpbCA9CisgICAgICAgICAgICAoKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig3KSkgPyAxMiA6IDExKSAqIGh6X2FsaWduX2o7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBoel9xcGl0Y2ggPSBoMCArIGgxICsgaHRhaWw7CisKKyAgICAgICAgIGh6X3dpZHRoID0gdV9hbGlnbihsYXlvdXQtPmxvZHNbMF0uc2xpY2Vfd2lkdGgsIDE2KTsKKworICAgICAgICAgaHpfaGVpZ2h0ID0gaHpfcXBpdGNoICogaW5mby0+YXJyYXlMYXllcnMgLyAyOworICAgICAgICAgaWYgKGludGVsX2dwdV9nZW4ocGFyYW1zLT5ncHUpID49IElOVEVMX0dFTig3KSkKKyAgICAgICAgICAgIGh6X2hlaWdodCA9IHVfYWxpZ24oaHpfaGVpZ2h0LCA4KTsKKworICAgICAgICAgbGF5b3V0LT5hdXhfbGF5ZXJfaGVpZ2h0ID0gaHpfcXBpdGNoOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIElOVEVMX0xBWU9VVF9XQUxLXzNEOgorICAgICAgaHpfd2lkdGggPSB1X2FsaWduKGxheW91dC0+bG9kc1swXS5zbGljZV93aWR0aCwgMTYpOworCisgICAgICBoel9oZWlnaHQgPSAwOworICAgICAgZm9yIChsdiA9IDA7IGx2IDwgaW5mby0+bWlwTGV2ZWxzOyBsdisrKSB7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBoID0gdV9hbGlnbihsYXlvdXQtPmxvZHNbbHZdLnNsaWNlX2hlaWdodCwgaHpfYWxpZ25faik7CisgICAgICAgICAvKiBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEsIHNsaWNlcyBhcmUgcGFja2VkIHRvZ2V0aGVyIHZlcnRpY2FsbHkgKi8KKyAgICAgICAgIGh6X2hlaWdodCArPSBoICogdV9taW5pZnkoaW5mby0+ZXh0ZW50LmRlcHRoLCBsdik7CisgICAgICB9CisgICAgICBoel9oZWlnaHQgLz0gMjsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVua25vd24gbGF5b3V0IHdhbGsiKTsKKyAgICAgIGh6X3dpZHRoID0gMDsKKyAgICAgIGh6X2hlaWdodCA9IDA7CisgICAgICBicmVhazsKKyAgIH0KKworICAgLyoKKyAgICAqIEluIGhpel9hbGlnbl9mYigpLCB3ZSB3aWxsIGFsaWduIHRoZSBMT0RzIHRvIDh4NCBzYW1wbGUgYmxvY2tzLgorICAgICogRXhwZXJpbWVudHMgb24gSGFzd2VsbCBzaG93IHRoYXQgYWxpZ25pbmcgdGhlIFJFQ1RMSVNUIHByaW1pdGl2ZSBhbmQKKyAgICAqIDNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEUgYWxvbmUgYXJlIG5vdCBlbm91Z2guICBUaGUgTE9EIHNpemVzIG11c3QgYmUKKyAgICAqIGFsaWduZWQuCisgICAgKi8KKyAgIGh6X2NsZWFyX3cgPSA4OworICAgaHpfY2xlYXJfaCA9IDQ7CisgICBzd2l0Y2ggKGluZm8tPnNhbXBsZXMpIHsKKyAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzFfQklUOgorICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfMl9CSVQ6CisgICAgICBoel9jbGVhcl93IC89IDI7CisgICAgICBicmVhazsKKyAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzRfQklUOgorICAgICAgaHpfY2xlYXJfdyAvPSAyOworICAgICAgaHpfY2xlYXJfaCAvPSAyOworICAgICAgYnJlYWs7CisgICBjYXNlIFZLX1NBTVBMRV9DT1VOVF84X0JJVDoKKyAgICAgIGh6X2NsZWFyX3cgLz0gNDsKKyAgICAgIGh6X2NsZWFyX2ggLz0gMjsKKyAgICAgIGJyZWFrOworICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfMTZfQklUOgorICAgICAgaHpfY2xlYXJfdyAvPSA0OworICAgICAgaHpfY2xlYXJfaCAvPSA0OworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGZvciAobHYgPSAwOyBsdiA8IGluZm8tPm1pcExldmVsczsgbHYrKykgeworICAgICAgaWYgKHVfbWluaWZ5KGxheW91dC0+d2lkdGgwLCBsdikgJSBoel9jbGVhcl93IHx8CisgICAgICAgICAgdV9taW5pZnkobGF5b3V0LT5oZWlnaHQwLCBsdikgJSBoel9jbGVhcl9oKQorICAgICAgICAgYnJlYWs7CisgICAgICBsYXlvdXQtPmF1eF9lbmFibGVzIHw9IDEgPDwgbHY7CisgICB9CisKKyAgIC8qIHdlIHBhZGRlZCB0byBhbGxvdyB0aGlzIGluIGxheW91dF9hbGlnbigpICovCisgICBpZiAoaW5mby0+bWlwTGV2ZWxzID09IDEgJiYgaW5mby0+YXJyYXlMYXllcnMgPT0gMSAmJiBpbmZvLT5leHRlbnQuZGVwdGggPT0gMSkKKyAgICAgIGxheW91dC0+YXV4X2VuYWJsZXMgfD0gMHgxOworCisgICAvKiBhbGlnbiB0byBZLXRpbGUgKi8KKyAgIGxheW91dC0+YXV4X3N0cmlkZSA9IHVfYWxpZ24oaHpfd2lkdGgsIDEyOCk7CisgICBsYXlvdXQtPmF1eF9oZWlnaHQgPSB1X2FsaWduKGh6X2hlaWdodCwgMzIpOworfQorCitzdGF0aWMgdm9pZAorbGF5b3V0X2NhbGN1bGF0ZV9tY3Nfc2l6ZShzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9sYXlvdXRfcGFyYW1zICpwYXJhbXMpCit7CisgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaW5mbyA9IHBhcmFtcy0+aW5mbzsKKyAgIGludCBtY3Nfd2lkdGgsIG1jc19oZWlnaHQsIG1jc19jcHA7CisgICBpbnQgZG93bnNjYWxlX3gsIGRvd25zY2FsZV95OworCisgICBhc3NlcnQobGF5b3V0LT5hdXggPT0gSU5URUxfTEFZT1VUX0FVWF9NQ1MpOworCisgICBpZiAoaW5mby0+c2FtcGxlcyAhPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQpIHsKKyAgICAgIC8qCisgICAgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDMyNiwgdGhlIGNsZWFyCisgICAgICAgKiByZWN0YW5nbGUgaXMgc2NhbGVkIGRvd24gYnkgOHgyIGZvciA0WCBNU0FBIGFuZCAyeDIgZm9yIDhYIE1TQUEuICBUaGUKKyAgICAgICAqIG5lZWQgb2Ygc2NhbGUgZG93biBjb3VsZCBiZSB0aGF0IHRoZSBjbGVhciByZWN0YW5nbGUgaXMgdXNlZCB0byBjbGVhcgorICAgICAgICogdGhlIE1DUyBpbnN0ZWFkIG9mIHRoZSBSVC4KKyAgICAgICAqCisgICAgICAgKiBGb3IgOFggTVNBQSwgd2UgbmVlZCAzMiBiaXRzIGluIE1DUyBmb3IgZXZlcnkgcGl4ZWwgaW4gdGhlIFJULiAgVGhlCisgICAgICAgKiAyeDIgZmFjdG9yIGNvdWxkIGNvbWUgZnJvbSB0aGF0IHRoZSBoYXJkd2FyZSB3cml0ZXMgMTI4IGJpdHMgKGFuCisgICAgICAgKiBPV29yZCkgYXQgYSB0aW1lLCBhbmQgdGhlIE9Xb3JkIGluIE1DUyBtYXBzIHRvIGEgMngyIHBpeGVsIGJsb2NrIGluCisgICAgICAgKiB0aGUgUlQuICBGb3IgNFggTVNBQSwgd2UgbmVlZCA4IGJpdHMgaW4gTUNTIGZvciBldmVyeSBwaXhlbCBpbiB0aGUKKyAgICAgICAqIFJULiAgU2ltaWxhcmx5LCB3ZSBjb3VsZCByZWFzb24gdGhhdCBhbiBPV29yZCBpbiA0WCBNQ1MgbWFwcyB0byBhIDh4MgorICAgICAgICogcGl4ZWwgYmxvY2sgaW4gdGhlIFJULgorICAgICAgICovCisgICAgICBzd2l0Y2ggKGluZm8tPnNhbXBsZXMpIHsKKyAgICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzJfQklUOgorICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ6CisgICAgICAgICBkb3duc2NhbGVfeCA9IDg7CisgICAgICAgICBkb3duc2NhbGVfeSA9IDI7CisgICAgICAgICBtY3NfY3BwID0gMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfOF9CSVQ6CisgICAgICAgICBkb3duc2NhbGVfeCA9IDI7CisgICAgICAgICBkb3duc2NhbGVfeSA9IDI7CisgICAgICAgICBtY3NfY3BwID0gNDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfMTZfQklUOgorICAgICAgICAgZG93bnNjYWxlX3ggPSAyOworICAgICAgICAgZG93bnNjYWxlX3kgPSAxOworICAgICAgICAgbWNzX2NwcCA9IDg7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBhc3NlcnQoISJ1bnN1cHBvcnRlZCBzYW1wbGUgY291bnQiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKgorICAgICAgICogSXQgYWxzbyBhcHBlYXJzIHRoYXQgdGhlIDJ4MiBzdWJzcGFucyBnZW5lcmF0ZWQgYnkgdGhlIHNjYWxlZC1kb3duCisgICAgICAgKiBjbGVhciByZWN0YW5nbGUgY2Fubm90IGJlIG1hc2tlZC4gIFRoZSBzY2FsZS1kb3duIGNsZWFyIHJlY3RhbmdsZQorICAgICAgICogdGh1cyBtdXN0IGJlIGFsaWduZWQgdG8gMngyLCBhbmQgd2UgbmVlZCB0byBwYWQuCisgICAgICAgKi8KKyAgICAgIG1jc193aWR0aCA9IHVfYWxpZ24obGF5b3V0LT53aWR0aDAsIGRvd25zY2FsZV94ICogMik7CisgICAgICBtY3NfaGVpZ2h0ID0gdV9hbGlnbihsYXlvdXQtPmhlaWdodDAsIGRvd25zY2FsZV95ICogMik7CisgICB9IGVsc2UgeworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzI3OgorICAgICAgICoKKyAgICAgICAqICAgICAiICAgICAgICAgICAgICBQaXhlbHMgIExpbmVzCisgICAgICAgKiAgICAgIFRpbGVkWSBSVCBDTAorICAgICAgICogICAgICAgICAgYnBwCisgICAgICAgKiAgICAgICAgICAzMiAgICAgICAgICA4ICAgICAgICA0CisgICAgICAgKiAgICAgICAgICA2NCAgICAgICAgICA0ICAgICAgICA0CisgICAgICAgKiAgICAgICAgICAxMjggICAgICAgICAyICAgICAgICA0CisgICAgICAgKgorICAgICAgICogICAgICBUaWxlZFggUlQgQ0wKKyAgICAgICAqICAgICAgICAgIGJwcAorICAgICAgICogICAgICAgICAgMzIgICAgICAgICAgMTYgICAgICAgMgorICAgICAgICogICAgICAgICAgNjQgICAgICAgICAgOCAgICAgICAgMgorICAgICAgICogICAgICAgICAgMTI4ICAgICAgICAgNCAgICAgICAgMiIKKyAgICAgICAqCisgICAgICAgKiBUaGlzIHRhYmxlIGFuZCB0aGUgdHdvIGZvbGxvd2luZyB0YWJsZXMgZGVmaW5lIHRoZSBSVCBhbGlnbm1lbnRzLCB0aGUKKyAgICAgICAqIGNsZWFyIHJlY3RhbmdsZSBhbGlnbm1lbnRzLCBhbmQgdGhlIGNsZWFyIHJlY3RhbmdsZSBzY2FsZSBmYWN0b3JzLgorICAgICAgICogVmlld2luZyB0aGUgUlQgYWxpZ25tZW50cyBhcyB0aGUgc2l6ZXMgb2YgMTI4LWJ5dGUgYmxvY2tzLCB3ZSBjYW4gc2VlCisgICAgICAgKiB0aGF0IHRoZSBjbGVhciByZWN0YW5nbGUgYWxpZ25tZW50cyBhcmUgMTZ4MzIgYmxvY2tzLCBhbmQgdGhlIGNsZWFyCisgICAgICAgKiByZWN0YW5nbGUgc2NhbGUgZmFjdG9ycyBhcmUgOHgxNiBibG9ja3MuCisgICAgICAgKgorICAgICAgICogRm9yIG5vbi1NU0FBIFJULCB3ZSBuZWVkIDEgYml0IGluIE1DUyBmb3IgZXZlcnkgMTI4LWJ5dGUgYmxvY2sgaW4gdGhlCisgICAgICAgKiBSVC4gIFNpbWlsYXIgdG8gdGhlIE1TQUEgY2FzZXMsIHdlIGNhbiBhcmd1ZSB0aGF0IGFuIE9Xb3JkIG1hcHMgdG8KKyAgICAgICAqIDh4MTYgYmxvY2tzLgorICAgICAgICoKKyAgICAgICAqIE9uZSBwcm9ibGVtIHdpdGggdGhpcyByZWFzb25pbmcgaXMgdGhhdCBhIFktdGlsZSBpbiBNQ1MgaGFzIDh4MzIKKyAgICAgICAqIE9Xb3JkcyBhbmQgbWFwcyB0byA2NHg1MTIgMTI4LWJ5dGUgYmxvY2tzLiAgVGhpcyBkaWZmZXJzIGZyb20gaTk2NSwKKyAgICAgICAqIHdoaWNoIHNheXMgdGhhdCBhIFktdGlsZSBtYXBzIHRvIDEyOHgyNTYgYmxvY2tzIChcc2VlCisgICAgICAgKiBpbnRlbF9nZXRfbm9uX21zcnRfbWNzX2FsaWdubWVudCkuICBJdCBkb2VzIG5vdCByZWFsbHkgY2hhbmdlCisgICAgICAgKiBhbnl0aGluZyBleGNlcHQgZm9yIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgTUNTLiAgTGV0J3Mgc2VlIGlmIHdlCisgICAgICAgKiBoaXQgb3V0LW9mLWJvdW5kIGFjY2Vzcy4KKyAgICAgICAqLworICAgICAgc3dpdGNoIChsYXlvdXQtPnRpbGluZykgeworICAgICAgY2FzZSBHRU42X1RJTElOR19YOgorICAgICAgICAgZG93bnNjYWxlX3ggPSA2NCAvIGxheW91dC0+YmxvY2tfc2l6ZTsKKyAgICAgICAgIGRvd25zY2FsZV95ID0gMjsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRU42X1RJTElOR19ZOgorICAgICAgICAgZG93bnNjYWxlX3ggPSAzMiAvIGxheW91dC0+YmxvY2tfc2l6ZTsKKyAgICAgICAgIGRvd25zY2FsZV95ID0gNDsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGFzc2VydCghInVuc3VwcG9ydGVkIHRpbGluZyBtb2RlIik7CisgICAgICAgICByZXR1cm47CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZG93bnNjYWxlX3ggKj0gODsKKyAgICAgIGRvd25zY2FsZV95ICo9IDE2OworCisgICAgICAvKgorICAgICAgICogRnJvbSB0aGUgSGFzd2VsbCBQUk0sIHZvbHVtZSA3LCBwYWdlIDY1MjoKKyAgICAgICAqCisgICAgICAgKiAgICAgIkNsZWFyIHJlY3RhbmdsZSBtdXN0IGJlIGFsaWduZWQgdG8gdHdvIHRpbWVzIHRoZSBudW1iZXIgb2YKKyAgICAgICAqICAgICAgcGl4ZWxzIGluIHRoZSB0YWJsZSBzaG93biBiZWxvdyBkdWUgdG8gMTZYMTYgaGFzaGluZyBhY3Jvc3MgdGhlCisgICAgICAgKiAgICAgIHNsaWNlLiIKKyAgICAgICAqCisgICAgICAgKiBUaGUgc2NhbGVkLWRvd24gY2xlYXIgcmVjdGFuZ2xlIG11c3QgYmUgYWxpZ25lZCB0byA0eDQgaW5zdGVhZCBvZgorICAgICAgICogMngyLCBhbmQgd2UgbmVlZCB0byBwYWQuCisgICAgICAgKi8KKyAgICAgIG1jc193aWR0aCA9IHVfYWxpZ24obGF5b3V0LT53aWR0aDAsIGRvd25zY2FsZV94ICogNCkgLyBkb3duc2NhbGVfeDsKKyAgICAgIG1jc19oZWlnaHQgPSB1X2FsaWduKGxheW91dC0+aGVpZ2h0MCwgZG93bnNjYWxlX3kgKiA0KSAvIGRvd25zY2FsZV95OworICAgICAgbWNzX2NwcCA9IDE2OyAvKiBhbiBPV29yZCAqLworICAgfQorCisgICBsYXlvdXQtPmF1eF9lbmFibGVzID0gKDEgPDwgaW5mby0+bWlwTGV2ZWxzKSAtIDE7CisgICAvKiBhbGlnbiB0byBZLXRpbGUgKi8KKyAgIGxheW91dC0+YXV4X3N0cmlkZSA9IHVfYWxpZ24obWNzX3dpZHRoICogbWNzX2NwcCwgMTI4KTsKKyAgIGxheW91dC0+YXV4X2hlaWdodCA9IHVfYWxpZ24obWNzX2hlaWdodCwgMzIpOworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGxheW91dC4gIENhbGxlcnMgc2hvdWxkIHplcm8taW5pdGlhbGl6ZSBccCBsYXlvdXQgZmlyc3QuCisgKi8KK3ZvaWQgaW50ZWxfbGF5b3V0X2luaXQoc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrSW1hZ2VDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHNjYW5vdXQpCit7CisgICBzdHJ1Y3QgaW50ZWxfbGF5b3V0X3BhcmFtcyBwYXJhbXM7CisKKyAgIG1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisgICBwYXJhbXMuZGV2ID0gZGV2OworICAgcGFyYW1zLmdwdSA9IGRldi0+Z3B1OworICAgcGFyYW1zLmluZm8gPSBpbmZvOworICAgcGFyYW1zLnNjYW5vdXQgPSBzY2Fub3V0OworCisgICAvKiBub3RlIHRoYXQgdGhlcmUgYXJlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyAqLworICAgbGF5b3V0X2luaXRfYXV4KGxheW91dCwgJnBhcmFtcyk7CisgICBsYXlvdXRfaW5pdF9zaXplX2FuZF9mb3JtYXQobGF5b3V0LCAmcGFyYW1zKTsKKyAgIGxheW91dF9pbml0X3dhbGsobGF5b3V0LCAmcGFyYW1zKTsKKyAgIGxheW91dF9pbml0X3RpbGluZyhsYXlvdXQsICZwYXJhbXMpOworICAgbGF5b3V0X2luaXRfYWxpZ25tZW50cyhsYXlvdXQsICZwYXJhbXMpOworICAgbGF5b3V0X2luaXRfbG9kcyhsYXlvdXQsICZwYXJhbXMpOworICAgbGF5b3V0X2luaXRfbGF5ZXJfaGVpZ2h0KGxheW91dCwgJnBhcmFtcyk7CisKKyAgIGxheW91dF9hbGlnbihsYXlvdXQsICZwYXJhbXMpOworICAgbGF5b3V0X2NhbGN1bGF0ZV9ib19zaXplKGxheW91dCwgJnBhcmFtcyk7CisKKyAgIHN3aXRjaCAobGF5b3V0LT5hdXgpIHsKKyAgIGNhc2UgSU5URUxfTEFZT1VUX0FVWF9ISVo6CisgICAgICBsYXlvdXRfY2FsY3VsYXRlX2hpel9zaXplKGxheW91dCwgJnBhcmFtcyk7CisgICAgICBicmVhazsKKyAgIGNhc2UgSU5URUxfTEFZT1VUX0FVWF9NQ1M6CisgICAgICBsYXlvdXRfY2FsY3VsYXRlX21jc19zaXplKGxheW91dCwgJnBhcmFtcyk7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgIH0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIG9mZnNldCAoaW4gYnl0ZXMpIHRvIGEgc2xpY2Ugd2l0aGluIHRoZSBiby4KKyAqCisgKiBUaGUgcmV0dXJuZWQgb2Zmc2V0IGlzIGFsaWduZWQgdG8gdGlsZSBzaXplLiAgU2luY2Ugc2xpY2VzIGFyZSBub3QKKyAqIGd1YXJhbnRlZWQgdG8gc3RhcnQgYXQgdGlsZSBib3VuZGFyaWVzLCB0aGUgWCBhbmQgWSBvZmZzZXRzIChpbiBwaXhlbHMpCisgKiBmcm9tIHRoZSB0aWxlIG9yaWdpbiB0byB0aGUgc2xpY2UgYXJlIGFsc28gcmV0dXJuZWQuICBYIG9mZnNldCBpcyBhbHdheXMgYQorICogbXVsdGlwbGUgb2YgNCBhbmQgWSBvZmZzZXQgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgMi4KKyAqLwordW5zaWduZWQKK2ludGVsX2xheW91dF9nZXRfc2xpY2VfdGlsZV9vZmZzZXQoY29uc3Qgc3RydWN0IGludGVsX2xheW91dCAqbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICp4X29mZnNldCwgdW5zaWduZWQgKnlfb2Zmc2V0KQoreworICAgdW5zaWduZWQgdGlsZV93LCB0aWxlX2gsIHRpbGVfc2l6ZSwgcm93X3NpemU7CisgICB1bnNpZ25lZCB0aWxlX29mZnNldCwgeCwgeTsKKworICAgLyogc2VlIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMSBwYXJ0IDIsIHBhZ2UgMjQgKi8KKworICAgc3dpdGNoIChsYXlvdXQtPnRpbGluZykgeworICAgY2FzZSBHRU42X1RJTElOR19OT05FOgorICAgICAgIHRpbGVfdyA9IDE7CisgICAgICAgdGlsZV9oID0gMTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHRU42X1RJTElOR19YOgorICAgICAgdGlsZV93ID0gNTEyOworICAgICAgdGlsZV9oID0gODsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHRU42X1RJTElOR19ZOgorICAgICAgdGlsZV93ID0gMTI4OworICAgICAgdGlsZV9oID0gMzI7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0VOOF9USUxJTkdfVzoKKyAgICAgIHRpbGVfdyA9IDY0OworICAgICAgdGlsZV9oID0gNjQ7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJ1bmtub3duIHRpbGluZyIpOworICAgICAgdGlsZV93ID0gMTsKKyAgICAgIHRpbGVfaCA9IDE7CisgICAgICBicmVhazsKKyAgIH0KKworICAgdGlsZV9zaXplID0gdGlsZV93ICogdGlsZV9oOworICAgcm93X3NpemUgPSBsYXlvdXQtPmJvX3N0cmlkZSAqIHRpbGVfaDsKKworICAgaW50ZWxfbGF5b3V0X2dldF9zbGljZV9wb3MobGF5b3V0LCBsZXZlbCwgc2xpY2UsICZ4LCAmeSk7CisgICAvKiBpbiBieXRlcyAqLworICAgaW50ZWxfbGF5b3V0X3Bvc190b19tZW0obGF5b3V0LCB4LCB5LCAmeCwgJnkpOworICAgdGlsZV9vZmZzZXQgPSByb3dfc2l6ZSAqICh5IC8gdGlsZV9oKSArIHRpbGVfc2l6ZSAqICh4IC8gdGlsZV93KTsKKworICAgLyoKKyAgICAqIFNpbmNlIHRleC0+Ym9fc3RyaWRlIGlzIGEgbXVsdGlwbGUgb2YgdGlsZV93LCBzbGljZV9vZmZzZXQgc2hvdWxkIGJlCisgICAgKiBhbGlnbmVkIGF0IHRoaXMgcG9pbnQuCisgICAgKi8KKyAgIGFzc2VydCh0aWxlX29mZnNldCAlIHRpbGVfc2l6ZSA9PSAwKTsKKworICAgLyoKKyAgICAqIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBhbGlnbl9pIGFuZCBhbGlnbl9qIGluCisgICAgKiB0ZXhfbGF5b3V0X2luaXRfYWxpZ25tZW50cygpLCB4X29mZnNldCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbXVsdGlwbGUgb2YKKyAgICAqIDQgYW5kIHlfb2Zmc2V0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiAyLgorICAgICovCisgICBpZiAoeF9vZmZzZXQpIHsKKyAgICAgIC8qIGluIHBpeGVscyAqLworICAgICAgeCA9ICh4ICUgdGlsZV93KSAvIGxheW91dC0+YmxvY2tfc2l6ZSAqIGxheW91dC0+YmxvY2tfd2lkdGg7CisgICAgICBhc3NlcnQoeCAlIDQgPT0gMCk7CisKKyAgICAgICp4X29mZnNldCA9IHg7CisgICB9CisKKyAgIGlmICh5X29mZnNldCkgeworICAgICAgLyogaW4gcGl4ZWxzICovCisgICAgICB5ID0gKHkgJSB0aWxlX2gpICogbGF5b3V0LT5ibG9ja19oZWlnaHQ7CisgICAgICBhc3NlcnQoeSAlIDIgPT0gMCk7CisKKyAgICAgICp5X29mZnNldCA9IHk7CisgICB9CisKKyAgIHJldHVybiB0aWxlX29mZnNldDsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9sYXlvdXQuaCBiL2ljZC9pbnRlbC9sYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE5M2NlCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL2xheW91dC5oCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKgorICovCisKKyNpZm5kZWYgTEFZT1VUX0gKKyNkZWZpbmUgTEFZT1VUX0gKKworI2luY2x1ZGUgImdlbmh3L2dlbmh3LmgiCisjaW5jbHVkZSAiaW50ZWwuaCIKKworI2RlZmluZSBJTlRFTF9MQVlPVVRfTUFYX0xFVkVMUyAxNgorCitzdHJ1Y3QgaW50ZWxfZGV2OworCitlbnVtIGludGVsX2xheW91dF93YWxrX3R5cGUgeworICAgLyoKKyAgICAqIEFycmF5IGxheWVycyBvZiBhbiBMT0QgYXJlIHBhY2tlZCB0b2dldGhlciB2ZXJ0aWNhbGx5LiAgVGhpcyBtYXBzIHRvCisgICAgKiBBUllTUENfTE9EMCBmb3Igbm9uLW1pcG1hcHBlZCAyRCB0ZXh0dXJlcywgYW5kIGlzIGV4dGVuZGVkIHRvIHN1cHBvcnQKKyAgICAqIG1pcG1hcHBlZCBzdGVuY2lsIHRleHR1cmVzIGFuZCBIaVogb24gR0VONi4KKyAgICAqLworICAgSU5URUxfTEFZT1VUX1dBTEtfTE9ELAorCisgICAvKgorICAgICogTE9EcyBvZiBhbiBhcnJheSBsYXllciBhcmUgcGFja2VkIHRvZ2V0aGVyLiAgVGhpcyBtYXBzIHRvIEFSWVNQQ19GVUxMCisgICAgKiBhbmQgaXMgdXNlZCBmb3IgbWlwbWFwcGVkIDJEIHRleHR1cmVzLgorICAgICovCisgICBJTlRFTF9MQVlPVVRfV0FMS19MQVlFUiwKKworICAgLyoKKyAgICAqIDNEIHNsaWNlcyBvZiBhbiBMT0QgYXJlIHBhY2tlZCB0b2dldGhlciwgaG9yaXpvbnRhbGx5IHdpdGggd3JhcHBpbmcuCisgICAgKiBVc2VkIGZvciAzRCB0ZXh0dXJlcy4KKyAgICAqLworICAgSU5URUxfTEFZT1VUX1dBTEtfM0QsCit9OworCitlbnVtIGludGVsX2xheW91dF9hdXhfdHlwZSB7CisgICBJTlRFTF9MQVlPVVRfQVVYX05PTkUsCisgICBJTlRFTF9MQVlPVVRfQVVYX0hJWiwKKyAgIElOVEVMX0xBWU9VVF9BVVhfTUNTLAorfTsKKworc3RydWN0IGludGVsX2xheW91dF9sb2QgeworICAgLyogcGh5c2ljYWwgcG9zaXRpb24gKi8KKyAgIHVuc2lnbmVkIHg7CisgICB1bnNpZ25lZCB5OworCisgICAvKgorICAgICogUGh5c2ljYWwgc2l6ZSBvZiBhbiBMT0Qgc2xpY2UuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgc2xpY2VzIHdoZW4gdGhlCisgICAgKiB3YWxrIHR5cGUgaXMgbm90IElOVEVMX0xBWU9VVF9XQUxLX0xBWUVSLgorICAgICovCisgICB1bnNpZ25lZCBzbGljZV93aWR0aDsKKyAgIHVuc2lnbmVkIHNsaWNlX2hlaWdodDsKK307CisKKy8qKgorICogVGV4dHVyZSBsYXlvdXQuCisgKi8KK3N0cnVjdCBpbnRlbF9sYXlvdXQgeworICAgZW51bSBpbnRlbF9sYXlvdXRfYXV4X3R5cGUgYXV4OworCisgICAvKiBwaHlzaWNhbCB3aWR0aDAsIGhlaWdodDAsIGFuZCBmb3JtYXQgKi8KKyAgIHVuc2lnbmVkIHdpZHRoMDsKKyAgIHVuc2lnbmVkIGhlaWdodDA7CisgICBWa0Zvcm1hdCBmb3JtYXQ7CisgICBib29sIHNlcGFyYXRlX3N0ZW5jaWw7CisKKyAgIC8qCisgICAgKiB3aWR0aCwgaGVpZ2h0LCBhbmQgc2l6ZSBvZiBwaXhlbCBibG9ja3MsIGZvciBjb252ZXJzaW9uIGJldHdlZW4gMkQKKyAgICAqIGNvb3JkaW5hdGVzIGFuZCBtZW1vcnkgb2Zmc2V0cworICAgICovCisgICB1bnNpZ25lZCBibG9ja193aWR0aDsKKyAgIHVuc2lnbmVkIGJsb2NrX2hlaWdodDsKKyAgIHVuc2lnbmVkIGJsb2NrX3NpemU7CisKKyAgIGVudW0gaW50ZWxfbGF5b3V0X3dhbGtfdHlwZSB3YWxrOworICAgYm9vbCBpbnRlcmxlYXZlZF9zYW1wbGVzOworCisgICAvKiBiaXRtYXNrIG9mIHZhbGlkIHRpbGluZyBtb2RlcyAqLworICAgdW5zaWduZWQgdmFsaWRfdGlsaW5nczsKKyAgIGVudW0gZ2VuX3N1cmZhY2VfdGlsaW5nIHRpbGluZzsKKworICAgLyogbWlwbWFwIGFsaWdubWVudHMgKi8KKyAgIHVuc2lnbmVkIGFsaWduX2k7CisgICB1bnNpZ25lZCBhbGlnbl9qOworCisgICBzdHJ1Y3QgaW50ZWxfbGF5b3V0X2xvZCBsb2RzW0lOVEVMX0xBWU9VVF9NQVhfTEVWRUxTXTsKKworICAgLyogcGh5c2ljYWwgaGVpZ2h0IG9mIGxheWVycyBmb3IgSU5URUxfTEFZT1VUX1dBTEtfTEFZRVIgKi8KKyAgIHVuc2lnbmVkIGxheWVyX2hlaWdodDsKKworICAgLyogZGlzdGFuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0d28gcGl4ZWwgYmxvY2sgcm93cyAqLworICAgdW5zaWduZWQgYm9fc3RyaWRlOworICAgLyogbnVtYmVyIG9mIHBpeGVsIGJsb2NrIHJvd3MgKi8KKyAgIHVuc2lnbmVkIGJvX2hlaWdodDsKKworICAgLyogYml0bWFzayBvZiBsZXZlbHMgdGhhdCBjYW4gdXNlIGF1eCAqLworICAgdW5zaWduZWQgYXV4X2VuYWJsZXM7CisgICB1bnNpZ25lZCBhdXhfb2Zmc2V0c1tJTlRFTF9MQVlPVVRfTUFYX0xFVkVMU107CisgICB1bnNpZ25lZCBhdXhfbGF5ZXJfaGVpZ2h0OworICAgdW5zaWduZWQgYXV4X3N0cmlkZTsKKyAgIHVuc2lnbmVkIGF1eF9oZWlnaHQ7Cit9OworCit2b2lkIGludGVsX2xheW91dF9pbml0KHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzY2Fub3V0KTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gcGl4ZWwgcG9zaXRpb24gdG8gMkQgbWVtb3J5IG9mZnNldC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpbnRlbF9sYXlvdXRfcG9zX3RvX21lbShjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3NfeCwgdW5zaWduZWQgcG9zX3ksCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbWVtX3gsIHVuc2lnbmVkICptZW1feSkKK3sKKyAgIGFzc2VydChwb3NfeCAlIGxheW91dC0+YmxvY2tfd2lkdGggPT0gMCk7CisgICBhc3NlcnQocG9zX3kgJSBsYXlvdXQtPmJsb2NrX2hlaWdodCA9PSAwKTsKKworICAgKm1lbV94ID0gcG9zX3ggLyBsYXlvdXQtPmJsb2NrX3dpZHRoICogbGF5b3V0LT5ibG9ja19zaXplOworICAgKm1lbV95ID0gcG9zX3kgLyBsYXlvdXQtPmJsb2NrX2hlaWdodDsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gMkQgbWVtb3J5IG9mZnNldCB0byBsaW5lYXIgb2Zmc2V0LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCitpbnRlbF9sYXlvdXRfbWVtX3RvX2xpbmVhcihjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZW1feCwgdW5zaWduZWQgbWVtX3kpCit7CisgICByZXR1cm4gbWVtX3kgKiBsYXlvdXQtPmJvX3N0cmlkZSArIG1lbV94OworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSAyRCBtZW1vcnkgb2Zmc2V0IHRvIHJhdyBvZmZzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2ludGVsX2xheW91dF9tZW1fdG9fcmF3KGNvbnN0IHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lbV94LCB1bnNpZ25lZCBtZW1feSkKK3sKKyAgIHVuc2lnbmVkIHRpbGVfdyBVX0FTU0VSVF9PTkxZOworICAgdW5zaWduZWQgdGlsZV9oOworCisgICBzd2l0Y2ggKGxheW91dC0+dGlsaW5nKSB7CisgICBjYXNlIEdFTjZfVElMSU5HX05PTkU6CisgICAgICB0aWxlX3cgPSAxOworICAgICAgdGlsZV9oID0gMTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHRU42X1RJTElOR19YOgorICAgICAgdGlsZV93ID0gNTEyOworICAgICAgdGlsZV9oID0gODsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHRU42X1RJTElOR19ZOgorICAgICAgdGlsZV93ID0gMTI4OworICAgICAgdGlsZV9oID0gMzI7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0VOOF9USUxJTkdfVzoKKyAgICAgIHRpbGVfdyA9IDY0OworICAgICAgdGlsZV9oID0gNjQ7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJ1bmtub3duIHRpbGluZyIpOworICAgICAgdGlsZV93ID0gMTsKKyAgICAgIHRpbGVfaCA9IDE7CisgICAgICBicmVhazsKKyAgIH0KKworICAgYXNzZXJ0KG1lbV94ICUgdGlsZV93ID09IDApOworICAgYXNzZXJ0KG1lbV95ICUgdGlsZV9oID09IDApOworCisgICByZXR1cm4gbWVtX3kgKiBsYXlvdXQtPmJvX3N0cmlkZSArIG1lbV94ICogdGlsZV9oOworfQorCisvKioKKyAqIFJldHVybiB0aGUgc3RyaWRlLCBpbiBieXRlcywgYmV0d2VlbiBzbGljZXMgd2l0aGluIGEgbGV2ZWwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2ludGVsX2xheW91dF9nZXRfc2xpY2Vfc3RyaWRlKGNvbnN0IHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCwgdW5zaWduZWQgbGV2ZWwpCit7CisgICB1bnNpZ25lZCBoOworCisgICBzd2l0Y2ggKGxheW91dC0+d2FsaykgeworICAgY2FzZSBJTlRFTF9MQVlPVVRfV0FMS19MT0Q6CisgICAgICBoID0gbGF5b3V0LT5sb2RzW2xldmVsXS5zbGljZV9oZWlnaHQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgSU5URUxfTEFZT1VUX1dBTEtfTEFZRVI6CisgICAgICBoID0gbGF5b3V0LT5sYXllcl9oZWlnaHQ7CisgICAgICBicmVhazsKKyAgIGNhc2UgSU5URUxfTEFZT1VUX1dBTEtfM0Q6CisgICAgICBpZiAobGV2ZWwgPT0gMCkgeworICAgICAgICAgaCA9IGxheW91dC0+bG9kc1swXS5zbGljZV9oZWlnaHQ7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghIm5vIHNpbmdsZSBzdHJpZGUgdG8gd2FsayBhY3Jvc3Mgc2xpY2VzIik7CisgICAgICBoID0gMDsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBhc3NlcnQoaCAlIGxheW91dC0+YmxvY2tfaGVpZ2h0ID09IDApOworCisgICByZXR1cm4gKGggLyBsYXlvdXQtPmJsb2NrX2hlaWdodCkgKiBsYXlvdXQtPmJvX3N0cmlkZTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIHBoeXNpY2FsIHNpemUsIGluIGJ5dGVzLCBvZiBhIHNsaWNlIGluIGEgbGV2ZWwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2ludGVsX2xheW91dF9nZXRfc2xpY2Vfc2l6ZShjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsIHVuc2lnbmVkIGxldmVsKQoreworICAgY29uc3QgdW5zaWduZWQgdyA9IGxheW91dC0+bG9kc1tsZXZlbF0uc2xpY2Vfd2lkdGg7CisgICBjb25zdCB1bnNpZ25lZCBoID0gbGF5b3V0LT5sb2RzW2xldmVsXS5zbGljZV9oZWlnaHQ7CisKKyAgIGFzc2VydCh3ICUgbGF5b3V0LT5ibG9ja193aWR0aCA9PSAwKTsKKyAgIGFzc2VydChoICUgbGF5b3V0LT5ibG9ja19oZWlnaHQgPT0gMCk7CisKKyAgIHJldHVybiAodyAvIGxheW91dC0+YmxvY2tfd2lkdGggKiBsYXlvdXQtPmJsb2NrX3NpemUpICoKKyAgICAgIChoIC8gbGF5b3V0LT5ibG9ja19oZWlnaHQpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgcGl4ZWwgcG9zaXRpb24gb2YgYSBzbGljZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpbnRlbF9sYXlvdXRfZ2V0X3NsaWNlX3Bvcyhjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqeCwgdW5zaWduZWQgKnkpCit7CisgICBzd2l0Y2ggKGxheW91dC0+d2FsaykgeworICAgY2FzZSBJTlRFTF9MQVlPVVRfV0FMS19MT0Q6CisgICAgICAqeCA9IGxheW91dC0+bG9kc1tsZXZlbF0ueDsKKyAgICAgICp5ID0gbGF5b3V0LT5sb2RzW2xldmVsXS55ICsgbGF5b3V0LT5sb2RzW2xldmVsXS5zbGljZV9oZWlnaHQgKiBzbGljZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBJTlRFTF9MQVlPVVRfV0FMS19MQVlFUjoKKyAgICAgICp4ID0gbGF5b3V0LT5sb2RzW2xldmVsXS54OworICAgICAgKnkgPSBsYXlvdXQtPmxvZHNbbGV2ZWxdLnkgKyBsYXlvdXQtPmxheWVyX2hlaWdodCAqIHNsaWNlOworICAgICAgYnJlYWs7CisgICBjYXNlIElOVEVMX0xBWU9VVF9XQUxLXzNEOgorICAgICAgeworICAgICAgICAgLyogc2xpY2VzIGFyZSBwYWNrZWQgaG9yaXpvbnRhbGx5IHdpdGggd3JhcHBpbmcgKi8KKyAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHN4ID0gc2xpY2UgJiAoKDEgPDwgbGV2ZWwpIC0gMSk7CisgICAgICAgICBjb25zdCB1bnNpZ25lZCBzeSA9IHNsaWNlID4+IGxldmVsOworCisgICAgICAgICAqeCA9IGxheW91dC0+bG9kc1tsZXZlbF0ueCArIGxheW91dC0+bG9kc1tsZXZlbF0uc2xpY2Vfd2lkdGggKiBzeDsKKyAgICAgICAgICp5ID0gbGF5b3V0LT5sb2RzW2xldmVsXS55ICsgbGF5b3V0LT5sb2RzW2xldmVsXS5zbGljZV9oZWlnaHQgKiBzeTsKKworICAgICAgICAgLyogc2hvdWxkIG5vdCBvdmVybGFwIHdpdGggdGhlIG5leHQgbGV2ZWwgKi8KKyAgICAgICAgIGlmIChsZXZlbCArIDEgPCBBUlJBWV9TSVpFKGxheW91dC0+bG9kcykgJiYKKyAgICAgICAgICAgICBsYXlvdXQtPmxvZHNbbGV2ZWwgKyAxXS55KSB7CisgICAgICAgICAgICBhc3NlcnQoKnkgKyBsYXlvdXQtPmxvZHNbbGV2ZWxdLnNsaWNlX2hlaWdodCA8PQorICAgICAgICAgICAgICAgICAgbGF5b3V0LT5sb2RzW2xldmVsICsgMV0ueSk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJ1bmtub3duIGxheW91dCB3YWxrIHR5cGUiKTsKKyAgICAgICp4ID0gMDsKKyAgICAgICp5ID0gMDsKKyAgICAgIGJyZWFrOworICAgfQorCisgICAvKiBzaG91bGQgbm90IGV4Y2VlZCB0aGUgYm8gc2l6ZSAqLworICAgYXNzZXJ0KCp5ICsgbGF5b3V0LT5sb2RzW2xldmVsXS5zbGljZV9oZWlnaHQgPD0KKyAgICAgICAgIGxheW91dC0+Ym9faGVpZ2h0ICogbGF5b3V0LT5ibG9ja19oZWlnaHQpOworfQorCit1bnNpZ25lZAoraW50ZWxfbGF5b3V0X2dldF9zbGljZV90aWxlX29mZnNldChjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCBzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnhfb2Zmc2V0LCB1bnNpZ25lZCAqeV9vZmZzZXQpOworCisjZW5kaWYgLyogTEFZT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9tZW0uYyBiL2ljZC9pbnRlbC9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGMxY2NhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL21lbS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgIm1lbS5oIgorCitWa1Jlc3VsdCBpbnRlbF9tZW1fYWxsb2Moc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWVtICoqbWVtX3JldCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfbWVtICptZW07CisKKyAgICAvKiBpZ25vcmUgYW55IElNQUdFX0lORk8gYW5kIEJVRkZFUl9JTkZPIHVzYWdlOiB0aGV5IGRvbid0IGFsdGVyIGFsbG9jYXRpb25zICovCisKKyAgICBtZW0gPSAoc3RydWN0IGludGVsX21lbSAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqbWVtKSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9NRU1PUllfRVhULCBpbmZvLCAwKTsKKyAgICBpZiAoIW1lbSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIG1lbS0+Ym8gPSBpbnRlbF93aW5zeXNfYWxsb2NfYm8oZGV2LT53aW5zeXMsCisgICAgICAgICAgICAidmstZ3B1LW1lbW9yeSIsIGluZm8tPmFsbG9jYXRpb25TaXplLCAwKTsKKyAgICBpZiAoIW1lbS0+Ym8pIHsKKyAgICAgICAgaW50ZWxfbWVtX2ZyZWUobWVtKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworICAgIH0KKworICAgIG1lbS0+c2l6ZSA9IGluZm8tPmFsbG9jYXRpb25TaXplOworCisgICAgKm1lbV9yZXQgPSBtZW07CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9tZW1fZnJlZShzdHJ1Y3QgaW50ZWxfbWVtICptZW0pCit7CisgICAgaW50ZWxfYm9fdW5yZWYobWVtLT5ibyk7CisKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJm1lbS0+YmFzZSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0FsbG9jYXRlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtEZXZpY2VNZW1vcnkqICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gaW50ZWxfbWVtX2FsbG9jKGRldiwgcEFsbG9jYXRlSW5mbywgKHN0cnVjdCBpbnRlbF9tZW0gKiopIHBNZW1vcnkpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0ZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgc3RydWN0IGludGVsX21lbSAqbWVtID0gaW50ZWxfbWVtKG1lbV8pOworCisgICAgaW50ZWxfbWVtX2ZyZWUobWVtKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrTWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIFZrRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwRGF0YSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfbWVtICptZW0gPSBpbnRlbF9tZW0obWVtXyk7CisgICAgdm9pZCAqcHRyID0gaW50ZWxfbWVtX21hcChtZW0sIGZsYWdzKTsKKworICAgICpwcERhdGEgPSAodm9pZCAqKSgoc2l6ZV90KXB0ciArIG9mZnNldCk7CisKKyAgICByZXR1cm4gKHB0cikgPyBWS19TVUNDRVNTIDogVktfRVJST1JfTUVNT1JZX01BUF9GQUlMRUQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrVW5tYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fKQoreworICAgIHN0cnVjdCBpbnRlbF9tZW0gKm1lbSA9IGludGVsX21lbShtZW1fKTsKKworICAgIGludGVsX21lbV91bm1hcChtZW0pOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKQoreworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICAgICAgICAgICAgICAgIHBNZW1vcnlSYW5nZXMpCit7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlTWVtb3J5Q29tbWl0bWVudCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgIFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21taXR0ZWRNZW1vcnlJbkJ5dGVzKQoreworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL21lbS5oIGIvaWNkL2ludGVsL21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzRjODEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvbWVtLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICoKKyAqLworCisjaWZuZGVmIE1FTV9ICisjZGVmaW5lIE1FTV9ICisKKyNpbmNsdWRlICJrbWQvd2luc3lzLmgiCisjaW5jbHVkZSAiaW50ZWwuaCIKKyNpbmNsdWRlICJvYmouaCIKKworc3RydWN0IGludGVsX21lbSB7CisgICAgc3RydWN0IGludGVsX2Jhc2UgYmFzZTsKKworICAgIHN0cnVjdCBpbnRlbF9ibyAqYm87CisgICAgVmtEZXZpY2VTaXplIHNpemU7Cit9OworCitWa1Jlc3VsdCBpbnRlbF9tZW1fYWxsb2Moc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtNZW1vcnlBbGxvY2F0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWVtICoqbWVtX3JldCk7Cit2b2lkIGludGVsX21lbV9mcmVlKHN0cnVjdCBpbnRlbF9tZW0gKm1lbSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaW50ZWxfbWVtX21hcChzdHJ1Y3QgaW50ZWxfbWVtICptZW0sIFZrRmxhZ3MgZmxhZ3MpCit7CisgICAgcmV0dXJuIGludGVsX2JvX21hcF9hc3luYyhtZW0tPmJvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICppbnRlbF9tZW1fbWFwX3N5bmMoc3RydWN0IGludGVsX21lbSAqbWVtLCBib29sIHJ3KQoreworICAgIHJldHVybiBpbnRlbF9ib19tYXAobWVtLT5ibywgcncpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfbWVtX3VubWFwKHN0cnVjdCBpbnRlbF9tZW0gKm1lbSkKK3sKKyAgICBpbnRlbF9ib191bm1hcChtZW0tPmJvKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGludGVsX21lbV9pc19idXN5KHN0cnVjdCBpbnRlbF9tZW0gKm1lbSkKK3sKKyAgICByZXR1cm4gaW50ZWxfYm9faXNfYnVzeShtZW0tPmJvKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfbWVtICppbnRlbF9tZW0oVmtEZXZpY2VNZW1vcnkgbWVtKQoreworICAgIHJldHVybiAqKHN0cnVjdCBpbnRlbF9tZW0gKiopICZtZW07Cit9CisKKyNlbmRpZiAvKiBNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL29iai5jIGIvaWNkL2ludGVsL29iai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzFlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvb2JqLmMKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiZ3B1LmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAib2JqLmgiCisKK1ZrUmVzdWx0IGludGVsX2Jhc2VfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMoc3RydWN0IGludGVsX2Jhc2UgKmJhc2UsIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiBwUmVxdWlyZW1lbnRzKQoreworICAgIG1lbXNldChwUmVxdWlyZW1lbnRzLCAwLCBzaXplb2YoVmtNZW1vcnlSZXF1aXJlbWVudHMpKTsKKyAgICBwUmVxdWlyZW1lbnRzLT5tZW1vcnlUeXBlQml0cyA9ICgxPDwgSU5URUxfTUVNT1JZX1RZUEVfQ09VTlQpIC0gMTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgYm9vbCBiYXNlX2RiZ19jb3B5X2NyZWF0ZV9pbmZvKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Jhc2VfZGJnICpkYmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNyZWF0ZV9pbmZvKQoreworICAgIGNvbnN0IHVuaW9uIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqcHRyOworICAgICAgICBjb25zdCBzdHJ1Y3QgeworICAgICAgICAgICAgVmtTdHJ1Y3R1cmVUeXBlIHN0cnVjdF90eXBlOworICAgICAgICAgICAgdm9pZCAqbmV4dDsKKyAgICAgICAgfSAqaGVhZGVyOworICAgIH0gaW5mbyA9IHsgLnB0ciA9IGNyZWF0ZV9pbmZvIH07CisgICAgc2l6ZV90IHNoYWxsb3dfY29weSA9IDA7CisKKyAgICBpZiAoIWNyZWF0ZV9pbmZvKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHN3aXRjaCAoZGJnLT50eXBlKSB7CisgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0VWRU5UX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9FVkVOVF9DUkVBVEVfSU5GTyk7CisgICAgICAgIHNoYWxsb3dfY29weSA9IHNpemVvZihWa0V2ZW50Q3JlYXRlSW5mbyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9GRU5DRV9DUkVBVEVfSU5GTyk7CisgICAgICAgIHNoYWxsb3dfY29weSA9IHNpemVvZihWa0ZlbmNlQ3JlYXRlSW5mbyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhUOgorICAgICAgICBhc3NlcnQoaW5mby5oZWFkZXItPnN0cnVjdF90eXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1FVRVJZX1BPT0xfQ1JFQVRFX0lORk8pOworICAgICAgICBzaGFsbG93X2NvcHkgPSBzaXplb2YoVmtRdWVyeVBvb2xDcmVhdGVJbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8pOworICAgICAgICBzaGFsbG93X2NvcHkgPSBzaXplb2YoVmtCdWZmZXJDcmVhdGVJbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVdfRVhUOgorICAgICAgICBhc3NlcnQoaW5mby5oZWFkZXItPnN0cnVjdF90eXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9WSUVXX0NSRUFURV9JTkZPKTsKKyAgICAgICAgc2hhbGxvd19jb3B5ID0gc2l6ZW9mKFZrQnVmZmVyVmlld0NyZWF0ZUluZm8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQ6CisgICAgICAgIGFzc2VydChpbmZvLmhlYWRlci0+c3RydWN0X3R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk8pOworICAgICAgICBzaGFsbG93X2NvcHkgPSBzaXplb2YoVmtJbWFnZUNyZWF0ZUluZm8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPKTsKKyAgICAgICAgc2hhbGxvd19jb3B5ID0gc2l6ZW9mKFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NBTVBMRVJfRVhUOgorICAgICAgICBhc3NlcnQoaW5mby5oZWFkZXItPnN0cnVjdF90eXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk8pOworICAgICAgICBzaGFsbG93X2NvcHkgPSBzaXplb2YoVmtTYW1wbGVyQ3JlYXRlSW5mbyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVDoKKyAgICAgICAgLyogbm8gY3JlYXRlIGluZm8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9QT09MX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8pOworICAgICAgICBzaGFsbG93X2NvcHkgPSBzaXplb2YoVmtDb21tYW5kUG9vbENyZWF0ZUluZm8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQ6CisgICAgICAgIGFzc2VydChpbmZvLmhlYWRlci0+c3RydWN0X3R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfQ09NTUFORF9CVUZGRVJfQUxMT0NBVEVfSU5GTyk7CisgICAgICAgIHNoYWxsb3dfY29weSA9IHNpemVvZihWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQ6CisgICAgICAgIGFzc2VydChpbmZvLmhlYWRlci0+c3RydWN0X3R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQ6CisgICAgICAgIGFzc2VydChpbmZvLmhlYWRlci0+c3RydWN0X3R5cGUgPT0gIFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPKTsKKyAgICAgICAgc2hhbGxvd19jb3B5ID0gc2l6ZW9mKFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhUOgorICAgICAgICBhc3NlcnQoaW5mby5oZWFkZXItPnN0cnVjdF90eXBlID09ICBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTyk7CisgICAgICAgIHNoYWxsb3dfY29weSA9IHNpemVvZihWa1JlbmRlclBhc3NDcmVhdGVJbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVDoKKyAgICAgICAgYXNzZXJ0KGluZm8uaGVhZGVyLT5zdHJ1Y3RfdHlwZSA9PSAgVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPKTsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICBzaGFsbG93X2NvcHkgPSBzaXplb2YoVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbykgKiAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhUOgorICAgICAgICBhc3NlcnQoaW5mby5oZWFkZXItPnN0cnVjdF90eXBlID09ICBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1BPT0xfQ1JFQVRFX0lORk8pOworICAgICAgICBzaGFsbG93X2NvcHkgPSBzaXplb2YoVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bmtub3duIGRiZyBvYmplY3QgdHlwZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzaGFsbG93X2NvcHkpIHsKKyAgICAgICAgZGJnLT5jcmVhdGVfaW5mbyA9IGludGVsX2FsbG9jKGhhbmRsZSwgc2hhbGxvd19jb3B5LCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgICAgICBpZiAoIWRiZy0+Y3JlYXRlX2luZm8pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbWVtY3B5KGRiZy0+Y3JlYXRlX2luZm8sIGNyZWF0ZV9pbmZvLCBzaGFsbG93X2NvcHkpOworICAgICAgICBkYmctPmNyZWF0ZV9pbmZvX3NpemUgPSBzaGFsbG93X2NvcHk7CisgICAgfSBlbHNlIGlmIChpbmZvLmhlYWRlci0+c3RydWN0X3R5cGUgPT0KKyAgICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPKSB7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyAqc3JjID0gaW5mby5wdHI7CisgICAgICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvICpkc3Q7CisgICAgICAgIHVpbnQ4X3QgKmQ7CisgICAgICAgIHNpemUgPSBzaXplb2YoKnNyYyk7CisKKyAgICAgICAgZGJnLT5jcmVhdGVfaW5mb19zaXplID0gc2l6ZTsKKyAgICAgICAgZHN0ID0gaW50ZWxfYWxsb2MoaGFuZGxlLCBzaXplLCBzaXplb2YoaW50KSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICAgICAgaWYgKCFkc3QpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIG1lbWNweShkc3QsIHNyYywgc2l6ZW9mKCpzcmMpKTsKKworICAgICAgICBkID0gKHVpbnQ4X3QgKikgZHN0OworICAgICAgICBkICs9IHNpemVvZigqc3JjKTsKKworICAgICAgICBkYmctPmNyZWF0ZV9pbmZvID0gZHN0OworICAgIH0gZWxzZSBpZiAoaW5mby5oZWFkZXItPnN0cnVjdF90eXBlID09CisgICAgICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8pIHsKKyAgICAgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpzcmMgPSBpbmZvLnB0cjsKKyAgICAgICAgVmtEZXZpY2VDcmVhdGVJbmZvICpkc3Q7CisgICAgICAgIHVpbnQ4X3QgKmQ7CisgICAgICAgIHNpemVfdCBzaXplOworCisgICAgICAgIHNpemUgPSBzaXplb2YoKnNyYyk7CisgICAgICAgIGRiZy0+Y3JlYXRlX2luZm9fc2l6ZSA9IHNpemU7CisKKyAgICAgICAgc2l6ZSArPSBzaXplb2Yoc3JjLT5wUXVldWVDcmVhdGVJbmZvc1swXSkgKgorICAgICAgICAgICAgc3JjLT5xdWV1ZUNyZWF0ZUluZm9Db3VudDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNyYy0+cXVldWVDcmVhdGVJbmZvQ291bnQ7IGkrKykgeworICAgICAgICAgICAgc2l6ZSArPSBzcmMtPnBRdWV1ZUNyZWF0ZUluZm9zW2ldLnF1ZXVlQ291bnQgKiBzaXplb2YoZmxvYXQpOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gc2l6ZW9mKHNyYy0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbMF0pICoKKyAgICAgICAgICAgIHNyYy0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3JjLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICAgICAgc2l6ZSArPSBzdHJsZW4oc3JjLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgZHN0ID0gaW50ZWxfYWxsb2MoaGFuZGxlLCBzaXplLCBzaXplb2YoaW50KSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICAgICAgaWYgKCFkc3QpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBzaXplb2YoKnNyYykpOworCisgICAgICAgIGQgPSAodWludDhfdCAqKSBkc3Q7CisgICAgICAgIGQgKz0gc2l6ZW9mKCpzcmMpOworCisgICAgICAgIHNpemUgPSBzaXplb2Yoc3JjLT5wUXVldWVDcmVhdGVJbmZvc1swXSkgKiBzcmMtPnF1ZXVlQ3JlYXRlSW5mb0NvdW50OworICAgICAgICBtZW1jcHkoZCwgc3JjLT5wUXVldWVDcmVhdGVJbmZvcywgc2l6ZSk7CisgICAgICAgIGRzdC0+cFF1ZXVlQ3JlYXRlSW5mb3MgPSAoY29uc3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gKikgZDsKKyAgICAgICAgZCArPSBzaXplOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3JjLT5xdWV1ZUNyZWF0ZUluZm9Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGZsb2F0KSAqCisgICAgICAgICAgICAgICAgZHN0LT5wUXVldWVDcmVhdGVJbmZvc1tpXS5xdWV1ZUNvdW50OworICAgICAgICAgICAgbWVtY3B5KGQsIHNyYy0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucFF1ZXVlUHJpb3JpdGllcywgc2l6ZSk7CisgICAgICAgICAgICAqKChmbG9hdCAqKikgJmRzdC0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucFF1ZXVlUHJpb3JpdGllcykgPSAoZmxvYXQgKikgZDsKKyAgICAgICAgICAgIGQgKz0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgPSBzaXplb2Yoc3JjLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1swXSkgKgorICAgICAgICAgICAgc3JjLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgICAgIGRzdC0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSAoY29uc3QgY2hhciAqKikgZDsKKyAgICAgICAgbWVtY3B5KGQsIHNyYy0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMsIHNpemUpOworICAgICAgICBkICs9IHNpemU7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzcmMtPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyICoqcHRyID0gKGNoYXIgKiopICZkc3QtPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldOworICAgICAgICAgICAgc3RyY3B5KChjaGFyICopIGQsIHNyYy0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgICAgICAgICAgKnB0ciA9IChjaGFyICopIGQ7CisgICAgICAgICAgICBkICs9IHN0cmxlbihzcmMtPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKSArIDE7CisgICAgICAgIH0KKworICAgICAgICBkYmctPmNyZWF0ZV9pbmZvID0gZHN0OworICAgIH0gZWxzZSBpZiAoaW5mby5oZWFkZXItPnN0cnVjdF90eXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPKSB7CisgICAgICAgIC8vIFRPRE86IFdoYXQgZG8gd2Ugd2FudCB0byBjb3B5IGhlcmU/CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGludGVsX2Jhc2VfZGJnLiAgV2hlbiBkYmdfc2l6ZSBpcyBub24temVybywgYSBidWZmZXIgb2YgdGhhdAorICogc2l6ZSBpcyBhbGxvY2F0ZWQgYW5kIHplcm9lZC4KKyAqLworc3RydWN0IGludGVsX2Jhc2VfZGJnICppbnRlbF9iYXNlX2RiZ19jcmVhdGUoY29uc3Qgc3RydWN0IGludGVsX2hhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRiZ19zaXplKQoreworICAgIHN0cnVjdCBpbnRlbF9iYXNlX2RiZyAqZGJnOworCisgICAgaWYgKCFkYmdfc2l6ZSkKKyAgICAgICAgZGJnX3NpemUgPSBzaXplb2YoKmRiZyk7CisKKyAgICBhc3NlcnQoZGJnX3NpemUgPj0gc2l6ZW9mKCpkYmcpKTsKKworICAgIGRiZyA9IGludGVsX2FsbG9jKGhhbmRsZSwgZGJnX3NpemUsIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghZGJnKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1lbXNldChkYmcsIDAsIGRiZ19zaXplKTsKKworICAgIGRiZy0+dHlwZSA9IHR5cGU7CisKKyAgICBpZiAoIWJhc2VfZGJnX2NvcHlfY3JlYXRlX2luZm8oaGFuZGxlLCBkYmcsIGNyZWF0ZV9pbmZvKSkgeworICAgICAgICBpbnRlbF9mcmVlKGhhbmRsZSwgZGJnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGRiZzsKK30KKwordm9pZCBpbnRlbF9iYXNlX2RiZ19kZXN0cm95KGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYmFzZV9kYmcgKmRiZykKK3sKKyAgICBpZiAoZGJnLT50YWcpCisgICAgICAgIGludGVsX2ZyZWUoaGFuZGxlLCBkYmctPnRhZyk7CisKKyAgICBpZiAoZGJnLT5jcmVhdGVfaW5mbykKKyAgICAgICAgaW50ZWxfZnJlZShoYW5kbGUsIGRiZy0+Y3JlYXRlX2luZm8pOworCisgICAgaW50ZWxfZnJlZShoYW5kbGUsIGRiZyk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGludGVsX2Jhc2UuICBvYmpfc2l6ZSBhbmQgZGJnX3NpemUgc3BlY2lmeSB0aGUgcmVhbCBzaXplcyBvZiB0aGUKKyAqIG9iamVjdCBhbmQgdGhlIGRlYnVnIG1ldGFkYXRhLiAgTWVtb3JpZXMgYXJlIHplcm9lZC4KKyAqLworc3RydWN0IGludGVsX2Jhc2UgKmludGVsX2Jhc2VfY3JlYXRlKGNvbnN0IHN0cnVjdCBpbnRlbF9oYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2JqX3NpemUsIGJvb2wgZGVidWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjcmVhdGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGJnX3NpemUpCit7CisgICAgc3RydWN0IGludGVsX2Jhc2UgKmJhc2U7CisKKyAgICBpZiAoIW9ial9zaXplKQorICAgICAgICBvYmpfc2l6ZSA9IHNpemVvZigqYmFzZSk7CisKKyAgICBhc3NlcnQob2JqX3NpemUgPj0gc2l6ZW9mKCpiYXNlKSk7CisKKyAgICBiYXNlID0gaW50ZWxfYWxsb2MoaGFuZGxlLCBvYmpfc2l6ZSwgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX09CSkVDVCk7CisgICAgaWYgKCFiYXNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1lbXNldChiYXNlLCAwLCBvYmpfc2l6ZSk7CisgICAgaW50ZWxfaGFuZGxlX2luaXQoJmJhc2UtPmhhbmRsZSwgdHlwZSwgaGFuZGxlLT5pbnN0YW5jZSk7CisKKyAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgYmFzZS0+ZGJnID0gaW50ZWxfYmFzZV9kYmdfY3JlYXRlKCZiYXNlLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgdHlwZSwgY3JlYXRlX2luZm8sIGRiZ19zaXplKTsKKyAgICAgICAgaWYgKCFiYXNlLT5kYmcpIHsKKyAgICAgICAgICAgIGludGVsX2ZyZWUoaGFuZGxlLCBiYXNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgYmFzZS0+Z2V0X21lbW9yeV9yZXF1aXJlbWVudHMgPSBpbnRlbF9iYXNlX2dldF9tZW1vcnlfcmVxdWlyZW1lbnRzOworCisgICAgcmV0dXJuIGJhc2U7Cit9CisKK3ZvaWQgaW50ZWxfYmFzZV9kZXN0cm95KHN0cnVjdCBpbnRlbF9iYXNlICpiYXNlKQoreworICAgIGlmIChiYXNlLT5kYmcpCisgICAgICAgIGludGVsX2Jhc2VfZGJnX2Rlc3Ryb3koJmJhc2UtPmhhbmRsZSwgYmFzZS0+ZGJnKTsKKyAgICBpbnRlbF9mcmVlKGJhc2UsIGJhc2UpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBSZXF1aXJlbWVudHMpCit7CisgICAgc3RydWN0IGludGVsX2Jhc2UgKmJhc2UgPSBpbnRlbF9iYXNlKGJ1ZmZlcik7CisKKyAgICBiYXNlLT5nZXRfbWVtb3J5X3JlcXVpcmVtZW50cyhiYXNlLCBwUmVxdWlyZW1lbnRzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzKiAgICAgICAgICAgICAgICAgICAgICAgcFJlcXVpcmVtZW50cykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYmFzZSAqYmFzZSA9IGludGVsX2Jhc2UoaW1hZ2UpOworCisgICAgYmFzZS0+Z2V0X21lbW9yeV9yZXF1aXJlbWVudHMoYmFzZSwgcFJlcXVpcmVtZW50cyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0JpbmRCdWZmZXJNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KQoreworICAgIHN0cnVjdCBpbnRlbF9vYmogKm9iaiA9IGludGVsX29iaihidWZmZXIpOworICAgIHN0cnVjdCBpbnRlbF9tZW0gKm1lbSA9IGludGVsX21lbShtZW1fKTsKKworICAgIGludGVsX29ial9iaW5kX21lbShvYmosIG1lbSwgbWVtb3J5T2Zmc2V0KTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtCaW5kSW1hZ2VNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV8sCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpCit7CisgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKGltYWdlKTsKKyAgICBzdHJ1Y3QgaW50ZWxfbWVtICptZW0gPSBpbnRlbF9tZW0obWVtXyk7CisKKyAgICBpbnRlbF9vYmpfYmluZF9tZW0ob2JqLCBtZW0sIG1lbW9yeU9mZnNldCk7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5mb0NvdW50LAorICAgIGNvbnN0IFZrQmluZFNwYXJzZUluZm8qICAgICAgICAgICAgICAgICAgICAgcEJpbmRJbmZvLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UpCit7CisgICAgYXNzZXJ0KDAgJiYgInZrUXVldWVCaW5kU3BhcnNlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL29iai5oIGIvaWNkL2ludGVsL29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2M1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvb2JqLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoKKyAqLworCisjaWZuZGVmIE9CSl9ICisjZGVmaW5lIE9CSl9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorCitzdHJ1Y3QgaW50ZWxfZGV2Oworc3RydWN0IGludGVsX21lbTsKKworc3RydWN0IGludGVsX2Jhc2VfZGJnIHsKKyAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB0eXBlOworCisgICAgdm9pZCAqY3JlYXRlX2luZm87CisgICAgc2l6ZV90IGNyZWF0ZV9pbmZvX3NpemU7CisKKyAgICB2b2lkICp0YWc7CisgICAgc2l6ZV90IHRhZ19zaXplOworfTsKKworc3RydWN0IGludGVsX2Jhc2UgeworICAgIHN0cnVjdCBpbnRlbF9oYW5kbGUgaGFuZGxlOworCisgICAgc3RydWN0IGludGVsX2Jhc2VfZGJnICpkYmc7CisKKyAgICBWa1Jlc3VsdCAoKmdldF9tZW1vcnlfcmVxdWlyZW1lbnRzKShzdHJ1Y3QgaW50ZWxfYmFzZSAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWa01lbW9yeVJlcXVpcmVtZW50cyAqZGF0YSk7Cit9OworCitzdHJ1Y3QgaW50ZWxfb2JqIHsKKyAgICBzdHJ1Y3QgaW50ZWxfYmFzZSBiYXNlOworCisgICAgdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBpbnRlbF9vYmogKm9iaik7CisKKyAgICAvKiBmb3IgbWVtb3J5IGJpbmRpbmcgKi8KKyAgICBzdHJ1Y3QgaW50ZWxfbWVtICptZW07CisgICAgc2l6ZV90IG9mZnNldDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2Jhc2UgKmludGVsX2Jhc2Uodm9pZCAqIGJhc2UpCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfYmFzZSAqKSBiYXNlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9vYmogKmludGVsX29iaih2b2lkICogb2JqKQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX29iaiAqKSBvYmo7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9vYmpfYmluZF9tZW0oc3RydWN0IGludGVsX29iaiAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfbWVtICptZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBvZmZzZXQpCit7CisgICAgb2JqLT5tZW0gPSBtZW07CisgICAgb2JqLT5vZmZzZXQgPSBvZmZzZXQ7Cit9CisKK1ZrUmVzdWx0IGludGVsX2Jhc2VfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMoc3RydWN0IGludGVsX2Jhc2UgKmJhc2UsIFZrTWVtb3J5UmVxdWlyZW1lbnRzICpkYXRhKTsKKworc3RydWN0IGludGVsX2Jhc2VfZGJnICppbnRlbF9iYXNlX2RiZ19jcmVhdGUoY29uc3Qgc3RydWN0IGludGVsX2hhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRiZ19zaXplKTsKK3ZvaWQgaW50ZWxfYmFzZV9kYmdfZGVzdHJveShjb25zdCBzdHJ1Y3QgaW50ZWxfaGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2Jhc2VfZGJnICpkYmcpOworCitzdHJ1Y3QgaW50ZWxfYmFzZSAqaW50ZWxfYmFzZV9jcmVhdGUoY29uc3Qgc3RydWN0IGludGVsX2hhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvYmpfc2l6ZSwgYm9vbCBkZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNyZWF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYmdfc2l6ZSk7Cit2b2lkIGludGVsX2Jhc2VfZGVzdHJveShzdHJ1Y3QgaW50ZWxfYmFzZSAqYmFzZSk7CisKKyNlbmRpZiAvKiBPQkpfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL3BpcGVsaW5lLmMgYi9pY2QvaW50ZWwvcGlwZWxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2VjYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL3BpcGVsaW5lLmMKQEAgLTAsMCArMSwxNDU2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IEdyZWdGIDxncmVnQEx1bmFyRy5jb20+CisgKiBBdXRob3I6IFRvbnkgQmFyYm91ciA8dG9ueUBMdW5hckcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZ2VuaHcvZ2VuaHcuaCIKKyNpbmNsdWRlICJjb21waWxlci9waXBlbGluZS9waXBlbGluZV9jb21waWxlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjbWQuaCIKKyNpbmNsdWRlICJmb3JtYXQuaCIKKyNpbmNsdWRlICJzaGFkZXIuaCIKKyNpbmNsdWRlICJwaXBlbGluZS5oIgorI2luY2x1ZGUgIm1lbS5oIgorCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9ibGVuZF9mdW5jKFZrQmxlbmRPcCBmdW5jKQoreworICAgc3dpdGNoIChmdW5jKSB7CisgICBjYXNlIFZLX0JMRU5EX09QX0FERDogICAgICAgICAgICAgICAgcmV0dXJuIEdFTjZfQkxFTkRGVU5DVElPTl9BREQ7CisgICBjYXNlIFZLX0JMRU5EX09QX1NVQlRSQUNUOiAgICAgICAgICAgcmV0dXJuIEdFTjZfQkxFTkRGVU5DVElPTl9TVUJUUkFDVDsKKyAgIGNhc2UgVktfQkxFTkRfT1BfUkVWRVJTRV9TVUJUUkFDVDogICByZXR1cm4gR0VONl9CTEVOREZVTkNUSU9OX1JFVkVSU0VfU1VCVFJBQ1Q7CisgICBjYXNlIFZLX0JMRU5EX09QX01JTjogICAgICAgICAgICAgICAgcmV0dXJuIEdFTjZfQkxFTkRGVU5DVElPTl9NSU47CisgICBjYXNlIFZLX0JMRU5EX09QX01BWDogICAgICAgICAgICAgICAgcmV0dXJuIEdFTjZfQkxFTkRGVU5DVElPTl9NQVg7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEidW5rbm93biBibGVuZCBmdW5jIik7CisgICAgICByZXR1cm4gR0VONl9CTEVOREZVTkNUSU9OX0FERDsKKyAgIH07Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX2JsZW5kKFZrQmxlbmRGYWN0b3IgYmxlbmQpCit7CisgICBzd2l0Y2ggKGJsZW5kKSB7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9aRVJPOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX1pFUk87CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9PTkU6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX09ORTsKKyAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX1NSQ19DT0xPUjogICAgICAgICAgICAgICAgcmV0dXJuIEdFTjZfQkxFTkRGQUNUT1JfU1JDX0NPTE9SOworICAgY2FzZSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX1NSQ19DT0xPUjogICAgICByZXR1cm4gR0VONl9CTEVOREZBQ1RPUl9JTlZfU1JDX0NPTE9SOworICAgY2FzZSBWS19CTEVORF9GQUNUT1JfRFNUX0NPTE9SOiAgICAgICAgICAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX0RTVF9DT0xPUjsKKyAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19EU1RfQ09MT1I6ICAgICByZXR1cm4gR0VONl9CTEVOREZBQ1RPUl9JTlZfRFNUX0NPTE9SOworICAgY2FzZSBWS19CTEVORF9GQUNUT1JfU1JDX0FMUEhBOiAgICAgICAgICAgICAgICByZXR1cm4gR0VONl9CTEVOREZBQ1RPUl9TUkNfQUxQSEE7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDX0FMUEhBOiAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX0lOVl9TUkNfQUxQSEE7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9EU1RfQUxQSEE6ICAgICAgICAgICAgICAgcmV0dXJuIEdFTjZfQkxFTkRGQUNUT1JfRFNUX0FMUEhBOworICAgY2FzZSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX0RTVF9BTFBIQTogICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX0lOVl9EU1RfQUxQSEE7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9DT0xPUjogICAgICAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX0NPTlNUX0NPTE9SOworICAgY2FzZSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOiByZXR1cm4gR0VONl9CTEVOREZBQ1RPUl9JTlZfQ09OU1RfQ09MT1I7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9DT05TVEFOVF9BTFBIQTogICAgICAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX0NPTlNUX0FMUEhBOworICAgY2FzZSBWS19CTEVORF9GQUNUT1JfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBOiByZXR1cm4gR0VONl9CTEVOREZBQ1RPUl9JTlZfQ09OU1RfQUxQSEE7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9TUkNfQUxQSEFfU0FUVVJBVEU6ICAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX1NSQ19BTFBIQV9TQVRVUkFURTsKKyAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX1NSQzFfQ09MT1I6ICAgICAgICAgICAgICAgcmV0dXJuIEdFTjZfQkxFTkRGQUNUT1JfU1JDMV9DT0xPUjsKKyAgIGNhc2UgVktfQkxFTkRfRkFDVE9SX09ORV9NSU5VU19TUkMxX0NPTE9SOiAgICAgcmV0dXJuIEdFTjZfQkxFTkRGQUNUT1JfSU5WX1NSQzFfQ09MT1I7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9TUkMxX0FMUEhBOiAgICAgICAgICAgICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX1NSQzFfQUxQSEE7CisgICBjYXNlIFZLX0JMRU5EX0ZBQ1RPUl9PTkVfTUlOVVNfU1JDMV9BTFBIQTogICAgIHJldHVybiBHRU42X0JMRU5ERkFDVE9SX0lOVl9TUkMxX0FMUEhBOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVua25vd24gYmxlbmQgZmFjdG9yIik7CisgICAgICByZXR1cm4gR0VONl9CTEVOREZBQ1RPUl9PTkU7CisgICB9OworfQorCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoVmtDb21wYXJlT3AgZnVuYykKK3sKKyAgICBzd2l0Y2ggKGZ1bmMpIHsKKyAgICBjYXNlIFZLX0NPTVBBUkVfT1BfTkVWRVI6ICAgICAgICAgcmV0dXJuIEdFTjZfQ09NUEFSRUZVTkNUSU9OX05FVkVSOworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9MRVNTOiAgICAgICAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fTEVTUzsKKyAgICBjYXNlIFZLX0NPTVBBUkVfT1BfRVFVQUw6ICAgICAgICAgcmV0dXJuIEdFTjZfQ09NUEFSRUZVTkNUSU9OX0VRVUFMOworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9MRVNTX09SX0VRVUFMOiAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fTEVRVUFMOworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9HUkVBVEVSOiAgICAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fR1JFQVRFUjsKKyAgICBjYXNlIFZLX0NPTVBBUkVfT1BfTk9UX0VRVUFMOiAgICAgcmV0dXJuIEdFTjZfQ09NUEFSRUZVTkNUSU9OX05PVEVRVUFMOworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9HUkVBVEVSX09SX0VRVUFMOiByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fR0VRVUFMOworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9BTFdBWVM6ICAgICAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fQUxXQVlTOworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJ1bmtub3duIGNvbXBhcmVfZnVuYyIpOworICAgICAgcmV0dXJuIEdFTjZfQ09NUEFSRUZVTkNUSU9OX05FVkVSOworICAgIH0KK30KKworc3RhdGljIGludCB0cmFuc2xhdGVfc3RlbmNpbF9vcChWa1N0ZW5jaWxPcCBvcCkKK3sKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBWS19TVEVOQ0lMX09QX0tFRVA6ICAgICAgIHJldHVybiBHRU42X1NURU5DSUxPUF9LRUVQOworICAgIGNhc2UgVktfU1RFTkNJTF9PUF9aRVJPOiAgICAgICByZXR1cm4gR0VONl9TVEVOQ0lMT1BfWkVSTzsKKyAgICBjYXNlIFZLX1NURU5DSUxfT1BfUkVQTEFDRTogICAgcmV0dXJuIEdFTjZfU1RFTkNJTE9QX1JFUExBQ0U7CisgICAgY2FzZSBWS19TVEVOQ0lMX09QX0lOQ1JFTUVOVF9BTkRfQ0xBTVA6ICByZXR1cm4gR0VONl9TVEVOQ0lMT1BfSU5DUlNBVDsKKyAgICBjYXNlIFZLX1NURU5DSUxfT1BfREVDUkVNRU5UX0FORF9DTEFNUDogIHJldHVybiBHRU42X1NURU5DSUxPUF9ERUNSU0FUOworICAgIGNhc2UgVktfU1RFTkNJTF9PUF9JTlZFUlQ6ICAgICByZXR1cm4gR0VONl9TVEVOQ0lMT1BfSU5WRVJUOworICAgIGNhc2UgVktfU1RFTkNJTF9PUF9JTkNSRU1FTlRfQU5EX1dSQVA6ICAgcmV0dXJuIEdFTjZfU1RFTkNJTE9QX0lOQ1I7CisgICAgY2FzZSBWS19TVEVOQ0lMX09QX0RFQ1JFTUVOVF9BTkRfV1JBUDogICByZXR1cm4gR0VONl9TVEVOQ0lMT1BfREVDUjsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEidW5rbm93biBzdGVuY2lsIG9wIik7CisgICAgICByZXR1cm4gR0VONl9TVEVOQ0lMT1BfS0VFUDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX3NhbXBsZV9jb3VudChWa1NhbXBsZUNvdW50RmxhZ0JpdHMgc2FtcGxlcykKK3sKKyAgICBzd2l0Y2ggKHNhbXBsZXMpIHsKKyAgICBjYXNlIFZLX1NBTVBMRV9DT1VOVF8xX0JJVDogICAgIHJldHVybiAxOworICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzJfQklUOiAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBWS19TQU1QTEVfQ09VTlRfNF9CSVQ6ICAgICByZXR1cm4gNDsKKyAgICBjYXNlIFZLX1NBTVBMRV9DT1VOVF84X0JJVDogICAgIHJldHVybiA4OworICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzE2X0JJVDogICAgcmV0dXJuIDE2OworICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzMyX0JJVDogICAgcmV0dXJuIDMyOworICAgIGNhc2UgVktfU0FNUExFX0NPVU5UXzY0X0JJVDogICAgcmV0dXJuIDY0OworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoISJ1bmtub3duIHNhbXBsZSBjb3VudCIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfY3JlYXRlX2luZm8geworICAgIFZrRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlOworICAgIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gICAgICAgICAgIGdyYXBoaWNzOworICAgIFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyAgIHZpOworICAgIFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvIGlhOworICAgIFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8gIGRiOworICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvICAgIGNiOworICAgIFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvICAgICAgICByczsKKyAgICBWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvICB0ZXNzOworICAgIFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyAgIG1zOworICAgIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyAgICAgIHZwOworCisgICAgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvICAgICAgICAgICAgY29tcHV0ZTsKKworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gICAgICAgIHZzOworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gICAgICAgIHRjczsKKyAgICBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvICAgICAgICB0ZXM7CisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAgICAgICAgZ3M7CisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAgICAgICAgZnM7Cit9OworCisvKiBpbiBTMS4zICovCitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2FtcGxlX3Bvc2l0aW9uIHsKKyAgICBpbnQ4X3QgeCwgeTsKK307CisKK3N0YXRpYyB1aW50OF90IHBhY2tfc2FtcGxlX3Bvc2l0aW9uKGNvbnN0IHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zYW1wbGVfcG9zaXRpb24gKnBvcykKK3sKKyAgICByZXR1cm4gKHBvcy0+eCArIDgpIDw8IDQgfCAocG9zLT55ICsgOCk7Cit9CisKK3ZvaWQgaW50ZWxfcGlwZWxpbmVfaW5pdF9kZWZhdWx0X3NhbXBsZV9wYXR0ZXJucyhjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGF0XzF4LCB1aW50OF90ICpwYXRfMngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGF0XzR4LCB1aW50OF90ICpwYXRfOHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGF0XzE2eCkKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NhbXBsZV9wb3NpdGlvbiBkZWZhdWx0XzF4WzFdID0geworICAgICAgICB7ICAwLCAgMCB9LAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zYW1wbGVfcG9zaXRpb24gZGVmYXVsdF8yeFsyXSA9IHsKKyAgICAgICAgeyAtNCwgLTQgfSwKKyAgICAgICAgeyAgNCwgIDQgfSwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2FtcGxlX3Bvc2l0aW9uIGRlZmF1bHRfNHhbNF0gPSB7CisgICAgICAgIHsgLTIsIC02IH0sCisgICAgICAgIHsgIDYsIC0yIH0sCisgICAgICAgIHsgLTYsICAyIH0sCisgICAgICAgIHsgIDIsICA2IH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NhbXBsZV9wb3NpdGlvbiBkZWZhdWx0Xzh4WzhdID0geworICAgICAgICB7IC0xLCAgMSB9LAorICAgICAgICB7ICAxLCAgNSB9LAorICAgICAgICB7ICAzLCAtNSB9LAorICAgICAgICB7ICA1LCAgMyB9LAorICAgICAgICB7IC03LCAtMSB9LAorICAgICAgICB7IC0zLCAtNyB9LAorICAgICAgICB7ICA3LCAtMyB9LAorICAgICAgICB7IC01LCAgNyB9LAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zYW1wbGVfcG9zaXRpb24gZGVmYXVsdF8xNnhbMTZdID0geworICAgICAgICB7ICAwLCAgMiB9LAorICAgICAgICB7ICAzLCAgMCB9LAorICAgICAgICB7IC0zLCAtMiB9LAorICAgICAgICB7IC0yLCAtNCB9LAorICAgICAgICB7ICA0LCAgMyB9LAorICAgICAgICB7ICA1LCAgMSB9LAorICAgICAgICB7ICA2LCAtMSB9LAorICAgICAgICB7ICAyLCAtNiB9LAorICAgICAgICB7IC00LCAgNSB9LAorICAgICAgICB7IC01LCAtNSB9LAorICAgICAgICB7IC0xLCAtNyB9LAorICAgICAgICB7ICA3LCAtMyB9LAorICAgICAgICB7IC03LCAgNCB9LAorICAgICAgICB7ICAxLCAtOCB9LAorICAgICAgICB7IC02LCAgNiB9LAorICAgICAgICB7IC04LCAgNyB9LAorICAgIH07CisgICAgaW50IGk7CisKKyAgICBwYXRfMXhbMF0gPSBwYWNrX3NhbXBsZV9wb3NpdGlvbihkZXYsIGRlZmF1bHRfMXgpOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHBhdF8yeFtpXSA9IHBhY2tfc2FtcGxlX3Bvc2l0aW9uKGRldiwgJmRlZmF1bHRfMnhbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHBhdF80eFtpXSA9IHBhY2tfc2FtcGxlX3Bvc2l0aW9uKGRldiwgJmRlZmF1bHRfNHhbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHBhdF84eFtpXSA9IHBhY2tfc2FtcGxlX3Bvc2l0aW9uKGRldiwgJmRlZmF1bHRfOHhbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICBwYXRfMTZ4W2ldID0gcGFja19zYW1wbGVfcG9zaXRpb24oZGV2LCAmZGVmYXVsdF8xNnhbaV0pOworfQorCitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICppbnRlbF9waXBlbGluZV9zaGFkZXJfY3JlYXRlX21ldGEoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW50ZWxfZGV2X21ldGFfc2hhZGVyIGlkKQoreworICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnNoOworICAgIFZrUmVzdWx0IHJldDsKKworICAgIHNoID0gaW50ZWxfYWxsb2MoZGV2LCBzaXplb2YoKnNoKSwgc2l6ZW9mKGludCksIFZLX1NZU1RFTV9BTExPQ0FUSU9OX1NDT1BFX0RFVklDRSk7CisgICAgaWYgKCFzaCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KHNoLCAwLCBzaXplb2YoKnNoKSk7CisKKyAgICByZXQgPSBpbnRlbF9waXBlbGluZV9zaGFkZXJfY29tcGlsZV9tZXRhKHNoLCBkZXYtPmdwdSwgaWQpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBpbnRlbF9mcmVlKGRldiwgc2gpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBJTlRFTF9ERVZfTUVUQV9WU19GSUxMX01FTToKKyAgICBjYXNlIElOVEVMX0RFVl9NRVRBX1ZTX0NPUFlfTUVNOgorICAgIGNhc2UgSU5URUxfREVWX01FVEFfVlNfQ09QWV9NRU1fVU5BTElHTkVEOgorICAgICAgICBzaC0+bWF4X3RocmVhZHMgPSBpbnRlbF9ncHVfZ2V0X21heF90aHJlYWRzKGRldi0+Z3B1LAorICAgICAgICAgICAgICAgIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc2gtPm1heF90aHJlYWRzID0gaW50ZWxfZ3B1X2dldF9tYXhfdGhyZWFkcyhkZXYtPmdwdSwKKyAgICAgICAgICAgICAgICBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHNoOworfQorCit2b2lkIGludGVsX3BpcGVsaW5lX3NoYWRlcl9kZXN0cm95KHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqc2gpCit7CisgICAgaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NsZWFudXAoc2gsIGRldi0+Z3B1KTsKKyAgICBpbnRlbF9mcmVlKGRldiwgc2gpOworfQorCitzdGF0aWMgVmtSZXN1bHQgcGlwZWxpbmVfYnVpbGRfc2hhZGVyKHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAqc2hfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpzaCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSAqbW9kID0KKyAgICAgICAgaW50ZWxfc2hhZGVyX21vZHVsZShzaF9pbmZvLT5tb2R1bGUpOworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pciAqaXIgPQorICAgICAgICBpbnRlbF9zaGFkZXJfbW9kdWxlX2dldF9pcihtb2QsIHNoX2luZm8tPnN0YWdlKTsKKyAgICBWa1Jlc3VsdCByZXQ7CisKKyAgICBpZiAoIWlyKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgcmV0ID0gaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NvbXBpbGUoc2gsCisgICAgICAgICAgICBwaXBlbGluZS0+ZGV2LT5ncHUsIHBpcGVsaW5lLT5waXBlbGluZV9sYXlvdXQsIHNoX2luZm8sIGlyKTsKKworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHNoLT5tYXhfdGhyZWFkcyA9CisgICAgICAgIGludGVsX2dwdV9nZXRfbWF4X3RocmVhZHMocGlwZWxpbmUtPmRldi0+Z3B1LCBzaF9pbmZvLT5zdGFnZSk7CisKKyAgICAvKiAxS0IgYWxpZ25lZCAqLworICAgIHNoLT5zY3JhdGNoX29mZnNldCA9IHVfYWxpZ24ocGlwZWxpbmUtPnNjcmF0Y2hfc2l6ZSwgMTAyNCk7CisgICAgcGlwZWxpbmUtPnNjcmF0Y2hfc2l6ZSA9IHNoLT5zY3JhdGNoX29mZnNldCArCisgICAgICAgIHNoLT5wZXJfdGhyZWFkX3NjcmF0Y2hfc2l6ZSAqIHNoLT5tYXhfdGhyZWFkczsKKworICAgIHBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyB8PSBzaF9pbmZvLT5zdGFnZTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVmtSZXN1bHQgcGlwZWxpbmVfYnVpbGRfc2hhZGVycyhzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfY3JlYXRlX2luZm8gKmluZm8pCit7CisgICAgVmtSZXN1bHQgcmV0ID0gVktfU1VDQ0VTUzsKKworICAgIGlmIChyZXQgPT0gVktfU1VDQ0VTUyAmJiBpbmZvLT52cy5tb2R1bGUpCisgICAgICAgIHJldCA9IHBpcGVsaW5lX2J1aWxkX3NoYWRlcihwaXBlbGluZSwgJmluZm8tPnZzLCAmcGlwZWxpbmUtPnZzKTsKKyAgICBpZiAocmV0ID09IFZLX1NVQ0NFU1MgJiYgaW5mby0+dGNzLm1vZHVsZSkKKyAgICAgICAgcmV0ID0gcGlwZWxpbmVfYnVpbGRfc2hhZGVyKHBpcGVsaW5lLCAmaW5mby0+dGNzLCZwaXBlbGluZS0+dGNzKTsKKyAgICBpZiAocmV0ID09IFZLX1NVQ0NFU1MgJiYgaW5mby0+dGVzLm1vZHVsZSkKKyAgICAgICAgcmV0ID0gcGlwZWxpbmVfYnVpbGRfc2hhZGVyKHBpcGVsaW5lLCAmaW5mby0+dGVzLCZwaXBlbGluZS0+dGVzKTsKKyAgICBpZiAocmV0ID09IFZLX1NVQ0NFU1MgJiYgaW5mby0+Z3MubW9kdWxlKQorICAgICAgICByZXQgPSBwaXBlbGluZV9idWlsZF9zaGFkZXIocGlwZWxpbmUsICZpbmZvLT5ncywgJnBpcGVsaW5lLT5ncyk7CisgICAgaWYgKHJldCA9PSBWS19TVUNDRVNTICYmIGluZm8tPmZzLm1vZHVsZSkKKyAgICAgICAgcmV0ID0gcGlwZWxpbmVfYnVpbGRfc2hhZGVyKHBpcGVsaW5lLCAmaW5mby0+ZnMsICZwaXBlbGluZS0+ZnMpOworCisgICAgaWYgKHJldCA9PSBWS19TVUNDRVNTICYmIGluZm8tPmNvbXB1dGUuc3RhZ2UubW9kdWxlKSB7CisgICAgICAgIHJldCA9IHBpcGVsaW5lX2J1aWxkX3NoYWRlcihwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAmaW5mby0+Y29tcHV0ZS5zdGFnZSwgJnBpcGVsaW5lLT5jcyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KK3N0YXRpYyB1aW50MzJfdCAqcGlwZWxpbmVfY21kX3B0cihzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lLCBpbnQgY21kX2xlbikKK3sKKyAgICB1aW50MzJfdCAqcHRyOworCisgICAgYXNzZXJ0KHBpcGVsaW5lLT5jbWRfbGVuICsgY21kX2xlbiA8IElOVEVMX1BTT19DTURfRU5UUklFUyk7CisgICAgcHRyID0gJnBpcGVsaW5lLT5jbWRzW3BpcGVsaW5lLT5jbWRfbGVuXTsKKyAgICBwaXBlbGluZS0+Y21kX2xlbiArPSBjbWRfbGVuOworICAgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBwaXBlbGluZV9idWlsZF9pYShzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2NyZWF0ZV9pbmZvKiBpbmZvKQoreworICAgIHBpcGVsaW5lLT50b3BvbG9neSA9IGluZm8tPmlhLnRvcG9sb2d5OworICAgIHBpcGVsaW5lLT5kaXNhYmxlX3ZzX2NhY2hlID0gZmFsc2U7CisKKyAgICBzd2l0Y2ggKGluZm8tPmlhLnRvcG9sb2d5KSB7CisgICAgY2FzZSBWS19QUklNSVRJVkVfVE9QT0xPR1lfUE9JTlRfTElTVDoKKyAgICAgICAgcGlwZWxpbmUtPnByaW1fdHlwZSA9IEdFTjZfM0RQUklNX1BPSU5UTElTVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9MSVNUOgorICAgICAgICBwaXBlbGluZS0+cHJpbV90eXBlID0gR0VONl8zRFBSSU1fTElORUxJU1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfU1RSSVA6CisgICAgICAgIHBpcGVsaW5lLT5wcmltX3R5cGUgPSBHRU42XzNEUFJJTV9MSU5FU1RSSVA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1Q6CisgICAgICAgIHBpcGVsaW5lLT5wcmltX3R5cGUgPSBHRU42XzNEUFJJTV9UUklMSVNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9TVFJJUDoKKyAgICAgICAgcGlwZWxpbmUtPnByaW1fdHlwZSA9IEdFTjZfM0RQUklNX1RSSVNUUklQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1BSSU1JVElWRV9UT1BPTE9HWV9UUklBTkdMRV9GQU46CisgICAgICAgIHBpcGVsaW5lLT5wcmltX3R5cGUgPSBHRU42XzNEUFJJTV9UUklGQU47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX0xJTkVfTElTVF9XSVRIX0FESkFDRU5DWToKKyAgICAgICAgcGlwZWxpbmUtPnByaW1fdHlwZSA9IEdFTjZfM0RQUklNX0xJTkVMSVNUX0FESjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19QUklNSVRJVkVfVE9QT0xPR1lfTElORV9TVFJJUF9XSVRIX0FESkFDRU5DWToKKyAgICAgICAgcGlwZWxpbmUtPnByaW1fdHlwZSA9IEdFTjZfM0RQUklNX0xJTkVTVFJJUF9BREo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX0xJU1RfV0lUSF9BREpBQ0VOQ1k6CisgICAgICAgIHBpcGVsaW5lLT5wcmltX3R5cGUgPSBHRU42XzNEUFJJTV9UUklMSVNUX0FESjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfU1RSSVBfV0lUSF9BREpBQ0VOQ1k6CisgICAgICAgIHBpcGVsaW5lLT5wcmltX3R5cGUgPSBHRU42XzNEUFJJTV9UUklTVFJJUF9BREo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUFJJTUlUSVZFX1RPUE9MT0dZX1BBVENIX0xJU1Q6CisgICAgICAgIHBpcGVsaW5lLT5wcmltX3R5cGUgPSBHRU43XzNEUFJJTV9QQVRDSExJU1RfMSArCisgICAgICAgICAgICBpbmZvLT50ZXNzLnBhdGNoQ29udHJvbFBvaW50cyAtIDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCghInVuc3VwcG9ydGVkIHByaW1pdGl2ZSB0b3BvbG9neSBmb3JtYXQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGluZm8tPmlhLnByaW1pdGl2ZVJlc3RhcnRFbmFibGUpIHsKKyAgICAgICAgcGlwZWxpbmUtPnByaW1pdGl2ZV9yZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgcGlwZWxpbmUtPnByaW1pdGl2ZV9yZXN0YXJ0X2luZGV4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwaXBlbGluZS0+cHJpbWl0aXZlX3Jlc3RhcnQgPSBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZrUmVzdWx0IHBpcGVsaW5lX2J1aWxkX3JzX3N0YXRlKHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfY3JlYXRlX2luZm8qIGluZm8pCit7CisgICAgY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gKnJzX3N0YXRlID0gJmluZm8tPnJzOworICAgIGJvb2wgY2N3OworCisgICAgcGlwZWxpbmUtPmRlcHRoQ2xpcEVuYWJsZSA9ICFyc19zdGF0ZS0+ZGVwdGhDbGFtcEVuYWJsZTsKKyAgICBwaXBlbGluZS0+cmFzdGVyaXplckRpc2NhcmRFbmFibGUgPSByc19zdGF0ZS0+cmFzdGVyaXplckRpc2NhcmRFbmFibGU7CisgICAgcGlwZWxpbmUtPmRlcHRoQmlhc0VuYWJsZSA9IHJzX3N0YXRlLT5kZXB0aEJpYXNFbmFibGU7CisKKyAgICBzd2l0Y2ggKHJzX3N0YXRlLT5wb2x5Z29uTW9kZSkgeworICAgIGNhc2UgVktfUE9MWUdPTl9NT0RFX1BPSU5UOgorICAgICAgICBwaXBlbGluZS0+Y21kX3NmX2ZpbGwgfD0gR0VON19TRl9EVzFfRlJPTlRGQUNFX1BPSU5UIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjdfU0ZfRFcxX0JBQ0tGQUNFX1BPSU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1BPTFlHT05fTU9ERV9MSU5FOgorICAgICAgICBwaXBlbGluZS0+Y21kX3NmX2ZpbGwgfD0gR0VON19TRl9EVzFfRlJPTlRGQUNFX1dJUkVGUkFNRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU43X1NGX0RXMV9CQUNLRkFDRV9XSVJFRlJBTUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUE9MWUdPTl9NT0RFX0ZJTEw6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcGlwZWxpbmUtPmNtZF9zZl9maWxsIHw9IEdFTjdfU0ZfRFcxX0ZST05URkFDRV9TT0xJRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU43X1NGX0RXMV9CQUNLRkFDRV9TT0xJRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2N3ID0gKHJzX3N0YXRlLT5mcm9udEZhY2UgPT0gVktfRlJPTlRfRkFDRV9DT1VOVEVSX0NMT0NLV0lTRSk7CisgICAgLyogZmxpcCB0aGUgd2luZGluZyBvcmRlciAqLworCisgICAgaWYgKGNjdykgeworICAgICAgICBwaXBlbGluZS0+Y21kX3NmX2ZpbGwgfD0gR0VON19TRl9EVzFfRlJPTlRXSU5ESU5HX0NDVzsKKyAgICAgICAgcGlwZWxpbmUtPmNtZF9jbGlwX2N1bGwgfD0gR0VON19DTElQX0RXMV9GUk9OVFdJTkRJTkdfQ0NXOworICAgIH0KKworICAgIHN3aXRjaCAocnNfc3RhdGUtPmN1bGxNb2RlKSB7CisgICAgY2FzZSBWS19DVUxMX01PREVfTk9ORToKKyAgICBkZWZhdWx0OgorICAgICAgICBwaXBlbGluZS0+Y21kX3NmX2N1bGwgfD0gR0VON19TRl9EVzJfQ1VMTE1PREVfTk9ORTsKKyAgICAgICAgcGlwZWxpbmUtPmNtZF9jbGlwX2N1bGwgfD0gR0VON19DTElQX0RXMV9DVUxMTU9ERV9OT05FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0NVTExfTU9ERV9GUk9OVF9CSVQ6CisgICAgICAgIHBpcGVsaW5lLT5jbWRfc2ZfY3VsbCB8PSBHRU43X1NGX0RXMl9DVUxMTU9ERV9GUk9OVDsKKyAgICAgICAgcGlwZWxpbmUtPmNtZF9jbGlwX2N1bGwgfD0gR0VON19DTElQX0RXMV9DVUxMTU9ERV9GUk9OVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19DVUxMX01PREVfQkFDS19CSVQ6CisgICAgICAgIHBpcGVsaW5lLT5jbWRfc2ZfY3VsbCB8PSBHRU43X1NGX0RXMl9DVUxMTU9ERV9CQUNLOworICAgICAgICBwaXBlbGluZS0+Y21kX2NsaXBfY3VsbCB8PSBHRU43X0NMSVBfRFcxX0NVTExNT0RFX0JBQ0s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfQ1VMTF9NT0RFX0ZST05UX0FORF9CQUNLOgorICAgICAgICBwaXBlbGluZS0+Y21kX3NmX2N1bGwgfD0gR0VON19TRl9EVzJfQ1VMTE1PREVfQk9USDsKKyAgICAgICAgcGlwZWxpbmUtPmNtZF9jbGlwX2N1bGwgfD0gR0VON19DTElQX0RXMV9DVUxMTU9ERV9CT1RIOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBvbmx5IEdFTjcrIG5lZWRzIGN1bGwgbW9kZSBpbiAzRFNUQVRFX0NMSVAgKi8KKyAgICBpZiAoaW50ZWxfZ3B1X2dlbihwaXBlbGluZS0+ZGV2LT5ncHUpID09IElOVEVMX0dFTig2KSkKKyAgICAgICAgcGlwZWxpbmUtPmNtZF9jbGlwX2N1bGwgPSAwOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHBpcGVsaW5lX2Rlc3Ryb3koc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUgPSBpbnRlbF9waXBlbGluZV9mcm9tX29iaihvYmopOworCisgICAgaWYgKHBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmIFNIQURFUl9WRVJURVhfRkxBRykgeworICAgICAgICBpbnRlbF9waXBlbGluZV9zaGFkZXJfY2xlYW51cCgmcGlwZWxpbmUtPnZzLCBwaXBlbGluZS0+ZGV2LT5ncHUpOworICAgIH0KKworICAgIGlmIChwaXBlbGluZS0+YWN0aXZlX3NoYWRlcnMgJiBTSEFERVJfVEVTU19DT05UUk9MX0ZMQUcpIHsKKyAgICAgICAgaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NsZWFudXAoJnBpcGVsaW5lLT50Y3MsIHBpcGVsaW5lLT5kZXYtPmdwdSk7CisgICAgfQorCisgICAgaWYgKHBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmIFNIQURFUl9URVNTX0VWQUxfRkxBRykgeworICAgICAgICBpbnRlbF9waXBlbGluZV9zaGFkZXJfY2xlYW51cCgmcGlwZWxpbmUtPnRlcywgcGlwZWxpbmUtPmRldi0+Z3B1KTsKKyAgICB9CisKKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX0dFT01FVFJZX0ZMQUcpIHsKKyAgICAgICAgaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NsZWFudXAoJnBpcGVsaW5lLT5ncywgcGlwZWxpbmUtPmRldi0+Z3B1KTsKKyAgICB9CisKKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX0ZSQUdNRU5UX0ZMQUcpIHsKKyAgICAgICAgaW50ZWxfcGlwZWxpbmVfc2hhZGVyX2NsZWFudXAoJnBpcGVsaW5lLT5mcywgcGlwZWxpbmUtPmRldi0+Z3B1KTsKKyAgICB9CisKKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX0NPTVBVVEVfRkxBRykgeworICAgICAgICBpbnRlbF9waXBlbGluZV9zaGFkZXJfY2xlYW51cCgmcGlwZWxpbmUtPmNzLCBwaXBlbGluZS0+ZGV2LT5ncHUpOworICAgIH0KKworICAgIGludGVsX2Jhc2VfZGVzdHJveSgmcGlwZWxpbmUtPm9iai5iYXNlKTsKK30KKworc3RhdGljIHZvaWQgcGlwZWxpbmVfYnVpbGRfdXJiX2FsbG9jX2dlbjYoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyAqaW5mbykKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUgPSBwaXBlbGluZS0+ZGV2LT5ncHU7CisgICAgY29uc3QgaW50IHVyYl9zaXplID0gKChncHUtPmd0ID09IDIpID8gNjQgOiAzMikgKiAxMDI0OworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnZzID0gJnBpcGVsaW5lLT52czsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpncyA9ICZwaXBlbGluZS0+Z3M7CisgICAgaW50IHZzX2VudHJ5X3NpemUsIGdzX2VudHJ5X3NpemU7CisgICAgaW50IHZzX3NpemUsIGdzX3NpemU7CisKKyAgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNiwgNik7CisKKyAgICB2c19lbnRyeV9zaXplID0gKCh2cy0+aW5fY291bnQgPj0gdnMtPm91dF9jb3VudCkgPworICAgICAgICB2cy0+aW5fY291bnQgOiB2cy0+b3V0X2NvdW50KTsKKyAgICBnc19lbnRyeV9zaXplID0gKGdzKSA/IGdzLT5vdXRfY291bnQgOiAwOworCisgICAgLyogaW4gYnl0ZXMgKi8KKyAgICB2c19lbnRyeV9zaXplICo9IHNpemVvZihmbG9hdCkgKiA0OworICAgIGdzX2VudHJ5X3NpemUgKj0gc2l6ZW9mKGZsb2F0KSAqIDQ7CisKKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX0dFT01FVFJZX0ZMQUcpIHsKKyAgICAgICAgdnNfc2l6ZSA9IHVyYl9zaXplIC8gMjsKKyAgICAgICAgZ3Nfc2l6ZSA9IHZzX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdnNfc2l6ZSA9IHVyYl9zaXplOworICAgICAgICBnc19zaXplID0gMDsKKyAgICB9CisKKyAgICAvKiAzRFNUQVRFX1VSQiAqLworICAgIHsKKyAgICAgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMzsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZHcwID0gR0VONl9SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1VSQikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY21kX2xlbiAtIDIpOworICAgICAgICBpbnQgdnNfYWxsb2Nfc2l6ZSwgZ3NfYWxsb2Nfc2l6ZTsKKyAgICAgICAgaW50IHZzX2VudHJ5X2NvdW50LCBnc19lbnRyeV9jb3VudDsKKyAgICAgICAgdWludDMyX3QgKmR3OworCisgICAgICAgIC8qIGluIDEwMjQtYml0IHJvd3MgKi8KKyAgICAgICAgdnNfYWxsb2Nfc2l6ZSA9ICh2c19lbnRyeV9zaXplICsgMTI4IC0gMSkgLyAxMjg7CisgICAgICAgIGdzX2FsbG9jX3NpemUgPSAoZ3NfZW50cnlfc2l6ZSArIDEyOCAtIDEpIC8gMTI4OworCisgICAgICAgIC8qIHZhbGlkIHJhbmdlIGlzIFsxLCA1XSAqLworICAgICAgICBpZiAoIXZzX2FsbG9jX3NpemUpCisgICAgICAgICAgICB2c19hbGxvY19zaXplID0gMTsKKyAgICAgICAgaWYgKCFnc19hbGxvY19zaXplKQorICAgICAgICAgICAgZ3NfYWxsb2Nfc2l6ZSA9IDE7CisgICAgICAgIGFzc2VydCh2c19hbGxvY19zaXplIDw9IDUgJiYgZ3NfYWxsb2Nfc2l6ZSA8PSA1KTsKKworICAgICAgICAvKiB2YWxpZCByYW5nZSBpcyBbMjQsIDI1Nl0sIG11bHRpcGxlcyBvZiA0ICovCisgICAgICAgIHZzX2VudHJ5X2NvdW50ID0gKHZzX3NpemUgLyAxMjggLyB2c19hbGxvY19zaXplKSAmIH4zOworICAgICAgICBpZiAodnNfZW50cnlfY291bnQgPiAyNTYpCisgICAgICAgICAgICB2c19lbnRyeV9jb3VudCA9IDI1NjsKKyAgICAgICAgYXNzZXJ0KHZzX2VudHJ5X2NvdW50ID49IDI0KTsKKworICAgICAgICAvKiB2YWxpZCByYW5nZSBpcyBbMCwgMjU2XSwgbXVsdGlwbGVzIG9mIDQgKi8KKyAgICAgICAgZ3NfZW50cnlfY291bnQgPSAoZ3Nfc2l6ZSAvIDEyOCAvIGdzX2FsbG9jX3NpemUpICYgfjM7CisgICAgICAgIGlmIChnc19lbnRyeV9jb3VudCA+IDI1NikKKyAgICAgICAgICAgIGdzX2VudHJ5X2NvdW50ID0gMjU2OworCisgICAgICAgIGR3ID0gcGlwZWxpbmVfY21kX3B0cihwaXBlbGluZSwgY21kX2xlbik7CisKKyAgICAgICAgZHdbMF0gPSBkdzA7CisgICAgICAgIGR3WzFdID0gKHZzX2FsbG9jX3NpemUgLSAxKSA8PCBHRU42X1VSQl9EVzFfVlNfRU5UUllfU0laRV9fU0hJRlQgfAorICAgICAgICAgICAgICAgIHZzX2VudHJ5X2NvdW50IDw8IEdFTjZfVVJCX0RXMV9WU19FTlRSWV9DT1VOVF9fU0hJRlQ7CisgICAgICAgIGR3WzJdID0gZ3NfZW50cnlfY291bnQgPDwgR0VONl9VUkJfRFcyX0dTX0VOVFJZX0NPVU5UX19TSElGVCB8CisgICAgICAgICAgICAgICAgKGdzX2FsbG9jX3NpemUgLSAxKSA8PCBHRU42X1VSQl9EVzJfR1NfRU5UUllfU0laRV9fU0hJRlQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwaXBlbGluZV9idWlsZF91cmJfYWxsb2NfZ2VuNyhzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKnBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2NyZWF0ZV9pbmZvICppbmZvKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSA9IHBpcGVsaW5lLT5kZXYtPmdwdTsKKyAgICBjb25zdCBpbnQgdXJiX3NpemUgPSAoKGdwdS0+Z3QgPT0gMykgPyA1MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3B1LT5ndCA9PSAyKSA/IDI1NiA6IDEyOCkgKiAxMDI0OworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnZzID0gJnBpcGVsaW5lLT52czsKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpncyA9ICZwaXBlbGluZS0+Z3M7CisgICAgLyogc29tZSBzcGFjZSBpcyByZXNlcnZlZCBmb3IgUENCcyAqLworICAgIGludCB1cmJfb2Zmc2V0ID0gKChncHUtPmd0ID09IDMpID8gMzIgOiAxNikgKiAxMDI0OworICAgIGludCB2c19lbnRyeV9zaXplLCBnc19lbnRyeV9zaXplOworICAgIGludCB2c19zaXplLCBnc19zaXplOworCisgICAgSU5URUxfR1BVX0FTU0VSVChncHUsIDcsIDcuNSk7CisKKyAgICB2c19lbnRyeV9zaXplID0gKCh2cy0+aW5fY291bnQgPj0gdnMtPm91dF9jb3VudCkgPworICAgICAgICB2cy0+aW5fY291bnQgOiB2cy0+b3V0X2NvdW50KTsKKyAgICBnc19lbnRyeV9zaXplID0gKGdzKSA/IGdzLT5vdXRfY291bnQgOiAwOworCisgICAgLyogaW4gYnl0ZXMgKi8KKyAgICB2c19lbnRyeV9zaXplICo9IHNpemVvZihmbG9hdCkgKiA0OworICAgIGdzX2VudHJ5X3NpemUgKj0gc2l6ZW9mKGZsb2F0KSAqIDQ7CisKKyAgICBpZiAocGlwZWxpbmUtPmFjdGl2ZV9zaGFkZXJzICYgU0hBREVSX0dFT01FVFJZX0ZMQUcpIHsKKyAgICAgICAgdnNfc2l6ZSA9ICh1cmJfc2l6ZSAtIHVyYl9vZmZzZXQpIC8gMjsKKyAgICAgICAgZ3Nfc2l6ZSA9IHZzX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdnNfc2l6ZSA9IHVyYl9zaXplIC0gdXJiX29mZnNldDsKKyAgICAgICAgZ3Nfc2l6ZSA9IDA7CisgICAgfQorCisgICAgLyogM0RTVEFURV9VUkJfKiAqLworICAgIHsKKyAgICAgICAgY29uc3QgdWludDhfdCBjbWRfbGVuID0gMjsKKyAgICAgICAgaW50IHZzX2FsbG9jX3NpemUsIGdzX2FsbG9jX3NpemU7CisgICAgICAgIGludCB2c19lbnRyeV9jb3VudCwgZ3NfZW50cnlfY291bnQ7CisgICAgICAgIHVpbnQzMl90ICpkdzsKKworICAgICAgICAvKiBpbiA1MTItYml0IHJvd3MgKi8KKyAgICAgICAgdnNfYWxsb2Nfc2l6ZSA9ICh2c19lbnRyeV9zaXplICsgNjQgLSAxKSAvIDY0OworICAgICAgICBnc19hbGxvY19zaXplID0gKGdzX2VudHJ5X3NpemUgKyA2NCAtIDEpIC8gNjQ7CisKKyAgICAgICAgaWYgKCF2c19hbGxvY19zaXplKQorICAgICAgICAgICAgdnNfYWxsb2Nfc2l6ZSA9IDE7CisgICAgICAgIGlmICghZ3NfYWxsb2Nfc2l6ZSkKKyAgICAgICAgICAgIGdzX2FsbG9jX3NpemUgPSAxOworCisgICAgICAgIC8qIGF2b2lkIHBlcmZvcm1hbmNlIGRlY3JlYXNlIGR1ZSB0byBiYW5raW5nICovCisgICAgICAgIGlmICh2c19hbGxvY19zaXplID09IDUpCisgICAgICAgICAgICB2c19hbGxvY19zaXplID0gNjsKKworICAgICAgICAvKiBpbiBtdWx0aXBsZXMgb2YgOCAqLworICAgICAgICB2c19lbnRyeV9jb3VudCA9ICh2c19zaXplIC8gNjQgLyB2c19hbGxvY19zaXplKSAmIH43OworICAgICAgICBhc3NlcnQodnNfZW50cnlfY291bnQgPj0gMzIpOworCisgICAgICAgIGdzX2VudHJ5X2NvdW50ID0gKGdzX3NpemUgLyA2NCAvIGdzX2FsbG9jX3NpemUpICYgfjc7CisKKyAgICAgICAgaWYgKGludGVsX2dwdV9nZW4oZ3B1KSA+PSBJTlRFTF9HRU4oNy41KSkgeworICAgICAgICAgICAgY29uc3QgaW50IG1heF92c19lbnRyeV9jb3VudCA9CisgICAgICAgICAgICAgICAgKGdwdS0+Z3QgPj0gMikgPyAxNjY0IDogNjQwOworICAgICAgICAgICAgY29uc3QgaW50IG1heF9nc19lbnRyeV9jb3VudCA9CisgICAgICAgICAgICAgICAgKGdwdS0+Z3QgPj0gMikgPyA2NDAgOiAyNTY7CisgICAgICAgICAgICBpZiAodnNfZW50cnlfY291bnQgPj0gbWF4X3ZzX2VudHJ5X2NvdW50KQorICAgICAgICAgICAgICAgIHZzX2VudHJ5X2NvdW50ID0gbWF4X3ZzX2VudHJ5X2NvdW50OworICAgICAgICAgICAgaWYgKGdzX2VudHJ5X2NvdW50ID49IG1heF9nc19lbnRyeV9jb3VudCkKKyAgICAgICAgICAgICAgICBnc19lbnRyeV9jb3VudCA9IG1heF9nc19lbnRyeV9jb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYXhfdnNfZW50cnlfY291bnQgPQorICAgICAgICAgICAgICAgIChncHUtPmd0ID09IDIpID8gNzA0IDogNTEyOworICAgICAgICAgICAgY29uc3QgaW50IG1heF9nc19lbnRyeV9jb3VudCA9CisgICAgICAgICAgICAgICAgKGdwdS0+Z3QgPT0gMikgPyAzMjAgOiAxOTI7CisgICAgICAgICAgICBpZiAodnNfZW50cnlfY291bnQgPj0gbWF4X3ZzX2VudHJ5X2NvdW50KQorICAgICAgICAgICAgICAgIHZzX2VudHJ5X2NvdW50ID0gbWF4X3ZzX2VudHJ5X2NvdW50OworICAgICAgICAgICAgaWYgKGdzX2VudHJ5X2NvdW50ID49IG1heF9nc19lbnRyeV9jb3VudCkKKyAgICAgICAgICAgICAgICBnc19lbnRyeV9jb3VudCA9IG1heF9nc19lbnRyeV9jb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGR3ID0gcGlwZWxpbmVfY21kX3B0cihwaXBlbGluZSwgY21kX2xlbio0KTsKKyAgICAgICAgZHdbMF0gPSBHRU43X1JFTkRFUl9DTUQoM0QsIDNEU1RBVEVfVVJCX1ZTKSB8IChjbWRfbGVuIC0gMik7CisgICAgICAgIGR3WzFdID0gKHVyYl9vZmZzZXQgLyA4MTkyKSA8PCBHRU43X1VSQl9EVzFfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICAgICAgKHZzX2FsbG9jX3NpemUgLSAxKSA8PCBHRU43X1VSQl9EVzFfRU5UUllfU0laRV9fU0hJRlQgfAorICAgICAgICAgICAgICAgIHZzX2VudHJ5X2NvdW50OworCisgICAgICAgIGR3ICs9IDI7CisgICAgICAgIGlmIChnc19zaXplKQorICAgICAgICAgICAgdXJiX29mZnNldCArPSB2c19zaXplOworICAgICAgICBkd1swXSA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9VUkJfR1MpIHwgKGNtZF9sZW4gLSAyKTsKKyAgICAgICAgZHdbMV0gPSAodXJiX29mZnNldCAgLyA4MTkyKSA8PCBHRU43X1VSQl9EVzFfT0ZGU0VUX19TSElGVCB8CisgICAgICAgICAgICAgICAgKGdzX2FsbG9jX3NpemUgLSAxKSA8PCBHRU43X1VSQl9EVzFfRU5UUllfU0laRV9fU0hJRlQgfAorICAgICAgICAgICAgICAgIGdzX2VudHJ5X2NvdW50OworCisgICAgICAgIGR3ICs9IDI7CisgICAgICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1VSQl9IUykgfCAoY21kX2xlbiAtIDIpOworICAgICAgICBkd1sxXSA9ICh1cmJfb2Zmc2V0IC8gODE5MikgIDw8IEdFTjdfVVJCX0RXMV9PRkZTRVRfX1NISUZUOworCisgICAgICAgIGR3ICs9IDI7CisgICAgICAgIGR3WzBdID0gR0VON19SRU5ERVJfQ01EKDNELCAzRFNUQVRFX1VSQl9EUykgfCAoY21kX2xlbiAtIDIpOworICAgICAgICBkd1sxXSA9ICh1cmJfb2Zmc2V0IC8gODE5MikgIDw8IEdFTjdfVVJCX0RXMV9PRkZTRVRfX1NISUZUOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGlwZWxpbmVfYnVpbGRfdmVydGV4X2VsZW1lbnRzKHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2NyZWF0ZV9pbmZvICppbmZvKQoreworICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnZzID0gJnBpcGVsaW5lLT52czsKKyAgICB1aW50OF90IGNtZF9sZW47CisgICAgdWludDMyX3QgKmR3OworICAgIHVpbnQzMl90IGksIGo7CisgICAgdWludDMyX3QgYXR0cl9jb3VudDsKKyAgICB1aW50MzJfdCBhdHRyc19wcm9jZXNzZWQ7CisgICAgaW50IGNvbXBzWzRdOworCisgICAgSU5URUxfR1BVX0FTU0VSVChwaXBlbGluZS0+ZGV2LT5ncHUsIDYsIDcuNSk7CisKKyAgICBhdHRyX2NvdW50ID0gdV9wb3Bjb3VudGxsKHZzLT5pbnB1dHNfcmVhZCk7CisgICAgY21kX2xlbiA9IDEgKyAyICogYXR0cl9jb3VudDsKKyAgICBpZiAodnMtPnVzZXMgJiAoSU5URUxfU0hBREVSX1VTRV9WSUQgfCBJTlRFTF9TSEFERVJfVVNFX0lJRCkpCisgICAgICAgIGNtZF9sZW4gKz0gMjsKKworICAgIGlmIChjbWRfbGVuID09IDEpCisgICAgICAgIHJldHVybjsKKworICAgIGR3ID0gcGlwZWxpbmVfY21kX3B0cihwaXBlbGluZSwgY21kX2xlbik7CisKKyAgICBkd1swXSA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9WRVJURVhfRUxFTUVOVFMpIHwKKyAgICAgICAgICAgIChjbWRfbGVuIC0gMik7CisgICAgZHcrKzsKKworICAgIC8qIFZFUlRFWF9FTEVNRU5UX1NUQVRFICovCisgICAgZm9yIChpID0gMCwgYXR0cnNfcHJvY2Vzc2VkID0gMDsgYXR0cnNfcHJvY2Vzc2VkIDwgYXR0cl9jb3VudDsgaSsrKSB7CisgICAgICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiAqYXR0ciA9IE5VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGNvbXBpbGVyIHdpbGwgcGFjayB0aGUgc2hhZGVyIHJlZmVyZW5jZXMgYW5kIHRoZW4KKyAgICAgICAgICogaW5kaWNhdGUgd2hpY2ggbG9jYXRpb25zIGFyZSB1c2VkIHZpYSB0aGUgYml0bWFzayBpbgorICAgICAgICAgKiB2cy0+aW5wdXRzX3JlYWQuCisgICAgICAgICAqLworICAgICAgICBpZiAoISh2cy0+aW5wdXRzX3JlYWQgJiAoMUwgPDwgaSkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGJpdCBzZXQgaW4gdGhlIHZzLT5pbnB1dHNfcmVhZCB3ZSdsbCBuZWVkCisgICAgICAgICAqIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIHJlY29yZCBhbmQgdGhlbgorICAgICAgICAgKiBzZXQgdXAgdGhlIG5leHQgSFcgdmVydGV4IGVsZW1lbnQgYmFzZWQgb24gdGhhdCBhdHRyaWJ1dGUuCisgICAgICAgICAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5mby0+dmkudmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudDsgaisrKSB7CisgICAgICAgICAgICBpZiAoaW5mby0+dmkucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uc1tqXS5sb2NhdGlvbiA9PSBpKSB7CisgICAgICAgICAgICAgICAgYXR0ciA9IChWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gKikgJmluZm8tPnZpLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnNbal07CisgICAgICAgICAgICAgICAgYXR0cnNfcHJvY2Vzc2VkKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGF0dHIgIT0gTlVMTCk7CisKKyAgICAgICAgY29uc3QgaW50IGZvcm1hdCA9CisgICAgICAgICAgICBpbnRlbF9mb3JtYXRfdHJhbnNsYXRlX2NvbG9yKHBpcGVsaW5lLT5kZXYtPmdwdSwgYXR0ci0+Zm9ybWF0KTsKKworICAgICAgICBjb21wc1swXSA9IEdFTjZfVkZDT01QX1NUT1JFXzA7CisgICAgICAgIGNvbXBzWzFdID0gR0VONl9WRkNPTVBfU1RPUkVfMDsKKyAgICAgICAgY29tcHNbMl0gPSBHRU42X1ZGQ09NUF9TVE9SRV8wOworICAgICAgICBjb21wc1szXSA9IGljZF9mb3JtYXRfaXNfaW50KGF0dHItPmZvcm1hdCkgPworICAgICAgICAgICAgR0VONl9WRkNPTVBfU1RPUkVfMV9JTlQgOiBHRU42X1ZGQ09NUF9TVE9SRV8xX0ZQOworCisgICAgICAgIHN3aXRjaCAoaWNkX2Zvcm1hdF9nZXRfY2hhbm5lbF9jb3VudChhdHRyLT5mb3JtYXQpKSB7CisgICAgICAgIGNhc2UgNDogY29tcHNbM10gPSBHRU42X1ZGQ09NUF9TVE9SRV9TUkM7IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIDM6IGNvbXBzWzJdID0gR0VONl9WRkNPTVBfU1RPUkVfU1JDOyAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSAyOiBjb21wc1sxXSA9IEdFTjZfVkZDT01QX1NUT1JFX1NSQzsgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgMTogY29tcHNbMF0gPSBHRU42X1ZGQ09NUF9TVE9SRV9TUkM7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQoYXR0ci0+b2Zmc2V0IDw9IDIwNDcpOworCisgICAgICAgIGR3WzBdID0gYXR0ci0+YmluZGluZyA8PCBHRU42X1ZFX0RXMF9WQl9JTkRFWF9fU0hJRlQgfAorICAgICAgICAgICAgICAgIEdFTjZfVkVfRFcwX1ZBTElEIHwKKyAgICAgICAgICAgICAgICBmb3JtYXQgPDwgR0VONl9WRV9EVzBfRk9STUFUX19TSElGVCB8CisgICAgICAgICAgICAgICAgYXR0ci0+b2Zmc2V0OworCisgICAgICAgIGR3WzFdID0gY29tcHNbMF0gPDwgR0VONl9WRV9EVzFfQ09NUDBfX1NISUZUIHwKKyAgICAgICAgICAgICAgICBjb21wc1sxXSA8PCBHRU42X1ZFX0RXMV9DT01QMV9fU0hJRlQgfAorICAgICAgICAgICAgICAgIGNvbXBzWzJdIDw8IEdFTjZfVkVfRFcxX0NPTVAyX19TSElGVCB8CisgICAgICAgICAgICAgICAgY29tcHNbM10gPDwgR0VONl9WRV9EVzFfQ09NUDNfX1NISUZUOworCisgICAgICAgIGR3ICs9IDI7CisgICAgfQorCisgICAgaWYgKHZzLT51c2VzICYgKElOVEVMX1NIQURFUl9VU0VfVklEIHwgSU5URUxfU0hBREVSX1VTRV9JSUQpKSB7CisgICAgICAgIGNvbXBzWzBdID0gKHZzLT51c2VzICYgSU5URUxfU0hBREVSX1VTRV9WSUQpID8KKyAgICAgICAgICAgIEdFTjZfVkZDT01QX1NUT1JFX1ZJRCA6IEdFTjZfVkZDT01QX1NUT1JFXzA7CisgICAgICAgIGNvbXBzWzFdID0gKHZzLT51c2VzICYgSU5URUxfU0hBREVSX1VTRV9JSUQpID8KKyAgICAgICAgICAgIEdFTjZfVkZDT01QX1NUT1JFX0lJRCA6IEdFTjZfVkZDT01QX05PU1RPUkU7CisgICAgICAgIGNvbXBzWzJdID0gR0VONl9WRkNPTVBfTk9TVE9SRTsKKyAgICAgICAgY29tcHNbM10gPSBHRU42X1ZGQ09NUF9OT1NUT1JFOworCisgICAgICAgIGR3WzBdID0gR0VONl9WRV9EVzBfVkFMSUQ7CisgICAgICAgIGR3WzFdID0gY29tcHNbMF0gPDwgR0VONl9WRV9EVzFfQ09NUDBfX1NISUZUIHwKKyAgICAgICAgICAgICAgICBjb21wc1sxXSA8PCBHRU42X1ZFX0RXMV9DT01QMV9fU0hJRlQgfAorICAgICAgICAgICAgICAgIGNvbXBzWzJdIDw8IEdFTjZfVkVfRFcxX0NPTVAyX19TSElGVCB8CisgICAgICAgICAgICAgICAgY29tcHNbM10gPDwgR0VONl9WRV9EVzFfQ09NUDNfX1NISUZUOworCisgICAgICAgIGR3ICs9IDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwaXBlbGluZV9idWlsZF9mcmFnbWVudF9TQkUoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfY3JlYXRlX2luZm8gKmluZm8pCit7CisgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciAqZnMgPSAmcGlwZWxpbmUtPmZzOworICAgIHVpbnQ4X3QgY21kX2xlbjsKKyAgICB1aW50MzJfdCAqYm9keTsKKyAgICB1aW50MzJfdCBhdHRyX3NraXAsIGF0dHJfY291bnQ7CisgICAgdWludDMyX3QgdnVlX29mZnNldCwgdnVlX2xlbjsKKyAgICB1aW50MzJfdCBpOworCisgICAgLy8gSWYgR1MgaXMgYWN0aXZlLCB1c2UgaXRzIG91dHB1dHMKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyICpzcmMgPQorICAgICAgICAgICAgKHBpcGVsaW5lLT5hY3RpdmVfc2hhZGVycyAmIFNIQURFUl9HRU9NRVRSWV9GTEFHKQorICAgICAgICAgICAgICAgICAgICA/ICZwaXBlbGluZS0+Z3MKKyAgICAgICAgICAgICAgICAgICAgOiAmcGlwZWxpbmUtPnZzOworCisgICAgSU5URUxfR1BVX0FTU0VSVChwaXBlbGluZS0+ZGV2LT5ncHUsIDYsIDcuNSk7CisKKyAgICBjbWRfbGVuID0gMTQ7CisKKyAgICBpZiAoaW50ZWxfZ3B1X2dlbihwaXBlbGluZS0+ZGV2LT5ncHUpID49IElOVEVMX0dFTig3KSkKKyAgICAgICAgYm9keSA9IHBpcGVsaW5lX2NtZF9wdHIocGlwZWxpbmUsIGNtZF9sZW4pOworICAgIGVsc2UKKyAgICAgICAgYm9keSA9IHBpcGVsaW5lLT5jbWRfM2RzdGF0ZV9zYmU7CisKKyAgICBhc3NlcnQoIWZzLT5yZWFkc191c2VyX2NsaXAgfHwgc3JjLT5lbmFibGVfdXNlcl9jbGlwKTsKKyAgICBhdHRyX3NraXAgPSBzcmMtPm91dHB1dHNfb2Zmc2V0OworICAgIGlmIChzcmMtPmVuYWJsZV91c2VyX2NsaXAgIT0gZnMtPnJlYWRzX3VzZXJfY2xpcCkgeworICAgICAgICBhdHRyX3NraXAgKz0gMjsKKyAgICB9CisgICAgYXNzZXJ0KHNyYy0+b3V0X2NvdW50ID49IGF0dHJfc2tpcCk7CisgICAgYXR0cl9jb3VudCA9IHNyYy0+b3V0X2NvdW50IC0gYXR0cl9za2lwOworCisgICAgLy8gTFVOQVJHIFRPRE86IFdlIGN1cnJlbnRseSBhcmUgb25seSBoYW5kbGluZyAxNiBhdHRyczsKKyAgICAvLyB1bHRpbWF0ZWx5LCB3ZSBuZWVkIHRvIGhhbmRsZSAzMgorICAgIGFzc2VydChmcy0+aW5fY291bnQgPD0gMTYpOworICAgIGFzc2VydChhdHRyX2NvdW50IDw9IDE2KTsKKworICAgIHZ1ZV9vZmZzZXQgPSBhdHRyX3NraXAgLyAyOworICAgIHZ1ZV9sZW4gPSAoYXR0cl9jb3VudCArIDEpIC8gMjsKKyAgICBpZiAoIXZ1ZV9sZW4pCisgICAgICAgIHZ1ZV9sZW4gPSAxOworCisgICAgYm9keVswXSA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9TQkUpIHwKKyAgICAgICAgICAgIChjbWRfbGVuIC0gMik7CisKKyAgICAvLyBMVU5BUkcgVE9ETzogSWYgdGhlIGF0dHJzIG5lZWRlZCBieSB0aGUgRlMgYXJlIGV4YWN0bHkKKyAgICAvLyB3aGF0IGlzIHdyaXR0ZW4gYnkgdGhlIFZTLCB3ZSBkb24ndCBuZWVkIHRvIGVuYWJsZQorICAgIC8vIHN3aXp6bGluZywgaW1wcm92aW5nIHBlcmZvcm1hbmNlLiBFdmVuIGlmIHdlIHN3aXp6bGUsCisgICAgLy8gd2UgY2FuIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgcmVkdWNpbmcgdnVlX2xlbiB0bworICAgIC8vIGp1c3QgaW5jbHVkZSB0aGUgdmFsdWVzIG5lZWRlZCBieSB0aGUgRlM6CisgICAgLy8gdnVlX2xlbiA9IGNlaWxpbmcoKG1heF92c19vdXQgKyAxKS8yKQorCisgICAgYm9keVsxXSA9IEdFTjdfU0JFX0RXMV9BVFRSX1NXSVpaTEVfRU5BQkxFIHwKKyAgICAgICAgICBmcy0+aW5fY291bnQgPDwgR0VON19TQkVfRFcxX0FUVFJfQ09VTlRfX1NISUZUIHwKKyAgICAgICAgICB2dWVfbGVuIDw8IEdFTjdfU0JFX0RXMV9VUkJfUkVBRF9MRU5fX1NISUZUIHwKKyAgICAgICAgICB2dWVfb2Zmc2V0IDw8IEdFTjdfU0JFX0RXMV9VUkJfUkVBRF9PRkZTRVRfX1NISUZUOworCisgICAgLyogVnVsa2FuIGRlZmF1bHQgaXMgcG9pbnQgb3JpZ2luIHVwcGVyIGxlZnQgKi8KKyAgICBib2R5WzFdIHw9IEdFTjdfU0JFX0RXMV9QT0lOVF9TUFJJVEVfVEVYQ09PUkRfVVBQRVJMRUZUOworCisgICAgdWludDE2X3Qgc3JjX3Nsb3RbZnMtPmluX2NvdW50XTsKKyAgICBpbnQzMl90IGZzX2luID0gMDsKKyAgICBpbnQzMl90IHNyY19vdXQgPSAtICh2dWVfb2Zmc2V0ICogMiAtIHNyYy0+b3V0cHV0c19vZmZzZXQpOworICAgIGZvciAoaT0wOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBib29sIHNyY1dyaXRlcyA9IHNyYy0+b3V0cHV0c193cml0dGVuICYgKDFMIDw8IGkpOworICAgICAgICBib29sIGZzUmVhZHMgICA9IGZzLT5pbnB1dHNfcmVhZCAgICAgICYgKDFMIDw8IGkpOworCisgICAgICAgIGlmIChmc1JlYWRzKSB7CisgICAgICAgICAgICBhc3NlcnQoc3JjX291dCA+PSAwKTsKKyAgICAgICAgICAgIGFzc2VydChmc19pbiA8IGZzLT5pbl9jb3VudCk7CisgICAgICAgICAgICBzcmNfc2xvdFtmc19pbl0gPSBzcmNfb3V0OworCisgICAgICAgICAgICBpZiAoIXNyY1dyaXRlcykgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2ZXJ0ZXggc2hhZGVyIGRpZCBub3Qgd3JpdGUgdGhpcyBpbnB1dCwgd2UgY2Fubm90CisgICAgICAgICAgICAgICAgLy8gcHJvZ3JhbSB0aGUgU0JFIHRvIHJlYWQgaXQuICBPdXIgY2hvaWNlcyBhcmUgdG8gYWxsb3cgaXQgdG8KKyAgICAgICAgICAgICAgICAvLyByZWFkIGp1bmsgZnJvbSBhIEdSRiwgb3IgZ2V0IHplcm8uICBXZSdyZSBjaG9vc2luZyB6ZXJvLgorICAgICAgICAgICAgICAgIGlmIChpID49IGZzLT5nZW5lcmljX2lucHV0X3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIHNyY19zbG90W2ZzX2luXSA9IEdFTjhfU0JFX1NXSVpfQ09OU1RfMDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VOOF9TQkVfU1dJWl9PVkVSUklERV9YIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU44X1NCRV9TV0laX09WRVJSSURFX1kgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjhfU0JFX1NXSVpfT1ZFUlJJREVfWiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VOOF9TQkVfU1dJWl9PVkVSUklERV9XOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnNfaW4gKz0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjV3JpdGVzKSB7CisgICAgICAgICAgICBzcmNfb3V0ICs9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGhpLCBsbzsKKworICAgICAgICAvKiBubyBhdHRyIHN3aXp6bGVzICovCisgICAgICAgIGlmIChpICogMiArIDEgPCBmcy0+aW5fY291bnQpIHsKKyAgICAgICAgICAgIGxvID0gc3JjX3Nsb3RbaSAqIDJdOworICAgICAgICAgICAgaGkgPSBzcmNfc2xvdFtpICogMiArIDFdOworICAgICAgICB9IGVsc2UgaWYgKGkgKiAyIDwgZnMtPmluX2NvdW50KSB7CisgICAgICAgICAgICBsbyA9IHNyY19zbG90W2kgKiAyXTsKKyAgICAgICAgICAgIGhpID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhpID0gMDsKKyAgICAgICAgICAgIGxvID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGJvZHlbMiArIGldID0gaGkgPDwgR0VOOF9TQkVfU1dJWl9ISUdIX19TSElGVCB8IGxvOworICAgIH0KKworICAgIGlmIChpbmZvLT5pYS50b3BvbG9neSA9PSBWS19QUklNSVRJVkVfVE9QT0xPR1lfUE9JTlRfTElTVCkKKyAgICAgICAgYm9keVsxMF0gPSBmcy0+cG9pbnRfc3ByaXRlX2VuYWJsZXM7CisgICAgZWxzZQorICAgICAgICBib2R5WzEwXSA9IDA7CisKKyAgICBib2R5WzExXSA9IDA7IC8qIGNvbnN0YW50IGludGVycG9sYXRpb24gZW5hYmxlcyAqLworICAgIGJvZHlbMTJdID0gMDsgLyogV3JhcFNob3J0ZXN0IGVuYWJsZXMgKi8KKyAgICBib2R5WzEzXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHBpcGVsaW5lX2J1aWxkX2dzKHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfY3JlYXRlX2luZm8gKmluZm8pCit7CisgICAgLy8gZ2VuN19lbWl0XzNEU1RBVEVfR1MgZG9uZSBieSBjbWRfcGlwZWxpbmUKK30KKworc3RhdGljIHZvaWQgcGlwZWxpbmVfYnVpbGRfaHMoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyAqaW5mbykKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA3OworICAgIGNvbnN0IHVpbnQzMl90IGR3MCA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9IUykgfCAoY21kX2xlbiAtIDIpOworICAgIHVpbnQzMl90ICpkdzsKKworICAgIElOVEVMX0dQVV9BU1NFUlQocGlwZWxpbmUtPmRldi0+Z3B1LCA3LCA3LjUpOworCisgICAgZHcgPSBwaXBlbGluZV9jbWRfcHRyKHBpcGVsaW5lLCBjbWRfbGVuKTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IDA7CisgICAgZHdbMl0gPSAwOworICAgIGR3WzNdID0gMDsKKyAgICBkd1s0XSA9IDA7CisgICAgZHdbNV0gPSAwOworICAgIGR3WzZdID0gMDsKK30KKworc3RhdGljIHZvaWQgcGlwZWxpbmVfYnVpbGRfdGUoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyAqaW5mbykKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGR3MCA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9URSkgfCAoY21kX2xlbiAtIDIpOworICAgIHVpbnQzMl90ICpkdzsKKworICAgIElOVEVMX0dQVV9BU1NFUlQocGlwZWxpbmUtPmRldi0+Z3B1LCA3LCA3LjUpOworCisgICAgZHcgPSBwaXBlbGluZV9jbWRfcHRyKHBpcGVsaW5lLCBjbWRfbGVuKTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IDA7CisgICAgZHdbMl0gPSAwOworICAgIGR3WzNdID0gMDsKK30KKworc3RhdGljIHZvaWQgcGlwZWxpbmVfYnVpbGRfZHMoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyAqaW5mbykKK3sKKyAgICBjb25zdCB1aW50OF90IGNtZF9sZW4gPSA2OworICAgIGNvbnN0IHVpbnQzMl90IGR3MCA9IEdFTjdfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9EUykgfCAoY21kX2xlbiAtIDIpOworICAgIHVpbnQzMl90ICpkdzsKKworICAgIElOVEVMX0dQVV9BU1NFUlQocGlwZWxpbmUtPmRldi0+Z3B1LCA3LCA3LjUpOworCisgICAgZHcgPSBwaXBlbGluZV9jbWRfcHRyKHBpcGVsaW5lLCBjbWRfbGVuKTsKKyAgICBkd1swXSA9IGR3MDsKKyAgICBkd1sxXSA9IDA7CisgICAgZHdbMl0gPSAwOworICAgIGR3WzNdID0gMDsKKyAgICBkd1s0XSA9IDA7CisgICAgZHdbNV0gPSAwOworfQorCitzdGF0aWMgdm9pZCBwaXBlbGluZV9idWlsZF9kZXB0aF9zdGVuY2lsKHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyAqaW5mbykKK3sKKyAgICBwaXBlbGluZS0+Y21kX2RlcHRoX3N0ZW5jaWwgPSAwOworCisgICAgaWYgKGluZm8tPmRiLnN0ZW5jaWxUZXN0RW5hYmxlKSB7CisgICAgICAgIHBpcGVsaW5lLT5jbWRfZGVwdGhfc3RlbmNpbCA9IDEgPDwgMzEgfAorICAgICAgICAgICAgICAgdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyhpbmZvLT5kYi5mcm9udC5jb21wYXJlT3ApIDw8IDI4IHwKKyAgICAgICAgICAgICAgIHRyYW5zbGF0ZV9zdGVuY2lsX29wKGluZm8tPmRiLmZyb250LmZhaWxPcCkgPDwgMjUgfAorICAgICAgICAgICAgICAgdHJhbnNsYXRlX3N0ZW5jaWxfb3AoaW5mby0+ZGIuZnJvbnQuZGVwdGhGYWlsT3ApIDw8IDIyIHwKKyAgICAgICAgICAgICAgIHRyYW5zbGF0ZV9zdGVuY2lsX29wKGluZm8tPmRiLmZyb250LnBhc3NPcCkgPDwgMTkgfAorICAgICAgICAgICAgICAgMSA8PCAxNSB8CisgICAgICAgICAgICAgICB0cmFuc2xhdGVfY29tcGFyZV9mdW5jKGluZm8tPmRiLmJhY2suY29tcGFyZU9wKSA8PCAxMiB8CisgICAgICAgICAgICAgICB0cmFuc2xhdGVfc3RlbmNpbF9vcChpbmZvLT5kYi5iYWNrLmZhaWxPcCkgPDwgOSB8CisgICAgICAgICAgICAgICB0cmFuc2xhdGVfc3RlbmNpbF9vcChpbmZvLT5kYi5iYWNrLmRlcHRoRmFpbE9wKSA8PCA2IHwKKyAgICAgICAgICAgICAgIHRyYW5zbGF0ZV9zdGVuY2lsX29wKGluZm8tPmRiLmJhY2sucGFzc09wKSA8PCAzOworICAgICB9CisKKyAgICBwaXBlbGluZS0+c3RlbmNpbFRlc3RFbmFibGUgPSBpbmZvLT5kYi5zdGVuY2lsVGVzdEVuYWJsZTsKKworICAgIC8qCisgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDM2MDoKKyAgICAgKgorICAgICAqICAgICAiRW5hYmxpbmcgdGhlIERlcHRoIFRlc3QgZnVuY3Rpb24gd2l0aG91dCBkZWZpbmluZyBhIERlcHRoIEJ1ZmZlciBpcworICAgICAqICAgICAgVU5ERUZJTkVELiIKKyAgICAgKgorICAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSAzNzU6CisgICAgICoKKyAgICAgKiAgICAgIkEgRGVwdGggQnVmZmVyIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgZW5hYmxpbmcgd3JpdGVzIHRvIGl0LCBvcgorICAgICAqICAgICAgb3BlcmF0aW9uIGlzIFVOREVGSU5FRC4iCisgICAgICoKKyAgICAgKiBUT0RPIFdlIGRvIG5vdCBjaGVjayB0aGVzZSB5ZXQuCisgICAgICovCisgICAgaWYgKGluZm8tPmRiLmRlcHRoVGVzdEVuYWJsZSkgeworICAgICAgIHBpcGVsaW5lLT5jbWRfZGVwdGhfdGVzdCA9IEdFTjZfWlNfRFcyX0RFUFRIX1RFU1RfRU5BQkxFIHwKKyAgICAgICAgICAgICAgIHRyYW5zbGF0ZV9jb21wYXJlX2Z1bmMoaW5mby0+ZGIuZGVwdGhDb21wYXJlT3ApIDw8IDI3OworICAgIH0gZWxzZSB7CisgICAgICAgcGlwZWxpbmUtPmNtZF9kZXB0aF90ZXN0ID0gR0VONl9DT01QQVJFRlVOQ1RJT05fQUxXQVlTIDw8IDI3OworICAgIH0KKworICAgIGlmIChpbmZvLT5kYi5kZXB0aFdyaXRlRW5hYmxlKQorICAgICAgIHBpcGVsaW5lLT5jbWRfZGVwdGhfdGVzdCB8PSBHRU42X1pTX0RXMl9ERVBUSF9XUklURV9FTkFCTEU7Cit9CisKK3N0YXRpYyB2b2lkIHBpcGVsaW5lX2J1aWxkX21zYWEoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2NyZWF0ZV9pbmZvICppbmZvKQoreworICAgIHVpbnQzMl90IGNtZCwgY21kX2xlbjsKKyAgICB1aW50MzJfdCAqZHc7CisKKyAgICBJTlRFTF9HUFVfQVNTRVJUKHBpcGVsaW5lLT5kZXYtPmdwdSwgNiwgNy41KTsKKworICAgIHBpcGVsaW5lLT5zYW1wbGVfY291bnQgPQorICAgICAgICB0cmFuc2xhdGVfc2FtcGxlX2NvdW50KGluZm8tPm1zLnJhc3Rlcml6YXRpb25TYW1wbGVzKTsKKworICAgIHBpcGVsaW5lLT5hbHBoYVRvQ292ZXJhZ2VFbmFibGUgPSBpbmZvLT5tcy5hbHBoYVRvQ292ZXJhZ2VFbmFibGU7CisgICAgcGlwZWxpbmUtPmFscGhhVG9PbmVFbmFibGUgPSBpbmZvLT5tcy5hbHBoYVRvT25lRW5hYmxlOworCisgICAgLyogM0RTVEFURV9TQU1QTEVfTUFTSyAqLworICAgIGNtZCA9IEdFTjZfUkVOREVSX0NNRCgzRCwgM0RTVEFURV9TQU1QTEVfTUFTSyk7CisgICAgY21kX2xlbiA9IDI7CisKKyAgICBkdyA9IHBpcGVsaW5lX2NtZF9wdHIocGlwZWxpbmUsIGNtZF9sZW4pOworICAgIGR3WzBdID0gY21kIHwgKGNtZF9sZW4gLSAyKTsKKyAgICBpZiAoaW5mby0+bXMucFNhbXBsZU1hc2spIHsKKyAgICAgICAgLyogIkJpdCBCIG9mIG1hc2sgd29yZCBNIGNvcnJlc3BvbmRzIHRvIHNhbXBsZSAzMipNICsgQi4iCisgICAgICAgICAqICJUaGUgYXJyYXkgaXMgc2l6ZWQgdG8gYSBsZW5ndGggb2YgY2VpbChyYXN0ZXJpemF0aW9uU2FtcGxlcyAvIDMyKSB3b3Jkcy4iCisgICAgICAgICAqICJJZiBwU2FtcGxlTWFzayBpcyBOVUxMLCBpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBtYXNrIGhhcyBhbGwgYml0cyBlbmFibGVkLCIKKyAgICAgICAgICogImkuZS4gbm8gY292ZXJhZ2UgaXMgcmVtb3ZlZCBmcm9tIHByaW1pdGl2ZXMuIgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHBpcGVsaW5lLT5zYW1wbGVfY291bnQgLyAzMiA9PSAwKTsKKyAgICAgICAgZHdbMV0gPSAqaW5mby0+bXMucFNhbXBsZU1hc2sgJiAoKDEgPDwgcGlwZWxpbmUtPnNhbXBsZV9jb3VudCkgLSAxKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgZHdbMV0gPSAoMSA8PCBwaXBlbGluZS0+c2FtcGxlX2NvdW50KSAtIDE7CisgICAgIH0KKworICAgIHBpcGVsaW5lLT5jbWRfc2FtcGxlX21hc2sgPSBkd1sxXTsKK30KKworc3RhdGljIHZvaWQgcGlwZWxpbmVfYnVpbGRfY2Ioc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyAqaW5mbykKK3sKKyAgICB1aW50MzJfdCBpOworCisgICAgSU5URUxfR1BVX0FTU0VSVChwaXBlbGluZS0+ZGV2LT5ncHUsIDYsIDcuNSk7CisgICAgU1RBVElDX0FTU0VSVChBUlJBWV9TSVpFKHBpcGVsaW5lLT5jbWRfY2IpID49IElOVEVMX01BWF9SRU5ERVJfVEFSR0VUUyoyKTsKKyAgICBhc3NlcnQoaW5mby0+Y2IuYXR0YWNobWVudENvdW50IDw9IElOVEVMX01BWF9SRU5ERVJfVEFSR0VUUyk7CisKKyAgICB1aW50MzJfdCAqZHcgPSBwaXBlbGluZS0+Y21kX2NiOworCisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPmNiLmF0dGFjaG1lbnRDb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kQXR0YWNobWVudFN0YXRlICphdHQgPSAmaW5mby0+Y2IucEF0dGFjaG1lbnRzW2ldOworICAgICAgICB1aW50MzJfdCBkdzAsIGR3MTsKKworCisgICAgICAgIGR3MCA9IDA7CisgICAgICAgIGR3MSA9IEdFTjZfUlRfRFcxX0NPTE9SQ0xBTVBfUlRGT1JNQVQgfAorICAgICAgICAgICAgICBHRU42X1JUX0RXMV9QUkVfQkxFTkRfQ0xBTVAgfAorICAgICAgICAgICAgICBHRU42X1JUX0RXMV9QT1NUX0JMRU5EX0NMQU1QOworCisgICAgICAgIGlmIChhdHQtPmJsZW5kRW5hYmxlKSB7CisgICAgICAgICAgICBkdzAgPSAxIDw8IDMxIHwKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlX2JsZW5kX2Z1bmMoYXR0LT5hbHBoYUJsZW5kT3ApIDw8IDI2IHwKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlX2JsZW5kKGF0dC0+c3JjQWxwaGFCbGVuZEZhY3RvcikgPDwgMjAgfAorICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVfYmxlbmQoYXR0LT5kc3RBbHBoYUJsZW5kRmFjdG9yKSA8PCAxNSB8CisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZV9ibGVuZF9mdW5jKGF0dC0+Y29sb3JCbGVuZE9wKSA8PCAxMSB8CisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZV9ibGVuZChhdHQtPnNyY0NvbG9yQmxlbmRGYWN0b3IpIDw8IDUgfAorICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVfYmxlbmQoYXR0LT5kc3RDb2xvckJsZW5kRmFjdG9yKTsKKworICAgICAgICAgICAgaWYgKGF0dC0+YWxwaGFCbGVuZE9wICE9IGF0dC0+Y29sb3JCbGVuZE9wIHx8CisgICAgICAgICAgICAgICAgYXR0LT5zcmNBbHBoYUJsZW5kRmFjdG9yICE9IGF0dC0+c3JjQ29sb3JCbGVuZEZhY3RvciB8fAorICAgICAgICAgICAgICAgIGF0dC0+ZHN0QWxwaGFCbGVuZEZhY3RvciAhPSBhdHQtPmRzdENvbG9yQmxlbmRGYWN0b3IpCisgICAgICAgICAgICAgICAgZHcwIHw9IDEgPDwgMzA7CisKKyAgICAgICAgICAgIHBpcGVsaW5lLT5kdWFsX3NvdXJjZV9ibGVuZF9lbmFibGUgPSBpY2RfcGlwZWxpbmVfY2JfYXR0X25lZWRzX2R1YWxfc291cmNlX2JsZW5kaW5nKGF0dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5mby0+Y2IubG9naWNPcEVuYWJsZSAmJiBpbmZvLT5jYi5sb2dpY09wICE9IFZLX0xPR0lDX09QX0NPUFkpIHsKKyAgICAgICAgICAgIGludCBsb2dpY29wOworCisgICAgICAgICAgICBzd2l0Y2ggKGluZm8tPmNiLmxvZ2ljT3ApIHsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfQ0xFQVI6ICAgICAgICAgICAgbG9naWNvcCA9IEdFTjZfTE9HSUNPUF9DTEVBUjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX0xPR0lDX09QX0FORDogICAgICAgICAgICAgIGxvZ2ljb3AgPSBHRU42X0xPR0lDT1BfQU5EOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfQU5EX1JFVkVSU0U6ICAgICAgbG9naWNvcCA9IEdFTjZfTE9HSUNPUF9BTkRfUkVWRVJTRTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX0xPR0lDX09QX0FORF9JTlZFUlRFRDogICAgIGxvZ2ljb3AgPSBHRU42X0xPR0lDT1BfQU5EX0lOVkVSVEVEOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfTk9fT1A6ICAgICAgICAgICAgIGxvZ2ljb3AgPSBHRU42X0xPR0lDT1BfTk9PUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX0xPR0lDX09QX1hPUjogICAgICAgICAgICAgIGxvZ2ljb3AgPSBHRU42X0xPR0lDT1BfWE9SOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfT1I6ICAgICAgICAgICAgICAgbG9naWNvcCA9IEdFTjZfTE9HSUNPUF9PUjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX0xPR0lDX09QX05PUjogICAgICAgICAgICAgIGxvZ2ljb3AgPSBHRU42X0xPR0lDT1BfTk9SOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfRVFVSVZBTEVOVDogICAgICAgICAgICBsb2dpY29wID0gR0VONl9MT0dJQ09QX0VRVUlWOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfSU5WRVJUOiAgICAgICAgICAgbG9naWNvcCA9IEdFTjZfTE9HSUNPUF9JTlZFUlQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9PUl9SRVZFUlNFOiAgICAgICBsb2dpY29wID0gR0VONl9MT0dJQ09QX09SX1JFVkVSU0U7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9DT1BZX0lOVkVSVEVEOiAgICBsb2dpY29wID0gR0VONl9MT0dJQ09QX0NPUFlfSU5WRVJURUQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19MT0dJQ19PUF9PUl9JTlZFUlRFRDogICAgICBsb2dpY29wID0gR0VONl9MT0dJQ09QX09SX0lOVkVSVEVEOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfTkFORDogICAgICAgICAgICAgbG9naWNvcCA9IEdFTjZfTE9HSUNPUF9OQU5EOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfTE9HSUNfT1BfU0VUOiAgICAgICAgICAgICAgbG9naWNvcCA9IEdFTjZfTE9HSUNPUF9TRVQ7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoISJ1bmtub3duIGxvZ2ljIG9wIik7CisgICAgICAgICAgICAgICAgbG9naWNvcCA9IEdFTjZfTE9HSUNPUF9DTEVBUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHcxIHw9IEdFTjZfUlRfRFcxX0xPR0lDT1BfRU5BQkxFIHwKKyAgICAgICAgICAgICAgICAgICBsb2dpY29wIDw8IEdFTjZfUlRfRFcxX0xPR0lDT1BfRlVOQ19fU0hJRlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShhdHQtPmNvbG9yV3JpdGVNYXNrICYgMHgxKSkKKyAgICAgICAgICAgIGR3MSB8PSBHRU42X1JUX0RXMV9XUklURV9ESVNBQkxFX1I7CisgICAgICAgIGlmICghKGF0dC0+Y29sb3JXcml0ZU1hc2sgJiAweDIpKQorICAgICAgICAgICAgZHcxIHw9IEdFTjZfUlRfRFcxX1dSSVRFX0RJU0FCTEVfRzsKKyAgICAgICAgaWYgKCEoYXR0LT5jb2xvcldyaXRlTWFzayAmIDB4NCkpCisgICAgICAgICAgICBkdzEgfD0gR0VONl9SVF9EVzFfV1JJVEVfRElTQUJMRV9COworICAgICAgICBpZiAoIShhdHQtPmNvbG9yV3JpdGVNYXNrICYgMHg4KSkKKyAgICAgICAgICAgIGR3MSB8PSBHRU42X1JUX0RXMV9XUklURV9ESVNBQkxFX0E7CisKKyAgICAgICAgZHdbMiAqIGldID0gZHcwOworICAgICAgICBkd1syICogaSArIDFdID0gZHcxOworICAgIH0KKworICAgIGZvciAoaT1pbmZvLT5jYi5hdHRhY2htZW50Q291bnQ7IGkgPCBJTlRFTF9NQVhfUkVOREVSX1RBUkdFVFM7IGkrKykKKyAgICB7CisgICAgICAgIGR3WzIgKiBpXSA9IDA7CisgICAgICAgIGR3WzIgKiBpICsgMV0gPSBHRU42X1JUX0RXMV9DT0xPUkNMQU1QX1JURk9STUFUIHwKKyAgICAgICAgICAgICAgICBHRU42X1JUX0RXMV9QUkVfQkxFTkRfQ0xBTVAgfAorICAgICAgICAgICAgICAgIEdFTjZfUlRfRFcxX1BPU1RfQkxFTkRfQ0xBTVAgfAorICAgICAgICAgICAgICAgIEdFTjZfUlRfRFcxX1dSSVRFX0RJU0FCTEVfUiB8CisgICAgICAgICAgICAgICAgR0VONl9SVF9EVzFfV1JJVEVfRElTQUJMRV9HIHwKKyAgICAgICAgICAgICAgICBHRU42X1JUX0RXMV9XUklURV9ESVNBQkxFX0IgfAorICAgICAgICAgICAgICAgIEdFTjZfUlRfRFcxX1dSSVRFX0RJU0FCTEVfQTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQgcGlwZWxpbmVfYnVpbGRfc3RhdGUoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAoaW5mby0+dXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19WSUVXUE9SVCkgeworICAgICAgICBwaXBlbGluZS0+c3RhdGUudmlld3BvcnQudmlld3BvcnRfY291bnQgPSBpbmZvLT52cC52aWV3cG9ydENvdW50OworICAgICAgICBtZW1jcHkocGlwZWxpbmUtPnN0YXRlLnZpZXdwb3J0LnZpZXdwb3J0cywgaW5mby0+dnAucFZpZXdwb3J0cywgaW5mby0+dnAudmlld3BvcnRDb3VudCAqIHNpemVvZihWa1ZpZXdwb3J0KSk7CisgICAgfQorICAgIGlmIChpbmZvLT51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NDSVNTT1IpIHsKKyAgICAgICAgcGlwZWxpbmUtPnN0YXRlLnZpZXdwb3J0LnNjaXNzb3JfY291bnQgPSBpbmZvLT52cC5zY2lzc29yQ291bnQ7CisgICAgICAgIG1lbWNweShwaXBlbGluZS0+c3RhdGUudmlld3BvcnQuc2Npc3NvcnMsIGluZm8tPnZwLnBTY2lzc29ycywgaW5mby0+dnAuc2Npc3NvckNvdW50ICogc2l6ZW9mKFZrUmVjdDJEKSk7CisgICAgfQorICAgIGlmIChpbmZvLT51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX0xJTkVfV0lEVEgpIHsKKyAgICAgICAgcGlwZWxpbmUtPnN0YXRlLmxpbmVfd2lkdGgubGluZV93aWR0aCA9IGluZm8tPnJzLmxpbmVXaWR0aDsKKyAgICB9CisgICAgaWYgKGluZm8tPnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfREVQVEhfQklBUykgeworICAgICAgICBwaXBlbGluZS0+c3RhdGUuZGVwdGhfYmlhcy5kZXB0aF9iaWFzID0gaW5mby0+cnMuZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3I7CisgICAgICAgIHBpcGVsaW5lLT5zdGF0ZS5kZXB0aF9iaWFzLmRlcHRoX2JpYXNfY2xhbXAgPSBpbmZvLT5ycy5kZXB0aEJpYXNDbGFtcDsKKyAgICAgICAgcGlwZWxpbmUtPnN0YXRlLmRlcHRoX2JpYXMuc2xvcGVfc2NhbGVkX2RlcHRoX2JpYXMgPSBpbmZvLT5ycy5kZXB0aEJpYXNTbG9wZUZhY3RvcjsKKyAgICB9CisgICAgaWYgKGluZm8tPnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfQkxFTkRfQ09OU1RBTlRTKSB7CisgICAgICAgIHBpcGVsaW5lLT5zdGF0ZS5ibGVuZC5ibGVuZF9jb25zdFswXSA9IGluZm8tPmNiLmJsZW5kQ29uc3RhbnRzWzBdOworICAgICAgICBwaXBlbGluZS0+c3RhdGUuYmxlbmQuYmxlbmRfY29uc3RbMV0gPSBpbmZvLT5jYi5ibGVuZENvbnN0YW50c1sxXTsKKyAgICAgICAgcGlwZWxpbmUtPnN0YXRlLmJsZW5kLmJsZW5kX2NvbnN0WzJdID0gaW5mby0+Y2IuYmxlbmRDb25zdGFudHNbMl07CisgICAgICAgIHBpcGVsaW5lLT5zdGF0ZS5ibGVuZC5ibGVuZF9jb25zdFszXSA9IGluZm8tPmNiLmJsZW5kQ29uc3RhbnRzWzNdOworICAgIH0KKyAgICBpZiAoaW5mby0+dXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19ERVBUSF9CT1VORFMpIHsKKyAgICAgICAgcGlwZWxpbmUtPnN0YXRlLmRlcHRoX2JvdW5kcy5taW5fZGVwdGhfYm91bmRzID0gaW5mby0+ZGIubWluRGVwdGhCb3VuZHM7CisgICAgICAgIHBpcGVsaW5lLT5zdGF0ZS5kZXB0aF9ib3VuZHMubWF4X2RlcHRoX2JvdW5kcyA9IGluZm8tPmRiLm1heERlcHRoQm91bmRzOworICAgIH0KKyAgICBpZiAoaW5mby0+dXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX0NPTVBBUkVfTUFTSykgeworICAgICAgICBwaXBlbGluZS0+c3RhdGUuc3RlbmNpbC5mcm9udC5zdGVuY2lsX2NvbXBhcmVfbWFzayA9IGluZm8tPmRiLmZyb250LmNvbXBhcmVNYXNrOworICAgICAgICBwaXBlbGluZS0+c3RhdGUuc3RlbmNpbC5iYWNrLnN0ZW5jaWxfY29tcGFyZV9tYXNrID0gaW5mby0+ZGIuYmFjay5jb21wYXJlTWFzazsKKyAgICB9CisgICAgaWYgKGluZm8tPnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfU1RFTkNJTF9XUklURV9NQVNLKSB7CisKKyAgICAgICAgcGlwZWxpbmUtPnN0YXRlLnN0ZW5jaWwuZnJvbnQuc3RlbmNpbF93cml0ZV9tYXNrID0gaW5mby0+ZGIuZnJvbnQud3JpdGVNYXNrOworICAgICAgICBwaXBlbGluZS0+c3RhdGUuc3RlbmNpbC5iYWNrLnN0ZW5jaWxfd3JpdGVfbWFzayA9IGluZm8tPmRiLmJhY2sud3JpdGVNYXNrOworICAgIH0KKyAgICBpZiAoaW5mby0+dXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX1JFRkVSRU5DRSkgeworICAgICAgICBwaXBlbGluZS0+c3RhdGUuc3RlbmNpbC5mcm9udC5zdGVuY2lsX3JlZmVyZW5jZSA9IGluZm8tPmRiLmZyb250LnJlZmVyZW5jZTsKKyAgICAgICAgcGlwZWxpbmUtPnN0YXRlLnN0ZW5jaWwuYmFjay5zdGVuY2lsX3JlZmVyZW5jZSA9IGluZm8tPmRiLmJhY2sucmVmZXJlbmNlOworICAgIH0KKworICAgIHBpcGVsaW5lLT5zdGF0ZS51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSA9IGluZm8tPnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlOworfQorCisKK3N0YXRpYyBWa1Jlc3VsdCBwaXBlbGluZV9idWlsZF9hbGwoc3RydWN0IGludGVsX3BpcGVsaW5lICpwaXBlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX3BpcGVsaW5lX2NyZWF0ZV9pbmZvICppbmZvKQoreworICAgIFZrUmVzdWx0IHJldDsKKworICAgIHBpcGVsaW5lX2J1aWxkX3N0YXRlKHBpcGVsaW5lLCBpbmZvKTsKKworICAgIHJldCA9IHBpcGVsaW5lX2J1aWxkX3NoYWRlcnMocGlwZWxpbmUsIGluZm8pOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIFRPRE9WVjogTW92ZSB0ZXN0IHRvIHZhbGlkYXRpb24gbGF5ZXIKKyAgICAgKiAgVGhpcyBwYXJ0aWN1bGFyIHRlc3QgaXMgYmFzZWQgb24gYSBsaW1pdCBpbXBvc2VkIGJ5CisgICAgICogIElOVEVMX01BWF9WRVJURVhfQklORElOR19DT1VOVCwgd2hpY2ggc2hvdWxkIGJlIG1pZ3JhdGVkCisgICAgICogIHRvIEFQSS1kZWZpbmVkIG1heFZlcnRleElucHV0QmluZGluZ3Mgc2V0dGluZyBhbmQgdGhlbgorICAgICAqICB0aGlzIGNoZWNrIGNhbiBiZSBpbiBEZXZpY2VMaW1pdHMgbGF5ZXIKKyAgICAgKi8KKyAgICBpZiAoaW5mby0+dmkudmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPiBBUlJBWV9TSVpFKHBpcGVsaW5lLT52YikgfHwKKyAgICAgICAgaW5mby0+dmkudmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCA+IEFSUkFZX1NJWkUocGlwZWxpbmUtPnZiKSkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIHBpcGVsaW5lLT52Yl9jb3VudCA9IGluZm8tPnZpLnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50OworICAgIG1lbWNweShwaXBlbGluZS0+dmIsIGluZm8tPnZpLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zLAorICAgICAgICAgICAgc2l6ZW9mKHBpcGVsaW5lLT52YlswXSkgKiBwaXBlbGluZS0+dmJfY291bnQpOworCisgICAgcGlwZWxpbmVfYnVpbGRfdmVydGV4X2VsZW1lbnRzKHBpcGVsaW5lLCBpbmZvKTsKKyAgICBwaXBlbGluZV9idWlsZF9mcmFnbWVudF9TQkUocGlwZWxpbmUsIGluZm8pOworICAgIHBpcGVsaW5lX2J1aWxkX21zYWEocGlwZWxpbmUsIGluZm8pOworICAgIHBpcGVsaW5lX2J1aWxkX2RlcHRoX3N0ZW5jaWwocGlwZWxpbmUsIGluZm8pOworCisgICAgaWYgKGludGVsX2dwdV9nZW4ocGlwZWxpbmUtPmRldi0+Z3B1KSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgcGlwZWxpbmVfYnVpbGRfdXJiX2FsbG9jX2dlbjcocGlwZWxpbmUsIGluZm8pOworICAgICAgICBwaXBlbGluZV9idWlsZF9ncyhwaXBlbGluZSwgaW5mbyk7CisgICAgICAgIHBpcGVsaW5lX2J1aWxkX2hzKHBpcGVsaW5lLCBpbmZvKTsKKyAgICAgICAgcGlwZWxpbmVfYnVpbGRfdGUocGlwZWxpbmUsIGluZm8pOworICAgICAgICBwaXBlbGluZV9idWlsZF9kcyhwaXBlbGluZSwgaW5mbyk7CisKKyAgICAgICAgcGlwZWxpbmUtPndhX2ZsYWdzID0gSU5URUxfQ01EX1dBX0dFTjZfUFJFX0RFUFRIX1NUQUxMX1dSSVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URUxfQ01EX1dBX0dFTjZfUFJFX0NPTU1BTkRfU0NPUkVCT0FSRF9TVEFMTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVMX0NNRF9XQV9HRU43X1BSRV9WU19ERVBUSF9TVEFMTF9XUklURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVMX0NNRF9XQV9HRU43X1BPU1RfQ09NTUFORF9DU19TVEFMTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVMX0NNRF9XQV9HRU43X1BPU1RfQ09NTUFORF9ERVBUSF9TVEFMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBwaXBlbGluZV9idWlsZF91cmJfYWxsb2NfZ2VuNihwaXBlbGluZSwgaW5mbyk7CisKKyAgICAgICAgcGlwZWxpbmUtPndhX2ZsYWdzID0gSU5URUxfQ01EX1dBX0dFTjZfUFJFX0RFUFRIX1NUQUxMX1dSSVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URUxfQ01EX1dBX0dFTjZfUFJFX0NPTU1BTkRfU0NPUkVCT0FSRF9TVEFMTDsKKyAgICB9CisKKyAgICByZXQgPSBwaXBlbGluZV9idWlsZF9pYShwaXBlbGluZSwgaW5mbyk7CisKKyAgICBpZiAocmV0ID09IFZLX1NVQ0NFU1MpCisgICAgICAgIHJldCA9IHBpcGVsaW5lX2J1aWxkX3JzX3N0YXRlKHBpcGVsaW5lLCBpbmZvKTsKKworICAgIGlmIChyZXQgPT0gVktfU1VDQ0VTUykgeworICAgICAgICBwaXBlbGluZV9idWlsZF9jYihwaXBlbGluZSwgaW5mbyk7CisgICAgICAgIHBpcGVsaW5lLT5jYl9zdGF0ZSA9IGluZm8tPmNiOworICAgICAgICBwaXBlbGluZS0+dGVzc19zdGF0ZSA9IGluZm8tPnRlc3M7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFZrUmVzdWx0IHBpcGVsaW5lX2NyZWF0ZV9pbmZvX2luaXQoc3RydWN0IGludGVsX3BpcGVsaW5lX2NyZWF0ZV9pbmZvICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKnZraW5mbykKK3sKKyAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKyAgICAvKgorICAgICAqIERvIHdlIG5lZWQgdG8gc2V0IHNhZmUgZGVmYXVsdHMgaW4gY2FzZSB0aGUgYXBwIGRvZXNuJ3QgcHJvdmlkZSBhbGwgb2YKKyAgICAgKiB0aGUgbmVjZXNzYXJ5IGNyZWF0ZSBpbmZvcz8KKyAgICAgKi8KKyAgICBpbmZvLT5tcy5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbmZvLT5tcy5wU2FtcGxlTWFzayA9IE5VTEw7CisKKyAgICBtZW1jcHkoJmluZm8tPmdyYXBoaWNzLCB2a2luZm8sIHNpemVvZiAoaW5mby0+Z3JhcGhpY3MpKTsKKworICAgIHZvaWQgKmRzdDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdmtpbmZvLT5zdGFnZUNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyAqdGhpc1N0YWdlID0gJnZraW5mby0+cFN0YWdlc1tpXTsKKyAgICAgICAgc3dpdGNoICh0aGlzU3RhZ2UtPnN0YWdlKSB7CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUOgorICAgICAgICAgICAgICAgIGRzdCA9ICZpbmZvLT52czsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9DT05UUk9MX0JJVDoKKyAgICAgICAgICAgICAgICBkc3QgPSAmaW5mby0+dGNzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fQklUOgorICAgICAgICAgICAgICAgIGRzdCA9ICZpbmZvLT50ZXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9HRU9NRVRSWV9CSVQ6CisgICAgICAgICAgICAgICAgZHN0ID0gJmluZm8tPmdzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklUOgorICAgICAgICAgICAgICAgIGRzdCA9ICZpbmZvLT5mczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUOgorICAgICAgICAgICAgICAgIGRzdCA9ICZpbmZvLT5jb21wdXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoISJ1bnN1cHBvcnRlZCBzaGFkZXIgc3RhZ2UiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZHN0LCB0aGlzU3RhZ2UsIHNpemVvZihWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKSk7CisgICAgfQorCisgICAgaWYgKHZraW5mby0+cFZlcnRleElucHV0U3RhdGUgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkoJmluZm8tPnZpLCB2a2luZm8tPnBWZXJ0ZXhJbnB1dFN0YXRlLCBzaXplb2YgKGluZm8tPnZpKSk7CisgICAgfQorICAgIGlmICh2a2luZm8tPnBJbnB1dEFzc2VtYmx5U3RhdGUgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkoJmluZm8tPmlhLCB2a2luZm8tPnBJbnB1dEFzc2VtYmx5U3RhdGUsIHNpemVvZiAoaW5mby0+aWEpKTsKKyAgICB9CisgICAgaWYgKHZraW5mby0+cERlcHRoU3RlbmNpbFN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KCZpbmZvLT5kYiwgdmtpbmZvLT5wRGVwdGhTdGVuY2lsU3RhdGUsIHNpemVvZiAoaW5mby0+ZGIpKTsKKyAgICB9CisgICAgaWYgKHZraW5mby0+cENvbG9yQmxlbmRTdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweSgmaW5mby0+Y2IsIHZraW5mby0+cENvbG9yQmxlbmRTdGF0ZSwgc2l6ZW9mIChpbmZvLT5jYikpOworICAgIH0KKyAgICBpZiAodmtpbmZvLT5wUmFzdGVyaXphdGlvblN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KCZpbmZvLT5ycywgdmtpbmZvLT5wUmFzdGVyaXphdGlvblN0YXRlLCBzaXplb2YgKGluZm8tPnJzKSk7CisgICAgfQorICAgIGlmICh2a2luZm8tPnBUZXNzZWxsYXRpb25TdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweSgmaW5mby0+dGVzcywgdmtpbmZvLT5wVGVzc2VsbGF0aW9uU3RhdGUsIHNpemVvZiAoaW5mby0+dGVzcykpOworICAgIH0KKyAgICBpZiAodmtpbmZvLT5wTXVsdGlzYW1wbGVTdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweSgmaW5mby0+bXMsIHZraW5mby0+cE11bHRpc2FtcGxlU3RhdGUsIHNpemVvZiAoaW5mby0+bXMpKTsKKyAgICB9CisgICAgaWYgKHZraW5mby0+cFZpZXdwb3J0U3RhdGUgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkoJmluZm8tPnZwLCB2a2luZm8tPnBWaWV3cG9ydFN0YXRlLCBzaXplb2YgKGluZm8tPnZwKSk7CisgICAgfQorCisgICAgLyogYnkgZGVmYXVsdCwgdGFrZSBhbGwgZHluYW1pYyBzdGF0ZSBmcm9tIHRoZSBwaXBlbGluZSAqLworICAgIGluZm8tPnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlID0gSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfVklFV1BPUlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfU0NJU1NPUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19CTEVORF9DT05TVEFOVFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfREVQVEhfQklBUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19ERVBUSF9CT1VORFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfTElORV9XSURUSCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX0NPTVBBUkVfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX1JFRkVSRU5DRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX1dSSVRFX01BU0s7CisgICAgaWYgKHZraW5mby0+cER5bmFtaWNTdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2a2luZm8tPnBEeW5hbWljU3RhdGUtPmR5bmFtaWNTdGF0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIC8qIE1hcmsgZHluYW1pYyBzdGF0ZSBpbmRpY2F0ZWQgYnkgYXBwIGFzIG5vdCB1c2luZyBwaXBlbGluZSBzdGF0ZSAqLworICAgICAgICAgICAgc3dpdGNoICh2a2luZm8tPnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzW2ldKSB7CisgICAgICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfVklFV1BPUlQ6CisgICAgICAgICAgICAgICAgaW5mby0+dXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJj0gfklOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1ZJRVdQT1JUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX1NDSVNTT1I6CisgICAgICAgICAgICAgICAgaW5mby0+dXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJj0gfklOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NDSVNTT1I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX0RZTkFNSUNfU1RBVEVfTElORV9XSURUSDoKKyAgICAgICAgICAgICAgICBpbmZvLT51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmPSB+SU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfTElORV9XSURUSDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9ERVBUSF9CSUFTOgorICAgICAgICAgICAgICAgIGluZm8tPnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICY9IH5JTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19ERVBUSF9CSUFTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX0JMRU5EX0NPTlNUQU5UUzoKKyAgICAgICAgICAgICAgICBpbmZvLT51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmPSB+SU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfQkxFTkRfQ09OU1RBTlRTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX0RFUFRIX0JPVU5EUzoKKyAgICAgICAgICAgICAgICBpbmZvLT51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmPSB+SU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfREVQVEhfQk9VTkRTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19EWU5BTUlDX1NUQVRFX1NURU5DSUxfQ09NUEFSRV9NQVNLOgorICAgICAgICAgICAgICAgIGluZm8tPnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICY9IH5JTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX0NPTVBBUkVfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1dSSVRFX01BU0s6CisgICAgICAgICAgICAgICAgaW5mby0+dXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJj0gfklOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NURU5DSUxfV1JJVEVfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVktfRFlOQU1JQ19TVEFURV9TVEVOQ0lMX1JFRkVSRU5DRToKKyAgICAgICAgICAgICAgICBpbmZvLT51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmPSB+SU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfU1RFTkNJTF9SRUZFUkVOQ0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydCghIkludmFsaWQgZHluYW1pYyBzdGF0ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBncmFwaGljc19waXBlbGluZV9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvICppbmZvXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3BpcGVsaW5lICoqcGlwZWxpbmVfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZV9jcmVhdGVfaW5mbyBpbmZvOworICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZSAqcGlwZWxpbmU7CisgICAgVmtSZXN1bHQgcmV0OworCisgICAgcmV0ID0gcGlwZWxpbmVfY3JlYXRlX2luZm9faW5pdCgmaW5mbywgaW5mb18pOworCisgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGlwZWxpbmUgPSAoc3RydWN0IGludGVsX3BpcGVsaW5lICopIGludGVsX2Jhc2VfY3JlYXRlKCZkZXYtPmJhc2UuaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICgqcGlwZWxpbmUpLCBkZXYtPmJhc2UuZGJnLAorICAgICAgICAgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCwgaW5mb18sIDApOworICAgIGlmICghcGlwZWxpbmUpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBwaXBlbGluZS0+ZGV2ID0gZGV2OworICAgIHBpcGVsaW5lLT5waXBlbGluZV9sYXlvdXQgPSBpbnRlbF9waXBlbGluZV9sYXlvdXQoaW5mby5ncmFwaGljcy5sYXlvdXQpOworCisgICAgcGlwZWxpbmUtPm9iai5kZXN0cm95ID0gcGlwZWxpbmVfZGVzdHJveTsKKworICAgIHJldCA9IHBpcGVsaW5lX2J1aWxkX2FsbChwaXBlbGluZSwgJmluZm8pOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBwaXBlbGluZV9kZXN0cm95KCZwaXBlbGluZS0+b2JqKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1fcmVxczsKKyAgICBtZW1fcmVxcy5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9yZXFzLmFsbG9jYXRpb25TaXplID0gcGlwZWxpbmUtPnNjcmF0Y2hfc2l6ZTsKKyAgICBtZW1fcmVxcy5wTmV4dCA9IE5VTEw7CisgICAgbWVtX3JlcXMubWVtb3J5VHlwZUluZGV4ID0gMDsKKyAgICBpbnRlbF9tZW1fYWxsb2MoZGV2LCAmbWVtX3JlcXMsICZwaXBlbGluZS0+b2JqLm1lbSk7CisKKyAgICAqcGlwZWxpbmVfcmV0ID0gcGlwZWxpbmU7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVBpcGVsaW5lQ2FjaGUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lQ2FjaGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUNhY2hlKQoreworCisgICAgLy8gbm9uLWRpc3BhdGNoYWJsZSBvYmplY3RzIG9ubHkgbmVlZCB0byBiZSA2NCBiaXRzIGN1cnJlbnRseQorICAgICooKHVpbnQ2NF90ICopcFBpcGVsaW5lQ2FjaGUpID0gMTsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95UGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBpcGVsaW5lQ2FjaGVEYXRhKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKQoreworICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a01lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKQoreworICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYgPSBpbnRlbF9kZXYoZGV2aWNlKTsKKyAgICB1aW50MzJfdCBpOworICAgIFZrUmVzdWx0IHJlcyA9IFZLX1NVQ0NFU1M7CisgICAgYm9vbCBvbmVfc3VjY2VlZGVkID0gZmFsc2U7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3JlYXRlSW5mb0NvdW50OyBpKyspIHsKKyAgICAgICAgcmVzID0gIGdyYXBoaWNzX3BpcGVsaW5lX2NyZWF0ZShkZXYsICYocENyZWF0ZUluZm9zW2ldKSwKKyAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKiopICYocFBpcGVsaW5lc1tpXSkpOworICAgICAgICAvL3JldHVybiBOVUxMIGhhbmRsZSBmb3IgdW5zdWNjZXNzZnVsIGNyZWF0ZXMKKyAgICAgICAgaWYgKHJlcyAhPSBWS19TVUNDRVNTKQorICAgICAgICAgICAgcFBpcGVsaW5lc1tpXSA9IFZLX05VTExfSEFORExFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvbmVfc3VjY2VlZGVkID0gdHJ1ZTsKKyAgICB9CisgICAgLy9yZXR1cm4gVktfU1VDQ0VTUyBpZiBhbnkgb2YgY291bnQgY3JlYXRlcyBzdWNjZWVkZWQKKyAgICBpZiAob25lX3N1Y2NlZWRlZCkKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmVzOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICAgICBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpcGVsaW5lcykKK3sKKyAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lQaXBlbGluZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKKworIHsKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqICpvYmogPSBpbnRlbF9vYmoocGlwZWxpbmUpOworCisgICAgaW50ZWxfbWVtX2ZyZWUob2JqLT5tZW0pOworICAgIG9iai0+ZGVzdHJveShvYmopOworIH0KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9waXBlbGluZS5oIGIvaWNkL2ludGVsL3BpcGVsaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmY2ZjZAotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9waXBlbGluZS5oCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvZHkgTm9ydGhyb3AgPGNvZHlAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKgorICovCisKKyNpZm5kZWYgUElQRUxJTkVfSAorI2RlZmluZSBQSVBFTElORV9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorI2luY2x1ZGUgIm9iai5oIgorI2luY2x1ZGUgImRlc2MuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorCitlbnVtIGludGVsX3BpcGVsaW5lX3NoYWRlcl91c2UgeworICAgIElOVEVMX1NIQURFUl9VU0VfVklEICAgICAgICAgICAgICAgID0gKDEgPDwgMCksCisgICAgSU5URUxfU0hBREVSX1VTRV9JSUQgICAgICAgICAgICAgICAgPSAoMSA8PCAxKSwKKworICAgIElOVEVMX1NIQURFUl9VU0VfS0lMTCAgICAgICAgICAgICAgID0gKDEgPDwgMiksCisgICAgSU5URUxfU0hBREVSX1VTRV9ERVBUSCAgICAgICAgICAgICAgPSAoMSA8PCAzKSwKKyAgICBJTlRFTF9TSEFERVJfVVNFX1cgICAgICAgICAgICAgICAgICA9ICgxIDw8IDQpLAorfTsKKworLyogVGhpcyBvcmRlciBtdXN0IG1hdGNoIFBpeGVsIFNoYWRlciBDb21wdXRlZCBEZXB0aCBNb2RlIGluIDNEU1RBVEVfV00gKi8KK2VudW0gaW50ZWxfY29tcHV0ZWRfZGVwdGhfbW9kZSB7CisgICAgSU5URUxfQ09NUFVURURfREVQVEhfTU9ERV9OT05FLAorICAgIElOVEVMX0NPTVBVVEVEX0RFUFRIX01PREVfT04sCisgICAgSU5URUxfQ09NUFVURURfREVQVEhfTU9ERV9PTl9HRSwKKyAgICBJTlRFTF9DT01QVVRFRF9ERVBUSF9NT0RFX09OX0xFCit9OworCitlbnVtIGludGVsX3BpcGVsaW5lX3JtYXBfc2xvdF90eXBlIHsKKyAgICBJTlRFTF9QSVBFTElORV9STUFQX1VOVVNFRCwKKyAgICBJTlRFTF9QSVBFTElORV9STUFQX1JULAorICAgIElOVEVMX1BJUEVMSU5FX1JNQVBfU1VSRkFDRSwKKyAgICBJTlRFTF9QSVBFTElORV9STUFQX1NBTVBMRVIsCit9OworCitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcF9zbG90IHsKKyAgICBlbnVtIGludGVsX3BpcGVsaW5lX3JtYXBfc2xvdF90eXBlIHR5cGU7CisKKyAgICB1aW50MzJfdCBpbmRleDsgLyogaW4gdGhlIHJlbmRlciB0YXJnZXQgYXJyYXkgb3IgbGF5b3V0IGNoYWluICovCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgc3RydWN0IGludGVsX2Rlc2Nfb2Zmc2V0IG9mZnNldDsKKyAgICAgICAgICAgIGludCBkeW5hbWljX29mZnNldF9pbmRleDsKKyAgICAgICAgfSBzdXJmYWNlOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZGVzY19vZmZzZXQgc2FtcGxlcjsKKyAgICB9IHU7Cit9OworCisvKioKKyAqIFNoYWRlciByZXNvdXJjZSBtYXBwaW5nLgorICovCitzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcCB7CisgICAgLyogdGhpcyBpcyBub3QgYW4gaW50ZWxfb2JqICovCisKKyAgICB1aW50MzJfdCBydF9jb3VudDsKKyAgICB1aW50MzJfdCB0ZXh0dXJlX3Jlc291cmNlX2NvdW50OworICAgIHVpbnQzMl90IHJlc291cmNlX2NvdW50OworICAgIHVpbnQzMl90IHVhdl9jb3VudDsKKyAgICB1aW50MzJfdCBzYW1wbGVyX2NvdW50OworCisgICAgLyoKKyAgICAgKiBydF9jb3VudCBzbG90cyArCisgICAgICogcmVzb3VyY2VfY291bnQgc2xvdHMgKworICAgICAqIHVhdl9jb3VudCBzbG90cyArCisgICAgICogc2FtcGxlcl9jb3VudCBzbG90cworICAgICAqLworICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZV9ybWFwX3Nsb3QgKnNsb3RzOworICAgIHVpbnQzMl90IHNsb3RfY291bnQ7Cit9OworCisjZGVmaW5lIFNIQURFUl9WRVJURVhfRkxBRyAgICAgICAgICAgIFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklUCisjZGVmaW5lIFNIQURFUl9URVNTX0NPTlRST0xfRkxBRyAgICAgIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQKKyNkZWZpbmUgU0hBREVSX1RFU1NfRVZBTF9GTEFHICAgICAgICAgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVAorI2RlZmluZSBTSEFERVJfR0VPTUVUUllfRkxBRyAgICAgICAgICBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUCisjZGVmaW5lIFNIQURFUl9GUkFHTUVOVF9GTEFHICAgICAgICAgIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQKKyNkZWZpbmUgU0hBREVSX0NPTVBVVEVfRkxBRyAgICAgICAgICAgVktfU0hBREVSX1NUQUdFX0NPTVBVVEVfQklUCisKK3N0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgeworICAgIC8qIHRoaXMgaXMgbm90IGFuIGludGVsX29iaiAqLworCisgICAgdm9pZCAqcENvZGU7CisgICAgdWludDMyX3QgY29kZVNpemU7CisKKyAgICAvKgorICAgICAqIG11c3QgZ3JhYiBldmVyeXRoaW5nIHdlIG5lZWQgZnJvbSBzaGFkZXIgb2JqZWN0IGFzIHRoYXQKKyAgICAgKiBjYW4gZ28gYXdheSBhZnRlciB0aGUgcGlwZWxpbmUgaXMgY3JlYXRlZAorICAgICAqLworICAgIFZrRmxhZ3MgdXNlczsKKyAgICB1aW50NjRfdCBpbnB1dHNfcmVhZDsKKyAgICB1aW50NjRfdCBvdXRwdXRzX3dyaXR0ZW47CisgICAgdWludDMyX3Qgb3V0cHV0c19vZmZzZXQ7CisgICAgdWludDMyX3QgZ2VuZXJpY19pbnB1dF9zdGFydDsKKworICAgIFZrQm9vbDMyIGVuYWJsZV91c2VyX2NsaXA7CisgICAgVmtCb29sMzIgcmVhZHNfdXNlcl9jbGlwOworCisgICAgdWludDMyX3QgaW5fY291bnQ7CisgICAgdWludDMyX3Qgb3V0X2NvdW50OworCisgICAgdWludDMyX3Qgc2FtcGxlcl9jb3VudDsKKyAgICB1aW50MzJfdCBzdXJmYWNlX2NvdW50OworCisgICAgdWludDMyX3QgdWJvX3N0YXJ0OworCisgICAgLy8gZ2VvbWV0cnkgc2hhZGVyIHNwZWNpZmljCisgICAgdWludDMyX3Qgb3V0cHV0X3NpemVfaHdvcmRzOworICAgIHVpbnQzMl90IG91dHB1dF90b3BvbG9neTsKKyAgICB1aW50MzJfdCBjb250cm9sX2RhdGFfaGVhZGVyX3NpemVfaHdvcmRzOworICAgIHVpbnQzMl90IGNvbnRyb2xfZGF0YV9mb3JtYXQ7CisgICAgVmtCb29sMzIgaW5jbHVkZV9wcmltaXRpdmVfaWQ7CisgICAgaW50MzJfdCAgaW52b2NhdGlvbnM7CisgICAgVmtCb29sMzIgZHVhbF9pbnN0YW5jZWRfZGlzcGF0Y2g7CisgICAgVmtCb29sMzIgZGlzY2FyZF9hZGo7CisKKyAgICB1aW50MzJfdCB1cmJfZ3JmX3N0YXJ0OworICAgIHVpbnQzMl90IHVyYl9ncmZfc3RhcnRfMTY7CisKKyAgICAvKiBJZiBwcmVzZW50LCB3aGVyZSBkb2VzIHRoZSBTSU1EMTYga2VybmVsIHN0YXJ0PyAqLworICAgIHVpbnQzMl90IG9mZnNldF8xNjsKKworICAgIFZrRmxhZ3MgYmFyeWNlbnRyaWNfaW50ZXJwczsKKyAgICBWa0ZsYWdzIHBvaW50X3Nwcml0ZV9lbmFibGVzOworCisgICAgVmtEZXZpY2VTaXplIHBlcl90aHJlYWRfc2NyYXRjaF9zaXplOworCisgICAgZW51bSBpbnRlbF9jb21wdXRlZF9kZXB0aF9tb2RlIGNvbXB1dGVkX2RlcHRoX21vZGU7CisKKyAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfcm1hcCAqcm1hcDsKKworICAgIC8qIHRoZXNlIGFyZSBzZXQgdXAgYnkgdGhlIGRyaXZlciAqLworICAgIHVpbnQzMl90IG1heF90aHJlYWRzOworICAgIFZrRGV2aWNlU2l6ZSBzY3JhdGNoX29mZnNldDsKK307CisKKy8qCisgKiBPbiBHRU42LCB0aGVyZSBhcmUKKyAqCisgKiAgLSAzRFNUQVRFX1VSQiAoMykKKyAqICAtIDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTICgxKzIqSU5URUxfTUFYX1ZFUlRFWF9FTEVNRU5UX0NPVU5UKQorICogIC0gM0RTVEFURV9TQU1QTEVfTUFTSyAoMikKKyAqCisgKiBPbiBHRU43LCB0aGVyZSBhcmUKKyAqCisgKiAgLSAzRFNUQVRFX1VSQl94ICgyKjQpCisgKiAgLSAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUyAoMSsyKklOVEVMX01BWF9WRVJURVhfRUxFTUVOVF9DT1VOVCkKKyAqICAtIDNEU1RBVEVfU0JFICgxNCkKKyAqICAtIDNEU1RBVEVfSFMgKDcpCisgKiAgLSAzRFNUQVRFX1RFICg0KQorICogIC0gM0RTVEFURV9EUyAoNikKKyAqICAtIDNEU1RBVEVfU0FNUExFX01BU0sgKDIpCisgKi8KKyNkZWZpbmUgSU5URUxfUFNPX0NNRF9FTlRSSUVTICAgMTI4CisKKy8qKgorICogM0QgcGlwZWxpbmUuCisgKi8KK3N0cnVjdCBpbnRlbF9waXBlbGluZSB7CisgICAgc3RydWN0IGludGVsX29iaiBvYmo7CisKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXY7CisKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfbGF5b3V0ICpwaXBlbGluZV9sYXlvdXQ7CisKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIHZiW0lOVEVMX01BWF9WRVJURVhfQklORElOR19DT1VOVF07CisgICAgdWludDMyX3QgdmJfY291bnQ7CisKKyAgICAvKiBWa1BpcGVsaW5lSWFTdGF0ZUNyZWF0ZUluZm8gKi8KKyAgICBWa1ByaW1pdGl2ZVRvcG9sb2d5IHRvcG9sb2d5OworICAgIGludCBwcmltX3R5cGU7CisgICAgYm9vbCBkaXNhYmxlX3ZzX2NhY2hlOworICAgIGJvb2wgcHJpbWl0aXZlX3Jlc3RhcnQ7CisgICAgdWludDMyX3QgcHJpbWl0aXZlX3Jlc3RhcnRfaW5kZXg7CisKKyAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBJbnRlbCBIVyBzdGF0ZSwgbm90IFZLIHN0YXRlLgorICAgIC8qIERlcHRoIEJ1ZmZlciBmb3JtYXQgKi8KKyAgICBWa0Zvcm1hdCBkYl9mb3JtYXQ7CisKKyAgICBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyBjYl9zdGF0ZTsKKworICAgIC8vIFZrUGlwZWxpbmVSc1N0YXRlQ3JlYXRlSW5mbyByc19zdGF0ZTsKKyAgICBib29sIGRlcHRoQ2xpcEVuYWJsZTsKKyAgICBib29sIHJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlOworICAgIGJvb2wgZGVwdGhCaWFzRW5hYmxlOworCisgICAgYm9vbCBhbHBoYVRvQ292ZXJhZ2VFbmFibGU7CisgICAgYm9vbCBhbHBoYVRvT25lRW5hYmxlOworCisgICAgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyB0ZXNzX3N0YXRlOworCisgICAgdWludDMyX3QgYWN0aXZlX3NoYWRlcnM7CisgICAgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciB2czsKKyAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyIHRjczsKKyAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyIHRlczsKKyAgICBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmVfc2hhZGVyIGdzOworICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgZnM7CisgICAgc3RydWN0IGludGVsX3BpcGVsaW5lX3NoYWRlciBjczsKKyAgICBWa0RldmljZVNpemUgc2NyYXRjaF9zaXplOworCisgICAgdWludDMyX3Qgd2FfZmxhZ3M7CisKKyAgICB1aW50MzJfdCBjbWRzW0lOVEVMX1BTT19DTURfRU5UUklFU107CisgICAgdWludDMyX3QgY21kX2xlbjsKKworICAgIGJvb2wgZHVhbF9zb3VyY2VfYmxlbmRfZW5hYmxlOworCisgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSBwYXJ0aWFsIEhXIGNvbW1hbmRzIHRoYXQgd2lsbCBuZWVkCisgICAgICogbW9yZSBwcm9jZXNzaW5nIGJlZm9yZSBzZW5kaW5nIHRvIHRoZSBIVworICAgICAqLworICAgIC8vIFZrUGlwZWxpbmVEc1N0YXRlQ3JlYXRlSW5mbyBkc19zdGF0ZQorICAgIGJvb2wgc3RlbmNpbFRlc3RFbmFibGU7CisKKyAgICAvKiBEeW5hbWljIHN0YXRlIHNwZWNpZmllZCBhdCBQU08gY3JlYXRlIHRpbWUgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBWa0ZsYWdzIHVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZHluYW1pY192aWV3cG9ydCB2aWV3cG9ydDsKKyAgICAgICAgc3RydWN0IGludGVsX2R5bmFtaWNfbGluZV93aWR0aCBsaW5lX3dpZHRoOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZHluYW1pY19kZXB0aF9iaWFzIGRlcHRoX2JpYXM7CisgICAgICAgIHN0cnVjdCBpbnRlbF9keW5hbWljX2JsZW5kIGJsZW5kOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZHluYW1pY19kZXB0aF9ib3VuZHMgZGVwdGhfYm91bmRzOworICAgICAgICBzdHJ1Y3QgaW50ZWxfZHluYW1pY19zdGVuY2lsIHN0ZW5jaWw7CisgICAgfSBzdGF0ZTsKKworICAgIHVpbnQzMl90IGNtZF9kZXB0aF9zdGVuY2lsOworICAgIHVpbnQzMl90IGNtZF9kZXB0aF90ZXN0OworCisgICAgdWludDMyX3QgY21kX3NmX2ZpbGw7CisgICAgdWludDMyX3QgY21kX2NsaXBfY3VsbDsKKyAgICB1aW50MzJfdCBjbWRfc2ZfY3VsbDsKKyAgICB1aW50MzJfdCBjbWRfY2JbMiAqIElOVEVMX01BWF9SRU5ERVJfVEFSR0VUU107CisgICAgdWludDMyX3Qgc2FtcGxlX2NvdW50OworICAgIHVpbnQzMl90IGNtZF9zYW1wbGVfbWFzazsKKworICAgIHVpbnQzMl90IGNtZF8zZHN0YXRlX3NiZVsxNF07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9waXBlbGluZSAqaW50ZWxfcGlwZWxpbmUoVmtQaXBlbGluZSBwaXBlbGluZSkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKiopICZwaXBlbGluZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfcGlwZWxpbmUgKmludGVsX3BpcGVsaW5lX2Zyb21fYmFzZShzdHJ1Y3QgaW50ZWxfYmFzZSAqYmFzZSkKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9waXBlbGluZSAqKSBiYXNlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9waXBlbGluZSAqaW50ZWxfcGlwZWxpbmVfZnJvbV9vYmooc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHJldHVybiBpbnRlbF9waXBlbGluZV9mcm9tX2Jhc2UoJm9iai0+YmFzZSk7Cit9CisKK3N0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKmludGVsX3BpcGVsaW5lX3NoYWRlcl9jcmVhdGVfbWV0YShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9kZXZfbWV0YV9zaGFkZXIgaWQpOwordm9pZCBpbnRlbF9waXBlbGluZV9zaGFkZXJfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9waXBlbGluZV9zaGFkZXIgKnNoKTsKKwordm9pZCBpbnRlbF9waXBlbGluZV9pbml0X2RlZmF1bHRfc2FtcGxlX3BhdHRlcm5zKGNvbnN0IHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwYXRfMXgsIHVpbnQ4X3QgKnBhdF8yeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwYXRfNHgsIHVpbnQ4X3QgKnBhdF84eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwYXRfMTZ4KTsKKworI2VuZGlmIC8qIFBJUEVMSU5FX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC9xdWVyeS5jIGIvaWNkL2ludGVsL3F1ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NTA4YgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9xdWVyeS5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJxdWVyeS5oIgorI2luY2x1ZGUgImdlbmh3L2dlbmh3LmgiCisKK3N0YXRpYyB2b2lkIHF1ZXJ5X2Rlc3Ryb3koc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHN0cnVjdCBpbnRlbF9xdWVyeSAqcXVlcnkgPSBpbnRlbF9xdWVyeV9mcm9tX29iaihvYmopOworCisgICAgaW50ZWxfbWVtX2ZyZWUob2JqLT5tZW0pOworICAgIGludGVsX3F1ZXJ5X2Rlc3Ryb3kocXVlcnkpOworfQorCitzdGF0aWMgdm9pZCBxdWVyeV9pbml0X3BpcGVsaW5lX3N0YXRpc3RpY3MoCisgICAgICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaW50ZWxfcXVlcnkgKnF1ZXJ5KQoreworICAgIC8qCisgICAgICogTm90ZTogb3JkZXIgZGVmaW5lZCBieSBWdWxrYW4gc3BlYy4KKyAgICAgKi8KKyAgICBjb25zdCB1aW50MzJfdCByZWdzW11bMl0gPSB7CisgICAgICAgIHtWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfSU5QVVRfQVNTRU1CTFlfUFJJTUlUSVZFU19CSVQsIEdFTjZfUkVHX0lBX1BSSU1JVElWRVNfQ09VTlR9LAorICAgICAgICB7VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1ZFUlRFWF9TSEFERVJfSU5WT0NBVElPTlNfQklULCBHRU42X1JFR19WU19JTlZPQ0FUSU9OX0NPVU5UfSwKKyAgICAgICAge1ZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlNfQklULCBHRU42X1JFR19HU19JTlZPQ0FUSU9OX0NPVU5UfSwKKyAgICAgICAge1ZLX1FVRVJZX1BJUEVMSU5FX1NUQVRJU1RJQ19HRU9NRVRSWV9TSEFERVJfUFJJTUlUSVZFU19CSVQsIEdFTjZfUkVHX0dTX1BSSU1JVElWRVNfQ09VTlR9LAorICAgICAgICB7VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0NMSVBQSU5HX0lOVk9DQVRJT05TX0JJVCwgR0VONl9SRUdfQ0xfSU5WT0NBVElPTl9DT1VOVH0sCisgICAgICAgIHtWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfQ0xJUFBJTkdfUFJJTUlUSVZFU19CSVQsIEdFTjZfUkVHX0NMX1BSSU1JVElWRVNfQ09VTlR9LAorICAgICAgICB7VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX0ZSQUdNRU5UX1NIQURFUl9JTlZPQ0FUSU9OU19CSVQsIEdFTjZfUkVHX1BTX0lOVk9DQVRJT05fQ09VTlR9LAorICAgICAgICB7VktfUVVFUllfUElQRUxJTkVfU1RBVElTVElDX1RFU1NFTExBVElPTl9DT05UUk9MX1NIQURFUl9QQVRDSEVTX0JJVCwgKGludGVsX2dwdV9nZW4oZGV2LT5ncHUpID49IElOVEVMX0dFTig3KSkgPyBHRU43X1JFR19IU19JTlZPQ0FUSU9OX0NPVU5UIDogMH0sCisgICAgICAgIHtWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfVEVTU0VMTEFUSU9OX0VWQUxVQVRJT05fU0hBREVSX0lOVk9DQVRJT05TX0JJVCwgKGludGVsX2dwdV9nZW4oZGV2LT5ncHUpID49IElOVEVMX0dFTig3KSkgPyBHRU43X1JFR19EU19JTlZPQ0FUSU9OX0NPVU5UIDogMH0sCisgICAgICAgIHtWS19RVUVSWV9QSVBFTElORV9TVEFUSVNUSUNfQ09NUFVURV9TSEFERVJfSU5WT0NBVElPTlNfQklULCAwfQorICAgIH07CisgICAgU1RBVElDX0FTU0VSVChBUlJBWV9TSVpFKHJlZ3MpIDwgMzIpOworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgcmVnX2NvdW50ID0gMDsKKworICAgIC8qCisgICAgICogT25seSBxdWVyeSByZWdpc3RlcnMgaW5kaWNhdGVkIHZpYSBwaXBlbGluZSBzdGF0aXN0aWNzIGZsYWdzLgorICAgICAqIElmIEhXIGRvZXMgbm90IHN1cHBvcnQgYSBmbGFnLCBmaWxsIHZhbHVlIHdpdGggMC4KKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaSA8IEFSUkFZX1NJWkUocmVncyk7IGkrKykgeworICAgICAgICBpZiAoKHJlZ3NbaV1bMF0gJiBpbmZvLT5waXBlbGluZVN0YXRpc3RpY3MpKSB7CisgICAgICAgICAgICBxdWVyeS0+cmVnc1tyZWdfY291bnRdID0gcmVnc1tpXVsxXTsKKyAgICAgICAgICAgIHJlZ19jb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcXVlcnktPnJlZ19jb3VudCA9IHJlZ19jb3VudDsKKyAgICBxdWVyeS0+c2xvdF9zdHJpZGUgPSB1X2FsaWduKHJlZ19jb3VudCAqIHNpemVvZih1aW50NjRfdCkgKiAyLCA2NCk7Cit9CisKK1ZrUmVzdWx0IGludGVsX3F1ZXJ5X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9xdWVyeSAqKnF1ZXJ5X3JldCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfcXVlcnkgKnF1ZXJ5OworCisgICAgcXVlcnkgPSAoc3RydWN0IGludGVsX3F1ZXJ5ICopIGludGVsX2Jhc2VfY3JlYXRlKCZkZXYtPmJhc2UuaGFuZGxlLAorICAgICAgICAgICAgc2l6ZW9mKCpxdWVyeSksIGRldi0+YmFzZS5kYmcsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQsCisgICAgICAgICAgICBpbmZvLCAwKTsKKyAgICBpZiAoIXF1ZXJ5KQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgcXVlcnktPnR5cGUgPSBpbmZvLT5xdWVyeVR5cGU7CisgICAgcXVlcnktPnNsb3RfY291bnQgPSBpbmZvLT5xdWVyeUNvdW50OworCisgICAgLyoKKyAgICAgKiBGb3IgZWFjaCBxdWVyeSB0eXBlLCB0aGUgR1BVIHdpbGwgYmUgYXNrZWQgdG8gd3JpdGUgdGhlIHZhbHVlcyBvZiBzb21lCisgICAgICogcmVnaXN0ZXJzIHRvIGEgYnVmZmVyIGJlZm9yZSBhbmQgYWZ0ZXIgYSBzZXF1ZW5jZSBvZiBjb21tYW5kcy4gIFdlIHdpbGwKKyAgICAgKiBjb21wYXJlIHRoZSBkaWZmZXJlbmNlcyB0byBnZXQgdGhlIHF1ZXJ5IHJlc3VsdHMuCisgICAgICovCisgICAgc3dpdGNoIChpbmZvLT5xdWVyeVR5cGUpIHsKKyAgICBjYXNlIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OOgorICAgICAgICBxdWVyeS0+c2xvdF9zdHJpZGUgPSB1X2FsaWduKHNpemVvZih1aW50NjRfdCkgKiAyLCA2NCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUVVFUllfVFlQRV9QSVBFTElORV9TVEFUSVNUSUNTOgorICAgICAgICBxdWVyeV9pbml0X3BpcGVsaW5lX3N0YXRpc3RpY3MoZGV2LCBpbmZvLCBxdWVyeSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfUVVFUllfVFlQRV9USU1FU1RBTVA6CisgICAgICAgIHF1ZXJ5LT5zbG90X3N0cmlkZSA9IHVfYWxpZ24oc2l6ZW9mKHVpbnQ2NF90KSwgNjQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bmtub3duIHF1ZXJ5IHR5cGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbWVtX3JlcXM7CisgICAgbWVtX3JlcXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTzsKKyAgICBtZW1fcmVxcy5hbGxvY2F0aW9uU2l6ZSA9IHF1ZXJ5LT5zbG90X3N0cmlkZSAqIHF1ZXJ5LT5zbG90X2NvdW50OworICAgIG1lbV9yZXFzLnBOZXh0ID0gTlVMTDsKKyAgICBtZW1fcmVxcy5tZW1vcnlUeXBlSW5kZXggPSAwOworICAgIGludGVsX21lbV9hbGxvYyhkZXYsICZtZW1fcmVxcywgJnF1ZXJ5LT5vYmoubWVtKTsKKworICAgIHF1ZXJ5LT5vYmouZGVzdHJveSA9IHF1ZXJ5X2Rlc3Ryb3k7CisKKyAgICAqcXVlcnlfcmV0ID0gcXVlcnk7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9xdWVyeV9kZXN0cm95KHN0cnVjdCBpbnRlbF9xdWVyeSAqcXVlcnkpCit7CisgICAgaW50ZWxfYmFzZV9kZXN0cm95KCZxdWVyeS0+b2JqLmJhc2UpOworfQorCitzdGF0aWMgdm9pZAorcXVlcnlfcHJvY2Vzc19vY2NsdXNpb24oY29uc3Qgc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCB1aW50OF90ICpyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqcmVzdWx0cykKK3sKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgKnBhaXIgPSAoY29uc3QgdWludDY0X3QgKikgcmF3OworCisgICAgICAgIHJlc3VsdHNbaV0gPSBwYWlyWzFdIC0gcGFpclswXTsKKyAgICAgICAgcmF3ICs9IHF1ZXJ5LT5zbG90X3N0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitxdWVyeV9wcm9jZXNzX3BpcGVsaW5lX3N0YXRpc3RpY3MoY29uc3Qgc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgdWludDhfdCAqcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc3VsdHMpCit7CisgICAgY29uc3QgdWludDMyX3QgbnVtX3JlZ3MgPSBxdWVyeS0+cmVnX2NvdW50OworICAgIHVpbnQzMl90IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCB1aW50NjRfdCAqYmVmb3JlID0gKGNvbnN0IHVpbnQ2NF90ICopIHJhdzsKKyAgICAgICAgY29uc3QgdWludDY0X3QgKmFmdGVyID0gYmVmb3JlICsgbnVtX3JlZ3M7CisgICAgICAgIHVpbnQ2NF90ICpkc3QgPSAodWludDY0X3QgKikgKHJlc3VsdHMgKyBpKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3JlZ3M7IGorKykKKyAgICAgICAgICAgIGRzdFtqXSA9IGFmdGVyW2pdIC0gYmVmb3JlW2pdOworCisgICAgICAgIHJhdyArPSBxdWVyeS0+c2xvdF9zdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcXVlcnlfcHJvY2Vzc190aW1lc3RhbXAoY29uc3Qgc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCB1aW50OF90ICpyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqcmVzdWx0cykKK3sKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgKnRzID0gKGNvbnN0IHVpbnQ2NF90ICopIHJhdzsKKworICAgICAgICByZXN1bHRzW2ldID0gKnRzOworICAgICAgICByYXcgKz0gcXVlcnktPnNsb3Rfc3RyaWRlOworICAgIH0KK30KKworVmtSZXN1bHQgaW50ZWxfcXVlcnlfZ2V0X3Jlc3VsdHMoc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNsb3Rfc3RhcnQsIHVpbnQzMl90IHNsb3RfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXN1bHRzKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnB0cjsKKworICAgIGlmIChpbnRlbF9tZW1faXNfYnVzeShxdWVyeS0+b2JqLm1lbSkpCisgICAgICAgIHJldHVybiBWS19OT1RfUkVBRFk7CisKKyAgICBwdHIgPSAoY29uc3QgdWludDhfdCAqKSBpbnRlbF9tZW1fbWFwX3N5bmMocXVlcnktPm9iai5tZW0sIGZhbHNlKTsKKyAgICBpZiAoIXB0cikKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX01FTU9SWV9NQVBfRkFJTEVEOworCisgICAgcHRyICs9IHF1ZXJ5LT5vYmoub2Zmc2V0ICsgcXVlcnktPnNsb3Rfc3RyaWRlICogc2xvdF9zdGFydDsKKworICAgIHN3aXRjaCAocXVlcnktPnR5cGUpIHsKKyAgICBjYXNlIFZLX1FVRVJZX1RZUEVfT0NDTFVTSU9OOgorICAgICAgICBxdWVyeV9wcm9jZXNzX29jY2x1c2lvbihxdWVyeSwgc2xvdF9jb3VudCwgcHRyLCByZXN1bHRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19RVUVSWV9UWVBFX1BJUEVMSU5FX1NUQVRJU1RJQ1M6CisgICAgICAgIHF1ZXJ5X3Byb2Nlc3NfcGlwZWxpbmVfc3RhdGlzdGljcyhxdWVyeSwgc2xvdF9jb3VudCwgcHRyLCByZXN1bHRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19RVUVSWV9UWVBFX1RJTUVTVEFNUDoKKyAgICAgICAgcXVlcnlfcHJvY2Vzc190aW1lc3RhbXAocXVlcnksIHNsb3RfY291bnQsIHB0ciwgcmVzdWx0cyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW50ZWxfbWVtX3VubWFwKHF1ZXJ5LT5vYmoubWVtKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1F1ZXJ5UG9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWVyeVBvb2wpCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gaW50ZWxfcXVlcnlfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IGludGVsX3F1ZXJ5ICoqKSBwUXVlcnlQb29sKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95UXVlcnlQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQorCisgeworICAgIHN0cnVjdCBpbnRlbF9vYmogKm9iaiA9IGludGVsX29iaihxdWVyeVBvb2wpOworCisgICAgb2JqLT5kZXN0cm95KG9iaik7CisgfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisgICAgc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSA9IGludGVsX3F1ZXJ5KHF1ZXJ5UG9vbCk7CisKKyAgICBpZiAocERhdGEpCisgICAgICAgIHJldHVybiBpbnRlbF9xdWVyeV9nZXRfcmVzdWx0cyhxdWVyeSwgZmlyc3RRdWVyeSwgcXVlcnlDb3VudCwgcERhdGEpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvcXVlcnkuaCBiL2ljZC9pbnRlbC9xdWVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTE0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvcXVlcnkuaApAQCAtMCwwICsxLDYyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKgorICovCisKKyNpZm5kZWYgUVVFUllfSAorI2RlZmluZSBRVUVSWV9ICisKKyNpbmNsdWRlICJpbnRlbC5oIgorI2luY2x1ZGUgIm9iai5oIgorCitzdHJ1Y3QgaW50ZWxfcXVlcnkgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgVmtRdWVyeVR5cGUgdHlwZTsKKyAgICB1aW50MzJfdCByZWdfY291bnQ7CisgICAgdWludDMyX3Qgc2xvdF9zdHJpZGU7CisgICAgdWludDMyX3Qgc2xvdF9jb3VudDsKKyAgICB1aW50MzJfdCByZWdzWzMyXTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3F1ZXJ5ICppbnRlbF9xdWVyeShWa1F1ZXJ5UG9vbCBwb29sKQoreworICAgIHJldHVybiAqKHN0cnVjdCBpbnRlbF9xdWVyeSAqKikgJnBvb2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3F1ZXJ5ICppbnRlbF9xdWVyeV9mcm9tX2Jhc2Uoc3RydWN0IGludGVsX2Jhc2UgKmJhc2UpCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfcXVlcnkgKikgYmFzZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfcXVlcnkgKmludGVsX3F1ZXJ5X2Zyb21fb2JqKHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICByZXR1cm4gaW50ZWxfcXVlcnlfZnJvbV9iYXNlKCZvYmotPmJhc2UpOworfQorCitWa1Jlc3VsdCBpbnRlbF9xdWVyeV9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3F1ZXJ5ICoqcXVlcnlfcmV0KTsKK3ZvaWQgaW50ZWxfcXVlcnlfZGVzdHJveShzdHJ1Y3QgaW50ZWxfcXVlcnkgKnF1ZXJ5KTsKKworVmtSZXN1bHQgaW50ZWxfcXVlcnlfZ2V0X3Jlc3VsdHMoc3RydWN0IGludGVsX3F1ZXJ5ICpxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2xvdF9zdGFydCwgdWludDMyX3Qgc2xvdF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzdWx0cyk7CisKKyNlbmRpZiAvKiBRVUVSWV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvcXVldWUuYyBiL2ljZC9pbnRlbC9xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDg1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvcXVldWUuYwpAQCAtMCwwICsxLDQ2NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJnZW5ody9nZW5ody5oIgorI2luY2x1ZGUgImttZC93aW5zeXMuaCIKKyNpbmNsdWRlICJjbWQuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJmZW5jZS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisKK3N0YXRpYyB2b2lkIHNlbWFwaG9yZV9kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfc2VtYXBob3JlICpzZW1hcGhvcmUgPSBpbnRlbF9zZW1hcGhvcmVfZnJvbV9vYmoob2JqKTsKKworICAgIGludGVsX3NlbWFwaG9yZV9kZXN0cm95KHNlbWFwaG9yZSk7Cit9CisKK1ZrUmVzdWx0IGludGVsX3NlbWFwaG9yZV9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9zZW1hcGhvcmUgKipzZW1hcGhvcmVfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9zZW1hcGhvcmUgKnNlbWFwaG9yZTsKKyAgICBzZW1hcGhvcmUgPSAoc3RydWN0IGludGVsX3NlbWFwaG9yZSAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqc2VtYXBob3JlKSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQsIGluZm8sIDApOworCisgICAgaWYgKCFzZW1hcGhvcmUpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBzZW1hcGhvcmUtPnJlZmVyZW5jZXMgPSAwOworICAgICpzZW1hcGhvcmVfcmV0ID0gc2VtYXBob3JlOworICAgIHNlbWFwaG9yZS0+b2JqLmRlc3Ryb3kgPSBzZW1hcGhvcmVfZGVzdHJveTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX3NlbWFwaG9yZV9kZXN0cm95KHN0cnVjdCBpbnRlbF9zZW1hcGhvcmUgKnNlbWFwaG9yZSkKK3sKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJnNlbWFwaG9yZS0+b2JqLmJhc2UpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9zdWJtaXRfaGFuZyhzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2NtZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlX2xvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZW5kaW5nX2xvc3QpCit7CisgICAgaW50ZWxfY21kX2RlY29kZShjbWQsIHRydWUpOworCisgICAgaW50ZWxfZGV2X2xvZyhxdWV1ZS0+ZGV2LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICZjbWQtPm9iai5iYXNlLCAwLCAwLAorICAgICAgICAgICAgICAgICAgIkdQVSBoYW5nZWQgd2l0aCAlZC8lZCBhY3RpdmUvcGVuZGluZyBjb21tYW5kIGJ1ZmZlcnMgbG9zdCIsCisgICAgICAgICAgICAgICAgICBhY3RpdmVfbG9zdCwgcGVuZGluZ19sb3N0KTsKK30KKworc3RhdGljIFZrUmVzdWx0IHF1ZXVlX3N1Ym1pdF9ibyhzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHVzZWQpCit7CisgICAgc3RydWN0IGludGVsX3dpbnN5cyAqd2luc3lzID0gcXVldWUtPmRldi0+d2luc3lzOworICAgIGludCBlcnI7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiBJTlRFTF9ERUJVR19OT0hXKQorICAgICAgICBlcnIgPSAwOworICAgIGVsc2UKKyAgICAgICAgZXJyID0gaW50ZWxfd2luc3lzX3N1Ym1pdF9ibyh3aW5zeXMsIHF1ZXVlLT5yaW5nLCBibywgdXNlZCwgMCk7CisKKyAgICByZXR1cm4gKGVycikgPyBWS19FUlJPUl9ERVZJQ0VfTE9TVCA6IFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfYm8gKnF1ZXVlX2NyZWF0ZV9ibyhzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY21kX2xlbikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvOworICAgIHZvaWQgKnB0cjsKKworICAgIGJvID0gaW50ZWxfd2luc3lzX2FsbG9jX2JvKHF1ZXVlLT5kZXYtPndpbnN5cywKKyAgICAgICAgICAgICJxdWV1ZSBibyIsIHNpemUsIHRydWUpOworICAgIGlmICghYm8pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFjbWRfbGVuKQorICAgICAgICByZXR1cm4gYm87CisKKyAgICBwdHIgPSBpbnRlbF9ib19tYXAoYm8sIHRydWUpOworICAgIGlmICghcHRyKSB7CisgICAgICAgIGludGVsX2JvX3VucmVmKGJvKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtY3B5KHB0ciwgY21kLCBjbWRfbGVuKTsKKyAgICBpbnRlbF9ib191bm1hcChibyk7CisKKyAgICByZXR1cm4gYm87Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBxdWV1ZV9zZWxlY3RfcGlwZWxpbmUoc3RydWN0IGludGVsX3F1ZXVlICpxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlwZWxpbmVfc2VsZWN0KQoreworICAgIHVpbnQzMl90IHBpcGVsaW5lX3NlbGVjdF9jbWRbXSA9IHsKKyAgICAgICAgR0VONl9SRU5ERVJfQ01EKFNJTkdMRV9EVywgUElQRUxJTkVfU0VMRUNUKSwKKyAgICAgICAgR0VONl9NSV9DTUQoTUlfQkFUQ0hfQlVGRkVSX0VORCksCisgICAgfTsKKyAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvID0gTlVMTDsKKyAgICBWa1Jlc3VsdCByZXQ7CisKKyAgICBpZiAocXVldWUtPnJpbmcgIT0gSU5URUxfUklOR19SRU5ERVIgfHwKKyAgICAgICAgcXVldWUtPmxhc3RfcGlwZWxpbmVfc2VsZWN0ID09IHBpcGVsaW5lX3NlbGVjdCkKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisKKyAgICBzd2l0Y2ggKHBpcGVsaW5lX3NlbGVjdCkgeworICAgIGNhc2UgR0VONl9QSVBFTElORV9TRUxFQ1RfRFcwX1NFTEVDVF8zRDoKKyAgICAgICAgYm8gPSBxdWV1ZS0+c2VsZWN0X2dyYXBoaWNzX2JvOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdFTjZfUElQRUxJTkVfU0VMRUNUX0RXMF9TRUxFQ1RfTUVESUE6CisgICAgICAgIGJvID0gcXVldWUtPnNlbGVjdF9jb21wdXRlX2JvOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiSW52YWxpZCBwaXBlbGluZSBzZWxlY3QiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFibykgeworICAgICAgICBwaXBlbGluZV9zZWxlY3RfY21kWzBdIHw9IHBpcGVsaW5lX3NlbGVjdDsKKyAgICAgICAgYm8gPSBxdWV1ZV9jcmVhdGVfYm8ocXVldWUsIHNpemVvZihwaXBlbGluZV9zZWxlY3RfY21kKSwKKyAgICAgICAgICAgICAgICBwaXBlbGluZV9zZWxlY3RfY21kLCBzaXplb2YocGlwZWxpbmVfc2VsZWN0X2NtZCkpOworICAgICAgICBpZiAoIWJvKQorICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9ERVZJQ0VfTUVNT1JZOworCisgICAgICAgIHN3aXRjaCAocGlwZWxpbmVfc2VsZWN0KSB7CisgICAgICAgIGNhc2UgR0VONl9QSVBFTElORV9TRUxFQ1RfRFcwX1NFTEVDVF8zRDoKKyAgICAgICAgICAgIHF1ZXVlLT5zZWxlY3RfZ3JhcGhpY3NfYm8gPSBibzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdFTjZfUElQRUxJTkVfU0VMRUNUX0RXMF9TRUxFQ1RfTUVESUE6CisgICAgICAgICAgICBxdWV1ZS0+c2VsZWN0X2NvbXB1dGVfYm8gPSBibzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBxdWV1ZV9zdWJtaXRfYm8ocXVldWUsIGJvLCBzaXplb2YocGlwZWxpbmVfc2VsZWN0X2NtZCkpOworICAgIGlmIChyZXQgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgcXVldWUtPmxhc3RfcGlwZWxpbmVfc2VsZWN0ID0gcGlwZWxpbmVfc2VsZWN0OworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFZrUmVzdWx0IHF1ZXVlX2luaXRfaHdfYW5kX2F0b21pY19ibyhzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlKQoreworICAgIGNvbnN0IHVpbnQzMl90IGN0eF9pbml0X2NtZFtdID0geworICAgICAgICAvKiBTVEFURV9TSVAgKi8KKyAgICAgICAgR0VONl9SRU5ERVJfQ01EKENPTU1PTiwgU1RBVEVfU0lQKSwKKyAgICAgICAgMCwKKyAgICAgICAgLyogUElQRUxJTkVfU0VMRUNUICovCisgICAgICAgIEdFTjZfUkVOREVSX0NNRChTSU5HTEVfRFcsIFBJUEVMSU5FX1NFTEVDVCkgfAorICAgICAgICAgICAgR0VONl9QSVBFTElORV9TRUxFQ1RfRFcwX1NFTEVDVF8zRCwKKyAgICAgICAgLyogM0RTVEFURV9WRl9TVEFUSVNUSUNTICovCisgICAgICAgIEdFTjZfUkVOREVSX0NNRChTSU5HTEVfRFcsIDNEU1RBVEVfVkZfU1RBVElTVElDUyksCisgICAgICAgIC8qIGVuZCAqLworICAgICAgICBHRU42X01JX0NNRChNSV9CQVRDSF9CVUZGRVJfRU5EKSwKKyAgICAgICAgR0VONl9NSV9DTUQoTUlfTk9PUCksCisgICAgfTsKKyAgICBzdHJ1Y3QgaW50ZWxfYm8gKmJvOworICAgIFZrUmVzdWx0IHJldDsKKworICAgIGlmIChxdWV1ZS0+cmluZyAhPSBJTlRFTF9SSU5HX1JFTkRFUikgeworICAgICAgICBxdWV1ZS0+bGFzdF9waXBlbGluZV9zZWxlY3QgPSAtMTsKKyAgICAgICAgcXVldWUtPmF0b21pY19ibyA9IHF1ZXVlX2NyZWF0ZV9ibyhxdWV1ZSwKKyAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpICogSU5URUxfUVVFVUVfQVRPTUlDX0NPVU5URVJfQ09VTlQsCisgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisgICAgICAgIHJldHVybiAocXVldWUtPmF0b21pY19ibykgPyBWS19TVUNDRVNTIDogVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlk7CisgICAgfQorCisgICAgYm8gPSBxdWV1ZV9jcmVhdGVfYm8ocXVldWUsCisgICAgICAgICAgICBzaXplb2YodWludDMyX3QpICogSU5URUxfUVVFVUVfQVRPTUlDX0NPVU5URVJfQ09VTlQsCisgICAgICAgICAgICBjdHhfaW5pdF9jbWQsIHNpemVvZihjdHhfaW5pdF9jbWQpKTsKKyAgICBpZiAoIWJvKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0RFVklDRV9NRU1PUlk7CisKKyAgICByZXQgPSBxdWV1ZV9zdWJtaXRfYm8ocXVldWUsIGJvLCBzaXplb2YoY3R4X2luaXRfY21kKSk7CisgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIGludGVsX2JvX3VucmVmKGJvKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBxdWV1ZS0+bGFzdF9waXBlbGluZV9zZWxlY3QgPSBHRU42X1BJUEVMSU5FX1NFTEVDVF9EVzBfU0VMRUNUXzNEOworICAgIC8qIHJldXNlICovCisgICAgcXVldWUtPmF0b21pY19ibyA9IGJvOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBxdWV1ZV9zdWJtaXRfY21kX3ByZXBhcmUoc3RydWN0IGludGVsX3F1ZXVlICpxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgaWYgKHVubGlrZWx5KGNtZC0+cmVzdWx0ICE9IFZLX1NVQ0NFU1MgfHwgIWNtZC0+cHJpbWFyeSkpIHsKKyAgICAgICAgaW50ZWxfZGV2X2xvZyhjbWQtPmRldiwgVktfREVCVUdfUkVQT1JUX0VSUk9SX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgJmNtZC0+b2JqLmJhc2UsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgY29tbWFuZCBidWZmZXIgc3VibWl0dGVkIik7CisgICAgfQorCisgICAgcmV0dXJuIHF1ZXVlX3NlbGVjdF9waXBlbGluZShxdWV1ZSwgY21kLT5waXBlbGluZV9zZWxlY3QpOworfQorCitzdGF0aWMgVmtSZXN1bHQgcXVldWVfc3VibWl0X2NtZF9kZWJ1ZyhzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgdWludDMyX3QgYWN0aXZlWzJdLCBwZW5kaW5nWzJdOworICAgIHN0cnVjdCBpbnRlbF9ibyAqYm87CisgICAgVmtEZXZpY2VTaXplIHVzZWQ7CisgICAgVmtSZXN1bHQgcmV0OworCisgICAgcmV0ID0gcXVldWVfc3VibWl0X2NtZF9wcmVwYXJlKHF1ZXVlLCBjbWQpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChpbnRlbF9kZWJ1ZyAmIElOVEVMX0RFQlVHX0hBTkcpIHsKKyAgICAgICAgaW50ZWxfd2luc3lzX2dldF9yZXNldF9zdGF0cyhxdWV1ZS0+ZGV2LT53aW5zeXMsCisgICAgICAgICAgICAgICAgJmFjdGl2ZVswXSwgJnBlbmRpbmdbMF0pOworICAgIH0KKworICAgIGJvID0gaW50ZWxfY21kX2dldF9iYXRjaChjbWQsICZ1c2VkKTsKKyAgICByZXQgPSBxdWV1ZV9zdWJtaXRfYm8ocXVldWUsIGJvLCB1c2VkKTsKKyAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiBJTlRFTF9ERUJVR19IQU5HKSB7CisgICAgICAgIGludGVsX2JvX3dhaXQoYm8sIC0xKTsKKyAgICAgICAgaW50ZWxfd2luc3lzX2dldF9yZXNldF9zdGF0cyhxdWV1ZS0+ZGV2LT53aW5zeXMsCisgICAgICAgICAgICAgICAgJmFjdGl2ZVsxXSwgJnBlbmRpbmdbMV0pOworCisgICAgICAgIGlmIChhY3RpdmVbMF0gIT0gYWN0aXZlWzFdIHx8IHBlbmRpbmdbMF0gIT0gcGVuZGluZ1sxXSkgeworICAgICAgICAgICAgcXVldWVfc3VibWl0X2hhbmcocXVldWUsIGNtZCwgYWN0aXZlWzFdIC0gYWN0aXZlWzBdLAorICAgICAgICAgICAgICAgICAgICBwZW5kaW5nWzFdIC0gcGVuZGluZ1swXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW50ZWxfZGVidWcgJiBJTlRFTF9ERUJVR19CQVRDSCkKKyAgICAgICAgaW50ZWxfY21kX2RlY29kZShjbWQsIGZhbHNlKTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVmtSZXN1bHQgcXVldWVfc3VibWl0X2NtZChzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQpCit7CisgICAgc3RydWN0IGludGVsX2JvICpibzsKKyAgICBWa0RldmljZVNpemUgdXNlZDsKKyAgICBWa1Jlc3VsdCByZXQ7CisKKyAgICByZXQgPSBxdWV1ZV9zdWJtaXRfY21kX3ByZXBhcmUocXVldWUsIGNtZCk7CisgICAgaWYgKHJldCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIGJvID0gaW50ZWxfY21kX2dldF9iYXRjaChjbWQsICZ1c2VkKTsKKyAgICAgICAgcmV0ID0gcXVldWVfc3VibWl0X2JvKHF1ZXVlLCBibywgdXNlZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworVmtSZXN1bHQgaW50ZWxfcXVldWVfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGludGVsX2dwdV9lbmdpbmVfdHlwZSBlbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3F1ZXVlICoqcXVldWVfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9xdWV1ZSAqcXVldWU7CisgICAgZW51bSBpbnRlbF9yaW5nX3R5cGUgcmluZzsKKyAgICBWa0ZlbmNlQ3JlYXRlSW5mbyBmZW5jZV9pbmZvOworICAgIFZrUmVzdWx0IHJldDsKKworICAgIHN3aXRjaCAoZW5naW5lKSB7CisgICAgY2FzZSBJTlRFTF9HUFVfRU5HSU5FXzNEOgorICAgICAgICByaW5nID0gSU5URUxfUklOR19SRU5ERVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGludGVsX2Rldl9sb2coZGV2LCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAmZGV2LT5iYXNlLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGVuZ2luZSB0eXBlIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHF1ZXVlID0gKHN0cnVjdCBpbnRlbF9xdWV1ZSAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqcXVldWUpLCBkZXYtPmJhc2UuZGJnLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFVUVfRVhULCBOVUxMLCAwKTsKKyAgICBpZiAoIXF1ZXVlKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgcXVldWUtPmRldiA9IGRldjsKKyAgICBxdWV1ZS0+cmluZyA9IHJpbmc7CisKKyAgICBpZiAocXVldWVfaW5pdF9od19hbmRfYXRvbWljX2JvKHF1ZXVlKSAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIGludGVsX3F1ZXVlX2Rlc3Ryb3kocXVldWUpOworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKworICAgIG1lbXNldCgmZmVuY2VfaW5mbywgMCwgc2l6ZW9mKGZlbmNlX2luZm8pKTsKKyAgICBmZW5jZV9pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk87CisgICAgcmV0ID0gaW50ZWxfZmVuY2VfY3JlYXRlKGRldiwgJmZlbmNlX2luZm8sICZxdWV1ZS0+ZmVuY2UpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBpbnRlbF9xdWV1ZV9kZXN0cm95KHF1ZXVlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqcXVldWVfcmV0ID0gcXVldWU7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKwordm9pZCBpbnRlbF9xdWV1ZV9kZXN0cm95KHN0cnVjdCBpbnRlbF9xdWV1ZSAqcXVldWUpCit7CisgICAgaWYgKHF1ZXVlLT5mZW5jZSkKKyAgICAgICAgaW50ZWxfZmVuY2VfZGVzdHJveShxdWV1ZS0+ZmVuY2UpOworCisgICAgaW50ZWxfYm9fdW5yZWYocXVldWUtPmF0b21pY19ibyk7CisgICAgaW50ZWxfYm9fdW5yZWYocXVldWUtPnNlbGVjdF9ncmFwaGljc19ibyk7CisgICAgaW50ZWxfYm9fdW5yZWYocXVldWUtPnNlbGVjdF9jb21wdXRlX2JvKTsKKworICAgIGludGVsX2Jhc2VfZGVzdHJveSgmcXVldWUtPmJhc2UpOworfQorCitWa1Jlc3VsdCBpbnRlbF9xdWV1ZV93YWl0KHN0cnVjdCBpbnRlbF9xdWV1ZSAqcXVldWUsIGludDY0X3QgdGltZW91dCkKK3sKKyAgICAvKiByZXR1cm4gVktfU1VDQ0VTUyBpbnN0ZWFkIG9mIFZLX0VSUk9SX1VOQVZBSUxBQkxFICovCisgICAgaWYgKCFxdWV1ZS0+ZmVuY2UtPnNlcW5vX2JvKQorICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKworICAgIHJldHVybiBpbnRlbF9mZW5jZV93YWl0KHF1ZXVlLT5mZW5jZSwgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3dhaXRfcXVldWVfc2VtYXBob3JlKHN0cnVjdCBpbnRlbF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBpbnRlbF9zZW1hcGhvcmUgKnNlbWFwaG9yZSkKK3sKKyAgICBpbnRlbF9xdWV1ZV93YWl0KHF1ZXVlLCAtMSk7CisgICAgc2VtYXBob3JlLT5yZWZlcmVuY2VzLS07Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3NpZ25hbF9xdWV1ZV9zZW1hcGhvcmUoc3RydWN0IGludGVsX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGludGVsX3NlbWFwaG9yZSAqc2VtYXBob3JlKQoreworICAgIHNlbWFwaG9yZS0+cmVmZXJlbmNlcysrOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtRdWV1ZVdhaXRJZGxlKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlID0gaW50ZWxfcXVldWUocXVldWVfKTsKKworICAgIHJldHVybiBpbnRlbF9xdWV1ZV93YWl0KHF1ZXVlLCAtMSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICBwU3VibWl0cywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZV8pCit7CisgICAgc3RydWN0IGludGVsX3F1ZXVlICpxdWV1ZSA9IGludGVsX3F1ZXVlKHF1ZXVlXyk7CisgICAgVmtSZXN1bHQgcmV0ID0gVktfU1VDQ0VTUzsKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpsYXN0X2NtZDsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yICh1aW50MzJfdCBzdWJtaXRfaWR4ID0gMDsgc3VibWl0X2lkeCA8IHN1Ym1pdENvdW50OyBzdWJtaXRfaWR4KyspIHsKKworICAgICAgICBjb25zdCBWa1N1Ym1pdEluZm8gKnN1Ym1pdCA9ICZwU3VibWl0c1tzdWJtaXRfaWR4XTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VibWl0LT53YWl0U2VtYXBob3JlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgc3RydWN0IGludGVsX3NlbWFwaG9yZSAqcFNlbWFwaG9yZSA9IGludGVsX3NlbWFwaG9yZShzdWJtaXQtPnBXYWl0U2VtYXBob3Jlc1tpXSk7CisgICAgICAgICAgICBpbnRlbF93YWl0X3F1ZXVlX3NlbWFwaG9yZShxdWV1ZSwgcFNlbWFwaG9yZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodW5saWtlbHkoaW50ZWxfZGVidWcpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VibWl0LT5jb21tYW5kQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChzdWJtaXQtPnBDb21tYW5kQnVmZmVyc1tpXSk7CisgICAgICAgICAgICAgICAgcmV0ID0gcXVldWVfc3VibWl0X2NtZF9kZWJ1ZyhxdWV1ZSwgY21kKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Ym1pdC0+Y29tbWFuZEJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoc3VibWl0LT5wQ29tbWFuZEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgICAgIHJldCA9IHF1ZXVlX3N1Ym1pdF9jbWQocXVldWUsIGNtZCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vIGNtZCBzdWJtaXR0ZWQgKi8KKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgbGFzdF9jbWQgPSBpbnRlbF9jbWQoc3VibWl0LT5wQ29tbWFuZEJ1ZmZlcnNbaSAtIDFdKTsKKworICAgICAgICBpZiAocmV0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGludGVsX2ZlbmNlX3NldF9zZXFubyhxdWV1ZS0+ZmVuY2UsCisgICAgICAgICAgICAgICAgICAgIGludGVsX2NtZF9nZXRfYmF0Y2gobGFzdF9jbWQsIE5VTEwpKTsKKworICAgICAgICAgICAgaWYgKGZlbmNlXyAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2UgPSBpbnRlbF9mZW5jZShmZW5jZV8pOworICAgICAgICAgICAgICAgIGludGVsX2ZlbmNlX2NvcHkoZmVuY2UsIHF1ZXVlLT5mZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYm8gKmxhc3RfYm87CisKKyAgICAgICAgICAgIC8qIHVuYnVzeSBzdWJtaXR0ZWQgQk9zICovCisgICAgICAgICAgICBsYXN0X2JvID0gaW50ZWxfY21kX2dldF9iYXRjaChsYXN0X2NtZCwgTlVMTCk7CisgICAgICAgICAgICBpbnRlbF9ib193YWl0KGxhc3RfYm8sIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdWJtaXQtPnNpZ25hbFNlbWFwaG9yZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9zZW1hcGhvcmUgKnBTZW1hcGhvcmUgPSBpbnRlbF9zZW1hcGhvcmUoc3VibWl0LT5wU2lnbmFsU2VtYXBob3Jlc1tpXSk7CisgICAgICAgICAgICBpbnRlbF9zaWduYWxfcXVldWVfc2VtYXBob3JlKHF1ZXVlLCBwU2VtYXBob3JlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyAgICAgICAgICAgICpwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgICAgICAgICAgICAqcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNlbWFwaG9yZSkKK3sKKyAgICAvKgorICAgICAqIFdlIHdhbnQgdG8gZmluZCBhbiB1bnVzZWQgc2VtYXBob3JlIHJlZ2lzdGVyIGFuZCBpbml0aWFsaXplIGl0LiAgU2lnbmFsCisgICAgICogd2lsbCBpbmNyZW1lbnQgdGhlIHJlZ2lzdGVyLiAgV2FpdCB3aWxsIGF0b21pY2FsbHkgZGVjcmVtZW50IGl0IGFuZAorICAgICAqIGJsb2NrIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBvciBhIGxhcmdlIGNvbnN0YW50IE4gaWYgd2UgZG8gbm90IHdhbnQgdG8KKyAgICAgKiBnbyBuZWdhdGl2ZS4KKyAgICAgKgorICAgICAqIFhYWCBIb3dldmVyLCBNSV9TRU1BUEhPUkVfTUJPWCBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgdGhlIGZsZXhpYmlsaXR5LgorICAgICAqLworCisgICAgLy8gVE9ETzogZnVsbHkgc3VwcG9ydCBzZW1hcGhvcmVzIChtZWFuIHRpbWUsIHNpbXVsYXRlIGl0KToKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYgPSBpbnRlbF9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBpbnRlbF9zZW1hcGhvcmVfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfc2VtYXBob3JlICoqKSBwU2VtYXBob3JlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2VtYXBob3JlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2VtYXBob3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIHN0cnVjdCBpbnRlbF9vYmogKm9iaiA9IGludGVsX29iaihzZW1hcGhvcmUpOworICAgIG9iai0+ZGVzdHJveShvYmopOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL3F1ZXVlLmggYi9pY2QvaW50ZWwvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIxMjljCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL3F1ZXVlLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKgorICovCisKKyNpZm5kZWYgUVVFVUVfSAorI2RlZmluZSBRVUVVRV9ICisKKyNpbmNsdWRlICJrbWQvd2luc3lzLmgiCisjaW5jbHVkZSAiaW50ZWwuaCIKKyNpbmNsdWRlICJncHUuaCIKKyNpbmNsdWRlICJvYmouaCIKKworI2RlZmluZSBJTlRFTF9RVUVVRV9BVE9NSUNfQ09VTlRFUl9DT1VOVCAxMDI0CisKK3N0cnVjdCBpbnRlbF9kZXY7CitzdHJ1Y3QgaW50ZWxfZmVuY2U7CisKK3N0cnVjdCBpbnRlbF9zZW1hcGhvcmUgeworICAgIHN0cnVjdCBpbnRlbF9vYmogb2JqOworCisgICAgaW50IHJlZmVyZW5jZXM7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9zZW1hcGhvcmUgKmludGVsX3NlbWFwaG9yZShWa1NlbWFwaG9yZSBzZW1hcGhvcmUpCit7CisgICAgcmV0dXJuICooc3RydWN0IGludGVsX3NlbWFwaG9yZSAqKikgJnNlbWFwaG9yZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfc2VtYXBob3JlICppbnRlbF9zZW1hcGhvcmVfZnJvbV9vYmooc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX3NlbWFwaG9yZSAqKSBvYmo7Cit9CisKK3ZvaWQgaW50ZWxfc2VtYXBob3JlX2Rlc3Ryb3koc3RydWN0IGludGVsX3NlbWFwaG9yZSAqc2VtYXBob3JlKTsKKworc3RydWN0IGludGVsX3F1ZXVlIHsKKyAgICBzdHJ1Y3QgaW50ZWxfYmFzZSBiYXNlOworCisgICAgc3RydWN0IGludGVsX2RldiAqZGV2OworICAgIGVudW0gaW50ZWxfcmluZ190eXBlIHJpbmc7CisKKyAgICBzdHJ1Y3QgaW50ZWxfYm8gKmF0b21pY19ibzsKKyAgICBzdHJ1Y3QgaW50ZWxfYm8gKnNlbGVjdF9ncmFwaGljc19ibzsKKyAgICBzdHJ1Y3QgaW50ZWxfYm8gKnNlbGVjdF9jb21wdXRlX2JvOworCisgICAgaW50IGxhc3RfcGlwZWxpbmVfc2VsZWN0OworCisgICAgc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3F1ZXVlICppbnRlbF9xdWV1ZShWa1F1ZXVlIHF1ZXVlKQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX3F1ZXVlICopIHF1ZXVlOworfQorCitWa1Jlc3VsdCBpbnRlbF9xdWV1ZV9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpbnRlbF9ncHVfZW5naW5lX3R5cGUgZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3F1ZXVlICoqcXVldWVfcmV0KTsKK3ZvaWQgaW50ZWxfcXVldWVfZGVzdHJveShzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlKTsKKworVmtSZXN1bHQgaW50ZWxfcXVldWVfd2FpdChzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlLCBpbnQ2NF90IHRpbWVvdXQpOworCitWa1Jlc3VsdCBpbnRlbF9zZW1hcGhvcmVfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfc2VtYXBob3JlICoqc2VtYXBob3JlX3JldCk7CisKKyNlbmRpZiAvKiBRVUVVRV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvc2FtcGxlci5jIGIvaWNkL2ludGVsL3NhbXBsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTIzOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL3NhbXBsZXIuYwpAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImdlbmh3L2dlbmh3LmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAic2FtcGxlci5oIgorCisvKioKKyAqIFRyYW5zbGF0ZSBhIHBpcGUgdGV4dHVyZSBmaWx0ZXIgdG8gdGhlIG1hdGNoaW5nIGhhcmR3YXJlIG1hcGZpbHRlci4KKyAqLworc3RhdGljIGludCB0cmFuc2xhdGVfdGV4X2ZpbHRlcihWa0ZpbHRlciBmaWx0ZXIpCit7CisgICBzd2l0Y2ggKGZpbHRlcikgeworICAgY2FzZSBWS19GSUxURVJfTkVBUkVTVDogcmV0dXJuIEdFTjZfTUFQRklMVEVSX05FQVJFU1Q7CisgICBjYXNlIFZLX0ZJTFRFUl9MSU5FQVI6ICByZXR1cm4gR0VONl9NQVBGSUxURVJfTElORUFSOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVua25vd24gdGV4IGZpbHRlciIpOworICAgICAgcmV0dXJuIEdFTjZfTUFQRklMVEVSX05FQVJFU1Q7CisgICB9Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX3RleF9taXBtYXBfbW9kZShWa1NhbXBsZXJNaXBtYXBNb2RlIG1vZGUpCit7CisgICBzd2l0Y2ggKG1vZGUpIHsKKyAgIGNhc2UgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9ORUFSRVNUOiByZXR1cm4gR0VONl9NSVBGSUxURVJfTkVBUkVTVDsKKyAgIGNhc2UgVktfU0FNUExFUl9NSVBNQVBfTU9ERV9MSU5FQVI6ICByZXR1cm4gR0VONl9NSVBGSUxURVJfTElORUFSOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVua25vd24gdGV4IG1pcG1hcCBtb2RlIik7CisgICAgICByZXR1cm4gR0VONl9NSVBGSUxURVJfTk9ORTsKKyAgIH0KK30KKworc3RhdGljIGludCB0cmFuc2xhdGVfdGV4X2FkZHIoVmtTYW1wbGVyQWRkcmVzc01vZGUgYWRkcikKK3sKKyAgIHN3aXRjaCAoYWRkcikgeworICAgY2FzZSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9SRVBFQVQ6ICAgICAgICAgICAgICAgICByZXR1cm4gR0VONl9URVhDT09SRE1PREVfV1JBUDsKKyAgIGNhc2UgVktfU0FNUExFUl9BRERSRVNTX01PREVfTUlSUk9SRURfUkVQRUFUOiAgICAgICAgcmV0dXJuIEdFTjZfVEVYQ09PUkRNT0RFX01JUlJPUjsKKyAgIGNhc2UgVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRTogICAgICAgICAgcmV0dXJuIEdFTjZfVEVYQ09PUkRNT0RFX0NMQU1QOworICAgY2FzZSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19CT1JERVI6ICAgICAgICByZXR1cm4gR0VONl9URVhDT09SRE1PREVfQ0xBTVBfQk9SREVSOworICAgY2FzZSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9NSVJST1JfQ0xBTVBfVE9fRURHRTogICByZXR1cm4gR0VONl9URVhDT09SRE1PREVfTUlSUk9SX09OQ0U7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEidW5rbm93biB0ZXggYWRkcmVzcyIpOworICAgICAgcmV0dXJuIEdFTjZfVEVYQ09PUkRNT0RFX1dSQVA7CisgICB9Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX2NvbXBhcmVfZnVuYyhWa0NvbXBhcmVPcCBmdW5jKQoreworICAgIHN3aXRjaCAoZnVuYykgeworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9ORVZFUjogICAgICAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fTkVWRVI7CisgICAgY2FzZSBWS19DT01QQVJFX09QX0xFU1M6ICAgICAgICAgIHJldHVybiBHRU42X0NPTVBBUkVGVU5DVElPTl9MRVNTOworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9FUVVBTDogICAgICAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fRVFVQUw7CisgICAgY2FzZSBWS19DT01QQVJFX09QX0xFU1NfT1JfRVFVQUw6ICAgIHJldHVybiBHRU42X0NPTVBBUkVGVU5DVElPTl9MRVFVQUw7CisgICAgY2FzZSBWS19DT01QQVJFX09QX0dSRUFURVI6ICAgICAgIHJldHVybiBHRU42X0NPTVBBUkVGVU5DVElPTl9HUkVBVEVSOworICAgIGNhc2UgVktfQ09NUEFSRV9PUF9OT1RfRVFVQUw6ICAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fTk9URVFVQUw7CisgICAgY2FzZSBWS19DT01QQVJFX09QX0dSRUFURVJfT1JfRVFVQUw6IHJldHVybiBHRU42X0NPTVBBUkVGVU5DVElPTl9HRVFVQUw7CisgICAgY2FzZSBWS19DT01QQVJFX09QX0FMV0FZUzogICAgICAgIHJldHVybiBHRU42X0NPTVBBUkVGVU5DVElPTl9BTFdBWVM7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVua25vd24gY29tcGFyZV9mdW5jIik7CisgICAgICByZXR1cm4gR0VONl9DT01QQVJFRlVOQ1RJT05fTkVWRVI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0cmFuc2xhdGVfYm9yZGVyX2NvbG9yKFZrQm9yZGVyQ29sb3IgdHlwZSwgZmxvYXQgcmdiYVs0XSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZLX0JPUkRFUl9DT0xPUl9JTlRfT1BBUVVFX1dISVRFOgorICAgIGNhc2UgVktfQk9SREVSX0NPTE9SX0ZMT0FUX09QQVFVRV9XSElURToKKyAgICAgICAgcmdiYVswXSA9IDEuMDsKKyAgICAgICAgcmdiYVsxXSA9IDEuMDsKKyAgICAgICAgcmdiYVsyXSA9IDEuMDsKKyAgICAgICAgcmdiYVszXSA9IDEuMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19CT1JERVJfQ09MT1JfSU5UX1RSQU5TUEFSRU5UX0JMQUNLOgorICAgIGNhc2UgVktfQk9SREVSX0NPTE9SX0ZMT0FUX1RSQU5TUEFSRU5UX0JMQUNLOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJnYmFbMF0gPSAwLjA7CisgICAgICAgIHJnYmFbMV0gPSAwLjA7CisgICAgICAgIHJnYmFbMl0gPSAwLjA7CisgICAgICAgIHJnYmFbM10gPSAwLjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfQk9SREVSX0NPTE9SX0lOVF9PUEFRVUVfQkxBQ0s6CisgICAgY2FzZSBWS19CT1JERVJfQ09MT1JfRkxPQVRfT1BBUVVFX0JMQUNLOgorICAgICAgICByZ2JhWzBdID0gMC4wOworICAgICAgICByZ2JhWzFdID0gMC4wOworICAgICAgICByZ2JhWzJdID0gMC4wOworICAgICAgICByZ2JhWzNdID0gMS4wOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVyX2JvcmRlcl9jb2xvcl9zdGF0ZV9nZW42KGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgY29sb3JbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3WzEyXSkKK3sKKyAgIGZsb2F0IHJnYmFbNF0gPSB7IGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIGNvbG9yWzNdIH07CisKKyAgIElOVEVMX0dQVV9BU1NFUlQoZ3B1LCA2LCA2KTsKKworICAgLyoKKyAgICAqIFRoaXMgc3RhdGUgaXMgbm90IGRvY3VtZW50ZWQgaW4gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIGJ1dCBpbiB0aGUKKyAgICAqIElyb25sYWtlIFBSTS4gIFNOT1JNOCBzZWVtcyB0byBiZSBpbiBEVzExIGluc3RlYWQgb2YgRFcxLgorICAgICovCisKKyAgIC8qIElFRUVfRlAgKi8KKyAgIGR3WzFdID0gdV9mdWkocmdiYVswXSk7CisgICBkd1syXSA9IHVfZnVpKHJnYmFbMV0pOworICAgZHdbM10gPSB1X2Z1aShyZ2JhWzJdKTsKKyAgIGR3WzRdID0gdV9mdWkocmdiYVszXSk7CisKKyAgIC8qIEZMT0FUXzE2ICovCisgICBkd1s1XSA9IHVfZmxvYXRfdG9faGFsZihyZ2JhWzBdKSB8CisgICAgICAgICAgIHVfZmxvYXRfdG9faGFsZihyZ2JhWzFdKSA8PCAxNjsKKyAgIGR3WzZdID0gdV9mbG9hdF90b19oYWxmKHJnYmFbMl0pIHwKKyAgICAgICAgICAgdV9mbG9hdF90b19oYWxmKHJnYmFbM10pIDw8IDE2OworCisgICAvKiBjbGFtcCB0byBbLTEuMGYsIDEuMGZdICovCisgICByZ2JhWzBdID0gVV9DTEFNUChyZ2JhWzBdLCAtMS4wZiwgMS4wZik7CisgICByZ2JhWzFdID0gVV9DTEFNUChyZ2JhWzFdLCAtMS4wZiwgMS4wZik7CisgICByZ2JhWzJdID0gVV9DTEFNUChyZ2JhWzJdLCAtMS4wZiwgMS4wZik7CisgICByZ2JhWzNdID0gVV9DTEFNUChyZ2JhWzNdLCAtMS4wZiwgMS4wZik7CisKKyAgIC8qIFNOT1JNMTYgKi8KKyAgIGR3WzldID0gIChpbnQxNl90KSB1X2lyb3VuZChyZ2JhWzBdICogMzI3NjcuMGYpIHwKKyAgICAgICAgICAgIChpbnQxNl90KSB1X2lyb3VuZChyZ2JhWzFdICogMzI3NjcuMGYpIDw8IDE2OworICAgZHdbMTBdID0gKGludDE2X3QpIHVfaXJvdW5kKHJnYmFbMl0gKiAzMjc2Ny4wZikgfAorICAgICAgICAgICAgKGludDE2X3QpIHVfaXJvdW5kKHJnYmFbM10gKiAzMjc2Ny4wZikgPDwgMTY7CisKKyAgIC8qIFNOT1JNOCAqLworICAgZHdbMTFdID0gKGludDhfdCkgdV9pcm91bmQocmdiYVswXSAqIDEyNy4wZikgfAorICAgICAgICAgICAgKGludDhfdCkgdV9pcm91bmQocmdiYVsxXSAqIDEyNy4wZikgPDwgOCB8CisgICAgICAgICAgICAoaW50OF90KSB1X2lyb3VuZChyZ2JhWzJdICogMTI3LjBmKSA8PCAxNiB8CisgICAgICAgICAgICAoaW50OF90KSB1X2lyb3VuZChyZ2JhWzNdICogMTI3LjBmKSA8PCAyNDsKKworICAgLyogY2xhbXAgdG8gWzAuMGYsIDEuMGZdICovCisgICByZ2JhWzBdID0gVV9DTEFNUChyZ2JhWzBdLCAwLjBmLCAxLjBmKTsKKyAgIHJnYmFbMV0gPSBVX0NMQU1QKHJnYmFbMV0sIDAuMGYsIDEuMGYpOworICAgcmdiYVsyXSA9IFVfQ0xBTVAocmdiYVsyXSwgMC4wZiwgMS4wZik7CisgICByZ2JhWzNdID0gVV9DTEFNUChyZ2JhWzNdLCAwLjBmLCAxLjBmKTsKKworICAgLyogVU5PUk04ICovCisgICBkd1swXSA9ICh1aW50OF90KSB1X2lyb3VuZChyZ2JhWzBdICogMjU1LjBmKSB8CisgICAgICAgICAgICh1aW50OF90KSB1X2lyb3VuZChyZ2JhWzFdICogMjU1LjBmKSA8PCA4IHwKKyAgICAgICAgICAgKHVpbnQ4X3QpIHVfaXJvdW5kKHJnYmFbMl0gKiAyNTUuMGYpIDw8IDE2IHwKKyAgICAgICAgICAgKHVpbnQ4X3QpIHVfaXJvdW5kKHJnYmFbM10gKiAyNTUuMGYpIDw8IDI0OworCisgICAvKiBVTk9STTE2ICovCisgICBkd1s3XSA9ICh1aW50MTZfdCkgdV9pcm91bmQocmdiYVswXSAqIDY1NTM1LjBmKSB8CisgICAgICAgICAgICh1aW50MTZfdCkgdV9pcm91bmQocmdiYVsxXSAqIDY1NTM1LjBmKSA8PCAxNjsKKyAgIGR3WzhdID0gKHVpbnQxNl90KSB1X2lyb3VuZChyZ2JhWzJdICogNjU1MzUuMGYpIHwKKyAgICAgICAgICAgKHVpbnQxNl90KSB1X2lyb3VuZChyZ2JhWzNdICogNjU1MzUuMGYpIDw8IDE2OworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlcl9pbml0KHN0cnVjdCBpbnRlbF9zYW1wbGVyICpzYW1wbGVyLAorICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvICppbmZvKQoreworICAgaW50IG1pcF9maWx0ZXIsIG1pbl9maWx0ZXIsIG1hZ19maWx0ZXIsIG1heF9hbmlzbzsKKyAgIGludCBsb2RfYmlhcywgbWF4X2xvZCwgbWluX2xvZDsKKyAgIGludCB3cmFwX3MsIHdyYXBfdCwgd3JhcF9yOworICAgdWludDMyX3QgZHcwLCBkdzEsIGR3MzsKKyAgIGZsb2F0IGJvcmRlcl9jb2xvcls0XTsKKworICAgSU5URUxfR1BVX0FTU0VSVChncHUsIDYsIDcuNSk7CisgICBTVEFUSUNfQVNTRVJUKEFSUkFZX1NJWkUoc2FtcGxlci0+Y21kKSA+PSAxNSk7CisKKyAgIG1pcF9maWx0ZXIgPSB0cmFuc2xhdGVfdGV4X21pcG1hcF9tb2RlKGluZm8tPm1pcG1hcE1vZGUpOworICAgbWluX2ZpbHRlciA9IHRyYW5zbGF0ZV90ZXhfZmlsdGVyKGluZm8tPm1pbkZpbHRlcik7CisgICBtYWdfZmlsdGVyID0gdHJhbnNsYXRlX3RleF9maWx0ZXIoaW5mby0+bWFnRmlsdGVyKTsKKworICAgaWYgKGluZm8tPmFuaXNvdHJvcHlFbmFibGUgPT0gVktfRkFMU0UpIHsKKyAgICAgICAgbWF4X2FuaXNvID0gMTsKKyAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmZvLT5tYXhBbmlzb3Ryb3B5ID49IDIgJiYgaW5mby0+bWF4QW5pc290cm9weSA8PSAxNikKKyAgICAgICAgICAgbWF4X2FuaXNvID0gaW5mby0+bWF4QW5pc290cm9weSAvIDIgLSAxOworICAgICAgICBlbHNlIGlmIChpbmZvLT5tYXhBbmlzb3Ryb3B5ID4gMTYpCisgICAgICAgICAgIG1heF9hbmlzbyA9IEdFTjZfQU5JU09SQVRJT18xNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBtYXhfYW5pc28gPSBHRU42X0FOSVNPUkFUSU9fMjsKKyAgIH0KKworICAgLyoKKyAgICAqIEhlcmUgaXMgaG93IHRoZSBoYXJkd2FyZSBjYWxjdWxhdGUgcGVyLXBpeGVsIExPRCwgZnJvbSBteSByZWFkaW5nIG9mIHRoZQorICAgICogUFJNczoKKyAgICAqCisgICAgKiAgMSkgTE9EIGlzIHNldCB0byBsb2cyKHJhdGlvIG9mIHRleGVscyB0byBwaXhlbHMpIGlmIG5vdCBzcGVjaWZpZWQgaW4KKyAgICAqICAgICBvdGhlciB3YXlzLiAgVGhlIG51bWJlciBvZiB0ZXhlbHMgaXMgbWVhc3VyZWQgdXNpbmcgbGV2ZWwKKyAgICAqICAgICBTdXJmTWluTG9kLgorICAgICogIDIpIEJpYXMgaXMgYWRkZWQgdG8gTE9ELgorICAgICogIDMpIExPRCBpcyBjbGFtcGVkIHRvIFtNaW5Mb2QsIE1heExvZF0sIGFuZCB0aGUgY2xhbXBlZCB2YWx1ZSBpcworICAgICogICAgIGNvbXBhcmVkIHdpdGggQmFzZSB0byBkZXRlcm1pbmUgd2hldGhlciBtYWduaWZpY2F0aW9uIG9yCisgICAgKiAgICAgbWluaWZpY2F0aW9uIGlzIG5lZWRlZC4gIChpZiBwcmVjbGFtcCBpcyBkaXNhYmxlZCwgTE9EIGlzIGNvbXBhcmVkCisgICAgKiAgICAgd2l0aCBCYXNlIGJlZm9yZSBjbGFtcGluZykKKyAgICAqICA0KSBJZiBtYWduaWZpY2F0aW9uIGlzIG5lZWRlZCwgb3Igbm8gbWlwbWFwcGluZyBpcyByZXF1ZXN0ZWQsIExPRCBpcworICAgICogICAgIHNldCB0byBmbG9vcihNaW5Mb2QpLgorICAgICogIDUpIExPRCBpcyBjbGFtcGVkIHRvIFswLCBNSVBDbnRdLCBhbmQgU3VyZk1pbkxvZCBpcyBhZGRlZCB0byBMT0QuCisgICAgKgorICAgICogV2l0aCBHYWxsaXVtIGludGVyZmFjZSwgQmFzZSBpcyBhbHdheXMgemVybyBhbmQKKyAgICAqIHBpcGVfc2FtcGxlcl92aWV3Ojp1LnRleC5maXJzdF9sZXZlbCBzcGVjaWZpZXMgU3VyZk1pbkxvZC4KKyAgICAqLworICAgaWYgKGludGVsX2dwdV9nZW4oZ3B1KSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gMjU2LjBmOworCisgICAgICAvKiBbLTE2LjAsIDE2LjApIGluIFM0LjggKi8KKyAgICAgIGxvZF9iaWFzID0gKGludCkKKyAgICAgICAgIChVX0NMQU1QKGluZm8tPm1pcExvZEJpYXMsIC0xNi4wZiwgMTUuOWYpICogc2NhbGUpOworICAgICAgbG9kX2JpYXMgJj0gMHgxZmZmOworCisgICAgICAvKiBbMC4wLCAxNC4wXSBpbiBVNC44ICovCisgICAgICBtYXhfbG9kID0gKGludCkgKFVfQ0xBTVAoaW5mby0+bWF4TG9kLCAwLjBmLCAxNC4wZikgKiBzY2FsZSk7CisgICAgICBtaW5fbG9kID0gKGludCkgKFVfQ0xBTVAoaW5mby0+bWluTG9kLCAwLjBmLCAxNC4wZikgKiBzY2FsZSk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gNjQuMGY7CisKKyAgICAgIC8qIFstMTYuMCwgMTYuMCkgaW4gUzQuNiAqLworICAgICAgbG9kX2JpYXMgPSAoaW50KQorICAgICAgICAgKFVfQ0xBTVAoaW5mby0+bWlwTG9kQmlhcywgLTE2LjBmLCAxNS45ZikgKiBzY2FsZSk7CisgICAgICBsb2RfYmlhcyAmPSAweDdmZjsKKworICAgICAgLyogWzAuMCwgMTMuMF0gaW4gVTQuNiAqLworICAgICAgbWF4X2xvZCA9IChpbnQpIChVX0NMQU1QKGluZm8tPm1heExvZCwgMC4wZiwgMTMuMGYpICogc2NhbGUpOworICAgICAgbWluX2xvZCA9IChpbnQpIChVX0NMQU1QKGluZm8tPm1pbkxvZCwgMC4wZiwgMTMuMGYpICogc2NhbGUpOworICAgfQorCisgICAvKgorICAgICogV2Ugd2FudCBMT0QgdG8gYmUgY2xhbXBlZCB0byBkZXRlcm1pbmUgbWFnbmlmaWNhdGlvbi9taW5pZmljYXRpb24sIGFuZAorICAgICogZ2V0IHNldCB0byB6ZXJvIHdoZW4gaXQgaXMgbWFnbmlmaWNhdGlvbiBvciB3aGVuIG1pcG1hcHBpbmcgaXMgZGlzYWJsZWQuCisgICAgKiBUaGUgaGFyZHdhcmUgd291bGQgc2V0IExPRCB0byBmbG9vcihNaW5Mb2QpIGFuZCB0aGF0IGlzIGEgcHJvYmxlbSB3aGVuCisgICAgKiBNaW5Mb2QgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuMGYuCisgICAgKgorICAgICogV2l0aCBCYXNlIGJlaW5nIHplcm8sIGl0IGlzIGFsd2F5cyBtaW5pZmljYXRpb24gd2hlbiBNaW5Mb2QgaXMgbm9uLXplcm8uCisgICAgKiBUbyBhY2hpZXZlIG91ciBnb2FsLCB3ZSBqdXN0IG5lZWQgdG8gc2V0IE1pbkxvZCB0byB6ZXJvIGFuZCBzZXQKKyAgICAqIE1hZ0ZpbHRlciB0byBNaW5GaWx0ZXIgd2hlbiBtaXBtYXBwaW5nIGlzIGRpc2FibGVkLgorICAgICovCisKKyAgIC8qIGRldGVybWluZSB3cmFwIHMvdC9yICovCisgICB3cmFwX3MgPSB0cmFuc2xhdGVfdGV4X2FkZHIoaW5mby0+YWRkcmVzc01vZGVVKTsKKyAgIHdyYXBfdCA9IHRyYW5zbGF0ZV90ZXhfYWRkcihpbmZvLT5hZGRyZXNzTW9kZVYpOworICAgd3JhcF9yID0gdHJhbnNsYXRlX3RleF9hZGRyKGluZm8tPmFkZHJlc3NNb2RlVyk7CisKKyAgIHRyYW5zbGF0ZV9ib3JkZXJfY29sb3IoaW5mby0+Ym9yZGVyQ29sb3IsIGJvcmRlcl9jb2xvcik7CisKKyAgIGlmIChpbnRlbF9ncHVfZ2VuKGdwdSkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICBkdzAgPSAxIDw8IDI4IHwKKyAgICAgICAgICAgIG1pcF9maWx0ZXIgPDwgMjAgfAorICAgICAgICAgICAgbG9kX2JpYXMgPDwgMTsKKworICAgICAgaWYgKGluZm8tPm1heEFuaXNvdHJvcHkgPiAxICYmIGluZm8tPmFuaXNvdHJvcHlFbmFibGUgPT0gVktfVFJVRSkgeworICAgICAgICAgZHcwIHw9IEdFTjZfTUFQRklMVEVSX0FOSVNPVFJPUElDIDw8IDE3IHwKKyAgICAgICAgICAgICAgICBHRU42X01BUEZJTFRFUl9BTklTT1RST1BJQyA8PCAxNCB8CisgICAgICAgICAgICAgICAgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBkdzAgfD0gbWFnX2ZpbHRlciA8PCAxNyB8CisgICAgICAgICAgICAgICAgbWluX2ZpbHRlciA8PCAxNDsKKyAgICAgIH0KKworICAgICAgZHcxID0gbWluX2xvZCA8PCAyMCB8CisgICAgICAgICAgICBtYXhfbG9kIDw8IDg7CisKKyAgICAgIGR3MSB8PSB0cmFuc2xhdGVfY29tcGFyZV9mdW5jKGluZm8tPmNvbXBhcmVPcCkgPDwgMTsKKworICAgICAgZHczID0gbWF4X2FuaXNvIDw8IDE5OworCisgICAgICAvKiByb3VuZCB0aGUgY29vcmRpbmF0ZXMgZm9yIGxpbmVhciBmaWx0ZXJpbmcgKi8KKyAgICAgIGlmIChtaW5fZmlsdGVyICE9IEdFTjZfTUFQRklMVEVSX05FQVJFU1QpIHsKKyAgICAgICAgIGR3MyB8PSAoR0VONl9TQU1QTEVSX0RXM19VX01JTl9ST1VORCB8CisgICAgICAgICAgICAgICAgIEdFTjZfU0FNUExFUl9EVzNfVl9NSU5fUk9VTkQgfAorICAgICAgICAgICAgICAgICBHRU42X1NBTVBMRVJfRFczX1JfTUlOX1JPVU5EKTsKKyAgICAgIH0KKyAgICAgIGlmIChtYWdfZmlsdGVyICE9IEdFTjZfTUFQRklMVEVSX05FQVJFU1QpIHsKKyAgICAgICAgIGR3MyB8PSAoR0VONl9TQU1QTEVSX0RXM19VX01BR19ST1VORCB8CisgICAgICAgICAgICAgICAgIEdFTjZfU0FNUExFUl9EVzNfVl9NQUdfUk9VTkQgfAorICAgICAgICAgICAgICAgICBHRU42X1NBTVBMRVJfRFczX1JfTUFHX1JPVU5EKTsKKyAgICAgIH0KKworICAgICAgZHczIHw9IHdyYXBfcyA8PCA2IHwKKyAgICAgICAgICAgICB3cmFwX3QgPDwgMyB8CisgICAgICAgICAgICAgd3JhcF9yOworCisgICAgICBpZiAoaW5mby0+dW5ub3JtYWxpemVkQ29vcmRpbmF0ZXMpCisgICAgICAgICAgZHczIHw9IEdFTjdfU0FNUExFUl9EVzNfTk9OX05PUk1BTElaRURfQ09PUkQ7CisKKyAgICAgIHNhbXBsZXItPmNtZFswXSA9IGR3MDsKKyAgICAgIHNhbXBsZXItPmNtZFsxXSA9IGR3MTsKKyAgICAgIHNhbXBsZXItPmNtZFsyXSA9IGR3MzsKKworICAgICAgbWVtY3B5KCZzYW1wbGVyLT5jbWRbM10sICZib3JkZXJfY29sb3IsIHNpemVvZihib3JkZXJfY29sb3IpKTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgZHcwID0gMSA8PCAyOCB8CisgICAgICAgICAgICBtaXBfZmlsdGVyIDw8IDIwIHwKKyAgICAgICAgICAgIGxvZF9iaWFzIDw8IDM7CisKKyAgICAgIGR3MCB8PSB0cmFuc2xhdGVfY29tcGFyZV9mdW5jKGluZm8tPmNvbXBhcmVPcCk7CisKKyAgICAgIGlmIChpbmZvLT5tYXhBbmlzb3Ryb3B5ID4gMSAmJiBpbmZvLT5hbmlzb3Ryb3B5RW5hYmxlID09IFZLX1RSVUUpIHsKKyAgICAgICAgIGR3MCB8PSBHRU42X01BUEZJTFRFUl9BTklTT1RST1BJQyA8PCAxNyB8CisgICAgICAgICAgICAgICAgR0VONl9NQVBGSUxURVJfQU5JU09UUk9QSUMgPDwgMTQ7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIGR3MCB8PSAobWluX2ZpbHRlciAhPSBtYWdfZmlsdGVyKSA8PCAyNyB8CisgICAgICAgICAgICAgICAgbWFnX2ZpbHRlciA8PCAxNyB8CisgICAgICAgICAgICAgICAgbWluX2ZpbHRlciA8PCAxNDsKKyAgICAgIH0KKworICAgICAgZHcxID0gbWluX2xvZCA8PCAyMiB8CisgICAgICAgICAgICBtYXhfbG9kIDw8IDEyOworCisgICAgICBkdzEgfD0gd3JhcF9zIDw8IDYgfAorICAgICAgICAgICAgIHdyYXBfdCA8PCAzIHwKKyAgICAgICAgICAgICB3cmFwX3I7CisKKyAgICAgIGR3MyA9IG1heF9hbmlzbyA8PCAxOTsKKworICAgICAgLyogcm91bmQgdGhlIGNvb3JkaW5hdGVzIGZvciBsaW5lYXIgZmlsdGVyaW5nICovCisgICAgICBpZiAobWluX2ZpbHRlciAhPSBHRU42X01BUEZJTFRFUl9ORUFSRVNUKSB7CisgICAgICAgICBkdzMgfD0gKEdFTjZfU0FNUExFUl9EVzNfVV9NSU5fUk9VTkQgfAorICAgICAgICAgICAgICAgICBHRU42X1NBTVBMRVJfRFczX1ZfTUlOX1JPVU5EIHwKKyAgICAgICAgICAgICAgICAgR0VONl9TQU1QTEVSX0RXM19SX01JTl9ST1VORCk7CisgICAgICB9CisgICAgICBpZiAobWFnX2ZpbHRlciAhPSBHRU42X01BUEZJTFRFUl9ORUFSRVNUKSB7CisgICAgICAgICBkdzMgfD0gKEdFTjZfU0FNUExFUl9EVzNfVV9NQUdfUk9VTkQgfAorICAgICAgICAgICAgICAgICBHRU42X1NBTVBMRVJfRFczX1ZfTUFHX1JPVU5EIHwKKyAgICAgICAgICAgICAgICAgR0VONl9TQU1QTEVSX0RXM19SX01BR19ST1VORCk7CisgICAgICB9CisKKyAgICAgIGlmIChpbmZvLT51bm5vcm1hbGl6ZWRDb29yZGluYXRlcykKKyAgICAgICAgICBkdzMgfD0gR0VONl9TQU1QTEVSX0RXM19OT05fTk9STUFMSVpFRF9DT09SRDsKKworICAgICAgc2FtcGxlci0+Y21kWzBdID0gZHcwOworICAgICAgc2FtcGxlci0+Y21kWzFdID0gZHcxOworICAgICAgc2FtcGxlci0+Y21kWzJdID0gZHczOworCisgICAgICBzYW1wbGVyX2JvcmRlcl9jb2xvcl9zdGF0ZV9nZW42KGdwdSwgYm9yZGVyX2NvbG9yLCAmc2FtcGxlci0+Y21kWzNdKTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgc2FtcGxlcl9kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqc2FtcGxlciA9IGludGVsX3NhbXBsZXJfZnJvbV9vYmoob2JqKTsKKworICAgIGludGVsX3NhbXBsZXJfZGVzdHJveShzYW1wbGVyKTsKK30KKworVmtSZXN1bHQgaW50ZWxfc2FtcGxlcl9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqKnNhbXBsZXJfcmV0KQoreworICAgIHN0cnVjdCBpbnRlbF9zYW1wbGVyICpzYW1wbGVyOworCisgICAgc2FtcGxlciA9IChzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqc2FtcGxlciksIGRldi0+YmFzZS5kYmcsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVCwgaW5mbywgMCk7CisgICAgaWYgKCFzYW1wbGVyKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgc2FtcGxlci0+b2JqLmRlc3Ryb3kgPSBzYW1wbGVyX2Rlc3Ryb3k7CisKKyAgICBzYW1wbGVyX2luaXQoc2FtcGxlciwgZGV2LT5ncHUsIGluZm8pOworCisgICAgKnNhbXBsZXJfcmV0ID0gc2FtcGxlcjsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX3NhbXBsZXJfZGVzdHJveShzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqc2FtcGxlcikKK3sKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJnNhbXBsZXItPm9iai5iYXNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtTYW1wbGVyQ3JlYXRlSW5mbyogICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2FtcGxlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVyKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIGludGVsX3NhbXBsZXJfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IGludGVsX3NhbXBsZXIgKiopIHBTYW1wbGVyKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U2FtcGxlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCisKKyB7CisgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKHNhbXBsZXIpOworCisgICAgb2JqLT5kZXN0cm95KG9iaik7CisgfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL3NhbXBsZXIuaCBiL2ljZC9pbnRlbC9zYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMzg4MgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9zYW1wbGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICoKKyAqLworCisjaWZuZGVmIFNBTVBMRVJfSAorI2RlZmluZSBTQU1QTEVSX0gKKworI2luY2x1ZGUgImludGVsLmgiCisjaW5jbHVkZSAib2JqLmgiCisKK3N0cnVjdCBpbnRlbF9zYW1wbGVyIHsKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqIG9iajsKKworICAgIC8qCisgICAgICogU0FNUExFUl9TVEFURQorICAgICAqIFNBTVBMRVJfQk9SREVSX0NPTE9SX1NUQVRFCisgICAgICovCisgICAgdWludDMyX3QgY21kWzE1XTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX3NhbXBsZXIgKmludGVsX3NhbXBsZXIoVmtTYW1wbGVyIHNhbXBsZXIpCit7CisgICAgcmV0dXJuICooc3RydWN0IGludGVsX3NhbXBsZXIgKiopICZzYW1wbGVyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9zYW1wbGVyICppbnRlbF9zYW1wbGVyX2Zyb21fb2JqKHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBpbnRlbF9zYW1wbGVyICopIG9iajsKK30KKworVmtSZXN1bHQgaW50ZWxfc2FtcGxlcl9jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfc2FtcGxlciAqKnNhbXBsZXJfcmV0KTsKK3ZvaWQgaW50ZWxfc2FtcGxlcl9kZXN0cm95KHN0cnVjdCBpbnRlbF9zYW1wbGVyICpzYW1wbGVyKTsKKworI2VuZGlmIC8qIFNBTVBMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL3NoYWRlci5jIGIvaWNkL2ludGVsL3NoYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODY2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvc2hhZGVyLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hyaXMgRm9yYmVzIDxjaHJpc2ZAaWp3LmNvLm56PgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgInNoYWRlci5oIgorI2luY2x1ZGUgImNvbXBpbGVyL3NoYWRlci9jb21waWxlcl9pbnRlcmZhY2UuaCIKKworc3RhdGljIHZvaWQgc2hhZGVyX21vZHVsZV9kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSAqc20gPSBpbnRlbF9zaGFkZXJfbW9kdWxlX2Zyb21fb2JqKG9iaik7CisKKyAgICBpZiAoc20tPnZzKQorICAgICAgICBzaGFkZXJfZGVzdHJveV9pcihzbS0+dnMpOworICAgIGlmIChzbS0+dGNzKQorICAgICAgICBzaGFkZXJfZGVzdHJveV9pcihzbS0+dGNzKTsKKyAgICBpZiAoc20tPnRlcykKKyAgICAgICAgc2hhZGVyX2Rlc3Ryb3lfaXIoc20tPnRlcyk7CisgICAgaWYgKHNtLT5ncykKKyAgICAgICAgc2hhZGVyX2Rlc3Ryb3lfaXIoc20tPmdzKTsKKyAgICBpZiAoc20tPmZzKQorICAgICAgICBzaGFkZXJfZGVzdHJveV9pcihzbS0+ZnMpOworICAgIGlmIChzbS0+Y3MpCisgICAgICAgIHNoYWRlcl9kZXN0cm95X2lyKHNtLT5jcyk7CisKKyAgICBmcmVlKHNtLT5jb2RlKTsKKyAgICBzbS0+Y29kZSA9IDA7CisKKyAgICBpbnRlbF9iYXNlX2Rlc3Ryb3koJnNtLT5vYmouYmFzZSk7Cit9CisKK2NvbnN0IHN0cnVjdCBpbnRlbF9pciAqaW50ZWxfc2hhZGVyX21vZHVsZV9nZXRfaXIoc3RydWN0IGludGVsX3NoYWRlcl9tb2R1bGUgKnNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NoYWRlclN0YWdlRmxhZ0JpdHMgc3RhZ2UpCit7CisgICAgc3RydWN0IGludGVsX2lyICoqaXI7CisKKyAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfVkVSVEVYX0JJVDoKKyAgICAgICAgaXIgPSAmc20tPnZzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9URVNTRUxMQVRJT05fQ09OVFJPTF9CSVQ6CisgICAgICAgIGlyID0gJnNtLT50Y3M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX1RFU1NFTExBVElPTl9FVkFMVUFUSU9OX0JJVDoKKyAgICAgICAgaXIgPSAmc20tPnRlczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS19TSEFERVJfU1RBR0VfR0VPTUVUUllfQklUOgorICAgICAgICBpciA9ICZzbS0+Z3M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVDoKKyAgICAgICAgaXIgPSAmc20tPmZzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1NIQURFUl9TVEFHRV9DT01QVVRFX0JJVDoKKyAgICAgICAgaXIgPSAmc20tPmNzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJ1bnN1cHBvcnRlZCBzaGFkZXIgc3RhZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNoYWRlcl9jcmVhdGVfaXJfd2l0aF9sb2NrKHNtLT5ncHUsIHNtLT5jb2RlLCBzbS0+Y29kZV9zaXplLCBzdGFnZSwgaXIpOworCisgICAgcmV0dXJuICppcjsKK30KKworc3RhdGljIFZrUmVzdWx0IHNoYWRlcl9tb2R1bGVfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX3NoYWRlcl9tb2R1bGUgKipzbV9yZXQpCit7CisgICAgc3RydWN0IGludGVsX3NoYWRlcl9tb2R1bGUgKnNtOworCisgICAgc20gPSAoc3RydWN0IGludGVsX3NoYWRlcl9tb2R1bGUgKikgaW50ZWxfYmFzZV9jcmVhdGUoJmRldi0+YmFzZS5oYW5kbGUsCisgICAgICAgICAgICBzaXplb2YoKnNtKSwgZGV2LT5iYXNlLmRiZywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NIQURFUl9NT0RVTEVfRVhULCBpbmZvLCAwKTsKKyAgICBpZiAoIXNtKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgc20tPmdwdSA9IGRldi0+Z3B1OworICAgIHNtLT5jb2RlX3NpemUgPSBpbmZvLT5jb2RlU2l6ZTsKKyAgICBzbS0+Y29kZSA9IG1hbGxvYyhpbmZvLT5jb2RlU2l6ZSk7CisgICAgaWYgKCFzbS0+Y29kZSkgeworICAgICAgICBzaGFkZXJfbW9kdWxlX2Rlc3Ryb3koJnNtLT5vYmopOworICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIH0KKworICAgIG1lbWNweShzbS0+Y29kZSwgaW5mby0+cENvZGUsIGluZm8tPmNvZGVTaXplKTsKKyAgICBzbS0+b2JqLmRlc3Ryb3kgPSBzaGFkZXJfbW9kdWxlX2Rlc3Ryb3k7CisKKyAgICAqc21fcmV0ID0gc207CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2hhZGVyTW9kdWxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyogICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTaGFkZXJNb2R1bGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGVyTW9kdWxlKQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIHNoYWRlcl9tb2R1bGVfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sIChzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSAqKikgcFNoYWRlck1vZHVsZSk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU2hhZGVyTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJNb2R1bGUsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCisKKyB7CisgICAgc3RydWN0IGludGVsX29iaiAqb2JqID0gaW50ZWxfb2JqKHNoYWRlck1vZHVsZSk7CisKKyAgICBvYmotPmRlc3Ryb3kob2JqKTsKKyB9CmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvc2hhZGVyLmggYi9pY2QvaW50ZWwvc2hhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5YzMyZgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC9zaGFkZXIuaApAQCAtMCwwICsxLDYxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENocmlzIEZvcmJlcyA8Y2hyaXNmQGlqdy5jby5uej4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBTSEFERVJfSAorI2RlZmluZSBTSEFERVJfSAorCisjaW5jbHVkZSAiaW50ZWwuaCIKKyNpbmNsdWRlICJvYmouaCIKKworc3RydWN0IGludGVsX2lyOworCitzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSB7CisgICAgc3RydWN0IGludGVsX29iaiBvYmo7CisKKyAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHU7CisgICAgLyogY29udGVudCBpcyBqdXN0IGEgY29weSBvZiB0aGUgU1BJUlYgaW1hZ2UgKi8KKyAgICB1aW50MzJfdCBjb2RlX3NpemU7CisgICAgdm9pZCAqY29kZTsKKworICAgIC8qIHNpbXBsZSBjYWNoZSAqLworICAgIHN0cnVjdCBpbnRlbF9pciAqdnM7CisgICAgc3RydWN0IGludGVsX2lyICp0Y3M7CisgICAgc3RydWN0IGludGVsX2lyICp0ZXM7CisgICAgc3RydWN0IGludGVsX2lyICpnczsKKyAgICBzdHJ1Y3QgaW50ZWxfaXIgKmZzOworICAgIHN0cnVjdCBpbnRlbF9pciAqY3M7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9zaGFkZXJfbW9kdWxlICppbnRlbF9zaGFkZXJfbW9kdWxlKFZrU2hhZGVyTW9kdWxlIHNoYWRlck1vZHVsZSkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSAqKikgJnNoYWRlck1vZHVsZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSAqaW50ZWxfc2hhZGVyX21vZHVsZV9mcm9tX29iaihzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSAqKW9iajsKK30KKworY29uc3Qgc3RydWN0IGludGVsX2lyICppbnRlbF9zaGFkZXJfbW9kdWxlX2dldF9pcihzdHJ1Y3QgaW50ZWxfc2hhZGVyX21vZHVsZSAqc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrU2hhZGVyU3RhZ2VGbGFnQml0cyBzdGFnZSk7CisKKyNlbmRpZiAvKiBTSEFERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL3N0YXRlLmMgYi9pY2QvaW50ZWwvc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZlNmFkCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL3N0YXRlLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZ2VuaHcvZ2VuaHcuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgImNtZC5oIgorCit2b2lkIGludGVsX3NldF92aWV3cG9ydChzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIHVpbnQzMl90IGZpcnN0LCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtWaWV3cG9ydCAqdmlld3BvcnRzKQoreworICAgIGNtZC0+YmluZC5zdGF0ZS52aWV3cG9ydC52aWV3cG9ydF9jb3VudCA9IGNvdW50OworICAgIG1lbWNweShjbWQtPmJpbmQuc3RhdGUudmlld3BvcnQudmlld3BvcnRzICsgZmlyc3QsIHZpZXdwb3J0cywgY291bnQgKiBzaXplb2YoVmtWaWV3cG9ydCkpOworfQorCit2b2lkIGludGVsX3NldF9zY2lzc29yKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgdWludDMyX3QgZmlyc3QsIHVpbnQzMl90IGNvdW50LCBjb25zdCBWa1JlY3QyRCAqc2Npc3NvcnMpCit7CisgICAgY21kLT5iaW5kLnN0YXRlLnZpZXdwb3J0LnNjaXNzb3JfY291bnQgPSBjb3VudDsKKyAgICBtZW1jcHkoY21kLT5iaW5kLnN0YXRlLnZpZXdwb3J0LnNjaXNzb3JzICsgZmlyc3QsIHNjaXNzb3JzLCBjb3VudCAqIHNpemVvZihWa1JlY3QyRCkpOworfQorCit2b2lkIGludGVsX3NldF9saW5lX3dpZHRoKHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgZmxvYXQgbGluZV93aWR0aCkKK3sKKyAgICBjbWQtPmJpbmQuc3RhdGUubGluZV93aWR0aC5saW5lX3dpZHRoID0gbGluZV93aWR0aDsKK30KKwordm9pZCBpbnRlbF9zZXRfZGVwdGhfYmlhcygKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICAgICAgICAgICAgICAgICAgICpjbWQsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ2xhbXAsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpCit7CisgICAgY21kLT5iaW5kLnN0YXRlLmRlcHRoX2JpYXMuZGVwdGhfYmlhcyA9IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yOworICAgIGNtZC0+YmluZC5zdGF0ZS5kZXB0aF9iaWFzLmRlcHRoX2JpYXNfY2xhbXAgPSBkZXB0aEJpYXNDbGFtcDsKKyAgICBjbWQtPmJpbmQuc3RhdGUuZGVwdGhfYmlhcy5zbG9wZV9zY2FsZWRfZGVwdGhfYmlhcyA9IGRlcHRoQmlhc1Nsb3BlRmFjdG9yOworfQorCit2b2lkIGludGVsX3NldF9ibGVuZF9jb25zdGFudHMoCisgICAgc3RydWN0IGludGVsX2NtZCAgICAgICAgICAgICAgICAgICAqY21kLAorICAgIGNvbnN0IGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c1s0XSkKK3sKKyAgICBjbWQtPmJpbmQuc3RhdGUuYmxlbmQuYmxlbmRfY29uc3RbMF0gPSBjb25zdGFudHNbMF07CisgICAgY21kLT5iaW5kLnN0YXRlLmJsZW5kLmJsZW5kX2NvbnN0WzFdID0gY29uc3RhbnRzWzFdOworICAgIGNtZC0+YmluZC5zdGF0ZS5ibGVuZC5ibGVuZF9jb25zdFsyXSA9IGNvbnN0YW50c1syXTsKKyAgICBjbWQtPmJpbmQuc3RhdGUuYmxlbmQuYmxlbmRfY29uc3RbM10gPSBjb25zdGFudHNbM107Cit9CisKK3ZvaWQgaW50ZWxfc2V0X2RlcHRoX2JvdW5kcygKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICAgICAgICAgICAgICAgICAgICpjbWQsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGVwdGhCb3VuZHMsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGVwdGhCb3VuZHMpCit7CisgICAgLyoKKyAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzU5OgorICAgICAqCisgICAgICogICAgICJJZiB0aGUgRGVwdGggQnVmZmVyIGlzIGVpdGhlciB1bmRlZmluZWQgb3IgZG9lcyBub3QgaGF2ZSBhIHN1cmZhY2UKKyAgICAgKiAgICAgIGZvcm1hdCBvZiBEMzJfRkxPQVRfUzhYMjRfVUlOVCBvciBEMjRfVU5PUk1fUzhfVUlOVCBhbmQgc2VwYXJhdGUKKyAgICAgKiAgICAgIHN0ZW5jaWwgYnVmZmVyIGlzIGRpc2FibGVkLCBTdGVuY2lsIFRlc3QgRW5hYmxlIG11c3QgYmUgRElTQUJMRUQiCisgICAgICoKKyAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzcwOgorICAgICAqCisgICAgICogICAgICJUaGlzIGZpZWxkIChTdGVuY2lsIFRlc3QgRW5hYmxlKSBjYW5ub3QgYmUgZW5hYmxlZCBpZgorICAgICAqICAgICAgU3VyZmFjZSBGb3JtYXQgaW4gM0RTVEFURV9ERVBUSF9CVUZGRVIgaXMgc2V0IHRvIEQxNl9VTk9STS4iCisgICAgICoKKyAgICAgKiBUT0RPIFdlIGRvIG5vdCBjaGVjayB0aGVzZSB5ZXQuCisgICAgICovCisgICAgY21kLT5iaW5kLnN0YXRlLmRlcHRoX2JvdW5kcy5taW5fZGVwdGhfYm91bmRzID0gbWluRGVwdGhCb3VuZHM7CisgICAgY21kLT5iaW5kLnN0YXRlLmRlcHRoX2JvdW5kcy5tYXhfZGVwdGhfYm91bmRzID0gbWF4RGVwdGhCb3VuZHM7Cit9CisKK3ZvaWQgaW50ZWxfc2V0X3N0ZW5jaWxfY29tcGFyZV9tYXNrKAorICAgIHN0cnVjdCBpbnRlbF9jbWQgICAgICAgICAgICAgICAgICAgKmNtZCwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFzaykKK3sKKyAgICAvKiBUT0RPOiBlbmFibGUgYmFjayBmYWNpbmcgc3RlbmNpbCBzdGF0ZSAqLworICAgIC8qIFNvbWUgcGx1bWJpbmcgbmVlZHMgdG8gYmUgZG9uZSBpZiB3ZSB3YW50IHRvIHN1cHBvcnQgaW5mb19iYWNrLgorICAgICAqIEluIHRoZSBtZWFudGltZSwgY2F0Y2ggdGhhdCBiYWNrIGZhY2luZyBpbmZvIGhhcyBiZWVuIHN1Ym1pdHRlZC4gKi8KKworICAgIC8qCisgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDM1OToKKyAgICAgKgorICAgICAqICAgICAiSWYgdGhlIERlcHRoIEJ1ZmZlciBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGRvZXMgbm90IGhhdmUgYSBzdXJmYWNlCisgICAgICogICAgICBmb3JtYXQgb2YgRDMyX0ZMT0FUX1M4WDI0X1VJTlQgb3IgRDI0X1VOT1JNX1M4X1VJTlQgYW5kIHNlcGFyYXRlCisgICAgICogICAgICBzdGVuY2lsIGJ1ZmZlciBpcyBkaXNhYmxlZCwgU3RlbmNpbCBUZXN0IEVuYWJsZSBtdXN0IGJlIERJU0FCTEVEIgorICAgICAqCisgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDIgcGFydCAxLCBwYWdlIDM3MDoKKyAgICAgKgorICAgICAqICAgICAiVGhpcyBmaWVsZCAoU3RlbmNpbCBUZXN0IEVuYWJsZSkgY2Fubm90IGJlIGVuYWJsZWQgaWYKKyAgICAgKiAgICAgIFN1cmZhY2UgRm9ybWF0IGluIDNEU1RBVEVfREVQVEhfQlVGRkVSIGlzIHNldCB0byBEMTZfVU5PUk0uIgorICAgICAqCisgICAgICogVE9ETyBXZSBkbyBub3QgY2hlY2sgdGhlc2UgeWV0LgorICAgICAqLworICAgIGlmIChmYWNlTWFzayAmIFZLX1NURU5DSUxfRkFDRV9GUk9OVF9CSVQpIHsKKyAgICAgICAgY21kLT5iaW5kLnN0YXRlLnN0ZW5jaWwuZnJvbnQuc3RlbmNpbF9jb21wYXJlX21hc2sgPSBjb21wYXJlTWFzazsKKyAgICB9CisgICAgaWYgKGZhY2VNYXNrICYgVktfU1RFTkNJTF9GQUNFX0JBQ0tfQklUKSB7CisgICAgICAgIGNtZC0+YmluZC5zdGF0ZS5zdGVuY2lsLmJhY2suc3RlbmNpbF9jb21wYXJlX21hc2sgPSBjb21wYXJlTWFzazsKKyAgICB9Cit9CisKK3ZvaWQgaW50ZWxfc2V0X3N0ZW5jaWxfd3JpdGVfbWFzaygKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICAgICAgICAgICAgICAgICAgICpjbWQsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKQoreworICAgIGlmIChmYWNlTWFzayAmIFZLX1NURU5DSUxfRkFDRV9GUk9OVF9CSVQpIHsKKyAgICAgICAgY21kLT5iaW5kLnN0YXRlLnN0ZW5jaWwuZnJvbnQuc3RlbmNpbF93cml0ZV9tYXNrID0gd3JpdGVNYXNrOworICAgIH0KKyAgICBpZiAoZmFjZU1hc2sgJiBWS19TVEVOQ0lMX0ZBQ0VfQkFDS19CSVQpIHsKKyAgICAgICAgY21kLT5iaW5kLnN0YXRlLnN0ZW5jaWwuYmFjay5zdGVuY2lsX3dyaXRlX21hc2sgPSB3cml0ZU1hc2s7CisgICAgfQorfQorCit2b2lkIGludGVsX3NldF9zdGVuY2lsX3JlZmVyZW5jZSgKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICAgICAgICAgICAgICAgICAgICpjbWQsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlKQoreworICAgIGlmIChmYWNlTWFzayAmIFZLX1NURU5DSUxfRkFDRV9GUk9OVF9CSVQpIHsKKyAgICAgICAgY21kLT5iaW5kLnN0YXRlLnN0ZW5jaWwuZnJvbnQuc3RlbmNpbF9yZWZlcmVuY2UgPSByZWZlcmVuY2U7CisgICAgfQorICAgIGlmIChmYWNlTWFzayAmIFZLX1NURU5DSUxfRkFDRV9CQUNLX0JJVCkgeworICAgICAgICBjbWQtPmJpbmQuc3RhdGUuc3RlbmNpbC5iYWNrLnN0ZW5jaWxfcmVmZXJlbmNlID0gcmVmZXJlbmNlOworICAgIH0KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRWaWV3cG9ydCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3cG9ydCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRDb3VudCwKKyAgICBjb25zdCBWa1ZpZXdwb3J0KiAgICAgICAgICAgICAgICAgICAgICAgcFZpZXdwb3J0cykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBpZiAoY21kLT5iaW5kLnN0YXRlLnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfVklFV1BPUlQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludGVsX3NldF92aWV3cG9ydChjbWQsIGZpcnN0Vmlld3BvcnQsIHZpZXdwb3J0Q291bnQsIHBWaWV3cG9ydHMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFNjaXNzb3IoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2Npc3NvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Npc3NvckNvdW50LAorICAgIGNvbnN0IFZrUmVjdDJEKiAgICAgICAgICAgICAgICAgICAgICAgICBwU2Npc3NvcnMpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICAgaWYgKGNtZC0+YmluZC5zdGF0ZS51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NDSVNTT1IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludGVsX3NldF9zY2lzc29yKGNtZCwgZmlyc3RTY2lzc29yLCBzY2lzc29yQ291bnQsIHBTY2lzc29ycyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0TGluZVdpZHRoKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3dpZHRoKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKworICAgIGlmIChjbWQtPmJpbmQuc3RhdGUudXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19MSU5FX1dJRFRIKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjbWQtPmJpbmQuc3RhdGUubGluZV93aWR0aC5saW5lX3dpZHRoID0gbGluZV93aWR0aDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJpYXMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzQ2xhbXAsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhCaWFzU2xvcGVGYWN0b3IpCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICAgaWYgKGNtZC0+YmluZC5zdGF0ZS51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX0RFUFRIX0JJQVMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludGVsX3NldF9kZXB0aF9iaWFzKGNtZCwgZGVwdGhCaWFzQ29uc3RhbnRGYWN0b3IsIGRlcHRoQmlhc0NsYW1wLCBkZXB0aEJpYXNTbG9wZUZhY3Rvcik7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0QmxlbmRDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgY29uc3QgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRDb25zdGFudHNbNF0pCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICAgaWYgKGNtZC0+YmluZC5zdGF0ZS51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX0JMRU5EX0NPTlNUQU5UUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50ZWxfc2V0X2JsZW5kX2NvbnN0YW50cyhjbWQsIGJsZW5kQ29uc3RhbnRzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJvdW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EZXB0aEJvdW5kcywKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEZXB0aEJvdW5kcykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBpZiAoY21kLT5iaW5kLnN0YXRlLnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfREVQVEhfQk9VTkRTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnRlbF9zZXRfZGVwdGhfYm91bmRzKGNtZCwgbWluRGVwdGhCb3VuZHMsIG1heERlcHRoQm91bmRzKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hc2spCit7CisgICAgc3RydWN0IGludGVsX2NtZCAqY21kID0gaW50ZWxfY21kKGNvbW1hbmRCdWZmZXIpOworCisgICAgaWYgKGNtZC0+YmluZC5zdGF0ZS51c2VfcGlwZWxpbmVfZHluYW1pY19zdGF0ZSAmIElOVEVMX1VTRV9QSVBFTElORV9EWU5BTUlDX1NURU5DSUxfQ09NUEFSRV9NQVNLKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnRlbF9zZXRfc3RlbmNpbF9jb21wYXJlX21hc2soY21kLCBmYWNlTWFzaywgY29tcGFyZU1hc2spOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2soCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKQoreworICAgIHN0cnVjdCBpbnRlbF9jbWQgKmNtZCA9IGludGVsX2NtZChjb21tYW5kQnVmZmVyKTsKKworICAgIGlmIChjbWQtPmJpbmQuc3RhdGUudXNlX3BpcGVsaW5lX2R5bmFtaWNfc3RhdGUgJiBJTlRFTF9VU0VfUElQRUxJTkVfRFlOQU1JQ19TVEVOQ0lMX1dSSVRFX01BU0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludGVsX3NldF9zdGVuY2lsX3dyaXRlX21hc2soY21kLCBmYWNlTWFzaywgd3JpdGVNYXNrKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICpjbWQgPSBpbnRlbF9jbWQoY29tbWFuZEJ1ZmZlcik7CisKKyAgICBpZiAoY21kLT5iaW5kLnN0YXRlLnVzZV9waXBlbGluZV9keW5hbWljX3N0YXRlICYgSU5URUxfVVNFX1BJUEVMSU5FX0RZTkFNSUNfU1RFTkNJTF9SRUZFUkVOQ0UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludGVsX3NldF9zdGVuY2lsX3JlZmVyZW5jZShjbWQsIGZhY2VNYXNrLCByZWZlcmVuY2UpOworfQpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL3N0YXRlLmggYi9pY2QvaW50ZWwvc3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZiOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL3N0YXRlLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZhZmZlQGdtYWlsLmNvbT4KKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICoKKyAqLworCisjaWZuZGVmIFNUQVRFX0gKKyNkZWZpbmUgU1RBVEVfSAorCisjaW5jbHVkZSAiaW50ZWwuaCIKKyNpbmNsdWRlICJvYmouaCIKKworc3RydWN0IGludGVsX2R5bmFtaWNfdmlld3BvcnQgeworICAgIHVpbnQzMl90IGZpcnN0X3ZpZXdwb3J0OworICAgIHVpbnQzMl90IGZpcnN0X3NjaXNzb3I7CisgICAgdWludDMyX3Qgdmlld3BvcnRfY291bnQ7CisgICAgdWludDMyX3Qgc2Npc3Nvcl9jb3VudDsKKyAgICBWa1ZpZXdwb3J0IHZpZXdwb3J0c1tJTlRFTF9NQVhfVklFV1BPUlRTXTsKKyAgICBWa1JlY3QyRCBzY2lzc29yc1tJTlRFTF9NQVhfVklFV1BPUlRTXTsKKyAgICAvKiBTRl9DTElQX1ZJRVdQT1JUcywgQ0NfVklFV1BPUlRzLCBhbmQgU0NJU1NPUl9SRUNUcyAqLworICAgIHVpbnQzMl90IGNtZFtJTlRFTF9NQVhfVklFV1BPUlRTICogKDE2IC8qIHZpZXdwb3J0ICovICsgMiAvKiBjYyAqLyArIDIgLyogc2Npc3NvciAqLyldOworICAgIHVpbnQzMl90IGNtZF9sZW47CisgICAgdWludDMyX3QgY21kX2NsaXBfcG9zOworICAgIHVpbnQzMl90IGNtZF9jY19wb3M7CisgICAgdWludDMyX3QgY21kX3NjaXNzb3JfcmVjdF9wb3M7Cit9OworCitzdHJ1Y3QgaW50ZWxfZHluYW1pY19saW5lX3dpZHRoIHsKKyAgICBmbG9hdCBsaW5lX3dpZHRoOworfTsKKworc3RydWN0IGludGVsX2R5bmFtaWNfZGVwdGhfYmlhcyB7CisgICAgZmxvYXQgZGVwdGhfYmlhczsKKyAgICBmbG9hdCBkZXB0aF9iaWFzX2NsYW1wOworICAgIGZsb2F0IHNsb3BlX3NjYWxlZF9kZXB0aF9iaWFzOworfTsKKworc3RydWN0IGludGVsX2R5bmFtaWNfYmxlbmQgeworICAgIGZsb2F0IGJsZW5kX2NvbnN0WzRdOworfTsKKworc3RydWN0IGludGVsX2R5bmFtaWNfZGVwdGhfYm91bmRzIHsKKyAgICBmbG9hdCBtaW5fZGVwdGhfYm91bmRzOworICAgIGZsb2F0IG1heF9kZXB0aF9ib3VuZHM7Cit9OworCitzdHJ1Y3QgaW50ZWxfZHluYW1pY19zdGVuY2lsX2ZhY2UgeworICAgIHVpbnQzMl90IHN0ZW5jaWxfY29tcGFyZV9tYXNrOworICAgIHVpbnQzMl90IHN0ZW5jaWxfd3JpdGVfbWFzazsKKyAgICB1aW50MzJfdCBzdGVuY2lsX3JlZmVyZW5jZTsKK307CisKK3N0cnVjdCBpbnRlbF9keW5hbWljX3N0ZW5jaWwgeworICAgIHN0cnVjdCBpbnRlbF9keW5hbWljX3N0ZW5jaWxfZmFjZSBmcm9udDsKKyAgICAvKiBUT0RPOiBlbmFibGUgYmFjayBmYWNpbmcgc3RlbmNpbCBzdGF0ZSAqLworICAgIHN0cnVjdCBpbnRlbF9keW5hbWljX3N0ZW5jaWxfZmFjZSBiYWNrOworfTsKKworc3RydWN0IGludGVsX2NtZDsKK3ZvaWQgaW50ZWxfc2V0X3ZpZXdwb3J0KHN0cnVjdCBpbnRlbF9jbWQgKmNtZCwgdWludDMyX3QgZmlyc3QsIHVpbnQzMl90IGNvdW50LCBjb25zdCBWa1ZpZXdwb3J0ICp2aWV3cG9ydHMpOwordm9pZCBpbnRlbF9zZXRfc2Npc3NvcihzdHJ1Y3QgaW50ZWxfY21kICpjbWQsIHVpbnQzMl90IGZpcnN0LCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtSZWN0MkQgKnNjaXNzb3JzKTsKK3ZvaWQgaW50ZWxfc2V0X2xpbmVfd2lkdGgoc3RydWN0IGludGVsX2NtZCAqY21kLCBmbG9hdCBsaW5lX3dpZHRoKTsKK3ZvaWQgaW50ZWxfc2V0X2RlcHRoX2JpYXMoCisgICAgc3RydWN0IGludGVsX2NtZCAgICAgICAgICAgICAgICAgICAqY21kLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc0NsYW1wLAorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQmlhc1Nsb3BlRmFjdG9yKTsKK3ZvaWQgaW50ZWxfc2V0X2JsZW5kX2NvbnN0YW50cygKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICAgICAgICAgICAgICAgICAgICpjbWQsCisgICAgY29uc3QgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzWzRdKTsKK3ZvaWQgaW50ZWxfc2V0X2RlcHRoX2JvdW5kcygKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICAgICAgICAgICAgICAgICAgICpjbWQsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGVwdGhCb3VuZHMsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGVwdGhCb3VuZHMpOwordm9pZCBpbnRlbF9zZXRfc3RlbmNpbF9jb21wYXJlX21hc2soCisgICAgc3RydWN0IGludGVsX2NtZCAgICAgICAgICAgICAgICAgICAqY21kLAorICAgIFZrU3RlbmNpbEZhY2VGbGFncyAgICAgICAgICAgICAgICAgIGZhY2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVNYXNrKTsKK3ZvaWQgaW50ZWxfc2V0X3N0ZW5jaWxfd3JpdGVfbWFzaygKKyAgICBzdHJ1Y3QgaW50ZWxfY21kICAgICAgICAgICAgICAgICAgICpjbWQsCisgICAgVmtTdGVuY2lsRmFjZUZsYWdzICAgICAgICAgICAgICAgICAgZmFjZU1hc2ssCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNYXNrKTsKK3ZvaWQgaW50ZWxfc2V0X3N0ZW5jaWxfcmVmZXJlbmNlKAorICAgIHN0cnVjdCBpbnRlbF9jbWQgICAgICAgICAgICAgICAgICAgKmNtZCwKKyAgICBWa1N0ZW5jaWxGYWNlRmxhZ3MgICAgICAgICAgICAgICAgICBmYWNlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UpOworCisjZW5kaWYgLyogU1RBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvaWNkL2ludGVsL3ZpZXcuYyBiL2ljZC9pbnRlbC92aWV3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0NTYwNgotLS0gL2Rldi9udWxsCisrKyBiL2ljZC9pbnRlbC92aWV3LmMKQEAgLTAsMCArMSwxMzk2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2YWZmZUBnbWFpbC5jb20+CisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJnZW5ody9nZW5ody5oIgorI2luY2x1ZGUgImttZC93aW5zeXMuaCIKKyNpbmNsdWRlICJidWYuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJmb3JtYXQuaCIKKyNpbmNsdWRlICJncHUuaCIKKyNpbmNsdWRlICJpbWcuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJ2aWV3LmgiCisKK3N0YXRpYyB2b2lkIHN1cmZhY2Vfc3RhdGVfbnVsbF9nZW43KGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3WzhdKQoreworICAgSU5URUxfR1BVX0FTU0VSVChncHUsIDcsIDcuNSk7CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDYyOgorICAgICoKKyAgICAqICAgICAiQSBudWxsIHN1cmZhY2UgaXMgdXNlZCBpbiBpbnN0YW5jZXMgd2hlcmUgYW4gYWN0dWFsIHN1cmZhY2UgaXMgbm90CisgICAgKiAgICAgIGJvdW5kLiBXaGVuIGEgd3JpdGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgdG8gYSBudWxsIHN1cmZhY2UsIG5vCisgICAgKiAgICAgIGFjdHVhbCBzdXJmYWNlIGlzIHdyaXR0ZW4gdG8uIFdoZW4gYSByZWFkIG1lc3NhZ2UgKGluY2x1ZGluZyBhbnkKKyAgICAqICAgICAgc2FtcGxpbmcgZW5naW5lIG1lc3NhZ2UpIGlzIGdlbmVyYXRlZCB0byBhIG51bGwgc3VyZmFjZSwgdGhlIHJlc3VsdAorICAgICogICAgICBpcyBhbGwgemVyb3MuICBOb3RlIHRoYXQgYSBudWxsIHN1cmZhY2UgdHlwZSBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKKyAgICAqICAgICAgd2l0aCBhbGwgbWVzc2FnZXMsIGV2ZW4gaWYgaXQgaXMgbm90IHNwZWNpZmljaWFsbHkgaW5kaWNhdGVkIGFzCisgICAgKiAgICAgIHN1cHBvcnRlZC4gQWxsIG9mIHRoZSByZW1haW5pbmcgZmllbGRzIGluIHN1cmZhY2Ugc3RhdGUgYXJlIGlnbm9yZWQKKyAgICAqICAgICAgZm9yIG51bGwgc3VyZmFjZXMsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorICAgICoKKyAgICAqICAgICAgKiBXaWR0aCwgSGVpZ2h0LCBEZXB0aCwgTE9ELCBhbmQgUmVuZGVyIFRhcmdldCBWaWV3IEV4dGVudCBmaWVsZHMKKyAgICAqICAgICAgICBtdXN0IG1hdGNoIHRoZSBkZXB0aCBidWZmZXIncyBjb3JyZXNwb25kaW5nIHN0YXRlIGZvciBhbGwgcmVuZGVyCisgICAgKiAgICAgICAgdGFyZ2V0IHN1cmZhY2VzLCBpbmNsdWRpbmcgbnVsbC4KKyAgICAqICAgICAgKiBBbGwgc2FtcGxpbmcgZW5naW5lIGFuZCBkYXRhIHBvcnQgbWVzc2FnZXMgc3VwcG9ydCBudWxsIHN1cmZhY2VzCisgICAgKiAgICAgICAgd2l0aCB0aGUgYWJvdmUgYmVoYXZpb3IsIGV2ZW4gaWYgbm90IG1lbnRpb25lZCBhcyBzcGVjaWZpY2FsbHkKKyAgICAqICAgICAgICBzdXBwb3J0ZWQsIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZzoKKyAgICAqICAgICAgICAqIERhdGEgUG9ydCBNZWRpYSBCbG9jayBSZWFkL1dyaXRlIG1lc3NhZ2VzLgorICAgICogICAgICAqIFRoZSBTdXJmYWNlIFR5cGUgb2YgYSBzdXJmYWNlIHVzZWQgYXMgYSByZW5kZXIgdGFyZ2V0IChhY2Nlc3NlZAorICAgICogICAgICAgIHZpYSB0aGUgRGF0YSBQb3J0J3MgUmVuZGVyIFRhcmdldCBXcml0ZSBtZXNzYWdlKSBtdXN0IGJlIHRoZSBzYW1lCisgICAgKiAgICAgICAgYXMgdGhlIFN1cmZhY2UgVHlwZSBvZiBhbGwgb3RoZXIgcmVuZGVyIHRhcmdldHMgYW5kIG9mIHRoZSBkZXB0aAorICAgICogICAgICAgIGJ1ZmZlciAoZGVmaW5lZCBpbiAzRFNUQVRFX0RFUFRIX0JVRkZFUiksIHVubGVzcyBlaXRoZXIgdGhlIGRlcHRoCisgICAgKiAgICAgICAgYnVmZmVyIG9yIHJlbmRlciB0YXJnZXRzIGFyZSBTVVJGVFlQRV9OVUxMLiIKKyAgICAqCisgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDY1OgorICAgICoKKyAgICAqICAgICAiSWYgU3VyZmFjZSBUeXBlIGlzIFNVUkZUWVBFX05VTEwsIHRoaXMgZmllbGQgKFRpbGVkIFN1cmZhY2UpIG11c3QgYmUKKyAgICAqICAgICAgdHJ1ZSIKKyAgICAqLworCisgICBkd1swXSA9IEdFTjZfU1VSRlRZUEVfTlVMTCA8PCBHRU43X1NVUkZBQ0VfRFcwX1RZUEVfX1NISUZUIHwKKyAgICAgICAgICAgR0VONl9GT1JNQVRfQjhHOFI4QThfVU5PUk0gPDwgR0VON19TVVJGQUNFX0RXMF9GT1JNQVRfX1NISUZUIHwKKyAgICAgICAgICAgR0VONl9USUxJTkdfWCA8PCAxMzsKKworICAgZHdbMV0gPSAwOworICAgZHdbMl0gPSAwOworICAgZHdbM10gPSAwOworICAgZHdbNF0gPSAwOworICAgZHdbNV0gPSAwOworICAgZHdbNl0gPSAwOworICAgZHdbN10gPSAwOworfQorCitzdGF0aWMgdm9pZCBzdXJmYWNlX3N0YXRlX2J1Zl9nZW43KGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdHJ1Y3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGb3JtYXQgZWxlbV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcnQsIGJvb2wgcmVuZGVyX2NhY2hlX3J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1s4XSkKK3sKKyAgIGNvbnN0IGJvb2wgdHlwZWQgPSAhaWNkX2Zvcm1hdF9pc191bmRlZihlbGVtX2Zvcm1hdCk7CisgICBjb25zdCBib29sIHN0cnVjdHVyZWQgPSAoIXR5cGVkICYmIHN0cnVjdF9zaXplID4gMSk7CisgICBjb25zdCBpbnQgZWxlbV9zaXplID0gKHR5cGVkKSA/CisgICAgICBpY2RfZm9ybWF0X2dldF9zaXplKGVsZW1fZm9ybWF0KSA6IDE7CisgICBpbnQgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHBpdGNoOworICAgaW50IHN1cmZhY2VfdHlwZSwgc3VyZmFjZV9mb3JtYXQsIG51bV9lbnRyaWVzOworCisgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNywgNy41KTsKKworICAgc3VyZmFjZV90eXBlID0gKHN0cnVjdHVyZWQpID8gR0VON19TVVJGVFlQRV9TVFJCVUYgOiBHRU42X1NVUkZUWVBFX0JVRkZFUjsKKworICAgc3VyZmFjZV9mb3JtYXQgPSAodHlwZWQpID8KKyAgICAgIGludGVsX2Zvcm1hdF90cmFuc2xhdGVfY29sb3IoZ3B1LCBlbGVtX2Zvcm1hdCkgOiBHRU42X0ZPUk1BVF9SQVc7CisKKyAgIC8qCisgICAgKiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGJ1ZmZlciB2aWV3IGJlaW5nIHVzZWQgaXMgc21hbGxlciB0aGFuCisgICAgKiB0aGUgZm9ybWF0IGVsZW1lbnQgc2l6ZSAocmVxdWlyZWQgdG8gYmUgMTYgZm9yIG5vbi1mcmFnbWVudCBzaGFkZXJzKQorICAgICogTWFrZSBjZXJ0YWluIHRoYXQgc2l6ZSBpcyBhdCBsZWFzdCBzdHJ1Y3Rfc2l6ZSB0byBrZWVwIEhXIGhhcHB5LgorICAgICovCisgICBpZiAoc2l6ZSA8IHN0cnVjdF9zaXplKSB7CisgICAgICAgc2l6ZSA9IHN0cnVjdF9zaXplOworICAgfQorCisgICBudW1fZW50cmllcyA9IHNpemUgLyBzdHJ1Y3Rfc2l6ZTsKKyAgIC8qIHNlZSBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gZml0IGFub3RoZXIgZWxlbWVudCAqLworICAgaWYgKHNpemUgJSBzdHJ1Y3Rfc2l6ZSA+PSBlbGVtX3NpemUgJiYgIXN0cnVjdHVyZWQpCisgICAgICBudW1fZW50cmllcysrOworCisgICAvKgorICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA2NzoKKyAgICAqCisgICAgKiAgICAgIkZvciBTVVJGVFlQRV9CVUZGRVIgcmVuZGVyIHRhcmdldHMsIHRoaXMgZmllbGQgKFN1cmZhY2UgQmFzZQorICAgICogICAgICBBZGRyZXNzKSBzcGVjaWZpZXMgdGhlIGJhc2UgYWRkcmVzcyBvZiBmaXJzdCBlbGVtZW50IG9mIHRoZQorICAgICogICAgICBzdXJmYWNlLiBUaGUgc3VyZmFjZSBpcyBpbnRlcnByZXRlZCBhcyBhIHNpbXBsZSBhcnJheSBvZiB0aGF0CisgICAgKiAgICAgIHNpbmdsZSBlbGVtZW50IHR5cGUuIFRoZSBhZGRyZXNzIG11c3QgYmUgbmF0dXJhbGx5LWFsaWduZWQgdG8gdGhlCisgICAgKiAgICAgIGVsZW1lbnQgc2l6ZSAoZS5nLiwgYSBidWZmZXIgY29udGFpbmluZyBSMzJHMzJCMzJBMzJfRkxPQVQgZWxlbWVudHMKKyAgICAqICAgICAgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQpCisgICAgKgorICAgICogICAgICBGb3IgU1VSRlRZUEVfQlVGRkVSIG5vbi1yZW5kZXJ0YXJnZXQgc3VyZmFjZXMsIHRoaXMgZmllbGQgc3BlY2lmaWVzCisgICAgKiAgICAgIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN1cmZhY2UsIGNvbXB1dGVkIGluCisgICAgKiAgICAgIHNvZnR3YXJlIGJ5IGFkZGluZyB0aGUgc3VyZmFjZSBiYXNlIGFkZHJlc3MgdG8gdGhlIGJ5dGUgb2Zmc2V0IG9mCisgICAgKiAgICAgIHRoZSBlbGVtZW50IGluIHRoZSBidWZmZXIuIgorICAgICovCisgICBpZiAoaXNfcnQpCisgICAgICBhc3NlcnQob2Zmc2V0ICUgZWxlbV9zaXplID09IDApOworCisgICAvKgorICAgICogRnJvbSB0aGUgSXZ5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA2ODoKKyAgICAqCisgICAgKiAgICAgIkZvciB0eXBlZCBidWZmZXIgYW5kIHN0cnVjdHVyZWQgYnVmZmVyIHN1cmZhY2VzLCB0aGUgbnVtYmVyIG9mCisgICAgKiAgICAgIGVudHJpZXMgaW4gdGhlIGJ1ZmZlciByYW5nZXMgZnJvbSAxIHRvIDJeMjcuICBGb3IgcmF3IGJ1ZmZlcgorICAgICogICAgICBzdXJmYWNlcywgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBidWZmZXIgaXMgdGhlIG51bWJlciBvZgorICAgICogICAgICBieXRlcyB3aGljaCBjYW4gcmFuZ2UgZnJvbSAxIHRvIDJeMzAuIgorICAgICovCisgICBhc3NlcnQobnVtX2VudHJpZXMgPj0gMSAmJgorICAgICAgICAgIG51bV9lbnRyaWVzIDw9IDEgPDwgKCh0eXBlZCB8fCBzdHJ1Y3R1cmVkKSA/IDI3IDogMzApKTsKKworICAgLyoKKyAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgNjk6CisgICAgKgorICAgICogICAgICJGb3IgU1VSRlRZUEVfQlVGRkVSOiBUaGUgbG93IHR3byBiaXRzIG9mIHRoaXMgZmllbGQgKFdpZHRoKSBtdXN0IGJlCisgICAgKiAgICAgIDExIGlmIHRoZSBTdXJmYWNlIEZvcm1hdCBpcyBSQVcgKHRoZSBzaXplIG9mIHRoZSBidWZmZXIgbXVzdCBiZSBhCisgICAgKiAgICAgIG11bHRpcGxlIG9mIDQgYnl0ZXMpLiIKKyAgICAqCisgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDcwOgorICAgICoKKyAgICAqICAgICAiRm9yIHN1cmZhY2VzIG9mIHR5cGUgU1VSRlRZUEVfQlVGRkVSIGFuZCBTVVJGVFlQRV9TVFJCVUYsIHRoaXMKKyAgICAqICAgICAgZmllbGQgKFN1cmZhY2UgUGl0Y2gpIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlLiIKKyAgICAqCisgICAgKiAgICAgIkZvciBsaW5lYXIgc3VyZmFjZXMgd2l0aCBTdXJmYWNlIFR5cGUgb2YgU1VSRlRZUEVfU1RSQlVGLCB0aGUgcGl0Y2gKKyAgICAqICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuIgorICAgICovCisgICBpZiAoc3RydWN0dXJlZCkKKyAgICAgIGFzc2VydChzdHJ1Y3Rfc2l6ZSAlIDQgPT0gMCk7CisgICBlbHNlIGlmICghdHlwZWQpCisgICAgICBhc3NlcnQobnVtX2VudHJpZXMgJSA0ID09IDApOworCisgICBwaXRjaCA9IHN0cnVjdF9zaXplOworCisgICBwaXRjaC0tOworICAgbnVtX2VudHJpZXMtLTsKKyAgIC8qIGJpdHMgWzY6MF0gKi8KKyAgIHdpZHRoICA9IChudW1fZW50cmllcyAmIDB4MDAwMDAwN2YpOworICAgLyogYml0cyBbMjA6N10gKi8KKyAgIGhlaWdodCA9IChudW1fZW50cmllcyAmIDB4MDAxZmZmODApID4+IDc7CisgICAvKiBiaXRzIFszMDoyMV0gKi8KKyAgIGRlcHRoICA9IChudW1fZW50cmllcyAmIDB4N2ZlMDAwMDApID4+IDIxOworICAgLyogbGltaXQgdG8gWzI2OjIxXSAqLworICAgaWYgKHR5cGVkIHx8IHN0cnVjdHVyZWQpCisgICAgICBkZXB0aCAmPSAweDNmOworCisgICBkd1swXSA9IHN1cmZhY2VfdHlwZSA8PCBHRU43X1NVUkZBQ0VfRFcwX1RZUEVfX1NISUZUIHwKKyAgICAgICAgICAgc3VyZmFjZV9mb3JtYXQgPDwgR0VON19TVVJGQUNFX0RXMF9GT1JNQVRfX1NISUZUOworICAgaWYgKHJlbmRlcl9jYWNoZV9ydykKKyAgICAgIGR3WzBdIHw9IEdFTjdfU1VSRkFDRV9EVzBfUkVOREVSX0NBQ0hFX1JXOworCisgICBkd1sxXSA9IG9mZnNldDsKKworICAgZHdbMl0gPSBoZWlnaHQgPDwgR0VON19TVVJGQUNFX0RXMl9IRUlHSFRfX1NISUZUIHwKKyAgICAgICAgICAgd2lkdGggPDwgR0VON19TVVJGQUNFX0RXMl9XSURUSF9fU0hJRlQ7CisKKyAgIGR3WzNdID0gZGVwdGggPDwgR0VON19TVVJGQUNFX0RXM19ERVBUSF9fU0hJRlQgfAorICAgICAgICAgICBwaXRjaDsKKworICAgZHdbNF0gPSAwOworICAgZHdbNV0gPSBHRU43X01PQ1NfTDNfV0IgPDwgR0VON19TVVJGQUNFX0RXNV9NT0NTX19TSElGVDsKKworICAgZHdbNl0gPSAwOworICAgZHdbN10gPSAwOworCisgICBpZiAoaW50ZWxfZ3B1X2dlbihncHUpID49IElOVEVMX0dFTig3LjUpKSB7CisgICAgICBkd1s3XSB8PSBHRU43NV9TQ1NfUkVEICAgPDwgR0VONzVfU1VSRkFDRV9EVzdfU0NTX1JfX1NISUZUIHwKKyAgICAgICAgICAgICAgIEdFTjc1X1NDU19HUkVFTiA8PCBHRU43NV9TVVJGQUNFX0RXN19TQ1NfR19fU0hJRlQgfAorICAgICAgICAgICAgICAgR0VONzVfU0NTX0JMVUUgIDw8IEdFTjc1X1NVUkZBQ0VfRFc3X1NDU19CX19TSElGVCB8CisgICAgICAgICAgICAgICBHRU43NV9TQ1NfQUxQSEEgPDwgR0VONzVfU1VSRkFDRV9EVzdfU0NTX0FfX1NISUZUOworICAgfQorfQorCitzdGF0aWMgaW50IGltZ190eXBlX3RvX3ZpZXdfdHlwZShWa0ltYWdlVHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdF9sYXllciwgdW5zaWduZWQgbnVtX2xheWVycykKK3sKKyAgICBpZiAoZmlyc3RfbGF5ZXIgPT0gMCAmJiBudW1fbGF5ZXJzID09IDEpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8xRDogICByZXR1cm4gVktfSU1BR0VfVklFV19UWVBFXzFEOworICAgICAgICBjYXNlIFZLX0lNQUdFX1RZUEVfMkQ6ICAgcmV0dXJuIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzNEOiAgIHJldHVybiBWS19JTUFHRV9WSUVXX1RZUEVfM0Q7CisgICAgICAgIGRlZmF1bHQ6IGFzc2VydCghInVua25vd24gaW1nIHR5cGUiKTsgcmV0dXJuIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFZLX0lNQUdFX1RZUEVfMUQ6ICAgcmV0dXJuIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTsKKyAgICAgICAgY2FzZSBWS19JTUFHRV9UWVBFXzJEOiAgIHJldHVybiBWS19JTUFHRV9WSUVXX1RZUEVfMkRfQVJSQVk7CisgICAgICAgIGNhc2UgVktfSU1BR0VfVFlQRV8zRDogICByZXR1cm4gVktfSU1BR0VfVklFV19UWVBFXzNEOworICAgICAgICBkZWZhdWx0OiBhc3NlcnQoISJ1bmtub3duIGltZyB0eXBlIik7IHJldHVybiBWS19JTUFHRV9WSUVXX1RZUEVfMURfQVJSQVk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdmlld190eXBlX3RvX3N1cmZhY2VfdHlwZShWa0ltYWdlVmlld1R5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRDogICAgICAgICByZXR1cm4gR0VONl9TVVJGVFlQRV8xRDsKKyAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV8xRF9BUlJBWTogICByZXR1cm4gR0VONl9TVVJGVFlQRV8xRDsKKyAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRDogICAgICAgICByZXR1cm4gR0VONl9TVVJGVFlQRV8yRDsKKyAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV8yRF9BUlJBWTogICByZXR1cm4gR0VONl9TVVJGVFlQRV8yRDsKKyAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV8zRDogICAgICAgICByZXR1cm4gR0VONl9TVVJGVFlQRV8zRDsKKyAgICBjYXNlIFZLX0lNQUdFX1ZJRVdfVFlQRV9DVUJFOiAgICAgICByZXR1cm4gR0VONl9TVVJGVFlQRV9DVUJFOworICAgIGNhc2UgVktfSU1BR0VfVklFV19UWVBFX0NVQkVfQVJSQVk6IHJldHVybiBHRU42X1NVUkZUWVBFX0NVQkU7CisgICAgZGVmYXVsdDogYXNzZXJ0KCEidW5rbm93biB2aWV3IHR5cGUiKTsgcmV0dXJuIEdFTjZfU1VSRlRZUEVfTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2hhbm5lbF9zd2l6emxlX3RvX3NjcyhWa0NvbXBvbmVudFN3aXp6bGUgc3dpenpsZSkKK3sKKyAgICBzd2l0Y2ggKHN3aXp6bGUpIHsKKyAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX1pFUk86ICByZXR1cm4gR0VONzVfU0NTX1pFUk87CisgICAgY2FzZSBWS19DT01QT05FTlRfU1dJWlpMRV9PTkU6ICAgcmV0dXJuIEdFTjc1X1NDU19PTkU7CisgICAgY2FzZSBWS19DT01QT05FTlRfU1dJWlpMRV9SOiAgICAgcmV0dXJuIEdFTjc1X1NDU19SRUQ7CisgICAgY2FzZSBWS19DT01QT05FTlRfU1dJWlpMRV9HOiAgICAgcmV0dXJuIEdFTjc1X1NDU19HUkVFTjsKKyAgICBjYXNlIFZLX0NPTVBPTkVOVF9TV0laWkxFX0I6ICAgICByZXR1cm4gR0VONzVfU0NTX0JMVUU7CisgICAgY2FzZSBWS19DT01QT05FTlRfU1dJWlpMRV9BOiAgICAgcmV0dXJuIEdFTjc1X1NDU19BTFBIQTsKKyAgICBkZWZhdWx0OiBhc3NlcnQoISJ1bmtub3duIHN3aXp6bGUiKTsgcmV0dXJuIEdFTjc1X1NDU19aRVJPOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3VyZmFjZV9zdGF0ZV90ZXhfZ2VuNyhjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZVZpZXdUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlyc3RfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9sZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZpcnN0X2xheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0NvbXBvbmVudE1hcHBpbmcgc3dpenpsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3WzhdKQoreworICAgaW50IHN1cmZhY2VfdHlwZSwgc3VyZmFjZV9mb3JtYXQ7CisgICBpbnQgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHBpdGNoLCBsb2Q7CisKKyAgIElOVEVMX0dQVV9BU1NFUlQoZ3B1LCA3LCA3LjUpOworCisgICBzdXJmYWNlX3R5cGUgPSB2aWV3X3R5cGVfdG9fc3VyZmFjZV90eXBlKHR5cGUpOworICAgYXNzZXJ0KHN1cmZhY2VfdHlwZSAhPSBHRU42X1NVUkZUWVBFX0JVRkZFUik7CisKKyAgIHN1cmZhY2VfZm9ybWF0ID0gaW50ZWxfZm9ybWF0X3RyYW5zbGF0ZV9jb2xvcihncHUsIGZvcm1hdCk7CisgICBhc3NlcnQoc3VyZmFjZV9mb3JtYXQgPj0gMCk7CisKKyAgIHdpZHRoID0gaW1nLT5sYXlvdXQud2lkdGgwOworICAgaGVpZ2h0ID0gaW1nLT5sYXlvdXQuaGVpZ2h0MDsKKyAgIGRlcHRoID0gKHR5cGUgPT0gVktfSU1BR0VfVklFV19UWVBFXzNEKSA/CisgICAgICBpbWctPmRlcHRoIDogbnVtX2xheWVyczsKKyAgIHBpdGNoID0gaW1nLT5sYXlvdXQuYm9fc3RyaWRlOworCisgICBpZiAoc3VyZmFjZV90eXBlID09IEdFTjZfU1VSRlRZUEVfQ1VCRSkgeworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgNzA6CisgICAgICAgKgorICAgICAgICogICAgICJGb3IgU1VSRlRZUEVfQ1VCRTpGb3IgU2FtcGxpbmcgRW5naW5lIFN1cmZhY2VzLCB0aGUgcmFuZ2Ugb2YKKyAgICAgICAqICAgICAgdGhpcyBmaWVsZCBpcyBbMCwzNDBdLCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgY3ViZSBhcnJheQorICAgICAgICogICAgICBlbGVtZW50cyAoZXF1YWwgdG8gdGhlIG51bWJlciBvZiB1bmRlcmx5aW5nIDJEIGFycmF5IGVsZW1lbnRzCisgICAgICAgKiAgICAgIGRpdmlkZWQgYnkgNikuIEZvciBvdGhlciBzdXJmYWNlcywgdGhpcyBmaWVsZCBtdXN0IGJlIHplcm8uIgorICAgICAgICoKKyAgICAgICAqIFdoZW4gaXNfcnQgaXMgdHJ1ZSwgd2UgdHJlYXQgdGhlIHRleHR1cmUgYXMgYSAyRCBvbmUgdG8gYXZvaWQgdGhlCisgICAgICAgKiByZXN0cmljdGlvbi4KKyAgICAgICAqLworICAgICAgaWYgKGlzX3J0KSB7CisgICAgICAgICBzdXJmYWNlX3R5cGUgPSBHRU42X1NVUkZUWVBFXzJEOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBhc3NlcnQobnVtX2xheWVycyAlIDYgPT0gMCk7CisgICAgICAgICBkZXB0aCA9IG51bV9sYXllcnMgLyA2OworICAgICAgfQorICAgfQorCisgICAvKiBzYW5pdHkgY2hlY2sgdGhlIHNpemUgKi8KKyAgIGFzc2VydCh3aWR0aCA+PSAxICYmIGhlaWdodCA+PSAxICYmIGRlcHRoID49IDEgJiYgcGl0Y2ggPj0gMSk7CisgICBhc3NlcnQoZmlyc3RfbGF5ZXIgPCAyMDQ4ICYmIG51bV9sYXllcnMgPD0gMjA0OCk7CisgICBzd2l0Y2ggKHN1cmZhY2VfdHlwZSkgeworICAgY2FzZSBHRU42X1NVUkZUWVBFXzFEOgorICAgICAgYXNzZXJ0KHdpZHRoIDw9IDE2Mzg0ICYmIGhlaWdodCA9PSAxICYmIGRlcHRoIDw9IDIwNDgpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfMkQ6CisgICAgICBhc3NlcnQod2lkdGggPD0gMTYzODQgJiYgaGVpZ2h0IDw9IDE2Mzg0ICYmIGRlcHRoIDw9IDIwNDgpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfM0Q6CisgICAgICBhc3NlcnQod2lkdGggPD0gMjA0OCAmJiBoZWlnaHQgPD0gMjA0OCAmJiBkZXB0aCA8PSAyMDQ4KTsKKyAgICAgIGlmICghaXNfcnQpCisgICAgICAgICBhc3NlcnQoZmlyc3RfbGF5ZXIgPT0gMCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0VONl9TVVJGVFlQRV9DVUJFOgorICAgICAgYXNzZXJ0KHdpZHRoIDw9IDE2Mzg0ICYmIGhlaWdodCA8PSAxNjM4NCAmJiBkZXB0aCA8PSA4Nik7CisgICAgICBhc3NlcnQod2lkdGggPT0gaGVpZ2h0KTsKKyAgICAgIGlmIChpc19ydCkKKyAgICAgICAgIGFzc2VydChmaXJzdF9sYXllciA9PSAwKTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVuZXhwZWN0ZWQgc3VyZmFjZSB0eXBlIik7CisgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKGlzX3J0KSB7CisgICAgICBhc3NlcnQobnVtX2xldmVscyA9PSAxKTsKKyAgICAgIGxvZCA9IGZpcnN0X2xldmVsOworICAgfQorICAgZWxzZSB7CisgICAgICBsb2QgPSBudW1fbGV2ZWxzIC0gMTsKKyAgIH0KKworICAgLyoKKyAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgNjg6CisgICAgKgorICAgICogICAgICJUaGUgQmFzZSBBZGRyZXNzIGZvciBsaW5lYXIgcmVuZGVyIHRhcmdldCBzdXJmYWNlcyBhbmQgc3VyZmFjZXMKKyAgICAqICAgICAgYWNjZXNzZWQgd2l0aCB0aGUgdHlwZWQgc3VyZmFjZSByZWFkL3dyaXRlIGRhdGEgcG9ydCBtZXNzYWdlcyBtdXN0CisgICAgKiAgICAgIGJlIGVsZW1lbnQtc2l6ZSBhbGlnbmVkLCBmb3Igbm9uLVlVViBzdXJmYWNlIGZvcm1hdHMsIG9yIGEgbXVsdGlwbGUKKyAgICAqICAgICAgb2YgMiBlbGVtZW50LXNpemVzIGZvciBZVVYgc3VyZmFjZSBmb3JtYXRzLiAgT3RoZXIgbGluZWFyIHN1cmZhY2VzCisgICAgKiAgICAgIGhhdmUgbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50cyAoYnl0ZSBhbGlnbm1lbnQgaXMgc3VmZmljaWVudCkuIgorICAgICoKKyAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgNzA6CisgICAgKgorICAgICogICAgICJGb3IgbGluZWFyIHJlbmRlciB0YXJnZXQgc3VyZmFjZXMgYW5kIHN1cmZhY2VzIGFjY2Vzc2VkIHdpdGggdGhlCisgICAgKiAgICAgIHR5cGVkIGRhdGEgcG9ydCBtZXNzYWdlcywgdGhlIHBpdGNoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUKKyAgICAqICAgICAgZWxlbWVudCBzaXplIGZvciBub24tWVVWIHN1cmZhY2UgZm9ybWF0cy4gUGl0Y2ggbXVzdCBiZSBhIG11bHRpcGxlCisgICAgKiAgICAgIG9mIDIgKiBlbGVtZW50IHNpemUgZm9yIFlVViBzdXJmYWNlIGZvcm1hdHMuIEZvciBsaW5lYXIgc3VyZmFjZXMKKyAgICAqICAgICAgd2l0aCBTdXJmYWNlIFR5cGUgb2YgU1VSRlRZUEVfU1RSQlVGLCB0aGUgcGl0Y2ggbXVzdCBiZSBhIG11bHRpcGxlCisgICAgKiAgICAgIG9mIDQgYnl0ZXMuRm9yIG90aGVyIGxpbmVhciBzdXJmYWNlcywgdGhlIHBpdGNoIGNhbiBiZSBhbnkgbXVsdGlwbGUKKyAgICAqICAgICAgb2YgYnl0ZXMuIgorICAgICoKKyAgICAqIEZyb20gdGhlIEl2eSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgNzQ6CisgICAgKgorICAgICogICAgICJGb3IgbGluZWFyIHN1cmZhY2VzLCB0aGlzIGZpZWxkIChYIE9mZnNldCkgbXVzdCBiZSB6ZXJvLiIKKyAgICAqLworICAgaWYgKGltZy0+bGF5b3V0LnRpbGluZyA9PSBHRU42X1RJTElOR19OT05FKSB7CisgICAgICBpZiAoaXNfcnQpIHsKKyAgICAgICAgIGNvbnN0IGludCBlbGVtX3NpemUgVV9BU1NFUlRfT05MWSA9IGljZF9mb3JtYXRfZ2V0X3NpemUoZm9ybWF0KTsKKyAgICAgICAgIGFzc2VydChwaXRjaCAlIGVsZW1fc2l6ZSA9PSAwKTsKKyAgICAgIH0KKyAgIH0KKworICAgYXNzZXJ0KGltZy0+bGF5b3V0LnRpbGluZyAhPSBHRU44X1RJTElOR19XKTsKKyAgIGR3WzBdID0gc3VyZmFjZV90eXBlIDw8IEdFTjdfU1VSRkFDRV9EVzBfVFlQRV9fU0hJRlQgfAorICAgICAgICAgICBzdXJmYWNlX2Zvcm1hdCA8PCBHRU43X1NVUkZBQ0VfRFcwX0ZPUk1BVF9fU0hJRlQgfAorICAgICAgICAgICBpbWctPmxheW91dC50aWxpbmcgPDwgMTM7CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBJdnkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDYzOgorICAgICoKKyAgICAqICAgICAiSWYgdGhpcyBmaWVsZCAoU3VyZmFjZSBBcnJheSkgaXMgZW5hYmxlZCwgdGhlIFN1cmZhY2UgVHlwZSBtdXN0IGJlCisgICAgKiAgICAgIFNVUkZUWVBFXzFELCBTVVJGVFlQRV8yRCwgb3IgU1VSRlRZUEVfQ1VCRS4gSWYgdGhpcyBmaWVsZCBpcworICAgICogICAgICBkaXNhYmxlZCBhbmQgU3VyZmFjZSBUeXBlIGlzIFNVUkZUWVBFXzFELCBTVVJGVFlQRV8yRCwgb3IKKyAgICAqICAgICAgU1VSRlRZUEVfQ1VCRSwgdGhlIERlcHRoIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uIgorICAgICoKKyAgICAqIEZvciBub24tM0Qgc2FtcGxlciBzdXJmYWNlcywgcmVzaW5mbyAodGhlIHNhbXBsZXIgbWVzc2FnZSkgYWx3YXlzCisgICAgKiByZXR1cm5zIHplcm8gZm9yIHRoZSBudW1iZXIgb2YgbGF5ZXJzIHdoZW4gdGhpcyBmaWVsZCBpcyBub3Qgc2V0LgorICAgICovCisgICBpZiAoc3VyZmFjZV90eXBlICE9IEdFTjZfU1VSRlRZUEVfM0QpIHsKKyAgICAgIGlmIChudW1fbGF5ZXJzID4gMSkKKyAgICAgICAgIGR3WzBdIHw9IEdFTjdfU1VSRkFDRV9EVzBfSVNfQVJSQVk7CisgICAgICBlbHNlCisgICAgICAgICBhc3NlcnQoZGVwdGggPT0gMSk7CisgICB9CisKKyAgIGFzc2VydChpbWctPmxheW91dC5hbGlnbl9pID09IDQgfHwgaW1nLT5sYXlvdXQuYWxpZ25faSA9PSA4KTsKKyAgIGFzc2VydChpbWctPmxheW91dC5hbGlnbl9qID09IDIgfHwgaW1nLT5sYXlvdXQuYWxpZ25faiA9PSA0KTsKKworICAgaWYgKGltZy0+bGF5b3V0LmFsaWduX2ogPT0gNCkKKyAgICAgIGR3WzBdIHw9IEdFTjdfU1VSRkFDRV9EVzBfVkFMSUdOXzQ7CisKKyAgIGlmIChpbWctPmxheW91dC5hbGlnbl9pID09IDgpCisgICAgICBkd1swXSB8PSBHRU43X1NVUkZBQ0VfRFcwX0hBTElHTl84OworCisgICBpZiAoaW1nLT5sYXlvdXQud2FsayA9PSBJTlRFTF9MQVlPVVRfV0FMS19MT0QpCisgICAgICBkd1swXSB8PSBHRU43X1NVUkZBQ0VfRFcwX0FSWVNQQ19MT0QwOworICAgZWxzZQorICAgICAgZHdbMF0gfD0gR0VON19TVVJGQUNFX0RXMF9BUllTUENfRlVMTDsKKworICAgaWYgKGlzX3J0KQorICAgICAgZHdbMF0gfD0gR0VON19TVVJGQUNFX0RXMF9SRU5ERVJfQ0FDSEVfUlc7CisKKyAgIGlmIChzdXJmYWNlX3R5cGUgPT0gR0VONl9TVVJGVFlQRV9DVUJFICYmICFpc19ydCkKKyAgICAgIGR3WzBdIHw9IEdFTjdfU1VSRkFDRV9EVzBfQ1VCRV9GQUNFX0VOQUJMRVNfX01BU0s7CisKKyAgIGR3WzFdID0gMDsKKworICAgZHdbMl0gPSAoaGVpZ2h0IC0gMSkgPDwgR0VON19TVVJGQUNFX0RXMl9IRUlHSFRfX1NISUZUIHwKKyAgICAgICAgICAgKHdpZHRoIC0gMSkgPDwgR0VON19TVVJGQUNFX0RXMl9XSURUSF9fU0hJRlQ7CisKKyAgIGR3WzNdID0gKGRlcHRoIC0gMSkgPDwgR0VON19TVVJGQUNFX0RXM19ERVBUSF9fU0hJRlQgfAorICAgICAgICAgICAocGl0Y2ggLSAxKTsKKworICAgZHdbNF0gPSBmaXJzdF9sYXllciA8PCAxOCB8CisgICAgICAgICAgIChudW1fbGF5ZXJzIC0gMSkgPDwgNzsKKworICAgLyoKKyAgICAqIE1TRk1UX01TUyBtZWFucyB0aGUgc2FtcGxlcyBhcmUgbm90IGludGVybGVhdmVkIGFuZCBNU0ZNVF9ERVBUSF9TVEVOQ0lMCisgICAgKiBtZWFucyB0aGUgc2FtcGxlcyBhcmUgaW50ZXJsZWF2ZWQuICBUaGUgbGF5b3V0cyBhcmUgdGhlIHNhbWUgd2hlbiB0aGUKKyAgICAqIG51bWJlciBvZiBzYW1wbGVzIGlzIDEuCisgICAgKi8KKyAgIGlmIChpbWctPmxheW91dC5pbnRlcmxlYXZlZF9zYW1wbGVzICYmIGltZy0+c2FtcGxlX2NvdW50ID4gMSkgeworICAgICAgYXNzZXJ0KCFpc19ydCk7CisgICAgICBkd1s0XSB8PSBHRU43X1NVUkZBQ0VfRFc0X01TRk1UX0RFUFRIX1NURU5DSUw7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGR3WzRdIHw9IEdFTjdfU1VSRkFDRV9EVzRfTVNGTVRfTVNTOworICAgfQorCisgICBpZiAoaW1nLT5zYW1wbGVfY291bnQgPiA0KQorICAgICAgZHdbNF0gfD0gR0VON19TVVJGQUNFX0RXNF9NVUxUSVNBTVBMRUNPVU5UXzg7CisgICBlbHNlIGlmIChpbWctPnNhbXBsZV9jb3VudCA+IDIpCisgICAgICBkd1s0XSB8PSBHRU43X1NVUkZBQ0VfRFc0X01VTFRJU0FNUExFQ09VTlRfNDsKKyAgIGVsc2UKKyAgICAgIGR3WzRdIHw9IEdFTjdfU1VSRkFDRV9EVzRfTVVMVElTQU1QTEVDT1VOVF8xOworCisgICBkd1s1XSA9IEdFTjdfTU9DU19MM19XQiA8PCBHRU43X1NVUkZBQ0VfRFc1X01PQ1NfX1NISUZUIHwKKyAgICAgICAgICAgKGZpcnN0X2xldmVsKSA8PCBHRU43X1NVUkZBQ0VfRFc1X01JTl9MT0RfX1NISUZUIHwKKyAgICAgICAgICAgbG9kOworCisgICBkd1s2XSA9IDA7CisgICBkd1s3XSA9IDA7CisKKyAgIGlmIChpbnRlbF9ncHVfZ2VuKGdwdSkgPj0gSU5URUxfR0VOKDcuNSkpIHsKKyAgICAgIGR3WzddIHw9CisgICAgICAgICBjaGFubmVsX3N3aXp6bGVfdG9fc2NzKChzd2l6emxlcy5yID09IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZKSA/IFZLX0NPTVBPTkVOVF9TV0laWkxFX1IgOiBzd2l6emxlcy5yKSA8PCBHRU43NV9TVVJGQUNFX0RXN19TQ1NfUl9fU0hJRlQgfAorICAgICAgICAgY2hhbm5lbF9zd2l6emxlX3RvX3Njcygoc3dpenpsZXMuZyA9PSBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSkgPyBWS19DT01QT05FTlRfU1dJWlpMRV9HIDogc3dpenpsZXMuZykgPDwgR0VONzVfU1VSRkFDRV9EVzdfU0NTX0dfX1NISUZUIHwKKyAgICAgICAgIGNoYW5uZWxfc3dpenpsZV90b19zY3MoKHN3aXp6bGVzLmIgPT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpID8gVktfQ09NUE9ORU5UX1NXSVpaTEVfQiA6IHN3aXp6bGVzLmIpIDw8IEdFTjc1X1NVUkZBQ0VfRFc3X1NDU19CX19TSElGVCB8CisgICAgICAgICBjaGFubmVsX3N3aXp6bGVfdG9fc2NzKChzd2l6emxlcy5hID09IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZKSA/IFZLX0NPTVBPTkVOVF9TV0laWkxFX0EgOiBzd2l6emxlcy5hKSA8PCBHRU43NV9TVVJGQUNFX0RXN19TQ1NfQV9fU0hJRlQ7CisgICB9IGVsc2UgeworICAgICAgICAgYXNzZXJ0KCgoc3dpenpsZXMuciA9PSBWS19DT01QT05FTlRfU1dJWlpMRV9SKSB8fCAoc3dpenpsZXMuciA9PSBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSkpICYmCisgICAgICAgICAgICAgICAgKChzd2l6emxlcy5nID09IFZLX0NPTVBPTkVOVF9TV0laWkxFX0cpIHx8IChzd2l6emxlcy5nID09IFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZKSkgJiYKKyAgICAgICAgICAgICAgICAoKHN3aXp6bGVzLmIgPT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQikgfHwgKHN3aXp6bGVzLmIgPT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFkpKSAmJgorICAgICAgICAgICAgICAgICgoc3dpenpsZXMuYSA9PSBWS19DT01QT05FTlRfU1dJWlpMRV9BKSB8fCAoc3dpenpsZXMuYSA9PSBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSkpKTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgc3VyZmFjZV9zdGF0ZV9udWxsX2dlbjYoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdbNl0pCit7CisgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNiwgNik7CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgNCBwYXJ0IDEsIHBhZ2UgNzE6CisgICAgKgorICAgICogICAgICJBIG51bGwgc3VyZmFjZSB3aWxsIGJlIHVzZWQgaW4gaW5zdGFuY2VzIHdoZXJlIGFuIGFjdHVhbCBzdXJmYWNlIGlzCisgICAgKiAgICAgIG5vdCBib3VuZC4gV2hlbiBhIHdyaXRlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIHRvIGEgbnVsbCBzdXJmYWNlLCBubworICAgICogICAgICBhY3R1YWwgc3VyZmFjZSBpcyB3cml0dGVuIHRvLiBXaGVuIGEgcmVhZCBtZXNzYWdlIChpbmNsdWRpbmcgYW55CisgICAgKiAgICAgIHNhbXBsaW5nIGVuZ2luZSBtZXNzYWdlKSBpcyBnZW5lcmF0ZWQgdG8gYSBudWxsIHN1cmZhY2UsIHRoZSByZXN1bHQKKyAgICAqICAgICAgaXMgYWxsIHplcm9zLiBOb3RlIHRoYXQgYSBudWxsIHN1cmZhY2UgdHlwZSBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKKyAgICAqICAgICAgd2l0aCBhbGwgbWVzc2FnZXMsIGV2ZW4gaWYgaXQgaXMgbm90IHNwZWNpZmljaWFsbHkgaW5kaWNhdGVkIGFzCisgICAgKiAgICAgIHN1cHBvcnRlZC4gQWxsIG9mIHRoZSByZW1haW5pbmcgZmllbGRzIGluIHN1cmZhY2Ugc3RhdGUgYXJlIGlnbm9yZWQKKyAgICAqICAgICAgZm9yIG51bGwgc3VyZmFjZXMsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorICAgICoKKyAgICAqICAgICAgICAqIFtEZXZTTkIrXTogV2lkdGgsIEhlaWdodCwgRGVwdGgsIGFuZCBMT0QgZmllbGRzIG11c3QgbWF0Y2ggdGhlCisgICAgKiAgICAgICAgICBkZXB0aCBidWZmZXIncyBjb3JyZXNwb25kaW5nIHN0YXRlIGZvciBhbGwgcmVuZGVyIHRhcmdldAorICAgICogICAgICAgICAgc3VyZmFjZXMsIGluY2x1ZGluZyBudWxsLgorICAgICogICAgICAgICogU3VyZmFjZSBGb3JtYXQgbXVzdCBiZSBSOEc4QjhBOF9VTk9STS4iCisgICAgKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDgyOgorICAgICoKKyAgICAqICAgICAiSWYgU3VyZmFjZSBUeXBlIGlzIFNVUkZUWVBFX05VTEwsIHRoaXMgZmllbGQgKFRpbGVkIFN1cmZhY2UpIG11c3QgYmUKKyAgICAqICAgICAgdHJ1ZSIKKyAgICAqLworCisgICBkd1swXSA9IEdFTjZfU1VSRlRZUEVfTlVMTCA8PCBHRU42X1NVUkZBQ0VfRFcwX1RZUEVfX1NISUZUIHwKKyAgICAgICAgICAgR0VONl9GT1JNQVRfQjhHOFI4QThfVU5PUk0gPDwgR0VONl9TVVJGQUNFX0RXMF9GT1JNQVRfX1NISUZUOworCisgICBkd1sxXSA9IDA7CisgICBkd1syXSA9IDA7CisgICBkd1szXSA9IEdFTjZfVElMSU5HX1g7CisgICBkd1s0XSA9IDA7CisgICBkd1s1XSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1cmZhY2Vfc3RhdGVfYnVmX2dlbjYoY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0cnVjdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBlbGVtX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19ydCwgYm9vbCByZW5kZXJfY2FjaGVfcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3WzZdKQoreworICAgY29uc3QgYm9vbCB0eXBlZCA9ICFpY2RfZm9ybWF0X2lzX3VuZGVmKGVsZW1fZm9ybWF0KTsKKyAgIGNvbnN0IGludCBlbGVtX3NpemUgPSBpY2RfZm9ybWF0X2dldF9zaXplKGVsZW1fZm9ybWF0KTsKKyAgIGludCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGl0Y2g7CisgICBpbnQgc3VyZmFjZV9mb3JtYXQsIG51bV9lbnRyaWVzOworCisgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNiwgNik7CisKKyAgIC8qCisgICAgKiBGb3IgU1VSRlRZUEVfQlVGRkVSLCBhIFNVUkZBQ0VfU1RBVEUgc3BlY2lmaWVzIGFuIGVsZW1lbnQgb2YgYQorICAgICogc3RydWN0dXJlIGluIGEgYnVmZmVyLgorICAgICovCisKKyAgIHN1cmZhY2VfZm9ybWF0ID0gKHR5cGVkKSA/CisgICAgICAgaW50ZWxfZm9ybWF0X3RyYW5zbGF0ZV9jb2xvcihncHUsIGVsZW1fZm9ybWF0KSA6IEdFTjZfRk9STUFUX1JBVzsKKworICAgbnVtX2VudHJpZXMgPSBzaXplIC8gc3RydWN0X3NpemU7CisgICAvKiBzZWUgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIGZpdCBhbm90aGVyIGVsZW1lbnQgKi8KKyAgIGlmIChzaXplICUgc3RydWN0X3NpemUgPj0gZWxlbV9zaXplKQorICAgICAgbnVtX2VudHJpZXMrKzsKKworICAgLyoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA3NjoKKyAgICAqCisgICAgKiAgICAgIkZvciBTVVJGVFlQRV9CVUZGRVIgcmVuZGVyIHRhcmdldHMsIHRoaXMgZmllbGQgKFN1cmZhY2UgQmFzZQorICAgICogICAgICBBZGRyZXNzKSBzcGVjaWZpZXMgdGhlIGJhc2UgYWRkcmVzcyBvZiBmaXJzdCBlbGVtZW50IG9mIHRoZQorICAgICogICAgICBzdXJmYWNlLiBUaGUgc3VyZmFjZSBpcyBpbnRlcnByZXRlZCBhcyBhIHNpbXBsZSBhcnJheSBvZiB0aGF0CisgICAgKiAgICAgIHNpbmdsZSBlbGVtZW50IHR5cGUuIFRoZSBhZGRyZXNzIG11c3QgYmUgbmF0dXJhbGx5LWFsaWduZWQgdG8gdGhlCisgICAgKiAgICAgIGVsZW1lbnQgc2l6ZSAoZS5nLiwgYSBidWZmZXIgY29udGFpbmluZyBSMzJHMzJCMzJBMzJfRkxPQVQgZWxlbWVudHMKKyAgICAqICAgICAgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQpLgorICAgICoKKyAgICAqICAgICAgRm9yIFNVUkZUWVBFX0JVRkZFUiBub24tcmVuZGVydGFyZ2V0IHN1cmZhY2VzLCB0aGlzIGZpZWxkIHNwZWNpZmllcworICAgICogICAgICB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzdXJmYWNlLCBjb21wdXRlZCBpbgorICAgICogICAgICBzb2Z0d2FyZSBieSBhZGRpbmcgdGhlIHN1cmZhY2UgYmFzZSBhZGRyZXNzIHRvIHRoZSBieXRlIG9mZnNldCBvZgorICAgICogICAgICB0aGUgZWxlbWVudCBpbiB0aGUgYnVmZmVyLiIKKyAgICAqLworICAgaWYgKGlzX3J0KQorICAgICAgYXNzZXJ0KG9mZnNldCAlIGVsZW1fc2l6ZSA9PSAwKTsKKworICAgLyoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA3NzoKKyAgICAqCisgICAgKiAgICAgIkZvciBidWZmZXIgc3VyZmFjZXMsIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYnVmZmVyIHJhbmdlcworICAgICogICAgICBmcm9tIDEgdG8gMl4yNy4iCisgICAgKi8KKyAgIGFzc2VydChudW1fZW50cmllcyA+PSAxICYmIG51bV9lbnRyaWVzIDw9IDEgPDwgMjcpOworCisgICAvKgorICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDgxOgorICAgICoKKyAgICAqICAgICAiRm9yIHN1cmZhY2VzIG9mIHR5cGUgU1VSRlRZUEVfQlVGRkVSLCB0aGlzIGZpZWxkIChTdXJmYWNlIFBpdGNoKQorICAgICogICAgICBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZS4iCisgICAgKi8KKyAgIHBpdGNoID0gc3RydWN0X3NpemU7CisKKyAgIHBpdGNoLS07CisgICBudW1fZW50cmllcy0tOworICAgLyogYml0cyBbNjowXSAqLworICAgd2lkdGggID0gKG51bV9lbnRyaWVzICYgMHgwMDAwMDA3Zik7CisgICAvKiBiaXRzIFsxOTo3XSAqLworICAgaGVpZ2h0ID0gKG51bV9lbnRyaWVzICYgMHgwMDBmZmY4MCkgPj4gNzsKKyAgIC8qIGJpdHMgWzI2OjIwXSAqLworICAgZGVwdGggID0gKG51bV9lbnRyaWVzICYgMHgwN2YwMDAwMCkgPj4gMjA7CisKKyAgIGR3WzBdID0gR0VONl9TVVJGVFlQRV9CVUZGRVIgPDwgR0VONl9TVVJGQUNFX0RXMF9UWVBFX19TSElGVCB8CisgICAgICAgICAgIHN1cmZhY2VfZm9ybWF0IDw8IEdFTjZfU1VSRkFDRV9EVzBfRk9STUFUX19TSElGVDsKKyAgIGlmIChyZW5kZXJfY2FjaGVfcncpCisgICAgICBkd1swXSB8PSBHRU42X1NVUkZBQ0VfRFcwX1JFTkRFUl9DQUNIRV9SVzsKKworICAgZHdbMV0gPSBvZmZzZXQ7CisKKyAgIGR3WzJdID0gaGVpZ2h0IDw8IEdFTjZfU1VSRkFDRV9EVzJfSEVJR0hUX19TSElGVCB8CisgICAgICAgICAgIHdpZHRoIDw8IEdFTjZfU1VSRkFDRV9EVzJfV0lEVEhfX1NISUZUOworCisgICBkd1szXSA9IGRlcHRoIDw8IEdFTjZfU1VSRkFDRV9EVzNfREVQVEhfX1NISUZUIHwKKyAgICAgICAgICAgcGl0Y2ggPDwgR0VONl9TVVJGQUNFX0RXM19QSVRDSF9fU0hJRlQ7CisKKyAgIGR3WzRdID0gMDsKKyAgIGR3WzVdID0gMDsKK30KKworc3RhdGljIHZvaWQgc3VyZmFjZV9zdGF0ZV90ZXhfZ2VuNihjb25zdCBzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZVZpZXdUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlyc3RfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9sZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZpcnN0X2xheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1s2XSkKK3sKKyAgIGludCBzdXJmYWNlX3R5cGUsIHN1cmZhY2VfZm9ybWF0OworICAgaW50IHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwaXRjaCwgbG9kOworCisgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNiwgNik7CisKKyAgIHN1cmZhY2VfdHlwZSA9IHZpZXdfdHlwZV90b19zdXJmYWNlX3R5cGUodHlwZSk7CisgICBhc3NlcnQoc3VyZmFjZV90eXBlICE9IEdFTjZfU1VSRlRZUEVfQlVGRkVSKTsKKworICAgc3VyZmFjZV9mb3JtYXQgPSBpbnRlbF9mb3JtYXRfdHJhbnNsYXRlX2NvbG9yKGdwdSwgZm9ybWF0KTsKKyAgIGFzc2VydChzdXJmYWNlX2Zvcm1hdCA+PSAwKTsKKworICAgd2lkdGggPSBpbWctPmxheW91dC53aWR0aDA7CisgICBoZWlnaHQgPSBpbWctPmxheW91dC5oZWlnaHQwOworICAgZGVwdGggPSAodHlwZSA9PSBWS19JTUFHRV9WSUVXX1RZUEVfM0QpID8KKyAgICAgIGltZy0+ZGVwdGggOiBudW1fbGF5ZXJzOworICAgcGl0Y2ggPSBpbWctPmxheW91dC5ib19zdHJpZGU7CisKKyAgIGlmIChzdXJmYWNlX3R5cGUgPT0gR0VONl9TVVJGVFlQRV9DVUJFKSB7CisgICAgICAvKgorICAgICAgICogRnJvbSB0aGUgU2FuZHkgQnJpZGdlIFBSTSwgdm9sdW1lIDQgcGFydCAxLCBwYWdlIDgxOgorICAgICAgICoKKyAgICAgICAqICAgICAiRm9yIFNVUkZUWVBFX0NVQkU6IFtEZXZTTkIrXTogZm9yIFNhbXBsaW5nIEVuZ2luZSBTdXJmYWNlcywgdGhlCisgICAgICAgKiAgICAgIHJhbmdlIG9mIHRoaXMgZmllbGQgKERlcHRoKSBpcyBbMCw4NF0sIGluZGljYXRpbmcgdGhlIG51bWJlciBvZgorICAgICAgICogICAgICBjdWJlIGFycmF5IGVsZW1lbnRzIChlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHVuZGVybHlpbmcgMkQgYXJyYXkKKyAgICAgICAqICAgICAgZWxlbWVudHMgZGl2aWRlZCBieSA2KS4gRm9yIG90aGVyIHN1cmZhY2VzLCB0aGlzIGZpZWxkIG11c3QgYmUKKyAgICAgICAqICAgICAgemVyby4iCisgICAgICAgKgorICAgICAgICogV2hlbiBpc19ydCBpcyB0cnVlLCB3ZSB0cmVhdCB0aGUgdGV4dHVyZSBhcyBhIDJEIG9uZSB0byBhdm9pZCB0aGUKKyAgICAgICAqIHJlc3RyaWN0aW9uLgorICAgICAgICovCisgICAgICBpZiAoaXNfcnQpIHsKKyAgICAgICAgIHN1cmZhY2VfdHlwZSA9IEdFTjZfU1VSRlRZUEVfMkQ7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIGFzc2VydChudW1fbGF5ZXJzICUgNiA9PSAwKTsKKyAgICAgICAgIGRlcHRoID0gbnVtX2xheWVycyAvIDY7CisgICAgICB9CisgICB9CisKKyAgIC8qIHNhbml0eSBjaGVjayB0aGUgc2l6ZSAqLworICAgYXNzZXJ0KHdpZHRoID49IDEgJiYgaGVpZ2h0ID49IDEgJiYgZGVwdGggPj0gMSAmJiBwaXRjaCA+PSAxKTsKKyAgIHN3aXRjaCAoc3VyZmFjZV90eXBlKSB7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfMUQ6CisgICAgICBhc3NlcnQod2lkdGggPD0gODE5MiAmJiBoZWlnaHQgPT0gMSAmJiBkZXB0aCA8PSA1MTIpOworICAgICAgYXNzZXJ0KGZpcnN0X2xheWVyIDwgNTEyICYmIG51bV9sYXllcnMgPD0gNTEyKTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBHRU42X1NVUkZUWVBFXzJEOgorICAgICAgYXNzZXJ0KHdpZHRoIDw9IDgxOTIgJiYgaGVpZ2h0IDw9IDgxOTIgJiYgZGVwdGggPD0gNTEyKTsKKyAgICAgIGFzc2VydChmaXJzdF9sYXllciA8IDUxMiAmJiBudW1fbGF5ZXJzIDw9IDUxMik7CisgICAgICBicmVhazsKKyAgIGNhc2UgR0VONl9TVVJGVFlQRV8zRDoKKyAgICAgIGFzc2VydCh3aWR0aCA8PSAyMDQ4ICYmIGhlaWdodCA8PSAyMDQ4ICYmIGRlcHRoIDw9IDIwNDgpOworICAgICAgYXNzZXJ0KGZpcnN0X2xheWVyIDwgMjA0OCAmJiBudW1fbGF5ZXJzIDw9IDUxMik7CisgICAgICBpZiAoIWlzX3J0KQorICAgICAgICAgYXNzZXJ0KGZpcnN0X2xheWVyID09IDApOworICAgICAgYnJlYWs7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfQ1VCRToKKyAgICAgIGFzc2VydCh3aWR0aCA8PSA4MTkyICYmIGhlaWdodCA8PSA4MTkyICYmIGRlcHRoIDw9IDg1KTsKKyAgICAgIGFzc2VydCh3aWR0aCA9PSBoZWlnaHQpOworICAgICAgYXNzZXJ0KGZpcnN0X2xheWVyIDwgNTEyICYmIG51bV9sYXllcnMgPD0gNTEyKTsKKyAgICAgIGlmIChpc19ydCkKKyAgICAgICAgIGFzc2VydChmaXJzdF9sYXllciA9PSAwKTsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVuZXhwZWN0ZWQgc3VyZmFjZSB0eXBlIik7CisgICAgICBicmVhazsKKyAgIH0KKworICAgLyogbm9uLWZ1bGwgYXJyYXkgc3BhY2luZyBpcyBzdXBwb3J0ZWQgb25seSBvbiBHRU43KyAqLworICAgYXNzZXJ0KGltZy0+bGF5b3V0LndhbGsgIT0gSU5URUxfTEFZT1VUX1dBTEtfTE9EKTsKKyAgIC8qIG5vbi1pbnRlcmxlYXZlZCBzYW1wbGVzIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBHRU43KyAqLworICAgaWYgKGltZy0+c2FtcGxlX2NvdW50ID4gMSkKKyAgICAgIGFzc2VydChpbWctPmxheW91dC5pbnRlcmxlYXZlZF9zYW1wbGVzKTsKKworICAgaWYgKGlzX3J0KSB7CisgICAgICBhc3NlcnQobnVtX2xldmVscyA9PSAxKTsKKyAgICAgIGxvZCA9IGZpcnN0X2xldmVsOworICAgfQorICAgZWxzZSB7CisgICAgICBsb2QgPSBudW1fbGV2ZWxzIC0gMTsKKyAgIH0KKworICAgLyoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA3NjoKKyAgICAqCisgICAgKiAgICAgIkxpbmVhciByZW5kZXIgdGFyZ2V0IHN1cmZhY2UgYmFzZSBhZGRyZXNzZXMgbXVzdCBiZSBlbGVtZW50LXNpemUKKyAgICAqICAgICAgYWxpZ25lZCwgZm9yIG5vbi1ZVVYgc3VyZmFjZSBmb3JtYXRzLCBvciBhIG11bHRpcGxlIG9mIDIKKyAgICAqICAgICAgZWxlbWVudC1zaXplcyBmb3IgWVVWIHN1cmZhY2UgZm9ybWF0cy4gT3RoZXIgbGluZWFyIHN1cmZhY2VzIGhhdmUKKyAgICAqICAgICAgbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50cyAoYnl0ZSBhbGlnbm1lbnQgaXMgc3VmZmljaWVudC4pIgorICAgICoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA4MToKKyAgICAqCisgICAgKiAgICAgIkZvciBsaW5lYXIgcmVuZGVyIHRhcmdldCBzdXJmYWNlcywgdGhlIHBpdGNoIG11c3QgYmUgYSBtdWx0aXBsZQorICAgICogICAgICBvZiB0aGUgZWxlbWVudCBzaXplIGZvciBub24tWVVWIHN1cmZhY2UgZm9ybWF0cy4gUGl0Y2ggbXVzdCBiZSBhCisgICAgKiAgICAgIG11bHRpcGxlIG9mIDIgKiBlbGVtZW50IHNpemUgZm9yIFlVViBzdXJmYWNlIGZvcm1hdHMuIgorICAgICoKKyAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSA0IHBhcnQgMSwgcGFnZSA4NjoKKyAgICAqCisgICAgKiAgICAgIkZvciBsaW5lYXIgc3VyZmFjZXMsIHRoaXMgZmllbGQgKFggT2Zmc2V0KSBtdXN0IGJlIHplcm8iCisgICAgKi8KKyAgIGlmIChpbWctPmxheW91dC50aWxpbmcgPT0gR0VONl9USUxJTkdfTk9ORSkgeworICAgICAgaWYgKGlzX3J0KSB7CisgICAgICAgICBjb25zdCBpbnQgZWxlbV9zaXplIFVfQVNTRVJUX09OTFkgPSBpY2RfZm9ybWF0X2dldF9zaXplKGZvcm1hdCk7CisgICAgICAgICBhc3NlcnQocGl0Y2ggJSBlbGVtX3NpemUgPT0gMCk7CisgICAgICB9CisgICB9CisKKyAgIGR3WzBdID0gc3VyZmFjZV90eXBlIDw8IEdFTjZfU1VSRkFDRV9EVzBfVFlQRV9fU0hJRlQgfAorICAgICAgICAgICBzdXJmYWNlX2Zvcm1hdCA8PCBHRU42X1NVUkZBQ0VfRFcwX0ZPUk1BVF9fU0hJRlQgfAorICAgICAgICAgICBHRU42X1NVUkZBQ0VfRFcwX01JUExBWU9VVF9CRUxPVzsKKworICAgaWYgKHN1cmZhY2VfdHlwZSA9PSBHRU42X1NVUkZUWVBFX0NVQkUgJiYgIWlzX3J0KSB7CisgICAgICBkd1swXSB8PSAxIDw8IDkgfAorICAgICAgICAgICAgICAgR0VONl9TVVJGQUNFX0RXMF9DVUJFX0ZBQ0VfRU5BQkxFU19fTUFTSzsKKyAgIH0KKworICAgaWYgKGlzX3J0KQorICAgICAgZHdbMF0gfD0gR0VONl9TVVJGQUNFX0RXMF9SRU5ERVJfQ0FDSEVfUlc7CisKKyAgIGR3WzFdID0gMDsKKworICAgZHdbMl0gPSAoaGVpZ2h0IC0gMSkgPDwgR0VONl9TVVJGQUNFX0RXMl9IRUlHSFRfX1NISUZUIHwKKyAgICAgICAgICAgKHdpZHRoIC0gMSkgPDwgR0VONl9TVVJGQUNFX0RXMl9XSURUSF9fU0hJRlQgfAorICAgICAgICAgICBsb2QgPDwgR0VONl9TVVJGQUNFX0RXMl9NSVBfQ09VTlRfTE9EX19TSElGVDsKKworICAgYXNzZXJ0KGltZy0+bGF5b3V0LnRpbGluZyAhPSBHRU44X1RJTElOR19XKTsKKyAgIGR3WzNdID0gKGRlcHRoIC0gMSkgPDwgR0VONl9TVVJGQUNFX0RXM19ERVBUSF9fU0hJRlQgfAorICAgICAgICAgICAocGl0Y2ggLSAxKSA8PCBHRU42X1NVUkZBQ0VfRFczX1BJVENIX19TSElGVCB8CisgICAgICAgICAgIGltZy0+bGF5b3V0LnRpbGluZzsKKworICAgZHdbNF0gPSBmaXJzdF9sZXZlbCA8PCBHRU42X1NVUkZBQ0VfRFc0X01JTl9MT0RfX1NISUZUIHwKKyAgICAgICAgICAgZmlyc3RfbGF5ZXIgPDwgMTcgfAorICAgICAgICAgICAobnVtX2xheWVycyAtIDEpIDw8IDggfAorICAgICAgICAgICAoKGltZy0+c2FtcGxlX2NvdW50ID4gMSkgPyBHRU42X1NVUkZBQ0VfRFc0X01VTFRJU0FNUExFQ09VTlRfNCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfU1VSRkFDRV9EVzRfTVVMVElTQU1QTEVDT1VOVF8xKTsKKworICAgZHdbNV0gPSAwOworCisgICBhc3NlcnQoaW1nLT5sYXlvdXQuYWxpZ25faiA9PSAyIHx8IGltZy0+bGF5b3V0LmFsaWduX2ogPT0gNCk7CisgICBpZiAoaW1nLT5sYXlvdXQuYWxpZ25faiA9PSA0KQorICAgICAgZHdbNV0gfD0gR0VONl9TVVJGQUNFX0RXNV9WQUxJR05fNDsKK30KKworc3RydWN0IGRzX3N1cmZhY2VfaW5mbyB7CisgICBpbnQgc3VyZmFjZV90eXBlOworICAgaW50IGZvcm1hdDsKKworICAgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIHN0cmlkZTsKKyAgICAgIHVuc2lnbmVkIG9mZnNldDsKKyAgIH0genMsIHN0ZW5jaWwsIGhpejsKKworICAgdW5zaWduZWQgd2lkdGgsIGhlaWdodCwgZGVwdGg7CisgICB1bnNpZ25lZCBsb2QsIGZpcnN0X2xheWVyLCBudW1fbGF5ZXJzOworfTsKKworc3RhdGljIHZvaWQKK2RzX2luaXRfaW5mb19udWxsKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkc19zdXJmYWNlX2luZm8gKmluZm8pCit7CisgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNiwgNy41KTsKKworICAgbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisgICBpbmZvLT5zdXJmYWNlX3R5cGUgPSBHRU42X1NVUkZUWVBFX05VTEw7CisgICBpbmZvLT5mb3JtYXQgPSBHRU42X1pGT1JNQVRfRDMyX0ZMT0FUOworICAgaW5mby0+d2lkdGggPSAxOworICAgaW5mby0+aGVpZ2h0ID0gMTsKKyAgIGluZm8tPmRlcHRoID0gMTsKKyAgIGluZm8tPm51bV9sYXllcnMgPSAxOworfQorCitzdGF0aWMgdm9pZAorZHNfaW5pdF9pbmZvKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfaW1nICppbWcsCisgICAgICAgICAgICAgVmtJbWFnZVZpZXdUeXBlIHZpZXdfdHlwZSwKKyAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQsIHVuc2lnbmVkIGxldmVsLAorICAgICAgICAgICAgIHVuc2lnbmVkIGZpcnN0X2xheWVyLCB1bnNpZ25lZCBudW1fbGF5ZXJzLAorICAgICAgICAgICAgIHN0cnVjdCBkc19zdXJmYWNlX2luZm8gKmluZm8pCit7CisgICBib29sIHNlcGFyYXRlX3N0ZW5jaWw7CisKKyAgIElOVEVMX0dQVV9BU1NFUlQoZ3B1LCA2LCA3LjUpOworCisgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKyAgIGluZm8tPnN1cmZhY2VfdHlwZSA9IHZpZXdfdHlwZV90b19zdXJmYWNlX3R5cGUodmlld190eXBlKTsKKworICAgaWYgKGluZm8tPnN1cmZhY2VfdHlwZSA9PSBHRU42X1NVUkZUWVBFX0NVQkUpIHsKKyAgICAgIC8qCisgICAgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzI1LTMyNjoKKyAgICAgICAqCisgICAgICAgKiAgICAgIkZvciBPdGhlciBTdXJmYWNlcyAoQ3ViZSBTdXJmYWNlcyk6CisgICAgICAgKiAgICAgIFRoaXMgZmllbGQgKE1pbmltdW0gQXJyYXkgRWxlbWVudCkgaXMgaWdub3JlZC4iCisgICAgICAgKgorICAgICAgICogICAgICJGb3IgT3RoZXIgU3VyZmFjZXMgKEN1YmUgU3VyZmFjZXMpOgorICAgICAgICogICAgICBUaGlzIGZpZWxkIChSZW5kZXIgVGFyZ2V0IFZpZXcgRXh0ZW50KSBpcyBpZ25vcmVkLiIKKyAgICAgICAqCisgICAgICAgKiBBcyBzdWNoLCB3ZSBjYW5ub3Qgc2V0IGZpcnN0X2xheWVyIGFuZCBudW1fbGF5ZXJzIG9uIGN1YmUgc3VyZmFjZXMuCisgICAgICAgKiBUbyB3b3JrIGFyb3VuZCB0aGF0LCB0cmVhdCBpdCBhcyBhIDJEIHN1cmZhY2UuCisgICAgICAgKi8KKyAgICAgIGluZm8tPnN1cmZhY2VfdHlwZSA9IEdFTjZfU1VSRlRZUEVfMkQ7CisgICB9CisKKyAgIGlmIChpbnRlbF9ncHVfZ2VuKGdwdSkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICBzZXBhcmF0ZV9zdGVuY2lsID0gdHJ1ZTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSAzMTc6CisgICAgICAgKgorICAgICAgICogICAgICJUaGlzIGZpZWxkIChTZXBhcmF0ZSBTdGVuY2lsIEJ1ZmZlciBFbmFibGUpIG11c3QgYmUgc2V0IHRvIHRoZQorICAgICAgICogICAgICBzYW1lIHZhbHVlIChlbmFibGVkIG9yIGRpc2FibGVkKSBhcyBIaWVyYXJjaGljYWwgRGVwdGggQnVmZmVyCisgICAgICAgKiAgICAgIEVuYWJsZS4iCisgICAgICAgKi8KKyAgICAgIHNlcGFyYXRlX3N0ZW5jaWwgPSBpbnRlbF9pbWdfY2FuX2VuYWJsZV9oaXooaW1nLCBsZXZlbCk7CisgICB9CisKKyAgIC8qCisgICAgKiBGcm9tIHRoZSBTYW5keSBCcmlkZ2UgUFJNLCB2b2x1bWUgMiBwYXJ0IDEsIHBhZ2UgMzE3OgorICAgICoKKyAgICAqICAgICAiSWYgdGhpcyBmaWVsZCAoSGllcmFyY2hpY2FsIERlcHRoIEJ1ZmZlciBFbmFibGUpIGlzIGVuYWJsZWQsIHRoZQorICAgICogICAgICBTdXJmYWNlIEZvcm1hdCBvZiB0aGUgZGVwdGggYnVmZmVyIGNhbm5vdCBiZQorICAgICogICAgICBEMzJfRkxPQVRfUzhYMjRfVUlOVCBvciBEMjRfVU5PUk1fUzhfVUlOVC4gVXNlIG9mIHN0ZW5jaWwKKyAgICAqICAgICAgcmVxdWlyZXMgdGhlIHNlcGFyYXRlIHN0ZW5jaWwgYnVmZmVyLiIKKyAgICAqCisgICAgKiBGcm9tIHRoZSBJcm9ubGFrZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSAzMzA6CisgICAgKgorICAgICogICAgICJJZiB0aGlzIGZpZWxkIChTZXBhcmF0ZSBTdGVuY2lsIEJ1ZmZlciBFbmFibGUpIGlzIGRpc2FibGVkLCB0aGUKKyAgICAqICAgICAgU3VyZmFjZSBGb3JtYXQgb2YgdGhlIGRlcHRoIGJ1ZmZlciBjYW5ub3QgYmUgRDI0X1VOT1JNX1g4X1VJTlQuIgorICAgICoKKyAgICAqIFRoZXJlIGlzIG5vIHNpbWlsYXIgcmVzdHJpY3Rpb24gZm9yIEdFTjYuICBCdXQgd2hlbiBEMjRfVU5PUk1fWDhfVUlOVAorICAgICogaXMgaW5kZWVkIHVzZWQsIHRoZSBkZXB0aCB2YWx1ZXMgb3V0cHV0IGJ5IHRoZSBmcmFnbWVudCBzaGFkZXJzIHdpbGwKKyAgICAqIGJlIGRpZmZlcmVudCB3aGVuIHJlYWQgYmFjay4KKyAgICAqCisgICAgKiBBcyBmb3IgR0VONyssIHNlcGFyYXRlX3N0ZW5jaWwgaXMgYWx3YXlzIHRydWUuCisgICAgKi8KKyAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICBjYXNlIFZLX0ZPUk1BVF9EMTZfVU5PUk06CisgICAgICBpbmZvLT5mb3JtYXQgPSBHRU42X1pGT1JNQVRfRDE2X1VOT1JNOworICAgICAgYnJlYWs7CisgICBjYXNlIFZLX0ZPUk1BVF9EMzJfU0ZMT0FUOgorICAgICAgaW5mby0+Zm9ybWF0ID0gR0VONl9aRk9STUFUX0QzMl9GTE9BVDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBWS19GT1JNQVRfRDMyX1NGTE9BVF9TOF9VSU5UOgorICAgICAgaW5mby0+Zm9ybWF0ID0gKHNlcGFyYXRlX3N0ZW5jaWwpID8KKyAgICAgICAgIEdFTjZfWkZPUk1BVF9EMzJfRkxPQVQgOgorICAgICAgICAgR0VONl9aRk9STUFUX0QzMl9GTE9BVF9TOFgyNF9VSU5UOworICAgICAgYnJlYWs7CisgICBjYXNlIFZLX0ZPUk1BVF9TOF9VSU5UOgorICAgICAgaWYgKHNlcGFyYXRlX3N0ZW5jaWwpIHsKKyAgICAgICAgIGluZm8tPmZvcm1hdCA9IEdFTjZfWkZPUk1BVF9EMzJfRkxPQVQ7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCghInVuc3VwcG9ydGVkIGRlcHRoL3N0ZW5jaWwgZm9ybWF0Iik7CisgICAgICBkc19pbml0X2luZm9fbnVsbChncHUsIGluZm8pOworICAgICAgcmV0dXJuOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmIChmb3JtYXQgIT0gVktfRk9STUFUX1M4X1VJTlQpCisgICAgICBpbmZvLT56cy5zdHJpZGUgPSBpbWctPmxheW91dC5ib19zdHJpZGU7CisKKyAgIGlmIChpbWctPnM4X2xheW91dCkgeworICAgICAgLyoKKyAgICAgICAqIEZyb20gdGhlIFNhbmR5IEJyaWRnZSBQUk0sIHZvbHVtZSAyIHBhcnQgMSwgcGFnZSAzMjk6CisgICAgICAgKgorICAgICAgICogICAgICJUaGUgcGl0Y2ggbXVzdCBiZSBzZXQgdG8gMnggdGhlIHZhbHVlIGNvbXB1dGVkIGJhc2VkIG9uIHdpZHRoLAorICAgICAgICogICAgICAgYXMgdGhlIHN0ZW5jaWwgYnVmZmVyIGlzIHN0b3JlZCB3aXRoIHR3byByb3dzIGludGVybGVhdmVkLiIKKyAgICAgICAqCisgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIGNsYXNzaWMgZHJpdmVyLCB3ZSBuZWVkIHRvIGRvIHRoZSBzYW1lIGZvciBHRU43KworICAgICAgICogZXZlbiB0aG91Z2ggdGhlIEl2eSBCcmlkZ2UgUFJNIGRvZXMgbm90IHNheSBhbnl0aGluZyBhYm91dCBpdC4KKyAgICAgICAqLworICAgICAgaW5mby0+c3RlbmNpbC5zdHJpZGUgPSBpbWctPnM4X2xheW91dC0+Ym9fc3RyaWRlICogMjsKKworICAgICAgaWYgKGludGVsX2dwdV9nZW4oZ3B1KSA9PSBJTlRFTF9HRU4oNikpIHsKKyAgICAgICAgIHVuc2lnbmVkIHgsIHk7CisKKyAgICAgICAgIGFzc2VydChpbWctPnM4X2xheW91dC0+d2FsayA9PSBJTlRFTF9MQVlPVVRfV0FMS19MT0QpOworCisgICAgICAgICAvKiBvZmZzZXQgdG8gdGhlIGxldmVsICovCisgICAgICAgICBpbnRlbF9sYXlvdXRfZ2V0X3NsaWNlX3BvcyhpbWctPnM4X2xheW91dCwgbGV2ZWwsIDAsICZ4LCAmeSk7CisgICAgICAgICBpbnRlbF9sYXlvdXRfcG9zX3RvX21lbShpbWctPnM4X2xheW91dCwgeCwgeSwgJngsICZ5KTsKKyAgICAgICAgIGluZm8tPnN0ZW5jaWwub2Zmc2V0ID0gaW50ZWxfbGF5b3V0X21lbV90b19yYXcoaW1nLT5zOF9sYXlvdXQsIHgsIHkpOworICAgICAgfQorICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gVktfRk9STUFUX1M4X1VJTlQpIHsKKyAgICAgIGluZm8tPnN0ZW5jaWwuc3RyaWRlID0gaW1nLT5sYXlvdXQuYm9fc3RyaWRlICogMjsKKyAgIH0KKworICAgaWYgKGludGVsX2ltZ19jYW5fZW5hYmxlX2hpeihpbWcsIGxldmVsKSkgeworICAgICAgaW5mby0+aGl6LnN0cmlkZSA9IGltZy0+bGF5b3V0LmF1eF9zdHJpZGU7CisKKyAgICAgIC8qIG9mZnNldCB0byB0aGUgbGV2ZWwgKi8KKyAgICAgIGlmIChpbnRlbF9ncHVfZ2VuKGdwdSkgPT0gSU5URUxfR0VOKDYpKQorICAgICAgICAgIGluZm8tPmhpei5vZmZzZXQgPSBpbWctPmxheW91dC5hdXhfb2Zmc2V0c1tsZXZlbF07CisgICB9CisKKyAgIGluZm8tPndpZHRoID0gaW1nLT5sYXlvdXQud2lkdGgwOworICAgaW5mby0+aGVpZ2h0ID0gaW1nLT5sYXlvdXQuaGVpZ2h0MDsKKyAgIGluZm8tPmRlcHRoID0gKGltZy0+dHlwZSA9PSBWS19JTUFHRV9UWVBFXzNEKSA/CisgICAgICBpbWctPmRlcHRoIDogbnVtX2xheWVyczsKKworICAgaW5mby0+bG9kID0gbGV2ZWw7CisgICBpbmZvLT5maXJzdF9sYXllciA9IGZpcnN0X2xheWVyOworICAgaW5mby0+bnVtX2xheWVycyA9IG51bV9sYXllcnM7Cit9CisKK3N0YXRpYyB2b2lkIGF0dF92aWV3X2luaXRfZm9yX2RzKHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VWaWV3VHlwZSB2aWV3X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQsIHVuc2lnbmVkIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlyc3RfbGF5ZXIsIHVuc2lnbmVkIG51bV9sYXllcnMpCit7CisgICBjb25zdCBpbnQgbWF4XzJkX3NpemUgVV9BU1NFUlRfT05MWSA9CisgICAgICAgKGludGVsX2dwdV9nZW4oZ3B1KSA+PSBJTlRFTF9HRU4oNykpID8gMTYzODQgOiA4MTkyOworICAgY29uc3QgaW50IG1heF9hcnJheV9zaXplIFVfQVNTRVJUX09OTFkgPQorICAgICAgIChpbnRlbF9ncHVfZ2VuKGdwdSkgPj0gSU5URUxfR0VOKDcpKSA/IDIwNDggOiA1MTI7CisgICBzdHJ1Y3QgZHNfc3VyZmFjZV9pbmZvIGluZm87CisgICB1aW50MzJfdCBkdzEsIGR3MiwgZHczLCBkdzQsIGR3NSwgZHc2OworICAgdWludDMyX3QgKmR3OworCisgICBJTlRFTF9HUFVfQVNTRVJUKGdwdSwgNiwgNy41KTsKKworICAgaWYgKGltZykgeworICAgICAgZHNfaW5pdF9pbmZvKGdwdSwgaW1nLCB2aWV3X3R5cGUsIGZvcm1hdCwgbGV2ZWwsCisgICAgICAgICAgICAgIGZpcnN0X2xheWVyLCBudW1fbGF5ZXJzLCAmaW5mbyk7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGRzX2luaXRfaW5mb19udWxsKGdwdSwgJmluZm8pOworICAgfQorCisgICBzd2l0Y2ggKGluZm8uc3VyZmFjZV90eXBlKSB7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfTlVMTDoKKyAgICAgIGJyZWFrOworICAgY2FzZSBHRU42X1NVUkZUWVBFXzFEOgorICAgICAgYXNzZXJ0KGluZm8ud2lkdGggPD0gbWF4XzJkX3NpemUgJiYgaW5mby5oZWlnaHQgPT0gMSAmJgorICAgICAgICAgICAgIGluZm8uZGVwdGggPD0gbWF4X2FycmF5X3NpemUpOworICAgICAgYXNzZXJ0KGluZm8uZmlyc3RfbGF5ZXIgPCBtYXhfYXJyYXlfc2l6ZSAtIDEgJiYKKyAgICAgICAgICAgICBpbmZvLm51bV9sYXllcnMgPD0gbWF4X2FycmF5X3NpemUpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfMkQ6CisgICAgICBhc3NlcnQoaW5mby53aWR0aCA8PSBtYXhfMmRfc2l6ZSAmJiBpbmZvLmhlaWdodCA8PSBtYXhfMmRfc2l6ZSAmJgorICAgICAgICAgICAgIGluZm8uZGVwdGggPD0gbWF4X2FycmF5X3NpemUpOworICAgICAgYXNzZXJ0KGluZm8uZmlyc3RfbGF5ZXIgPCBtYXhfYXJyYXlfc2l6ZSAtIDEgJiYKKyAgICAgICAgICAgICBpbmZvLm51bV9sYXllcnMgPD0gbWF4X2FycmF5X3NpemUpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfM0Q6CisgICAgICBhc3NlcnQoaW5mby53aWR0aCA8PSAyMDQ4ICYmIGluZm8uaGVpZ2h0IDw9IDIwNDggJiYgaW5mby5kZXB0aCA8PSAyMDQ4KTsKKyAgICAgIGFzc2VydChpbmZvLmZpcnN0X2xheWVyIDwgMjA0OCAmJiBpbmZvLm51bV9sYXllcnMgPD0gbWF4X2FycmF5X3NpemUpOworICAgICAgYnJlYWs7CisgICBjYXNlIEdFTjZfU1VSRlRZUEVfQ1VCRToKKyAgICAgIGFzc2VydChpbmZvLndpZHRoIDw9IG1heF8yZF9zaXplICYmIGluZm8uaGVpZ2h0IDw9IG1heF8yZF9zaXplICYmCisgICAgICAgICAgICAgaW5mby5kZXB0aCA9PSAxKTsKKyAgICAgIGFzc2VydChpbmZvLmZpcnN0X2xheWVyID09IDAgJiYgaW5mby5udW1fbGF5ZXJzID09IDEpOworICAgICAgYXNzZXJ0KGluZm8ud2lkdGggPT0gaW5mby5oZWlnaHQpOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KCEidW5leHBlY3RlZCBkZXB0aCBzdXJmYWNlIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICBkdzEgPSBpbmZvLnN1cmZhY2VfdHlwZSA8PCAyOSB8CisgICAgICAgICBpbmZvLmZvcm1hdCA8PCAxODsKKworICAgaWYgKGluZm8uenMuc3RyaWRlKSB7CisgICAgICAvKiByZXF1aXJlZCBmb3IgR0VONisgKi8KKyAgICAgIGFzc2VydChpbmZvLnpzLnN0cmlkZSA+IDAgJiYgaW5mby56cy5zdHJpZGUgPCAxMjggKiAxMDI0ICYmCisgICAgICAgICAgICBpbmZvLnpzLnN0cmlkZSAlIDEyOCA9PSAwKTsKKyAgICAgIGFzc2VydChpbmZvLndpZHRoIDw9IGluZm8uenMuc3RyaWRlKTsKKworICAgICAgZHcxIHw9IChpbmZvLnpzLnN0cmlkZSAtIDEpOworICAgfQorCisgICBkdzIgPSAwOworCisgICBpZiAoaW50ZWxfZ3B1X2dlbihncHUpID49IElOVEVMX0dFTig3KSkgeworICAgICAgaWYgKGluZm8uenMuc3RyaWRlKQorICAgICAgICAgZHcxIHw9IDEgPDwgMjg7CisKKyAgICAgIGlmIChpbmZvLnN0ZW5jaWwuc3RyaWRlKQorICAgICAgICAgZHcxIHw9IDEgPDwgMjc7CisKKyAgICAgIGlmIChpbmZvLmhpei5zdHJpZGUpCisgICAgICAgICBkdzEgfD0gMSA8PCAyMjsKKworICAgICAgZHczID0gKGluZm8uaGVpZ2h0IC0gMSkgPDwgMTggfAorICAgICAgICAgICAgKGluZm8ud2lkdGggLSAxKSA8PCA0IHwKKyAgICAgICAgICAgIGluZm8ubG9kOworCisgICAgICBkdzQgPSAoaW5mby5kZXB0aCAtIDEpIDw8IDIxIHwKKyAgICAgICAgICAgIGluZm8uZmlyc3RfbGF5ZXIgPDwgMTAgfAorICAgICAgICAgICAgR0VON19NT0NTX0wzX1dCOworCisgICAgICBkdzUgPSAwOworCisgICAgICBkdzYgPSAoaW5mby5udW1fbGF5ZXJzIC0gMSkgPDwgMjE7CisgICB9CisgICBlbHNlIHsKKyAgICAgIC8qIGFsd2F5cyBZLXRpbGVkICovCisgICAgICBkdzEgfD0gMSA8PCAyNyB8CisgICAgICAgICAgICAgMSA8PCAyNjsKKworICAgICAgaWYgKGluZm8uaGl6LnN0cmlkZSkgeworICAgICAgICAgZHcxIHw9IDEgPDwgMjIgfAorICAgICAgICAgICAgICAgIDEgPDwgMjE7CisgICAgICB9CisKKyAgICAgIGR3MyA9IChpbmZvLmhlaWdodCAtIDEpIDw8IDE5IHwKKyAgICAgICAgICAgIChpbmZvLndpZHRoIC0gMSkgPDwgNiB8CisgICAgICAgICAgICBpbmZvLmxvZCA8PCAyIHwKKyAgICAgICAgICAgIEdFTjZfREVQVEhfRFczX01JUExBWU9VVF9CRUxPVzsKKworICAgICAgZHc0ID0gKGluZm8uZGVwdGggLSAxKSA8PCAyMSB8CisgICAgICAgICAgICBpbmZvLmZpcnN0X2xheWVyIDw8IDEwIHwKKyAgICAgICAgICAgIChpbmZvLm51bV9sYXllcnMgLSAxKSA8PCAxOworCisgICAgICBkdzUgPSAwOworCisgICAgICBkdzYgPSAwOworICAgfQorCisgICBTVEFUSUNfQVNTRVJUKEFSUkFZX1NJWkUodmlldy0+YXR0X2NtZCkgPj0gMTApOworICAgZHcgPSB2aWV3LT5hdHRfY21kOworCisgICBkd1swXSA9IGR3MTsKKyAgIGR3WzFdID0gZHcyOworICAgZHdbMl0gPSBkdzM7CisgICBkd1szXSA9IGR3NDsKKyAgIGR3WzRdID0gZHc1OworICAgZHdbNV0gPSBkdzY7CisKKyAgIC8qIHNlcGFyYXRlIHN0ZW5jaWwgKi8KKyAgIGlmIChpbmZvLnN0ZW5jaWwuc3RyaWRlKSB7CisgICAgICBhc3NlcnQoaW5mby5zdGVuY2lsLnN0cmlkZSA+IDAgJiYgaW5mby5zdGVuY2lsLnN0cmlkZSA8IDEyOCAqIDEwMjQgJiYKKyAgICAgICAgICAgICBpbmZvLnN0ZW5jaWwuc3RyaWRlICUgMTI4ID09IDApOworCisgICAgICBkd1s2XSA9IGluZm8uc3RlbmNpbC5zdHJpZGUgLSAxOworICAgICAgZHdbN10gPSBpbWctPnM4X29mZnNldDsKKworICAgICAgaWYgKGludGVsX2dwdV9nZW4oZ3B1KSA+PSBJTlRFTF9HRU4oNykpCisgICAgICAgICBkd1s2XSB8PSBHRU43X01PQ1NfTDNfV0IgPDwgR0VONl9TVEVOQ0lMX0RXMV9NT0NTX19TSElGVDsKKyAgICAgIGlmIChpbnRlbF9ncHVfZ2VuKGdwdSkgPj0gSU5URUxfR0VOKDcuNSkpCisgICAgICAgICBkd1s2XSB8PSBHRU43NV9TVEVOQ0lMX0RXMV9TVEVOQ0lMX0JVRkZFUl9FTkFCTEU7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGR3WzZdID0gMDsKKyAgICAgIGR3WzddID0gMDsKKyAgIH0KKworICAgLyogaGl6ICovCisgICBpZiAoaW5mby5oaXouc3RyaWRlKSB7CisgICAgICBkd1s4XSA9IGluZm8uaGl6LnN0cmlkZSAtIDE7CisgICAgICBkd1s5XSA9IGltZy0+YXV4X29mZnNldDsKKworICAgICAgaWYgKGludGVsX2dwdV9nZW4oZ3B1KSA+PSBJTlRFTF9HRU4oNykpCisgICAgICAgICBkd1s4XSB8PSBHRU43X01PQ1NfTDNfV0IgPDwgR0VONl9ISVpfRFcxX01PQ1NfX1NISUZUOworICAgfQorICAgZWxzZSB7CisgICAgICBkd1s4XSA9IDA7CisgICAgICBkd1s5XSA9IDA7CisgICB9CisKKyAgIHZpZXctPmhhc19zdGVuY2lsID0gaW5mby5zdGVuY2lsLnN0cmlkZTsKKyAgIHZpZXctPmhhc19oaXogPSBpbmZvLmhpei5zdHJpZGU7Cit9CisKK3N0YXRpYyBjb25zdCBWa0NvbXBvbmVudE1hcHBpbmcgaWRlbnRpdHlfY2hhbm5lbF9tYXBwaW5nID0geworICAgIC5yID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfUiwKKyAgICAuZyA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0csCisgICAgLmIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9CLAorICAgIC5hID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQSwKK307CisKK3N0YXRpYyB2b2lkIGF0dF92aWV3X2luaXRfZm9yX3J0KHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9pbWcgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VWaWV3VHlwZSB2aWV3X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQsIHVuc2lnbmVkIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlyc3RfbGF5ZXIsIHVuc2lnbmVkIG51bV9sYXllcnMpCit7CisgICAgaWYgKGludGVsX2dwdV9nZW4oZ3B1KSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgc3VyZmFjZV9zdGF0ZV90ZXhfZ2VuNyhncHUsIGltZywgdmlld190eXBlLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgbGV2ZWwsIDEsIGZpcnN0X2xheWVyLCBudW1fbGF5ZXJzLAorICAgICAgICAgICAgICAgIGlkZW50aXR5X2NoYW5uZWxfbWFwcGluZywgdHJ1ZSwgdmlldy0+YXR0X2NtZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VyZmFjZV9zdGF0ZV90ZXhfZ2VuNihncHUsIGltZywgdmlld190eXBlLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgbGV2ZWwsIDEsIGZpcnN0X2xheWVyLCBudW1fbGF5ZXJzLAorICAgICAgICAgICAgICAgIHRydWUsIHZpZXctPmF0dF9jbWQpOworICAgIH0KKworICAgIHZpZXctPmlzX3J0ID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXR0X3ZpZXdfaW5pdF9mb3JfaW5wdXQoc3RydWN0IGludGVsX2F0dF92aWV3ICp2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ltZyAqaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZVZpZXdUeXBlIHZpZXdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwgdW5zaWduZWQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmaXJzdF9sYXllciwgdW5zaWduZWQgbnVtX2xheWVycykKK3sKKyAgICBpZiAoaW50ZWxfZ3B1X2dlbihncHUpID49IElOVEVMX0dFTig3KSkgeworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIHN1cmZhY2Vfc3RhdGVfdGV4X2dlbjcoZ3B1LCBpbWcsIHZpZXdfdHlwZSwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBsZXZlbCwgMSwgZmlyc3RfbGF5ZXIsIG51bV9sYXllcnMsCisgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5X2NoYW5uZWxfbWFwcGluZywgZmFsc2UsIHZpZXctPmNtZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXJmYWNlX3N0YXRlX251bGxfZ2VuNyhncHUsIHZpZXctPmNtZCk7CisgICAgICAgIH0KKworICAgICAgICB2aWV3LT5jbWRfbGVuID0gODsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIHN1cmZhY2Vfc3RhdGVfdGV4X2dlbjYoZ3B1LCBpbWcsIHZpZXdfdHlwZSwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBsZXZlbCwgMSwgZmlyc3RfbGF5ZXIsIG51bV9sYXllcnMsIGZhbHNlLCB2aWV3LT5jbWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VyZmFjZV9zdGF0ZV9udWxsX2dlbjYoZ3B1LCB2aWV3LT5jbWQpOworICAgICAgICB9CisKKyAgICAgICAgdmlldy0+Y21kX2xlbiA9IDY7CisgICAgfQorfQorCit2b2lkIGludGVsX251bGxfdmlld19pbml0KHN0cnVjdCBpbnRlbF9udWxsX3ZpZXcgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldikKK3sKKyAgICBpZiAoaW50ZWxfZ3B1X2dlbihkZXYtPmdwdSkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICAgIHN1cmZhY2Vfc3RhdGVfbnVsbF9nZW43KGRldi0+Z3B1LCB2aWV3LT5jbWQpOworICAgICAgICB2aWV3LT5jbWRfbGVuID0gODsKKyAgICB9IGVsc2UgeworICAgICAgICBzdXJmYWNlX3N0YXRlX251bGxfZ2VuNihkZXYtPmdwdSwgdmlldy0+Y21kKTsKKyAgICAgICAgdmlldy0+Y21kX2xlbiA9IDY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBidWZfdmlld19kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKnZpZXcgPSBpbnRlbF9idWZfdmlld19mcm9tX29iaihvYmopOworCisgICAgaW50ZWxfYnVmX3ZpZXdfZGVzdHJveSh2aWV3KTsKK30KKwordm9pZCBpbnRlbF9idWZfdmlld19pbml0KGNvbnN0IHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9idWZfdmlldyAqdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJhdykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYnVmICpidWYgPSBpbnRlbF9idWYoaW5mby0+YnVmZmVyKTsKKyAgICAvKiBUT0RPOiBJcyB0cmFuc2ZlciBkZXN0aW5hdGlvbiB0aGUgb25seSBzaGFkZXIgd3JpdGUgb3BlcmF0aW9uPyAqLworICAgIGNvbnN0IGJvb2wgd2lsbF93cml0ZSA9IGJ1ZiA/IChidWYtPnVzYWdlICYgKFZLX0JVRkZFUl9VU0FHRV9TVE9SQUdFX1RFWEVMX0JVRkZFUl9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19CVUZGRVJfVVNBR0VfU1RPUkFHRV9CVUZGRVJfQklUKSkgOiAwOworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICBWa0RldmljZVNpemUgc3RyaWRlOworICAgIHVpbnQzMl90ICpjbWQ7CisgICAgaW50IGk7CisKKyAgICB2aWV3LT5vYmouZGVzdHJveSA9IGJ1Zl92aWV3X2Rlc3Ryb3k7CisKKyAgICB2aWV3LT5idWYgPSBidWY7CisKKyAgICAvKgorICAgICAqIFRoZSBjb21waWxlciBleHBlY3RzIHVuaWZvcm0gYnVmZmVycyB0byBoYXZlIHBpdGNoIG9mCisgICAgICogNCBmb3IgZnJhZ21lbnQgc2hhZGVycywgYnV0IDE2IGZvciBvdGhlciBzdGFnZXMuICBUaGUgZm9ybWF0CisgICAgICogbXVzdCBiZSBWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1NGTE9BVC4KKyAgICAgKi8KKyAgICBpZiAocmF3KSB7CisgICAgICAgIGZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0ZMT0FUOworICAgICAgICBzdHJpZGUgPSAxNjsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQgPSBpbmZvLT5mb3JtYXQ7CisgICAgICAgIHN0cmlkZSA9IGljZF9mb3JtYXRfZ2V0X3NpemUoZm9ybWF0KTsKKyAgICB9CisgICAgY21kID0gdmlldy0+Y21kOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAoaW50ZWxfZ3B1X2dlbihkZXYtPmdwdSkgPj0gSU5URUxfR0VOKDcpKSB7CisgICAgICAgICAgICBzdXJmYWNlX3N0YXRlX2J1Zl9nZW43KGRldi0+Z3B1LCBpbmZvLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJhbmdlLCBzdHJpZGUsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgd2lsbF93cml0ZSwgd2lsbF93cml0ZSwgY21kKTsKKyAgICAgICAgICAgIHZpZXctPmNtZF9sZW4gPSA4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VyZmFjZV9zdGF0ZV9idWZfZ2VuNihkZXYtPmdwdSwgaW5mby0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5yYW5nZSwgc3RyaWRlLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHdpbGxfd3JpdGUsIHdpbGxfd3JpdGUsIGNtZCk7CisgICAgICAgICAgICB2aWV3LT5jbWRfbGVuID0gNjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN3aXRjaCB0byB2aWV3LT5mc19jbWQgKi8KKyAgICAgICAgaWYgKHJhdykgeworICAgICAgICAgICAgY21kID0gdmlldy0+ZnNfY21kOworICAgICAgICAgICAgc3RyaWRlID0gNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSh2aWV3LT5mc19jbWQsIHZpZXctPmNtZCwgc2l6ZW9mKHVpbnQzMl90KSAqIHZpZXctPmNtZF9sZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZrUmVzdWx0IGludGVsX2J1Zl92aWV3X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKip2aWV3X3JldCkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKnZpZXc7CisKKyAgICB2aWV3ID0gKHN0cnVjdCBpbnRlbF9idWZfdmlldyAqKSBpbnRlbF9iYXNlX2NyZWF0ZSgmZGV2LT5iYXNlLmhhbmRsZSwKKyAgICAgICAgICAgIHNpemVvZigqdmlldyksIGRldi0+YmFzZS5kYmcsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfVklFV19FWFQsCisgICAgICAgICAgICBpbmZvLCAwKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBpbnRlbF9idWZfdmlld19pbml0KGRldiwgaW5mbywgdmlldywgZmFsc2UpOworCisgICAgKnZpZXdfcmV0ID0gdmlldzsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2J1Zl92aWV3X2Rlc3Ryb3koc3RydWN0IGludGVsX2J1Zl92aWV3ICp2aWV3KQoreworICAgIGludGVsX2Jhc2VfZGVzdHJveSgmdmlldy0+b2JqLmJhc2UpOworfQorCitzdGF0aWMgdm9pZCBpbWdfdmlld19kZXN0cm95KHN0cnVjdCBpbnRlbF9vYmogKm9iaikKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nX3ZpZXcgKnZpZXcgPSBpbnRlbF9pbWdfdmlld19mcm9tX29iaihvYmopOworCisgICAgaW50ZWxfaW1nX3ZpZXdfZGVzdHJveSh2aWV3KTsKK30KKwordm9pZCBpbnRlbF9pbWdfdmlld19pbml0KHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2ltZ192aWV3ICp2aWV3KQoreworICAgIFZrQ29tcG9uZW50TWFwcGluZyBzdGF0ZV9zd2l6emxlczsKKyAgICB1aW50MzJfdCBtaXBfbGV2ZWxzLCBhcnJheV9zaXplOworICAgIHN0cnVjdCBpbnRlbF9pbWcgKmltZyA9IGludGVsX2ltZyhpbmZvLT5pbWFnZSk7CisKKyAgICBtaXBfbGV2ZWxzID0gaW5mby0+c3VicmVzb3VyY2VSYW5nZS5sZXZlbENvdW50OworICAgIGlmIChtaXBfbGV2ZWxzID4gaW1nLT5taXBfbGV2ZWxzIC0gaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwpCisgICAgICAgIG1pcF9sZXZlbHMgPSBpbWctPm1pcF9sZXZlbHMgLSBpbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbDsKKworICAgIGFycmF5X3NpemUgPSBpbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQ7CisgICAgaWYgKGFycmF5X3NpemUgPiBpbWctPmFycmF5X3NpemUgLSBpbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VBcnJheUxheWVyKQorICAgICAgICBhcnJheV9zaXplID0gaW1nLT5hcnJheV9zaXplIC0gaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllcjsKKworICAgIHZpZXctPm9iai5kZXN0cm95ID0gaW1nX3ZpZXdfZGVzdHJveTsKKworICAgIHZpZXctPmltZyA9IGltZzsKKworICAgIGlmICghKGltZy0+dXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSkgeworICAgICAgICBpZiAoaW50ZWxfZ3B1X2dlbihkZXYtPmdwdSkgPj0gSU5URUxfR0VOKDcuNSkpIHsKKyAgICAgICAgICAgIHN0YXRlX3N3aXp6bGVzID0gaW5mby0+Y29tcG9uZW50czsKKyAgICAgICAgICAgIHZpZXctPnNoYWRlcl9zd2l6emxlcy5yID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfUjsKKyAgICAgICAgICAgIHZpZXctPnNoYWRlcl9zd2l6emxlcy5nID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfRzsKKyAgICAgICAgICAgIHZpZXctPnNoYWRlcl9zd2l6emxlcy5iID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQjsKKyAgICAgICAgICAgIHZpZXctPnNoYWRlcl9zd2l6emxlcy5hID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXRlX3N3aXp6bGVzLnIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9SOworICAgICAgICAgICAgc3RhdGVfc3dpenpsZXMuZyA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0c7CisgICAgICAgICAgICBzdGF0ZV9zd2l6emxlcy5iID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQjsKKyAgICAgICAgICAgIHN0YXRlX3N3aXp6bGVzLmEgPSBWS19DT01QT05FTlRfU1dJWlpMRV9BOworICAgICAgICAgICAgdmlldy0+c2hhZGVyX3N3aXp6bGVzID0gaW5mby0+Y29tcG9uZW50czsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNoYWRlcl9zd2l6emxlcyBpcyBpZ25vcmVkIGJ5IHRoZSBjb21waWxlciAqLworICAgICAgICBpZiAodmlldy0+c2hhZGVyX3N3aXp6bGVzLnIgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfUiB8fAorICAgICAgICAgICAgdmlldy0+c2hhZGVyX3N3aXp6bGVzLmcgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfRyB8fAorICAgICAgICAgICAgdmlldy0+c2hhZGVyX3N3aXp6bGVzLmIgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQiB8fAorICAgICAgICAgICAgdmlldy0+c2hhZGVyX3N3aXp6bGVzLmEgIT0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQSkgeworICAgICAgICAgICAgaW50ZWxfZGV2X2xvZyhkZXYsIFZLX0RFQlVHX1JFUE9SVF9XQVJOSU5HX0JJVF9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfYmFzZSopdmlldywgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlIGRhdGEgc3dpenpsaW5nIGlzIGlnbm9yZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRlbF9ncHVfZ2VuKGRldi0+Z3B1KSA+PSBJTlRFTF9HRU4oNykpIHsKKyAgICAgICAgICAgIHN1cmZhY2Vfc3RhdGVfdGV4X2dlbjcoZGV2LT5ncHUsIGltZywgaW5mby0+dmlld1R5cGUsIGluZm8tPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwsIG1pcF9sZXZlbHMsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIsIGFycmF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlX3N3aXp6bGVzLCBmYWxzZSwgdmlldy0+Y21kKTsKKyAgICAgICAgICAgIHZpZXctPmNtZF9sZW4gPSA4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VyZmFjZV9zdGF0ZV90ZXhfZ2VuNihkZXYtPmdwdSwgaW1nLCBpbmZvLT52aWV3VHlwZSwgaW5mby0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCwgbWlwX2xldmVscywKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciwgYXJyYXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHZpZXctPmNtZCk7CisgICAgICAgICAgICB2aWV3LT5jbWRfbGVuID0gNjsKKyAgICAgICAgfQorICAgIH0KK30KKworVmtSZXN1bHQgaW50ZWxfaW1nX3ZpZXdfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2ltZ192aWV3ICoqdmlld19yZXQpCit7CisgICAgc3RydWN0IGludGVsX2ltZ192aWV3ICp2aWV3OworCisgICAgdmlldyA9IChzdHJ1Y3QgaW50ZWxfaW1nX3ZpZXcgKikgaW50ZWxfYmFzZV9jcmVhdGUoJmRldi0+YmFzZS5oYW5kbGUsCisgICAgICAgICAgICBzaXplb2YoKnZpZXcpLCBkZXYtPmJhc2UuZGJnLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfVklFV19FWFQsIGluZm8sIDApOworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIGludGVsX2ltZ192aWV3X2luaXQoZGV2LCBpbmZvLCB2aWV3KTsKKworICAgIC8qIEluaXRpYWxpemUgYXR0YWNobWVudCB2aWV3IGluZm8gaW4gY2FzZSBpdCdzIG5lZWRlZCAqLworICAgIGludGVsX2F0dF92aWV3X2luaXQoZGV2LCBpbmZvLCAmdmlldy0+YXR0X3ZpZXcpOworCisgICAgKnZpZXdfcmV0ID0gdmlldzsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX2ltZ192aWV3X2Rlc3Ryb3koc3RydWN0IGludGVsX2ltZ192aWV3ICp2aWV3KQoreworICAgIGludGVsX2Jhc2VfZGVzdHJveSgmdmlldy0+b2JqLmJhc2UpOworfQorCit2b2lkIGludGVsX2F0dF92aWV3X2luaXQoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2F0dF92aWV3ICphdHRfdmlldykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWcgPSBpbnRlbF9pbWcoaW5mby0+aW1hZ2UpOworICAgIFZrSW1hZ2VWaWV3VHlwZSB2aWV3X3R5cGU7CisKKyAgICBhdHRfdmlldy0+aW1nID0gaW1nOworCisgICAgYXR0X3ZpZXctPm1pcExldmVsID0gaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWw7CisgICAgYXR0X3ZpZXctPmJhc2VBcnJheUxheWVyID0gaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllcjsKKyAgICBhdHRfdmlldy0+YXJyYXlfc2l6ZSA9IGluZm8tPnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudDsKKworICAgIHZpZXdfdHlwZSA9IGltZ190eXBlX3RvX3ZpZXdfdHlwZShpbWctPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCk7CisKKyAgICBhdHRfdmlld19pbml0X2Zvcl9pbnB1dChhdHRfdmlldywgZGV2LT5ncHUsIGltZywgdmlld190eXBlLCBpbmZvLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmxheWVyQ291bnQpOworCisgICAgaWYgKGltZy0+dXNhZ2UgJiBWS19JTUFHRV9VU0FHRV9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfQklUKSB7CisgICAgICAgIGF0dF92aWV3X2luaXRfZm9yX2RzKGF0dF92aWV3LCBkZXYtPmdwdSwgaW1nLCB2aWV3X3R5cGUsIGltZy0+bGF5b3V0LmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlTWlwTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN1YnJlc291cmNlUmFuZ2UuYmFzZUFycmF5TGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN1YnJlc291cmNlUmFuZ2UubGF5ZXJDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXR0X3ZpZXdfaW5pdF9mb3JfcnQoYXR0X3ZpZXcsIGRldi0+Z3B1LCBpbWcsIHZpZXdfdHlwZSwgaW5mby0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zdWJyZXNvdXJjZVJhbmdlLmJhc2VNaXBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3VicmVzb3VyY2VSYW5nZS5iYXNlQXJyYXlMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3VicmVzb3VyY2VSYW5nZS5sYXllckNvdW50KTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8qICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyVmlldyogICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KQoreworICAgIHN0cnVjdCBpbnRlbF9kZXYgKmRldiA9IGludGVsX2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIGludGVsX2J1Zl92aWV3X2NyZWF0ZShkZXYsIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF9idWZfdmlldyAqKikgcFZpZXcpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lCdWZmZXJWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlclZpZXcgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJWaWV3LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQorCisgeworICAgIHN0cnVjdCBpbnRlbF9vYmogKm9iaiA9IGludGVsX29iaihidWZmZXJWaWV3KTsKKworICAgIG9iai0+ZGVzdHJveShvYmopOworIH0KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlVmlldyogICAgICAgICAgICAgICAgICAgICAgICBwVmlldykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYgPSBpbnRlbF9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBpbnRlbF9pbWdfdmlld19jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfaW1nX3ZpZXcgKiopIHBWaWV3KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95SW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCisKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfb2JqICpvYmogPSBpbnRlbF9vYmooaW1hZ2VWaWV3KTsKKworICAgIG9iai0+ZGVzdHJveShvYmopOworfQorCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvdmlldy5oIGIvaWNkL2ludGVsL3ZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZlN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL3ZpZXcuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICoKKyAqLworCisjaWZuZGVmIFZJRVdfSAorI2RlZmluZSBWSUVXX0gKKworI2luY2x1ZGUgIm9iai5oIgorI2luY2x1ZGUgImludGVsLmgiCisKK3N0cnVjdCBpbnRlbF9pbWc7CitzdHJ1Y3QgaW50ZWxfbWVtOworCitzdHJ1Y3QgaW50ZWxfbnVsbF92aWV3IHsKKyAgICAvKiB0aGlzIGlzIG5vdCBhbiBpbnRlbF9vYmogKi8KKworICAgIC8qIFNVUkZBQ0VfU1RBVEUgKi8KKyAgICB1aW50MzJfdCBjbWRbOF07CisgICAgdWludDMyX3QgY21kX2xlbjsKK307CisKK3N0cnVjdCBpbnRlbF9idWZfdmlldyB7CisgICAgc3RydWN0IGludGVsX29iaiBvYmo7CisKKyAgICBzdHJ1Y3QgaW50ZWxfYnVmICpidWY7CisKKyAgICAvKiBTVVJGQUNFX1NUQVRFICovCisgICAgdWludDMyX3QgY21kWzhdOworICAgIHVpbnQzMl90IGZzX2NtZFs4XTsKKyAgICB1aW50MzJfdCBjbWRfbGVuOworfTsKKworc3RydWN0IGludGVsX2F0dF92aWV3IHsKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWc7CisKKyAgICB1aW50MzJfdCBtaXBMZXZlbDsKKyAgICB1aW50MzJfdCBiYXNlQXJyYXlMYXllcjsKKyAgICB1aW50MzJfdCBhcnJheV9zaXplOworCisgICAgLyogU1VSRkFDRV9TVEFURSBmb3IgcmVhZGJhY2sgKi8KKyAgICB1aW50MzJfdCBjbWRbOF07CisgICAgdWludDMyX3QgY21kX2xlbjsKKworICAgIC8qCisgICAgICogU1VSRkFDRV9TVEFURSB3aGVuIGlzX3J0IGlzIHRydWUuICBPdGhlcndpc2UsCisgICAgICoKKyAgICAgKiAzRFNUQVRFX0RFUFRIX0JVRkZFUgorICAgICAqIDNEU1RBVEVfU1RFTkNJTF9CVUZGRVIKKyAgICAgKiAzRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSCisgICAgICovCisgICAgdWludDMyX3QgYXR0X2NtZFsxMF07CisgICAgYm9vbCBpc19ydDsKKyAgICBib29sIGhhc19zdGVuY2lsOworICAgIGJvb2wgaGFzX2hpejsKK307CisKK3N0cnVjdCBpbnRlbF9pbWdfdmlldyB7CisgICAgc3RydWN0IGludGVsX29iaiBvYmo7CisKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWc7CisKKyAgICBWa0NvbXBvbmVudE1hcHBpbmcgc2hhZGVyX3N3aXp6bGVzOworCisgICAgLyogU1VSRkFDRV9TVEFURSAqLworICAgIHVpbnQzMl90IGNtZFs4XTsKKyAgICB1aW50MzJfdCBjbWRfbGVuOworCisgICAgc3RydWN0IGludGVsX2F0dF92aWV3IGF0dF92aWV3OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKmludGVsX2J1Zl92aWV3KFZrQnVmZmVyVmlldyB2aWV3KQoreworICAgIHJldHVybiAqKHN0cnVjdCBpbnRlbF9idWZfdmlldyAqKikgJnZpZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2J1Zl92aWV3ICppbnRlbF9idWZfdmlld19mcm9tX29iaihzdHJ1Y3QgaW50ZWxfb2JqICpvYmopCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfYnVmX3ZpZXcgKikgb2JqOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9pbWdfdmlldyAqaW50ZWxfaW1nX3ZpZXcoVmtJbWFnZVZpZXcgdmlldykKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgaW50ZWxfaW1nX3ZpZXcgKiopICZ2aWV3OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9pbWdfdmlldyAqaW50ZWxfaW1nX3ZpZXdfZnJvbV9vYmooc3RydWN0IGludGVsX29iaiAqb2JqKQoreworICAgIHJldHVybiAoc3RydWN0IGludGVsX2ltZ192aWV3ICopIG9iajsKK30KKwordm9pZCBpbnRlbF9udWxsX3ZpZXdfaW5pdChzdHJ1Y3QgaW50ZWxfbnVsbF92aWV3ICp2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYpOworCit2b2lkIGludGVsX2J1Zl92aWV3X2luaXQoY29uc3Qgc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2J1Zl92aWV3ICp2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmF3KTsKKworVmtSZXN1bHQgaW50ZWxfYnVmX3ZpZXdfY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlclZpZXdDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9idWZfdmlldyAqKnZpZXdfcmV0KTsKKwordm9pZCBpbnRlbF9idWZfdmlld19kZXN0cm95KHN0cnVjdCBpbnRlbF9idWZfdmlldyAqdmlldyk7CisKK3ZvaWQgaW50ZWxfaW1nX3ZpZXdfaW5pdChzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsIGNvbnN0IFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfaW1nX3ZpZXcgKnZpZXcpOworCitWa1Jlc3VsdCBpbnRlbF9pbWdfdmlld19jcmVhdGUoc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2ltZ192aWV3ICoqdmlld19yZXQpOwordm9pZCBpbnRlbF9pbWdfdmlld19kZXN0cm95KHN0cnVjdCBpbnRlbF9pbWdfdmlldyAqdmlldyk7CisKK3ZvaWQgaW50ZWxfYXR0X3ZpZXdfaW5pdChzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqYXR0X3ZpZXcpOwordm9pZCBpbnRlbF9hdHRfdmlld19kZXN0cm95KHN0cnVjdCBpbnRlbF9hdHRfdmlldyAqdmlldyk7CisKKyNlbmRpZiAvKiBWSUVXX0ggKi8KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC93c2kuaCBiL2ljZC9pbnRlbC93c2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk3ZDJhCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL2ludGVsL3dzaS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBXU0lfSAorI2RlZmluZSBXU0lfSAorCisjaW5jbHVkZSAiaW50ZWwuaCIKKworc3RydWN0IGludGVsX2ZlbmNlOworc3RydWN0IGludGVsX2dwdTsKK3N0cnVjdCBpbnRlbF9pbWc7CisKK1ZrUmVzdWx0IGludGVsX3dzaV9ncHVfZ2V0X3Byb3BlcnRpZXMoc3RydWN0IGludGVsX2dwdSAqZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICpwUHJvcGVydGllcyk7Cit2b2lkIGludGVsX3dzaV9ncHVfY2xlYW51cChzdHJ1Y3QgaW50ZWxfZ3B1ICpncHUpOworCitWa1Jlc3VsdCBpbnRlbF93c2lfaW1nX2luaXQoc3RydWN0IGludGVsX2ltZyAqaW1nKTsKK3ZvaWQgaW50ZWxfd3NpX2ltZ19jbGVhbnVwKHN0cnVjdCBpbnRlbF9pbWcgKmltZyk7CisKK1ZrUmVzdWx0IGludGVsX3dzaV9mZW5jZV9pbml0KHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2UpOwordm9pZCBpbnRlbF93c2lfZmVuY2VfY2xlYW51cChzdHJ1Y3QgaW50ZWxfZmVuY2UgKmZlbmNlKTsKK3ZvaWQgaW50ZWxfd3NpX2ZlbmNlX2NvcHkoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGludGVsX2ZlbmNlICpzcmMpOworVmtSZXN1bHQgaW50ZWxfd3NpX2ZlbmNlX3dhaXQoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0X25zKTsKKworI2VuZGlmIC8qIFdTSV9IICovCmRpZmYgLS1naXQgYS9pY2QvaW50ZWwvd3NpX251bGwuYyBiL2ljZC9pbnRlbC93c2lfbnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTFhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvd3NpX251bGwuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENoaWEtSSBXdSA8b2x2QGx1bmFyZy5jb20+CisgKgorICovCisKKyNpbmNsdWRlICJ3c2kuaCIKKwordm9pZCBpbnRlbF93c2lfZ3B1X2NsZWFudXAoc3RydWN0IGludGVsX2dwdSAqZ3B1KQoreworfQorCitWa1Jlc3VsdCBpbnRlbF93c2lfaW1nX2luaXQoc3RydWN0IGludGVsX2ltZyAqaW1nKQoreworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIGludGVsX3dzaV9pbWdfY2xlYW51cChzdHJ1Y3QgaW50ZWxfaW1nICppbWcpCit7Cit9CisKK1ZrUmVzdWx0IGludGVsX3dzaV9mZW5jZV9pbml0KHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2UpCit7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaW50ZWxfd3NpX2ZlbmNlX2NsZWFudXAoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSkKK3sKK30KKwordm9pZCBpbnRlbF93c2lfZmVuY2VfY29weShzdHJ1Y3QgaW50ZWxfZmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZmVuY2UgKnNyYykKK3sKK30KKworVmtSZXN1bHQgaW50ZWxfd3NpX2ZlbmNlX3dhaXQoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dF9ucykKK3sKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2ljZC9pbnRlbC93c2lfeDExLmMgYi9pY2QvaW50ZWwvd3NpX3gxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWY3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvaW50ZWwvd3NpX3gxMS5jCkBAIC0wLDAgKzEsMTM0MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdmFmZmVAZ21haWwuY29tPgorICogQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBJYW4gRWxsaW90dCA8aWFuQEx1bmFyRy5jb20+CisgKiBBdXRob3I6IElhbiBFbGxpb3R0IDxpYW5lbGxpb3R0QGdvb2dsZS5jb20+CisgKiBBdXRob3I6IE1pa2UgU3Ryb3lhbiA8bWlrZUBMdW5hckcuY29tPgorICogQXV0aG9yOiBOb3JiZXJ0IE5vcHBlciA8Tm9yYmVydC5Ob3BwZXJAZnJlZXNjYWxlLmNvbT4gKHhsaWIgcG9ydCkKKyAqCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRSAxCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8eGNiL3hjYi5oPgorI2luY2x1ZGUgPHhjYi9kcmkzLmg+CisjaW5jbHVkZSA8eGNiL3ByZXNlbnQuaD4KKworI2luY2x1ZGUgPFgxMS9YbGliLXhjYi5oPgorCisjaW5jbHVkZSAia21kL3dpbnN5cy5oIgorI2luY2x1ZGUgImttZC9saWJkcm0veGY4NmRybU1vZGUuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJmZW5jZS5oIgorI2luY2x1ZGUgImdwdS5oIgorI2luY2x1ZGUgImltZy5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAid3NpLmgiCisKK3N0cnVjdCBpbnRlbF94MTFfZGlzcGxheSB7CisgICAgc3RydWN0IGludGVsX2hhbmRsZSBoYW5kbGU7CisKKyAgICBpbnQgZmQ7CisgICAgdWludDMyX3QgY29ubmVjdG9yX2lkOworCisgICAgY2hhciBuYW1lWzMyXTsKKyAgICBWa0V4dGVudDJEIHBoeXNpY2FsX2RpbWVuc2lvbjsKKyAgICBWa0V4dGVudDJEIHBoeXNpY2FsX3Jlc29sdXRpb247CisKKyAgICBkcm1Nb2RlTW9kZUluZm9QdHIgbW9kZXM7CisgICAgdWludDMyX3QgbW9kZV9jb3VudDsKK307CisKK3R5cGVkZWYgZW51bSBpbnRlbF94MTFfc3dhcF9jaGFpbl9pbWFnZV9zdGF0ZV8KK3sKKyAgICBJTlRFTF9TQ19TVEFURV9VTlVTRUQgPSAwLAorICAgIElOVEVMX1NDX1NUQVRFX0FQUF9PV05FRCA9IDEsCisgICAgSU5URUxfU0NfU1RBVEVfUVVFVUVEX0ZPUl9QUkVTRU5UID0gMiwKKyAgICBJTlRFTF9TQ19TVEFURV9ESVNQTEFZRUQgPSAzLAorfSBpbnRlbF94MTFfc3dhcF9jaGFpbl9pbWFnZV9zdGF0ZTsKKworLy8gVGhpcyBzdHJ1Y3QgY29ycmVzcG9uZHMgdG8gdGhlIFZrU3dhcGNoYWluSFIgb2JqZWN0Ogorc3RydWN0IGludGVsX3gxMV9zd2FwX2NoYWluIHsKKyAgICBzdHJ1Y3QgaW50ZWxfaGFuZGxlIGhhbmRsZTsKKworICAgIHhjYl9jb25uZWN0aW9uX3QgKmM7CisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsKKyAgICB1aW50MzJfdCB3aWR0aDsgIC8vIFRvIGNvbXBhcmUgd2l0aCBYQ0JfUFJFU0VOVF9FVkVOVF9DT05GSUdVUkVfTk9USUZZJ3MKKyAgICB1aW50MzJfdCBoZWlnaHQ7IC8vIGRpdHRvCisgICAgYm9vbCBvdXRfb2ZfZGF0ZTsKKyAgICBib29sIGJlaW5nX2RlbGV0ZWQ7CisgICAgYm9vbCBmb3JjZV9jb3B5OworICAgIFZrUHJlc2VudE1vZGVLSFIgcHJlc2VudF9tb2RlOworCisgICAgaW50IGRyaTNfbWFqb3IsIGRyaTNfbWlub3I7CisgICAgaW50IHByZXNlbnRfbWFqb3IsIHByZXNlbnRfbWlub3I7CisKKyAgICB4Y2Jfc3BlY2lhbF9ldmVudF90ICpwcmVzZW50X3NwZWNpYWxfZXZlbnQ7CisKKyAgICBzdHJ1Y3QgaW50ZWxfaW1nICoqcGVyc2lzdGVudF9pbWFnZXM7CisgICAgdWludDMyX3QgcGVyc2lzdGVudF9pbWFnZV9jb3VudDsKKyAgICBpbnRlbF94MTFfc3dhcF9jaGFpbl9pbWFnZV9zdGF0ZSAqaW1hZ2Vfc3RhdGU7CisgICAgdWludDMyX3QgKnByZXNlbnRfcXVldWU7CisgICAgdWludDMyX3QgcHJlc2VudF9xdWV1ZV9sZW5ndGg7CisgICAgdWludDMyX3QgcHJlc2VudF9zZXJpYWw7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBzZXJpYWw7CisgICAgfSBsb2NhbDsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90IHNlcmlhbDsKKyAgICAgICAgdWludDY0X3QgbXNjOworICAgIH0gcmVtb3RlOworfTsKKworc3RydWN0IGludGVsX3gxMV9pbWdfZGF0YSB7CisgICAgc3RydWN0IGludGVsX21lbSAqbWVtOworICAgIGludCBwcmltZV9mZDsKKyAgICB1aW50MzJfdCBwaXhtYXA7Cit9OworCitzdHJ1Y3QgaW50ZWxfeDExX2ZlbmNlX2RhdGEgeworICAgIHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqc3dhcF9jaGFpbjsKKyAgICB1aW50MzJfdCBzZXJpYWw7Cit9OworCisvKiB0aGVzZSBhcmUgd2hhdCBERFggZXhwZWN0cyAqLworc3RhdGljIGNvbnN0IFZrRm9ybWF0IHgxMV9wcmVzZW50YWJsZV9mb3JtYXRzW10gPSB7CisgICAgVktfRk9STUFUX0I4RzhSOEE4X1VOT1JNLAorICAgIFZLX0ZPUk1BVF9COEc4UjhBOF9TUkdCLAorICAgIFZLX0ZPUk1BVF9CNUc2UjVfVU5PUk1fUEFDSzE2LAorfTsKKworLy8gTm90ZTogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBvbmx5IG5lZWRlZCBpZiBhbiBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgSUNECisvLyBkaXJlY3RseSwgd2l0aG91dCB0aGUgY29tbW9uIFZ1bGthbiBsb2FkZXI6CisvLworLy8gQ3JlYXRlIGEgVmtTdXJmYWNlS0hSIG9iamVjdCBmb3IgWENCIHdpbmRvdyBjb25uZWN0aW9uczoKK3N0YXRpYyBWa1Jlc3VsdCB4MTFfeGNiX3N1cmZhY2VfY3JlYXRlKHN0cnVjdCBpbnRlbF9pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIqIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ljZFN1cmZhY2VYY2IgKipwU3VyZmFjZSkKK3sKKyAgICBWa0ljZFN1cmZhY2VYY2IgKnN1cmZhY2U7CisKKyAgICBzdXJmYWNlID0gaW50ZWxfYWxsb2MoaW5zdGFuY2UsIHNpemVvZigqc3VyZmFjZSksIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghc3VyZmFjZSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIG1lbXNldChzdXJmYWNlLCAwLCBzaXplb2YoKnN1cmZhY2UpKTsKKy8vIFRCRDogRG8gd2UgbmVlZCB0byBkbyB0aGlzIChpdCBkb2Vzbid0IGZpdCB3aXRoIHdoYXQgd2Ugd2FudCBmb3IgdGhlIEFQSSk/CisvLyAgICBpbnRlbF9oYW5kbGVfaW5pdCgmc3VyZmFjZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NVUkZBQ0VfS0hSX0VYVCwgaW5zdGFuY2UpOworCisgICAgc3VyZmFjZS0+YmFzZS5wbGF0Zm9ybSA9IFZLX0lDRF9XU0lfUExBVEZPUk1fWENCOworICAgIHN1cmZhY2UtPmNvbm5lY3Rpb24gPSBwQ3JlYXRlSW5mby0+Y29ubmVjdGlvbjsKKyAgICBzdXJmYWNlLT53aW5kb3cgPSBwQ3JlYXRlSW5mby0+d2luZG93OworCisgICAgKnBTdXJmYWNlID0gc3VyZmFjZTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIGlmIGFuIGFwcGxpY2F0aW9uIHVzZXMgdGhpcyBJQ0QKKy8vIGRpcmVjdGx5LCB3aXRob3V0IHRoZSBjb21tb24gVnVsa2FuIGxvYWRlcjoKKy8vCisvLyBDcmVhdGUgYSBWa1N1cmZhY2VLSFIgb2JqZWN0IGZvciBYTElCIHdpbmRvdyBjb25uZWN0aW9uczoKK3N0YXRpYyBWa1Jlc3VsdCB4MTFfeGxpYl9zdXJmYWNlX2NyZWF0ZShzdHJ1Y3QgaW50ZWxfaW5zdGFuY2UgKmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSWNkU3VyZmFjZVhsaWIgKipwU3VyZmFjZSkKK3sKKyAgICBWa0ljZFN1cmZhY2VYbGliICpzdXJmYWNlOworCisgICAgc3VyZmFjZSA9IGludGVsX2FsbG9jKGluc3RhbmNlLCBzaXplb2YoKnN1cmZhY2UpLCBzaXplb2YoaW50KSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICBpZiAoIXN1cmZhY2UpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBtZW1zZXQoc3VyZmFjZSwgMCwgc2l6ZW9mKCpzdXJmYWNlKSk7CisvLyBUQkQ6IERvIHdlIG5lZWQgdG8gZG8gdGhpcyAoaXQgZG9lc24ndCBmaXQgd2l0aCB3aGF0IHdlIHdhbnQgZm9yIHRoZSBBUEkpPworLy8gICAgaW50ZWxfaGFuZGxlX2luaXQoJnN1cmZhY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TVVJGQUNFX0tIUl9FWFQsIGluc3RhbmNlKTsKKworICAgIHN1cmZhY2UtPmJhc2UucGxhdGZvcm0gPSBWS19JQ0RfV1NJX1BMQVRGT1JNX1hMSUI7CisgICAgc3VyZmFjZS0+ZHB5ID0gcENyZWF0ZUluZm8tPmRweTsKKyAgICBzdXJmYWNlLT53aW5kb3cgPSBwQ3JlYXRlSW5mby0+d2luZG93OworCisgICAgKnBTdXJmYWNlID0gc3VyZmFjZTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIFZrSWNkU3VyZmFjZVhsaWIgKngxMV94bGliX3N1cmZhY2UoVmtTdXJmYWNlS0hSIHN1cmZhY2UpCit7CisgICAgVmtJY2RTdXJmYWNlWGxpYiAqcFN1cmZhY2UgPSAoVmtJY2RTdXJmYWNlWGxpYiAqKSBzdXJmYWNlOworICAgIGlmIChwU3VyZmFjZS0+YmFzZS5wbGF0Zm9ybSA9PSBWS19JQ0RfV1NJX1BMQVRGT1JNX1hMSUIpCisgICAgeworICAgICAgICByZXR1cm4gcFN1cmZhY2U7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworc3RhdGljIHZvaWQgeDExX3N1cmZhY2VfZGVzdHJveShWa1N1cmZhY2VLSFIgc3VyZmFjZSkKK3sKKyAgICBpbnRlbF9mcmVlKHN1cmZhY2UsIHN1cmZhY2UpOworfQorCitzdGF0aWMgaW5saW5lIFZrSWNkU3VyZmFjZVhjYiAqeDExX3hjYl9zdXJmYWNlKFZrU3VyZmFjZUtIUiBzdXJmYWNlKQoreworICAgIFZrSWNkU3VyZmFjZVhjYiAqcFN1cmZhY2UgPSAoVmtJY2RTdXJmYWNlWGNiICopIHN1cmZhY2U7CisgICAgaWYgKHBTdXJmYWNlLT5iYXNlLnBsYXRmb3JtID09IFZLX0lDRF9XU0lfUExBVEZPUk1fWENCKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBTdXJmYWNlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqeDExX3N3YXBfY2hhaW4oVmtTd2FwY2hhaW5LSFIgc2MpCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgaW50ZWxfeDExX3N3YXBfY2hhaW4gKikgc2M7Cit9CisKK3N0YXRpYyBib29sIHgxMV9pc19mb3JtYXRfcHJlc2VudGFibGUoY29uc3Qgc3RydWN0IGludGVsX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQpCit7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHgxMV9wcmVzZW50YWJsZV9mb3JtYXRzKTsgaSsrKSB7CisgICAgICAgIGlmICh4MTFfcHJlc2VudGFibGVfZm9ybWF0c1tpXSA9PSBmb3JtYXQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgeDExX2V4cG9ydF9wcmltZV9mZChzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfbGF5b3V0ICpsYXlvdXQpCit7CisgICAgc3RydWN0IGludGVsX3dpbnN5c19oYW5kbGUgZXhwb3J0OworICAgIGVudW0gaW50ZWxfdGlsaW5nX21vZGUgdGlsaW5nOworCisgICAgZXhwb3J0LnR5cGUgPSBJTlRFTF9XSU5TWVNfSEFORExFX0ZEOworCisgICAgc3dpdGNoIChsYXlvdXQtPnRpbGluZykgeworICAgIGNhc2UgR0VONl9USUxJTkdfWDoKKyAgICAgICAgdGlsaW5nID0gSU5URUxfVElMSU5HX1g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0VONl9USUxJTkdfWToKKyAgICAgICAgdGlsaW5nID0gSU5URUxfVElMSU5HX1k7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydChsYXlvdXQtPnRpbGluZyA9PSBHRU42X1RJTElOR19OT05FKTsKKyAgICAgICAgdGlsaW5nID0gSU5URUxfVElMSU5HX05PTkU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpbnRlbF9ib19zZXRfdGlsaW5nKGJvLCB0aWxpbmcsIGxheW91dC0+Ym9fc3RyaWRlKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGludGVsX3dpbnN5c19leHBvcnRfaGFuZGxlKGRldi0+d2luc3lzLCBibywgdGlsaW5nLAorICAgICAgICAgICAgICAgIGxheW91dC0+Ym9fc3RyaWRlLCBsYXlvdXQtPmJvX2hlaWdodCwgJmV4cG9ydCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAoaW50KSBleHBvcnQuaGFuZGxlOworfQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIGZkIHBvaW50cyB0byB0aGUgcHJpbWFyeSBvciByZW5kZXIgbm9kZSBvZiB0aGUgR1BVLgorICovCitzdGF0aWMgYm9vbCB4MTFfZ3B1X21hdGNoX2ZkKGNvbnN0IHN0cnVjdCBpbnRlbF9ncHUgKmdwdSwgaW50IGZkKQoreworICAgIHN0cnVjdCBzdGF0IGZkX3N0YXQsIGdwdV9zdGF0OworCisgICAgaWYgKGZzdGF0KGZkLCAmZmRfc3RhdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8qIGlzIGl0IHRoZSBwcmltYXJ5IG5vZGU/ICovCisgICAgaWYgKCFzdGF0KGdwdS0+cHJpbWFyeV9ub2RlLCAmZ3B1X3N0YXQpICYmCisgICAgICAgICFtZW1jbXAoJmZkX3N0YXQsICZncHVfc3RhdCwgc2l6ZW9mKGZkX3N0YXQpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvKiBpcyBpdCB0aGUgcmVuZGVyIG5vZGU/ICovCisgICAgaWYgKGdwdS0+cmVuZGVyX25vZGUgJiYgIXN0YXQoZ3B1LT5yZW5kZXJfbm9kZSwgJmdwdV9zdGF0KSAmJgorICAgICAgICAhbWVtY21wKCZmZF9zdGF0LCAmZ3B1X3N0YXQsIHNpemVvZihmZF9zdGF0KSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogUmV0dXJuIHRoZSBkZXB0aCBvZiBccCBkcmF3YWJsZS4KKyAqLworc3RhdGljIGludCB4MTFfZ2V0X2RyYXdhYmxlX2RlcHRoKHhjYl9jb25uZWN0aW9uX3QgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGUpCit7CisgICAgeGNiX2dldF9nZW9tZXRyeV9jb29raWVfdCBjb29raWU7CisgICAgeGNiX2dldF9nZW9tZXRyeV9yZXBseV90ICpyZXBseTsKKyAgICB1aW50OF90IGRlcHRoOworCisgICAgY29va2llID0geGNiX2dldF9nZW9tZXRyeShjLCBkcmF3YWJsZSk7CisgICAgcmVwbHkgPSB4Y2JfZ2V0X2dlb21ldHJ5X3JlcGx5KGMsIGNvb2tpZSwgTlVMTCk7CisKKyAgICBpZiAocmVwbHkpIHsKKyAgICAgICAgZGVwdGggPSByZXBseS0+ZGVwdGg7CisgICAgICAgIGZyZWUocmVwbHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlcHRoID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCB4MTFfZ2V0X3N1cmZhY2VfY2FwYWJpbGl0aWVzKAorICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiAqcFN1cmZhY2VQcm9wZXJ0aWVzKQoreworICAgIGNvbnN0IFZrSWNkU3VyZmFjZVhjYiAqc194Y2IgPSB4MTFfeGNiX3N1cmZhY2Uoc3VyZmFjZSk7CisKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBjb25zdCBWa0ljZFN1cmZhY2VYbGliICpzX3hsaWIgPSB4MTFfeGxpYl9zdXJmYWNlKHN1cmZhY2UpOworICAgIGFzc2VydChzX3hjYiB8fCBzX3hsaWIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgICAgeGNiX2Nvbm5lY3Rpb25fdCAqYyA9IDA7CisgICAgeGNiX3dpbmRvd190IHdpbmRvdyA9IDA7CisgICAgaWYgKHNfeGNiKQorICAgIHsKKyAgICAgICAgYyA9IHNfeGNiLT5jb25uZWN0aW9uOworICAgICAgICB3aW5kb3cgPSBzX3hjYi0+d2luZG93OworICAgIH0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBlbHNlIGlmIChzX3hsaWIpCisgICAgeworICAgICAgICBjID0gWEdldFhDQkNvbm5lY3Rpb24oc194bGliLT5kcHkpOworICAgICAgICB3aW5kb3cgPSAoeGNiX3dpbmRvd190KXNfeGxpYi0+d2luZG93OworICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworICAgIHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QgY29va2llOworICAgIHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdCAqcmVwbHk7CisKKyAgICBjb29raWUgPSB4Y2JfZ2V0X2dlb21ldHJ5KGMsIHdpbmRvdyk7CisgICAgcmVwbHkgPSB4Y2JfZ2V0X2dlb21ldHJ5X3JlcGx5KGMsIGNvb2tpZSwgTlVMTCk7CisKKyAgICBpZiAocmVwbHkpIHsKKyAgICAgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5jdXJyZW50RXh0ZW50LndpZHRoID0gcmVwbHktPndpZHRoOworICAgICAgICBwU3VyZmFjZVByb3BlcnRpZXMtPmN1cnJlbnRFeHRlbnQuaGVpZ2h0ID0gcmVwbHktPmhlaWdodDsKKyAgICAgICAgZnJlZShyZXBseSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5jdXJyZW50RXh0ZW50LndpZHRoID0gMDsKKyAgICAgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5jdXJyZW50RXh0ZW50LmhlaWdodCA9IDA7CisgICAgfQorCisgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5taW5JbWFnZUNvdW50ID0gMjsKKyAgICBwU3VyZmFjZVByb3BlcnRpZXMtPm1heEltYWdlQ291bnQgPSAwOworCisgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5taW5JbWFnZUV4dGVudC53aWR0aCA9CisgICAgICAgIHBTdXJmYWNlUHJvcGVydGllcy0+Y3VycmVudEV4dGVudC53aWR0aDsKKyAgICBwU3VyZmFjZVByb3BlcnRpZXMtPm1pbkltYWdlRXh0ZW50LmhlaWdodCA9CisgICAgICAgIHBTdXJmYWNlUHJvcGVydGllcy0+Y3VycmVudEV4dGVudC5oZWlnaHQ7CisgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5tYXhJbWFnZUV4dGVudC53aWR0aCA9CisgICAgICAgIHBTdXJmYWNlUHJvcGVydGllcy0+Y3VycmVudEV4dGVudC53aWR0aDsKKyAgICBwU3VyZmFjZVByb3BlcnRpZXMtPm1heEltYWdlRXh0ZW50LmhlaWdodCA9CisgICAgICAgIHBTdXJmYWNlUHJvcGVydGllcy0+Y3VycmVudEV4dGVudC5oZWlnaHQ7CisgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5tYXhJbWFnZUFycmF5TGF5ZXJzID0gMTsKKyAgICBwU3VyZmFjZVByb3BlcnRpZXMtPnN1cHBvcnRlZFRyYW5zZm9ybXMgPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSOworICAgIHBTdXJmYWNlUHJvcGVydGllcy0+Y3VycmVudFRyYW5zZm9ybSA9IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lERU5USVRZX0JJVF9LSFI7CisgICAgcFN1cmZhY2VQcm9wZXJ0aWVzLT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSA9IFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUjsKKyAgICBwU3VyZmFjZVByb3BlcnRpZXMtPnN1cHBvcnRlZFVzYWdlRmxhZ3MgPQorICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwKKyAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCB8CisgICAgICAgIFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKy8qKgorICogUmV0dXJuIHRydWUgaWYgRFJJMyBhbmQgUHJlc2VudCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBib29sIHgxMV9pc19kcmkzX2FuZF9wcmVzZW50X3N1cHBvcnRlZCh4Y2JfY29ubmVjdGlvbl90ICpjKQoreworICAgIGNvbnN0IHhjYl9xdWVyeV9leHRlbnNpb25fcmVwbHlfdCAqZXh0OworCisgICAgeGNiX3ByZWZldGNoX2V4dGVuc2lvbl9kYXRhKGMsICZ4Y2JfZHJpM19pZCk7CisgICAgeGNiX3ByZWZldGNoX2V4dGVuc2lvbl9kYXRhKGMsICZ4Y2JfcHJlc2VudF9pZCk7CisKKyAgICBleHQgPSB4Y2JfZ2V0X2V4dGVuc2lvbl9kYXRhKGMsICZ4Y2JfZHJpM19pZCk7CisgICAgaWYgKCFleHQgfHwgIWV4dC0+cHJlc2VudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZXh0ID0geGNiX2dldF9leHRlbnNpb25fZGF0YShjLCAmeGNiX3ByZXNlbnRfaWQpOworICAgIGlmICghZXh0IHx8ICFleHQtPnByZXNlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFNlbmQgYSBEUkkzT3BlbiB0byBnZXQgdGhlIHNlcnZlciBHUFUgZmQuCisgKi8KK3N0YXRpYyBpbnQgeDExX2RyaTNfb3Blbih4Y2JfY29ubmVjdGlvbl90ICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9yYW5kcl9wcm92aWRlcl90IHByb3ZpZGVyKQoreworICAgIHhjYl9kcmkzX29wZW5fY29va2llX3QgY29va2llOworICAgIHhjYl9kcmkzX29wZW5fcmVwbHlfdCAqcmVwbHk7CisgICAgaW50IGZkOworCisgICAgY29va2llID0geGNiX2RyaTNfb3BlbihjLCBkcmF3YWJsZSwgcHJvdmlkZXIpOworICAgIHJlcGx5ID0geGNiX2RyaTNfb3Blbl9yZXBseShjLCBjb29raWUsIE5VTEwpOworICAgIGlmICghcmVwbHkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZkID0gKHJlcGx5LT5uZmQgPT0gMSkgPyB4Y2JfZHJpM19vcGVuX3JlcGx5X2ZkcyhjLCByZXBseSlbMF0gOiAtMTsKKyAgICBmcmVlKHJlcGx5KTsKKworICAgIHJldHVybiBmZDsKK30KKworLyoqCisgKiBTZW5kIGEgRFJJM1BpeG1hcEZyb21CdWZmZXIgdG8gY3JlYXRlIGEgcGl4bWFwIGZyb20gXHAgcHJpbWVfZmQuCisgKi8KK3N0YXRpYyB4Y2JfcGl4bWFwX3QgeDExX2RyaTNfcGl4bWFwX2Zyb21fYnVmZmVyKHhjYl9jb25uZWN0aW9uX3QgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVwdGgsIGludCBwcmltZV9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9sYXlvdXQgKmxheW91dCkKK3sKKyAgICB4Y2JfcGl4bWFwX3QgcGl4bWFwOworCisgICAgcGl4bWFwID0geGNiX2dlbmVyYXRlX2lkKGMpOworCisgICAgeGNiX2RyaTNfcGl4bWFwX2Zyb21fYnVmZmVyKGMsIHBpeG1hcCwgZHJhd2FibGUsCisgICAgICAgICAgICBsYXlvdXQtPmJvX3N0cmlkZSAqIGxheW91dC0+Ym9faGVpZ2h0LAorICAgICAgICAgICAgbGF5b3V0LT53aWR0aDAsIGxheW91dC0+aGVpZ2h0MCwKKyAgICAgICAgICAgIGxheW91dC0+Ym9fc3RyaWRlLCBkZXB0aCwKKyAgICAgICAgICAgIGxheW91dC0+YmxvY2tfc2l6ZSAqIDgsIHByaW1lX2ZkKTsKKworICAgIHJldHVybiBwaXhtYXA7Cit9CisKKy8qKgorICogU2VuZCBEUkkzUXVlcnlWZXJzaW9uIGFuZCBQcmVzZW50UXVlcnlWZXJzaW9uIHRvIHF1ZXJ5IGV4dGVuc2lvbiB2ZXJzaW9ucy4KKyAqLworc3RhdGljIGJvb2wgeDExX3N3YXBfY2hhaW5fZHJpM19hbmRfcHJlc2VudF9xdWVyeV92ZXJzaW9uKHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqc2MpCit7CisgICAgeGNiX2RyaTNfcXVlcnlfdmVyc2lvbl9jb29raWVfdCBkcmkzX2Nvb2tpZTsKKyAgICB4Y2JfZHJpM19xdWVyeV92ZXJzaW9uX3JlcGx5X3QgKmRyaTNfcmVwbHk7CisgICAgeGNiX3ByZXNlbnRfcXVlcnlfdmVyc2lvbl9jb29raWVfdCBwcmVzZW50X2Nvb2tpZTsKKyAgICB4Y2JfcHJlc2VudF9xdWVyeV92ZXJzaW9uX3JlcGx5X3QgKnByZXNlbnRfcmVwbHk7CisKKyAgICBkcmkzX2Nvb2tpZSA9IHhjYl9kcmkzX3F1ZXJ5X3ZlcnNpb24oc2MtPmMsCisgICAgICAgICAgICBYQ0JfRFJJM19NQUpPUl9WRVJTSU9OLCBYQ0JfRFJJM19NSU5PUl9WRVJTSU9OKTsKKyAgICBwcmVzZW50X2Nvb2tpZSA9IHhjYl9wcmVzZW50X3F1ZXJ5X3ZlcnNpb24oc2MtPmMsCisgICAgICAgICAgICBYQ0JfUFJFU0VOVF9NQUpPUl9WRVJTSU9OLCBYQ0JfUFJFU0VOVF9NSU5PUl9WRVJTSU9OKTsKKworICAgIGRyaTNfcmVwbHkgPSB4Y2JfZHJpM19xdWVyeV92ZXJzaW9uX3JlcGx5KHNjLT5jLCBkcmkzX2Nvb2tpZSwgTlVMTCk7CisgICAgaWYgKCFkcmkzX3JlcGx5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBzYy0+ZHJpM19tYWpvciA9IGRyaTNfcmVwbHktPm1ham9yX3ZlcnNpb247CisgICAgc2MtPmRyaTNfbWlub3IgPSBkcmkzX3JlcGx5LT5taW5vcl92ZXJzaW9uOworICAgIGZyZWUoZHJpM19yZXBseSk7CisKKyAgICBwcmVzZW50X3JlcGx5ID0geGNiX3ByZXNlbnRfcXVlcnlfdmVyc2lvbl9yZXBseShzYy0+YywgcHJlc2VudF9jb29raWUsIE5VTEwpOworICAgIGlmICghcHJlc2VudF9yZXBseSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc2MtPnByZXNlbnRfbWFqb3IgPSBwcmVzZW50X3JlcGx5LT5tYWpvcl92ZXJzaW9uOworICAgIHNjLT5wcmVzZW50X21pbm9yID0gcHJlc2VudF9yZXBseS0+bWlub3JfdmVyc2lvbjsKKyAgICBmcmVlKHByZXNlbnRfcmVwbHkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU2VuZCBhIFByZXNlbnRTZWxlY3RJbnB1dCB0byBzZWxlY3QgaW50ZXJlc3RlZCBldmVudHMuCisgKi8KK3N0YXRpYyBib29sIHgxMV9zd2FwX2NoYWluX3ByZXNlbnRfc2VsZWN0X2lucHV0KHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqc2MsIHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqb2xkX3NjKQoreworICAgIHhjYl92b2lkX2Nvb2tpZV90IGNvb2tpZTsKKyAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICplcnJvcjsKKyAgICB4Y2JfcHJlc2VudF9ldmVudF90IHByZXNlbnRfc3BlY2lhbF9ldmVudF9pZDsKKworICAgIGlmIChvbGRfc2MgJiYgKG9sZF9zYy0+YyA9PSBzYy0+YykgJiYgKG9sZF9zYy0+d2luZG93ID09IHNjLT53aW5kb3cpKSB7CisgICAgICAgIC8vIFJldXNlIGEgcHJldmlvdXMgZXZlbnQuICAoVGhleSBjYW4gbmV2ZXIgYmUgc3RvcHBlZC4pCisgICAgICAgIHNjLT5wcmVzZW50X3NwZWNpYWxfZXZlbnQgPSBvbGRfc2MtPnByZXNlbnRfc3BlY2lhbF9ldmVudDsKKyAgICAgICAgb2xkX3NjLT5wcmVzZW50X3NwZWNpYWxfZXZlbnQgPSBOVUxMOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLyogY3JlYXRlIHRoZSBldmVudCBxdWV1ZSAqLworICAgIHByZXNlbnRfc3BlY2lhbF9ldmVudF9pZCA9IHhjYl9nZW5lcmF0ZV9pZChzYy0+Yyk7CisgICAgc2MtPnByZXNlbnRfc3BlY2lhbF9ldmVudCA9IHhjYl9yZWdpc3Rlcl9mb3Jfc3BlY2lhbF94Z2Uoc2MtPmMsCisgICAgICAgICAgICAmeGNiX3ByZXNlbnRfaWQsIHByZXNlbnRfc3BlY2lhbF9ldmVudF9pZCwgTlVMTCk7CisKKyAgICBjb29raWUgPSB4Y2JfcHJlc2VudF9zZWxlY3RfaW5wdXRfY2hlY2tlZChzYy0+YywKKyAgICAgICAgICAgIHByZXNlbnRfc3BlY2lhbF9ldmVudF9pZCwgc2MtPndpbmRvdywKKyAgICAgICAgICAgIFhDQl9QUkVTRU5UX0VWRU5UX01BU0tfQ09NUExFVEVfTk9USUZZIHwKKyAgICAgICAgICAgIFhDQl9QUkVTRU5UX0VWRU5UX01BU0tfQ09ORklHVVJFX05PVElGWSk7CisKKyAgICBlcnJvciA9IHhjYl9yZXF1ZXN0X2NoZWNrKHNjLT5jLCBjb29raWUpOworICAgIGlmIChlcnJvcikgeworICAgICAgICBmcmVlKGVycm9yKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX2ltZyAqeDExX3N3YXBfY2hhaW5fY3JlYXRlX3BlcnNpc3RlbnRfaW1hZ2Uoc3RydWN0IGludGVsX3gxMV9zd2FwX2NoYWluICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gKmltZ19pbmZvKQoreworICAgIHN0cnVjdCBpbnRlbF9pbWcgKmltZzsKKyAgICBzdHJ1Y3QgaW50ZWxfbWVtICptZW07CisgICAgc3RydWN0IGludGVsX3gxMV9pbWdfZGF0YSAqZGF0YTsKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1faW5mbzsKKyAgICBpbnQgcHJpbWVfZmQ7CisgICAgeGNiX3BpeG1hcF90IHBpeG1hcDsKKyAgICBWa1Jlc3VsdCByZXQ7CisKKyAgICByZXQgPSBpbnRlbF9pbWdfY3JlYXRlKGRldiwgaW1nX2luZm8sIE5VTEwsIHRydWUsICZpbWcpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBtZW1zZXQoJm1lbV9pbmZvLCAwLCBzaXplb2YobWVtX2luZm8pKTsKKyAgICBtZW1faW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPOworICAgIG1lbV9pbmZvLmFsbG9jYXRpb25TaXplID0gaW1nLT50b3RhbF9zaXplOworICAgIG1lbV9pbmZvLm1lbW9yeVR5cGVJbmRleCA9IDA7CisKKyAgICByZXQgPSBpbnRlbF9tZW1fYWxsb2MoZGV2LCAmbWVtX2luZm8sICZtZW0pOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICBpbnRlbF9pbWdfZGVzdHJveShpbWcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwcmltZV9mZCA9IHgxMV9leHBvcnRfcHJpbWVfZmQoZGV2LCBtZW0tPmJvLCAmaW1nLT5sYXlvdXQpOworICAgIGlmIChwcmltZV9mZCA8IDApIHsKKyAgICAgICAgaW50ZWxfbWVtX2ZyZWUobWVtKTsKKyAgICAgICAgaW50ZWxfaW1nX2Rlc3Ryb3koaW1nKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGl4bWFwID0geDExX2RyaTNfcGl4bWFwX2Zyb21fYnVmZmVyKHNjLT5jLCBzYy0+d2luZG93LAorICAgICAgICAgICAgeDExX2dldF9kcmF3YWJsZV9kZXB0aChzYy0+Yywgc2MtPndpbmRvdyksCisgICAgICAgICAgICBwcmltZV9mZCwgJmltZy0+bGF5b3V0KTsKKworICAgIGRhdGEgPSAoc3RydWN0IGludGVsX3gxMV9pbWdfZGF0YSAqKSBpbWctPndzaV9kYXRhOworICAgIGRhdGEtPm1lbSA9IG1lbTsKKyAgICBkYXRhLT5wcmltZV9mZCA9IHByaW1lX2ZkOworICAgIGRhdGEtPnBpeG1hcCA9IHBpeG1hcDsKKworICAgIGludGVsX29ial9iaW5kX21lbSgmaW1nLT5vYmosIG1lbSwgMCk7CisKKyAgICByZXR1cm4gaW1nOworfQorCitzdGF0aWMgYm9vbCB4MTFfc3dhcF9jaGFpbl9jcmVhdGVfcGVyc2lzdGVudF9pbWFnZXMoc3RydWN0IGludGVsX3gxMV9zd2FwX2NoYWluICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICppbmZvKQoreworICAgIHN0cnVjdCBpbnRlbF9pbWcgKippbWFnZXM7CisgICAgaW50ZWxfeDExX3N3YXBfY2hhaW5faW1hZ2Vfc3RhdGUgKmltYWdlX3N0YXRlOworICAgIHVpbnQzMl90ICpwcmVzZW50X3F1ZXVlOworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltZ19pbmZvOworICAgIHVpbnQzMl90IGk7CisKKyAgICBpbWFnZXMgPSBpbnRlbF9hbGxvYyhzYywgc2l6ZW9mKCppbWFnZXMpICogaW5mby0+bWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghaW1hZ2VzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaW1hZ2Vfc3RhdGUgPSBpbnRlbF9hbGxvYygKKyAgICAgICAgICAgIHNjLCBzaXplb2YoaW50ZWxfeDExX3N3YXBfY2hhaW5faW1hZ2Vfc3RhdGUpICogaW5mby0+bWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghaW1hZ2Vfc3RhdGUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPm1pbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaW50ZWxfaW1nX2Rlc3Ryb3koaW1hZ2VzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlbF9mcmVlKHNjLCBpbWFnZXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHByZXNlbnRfcXVldWUgPSBpbnRlbF9hbGxvYygKKyAgICAgICAgICAgIHNjLCBzaXplb2YodWludDMyX3QpICogaW5mby0+bWluSW1hZ2VDb3VudCwKKyAgICAgICAgICAgIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghcHJlc2VudF9xdWV1ZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bWluSW1hZ2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpbnRlbF9pbWdfZGVzdHJveShpbWFnZXNbaV0pOworICAgICAgICB9CisgICAgICAgIGludGVsX2ZyZWUoc2MsIGltYWdlcyk7CisgICAgICAgIGludGVsX2ZyZWUoc2MsIGltYWdlX3N0YXRlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbXNldCgmaW1nX2luZm8sIDAsIHNpemVvZihpbWdfaW5mbykpOworICAgIGltZ19pbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfQ1JFQVRFX0lORk87CisgICAgaW1nX2luZm8uaW1hZ2VUeXBlID0gVktfSU1BR0VfVFlQRV8yRDsKKyAgICBpbWdfaW5mby5mb3JtYXQgPSBpbmZvLT5pbWFnZUZvcm1hdDsKKyAgICBpbWdfaW5mby5leHRlbnQud2lkdGggPSBpbmZvLT5pbWFnZUV4dGVudC53aWR0aDsKKyAgICBpbWdfaW5mby5leHRlbnQuaGVpZ2h0ID0gaW5mby0+aW1hZ2VFeHRlbnQuaGVpZ2h0OworICAgIGltZ19pbmZvLmV4dGVudC5kZXB0aCA9IDE7CisgICAgaW1nX2luZm8ubWlwTGV2ZWxzID0gMTsKKyAgICBpbWdfaW5mby5hcnJheUxheWVycyA9IGluZm8tPmltYWdlQXJyYXlMYXllcnM7CisgICAgaW1nX2luZm8uc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBpbWdfaW5mby50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTDsKKyAgICBpbWdfaW5mby51c2FnZSA9IGluZm8tPmltYWdlVXNhZ2U7CisgICAgaW1nX2luZm8uZmxhZ3MgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPm1pbkltYWdlQ291bnQ7IGkrKykgeworICAgICAgICBpbWFnZXNbaV0gPSB4MTFfc3dhcF9jaGFpbl9jcmVhdGVfcGVyc2lzdGVudF9pbWFnZShzYywKKyAgICAgICAgICAgICAgICBkZXYsICZpbWdfaW5mbyk7CisgICAgICAgIGlmICghaW1hZ2VzW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGltYWdlX3N0YXRlW2ldID0gSU5URUxfU0NfU1RBVEVfVU5VU0VEOworICAgIH0KKworICAgIGlmIChpIDwgaW5mby0+bWluSW1hZ2VDb3VudCkgeworICAgICAgICB1aW50MzJfdCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgaW50ZWxfaW1nX2Rlc3Ryb3koaW1hZ2VzW2pdKTsKKworICAgICAgICBpbnRlbF9mcmVlKHNjLCBpbWFnZXMpOworCisgICAgICAgIGlmIChpbWFnZV9zdGF0ZSkgeworICAgICAgICAgICAgaW50ZWxfZnJlZShzYywgaW1hZ2Vfc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZXNlbnRfcXVldWUpIHsKKyAgICAgICAgICAgIGludGVsX2ZyZWUoc2MsIHByZXNlbnRfcXVldWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNjLT5wZXJzaXN0ZW50X2ltYWdlcyA9IGltYWdlczsKKyAgICBzYy0+cGVyc2lzdGVudF9pbWFnZV9jb3VudCA9IGluZm8tPm1pbkltYWdlQ291bnQ7CisgICAgc2MtPmltYWdlX3N0YXRlID0gaW1hZ2Vfc3RhdGU7CisgICAgc2MtPnByZXNlbnRfcXVldWUgPSBwcmVzZW50X3F1ZXVlOworICAgIHNjLT5wcmVzZW50X3F1ZXVlX2xlbmd0aCA9IDA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTZW5kIGEgUHJlc2VudFBpeG1hcC4KKyAqLworc3RhdGljIFZrUmVzdWx0IHgxMV9zd2FwX2NoYWluX3ByZXNlbnRfcGl4bWFwKHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX2ltZyAqaW1nKQoreworICAgIHN0cnVjdCBpbnRlbF94MTFfaW1nX2RhdGEgKmRhdGEgPQorICAgICAgICAoc3RydWN0IGludGVsX3gxMV9pbWdfZGF0YSAqKSBpbWctPndzaV9kYXRhOworICAgIHVpbnQzMl90IG9wdGlvbnMgPSBYQ0JfUFJFU0VOVF9PUFRJT05fTk9ORTsKKyAgICB1aW50MzJfdCB0YXJnZXRfbXNjLCBkaXZpc29yLCByZW1haW5kZXI7CisgICAgeGNiX3ZvaWRfY29va2llX3QgY29va2llOworICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgKmVycjsKKworICAgIHRhcmdldF9tc2MgPSAwOworICAgIGRpdmlzb3IgPSAxOworICAgIHJlbWFpbmRlciA9IDA7CisgICAgaWYgKHNjLT5wcmVzZW50X21vZGUgPT0gVktfUFJFU0VOVF9NT0RFX0lNTUVESUFURV9LSFIpIHsKKyAgICAgICAgb3B0aW9ucyB8PSBYQ0JfUFJFU0VOVF9PUFRJT05fQVNZTkM7CisgICAgfQorCisgICAgaWYgKHNjLT5mb3JjZV9jb3B5KQorICAgICAgICBvcHRpb25zIHw9IFhDQl9QUkVTRU5UX09QVElPTl9DT1BZOworCisgICAgY29va2llID0geGNiX3ByZXNlbnRfcGl4bWFwX2NoZWNrZWQoc2MtPmMsCisgICAgICAgICAgICBzYy0+d2luZG93LAorICAgICAgICAgICAgZGF0YS0+cGl4bWFwLAorICAgICAgICAgICAgKytzYy0+bG9jYWwuc2VyaWFsLAorICAgICAgICAgICAgMCwgLyogdmFsaWQtYXJlYSAqLworICAgICAgICAgICAgMCwgLyogdXBkYXRlLWFyZWEgKi8KKyAgICAgICAgICAgIDAsIC8qIHgtb2ZmICovCisgICAgICAgICAgICAwLCAvKiB5LW9mZiAqLworICAgICAgICAgICAgMCwgLyogY3J0YyAqLworICAgICAgICAgICAgMCwgLyogd2FpdC1mZW5jZSAqLworICAgICAgICAgICAgMCwgLyogaWRsZS1mZW5jZSAqLworICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgIHRhcmdldF9tc2MsCisgICAgICAgICAgICBkaXZpc29yLAorICAgICAgICAgICAgcmVtYWluZGVyLAorICAgICAgICAgICAgMCwgTlVMTCk7CisKKyAgICBlcnIgPSB4Y2JfcmVxdWVzdF9jaGVjayhzYy0+YywgY29va2llKTsKKyAgICAvKiBUT0RPVlY6IENhbiB0aGlzIGJlIHZhbGlkYXRlZCAqLworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZnJlZShlcnIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCisvKioKKyAqIEhhbmRsZSBhIFByZXNlbnQgZXZlbnQuCisgKi8KK3N0YXRpYyB2b2lkIHgxMV9zd2FwX2NoYWluX3ByZXNlbnRfZXZlbnQoc3RydWN0IGludGVsX3gxMV9zd2FwX2NoYWluICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3ByZXNlbnRfZ2VuZXJpY19ldmVudF90ICpldikKK3sKKyAgICB1bmlvbiB7CisgICAgICAgIGNvbnN0IHhjYl9wcmVzZW50X2dlbmVyaWNfZXZlbnRfdCAqZXY7CisgICAgICAgIGNvbnN0IHhjYl9wcmVzZW50X2NvbXBsZXRlX25vdGlmeV9ldmVudF90ICpjb21wbGV0ZTsKKyAgICAgICAgY29uc3QgeGNiX3ByZXNlbnRfY29uZmlndXJlX25vdGlmeV9ldmVudF90ICpjb25maWd1cmU7CisgICAgfSB1ID0geyAuZXYgPSBldiB9OworCisgICAgc3dpdGNoICh1LmV2LT5ldnR5cGUpIHsKKyAgICBjYXNlIFhDQl9QUkVTRU5UX0NPTVBMRVRFX05PVElGWToKKyAgICAgICAgc2MtPnJlbW90ZS5zZXJpYWwgPSB1LmNvbXBsZXRlLT5zZXJpYWw7CisgICAgICAgIHNjLT5yZW1vdGUubXNjID0gdS5jb21wbGV0ZS0+bXNjOworICAgICAgICBhc3NlcnQoc2MtPnByZXNlbnRfcXVldWVfbGVuZ3RoID4gMCk7CisgICAgICAgIGlmIChzYy0+aW1hZ2Vfc3RhdGVbc2MtPnByZXNlbnRfcXVldWVbMF1dID09IElOVEVMX1NDX1NUQVRFX0RJU1BMQVlFRCkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcmV2aW91c2x5LWRpc3BsYXllZCBpbWFnZSBmcm9tIHRoZSBwcmVzZW50IHF1ZXVlOgorICAgICAgICAgICAgc2MtPmltYWdlX3N0YXRlW3NjLT5wcmVzZW50X3F1ZXVlWzBdXSA9IElOVEVMX1NDX1NUQVRFX1VOVVNFRDsKKyAgICAgICAgICAgIHNjLT5wcmVzZW50X3F1ZXVlX2xlbmd0aC0tOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzYy0+cHJlc2VudF9xdWV1ZV9sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIHNjLT5wcmVzZW50X3F1ZXVlW2pdID0gc2MtPnByZXNlbnRfcXVldWVbaisxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoc2MtPnByZXNlbnRfcXVldWVfbGVuZ3RoID4gMCk7CisgICAgICAgIGFzc2VydChzYy0+aW1hZ2Vfc3RhdGVbc2MtPnByZXNlbnRfcXVldWVbMF1dID09IElOVEVMX1NDX1NUQVRFX1FVRVVFRF9GT1JfUFJFU0VOVCk7CisgICAgICAgIHNjLT5pbWFnZV9zdGF0ZVtzYy0+cHJlc2VudF9xdWV1ZVswXV0gPSBJTlRFTF9TQ19TVEFURV9ESVNQTEFZRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWENCX1BSRVNFTlRfRVZFTlRfQ09ORklHVVJFX05PVElGWToKKyAgICAgICAgaWYgKCh1LmNvbmZpZ3VyZS0+d2lkdGggIT0gc2MtPndpZHRoKSB8fAorICAgICAgICAgICAgKHUuY29uZmlndXJlLT5oZWlnaHQgIT0gc2MtPmhlaWdodCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzd2FwY2hhaW4gaXMgbm93IGNvbnNpZGVyZWQgIm91dCBvZiBkYXRlIiB3aXRoIHRoZSB3aW5kb3c6CisgICAgICAgICAgICBzYy0+b3V0X29mX2RhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKyAqIFdhaXQgZm9yIGFuIGV2ZW50IG9uIGEgc3dhcCBjaGFpbi4KKyAqIFVzZXMgcG9sbGluZyBiZWNhdXNlIHhjYl93YWl0X2Zvcl9zcGVjaWFsX2V2ZW50IHdvbid0IHRpbWUgb3V0LgorICovCitzdGF0aWMgVmtSZXN1bHQgeDExX3N3YXBfY2hhaW5fd2FpdChzdHJ1Y3QgaW50ZWxfeDExX3N3YXBfY2hhaW4gKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2VyaWFsLCBpbnQ2NF90IHRpbWVvdXQpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIGN1cnJlbnRfdGltZTsgLy8gY3VycmVudCB0aW1lIGZvciBwbGFubmluZyB3YWl0CisgICAgc3RydWN0IHRpbWVzcGVjIHN0b3BfdGltZTsgIC8vIHRpbWUgd2hlbiB0aW1lb3V0IHdpbGwgZWxhcHNlCisgICAgYm9vbCB3YWl0OworICAgIC8vIERvbid0IHdhaXQgb24gZGVzdHJveWVkIHN3YXAgY2hhaW4KKyAgICBpZiAoc2MtPnByZXNlbnRfc3BlY2lhbF9ldmVudCA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisgICAgaWYgKHRpbWVvdXQgPT0gMCl7CisgICAgICAgIHdhaXQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICB3YWl0ID0gdHJ1ZTsKKyAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZjdXJyZW50X3RpbWUpOworICAgICAgICBpZiAodGltZW91dCA9PSAtMSkgeworICAgICAgICAgICAgLy8gd2FpdCBhcHByb3hpbWF0ZWx5IGZvcmV2ZXIKKyAgICAgICAgICAgIHN0b3BfdGltZS50dl9uc2VjID0gY3VycmVudF90aW1lLnR2X25zZWM7CisgICAgICAgICAgICBzdG9wX3RpbWUudHZfc2VjID0gY3VycmVudF90aW1lLnR2X3NlYyArIDEwKjM2NSoyNCo2MCo2MDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0b3BfdGltZS50dl9uc2VjID0gY3VycmVudF90aW1lLnR2X25zZWMgKyAodGltZW91dCAlIDEwMDAwMDAwMDApOworICAgICAgICAgICAgc3RvcF90aW1lLnR2X3NlYyA9IGN1cnJlbnRfdGltZS50dl9zZWMgKyAodGltZW91dCAvIDEwMDAwMDAwMDApOworICAgICAgICAgICAgLy8gQ2Fycnkgb3ZlcmZsb3cgZnJvbSB0dl9uc2VjIHRvIHR2X3NlYworICAgICAgICAgICAgd2hpbGUgKHN0b3BfdGltZS50dl9uc2VjID4gMTAwMDAwMDAwMCkgeworICAgICAgICAgICAgICAgIHN0b3BfdGltZS50dl9zZWMgKz0gMTsKKyAgICAgICAgICAgICAgICBzdG9wX3RpbWUudHZfbnNlYyAtPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKHNjLT5yZW1vdGUuc2VyaWFsIDwgc2VyaWFsKSB7CisgICAgICAgIHhjYl9wcmVzZW50X2dlbmVyaWNfZXZlbnRfdCAqZXY7CisgICAgICAgIHhjYl9pbnRlcm5fYXRvbV9yZXBseV90ICpyZXBseTsKKworICAgICAgICBldiA9ICh4Y2JfcHJlc2VudF9nZW5lcmljX2V2ZW50X3QgKikKKyAgICAgICAgICAgIHhjYl9wb2xsX2Zvcl9zcGVjaWFsX2V2ZW50KHNjLT5jLCBzYy0+cHJlc2VudF9zcGVjaWFsX2V2ZW50KTsKKyAgICAgICAgaWYgKHdhaXQpIHsKKyAgICAgICAgICAgIGludCBwb2xsX3RpbWVvdXQ7CisgICAgICAgICAgICBzdHJ1Y3QgcG9sbGZkIGZkczsKKworICAgICAgICAgICAgZmRzLmZkID0geGNiX2dldF9maWxlX2Rlc2NyaXB0b3Ioc2MtPmMpOworICAgICAgICAgICAgZmRzLmV2ZW50cyA9IFBPTExJTjsKKworICAgICAgICAgICAgd2hpbGUgKCFldikgeworICAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmY3VycmVudF90aW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90aW1lLnR2X3NlYyA+IHN0b3BfdGltZS50dl9zZWMgfHwKKyAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGltZS50dl9zZWMgPT0gc3RvcF90aW1lLnR2X3NlYyAmJiBjdXJyZW50X3RpbWUudHZfbnNlYyA+IHN0b3BfdGltZS50dl9uc2VjKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaW1lIGhhcyBydW4gb3V0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWS19USU1FT1VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb2xsX3RpbWVvdXQgPSAxMDAwLzYwOyAvLyBtaWxsaXNlY29uZHMgZm9yIDYwIEhaCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdGltZS50dl9zZWMgPj0gc3RvcF90aW1lLnR2X3NlYy0xKSB7IC8vIFJlbWFpbmluZyB0aW1lb3V0IG1heSBiZSB1bmRlciAxLzYwIHNlY29uZHMuCisgICAgICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdfdGltZW91dDsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nX3RpbWVvdXQgPSAxMDAwICogKHN0b3BfdGltZS50dl9zZWMgLSBjdXJyZW50X3RpbWUudHZfc2VjKSArIChzdG9wX3RpbWUudHZfbnNlYyAtIGN1cnJlbnRfdGltZS50dl9uc2VjKSAvIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb2xsX3RpbWVvdXQgPiByZW1haW5pbmdfdGltZW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9sbF90aW1lb3V0ID0gcmVtYWluaW5nX3RpbWVvdXQ7IC8vIG1pbGxpc2Vjb25kcyBmb3IgcmVtYWluZGVyIG9mIHRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIGFueSBpbnB1dCBvbiB0aGUgeGNiIGNvbm5lY3Rpb24gb3IgYSB0aW1lb3V0LgorICAgICAgICAgICAgICAgIC8vIEV2ZW50cyBtYXkgY29tZSBpbiBhbmQgYmUgcXVldWVkIHVwIGJlZm9yZSBwb2xsLiAgVGltaW5nIG91dCBoYW5kbGVzIHRoYXQuCisgICAgICAgICAgICAgICAgcG9sbCgmZmRzLCAxLCBwb2xsX3RpbWVvdXQpOworCisgICAgICAgICAgICAgICAgLy8gQW5vdGhlciB0aHJlYWQgbWF5IGhhdmUgaGFuZGxlZCBldmVudHMgYW5kIHVwZGF0ZWQgc2MtPnJlbW90ZS5zZXJpYWwKKyAgICAgICAgICAgICAgICBpZiAoc2MtPnJlbW90ZS5zZXJpYWwgPj0gc2VyaWFsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFVzZSB4Y2JfaW50ZXJuX2F0b21fcmVwbHkganVzdCB0byBtYWtlIHhjYiByZWFsbHkgcmVhZCBldmVudHMgZnJvbSBzb2NrZXQuCisgICAgICAgICAgICAgICAgLy8gQ2FsbGluZyB4Y2JfcG9sbF9mb3Jfc3BlY2lhbF9ldmVudCBmYWlscyB0byBhY3R1YWxseSBsb29rIGZvciBuZXcgcGFja2V0cy4KKyAgICAgICAgICAgICAgICByZXBseSA9IHhjYl9pbnRlcm5fYXRvbV9yZXBseShzYy0+YywgeGNiX2ludGVybl9hdG9tKHNjLT5jLCAxLCAxLCAiYSIpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbHkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShyZXBseSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXYgPSAoeGNiX3ByZXNlbnRfZ2VuZXJpY19ldmVudF90ICopCisgICAgICAgICAgICAgICAgICAgIHhjYl9wb2xsX2Zvcl9zcGVjaWFsX2V2ZW50KHNjLT5jLCBzYy0+cHJlc2VudF9zcGVjaWFsX2V2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghZXYpCisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX05PVF9SRUFEWTsKKyAgICAgICAgfQorCisgICAgICAgIHgxMV9zd2FwX2NoYWluX3ByZXNlbnRfZXZlbnQoc2MsIGV2KTsKKworICAgICAgICBmcmVlKGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgeDExX3N3YXBfY2hhaW5fZGVzdHJveV9iZWdpbihzdHJ1Y3QgaW50ZWxfeDExX3N3YXBfY2hhaW4gKnNjKQoreworICAgIGlmIChzYy0+cGVyc2lzdGVudF9pbWFnZXMpIHsKKyAgICAgICAgdWludDMyX3QgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2MtPnBlcnNpc3RlbnRfaW1hZ2VfY291bnQ7IGkrKykKKyAgICAgICAgICAgIGludGVsX2ltZ19kZXN0cm95KHNjLT5wZXJzaXN0ZW50X2ltYWdlc1tpXSk7CisgICAgICAgIGludGVsX2ZyZWUoc2MsIHNjLT5wZXJzaXN0ZW50X2ltYWdlcyk7CisgICAgfQorCisgICAgaWYgKHNjLT5pbWFnZV9zdGF0ZSkgeworICAgICAgICBpbnRlbF9mcmVlKHNjLCBzYy0+aW1hZ2Vfc3RhdGUpOworICAgIH0KKworICAgIGlmIChzYy0+cHJlc2VudF9xdWV1ZSkgeworICAgICAgICBpbnRlbF9mcmVlKHNjLCBzYy0+cHJlc2VudF9xdWV1ZSk7CisgICAgfQorCisgICAgLy8gRG9uJ3QgdW5yZWdpc3RlciBiZWNhdXNlIGFub3RoZXIgc3dhcCBjaGFpbiBtYXkgYmUgdXNpbmcgdGhpcyBldmVudCBxdWV1ZS4KKyAgICAvL2lmIChzYy0+cHJlc2VudF9zcGVjaWFsX2V2ZW50KQorICAgIC8vICAgIHhjYl91bnJlZ2lzdGVyX2Zvcl9zcGVjaWFsX2V2ZW50KHNjLT5jLCBzYy0+cHJlc2VudF9zcGVjaWFsX2V2ZW50KTsKK30KKworc3RhdGljIHZvaWQgeDExX3N3YXBfY2hhaW5fZGVzdHJveV9lbmQoc3RydWN0IGludGVsX3gxMV9zd2FwX2NoYWluICpzYykKK3sKKyAgICAvLyBMZWF2ZSBtZW1vcnkgYXJvdW5kIGZvciBub3cgYmVjYXVzZSBmZW5jZXMgdXNlIGl0IHdpdGhvdXQgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vaW50ZWxfZnJlZShzYywgc2MpOworfQorCitzdGF0aWMgVmtSZXN1bHQgeDExX3N3YXBfY2hhaW5fY3JlYXRlKHN0cnVjdCBpbnRlbF9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW50ZWxfeDExX3N3YXBfY2hhaW4gKipzY19yZXQpCit7CisgICAgY29uc3QgeGNiX3JhbmRyX3Byb3ZpZGVyX3QgcHJvdmlkZXIgPSAwOworCisgICAgY29uc3QgVmtJY2RTdXJmYWNlWGNiICpzX3hjYiA9IHgxMV94Y2Jfc3VyZmFjZShpbmZvLT5zdXJmYWNlKTsKKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIGNvbnN0IFZrSWNkU3VyZmFjZVhsaWIgKnNfeGxpYiA9IHgxMV94bGliX3N1cmZhY2UoaW5mby0+c3VyZmFjZSk7CisgICAgYXNzZXJ0KHNfeGNiIHx8IHNfeGxpYik7CisjZW5kaWYgLy8gVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisKKyAgICB4Y2JfY29ubmVjdGlvbl90ICpjID0gMDsKKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93ID0gMDsKKyAgICBpZiAoc194Y2IpCisgICAgeworICAgICAgICBjID0gc194Y2ItPmNvbm5lY3Rpb247CisgICAgICAgIHdpbmRvdyA9IHNfeGNiLT53aW5kb3c7CisgICAgfQorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIGVsc2UgaWYgKHNfeGxpYikKKyAgICB7CisgICAgICAgIGMgPSBYR2V0WENCQ29ubmVjdGlvbihzX3hsaWItPmRweSk7CisgICAgICAgIHdpbmRvdyA9ICh4Y2Jfd2luZG93X3Qpc194bGliLT53aW5kb3c7CisgICAgfQorI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgICAgc3RydWN0IGludGVsX3gxMV9zd2FwX2NoYWluICpzYzsKKyAgICBpbnQgZmQ7CisKKyAgICAvKiBUT0RPVlY6IEFkZCB0ZXN0IHRvIHZhbGlkYXRpb24gbGF5ZXIgKi8KKyAgICBpZiAoIXgxMV9pc19mb3JtYXRfcHJlc2VudGFibGUoZGV2LCBpbmZvLT5pbWFnZUZvcm1hdCkpIHsKKyAgICAgICAgaW50ZWxfZGV2X2xvZyhkZXYsIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhULAorICAgICAgICAgICAgICAgICAgICAgICZkZXYtPmJhc2UsIDAsIDAsICJpbnZhbGlkIHByZXNlbnRhYmxlIGltYWdlIGZvcm1hdCIpOworLy8gICAgICAgIHJldHVybiBWS19FUlJPUl9JTlZBTElEX1ZBTFVFOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIC8qIFRPRE9WVjogQ2FuIHdlIGFkZCB0ZXN0IHRvIHZhbGlkYXRpb24gbGF5ZXI/ICovCisgICAgaWYgKCF4MTFfaXNfZHJpM19hbmRfcHJlc2VudF9zdXBwb3J0ZWQoYykpIHsKKy8vICAgICAgICByZXR1cm4gVktfRVJST1JfSU5WQUxJRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICAvKiBUT0RPVlY6IENhbiB3ZSBhZGQgdGVzdCB0byB2YWxpZGF0aW9uIGxheWVyPyAqLworICAgIGZkID0geDExX2RyaTNfb3BlbihjLCB3aW5kb3csIHByb3ZpZGVyKTsKKyAgICBpZiAoZmQgPCAwIHx8ICF4MTFfZ3B1X21hdGNoX2ZkKGRldi0+Z3B1LCBmZCkpIHsKKyAgICAgICAgaWYgKGZkID49IDApCisgICAgICAgICAgICBjbG9zZShmZCk7CisvLyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOVkFMSURfVkFMVUU7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgY2xvc2UoZmQpOworCisgICAgc2MgPSBpbnRlbF9hbGxvYyhkZXYsIHNpemVvZigqc2MpLCBzaXplb2YoaW50KSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICBpZiAoIXNjKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgbWVtc2V0KHNjLCAwLCBzaXplb2YoKnNjKSk7CisgICAgaW50ZWxfaGFuZGxlX2luaXQoJnNjLT5oYW5kbGUsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQQ0hBSU5fS0hSX0VYVCwgZGV2LT5iYXNlLmhhbmRsZS5pbnN0YW5jZSk7CisKKyAgICBzYy0+YyA9IGM7CisgICAgc2MtPndpbmRvdyA9IHdpbmRvdzsKKworICAgIC8qIGFsd2F5cyBjb3B5IHVubGVzcyBmbGlwIGJpdCBpcyBzZXQgKi8KKyAgICBzYy0+cHJlc2VudF9tb2RlID0gaW5mby0+cHJlc2VudE1vZGU7CisgICAgLy8gUmVjb3JkIHRoZSBzd2FwY2hhaW4ncyB3aWR0aCBhbmQgaGVpZ2h0LCBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgd2hlbgorICAgIC8vIGl0IGlzICJvdXQgb2YgZGF0ZSIgdy5yLnQuIHRoZSB3aW5kb3c6CisgICAgc2MtPndpZHRoID0gaW5mby0+aW1hZ2VFeHRlbnQud2lkdGg7CisgICAgc2MtPmhlaWdodCA9IGluZm8tPmltYWdlRXh0ZW50LmhlaWdodDsKKyAgICBzYy0+b3V0X29mX2RhdGUgPSBmYWxzZTsKKyAgICBzYy0+YmVpbmdfZGVsZXRlZCA9IGZhbHNlOworICAgIHNjLT5mb3JjZV9jb3B5ID0gdHJ1ZTsKKworICAgIGlmICgheDExX3N3YXBfY2hhaW5fZHJpM19hbmRfcHJlc2VudF9xdWVyeV92ZXJzaW9uKHNjKSB8fAorICAgICAgICAheDExX3N3YXBfY2hhaW5fcHJlc2VudF9zZWxlY3RfaW5wdXQoc2MsIHgxMV9zd2FwX2NoYWluKGluZm8tPm9sZFN3YXBjaGFpbikpIHx8CisgICAgICAgICF4MTFfc3dhcF9jaGFpbl9jcmVhdGVfcGVyc2lzdGVudF9pbWFnZXMoc2MsIGRldiwgaW5mbykpIHsKKyAgICAgICAgeDExX3N3YXBfY2hhaW5fZGVzdHJveV9iZWdpbihzYyk7CisgICAgICAgIHgxMV9zd2FwX2NoYWluX2Rlc3Ryb3lfZW5kKHNjKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICAqc2NfcmV0ID0gc2M7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgeDExX2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgaW50ZWxfeDExX2Rpc3BsYXkgKmRweSkKK3sKKyAgICBpbnRlbF9mcmVlKGRweSwgZHB5LT5tb2Rlcyk7CisgICAgaW50ZWxfZnJlZShkcHksIGRweSk7Cit9CisKK3ZvaWQgaW50ZWxfd3NpX2dwdV9jbGVhbnVwKHN0cnVjdCBpbnRlbF9ncHUgKmdwdSkKK3sKKyAgICBpZiAoZ3B1LT5kaXNwbGF5cykgeworICAgICAgICB1aW50MzJfdCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBncHUtPmRpc3BsYXlfY291bnQ7IGkrKykgeworICAgICAgICAgICAgc3RydWN0IGludGVsX3gxMV9kaXNwbGF5ICpkcHkgPQorICAgICAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfeDExX2Rpc3BsYXkgKikgZ3B1LT5kaXNwbGF5c1tpXTsKKyAgICAgICAgICAgIHgxMV9kaXNwbGF5X2Rlc3Ryb3koZHB5KTsKKyAgICAgICAgfQorICAgICAgICBpbnRlbF9mcmVlKGdwdSwgZ3B1LT5kaXNwbGF5cyk7CisgICAgfQorfQorCitWa1Jlc3VsdCBpbnRlbF93c2lfaW1nX2luaXQoc3RydWN0IGludGVsX2ltZyAqaW1nKQoreworICAgIHN0cnVjdCBpbnRlbF94MTFfaW1nX2RhdGEgKmRhdGE7CisKKyAgICBkYXRhID0gaW50ZWxfYWxsb2MoaW1nLCBzaXplb2YoKmRhdGEpLCBzaXplb2YoaW50KSwgVktfU1lTVEVNX0FMTE9DQVRJT05fU0NPUEVfT0JKRUNUKTsKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBtZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisKKyAgICBhc3NlcnQoIWltZy0+d3NpX2RhdGEpOworICAgIGltZy0+d3NpX2RhdGEgPSBkYXRhOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaW50ZWxfd3NpX2ltZ19jbGVhbnVwKHN0cnVjdCBpbnRlbF9pbWcgKmltZykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfeDExX2ltZ19kYXRhICpkYXRhID0KKyAgICAgICAgKHN0cnVjdCBpbnRlbF94MTFfaW1nX2RhdGEgKikgaW1nLT53c2lfZGF0YTsKKworICAgIGlmIChkYXRhLT5tZW0pIHsKKyAgICAgICAgY2xvc2UoZGF0YS0+cHJpbWVfZmQpOworICAgICAgICBpbnRlbF9tZW1fZnJlZShkYXRhLT5tZW0pOworICAgIH0KKworICAgIGludGVsX2ZyZWUoaW1nLCBpbWctPndzaV9kYXRhKTsKK30KKworVmtSZXN1bHQgaW50ZWxfd3NpX2ZlbmNlX2luaXQoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSkKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfeDExX2ZlbmNlX2RhdGEgKmRhdGE7CisKKyAgICBkYXRhID0gaW50ZWxfYWxsb2MoZmVuY2UsIHNpemVvZigqZGF0YSksIHNpemVvZihpbnQpLCBWS19TWVNURU1fQUxMT0NBVElPTl9TQ09QRV9PQkpFQ1QpOworICAgIGlmICghZGF0YSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIG1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworICAgIGFzc2VydCghZmVuY2UtPndzaV9kYXRhKTsKKyAgICBmZW5jZS0+d3NpX2RhdGEgPSBkYXRhOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaW50ZWxfd3NpX2ZlbmNlX2NsZWFudXAoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSkKK3sKKyAgICBpbnRlbF9mcmVlKGZlbmNlLCBmZW5jZS0+d3NpX2RhdGEpOworfQorCit2b2lkIGludGVsX3dzaV9mZW5jZV9jb3B5KHN0cnVjdCBpbnRlbF9mZW5jZSAqZmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9mZW5jZSAqc3JjKQoreworICAgIGlmICghZmVuY2UtPndzaV9kYXRhKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KGZlbmNlLT53c2lfZGF0YSwgc3JjLT53c2lfZGF0YSwKKyAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW50ZWxfeDExX2ZlbmNlX2RhdGEpKTsKK30KKworVmtSZXN1bHQgaW50ZWxfd3NpX2ZlbmNlX3dhaXQoc3RydWN0IGludGVsX2ZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dF9ucykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfeDExX2ZlbmNlX2RhdGEgKmRhdGEgPQorICAgICAgICAoc3RydWN0IGludGVsX3gxMV9mZW5jZV9kYXRhICopIGZlbmNlLT53c2lfZGF0YTsKKworICAgIGlmICghZGF0YSkKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisKKyAgICBpZiAoIWRhdGEtPnN3YXBfY2hhaW4pCisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworCisgICAgcmV0dXJuIHgxMV9zd2FwX2NoYWluX3dhaXQoZGF0YS0+c3dhcF9jaGFpbiwgZGF0YS0+c2VyaWFsLCB0aW1lb3V0X25zKTsKK30KKworCisvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIGlmIGFuIGFwcGxpY2F0aW9uIHVzZXMgdGhpcyBJQ0QKKy8vIGRpcmVjdGx5LCB3aXRob3V0IHRoZSBjb21tb24gVnVsa2FuIGxvYWRlcjoKKy8vCisvLyBDcmVhdGUgYSBWa1N1cmZhY2VLSFIgb2JqZWN0IGZvciBYQ0Igd2luZG93IGNvbm5lY3Rpb25zOgorVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlWGNiU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICByZXR1cm4geDExX3hjYl9zdXJmYWNlX2NyZWF0ZSgoc3RydWN0IGludGVsX2luc3RhbmNlICopIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmtJY2RTdXJmYWNlWGNiICoqKSBwU3VyZmFjZSk7Cit9CisKK1ZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgeGNiX3Zpc3VhbGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaWQpCit7CisgICAgLy8gSnVzdCBtYWtlIHN1cmUgd2UgaGF2ZSBhIG5vbi16ZXJvIGNvbm5lY3Rpb246CisgICAgaWYgKGNvbm5lY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIFZLX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KK30KKworI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorLy8gTm90ZTogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBvbmx5IG5lZWRlZCBpZiBhbiBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgSUNECisvLyBkaXJlY3RseSwgd2l0aG91dCB0aGUgY29tbW9uIFZ1bGthbiBsb2FkZXI6CisvLworLy8gQ3JlYXRlIGEgVmtTdXJmYWNlS0hSIG9iamVjdCBmb3IgWExJQiB3aW5kb3cgY29ubmVjdGlvbnM6CitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgY29uc3QgVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIqICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZSkKK3sKKyAgICByZXR1cm4geDExX3hsaWJfc3VyZmFjZV9jcmVhdGUoKHN0cnVjdCBpbnRlbF9pbnN0YW5jZSAqKSBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZrSWNkU3VyZmFjZVhsaWIgKiopIHBTdXJmYWNlKTsKK30KKworVktBUElfQVRUUiBWa0Jvb2wzMiBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICBEaXNwbGF5KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRweSwKKyAgICBWaXN1YWxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbElEKQoreworICAgIC8vIEp1c3QgbWFrZSBzdXJlIHdlIGhhdmUgYSBub24temVybyBkaXNwbGF5OgorICAgIGlmIChkcHkpIHsKKyAgICAgICAgcmV0dXJuIFZLX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KK30KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95U3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgeDExX3N1cmZhY2VfZGVzdHJveShzdXJmYWNlKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpCit7CisgICAgY29uc3QgVmtJY2RTdXJmYWNlWGNiICpzX3hjYiA9IHgxMV94Y2Jfc3VyZmFjZShzdXJmYWNlKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBjb25zdCBWa0ljZFN1cmZhY2VYbGliICpzX3hsaWIgPSB4MTFfeGxpYl9zdXJmYWNlKHN1cmZhY2UpOworICAgIGFzc2VydChzX3hjYiB8fCBzX3hsaWIpOworI2VuZGlmIC8vIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorCisgICAgKnBTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIGlmIChzX3hjYikgeworICAgICAgICAvLyBKdXN0IG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbm9uLXplcm8gY29ubmVjdGlvbjoKKyAgICAgICAgaWYgKHNfeGNiLT5jb25uZWN0aW9uKSB7CisgICAgICAgICAgICAqcFN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgZWxzZSBpZiAoc194bGliKSB7CisgICAgICAgIC8vIEp1c3QgbWFrZSBzdXJlIHdlIGhhdmUgYSBub24temVybyBkaXNwbGF5OgorICAgICAgICBpZiAoc194bGliLT5kcHkpIHsKKyAgICAgICAgICAgICpwU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykKK3sKKyAgICByZXR1cm4geDExX2dldF9zdXJmYWNlX2NhcGFiaWxpdGllcyhzdXJmYWNlLCBwU3VyZmFjZUNhcGFiaWxpdGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdEtIUiogICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHMpCit7CisgICAgVmtSZXN1bHQgcmV0ID0gVktfU1VDQ0VTUzsKKworICAgIGlmIChwU3VyZmFjZUZvcm1hdHMpIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICpwU3VyZmFjZUZvcm1hdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1tpXS5mb3JtYXQgPSB4MTFfcHJlc2VudGFibGVfZm9ybWF0c1tpXTsKKyAgICAgICAgICAgIHBTdXJmYWNlRm9ybWF0c1tpXS5jb2xvclNwYWNlID0gVktfQ09MT1JTUEFDRV9TUkdCX05PTkxJTkVBUl9LSFI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqcFN1cmZhY2VGb3JtYXRDb3VudCA9IEFSUkFZX1NJWkUoeDExX3ByZXNlbnRhYmxlX2Zvcm1hdHMpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VudE1vZGVzKQoreworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisKKyAgICBpZiAocFByZXNlbnRNb2RlcykgeworICAgICAgICBwUHJlc2VudE1vZGVzWzBdID0gVktfUFJFU0VOVF9NT0RFX0lNTUVESUFURV9LSFI7CisgICAgICAgIHBQcmVzZW50TW9kZXNbMV0gPSBWS19QUkVTRU5UX01PREVfRklGT19LSFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBQcmVzZW50TW9kZUNvdW50ID0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIqICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtTd2FwY2hhaW5LSFIqICAgICAgICAgICAgICAgICAgICAgICAgIHBTd2FwY2hhaW4pCit7CisgICAgc3RydWN0IGludGVsX2RldiAqZGV2ID0gaW50ZWxfZGV2KGRldmljZSk7CisKKyAgICBpZiAocENyZWF0ZUluZm8tPm9sZFN3YXBjaGFpbikgeworICAgICAgICAvLyBUT0RPOiBFdmVudHVhbGx5LCBkbyBtb3JlIHRoYW4gc2ltcGx5IHVwLWZyb250IGRlc3Ryb3kgdGhlCisgICAgICAgIC8vIG9sZFN3YXBjaGFpbiAoYnV0IGp1c3QgZG8gdGhhdCBmb3Igbm93KToKKyAgICAgICAgc3RydWN0IGludGVsX3gxMV9zd2FwX2NoYWluICpzYyA9CisgICAgICAgICAgICB4MTFfc3dhcF9jaGFpbihwQ3JlYXRlSW5mby0+b2xkU3dhcGNoYWluKTsKKworICAgICAgICBzYy0+YmVpbmdfZGVsZXRlZCA9IHRydWU7CisgICAgICAgIHgxMV9zd2FwX2NoYWluX2Rlc3Ryb3lfYmVnaW4oc2MpOworICAgIH0KKworICAgIHJldHVybiB4MTFfc3dhcF9jaGFpbl9jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIChzdHJ1Y3QgaW50ZWxfeDExX3N3YXBfY2hhaW4gKiopIHBTd2FwY2hhaW4pOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqc2MgPSB4MTFfc3dhcF9jaGFpbihzd2FwY2hhaW4pOworCisgICAgaWYgKCFzYy0+YmVpbmdfZGVsZXRlZCkgeworICAgICAgICB4MTFfc3dhcF9jaGFpbl9kZXN0cm95X2JlZ2luKHNjKTsKKyAgICB9CisgICAgeDExX3N3YXBfY2hhaW5fZGVzdHJveV9lbmQoc2MpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwY2hhaW4sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnQsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VzKQoreworICAgIHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqc2MgPSB4MTFfc3dhcF9jaGFpbihzd2FwY2hhaW4pOworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisKKyAgICAvLyBUT0RPVlY6IE1vdmUgdGhpcyBjaGVjayB0byBhIHZhbGlkYXRpb24gbGF5ZXIgKGkuZS4gdGhlIGRyaXZlciBzaG91bGQKKyAgICAvLyBhc3N1bWUgdGhlIGNvcnJlY3QgZGF0YSB0eXBlLCBhbmQgbm90IGNoZWNrKToKKyAgICBpZiAoIXBDb3VudCkgeworLy8gICAgICAgIHJldHVybiBWS19FUlJPUl9JTlZBTElEX1BPSU5URVI7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgaWYgKHBTd2FwY2hhaW5JbWFnZXMpIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICpwQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlc1tpXSA9IChWa0ltYWdlKSBzYy0+cGVyc2lzdGVudF9pbWFnZXNbaV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqcENvdW50ID0gc2MtPnBlcnNpc3RlbnRfaW1hZ2VfY291bnQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KQoreworICAgIHN0cnVjdCBpbnRlbF94MTFfc3dhcF9jaGFpbiAqc2MgPSB4MTFfc3dhcF9jaGFpbihzd2FwY2hhaW4pOworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisKKyAgICBpZiAoc2MtPm91dF9vZl9kYXRlKSB7CisgICAgICAgIC8vIFRoZSB3aW5kb3cgd2FzIHJlc2l6ZWQsIGFuZCB0aGUgc3dhcGNoYWluIG11c3QgYmUgcmUtY3JlYXRlZDoKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9EQVRFX0tIUjsKKyAgICB9CisKKyAgICAvLyBGaW5kIGFuIHVudXNlZCBpbWFnZSB0byByZXR1cm46CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYy0+cGVyc2lzdGVudF9pbWFnZV9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzYy0+aW1hZ2Vfc3RhdGVbaV0gPT0gSU5URUxfU0NfU1RBVEVfVU5VU0VEKSB7CisgICAgICAgICAgICBzYy0+aW1hZ2Vfc3RhdGVbaV0gPSBJTlRFTF9TQ19TVEFURV9BUFBfT1dORUQ7CisgICAgICAgICAgICAqcEltYWdlSW5kZXggPSBpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIG5vIGltYWdlIGlzIHJlYWR5LCB3YWl0IGZvciBhIHByZXNlbnQgdG8gZmluaXNoCisgICAgcmV0ID0geDExX3N3YXBfY2hhaW5fd2FpdChzYywgc2MtPnJlbW90ZS5zZXJpYWwrMSwgdGltZW91dCk7CisgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gRmluZCBhbiB1bnVzZWQgaW1hZ2UgdG8gcmV0dXJuOgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2MtPnBlcnNpc3RlbnRfaW1hZ2VfY291bnQ7IGkrKykgeworICAgICAgICBpZiAoc2MtPmltYWdlX3N0YXRlW2ldID09IElOVEVMX1NDX1NUQVRFX1VOVVNFRCkgeworICAgICAgICAgICAgc2MtPmltYWdlX3N0YXRlW2ldID0gSU5URUxfU0NfU1RBVEVfQVBQX09XTkVEOworICAgICAgICAgICAgKnBJbWFnZUluZGV4ID0gaTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTk9URTogU2hvdWxkIG5ldmVyIGdldCBoZXJlLCBidXQgaW4gY2FzZSB3ZSBkbywgZG8gc29tZXRoaW5nOgorICAgIGFzc2VydCgwKTsKKyAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworfQorCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlUHJlc2VudEtIUigKKyAgICBWa1F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXywKKyAgICBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiAgICAgICAgICAgICAgICAgIHBQcmVzZW50SW5mbykKK3sKKyAgICBzdHJ1Y3QgaW50ZWxfcXVldWUgKnF1ZXVlID0gaW50ZWxfcXVldWUocXVldWVfKTsKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQzMl90IG51bV9zd2FwY2hhaW5zID0gcFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudDsKKyAgICBWa1Jlc3VsdCBydG4gPSBWS19TVUNDRVNTOworCisgICAgLy8gV2FpdCBmb3IgcXVldWUgdG8gaWRsZSBiZWZvcmUgb3V0LW9mLWJhbmQgeGNiIHByZXNlbnQgb3BlcmF0aW9uLgorICAgIGNvbnN0IFZrUmVzdWx0IHIgPSBpbnRlbF9xdWV1ZV93YWl0KHF1ZXVlLCAtMSk7CisgICAgKHZvaWQpIHI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N3YXBjaGFpbnM7IGkrKykgeworICAgICAgICBzdHJ1Y3QgaW50ZWxfeDExX3N3YXBfY2hhaW4gKnNjID0KKyAgICAgICAgICAgIHgxMV9zd2FwX2NoYWluKHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnNbaV0pOworICAgICAgICBzdHJ1Y3QgaW50ZWxfaW1nICppbWcgPSAKKyAgICAgICAgICAgIHNjLT5wZXJzaXN0ZW50X2ltYWdlc1twUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXNbaV1dOworICAgICAgICBzdHJ1Y3QgaW50ZWxfeDExX2ZlbmNlX2RhdGEgKmRhdGEgPQorICAgICAgICAgICAgKHN0cnVjdCBpbnRlbF94MTFfZmVuY2VfZGF0YSAqKSBxdWV1ZS0+ZmVuY2UtPndzaV9kYXRhOworICAgICAgICBWa1Jlc3VsdCByZXQ7CisKKyAgICAgICAgaWYgKHNjLT5vdXRfb2ZfZGF0ZSkgeworICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyB3YXMgcmVzaXplZCwgYW5kIHRoZSBzd2FwY2hhaW4gbXVzdCBiZSByZS1jcmVhdGVkOgorICAgICAgICAgICAgcnRuID0gVktfRVJST1JfT1VUX09GX0RBVEVfS0hSOworICAgICAgICAgICAgLy8gVE9ETzogUG90ZW50aWFsbHkgY2hhbmdlIHRoaXMgdG8gbWF0Y2ggdGhlIHJlc3VsdCBvZiBCdWcgMTQ5NTIKKyAgICAgICAgICAgIC8vICh3aGljaCBkZWFscyB3aXRoIHNvbWUgb2YgdGhlIHN3YXBjaGFpbnMgYmVpbmcgb3V0LW9mLWRhdGUsIGJ1dAorICAgICAgICAgICAgLy8gbm90IGFsbCBvZiB0aGVtKS4gIEZvciBub3csIGp1c3QgcHJlc2VudCB0aGUgc3dhcGNoYWlucyB0aGF0CisgICAgICAgICAgICAvLyBhcmVuJ3Qgb3V0LW9mLWRhdGUsIGFuZCBza2lwIHRoZSBvbmVzIHRoYXQgYXJlIG91dC1vZi1kYXRlOgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB4MTFfc3dhcF9jaGFpbl9wcmVzZW50X3BpeG1hcChzYywgaW1nKTsKKyAgICAgICAgaWYgKHJldCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjb3JkIHRoZSBzdGF0ZSBjaGFuZ2UgZm9yIHRoaXMgaW1hZ2UsIGFuZCBhZGQgdGhpcyBpbWFnZSB0byB0aGUKKyAgICAgICAgLy8gcHJlc2VudCBxdWV1ZSBmb3IgdGhlIHN3YXAgY2hhaW46CisgICAgICAgIHNjLT5pbWFnZV9zdGF0ZVtwUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXNbaV1dID0KKyAgICAgICAgICAgIElOVEVMX1NDX1NUQVRFX1FVRVVFRF9GT1JfUFJFU0VOVDsKKyAgICAgICAgc2MtPnByZXNlbnRfcXVldWVbc2MtPnByZXNlbnRfcXVldWVfbGVuZ3RoKytdID0KKyAgICAgICAgICAgIHBQcmVzZW50SW5mby0+cEltYWdlSW5kaWNlc1tpXTsKKworICAgICAgICBkYXRhLT5zd2FwX2NoYWluID0gc2M7CisgICAgICAgIGRhdGEtPnNlcmlhbCA9IHNjLT5sb2NhbC5zZXJpYWw7CisgICAgICAgIHNjLT5wcmVzZW50X3NlcmlhbCA9IHNjLT5sb2NhbC5zZXJpYWw7CisgICAgICAgIGludGVsX2ZlbmNlX3NldF9zZXFubyhxdWV1ZS0+ZmVuY2UsIGltZy0+b2JqLm1lbS0+Ym8pOworICAgIH0KKworICAgIHJldHVybiBydG47Cit9CmRpZmYgLS1naXQgYS9pY2QvbnVsbGRydi9DTWFrZUxpc3RzLnR4dCBiL2ljZC9udWxsZHJ2L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzRiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvbnVsbGRydi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDQxIEBACisjIENyZWF0ZSB0aGUgbnVsbGRydiBWdWxrYW4gRFJJIGxpYnJhcnkKKworaWYgKFdJTjMyKQorICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorZWxzZSgpCitzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSIpCitlbmRpZigpCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgbnVsbGRydl9ncGEuYworICAgIENPTU1BTkQgJHtQWVRIT05fQ01EfSAke1BST0pFQ1RfU09VUkNFX0RJUn0vdmstdnRnZW5lcmF0ZS5weSBYY2IgaWNkLWdldC1wcm9jLWFkZHIgPiBudWxsZHJ2X2dwYS5jCisgICAgREVQRU5EUyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdmstdnRnZW5lcmF0ZS5weSAke1BST0pFQ1RfU09VUkNFX0RJUn0vdnVsa2FuLnB5KQorCitzZXQoc291cmNlcworICAgIG51bGxkcnYuYworICAgIG51bGxkcnZfZ3BhLmMKKyAgICApCisKK3NldChkZWZpbml0aW9ucyAiIikKKworc2V0KGxpYnJhcmllcworICAgIGljZCkKKworYWRkX2xpYnJhcnkoVktfbnVsbGRydiBTSEFSRUQgJHtzb3VyY2VzfSkKK3RhcmdldF9jb21waWxlX2RlZmluaXRpb25zKFZLX251bGxkcnYgUFJJVkFURSAke2RlZmluaXRpb25zfSkKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKFZLX251bGxkcnYgUFJJVkFURSAke2luY2x1ZGVfZGlyc30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVktfbnVsbGRydiAke2xpYnJhcmllc30pCisKK2lmIChXSU4zMikKKyAgICAjIEFkZCBpbiB0aGUgRExMICJtYXAiIGZpbGUgZm9yIHZrR2V0UHJvY0FkZHIoKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhWS19udWxsZHJ2IFBST1BFUlRJRVMKKyAgICAgICAgTElOS19GTEFHUyAiL0RFRjoke1BST0pFQ1RfU09VUkNFX0RJUn0vaWNkL251bGxkcnYvVktfbnVsbGRydi5kZWYiKQorZWxzZSgpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZLX251bGxkcnYgUFJPUEVSVElFUworICAgICAgICBMSU5LX0ZMQUdTICItV2wsLUJzeW1ib2xpYyIpCisgICAgaWYgKE5PVCAoQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUikpCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KG51bGxkcnZfaWNkLWpzb24gQUxMCisgICAgICAgIENPTU1BTkQgbG4gLXNmICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9udWxsZHJ2X2ljZC5qc29uCisgICAgICAgICAgICBWRVJCQVRJTQorICAgICAgICAgICAgKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2ljZC9udWxsZHJ2L1JFQURNRS5tZCBiL2ljZC9udWxsZHJ2L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDhkNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvaWNkL251bGxkcnYvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMyBAQAorIyBOdWxsIFZLIERyaXZlcgorCitUaGlzIGRpcmVjdG9yeSBwcm92aWRlcyBhIG51bGwgVksgZHJpdmVyCmRpZmYgLS1naXQgYS9pY2QvbnVsbGRydi9WS19udWxsZHJ2LmRlZiBiL2ljZC9udWxsZHJ2L1ZLX251bGxkcnYuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjFkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvbnVsbGRydi9WS19udWxsZHJ2LmRlZgpAQCAtMCwwICsxLDMwIEBACis7Ozs7IEJlZ2luIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OworOworOyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorOyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzs7OzsgIEVuZCBDb3B5cmlnaHQgTm90aWNlIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CisKKzsgVGhlIGZvbGxvd2luZyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzLCBmb3IgZXhwb3J0aW5nIHN5bWJvbHMgZnJvbSB0aGUgRExMCisKK0xJQlJBUlkgVktfbnVsbGRydgorRVhQT1JUUworICAgdmtDcmVhdGVJbnN0YW5jZQorICAgdmtEZXN0cm95SW5zdGFuY2UKKyAgIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzCisgICB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcworICAgeGNiQ3JlYXRlV2luZG93CisgICB4Y2JEZXN0cm95V2luZG93CisgICB4Y2JHZXRNZXNzYWdlCisgICB4Y2JRdWV1ZVByZXNlbnQKZGlmZiAtLWdpdCBhL2ljZC9udWxsZHJ2L251bGxkcnYuYyBiL2ljZC9udWxsZHJ2L251bGxkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDYyNjEyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL251bGxkcnYvbnVsbGRydi5jCkBAIC0wLDAgKzEsMjIzNSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjb2R5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSWFuIEVsbGlvdHQgPGlhbkBMdW5hckcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgIm51bGxkcnYuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWYgMAorI2RlZmluZSBOVUxMRFJWX0xPR19GVU5DIFwKKyAgICBkbyB7IFwKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7IFwKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7IFwKKyAgICAgICAgcHJpbnRmKCJudWxsIGRyaXZlcjogJXNcbiIsIF9fRlVOQ1RJT05fXyk7IFwKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7IFwKKyAgICB9IHdoaWxlICgwKQorI2Vsc2UKKyAgICAjZGVmaW5lIE5VTExEUlZfTE9HX0ZVTkMgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgbnVsbGRydl9pbnN0YW5jZV9leHRlbnNpb25zW05VTExEUlZfSU5TVF9FWFRfQ09VTlRdID0geworICAgIHsKKyAgICAgICAgLmV4dGVuc2lvbk5hbWUgPSBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgLnNwZWNWZXJzaW9uID0gVktfS0hSX1NVUkZBQ0VfU1BFQ19WRVJTSU9OLAorICAgIH0sCisgICAgeworICAgICAgICAuZXh0ZW5zaW9uTmFtZSA9IFZLX0tIUl9YQ0JfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgLnNwZWNWZXJzaW9uID0gVktfS0hSX1hDQl9TVVJGQUNFX1NQRUNfVkVSU0lPTiwKKyAgICB9LAorfTsKKworY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzIG51bGxkcnZfZGV2aWNlX2V4dHNbTlVMTERSVl9ERVZfRVhUX0NPVU5UXSA9IHsKKyAgICB7CisgICAgICAgIC5leHRlbnNpb25OYW1lID0gVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSwKKyAgICAgICAgLnNwZWNWZXJzaW9uID0gVktfS0hSX1NXQVBDSEFJTl9TUEVDX1ZFUlNJT04sCisgICAgfQorfTsKKworc3RhdGljIHN0cnVjdCBudWxsZHJ2X2Jhc2UgKm51bGxkcnZfYmFzZSh2b2lkKiBiYXNlKQoreworICAgIHJldHVybiAoc3RydWN0IG51bGxkcnZfYmFzZSAqKSBiYXNlOworfQorCitzdGF0aWMgc3RydWN0IG51bGxkcnZfYmFzZSAqbnVsbGRydl9iYXNlX2NyZWF0ZSgKKyAgICAgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXYsCisgICAgICAgIHNpemVfdCBvYmpfc2l6ZSwKKyAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdHlwZSkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9iYXNlICpiYXNlOworCisgICAgaWYgKCFvYmpfc2l6ZSkKKyAgICAgICAgb2JqX3NpemUgPSBzaXplb2YoKmJhc2UpOworCisgICAgYXNzZXJ0KG9ial9zaXplID49IHNpemVvZigqYmFzZSkpOworCisgICAgYmFzZSA9IChzdHJ1Y3QgbnVsbGRydl9iYXNlKiltYWxsb2Mob2JqX3NpemUpOworICAgIGlmICghYmFzZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBtZW1zZXQoYmFzZSwgMCwgb2JqX3NpemUpOworCisgICAgLy8gSW5pdGlhbGl6ZSBwb2ludGVyIHRvIGxvYWRlcidzIGRpc3BhdGNoIHRhYmxlIHdpdGggSUNEX0xPQURFUl9NQUdJQworICAgIHNldF9sb2FkZXJfbWFnaWNfdmFsdWUoYmFzZSk7CisKKyAgICBpZiAoZGV2ID09IE5VTEwpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZGV2IGlzIE5VTEwgd2hlbiB3ZSBhcmUgY3JlYXRpbmcgdGhlIGJhc2UgZGV2aWNlIG9iamVjdAorICAgICAgICAgKiBTZXQgZGV2IG5vdyBzbyB0aGF0IGRlYnVnIHNldHVwIGhhcHBlbnMgY29ycmVjdGx5CisgICAgICAgICAqLworICAgICAgICBkZXYgPSAoc3RydWN0IG51bGxkcnZfZGV2ICopIGJhc2U7CisgICAgfQorCisKKyAgICBiYXNlLT5nZXRfbWVtb3J5X3JlcXVpcmVtZW50cyA9IE5VTEw7CisKKyAgICByZXR1cm4gYmFzZTsKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfZ3B1X2FkZChpbnQgZGV2aWQsIGNvbnN0IGNoYXIgKnByaW1hcnlfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZW5kZXJfbm9kZSwgc3RydWN0IG51bGxkcnZfZ3B1ICoqZ3B1X3JldCkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9ncHUgKmdwdTsKKworCWdwdSA9IG1hbGxvYyhzaXplb2YoKmdwdSkpOworICAgIGlmICghZ3B1KQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCW1lbXNldChncHUsIDAsIHNpemVvZigqZ3B1KSk7CisKKyAgICAvLyBJbml0aWFsaXplIHBvaW50ZXIgdG8gbG9hZGVyJ3MgZGlzcGF0Y2ggdGFibGUgd2l0aCBJQ0RfTE9BREVSX01BR0lDCisgICAgc2V0X2xvYWRlcl9tYWdpY192YWx1ZShncHUpOworCisgICAgKmdwdV9yZXQgPSBncHU7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfcXVldWVfY3JlYXRlKHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm9kZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudWxsZHJ2X3F1ZXVlICoqcXVldWVfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X3F1ZXVlICpxdWV1ZTsKKworICAgIHF1ZXVlID0gKHN0cnVjdCBudWxsZHJ2X3F1ZXVlICopIG51bGxkcnZfYmFzZV9jcmVhdGUoZGV2LCBzaXplb2YoKnF1ZXVlKSwKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9RVUVVRV9FWFQpOworICAgIGlmICghcXVldWUpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBxdWV1ZS0+ZGV2ID0gZGV2OworCisgICAgKnF1ZXVlX3JldCA9IHF1ZXVlOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBkZXZfY3JlYXRlX3F1ZXVlcyhzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyAqcXVldWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50KQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBjb25zdCBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyAqcSA9ICZxdWV1ZXNbaV07CisgICAgICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisKKyAgICAgICAgaWYgKHEtPnF1ZXVlQ291bnQgPT0gMSAmJiAhZGV2LT5xdWV1ZXNbcS0+cXVldWVGYW1pbHlJbmRleF0pIHsKKyAgICAgICAgICAgIHJldCA9IG51bGxkcnZfcXVldWVfY3JlYXRlKGRldiwgcS0+cXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgJmRldi0+cXVldWVzW3EtPnF1ZXVlRmFtaWx5SW5kZXhdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBudWxsZHJ2X2Rldl9leHRfdHlwZSBudWxsZHJ2X2dwdV9sb29rdXBfZXh0ZW5zaW9uKAorICAgICAgICBjb25zdCBzdHJ1Y3QgbnVsbGRydl9ncHUgKmdwdSwKKyAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uTmFtZSkKK3sKKyAgICBlbnVtIG51bGxkcnZfZGV2X2V4dF90eXBlIHR5cGU7CisKKyAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgQVJSQVlfU0laRShudWxsZHJ2X2RldmljZV9leHRzKTsgdHlwZSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobnVsbGRydl9kZXZpY2VfZXh0c1t0eXBlXS5leHRlbnNpb25OYW1lLCBleHRlbnNpb25OYW1lKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXNzZXJ0KHR5cGUgPCBOVUxMRFJWX0RFVl9FWFRfQ09VTlQgfHwgdHlwZSA9PSBOVUxMRFJWX0RFVl9FWFRfSU5WQUxJRCk7CisKKyAgICByZXR1cm4gdHlwZTsKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfZGVzY19vb3h4X2NyZWF0ZShzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9kZXNjX29veHggKipvb3h4X3JldCkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXNjX29veHggKm9veHg7CisKKyAgICBvb3h4ID0gbWFsbG9jKHNpemVvZigqb294eCkpOworICAgIGlmICghb294eCkgCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBtZW1zZXQob294eCwgMCwgc2l6ZW9mKCpvb3h4KSk7CisKKyAgICBvb3h4LT5zdXJmYWNlX2Rlc2Nfc2l6ZSA9IDA7CisgICAgb294eC0+c2FtcGxlcl9kZXNjX3NpemUgPSAwOworCisgICAgKm9veHhfcmV0ID0gb294eDsgCisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfZGV2X2NyZWF0ZShzdHJ1Y3QgbnVsbGRydl9ncHUgKmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG51bGxkcnZfZGV2ICoqZGV2X3JldCkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldjsKKyAgICB1aW50MzJfdCBpOworICAgIFZrUmVzdWx0IHJldDsKKworICAgIGRldiA9IChzdHJ1Y3QgbnVsbGRydl9kZXYgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShOVUxMLCBzaXplb2YoKmRldiksCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgaWYgKCFkZXYpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3QgZW51bSBudWxsZHJ2X2Rldl9leHRfdHlwZSBleHQgPSBudWxsZHJ2X2dwdV9sb29rdXBfZXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgICAgICBncHUsIGluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsKKworICAgICAgICBpZiAoZXh0ID09IE5VTExEUlZfREVWX0VYVF9JTlZBTElEKQorICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0VYVEVOU0lPTl9OT1RfUFJFU0VOVDsKKworICAgICAgICBkZXYtPmV4dHNbZXh0XSA9IHRydWU7CisgICAgfQorCisgICAgcmV0ID0gbnVsbGRydl9kZXNjX29veHhfY3JlYXRlKGRldiwgJmRldi0+ZGVzY19vb3h4KTsKKyAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBkZXZfY3JlYXRlX3F1ZXVlcyhkZXYsIGluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zLAorICAgICAgICAgICAgaW5mby0+cXVldWVDcmVhdGVJbmZvQ291bnQpOworICAgIGlmIChyZXQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpkZXZfcmV0ID0gZGV2OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9ncHUgKm51bGxkcnZfZ3B1KFZrUGh5c2ljYWxEZXZpY2UgZ3B1KQoreworICAgIHJldHVybiAoc3RydWN0IG51bGxkcnZfZ3B1ICopIGdwdTsKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfZmVuY2VfY3JlYXRlKHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9mZW5jZSAqKmZlbmNlX3JldCkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9mZW5jZSAqZmVuY2U7CisKKyAgICBmZW5jZSA9IChzdHJ1Y3QgbnVsbGRydl9mZW5jZSAqKSBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwgc2l6ZW9mKCpmZW5jZSksCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRkVOQ0VfRVhUKTsKKyAgICBpZiAoIWZlbmNlKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgKmZlbmNlX3JldCA9IGZlbmNlOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9kZXYgKm51bGxkcnZfZGV2KFZrRGV2aWNlIGRldikKK3sKKyAgICByZXR1cm4gKHN0cnVjdCBudWxsZHJ2X2RldiAqKSBkZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9pbWcgKm51bGxkcnZfaW1nX2Zyb21fYmFzZShzdHJ1Y3QgbnVsbGRydl9iYXNlICpiYXNlKQoreworICAgIHJldHVybiAoc3RydWN0IG51bGxkcnZfaW1nICopIGJhc2U7Cit9CisKKworc3RhdGljIFZrUmVzdWx0IGltZ19nZXRfbWVtb3J5X3JlcXVpcmVtZW50cyhzdHJ1Y3QgbnVsbGRydl9iYXNlICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzICpwUmVxdWlyZW1lbnRzKQoreworICAgIHN0cnVjdCBudWxsZHJ2X2ltZyAqaW1nID0gbnVsbGRydl9pbWdfZnJvbV9iYXNlKGJhc2UpOworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisKKyAgICBwUmVxdWlyZW1lbnRzLT5zaXplID0gaW1nLT50b3RhbF9zaXplOworICAgIHBSZXF1aXJlbWVudHMtPmFsaWdubWVudCA9IDQwOTY7CisgICAgcFJlcXVpcmVtZW50cy0+bWVtb3J5VHlwZUJpdHMgPSB+MHU7ICAgICAgICAvKiBjYW4gdXNlIGFueSBtZW1vcnkgdHlwZSAqLworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfaW1nX2NyZWF0ZShzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNjYW5vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG51bGxkcnZfaW1nICoqaW1nX3JldCkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9pbWcgKmltZzsKKworICAgIGltZyA9IChzdHJ1Y3QgbnVsbGRydl9pbWcgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsIHNpemVvZigqaW1nKSwKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQpOworICAgIGlmICghaW1nKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgaW1nLT50eXBlID0gaW5mby0+aW1hZ2VUeXBlOworICAgIGltZy0+ZGVwdGggPSBpbmZvLT5leHRlbnQuZGVwdGg7CisgICAgaW1nLT5taXBfbGV2ZWxzID0gaW5mby0+bWlwTGV2ZWxzOworICAgIGltZy0+YXJyYXlfc2l6ZSA9IGluZm8tPmFycmF5TGF5ZXJzOworICAgIGltZy0+dXNhZ2UgPSBpbmZvLT51c2FnZTsKKyAgICBpbWctPnNhbXBsZXMgPSBpbmZvLT5zYW1wbGVzOworCisgICAgaW1nLT5vYmouYmFzZS5nZXRfbWVtb3J5X3JlcXVpcmVtZW50cyA9IGltZ19nZXRfbWVtb3J5X3JlcXVpcmVtZW50czsKKworICAgICppbWdfcmV0ID0gaW1nOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9pbWcgKm51bGxkcnZfaW1nKFZrSW1hZ2UgaW1hZ2UpCit7CisgICAgcmV0dXJuICooc3RydWN0IG51bGxkcnZfaW1nICoqKSAmaW1hZ2U7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBudWxsZHJ2X21lbV9hbGxvYyhzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG51bGxkcnZfbWVtICoqbWVtX3JldCkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9tZW0gKm1lbTsKKworICAgIG1lbSA9IChzdHJ1Y3QgbnVsbGRydl9tZW0gKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsIHNpemVvZigqbWVtKSwKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCk7CisgICAgaWYgKCFtZW0pCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBtZW0tPmJvID0gbWFsbG9jKGluZm8tPmFsbG9jYXRpb25TaXplKTsKKyAgICBpZiAoIW1lbS0+Ym8pIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW0tPnNpemUgPSBpbmZvLT5hbGxvY2F0aW9uU2l6ZTsKKworICAgICptZW1fcmV0ID0gbWVtOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBudWxsZHJ2X3NhbXBsZXJfY3JlYXRlKHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9zYW1wbGVyICoqc2FtcGxlcl9yZXQpCit7CisgICAgc3RydWN0IG51bGxkcnZfc2FtcGxlciAqc2FtcGxlcjsKKworICAgIHNhbXBsZXIgPSAoc3RydWN0IG51bGxkcnZfc2FtcGxlciAqKSBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwKKyAgICAgICAgICAgIHNpemVvZigqc2FtcGxlciksIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TQU1QTEVSX0VYVCk7CisgICAgaWYgKCFzYW1wbGVyKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgKnNhbXBsZXJfcmV0ID0gc2FtcGxlcjsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVmtSZXN1bHQgbnVsbGRydl9pbWdfdmlld19jcmVhdGUoc3RydWN0IG51bGxkcnZfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9pbWdfdmlldyAqKnZpZXdfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X2ltZyAqaW1nID0gbnVsbGRydl9pbWcoaW5mby0+aW1hZ2UpOworICAgIHN0cnVjdCBudWxsZHJ2X2ltZ192aWV3ICp2aWV3OworCisgICAgdmlldyA9IChzdHJ1Y3QgbnVsbGRydl9pbWdfdmlldyAqKSBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwgc2l6ZW9mKCp2aWV3KSwKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9WSUVXX0VYVCk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgdmlldy0+aW1nID0gaW1nOworCisgICAgdmlldy0+Y21kX2xlbiA9IDg7CisKKyAgICAqdmlld19yZXQgPSB2aWV3OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkICpudWxsZHJ2X21lbV9tYXAoc3RydWN0IG51bGxkcnZfbWVtICptZW0sIFZrRmxhZ3MgZmxhZ3MpCit7CisgICAgcmV0dXJuIG1lbS0+Ym87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9tZW0gKm51bGxkcnZfbWVtKFZrRGV2aWNlTWVtb3J5IG1lbSkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgbnVsbGRydl9tZW0gKiopICZtZW07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9idWYgKm51bGxkcnZfYnVmX2Zyb21fYmFzZShzdHJ1Y3QgbnVsbGRydl9iYXNlICpiYXNlKQoreworICAgIHJldHVybiAoc3RydWN0IG51bGxkcnZfYnVmICopIGJhc2U7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBidWZfZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMoc3RydWN0IG51bGxkcnZfYmFzZSAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMqIHBNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgc3RydWN0IG51bGxkcnZfYnVmICpidWYgPSBudWxsZHJ2X2J1Zl9mcm9tX2Jhc2UoYmFzZSk7CisKKyAgICBpZiAocE1lbW9yeVJlcXVpcmVtZW50cyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKworICAgIHBNZW1vcnlSZXF1aXJlbWVudHMtPnNpemUgPSBidWYtPnNpemU7CisgICAgcE1lbW9yeVJlcXVpcmVtZW50cy0+YWxpZ25tZW50ID0gNDA5NjsKKyAgICBwTWVtb3J5UmVxdWlyZW1lbnRzLT5tZW1vcnlUeXBlQml0cyA9IDE7ICAgIC8qIG51bGxkcnYgb25seSBoYXMgb25lIG1lbW9yeSB0eXBlICovCisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfYnVmX2NyZWF0ZShzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG51bGxkcnZfYnVmICoqYnVmX3JldCkKK3sKKyAgICBzdHJ1Y3QgbnVsbGRydl9idWYgKmJ1ZjsKKworICAgIGJ1ZiA9IChzdHJ1Y3QgbnVsbGRydl9idWYgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsIHNpemVvZigqYnVmKSwKKyAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhUKTsKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIGJ1Zi0+c2l6ZSA9IGluZm8tPnNpemU7CisgICAgYnVmLT51c2FnZSA9IGluZm8tPnVzYWdlOworCisgICAgYnVmLT5vYmouYmFzZS5nZXRfbWVtb3J5X3JlcXVpcmVtZW50cyA9IGJ1Zl9nZXRfbWVtb3J5X3JlcXVpcmVtZW50czsKKworICAgICpidWZfcmV0ID0gYnVmOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBudWxsZHJ2X2Rlc2NfbGF5b3V0X2NyZWF0ZShzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9kZXNjX2xheW91dCAqKmxheW91dF9yZXQpCit7CisgICAgc3RydWN0IG51bGxkcnZfZGVzY19sYXlvdXQgKmxheW91dDsKKworICAgIGxheW91dCA9IChzdHJ1Y3QgbnVsbGRydl9kZXNjX2xheW91dCAqKQorICAgICAgICBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwgc2l6ZW9mKCpsYXlvdXQpLAorICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhUKTsKKyAgICBpZiAoIWxheW91dCkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgICpsYXlvdXRfcmV0ID0gbGF5b3V0OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBudWxsZHJ2X3BpcGVsaW5lX2xheW91dF9jcmVhdGUoc3RydWN0IG51bGxkcnZfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9waXBlbGluZV9sYXlvdXQgKipwaXBlbGluZV9sYXlvdXRfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X3BpcGVsaW5lX2xheW91dCAqcGlwZWxpbmVfbGF5b3V0OworCisgICAgcGlwZWxpbmVfbGF5b3V0ID0gKHN0cnVjdCBudWxsZHJ2X3BpcGVsaW5lX2xheW91dCAqKQorICAgICAgICBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwgc2l6ZW9mKCpwaXBlbGluZV9sYXlvdXQpLAorICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9MQVlPVVRfRVhUKTsKKyAgICBpZiAoIXBpcGVsaW5lX2xheW91dCkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgICpwaXBlbGluZV9sYXlvdXRfcmV0ID0gcGlwZWxpbmVfbGF5b3V0OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9kZXNjX2xheW91dCAqbnVsbGRydl9kZXNjX2xheW91dChjb25zdCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgbGF5b3V0KQoreworICAgIHJldHVybiAqKHN0cnVjdCBudWxsZHJ2X2Rlc2NfbGF5b3V0ICoqKSAmbGF5b3V0OworfQorCitzdGF0aWMgVmtSZXN1bHQgZ3JhcGhpY3NfcGlwZWxpbmVfY3JlYXRlKHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gKmluZm9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudWxsZHJ2X3BpcGVsaW5lICoqcGlwZWxpbmVfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X3BpcGVsaW5lICpwaXBlbGluZTsKKworICAgIHBpcGVsaW5lID0gKHN0cnVjdCBudWxsZHJ2X3BpcGVsaW5lICopCisgICAgICAgIG51bGxkcnZfYmFzZV9jcmVhdGUoZGV2LCBzaXplb2YoKnBpcGVsaW5lKSwgCisgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCk7CisgICAgaWYgKCFwaXBlbGluZSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgICpwaXBlbGluZV9yZXQgPSBwaXBlbGluZTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgVmtSZXN1bHQgbnVsbGRydl9jbWRfY3JlYXRlKHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9jbWQgKipjbWRfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X2NtZCAqY21kOworICAgIHVpbnQzMl90IG51bV9hbGxvY2F0ZWQgPSAwOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluZm8tPmNvbW1hbmRCdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgIGNtZCA9IChzdHJ1Y3QgbnVsbGRydl9jbWQgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsIHNpemVvZigqY21kKSwKKyAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICAgICAgaWYgKCFjbWQpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBudW1fYWxsb2NhdGVkOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmcmVlKGNtZF9yZXRbal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBudW1fYWxsb2NhdGVkKys7CisgICAgICAgIGNtZF9yZXRbaV0gPSBjbWQ7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBudWxsZHJ2X2Rlc2NfcG9vbF9jcmVhdGUoc3RydWN0IG51bGxkcnZfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudWxsZHJ2X2Rlc2NfcG9vbCAqKnBvb2xfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X2Rlc2NfcG9vbCAqcG9vbDsKKworICAgIHBvb2wgPSAoc3RydWN0IG51bGxkcnZfZGVzY19wb29sICopCisgICAgICAgIG51bGxkcnZfYmFzZV9jcmVhdGUoZGV2LCBzaXplb2YoKnBvb2wpLAorICAgICAgICAgICAgICAgIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1BPT0xfRVhUKTsKKyAgICBpZiAoIXBvb2wpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICBwb29sLT5kZXYgPSBkZXY7CisKKyAgICAqcG9vbF9yZXQgPSBwb29sOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBudWxsZHJ2X2Rlc2Nfc2V0X2NyZWF0ZShzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudWxsZHJ2X2Rlc2NfcG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBudWxsZHJ2X2Rlc2NfbGF5b3V0ICpsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9kZXNjX3NldCAqKnNldF9yZXQpCit7CisgICAgc3RydWN0IG51bGxkcnZfZGVzY19zZXQgKnNldDsKKworICAgIHNldCA9IChzdHJ1Y3QgbnVsbGRydl9kZXNjX3NldCAqKQorICAgICAgICBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwgc2l6ZW9mKCpzZXQpLCAKKyAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfRVhUKTsKKyAgICBpZiAoIXNldCkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgIHNldC0+b294eCA9IGRldi0+ZGVzY19vb3h4OworICAgIHNldC0+bGF5b3V0ID0gbGF5b3V0OworICAgICpzZXRfcmV0ID0gc2V0OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9kZXNjX3Bvb2wgKm51bGxkcnZfZGVzY19wb29sKFZrRGVzY3JpcHRvclBvb2wgcG9vbCkKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgbnVsbGRydl9kZXNjX3Bvb2wgKiopICZwb29sOworfQorCitzdGF0aWMgVmtSZXN1bHQgbnVsbGRydl9mYl9jcmVhdGUoc3RydWN0IG51bGxkcnZfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudWxsZHJ2X2ZyYW1lYnVmZmVyICoqIGZiX3JldCkKK3sKKworICAgIHN0cnVjdCBudWxsZHJ2X2ZyYW1lYnVmZmVyICpmYjsKKyAgICBmYiA9IChzdHJ1Y3QgbnVsbGRydl9mcmFtZWJ1ZmZlciAqKSBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwgc2l6ZW9mKCpmYiksCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRlJBTUVCVUZGRVJfRVhUKTsKKyAgICBpZiAoIWZiKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgKmZiX3JldCA9IGZiOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisKK30KKworc3RhdGljIFZrUmVzdWx0IG51bGxkcnZfcmVuZGVyX3Bhc3NfY3JlYXRlKHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudWxsZHJ2X3JlbmRlcl9wYXNzKiogcnBfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X3JlbmRlcl9wYXNzICpycDsKKyAgICBycCA9IChzdHJ1Y3QgbnVsbGRydl9yZW5kZXJfcGFzcyAqKSBudWxsZHJ2X2Jhc2VfY3JlYXRlKGRldiwgc2l6ZW9mKCpycCksCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhUKTsKKyAgICBpZiAoIXJwKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgKnJwX3JldCA9IHJwOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnVsbGRydl9idWYgKm51bGxkcnZfYnVmKFZrQnVmZmVyIGJ1ZikKK3sKKyAgICByZXR1cm4gKihzdHJ1Y3QgbnVsbGRydl9idWYgKiopICZidWY7Cit9CisKK3N0YXRpYyBWa1Jlc3VsdCBudWxsZHJ2X2J1Zl92aWV3X2NyZWF0ZShzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQnVmZmVyVmlld0NyZWF0ZUluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9idWZfdmlldyAqKnZpZXdfcmV0KQoreworICAgIHN0cnVjdCBudWxsZHJ2X2J1ZiAqYnVmID0gbnVsbGRydl9idWYoaW5mby0+YnVmZmVyKTsKKyAgICBzdHJ1Y3QgbnVsbGRydl9idWZfdmlldyAqdmlldzsKKworICAgIHZpZXcgPSAoc3RydWN0IG51bGxkcnZfYnVmX3ZpZXcgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsIHNpemVvZigqdmlldyksCisgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX1ZJRVdfRVhUKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisKKyAgICB2aWV3LT5idWYgPSBidWY7CisKKyAgICAqdmlld19yZXQgPSB2aWV3OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIERyaXZlciBlbnRyeSBwb2ludHMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXIpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiA9IG51bGxkcnZfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gbnVsbGRydl9idWZfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sIChzdHJ1Y3QgbnVsbGRydl9idWYgKiopIHBCdWZmZXIpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lCdWZmZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyogICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0NvbW1hbmRQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZFBvb2wpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdGF0aWMgVmtDb21tYW5kUG9vbCBwb29sID0gKFZrQ29tbWFuZFBvb2wpMTsKKyAgICAqcENvbW1hbmRQb29sID0gcG9vbDsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95Q29tbWFuZFBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBvb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUmVzZXRDb21tYW5kUG9vbCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0NvbW1hbmRQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kUG9vbCwKKyAgICBWa0NvbW1hbmRQb29sUmVzZXRGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qICAgICAgICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXYgPSBudWxsZHJ2X2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIG51bGxkcnZfY21kX2NyZWF0ZShkZXYsIHBBbGxvY2F0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IG51bGxkcnZfY21kICoqKSBwQ29tbWFuZEJ1ZmZlcnMpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0ZyZWVDb21tYW5kQnVmZmVycygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtDb21tYW5kUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmRCdWZmZXJzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbW1hbmRCdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgIGZyZWUocENvbW1hbmRCdWZmZXJzW2ldKTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0JlZ2luQ29tbWFuZEJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyAgICAgICAgICAgICppbmZvKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VuZENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldENvbW1hbmRCdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0NvbW1hbmRCdWZmZXJSZXNldEZsYWdzIGZsYWdzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBjb25zdCBWa0Zvcm1hdCBudWxsZHJ2X3ByZXNlbnRhYmxlX2Zvcm1hdHNbXSA9IHsKKyAgICBWS19GT1JNQVRfQjhHOFI4QThfVU5PUk0sCit9OworCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTdXJmYWNlS0hSKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgVmtTdXJmYWNlS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtCb29sMzIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0ZWQpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKworICAgICpwU3VwcG9ydGVkID0gVktfVFJVRTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiAgICAgICAgICAgICAgICBwU3VyZmFjZUNhcGFiaWxpdGllcykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworCisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1pbkltYWdlQ291bnQgPSAxOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUNvdW50ID0gMDsgIC8qIGFueSBudW1iZXIgb2YgaW1hZ2VzISAqLworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5jdXJyZW50RXh0ZW50LndpZHRoID0gLTE7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRFeHRlbnQuaGVpZ2h0ID0gLTE7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPm1pbkltYWdlRXh0ZW50LndpZHRoID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWluSW1hZ2VFeHRlbnQuaGVpZ2h0ID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+bWF4SW1hZ2VFeHRlbnQud2lkdGggPSAxMDI0OworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUV4dGVudC5oZWlnaHQgPSAxMDI0OworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5tYXhJbWFnZUFycmF5TGF5ZXJzID0gMTsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+c3VwcG9ydGVkVHJhbnNmb3JtcyA9IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX0lERU5USVRZX0JJVF9LSFI7CisgICAgcFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRUcmFuc2Zvcm0gPSBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSOworICAgIHBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSA9IFZLX0NPTVBPU0lURV9BTFBIQV9PUEFRVUVfQklUX0tIUjsKKyAgICBwU3VyZmFjZUNhcGFiaWxpdGllcy0+c3VwcG9ydGVkVXNhZ2VGbGFncyA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdENvdW50LAorICAgIFZrU3VyZmFjZUZvcm1hdEtIUiogICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisKKyAgICBpZiAocFN1cmZhY2VGb3JtYXRzKSB7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqcFN1cmZhY2VGb3JtYXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBwU3VyZmFjZUZvcm1hdHNbaV0uZm9ybWF0ID0gbnVsbGRydl9wcmVzZW50YWJsZV9mb3JtYXRzW2ldOworICAgICAgICAgICAgcFN1cmZhY2VGb3JtYXRzW2ldLmNvbG9yU3BhY2UgPSBWS19DT0xPUlNQQUNFX1NSR0JfTk9OTElORUFSX0tIUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKnBTdXJmYWNlRm9ybWF0Q291bnQgPSBBUlJBWV9TSVpFKG51bGxkcnZfcHJlc2VudGFibGVfZm9ybWF0cyk7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVzZW50TW9kZUNvdW50LAorICAgIFZrUHJlc2VudE1vZGVLSFIqICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRNb2RlcykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworCisgICAgaWYgKHBQcmVzZW50TW9kZXMpIHsKKyAgICAgICAgcFByZXNlbnRNb2Rlc1swXSA9IFZLX1BSRVNFTlRfTU9ERV9JTU1FRElBVEVfS0hSOworICAgICAgICBwUHJlc2VudE1vZGVzWzFdID0gVktfUFJFU0VOVF9NT0RFX0ZJRk9fS0hSOworICAgIH0gZWxzZSB7CisgICAgICAgICpwUHJlc2VudE1vZGVDb3VudCA9IDI7CisgICAgfQorCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVN3YXBjaGFpbktIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N3YXBjaGFpbktIUiogICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKyAgICBzdHJ1Y3QgbnVsbGRydl9zd2FwX2NoYWluICpzYzsKKworICAgIHNjID0gKHN0cnVjdCBudWxsZHJ2X3N3YXBfY2hhaW4gKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsIHNpemVvZigqc2MpLAorICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBDSEFJTl9LSFJfRVhUKTsKKyAgICBpZiAoIXNjKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorICAgIHNjLT5kZXYgPSBkZXY7CisKKyAgICAqKFZrU3dhcGNoYWluS0hSICoqKXBTd2FwY2hhaW4gPSAqKFZrU3dhcGNoYWluS0hSICoqKSZzYzsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgc3RydWN0IG51bGxkcnZfc3dhcF9jaGFpbiAqc2MgPSAqKHN0cnVjdCBudWxsZHJ2X3N3YXBfY2hhaW4gKiopICZzd2FwY2hhaW47CisKKyAgICBmcmVlKHNjKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrU3dhcGNoYWluS0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3YXBjaGFpbkltYWdlQ291bnQsCisgICAgVmtJbWFnZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgc3RydWN0IG51bGxkcnZfc3dhcF9jaGFpbiAqc2MgPSAqKHN0cnVjdCBudWxsZHJ2X3N3YXBfY2hhaW4gKiopICZzd2FwY2hhaW47CisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXYgPSBzYy0+ZGV2OworICAgIFZrUmVzdWx0IHJldCA9IFZLX1NVQ0NFU1M7CisKKyAgICAqcFN3YXBjaGFpbkltYWdlQ291bnQgPSAyOworICAgIGlmIChwU3dhcGNoYWluSW1hZ2VzKSB7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbnVsbGRydl9pbWcgKmltZzsKKworICAgICAgICAgICAgICAgIGltZyA9IChzdHJ1Y3QgbnVsbGRydl9pbWcgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmltZyksCisgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUKTsKKyAgICAgICAgICAgICAgICBpZiAoIWltZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKyAgICAgICAgICAgIHBTd2FwY2hhaW5JbWFnZXNbaV0gPSAoVmtJbWFnZSkgaW1nOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWNxdWlyZU5leHRJbWFnZUtIUigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1N3YXBjaGFpbktIUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBjaGFpbiwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUsCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZUluZGV4KQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVQcmVzZW50S0hSKAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfLAorICAgIGNvbnN0IFZrUHJlc2VudEluZm9LSFIqICAgICAgICAgICAgICAgICAgcFByZXNlbnRJbmZvKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyQ29weSogICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5SW1hZ2UoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2VMYXlvdXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db3VudCwKKyAgICBjb25zdCBWa0ltYWdlQ29weSogICAgICAgICAgICAgICAgICAgICAgIHBSZWdpb25zKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmxpdEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZUxheW91dCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VCbGl0KiAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbnMsCisgICAgVmtGaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqICAgICAgICAgICAgICAgIHBSZWdpb25zKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ29weUltYWdlVG9CdWZmZXIoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlTGF5b3V0LAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVySW1hZ2VDb3B5KiAgICAgICAgICAgICAgICBwUmVnaW9ucykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFVwZGF0ZUJ1ZmZlcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICBWa0RldmljZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRGaWxsQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJEZXB0aFN0ZW5jaWxWYWx1ZSogICAgICAgICAgICAgcERlcHRoU3RlbmNpbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqICAgICAgICAgICAgICBwUmFuZ2VzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ2xlYXJBdHRhY2htZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJBdHRhY2htZW50KiAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnRzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvdW50LAorICAgIGNvbnN0IFZrQ2xlYXJSZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3RzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQ2xlYXJDb2xvckltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTGF5b3V0LAorICAgIGNvbnN0IFZrQ2xlYXJDb2xvclZhbHVlICAgICAgICAgICAgKnBDb2xvciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgIHBSYW5nZXMpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbGVhckRlcHRoU3RlbmNpbCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLAorICAgIFZrSW1hZ2VMYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VMYXlvdXQsCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5jaWwsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VTdWJyZXNvdXJjZVJhbmdlKiAgICAgICAgICBwUmFuZ2VzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUmVzb2x2ZUltYWdlKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsCisgICAgVmtJbWFnZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZUxheW91dCwKKyAgICBWa0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbWFnZSwKKyAgICBWa0ltYWdlTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEltYWdlTGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ291bnQsCisgICAgY29uc3QgVmtJbWFnZVJlc29sdmUqICAgICAgICAgICAgICAgICAgICBwUmVnaW9ucykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJlZ2luUXVlcnkoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgVmtGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRFbmRRdWVyeSgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFJlc2V0UXVlcnlQb29sKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtRdWVyeVBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFF1ZXJ5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF8sCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNldEV2ZW50KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF8sCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICBzdGFnZU1hc2spCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQb29sLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnQsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0U3RyaWRlLAorICAgIFZrRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRXcml0ZVRpbWVzdGFtcCgKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdCaXRzICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGFnZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCaW5kUGlwZWxpbmUoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lQmluZFBvaW50ICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQmluZFBvaW50LAorICAgIFZrUGlwZWxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRWaWV3cG9ydChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgdWludDMyX3QgZmlyc3RWaWV3cG9ydCwgdWludDMyX3Qgdmlld3BvcnRDb3VudCwgY29uc3QgVmtWaWV3cG9ydCogcFZpZXdwb3J0cykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNldFNjaXNzb3IoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0U2Npc3NvciwgdWludDMyX3Qgc2Npc3NvckNvdW50LCBjb25zdCBWa1JlY3QyRCogcFNjaXNzb3JzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0TGluZVdpZHRoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBmbG9hdCBsaW5lV2lkdGgpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJpYXMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGZsb2F0IGRlcHRoQmlhc0NvbnN0YW50RmFjdG9yLCBmbG9hdCBkZXB0aEJpYXNDbGFtcCwgZmxvYXQgZGVwdGhCaWFzU2xvcGVGYWN0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRCbGVuZENvbnN0YW50cyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgY29uc3QgZmxvYXQgYmxlbmRDb25zdGFudHNbNF0pCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXREZXB0aEJvdW5kcyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgZmxvYXQgbWluRGVwdGhCb3VuZHMsIGZsb2F0IG1heERlcHRoQm91bmRzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IGNvbXBhcmVNYXNrKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzayhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtTdGVuY2lsRmFjZUZsYWdzIGZhY2VNYXNrLCB1aW50MzJfdCB3cml0ZU1hc2spCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRTdGVuY2lsUmVmZXJlbmNlKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1N0ZW5jaWxGYWNlRmxhZ3MgZmFjZU1hc2ssIHVpbnQzMl90IHJlZmVyZW5jZSkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVCaW5kUG9pbnQgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUJpbmRQb2ludCwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldENvdW50LAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNPZmZzZXRDb3VudCwKKyAgICBjb25zdCB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgcER5bmFtaWNPZmZzZXRzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJpbmRpbmcsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJzLAorICAgIGNvbnN0IFZrRGV2aWNlU2l6ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPZmZzZXRzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZEluZGV4QnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrSW5kZXhUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUeXBlKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRHJhdygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWZXJ0ZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RhbmNlKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRHJhd0luZGV4ZWQoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCwKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdGFuY2UpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Q291bnQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0NvdW50LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRGlzcGF0Y2goCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERpc3BhdGNoSW5kaXJlY3QoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRXYWl0RXZlbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQsCisgICAgY29uc3QgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRzLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU3RhZ2VNYXNrLAorICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RhZ2VNYXNrLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICBwSW1hZ2VNZW1vcnlCYXJyaWVycykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURldmljZSgKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV8sCisgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGV2aWNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdHJ1Y3QgbnVsbGRydl9ncHUgKmdwdSA9IG51bGxkcnZfZ3B1KGdwdV8pOworICAgIHJldHVybiBudWxsZHJ2X2Rldl9jcmVhdGUoZ3B1LCBwQ3JlYXRlSW5mbywgKHN0cnVjdCBudWxsZHJ2X2RldioqKXBEZXZpY2UpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZXZpY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0RGV2aWNlUXVldWUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVOb2RlSW5kZXgsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUluZGV4LAorICAgIFZrUXVldWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWV1ZSkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKyAgICAqcFF1ZXVlID0gKFZrUXVldWUpIGRldi0+cXVldWVzWzBdOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEZXZpY2VXYWl0SWRsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0V2ZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldEV2ZW50U3RhdHVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF8pCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrU2V0RXZlbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50XykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldEV2ZW50KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF8pCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvKiAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2UpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiA9IG51bGxkcnZfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gbnVsbGRydl9mZW5jZV9jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIChzdHJ1Y3QgbnVsbGRydl9mZW5jZSAqKikgcEZlbmNlKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RmVuY2UoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0RmVuY2VTdGF0dXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlXykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldEZlbmNlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBmZW5jZUNvdW50LAorICAgIGNvbnN0IFZrRmVuY2UqICAgICAgICAgICAgICBwRmVuY2VzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1dhaXRGb3JGZW5jZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDb3VudCwKKyAgICBjb25zdCBWa0ZlbmNlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmVuY2VzLAorICAgIFZrQm9vbDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEFsbCwKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1XywKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyogICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworCisgICAgcFByb3BlcnRpZXMtPmFwaVZlcnNpb24gPSBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pOworICAgIHBQcm9wZXJ0aWVzLT5kcml2ZXJWZXJzaW9uID0gMDsgLy8gQXBwcm9wcmlhdGUgdGhhdCB0aGUgbnVsbGRydiBoYXZlIDAncworICAgIHBQcm9wZXJ0aWVzLT52ZW5kb3JJRCA9IDA7CisgICAgcFByb3BlcnRpZXMtPmRldmljZUlEID0gMDsKKyAgICBwUHJvcGVydGllcy0+ZGV2aWNlVHlwZSA9IFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX09USEVSOworICAgIHN0cm5jcHkocFByb3BlcnRpZXMtPmRldmljZU5hbWUsICJudWxsZHJ2Iiwgc3RybGVuKCJudWxsZHJ2IikpOworCisgICAgLyogVE9ETzogZmlsbCBvdXQgbGltaXRzICovCisgICAgbWVtc2V0KCZwUHJvcGVydGllcy0+bGltaXRzLCAwLCBzaXplb2YoVmtQaHlzaWNhbERldmljZUxpbWl0cykpOworICAgIG1lbXNldCgmcFByb3BlcnRpZXMtPnNwYXJzZVByb3BlcnRpZXMsIDAsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlU3BhcnNlUHJvcGVydGllcykpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzKiAgICAgICAgICAgICAgICAgcEZlYXR1cmVzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisKKyAgICAvKiBudWxsZHJ2ICJpbXBsZW1lbnRzIiBhbGwgdnVsa2FuIGZlYXR1cmVzIC0tIGJ5IGRvaW5nIG5vdGhpbmcgKi8KKyAgICBtZW1zZXQocEZlYXR1cmVzLCBWS19UUlVFLCBzaXplb2YoKnBGZWF0dXJlcykpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdEluZm8pCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKworICAgIHBGb3JtYXRJbmZvLT5saW5lYXJUaWxpbmdGZWF0dXJlcyA9IFZLX0ZPUk1BVF9GRUFUVVJFX1NBTVBMRURfSU1BR0VfQklUIHwKKyAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfQ09MT1JfQVRUQUNITUVOVF9CSVQ7CisgICAgcEZvcm1hdEluZm8tPm9wdGltYWxUaWxpbmdGZWF0dXJlcyA9IHBGb3JtYXRJbmZvLT5saW5lYXJUaWxpbmdGZWF0dXJlczsKKyAgICBwRm9ybWF0SW5mby0+YnVmZmVyRmVhdHVyZXMgPSAwOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV8sCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCwKKyAgICBWa1F1ZXVlRmFtaWx5UHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKKyB7CisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgPSAxOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBQcm9wZXJ0aWVzLT5xdWV1ZUZsYWdzID0gVktfUVVFVUVfR1JBUEhJQ1NfQklUIHwgVktfUVVFVUVfU1BBUlNFX0JJTkRJTkdfQklUOworICAgIHBQcm9wZXJ0aWVzLT5xdWV1ZUNvdW50ID0gMTsKKyAgICBwUHJvcGVydGllcy0+dGltZXN0YW1wVmFsaWRCaXRzID0gMDsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSBncHVfLAorICAgIFZrUGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykKK3sKKyAgICAvLyB0aGUgbnVsbCBkcml2ZXIgcHJldGVuZHMgdG8gaGF2ZSBhIHNpbmdsZSBtZW1vcnkgdHlwZSAoYW5kIHNpbmdsZSBoZWFwKTsKKyAgICBwUHJvcGVydGllcy0+bWVtb3J5VHlwZUNvdW50ID0gMTsKKyAgICBwUHJvcGVydGllcy0+bWVtb3J5SGVhcENvdW50ID0gMTsKKyAgICBwUHJvcGVydGllcy0+bWVtb3J5VHlwZXNbMF0uaGVhcEluZGV4ID0gMDsKKyAgICBwUHJvcGVydGllcy0+bWVtb3J5VHlwZXNbMF0ucHJvcGVydHlGbGFncyA9CisgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUIHwKKyAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUIHwKKyAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ0FDSEVEX0JJVCB8CisgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9MQVpJTFlfQUxMT0NBVEVEX0JJVDsKKyAgICBwUHJvcGVydGllcy0+bWVtb3J5SGVhcHNbMF0uZmxhZ3MgPSAwOyAgICAgIC8qIG5vdCBkZXZpY2UgbG9jYWwgKi8KKyAgICBwUHJvcGVydGllcy0+bWVtb3J5SGVhcHNbMF0uc2l6ZSA9IDA7ICAgICAgIC8qIGl0J3MganVzdCBtYWxsb2MtYmFja2VkIG1lbW9yeSAqLworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoCisgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgICAgIFZrTGF5ZXJQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpCit7CisgICAgKnBQcm9wZXJ0eUNvdW50ID0gMDsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheWVyTmFtZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0eUNvdW50LAorICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMpCit7CisgICAgdWludDMyX3QgY29weV9zaXplOworCisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgKnBQcm9wZXJ0eUNvdW50ID0gTlVMTERSVl9JTlNUX0VYVF9DT1VOVDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgY29weV9zaXplID0gKnBQcm9wZXJ0eUNvdW50IDwgTlVMTERSVl9JTlNUX0VYVF9DT1VOVCA/ICpwUHJvcGVydHlDb3VudCA6IE5VTExEUlZfSU5TVF9FWFRfQ09VTlQ7CisgICAgbWVtY3B5KHBQcm9wZXJ0aWVzLCBudWxsZHJ2X2luc3RhbmNlX2V4dGVuc2lvbnMsIGNvcHlfc2l6ZSAqIHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpKTsKKyAgICAqcFByb3BlcnR5Q291bnQgPSBjb3B5X3NpemU7CisgICAgaWYgKGNvcHlfc2l6ZSA8IE5VTExEUlZfSU5TVF9FWFRfQ09VTlQpIHsKKyAgICAgICAgcmV0dXJuIFZLX0lOQ09NUExFVEU7CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydHlDb3VudCwKKyAgICAgICAgVmtMYXllclByb3BlcnRpZXMqICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICAqcFByb3BlcnR5Q291bnQgPSAwOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5ZXJOYW1lLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICB1aW50MzJfdCBjb3B5X3NpemU7CisgICAgdWludDMyX3QgZXh0ZW5zaW9uX2NvdW50ID0gQVJSQVlfU0laRShudWxsZHJ2X2RldmljZV9leHRzKTsKKworICAgIGlmIChwUHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICpwUHJvcGVydHlDb3VudCA9IGV4dGVuc2lvbl9jb3VudDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgY29weV9zaXplID0gKnBQcm9wZXJ0eUNvdW50IDwgZXh0ZW5zaW9uX2NvdW50ID8gKnBQcm9wZXJ0eUNvdW50IDogZXh0ZW5zaW9uX2NvdW50OworICAgIG1lbWNweShwUHJvcGVydGllcywgbnVsbGRydl9kZXZpY2VfZXh0cywgY29weV9zaXplICogc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykpOworICAgICpwUHJvcGVydHlDb3VudCA9IGNvcHlfc2l6ZTsKKyAgICBpZiAoY29weV9zaXplIDwgZXh0ZW5zaW9uX2NvdW50KSB7CisgICAgICAgIHJldHVybiBWS19JTkNPTVBMRVRFOworICAgIH0KKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW1hZ2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZSkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBudWxsZHJ2X2ltZ19jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywgZmFsc2UsCisgICAgICAgICAgICAoc3RydWN0IG51bGxkcnZfaW1nICoqKSBwSW1hZ2UpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lJbWFnZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiAgICAgICAgICAgICAgICAgICBwU3VicmVzb3VyY2UsCisgICAgVmtTdWJyZXNvdXJjZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworCisgICAgcExheW91dC0+b2Zmc2V0ID0gMDsKKyAgICBwTGF5b3V0LT5zaXplID0gMTsKKyAgICBwTGF5b3V0LT5yb3dQaXRjaCA9IDQ7CisgICAgcExheW91dC0+ZGVwdGhQaXRjaCA9IDQ7CisgICAgcExheW91dC0+YXJyYXlQaXRjaCA9IDQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0FsbG9jYXRlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogICAgICAgICAgICAgICAgcEFsbG9jYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnkpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiA9IG51bGxkcnZfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gbnVsbGRydl9tZW1fYWxsb2MoZGV2LCBwQWxsb2NhdGVJbmZvLCAoc3RydWN0IG51bGxkcnZfbWVtICoqKSBwTWVtb3J5KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtGcmVlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtXywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtNYXBNZW1vcnkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICBWa0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBEYXRhKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgc3RydWN0IG51bGxkcnZfbWVtICptZW0gPSBudWxsZHJ2X21lbShtZW1fKTsKKyAgICB2b2lkICpwdHIgPSBudWxsZHJ2X21lbV9tYXAobWVtLCBmbGFncyk7CisKKyAgICAqcHBEYXRhID0gcHRyOworCisgICAgcmV0dXJuIChwdHIpID8gVktfU1VDQ0VTUyA6IFZLX0VSUk9SX01FTU9SWV9NQVBfRkFJTEVEOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VubWFwTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtXykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgICAgICAgICAgICAgICBwTWVtb3J5UmFuZ2VzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogICAgICAgICAgICAgICAgcE1lbW9yeVJhbmdlcykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWl0dGVkTWVtb3J5SW5CeXRlcykKK3sKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrSW5zdGFuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2luc3RhbmNlICppbnN0OworCisgICAgaW5zdCA9IChzdHJ1Y3QgbnVsbGRydl9pbnN0YW5jZSAqKSBudWxsZHJ2X2Jhc2VfY3JlYXRlKE5VTEwsIHNpemVvZigqaW5zdCksCisgICAgICAgICAgICAgICAgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lOU1RBTkNFX0VYVCk7CisgICAgaWYgKCFpbnN0KQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworCisgICAgaW5zdC0+b2JqLmJhc2UuZ2V0X21lbW9yeV9yZXF1aXJlbWVudHMgPSBOVUxMOworCisgICAgKnBJbnN0YW5jZSA9IChWa0luc3RhbmNlKSBpbnN0OworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUluc3RhbmNlKAorICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgdWludDMyX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3B1Q291bnQsCisgICAgVmtQaHlzaWNhbERldmljZSogICAgICAgICAgICAgICAgICAgICAgICAgICBwR3B1cykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIFZrUmVzdWx0IHJldDsKKyAgICBzdHJ1Y3QgbnVsbGRydl9ncHUgKmdwdTsKKyAgICAqcEdwdUNvdW50ID0gMTsKKyAgICByZXQgPSBudWxsZHJ2X2dwdV9hZGQoMCwgMCwgMCwgJmdwdSk7CisgICAgaWYgKHJldCA9PSBWS19TVUNDRVNTICYmIHBHcHVzKQorICAgICAgICBwR3B1c1swXSA9IChWa1BoeXNpY2FsRGV2aWNlKSBncHU7CisgICAgcmV0dXJuIHJldDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlTGF5ZXJzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RyaW5nU2l6ZSwKKyAgICBzaXplX3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXllckNvdW50LAorICAgIGNoYXIqIGNvbnN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dExheWVycywKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNlcnZlZCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdHJ1Y3QgbnVsbGRydl9iYXNlICpiYXNlID0gbnVsbGRydl9iYXNlKCh2b2lkKilidWZmZXIpOworCisgICAgYmFzZS0+Z2V0X21lbW9yeV9yZXF1aXJlbWVudHMoYmFzZSwgcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyogICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlSZXF1aXJlbWVudHMpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdHJ1Y3QgbnVsbGRydl9iYXNlICpiYXNlID0gbnVsbGRydl9iYXNlKCh2b2lkKilpbWFnZSk7CisKKyAgICBiYXNlLT5nZXRfbWVtb3J5X3JlcXVpcmVtZW50cyhiYXNlLCBwTWVtb3J5UmVxdWlyZW1lbnRzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQmluZEJ1ZmZlck1lbW9yeSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICBWa0RldmljZU1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV8sCisgICAgVmtEZXZpY2VTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlPZmZzZXQpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQmluZEltYWdlTWVtb3J5KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5T2Zmc2V0KQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrR2V0SW1hZ2VTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtJbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudENvdW50LAorICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMqICAgICAgICAgICAgcFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgVmtGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgVmtJbWFnZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgIFZrU2FtcGxlQ291bnRGbGFnQml0cyAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywKKyAgICBWa0ltYWdlVXNhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgIFZrSW1hZ2VUaWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsaW5nLAorICAgIHVpbnQzMl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnR5Q291bnQsCisgICAgVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMqICAgICAgICAgICAgICBwUHJvcGVydGllcykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtRdWV1ZUJpbmRTcGFyc2UoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbmZvQ291bnQsCisgICAgY29uc3QgVmtCaW5kU3BhcnNlSW5mbyogICAgICAgICAgICAgICAgICAgICBwQmluZEluZm8sCisgICAgVmtGZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZSkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8qICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmVDYWNoZSkKK3sKKworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiA9IG51bGxkcnZfZGV2KGRldmljZSk7CisgICAgc3RydWN0IG51bGxkcnZfcGlwZWxpbmVfY2FjaGUgKnBpcGVsaW5lX2NhY2hlOworCisgICAgcGlwZWxpbmVfY2FjaGUgPSAoc3RydWN0IG51bGxkcnZfcGlwZWxpbmVfY2FjaGUgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsCisgICAgICAgICAgICBzaXplb2YoKnBpcGVsaW5lX2NhY2hlKSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFX0VYVCk7CisgICAgaWYgKCFwaXBlbGluZV9jYWNoZSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgICpwUGlwZWxpbmVDYWNoZSA9IChWa1BpcGVsaW5lQ2FjaGUpIHBpcGVsaW5lX2NhY2hlOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVBpcGVsaW5lKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lQaXBlbGluZUNhY2hlKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVDYWNoZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaXBlbGluZUNhY2hlRGF0YSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lQ2FjaGUsCisgICAgc2l6ZV90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a01lcmdlUGlwZWxpbmVDYWNoZXMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDYWNoZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NhY2hlQ291bnQsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlKiAgICAgICAgICAgICAgICAgICAgICBwU3JjQ2FjaGVzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKK30KK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmUpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiA9IG51bGxkcnZfZGV2KGRldmljZSk7CisKKyAgICByZXR1cm4gZ3JhcGhpY3NfcGlwZWxpbmVfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IG51bGxkcnZfcGlwZWxpbmUgKiopIHBQaXBlbGluZSk7Cit9CisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1BpcGVsaW5lKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGlwZWxpbmUpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworCisKKworCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrUXVlcnlQb29sQ3JlYXRlSW5mbyogICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrUXVlcnlQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5UG9vbCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lRdWVyeVBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrUXVlcnlQb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vb2wsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UXVlcnlQb29sUmVzdWx0cygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UXVlcnksCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSwKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKKyAgICBWa1F1ZXJ5UmVzdWx0RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlV2FpdElkbGUoCisgICAgVmtRdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlU3VibWl0KAorICAgIFZrUXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qICAgICAgICAgICAgICAgICAgICAgICBwU3VibWl0cywKKyAgICBWa0ZlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZV8pCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKKyAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVTZW1hcGhvcmUoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2VtYXBob3JlQ3JlYXRlSW5mbyogICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NlbWFwaG9yZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VtYXBob3JlKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVNlbWFwaG9yZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtTZW1hcGhvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVNhbXBsZXIoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8qICAgICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1NhbXBsZXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBudWxsZHJ2X3NhbXBsZXJfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IG51bGxkcnZfc2FtcGxlciAqKikgcFNhbXBsZXIpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lTYW1wbGVyKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8qICAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU2hhZGVyTW9kdWxlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRlck1vZHVsZSkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworCisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXYgPSBudWxsZHJ2X2RldihkZXZpY2UpOworICAgIHN0cnVjdCBudWxsZHJ2X3NoYWRlcl9tb2R1bGUgKnNoYWRlcl9tb2R1bGU7CisKKyAgICBzaGFkZXJfbW9kdWxlID0gKHN0cnVjdCBudWxsZHJ2X3NoYWRlcl9tb2R1bGUgKikgbnVsbGRydl9iYXNlX2NyZWF0ZShkZXYsCisgICAgICAgICAgICBzaXplb2YoKnNoYWRlcl9tb2R1bGUpLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSX01PRFVMRV9FWFQpOworICAgIGlmICghc2hhZGVyX21vZHVsZSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWTsKKworICAgICpwU2hhZGVyTW9kdWxlID0gKFZrU2hhZGVyTW9kdWxlKSBzaGFkZXJfbW9kdWxlOworCisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveVNoYWRlck1vZHVsZSgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa1NoYWRlck1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlck1vZHVsZSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICAvLyBUT0RPOiBGaWxsIGluIHdpdGggcmVhbCBkYXRhCisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQnVmZmVyVmlldygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtCdWZmZXJWaWV3KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlldykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBudWxsZHJ2X2J1Zl92aWV3X2NyZWF0ZShkZXYsIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgKHN0cnVjdCBudWxsZHJ2X2J1Zl92aWV3ICoqKSBwVmlldyk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveUJ1ZmZlclZpZXcoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIFZrQnVmZmVyVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa0ltYWdlVmlld0NyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0ltYWdlVmlldyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWV3KQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXYgPSBudWxsZHJ2X2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIG51bGxkcnZfaW1nX3ZpZXdfY3JlYXRlKGRldiwgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IG51bGxkcnZfaW1nX3ZpZXcgKiopIHBWaWV3KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95SW1hZ2VWaWV3KAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0ltYWdlVmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVZpZXcsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclNldExheW91dCogICAgICAgICAgICAgICAgICAgcFNldExheW91dCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBudWxsZHJ2X2Rlc2NfbGF5b3V0X2NyZWF0ZShkZXYsIHBDcmVhdGVJbmZvLAorICAgICAgICAgICAgKHN0cnVjdCBudWxsZHJ2X2Rlc2NfbGF5b3V0ICoqKSBwU2V0TGF5b3V0KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclNldExheW91dCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgIHZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyogICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZUxheW91dCogICAgICAgICAgICAgICAgICAgICAgIHBQaXBlbGluZUxheW91dCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBudWxsZHJ2X3BpcGVsaW5lX2xheW91dF9jcmVhdGUoZGV2LAorICAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgICAgICAgICAoc3RydWN0IG51bGxkcnZfcGlwZWxpbmVfbGF5b3V0ICoqKSBwUGlwZWxpbmVMYXlvdXQpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lQaXBlbGluZUxheW91dCgKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtQaXBlbGluZUxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVMYXlvdXQsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlRGVzY3JpcHRvclBvb2woCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qICAgICAgICAgICBwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa0Rlc2NyaXB0b3JQb29sKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yUG9vbCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBudWxsZHJ2X2Rlc2NfcG9vbF9jcmVhdGUoZGV2LCBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgIChzdHJ1Y3QgbnVsbGRydl9kZXNjX3Bvb2wgKiopIHBEZXNjcmlwdG9yUG9vbCk7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRGVzdHJveURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldERlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JQb29sLAorICAgIFZrRGVzY3JpcHRvclBvb2xSZXNldEZsYWdzICAgICAgICAgICAgICBmbGFncykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKiAgICAgIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2Rlc2NfcG9vbCAqcG9vbCA9IG51bGxkcnZfZGVzY19wb29sKHBBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sKTsKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldiA9IHBvb2wtPmRldjsKKyAgICBWa1Jlc3VsdCByZXQgPSBWS19TVUNDRVNTOworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IG51bGxkcnZfZGVzY19sYXlvdXQgKmxheW91dCA9CisgICAgICAgICAgICBudWxsZHJ2X2Rlc2NfbGF5b3V0KHBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzW2ldKTsKKworICAgICAgICByZXQgPSBudWxsZHJ2X2Rlc2Nfc2V0X2NyZWF0ZShkZXYsIHBvb2wsIGxheW91dCwKKyAgICAgICAgICAgICAgICAoc3RydWN0IG51bGxkcnZfZGVzY19zZXQgKiopICZwRGVzY3JpcHRvclNldHNbaV0pOworICAgICAgICBpZiAocmV0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtGcmVlRGVzY3JpcHRvclNldHMoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXNjcmlwdG9yUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yUG9vbCwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yU2V0cykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcldyaXRlQ291bnQsCisgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlcywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JDb3B5Q291bnQsCisgICAgY29uc3QgVmtDb3B5RGVzY3JpcHRvclNldCogICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvckNvcGllcykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qICAgICAgICAgIGluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsCisgICAgVmtGcmFtZWJ1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJfcmV0KQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXYgPSBudWxsZHJ2X2RldihkZXZpY2UpOworCisgICAgcmV0dXJuIG51bGxkcnZfZmJfY3JlYXRlKGRldiwgaW5mbywgKHN0cnVjdCBudWxsZHJ2X2ZyYW1lYnVmZmVyICoqKSBmYl9yZXQpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtGcmFtZWJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlUmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogICAgICAgICAgaW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwX3JldCkKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2ID0gbnVsbGRydl9kZXYoZGV2aWNlKTsKKworICAgIHJldHVybiBudWxsZHJ2X3JlbmRlcl9wYXNzX2NyZWF0ZShkZXYsIGluZm8sIChzdHJ1Y3QgbnVsbGRydl9yZW5kZXJfcGFzcyAqKikgcnBfcmV0KTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95UmVuZGVyUGFzcygKKyAgICBWa0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFB1c2hDb25zdGFudHMoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBWa1BpcGVsaW5lTGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICBWa1NoYWRlclN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlRmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlcykKK3sKKyAgICAvKiBUT0RPOiBJbXBsZW1lbnQgKi8KK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkoCisgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgVmtSZW5kZXJQYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLAorICAgIFZrRXh0ZW50MkQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYW51bGFyaXR5KQoreworICAgIHBHcmFudWxhcml0eS0+aGVpZ2h0ID0gMTsKKyAgICBwR3JhbnVsYXJpdHktPndpZHRoID0gMTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCZWdpblJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8qICAgICAgICAgICAgICAgIHBSZW5kZXJQYXNzQmVnaW4sCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZE5leHRTdWJwYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtTdWJwYXNzQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFJlbmRlclBhc3MoCisgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcikKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEV4ZWN1dGVDb21tYW5kcygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcnNDb3VudCwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXIqICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZEJ1ZmZlcnMpCit7CisgICAgTlVMTERSVl9MT0dfRlVOQzsKK30KKwordm9pZCogeGNiQ3JlYXRlV2luZG93KAorICAgIHVpbnQxNl90ICAgICAgICAgd2lkdGgsCisgICAgdWludDE2X3QgICAgICAgICBoZWlnaHQpCit7CisgICAgc3RhdGljIHVpbnQzMl90ICB3aW5kb3c7ICAvLyBLbHVkZ2UgdG8gdGhlIG1heAorICAgIE5VTExEUlZfTE9HX0ZVTkM7CisgICAgcmV0dXJuICZ3aW5kb3c7Cit9CisKKy8vIE1heSBub3QgYmUgbmVlZGVkLCBpZiB3ZSBzdHViIG91dCBzdHVmIGluIHRyaS5jCit2b2lkIHhjYkRlc3Ryb3lXaW5kb3coKQoreworICAgIE5VTExEUlZfTE9HX0ZVTkM7Cit9CisKK2ludCB4Y2JHZXRNZXNzYWdlKHZvaWQgKm1zZykKK3sKKyAgICBOVUxMRFJWX0xPR19GVU5DOworICAgIHJldHVybiAwOworfQorCitWa1Jlc3VsdCB4Y2JRdWV1ZVByZXNlbnQodm9pZCAqcXVldWUsIHZvaWQgKmltYWdlLCB2b2lkKiBmZW5jZSkKK3sKKyAgICByZXR1cm4gVktfU1VDQ0VTUzsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UGh5c2ljYWxEZXZpY2VJbWFnZUZvcm1hdFByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICBWa0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBWa0ltYWdlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgVmtJbWFnZVRpbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxpbmcsCisgICAgVmtJbWFnZVVzYWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICBWa0ltYWdlQ3JlYXRlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgIFZrSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzKiAgICAgICAgICAgICAgICAgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcykKK3sKKyAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLT5tYXhFeHRlbnQud2lkdGggPSAxMDI0OworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heEV4dGVudC5oZWlnaHQgPSAxMDI0OworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPm1heEV4dGVudC5kZXB0aCA9IDEwMjQ7CisgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcy0+bWF4TWlwTGV2ZWxzID0gMTA7CisgICAgcEltYWdlRm9ybWF0UHJvcGVydGllcy0+bWF4QXJyYXlMYXllcnMgPSAxMDI0OworICAgIHBJbWFnZUZvcm1hdFByb3BlcnRpZXMtPnNhbXBsZUNvdW50cyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVDsKKyAgICBwSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzLT5tYXhSZXNvdXJjZVNpemUgPSAxMDI0KjEwMjQqMTAyNDsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvaWNkL251bGxkcnYvbnVsbGRydi5oIGIvaWNkL251bGxkcnYvbnVsbGRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGNkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9pY2QvbnVsbGRydi9udWxsZHJ2LmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogQ29keSBOb3J0aHJvcCA8Y29keUBsdW5hcmcuY29tPgorICogQXV0aG9yOiBEYXZpZCBQaW5lZG8gPGRhdmlkQGx1bmFyZy5jb20+CisgKi8KKworI2lmbmRlZiBOVUxMRFJWX0gKKyNkZWZpbmUgTlVMTERSVl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorI2luY2x1ZGUgPHZ1bGthbi92a19pY2QuaD4KKworI2luY2x1ZGUgImljZC5oIgorCisjaW5jbHVkZSAiaWNkLWZvcm1hdC5oIgorI2luY2x1ZGUgImljZC11dGlscy5oIgorCitzdHJ1Y3QgbnVsbGRydl9iYXNlIHsKKyAgICB2b2lkICpsb2FkZXJfZGF0YTsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICBWa1Jlc3VsdCAoKmdldF9tZW1vcnlfcmVxdWlyZW1lbnRzKShzdHJ1Y3QgbnVsbGRydl9iYXNlICpiYXNlLCBWa01lbW9yeVJlcXVpcmVtZW50cyAqcE1lbW9yeVJlcXVpcmVtZW50cyk7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9vYmogeworICAgIHN0cnVjdCBudWxsZHJ2X2Jhc2UgYmFzZTsKK307CisKK2VudW0gbnVsbGRydl9kZXZfZXh0X3R5cGUgeworICAgTlVMTERSVl9ERVZfRVhUX0tIUl9TV0FQQ0hBSU4sCisgICBOVUxMRFJWX0RFVl9FWFRfQ09VTlQsCisgICBOVUxMRFJWX0RFVl9FWFRfSU5WQUxJRCA9IE5VTExEUlZfREVWX0VYVF9DT1VOVCwKK307CisKKworZW51bSBudWxsZHJ2X2luc3RfZXh0X3R5cGUgeworICAgTlVMTERSVl9JTlNUX0VYVF9LSFJfU1VSRkFDRSwKKyAgIE5VTExEUlZfSU5TVF9FWFRfS0hSX1hDQl9TVVJGQUNFLAorICAgTlVMTERSVl9JTlNUX0VYVF9DT1VOVCwKKyAgIE5VTExEUlZfSU5TVF9FWFRfSU5WQUxJRCA9IE5VTExEUlZfSU5TVF9FWFRfQ09VTlQsCit9OworCisKK3N0cnVjdCBudWxsZHJ2X2luc3RhbmNlIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfZ3B1IHsKKyAgICB2b2lkICpsb2FkZXJfZGF0YTsKK307CisKK3N0cnVjdCBudWxsZHJ2X2RldiB7CisgICAgIHN0cnVjdCBudWxsZHJ2X2Jhc2UgYmFzZTsKKyAgICAgYm9vbCBleHRzW05VTExEUlZfREVWX0VYVF9DT1VOVF07CisgICAgIHN0cnVjdCBudWxsZHJ2X2Rlc2Nfb294eCAqZGVzY19vb3h4OworICAgICBzdHJ1Y3QgbnVsbGRydl9xdWV1ZSAqcXVldWVzWzFdOworfTsKKworc3RydWN0IG51bGxkcnZfZGVzY19vb3h4IHsKKyAgICB1aW50MzJfdCBzdXJmYWNlX2Rlc2Nfc2l6ZTsKKyAgICB1aW50MzJfdCBzYW1wbGVyX2Rlc2Nfc2l6ZTsKK307CisKKworc3RydWN0IG51bGxkcnZfcXVldWUgeworICAgIHN0cnVjdCBudWxsZHJ2X2Jhc2UgYmFzZTsKKyAgICBzdHJ1Y3QgbnVsbGRydl9kZXYgKmRldjsKK307CisKK3N0cnVjdCBudWxsZHJ2X3J0X3ZpZXcgeworICAgIHN0cnVjdCBudWxsZHJ2X29iaiBvYmo7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9mZW5jZSB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKK307CisKK3N0cnVjdCBudWxsZHJ2X2ltZyB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKKyAgICBWa0ltYWdlVHlwZSB0eXBlOworICAgIGludDMyX3QgZGVwdGg7CisgICAgdWludDMyX3QgbWlwX2xldmVsczsKKyAgICB1aW50MzJfdCBhcnJheV9zaXplOworICAgIFZrRmxhZ3MgdXNhZ2U7CisgICAgVmtTYW1wbGVDb3VudEZsYWdCaXRzIHNhbXBsZXM7CisgICAgc2l6ZV90IHRvdGFsX3NpemU7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9tZW0geworICAgIHN0cnVjdCBudWxsZHJ2X2Jhc2UgYmFzZTsKKyAgICBzdHJ1Y3QgbnVsbGRydl9ibyAqYm87CisgICAgVmtEZXZpY2VTaXplIHNpemU7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9zYW1wbGVyIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfc2hhZGVyX21vZHVsZSB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKK307CisKK3N0cnVjdCBudWxsZHJ2X3BpcGVsaW5lX2NhY2hlIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfaW1nX3ZpZXcgeworICAgIHN0cnVjdCBudWxsZHJ2X29iaiBvYmo7CisgICAgc3RydWN0IG51bGxkcnZfaW1nICppbWc7CisgICAgZmxvYXQgbWluX2xvZDsKKyAgICB1aW50MzJfdCBjbWRfbGVuOworfTsKKworc3RydWN0IG51bGxkcnZfYnVmIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworICAgIFZrRGV2aWNlU2l6ZSBzaXplOworICAgIFZrRmxhZ3MgdXNhZ2U7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9kZXNjX2xheW91dCB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKK307CisKK3N0cnVjdCBudWxsZHJ2X3BpcGVsaW5lX2xheW91dCB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKK307CisKK3N0cnVjdCBudWxsZHJ2X3NoYWRlciB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKKworfTsKKworc3RydWN0IG51bGxkcnZfcGlwZWxpbmUgeworICAgIHN0cnVjdCBudWxsZHJ2X29iaiBvYmo7CisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXY7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9keW5hbWljX3ZwIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfZHluYW1pY19saW5lX3dpZHRoIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfZHluYW1pY19kZXB0aF9iaWFzIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfZHluYW1pY19ibGVuZCB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKK307CisKK3N0cnVjdCBudWxsZHJ2X2R5bmFtaWNfZGVwdGhfYm91bmRzIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfZHluYW1pY19zdGVuY2lsIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfY21kIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfZGVzY19wb29sIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworICAgIHN0cnVjdCBudWxsZHJ2X2RldiAqZGV2OworfTsKKworc3RydWN0IG51bGxkcnZfZGVzY19zZXQgeworICAgIHN0cnVjdCBudWxsZHJ2X29iaiBvYmo7CisgICAgc3RydWN0IG51bGxkcnZfZGVzY19vb3h4ICpvb3h4OworICAgIGNvbnN0IHN0cnVjdCBudWxsZHJ2X2Rlc2NfbGF5b3V0ICpsYXlvdXQ7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9mcmFtZWJ1ZmZlciB7CisgICAgc3RydWN0IG51bGxkcnZfb2JqIG9iajsKK307CisKK3N0cnVjdCBudWxsZHJ2X3JlbmRlcl9wYXNzIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9vYmogb2JqOworfTsKKworc3RydWN0IG51bGxkcnZfYnVmX3ZpZXcgeworICAgIHN0cnVjdCBudWxsZHJ2X29iaiBvYmo7CisKKyAgICBzdHJ1Y3QgbnVsbGRydl9idWYgKmJ1ZjsKKworICAgIC8qIFNVUkZBQ0VfU1RBVEUgKi8KKyAgICB1aW50MzJfdCBjbWRbOF07CisgICAgdWludDMyX3QgZnNfY21kWzhdOworICAgIHVpbnQzMl90IGNtZF9sZW47Cit9OworCitzdHJ1Y3QgbnVsbGRydl9kaXNwbGF5IHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9iYXNlIGJhc2U7CisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXY7Cit9OworCitzdHJ1Y3QgbnVsbGRydl9zd2FwX2NoYWluIHsKKyAgICBzdHJ1Y3QgbnVsbGRydl9iYXNlIGJhc2U7CisgICAgc3RydWN0IG51bGxkcnZfZGV2ICpkZXY7Cit9OworCisjZW5kaWYgLyogTlVMTERSVl9IICovCmRpZmYgLS1naXQgYS9pY2QvbnVsbGRydi9udWxsZHJ2X2ljZC5qc29uIGIvaWNkL251bGxkcnYvbnVsbGRydl9pY2QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDRjOGUyCi0tLSAvZGV2L251bGwKKysrIGIvaWNkL251bGxkcnYvbnVsbGRydl9pY2QuanNvbgpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiI6ICIxLjAuMCIsCisgICAgIklDRCI6IHsKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZLX251bGxkcnYuc28iLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjIxIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pzb25jcHBfcmV2aXNpb24gYi9qc29uY3BwX3JldmlzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjA5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qc29uY3BwX3JldmlzaW9uCkBAIC0wLDAgKzEgQEAKK2Q4Y2Q4NDhlZGUxMDcxYTI1ODQ2Y2Q5MGI0ZmRkZjI2OWQ4NjhmZjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sYXllcnMvdmtfbGF5ZXJfY29uZmlnLmNwcCBiL2xheWVycy92a19sYXllcl9jb25maWcuY3BwCmluZGV4IGQ4ZmU4N2QuLmY1YWRiOGMgMTAwNjQ0Ci0tLSBhL2xheWVycy92a19sYXllcl9jb25maWcuY3BwCisrKyBiL2xheWVycy92a19sYXllcl9jb25maWcuY3BwCkBAIC00Myw2ICs0Myw3IEBACiAKICAgcHJpdmF0ZToKICAgICBib29sIG1fZmlsZUlzUGFyc2VkOworICAgIHN0ZDo6c3RyaW5nIG1fZmlsZU5hbWU7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtX3ZhbHVlTWFwOwogCiAgICAgdm9pZCBwYXJzZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwpAQCAtMTM0LDYgKzEzNSwxMyBAQAogLy8gQ29uc3RydWN0b3IgZm9yIENvbmZpZ0ZpbGUuIEluaXRpYWxpemUgbGF5ZXJzIHRvIGxvZyBlcnJvciBtZXNzYWdlcyB0byBzdGRvdXQgYnkgZGVmYXVsdC4gSWYgYSB2a19sYXllcl9zZXR0aW5ncyBmaWxlIGlzIHByZXNlbnQsCiAvLyBpdHMgc2V0dGluZ3Mgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCiBDb25maWdGaWxlOjpDb25maWdGaWxlKCkgOiBtX2ZpbGVJc1BhcnNlZChmYWxzZSkgeworCisjaWZkZWYgQU5EUk9JRAorICAgIG1fZmlsZU5hbWUgPSAiL3NkY2FyZC9BbmRyb2lkL3ZrX2xheWVyX3NldHRpbmdzLnR4dCI7CisjZWxzZQorICAgIG1fZmlsZU5hbWUgPSAidmtfbGF5ZXJfc2V0dGluZ3MudHh0IjsKKyNlbmRpZgorCiAgICAgbV92YWx1ZU1hcFsibHVuYXJnX2NvcmVfdmFsaWRhdGlvbi5yZXBvcnRfZmxhZ3MiXSA9ICJlcnJvciI7CiAgICAgbV92YWx1ZU1hcFsibHVuYXJnX2ltYWdlLnJlcG9ydF9mbGFncyJdID0gImVycm9yIjsKICAgICBtX3ZhbHVlTWFwWyJsdW5hcmdfb2JqZWN0X3RyYWNrZXIucmVwb3J0X2ZsYWdzIl0gPSAiZXJyb3IiOwpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvQ01ha2VMaXN0cy50eHQgYi9sYXllcnN2dC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmNkODBiCi0tLSAvZGV2L251bGwKKysrIGIvbGF5ZXJzdnQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMDEgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQgKFZFUlNJT04gMi44LjExKQorCittYWNybyhydW5fdmtfaGVscGVyIHN1YmNtZCkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7QVJHTn0KKyAgICAgICAgQ09NTUFORCAke1BZVEhPTl9DTUR9ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS92a19oZWxwZXIucHkgLS0ke3N1YmNtZH0gJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2luY2x1ZGUvdnVsa2FuL3Z1bGthbi5oIC0tYWJzX291dF9kaXIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgICAgIERFUEVORFMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3ZrX2hlbHBlci5weSAke1BST0pFQ1RfU09VUkNFX0RJUn0vaW5jbHVkZS92dWxrYW4vdnVsa2FuLmgKKyAgICApCitlbmRtYWNybygpCisKKyMjIFZ1bGthblRvb2xzIGhhcyBpdHMgb3duIGxheWVyIGdlbmVyYXRvciBzY3JpcHQKK21hY3JvKHJ1bl92a192dGxheWVyX2dlbmVyYXRlIHN1YmNtZCBvdXRwdXQpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke291dHB1dH0KKyAgICAgICAgQ09NTUFORCAke1BZVEhPTl9DTUR9ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS92ay12dGxheWVyLWdlbmVyYXRlLnB5ICR7RGlzcGxheVNlcnZlcn0gJHtzdWJjbWR9ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9pbmNsdWRlL3Z1bGthbi92dWxrYW4uaCA+ICR7b3V0cHV0fQorICAgICAgICBERVBFTkRTICR7UFJPSkVDVF9TT1VSQ0VfRElSfS92ay12dGxheWVyLWdlbmVyYXRlLnB5ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9pbmNsdWRlL3Z1bGthbi92dWxrYW4uaCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdmtfaGVscGVyX2FwaV9kdW1wLnB5CisgICAgKQorZW5kbWFjcm8oKQorCittYWNybyhydW5fdmtfbGF5ZXJfeG1sX2dlbmVyYXRlIHN1YmNtZCBvdXRwdXQpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke291dHB1dH0KKyAgICAgICAgQ09NTUFORCAke1BZVEhPTl9DTUR9ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS92dF9nZW52ay5weSAtcmVnaXN0cnkgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3ZrLnhtbCAke291dHB1dH0KKyAgICAgICAgREVQRU5EUyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdmsueG1sICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9nZW5lcmF0b3IucHkgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Z0X2dlbnZrLnB5ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9yZWcucHkKKyAgICApCitlbmRtYWNybygpCisKK3NldChMQVlFUl9KU09OX0ZJTEVTCisgICAgVmtMYXllcl9hcGlfZHVtcAorICAgIFZrTGF5ZXJfYmFzaWMKKyAgICBWa0xheWVyX2dlbmVyaWMKKyAgICBWa0xheWVyX211bHRpCisgICAgVmtMYXllcl9zY3JlZW5zaG90CisgICAgKQorCitzZXQoVktfTEFZRVJfUlBBVEggL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS92dWxrYW4vbGF5ZXI6L3Vzci9saWIvaTM4Ni1saW51eC1nbnUvdnVsa2FuL2xheWVyKQorc2V0KENNQUtFX0lOU1RBTExfUlBBVEggJHtWS19MQVlFUl9SUEFUSH0pCisKK2lmIChXSU4zMikKKyAgICBpZiAoTk9UIChDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVIgU1RSRVFVQUwgQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSKSkKKyAgICAgICAgaWYgKENNQUtFX0dFTkVSQVRPUiBNQVRDSEVTICJeVmlzdWFsIFN0dWRpby4qIikKKyAgICAgICAgICAgIGZvcmVhY2ggKGNvbmZpZ19maWxlICR7TEFZRVJfSlNPTl9GSUxFU30pCisgICAgICAgICAgICAgICAgRklMRShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vd2luZG93cy8ke2NvbmZpZ19maWxlfS5qc29uIHNyY19qc29uKQorICAgICAgICAgICAgICAgIEZJTEUoVE9fTkFUSVZFX1BBVEggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyQ8Q09ORklHVVJBVElPTj4vJHtjb25maWdfZmlsZX0uanNvbiBkc3RfanNvbikKKyAgICAgICAgICAgICAgICBhZGRfY3VzdG9tX3RhcmdldCgke2NvbmZpZ19maWxlfS1qc29uIEFMTAorICAgICAgICAgICAgICAgICAgICBDT01NQU5EIGNvcHkgJHtzcmNfanNvbn0gJHtkc3RfanNvbn0KKyAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoJHtjb25maWdfZmlsZX0tanNvbiAke2NvbmZpZ19maWxlfSkKKyAgICAgICAgICAgIGVuZGZvcmVhY2goY29uZmlnX2ZpbGUpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgZm9yZWFjaCAoY29uZmlnX2ZpbGUgJHtMQVlFUl9KU09OX0ZJTEVTfSkKKyAgICAgICAgICAgICAgICBGSUxFKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS93aW5kb3dzLyR7Y29uZmlnX2ZpbGV9Lmpzb24gc3JjX2pzb24pCisgICAgICAgICAgICAgICAgRklMRShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtjb25maWdfZmlsZX0uanNvbiBkc3RfanNvbikKKyAgICAgICAgICAgICAgICBhZGRfY3VzdG9tX3RhcmdldCgke2NvbmZpZ19maWxlfS1qc29uIEFMTAorICAgICAgICAgICAgICAgICAgICBDT01NQU5EIGNvcHkgJHtzcmNfanNvbn0gJHtkc3RfanNvbn0KKyAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGFkZF9kZXBlbmRlbmNpZXMoJHtjb25maWdfZmlsZX0tanNvbiAke2NvbmZpZ19maWxlfSkKKyAgICAgICAgICAgIGVuZGZvcmVhY2goY29uZmlnX2ZpbGUpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICAjIGV4dHJhIHNldHVwIGZvciBvdXQtb2YtdHJlZSBidWlsZHMKKyAgICBpZiAoTk9UIChDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVIgU1RSRVFVQUwgQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSKSkKKyAgICAgICAgZm9yZWFjaCAoY29uZmlnX2ZpbGUgJHtMQVlFUl9KU09OX0ZJTEVTfSkKKyAgICAgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7Y29uZmlnX2ZpbGV9LWpzb24gQUxMCisgICAgICAgICAgICAgICAgQ09NTUFORCBsbiAtc2YgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpbnV4LyR7Y29uZmlnX2ZpbGV9Lmpzb24KKyAgICAgICAgICAgICAgICBWRVJCQVRJTQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICBhZGRfZGVwZW5kZW5jaWVzKCR7Y29uZmlnX2ZpbGV9LWpzb24gJHtjb25maWdfZmlsZX0pCisgICAgICAgIGVuZGZvcmVhY2goY29uZmlnX2ZpbGUpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZiAoV0lOMzIpCisgICAgbWFjcm8oYWRkX3ZrX2xheWVyIHRhcmdldCkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIFZrTGF5ZXJfJHt0YXJnZXR9LmRlZgorICAgICAgICBDT01NQU5EICR7UFlUSE9OX0NNRH0gJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3ZrLWdlbmVyYXRlLnB5ICR7RGlzcGxheVNlcnZlcn0gd2luLWRlZi1maWxlIFZrTGF5ZXJfJHt0YXJnZXR9IGxheWVyID4gVmtMYXllcl8ke3RhcmdldH0uZGVmCisgICAgICAgIERFUEVORFMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3ZrLWdlbmVyYXRlLnB5ICR7UFJPSkVDVF9TT1VSQ0VfRElSfS92dWxrYW4ucHkKKyAgICApCisgICAgYWRkX2xpYnJhcnkoVmtMYXllcl8ke3RhcmdldH0gU0hBUkVEICR7QVJHTn0gVmtMYXllcl8ke3RhcmdldH0uZGVmKQorICAgIHRhcmdldF9saW5rX0xpYnJhcmllcyhWa0xheWVyXyR7dGFyZ2V0fSBWa0xheWVyX3V0aWxzdnQpCisgICAgYWRkX2RlcGVuZGVuY2llcyhWa0xheWVyXyR7dGFyZ2V0fSBnZW5lcmF0ZV92dF9oZWxwZXJzKQorICAgIGVuZG1hY3JvKCkKK2Vsc2UoKQorICAgIG1hY3JvKGFkZF92a19sYXllciB0YXJnZXQpCisgICAgYWRkX2xpYnJhcnkoVmtMYXllcl8ke3RhcmdldH0gU0hBUkVEICR7QVJHTn0pCisgICAgdGFyZ2V0X2xpbmtfTGlicmFyaWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFZrTGF5ZXJfdXRpbHN2dCkKKyAgICBhZGRfZGVwZW5kZW5jaWVzKFZrTGF5ZXJfJHt0YXJnZXR9IGdlbmVyYXRlX3Z0X2hlbHBlcnMpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKFZrTGF5ZXJfJHt0YXJnZXR9IFBST1BFUlRJRVMgTElOS19GTEFHUyAiLVdsLC1Cc3ltYm9saWMiKQorICAgIGluc3RhbGwoVEFSR0VUUyBWa0xheWVyXyR7dGFyZ2V0fSBERVNUSU5BVElPTiAke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5zdGFsbF9zdGFnaW5nKQorICAgIGVuZG1hY3JvKCkKK2VuZGlmKCkKKworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vbG9hZGVyCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL2xheWVycworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi9pbmNsdWRlL3Z1bGthbgorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS8uLi9nbHNsYW5nL1NQSVJWCispCisKK2lmIChXSU4zMikKKyAgICBzZXQgKENNQUtFX0NYWF9GTEFHU19SRUxFQVNFICIke0NNQUtFX0NYWF9GTEFHU19SRUxFQVNFfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIikKKyAgICBzZXQgKENNQUtFX0NfRkxBR1NfUkVMRUFTRSAgICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIpCisKKyAgICAjIEZvciBWUyAyMDE1LCB3aGljaCB1c2VzIGNvbXBpbGVyIHZlcnNpb24gMTkwMCwgY29yZV92YWxpZGF0aW9uLmNwcCBmYWlscyB3aXRoIHRvbyBtYW55IG9iamVjdHMKKyAgICAjIHdpdGhvdXQgZWl0aGVyIG9wdGltaXphdGlvbnMgZW5hYmxlZCwgb3Igc2V0dGluZyB0aGUgL2JpZ29iaiBjb21waWxhdGlvbiBvcHRpb24uICBTaW5jZQorICAgICMgb3B0aW1pemF0aW9ucyBhcmUgZW5hYmxlZCBpbiBhIHJlbGVhc2UgYnVpbGQsIHRoaXMgb25seSBhZmZlY3RzIHRoZSBkZWJ1ZyBidWlsZC4gIEZvciBub3csCisgICAgIyBlbmFibGUgL2JpZ29iaiBtb2RlIGZvciBhbGwgZGVidWcgbGF5ZXIgZmlsZXMuIEFuIGFsdGVybmF0aXZlIGZvciB0aGUgZnV0dXJlIGlzIHRvIHNwbGl0CisgICAgIyBsYXJnZSBzb3VyY2UgZmlsZXMgaW50byBtdWx0aXBsZSBmaWxlcyB3aGljaCB3aWxsIGFsc28gYWxsZXZpYXRlIHRoZSBjb21waWxhdGlvbiBlcnJvci4KKyAgICBpZiAoTVNWQyBBTkQgTk9UIChNU1ZDX1ZFUlNJT04gTEVTUyAxOTAwKSkKKyAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfREVCVUcgICAiJHtDTUFLRV9DWFhfRkxBR1NfREVCVUd9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgL2JpZ29iaiIpCisgICAgICAgIHNldCAoQ01BS0VfQ19GTEFHU19ERUJVRyAgICAgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAvYmlnb2JqIikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfREVCVUcgICAiJHtDTUFLRV9DWFhfRkxBR1NfREVCVUd9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgICAgICBzZXQgKENNQUtFX0NfRkxBR1NfREVCVUcgICAgICIke0NNQUtFX0NfRkxBR1NfREVCVUd9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTICItc3RkPWMrKzExIikKKyAgICBzZXQgKENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1XcG9pbnRlci1hcml0aCIpCisgICAgc2V0IChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC1XcG9pbnRlci1hcml0aCIpCitlbmRpZigpCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgdmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgKKyAgICBDT01NQU5EICR7UFlUSE9OX0NNRH0gJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3ZrLWdlbmVyYXRlLnB5ICR7RGlzcGxheVNlcnZlcn0gZGlzcGF0Y2gtdGFibGUtb3BzIGxheWVyID4gdmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgKKyAgICBERVBFTkRTICR7UFJPSkVDVF9TT1VSQ0VfRElSfS92ay1nZW5lcmF0ZS5weSAke1BST0pFQ1RfU09VUkNFX0RJUn0vdnVsa2FuLnB5KQorCitydW5fdmtfaGVscGVyKGdlbl9lbnVtX3N0cmluZ19oZWxwZXIgdmtfZW51bV9zdHJpbmdfaGVscGVyLmgpCitydW5fdmtfaGVscGVyKGdlbl9zdHJ1Y3Rfd3JhcHBlcnMKKyAgICB2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlci5oCisgICAgdmtfc3RydWN0X3N0cmluZ19oZWxwZXJfY3BwLmgKKyAgICB2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlcl9ub19hZGRyLmgKKyAgICB2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlcl9ub19hZGRyX2NwcC5oCisgICAgdmtfc3RydWN0X3NpemVfaGVscGVyLmgKKyAgICB2a19zdHJ1Y3Rfc2l6ZV9oZWxwZXIuYworICAgIHZrX3N0cnVjdF93cmFwcGVycy5oCisgICAgdmtfc3RydWN0X3dyYXBwZXJzLmNwcAorICAgIHZrX3NhZmVfc3RydWN0LmgKKyMgRG9uJ3QgbGlzdCB2a19zYWZlX3N0cnVjdC5jcHAgYXMgT1VUUFVUIHRvIGF2b2lkIGR1cGxpY2F0ZSBidWlsZHMuCisjIElmIGxpc3RlZCBoZXJlIHVzZSBvZiBpdCBmb3IgYWRkX2xpYnJhcnkgd2lsbCBjYXVzZSBpdCB0byBiZSBjcmVhdGVkCisjIGluZGVwZW5kZW50bHkgb2YgY3VzdG9tIHRhcmdldCBnZW5lcmF0ZV92a19sYXllcl9oZWxwZXJzIC4KKyMgVGhhdCBicmVha3MgcGFyYWxsZWwgYnVpbGRzLgorIyAgIHZrX3NhZmVfc3RydWN0LmNwcAorKQorCisjIExldCBnZW5fc3RydWN0X3dyYXBwZXJzIHJlYWxseSBjcmVhdGUgdmtfc2FmZV9zdHJ1Y3QuY3BwCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIHZrX3NhZmVfc3RydWN0LmNwcAorICAgIENPTU1BTkQgZWNobyBkZWZlciBtYWtpbmcgdmtfc2FmZV9zdHJ1Y3QuY3BwCispCisKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygKKyAgICB2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlci5oCisgICAgdmtfc3RydWN0X3N0cmluZ19oZWxwZXJfY3BwLmgKKyAgICB2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlcl9ub19hZGRyLmgKKyAgICB2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlcl9ub19hZGRyX2NwcC5oCisgICAgdmtfc3RydWN0X3NpemVfaGVscGVyLmgKKyAgICB2a19zdHJ1Y3Rfc2l6ZV9oZWxwZXIuYworICAgIHZrX3N0cnVjdF93cmFwcGVycy5oCisgICAgdmtfc3RydWN0X3dyYXBwZXJzLmNwcAorICAgIHZrX3NhZmVfc3RydWN0LmgKKyAgICB2a19zYWZlX3N0cnVjdC5jcHAKKyAgICBQUk9QRVJUSUVTIEdFTkVSQVRFRCBUUlVFKQorCithZGRfY3VzdG9tX3RhcmdldChnZW5lcmF0ZV92dF9oZWxwZXJzIERFUEVORFMKKyAgICB2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaAorICAgIHZrX2VudW1fc3RyaW5nX2hlbHBlci5oCisgICAgdmtfc3RydWN0X3N0cmluZ19oZWxwZXIuaAorICAgIHZrX3N0cnVjdF9zdHJpbmdfaGVscGVyX25vX2FkZHIuaAorICAgIHZrX3N0cnVjdF9zdHJpbmdfaGVscGVyX2NwcC5oCisgICAgdmtfc3RydWN0X3N0cmluZ19oZWxwZXJfbm9fYWRkcl9jcHAuaAorICAgIHZrX3N0cnVjdF9zaXplX2hlbHBlci5oCisgICAgdmtfc3RydWN0X3NpemVfaGVscGVyLmMKKyAgICB2a19zdHJ1Y3Rfd3JhcHBlcnMuaAorICAgIHZrX3N0cnVjdF93cmFwcGVycy5jcHAKKyAgICB2a19zYWZlX3N0cnVjdC5oCisgICAgdmtfc2FmZV9zdHJ1Y3QuY3BwCispCisKKyNWdWxrYW5Ub29scyBsYXllcnMKK3J1bl92a192dGxheWVyX2dlbmVyYXRlKGdlbmVyaWMgZ2VuZXJpY19sYXllci5jcHApCitydW5fdmtfbGF5ZXJfeG1sX2dlbmVyYXRlKEFwaUR1bXAgYXBpX2R1bXAuY3BwKQorcnVuX3ZrX2xheWVyX3htbF9nZW5lcmF0ZShBcGlEdW1wIGFwaV9kdW1wX3RleHQuaCkKKworIyBMYXllciBVdGlscyBMaWJyYXJ5CisjIEZvciBXaW5kb3dzLCB3ZSB1c2UgYSBzdGF0aWMgbGliIGJlY2F1c2UgdGhlIFdpbmRvd3MgbG9hZGVyIGhhcyBhIGZhaXJseSByZXN0cmljdGl2ZSBsb2FkZXIgc2VhcmNoCisjIHBhdGggdGhhdCBjYW4ndCBiZSBlYXNpbHkgbW9kaWZpZWQgdG8gcG9pbnQgaXQgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIGxheWVycy4KK2lmIChXSU4zMikKKyAgICBhZGRfbGlicmFyeShWa0xheWVyX3V0aWxzdnQgU1RBVElDIC4uL2xheWVycy92a19sYXllcl9jb25maWcuY3BwIC4uL2xheWVycy92a19sYXllcl9leHRlbnNpb25fdXRpbHMuY3BwIC4uL2xheWVycy92a19sYXllcl91dGlscy5jcHApCitlbHNlKCkKKyAgICBhZGRfbGlicmFyeShWa0xheWVyX3V0aWxzdnQgU0hBUkVEIC4uL2xheWVycy92a19sYXllcl9jb25maWcuY3BwIC4uL2xheWVycy92a19sYXllcl9leHRlbnNpb25fdXRpbHMuY3BwIC4uL2xheWVycy92a19sYXllcl91dGlscy5jcHApCisgICAgaW5zdGFsbChUQVJHRVRTIFZrTGF5ZXJfdXRpbHN2dCBERVNUSU5BVElPTiAke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5zdGFsbF9zdGFnaW5nKQorZW5kaWYoKQorCisjIFZ1bGthblRvb2xzIGxheWVycworYWRkX3ZrX2xheWVyKGJhc2ljIGJhc2ljLmNwcCAuLi9sYXllcnMvdmtfbGF5ZXJfdGFibGUuY3BwKQorYWRkX3ZrX2xheWVyKG11bHRpIG11bHRpLmNwcCAuLi9sYXllcnMvdmtfbGF5ZXJfdGFibGUuY3BwKQorIyBnZW5lcmF0ZWQKK2FkZF92a19sYXllcihnZW5lcmljIGdlbmVyaWNfbGF5ZXIuY3BwIC4uL2xheWVycy92a19sYXllcl90YWJsZS5jcHApCithZGRfdmtfbGF5ZXIoYXBpX2R1bXAgYXBpX2R1bXAuY3BwIGFwaV9kdW1wX3RleHQuaCAuLi9sYXllcnMvdmtfbGF5ZXJfdGFibGUuY3BwKQorYWRkX3ZrX2xheWVyKHNjcmVlbnNob3Qgc2NyZWVuc2hvdC5jcHAgLi4vbGF5ZXJzL3ZrX2xheWVyX3RhYmxlLmNwcCkKKwpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvUkVBRE1FLm1kIGIvbGF5ZXJzdnQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MGY3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9sYXllcnN2dC9SRUFETUUubWQKQEAgLTAsMCArMSw3OSBAQAorIyBMYXllciBEZXNjcmlwdGlvbiBhbmQgU3RhdHVzCisKKyMjIE92ZXJ2aWV3CisKK0xheWVyIGxpYnJhcmllcyBjYW4gYmUgd3JpdHRlbiB0byBpbnRlcmNlcHQgb3IgaG9vayBWSyBlbnRyeSBwb2ludHMgZm9yIHZhcmlvdXMKK2RlYnVnIGFuZCB2YWxpZGF0aW9uIHB1cnBvc2VzLiAgT25lIG9yIG1vcmUgVksgZW50cnkgcG9pbnRzIGNhbiBiZSBkZWZpbmVkIGluIHlvdXIgTGF5ZXIKK2xpYnJhcnkuICBVbmRlZmluZWQgZW50cnlwb2ludHMgaW4gdGhlIExheWVyIGxpYnJhcnkgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgTGF5ZXIgd2hpY2gKK21heSBiZSB0aGUgZHJpdmVyLiAgTXVsdGlwbGUgbGF5ZXIgbGlicmFyaWVzIGNhbiBiZSBjaGFpbmVkIChhY3R1YWxseSBhIGhpZXJhcmNoeSkgdG9nZXRoZXIuCit2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIGFuZCB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyBjYW4gYmUgY2FsbGVkIHRvIGxpc3QgdGhlCithdmFpbGFibGUgbGF5ZXJzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiBMYXllcnMgY2FuIGludGVyY2VwdCBWdWxrYW4gaW5zdGFuY2UgbGV2ZWwgZW50cnkgcG9pbnRzCitpbiB3aGljaCBjYXNlIHRoZXkgYXJlIGNhbGxlZCBhbiBJbnN0YW5jZSBMYXllci4gIExheWVycyBjYW4gaW50ZXJjZXB0IGRldmljZSBlbnRyeSAgcG9pbnRzCitpbiB3aGljaCBjYXNlIHRoZXkgYXJlIGNhbGxlZCBhIERldmljZSBMYXllci4gSW5zdGFuY2UgbGV2ZWwgZW50cnkgcG9pbnRzIGFyZSB0aG9zZSB3aXRoIFZrSW5zdGFuY2UKK29yIFZrUGh5c2ljYWxEZXZpY2UgYXMgZmlyc3QgcGFyYW1ldGVyLiAgRGV2aWNlIGxldmVsIGVudHJ5IHBvaW50cyBhcmUgdGhvc2Ugd2l0aCBWa0RldmljZSwgVmtDb21tYW5kQnVmZmVyLAorb3IgVmtRdWV1ZSBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLiBMYXllcnMgdGhhdCB3YW50IHRvIGludGVyY2VwdCBib3RoIGluc3RhbmNlIGFuZCBkZXZpY2UKK2xldmVsIGVudHJ5cG9pbnRzIGFyZSBjYWxsZWQgR2xvYmFsIExheWVycy4gdmtYWFhYR2V0UHJvY0FkZHIgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBMYXllcnMgYW5kCitMb2FkZXIgdG8gaW5pdGlhbGl6ZSBkaXNwYXRjaCB0YWJsZXMuIERldmljZSBMYXllcnMgYXJlIGFjdGl2YXRlZCBhdCB2a0NyZWF0ZURldmljZSB0aW1lLiBJbnN0YW5jZQorTGF5ZXJzIGFyZSBhY3RpdmF0ZWQgYXQgdmtDcmVhdGVJbnN0YW5jZSB0aW1lLiAgTGF5ZXJzIGNhbiBhbHNvIGJlIGFjdGl2YXRlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCisoVktfSU5TVEFOQ0VfTEFZRVJTIG9yIFZLX0RFVklDRV9MQVlFUlMpLgorCisjIyMgTGF5ZXIgbGlicmFyeSBleGFtcGxlIGNvZGUKKworTm90ZSB0aGF0IHNvbWUgbGF5ZXJzIGFyZSBjb2RlLWdlbmVyYXRlZCBhbmQgd2lsbCB0aGVyZWZvcmUgZXhpc3QgaW4gdGhlIGRpcmVjdG9yeSAoYnVpbGRfZGlyKS9sYXllcnMKKworLWluY2x1ZGUvdmtMYXllci5oICAtIGhlYWRlciBmaWxlIGZvciBsYXllciBjb2RlLgorCisjIyMgVGVtcGxhdGVzCitsYXllcnMvYmFzaWMuY3BwIChuYW1lPVZLX0xBWUVSX0xVTkFSR19iYXNpYykgc2ltcGxlIGV4YW1wbGUgd3JhcHBpbmcgYSBmZXcgZW50cnlwb2ludHMuIFNob3dzIGxheWVyIGZlYXR1cmVzOgorLSBNdWx0aXBsZSBkaXNwYXRjaCB0YWJsZXMgZm9yIHN1cHBvcnRpbmcgbXVsdGlwbGUgR1BVcy4KKy0gRXhhbXBsZSBsYXllciBleHRlbnNpb24gZnVuY3Rpb24gc2hvd24uCistIExheWVyIGV4dGVuc2lvbiBhZHZlcnRpc2VkIGJ5IHZrR2V0WFhYRXh0ZW5zaW9uKCkuCisKK2xheWVycy9tdWx0aS5jcHAgKG5hbWU9VktfTEFZRVJfTFVOQVJHX211bHRpMTpWS19MQVlFUl9MVU5BUkdfbXVsdGkyKSBzaW1wbGUgZXhhbXBsZSBzaG93aW5nIG11bHRpcGxlIGxheWVycyBwZXIgbGlicmFyeQorCisoYnVpbGQgZGlyKS9sYXllci9nZW5lcmljX2xheWVyLmNwcCAobmFtZT1WS19MQVlFUl9MVU5BUkdfZ2VuZXJpYykgLSBhdXRvIGdlbmVyYXRlZCBleGFtcGxlIHdyYXBwaW5nIGFsbCBWSyBlbnRyeXBvaW50cy4KKworIyMjIFByaW50IEFQSSBDYWxscyBhbmQgUGFyYW1ldGVyIFZhbHVlcworKGJ1aWxkIGRpcikvbGF5ZXJzL2FwaV9kdW1wLmNwcCAobmFtZT1WS19MQVlFUl9MVU5BUkdfYXBpX2R1bXApIC0gcHJpbnQgb3V0IEFQSSBjYWxscyBhbG9uZyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMKKworIyMgVXNpbmcgTGF5ZXJzCisKKzEuIEJ1aWxkIFZLIGxvYWRlciBhbmQgaTk2NSBpY2QgZHJpdmVyIHVzaW5nIG5vcm1hbCBzdGVwcyAoY21ha2UgYW5kIG1ha2UpCisyLiBQbGFjZSBsaWJWa0xheWVyXzxuYW1lPi5zbyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91ciBWSyB0ZXN0IG9yIGFwcDoKKworICAgIGNwIGJ1aWxkL2xheWVyL2xpYlZrTGF5ZXJfYmFzaWMuc28gYnVpbGQvbGF5ZXIvbGliVmtMYXllcl9nZW5lcmljLnNvIGJ1aWxkL3Rlc3RzCisKKyAgICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgTG9hZGVyIHRvIGJlIGFibGUgdG8gc2NhbiBhbmQgZW51bWVyYXRlIHlvdXIgbGlicmFyeS4KKyAgICBBbHRlcm5hdGl2ZWx5LCB1c2UgdGhlIFZLXF9MQVlFUlxfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBzcGVjaWZ5IHdoZXJlIHRoZSBsYXllciBsaWJyYXJpZXMgcmVzaWRlLgorCiszLiBDcmVhdGUgYSB2a19sYXllcl9zZXR0aW5ncy50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgdG8gc3BlY2lmeSBob3cgeW91ciBsYXllcnMgc2hvdWxkIGJlaGF2ZS4KKworICAgIE1vZGVsIGl0IGFmdGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTogIFsqdmtfbGF5ZXJfc2V0dGluZ3MudHh0Kl0odmtfbGF5ZXJfc2V0dGluZ3MudHh0KQorCis0LiBTcGVjaWZ5IHdoaWNoIExheWVycyB0byBhY3RpdmF0ZSBieSB1c2luZwordmtDcmVhdGVEZXZpY2UgYW5kL29yIHZrQ3JlYXRlSW5zdGFuY2Ugb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCisgICAgZXhwb3J0IFZLXF9JTlNUQU5DRVxfTEFZRVJTPVZLX0xBWUVSX0xVTkFSR19iYXNpYzpWS19MQVlFUl9MVU5BUkdfZ2VuZXJpYworICAgIGV4cG9ydCBWS1xfREVWSUNFXF9MQVlFUlM9VktfTEFZRVJfTFVOQVJHX2Jhc2ljOlZLX0xBWUVSX0xVTkFSR19nZW5lcmljCisgICAgY2QgYnVpbGQvdGVzdHM7IC4vdmtpbmZvCisKKyMjIFRpcHMgZm9yIHdyaXRpbmcgbmV3IGxheWVycworCisxLiBNdXN0IGltcGxlbWVudCB2a0dldEluc3RhbmNlUHJvY0FkZHIoKSAoYWthIEdJUEEpIGFuZCB2a0dldERldmljZVByb2NBZGRyKCkgKGFrYSBHRFBBKTsKKzIuIE11c3QgaGF2ZSBhIGxvY2FsIGRpc3BhdGNoIHRhYmxlIHRvIGNhbGwgbmV4dCBsYXllciAoc2VlIHZrX2xheWVyLmgpOworMy4gTXVzdCBoYXZlIGEgbGF5ZXIgbWFuaWZlc3QgZmlsZSBmb3IgZWFjaCBMYXllciBsaWJyYXJ5IGZvciBMb2FkZXIgdG8gZmluZCBsYXllciBwcm9wZXJ0aWVzIChzZWUgbG9hZGVyL1JFQURNRS5tZCkKKzQuIE5leHQgbGF5ZXJzIEdYUEEgY2FuIGJlIGZvdW5kIGluIHRoZSB3cmFwcGVkIGluc3RhbmNlIG9yIGRldmljZSBvYmplY3Q7Cis1LiBMb2FkZXIgY2FsbHMgYSBsYXllcidzIEdYUEEgZmlyc3Qgc28gaW5pdGlhbGl6YXRpb24gc2hvdWxkIG9jY3VyIGhlcmU7Cis2LiBhbGwgZW50cnlwb2ludHMgY2FuIGJlIHdyYXBwZWQgYnV0IG9ubHkgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgbGF5ZXIgaXMgYWN0aXZhdGVkCisgICAgdmlhIHRoZSBmaXJzdCB2a0NyZWF0RGV2aWNlIG9yIHZrQ3JlYXRlSW5zdGFuY2U7Cis3LiBlbnRyeXBvaW50IG5hbWVzIGNhbiBiZSBhbnkgbmFtZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGxheWVycyB2a0dldFhYWFhYUHJvY0FkZHIKKyAgICBpbXBsZW1lbnRhdGlvbjsgZXhjZXB0aW9ucyBhcmUgdmtHZXRYWFhYUHJvY0FkZHIsCisgICAgd2hpY2ggbXVzdCBoYXZlIHRoZSBjb3JyZWN0IG5hbWUgc2luY2UgdGhlIExvYWRlciBjYWxscyB0aGVzZSBlbnRyeXBvaW50czsKKzguIGVudHJ5cG9pbnQgbmFtZXMgbXVzdCBiZSBleHBvcnRlZCB0byB0aGUgT1NlcyBkeW5hbWljIGxvYWRlciB3aXRoIFZLXF9MQVlFUlxfRVhQT1JUOworOS4gTGF5ZXIgbmFtaW5nIGNvbnZlbnRpb24gaXMgY2FtZWwgY2FzZSBzYW1lIG5hbWUgYXMgaW4gbGlicmFyeTogbGliVmtMYXllcl88bmFtZT4uc28KKzEwLiBGb3IgbXVsdGlwbGUgbGF5ZXJzIGluIG9uZSBsaWJyYXJ5IHRoZSBtYW5pZmVzdCBmaWxlIGNhbiBzcGVjaWZ5IGVhY2ggbGF5ZXIuCisKKyMjIFN0YXR1cworCisKKyMjIyBDdXJyZW50IGtub3duIGlzc3VlcwpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvYXBpX2R1bXAuaCBiL2xheWVyc3Z0L2FwaV9kdW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwYjI4NwotLS0gL2Rldi9udWxsCisrKyBiL2xheWVyc3Z0L2FwaV9kdW1wLmgKQEAgLTAsMCArMSwzODYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBMZW5ueSBLb21vdyA8bGVubnlAbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2RlZmluZSBOT01JTk1BWAorCisjaW5jbHVkZSAidmtfbG9hZGVyX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfdGFibGUuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9leHRlbnNpb25fdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCitlbnVtIGNsYXNzIEFwaUR1bXBGb3JtYXQgeworICAgIFRleHQsCit9OworCitjbGFzcyBBcGlEdW1wU2V0dGluZ3MgeworICBwdWJsaWM6CisgICAgQXBpRHVtcFNldHRpbmdzKCkgeworICAgICAgICAvLyBHZXQgdGhlIG91dHB1dCBmaWxlIHNldHRpbmdzIGFuZCBjcmVhdGUgYSBzdHJlYW0gZm9yIGl0CisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVfb3B0aW9uID0gZ2V0TGF5ZXJPcHRpb24oImx1bmFyZ19hcGlfZHVtcC5maWxlIik7CisgICAgICAgIGlmIChmaWxlX29wdGlvbiAhPSBOVUxMICYmIHN0cmNtcChmaWxlX29wdGlvbiwgIlRSVUUiKSA9PSAwKSB7CisgICAgICAgICAgICB1c2VfY291dCA9IGZhbHNlOworICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWVfb3B0aW9uID0KKyAgICAgICAgICAgICAgICBnZXRMYXllck9wdGlvbigibHVuYXJnX2FwaV9kdW1wLmxvZ19maWxlbmFtZSIpOworICAgICAgICAgICAgaWYgKGZpbGVuYW1lX29wdGlvbiAhPSBOVUxMICYmIHN0cmNtcChmaWxlbmFtZV9vcHRpb24sICIiKSAhPSAwKQorICAgICAgICAgICAgICAgIG91dHB1dF9zdHJlYW0ub3BlbihmaWxlbmFtZV9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b2ZzdHJlYW06Om91dCB8IHN0ZDo6b3N0cmVhbTo6dHJ1bmMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG91dHB1dF9zdHJlYW0ub3BlbigidmtfYXBpZHVtcC50eHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9mc3RyZWFtOjpvdXQgfCBzdGQ6Om9zdHJlYW06OnRydW5jKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9jb3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IEFwaUR1bXBGb3JtYXQ6OlRleHQ7CisKKyAgICAgICAgLy8gR2V0IHRoZSByZW1haW5pbmcgc2V0dGluZ3MKKyAgICAgICAgc2hvd19wYXJhbXMgPSByZWFkQm9vbE9wdGlvbigibHVuYXJnX2FwaV9kdW1wLmRldGFpbGVkIiwgdHJ1ZSk7CisgICAgICAgIHNob3dfYWRkcmVzcyA9ICFyZWFkQm9vbE9wdGlvbigibHVuYXJnX2FwaV9kdW1wLm5vX2FkZHIiLCBmYWxzZSk7CisgICAgICAgIHNob3VsZF9mbHVzaCA9IHJlYWRCb29sT3B0aW9uKCJsdW5hcmdfYXBpX2R1bXAuZmx1c2giLCB0cnVlKTsKKyAgICAgICAgaW5kZW50X3NpemUgPQorICAgICAgICAgICAgc3RkOjptYXgocmVhZEludE9wdGlvbigibHVuYXJnX2FwaV9kdW1wLmluZGVudF9zaXplIiwgNCksIDApOworICAgICAgICBzaG93X3R5cGUgPSByZWFkQm9vbE9wdGlvbigibHVuYXJnX2FwaV9kdW1wLnNob3dfdHlwZXMiLCB0cnVlKTsKKyAgICAgICAgbmFtZV9zaXplID0gc3RkOjptYXgocmVhZEludE9wdGlvbigibHVuYXJnX2FwaV9kdW1wLm5hbWVfc2l6ZSIsIDMyKSwgMCk7CisgICAgICAgIHR5cGVfc2l6ZSA9IHN0ZDo6bWF4KHJlYWRJbnRPcHRpb24oImx1bmFyZ19hcGlfZHVtcC50eXBlX3NpemUiLCAwKSwgMCk7CisgICAgICAgIHVzZV9zcGFjZXMgPSByZWFkQm9vbE9wdGlvbigibHVuYXJnX2FwaV9kdW1wLnVzZV9zcGFjZXMiLCB0cnVlKTsKKyAgICAgICAgc2hvd19zaGFkZXIgPSByZWFkQm9vbE9wdGlvbigibHVuYXJnX2FwaV9kdW1wLnNob3dfc2hhZGVyIiwgZmFsc2UpOworICAgIH0KKworICAgIH5BcGlEdW1wU2V0dGluZ3MoKSB7CisgICAgICAgIGlmICghdXNlX2NvdXQpCisgICAgICAgICAgICBvdXRwdXRfc3RyZWFtLmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIGlubGluZSBBcGlEdW1wRm9ybWF0IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG91dHB1dF9mb3JtYXQ7IH0KKworICAgIHN0ZDo6b3N0cmVhbSAmZm9ybWF0TmFtZVR5cGUoc3RkOjpvc3RyZWFtICZzdHJlYW0sIGludCBpbmRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSkgY29uc3QgeworICAgICAgICBzdHJlYW0gPDwgaW5kZW50YXRpb24oaW5kZW50cykgPDwgbmFtZSA8PCAiOiAiOworCisgICAgICAgIGlmICh1c2Vfc3BhY2VzKQorICAgICAgICAgICAgc3RyZWFtIDw8IHNwYWNlcyhuYW1lX3NpemUgLSAoaW50KXN0cmxlbihuYW1lKSAtIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJlYW0gPDwgdGFicygobmFtZV9zaXplIC0gKGludClzdHJsZW4obmFtZSkgLSAzICsgaW5kZW50X3NpemUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF9zaXplKTsKKworICAgICAgICBpZiAoc2hvd190eXBlICYmIHVzZV9zcGFjZXMpCisgICAgICAgICAgICBzdHJlYW0gPDwgdHlwZSA8PCBzcGFjZXModHlwZV9zaXplIC0gKGludClzdHJsZW4odHlwZSkpOworICAgICAgICBlbHNlIGlmIChzaG93X3R5cGUgJiYgIXVzZV9zcGFjZXMpCisgICAgICAgICAgICBzdHJlYW0gPDwgdHlwZQorICAgICAgICAgICAgICAgICAgIDw8IHRhYnMoKHR5cGVfc2l6ZSAtIChpbnQpc3RybGVuKHR5cGUpIC0gMSArIGluZGVudF9zaXplKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfc2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIHN0cmVhbSA8PCAiID0gIjsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciAqaW5kZW50YXRpb24oaW50IGluZGVudHMpIGNvbnN0IHsKKyAgICAgICAgaWYgKHVzZV9zcGFjZXMpCisgICAgICAgICAgICByZXR1cm4gc3BhY2VzKGluZGVudHMgKiBpbmRlbnRfc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB0YWJzKGluZGVudHMpOworICAgIH0KKworICAgIGlubGluZSBib29sIHNob3VsZEZsdXNoKCkgY29uc3QgeyByZXR1cm4gc2hvdWxkX2ZsdXNoOyB9CisKKyAgICBpbmxpbmUgYm9vbCBzaG93QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIHNob3dfYWRkcmVzczsgfQorCisgICAgaW5saW5lIGJvb2wgc2hvd1BhcmFtcygpIGNvbnN0IHsgcmV0dXJuIHNob3dfcGFyYW1zOyB9CisgICAgCisgICAgaW5saW5lIGJvb2wgc2hvd1NoYWRlcigpIGNvbnN0IHsgcmV0dXJuIHNob3dfc2hhZGVyOyB9CisKKyAgICBpbmxpbmUgc3RkOjpvc3RyZWFtICZzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiB1c2VfY291dCA/IHN0ZDo6Y291dCA6ICooc3RkOjpvZnN0cmVhbSAqKSZvdXRwdXRfc3RyZWFtOworICAgIH0KKworICBwcml2YXRlOgorICAgIGlubGluZSBzdGF0aWMgYm9vbCByZWFkQm9vbE9wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgZGVmYXVsdF92YWx1ZSkgeworICAgICAgICBjb25zdCBjaGFyICpzdHJpbmdfb3B0aW9uID0gZ2V0TGF5ZXJPcHRpb24ob3B0aW9uKTsKKyAgICAgICAgaWYgKHN0cmluZ19vcHRpb24gIT0gTlVMTCAmJiBzdHJjbXAoc3RyaW5nX29wdGlvbiwgIlRSVUUiKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgaWYgKHN0cmluZ19vcHRpb24gIT0gTlVMTCAmJiBzdHJjbXAoc3RyaW5nX29wdGlvbiwgIkZBTFNFIikgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBpbnQgcmVhZEludE9wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGludCBkZWZhdWx0X3ZhbHVlKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ19vcHRpb24gPSBnZXRMYXllck9wdGlvbihvcHRpb24pOworICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgIGlmIChzc2NhbmYoc3RyaW5nX29wdGlvbiwgIiVkIiwgJnZhbHVlKSAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqc3BhY2VzKGludCBjb3VudCkgeworICAgICAgICByZXR1cm4gU1BBQ0VTICsgKE1BWF9TUEFDRVMgLSBzdGQ6Om1heChjb3VudCwgMCkpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqdGFicyhpbnQgY291bnQpIHsKKyAgICAgICAgcmV0dXJuIFRBQlMgKyAoTUFYX1RBQlMgLSBzdGQ6Om1heChjb3VudCwgMCkpOworICAgIH0KKworICAgIGJvb2wgdXNlX2NvdXQ7CisgICAgc3RkOjpvZnN0cmVhbSBvdXRwdXRfc3RyZWFtOworICAgIEFwaUR1bXBGb3JtYXQgb3V0cHV0X2Zvcm1hdDsKKyAgICBib29sIHNob3dfcGFyYW1zOworICAgIGJvb2wgc2hvd19hZGRyZXNzOworICAgIGJvb2wgc2hvdWxkX2ZsdXNoOworCisgICAgYm9vbCBzaG93X3R5cGU7CisgICAgaW50IGluZGVudF9zaXplOworICAgIGludCBuYW1lX3NpemU7CisgICAgaW50IHR5cGVfc2l6ZTsKKyAgICBib29sIHVzZV9zcGFjZXM7CisgICAgYm9vbCBzaG93X3NoYWRlcjsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBTUEFDRVM7CisgICAgc3RhdGljIGNvbnN0IGludCBNQVhfU1BBQ0VTID0gNzI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFRBQlM7CisgICAgc3RhdGljIGNvbnN0IGludCBNQVhfVEFCUyA9IDE4OworfTsKKworY29uc3QgY2hhciAqY29uc3QgQXBpRHVtcFNldHRpbmdzOjpTUEFDRVMgPQorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworY29uc3QgY2hhciAqY29uc3QgQXBpRHVtcFNldHRpbmdzOjpUQUJTID0KKyAgICAiXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IjsKKworY2xhc3MgQXBpRHVtcEluc3RhbmNlIHsKKyAgcHVibGljOgorICAgIGlubGluZSBBcGlEdW1wSW5zdGFuY2UoKQorICAgICAgICA6IGR1bXBfc2V0dGluZ3MoTlVMTCksIGZyYW1lX2NvdW50KDApLCB0aHJlYWRfY291bnQoMCkgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZV9tdXRleCgmb3V0cHV0X211dGV4KTsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jcmVhdGVfbXV0ZXgoJmZyYW1lX211dGV4KTsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jcmVhdGVfbXV0ZXgoJnRocmVhZF9tdXRleCk7CisgICAgfQorCisgICAgaW5saW5lIH5BcGlEdW1wSW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChkdW1wX3NldHRpbmdzICE9IE5VTEwpCisgICAgICAgICAgICBkZWxldGUgZHVtcF9zZXR0aW5nczsKKyAgICAgICAgCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfZGVsZXRlX211dGV4KCZ0aHJlYWRfbXV0ZXgpOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2RlbGV0ZV9tdXRleCgmZnJhbWVfbXV0ZXgpOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2RlbGV0ZV9tdXRleCgmb3V0cHV0X211dGV4KTsKKyAgICB9CisKKyAgICBpbmxpbmUgdWludDY0X3QgZnJhbWVDb3VudCgpIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZmcmFtZV9tdXRleCk7CisgICAgICAgIHVpbnQ2NF90IGNvdW50ID0gZnJhbWVfY291bnQ7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZmcmFtZV9tdXRleCk7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBuZXh0RnJhbWUoKSB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmZnJhbWVfbXV0ZXgpOworICAgICAgICArK2ZyYW1lX2NvdW50OworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmZnJhbWVfbXV0ZXgpOworICAgIH0KKworICAgIGlubGluZSBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4ICpvdXRwdXRNdXRleCgpIHsgcmV0dXJuICZvdXRwdXRfbXV0ZXg7IH0KKworICAgIGlubGluZSBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJnNldHRpbmdzKCkgeworICAgICAgICBpZiAoZHVtcF9zZXR0aW5ncyA9PSBOVUxMKQorICAgICAgICAgICAgZHVtcF9zZXR0aW5ncyA9IG5ldyBBcGlEdW1wU2V0dGluZ3MoKTsKKworICAgICAgICByZXR1cm4gKmR1bXBfc2V0dGluZ3M7CisgICAgfQorCisgICAgdWludDMyX3QgdGhyZWFkSUQoKSB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfaWQgaWQgPSBsb2FkZXJfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJnRocmVhZF9tdXRleCk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0aHJlYWRfY291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHRocmVhZF9tYXBbaV0gPT0gaWQpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmdGhyZWFkX211dGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IG5ld19pbmRleCA9IHRocmVhZF9jb3VudDsKKyAgICAgICAgdGhyZWFkX21hcFt0aHJlYWRfY291bnQrK10gPSBpZDsKKyAgICAgICAgYXNzZXJ0KHRocmVhZF9jb3VudCA8IE1BWF9USFJFQURTKTsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJnRocmVhZF9tdXRleCk7CisgICAgICAgIHJldHVybiBuZXdfaW5kZXg7CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBBcGlEdW1wSW5zdGFuY2UgJmN1cnJlbnQoKSB7IHJldHVybiBjdXJyZW50X2luc3RhbmNlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgQXBpRHVtcEluc3RhbmNlIGN1cnJlbnRfaW5zdGFuY2U7CisKKyAgICBBcGlEdW1wU2V0dGluZ3MgKmR1bXBfc2V0dGluZ3M7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCBvdXRwdXRfbXV0ZXg7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCBmcmFtZV9tdXRleDsKKyAgICB1aW50NjRfdCBmcmFtZV9jb3VudDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX1RIUkVBRFMgPSA1MTM7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCB0aHJlYWRfbXV0ZXg7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZCB0aHJlYWRfbWFwW01BWF9USFJFQURTXTsKKyAgICB1aW50MzJfdCB0aHJlYWRfY291bnQ7Cit9OworCitBcGlEdW1wSW5zdGFuY2UgQXBpRHVtcEluc3RhbmNlOjpjdXJyZW50X2luc3RhbmNlOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUZXh0IEJhY2tlbmQgSGVscGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHZvaWQKK2R1bXBfdGV4dF9hcnJheShjb25zdCBUICphcnJheSwgc2l6ZV90IGxlbiwgY29uc3QgQXBpRHVtcFNldHRpbmdzICZzZXR0aW5ncywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlX3N0cmluZywgY29uc3QgY2hhciAqY2hpbGRfdHlwZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW5kZW50cywKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0gJigqZHVtcCkoY29uc3QgVCwgY29uc3QgQXBpRHVtcFNldHRpbmdzICYsIGludCkpIHsKKyAgICBzZXR0aW5ncy5mb3JtYXROYW1lVHlwZShzZXR0aW5ncy5zdHJlYW0oKSwgaW5kZW50cywgbmFtZSwgdHlwZV9zdHJpbmcpOworICAgIGlmIChhcnJheSA9PSBOVUxMKSB7CisgICAgICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8ICJOVUxMXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzZXR0aW5ncy5zaG93QWRkcmVzcygpKQorICAgICAgICBzZXR0aW5ncy5zdHJlYW0oKSA8PCAodm9pZCAqKWFycmF5IDw8ICJcbiI7CisgICAgZWxzZQorICAgICAgICBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiYWRkcmVzc1xuIjsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuICYmIGFycmF5ICE9IE5VTEw7ICsraSkgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgICAgIHN0cmVhbSA8PCBuYW1lIDw8ICdbJyA8PCBpIDw8ICddJzsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXhOYW1lID0gc3RyZWFtLnN0cigpOworICAgICAgICBkdW1wX3RleHRfdmFsdWUoYXJyYXlbaV0sIHNldHRpbmdzLCBjaGlsZF90eXBlLCBpbmRleE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudHMgKyAxLCBkdW1wKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHZvaWQgZHVtcF90ZXh0X2FycmF5KAorICAgIGNvbnN0IFQgKmFycmF5LCBzaXplX3QgbGVuLCBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJnNldHRpbmdzLAorICAgIGNvbnN0IGNoYXIgKnR5cGVfc3RyaW5nLCBjb25zdCBjaGFyICpjaGlsZF90eXBlLCBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpbmRlbnRzLAorICAgIHN0ZDo6b3N0cmVhbSAmKCpkdW1wKShjb25zdCBUICYsIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyAmLCBpbnQpKSB7CisgICAgc2V0dGluZ3MuZm9ybWF0TmFtZVR5cGUoc2V0dGluZ3Muc3RyZWFtKCksIGluZGVudHMsIG5hbWUsIHR5cGVfc3RyaW5nKTsKKyAgICBpZiAoYXJyYXkgPT0gTlVMTCkgeworICAgICAgICBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiTlVMTFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc2V0dGluZ3Muc2hvd0FkZHJlc3MoKSkKKyAgICAgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgKHZvaWQgKilhcnJheSA8PCAiXG4iOworICAgIGVsc2UKKyAgICAgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgImFkZHJlc3NcbiI7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbiAmJiBhcnJheSAhPSBOVUxMOyArK2kpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICAgICAgICBzdHJlYW0gPDwgbmFtZSA8PCAnWycgPDwgaSA8PCAnXSc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TmFtZSA9IHN0cmVhbS5zdHIoKTsKKyAgICAgICAgZHVtcF90ZXh0X3ZhbHVlKGFycmF5W2ldLCBzZXR0aW5ncywgY2hpbGRfdHlwZSwgaW5kZXhOYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRzICsgMSwgZHVtcCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lkIGR1bXBfdGV4dF9wb2ludGVyKAorICAgIGNvbnN0IFQgKnBvaW50ZXIsIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyAmc2V0dGluZ3MsIGNvbnN0IGNoYXIgKnR5cGVfc3RyaW5nLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpbmRlbnRzLAorICAgIHN0ZDo6b3N0cmVhbSAmKCpkdW1wKShjb25zdCBULCBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJiwgaW50KSkgeworICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKKyAgICAgICAgc2V0dGluZ3MuZm9ybWF0TmFtZVR5cGUoc2V0dGluZ3Muc3RyZWFtKCksIGluZGVudHMsIG5hbWUsIHR5cGVfc3RyaW5nKTsKKyAgICAgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgIk5VTExcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHVtcF90ZXh0X3ZhbHVlKCpwb2ludGVyLCBzZXR0aW5ncywgdHlwZV9zdHJpbmcsIG5hbWUsIGluZGVudHMsIGR1bXApOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBkdW1wX3RleHRfcG9pbnRlcigKKyAgICBjb25zdCBUICpwb2ludGVyLCBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJnNldHRpbmdzLCBjb25zdCBjaGFyICp0eXBlX3N0cmluZywKKyAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW5kZW50cywKKyAgICBzdGQ6Om9zdHJlYW0gJigqZHVtcCkoY29uc3QgVCAmLCBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJiwgaW50KSkgeworICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKKyAgICAgICAgc2V0dGluZ3MuZm9ybWF0TmFtZVR5cGUoc2V0dGluZ3Muc3RyZWFtKCksIGluZGVudHMsIG5hbWUsIHR5cGVfc3RyaW5nKTsKKyAgICAgICAgc2V0dGluZ3Muc3RyZWFtKCkgPDwgIk5VTExcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHVtcF90ZXh0X3ZhbHVlKCpwb2ludGVyLCBzZXR0aW5ncywgdHlwZV9zdHJpbmcsIG5hbWUsIGluZGVudHMsIGR1bXApOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZAorZHVtcF90ZXh0X3ZhbHVlKGNvbnN0IFQgb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJnNldHRpbmdzLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGVfc3RyaW5nLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW5kZW50cywKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0gJigqZHVtcCkoY29uc3QgVCwgY29uc3QgQXBpRHVtcFNldHRpbmdzICYsIGludCkpIHsKKyAgICBzZXR0aW5ncy5mb3JtYXROYW1lVHlwZShzZXR0aW5ncy5zdHJlYW0oKSwgaW5kZW50cywgbmFtZSwgdHlwZV9zdHJpbmcpOworICAgIGR1bXAob2JqZWN0LCBzZXR0aW5ncywgaW5kZW50cykgPDwgIlxuIjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBkdW1wX3RleHRfdmFsdWUoCisgICAgY29uc3QgVCAmb2JqZWN0LCBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJnNldHRpbmdzLCBjb25zdCBjaGFyICp0eXBlX3N0cmluZywKKyAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW5kZW50cywKKyAgICBzdGQ6Om9zdHJlYW0gJigqZHVtcCkoY29uc3QgVCAmLCBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJiwgaW50KSkgeworICAgIHNldHRpbmdzLmZvcm1hdE5hbWVUeXBlKHNldHRpbmdzLnN0cmVhbSgpLCBpbmRlbnRzLCBuYW1lLCB0eXBlX3N0cmluZyk7CisgICAgZHVtcChvYmplY3QsIHNldHRpbmdzLCBpbmRlbnRzKTsKK30KKworaW5saW5lIHZvaWQgZHVtcF90ZXh0X3NwZWNpYWwoCisgICAgY29uc3QgY2hhciAqdGV4dCwgY29uc3QgQXBpRHVtcFNldHRpbmdzICZzZXR0aW5ncywgY29uc3QgY2hhciAqdHlwZV9zdHJpbmcsCisgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGluZGVudHMpIHsKKyAgICBzZXR0aW5ncy5mb3JtYXROYW1lVHlwZShzZXR0aW5ncy5zdHJlYW0oKSwgaW5kZW50cywgbmFtZSwgdHlwZV9zdHJpbmcpOworICAgIHNldHRpbmdzLnN0cmVhbSgpIDw8IHRleHQgPDwgIlxuIjsKK30KKworaW5saW5lIGJvb2wgZHVtcF90ZXh0X2JpdG1hc2tPcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSAmc3RyZWFtLCBib29sIGlzRmlyc3QpIHsKKyAgICBpZiAoaXNGaXJzdCkKKyAgICAgICAgc3RyZWFtIDw8ICIgKCI7CisgICAgZWxzZQorICAgICAgICBzdHJlYW0gPDwgIiB8ICI7CisgICAgc3RyZWFtIDw8IG9wdGlvbjsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBzdGQ6Om9zdHJlYW0gJmR1bXBfdGV4dF9jc3RyaW5nKGNvbnN0IGNoYXIgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFwaUR1bXBTZXR0aW5ncyAmc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50cykgeworICAgIGlmIChvYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpIDw8ICJOVUxMIjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiXCIiIDw8IG9iamVjdCA8PCAiXCIiOworfQorCitpbmxpbmUgc3RkOjpvc3RyZWFtICZkdW1wX3RleHRfdm9pZChjb25zdCB2b2lkICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcGlEdW1wU2V0dGluZ3MgJnNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudHMpIHsKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiTlVMTCI7CisgICAgZWxzZSBpZiAoc2V0dGluZ3Muc2hvd0FkZHJlc3MoKSkKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzLnN0cmVhbSgpIDw8IG9iamVjdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzZXR0aW5ncy5zdHJlYW0oKSA8PCAiYWRkcmVzcyI7Cit9CmRpZmYgLS1naXQgYS9sYXllcnN2dC9iYXNpYy5jcHAgYi9sYXllcnN2dC9iYXNpYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmYjc3NAotLS0gL2Rldi9udWxsCisrKyBiL2xheWVyc3Z0L2Jhc2ljLmNwcApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKyNpbmNsdWRlICJ2a19sYXllcl90YWJsZS5oIgorCitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPGRpc3BhdGNoX2tleSwgVmtJbnN0YW5jZT4gYmFzaWNfaW5zdGFuY2VfbWFwOworCit0eXBlZGVmIFZrUmVzdWx0KFZLQVBJX1BUUiAqUEZOX3ZrTGF5ZXJCYXNpY0VYVCkoVmtEZXZpY2UgZGV2aWNlKTsKK3N0YXRpYyBQRk5fdmtMYXllckJhc2ljRVhUIHBmbl9sYXllcl9leHRlbnNpb247CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBiYXNpY19MYXllckJhc2ljRVhUKFZrRGV2aWNlIGRldmljZSkgeworICAgIHByaW50ZigiSW4gdmtMYXllckJhc2ljRVhUKCkgY2FsbCB3LyBkZXZpY2U6ICVwXG4iLCAodm9pZCAqKWRldmljZSk7CisgICAgaWYgKHBmbl9sYXllcl9leHRlbnNpb24pIHsKKyAgICAgICAgcHJpbnRmKCJJbiB2a0xheWVyQmFzaWNFWFQoKSBjYWxsIGRvd24gY2hhaW5cbiIpOworICAgICAgICByZXR1cm4gcGZuX2xheWVyX2V4dGVuc2lvbihkZXZpY2UpOworICAgIH0KKyAgICBwcmludGYoInZrTGF5ZXJCYXNpY0VYVCByZXR1cm5pbmcgU1VDQ0VTU1xuIik7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorYmFzaWNfQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrSW5zdGFuY2UgKnBJbnN0YW5jZSkgeworICAgIFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmNoYWluX2luZm8gPSBnZXRfY2hhaW5faW5mbyhwQ3JlYXRlSW5mbywgVktfTEFZRVJfTElOS19JTkZPKTsKKworICAgIGFzc2VydChjaGFpbl9pbmZvLT51LnBMYXllckluZm8pOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBHZXRJbnN0YW5jZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcENyZWF0ZUluc3RhbmNlID0gKFBGTl92a0NyZWF0ZUluc3RhbmNlKWZwR2V0SW5zdGFuY2VQcm9jQWRkcihOVUxMLCAidmtDcmVhdGVJbnN0YW5jZSIpOworICAgIGlmIChmcENyZWF0ZUluc3RhbmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlSW5zdGFuY2UocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgYmFzaWNfaW5zdGFuY2VfbWFwW2dldF9kaXNwYXRjaF9rZXkoKnBJbnN0YW5jZSldID0gKnBJbnN0YW5jZTsKKyAgICBpbml0SW5zdGFuY2VUYWJsZSgqcEluc3RhbmNlLCBmcEdldEluc3RhbmNlUHJvY0FkZHIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCitiYXNpY19FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoVmtJbnN0YW5jZSBpbnN0YW5jZSwgdWludDMyX3QgKnBQaHlzaWNhbERldmljZUNvdW50LCBWa1BoeXNpY2FsRGV2aWNlICpwUGh5c2ljYWxEZXZpY2VzKSB7CisgICAgcHJpbnRmKCJBdCBzdGFydCBvZiB3cmFwcGVkIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCkgY2FsbCB3LyBpbnN0OiAlcFxuIiwgKHZvaWQgKilpbnN0YW5jZSk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoaW5zdGFuY2UpLT5FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUNvdW50LCBwUGh5c2ljYWxEZXZpY2VzKTsKKyAgICBwcmludGYoIkNvbXBsZXRlZCB3cmFwcGVkIHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKCkgY2FsbCB3LyBjb3VudCAldVxuIiwgKnBQaHlzaWNhbERldmljZUNvdW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgYmFzaWNfQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UpIHsKKyAgICBwcmludGYoIlZLX0xBWUVSX0xVTkFSR19CYXNpYzogQXQgc3RhcnQgb2YgdmtDcmVhdGVEZXZpY2UoKSBjYWxsIHcvIGdwdTogJXBcbiIsICh2b2lkICopcGh5c2ljYWxEZXZpY2UpOworCisgICAgVmtMYXllckRldmljZUNyZWF0ZUluZm8gKmNoYWluX2luZm8gPSBnZXRfY2hhaW5faW5mbyhwQ3JlYXRlSW5mbywgVktfTEFZRVJfTElOS19JTkZPKTsKKworICAgIGFzc2VydChjaGFpbl9pbmZvLT51LnBMYXllckluZm8pOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBHZXRJbnN0YW5jZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtHZXREZXZpY2VQcm9jQWRkciBmcEdldERldmljZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0RGV2aWNlUHJvY0FkZHI7CisgICAgVmtJbnN0YW5jZSBpbnN0YW5jZSA9IGJhc2ljX2luc3RhbmNlX21hcFtnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKV07CisgICAgUEZOX3ZrQ3JlYXRlRGV2aWNlIGZwQ3JlYXRlRGV2aWNlID0gKFBGTl92a0NyZWF0ZURldmljZSlmcEdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsICJ2a0NyZWF0ZURldmljZSIpOworICAgIGlmIChmcENyZWF0ZURldmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gQWR2YW5jZSB0aGUgbGluayBpbmZvIGZvciB0aGUgbmV4dCBlbGVtZW50IG9uIHRoZSBjaGFpbgorICAgIGNoYWluX2luZm8tPnUucExheWVySW5mbyA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cE5leHQ7CisKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBmcENyZWF0ZURldmljZShwaHlzaWNhbERldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGluaXREZXZpY2VUYWJsZSgqcERldmljZSwgZnBHZXREZXZpY2VQcm9jQWRkcik7CisKKyAgICBwZm5fbGF5ZXJfZXh0ZW5zaW9uID0gKFBGTl92a0xheWVyQmFzaWNFWFQpZnBHZXREZXZpY2VQcm9jQWRkcigqcERldmljZSwgInZrTGF5ZXJCYXNpY0VYVCIpOworICAgIHByaW50ZigiVktfTEFZRVJfTFVOQVJHX0Jhc2ljOiBDb21wbGV0ZWQgdmtDcmVhdGVEZXZpY2UoKSBjYWxsIHcvIHBEZXZpY2UsIERldmljZSAlcDogJXBcbiIsICh2b2lkICopcERldmljZSwgKHZvaWQgKikqcERldmljZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogaG9vayBEZXN0cm95RGV2aWNlIHRvIHJlbW92ZSB0YWJsZU1hcCBlbnRyeSAqLworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgYmFzaWNfRGVzdHJveURldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSk7CisgICAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkRlc3Ryb3lEZXZpY2UoZGV2aWNlLCBwQWxsb2NhdG9yKTsKKyAgICBkZXN0cm95X2RldmljZV9kaXNwYXRjaF90YWJsZShrZXkpOworfQorCisvKiBob29rIERlc3Ryb3lJbnN0YW5jZSB0byByZW1vdmUgdGFibGVJbnN0YW5jZU1hcCBlbnRyeSAqLworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgYmFzaWNfRGVzdHJveUluc3RhbmNlKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKTsKKyAgICBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZShpbnN0YW5jZSktPkRlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgcEFsbG9jYXRvcik7CisgICAgZGVzdHJveV9pbnN0YW5jZV9kaXNwYXRjaF90YWJsZShrZXkpOworICAgIGJhc2ljX2luc3RhbmNlX21hcC5lcmFzZShrZXkpOworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTAorYmFzaWNfR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgZ3B1LCBWa0Zvcm1hdCBmb3JtYXQsIFZrRm9ybWF0UHJvcGVydGllcyAqcEZvcm1hdEluZm8pIHsKKyAgICBwcmludGYoIkF0IHN0YXJ0IG9mIHdyYXBwZWQgdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoKSBjYWxsIHcvIGdwdTogJXBcbiIsICh2b2lkICopZ3B1KTsKKyAgICBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZShncHUpLT5HZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMoZ3B1LCBmb3JtYXQsIHBGb3JtYXRJbmZvKTsKKyAgICBwcmludGYoIkNvbXBsZXRlZCB3cmFwcGVkIHZrR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzKCkgY2FsbCB3LyBncHU6ICVwXG4iLCAodm9pZCAqKWdwdSk7Cit9CisKK3N0YXRpYyBjb25zdCBWa0xheWVyUHJvcGVydGllcyBiYXNpY19MYXllclByb3BzID0geworICAgICJWS19MQVlFUl9MVU5BUkdfYmFzaWMiLAorICAgIFZLX01BS0VfVkVSU0lPTigxLCAwLCBWS19IRUFERVJfVkVSU0lPTiksIC8vIHNwZWNWZXJzaW9uCisgICAgMSwgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uVmVyc2lvbgorICAgICJMdW5hckcgU2FtcGxlIExheWVyIiwKK307CisKK3N0YXRpYyBjb25zdCBWa0V4dGVuc2lvblByb3BlcnRpZXMgYmFzaWNfcGh5c2ljYWxkZXZpY2VfZXh0ZW5zaW9uc1tdID0ge3sKKyAgICAidmtMYXllckJhc2ljRVhUIiwgMSwKK319OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVmtSZXN1bHQgRW51bWVyYXRlUHJvcGVydGllcyh1aW50MzJfdCBzcmNfY291bnQsIGNvbnN0IFQgKnNyY19wcm9wcywgdWludDMyX3QgKmRzdF9jb3VudCwgVCAqZHN0X3Byb3BzKSB7CisgICAgaWYgKCFkc3RfcHJvcHMgfHwgIXNyY19wcm9wcykgeworICAgICAgICAqZHN0X2NvdW50ID0gc3JjX2NvdW50OworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3B5X2NvdW50ID0gKCpkc3RfY291bnQgPCBzcmNfY291bnQpID8gKmRzdF9jb3VudCA6IHNyY19jb3VudDsKKyAgICBtZW1jcHkoZHN0X3Byb3BzLCBzcmNfcHJvcHMsIHNpemVvZihUKSAqIGNvcHlfY291bnQpOworICAgICpkc3RfY291bnQgPSBjb3B5X2NvdW50OworCisgICAgcmV0dXJuIChjb3B5X2NvdW50ID09IHNyY19jb3VudCkgPyBWS19TVUNDRVNTIDogVktfSU5DT01QTEVURTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCitiYXNpY19FbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gRW51bWVyYXRlUHJvcGVydGllcygxLCAmYmFzaWNfTGF5ZXJQcm9wcywgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorYmFzaWNfRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwQ291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKDEsICZiYXNpY19MYXllclByb3BzLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCitiYXNpY19FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIGlmIChwTGF5ZXJOYW1lICYmICFzdHJjbXAocExheWVyTmFtZSwgYmFzaWNfTGF5ZXJQcm9wcy5sYXllck5hbWUpKQorICAgICAgICByZXR1cm4gRW51bWVyYXRlUHJvcGVydGllczxWa0V4dGVuc2lvblByb3BlcnRpZXM+KDAsIE5VTEwsIHBDb3VudCwgcFByb3BlcnRpZXMpOworCisgICAgcmV0dXJuIFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgYmFzaWNfRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICBpZiAocExheWVyTmFtZSAmJiAhc3RyY21wKHBMYXllck5hbWUsIGJhc2ljX0xheWVyUHJvcHMubGF5ZXJOYW1lKSkgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IHNpemVvZihiYXNpY19waHlzaWNhbGRldmljZV9leHRlbnNpb25zKSAvCisgICAgICAgICAgICBzaXplb2YoYmFzaWNfcGh5c2ljYWxkZXZpY2VfZXh0ZW5zaW9uc1swXSk7CisgICAgICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKGNvdW50LCBiYXNpY19waHlzaWNhbGRldmljZV9leHRlbnNpb25zLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUocGh5c2ljYWxEZXZpY2UpCisgICAgICAgIC0+RW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhwaHlzaWNhbERldmljZSwgcExheWVyTmFtZSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgYmFzaWNfR2V0RGV2aWNlUHJvY0FkZHIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBjaGFyICpwTmFtZSkgeworICAgIGlmICghc3RyY21wKCJ2a0dldERldmljZVByb2NBZGRyIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiliYXNpY19HZXREZXZpY2VQcm9jQWRkcjsKKyAgICBpZiAoIXN0cmNtcCgidmtEZXN0cm95RGV2aWNlIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiliYXNpY19EZXN0cm95RGV2aWNlOworICAgIGlmICghc3RyY21wKCJ2a0xheWVyQmFzaWNFWFQiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKWJhc2ljX0xheWVyQmFzaWNFWFQ7CisKKyAgICBpZiAoZGV2aWNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpLT5HZXREZXZpY2VQcm9jQWRkciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSktPkdldERldmljZVByb2NBZGRyKGRldmljZSwgcE5hbWUpOworfQorCitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIGJhc2ljX0dldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqcE5hbWUpIHsKKyAgICBpZiAoIXN0cmNtcCgidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pYmFzaWNfRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiliYXNpY19FbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiliYXNpY19FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pYmFzaWNfRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRJbnN0YW5jZVByb2NBZGRyIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiliYXNpY19HZXRJbnN0YW5jZVByb2NBZGRyOworICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pYmFzaWNfR2V0UGh5c2ljYWxEZXZpY2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZUluc3RhbmNlIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiliYXNpY19DcmVhdGVJbnN0YW5jZTsKKyAgICBpZiAoIXN0cmNtcCgidmtEZXN0cm95SW5zdGFuY2UiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKWJhc2ljX0Rlc3Ryb3lJbnN0YW5jZTsKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVEZXZpY2UiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKWJhc2ljX0NyZWF0ZURldmljZTsKKyAgICBpZiAoIXN0cmNtcCgidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKWJhc2ljX0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlczsKKworICAgIGFzc2VydChpbnN0YW5jZSk7CisKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gcHJvYyA9IGJhc2ljX0dldERldmljZVByb2NBZGRyKFZLX05VTExfSEFORExFLCBwTmFtZSk7CisgICAgaWYgKHByb2MpCisgICAgICAgIHJldHVybiBwcm9jOworCisgICAgaWYgKGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlKS0+R2V0SW5zdGFuY2VQcm9jQWRkciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoaW5zdGFuY2UpLT5HZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCBwTmFtZSk7Cit9CisKKy8vIGxvYWRlci1sYXllciBpbnRlcmZhY2UgdjAsIGp1c3Qgd3JhcHBlcnMgc2luY2UgdGhlcmUgaXMgb25seSBhIGxheWVyCisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXModWludDMyX3QgKnBDb3VudCwgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIGJhc2ljX0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCit2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcENvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICAvLyB0aGUgbGF5ZXIgY29tbWFuZCBoYW5kbGVzIFZLX05VTExfSEFORExFIGp1c3QgZmluZSBpbnRlcm5hbGx5CisgICAgYXNzZXJ0KHBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKTsKKyAgICByZXR1cm4gYmFzaWNfRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZLX05VTExfSEFORExFLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAordmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiBiYXNpY19FbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMocExheWVyTmFtZSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIC8vIHRoZSBsYXllciBjb21tYW5kIGhhbmRsZXMgVktfTlVMTF9IQU5ETEUganVzdCBmaW5lIGludGVybmFsbHkKKyAgICBhc3NlcnQocGh5c2ljYWxEZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpOworICAgIHJldHVybiBiYXNpY19FbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKFZLX05VTExfSEFORExFLCBwTGF5ZXJOYW1lLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXYsIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKSB7CisgICAgcmV0dXJuIGJhc2ljX0dldERldmljZVByb2NBZGRyKGRldiwgZnVuY05hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gYmFzaWNfR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvZ2VuZXJpYy5oIGIvbGF5ZXJzdnQvZ2VuZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTRmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9sYXllcnN2dC9nZW5lcmljLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBHRU5FUklDX0gKKyNkZWZpbmUgR0VORVJJQ19ICisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGdlbmVyYXRlZCBsYXllciBnZW5lcmljCisgKi8KKworLy8gVGhlIGZvbGxvd2luZyBpcyBmb3IgbG9nZ2luZyBlcnJvciBtZXNzYWdlczoKK3N0cnVjdCBsYXllcl9kYXRhIHsKKyAgICBkZWJ1Z19yZXBvcnRfZGF0YSAqcmVwb3J0X2RhdGE7CisgICAgc3RkOjp2ZWN0b3I8VmtEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUPiBsb2dnaW5nX2NhbGxiYWNrOworCisgICAgbGF5ZXJfZGF0YSgpIDogcmVwb3J0X2RhdGEobnVsbHB0ciksIGxvZ2dpbmdfY2FsbGJhY2soVktfTlVMTF9IQU5ETEUpe307Cit9OworCitzdGF0aWMgY29uc3QgVmtMYXllclByb3BlcnRpZXMgZ2xvYmFsTGF5ZXJQcm9wc1tdID0ge3sKKyAgICAiVktfTEFZRVJfTFVOQVJHX2dlbmVyaWMiLAorICAgIFZLX01BS0VfVkVSU0lPTigxLCAwLCBWS19IRUFERVJfVkVSU0lPTiksIC8vIHNwZWNWZXJzaW9uCisgICAgMSwgImxheWVyOiBnZW5lcmljIiwKK319OworCitzdGF0aWMgY29uc3QgVmtMYXllclByb3BlcnRpZXMgZGV2aWNlTGF5ZXJQcm9wc1tdID0ge3sKKyAgICAiVktfTEFZRVJfTFVOQVJHX2dlbmVyaWMiLAorICAgIFZLX01BS0VfVkVSU0lPTigxLCAwLCBWS19IRUFERVJfVkVSU0lPTiksIC8vIHNwZWNWZXJzaW9uCisgICAgMSwgImxheWVyOiBnZW5lcmljIiwKK319OworCitzdHJ1Y3QgZGV2RXh0cyB7CisgICAgYm9vbCB3c2lfZW5hYmxlZDsKK307CitzdHJ1Y3QgaW5zdEV4dHMgeworICAgIGJvb2wgd3NpX2VuYWJsZWQ7Cit9Oworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIHN0cnVjdCBkZXZFeHRzPiBkZXZpY2VFeHRNYXA7CitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiwgc3RydWN0IGluc3RFeHRzPiBpbnN0YW5jZUV4dE1hcDsKKworc3RhdGljIHZvaWQgY3JlYXRlRGV2aWNlUmVnaXN0ZXJFeHRlbnNpb25zKGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIFZrRGV2aWNlIGRldmljZSkgeworICAgIHVpbnQzMl90IGk7CisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnBEaXNwID0gZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSk7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ3BhID0gcERpc3AtPkdldERldmljZVByb2NBZGRyOworICAgIHBEaXNwLT5DcmVhdGVTd2FwY2hhaW5LSFIgPSAoUEZOX3ZrQ3JlYXRlU3dhcGNoYWluS0hSKWdwYShkZXZpY2UsICJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIpOworICAgIHBEaXNwLT5EZXN0cm95U3dhcGNoYWluS0hSID0gKFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIpZ3BhKGRldmljZSwgInZrRGVzdHJveVN3YXBjaGFpbktIUiIpOworICAgIHBEaXNwLT5HZXRTd2FwY2hhaW5JbWFnZXNLSFIgPSAoUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKWdwYShkZXZpY2UsICJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIpOworICAgIHBEaXNwLT5BY3F1aXJlTmV4dEltYWdlS0hSID0gKFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIpZ3BhKGRldmljZSwgInZrQWNxdWlyZU5leHRJbWFnZUtIUiIpOworICAgIHBEaXNwLT5RdWV1ZVByZXNlbnRLSFIgPSAoUEZOX3ZrUXVldWVQcmVzZW50S0hSKWdwYShkZXZpY2UsICJ2a1F1ZXVlUHJlc2VudEtIUiIpOworCisgICAgZGV2aWNlRXh0TWFwW3BEaXNwXS53c2lfZW5hYmxlZCA9IGZhbHNlOworICAgIGZvciAoaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpID09IDApCisgICAgICAgICAgICBkZXZpY2VFeHRNYXBbcERpc3BdLndzaV9lbmFibGVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZUluc3RhbmNlUmVnaXN0ZXJFeHRlbnNpb25zKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywgVmtJbnN0YW5jZSBpbnN0YW5jZSkgeworICAgIHVpbnQzMl90IGk7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZShpbnN0YW5jZSk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEgPSBwRGlzcC0+R2V0SW5zdGFuY2VQcm9jQWRkcjsKKworICAgIHBEaXNwLT5EZXN0cm95U3VyZmFjZUtIUiA9IChQRk5fdmtEZXN0cm95U3VyZmFjZUtIUilncGEoaW5zdGFuY2UsICJ2a0Rlc3Ryb3lTdXJmYWNlS0hSIik7CisgICAgcERpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUilncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIiKTsKKyAgICBwRGlzcC0+R2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUilncGEoaW5zdGFuY2UsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIpOworICAgIHBEaXNwLT5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSID0KKyAgICAgICAgKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIpZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIik7CisgICAgcERpc3AtPkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9CisgICAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIpZ3BhKGluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiKTsKKyAgICBpbnN0YW5jZUV4dE1hcFtwRGlzcF0ud3NpX2VuYWJsZWQgPSBmYWxzZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLCBWS19LSFJfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSkgPT0gMCkKKyAgICAgICAgICAgIGluc3RhbmNlRXh0TWFwW3BEaXNwXS53c2lfZW5hYmxlZCA9IHRydWU7CisgICAgfQorfQorI2VuZGlmIC8vIEdFTkVSSUNfSApkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9hcGlfZHVtcC5qc29uIGIvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9hcGlfZHVtcC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTAxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9sYXllcnN2dC9saW51eC9Wa0xheWVyX2FwaV9kdW1wLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIiA6ICIxLjAuMCIsCisgICAgImxheWVyIiA6IHsKKyAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfTFVOQVJHX2FwaV9kdW1wIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZrTGF5ZXJfYXBpX2R1bXAuc28iLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjMzIiwKKyAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMiIsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMdW5hckcgZGVidWcgbGF5ZXIiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9iYXNpYy5qc29uIGIvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9iYXNpYy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzc5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9sYXllcnN2dC9saW51eC9Wa0xheWVyX2Jhc2ljLmpzb24KQEAgLTAsMCArMSwxOCBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIiA6ICIxLjAuMCIsCisgICAgImxheWVyIiA6IHsKKyAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfTFVOQVJHX2Jhc2ljIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZrTGF5ZXJfYmFzaWMuc28iLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjMzIiwKKyAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMSIsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMdW5hckcgU2FtcGxlIExheWVyIiwKKyAgICAgICAgImRldmljZV9leHRlbnNpb25zIjogWworICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIm5hbWUiOiAiVktfTFVOQVJHX0xheWVyRXh0ZW5zaW9uMSIsCisgICAgICAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMCIsCisJCSAiZW50cnlwb2ludHMiOiBbInZrTGF5ZXJFeHRlbnNpb24xIl0KKyAgICAgICAgICAgICB9CisgICAgICAgICBdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9iYXNpY19pbXBsaWNpdC5qc29uIGIvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9iYXNpY19pbXBsaWNpdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDgzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9sYXllcnN2dC9saW51eC9Wa0xheWVyX2Jhc2ljX2ltcGxpY2l0Lmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIiA6ICIxLjAuMCIsCisgICAgImxheWVyIiA6IHsKKyAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfTFVOQVJHX2Jhc2ljIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIvZXRjL3Z1bGthbi9pbXBsaWNpdF9sYXllci5kL2xpYlZrTGF5ZXJfYmFzaWMuc28iLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjMzIiwKKyAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMSIsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMdW5hckcgU2FtcGxlIExheWVyIiwKKyAgICAgICAgImRldmljZV9leHRlbnNpb25zIjogWworICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIm5hbWUiOiAiVktfTFVOQVJHX0xheWVyRXh0ZW5zaW9uMSIsCisgICAgICAgICAgICAgICAgICJzcGVjX3ZlcnNpb24iOiAiMCIsCisJCSAiZW50cnlwb2ludHMiOiBbInZrTGF5ZXJFeHRlbnNpb24xIl0KKyAgICAgICAgICAgICB9CisgICAgICAgIF0sCisJImRpc2FibGVfZW52aXJvbm1lbnQiOiB7ICJESVNBQkxFX0xBWUVSX0JBU0lDXzEiOiAiMSJ9LAorCSJlbmFibGVfZW52aXJvbm1lbnQiOiB7ICJFTkFCTEVfTEFZRVJfQkFTSUNfMSI6ICIxMzQifQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xheWVyc3Z0L2xpbnV4L1ZrTGF5ZXJfZ2VuZXJpYy5qc29uIGIvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9nZW5lcmljLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjNDg3OAotLS0gL2Rldi9udWxsCisrKyBiL2xheWVyc3Z0L2xpbnV4L1ZrTGF5ZXJfZ2VuZXJpYy5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4wLjAiLAorICAgICJsYXllciIgOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19nZW5lcmljIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZrTGF5ZXJfZ2VuZXJpYy5zbyIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjAuMzMiLAorICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBTYW1wbGUgTGF5ZXIiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9tdWx0aS5qc29uIGIvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9tdWx0aS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTVmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9sYXllcnN2dC9saW51eC9Wa0xheWVyX211bHRpLmpzb24KQEAgLTAsMCArMSwyOCBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIiA6ICIxLjAuMSIsCisgICAgImxheWVycyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19tdWx0aTEiLAorICAgICAgICAgICAgInR5cGUiOiAiSU5TVEFOQ0UiLAorICAgICAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZrTGF5ZXJfbXVsdGkuc28iLAorICAgICAgICAgICAgImFwaV92ZXJzaW9uIjogIjEuMC4zMyIsCisgICAgICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMdW5hckcgU2FtcGxlIG11bHRpcGxlIGxheWVyIHBlciBsaWJyYXJ5IiwKKyAgICAgICAgICAgICJmdW5jdGlvbnMiIDogeworICAgICAgICAgICAgICAidmtHZXRJbnN0YW5jZVByb2NBZGRyIiA6ICJWS19MQVlFUl9MVU5BUkdfbXVsdGkxR2V0SW5zdGFuY2VQcm9jQWRkciIsCisgICAgICAgICAgICAgICJ2a0dldERldmljZVByb2NBZGRyIiA6ICJWS19MQVlFUl9MVU5BUkdfbXVsdGkxR2V0RGV2aWNlUHJvY0FkZHIiCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19tdWx0aTIiLAorICAgICAgICAgICAgInR5cGUiOiAiSU5TVEFOQ0UiLAorICAgICAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZrTGF5ZXJfbXVsdGkuc28iLAorICAgICAgICAgICAgImFwaV92ZXJzaW9uIjogIjEuMC4zMyIsCisgICAgICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMdW5hckcgU2FtcGxlIG11bHRpcGxlIGxheWVyIHBlciBsaWJyYXJ5IiwKKyAgICAgICAgICAgICJmdW5jdGlvbnMiIDogeworICAgICAgICAgICAgICAidmtHZXRJbnN0YW5jZVByb2NBZGRyIiA6ICJWS19MQVlFUl9MVU5BUkdfbXVsdGkyR2V0SW5zdGFuY2VQcm9jQWRkciIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIF0KK30KZGlmZiAtLWdpdCBhL2xheWVyc3Z0L2xpbnV4L1ZrTGF5ZXJfc2NyZWVuc2hvdC5qc29uIGIvbGF5ZXJzdnQvbGludXgvVmtMYXllcl9zY3JlZW5zaG90Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2ZTM5MgotLS0gL2Rldi9udWxsCisrKyBiL2xheWVyc3Z0L2xpbnV4L1ZrTGF5ZXJfc2NyZWVuc2hvdC5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4wLjAiLAorICAgICJsYXllciIgOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19zY3JlZW5zaG90IiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuL2xpYlZrTGF5ZXJfc2NyZWVuc2hvdC5zbyIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjAuMzMiLAorICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBpbWFnZSBjYXB0dXJlIGxheWVyIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xheWVyc3Z0L211bHRpLmNwcCBiL2xheWVyc3Z0L211bHRpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThiODdkCi0tLSAvZGV2L251bGwKKysrIGIvbGF5ZXJzdnQvbXVsdGkuY3BwCkBAIC0wLDAgKzEsNDgwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSAidmtfbG9hZGVyX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfdGFibGUuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1ZrUmVzdWx0IEVudW1lcmF0ZVByb3BlcnRpZXModWludDMyX3Qgc3JjX2NvdW50LCBjb25zdCBUICpzcmNfcHJvcHMsIHVpbnQzMl90ICpkc3RfY291bnQsIFQgKmRzdF9wcm9wcykgeworICAgIGlmICghZHN0X3Byb3BzIHx8ICFzcmNfcHJvcHMpIHsKKyAgICAgICAgKmRzdF9jb3VudCA9IHNyY19jb3VudDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgdWludDMyX3QgY29weV9jb3VudCA9ICgqZHN0X2NvdW50IDwgc3JjX2NvdW50KSA/ICpkc3RfY291bnQgOiBzcmNfY291bnQ7CisgICAgbWVtY3B5KGRzdF9wcm9wcywgc3JjX3Byb3BzLCBzaXplb2YoVCkgKiBjb3B5X2NvdW50KTsKKyAgICAqZHN0X2NvdW50ID0gY29weV9jb3VudDsKKworICAgIHJldHVybiAoY29weV9jb3VudCA9PSBzcmNfY291bnQpID8gVktfU1VDQ0VTUyA6IFZLX0lOQ09NUExFVEU7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSB7CisgICAgTEFZRVJfTVVMVEkxLAorICAgIExBWUVSX01VTFRJMiwKKyAgICBMQVlFUl9DT1VOVCwKK307CisKK3N0YXRpYyBjb25zdCBWa0xheWVyUHJvcGVydGllcyBhbGxfbGF5ZXJfcHJvcHNbTEFZRVJfQ09VTlRdID0geworICAgIHsKKyAgICAgICAgIlZLX0xBWUVSX0xVTkFSR19tdWx0aTEiLAorICAgICAgICBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pLCAvLyBzcGVjVmVyc2lvbgorICAgICAgICAxLCAgICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb25WZXJzaW9uCisgICAgICAgICJMdW5hckcgU2FtcGxlIG11bHRpcGxlIGxheWVyIHBlciBsaWJyYXJ5IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgIlZLX0xBWUVSX0xVTkFSR19tdWx0aTIiLAorICAgICAgICBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pLCAvLyBzcGVjVmVyc2lvbgorICAgICAgICAxLCAgICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb25WZXJzaW9uCisgICAgICAgICJMdW5hckcgU2FtcGxlIG11bHRpcGxlIGxheWVyIHBlciBsaWJyYXJ5IiwKKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiBleHRlbnNpb25zOworfSBhbGxfZXh0ZW5zaW9uX3Byb3BzW0xBWUVSX0NPVU5UXSA9IHsKKyAgICB7IDAsIE5VTEwsIH0sCisgICAgeyAwLCBOVUxMLCB9LAorfTsKKworc3RhdGljIGRldmljZV90YWJsZV9tYXAgbXVsdGkxX2RldmljZV90YWJsZV9tYXA7CitzdGF0aWMgaW5zdGFuY2VfdGFibGVfbWFwIG11bHRpMV9pbnN0YW5jZV90YWJsZV9tYXA7CitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPGRpc3BhdGNoX2tleSwgVmtJbnN0YW5jZT4gbXVsdGkxX2luc3RhbmNlX21hcDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMYXllciBtdWx0aTEgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCittdWx0aTFDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtJbnN0YW5jZSAqcEluc3RhbmNlKSB7CisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqY2hhaW5faW5mbyA9IGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pOworCisgICAgYXNzZXJ0KGNoYWluX2luZm8tPnUucExheWVySW5mbyk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdldEluc3RhbmNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIFBGTl92a0NyZWF0ZUluc3RhbmNlIGZwQ3JlYXRlSW5zdGFuY2UgPSAoUEZOX3ZrQ3JlYXRlSW5zdGFuY2UpZnBHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZUluc3RhbmNlIik7CisgICAgaWYgKGZwQ3JlYXRlSW5zdGFuY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIEFkdmFuY2UgdGhlIGxpbmsgaW5mbyBmb3IgdGhlIG5leHQgZWxlbWVudCBvbiB0aGUgY2hhaW4KKyAgICBjaGFpbl9pbmZvLT51LnBMYXllckluZm8gPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBOZXh0OworCisgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBtdWx0aTFfaW5zdGFuY2VfbWFwW2dldF9kaXNwYXRjaF9rZXkoKnBJbnN0YW5jZSldID0gKnBJbnN0YW5jZTsKKyAgICBpbml0SW5zdGFuY2VUYWJsZSgqcEluc3RhbmNlLCBmcEdldEluc3RhbmNlUHJvY0FkZHIsIG11bHRpMV9pbnN0YW5jZV90YWJsZV9tYXApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogaG9vayBEZXN0cm95SW5zdGFuY2UgdG8gcmVtb3ZlIHRhYmxlSW5zdGFuY2VNYXAgZW50cnkgKi8KK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIG11bHRpMURlc3Ryb3lJbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IpIHsKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwRGlzcCA9IGdldF9kaXNwYXRjaF90YWJsZShtdWx0aTFfaW5zdGFuY2VfdGFibGVfbWFwLCBpbnN0YW5jZSk7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpOworCisgICAgcHJpbnRmKCJBdCBzdGFydCBvZiB3cmFwcGVkIG11bHRpMSB2a0Rlc3Ryb3lJbnN0YW5jZSgpXG4iKTsKKyAgICBwRGlzcC0+RGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBwQWxsb2NhdG9yKTsKKyAgICBtdWx0aTFfaW5zdGFuY2VfdGFibGVfbWFwLmVyYXNlKGtleSk7CisgICAgbXVsdGkxX2luc3RhbmNlX21hcC5lcmFzZShrZXkpOworICAgIHByaW50ZigiQ29tcGxldGVkIG11bHRpMSBsYXllciB2a0Rlc3Ryb3lJbnN0YW5jZSgpXG4iKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIG11bHRpMUNyZWF0ZURldmljZShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UpIHsKKyAgICBwcmludGYoIkF0IHN0YXJ0IG9mIG11bHRpMSBsYXllciB2a0NyZWF0ZURldmljZSgpXG4iKTsKKworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisKKyAgICBhc3NlcnQoY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvKTsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZnBHZXREZXZpY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldERldmljZVByb2NBZGRyOworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBtdWx0aTFfaW5zdGFuY2VfbWFwW2dldF9kaXNwYXRjaF9rZXkocGh5c2ljYWxEZXZpY2UpXTsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgZnBDcmVhdGVEZXZpY2UgPSAoUEZOX3ZrQ3JlYXRlRGV2aWNlKWZwR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgInZrQ3JlYXRlRGV2aWNlIik7CisgICAgaWYgKGZwQ3JlYXRlRGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlRGV2aWNlKHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaW5pdERldmljZVRhYmxlKCpwRGV2aWNlLCBmcEdldERldmljZVByb2NBZGRyLCBtdWx0aTFfZGV2aWNlX3RhYmxlX21hcCk7CisKKyAgICBwcmludGYoIkNvbXBsZXRlZCBtdWx0aTEgbGF5ZXIgdmtDcmVhdGVEZXZpY2UoKSBjYWxsIik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogaG9vayBEZXN0cm95RGV2aWNlIHRvIHJlbW92ZSB0YWJsZU1hcCBlbnRyeSAqLworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgbXVsdGkxRGVzdHJveURldmljZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcikgeworICAgIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpwRGlzcCA9IGdldF9kaXNwYXRjaF90YWJsZShtdWx0aTFfZGV2aWNlX3RhYmxlX21hcCwgZGV2aWNlKTsKKyAgICBkaXNwYXRjaF9rZXkga2V5ID0gZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpOworCisgICAgcHJpbnRmKCJBdCBzdGFydCBvZiBtdWx0aTEgbGF5ZXIgdmtEZXN0cm95RGV2aWNlKClcbiIpOworICAgIHBEaXNwLT5EZXN0cm95RGV2aWNlKGRldmljZSwgcEFsbG9jYXRvcik7CisgICAgbXVsdGkxX2RldmljZV90YWJsZV9tYXAuZXJhc2Uoa2V5KTsKKyAgICBwcmludGYoIkNvbXBsZXRlZCBtdWx0aTEgbGF5ZXIgdmtEZXN0cm95RGV2aWNlKClcbiIpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgbXVsdGkxQ3JlYXRlU2FtcGxlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrU2FtcGxlckNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtTYW1wbGVyICpwU2FtcGxlcikgeworICAgIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpwRGlzcCA9IGdldF9kaXNwYXRjaF90YWJsZShtdWx0aTFfZGV2aWNlX3RhYmxlX21hcCwgZGV2aWNlKTsKKworICAgIHByaW50ZigiQXQgc3RhcnQgb2YgbXVsdGkxIGxheWVyIHZrQ3JlYXRlU2FtcGxlcigpXG4iKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBwRGlzcC0+Q3JlYXRlU2FtcGxlcihkZXZpY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU2FtcGxlcik7CisgICAgcHJpbnRmKCJDb21wbGV0ZWQgbXVsdGkxIGxheWVyIHZrQ3JlYXRlU2FtcGxlcigpXG4iKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK211bHRpMUNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKFZrRGV2aWNlIGRldmljZSwgVmtQaXBlbGluZUNhY2hlIHBpcGVsaW5lQ2FjaGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm9zLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lICpwUGlwZWxpbmVzKSB7CisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnBEaXNwID0gZ2V0X2Rpc3BhdGNoX3RhYmxlKG11bHRpMV9kZXZpY2VfdGFibGVfbWFwLCBkZXZpY2UpOworCisgICAgcHJpbnRmKCJBdCBzdGFydCBvZiBtdWx0aTEgbGF5ZXIgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lKClcbiIpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHBEaXNwLT5DcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIGNvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgIHByaW50ZigiQ29tcGxldGVkIG11bHRpMSBsYXllciB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKVxuIik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCittdWx0aTFFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpCit7CisgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoMSwgJmFsbF9sYXllcl9wcm9wc1tMQVlFUl9NVUxUSTFdLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCittdWx0aTFFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKQoreworICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKDEsICZhbGxfbGF5ZXJfcHJvcHNbTEFZRVJfTVVMVEkxXSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorbXVsdGkxRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwQ291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpCit7CisgICAgaWYgKHBMYXllck5hbWUgJiYgIXN0cmNtcChwTGF5ZXJOYW1lLCBhbGxfbGF5ZXJfcHJvcHNbTEFZRVJfTVVMVEkxXS5sYXllck5hbWUpKSB7CisgICAgICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKGFsbF9leHRlbnNpb25fcHJvcHNbTEFZRVJfTVVMVEkxXS5jb3VudCwKKyAgICAgICAgICAgICAgICBhbGxfZXh0ZW5zaW9uX3Byb3BzW0xBWUVSX01VTFRJMV0uZXh0ZW5zaW9ucywgcENvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorCisgICAgcmV0dXJuIFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK211bHRpMUVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykKK3sKKyAgICBpZiAocExheWVyTmFtZSAmJiAhc3RyY21wKHBMYXllck5hbWUsIGFsbF9sYXllcl9wcm9wc1tMQVlFUl9NVUxUSTFdLmxheWVyTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoYWxsX2V4dGVuc2lvbl9wcm9wc1tMQVlFUl9NVUxUSTFdLmNvdW50LAorICAgICAgICAgICAgICAgIGFsbF9leHRlbnNpb25fcHJvcHNbTEFZRVJfTVVMVEkxXS5leHRlbnNpb25zLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwRGlzcCA9IGdldF9kaXNwYXRjaF90YWJsZShtdWx0aTFfaW5zdGFuY2VfdGFibGVfbWFwLCBwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIHBEaXNwLT5FbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwTGF5ZXJOYW1lLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBtdWx0aTFHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIgKnBOYW1lKSB7CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJtdWx0aTFHZXREZXZpY2VQcm9jQWRkciIpIHx8ICFzdHJjbXAocE5hbWUsICJ2a0dldERldmljZVByb2NBZGRyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMUdldERldmljZVByb2NBZGRyOworICAgIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lEZXZpY2UiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMURlc3Ryb3lEZXZpY2U7CisgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlU2FtcGxlciIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkxQ3JlYXRlU2FtcGxlcjsKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkxQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXM7CisKKyAgICBpZiAoZGV2aWNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnBUYWJsZSA9IGdldF9kaXNwYXRjaF90YWJsZShtdWx0aTFfZGV2aWNlX3RhYmxlX21hcCwgZGV2aWNlKTsKKyAgICBpZiAocFRhYmxlLT5HZXREZXZpY2VQcm9jQWRkciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcFRhYmxlLT5HZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIHBOYW1lKTsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBtdWx0aTFHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIgKnBOYW1lKSB7CisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMUVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKCJ2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkxRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkxRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKCJ2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMUVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJtdWx0aTFHZXRJbnN0YW5jZVByb2NBZGRyIikgfHwgIXN0cmNtcChwTmFtZSwgInZrR2V0SW5zYXRuY2VQcm9jQWRkciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiltdWx0aTFHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZUluc3RhbmNlIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiltdWx0aTFDcmVhdGVJbnN0YW5jZTsKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVEZXZpY2UiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMUNyZWF0ZURldmljZTsKKyAgICBpZiAoIXN0cmNtcCgidmtEZXN0cm95SW5zdGFuY2UiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMURlc3Ryb3lJbnN0YW5jZTsKKworICAgIGFzc2VydChpbnN0YW5jZSk7CisKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gcHJvYyA9IG11bHRpMUdldERldmljZVByb2NBZGRyKFZLX05VTExfSEFORExFLCBwTmFtZSk7CisgICAgaWYgKHByb2MpCisgICAgICAgIHJldHVybiBwcm9jOworCisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcFRhYmxlID0gZ2V0X2Rpc3BhdGNoX3RhYmxlKG11bHRpMV9pbnN0YW5jZV90YWJsZV9tYXAsIGluc3RhbmNlKTsKKyAgICBpZiAocFRhYmxlLT5HZXRJbnN0YW5jZVByb2NBZGRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIHBOYW1lKTsKKworfQorCitzdGF0aWMgaW5zdGFuY2VfdGFibGVfbWFwIG11bHRpMl9pbnN0YW5jZV90YWJsZV9tYXA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTGF5ZXIgbXVsdGkyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorbXVsdGkyQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLCBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrSW5zdGFuY2UgKnBJbnN0YW5jZSkgeworICAgIFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmNoYWluX2luZm8gPSBnZXRfY2hhaW5faW5mbyhwQ3JlYXRlSW5mbywgVktfTEFZRVJfTElOS19JTkZPKTsKKworICAgIGFzc2VydChjaGFpbl9pbmZvLT51LnBMYXllckluZm8pOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBHZXRJbnN0YW5jZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcENyZWF0ZUluc3RhbmNlID0gKFBGTl92a0NyZWF0ZUluc3RhbmNlKWZwR2V0SW5zdGFuY2VQcm9jQWRkcihOVUxMLCAidmtDcmVhdGVJbnN0YW5jZSIpOworICAgIGlmIChmcENyZWF0ZUluc3RhbmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlSW5zdGFuY2UocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgaW5pdEluc3RhbmNlVGFibGUoKnBJbnN0YW5jZSwgZnBHZXRJbnN0YW5jZVByb2NBZGRyLCBtdWx0aTJfaW5zdGFuY2VfdGFibGVfbWFwKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorbXVsdGkyRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKFZrSW5zdGFuY2UgaW5zdGFuY2UsIHVpbnQzMl90ICpwUGh5c2ljYWxEZXZpY2VDb3VudCwgVmtQaHlzaWNhbERldmljZSAqcFBoeXNpY2FsRGV2aWNlcykgeworICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnBEaXNwID0gZ2V0X2Rpc3BhdGNoX3RhYmxlKG11bHRpMl9pbnN0YW5jZV90YWJsZV9tYXAsIGluc3RhbmNlKTsKKworICAgIHByaW50ZigiQXQgc3RhcnQgb2Ygd3JhcHBlZCBtdWx0aTIgdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoKVxuIik7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gcERpc3AtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlQ291bnQsIHBQaHlzaWNhbERldmljZXMpOworICAgIHByaW50ZigiQ29tcGxldGVkIG11bHRpMiBsYXllciB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygpXG4iKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTAorbXVsdGkyR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnBEaXNwID0gZ2V0X2Rpc3BhdGNoX3RhYmxlKG11bHRpMl9pbnN0YW5jZV90YWJsZV9tYXAsIHBoeXNpY2FsRGV2aWNlKTsKKyAgICBwcmludGYoIkF0IHN0YXJ0IG9mIHdyYXBwZWQgbXVsdGkyIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKClcbiIpOworICAgIHBEaXNwLT5HZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBQcm9wZXJ0aWVzKTsKKyAgICBwcmludGYoIkNvbXBsZXRlZCBtdWx0aTIgbGF5ZXIgdmtHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMoKVxuIik7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMCittdWx0aTJHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyAqcEZlYXR1cmVzKSB7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBnZXRfZGlzcGF0Y2hfdGFibGUobXVsdGkyX2luc3RhbmNlX3RhYmxlX21hcCwgcGh5c2ljYWxEZXZpY2UpOworICAgIHByaW50ZigiQXQgc3RhcnQgb2Ygd3JhcHBlZCBtdWx0aTIgdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKClcbiIpOworICAgIHBEaXNwLT5HZXRQaHlzaWNhbERldmljZUZlYXR1cmVzKHBoeXNpY2FsRGV2aWNlLCBwRmVhdHVyZXMpOworICAgIHByaW50ZigiQ29tcGxldGVkIG11bHRpMiBsYXllciB2a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMoKVxuIik7Cit9CisKKy8qIGhvb2sgRGVzdHJveUluc3RhbmNlIHRvIHJlbW92ZSB0YWJsZUluc3RhbmNlTWFwIGVudHJ5ICovCitWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBtdWx0aTJEZXN0cm95SW5zdGFuY2UoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBnZXRfZGlzcGF0Y2hfdGFibGUobXVsdGkyX2luc3RhbmNlX3RhYmxlX21hcCwgaW5zdGFuY2UpOworICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKTsKKworICAgIHByaW50ZigiQXQgc3RhcnQgb2Ygd3JhcHBlZCBtdWx0aTIgdmtEZXN0cm95SW5zdGFuY2UoKVxuIik7CisgICAgcERpc3AtPkRlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgcEFsbG9jYXRvcik7CisgICAgbXVsdGkyX2luc3RhbmNlX3RhYmxlX21hcC5lcmFzZShrZXkpOworICAgIHByaW50ZigiQ29tcGxldGVkIG11bHRpMiBsYXllciB2a0Rlc3Ryb3lJbnN0YW5jZSgpXG4iKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCittdWx0aTJFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpCit7CisgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoMSwgJmFsbF9sYXllcl9wcm9wc1tMQVlFUl9NVUxUSTJdLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCittdWx0aTJFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwgVmtMYXllclByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKQoreworICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKDEsICZhbGxfbGF5ZXJfcHJvcHNbTEFZRVJfTVVMVEkyXSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorbXVsdGkyRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwQ291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpCit7CisgICAgaWYgKHBMYXllck5hbWUgJiYgIXN0cmNtcChwTGF5ZXJOYW1lLCBhbGxfbGF5ZXJfcHJvcHNbTEFZRVJfTVVMVEkyXS5sYXllck5hbWUpKSB7CisgICAgICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKGFsbF9leHRlbnNpb25fcHJvcHNbTEFZRVJfTVVMVEkyXS5jb3VudCwKKyAgICAgICAgICAgICAgICBhbGxfZXh0ZW5zaW9uX3Byb3BzW0xBWUVSX01VTFRJMl0uZXh0ZW5zaW9ucywgcENvdW50LCBwUHJvcGVydGllcyk7CisgICAgfQorCisgICAgcmV0dXJuIFZLX0VSUk9SX0xBWUVSX05PVF9QUkVTRU5UOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK211bHRpMkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykKK3sKKyAgICBpZiAocExheWVyTmFtZSAmJiAhc3RyY21wKHBMYXllck5hbWUsIGFsbF9sYXllcl9wcm9wc1tMQVlFUl9NVUxUSTJdLmxheWVyTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoYWxsX2V4dGVuc2lvbl9wcm9wc1tMQVlFUl9NVUxUSTJdLmNvdW50LAorICAgICAgICAgICAgICAgIGFsbF9leHRlbnNpb25fcHJvcHNbTEFZRVJfTVVMVEkyXS5leHRlbnNpb25zLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwRGlzcCA9IGdldF9kaXNwYXRjaF90YWJsZShtdWx0aTJfaW5zdGFuY2VfdGFibGVfbWFwLCBwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIHBEaXNwLT5FbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwTGF5ZXJOYW1lLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBtdWx0aTJHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdCwgY29uc3QgY2hhciAqcE5hbWUpIHsKKyAgICBpZiAoIXN0cmNtcCgidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkyRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiltdWx0aTJFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiwgcE5hbWUpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiltdWx0aTJFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAoInZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkyRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVJbnN0YW5jZSIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkyQ3JlYXRlSW5zdGFuY2U7CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJtdWx0aTJHZXRJbnN0YW5jZVByb2NBZGRyIikgfHwgIXN0cmNtcChwTmFtZSwgInZrR2V0SW5zdGFuY2VQcm9jQWRkciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiltdWx0aTJHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIGlmICghc3RyY21wKCJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkyRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzOworICAgIGlmICghc3RyY21wKCJHZXRQaHlzaWNhbERldmljZVByb3BlcnRpZXMiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMkdldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcCgiR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlcyIsIHBOYW1lKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pbXVsdGkyR2V0UGh5c2ljYWxEZXZpY2VGZWF0dXJlczsKKyAgICBpZiAoIXN0cmNtcCgidmtEZXN0cm95SW5zdGFuY2UiLCBwTmFtZSkpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKW11bHRpMkRlc3Ryb3lJbnN0YW5jZTsKKworICAgIGlmIChpbnN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcFRhYmxlID0gZ2V0X2Rpc3BhdGNoX3RhYmxlKG11bHRpMl9pbnN0YW5jZV90YWJsZV9tYXAsIGluc3QpOworICAgIGlmIChwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHBUYWJsZS0+R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0LCBwTmFtZSk7Cit9CisKKy8vIGxvYWRlci1sYXllciBpbnRlcmZhY2UgdjAKKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAordmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpCit7CisgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoTEFZRVJfQ09VTlQsIGFsbF9sYXllcl9wcm9wcywgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90ICpwQ291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykKK3sKKyAgICAvLyBtdWx0aTIgZG9lcyBub3QgaW50ZXJjZXB0IGFueSBkZXZpY2UtbGV2ZWwgY29tbWFuZAorICAgIHJldHVybiBtdWx0aTFFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCit2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcENvdW50LCBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKQoreworICAgIGFzc2VydChwTGF5ZXJOYW1lKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTEFZRVJfQ09VTlQ7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChwTGF5ZXJOYW1lLCBhbGxfbGF5ZXJfcHJvcHNbaV0ubGF5ZXJOYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoYWxsX2V4dGVuc2lvbl9wcm9wc1tpXS5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYWxsX2V4dGVuc2lvbl9wcm9wc1tpXS5leHRlbnNpb25zLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydCghInVucmVhY2hhYmxlIik7CisgICAgKnBDb3VudCA9IDA7CisgICAgcmV0dXJuIFZLX1NVQ0NFU1M7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykKK3sKKyAgICBhc3NlcnQocGh5c2ljYWxEZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUgJiYgcExheWVyTmFtZSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExBWUVSX0NPVU5UOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAocExheWVyTmFtZSwgYWxsX2xheWVyX3Byb3BzW2ldLmxheWVyTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKGFsbF9leHRlbnNpb25fcHJvcHNbaV0uY291bnQsCisgICAgICAgICAgICAgICAgICAgIGFsbF9leHRlbnNpb25fcHJvcHNbaV0uZXh0ZW5zaW9ucywgcENvdW50LCBwUHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoISJ1bnJlYWNoYWJsZSIpOworICAgICpwQ291bnQgPSAwOworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBWS19MQVlFUl9MVU5BUkdfbXVsdGkxR2V0RGV2aWNlUHJvY0FkZHIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBjaGFyICpwTmFtZSkgeworICAgIHJldHVybiBtdWx0aTFHZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIHBOYW1lKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgVktfTEFZRVJfTFVOQVJHX211bHRpMUdldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqcE5hbWUpIHsKKyAgICBpZiAoIXN0cmNtcChwTmFtZSwgInZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXN0cmNtcChwTmFtZSwgInZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4odmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMpOworICAgIGlmICghc3RyY21wKHBOYW1lLCAidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyk7CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJ2a0dldEluc3RhbmNlUHJvY0FkZHIiKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihWS19MQVlFUl9MVU5BUkdfbXVsdGkxR2V0SW5zdGFuY2VQcm9jQWRkcik7CisKKyAgICByZXR1cm4gbXVsdGkxR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgcE5hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBWS19MQVlFUl9MVU5BUkdfbXVsdGkyR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyICpwTmFtZSkgeworICAgIGlmICghc3RyY21wKHBOYW1lLCAidmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMpOworICAgIGlmICghc3RyY21wKHBOYW1lLCAidmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPih2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyk7CisgICAgaWYgKCFzdHJjbXAocE5hbWUsICJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKTsKKyAgICBpZiAoIXN0cmNtcChwTmFtZSwgInZrR2V0SW5zdGFuY2VQcm9jQWRkciIpKQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KFZLX0xBWUVSX0xVTkFSR19tdWx0aTJHZXRJbnN0YW5jZVByb2NBZGRyKTsKKworICAgIHJldHVybiBtdWx0aTJHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCBwTmFtZSk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xheWVyc3Z0L3NjcmVlbnNob3QuY3BwIGIvbGF5ZXJzdnQvc2NyZWVuc2hvdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyYjJkZAotLS0gL2Rldi9udWxsCisrKyBiL2xheWVyc3Z0L3NjcmVlbnNob3QuY3BwCkBAIC0wLDAgKzEsMTMwNSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjb2R5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisjaW5jbHVkZSAidmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgiCisjaW5jbHVkZSAidmtfc3RydWN0X3N0cmluZ19oZWxwZXJfY3BwLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidmtfbGF5ZXJfdGFibGUuaCIKKyNpbmNsdWRlICJ2a19sYXllcl9leHRlbnNpb25fdXRpbHMuaCIKKyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIgorCisjaWZkZWYgQU5EUk9JRAorCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxzeXMvc3lzdGVtX3Byb3BlcnRpZXMuaD4KKworc3RhdGljIGNoYXIgYW5kcm9pZF9lbnZbNjRdID0ge307Citjb25zdCBjaGFyKiBlbnZfdmFyID0gImRlYnVnLnZ1bGthbi5zY3JlZW5zaG90IjsKKworY2hhciogYW5kcm9pZF9leGVjKGNvbnN0IGNoYXIqIGNtZCkgeworICAgIEZJTEUqIHBpcGUgPSBwb3BlbihjbWQsICJyIik7CisgICAgaWYgKHBpcGUgIT0gbnVsbHB0cikgeworICAgICAgICBmZ2V0cyhhbmRyb2lkX2VudiwgNjQsIHBpcGUpOworICAgICAgICBwY2xvc2UocGlwZSk7CisgICAgfQorCisgICAgLy8gT25seSBpZiB0aGUgdmFsdWUgaXMgc2V0IHdpbGwgd2UgZ2V0IGEgc3RyaW5nIGJhY2sKKyAgICBpZiAoc3RybGVuKGFuZHJvaWRfZW52KSA+IDApIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAic2NyZWVuc2hvdCIsICJWdWxrYW4gc2NyZWVuc2hvdCBsYXllciBjYXB0dXJpbmc6ICVzIiwgYW5kcm9pZF9lbnYpOworICAgICAgICByZXR1cm4gYW5kcm9pZF9lbnY7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NoYXIqIGFuZHJvaWRfZ2V0ZW52KGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBzdGQ6OnN0cmluZyBjb21tYW5kKCJnZXRwcm9wICIpOworICAgIGNvbW1hbmQgKz0ga2V5OworICAgIHJldHVybiBhbmRyb2lkX2V4ZWMoY29tbWFuZC5jX3N0cigpKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpsb2NhbF9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkgeworICAgIHJldHVybiBhbmRyb2lkX2dldGVudihuYW1lKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZyZWVfZ2V0ZW52KGNvbnN0IGNoYXIgKnZhbCkge30KKworI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisKK2NvbnN0IGNoYXIqIGVudl92YXIgPSAiX1ZLX1NDUkVFTlNIT1QiOworCitzdGF0aWMgaW5saW5lIGNoYXIgKmxvY2FsX2dldGVudihjb25zdCBjaGFyICpuYW1lKSB7IHJldHVybiBnZXRlbnYobmFtZSk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZyZWVfZ2V0ZW52KGNvbnN0IGNoYXIgKnZhbCkge30KKworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisKK2NvbnN0IGNoYXIqIGVudl92YXIgPSAiX1ZLX1NDUkVFTlNIT1QiOworCitzdGF0aWMgaW5saW5lIGNoYXIgKmxvY2FsX2dldGVudihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgY2hhciAqcmV0VmFsOworICAgIERXT1JEIHZhbFNpemU7CisKKyAgICB2YWxTaXplID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEobmFtZSwgTlVMTCwgMCk7CisKKyAgICAvLyB2YWxTaXplIERPRVMgaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yLCBzbyBmb3IgYW55IHNldCB2YXJpYWJsZQorICAgIC8vIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IDEuIElmIGl0J3MgMCwgdGhlIHZhcmlhYmxlIHdhc24ndCBzZXQuCisgICAgaWYgKHZhbFNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBUT0RPOyBGSVhNRSBUaGlzIHNob3VsZCBiZSB1c2luZyBhbnkgYXBwIGRlZmluZWQgbWVtb3J5IGFsbG9jYXRpb24KKyAgICByZXRWYWwgPSAoY2hhciAqKW1hbGxvYyh2YWxTaXplKTsKKworICAgIEdldEVudmlyb25tZW50VmFyaWFibGVBKG5hbWUsIHJldFZhbCwgdmFsU2l6ZSk7CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfZnJlZV9nZXRlbnYoY29uc3QgY2hhciAqdmFsKSB7IGZyZWUoKHZvaWQgKil2YWwpOyB9CisjZW5kaWYKKworbmFtZXNwYWNlIHNjcmVlbnNob3QgeworCitzdGF0aWMgaW50IGdsb2JhbExvY2tJbml0aWFsaXplZCA9IDA7CitzdGF0aWMgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCBnbG9iYWxMb2NrOworCisvLyB1bm9yZGVyZWQgbWFwOiBhc3NvY2lhdGVzIGEgc3dhcCBjaGFpbiB3aXRoIGEgZGV2aWNlLCBpbWFnZSBleHRlbnQsIGZvcm1hdCwKKy8vIGFuZCBsaXN0IG9mIGltYWdlcwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrRGV2aWNlIGRldmljZTsKKyAgICBWa0V4dGVudDJEIGltYWdlRXh0ZW50OworICAgIFZrRm9ybWF0IGZvcm1hdDsKKyAgICBWa0ltYWdlICppbWFnZUxpc3Q7Cit9IFN3YXBjaGFpbk1hcFN0cnVjdDsKK3N0YXRpYyB1bm9yZGVyZWRfbWFwPFZrU3dhcGNoYWluS0hSLCBTd2FwY2hhaW5NYXBTdHJ1Y3QgKj4gc3dhcGNoYWluTWFwOworCisvLyB1bm9yZGVyZWQgbWFwOiBhc3NvY2lhdGVzIGFuIGltYWdlIHdpdGggYSBkZXZpY2UsIGltYWdlIGV4dGVudCwgYW5kIGZvcm1hdAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrRGV2aWNlIGRldmljZTsKKyAgICBWa0V4dGVudDJEIGltYWdlRXh0ZW50OworICAgIFZrRm9ybWF0IGZvcm1hdDsKK30gSW1hZ2VNYXBTdHJ1Y3Q7CitzdGF0aWMgdW5vcmRlcmVkX21hcDxWa0ltYWdlLCBJbWFnZU1hcFN0cnVjdCAqPiBpbWFnZU1hcDsKKworLy8gdW5vcmRlcmVkIG1hcDogYXNzb2NpYXRlcyBhIGRldmljZSB3aXRoIGEgcXVldWUsIGNvbW1hbmRQb29sLCBhbmQgcGh5c2ljYWwKKy8vIGRldmljZSBhbHNvIGNvbnRhaW5zIHBlciBkZXZpY2UgaW5mbyBpbmNsdWRpbmcgZGlzcGF0Y2ggdGFibGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqZGV2aWNlX2Rpc3BhdGNoX3RhYmxlOworICAgIGJvb2wgd3NpX2VuYWJsZWQ7CisgICAgVmtRdWV1ZSBxdWV1ZTsKKyAgICBWa0NvbW1hbmRQb29sIGNvbW1hbmRQb29sOworICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2U7CisgICAgUEZOX3ZrU2V0RGV2aWNlTG9hZGVyRGF0YSBwZm5fZGV2X2luaXQ7Cit9IERldmljZU1hcFN0cnVjdDsKK3N0YXRpYyB1bm9yZGVyZWRfbWFwPFZrRGV2aWNlLCBEZXZpY2VNYXBTdHJ1Y3QgKj4gZGV2aWNlTWFwOworCisvLyB1bm9yZGVyZWQgbWFwOiBhc3NvY2lhdGVzIGEgcGh5c2ljYWwgZGV2aWNlIHdpdGggYW4gaW5zdGFuY2UKK3R5cGVkZWYgc3RydWN0IHsgVmtJbnN0YW5jZSBpbnN0YW5jZTsgfSBQaHlzRGV2aWNlTWFwU3RydWN0Oworc3RhdGljIHVub3JkZXJlZF9tYXA8VmtQaHlzaWNhbERldmljZSwgUGh5c0RldmljZU1hcFN0cnVjdCAqPiBwaHlzRGV2aWNlTWFwOworCisvLyBzZXQ6IGxpc3Qgb2YgZnJhbWVzIHRvIHRha2Ugc2NyZWVuc2hvdHMgd2l0aG91dCBkdXBsaWNhdGlvbi4KK3N0YXRpYyBzZXQ8aW50PiBzY3JlZW5zaG90RnJhbWVzOworCisvLyBGbGFnIGluZGljYXRpbmcgd2UgaGF2ZSBxdWVyaWVkIGVudl92YXIKK3N0YXRpYyBib29sIHNjcmVlbnNob3RFbnZRdWVyaWVkID0gZmFsc2U7CisKK3N0YXRpYyBib29sCittZW1vcnlfdHlwZV9mcm9tX3Byb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgKm1lbW9yeV9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGVCaXRzLCBWa0ZsYWdzIHJlcXVpcmVtZW50c19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0eXBlSW5kZXgpIHsKKyAgICAvLyBTZWFyY2ggbWVtdHlwZXMgdG8gZmluZCBmaXJzdCBpbmRleCB3aXRoIHRob3NlIHByb3BlcnRpZXMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICBpZiAoKHR5cGVCaXRzICYgMSkgPT0gMSkgeworICAgICAgICAgICAgLy8gVHlwZSBpcyBhdmFpbGFibGUsIGRvZXMgaXQgbWF0Y2ggdXNlciBwcm9wZXJ0aWVzPworICAgICAgICAgICAgaWYgKChtZW1vcnlfcHJvcGVydGllcy0+bWVtb3J5VHlwZXNbaV0ucHJvcGVydHlGbGFncyAmCisgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50c19tYXNrKSA9PSByZXF1aXJlbWVudHNfbWFzaykgeworICAgICAgICAgICAgICAgICp0eXBlSW5kZXggPSBpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHR5cGVCaXRzID4+PSAxOworICAgIH0KKyAgICAvLyBObyBtZW1vcnkgdHlwZXMgbWF0Y2hlZCwgcmV0dXJuIGZhaWx1cmUKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBEZXZpY2VNYXBTdHJ1Y3QgKmdldF9kZXZfaW5mbyhWa0RldmljZSBkZXYpIHsKKyAgICBhdXRvIGl0ID0gZGV2aWNlTWFwLmZpbmQoZGV2KTsKKyAgICBpZiAoaXQgPT0gZGV2aWNlTWFwLmVuZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworfQorCitzdGF0aWMgdm9pZCBpbml0X3NjcmVlbnNob3QoKSB7CisgICAgaWYgKCFnbG9iYWxMb2NrSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgLy8gVE9ETy9UQkQ6IE5lZWQgdG8gZGVsZXRlIHRoaXMgbXV0ZXggc29tZXRpbWUuICBIb3c/Pz8gIE9uZQorICAgICAgICAvLyBzdWdnZXN0aW9uIGlzIHRvIGNhbGwgdGhpcyBkdXJpbmcgdmtDcmVhdGVJbnN0YW5jZSgpLCBhbmQgdGhlbiB3ZQorICAgICAgICAvLyBjYW4gY2xlYW4gaXQgdXAgZHVyaW5nIHZrRGVzdHJveUluc3RhbmNlKCkuICBIb3dldmVyLCB0aGF0IHJlcXVpcmVzCisgICAgICAgIC8vIHRoYXQgdGhlIGxheWVyIGhhdmUgcGVyLWluc3RhbmNlIGxvY2tzLiAgV2UgbmVlZCB0byBjb21lIGJhY2sgYW5kCisgICAgICAgIC8vIGFkZHJlc3MgdGhpcyBzb29uLgorICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZV9tdXRleCgmZ2xvYmFsTG9jayk7CisgICAgICAgIGdsb2JhbExvY2tJbml0aWFsaXplZCA9IDE7CisgICAgfQorfQorCisvLyBUcmFjayBhbGxvY2F0ZWQgcmVzb3VyY2VzIGluIHdyaXRlUFBNKCkKKy8vIGFuZCBjbGVhbiB0aGVtIHVwIHdoZW4gdGhleSBnbyBvdXQgb2Ygc2NvcGUuCitzdHJ1Y3QgV3JpdGVQUE1DbGVhbnVwRGF0YSB7CisgICAgVmtEZXZpY2UgZGV2aWNlOworICAgIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpwVGFibGVEZXZpY2U7CisgICAgVmtJbWFnZSBpbWFnZTI7CisgICAgVmtJbWFnZSBpbWFnZTM7CisgICAgVmtEZXZpY2VNZW1vcnkgbWVtMjsKKyAgICBWa0RldmljZU1lbW9yeSBtZW0zOworICAgIGJvb2wgbWVtMm1hcHBlZDsKKyAgICBib29sIG1lbTNtYXBwZWQ7CisgICAgVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXI7CisgICAgVmtDb21tYW5kUG9vbCBjb21tYW5kUG9vbDsKKyAgICB+V3JpdGVQUE1DbGVhbnVwRGF0YSgpOworfTsKKworV3JpdGVQUE1DbGVhbnVwRGF0YTo6fldyaXRlUFBNQ2xlYW51cERhdGEoKSB7CisgICAgaWYgKG1lbTJtYXBwZWQpCisgICAgICAgIHBUYWJsZURldmljZS0+VW5tYXBNZW1vcnkoZGV2aWNlLCBtZW0yKTsKKyAgICBpZiAobWVtMikKKyAgICAgICAgcFRhYmxlRGV2aWNlLT5GcmVlTWVtb3J5KGRldmljZSwgbWVtMiwgTlVMTCk7CisgICAgaWYgKGltYWdlMikKKyAgICAgICAgcFRhYmxlRGV2aWNlLT5EZXN0cm95SW1hZ2UoZGV2aWNlLCBpbWFnZTIsIE5VTEwpOworCisgICAgaWYgKG1lbTNtYXBwZWQpCisgICAgICAgIHBUYWJsZURldmljZS0+VW5tYXBNZW1vcnkoZGV2aWNlLCBtZW0zKTsKKyAgICBpZiAobWVtMykKKyAgICAgICAgcFRhYmxlRGV2aWNlLT5GcmVlTWVtb3J5KGRldmljZSwgbWVtMywgTlVMTCk7CisgICAgaWYgKGltYWdlMykKKyAgICAgICAgcFRhYmxlRGV2aWNlLT5EZXN0cm95SW1hZ2UoZGV2aWNlLCBpbWFnZTMsIE5VTEwpOworCisgICAgaWYgKGNvbW1hbmRCdWZmZXIpCisgICAgICAgIHBUYWJsZURldmljZS0+RnJlZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgY29tbWFuZFBvb2wsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kQnVmZmVyKTsKK30KKworLy8gU2F2ZSBhbiBpbWFnZSB0byBhIFBQTSBpbWFnZSBmaWxlLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gaXNzdWVzIGNvbW1hbmRzIHRvIGNvcHkvY29udmVydCB0aGUgc3dhcGNoYWluIGltYWdlCisvLyBmcm9tIHdoYXRldmVyIGNvbXBhdGlibGUgZm9ybWF0IHRoZSBzd2FwY2hhaW4gaW1hZ2UgdXNlcworLy8gdG8gYSBzaW5nbGUgZm9ybWF0IChWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pIHNvIHRoYXQgdGhlIGNvbnZlcnRlZAorLy8gcmVzdWx0IGNhbiBiZSBlYXNpbHkgd3JpdHRlbiB0byBhIFBQTSBmaWxlLgorLy8KKy8vIEVycm9yIGhhbmRsaW5nOiBJZiB0aGVyZSBpcyBhIHByb2JsZW0sIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHNpbGVudGx5CisvLyBmYWlsIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBQcmVzZW50IG9wZXJhdGlvbiBnb2luZyBvbiBpbiB0aGUgY2FsbGVyLgorLy8gVGhlIG51bWVyb3VzIGRlYnVnIGFzc2VydHMgYXJlIHRvIGNhdGNoIHByb2dyYW1taW5nIGVycm9ycyBhbmQgYXJlIG5vdAorLy8gZXhwZWN0ZWQgdG8gYXNzZXJ0LiAgUmVjb3ZlcnkgYW5kIGNsZWFuIHVwIGFyZSBpbXBsZW1lbnRlZCBmb3IgaW1hZ2UgbWVtb3J5CisvLyBhbGxvY2F0aW9uIGZhaWx1cmVzLgorLy8gKFRPRE8pIEl0IHdvdWxkIGJlIG5pY2UgdG8gcGFzcyBhbnkgZmFpbHVyZSBpbmZvIHRvIERlYnVnUmVwb3J0IG9yIHNvbWV0aGluZy4KK3N0YXRpYyB2b2lkIHdyaXRlUFBNKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBWa0ltYWdlIGltYWdlMSkgeworCisgICAgVmtSZXN1bHQgZXJyOworICAgIGJvb2wgcGFzczsKKworICAgIC8vIEJhaWwgaW1tZWRpYXRlbHkgaWYgd2UgY2FuJ3QgZmluZCB0aGUgaW1hZ2UuCisgICAgaWYgKGltYWdlTWFwLmVtcHR5KCkgfHwgaW1hZ2VNYXAuZmluZChpbWFnZTEpID09IGltYWdlTWFwLmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDb2xsZWN0IG9iamVjdCBpbmZvIGZyb20gbWFwcy4gIFRoaXMgaW5mbyBpcyBnZW5lcmFsbHkgcmVjb3JkZWQKKyAgICAvLyBieSB0aGUgb3RoZXIgZnVuY3Rpb25zIGhvb2tlZCBpbiB0aGlzIGxheWVyLgorICAgIFZrRGV2aWNlIGRldmljZSA9IGltYWdlTWFwW2ltYWdlMV0tPmRldmljZTsKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlID0gZGV2aWNlTWFwW2RldmljZV0tPnBoeXNpY2FsRGV2aWNlOworICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UgPSBwaHlzRGV2aWNlTWFwW3BoeXNpY2FsRGV2aWNlXS0+aW5zdGFuY2U7CisgICAgVmtRdWV1ZSBxdWV1ZSA9IGRldmljZU1hcFtkZXZpY2VdLT5xdWV1ZTsKKyAgICBEZXZpY2VNYXBTdHJ1Y3QgKmRldk1hcCA9IGdldF9kZXZfaW5mbyhkZXZpY2UpOworICAgIGlmIChOVUxMID09IGRldk1hcCkgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnBUYWJsZURldmljZSA9IGRldk1hcC0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlOworICAgIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpwVGFibGVRdWV1ZSA9CisgICAgICAgIGdldF9kZXZfaW5mbyhzdGF0aWNfY2FzdDxWa0RldmljZT4oc3RhdGljX2Nhc3Q8dm9pZCAqPihxdWV1ZSkpKQorICAgICAgICAgICAgLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcEluc3RhbmNlVGFibGU7CisgICAgcEluc3RhbmNlVGFibGUgPSBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZShpbnN0YW5jZSk7CisKKyAgICAvLyBHYXRoZXIgaW5jb21pbmcgaW1hZ2UgaW5mbyBhbmQgY2hlY2sgaW1hZ2UgZm9ybWF0IGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAvLyB0aGUgdGFyZ2V0IGZvcm1hdC4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJvdGggMjQtYml0IGFuZCAzMi1iaXQgc3dhcGNoYWluIGltYWdlcy4KKyAgICBWa0Zvcm1hdCBjb25zdCB0YXJnZXQzMmJpdEZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKKyAgICBWa0Zvcm1hdCBjb25zdCB0YXJnZXQyNGJpdEZvcm1hdCA9IFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk07CisgICAgdWludDMyX3QgY29uc3Qgd2lkdGggPSBpbWFnZU1hcFtpbWFnZTFdLT5pbWFnZUV4dGVudC53aWR0aDsKKyAgICB1aW50MzJfdCBjb25zdCBoZWlnaHQgPSBpbWFnZU1hcFtpbWFnZTFdLT5pbWFnZUV4dGVudC5oZWlnaHQ7CisgICAgVmtGb3JtYXQgY29uc3QgZm9ybWF0ID0gaW1hZ2VNYXBbaW1hZ2UxXS0+Zm9ybWF0OworICAgIHVpbnQzMl90IGNvbnN0IG51bUNoYW5uZWxzID0gdmtfZm9ybWF0X2dldF9jaGFubmVsX2NvdW50KGZvcm1hdCk7CisgICAgaWYgKCh2a19mb3JtYXRfZ2V0X2NvbXBhdGliaWxpdHlfY2xhc3ModGFyZ2V0MjRiaXRGb3JtYXQpICE9CisgICAgICAgICB2a19mb3JtYXRfZ2V0X2NvbXBhdGliaWxpdHlfY2xhc3MoZm9ybWF0KSkgJiYKKyAgICAgICAgKHZrX2Zvcm1hdF9nZXRfY29tcGF0aWJpbGl0eV9jbGFzcyh0YXJnZXQzMmJpdEZvcm1hdCkgIT0KKyAgICAgICAgIHZrX2Zvcm1hdF9nZXRfY29tcGF0aWJpbGl0eV9jbGFzcyhmb3JtYXQpKSkgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCgzICE9IG51bUNoYW5uZWxzKSAmJiAoNCAhPSBudW1DaGFubmVscykpIHsKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2VuZXJhbCBBcHByb2FjaAorICAgIC8vCisgICAgLy8gVGhlIGlkZWEgaGVyZSBpcyB0byBjb3B5L2NvbnZlcnQgdGhlIHN3YXBjaGFpbiBpbWFnZSBpbnRvIGFub3RoZXIgaW1hZ2UKKyAgICAvLyB0aGF0IGNhbiBiZSBtYXBwZWQgYW5kIHJlYWQgYnkgdGhlIENQVSB0byBwcm9kdWNlIGEgUFBNIGZpbGUuCisgICAgLy8gVGhlIGltYWdlIG11c3QgYmUgdW50aWxlZCBhbmQgY29udmVydGVkIHRvIGEgc3BlY2lmaWMgZm9ybWF0IGZvciBlYXN5CisgICAgLy8gcGFyc2luZy4gIFRoZSBtZW1vcnkgZm9yIHRoZSBmaW5hbCBpbWFnZSBtdXN0IGJlIGhvc3QtdmlzaWJsZS4KKyAgICAvLyBOb3RlIHRoYXQgaW4gVnVsa2FuLCBhIEJMSVQgb3BlcmF0aW9uIG11c3QgYmUgdXNlZCB0byBwZXJmb3JtIGEgZm9ybWF0CisgICAgLy8gY29udmVyc2lvbi4KKyAgICAvLworICAgIC8vIERldmljZXMgdmFyeSBpbiB0aGVpciBhYmlsaXR5IHRvIGJsaXQgdG8vZnJvbSBsaW5lYXIgYW5kIG9wdGltYWwgdGlsaW5nLgorICAgIC8vIFNvIHdlIG11c3QgcXVlcnkgdGhlIGRldmljZSBwcm9wZXJ0aWVzIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGRldmljZSBjYW5ub3QgQkxJVCB0byBhIExJTkVBUiBpbWFnZSwgdGhlbiB0aGUgb3BlcmF0aW9uIG11c3QgYmUKKyAgICAvLyBkb25lIGluIHR3byBzdGVwczoKKyAgICAvLyAxKSBCTElUIHRoZSBzd2FwY2hhaW4gaW1hZ2UgKGltYWdlMSkgdG8gYSB0ZW1wIGltYWdlIChpbWFnZTIpIHRoYXQgaXMKKyAgICAvLyBjcmVhdGVkIHdpdGggVElMSU5HX09QVElNQUwuCisgICAgLy8gMikgQ09QWSBpbWFnZTIgdG8gYW5vdGhlciB0ZW1wIGltYWdlIChpbWFnZTMpIHRoYXQgaXMgY3JlYXRlZCB3aXRoCisgICAgLy8gVElMSU5HX0xJTkVBUi4KKyAgICAvLyAzKSBNYXAgaW1hZ2UgMyBhbmQgd3JpdGUgdGhlIFBQTSBmaWxlLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGRldmljZSBjYW4gQkxJVCB0byBhIExJTkVBUiBpbWFnZSwgdGhlbjoKKyAgICAvLyAxKSBCTElUIHRoZSBzd2FwY2hhaW4gaW1hZ2UgKGltYWdlMSkgdG8gYSB0ZW1wIGltYWdlIChpbWFnZTIpIHRoYXQgaXMKKyAgICAvLyBjcmVhdGVkIHdpdGggVElMSU5HX0xJTkVBUi4KKyAgICAvLyAyKSBNYXAgaW1hZ2UgMiBhbmQgd3JpdGUgdGhlIFBQTSBmaWxlLgorICAgIC8vCisgICAgLy8gVGhlcmUgc2VlbXMgdG8gYmUgbm8gd2F5IHRvIHRlbGwgaWYgdGhlIHN3YXBjaGFpbiBpbWFnZSAoaW1hZ2UxKSBpcyB0aWxlZAorICAgIC8vIG9yIG5vdC4gIFdlIHRoZXJlZm9yZSBhc3N1bWUgdGhhdCB0aGUgQkxJVCBvcGVyYXRpb24gY2FuIGFsd2F5cyByZWFkIGZyb20KKyAgICAvLyBib3RoIGxpbmVhciBhbmQgb3B0aW1hbCB0aWxlZCAoc3dhcGNoYWluKSBpbWFnZXMuCisgICAgLy8gVGhlcmUgaXMgdGhlcmVmb3JlIG5vIHBvaW50IGluIGxvb2tpbmcgYXQgdGhlIEJMSVRfU1JDIHByb3BlcnRpZXMuCisgICAgLy8KKyAgICAvLyBUaGVyZSBpcyBhbHNvIHRoZSBvcHRpbWl6YXRpb24gd2hlcmUgdGhlIGluY29taW5nIGFuZCB0YXJnZXQgZm9ybWF0cyBhcmUKKyAgICAvLyB0aGUgc2FtZS4gIEluIHRoaXMgY2FzZSwganVzdCBkbyBhIENPUFkuCisKKyAgICBWa0Zvcm1hdFByb3BlcnRpZXMgdGFyZ2V0Rm9ybWF0UHJvcHM7CisgICAgcEluc3RhbmNlVGFibGUtPkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcygKKyAgICAgICAgcGh5c2ljYWxEZXZpY2UsCisgICAgICAgICgzID09IG51bUNoYW5uZWxzKSA/IHRhcmdldDI0Yml0Rm9ybWF0IDogdGFyZ2V0MzJiaXRGb3JtYXQsCisgICAgICAgICZ0YXJnZXRGb3JtYXRQcm9wcyk7CisgICAgYm9vbCBuZWVkMnN0ZXBzID0gZmFsc2U7CisgICAgYm9vbCBjb3B5T25seSA9IGZhbHNlOworICAgIGlmICgodGFyZ2V0MjRiaXRGb3JtYXQgPT0gZm9ybWF0KSB8fCAodGFyZ2V0MzJiaXRGb3JtYXQgPT0gZm9ybWF0KSkgeworICAgICAgICBjb3B5T25seSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBjb25zdCBibHRMaW5lYXIgPSB0YXJnZXRGb3JtYXRQcm9wcy5saW5lYXJUaWxpbmdGZWF0dXJlcyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19GT1JNQVRfRkVBVFVSRV9CTElUX0RTVF9CSVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CisgICAgICAgIGJvb2wgY29uc3QgYmx0T3B0aW1hbCA9IHRhcmdldEZvcm1hdFByb3BzLm9wdGltYWxUaWxpbmdGZWF0dXJlcyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX0ZFQVRVUkVfQkxJVF9EU1RfQklUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CisgICAgICAgIGlmICghYmx0TGluZWFyICYmICFibHRPcHRpbWFsKSB7CisgICAgICAgICAgICAvLyBDYW5ub3QgYmxpdCB0byBlaXRoZXIgdGFyZ2V0IHRpbGluZyB0eXBlLiAgSXQgc2hvdWxkIGJlIHByZXR0eQorICAgICAgICAgICAgLy8gdW5saWtlbHkgdG8gaGF2ZSBhIGRldmljZSB0aGF0IGNhbm5vdCBibGl0IHRvIGVpdGhlciB0eXBlLgorICAgICAgICAgICAgLy8gQnV0IHB1bnQgYnkganVzdCBkb2luZyBhIGNvcHkgYW5kIHBvc3NpYmx5IGhhdmUgdGhlIHdyb25nCisgICAgICAgICAgICAvLyBjb2xvcnMuICBUaGlzIHNob3VsZCBiZSBxdWl0ZSByYXJlLgorICAgICAgICAgICAgY29weU9ubHkgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFibHRMaW5lYXIgJiYgYmx0T3B0aW1hbCkgeworICAgICAgICAgICAgLy8gQ2Fubm90IGJsaXQgdG8gYSBsaW5lYXIgdGFyZ2V0IGJ1dCBjYW4gYmx0IHRvIG9wdGltYWwsIHNvIGNvcHkKKyAgICAgICAgICAgIC8vIGFmdGVyIGJsaXQgaXMgbmVlZGVkLgorICAgICAgICAgICAgbmVlZDJzdGVwcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gRWxzZSBibHRMaW5lYXIgaXMgYXZhaWxhYmxlIGFuZCBvbmx5IDEgc3RlcCBpcyBuZWVkZWQuCisgICAgfQorCisgICAgLy8gUHV0IHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgY2xlYW5lZCB1cCBpbiBhIHN0cnVjdCB3aXRoIGEgZGVzdHJ1Y3RvcgorICAgIC8vIHNvIHRoYXQgdGhpbmdzIGdldCBjbGVhbmVkIHVwIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBleGl0ZWQuCisgICAgV3JpdGVQUE1DbGVhbnVwRGF0YSBkYXRhID0ge307CisgICAgZGF0YS5kZXZpY2UgPSBkZXZpY2U7CisgICAgZGF0YS5wVGFibGVEZXZpY2UgPSBwVGFibGVEZXZpY2U7CisKKyAgICAvLyBTZXQgdXAgdGhlIGltYWdlIGNyZWF0aW9uIGluZm8gZm9yIGJvdGggdGhlIGJsaXQgYW5kIGNvcHkgaW1hZ2VzLCBpbiBjYXNlCisgICAgLy8gYm90aCBhcmUgbmVlZGVkLgorICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltZ0NyZWF0ZUluZm8yID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgTlVMTCwKKyAgICAgICAgMCwKKyAgICAgICAgVktfSU1BR0VfVFlQRV8yRCwKKyAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLAorICAgICAgICB7d2lkdGgsIGhlaWdodCwgMX0sCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgVktfSU1BR0VfVElMSU5HX0xJTkVBUiwKKyAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwKKyAgICAgICAgVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgMCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICB9OworICAgIFZrSW1hZ2VDcmVhdGVJbmZvIGltZ0NyZWF0ZUluZm8zID0gaW1nQ3JlYXRlSW5mbzI7CisKKyAgICAvLyBJZiB3ZSBuZWVkIGJvdGggaW1hZ2VzLCBzZXQgdXAgaW1hZ2UyIHRvIGJlIHJlYWQvd3JpdGUgYW5kIHRpbGVkLgorICAgIGlmIChuZWVkMnN0ZXBzKSB7CisgICAgICAgIGltZ0NyZWF0ZUluZm8yLnRpbGluZyA9IFZLX0lNQUdFX1RJTElOR19PUFRJTUFMOworICAgICAgICBpbWdDcmVhdGVJbmZvMi51c2FnZSA9CisgICAgICAgICAgICBWS19JTUFHRV9VU0FHRV9UUkFOU0ZFUl9TUkNfQklUIHwgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVDsKKyAgICB9CisKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBtZW1BbGxvY0luZm8gPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPLCBOVUxMLAorICAgICAgICAwLCAvLyBhbGxvY2F0aW9uU2l6ZSwgcXVlcmllZCBsYXRlcgorICAgICAgICAwICAvLyBtZW1vcnlUeXBlSW5kZXgsIHF1ZXJpZWQgbGF0ZXIKKyAgICB9OworICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzIG1lbVJlcXVpcmVtZW50czsKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlQcm9wZXJ0aWVzOworCisgICAgLy8gQ3JlYXRlIGltYWdlMiBhbmQgYWxsb2NhdGUgaXRzIG1lbW9yeS4gIEl0IGNvdWxkIGJlIHRoZSBpbnRlcm1lZGlhdGUgb3IKKyAgICAvLyBmaW5hbCBpbWFnZS4KKyAgICBlcnIgPQorICAgICAgICBwVGFibGVEZXZpY2UtPkNyZWF0ZUltYWdlKGRldmljZSwgJmltZ0NyZWF0ZUluZm8yLCBOVUxMLCAmZGF0YS5pbWFnZTIpOworICAgIGFzc2VydCghZXJyKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSBlcnIpCisgICAgICAgIHJldHVybjsKKyAgICBwVGFibGVEZXZpY2UtPkdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKGRldmljZSwgZGF0YS5pbWFnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVtUmVxdWlyZW1lbnRzKTsKKyAgICBtZW1BbGxvY0luZm8uYWxsb2NhdGlvblNpemUgPSBtZW1SZXF1aXJlbWVudHMuc2l6ZTsKKyAgICBwSW5zdGFuY2VUYWJsZS0+R2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbW9yeVByb3BlcnRpZXMpOworICAgIHBhc3MgPSBtZW1vcnlfdHlwZV9mcm9tX3Byb3BlcnRpZXMoCisgICAgICAgICZtZW1vcnlQcm9wZXJ0aWVzLCBtZW1SZXF1aXJlbWVudHMubWVtb3J5VHlwZUJpdHMsCisgICAgICAgIG5lZWQyc3RlcHMgPyBWS19NRU1PUllfUFJPUEVSVFlfREVWSUNFX0xPQ0FMX0JJVAorICAgICAgICAgICAgICAgICAgIDogVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQsCisgICAgICAgICZtZW1BbGxvY0luZm8ubWVtb3J5VHlwZUluZGV4KTsKKyAgICBhc3NlcnQocGFzcyk7CisgICAgZXJyID0gcFRhYmxlRGV2aWNlLT5BbGxvY2F0ZU1lbW9yeShkZXZpY2UsICZtZW1BbGxvY0luZm8sIE5VTEwsICZkYXRhLm1lbTIpOworICAgIGFzc2VydCghZXJyKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSBlcnIpCisgICAgICAgIHJldHVybjsKKyAgICBlcnIgPSBwVGFibGVRdWV1ZS0+QmluZEltYWdlTWVtb3J5KGRldmljZSwgZGF0YS5pbWFnZTIsIGRhdGEubWVtMiwgMCk7CisgICAgYXNzZXJ0KCFlcnIpOworICAgIGlmIChWS19TVUNDRVNTICE9IGVycikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQ3JlYXRlIGltYWdlMyBhbmQgYWxsb2NhdGUgaXRzIG1lbW9yeSwgaWYgbmVlZGVkLgorICAgIGlmIChuZWVkMnN0ZXBzKSB7CisgICAgICAgIGVyciA9IHBUYWJsZURldmljZS0+Q3JlYXRlSW1hZ2UoZGV2aWNlLCAmaW1nQ3JlYXRlSW5mbzMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEuaW1hZ2UzKTsKKyAgICAgICAgYXNzZXJ0KCFlcnIpOworICAgICAgICBpZiAoVktfU1VDQ0VTUyAhPSBlcnIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHBUYWJsZURldmljZS0+R2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMoZGV2aWNlLCBkYXRhLmltYWdlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVtUmVxdWlyZW1lbnRzKTsKKyAgICAgICAgbWVtQWxsb2NJbmZvLmFsbG9jYXRpb25TaXplID0gbWVtUmVxdWlyZW1lbnRzLnNpemU7CisgICAgICAgIHBJbnN0YW5jZVRhYmxlLT5HZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbW9yeVByb3BlcnRpZXMpOworICAgICAgICBwYXNzID0gbWVtb3J5X3R5cGVfZnJvbV9wcm9wZXJ0aWVzKAorICAgICAgICAgICAgJm1lbW9yeVByb3BlcnRpZXMsIG1lbVJlcXVpcmVtZW50cy5tZW1vcnlUeXBlQml0cywKKyAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklULCAmbWVtQWxsb2NJbmZvLm1lbW9yeVR5cGVJbmRleCk7CisgICAgICAgIGFzc2VydChwYXNzKTsKKyAgICAgICAgZXJyID0gcFRhYmxlRGV2aWNlLT5BbGxvY2F0ZU1lbW9yeShkZXZpY2UsICZtZW1BbGxvY0luZm8sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEubWVtMyk7CisgICAgICAgIGFzc2VydCghZXJyKTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gZXJyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBlcnIgPSBwVGFibGVRdWV1ZS0+QmluZEltYWdlTWVtb3J5KGRldmljZSwgZGF0YS5pbWFnZTMsIGRhdGEubWVtMywgMCk7CisgICAgICAgIGFzc2VydCghZXJyKTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gZXJyKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNldCB1cCB0aGUgY29tbWFuZCBidWZmZXIuICBXZSBnZXQgYSBjb21tYW5kIGJ1ZmZlciBmcm9tIGEgcG9vbCB3ZSBzYXZlZAorICAgIC8vIGluIGEgaG9va2VkIGZ1bmN0aW9uLCB3aGljaCB3b3VsZCBiZSB0aGUgYXBwbGljYXRpb24ncyBwb29sLgorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyBhbGxvY0NvbW1hbmRCdWZmZXJJbmZvID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9BTExPQ0FURV9JTkZPLCBOVUxMLAorICAgICAgICBkZXZpY2VNYXBbZGV2aWNlXS0+Y29tbWFuZFBvb2wsIFZLX0NPTU1BTkRfQlVGRkVSX0xFVkVMX1BSSU1BUlksIDF9OworICAgIGRhdGEuY29tbWFuZFBvb2wgPSBkZXZpY2VNYXBbZGV2aWNlXS0+Y29tbWFuZFBvb2w7CisgICAgZXJyID0gcFRhYmxlRGV2aWNlLT5BbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgJmFsbG9jQ29tbWFuZEJ1ZmZlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLmNvbW1hbmRCdWZmZXIpOworICAgIGFzc2VydCghZXJyKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSBlcnIpCisgICAgICAgIHJldHVybjsKKworICAgIFZrRGV2aWNlIGNtZEJ1ZiA9CisgICAgICAgIHN0YXRpY19jYXN0PFZrRGV2aWNlPihzdGF0aWNfY2FzdDx2b2lkICo+KGRhdGEuY29tbWFuZEJ1ZmZlcikpOworICAgIGRldmljZU1hcC5lbXBsYWNlKGNtZEJ1ZiwgZGV2TWFwKTsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcFRhYmxlQ29tbWFuZEJ1ZmZlcjsKKyAgICBwVGFibGVDb21tYW5kQnVmZmVyID0gZ2V0X2Rldl9pbmZvKGNtZEJ1ZiktPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKworICAgIC8vIFdlIGhhdmUganVzdCBjcmVhdGVkIGEgZGlzcGF0Y2hhYmxlIG9iamVjdCwgYnV0IHRoZSBkaXNwYXRjaCB0YWJsZSBoYXMKKyAgICAvLyBub3QgYmVlbiBwbGFjZWQgaW4gdGhlIG9iamVjdCB5ZXQuICBXaGVuIGEgIm5vcm1hbCIgYXBwbGljYXRpb24gY3JlYXRlcworICAgIC8vIGEgY29tbWFuZCBidWZmZXIsIHRoZSBkaXNwYXRjaCB0YWJsZSBpcyBpbnN0YWxsZWQgYnkgdGhlIHRvcC1sZXZlbCBhcGkKKyAgICAvLyBiaW5kaW5nICh0cmFtcG9saW5lLmMpLiBCdXQgaGVyZSwgd2UgaGF2ZSB0byBkbyBpdCBvdXJzZWx2ZXMuCisgICAgaWYgKCFkZXZNYXAtPnBmbl9kZXZfaW5pdCkgeworICAgICAgICAqKChjb25zdCB2b2lkICoqKWRhdGEuY29tbWFuZEJ1ZmZlcikgPSAqKHZvaWQgKiopZGV2aWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IGRldk1hcC0+cGZuX2Rldl9pbml0KGRldmljZSwgKHZvaWQgKilkYXRhLmNvbW1hbmRCdWZmZXIpOworICAgICAgICBhc3NlcnQoIWVycik7CisgICAgfQorCisgICAgY29uc3QgVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvIGNvbW1hbmRCdWZmZXJCZWdpbkluZm8gPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sIE5VTEwsCisgICAgICAgIFZLX0NPTU1BTkRfQlVGRkVSX1VTQUdFX09ORV9USU1FX1NVQk1JVF9CSVQsCisgICAgfTsKKyAgICBlcnIgPSBwVGFibGVDb21tYW5kQnVmZmVyLT5CZWdpbkNvbW1hbmRCdWZmZXIoZGF0YS5jb21tYW5kQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZEJ1ZmZlckJlZ2luSW5mbyk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgLy8gVGhpcyBiYXJyaWVyIGlzIHVzZWQgdG8gdHJhbnNpdGlvbiBmcm9tL3RvIHByZXNlbnQgTGF5b3V0CisgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgcHJlc2VudE1lbW9yeUJhcnJpZXIgPSB7CisgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9CQVJSSUVSLAorICAgICAgICBOVUxMLAorICAgICAgICBWS19BQ0NFU1NfVFJBTlNGRVJfV1JJVEVfQklULAorICAgICAgICBWS19BQ0NFU1NfVFJBTlNGRVJfUkVBRF9CSVQsCisgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFIsCisgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCwKKyAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgIFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICBpbWFnZTEsCisgICAgICAgIHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAxfX07CisKKyAgICAvLyBUaGlzIGJhcnJpZXIgaXMgdXNlZCB0byB0cmFuc2l0aW9uIGZyb20gYSBuZXdseS1jcmVhdGVkIGxheW91dCB0byBhIGJsdAorICAgIC8vIG9yIGNvcHkgZGVzdGluYXRpb24gbGF5b3V0LgorICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGRlc3RNZW1vcnlCYXJyaWVyID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgMCwKKyAgICAgICAgVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCwKKyAgICAgICAgVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICAgICAgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLAorICAgICAgICBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwKKyAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgIGRhdGEuaW1hZ2UyLAorICAgICAgICB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMX19OworCisgICAgLy8gVGhpcyBiYXJyaWVyIGlzIHVzZWQgdG8gdHJhbnNpdGlvbiBhIGRlc3QgbGF5b3V0IHRvIGdlbmVyYWwgbGF5b3V0LgorICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyIGdlbmVyYWxNZW1vcnlCYXJyaWVyID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgVktfQUNDRVNTX1RSQU5TRkVSX1dSSVRFX0JJVCwKKyAgICAgICAgVktfQUNDRVNTX1RSQU5TRkVSX1JFQURfQklULAorICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfRFNUX09QVElNQUwsCisgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9HRU5FUkFMLAorICAgICAgICBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCwKKyAgICAgICAgVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgIGRhdGEuaW1hZ2UyLAorICAgICAgICB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMSwgMCwgMX19OworCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VzID0gVktfUElQRUxJTkVfU1RBR0VfVFJBTlNGRVJfQklUOworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlcyA9IFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVDsKKworICAgIC8vIFRoZSBzb3VyY2UgaW1hZ2UgbmVlZHMgdG8gYmUgdHJhbnNpdGlvbmVkIGZyb20gcHJlc2VudCB0byB0cmFuc2ZlcgorICAgIC8vIHNvdXJjZS4KKyAgICBwVGFibGVDb21tYW5kQnVmZmVyLT5DbWRQaXBlbGluZUJhcnJpZXIoZGF0YS5jb21tYW5kQnVmZmVyLCBzcmNTdGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlcywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNlbnRNZW1vcnlCYXJyaWVyKTsKKworICAgIC8vIGltYWdlMiBuZWVkcyB0byBiZSB0cmFuc2l0aW9uZWQgZnJvbSBpdHMgdW5kZWZpbmVkIHN0YXRlIHRvIHRyYW5zZmVyCisgICAgLy8gZGVzdGluYXRpb24uCisgICAgcFRhYmxlQ29tbWFuZEJ1ZmZlci0+Q21kUGlwZWxpbmVCYXJyaWVyKGRhdGEuY29tbWFuZEJ1ZmZlciwgc3JjU3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZXMsIDAsIDAsIE5VTEwsIDAsIE5VTEwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0TWVtb3J5QmFycmllcik7CisKKyAgICBjb25zdCBWa0ltYWdlQ29weSBpbWFnZUNvcHlSZWdpb24gPSB7e1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDAsIDAsIDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAwLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7d2lkdGgsIGhlaWdodCwgMX19OworCisgICAgaWYgKGNvcHlPbmx5KSB7CisgICAgICAgIHBUYWJsZUNvbW1hbmRCdWZmZXItPkNtZENvcHlJbWFnZSgKKyAgICAgICAgICAgIGRhdGEuY29tbWFuZEJ1ZmZlciwgaW1hZ2UxLCBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsCisgICAgICAgICAgICBkYXRhLmltYWdlMiwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX0RTVF9PUFRJTUFMLCAxLAorICAgICAgICAgICAgJmltYWdlQ29weVJlZ2lvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVmtJbWFnZUJsaXQgaW1hZ2VCbGl0UmVnaW9uID0ge307CisgICAgICAgIGltYWdlQmxpdFJlZ2lvbi5zcmNTdWJyZXNvdXJjZS5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVDsKKyAgICAgICAgaW1hZ2VCbGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmJhc2VBcnJheUxheWVyID0gMDsKKyAgICAgICAgaW1hZ2VCbGl0UmVnaW9uLnNyY1N1YnJlc291cmNlLmxheWVyQ291bnQgPSAxOworICAgICAgICBpbWFnZUJsaXRSZWdpb24uc3JjU3VicmVzb3VyY2UubWlwTGV2ZWwgPSAwOworICAgICAgICBpbWFnZUJsaXRSZWdpb24uc3JjT2Zmc2V0c1sxXS54ID0gd2lkdGg7CisgICAgICAgIGltYWdlQmxpdFJlZ2lvbi5zcmNPZmZzZXRzWzFdLnkgPSBoZWlnaHQ7CisgICAgICAgIGltYWdlQmxpdFJlZ2lvbi5zcmNPZmZzZXRzWzFdLnogPSAxOworICAgICAgICBpbWFnZUJsaXRSZWdpb24uZHN0U3VicmVzb3VyY2UuYXNwZWN0TWFzayA9IFZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQ7CisgICAgICAgIGltYWdlQmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5iYXNlQXJyYXlMYXllciA9IDA7CisgICAgICAgIGltYWdlQmxpdFJlZ2lvbi5kc3RTdWJyZXNvdXJjZS5sYXllckNvdW50ID0gMTsKKyAgICAgICAgaW1hZ2VCbGl0UmVnaW9uLmRzdFN1YnJlc291cmNlLm1pcExldmVsID0gMDsKKyAgICAgICAgaW1hZ2VCbGl0UmVnaW9uLmRzdE9mZnNldHNbMV0ueCA9IHdpZHRoOworICAgICAgICBpbWFnZUJsaXRSZWdpb24uZHN0T2Zmc2V0c1sxXS55ID0gaGVpZ2h0OworICAgICAgICBpbWFnZUJsaXRSZWdpb24uZHN0T2Zmc2V0c1sxXS56ID0gMTsKKworICAgICAgICBwVGFibGVDb21tYW5kQnVmZmVyLT5DbWRCbGl0SW1hZ2UoCisgICAgICAgICAgICBkYXRhLmNvbW1hbmRCdWZmZXIsIGltYWdlMSwgVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMLAorICAgICAgICAgICAgZGF0YS5pbWFnZTIsIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwKKyAgICAgICAgICAgICZpbWFnZUJsaXRSZWdpb24sIFZLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICAgICAgaWYgKG5lZWQyc3RlcHMpIHsKKyAgICAgICAgICAgIC8vIGltYWdlIDMgbmVlZHMgdG8gYmUgdHJhbnNpdGlvbmVkIGZyb20gaXRzIHVuZGVmaW5lZCBzdGF0ZSB0byBhCisgICAgICAgICAgICAvLyB0cmFuc2ZlciBkZXN0aW5hdGlvbi4KKyAgICAgICAgICAgIGRlc3RNZW1vcnlCYXJyaWVyLmltYWdlID0gZGF0YS5pbWFnZTM7CisgICAgICAgICAgICBwVGFibGVDb21tYW5kQnVmZmVyLT5DbWRQaXBlbGluZUJhcnJpZXIoCisgICAgICAgICAgICAgICAgZGF0YS5jb21tYW5kQnVmZmVyLCBzcmNTdGFnZXMsIGRzdFN0YWdlcywgMCwgMCwgTlVMTCwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAxLCAmZGVzdE1lbW9yeUJhcnJpZXIpOworCisgICAgICAgICAgICAvLyBUcmFuc2l0aW9uIGltYWdlMiBzbyB0aGF0IGl0IGNhbiBiZSByZWFkIGZvciB0aGUgdXBjb21pbmcgY29weSB0bworICAgICAgICAgICAgLy8gaW1hZ2UgMy4KKyAgICAgICAgICAgIGRlc3RNZW1vcnlCYXJyaWVyLm9sZExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTDsKKyAgICAgICAgICAgIGRlc3RNZW1vcnlCYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTDsKKyAgICAgICAgICAgIGRlc3RNZW1vcnlCYXJyaWVyLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfVFJBTlNGRVJfV1JJVEVfQklUOworICAgICAgICAgICAgZGVzdE1lbW9yeUJhcnJpZXIuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVDsKKyAgICAgICAgICAgIGRlc3RNZW1vcnlCYXJyaWVyLmltYWdlID0gZGF0YS5pbWFnZTI7CisgICAgICAgICAgICBwVGFibGVDb21tYW5kQnVmZmVyLT5DbWRQaXBlbGluZUJhcnJpZXIoCisgICAgICAgICAgICAgICAgZGF0YS5jb21tYW5kQnVmZmVyLCBzcmNTdGFnZXMsIGRzdFN0YWdlcywgMCwgMCwgTlVMTCwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAxLCAmZGVzdE1lbW9yeUJhcnJpZXIpOworCisgICAgICAgICAgICAvLyBUaGlzIHN0ZXAgZXNzZW50aWFsbHkgdW50aWxlcyB0aGUgaW1hZ2UuCisgICAgICAgICAgICBwVGFibGVDb21tYW5kQnVmZmVyLT5DbWRDb3B5SW1hZ2UoCisgICAgICAgICAgICAgICAgZGF0YS5jb21tYW5kQnVmZmVyLCBkYXRhLmltYWdlMiwKKyAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsIGRhdGEuaW1hZ2UzLAorICAgICAgICAgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9EU1RfT1BUSU1BTCwgMSwgJmltYWdlQ29weVJlZ2lvbik7CisgICAgICAgICAgICBnZW5lcmFsTWVtb3J5QmFycmllci5pbWFnZSA9IGRhdGEuaW1hZ2UzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIGRlc3RpbmF0aW9uIG5lZWRzIHRvIGJlIHRyYW5zaXRpb25lZCBmcm9tIHRoZSBvcHRpbWFsIGNvcHkgZm9ybWF0IHRvCisgICAgLy8gdGhlIGZvcm1hdCB3ZSBjYW4gcmVhZCB3aXRoIHRoZSBDUFUuCisgICAgcFRhYmxlQ29tbWFuZEJ1ZmZlci0+Q21kUGlwZWxpbmVCYXJyaWVyKGRhdGEuY29tbWFuZEJ1ZmZlciwgc3JjU3RhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZXMsIDAsIDAsIE5VTEwsIDAsIE5VTEwsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZW5lcmFsTWVtb3J5QmFycmllcik7CisKKyAgICAvLyBSZXN0b3JlIHRoZSBzd2FwIGNoYWluIGltYWdlIGxheW91dCB0byB3aGF0IGl0IHdhcyBiZWZvcmUuCisgICAgLy8gVGhpcyBtYXkgbm90IGJlIHN0cmljdGx5IG5lZWRlZCwgYnV0IGl0IGlzIGdlbmVyYWxseSBnb29kIHRvIHJlc3RvcmUKKyAgICAvLyB0aGluZ3MgdG8gb3JpZ2luYWwgc3RhdGUuCisgICAgcHJlc2VudE1lbW9yeUJhcnJpZXIub2xkTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1RSQU5TRkVSX1NSQ19PUFRJTUFMOworICAgIHByZXNlbnRNZW1vcnlCYXJyaWVyLm5ld0xheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9QUkVTRU5UX1NSQ19LSFI7CisgICAgcHJlc2VudE1lbW9yeUJhcnJpZXIuc3JjQWNjZXNzTWFzayA9IFZLX0FDQ0VTU19UUkFOU0ZFUl9SRUFEX0JJVDsKKyAgICBwcmVzZW50TWVtb3J5QmFycmllci5kc3RBY2Nlc3NNYXNrID0gMDsKKyAgICBwVGFibGVDb21tYW5kQnVmZmVyLT5DbWRQaXBlbGluZUJhcnJpZXIoZGF0YS5jb21tYW5kQnVmZmVyLCBzcmNTdGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlcywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNlbnRNZW1vcnlCYXJyaWVyKTsKKworICAgIGVyciA9IHBUYWJsZUNvbW1hbmRCdWZmZXItPkVuZENvbW1hbmRCdWZmZXIoZGF0YS5jb21tYW5kQnVmZmVyKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBWa0ZlbmNlIG51bGxGZW5jZSA9IHtWS19OVUxMX0hBTkRMRX07CisgICAgVmtTdWJtaXRJbmZvIHN1Ym1pdEluZm87CisgICAgc3VibWl0SW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NVQk1JVF9JTkZPOworICAgIHN1Ym1pdEluZm8ucE5leHQgPSBOVUxMOworICAgIHN1Ym1pdEluZm8ud2FpdFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRJbmZvLnBXYWl0U2VtYXBob3JlcyA9IE5VTEw7CisgICAgc3VibWl0SW5mby5wV2FpdERzdFN0YWdlTWFzayA9IE5VTEw7CisgICAgc3VibWl0SW5mby5jb21tYW5kQnVmZmVyQ291bnQgPSAxOworICAgIHN1Ym1pdEluZm8ucENvbW1hbmRCdWZmZXJzID0gJmRhdGEuY29tbWFuZEJ1ZmZlcjsKKyAgICBzdWJtaXRJbmZvLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMDsKKyAgICBzdWJtaXRJbmZvLnBTaWduYWxTZW1hcGhvcmVzID0gTlVMTDsKKworICAgIGVyciA9IHBUYWJsZVF1ZXVlLT5RdWV1ZVN1Ym1pdChxdWV1ZSwgMSwgJnN1Ym1pdEluZm8sIG51bGxGZW5jZSk7CisgICAgYXNzZXJ0KCFlcnIpOworCisgICAgZXJyID0gcFRhYmxlUXVldWUtPlF1ZXVlV2FpdElkbGUocXVldWUpOworICAgIGFzc2VydCghZXJyKTsKKworICAgIGVyciA9IHBUYWJsZURldmljZS0+RGV2aWNlV2FpdElkbGUoZGV2aWNlKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICAvLyBNYXAgdGhlIGZpbmFsIGltYWdlIHNvIHRoYXQgdGhlIENQVSBjYW4gcmVhZCBpdC4KKyAgICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2Ugc3IgPSB7VktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwgMCwgMH07CisgICAgVmtTdWJyZXNvdXJjZUxheW91dCBzckxheW91dDsKKyAgICBjb25zdCBjaGFyICpwdHI7CisgICAgaWYgKCFuZWVkMnN0ZXBzKSB7CisgICAgICAgIHBUYWJsZURldmljZS0+R2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChkZXZpY2UsIGRhdGEuaW1hZ2UyLCAmc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JMYXlvdXQpOworICAgICAgICBlcnIgPSBwVGFibGVEZXZpY2UtPk1hcE1lbW9yeShkZXZpY2UsIGRhdGEubWVtMiwgMCwgVktfV0hPTEVfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnB0cik7CisgICAgICAgIGFzc2VydCghZXJyKTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gZXJyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkYXRhLm1lbTJtYXBwZWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHBUYWJsZURldmljZS0+R2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dChkZXZpY2UsIGRhdGEuaW1hZ2UzLCAmc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JMYXlvdXQpOworICAgICAgICBlcnIgPSBwVGFibGVEZXZpY2UtPk1hcE1lbW9yeShkZXZpY2UsIGRhdGEubWVtMywgMCwgVktfV0hPTEVfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnB0cik7CisgICAgICAgIGFzc2VydCghZXJyKTsKKyAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gZXJyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkYXRhLm1lbTNtYXBwZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBkYXRhIHRvIGEgUFBNIGZpbGUuCisgICAgb2ZzdHJlYW0gZmlsZShmaWxlbmFtZSwgaW9zOjpiaW5hcnkpOworICAgIGFzc2VydChmaWxlLmlzX29wZW4oKSk7CisKKyAgICBpZiAoIWZpbGUuaXNfb3BlbigpKSB7CisjaWZkZWYgQU5EUk9JRAorICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLCAic2NyZWVuc2hvdCIsICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZTogJXMuICBCZSBzdXJlIHRvIGdyYW50IHJlYWQgYW5kIHdyaXRlIHBlcm1pc3Npb25zLiIsIGZpbGVuYW1lKTsKKyNlbmRpZgorICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmaWxlIDw8ICJQNlxuIjsKKyAgICBmaWxlIDw8IHdpZHRoIDw8ICJcbiI7CisgICAgZmlsZSA8PCBoZWlnaHQgPDwgIlxuIjsKKyAgICBmaWxlIDw8IDI1NSA8PCAiXG4iOworCisgICAgcHRyICs9IHNyTGF5b3V0Lm9mZnNldDsKKyAgICBpZiAoMyA9PSBudW1DaGFubmVscykgeworICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGZpbGUud3JpdGUocHRyLCAzICogd2lkdGgpOworICAgICAgICAgICAgcHRyICs9IHNyTGF5b3V0LnJvd1BpdGNoOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICg0ID09IG51bUNoYW5uZWxzKSB7CisgICAgICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpyb3cgPSAoY29uc3QgdW5zaWduZWQgaW50ICopcHRyOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmaWxlLndyaXRlKChjaGFyICopcm93LCAzKTsKKyAgICAgICAgICAgICAgICByb3crKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0ciArPSBzckxheW91dC5yb3dQaXRjaDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmaWxlLmNsb3NlKCk7CisKKyAgICAvLyBDbGVhbiB1cCBoYW5kbGVkIGJ5IH5Xcml0ZVBQTUNsZWFudXBEYXRhKCkKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCitDcmVhdGVJbnN0YW5jZShjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sCisgICAgICAgICAgICAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrSW5zdGFuY2UgKnBJbnN0YW5jZSkgeworICAgIFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmNoYWluX2luZm8gPQorICAgICAgICBnZXRfY2hhaW5faW5mbyhwQ3JlYXRlSW5mbywgVktfTEFZRVJfTElOS19JTkZPKTsKKworICAgIGFzc2VydChjaGFpbl9pbmZvLT51LnBMYXllckluZm8pOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBHZXRJbnN0YW5jZVByb2NBZGRyID0KKyAgICAgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBhc3NlcnQoZnBHZXRJbnN0YW5jZVByb2NBZGRyKTsKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcENyZWF0ZUluc3RhbmNlID0KKyAgICAgICAgKFBGTl92a0NyZWF0ZUluc3RhbmNlKWZwR2V0SW5zdGFuY2VQcm9jQWRkcihWS19OVUxMX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtDcmVhdGVJbnN0YW5jZSIpOworICAgIGlmIChmcENyZWF0ZUluc3RhbmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlSW5zdGFuY2UocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgaW5pdEluc3RhbmNlVGFibGUoKnBJbnN0YW5jZSwgZnBHZXRJbnN0YW5jZVByb2NBZGRyKTsKKworICAgIGluaXRfc2NyZWVuc2hvdCgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVE9ETyBob29rIERlc3Ryb3lJbnN0YW5jZSB0byBjbGVhbnVwCisKK3N0YXRpYyB2b2lkCitjcmVhdGVEZXZpY2VSZWdpc3RlckV4dGVuc2lvbnMoY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZSBkZXZpY2UpIHsKKyAgICB1aW50MzJfdCBpOworICAgIERldmljZU1hcFN0cnVjdCAqZGV2TWFwID0gZ2V0X2Rldl9pbmZvKGRldmljZSk7CisgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnBEaXNwID0gZGV2TWFwLT5kZXZpY2VfZGlzcGF0Y2hfdGFibGU7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ3BhID0gcERpc3AtPkdldERldmljZVByb2NBZGRyOworICAgIHBEaXNwLT5DcmVhdGVTd2FwY2hhaW5LSFIgPQorICAgICAgICAoUEZOX3ZrQ3JlYXRlU3dhcGNoYWluS0hSKWdwYShkZXZpY2UsICJ2a0NyZWF0ZVN3YXBjaGFpbktIUiIpOworICAgIHBEaXNwLT5HZXRTd2FwY2hhaW5JbWFnZXNLSFIgPQorICAgICAgICAoUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKWdwYShkZXZpY2UsICJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIpOworICAgIHBEaXNwLT5BY3F1aXJlTmV4dEltYWdlS0hSID0KKyAgICAgICAgKFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIpZ3BhKGRldmljZSwgInZrQWNxdWlyZU5leHRJbWFnZUtIUiIpOworICAgIHBEaXNwLT5RdWV1ZVByZXNlbnRLSFIgPQorICAgICAgICAoUEZOX3ZrUXVldWVQcmVzZW50S0hSKWdwYShkZXZpY2UsICJ2a1F1ZXVlUHJlc2VudEtIUiIpOworICAgIGRldk1hcC0+d3NpX2VuYWJsZWQgPSBmYWxzZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAocENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldLAorICAgICAgICAgICAgICAgICAgIFZLX0tIUl9TV0FQQ0hBSU5fRVhURU5TSU9OX05BTUUpID09IDApCisgICAgICAgICAgICBkZXZNYXAtPndzaV9lbmFibGVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorQ3JlYXRlRGV2aWNlKFZrUGh5c2ljYWxEZXZpY2UgZ3B1LCBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgICAgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtEZXZpY2UgKnBEZXZpY2UpIHsKKyAgICBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyAqY2hhaW5faW5mbyA9CisgICAgICAgIGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pOworCisgICAgYXNzZXJ0KGNoYWluX2luZm8tPnUucExheWVySW5mbyk7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBmcEdldEluc3RhbmNlUHJvY0FkZHIgPQorICAgICAgICBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGZwR2V0RGV2aWNlUHJvY0FkZHIgPQorICAgICAgICBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXREZXZpY2VQcm9jQWRkcjsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlID0gcGh5c0RldmljZU1hcFtncHVdLT5pbnN0YW5jZTsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgZnBDcmVhdGVEZXZpY2UgPQorICAgICAgICAoUEZOX3ZrQ3JlYXRlRGV2aWNlKWZwR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgInZrQ3JlYXRlRGV2aWNlIik7CisgICAgaWYgKGZwQ3JlYXRlRGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKworICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlRGV2aWNlKGdwdSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGFzc2VydChkZXZpY2VNYXAuZmluZCgqcERldmljZSkgPT0gZGV2aWNlTWFwLmVuZCgpKTsKKyAgICBEZXZpY2VNYXBTdHJ1Y3QgKmRldmljZU1hcEVsZW0gPSBuZXcgRGV2aWNlTWFwU3RydWN0OworICAgIGRldmljZU1hcFsqcERldmljZV0gPSBkZXZpY2VNYXBFbGVtOworCisgICAgLy8gU2V0dXAgZGV2aWNlIGRpc3BhdGNoIHRhYmxlCisgICAgZGV2aWNlTWFwRWxlbS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlID0gbmV3IFZrTGF5ZXJEaXNwYXRjaFRhYmxlOworICAgIGxheWVyX2luaXRfZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKAorICAgICAgICAqcERldmljZSwgZGV2aWNlTWFwRWxlbS0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlLCBmcEdldERldmljZVByb2NBZGRyKTsKKworICAgIGNyZWF0ZURldmljZVJlZ2lzdGVyRXh0ZW5zaW9ucyhwQ3JlYXRlSW5mbywgKnBEZXZpY2UpOworICAgIC8vIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBhIGRldmljZSB0byBhIHBoeXNpY2FsRGV2aWNlCisgICAgZGV2aWNlTWFwRWxlbS0+cGh5c2ljYWxEZXZpY2UgPSBncHU7CisKKyAgICAvLyBzdG9yZSB0aGUgbG9hZGVyIGNhbGxiYWNrIGZvciBpbml0aWFsaXppbmcgY3JlYXRlZCBkaXNwYXRjaGFibGUgb2JqZWN0cworICAgIGNoYWluX2luZm8gPSBnZXRfY2hhaW5faW5mbyhwQ3JlYXRlSW5mbywgVktfTE9BREVSX0RBVEFfQ0FMTEJBQ0spOworICAgIGlmIChjaGFpbl9pbmZvKSB7CisgICAgICAgIGRldmljZU1hcEVsZW0tPnBmbl9kZXZfaW5pdCA9IGNoYWluX2luZm8tPnUucGZuU2V0RGV2aWNlTG9hZGVyRGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2VNYXBFbGVtLT5wZm5fZGV2X2luaXQgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCAqcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZSAqcFBoeXNpY2FsRGV2aWNlcykgeworICAgIFZrUmVzdWx0IHJlc3VsdDsKKworICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnBUYWJsZSA9IGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlKTsKKyAgICByZXN1bHQgPSBwVGFibGUtPkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBoeXNpY2FsRGV2aWNlcyk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTICYmICpwUGh5c2ljYWxEZXZpY2VDb3VudCA+IDAgJiYgcFBoeXNpY2FsRGV2aWNlcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBQaHlzaWNhbERldmljZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBhIHBoeXNpY2FsRGV2aWNlIHRvIGFuIGluc3RhbmNlCisgICAgICAgICAgICBpZiAocGh5c0RldmljZU1hcFtwUGh5c2ljYWxEZXZpY2VzW2ldXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUGh5c0RldmljZU1hcFN0cnVjdCAqcGh5c0RldmljZU1hcEVsZW0gPQorICAgICAgICAgICAgICAgICAgICBuZXcgUGh5c0RldmljZU1hcFN0cnVjdDsKKyAgICAgICAgICAgICAgICBwaHlzRGV2aWNlTWFwW3BQaHlzaWNhbERldmljZXNbaV1dID0gcGh5c0RldmljZU1hcEVsZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaHlzRGV2aWNlTWFwW3BQaHlzaWNhbERldmljZXNbaV1dLT5pbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMCitEZXN0cm95RGV2aWNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzICpwQWxsb2NhdG9yKSB7CisgICAgRGV2aWNlTWFwU3RydWN0ICpkZXZNYXAgPSBnZXRfZGV2X2luZm8oZGV2aWNlKTsKKyAgICBhc3NlcnQoZGV2TWFwKTsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBkZXZNYXAtPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKyAgICBwRGlzcC0+RGVzdHJveURldmljZShkZXZpY2UsIHBBbGxvY2F0b3IpOworCisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKKyAgICBkZWxldGUgcERpc3A7CisgICAgZGVsZXRlIGRldk1hcDsKKworICAgIGRldmljZU1hcC5lcmFzZShkZXZpY2UpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKK30KKworVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgR2V0RGV2aWNlUXVldWUoVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcXVldWVOb2RlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtRdWV1ZSAqcFF1ZXVlKSB7CisgICAgRGV2aWNlTWFwU3RydWN0ICpkZXZNYXAgPSBnZXRfZGV2X2luZm8oZGV2aWNlKTsKKyAgICBhc3NlcnQoZGV2TWFwKTsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBkZXZNYXAtPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKyAgICBwRGlzcC0+R2V0RGV2aWNlUXVldWUoZGV2aWNlLCBxdWV1ZU5vZGVJbmRleCwgcXVldWVJbmRleCwgcFF1ZXVlKTsKKworICAgIC8vIFNhdmUgdGhlIGRldmljZSBxdWV1ZSBpbiBhIG1hcCBpZiB3ZSBhcmUgdGFraW5nIHNjcmVlbnNob3RzLgorICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmZ2xvYmFsTG9jayk7CisgICAgaWYgKHNjcmVlbnNob3RFbnZRdWVyaWVkICYmIHNjcmVlbnNob3RGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBObyBzY3JlZW5zaG90cyBpbiB0aGUgbGlzdCB0byB0YWtlCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrRGV2aWNlIHF1ZSA9IHN0YXRpY19jYXN0PFZrRGV2aWNlPihzdGF0aWNfY2FzdDx2b2lkICo+KCpwUXVldWUpKTsKKyAgICBkZXZpY2VNYXAuZW1wbGFjZShxdWUsIGRldk1hcCk7CisKKyAgICAvLyBDcmVhdGUgYSBtYXBwaW5nIGZyb20gYSBkZXZpY2UgdG8gYSBxdWV1ZQorICAgIGRldk1hcC0+cXVldWUgPSAqcFF1ZXVlOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIENyZWF0ZUNvbW1hbmRQb29sKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kUG9vbENyZWF0ZUluZm8gKnBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciwgVmtDb21tYW5kUG9vbCAqcENvbW1hbmRQb29sKSB7CisgICAgRGV2aWNlTWFwU3RydWN0ICpkZXZNYXAgPSBnZXRfZGV2X2luZm8oZGV2aWNlKTsKKyAgICBhc3NlcnQoZGV2TWFwKTsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBkZXZNYXAtPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPQorICAgICAgICBwRGlzcC0+Q3JlYXRlQ29tbWFuZFBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcENvbW1hbmRQb29sKTsKKworICAgIC8vIFNhdmUgdGhlIGNvbW1hbmQgcG9vbCBvbiBhIG1hcCBpZiB3ZSBhcmUgdGFraW5nIHNjcmVlbnNob3RzLgorICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmZ2xvYmFsTG9jayk7CisgICAgaWYgKHNjcmVlbnNob3RFbnZRdWVyaWVkICYmIHNjcmVlbnNob3RGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBObyBzY3JlZW5zaG90cyBpbiB0aGUgbGlzdCB0byB0YWtlCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBtYXBwaW5nIGZyb20gYSBkZXZpY2UgdG8gYSBjb21tYW5kUG9vbAorICAgIGRldk1hcC0+Y29tbWFuZFBvb2wgPSAqcENvbW1hbmRQb29sOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgQ3JlYXRlU3dhcGNoYWluS0hSKAorICAgIFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSICpwQ3JlYXRlSW5mbywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MgKnBBbGxvY2F0b3IsIFZrU3dhcGNoYWluS0hSICpwU3dhcGNoYWluKSB7CisKKyAgICBEZXZpY2VNYXBTdHJ1Y3QgKmRldk1hcCA9IGdldF9kZXZfaW5mbyhkZXZpY2UpOworICAgIGFzc2VydChkZXZNYXApOworICAgIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpwRGlzcCA9IGRldk1hcC0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlOworCisgICAgLy8gVGhpcyBsYXllciBkb2VzIGFuIGltYWdlIGNvcHkgbGF0ZXIgb24sIGFuZCB0aGUgY29weSBjb21tYW5kIGV4cGVjdHMgdGhlCisgICAgLy8gdHJhbnNmZXIgc3JjIGJpdCB0byBiZSBvbi4KKyAgICBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgbXlDcmVhdGVJbmZvID0gKnBDcmVhdGVJbmZvOworICAgIG15Q3JlYXRlSW5mby5pbWFnZVVzYWdlIHw9IFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX1NSQ19CSVQ7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gcERpc3AtPkNyZWF0ZVN3YXBjaGFpbktIUihkZXZpY2UsICZteUNyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLCBwU3dhcGNoYWluKTsKKworICAgIC8vIFNhdmUgdGhlIHN3YXBjaGFpbiBpbiBhIG1hcCBvZiB3ZSBhcmUgdGFraW5nIHNjcmVlbnNob3RzLgorICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmZ2xvYmFsTG9jayk7CisgICAgaWYgKHNjcmVlbnNob3RFbnZRdWVyaWVkICYmIHNjcmVlbnNob3RGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBObyBzY3JlZW5zaG90cyBpbiB0aGUgbGlzdCB0byB0YWtlCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgbWFwcGluZyBmb3IgYSBzd2FwY2hhaW4gdG8gYSBkZXZpY2UsIGltYWdlIGV4dGVudCwgYW5kCisgICAgICAgIC8vIGZvcm1hdAorICAgICAgICBTd2FwY2hhaW5NYXBTdHJ1Y3QgKnN3YXBjaGFpbk1hcEVsZW0gPSBuZXcgU3dhcGNoYWluTWFwU3RydWN0OworICAgICAgICBzd2FwY2hhaW5NYXBFbGVtLT5kZXZpY2UgPSBkZXZpY2U7CisgICAgICAgIHN3YXBjaGFpbk1hcEVsZW0tPmltYWdlRXh0ZW50ID0gcENyZWF0ZUluZm8tPmltYWdlRXh0ZW50OworICAgICAgICBzd2FwY2hhaW5NYXBFbGVtLT5mb3JtYXQgPSBwQ3JlYXRlSW5mby0+aW1hZ2VGb3JtYXQ7CisgICAgICAgIHN3YXBjaGFpbk1hcC5pbnNlcnQobWFrZV9wYWlyKCpwU3dhcGNoYWluLCBzd2FwY2hhaW5NYXBFbGVtKSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbWFwcGluZyBmb3IgdGhlIHN3YXBjaGFpbiBvYmplY3QgaW50byB0aGUgZGlzcGF0Y2ggdGFibGUKKyAgICAgICAgLy8gVE9ETyBpcyB0aGlzIG5lZWRlZD8gc2NyZWVuc2hvdF9kZXZpY2VfdGFibGVfbWFwLmVtcGxhY2UoKHZvaWQKKyAgICAgICAgLy8gKilwU3dhcGNoYWluLCBwVGFibGUpOworICAgIH0KKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmZ2xvYmFsTG9jayk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK0dldFN3YXBjaGFpbkltYWdlc0tIUihWa0RldmljZSBkZXZpY2UsIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENvdW50LCBWa0ltYWdlICpwU3dhcGNoYWluSW1hZ2VzKSB7CisgICAgRGV2aWNlTWFwU3RydWN0ICpkZXZNYXAgPSBnZXRfZGV2X2luZm8oZGV2aWNlKTsKKyAgICBhc3NlcnQoZGV2TWFwKTsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBkZXZNYXAtPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBwRGlzcC0+R2V0U3dhcGNoYWluSW1hZ2VzS0hSKGRldmljZSwgc3dhcGNoYWluLCBwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3dhcGNoYWluSW1hZ2VzKTsKKworICAgIC8vIFNhdmUgdGhlIHN3YXBjaGFpbiBpbWFnZXMgaW4gYSBtYXAgaWYgd2UgYXJlIHRha2luZyBzY3JlZW5zaG90cworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmZ2xvYmFsTG9jayk7CisgICAgaWYgKHNjcmVlbnNob3RFbnZRdWVyaWVkICYmIHNjcmVlbnNob3RGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBObyBzY3JlZW5zaG90cyBpbiB0aGUgbGlzdCB0byB0YWtlCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MgJiYgcFN3YXBjaGFpbkltYWdlcyAmJiAhc3dhcGNoYWluTWFwLmVtcHR5KCkgJiYKKyAgICAgICAgc3dhcGNoYWluTWFwLmZpbmQoc3dhcGNoYWluKSAhPSBzd2FwY2hhaW5NYXAuZW5kKCkpIHsKKyAgICAgICAgdW5zaWduZWQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKnBDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBtYXBwaW5nIGZvciBhbiBpbWFnZSB0byBhIGRldmljZSwgaW1hZ2UgZXh0ZW50LCBhbmQKKyAgICAgICAgICAgIC8vIGZvcm1hdAorICAgICAgICAgICAgaWYgKGltYWdlTWFwW3BTd2FwY2hhaW5JbWFnZXNbaV1dID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBJbWFnZU1hcFN0cnVjdCAqaW1hZ2VNYXBFbGVtID0gbmV3IEltYWdlTWFwU3RydWN0OworICAgICAgICAgICAgICAgIGltYWdlTWFwW3BTd2FwY2hhaW5JbWFnZXNbaV1dID0gaW1hZ2VNYXBFbGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1hZ2VNYXBbcFN3YXBjaGFpbkltYWdlc1tpXV0tPmRldmljZSA9CisgICAgICAgICAgICAgICAgc3dhcGNoYWluTWFwW3N3YXBjaGFpbl0tPmRldmljZTsKKyAgICAgICAgICAgIGltYWdlTWFwW3BTd2FwY2hhaW5JbWFnZXNbaV1dLT5pbWFnZUV4dGVudCA9CisgICAgICAgICAgICAgICAgc3dhcGNoYWluTWFwW3N3YXBjaGFpbl0tPmltYWdlRXh0ZW50OworICAgICAgICAgICAgaW1hZ2VNYXBbcFN3YXBjaGFpbkltYWdlc1tpXV0tPmZvcm1hdCA9CisgICAgICAgICAgICAgICAgc3dhcGNoYWluTWFwW3N3YXBjaGFpbl0tPmZvcm1hdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBsaXN0IG9mIGltYWdlcyB0byBzd2FwY2hhaW4gdG8gaW1hZ2UgbWFwCisgICAgICAgIFN3YXBjaGFpbk1hcFN0cnVjdCAqc3dhcGNoYWluTWFwRWxlbSA9IHN3YXBjaGFpbk1hcFtzd2FwY2hhaW5dOworICAgICAgICBpZiAoaSA+PSAxICYmIHN3YXBjaGFpbk1hcEVsZW0pIHsKKyAgICAgICAgICAgIFZrSW1hZ2UgKmltYWdlTGlzdCA9IG5ldyBWa0ltYWdlW2ldOworICAgICAgICAgICAgc3dhcGNoYWluTWFwRWxlbS0+aW1hZ2VMaXN0ID0gaW1hZ2VMaXN0OworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgIHN3YXBjaGFpbk1hcEVsZW0tPmltYWdlTGlzdFtqXSA9IHBTd2FwY2hhaW5JbWFnZXNbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmdsb2JhbExvY2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAorUXVldWVQcmVzZW50S0hSKFZrUXVldWUgcXVldWUsIGNvbnN0IFZrUHJlc2VudEluZm9LSFIgKnBQcmVzZW50SW5mbykgeworICAgIHN0YXRpYyBpbnQgZnJhbWVOdW1iZXIgPSAwOworICAgIGlmIChmcmFtZU51bWJlciA9PSAxMCkgeworICAgICAgICBmZmx1c2goc3Rkb3V0KTsgLyogKigoaW50KikwKT0wOyAqLworICAgIH0KKyAgICBEZXZpY2VNYXBTdHJ1Y3QgKmRldk1hcCA9IGdldF9kZXZfaW5mbygoVmtEZXZpY2UpcXVldWUpOworICAgIGFzc2VydChkZXZNYXApOworICAgIFZrTGF5ZXJEaXNwYXRjaFRhYmxlICpwRGlzcCA9IGRldk1hcC0+ZGV2aWNlX2Rpc3BhdGNoX3RhYmxlOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IHBEaXNwLT5RdWV1ZVByZXNlbnRLSFIocXVldWUsIHBQcmVzZW50SW5mbyk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZnbG9iYWxMb2NrKTsKKworICAgIGlmICghc2NyZWVuc2hvdEVudlF1ZXJpZWQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqX3ZrX3NjcmVlbnNob3QgPSBsb2NhbF9nZXRlbnYoZW52X3Zhcik7CisgICAgICAgIGlmIChfdmtfc2NyZWVuc2hvdCAmJiAqX3ZrX3NjcmVlbnNob3QpIHsKKyAgICAgICAgICAgIHN0cmluZyBzcGVjKF92a19zY3JlZW5zaG90KSwgd29yZDsKKyAgICAgICAgICAgIHNpemVfdCBzdGFydCA9IDAsIGNvbW1hID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgc3BlYy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWVUb0FkZDsKKyAgICAgICAgICAgICAgICBjb21tYSA9IHNwZWMuZmluZCgnLCcsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWEgPT0gc3RyaW5nOjpucG9zKQorICAgICAgICAgICAgICAgICAgICB3b3JkID0gc3RyaW5nKHNwZWMsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdvcmQgPSBzdHJpbmcoc3BlYywgc3RhcnQsIGNvbW1hIC0gc3RhcnQpOworICAgICAgICAgICAgICAgIGZyYW1lVG9BZGQgPSBhdG9pKHdvcmQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBmcmFtZSBudW1iZXIgdG8gc2V0LCBidXQgb25seSBkbyBpdCBpZiB0aGUgd29yZAorICAgICAgICAgICAgICAgIC8vIHN0YXJ0ZWQgd2l0aCBhIGRpZ2l0IGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICBpZiAoKih3b3JkLmNfc3RyKCkpID49ICcwJyAmJiAqKHdvcmQuY19zdHIoKSkgPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmVlbnNob3RGcmFtZXMuaW5zZXJ0KGZyYW1lVG9BZGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29tbWEgPT0gc3RyaW5nOjpucG9zKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzdGFydCA9IGNvbW1hICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NhbF9mcmVlX2dldGVudihfdmtfc2NyZWVuc2hvdCk7CisgICAgICAgIHNjcmVlbnNob3RFbnZRdWVyaWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MgJiYgIXNjcmVlbnNob3RGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICBzZXQ8aW50Pjo6aXRlcmF0b3IgaXQ7CisgICAgICAgIGl0ID0gc2NyZWVuc2hvdEZyYW1lcy5maW5kKGZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYgKGl0ICE9IHNjcmVlbnNob3RGcmFtZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0cmluZyBmaWxlTmFtZTsKKworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgICAgIC8vIHN0ZDo6dG9fc3RyaW5nIGlzIG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CisgICAgICAgICAgICBjaGFyIGJ1ZmZlciBbNjRdOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIi9zZGNhcmQvQW5kcm9pZC8lZCIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJhc2UoYnVmZmVyKTsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gYmFzZSArICIucHBtIjsKKyNlbHNlCisgICAgICAgICAgICBmaWxlTmFtZSA9IHRvX3N0cmluZyhmcmFtZU51bWJlcikgKyAiLnBwbSI7CisjZW5kaWYKKworICAgICAgICAgICAgVmtJbWFnZSBpbWFnZTsKKyAgICAgICAgICAgIFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbjsKKyAgICAgICAgICAgIC8vIFdlJ2xsIGR1bXAgb25seSBvbmUgaW1hZ2U6IHRoZSBmaXJzdAorICAgICAgICAgICAgc3dhcGNoYWluID0gcFByZXNlbnRJbmZvLT5wU3dhcGNoYWluc1swXTsKKyAgICAgICAgICAgIGltYWdlID0gc3dhcGNoYWluTWFwW3N3YXBjaGFpbl0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0+aW1hZ2VMaXN0W3BQcmVzZW50SW5mby0+cEltYWdlSW5kaWNlc1swXV07CisgICAgICAgICAgICB3cml0ZVBQTShmaWxlTmFtZS5jX3N0cigpLCBpbWFnZSk7CisgICAgICAgICAgICBzY3JlZW5zaG90RnJhbWVzLmVyYXNlKGl0KTsKKworICAgICAgICAgICAgaWYgKHNjcmVlbnNob3RGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZyZWUgYWxsIG91ciBtYXBzIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggdGhlbS4KKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBzd2FwY2hhaW5NYXAuYmVnaW4oKTsgaXQgIT0gc3dhcGNoYWluTWFwLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgaXQrKykgeworICAgICAgICAgICAgICAgICAgICBTd2FwY2hhaW5NYXBTdHJ1Y3QgKnN3YXBjaGFpbk1hcEVsZW0gPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgc3dhcGNoYWluTWFwRWxlbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gaW1hZ2VNYXAuYmVnaW4oKTsgaXQgIT0gaW1hZ2VNYXAuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VNYXBTdHJ1Y3QgKmltYWdlTWFwRWxlbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbWFnZU1hcEVsZW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBoeXNEZXZpY2VNYXAuYmVnaW4oKTsgaXQgIT0gcGh5c0RldmljZU1hcC5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgUGh5c0RldmljZU1hcFN0cnVjdCAqcGh5c0RldmljZU1hcEVsZW0gPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGh5c0RldmljZU1hcEVsZW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3YXBjaGFpbk1hcC5jbGVhcigpOworICAgICAgICAgICAgICAgIGltYWdlTWFwLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcGh5c0RldmljZU1hcC5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZyYW1lTnVtYmVyKys7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJmdsb2JhbExvY2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCBWa0xheWVyUHJvcGVydGllcyBnbG9iYWxfbGF5ZXIgPSB7CisgICAgIlZLX0xBWUVSX0xVTkFSR19zY3JlZW5zaG90IiwgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwgMSwKKyAgICAiTGF5ZXI6IHNjcmVlbnNob3QiLAorfTsKKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKAorICAgIHVpbnQzMl90ICpwQ291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiB1dGlsX0dldExheWVyUHJvcGVydGllcygxLCAmZ2xvYmFsX2xheWVyLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcygKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcENvdW50LAorICAgIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiB1dGlsX0dldExheWVyUHJvcGVydGllcygxLCAmZ2xvYmFsX2xheWVyLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMCitFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgaWYgKHBMYXllck5hbWUgJiYgIXN0cmNtcChwTGF5ZXJOYW1lLCBnbG9iYWxfbGF5ZXIubGF5ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIHV0aWxfR2V0RXh0ZW5zaW9uUHJvcGVydGllcygwLCBOVUxMLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVDsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgaWYgKHBMYXllck5hbWUgJiYgIXN0cmNtcChwTGF5ZXJOYW1lLCBnbG9iYWxfbGF5ZXIubGF5ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIHV0aWxfR2V0RXh0ZW5zaW9uUHJvcGVydGllcygwLCBOVUxMLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKKworICAgIGFzc2VydChwaHlzaWNhbERldmljZSk7CisKKyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwVGFibGUgPQorICAgICAgICBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZShwaHlzaWNhbERldmljZSk7CisgICAgcmV0dXJuIHBUYWJsZS0+RW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcygKKyAgICAgICAgcGh5c2ljYWxEZXZpY2UsIHBMYXllck5hbWUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitzdGF0aWMgUEZOX3ZrVm9pZEZ1bmN0aW9uIGludGVyY2VwdF9jb3JlX2luc3RhbmNlX2NvbW1hbmQoY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyBQRk5fdmtWb2lkRnVuY3Rpb24gaW50ZXJjZXB0X2NvcmVfZGV2aWNlX2NvbW1hbmQoY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyBQRk5fdmtWb2lkRnVuY3Rpb24gaW50ZXJjZXB0X2tocl9zd2FwY2hhaW5fY29tbWFuZChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlIGRldik7CisKK1ZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwKK0dldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldiwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICBQRk5fdmtWb2lkRnVuY3Rpb24gcHJvYyA9IGludGVyY2VwdF9jb3JlX2RldmljZV9jb21tYW5kKGZ1bmNOYW1lKTsKKyAgICBpZiAocHJvYykKKyAgICAgICAgcmV0dXJuIHByb2M7CisKKyAgICBpZiAoZGV2ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcHJvYyA9IGludGVyY2VwdF9raHJfc3dhcGNoYWluX2NvbW1hbmQoZnVuY05hbWUsIGRldik7CisgICAgaWYgKHByb2MpCisgICAgICAgIHJldHVybiBwcm9jOworCisgICAgRGV2aWNlTWFwU3RydWN0ICpkZXZNYXAgPSBnZXRfZGV2X2luZm8oZGV2KTsKKyAgICBhc3NlcnQoZGV2TWFwKTsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSBkZXZNYXAtPmRldmljZV9kaXNwYXRjaF90YWJsZTsKKworICAgIGlmIChwRGlzcC0+R2V0RGV2aWNlUHJvY0FkZHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHBEaXNwLT5HZXREZXZpY2VQcm9jQWRkcihkZXYsIGZ1bmNOYW1lKTsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTAorR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBwcm9jID0gaW50ZXJjZXB0X2NvcmVfaW5zdGFuY2VfY29tbWFuZChmdW5jTmFtZSk7CisgICAgaWYgKHByb2MpCisgICAgICAgIHJldHVybiBwcm9jOworCisgICAgYXNzZXJ0KGluc3RhbmNlKTsKKworICAgIHByb2MgPSBpbnRlcmNlcHRfY29yZV9kZXZpY2VfY29tbWFuZChmdW5jTmFtZSk7CisgICAgaWYgKCFwcm9jKQorICAgICAgICBwcm9jID0gaW50ZXJjZXB0X2tocl9zd2FwY2hhaW5fY29tbWFuZChmdW5jTmFtZSwgVktfTlVMTF9IQU5ETEUpOworICAgIGlmIChwcm9jKQorICAgICAgICByZXR1cm4gcHJvYzsKKworICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnBUYWJsZSA9IGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlKTsKKyAgICBpZiAocFRhYmxlLT5HZXRJbnN0YW5jZVByb2NBZGRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIoaW5zdGFuY2UsIGZ1bmNOYW1lKTsKK30KKworc3RhdGljIFBGTl92a1ZvaWRGdW5jdGlvbiBpbnRlcmNlcHRfY29yZV9pbnN0YW5jZV9jb21tYW5kKGNvbnN0IGNoYXIgKm5hbWUpIHsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICBQRk5fdmtWb2lkRnVuY3Rpb24gcHJvYzsKKyAgICB9IGNvcmVfaW5zdGFuY2VfY29tbWFuZHNbXSA9IHsKKyAgICAgICAgeyJ2a0dldEluc3RhbmNlUHJvY0FkZHIiLAorICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KEdldEluc3RhbmNlUHJvY0FkZHIpfSwKKyAgICAgICAgeyJ2a0NyZWF0ZUluc3RhbmNlIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihDcmVhdGVJbnN0YW5jZSl9LAorICAgICAgICB7InZrQ3JlYXRlRGV2aWNlIiwgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KENyZWF0ZURldmljZSl9LAorICAgICAgICB7InZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihFbnVtZXJhdGVQaHlzaWNhbERldmljZXMpfSwKKyAgICAgICAgeyJ2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPigKKyAgICAgICAgICAgICBFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyl9LAorICAgICAgICB7InZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMpfSwKKyAgICAgICAgeyJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyIsCisgICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4oCisgICAgICAgICAgICAgRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKX0sCisgICAgICAgIHsidmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPigKKyAgICAgICAgICAgICBFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKX19OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvcmVfaW5zdGFuY2VfY29tbWFuZHMpOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoY29yZV9pbnN0YW5jZV9jb21tYW5kc1tpXS5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBjb3JlX2luc3RhbmNlX2NvbW1hbmRzW2ldLnByb2M7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXRpYyBQRk5fdmtWb2lkRnVuY3Rpb24gaW50ZXJjZXB0X2NvcmVfZGV2aWNlX2NvbW1hbmQoY29uc3QgY2hhciAqbmFtZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICBQRk5fdmtWb2lkRnVuY3Rpb24gcHJvYzsKKyAgICB9IGNvcmVfZGV2aWNlX2NvbW1hbmRzW10gPSB7CisgICAgICAgIHsidmtHZXREZXZpY2VQcm9jQWRkciIsCisgICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4oR2V0RGV2aWNlUHJvY0FkZHIpfSwKKyAgICAgICAgeyJ2a0dldERldmljZVF1ZXVlIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihHZXREZXZpY2VRdWV1ZSl9LAorICAgICAgICB7InZrQ3JlYXRlQ29tbWFuZFBvb2wiLAorICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KENyZWF0ZUNvbW1hbmRQb29sKX0sCisgICAgICAgIHsidmtEZXN0cm95RGV2aWNlIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihEZXN0cm95RGV2aWNlKX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb3JlX2RldmljZV9jb21tYW5kcyk7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChjb3JlX2RldmljZV9jb21tYW5kc1tpXS5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBjb3JlX2RldmljZV9jb21tYW5kc1tpXS5wcm9jOworICAgIH0KKworICAgIHJldHVybiBudWxscHRyOworfQorCitzdGF0aWMgUEZOX3ZrVm9pZEZ1bmN0aW9uIGludGVyY2VwdF9raHJfc3dhcGNoYWluX2NvbW1hbmQoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0RldmljZSBkZXYpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIHByb2M7CisgICAgfSBraHJfc3dhcGNoYWluX2NvbW1hbmRzW10gPSB7CisgICAgICAgIHsidmtDcmVhdGVTd2FwY2hhaW5LSFIiLAorICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KENyZWF0ZVN3YXBjaGFpbktIUil9LAorICAgICAgICB7InZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSIiwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPihHZXRTd2FwY2hhaW5JbWFnZXNLSFIpfSwKKyAgICAgICAgeyJ2a1F1ZXVlUHJlc2VudEtIUiIsCisgICAgICAgICByZWludGVycHJldF9jYXN0PFBGTl92a1ZvaWRGdW5jdGlvbj4oUXVldWVQcmVzZW50S0hSKX0sCisgICAgfTsKKworICAgIGlmIChkZXYpIHsKKyAgICAgICAgRGV2aWNlTWFwU3RydWN0ICpkZXZNYXAgPSBnZXRfZGV2X2luZm8oZGV2KTsKKyAgICAgICAgaWYgKCFkZXZNYXAtPndzaV9lbmFibGVkKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtocl9zd2FwY2hhaW5fY29tbWFuZHMpOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoa2hyX3N3YXBjaGFpbl9jb21tYW5kc1tpXS5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBraHJfc3dhcGNoYWluX2NvbW1hbmRzW2ldLnByb2M7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gLy8gbmFtZXNwYWNlIHNjcmVlbnNob3QKKworLy8gbG9hZGVyLWxheWVyIGludGVyZmFjZSB2MCwganVzdCB3cmFwcGVycyBzaW5jZSB0aGVyZSBpcyBvbmx5IGEgbGF5ZXIKKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTAordmtFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gc2NyZWVuc2hvdDo6RW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMocENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICAvLyB0aGUgbGF5ZXIgY29tbWFuZCBoYW5kbGVzIFZLX05VTExfSEFORExFIGp1c3QgZmluZSBpbnRlcm5hbGx5CisgICAgYXNzZXJ0KHBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKTsKKyAgICByZXR1cm4gc2NyZWVuc2hvdDo6RW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZLX05VTExfSEFORExFLCBwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIHNjcmVlbnNob3Q6OkVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhwTGF5ZXJOYW1lLCBwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwKK3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBMYXllck5hbWUsIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIC8vIHRoZSBsYXllciBjb21tYW5kIGhhbmRsZXMgVktfTlVMTF9IQU5ETEUganVzdCBmaW5lIGludGVybmFsbHkKKyAgICBhc3NlcnQocGh5c2ljYWxEZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpOworICAgIHJldHVybiBzY3JlZW5zaG90OjpFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKAorICAgICAgICBWS19OVUxMX0hBTkRMRSwgcExheWVyTmFtZSwgcENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMCit2a0dldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldiwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gc2NyZWVuc2hvdDo6R2V0RGV2aWNlUHJvY0FkZHIoZGV2LCBmdW5jTmFtZSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMCit2a0dldEluc3RhbmNlUHJvY0FkZHIoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gc2NyZWVuc2hvdDo6R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvdmtfbGF5ZXJfc2V0dGluZ3MudHh0IGIvbGF5ZXJzdnQvdmtfbGF5ZXJfc2V0dGluZ3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjE4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9sYXllcnN2dC92a19sYXllcl9zZXR0aW5ncy50eHQKQEAgLTAsMCArMSw3OCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIFRoaXMgZmlsZSBjb250YWlucyBwZXItbGF5ZXIgc2V0dGluZ3MgdGhhdCBjb25maWd1cmUgbGF5ZXIgYmVoYXZpb3IgYXQKKyMgIGV4ZWN1dGlvbiB0aW1lLiBDb21tZW50cyBpbiB0aGlzIGZpbGUgYXJlIGRlbm90ZWQgd2l0aCB0aGUgIiMiIGNoYXIuCisjICBTZXR0aW5ncyBsaW5lcyBhcmUgb2YgdGhlIGZvcm06CisjICAgICAgIjxMYXllcklkZW50aWZpZXI+LjxTZXR0aW5nTmFtZT4gPSA8U2V0dGluZ1ZhbHVlPiIKKyMKKyMgIDxMYXllcklkZW50aWZpZXI+IGlzIHR5cGljYWxseSB0aGUgb2ZmaWNpYWwgbGF5ZXIgbmFtZSwgbWludXMgdGhlIFZLX0xBWUVSCisjICBwcmVmaXggYW5kIGFsbCBsb3dlci1jYW1lbC1jYXNlIC0tIGkuZS4sIGZvciBWS19MQVlFUl9MVU5BUkdfYXBpX2R1bXAsIHRoZQorIyAgbGF5ZXIgaWRlbnRpZmllciBpcyAnbHVuYXJnX2FwaV9kdW1wJy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVktfTEFZRVJfTFVOQVJHX2FwaV9kdW1wIFNldHRpbmdzOgorIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgICBERVRBSUxFRDoKKyMgICAgPT09PT09PT09CisjICAgIDxMYXllcklkZW50aWZlcj4uZGV0YWlsZWQgOiBTZXR0aW5nIHRoaXMgdG8gVFJVRSBjYXVzZXMgcGFyYW1ldGVyIGRldGFpbHMKKyMgICAgdG8gYmUgZHVtcGVkIGluIGFkZGl0aW9uIHRvIEFQSSBjYWxscy4KKyMgICAgCisjICAgIE5PX0FERFI6CisjICAgID09PT09PT09CisjICAgIDxMYXllcklkZW50aWZpZXI+Lm5vX2FkZHIgOiBTZXR0aW5nIHRoaXMgdG8gVFJVRSBjYXVzZXMgImFkZHJlc3MiIHRvIGJlCisjICAgIGR1bXBlZCBpbiBwbGFjZSBvZiBoZXggYWRkcmVzc2VzLgorIworIyAgICBGSUxFOgorIyAgICA9PT09PQorIyAgICA8TGF5ZXJJZGVudGlmZXI+LmZpbGUgOiBTZXR0aW5nIHRoaXMgdG8gVFJVRSBpbmRpY2F0ZXMgdGhhdCBvdXRwdXQKKyMgICAgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gZmlsZSBpbnN0ZWFkIG9mIFNURE9VVC4KKyMKKyMgICAgTE9HX0ZJTEVOQU1FOgorIyAgICA9PT09PT09PT09PT09CisjICAgIDxMYXllcklkZW50aWZlcj4ubG9nX2ZpbGVuYW1lIDogU3BlY2lmaWVzIHRoZSBmaWxlIHRvIGR1bXAgdG8gd2hlbgorIyAgICAiZmlsZSA9IFRSVUUiLiAgVGhlIGRlZmF1bHQgaXMgInZrX2FwaWR1bXAudHh0Ii4KKyMKKyMgICAgRkxVU0g6CisjICAgID09PT09PQorIyAgICA8TGF5ZXJJZGVudGlmaWVyPi5mbHVzaCA6IFNldHRpbmcgdGhpcyB0byBUUlVFIGNhdXNlcyBJTyB0byBiZSBmbHVzaGVkCisjICAgIGVhY2ggQVBJIGNhbGwgdGhhdCBpcyB3cml0dGVuCisjCisjICAgSU5ERU5UIFNJWkUKKyMgICA9PT09PT09PT09PT09PQorIyAgIDxMYXllcklkZW50aWZpZXI+LmluZGVudF9zaXplIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3BhY2VzIHRoYXQgYSB0YWIKKyMgICBpcyBlcXVhbCB0bworIworIyAgIFNIT1cgVFlQRVMKKyMgICA9PT09PT09PT09PT09PQorIyAgIDxMYXllcklkZW50aWZpZXI+LnNob3dfdHlwZXMgOiBTZXR0aW5nIHRoaXMgdG8gVFJVRSBjYXVzZXMgdHlwZXMgdG8gYmUKKyMgICBkdW1wZWQgaW4gYWRkaXRpb24gdG8gdmFsdWVzCisjCisjICAgTkFNRSBTSVpFCisjICAgPT09PT09PT09PT09PT0KKyMgICA8TGF5ZXJJZGVudGlmaWVyPi5uYW1lX3NpemUgOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlIG5hbWUgb2YgYQorIyAgIHZhcmlhYmxlIHNob3VsZCBjb25zdW1lLCBhc3N1bWluZyBtb3JlIGFyZSBub3QgcmVxdWlyZWQKKyMKKyMgICBUWVBFIFNJWkUKKyMgICA9PT09PT09PT09PT09PQorIyAgIDxMYXllcklkZW50aWZpZXI+LnR5cGVfc2l6ZSA6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGUgdHlwZSBvZiBhCisjICAgdmFyaWFibGUgc2hvdWxkIGNvbnN1bWUsIGFzc3VtaW5nIG1vcmUgYXJlIG5vdCByZXF1aXJlcworIworIyAgIFVTRV9TUEFDRVMKKyMgICA9PT09PT09PT09PT09PQorIyAgIDxMYXllcklkZW50aWZpZXI+LnVzZV9zcGFjZXMgOiBTZXR0aW5nIHRoaXMgdG8gVFJVRSBjYXVzZXMgYWxsIHRhYnMKKyMgICBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkIHdpdGggc3BhY2VzCisKKyMgIFZLX0xVTkFSR19MQVlFUl9hcGlfZHVtcCBTZXR0aW5ncworbHVuYXJnX2FwaV9kdW1wLmRldGFpbGVkID0gVFJVRQorbHVuYXJnX2FwaV9kdW1wLm5vX2FkZHIgPSBGQUxTRQorbHVuYXJnX2FwaV9kdW1wLmZpbGUgPSBGQUxTRQorbHVuYXJnX2FwaV9kdW1wLmxvZ19maWxlbmFtZSA9IHZrX2FwaWR1bXAudHh0CitsdW5hcmdfYXBpX2R1bXAuZmx1c2ggPSBUUlVFCitsdW5hcmdfYXBpX2R1bXAuaW5kZW50X3NpemUgPSA0CitsdW5hcmdfYXBpX2R1bXAuc2hvd190eXBlcyA9IFRSVUUKK2x1bmFyZ19hcGlfZHVtcC5uYW1lX3NpemUgPSAzMgorbHVuYXJnX2FwaV9kdW1wLnR5cGVfc2l6ZSA9IDAKK2x1bmFyZ19hcGlfZHVtcC51c2Vfc3BhY2VzID0gVFJVRQorbHVuYXJnX2FwaV9kdW1wLnNob3dfc2hhZGVyID0gRkFMU0UKZGlmZiAtLWdpdCBhL2xheWVyc3Z0L3dpbmRvd3MvVmtMYXllcl9hcGlfZHVtcC5qc29uIGIvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX2FwaV9kdW1wLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3MDIxZgotLS0gL2Rldi9udWxsCisrKyBiL2xheWVyc3Z0L3dpbmRvd3MvVmtMYXllcl9hcGlfZHVtcC5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4wLjAiLAorICAgICJsYXllciIgOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19hcGlfZHVtcCIsCisgICAgICAgICJ0eXBlIjogIkdMT0JBTCIsCisgICAgICAgICJsaWJyYXJ5X3BhdGgiOiAiLlxcVmtMYXllcl9hcGlfZHVtcC5kbGwiLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjMzIiwKKyAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMiIsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMdW5hckcgZGVidWcgbGF5ZXIiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX2Jhc2ljLmpzb24gYi9sYXllcnN2dC93aW5kb3dzL1ZrTGF5ZXJfYmFzaWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTlhMWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX2Jhc2ljLmpzb24KQEAgLTAsMCArMSwxOCBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIiA6ICIxLjAuMCIsCisgICAgImxheWVyIiA6IHsKKyAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfTFVOQVJHX2Jhc2ljIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuXFxWa0xheWVyX2Jhc2ljLmRsbCIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjAuMzMiLAorICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBTYW1wbGUgTGF5ZXIiLAorICAgICAgICAiZGV2aWNlX2V4dGVuc2lvbnMiOiBbCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAibmFtZSI6ICJWS19MVU5BUkdfTGF5ZXJFeHRlbnNpb24xIiwKKyAgICAgICAgICAgICAgICAgInNwZWNfdmVyc2lvbiI6ICIwIiwKKwkJICJlbnRyeXBvaW50cyI6IFsidmtMYXllckV4dGVuc2lvbjEiXQorICAgICAgICAgICAgIH0KKyAgICAgICAgIF0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sYXllcnN2dC93aW5kb3dzL1ZrTGF5ZXJfZ2VuZXJpYy5qc29uIGIvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX2dlbmVyaWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE4ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX2dlbmVyaWMuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMC4wIiwKKyAgICAibGF5ZXIiIDogeworICAgICAgICAibmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfZ2VuZXJpYyIsCisgICAgICAgICJ0eXBlIjogIkdMT0JBTCIsCisgICAgICAgICJsaWJyYXJ5X3BhdGgiOiAiLlxcVmtMYXllcl9nZW5lcmljLmRsbCIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjAuMzMiLAorICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBzYW1wbGUgbGF5ZXIiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX211bHRpLmpzb24gYi9sYXllcnN2dC93aW5kb3dzL1ZrTGF5ZXJfbXVsdGkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjFmYjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX211bHRpLmpzb24KQEAgLTAsMCArMSwyOCBAQAoreworICAgICJmaWxlX2Zvcm1hdF92ZXJzaW9uIiA6ICIxLjAuMSIsCisgICAgImxheWVycyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR19tdWx0aTEiLAorICAgICAgICAgICAgInR5cGUiOiAiSU5TVEFOQ0UiLAorICAgICAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuXFxWa0xheWVyX211bHRpLmRsbCIsCisgICAgICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjMzIiwKKyAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogIjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBTYW1wbGUgbXVsdGlwbGUgbGF5ZXIgcGVyIGxpYnJhcnkiLAorICAgICAgICAgICAgImZ1bmN0aW9ucyIgOiB7CisgICAgICAgICAgICAgICJ2a0dldEluc3RhbmNlUHJvY0FkZHIiIDogIlZLX0xBWUVSX0xVTkFSR19tdWx0aTFHZXRJbnN0YW5jZVByb2NBZGRyIiwKKyAgICAgICAgICAgICAgInZrR2V0RGV2aWNlUHJvY0FkZHIiIDogIlZLX0xBWUVSX0xVTkFSR19tdWx0aTFHZXREZXZpY2VQcm9jQWRkciIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiVktfTEFZRVJfTFVOQVJHX211bHRpMiIsCisgICAgICAgICAgICAidHlwZSI6ICJJTlNUQU5DRSIsCisgICAgICAgICAgICAibGlicmFyeV9wYXRoIjogIi5cXFZrTGF5ZXJfbXVsdGkuZGxsIiwKKyAgICAgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjAuMzMiLAorICAgICAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTHVuYXJHIFNhbXBsZSBtdWx0aXBsZSBsYXllciBwZXIgbGlicmFyeSIsCisgICAgICAgICAgICAiZnVuY3Rpb25zIiA6IHsKKyAgICAgICAgICAgICAgInZrR2V0SW5zdGFuY2VQcm9jQWRkciIgOiAiVktfTEFZRVJfTFVOQVJHX211bHRpMkdldEluc3RhbmNlUHJvY0FkZHIiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBdCit9CmRpZmYgLS1naXQgYS9sYXllcnN2dC93aW5kb3dzL1ZrTGF5ZXJfc2NyZWVuc2hvdC5qc29uIGIvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX3NjcmVlbnNob3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmU3NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbGF5ZXJzdnQvd2luZG93cy9Wa0xheWVyX3NjcmVlbnNob3QuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMC4wIiwKKyAgICAibGF5ZXIiIDogeworICAgICAgICAibmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfc2NyZWVuc2hvdCIsCisgICAgICAgICJ0eXBlIjogIkdMT0JBTCIsCisgICAgICAgICJsaWJyYXJ5X3BhdGgiOiAiLlxcVmtMYXllcl9zY3JlZW5zaG90LmRsbCIsCisgICAgICAgICJhcGlfdmVyc2lvbiI6ICIxLjAuMzMiLAorICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6ICIxIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkx1bmFyRyBpbWFnZSBjYXB0dXJlIGxheWVyIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvdmtqc29uL0NNYWtlTGlzdHMudHh0IGIvbGlicy92a2pzb24vQ01ha2VMaXN0cy50eHQKaW5kZXggMmU3OWQ5MS4uOGMyMThiMSAxMDA2NDQKLS0tIGEvbGlicy92a2pzb24vQ01ha2VMaXN0cy50eHQKKysrIGIvbGlicy92a2pzb24vQ01ha2VMaXN0cy50eHQKQEAgLTEsMjMgKzEsMTYgQEAKICMgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMKLSMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotIyAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCi0jIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0jIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0jIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0jIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLSMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLSMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotIyBUSEUgU09GVFdBUkUuCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGluY2x1ZGVfZGlyZWN0b3JpZXMoCiAJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CmRpZmYgLS1naXQgYS90ZXN0cy8wMDAxLXZrdHJhY2UtSW4tdmt0cmFjZXJlcGxheS10ZXN0LWNoYW5nZS1sYXllci1mb2xkZXItdG8ucGF0Y2ggYi90ZXN0cy8wMDAxLXZrdHJhY2UtSW4tdmt0cmFjZXJlcGxheS10ZXN0LWNoYW5nZS1sYXllci1mb2xkZXItdG8ucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0NDBjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzLzAwMDEtdmt0cmFjZS1Jbi12a3RyYWNlcmVwbGF5LXRlc3QtY2hhbmdlLWxheWVyLWZvbGRlci10by5wYXRjaApAQCAtMCwwICsxLDMzIEBACitGcm9tIDAwMTg4NGUyYzRhYzUzMDY3YTE1OGNjN2UwMTRjN2ViNjcwYTk0ODUgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBcmRhIENvc2t1bnNlcyA8YXJkYUBsdW5hcmcuY29tPgorRGF0ZTogVHVlLCAyNyBTZXAgMjAxNiAxNzowOTo0MCAtMDYwMAorU3ViamVjdDogW1BBVENIXSB2a3RyYWNlOiBJbiB2a3RyYWNlcmVwbGF5IHRlc3QgY2hhbmdlIGxheWVyIGZvbGRlciB0bworIGxheWVyc3Z0CisKK0NoYW5nZS1JZDogSWQ3NzM2NjA4YjdkYTBiY2Q2MWJmZTJjMWJjM2YwMjNiNTgyZmJmMDMKKy0tLQorIHRlc3RzL192a3RyYWNlcmVwbGF5LnBzMSB8IDggKysrKy0tLS0KKyAxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxIGIvdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxCitpbmRleCBjZTk4YmZmLi5mZWUyN2Q3IDEwMDY0NAorLS0tIGEvdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxCisrKysgYi90ZXN0cy9fdmt0cmFjZXJlcGxheS5wczEKK0BAIC0yOSwxMCArMjksMTAgQEAgY3AgLi5cLi5cZGVtb3NcJGRQYXRoXGN1YmUuZXhlIC4KKyBjcCAuLlwuLlxkZW1vc1wqLnBwbSAuDQorIGNwIC4uXC4uXGRlbW9zXCouc3B2IC4NCisgY3AgLi5cLi5cbG9hZGVyXCRkUGF0aFx2dWxrYW4tMS5kbGwgLg0KKy1jcCAuLlwuLlxsYXllcnNcJGRQYXRoXFZrTGF5ZXJfc2NyZWVuc2hvdC5kbGwgLg0KKy1jcCAuLlwuLlxsYXllcnNcJGRQYXRoXFZrTGF5ZXJfc2NyZWVuc2hvdC5qc29uIC4NCistY3AgLi5cLi5cbGF5ZXJzXCRkUGF0aFxWa0xheWVyX3ZrdHJhY2VfbGF5ZXIuZGxsIC4NCistY3AgLi5cLi5cbGF5ZXJzXCRkUGF0aFxWa0xheWVyX3ZrdHJhY2VfbGF5ZXIuanNvbiAuDQorK2NwIC4uXC4uXGxheWVyc3Z0XCRkUGF0aFxWa0xheWVyX3NjcmVlbnNob3QuZGxsIC4NCisrY3AgLi5cLi5cbGF5ZXJzdnRcJGRQYXRoXFZrTGF5ZXJfc2NyZWVuc2hvdC5qc29uIC4NCisrY3AgLi5cLi5cbGF5ZXJzdnRcJGRQYXRoXFZrTGF5ZXJfdmt0cmFjZV9sYXllci5kbGwgLg0KKytjcCAuLlwuLlxsYXllcnN2dFwkZFBhdGhcVmtMYXllcl92a3RyYWNlX2xheWVyLmpzb24gLg0KKyANCisgIyBDaGFuZ2UgUEFUSCB0byB0aGUgdGVtcCBkaXJlY3RvcnkNCisgJG9sZHBhdGggPSAkRW52OlBBVEgNCistLSAKKzIuNy40CisKZGlmZiAtLWdpdCBhL3Rlc3RzLzAwMDEtdmt0cmFjZS10ZXN0LWRpc2FibGUtbWVhbi1jYWxjLnBhdGNoIGIvdGVzdHMvMDAwMS12a3RyYWNlLXRlc3QtZGlzYWJsZS1tZWFuLWNhbGMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzYzI5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzLzAwMDEtdmt0cmFjZS10ZXN0LWRpc2FibGUtbWVhbi1jYWxjLnBhdGNoCkBAIC0wLDAgKzEsODggQEAKK0Zyb20gMTQwZWQ1YjBkYjM4YmYzNzY2Y2ZjY2JiNTRiMDU1ODcwYThlNjYyYyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEFyZGEgQ29za3Vuc2VzIDxhcmRhQGx1bmFyZy5jb20+CitEYXRlOiBXZWQsIDI4IFNlcCAyMDE2IDE2OjE2OjMwIC0wNjAwCitTdWJqZWN0OiBbUEFUQ0hdIHZrdHJhY2U6IHRlc3QgZGlzYWJsZSBtZWFuIGNhbGMKKworQ2hhbmdlLUlkOiBJNmQxODJmNjZhZTE3ZWFjYTBiYjdjMjJkODkzNGNlNDgxNTYzMDUzYQorLS0tCisgdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxIHwgNjQgKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMSBmaWxlIGNoYW5nZWQsIDMyIGluc2VydGlvbnMoKyksIDMyIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxIGIvdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxCitpbmRleCBmZWUyN2Q3Li43MTI3M2QwIDEwMDY0NAorLS0tIGEvdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxCisrKysgYi90ZXN0cy9fdmt0cmFjZXJlcGxheS5wczEKK0BAIC03NSwzOCArNzUsMzggQEAgaWYgKCRleGl0c3RhdHVzIC1lcSAwKSB7CisgfQ0KKyANCisgIyBjaGVjayB0aGUgYXZlcmFnZSBwaXhlbCB2YWx1ZSBvZiBlYWNoIHNjcmVlbnNob3QgdG8gZW5zdXJlIHNvbWV0aGluZyBwbGF1c2libGUgd2FzIHdyaXR0ZW4NCistaWYgKCRleGl0c3RhdHVzIC1lcSAwKSB7DQorLSAgICAkdHJhY2VfbWVhbiA9IChjb252ZXJ0IDEtdHJhY2UucHBtIC1mb3JtYXQgIiVbbWVhbl0iIGluZm86KQ0KKy0gICAgJHJlcGxheV9tZWFuID0gKGNvbnZlcnQgMS1yZXBsYXkucHBtIC1mb3JtYXQgIiVbbWVhbl0iIGluZm86KQ0KKy0gICAgJHZlcnNpb24gPSAoaWRlbnRpZnkgLXZlcnNpb24pDQorLQ0KKy0gICAgIyBub3JtYWxpemUgdGhlIHZhbHVlcyBzbyB3ZSBjYW4gc3VwcG9ydCBROCBhbmQgUTE2IGltYWdlbWFnaWNrIGluc3RhbGxhdGlvbnMNCistICAgIGlmICgkdmVyc2lvbiAtbWF0Y2ggIlE4Iikgew0KKy0gICAgICAgICR0cmFjZV9tZWFuID0gJHRyYWNlX21lYW4gICAvIDI1NSAjIDJeOC0xDQorLSAgICAgICAgJHJlcGxheV9tZWFuID0gJHJlcGxheV9tZWFuIC8gMjU1ICMgMl44LTENCistICAgIH0gZWxzZSB7DQorLSAgICAgICAgJHRyYWNlX21lYW4gPSAkdHJhY2VfbWVhbiAgIC8gNjU1MzUgIyAyXjE2LTENCistICAgICAgICAkcmVwbGF5X21lYW4gPSAkcmVwbGF5X21lYW4gLyA2NTUzNSAjIDJeMTYtMQ0KKy0gICAgfQ0KKy0NCistICAgICMgaWYgZWl0aGVyIHNjcmVlbnNob3QgaXMgdG9vIGJyaWdodCBvciB0b28gZGFyaywgaXQgZWl0aGVyIGZhaWxlZCwgb3IgaXMgYSBiYWQgdGVzdA0KKy0gICAgaWYgKCgkdHJhY2VfbWVhbiAtbHQgMC4xMCkgLW9yICgkdHJhY2VfbWVhbiAtZ3QgMC45MCkpew0KKy0gICAgICAgIGVjaG8gJycNCistICAgICAgICBlY2hvICdUcmFjZSBzY3JlZW5zaG90IGZhaWxlZCBtZWFuIGNoZWNrLCBtdXN0IGJlIGluIHJhbmdlIFswLjEsIDAuOV0nDQorLSAgICAgICAgd3JpdGUtaG9zdCAnRGV0ZWN0ZWQgbWVhbjonICR0cmFjZV9tZWFuDQorLSAgICAgICAgZWNobyAnJw0KKy0gICAgICAgIHdyaXRlLWhvc3QgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgcmVkICJbICBGQUlMRUQgIF0gIiAgLW5vbmV3bGluZTsNCistICAgICAgICAkZXhpdHN0YXR1cyA9IDENCistICAgIH0NCistICAgIGlmICgoJHJlcGxheV9tZWFuIC1sdCAwLjEwKSAtb3IgKCRyZXBsYXlfbWVhbiAtZ3QgMC45MCkpew0KKy0gICAgICAgIGVjaG8gJycNCistICAgICAgICBlY2hvICdSZXBsYXkgc2NyZWVuc2hvdCBmYWlsZWQgbWVhbiBjaGVjaywgbXVzdCBiZSBpbiByYW5nZSBbMC4xLCAwLjldJw0KKy0gICAgICAgIHdyaXRlLWhvc3QgJ0RldGVjdGVkIG1lYW46JyAkcmVwbGF5X21lYW4NCistICAgICAgICBlY2hvICcnDQorLSAgICAgICAgd3JpdGUtaG9zdCAtYmFja2dyb3VuZCBibGFjayAtZm9yZWdyb3VuZCByZWQgIlsgIEZBSUxFRCAgXSAiICAtbm9uZXdsaW5lOw0KKy0gICAgICAgICRleGl0c3RhdHVzID0gMQ0KKy0gICAgfQ0KKy19DQorKyNpZiAoJGV4aXRzdGF0dXMgLWVxIDApIHsNCisrIyAgICAkdHJhY2VfbWVhbiA9IChjb252ZXJ0IDEtdHJhY2UucHBtIC1mb3JtYXQgIiVbbWVhbl0iIGluZm86KQ0KKysjICAgICRyZXBsYXlfbWVhbiA9IChjb252ZXJ0IDEtcmVwbGF5LnBwbSAtZm9ybWF0ICIlW21lYW5dIiBpbmZvOikNCisrIyAgICAkdmVyc2lvbiA9IChpZGVudGlmeSAtdmVyc2lvbikNCisrIw0KKysjICAgICMgbm9ybWFsaXplIHRoZSB2YWx1ZXMgc28gd2UgY2FuIHN1cHBvcnQgUTggYW5kIFExNiBpbWFnZW1hZ2ljayBpbnN0YWxsYXRpb25zDQorKyMgICAgaWYgKCR2ZXJzaW9uIC1tYXRjaCAiUTgiKSB7DQorKyMgICAgICAgICR0cmFjZV9tZWFuID0gJHRyYWNlX21lYW4gICAvIDI1NSAjIDJeOC0xDQorKyMgICAgICAgICRyZXBsYXlfbWVhbiA9ICRyZXBsYXlfbWVhbiAvIDI1NSAjIDJeOC0xDQorKyMgICAgfSBlbHNlIHsNCisrIyAgICAgICAgJHRyYWNlX21lYW4gPSAkdHJhY2VfbWVhbiAgIC8gNjU1MzUgIyAyXjE2LTENCisrIyAgICAgICAgJHJlcGxheV9tZWFuID0gJHJlcGxheV9tZWFuIC8gNjU1MzUgIyAyXjE2LTENCisrIyAgICB9DQorKyMNCisrIyAgICAjIGlmIGVpdGhlciBzY3JlZW5zaG90IGlzIHRvbyBicmlnaHQgb3IgdG9vIGRhcmssIGl0IGVpdGhlciBmYWlsZWQsIG9yIGlzIGEgYmFkIHRlc3QNCisrIyAgICBpZiAoKCR0cmFjZV9tZWFuIC1sdCAwLjEwKSAtb3IgKCR0cmFjZV9tZWFuIC1ndCAwLjkwKSl7DQorKyMgICAgICAgIGVjaG8gJycNCisrIyAgICAgICAgZWNobyAnVHJhY2Ugc2NyZWVuc2hvdCBmYWlsZWQgbWVhbiBjaGVjaywgbXVzdCBiZSBpbiByYW5nZSBbMC4xLCAwLjldJw0KKysjICAgICAgICB3cml0ZS1ob3N0ICdEZXRlY3RlZCBtZWFuOicgJHRyYWNlX21lYW4NCisrIyAgICAgICAgZWNobyAnJw0KKysjICAgICAgICB3cml0ZS1ob3N0IC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIHJlZCAiWyAgRkFJTEVEICBdICIgIC1ub25ld2xpbmU7DQorKyMgICAgICAgICRleGl0c3RhdHVzID0gMQ0KKysjICAgIH0NCisrIyAgICBpZiAoKCRyZXBsYXlfbWVhbiAtbHQgMC4xMCkgLW9yICgkcmVwbGF5X21lYW4gLWd0IDAuOTApKXsNCisrIyAgICAgICAgZWNobyAnJw0KKysjICAgICAgICBlY2hvICdSZXBsYXkgc2NyZWVuc2hvdCBmYWlsZWQgbWVhbiBjaGVjaywgbXVzdCBiZSBpbiByYW5nZSBbMC4xLCAwLjldJw0KKysjICAgICAgICB3cml0ZS1ob3N0ICdEZXRlY3RlZCBtZWFuOicgJHJlcGxheV9tZWFuDQorKyMgICAgICAgIGVjaG8gJycNCisrIyAgICAgICAgd3JpdGUtaG9zdCAtYmFja2dyb3VuZCBibGFjayAtZm9yZWdyb3VuZCByZWQgIlsgIEZBSUxFRCAgXSAiICAtbm9uZXdsaW5lOw0KKysjICAgICAgICAkZXhpdHN0YXR1cyA9IDENCisrIyAgICB9DQorKyN9DQorIA0KKyAjIGlmIHdlIHBhc3NlZCBhbGwgdGhlIGNoZWNrcywgdGhlIHRlc3QgaXMgZ29vZA0KKyBpZiAoJGV4aXRzdGF0dXMgLWVxIDApIHsNCistLSAKKzIuNy40CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0NNYWtlTGlzdHMudHh0IGIvdGVzdHMvQ01ha2VMaXN0cy50eHQKaW5kZXggYjFiODNhNS4uM2FjMjQ5MyAxMDA2NDQKLS0tIGEvdGVzdHMvQ01ha2VMaXN0cy50eHQKKysrIGIvdGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTIwLDcgKzIwLDcgQEAKIHNldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX01PRFVMRV9QQVRIfSAiJHtDTUFLRV9TT1VSQ0VfRElSfS9jbWFrZSIpCiAKIGlmKFdJTjMyKQotICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC1EX1VTRV9NQVRIX0RFRklORVMiKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC1EX1VTRV9NQVRIX0RFRklORVMgLURNQUdJQ0tDT1JFX0hEUklfRU5BQkxFPTAgLURNQUdJQ0tDT1JFX1FVQU5UVU1fREVQVEg9MTYiKQogCiAgICAgIyBJZiBNU1ZDLCBkaXNhYmxlIHNvbWUgc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoIHdhcm5pbmdzLgogICAgIGlmIChNU1ZDKQpAQCAtMjgsNyArMjgsNyBAQAogICAgIGVuZGlmKCkKIAogZWxzZSgpCi0gICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9YysrMTEiKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtc3RkPWMrKzExIC1ETUFHSUNLQ09SRV9IRFJJX0VOQUJMRT0wIC1ETUFHSUNLQ09SRV9RVUFOVFVNX0RFUFRIPTE2IikKIGVuZGlmKCkKIAogc2V0IChMSUJHTE1fSU5DTFVERV9ESVIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYnMpCkBAIC00NCw2ICs0NCw3IEBACiAgICAgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0cy9ndGVzdC0xLjcuMC9pbmNsdWRlIgogICAgICIke1BST0pFQ1RfU09VUkNFX0RJUn0vaWNkL2NvbW1vbiIKICAgICAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xheWVycyIKKyAgICAke1hDQl9JTkNMVURFX0RJUlN9CiAgICAgJHtHTFNMQU5HX1NQSVJWX0lOQ0xVREVfRElSfQogICAgICR7TElCR0xNX0lOQ0xVREVfRElSfQogICAgICkKQEAgLTU3LDI1ICs1OCwzMSBAQAogICAgICAgICAgICAgQ09NTUFORCBsbiAtc2YgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3J1bl9sb2FkZXJfdGVzdHMuc2gKICAgICAgICAgICAgIENPTU1BTkQgbG4gLXNmICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9ydW5fZXh0cmFfbG9hZGVyX3Rlc3RzLnNoCiAgICAgICAgICAgICBDT01NQU5EIGxuIC1zZiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdmt2YWxpZGF0ZWxheWVyZG9jLnNoCisgICAgICAgICAgICAjIEZpbGVzIHVuaXF1ZSB0byBWdWxrYW5Ub29scyBnbyBiZWxvdyB0aGlzIGxpbmUKKyAgICAgICAgICAgIENPTU1BTkQgbG4gLXNmICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS92a3RyYWNlcmVwbGF5LnNoCiAgICAgICAgICAgICBWRVJCQVRJTQogICAgICAgICAgICAgKQogICAgIGVuZGlmKCkKIGVsc2UoKQogICAgIGlmIChOT1QgKENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiBTVFJFUVVBTCBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVIpKQogICAgICAgICBGSUxFKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9fcnVuX2FsbF90ZXN0cy5wczEgUlVOX0FMTCkKLSAgICAgICAgRklMRShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vX3ZrdmFsaWRhdGVsYXllcmRvYy5wczEgVkFMSURBVEVfRE9DKQorICAgICAgICBGSUxFKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9fdmt0cmFjZXJlcGxheS5wczEgVktUUkFDRVJFUExBWSkKKyAgICAgICAgRklMRShUT19OQVRJVkVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vX3ZrdmFsaWRhdGVsYXllcmRvYy5wczEgVktWQUxJREFURUxBWUVSRE9DKQogICAgICAgICBhZGRfY3VzdG9tX3RhcmdldChiaW5hcnktZGlyLXN5bWxpbmtzIEFMTAotICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICR7UlVOX0FMTH0gcnVuX2FsbF90ZXN0cy5wczEKLSAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAke1ZBTElEQVRFX0RPQ30gdmt2YWxpZGF0ZWxheWVyZG9jLnBzMQorICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICR7UlVOX0FMTH0gX3J1bl9hbGxfdGVzdHMucHMxCisgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgJHtWS1RSQUNFUkVQTEFZfSBfdmt0cmFjZXJlcGxheS5wczEKKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAke1ZLVkFMSURBVEVMQVlFUkRPQ30gX3ZrdmFsaWRhdGVsYXllcmRvYy5wczEKICAgICAgICAgICAgIFZFUkJBVElNCiAgICAgICAgICAgICApCiAgICAgZW5kaWYoKQogZW5kaWYoKQogCiBpZihXSU4zMikKLSAgIHNldCAoTElCVksgIiR7QVBJX0xPV0VSQ0FTRX0tJHtNQUpPUn0iKQorICAgc2V0IChMSUJWSyAidnVsa2FuLSR7TUFKT1J9IikKKyAgIHNldCAoVEVTVF9MSUJSQVJJRVMgJHtHTFNMQU5HX0xJQlJBUklFU30pCiBlbHNlaWYoVU5JWCkKLSAgIHNldCAoTElCVksgIiR7QVBJX0xPV0VSQ0FTRX0iKQorICAgc2V0IChMSUJWSyAidnVsa2FuIikKKyAgIHNldCAoVEVTVF9MSUJSQVJJRVMgJHtHTFNMQU5HX0xJQlJBUklFU30gJHtYQ0JfTElCUkFSSUVTfSAke1gxMV9MSUJSQVJJRVN9KQogZWxzZSgpCiBlbmRpZigpCiAKQEAgLTgzLDIyICs5MCwxMyBAQAogc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZrX2xheWVyX3ZhbGlkYXRpb25fdGVzdHMKICAgIFBST1BFUlRJRVMKICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikKLWlmKE5PVCBXSU4zMikKLSAgICBpZiAoQlVJTERfV1NJX1hDQl9TVVBQT1JUIE9SIEJVSUxEX1dTSV9YTElCX1NVUFBPUlQpCi0gICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzICR7TElCVkt9ICR7WENCX0xJQlJBUklFU30gJHtYMTFfTElCUkFSSUVTfSBndGVzdCBndGVzdF9tYWluIFZrTGF5ZXJfdXRpbHMgJHtHTFNMQU5HX0xJQlJBUklFU30pCi0gICAgZWxzZSgpCi0gICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzICR7TElCVkt9IGd0ZXN0IGd0ZXN0X21haW4gVmtMYXllcl91dGlscyAke0dMU0xBTkdfTElCUkFSSUVTfSkKLSAgICBlbmRpZigpCi1lbmRpZigpCi1pZihXSU4zMikKLSAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzICR7TElCVkt9IGd0ZXN0IGd0ZXN0X21haW4gVmtMYXllcl91dGlscyAke0dMU0xBTkdfTElCUkFSSUVTfSkKLWVuZGlmKCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh2a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzICR7TElCVkt9IGd0ZXN0IGd0ZXN0X21haW4gVmtMYXllcl91dGlscyAke1RFU1RfTElCUkFSSUVTfSkKIAogYWRkX2V4ZWN1dGFibGUodmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMuY3BwICR7Q09NTU9OX0NQUH0pCiBzZXRfdGFyZ2V0X3Byb3BlcnRpZXModmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMKICAgIFBST1BFUlRJRVMKICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikKLXRhcmdldF9saW5rX2xpYnJhcmllcyh2a19sb2FkZXJfdmFsaWRhdGlvbl90ZXN0cyAke0xJQlZLfSBndGVzdCBndGVzdF9tYWluIFZrTGF5ZXJfdXRpbHMgJHtHTFNMQU5HX0xJQlJBUklFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXModmtfbG9hZGVyX3ZhbGlkYXRpb25fdGVzdHMgJHtMSUJWS30gZ3Rlc3QgZ3Rlc3RfbWFpbiBWa0xheWVyX3V0aWxzICR7VEVTVF9MSUJSQVJJRVN9KQogCiBhZGRfc3ViZGlyZWN0b3J5KGd0ZXN0LTEuNy4wKQogYWRkX3N1YmRpcmVjdG9yeShsYXllcnMpCmRpZmYgLS1naXQgYS90ZXN0cy9fdmt0cmFjZXJlcGxheS5wczEgYi90ZXN0cy9fdmt0cmFjZXJlcGxheS5wczEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyNzNkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL192a3RyYWNlcmVwbGF5LnBzMQpAQCAtMCwwICsxLDEyNiBAQAorIyBQb3dlcnNoZWxsIHNjcmlwdCBmb3IgcnVubmluZyB0aGUgdmt0cmFjZSB0cmFjZS9yZXBsYXkgYXV0byB0ZXN0DQorIyBUbyBydW4gdGhpcyB0ZXN0Og0KKyMgICAgY2QgPHRoaXMtZGlyPg0KKyMgICAgcG93ZXJzaGVsbCBDOlxzcmNcTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVyc1x2a3RyYWNlcmVwbGF5LnBzMSBbLURlYnVnXQ0KKyRleGl0c3RhdHVzID0gMA0KKw0KK2lmICgkYXJnc1swXSAtZXEgIi1EZWJ1ZyIpIHsNCisgICAgJGRQYXRoID0gIkRlYnVnIg0KK30gZWxzZSB7DQorICAgICRkUGF0aCA9ICJSZWxlYXNlIg0KK30NCisNCit3cml0ZS1ob3N0IC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIGdyZWVuICJbICBSVU4gICAgIF0gIiAtbm9uZXdsaW5lDQord3JpdGUtaG9zdCAidmt0cmFjZXJlcGxheS5wczE6IFZrdHJhY2UgdHJhY2UvcmVwbGF5Ig0KKw0KKyMgQ3JlYXRlIGEgdGVtcCBkaXJlY3RvcnkgdG8gcnVuIHRoZSB0ZXN0IGluDQorDQoraWYgKFRlc3QtUGF0aCAuXHZrdHJhY2VyZXBsYXlfdG1wKSB7DQorICAgIHJtIC1yZWN1cnNlIC1mb3JjZSAuXHZrdHJhY2VyZXBsYXlfdG1wICA+ICRudWxsIDI+ICRudWxsDQorfQ0KK25ldy1pdGVtIHZrdHJhY2VyZXBsYXlfdG1wIC1pdGVtdHlwZSBkaXJlY3RvcnkgPiAkbnVsbCAyPiAkbnVsbA0KKw0KKyMgQ29weSBldmVyeXRoaW5nIHdlIG5lZWQgaW50byB0aGUgdGVtcCBkaXJlY3RvcnksIHNvIHdlDQorIyBjYW4gbWFrZSBzdXJlIHdlIGFyZSB1c2luZyB0aGUgY29ycmVjdCBkbGwgYW5kIGV4ZSBmaWxlcw0KK2NkIHZrdHJhY2VyZXBsYXlfdG1wDQorY3AgLi5cLi5cdmt0cmFjZVwkZFBhdGhcdmtyZXBsYXkuZXhlIC4NCitjcCAuLlwuLlx2a3RyYWNlXCRkUGF0aFx2a3RyYWNlLmV4ZSAuDQorY3AgLi5cLi5cZGVtb3NcJGRQYXRoXGN1YmUuZXhlIC4NCitjcCAuLlwuLlxkZW1vc1wqLnBwbSAuDQorY3AgLi5cLi5cZGVtb3NcKi5zcHYgLg0KK2NwIC4uXC4uXGxvYWRlclwkZFBhdGhcdnVsa2FuLTEuZGxsIC4NCitjcCAuLlwuLlxsYXllcnN2dFwkZFBhdGhcVmtMYXllcl9zY3JlZW5zaG90LmRsbCAuDQorY3AgLi5cLi5cbGF5ZXJzdnRcJGRQYXRoXFZrTGF5ZXJfc2NyZWVuc2hvdC5qc29uIC4NCitjcCAuLlwuLlxsYXllcnN2dFwkZFBhdGhcVmtMYXllcl92a3RyYWNlX2xheWVyLmRsbCAuDQorY3AgLi5cLi5cbGF5ZXJzdnRcJGRQYXRoXFZrTGF5ZXJfdmt0cmFjZV9sYXllci5qc29uIC4NCisNCisjIENoYW5nZSBQQVRIIHRvIHRoZSB0ZW1wIGRpcmVjdG9yeQ0KKyRvbGRwYXRoID0gJEVudjpQQVRIDQorJEVudjpQQVRIID0gJHB3ZA0KKw0KKyMgU2V0IHVwIHNvbWUgbW9kaWZpZWQgZW52IHZhcnMNCiskRW52OlZLX0xBWUVSX1BBVEggPSAkcHdkDQorDQorIyBEbyBhIHRyYWNlIGFuZCByZXBsYXkNCismIHZrdHJhY2UgLW8gYzAxLnZrdHJhY2UgLXMgMSAtcCBjdWJlIC1hICItLWMgMTAiID4gdHJhY2Uuc291dCAyPiB0cmFjZS5zZXJyDQorcmVuYW1lLWl0ZW0gLXBhdGggMS5wcG0gLW5ld25hbWUgMS10cmFjZS5wcG0NCismIHZrcmVwbGF5ICAtcyAxIC10ICBjMDEudmt0cmFjZSA+IHJlcGxheS5zb3V0IDI+IHJlcGxheS5zZXJyDQorcmVuYW1lLWl0ZW0gLXBhdGggMS5wcG0gLW5ld25hbWUgMS1yZXBsYXkucHBtDQorDQorIyBGb3JjZSBhIGZhaWx1cmUgLSBmb3IgdGVzdGluZyB0aGlzIHNjcmlwdA0KKyNjcCB2dWxrYW4uZGxsIDEtcmVwbGF5LnBwbQ0KKyNybSAxLXRyYWNlLnBwbQ0KKyNybSAxLXJlcGxheS5wcG0NCisNCisjIFJlc3RvcmUgUEFUSA0KKyRFbnY6UEFUSCA9ICRvbGRwYXRoDQorDQoraWYgKCRleGl0c3RhdHVzIC1lcSAwKSB7DQorICAgIyBDaGVjayB0aGF0IHR3byBzY3JlZW5zaG90cyB3ZXJlIGNyZWF0ZWQNCisgICBpZiAoIShUZXN0LVBhdGggMS10cmFjZS5wcG0pIC1vciAhKFRlc3QtUGF0aCAxLXJlcGxheS5wcG0pKSB7DQorICAgICAgICAgICBlY2hvICdUcmFjZSBmaWxlIGRvZXMgbm90IGV4aXN0Jw0KKyAgICAgICAgICAgd3JpdGUtaG9zdCAtYmFja2dyb3VuZCBibGFjayAtZm9yZWdyb3VuZCByZWQgIlsgIEZBSUxFRCAgXSAiICAtbm9uZXdsaW5lOw0KKyAgICAgICAgICAgJGV4aXRzdGF0dXMgPSAxDQorICAgfQ0KK30NCisNCitpZiAoJGV4aXRzdGF0dXMgLWVxIDApIHsNCisgICAgIyBlbnN1cmUgdGhlIHRyYWNlIGFuZCByZXBsYXkgc25hcHNob3RzIGFyZSBpZGVudGljYWwNCisgICAgZmMuZXhlIC9iIDEtdHJhY2UucHBtIDEtcmVwbGF5LnBwbSA+ICRudWxsDQorICAgIGlmICghKFRlc3QtUGF0aCAxLXRyYWNlLnBwbSkgLW9yICEoVGVzdC1QYXRoIDEtcmVwbGF5LnBwbSkgLW9yICRMYXN0RXhpdENvZGUgLWVxIDEpIHsNCisgICAgICAgICBlY2hvICdUcmFjZSBmaWxlcyBkbyBub3QgbWF0Y2gnDQorICAgICAgICAgd3JpdGUtaG9zdCAtYmFja2dyb3VuZCBibGFjayAtZm9yZWdyb3VuZCByZWQgIlsgIEZBSUxFRCAgXSAiICAtbm9uZXdsaW5lOw0KKyAgICAgICAgICRleGl0c3RhdHVzID0gMQ0KKyAgICB9DQorfQ0KKw0KKyMgY2hlY2sgdGhlIGF2ZXJhZ2UgcGl4ZWwgdmFsdWUgb2YgZWFjaCBzY3JlZW5zaG90IHRvIGVuc3VyZSBzb21ldGhpbmcgcGxhdXNpYmxlIHdhcyB3cml0dGVuDQorI2lmICgkZXhpdHN0YXR1cyAtZXEgMCkgew0KKyMgICAgJHRyYWNlX21lYW4gPSAoY29udmVydCAxLXRyYWNlLnBwbSAtZm9ybWF0ICIlW21lYW5dIiBpbmZvOikNCisjICAgICRyZXBsYXlfbWVhbiA9IChjb252ZXJ0IDEtcmVwbGF5LnBwbSAtZm9ybWF0ICIlW21lYW5dIiBpbmZvOikNCisjICAgICR2ZXJzaW9uID0gKGlkZW50aWZ5IC12ZXJzaW9uKQ0KKyMNCisjICAgICMgbm9ybWFsaXplIHRoZSB2YWx1ZXMgc28gd2UgY2FuIHN1cHBvcnQgUTggYW5kIFExNiBpbWFnZW1hZ2ljayBpbnN0YWxsYXRpb25zDQorIyAgICBpZiAoJHZlcnNpb24gLW1hdGNoICJROCIpIHsNCisjICAgICAgICAkdHJhY2VfbWVhbiA9ICR0cmFjZV9tZWFuICAgLyAyNTUgIyAyXjgtMQ0KKyMgICAgICAgICRyZXBsYXlfbWVhbiA9ICRyZXBsYXlfbWVhbiAvIDI1NSAjIDJeOC0xDQorIyAgICB9IGVsc2Ugew0KKyMgICAgICAgICR0cmFjZV9tZWFuID0gJHRyYWNlX21lYW4gICAvIDY1NTM1ICMgMl4xNi0xDQorIyAgICAgICAgJHJlcGxheV9tZWFuID0gJHJlcGxheV9tZWFuIC8gNjU1MzUgIyAyXjE2LTENCisjICAgIH0NCisjDQorIyAgICAjIGlmIGVpdGhlciBzY3JlZW5zaG90IGlzIHRvbyBicmlnaHQgb3IgdG9vIGRhcmssIGl0IGVpdGhlciBmYWlsZWQsIG9yIGlzIGEgYmFkIHRlc3QNCisjICAgIGlmICgoJHRyYWNlX21lYW4gLWx0IDAuMTApIC1vciAoJHRyYWNlX21lYW4gLWd0IDAuOTApKXsNCisjICAgICAgICBlY2hvICcnDQorIyAgICAgICAgZWNobyAnVHJhY2Ugc2NyZWVuc2hvdCBmYWlsZWQgbWVhbiBjaGVjaywgbXVzdCBiZSBpbiByYW5nZSBbMC4xLCAwLjldJw0KKyMgICAgICAgIHdyaXRlLWhvc3QgJ0RldGVjdGVkIG1lYW46JyAkdHJhY2VfbWVhbg0KKyMgICAgICAgIGVjaG8gJycNCisjICAgICAgICB3cml0ZS1ob3N0IC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIHJlZCAiWyAgRkFJTEVEICBdICIgIC1ub25ld2xpbmU7DQorIyAgICAgICAgJGV4aXRzdGF0dXMgPSAxDQorIyAgICB9DQorIyAgICBpZiAoKCRyZXBsYXlfbWVhbiAtbHQgMC4xMCkgLW9yICgkcmVwbGF5X21lYW4gLWd0IDAuOTApKXsNCisjICAgICAgICBlY2hvICcnDQorIyAgICAgICAgZWNobyAnUmVwbGF5IHNjcmVlbnNob3QgZmFpbGVkIG1lYW4gY2hlY2ssIG11c3QgYmUgaW4gcmFuZ2UgWzAuMSwgMC45XScNCisjICAgICAgICB3cml0ZS1ob3N0ICdEZXRlY3RlZCBtZWFuOicgJHJlcGxheV9tZWFuDQorIyAgICAgICAgZWNobyAnJw0KKyMgICAgICAgIHdyaXRlLWhvc3QgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgcmVkICJbICBGQUlMRUQgIF0gIiAgLW5vbmV3bGluZTsNCisjICAgICAgICAkZXhpdHN0YXR1cyA9IDENCisjICAgIH0NCisjfQ0KKw0KKyMgaWYgd2UgcGFzc2VkIGFsbCB0aGUgY2hlY2tzLCB0aGUgdGVzdCBpcyBnb29kDQoraWYgKCRleGl0c3RhdHVzIC1lcSAwKSB7DQorICAgd3JpdGUtaG9zdCAtYmFja2dyb3VuZCBibGFjayAtZm9yZWdyb3VuZCBncmVlbiAiWyAgUEFTU0VEICBdICIgLW5vbmV3bGluZTsNCit9DQorDQord3JpdGUtaG9zdCAidmt0cmFjZXJlcGxheS5wczE6IFZrdHJhY2UgdHJhY2UvcmVwbGF5Ig0KK3dyaXRlLWhvc3QNCitpZiAoJGV4aXRzdGF0dXMpIHsNCisgICAgZWNobyAnMSBGQUlMRUQgVEVTVCcNCit9DQorDQorIyBjbGVhbnVwDQorY2QgLi4NCitybSAtcmVjdXJzZSAtZm9yY2Ugdmt0cmFjZXJlcGxheV90bXAgID4gJG51bGwgMj4gJG51bGwNCitSZW1vdmUtSXRlbSBFbnY6XFZLX0xBWUVSX1BBVEgNCitleGl0ICRleGl0c3RhdHVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNkLXNwdi5oIGIvdGVzdHMvaWNkLXNwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc1MjIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2ljZC1zcHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogQXV0aG9yOiBDb2R5IE5vcnRocm9wIDxjb2R5QGx1bmFyZy5jb20+Ci0gKi8KLQotI2lmbmRlZiBJQ0RfU1BWX0gKLSNkZWZpbmUgSUNEX1NQVl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBJQ0RfU1BWX01BR0lDICAgMHgwNzIzMDIwMwotI2RlZmluZSBJQ0RfU1BWX1ZFUlNJT04gOTkKLQotc3RydWN0IGljZF9zcHZfaGVhZGVyIHsKLSAgICB1aW50MzJfdCBtYWdpYzsKLSAgICB1aW50MzJfdCB2ZXJzaW9uOwotICAgIHVpbnQzMl90IGdlbl9tYWdpYzsgIC8vIEdlbmVyYXRvcidzIG1hZ2ljIG51bWJlcgotfTsKLQotI2VuZGlmIC8qIElDRF9TUFZfSCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF5ZXJfdmFsaWRhdGlvbl90ZXN0cy5jcHAgYi90ZXN0cy9sYXllcl92YWxpZGF0aW9uX3Rlc3RzLmNwcAppbmRleCBkM2RjOGMyLi45ZTgzNmMyIDEwMDY0NAotLS0gYS90ZXN0cy9sYXllcl92YWxpZGF0aW9uX3Rlc3RzLmNwcAorKysgYi90ZXN0cy9sYXllcl92YWxpZGF0aW9uX3Rlc3RzLmNwcApAQCAtNTEsNiArNTEsNyBAQAogI2RlZmluZSBTSEFERVJfQ0hFQ0tFUl9URVNUUyAxCiAjZGVmaW5lIERFVklDRV9MSU1JVFNfVEVTVFMgMQogI2RlZmluZSBJTUFHRV9URVNUUyAxCisjZGVmaW5lIEFQSV9EVU1QX1RFU1RTIDAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTWVzaCBhbmQgVmVydGV4Rm9ybWF0IERhdGEKQEAgLTMxNiw2ICszMTcsNyBAQAogICBwcm90ZWN0ZWQ6CiAgICAgRXJyb3JNb25pdG9yICptX2Vycm9yTW9uaXRvcjsKICAgICBib29sIG1fZW5hYmxlV1NJOworICAgIGJvb2wgbV9lbmFibGVBcGlEdW1wOwogCiAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewogICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGluc3RhbmNlX2xheWVyX25hbWVzOwpAQCAtMzIzLDYgKzMyNSwxMSBAQAogICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGRldmljZV9leHRlbnNpb25fbmFtZXM7CiAKICAgICAgICAgaW5zdGFuY2VfZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19FWFRfREVCVUdfUkVQT1JUX0VYVEVOU0lPTl9OQU1FKTsKKworICAgICAgICBpZiAobV9lbmFibGVBcGlEdW1wKSB7CisgICAgICAgICAgICBpbnN0YW5jZV9sYXllcl9uYW1lcy5wdXNoX2JhY2soIlZLX0xBWUVSX0xVTkFSR19hcGlfZHVtcCIpOworICAgICAgICB9CisKICAgICAgICAgLyoKICAgICAgICAgICogU2luY2UgQ3JlYXRlRGJnTXNnQ2FsbGJhY2sgaXMgYW4gaW5zdGFuY2UgbGV2ZWwgZXh0ZW5zaW9uIGNhbGwKICAgICAgICAgICogYW55IGV4dGVuc2lvbiAvIGxheWVyIHRoYXQgdXRpbGl6ZXMgdGhhdCBmZWF0dXJlIGFsc28gbmVlZHMKQEAgLTM4MCw3ICszODcsMTAgQEAKICAgICAgICAgZGVsZXRlIG1fZXJyb3JNb25pdG9yOwogICAgIH0KIAotICAgIFZrTGF5ZXJUZXN0KCkgeyBtX2VuYWJsZVdTSSA9IGZhbHNlOyB9CisgICAgVmtMYXllclRlc3QoKSB7CisgICAgICAgIG1fZW5hYmxlV1NJID0gZmFsc2U7CisgICAgICAgIG1fZW5hYmxlQXBpRHVtcCA9IGZhbHNlOworICAgIH0KIH07CiAKIFZrUmVzdWx0IFZrTGF5ZXJUZXN0OjpCZWdpbkNvbW1hbmRCdWZmZXIoVmtDb21tYW5kQnVmZmVyT2JqICZjb21tYW5kQnVmZmVyKSB7CkBAIC01ODIsNiArNTkyLDE1IEBACiAgICAgVmtXc2lFbmFibGVkTGF5ZXJUZXN0KCkgeyBtX2VuYWJsZVdTSSA9IHRydWU7IH0KIH07CiAKK2NsYXNzIFZrQXBpRHVtcEVuYWJsZWRMYXllclRlc3QgOiBwdWJsaWMgVmtMYXllclRlc3QgeworICBwdWJsaWM6Citwcm90ZWN0ZWQ6CisgICAgVmtBcGlEdW1wRW5hYmxlZExheWVyVGVzdCgpIHsKKyAgICAgICAgbV9lbmFibGVBcGlEdW1wID0gdHJ1ZTsKKyAgICB9Cit9OworCisKIGNsYXNzIFZrQnVmZmVyVGVzdCB7CiAgIHB1YmxpYzoKICAgICBlbnVtIGVUZXN0RW5GbGFncyB7CkBAIC03OTUsNiArODE0LDcgQEAKIH07CiAKIHVpbnQzMl90IFZrVmVydGljZXNPYmo6OkJpbmRJZEdlbmVyYXRvcjsKKwogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTk4NDcsNiArMTk4NjcsMTcgQEAKIH0KICNlbmRpZgogCisjaWYgQVBJX0RVTVBfVEVTVFMKK1RFU1RfRihWa0FwaUR1bXBFbmFibGVkTGF5ZXJUZXN0LCBUZXN0QXBpRHVtcCkgeworCisgICAgLy8gVGhpcyB0ZXN0IGludm9rZXMgdGhlIGZyYW1ld29yayBvbmx5LCBkdW1waW5nIGNvbW1hbmRzLgorICAgIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHRlc3QgaGFybmVzcyB0aGF0IGF1dG9tYXRpY2FsbHkgdmVyaWZpZXMKKyAgICAvLyB3ZSBjYW4gZHVtcCB0aGUgZW50aXJlIEFQSS4KKyAgICAvLyBUaGlzIHRlc3QganVzdCBjaGVja3MgZm9yIGEgcHVsc2UsIHVzaW5nIHZpc3VhbCBpbnNwZWN0aW9uLgorICAgIFRFU1RfREVTQ1JJUFRJT04oIkVtcHR5IHRlc3Qgd2l0aCBBcGlEdW1wIGVuYWJsZWQuIik7Cit9CisjZW5kaWYKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgaW50IHJlc3VsdDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuX2FsbF90ZXN0cy5zaCBiL3Rlc3RzL3J1bl9hbGxfdGVzdHMuc2gKaW5kZXggOGNmNjkxZS4uNDMwODQwYSAxMDA3NTUKLS0tIGEvdGVzdHMvcnVuX2FsbF90ZXN0cy5zaAorKysgYi90ZXN0cy9ydW5fYWxsX3Rlc3RzLnNoCkBAIC0xNiwzICsxNiw2IEBACiAjIGNhdGNoIHRoZSBlcnJvcnMgdGhhdCB0aGV5IGFyZSBzdXBwb3NlZCB0byBieSBpbnRlbnRpb25hbGx5IGRvaW5nIHRoaW5ncwogIyB0aGF0IGFyZSB3cm9uZwogLi92a19sYXllcl92YWxpZGF0aW9uX3Rlc3RzCisKKyMgdmt0cmFjZXJlcGxheS5zaCB0ZXN0cyB2a3RyYWNlIHRyYWNlIGFuZCByZXBsYXkKKy4vdmt0cmFjZXJlcGxheS5zaApkaWZmIC0tZ2l0IGEvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrYW5kcm9pZC5oIGIvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrYW5kcm9pZC5oCmluZGV4IDlkMTYwOTcuLjkyMmM0NTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZrdGVzdGZyYW1ld29ya2FuZHJvaWQuaAorKysgYi90ZXN0cy92a3Rlc3RmcmFtZXdvcmthbmRyb2lkLmgKQEAgLTQsNiArNCw5IEBACiAvLyAgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KIC8vICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KIC8vICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBHb29nbGUsIEluYy4KKy8vICBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorLy8gIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorLy8gIENvcHlyaWdodCAoQykgMjAxNSBHb29nbGUsIEluYy4KIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3Rlc3RzL3ZrdHJhY2VyZXBsYXkuc2ggYi90ZXN0cy92a3RyYWNlcmVwbGF5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlYzlhNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy92a3RyYWNlcmVwbGF5LnNoCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9iYXNoCisjc2V0IC14CitpZiBbIC10IDEgXSA7IHRoZW4KKyAgICBSRUQ9J1wwMzNbMDszMW0nCisgICAgR1JFRU49J1wwMzNbMDszMm0nCisgICAgTkM9J1wwMzNbMG0nICMgTm8gQ29sb3IKK2Vsc2UKKyAgICBSRUQ9JycKKyAgICBHUkVFTj0nJworICAgIE5DPScnCitmaQorCitwcmludGYgIiRHUkVFTlsgUlVOICAgICAgXSROQyAkMFxuIgorCitleHBvcnQgTERfTElCUkFSWV9QQVRIPSR7UFdEfS8uLi9sb2FkZXI6JHtMRF9MSUJSQVJZX1BBVEh9CitleHBvcnQgVktfTEFZRVJfUEFUSD0ke1BXRH0vLi4vbGF5ZXJzdnQKKworZnVuY3Rpb24gdHJhY2VfcmVwbGF5IHsKKwlQR009JDEKKwlWS1RSQUNFPSR7UFdEfS8uLi92a3RyYWNlL3ZrdHJhY2UKKwlWS1JFUExBWT0ke1BXRH0vLi4vdmt0cmFjZS92a3JlcGxheQorCUFQUERJUj0ke1BXRH0vLi4vZGVtb3MKKwlwcmludGYgIiRHUkVFTlsgVFJBQ0UgICAgXSROQyAke1BHTX1cbiIKKwkke1ZLVFJBQ0V9CS0tUHJvZ3JhbSAke0FQUERJUn0vJHtQR019IFwKKwkJCS0tQXJndW1lbnRzICItLWMgMTAwIiBcCisJCQktLVdvcmtpbmdEaXIgJHtBUFBESVJ9IFwKKwkJCS0tT3V0cHV0VHJhY2UgJHtQR019LnZrdHJhY2UgXAorCQkJLXMgMQorCXByaW50ZiAiJEdSRUVOWyBSRVBMQVkgICBdJE5DICR7UEdNfVxuIgorCSR7VktSRVBMQVl9CS0tVHJhY2VGaWxlICR7UEdNfS52a3RyYWNlIFwKKwkJCS1zIDEKKwlybSAtZiAke1BHTX0udmt0cmFjZQorCWNtcCAtcyAxLnBwbSAke0FQUERJUn0vMS5wcG0KKwlSRVM9JD8KKwlybSAxLnBwbSAke0FQUERJUn0vMS5wcG0KKwlpZiBbICRSRVMgLWVxIDAgXSA7IHRoZW4KKwkgICBwcmludGYgIiRHUkVFTlsgIFBBU1NFRCAgXSROQyAke1BHTX1cbiIKKwllbHNlCisJICAgcHJpbnRmICIkUkVEWyAgRkFJTEVEICBdJE5DIHNjcmVlbnNob3QgZmlsZSBjb21wYXJlIGZhaWxlZFxuIgorCSAgIHByaW50ZiAiJFJFRFsgIEZBSUxFRCAgXSROQyAke1BHTX1cbiIKKwkgICBwcmludGYgIlRFU1QgRkFJTEVEXG4iCisJICAgZXhpdCAxCisJZmkKK30KKwordHJhY2VfcmVwbGF5IGN1YmUKKworZXhpdCAwCisKZGlmZiAtLWdpdCBhL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLmJhdCBiL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLmJhdAppbmRleCA2NWQxNTFmLi43YWM1MDkwIDEwMDY0NAotLS0gYS91cGRhdGVfZXh0ZXJuYWxfc291cmNlcy5iYXQKKysrIGIvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuYmF0CkBAIC0xNiw2ICsxNiw3IEBACiBzZXQgQkFTRV9ESVI9IiVCVUlMRF9ESVIlZXh0ZXJuYWwiCiBzZXQgR0xTTEFOR19ESVI9JUJBU0VfRElSJVxnbHNsYW5nCiBzZXQgU1BJUlZfVE9PTFNfRElSPSVCQVNFX0RJUiVcc3BpcnYtdG9vbHMKK3NldCBKU09OQ1BQX0RJUj0lQkFTRV9ESVIlXGpzb25jcHAKIAogUkVNIC8vID09PT09PT09IFBhcmFtZXRlciBwYXJzaW5nID09PT09PT09IC8vCiAKQEAgLTI1LDE2ICsyNiwyMCBAQAogICAgICAgZWNobyBBdmFpbGFibGUgb3B0aW9uczoKICAgICAgIGVjaG8gICAtLXN5bmMtZ2xzbGFuZyAgICAgIGp1c3QgcHVsbCBnbHNsYW5nX3JldmlzaW9uCiAgICAgICBlY2hvICAgLS1zeW5jLXNwaXJ2LXRvb2xzICBqdXN0IHB1bGwgc3BpcnYtdG9vbHNfcmV2aXNpb24KKyAgICAgIGVjaG8gICAtLXN5bmMtanNvbmNwcCAgICAgIGp1c3QgcHVsbCBqc29uY3BwIEhFQUQKICAgICAgIGVjaG8gICAtLWJ1aWxkLWdsc2xhbmcgICAgIHB1bGxzIGdsc2xhbmdfcmV2aXNpb24sIGNvbmZpZ3VyZXMgQ01ha2UsIGJ1aWxkcyBSZWxlYXNlIGFuZCBEZWJ1ZwogICAgICAgZWNobyAgIC0tYnVpbGQtc3BpcnYtdG9vbHMgcHVsbHMgc3BpcnYtdG9vbHNfcmV2aXNpb24sIGNvbmZpZ3VyZXMgQ01ha2UsIGJ1aWxkcyBSZWxlYXNlIGFuZCBEZWJ1ZwotICAgICAgZWNobyAgIC0tYWxsICAgICAgICAgICAgICAgc3luYyBhbmQgYnVpbGQgZ2xzbGFuZywgTHVuYXJHTEFTUywgc3BpcnYtdG9vbHMKKyAgICAgIGVjaG8gICAtLWJ1aWxkLWpzb25jcHAgICAgIHB1bGxzIGpzb25jcHAgSEVBRCwgY29uZmlndXJlcyBDTWFrZSwgYnVpbGRzIFJlbGVhc2UgYW5kIERlYnVnCisgICAgICBlY2hvICAgLS1hbGwgICAgICAgICAgICAgICBzeW5jIGFuZCBidWlsZCBnbHNsYW5nLCBMdW5hckdMQVNTLCBzcGlydi10b29scywgYW5kIGpzb25jcHAKICAgICAgIGdvdG86ZmluaXNoCiAgICApCiAKICAgIHNldCBzeW5jLWdsc2xhbmc9MAogICAgc2V0IHN5bmMtc3BpcnYtdG9vbHM9MAorICAgc2V0IHN5bmMtanNvbmNwcD0wCiAgICBzZXQgYnVpbGQtZ2xzbGFuZz0wCiAgICBzZXQgYnVpbGQtc3BpcnYtdG9vbHM9MAorICAgc2V0IGJ1aWxkLWpzb25jcHA9MAogICAgc2V0IGNoZWNrLWdsc2xhbmctYnVpbGQtZGVwZW5kZW5jaWVzPTAKIAogICAgOnBhcmFtZXRlckxvb3AKQEAgLTUzLDYgKzU4LDEyIEBACiAgICAgICAgICBnb3RvOnBhcmFtZXRlckxvb3AKICAgICAgICkKIAorICAgICAgaWYgIiUxIiA9PSAiLS1zeW5jLWpzb25jcHAiICgKKyAgICAgICAgIHNldCBzeW5jLWpzb25jcHA9MQorICAgICAgICAgc2hpZnQKKyAgICAgICAgIGdvdG86cGFyYW1ldGVyTG9vcAorICAgICAgKQorCiAgICAgICBpZiAiJTEiID09ICItLWJ1aWxkLWdsc2xhbmciICgKICAgICAgICAgIHNldCBzeW5jLWdsc2xhbmc9MQogICAgICAgICAgc2V0IGNoZWNrLWdsc2xhbmctYnVpbGQtZGVwZW5kZW5jaWVzPTEKQEAgLTcwLDExICs4MSwyMCBAQAogICAgICAgICAgZ290bzpwYXJhbWV0ZXJMb29wCiAgICAgICApCiAKKyAgICAgIGlmICIlMSIgPT0gIi0tYnVpbGQtanNvbmNwcCIgKAorICAgICAgICAgc2V0IHN5bmMtanNvbmNwcHM9MQorICAgICAgICAgc2V0IGJ1aWxkLWpzb25jcHA9MQorICAgICAgICAgc2hpZnQKKyAgICAgICAgIGdvdG86cGFyYW1ldGVyTG9vcAorICAgICAgKQorCiAgICAgICBpZiAiJTEiID09ICItLWFsbCIgKAogICAgICAgICAgc2V0IHN5bmMtZ2xzbGFuZz0xCiAgICAgICAgICBzZXQgc3luYy1zcGlydi10b29scz0xCisgICAgICAgICBzZXQgc3luYy1qc29uY3BwPTEKICAgICAgICAgIHNldCBidWlsZC1nbHNsYW5nPTEKICAgICAgICAgIHNldCBidWlsZC1zcGlydi10b29scz0xCisgICAgICAgICBzZXQgYnVpbGQtanNvbmNwcD0xCiAgICAgICAgICBzZXQgY2hlY2stZ2xzbGFuZy1idWlsZC1kZXBlbmRlbmNpZXM9MQogICAgICAgICAgc2hpZnQKICAgICAgICAgIGdvdG86cGFyYW1ldGVyTG9vcApAQCAtMTM4LDEwICsxNTgsMTEgQEAKIHNldCAvcCBHTFNMQU5HX1JFVklTSU9OPSA8IGdsc2xhbmdfcmV2aXNpb24KIHNldCAvcCBTUElSVl9UT09MU19SRVZJU0lPTj0gPCBzcGlydi10b29sc19yZXZpc2lvbgogc2V0IC9wIFNQSVJWX0hFQURFUlNfUkVWSVNJT049IDwgc3BpcnYtaGVhZGVyc19yZXZpc2lvbgorc2V0IC9wIEpTT05DUFBfUkVWSVNJT049IDwganNvbmNwcF9yZXZpc2lvbgogZWNobyBHTFNMQU5HX1JFVklTSU9OPSVHTFNMQU5HX1JFVklTSU9OJQogZWNobyBTUElSVl9UT09MU19SRVZJU0lPTj0lU1BJUlZfVE9PTFNfUkVWSVNJT04lCiBlY2hvIFNQSVJWX0hFQURFUlNfUkVWSVNJT049JVNQSVJWX0hFQURFUlNfUkVWSVNJT04lCi0KK2VjaG8gSlNPTkNQUF9SRVZJU0lPTj0lSlNPTkNQUF9SRVZJU0lPTiUKIAogZWNobyBDcmVhdGluZyBhbmQvb3IgdXBkYXRpbmcgZ2xzbGFuZywgc3BpcnYtdG9vbHMgaW4gJUJBU0VfRElSJQogCkBAIC0xNzAsNiArMTkxLDE5IEBACiAgICBpZiAlZXJyb3JDb2RlJSBuZXEgMCAoZ290bzplcnJvcikKICkKIAoraWYgJXN5bmMtanNvbmNwcCUgZXF1IDEgKAorICAgaWYgZXhpc3QgJUpTT05DUFBfRElSJSAoCisgICAgICByZCAvUyAvUSAlSlNPTkNQUF9ESVIlCisgICApCisgICBpZiAlZXJyb3JsZXZlbCUgbmVxIDAgKGdvdG86ZXJyb3IpCisgICBpZiBub3QgZXhpc3QgJUpTT05DUFBfRElSJSAoCisgICAgICBjYWxsOmNyZWF0ZV9qc29uY3BwCisgICApCisgICBpZiAlZXJyb3JDb2RlJSBuZXEgMCAoZ290bzplcnJvcikKKyAgIGNhbGw6dXBkYXRlX2pzb25jcHAKKyAgIGlmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQorKQorCiBpZiAlYnVpbGQtZ2xzbGFuZyUgZXF1IDEgKAogICAgY2FsbDpidWlsZF9nbHNsYW5nCiAgICBpZiAlZXJyb3JDb2RlJSBuZXEgMCAoZ290bzplcnJvcikKQEAgLTE4MCw2ICsyMTQsMTEgQEAKICAgIGlmICVlcnJvckNvZGUlIG5lcSAwIChnb3RvOmVycm9yKQogKQogCitpZiAlYnVpbGQtanNvbmNwcCUgZXF1IDEgKAorICAgY2FsbDpidWlsZF9qc29uY3BwCisgICBpZiAlZXJyb3JDb2RlJSBuZXEgMCAoZ290bzplcnJvcikKKykKKwogZWNoby4KIGVjaG8gRXhpdGluZwogZ290bzpmaW5pc2gKQEAgLTE5NCw4ICsyMzMsNiBAQAogZW5kbG9jYWwKIGdvdG86ZW9mCiAKLQotCiBSRU0gLy8gPT09PT09PT0gRnVuY3Rpb25zID09PT09PT09IC8vCiAKIDpjcmVhdGVfZ2xzbGFuZwpAQCAtMzk4LDMgKzQzNSwxMDMgQEAKICAgICAgIHNldCBlcnJvckNvZGU9MQogICAgKQogZ290bzplb2YKKworOmNyZWF0ZV9qc29uY3BwCisgICBlY2hvLgorICAgZWNobyBDcmVhdGluZyBsb2NhbCBqc29uY3BwIHJlcG9zaXRvcnkgJUpTT05DUFBfRElSJSkKKyAgIG1rZGlyICVKU09OQ1BQX0RJUiUKKyAgIGNkICVKU09OQ1BQX0RJUiUKKyAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vb3Blbi1zb3VyY2UtcGFyc2Vycy9qc29uY3BwLmdpdCAuCisgICBnaXQgY2hlY2tvdXQgJUpTT05DUFBfUkVWSVNJT04lCisgICBpZiBub3QgZXhpc3QgJUpTT05DUFBfRElSJVxpbmNsdWRlXGpzb25canNvbi5oICgKKyAgICAgIGVjaG8ganNvbmNwcCBzb3VyY2UgZG93bmxvYWQgZmFpbGVkIQorICAgICAgc2V0IGVycm9yQ29kZT0xCisgICApCitnb3RvOmVvZgorCis6dXBkYXRlX2pzb25jcHAKKyAgIGVjaG8uCisgICBlY2hvIFVwZGF0aW5nICVKU09OQ1BQX0RJUiUKKyAgIGNkICVKU09OQ1BQX0RJUiUKKyAgIGdpdCBmZXRjaCAtLWFsbAorICAgZ2l0IGNoZWNrb3V0ICVKU09OQ1BQX1JFVklTSU9OJQorZ290bzplb2YKKworOmJ1aWxkX2pzb25jcHAKKyAgIGVjaG8uCisgICBlY2hvIEJ1aWxkaW5nICVKU09OQ1BQX0RJUiUKKyAgIGNkICAlSlNPTkNQUF9ESVIlCisgICBweXRob24gYW1hbGdhbWF0ZS5weQorICAgCisgICBpZiBub3QgZXhpc3QgJUpTT05DUFBfRElSJVxkaXN0XGpzb25canNvbi5oICgKKyAgICAgIGVjaG8uCisgICAgICBlY2hvIEpzb25DUFAgQW1hbGdhbWF0aW9uIGZhaWxlZCB0byBnZW5lcmF0ZSAlSlNPTkNQUF9ESVIlXGRpc3RcanNvblxqc29uLmgKKyAgICAgIHNldCBlcnJvckNvZGU9MQorICAgKQorCitSRU0gICAgUkVNIENsZWFudXAgYW55IG9sZCBkaXJlY3RvcmllcyBseWluZyBhcm91bmQuCitSRU0gICAgaWYgZXhpc3QgYnVpbGQzMiAoCitSRU0gICAgICAgcm1kaXIgL3MgL3EgYnVpbGQzMgorUkVNICAgICkKK1JFTSAgICBpZiBleGlzdCBidWlsZCAoCitSRU0gICAgICAgcm1kaXIgL3MgL3EgYnVpbGQKK1JFTSAgICApCitSRU0gCitSRU0gICAgZWNobyBNYWtpbmcgMzItYml0IGpzb25jcHAKK1JFTSAgICBlY2hvICoqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTSAgICBta2RpciBidWlsZDMyCitSRU0gICAgc2V0IEpTT05DUFBfQlVJTERfRElSPSVKU09OQ1BQX0RJUiVcYnVpbGQzMgorUkVNICAgIGNkICVKU09OQ1BQX0JVSUxEX0RJUiUKK1JFTSAKK1JFTSAgICBlY2hvIEdlbmVyYXRpbmcgMzItYml0IEpzb25DUFAgQ01ha2UgZmlsZXMgZm9yIFZpc3VhbCBTdHVkaW8gJVZTX1ZFUlNJT04lCitSRU0gICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gJVZTX1ZFUlNJT04lIiAuLiAtRE1TVkNfUlVOVElNRT1zdGF0aWMKK1JFTSAKK1JFTSAgICBlY2hvIEJ1aWxkaW5nIDMyLWJpdCBKc29uQ1BQOiBNU0J1aWxkIEFMTF9CVUlMRC52Y3hwcm9qIC9wOlBsYXRmb3JtPXg4NiAvcDpDb25maWd1cmF0aW9uPURlYnVnCitSRU0gICAgbXNidWlsZCBBTExfQlVJTEQudmN4cHJvaiAvcDpQbGF0Zm9ybT14ODYgL3A6Q29uZmlndXJhdGlvbj1EZWJ1ZyAvdmVyYm9zaXR5OnF1aWV0CitSRU0gCitSRU0gICAgUkVNIENoZWNrIGZvciBleGlzdGVuY2Ugb2Ygb25lIGxpYiwgZXZlbiB0aG91Z2ggd2Ugc2hvdWxkIGNoZWNrIGZvciBhbGwgcmVzdWx0cworUkVNICAgIGlmIG5vdCBleGlzdCAlSlNPTkNQUF9CVUlMRF9ESVIlXHNyY1xsaWJfanNvblxEZWJ1Z1xqc29uY3BwLmxpYiAoCitSRU0gICAgICAgZWNoby4KK1JFTSAgICAgICBlY2hvIGpzb25jcHAgMzItYml0IERlYnVnIGJ1aWxkIGZhaWxlZCEKK1JFTSAgICAgICBzZXQgZXJyb3JDb2RlPTEKK1JFTSAgICApCitSRU0gICAgZWNobyBCIEJ1aWxkaW5nIDMyLWJpdCBKc29uQ1BQOiBNU0J1aWxkIEFMTF9CVUlMRC52Y3hwcm9qIC9wOlBsYXRmb3JtPXg4NiAvcDpDb25maWd1cmF0aW9uPVJlbGVhc2UKK1JFTSAgICBtc2J1aWxkIEFMTF9CVUlMRC52Y3hwcm9qIC9wOlBsYXRmb3JtPXg4NiAvcDpDb25maWd1cmF0aW9uPVJlbGVhc2UgL3ZlcmJvc2l0eTpxdWlldAorUkVNIAorUkVNICAgIFJFTSBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG9uZSBsaWIsIGV2ZW4gdGhvdWdoIHdlIHNob3VsZCBjaGVjayBmb3IgYWxsIHJlc3VsdHMKK1JFTSAgICBpZiBub3QgZXhpc3QgJUpTT05DUFBfQlVJTERfRElSJVxzcmNcbGliX2pzb25cUmVsZWFzZVxqc29uY3BwLmxpYiAoCitSRU0gICAgICAgZWNoby4KK1JFTSAgICAgICBlY2hvIGpzb25jcHAgMzItYml0IFJlbGVhc2UgYnVpbGQgZmFpbGVkIQorUkVNICAgICAgIHNldCBlcnJvckNvZGU9MQorUkVNICAgICkKK1JFTSAKK1JFTSAgICBjZCAuLgorUkVNIAorUkVNICAgIGVjaG8gTWFraW5nIDY0LWJpdCBqc29uY3BwCitSRU0gICAgZWNobyAqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU0gICAgbWtkaXIgYnVpbGQKK1JFTSAgICBzZXQgSlNPTkNQUF9CVUlMRF9ESVI9JUpTT05DUFBfRElSJVxidWlsZAorUkVNICAgIGNkICVKU09OQ1BQX0JVSUxEX0RJUiUKK1JFTSAKK1JFTSAgICBlY2hvIEdlbmVyYXRpbmcgNjQtYml0IEpzb25DUFAgQ01ha2UgZmlsZXMgZm9yIFZpc3VhbCBTdHVkaW8gJVZTX1ZFUlNJT04lCitSRU0gICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gJVZTX1ZFUlNJT04lIFdpbjY0IiAuLiAtRE1TVkNfUlVOVElNRT1zdGF0aWMKK1JFTSAKK1JFTSAgICBlY2hvIEJ1aWxkaW5nIDY0LWJpdCBKc29uQ1BQOiBNU0J1aWxkIEFMTF9CVUlMRC52Y3hwcm9qIC9wOlBsYXRmb3JtPXg2NCAvcDpDb25maWd1cmF0aW9uPURlYnVnCitSRU0gICAgbXNidWlsZCBBTExfQlVJTEQudmN4cHJvaiAvcDpQbGF0Zm9ybT14NjQgL3A6Q29uZmlndXJhdGlvbj1EZWJ1ZyAvdmVyYm9zaXR5OnF1aWV0CitSRU0gCitSRU0gICAgUkVNIENoZWNrIGZvciBleGlzdGVuY2Ugb2Ygb25lIGxpYiwgZXZlbiB0aG91Z2ggd2Ugc2hvdWxkIGNoZWNrIGZvciBhbGwgcmVzdWx0cworUkVNICAgIGlmIG5vdCBleGlzdCAlSlNPTkNQUF9CVUlMRF9ESVIlXHNyY1xsaWJfanNvblxEZWJ1Z1xqc29uY3BwLmxpYiAoCitSRU0gICAgICAgZWNoby4KK1JFTSAgICAgICBlY2hvIGpzb25jcHAgNjQtYml0IERlYnVnIGJ1aWxkIGZhaWxlZCEKK1JFTSAgICAgICBzZXQgZXJyb3JDb2RlPTEKK1JFTSAgICApCitSRU0gICAgZWNobyBCdWlsZGluZyA2NC1iaXQgSnNvbkNQUDogTVNCdWlsZCBBTExfQlVJTEQudmN4cHJvaiAvcDpQbGF0Zm9ybT14NjQgL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlCitSRU0gICAgbXNidWlsZCBBTExfQlVJTEQudmN4cHJvaiAvcDpQbGF0Zm9ybT14NjQgL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlIC92ZXJib3NpdHk6cXVpZXQKK1JFTSAKK1JFTSAgICBSRU0gQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBvbmUgbGliLCBldmVuIHRob3VnaCB3ZSBzaG91bGQgY2hlY2sgZm9yIGFsbCByZXN1bHRzCitSRU0gICAgaWYgbm90IGV4aXN0ICVKU09OQ1BQX0JVSUxEX0RJUiVcc3JjXGxpYl9qc29uXFJlbGVhc2VcanNvbmNwcC5saWIgKAorUkVNICAgICAgIGVjaG8uCitSRU0gICAgICAgZWNobyBqc29uY3BwIDY0LWJpdCBSZWxlYXNlIGJ1aWxkIGZhaWxlZCEKK1JFTSAgICAgICBzZXQgZXJyb3JDb2RlPTEKK1JFTSAgICApCitnb3RvOmVvZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZV9leHRlcm5hbF9zb3VyY2VzLnNoIGIvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuc2gKaW5kZXggNmY4NzkwMy4uNTYyMzFhMyAxMDA3NTUKLS0tIGEvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuc2gKKysrIGIvdXBkYXRlX2V4dGVybmFsX3NvdXJjZXMuc2gKQEAgLTYsOSArNiwxNCBAQAogR0xTTEFOR19SRVZJU0lPTj0kKGNhdCAiJHtQV0R9Ii9nbHNsYW5nX3JldmlzaW9uKQogU1BJUlZfVE9PTFNfUkVWSVNJT049JChjYXQgIiR7UFdEfSIvc3BpcnYtdG9vbHNfcmV2aXNpb24pCiBTUElSVl9IRUFERVJTX1JFVklTSU9OPSQoY2F0ICIke1BXRH0iL3NwaXJ2LWhlYWRlcnNfcmV2aXNpb24pCitKU09OQ1BQX1JFVklTSU9OPSQoY2F0ICIke1BXRH0iL2pzb25jcHBfcmV2aXNpb24pCiBlY2hvICJHTFNMQU5HX1JFVklTSU9OPSR7R0xTTEFOR19SRVZJU0lPTn0iCiBlY2hvICJTUElSVl9UT09MU19SRVZJU0lPTj0ke1NQSVJWX1RPT0xTX1JFVklTSU9OfSIKIGVjaG8gIlNQSVJWX0hFQURFUlNfUkVWSVNJT049JHtTUElSVl9IRUFERVJTX1JFVklTSU9OfSIKK2VjaG8gIkpTT05DUFBfUkVWSVNJT049JHtKU09OQ1BQX1JFVklTSU9OfSIKKworTFVOQVJHTEFTU19SRVZJU0lPTj0kKGNhdCAiJHtQV0R9Ii9MdW5hckdMQVNTX3JldmlzaW9uKQorZWNobyAiTFVOQVJHTEFTU19SRVZJU0lPTj0kTFVOQVJHTEFTU19SRVZJU0lPTiIKIAogQlVJTERESVI9JFBXRAogQkFTRURJUj0kQlVJTERESVIvZXh0ZXJuYWwKQEAgLTY4LDYgKzczLDU1IEBACiAgICBtYWtlIGluc3RhbGwKIH0KIAorZnVuY3Rpb24gY3JlYXRlX0x1bmFyR0xBU1MgKCkgeworICAgcm0gLXJmICIke0JBU0VESVJ9Ii9MdW5hckdMQVNTCisgICBlY2hvICJDcmVhdGluZyBsb2NhbCBMdW5hckdMQVNTIHJlcG9zaXRvcnkgKCR7QkFTRURJUn0vTHVuYXJHTEFTUykuIgorICAgbWtkaXIgLXAgIiR7QkFTRURJUn0iL0x1bmFyR0xBU1MKKyAgIGNkICIke0JBU0VESVJ9Ii9MdW5hckdMQVNTCisgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0x1bmFyRy9MdW5hckdMQVNTLmdpdCAuCisgICBta2RpciAtcCBDb3JlL0xMVk0KKyAgIGNkIENvcmUvTExWTSAKKyAgIHdnZXQgaHR0cDovL2xsdm0ub3JnL3JlbGVhc2VzLzMuNC9sbHZtLTMuNC5zcmMudGFyLmd6CisgICB0YXIgLS1nemlwIC14ZiBsbHZtLTMuNC5zcmMudGFyLmd6CisgICBnaXQgY2hlY2tvdXQgLWYgJExVTkFSR0xBU1NfUkVWSVNJT04gLiAjIHB1dCBiYWNrIHRoZSBMdW5hckdMQVNTIHZlcnNpb25zIG9mIHNvbWUgTExWTSBmaWxlcworICAgIyBjb3B5IG92ZXJsYXkgZmlsZXMKKyAgIGNkICIke0JBU0VESVJ9Ii9MdW5hckdMQVNTCisgICBjcCAtUiAiJHtCVUlMRERJUn0iL0x1bmFyR0xBU1MvKiAuCit9CisKK2Z1bmN0aW9uIHVwZGF0ZV9MdW5hckdMQVNTICgpIHsKKyAgIGVjaG8gIlVwZGF0aW5nICR7QkFTRURJUn0vTHVuYXJHTEFTUyIKKyAgIGNkICIke0JBU0VESVJ9Ii9MdW5hckdMQVNTCisgICBnaXQgZmV0Y2gKKyAgIGdpdCBjaGVja291dCAtZiAkTFVOQVJHTEFTU19SRVZJU0lPTiAuCisgICAjIEZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaXMgd2l0aCBnaXQKKyAgICNnaXQgY2hlY2tvdXQgJExVTkFSR0xBU1NfUkVWSVNJT04gfCYgdGVlIGdpdG91dAorICAgI2lmIGdyZXAgLS1xdWlldCBMTFZNIGdpdG91dCA7IHRoZW4KKyAgICMgICBybSAtcmYgJEJBU0VESVIvTHVuYXJHTEFTUy9Db3JlL0xMVk0vbGx2bS0zLjQvYnVpbGQKKyAgICNmaQorICAgI3JtIC1yZiBnaXRvdXQKKyAKKyAgICMgY29weSBvdmVybGF5IGZpbGVzCisgICBjcCAtUiAiJHtCVUlMRERJUn0iL0x1bmFyR0xBU1MvKiAuCit9CisKK2Z1bmN0aW9uIGJ1aWxkX0x1bmFyR0xBU1MgKCkgeworICAgZWNobyAiQnVpbGRpbmcgJHtCQVNFRElSfS9MdW5hckdMQVNTIgorICAgY2QgIiR7QkFTRURJUn0iL0x1bmFyR0xBU1MvQ29yZS9MTFZNL2xsdm0tMy40CisgICBpZiBbICEgLWQgIiR7QkFTRURJUn0vTHVuYXJHTEFTUy9Db3JlL0xMVk0vbGx2bS0zLjQvYnVpbGQiIF07IHRoZW4KKyAgICAgIG1rZGlyIC1wIGJ1aWxkCisgICAgICBjZCBidWlsZAorICAgICAgLi4vY29uZmlndXJlIC0tZW5hYmxlLXRlcm1pbmZvPW5vIC0tZW5hYmxlLWN1cnNlcz1ubworICAgICAgUkVRVUlSRVNfUlRUST0xIG1ha2UgLWogJChucHJvYykgJiYgbWFrZSBpbnN0YWxsIERFU1RESVI9YHB3ZGAvaW5zdGFsbAorICAgZmkKKyAgIGNkICIke0JBU0VESVJ9Ii9MdW5hckdMQVNTCisgICBta2RpciAtcCBidWlsZAorICAgY2QgYnVpbGQKKyAgIGNtYWtlIC1EIENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAuLgorICAgbWFrZQorICAgbWFrZSBpbnN0YWxsCit9CisKIGZ1bmN0aW9uIGJ1aWxkX3NwaXJ2LXRvb2xzICgpIHsKICAgIGVjaG8gIkJ1aWxkaW5nICR7QkFTRURJUn0vc3BpcnYtdG9vbHMiCiAgICBjZCAiJHtCQVNFRElSfSIvc3BpcnYtdG9vbHMKQEAgLTc3LDE3ICsxMzEsNDIgQEAKICAgIG1ha2UgLWogJChucHJvYykKIH0KIAotIyBJZiBhbnkgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGp1c3QgY29tcGlsZSB0aG9zZSB0b29scwotIyBJZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgYnVpbGQgZXZlcnl0aGluZworZnVuY3Rpb24gY3JlYXRlX2pzb25jcHAgKCkgeworICAgcm0gLXJmICR7QkFTRURJUn0vanNvbmNwcAorICAgZWNobyAiQ3JlYXRpbmcgbG9jYWwganNvbmNwcCByZXBvc2l0b3J5ICgke0JBU0VESVJ9L2pzb25jcHApLiIKKyAgIG1rZGlyIC1wICR7QkFTRURJUn0vanNvbmNwcAorICAgY2QgJHtCQVNFRElSfS9qc29uY3BwCisgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL29wZW4tc291cmNlLXBhcnNlcnMvanNvbmNwcC5naXQgLgorICAgZ2l0IGNoZWNrb3V0ICR7SlNPTkNQUF9SRVZJU0lPTn0KK30KKworZnVuY3Rpb24gdXBkYXRlX2pzb25jcHAgKCkgeworICAgZWNobyAiVXBkYXRpbmcgJHtCQVNFRElSfS9qc29uY3BwIgorICAgY2QgJHtCQVNFRElSfS9qc29uY3BwCisgICBnaXQgZmV0Y2ggLS1hbGwKKyAgIGdpdCBjaGVja291dCAke0pTT05DUFBfUkVWSVNJT059Cit9CisKK2Z1bmN0aW9uIGJ1aWxkX2pzb25jcHAgKCkgeworICAgZWNobyAiQnVpbGRpbmcgJHtCQVNFRElSfS9qc29uY3BwIgorICAgY2QgJHtCQVNFRElSfS9qc29uY3BwCisgICBweXRob24gYW1hbGdhbWF0ZS5weQorfQorCiBJTkNMVURFX0dMU0xBTkc9ZmFsc2UKIElOQ0xVREVfU1BJUlZfVE9PTFM9ZmFsc2UKK0lOQ0xVREVfTFVOQVJHTEFTUz1mYWxzZQorSU5DTFVERV9KU09OQ1BQPWZhbHNlCiAKIGlmIFsgIiQjIiA9PSAwIF07IHRoZW4KLSAgZWNobyAiQnVpbGRpbmcgZ2xzbGFuZywgc3BpcnYtdG9vbHMiCisgICMgSWYgbm8gb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGJ1aWxkIGV2ZXJ5dGhpbmcKKyAgZWNobyAiQnVpbGRpbmcgZ2xzbGFuZywgc3BpcnYtdG9vbHMsIEx1bmFyR0xBU1MsIGFuZCBqc29uY3BwIgogICBJTkNMVURFX0dMU0xBTkc9dHJ1ZQogICBJTkNMVURFX1NQSVJWX1RPT0xTPXRydWUKKyAgSU5DTFVERV9MVU5BUkdMQVNTPXRydWUKKyAgSU5DTFVERV9KU09OQ1BQPXRydWUKIGVsc2UKLSAgIyBQYXJzZSBvcHRpb25zCisgICMgSWYgYW55IG9wdGlvbnMgYXJlIHByb3ZpZGVkLCBqdXN0IGNvbXBpbGUgdGhvc2UgdG9vbHMKICAgd2hpbGUgW1sgJCMgPiAwIF1dCiAgIGRvCiAgICAgb3B0aW9uPSIkMSIKQEAgLTk4LDE2ICsxNzcsMzIgQEAKICAgICAgICAgSU5DTFVERV9HTFNMQU5HPXRydWUKICAgICAgICAgZWNobyAiQnVpbGRpbmcgZ2xzbGFuZyAoJG9wdGlvbikiCiAgICAgICAgIDs7CisKICAgICAgICAgIyBvcHRpb25zIHRvIHNwZWNpZnkgYnVpbGQgb2Ygc3BpcnYtdG9vbHMgY29tcG9uZW50cwogICAgICAgICAtc3wtLXNwaXJ2LXRvb2xzKQogICAgICAgICBJTkNMVURFX1NQSVJWX1RPT0xTPXRydWUKICAgICAgICAgZWNobyAiQnVpbGRpbmcgc3BpcnYtdG9vbHMgKCRvcHRpb24pIgogICAgICAgICA7OworCisgICAgICAgICMgb3B0aW9ucyB0byBzcGVjaWZ5IGJ1aWxkIG9mIEx1bmFyR0xBU1MgY29tcG9uZW50cworICAgICAgICAtbHwtLUx1bmFyR0xBU1MpCisgICAgICAgIElOQ0xVREVfTFVOQVJHTEFTUz10cnVlCisgICAgICAgIGVjaG8gIkJ1aWxkaW5nIEx1bmFyR0xBU1MgKCRvcHRpb24pIgorICAgICAgICA7OworCisgICAgICAgICMgb3B0aW9ucyB0byBzcGVjaWZ5IGJ1aWxkIG9mIGpzb25jcHAgY29tcG9uZW50cworICAgICAgICAtanwtLWpzb25jcHApCisgICAgICAgIElOQ0xVREVfSlNPTkNQUD10cnVlCisgICAgICAgIGVjaG8gIkJ1aWxkaW5nIGpzb25jcHAgKCRvcHRpb24pIgorICAgICAgICA7OworCiAgICAgICAgICopCiAgICAgICAgIGVjaG8gIlVucmVjb2duaXplZCBvcHRpb246ICRvcHRpb24iCiAgICAgICAgIGVjaG8gIlRyeSB0aGUgZm9sbG93aW5nOiIKICAgICAgICAgZWNobyAiIC1nIHwgLS1nbHNsYW5nICAgICAgIyBlbmFibGUgZ2xzbGFuZyIKICAgICAgICAgZWNobyAiIC1zIHwgLS1zcGlydi10b29scyAgIyBlbmFibGUgc3BpcnYtdG9vbHMiCisgICAgICAgIGVjaG8gIiAtbCB8IC0tTHVuYXJHTEFTUyAgICMgZW5hYmxlIEx1bmFyR0xBU1MiCisgICAgICAgIGVjaG8gIiAtaiB8IC0tanNvbmNwcCAgICAgICMgZW5hYmxlIGpzb25jcHAiCiAgICAgICAgIGV4aXQgMQogICAgICAgICA7OwogICAgIGVzYWMKQEAgLTEyMyw3ICsyMTgsNiBAQAogICBidWlsZF9nbHNsYW5nCiBmaQogCi0KIGlmIFsgJHtJTkNMVURFX1NQSVJWX1RPT0xTfSA9PSAidHJ1ZSIgXTsgdGhlbgogICAgIGlmIFsgISAtZCAiJHtCQVNFRElSfS9zcGlydi10b29scyIgLW8gISAtZCAiJHtCQVNFRElSfS9zcGlydi10b29scy8uZ2l0IiBdOyB0aGVuCiAgICAgICAgY3JlYXRlX3NwaXJ2LXRvb2xzCkBAIC0xMzEsMyArMjI1LDE5IEBACiAgICAgdXBkYXRlX3NwaXJ2LXRvb2xzCiAgICAgYnVpbGRfc3BpcnYtdG9vbHMKIGZpCisKK2lmIFsgJElOQ0xVREVfTFVOQVJHTEFTUyA9PSAidHJ1ZSIgXTsgdGhlbgorICAgIGlmIFsgISAtZCAiJHtCQVNFRElSfS9MdW5hckdMQVNTIiAtbyAhIC1kICIke0JBU0VESVJ9L0x1bmFyR0xBU1MvLmdpdCIgXTsgdGhlbgorICAgICAgIGNyZWF0ZV9MdW5hckdMQVNTCisgICAgZmkKKyAgICB1cGRhdGVfTHVuYXJHTEFTUworICAgIGJ1aWxkX0x1bmFyR0xBU1MKK2ZpCisKK2lmIFsgJHtJTkNMVURFX0pTT05DUFB9ID09ICJ0cnVlIiBdOyB0aGVuCisgICAgaWYgWyAhIC1kICIke0JBU0VESVJ9L2pzb25jcHAiIC1vICEgLWQgIiR7QkFTRURJUn0vanNvbmNwcC8uZ2l0IiBdOyB0aGVuCisgICAgICAgY3JlYXRlX2pzb25jcHAKKyAgICBmaQorICAgIHVwZGF0ZV9qc29uY3BwCisgICAgYnVpbGRfanNvbmNwcAorZmkKZGlmZiAtLWdpdCBhL3ZpYS9DTWFrZUxpc3RzLnR4dCBiL3ZpYS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDRmNDEwCi0tLSAvZGV2L251bGwKKysrIGIvdmlhL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNjQgQEAKK2ZpbGUoR0xPQiBURVhUVVJFUworICAgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS92aWEvaW1hZ2VzLyoiCispCitmaWxlKENPUFkgJHtURVhUVVJFU30gREVTVElOQVRJT04gJHtDTUFLRV9CSU5BUllfRElSfS92aWEvaW1hZ2VzKQorCisKK2lmKFdJTjMyKQorICAgIHNldCAoTElCUkFSSUVTICJ2dWxrYW4tJHtNQUpPUn0iKQorCisgICAgIyBGb3IgV2luZG93cywgc2luY2UgMzItYml0IGFuZCA2NC1iaXQgaXRlbXMgY2FuIGNvLWV4aXN0LCB3ZSBidWlsZCBlYWNoIGluIGl0cyBvd24gYnVpbGQgZGlyZWN0b3J5LgorICAgICMgMzItYml0IHRhcmdldCBkYXRhIGdvZXMgaW4gYnVpbGQzMiwgYW5kIDY0LWJpdCB0YXJnZXQgZGF0YSBnb2VzIGludG8gYnVpbGQuICBTbywgaW5jbHVkZS9saW5rIHRoZQorICAgICMgYXBwcm9wcmlhdGUgZGF0YSBhdCBidWlsZCB0aW1lLgorICAgIGlmIChDTUFLRV9DTF82NCkKKyAgICAgICAgc2V0IChCVUlMRFRHVF9ESVIgYnVpbGQpCisgICAgZWxzZSAoKQorICAgICAgICBzZXQgKEJVSUxEVEdUX0RJUiBidWlsZDMyKQorICAgIGVuZGlmKCkKKworICAgICMgVXNlIHN0YXRpYyBNU1ZDUlQgbGlicmFyaWVzCisgICAgZm9yZWFjaChjb25maWd1cmF0aW9uIGluIENNQUtFX0NfRkxBR1NfREVCVUcgQ01BS0VfQ19GTEFHU19NSU5TSVpFUkVMIENNQUtFX0NfRkxBR1NfUkVMRUFTRSBDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19ERUJVRyBDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCBDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgICAgIGlmKCR7Y29uZmlndXJhdGlvbn0gTUFUQ0hFUyAiL01EIikKKyAgICAgICAgICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIvTUQiICIvTVQiICR7Y29uZmlndXJhdGlvbn0gIiR7JHtjb25maWd1cmF0aW9ufX0iKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisKKyAgICBzZXQgKENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAtRF9VU0VfTUFUSF9ERUZJTkVTIikKKyAgICBzZXQgKENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgLURfVVNFX01BVEhfREVGSU5FUyIpCisKK2Vsc2UoKQorCisgICAgaWYoVU5JWCkKKyAgICAgICAgc2V0IChMSUJSQVJJRVMgInZ1bGthbiIpCisgICAgZW5kaWYoKQorCisgICAgaWYgKEJVSUxEX1dTSV9YQ0JfU1VQUE9SVCkKKyAgICAgICAgZmluZF9wYWNrYWdlKFhDQiBSRVFVSVJFRCkKKworICAgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7WENCX0lOQ0xVREVfRElSU30pCisgICAgICAgIGxpbmtfbGlicmFyaWVzKCR7WENCX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorICAgIGlmIChCVUlMRF9XU0lfWExJQl9TVVBQT1JUKQorICAgICAgICBmaW5kX3BhY2thZ2UoWDExIFJFUVVJUkVEKQorCisgICAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtYMTFfSU5DTFVERV9ESVJTfSkKKyAgICAgICAgbGlua19saWJyYXJpZXMoJHtYMTFfTElCUkFSSUVTfSkKKyAgICBlbmRpZigpCisgICAgaWYgKEJVSUxEX1dTSV9XQVlMQU5EX1NVUFBPUlQpCisgICAgICAgIGZpbmRfcGFja2FnZShXYXlsYW5kIFJFUVVJUkVEKQorCisgICAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXQVlMQU5EX0NMSUVOVF9JTkNMVURFX0RJUn0pCisgICAgICAgIGxpbmtfbGlicmFyaWVzKCR7V0FZTEFORF9DTElFTlRfTElCUkFSSUVTfSkKKyAgICBlbmRpZigpCisKKyAgICBsaW5rX2xpYnJhcmllcyh2dWxrYW4gbSkKKworZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZSh2aWEgdmlhLmNwcCAke0pTT05DUFBfU09VUkNFX0RJUn0vanNvbmNwcC5jcHApCit0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcyh2aWEgUFVCTElDICR7SlNPTkNQUF9JTkNMVURFX0RJUn0pCit0YXJnZXRfbGlua19saWJyYXJpZXModmlhICR7TElCUkFSSUVTfSkKK2lmKFdJTjMyKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh2aWEgdmVyc2lvbikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3ZpYS9SRUFETUUubWQgYi92aWEvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjYyZDQKLS0tIC9kZXYvbnVsbAorKysgYi92aWEvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjE3IEBACisjIVtMdW5hckcncyBWdWxrYW4gSW5zdGFsbGF0aW9uIEFuYWx5emVyIChWSUEpXShpbWFnZXMvbHVuYXJnX3ZpYV90aXRsZS5wbmcpCitUaGlzIGRvY3VtZW50IGlzIGFuIG92ZXJ2aWV3IG9mIGhvdyB0byB1c2UgdGhlIFtMdW5hckcgVnVsa2FuIEluc3RhbGxhdGlvbiBBbmFseXplciAoVklBKV0oaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9kb2Mvc2RrL2xhdGVzdC93aW5kb3dzL3ZpYS5odG1sKS4KK1ZJQSBpcyBhIHRvb2wgdGhhdCBjYW46CisgMS4gRGV0ZXJtaW5lIHRoZSBzdGF0ZSBvZiBWdWxrYW4gY29tcG9uZW50cyBvbiB5b3VyIHN5c3RlbQorIDIuIFZhbGlkYXRlIHRoYXQgeW91ciBWdWxrYW4gTG9hZGVyIGFuZCBkcml2ZXJzIGFyZSBpbnN0YWxsZWQgcHJvcGVybHkKKyAzLiBDYXB0dXJlIHlvdXIgc3lzdGVtIHN0YXRlIGluIGEgYSBmb3JtIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gYXR0YWNobWVudCB3aGVuIHN1Ym1pdHRpbmcgYnVncworCisgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgd2hlcmUgdG8gZmluZCB0aGUgc291cmNlIGZvciBWSUEsIGJ1aWxkaW5nIGl0LCBydW5ubmluZyBpdCwgYW5kIGhvdyB0byB1bmRlcnN0YW5kIHRoZSByZXN1bHRpbmcgY29tbWFuZCBsaW5lIG91dHB1dCB0aGF0IGlzIGdlbmVyYXRlZC4KKworPEJSIC8+CisKKworIyMgQnVpbGRpbmcKK01hbnkgY29tcG9uZW50cyBvZiB0aGUgTHVuYXJHIFZ1bGthbiBTREsgYXJlIE9wZW4gU291cmNlLCBpbmNsdWRpbmcgVklBLiAgVklBIGlzIGN1cnJlbnRseSBwYXJ0IG9mIHRoZSBMdW5hckcKK1tWdWxrYW5Ub29sc10oaHR0cHM6Ly9naXRodWIuY29tL0x1bmFyRy9WdWxrYW5Ub29scykgR2l0SHViIHJlc3Bvc2l0b3J5LgorCisqKldpbmRvd3MgTm90ZToqKiBWSUEgaXMgYWxyZWFkeSBwcmUtYnVpbHQgYXMgcGFydCBvZiB0aGUgTHVuYXJHIFdpbmRvd3MgVnVsa2FuIFNESywgYnV0IHNob3VsZCB5b3Ugd2lzaCB0byBidWlsZCBhCitkZWJ1ZyB2ZXJzaW9uIG9yIGZpbmQgdGhlIHNvdXJjZSwgdGhpcyBzZWN0aW9uIHNob3VsZCBwcm92aWRlIHlvdSB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgbmVlZC4gIE90aGVyd2lzZSwgc2ltcGx5Citza2lwIGRvd24gdG8gdGhlICJSdW5uaW5nIiBzZWN0aW9uIGJlbG93LgorCisjIyMjIEJ1aWxkaW5nIFZJQSBpbiBWdWxrYW5Ub29scworQmVjYXVzZSBpdCBpcyBwYXJ0IG9mIGEgZ3JvdXAgb2YgdG9vbHMsIHlvdSBidWlsZCBpdCBmcm9tIHRoZSB0b3AgZm9sZGVyIGJ5Citmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgW0J1aWxpZFZULm1kXShodHRwczovL2dpdGh1Yi5jb20vTHVuYXJHL1Z1bGthblRvb2xzL2Jsb2IvbWFzdGVyL0JVSUxEVlQubWQpCitmaWxlIGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlLgorCisjIyMjIEJ1aWxkaW5nIFZJQSBpbiB0aGUgTGludXggVnVsa2FuIFNESworVGhlIHNvdXJjZSBmb3IgVklBIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBMdW5hckcgTGludXggW1Z1bGthbiBTREtdKGh0dHBzOi8vdnVsa2FuLmx1bmFyZy5jb20vc2RrL2hvbWUpIGluIHRoZSAic291cmNlL3ZpYSIgZGlyZWN0b3J5LgorIDEuIERvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBMaW51eCBTREsKKyAyLiBSdW4gInNvdXJjZSBzZXR1cC1lbnYuc2giIGluIHRoZSBTREsgcm9vdCBkaXJlY3RvcnkKKyAzLiBSdW4gIi4vYnVpbGRfdG9vbHMuc2giCisKKzxCUiAvPgorCisjIyBSdW5uaW5nCitZb3Ugd2lsbCBmaW5kIHRoZSBWSUEgYmluYXJ5IGluIGEgZGlmZmVyZW50IGxvY2F0aW9uIGRlcGVuZGluZyBvbiB3aGljaCBPUyB5b3UgYXJlIHVzaW5nIGFuZCB3aGV0aGVyIHlvdSBoYXZlIGJ1aWx0IGl0LCBvciBpbnN0YWxsZWQgaXQgYXMgcGFydCBvZiB0aGUgU0RLLiAgVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBzdGF0ZXMgd2hlcmUgdG8gZmluZCB0aGUgcHJvcGVyIGV4ZWN1dGFibGUuCisKK1BsZWFzZSBub3RlIHRoYXQgaWYgeW91IGFyZSB0cnlpbmcgdG8gZGlhZ25vc2UgYSB0cm91Ymxlc29tZSBhcHBsaWNhdGlvbiwgdGhlICoqYmVzdCB3YXkqKiB0byBydW4gVklBIHRvIGFzc2lzdCBpbiBkaWFnbm9zaXMgaXMgdG8gY2hhbmdlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24sIGFuZCBydW4gdmlhIGluIHRoYXQgZm9sZGVyIGxvY2FsbHkgKGJ5IHR5cGluZyBpbiBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIHZpYSBleGVjdXRhYmxlKS4KKworIyMjIyBJbiB0aGUgV2luZG93cyBWdWxrYW4gU0RLCitWSUEgaXMgaW5zdGFsbGVkIGludG8geW91ciBzdGFydCBtZW51IGFzIHBhcnQgb2YgdGhlIFdpbmRvd3MgVnVsa2FuIFNESy4gIFNpbXBseSBvcGVuIHlvdXIgc3RhcnQgbWVudSwgc2VhcmNoIGZvciB0aGUgIlZ1bGthbiBTREsiIGFuZCBjbGljayAidmlhIi4gIFRoaXMgd2lsbCBvdXB0dXQgdGhlIHJlc3VsdGluZyB2aWEuaHRtbCBkaXJlY3RseSB0byB5b3VyIGRlc2t0b3AuCisKK0lmIHlvdSBuZWVkIHRvIHJ1biB2aWEgZnJvbSB0aGUgY29tbWFuZC1saW5lLCB5b3Ugd2lsbCBmaW5kIGl0IGluIHlvdXIgU0RLIGZvbGRlciAoZGVmaW5lZCBieSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgIlZVTEtBTl9TREsiKSB1bmRlciB0aGUgIkJpbiIgZm9sZGVyIGZvciA2NC1iaXQgZXhlY3V0YWJsZXMsIGFuZCAiQmluMzIiIGZvbGRlciBmb3IgMzItYml0IGV4ZWN1dGFibGVzLiAgRnJvbSB0aGVyZSwgc2ltcGx5IHJ1bjoKK2BgYAordmlhLmV4ZQorYGBgCisKKyMjIyMgSW4gdGhlIExpbnV4IFZ1bGthbiBTREsKK09uY2UgYnVpbHQsIFZJQSBjYW4gYmUgZm91bmQgaW4gdGhlIHg4Nl82NC9iaW4gZGlyZWN0b3J5LiAgWW91IGNhbiBzaW1wbHkgZXhlY3V0ZSBpdCBmcm9tIHRoZXJlIHVzaW5nOgorCitgYGAKK3ZpYQorYGBgCisKKzxCUiAvPgorCisKKyMjIyMgSWYgQnVpbHQgZnJvbSBWdWxrYW5Ub29scworR28gaW50byB0aGUgZm9sZGVyIHdoZXJlIHlvdSBnZW5lcmF0ZWQgdGhlIGJ1aWxkIGl0ZW1zIGZyb20gdGhlIGFib3ZlIGJ1aWxkaW5nIHN0ZXAuCisKKyoqTGludXgqKgorCitTaW1wbHkgcnVuOgorYGBgCit2aWEKK2BgYAorCisKKyoqV2luZG93cyoqCisKK1dpbmRvd3MgaGFzIGFuIGFkZGl0aW9uYWwgcmVxdWlyZWQgc3RlcCB0byBwZXJmb3JtIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBWdWxrYW5Ub29scyBiZWZvcmUgeW91IGNhbiBydW4gVklBIGluIHRoZSBwcm9wZXIgd2F5LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBDTWFrZSBzY3JpcHRzIGhhdmUgYW4gaW1wb3J0YW50IGZvbGRlciBiZWluZyBjb3BpZWQgb25lIGxldmVsIHRvbyBsb3cuICBUbyBydW4sIHRoZSBmaXJzdCB0aW1lIHlvdSB3aWxsIGhhdmUgdG8gY29weSB0aGlzIGZvbGRlciBpbnRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbi4KKworU3RlcHMgdG8gcnVuIHRoZSBmaXJzdCB0aW1lOgorIDEuIEdvIGludG8gdGhlIGZvbGRlciB5b3UgYnVpbHQsIGFuZCB0aGVuIGdvIGludG8gdGhlICJ2aWEiIHN1Yi1mb2xkZXIuCisgMi4gSW4gdGhpcyBmb2xkZXIgeW91IHNob3VsZCBzZWUgYW4gImltYWdlcyIgZm9sZGVyLiAgQ29weSB0aGlzIGludG8gZWl0aGVyIG9yIGJvdGggb2YgeW91ciAiRGVidWciIG9yICJSZWxlYXNlIiBmb2xkZXJzLgorIDMuIEdvIGludG8gdGhlICJEZWJ1ZyIgb3IgIlJlbGVhc2UiIGZvbGRlciAod2hpY2hldmVyIHlvdSBhcmUgZGVzaXJpbmcgdG8gd29yayB3aXRoKSAKKyA0LiBSdW4gCitgYGAKK3ZpYS5leGUKK2BgYAorCitBZnRlciB0aGUgZmlyc3QgdGltZSwgeW91IGp1c3QgbmVlZCB0byBnbyBpbnRvIHRoZSBmb2xkZXIgYW5kIHJlLXJ1biAidmlhLmV4ZSIuCisKKzxCUiAvPgorCisjIyMgUmVzdWx0aW5nIE91dHB1dAorVklBIG91dHB1dHMgdHdvIHRoaW5nczoKKyAtIEEgY29tbWFuZC1saW5lIG91cHR1dCBpbmRpY2F0aW5nIHRoZSBvdmVyYWxsIHN0YXR1cworIC0gQW4gSFRNTCBmaWxlIChjYWxsZWQgdmlhLmh0bWwpIGNvbnRhaW5pbmcgdGhlIGRldGFpbHMgd2hpY2ggd2lsbCBiZSBvdXRwdXQgdG8gb25lIG9mIHR3byBsb2NhdGlvbnM6CisgIDEuIElmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyB3cml0ZWFibGUsIHRoZSBIVE1MIHdpbGwgYmUgcGxhY2VkIGluIHRoYXQgbG9jYXRpb24uCisgIDIuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBzYXZlZCB0byB5b3VyIGhvbWUgZm9sZGVyLCBleGNlcHQgZm9yIHRoZSBXaW5kb3dzIFN0YXJ0IE1lbnUgc2hvcnQtY3V0IHdoaWNoIHdyaXRlcyB0aGUgZmlsZSB0byB5b3VyIGRlc2t0b3AuCisKK1lvdXIgaG9tZSBmb2xkZXIgaXMgdGhlIGZvbGxvd2luZyBsb2NhdGlvbiAoYmFzZWQgb24geW91ciBPUyk6CisgLSBXaW5kb3dzOiBXaGVyZXZlciB5b3VyIGVudmlyb25tZW50IHZhcmlhYmxlcyAlSE9NRURSSVZFJVwlSE9NRVBBVEglIHBvaW50IHRvLgorIC0gTGludXg6IEl0IHdpbGwgYmUgcGxhY2VkIGluIHlvdXIgaG9tZSBmb2xkZXIgKCJ+Ly4iKS4KKworPEJSIC8+CisKKyMjIyMgQWRkaXRpb25hbCBjb21tYW5kLWxpbmUgYXJndW1lbnRzCitUaGVyZSBhcmUgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgdXNlZC4gIFRoZXNlIHNpbXBseSBhdWdtZW50IGV4aXN0aW5nIGJlaGF2aW9yIGFuZCBkbyBub3QgY2FwdHVyZSBhbnkgbW9yZSBpbmZvcm1hdGlvbi4KK1RoZSBhdmFpbGFibGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhcmU6CisKKyMjIyMjIC0tdW5pcXVlX291dHB1dAorVGhlIC0tdW5pcXVlX291dHB1dCBhcmd1bWVudCwgaWYgcHJvdmlkZWQsIHdpbGwgY2F1c2UgdGhlIG91dHB1dCBodG1sIHRvIGJlIGdlbmVyYXRlZCB3aXRoIGEgZGF0ZS90aW1lIHN1ZmZpeC4gIFRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gcGVyZm9ybQorbXVsdGlwbGUgc3RhdGUgY2FwdHVyZXMgb24geW91ciBzeXN0ZW0gd2l0aG91dCBhY2NpZGVudGFsbHkgZXJhc2luZyBwcmV2aW91cyByZXN1bHRzLiAgVGhlIG5ldyBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworX3ZpYV9ZWVlZX01NX0REX0hIX01NLmh0bWxfCisKK1doZXJlIGVhY2ggY29tcG9uZW50IHN0YW5kcyBmb3IgdGhlIG51bWVyaWMgdmFsdWVzIGZvciB5ZWFyIChZWVlZKSwgbW9udGggKE1NKSwgZGF5IChERCksIGhvdXIgKEhIKSwgYW5kIG1pbnV0ZSAoTU0pLgorCisjIyMjIC0tb3V0cHV0X3BhdGgKK1RoZSAtLW91dHB1dF9wYXRoIGFydW1lbnQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBsb2NhdGlvbiBmb3IgdGhlIG91dHB1dCBodG1sIGZpbGUuIEZvcgorZXhhbXBsZSwgaWYgdGhlIHVzZXIgcnVucyBgdmlhIC0tb3V0cHV0X3BhdGggL2hvbWUvbWUvRG9jdW1lbnRzYCwgdGhlbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZQorYC9ob21lL21lL0RvY3VtZW50cy92aWEuaHRtbGAuCisKKzxCUiAvPgorCisjIyBDb21tb24gQ29tbWFuZC1MaW5lIE91dHB1dHMKKworIyMjIyAiU1VDQ0VTUzogVmFsaWRhdGlvbiBjb21wbGV0ZWQgcHJvcGVybHkiCisKKyMjIyMjIFByb2JsZW06CitMdW5hckcncyBWSUEgY291bGQgZGV0ZWN0IG5vIHByb2JsZW1zIHdpdGggeW91ciBzZXR1cC4KKworIyMjIyMgUG9zc2libGUgUmVhc29uOgorWW91ciBzeXN0ZW0gaXMgbGlrZWx5IHNldHVwIHByb3Blcmx5LiAgSWYgeW91IGhhdmUgdHJvdWJsZSBydW5uaW5nIFZ1bGthbiBmcm9tIGFub3RoZXIgbG9jYXRpb24sIGl0IGNvdWxkIGJlIHRoYXQgeW91ciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlbid0IHNldHVwIHByb3Blcmx5LgorCisjIyMjIyBOZXh0IFN0ZXA6CitSZS1ydW4gVklBIGZyb20gdGhlIGxvY2F0aW9uIHlvdXIgVnVsa2FuIGFwcGxpY2F0aW9uL2dhbWUgaXMgc3VwcG9zZWQgdG8gcnVuLgorCisKKyMjIyMgIkVSUk9SOiBGYWlsZWQgdG8gZmluZCBWdWxrYW4gRHJpdmVyIEpTT04gaW4gcmVnaXN0cnkiCisKKyMjIyMjIFByb2JsZW06CitUaGlzIGlzIGEgV2luZG93cy1zcGVjaWZpYyBlcnJvciB0aGF0IGluZGljYXRlcyB0aGF0IG5vIFZ1bGthbiBEcml2ZXIgSlNPTiBmaWxlcyB3ZXJlIHJlZmVyZW5jZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHBsYWNlIGluIHRoZSBXaW5kb3dzIFJlZ2lzdHJ5LgorCisjIyMjIyBQb3NzaWJsZSBSZWFzb246CitUaGlzIGNhbiBpbmRpY2F0ZSB0aGF0IGEgVnVsa2FuIGRyaXZlciBmYWlsZWQgdG8gaW5zdGFsbCBwcm9wZXJseS4KKworIyMjIyMgTmV4dCBTdGVwOgorWW91IHNob3VsZCBmb2xsb3cgdXAgd2l0aCB5b3VyIEdyYXBoaWNzIERyaXZlci4gIFNlZSBtb3JlIGRldGFpbHMgYmVsb3cuCisKKworIyMjIyAiRVJST1I6IEZhaWxlZCB0byBmaW5kIFZ1bGthbiBEcml2ZXIgSlNPTiIKKworIyMjIyMgUHJvYmxlbToKK1RoZSBWdWxrYW4gbG9hZGVyIG9uIHlvdXIgc3lzdGVtIGZhaWxlZCB0byBmaW5kIGFueSBWdWxrYW4gRHJpdmVyIEpTT04gZmlsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIHBsYWNlcy4KKworIyMjIyMgUG9zc2libGUgUmVhc29uOgorVGhpcyBjYW4gaW5kaWNhdGUgdGhhdCBhIFZ1bGthbiBkcml2ZXIgZmFpbGVkIHRvIGluc3RhbGwgcHJvcGVybHkuCisKKyMjIyMjIE5leHQgU3RlcDoKK1lvdSBzaG91bGQgZm9sbG93IHVwIHdpdGggeW91ciBHcmFwaGljcyBEcml2ZXIuICBTZWUgbW9yZSBkZXRhaWxzIGJlbG93LgorCisKKyMjIyMgIkVSUk9SOiBGYWlsZWQgdG8gZmluZCBWdWxrYW4gRHJpdmVyIExpYiIKKworIyMjIyMgUHJvYmxlbToKK1RoZSBWdWxrYW4gbG9hZGVyIG9uIHlvdXIgc3lzdGVtIGZvdW5kIGF0IGxlYXN0IG9uZSBWdWxrYW4gRHJpdmVyIEpTT04gZmlsZSwgYnV0IHRoZSBEcml2ZXIgbGlicmFyeSByZWZlcmVuY2VkIGluIHRoYXQgZmlsZSBhcHBlYXJzIGludmFsaWQuCisKKyMjIyMjIFBvc3NpYmxlIFJlYXNvbjoKK1RoaXMgY2FuIGluZGljYXRlIHRoYXQgYSBWdWxrYW4gZHJpdmVyIGZhaWxlZCB0byBpbnN0YWxsIHByb3Blcmx5LgorCisjIyMjIyBOZXh0IFN0ZXA6CitZb3Ugc2hvdWxkIGZvbGxvdyB1cCB3aXRoIHlvdXIgR3JhcGhpY3MgRHJpdmVyLiAgU2VlIG1vcmUgZGV0YWlscyBiZWxvdy4KKworCisjIyMjICJFUlJPUjogVnVsa2FuIGZhaWxlZCB0byBmaW5kIGEgY29tcGF0aWJsZSBkcml2ZXIiCisKKyMjIyMjIFByb2JsZW06CitBbGwgdGhlIGNvbXBvbmVudHMgYXBwZWFyZWQgdG8gYmUgaW4gcGxhY2UgdG8gYWxsb3cgVnVsa2FuIHRvIGxvYWQgKGZyb20gYW4gZXh0ZXJuYWwgc3RhbmQtcG9pbnQpLCBidXQgdGhlIGxvYWRlciBzdGlsbCBmYWlsZWQgdG8gZmluZAorYSBWdWxrYW4gY29tcGF0aWJsZSBkcml2ZXIuCisKKyMjIyMjIFBvc3NpYmxlIFJlYXNvbjoKK1RoaXMgY2FuIGluZGljYXRlIHRoYXQgZWl0aGVyIGEgVnVsa2FuIGRyaXZlciBmYWlsZWQgdG8gaW5zdGFsbCBwcm9wZXJseSwgb3IgdGhlIHJ1bi10aW1lIGlzIGZhaWxpbmcgZm9yIHNvbWUgcmVhc29uLgorCisjIyMjIyBOZXh0IFN0ZXA6CitGaXJzdCwgYXR0ZW1wdCB0byByZS1pbnN0YWxsIHRoZSBydW4tdGltZSBieSB2aXNpdGluZyBbTHVuYXJYY2hhbmdlXShodHRwczovL3Z1bGthbi5sdW5hcmcuY29tLyksIGFuZCBpbnN0YWxsIHRoZSBsYXRlc3QgVnVsa2FuIFNESy4KK0lmIHRoYXQgZG9lcyBub3Qgd29yaywgdHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5ld2VyIFZ1bGthbiBkcml2ZXIgYXZhaWxhYmxlIGFuZCBpbnN0YWxsIHRoYXQuICBJZiB0aGF0IHN0aWxsIGZhaWxzLCBmaWxlIGFuIGlzc3VlIG9uCitMdW5hclhjaGFuZ2UuCisKKworIyMjIyBbV0lORE9XU10gRGlhbG9nIGJveCBwb3AncyB1cCBpbmRpY2F0aW5nICJ2dWxrYW4tMS5kbGwgaXMgbWlzc2luZyBmcm9tIHlvdXIgY29tcHV0ZXIuIgorCisjIyMjIyBQcm9ibGVtOgorVGhlIFZ1bGthbiBsb2FkZXIgInZ1bGthbi0xLmRsbCIgY291bGRuJ3QgYmUgZm91bmQgb24geW91ciBzeXN0ZW0uICBUaGlzIGZpbGUgaXMgdHlwaWNhbGx5IGluc3RhbGxlZCB3aXRoIHNvbWUgVnVsa2FuIGRyaXZlciBpbnN0YWxscywKK3NvbWUgVnVsa2FuLWNhcGFibGUgZ2FtZXMsIG9yIHRoZSBMdW5hckcgVnVsa2FuIFNESy4KKworIyMjIyMgUG9zc2libGUgUmVhc29uOgorVGhlIGxhc3QgVnVsa2FuIFJ1bnRpbWUgaW5zdGFsbCB0aGF0IGV4ZWN1dGVkIG9uIHlvdXIgc3lzdGVtIGZhaWxlZCB0byBiZWhhdmUgcHJvcGVybHkuICBPciwgeW91IGhhdmUgbmV2ZXIgaW5zdGFsbGVkIGEgVnVsa2FuIGxvYWRlcgorb24geW91ciBzeXN0ZW0uCisKKyMjIyMjIE5leHQgU3RlcDoKK1RvIHJlbWVtZHkgdGhpcywgdmlzaXQgW0x1bmFyWGNoYW5nZV0oaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS8pLCBhbmQgaW5zdGFsbCB0aGUgbGF0ZXN0IFZ1bGthbiBTREsuICBJZiB0aGF0IGRvZXMgbm90IHdvcmssIGZpbGUgYW4KK0lzc3VlIHRvIGhhdmUgb25lIG9mIHRoZWlyIGVuZ2luZWVycyBhc3Npc3QgeW91LgorCisKKyMjIyMgW0xJTlVYXSBNZXNzYWdlIGluZGljYXRpbmcgImVycm9yIHdoaWxlIGxvYWRpbmcgc2hhcmVkIGxpYnJhcmllczogbGlidnVsa2FuLnNvLjEiCisKKyMjIyMjIFByb2JsZW06CitUaGUgVnVsa2FuIGxvYWRlciAibGlidnVsa2FuLnNvLjEiIGNvdWxkbid0IGJlIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiAgVGhpcyBmaWxlIGlzIHR5cGljYWxseSBpbnN0YWxsZWQgd2l0aCBzb21lIFZ1bGthbiBkcml2ZXIgaW5zdGFsbHMsCitzb21lIFZ1bGthbi1jYXBhYmxlIGdhbWVzLCBvciB0aGUgTHVuYXJHIFZ1bGthbiBTREsuCisKKyMjIyMjIFBvc3NpYmxlIFJlYXNvbjoKK1RoZSBsYXN0IFZ1bGthbiBSdW50aW1lIGluc3RhbGwgdGhhdCBleGVjdXRlZCBvbiB5b3VyIHN5c3RlbSBmYWlsZWQgdG8gYmVoYXZlIHByb3Blcmx5LiAgT3IsIHlvdSBoYXZlIG5ldmVyIGluc3RhbGxlZCBhIFZ1bGthbiBsb2FkZXIKKworPEJSIC8+CisKKyMjIFZ1bGthbiBHcmFwaGljcyBEcml2ZXIgUHJvYmxlbXMKK0lmIHRoZSBwcm9ibGVtIGlzIHBvc3NpYmx5IHJlbGF0ZWQgdG8geW91ciBHcmFwaGljcyBEcml2ZXIsIGl0IGNvdWxkIGJlIGZvciBzZXZlcmFsIHJlYXNvbnM6CisgMS4gVGhlIGhhcmR3YXJlIHlvdSBoYXZlIGRvZXNuJ3Qgc3VwcG9ydCBWdWxrYW4uCisgMi4gWW91ciBoYXJkd2FyZSBzdXBwb3J0cyBWdWxrYW4sIGJ1dCB5b3UgaGF2ZW4ndCB5ZXQgaW5zdGFsbGVkIGEgZHJpdmVyIHdpdGggVnVsa2FuIHN1cHBvcnQuCisgMy4gVGhlcmUgaXMgbm8gVnVsa2FuIGRyaXZlciB3aXRoIHN1cHBvcnQgZm9yIHRoZSBPUyBvbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBydW5uaW5nLgorICAgIC0gU29tZXRpbWVzLCB0aGUgY29tcGFueSBtYXkgcHJvdmlkZSBWdWxrYW4gc3VwcG9ydCBmb3Igc29tZSBkZXZpY2VzIG9uIG9uZSBPcGVyYXRpbmdzIFN5c3RlbSAoc2F5IFdpbmRvd3MpLCB3aGlsZSBzdGlsbCB3YWl0aW5nIHRvIGNvbXBsZXRlIFZ1bGthbiBvbiBvdGhlciBzeXN0ZW1zLgorIDQuIEV2ZXJ5dGhpbmcgc3VwcG9ydHMgVnVsa2FuLCBidXQgdGhlIGRyaXZlciBmYWlsZWQgdG8gaW5zdGFsbCBwcm9wZXJseS4KKworQmVmb3JlIGFwcHJvYWNoaW5nIHlvdXIgR3JhcGhpY3MgZHJpdmVyIHZlbmRvciwgaXQgd291bGQgaGVscCBpZiB5b3UgdmVyaWZpZWQgdGhhdCB5b3VyIGN1cnJlbnQgZHJpdmVyIGZvciB5b3VyIGN1cnJlbnQgaGFyZHdhcmUgb24geW91ciBjdXJyZW50CitvcGVyYXRpbmcgc3lzdGVtICoqZG9lcyoqIHN1cHBvcnQgVnVsa2FuLgpkaWZmIC0tZ2l0IGEvdmlhL2ltYWdlcy9iZy1zdGFyZmllbGQuanBnIGIvdmlhL2ltYWdlcy9iZy1zdGFyZmllbGQuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NmJlODEKLS0tIC9kZXYvbnVsbAorKysgYi92aWEvaW1hZ2VzL2JnLXN0YXJmaWVsZC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmlhL2ltYWdlcy9sdW5hcmdfdmlhLnBuZyBiL3ZpYS9pbWFnZXMvbHVuYXJnX3ZpYS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NzhlNwotLS0gL2Rldi9udWxsCisrKyBiL3ZpYS9pbWFnZXMvbHVuYXJnX3ZpYS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmlhL2ltYWdlcy9sdW5hcmdfdmlhX3RpdGxlLnBuZyBiL3ZpYS9pbWFnZXMvbHVuYXJnX3ZpYV90aXRsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5OGIxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZpYS9pbWFnZXMvbHVuYXJnX3ZpYV90aXRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmlhL3ZpYS5jcHAgYi92aWEvdmlhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMxNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmlhL3ZpYS5jcHAKQEAgLTAsMCArMSw0NTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBNYXJrIFlvdW5nIDxtYXJreUBsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworY29uc3QgY2hhciBBUFBfVkVSU0lPTltdID0gIlZlcnNpb24gMS4wIjsKKyNkZWZpbmUgTUFYX1NUUklOR19MRU5HVEggMTAyNAorCisjaWZkZWYgX1dJTjMyCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ5OTYpCisjaW5jbHVkZSAic2hsd2FwaS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGpzb24vanNvbi5oPgorCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMCAvKnZzMjAxNSovKSB8fCBkZWZpbmVkIE1JTkdXX0hBU19TRUNVUkVfQVBJCisjaW5jbHVkZSA8YmFzZXRzZC5oPgorI2RlZmluZSBzbnByaW50ZiBzcHJpbnRmX3MKKyNlbmRpZgorCitlbnVtIEVsZW1lbnRBbGlnbiB7IEFMSUdOX0xFRlQgPSAwLCBBTElHTl9DRU5URVIsIEFMSUdOX1JJR0hUIH07CisKK3N0cnVjdCBQaHlzaWNhbERldmljZUluZm8geworICAgIFZrUGh5c2ljYWxEZXZpY2UgdnVsa2FuX3BoeXNfZGV2OworICAgIHN0ZDo6dmVjdG9yPFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzPiBxdWV1ZV9mYW1fcHJvcHM7Cit9OworCitzdHJ1Y3QgR2xvYmFsSXRlbXMgeworICAgIHN0ZDo6b2ZzdHJlYW0gaHRtbF9maWxlX3N0cmVhbTsKKyAgICBib29sIHNka19mb3VuZDsKKyAgICBzdGQ6OnN0cmluZyBzZGtfcGF0aDsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlOworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsRGV2aWNlSW5mbz4gcGh5c19kZXZpY2VzOworICAgIHN0ZDo6dmVjdG9yPFZrRGV2aWNlPiBsb2dfZGV2aWNlczsKKyAgICB1aW50MzJfdCBjdXJfdGFibGU7CisgICAgc3RkOjpzdHJpbmcgZXhlX2RpcmVjdG9yeTsKKyAgICBib29sIGlzX29kZF9yb3c7CisKKyNpZmRlZiBfV0lOMzIKKyAgICBib29sIGlzX3dvdzY0OworI2VuZGlmCit9OworCisvLyBDcmVhdGUgYSBnbG9iYWwgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgZ2xvYmFsIHNldHRpbmdzCitHbG9iYWxJdGVtcyBnbG9iYWxfaXRlbXMgPSB7fTsKKworLy8gRXJyb3IgbWVzc2FnZXMgdGhyb3duIGJ5IHRoZSBhcHBsaWNhdGlvbgorZW51bSBFcnJvclJlc3VsdHMgeworICAgIFZVTEtBTl9DQU5UX0ZJTkRfRFJJVkVSID0gLTIsCisgICAgTUlTU0lOR19EUklWRVJfUkVHSVNUUlkgPSAtMywKKyAgICBNSVNTSU5HX0RSSVZFUl9KU09OID0gLTQsCisgICAgTUlTU0lOR19EUklWRVJfTElCID0gLTUsCit9OworCisvLyBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBuYW1lL3ZhbHVlIHBhaXJzIHJlYWQgZnJvbSB0aGUKKy8vIFZ1bGthbiBsYXllciBzZXR0aW5ncyBmaWxlIChpZiBvbmUgZXhpc3RzKS4KK3N0cnVjdCBTZXR0aW5nUGFpciB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKK307CisKK3ZvaWQgU3RhcnRPdXRwdXQoc3RkOjpzdHJpbmcgdGl0bGUpOwordm9pZCBFbmRPdXRwdXQoKTsKK3ZvaWQgUHJpbnRTeXN0ZW1JbmZvKHZvaWQpOwordm9pZCBQcmludFZ1bGthbkluZm8odm9pZCk7Cit2b2lkIFByaW50RHJpdmVySW5mbyh2b2lkKTsKK3ZvaWQgUHJpbnRSdW5UaW1lSW5mbyh2b2lkKTsKK3ZvaWQgUHJpbnRTREtJbmZvKHZvaWQpOwordm9pZCBQcmludEV4cGxpY2l0TGF5ZXJKc29uSW5mbyhjb25zdCBjaGFyICpsYXllcl9qc29uX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uOjpWYWx1ZSByb290LCB1aW50MzJfdCBudW1fY29scyk7Cit2b2lkIFByaW50SW1wbGljaXRMYXllckpzb25JbmZvKGNvbnN0IGNoYXIgKmxheWVyX2pzb25fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIHJvb3QpOwordm9pZCBQcmludExheWVySW5mbyh2b2lkKTsKK3ZvaWQgUHJpbnRMYXllclNldHRpbmdzRmlsZUluZm8odm9pZCk7Cit2b2lkIFByaW50VGVzdFJlc3VsdHModm9pZCk7CitzdGQ6OnN0cmluZyBUcmltV2hpdGVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyAmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJndoaXRlc3BhY2UgPSAiIFx0XG5cciIpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBpbnQgZXJyX3ZhbCA9IDA7CisgICAgdHJ5IHsKKyAgICAgICAgdGltZV90IHRpbWVfcmF3X2Zvcm1hdDsKKyAgICAgICAgc3RydWN0IHRtICpwdHJfdGltZTsKKyAgICAgICAgY2hhciBodG1sX2ZpbGVfbmFtZVtNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgICAgIGNoYXIgZnVsbF9maWxlW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICAgICAgY2hhciB0ZW1wW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICAgICAgY29uc3QgY2hhciogb3V0cHV0X3BhdGggPSBOVUxMOworICAgICAgICBib29sIGdlbmVyYXRlX3VuaXF1ZV9maWxlID0gZmFsc2U7CisKKyAgICAgICAgLy8gQ2hlY2sgYW5kIGhhbmRsZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzCisgICAgICAgIGlmIChhcmdjID4gMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaWlpID0gMTsgaWlpIDwgYXJnYzsgaWlpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoMCA9PSBzdHJjbXAoIi0tdW5pcXVlX291dHB1dCIsIGFyZ3ZbaWlpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfdW5pcXVlX2ZpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoIi0tb3V0cHV0X3BhdGgiLCBhcmd2W2lpaV0pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjID4gKGlpaSArIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wYXRoID0gYXJndltpaWkgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgKytpaWk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJVc2FnZSBvZiB2aWEuZXhlOiIgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAgIHZpYS5leGUgWy0tdW5pcXVlX291dHB1dF0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstLW91dHB1dF9wYXRoIDxwYXRoPl0iIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICBbLS11bmlxdWVfb3V0cHV0XSBPcHRpb25hbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1ldGVyIHRvIGdlbmVyYXRlIGEgdW5pcXVlIGh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IGZpbGUgaW4gdGhlIGZvcm0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwndmlhX1lZWVlfTU1fRERfSEhfTU0uaHRtbFwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsIDw8ICIgICAgICAgICAgWy0tb3V0cHV0X3BhdGggPHBhdGg+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gT3B0aW9uYWwgcGFyYW1ldGVyIHRvIGdlbmVyYXRlIHRoZSBvdXRwdXQgYXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBhIGdpdmVuIHBhdGgiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3coLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudHMgYSBzcGVjaWZpYyBvdXRwdXQgcGF0aCwgd3JpdGUgaXQgdG8gdGhlIGJ1ZmZlcgorICAgICAgICAvLyBhbmQgdGhlbiBjb250aW51ZSB3cml0aW5nIHRoZSByZXN0IG9mIHRoZSBuYW1lIGJlbG93CisgICAgICAgIHNpemVfdCBmaWxlX25hbWVfb2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKG91dHB1dF9wYXRoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZpbGVfbmFtZV9vZmZzZXQgPSBzdHJsZW4ob3V0cHV0X3BhdGgpICsgMTsKKyAgICAgICAgICAgIHN0cm5jcHkoaHRtbF9maWxlX25hbWUsIG91dHB1dF9wYXRoLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgc3RybmNweShodG1sX2ZpbGVfbmFtZSArIGZpbGVfbmFtZV9vZmZzZXQgLSAxLCAiXFwiLAorICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIGZpbGVfbmFtZV9vZmZzZXQpOworI2Vsc2UKKyAgICAgICAgICAgIHN0cm5jcHkoaHRtbF9maWxlX25hbWUgKyBmaWxlX25hbWVfb2Zmc2V0IC0gMSwgIi8iLAorICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIGZpbGVfbmFtZV9vZmZzZXQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgdXNlciB3YW50cyBhIHVuaXF1ZSBmaWxlLCBnZW5lcmF0ZSBhIGZpbGUgd2l0aCB0aGUgY3VycmVudAorICAgICAgICAvLyB0aW1lIGFuZCBkYXRlIGluY29ycG9yYXRlZCBpbnRvIGl0LgorICAgICAgICBpZiAoZ2VuZXJhdGVfdW5pcXVlX2ZpbGUpIHsKKyAgICAgICAgICAgIHRpbWUoJnRpbWVfcmF3X2Zvcm1hdCk7CisgICAgICAgICAgICBwdHJfdGltZSA9IGxvY2FsdGltZSgmdGltZV9yYXdfZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChzdHJmdGltZShodG1sX2ZpbGVfbmFtZSArIGZpbGVfbmFtZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWFfJVlfJW1fJWRfJUhfJU0uaHRtbCIsIHB0cl90aW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJDb3VsZG4ndCBwcmVwYXJlIGZvcm1hdHRlZCBzdHJpbmciIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB0aHJvdygtMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJuY3B5KGh0bWxfZmlsZV9uYW1lICsgZmlsZV9uYW1lX29mZnNldCwgInZpYS5odG1sIiwKKyAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxIC0gZmlsZV9uYW1lX29mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSB0aGUgb3V0cHV0IGZpbGUgdG8gdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGRpcmVjdG9yeSwgb3IsIGlmCisgICAgICAgIC8vIHRoYXQgZmFpbHMsIHdyaXRlIGl0IG91dCB0byB0aGUgdXNlcidzIGhvbWUgZm9sZGVyLgorICAgICAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbS5vcGVuKGh0bWxfZmlsZV9uYW1lKTsKKyAgICAgICAgaWYgKGdsb2JhbF9pdGVtcy5odG1sX2ZpbGVfc3RyZWFtLmZhaWwoKSkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgY2hhciBob21lX2RyaXZlWzMyXTsKKyAgICAgICAgICAgIGlmICgwICE9IEdldEVudmlyb25tZW50VmFyaWFibGVBKCJIT01FRFJJVkUiLCBob21lX2RyaXZlLCAzMSkgfHwKKyAgICAgICAgICAgICAgICAwICE9IEdldEVudmlyb25tZW50VmFyaWFibGVBKCJIT01FUEFUSCIsIHRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvciBmYWlsZWQgdG8gZ2V0IGVpdGhlciBIT01FRFJJVkUgb3IgSE9NRVBBVEggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBlbnZpcm9ubWVudCBzZXR0aW5ncyEiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB0aHJvdygtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbnByaW50ZihmdWxsX2ZpbGUsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVzJXNcXCVzIiwgaG9tZV9kcml2ZSwKKyAgICAgICAgICAgICAgICAgICAgIHRlbXAsIGh0bWxfZmlsZV9uYW1lKTsKKyNlbHNlCisgICAgICAgICAgICBzbnByaW50ZihmdWxsX2ZpbGUsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIn4vJXMiLCBodG1sX2ZpbGVfbmFtZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGdsb2JhbF9pdGVtcy5odG1sX2ZpbGVfc3RyZWFtLm9wZW4oZnVsbF9maWxlKTsKKyAgICAgICAgICAgIGlmIChnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbS5mYWlsKCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yIGZhaWxlZCBvcGVuaW5nIGh0bWwgZmlsZSBzdHJlYW0gdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWl0aGVyIGN1cnJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9sZGVyIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaHRtbF9maWxlX25hbWUgPDwgIiBvciBob21lIGZvbGRlciBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfZmlsZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgdGhyb3coLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2xvYmFsX2l0ZW1zLmN1cl90YWJsZSA9IDA7CisKKy8vIERldGVybWluZSB3aGVyZSB3ZSBhcmUgZXhlY3V0aW5nIGF0LgorI2lmZGVmIF9XSU4zMgorICAgICAgICBpbnQgYnl0ZXMgPSBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCB0ZW1wLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICBpZiAoMCA8IGJ5dGVzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBleGVfbG9jYXRpb24gPSB0ZW1wOworICAgICAgICAgICAgZ2xvYmFsX2l0ZW1zLmV4ZV9kaXJlY3RvcnkgPQorICAgICAgICAgICAgICAgIGV4ZV9sb2NhdGlvbi5zdWJzdHIoMCwgZXhlX2xvY2F0aW9uLnJmaW5kKCJcXCIpKTsKKworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBnbG9iYWxfaXRlbXMuZXhlX2RpcmVjdG9yeS5maW5kKCJcXCIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdsb2JhbF9pdGVtcy5leGVfZGlyZWN0b3J5LnJlcGxhY2UoaW5kZXgsIDEsICIvIik7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdsb2JhbF9pdGVtcy5leGVfZGlyZWN0b3J5ID0gIiI7CisgICAgICAgIH0KKworI2VsaWYgX19HTlVDX18KKyAgICAgICAgc3NpemVfdCBsZW4gPSA6OnJlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIsIHRlbXAsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSk7CisgICAgICAgIGlmICgwIDwgbGVuKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBleGVfbG9jYXRpb24gPSB0ZW1wOworICAgICAgICAgICAgZ2xvYmFsX2l0ZW1zLmV4ZV9kaXJlY3RvcnkgPQorICAgICAgICAgICAgICAgIGV4ZV9sb2NhdGlvbi5zdWJzdHIoMCwgZXhlX2xvY2F0aW9uLnJmaW5kKCIvIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2xvYmFsX2l0ZW1zLmV4ZV9kaXJlY3RvcnkgPSAiIjsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgU3RhcnRPdXRwdXQoIkx1bmFyRyBWSUEiKTsKKworICAgICAgICBQcmludFN5c3RlbUluZm8oKTsKKyAgICAgICAgUHJpbnRWdWxrYW5JbmZvKCk7CisgICAgICAgIFByaW50VGVzdFJlc3VsdHMoKTsKKyAgICAgICAgRW5kT3V0cHV0KCk7CisgICAgfSBjYXRjaCAoaW50IGUpIHsKKyAgICAgICAgLy8gUHJpbnQgb3V0IGEgdXNlZnVsIG1lc3NhZ2UgZm9yIGFueSBjb21tb24gZXJyb3JzLgorICAgICAgICBzd2l0Y2ggKGUpIHsKKyAgICAgICAgY2FzZSBNSVNTSU5HX0RSSVZFUl9SRUdJU1RSWToKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRVJST1I6IEZhaWxlZCB0byBmaW5kIFZ1bGthbiBEcml2ZXIgSlNPTiBpbiByZWdpc3RyeSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNSVNTSU5HX0RSSVZFUl9KU09OOgorICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogRmFpbGVkIHRvIGZpbmQgVnVsa2FuIERyaXZlciBKU09OIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1JU1NJTkdfRFJJVkVSX0xJQjoKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRVJST1I6IEZhaWxlZCB0byBmaW5kIFZ1bGthbiBEcml2ZXIgTGliIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWVUxLQU5fQ0FOVF9GSU5EX0RSSVZFUjoKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRVJST1I6IFZ1bGthbiBmYWlsZWQgdG8gZmluZCBhIGNvbXBhdGlibGUgZHJpdmVyIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogVWtub3duIGZhaWx1cmUgb2NjdXJyZWQuICBSZWZlciB0byBIVE1MIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgaW5mbyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlcnJfdmFsID0gZTsKKyAgICB9CisgICAgZ2xvYmFsX2l0ZW1zLmh0bWxfZmlsZV9zdHJlYW0uY2xvc2UoKTsKKworICAgIGlmIChlcnJfdmFsID09IDApIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJTVUNDRVNTOiBWYWxpZGF0aW9uIGNvbXBsZXRlZCBwcm9wZXJseSIgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICByZXR1cm4gZXJyX3ZhbDsKK30KKworLy8gT3V0cHV0IGhlbHBlciBmdW5jdGlvbnM6CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFN0YXJ0IHdyaXRpbmcgdG8gdGhlIEhUTUwgZmlsZSBieSBjcmVhdGluZyB0aGUgYXBwcm9wcmlhdGUKKy8vIGhlYWRlciBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIENTUyBhbmQgSmF2YVNjcmlwdAorLy8gaXRlbXMuCit2b2lkIFN0YXJ0T3V0cHV0KHN0ZDo6c3RyaW5nIG91dHB1dCkgeworICAgIGdsb2JhbF9pdGVtcy5odG1sX2ZpbGVfc3RyZWFtIDw8ICI8IURPQ1RZUEUgaHRtbD4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCAiPEhUTUwgbGFuZz1cImVuXCIgeG1sOmxhbmc9XCJlblwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCBzdGQ6OmVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiPEhFQUQ+IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAgIDxUSVRMRT4iIDw8IG91dHB1dCA8PCAiPC9USVRMRT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgZ2xvYmFsX2l0ZW1zLmh0bWxfZmlsZV9zdHJlYW0KKyAgICAgICAgPDwgIiAgICA8TUVUQSBjaGFyc2V0PVwiVVRGLThcIj4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgIDxzdHlsZSBtZWRpYT1cInNjcmVlblwiIHR5cGU9XCJ0ZXh0L2Nzc1wiPiIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgIGh0bWwgeyIgPDwgc3RkOjplbmRsCisgICAgICAgIC8vIEJ5IGRlZmluaW5nIHRoZSBjb2xvciBmaXJzdCwgdGhpcyB3b24ndCBvdmVycmlkZSB0aGUgYmFja2dyb3VuZCBpbWFnZQorICAgICAgICAvLyAodW5sZXNzIHRoZSBpbWFnZXMgYXJlbid0IHRoZXJlKS4KKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwYjFlNDg7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHRyeSB0byBsb2FkIHRoZSB0ZXh0IGltYWdlIHR3aWNlIChsb2NhbGx5LCB0aGVuCisgICAgICAgIC8vIG9mZiB0aGUgd2ViKSBmb2xsb3dlZCBieSB0aGUgYmFja2dyb3VuZCBpbWFnZSB0d2ljZSAobG9jYWxseSwgdGhlbgorICAgICAgICAvLyBvZmYgdGhlIHdlYikuICBUaGUgYmFja2dyb3VuZCBjb2xvciB3aWxsIG9ubHkgc2hvdyBpZiBib3RoIGJhY2tncm91bmQKKyAgICAgICAgLy8gaW1hZ2UgbG9hZHMgZmFpbC4gIEluIHRoaXMgd2F5LCBhIHVzZXIgd2lsbCBzZWUgdGhlaXIgbG9jYWwgY29weSBvbgorICAgICAgICAvLyB0aGVpciBtYWNoaW5lLCB3aGlsZSBhIHBlcnNvbiB0aGV5IHNoYXJlIGl0IHdpdGggd2lsbCBzZWUgdGhlIHdlYgorICAgICAgICAvLyBpbWFnZXMgKG9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yKS4KKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImZpbGU6Ly8vIgorICAgICAgICA8PCBnbG9iYWxfaXRlbXMuZXhlX2RpcmVjdG9yeSA8PCAiL2ltYWdlcy9sdW5hcmdfdmlhLnBuZ1wiKSwgIgorICAgICAgICA8PCAidXJsKFwiaHR0cHM6Ly92dWxrYW4ubHVuYXJnLmNvbS9pbWcvbHVuYXJnX3ZpYS5wbmdcIiksICIKKyAgICAgICAgICAgInVybChcImZpbGU6Ly8vIgorICAgICAgICA8PCBnbG9iYWxfaXRlbXMuZXhlX2RpcmVjdG9yeSA8PCAiL2ltYWdlcy9iZy1zdGFyZmllbGQuanBnXCIpLCAiCisgICAgICAgIDw8ICJ1cmwoXCJodHRwczovL3Z1bGthbi5sdW5hcmcuY29tL2ltZy9iZy1zdGFyZmllbGQuanBnXCIpOyIKKyAgICAgICAgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgdG9wLCBjZW50ZXIgdG9wLCBjZW50ZXIsICIKKyAgICAgICAgICAgImNlbnRlcjsiCisgICAgICAgIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IGF1dG8sIGF1dG8sIGNvdmVyLCBjb3ZlcjsiCisgICAgICAgIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgLW1vei1iYWNrZ3JvdW5kLXNpemU6IGF1dG8sIGF1dG8sIGNvdmVyLCBjb3ZlcjsiCisgICAgICAgIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgLW8tYmFja2dyb3VuZC1zaXplOiBhdXRvLCBhdXRvLCBjb3ZlciwgY292ZXI7IgorICAgICAgICA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogYXV0bywgYXV0bywgY292ZXIsIGNvdmVyOyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IHNjcm9sbCwgc2Nyb2xsLCBmaXhlZCwgZml4ZWQ7IgorICAgICAgICA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQsIG5vLXJlcGVhdCwgbm8tcmVwZWF0LCAiCisgICAgICAgICAgICJuby1yZXBlYXQ7IgorICAgICAgICA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgfSIgPDwgc3RkOjplbmRsCisgICAgICAgIC8vIGgxLnNlY3Rpb24gaXMgdXNlZCBmb3Igc2VjdGlvbiBoZWFkZXJzLCBhbmQgaDEudmVyc2lvbiBpcyB1c2VkIHRvCisgICAgICAgIC8vIHByaW50IG91dCB0aGUgYXBwbGljYXRpb24gdmVyc2lvbiB0ZXh0ICh3aGljaCBzaG93cyB1cCBqdXN0IHVuZGVyCisgICAgICAgIC8vIHRoZSB0aXRsZSkuCisgICAgICAgIDw8ICIgICAgICAgIGgxLnNlY3Rpb24geyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgZm9udC1zaXplOiAzNXB4OyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICBjb2xvcjogI0ZGRkZGRjsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICB9IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgaDEudmVyc2lvbiB7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICBmb250LXNpemU6IDI1cHg7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGNvbG9yOiAjRkZGRkZGOyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgIH0iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICB0YWJsZSB7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIG1pbi13aWR0aDogNjAwcHg7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIHdpZHRoOiA3MCU7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogZ3JleTsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgfSIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgIHRkLmhlYWRlciB7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIHBhZGRpbmc6IDE4cHg7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgY29sb3I6ICNmZmY7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgfSIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgIHRkLm9kZCB7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICB9IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgdGQuZXZlbiB7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgY29sb3I6IHJnYigyMjAsIDIyMCwgMjIwKTsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICB9IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgdHIuaGVhZGVyIHsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjUpOyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgIH0iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICB0ci5vZGQgeyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNik7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgfSIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgIHRyLmV2ZW4geyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNyk7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgfSIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgPC9zdHlsZT4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvIgorICAgICAgICA8PCAiMi4yLjQvanF1ZXJ5Lm1pbi5qc1wiPjwvc2NyaXB0PiIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgJCggZG9jdW1lbnQgKS5yZWFkeShmdW5jdGlvbigpIHsiIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgJCgndGFibGUgdHI6bm90KC5oZWFkZXIpJykuaGlkZSgpOyIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICIgICAgICAgICAgICAkKCcuaGVhZGVyJykuY2xpY2soZnVuY3Rpb24oKSB7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAiCisgICAgICAgICAgICIkKHRoaXMpLm5leHRVbnRpbCgndHIuaGVhZGVyJykuc2xpZGVUb2dnbGUoMzAwKTsiCisgICAgICAgIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgfSk7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICAgICAgfSk7IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgIiAgICA8L3NjcmlwdD4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiPC9IRUFEPiIgPDwgc3RkOjplbmRsCisgICAgICAgIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiPEJPRFk+IiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgPDwgc3RkOjplbmRsOworICAgIC8vIFdlIG5lZWQgc3BhY2UgZnJvbSB0aGUgdG9wIGZvciB0aGUgVklBIHRleHR1cmUKKyAgICBmb3IgKHVpbnQzMl90IHNwYWNlID0gMDsgc3BhY2UgPCAxNTsgc3BhY2UrKykgeworICAgICAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCAiICAgIDxCUiAvPiIgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICAvLyBBbGwgdGhlIHNpbGx5ICImbmJzcDsiIGFyZSB0byBtYWtlIHN1cmUgdGhlIHZlcnNpb24gbGluZXMgdXAgZGlyZWN0bHkKKyAgICAvLyB1bmRlciB0aGUgIFZJQSBwb3J0aW9uIG9mIHRoZSBsb2cuCisgICAgZ2xvYmFsX2l0ZW1zLmh0bWxfZmlsZV9zdHJlYW0gPDwgIiAgICA8SDEgY2xhc3M9XCJ2ZXJzaW9uXCI+PGNlbnRlcj4iOworICAgIGZvciAodWludDMyX3Qgc3BhY2UgPSAwOyBzcGFjZSA8IDY1OyBzcGFjZSsrKSB7CisgICAgICAgIGdsb2JhbF9pdGVtcy5odG1sX2ZpbGVfc3RyZWFtIDw8ICImbmJzcDsiOworICAgIH0KKyAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCBBUFBfVkVSU0lPTiA8PCAiPC9jZW50ZXI+PC9oMT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgICA8QlIgLz4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICAgPEJSIC8+IiA8PCBzdGQ6OmVuZGw7Cit9CisKKy8vIENsb3NlIG91dCB3cml0aW5nIHRvIHRoZSBIVE1MIGZpbGUuCit2b2lkIEVuZE91dHB1dCgpIHsKKyAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCAiPC9CT0RZPiIgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjwvSFRNTD4iIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBCZWdpblNlY3Rpb24oc3RkOjpzdHJpbmcgc2VjdGlvbl9zdHIpIHsKKyAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCAiICAgIDxIMSBjbGFzcz1cInNlY3Rpb25cIj48Y2VudGVyPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzZWN0aW9uX3N0ciA8PCAiPC9jZW50ZXI+PC9oMT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworfQorCit2b2lkIEVuZFNlY3Rpb24oKSB7CisgICAgZ2xvYmFsX2l0ZW1zLmh0bWxfZmlsZV9zdHJlYW0gPDwgIiAgICA8QlIvPiIgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgICA8QlIvPiIgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFByaW50U3RhbmRhcmRUZXh0KHN0ZDo6c3RyaW5nIHNlY3Rpb24pIHsKKyAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCAiICAgIDxIMj48Zm9udCBjb2xvcj1cIldoaXRlXCI+IiA8PCBzZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjwvZm9udD48L0gyPiIgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFByaW50QmVnaW5UYWJsZShjb25zdCBjaGFyICp0YWJsZV9uYW1lLCB1aW50MzJfdCBudW1fY29scykgeworCisgICAgZ2xvYmFsX2l0ZW1zLmh0bWxfZmlsZV9zdHJlYW0KKyAgICAgICAgPDwgIiAgICA8dGFibGUgYWxpZ249XCJjZW50ZXJcIj4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICA8dHIgY2xhc3M9XCJoZWFkZXJcIj4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIiIDw8IG51bV9jb2xzIDw8ICJcIiBjbGFzcz1cImhlYWRlclwiPiIKKyAgICAgICAgPDwgdGFibGVfbmFtZSA8PCAiPC90ZD4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICA8PCAiICAgICAgICAgPC90cj4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIGdsb2JhbF9pdGVtcy5pc19vZGRfcm93ID0gdHJ1ZTsKK30KKwordm9pZCBQcmludEJlZ2luVGFibGVSb3coKSB7CisgICAgc3RkOjpzdHJpbmcgY2xhc3Nfc3RyID0gIiI7CisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc19vZGRfcm93KSB7CisgICAgICAgIGNsYXNzX3N0ciA9ICIgY2xhc3M9XCJvZGRcIiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xhc3Nfc3RyID0gIiBjbGFzcz1cImV2ZW5cIiI7CisgICAgfQorICAgIGdsb2JhbF9pdGVtcy5odG1sX2ZpbGVfc3RyZWFtIDw8ICIgICAgICAgIDx0ciIgPDwgY2xhc3Nfc3RyIDw8ICI+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBQcmludFRhYmxlRWxlbWVudChzdGQ6OnN0cmluZyBlbGVtZW50LCBFbGVtZW50QWxpZ24gYWxpZ24gPSBBTElHTl9MRUZUKSB7CisgICAgc3RkOjpzdHJpbmcgYWxpZ25fc3RyID0gIiI7CisgICAgc3RkOjpzdHJpbmcgY2xhc3Nfc3RyID0gIiI7CisgICAgaWYgKGFsaWduID09IEFMSUdOX1JJR0hUKSB7CisgICAgICAgIGFsaWduX3N0ciA9ICIgYWxpZ249XCJyaWdodFwiIjsKKyAgICB9CisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc19vZGRfcm93KSB7CisgICAgICAgIGNsYXNzX3N0ciA9ICIgY2xhc3M9XCJvZGRcIiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xhc3Nfc3RyID0gIiBjbGFzcz1cImV2ZW5cIiI7CisgICAgfQorICAgIGdsb2JhbF9pdGVtcy5odG1sX2ZpbGVfc3RyZWFtIDw8ICIgICAgICAgICAgICA8dGQiIDw8IGFsaWduX3N0ciA8PCBjbGFzc19zdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiPiIgPDwgZWxlbWVudCA8PCAiPC90ZD4iIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBQcmludEVuZFRhYmxlUm93KCkgeworICAgIGdsb2JhbF9pdGVtcy5odG1sX2ZpbGVfc3RyZWFtIDw8ICIgICAgICAgIDwvdHI+IiA8PCBzdGQ6OmVuZGw7CisgICAgZ2xvYmFsX2l0ZW1zLmlzX29kZF9yb3cgPSAhZ2xvYmFsX2l0ZW1zLmlzX29kZF9yb3c7Cit9CisKK3ZvaWQgUHJpbnRFbmRUYWJsZSgpIHsKKyAgICBnbG9iYWxfaXRlbXMuaHRtbF9maWxlX3N0cmVhbSA8PCAiICAgIDwvdGFibGU+IiA8PCBzdGQ6OmVuZGw7Cit9CisKKy8vIEdlbmVyYXRlIHRoZSBmdWxsIGxpYnJhcnkgbG9jYXRpb24gZm9yIGEgZmlsZSBiYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YKKy8vIHRoZSBKU09OIGZpbGUgcmVmZXJlbmNpbmcgaXQsIGFuZCB0aGUgbGlicmFyeSBsb2NhdGlvbiBjb250YWluZWQgaW4gdGhhdAorLy8gSlNPTiBmaWxlLgorYm9vbCBHZW5lcmF0ZUxpYnJhcnlQYXRoKGNvbnN0IGNoYXIgKmpzb25fbG9jYXRpb24sIGNvbnN0IGNoYXIgKmxpYnJhcnlfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhfbGVuZ3RoLCBjaGFyICpsaWJyYXJ5X2xvY2F0aW9uKSB7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgY2hhciBmaW5hbF9wYXRoW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyICp3b3JraW5nX3N0cmluZ19wdHI7CisgICAgdWludDMyX3QgbGVuID0KKyAgICAgICAgKG1heF9sZW5ndGggPiBNQVhfU1RSSU5HX0xFTkdUSCkgPyBNQVhfU1RSSU5HX0xFTkdUSCA6IG1heF9sZW5ndGg7CisKKyAgICBpZiAoTlVMTCA9PSBqc29uX2xvY2F0aW9uIHx8IE5VTEwgPT0gbGlicmFyeV9pbmZvIHx8CisgICAgICAgIE5VTEwgPT0gbGlicmFyeV9sb2NhdGlvbikgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUganNvbiBmaWxlIGZyb20ganNvbiBwYXRoIHRvIGdldCBqdXN0IHRoZSBmaWxlIGJhc2UgbG9jYXRpb24KKyAgICBzdHJuY3B5KGZpbmFsX3BhdGgsIGpzb25fbG9jYXRpb24sIGxlbik7CisgICAgd29ya2luZ19zdHJpbmdfcHRyID0gc3RycmNocihmaW5hbF9wYXRoLCAnXFwnKTsKKyAgICBpZiAod29ya2luZ19zdHJpbmdfcHRyID09IE5VTEwpIHsKKyAgICAgICAgd29ya2luZ19zdHJpbmdfcHRyID0gc3RycmNocihmaW5hbF9wYXRoLCAnLycpOworICAgIH0KKyAgICBpZiAod29ya2luZ19zdHJpbmdfcHRyICE9IE5VTEwpIHsKKyAgICAgICAgd29ya2luZ19zdHJpbmdfcHRyKys7CisgICAgICAgICp3b3JraW5nX3N0cmluZ19wdHIgPSAnXDAnOworICAgIH0KKworICAgIC8vIERldGVybWluZSBpZiB0aGUgbGlicmFyeSBpcyByZWxhdGl2ZSBvciBhYnNvbHV0ZQorICAgIGlmIChsaWJyYXJ5X2luZm9bMF0gPT0gJ1xcJyB8fCBsaWJyYXJ5X2luZm9bMF0gPT0gJy8nIHx8CisgICAgICAgIGxpYnJhcnlfaW5mb1sxXSA9PSAnOicpIHsKKyAgICAgICAgLy8gQWJzb2x1dGUgcGF0aAorICAgICAgICBzdHJuY3B5KGxpYnJhcnlfbG9jYXRpb24sIGxpYnJhcnlfaW5mbywgbGVuKTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgaSA9IDA7CisgICAgICAgIC8vIFJlbGF0aXZlIHBhdGgsIHNvIHdlIG5lZWQgdG8gdXNlIHRoZSBKU09OJ3MgbG9jYXRpb24KKyAgICAgICAgd2hpbGUgKGxpYnJhcnlfaW5mb1tpXSA9PSAnLicgJiYgbGlicmFyeV9pbmZvW2kgKyAxXSA9PSAnLicgJiYKKyAgICAgICAgICAgICAgIChsaWJyYXJ5X2luZm9baSArIDJdID09ICdcXCcgfHwgbGlicmFyeV9pbmZvW2kgKyAyXSA9PSAnLycpKSB7CisgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAvLyBHbyB1cCBhIGZvbGRlciBpbiB0aGUganNvbiBwYXRoCisgICAgICAgICAgICB3b3JraW5nX3N0cmluZ19wdHIgPSBzdHJyY2hyKGZpbmFsX3BhdGgsICdcXCcpOworICAgICAgICAgICAgaWYgKHdvcmtpbmdfc3RyaW5nX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgd29ya2luZ19zdHJpbmdfcHRyID0gc3RycmNocihmaW5hbF9wYXRoLCAnLycpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmtpbmdfc3RyaW5nX3B0ciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgd29ya2luZ19zdHJpbmdfcHRyKys7CisgICAgICAgICAgICAgICAgKndvcmtpbmdfc3RyaW5nX3B0ciA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGxpYnJhcnlfaW5mb1tpXSA9PSAnLicgJiYKKyAgICAgICAgICAgICAgIChsaWJyYXJ5X2luZm9baSArIDFdID09ICdcXCcgfHwgbGlicmFyeV9pbmZvW2kgKyAxXSA9PSAnLycpKSB7CisgICAgICAgICAgICBpICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgc3RybmNweShsaWJyYXJ5X2xvY2F0aW9uLCBmaW5hbF9wYXRoLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICBzdHJuY2F0KGxpYnJhcnlfbG9jYXRpb24sICZsaWJyYXJ5X2luZm9baV0sIGxlbik7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0KKworb3V0OgorICAgIHJldHVybiBzdWNjZXNzOworfQorCisjaWZkZWYgX1dJTjMyCisvLyBSZWdpc3RyeSB1dGlsaXR5IGZ1Y3Rpb25zIHRvIHNpbXBsaWZ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZQorLy8gV2luZG93cyByZWdpc3RyeS4KKworY29uc3QgY2hhciBnX3VuaW5zdGFsbF9yZWdfcGF0aFtdID0KKyAgICAiU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbCI7CisKK2Jvb2wgUmVhZFJlZ0tleVN0cmluZyhIS0VZIHJlZ0ZvbGRlciwgY29uc3QgY2hhciAqa2V5UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZU5hbWUsIGNvbnN0IGludCBtYXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcmV0U3RyaW5nKSB7CisgICAgYm9vbCByZXRWYWwgPSBmYWxzZTsKKyAgICBEV09SRCBidWZMZW4gPSBtYXhMZW5ndGg7CisgICAgRFdPUkQga2V5RmxhZ3MgPSBLRVlfUkVBRDsKKyAgICBIS0VZIGhLZXk7CisgICAgTE9ORyBscmV0OworCisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc193b3c2NCkgeworICAgICAgICBrZXlGbGFncyB8PSBLRVlfV09XNjRfNjRLRVk7CisgICAgfQorCisgICAgKnJldFN0cmluZyA9ICdcMCc7CisgICAgbHJldCA9IFJlZ09wZW5LZXlFeEEocmVnRm9sZGVyLCBrZXlQYXRoLCAwLCBrZXlGbGFncywgJmhLZXkpOworICAgIGlmIChscmV0ID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgbHJldCA9IFJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgdmFsdWVOYW1lLCBOVUxMLCBOVUxMLCAoQllURSAqKXJldFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zkxlbik7CisgICAgICAgIGlmIChscmV0ID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworYm9vbCBXcml0ZVJlZ0tleVN0cmluZyhIS0VZIHJlZ0ZvbGRlciwgY29uc3QgY2hhciAqa2V5UGF0aCwgY2hhciAqdmFsdWVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZVZhbHVlKSB7CisgICAgYm9vbCByZXRWYWwgPSBmYWxzZTsKKyAgICBEV09SRCBrZXlGbGFncyA9IEtFWV9XUklURTsKKyAgICBIS0VZIGhLZXk7CisgICAgTE9ORyBscmV0OworCisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc193b3c2NCkgeworICAgICAgICBrZXlGbGFncyB8PSBLRVlfV09XNjRfNjRLRVk7CisgICAgfQorCisgICAgbHJldCA9IFJlZ09wZW5LZXlFeEEocmVnRm9sZGVyLCBrZXlQYXRoLCAwLCBrZXlGbGFncywgJmhLZXkpOworICAgIGlmIChscmV0ID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgbHJldCA9IFJlZ1NldEtleVZhbHVlQShoS2V5LCBOVUxMLCB2YWx1ZU5hbWUsIFJFR19TWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSAqKXZhbHVlVmFsdWUsIChEV09SRCkoc3RybGVuKHZhbHVlVmFsdWUpKSk7CisgICAgICAgIGlmIChscmV0ID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworYm9vbCBEZWxldGVSZWdLZXlTdHJpbmcoSEtFWSByZWdGb2xkZXIsIGNvbnN0IGNoYXIgKmtleVBhdGgsIGNoYXIgKnZhbHVlTmFtZSkgeworICAgIGJvb2wgcmV0VmFsID0gZmFsc2U7CisgICAgRFdPUkQga2V5RmxhZ3MgPSBLRVlfV1JJVEU7CisgICAgSEtFWSBoS2V5OworICAgIExPTkcgbHJldDsKKworICAgIGlmIChnbG9iYWxfaXRlbXMuaXNfd293NjQpIHsKKyAgICAgICAga2V5RmxhZ3MgfD0gS0VZX1dPVzY0XzY0S0VZOworICAgIH0KKworICAgIGxyZXQgPSBSZWdPcGVuS2V5RXhBKHJlZ0ZvbGRlciwga2V5UGF0aCwgMCwga2V5RmxhZ3MsICZoS2V5KTsKKyAgICBpZiAobHJldCA9PSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIGxyZXQgPSBSZWdEZWxldGVLZXlWYWx1ZUEoaEtleSwgTlVMTCwgdmFsdWVOYW1lKTsKKyAgICAgICAgaWYgKGxyZXQgPT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0VmFsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCitib29sIFJlYWRSZWdLZXlEd29yZChIS0VZIHJlZ0ZvbGRlciwgY29uc3QgY2hhciAqa2V5UGF0aCwgY29uc3QgY2hhciAqdmFsdWVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpyZXR1cm5JbnQpIHsKKyAgICBib29sIHJldFZhbCA9IGZhbHNlOworICAgIERXT1JEIGJ1ZkxlbiA9IHNpemVvZihEV09SRCk7CisgICAgRFdPUkQga2V5RmxhZ3MgPSBLRVlfUkVBRDsKKyAgICBIS0VZIGhLZXk7CisgICAgTE9ORyBscmV0OworCisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc193b3c2NCkgeworICAgICAgICBrZXlGbGFncyB8PSBLRVlfV09XNjRfNjRLRVk7CisgICAgfQorCisgICAgKnJldHVybkludCA9IDA7CisgICAgbHJldCA9IFJlZ09wZW5LZXlFeEEocmVnRm9sZGVyLCBrZXlQYXRoLCAwLCBrZXlGbGFncywgJmhLZXkpOworICAgIGlmIChscmV0ID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgbHJldCA9IFJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgdmFsdWVOYW1lLCBOVUxMLCBOVUxMLCAoQllURSAqKXJldHVybkludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zkxlbik7CisgICAgICAgIGlmIChscmV0ID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworYm9vbCBGaW5kTmV4dFJlZ0tleShIS0VZIHJlZ0ZvbGRlciwgY29uc3QgY2hhciAqa2V5UGF0aCwgY29uc3QgY2hhciAqa2V5U2VhcmNoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXRlbUluZGV4LCBjb25zdCBpbnQgbWF4TGVuZ3RoLCBjaGFyICpyZXRTdHJpbmcpIHsKKyAgICBib29sIHJldFZhbCA9IGZhbHNlOworICAgIERXT1JEIGJ1ZkxlbiA9IE1BWF9TVFJJTkdfTEVOR1RIIC0gMTsKKyAgICBEV09SRCBrZXlGbGFncyA9IEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMgfCBLRVlfUVVFUllfVkFMVUU7CisgICAgSEtFWSBoS2V5OworICAgIExPTkcgbHJldDsKKyAgICBpbnQgaXRlbUNvdW50ID0gMDsKKworICAgIGlmIChnbG9iYWxfaXRlbXMuaXNfd293NjQpIHsKKyAgICAgICAga2V5RmxhZ3MgfD0gS0VZX1dPVzY0XzY0S0VZOworICAgIH0KKworICAgICpyZXRTdHJpbmcgPSAnXDAnOworICAgIGxyZXQgPSBSZWdPcGVuS2V5RXhBKHJlZ0ZvbGRlciwga2V5UGF0aCwgMCwga2V5RmxhZ3MsICZoS2V5KTsKKyAgICBpZiAobHJldCA9PSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIERXT1JEIGluZGV4ID0gMDsKKyAgICAgICAgY2hhciBrZXlOYW1lW01BWF9TVFJJTkdfTEVOR1RIXTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBscmV0ID0gUmVnRW51bUtleUV4QShoS2V5LCBpbmRleCwga2V5TmFtZSwgJmJ1ZkxlbiwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKEVSUk9SX1NVQ0NFU1MgIT0gbHJldCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmxlbihrZXlTZWFyY2gpID09IDAgfHwgTlVMTCAhPSBzdHJzdHIoa2V5TmFtZSwga2V5U2VhcmNoKSkgeworICAgICAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPT0gaXRlbUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHlfcyhyZXRTdHJpbmcsIG1heExlbmd0aCwga2V5TmFtZSwgYnVmTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbUNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmTGVuID0gTUFYX1NUUklOR19MRU5HVEggLSAxOworICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworYm9vbCBGaW5kTmV4dFJlZ1ZhbHVlKEhLRVkgcmVnRm9sZGVyLCBjb25zdCBjaGFyICprZXlQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlU2VhcmNoLCBjb25zdCBpbnQgc3RhcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWF4TGVuZ3RoLCBjaGFyICpyZXRTdHJpbmcsIHVpbnQzMl90ICpyZXRWYWx1ZSkgeworICAgIGJvb2wgcmV0VmFsID0gZmFsc2U7CisgICAgRFdPUkQgYnVmTGVuID0gTUFYX1NUUklOR19MRU5HVEggLSAxOworICAgIERXT1JEIGtleUZsYWdzID0gS0VZX0VOVU1FUkFURV9TVUJfS0VZUyB8IEtFWV9RVUVSWV9WQUxVRTsKKyAgICBIS0VZIGhLZXk7CisgICAgTE9ORyBscmV0OworCisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc193b3c2NCkgeworICAgICAgICBrZXlGbGFncyB8PSBLRVlfV09XNjRfNjRLRVk7CisgICAgfQorCisgICAgKnJldFZhbHVlID0gMDsKKyAgICAqcmV0U3RyaW5nID0gJ1wwJzsKKyAgICBscmV0ID0gUmVnT3BlbktleUV4QShyZWdGb2xkZXIsIGtleVBhdGgsIDAsIGtleUZsYWdzLCAmaEtleSk7CisgICAgaWYgKGxyZXQgPT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBEV09SRCBpbmRleCA9IHN0YXJ0SW5kZXg7CisgICAgICAgIGNoYXIgdmFsdWVOYW1lW01BWF9TVFJJTkdfTEVOR1RIXTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBEV09SRCB0eXBlOworICAgICAgICAgICAgRFdPUkQgdmFsdWU7CisgICAgICAgICAgICBEV09SRCBsZW47CisgICAgICAgICAgICBscmV0ID0gUmVnRW51bVZhbHVlQShoS2V5LCBpbmRleCwgdmFsdWVOYW1lLCAmYnVmTGVuLCBOVUxMLCAmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpJnZhbHVlLCAmbGVuKTsKKyAgICAgICAgICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IGxyZXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlID09IFJFR19EV09SRCkgeworICAgICAgICAgICAgICAgICpyZXRWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmxlbih2YWx1ZVNlYXJjaCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIE5VTEwgIT0gc3Ryc3RyKHZhbHVlTmFtZSwgdmFsdWVTZWFyY2gpKSB7CisgICAgICAgICAgICAgICAgc3RybmNweV9zKHJldFN0cmluZywgbWF4TGVuZ3RoLCB2YWx1ZU5hbWUsIGJ1Zkxlbik7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZkxlbiA9IE1BWF9TVFJJTkdfTEVOR1RIIC0gMTsKKyAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0gd2hpbGUgKHRydWUpOworICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8vIFJlZ2lzdHJ5IHByb3RvdHlwZXMgZm9yIFdpbmRvd3MKK2Jvb2wgUmVhZFJlZ0tleUR3b3JkKEhLRVkgcmVnRm9sZGVyLCBjb25zdCBjaGFyICprZXlQYXRoLCBjb25zdCBjaGFyICp2YWx1ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnJldHVybkludCk7Citib29sIFJlYWRSZWdLZXlTdHJpbmcoSEtFWSByZWdGb2xkZXIsIGNvbnN0IGNoYXIgKmtleVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVOYW1lLCBjb25zdCBpbnQgbWF4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJldFN0cmluZyk7Citib29sIEZpbmROZXh0UmVnS2V5KEhLRVkgcmVnRm9sZGVyLCBjb25zdCBjaGFyICprZXlQYXRoLCBjb25zdCBjaGFyICprZXlTZWFyY2gsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdGFydEluZGV4LCBjb25zdCBpbnQgbWF4TGVuZ3RoLCBjaGFyICpyZXRTdHJpbmcpOworYm9vbCBGaW5kTmV4dFJlZ1ZhbHVlKEhLRVkgcmVnRm9sZGVyLCBjb25zdCBjaGFyICprZXlQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlU2VhcmNoLCBjb25zdCBpbnQgc3RhcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWF4TGVuZ3RoLCBjaGFyICpyZXRTdHJpbmcsIHVpbnQzMl90ICpyZXRWYWx1ZSk7Citib29sIFdyaXRlUmVnS2V5U3RyaW5nKEhLRVkgcmVnRm9sZGVyLCBjb25zdCBjaGFyICprZXlQYXRoLCBjaGFyICp2YWx1ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlVmFsdWUpOworYm9vbCBEZWxldGVSZWdLZXlTdHJpbmcoSEtFWSByZWdGb2xkZXIsIGNvbnN0IGNoYXIgKmtleVBhdGgsIGNoYXIgKnZhbHVlTmFtZSk7CisKKy8vIEZ1bmN0aW9uYWxpdHkgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgMzItYml0IHByb2Nlc3MgaXMgcnVubmluZyBvbiBXaW5kb3dzIDY0LgorLy8KK3ZvaWQgSXNXb3c2NCgpIHsKKyAgICB0eXBlZGVmIEJPT0woV0lOQVBJICogTFBGTl9JU1dPVzY0UFJPQ0VTUykoSEFORExFLCBQQk9PTCk7CisKKyAgICAvLyBJc1dvdzY0UHJvY2VzcyBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBzdXBwb3J0ZWQgdmVyc2lvbnMgb2YgV2luZG93cy4KKyAgICAvLyBVc2UgR2V0TW9kdWxlSGFuZGxlIHRvIGdldCBhIGhhbmRsZSB0byB0aGUgRExMIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uCisgICAgLy8gYW5kIEdldFByb2NBZGRyZXNzIHRvIGdldCBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIGlmIGF2YWlsYWJsZS4KKworICAgIExQRk5fSVNXT1c2NFBST0NFU1MgZm5Jc1dvdzY0UHJvY2VzcyA9IChMUEZOX0lTV09XNjRQUk9DRVNTKUdldFByb2NBZGRyZXNzKAorICAgICAgICBHZXRNb2R1bGVIYW5kbGUoVEVYVCgia2VybmVsMzIiKSksICJJc1dvdzY0UHJvY2VzcyIpOworCisgICAgaWYgKE5VTEwgIT0gZm5Jc1dvdzY0UHJvY2VzcykgeworICAgICAgICBCT09MIGlzV09XID0gRkFMU0U7CisgICAgICAgIGlmICghZm5Jc1dvdzY0UHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAmaXNXT1cpKSB7CisgICAgICAgICAgICBwcmludGYoIkVycm9yIDogRmFpbGVkIHRvIGRldGVybWluZSBwcm9wZXJseSBpZiBvbiBXaW42NCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1dPVyA9PSBUUlVFKSB7CisgICAgICAgICAgICBnbG9iYWxfaXRlbXMuaXNfd293NjQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCisvLyBSdW4gdGhlIHRlc3QgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcnkgd2l0aCB0aGUgY29ycmVzcG9uZGluZworLy8gY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKy8vIFJldHVybnMgMCBvbiBubyBlcnJvciwgMSBpZiB0ZXN0IGZpbGUgd2Fzbid0IGZvdW5kLCBhbmQgLTEKKy8vIG9uIGFueSBvdGhlciBlcnJvcnMuCitpbnQgUnVuVGVzdEluRGlyZWN0b3J5KHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNtZF9saW5lKSB7CisgICAgaW50IGVycl9jb2RlID0gLTE7CisgICAgY2hhciBvcmlnX2RpcltNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgb3JpZ19kaXJbMF0gPSAnXDAnOworICAgIGlmICgwICE9IEdldEN1cnJlbnREaXJlY3RvcnlBKE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgb3JpZ19kaXIpICYmCisgICAgICAgIFRSVUUgPT0gU2V0Q3VycmVudERpcmVjdG9yeUEocGF0aC5jX3N0cigpKSkgeworICAgICAgICBpZiAoVFJVRSA9PSBQYXRoRmlsZUV4aXN0cyh0ZXN0LmNfc3RyKCkpKSB7CisgICAgICAgICAgICBlcnJfY29kZSA9IHN5c3RlbShjbWRfbGluZS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVycl9jb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBTZXRDdXJyZW50RGlyZWN0b3J5QShvcmlnX2Rpcik7CisgICAgfQorICAgIHJldHVybiBlcnJfY29kZTsKK30KKworLy8gUHJpbnQgb3V0IGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzeXN0ZW0gdGhhdCB3ZSBjYW4KKy8vIGNhcHR1cmUgdG8gZWFzZSBpbiBkZWJ1Z2dpbmcvaW52ZXN0aWdhdGlvbiBhdCBhIGxhdGVyIHRpbWUuCit2b2lkIFByaW50U3lzdGVtSW5mbyh2b2lkKSB7CisgICAgT1NWRVJTSU9OSU5GT0VYIG9zX2luZm87CisgICAgU1lTVEVNX0lORk8gc3lzX2luZm87CisgICAgTUVNT1JZU1RBVFVTRVggbWVtX3N0YXQ7CisgICAgRFdPUkQgc2VyX3ZlciA9IDA7CisgICAgRFdPUkQgc2VjdF9wZXJfY2x1c3RlciA9IDA7CisgICAgRFdPUkQgYnl0ZXNfcGVyX3NlY3QgPSAwOworICAgIERXT1JEIG51bV9mcmVlX2NsdXN0ZXIgPSAwOworICAgIERXT1JEIHRvdGFsX251bV9jbHVzdGVyID0gMDsKKyAgICBjaGFyIHN5c3RlbV9yb290X2RpcltNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciBnZW5lcmljX3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciBvdXRwdXRfc3RyaW5nW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIG9zX3NpemVbMzJdOworICAgIHN0ZDo6c3RyaW5nIGN1cl9kaXJlY3Rvcnk7CisgICAgc3RkOjpzdHJpbmcgZXhlX2RpcmVjdG9yeTsKKworICAgIC8vIERldGVybWluZSBpZiB0aGlzIDMyLWJpdCBwcm9jZXNzIGlzIG9uIFdpbjY0LgorICAgIElzV293NjQoKTsKKworI2lmIF9XSU42NAorICAgIHN0cm5jcHkob3Nfc2l6ZSwgIiA2NC1iaXQiLCAzMSk7CisjZWxzZQorICAgIHN0cm5jcHkob3Nfc2l6ZSwgIiAzMi1iaXQiLCAzMSk7CisjZW5kaWYKKworICAgIEJlZ2luU2VjdGlvbigiU3lzdGVtIEluZm8iKTsKKworICAgIC8vIEVudmlyb25tZW50IHNlY3Rpb24gaGFzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBPUyBhbmQgdGhlCisgICAgLy8gZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgIFByaW50QmVnaW5UYWJsZSgiRW52aXJvbm1lbnQiLCAzKTsKKworICAgIFplcm9NZW1vcnkoJnN5c19pbmZvLCBzaXplb2YoU1lTVEVNX0lORk8pKTsKKyAgICBHZXRTeXN0ZW1JbmZvKCZzeXNfaW5mbyk7CisKKyAgICBaZXJvTWVtb3J5KCZvc19pbmZvLCBzaXplb2YoT1NWRVJTSU9OSU5GT0VYKSk7CisgICAgb3NfaW5mby5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk9FWCk7CisKKyAgICBaZXJvTWVtb3J5KCZtZW1fc3RhdCwgc2l6ZW9mKE1FTU9SWVNUQVRVU0VYKSk7CisgICAgbWVtX3N0YXQuZHdMZW5ndGggPSBzaXplb2YoTUVNT1JZU1RBVFVTRVgpOworCisgICAgLy8gU2luY2UgdGhpcyBpcyBXaW5kb3dzICNpZmRlZiBjb2RlLCBkZXRlcm1pbmUgdGhlIHZlcnNpb24gb2YgV2luZG93cworICAgIC8vIHRoYXQgdGhlIGFwcGxjaWF0aW9uIGlzIHJ1bm5pbmcgb24uICBJdCdzIG5vdCB0cml2aWFsIGFuZCBoYXMgdG8KKyAgICAvLyByZWZlciB0byBpdGVtcyBxdWVyaWVkIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFzIHdlbGwgYXMgdGhlCisgICAgLy8gV2luZG93cyByZWdpc3RyeS4KKyAgICBpZiAoVFJVRSA9PSBHZXRWZXJzaW9uRXgoKExQT1NWRVJTSU9OSU5GTykoJm9zX2luZm8pKSkgeworICAgICAgICBzd2l0Y2ggKG9zX2luZm8uZHdNYWpvclZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIGlmIChvc19pbmZvLndQcm9kdWN0VHlwZSA9PSBWRVJfTlRfV09SS1NUQVRJT04pIHsKKyAgICAgICAgICAgICAgICBpZiAoUmVhZFJlZ0tleVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzIE5UXFxDdXJyZW50VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZHVjdE5hbWUiLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsIGdlbmVyaWNfc3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIldpbmRvd3MiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChvc19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93cyBOVFxcQ3VycmVudFZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDdXJyZW50QnVpbGQiLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkJ1aWxkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChvdXRwdXRfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kbyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3MgTlRcXEN1cnJlbnRWZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1aWxkQnJhbmNoIiwgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiQnJhbmNoIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3V0cHV0X3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIDEwIChvciBuZXdlcikiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3Nfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIldpbmRvd3MgU2VydmVyIDIwMTYgKG9yIG5ld2VyKSIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG9zX3NpemUpOworICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBzd2l0Y2ggKG9zX2luZm8uZHdNaW5vclZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiAob3NfaW5mby53UHJvZHVjdFR5cGUgPT0gVkVSX05UX1dPUktTVEFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93cyBOVFxcQ3VycmVudFZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWN0TmFtZSIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljX3N0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIldpbmRvd3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG9zX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFJlZ0tleVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndzIE5UXFxDdXJyZW50VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDdXJyZW50QnVpbGQiLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9zdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJCdWlsZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndzIE5UXFxDdXJyZW50VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1aWxkQnJhbmNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkJyYW5jaCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChvdXRwdXRfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyBTZXJ2ZXIgMjAxMiBSMiAob3IgbmV3ZXIpIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG9zX3NpemUpOworICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChvc19pbmZvLndQcm9kdWN0VHlwZSA9PSBWRVJfTlRfV09SS1NUQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRSZWdLZXlTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzIE5UXFxDdXJyZW50VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2R1Y3ROYW1lIiwgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNfc3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3Nfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kbyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3MgTlRcXEN1cnJlbnRWZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN1cnJlbnRCdWlsZCIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkJ1aWxkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3V0cHV0X3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndzIE5UXFxDdXJyZW50VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1aWxkQnJhbmNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkJyYW5jaCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChvdXRwdXRfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyBTZXJ2ZXIgMjAxMiAob3IgbmV3ZXIpIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG9zX3NpemUpOworICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChvc19pbmZvLndQcm9kdWN0VHlwZSA9PSBWRVJfTlRfV09SS1NUQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIDcgKG9yIG5ld2VyKSIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChvc19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyBTZXJ2ZXIgMjAwOCBSMiAob3IgbmV3ZXIpIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG9zX3NpemUpOworICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAob3NfaW5mby53UHJvZHVjdFR5cGUgPT0gVkVSX05UX1dPUktTVEFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyBWaXN0YSAob3IgbmV3ZXIpIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG9zX3NpemUpOworICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIFNlcnZlciAyMDA4IChvciBuZXdlcikiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3Nfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgc2VyX3ZlciA9IEdldFN5c3RlbU1ldHJpY3MoU01fU0VSVkVSUjIpOworICAgICAgICAgICAgc3dpdGNoIChvc19pbmZvLmR3TWlub3JWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKChvc19pbmZvLndQcm9kdWN0VHlwZSA9PSBWRVJfTlRfV09SS1NUQVRJT04pICYmCisgICAgICAgICAgICAgICAgICAgIChzeXNfaW5mby53UHJvY2Vzc29yQXJjaGl0ZWN0dXJlID09CisgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTT1JfQVJDSElURUNUVVJFX0FNRDY0KSkgeworICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KGdlbmVyaWNfc3RyaW5nLCAiV2luZG93cyBYUCBQcm9mZXNzaW9uYWwgeDY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3NfaW5mby53U3VpdGVNYXNrICYgVkVSX1NVSVRFX1dIX1NFUlZFUikgeworICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KGdlbmVyaWNfc3RyaW5nLCAiV2luZG93cyBIb21lIFNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcl92ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KGdlbmVyaWNfc3RyaW5nLCAiV2luZG93cyBTZXJ2ZXIgMjAwMyBSMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KGdlbmVyaWNfc3RyaW5nLCAiV2luZG93cyBTZXJ2ZXIgMjAwMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIldpbmRvd3MiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3Nfc2l6ZSk7CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaW5kb3dzIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIldpbmRvd3MgWFAiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChvc19zaXplKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIldpbmRvd3MiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyAyMDAwIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3Nfc2l6ZSk7CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJVbmtub3duIFdpbmRvd3MgT1MiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChvc19zaXplKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiV2luZG93cyIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRXJyb3IgcmV0cmlldmluZyBXaW5kb3dzIFZlcnNpb24iKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIHRocm93KC0xKTsKKyAgICB9CisKKyAgICBpZiAoMCAhPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQSgiU1lTVEVNUk9PVCIsIHN5c3RlbV9yb290X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpKSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJTeXN0ZW0gUm9vdCIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChzeXN0ZW1fcm9vdF9kaXIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorICAgIGlmICgwICE9IEdldEVudmlyb25tZW50VmFyaWFibGVBKCJQUk9HUkFNREFUQSIsIGdlbmVyaWNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSkpIHsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlByb2dyYW0gRGF0YSIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9CisgICAgaWYgKDAgIT0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoIlBST0dSQU1GSUxFUyIsIGdlbmVyaWNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSkpIHsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlByb2dyYW0gRmlsZXMiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorICAgIGlmICgwICE9IEdldEVudmlyb25tZW50VmFyaWFibGVBKCJQUk9HUkFNRklMRVMoWDg2KSIsIGdlbmVyaWNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSkpIHsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlByb2dyYW0gRmlsZXMgKHg4NikiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorICAgIGlmICgwICE9IEdldEVudmlyb25tZW50VmFyaWFibGVBKCJURU1QIiwgZ2VuZXJpY19zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKSkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVEVNUCIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9CisgICAgaWYgKDAgIT0KKyAgICAgICAgR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoIlRNUCIsIGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpKSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJUTVAiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgLy8gT3V0cHV0IHdoYXRldmVyIGdlbmVyaWMgaGFyZHdhcmUgaW5mb3JtYXRpb24gd2UgY2FuIGZpbmQgb3V0IGFib3V0IHRoZQorICAgIC8vIHN5c3RlbS4gIEluY2x1ZGluZyBob3cgbXVjaCBtZW1vcnkgYW5kIGRpc2sgc3BhY2UgaXMgYXZhaWxhYmxlLgorICAgIFByaW50QmVnaW5UYWJsZSgiSGFyZHdhcmUiLCAzKTsKKworICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIldSIsCisgICAgICAgICAgICAgc3lzX2luZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnMpOworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJDUFVzIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk51bWJlciBvZiBMb2dpY2FsIENvcmVzIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIHN3aXRjaCAoc3lzX2luZm8ud1Byb2Nlc3NvckFyY2hpdGVjdHVyZSkgeworICAgIGNhc2UgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRV9BTUQ2NDoKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlR5cGUiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIng4Nl82NCIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRV9BUk06CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJUeXBlIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJBUk0iKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBST0NFU1NPUl9BUkNISVRFQ1RVUkVfSUE2NDoKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlR5cGUiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIklBNjQiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBST0NFU1NPUl9BUkNISVRFQ1RVUkVfSU5URUw6CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJUeXBlIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJ4ODYiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVHlwZSIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVW5rbm93biIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChUUlVFID09IEdsb2JhbE1lbW9yeVN0YXR1c0V4KCZtZW1fc3RhdCkpIHsKKyAgICAgICAgaWYgKChtZW1fc3RhdC51bGxUb3RhbFBoeXMgPj4gNDApID4gMHgwVUxMKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgVEIiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1lbV9zdGF0LnVsbFRvdGFsUGh5cyA+PiA0MCkpOworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTWVtb3J5Iik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiUGh5c2ljYWwiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfSBlbHNlIGlmICgobWVtX3N0YXQudWxsVG90YWxQaHlzID4+IDMwKSA+IDB4MFVMTCkgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IEdCIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihtZW1fc3RhdC51bGxUb3RhbFBoeXMgPj4gMzApKTsKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1lbW9yeSIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlBoeXNpY2FsIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIH0gZWxzZSBpZiAoKG1lbV9zdGF0LnVsbFRvdGFsUGh5cyA+PiAyMCkgPiAweDBVTEwpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIldSBNQiIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obWVtX3N0YXQudWxsVG90YWxQaHlzID4+IDIwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNZW1vcnkiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJQaHlzaWNhbCIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9IGVsc2UgaWYgKChtZW1fc3RhdC51bGxUb3RhbFBoeXMgPj4gMTApID4gMHgwVUxMKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgS0IiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1lbV9zdGF0LnVsbFRvdGFsUGh5cyA+PiAxMCkpOworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTWVtb3J5Iik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiUGh5c2ljYWwiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIldSBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obWVtX3N0YXQudWxsVG90YWxQaHlzKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNZW1vcnkiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJQaHlzaWNhbCIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKFRSVUUgPT0gR2V0RGlza0ZyZWVTcGFjZUEoTlVMTCwgJnNlY3RfcGVyX2NsdXN0ZXIsICZieXRlc19wZXJfc2VjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2ZyZWVfY2x1c3RlciwgJnRvdGFsX251bV9jbHVzdGVyKSkgeworICAgICAgICB1aW50NjRfdCBieXRlc19mcmVlID0gKHVpbnQ2NF90KWJ5dGVzX3Blcl9zZWN0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClzZWN0X3Blcl9jbHVzdGVyICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCludW1fZnJlZV9jbHVzdGVyOworICAgICAgICB1aW50NjRfdCBieXRlc190b3RhbCA9ICh1aW50NjRfdClieXRlc19wZXJfc2VjdCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KXNlY3RfcGVyX2NsdXN0ZXIgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCl0b3RhbF9udW1fY2x1c3RlcjsKKyAgICAgICAgZG91YmxlIHBlcmNfZnJlZSA9IChkb3VibGUpYnl0ZXNfZnJlZSAvIChkb3VibGUpYnl0ZXNfdG90YWw7CisgICAgICAgIGlmICgoYnl0ZXNfdG90YWwgPj4gNDApID4gMHgwVUxMKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgVEIiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ5dGVzX3RvdGFsID4+IDQwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEaXNrIFNwYWNlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVG90YWwiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfSBlbHNlIGlmICgoYnl0ZXNfdG90YWwgPj4gMzApID4gMHgwVUxMKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgR0IiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ5dGVzX3RvdGFsID4+IDMwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEaXNrIFNwYWNlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVG90YWwiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfSBlbHNlIGlmICgoYnl0ZXNfdG90YWwgPj4gMjApID4gMHgwVUxMKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgTUIiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ5dGVzX3RvdGFsID4+IDIwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEaXNrIFNwYWNlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVG90YWwiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfSBlbHNlIGlmICgoYnl0ZXNfdG90YWwgPj4gMTApID4gMHgwVUxMKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgS0IiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ5dGVzX3RvdGFsID4+IDEwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEaXNrIFNwYWNlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVG90YWwiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihvdXRwdXRfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlNC4yZiUlIiwKKyAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGZsb2F0PihwZXJjX2ZyZWUpICogMTAwLmYpKTsKKyAgICAgICAgaWYgKChieXRlc19mcmVlID4+IDQwKSA+IDB4MFVMTCkgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IFRCIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihieXRlc19mcmVlID4+IDQwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIFBlcmMiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9IGVsc2UgaWYgKChieXRlc19mcmVlID4+IDMwKSA+IDB4MFVMTCkgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IEdCIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihieXRlc19mcmVlID4+IDMwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIFBlcmMiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9IGVsc2UgaWYgKChieXRlc19mcmVlID4+IDIwKSA+IDB4MFVMTCkgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IE1CIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihieXRlc19mcmVlID4+IDIwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIFBlcmMiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9IGVsc2UgaWYgKChieXRlc19mcmVlID4+IDEwKSA+IDB4MFVMTCkgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IEtCIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihieXRlc19mcmVlID4+IDEwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIFBlcmMiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgLy8gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhlY3V0YWJsZS4KKyAgICBQcmludEJlZ2luVGFibGUoIkV4ZWN1dGFibGUiLCAyKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJFeGUgRGlyZWN0b3J5Iik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2xvYmFsX2l0ZW1zLmV4ZV9kaXJlY3RvcnkpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIGlmICgwICE9IEdldEN1cnJlbnREaXJlY3RvcnlBKE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgZ2VuZXJpY19zdHJpbmcpKSB7CisgICAgICAgIGN1cl9kaXJlY3RvcnkgPSBnZW5lcmljX3N0cmluZzsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJDdXJyZW50IERpcmVjdG9yeSIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdXJfZGlyZWN0b3J5ID0gIiI7CisgICAgfQorCisgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlZ1bGthbiBBUEkgVmVyc2lvbiIpOworICAgIHVpbnQzMl90IG1ham9yID0gVktfVkVSU0lPTl9NQUpPUihWS19BUElfVkVSU0lPTl8xXzApOworICAgIHVpbnQzMl90IG1pbm9yID0gVktfVkVSU0lPTl9NSU5PUihWS19BUElfVkVSU0lPTl8xXzApOworICAgIHVpbnQzMl90IHBhdGNoID0gVktfVkVSU0lPTl9QQVRDSChWS19IRUFERVJfVkVSU0lPTik7CisgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVkLiVkLiVkIiwgbWFqb3IsIG1pbm9yLAorICAgICAgICAgICAgIHBhdGNoKTsKKyAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkJ5dGUgRm9ybWF0Iik7CisjaWYgX1dJTjY0IHx8IF9feDg2XzY0X18gfHwgX19wcGM2NF9fCisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIjY0LWJpdCIpOworI2Vsc2UKKyAgICBQcmludFRhYmxlRWxlbWVudCgiMzItYml0Iik7CisjZW5kaWYKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICBQcmludEVuZFRhYmxlKCk7CisKKyAgICAvLyBOb3cgcHJpbnQgb3V0IHRoZSByZW1haW5pbmcgc3lzdGVtIGluZm8uCisgICAgUHJpbnREcml2ZXJJbmZvKCk7CisgICAgUHJpbnRSdW5UaW1lSW5mbygpOworICAgIFByaW50U0RLSW5mbygpOworICAgIFByaW50TGF5ZXJJbmZvKCk7CisgICAgUHJpbnRMYXllclNldHRpbmdzRmlsZUluZm8oKTsKKyAgICBFbmRTZWN0aW9uKCk7Cit9CisKKy8vIERldGVybWluZSB3aGF0IHZlcnNpb24gYW4gZXhlY3V0YWJsZSBvciBsaWJyYXJ5IGZpbGUgaXMuCitib29sIEdldEZpbGVWZXJzaW9uKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCB1aW50MzJfdCBtYXhfbGVuLAorICAgICAgICAgICAgICAgICAgICBjaGFyICp2ZXJzaW9uX3N0cmluZykgeworICAgIERXT1JEIHZlcl9oYW5kbGU7CisgICAgVUlOVCBzaXplID0gMDsKKyAgICBMUEJZVEUgYnVmZmVyID0gTlVMTDsKKyAgICBEV09SRCB2ZXJfc2l6ZSA9IEdldEZpbGVWZXJzaW9uSW5mb1NpemUoZmlsZW5hbWUsICZ2ZXJfaGFuZGxlKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIGlmICh2ZXJfc2l6ZSA+IDApIHsKKyAgICAgICAgTFBTVFIgdmVyX2RhdGEgPSAoTFBTVFIpbWFsbG9jKHNpemVvZihjaGFyKSAqIHZlcl9zaXplKTsKKworICAgICAgICBpZiAoR2V0RmlsZVZlcnNpb25JbmZvKGZpbGVuYW1lLCB2ZXJfaGFuZGxlLCB2ZXJfc2l6ZSwgdmVyX2RhdGEpKSB7CisgICAgICAgICAgICBpZiAoVmVyUXVlcnlWYWx1ZSh2ZXJfZGF0YSwgIlxcIiwgKFZPSUQgRkFSICogRkFSICopJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkgeworICAgICAgICAgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIFZTX0ZJWEVERklMRUlORk8gKnZlcl9pbmZvID0gKFZTX0ZJWEVERklMRUlORk8gKilidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJfaW5mby0+ZHdTaWduYXR1cmUgPT0gMHhmZWVmMDRiZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbWF4X3NpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcl9zaXplID4gbWF4X2xlbiA/IG1heF9sZW4gOiB2ZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHZlcnNpb25fc3RyaW5nLCBtYXhfbGVuLCAiJWQuJWQuJWQuJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcl9pbmZvLT5kd0ZpbGVWZXJzaW9uTVMgPj4gMTYpICYgMHhmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcl9pbmZvLT5kd0ZpbGVWZXJzaW9uTVMgPj4gMCkgJiAweGZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyX2luZm8tPmR3RmlsZVZlcnNpb25MUyA+PiAxNikgJiAweGZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyX2luZm8tPmR3RmlsZVZlcnNpb25MUyA+PiAwKSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmVlKHZlcl9kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworLy8gUHJpbnQgb3V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgZXZlcnkgZHJpdmVyIGluIHRoZSBhcHByb3ByaWF0ZQorLy8gV2luZG93cyByZWdpc3RyeSBsb2NhdGlvbiBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgSlNPTiBmaWxlLgordm9pZCBQcmludERyaXZlckluZm8odm9pZCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgY29uc3QgY2hhciB2dWxrYW5fcmVnX2Jhc2VbXSA9ICJTT0ZUV0FSRVxcS2hyb25vc1xcVnVsa2FuIjsKKyAgICBjb25zdCBjaGFyIHZ1bGthbl9yZWdfYmFzZV93b3c2NFtdID0KKyAgICAgICAgIlNPRlRXQVJFXFxXT1c2NDMyTm9kZVxcS2hyb25vc1xcVnVsa2FuIjsKKyAgICBjaGFyIHJlZ19rZXlfbG9jW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIGN1cl92dWxrYW5fZHJpdmVyX2pzb25bTUFYX1NUUklOR19MRU5HVEhdOworICAgIGNoYXIgZ2VuZXJpY19zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGNoYXIgZnVsbF9kcml2ZXJfcGF0aFtNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciBzeXN0ZW1fcGF0aFtNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciBjb3VudF9zdHJbNjRdOworICAgIHVpbnQzMl90IGkgPSAwOworICAgIHVpbnQzMl90IGogPSAwOworICAgIHN0ZDo6aWZzdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgYm9vbCBmb3VuZF9yZWdpc3RyeSA9IGZhbHNlOworICAgIGJvb2wgZm91bmRfanNvbiA9IGZhbHNlOworICAgIGJvb2wgZm91bmRfbGliID0gZmFsc2U7CisKKyAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQSgiU1lTVEVNUk9PVCIsIGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCk7CisjaWYgX1dJTjY0IHx8IF9feDg2XzY0X18gfHwgX19wcGM2NF9fCisgICAgc25wcmludGYoc3lzdGVtX3BhdGgsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVzXFxzeXN0ZW0zMlxcIiwKKyAgICAgICAgZ2VuZXJpY19zdHJpbmcpOworICAgIHNucHJpbnRmKHJlZ19rZXlfbG9jLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlc1xcRHJpdmVycyIsCisgICAgICAgICAgICAgdnVsa2FuX3JlZ19iYXNlKTsKKyNlbHNlCisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc193b3c2NCkgeworICAgICAgICBzbnByaW50ZihzeXN0ZW1fcGF0aCwgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXNcXHN5c1dPVzY0XFwiLAorICAgICAgICAgICAgZ2VuZXJpY19zdHJpbmcpOworICAgICAgICBzbnByaW50ZihyZWdfa2V5X2xvYywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXNcXERyaXZlcnMiLAorICAgICAgICAgICAgICAgICB2dWxrYW5fcmVnX2Jhc2Vfd293NjQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKHN5c3RlbV9wYXRoLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlc1xcc3lzdGVtMzJcXCIsCisgICAgICAgICAgICBnZW5lcmljX3N0cmluZyk7CisgICAgICAgIHNucHJpbnRmKHJlZ19rZXlfbG9jLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlc1xcRHJpdmVycyIsCisgICAgICAgICAgICAgICAgIHZ1bGthbl9yZWdfYmFzZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBQcmludEJlZ2luVGFibGUoIlZ1bGthbiBEcml2ZXIgSW5mbyIsIDMpOworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJSZWdpc3RyeSBMb2NhdGlvbiIpOworICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgLy8gRmluZCB0aGUgcmVnaXN0cnkgc2V0dGluZ3MgaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGRyaXZlcgorICAgIC8vIEpTT04gZmlsZXMuCisgICAgdWludDMyX3QgcmV0dXJuZWRfdmFsdWUgPSAwOworICAgIHdoaWxlIChGaW5kTmV4dFJlZ1ZhbHVlKEhLRVlfTE9DQUxfTUFDSElORSwgcmVnX2tleV9sb2MsICIiLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgY3VyX3Z1bGthbl9kcml2ZXJfanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuZWRfdmFsdWUpKSB7CisKKyAgICAgICAgZm91bmRfcmVnaXN0cnkgPSB0cnVlOworCisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJEcml2ZXIgJWQiLCBpKyspOworCisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZywgQUxJR05fUklHSFQpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChjdXJfdnVsa2FuX2RyaXZlcl9qc29uKTsKKworICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgcmV0dXJuZWRfdmFsdWUpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAvLyBQYXJzZSB0aGUgZHJpdmVyIEpTT04gZmlsZS4KKyAgICAgICAgc3RkOjppZnN0cmVhbSAqc3RyZWFtID0gTlVMTDsKKyAgICAgICAgc3RyZWFtID0gbmV3IHN0ZDo6aWZzdHJlYW0oY3VyX3Z1bGthbl9kcml2ZXJfanNvbiwgc3RkOjppZnN0cmVhbTo6aW4pOworICAgICAgICBpZiAobnVsbHB0ciA9PSBzdHJlYW0gfHwgc3RyZWFtLT5mYWlsKCkpIHsKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkVycm9yIHJlYWRpbmcgSlNPTiBmaWxlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChjdXJfdnVsa2FuX2RyaXZlcl9qc29uKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSnNvbjo6VmFsdWUgcm9vdCA9IEpzb246Om51bGxWYWx1ZTsKKyAgICAgICAgICAgIEpzb246OlJlYWRlciByZWFkZXI7CisgICAgICAgICAgICBpZiAoIXJlYWRlci5wYXJzZSgqc3RyZWFtLCByb290LCBmYWxzZSkgfHwgcm9vdC5pc051bGwoKSkgeworICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRXJyb3IgcmVhZGluZyBKU09OIGZpbGUiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChyZWFkZXIuZ2V0Rm9ybWF0dGVkRXJyb3JNZXNzYWdlcygpKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgc3RyZWFtOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkpTT04gRmlsZSBWZXJzaW9uIik7CisgICAgICAgICAgICAgICAgaWYgKCFyb290WyJmaWxlX2Zvcm1hdF92ZXJzaW9uIl0uaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQocm9vdFsiZmlsZV9mb3JtYXRfdmVyc2lvbiJdLmFzU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNSVNTSU5HISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXJvb3RbIklDRCJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2pzb24gPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJBUEkgVmVyc2lvbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJvb3RbIklDRCJdWyJhcGlfdmVyc2lvbiJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290WyJJQ0QiXVsiYXBpX3ZlcnNpb24iXS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNSVNTSU5HISIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTGlicmFyeSBQYXRoIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcm9vdFsiSUNEIl1bImxpYnJhcnlfcGF0aCJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkcml2ZXJfbmFtZSA9IHJvb3RbIklDRCJdWyJsaWJyYXJ5X3BhdGgiXS5hc1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3lzdGVtX25hbWUgPSBzeXN0ZW1fcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9uYW1lICs9ICJcXCI7CisgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbmFtZSArPSBkcml2ZXJfbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGRyaXZlcl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdlbmVyYXRlTGlicmFyeVBhdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl92dWxrYW5fZHJpdmVyX2pzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcl9uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgZnVsbF9kcml2ZXJfcGF0aCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChHZXRGaWxlVmVyc2lvbihmdWxsX2RyaXZlcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNfc3RyaW5nKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJMaWJyYXJ5IEZpbGUgVmVyc2lvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9saWIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoR2V0RmlsZVZlcnNpb24oc3lzdGVtX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljX3N0cmluZykpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTGlicmFyeSBGaWxlIFZlcnNpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGliID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgZHJpdmVyICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvciAlc3JlZmVyZW5jZWQgYnkgSlNPTiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RbIklDRCJdWyJsaWJyYXJ5X3BhdGgiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX2RyaXZlcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdnVsa2FuX2RyaXZlcl9qc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmaW5kIGRyaXZlciAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZWQgYnkgSlNPTiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9kcml2ZXJfcGF0aCwgY3VyX3Z1bGthbl9kcml2ZXJfanNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1JU1NJTkchIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgSnNvbjo6VmFsdWUgZGV2X2V4dHMgPSByb290WyJJQ0QiXVsiZGV2aWNlX2V4dGVuc2lvbnMiXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZfZXh0cy5pc051bGwoKSAmJiBkZXZfZXh0cy5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGNvdW50X3N0ciwgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2V4dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRldmljZSBFeHRlbnNpb25zIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChjb3VudF9zdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEpzb246OlZhbHVlSXRlcmF0b3IgZGV2X2V4dF9pdCA9IGRldl9leHRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9leHRfaXQgIT0gZGV2X2V4dHMuZW5kKCk7IGRldl9leHRfaXQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIGRldl9leHQgPSAoKmRldl9leHRfaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIGRldl9leHRfbmFtZSA9IGRldl9leHRbIm5hbWUiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRldl9leHRfbmFtZS5pc051bGwoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVkXSIsIGopOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGRldl9leHRfbmFtZS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBKc29uOjpWYWx1ZSBpbnN0X2V4dHMgPSByb290WyJJQ0QiXVsiaW5zdGFuY2VfZXh0ZW5zaW9ucyJdOworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0X2V4dHMuaXNOdWxsKCkgJiYgaW5zdF9leHRzLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoY291bnRfc3RyLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0X2V4dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkluc3RhbmNlIEV4dGVuc2lvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGNvdW50X3N0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSnNvbjo6VmFsdWVJdGVyYXRvciBpbnN0X2V4dF9pdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0X2V4dHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9leHRfaXQgIT0gaW5zdF9leHRzLmVuZCgpOyBpbnN0X2V4dF9pdCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnNvbjo6VmFsdWUgaW5zdF9leHQgPSAoKmluc3RfZXh0X2l0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uOjpWYWx1ZSBpbnN0X2V4dF9uYW1lID0gaW5zdF9leHRbIm5hbWUiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RfZXh0X25hbWUuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlslZF0iLCBqKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZywgQUxJR05fUklHSFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChpbnN0X2V4dF9uYW1lLmFzU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIklDRCBTZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNSVNTSU5HISIpOworICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJlYW0tPmNsb3NlKCk7CisgICAgICAgICAgICBkZWxldGUgc3RyZWFtOworICAgICAgICAgICAgc3RyZWFtID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kX3JlZ2lzdHJ5IHx8ICFmb3VuZF9qc29uIHx8ICFmb3VuZF9saWIpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBQcmludEVuZFRhYmxlKCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIGlmICghZm91bmRfcmVnaXN0cnkpIHsKKyAgICAgICAgICAgIHRocm93IE1JU1NJTkdfRFJJVkVSX1JFR0lTVFJZOworICAgICAgICB9IGVsc2UgaWYgKCFmb3VuZF9qc29uKSB7CisgICAgICAgICAgICB0aHJvdyBNSVNTSU5HX0RSSVZFUl9KU09OOworICAgICAgICB9IGVsc2UgaWYgKCFmb3VuZF9saWIpIHsKKyAgICAgICAgICAgIHRocm93IE1JU1NJTkdfRFJJVkVSX0xJQjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93KC0xKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUHJpbnQgb3V0IHdoYXRldmVyIFZ1bGthbiBydW50aW1lIGluZm9ybWF0aW9uIHdlIGNhbiBnYXRoZXIgZnJvbSB0aGUgc3lzdGVtCisvLyB2aWEgcmVnaXN0cnksIHN0YW5kYXJkIHN5c3RlbSBwYXRocywgZXRjLgordm9pZCBQcmludFJ1blRpbWVJbmZvKHZvaWQpIHsKKyAgICBjaGFyIGdlbmVyaWNfc3RyaW5nW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIGNvdW50X3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciB2ZXJzaW9uX3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciBvdXRwdXRfc3RyaW5nW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIGRsbF9zZWFyY2hbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGNoYXIgZGxsX3ByZWZpeFtNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgdWludDMyX3QgaW5zdGFsbF9jb3VudCA9IDA7CisgICAgRklMRSAqZnAgPSBOVUxMOworCisgICAgUHJpbnRCZWdpblRhYmxlKCJWdWxrYW4gUnVudGltZXMiLCAzKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJSdW50aW1lcyBJbiBSZWdpc3RyeSIpOworICAgIFByaW50VGFibGVFbGVtZW50KGdfdW5pbnN0YWxsX3JlZ19wYXRoKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgLy8gRmluZCBhbGwgVnVsa2FuIFJ1bnRpbWUga2V5cyBpbiB0aGUgcmVnaXN0cnksIGFuZCBsb29wIHRocm91Z2ggZWFjaC4KKyAgICB3aGlsZSAoRmluZE5leHRSZWdLZXkoSEtFWV9MT0NBTF9NQUNISU5FLCBnX3VuaW5zdGFsbF9yZWdfcGF0aCwgIlZ1bGthblJUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgTUFYX1NUUklOR19MRU5HVEggLSAxLCBvdXRwdXRfc3RyaW5nKSkgeworICAgICAgICBzbnByaW50Zihjb3VudF9zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlslZF0iLCBpKyspOworCisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlc1xcJXMiLAorICAgICAgICAgICAgICAgICBnX3VuaW5zdGFsbF9yZWdfcGF0aCwgb3V0cHV0X3N0cmluZyk7CisKKyAgICAgICAgLy8gR2V0IHRoZSB2ZXJzaW9uIGZyb20gdGhlIHJlZ2lzdHJ5CisgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKEhLRVlfTE9DQUxfTUFDSElORSwgZ2VuZXJpY19zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNwbGF5VmVyc2lvbiIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9zdHJpbmcpKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJuY3B5KHZlcnNpb25fc3RyaW5nLCBvdXRwdXRfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSBpbnN0YWxsIGNvdW50IGZvciB0aGlzIHJ1bnRpbWUgZnJvbSB0aGUgcmVnaXN0cnkKKyAgICAgICAgaWYgKFJlYWRSZWdLZXlEd29yZChIS0VZX0xPQ0FMX01BQ0hJTkUsIGdlbmVyaWNfc3RyaW5nLCAiSW5zdGFsbENvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdGFsbF9jb3VudCkpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKG91dHB1dF9zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICIlcyAgW0luc3RhbGwgQ291bnQgPSAlZF0iLCB2ZXJzaW9uX3N0cmluZywgaW5zdGFsbF9jb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihvdXRwdXRfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlcyIsCisgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX3N0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY291bnRfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoIlNZU1RFTVJPT1QiLCBnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEgpOworI2lmIF9XSU42NCB8fCBfX3g4Nl82NF9fIHx8IF9fcHBjNjRfXworICAgIHNucHJpbnRmKGRsbF9wcmVmaXgsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVzXFxzeXN0ZW0zMlxcIiwKKyAgICAgICAgICAgICBnZW5lcmljX3N0cmluZyk7CisjZWxzZQorICAgIGlmIChnbG9iYWxfaXRlbXMuaXNfd293NjQpIHsKKyAgICAgICAgc25wcmludGYoZGxsX3ByZWZpeCwgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXNcXHN5c1dPVzY0XFwiLAorICAgICAgICAgICAgICAgICBnZW5lcmljX3N0cmluZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoZGxsX3ByZWZpeCwgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXNcXHN5c3RlbTMyXFwiLAorICAgICAgICAgICAgICAgICBnZW5lcmljX3N0cmluZyk7CisgICAgfQorI2VuZGlmCisKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiUnVudGltZXMgaW4gU3lzdGVtIEZvbGRlciIpOworICAgIFByaW50VGFibGVFbGVtZW50KGRsbF9wcmVmaXgpOworICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICBzdHJuY3B5KGRsbF9zZWFyY2gsIGRsbF9wcmVmaXgsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSk7CisgICAgc3RybmNhdChkbGxfc2VhcmNoLCAiVnVsa2FuLSouZGxsIiwgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKworICAgIFdJTjMyX0ZJTkRfREFUQUEgZmZkOworICAgIEhBTkRMRSBoRmluZCA9IEZpbmRGaXJzdEZpbGVBKGRsbF9zZWFyY2gsICZmZmQpOworICAgIGlmIChoRmluZCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoMCA9PSAoZmZkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoY291bnRfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJETEwgJWQiLCBpKyspOworCisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY291bnRfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZmZkLmNGaWxlTmFtZSk7CisKKyAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXNcXCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkbGxfcHJlZml4LCBmZmQuY0ZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoR2V0RmlsZVZlcnNpb24oZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9zdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKG91dHB1dF9zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChGaW5kTmV4dEZpbGVBKGhGaW5kLCAmZmZkKSAhPSAwKTsKKyAgICAgICAgRmluZENsb3NlKGhGaW5kKTsKKyAgICB9CisKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiUnVudGltZSBVc2VkIGJ5IEFwcCIpOworICAgIGlmICghc3lzdGVtKCJ3aGVyZSB2dWxrYW4tMS5kbGwgPiB3aGVyZV92dWxrYW4iKSkgeworICAgICAgICBmcCA9IGZvcGVuKCJ3aGVyZV92dWxrYW4iLCAicnQiKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gZnApIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGZnZXRzKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsIGZwKSkgeworICAgICAgICAgICAgICAgIGludCBpID0gKGludClzdHJsZW4oZ2VuZXJpY19zdHJpbmcpIC0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZ2VuZXJpY19zdHJpbmdbaV0gPT0gJ1xuJyB8fCBnZW5lcmljX3N0cmluZ1tpXSA9PSAnXHInIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNfc3RyaW5nW2ldID09ICdcdCcgfHwgZ2VuZXJpY19zdHJpbmdbaV0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNfc3RyaW5nW2ldID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChHZXRGaWxlVmVyc2lvbihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX3N0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCh2ZXJzaW9uX3N0cmluZyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgfQorICAgICAgICBEZWxldGVGaWxlQSgid2hlcmVfdnVsa2FuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlVua25vd24iKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlVua25vd24iKTsKKyAgICB9CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgUHJpbnRFbmRUYWJsZSgpOworfQorCisvLyBQcmludCBvdXQgaW5mb3JtYXRpb24gb24gd2hhdGV2ZXIgTHVuYXJHIFZ1bGthbiBTREtzIHdlIGNhbiBmaW5kIG9uCisvLyB0aGUgc3lzdGVtIHVzaW5nIHRoZSByZWdpc3RyeSwgYW5kIGVudmlyb25tZW50YWwgdmFyaWFibGVzLiAgVGhpcworLy8gaW5jbHVkZXMgbGlzdGluZyB3aGF0IGxheWVycyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFNESy4KK3ZvaWQgUHJpbnRTREtJbmZvKHZvaWQpIHsKKyAgICBjb25zdCBjaGFyIHZ1bGthbl9yZWdfYmFzZVtdID0gIlNPRlRXQVJFXFxLaHJvbm9zXFxWdWxrYW4iOworICAgIGNvbnN0IGNoYXIgdnVsa2FuX3JlZ19iYXNlX3dvdzY0W10gPQorICAgICAgICAiU09GVFdBUkVcXFdPVzY0MzJOb2RlXFxLaHJvbm9zXFxWdWxrYW4iOworICAgIGNoYXIgZ2VuZXJpY19zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGNoYXIgY291bnRfc3RyaW5nW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIG91dHB1dF9zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGNoYXIgY3VyX3Z1bGthbl9sYXllcl9qc29uW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIHNka19lbnZfZGlyW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIHJlZ19rZXlfbG9jW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICB1aW50MzJfdCBqID0gMDsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICBQcmludEJlZ2luVGFibGUoIkx1bmFyRyBWdWxrYW4gU0RLcyIsIDMpOworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJTREtzIEZvdW5kIEluIFJlZ2lzdHJ5Iik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ191bmluc3RhbGxfcmVnX3BhdGgpOworICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICB3aGlsZSAoRmluZE5leHRSZWdLZXkoSEtFWV9MT0NBTF9NQUNISU5FLCBnX3VuaW5zdGFsbF9yZWdfcGF0aCwgIlZ1bGthblNESyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGksIE1BWF9TVFJJTkdfTEVOR1RILCBvdXRwdXRfc3RyaW5nKSkgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIHNucHJpbnRmKGNvdW50X3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsIGkrKyk7CisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlc1xcJXMiLAorICAgICAgICAgICAgICAgICBnX3VuaW5zdGFsbF9yZWdfcGF0aCwgb3V0cHV0X3N0cmluZyk7CisgICAgICAgIGlmIChSZWFkUmVnS2V5U3RyaW5nKEhLRVlfTE9DQUxfTUFDSElORSwgZ2VuZXJpY19zdHJpbmcsICJJbnN0YWxsRGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEgsIG91dHB1dF9zdHJpbmcpKSB7CisgICAgICAgIH0KKworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChjb3VudF9zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3V0cHV0X3N0cmluZyk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTk9ORSBGT1VORCIsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgaWYgKDAgIT0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoIlZLX1NES19QQVRIIiwgc2RrX2Vudl9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKSkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlZLX1NES19QQVRIIik7CisgICAgICAgIGdsb2JhbF9pdGVtcy5zZGtfZm91bmQgPSB0cnVlOworICAgICAgICBnbG9iYWxfaXRlbXMuc2RrX3BhdGggPSBzZGtfZW52X2RpcjsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoc2RrX2Vudl9kaXIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9IGVsc2UgaWYgKDAgIT0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoIlZVTEtBTl9TREsiLCBzZGtfZW52X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKSkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlZVTEtBTl9TREsiKTsKKyAgICAgICAgZ2xvYmFsX2l0ZW1zLnNka19mb3VuZCA9IHRydWU7CisgICAgICAgIGdsb2JhbF9pdGVtcy5zZGtfcGF0aCA9IHNka19lbnZfZGlyOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChzZGtfZW52X2Rpcik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVktfU0RLX1BBVEgiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk5vIGluc3RhbGxlZCBTREsiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisjaWYgX1dJTjY0IHx8IF9feDg2XzY0X18gfHwgX19wcGM2NF9fCisgICAgc25wcmludGYocmVnX2tleV9sb2MsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVzXFxFeHBsaWNpdExheWVycyIsCisgICAgICAgICAgICAgdnVsa2FuX3JlZ19iYXNlKTsKKyNlbHNlCisgICAgaWYgKGdsb2JhbF9pdGVtcy5pc193b3c2NCkgeworICAgICAgICBzbnByaW50ZihyZWdfa2V5X2xvYywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXNcXEV4cGxpY2l0TGF5ZXJzIiwKKyAgICAgICAgICAgICAgICAgdnVsa2FuX3JlZ19iYXNlX3dvdzY0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihyZWdfa2V5X2xvYywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXNcXEV4cGxpY2l0TGF5ZXJzIiwKKyAgICAgICAgICAgICAgICAgdnVsa2FuX3JlZ19iYXNlKTsKKyAgICB9CisjZW5kaWYKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJTREsgRXhwbGljaXQgTGF5ZXJzIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICBmb3VuZCA9IGZhbHNlOworICAgIGkgPSAwOworICAgIHVpbnQzMl90IHJldHVybmVkX3ZhbHVlID0gMDsKKyAgICB3aGlsZSAoRmluZE5leHRSZWdWYWx1ZShIS0VZX0xPQ0FMX01BQ0hJTkUsIHJlZ19rZXlfbG9jLCAiIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCwgY3VyX3Z1bGthbl9sYXllcl9qc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5lZF92YWx1ZSkpIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworCisgICAgICAgIC8vIENyZWF0ZSBhIHNob3J0IGpzb24gZmlsZSBuYW1lIHNvIHdlIGRvbid0IHVzZSB1cCB0b28gbXVjaCBzcGFjZQorICAgICAgICBzbnByaW50ZihvdXRwdXRfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIuJXMiLAorICAgICAgICAgICAgICAgICAmY3VyX3Z1bGthbl9sYXllcl9qc29uW3N0cmxlbihzZGtfZW52X2RpcildKTsKKworICAgICAgICBzbnByaW50Zihjb3VudF9zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlslZF0iLCBpKyspOworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY291bnRfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KG91dHB1dF9zdHJpbmcpOworCisgICAgICAgIHNucHJpbnRmKG91dHB1dF9zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIjB4JTA4eCIsIHJldHVybmVkX3ZhbHVlKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQob3V0cHV0X3N0cmluZyk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICBzdGQ6Omlmc3RyZWFtICpzdHJlYW0gPSBOVUxMOworICAgICAgICBzdHJlYW0gPSBuZXcgc3RkOjppZnN0cmVhbShjdXJfdnVsa2FuX2xheWVyX2pzb24sIHN0ZDo6aWZzdHJlYW06OmluKTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gc3RyZWFtIHx8IHN0cmVhbS0+ZmFpbCgpKSB7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJFUlJPUiByZWFkaW5nIEpTT04gZmlsZSEiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBKc29uOjpWYWx1ZSByb290ID0gSnNvbjo6bnVsbFZhbHVlOworICAgICAgICAgICAgSnNvbjo6UmVhZGVyIHJlYWRlcjsKKyAgICAgICAgICAgIGlmICghcmVhZGVyLnBhcnNlKCpzdHJlYW0sIHJvb3QsIGZhbHNlKSB8fCByb290LmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVwb3J0IHRvIHRoZSB1c2VyIHRoZSBmYWlsdXJlIGFuZCB0aGVpciBsb2NhdGlvbnMgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJFUlJPUiBwYXJzaW5nIEpTT04gZmlsZSEiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChyZWFkZXIuZ2V0Rm9ybWF0dGVkRXJyb3JNZXNzYWdlcygpKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHJpbnRFeHBsaWNpdExheWVySnNvbkluZm8oY3VyX3Z1bGthbl9sYXllcl9qc29uLCByb290LCAzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyZWFtLT5jbG9zZSgpOworICAgICAgICAgICAgZGVsZXRlIHN0cmVhbTsKKyAgICAgICAgICAgIHN0cmVhbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTk9ORSBGT1VORCIsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICB0aHJvdygtMSk7CisgICAgfQorfQorCisvLyBQcmludCBvdXQgd2hhdGV2ZXIgbGF5ZXJzIHdlIGNhbiBmaW5kIG91dCBmcm9tIHRoZSBXaW5kb3dzJworLy8gcmVnaXN0cnkgYW5kIG90aGVyIGVudmlyb25tZW50YWwgdmFyaWFibGVzIHRoYXQgbWF5IGJlIHVzZWQKKy8vIHRvIHBvaW50IHRoZSBWdWxrYW4gbG9hZGVyIGF0IGEgbGF5ZXIgcGF0aC4KK3ZvaWQgUHJpbnRMYXllckluZm8odm9pZCkgeworICAgIGNvbnN0IGNoYXIgdnVsa2FuX3JlZ19iYXNlW10gPSAiU09GVFdBUkVcXEtocm9ub3NcXFZ1bGthbiI7CisgICAgY29uc3QgY2hhciB2dWxrYW5fcmVnX2Jhc2Vfd293NjRbXSA9CisgICAgICAgICJTT0ZUV0FSRVxcV09XNjQzMk5vZGVcXEtocm9ub3NcXFZ1bGthbiI7CisgICAgY2hhciB2dWxrYW5faW1wbF9sYXllcl9yZWdfa2V5W01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIGN1cl92dWxrYW5fbGF5ZXJfanNvbltNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciBnZW5lcmljX3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgY2hhciBmdWxsX2xheWVyX3BhdGhbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGNoYXIgZW52X3ZhbHVlW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICB1aW50MzJfdCBqID0gMDsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworLy8gRHVtcCBpbXBsaWNpdCBsYXllciBpbmZvcm1hdGlvbiBmaXJzdC4KKyNpZiBfV0lONjQgfHwgX194ODZfNjRfXyB8fCBfX3BwYzY0X18KKyAgICBzbnByaW50Zih2dWxrYW5faW1wbF9sYXllcl9yZWdfa2V5LCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgIiVzXFxJbXBsaWNpdExheWVycyIsIHZ1bGthbl9yZWdfYmFzZSk7CisjZWxzZQorICAgIGlmIChnbG9iYWxfaXRlbXMuaXNfd293NjQpIHsKKyAgICAgICAgc25wcmludGYodnVsa2FuX2ltcGxfbGF5ZXJfcmVnX2tleSwgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAiJXNcXEltcGxpY2l0TGF5ZXJzIiwgdnVsa2FuX3JlZ19iYXNlX3dvdzY0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50Zih2dWxrYW5faW1wbF9sYXllcl9yZWdfa2V5LCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICIlc1xcSW1wbGljaXRMYXllcnMiLCB2dWxrYW5fcmVnX2Jhc2UpOworICAgIH0KKyNlbmRpZgorCisgICAgUHJpbnRCZWdpblRhYmxlKCJJbXBsaWNpdCBMYXllcnMiLCA0KTsKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiUmVnaXN0cnkiKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCh2dWxrYW5faW1wbF9sYXllcl9yZWdfa2V5KTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIC8vIEZvciBlYWNoIGltcGxpY2l0IGxheWVyIGxpc3RlZCBpbiB0aGUgcmVnaXN0cnksIGZpbmQgaXRzIEpTT04gYW5kCisgICAgLy8gcHJpbnQgb3V0IHRoZSB1c2VmdWwgaW5mb3JtYXRpb24gc3RvcmVkIGluIGl0LgorICAgIHVpbnQzMl90IHJldHVybmVkX3ZhbHVlID0gMDsKKyAgICB3aGlsZSAoRmluZE5leHRSZWdWYWx1ZShIS0VZX0xPQ0FMX01BQ0hJTkUsIHZ1bGthbl9pbXBsX2xheWVyX3JlZ19rZXksICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIE1BWF9TVFJJTkdfTEVOR1RILCBjdXJfdnVsa2FuX2xheWVyX2pzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldHVybmVkX3ZhbHVlKSkgeworCisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJbJWRdIiwgaSsrKTsKKworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY3VyX3Z1bGthbl9sYXllcl9qc29uKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiMHglMDh4IiwgcmV0dXJuZWRfdmFsdWUpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICBzdGQ6Omlmc3RyZWFtICpzdHJlYW0gPSBOVUxMOworICAgICAgICBzdHJlYW0gPSBuZXcgc3RkOjppZnN0cmVhbShjdXJfdnVsa2FuX2xheWVyX2pzb24sIHN0ZDo6aWZzdHJlYW06OmluKTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gc3RyZWFtIHx8IHN0cmVhbS0+ZmFpbCgpKSB7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJFUlJPUiByZWFkaW5nIEpTT04gZmlsZSEiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBKc29uOjpWYWx1ZSByb290ID0gSnNvbjo6bnVsbFZhbHVlOworICAgICAgICAgICAgSnNvbjo6UmVhZGVyIHJlYWRlcjsKKyAgICAgICAgICAgIGlmICghcmVhZGVyLnBhcnNlKCpzdHJlYW0sIHJvb3QsIGZhbHNlKSB8fCByb290LmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVwb3J0IHRvIHRoZSB1c2VyIHRoZSBmYWlsdXJlIGFuZCB0aGVpciBsb2NhdGlvbnMgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJFUlJPUiBwYXJzaW5nIEpTT04gZmlsZSEiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChyZWFkZXIuZ2V0Rm9ybWF0dGVkRXJyb3JNZXNzYWdlcygpKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHJpbnRJbXBsaWNpdExheWVySnNvbkluZm8oY3VyX3Z1bGthbl9sYXllcl9qc29uLCByb290KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyZWFtLT5jbG9zZSgpOworICAgICAgICAgICAgZGVsZXRlIHN0cmVhbTsKKyAgICAgICAgICAgIHN0cmVhbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgLy8gSWYgdGhlIHVzZXIncyBzeXN0ZW0gaGFzIFZLX0xBWUVSX1BBVEggc2V0LCBkdW1wIG91dCB0aGUgbGF5ZXIKKyAgICAvLyBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGF0IGZvbGRlci4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgaWYKKyAgICAvLyBhIHVzZXIgaXMgaGF2aW5nIHByb2JsZW1zIHdpdGggdGhlIGxheWVycywgdGhleSBtYXkgYmUgdXNpbmcKKyAgICAvLyBub24tc3RhbmRhcmQgbGF5ZXJzLgorICAgIGlmICgwICE9IEdldEVudmlyb25tZW50VmFyaWFibGVBKCJWS19MQVlFUl9QQVRIIiwgZW52X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSkpIHsKKyAgICAgICAgV0lOMzJfRklORF9EQVRBQSBmZmQ7CisgICAgICAgIEhBTkRMRSBoRmluZDsKKworICAgICAgICBQcmludEJlZ2luVGFibGUoIlZLX0xBWUVSX1BBVEggRXhwbGljaXQgTGF5ZXJzIiwgMyk7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVktfTEFZRVJfUEFUSCIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChlbnZfdmFsdWUpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAvLyBMb29rIGZvciBhbnkgSlNPTiBmaWxlcyBpbiB0aGF0IGZvbGRlci4KKyAgICAgICAgc25wcmludGYoZnVsbF9sYXllcl9wYXRoLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlc1xcKi5qc29uIiwKKyAgICAgICAgICAgICAgICAgZW52X3ZhbHVlKTsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGhGaW5kID0gRmluZEZpcnN0RmlsZUEoZnVsbF9sYXllcl9wYXRoLCAmZmZkKTsKKyAgICAgICAgaWYgKGhGaW5kICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKDAgPT0gKGZmZC5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgeworICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKyk7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGN1cl92dWxrYW5fbGF5ZXJfanNvbiwgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNcXCVzIiwgZW52X3ZhbHVlLCBmZmQuY0ZpbGVOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZmZkLmNGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBzdGQ6Omlmc3RyZWFtKGN1cl92dWxrYW5fbGF5ZXJfanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbTo6aW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbHB0ciA9PSBzdHJlYW0gfHwgc3RyZWFtLT5mYWlsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkVSUk9SIHJlYWRpbmcgSlNPTiBmaWxlISIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIHJvb3QgPSBKc29uOjpudWxsVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBKc29uOjpSZWFkZXIgcmVhZGVyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFkZXIucGFyc2UoKnN0cmVhbSwgcm9vdCwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5pc051bGwoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcG9ydCB0byB0aGUgdXNlciB0aGUgZmFpbHVyZSBhbmQgdGhlaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbnMgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRVJST1IgcGFyc2luZyBKU09OIGZpbGUhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRGb3JtYXR0ZWRFcnJvck1lc3NhZ2VzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEV4cGxpY2l0TGF5ZXJKc29uSW5mbyhjdXJfdnVsa2FuX2xheWVyX2pzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzdHJlYW07CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoRmluZE5leHRGaWxlQShoRmluZCwgJmZmZCkgIT0gMCk7CisKKyAgICAgICAgICAgIEZpbmRDbG9zZShoRmluZCk7CisgICAgICAgIH0KKworICAgICAgICBQcmludEVuZFRhYmxlKCk7CisgICAgfQorCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICB0aHJvdygtMSk7CisgICAgfQorfQorCisjZWxpZiBfX0dOVUNfXworCisvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlciBtYXkgZXhpc3QgaW4gdGhlIGZvbGRlci4KK2Jvb2wgQ2hlY2tEcml2ZXIoc3RkOjpzdHJpbmcgJmZvbGRlcl9sb2MsIHN0ZDo6c3RyaW5nICZvYmplY3RfbmFtZSkgeworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIGZ1bGxfbmFtZSA9IGZvbGRlcl9sb2M7CisgICAgaWYgKGZvbGRlcl9sb2MuY19zdHIoKVtmb2xkZXJfbG9jLnNpemUoKSAtIDFdICE9ICcvJykgeworICAgICAgICBmdWxsX25hbWUgKz0gIi8iOworICAgIH0KKyAgICBmdWxsX25hbWUgKz0gb2JqZWN0X25hbWU7CisgICAgaWYgKGFjY2VzcyhmdWxsX25hbWUuY19zdHIoKSwgUl9PSykgIT0gLTEpIHsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdWNjZXNzOworfQorCisvLyBQb2ludGVyIHRvIGEgZnVuY3Rpb24gc2VkIHRvIHZhbGlkYXRlIGlmIHRoZSBzeXN0ZW0gb2JqZWN0IGlzIGZvdW5kCit0eXBlZGVmIGJvb2wgKCpQRk5fQ2hlY2tJZlZhbGlkKShzdGQ6OnN0cmluZyAmZm9sZGVyX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZvYmplY3RfbmFtZSk7CisKK2Jvb2wgRmluZExpbnV4U3lzdGVtT2JqZWN0KHN0ZDo6c3RyaW5nIG9iamVjdF9uYW1lLCBQRk5fQ2hlY2tJZlZhbGlkIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJyZWFrX29uX2ZpcnN0KSB7CisgICAgYm9vbCBmb3VuZF9vbmUgPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyBwYXRoX3RvX2NoZWNrOworICAgIGNoYXIgKmVudl92YWx1ZSA9IGdldGVudigiTERfTElCUkFSWV9QQVRIIik7CisKKyAgICBmb3IgKHVpbnQzMl90IGlpaSA9IDA7IGlpaSA8IDU7IGlpaSsrKSB7CisgICAgICAgIHN3aXRjaCAoaWlpKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHBhdGhfdG9fY2hlY2sgPSAiL3Vzci9saWIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyNpZiBfX3g4Nl82NF9fIHx8IF9fcHBjNjRfXworICAgICAgICAgICAgcGF0aF90b19jaGVjayA9ICIvdXNyL2xpYi94ODZfNjQtbGludXgtZ251IjsKKyNlbHNlCisgICAgICAgICAgICBwYXRoX3RvX2NoZWNrID0gIi91c3IvbGliL2kzODYtbGludXgtZ251IjsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyNpZiBfX3g4Nl82NF9fIHx8IF9fcHBjNjRfXworICAgICAgICAgICAgcGF0aF90b19jaGVjayA9ICIvdXNyL2xpYjY0IjsKKyNlbHNlCisgICAgICAgICAgICBwYXRoX3RvX2NoZWNrID0gIi91c3IvbGliMzIiOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcGF0aF90b19jaGVjayA9ICIvdXNyL2xvY2FsL2xpYiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorI2lmIF9feDg2XzY0X18gfHwgX19wcGM2NF9fCisgICAgICAgICAgICBwYXRoX3RvX2NoZWNrID0gIi91c3IvbG9jYWwvbGliNjQiOworI2Vsc2UKKyAgICAgICAgICAgIHBhdGhfdG9fY2hlY2sgPSAiL3Vzci9sb2NhbC9saWIzMiI7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnVuYyhwYXRoX3RvX2NoZWNrLCBvYmplY3RfbmFtZSkpIHsKKyAgICAgICAgICAgIC8vIFdlIGZvdW5kIG9uZSBydW50aW1lLCBjbGVhciBhbnkgZmFpbHVyZXMKKyAgICAgICAgICAgIGZvdW5kX29uZSA9IHRydWU7CisgICAgICAgICAgICBpZiAoYnJlYWtfb25fZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIExEX0xJQlJBUllfUEFUSCBtYXkgaGF2ZSBtdWx0aXBsZSBmb2xkZXJzIGxpc3RlZCBpbiBpdCAoY29sb24KKyAgICAvLyAnOicgZGVsaW1pdGVkKQorICAgIGlmIChlbnZfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBjaGFyICp0b2sgPSBzdHJ0b2soZW52X3ZhbHVlLCAiOiIpOworICAgICAgICB3aGlsZSAodG9rICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBhdGhfdG9fY2hlY2sgPSB0b2s7CisgICAgICAgICAgICBpZiAoZnVuYyhwYXRoX3RvX2NoZWNrLCBvYmplY3RfbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBvbmUgcnVudGltZSwgY2xlYXIgYW55IGZhaWx1cmVzCisgICAgICAgICAgICAgICAgZm91bmRfb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvayA9IHN0cnRvayhOVUxMLCAiOiIpOworICAgICAgICB9CisgICAgfQorCitvdXQ6CisgICAgcmV0dXJuIGZvdW5kX29uZTsKK30KKworLy8gUHJpbnQgb3V0IGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzeXN0ZW0gdGhhdCB3ZSBjYW4KKy8vIGNhcHR1cmUgdG8gZWFzZSBpbiBkZWJ1Z2dpbmcvaW52ZXN0aWdhdGlvbiBhdCBhIGxhdGVyIHRpbWUuCit2b2lkIFByaW50U3lzdGVtSW5mbyh2b2lkKSB7CisgICAgRklMRSAqZnA7CisgICAgY2hhciBwYXRoWzEwMzVdOworICAgIGNoYXIgZ2VuZXJpY19zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIHV0c25hbWUgYnVmZmVyOworICAgIHN0cnVjdCBzdGF0dmZzIGZzX3N0YXRzOworICAgIGludCBudW1fY3B1czsKKyAgICB1aW50NjRfdCBtZW1vcnk7CisgICAgY2hhciAqZW52X3ZhbHVlOworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgY3VyX2RpcmVjdG9yeTsKKyAgICBzdGQ6OnN0cmluZyBleGVfZGlyZWN0b3J5OworICAgIHN0ZDo6c3RyaW5nIGRlc2t0b3Bfc2Vzc2lvbjsKKworICAgIEJlZ2luU2VjdGlvbigiU3lzdGVtIEluZm8iKTsKKworICAgIC8vIEVudmlyb25tZW50IHNlY3Rpb24gaGFzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBPUyBhbmQgdGhlCisgICAgLy8gZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgIFByaW50QmVnaW5UYWJsZSgiRW52aXJvbm1lbnQiLCAzKTsKKworICAgIGZwID0gcG9wZW4oImNhdCAvZXRjL29zLXJlbGVhc2UiLCAiciIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRVJST1IiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkZhaWxlZCB0byBjYXQgL2V0Yy9vcy1yZWxlYXNlIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlYWQgdGhlIG91dHB1dCBhIGxpbmUgYXQgYSB0aW1lIC0gb3V0cHV0IGl0LgorICAgICAgICB3aGlsZSAoZmdldHMocGF0aCwgc2l6ZW9mKHBhdGgpIC0gMSwgZnApICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHN0cnN0cihwYXRoLCAiUFJFVFRZX05BTUUiKSkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgIGluZGV4ID0gc3RybGVuKHBhdGgpIC0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocGF0aFtpbmRleF0gPT0gJyAnIHx8IHBhdGhbaW5kZXhdID09ICdcdCcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcGF0aFtpbmRleF0gPT0gJ1xyJyB8fCBwYXRoW2luZGV4XSA9PSAnXG4nIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHBhdGhbaW5kZXhdID09ICdcIicpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aFtpbmRleF0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHN0cmxlbihwYXRoKSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ID0gMTM7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBhdGhbaW5kZXhdID09ICcgJyB8fCBwYXRoW2luZGV4XSA9PSAnXHQnIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHBhdGhbaW5kZXhdID09ICdcIicpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkxpbnV4Iik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEaXN0cm8iKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgmcGF0aFtpbmRleF0pOworICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwY2xvc2UoZnApOworICAgIH0KKworICAgIGVycm5vID0gMDsKKyAgICBpZiAodW5hbWUoJmJ1ZmZlcikgIT0gMCkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRVJST1IiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkZhaWxlZCB0byBxdWVyeSB1bmFtZSIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIktlcm5lbCBCdWlsZCIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChidWZmZXIucmVsZWFzZSk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1hY2hpbmUgVGFyZ2V0Iik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KGJ1ZmZlci5tYWNoaW5lKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiVmVyc2lvbiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChidWZmZXIudmVyc2lvbik7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9CisKKyAgICBlbnZfdmFsdWUgPSBnZXRlbnYoIkRFU0tUT1BfU0VTU0lPTiIpOworICAgIGlmIChlbnZfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiREVTS1RPUF9TRVNTSU9OIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KGVudl92YWx1ZSk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICBkZXNrdG9wX3Nlc3Npb24gPSBlbnZfdmFsdWU7CisgICAgfQorICAgIGVudl92YWx1ZSA9IGdldGVudigiTERfTElCUkFSWV9QQVRIIik7CisgICAgaWYgKGVudl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJMRF9MSUJSQVJZX1BBVEgiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZW52X3ZhbHVlKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIH0KKyAgICBlbnZfdmFsdWUgPSBnZXRlbnYoIkdES19CQUNLRU5EIik7CisgICAgaWYgKGVudl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJHREtfQkFDS0VORCIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChlbnZfdmFsdWUpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorICAgIGVudl92YWx1ZSA9IGdldGVudigiRElTUExBWSIpOworICAgIGlmIChlbnZfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRElTUExBWSIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChlbnZfdmFsdWUpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorICAgIGVudl92YWx1ZSA9IGdldGVudigiV0FZTEFORF9ESVNQTEFZIik7CisgICAgaWYgKGVudl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXQVlMQU5EX0RJU1BMQVkiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZW52X3ZhbHVlKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIH0KKyAgICBlbnZfdmFsdWUgPSBnZXRlbnYoIk1JUl9TT0NLRVQiKTsKKyAgICBpZiAoZW52X3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1JUl9TT0NLRVQiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZW52X3ZhbHVlKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIH0KKworICAgIFByaW50RW5kVGFibGUoKTsKKworICAgIC8vIE91dHB1dCB3aGF0ZXZlciBnZW5lcmljIGhhcmR3YXJlIGluZm9ybWF0aW9uIHdlIGNhbiBmaW5kIG91dCBhYm91dCB0aGUKKyAgICAvLyBzeXN0ZW0uICBJbmNsdWRpbmcgaG93IG11Y2ggbWVtb3J5IGFuZCBkaXNrIHNwYWNlIGlzIGF2YWlsYWJsZS4KKyAgICBQcmludEJlZ2luVGFibGUoIkhhcmR3YXJlIiwgMyk7CisKKyAgICBudW1fY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsIG51bV9jcHVzKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJDUFVzIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICBtZW1vcnkgPSAoc3lzY29uZihfU0NfUEhZU19QQUdFUykgKiBzeXNjb25mKF9TQ19QQUdFX1NJWkUpKSA+PiAxMDsKKyAgICBpZiAoKG1lbW9yeSA+PiAxMCkgPiAwKSB7CisgICAgICAgIG1lbW9yeSA+Pj0gMTA7CisgICAgICAgIGlmICgobWVtb3J5ID4+IDIwKSA+IDApIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIldSBUQiIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obWVtb3J5ID4+IDIwKSk7CisgICAgICAgIH0gZWxzZSBpZiAoKG1lbW9yeSA+PiAxMCkgPiAwKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgR0IiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1lbW9yeSA+PiAxMCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IE1CIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihtZW1vcnkpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIldSBLQiIsCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihtZW1vcnkpKTsKKyAgICB9CisgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1lbW9yeSIpOworICAgIFByaW50VGFibGVFbGVtZW50KCJQaHlzaWNhbCIpOworICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICBpZiAoMCA9PSBzdGF0dmZzKCIvZXRjL29zLXJlbGVhc2UiLCAmZnNfc3RhdHMpKSB7CisgICAgICAgIHVpbnQ2NF90IGJ5dGVzX3RvdGFsID0KKyAgICAgICAgICAgICh1aW50NjRfdClmc19zdGF0cy5mX2JzaXplICogKHVpbnQ2NF90KWZzX3N0YXRzLmZfYmF2YWlsOworICAgICAgICBpZiAoKGJ5dGVzX3RvdGFsID4+IDQwKSA+IDB4MFVMTCkgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IFRCIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihieXRlc190b3RhbCA+PiA0MCkpOworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRGlzayBTcGFjZSIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkZyZWUiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfSBlbHNlIGlmICgoYnl0ZXNfdG90YWwgPj4gMzApID4gMHgwVUxMKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJXUgR0IiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ5dGVzX3RvdGFsID4+IDMwKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEaXNrIFNwYWNlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRnJlZSIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICB9IGVsc2UgaWYgKChieXRlc190b3RhbCA+PiAyMCkgPiAweDBVTEwpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIldSBNQiIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnl0ZXNfdG90YWwgPj4gMjApKTsKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRpc2sgU3BhY2UiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIH0gZWxzZSBpZiAoKGJ5dGVzX3RvdGFsID4+IDEwKSA+IDB4MFVMTCkgeworICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiV1IEtCIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihieXRlc190b3RhbCA+PiAxMCkpOworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRGlzayBTcGFjZSIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkZyZWUiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIldSBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnl0ZXNfdG90YWwpKTsKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRpc2sgU3BhY2UiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGcmVlIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgLy8gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhlY3V0YWJsZS4KKyAgICBQcmludEJlZ2luVGFibGUoIkV4ZWN1dGFibGUiLCAyKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJFeGUgRGlyZWN0b3J5Iik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2xvYmFsX2l0ZW1zLmV4ZV9kaXJlY3RvcnkpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIGlmIChnZXRjd2QoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSkgIT0gTlVMTCkgeworICAgICAgICBjdXJfZGlyZWN0b3J5ID0gZ2VuZXJpY19zdHJpbmc7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiQ3VycmVudCBEaXJlY3RvcnkiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY3VyX2RpcmVjdG9yeSk7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdXJfZGlyZWN0b3J5ID0gIiI7CisgICAgfQorCisgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkFwcCBWZXJzaW9uIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoQVBQX1ZFUlNJT04pOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIHVpbnQzMl90IG1ham9yID0gVktfVkVSU0lPTl9NQUpPUihWS19BUElfVkVSU0lPTl8xXzApOworICAgIHVpbnQzMl90IG1pbm9yID0gVktfVkVSU0lPTl9NSU5PUihWS19BUElfVkVSU0lPTl8xXzApOworICAgIHVpbnQzMl90IHBhdGNoID0gVktfVkVSU0lPTl9QQVRDSChWS19IRUFERVJfVkVSU0lPTik7CisgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVkLiVkLiVkIiwgbWFqb3IsIG1pbm9yLAorICAgICAgICAgICAgIHBhdGNoKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJWdWxrYW4gQVBJIFZlcnNpb24iKTsKKyAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkJ5dGUgRm9ybWF0Iik7CisjaWYgX194ODZfNjRfXyB8fCBfX3BwYzY0X18KKyAgICBQcmludFRhYmxlRWxlbWVudCgiNjQtYml0Iik7CisjZWxzZQorICAgIFByaW50VGFibGVFbGVtZW50KCIzMi1iaXQiKTsKKyNlbmRpZgorICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIFByaW50RW5kVGFibGUoKTsKKworICAgIC8vIFByaW50IG91dCB0aGUgcmVzdCBvZiB0aGUgdXNlZnVsIHN5c3RlbSBpbmZvcm1hdGlvbi4KKyAgICBQcmludERyaXZlckluZm8oKTsKKyAgICBQcmludFJ1blRpbWVJbmZvKCk7CisgICAgUHJpbnRTREtJbmZvKCk7CisgICAgUHJpbnRMYXllckluZm8oKTsKKyAgICBQcmludExheWVyU2V0dGluZ3NGaWxlSW5mbygpOworICAgIEVuZFNlY3Rpb24oKTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgdGhyb3coLTEpOworICAgIH0KK30KKworLy8gUHJpbnQgb3V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgZXZlcnkgZHJpdmVyIEpTT04gaW4gdGhlIGFwcHJvcHJpYXRlCisvLyBzeXN0ZW0gZm9sZGVycy4KK3ZvaWQgUHJpbnREcml2ZXJJbmZvKHZvaWQpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGNoYXIgZ2VuZXJpY19zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGNoYXIgZnVsbF9kcml2ZXJfcGF0aFtNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgdWludDMyX3QgaiA9IDA7CisgICAgYm9vbCBmb3VuZF9qc29uID0gZmFsc2U7CisgICAgYm9vbCBmb3VuZF9saWIgPSBmYWxzZTsKKworICAgIFByaW50QmVnaW5UYWJsZSgiVnVsa2FuIERyaXZlciBJbmZvIiwgMyk7CisKKyAgICAvLyBUaGVyZSBhcmUgdGhyZWUgZm9sZGVycyBJQ0QgSlNPTnMgY291bGQgYmUgaW4uICBTbywKKyAgICAvLyB0cnkgYWxsIHRocmVlLgorICAgIGZvciAodWludDMyX3QgZGlyID0gMDsgZGlyIDwgNTsgZGlyKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY3VyX2RyaXZlcl9wYXRoOworICAgICAgICBzdGQ6OnN0cmluZyBjdXJfZHJpdmVyX2pzb247CisgICAgICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGN1cl9kcml2ZXJfcGF0aCA9ICIvZXRjL3Z1bGthbi9pY2QuZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY3VyX2RyaXZlcl9wYXRoID0gIi91c3Ivc2hhcmUvdnVsa2FuL2ljZC5kIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjdXJfZHJpdmVyX3BhdGggPSAiL3Vzci9sb2NhbC9ldGMvdnVsa2FuL2ljZC5kIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjdXJfZHJpdmVyX3BhdGggPSAiL3Vzci9sb2NhbC9zaGFyZS92dWxrYW4vaWNkLmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogeworICAgICAgICAgICAgY2hhciAqZW52X3ZhbHVlID0gZ2V0ZW52KCJWS19EUklWRVJTX1BBVEgiKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IGVudl92YWx1ZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyX2RyaXZlcl9wYXRoID0gZW52X3ZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KGN1cl9kcml2ZXJfcGF0aC5jX3N0cigpKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBKU09OIGZpbGUgZm91bmQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gbG9jYXRpb24uCisgICAgICAgIERJUiAqbGF5ZXJfZGlyID0gb3BlbmRpcihjdXJfZHJpdmVyX3BhdGguY19zdHIoKSk7CisgICAgICAgIGlmIChOVUxMID09IGxheWVyX2RpcikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGlyZW50ICpjdXJfZW50OworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKChjdXJfZW50ID0gcmVhZGRpcihsYXllcl9kaXIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdHJzdHIoY3VyX2VudC0+ZF9uYW1lLCAiLmpzb24iKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJbJWRdIiwgaSsrKTsKKyAgICAgICAgICAgICAgICBjdXJfZHJpdmVyX2pzb24gPSBjdXJfZHJpdmVyX3BhdGg7CisgICAgICAgICAgICAgICAgY3VyX2RyaXZlcl9qc29uICs9ICIvIjsKKyAgICAgICAgICAgICAgICBjdXJfZHJpdmVyX2pzb24gKz0gY3VyX2VudC0+ZF9uYW1lOworCisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChjdXJfZW50LT5kX25hbWUpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kX2xpYl90aGlzX3RpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtICpzdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBzdGQ6Omlmc3RyZWFtKGN1cl9kcml2ZXJfanNvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW06OmluKTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbHB0ciA9PSBzdHJlYW0gfHwgc3RyZWFtLT5mYWlsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkVycm9yIHJlYWRpbmcgSlNPTiBmaWxlIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGN1cl9kcml2ZXJfanNvbik7CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBKc29uOjpWYWx1ZSByb290ID0gSnNvbjo6bnVsbFZhbHVlOworICAgICAgICAgICAgICAgICAgICBKc29uOjpSZWFkZXIgcmVhZGVyOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlYWRlci5wYXJzZSgqc3RyZWFtLCByb290LCBmYWxzZSkgfHwgcm9vdC5pc051bGwoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRXJyb3IgcmVhZGluZyBKU09OIGZpbGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KHJlYWRlci5nZXRGb3JtYXR0ZWRFcnJvck1lc3NhZ2VzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiSlNPTiBGaWxlIFZlcnNpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm9vdFsiZmlsZV9mb3JtYXRfdmVyc2lvbiJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RbImZpbGVfZm9ybWF0X3ZlcnNpb24iXS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1JU1NJTkchIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm9vdFsiSUNEIl0uaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9qc29uID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiQVBJIFZlcnNpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvb3RbIklDRCJdWyJhcGlfdmVyc2lvbiJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFsiSUNEIl1bImFwaV92ZXJzaW9uIl0uYXNTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1JU1NJTkchIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTGlicmFyeSBQYXRoIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb290WyJJQ0QiXVsibGlicmFyeV9wYXRoIl0uaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZHJpdmVyX25hbWUgPSByb290WyJJQ0QiXVsibGlicmFyeV9wYXRoIl0uYXNTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZHJpdmVyX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdlbmVyYXRlTGlicmFyeVBhdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2RyaXZlcl9qc29uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCwgZnVsbF9kcml2ZXJfcGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgZ2VuZXJhdGVkIHBhdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKGZ1bGxfZHJpdmVyX3BhdGgsIFJfT0spICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGliX3RoaXNfdGltZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyaXZlcl9uYW1lLmZpbmQoIi8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGaW5kTGludXhTeXN0ZW1PYmplY3QoZHJpdmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0RyaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xpYl90aGlzX3RpbWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRfbGliX3RoaXNfdGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgZHJpdmVyICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlZCBieSBKU09OICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX2RyaXZlcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kcml2ZXJfanNvbi5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGliID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmaW5kIGRyaXZlciAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlZCBieSBKU09OICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfZHJpdmVyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZHJpdmVyX2pzb24uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNSVNTSU5HISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb3VudF9zdHJbTUFYX1NUUklOR19MRU5HVEhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIGRldl9leHRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFsiSUNEIl1bImRldmljZV9leHRlbnNpb25zIl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZfZXh0cy5pc051bGwoKSAmJiBkZXZfZXh0cy5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoY291bnRfc3RyLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9leHRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEZXZpY2UgRXh0ZW5zaW9ucyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChjb3VudF9zdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChKc29uOjpWYWx1ZUl0ZXJhdG9yIGRldl9leHRfaXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXh0cy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9leHRfaXQgIT0gZGV2X2V4dHMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2V4dF9pdCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uOjpWYWx1ZSBkZXZfZXh0ID0gKCpkZXZfZXh0X2l0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIGRldl9leHRfbmFtZSA9IGRldl9leHRbIm5hbWUiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2X2V4dF9uYW1lLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxJR05fUklHSFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXh0X25hbWUuYXNTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIGluc3RfZXh0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RbIklDRCJdWyJpbnN0YW5jZV9leHRlbnNpb25zIl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0X2V4dHMuaXNOdWxsKCkgJiYgaW5zdF9leHRzLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50Zihjb3VudF9zdHIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9leHRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJJbnN0YW5jZSBFeHRlbnNpb25zIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGNvdW50X3N0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEpzb246OlZhbHVlSXRlcmF0b3IgaW5zdF9leHRfaXQgPQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RfZXh0cy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RfZXh0X2l0ICE9IGluc3RfZXh0cy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0X2V4dF9pdCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uOjpWYWx1ZSBpbnN0X2V4dCA9ICgqaW5zdF9leHRfaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnNvbjo6VmFsdWUgaW5zdF9leHRfbmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9leHRbIm5hbWUiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5zdF9leHRfbmFtZS5pc051bGwoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlslZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGopOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9leHRfbmFtZS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiSUNEIFNlY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTUlTU0lORyEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzdHJlYW07CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmRfanNvbiB8fCAhZm91bmRfbGliKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgfQorICAgIFByaW50RW5kVGFibGUoKTsKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIGlmICghZm91bmRfanNvbikgeworICAgICAgICAgICAgdGhyb3cgTUlTU0lOR19EUklWRVJfSlNPTjsKKyAgICAgICAgfSBlbHNlIGlmICghZm91bmRfbGliKSB7CisgICAgICAgICAgICB0aHJvdyBNSVNTSU5HX0RSSVZFUl9MSUI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdygtMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFByaW50IG91dCBhbGwgdGhlIHJ1bnRpbWUgZmlsZXMgZm91bmQgaW4gYSBnaXZlbiBsb2NhdGlvbi4gIFRoaXMgd2F5IHdlCisvLyBjYXB0dXJlIHRoZSBmdWxsIHN0YXRlIG9mIHRoZSBzeXN0ZW0uCitib29sIFByaW50UnVudGltZXNJbkZvbGRlcihzdGQ6OnN0cmluZyAmZm9sZGVyX2xvYywgc3RkOjpzdHJpbmcgJm9iamVjdF9uYW1lLCBib29sIHByaW50X2hlYWRlciA9IHRydWUpIHsKKyAgICBESVIgKnJ1bnRpbWVfZGlyOworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICBydW50aW1lX2RpciA9IG9wZW5kaXIoZm9sZGVyX2xvYy5jX3N0cigpKTsKKyAgICBpZiAoTlVMTCAhPSBydW50aW1lX2RpcikgeworICAgICAgICBib29sIGZpbGVfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgRklMRSAqcGZwOworICAgICAgICB1aW50MzJfdCBpID0gMDsKKyAgICAgICAgZGlyZW50ICpjdXJfZW50OworICAgICAgICBzdGQ6OnN0cmluZyBjb21tYW5kX3N0cjsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZ2VuZXJpY19zdHI7CisgICAgICAgIGNoYXIgcGF0aFsxMDM1XTsKKworICAgICAgICBpZiAocHJpbnRfaGVhZGVyKSB7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGZvbGRlcl9sb2MsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgoY3VyX2VudCA9IHJlYWRkaXIocnVudGltZV9kaXIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdHJzdHIoY3VyX2VudC0+ZF9uYW1lLCBvYmplY3RfbmFtZS5jX3N0cigpKSAmJgorICAgICAgICAgICAgICAgIHN0cmxlbihjdXJfZW50LT5kX25hbWUpID09IDE0KSB7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBvZiB0aGlzIHN5bWJvbGljIGxpbmsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3N0ciA9ICJzdGF0IC1jJU4gIjsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3N0ciArPSBmb2xkZXJfbG9jOworICAgICAgICAgICAgICAgIGNvbW1hbmRfc3RyICs9ICIvIjsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3N0ciArPSBjdXJfZW50LT5kX25hbWU7CisgICAgICAgICAgICAgICAgcGZwID0gcG9wZW4oY29tbWFuZF9zdHIuY19zdHIoKSwgInIiKTsKKworICAgICAgICAgICAgICAgIGdlbmVyaWNfc3RyIDw8ICJbIiA8PCBpKysgPDwgIl0iOworCisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHIuc3RyKCksIEFMSUdOX1JJR0hUKTsKKworICAgICAgICAgICAgICAgIGZpbGVfZm91bmQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKHBmcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGN1cl9lbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGYWlsZWQgdG8gcmV0cmlldmUgc3ltYm9saWMgbGluayIpOworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGZnZXRzKHBhdGgsIHNpemVvZihwYXRoKSAtIDEsIHBmcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNtZCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXJyb3dfbG9jID0gY21kLmZpbmQoIi0+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyb3dfbG9jID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJpbW1lZF9wYXRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpbVdoaXRlc3BhY2UocGF0aCwgIiBcdFxuXHJcJ1wiIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCh0cmltbWVkX3BhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgYmVmb3JlX2Fycm93ID0gY21kLnN1YnN0cigwLCBhcnJvd19sb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRyaW1fYmVmb3JlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpbVdoaXRlc3BhY2UoYmVmb3JlX2Fycm93LCAiIFx0XG5cclwnXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBhZnRlcl9hcnJvdyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5zdWJzdHIoYXJyb3dfbG9jICsgMiwgc3RkOjpzdHJpbmc6Om5wb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRyaW1fYWZ0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmltV2hpdGVzcGFjZShhZnRlcl9hcnJvdywgIiBcdFxuXHJcJ1wiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQodHJpbV9iZWZvcmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KHRyaW1fYWZ0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY3VyX2VudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGYWlsZWQgdG8gcmV0cmlldmUgc3ltYm9saWMgbGluayIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgIHBjbG9zZShwZnApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZpbGVfZm91bmQpIHsKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk5vIGxpYnZ1bGthbi5zbyBmaWxlcyBmb3VuZCIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKHJ1bnRpbWVfZGlyKTsKKworICAgICAgICBzdWNjZXNzID0gIWZhaWxlZDsKKyAgICB9IGVsc2UgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZm9sZGVyX2xvYywgQUxJR05fUklHSFQpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTm8gc3VjaCBmb2xkZXIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgcnVudGltZSBleGlzdHMgaW4gdGhlIGZvbGRlcgorYm9vbCBDaGVja1J1bnRpbWUoc3RkOjpzdHJpbmcgJmZvbGRlcl9sb2MsIHN0ZDo6c3RyaW5nICZvYmplY3RfbmFtZSkgeworICAgIHJldHVybiBQcmludFJ1bnRpbWVzSW5Gb2xkZXIoZm9sZGVyX2xvYywgb2JqZWN0X25hbWUpOworfQorCisvLyBQcmludCBvdXQgd2hhdGV2ZXIgVnVsa2FuIHJ1bnRpbWUgaW5mb3JtYXRpb24gd2UgY2FuIGdhdGhlciBmcm9tIHRoZQorLy8gc3RhbmRhcmQgc3lzdGVtIHBhdGhzLCBldGMuCit2b2lkIFByaW50UnVuVGltZUluZm8odm9pZCkgeworICAgIGNvbnN0IGNoYXIgdnVsa2FuX3NvX3ByZWZpeFtdID0gImxpYnZ1bGthbi5zby4iOworICAgIGNoYXIgcGF0aFsxMDM1XTsKKyAgICBjaGFyIGdlbmVyaWNfc3RyaW5nW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBjaGFyIGJ1ZmZbUEFUSF9NQVhdOworICAgIHN0ZDo6c3RyaW5nIHJ1bnRpbWVfZGlyX25hbWU7CisgICAgRklMRSAqcGZwOworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgUHJpbnRCZWdpblRhYmxlKCJWdWxrYW4gUnVudGltZXMiLCAzKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJQb3NzaWJsZSBSdW50aW1lIEZvbGRlcnMiKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIGlmICghRmluZExpbnV4U3lzdGVtT2JqZWN0KHZ1bGthbl9zb19wcmVmaXgsIENoZWNrUnVudGltZSwgZmFsc2UpKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgfQorCisgICAgc3NpemVfdCBsZW4gPSA6OnJlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIsIGJ1ZmYsIHNpemVvZihidWZmKSAtIDEpOworICAgIGlmIChsZW4gIT0gLTEpIHsKKyAgICAgICAgYnVmZltsZW5dID0gJ1wwJzsKKworICAgICAgICBzdGQ6OnN0cmluZyBydW50aW1lX2Rpcl9pZCA9ICJSdW50aW1lIEZvbGRlciBVc2VkIEJ5IHZpYSI7CisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJsZGQgJXMiLCBidWZmKTsKKyAgICAgICAgcGZwID0gcG9wZW4oZ2VuZXJpY19zdHJpbmcsICJyIik7CisgICAgICAgIGlmIChwZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChydW50aW1lX2Rpcl9pZCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRmFpbGVkIHRvIHF1ZXJ5IHZpYSBsaWJyYXJ5IGluZm8iKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoZmdldHMocGF0aCwgc2l6ZW9mKHBhdGgpIC0gMSwgcGZwKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gc3Ryc3RyKHBhdGgsIHZ1bGthbl9zb19wcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNtZCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhcnJvd19sb2MgPSBjbWQuZmluZCgiPT4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFycm93X2xvYyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJpbW1lZF9wYXRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmltV2hpdGVzcGFjZShwYXRoLCAiIFx0XG5cclwnXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQocnVudGltZV9kaXJfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQodHJpbW1lZF9wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFmdGVyX2Fycm93ID0gY21kLnN1YnN0cihhcnJvd19sb2MgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJlZm9yZV9zbGFzaCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJfYXJyb3cuc3Vic3RyKDAsIGFmdGVyX2Fycm93LnJmaW5kKCIvIikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJpbW1lZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpbVdoaXRlc3BhY2UoYmVmb3JlX3NsYXNoLCAiIFx0XG5cclwnXCIiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChydW50aW1lX2Rpcl9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCh0cmltbWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmluZF9zbyA9IHZ1bGthbl9zb19wcmVmaXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVByaW50UnVudGltZXNJbkZvbGRlcih0cmltbWVkLCBmaW5kX3NvLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBvbmUgcnVudGltZSwgY2xlYXIgYW55IGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAhZmFpbGVkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQocnVudGltZV9kaXJfaWQpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgVnVsa2FuIFNPIHVzZWQgZm9yIHZpYSIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwY2xvc2UocGZwKTsKKyAgICAgICAgfQorICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICB0aHJvdygtMSk7CisgICAgfQorfQorCisvLyBQcmludCBvdXQgdGhlIGV4cGxpY2l0IGxheWVycyB0aGF0IGFyZSBzdG9yZWQgaW4gYW55IG9mIHRoZSBzdGFuZGFyZAorLy8gbG9jYXRpb25zLgorYm9vbCBQcmludEV4cGxpY2l0TGF5ZXJzSW5Gb2xkZXIoc3RkOjpzdHJpbmcgJmlkLCBzdGQ6OnN0cmluZyAmZm9sZGVyX2xvYykgeworICAgIERJUiAqbGF5ZXJfZGlyOworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisgICAgbGF5ZXJfZGlyID0gb3BlbmRpcihmb2xkZXJfbG9jLmNfc3RyKCkpOworICAgIGlmIChOVUxMICE9IGxheWVyX2RpcikgeworICAgICAgICBkaXJlbnQgKmN1cl9lbnQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIGN1cl9sYXllcjsKKyAgICAgICAgY2hhciBnZW5lcmljX3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgICAgIHVpbnQzMl90IGkgPSAwOworICAgICAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgICAgICBib29sIGZvdW5kX2pzb24gPSBmYWxzZTsKKworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoaWQpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChmb2xkZXJfbG9jKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggSlNPTiBpbiBhIGdpdmVuIGZvbGRlcgorICAgICAgICB3aGlsZSAoKGN1cl9lbnQgPSByZWFkZGlyKGxheWVyX2RpcikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHN0cnN0cihjdXJfZW50LT5kX25hbWUsICIuanNvbiIpKSB7CisgICAgICAgICAgICAgICAgZm91bmRfanNvbiA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsIGkrKyk7CisgICAgICAgICAgICAgICAgY3VyX2xheWVyID0gZm9sZGVyX2xvYzsKKyAgICAgICAgICAgICAgICBjdXJfbGF5ZXIgKz0gIi8iOworICAgICAgICAgICAgICAgIGN1cl9sYXllciArPSBjdXJfZW50LT5kX25hbWU7CisKKyAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgSlNPTiBmaWxlCisgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSAqc3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgc3RkOjppZnN0cmVhbShjdXJfbGF5ZXIsIHN0ZDo6aWZzdHJlYW06OmluKTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbHB0ciA9PSBzdHJlYW0gfHwgc3RyZWFtLT5mYWlsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGN1cl9lbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJFUlJPUiByZWFkaW5nIEpTT04gZmlsZSEiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIHJvb3QgPSBKc29uOjpudWxsVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIEpzb246OlJlYWRlciByZWFkZXI7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVhZGVyLnBhcnNlKCpzdHJlYW0sIHJvb3QsIGZhbHNlKSB8fCByb290LmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBvcnQgdG8gdGhlIHVzZXIgdGhlIGZhaWx1cmUgYW5kIHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbnMgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZywgQUxJR05fUklHSFQpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY3VyX2VudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KHJlYWRlci5nZXRGb3JtYXR0ZWRFcnJvck1lc3NhZ2VzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGN1cl9lbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIER1bXAgb3V0IHRoZSBzdGFuZGFyZCBleHBsaWNpdCBsYXllciBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RXhwbGljaXRMYXllckpzb25JbmZvKGN1cl9sYXllci5jX3N0cigpLCByb290LCAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZF9qc29uKSB7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGlkKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGZvbGRlcl9sb2MpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk5vIEpTT04gZmlsZXMgZm91bmQiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihsYXllcl9kaXIpOworCisgICAgICAgIHN1Y2Nlc3MgPSAhZmFpbGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChpZCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KGZvbGRlcl9sb2MpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTm8gc3VjaCBmb2xkZXIiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgIC8vIFRoaXMgaXNuJ3QgYSBmYWlsdXJlLCBqdXN0IGFuIGF0dGVtcHQgdG8gcmVhZCBpbmZvcm1hdGlvbgorICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworLy8gUHJpbnQgb3V0IGluZm9ybWF0aW9uIG9uIHdoYXRldmVyIEx1bmFyRyBWdWxrYW4gU0RLcyB3ZSBjYW4gZmluZCBvbgorLy8gdGhlIHN5c3RlbSB1c2luZyB0aGUgc3RhbmRhcmQgbG9jYXRpb25zIGFuZCBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcy4KKy8vIFRoaXMgaW5jbHVkZXMgbGlzdGluZyB3aGF0IGxheWVycyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFNESy4KK3ZvaWQgUHJpbnRTREtJbmZvKHZvaWQpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGJvb2wgc2RrX2V4aXN0cyA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIHNka19wYXRoOworICAgIHN0ZDo6c3RyaW5nIHNka19lbnZfbmFtZTsKKyAgICBjb25zdCBjaGFyIHZ1bGthbl9zb19wcmVmaXhbXSA9ICJsaWJ2dWxrYW4uc28uIjsKKyAgICBESVIgKnNka19kaXI7CisgICAgZGlyZW50ICpjdXJfZW50OworICAgIGNoYXIgKmVudl92YWx1ZTsKKworICAgIFByaW50QmVnaW5UYWJsZSgiTHVuYXJHIFZ1bGthbiBTREtzIiwgMyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGRpciA9IDA7IGRpciA8IDI7IGRpcisrKSB7CisgICAgICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNka19lbnZfbmFtZSA9ICJWS19TREtfUEFUSCI7CisgICAgICAgICAgICBlbnZfdmFsdWUgPSBnZXRlbnYoc2RrX2Vudl9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKGVudl92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZGtfcGF0aCA9IGVudl92YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzZGtfZW52X25hbWUgPSAiVlVMS0FOX1NESyI7CisgICAgICAgICAgICBlbnZfdmFsdWUgPSBnZXRlbnYoc2RrX2Vudl9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKGVudl92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZGtfcGF0aCA9IGVudl92YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwbGljaXRfbGF5ZXJfcGF0aCA9IHNka19wYXRoOworICAgICAgICBleHBsaWNpdF9sYXllcl9wYXRoICs9ICIvZXRjL2V4cGxpY2l0X2xheWVyLmQiOworCisgICAgICAgIHNka19kaXIgPSBvcGVuZGlyKGV4cGxpY2l0X2xheWVyX3BhdGguY19zdHIoKSk7CisgICAgICAgIGlmIChOVUxMICE9IHNka19kaXIpIHsKKyAgICAgICAgICAgIHdoaWxlICgoY3VyX2VudCA9IHJlYWRkaXIoc2RrX2RpcikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdHJzdHIoY3VyX2VudC0+ZF9uYW1lLCB2dWxrYW5fc29fcHJlZml4KSAmJgorICAgICAgICAgICAgICAgICAgICBzdHJsZW4oY3VyX2VudC0+ZF9uYW1lKSA9PSAxNCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3NlZGlyKHNka19kaXIpOworCisgICAgICAgICAgICBpZiAoIVByaW50RXhwbGljaXRMYXllcnNJbkZvbGRlcihzZGtfZW52X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdF9sYXllcl9wYXRoKSkgeworICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdsb2JhbF9pdGVtcy5zZGtfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgZ2xvYmFsX2l0ZW1zLnNka19wYXRoID0gc2RrX3BhdGg7CisgICAgICAgICAgICBzZGtfZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc2RrX2V4aXN0cykgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTm8gaW5zdGFsbGVkIFNES3MgZm91bmQiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICB0aHJvdygtMSk7CisgICAgfQorfQorCisvLyBQcmludCBvdXQgd2hhdGV2ZXIgbGF5ZXJzIHdlIGNhbiBmaW5kIG91dCBmcm9tIG90aGVyIGVudmlyb25tZW50YWwKKy8vIHZhcmlhYmxlcyB0aGF0IG1heSBiZSB1c2VkIHRvIHBvaW50IHRoZSBWdWxrYW4gbG9hZGVyIGF0IGEgbGF5ZXIgcGF0aC4KK3ZvaWQgUHJpbnRMYXllckluZm8odm9pZCkgeworICAgIHVpbnQzMl90IGkgPSAwOworICAgIGNoYXIgZ2VuZXJpY19zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgY2hhciBjdXJfdnVsa2FuX2xheWVyX2pzb25bTUFYX1NUUklOR19MRU5HVEhdOworICAgIERJUiAqbGF5ZXJfZGlyOworICAgIGRpcmVudCAqY3VyX2VudDsKKyAgICBjb25zdCBjaGFyIGltcGxpY2l0X2xheWVyX2RpcltdID0gIi9ldGMvdnVsa2FuL2ltcGxpY2l0X2xheWVyLmQiOworICAgIGNvbnN0IGNoYXIgZXhwbGljaXRfbGF5ZXJfZGlyW10gPSAiL2V0Yy92dWxrYW4vZXhwbGljaXRfbGF5ZXIuZCI7CisgICAgc3RkOjpzdHJpbmcgbGF5ZXJfcGF0aDsKKworICAgIC8vIER1bXAgb3V0IGltcGxpY2l0IGxheWVyIGluZm9ybWF0aW9uIGZpcnN0CisgICAgUHJpbnRCZWdpblRhYmxlKCJJbXBsaWNpdCBMYXllcnMiLCAzKTsKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiTG9jYXRpb24iKTsKKyAgICBQcmludFRhYmxlRWxlbWVudChpbXBsaWNpdF9sYXllcl9kaXIpOworICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICBsYXllcl9kaXIgPSBvcGVuZGlyKGltcGxpY2l0X2xheWVyX2Rpcik7CisgICAgaWYgKE5VTEwgIT0gbGF5ZXJfZGlyKSB7CisgICAgICAgIHdoaWxlICgoY3VyX2VudCA9IHJlYWRkaXIobGF5ZXJfZGlyKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gc3Ryc3RyKGN1cl9lbnQtPmRfbmFtZSwgIi5qc29uIikpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsIGkrKyk7CisgICAgICAgICAgICAgICAgc25wcmludGYoY3VyX3Z1bGthbl9sYXllcl9qc29uLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlcy8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXRfbGF5ZXJfZGlyLCBjdXJfZW50LT5kX25hbWUpOworCisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChjdXJfZW50LT5kX25hbWUpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtICpzdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBzdGQ6Omlmc3RyZWFtKGN1cl92dWxrYW5fbGF5ZXJfanNvbiwgc3RkOjppZnN0cmVhbTo6aW4pOworICAgICAgICAgICAgICAgIGlmIChudWxscHRyID09IHN0cmVhbSB8fCBzdHJlYW0tPmZhaWwoKSkgeworICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRVJST1IgcmVhZGluZyBKU09OIGZpbGUhIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIHJvb3QgPSBKc29uOjpudWxsVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIEpzb246OlJlYWRlciByZWFkZXI7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVhZGVyLnBhcnNlKCpzdHJlYW0sIHJvb3QsIGZhbHNlKSB8fCByb290LmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBvcnQgdG8gdGhlIHVzZXIgdGhlIGZhaWx1cmUgYW5kIHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbnMgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRVJST1IgcGFyc2luZyBKU09OIGZpbGUhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChyZWFkZXIuZ2V0Rm9ybWF0dGVkRXJyb3JNZXNzYWdlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludEV4cGxpY2l0TGF5ZXJKc29uSW5mbyhjdXJfdnVsa2FuX2xheWVyX2pzb24sIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VkaXIobGF5ZXJfZGlyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIH0KKyAgICBQcmludEVuZFRhYmxlKCk7CisKKyAgICAvLyBEdW1wIG91dCBhbnkgZXhwbGljaXQgbGF5ZXIgaW5mb3JtYXRpb24uCisgICAgUHJpbnRCZWdpblRhYmxlKCJFeHBsaWNpdCBMYXllcnMiLCAzKTsKKworICAgIHN0ZDo6c3RyaW5nIGV4cGxpY2l0X2xheWVyX2lkID0gIkdsb2JhbCBwYXRoIjsKKyAgICBzdGQ6OnN0cmluZyBleHBsaWNpdF9sYXllcl9wYXRoID0gZXhwbGljaXRfbGF5ZXJfZGlyOworCisgICAgaWYgKCFQcmludEV4cGxpY2l0TGF5ZXJzSW5Gb2xkZXIoZXhwbGljaXRfbGF5ZXJfaWQsIGV4cGxpY2l0X2xheWVyX3BhdGgpKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgfQorCisgICAgZXhwbGljaXRfbGF5ZXJfaWQgPSAiVktfTEFZRVJfUEFUSCI7CisgICAgY2hhciAqZW52X3ZhbHVlID0gZ2V0ZW52KCJWS19MQVlFUl9QQVRIIik7CisgICAgaWYgKE5VTEwgIT0gZW52X3ZhbHVlKSB7CisgICAgICAgIGV4cGxpY2l0X2xheWVyX3BhdGggPSBlbnZfdmFsdWU7CisgICAgICAgIGlmICghUHJpbnRFeHBsaWNpdExheWVyc0luRm9sZGVyKGV4cGxpY2l0X2xheWVyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdF9sYXllcl9wYXRoKSkgeworICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFByaW50RW5kVGFibGUoKTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgdGhyb3coLTEpOworICAgIH0KK30KKworLy8gUnVuIHRoZSB0ZXN0IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKy8vIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisvLyBSZXR1cm5zIDAgb24gbm8gZXJyb3IsIDEgaWYgdGVzdCBmaWxlIHdhc24ndCBmb3VuZCwgYW5kIC0xCisvLyBvbiBhbnkgb3RoZXIgZXJyb3JzLgoraW50IFJ1blRlc3RJbkRpcmVjdG9yeShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyB0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbWRfbGluZSkgeworICAgIGNoYXIgb3JpZ19kaXJbTUFYX1NUUklOR19MRU5HVEhdOworICAgIGludCBlcnJfY29kZSA9IC0xOworICAgIG9yaWdfZGlyWzBdID0gJ1wwJzsKKyAgICBpZiAoTlVMTCAhPSBnZXRjd2Qob3JpZ19kaXIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSkpIHsKKyAgICAgICAgaW50IGVyciA9IGNoZGlyKHBhdGguY19zdHIoKSk7CisgICAgICAgIGlmICgtMSAhPSBlcnIpIHsKKyAgICAgICAgICAgIGlmICgtMSAhPSBhY2Nlc3ModGVzdC5jX3N0cigpLCBYX09LKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiY21kX2xpbmUgLSAlc1xuIiwgY21kX2xpbmUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBzeXN0ZW0oY21kX2xpbmUuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIENhbid0IHJ1biBiZWNhdXNlIGl0J3MgZWl0aGVyIG5vdCB0aGVyZSBvciBhbiBhY3R1YWwKKyAgICAgICAgICAgICAgICAvLyBleGUuICBTbywganVzdCByZXR1cm4gYSBzZXBhcmF0ZSBlcnJvciBjb2RlLgorICAgICAgICAgICAgICAgIGVycl9jb2RlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjaGRpcihvcmlnX2Rpcik7CisgICAgfQorICAgIHJldHVybiBlcnJfY29kZTsKK30KKworI2VuZGlmCisKKy8vIEZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIGJlIE9TIGFnbm9zdGljOgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVHJpbSBhbnkgd2hpdGVzcGFjZSBwcmVjZWVkaW5nIG9yIGZvbGxvd2luZyB0aGUgYWN0dWFsCisvLyBjb250ZW50IGluc2lkZSBvZiBhIHN0cmluZy4gIFRoZSBhY3R1YWwgaXRlbXMgbGFiZWxlZAorLy8gYXMgd2hpdGVzcGFjZSBhcmUgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgc2V0IG9mCisvLyBwYXJhbWV0ZXJzLgorc3RkOjpzdHJpbmcgVHJpbVdoaXRlc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ3aGl0ZXNwYWNlKSB7CisgICAgY29uc3QgYXV0byBzdHJCZWdpbiA9IHN0ci5maW5kX2ZpcnN0X25vdF9vZih3aGl0ZXNwYWNlKTsKKyAgICBpZiAoc3RyQmVnaW4gPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuICIiOyAvLyBubyBjb250ZW50CisgICAgfQorCisgICAgY29uc3QgYXV0byBzdHJFbmQgPSBzdHIuZmluZF9sYXN0X25vdF9vZih3aGl0ZXNwYWNlKTsKKyAgICBjb25zdCBhdXRvIHN0clJhbmdlID0gc3RyRW5kIC0gc3RyQmVnaW4gKyAxOworCisgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RyQmVnaW4sIHN0clJhbmdlKTsKK30KKworLy8gUHJpbnQgYW55IGluZm9ybWF0aW9uIGZvdW5kIG9uIHRoZSBjdXJyZW50IHZrX2xheWVyX3NldHRpbmdzLnR4dAorLy8gZmlsZSBiZWluZyB1c2VkLiAgSXQgbG9va3MgaW4gdGhlIGN1cnJlbnQgZm9sZGVyIGZpcnN0LCBhbmQgdGhlbiB3aWxsCisvLyBsb29rIGluIGFueSBkZWZpbmVkIGJ5IHRoZSByZWdpc3RyeSB2YXJpYWJsZSBWS19MQVlFUl9TRVRUSU5HU19QQVRILgordm9pZCBQcmludExheWVyU2V0dGluZ3NGaWxlSW5mbyh2b2lkKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBjaGFyICpzZXR0aW5nc19wYXRoID0gTlVMTDsKKyAgICBzdGQ6OnN0cmluZyBzZXR0aW5nc19maWxlOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxTZXR0aW5nUGFpcj4+IHNldHRpbmdzOworCisgICAgUHJpbnRCZWdpblRhYmxlKCJMYXllciBTZXR0aW5ncyBGaWxlIiwgNCk7CisKKy8vIElmIHRoZSBzZXR0aW5ncyBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgdXNlIHRoYXQuCisjaWZkZWYgX1dJTjMyCisgICAgY2hhciBnZW5lcmljX3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgaWYgKDAgIT0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoIlZLX0xBWUVSX1NFVFRJTkdTX1BBVEgiLCBnZW5lcmljX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpKSB7CisgICAgICAgIHNldHRpbmdzX3BhdGggPSBnZW5lcmljX3N0cmluZzsKKyAgICAgICAgc2V0dGluZ3NfZmlsZSA9IHNldHRpbmdzX3BhdGg7CisgICAgICAgIHNldHRpbmdzX2ZpbGUgKz0gJ1xcJzsKKyAgICB9CisjZWxzZQorICAgIHNldHRpbmdzX3BhdGggPSBnZXRlbnYoIlZLX0xBWUVSX1NFVFRJTkdTX1BBVEgiKTsKKyAgICBpZiAoTlVMTCAhPSBzZXR0aW5nc19wYXRoKSB7CisgICAgICAgIHNldHRpbmdzX2ZpbGUgPSBzZXR0aW5nc19wYXRoOworICAgICAgICBzZXR0aW5nc19maWxlICs9ICcvJzsKKyAgICB9CisjZW5kaWYKKyAgICBzZXR0aW5nc19maWxlICs9ICJ2a19sYXllcl9zZXR0aW5ncy50eHQiOworCisgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlZLX0xBWUVSX1NFVFRJTkdTX1BBVEgiKTsKKyAgICBpZiAoTlVMTCAhPSBzZXR0aW5nc19wYXRoKSB7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KHNldHRpbmdzX3BhdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJOb3QgRGVmaW5lZCIpOworICAgIH0KKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIC8vIExvYWQgdGhlIGZpbGUgZnJvbSB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24KKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiU2V0dGluZ3MgRmlsZSIpOworICAgIFByaW50VGFibGVFbGVtZW50KCJ2a19sYXllcl9zZXR0aW5ncy50eHQiKTsKKyAgICBzdGQ6Omlmc3RyZWFtICpzZXR0aW5nc19zdHJlYW0gPQorICAgICAgICBuZXcgc3RkOjppZnN0cmVhbShzZXR0aW5nc19maWxlLCBzdGQ6Omlmc3RyZWFtOjppbik7CisgICAgaWYgKG51bGxwdHIgPT0gc2V0dGluZ3Nfc3RyZWFtIHx8IHNldHRpbmdzX3N0cmVhbS0+ZmFpbCgpKSB7CisgICAgICAgIC8vIE5vIGZpbGUgd2FzIGZvdW5kLiAgVGhpcyBpcyBOT1QgYW4gZXJyb3IuCisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJOb3QgRm91bmQiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgZm91bmQgYSBmaWxlLCBzbyBwYXJzZSBpdC4KKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkZvdW5kIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgIC8vIFRoZSBzZXR0aW5ncyBmaWxlIGlzIGEgdGV4dCBmaWxlIHdoZXJlOgorICAgICAgICAvLyAgLSAjIGluZGljYXRlcyBhIGNvbW1lbnQKKyAgICAgICAgLy8gIC0gU2V0dGluZ3MgYXJlIHN0b3JlZCBpbiB0aGUgZmFzaW9uOgorICAgICAgICAvLyAgICAgICAgPGxheWVyX25hbWU+LjxzZXR0aW5nPiA9IDx2YWx1ZT4KKyAgICAgICAgd2hpbGUgKHNldHRpbmdzX3N0cmVhbS0+Z29vZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjdXJfbGluZTsKKyAgICAgICAgICAgIGdldGxpbmUoKnNldHRpbmdzX3N0cmVhbSwgY3VyX2xpbmUpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJpbW1lZF9saW5lID0gVHJpbVdoaXRlc3BhY2UoY3VyX2xpbmUpOworCisgICAgICAgICAgICAvLyBTa2lwIGJsYW5rIGFuZCBjb21tZW50IGxpbmVzCisgICAgICAgICAgICBpZiAodHJpbW1lZF9saW5lLmxlbmd0aCgpID09IDAgfHwgdHJpbW1lZF9saW5lLmNfc3RyKClbMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIG5vIGVxdWFsLCB0cmVhdCBhcyB1bmtub3duCisgICAgICAgICAgICBzaXplX3QgZXF1YWxfbG9jID0gdHJpbW1lZF9saW5lLmZpbmQoIj0iKTsKKyAgICAgICAgICAgIGlmIChlcXVhbF9sb2MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2V0dGluZ1BhaXIgbmV3X3BhaXI7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJlZm9yZV9lcXVhbCA9IHRyaW1tZWRfbGluZS5zdWJzdHIoMCwgZXF1YWxfbG9jKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFmdGVyX2VxdWFsID0KKyAgICAgICAgICAgICAgICB0cmltbWVkX2xpbmUuc3Vic3RyKGVxdWFsX2xvYyArIDEsIHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICAgICAgICAgIG5ld19wYWlyLnZhbHVlID0gVHJpbVdoaXRlc3BhY2UoYWZ0ZXJfZXF1YWwpOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0cmltbWVkX3NldHRpbmcgPSBUcmltV2hpdGVzcGFjZShiZWZvcmVfZXF1YWwpOworCisgICAgICAgICAgICAvLyBMb29rIGZvciBwZXJpb2QKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNldHRpbmdfbGF5ZXIgPSAiLS1Ob25lLS0iOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2V0dGluZ19uYW1lID0gIiI7CisgICAgICAgICAgICBzaXplX3QgcGVyaW9kX2xvYyA9IHRyaW1tZWRfc2V0dGluZy5maW5kKCIuIik7CisgICAgICAgICAgICBpZiAocGVyaW9kX2xvYyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIHNldHRpbmdfbmFtZSA9IHRyaW1tZWRfc2V0dGluZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ19sYXllciA9IHRyaW1tZWRfc2V0dGluZy5zdWJzdHIoMCwgcGVyaW9kX2xvYyk7CisgICAgICAgICAgICAgICAgc2V0dGluZ19uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgdHJpbW1lZF9zZXR0aW5nLnN1YnN0cihwZXJpb2RfbG9jICsgMSwgc3RkOjpzdHJpbmc6Om5wb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X3BhaXIubmFtZSA9IHNldHRpbmdfbmFtZTsKKworICAgICAgICAgICAgLy8gQWRkIGl0ZW1zIHRvIHNldHRpbmdzIG1hcCBmb3Igbm93CisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZmluZChzZXR0aW5nX2xheWVyKSA9PSBzZXR0aW5ncy5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIE5vdCBmb3VuZAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNldHRpbmdQYWlyPiBuZXdfdmVjdG9yOworICAgICAgICAgICAgICAgIG5ld192ZWN0b3IucHVzaF9iYWNrKG5ld19wYWlyKTsKKyAgICAgICAgICAgICAgICBzZXR0aW5nc1tzZXR0aW5nX2xheWVyXSA9IG5ld192ZWN0b3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgZXhpc3RzCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2V0dGluZ1BhaXI+ICZjdXJfdmVjdG9yID0gc2V0dGluZ3Nbc2V0dGluZ19sYXllcl07CisgICAgICAgICAgICAgICAgY3VyX3ZlY3Rvci5wdXNoX2JhY2sobmV3X3BhaXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHRoYXQgYWxsIGl0ZW1zIGhhdmUgYmVlbiBncm91cGVkIGluIHRoZSBzZXR0aW5ncyBtYXAKKyAgICAgICAgLy8gYXBwcm9wcmlhdGVseSwgcHJpbnQKKyAgICAgICAgLy8gdGhlbSBvdXQKKyAgICAgICAgZm9yIChhdXRvIGxheWVyX2l0ZXIgPSBzZXR0aW5ncy5iZWdpbigpOyBsYXllcl9pdGVyICE9IHNldHRpbmdzLmVuZCgpOworICAgICAgICAgICAgIGxheWVyX2l0ZXIrKykgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2V0dGluZ1BhaXI+ICZjdXJfdmVjdG9yID0gbGF5ZXJfaXRlci0+c2Vjb25kOworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChsYXllcl9pdGVyLT5maXJzdCwgQUxJR05fUklHSFQpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdXJfaXRlbSA9IDA7IGN1cl9pdGVtIDwgY3VyX3ZlY3Rvci5zaXplKCk7CisgICAgICAgICAgICAgICAgIGN1cl9pdGVtKyspIHsKKyAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGN1cl92ZWN0b3JbY3VyX2l0ZW1dLm5hbWUpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGN1cl92ZWN0b3JbY3VyX2l0ZW1dLnZhbHVlKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXR0aW5nc19zdHJlYW0tPmNsb3NlKCk7CisgICAgICAgIGRlbGV0ZSBzZXR0aW5nc19zdHJlYW07CisgICAgfQorICAgIFByaW50RW5kVGFibGUoKTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgdGhyb3coLTEpOworICAgIH0KK30KKworLy8gUHJpbnQgb3V0IHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYW4gZXhwbGljaXQgbGF5ZXIncyBKU09OIGZpbGUuCit2b2lkIFByaW50RXhwbGljaXRMYXllckpzb25JbmZvKGNvbnN0IGNoYXIgKmxheWVyX2pzb25fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIHJvb3QsIHVpbnQzMl90IG51bV9jb2xzKSB7CisgICAgY2hhciBnZW5lcmljX3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisgICAgdWludDMyX3QgY3VyX2NvbDsKKyAgICB1aW50MzJfdCBleHQ7CisgICAgaWYgKCFyb290WyJsYXllciJdLmlzTnVsbCgpKSB7CisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJOYW1lIik7CisgICAgICAgIGlmICghcm9vdFsibGF5ZXIiXVsibmFtZSJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChyb290WyJsYXllciJdWyJuYW1lIl0uYXNTdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTUlTU0lORyEiKTsKKyAgICAgICAgfQorICAgICAgICBjdXJfY29sID0gMzsKKyAgICAgICAgd2hpbGUgKG51bV9jb2xzID4gY3VyX2NvbCkgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgY3VyX2NvbCsrOworICAgICAgICB9CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRGVzY3JpcHRpb24iKTsKKyAgICAgICAgaWYgKCFyb290WyJsYXllciJdWyJkZXNjcmlwdGlvbiJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChyb290WyJsYXllciJdWyJkZXNjcmlwdGlvbiJdLmFzU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1JU1NJTkchIik7CisgICAgICAgIH0KKyAgICAgICAgY3VyX2NvbCA9IDM7CisgICAgICAgIHdoaWxlIChudW1fY29scyA+IGN1cl9jb2wpIHsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIGN1cl9jb2wrKzsKKyAgICAgICAgfQorICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkFQSSBWZXJzaW9uIik7CisgICAgICAgIGlmICghcm9vdFsibGF5ZXIiXVsiYXBpX3ZlcnNpb24iXS5pc051bGwoKSkgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQocm9vdFsibGF5ZXIiXVsiYXBpX3ZlcnNpb24iXS5hc1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNSVNTSU5HISIpOworICAgICAgICB9CisgICAgICAgIGN1cl9jb2wgPSAzOworICAgICAgICB3aGlsZSAobnVtX2NvbHMgPiBjdXJfY29sKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBjdXJfY29sKys7CisgICAgICAgIH0KKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJKU09OIEZpbGUgVmVyc2lvbiIpOworICAgICAgICBpZiAoIXJvb3RbImZpbGVfZm9ybWF0X3ZlcnNpb24iXS5pc051bGwoKSkgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQocm9vdFsiZmlsZV9mb3JtYXRfdmVyc2lvbiJdLmFzU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1JU1NJTkchIik7CisgICAgICAgIH0KKyAgICAgICAgY3VyX2NvbCA9IDM7CisgICAgICAgIHdoaWxlIChudW1fY29scyA+IGN1cl9jb2wpIHsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIGN1cl9jb2wrKzsKKyAgICAgICAgfQorICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkxpYnJhcnkgUGF0aCIpOworICAgICAgICBpZiAoIXJvb3RbImxheWVyIl1bImxpYnJhcnlfcGF0aCJdLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChyb290WyJsYXllciJdWyJsaWJyYXJ5X3BhdGgiXS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgIGN1cl9jb2wgPSAzOworICAgICAgICAgICAgd2hpbGUgKG51bV9jb2xzID4gY3VyX2NvbCkgeworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBjdXJfY29sKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgIC8vIE9uIFdpbmRvd3MsIHdlIGNhbiBxdWVyeSB0aGUgZmlsZSB2ZXJzaW9uLCBzbyBkbyBzby4KKyAgICAgICAgICAgIGNoYXIgZnVsbF9sYXllcl9wYXRoW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICAgICAgICAgIGlmIChHZW5lcmF0ZUxpYnJhcnlQYXRoKAorICAgICAgICAgICAgICAgICAgICBsYXllcl9qc29uX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICByb290WyJsYXllciJdWyJsaWJyYXJ5X3BhdGgiXS5hc1N0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RILCBmdWxsX2xheWVyX3BhdGgpICYmCisgICAgICAgICAgICAgICAgR2V0RmlsZVZlcnNpb24oZnVsbF9sYXllcl9wYXRoLCBNQVhfU1RSSU5HX0xFTkdUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljX3N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkxheWVyIEZpbGUgVmVyc2lvbiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICBjdXJfY29sID0gMzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobnVtX2NvbHMgPiBjdXJfY29sKSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2NvbCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNSVNTSU5HISIpOworICAgICAgICAgICAgY3VyX2NvbCA9IDM7CisgICAgICAgICAgICB3aGlsZSAobnVtX2NvbHMgPiBjdXJfY29sKSB7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIGN1cl9jb2wrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgY291bnRfc3RyW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICAgICAgSnNvbjo6VmFsdWUgZGV2X2V4dHMgPSByb290WyJsYXllciJdWyJkZXZpY2VfZXh0ZW5zaW9ucyJdOworICAgICAgICBleHQgPSAwOworICAgICAgICBpZiAoIWRldl9leHRzLmlzTnVsbCgpICYmIGRldl9leHRzLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgc25wcmludGYoY291bnRfc3RyLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsIGRldl9leHRzLnNpemUoKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEZXZpY2UgRXh0ZW5zaW9ucyIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoY291bnRfc3RyKTsKKyAgICAgICAgICAgIGN1cl9jb2wgPSAzOworICAgICAgICAgICAgd2hpbGUgKG51bV9jb2xzID4gY3VyX2NvbCkgeworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBjdXJfY29sKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgIGZvciAoSnNvbjo6VmFsdWVJdGVyYXRvciBkZXZfZXh0X2l0ID0gZGV2X2V4dHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgZGV2X2V4dF9pdCAhPSBkZXZfZXh0cy5lbmQoKTsgZGV2X2V4dF9pdCsrKSB7CisgICAgICAgICAgICAgICAgSnNvbjo6VmFsdWUgZGV2X2V4dCA9ICgqZGV2X2V4dF9pdCk7CisgICAgICAgICAgICAgICAgSnNvbjo6VmFsdWUgZGV2X2V4dF9uYW1lID0gZGV2X2V4dFsibmFtZSJdOworICAgICAgICAgICAgICAgIGlmICghZGV2X2V4dF9uYW1lLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJbJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZGV2X2V4dF9uYW1lLmFzU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBjdXJfY29sID0gMzsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG51bV9jb2xzID4gY3VyX2NvbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NvbCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSnNvbjo6VmFsdWUgaW5zdF9leHRzID0gcm9vdFsibGF5ZXIiXVsiaW5zdGFuY2VfZXh0ZW5zaW9ucyJdOworICAgICAgICBleHQgPSAwOworICAgICAgICBpZiAoIWluc3RfZXh0cy5pc051bGwoKSAmJiBpbnN0X2V4dHMuaXNBcnJheSgpKSB7CisgICAgICAgICAgICBzbnByaW50Zihjb3VudF9zdHIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVkIiwgaW5zdF9leHRzLnNpemUoKSk7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJJbnN0YW5jZSBFeHRlbnNpb25zIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChjb3VudF9zdHIpOworICAgICAgICAgICAgY3VyX2NvbCA9IDM7CisgICAgICAgICAgICB3aGlsZSAobnVtX2NvbHMgPiBjdXJfY29sKSB7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIGN1cl9jb2wrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgZm9yIChKc29uOjpWYWx1ZUl0ZXJhdG9yIGluc3RfZXh0X2l0ID0gaW5zdF9leHRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGluc3RfZXh0X2l0ICE9IGluc3RfZXh0cy5lbmQoKTsgaW5zdF9leHRfaXQrKykgeworICAgICAgICAgICAgICAgIEpzb246OlZhbHVlIGluc3RfZXh0ID0gKCppbnN0X2V4dF9pdCk7CisgICAgICAgICAgICAgICAgSnNvbjo6VmFsdWUgaW5zdF9leHRfbmFtZSA9IGluc3RfZXh0WyJuYW1lIl07CisgICAgICAgICAgICAgICAgaWYgKCFpbnN0X2V4dF9uYW1lLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJbJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoaW5zdF9leHRfbmFtZS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2NvbCA9IDM7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChudW1fY29scyA+IGN1cl9jb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jb2wrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkxheWVyIFNlY3Rpb24iKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk1JU1NJTkchIik7CisgICAgICAgIGN1cl9jb2wgPSAzOworICAgICAgICB3aGlsZSAobnVtX2NvbHMgPiBjdXJfY29sKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBjdXJfY29sKys7CisgICAgICAgIH0KKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIH0KK30KKworLy8gUHJpbnQgb3V0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBJbXBsaWNpdCBsYXllciBzdG9yZWQgaW4KKy8vIGl0J3MgSlNPTiBmaWxlLiAgRm9yIHRoZSBtb3N0IHBhcnQsIGl0IGlzIHNpbWlsYXIgdG8gYW4KKy8vIGV4cGxpY2l0IGxheWVyLCBzbyB3ZSByZS11c2UgdGhhdCBjb2RlLiAgSG93ZXZlciwgaW1wbGljaXQKKy8vIGxheWVycyBoYXZlIGEgRElTQUJMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGNhbiBiZSB1c2VkCisvLyB0byBkaXNhYmxlIHRoZSBsYXllciBieSBkZWZhdWx0LiAgQWRkaXRpb25hbGx5LCBzb21lIGltcGxpY2l0CisvLyBsYXllcnMgaGF2ZSBhbiBFTkFCTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgc28gdGhhdCB0aGV5IGFyZQorLy8gZGlzYWJsZWQgYnkgZGVmYXVsdCwgYnV0IGNhbiBiZSBlbmFibGVkLgordm9pZCBQcmludEltcGxpY2l0TGF5ZXJKc29uSW5mbyhjb25zdCBjaGFyICpsYXllcl9qc29uX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uOjpWYWx1ZSByb290KSB7CisgICAgYm9vbCBlbmFibGVkID0gdHJ1ZTsKKyAgICBzdGQ6OnN0cmluZyBlbmFibGVfZW52X3ZhcmlhYmxlID0gIi0tTk9ORS0tIjsKKyAgICBib29sIGVuYWJsZV92YXJfc2V0ID0gZmFsc2U7CisgICAgY2hhciBlbmFibGVfZW52X3ZhbHVlWzE2XTsKKyAgICBzdGQ6OnN0cmluZyBkaXNhYmxlX2Vudl92YXJpYWJsZSA9ICItLU5PTkUtLSI7CisgICAgYm9vbCBkaXNhYmxlX3Zhcl9zZXQgPSBmYWxzZTsKKyAgICBjaGFyIGRpc2FibGVfZW52X3ZhbHVlWzE2XTsKKworICAgIFByaW50RXhwbGljaXRMYXllckpzb25JbmZvKGxheWVyX2pzb25fZmlsZW5hbWUsIHJvb3QsIDQpOworCisgICAgSnNvbjo6VmFsdWUgZW5hYmxlID0gcm9vdFsibGF5ZXIiXVsiZW5hYmxlX2Vudmlyb25tZW50Il07CisgICAgaWYgKCFlbmFibGUuaXNOdWxsKCkpIHsKKyAgICAgICAgZm9yIChKc29uOjpWYWx1ZTo6aXRlcmF0b3IgZW5faXRlciA9IGVuYWJsZS5iZWdpbigpOworICAgICAgICAgICAgIGVuX2l0ZXIgIT0gZW5hYmxlLmVuZCgpOyBlbl9pdGVyKyspIHsKKyAgICAgICAgICAgIGlmIChlbl9pdGVyLmtleSgpLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmFibGVfZW52X3ZhcmlhYmxlID0gZW5faXRlci5rZXkoKS5hc1N0cmluZygpOworICAgICAgICAgICAgLy8gSWYgYW4gZW5hYmxlIGRlZmluZSBleGlzdHMsIHNldCBpdCB0byBkaXNhYmxlZCBieSBkZWZhdWx0LgorICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOworI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgaWYgKDAgIT0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoZW5hYmxlX2Vudl92YXJpYWJsZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2Vudl92YWx1ZSwgMTUpKSB7CisjZWxzZQorICAgICAgICAgICAgY2hhciAqZW5hYmxlX2VudiA9IGdldGVudihlbmFibGVfZW52X3ZhcmlhYmxlLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZW5hYmxlX2VudikgeworICAgICAgICAgICAgICAgIHN0cm5jcHkoZW5hYmxlX2Vudl92YWx1ZSwgZW5hYmxlX2VudiwgMTUpOworICAgICAgICAgICAgICAgIGVuYWJsZV9lbnZfdmFsdWVbMTVdID0gJ1wwJzsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChhdG9pKGVuYWJsZV9lbnZfdmFsdWUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlX3Zhcl9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBKc29uOjpWYWx1ZSBkaXNhYmxlID0gcm9vdFsibGF5ZXIiXVsiZGlzYWJsZV9lbnZpcm9ubWVudCJdOworICAgIGlmICghZGlzYWJsZS5pc051bGwoKSkgeworICAgICAgICBmb3IgKEpzb246OlZhbHVlOjppdGVyYXRvciBkaXNfaXRlciA9IGRpc2FibGUuYmVnaW4oKTsKKyAgICAgICAgICAgICBkaXNfaXRlciAhPSBkaXNhYmxlLmVuZCgpOyBkaXNfaXRlcisrKSB7CisgICAgICAgICAgICBpZiAoZGlzX2l0ZXIua2V5KCkuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc2FibGVfZW52X3ZhcmlhYmxlID0gZGlzX2l0ZXIua2V5KCkuYXNTdHJpbmcoKTsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgIGlmICgwICE9IEdldEVudmlyb25tZW50VmFyaWFibGVBKGRpc2FibGVfZW52X3ZhcmlhYmxlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX2Vudl92YWx1ZSwgMTUpKSB7CisjZWxzZQorICAgICAgICAgICAgY2hhciAqZGlzYWJsZV9lbnYgPSBnZXRlbnYoZGlzYWJsZV9lbnZfdmFyaWFibGUuY19zdHIoKSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkaXNhYmxlX2VudikgeworICAgICAgICAgICAgICAgIHN0cm5jcHkoZGlzYWJsZV9lbnZfdmFsdWUsIGRpc2FibGVfZW52LCAxNSk7CisgICAgICAgICAgICAgICAgZGlzYWJsZV9lbnZfdmFsdWVbMTVdID0gJ1wwJzsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChhdG9pKGRpc2FibGVfZW52X3ZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV92YXJfc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJpbnQgdGhlIG92ZXJhbGwgc3RhdGUgKEVOQUJMRUQgb3IgRElTQUJMRUQpIHNvIHdlIGNhbgorICAgIC8vIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHRoaXMgbGF5ZXIgaXMgYmVpbmcgdXNlZC4KKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkVuYWJsZWQgU3RhdGUiKTsKKyAgICBQcmludFRhYmxlRWxlbWVudChlbmFibGVkID8gIkVOQUJMRUQiIDogIkRJU0FCTEVEIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkVuYWJsZSBFbnYgVmFyIiwgQUxJR05fUklHSFQpOworICAgIFByaW50VGFibGVFbGVtZW50KGVuYWJsZV9lbnZfdmFyaWFibGUpOworICAgIGlmIChlbmFibGVfdmFyX3NldCkgeworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk5vdCBEZWZpbmVkIik7CisgICAgfQorICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRpc2FibGUgRW52IFZhciIsIEFMSUdOX1JJR0hUKTsKKyAgICBQcmludFRhYmxlRWxlbWVudChkaXNhYmxlX2Vudl92YXJpYWJsZSk7CisgICAgaWYgKGRpc2FibGVfdmFyX3NldCkgeworICAgICAgICBQcmludFRhYmxlRWxlbWVudChkaXNhYmxlX2Vudl92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIk5vdCBEZWZpbmVkIik7CisgICAgfQorICAgIFByaW50RW5kVGFibGVSb3coKTsKK30KKworLy8gUGVyZm9ybSBWdWxrYW4gY29tbWFuZHMgdG8gZmluZCBvdXQgd2hhdCBleHRlbnNpb25zIGFyZSBhdmFpbGFibGUKKy8vIHRvIGEgVnVsa2FuIEluc3RhbmNlLCBhbmQgYXR0ZW1wdCB0byBjcmVhdGUgb25lLgordm9pZCBQcmludEluc3RhbmNlSW5mbyh2b2lkKSB7CisgICAgVmtBcHBsaWNhdGlvbkluZm8gYXBwX2luZm87CisgICAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5zdF9pbmZvOworICAgIHVpbnQzMl90IGV4dF9jb3VudDsKKyAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IGV4dF9wcm9wczsKKyAgICBWa1Jlc3VsdCBzdGF0dXM7CisgICAgY2hhciBnZW5lcmljX3N0cmluZ1tNQVhfU1RSSU5HX0xFTkdUSF07CisKKyAgICBtZW1zZXQoJmFwcF9pbmZvLCAwLCBzaXplb2YoVmtBcHBsaWNhdGlvbkluZm8pKTsKKyAgICBhcHBfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk87CisgICAgYXBwX2luZm8ucE5leHQgPSBOVUxMOworICAgIGFwcF9pbmZvLnBBcHBsaWNhdGlvbk5hbWUgPSAidmlhIjsKKyAgICBhcHBfaW5mby5hcHBsaWNhdGlvblZlcnNpb24gPSAxOworICAgIGFwcF9pbmZvLnBFbmdpbmVOYW1lID0gInZpYSI7CisgICAgYXBwX2luZm8uZW5naW5lVmVyc2lvbiA9IDE7CisgICAgYXBwX2luZm8uYXBpVmVyc2lvbiA9IFZLX0FQSV9WRVJTSU9OXzFfMDsKKworICAgIG1lbXNldCgmaW5zdF9pbmZvLCAwLCBzaXplb2YoVmtJbnN0YW5jZUNyZWF0ZUluZm8pKTsKKyAgICBpbnN0X2luZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTzsKKyAgICBpbnN0X2luZm8ucE5leHQgPSBOVUxMOworICAgIGluc3RfaW5mby5wQXBwbGljYXRpb25JbmZvID0gJmFwcF9pbmZvOworICAgIGluc3RfaW5mby5lbmFibGVkTGF5ZXJDb3VudCA9IDA7CisgICAgaW5zdF9pbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBOVUxMOworICAgIGluc3RfaW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSAwOworICAgIGluc3RfaW5mby5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyA9IE5VTEw7CisKKyAgICBQcmludEJlZ2luVGFibGUoIkluc3RhbmNlIiwgMyk7CisKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgidmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMiKTsKKyAgICBzdGF0dXMgPSB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhOVUxMLCAmZXh0X2NvdW50LCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICJFUlJPUjogRmFpbGVkIHRvIGRldGVybWluZSBudW0gaW5zdCBleHRlbnNpb25zIC0gJWQiLCBzdGF0dXMpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCBleHRlbnNpb25zIGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgZXh0X2NvdW50KTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICBleHRfcHJvcHMucmVzaXplKGV4dF9jb3VudCk7CisgICAgICAgIHN0YXR1cyA9IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKE5VTEwsICZleHRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9wcm9wcy5kYXRhKCkpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAiRVJST1I6IEZhaWxlZCB0byBlbnVtZXJhdGUgaW5zdCBleHRlbnNpb25zIC0gJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpaWkgPSAwOyBpaWkgPCBleHRfY291bnQ7IGlpaSsrKSB7CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlslZF0iLCBpaWkpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZXh0X3Byb3BzW2lpaV0uZXh0ZW5zaW9uTmFtZSk7CisgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlNwZWMgVmVycyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X3Byb3BzW2lpaV0uc3BlY1ZlcnNpb24pOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgidmtDcmVhdGVJbnN0YW5jZSIpOworICAgIHN0YXR1cyA9IHZrQ3JlYXRlSW5zdGFuY2UoJmluc3RfaW5mbywgTlVMTCwgJmdsb2JhbF9pdGVtcy5pbnN0YW5jZSk7CisgICAgaWYgKHN0YXR1cyA9PSBWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSKSB7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJFUlJPUjogSW5jb21wYXRpYmxlIERyaXZlciIpOworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IFZLX0VSUk9SX09VVF9PRl9IT1NUX01FTU9SWSkgeworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRVJST1I6IE91dCBvZiBtZW1vcnkiKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cykgeworICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAiRVJST1I6IEZhaWxlZCB0byBjcmVhdGUgLSAlZCIsIHN0YXR1cyk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiU1VDQ0VTU0ZVTCIpOworICAgIH0KKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIFByaW50RW5kVGFibGUoKTsKKyAgICBpZiAoVktfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgdGhyb3coLTEpOworICAgIH0KK30KKworLy8gUHJpbnQgb3V0IGFueSBpbmZvcm1hdGlvbiB3ZSBjYW4gZmluZCBvdXQgYWJvdXQgcGh5c2ljYWwgZGV2aWNlcyB1c2luZworLy8gdGhlIFZ1bGthbiBjb21tYW5kcy4gIFRoZXJlIHNob3VsZCBiZSBvbmUgZm9yIGVhY2ggVnVsa2FuIGNhcGFibGUgZGV2aWNlCisvLyBvbiB0aGUgc3lzdGVtLgordm9pZCBQcmludFBoeXNEZXZJbmZvKHZvaWQpIHsKKyAgICBWa1BoeXNpY2FsRGV2aWNlUHJvcGVydGllcyBwcm9wczsKKyAgICBzdGQ6OnZlY3RvcjxWa1BoeXNpY2FsRGV2aWNlPiBwaHlzX2RldmljZXM7CisgICAgVmtSZXN1bHQgc3RhdHVzOworICAgIGNoYXIgZ2VuZXJpY19zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIHVpbnQzMl90IGdwdV9jb3VudCA9IDA7CisgICAgdWludDMyX3QgaWlpOworICAgIHVpbnQzMl90IGpqajsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgUHJpbnRCZWdpblRhYmxlKCJQaHlzaWNhbCBEZXZpY2VzIiwgNCk7CisKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiKTsKKyAgICBzdGF0dXMgPQorICAgICAgICB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhnbG9iYWxfaXRlbXMuaW5zdGFuY2UsICZncHVfY291bnQsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgIkVSUk9SOiBGYWlsZWQgdG8gcXVlcnkgLSAlZCIsIHN0YXR1cyk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJWQiLCBncHVfY291bnQpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgfQorICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgLy8gSWYgd2UgZmFpbGVkIGhlcmUsIHRoZSByZXN0IHdpbGwgaGF2ZSBpc3N1ZXMsIHNvLCB1bmxpa2UgZXZlcnl3aGVyZQorICAgIC8vIGVsc2UsIHdlJ2xsIGp1c3QgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgdGhyb3cgVlVMS0FOX0NBTlRfRklORF9EUklWRVI7CisgICAgfQorCisgICAgcGh5c19kZXZpY2VzLnJlc2l6ZShncHVfY291bnQpOworICAgIGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXMucmVzaXplKGdwdV9jb3VudCk7CisgICAgc3RhdHVzID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoZ2xvYmFsX2l0ZW1zLmluc3RhbmNlLCAmZ3B1X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2aWNlcy5kYXRhKCkpOworICAgIGlmIChWS19TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRmFpbGVkIHRvIGVudW1lcmF0ZSBwaHlzaWNhbCBkZXZpY2VzISIpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpaWkgPSAwOyBpaWkgPCBncHVfY291bnQ7IGlpaSsrKSB7CisgICAgICAgIGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXNbaWlpXS52dWxrYW5fcGh5c19kZXYgPSBwaHlzX2RldmljZXNbaWlpXTsKKworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlslZF0iLCBpaWkpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZywgQUxJR05fUklHSFQpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiBGYWlsZWQgdG8gcXVlcnkgLSAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiMHglcCIsCisgICAgICAgICAgICAgICAgICAgICBwaHlzX2RldmljZXNbaWlpXSk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzKHBoeXNfZGV2aWNlc1tpaWldLCAmcHJvcHMpOworCisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJWZW5kb3IiKTsKKyAgICAgICAgICAgIHN3aXRjaCAocHJvcHMudmVuZG9ySUQpIHsKKyAgICAgICAgICAgIGNhc2UgMHg4MDg2OgorICAgICAgICAgICAgY2FzZSAweDgwODc6CisgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWwgWzB4JTA0eF0iLCBwcm9wcy52ZW5kb3JJRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTAwMjoKKyAgICAgICAgICAgIGNhc2UgMHgxMDIyOgorICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJBTUQgWzB4JTA0eF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnZlbmRvcklEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMERFOgorICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk52aWRpYSBbMHglMDR4XSIsIHByb3BzLnZlbmRvcklEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxRUI1OgorICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJBUk0gWzB4JTA0eF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnZlbmRvcklEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg1MTQzOgorICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlF1YWxjb21tIFsweCUwNHhdIiwgcHJvcHMudmVuZG9ySUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwOTk6CisgICAgICAgICAgICBjYXNlIDB4MTBDMzoKKyAgICAgICAgICAgIGNhc2UgMHgxMjQ5OgorICAgICAgICAgICAgY2FzZSAweDRFODoKKyAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1zdW5nIFsweCUwNHhdIiwgcHJvcHMudmVuZG9ySUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiMHglMDR4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy52ZW5kb3JJRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRldmljZSBOYW1lIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChwcm9wcy5kZXZpY2VOYW1lKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRGV2aWNlIElEIik7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiMHgleCIsCisgICAgICAgICAgICAgICAgICAgICBwcm9wcy5kZXZpY2VJRCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRldmljZSBUeXBlIik7CisgICAgICAgICAgICBzd2l0Y2ggKHByb3BzLmRldmljZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVktfUEhZU0lDQUxfREVWSUNFX1RZUEVfSU5URUdSQVRFRF9HUFU6CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkludGVncmF0ZWQgR1BVIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX0RJU0NSRVRFX0dQVToKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRGlzY3JldGUgR1BVIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLX1BIWVNJQ0FMX0RFVklDRV9UWVBFX1ZJUlRVQUxfR1BVOgorICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJWaXJ0dWFsIEdQVSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9DUFU6CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkNQVSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS19QSFlTSUNBTF9ERVZJQ0VfVFlQRV9PVEhFUjoKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiT3RoZXIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIklOVkFMSUQhIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRyaXZlciBWZXJzaW9uIik7CisgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJWQuJWQuJWQiLAorICAgICAgICAgICAgICAgICAgICAgVktfVkVSU0lPTl9NQUpPUihwcm9wcy5kcml2ZXJWZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgIFZLX1ZFUlNJT05fTUlOT1IocHJvcHMuZHJpdmVyVmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICBWS19WRVJTSU9OX1BBVENIKHByb3BzLmRyaXZlclZlcnNpb24pKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiQVBJIFZlcnNpb24iKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZC4lZC4lZCIsCisgICAgICAgICAgICAgICAgICAgICBWS19WRVJTSU9OX01BSk9SKHByb3BzLmFwaVZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgVktfVkVSU0lPTl9NSU5PUihwcm9wcy5hcGlWZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgIFZLX1ZFUlNJT05fUEFUQ0gocHJvcHMuYXBpVmVyc2lvbikpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICB1aW50MzJfdCBxdWV1ZV9mYW1fY291bnQ7CisgICAgICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHBoeXNfZGV2aWNlc1tpaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVldWVfZmFtX2NvdW50LCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChxdWV1ZV9mYW1fY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJRdWV1ZSBGYW1pbGllcyIpOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfZmFtX2NvdW50KTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgIGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXNbaWlpXS5xdWV1ZV9mYW1fcHJvcHMucmVzaXplKAorICAgICAgICAgICAgICAgICAgICBxdWV1ZV9mYW1fY291bnQpOworICAgICAgICAgICAgICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2aWNlc1tpaWldLCAmcXVldWVfZmFtX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzW2lpaV0ucXVldWVfZmFtX3Byb3BzLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgZm9yIChqamogPSAwOyBqamogPCBxdWV1ZV9mYW1fY291bnQ7IGpqaisrKSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJbJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgampqKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlF1ZXVlIENvdW50Iik7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXNbaWlpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXVlX2ZhbV9wcm9wc1tqampdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlF1ZXVlIEZsYWdzIik7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNfc3RyaW5nWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmV2X3NldCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsX2l0ZW1zLnBoeXNfZGV2aWNlc1tpaWldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXVlX2ZhbV9wcm9wc1tqampdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXVlRmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgVktfUVVFVUVfR1JBUEhJQ1NfQklUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY2F0KGdlbmVyaWNfc3RyaW5nLCAiR1JBUEhJQ1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzW2lpaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVfZmFtX3Byb3BzW2pqal0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVGbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVVRV9DT01QVVRFX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIiB8ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIkNPTVBVVEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzW2lpaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVfZmFtX3Byb3BzW2pqal0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVGbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBWS19RVUVVRV9UUkFOU0ZFUl9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2X3NldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICIgfCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICJUUkFOU0ZFUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXNbaWlpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWV1ZV9mYW1fcHJvcHNbampqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWV1ZUZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX1NQQVJTRV9CSU5ESU5HX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIiB8ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIlNQQVJTRV9CSU5ESU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZfc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY2F0KGdlbmVyaWNfc3RyaW5nLCAiLS1OT05FLS0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlRpbWVzdGFtcCBWYWxpZCBCaXRzIik7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX2l0ZW1zLnBoeXNfZGV2aWNlc1tpaWldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVldWVfZmFtX3Byb3BzW2pqal0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aW1lc3RhbXBWYWxpZEJpdHMpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJJbWFnZSBHcmFudWxhcml0eSIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJXaWR0aCIsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIjB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzW2lpaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWV1ZV9mYW1fcHJvcHNbampqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkhlaWdodCIsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIjB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzW2lpaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWV1ZV9mYW1fcHJvcHNbampqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eS5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJEZXB0aCIsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIjB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzW2lpaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWV1ZV9mYW1fcHJvcHNbampqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkltYWdlVHJhbnNmZXJHcmFudWxhcml0eS5kZXB0aCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJ2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkZBSUxFRDogUmV0dXJuZWQgMCEiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlfcHJvcHM7CisgICAgICAgICAgICB2a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhwaHlzX2RldmljZXNbaWlpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW1vcnlfcHJvcHMpOworCisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNZW1vcnkgSGVhcHMiKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsCisgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfcHJvcHMubWVtb3J5SGVhcENvdW50KTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgZm9yIChqamogPSAwOyBqamogPCBtZW1vcnlfcHJvcHMubWVtb3J5SGVhcENvdW50OyBqamorKykgeworICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsIGpqaik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiUHJvcGVydHkgRmxhZ3MiKTsKKyAgICAgICAgICAgICAgICBnZW5lcmljX3N0cmluZ1swXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYm9vbCBwcmV2X3NldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtZW1vcnlfcHJvcHMubWVtb3J5SGVhcHNbampqXS5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgIFZLX01FTU9SWV9IRUFQX0RFVklDRV9MT0NBTF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIkRFVklDRV9MT0NBTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXByZXZfc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICItLU5PTkUtLSIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJIZWFwIFNpemUiKTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiUiIFBSSXU2NCAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1lbW9yeV9wcm9wcy5tZW1vcnlIZWFwc1tqampdLnNpemUpKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJNZW1vcnkgVHlwZXMiKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsCisgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfcHJvcHMubWVtb3J5VHlwZUNvdW50KTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgZm9yIChqamogPSAwOyBqamogPCBtZW1vcnlfcHJvcHMubWVtb3J5VHlwZUNvdW50OyBqamorKykgeworICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsIGpqaik7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcsIEFMSUdOX1JJR0hUKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiUHJvcGVydHkgRmxhZ3MiKTsKKyAgICAgICAgICAgICAgICBnZW5lcmljX3N0cmluZ1swXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYm9vbCBwcmV2X3NldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtZW1vcnlfcHJvcHMubWVtb3J5VHlwZXNbampqXS5wcm9wZXJ0eUZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0RFVklDRV9MT0NBTF9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIkRFVklDRV9MT0NBTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWVtb3J5X3Byb3BzLm1lbW9yeVR5cGVzW2pqal0ucHJvcGVydHlGbGFncyAmCisgICAgICAgICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2X3NldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIiB8ICIsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RybmNhdChnZW5lcmljX3N0cmluZywgIkhPU1RfVklTSUJMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWVtb3J5X3Byb3BzLm1lbW9yeVR5cGVzW2pqal0ucHJvcGVydHlGbGFncyAmCisgICAgICAgICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJldl9zZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICIgfCAiLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICJIT1NUX0NPSEVSRU5UIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICBwcmV2X3NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtZW1vcnlfcHJvcHMubWVtb3J5VHlwZXNbampqXS5wcm9wZXJ0eUZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ0FDSEVEX0JJVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJldl9zZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICIgfCAiLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICJIT1NUX0NBQ0hFRCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1NUUklOR19MRU5HVEggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWVtb3J5X3Byb3BzLm1lbW9yeVR5cGVzW2pqal0ucHJvcGVydHlGbGFncyAmCisgICAgICAgICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9MQVpJTFlfQUxMT0NBVEVEX0JJVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJldl9zZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICIgfCAiLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoZ2VuZXJpY19zdHJpbmcsICJMQVpJTFlfQUxMT0MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHByZXZfc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFwcmV2X3NldCkgeworICAgICAgICAgICAgICAgICAgICBzdHJuY2F0KGdlbmVyaWNfc3RyaW5nLCAiLS1OT05FLS0iLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgUHJpbnRCZWdpblRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiSGVhcCBJbmRleCIpOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5X3Byb3BzLm1lbW9yeVR5cGVzW2pqal0uaGVhcEluZGV4KTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBudW1fZXh0X3Byb3BzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiBleHRfcHJvcHM7CisKKyAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkRldmljZSBFeHRlbnNpb25zIik7CisgICAgICAgICAgICBzdGF0dXMgPSB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgcGh5c19kZXZpY2VzW2lpaV0sIE5VTEwsICZudW1fZXh0X3Byb3BzLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChWS19TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGQUlMRUQgcXVlcnlpbmcgbnVtYmVyIG9mIGV4dGVuc2lvbnMiKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZXh0X3Byb3BzKTsKKyAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChnZW5lcmljX3N0cmluZyk7CisgICAgICAgICAgICAgICAgZXh0X3Byb3BzLnJlc2l6ZShudW1fZXh0X3Byb3BzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB2a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgICAgIHBoeXNfZGV2aWNlc1tpaWldLCBOVUxMLCAmbnVtX2V4dF9wcm9wcywgZXh0X3Byb3BzLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgaWYgKFZLX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJGQUlMRUQgcXVlcnlpbmcgYWN0dWFsIGV4dGVuc2lvbiBpbmZvIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoampqID0gMDsgampqIDwgbnVtX2V4dF9wcm9wczsgampqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZ2VuZXJpY19zdHJpbmcsIE1BWF9TVFJJTkdfTEVOR1RIIC0gMSwgIlslZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgampqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudChleHRfcHJvcHNbampqXS5leHRlbnNpb25OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlYyBWZXJzICVkIiwgZXh0X3Byb3BzW2pqal0uc3BlY1ZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUHJpbnRFbmRUYWJsZSgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICB0aHJvdyBWVUxLQU5fQ0FOVF9GSU5EX0RSSVZFUjsKKyAgICB9Cit9CisKKy8vIFVzaW5nIHRoZSBwcmV2aW91c2x5IGRldGVybWluZSBpbmZvcm1hdGlvbiwgYXR0ZW1wdCB0byBjcmVhdGUgYSBsb2dpY2FsCisvLyBkZXZpY2UgZm9yIGVhY2ggcGh5c2ljYWwgZGV2aWNlIHdlIGZvdW5kLgordm9pZCBQcmludExvZ2ljYWxEZXZpY2VJbmZvKHZvaWQpIHsKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gZGV2aWNlX2NyZWF0ZV9pbmZvOworICAgIFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIHF1ZXVlX2NyZWF0ZV9pbmZvOworICAgIFZrUmVzdWx0IHN0YXR1cyA9IFZLX1NVQ0NFU1M7CisgICAgdWludDMyX3QgZGV2X2NvdW50ID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXMuc2l6ZSgpKTsKKyAgICBjaGFyIGdlbmVyaWNfc3RyaW5nW01BWF9TVFJJTkdfTEVOR1RIXTsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgUHJpbnRCZWdpblRhYmxlKCJMb2dpY2FsIERldmljZXMiLCAzKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJ2a0NyZWF0ZURldmljZSIpOworICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICIlZCIsIGRldl9jb3VudCk7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgIFByaW50VGFibGVFbGVtZW50KCIiKTsKKyAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICBnbG9iYWxfaXRlbXMubG9nX2RldmljZXMucmVzaXplKGRldl9jb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBkZXYgPSAwOyBkZXYgPCBkZXZfY291bnQ7IGRldisrKSB7CisgICAgICAgIG1lbXNldCgmZGV2aWNlX2NyZWF0ZV9pbmZvLCAwLCBzaXplb2YoVmtEZXZpY2VDcmVhdGVJbmZvKSk7CisgICAgICAgIGRldmljZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBOZXh0ID0gTlVMTDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBRdWV1ZUNyZWF0ZUluZm9zID0gTlVMTDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLmVuYWJsZWRMYXllckNvdW50ID0gMDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBOVUxMOworICAgICAgICBkZXZpY2VfY3JlYXRlX2luZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gMDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gTlVMTDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMTsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLmVuYWJsZWRMYXllckNvdW50ID0gMDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBwRW5hYmxlZExheWVyTmFtZXMgPSBOVUxMOworICAgICAgICBkZXZpY2VfY3JlYXRlX2luZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gMDsKKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gTlVMTDsKKworICAgICAgICBtZW1zZXQoJnF1ZXVlX2NyZWF0ZV9pbmZvLCAwLCBzaXplb2YoVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8pKTsKKyAgICAgICAgZmxvYXQgcXVldWVfcHJpb3JpdHkgPSAwOworICAgICAgICBxdWV1ZV9jcmVhdGVfaW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTzsKKyAgICAgICAgcXVldWVfY3JlYXRlX2luZm8ucE5leHQgPSBOVUxMOworICAgICAgICBxdWV1ZV9jcmVhdGVfaW5mby5xdWV1ZUNvdW50ID0gMTsKKyAgICAgICAgcXVldWVfY3JlYXRlX2luZm8ucFF1ZXVlUHJpb3JpdGllcyA9ICZxdWV1ZV9wcmlvcml0eTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IHF1ZXVlID0gMDsKKyAgICAgICAgICAgICBxdWV1ZSA8IGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXNbZGV2XS5xdWV1ZV9mYW1fcHJvcHMuc2l6ZSgpOworICAgICAgICAgICAgIHF1ZXVlKyspIHsKKyAgICAgICAgICAgIGlmICgwICE9IChnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzW2Rldl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXVlX2ZhbV9wcm9wc1txdWV1ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXVlRmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgIFZLX1FVRVVFX0dSQVBISUNTX0JJVCkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZV9jcmVhdGVfaW5mby5xdWV1ZUZhbWlseUluZGV4ID0gcXVldWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlX2NyZWF0ZV9pbmZvLnBRdWV1ZUNyZWF0ZUluZm9zID0gJnF1ZXVlX2NyZWF0ZV9pbmZvOworCisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsICJbJWRdIiwgZGV2KTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworCisgICAgICAgIHN0YXR1cyA9IHZrQ3JlYXRlRGV2aWNlKGdsb2JhbF9pdGVtcy5waHlzX2RldmljZXNbZGV2XS52dWxrYW5fcGh5c19kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VfY3JlYXRlX2luZm8sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxfaXRlbXMubG9nX2RldmljZXNbZGV2XSk7CisgICAgICAgIGlmIChWS19FUlJPUl9JTkNPTVBBVElCTEVfRFJJVkVSID09IHN0YXR1cykgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIkZBSUxFRDogSW5jb21wYXRpYmxlIERyaXZlciIpOworICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlkgPT0gc3RhdHVzKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRkFJTEVEOiBPdXQgb2YgSG9zdCBNZW1vcnkiKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoVktfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGdlbmVyaWNfc3RyaW5nLCBNQVhfU1RSSU5HX0xFTkdUSCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAiRkFJTEVEIDogVmtSZXN1bHQgY29kZSA9IDB4JXgiLCBzdGF0dXMpOworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZ2VuZXJpY19zdHJpbmcpOworICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJTVUNDRVNTRlVMIik7CisgICAgICAgIH0KKworICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisgICAgfQorCisgICAgUHJpbnRFbmRUYWJsZSgpOworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgdGhyb3coLTEpOworICAgIH0KK30KKworLy8gQ2xlYW4gdXAgYWxsIHRoZSBWdWxrYW4gaXRlbXMgd2UgcHJldmlvdXNseSBjcmVhdGVkIGFuZCBwcmludAorLy8gb3V0IGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMuCit2b2lkIFByaW50Q2xlYW51cEluZm8odm9pZCkgeworICAgIGNoYXIgZ2VuZXJpY19zdHJpbmdbTUFYX1NUUklOR19MRU5HVEhdOworICAgIHVpbnQzMl90IGRldl9jb3VudCA9CisgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihnbG9iYWxfaXRlbXMucGh5c19kZXZpY2VzLnNpemUoKSk7CisKKyAgICBQcmludEJlZ2luVGFibGUoIkNsZWFudXAiLCAzKTsKKworICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgIFByaW50VGFibGVFbGVtZW50KCJ2a0Rlc3Ryb3lEZXZpY2UiKTsKKyAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiJWQiLCBkZXZfY291bnQpOworICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgiIik7CisgICAgUHJpbnRFbmRUYWJsZVJvdygpOworICAgIGZvciAodWludDMyX3QgZGV2ID0gMDsgZGV2IDwgZGV2X2NvdW50OyBkZXYrKykgeworICAgICAgICB2a0Rlc3Ryb3lEZXZpY2UoZ2xvYmFsX2l0ZW1zLmxvZ19kZXZpY2VzW2Rldl0sIE5VTEwpOworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgICAgICBzbnByaW50ZihnZW5lcmljX3N0cmluZywgTUFYX1NUUklOR19MRU5HVEggLSAxLCAiWyVkXSIsIGRldik7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KGdlbmVyaWNfc3RyaW5nLCBBTElHTl9SSUdIVCk7CisgICAgICAgIFByaW50VGFibGVFbGVtZW50KCJTVUNDRVNTRlVMIik7CisgICAgICAgIFByaW50RW5kVGFibGVSb3coKTsKKyAgICB9CisKKyAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICBQcmludFRhYmxlRWxlbWVudCgidmtEZXN0cm95SW5zdGFuY2UiKTsKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShnbG9iYWxfaXRlbXMuaW5zdGFuY2UsIE5VTEwpOworICAgIFByaW50VGFibGVFbGVtZW50KCJTVUNDRVNTRlVMIik7CisgICAgUHJpbnRUYWJsZUVsZW1lbnQoIiIpOworICAgIFByaW50RW5kVGFibGVSb3coKTsKKworICAgIFByaW50RW5kVGFibGUoKTsKK30KKworLy8gUnVuIGFueSBleHRlcm5hbCB0ZXN0cyB3ZSBjYW4gZmluZCwgYW5kIHByaW50IHRoZSByZXN1bHRzIG9mIHRob3NlCisvLyB0ZXN0cy4KK3ZvaWQgUHJpbnRUZXN0UmVzdWx0cyh2b2lkKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworICAgIEJlZ2luU2VjdGlvbigiRXh0ZXJuYWwgVGVzdHMiKTsKKyAgICBpZiAoZ2xvYmFsX2l0ZW1zLnNka19mb3VuZCkgeworICAgICAgICBzdGQ6OnN0cmluZyBjdWJlX2V4ZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbWQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBnbG9iYWxfaXRlbXMuc2RrX3BhdGg7CisKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgY3ViZV9leGUgPSAiY3ViZS5leGUiOworCisjaWYgX1dJTjY0CisgICAgICAgIHBhdGggKz0gIlxcQmluIjsKKyNlbHNlCisgICAgICAgIHBhdGggKz0gIlxcQmluMzIiOworI2VuZGlmCisjZWxzZSAvLyBnY2MKKyAgICAgICAgY3ViZV9leGUgPSAiLi9jdWJlIjsKKyAgICAgICAgcGF0aCArPSAiLy4uL2V4YW1wbGVzL2J1aWxkIjsKKyNlbmRpZgorICAgICAgICBmdWxsX2NtZCA9IGN1YmVfZXhlOworICAgICAgICBmdWxsX2NtZCArPSAiIC0tYyAxMDAiOworCisgICAgICAgIFByaW50QmVnaW5UYWJsZSgiQ3ViZSIsIDIpOworCisgICAgICAgIFByaW50QmVnaW5UYWJsZVJvdygpOworICAgICAgICBQcmludFRhYmxlRWxlbWVudChmdWxsX2NtZCk7CisgICAgICAgIGludCB0ZXN0X3Jlc3VsdCA9IFJ1blRlc3RJbkRpcmVjdG9yeShwYXRoLCBjdWJlX2V4ZSwgZnVsbF9jbWQpOworICAgICAgICBpZiAodGVzdF9yZXN1bHQgPT0gMCkgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlNVQ0NFU1NGVUwiKTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXN0X3Jlc3VsdCA9PSAxKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTm90IEZvdW5kIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRkFJTEVEISIpOworICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgZnVsbF9jbWQgKz0gIiAtLXZhbGlkYXRlIjsKKworICAgICAgICBQcmludEJlZ2luVGFibGVSb3coKTsKKyAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoZnVsbF9jbWQpOworICAgICAgICB0ZXN0X3Jlc3VsdCA9IFJ1blRlc3RJbkRpcmVjdG9yeShwYXRoLCBjdWJlX2V4ZSwgZnVsbF9jbWQpOworICAgICAgICBpZiAodGVzdF9yZXN1bHQgPT0gMCkgeworICAgICAgICAgICAgUHJpbnRUYWJsZUVsZW1lbnQoIlNVQ0NFU1NGVUwiKTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXN0X3Jlc3VsdCA9PSAxKSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiTm90IEZvdW5kIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQcmludFRhYmxlRWxlbWVudCgiRkFJTEVEISIpOworICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBQcmludEVuZFRhYmxlUm93KCk7CisKKyAgICAgICAgUHJpbnRFbmRUYWJsZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50U3RhbmRhcmRUZXh0KCJObyBTREsgZm91bmQgYnkgVklBLCBza2lwcGluZyB0ZXN0IHNlY3Rpb24iKTsKKyAgICB9CisgICAgRW5kU2VjdGlvbigpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICB0aHJvdygtMSk7CisgICAgfQorfQorCisvLyBQcmludCBpbmZvcm1hdGlvbiBvbiBhbnkgVnVsa2FuIGNvbW1hbmRzIHdlIGNhbiAob3IgY2FuJ3QpIGV4ZWN1dGUuCit2b2lkIFByaW50VnVsa2FuSW5mbyh2b2lkKSB7CisgICAgQmVnaW5TZWN0aW9uKCJWdWxrYW4gQVBJIENhbGxzIik7CisKKyAgICBQcmludEluc3RhbmNlSW5mbygpOworICAgIFByaW50UGh5c0RldkluZm8oKTsKKyAgICBQcmludExvZ2ljYWxEZXZpY2VJbmZvKCk7CisgICAgUHJpbnRDbGVhbnVwSW5mbygpOworCisgICAgRW5kU2VjdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvdmstdnRnZW5lcmF0ZS5weSBiL3ZrLXZ0Z2VuZXJhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODlkOWUzYwotLS0gL2Rldi9udWxsCisrKyBiL3ZrLXZ0Z2VuZXJhdGUucHkKQEAgLTAsMCArMSwyMjMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogQ2hpYS1JIFd1IDxvbHZAbHVuYXJnLmNvbT4KKyMgQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorIyBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKworaW1wb3J0IHN5cworaW1wb3J0IHZ1bGthbgorCitkZWYgZ2VuZXJhdGVfZ2V0X3Byb2NfYWRkcl9jaGVjayhuYW1lKToKKyAgICByZXR1cm4gIiAgICBpZiAoISVzIHx8ICVzWzBdICE9ICd2JyB8fCAlc1sxXSAhPSAnaycpXG4iIFwKKyAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIE5VTEw7IiAlICgobmFtZSwpICogMykKKworY2xhc3MgU3ViY29tbWFuZChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmd2KToKKyAgICAgICAgc2VsZi5hcmd2ID0gYXJndgorICAgICAgICBzZWxmLmhlYWRlcnMgPSB2dWxrYW4uaGVhZGVycworICAgICAgICBzZWxmLnByb3RvcyA9IHZ1bGthbi5wcm90b3MKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0gdnVsa2FuLmV4dGVuc2lvbnMKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHByaW50KHNlbGYuZ2VuZXJhdGUoKSkKKworICAgIGRlZiBnZW5lcmF0ZShzZWxmKToKKyAgICAgICAgY29weXJpZ2h0ID0gc2VsZi5nZW5lcmF0ZV9jb3B5cmlnaHQoKQorICAgICAgICBoZWFkZXIgPSBzZWxmLmdlbmVyYXRlX2hlYWRlcigpCisgICAgICAgIGJvZHkgPSBzZWxmLmdlbmVyYXRlX2JvZHkoKQorICAgICAgICBmb290ZXIgPSBzZWxmLmdlbmVyYXRlX2Zvb3RlcigpCisKKyAgICAgICAgY29udGVudHMgPSBbXQorICAgICAgICBpZiBjb3B5cmlnaHQ6CisgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoY29weXJpZ2h0KQorICAgICAgICBpZiBoZWFkZXI6CisgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoaGVhZGVyKQorICAgICAgICBpZiBib2R5OgorICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKGJvZHkpCisgICAgICAgIGlmIGZvb3RlcjoKKyAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChmb290ZXIpCisKKyAgICAgICAgcmV0dXJuICJcblxuIi5qb2luKGNvbnRlbnRzKQorCisgICAgZGVmIGdlbmVyYXRlX2NvcHlyaWdodChzZWxmKToKKyAgICAgICAgcmV0dXJuICIiIi8qIFRISVMgRklMRSBJUyBHRU5FUkFURUQgQlkgdmstdnRnZW5lcmF0ZS5weS4gIERPIE5PVCBFRElULiAqLworCisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKi8iIiIKKworICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZik6CisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oWyIjaW5jbHVkZSA8IiArIGggKyAiPiIgZm9yIGggaW4gc2VsZi5oZWFkZXJzXSkKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2VuZXJhdGVfZm9vdGVyKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEljZER1bW15RW50cnlwb2ludHNTdWJjb21tYW5kKFN1YmNvbW1hbmQpOgorICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLmFyZ3YpID09IDE6CisgICAgICAgICAgICBzZWxmLnByZWZpeCA9IHNlbGYuYXJndlswXQorICAgICAgICAgICAgc2VsZi5xdWFsID0gInN0YXRpYyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJlZml4ID0gInZrIgorICAgICAgICAgICAgc2VsZi5xdWFsID0gIiIKKworICAgICAgICBzdXBlcigpLnJ1bigpCisKKyAgICBkZWYgZ2VuZXJhdGVfaGVhZGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gIiNpbmNsdWRlIFwiaWNkLmhcIiIKKworICAgIGRlZiBfZ2VuZXJhdGVfc3R1Yl9kZWNsKHNlbGYsIHByb3RvKToKKyAgICAgICAgaWYgcHJvdG8ubmFtZSA9PSAiR2V0SW5zdGFuY2VQcm9jQWRkciI6CisgICAgICAgICAgICByZXR1cm4gcHJvdG8uY19wcmV0dHlfZGVjbChzZWxmLnByZWZpeCArICJfaWNkIiArIHByb3RvLm5hbWUsIGF0dHI9IklDRF9FWFBPUlQgVktBUEkiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHByb3RvLmNfcHJldHR5X2RlY2woc2VsZi5wcmVmaXggKyBwcm90by5uYW1lLCBhdHRyPSJWS0FQSSIpCisKKyAgICBkZWYgX2dlbmVyYXRlX3N0dWJzKHNlbGYpOgorICAgICAgICBzdHVicyA9IFtdCisgICAgICAgIGV4Y2x1c2lvbnMgPSBbICdDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUicsICdDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUicsICdDcmVhdGVNaXJTdXJmYWNlS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFInLCAnR2V0UGh5c2ljYWxEZXZpY2VNaXJQcmVzZW50YXRpb25TdXBwb3J0S0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFInLCAnR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ0dldERpc3BsYXlQbGFuZVN1cHBvcnRlZERpc3BsYXlzS0hSJywgJ0dldERpc3BsYXlNb2RlUHJvcGVydGllc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVEaXNwbGF5TW9kZUtIUicsICdHZXREaXNwbGF5UGxhbmVDYXBhYmlsaXRpZXNLSFInLCAnQ3JlYXRlRGlzcGxheVBsYW5lU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVTaGFyZWRTd2FwY2hhaW5zS0hSJ10KKyAgICAgICAgZm9yIHByb3RvIGluIHNlbGYucHJvdG9zOgorICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBpbiBleGNsdXNpb25zOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBkZWNsID0gc2VsZi5fZ2VuZXJhdGVfc3R1Yl9kZWNsKHByb3RvKQorICAgICAgICAgICAgaWYgcHJvdG8ucmV0ICE9ICJ2b2lkIjoKKyAgICAgICAgICAgICAgICBzdG10ID0gIiAgICByZXR1cm4gVktfRVJST1JfVU5LTk9XTjtcbiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RtdCA9ICIiCisKKyAgICAgICAgICAgIHN0dWJzLmFwcGVuZCgiJXMgJXNcbntcbiVzfSIgJSAoc2VsZi5xdWFsLCBkZWNsLCBzdG10KSkKKworICAgICAgICByZXR1cm4gIlxuXG4iLmpvaW4oc3R1YnMpCisKKyAgICBkZWYgZ2VuZXJhdGVfYm9keShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dlbmVyYXRlX3N0dWJzKCkKKworY2xhc3MgSWNkR2V0UHJvY0FkZHJTdWJjb21tYW5kKEljZER1bW15RW50cnlwb2ludHNTdWJjb21tYW5kKToKKyAgICBkZWYgZ2VuZXJhdGVfaGVhZGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gIlxuIi5qb2luKFsiI2luY2x1ZGUgPHN0cmluZy5oPiIsICIjaW5jbHVkZSBcImljZC5oXCIiXSkKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gc2VsZi5wcm90b3M6CisgICAgICAgICAgICBpZiBwcm90by5uYW1lID09ICJHZXREZXZpY2VQcm9jQWRkciI6CisgICAgICAgICAgICAgICAgZ3BhX3Byb3RvID0gcHJvdG8KKyAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgPT0gIkdldEluc3RhbmNlUHJvY0FkZHIiOgorICAgICAgICAgICAgICAgIGdwYV9pbnN0YW5jZV9wcm90byA9IHByb3RvCisKKyAgICAgICAgZ3BhX2luc3RhbmNlX2RlY2wgPSBzZWxmLl9nZW5lcmF0ZV9zdHViX2RlY2woZ3BhX2luc3RhbmNlX3Byb3RvKQorICAgICAgICBncGFfZGVjbCA9IHNlbGYuX2dlbmVyYXRlX3N0dWJfZGVjbChncGFfcHJvdG8pCisgICAgICAgIGdwYV9wbmFtZSA9IGdwYV9wcm90by5wYXJhbXNbLTFdLm5hbWUKKworICAgICAgICBsb29rdXBzID0gW10KKyAgICAgICAgZXhjbHVzaW9ucyA9IFsgJ0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSJywgJ0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSJywgJ0NyZWF0ZU1pclN1cmZhY2VLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsICdHZXRQaHlzaWNhbERldmljZU1pclByZXNlbnRhdGlvblN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UHJvcGVydGllc0tIUicsICdHZXRQaHlzaWNhbERldmljZURpc3BsYXlQbGFuZVByb3BlcnRpZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAnR2V0RGlzcGxheVBsYW5lU3VwcG9ydGVkRGlzcGxheXNLSFInLCAnR2V0RGlzcGxheU1vZGVQcm9wZXJ0aWVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZURpc3BsYXlNb2RlS0hSJywgJ0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUicsICdDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZVNoYXJlZFN3YXBjaGFpbnNLSFInXQorCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgaWYgZXh0LmlmZGVmOgorICAgICAgICAgICAgICAgIGxvb2t1cHMuYXBwZW5kKCIjaWZkZWYgJXMiICUgZXh0LmlmZGVmKQorICAgICAgICAgICAgZm9yIHByb3RvIGluIGV4dC5wcm90b3M6CisgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBpbiBleGNsdXNpb25zOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxvb2t1cHMuYXBwZW5kKCJpZiAoIXN0cmNtcCglcywgXCIlc1wiKSkiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIChncGFfcG5hbWUsIHByb3RvLm5hbWUpKQorICAgICAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgIT0gIkdldEluc3RhbmNlUHJvY0FkZHIiOgorICAgICAgICAgICAgICAgICAgICBsb29rdXBzLmFwcGVuZCgiICAgIHJldHVybiAoJXMpICVzJXM7IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAoZ3BhX3Byb3RvLnJldCwgc2VsZi5wcmVmaXgsIHByb3RvLm5hbWUpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cHMuYXBwZW5kKCIgICAgcmV0dXJuICglcykgJXMlczsiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIChncGFfcHJvdG8ucmV0LCBzZWxmLnByZWZpeCwgIl9pY2RHZXRJbnN0YW5jZVByb2NBZGRyIikpCisgICAgICAgICAgICBpZiBleHQuaWZkZWY6CisgICAgICAgICAgICAgICAgbG9va3Vwcy5hcHBlbmQoIiNlbmRpZiAvKiAlcyAqLyIgJSBleHQuaWZkZWYpCisKKyAgICAgICAgYm9keSA9IFtdCisgICAgICAgIGJvZHkuYXBwZW5kKCIlcyAlcyIgJSAoc2VsZi5xdWFsLCBncGFfaW5zdGFuY2VfZGVjbCkpCisgICAgICAgIGJvZHkuYXBwZW5kKCJ7IikKKyAgICAgICAgYm9keS5hcHBlbmQoZ2VuZXJhdGVfZ2V0X3Byb2NfYWRkcl9jaGVjayhncGFfcG5hbWUpKQorICAgICAgICBib2R5LmFwcGVuZCgiIikKKyAgICAgICAgYm9keS5hcHBlbmQoIiAgICAlcyArPSAyOyIgJSBncGFfcG5hbWUpCisgICAgICAgIGJvZHkuYXBwZW5kKCIgICAgJXMiICUgIlxuICAgICIuam9pbihsb29rdXBzKSkKKyAgICAgICAgYm9keS5hcHBlbmQoIiIpCisgICAgICAgIGJvZHkuYXBwZW5kKCIgICAgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgYm9keS5hcHBlbmQoIn0iKQorICAgICAgICBib2R5LmFwcGVuZCgiIikKKworICAgICAgICBib2R5LmFwcGVuZCgiJXMgJXMiICUgKHNlbGYucXVhbCwgZ3BhX2RlY2wpKQorICAgICAgICBib2R5LmFwcGVuZCgieyIpCisgICAgICAgIGJvZHkuYXBwZW5kKGdlbmVyYXRlX2dldF9wcm9jX2FkZHJfY2hlY2soZ3BhX3BuYW1lKSkKKyAgICAgICAgYm9keS5hcHBlbmQoIiIpCisgICAgICAgIGJvZHkuYXBwZW5kKCIgICAgJXMgKz0gMjsiICUgZ3BhX3BuYW1lKQorICAgICAgICBib2R5LmFwcGVuZCgiICAgICVzIiAlICJcbiAgICAiLmpvaW4obG9va3VwcykpCisgICAgICAgIGJvZHkuYXBwZW5kKCIiKQorICAgICAgICBib2R5LmFwcGVuZCgiICAgIHJldHVybiBOVUxMOyIpCisgICAgICAgIGJvZHkuYXBwZW5kKCJ9IikKKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGJvZHkpCisKK2RlZiBtYWluKCk6CisKKyAgICB3c2kgPSB7CisgICAgICAgICAgICAiV2luMzIiLAorICAgICAgICAgICAgIkFuZHJvaWQiLAorICAgICAgICAgICAgIlhjYiIsCisgICAgICAgICAgICAiWGxpYiIsCisgICAgICAgICAgICAiV2F5bGFuZCIsCisgICAgICAgICAgICAiTWlyIgorICAgIH0KKworICAgIHN1YmNvbW1hbmRzID0geworICAgICAgICAgICAgImljZC1kdW1teS1lbnRyeXBvaW50cyI6IEljZER1bW15RW50cnlwb2ludHNTdWJjb21tYW5kLAorICAgICAgICAgICAgImljZC1nZXQtcHJvYy1hZGRyIjogSWNkR2V0UHJvY0FkZHJTdWJjb21tYW5kCisgICAgfQorCisgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDMgb3Igc3lzLmFyZ3ZbMV0gbm90IGluIHdzaSBvciBzeXMuYXJndlsyXSBub3QgaW4gc3ViY29tbWFuZHM6CisgICAgICAgIHByaW50KCJVc2FnZTogJXMgPHdzaT4gPHN1YmNvbW1hbmQ+IFtvcHRpb25zXSIgJSBzeXMuYXJndlswXSkKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQoIkF2YWlsYWJsZSBzdWNvbW1hbmRzIGFyZTogJXMiICUgIiAiLmpvaW4oc3ViY29tbWFuZHMpKQorICAgICAgICBleGl0KDEpCisKKyAgICBzdWJjbWQgPSBzdWJjb21tYW5kc1tzeXMuYXJndlsyXV0oc3lzLmFyZ3ZbMzpdKQorICAgIHN1YmNtZC5ydW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdmstdnRsYXllci1nZW5lcmF0ZS5weSBiL3ZrLXZ0bGF5ZXItZ2VuZXJhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWUzODczYQotLS0gL2Rldi9udWxsCisrKyBiL3ZrLXZ0bGF5ZXItZ2VuZXJhdGUucHkKQEAgLTAsMCArMSwxMzY3IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIFZLCisjCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbkBsdW5hcmcuY29tPgorIyBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QGx1bmFyZy5jb20+CisjIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorIyBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyMgQXV0aG9yOiBNaWtlIFN0cm95YW4gPHN0cm95YW5AbHVuYXJnLmNvbT4KKyMgQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlATHVuYXJHLmNvbT4KKyMgQXV0aG9yOiBDaGlhLUkgV3UgPG9sdkBsdW5hcmcuY29tPgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCitpbXBvcnQgdnVsa2FuCitpbXBvcnQgdmtfaGVscGVyX2FwaV9kdW1wCitmcm9tIHNvdXJjZV9saW5lX2luZm8gaW1wb3J0IHNvdXJjZWxpbmVpbmZvCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAorCitkZWYgcHJvdG9faXNfZ2xvYmFsKHByb3RvKToKKyAgICBnbG9iYWxfZnVuY3Rpb25fbmFtZXMgPSBbCisgICAgICAgICJDcmVhdGVJbnN0YW5jZSIsCisgICAgICAgICJFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyIsCisgICAgICAgICJFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMiLAorICAgICAgICAiRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzIiwKKyAgICAgICAgIkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiLAorICAgICAgICAiQ3JlYXRlWGNiU3VyZmFjZUtIUiIsCisgICAgICAgICJHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLAorICAgICAgICAiQ3JlYXRlWGxpYlN1cmZhY2VLSFIiLAorICAgICAgICAiR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsCisgICAgICAgICJDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsCisgICAgICAgICJHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwKKyAgICAgICAgIkNyZWF0ZU1pclN1cmZhY2VLSFIiLAorICAgICAgICAiR2V0UGh5c2ljYWxEZXZpY2VNaXJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwKKyAgICAgICAgIkNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSIiwKKyAgICAgICAgIkNyZWF0ZVdpbjMyU3VyZmFjZUtIUiIsCisgICAgICAgICJHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIKKyAgICBdCisgICAgaWYgcHJvdG8ucGFyYW1zWzBdLnR5ID09ICJWa0luc3RhbmNlIiBvciBwcm90by5wYXJhbXNbMF0udHkgPT0gIlZrUGh5c2ljYWxEZXZpY2UiIG9yIHByb3RvLm5hbWUgaW4gZ2xvYmFsX2Z1bmN0aW9uX25hbWVzOgorICAgICAgIHJldHVybiBUcnVlCisgICAgZWxzZToKKyAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIHdzaV9uYW1lKGV4dF9uYW1lKToKKyAgICB3c2lfcHJlZml4ID0gIiIKKyAgICBpZiAnWGNiJyBpbiBleHRfbmFtZToKKyAgICAgICAgd3NpX3ByZWZpeCA9ICdYQ0InCisgICAgZWxpZiAnWGxpYicgaW4gZXh0X25hbWU6CisgICAgICAgIHdzaV9wcmVmaXggPSAnWExJQicKKyAgICBlbGlmICdXaW4zMicgaW4gZXh0X25hbWU6CisgICAgICAgIHdzaV9wcmVmaXggPSAnV0lOMzInCisgICAgZWxpZiAnTWlyJyBpbiBleHRfbmFtZToKKyAgICAgICAgd3NpX3ByZWZpeCA9ICdNSVInCisgICAgZWxpZiAnV2F5bGFuZCcgaW4gZXh0X25hbWU6CisgICAgICAgIHdzaV9wcmVmaXggPSAnV0FZTEFORCcKKyAgICBlbGlmICdBbmRyb2lkJyBpbiBleHRfbmFtZToKKyAgICAgICAgd3NpX3ByZWZpeCA9ICdBTkRST0lEJworICAgIGVsc2U6CisgICAgICAgIHdzaV9wcmVmaXggPSAnJworICAgIHJldHVybiB3c2lfcHJlZml4CisKK2RlZiB3c2lfaWZkZWYoZXh0X25hbWUpOgorICAgIHdzaV9wcmVmaXggPSB3c2lfbmFtZShleHRfbmFtZSkKKyAgICBpZiBub3Qgd3NpX3ByZWZpeDoKKyAgICAgICAgcmV0dXJuICcnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICIjaWZkZWYgVktfVVNFX1BMQVRGT1JNXyVzX0tIUiIgJSB3c2lfcHJlZml4CisKK2RlZiB3c2lfZW5kaWYoZXh0X25hbWUpOgorICAgIHdzaV9wcmVmaXggPSB3c2lfbmFtZShleHRfbmFtZSkKKyAgICBpZiBub3Qgd3NpX3ByZWZpeDoKKyAgICAgICAgcmV0dXJuICcnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICIjZW5kaWYgIC8vIFZLX1VTRV9QTEFURk9STV8lc19LSFIiICUgd3NpX3ByZWZpeAorCitkZWYgZ2VuZXJhdGVfZ2V0X3Byb2NfYWRkcl9jaGVjayhuYW1lKToKKyAgICByZXR1cm4gIiAgICBpZiAoISVzIHx8ICVzWzBdICE9ICd2JyB8fCAlc1sxXSAhPSAnaycpXG4iIFwKKyAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIE5VTEw7IiAlICgobmFtZSwpICogMykKKworIyBQYXJzZSBjb21wbGV0ZSBzdHJ1Y3QgY2hhaW4gYW5kIGFkZCBhbnkgbmV3IG5kb191c2VzIHRvIHRoZSBkaWN0CitkZWYgZ2F0aGVyX29iamVjdF91c2VzX2luX3N0cnVjdChvYmpfbGlzdCwgc3RydWN0X3R5cGUpOgorICAgIHN0cnVjdF91c2VzID0ge30KKyAgICBpZiB2a19oZWxwZXJfYXBpX2R1bXAudHlwZWRlZl9yZXZfZGljdFtzdHJ1Y3RfdHlwZV0gaW4gdmtfaGVscGVyX2FwaV9kdW1wLnN0cnVjdF9kaWN0OgorICAgICAgICBzdHJ1Y3RfdHlwZSA9IHZrX2hlbHBlcl9hcGlfZHVtcC50eXBlZGVmX3Jldl9kaWN0W3N0cnVjdF90eXBlXQorICAgICAgICAjIFBhcnNlIGVsZW1lbnRzIG9mIHRoaXMgc3RydWN0IHBhcmFtIHRvIGlkZW50aWZ5IG9iamVjdHMgYW5kL29yIGFycmF5cyBvZiBvYmplY3RzCisgICAgICAgIGZvciBtIGluIHNvcnRlZCh2a19oZWxwZXJfYXBpX2R1bXAuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdKToKKyAgICAgICAgICAgIGFycmF5X2xlbiA9ICIlcyIgJSAoc3RyKHZrX2hlbHBlcl9hcGlfZHVtcC5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbV1bJ2FycmF5X3NpemUnXSkpCisgICAgICAgICAgICBiYXNlX3R5cGUgPSB2a19oZWxwZXJfYXBpX2R1bXAuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdW21dWyd0eXBlJ10KKyAgICAgICAgICAgIG1lbV9uYW1lID0gdmtfaGVscGVyX2FwaV9kdW1wLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVttXVsnbmFtZSddCisgICAgICAgICAgICBpZiBhcnJheV9sZW4gIT0gJzAnOgorICAgICAgICAgICAgICAgIG1lbV9uYW1lID0gIiVzWyVzXSIgJSAobWVtX25hbWUsIGFycmF5X2xlbikKKyAgICAgICAgICAgIGlmIGJhc2VfdHlwZSBpbiBvYmpfbGlzdDoKKyAgICAgICAgICAgICAgICAjaWYgYXJyYXlfbGVuIG5vdCBpbiBuZG9fdXNlczoKKyAgICAgICAgICAgICAgICAjICAgIHN0cnVjdF91c2VzW2FycmF5X2xlbl0gPSBbXQorICAgICAgICAgICAgICAgICNzdHJ1Y3RfdXNlc1thcnJheV9sZW5dLmFwcGVuZCgiJXMlcywlcyIgJSAobmFtZV9wcmVmaXgsIHN0cnVjdF9uYW1lLCBiYXNlX3R5cGUpKQorICAgICAgICAgICAgICAgIHN0cnVjdF91c2VzW21lbV9uYW1lXSA9IGJhc2VfdHlwZQorICAgICAgICAgICAgZWxpZiB2a19oZWxwZXJfYXBpX2R1bXAuaXNfdHlwZShiYXNlX3R5cGUsICdzdHJ1Y3QnKToKKyAgICAgICAgICAgICAgICBzdWJfdXNlcyA9IGdhdGhlcl9vYmplY3RfdXNlc19pbl9zdHJ1Y3Qob2JqX2xpc3QsIGJhc2VfdHlwZSkKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3ViX3VzZXMpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0X3VzZXNbbWVtX25hbWVdID0gc3ViX3VzZXMKKyAgICByZXR1cm4gc3RydWN0X3VzZXMKKworY2xhc3MgU3ViY29tbWFuZChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmd2KToKKyAgICAgICAgc2VsZi5hcmd2ID0gYXJndgorICAgICAgICBzZWxmLmhlYWRlcnMgPSB2dWxrYW4uaGVhZGVycworICAgICAgICBzZWxmLnByb3RvcyA9IHZ1bGthbi5wcm90b3MKKyAgICAgICAgc2VsZi5ub19hZGRyID0gRmFsc2UKKyAgICAgICAgc2VsZi5sYXllcl9uYW1lID0gIiIKKyAgICAgICAgc2VsZi5saW5laW5mbyA9IHNvdXJjZWxpbmVpbmZvKCkKKyAgICAgICAgc2VsZi53c2kgPSBzeXMuYXJndlsxXQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgcHJpbnQoc2VsZi5nZW5lcmF0ZSgpKQorCisgICAgZGVmIGdlbmVyYXRlKHNlbGYpOgorICAgICAgICBjb3B5cmlnaHQgPSBzZWxmLmdlbmVyYXRlX2NvcHlyaWdodCgpCisgICAgICAgIGhlYWRlciA9IHNlbGYuZ2VuZXJhdGVfaGVhZGVyKCkKKyAgICAgICAgYm9keSA9IHNlbGYuZ2VuZXJhdGVfYm9keSgpCisgICAgICAgIGZvb3RlciA9IHNlbGYuZ2VuZXJhdGVfZm9vdGVyKCkKKworICAgICAgICBjb250ZW50cyA9IFtdCisgICAgICAgIGlmIGNvcHlyaWdodDoKKyAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChjb3B5cmlnaHQpCisgICAgICAgIGlmIGhlYWRlcjoKKyAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChoZWFkZXIpCisgICAgICAgIGlmIGJvZHk6CisgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoYm9keSkKKyAgICAgICAgaWYgZm9vdGVyOgorICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKGZvb3RlcikKKworICAgICAgICByZXR1cm4gIlxuXG4iLmpvaW4oY29udGVudHMpCisKKyAgICBkZWYgZ2VuZXJhdGVfY29weXJpZ2h0KHNlbGYpOgorICAgICAgICByZXR1cm4gIiIiLyogVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gIERPIE5PVCBFRElULiAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QGx1bmFyZy5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBNaWtlIFN0cm95YW4gPG1pa2VAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogVG9ueSBCYXJib3VyIDx0b255QEx1bmFyRy5jb20+CisgKi8iIiIKKworICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZik6CisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oWyIjaW5jbHVkZSA8IiArIGggKyAiPiIgZm9yIGggaW4gc2VsZi5oZWFkZXJzXSkKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2VuZXJhdGVfZm9vdGVyKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICAjIFJldHVybiBzZXQgb2YgcHJpbnRmICclJyBxdWFsaWZpZXIgYW5kIGlucHV0IHRvIHRoYXQgcXVhbGlmaWVyCisgICAgZGVmIF9nZXRfcHJpbnRmX3BhcmFtcyhzZWxmLCB2a190eXBlLCBuYW1lLCBvdXRwdXRfcGFyYW0sIGNvdW50KToKKyAgICAgICAgIyBUT0RPIDogTmVlZCBFTlVNIGFuZCBTVFJVQ1QgY2hlY2tzIGhlcmUKKyAgICAgICAgaWYgdmtfaGVscGVyX2FwaV9kdW1wLmlzX3R5cGUodmtfdHlwZSwgJ2VudW0nKTojIl9UWVBFIiBpbiB2a190eXBlOiAjIFRPRE8gOiBUaGlzIHNob3VsZCBiZSBnZW5lcmljIEVOVU0gY2hlY2sKKyAgICAgICAgICAgIHJldHVybiAoIiVzIiwgInN0cmluZ18lcyglcykiICUgKHZrX3R5cGUucmVwbGFjZSgnY29uc3QgJywgJycpLnN0cmlwKCcqJyksIG5hbWUpLCAnJykKKyAgICAgICAgaWYgImNoYXIqIiA9PSB2a190eXBlOgorICAgICAgICAgICAgcmV0dXJuICgiJXMiLCBuYW1lLCAnJykKKyAgICAgICAgaWYgInVpbnQ2NCIgaW4gdmtfdHlwZToKKyAgICAgICAgICAgIGlmICcqJyBpbiB2a190eXBlOgorICAgICAgICAgICAgICAgIHJldHVybiAoIjB4JXAiLCAiKiVzIiAlIG5hbWUsICcqJykKKyAgICAgICAgICAgIHJldHVybiAoIjB4JXAiLCBuYW1lLCAnJykKKyAgICAgICAgaWYgdmtfdHlwZS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSBpbiB2dWxrYW4ub2JqZWN0X25vbl9kaXNwYXRjaF9saXN0OgorICAgICAgICAgICAgI1RPRE8gOiBjYXN0IHRoZXNlIHR5cGVzIGRpZmZlcmVudGx5IGZvciAzMiBiaXQgd2luZG93cyBidWlsZHMKKyAgICAgICAgICAgIGlmICcqJyBpbiB2a190eXBlOgorICAgICAgICAgICAgICAgIHJldHVybiAoIjB4JXAiLCAiSGFuZGxlQ2FzdCgqJXMpIiAlIG5hbWUsICcqJykKKyAgICAgICAgICAgIHJldHVybiAoIjB4JXAiLCAiSGFuZGxlQ2FzdCglcykiICUgbmFtZSwgJycpCisgICAgICAgIGlmIHZrX3R5cGUuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykgaW4gdnVsa2FuLm9iamVjdF9kaXNwYXRjaF9saXN0OgorICAgICAgICAgICAgaWYgJyonIGluIHZrX3R5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiMHglcCIsICJIYW5kbGVDYXN0KColcykiICUgbmFtZSwgJyonKQorICAgICAgICAgICAgcmV0dXJuICgiMHglcCIsICJIYW5kbGVDYXN0KCVzKSIgJSBuYW1lLCAnJykKKyAgICAgICAgaWYgInNpemUiIGluIHZrX3R5cGUubG93ZXIoKSBvciAibWFzayIgaW4gdmtfdHlwZS5sb3dlcigpOgorICAgICAgICAgICAgaWYgJyonIGluIHZrX3R5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiMHglcCIsICIqJXMiICUgbmFtZSwgJyonKQorICAgICAgICAgICAgcmV0dXJuICgiMHglcCIsICIlcyIgJSBuYW1lLCAnJykKKyAgICAgICAgaWYgImZsb2F0IiBpbiB2a190eXBlOgorICAgICAgICAgICAgaWYgJ1snIGluIHZrX3R5cGU6ICMgaGFuZGxlIGFycmF5LCBjdXJyZW50IGhhcmQtY29kZWQgdG8gNCAoVE9ETzogTWFrZSB0aGlzIGR5bmFtaWMpCisgICAgICAgICAgICAgICAgcmV0dXJuICgiWyVpLCAlaSwgJWksICVpXSIsICciWyIgPDwgJXNbMF0gPDwgIiwiIDw8ICVzWzFdIDw8ICIsIiA8PCAlc1syXSA8PCAiLCIgPDwgJXNbM10gPDwgIl0iJyAlIChuYW1lLCBuYW1lLCBuYW1lLCBuYW1lKSwgJycpCisgICAgICAgICAgICByZXR1cm4gKCIlZiIsIG5hbWUsICcnKQorICAgICAgICBpZiAiYm9vbCIgaW4gdmtfdHlwZS5sb3dlcigpIG9yICd4Y2JfcmFuZHJfY3J0Y190JyBpbiB2a190eXBlOgorICAgICAgICAgICAgcmV0dXJuICgiJXUiLCBuYW1lLCAnJykKKyAgICAgICAgaWYgVHJ1ZSBpbiBbdCBpbiB2a190eXBlLmxvd2VyKCkgZm9yIHQgaW4gWyJpbnQiLCAiZmxhZ3MiLCAibWFzayIsICJ4Y2Jfd2luZG93X3QiXV06CisgICAgICAgICAgICBpZiAnWycgaW4gdmtfdHlwZTogIyBoYW5kbGUgYXJyYXksIGN1cnJlbnQgaGFyZC1jb2RlZCB0byA0IChUT0RPOiBNYWtlIHRoaXMgZHluYW1pYykKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJbJWksICVpLCAlaSwgJWldIiwgIiVzWzBdIDw8ICVzWzFdIDw8ICVzWzJdIDw8ICVzWzNdIiAlIChuYW1lLCBuYW1lLCBuYW1lLCBuYW1lKSwgJycpCisgICAgICAgICAgICBpZiAnKicgaW4gdmtfdHlwZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCIweCVwIiwgIiolcyIgJSBuYW1lLCAnKicpCisgICAgICAgICAgICByZXR1cm4gKCIweCVwIiwgbmFtZSwgJycpCisgICAgICAgICMgVE9ETyA6IFRoaXMgaXMgc3BlY2lhbC1jYXNlZCBhcyB0aGVyZSdzIG9ubHkgb25lICJmb3JtYXQiIHBhcmFtIGN1cnJlbnRseSBhbmQgaXQncyBuaWNlIHRvIGV4cGFuZCBpdAorICAgICAgICBpZiAiVmtGb3JtYXQiID09IHZrX3R5cGU6CisgICAgICAgICAgICByZXR1cm4gKCIweCVwIiwgIkhhbmRsZUNhc3QoJiVzKSIgJSBuYW1lLCAnJicpCisgICAgICAgIGlmIG91dHB1dF9wYXJhbToKKyAgICAgICAgICAgIGlmIDEgPT0gdmtfdHlwZS5jb3VudCgnKicpOgorICAgICAgICAgICAgICAgIHJldHVybiAoIjB4JXAiLCAiKiVzIiAlIG5hbWUsICcqJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiMHglcCIsICJIYW5kbGVDYXN0KColcykiICUgbmFtZSwgJyonKQorIyAgICAgICAgaWYgdmtfaGVscGVyX2FwaV9kdW1wLmlzX3R5cGUodmtfdHlwZSwgJ3N0cnVjdCcpIGFuZCAnKicgbm90IGluIHZrX3R5cGU6CisjICAgICAgICAgICAgcmV0dXJuICgiJXAiLCAiSGFuZGxlQ2FzdCgmJXMpIiAlIG5hbWUsICcmJykKKyAgICAgICAgcmV0dXJuICgiMHglcCIsICJIYW5kbGVDYXN0KCVzKSIgJSBuYW1lLCAnJykKKworICAgIGRlZiBfZ2VuX2NyZWF0ZV9tc2dfY2FsbGJhY2soc2VsZik6CisgICAgICAgIHJfYm9keSA9IFtdCisgICAgICAgIHJfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIHJfYm9keS5hcHBlbmQoJ1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCcpCisgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICAgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsJykKKyAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgICAgICBjb25zdCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tDcmVhdGVJbmZvRVhUKiAgICBwQ3JlYXRlSW5mbywnKQorICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgIHBBbGxvY2F0b3IsJykKKyAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqICAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2spJykKKyAgICAgICAgcl9ib2R5LmFwcGVuZCgneycpCisgICAgICAgICMgU3dpdGNoIHRvIHRoaXMgY29kZSBzZWN0aW9uIGZvciB0aGUgbmV3IHBlci1pbnN0YW5jZSBzdG9yYWdlIGFuZCBkZWJ1ZyBjYWxsYmFja3MKKyAgICAgICAgaWYgc2VsZi5sYXllcl9uYW1lIGluIFsnb2JqZWN0X3RyYWNrZXInLCAndGhyZWFkaW5nJywgJ3VuaXF1ZV9vYmplY3RzJ106CisgICAgICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcEluc3RhbmNlVGFibGUgPSBnZXRfZGlzcGF0Y2hfdGFibGUoJXNfaW5zdGFuY2VfdGFibGVfbWFwLCBpbnN0YW5jZSk7JyAlIHNlbGYubGF5ZXJfbmFtZSApCisgICAgICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgVmtSZXN1bHQgcmVzdWx0ID0gcEluc3RhbmNlVGFibGUtPkNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwQ2FsbGJhY2spOycpCisgICAgICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgaWYgKFZLX1NVQ0NFU1MgPT0gcmVzdWx0KSB7JykKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICAgICAgbGF5ZXJfZGF0YSAqbXlfZGF0YSA9IGdldF9teV9kYXRhX3B0cihnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApOycpCisgICAgICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgICAgIHJlc3VsdCA9IGxheWVyX2NyZWF0ZV9tc2dfY2FsbGJhY2sobXlfZGF0YS0+cmVwb3J0X2RhdGEsJykKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwnKQorICAgICAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdGVJbmZvLCcpCisgICAgICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFsbG9jYXRvciwnKQorICAgICAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYWxsYmFjayk7JykKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICByZXR1cm4gcmVzdWx0OycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgVmtSZXN1bHQgcmVzdWx0ID0gaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoaW5zdGFuY2UpLT5DcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKGluc3RhbmNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcENhbGxiYWNrKTsnKQorICAgICAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgIGlmIChWS19TVUNDRVNTID09IHJlc3VsdCkgeycpCisgICAgICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgICAgIGxheWVyX2RhdGEgKm15X2RhdGEgPSBnZXRfbXlfZGF0YV9wdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsnKQorICAgICAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgICAgICByZXN1bHQgPSBsYXllcl9jcmVhdGVfbXNnX2NhbGxiYWNrKG15X2RhdGEtPnJlcG9ydF9kYXRhLCBmYWxzZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBDYWxsYmFjayk7JykKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICByZXR1cm4gcmVzdWx0OycpCisgICAgICAgIHJfYm9keS5hcHBlbmQoJ30nKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKHJfYm9keSkKKworICAgIGRlZiBfZ2VuX2Rlc3Ryb3lfbXNnX2NhbGxiYWNrKHNlbGYpOgorICAgICAgICByX2JvZHkgPSBbXQorICAgICAgICByX2JvZHkuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICByX2JvZHkuYXBwZW5kKCdWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChWa0luc3RhbmNlIGluc3RhbmNlLCBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgbXNnQ2FsbGJhY2ssIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvciknKQorICAgICAgICByX2JvZHkuYXBwZW5kKCd7JykKKyAgICAgICAgIyBTd2l0Y2ggdG8gdGhpcyBjb2RlIHNlY3Rpb24gZm9yIHRoZSBuZXcgcGVyLWluc3RhbmNlIHN0b3JhZ2UgYW5kIGRlYnVnIGNhbGxiYWNrcworICAgICAgICBpZiBzZWxmLmxheWVyX25hbWUgaW4gWydvYmplY3RfdHJhY2tlcicsICd0aHJlYWRpbmcnLCAndW5pcXVlX29iamVjdHMnXToKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwSW5zdGFuY2VUYWJsZSA9IGdldF9kaXNwYXRjaF90YWJsZSglc19pbnN0YW5jZV90YWJsZV9tYXAsIGluc3RhbmNlKTsnICUgc2VsZi5sYXllcl9uYW1lICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlICpwSW5zdGFuY2VUYWJsZSA9IGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlKTsnKQorICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgcEluc3RhbmNlVGFibGUtPkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKGluc3RhbmNlLCBtc2dDYWxsYmFjaywgcEFsbG9jYXRvcik7JykKKyAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgIGxheWVyX2RhdGEgKm15X2RhdGEgPSBnZXRfbXlfZGF0YV9wdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTsnKQorICAgICAgICByX2JvZHkuYXBwZW5kKCcgICAgbGF5ZXJfZGVzdHJveV9tc2dfY2FsbGJhY2sobXlfZGF0YS0+cmVwb3J0X2RhdGEsIG1zZ0NhbGxiYWNrLCBwQWxsb2NhdG9yKTsnKQorICAgICAgICByX2JvZHkuYXBwZW5kKCd9JykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihyX2JvZHkpCisKKyAgICBkZWYgX2dlbl9kZWJ1Z19yZXBvcnRfbXNnKHNlbGYpOgorICAgICAgICByX2JvZHkgPSBbXQorICAgICAgICByX2JvZHkuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICByX2JvZHkuYXBwZW5kKCdWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQoVmtJbnN0YW5jZSBpbnN0YW5jZSwgVmtEZWJ1Z1JlcG9ydEZsYWdzRVhUICAgIGZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmpUeXBlLCB1aW50NjRfdCBvYmplY3QsIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtc2dDb2RlLCBjb25zdCBjaGFyICpwTGF5ZXJQcmVmaXgsIGNvbnN0IGNoYXIgKnBNc2cpJykKKyAgICAgICAgcl9ib2R5LmFwcGVuZCgneycpCisgICAgICAgICMgU3dpdGNoIHRvIHRoaXMgY29kZSBzZWN0aW9uIGZvciB0aGUgbmV3IHBlci1pbnN0YW5jZSBzdG9yYWdlIGFuZCBkZWJ1ZyBjYWxsYmFja3MKKyAgICAgICAgaWYgc2VsZi5sYXllcl9uYW1lID09ICdvYmplY3RfdHJhY2tlcicgb3Igc2VsZi5sYXllcl9uYW1lID09ICd0aHJlYWRpbmcnOgorICAgICAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnBJbnN0YW5jZVRhYmxlID0gZ2V0X2Rpc3BhdGNoX3RhYmxlKCVzX2luc3RhbmNlX3RhYmxlX21hcCwgaW5zdGFuY2UpOycgJSBzZWxmLmxheWVyX25hbWUgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcl9ib2R5LmFwcGVuZCgnICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgKnBJbnN0YW5jZVRhYmxlID0gaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoaW5zdGFuY2UpOycpCisgICAgICAgIHJfYm9keS5hcHBlbmQoJyAgICBwSW5zdGFuY2VUYWJsZS0+RGVidWdSZXBvcnRNZXNzYWdlRVhUKGluc3RhbmNlLCBmbGFncywgb2JqVHlwZSwgb2JqZWN0LCBsb2NhdGlvbiwgbXNnQ29kZSwgcExheWVyUHJlZml4LCBwTXNnKTsnKQorICAgICAgICByX2JvZHkuYXBwZW5kKCd9JykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihyX2JvZHkpCisKKyAgICBkZWYgX2dlbl9sYXllcl9nZXRfZ2xvYmFsX2V4dGVuc2lvbl9wcm9wcyhzZWxmLCBsYXllcj0iZ2VuZXJpYyIpOgorICAgICAgICBnZ2VwX2JvZHkgPSBbXQorICAgICAgICAjIGdlbmVyYXRlZCBsYXllcnMgZG8gbm90IHByb3ZpZGUgYW55IGdsb2JhbCBleHRlbnNpb25zCisgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgaWYgc2VsZi5sYXllcl9uYW1lID09ICdvYmplY3RfdHJhY2tlcicgb3Igc2VsZi5sYXllcl9uYW1lID09ICd0aHJlYWRpbmcnOgorICAgICAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnc3RhdGljIGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyBpbnN0YW5jZV9leHRlbnNpb25zW10gPSB7JykKKyAgICAgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJyAgICAgICAgVktfRVhUX0RFQlVHX1JFUE9SVF9FWFRFTlNJT05fTkFNRSwnKQorICAgICAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnICAgICAgICBWS19FWFRfREVCVUdfUkVQT1JUX1NQRUNfVkVSU0lPTicpCisgICAgICAgICAgICBnZ2VwX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgICAgICBnZ2VwX2JvZHkuYXBwZW5kKCd9OycpCisgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJ1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMoY29uc3QgY2hhciAqcExheWVyTmFtZSwgdWludDMyX3QgKnBDb3VudCwgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyogcFByb3BlcnRpZXMpJykKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgneycpCisgICAgICAgIGlmIHNlbGYubGF5ZXJfbmFtZSA9PSAnb2JqZWN0X3RyYWNrZXInIG9yIHNlbGYubGF5ZXJfbmFtZSA9PSAndGhyZWFkaW5nJzoKKyAgICAgICAgICBnZ2VwX2JvZHkuYXBwZW5kKCcgICAgcmV0dXJuIHV0aWxfR2V0RXh0ZW5zaW9uUHJvcGVydGllcygxLCBpbnN0YW5jZV9leHRlbnNpb25zLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJyAgICByZXR1cm4gdXRpbF9HZXRFeHRlbnNpb25Qcm9wZXJ0aWVzKDAsIE5VTEwsIHBDb3VudCwgcFByb3BlcnRpZXMpOycpCisgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJ30nKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGdnZXBfYm9keSkKKworICAgIGRlZiBfZ2VuX2xheWVyX2dldF9nbG9iYWxfbGF5ZXJfcHJvcHMoc2VsZiwgbGF5ZXI9ImdlbmVyaWMiKToKKyAgICAgICAgZ2dlcF9ib2R5ID0gW10KKyAgICAgICAgaWYgbGF5ZXIgPT0gJ2dlbmVyaWMnOgorICAgICAgICAgICAgIyBEbyBub3RoaW5nLCBleHRlbnNpb24gZGVmaW5pdGlvbiBwYXJ0IG9mIGdlbmVyaWMuaAorICAgICAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxheWVyX25hbWUgPSByZS5zdWIoJyguKShbQS1aXVthLXpdKyknLCByJ1wxX1wyJywgbGF5ZXIpCisgICAgICAgICAgICBsYXllcl9uYW1lID0gcmUuc3ViKCcoW2EtejAtOV0pKFtBLVpdKScsIHInXDFfXDInLCBsYXllcl9uYW1lKS5sb3dlcigpCisgICAgICAgICAgICBnZ2VwX2JvZHkuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnc3RhdGljIGNvbnN0IFZrTGF5ZXJQcm9wZXJ0aWVzIGdsb2JhbExheWVyUHJvcHNbXSA9IHsnKQorICAgICAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnICAgICAgICAiVktfTEFZRVJfTFVOQVJHXyVzIiwnICUgbGF5ZXJfbmFtZSkKKyAgICAgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJyAgICAgICAgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwgLy8gc3BlY1ZlcnNpb24nKQorICAgICAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnICAgICAgICBWS19NQUtFX1ZFUlNJT04oMCwgMSwgMCksIC8vIGltcGxlbWVudGF0aW9uVmVyc2lvbicpCisgICAgICAgICAgICBnZ2VwX2JvZHkuYXBwZW5kKCcgICAgICAgICJsYXllcjogJXMiLCcgJSBsYXllcikKKyAgICAgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJ307JykKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHVpbnQzMl90ICpwQ291bnQsICBWa0xheWVyUHJvcGVydGllcyogcFByb3BlcnRpZXMpJykKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgneycpCisgICAgICAgIGdnZXBfYm9keS5hcHBlbmQoJyAgICByZXR1cm4gdXRpbF9HZXRMYXllclByb3BlcnRpZXMoQVJSQVlfU0laRShnbG9iYWxMYXllclByb3BzKSwgZ2xvYmFsTGF5ZXJQcm9wcywgcENvdW50LCBwUHJvcGVydGllcyk7JykKKyAgICAgICAgZ2dlcF9ib2R5LmFwcGVuZCgnfScpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oZ2dlcF9ib2R5KQorCisgICAgZGVmIF9nZW5fbGF5ZXJfZ2V0X3BoeXNpY2FsX2RldmljZV9sYXllcl9wcm9wcyhzZWxmLCBsYXllcj0iZ2VuZXJpYyIpOgorICAgICAgICBncGRscF9ib2R5ID0gW10KKyAgICAgICAgaWYgbGF5ZXIgPT0gJ2dlbmVyaWMnOgorICAgICAgICAgICAgIyBEbyBub3RoaW5nLCBleHRlbnNpb24gZGVmaW5pdGlvbiBwYXJ0IG9mIGdlbmVyaWMuaAorICAgICAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBncGRscF9ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgIGdwZGxwX2JvZHkuYXBwZW5kKCdzdGF0aWMgY29uc3QgVmtMYXllclByb3BlcnRpZXMgZGV2aWNlTGF5ZXJQcm9wc1tdID0geycpCisgICAgICAgICAgICBncGRscF9ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJyAgICAgICAgIlZLX0xBWUVSX0xVTkFSR18lcyIsJyAlIGxheWVyKQorICAgICAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJyAgICAgICAgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwnKQorICAgICAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJyAgICAgICAgVktfTUFLRV9WRVJTSU9OKDAsIDEsIDApLCcpCisgICAgICAgICAgICBncGRscF9ib2R5LmFwcGVuZCgnICAgICAgICAibGF5ZXI6ICVzIiwnICUgbGF5ZXIpCisgICAgICAgICAgICBncGRscF9ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJ307JykKKyAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJ1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwgVmtMYXllclByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKScpCisgICAgICAgIGdwZGxwX2JvZHkuYXBwZW5kKCd7JykKKyAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJyAgICByZXR1cm4gdXRpbF9HZXRMYXllclByb3BlcnRpZXMoQVJSQVlfU0laRShkZXZpY2VMYXllclByb3BzKSwgZGV2aWNlTGF5ZXJQcm9wcywgcENvdW50LCBwUHJvcGVydGllcyk7JykKKyAgICAgICAgZ3BkbHBfYm9keS5hcHBlbmQoJ30nKQorICAgICAgICBncGRscF9ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihncGRscF9ib2R5KQorCisgICAgZGVmIF9nZW5lcmF0ZV9kaXNwYXRjaF9lbnRyeXBvaW50cyhzZWxmLCBxdWFsPSIiKToKKyAgICAgICAgaWYgcXVhbDoKKyAgICAgICAgICAgIHF1YWwgKz0gIiAiCisKKyAgICAgICAgZnVuY3MgPSBbXQorICAgICAgICBpbnRlcmNlcHRlZCA9IFtdCisgICAgICAgIGZvciBwcm90byBpbiBzZWxmLnByb3RvczoKKyAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgPT0gIkdldERldmljZVByb2NBZGRyIiBvciBwcm90by5uYW1lID09ICJHZXRJbnN0YW5jZVByb2NBZGRyIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbnRlcmNlcHQgPSBzZWxmLmdlbmVyYXRlX2ludGVyY2VwdChwcm90bywgcXVhbCkKKyAgICAgICAgICAgICAgICBpZiBpbnRlcmNlcHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBmaWxsIGluIGRlZmF1bHQgaW50ZXJjZXB0IGZvciBjZXJ0YWluIGVudHJ5cG9pbnRzCisgICAgICAgICAgICAgICAgICAgIGlmICdDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUJyA9PSBwcm90by5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0ID0gc2VsZi5fZ2VuX2xheWVyX2RiZ19jcmVhdGVfbXNnX2NhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAnRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQnID09IHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHQgPSBzZWxmLl9nZW5fbGF5ZXJfZGJnX2Rlc3Ryb3lfbXNnX2NhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAnRGVidWdSZXBvcnRNZXNzYWdlRVhUJyA9PSBwcm90by5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0ID0gc2VsZi5fZ2VuX2RlYnVnX3JlcG9ydF9tc2coKQorICAgICAgICAgICAgICAgICAgICBlbGlmICdDcmVhdGVEZXZpY2UnID09IHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJy8qIENyZWF0ZURldmljZSBIRVJFICovJykKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAnRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJyA9PSBwcm90by5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0ID0gc2VsZi5fZ2VuX2xheWVyX2dldF9nbG9iYWxfZXh0ZW5zaW9uX3Byb3BzKHNlbGYubGF5ZXJfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAnRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnID09IHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHQgPSBzZWxmLl9nZW5fbGF5ZXJfZ2V0X2dsb2JhbF9sYXllcl9wcm9wcyhzZWxmLmxheWVyX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgJ0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcycgPT0gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyY2VwdCA9IHNlbGYuX2dlbl9sYXllcl9nZXRfcGh5c2ljYWxfZGV2aWNlX2xheWVyX3Byb3BzKHNlbGYubGF5ZXJfbmFtZSkKKworICAgICAgICAgICAgICAgIGlmIGludGVyY2VwdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZnVuY3MuYXBwZW5kKGludGVyY2VwdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90ICJLSFIiIGluIHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRlZC5hcHBlbmQocHJvdG8pCisKKyAgICAgICAgcHJlZml4PSJ2ayIKKyAgICAgICAgbG9va3VwcyA9IFtdCisgICAgICAgIGZvciBwcm90byBpbiBpbnRlcmNlcHRlZDoKKyAgICAgICAgICAgIGxvb2t1cHMuYXBwZW5kKCJpZiAoIXN0cmNtcChuYW1lLCBcIiVzXCIpKSIgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgbG9va3Vwcy5hcHBlbmQoIiAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgJXMlczsiICUKKyAgICAgICAgICAgICAgICAgICAgKHByZWZpeCwgcHJvdG8ubmFtZSkpCisKKyAgICAgICAgIyBhZGQgY3VzdG9taXplZCBsYXllcl9pbnRlcmNlcHRfcHJvYworICAgICAgICBib2R5ID0gW10KKyAgICAgICAgYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGJvZHkuYXBwZW5kKCJzdGF0aWMgaW5saW5lIFBGTl92a1ZvaWRGdW5jdGlvbiBsYXllcl9pbnRlcmNlcHRfcHJvYyhjb25zdCBjaGFyICpuYW1lKSIpCisgICAgICAgIGJvZHkuYXBwZW5kKCJ7IikKKyAgICAgICAgYm9keS5hcHBlbmQoZ2VuZXJhdGVfZ2V0X3Byb2NfYWRkcl9jaGVjaygibmFtZSIpKQorICAgICAgICBib2R5LmFwcGVuZCgiIikKKyAgICAgICAgYm9keS5hcHBlbmQoIiAgICBuYW1lICs9IDI7IikKKyAgICAgICAgYm9keS5hcHBlbmQoIiAgICAlcyIgJSAiXG4gICAgIi5qb2luKGxvb2t1cHMpKQorICAgICAgICBib2R5LmFwcGVuZCgiIikKKyAgICAgICAgYm9keS5hcHBlbmQoIiAgICByZXR1cm4gTlVMTDsiKQorICAgICAgICBib2R5LmFwcGVuZCgifSIpCisgICAgICAgICMgYWRkIGxheWVyX2ludGVyY2VwdF9pbnN0YW5jZV9wcm9jCisgICAgICAgIGxvb2t1cHMgPSBbXQorICAgICAgICBmb3IgcHJvdG8gaW4gc2VsZi5wcm90b3M6CisgICAgICAgICAgICBpZiBub3QgcHJvdG9faXNfZ2xvYmFsKHByb3RvKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBub3QgcHJvdG8gaW4gaW50ZXJjZXB0ZWQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgPT0gIkNyZWF0ZUluc3RhbmNlIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSA9PSAiQ3JlYXRlRGV2aWNlIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbG9va3Vwcy5hcHBlbmQoImlmICghc3RyY21wKG5hbWUsIFwiJXNcIikpIiAlIHByb3RvLm5hbWUpCisgICAgICAgICAgICBsb29rdXBzLmFwcGVuZCgiICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSAlcyVzOyIgJSAocHJlZml4LCBwcm90by5uYW1lKSkKKworICAgICAgICBib2R5LmFwcGVuZCgic3RhdGljIGlubGluZSBQRk5fdmtWb2lkRnVuY3Rpb24gbGF5ZXJfaW50ZXJjZXB0X2luc3RhbmNlX3Byb2MoY29uc3QgY2hhciAqbmFtZSkiKQorICAgICAgICBib2R5LmFwcGVuZCgieyIpCisgICAgICAgIGJvZHkuYXBwZW5kKGdlbmVyYXRlX2dldF9wcm9jX2FkZHJfY2hlY2soIm5hbWUiKSkKKyAgICAgICAgYm9keS5hcHBlbmQoIiIpCisgICAgICAgIGJvZHkuYXBwZW5kKCIgICAgbmFtZSArPSAyOyIpCisgICAgICAgIGJvZHkuYXBwZW5kKCIgICAgJXMiICUgIlxuICAgICIuam9pbihsb29rdXBzKSkKKyAgICAgICAgYm9keS5hcHBlbmQoIiIpCisgICAgICAgIGJvZHkuYXBwZW5kKCIgICAgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgYm9keS5hcHBlbmQoIn0iKQorCisgICAgICAgIGZ1bmNzLmFwcGVuZCgiXG4iLmpvaW4oYm9keSkpCisgICAgICAgIHJldHVybiAiXG5cbiIuam9pbihmdW5jcykKKworICAgIGRlZiBfZ2VuZXJhdGVfZXh0ZW5zaW9ucyhzZWxmKToKKyAgICAgICAgZXh0cyA9IFtdCisgICAgICAgIGV4dHMuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICBleHRzLmFwcGVuZChzZWxmLl9nZW5fY3JlYXRlX21zZ19jYWxsYmFjaygpKQorICAgICAgICBleHRzLmFwcGVuZChzZWxmLl9nZW5fZGVzdHJveV9tc2dfY2FsbGJhY2soKSkKKyAgICAgICAgZXh0cy5hcHBlbmQoc2VsZi5fZ2VuX2RlYnVnX3JlcG9ydF9tc2coKSkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihleHRzKQorCisgICAgZGVmIF9nZW5lcmF0ZV9sYXllcl9ncGFfZnVuY3Rpb24oc2VsZiwgZXh0ZW5zaW9ucz1bXSwgaW5zdGFuY2VfZXh0ZW5zaW9ucz1bXSk6CisgICAgICAgIGZ1bmNfYm9keSA9IFtdCisjCisjIE5ldyBzdHlsZSBvZiBHUEEgRnVuY3Rpb25zIGZvciB0aGUgbmV3IGxheWVyX2RhdGEvbGF5ZXJfbG9nZ2luZyBjaGFuZ2VzCisjCisgICAgICAgIGlmIHNlbGYubGF5ZXJfbmFtZSBpbiBbJ29iamVjdF90cmFja2VyJywgJ3RocmVhZGluZycsICd1bmlxdWVfb2JqZWN0cyddOgorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VQcm9jQWRkcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IGNoYXIqIGZ1bmNOYW1lKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBhZGRyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlmICghc3RyY21wKFwidmtHZXREZXZpY2VQcm9jQWRkclwiLCBmdW5jTmFtZSkpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0RGV2aWNlUHJvY0FkZHI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgfVxuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgYWRkciA9IGxheWVyX2ludGVyY2VwdF9wcm9jKGZ1bmNOYW1lKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoYWRkcilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIGFkZHI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKGRldmljZSA9PSBWS19OVUxMX0hBTkRMRSkge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB9XG4iKQorICAgICAgICAgICAgaWYgMCAhPSBsZW4oZXh0ZW5zaW9ucyk6CisgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgbGF5ZXJfZGF0YSAqbXlfZGV2aWNlX2RhdGEgPSBnZXRfbXlfZGF0YV9wdHIoZ2V0X2Rpc3BhdGNoX2tleShkZXZpY2UpLCBsYXllcl9kYXRhX21hcCk7JykKKyAgICAgICAgICAgICAgICBmb3IgKGV4dF9lbmFibGUsIGV4dF9saXN0KSBpbiBleHRlbnNpb25zOgorICAgICAgICAgICAgICAgICAgICBleHRyYV9zcGFjZSA9ICIiCisgICAgICAgICAgICAgICAgICAgIGlmIDAgIT0gbGVuKGV4dF9lbmFibGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGlmIChteV9kZXZpY2VfZGF0YS0+JXMpIHsnICUgZXh0X2VuYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3NwYWNlID0gIiAgICAiCisgICAgICAgICAgICAgICAgICAgIGZvciBleHRfbmFtZSBpbiBleHRfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAlc2lmICghc3RyY21wKCIlcyIsIGZ1bmNOYW1lKSlcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgJXNyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KCVzKTsnICUgKGV4dHJhX3NwYWNlLCBleHRfbmFtZSwgZXh0cmFfc3BhY2UsIGV4dF9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgMCAhPSBsZW4oZXh0X2VuYWJsZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoIlxuICAgIGlmIChnZXRfZGlzcGF0Y2hfdGFibGUoJXNfZGV2aWNlX3RhYmxlX21hcCwgZGV2aWNlKS0+R2V0RGV2aWNlUHJvY0FkZHIgPT0gTlVMTClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIE5VTEw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIGdldF9kaXNwYXRjaF90YWJsZSglc19kZXZpY2VfdGFibGVfbWFwLCBkZXZpY2UpLT5HZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIGZ1bmNOYW1lKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIgJSAoc2VsZi5sYXllcl9uYW1lLCBzZWxmLmxheWVyX25hbWUpKQorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgdmtHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIGZ1bmNOYW1lKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBhZGRyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlmICghc3RyY21wKGZ1bmNOYW1lLCBcInZrR2V0SW5zdGFuY2VQcm9jQWRkclwiKSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrR2V0SW5zdGFuY2VQcm9jQWRkcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgXCJ2a0NyZWF0ZUluc3RhbmNlXCIpKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmtDcmVhdGVJbnN0YW5jZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgXCJ2a0NyZWF0ZURldmljZVwiKSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlRGV2aWNlO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGFkZHIgPSBsYXllcl9pbnRlcmNlcHRfaW5zdGFuY2VfcHJvYyhmdW5jTmFtZSk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKGFkZHIpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIGFkZHI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoaW5zdGFuY2UgPT0gVktfTlVMTF9IQU5ETEUpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIE5VTEw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgIHRhYmxlX2RlY2xhcmVkID0gRmFsc2UKKyAgICAgICAgICAgIGlmIDAgIT0gbGVuKGluc3RhbmNlX2V4dGVuc2lvbnMpOgorICAgICAgICAgICAgICAgIGZvciAoZXh0X2VuYWJsZSwgZXh0X2xpc3QpIGluIGluc3RhbmNlX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhX3NwYWNlID0gIiIKKyAgICAgICAgICAgICAgICAgICAgaWYgMCAhPSBsZW4oZXh0X2VuYWJsZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHRfZW5hYmxlID09ICdtc2dfY2FsbGJhY2tfZ2V0X3Byb2NfYWRkcic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiICAgIGxheWVyX2RhdGEgKm15X2RhdGEgPSBnZXRfbXlfZGF0YV9wdHIoZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSksIGxheWVyX2RhdGFfbWFwKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGFkZHIgPSBkZWJ1Z19yZXBvcnRfZ2V0X2luc3RhbmNlX3Byb2NfYWRkcihteV9kYXRhLT5yZXBvcnRfZGF0YSwgZnVuY05hbWUpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKGFkZHIpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gYWRkcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRhYmxlX2RlY2xhcmVkID09IEZhbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSogcFRhYmxlID0gZ2V0X2Rpc3BhdGNoX3RhYmxlKCVzX2luc3RhbmNlX3RhYmxlX21hcCwgaW5zdGFuY2UpOyIgJSBzZWxmLmxheWVyX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2RlY2xhcmVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBpZiAoaW5zdGFuY2VFeHRNYXAuc2l6ZSgpICE9IDAgJiYgaW5zdGFuY2VFeHRNYXBbcFRhYmxlXS4lcyknICUgZXh0X2VuYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfc3BhY2UgPSAiICAgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXh0X25hbWUgaW4gZXh0X2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdzaV9uYW1lKGV4dF9uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyVzJyAlIHdzaV9pZmRlZihleHRfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAlc2lmICghc3RyY21wKCIlcyIsIGZ1bmNOYW1lKSlcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UEZOX3ZrVm9pZEZ1bmN0aW9uPiglcyk7JyAlIChleHRyYV9zcGFjZSwgZXh0X25hbWUsIGV4dF9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd3NpX25hbWUoZXh0X25hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJXMnICUgd3NpX2VuZGlmKGV4dF9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAwICE9IGxlbihleHRfZW5hYmxlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfVxuJykKKworICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiICAgIGlmIChnZXRfZGlzcGF0Y2hfdGFibGUoJXNfaW5zdGFuY2VfdGFibGVfbWFwLCBpbnN0YW5jZSktPkdldEluc3RhbmNlUHJvY0FkZHIgPT0gTlVMTCkge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIGdldF9kaXNwYXRjaF90YWJsZSglc19pbnN0YW5jZV90YWJsZV9tYXAsIGluc3RhbmNlKS0+R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiAlIChzZWxmLmxheWVyX25hbWUsIHNlbGYubGF5ZXJfbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gIlxuIi5qb2luKGZ1bmNfYm9keSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCJWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgY2hhciogZnVuY05hbWUpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIGFkZHI7XG4iKQorICAgICAgICAgICAgaWYgc2VsZi5sYXllcl9uYW1lID09ICdnZW5lcmljJzoKKyAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoIXN0cmNtcChcInZrR2V0RGV2aWNlUHJvY0FkZHJcIiwgZnVuY05hbWUpKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldERldmljZVByb2NBZGRyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGFkZHIgPSBsYXllcl9pbnRlcmNlcHRfcHJvYyhmdW5jTmFtZSk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKGFkZHIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHJldHVybiBhZGRyOyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfb25jZSgmaW5pdE9uY2UsIGluaXQlcyk7XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoIXN0cmNtcChcInZrR2V0RGV2aWNlUHJvY0FkZHJcIiwgZnVuY05hbWUpKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldERldmljZVByb2NBZGRyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGFkZHIgPSBsYXllcl9pbnRlcmNlcHRfcHJvYyhmdW5jTmFtZSk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKGFkZHIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHJldHVybiBhZGRyOyIgJSBzZWxmLmxheWVyX25hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAgaWYgKGRldmljZSA9PSBWS19OVUxMX0hBTkRMRSkge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB9XG4iKQorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSAgZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKGRldmljZSk7JykKKyAgICAgICAgICAgIGlmIDAgIT0gbGVuKGV4dGVuc2lvbnMpOgorICAgICAgICAgICAgICAgIGV4dHJhX3NwYWNlID0gIiIKKyAgICAgICAgICAgICAgICBmb3IgKGV4dF9lbmFibGUsIGV4dF9saXN0KSBpbiBleHRlbnNpb25zOgorICAgICAgICAgICAgICAgICAgICBpZiAwICE9IGxlbihleHRfZW5hYmxlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBpZiAoZGV2aWNlRXh0TWFwLnNpemUoKSAhPSAwICYmIGRldmljZUV4dE1hcFtwRGlzcF0uJXMpJyAlIGV4dF9lbmFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9zcGFjZSA9ICIgICAgIgorICAgICAgICAgICAgICAgICAgICBmb3IgZXh0X25hbWUgaW4gZXh0X2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgJXNpZiAoIXN0cmNtcCgiJXMiLCBmdW5jTmFtZSkpXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KCVzKTsnICUgKGV4dHJhX3NwYWNlLCBleHRfbmFtZSwgZXh0X25hbWUpKQorICAgICAgICAgICAgICAgICAgICBpZiAwICE9IGxlbihleHRfZW5hYmxlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBpZiAocERpc3AtPkdldERldmljZVByb2NBZGRyID09IE5VTEwpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIHBEaXNwLT5HZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIGZ1bmNOYW1lKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iKQorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoIlZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyKiBmdW5jTmFtZSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBQRk5fdmtWb2lkRnVuY3Rpb24gYWRkcjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoIXN0cmNtcChmdW5jTmFtZSwgXCJ2a0dldEluc3RhbmNlUHJvY0FkZHJcIikpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0dldEluc3RhbmNlUHJvY0FkZHI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsIFwidmtDcmVhdGVJbnN0YW5jZVwiKSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrQ3JlYXRlSW5zdGFuY2U7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKCFzdHJjbXAoZnVuY05hbWUsIFwidmtDcmVhdGVEZXZpY2VcIikpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSB2a0NyZWF0ZURldmljZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgc2VsZi5sYXllcl9uYW1lID09ICdnZW5lcmljJzoKKyAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBhZGRyID0gbGF5ZXJfaW50ZXJjZXB0X2luc3RhbmNlX3Byb2MoZnVuY05hbWUpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlmIChhZGRyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gYWRkcjsiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfb25jZSgmaW5pdE9uY2UsIGluaXQlcyk7XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBhZGRyID0gbGF5ZXJfaW50ZXJjZXB0X2luc3RhbmNlX3Byb2MoZnVuY05hbWUpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlmIChhZGRyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gYWRkcjsiICUgc2VsZi5sYXllcl9uYW1lKQorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiICAgIGlmIChpbnN0YW5jZSA9PSBWS19OVUxMX0hBTkRMRSkge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB9XG4iKQorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiIikKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoIiAgICBWa0xheWVySW5zdGFuY2VEaXNwYXRjaFRhYmxlKiBwVGFibGUgPSBpbnN0YW5jZV9kaXNwYXRjaF90YWJsZShpbnN0YW5jZSk7XG4iKQorICAgICAgICAgICAgaWYgMCAhPSBsZW4oaW5zdGFuY2VfZXh0ZW5zaW9ucyk6CisgICAgICAgICAgICAgICAgZXh0cmFfc3BhY2UgPSAiIgorICAgICAgICAgICAgICAgIGZvciAoZXh0X2VuYWJsZSwgZXh0X2xpc3QpIGluIGluc3RhbmNlX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgICAgIGlmIDAgIT0gbGVuKGV4dF9lbmFibGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0X2VuYWJsZSA9PSAnbXNnX2NhbGxiYWNrX2dldF9wcm9jX2FkZHInOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoIiAgICBsYXllcl9kYXRhICpteV9kYXRhID0gZ2V0X215X2RhdGFfcHRyKGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpLCBsYXllcl9kYXRhX21hcCk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBhZGRyID0gZGVidWdfcmVwb3J0X2dldF9pbnN0YW5jZV9wcm9jX2FkZHIobXlfZGF0YS0+cmVwb3J0X2RhdGEsIGZ1bmNOYW1lKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlmIChhZGRyKSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIGFkZHI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB9XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgaWYgKGluc3RhbmNlRXh0TWFwLnNpemUoKSAhPSAwICYmIGluc3RhbmNlRXh0TWFwW3BUYWJsZV0uJXMpJyAlIGV4dF9lbmFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3NwYWNlID0gIiAgICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4dF9uYW1lIGluIGV4dF9saXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB3c2lfbmFtZShleHRfbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCclcycgJSB3c2lfaWZkZWYoZXh0X25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgJXNpZiAoIXN0cmNtcCgiJXMiLCBmdW5jTmFtZSkpXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQRk5fdmtWb2lkRnVuY3Rpb24+KCVzKTsnICUgKGV4dHJhX3NwYWNlLCBleHRfbmFtZSwgZXh0X25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB3c2lfbmFtZShleHRfbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCclcycgJSB3c2lfZW5kaWYoZXh0X25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDAgIT0gbGVuKGV4dF9lbmFibGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfVxuJykKKworICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiICAgIGlmIChwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIgPT0gTlVMTClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIE5VTEw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHBUYWJsZS0+R2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIikKKyAgICAgICAgICAgIHJldHVybiAiXG4iLmpvaW4oZnVuY19ib2R5KQorCisgICAgZGVmIF9nZW5lcmF0ZV9sYXllcl9pbml0aWFsaXphdGlvbihzZWxmLCBpbml0X29wdHM9RmFsc2UsIHByZWZpeD0ndmsnLCBsb2NrbmFtZT1Ob25lLCBjb25kbmFtZT1Ob25lKToKKyAgICAgICAgZnVuY19ib2R5ID0gWyIjaW5jbHVkZSBcInZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oXCIiXQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCdzdGF0aWMgdm9pZCBpbml0XyVzKGxheWVyX2RhdGEgKm15X2RhdGEsIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyAqcEFsbG9jYXRvcilcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAne1xuJyAlIHNlbGYubGF5ZXJfbmFtZSkKKyAgICAgICAgaWYgaW5pdF9vcHRzOgorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgbGF5ZXJfZGVidWdfYWN0aW9ucyhteV9kYXRhLT5yZXBvcnRfZGF0YSwgbXlfZGF0YS0+bG9nZ2luZ19jYWxsYmFjaywgcEFsbG9jYXRvciwgImx1bmFyZ18lcyIpOycgJSBzZWxmLmxheWVyX25hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICBpZiBsb2NrbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAgaWYgKCElc0xvY2tJbml0aWFsaXplZCkiICUgbG9ja25hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAgeyIpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAgICAgIC8vIFRPRE8vVEJEOiBOZWVkIHRvIGRlbGV0ZSB0aGlzIG11dGV4IHNvbWV0aW1lLiAgSG93Pz8/IikKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoIiAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jcmVhdGVfbXV0ZXgoJiVzTG9jayk7IiAlIGxvY2tuYW1lKQorICAgICAgICAgICAgaWYgY29uZG5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgiICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2luaXRfY29uZCgmJXNDb25kKTsiICUgY29uZG5hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAgICAgICVzTG9ja0luaXRpYWxpemVkID0gMTsiICUgbG9ja25hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCIgICAgfSIpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoIn1cbiIpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oZnVuY19ib2R5KQorCitjbGFzcyBMYXllckZ1bmNzU3ViY29tbWFuZChTdWJjb21tYW5kKToKKyAgICBkZWYgZ2VuZXJhdGVfaGVhZGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gJyNpbmNsdWRlIDx2dWxrYW4vdmtfbGF5ZXIuaD5cbiNpbmNsdWRlICJsb2FkZXIuaCInCisKKyAgICBkZWYgZ2VuZXJhdGVfYm9keShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dlbmVyYXRlX2Rpc3BhdGNoX2VudHJ5cG9pbnRzKCJzdGF0aWMiKQorCitjbGFzcyBHZW5lcmljTGF5ZXJTdWJjb21tYW5kKFN1YmNvbW1hbmQpOgorICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGdlbl9oZWFkZXIgPSBbXQorICAgICAgICBnZW5faGVhZGVyLmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyNpbmNsdWRlIDxzdGRpby5oPicpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCcjaW5jbHVkZSA8c3RkbGliLmg+JykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyNpbmNsdWRlIDxzdHJpbmcuaD4nKQorICAgICAgICBnZW5faGVhZGVyLmFwcGVuZCgnI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+JykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19sb2FkZXJfcGxhdGZvcm0uaCInKQorICAgICAgICBnZW5faGVhZGVyLmFwcGVuZCgnI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIicpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCcjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiJykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19sYXllcl9sb2dnaW5nLmgiJykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19sYXllcl90YWJsZS5oIicpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCcjaW5jbHVkZSAidmtfbGF5ZXJfZXh0ZW5zaW9uX3V0aWxzLmgiJykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19sYXllcl91dGlscy5oIicpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCcnKQorICAgICAgICBnZW5faGVhZGVyLmFwcGVuZCgnI2luY2x1ZGUgImdlbmVyaWMuaCInKQorICAgICAgICBnZW5faGVhZGVyLmFwcGVuZCgnJykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCcjZGVmaW5lIExBWUVSX0VYVF9BUlJBWV9TSVpFIDEnKQorICAgICAgICBnZW5faGVhZGVyLmFwcGVuZCgnI2RlZmluZSBMQVlFUl9ERVZfRVhUX0FSUkFZX1NJWkUgMScpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCcvL3N0YXRpYyBMT0FERVJfUExBVEZPUk1fVEhSRUFEX09OQ0VfREVDTEFSQVRJT04oaW5pdE9uY2UpOycpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCdzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiwgbGF5ZXJfZGF0YSAqPiBsYXllcl9kYXRhX21hcDtcbicpCisgICAgICAgIGdlbl9oZWFkZXIuYXBwZW5kKCd0ZW1wbGF0ZSBsYXllcl9kYXRhICpnZXRfbXlfZGF0YV9wdHI8bGF5ZXJfZGF0YT4oJykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyAgICAgICAgdm9pZCAqZGF0YV9rZXksJykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiwgbGF5ZXJfZGF0YSAqPiAmZGF0YV9tYXApO1xuJykKKyAgICAgICAgZ2VuX2hlYWRlci5hcHBlbmQoJycpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oZ2VuX2hlYWRlcikKKworICAgIGRlZiBnZW5lcmF0ZV9pbnRlcmNlcHQoc2VsZiwgcHJvdG8sIHF1YWwpOgorICAgICAgICBpZiBwcm90by5uYW1lIGluIFsgJ0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJywgJ0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsICdFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMnLCAnRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcycgXToKKyAgICAgICAgICAgICMgdXNlIGRlZmF1bHQgdmVyc2lvbgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZGVjbCA9IHByb3RvLmNfZnVuYyhwcmVmaXg9InZrIiwgYXR0cj0iVktBUEkiKQorICAgICAgICByZXRfdmFsID0gJycKKyAgICAgICAgc3RtdCA9ICcnCisgICAgICAgIGZ1bmNzID0gW10KKyAgICAgICAgdGFibGUgPSAnJworICAgICAgICBpZiBwcm90b19pc19nbG9iYWwocHJvdG8pOgorICAgICAgICAgICB0YWJsZSA9ICdJbnN0YW5jZScKKyAgICAgICAgaWYgcHJvdG8ucmV0ICE9ICJ2b2lkIjoKKyAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgIHJldF92YWwgPSAiJXMgcmVzdWx0ID0gIiAlIHByb3RvLnJldAorICAgICAgICAgICAgc3RtdCA9ICIgICAgcmV0dXJuIHJlc3VsdDtcbiIKKyAgICAgICAgaWYgcHJvdG8ubmFtZSA9PSAiQ3JlYXRlRGV2aWNlIjoKKyAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgnJXMlc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3tcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgbGF5ZXJfZGF0YSAqbXlfaW5zdGFuY2VfZGF0YSA9IGdldF9teV9kYXRhX3B0cihnZXRfZGlzcGF0Y2hfa2V5KHBoeXNpY2FsRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBjaGFyIHN0clsxMDI0XTtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgc3ByaW50ZihzdHIsICJBdCBzdGFydCBvZiBHZW5lcmljIGxheWVyZWQgJXNcXG4iKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgbG9nX21zZyhteV9pbnN0YW5jZV9kYXRhLT5yZXBvcnRfZGF0YSwgVktfREVCVUdfUkVQT1JUX0lORk9STUFUSU9OX0JJVF9FWFQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhULCcKKyAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAodWludDY0X3QpcGh5c2ljYWxEZXZpY2UsIF9fTElORV9fLCAwLCAoY2hhciAqKSAiZ2VuZXJpYyIsICIlJXMiLCAoY2hhciAqKSBzdHIpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyAqY2hhaW5faW5mbyA9IGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFBGTl92a0dldERldmljZVByb2NBZGRyIGZwR2V0RGV2aWNlUHJvY0FkZHIgPSBjaGFpbl9pbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXREZXZpY2VQcm9jQWRkcjtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgUEZOX3ZrQ3JlYXRlRGV2aWNlIGZwQ3JlYXRlRGV2aWNlID0gKFBGTl92a0NyZWF0ZURldmljZSkgZnBHZXRJbnN0YW5jZVByb2NBZGRyKE5VTEwsICJ2a0NyZWF0ZURldmljZSIpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoZnBDcmVhdGVEZXZpY2UgPT0gTlVMTCkge1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGNoYWluX2luZm8tPnUucExheWVySW5mbyA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cE5leHQ7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlRGV2aWNlKHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykge1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcmV0dXJuIHJlc3VsdDtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBsYXllcl9kYXRhICpteV9kZXZpY2VfZGF0YSA9IGdldF9teV9kYXRhX3B0cihnZXRfZGlzcGF0Y2hfa2V5KCpwRGV2aWNlKSwgbGF5ZXJfZGF0YV9tYXApO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpbml0RGV2aWNlVGFibGUoKnBEZXZpY2UsIGZwR2V0RGV2aWNlUHJvY0FkZHIpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBteV9kZXZpY2VfZGF0YS0+cmVwb3J0X2RhdGEgPSBsYXllcl9kZWJ1Z19yZXBvcnRfY3JlYXRlX2RldmljZShteV9pbnN0YW5jZV9kYXRhLT5yZXBvcnRfZGF0YSwgKnBEZXZpY2UpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBjcmVhdGVEZXZpY2VSZWdpc3RlckV4dGVuc2lvbnMocENyZWF0ZUluZm8sICpwRGV2aWNlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgc3ByaW50ZihzdHIsICJDb21wbGV0ZWQgZ2VuZXJpYyBsYXllcmVkICVzXFxuIik7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGxvZ19tc2cobXlfZGV2aWNlX2RhdGEtPnJlcG9ydF9kYXRhLCBWS19ERUJVR19SRVBPUlRfSU5GT1JNQVRJT05fQklUX0VYVCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQsICh1aW50NjRfdClwaHlzaWNhbERldmljZSwgX19MSU5FX18sIDAsIChjaGFyICopICJnZW5lcmljIiwgIiUlcyIsIChjaGFyICopIHN0cik7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICVzJworICAgICAgICAgICAgICAgICAgICAgJ30nICUgKHF1YWwsIGRlY2wsIHByb3RvLm5hbWUsIHByb3RvLm5hbWUsIHN0bXQpKQorICAgICAgICBlbGlmIHByb3RvLm5hbWUgPT0gIkRlc3Ryb3lEZXZpY2UiOgorICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclcyVzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3tcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGRldmljZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgID0gIGRldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgcERpc3AtPkRlc3Ryb3lEZXZpY2UoZGV2aWNlLCBwQWxsb2NhdG9yKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGRldmljZUV4dE1hcC5lcmFzZShwRGlzcCk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBkZXN0cm95X2RldmljZV9kaXNwYXRjaF90YWJsZShrZXkpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4nICUgKHF1YWwsIGRlY2wpKQorICAgICAgICBlbGlmIHByb3RvLm5hbWUgPT0gIkRlc3Ryb3lJbnN0YW5jZSI6CisgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcERpc3AgID0gIGluc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGluc3RhbmNlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHBEaXNwLT5EZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIHBBbGxvY2F0b3IpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgLy8gQ2xlYW4gdXAgbG9nZ2luZyBjYWxsYmFjaywgaWYgYW55XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBsYXllcl9kYXRhICpteV9kYXRhID0gZ2V0X215X2RhdGFfcHRyKGtleSwgbGF5ZXJfZGF0YV9tYXApO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgd2hpbGUgKG15X2RhdGEtPmxvZ2dpbmdfY2FsbGJhY2suc2l6ZSgpID4gMCkgeycKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgY2FsbGJhY2sgPSBteV9kYXRhLT5sb2dnaW5nX2NhbGxiYWNrLmJhY2soKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbGF5ZXJfZGVzdHJveV9tc2dfY2FsbGJhY2sobXlfZGF0YS0+cmVwb3J0X2RhdGEsIGNhbGxiYWNrLCBwQWxsb2NhdG9yKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgbXlfZGF0YS0+bG9nZ2luZ19jYWxsYmFjay5wb3BfYmFjaygpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIH1cblxuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgbGF5ZXJfZGVidWdfcmVwb3J0X2Rlc3Ryb3lfaW5zdGFuY2UobXlfZGF0YS0+cmVwb3J0X2RhdGEpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgbGF5ZXJfZGF0YV9tYXAuZXJhc2Uoa2V5KTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGluc3RhbmNlRXh0TWFwLmVyYXNlKHBEaXNwKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGRlc3Ryb3lfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoa2V5KTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJyAlIChxdWFsLCBkZWNsKSkKKyAgICAgICAgZWxpZiBwcm90by5uYW1lID09ICJDcmVhdGVJbnN0YW5jZSI6CisgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAjIENyZWF0ZUluc3RhbmNlIG5lZWRzIHRvIHVzZSB0aGUgc2Vjb25kIHBhcm0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgdG8gc2V0IHRoZSBjb3JyZWN0IGRpc3BhdGNoIHRhYmxlCisgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgY2hhciBzdHJbMTAyNF07XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcENyZWF0ZUluc3RhbmNlID0gKFBGTl92a0NyZWF0ZUluc3RhbmNlKSBmcEdldEluc3RhbmNlUHJvY0FkZHIoTlVMTCwgInZrQ3JlYXRlSW5zdGFuY2UiKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGlmIChmcENyZWF0ZUluc3RhbmNlID09IE5VTEwpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgLy8gQWR2YW5jZSB0aGUgbGluayBpbmZvIGZvciB0aGUgbmV4dCBlbGVtZW50IG9uIHRoZSBjaGFpblxuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIFZrUmVzdWx0IHJlc3VsdCA9IGZwQ3JlYXRlSW5zdGFuY2UocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICByZXR1cm4gcmVzdWx0O1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcFRhYmxlID0gaW5pdEluc3RhbmNlVGFibGUoKnBJbnN0YW5jZSwgZnBHZXRJbnN0YW5jZVByb2NBZGRyKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGNyZWF0ZUluc3RhbmNlUmVnaXN0ZXJFeHRlbnNpb25zKHBDcmVhdGVJbmZvLCAqcEluc3RhbmNlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGxheWVyX2RhdGEgKm15X2RhdGEgPSBnZXRfbXlfZGF0YV9wdHIoZ2V0X2Rpc3BhdGNoX2tleSgqcEluc3RhbmNlKSwgbGF5ZXJfZGF0YV9tYXApO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgbXlfZGF0YS0+cmVwb3J0X2RhdGEgPSBkZWJ1Z19yZXBvcnRfY3JlYXRlX2luc3RhbmNlKFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBwVGFibGUsXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICpwSW5zdGFuY2UsXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQsXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBpbml0X2dlbmVyaWMobXlfZGF0YSwgcEFsbG9jYXRvcik7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBzcHJpbnRmKHN0ciwgIkNvbXBsZXRlZCBnZW5lcmljIGxheWVyZWQgJXNcXG4iKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGxvZ19tc2cobXlfZGF0YS0+cmVwb3J0X2RhdGEsIFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhULCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhULCAodWludDY0X3QpKnBJbnN0YW5jZSwgX19MSU5FX18sIDAsIChjaGFyICopICJnZW5lcmljIiwgIiUlcyIsIChjaGFyICopIHN0cik7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICByZXR1cm4gcmVzdWx0O1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICd9XG4nICUgKHF1YWwsIGRlY2wsIHByb3RvLm5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgd3NpX25hbWUocHJvdG8ubmFtZSk6CisgICAgICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclcycgJSB3c2lfaWZkZWYocHJvdG8ubmFtZSkpCisgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICBkaXNwYXRjaF9wYXJhbSA9IHByb3RvLnBhcmFtc1swXS5uYW1lCisgICAgICAgICAgICAjIE11c3QgdXNlICdpbnN0YW5jZScgdGFibGUgZm9yIHRoZXNlIEFQSXMsICdkZXZpY2UnIHRhYmxlIG90aGVyd2lzZQorICAgICAgICAgICAgdGFibGVfdHlwZSA9ICIiCisgICAgICAgICAgICBpZiBwcm90b19pc19nbG9iYWwocHJvdG8pOgorICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUgPSAiaW5zdGFuY2UiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUgPSAiZGV2aWNlIgorICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclcyVzXG4nCisgICAgICAgICAgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAlcyVzX2Rpc3BhdGNoX3RhYmxlKCVzKS0+JXM7XG4nCisgICAgICAgICAgICAgICAgICAgICAnJXMnCisgICAgICAgICAgICAgICAgICAgICAnfScgJSAocXVhbCwgZGVjbCwgcmV0X3ZhbCwgdGFibGVfdHlwZSwgZGlzcGF0Y2hfcGFyYW0sIHByb3RvLmNfY2FsbCgpLCBzdG10KSkKKyAgICAgICAgICAgIGlmIHdzaV9uYW1lKHByb3RvLm5hbWUpOgorICAgICAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgnJXMnICUgd3NpX2VuZGlmKHByb3RvLm5hbWUpKQorICAgICAgICByZXR1cm4gIlxuXG4iLmpvaW4oZnVuY3MpCisKKyAgICBkZWYgZ2VuZXJhdGVfYm9keShzZWxmKToKKyAgICAgICAgc2VsZi5sYXllcl9uYW1lID0gImdlbmVyaWMiCisgICAgICAgIGluc3RhbmNlX2V4dGVuc2lvbnM9WygnbXNnX2NhbGxiYWNrX2dldF9wcm9jX2FkZHInLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAoJ3dzaV9lbmFibGVkJywKKyAgICAgICAgICAgICAgICAgICAgIFsndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiddKV0KKyAgICAgICAgZXh0ZW5zaW9ucz1bKCd3c2lfZW5hYmxlZCcsCisgICAgICAgICAgICAgICAgICAgICBbJ3ZrQ3JlYXRlU3dhcGNoYWluS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAndmtEZXN0cm95U3dhcGNoYWluS0hSJywgJ3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAndmtBY3F1aXJlTmV4dEltYWdlS0hSJywgJ3ZrUXVldWVQcmVzZW50S0hSJ10pXQorICAgICAgICBib2R5ID0gW3NlbGYuX2dlbmVyYXRlX2xheWVyX2luaXRpYWxpemF0aW9uKFRydWUpLAorICAgICAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX2Rpc3BhdGNoX2VudHJ5cG9pbnRzKCJWS19MQVlFUl9FWFBPUlQiKSwKKyAgICAgICAgICAgICAgICBzZWxmLl9nZW5fY3JlYXRlX21zZ19jYWxsYmFjaygpLAorICAgICAgICAgICAgICAgIHNlbGYuX2dlbl9kZXN0cm95X21zZ19jYWxsYmFjaygpLAorICAgICAgICAgICAgICAgIHNlbGYuX2dlbl9kZWJ1Z19yZXBvcnRfbXNnKCksCisgICAgICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfbGF5ZXJfZ3BhX2Z1bmN0aW9uKGV4dGVuc2lvbnMsIGluc3RhbmNlX2V4dGVuc2lvbnMpXQorCisgICAgICAgIHJldHVybiAiXG5cbiIuam9pbihib2R5KQorCitjbGFzcyBBcGlEdW1wU3ViY29tbWFuZChTdWJjb21tYW5kKToKKyAgICBkZWYgZ2VuZXJhdGVfaGVhZGVyKHNlbGYpOgorICAgICAgICBoZWFkZXJfdHh0ID0gW10KKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSA8ZnN0cmVhbT4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPGlvc3RyZWFtPicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSA8c3RyaW5nPicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSA8c3RyaW5nLmg+JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmtfbG9hZGVyX3BsYXRmb3JtLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrX2FwaV9kdW1wX2hlbHBlcl9jcHAuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrX2xheWVyX3RhYmxlLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a19sYXllcl9leHRlbnNpb25fdXRpbHMuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrX2xheWVyX2NvbmZpZy5oIicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmtfbGF5ZXJfdXRpbHMuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJhcGlfZHVtcC5oIicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnc3RhdGljIHN0ZDo6b2ZzdHJlYW0gZmlsZVN0cmVhbTsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpZmRlZiBBTkRST0lEJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3N0YXRpYyBzdGQ6OnN0cmluZyBmaWxlTmFtZSA9ICIvc2RjYXJkL0FuZHJvaWQvdmtfYXBpZHVtcC50eHQiOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZWxzZScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCdzdGF0aWMgc3RkOjpzdHJpbmcgZmlsZU5hbWUgPSAidmtfYXBpZHVtcC50eHQiOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZW5kaWYnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3N0ZDo6b3N0cmVhbSogb3V0cHV0U3RyZWFtID0gTlVMTDsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgndm9pZCBDb25maWd1cmVPdXRwdXRTdHJlYW0oYm9vbCB3cml0ZVRvRmlsZSwgYm9vbCBmbHVzaEFmdGVyV3JpdGUpJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3snKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgIGlmKHdyaXRlVG9GaWxlKScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgeycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgICAgIGlmIChmaWxlTmFtZSA9PSAic3Rkb3V0IiknKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9ICZzdGQ6OmNvdXQ7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgICAgICgqb3V0cHV0U3RyZWFtKSA8PCBzdGQ6OmVuZGwgPDwgImFwaV9kdW1wIG91dHB1dCBmaWxlbmFtZSBcJ3N0ZG91dFwnIHNwZWNpZmllZC4gV3JpdGluZyB0byBTVERPVVQgaW5zdGVhZCBvZiBhIGZpbGUuIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgICAgIH0gZWxzZSB7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgICAgIGZpbGVTdHJlYW0ub3BlbihmaWxlTmFtZSk7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgICAgIGlmICgoZmlsZVN0cmVhbS5yZHN0YXRlKCkgJiBmaWxlU3RyZWFtLmZhaWxiaXQpICE9IDApIHsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9ICZzdGQ6OmNvdXQ7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgICAgICAgICAoKm91dHB1dFN0cmVhbSkgPDwgc3RkOjplbmRsIDw8ICJhcGlfZHVtcCBFUlJPUjogQmFkIG91dHB1dCBmaWxlbmFtZSBzcGVjaWZpZWQ6ICIgPDwgZmlsZU5hbWUgPDwgIi4gV3JpdGluZyB0byBTVERPVVQgaW5zdGVhZCIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgICAgICAgICBlbHNlJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSAmZmlsZVN0cmVhbTsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICBlbHNlJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgb3V0cHV0U3RyZWFtID0gJnN0ZDo6Y291dDsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICBpZihmbHVzaEFmdGVyV3JpdGUpJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgb3V0cHV0U3RyZWFtLT5zeW5jX3dpdGhfc3RkaW8odHJ1ZSk7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICBlbHNlJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgb3V0cHV0U3RyZWFtLT5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgfScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnfScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3N0YXRpYyBib29sIGdfQXBpRHVtcERldGFpbGVkID0gdHJ1ZTsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnc3RhdGljIHVpbnQ2NF90IGdfZnJhbWVDb3VudGVyID0gMDsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3N0YXRpYyBMT0FERVJfUExBVEZPUk1fVEhSRUFEX09OQ0VfREVDTEFSQVRJT04oaW5pdE9uY2UpOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnc3RhdGljIGludCBwcmludExvY2tJbml0aWFsaXplZCA9IDA7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3N0YXRpYyBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX211dGV4IHByaW50TG9jazsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZGVmaW5lIExBWUVSX0VYVF9BUlJBWV9TSVpFIDEnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2RlZmluZSBMQVlFUl9ERVZfRVhUX0FSUkFZX1NJWkUgMScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZGVmaW5lIE1BWF9USUQgNTEzJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3N0YXRpYyBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2lkIHRpZE1hcHBpbmdbTUFYX1RJRF0gPSB7MH07JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3N0YXRpYyB1aW50MzJfdCBtYXhUSUQgPSAwOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcvLyBNYXAgYWN0dWFsIFRJRCB0byBhbiBpbmRleCB2YWx1ZSBhbmQgcmV0dXJuIHRoYXQgaW5kZXgnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnLy8gIFRoaXMga2VlcHMgVElEcyBpbiByYW5nZSBmcm9tIDAtTUFYX1RJRCBhbmQgc2ltcGxpZmllcyBjb21wYXJlcyBiZXR3ZWVuIHJ1bnMnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnc3RhdGljIHVpbnQzMl90IGdldFRJREluZGV4KCkgeycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9pZCB0aWQgPSBsb2FkZXJfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1heFRJRDsgaSsrKSB7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICAgICAgaWYgKHRpZCA9PSB0aWRNYXBwaW5nW2ldKScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgICAgICAgICByZXR1cm4gaTsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgiICAgIC8vIERvbid0IHlldCBoYXZlIG1hcHBpbmcsIHNldCBpdCBhbmQgcmV0dXJuIG5ld2x5IHNldCBpbmRleCIpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgICAgdWludDMyX3QgcmV0VmFsID0gKHVpbnQzMl90KSBtYXhUSUQ7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB0aWRNYXBwaW5nW21heFRJRCsrXSA9IHRpZDsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgIGFzc2VydChtYXhUSUQgPCBNQVhfVElEKTsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgIHJldHVybiByZXRWYWw7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ30nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihoZWFkZXJfdHh0KQorCisgICAgZGVmIGdlbmVyYXRlX2luaXQoc2VsZik6CisgICAgICAgIGZ1bmNfYm9keSA9IFtdCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyNpbmNsdWRlICJ2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCInKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcjaW5jbHVkZSAidmtfbGF5ZXJfY29uZmlnLmgiJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnc3RhdGljIHZvaWQgaW5pdCVzKHZvaWQpJyAlIHNlbGYubGF5ZXJfbmFtZSkKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgneycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICB1c2luZyBuYW1lc3BhY2UgU3RyZWFtQ29udHJvbDsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgY2hhciBjb25zdCpjb25zdCBsb2dOYW1lID0gZ2V0TGF5ZXJPcHRpb24oImx1bmFyZ19hcGlfZHVtcC5sb2dfZmlsZW5hbWUiKTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgaWYobG9nTmFtZSAhPSBOVUxMKScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICBmaWxlTmFtZSA9IGxvZ05hbWU7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgY2hhciBjb25zdCpjb25zdCBkZXRhaWxlZFN0ciA9IGdldExheWVyT3B0aW9uKCJsdW5hcmdfYXBpX2R1bXAuZGV0YWlsZWQiKTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgaWYoZGV0YWlsZWRTdHIgIT0gTlVMTCknKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgaWYoc3RyY21wKGRldGFpbGVkU3RyLCAiVFJVRSIpID09IDApJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgZ19BcGlEdW1wRGV0YWlsZWQgPSB0cnVlOycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgZWxzZSBpZihzdHJjbXAoZGV0YWlsZWRTdHIsICJGQUxTRSIpID09IDApJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgZ19BcGlEdW1wRGV0YWlsZWQgPSBmYWxzZTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBjaGFyIGNvbnN0KmNvbnN0IHdyaXRlVG9GaWxlU3RyID0gZ2V0TGF5ZXJPcHRpb24oImx1bmFyZ19hcGlfZHVtcC5maWxlIik7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGJvb2wgd3JpdGVUb0ZpbGUgPSBmYWxzZTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgaWYod3JpdGVUb0ZpbGVTdHIgIT0gTlVMTCknKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgaWYoc3RyY21wKHdyaXRlVG9GaWxlU3RyLCAiVFJVRSIpID09IDApJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgd3JpdGVUb0ZpbGUgPSB0cnVlOycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgZWxzZSBpZihzdHJjbXAod3JpdGVUb0ZpbGVTdHIsICJGQUxTRSIpID09IDApJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgd3JpdGVUb0ZpbGUgPSBmYWxzZTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBjaGFyIGNvbnN0KmNvbnN0IG5vQWRkclN0ciA9IGdldExheWVyT3B0aW9uKCJsdW5hcmdfYXBpX2R1bXAubm9fYWRkciIpOycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBpZihub0FkZHJTdHIgIT0gTlVMTCknKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgaWYoc3RyY21wKG5vQWRkclN0ciwgIkZBTFNFIikgPT0gMCknKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBTdHJlYW1Db250cm9sOjp3cml0ZUFkZHJlc3MgPSB0cnVlOycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgZWxzZSBpZihzdHJjbXAobm9BZGRyU3RyLCAiVFJVRSIpID09IDApJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgU3RyZWFtQ29udHJvbDo6d3JpdGVBZGRyZXNzID0gZmFsc2U7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgY2hhciBjb25zdCpjb25zdCBmbHVzaEFmdGVyV3JpdGVTdHIgPSBnZXRMYXllck9wdGlvbigibHVuYXJnX2FwaV9kdW1wLmZsdXNoIik7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGJvb2wgZmx1c2hBZnRlcldyaXRlID0gZmFsc2U7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGlmKGZsdXNoQWZ0ZXJXcml0ZVN0ciAhPSBOVUxMKScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICBpZihzdHJjbXAoZmx1c2hBZnRlcldyaXRlU3RyLCAiVFJVRSIpID09IDApJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgZmx1c2hBZnRlcldyaXRlID0gdHJ1ZTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIGVsc2UgaWYoc3RyY21wKGZsdXNoQWZ0ZXJXcml0ZVN0ciwgIkZBTFNFIikgPT0gMCknKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBmbHVzaEFmdGVyV3JpdGUgPSBmYWxzZTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBDb25maWd1cmVPdXRwdXRTdHJlYW0od3JpdGVUb0ZpbGUsIGZsdXNoQWZ0ZXJXcml0ZSk7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGlmICghcHJpbnRMb2NrSW5pdGlhbGl6ZWQpJykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIC8vIFRPRE8vVEJEOiBOZWVkIHRvIGRlbGV0ZSB0aGlzIG11dGV4IHNvbWV0aW1lLiAgSG93Pz8/JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2NyZWF0ZV9tdXRleCgmcHJpbnRMb2NrKTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIHByaW50TG9ja0luaXRpYWxpemVkID0gMTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJ30nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGZ1bmNfYm9keSkKKworICAgIGRlZiBnZW5lcmF0ZV9pbnRlcmNlcHQoc2VsZiwgcHJvdG8sIHF1YWwpOgorICAgICAgICBpZiBwcm90by5uYW1lIGluIFsgJ0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJywnRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywnRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzJywnRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyddOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZGVjbCA9IHByb3RvLmNfZnVuYyhwcmVmaXg9InZrIiwgYXR0cj0iVktBUEkiKQorICAgICAgICByZXRfdmFsID0gJycKKyAgICAgICAgc3RtdCA9ICcnCisgICAgICAgIGZ1bmNzID0gW10KKyAgICAgICAgc3BfcGFyYW1fZGljdCA9IHt9ICMgU3RvcmUgJ2luZGV4JyBmb3Igc3RydWN0IHBhcmFtIHRvIHByaW50LCBvciBhbiBuYW1lIG9mIGJpbmRpbmcgIkNvdW50IiBwYXJhbSBmb3IgYXJyYXkgdG8gcHJpbnQKKyAgICAgICAgY3JlYXRlX3BhcmFtcyA9IDAgIyBOdW0gb2YgcGFyYW1zIGF0IGVuZCBvZiBmdW5jdGlvbiB0aGF0IGFyZSBjcmVhdGVkIGFuZCByZXR1cm5lZCBhcyBvdXRwdXQgdmFsdWVzCisgICAgICAgIGlmICdBbGxvY2F0ZURlc2NyaXB0b3JTZXRzJyBpbiBwcm90by5uYW1lOgorICAgICAgICAgICAgY3JlYXRlX3BhcmFtcyA9IC0xCisgICAgICAgIGVsaWYgJ0NyZWF0ZScgaW4gcHJvdG8ubmFtZSBvciAnQWxsb2MnIGluIHByb3RvLm5hbWUgb3IgJ01hcE1lbW9yeScgaW4gcHJvdG8ubmFtZToKKyAgICAgICAgICAgIGNyZWF0ZV9wYXJhbXMgPSAtMQorICAgICAgICBpZiBwcm90by5yZXQgIT0gInZvaWQiOgorICAgICAgICAgICAgcmV0X3ZhbCA9ICIlcyByZXN1bHQgPSAiICUgcHJvdG8ucmV0CisgICAgICAgICAgICBzdG10ID0gIiAgICByZXR1cm4gcmVzdWx0O1xuIgorICAgICAgICBmX29wZW4gPSAnbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZwcmludExvY2spO1xuICAgICcKKyAgICAgICAgbG9nX2Z1bmMgPSAnJXNcbicgJSBzZWxmLmxpbmVpbmZvLmdldCgpCisgICAgICAgIGxvZ19mdW5jICs9ICcgICAgaWYgKFN0cmVhbUNvbnRyb2w6OndyaXRlQWRkcmVzcyA9PSB0cnVlKSB7JworICAgICAgICBsb2dfZnVuYyArPSAnXG4gICAgICAgICgqb3V0cHV0U3RyZWFtKSA8PCAidHsiIDw8IGdldFRJREluZGV4KCkgPDwgIn0gZnsiIDw8IGdfZnJhbWVDb3VudGVyIDw8ICJ9IHZrJXMoJyAlIHByb3RvLm5hbWUKKyAgICAgICAgbG9nX2Z1bmNfbm9fYWRkciA9ICdcbiAgICAgICAgKCpvdXRwdXRTdHJlYW0pIDw8ICJ0eyIgPDwgZ2V0VElESW5kZXgoKSA8PCAifSBmeyIgPDwgZ19mcmFtZUNvdW50ZXIgPDwgIn0gdmslcygnICUgcHJvdG8ubmFtZQorICAgICAgICBmX2Nsb3NlID0gJ1xuICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZwcmludExvY2spOycKKyAgICAgICAgcGluZGV4ID0gMAorICAgICAgICBwcmV2X2NvdW50X25hbWUgPSAnJworICAgICAgICBmb3IgcCBpbiBwcm90by5wYXJhbXM6CisgICAgICAgICAgICBjcCA9IEZhbHNlCisgICAgICAgICAgICBpZiAwICE9IGNyZWF0ZV9wYXJhbXM6CisgICAgICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGFueSBvZiB0aGUgTiBsYXN0IHBhcmFtcyBvZiB0aGUgZnVuYywgdHJlYXQgYXMgb3V0cHV0CisgICAgICAgICAgICAgICAgZm9yIHkgaW4gcmFuZ2UoLTEsIGNyZWF0ZV9wYXJhbXMtMSwgLTEpOgorICAgICAgICAgICAgICAgICAgICBpZiBwLm5hbWUgPT0gcHJvdG8ucGFyYW1zW3ldLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBjcCA9IFRydWUKKyAgICAgICAgICAgIChwZnQsIHBmaSwgY2FzdCkgPSBzZWxmLl9nZXRfcHJpbnRmX3BhcmFtcyhwLnR5LCBwLm5hbWUsIGNwLCBjb3VudD00KQorCisgICAgICAgICAgICBpZiBwLm5hbWUgPT0gInBTd2FwY2hhaW4iIG9yIHAubmFtZSA9PSAicFN3YXBjaGFpbkltYWdlcyI6CisgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJyVzID0gMHgiIDw8IG5vdXBwZXJjYXNlIDw8ICBoZXggPDwgSGFuZGxlQ2FzdCglcykgPDwgZGVjIDw8ICIsICcgJSAocC5uYW1lLCBwLm5hbWUpCisgICAgICAgICAgICBlbGlmIHAubmFtZSA9PSAic3dhcGNoYWluIjoKKyAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnJXMlcyA9IDB4IiA8PCBub3VwcGVyY2FzZSA8PCAgaGV4IDw8IEhhbmRsZUNhc3QoJXMpIDw8IGRlYyA8PCAiLCAnICUgKGNhc3QsIHAubmFtZSwgcC5uYW1lKQorICAgICAgICAgICAgZWxpZiBwLm5hbWUgPT0gInZpc3VhbF9pZCI6CisgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJyVzID0gMHgiIDw8IG5vdXBwZXJjYXNlIDw8ICBoZXggPDwgJXMgPDwgZGVjIDw8ICIsICcgJSAocC5uYW1lLCBwLm5hbWUpCisgICAgICAgICAgICBlbGlmICcweCcgaW4gcGZ0OgorICAgICAgICAgICAgICAgIGlmICIqIiBpbiBjYXN0OgorICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnIiA8PCAoJXMgPyBcIiVzXCIgOiBcIlwiKSA8PCAiJXMgPSAweCIgPDwgbm91cHBlcmNhc2UgPDwgIGhleCA8PCAoJXMgPyAlcyA6IDApIDw8IGRlYyA8PCAiLCAnICUgKHAubmFtZSwgY2FzdCwgcC5uYW1lLCBwLm5hbWUsIHBmaSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnJXMlcyA9IDB4IiA8PCBub3VwcGVyY2FzZSA8PCAgaGV4IDw8ICVzIDw8IGRlYyA8PCAiLCAnICUgKGNhc3QsIHAubmFtZSwgcGZpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnJXMlcyA9ICIgPDwgJXMgPDwgIiwgJyAlIChjYXN0LCBwLm5hbWUsIHBmaSkKKyAgICAgICAgICAgIGlmICIlcCIgaW4gcGZ0OgorICAgICAgICAgICAgICAgIGxvZ19mdW5jX25vX2FkZHIgKz0gJyVzID0gYWRkcmVzcywgJyAlIChwLm5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ19mdW5jX25vX2FkZHIgKz0gJyVzJXMgPSAiIDw8ICVzIDw8ICIsICcgJSAoY2FzdCwgcC5uYW1lLCBwZmkpCisgICAgICAgICAgICBpZiBwcmV2X2NvdW50X25hbWUgIT0gJycgYW5kIChwcmV2X2NvdW50X25hbWUucmVwbGFjZSgnQ291bnQnLCAnJylbMTpdIGluIHAubmFtZSk6CisgICAgICAgICAgICAgICAgc3BfcGFyYW1fZGljdFtwaW5kZXhdID0gcHJldl9jb3VudF9uYW1lCisgICAgICAgICAgICAgICAgcHJldl9jb3VudF9uYW1lID0gJycKKyAgICAgICAgICAgIGVsaWYgdmtfaGVscGVyX2FwaV9kdW1wLmlzX3R5cGUocC50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSwgJ3N0cnVjdCcpOgorICAgICAgICAgICAgICAgIHNwX3BhcmFtX2RpY3RbcGluZGV4XSA9ICdpbmRleCcKKyAgICAgICAgICAgIGlmIHAubmFtZS5lbmRzd2l0aCgnQ291bnQnKToKKyAgICAgICAgICAgICAgICBpZiAnKicgaW4gcC50eToKKyAgICAgICAgICAgICAgICAgICAgcHJldl9jb3VudF9uYW1lID0gIiolcyIgJSBwLm5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmV2X2NvdW50X25hbWUgPSBwLm5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJldl9jb3VudF9uYW1lID0gJycKKyAgICAgICAgICAgIHBpbmRleCArPSAxCisgICAgICAgIGxvZ19mdW5jID0gbG9nX2Z1bmMuc3RyaXAoJywgJykKKyAgICAgICAgbG9nX2Z1bmNfbm9fYWRkciA9IGxvZ19mdW5jX25vX2FkZHIuc3RyaXAoJywgJykKKyAgICAgICAgaWYgcHJvdG8ucmV0ID09ICJWa1Jlc3VsdCI6CisgICAgICAgICAgICBsb2dfZnVuYyArPSAnKSA9ICIgPDwgc3RyaW5nX1ZrUmVzdWx0KChWa1Jlc3VsdClyZXN1bHQpIDw8IGVuZGwnCisgICAgICAgICAgICBsb2dfZnVuY19ub19hZGRyICs9ICcpID0gIiA8PCBzdHJpbmdfVmtSZXN1bHQoKFZrUmVzdWx0KXJlc3VsdCkgPDwgZW5kbCcKKyAgICAgICAgZWxpZiBwcm90by5yZXQgPT0gInZvaWQqIjoKKyAgICAgICAgICAgIGxvZ19mdW5jICs9ICcpID0gIiA8PCBIYW5kbGVDYXN0KHJlc3VsdCkgPDwgZW5kbCcKKyAgICAgICAgICAgIGxvZ19mdW5jX25vX2FkZHIgKz0gJykgPSAiIDw8IEhhbmRsZUNhc3QocmVzdWx0KSA8PCBlbmRsJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJylcXG4iJworICAgICAgICAgICAgbG9nX2Z1bmNfbm9fYWRkciArPSAnKVxcbiInCisgICAgICAgIGxvZ19mdW5jICs9ICc7JworICAgICAgICBsb2dfZnVuY19ub19hZGRyICs9ICc7JworICAgICAgICBsb2dfZnVuYyArPSAnXG4gICAgfVxuICAgIGVsc2UgeyVzXG4gICAgfScgJSBsb2dfZnVuY19ub19hZGRyOworICAgICAgICBsb2dfZnVuYyArPSAnXG4lcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpCisgICAgICAgICMgbG9nX2Z1bmMgKz0gJ1xuLy8gUHJvdG8gJXMgaGFzIHBhcmFtX2RpY3Q6ICVzJyAlIChwcm90by5uYW1lLCBzcF9wYXJhbV9kaWN0KQorICAgICAgICBpZiBsZW4oc3BfcGFyYW1fZGljdCkgPiAwOgorICAgICAgICAgICAgaW5kZW50ID0gJyAgICAnCisgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lc2lmIChnX0FwaUR1bXBEZXRhaWxlZCkgeycgJSBpbmRlbnQKKyAgICAgICAgICAgIGluZGVudCArPSAnICAgICcKKyAgICAgICAgICAgIGlfZGVjbCA9IEZhbHNlCisgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpCisgICAgICAgICAgICBmb3Igc3BfaW5kZXggaW4gc3BfcGFyYW1fZGljdDoKKyAgICAgICAgICAgICAgICAjIGxvZ19mdW5jICs9ICdcbi8vIHNwX2luZGV4OiAlcycgJSBzdHIoc3BfaW5kZXgpCisgICAgICAgICAgICAgICAgaWYgJ2luZGV4JyA9PSBzcF9wYXJhbV9kaWN0W3NwX2luZGV4XToKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJvdG8ucGFyYW1zW3NwX2luZGV4XS50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSBpbiB2a19oZWxwZXJfYXBpX2R1bXAub3BhcXVlX3R5cGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX25hbWUgPSBwcm90by5wYXJhbXNbc3BfaW5kZXhdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgJyonIG5vdCBpbiBwcm90by5wYXJhbXNbc3BfaW5kZXhdLnR5OgorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfbmFtZSA9ICcmJXMnICUgcHJvdG8ucGFyYW1zW3NwX2luZGV4XS5uYW1lCisgICAgICAgICAgICAgICAgICAgIGxvZ19mdW5jICs9ICdcbiVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgY2lzX3ByaW50X2Z1bmMgPSAndmtfcHJpbnRfJXMnICUgKHByb3RvLnBhcmFtc1tzcF9pbmRleF0udHkucmVwbGFjZSgnY29uc3QgJywgJycpLnN0cmlwKCcqJykubG93ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXNpZiAoJXMpIHsnICUgKGluZGVudCwgbG9jYWxfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICcgICAgJworICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lc3N0cmluZyB0bXBfc3RyID0gJXMoJXMsICIgICAgIik7JyAlIChpbmRlbnQsIGNpc19wcmludF9mdW5jLCBsb2NhbF9uYW1lKQorICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lcygqb3V0cHV0U3RyZWFtKSA8PCAiICAgJXM6XFxuIiA8PCB0bXBfc3RyIDw8IGVuZGw7JyAlIChpbmRlbnQsIGxvY2FsX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGluZGVudFs0Ol0KKyAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXN9JyAlIChpbmRlbnQpCisgICAgICAgICAgICAgICAgZWxzZTogIyBXZSBoYXZlIGEgY291bnQgdmFsdWUgc3RvcmVkIHRvIGl0ZXJhdGUgb3ZlciBhbiBhcnJheQorICAgICAgICAgICAgICAgICAgICBwcmludF9jYXN0ID0gJycKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfZnVuYyA9ICcnCisgICAgICAgICAgICAgICAgICAgIGlmIHZrX2hlbHBlcl9hcGlfZHVtcC5pc190eXBlKHByb3RvLnBhcmFtc1tzcF9pbmRleF0udHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJyksICdzdHJ1Y3QnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Nhc3QgPSAnJicKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Z1bmMgPSAndmtfcHJpbnRfJXMnICUgcHJvdG8ucGFyYW1zW3NwX2luZGV4XS50eS5yZXBsYWNlKCdjb25zdCAnLCAnJykuc3RyaXAoJyonKS5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9jYXN0ID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Z1bmMgPSAnc3RyaW5nX2NvbnZlcnRfaGVscGVyJworICAgICAgICAgICAgICAgICAgICAgICAgI2Npc19wcmludF9mdW5jID0gJ3RtcF9zdHIgPSBzdHJpbmdfY29udmVydF9oZWxwZXIoSGFuZGxlQ2FzdCglc1tpXSksICIgICAgIik7JyAlIHByb3RvLnBhcmFtc1tzcF9pbmRleF0ubmFtZQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaV9kZWNsOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXN1aW50MzJfdCBpOycgJSAoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgaV9kZWNsID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lc2lmICglcykgeycgJSAoaW5kZW50LCBwcm90by5wYXJhbXNbc3BfaW5kZXhdLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAnICAgICcKKyAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXMnICUgc2VsZi5saW5laW5mby5nZXQoKQorICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lc2ZvciAoaSA9IDA7IGkgPCAlczsgaSsrKSB7JyAlIChpbmRlbnQsIHNwX3BhcmFtX2RpY3Rbc3BfaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAgICAnCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwcm90by5wYXJhbXNbc3BfaW5kZXhdLnR5LnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpIGluIHZrX2hlbHBlcl9hcGlfZHVtcC5vcGFxdWVfdHlwZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBjaXNfcHJpbnRfZnVuYyA9ICdzdHJpbmcgdG1wX3N0ciA9ICVzKCVzJXNbaV0sICIgICAgIik7JyAlIChwcmludF9mdW5jLCBwcmludF9jYXN0LCBwcm90by5wYXJhbXNbc3BfaW5kZXhdLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lc2lmIChTdHJlYW1Db250cm9sOjp3cml0ZUFkZHJlc3MgPT0gdHJ1ZSkgeycgJSAoaW5kZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICcgICAgJworICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXMlcycgJSAoaW5kZW50LCBjaXNfcHJpbnRfZnVuYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19mdW5jICs9ICdcbiVzKCpvdXRwdXRTdHJlYW0pIDw8ICIgICAlc1siIDw8IGkgPDwgIl06XFxuIiA8PCB0bXBfc3RyIDw8IGVuZGw7JyAlIChpbmRlbnQsIHByb3RvLnBhcmFtc1tzcF9pbmRleF0ubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19mdW5jICs9ICdcbiVzaWYgKFN0cmVhbUNvbnRyb2w6OndyaXRlQWRkcmVzcyA9PSB0cnVlKSB7JyAlIChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lcygqb3V0cHV0U3RyZWFtKSA8PCAiICAgJXNbIiA8PCBpIDw8ICJdID0gMHgiIDw8IG5vdXBwZXJjYXNlIDw8IGhleCA8PCBIYW5kbGVDYXN0KCVzW2ldKSA8PCBkZWMgPDwgZW5kbDsnICUgKGluZGVudCwgcHJvdG8ucGFyYW1zW3NwX2luZGV4XS5uYW1lLCBwcm90by5wYXJhbXNbc3BfaW5kZXhdLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGluZGVudFs0Ol0KKyAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXN9JyAlIChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGluZGVudFs0Ol0KKyAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXN9JyAlIChpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGluZGVudFs0Ol0KKyAgICAgICAgICAgICAgICAgICAgbG9nX2Z1bmMgKz0gJ1xuJXN9JyAlIChpbmRlbnQpCisgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnRbNDpdCisgICAgICAgICAgICBsb2dfZnVuYyArPSAnXG4lc30nICUgKGluZGVudCkKKyAgICAgICAgdGFibGVfdHlwZSA9ICcnCisgICAgICAgIGlmIHByb3RvX2lzX2dsb2JhbChwcm90byk6CisgICAgICAgICAgIHRhYmxlX3R5cGUgPSAnaW5zdGFuY2UnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIHRhYmxlX3R5cGUgPSAnZGV2aWNlJworICAgICAgICBkaXNwYXRjaF9wYXJhbSA9IHByb3RvLnBhcmFtc1swXS5uYW1lCisKKyAgICAgICAgaWYgcHJvdG8ubmFtZSA9PSAiQ3JlYXRlSW5zdGFuY2UiOgorICAgICAgICAgICAgZGlzcGF0Y2hfcGFyYW0gPSAnKicgKyBwcm90by5wYXJhbXNbMV0ubmFtZQorICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclcyVzXG4nCisgICAgICAgICAgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB1c2luZyBuYW1lc3BhY2UgU3RyZWFtQ29udHJvbDtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9vbmNlKCZpbml0T25jZSwgaW5pdGFwaV9kdW1wKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqY2hhaW5faW5mbyA9IGdldF9jaGFpbl9pbmZvKHBDcmVhdGVJbmZvLCBWS19MQVlFUl9MSU5LX0lORk8pO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFBGTl92a0NyZWF0ZUluc3RhbmNlIGZwQ3JlYXRlSW5zdGFuY2UgPSAoUEZOX3ZrQ3JlYXRlSW5zdGFuY2UpIGZwR2V0SW5zdGFuY2VQcm9jQWRkcihOVUxMLCAidmtDcmVhdGVJbnN0YW5jZSIpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpZiAoZnBDcmVhdGVJbnN0YW5jZSA9PSBOVUxMKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAoKm91dHB1dFN0cmVhbSkgPDwgInR7IiA8PCBnZXRUSURJbmRleCgpIDw8ICJ9ICIgPDwgZ19mcmFtZUNvdW50ZXIgPDwgIiB2a0NyZWF0ZUluc3RhbmNlIEZBSUxFRCBUTyBGSU5EIFBST0MgQUREUkVTUyIgPDwgZW5kbDtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgLy8gQWR2YW5jZSB0aGUgbGluayBpbmZvIGZvciB0aGUgbmV4dCBlbGVtZW50IG9uIHRoZSBjaGFpblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBhc3NlcnQoY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVmtSZXN1bHQgcmVzdWx0ID0gZnBDcmVhdGVJbnN0YW5jZShwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEluc3RhbmNlKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBpbml0SW5zdGFuY2VUYWJsZSgqcEluc3RhbmNlLCBmcEdldEluc3RhbmNlUHJvY0FkZHIpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgY3JlYXRlSW5zdGFuY2VSZWdpc3RlckV4dGVuc2lvbnMocENyZWF0ZUluZm8sICpwSW5zdGFuY2UpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICVzJXMlc1xuJworICAgICAgICAgICAgICAgICAgICAgJyVzJworICAgICAgICAgICAgICAgICAgICAgJ31cbicgJSAocXVhbCwgZGVjbCwgZl9vcGVuLCBsb2dfZnVuYywgZl9jbG9zZSwgc3RtdCkpCisKKyAgICAgICAgZWxpZiBwcm90by5uYW1lID09ICJDcmVhdGVEZXZpY2UiOgorICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclc1xuJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJXNcbicKKyAgICAgICAgICAgICAgICAgICAgICd7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG5hbWVzcGFjZSBTdHJlYW1Db250cm9sO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAlc2V4cGxpY2l0X0NyZWF0ZURldmljZShwaHlzaWNhbERldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBEZXZpY2UpO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAlcyVzJXNcbicKKyAgICAgICAgICAgICAgICAgICAgICclcycKKyAgICAgICAgICAgICAgICAgICAgICd9JyAlIChxdWFsLCBkZWNsLCByZXRfdmFsLCBmX29wZW4sIGxvZ19mdW5jLCBmX2Nsb3NlLCBzdG10KSkKKyAgICAgICAgZWxpZiBwcm90by5uYW1lID09ICJEZXN0cm95RGV2aWNlIjoKKyAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgnJXMlc1xuJworICAgICAgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG5hbWVzcGFjZSBTdHJlYW1Db250cm9sO1xuJworICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7XG4nCisgICAgICAgICAgICAgICAgICcgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKTtcbicKKyAgICAgICAgICAgICAgICAgJyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgID0gJXNfZGlzcGF0Y2hfdGFibGUoJXMpO1xuJworICAgICAgICAgICAgICAgICAnICAgICVzcERpc3AtPiVzO1xuJworICAgICAgICAgICAgICAgICAnICAgIGRldmljZUV4dE1hcC5lcmFzZShwRGlzcCk7XG4nCisgICAgICAgICAgICAgICAgICcgICAgZGVzdHJveV9kZXZpY2VfZGlzcGF0Y2hfdGFibGUoa2V5KTtcbicKKyAgICAgICAgICAgICAgICAgJyAgICAlcyVzJXNcbicKKyAgICAgICAgICAgICAgICAgJyVzJworICAgICAgICAgICAgICAgICAnfScgJSAocXVhbCwgZGVjbCwgdGFibGVfdHlwZSwgZGlzcGF0Y2hfcGFyYW0sIHJldF92YWwsIHByb3RvLmNfY2FsbCgpLCBmX29wZW4sIGxvZ19mdW5jLCBmX2Nsb3NlLCBzdG10KSkKKyAgICAgICAgZWxpZiBwcm90by5uYW1lID09ICJEZXN0cm95SW5zdGFuY2UiOgorICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclcyVzXG4nCisgICAgICAgICAgICAgICAgICd7XG4nCisgICAgICAgICAgICAgICAgICcgICAgdXNpbmcgbmFtZXNwYWNlIFN0cmVhbUNvbnRyb2w7XG4nCisgICAgICAgICAgICAgICAgICcgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDtcbicKKyAgICAgICAgICAgICAgICAgJyAgICBkaXNwYXRjaF9rZXkga2V5ID0gZ2V0X2Rpc3BhdGNoX2tleShpbnN0YW5jZSk7XG4nCisgICAgICAgICAgICAgICAgICcgICAgVmtMYXllckluc3RhbmNlRGlzcGF0Y2hUYWJsZSAqcERpc3AgID0gJXNfZGlzcGF0Y2hfdGFibGUoJXMpO1xuJworICAgICAgICAgICAgICAgICAnICAgICVzcERpc3AtPiVzO1xuJworICAgICAgICAgICAgICAgICAnICAgIGluc3RhbmNlRXh0TWFwLmVyYXNlKHBEaXNwKTtcbicKKyAgICAgICAgICAgICAgICAgJyAgICBkZXN0cm95X2luc3RhbmNlX2Rpc3BhdGNoX3RhYmxlKGtleSk7XG4nCisgICAgICAgICAgICAgICAgICcgICAgJXMlcyVzXG4nCisgICAgICAgICAgICAgICAgICclcycKKyAgICAgICAgICAgICAgICAgJ30nICUgKHF1YWwsIGRlY2wsIHRhYmxlX3R5cGUsIGRpc3BhdGNoX3BhcmFtLCByZXRfdmFsLCBwcm90by5jX2NhbGwoKSwgZl9vcGVuLCBsb2dfZnVuYywgZl9jbG9zZSwgc3RtdCkpCisgICAgICAgIGVsaWYgcHJvdG8ubmFtZSA9PSAiUXVldWVQcmVzZW50S0hSIjoKKyAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgnJXMlc1xuJworICAgICAgICAgICAgICAgICAne1xuJworICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG5hbWVzcGFjZSBTdHJlYW1Db250cm9sO1xuJworICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7XG4nCisgICAgICAgICAgICAgICAgICcgICAgVmtMYXllckRpc3BhdGNoVGFibGUgKnBEaXNwICA9ICVzX2Rpc3BhdGNoX3RhYmxlKCVzKTtcbicKKyAgICAgICAgICAgICAgICAgJyAgICAlc3BEaXNwLT4lcztcbicKKyAgICAgICAgICAgICAgICAgJyAgICAlcyVzJXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICArK2dfZnJhbWVDb3VudGVyO1xuJworICAgICAgICAgICAgICAgICAnJXMnCisgICAgICAgICAgICAgICAgICd9JyAlIChxdWFsLCBkZWNsLCB0YWJsZV90eXBlLCBkaXNwYXRjaF9wYXJhbSwgcmV0X3ZhbCwgcHJvdG8uY19jYWxsKCksIGZfb3BlbiwgbG9nX2Z1bmMsIGZfY2xvc2UsIHN0bXQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgd3NpX25hbWUoZGVjbCk6CisgICAgICAgICAgICAgICAgZnVuY3MuYXBwZW5kKCclcycgJSB3c2lfaWZkZWYoZGVjbCkpCisgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJXNcbicKKyAgICAgICAgICAgICAgICAgICAgICd7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG5hbWVzcGFjZSBTdHJlYW1Db250cm9sO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkO1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAlcyVzX2Rpc3BhdGNoX3RhYmxlKCVzKS0+JXM7XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICVzJXMlc1xuJworICAgICAgICAgICAgICAgICAgICAgJyVzJworICAgICAgICAgICAgICAgICAgICAgJ30nICUgKHF1YWwsIGRlY2wsIHJldF92YWwsIHRhYmxlX3R5cGUsIGRpc3BhdGNoX3BhcmFtLCBwcm90by5jX2NhbGwoKSwgZl9vcGVuLCBsb2dfZnVuYywgZl9jbG9zZSwgc3RtdCkpCisgICAgICAgICAgICBpZiB3c2lfbmFtZShkZWNsKToKKyAgICAgICAgICAgICAgICBmdW5jcy5hcHBlbmQoJyVzJyAlIHdzaV9lbmRpZihkZWNsKSkKKyAgICAgICAgcmV0dXJuICJcblxuIi5qb2luKGZ1bmNzKQorCisgICAgZGVmIGdlbmVyYXRlX2JvZHkoc2VsZik6CisgICAgICAgIHNlbGYubGF5ZXJfbmFtZSA9ICJhcGlfZHVtcCIKKyAgICAgICAgaWYgc2VsZi53c2kgPT0gJ1dpbjMyJzoKKyAgICAgICAgICAgIGluc3RhbmNlX2V4dGVuc2lvbnM9Wygnd3NpX2VuYWJsZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsndmtEZXN0cm95U3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFInXSldCisgICAgICAgIGVsaWYgc2VsZi53c2kgPT0gJ0FuZHJvaWQnOgorICAgICAgICAgICAgaW5zdGFuY2VfZXh0ZW5zaW9ucz1bKCd3c2lfZW5hYmxlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd2a0Rlc3Ryb3lTdXJmYWNlS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiddKV0KKyAgICAgICAgZWxpZiBzZWxmLndzaSA9PSAnWGNiJzoKKyAgICAgICAgICAgIGluc3RhbmNlX2V4dGVuc2lvbnM9Wygnd3NpX2VuYWJsZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsndmtEZXN0cm95U3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrQ3JlYXRlWGNiU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiddKV0KKyAgICAgICAgZWxpZiBzZWxmLndzaSA9PSAnWGxpYic6CisgICAgICAgICAgICBpbnN0YW5jZV9leHRlbnNpb25zPVsoJ3dzaV9lbmFibGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3ZrRGVzdHJveVN1cmZhY2VLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0NyZWF0ZVhsaWJTdXJmYWNlS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiddKV0KKyAgICAgICAgZWxpZiBzZWxmLndzaSA9PSAnV2F5bGFuZCc6CisgICAgICAgICAgICBpbnN0YW5jZV9leHRlbnNpb25zPVsoJ3dzaV9lbmFibGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3ZrRGVzdHJveVN1cmZhY2VLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUiddKV0KKyAgICAgICAgZWxpZiBzZWxmLndzaSA9PSAnTWlyJzoKKyAgICAgICAgICAgIGluc3RhbmNlX2V4dGVuc2lvbnM9Wygnd3NpX2VuYWJsZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsndmtEZXN0cm95U3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrQ3JlYXRlTWlyU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2a0dldFBoeXNpY2FsRGV2aWNlTWlyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiddKV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IsICJJbnZhbGlkIERpc3BsYXlTZXJ2ZXIiKQorCisgICAgICAgIGV4dGVuc2lvbnM9Wygnd3NpX2VuYWJsZWQnLAorICAgICAgICAgICAgICAgICAgICAgWyd2a0NyZWF0ZVN3YXBjaGFpbktIUicsCisgICAgICAgICAgICAgICAgICAgICAgJ3ZrRGVzdHJveVN3YXBjaGFpbktIUicsICd2a0dldFN3YXBjaGFpbkltYWdlc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgJ3ZrQWNxdWlyZU5leHRJbWFnZUtIUicsICd2a1F1ZXVlUHJlc2VudEtIUiddKV0KKyAgICAgICAgYm9keSA9IFtzZWxmLmdlbmVyYXRlX2luaXQoKSwKKyAgICAgICAgICAgICAgICBzZWxmLl9nZW5lcmF0ZV9kaXNwYXRjaF9lbnRyeXBvaW50cygiVktfTEFZRVJfRVhQT1JUIiksCisgICAgICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfbGF5ZXJfZ3BhX2Z1bmN0aW9uKGV4dGVuc2lvbnMsIGluc3RhbmNlX2V4dGVuc2lvbnMpXQorICAgICAgICByZXR1cm4gIlxuXG4iLmpvaW4oYm9keSkKKworZGVmIG1haW4oKToKKworICAgIHdzaSA9IHsKKyAgICAgICAgICAgICJXaW4zMiIsCisgICAgICAgICAgICAiQW5kcm9pZCIsCisgICAgICAgICAgICAiWGNiIiwKKyAgICAgICAgICAgICJYbGliIiwKKyAgICAgICAgICAgICJXYXlsYW5kIiwKKyAgICAgICAgICAgICJNaXIiLAorICAgIH0KKworICAgIHN1YmNvbW1hbmRzID0geworICAgICAgICAgICAgImxheWVyLWZ1bmNzIiA6IExheWVyRnVuY3NTdWJjb21tYW5kLAorICAgICAgICAgICAgImdlbmVyaWMiIDogR2VuZXJpY0xheWVyU3ViY29tbWFuZCwKKyAgICAgICAgICAgICJhcGlfZHVtcCIgOiBBcGlEdW1wU3ViY29tbWFuZCwKKyAgICB9CisKKyAgICBpZiBsZW4oc3lzLmFyZ3YpIDwgNCBvciBzeXMuYXJndlsxXSBub3QgaW4gd3NpIG9yIHN5cy5hcmd2WzJdIG5vdCBpbiBzdWJjb21tYW5kcyBvciBub3Qgb3MucGF0aC5leGlzdHMoc3lzLmFyZ3ZbM10pOgorICAgICAgICBwcmludCgiVXNhZ2U6ICVzIDx3c2k+IDxzdWJjb21tYW5kPiA8aW5wdXRfaGVhZGVyPiBbb3B0aW9uc10iICUgc3lzLmFyZ3ZbMF0pCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50KCJBdmFpbGFibGUgc3ViY29tbWFuZHMgYXJlOiAlcyIgJSAiICIuam9pbihzdWJjb21tYW5kcykpCisgICAgICAgIHByaW50KCJBdmFpbGFibGUgd3NpIChkaXNwbGF5c2VydmVycykgYXJlOiAlcyIgJSAiICIuam9pbih3c2kpKQorICAgICAgICBleGl0KDEpCisKKyAgICBoZnAgPSB2a19oZWxwZXJfYXBpX2R1bXAuSGVhZGVyRmlsZVBhcnNlcihzeXMuYXJndlszXSkKKyAgICBoZnAucGFyc2UoKQorICAgIHZrX2hlbHBlcl9hcGlfZHVtcC5lbnVtX3ZhbF9kaWN0ID0gaGZwLmdldF9lbnVtX3ZhbF9kaWN0KCkKKyAgICB2a19oZWxwZXJfYXBpX2R1bXAuZW51bV90eXBlX2RpY3QgPSBoZnAuZ2V0X2VudW1fdHlwZV9kaWN0KCkKKyAgICB2a19oZWxwZXJfYXBpX2R1bXAuc3RydWN0X2RpY3QgPSBoZnAuZ2V0X3N0cnVjdF9kaWN0KCkKKyAgICB2a19oZWxwZXJfYXBpX2R1bXAub3BhcXVlX3R5cGVzID0gaGZwLmdldF9vcGFxdWVfdHlwZXMoKQorICAgIHZrX2hlbHBlcl9hcGlfZHVtcC50eXBlZGVmX2Z3ZF9kaWN0ID0gaGZwLmdldF90eXBlZGVmX2Z3ZF9kaWN0KCkKKyAgICB2a19oZWxwZXJfYXBpX2R1bXAudHlwZWRlZl9yZXZfZGljdCA9IGhmcC5nZXRfdHlwZWRlZl9yZXZfZGljdCgpCisgICAgdmtfaGVscGVyX2FwaV9kdW1wLnR5cGVzX2RpY3QgPSBoZnAuZ2V0X3R5cGVzX2RpY3QoKQorCisgICAgc3ViY21kID0gc3ViY29tbWFuZHNbc3lzLmFyZ3ZbMl1dKHN5cy5hcmd2WzM6XSkKKyAgICBzdWJjbWQucnVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3ZrX2hlbHBlcl9hcGlfZHVtcC5weSBiL3ZrX2hlbHBlcl9hcGlfZHVtcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWI5Y2RhCi0tLSAvZGV2L251bGwKKysrIGIvdmtfaGVscGVyX2FwaV9kdW1wLnB5CkBAIC0wLDAgKzEsMjI3MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisjIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluQGx1bmFyZy5jb20+CisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2ltcG9ydCB2dWxrYW4KK2Zyb20gc291cmNlX2xpbmVfaW5mbyBpbXBvcnQgc291cmNlbGluZWluZm8KKworIyB2a19oZWxwZXJfYXBpX2R1bXAucHkgb3ZlcnZpZXcKKyMgVGhpcyBzY3JpcHQgZ2VuZXJhdGVzIGNvZGUgYmFzZWQgb24gdnVsa2FuIGlucHV0IGhlYWRlcgorIyAgSXQgZ2VuZXJhdGUgd3JhcHBlcnMgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheQorIyAgc3RydWN0cyBpbiBhIGh1bWFuLXJlYWRhYmxlIHR4dCBmb3JtYXQsIGFzIHdlbGwgYXMgdXRpbGl0eSBmdW5jdGlvbnMKKyMgIHRvIHByaW50IGVudW0gdmFsdWVzIGFzIHN0cmluZ3MKKworZGVmIGhhbmRsZV9hcmdzKCk6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J1BlcmZvcm0gYW5hbHlzaXMgb2Ygdm9nbCB0cmFjZS4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2lucHV0X2ZpbGUnLCBoZWxwPSdUaGUgaW5wdXQgaGVhZGVyIGZpbGUgZnJvbSB3aGljaCBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkLicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1yZWxfb3V0X2RpcicsIHJlcXVpcmVkPUZhbHNlLCBkZWZhdWx0PSd2a3RyYWNlX2dlbicsIGhlbHA9J1BhdGggcmVsYXRpdmUgdG8gZXhlYyBwYXRoIHRvIHdyaXRlIG91dHB1dCBmaWxlcy4gV2lsbCBiZSBjcmVhdGVkIGlmIG5lZWRlZC4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tYWJzX291dF9kaXInLCByZXF1aXJlZD1GYWxzZSwgZGVmYXVsdD1Ob25lLCBoZWxwPSdBYnNvbHV0ZSBwYXRoIHRvIHdyaXRlIG91dHB1dCBmaWxlcy4gV2lsbCBiZSBjcmVhdGVkIGlmIG5lZWRlZC4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZ2VuX2VudW1fc3RyaW5nX2hlbHBlcicsIHJlcXVpcmVkPUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdFbmFibGUgZ2VuZXJhdGlvbiBvZiBoZWxwZXIgaGVhZGVyIGZpbGUgdG8gcHJpbnQgc3RyaW5nIHZlcnNpb25zIG9mIGVudW1zLicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1nZW5fc3RydWN0X3dyYXBwZXJzJywgcmVxdWlyZWQ9RmFsc2UsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9J0VuYWJsZSBnZW5lcmF0aW9uIG9mIHN0cnVjdCB3cmFwcGVyIGNsYXNzZXMuJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWdlbl9zdHJ1Y3Rfc2l6ZXMnLCByZXF1aXJlZD1GYWxzZSwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nRW5hYmxlIGdlbmVyYXRpb24gb2Ygc3RydWN0IHNpemVzLicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1nZW5fY21ha2UnLCByZXF1aXJlZD1GYWxzZSwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nRW5hYmxlIGdlbmVyYXRpb24gb2YgY21ha2UgZmlsZSBmb3IgZ2VuZXJhdGVkIGNvZGUuJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWdlbl9ncmFwaHZpeicsIHJlcXVpcmVkPUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdFbmFibGUgZ2VuZXJhdGlvbiBvZiBncmFwaHZpeiBkb3QgZmlsZS4nKQorICAgICNwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRlc3QnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdSdW4gc2ltcGxlIHRlc3QuJykKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisjIFRPRE8gOiBJZGVhbGx5IHRoZXNlIGRhdGEgc3RydWN0cyB3b3VsZCBiZSBvcGFxdWUgdG8gdXNlciBhbmQgY291bGQgYmUgd3JhcHBlZAorIyAgIGluIHRoZWlyIG93biBjbGFzcyhlcykgdG8gbWFrZSB0aGVtIGZyaWVuZGx5IGZvciBkYXRhIGxvb2stdXAKKyMgRGljdHMgZm9yIERhdGEgc3RvcmFnZQorIyBlbnVtX3ZhbF9kaWN0W3ZhbHVlX25hbWVdID0gZGljdCBrZXlzIGFyZSB0aGUgc3RyaW5nIGVudW0gdmFsdWUgbmFtZXMgZm9yIGFsbCBlbnVtcworIyAgICB8LS0tLS0tLS0+Wyd0eXBlJ10gPSB0aGUgdHlwZSBvZiBlbnVtIGNsYXNzIGludG8gd2hpY2ggdGhlIHZhbHVlIGZhbGxzCisjICAgIHwtLS0tLS0tLT5bJ3ZhbCddID0gdGhlIHZhbHVlIGFzc2lnbmVkIHRvIHRoaXMgcGFydGljdWxhciB2YWx1ZV9uYW1lCisjICAgICctLS0tLS0tLT5bJ3VuaXF1ZSddID0gYm9vbCBkZXNpZ25hdGluZyBpZiB0aGlzIGVudW0gJ3ZhbCcgaXMgdW5pcXVlIHdpdGhpbiB0aGlzIGVudW0gJ3R5cGUnCitlbnVtX3ZhbF9kaWN0ID0ge30KKyMgZW51bV90eXBlX2RpY3RbJ3R5cGUnXSA9IHRoZSB0eXBlIG9yIGNsYXNzIG9mIG9mIGVudW0KKyMgICctLS0tLT5bJ3ZhbF9uYW1lMScsICd2YWxfbmFtZTInLi4uXSA9IGVhY2ggdHlwZSByZWZlcmVuY2VzIGEgbGlzdCBvZiB2YWxfbmFtZXMgd2l0aGluIHRoaXMgdHlwZQorZW51bV90eXBlX2RpY3QgPSB7fQorIyBzdHJ1Y3RfZGljdFsnc3RydWN0X2Jhc2VuYW1lJ10gPSB0aGUgYmFzZSAobm9uLXR5cGVkZWYnZCkgbmFtZSBvZiB0aGUgc3RydWN0CisjICB8LT5bPG1lbWJlcl9udW0+XSA9IG1lbWJlcnMgYXJlIHN0b3JlZCB2aWEgdGhlaXIgaW50ZWdlciBwbGFjZW1lbnQgaW4gdGhlIHN0cnVjdAorIyAgfCAgICB8LT5bJ25hbWUnXSA9IHN0cmluZyBuYW1lIG9mIHRoaXMgc3RydWN0IG1lbWJlcgorIyAuLi4gICB8LT5bJ2Z1bGxfdHlwZSddID0gY29tcGxldGUgdHlwZSBxdWFsaWZpZXIgZm9yIHRoaXMgbWVtYmVyCisjICAgICAgIHwtPlsndHlwZSddID0gYmFzZSB0eXBlIGZvciB0aGlzIG1lbWJlcgorIyAgICAgICB8LT5bJ3B0ciddID0gYm9vbCBpbmRpY2F0aW5nIGlmIHRoaXMgbWVtYmVyIGlzIHB0cgorIyAgICAgICB8LT5bJ2NvbnN0J10gPSBib29sIGluZGljYXRpbmcgaWYgdGhpcyBtZW1iZXIgaXMgY29uc3QKKyMgICAgICAgfC0+WydzdHJ1Y3QnXSA9IGJvb2wgaW5kaWNhdGluZyBpZiB0aGlzIG1lbWJlciBpcyBhIHN0cnVjdCB0eXBlCisjICAgICAgIHwtPlsnYXJyYXknXSA9IGJvb2wgaW5kaWNhdGluZyBpZiB0aGlzIG1lbWJlciBpcyBhbiBhcnJheQorIyAgICAgICB8LT5bJ2R5bl9hcnJheSddID0gYm9vbCBpbmRpY2F0aW5nIGlmIG1lbWJlciBpcyBhIGR5bmFtaWNhbGx5IHNpemVkIGFycmF5CisjICAgICAgICctPlsnYXJyYXlfc2l6ZSddID0gRm9yIGR5bl9hcnJheSwgbWVtYmVyIG5hbWUgdXNlZCB0byBzaXplIGFycmF5LCBlbHNlIGludCBzaXplIGZvciBzdGF0aWMgYXJyYXkKK3N0cnVjdF9kaWN0ID0ge30KK3N0cnVjdF9vcmRlcl9saXN0ID0gW10gIyBzdHJ1Y3QgbmFtZXMgaW4gb3JkZXIgdGhleSdyZSBkZWNsYXJlZAorIyBTdG9yZSBzdHJ1Y3QgbmFtZXMgdGhhdCByZXF1aXJlICNpZmRlZiBndWFyZHMKKyMgIGRpY3Qgc3RvcmVzIHN0cnVjdCBhbmQgZW51bSBkZWZpbml0aW9ucyB0aGF0IGFyZSBndWFyZGVkIGJ5IGlmZGVmIGFzIHRoZSBrZXkKKyMgIGFuZCB0aGUgdHh0IG9mIHRoZSBpZmRlZiBpcyB0aGUgdmFsdWUKK2lmZGVmX2RpY3QgPSB7fQorIyB0eXBlZGVmX2Z3ZF9kaWN0IHN0b3JlcyBtYXBwaW5nIGZyb20gb3JpZ190eXBlX25hbWUgLT4gbmV3X3R5cGVfbmFtZQordHlwZWRlZl9md2RfZGljdCA9IHt9CisjIHR5cGVkZWZfcmV2X2RpY3Qgc3RvcmVzIG1hcHBpbmcgZnJvbSBuZXdfdHlwZV9uYW1lIC0+IG9yaWdfdHlwZV9uYW1lCit0eXBlZGVmX3Jldl9kaWN0ID0ge30gIyBzdG9yZSBuZXdfbmFtZSAtPiBvcmlnX25hbWUgbWFwcGluZworIyB0eXBlc19kaWN0WydpZF9uYW1lJ10gPSBpZGVudGlmaWVyIG5hbWUgd2lsbCBtYXAgdG8gaXQncyB0eXBlCisjICAgICAgICAgICAgICAnLS0tLT4ndHlwZScgPSBjdXJyZW50bHkgZWl0aGVyICdzdHJ1Y3QnIG9yICdlbnVtJwordHlwZXNfZGljdCA9IHt9ICAgIyBzdG9yZSBvcmlnX25hbWUgLT4gdHlwZSBtYXBwaW5nCisKKworIyBDbGFzcyB0aGF0IHBhcnNlcyBoZWFkZXIgZmlsZSBhbmQgZ2VuZXJhdGVzIGRhdGEgc3RydWN0dXJlcyB0aGF0IGNhbgorIyAgVGhlbiBiZSB1c2VkIGZvciBvdGhlciB0YXNrcworY2xhc3MgSGVhZGVyRmlsZVBhcnNlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVyX2ZpbGU9Tm9uZSk6CisgICAgICAgIHNlbGYuaGVhZGVyX2ZpbGUgPSBoZWFkZXJfZmlsZQorICAgICAgICAjIHN0b3JlIGhlYWRlciBkYXRhIGluIHZhcmlvdXMgZm9ybWF0cywgc2VlIGFib3ZlIGZvciBtb3JlIGluZm8KKyAgICAgICAgc2VsZi5lbnVtX3ZhbF9kaWN0ID0ge30KKyAgICAgICAgc2VsZi5lbnVtX3R5cGVfZGljdCA9IHt9CisgICAgICAgIHNlbGYuc3RydWN0X2RpY3QgPSB7fQorICAgICAgICBzZWxmLnR5cGVkZWZfZndkX2RpY3QgPSB7fQorICAgICAgICBzZWxmLnR5cGVkZWZfcmV2X2RpY3QgPSB7fQorICAgICAgICBzZWxmLnR5cGVzX2RpY3QgPSB7fQorICAgICAgICBzZWxmLmxhc3Rfc3RydWN0X2NvdW50X25hbWUgPSAnJworICAgICAgICBzZWxmLm9wYXF1ZV90eXBlcyA9IFtdCisKKyAgICBkZWYgc2V0SGVhZGVyRmlsZShzZWxmLCBoZWFkZXJfZmlsZSk6CisgICAgICAgIHNlbGYuaGVhZGVyX2ZpbGUgPSBoZWFkZXJfZmlsZQorCisgICAgZGVmIGdldF9lbnVtX3ZhbF9kaWN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnVtX3ZhbF9kaWN0CisKKyAgICBkZWYgZ2V0X2VudW1fdHlwZV9kaWN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnVtX3R5cGVfZGljdAorCisgICAgZGVmIGdldF9zdHJ1Y3RfZGljdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RydWN0X2RpY3QKKworICAgIGRlZiBnZXRfb3BhcXVlX3R5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vcGFxdWVfdHlwZXMKKworICAgIGRlZiBnZXRfdHlwZWRlZl9md2RfZGljdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZWRlZl9md2RfZGljdAorCisgICAgZGVmIGdldF90eXBlZGVmX3Jldl9kaWN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlZGVmX3Jldl9kaWN0CisKKyAgICBkZWYgZ2V0X3R5cGVzX2RpY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGVzX2RpY3QKKworICAgICMgUGFyc2UgaGVhZGVyIGZpbGUgaW50byBkYXRhIHN0cnVjdHVyZXMKKyAgICBkZWYgcGFyc2Uoc2VsZik6CisgICAgICAgICMgcGFyc2UgdGhyb3VnaCB0aGUgZmlsZSwgaWRlbnRpZnlpbmcgZGlmZmVyZW50IHNlY3Rpb25zCisgICAgICAgIHBhcnNlX2VudW0gPSBGYWxzZQorICAgICAgICBwYXJzZV9zdHJ1Y3QgPSBGYWxzZQorICAgICAgICBtZW1iZXJfbnVtID0gMAorICAgICAgICAjIFRPRE8gOiBDb21tZW50IHBhcnNpbmcgaXMgdmVyeSBmcmFnaWxlIGJ1dCBoYW5kbGVzIDIga25vd24gZmlsZXMKKyAgICAgICAgYmxvY2tfY29tbWVudCA9IEZhbHNlCisgICAgICAgIHBvaW50ZXJfdG9fZnVuY3Rpb25fYXJnX2xpc3QgPSBGYWxzZQorICAgICAgICBwcmV2X2NvdW50X25hbWUgPSAnJworICAgICAgICBpZmRlZl90eHQgPSAnJworICAgICAgICBpZmRlZl9hY3RpdmUgPSAwCisgICAgICAgIGV4Y2x1ZGVfc3RydWN0X2xpc3QgPSBbJ1ZrUGxhdGZvcm1IYW5kbGVYY2JLSFInLCAnVmtQbGF0Zm9ybUhhbmRsZVgxMUtIUiddCisgICAgICAgIHdpdGggb3BlbihzZWxmLmhlYWRlcl9maWxlKSBhcyBmOgorICAgICAgICAgICAgbGluZV9jb3VudCA9IDAKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgbGluZV9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgaWYgVHJ1ZSBpbiBbaWZkX3R4dCBpbiBsaW5lIGZvciBpZmRfdHh0IGluIFsnI2lmZGVmICcsICcjaWZuZGVmICddXToKKyAgICAgICAgICAgICAgICAgICAgaWZkZWZfdHh0ID0gbGluZS5zcGxpdCgpWzFdCisgICAgICAgICAgICAgICAgICAgIGlmZGVmX2FjdGl2ZSA9IGlmZGVmX2FjdGl2ZSArIDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBpZmRlZl9hY3RpdmUgIT0gMCBhbmQgJyNlbmRpZicgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgaWZkZWZfYWN0aXZlID0gaWZkZWZfYWN0aXZlIC0gMQorICAgICAgICAgICAgICAgIGlmIGJsb2NrX2NvbW1lbnQ6CisgICAgICAgICAgICAgICAgICAgIGlmICcqLycgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2NvbW1lbnQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmICcvKicgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgaWYgJyovJyBpbiBsaW5lOiAjIHNpbmdsZSBsaW5lIGJsb2NrIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGJsb2NrX2NvbW1lbnQgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiAwID09IGxlbihsaW5lLnNwbGl0KCkpOgorICAgICAgICAgICAgICAgICAgICAjcHJpbnQoIlNraXBwaW5nIGVtcHR5IGxpbmUiKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgbGluZS5zcGxpdCgpWzBdLnN0cmlwKCkuc3RhcnRzd2l0aCgiLy8iKToKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50KCJTa2lwcGluZyBjb21tZW50ZWQgbGluZSAlcyIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgJ3R5cGVkZWYgZW51bScgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgKHR5X3R4dCwgZW5fdHh0LCBiYXNlX3R5cGUpID0gbGluZS5zdHJpcCgpLnNwbGl0KE5vbmUsIDIpCisgICAgICAgICAgICAgICAgICAgICNwcmludCgiRm91bmQgRU5VTSB0eXBlICVzIiAlIGJhc2VfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgJ3snID09IGJhc2VfdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfdHlwZSA9ICd0bXBfZW51bScKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfZW51bSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9lbnVtX3ZhbCA9IDAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlc19kaWN0W2Jhc2VfdHlwZV0gPSAnZW51bScKKyAgICAgICAgICAgICAgICBlbGlmICd0eXBlZGVmIHN0cnVjdCcgaW4gbGluZSBvciAndHlwZWRlZiB1bmlvbicgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgaWYgVHJ1ZSBpbiBbZXhfdHlwZSBpbiBsaW5lIGZvciBleF90eXBlIGluIGV4Y2x1ZGVfc3RydWN0X2xpc3RdOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAodHlfdHh0LCBzdF90eHQsIGJhc2VfdHlwZSkgPSBsaW5lLnN0cmlwKCkuc3BsaXQoTm9uZSwgMikKKyAgICAgICAgICAgICAgICAgICAgaWYgJyAnIGluIGJhc2VfdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIChpZ25vcmVkLCBiYXNlX3R5cGUpID0gYmFzZV90eXBlLnN0cmlwKCkuc3BsaXQoTm9uZSwgMSkKKworICAgICAgICAgICAgICAgICAgICAjcHJpbnQoIkZvdW5kIFNUUlVDVCB0eXBlOiAlcyIgJSBiYXNlX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICMgTm90ZTogIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gaGFuZGxlIG9uZSBsaW5lIHN0cnVjdCBkZWZpbml0aW9uLCBsaWtlCisgICAgICAgICAgICAgICAgICAgICMgICAgICAgIHR5cGVkZWYgc3RydWN0IG9iaiMjX1QgeyB1aW50NjRfdCBoYW5kbGU7IH0gb2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoJ3snID09IGJhc2VfdHlwZSBvciBub3QgKCcgJyBpbiBiYXNlX3R5cGUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfdHlwZSA9ICd0bXBfc3RydWN0JworICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RydWN0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlc19kaWN0W2Jhc2VfdHlwZV0gPSAnc3RydWN0JworIyAgICAgICAgICAgICAgICBlbGlmICd0eXBlZGVmIHVuaW9uJyBpbiBsaW5lOgorIyAgICAgICAgICAgICAgICAgICAgKHR5X3R4dCwgc3RfdHh0LCBiYXNlX3R5cGUpID0gbGluZS5zdHJpcCgpLnNwbGl0KE5vbmUsIDIpCisjICAgICAgICAgICAgICAgICAgICBwcmludCgiRm91bmQgVU5JT04gdHlwZTogJXMiICUgYmFzZV90eXBlKQorIyAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RydWN0ID0gVHJ1ZQorIyAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlc19kaWN0W2Jhc2VfdHlwZV0gPSAnc3RydWN0JworICAgICAgICAgICAgICAgIGVsaWYgJ30nIGluIGxpbmUgYW5kIChwYXJzZV9lbnVtIG9yIHBhcnNlX3N0cnVjdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lLnNwbGl0KCkpID4gMTogIyBkZWFscyB3aXRoIGVtYmVkZGVkIHVuaW9uIGluIG9uZSBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2VudW0gPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RydWN0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFzdF9zdHJ1Y3RfY291bnRfbmFtZSA9ICcnCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfbnVtID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgKGN1cl9jaGFyLCB0YXJnX3R5cGUpID0gbGluZS5zdHJpcCgpLnNwbGl0KE5vbmUsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAndG1wX3N0cnVjdCcgPT0gYmFzZV90eXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfdHlwZSA9IHRhcmdfdHlwZS5zdHJpcCgnOycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgVHJ1ZSBpbiBbZXhfdHlwZSBpbiBiYXNlX3R5cGUgZm9yIGV4X3R5cGUgaW4gZXhjbHVkZV9zdHJ1Y3RfbGlzdF06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLnN0cnVjdF9kaWN0Wyd0bXBfc3RydWN0J10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQoIkZvdW5kIEFjdHVhbCBTdHJ1Y3QgdHlwZSAlcyIgJSBiYXNlX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdFtiYXNlX3R5cGVdID0gc2VsZi5zdHJ1Y3RfZGljdFsndG1wX3N0cnVjdCddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdC5wb3AoJ3RtcF9zdHJ1Y3QnLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9vcmRlcl9saXN0LmFwcGVuZChiYXNlX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlc19kaWN0W2Jhc2VfdHlwZV0gPSAnc3RydWN0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZXNfZGljdC5wb3AoJ3RtcF9zdHJ1Y3QnLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiAndG1wX2VudW0nID09IGJhc2VfdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3R5cGUgPSB0YXJnX3R5cGUuc3RyaXAoJzsnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCgiRm91bmQgQWN0dWFsIEVOVU0gdHlwZSAlcyIgJSBiYXNlX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG4gaW4gc2VsZi5lbnVtX3ZhbF9kaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAndG1wX2VudW0nID09IHNlbGYuZW51bV92YWxfZGljdFtuXVsndHlwZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnVtX3ZhbF9kaWN0W25dWyd0eXBlJ10gPSBiYXNlX3R5cGUKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnVtX3ZhbF9kaWN0W2Jhc2VfdHlwZV0gPSBzZWxmLmVudW1fdmFsX2RpY3RbJ3RtcF9lbnVtJ10KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnVtX3ZhbF9kaWN0LnBvcCgndG1wX2VudW0nLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW51bV90eXBlX2RpY3RbYmFzZV90eXBlXSA9IHNlbGYuZW51bV90eXBlX2RpY3RbJ3RtcF9lbnVtJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVudW1fdHlwZV9kaWN0LnBvcCgndG1wX2VudW0nLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZXNfZGljdFtiYXNlX3R5cGVdID0gJ2VudW0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlc19kaWN0LnBvcCgndG1wX2VudW0nLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaWZkZWZfYWN0aXZlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZGVmX2RpY3RbYmFzZV90eXBlXSA9IGlmZGVmX3R4dAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlZGVmX2Z3ZF9kaWN0W2Jhc2VfdHlwZV0gPSB0YXJnX3R5cGUuc3RyaXAoJzsnKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlZGVmX3Jldl9kaWN0W3RhcmdfdHlwZS5zdHJpcCgnOycpXSA9IGJhc2VfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50KCJmd2RfZGljdDogJXMgPSAlcyIgJSAoYmFzZV90eXBlLCB0YXJnX3R5cGUpKQorICAgICAgICAgICAgICAgIGVsaWYgcGFyc2VfZW51bToKKyAgICAgICAgICAgICAgICAgICAgI2lmICdWS19NQVhfRU5VTScgbm90IGluIGxpbmUgYW5kICd7JyBub3QgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgaWYgVHJ1ZSBub3QgaW4gW2VucyBpbiBsaW5lIGZvciBlbnMgaW4gWyd7JywgJ19NQVhfRU5VTScsICdfQkVHSU5fUkFOR0UnLCAnX0VORF9SQU5HRScsICdfTlVNID0gJywgJ19FTlVNX1JBTkdFJ11dOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2VudW0obGluZSwgYmFzZV90eXBlLCBkZWZhdWx0X2VudW1fdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9lbnVtX3ZhbCArPSAxCisgICAgICAgICAgICAgICAgZWxpZiBwYXJzZV9zdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIGlmICc7JyBpbiBsaW5lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRkX3N0cnVjdChsaW5lLCBiYXNlX3R5cGUsIG1lbWJlcl9udW0pCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfbnVtID0gbWVtYmVyX251bSArIDEKKyAgICAgICAgICAgICAgICBlbGlmICcjZGVmaW5lJyBub3QgaW4gbGluZSBhbmQgKCdWS19ERUZJTkVfSEFORExFJyBpbiBsaW5lIG9yICdWS19ERUZJTkVfTk9OX0RJU1BBVENIQUJMRV9IQU5ETEUnIGluIGxpbmUpOgorICAgICAgICAgICAgICAgICAgICBiYXNlX3R5cGUgPSBsaW5lLnJlcGxhY2UoJ1ZLX0RFRklORV9OT05fRElTUEFUQ0hBQkxFX0hBTkRMRScsICcnKS5yZXBsYWNlKCdWS19ERUZJTkVfSEFORExFJywgJycpLnN0cmlwKCcoKVxuICcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZXNfZGljdFtiYXNlX3R5cGVdID0gJ3N0cnVjdCcKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0X29yZGVyX2xpc3QuYXBwZW5kKGJhc2VfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdFtiYXNlX3R5cGVdID0ge30KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGFxdWVfdHlwZXMuYXBwZW5kKGJhc2VfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaWZkZWZfYWN0aXZlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWZkZWZfZGljdFtiYXNlX3R5cGVdID0gaWZkZWZfdHh0CisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZWRlZl9md2RfZGljdFtiYXNlX3R5cGVdID0gYmFzZV90eXBlCisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZWRlZl9yZXZfZGljdFtiYXNlX3R5cGVdID0gYmFzZV90eXBlCisgICAgICAgICAgICAgICAgZWxpZiAnUEZOX3ZrJyBpbiBsaW5lIGFuZCBub3QgJzsnIGluIGxpbmU6CisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfdG9fZnVuY3Rpb25fYXJnX2xpc3QgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiBwb2ludGVyX3RvX2Z1bmN0aW9uX2FyZ19saXN0OgorICAgICAgICAgICAgICAgICAgICBpZiAnOycgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfdG9fZnVuY3Rpb25fYXJnX2xpc3QgPSBGYWxzZQorICAgICAgICAgICAgICAgICNlbGlmIG5vdCBpZmRlZl9hY3RpdmUgYW5kIG5vdCBhbnkodG9rZW4gaW4gbGluZSBmb3IgdG9rZW4gaW4gWycjaW5jbHVkZScsICcjZGVmaW5lJywgJyNlbmRpZicsICdleHRlcm4nLCAneycsICdQRk5fdmsnLCAndWludF8zNCcsICd1aW50XzY0JywgJ3R5cGVkZWYgVmtGbGFncyAnXSk6CisgICAgICAgICAgICAgICAgICAgICNwcmludCgiICoqKiBXYXJuaW5nIGxpbmUgIyVkOiAlcyBpZ25vcmVkIiAlIChsaW5lX2NvdW50LCBsaW5lLnN0cmlwKCdcbicpKSkKKworICAgICMgcG9wdWxhdGUgZW51bSBkaWN0cyBiYXNlZCBvbiBlbnVtIGxpbmVzCisgICAgZGVmIF9hZGRfZW51bShzZWxmLCBsaW5lX3R4dCwgZW51bV90eXBlLCBkZWZfZW51bV92YWwpOgorICAgICAgICAjcHJpbnQoIlBhcnNpbmcgZW51bSBsaW5lICVzIiAlIGxpbmVfdHh0KQorICAgICAgICBpZiAnPScgaW4gbGluZV90eHQ6CisgICAgICAgICAgICAoZW51bV9uYW1lLCBlcV9jaGFyLCBlbnVtX3ZhbCkgPSBsaW5lX3R4dC5zcGxpdChOb25lLCAyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW51bV9uYW1lID0gbGluZV90eHQuc3BsaXQoJywnKVswXQorICAgICAgICAgICAgZW51bV92YWwgPSBzdHIoZGVmX2VudW1fdmFsKQorICAgICAgICBzZWxmLmVudW1fdmFsX2RpY3RbZW51bV9uYW1lXSA9IHt9CisgICAgICAgIHNlbGYuZW51bV92YWxfZGljdFtlbnVtX25hbWVdWyd0eXBlJ10gPSBlbnVtX3R5cGUKKyAgICAgICAgIyBzdHJpcCBjb21tYSBhbmQgY29tbWVudCwgdGhlbiBleHRyYSBzcGxpdCBpbiBjYXNlIG9mIG5vIGNvbW1hIHcvIGNvbW1lbnRzCisgICAgICAgIGVudW1fdmFsID0gZW51bV92YWwuc3RyaXAoKS5zcGxpdCgnLCcsIDEpWzBdCisgICAgICAgIHNlbGYuZW51bV92YWxfZGljdFtlbnVtX25hbWVdWyd2YWwnXSA9IGVudW1fdmFsLnNwbGl0KClbMF0KKyAgICAgICAgIyBQZXJmb3JtIGNvbnZlcnNpb24gb2YgVktfQklUIG1hY3JvCisgICAgICAgIGlmICdWS19CSVQnIGluIHNlbGYuZW51bV92YWxfZGljdFtlbnVtX25hbWVdWyd2YWwnXToKKyAgICAgICAgICAgIHZrX2JpdF92YWwgPSBzZWxmLmVudW1fdmFsX2RpY3RbZW51bV9uYW1lXVsndmFsJ10KKyAgICAgICAgICAgIGJpdF9zaGlmdCA9IGludCh2a19iaXRfdmFsW3ZrX2JpdF92YWwuZmluZCgnKCcpKzE6dmtfYml0X3ZhbC5maW5kKCcpJyldLCAwKQorICAgICAgICAgICAgc2VsZi5lbnVtX3ZhbF9kaWN0W2VudW1fbmFtZV1bJ3ZhbCddID0gc3RyKDEgPDwgYml0X3NoaWZ0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBhY2NvdW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgc3Vycm91bmRlZCBieSBwYXJlbnMKKyAgICAgICAgICAgIHNlbGYuZW51bV92YWxfZGljdFtlbnVtX25hbWVdWyd2YWwnXSA9IHNlbGYuZW51bV92YWxfZGljdFtlbnVtX25hbWVdWyd2YWwnXS5zdHJpcCgnKScpLnJlcGxhY2UoJy0oJywgJy0nKQorICAgICAgICAjIFRyeSB0byBjYXN0IHRvIGludCB0byBkZXRlcm1pbmUgaWYgZW51bSB2YWx1ZSBpcyB1bmlxdWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgI3ByaW50KCJFTlVNIHZhbDoiLCBzZWxmLmVudW1fdmFsX2RpY3RbZW51bV9uYW1lXVsndmFsJ10pCisgICAgICAgICAgICBpbnQoc2VsZi5lbnVtX3ZhbF9kaWN0W2VudW1fbmFtZV1bJ3ZhbCddLCAwKQorICAgICAgICAgICAgc2VsZi5lbnVtX3ZhbF9kaWN0W2VudW1fbmFtZV1bJ3VuaXF1ZSddID0gVHJ1ZQorICAgICAgICAgICAgI3ByaW50KCJFTlVNIGhhcyBudW0gdmFsdWUiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZW51bV92YWxfZGljdFtlbnVtX25hbWVdWyd1bmlxdWUnXSA9IEZhbHNlCisgICAgICAgICAgICAjcHJpbnQoIkVOVU0gaXMgbm90IGEgbnVtYmVyIHZhbHVlIikKKyAgICAgICAgIyBVcGRhdGUgZW51bV90eXBlX2RpY3QgYXMgd2VsbAorICAgICAgICBpZiBub3QgZW51bV90eXBlIGluIHNlbGYuZW51bV90eXBlX2RpY3Q6CisgICAgICAgICAgICBzZWxmLmVudW1fdHlwZV9kaWN0W2VudW1fdHlwZV0gPSBbXQorICAgICAgICBzZWxmLmVudW1fdHlwZV9kaWN0W2VudW1fdHlwZV0uYXBwZW5kKGVudW1fbmFtZSkKKworICAgICMgUmV0dXJuIFRydWUgaWYgc3RydWN0IG1lbWJlciBpcyBhIGR5bmFtaWMgYXJyYXkKKyAgICAjIFJVTEVTIDogVGhpcyBpcyBhIGJpdCBxdWlya3kgYmFzZWQgb24gdGhlIEFQSQorICAgICMgTk9URSA6IENoYW5nZXMgaW4gQVBJIHNwZWMgbWF5IGNhdXNlIHRoZXNlIHJ1bGVzIHRvIGNoYW5nZQorICAgICMgIDEuIFRoZXJlIG11c3QgYmUgYSBwcmV2aW91cyB1aW50IHZhciB3LyAnY291bnQnIGluIHRoZSBuYW1lIGluIHRoZSBzdHJ1Y3QKKyAgICAjICAyLiBEeW5hbSBhcnJheSBtdXN0IGhhdmUgJ2NvbnN0JyBhbmQgJyonIHF1YWxpZmllcnMKKyAgICAjICAzYS4gTmFtZSBvZiBkeW5hbSBhcnJheSBtdXN0IGVuZCBpbiAncycgY2hhciBPUgorICAgICMgIDNiLiBOYW1lIG9mIGNvdW50IHZhciBtaW51cyAnY291bnQnIG11c3QgYmUgY29udGFpbmVkIGluIG5hbWUgb2YgZHluYW1pYyBhcnJheQorICAgIGRlZiBfaXNfZHluYW1pY19hcnJheShzZWxmLCBmdWxsX3R5cGUsIG5hbWUpOgorICAgICAgICBleGNlcHRpb25zID0gWydwRW5hYmxlZEZlYXR1cmVzJywgJ3BXYWl0RHN0U3RhZ2VNYXNrJywgJ3BTYW1wbGVNYXNrJ10KKyAgICAgICAgaWYgbmFtZSBpbiBleGNlcHRpb25zOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmICcnICE9IHNlbGYubGFzdF9zdHJ1Y3RfY291bnRfbmFtZToKKyAgICAgICAgICAgIGlmICdjb25zdCcgaW4gZnVsbF90eXBlIGFuZCAnKicgaW4gZnVsbF90eXBlOgorICAgICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJ3MnKSBvciBzZWxmLmxhc3Rfc3RydWN0X2NvdW50X25hbWUubG93ZXIoKS5yZXBsYWNlKCdjb3VudCcsICcnKSBpbiBuYW1lLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgICAgICAjIFZrV3JpdGVEZXNjcmlwdG9yU2V0CisgICAgICAgICAgICAgICAgaWYgc2VsZi5sYXN0X3N0cnVjdF9jb3VudF9uYW1lID09ICJkZXNjcmlwdG9yQ291bnQiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBwb3B1bGF0ZSBzdHJ1Y3QgZGljdHMgYmFzZWQgb24gc3RydWN0IGxpbmVzCisgICAgIyBUT0RPIDogSGFuZGxlICI6IiBiaXRmaWVsZCwgIioqIiBwdHItPnB0ciBhbmQgImNvbnN0IHR5cGUqY29uc3QqIgorICAgIGRlZiBfYWRkX3N0cnVjdChzZWxmLCBsaW5lX3R4dCwgc3RydWN0X3R5cGUsIG51bSk6CisgICAgICAgICNwcmludCgiUGFyc2luZyBzdHJ1Y3QgbGluZSAlcyIgJSBsaW5lX3R4dCkKKyAgICAgICAgaWYgJ3snID09IHN0cnVjdF90eXBlOgorICAgICAgICAgICAgcHJpbnQoIlBhcnNpbmcgc3RydWN0ICd7JyB3LyBsaW5lICVzIiAlIGxpbmVfdHh0KQorICAgICAgICBpZiBub3Qgc3RydWN0X3R5cGUgaW4gc2VsZi5zdHJ1Y3RfZGljdDoKKyAgICAgICAgICAgIHNlbGYuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdID0ge30KKyAgICAgICAgbWVtYmVycyA9IGxpbmVfdHh0LnN0cmlwKCkuc3BsaXQoJzsnLCAxKVswXSAjIGZpcnN0IHN0cmlwIHNlbWljb2xvbiAmIGNvbW1lbnRzCisgICAgICAgICMgVE9ETyA6IEhhbmRsZSBiaXRmaWVsZHMgbW9yZSBjb3JyZWN0bHkKKyAgICAgICAgbWVtYmVycyA9IG1lbWJlcnMuc3RyaXAoKS5zcGxpdCgnOicsIDEpWzBdICMgc3RyaXAgYml0ZmllbGQgZWxlbWVudAorICAgICAgICAobWVtYmVyX3R5cGUsIG1lbWJlcl9uYW1lKSA9IG1lbWJlcnMucnNwbGl0KE5vbmUsIDEpCisgICAgICAgICMgU3RvcmUgY291bnRzIHRvIGhlbHAgcmVjb2duaXplIGFuZCBzaXplIGR5bmFtaWMgYXJyYXlzCisgICAgICAgIGlmICdjb3VudCcgaW4gbWVtYmVyX25hbWUubG93ZXIoKSBhbmQgJ3NhbXBsZWNvdW50JyAhPSBtZW1iZXJfbmFtZS5sb3dlcigpIGFuZCAndWludCcgaW4gbWVtYmVyX3R5cGU6CisgICAgICAgICAgICBzZWxmLmxhc3Rfc3RydWN0X2NvdW50X25hbWUgPSBtZW1iZXJfbmFtZQorICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dID0ge30KKyAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbnVtXVsnZnVsbF90eXBlJ10gPSBtZW1iZXJfdHlwZQorICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydkeW5fYXJyYXknXSA9IEZhbHNlCisKKyAgICAgICAgaWYgJyonIGluIG1lbWJlcl90eXBlOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbnVtXVsncHRyJ10gPSBUcnVlCisgICAgICAgICAgICAjIFRPRE8gOiBOZWVkIG1vcmUgZ2VuZXJhbCBwdXJwb3NlIHdheSBoZXJlIHRvIHJlZHVjZSBkb3duIHRvIGJhc2ljIHR5cGUKKyAgICAgICAgICAgIG1lbWJlcl90eXBlID0gbWVtYmVyX3R5cGUucmVwbGFjZSgnIGNvbnN0KicsICcnKQorICAgICAgICAgICAgbWVtYmVyX3R5cGUgPSBtZW1iZXJfdHlwZS5zdHJpcCgnKicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydwdHInXSA9IEZhbHNlCisgICAgICAgIGlmICdjb25zdCcgaW4gbWVtYmVyX3R5cGU6CisgICAgICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydjb25zdCddID0gVHJ1ZQorICAgICAgICAgICAgbWVtYmVyX3R5cGUgPSBtZW1iZXJfdHlwZS5yZXBsYWNlKCdjb25zdCcsICcnKS5zdHJpcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydjb25zdCddID0gRmFsc2UKKyAgICAgICAgIyBUT0RPIDogVGhlcmUgaXMgYSBidWcgaGVyZSB3aGVyZSBpdCBzZWVtcyB0aGF0IGF0IHRoZSB0aW1lIHdlIGRvIHRoaXMgY2hlY2ssCisgICAgICAgICMgICAgdGhlIGRhdGEgaXMgbm90IGluIHRoZSB0eXBlcyBvciB0eXBlZGVmX3Jldl9kaWN0LCBzbyB3ZSBuZXZlciBwYXNzIHRoaXMgaWYgY2hlY2sKKyAgICAgICAgaWYgaXNfdHlwZShtZW1iZXJfdHlwZSwgJ3N0cnVjdCcpOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbnVtXVsnc3RydWN0J10gPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydzdHJ1Y3QnXSA9IEZhbHNlCisgICAgICAgIHNlbGYuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdW251bV1bJ3R5cGUnXSA9IG1lbWJlcl90eXBlCisgICAgICAgIGlmICdbJyBpbiBtZW1iZXJfbmFtZToKKyAgICAgICAgICAgIChtZW1iZXJfbmFtZSwgYXJyYXlfc2l6ZSkgPSBtZW1iZXJfbmFtZS5zcGxpdCgnWycsIDEpCisgICAgICAgICAgICAjaWYgJ2NoYXInIGluIG1lbWJlcl90eXBlOgorICAgICAgICAgICAgIyAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydhcnJheSddID0gRmFsc2UKKyAgICAgICAgICAgICMgICAgc2VsZi5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbnVtXVsnYXJyYXlfc2l6ZSddID0gMAorICAgICAgICAgICAgIyAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydwdHInXSA9IFRydWUKKyAgICAgICAgICAgICNlbHNlOgorICAgICAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbnVtXVsnYXJyYXknXSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdW251bV1bJ2FycmF5X3NpemUnXSA9IGFycmF5X3NpemUuc3RyaXAoJ10nKQorICAgICAgICBlbGlmIHNlbGYuX2lzX2R5bmFtaWNfYXJyYXkoc2VsZi5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbnVtXVsnZnVsbF90eXBlJ10sIG1lbWJlcl9uYW1lKToKKyAgICAgICAgICAgICNwcmludCgiRm91bmQgZHluYW1pYyBhcnJheSAlcyBvZiBzaXplICVzIiAlIChtZW1iZXJfbmFtZSwgc2VsZi5sYXN0X3N0cnVjdF9jb3VudF9uYW1lKSkKKyAgICAgICAgICAgIHNlbGYuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdW251bV1bJ2FycmF5J10gPSBUcnVlCisgICAgICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydkeW5fYXJyYXknXSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdW251bV1bJ2FycmF5X3NpemUnXSA9IHNlbGYubGFzdF9zdHJ1Y3RfY291bnRfbmFtZQorICAgICAgICBlbGlmIG5vdCAnYXJyYXknIGluIHNlbGYuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdW251bV06CisgICAgICAgICAgICBzZWxmLnN0cnVjdF9kaWN0W3N0cnVjdF90eXBlXVtudW1dWydhcnJheSddID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuc3RydWN0X2RpY3Rbc3RydWN0X3R5cGVdW251bV1bJ2FycmF5X3NpemUnXSA9IDAKKyAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdFtzdHJ1Y3RfdHlwZV1bbnVtXVsnbmFtZSddID0gbWVtYmVyX25hbWUKKworIyBjaGVjayBpZiBnaXZlbiBpZGVudGlmaWVyIGlzIG9mIHNwZWNpZmllZCB0eXBlX3RvX2NoZWNrCitkZWYgaXNfdHlwZShpZGVudGlmaWVyLCB0eXBlX3RvX2NoZWNrKToKKyAgICBpZiBpZGVudGlmaWVyIGluIHR5cGVzX2RpY3QgYW5kIHR5cGVfdG9fY2hlY2sgPT0gdHlwZXNfZGljdFtpZGVudGlmaWVyXToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBpZGVudGlmaWVyIGluIHR5cGVkZWZfcmV2X2RpY3Q6CisgICAgICAgIG5ld19pZCA9IHR5cGVkZWZfcmV2X2RpY3RbaWRlbnRpZmllcl0KKyAgICAgICAgaWYgbmV3X2lkIGluIHR5cGVzX2RpY3QgYW5kIHR5cGVfdG9fY2hlY2sgPT0gdHlwZXNfZGljdFtuZXdfaWRdOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworIyBUaGlzIGlzIGEgdmFsaWRhdGlvbiBmdW5jdGlvbiB0byB2ZXJpZnkgdGhhdCB3ZSBjYW4gcmVwcm9kdWNlIHRoZSBvcmlnaW5hbCBzdHJ1Y3RzCitkZWYgcmVjcmVhdGVfc3RydWN0cygpOgorICAgIGZvciBzdHJ1Y3RfbmFtZSBpbiBzdHJ1Y3RfZGljdDoKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgidHlwZWRlZiBzdHJ1Y3QgJXNcbntcbiIgJSBzdHJ1Y3RfbmFtZSkKKyAgICAgICAgZm9yIG1lbV9udW0gaW4gc29ydGVkKHN0cnVjdF9kaWN0W3N0cnVjdF9uYW1lXSk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgICAgIikKKyAgICAgICAgICAgIGlmIHN0cnVjdF9kaWN0W3N0cnVjdF9uYW1lXVttZW1fbnVtXVsnY29uc3QnXToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJjb25zdCAiKQorICAgICAgICAgICAgI2lmIHN0cnVjdF9kaWN0W3N0cnVjdF9uYW1lXVttZW1fbnVtXVsnc3RydWN0J106CisgICAgICAgICAgICAjICAgIHN5cy5zdGRvdXQud3JpdGUoInN0cnVjdCAiKQorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSAoc3RydWN0X2RpY3Rbc3RydWN0X25hbWVdW21lbV9udW1dWyd0eXBlJ10pCisgICAgICAgICAgICBpZiBzdHJ1Y3RfZGljdFtzdHJ1Y3RfbmFtZV1bbWVtX251bV1bJ3B0ciddOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIioiKQorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiICIpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN0cnVjdF9kaWN0W3N0cnVjdF9uYW1lXVttZW1fbnVtXVsnbmFtZSddKQorICAgICAgICAgICAgaWYgc3RydWN0X2RpY3Rbc3RydWN0X25hbWVdW21lbV9udW1dWydhcnJheSddOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlsiKQorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3RydWN0X2RpY3Rbc3RydWN0X25hbWVdW21lbV9udW1dWydhcnJheV9zaXplJ10pCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXSIpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCI7XG4iKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ9ICIpCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUodHlwZWRlZl9md2RfZGljdFtzdHJ1Y3RfbmFtZV0pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIjtcblxuIikKKworIworIyBUT0RPOiBGaXggY29uc3RydWN0aW9uIG9mIHN0cnVjdCBuYW1lCitkZWYgZ2V0X3N0cnVjdF9uYW1lX2Zyb21fc3RydWN0X3R5cGUoc3RydWN0X3R5cGUpOgorICAgICMgTm90ZTogQWxsIHN0cnVjdCB0eXBlcyBhcmUgbm93IGNhbWVsLWNhc2UKKyAgICAjIERlYnVnIFJlcG9ydCBoYXMgYW4gaW5jb25zaXN0ZW5jeSAtIHNvIG5lZWQgc3BlY2lhbCBjYXNlLgorICAgIGlmICgiVktfU1RSVUNUVVJFX1RZUEVfREVCVUdfUkVQT1JUX0NSRUFURV9JTkZPX0VYVCIgPT0gc3RydWN0X3R5cGUpOgorICAgICAgICByZXR1cm4gIlZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQiCisgICAgY2Fwc19zdHJ1Y3RfbmFtZSA9IHN0cnVjdF90eXBlLnJlcGxhY2UoIl9TVFJVQ1RVUkVfVFlQRSIsICIiKQorICAgIGNoYXJfaWR4ID0gMAorICAgIHN0cnVjdF9uYW1lID0gJycKKyAgICBmb3IgY2hhciBpbiBjYXBzX3N0cnVjdF9uYW1lOgorICAgICAgICBpZiAoMCA9PSBjaGFyX2lkeCkgb3IgKGNhcHNfc3RydWN0X25hbWVbY2hhcl9pZHgtMV0gPT0gJ18nKToKKyAgICAgICAgICAgIHN0cnVjdF9uYW1lICs9IGNhcHNfc3RydWN0X25hbWVbY2hhcl9pZHhdCisgICAgICAgIGVsaWYgKGNhcHNfc3RydWN0X25hbWVbY2hhcl9pZHhdID09ICdfJyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHJ1Y3RfbmFtZSArPSBjYXBzX3N0cnVjdF9uYW1lW2NoYXJfaWR4XS5sb3dlcigpCisgICAgICAgIGNoYXJfaWR4ICs9IDEKKworICAgIHJldHVybiBzdHJ1Y3RfbmFtZQorCisjIEVtaXQgYW4gaWZkZWYgaWYgaW5jb21pbmcgZnVuYyBtYXRjaGVzIGEgcGxhdGZvcm0gaWRlbnRpZmllcgorZGVmIGFkZF9wbGF0Zm9ybV93cmFwcGVyX2VudHJ5KGxpc3QsIGZ1bmMpOgorICAgIGlmIChyZS5tYXRjaChyJy4qWGxpYi4qJywgZnVuYykpOgorICAgICAgICBsaXN0LmFwcGVuZCgiI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUiIpCisgICAgaWYgKHJlLm1hdGNoKHInLipYY2IuKicsIGZ1bmMpKToKKyAgICAgICAgbGlzdC5hcHBlbmQoIiNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUiIpCisgICAgaWYgKHJlLm1hdGNoKHInLipXYXlsYW5kLionLCBmdW5jKSk6CisgICAgICAgIGxpc3QuYXBwZW5kKCIjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSIikKKyAgICBpZiAocmUubWF0Y2gocicuKk1pci4qJywgZnVuYykpOgorICAgICAgICBsaXN0LmFwcGVuZCgiI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NSVJfS0hSIikKKyAgICBpZiAocmUubWF0Y2gocicuKkFuZHJvaWQuKicsIGZ1bmMpKToKKyAgICAgICAgbGlzdC5hcHBlbmQoIiNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIiKQorICAgIGlmIChyZS5tYXRjaChyJy4qV2luMzIuKicsIGZ1bmMpKToKKyAgICAgICAgbGlzdC5hcHBlbmQoIiNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSIikKKworIyBFbWl0IGFuIGVuZGlmIGlmIGluY29taW5nIGZ1bmMgbWF0Y2hlcyBhIHBsYXRmb3JtIGlkZW50aWZpZXIKK2RlZiBhZGRfcGxhdGZvcm1fd3JhcHBlcl9leGl0KGxpc3QsIGZ1bmMpOgorICAgIGlmIChyZS5tYXRjaChyJy4qWGxpYi4qJywgZnVuYykpOgorICAgICAgICBsaXN0LmFwcGVuZCgiI2VuZGlmIC8vVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSIikKKyAgICBpZiAocmUubWF0Y2gocicuKlhjYi4qJywgZnVuYykpOgorICAgICAgICBsaXN0LmFwcGVuZCgiI2VuZGlmIC8vVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIiKQorICAgIGlmIChyZS5tYXRjaChyJy4qV2F5bGFuZC4qJywgZnVuYykpOgorICAgICAgICBsaXN0LmFwcGVuZCgiI2VuZGlmIC8vVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSIikKKyAgICBpZiAocmUubWF0Y2gocicuKk1pci4qJywgZnVuYykpOgorICAgICAgICBsaXN0LmFwcGVuZCgiI2VuZGlmIC8vVktfVVNFX1BMQVRGT1JNX01JUl9LSFIiKQorICAgIGlmIChyZS5tYXRjaChyJy4qQW5kcm9pZC4qJywgZnVuYykpOgorICAgICAgICBsaXN0LmFwcGVuZCgiI2VuZGlmIC8vVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSIikKKyAgICBpZiAocmUubWF0Y2gocicuKldpbjMyLionLCBmdW5jKSk6CisgICAgICAgIGxpc3QuYXBwZW5kKCIjZW5kaWYgLy9WS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSIikKKworIyBjbGFzcyBmb3Igd3JpdGluZyBjb21tb24gZmlsZSBlbGVtZW50cworIyBIZXJlJ3MgaG93IHRoaXMgY2xhc3MgbGF5cyBvdXQgYSBmaWxlOgorIyAgQ09QWVJJR0hUCisjICBIRUFERVIKKyMgIEJPRFkKKyMgIEZPT1RFUgorIworIyBGb3IgZWFjaCBvZiB0aGVzZSBzZWN0aW9ucywgdGhlcmUncyBhICJzZXQqIiBmdW5jdGlvbgorIyBUaGUgY2xhc3MgYXMgYSB3aG9sZSBoYXMgYSBnZW5lcmF0ZSBmdW5jdGlvbiB3aGljaCB3aWxsIHdyaXRlIGVhY2ggc2VjdGlvbiBpbiBvcmRlcgorY2xhc3MgQ29tbW9uRmlsZUdlbjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSwgY29weXJpZ2h0X3R4dD0iIiwgaGVhZGVyX3R4dD0iIiwgYm9keV90eHQ9IiIsIGZvb3Rlcl90eHQ9IiIpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5jb250ZW50cyA9IHsnY29weXJpZ2h0JzogY29weXJpZ2h0X3R4dCwgJ2hlYWRlcic6IGhlYWRlcl90eHQsICdib2R5JzogYm9keV90eHQsICdmb290ZXInOiBmb290ZXJfdHh0fQorICAgICAgICAjIFRPRE8gOiBTZXQgYSBkZWZhdWx0IGNvcHlyaWdodCAmIGZvb3RlciBhdCBsZWFzdAorCisgICAgZGVmIHNldEZpbGVuYW1lKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisKKyAgICBkZWYgc2V0Q29weXJpZ2h0KHNlbGYsIGMpOgorICAgICAgICBzZWxmLmNvbnRlbnRzWydjb3B5cmlnaHQnXSA9IGMKKworICAgIGRlZiBzZXRIZWFkZXIoc2VsZiwgaCk6CisgICAgICAgIHNlbGYuY29udGVudHNbJ2hlYWRlciddID0gaAorCisgICAgZGVmIHNldEJvZHkoc2VsZiwgYik6CisgICAgICAgIHNlbGYuY29udGVudHNbJ2JvZHknXSA9IGIKKworICAgIGRlZiBzZXRGb290ZXIoc2VsZiwgZik6CisgICAgICAgIHNlbGYuY29udGVudHNbJ2Zvb3RlciddID0gZgorCisgICAgZGVmIGdlbmVyYXRlKHNlbGYpOgorICAgICAgICAjcHJpbnQoIkdlbmVyYXRlIHRvIGZpbGUgJXMiICUgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICJ3IikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5jb250ZW50c1snY29weXJpZ2h0J10pCisgICAgICAgICAgICBmLndyaXRlKHNlbGYuY29udGVudHNbJ2hlYWRlciddKQorICAgICAgICAgICAgZi53cml0ZShzZWxmLmNvbnRlbnRzWydib2R5J10pCisgICAgICAgICAgICBmLndyaXRlKHNlbGYuY29udGVudHNbJ2Zvb3RlciddKQorCisjIGNsYXNzIGZvciB3cml0aW5nIGEgd3JhcHBlciBjbGFzcyBmb3Igc3RydWN0dXJlcworIyBUaGUgd3JhcHBlciBjbGFzcyB3cmFwcyB0aGUgc3RydWN0cyBhbmQgaW5jbHVkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yCisjICBzZXR0aW5nL2dldHRpbmcgbWVtYmVyIHZhbHVlcyBhbmQgZGlzcGxheWluZyB0aGUgc3RydWN0IGRhdGEgaW4gdmFyaW91cyBmb3JtYXRzCitjbGFzcyBTdHJ1Y3RXcmFwcGVyR2VuOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbl9zdHJ1Y3RfZGljdCwgaW5fb3BhcXVlX3R5cGVzLCBwcmVmaXgsIG91dF9kaXIpOgorICAgICAgICBzZWxmLnN0cnVjdF9kaWN0ID0gaW5fc3RydWN0X2RpY3QKKyAgICAgICAgc2VsZi5vcGFxdWVfdHlwZXMgPSBpbl9vcGFxdWVfdHlwZXMKKyAgICAgICAgc2VsZi5pbmNsdWRlX2hlYWRlcnMgPSBbXQorICAgICAgICBzZWxmLmxpbmVpbmZvID0gc291cmNlbGluZWluZm8oKQorICAgICAgICBzZWxmLmFwaSA9IHByZWZpeAorICAgICAgICBpZiBwcmVmaXgubG93ZXIoKSA9PSAidnVsa2FuIjoKKyAgICAgICAgICAgIHNlbGYuYXBpX3ByZWZpeCA9ICJ2ayIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXBpX3ByZWZpeCA9IHByZWZpeAorICAgICAgICBzZWxmLmhlYWRlcl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvdXRfZGlyLCBzZWxmLmFwaV9wcmVmaXgrIl9zdHJ1Y3Rfd3JhcHBlcnMuaCIpCisgICAgICAgIHNlbGYuY2xhc3NfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0X2Rpciwgc2VsZi5hcGlfcHJlZml4KyJfc3RydWN0X3dyYXBwZXJzLmNwcCIpCisgICAgICAgIHNlbGYuc2FmZV9zdHJ1Y3RfaGVhZGVyX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG91dF9kaXIsIHNlbGYuYXBpX3ByZWZpeCsiX3NhZmVfc3RydWN0LmgiKQorICAgICAgICBzZWxmLnNhZmVfc3RydWN0X3NvdXJjZV9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvdXRfZGlyLCBzZWxmLmFwaV9wcmVmaXgrIl9zYWZlX3N0cnVjdC5jcHAiKQorICAgICAgICBzZWxmLnN0cmluZ19oZWxwZXJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0X2Rpciwgc2VsZi5hcGlfcHJlZml4KyJfc3RydWN0X3N0cmluZ19oZWxwZXIuaCIpCisgICAgICAgIHNlbGYuc3RyaW5nX2hlbHBlcl9ub19hZGRyX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG91dF9kaXIsIHNlbGYuYXBpX3ByZWZpeCsiX3N0cnVjdF9zdHJpbmdfaGVscGVyX25vX2FkZHIuaCIpCisgICAgICAgIHNlbGYuc3RyaW5nX2hlbHBlcl9jcHBfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0X2Rpciwgc2VsZi5hcGlfcHJlZml4KyJfYXBpX2R1bXBfaGVscGVyX2NwcC5oIikKKyAgICAgICAgc2VsZi5zdHJpbmdfaGVscGVyX25vX2FkZHJfY3BwX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG91dF9kaXIsIHNlbGYuYXBpX3ByZWZpeCsiX3N0cnVjdF9zdHJpbmdfaGVscGVyX25vX2FkZHJfY3BwLmgiKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2hlbHBlcl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvdXRfZGlyLCBzZWxmLmFwaV9wcmVmaXgrIl9zdHJ1Y3RfdmFsaWRhdGVfaGVscGVyLmgiKQorICAgICAgICBzZWxmLm5vX2FkZHIgPSBGYWxzZQorICAgICAgICAjIFNhZmUgU3RydWN0IChzcykgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMKKyAgICAgICAgc2VsZi5zc2ggPSBDb21tb25GaWxlR2VuKHNlbGYuc2FmZV9zdHJ1Y3RfaGVhZGVyX2ZpbGVuYW1lKQorICAgICAgICBzZWxmLnNzcyA9IENvbW1vbkZpbGVHZW4oc2VsZi5zYWZlX3N0cnVjdF9zb3VyY2VfZmlsZW5hbWUpCisgICAgICAgIHNlbGYuaGZnID0gQ29tbW9uRmlsZUdlbihzZWxmLmhlYWRlcl9maWxlbmFtZSkKKyAgICAgICAgc2VsZi5jZmcgPSBDb21tb25GaWxlR2VuKHNlbGYuY2xhc3NfZmlsZW5hbWUpCisgICAgICAgIHNlbGYuc2hnID0gQ29tbW9uRmlsZUdlbihzZWxmLnN0cmluZ19oZWxwZXJfZmlsZW5hbWUpCisgICAgICAgIHNlbGYuc2hjcHBnID0gQ29tbW9uRmlsZUdlbihzZWxmLnN0cmluZ19oZWxwZXJfY3BwX2ZpbGVuYW1lKQorICAgICAgICBzZWxmLnZoZyA9IENvbW1vbkZpbGVHZW4oc2VsZi52YWxpZGF0ZV9oZWxwZXJfZmlsZW5hbWUpCisgICAgICAgIHNlbGYuc2l6ZV9oZWxwZXJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0X2Rpciwgc2VsZi5hcGlfcHJlZml4KyJfc3RydWN0X3NpemVfaGVscGVyLmgiKQorICAgICAgICBzZWxmLnNpemVfaGVscGVyX2NfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0X2Rpciwgc2VsZi5hcGlfcHJlZml4KyJfc3RydWN0X3NpemVfaGVscGVyLmMiKQorICAgICAgICBzZWxmLnNpemVfaGVscGVyX2dlbiA9IENvbW1vbkZpbGVHZW4oc2VsZi5zaXplX2hlbHBlcl9maWxlbmFtZSkKKyAgICAgICAgc2VsZi5zaXplX2hlbHBlcl9jX2dlbiA9IENvbW1vbkZpbGVHZW4oc2VsZi5zaXplX2hlbHBlcl9jX2ZpbGVuYW1lKQorICAgICAgICAjcHJpbnQoc2VsZi5oZWFkZXJfZmlsZW5hbWUpCisgICAgICAgIHNlbGYuaGVhZGVyX3R4dCA9ICIiCisgICAgICAgIHNlbGYuZGVmaW5pdGlvbl90eHQgPSAiIgorCisgICAgZGVmIHNldF9pbmNsdWRlX2hlYWRlcnMoc2VsZiwgaW5jbHVkZV9oZWFkZXJzKToKKyAgICAgICAgc2VsZi5pbmNsdWRlX2hlYWRlcnMgPSBpbmNsdWRlX2hlYWRlcnMKKworICAgIGRlZiBzZXRfbm9fYWRkcihzZWxmLCBub19hZGRyKToKKyAgICAgICAgc2VsZi5ub19hZGRyID0gbm9fYWRkcgorICAgICAgICBpZiBzZWxmLm5vX2FkZHI6CisgICAgICAgICAgICBzZWxmLnNoZyA9IENvbW1vbkZpbGVHZW4oc2VsZi5zdHJpbmdfaGVscGVyX25vX2FkZHJfZmlsZW5hbWUpCisgICAgICAgICAgICBzZWxmLnNoY3BwZyA9IENvbW1vbkZpbGVHZW4oc2VsZi5zdHJpbmdfaGVscGVyX25vX2FkZHJfY3BwX2ZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zaGcgPSBDb21tb25GaWxlR2VuKHNlbGYuc3RyaW5nX2hlbHBlcl9maWxlbmFtZSkKKyAgICAgICAgICAgIHNlbGYuc2hjcHBnID0gQ29tbW9uRmlsZUdlbihzZWxmLnN0cmluZ19oZWxwZXJfY3BwX2ZpbGVuYW1lKQorCisgICAgIyBSZXR1cm4gY2xhc3MgbmFtZSBmb3IgZ2l2ZW4gc3RydWN0IG5hbWUKKyAgICBkZWYgZ2V0X2NsYXNzX25hbWUoc2VsZiwgc3RydWN0X25hbWUpOgorICAgICAgICBjbGFzc19uYW1lID0gc3RydWN0X25hbWUuc3RyaXAoJ18nKS5sb3dlcigpICsgIl9zdHJ1Y3Rfd3JhcHBlciIKKyAgICAgICAgcmV0dXJuIGNsYXNzX25hbWUKKworICAgIGRlZiBnZXRfZmlsZV9saXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gW29zLnBhdGguYmFzZW5hbWUoc2VsZi5oZWFkZXJfZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuY2xhc3NfZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuc3RyaW5nX2hlbHBlcl9maWxlbmFtZSldCisKKyAgICAjIEdlbmVyYXRlIGNsYXNzIGhlYWRlciBmaWxlCisgICAgZGVmIGdlbmVyYXRlSGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmhmZy5zZXRDb3B5cmlnaHQoc2VsZi5fZ2VuZXJhdGVDb3B5cmlnaHQoKSkKKyAgICAgICAgc2VsZi5oZmcuc2V0SGVhZGVyKHNlbGYuX2dlbmVyYXRlSGVhZGVyKCkpCisgICAgICAgIHNlbGYuaGZnLnNldEJvZHkoc2VsZi5fZ2VuZXJhdGVDbGFzc0RlY2xhcmF0aW9uKCkpCisgICAgICAgIHNlbGYuaGZnLnNldEZvb3RlcihzZWxmLl9nZW5lcmF0ZUZvb3RlcigpKQorICAgICAgICBzZWxmLmhmZy5nZW5lcmF0ZSgpCisKKyAgICAjIEdlbmVyYXRlIGNsYXNzIGRlZmluaXRpb24KKyAgICBkZWYgZ2VuZXJhdGVCb2R5KHNlbGYpOgorICAgICAgICBzZWxmLmNmZy5zZXRDb3B5cmlnaHQoc2VsZi5fZ2VuZXJhdGVDb3B5cmlnaHQoKSkKKyAgICAgICAgc2VsZi5jZmcuc2V0SGVhZGVyKHNlbGYuX2dlbmVyYXRlQ3BwSGVhZGVyKCkpCisgICAgICAgIHNlbGYuY2ZnLnNldEJvZHkoc2VsZi5fZ2VuZXJhdGVDbGFzc0RlZmluaXRpb24oKSkKKyAgICAgICAgc2VsZi5jZmcuc2V0Rm9vdGVyKHNlbGYuX2dlbmVyYXRlRm9vdGVyKCkpCisgICAgICAgIHNlbGYuY2ZnLmdlbmVyYXRlKCkKKworICAgICMgU2FmZSBTdHJ1Y3RzIGFyZSB2ZXJzaW9ucyBvZiB2dWxrYW4gc3RydWN0cyB3aXRoIG5vbi1jb25zdCBzYWZlIHB0cnMKKyAgICAjICB0aGF0IG1ha2Ugc2hhZG93aW5nIHN0cnVjdHVyZXMgYW5kIGNsZWFuLXVwIG9mIHNoYWRvd2VkIHN0cnVjdHVyZXMgdmVyeSBzaW1wbGUKKyAgICBkZWYgZ2VuZXJhdGVTYWZlU3RydWN0SGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLnNzaC5zZXRDb3B5cmlnaHQoc2VsZi5fZ2VuZXJhdGVDb3B5cmlnaHQoKSkKKyAgICAgICAgc2VsZi5zc2guc2V0SGVhZGVyKHNlbGYuX2dlbmVyYXRlU2FmZVN0cnVjdEhlYWRlcigpKQorICAgICAgICBzZWxmLnNzaC5zZXRCb2R5KHNlbGYuX2dlbmVyYXRlU2FmZVN0cnVjdERlY2xzKCkpCisgICAgICAgIHNlbGYuc3NoLmdlbmVyYXRlKCkKKworICAgIGRlZiBnZW5lcmF0ZVNhZmVTdHJ1Y3RzKHNlbGYpOgorICAgICAgICBzZWxmLnNzcy5zZXRDb3B5cmlnaHQoc2VsZi5fZ2VuZXJhdGVDb3B5cmlnaHQoKSkKKyAgICAgICAgc2VsZi5zc3Muc2V0SGVhZGVyKHNlbGYuX2dlbmVyYXRlU2FmZVN0cnVjdFNvdXJjZUhlYWRlcigpKQorICAgICAgICBzZWxmLnNzcy5zZXRCb2R5KHNlbGYuX2dlbmVyYXRlU2FmZVN0cnVjdFNvdXJjZSgpKQorICAgICAgICBzZWxmLnNzcy5nZW5lcmF0ZSgpCisKKyAgICAjIEdlbmVyYXRlIGMtc3R5bGUgLmggZmlsZSB0aGF0IGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcgc3RydWN0cworICAgIGRlZiBnZW5lcmF0ZVN0cmluZ0hlbHBlcihzZWxmKToKKyAgICAgICAgcHJpbnQoIkdlbmVyYXRpbmcgc3RydWN0IHN0cmluZyBoZWxwZXIiKQorICAgICAgICBzZWxmLnNoZy5zZXRDb3B5cmlnaHQoc2VsZi5fZ2VuZXJhdGVDb3B5cmlnaHQoKSkKKyAgICAgICAgc2VsZi5zaGcuc2V0SGVhZGVyKHNlbGYuX2dlbmVyYXRlU3RyaW5nSGVscGVySGVhZGVyKCkpCisgICAgICAgIHNlbGYuc2hnLnNldEJvZHkoc2VsZi5fZ2VuZXJhdGVTdHJpbmdIZWxwZXJGdW5jdGlvbnMoKSkKKyAgICAgICAgc2VsZi5zaGcuZ2VuZXJhdGUoKQorCisgICAgIyBHZW5lcmF0ZSBjcHAtc3R5bGUgLmggZmlsZSB0aGF0IGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcgc3RydWN0cworICAgIGRlZiBnZW5lcmF0ZVN0cmluZ0hlbHBlckNwcChzZWxmKToKKyAgICAgICAgcHJpbnQoIkdlbmVyYXRpbmcgc3RydWN0IHN0cmluZyBoZWxwZXIgY3BwIikKKyAgICAgICAgc2VsZi5zaGNwcGcuc2V0Q29weXJpZ2h0KHNlbGYuX2dlbmVyYXRlQ29weXJpZ2h0KCkpCisgICAgICAgIHNlbGYuc2hjcHBnLnNldEhlYWRlcihzZWxmLl9nZW5lcmF0ZVN0cmluZ0hlbHBlckhlYWRlckNwcCgpKQorICAgICAgICBzZWxmLnNoY3BwZy5zZXRCb2R5KHNlbGYuX2dlbmVyYXRlU3RyaW5nSGVscGVyRnVuY3Rpb25zQ3BwKCkpCisgICAgICAgIHNlbGYuc2hjcHBnLmdlbmVyYXRlKCkKKworICAgICMgR2VuZXJhdGUgYy1zdHlsZSAuaCBmaWxlIHRoYXQgY29udGFpbnMgZnVuY3Rpb25zIGZvciBwcmludGluZyBzdHJ1Y3RzCisgICAgZGVmIGdlbmVyYXRlVmFsaWRhdGVIZWxwZXIoc2VsZik6CisgICAgICAgIHByaW50KCJHZW5lcmF0aW5nIHN0cnVjdCB2YWxpZGF0ZSBoZWxwZXIiKQorICAgICAgICBzZWxmLnZoZy5zZXRDb3B5cmlnaHQoc2VsZi5fZ2VuZXJhdGVDb3B5cmlnaHQoKSkKKyAgICAgICAgc2VsZi52aGcuc2V0SGVhZGVyKHNlbGYuX2dlbmVyYXRlVmFsaWRhdGVIZWxwZXJIZWFkZXIoKSkKKyAgICAgICAgc2VsZi52aGcuc2V0Qm9keShzZWxmLl9nZW5lcmF0ZVZhbGlkYXRlSGVscGVyRnVuY3Rpb25zKCkpCisgICAgICAgIHNlbGYudmhnLmdlbmVyYXRlKCkKKworICAgIGRlZiBnZW5lcmF0ZVNpemVIZWxwZXIoc2VsZik6CisgICAgICAgIHByaW50KCJHZW5lcmF0aW5nIHN0cnVjdCBzaXplIGhlbHBlciIpCisgICAgICAgIHNlbGYuc2l6ZV9oZWxwZXJfZ2VuLnNldENvcHlyaWdodChzZWxmLl9nZW5lcmF0ZUNvcHlyaWdodCgpKQorICAgICAgICBzZWxmLnNpemVfaGVscGVyX2dlbi5zZXRIZWFkZXIoc2VsZi5fZ2VuZXJhdGVTaXplSGVscGVySGVhZGVyKCkpCisgICAgICAgIHNlbGYuc2l6ZV9oZWxwZXJfZ2VuLnNldEJvZHkoc2VsZi5fZ2VuZXJhdGVTaXplSGVscGVyRnVuY3Rpb25zKCkpCisgICAgICAgIHNlbGYuc2l6ZV9oZWxwZXJfZ2VuLmdlbmVyYXRlKCkKKworICAgIGRlZiBnZW5lcmF0ZVNpemVIZWxwZXJDKHNlbGYpOgorICAgICAgICBwcmludCgiR2VuZXJhdGluZyBzdHJ1Y3Qgc2l6ZSBoZWxwZXIgYyIpCisgICAgICAgIHNlbGYuc2l6ZV9oZWxwZXJfY19nZW4uc2V0Q29weXJpZ2h0KHNlbGYuX2dlbmVyYXRlQ29weXJpZ2h0KCkpCisgICAgICAgIHNlbGYuc2l6ZV9oZWxwZXJfY19nZW4uc2V0SGVhZGVyKHNlbGYuX2dlbmVyYXRlU2l6ZUhlbHBlckhlYWRlckMoKSkKKyAgICAgICAgc2VsZi5zaXplX2hlbHBlcl9jX2dlbi5zZXRCb2R5KHNlbGYuX2dlbmVyYXRlU2l6ZUhlbHBlckZ1bmN0aW9uc0MoKSkKKyAgICAgICAgc2VsZi5zaXplX2hlbHBlcl9jX2dlbi5nZW5lcmF0ZSgpCisKKyAgICBkZWYgX2dlbmVyYXRlQ29weXJpZ2h0KHNlbGYpOgorICAgICAgICBjb3B5cmlnaHQgPSBbXQorICAgICAgICBjb3B5cmlnaHQuYXBwZW5kKCcvKiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiAgRE8gTk9UIEVESVQuICovJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJycpOworICAgICAgICBjb3B5cmlnaHQuYXBwZW5kKCcvKicpOworICAgICAgICBjb3B5cmlnaHQuYXBwZW5kKCcgKiBWdWxrYW4nKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnIConKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLicpOworICAgICAgICBjb3B5cmlnaHQuYXBwZW5kKCcgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbi4nKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEdvb2dsZSBJbmMuJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOycpOworICAgICAgICBjb3B5cmlnaHQuYXBwZW5kKCcgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCcpOworICAgICAgICBjb3B5cmlnaHQuYXBwZW5kKCcgKicpOworICAgICAgICBjb3B5cmlnaHQuYXBwZW5kKCcgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUnKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywnKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQnKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4nKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4nKTsKKyAgICAgICAgY29weXJpZ2h0LmFwcGVuZCgnICovJyk7CisgICAgICAgIGNvcHlyaWdodC5hcHBlbmQoJycpOworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGNvcHlyaWdodCkKKworICAgIGRlZiBfZ2VuZXJhdGVDcHBIZWFkZXIoc2VsZik6CisgICAgICAgIGhlYWRlciA9IFtdCisgICAgICAgIGhlYWRlci5hcHBlbmQoIi8vI2luY2x1ZGVzLCAjZGVmaW5lcywgZ2xvYmFscyBhbmQgc3VjaC4uLlxuIikKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiI2luY2x1ZGUgPHN0ZGlvLmg+XG4jaW5jbHVkZSA8JXM+XG4jaW5jbHVkZSA8JXNfZW51bV9zdHJpbmdfaGVscGVyLmg+XG4iICUgKG9zLnBhdGguYmFzZW5hbWUoc2VsZi5oZWFkZXJfZmlsZW5hbWUpLCBzZWxmLmFwaV9wcmVmaXgpKQorICAgICAgICByZXR1cm4gIiIuam9pbihoZWFkZXIpCisKKyAgICBkZWYgX2dlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHNlbGYpOgorICAgICAgICBjbGFzc19kZWYgPSBbXQorICAgICAgICBpZiAndmsnID09IHNlbGYuYXBpOgorICAgICAgICAgICAgY2xhc3NfZGVmLmFwcGVuZChzZWxmLl9nZW5lcmF0ZUR5bmFtaWNQcmludEZ1bmN0aW9ucygpKQorICAgICAgICBmb3IgcyBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdCk6CisgICAgICAgICAgICBjbGFzc19kZWYuYXBwZW5kKCJcbi8vICVzIGNsYXNzIGRlZmluaXRpb24iICUgc2VsZi5nZXRfY2xhc3NfbmFtZShzKSkKKyAgICAgICAgICAgIGNsYXNzX2RlZi5hcHBlbmQoc2VsZi5fZ2VuZXJhdGVDb25zdHJ1Y3RvckRlZmluaXRpb25zKHMpKQorICAgICAgICAgICAgY2xhc3NfZGVmLmFwcGVuZChzZWxmLl9nZW5lcmF0ZURlc3RydWN0b3JEZWZpbml0aW9ucyhzKSkKKyAgICAgICAgICAgIGNsYXNzX2RlZi5hcHBlbmQoc2VsZi5fZ2VuZXJhdGVEaXNwbGF5RGVmaW5pdGlvbnMocykpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oY2xhc3NfZGVmKQorCisgICAgZGVmIF9nZW5lcmF0ZUNvbnN0cnVjdG9yRGVmaW5pdGlvbnMoc2VsZiwgcyk6CisgICAgICAgIGNvbl9kZWZzID0gW10KKyAgICAgICAgY29uX2RlZnMuYXBwZW5kKCIlczo6JXMoKSA6IG1fc3RydWN0KCksIG1faW5kZW50KDApLCBtX2R1bW15X3ByZWZpeCgnXFwwJyksIG1fb3JpZ1N0cnVjdEFkZHIoTlVMTCkge30iICUgKHNlbGYuZ2V0X2NsYXNzX25hbWUocyksIHNlbGYuZ2V0X2NsYXNzX25hbWUocykpKQorICAgICAgICAjIFRPRE8gOiBUaGlzIGlzIGEgc2hhbGxvdyBjb3B5IG9mIHB0cnMKKyAgICAgICAgY29uX2RlZnMuYXBwZW5kKCIlczo6JXMoJXMqIHBJblN0cnVjdCkgOiBtX2luZGVudCgwKSwgbV9kdW1teV9wcmVmaXgoJ1xcMCcpXG57XG4gICAgbV9zdHJ1Y3QgPSAqcEluU3RydWN0O1xuICAgIG1fb3JpZ1N0cnVjdEFkZHIgPSBwSW5TdHJ1Y3Q7XG59IiAlIChzZWxmLmdldF9jbGFzc19uYW1lKHMpLCBzZWxmLmdldF9jbGFzc19uYW1lKHMpLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyAgICAgICAgY29uX2RlZnMuYXBwZW5kKCIlczo6JXMoY29uc3QgJXMqIHBJblN0cnVjdCkgOiBtX2luZGVudCgwKSwgbV9kdW1teV9wcmVmaXgoJ1xcMCcpXG57XG4gICAgbV9zdHJ1Y3QgPSAqcEluU3RydWN0O1xuICAgIG1fb3JpZ1N0cnVjdEFkZHIgPSBwSW5TdHJ1Y3Q7XG59IiAlIChzZWxmLmdldF9jbGFzc19uYW1lKHMpLCBzZWxmLmdldF9jbGFzc19uYW1lKHMpLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihjb25fZGVmcykKKworICAgIGRlZiBfZ2VuZXJhdGVEZXN0cnVjdG9yRGVmaW5pdGlvbnMoc2VsZiwgcyk6CisgICAgICAgIHJldHVybiAiJXM6On4lcygpIHt9IiAlIChzZWxmLmdldF9jbGFzc19uYW1lKHMpLCBzZWxmLmdldF9jbGFzc19uYW1lKHMpKQorCisgICAgZGVmIF9nZW5lcmF0ZUR5bmFtaWNQcmludEZ1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgZHBfZnVuY3MgPSBbXQorICAgICAgICBkcF9mdW5jcy5hcHBlbmQoIlxudm9pZCBkeW5hbWljX2Rpc3BsYXlfZnVsbF90eHQoY29uc3Qgdm9pZCogcFN0cnVjdCwgdWludDMyX3QgaW5kZW50KVxue1xuICAgIC8vIENhc3QgdG8gQVBQX0lORk8gcHRyIGluaXRpYWxseSBqdXN0IHRvIHB1bGwgc1R5cGUgb2ZmIHN0cnVjdCIpCisgICAgICAgIGRwX2Z1bmNzLmFwcGVuZCgiICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZSA9ICgoVmtBcHBsaWNhdGlvbkluZm8qKXBTdHJ1Y3QpLT5zVHlwZTtcbiIpCisgICAgICAgIGRwX2Z1bmNzLmFwcGVuZCgiICAgIHN3aXRjaCAoc1R5cGUpXG4gICAgeyIpCisgICAgICAgIGZvciBlIGluIGVudW1fdHlwZV9kaWN0OgorICAgICAgICAgICAgY2xhc3NfbnVtID0gMAorICAgICAgICAgICAgaWYgIlN0cnVjdHVyZVR5cGUiIGluIGU6CisgICAgICAgICAgICAgICAgZm9yIHYgaW4gc29ydGVkKGVudW1fdHlwZV9kaWN0W2VdKToKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0X25hbWUgPSBnZXRfc3RydWN0X25hbWVfZnJvbV9zdHJ1Y3RfdHlwZSh2KQorICAgICAgICAgICAgICAgICAgICBpZiBzdHJ1Y3RfbmFtZSBub3QgaW4gc2VsZi5zdHJ1Y3RfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NfbmFtZSA9IHNlbGYuZ2V0X2NsYXNzX25hbWUoc3RydWN0X25hbWUpCisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlX25hbWUgPSAic3djJWkiICUgY2xhc3NfbnVtCisgICAgICAgICAgICAgICAgICAgIGRwX2Z1bmNzLmFwcGVuZCgiICAgICAgICBjYXNlICVzOlxuICAgICAgICB7IiAlICh2KSkKKyAgICAgICAgICAgICAgICAgICAgZHBfZnVuY3MuYXBwZW5kKCIgICAgICAgICAgICAlcyAlcygoJXMqKXBTdHJ1Y3QpOyIgJSAoY2xhc3NfbmFtZSwgaW5zdGFuY2VfbmFtZSwgc3RydWN0X25hbWUpKQorICAgICAgICAgICAgICAgICAgICBkcF9mdW5jcy5hcHBlbmQoIiAgICAgICAgICAgICVzLnNldF9pbmRlbnQoaW5kZW50KTsiICUgKGluc3RhbmNlX25hbWUpKQorICAgICAgICAgICAgICAgICAgICBkcF9mdW5jcy5hcHBlbmQoIiAgICAgICAgICAgICVzLmRpc3BsYXlfZnVsbF90eHQoKTsiICUgKGluc3RhbmNlX25hbWUpKQorICAgICAgICAgICAgICAgICAgICBkcF9mdW5jcy5hcHBlbmQoIiAgICAgICAgfSIpCisgICAgICAgICAgICAgICAgICAgIGRwX2Z1bmNzLmFwcGVuZCgiICAgICAgICBicmVhazsiKQorICAgICAgICAgICAgICAgICAgICBjbGFzc19udW0gKz0gMQorICAgICAgICAgICAgICAgIGRwX2Z1bmNzLmFwcGVuZCgiICAgIH0iKQorICAgICAgICBkcF9mdW5jcy5hcHBlbmQoIn1cbiIpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oZHBfZnVuY3MpCisKKyAgICBkZWYgX2dldF9mdW5jX25hbWUoc2VsZiwgc3RydWN0LCBtaWRfc3RyKToKKyAgICAgICAgcmV0dXJuICIlc18lc18lcyIgJSAoc2VsZi5hcGlfcHJlZml4LCBtaWRfc3RyLCBzdHJ1Y3QubG93ZXIoKS5zdHJpcCgiXyIpKQorCisgICAgZGVmIF9nZXRfc2hfZnVuY19uYW1lKHNlbGYsIHN0cnVjdCk6CisgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZnVuY19uYW1lKHN0cnVjdCwgJ3ByaW50JykKKworICAgIGRlZiBfZ2V0X3ZoX2Z1bmNfbmFtZShzZWxmLCBzdHJ1Y3QpOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2Z1bmNfbmFtZShzdHJ1Y3QsICd2YWxpZGF0ZScpCisKKyAgICBkZWYgX2dldF9zaXplX2hlbHBlcl9mdW5jX25hbWUoc2VsZiwgc3RydWN0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9mdW5jX25hbWUoc3RydWN0LCAnc2l6ZScpCisKKyAgICAjIFJldHVybiBlbGVtZW50cyB0byBjcmVhdGUgZm9ybWF0dGVkIHN0cmluZyBmb3IgZ2l2ZW4gc3RydWN0IG1lbWJlcgorICAgIGRlZiBfZ2V0X3N0cnVjdF9wcmludF9mb3JtYXR0ZWQoc2VsZiwgc3RydWN0X21lbWJlciwgcHJlX3Zhcl9uYW1lPSJwcmVmaXgiLCBwb3N0Zml4ID0gIlxcbiIsIHN0cnVjdF92YXJfbmFtZT0icFN0cnVjdCIsIHN0cnVjdF9wdHI9VHJ1ZSwgcHJpbnRfYXJyYXk9RmFsc2UpOgorICAgICAgICBzdHJ1Y3Rfb3AgPSAiLT4iCisgICAgICAgIGlmIG5vdCBzdHJ1Y3RfcHRyOgorICAgICAgICAgICAgc3RydWN0X29wID0gIi4iCisgICAgICAgIG1lbWJlcl9uYW1lID0gc3RydWN0X21lbWJlclsnbmFtZSddCisgICAgICAgIHByaW50X3R5cGUgPSAicCIKKyAgICAgICAgY2FzdF90eXBlID0gIiIKKyAgICAgICAgbWVtYmVyX3Bvc3QgPSAiIgorICAgICAgICBhcnJheV9pbmRleCA9ICIiCisgICAgICAgIG1lbWJlcl9wcmludF9wb3N0ID0gIiIKKyAgICAgICAgcHJpbnRfZGVsaW1pdGVyID0gIiUiCisgICAgICAgIGlmIHN0cnVjdF9tZW1iZXJbJ2FycmF5J10gYW5kICdjaGFyJyBpbiBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ10ubG93ZXIoKTogIyBqdXN0IHByaW50IGNoYXIgYXJyYXkgYXMgc3RyaW5nCisgICAgICAgICAgICBpZiBtZW1iZXJfbmFtZS5zdGFydHN3aXRoKCdwcCcpOiAjIFRPRE8gOiBPbmx5IHByaW50aW5nIGZpcnN0IGVsZW1lbnQgb2YgZHluYW0gYXJyYXkgb2YgY2hhciogZm9yIG5vdworICAgICAgICAgICAgICAgIG1lbWJlcl9wb3N0ID0gIlswXSIKKyAgICAgICAgICAgIHByaW50X3R5cGUgPSAicyIKKyAgICAgICAgICAgIHByaW50X2FycmF5ID0gRmFsc2UKKyAgICAgICAgZWxpZiBzdHJ1Y3RfbWVtYmVyWydhcnJheSddIGFuZCBub3QgcHJpbnRfYXJyYXk6CisgICAgICAgICAgICAjIEp1c3QgcHJpbnQgYmFzZSBhZGRyZXNzIG9mIGFycmF5IHdoZW4gbm90IGZ1bGwgcHJpbnRfYXJyYXkKKyAgICAgICAgICAgIHByaW50X2RlbGltaXRlciA9ICIweCUiCisgICAgICAgICAgICBjYXN0X3R5cGUgPSAiKHZvaWQqKSIKKyAgICAgICAgZWxpZiBpc190eXBlKHN0cnVjdF9tZW1iZXJbJ3R5cGUnXSwgJ2VudW0nKToKKyAgICAgICAgICAgIGNhc3RfdHlwZSA9ICJzdHJpbmdfJXMiICUgc3RydWN0X21lbWJlclsndHlwZSddCisgICAgICAgICAgICBpZiBzdHJ1Y3RfbWVtYmVyWydwdHInXToKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfdmFyX25hbWUgPSAiKiIgKyBzdHJ1Y3RfdmFyX25hbWUKKyAgICAgICAgICAgICAgICBwcmludF9kZWxpbWl0ZXIgPSAiMHglIgorICAgICAgICAgICAgcHJpbnRfdHlwZSA9ICJzIgorICAgICAgICBlbGlmIGlzX3R5cGUoc3RydWN0X21lbWJlclsndHlwZSddLCAnc3RydWN0Jyk6ICMgcHJpbnQgc3RydWN0IGFkZHJlc3MgZm9yIG5vdworICAgICAgICAgICAgcHJpbnRfZGVsaW1pdGVyID0gIjB4JSIKKyAgICAgICAgICAgIGNhc3RfdHlwZSA9ICIodm9pZCopIgorICAgICAgICAgICAgaWYgbm90IHN0cnVjdF9tZW1iZXJbJ3B0ciddOgorICAgICAgICAgICAgICAgIGNhc3RfdHlwZSA9ICIodm9pZCopJiIKKyAgICAgICAgZWxpZiAnYm9vbCcgaW4gc3RydWN0X21lbWJlclsndHlwZSddLmxvd2VyKCk6CisgICAgICAgICAgICBwcmludF90eXBlID0gInMiCisgICAgICAgICAgICBtZW1iZXJfcG9zdCA9ICcgPyAiVFJVRSIgOiAiRkFMU0UiJworICAgICAgICBlbGlmICdmbG9hdCcgaW4gc3RydWN0X21lbWJlclsndHlwZSddOgorICAgICAgICAgICAgcHJpbnRfdHlwZSA9ICJmIgorICAgICAgICBlbGlmICd1aW50NjQnIGluIHN0cnVjdF9tZW1iZXJbJ3R5cGUnXSBvciAnZ3B1c2l6ZScgaW4gc3RydWN0X21lbWJlclsndHlwZSddLmxvd2VyKCk6CisgICAgICAgICAgICBwcmludF90eXBlID0gJyIgUFJJZDY0ICInCisgICAgICAgIGVsaWYgJ3VpbnQ4JyBpbiBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ106CisgICAgICAgICAgICBwcmludF90eXBlID0gImh1IgorICAgICAgICBlbGlmICdzaXplJyBpbiBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ10ubG93ZXIoKToKKyAgICAgICAgICAgIHByaW50X3R5cGUgPSAnIiBQUklOVEZfU0laRV9UX1NQRUNJRklFUiAiJworICAgICAgICAgICAgcHJpbnRfZGVsaW1pdGVyID0gIiIKKyAgICAgICAgZWxpZiBUcnVlIGluIFt1aV9zdHIubG93ZXIoKSBpbiBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ10ubG93ZXIoKSBmb3IgdWlfc3RyIGluIFsndWludCcsICdmbGFncycsICdzYW1wbGVtYXNrJ11dOgorICAgICAgICAgICAgcHJpbnRfdHlwZSA9ICJ1IgorICAgICAgICBlbGlmICdpbnQnIGluIHN0cnVjdF9tZW1iZXJbJ3R5cGUnXToKKyAgICAgICAgICAgIHByaW50X3R5cGUgPSAiaSIKKyAgICAgICAgZWxpZiBzdHJ1Y3RfbWVtYmVyWydwdHInXToKKyAgICAgICAgICAgIHByaW50X2RlbGltaXRlciA9ICIweCUiCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjcHJpbnQoIlVuaGFuZGxlZCBzdHJ1Y3QgdHlwZTogJXMiICUgc3RydWN0X21lbWJlclsndHlwZSddKQorICAgICAgICAgICAgcHJpbnRfZGVsaW1pdGVyID0gIjB4JSIKKyAgICAgICAgICAgIGNhc3RfdHlwZSA9ICIodm9pZCopIgorICAgICAgICBpZiBwcmludF9hcnJheSBhbmQgc3RydWN0X21lbWJlclsnYXJyYXknXToKKyAgICAgICAgICAgIG1lbWJlcl9wcmludF9wb3N0ID0gIlsldV0iCisgICAgICAgICAgICBhcnJheV9pbmRleCA9ICIgaSwiCisgICAgICAgICAgICBtZW1iZXJfcG9zdCA9ICJbaV0iCisgICAgICAgIHByaW50X291dCA9ICIlJXMlcyVzID0gJXMlcyVzIiAlIChtZW1iZXJfbmFtZSwgbWVtYmVyX3ByaW50X3Bvc3QsIHByaW50X2RlbGltaXRlciwgcHJpbnRfdHlwZSwgcG9zdGZpeCkgIyBzZWN0aW9uIG9mIHByaW50IHRoYXQgZ29lcyBpbnNpZGUgb2YgcXVvdGVzCisgICAgICAgIHByaW50X2FyZyA9ICIsICVzLCVzICVzKCVzJXMlcyklcyIgJSAocHJlX3Zhcl9uYW1lLCBhcnJheV9pbmRleCwgY2FzdF90eXBlLCBzdHJ1Y3RfdmFyX25hbWUsIHN0cnVjdF9vcCwgbWVtYmVyX25hbWUsIG1lbWJlcl9wb3N0KSAjIHNlY3Rpb24gb2YgcHJpbnQgcGFzc2VkIHRvIHBvcnRpb24gaW4gcXVvdGVzCisgICAgICAgIGlmIHNlbGYubm9fYWRkciBhbmQgInAiID09IHByaW50X3R5cGU6CisgICAgICAgICAgICBwcmludF9vdXQgPSAiJSVzJXMlcyA9IGFkZHJcXG4iICUgKG1lbWJlcl9uYW1lLCBtZW1iZXJfcHJpbnRfcG9zdCkgIyBzZWN0aW9uIG9mIHByaW50IHRoYXQgZ29lcyBpbnNpZGUgb2YgcXVvdGVzCisgICAgICAgICAgICBwcmludF9hcmcgPSAiLCAlcyIgJSAocHJlX3Zhcl9uYW1lKQorICAgICAgICByZXR1cm4gKHByaW50X291dCwgcHJpbnRfYXJnKQorCisgICAgZGVmIF9nZW5lcmF0ZVN0cmluZ0hlbHBlckZ1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgc2hfZnVuY3MgPSBbXQorICAgICAgICAjIFdlIGRvIHR3byBwYXNzZXMsIGZpcnN0IHBhc3MganVzdCBnZW5lcmF0ZXMgcHJvdG90eXBlcyBmb3IgYWxsIHRoZSBmdW5jdHNpb25zCisgICAgICAgIGZvciBzIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0KToKKyAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnY2hhciogJXMoY29uc3QgJXMqIHBTdHJ1Y3QsIGNvbnN0IGNoYXIqIHByZWZpeCk7JyAlIChzZWxmLl9nZXRfc2hfZnVuY19uYW1lKHMpLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcnKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyNpZiBkZWZpbmVkKF9XSU4zMiknKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJy8vIE1pY3Jvc29mdCBkaWQgbm90IGltcGxlbWVudCBDOTkgaW4gVmlzdWFsIFN0dWRpbzsgYnV0IHN0YXJ0ZWQgYWRkaW5nIGl0IHdpdGgnKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJy8vIFZTMjAxMy4gIEhvd2V2ZXIsIFZTMjAxMyBzdGlsbCBkaWQgbm90IGhhdmUgc25wcmludGYoKS4gIFRoZSBmb2xsb3dpbmcgaXMgYScpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnLy8gd29yay1hcm91bmQuJykKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZicpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnI2VuZGlmIC8vIF9XSU4zMlxuJykKKyAgICAgICAgZm9yIHMgaW4gc29ydGVkKHNlbGYuc3RydWN0X2RpY3QpOgorICAgICAgICAgICAgcF9vdXQgPSAiIgorICAgICAgICAgICAgcF9hcmdzID0gIiIKKyAgICAgICAgICAgIHN0cF9saXN0ID0gW10gIyBzdHAgPT0gInN0cnVjdCB0byBwcmludCIgYSBsaXN0IG9mIHN0cnVjdHMgZm9yIHRoaXMgQVBJIGNhbGwgdGhhdCBzaG91bGQgYmUgcHJpbnRlZCBhcyBzdHJ1Y3RzCisgICAgICAgICAgICAjIFRoaXMgcHJlLXBhc3MgZmxhZ3MgZW1iZWRkZWQgc3RydWN0cyBhbmQgcE5leHQKKyAgICAgICAgICAgIGZvciBtIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0W3NdKToKKyAgICAgICAgICAgICAgICBpZiAncE5leHQnID09IHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSBvciBpc190eXBlKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgJ3N0cnVjdCcpOgorICAgICAgICAgICAgICAgICAgICBzdHBfbGlzdC5hcHBlbmQoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXSkKKyAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnY2hhciogJXMoY29uc3QgJXMqIHBTdHJ1Y3QsIGNvbnN0IGNoYXIqIHByZWZpeClcbntcbiAgICBjaGFyKiBzdHI7JyAlIChzZWxmLl9nZXRfc2hfZnVuY19uYW1lKHMpLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgIHNpemVfdCBsZW47IikKKyAgICAgICAgICAgIG51bV9zdHBzID0gbGVuKHN0cF9saXN0KTsKKyAgICAgICAgICAgIHRvdGFsX3N0cmxlbl9zdHIgPSAnJworICAgICAgICAgICAgaWYgMCAhPSBudW1fc3RwczoKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICBjaGFyKiB0bXBTdHI7IikKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBjaGFyKiBleHRyYV9pbmRlbnQgPSAoY2hhciopbWFsbG9jKHN0cmxlbihwcmVmaXgpICsgMyk7JykKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzdHJjcHkoZXh0cmFfaW5kZW50LCAiICAiKTsnKQorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHN0cm5jYXQoZXh0cmFfaW5kZW50LCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKTsnKQorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIGNoYXIqIHN0cF9zdHJzWyVpXTsnICUgbnVtX3N0cHMpCisgICAgICAgICAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKG51bV9zdHBzKToKKyAgICAgICAgICAgICAgICAgICAgIyBJZiBpdCdzIGFuIGFycmF5LCBwcmludCBhbGwgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICMgSWYgaXQncyBhIHB0ciwgcHJpbnQgdGhpbmcgaXQncyBwb2ludGluZyB0bworICAgICAgICAgICAgICAgICAgICAjIE5vbi1wdHIgc3RydWN0IGNhc2UuIFByaW50IHRoZSBzdHJ1Y3QgdXNpbmcgaXRzIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0X2RlcmVmID0gJyYnCisgICAgICAgICAgICAgICAgICAgIGlmIDEgPCBzdHBfbGlzdFtpbmRleF1bJ2Z1bGxfdHlwZSddLmNvdW50KCcqJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfZGVyZWYgPSAnJworICAgICAgICAgICAgICAgICAgICBpZiAoc3RwX2xpc3RbaW5kZXhdWydwdHInXSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBpZiAocFN0cnVjdC0+JXMpIHsnICUgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAncE5leHQnID09IHN0cF9saXN0W2luZGV4XVsnbmFtZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICB0bXBTdHIgPSBkeW5hbWljX2Rpc3BsYXkoKHZvaWQqKXBTdHJ1Y3QtPnBOZXh0LCBwcmVmaXgpOycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIGxlbiA9IDI1NitzdHJsZW4odG1wU3RyKTsnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICBzdHBfc3Ryc1slaV0gPSAoY2hhciopbWFsbG9jKGxlbik7JyAlIGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubm9fYWRkcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNucHJpbnRmKHN0cF9zdHJzWyVpXSwgbGVuLCAiICUlc3BOZXh0IChhZGRyKVxcbiUlcyIsIHByZWZpeCwgdG1wU3RyKTsnICUgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNucHJpbnRmKHN0cF9zdHJzWyVpXSwgbGVuLCAiICUlc3BOZXh0ICgweCUlcClcXG4lJXMiLCBwcmVmaXgsICh2b2lkKilwU3RydWN0LT5wTmV4dCwgdG1wU3RyKTsnICUgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIGZyZWUodG1wU3RyKTsnKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSBpbiBbJ3BJbWFnZVZpZXdzJywgJ3BCdWZmZXJWaWV3cyddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRPRE8gOiBUaGlzIGlzIGEgcXVpY2sgaGFjayB0byBoYW5kbGUgdGhlc2UgYXJyYXlzIG9mIHB0cnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHRtcFN0ciA9ICVzKCZwU3RydWN0LT4lc1swXSwgZXh0cmFfaW5kZW50KTsnICUgKHNlbGYuX2dldF9zaF9mdW5jX25hbWUoc3RwX2xpc3RbaW5kZXhdWyd0eXBlJ10pLCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHRtcFN0ciA9ICVzKHBTdHJ1Y3QtPiVzLCBleHRyYV9pbmRlbnQpOycgJSAoc2VsZi5fZ2V0X3NoX2Z1bmNfbmFtZShzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXSksIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgbGVuID0gMjU2K3N0cmxlbih0bXBTdHIpK3N0cmxlbihwcmVmaXgpOycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHN0cF9zdHJzWyVpXSA9IChjaGFyKiltYWxsb2MobGVuKTsnICUgKGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm5vX2FkZHI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICBzbnByaW50ZihzdHBfc3Ryc1slaV0sIGxlbiwgIiAlJXMlcyAoYWRkcilcXG4lJXMiLCBwcmVmaXgsIHRtcFN0cik7JyAlIChpbmRleCwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICBzbnByaW50ZihzdHBfc3Ryc1slaV0sIGxlbiwgIiAlJXMlcyAoMHglJXApXFxuJSVzIiwgcHJlZml4LCAodm9pZCopcFN0cnVjdC0+JXMsIHRtcFN0cik7JyAlIChpbmRleCwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10sIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIH0nKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgZWxzZVxuICAgICAgICBzdHBfc3Ryc1slaV0gPSBcIlwiOyIgJSAoaW5kZXgpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHN0cF9saXN0W2luZGV4XVsnYXJyYXknXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHRtcFN0ciA9ICVzKCZwU3RydWN0LT4lc1swXSwgZXh0cmFfaW5kZW50KTsnICUgKHNlbGYuX2dldF9zaF9mdW5jX25hbWUoc3RwX2xpc3RbaW5kZXhdWyd0eXBlJ10pLCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBsZW4gPSAyNTYrc3RybGVuKHRtcFN0cik7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHN0cF9zdHJzWyVpXSA9IChjaGFyKiltYWxsb2MobGVuKTsnICUgKGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubm9fYWRkcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzbnByaW50ZihzdHBfc3Ryc1slaV0sIGxlbiwgIiAlJXMlc1swXSAoYWRkcilcXG4lJXMiLCBwcmVmaXgsIHRtcFN0cik7JyAlIChpbmRleCwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzbnByaW50ZihzdHBfc3Ryc1slaV0sIGxlbiwgIiAlJXMlc1swXSAoMHglJXApXFxuJSVzIiwgcHJlZml4LCAodm9pZCopJnBTdHJ1Y3QtPiVzWzBdLCB0bXBTdHIpOycgJSAoaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddLCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICB0bXBTdHIgPSAlcygmcFN0cnVjdC0+JXMsIGV4dHJhX2luZGVudCk7JyAlIChzZWxmLl9nZXRfc2hfZnVuY19uYW1lKHN0cF9saXN0W2luZGV4XVsndHlwZSddKSwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgbGVuID0gMjU2K3N0cmxlbih0bXBTdHIpOycpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzdHBfc3Ryc1slaV0gPSAoY2hhciopbWFsbG9jKGxlbik7JyAlIChpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm5vX2FkZHI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc25wcmludGYoc3RwX3N0cnNbJWldLCBsZW4sICIgJSVzJXMgKGFkZHIpXFxuJSVzIiwgcHJlZml4LCB0bXBTdHIpOycgJSAoaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc25wcmludGYoc3RwX3N0cnNbJWldLCBsZW4sICIgJSVzJXMgKDB4JSVwKVxcbiUlcyIsIHByZWZpeCwgKHZvaWQqKSZwU3RydWN0LT4lcywgdG1wU3RyKTsnICUgKGluZGV4LCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICB0b3RhbF9zdHJsZW5fc3RyICs9ICdzdHJsZW4oc3RwX3N0cnNbJWldKSArICcgJSBpbmRleAorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgbGVuID0gJXNzaXplb2YoY2hhcikqMTAyNDsnICUgKHRvdGFsX3N0cmxlbl9zdHIpKQorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc3RyID0gKGNoYXIqKW1hbGxvYyhsZW4pOycpCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzbnByaW50ZihzdHIsIGxlbiwgIicpCisgICAgICAgICAgICBmb3IgbSBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdFtzXSk6CisgICAgICAgICAgICAgICAgKHBfb3V0MSwgcF9hcmdzMSkgPSBzZWxmLl9nZXRfc3RydWN0X3ByaW50X2Zvcm1hdHRlZChzZWxmLnN0cnVjdF9kaWN0W3NdW21dKQorICAgICAgICAgICAgICAgIHBfb3V0ICs9IHBfb3V0MQorICAgICAgICAgICAgICAgIHBfYXJncyArPSBwX2FyZ3MxCisgICAgICAgICAgICBwX291dCArPSAnIicKKyAgICAgICAgICAgIHBfYXJncyArPSAiKTsiCisgICAgICAgICAgICBzaF9mdW5jc1stMV0gPSAnJXMlcyVzJyAlIChzaF9mdW5jc1stMV0sIHBfb3V0LCBwX2FyZ3MpCisgICAgICAgICAgICBpZiAwICE9IG51bV9zdHBzOgorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIGZvciAoaW50MzJfdCBzdHBfaW5kZXggPSAlaTsgc3RwX2luZGV4ID49IDA7IHN0cF9pbmRleC0tKSB7JyAlIChudW1fc3Rwcy0xKSkKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgaWYgKDAgPCBzdHJsZW4oc3RwX3N0cnNbc3RwX2luZGV4XSkpIHsnKQorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICAgICAgc3RybmNhdChzdHIsIHN0cF9zdHJzW3N0cF9pbmRleF0sIHN0cmxlbihzdHBfc3Ryc1tzdHBfaW5kZXhdKSk7JykKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgICAgIGZyZWUoc3RwX3N0cnNbc3RwX2luZGV4XSk7JykKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgfScpCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgZnJlZShleHRyYV9pbmRlbnQpOycpCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICByZXR1cm4gc3RyO1xufSIpCisgICAgICAgICMgQWRkIGZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IHByaW50IG91dCB1bmtub3duIHN0cnVjdAorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoImNoYXIqIGR5bmFtaWNfZGlzcGxheShjb25zdCB2b2lkKiBwU3RydWN0LCBjb25zdCBjaGFyKiBwcmVmaXgpXG57IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgLy8gQ2FzdCB0byBBUFBfSU5GTyBwdHIgaW5pdGlhbGx5IGp1c3QgdG8gcHVsbCBzVHlwZSBvZmYgc3RydWN0IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgaWYgKHBTdHJ1Y3QgPT0gTlVMTCkgeyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgICAgICByZXR1cm4gTlVMTDsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICB9IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgVmtTdHJ1Y3R1cmVUeXBlIHNUeXBlID0gKChWa0FwcGxpY2F0aW9uSW5mbyopcFN0cnVjdCktPnNUeXBlOyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIGNoYXIgaW5kZW50WzEwMF07XG4gICAgc3RyY3B5KGluZGVudCwgIiAgICAiKTtcbiAgICBzdHJjYXQoaW5kZW50LCBwcmVmaXgpOycpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgIHN3aXRjaCAoc1R5cGUpXG4gICAgeyIpCisgICAgICAgIGZvciBlIGluIGVudW1fdHlwZV9kaWN0OgorICAgICAgICAgICAgaWYgIlN0cnVjdHVyZVR5cGUiIGluIGU6CisgICAgICAgICAgICAgICAgZm9yIHYgaW4gc29ydGVkKGVudW1fdHlwZV9kaWN0W2VdKToKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0X25hbWUgPSBnZXRfc3RydWN0X25hbWVfZnJvbV9zdHJ1Y3RfdHlwZSh2KQorICAgICAgICAgICAgICAgICAgICBpZiBzdHJ1Y3RfbmFtZSBub3QgaW4gc2VsZi5zdHJ1Y3RfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHByaW50X2Z1bmNfbmFtZSA9IHNlbGYuX2dldF9zaF9mdW5jX25hbWUoc3RydWN0X25hbWUpCisgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICBjYXNlICVzOlxuICAgICAgICB7JyAlICh2KSkKKyAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgICAgICByZXR1cm4gJXMoKCVzKilwU3RydWN0LCBpbmRlbnQpOycgJSAocHJpbnRfZnVuY19uYW1lLCBzdHJ1Y3RfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIGJyZWFrOycpCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgICAgIGRlZmF1bHQ6IikKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICAgICAgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICB9IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCJ9IikKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihzaF9mdW5jcykKKworICAgIGRlZiBfZ2VuZXJhdGVTdHJpbmdIZWxwZXJGdW5jdGlvbnNDcHAoc2VsZik6CisgICAgICAgICMgZGVjbGFyZSBzdHIgJiB0bXAgc3RyCisgICAgICAgICMgZGVjbGFyZSBhcnJheSBvZiBzdHJpbmdzdHJlYW1zIGZvciBldmVyeSBzdHJ1Y3QgcHRyIGluIGN1cnJlbnQgc3RydWN0CisgICAgICAgICMgZGVjbGFyZSBhcnJheSBvZiBzdHJpbmdzdHJlYW1zIGZvciBldmVyeSBub24tc3RyaW5nIGVsZW1lbnQgaW4gY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgIyBGb3IgZXZlcnkgc3RydWN0IHB0ciwgaWYgbm9uLU51bGwsIHRoZW4gc2V0IGl0cyBzdHJpbmcsIGVsc2Ugc2V0IHRvIE5VTEwgc3RyCisgICAgICAgICMgRm9yIGV2ZXJ5IG5vbi1zdHJpbmcgZWxlbWVudCwgc2V0IGl0cyBzdHJpbmcgc3RyZWFtCisgICAgICAgICMgY3JlYXRlIGFuZCByZXR1cm4gZmluYWwgc3RyaW5nCisgICAgICAgIHNoX2Z1bmNzID0gW10KKyAgICAgICAgIyBGaXJzdCBnZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBldmVyeSBzdHJ1Y3QKKyAgICAgICAgIyBYWFggLSBSRU1PVkUgdGhpcyBjb21tZW50CisgICAgICAgIGxpbmVpbmZvID0gc291cmNlbGluZWluZm8oKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICBmb3IgcyBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdCk6CisgICAgICAgICAgICAjIFdyYXAgdGhpcyBpbiBwbGF0Zm9ybSBjaGVjayBzaW5jZSBpdCBtYXkgY29udGFpbiB1bmRlZmluZWQgc3RydWN0cyBvciBmdW5jdGlvbnMKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0cnVjdF9kaWN0W3NdOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBhZGRfcGxhdGZvcm1fd3JhcHBlcl9lbnRyeShzaF9mdW5jcywgdHlwZWRlZl9md2RfZGljdFtzXSkKKyAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnc3RkOjpzdHJpbmcgJXMoY29uc3QgJXMqIHBTdHJ1Y3QsIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCk7JyAlIChzZWxmLl9nZXRfc2hfZnVuY19uYW1lKHMpLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyAgICAgICAgICAgIGFkZF9wbGF0Zm9ybV93cmFwcGVyX2V4aXQoc2hfZnVuY3MsIHR5cGVkZWZfZndkX2RpY3Rbc10pCisKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCdcbicpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgIGZvciBzIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0KToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0cnVjdF9kaWN0W3NdOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBudW1fbm9uX2VudW1fZWxlbXMgPSBbKGlzX3R5cGUoc2VsZi5zdHJ1Y3RfZGljdFtzXVtlbGVtXVsndHlwZSddLCAnZW51bScpIGFuZCBub3Qgc2VsZi5zdHJ1Y3RfZGljdFtzXVtlbGVtXVsncHRyJ10pIGZvciBlbGVtIGluIHNlbGYuc3RydWN0X2RpY3Rbc11dLmNvdW50KEZhbHNlKQorICAgICAgICAgICAgc3RwX2xpc3QgPSBbXSAjIHN0cCA9PSAic3RydWN0IHRvIHByaW50IiBhIGxpc3Qgb2Ygc3RydWN0cyBmb3IgdGhpcyBBUEkgY2FsbCB0aGF0IHNob3VsZCBiZSBwcmludGVkIGFzIHN0cnVjdHMKKyAgICAgICAgICAgICMgVGhpcyBwcmUtcGFzcyBmbGFncyBlbWJlZGRlZCBzdHJ1Y3RzIGFuZCBwTmV4dAorICAgICAgICAgICAgZm9yIG0gaW4gc29ydGVkKHNlbGYuc3RydWN0X2RpY3Rbc10pOgorICAgICAgICAgICAgICAgIGlmICdwTmV4dCcgPT0gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddIG9yIGlzX3R5cGUoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLCAnc3RydWN0Jykgb3Igc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXknXToKKyAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBUaGlzIGlzIGEgdG1wIHdvcmthcm91bmQKKyAgICAgICAgICAgICAgICAgICAgaWYgJ3BwQWN0aXZlTGF5ZXJOYW1lcycgbm90IGluIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cF9saXN0LmFwcGVuZChzZWxmLnN0cnVjdF9kaWN0W3NdW21dKQorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKworICAgICAgICAgICAgIyBXcmFwIHRoaXMgaW4gcGxhdGZvcm0gY2hlY2sgc2luY2UgaXQgbWF5IGNvbnRhaW4gdW5kZWZpbmVkIHN0cnVjdHMgb3IgZnVuY3Rpb25zCisgICAgICAgICAgICBhZGRfcGxhdGZvcm1fd3JhcHBlcl9lbnRyeShzaF9mdW5jcywgdHlwZWRlZl9md2RfZGljdFtzXSkKKworICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCdzdGQ6OnN0cmluZyAlcyhjb25zdCAlcyogcFN0cnVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4KVxueycgJSAoc2VsZi5fZ2V0X3NoX2Z1bmNfbmFtZShzKSwgdHlwZWRlZl9md2RfZGljdFtzXSkpCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgaW5kZW50ID0gJyAgICAnCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzdXNpbmcgbmFtZXNwYWNlIFN0cmVhbUNvbnRyb2w7JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3VzaW5nIG5hbWVzcGFjZSBzdGQ7JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N0cmluZyBmaW5hbF9zdHI7JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N0cmluZyB0bXBfc3RyOycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJpbmcgZXh0cmFfaW5kZW50ID0gIiAgIiArIHByZWZpeDsnICUgKGluZGVudCkpCisgICAgICAgICAgICBpZiAoMCAhPSBudW1fbm9uX2VudW1fZWxlbXMpOgorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJpbmdzdHJlYW0gc3NbJXVdOycgJSAoaW5kZW50LCBudW1fbm9uX2VudW1fZWxlbXMpKQorICAgICAgICAgICAgbnVtX3N0cHMgPSBsZW4oc3RwX2xpc3QpCisgICAgICAgICAgICAjIEZpcnN0IGdlbmVyYXRlIGNvZGUgZm9yIGFueSBlbWJlZGRlZCBzdHJ1Y3RzIG9yIGFycmF5cworICAgICAgICAgICAgaWYgMCA8IG51bV9zdHBzOgorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJpbmcgc3RwX3N0cnNbJXVdOycgJSAoaW5kZW50LCBudW1fc3RwcykpCisgICAgICAgICAgICAgICAgaWR4X3NzX2RlY2wgPSBGYWxzZSAjIE1ha2Ugc3VyZSB0byBvbmx5IGRlY2wgdGhpcyBvbmNlCisgICAgICAgICAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKG51bV9zdHBzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cF9saXN0W2luZGV4XVsnYXJyYXknXSBhbmQgJ2NoYXInID09IHN0cF9saXN0W2luZGV4XVsndHlwZSddKSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAobm90IHN0cF9saXN0W2luZGV4XVsncHRyJ10gYW5kIHN0cF9saXN0W2luZGV4XVsndHlwZSddIGluIHNlbGYub3BhcXVlX3R5cGVzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHN0cF9saXN0W2luZGV4XVsnYXJyYXknXSBhbmQgbm90ICdjaGFyJyA9PSBzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdHBfbGlzdFtpbmRleF1bJ2R5bl9hcnJheSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfY291bnQgPSAncFN0cnVjdC0+JXMnICUgKHN0cF9saXN0W2luZGV4XVsnYXJyYXlfc2l6ZSddKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2NvdW50ID0gJyVzJyAlIChzdHBfbGlzdFtpbmRleF1bJ2FycmF5X3NpemUnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RwX3N0cnNbJXVdID0gIiI7JyAlIChpbmRlbnQsIGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpZHhfc3NfZGVjbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RyaW5nc3RyZWFtIGluZGV4X3NzOycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhfc3NfZGVjbCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSA9PSAncFF1ZXVlRmFtaWx5SW5kaWNlcycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZGVmX2Z3ZF9kaWN0W3NdID09ICdWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFInKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc2lmIChwU3RydWN0LT5pbWFnZVNoYXJpbmdNb2RlID09IFZLX1NIQVJJTkdfTU9ERV9DT05DVVJSRU5UKSB7JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNpZiAocFN0cnVjdC0+c2hhcmluZ01vZGUgPT0gVktfU0hBUklOR19NT0RFX0NPTkNVUlJFTlQpIHsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICcgICAgJworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cF9saXN0W2luZGV4XVsnbmFtZSddID09ICdwSW1hZ2VJbmZvJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc2lmICgocFN0cnVjdC0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIpICAgICAgICAgICAgICAgIHx8JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMgICAgKHBTdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSKSB8fCcgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzICAgIChwU3RydWN0LT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRSkgICAgICAgICAgfHwnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcyAgICAocFN0cnVjdC0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0UpKSAgICAgICAgICAgeycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIChzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSA9PSAncEJ1ZmZlckluZm8nKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzaWYgKChwU3RydWN0LT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVIpICAgICAgICAgfHwnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcyAgICAocFN0cnVjdC0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSKSAgICAgICAgIHx8JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMgICAgKHBTdHJ1Y3QtPmRlc2NyaXB0b3JUeXBlID09IFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUl9EWU5BTUlDKSB8fCcgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzICAgIChwU3RydWN0LT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQykpICB7JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAnICAgICcKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgKHN0cF9saXN0W2luZGV4XVsnbmFtZSddID09ICdwVGV4ZWxCdWZmZXJWaWV3Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc2lmICgocFN0cnVjdC0+ZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSKSB8fCcgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzICAgIChwU3RydWN0LT5kZXNjcmlwdG9yVHlwZSA9PSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9URVhFTF9CVUZGRVIpKSAgeycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdHBfbGlzdFtpbmRleF1bJ2R5bl9hcnJheSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNpZiAocFN0cnVjdC0+JXMpIHsnICUgKGluZGVudCwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAnICAgICcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgJXM7IGkrKykgeycgJSAoaW5kZW50LCBhcnJheV9jb3VudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzaW5kZXhfc3Muc3RyKCIiKTsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzaW5kZXhfc3MgPDwgaTsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc190eXBlKHN0cF9saXN0W2luZGV4XVsndHlwZSddLCAnZW51bScpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ZhbHVlX3ByaW50ID0gJ3N0cmluZ18lcyglc3BTdHJ1Y3QtPiVzKScgJSAoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLCBkZXJlZiwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzc1sldV0gPDwgc3RyaW5nXyVzKHBTdHJ1Y3QtPiVzW2ldKTsnICUgKGluZGVudCwgaW5kZXgsIHN0cF9saXN0W2luZGV4XVsndHlwZSddLCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N0cF9zdHJzWyV1XSArPSAiICIgKyBwcmVmaXggKyAiJXNbIiArIGluZGV4X3NzLnN0cigpICsgIl0gPSAiICsgc3NbJXVdLnN0cigpICsgIlxcbiI7JyAlIChpbmRlbnQsIGluZGV4LCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSwgaW5kZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBpc190eXBlKHN0cF9saXN0W2luZGV4XVsndHlwZSddLCAnc3RydWN0Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RwX2xpc3RbaW5kZXhdWyd0eXBlJ10gaW4gc2VsZi5vcGFxdWVfdHlwZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXN0bXBfc3RyID0gJXMoJnBTdHJ1Y3QtPiVzW2ldLCBleHRyYV9pbmRlbnQpOycgJSAoaW5kZW50LCBzZWxmLl9nZXRfc2hfZnVuY19uYW1lKHN0cF9saXN0W2luZGV4XVsndHlwZSddKSwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RwX3N0cnNbJXVdICs9ICIgIiArIHByZWZpeCArICIlc1siICsgaW5kZXhfc3Muc3RyKCkgKyAiXTpcXG4iICsgdG1wX3N0cjsnICUgKGluZGVudCwgaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3NbJXVdIDw8ICIweCIgPDwgaGV4IDw8IG5vdXBwZXJjYXNlIDw8IEhhbmRsZUNhc3QocFN0cnVjdC0+JXNbaV0pIDw8IGRlYzsnICUgKGluZGVudCwgaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N0cF9zdHJzWyV1XSArPSAiICIgKyBwcmVmaXggKyAiJXNbIiArIGluZGV4X3NzLnN0cigpICsgIl0gPSAiICsgc3NbJXVdLnN0cigpICsgIlxcbiI7JyAlIChpbmRlbnQsIGluZGV4LCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSwgaW5kZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN0cF9saXN0W2luZGV4XVsncHRyJ10gb3IgJ1VVSUQnIGluIHN0cF9saXN0W2luZGV4XVsnbmFtZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAndWludDgnIGluIHN0cF9saXN0W2luZGV4XVsndHlwZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3NzWyV1XSA8PCAiMHgiIDw8IGhleCA8PCBub3VwcGVyY2FzZSA8PCBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZD4ocFN0cnVjdC0+JXNbaV0pIDw8IGRlYzsnICUgKGluZGVudCwgaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzc1sldV0gPDwgIjB4IiA8PCBoZXggPDwgbm91cHBlcmNhc2UgPDwgcFN0cnVjdC0+JXNbaV0gPDwgZGVjOycgJSAoaW5kZW50LCBpbmRleCwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzc1sldV0gPDwgcFN0cnVjdC0+JXNbaV07JyAlIChpbmRlbnQsIGluZGV4LCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RwX2xpc3RbaW5kZXhdWyd0eXBlJ10gaW4gdnVsa2FuLmNvcmUub2JqZWN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N0cF9zdHJzWyV1XSArPSAiICIgKyBwcmVmaXggKyAiJXNbIiArIGluZGV4X3NzLnN0cigpICsgIl0uaGFuZGxlID0gIiArIHNzWyV1XS5zdHIoKSArICJcXG4iOycgJSAoaW5kZW50LCBpbmRleCwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10sIGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RwX3N0cnNbJXVdICs9ICIgIiArIHByZWZpeCArICIlc1siICsgaW5kZXhfc3Muc3RyKCkgKyAiXSA9ICIgKyBzc1sldV0uc3RyKCkgKyAiXFxuIjsnICUgKGluZGVudCwgaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddLCBpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3NzWyV1XS5zdHIoIiIpOycgJSAoaW5kZW50LCBpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnRbNDpdCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzfScgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN0cF9saXN0W2luZGV4XVsnZHluX2FycmF5J106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50WzQ6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXN9JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10gPT0gJ3BRdWV1ZUZhbWlseUluZGljZXMnKSBvciAoc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10gPT0gJ3BJbWFnZUluZm8nKSBvciAoc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10gPT0gJ3BCdWZmZXJJbmZvJykgb3IgKHN0cF9saXN0W2luZGV4XVsnbmFtZSddID09ICdwVGV4ZWxCdWZmZXJWaWV3Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50WzQ6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXN9JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIChzdHBfbGlzdFtpbmRleF1bJ3B0ciddKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzaWYgKHBTdHJ1Y3QtPiVzKSB7JyAlIChpbmRlbnQsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAnICAgICcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICdwTmV4dCcgPT0gc3RwX2xpc3RbaW5kZXhdWyduYW1lJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgdG1wX3N0ciA9IGR5bmFtaWNfZGlzcGxheSgodm9pZCopcFN0cnVjdC0+cE5leHQsIHByZWZpeCk7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10gaW4gWydwSW1hZ2VWaWV3cycsICdwQnVmZmVyVmlld3MnXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPIDogVGhpcyBpcyBhIHF1aWNrIGhhY2sgdG8gaGFuZGxlIHRoZXNlIGFycmF5cyBvZiBwdHJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICB0bXBfc3RyID0gJXMoJnBTdHJ1Y3QtPiVzWzBdLCBleHRyYV9pbmRlbnQpOycgJSAoc2VsZi5fZ2V0X3NoX2Z1bmNfbmFtZShzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXSksIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgdG1wX3N0ciA9ICVzKHBTdHJ1Y3QtPiVzLCBleHRyYV9pbmRlbnQpOycgJSAoc2VsZi5fZ2V0X3NoX2Z1bmNfbmFtZShzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXSksIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgc3RwX3N0cnNbJXVdID0gIiAiICsgcHJlZml4ICsgIiVzOlxcbiIgKyB0bXBfc3RyOycgJSAoaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICBzc1sldV0uc3RyKCIiKTsnICUgKGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIH0nKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgZWxzZScpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgc3RwX3N0cnNbJXVdID0gIiI7JyAlIGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50WzQ6XQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXSBpbiBzZWxmLm9wYXF1ZV90eXBlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICB0bXBfc3RyID0gJXMoJnBTdHJ1Y3QtPiVzLCBleHRyYV9pbmRlbnQpOycgJSAoc2VsZi5fZ2V0X3NoX2Z1bmNfbmFtZShzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXSksIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm5vX2FkZHI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHN0cF9zdHJzWyV1XSA9ICIgIiArIHByZWZpeCArICIlczpcXG4iICsgdG1wX3N0cjsnICUgKGluZGV4LCBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc3RwX3N0cnNbJXVdID0gIiAiICsgcHJlZml4ICsgIiVzOiIgKyAiXFxuIiArIHRtcF9zdHI7JyAlIChpbmRleCwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzc1sldV0gPDwgIjB4IiA8PCBoZXggPDwgbm91cHBlcmNhc2UgPDwgcFN0cnVjdC0+JXMgPDwgZGVjOycgJSAoaW5kZXgsIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICMgTm93IHByaW50IG9uZS1saW5lIGluZm8gZm9yIGFsbCBkYXRhIG1lbWJlcnMKKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICAgICAgZmluYWxfc3RyID0gW10KKyAgICAgICAgICAgIGZvciBtIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0W3NdKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNfdHlwZShzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10sICdlbnVtJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzX3R5cGUoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLCAnc3RydWN0JykgYW5kIG5vdCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydwdHInXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubm9fYWRkcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHNzWyV1XS5zdHIoImFkZHIiKTsnICUgKGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddIGluIHNlbGYub3BhcXVlX3R5cGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc3NbJXVdIDw8ICIweCIgPDwgaGV4IDw8IG5vdXBwZXJjYXNlIDw8IEhhbmRsZUNhc3QocFN0cnVjdC0+JXMpIDw8IGRlYzsnICUgKGluZGV4LCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHNzWyV1XSA8PCAiMHgiIDw8IGhleCA8PCBub3VwcGVyY2FzZSA8PCBIYW5kbGVDYXN0KCZwU3RydWN0LT4lcykgPDwgZGVjOycgJSAoaW5kZXgsIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXknXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICdjaGFyJyA9PSBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydmdWxsX3R5cGUnXSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAoMSA9PSBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydmdWxsX3R5cGUnXS5jb3VudCgnKicpIGFuZCAnY2hhcicgaW4gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc3NbJXVdIDw8IHBTdHJ1Y3QtPiVzOycgJSAoaW5kZXgsIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc3NbJXVdIDw8ICIweCIgPDwgaGV4IDw8IG5vdXBwZXJjYXNlIDw8IEhhbmRsZUNhc3QocFN0cnVjdC0+JXMpIDw8IGRlYzsnICUgKGluZGV4LCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICBlbGlmICdib29sJyBpbiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10ubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzc1sldV0uc3RyKHBTdHJ1Y3QtPiVzID8gIlRSVUUiIDogIkZBTFNFIik7JyAlIChpbmRleCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAndWludDgnIGluIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXS5sb3dlcigpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHNzWyV1XSA8PCBwU3RydWN0LT4lczsnICUgKGluZGV4LCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICBlbGlmICd2b2lkJyBpbiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10ubG93ZXIoKSBhbmQgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsncHRyJ106CisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgaWYgKFN0cmVhbUNvbnRyb2w6OndyaXRlQWRkcmVzcyknKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNzWyV1XSA8PCAiMHgiIDw8IGhleCA8PCBub3VwcGVyY2FzZSA8PCBIYW5kbGVDYXN0KHBTdHJ1Y3QtPiVzKSA8PCBkZWM7JyAlIChpbmRleCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIGVsc2UnKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNzWyV1XS5zdHIoImFkZHJlc3MiKTsnICUgKGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAnY2hhcicgaW4gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLmxvd2VyKCkgYW5kIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3B0ciddOgorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIGlmIChwU3RydWN0LT4lcyAhPSBOVUxMKSB7JyAlIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICBzc1sldV0gPDwgcFN0cnVjdC0+JXM7JyAlIChpbmRleCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICB9IGVsc2UgeycpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgc3NbJXVdIDw8ICIiOycgJSBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICB9JykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhleF9sYWJlbF9saXN0ID0gWyJmbGFnIiwgImJpdCIsICJvZmZzZXQiLCAiY291bnQiLCAicGZuIiwgInNpemUiLCAiaGFuZGxlIiwgImJ1ZmZlciIsICJvYmplY3QiLCAibWFzayIsICJpbmRleCJdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydwdHInXSBvciAnSFdORCcgaW4gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddIG9yICdISU5TVEFOQ0UnIGluIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHNzWyV1XSA8PCAiMHgiIDw8IGhleCA8PCBub3VwcGVyY2FzZSA8PCBIYW5kbGVDYXN0KHBTdHJ1Y3QtPiVzKSA8PCBkZWM7JyAlIChpbmRleCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90ICdmbG9hdCcgIGluIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW55ICh4IGluIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXS5sb3dlcigpIGZvciB4IGluIGhleF9sYWJlbF9saXN0KSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSAoeCBpbiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10ubG93ZXIoKSBmb3IgeCBpbiBoZXhfbGFiZWxfbGlzdCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXM6IE5COiBFZGl0IGhlcmUgdG8gY2hvb3NlIGhleCB2cyBkZWMgb3V0cHV0IGJ5IHZhcmlhYmxlIG5hbWUnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgc3NbJXVdIDw8ICIweCIgPDwgaGV4IDw8IG5vdXBwZXJjYXNlIDw8IHBTdHJ1Y3QtPiVzIDw8IGRlYzsnICUgKGluZGV4LCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzOiBOQiBFZGl0IHRoaXMgc2VjdGlvbiB0byBjaG9vc2UgaGV4IHZzIGRlYyBvdXRwdXQgYnkgdmFyaWFibGUgbmFtZScgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzc1sldV0gPDwgcFN0cnVjdC0+JXM7JyAlIChpbmRleCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfcHJpbnQgPSAnc3NbJXVdLnN0cigpJyAlIGluZGV4CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEZvciBhbiBub24tZW1wdHkgYXJyYXkgb2YgZW51bXMganVzdCBwcmludCBhZGRyZXNzIHcvIG5vdGUgdGhhdCBhcnJheSB3aWxsIGJlIGRpc3BsYXllZCBiZWxvdworICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydwdHInXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBpZiAocFN0cnVjdC0+JXMpJyAlIChzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNzWyV1XSA8PCAiMHgiIDw8IGhleCA8PCBub3VwcGVyY2FzZSA8PCBwU3RydWN0LT4lcyA8PCBkZWMgPDwgIiAoU2VlIGluZGl2aWR1YWwgYXJyYXkgdmFsdWVzIGJlbG93KSI7JyAlIChpbmRleCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIGVsc2UnKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNzWyV1XS5zdHIoIk5VTEwiKTsnICUgKGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3ByaW50ID0gJ3NzWyV1XS5zdHIoKScgJSBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgICAgICAgICAjIEZvciBzaW5nbGUgZW51bSBqdXN0IHByaW50IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3ByaW50ID0gJ3N0cmluZ18lcyhwU3RydWN0LT4lcyknICUgKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKQorICAgICAgICAgICAgICAgIGZpbmFsX3N0ci5hcHBlbmQoJysgcHJlZml4ICsgIiVzID0gIiArICVzICsgIlxcbiInICUgKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSwgdmFsdWVfcHJpbnQpKQorICAgICAgICAgICAgaWYgMCAhPSBudW1fc3RwczogIyBBcHBlbmQgZGF0YSBmb3IgYW55IGVtYmVkZGVkIHN0cnVjdHMKKyAgICAgICAgICAgICAgICBmaW5hbF9zdHIuYXBwZW5kKCIrICVzIiAlICIgKyAiLmpvaW4oWydzdHBfc3Ryc1sldV0nICUgbiBmb3IgbiBpbiByZXZlcnNlZChyYW5nZShudW1fc3RwcykpXSkpCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgZm9yIGZpbmFsX3N0cl9wYXJ0IGluIGZpbmFsX3N0cjoKKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBmaW5hbF9zdHIgPSBmaW5hbF9zdHIgJXM7JyAlIGZpbmFsX3N0cl9wYXJ0KQorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgcmV0dXJuIGZpbmFsX3N0cjtcbn0nKQorCisgICAgICAgICAgICAjIEVuZCBvZiBwbGF0Zm9ybSB3cmFwcGVkIHNlY3Rpb24KKyAgICAgICAgICAgIGFkZF9wbGF0Zm9ybV93cmFwcGVyX2V4aXQoc2hfZnVuY3MsIHR5cGVkZWZfZndkX2RpY3Rbc10pCisKKyAgICAgICAgIyBBZGQgZnVuY3Rpb24gdG8gcmV0dXJuIGEgc3RyaW5nIHZhbHVlIGZvciBpbnB1dCB2b2lkKgorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoInN0ZDo6c3RyaW5nIHN0cmluZ19jb252ZXJ0X2hlbHBlcihjb25zdCB2b2lkKiB0b1N0cmluZywgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4KVxueyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgIHVzaW5nIG5hbWVzcGFjZSBTdHJlYW1Db250cm9sOyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgc3RyaW5nc3RyZWFtIHNzOyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHNzIDw8IHRvU3RyaW5nOycpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIHN0cmluZyBmaW5hbF9zdHIgPSBwcmVmaXggKyBzcy5zdHIoKTsnKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICByZXR1cm4gZmluYWxfc3RyOyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgifSIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICMgQWRkIGZ1bmN0aW9uIHRvIHJldHVybiBhIHN0cmluZyB2YWx1ZSBmb3IgaW5wdXQgdWludDY0X3QKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCJzdGQ6OnN0cmluZyBzdHJpbmdfY29udmVydF9oZWxwZXIoY29uc3QgdWludDY0X3QgdG9TdHJpbmcsIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeClcbnsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICB1c2luZyBuYW1lc3BhY2UgU3RyZWFtQ29udHJvbDsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgIHN0cmluZ3N0cmVhbSBzczsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzcyA8PCB0b1N0cmluZzsnKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzdHJpbmcgZmluYWxfc3RyID0gcHJlZml4ICsgc3Muc3RyKCk7JykKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgcmV0dXJuIGZpbmFsX3N0cjsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIn0iKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICAjIEFkZCBmdW5jdGlvbiB0byByZXR1cm4gYSBzdHJpbmcgdmFsdWUgZm9yIGlucHV0IFZrU3VyZmFjZUZvcm1hdEtIUioKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCJzdGQ6OnN0cmluZyBzdHJpbmdfY29udmVydF9oZWxwZXIoVmtTdXJmYWNlRm9ybWF0S0hSIHRvU3RyaW5nLCBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXgpXG57IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzdHJpbmcgZmluYWxfc3RyID0gcHJlZml4ICsgImZvcm1hdCA9ICIgKyBzdHJpbmdfVmtGb3JtYXQodG9TdHJpbmcuZm9ybWF0KSArICJmb3JtYXQgPSAiICsgc3RyaW5nX1ZrQ29sb3JTcGFjZUtIUih0b1N0cmluZy5jb2xvclNwYWNlKTsnKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICByZXR1cm4gZmluYWxfc3RyOyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgifSIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgICMgQWRkIGZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IHByaW50IG91dCB1bmtub3duIHN0cnVjdAorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoInN0ZDo6c3RyaW5nIGR5bmFtaWNfZGlzcGxheShjb25zdCB2b2lkKiBwU3RydWN0LCBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXgpXG57IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICAvLyBDYXN0IHRvIEFQUF9JTkZPIHB0ciBpbml0aWFsbHkganVzdCB0byBwdWxsIHNUeXBlIG9mZiBzdHJ1Y3QiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICBpZiAocFN0cnVjdCA9PSBOVUxMKSB7XG4iKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHN0cmluZygpOyIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgIH1cbiIpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZSA9ICgoVmtBcHBsaWNhdGlvbkluZm8qKXBTdHJ1Y3QpLT5zVHlwZTsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBzdHJpbmcgaW5kZW50ID0gIiAgICAiOycpCisgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgIGluZGVudCArPSBwcmVmaXg7JykKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgc3dpdGNoIChzVHlwZSlcbiAgICB7IikKKyAgICAgICAgZm9yIGUgaW4gZW51bV90eXBlX2RpY3Q6CisgICAgICAgICAgICBpZiAiU3RydWN0dXJlVHlwZSIgaW4gZToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiBzb3J0ZWQoZW51bV90eXBlX2RpY3RbZV0pOgorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfbmFtZSA9IGdldF9zdHJ1Y3RfbmFtZV9mcm9tX3N0cnVjdF90eXBlKHYpCisgICAgICAgICAgICAgICAgICAgIGlmIHN0cnVjdF9uYW1lIG5vdCBpbiBzZWxmLnN0cnVjdF9kaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfZnVuY19uYW1lID0gc2VsZi5fZ2V0X3NoX2Z1bmNfbmFtZShzdHJ1Y3RfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgI3NoX2Z1bmNzLmFwcGVuZCgnc3RyaW5nICVzKGNvbnN0ICVzKiBwU3RydWN0LCBjb25zdCBzdHJpbmcgcHJlZml4KTsnICUgKHNlbGYuX2dldF9zaF9mdW5jX25hbWUocyksIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgY2FzZSAlczpcbiAgICAgICAgeycgJSAodikpCisgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICAgICAgcmV0dXJuICVzKCglcyopcFN0cnVjdCwgaW5kZW50KTsnICUgKHByaW50X2Z1bmNfbmFtZSwgc3RydWN0X25hbWUpKQorICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnICAgICAgICBicmVhazsnKQorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgiICAgICAgICBkZWZhdWx0OiIpCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIgICAgICAgIHJldHVybiBzdHJpbmcoKTsiKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICB9IikKKyAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCJ9IikKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihzaF9mdW5jcykKKworICAgIGRlZiBfZ2VuU3RydWN0TWVtYmVyUHJpbnQoc2VsZiwgbWVtYmVyLCBzLCBhcnJheSwgc3RydWN0X2FycmF5KToKKyAgICAgICAgKHBfb3V0LCBwX2FyZykgPSBzZWxmLl9nZXRfc3RydWN0X3ByaW50X2Zvcm1hdHRlZChzZWxmLnN0cnVjdF9kaWN0W3NdW21lbWJlcl0sIHByZV92YXJfbmFtZT0iJm1fZHVtbXlfcHJlZml4Iiwgc3RydWN0X3Zhcl9uYW1lPSJtX3N0cnVjdCIsIHN0cnVjdF9wdHI9RmFsc2UsIHByaW50X2FycmF5PVRydWUpCisgICAgICAgIGV4dHJhX2luZGVudCA9ICIiCisgICAgICAgIGlmIGFycmF5OgorICAgICAgICAgICAgZXh0cmFfaW5kZW50ID0gIiAgICAiCisgICAgICAgIGlmIGlzX3R5cGUoc2VsZi5zdHJ1Y3RfZGljdFtzXVttZW1iZXJdWyd0eXBlJ10sICdzdHJ1Y3QnKTogIyBwcmludCBzdHJ1Y3QgYWRkcmVzcyBmb3Igbm93CisgICAgICAgICAgICBzdHJ1Y3RfYXJyYXkuaW5zZXJ0KDAsIHNlbGYuc3RydWN0X2RpY3Rbc11bbWVtYmVyXSkKKyAgICAgICAgZWxpZiBzZWxmLnN0cnVjdF9kaWN0W3NdW21lbWJlcl1bJ3B0ciddOgorICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIHZvaWQqIG5hbWVkICJwTmV4dCIKKyAgICAgICAgICAgIGlmICJ2b2lkIiBpbiBzZWxmLnN0cnVjdF9kaWN0W3NdW21lbWJlcl1bJ3R5cGUnXSBhbmQgInBOZXh0IiA9PSBzZWxmLnN0cnVjdF9kaWN0W3NdW21lbWJlcl1bJ25hbWUnXToKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfYXJyYXkuaW5zZXJ0KDAsIHNlbGYuc3RydWN0X2RpY3Rbc11bbWVtYmVyXSkKKyAgICAgICAgcmV0dXJuICgnICAgICVzcHJpbnRmKCIlJSpzICAgICVzIiwgbV9pbmRlbnQsICIiJXMpOycgJSAoZXh0cmFfaW5kZW50LCBwX291dCwgcF9hcmcpLCBzdHJ1Y3RfYXJyYXkpCisKKyAgICBkZWYgX2dlbmVyYXRlRGlzcGxheURlZmluaXRpb25zKHNlbGYsIHMpOgorICAgICAgICBkaXNwX2RlZiA9IFtdCisgICAgICAgIHN0cnVjdF9hcnJheSA9IFtdCisgICAgICAgICMgU2luZ2xlLWxpbmUgc3RydWN0IHByaW50IGZ1bmN0aW9uCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiLy8gT3V0cHV0ICdzdHJ1Y3RuYW1lID0gc3RydWN0X2FkZHJlc3MnIG9uIGEgc2luZ2xlIGxpbmUiKQorICAgICAgICBkaXNwX2RlZi5hcHBlbmQoInZvaWQgJXM6OmRpc3BsYXlfc2luZ2xlX3R4dCgpXG57IiAlIHNlbGYuZ2V0X2NsYXNzX25hbWUocykpCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgnICAgIHByaW50ZigiICUlKnMlcyA9IDB4JSVwIiwgbV9pbmRlbnQsICIiLCAodm9pZCopbV9vcmlnU3RydWN0QWRkcik7JyAlIHR5cGVkZWZfZndkX2RpY3Rbc10pCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgifVxuIikKKyAgICAgICAgIyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBwcmludCBzdHJ1Y3QgbWVtYmVycworICAgICAgICBkaXNwX2RlZi5hcHBlbmQoIi8vIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZGlzcGxheXMgdGhlIG1lbWJlcnMgb2YgdGhlIHdyYXBwZWQgc3RydWN0IikKKyAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCJ2b2lkICVzOjpkaXNwbGF5X3N0cnVjdF9tZW1iZXJzKClcbnsiICUgc2VsZi5nZXRfY2xhc3NfbmFtZShzKSkKKyAgICAgICAgaV9kZWNsYXJlZCA9IEZhbHNlCisgICAgICAgIGZvciBtZW1iZXIgaW4gc29ydGVkKHNlbGYuc3RydWN0X2RpY3Rbc10pOgorICAgICAgICAgICAgIyBUT0RPIDogTmVlZCB0byBkaXNwbGF5IGVhY2ggbWVtYmVyIGJhc2VkIG9uIGl0cyB0eXBlCisgICAgICAgICAgICAjIFRPRE8gOiBOZWVkIHRvIGhhbmRsZSBwTmV4dCB3aGljaCBhcmUgc3RydWN0cywgYnV0IG9mIHZvaWQqIHR5cGUKKyAgICAgICAgICAgICMgICBDYW4gZ3JhYiBzdHJ1Y3QgdHlwZSBvZmYgb2YgaGVhZGVyIG9mIHN0cnVjdCBwb2ludGVkIHRvCisgICAgICAgICAgICAjIFRPRE8gOiBIYW5kbGUgQXJyYXlzCisgICAgICAgICAgICBpZiBzZWxmLnN0cnVjdF9kaWN0W3NdW21lbWJlcl1bJ2FycmF5J106CisgICAgICAgICAgICAgICAgIyBDcmVhdGUgZm9yIGxvb3AgdG8gcHJpbnQgZWFjaCBlbGVtZW50IG9mIGFycmF5CisgICAgICAgICAgICAgICAgaWYgbm90IGlfZGVjbGFyZWQ6CisgICAgICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgnICAgIHVpbnQzMl90IGk7JykKKyAgICAgICAgICAgICAgICAgICAgaV9kZWNsYXJlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBkaXNwX2RlZi5hcHBlbmQoJyAgICBmb3IgKGkgPSAwOyBpPCVzOyBpKyspIHsnICUgc2VsZi5zdHJ1Y3RfZGljdFtzXVttZW1iZXJdWydhcnJheV9zaXplJ10pCisgICAgICAgICAgICAgICAgKHJldHVybl9zdHIsIHN0cnVjdF9hcnJheSkgPSBzZWxmLl9nZW5TdHJ1Y3RNZW1iZXJQcmludChtZW1iZXIsIHMsIFRydWUsIHN0cnVjdF9hcnJheSkKKyAgICAgICAgICAgICAgICBkaXNwX2RlZi5hcHBlbmQocmV0dXJuX3N0cikKKyAgICAgICAgICAgICAgICBkaXNwX2RlZi5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgKHJldHVybl9zdHIsIHN0cnVjdF9hcnJheSkgPSBzZWxmLl9nZW5TdHJ1Y3RNZW1iZXJQcmludChtZW1iZXIsIHMsIEZhbHNlLCBzdHJ1Y3RfYXJyYXkpCisgICAgICAgICAgICAgICAgZGlzcF9kZWYuYXBwZW5kKHJldHVybl9zdHIpCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgifVxuIikKKyAgICAgICAgaV9kZWNsYXJlZCA9IEZhbHNlCisgICAgICAgICMgQmFzaWMgcHJpbnQgZnVuY3Rpb24gdG8gZGlzcGxheSBzdHJ1Y3QgbWVtYmVycworICAgICAgICBkaXNwX2RlZi5hcHBlbmQoIi8vIE91dHB1dCBhbGwgc3RydWN0IGVsZW1lbnRzLCBlYWNoIG9uIHRoZWlyIG93biBsaW5lIikKKyAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCJ2b2lkICVzOjpkaXNwbGF5X3R4dCgpXG57IiAlIHNlbGYuZ2V0X2NsYXNzX25hbWUocykpCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgnICAgIHByaW50ZigiJSUqcyVzIHN0cnVjdCBjb250ZW50cyBhdCAweCUlcDpcXG4iLCBtX2luZGVudCwgIiIsICh2b2lkKiltX29yaWdTdHJ1Y3RBZGRyKTsnICUgdHlwZWRlZl9md2RfZGljdFtzXSkKKyAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCcgICAgdGhpcy0+ZGlzcGxheV9zdHJ1Y3RfbWVtYmVycygpOycpCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgifVxuIikKKyAgICAgICAgIyBBZHZhbmNlZCBwcmludCBmdW5jdGlvbiB0byBkaXNwbGF5IGN1cnJlbnQgc3RydWN0IGFuZCBjb250ZW50cyBvZiBhbnkgcG9pbnRlZC10byBzdHJ1Y3RzCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiLy8gT3V0cHV0IGFsbCBzdHJ1Y3QgZWxlbWVudHMsIGFuZCBmb3IgYW55IHN0cnVjdHMgcG9pbnRlZCB0bywgcHJpbnQgY29tcGxldGUgY29udGVudHMiKQorICAgICAgICBkaXNwX2RlZi5hcHBlbmQoInZvaWQgJXM6OmRpc3BsYXlfZnVsbF90eHQoKVxueyIgJSBzZWxmLmdldF9jbGFzc19uYW1lKHMpKQorICAgICAgICBkaXNwX2RlZi5hcHBlbmQoJyAgICBwcmludGYoIiUlKnMlcyBzdHJ1Y3QgY29udGVudHMgYXQgMHglJXA6XFxuIiwgbV9pbmRlbnQsICIiLCAodm9pZCopbV9vcmlnU3RydWN0QWRkcik7JyAlIHR5cGVkZWZfZndkX2RpY3Rbc10pCisgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgnICAgIHRoaXMtPmRpc3BsYXlfc3RydWN0X21lbWJlcnMoKTsnKQorICAgICAgICBjbGFzc19udW0gPSAwCisgICAgICAgICMgVE9ETyA6IE5lZWQgdG8gaGFuZGxlIGFycmF5cyBvZiBzdHJ1Y3RzIGhlcmUKKyAgICAgICAgZm9yIG1zIGluIHN0cnVjdF9hcnJheToKKyAgICAgICAgICAgIHN3Y19uYW1lID0gImNsYXNzJXMiICUgc3RyKGNsYXNzX251bSkKKyAgICAgICAgICAgIGlmIG1zWydhcnJheSddOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpX2RlY2xhcmVkOgorICAgICAgICAgICAgICAgICAgICBkaXNwX2RlZi5hcHBlbmQoJyAgICB1aW50MzJfdCBpOycpCisgICAgICAgICAgICAgICAgICAgIGlfZGVjbGFyZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCcgICAgZm9yIChpID0gMDsgaTwlczsgaSsrKSB7JyAlIG1zWydhcnJheV9zaXplJ10pCisgICAgICAgICAgICAgICAgI2Rpc3BfZGVmLmFwcGVuZCgiICAgICAgICBpZiAobV9zdHJ1Y3QuJXNbaV0pIHsiICUgKG1zWyduYW1lJ10pKQorICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgICAgICAgICAgJXMgJXMoJihtX3N0cnVjdC4lc1tpXSkpOyIgJSAoc2VsZi5nZXRfY2xhc3NfbmFtZShtc1sndHlwZSddKSwgc3djX25hbWUsIG1zWyduYW1lJ10pKQorICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgICAgICAgICAgJXMuc2V0X2luZGVudChtX2luZGVudCArIDQpOyIgJSAoc3djX25hbWUpKQorICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgICAgICAgICAgJXMuZGlzcGxheV9mdWxsX3R4dCgpOyIgJSAoc3djX25hbWUpKQorICAgICAgICAgICAgICAgICNkaXNwX2RlZi5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgICAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCcgICAgfScpCisgICAgICAgICAgICBlbGlmICdwTmV4dCcgPT0gbXNbJ25hbWUnXToKKyAgICAgICAgICAgICAgICAjIE5lZWQgc29tZSBjb2RlIHRyaWNrZXJ5IGhlcmUKKyAgICAgICAgICAgICAgICAjICBJJ20gdGhpbmtpbmcgaGF2ZSBhIGdlbmVyYXRlZCBmdW5jdGlvbiB0aGF0IHRha2VzIHBOZXh0IHB0ciB2YWx1ZQorICAgICAgICAgICAgICAgICMgIHRoZW4gaXQgY2hlY2tzIHNUeXBlIGFuZCBpbiBsYXJnZSBzd2l0Y2ggc3RhdGVtZW50IGNyZWF0ZXMgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgICAgICAjICB3cmFwcGVyIGNsYXNzIHR5cGUgYW5kIHRoZW4gcHJpbnRzIGNvbnRlbnRzCisgICAgICAgICAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCIgICAgaWYgKG1fc3RydWN0LiVzKSB7IiAlIChtc1snbmFtZSddKSkKKyAgICAgICAgICAgICAgICAjZGlzcF9kZWYuYXBwZW5kKCcgICAgICAgIHByaW50ZigiJSpzICAgIFRoaXMgaXMgd2hlcmUgd2Ugd291bGQgY2FsbCBkeW5hbWljIHByaW50IGZ1bmN0aW9uXFxuIiwgbV9pbmRlbnQsICIiKTsnKQorICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgnICAgICAgICBkeW5hbWljX2Rpc3BsYXlfZnVsbF90eHQobV9zdHJ1Y3QuJXMsIG1faW5kZW50KTsnICUgKG1zWyduYW1lJ10pKQorICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgIH0iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBtc1sncHRyJ106CisgICAgICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgIGlmIChtX3N0cnVjdC4lcykgeyIgJSAobXNbJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgICAgICAlcyAlcyhtX3N0cnVjdC4lcyk7IiAlIChzZWxmLmdldF9jbGFzc19uYW1lKG1zWyd0eXBlJ10pLCBzd2NfbmFtZSwgbXNbJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCIgICAgaWYgKCZtX3N0cnVjdC4lcykgeyIgJSAobXNbJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgICAgICAlcyAlcygmbV9zdHJ1Y3QuJXMpOyIgJSAoc2VsZi5nZXRfY2xhc3NfbmFtZShtc1sndHlwZSddKSwgc3djX25hbWUsIG1zWyduYW1lJ10pKQorICAgICAgICAgICAgICAgIGRpc3BfZGVmLmFwcGVuZCgiICAgICAgICAlcy5zZXRfaW5kZW50KG1faW5kZW50ICsgNCk7IiAlIChzd2NfbmFtZSkpCisgICAgICAgICAgICAgICAgZGlzcF9kZWYuYXBwZW5kKCIgICAgICAgICVzLmRpc3BsYXlfZnVsbF90eHQoKTtcbiAgICB9IiAlIChzd2NfbmFtZSkpCisgICAgICAgICAgICBjbGFzc19udW0gKz0gMQorICAgICAgICBkaXNwX2RlZi5hcHBlbmQoIn1cbiIpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oZGlzcF9kZWYpCisKKyAgICBkZWYgX2dlbmVyYXRlU3RyaW5nSGVscGVySGVhZGVyKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBbXQorICAgICAgICBoZWFkZXIuYXBwZW5kKCIvLyNpbmNsdWRlcywgI2RlZmluZXMsIGdsb2JhbHMgYW5kIHN1Y2guLi5cbiIpCisgICAgICAgIGZvciBmIGluIHNlbGYuaW5jbHVkZV9oZWFkZXJzOgorICAgICAgICAgICAgaWYgJ3ZrX2VudW1fc3RyaW5nX2hlbHBlcicgbm90IGluIGY6CisgICAgICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiI2luY2x1ZGUgPCVzPlxuIiAlIGYpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCJcblxuLy8gRnVuY3Rpb24gUHJvdG90eXBlc1xuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiY2hhciogZHluYW1pY19kaXNwbGF5KGNvbnN0IHZvaWQqIHBTdHJ1Y3QsIGNvbnN0IGNoYXIqIHByZWZpeCk7XG4iKQorICAgICAgICByZXR1cm4gIiIuam9pbihoZWFkZXIpCisKKyAgICBkZWYgX2dlbmVyYXRlU3RyaW5nSGVscGVySGVhZGVyQ3BwKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBbXQorICAgICAgICBoZWFkZXIuYXBwZW5kKCIvLyNpbmNsdWRlcywgI2RlZmluZXMsIGdsb2JhbHMgYW5kIHN1Y2guLi5cbiIpCisgICAgICAgIGZvciBmIGluIHNlbGYuaW5jbHVkZV9oZWFkZXJzOgorICAgICAgICAgICAgaWYgJ3ZrX2VudW1fc3RyaW5nX2hlbHBlcicgbm90IGluIGY6CisgICAgICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiI2luY2x1ZGUgPCVzPlxuIiAlIGYpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCJcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ25hbWVzcGFjZSBTdHJlYW1Db250cm9sXG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCd7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCdib29sIHdyaXRlQWRkcmVzcyA9IHRydWU7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCd0ZW1wbGF0ZSA8dHlwZW5hbWUgVD5cbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtICZvdXQsIFQgY29uc3QqIHBvaW50ZXIpXG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCd7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcgICAgaWYod3JpdGVBZGRyZXNzKVxuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnICAgIHtcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyAgICAgICAgb3V0Lm9wZXJhdG9yPDwocG9pbnRlcik7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnICAgIGVsc2VcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyAgICB7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcgICAgICAgIHN0ZDo6b3BlcmF0b3I8PChvdXQsICJhZGRyZXNzIik7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnICAgIHJldHVybiBvdXQ7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCd9XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCd0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlVHlwZT4gdWludDY0X3QgSGFuZGxlQ2FzdChIYW5kbGVUeXBlICogaGFuZGxlKVxuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgne1xuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihoYW5kbGUpO1xuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnfVxuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgndWludDY0X3QgSGFuZGxlQ2FzdCh1aW50NjRfdCBoYW5kbGUpXG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCd7XG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcgICAgcmV0dXJuIGhhbmRsZTtcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ31cbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm91dCwgY2hhciBjb25zdCpjb25zdCBzKVxuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgne1xuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnICAgIHJldHVybiBzdGQ6Om9wZXJhdG9yPDwob3V0LCBzKTtcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ31cbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ31cbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ1xuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgic3RkOjpzdHJpbmcgZHluYW1pY19kaXNwbGF5KGNvbnN0IHZvaWQqIHBTdHJ1Y3QsIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCk7XG4iKQorICAgICAgICByZXR1cm4gIiIuam9pbihoZWFkZXIpCisKKyAgICBkZWYgX2dlbmVyYXRlVmFsaWRhdGVIZWxwZXJGdW5jdGlvbnMoc2VsZik6CisgICAgICAgIHNoX2Z1bmNzID0gW10KKyAgICAgICAgIyBXZSBkbyB0d28gcGFzc2VzLCBmaXJzdCBwYXNzIGp1c3QgZ2VuZXJhdGVzIHByb3RvdHlwZXMgZm9yIGFsbCB0aGUgZnVuY3RzaW9ucworICAgICAgICBmb3IgcyBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdCk6CisKKyAgICAgICAgICAgICMgV3JhcCB0aGlzIGluIHBsYXRmb3JtIGNoZWNrIHNpbmNlIGl0IG1heSBjb250YWluIHVuZGVmaW5lZCBzdHJ1Y3RzIG9yIGZ1bmN0aW9ucworICAgICAgICAgICAgYWRkX3BsYXRmb3JtX3dyYXBwZXJfZW50cnkoc2hfZnVuY3MsIHR5cGVkZWZfZndkX2RpY3Rbc10pCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJ3VpbnQzMl90ICVzKGNvbnN0ICVzKiBwU3RydWN0KTsnICUgKHNlbGYuX2dldF92aF9mdW5jX25hbWUocyksIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICAgICAgYWRkX3BsYXRmb3JtX3dyYXBwZXJfZXhpdChzaF9mdW5jcywgdHlwZWRlZl9md2RfZGljdFtzXSkKKworICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJ1xuJykKKyAgICAgICAgZm9yIHMgaW4gc29ydGVkKHNlbGYuc3RydWN0X2RpY3QpOgorCisgICAgICAgICAgICAjIFdyYXAgdGhpcyBpbiBwbGF0Zm9ybSBjaGVjayBzaW5jZSBpdCBtYXkgY29udGFpbiB1bmRlZmluZWQgc3RydWN0cyBvciBmdW5jdGlvbnMKKyAgICAgICAgICAgIGFkZF9wbGF0Zm9ybV93cmFwcGVyX2VudHJ5KHNoX2Z1bmNzLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKQorCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJ3VpbnQzMl90ICVzKGNvbnN0ICVzKiBwU3RydWN0KVxueycgJSAoc2VsZi5fZ2V0X3ZoX2Z1bmNfbmFtZShzKSwgdHlwZWRlZl9md2RfZGljdFtzXSkpCisgICAgICAgICAgICBmb3IgbSBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdFtzXSk6CisgICAgICAgICAgICAgICAgIyBUT0RPIDogTmVlZCB0byBoYW5kbGUgYXJyYXlzIG9mIGVudW1zIGxpa2UgaW4gVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyBzdHJ1Y3QKKyAgICAgICAgICAgICAgICBpZiBpc190eXBlKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgJ2VudW0nKSBhbmQgbm90IHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3B0ciddOgorICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyAgICBpZiAoIXZhbGlkYXRlXyVzKHBTdHJ1Y3QtPiVzKSlcbiAgICAgICAgcmV0dXJuIDA7JyAlIChzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgIyBUT0RPIDogTmVlZCBhIGxpdHRsZSByZWZpbmVtZW50IHRvIHRoaXMgY29kZSB0byBtYWtlIHN1cmUgdHlwZSBvZiBzdHJ1Y3QgbWF0Y2hlcyBleHBlY3RlZCBpbnB1dCAocHRyLCBjb25zdC4uLikKKyAgICAgICAgICAgICAgICBpZiBpc190eXBlKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgJ3N0cnVjdCcpOgorICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsncHRyJ10pOgorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgaWYgKHBTdHJ1Y3QtPiVzICYmICElcygoY29uc3QgJXMqKXBTdHJ1Y3QtPiVzKSlcbiAgICAgICAgcmV0dXJuIDA7JyAlIChzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10sIHNlbGYuX2dldF92aF9mdW5jX25hbWUoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddKSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCcgICAgaWYgKCElcygoY29uc3QgJXMqKSZwU3RydWN0LT4lcykpXG4gICAgICAgIHJldHVybiAwOycgJSAoc2VsZi5fZ2V0X3ZoX2Z1bmNfbmFtZShzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10pLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkpCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoIiAgICByZXR1cm4gMTtcbn0iKQorCisgICAgICAgICAgICAjIEVuZCBvZiBwbGF0Zm9ybSB3cmFwcGVkIHNlY3Rpb24KKyAgICAgICAgICAgIGFkZF9wbGF0Zm9ybV93cmFwcGVyX2V4aXQoc2hfZnVuY3MsIHR5cGVkZWZfZndkX2RpY3Rbc10pCisKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihzaF9mdW5jcykKKworICAgIGRlZiBfZ2VuZXJhdGVWYWxpZGF0ZUhlbHBlckhlYWRlcihzZWxmKToKKyAgICAgICAgaGVhZGVyID0gW10KKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiLy8jaW5jbHVkZXMsICNkZWZpbmVzLCBnbG9iYWxzIGFuZCBzdWNoLi4uXG4iKQorICAgICAgICBmb3IgZiBpbiBzZWxmLmluY2x1ZGVfaGVhZGVyczoKKyAgICAgICAgICAgIGlmICd2a19lbnVtX3ZhbGlkYXRlX2hlbHBlcicgbm90IGluIGY6CisgICAgICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiI2luY2x1ZGUgPCVzPlxuIiAlIGYpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19lbnVtX3ZhbGlkYXRlX2hlbHBlci5oIlxuXG4vLyBGdW5jdGlvbiBQcm90b3R5cGVzXG4nKQorICAgICAgICAjaGVhZGVyLmFwcGVuZCgiY2hhciogZHluYW1pY19kaXNwbGF5KGNvbnN0IHZvaWQqIHBTdHJ1Y3QsIGNvbnN0IGNoYXIqIHByZWZpeCk7XG4iKQorICAgICAgICByZXR1cm4gIiIuam9pbihoZWFkZXIpCisKKyAgICBkZWYgX2dlbmVyYXRlU2l6ZUhlbHBlckZ1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgc2hfZnVuY3MgPSBbXQorICAgICAgICAjIGp1c3QgZ2VuZXJhdGVzIHByb3RvdHlwZXMgZm9yIGFsbCB0aGUgZnVuY3Rpb25zCisgICAgICAgIGZvciBzIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0KToKKworICAgICAgICAgICAgIyBXcmFwIHRoaXMgaW4gcGxhdGZvcm0gY2hlY2sgc2luY2UgaXQgbWF5IGNvbnRhaW4gdW5kZWZpbmVkIHN0cnVjdHMgb3IgZnVuY3Rpb25zCisgICAgICAgICAgICBhZGRfcGxhdGZvcm1fd3JhcHBlcl9lbnRyeShzaF9mdW5jcywgdHlwZWRlZl9md2RfZGljdFtzXSkKKyAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnc2l6ZV90ICVzKGNvbnN0ICVzKiBwU3RydWN0KTsnICUgKHNlbGYuX2dldF9zaXplX2hlbHBlcl9mdW5jX25hbWUocyksIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICAgICAgYWRkX3BsYXRmb3JtX3dyYXBwZXJfZXhpdChzaF9mdW5jcywgdHlwZWRlZl9md2RfZGljdFtzXSkKKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKHNoX2Z1bmNzKQorCisKKyAgICBkZWYgX2dlbmVyYXRlU2l6ZUhlbHBlckZ1bmN0aW9uc0Moc2VsZik6CisgICAgICAgIHNoX2Z1bmNzID0gW10KKyAgICAgICAgIyBnZW5lcmF0ZSBmdW5jdGlvbiBkZWZpbml0aW9ucworICAgICAgICBmb3IgcyBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdCk6CisKKyAgICAgICAgICAgICMgV3JhcCB0aGlzIGluIHBsYXRmb3JtIGNoZWNrIHNpbmNlIGl0IG1heSBjb250YWluIHVuZGVmaW5lZCBzdHJ1Y3RzIG9yIGZ1bmN0aW9ucworICAgICAgICAgICAgYWRkX3BsYXRmb3JtX3dyYXBwZXJfZW50cnkoc2hfZnVuY3MsIHR5cGVkZWZfZndkX2RpY3Rbc10pCisKKyAgICAgICAgICAgIHNraXBfbGlzdCA9IFtdICMgVXNlZCB3aGVuIHN0cnVjdCBlbGVtZW50cyBuZWVkIHRvIGJlIHNraXBwZWQgYmVjYXVzZSBzaXplIGFscmVhZHkgYWNjb3VudGVkIGZvcgorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCdzaXplX3QgJXMoY29uc3QgJXMqIHBTdHJ1Y3QpXG57JyAlIChzZWxmLl9nZXRfc2l6ZV9oZWxwZXJfZnVuY19uYW1lKHMpLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyAgICAgICAgICAgIGluZGVudCA9ICcgICAgJworICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3NpemVfdCBzdHJ1Y3RTaXplID0gMDsnICUgKGluZGVudCkpCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzaWYgKHBTdHJ1Y3QpIHsnICUgKGluZGVudCkpCisgICAgICAgICAgICBpbmRlbnQgPSAnICAgICAgICAnCisgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RydWN0U2l6ZSA9IHNpemVvZiglcyk7JyAlIChpbmRlbnQsIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICAgICAgaV9kZWNsID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBtIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0W3NdKToKKyAgICAgICAgICAgICAgICBpZiBtIGluIHNraXBfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydkeW5fYXJyYXknXToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnZnVsbF90eXBlJ10uY291bnQoJyonKSA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNfdHlwZShzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10sICdzdHJ1Y3QnKSBhbmQgbm90ICdjaGFyJyBpbiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10ubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAncHBNZW1vcnlCYXJyaWVycycgPT0gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRPRE8gOiBGb3Igbm93IGJlIGNvbnNlcnZhdGl2ZSBhbmQgY29uc2lkZXIgYWxsIG1lbUJhcnJpZXIgcHRycyBhcyBsYXJnZXN0IHBvc3NpYmxlIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RydWN0U2l6ZSArPSBwU3RydWN0LT4lcyooc2l6ZW9mKCVzKikgKyBzaXplb2YoVmtJbWFnZU1lbW9yeUJhcnJpZXIpKTsnICUgKGluZGVudCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJ1Y3RTaXplICs9IHBTdHJ1Y3QtPiVzKihzaXplb2YoJXMqKSArIHNpemVvZiglcykpOycgJSAoaW5kZW50LCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydhcnJheV9zaXplJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6ICMgVGhpcyBpcyBhbiBhcnJheSBvZiBjaGFyKiBvciBhcnJheSBvZiBzdHJ1Y3QgcHRycworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpX2RlY2w6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXN1aW50MzJfdCBpID0gMDsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfZGVjbCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzZm9yIChpID0gMDsgaSA8IHBTdHJ1Y3QtPiVzOyBpKyspIHsnICUgKGluZGVudCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAnICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzX3R5cGUoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLCAnc3RydWN0Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJ1Y3RTaXplICs9IChzaXplb2YoJXMqKSArICVzKHBTdHJ1Y3QtPiVzW2ldKSk7JyAlIChpbmRlbnQsIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgc2VsZi5fZ2V0X3NpemVfaGVscGVyX2Z1bmNfbmFtZShzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10pLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJ1Y3RTaXplICs9IChzaXplb2YoY2hhciopICsgKHNpemVvZihjaGFyKSAqICgxICsgc3RybGVuKHBTdHJ1Y3QtPiVzW2ldKSkpKTsnICUgKGluZGVudCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAnICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc30nICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc190eXBlKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgJ3N0cnVjdCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpX2RlY2w6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXN1aW50MzJfdCBpID0gMDsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfZGVjbCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzZm9yIChpID0gMDsgaSA8IHBTdHJ1Y3QtPiVzOyBpKyspIHsnICUgKGluZGVudCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAnICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJ1Y3RTaXplICs9ICVzKCZwU3RydWN0LT4lc1tpXSk7JyAlIChpbmRlbnQsIHNlbGYuX2dldF9zaXplX2hlbHBlcl9mdW5jX25hbWUoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddKSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAnICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc30nICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJ1Y3RTaXplICs9IHBTdHJ1Y3QtPiVzKnNpemVvZiglcyk7JyAlIChpbmRlbnQsIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ2FycmF5X3NpemUnXSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddKSkKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3B0ciddIGFuZCAncE5leHQnICE9IHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSBhbmQgJ2RweScgIT0gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddOgorICAgICAgICAgICAgICAgICAgICBpZiAnY2hhcicgaW4gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RydWN0U2l6ZSArPSAocFN0cnVjdC0+JXMgIT0gTlVMTCkgPyBzaXplb2YoJXMpKigxK3N0cmxlbihwU3RydWN0LT4lcykpIDogMDsnICUgKGluZGVudCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNfdHlwZShzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10sICdzdHJ1Y3QnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNzdHJ1Y3RTaXplICs9ICVzKHBTdHJ1Y3QtPiVzKTsnICUgKGluZGVudCwgc2VsZi5fZ2V0X3NpemVfaGVscGVyX2Z1bmNfbmFtZShzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10pLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICBlbGlmICd2b2lkJyBub3QgaW4gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddICE9ICd4Y2JfY29ubmVjdGlvbl90Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N0cnVjdFNpemUgKz0gc2l6ZW9mKCVzKTsnICUgKGluZGVudCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddKSkKKyAgICAgICAgICAgICAgICBlbGlmICdzaXplX3QnID09IHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXS5sb3dlcigpOgorICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RydWN0U2l6ZSArPSBwU3RydWN0LT4lczsnICUgKGluZGVudCwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9saXN0LmFwcGVuZChtKzEpCisgICAgICAgICAgICBpbmRlbnQgPSAnICAgICcKKyAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXN9JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCIlc3JldHVybiBzdHJ1Y3RTaXplO1xufSIgJSAoaW5kZW50KSkKKworICAgICAgICAgICAgIyBFbmQgb2YgcGxhdGZvcm0gd3JhcHBlZCBzZWN0aW9uCisgICAgICAgICAgICBhZGRfcGxhdGZvcm1fd3JhcHBlcl9leGl0KHNoX2Z1bmNzLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKQorCisgICAgICAgICMgTm93IGdlbmVyYXRlIGdlbmVyaWMgZnVuY3Rpb25zIHRvIGxvb3Agb3ZlciBlbnRpcmUgc3RydWN0IGNoYWluIChvciBqdXN0IGhhbmRsZSBzaW5nbGUgZ2VuZXJpYyBzdHJ1Y3RzKQorICAgICAgICBpZiAnX2RlYnVnXycgbm90IGluIHNlbGYuaGVhZGVyX2ZpbGVuYW1lOgorICAgICAgICAgICAgZm9yIGZvbGxvd19jaGFpbiBpbiBbVHJ1ZSwgRmFsc2VdOgorICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICBpZiBmb2xsb3dfY2hhaW46CisgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnc2l6ZV90IGdldF9zdHJ1Y3RfY2hhaW5fc2l6ZShjb25zdCB2b2lkKiBwU3RydWN0KVxueycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCdzaXplX3QgZ2V0X2R5bmFtaWNfc3RydWN0X3NpemUoY29uc3Qgdm9pZCogcFN0cnVjdClcbnsnKQorICAgICAgICAgICAgICAgIGluZGVudCA9ICcgICAgJworICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXMvLyBKdXN0IHVzZSBWa0FwcGxpY2F0aW9uSW5mbyBhcyBzdHJ1Y3QgdW50aWwgYWN0dWFsIHR5cGUgaXMgcmVzb2x2ZWQnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc1ZrQXBwbGljYXRpb25JbmZvKiBwTmV4dCA9IChWa0FwcGxpY2F0aW9uSW5mbyopcFN0cnVjdDsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3NpemVfdCBzdHJ1Y3RTaXplID0gMDsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgaWYgZm9sbG93X2NoYWluOgorICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzd2hpbGUgKHBOZXh0KSB7JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAnICAgICAgICAnCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N3aXRjaCAocE5leHQtPnNUeXBlKSB7JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgIGluZGVudCArPSAnICAgICcKKyAgICAgICAgICAgICAgICBmb3IgZSBpbiBlbnVtX3R5cGVfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgJ1N0cnVjdHVyZVR5cGUnIGluIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiBzb3J0ZWQoZW51bV90eXBlX2RpY3RbZV0pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9uYW1lID0gZ2V0X3N0cnVjdF9uYW1lX2Zyb21fc3RydWN0X3R5cGUodikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdHJ1Y3RfbmFtZSBub3QgaW4gc2VsZi5zdHJ1Y3RfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNjYXNlICVzOicgJSAoaW5kZW50LCB2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzeycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3N0cnVjdFNpemUgKz0gJXMoKCVzKilwTmV4dCk7JyAlIChpbmRlbnQsIHNlbGYuX2dldF9zaXplX2hlbHBlcl9mdW5jX25hbWUoc3RydWN0X25hbWUpLCBzdHJ1Y3RfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc2JyZWFrOycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnRbOi00XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXN9JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc2RlZmF1bHQ6JyAlIChpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICcgICAgJworICAgICAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc2Fzc2VydCgwKTsnICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzc3RydWN0U2l6ZSArPSAwOycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGluZGVudFs6LTRdCisgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50WzotNF0KKyAgICAgICAgICAgICAgICBzaF9mdW5jcy5hcHBlbmQoJyVzfScgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICBpZiBmb2xsb3dfY2hhaW46CisgICAgICAgICAgICAgICAgICAgIHNoX2Z1bmNzLmFwcGVuZCgnJXNwTmV4dCA9IChWa0FwcGxpY2F0aW9uSW5mbyopcE5leHQtPnBOZXh0OycgJSAoaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50WzotNF0KKyAgICAgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc30nICUgKGluZGVudCkpCisgICAgICAgICAgICAgICAgc2hfZnVuY3MuYXBwZW5kKCclc3JldHVybiBzdHJ1Y3RTaXplO1xufScgJSBpbmRlbnQpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oc2hfZnVuY3MpCisKKyAgICBkZWYgX2dlbmVyYXRlU2l6ZUhlbHBlckhlYWRlcihzZWxmKToKKyAgICAgICAgaGVhZGVyID0gW10KKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiLy8jaW5jbHVkZXMsICNkZWZpbmVzLCBnbG9iYWxzIGFuZCBzdWNoLi4uXG4iKQorICAgICAgICBmb3IgZiBpbiBzZWxmLmluY2x1ZGVfaGVhZGVyczoKKyAgICAgICAgICAgIGhlYWRlci5hcHBlbmQoIiNpbmNsdWRlIDwlcz5cbiIgJSBmKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCdcbi8vIEZ1bmN0aW9uIFByb3RvdHlwZXNcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoInNpemVfdCBnZXRfc3RydWN0X2NoYWluX3NpemUoY29uc3Qgdm9pZCogcFN0cnVjdCk7XG4iKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCJzaXplX3QgZ2V0X2R5bmFtaWNfc3RydWN0X3NpemUoY29uc3Qgdm9pZCogcFN0cnVjdCk7XG4iKQorICAgICAgICByZXR1cm4gIiIuam9pbihoZWFkZXIpCisKKyAgICBkZWYgX2dlbmVyYXRlU2l6ZUhlbHBlckhlYWRlckMoc2VsZik6CisgICAgICAgIGhlYWRlciA9IFtdCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2a19zdHJ1Y3Rfc2l6ZV9oZWxwZXIuaCInKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcjaW5jbHVkZSA8c3RyaW5nLmg+JykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnI2luY2x1ZGUgPGFzc2VydC5oPicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJ1xuLy8gRnVuY3Rpb24gZGVmaW5pdGlvbnNcbicpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaGVhZGVyKQorCisKKyAgICBkZWYgX2dlbmVyYXRlSGVhZGVyKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBbXQorICAgICAgICBoZWFkZXIuYXBwZW5kKCIvLyNpbmNsdWRlcywgI2RlZmluZXMsIGdsb2JhbHMgYW5kIHN1Y2guLi5cbiIpCisgICAgICAgIGZvciBmIGluIHNlbGYuaW5jbHVkZV9oZWFkZXJzOgorICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiI2luY2x1ZGUgPCVzPlxuIiAlIGYpCisgICAgICAgIHJldHVybiAiIi5qb2luKGhlYWRlcikKKworICAgICMgRGVjbGFyYXRpb25zCisgICAgZGVmIF9nZW5lcmF0ZUNvbnN0cnVjdG9yRGVjbGFyYXRpb25zKHNlbGYsIHMpOgorICAgICAgICBjb25zdHJ1Y3RvcnMgPSBbXQorICAgICAgICBjbGFzc19uYW1lID0gc2VsZi5nZXRfY2xhc3NfbmFtZShzKQorICAgICAgICBjb25zdHJ1Y3RvcnMuYXBwZW5kKCIgICAgJXMoKTtcbiIgJSBjbGFzc19uYW1lKQorICAgICAgICBjb25zdHJ1Y3RvcnMuYXBwZW5kKCIgICAgJXMoJXMqIHBJblN0cnVjdCk7XG4iICUgKGNsYXNzX25hbWUsIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICBjb25zdHJ1Y3RvcnMuYXBwZW5kKCIgICAgJXMoY29uc3QgJXMqIHBJblN0cnVjdCk7XG4iICUgKGNsYXNzX25hbWUsIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICByZXR1cm4gIiIuam9pbihjb25zdHJ1Y3RvcnMpCisKKyAgICBkZWYgX2dlbmVyYXRlRGVzdHJ1Y3RvckRlY2xhcmF0aW9ucyhzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuICIgICAgdmlydHVhbCB+JXMoKTtcbiIgJSBzZWxmLmdldF9jbGFzc19uYW1lKHMpCisKKyAgICBkZWYgX2dlbmVyYXRlRGlzcGxheURlY2xhcmF0aW9ucyhzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuICIgICAgdm9pZCBkaXNwbGF5X3R4dCgpO1xuICAgIHZvaWQgZGlzcGxheV9zaW5nbGVfdHh0KCk7XG4gICAgdm9pZCBkaXNwbGF5X2Z1bGxfdHh0KCk7XG4iCisKKyAgICBkZWYgX2dlbmVyYXRlR2V0U2V0RGVjbGFyYXRpb25zKHNlbGYsIHMpOgorICAgICAgICBnZXRfc2V0ID0gW10KKyAgICAgICAgZ2V0X3NldC5hcHBlbmQoIiAgICB2b2lkIHNldF9pbmRlbnQodWludDMyX3QgaW5kZW50KSB7IG1faW5kZW50ID0gaW5kZW50OyB9XG4iKQorICAgICAgICBmb3IgbWVtYmVyIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0W3NdKToKKyAgICAgICAgICAgICMgVE9ETyA6IFNraXBwaW5nIGFycmF5IHNldC9nZXQgZnVuY3MgZm9yIG5vdworICAgICAgICAgICAgaWYgc2VsZi5zdHJ1Y3RfZGljdFtzXVttZW1iZXJdWydhcnJheSddOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBnZXRfc2V0LmFwcGVuZCgiICAgICVzIGdldF8lcygpIHsgcmV0dXJuIG1fc3RydWN0LiVzOyB9XG4iICUgKHNlbGYuc3RydWN0X2RpY3Rbc11bbWVtYmVyXVsnZnVsbF90eXBlJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbWVtYmVyXVsnbmFtZSddLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21lbWJlcl1bJ25hbWUnXSkpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zdHJ1Y3RfZGljdFtzXVttZW1iZXJdWydjb25zdCddOgorICAgICAgICAgICAgICAgIGdldF9zZXQuYXBwZW5kKCIgICAgdm9pZCBzZXRfJXMoJXMgaW5WYWx1ZSkgeyBtX3N0cnVjdC4lcyA9IGluVmFsdWU7IH1cbiIgJSAoc2VsZi5zdHJ1Y3RfZGljdFtzXVttZW1iZXJdWyduYW1lJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbWVtYmVyXVsnZnVsbF90eXBlJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbWVtYmVyXVsnbmFtZSddKSkKKyAgICAgICAgcmV0dXJuICIiLmpvaW4oZ2V0X3NldCkKKworICAgIGRlZiBfZ2VuZXJhdGVQcml2YXRlTWVtYmVycyhzZWxmLCBzKToKKyAgICAgICAgcHJpdiA9IFtdCisgICAgICAgIHByaXYuYXBwZW5kKCJcbnByaXZhdGU6XG4iKQorICAgICAgICBwcml2LmFwcGVuZCgiICAgICVzIG1fc3RydWN0O1xuIiAlIHR5cGVkZWZfZndkX2RpY3Rbc10pCisgICAgICAgIHByaXYuYXBwZW5kKCIgICAgY29uc3QgJXMqIG1fb3JpZ1N0cnVjdEFkZHI7XG4iICUgdHlwZWRlZl9md2RfZGljdFtzXSkKKyAgICAgICAgcHJpdi5hcHBlbmQoIiAgICB1aW50MzJfdCBtX2luZGVudDtcbiIpCisgICAgICAgIHByaXYuYXBwZW5kKCIgICAgY29uc3QgY2hhciBtX2R1bW15X3ByZWZpeDtcbiIpCisgICAgICAgIHByaXYuYXBwZW5kKCIgICAgdm9pZCBkaXNwbGF5X3N0cnVjdF9tZW1iZXJzKCk7XG4iKQorICAgICAgICByZXR1cm4gIiIuam9pbihwcml2KQorCisgICAgZGVmIF9nZW5lcmF0ZUNsYXNzRGVjbGFyYXRpb24oc2VsZik6CisgICAgICAgIGNsYXNzX2RlY2wgPSBbXQorICAgICAgICBmb3IgcyBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdCk6CisgICAgICAgICAgICBjbGFzc19kZWNsLmFwcGVuZCgiXG4vL2NsYXNzIGRlY2xhcmF0aW9uIikKKyAgICAgICAgICAgIGNsYXNzX2RlY2wuYXBwZW5kKCJjbGFzcyAlc1xue1xucHVibGljOiIgJSBzZWxmLmdldF9jbGFzc19uYW1lKHMpKQorICAgICAgICAgICAgY2xhc3NfZGVjbC5hcHBlbmQoc2VsZi5fZ2VuZXJhdGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9ucyhzKSkKKyAgICAgICAgICAgIGNsYXNzX2RlY2wuYXBwZW5kKHNlbGYuX2dlbmVyYXRlRGVzdHJ1Y3RvckRlY2xhcmF0aW9ucyhzKSkKKyAgICAgICAgICAgIGNsYXNzX2RlY2wuYXBwZW5kKHNlbGYuX2dlbmVyYXRlRGlzcGxheURlY2xhcmF0aW9ucyhzKSkKKyAgICAgICAgICAgIGNsYXNzX2RlY2wuYXBwZW5kKHNlbGYuX2dlbmVyYXRlR2V0U2V0RGVjbGFyYXRpb25zKHMpKQorICAgICAgICAgICAgY2xhc3NfZGVjbC5hcHBlbmQoc2VsZi5fZ2VuZXJhdGVQcml2YXRlTWVtYmVycyhzKSkKKyAgICAgICAgICAgIGNsYXNzX2RlY2wuYXBwZW5kKCJ9O1xuIikKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihjbGFzc19kZWNsKQorCisgICAgZGVmIF9nZW5lcmF0ZUZvb3RlcihzZWxmKToKKyAgICAgICAgcmV0dXJuICJcbi8vYW55IGZvb3RlciBpbmZvIGZvciBjbGFzc1xuIgorCisgICAgZGVmIF9nZXRTYWZlU3RydWN0TmFtZShzZWxmLCBzdHJ1Y3QpOgorICAgICAgICByZXR1cm4gInNhZmVfJXMiICUgKHN0cnVjdCkKKworICAgICMgSWYgc3RydWN0IGhhcyBzVHlwZSBvciBwdHIgbWVtYmVycywgZ2VuZXJhdGUgc2FmZSB0eXBlCisgICAgZGVmIF9oYXNTYWZlU3RydWN0KHNlbGYsIHMpOgorICAgICAgICBleGNlcHRpb25zID0gWydWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMnLCAnVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8nLCAnVmtEZWJ1Z01hcmtlck1hcmtlckluZm9FWFQnXQorICAgICAgICBpZiBzIGluIGV4Y2VwdGlvbnMgb3Igbm90IHNlbGYuc3RydWN0X2RpY3Rbc106CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgJ3NUeXBlJyA9PSBzZWxmLnN0cnVjdF9kaWN0W3NdWzBdWyduYW1lJ106CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBmb3IgbSBpbiBzZWxmLnN0cnVjdF9kaWN0W3NdOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsncHRyJ106CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX2dlbmVyYXRlU2FmZVN0cnVjdEhlYWRlcihzZWxmKToKKyAgICAgICAgaGVhZGVyID0gW10KKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiLy8jaW5jbHVkZXMsICNkZWZpbmVzLCBnbG9iYWxzIGFuZCBzdWNoLi4uXG4iKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcjcHJhZ21hIG9uY2VcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyNpbmNsdWRlICJ2dWxrYW4vdnVsa2FuLmgiJykKKyAgICAgICAgcmV0dXJuICIiLmpvaW4oaGVhZGVyKQorCisgICAgIyBJZiBnaXZlbiB0eSBpcyBpbiBvYmogbGlzdCwgb3IgaXMgYSBzdHJ1Y3QgdGhhdCBjb250YWlucyBhbnl0aGluZyBpbiBvYmogbGlzdCwgcmV0dXJuIFRydWUKKyAgICBkZWYgX3R5cGVIYXNPYmplY3Qoc2VsZiwgdHksIG9iaik6CisgICAgICAgIGlmIHR5IGluIG9iajoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGlzX3R5cGUodHksICdzdHJ1Y3QnKToKKyAgICAgICAgICAgIGZvciBtIGluIHNlbGYuc3RydWN0X2RpY3RbdHldOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RydWN0X2RpY3RbdHldW21dWyd0eXBlJ10gaW4gb2JqOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfZ2VuZXJhdGVTYWZlU3RydWN0RGVjbHMoc2VsZik6CisgICAgICAgIHNzX2RlY2xzID0gW10KKyAgICAgICAgZm9yIHMgaW4gc3RydWN0X29yZGVyX2xpc3Q6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5faGFzU2FmZVN0cnVjdChzKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgcyBpbiBpZmRlZl9kaWN0OgorICAgICAgICAgICAgICAgIHNzX2RlY2xzLmFwcGVuZCgnI2lmZGVmICVzJyAlIGlmZGVmX2RpY3Rbc10pCisgICAgICAgICAgICBzc19uYW1lID0gc2VsZi5fZ2V0U2FmZVN0cnVjdE5hbWUocykKKyAgICAgICAgICAgIHNzX2RlY2xzLmFwcGVuZCgiXG5zdHJ1Y3QgJXMgeyIgJSAoc3NfbmFtZSkpCisgICAgICAgICAgICBmb3IgbSBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdFtzXSk6CisgICAgICAgICAgICAgICAgbV90eXBlID0gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddCisgICAgICAgICAgICAgICAgaWYgaXNfdHlwZShtX3R5cGUsICdzdHJ1Y3QnKSBhbmQgc2VsZi5faGFzU2FmZVN0cnVjdChtX3R5cGUpOgorICAgICAgICAgICAgICAgICAgICBtX3R5cGUgPSBzZWxmLl9nZXRTYWZlU3RydWN0TmFtZShtX3R5cGUpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddICE9IDAgYW5kIG5vdCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydkeW5fYXJyYXknXToKKyAgICAgICAgICAgICAgICAgICAgc3NfZGVjbHMuYXBwZW5kKCIgICAgJXMgJXNbJXNdOyIgJSAobV90eXBlLCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10sIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ2FycmF5X3NpemUnXSkpCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydwdHInXSBhbmQgJ3NhZmVfJyBub3QgaW4gbV90eXBlIGFuZCBub3Qgc2VsZi5fdHlwZUhhc09iamVjdChtX3R5cGUsIHZ1bGthbi5vYmplY3Rfbm9uX2Rpc3BhdGNoX2xpc3QpOiNtX3R5cGUgaW4gWydjaGFyJywgJ2Zsb2F0JywgJ3VpbnQzMl90JywgJ3ZvaWQnLCAnVmtQaHlzaWNhbERldmljZUZlYXR1cmVzJ106ICMgV2UnbGwgbmV2ZXIgb3ZlcndyaXRlIGNoYXIqIHNvIGl0IGNhbiByZW1haW4gY29uc3QKKyAgICAgICAgICAgICAgICAgICAgc3NfZGVjbHMuYXBwZW5kKCIgICAgJXMgJXM7IiAlIChzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydmdWxsX3R5cGUnXSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ2FycmF5J106CisgICAgICAgICAgICAgICAgICAgIHNzX2RlY2xzLmFwcGVuZCgiICAgICVzKiAlczsiICUgKG1fdHlwZSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3B0ciddOgorICAgICAgICAgICAgICAgICAgICBzc19kZWNscy5hcHBlbmQoIiAgICAlcyogJXM7IiAlIChtX3R5cGUsIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3NfZGVjbHMuYXBwZW5kKCIgICAgJXMgJXM7IiAlIChtX3R5cGUsIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSkpCisgICAgICAgICAgICBzc19kZWNscy5hcHBlbmQoIiAgICAlcyhjb25zdCAlcyogcEluU3RydWN0KTsiICUgKHNzX25hbWUsIHMpKQorICAgICAgICAgICAgc3NfZGVjbHMuYXBwZW5kKCIgICAgJXMoY29uc3QgJXMmIHNyYyk7IiAlIChzc19uYW1lLCBzc19uYW1lKSkgIyBDb3B5IGNvbnN0cnVjdG9yCisgICAgICAgICAgICBzc19kZWNscy5hcHBlbmQoIiAgICAlcygpOyIgJSAoc3NfbmFtZSkpICMgRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgc3NfZGVjbHMuYXBwZW5kKCIgICAgfiVzKCk7IiAlIChzc19uYW1lKSkKKyAgICAgICAgICAgIHNzX2RlY2xzLmFwcGVuZCgiICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCAlcyogcEluU3RydWN0KTsiICUgKHMpKQorICAgICAgICAgICAgc3NfZGVjbHMuYXBwZW5kKCIgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0ICVzKiBzcmMpOyIgJSAoc3NfbmFtZSkpCisgICAgICAgICAgICBzc19kZWNscy5hcHBlbmQoIiAgICAlcyAqcHRyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDwlcyAqPih0aGlzKTsgfSIgJSAocywgcykpCisgICAgICAgICAgICBzc19kZWNscy5hcHBlbmQoIiAgICAlcyBjb25zdCAqcHRyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDwlcyBjb25zdCAqPih0aGlzKTsgfSIgJSAocywgcykpCisgICAgICAgICAgICBzc19kZWNscy5hcHBlbmQoIn07IikKKyAgICAgICAgICAgIGlmIHMgaW4gaWZkZWZfZGljdDoKKyAgICAgICAgICAgICAgICBzc19kZWNscy5hcHBlbmQoJyNlbmRpZicpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oc3NfZGVjbHMpCisKKyAgICBkZWYgX2dlbmVyYXRlU2FmZVN0cnVjdFNvdXJjZUhlYWRlcihzZWxmKToKKyAgICAgICAgaGVhZGVyID0gW10KKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiLy8jaW5jbHVkZXMsICNkZWZpbmVzLCBnbG9iYWxzIGFuZCBzdWNoLi4uXG4iKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcjaW5jbHVkZSAidmtfc2FmZV9zdHJ1Y3QuaCJcbiNpbmNsdWRlIDxzdHJpbmcuaD5cblxuJykKKyAgICAgICAgcmV0dXJuICIiLmpvaW4oaGVhZGVyKQorCisgICAgZGVmIF9nZW5lcmF0ZVNhZmVTdHJ1Y3RTb3VyY2Uoc2VsZik6CisgICAgICAgIHNzX3NyYyA9IFtdCisgICAgICAgIGZvciBzIGluIHN0cnVjdF9vcmRlcl9saXN0OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc1NhZmVTdHJ1Y3Qocyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHMgaW4gaWZkZWZfZGljdDoKKyAgICAgICAgICAgICAgICBzc19zcmMuYXBwZW5kKCcjaWZkZWYgJXMnICUgaWZkZWZfZGljdFtzXSkKKyAgICAgICAgICAgIHNzX25hbWUgPSBzZWxmLl9nZXRTYWZlU3RydWN0TmFtZShzKQorICAgICAgICAgICAgaW5pdF9saXN0ID0gJycgIyBsaXN0IG9mIG1lbWJlcnMgaW4gc3RydWN0IGNvbnN0cnVjdG9yIGluaXRpYWxpemVyCisgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ID0gJycgIyBUeHQgZm9yIGluaXRpYWxpemUoKSBmdW5jdGlvbiB0aGF0IHRha2VzIHN0cnVjdCBwdHIgYW5kIGluaXRzIG1lbWJlcnMKKyAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgPSAnJyAjIEJvZHkgb2YgY29uc3R1Y3RvciBhcyB3ZWxsIGFzIGJvZHkgb2YgaW5pdGlhbGl6ZSgpIGZ1bmMgZm9sbG93aW5nIGluaXRfZnVuY190eHQKKyAgICAgICAgICAgIGRlc3RydWN0X3R4dCA9ICcnCisgICAgICAgICAgICAjIFZrV3JpdGVEZXNjcmlwdG9yU2V0IGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlIHBvaW50ZXJzIG1heSBiZSBub24tbnVsbCBidXQgaWdub3JlZAorICAgICAgICAgICAgIyBUT0RPIDogVGhpcyBpcyB1Z2x5LCBmaWd1cmUgb3V0IGJldHRlciB3YXkgdG8gZG8gdGhpcworICAgICAgICAgICAgY3VzdG9tX2NvbnN0cnVjdF90eHQgPSB7J1ZrV3JpdGVEZXNjcmlwdG9yU2V0JyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHN3aXRjaCAoZGVzY3JpcHRvclR5cGUpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfSU1BR0U6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgaWYgKGRlc2NyaXB0b3JDb3VudCAmJiBwSW5TdHJ1Y3QtPnBJbWFnZUluZm8pIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBwSW1hZ2VJbmZvID0gbmV3IFZrRGVzY3JpcHRvckltYWdlSW5mb1tkZXNjcmlwdG9yQ291bnRdO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaT0wOyBpPGRlc2NyaXB0b3JDb3VudDsgKytpKSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIHBJbWFnZUluZm9baV0gPSBwSW5TdHJ1Y3QtPnBJbWFnZUluZm9baV07XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgYnJlYWs7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBpZiAoZGVzY3JpcHRvckNvdW50ICYmIHBJblN0cnVjdC0+cEJ1ZmZlckluZm8pIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBwQnVmZmVySW5mbyA9IG5ldyBWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvW2Rlc2NyaXB0b3JDb3VudF07XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8ZGVzY3JpcHRvckNvdW50OyArK2kpIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgcEJ1ZmZlckluZm9baV0gPSBwSW5TdHJ1Y3QtPnBCdWZmZXJJbmZvW2ldO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9URVhFTF9CVUZGRVI6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGlmIChkZXNjcmlwdG9yQ291bnQgJiYgcEluU3RydWN0LT5wVGV4ZWxCdWZmZXJWaWV3KSB7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgcFRleGVsQnVmZmVyVmlldyA9IG5ldyBWa0J1ZmZlclZpZXdbZGVzY3JpcHRvckNvdW50XTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaTxkZXNjcmlwdG9yQ291bnQ7ICsraSkge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBwVGV4ZWxCdWZmZXJWaWV3W2ldID0gcEluU3RydWN0LT5wVGV4ZWxCdWZmZXJWaWV3W2ldO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgZGVmYXVsdDpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB9XG4nfQorICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi5zdHJ1Y3RfZGljdFtzXToKKyAgICAgICAgICAgICAgICBtX25hbWUgPSBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ10KKyAgICAgICAgICAgICAgICBtX3R5cGUgPSBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyd0eXBlJ10KKyAgICAgICAgICAgICAgICBpZiBpc190eXBlKG1fdHlwZSwgJ3N0cnVjdCcpIGFuZCBzZWxmLl9oYXNTYWZlU3RydWN0KG1fdHlwZSk6CisgICAgICAgICAgICAgICAgICAgIG1fdHlwZSA9IHNlbGYuX2dldFNhZmVTdHJ1Y3ROYW1lKG1fdHlwZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydwdHInXSBhbmQgJ3NhZmVfJyBub3QgaW4gbV90eXBlIGFuZCBub3Qgc2VsZi5fdHlwZUhhc09iamVjdChtX3R5cGUsIHZ1bGthbi5vYmplY3Rfbm9uX2Rpc3BhdGNoX2xpc3QpOiMgaW4gWydjaGFyJywgJ2Zsb2F0JywgJ3VpbnQzMl90JywgJ3ZvaWQnLCAnVmtQaHlzaWNhbERldmljZUZlYXR1cmVzJ10pIG9yICdwcCcgPT0gc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnbmFtZSddWzA6MV06CisgICAgICAgICAgICAgICAgICAgICMgUHRyIHR5cGVzIHcvbyBhIHNhZmVfc3RydWN0LCBmb3Igbm9uLW51bGwgY2FzZSBuZWVkIHRvIGFsbG9jYXRlIG5ldyBwdHIgYW5kIGNvcHkgZGF0YSBpbgorICAgICAgICAgICAgICAgICAgICBpZiAnS0hSJyBpbiBzc19uYW1lIG9yIG1fdHlwZSBpbiBbJ3ZvaWQnLCAnY2hhciddOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3IgdGhlc2UgZXhjZXB0aW9ucyBqdXN0IGNvcHkgaW5pdGlhbCB2YWx1ZSBvdmVyIGZvciBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG5cdCVzKHBJblN0cnVjdC0+JXMpLCcgJSAobV9uYW1lLCBtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ICs9ICcgICAgJXMgPSBwSW5TdHJ1Y3QtPiVzO1xuJyAlIChtX25hbWUsIG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG5cdCVzKG51bGxwdHIpLCcgJSAobV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jX3R4dCArPSAnICAgICVzID0gbnVsbHB0cjtcbicgJSAobV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3BOZXh0JyAhPSBtX25hbWUgYW5kICd2b2lkJyBub3QgaW4gbV90eXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydhcnJheSddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKHBJblN0cnVjdC0+JXMpIHtcbicgJSAobV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICVzID0gbmV3ICVzKCpwSW5TdHJ1Y3QtPiVzKTtcbicgJSAobV9uYW1lLCBtX3R5cGUsIG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzKVxuJyAlIChtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGUgJXM7XG4nICUgKG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOiAjIG5ldyBhcnJheSBhbmQgdGhlbiBpbml0IGVhY2ggZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKHBJblN0cnVjdC0+JXMpIHtcbicgJSAobV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgICVzID0gbmV3ICVzW3BJblN0cnVjdC0+JXNdO1xuJyAlIChtX25hbWUsIG1fdHlwZSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29uc3RydWN0X3R4dCArPSAnICAgICAgICBzdGQ6OmNvcHkgKHBJblN0cnVjdC0+JXMsIHBJblN0cnVjdC0+JXMrcEluU3RydWN0LT4lcywgJXMpO1xuJyAlIChtX25hbWUsIG1fbmFtZSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddLCBtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgbWVtY3B5ICgodm9pZCAqKSVzLCAodm9pZCAqKXBJblN0cnVjdC0+JXMsIHNpemVvZiglcykqcEluU3RydWN0LT4lcyk7XG4nICUgKG1fbmFtZSwgbV9uYW1lLCBtX3R5cGUsIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ2FycmF5X3NpemUnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzKVxuJyAlIChtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGVbXSAlcztcbicgJSAobV9uYW1lKQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXknXToKKyAgICAgICAgICAgICAgICAgICAgIyBJbml0IGFycmF5IHB0ciB0byBOVUxMCisgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG5cdCVzKE5VTEwpLCcgJSAobV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ICs9ICcgICAgJXMgPSBOVUxMO1xuJyAlIChtX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGFycmF5X2VsZW1lbnQgPSAncEluU3RydWN0LT4lc1tpXScgJSAobV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBpc190eXBlKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgJ3N0cnVjdCcpIGFuZCBzZWxmLl9oYXNTYWZlU3RydWN0KHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSk6CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9lbGVtZW50ID0gJyVzKCZwSW5TdHJ1Y3QtPiVzW2ldKScgJSAoc2VsZi5fZ2V0U2FmZVN0cnVjdE5hbWUoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsndHlwZSddKSwgbV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzICYmIHBJblN0cnVjdC0+JXMpIHtcbicgJSAoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddLCBtX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgJXMgPSBuZXcgJXNbJXNdO1xuJyAlIChtX25hbWUsIG1fdHlwZSwgc2VsZi5zdHJ1Y3RfZGljdFtzXVttXVsnYXJyYXlfc2l6ZSddKQorICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdF90eHQgKz0gJyAgICBpZiAoJXMpXG4nICUgKG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgICAgIGRlbGV0ZVtdICVzO1xuJyAlIChtX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgKz0gJyAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8JXM7ICsraSkge1xuJyAlIChzZWxmLnN0cnVjdF9kaWN0W3NdW21dWydhcnJheV9zaXplJ10pCisgICAgICAgICAgICAgICAgICAgIGlmICdzYWZlXycgaW4gbV90eXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgICAgICAgICAgJXNbaV0uaW5pdGlhbGl6ZSgmcEluU3RydWN0LT4lc1tpXSk7XG4nICUgKG1fbmFtZSwgbV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgICAgICAgICAgJXNbaV0gPSAlcztcbicgJSAobV9uYW1lLCBhcnJheV9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIH1cbicKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3B0ciddOgorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKHBJblN0cnVjdC0+JXMpXG4nICUgKG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgICAgICAlcyA9IG5ldyAlcyhwSW5TdHJ1Y3QtPiVzKTtcbicgJSAobV9uYW1lLCBtX3R5cGUsIG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0X3R4dCArPSAnICAgICAgICAlcyA9IE5VTEw7XG4nICUgKG1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RfdHh0ICs9ICcgICAgaWYgKCVzKVxuJyAlIChtX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlc3RydWN0X3R4dCArPSAnICAgICAgICBkZWxldGUgJXM7XG4nICUgKG1fbmFtZSkKKyAgICAgICAgICAgICAgICBlbGlmICdzYWZlXycgaW4gbV90eXBlOiAjIGlubGluZSBzdHJ1Y3QsIG5lZWQgdG8gcGFzcyBpbiByZWZlcmVuY2UgZm9yIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIGluaXRfbGlzdCArPSAnXG5cdCVzKCZwSW5TdHJ1Y3QtPiVzKSwnICUgKG1fbmFtZSwgbV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ICs9ICcgICAgICAgICVzLmluaXRpYWxpemUoJnBJblN0cnVjdC0+JXMpO1xuJyAlIChtX25hbWUsIG1fbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpbml0X2xpc3QgKz0gJ1xuXHQlcyhwSW5TdHJ1Y3QtPiVzKSwnICUgKG1fbmFtZSwgbV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBpbml0X2Z1bmNfdHh0ICs9ICcgICAgJXMgPSBwSW5TdHJ1Y3QtPiVzO1xuJyAlIChtX25hbWUsIG1fbmFtZSkKKyAgICAgICAgICAgIGlmICcnICE9IGluaXRfbGlzdDoKKyAgICAgICAgICAgICAgICBpbml0X2xpc3QgPSBpbml0X2xpc3RbOi0xXSAjIGhhY2sgb2ZmIGZpbmFsIGNvbW1hCisgICAgICAgICAgICBpZiBzIGluIGN1c3RvbV9jb25zdHJ1Y3RfdHh0OgorICAgICAgICAgICAgICAgIGNvbnN0cnVjdF90eHQgPSBjdXN0b21fY29uc3RydWN0X3R4dFtzXQorICAgICAgICAgICAgc3Nfc3JjLmFwcGVuZCgiXG4lczo6JXMoY29uc3QgJXMqIHBJblN0cnVjdCkgOiAlc1xue1xuJXN9IiAlIChzc19uYW1lLCBzc19uYW1lLCBzLCBpbml0X2xpc3QsIGNvbnN0cnVjdF90eHQpKQorICAgICAgICAgICAgc3Nfc3JjLmFwcGVuZCgiXG4lczo6JXMoKSB7fSIgJSAoc3NfbmFtZSwgc3NfbmFtZSkpCisgICAgICAgICAgICAjIENyZWF0ZSBzbGlnaHQgdmFyaWF0aW9uIG9mIGluaXQgYW5kIGNvbnN0cnVjdCB0eHQgZm9yIGNvcHkgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNyYyBvYmplY3QgcmVmZXJlbmNlIHZzLiBzdHJ1Y3QgcHRyCisgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdF9pbml0ID0gaW5pdF9mdW5jX3R4dC5yZXBsYWNlKCdwSW5TdHJ1Y3QtPicsICdzcmMuJykKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0X3R4dCA9IGNvbnN0cnVjdF90eHQucmVwbGFjZSgnIChwSW5TdHJ1Y3QtPicsICcgKHNyYy4nKSAjIEV4Y2x1ZGUgJ2lmJyBibG9ja3MgZnJvbSBuZXh0IGxpbmUKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0X3R4dCA9IGNvcHlfY29uc3RydWN0X3R4dC5yZXBsYWNlKCcocEluU3RydWN0LT4nLCAnKCpzcmMuJykgIyBQYXNzIG9iamVjdCB0byBjb3B5IGNvbnN0cnVjdG9ycworICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RfdHh0ID0gY29weV9jb25zdHJ1Y3RfdHh0LnJlcGxhY2UoJ3BJblN0cnVjdC0+JywgJ3NyYy4nKSAjIE1vZGlmeSByZW1haW5pbmcgc3RydWN0IHJlZnMgZm9yIHNyYyBvYmplY3QKKyAgICAgICAgICAgIHNzX3NyYy5hcHBlbmQoIlxuJXM6OiVzKGNvbnN0ICVzJiBzcmMpXG57XG4lcyVzfSIgJSAoc3NfbmFtZSwgc3NfbmFtZSwgc3NfbmFtZSwgY29weV9jb25zdHJ1Y3RfaW5pdCwgY29weV9jb25zdHJ1Y3RfdHh0KSkgIyBDb3B5IGNvbnN0cnVjdG9yCisgICAgICAgICAgICBzc19zcmMuYXBwZW5kKCJcbiVzOjp+JXMoKVxue1xuJXN9IiAlIChzc19uYW1lLCBzc19uYW1lLCBkZXN0cnVjdF90eHQpKQorICAgICAgICAgICAgc3Nfc3JjLmFwcGVuZCgiXG52b2lkICVzOjppbml0aWFsaXplKGNvbnN0ICVzKiBwSW5TdHJ1Y3QpXG57XG4lcyVzfSIgJSAoc3NfbmFtZSwgcywgaW5pdF9mdW5jX3R4dCwgY29uc3RydWN0X3R4dCkpCisgICAgICAgICAgICAjIENvcHkgaW5pdGlhbGl6ZXIgdXNlcyBzYW1lIHR4dCBhcyBjb3B5IGNvbnN0cnVjdG9yIGJ1dCBoYXMgYSBwdHIgYW5kIG5vdCBhIHJlZmVyZW5jZQorICAgICAgICAgICAgaW5pdF9jb3B5ID0gY29weV9jb25zdHJ1Y3RfaW5pdC5yZXBsYWNlKCdzcmMuJywgJ3NyYy0+JykKKyAgICAgICAgICAgIGluaXRfY29uc3RydWN0ID0gY29weV9jb25zdHJ1Y3RfdHh0LnJlcGxhY2UoJ3NyYy4nLCAnc3JjLT4nKQorICAgICAgICAgICAgc3Nfc3JjLmFwcGVuZCgiXG52b2lkICVzOjppbml0aWFsaXplKGNvbnN0ICVzKiBzcmMpXG57XG4lcyVzfSIgJSAoc3NfbmFtZSwgc3NfbmFtZSwgaW5pdF9jb3B5LCBpbml0X2NvbnN0cnVjdCkpCisgICAgICAgICAgICBpZiBzIGluIGlmZGVmX2RpY3Q6CisgICAgICAgICAgICAgICAgc3Nfc3JjLmFwcGVuZCgnI2VuZGlmJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihzc19zcmMpCisKK2NsYXNzIEVudW1Db2RlR2VuOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnVtX3R5cGVfZGljdD1Ob25lLCBlbnVtX3ZhbF9kaWN0PU5vbmUsIHR5cGVkZWZfZndkX2RpY3Q9Tm9uZSwgaW5fZmlsZT1Ob25lLCBvdXRfc2hfZmlsZT1Ob25lLCBvdXRfdmhfZmlsZT1Ob25lKToKKyAgICAgICAgc2VsZi5ldF9kaWN0ID0gZW51bV90eXBlX2RpY3QKKyAgICAgICAgc2VsZi5ldl9kaWN0ID0gZW51bV92YWxfZGljdAorICAgICAgICBzZWxmLnRmX2RpY3QgPSB0eXBlZGVmX2Z3ZF9kaWN0CisgICAgICAgIHNlbGYuaW5fZmlsZSA9IGluX2ZpbGUKKyAgICAgICAgc2VsZi5vdXRfc2hfZmlsZSA9IG91dF9zaF9maWxlCisgICAgICAgIHNlbGYuZXNoZmcgPSBDb21tb25GaWxlR2VuKHNlbGYub3V0X3NoX2ZpbGUpCisgICAgICAgIHNlbGYub3V0X3ZoX2ZpbGUgPSBvdXRfdmhfZmlsZQorICAgICAgICBzZWxmLmV2aGZnID0gQ29tbW9uRmlsZUdlbihzZWxmLm91dF92aF9maWxlKQorCisgICAgZGVmIGdlbmVyYXRlU3RyaW5nSGVscGVyKHNlbGYpOgorICAgICAgICBzZWxmLmVzaGZnLnNldEhlYWRlcihzZWxmLl9nZW5lcmF0ZVNISGVhZGVyKCkpCisgICAgICAgIHNlbGYuZXNoZmcuc2V0Qm9keShzZWxmLl9nZW5lcmF0ZVNIQm9keSgpKQorICAgICAgICBzZWxmLmVzaGZnLmdlbmVyYXRlKCkKKworICAgIGRlZiBnZW5lcmF0ZUVudW1WYWxpZGF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5ldmhmZy5zZXRIZWFkZXIoc2VsZi5fZ2VuZXJhdGVTSEhlYWRlcigpKQorICAgICAgICBzZWxmLmV2aGZnLnNldEJvZHkoc2VsZi5fZ2VuZXJhdGVWSEJvZHkoKSkKKyAgICAgICAgc2VsZi5ldmhmZy5nZW5lcmF0ZSgpCisKKyAgICBkZWYgX2dlbmVyYXRlVkhCb2R5KHNlbGYpOgorICAgICAgICBib2R5ID0gW10KKyAgICAgICAgZm9yIGJldCBpbiBzb3J0ZWQoc2VsZi5ldF9kaWN0KToKKyAgICAgICAgICAgIGZldCA9IHNlbGYudGZfZGljdFtiZXRdCisgICAgICAgICAgICBib2R5LmFwcGVuZCgic3RhdGljIGlubGluZSB1aW50MzJfdCB2YWxpZGF0ZV8lcyglcyBpbnB1dF92YWx1ZSlcbnsiICUgKGZldCwgZmV0KSkKKyAgICAgICAgICAgICMgVE9ETyA6IFRoaXMgaXMgbm90IGlkZWFsLCBidXQgYWxsb3dzIGZvciBmbGFnIGNvbWJpbmF0aW9ucy4gTmVlZCBtb3JlIHJpZ29yb3VzIHZhbGlkYXRpb24gb2YgcmVhbGlzdGljIGZsYWcgY29tYmluYXRpb25zCisgICAgICAgICAgICBpZiAnZmxhZ2JpdHMnIGluIGJldC5sb3dlcigpOgorICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCcgICAgaWYgKGlucHV0X3ZhbHVlID4gKCVzKSknICUgKCcgfCAnLmpvaW4oc2VsZi5ldF9kaWN0W2JldF0pKSkKKyAgICAgICAgICAgICAgICBib2R5LmFwcGVuZCgnICAgICAgICByZXR1cm4gMDsnKQorICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCcgICAgcmV0dXJuIDE7JykKKyAgICAgICAgICAgICAgICBib2R5LmFwcGVuZCgnfVxuXG4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBib2R5LmFwcGVuZCgnICAgIHN3aXRjaCAoKCVzKWlucHV0X3ZhbHVlKVxuICAgIHsnICUgKGZldCkpCisgICAgICAgICAgICAgICAgZm9yIGUgaW4gc29ydGVkKHNlbGYuZXRfZGljdFtiZXRdKToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZfZGljdFtlXVsndW5pcXVlJ10pOgorICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoJyAgICAgICAgY2FzZSAlczonICUgKGUpKQorICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCcgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cblxuJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihib2R5KQorCisgICAgZGVmIF9nZW5lcmF0ZVNIQm9keShzZWxmKToKKyAgICAgICAgYm9keSA9IFtdCisjICAgICAgICB3aXRoIG9wZW4oc2VsZi5vdXRfZmlsZSwgImEiKSBhcyBoZjoKKyAgICAgICAgICAgICMgYmV0ID09IGJhc2VfZW51bV90eXBlLCBmZXQgPT0gZmluYWxfZW51bV90eXBlCisgICAgICAgIGZvciBiZXQgaW4gc29ydGVkKHNlbGYuZXRfZGljdCk6CisgICAgICAgICAgICBmZXQgPSBzZWxmLnRmX2RpY3RbYmV0XQorICAgICAgICAgICAgYm9keS5hcHBlbmQoInN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogc3RyaW5nXyVzKCVzIGlucHV0X3ZhbHVlKVxue1xuICAgIHN3aXRjaCAoKCVzKWlucHV0X3ZhbHVlKVxuICAgIHsiICUgKGZldCwgZmV0LCBmZXQpKQorICAgICAgICAgICAgZm9yIGUgaW4gc29ydGVkKHNlbGYuZXRfZGljdFtiZXRdKToKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldl9kaWN0W2VdWyd1bmlxdWUnXSk6CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKCcgICAgICAgIGNhc2UgJXM6XG4gICAgICAgICAgICByZXR1cm4gIiVzIjsnICUgKGUsIGUpKQorICAgICAgICAgICAgYm9keS5hcHBlbmQoJyAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAiVW5oYW5kbGVkICVzIjtcbiAgICB9XG59XG5cbicgJSAoZmV0KSkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihib2R5KQorCisgICAgZGVmIF9nZW5lcmF0ZVNISGVhZGVyKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBbXQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcjcHJhZ21hIG9uY2VcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyNpZmRlZiBfV0lOMzJcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQwNjUgKVxuJykKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgnI2VuZGlmXG4nKQorICAgICAgICBoZWFkZXIuYXBwZW5kKCcjaW5jbHVkZSA8dnVsa2FuLyVzPlxuXG5cbicgJSBzZWxmLmluX2ZpbGUpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaGVhZGVyKQorCisKK2NsYXNzIENNYWtlR2VuOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJ1Y3Rfd3JhcHBlcj1Ob25lLCBvdXRfZGlyPU5vbmUpOgorICAgICAgICBzZWxmLnN3ID0gc3RydWN0X3dyYXBwZXIKKyAgICAgICAgc2VsZi5pbmNsdWRlX2hlYWRlcnMgPSBbXQorICAgICAgICBzZWxmLmFkZF9saWJfZmlsZV9saXN0ID0gc2VsZi5zdy5nZXRfZmlsZV9saXN0KCkKKyAgICAgICAgc2VsZi5vdXRfZGlyID0gb3V0X2RpcgorICAgICAgICBzZWxmLm91dF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYub3V0X2RpciwgIkNNYWtlTGlzdHMudHh0IikKKyAgICAgICAgc2VsZi5jbWcgPSBDb21tb25GaWxlR2VuKHNlbGYub3V0X2ZpbGUpCisKKyAgICBkZWYgZ2VuZXJhdGUoc2VsZik6CisgICAgICAgIHNlbGYuY21nLnNldEJvZHkoc2VsZi5fZ2VuZXJhdGVCb2R5KCkpCisgICAgICAgIHNlbGYuY21nLmdlbmVyYXRlKCkKKworICAgIGRlZiBfZ2VuZXJhdGVCb2R5KHNlbGYpOgorICAgICAgICBib2R5ID0gW10KKyAgICAgICAgYm9keS5hcHBlbmQoInByb2plY3QoJXMpIiAlIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5vdXRfZGlyKSkKKyAgICAgICAgYm9keS5hcHBlbmQoImNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpXG4iKQorICAgICAgICBib2R5LmFwcGVuZCgiYWRkX2xpYnJhcnkoJHtQUk9KRUNUX05BTUV9ICVzKVxuIiAlICIgIi5qb2luKHNlbGYuYWRkX2xpYl9maWxlX2xpc3QpKQorICAgICAgICBib2R5LmFwcGVuZCgnc2V0KENPTVBJTEVfRkxBR1MgIi1mcGVybWlzc2l2ZSIpJykKKyAgICAgICAgYm9keS5hcHBlbmQoJ3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke0NPTVBJTEVfRkxBR1N9IilcbicpCisgICAgICAgIGJvZHkuYXBwZW5kKCJpbmNsdWRlX2RpcmVjdG9yaWVzKCR7U1JDX0RJUn0vdGhpcmRwYXJ0eS8ke0dFTl9BUEl9L2luYy8pXG4iKQorICAgICAgICBib2R5LmFwcGVuZCgidGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKCVzIFBVQkxJQyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pXG4iICUgb3MucGF0aC5iYXNlbmFtZShzZWxmLm91dF9kaXIpKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGJvZHkpCisKK2NsYXNzIEdyYXBoVml6R2VuOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJ1Y3RfZGljdCwgcHJlZml4LCBvdXRfZGlyKToKKyAgICAgICAgc2VsZi5zdHJ1Y3RfZGljdCA9IHN0cnVjdF9kaWN0CisgICAgICAgIHNlbGYuYXBpID0gcHJlZml4CisgICAgICAgIGlmIHByZWZpeCA9PSAidnVsa2FuIjoKKyAgICAgICAgICAgIHNlbGYuYXBpX3ByZWZpeCA9ICJ2ayIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXBpX3ByZWZpeCA9IHByZWZpeAorICAgICAgICBzZWxmLm91dF9maWxlID0gb3MucGF0aC5qb2luKG91dF9kaXIsIHNlbGYuYXBpX3ByZWZpeCsiX3N0cnVjdF9ncmFwaHZpel9oZWxwZXIuaCIpCisgICAgICAgIHNlbGYuZ3ZnID0gQ29tbW9uRmlsZUdlbihzZWxmLm91dF9maWxlKQorCisgICAgZGVmIGdlbmVyYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmd2Zy5zZXRDb3B5cmlnaHQoIi8vVGhpcyBpcyB0aGUgY29weXJpZ2h0XG4iKQorICAgICAgICBzZWxmLmd2Zy5zZXRIZWFkZXIoc2VsZi5fZ2VuZXJhdGVIZWFkZXIoKSkKKyAgICAgICAgc2VsZi5ndmcuc2V0Qm9keShzZWxmLl9nZW5lcmF0ZUJvZHkoKSkKKyAgICAgICAgI3NlbGYuZ3ZnLnNldEZvb3RlcignfScpCisgICAgICAgIHNlbGYuZ3ZnLmdlbmVyYXRlKCkKKworICAgIGRlZiBzZXRfaW5jbHVkZV9oZWFkZXJzKHNlbGYsIGluY2x1ZGVfaGVhZGVycyk6CisgICAgICAgIHNlbGYuaW5jbHVkZV9oZWFkZXJzID0gaW5jbHVkZV9oZWFkZXJzCisKKyAgICBkZWYgX2dlbmVyYXRlSGVhZGVyKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBbXQorICAgICAgICBoZWFkZXIuYXBwZW5kKCIvLyNpbmNsdWRlcywgI2RlZmluZXMsIGdsb2JhbHMgYW5kIHN1Y2guLi5cbiIpCisgICAgICAgIGZvciBmIGluIHNlbGYuaW5jbHVkZV9oZWFkZXJzOgorICAgICAgICAgICAgaWYgJ3ZrX2VudW1fc3RyaW5nX2hlbHBlcicgbm90IGluIGY6CisgICAgICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiI2luY2x1ZGUgPCVzPlxuIiAlIGYpCisgICAgICAgICNoZWFkZXIuYXBwZW5kKCcjaW5jbHVkZSAidmtfZW51bV9zdHJpbmdfaGVscGVyLmgiXG5cbi8vIEZ1bmN0aW9uIFByb3RvdHlwZXNcbicpCisgICAgICAgIGhlYWRlci5hcHBlbmQoIlxuY2hhciogZHluYW1pY19ndl9kaXNwbGF5KGNvbnN0IHZvaWQqIHBTdHJ1Y3QsIGNvbnN0IGNoYXIqIHByZWZpeCk7XG4iKQorICAgICAgICByZXR1cm4gIiIuam9pbihoZWFkZXIpCisKKyAgICBkZWYgX2dldF9ndl9mdW5jX25hbWUoc2VsZiwgc3RydWN0KToKKyAgICAgICAgcmV0dXJuICIlc19ndl9wcmludF8lcyIgJSAoc2VsZi5hcGlfcHJlZml4LCBzdHJ1Y3QubG93ZXIoKS5zdHJpcCgiXyIpKQorCisgICAgIyBSZXR1cm4gZWxlbWVudHMgdG8gY3JlYXRlIGZvcm1hdHRlZCBzdHJpbmcgZm9yIGdpdmVuIHN0cnVjdCBtZW1iZXIKKyAgICBkZWYgX2dldF9zdHJ1Y3RfZ3ZfcHJpbnRfZm9ybWF0dGVkKHNlbGYsIHN0cnVjdF9tZW1iZXIsIHByZV92YXJfbmFtZT0iIiwgcG9zdGZpeCA9ICJcXG4iLCBzdHJ1Y3RfdmFyX25hbWU9InBTdHJ1Y3QiLCBzdHJ1Y3RfcHRyPVRydWUsIHByaW50X2FycmF5PUZhbHNlLCBwb3J0X2xhYmVsPSIiKToKKyAgICAgICAgc3RydWN0X29wID0gIi0+IgorICAgICAgICBwcmVfdmFyX25hbWUgPSAnIiVzICInICUgc3RydWN0X21lbWJlclsnZnVsbF90eXBlJ10KKyAgICAgICAgaWYgbm90IHN0cnVjdF9wdHI6CisgICAgICAgICAgICBzdHJ1Y3Rfb3AgPSAiLiIKKyAgICAgICAgbWVtYmVyX25hbWUgPSBzdHJ1Y3RfbWVtYmVyWyduYW1lJ10KKyAgICAgICAgcHJpbnRfdHlwZSA9ICJwIgorICAgICAgICBjYXN0X3R5cGUgPSAiIgorICAgICAgICBtZW1iZXJfcG9zdCA9ICIiCisgICAgICAgIGFycmF5X2luZGV4ID0gIiIKKyAgICAgICAgbWVtYmVyX3ByaW50X3Bvc3QgPSAiIgorICAgICAgICBwcmludF9kZWxpbWl0ZXIgPSAiJSIKKyAgICAgICAgaWYgc3RydWN0X21lbWJlclsnYXJyYXknXSBhbmQgJ2NoYXInIGluIHN0cnVjdF9tZW1iZXJbJ3R5cGUnXS5sb3dlcigpOiAjIGp1c3QgcHJpbnQgY2hhciBhcnJheSBhcyBzdHJpbmcKKyAgICAgICAgICAgIHByaW50X3R5cGUgPSAicCIKKyAgICAgICAgICAgIHByaW50X2FycmF5ID0gRmFsc2UKKyAgICAgICAgZWxpZiBzdHJ1Y3RfbWVtYmVyWydhcnJheSddIGFuZCBub3QgcHJpbnRfYXJyYXk6CisgICAgICAgICAgICAjIEp1c3QgcHJpbnQgYmFzZSBhZGRyZXNzIG9mIGFycmF5IHdoZW4gbm90IGZ1bGwgcHJpbnRfYXJyYXkKKyAgICAgICAgICAgIGNhc3RfdHlwZSA9ICIodm9pZCopIgorICAgICAgICBlbGlmIGlzX3R5cGUoc3RydWN0X21lbWJlclsndHlwZSddLCAnZW51bScpOgorICAgICAgICAgICAgaWYgc3RydWN0X21lbWJlclsncHRyJ106CisgICAgICAgICAgICAgICAgc3RydWN0X3Zhcl9uYW1lID0gIioiICsgc3RydWN0X3Zhcl9uYW1lCisgICAgICAgICAgICAgICAgcHJpbnRfZGVsaW1pdGVyID0gIjB4JSIKKyAgICAgICAgICAgIGNhc3RfdHlwZSA9ICJzdHJpbmdfJXMiICUgc3RydWN0X21lbWJlclsndHlwZSddCisgICAgICAgICAgICBwcmludF90eXBlID0gInMiCisgICAgICAgIGVsaWYgaXNfdHlwZShzdHJ1Y3RfbWVtYmVyWyd0eXBlJ10sICdzdHJ1Y3QnKTogIyBwcmludCBzdHJ1Y3QgYWRkcmVzcyBmb3Igbm93CisgICAgICAgICAgICBjYXN0X3R5cGUgPSAiKHZvaWQqKSIKKyAgICAgICAgICAgIHByaW50X2RlbGltaXRlciA9ICIweCUiCisgICAgICAgICAgICBpZiBub3Qgc3RydWN0X21lbWJlclsncHRyJ106CisgICAgICAgICAgICAgICAgY2FzdF90eXBlID0gIih2b2lkKikmIgorICAgICAgICBlbGlmICdib29sJyBpbiBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ10ubG93ZXIoKToKKyAgICAgICAgICAgIHByaW50X3R5cGUgPSAicyIKKyAgICAgICAgICAgIG1lbWJlcl9wb3N0ID0gJyA/ICJUUlVFIiA6ICJGQUxTRSInCisgICAgICAgIGVsaWYgJ2Zsb2F0JyBpbiBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ106CisgICAgICAgICAgICBwcmludF90eXBlID0gImYiCisgICAgICAgIGVsaWYgJ3VpbnQ2NCcgaW4gc3RydWN0X21lbWJlclsndHlwZSddIG9yICdncHVzaXplJyBpbiBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ10ubG93ZXIoKToKKyAgICAgICAgICAgIHByaW50X3R5cGUgPSAnIiBQUklkNjQgIicKKyAgICAgICAgZWxpZiAndWludDgnIGluIHN0cnVjdF9tZW1iZXJbJ3R5cGUnXToKKyAgICAgICAgICAgIHByaW50X3R5cGUgPSAiaHUiCisgICAgICAgIGVsaWYgJ3NpemUnIGluIHN0cnVjdF9tZW1iZXJbJ3R5cGUnXS5sb3dlcigpOgorICAgICAgICAgICAgcHJpbnRfdHlwZSA9ICciIFBSSU5URl9TSVpFX1RfU1BFQ0lGSUVSICInCisgICAgICAgICAgICBwcmludF9kZWxpbWl0ZXIgPSAiIgorICAgICAgICBlbGlmIFRydWUgaW4gW3VpX3N0ci5sb3dlcigpIGluIHN0cnVjdF9tZW1iZXJbJ3R5cGUnXS5sb3dlcigpIGZvciB1aV9zdHIgaW4gWyd1aW50JywgJ2ZsYWdzJywgJ3NhbXBsZW1hc2snXV06CisgICAgICAgICAgICBwcmludF90eXBlID0gInUiCisgICAgICAgIGVsaWYgJ2ludCcgaW4gc3RydWN0X21lbWJlclsndHlwZSddOgorICAgICAgICAgICAgcHJpbnRfdHlwZSA9ICJpIgorICAgICAgICBlbGlmIHN0cnVjdF9tZW1iZXJbJ3B0ciddOgorICAgICAgICAgICAgcHJpbnRfZGVsaW1pdGVyID0gIjB4JSIKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNwcmludCgiVW5oYW5kbGVkIHN0cnVjdCB0eXBlOiAlcyIgJSBzdHJ1Y3RfbWVtYmVyWyd0eXBlJ10pCisgICAgICAgICAgICBwcmludF9kZWxpbWl0ZXIgPSAiMHglIgorICAgICAgICAgICAgY2FzdF90eXBlID0gIih2b2lkKikiCisgICAgICAgIGlmIHByaW50X2FycmF5IGFuZCBzdHJ1Y3RfbWVtYmVyWydhcnJheSddOgorICAgICAgICAgICAgbWVtYmVyX3ByaW50X3Bvc3QgPSAiWyV1XSIKKyAgICAgICAgICAgIGFycmF5X2luZGV4ID0gIiBpLCIKKyAgICAgICAgICAgIG1lbWJlcl9wb3N0ID0gIltpXSIKKyAgICAgICAgcHJpbnRfb3V0ID0gIjxUUj48VEQ+JSVzJXMlczwvVEQ+PFREJXM+JXMlcyVzPC9URD48L1RSPiIgJSAobWVtYmVyX25hbWUsIG1lbWJlcl9wcmludF9wb3N0LCBwb3J0X2xhYmVsLCBwcmludF9kZWxpbWl0ZXIsIHByaW50X3R5cGUsIHBvc3RmaXgpICMgc2VjdGlvbiBvZiBwcmludCB0aGF0IGdvZXMgaW5zaWRlIG9mIHF1b3RlcworICAgICAgICBwcmludF9hcmcgPSAiLCAlcywlcyAlcyglcyVzJXMpJXNcbiIgJSAocHJlX3Zhcl9uYW1lLCBhcnJheV9pbmRleCwgY2FzdF90eXBlLCBzdHJ1Y3RfdmFyX25hbWUsIHN0cnVjdF9vcCwgbWVtYmVyX25hbWUsIG1lbWJlcl9wb3N0KSAjIHNlY3Rpb24gb2YgcHJpbnQgcGFzc2VkIHRvIHBvcnRpb24gaW4gcXVvdGVzCisgICAgICAgIHJldHVybiAocHJpbnRfb3V0LCBwcmludF9hcmcpCisKKyAgICBkZWYgX2dlbmVyYXRlQm9keShzZWxmKToKKyAgICAgICAgZ3ZfZnVuY3MgPSBbXQorICAgICAgICBhcnJheV9mdW5jX2xpc3QgPSBbXSAjIHN0cnVjdHMgZm9yIHdoaWNoIHdlJ2xsIGdlbmVyYXRlIGFuIGFycmF5IHZlcnNpb24gb2YgdGhlaXIgcHJpbnQgZnVuY3Rpb24KKyAgICAgICAgYXJyYXlfZnVuY19saXN0LmFwcGVuZCgndmtidWZmZXJ2aWV3YXR0YWNoaW5mbycpCisgICAgICAgIGFycmF5X2Z1bmNfbGlzdC5hcHBlbmQoJ3ZraW1hZ2V2aWV3YXR0YWNoaW5mbycpCisgICAgICAgIGFycmF5X2Z1bmNfbGlzdC5hcHBlbmQoJ3Zrc2FtcGxlcmltYWdldmlld2luZm8nKQorICAgICAgICBhcnJheV9mdW5jX2xpc3QuYXBwZW5kKCd2a2Rlc2NyaXB0b3J0eXBlY291bnQnKQorICAgICAgICAjIEZvciBmaXJzdCBwYXNzLCBnZW5lcmF0ZSBwcm90b3R5cGUKKyAgICAgICAgZm9yIHMgaW4gc29ydGVkKHNlbGYuc3RydWN0X2RpY3QpOgorICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCdjaGFyKiAlcyhjb25zdCAlcyogcFN0cnVjdCwgY29uc3QgY2hhciogbXlOb2RlTmFtZSk7XG4nICUgKHNlbGYuX2dldF9ndl9mdW5jX25hbWUocyksIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICAgICAgaWYgcy5sb3dlcigpLnN0cmlwKCJfIikgaW4gYXJyYXlfZnVuY19saXN0OgorICAgICAgICAgICAgICAgIGlmIHMubG93ZXIoKS5zdHJpcCgiXyIpIGluIFsndmtidWZmZXJ2aWV3YXR0YWNoaW5mbycsICd2a2ltYWdldmlld2F0dGFjaGluZm8nXToKKyAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCdjaGFyKiAlc19hcnJheSh1aW50MzJfdCBjb3VudCwgY29uc3QgJXMqIGNvbnN0KiBwU3RydWN0LCBjb25zdCBjaGFyKiBteU5vZGVOYW1lKTtcbicgJSAoc2VsZi5fZ2V0X2d2X2Z1bmNfbmFtZShzKSwgdHlwZWRlZl9md2RfZGljdFtzXSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCdjaGFyKiAlc19hcnJheSh1aW50MzJfdCBjb3VudCwgY29uc3QgJXMqIHBTdHJ1Y3QsIGNvbnN0IGNoYXIqIG15Tm9kZU5hbWUpO1xuJyAlIChzZWxmLl9nZXRfZ3ZfZnVuY19uYW1lKHMpLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCdcbicpCisgICAgICAgIGZvciBzIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0KToKKyAgICAgICAgICAgIHBfb3V0ID0gIiIKKyAgICAgICAgICAgIHBfYXJncyA9ICIiCisgICAgICAgICAgICBzdHBfbGlzdCA9IFtdICMgc3RwID09ICJzdHJ1Y3QgdG8gcHJpbnQiIGEgbGlzdCBvZiBzdHJ1Y3RzIGZvciB0aGlzIEFQSSBjYWxsIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgYXMgc3RydWN0cworICAgICAgICAgICAgIyB0aGUgZmllbGRzIGJlbG93IGFyZSBhIHN1cGVyLWhhY2t5IHdheSBmb3Igbm93IHRvIGdldCBwb3J0IGxhYmVscyBpbnRvIEdWIG91dHB1dCwgVE9ETyA6IENsZWFuIHRoaXMgdXAhICAgICAgICAgICAgCisgICAgICAgICAgICBwbF9kaWN0ID0ge30KKyAgICAgICAgICAgIHN0cnVjdF9udW0gPSAwCisgICAgICAgICAgICAjIFRoaXMgaXNuJ3QgZ3JlYXQgYnV0IHRoaXMgcHJlLXBhc3MgZmxhZ3Mgc3RydWN0cyB3LyBwTmV4dCBhbmQgb3RoZXIgc3RydWN0IHB0cnMKKyAgICAgICAgICAgIGZvciBtIGluIHNvcnRlZChzZWxmLnN0cnVjdF9kaWN0W3NdKToKKyAgICAgICAgICAgICAgICBpZiAncE5leHQnID09IHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ25hbWUnXSBvciBpc190eXBlKHNlbGYuc3RydWN0X2RpY3Rbc11bbV1bJ3R5cGUnXSwgJ3N0cnVjdCcpOgorICAgICAgICAgICAgICAgICAgICBzdHBfbGlzdC5hcHBlbmQoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgJ3BOZXh0JyA9PSBzZWxmLnN0cnVjdF9kaWN0W3NdW21dWyduYW1lJ106CisgICAgICAgICAgICAgICAgICAgICAgICBwbF9kaWN0W21dID0gJyBQT1JUPVxcInBOZXh0XFwiJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGxfZGljdFttXSA9ICcgUE9SVD1cXCJzdHJ1Y3QlaVxcIicgJSBzdHJ1Y3RfbnVtCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9udW0gKz0gMQorICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCdjaGFyKiAlcyhjb25zdCAlcyogcFN0cnVjdCwgY29uc3QgY2hhciogbXlOb2RlTmFtZSlcbntcbiAgICBjaGFyKiBzdHI7XG4nICUgKHNlbGYuX2dldF9ndl9mdW5jX25hbWUocyksIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICAgICAgbnVtX3N0cHMgPSBsZW4oc3RwX2xpc3QpOworICAgICAgICAgICAgdG90YWxfc3RybGVuX3N0ciA9ICcnCisgICAgICAgICAgICBpZiAwICE9IG51bV9zdHBzOgorICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgiICAgIGNoYXIqIHRtcFN0cjtcbiIpCisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCIgICAgY2hhciBub2RlTmFtZVsxMDBdO1xuIikKKyAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBjaGFyKiBzdHBfc3Ryc1slaV07XG4nICUgbnVtX3N0cHMpCisgICAgICAgICAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKG51bV9zdHBzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cF9saXN0W2luZGV4XVsncHRyJ10pOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3BEZXNjcmlwdG9ySW5mbycgPT0gc3RwX2xpc3RbaW5kZXhdWyduYW1lJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgaWYgKHBTdHJ1Y3QtPnBEZXNjcmlwdG9ySW5mbyAmJiAoMCAhPSBwU3RydWN0LT5kZXNjcmlwdG9yQ291bnQpKSB7XG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBpZiAocFN0cnVjdC0+JXMpIHtcbicgJSBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICdwTmV4dCcgPT0gc3RwX2xpc3RbaW5kZXhdWyduYW1lJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNwcmludGYobm9kZU5hbWUsICJwTmV4dF8weCVwIiwgKHZvaWQqKXBTdHJ1Y3QtPnBOZXh0KTtcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIHRtcFN0ciA9IGR5bmFtaWNfZ3ZfZGlzcGxheSgodm9pZCopcFN0cnVjdC0+cE5leHQsIG5vZGVOYW1lKTtcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIHN0cF9zdHJzWyVpXSA9IChjaGFyKiltYWxsb2MoMjU2K3N0cmxlbih0bXBTdHIpK3N0cmxlbihub2RlTmFtZSkrc3RybGVuKG15Tm9kZU5hbWUpKTtcbicgJSBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICAgICAgc3ByaW50ZihzdHBfc3Ryc1slaV0sICIlJXNcXG5cXCIlJXNcXCI6cE5leHQgLT4gXFwiJSVzXFwiIFtdO1xcbiIsIHRtcFN0ciwgbXlOb2RlTmFtZSwgbm9kZU5hbWUpO1xuJyAlIGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgICAgICBmcmVlKHRtcFN0cik7XG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICAgICAgc3ByaW50Zihub2RlTmFtZSwgIiVzXzB4JSVwIiwgKHZvaWQqKXBTdHJ1Y3QtPiVzKTtcbicgJSAoc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10sIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdHBfbGlzdFtpbmRleF1bJ25hbWUnXSBpbiBbJ3BUeXBlQ291bnQnLCAncFNhbXBsZXJJbWFnZVZpZXdzJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgICAgICB0bXBTdHIgPSAlc19hcnJheShwU3RydWN0LT5jb3VudCwgcFN0cnVjdC0+JXMsIG5vZGVOYW1lKTtcbicgJSAoc2VsZi5fZ2V0X2d2X2Z1bmNfbmFtZShzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXSksIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICAgICAgdG1wU3RyID0gJXMocFN0cnVjdC0+JXMsIG5vZGVOYW1lKTtcbicgJSAoc2VsZi5fZ2V0X2d2X2Z1bmNfbmFtZShzdHBfbGlzdFtpbmRleF1bJ3R5cGUnXSksIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICAgICAgc3RwX3N0cnNbJWldID0gKGNoYXIqKW1hbGxvYygyNTYrc3RybGVuKHRtcFN0cikrc3RybGVuKG5vZGVOYW1lKStzdHJsZW4obXlOb2RlTmFtZSkpO1xuJyAlIChpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIHNwcmludGYoc3RwX3N0cnNbJWldLCAiJSVzXFxuXFwiJSVzXFwiOnN0cnVjdCVpIC0+IFxcIiUlc1xcIiBbXTtcXG4iLCB0bXBTdHIsIG15Tm9kZU5hbWUsIG5vZGVOYW1lKTtcbicgJSAoaW5kZXgsIGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgIH1cbicpCisgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoIiAgICBlbHNlXG4gICAgICAgIHN0cF9zdHJzWyVpXSA9IFwiXCI7XG4iICUgKGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBzdHBfbGlzdFtpbmRleF1bJ2FycmF5J106ICMgVE9ETyA6IEZvciBub3cganVzdCBwcmludGluZyBmaXJzdCBlbGVtZW50IG9mIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBzcHJpbnRmKG5vZGVOYW1lLCAiJXNfMHglJXAiLCAodm9pZCopJnBTdHJ1Y3QtPiVzWzBdKTtcbicgJSAoc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10sIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgIHRtcFN0ciA9ICVzKCZwU3RydWN0LT4lc1swXSwgbm9kZU5hbWUpO1xuJyAlIChzZWxmLl9nZXRfZ3ZfZnVuY19uYW1lKHN0cF9saXN0W2luZGV4XVsndHlwZSddKSwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgc3RwX3N0cnNbJWldID0gKGNoYXIqKW1hbGxvYygyNTYrc3RybGVuKHRtcFN0cikrc3RybGVuKG5vZGVOYW1lKStzdHJsZW4obXlOb2RlTmFtZSkpO1xuJyAlIChpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBzcHJpbnRmKHN0cF9zdHJzWyVpXSwgIiUlc1xcblxcIiUlc1xcIjpzdHJ1Y3QlaSAtPiBcXCIlJXNcXCIgW107XFxuIiwgdG1wU3RyLCBteU5vZGVOYW1lLCBub2RlTmFtZSk7XG4nICUgKGluZGV4LCBpbmRleCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBzcHJpbnRmKG5vZGVOYW1lLCAiJXNfMHglJXAiLCAodm9pZCopJnBTdHJ1Y3QtPiVzKTtcbicgJSAoc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10sIHN0cF9saXN0W2luZGV4XVsnbmFtZSddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgIHRtcFN0ciA9ICVzKCZwU3RydWN0LT4lcywgbm9kZU5hbWUpO1xuJyAlIChzZWxmLl9nZXRfZ3ZfZnVuY19uYW1lKHN0cF9saXN0W2luZGV4XVsndHlwZSddKSwgc3RwX2xpc3RbaW5kZXhdWyduYW1lJ10pKQorICAgICAgICAgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgc3RwX3N0cnNbJWldID0gKGNoYXIqKW1hbGxvYygyNTYrc3RybGVuKHRtcFN0cikrc3RybGVuKG5vZGVOYW1lKStzdHJsZW4obXlOb2RlTmFtZSkpO1xuJyAlIChpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBzcHJpbnRmKHN0cF9zdHJzWyVpXSwgIiUlc1xcblxcIiUlc1xcIjpzdHJ1Y3QlaSAtPiBcXCIlJXNcXCIgW107XFxuIiwgdG1wU3RyLCBteU5vZGVOYW1lLCBub2RlTmFtZSk7XG4nICUgKGluZGV4LCBpbmRleCkpCisgICAgICAgICAgICAgICAgICAgIHRvdGFsX3N0cmxlbl9zdHIgKz0gJ3N0cmxlbihzdHBfc3Ryc1slaV0pICsgJyAlIGluZGV4CisgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBzdHIgPSAoY2hhciopbWFsbG9jKCVzc2l6ZW9mKGNoYXIpKjIwNDgpO1xuJyAlICh0b3RhbF9zdHJsZW5fc3RyKSkKKyAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgIHNwcmludGYoc3RyLCAiXFwiJXNcXCIgW1xcbmxhYmVsID0gPDxUQUJMRSBCT1JERVI9XFwiMFxcIiBDRUxMQk9SREVSPVxcIjFcXCIgQ0VMTFNQQUNJTkc9XFwiMFxcIj48VFI+PFREIENPTFNQQU49XFwiMlxcIj4lcyAoMHglcCk8L1REPjwvVFI+JykKKyAgICAgICAgICAgIHBfYXJncyA9ICIsIG15Tm9kZU5hbWUsIG15Tm9kZU5hbWUsIHBTdHJ1Y3QiCisgICAgICAgICAgICBmb3IgbSBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdFtzXSk6CisgICAgICAgICAgICAgICAgcGxhYmVsID0gIiIKKyAgICAgICAgICAgICAgICBpZiBtIGluIHBsX2RpY3Q6CisgICAgICAgICAgICAgICAgICAgIHBsYWJlbCA9IHBsX2RpY3RbbV0KKyAgICAgICAgICAgICAgICAocF9vdXQxLCBwX2FyZ3MxKSA9IHNlbGYuX2dldF9zdHJ1Y3RfZ3ZfcHJpbnRfZm9ybWF0dGVkKHNlbGYuc3RydWN0X2RpY3Rbc11bbV0sIHBvcnRfbGFiZWw9cGxhYmVsKQorICAgICAgICAgICAgICAgIHBfb3V0ICs9IHBfb3V0MQorICAgICAgICAgICAgICAgIHBfYXJncyArPSBwX2FyZ3MxCisgICAgICAgICAgICBwX291dCArPSAnPC9UQUJMRT4+XFxuXTtcXG5cXG4iJworICAgICAgICAgICAgcF9hcmdzICs9ICIpO1xuIgorICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKHBfb3V0KQorICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKHBfYXJncykKKyAgICAgICAgICAgIGlmIDAgIT0gbnVtX3N0cHM6CisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgZm9yIChpbnQzMl90IHN0cF9pbmRleCA9ICVpOyBzdHBfaW5kZXggPj0gMDsgc3RwX2luZGV4LS0pIHtcbicgJSAobnVtX3N0cHMtMSkpCisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIGlmICgwIDwgc3RybGVuKHN0cF9zdHJzW3N0cF9pbmRleF0pKSB7XG4nKQorICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgICAgICAgICAgc3RybmNhdChzdHIsIHN0cF9zdHJzW3N0cF9pbmRleF0sIHN0cmxlbihzdHBfc3Ryc1tzdHBfaW5kZXhdKSk7XG4nKQorICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgICAgICAgICAgZnJlZShzdHBfc3Ryc1tzdHBfaW5kZXhdKTtcbicpCisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIH1cbicpCisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgiICAgIHJldHVybiBzdHI7XG59XG4iKQorICAgICAgICAgICAgaWYgcy5sb3dlcigpLnN0cmlwKCJfIikgaW4gYXJyYXlfZnVuY19saXN0OgorICAgICAgICAgICAgICAgIHB0cl9hcnJheSA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgcy5sb3dlcigpLnN0cmlwKCJfIikgaW4gWyd2a2J1ZmZlcnZpZXdhdHRhY2hpbmZvJywgJ3ZraW1hZ2V2aWV3YXR0YWNoaW5mbyddOgorICAgICAgICAgICAgICAgICAgICBwdHJfYXJyYXkgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnY2hhciogJXNfYXJyYXkodWludDMyX3QgY291bnQsIGNvbnN0ICVzKiBjb25zdCogcFN0cnVjdCwgY29uc3QgY2hhciogbXlOb2RlTmFtZSlcbntcbiAgICBjaGFyKiBzdHI7XG4gICAgY2hhciB0bXBTdHJbMTAyNF07XG4nICUgKHNlbGYuX2dldF9ndl9mdW5jX25hbWUocyksIHR5cGVkZWZfZndkX2RpY3Rbc10pKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnY2hhciogJXNfYXJyYXkodWludDMyX3QgY291bnQsIGNvbnN0ICVzKiBwU3RydWN0LCBjb25zdCBjaGFyKiBteU5vZGVOYW1lKVxue1xuICAgIGNoYXIqIHN0cjtcbiAgICBjaGFyIHRtcFN0clsxMDI0XTtcbicgJSAoc2VsZi5fZ2V0X2d2X2Z1bmNfbmFtZShzKSwgdHlwZWRlZl9md2RfZGljdFtzXSkpCisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgc3RyID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqMTAyNCpjb3VudCk7XG4nKQorICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgIHNwcmludGYoc3RyLCAiXFwiJXNcXCIgW1xcbmxhYmVsID0gPDxUQUJMRSBCT1JERVI9XFwiMFxcIiBDRUxMQk9SREVSPVxcIjFcXCIgQ0VMTFNQQUNJTkc9XFwiMFxcIj48VFI+PFREIENPTFNQQU49XFwiM1xcIj4lcyAoMHglcCk8L1REPjwvVFI+IiwgbXlOb2RlTmFtZSwgbXlOb2RlTmFtZSwgcFN0cnVjdCk7XG4nKQorICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgY291bnQ7IGkrKykge1xuJykKKyAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICAgICAgc3ByaW50Zih0bXBTdHIsICInKTsKKyAgICAgICAgICAgICAgICBwX2FyZ3MgPSAiIgorICAgICAgICAgICAgICAgIHBfb3V0ID0gIiIKKyAgICAgICAgICAgICAgICBmb3IgbSBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y3RfZGljdFtzXSk6CisgICAgICAgICAgICAgICAgICAgIHBsYWJlbCA9ICIiCisgICAgICAgICAgICAgICAgICAgIChwX291dDEsIHBfYXJnczEpID0gc2VsZi5fZ2V0X3N0cnVjdF9ndl9wcmludF9mb3JtYXR0ZWQoc2VsZi5zdHJ1Y3RfZGljdFtzXVttXSwgcG9ydF9sYWJlbD1wbGFiZWwpCisgICAgICAgICAgICAgICAgICAgIGlmIDAgPT0gbTogIyBBZGQgYXJyYXkgaW5kZXggbm90YXRpb24gYXQgZW5kIG9mIGZpcnN0IHJvdworICAgICAgICAgICAgICAgICAgICAgICAgcF9vdXQxID0gJyVzPFREIFJPV1NQQU49XFwiJWlcXCIgUE9SVD1cXCJzbG90JSV1XFwiPiUldTwvVEQ+PC9UUj4nICUgKHBfb3V0MVs6LTVdLCBsZW4oc2VsZi5zdHJ1Y3RfZGljdFtzXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwX2FyZ3MxICs9ICcsIGksIGknCisgICAgICAgICAgICAgICAgICAgIHBfb3V0ICs9IHBfb3V0MQorICAgICAgICAgICAgICAgICAgICBwX2FyZ3MgKz0gcF9hcmdzMQorICAgICAgICAgICAgICAgIHBfb3V0ICs9ICciJworICAgICAgICAgICAgICAgIHBfYXJncyArPSAiKTtcbiIKKyAgICAgICAgICAgICAgICBpZiBwdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgICAgIHBfYXJncyA9IHBfYXJncy5yZXBsYWNlKCctPicsICdbaV0tPicpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcF9hcmdzID0gcF9hcmdzLnJlcGxhY2UoJy0+JywgJ1tpXS4nKQorICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZChwX291dCk7CisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKHBfYXJncyk7CisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIHN0cm5jYXQoc3RyLCB0bXBTdHIsIHN0cmxlbih0bXBTdHIpKTtcbicpCisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICBzdHJuY2F0KHN0ciwgIjwvVEFCTEU+Plxcbl07XFxuXFxuIiwgMjApO1xuJykKKyAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICByZXR1cm4gc3RyO1xufVxuJykKKyAgICAgICAgIyBBZGQgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgcHJpbnQgb3V0IHVua25vd24gc3RydWN0CisgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgiY2hhciogZHluYW1pY19ndl9kaXNwbGF5KGNvbnN0IHZvaWQqIHBTdHJ1Y3QsIGNvbnN0IGNoYXIqIG5vZGVOYW1lKVxue1xuIikKKyAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCIgICAgLy8gQ2FzdCB0byBBUFBfSU5GTyBwdHIgaW5pdGlhbGx5IGp1c3QgdG8gcHVsbCBzVHlwZSBvZmYgc3RydWN0XG4iKQorICAgICAgICBndl9mdW5jcy5hcHBlbmQoIiAgICBWa1N0cnVjdHVyZVR5cGUgc1R5cGUgPSAoKFZrQXBwbGljYXRpb25JbmZvKilwU3RydWN0KS0+c1R5cGU7XG4iKQorICAgICAgICBndl9mdW5jcy5hcHBlbmQoIiAgICBzd2l0Y2ggKHNUeXBlKVxuICAgIHtcbiIpCisgICAgICAgIGZvciBlIGluIGVudW1fdHlwZV9kaWN0OgorICAgICAgICAgICAgaWYgIlN0cnVjdHVyZVR5cGUiIGluIGU6CisgICAgICAgICAgICAgICAgZm9yIHYgaW4gc29ydGVkKGVudW1fdHlwZV9kaWN0W2VdKToKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0X25hbWUgPSBnZXRfc3RydWN0X25hbWVfZnJvbV9zdHJ1Y3RfdHlwZSh2KQorICAgICAgICAgICAgICAgICAgICBpZiBzdHJ1Y3RfbmFtZSBub3QgaW4gc2VsZi5zdHJ1Y3RfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfZnVuY19uYW1lID0gc2VsZi5fZ2V0X2d2X2Z1bmNfbmFtZShzdHJ1Y3RfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgIyBUT0RPIDogSGFuZC1jb2RlZCBmaXhlcyBmb3Igc29tZSBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgICAgICNpZiAnVmtQaXBlbGluZUNiU3RhdGVDcmVhdGVJbmZvJyBpbiBzdHJ1Y3RfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgIyAgICBzdHJ1Y3RfbmFtZSA9ICdWS19QSVBFTElORV9DQl9TVEFURScKKyAgICAgICAgICAgICAgICAgICAgaWYgJ1ZrU2VtYXBob3JlQ3JlYXRlSW5mbycgaW4gc3RydWN0X25hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfbmFtZSA9ICdWa1NlbWFwaG9yZUNyZWF0ZUluZm8nCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9mdW5jX25hbWUgPSBzZWxmLl9nZXRfZ3ZfZnVuY19uYW1lKHN0cnVjdF9uYW1lKQorICAgICAgICAgICAgICAgICAgICBlbGlmICdWa1NlbWFwaG9yZU9wZW5JbmZvJyBpbiBzdHJ1Y3RfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9uYW1lID0gJ1ZrU2VtYXBob3JlT3BlbkluZm8nCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9mdW5jX25hbWUgPSBzZWxmLl9nZXRfZ3ZfZnVuY19uYW1lKHN0cnVjdF9uYW1lKQorICAgICAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoJyAgICAgICAgY2FzZSAlczpcbicgJSAodikpCisgICAgICAgICAgICAgICAgICAgIGd2X2Z1bmNzLmFwcGVuZCgnICAgICAgICAgICAgcmV0dXJuICVzKCglcyopcFN0cnVjdCwgbm9kZU5hbWUpO1xuJyAlIChwcmludF9mdW5jX25hbWUsIHN0cnVjdF9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgI2d2X2Z1bmNzLmFwcGVuZCgnICAgICAgICB9XG4nKQorICAgICAgICAgICAgICAgICAgICAjZ3ZfZnVuY3MuYXBwZW5kKCcgICAgICAgIGJyZWFrO1xuJykKKyAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoIiAgICAgICAgZGVmYXVsdDpcbiIpCisgICAgICAgICAgICAgICAgZ3ZfZnVuY3MuYXBwZW5kKCIgICAgICAgIHJldHVybiBOVUxMO1xuIikKKyAgICAgICAgICAgICAgICBndl9mdW5jcy5hcHBlbmQoIiAgICB9XG4iKQorICAgICAgICBndl9mdW5jcy5hcHBlbmQoIn0iKQorICAgICAgICByZXR1cm4gIiIuam9pbihndl9mdW5jcykKKworCisKKworCisjICAgIGRlZiBfZ2VuZXJhdGVIZWFkZXIoc2VsZik6CisjICAgICAgICBoZHIgPSBbXQorIyAgICAgICAgaGRyLmFwcGVuZCgnZGlncmFwaCBnIHtcbmdyYXBoIFtcbnJhbmtkaXIgPSAiTFIiXG5dOycpCisjICAgICAgICBoZHIuYXBwZW5kKCdub2RlIFtcbmZvbnRzaXplID0gIjE2Ilxuc2hhcGUgPSAicGxhaW50ZXh0IlxuXTsnKQorIyAgICAgICAgaGRyLmFwcGVuZCgnZWRnZSBbXG5dO1xuJykKKyMgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaGRyKQorIworIyAgICBkZWYgX2dlbmVyYXRlQm9keShzZWxmKToKKyMgICAgICAgIGJvZHkgPSBbXQorIyAgICAgICAgZm9yIHMgaW4gc29ydGVkKHNlbGYuc3RydWNfZGljdCk6CisjICAgICAgICAgICAgZmllbGRfbnVtID0gMQorIyAgICAgICAgICAgIGJvZHkuYXBwZW5kKCciJXMiIFtcbmxhYmVsID0gPDxUQUJMRSBCT1JERVI9IjAiIENFTExCT1JERVI9IjEiIENFTExTUEFDSU5HPSIwIj4gPFRSPjxURCBDT0xTUEFOPSIyIiBQT1JUPSJmMCI+JXM8L1REPjwvVFI+JyAlIChzLCB0eXBlZGVmX2Z3ZF9kaWN0W3NdKSkKKyMgICAgICAgICAgICBmb3IgbSBpbiBzb3J0ZWQoc2VsZi5zdHJ1Y19kaWN0W3NdKToKKyMgICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoJzxUUj48VEQgUE9SVD0iZiVpIj4lczwvVEQ+PFREIFBPUlQ9ImYlaSI+JXM8L1REPjwvVFI+JyAlIChmaWVsZF9udW0sIHNlbGYuc3RydWNfZGljdFtzXVttXVsnZnVsbF90eXBlJ10sIGZpZWxkX251bSsxLCBzZWxmLnN0cnVjX2RpY3Rbc11bbV1bJ25hbWUnXSkpCisjICAgICAgICAgICAgICAgIGZpZWxkX251bSArPSAyCisjICAgICAgICAgICAgYm9keS5hcHBlbmQoJzwvVEFCTEU+PlxuXTtcbicpCisjICAgICAgICByZXR1cm4gIiIuam9pbihib2R5KQorCitkZWYgbWFpbihhcmd2PU5vbmUpOgorICAgIG9wdHMgPSBoYW5kbGVfYXJncygpCisgICAgIyBQYXJzZSBpbnB1dCBmaWxlIGFuZCBmaWxsIG91dCBnbG9iYWwgZGljdHMKKyAgICBoZnAgPSBIZWFkZXJGaWxlUGFyc2VyKG9wdHMuaW5wdXRfZmlsZSkKKyAgICBoZnAucGFyc2UoKQorICAgICMgVE9ETyA6IERvbid0IHdhbnQgdGhlc2UgdG8gYmUgZ2xvYmFsLCBzZWUgbm90ZSBhdCB0b3AgYWJvdXQgd3JhcHBlciBjbGFzc2VzCisgICAgZ2xvYmFsIGVudW1fdmFsX2RpY3QKKyAgICBnbG9iYWwgZW51bV90eXBlX2RpY3QKKyAgICBnbG9iYWwgc3RydWN0X2RpY3QKKyAgICBnbG9iYWwgb3BhcXVlX3R5cGVzCisgICAgZ2xvYmFsIHR5cGVkZWZfZndkX2RpY3QKKyAgICBnbG9iYWwgdHlwZWRlZl9yZXZfZGljdAorICAgIGdsb2JhbCB0eXBlc19kaWN0CisgICAgZW51bV92YWxfZGljdCA9IGhmcC5nZXRfZW51bV92YWxfZGljdCgpCisgICAgZW51bV90eXBlX2RpY3QgPSBoZnAuZ2V0X2VudW1fdHlwZV9kaWN0KCkKKyAgICBzdHJ1Y3RfZGljdCA9IGhmcC5nZXRfc3RydWN0X2RpY3QoKQorICAgIG9wYXF1ZV90eXBlcyA9IGhmcC5nZXRfb3BhcXVlX3R5cGVzKCkKKyAgICAjIFRPRE8gOiBXb3VsZCBsaWtlIHRvIHZhbGlkYXRlIHN0cnVjdCBkYXRhIGhlcmUgdG8gdmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBib29scyBmb3Igc3RydWN0IG1lbWJlcnMgYXJlIGNvcnJlY3QgYXQgdGhpcyBwb2ludAorICAgIHR5cGVkZWZfZndkX2RpY3QgPSBoZnAuZ2V0X3R5cGVkZWZfZndkX2RpY3QoKQorICAgIHR5cGVkZWZfcmV2X2RpY3QgPSBoZnAuZ2V0X3R5cGVkZWZfcmV2X2RpY3QoKQorICAgIHR5cGVzX2RpY3QgPSBoZnAuZ2V0X3R5cGVzX2RpY3QoKQorICAgICNwcmludChlbnVtX3ZhbF9kaWN0KQorICAgICNwcmludCh0eXBlZGVmX2RpY3QpCisgICAgI3ByaW50KHN0cnVjdF9kaWN0KQorICAgIGlucHV0X2hlYWRlciA9IG9zLnBhdGguYmFzZW5hbWUob3B0cy5pbnB1dF9maWxlKQorICAgIGlmICd2dWxrYW4uaCcgPT0gaW5wdXRfaGVhZGVyOgorICAgICAgICBpbnB1dF9oZWFkZXIgPSAidnVsa2FuL3Z1bGthbi5oIgorCisgICAgcHJlZml4ID0gb3MucGF0aC5iYXNlbmFtZShvcHRzLmlucHV0X2ZpbGUpLnN0cmlwKCIuaCIpCisgICAgaWYgcHJlZml4ID09ICJ2dWxrYW4iOgorICAgICAgICBwcmVmaXggPSAidmsiCisgICAgaWYgKG9wdHMuYWJzX291dF9kaXIgaXMgbm90IE5vbmUpOgorICAgICAgICBlbnVtX3NoX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG9wdHMuYWJzX291dF9kaXIsIHByZWZpeCsiX2VudW1fc3RyaW5nX2hlbHBlci5oIikKKyAgICBlbHNlOgorICAgICAgICBlbnVtX3NoX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBvcHRzLnJlbF9vdXRfZGlyLCBwcmVmaXgrIl9lbnVtX3N0cmluZ19oZWxwZXIuaCIpCisgICAgZW51bV9zaF9maWxlbmFtZSA9IG9zLnBhdGguYWJzcGF0aChlbnVtX3NoX2ZpbGVuYW1lKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmRpcm5hbWUoZW51bV9zaF9maWxlbmFtZSkpOgorICAgICAgICBwcmludCgiQ3JlYXRpbmcgb3V0cHV0IGRpciAlcyIgJSBvcy5wYXRoLmRpcm5hbWUoZW51bV9zaF9maWxlbmFtZSkpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguZGlybmFtZShlbnVtX3NoX2ZpbGVuYW1lKSkKKyAgICBpZiBvcHRzLmdlbl9lbnVtX3N0cmluZ19oZWxwZXI6CisgICAgICAgIHByaW50KCJHZW5lcmF0aW5nIGVudW0gc3RyaW5nIGhlbHBlciB0byAlcyIgJSBlbnVtX3NoX2ZpbGVuYW1lKQorICAgICAgICBlbnVtX3ZoX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShlbnVtX3NoX2ZpbGVuYW1lKSwgcHJlZml4KyJfZW51bV92YWxpZGF0ZV9oZWxwZXIuaCIpCisgICAgICAgIHByaW50KCJHZW5lcmF0aW5nIGVudW0gdmFsaWRhdGUgaGVscGVyIHRvICVzIiAlIGVudW1fdmhfZmlsZW5hbWUpCisgICAgICAgIGVnID0gRW51bUNvZGVHZW4oZW51bV90eXBlX2RpY3QsIGVudW1fdmFsX2RpY3QsIHR5cGVkZWZfZndkX2RpY3QsIG9zLnBhdGguYmFzZW5hbWUob3B0cy5pbnB1dF9maWxlKSwgZW51bV9zaF9maWxlbmFtZSwgZW51bV92aF9maWxlbmFtZSkKKyAgICAgICAgZWcuZ2VuZXJhdGVTdHJpbmdIZWxwZXIoKQorICAgICAgICBlZy5nZW5lcmF0ZUVudW1WYWxpZGF0ZSgpCisgICAgI2ZvciBzdHJ1Y3QgaW4gc3RydWN0X2RpY3Q6CisgICAgI3ByaW50KHN0cnVjdCkKKyAgICBpZiBvcHRzLmdlbl9zdHJ1Y3Rfd3JhcHBlcnM6CisgICAgICAgIHN3ID0gU3RydWN0V3JhcHBlckdlbihzdHJ1Y3RfZGljdCwgb3BhcXVlX3R5cGVzLCBvcy5wYXRoLmJhc2VuYW1lKG9wdHMuaW5wdXRfZmlsZSkuc3RyaXAoIi5oIiksIG9zLnBhdGguZGlybmFtZShlbnVtX3NoX2ZpbGVuYW1lKSkKKyAgICAgICAgI3ByaW50KHN3LmdldF9jbGFzc19uYW1lKHN0cnVjdCkpCisgICAgICAgIHN3LnNldF9pbmNsdWRlX2hlYWRlcnMoW2lucHV0X2hlYWRlcixvcy5wYXRoLmJhc2VuYW1lKGVudW1fc2hfZmlsZW5hbWUpLCJzdGRpbnQuaCIsInN0ZGlvLmgiLCJzdGRsaWIuaCIsImlvc3RyZWFtIiwic3N0cmVhbSIsInN0cmluZyJdKQorICAgICAgICBzdy5zZXRfbm9fYWRkcihGYWxzZSkKKyAgICAgICAgIyBOQjogdGhlIGFwaSBkdW1wIHZlcnNpb24gb2YgZ2VuX3N0cnVjdF93cmFwcGVycyBvbmx5IGdlbmVyYXRlcyBhbiBhcGlfZHVtcCB2ZXJzaW9uIG9mIHRoZSB2a19zdHJ1Y3RfaGVscGVyX2NwcC5oIGZpbGUgY2FsbGVkIHZrX2FwaV9kdW1wX2hlbHBlcl9jcHAuaAorICAgICAgICBzdy5nZW5lcmF0ZVN0cmluZ0hlbHBlckNwcCgpCisgICAgICAgIHJldHVybgorICAgICAgICBzdy5zZXRfaW5jbHVkZV9oZWFkZXJzKFtpbnB1dF9oZWFkZXIsb3MucGF0aC5iYXNlbmFtZShlbnVtX3NoX2ZpbGVuYW1lKSwic3RkaW50LmgiLCJjaW50dHlwZXMiLCAic3RkaW8uaCIsInN0ZGxpYi5oIl0pCisgICAgICAgIHByaW50KCJHZW5lcmF0aW5nIHN0cnVjdCB3cmFwcGVyIGhlYWRlciB0byAlcyIgJSBzdy5oZWFkZXJfZmlsZW5hbWUpCisgICAgICAgIHN3LmdlbmVyYXRlSGVhZGVyKCkKKyAgICAgICAgcHJpbnQoIkdlbmVyYXRpbmcgc3RydWN0IHdyYXBwZXIgY2xhc3MgdG8gJXMiICUgc3cuY2xhc3NfZmlsZW5hbWUpCisgICAgICAgIHN3LmdlbmVyYXRlQm9keSgpCisgICAgICAgIHN3LmdlbmVyYXRlU3RyaW5nSGVscGVyKCkKKyAgICAgICAgc3cuZ2VuZXJhdGVWYWxpZGF0ZUhlbHBlcigpCisgICAgICAgICMgR2VuZXJhdGUgYSAybmQgaGVscGVyIGZpbGUgdGhhdCBleGNsdWRlcyBhZGRycworICAgICAgICBzdy5zZXRfbm9fYWRkcihUcnVlKQorICAgICAgICBzdy5nZW5lcmF0ZVN0cmluZ0hlbHBlcigpCisgICAgICAgIHN3LnNldF9ub19hZGRyKEZhbHNlKQorICAgICAgICBzdy5zZXRfaW5jbHVkZV9oZWFkZXJzKFtpbnB1dF9oZWFkZXIsb3MucGF0aC5iYXNlbmFtZShlbnVtX3NoX2ZpbGVuYW1lKSwic3RkaW50LmgiLCJzdGRpby5oIiwic3RkbGliLmgiLCJpb3N0cmVhbSIsInNzdHJlYW0iLCJzdHJpbmciXSkKKyAgICAgICAgc3cuc2V0X25vX2FkZHIoVHJ1ZSkKKyAgICAgICAgc3cuZ2VuZXJhdGVTdHJpbmdIZWxwZXJDcHAoKQorICAgICAgICBzdy5zZXRfbm9fYWRkcihGYWxzZSkKKyAgICAgICAgc3cuZ2VuZXJhdGVTdHJpbmdIZWxwZXJDcHAoKQorICAgICAgICBzdy5zZXRfaW5jbHVkZV9oZWFkZXJzKFsic3RkaW8uaCIsICJzdGRsaWIuaCIsIGlucHV0X2hlYWRlcl0pCisgICAgICAgIHN3LmdlbmVyYXRlU2l6ZUhlbHBlcigpCisgICAgICAgIHN3LmdlbmVyYXRlU2l6ZUhlbHBlckMoKQorICAgICAgICBzdy5nZW5lcmF0ZVNhZmVTdHJ1Y3RIZWFkZXIoKQorICAgICAgICBzdy5nZW5lcmF0ZVNhZmVTdHJ1Y3RzKCkKKyAgICBpZiBvcHRzLmdlbl9zdHJ1Y3Rfc2l6ZXM6CisgICAgICAgIHN0ID0gU3RydWN0V3JhcHBlckdlbihzdHJ1Y3RfZGljdCwgb3MucGF0aC5iYXNlbmFtZShvcHRzLmlucHV0X2ZpbGUpLnN0cmlwKCIuaCIpLCBvcy5wYXRoLmRpcm5hbWUoZW51bV9zaF9maWxlbmFtZSkpCisgICAgICAgIHN0LnNldF9pbmNsdWRlX2hlYWRlcnMoWyJzdGRpby5oIiwgInN0ZGxpYi5oIiwgaW5wdXRfaGVhZGVyXSkKKyAgICAgICAgc3QuZ2VuZXJhdGVTaXplSGVscGVyKCkKKyAgICAgICAgc3QuZ2VuZXJhdGVTaXplSGVscGVyQygpCisgICAgaWYgb3B0cy5nZW5fY21ha2U6CisgICAgICAgIGNtZyA9IENNYWtlR2VuKHN3LCBvcy5wYXRoLmRpcm5hbWUoZW51bV9zaF9maWxlbmFtZSkpCisgICAgICAgIGNtZy5nZW5lcmF0ZSgpCisgICAgaWYgb3B0cy5nZW5fZ3JhcGh2aXo6CisgICAgICAgIGd2ID0gR3JhcGhWaXpHZW4oc3RydWN0X2RpY3QsIG9zLnBhdGguYmFzZW5hbWUob3B0cy5pbnB1dF9maWxlKS5zdHJpcCgiLmgiKSwgb3MucGF0aC5kaXJuYW1lKGVudW1fc2hfZmlsZW5hbWUpKQorICAgICAgICBndi5zZXRfaW5jbHVkZV9oZWFkZXJzKFtpbnB1dF9oZWFkZXIsb3MucGF0aC5iYXNlbmFtZShlbnVtX3NoX2ZpbGVuYW1lKSwic3RkaW50LmgiLCJzdGRpby5oIiwic3RkbGliLmgiLCAiY2ludHR5cGVzIl0pCisgICAgICAgIGd2LmdlbmVyYXRlKCkKKyAgICBwcmludCgiRE9ORSEiKQorICAgICNwcmludCh0eXBlZGVmX3Jldl9kaWN0KQorICAgICNwcmludCh0eXBlc19kaWN0KQorICAgICNyZWNyZWF0ZV9zdHJ1Y3RzKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS92a3RyYWNlLy5naXRpZ25vcmUgYi92a3RyYWNlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjNTNhNgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2UvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDI3IEBACitDTWFrZUNhY2hlLnR4dAorQ01ha2VGaWxlcy8KK2NtYWtlX2luc3RhbGwuY21ha2UKK01ha2VmaWxlCitfX3B5Y2FjaGVfXworVktDb25maWcuaAoraWNkL2NvbW1vbi9saWJpY2QuYQoraWNkL2ludGVsL2ludGVsX2dwYS5jCitfb3V0NjQKK291dDMyLyoKK291dDY0LyoKK2RlbW9zL0RlYnVnLyoKK2RlbW9zL3RyaS5kaXIvRGVidWcvKgorZGVtb3MvdHJpL0RlYnVnLyoKK2RlbW9zL1dpbjMyL0RlYnVnLyoKK2RlbW9zL3hjYl9udmlkaWEuZGlyLyoKK2xpYnMvV2luMzIvRGVidWcvKgorKi5weWMKKyoudmNwcm9qCisqLnNsbgorKi5zdW8KKyoudmN4cHJvagorKi5zZGYKKyouZmlsdGVycworYnVpbGQKK2RidWlsZAorc3JjL3ZrdHJhY2VfbGF5ZXIvY29kZWdlbi8qCmRpZmYgLS1naXQgYS92a3RyYWNlL0NNYWtlTGlzdHMudHh0IGIvdmt0cmFjZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRkOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDk3IEBACitQUk9KRUNUKHZrdHJhY2VfcHJvamVjdCkKKworb3B0aW9uKEJVSUxEX1ZLVFJBQ0VWSUVXRVIgIkJ1aWxkIFZrVHJhY2VWaWV3ZXIiIE9OKQorCitpZiAoQlVJTERfVktUUkFDRVZJRVdFUikKKyAgICAjIFdlIG5lZWQgQ01ha2UgdmVyc2lvbiAzLjArIGluIG9yZGVyIHRvICJmaW5kX3BhY2thZ2UoUXQ1KSI6CisgICAgY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMCkKK2Vsc2UgKCkKKyAgICBjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjExKQorZW5kaWYoKQorCitzZXQoU1JDX0RJUiAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyIpCisKKyNzZXQoQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9NT0RVTEVfUEFUSH0gIiR7U1JDX0RJUn0vY21ha2UvTW9kdWxlcy8iKQorI3NldChDTUFLRV9FWFRFUk5BTF9QQVRIICIke1NSQ19ESVJ9Ly4uLy4uL2V4dGVybmFsIikKKworaWYgKFdJTjMyKQorICAgICMgVE9ETzogcy9DTUFLRV9QUkVGSVhfUEFUSC9DTUFLRV9FWFRFUk5BTF9XSU5ET1dTX1BBVEgvZworIyAgICBzZXQoQ01BS0VfUFJFRklYX1BBVEggIiR7Q01BS0VfRVhURVJOQUxfUEFUSH0vd2luZG93cyIpCisgICAgc2V0KFdJTjMyX1BUSFJFQURTX1BBVEggIiR7U1JDX0RJUn0vdGhpcmRwYXJ0eS9wdGhyZWFkcy4yIikKKyAgICBzZXQoV0lOMzJfUFRIUkVBRFNfSU5DTFVERV9QQVRIICIke1dJTjMyX1BUSFJFQURTX1BBVEh9L2luY2x1ZGUiKQorZW5kaWYoKQorCitzZXQoUFlUSE9OX0VYRUNVVEFCTEUgJHtQWVRIT05fQ01EfSkKK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnApCisKK2lmIChOT1QgUFlUSE9OSU5URVJQX0ZPVU5EKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIk1pc3NpbmcgUHl0aG9uSW50ZXJwLiBJbnN0YWxsIHB5dGhvbiBpbnRlcnByZXRlciAyLjcgKG9uIGxpbnV4IHVzZSBjbWQ6IHN1ZG8gYXB0LWdldCBpbnN0YWxsIHB5dGhvbjIuNykiKQorZW5kaWYoKQorCisjc2VhcmNoIGZvciBRVCBvbmx5IGlmIEJVSUxEX1ZLVFJBQ0VWSUVXRVIgaXMgT04KK2lmKEJVSUxEX1ZLVFJBQ0VWSUVXRVIpCisgICAgZmluZF9wYWNrYWdlKFF0NSBDT01QT05FTlRTIFdpZGdldHMgR3VpIENvcmUgU3ZnKQorICAgIGlmIChOT1QgUXQ1X0ZPVU5EKQorICAgICAgICBpZiAoV0lOMzIpCisgICAgICAgICAgICBtZXNzYWdlKFdBUk5JTkcgIlF0NSBkZXYgbGlicmFyaWVzIG5vdCBmb3VuZCwgdmt0cmFjZXZpZXdlciB3aWxsIG5vdCBiZSBidWlsdC5cblRvIGVuYWJsZSBidWlsZCBvZiB2a3RyYWNldmlld2VyLCBzZXQgZW52IHZhciBRdDVfRGlyIHRvXG5DOlxcUXRcXDUuM1xcbXN2YzIwMTNfNjRcXGxpYlxcY21ha2VcXFF0NSBvciBDOlxcUXRcXDUuM1xcbXN2YzIwMTNcXGxpYlxcY21ha2VcXFF0NSIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgbWVzc2FnZShXQVJOSU5HICJRdDUgZGV2IGxpYnJhcmllcyBub3QgZm91bmQsIHZrdHJhY2V2aWV3ZXIgd2lsbCBub3QgYmUgYnVpbHQuXG5UbyBlbmFibGUgYnVpbGQgb2Ygdmt0cmFjZXZpZXdlciwgaW5zdGFsbCBwYWNrYWdlIHF0NS1kZWZhdWx0LiIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisJJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL2luY2x1ZGUvdnVsa2FuCispCisKK21lc3NhZ2UoIiIpCittZXNzYWdlKCJjbWFrZSBvcHRpb25zOiIpCittZXNzYWdlKCIgIC1EQ01BS0VfQlVJTERfVFlQRT0nJHtDTUFLRV9CVUlMRF9UWVBFfSc6IEJ1aWxkIGRlYnVnIG9yIHJlbGVhc2UuIChEZWJ1Z3xSZWxlYXNlKSIpCittZXNzYWdlKCIgIC1EQ01BS0VfVkVSQk9TRT0nJHtDTUFLRV9WRVJCT1NFfSc6IFNwZXcgY21ha2UgcHJvamVjdCBvcHRpb25zLiAoT258T2ZmKSIpCittZXNzYWdlKCIgIC1EQlVJTERfWDY0PScke0JVSUxEX1g2NH0nOiBCdWlsZCAzMiBvciA2NC1iaXQuIChPbnxPZmYpIikKK21lc3NhZ2UoIiIpCisKKyMKKyMgIENvbXBvbmVudHMgdG8gYnVpbGQKKyMKK3NldChWS1RSQUNFX1ZVTEtBTl9ESVIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorCithZGRfc3ViZGlyZWN0b3J5KHNyYy92a3RyYWNlX2NvbW1vbikKK2FkZF9zdWJkaXJlY3Rvcnkoc3JjL3ZrdHJhY2VfdHJhY2UpCisKK29wdGlvbihCVUlMRF9WS1RSQUNFX0xBWUVSICJCdWlsZCB2a3RyYWNlX2xheWVyIiBPTikKK2lmKEJVSUxEX1ZLVFJBQ0VfTEFZRVIpCisgICAgYWRkX3N1YmRpcmVjdG9yeShzcmMvdmt0cmFjZV9sYXllcikKK2VuZGlmKCkKK29wdGlvbihCVUlMRF9WS1RSQUNFX1JFUExBWSAiQnVpbGQgdmt0cmFjZV9yZXBsYXkiIE9OKQoraWYoQlVJTERfVktUUkFDRV9SRVBMQVkpCisgICAgYWRkX3N1YmRpcmVjdG9yeShzcmMvdmt0cmFjZV9yZXBsYXkpCitlbmRpZigpCisKKyMgT25seSBidWlsZCB2a3RyYWNldmlld2VyIGlmIFF0NSBpcyBhdmFpbGFibGUKK2lmIChRdDVfRk9VTkQgQU5EIEJVSUxEX1ZLVFJBQ0VWSUVXRVIpCisgICAgYWRkX3N1YmRpcmVjdG9yeShzcmMvdmt0cmFjZV92aWV3ZXIpCitlbmRpZigpCisKKyMgdXNlIG1hY3JvIGZyb20gc3RhY2tvdmVyZmxvdyAobGluayBiZWxvdykgdG8gZ2V0IGFsbCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBvbiB0aGUgY3VycmVudCBzeXN0ZW0KKyMgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83Nzg3ODIzL2NtYWtlLWhvdy10by1nZXQtdGhlLW5hbWUtb2YtYWxsLXN1YmRpcmVjdG9yaWVzLW9mLWEtZGlyZWN0b3J5CitNQUNSTyhTVUJESVJMSVNUIHJlc3VsdCBjdXJkaXIpCisgIEZJTEUoR0xPQiBjaGlsZHJlbiBSRUxBVElWRSAke2N1cmRpcn0gJHtjdXJkaXJ9LyopCisgIFNFVChkaXJsaXN0ICIiKQorICBGT1JFQUNIKGNoaWxkICR7Y2hpbGRyZW59KQorICAgIElGKElTX0RJUkVDVE9SWSAke2N1cmRpcn0vJHtjaGlsZH0pCisgICAgICAgIExJU1QoQVBQRU5EIGRpcmxpc3QgJHtjaGlsZH0pCisgICAgRU5ESUYoKQorICBFTkRGT1JFQUNIKCkKKyAgU0VUKCR7cmVzdWx0fSAke2Rpcmxpc3R9KQorRU5ETUFDUk8oKQorCisjIG5vdyBnZW5lcmF0ZSB0aGUgbGlzdCBhbmQgYWRkIGVhY2ggb2YgdGhlIHN1YmRpcmVjdG9yaWVzCitTVUJESVJMSVNUKFNVQkRJUlMgJHtTUkNfRElSfS92a3RyYWNlX2V4dGVuc2lvbnMpCittZXNzYWdlKCJBZGRpbmcgZXh0ZW5zaW9uczogJyR7U1VCRElSU30nIikKK0ZPUkVBQ0goc3ViZGlyICR7U1VCRElSU30pCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke1NSQ19ESVJ9L3ZrdHJhY2VfZXh0ZW5zaW9ucy8ke3N1YmRpcn0pCitFTkRGT1JFQUNIKCkKKworCisKZGlmZiAtLWdpdCBhL3ZrdHJhY2UvUkVBRE1FLm1kIGIvdmt0cmFjZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmNzQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2UvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTA5IEBACitWa3RyYWNlIFRyYWNlIGFuZCBSZXBsYXkgVG9vbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVmt0cmFjZSBpcyBhIFZ1bGthbiBBUEkgdHJhY2VyIGZvciBncmFwaGljcyBhcHBsaWNhdGlvbnMuCisKKyMjVXNpbmcgVmt0cmFjZSBvbiBMaW51eCMjIworVmt0cmFjZSBidWlsZHMgdHdvIGJpbmFyaWVzIHdpdGggYXNzb2NpYXRlZCBWdWxrYW4gbGlicmFyaWVzOiBhIHRyYWNlciB3aXRoIFZ1bGthbgordHJhY2luZyBsaWJyYXJ5IGFuZCBhIHJlcGxheWVyLiBUaGUgdHJhY2luZyBsaWJyYXJ5IGlzIGEgVnVsa2FuIGxheWVyIGxpYnJhcnkuCisKKyMjI1J1bm5pbmcgVmt0cmFjZSB0cmFjZXIgYXMgc3RhbmRhbG9uZSBzZXJ2ZXIgb24gTGludXgjIyMKK1RoZSBWa3RyYWNlIHRyYWNlciBwcm9ncmFtIGNhbiBydW4gYXMgYSBzZXJ2ZXIuICBUaGVuIHRoZSBhcHAvZ2FtZSB0byBiZSB0cmFjZWQKK2lzIGxhdW5jaGVkIHNlcGFyYXRlbHkgd2l0aCB0aGUgVmt0cmFjZSB0cmFjZXIgbGlicmFyeSBwcmVsb2FkZWQuIFRvIHJ1bgorVmt0cmFjZSBhcyBhIHNlcnZlciBvbmUgc2hvdWxkIG9taXQgdGhlICItcCIgb3B0aW9uLgorYGBgCitjZCA8dmt0cmFjZSBidWlsZCBkaXJlY3Rvcnk+CisuL3ZrdHJhY2UgPG9wdGlvbnM+CitFeGFtcGxlIHRvIHRyYWNlIHNwaW5uaW5nIGN1YmUgZGVtby4KK2V4cG9ydCBWS19JQ0RfRklMRU5BTUVTPS9ob21lL2pvbi9Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzL21haW5faWNkLmpzb24KK2V4cG9ydCBMRF9MSUJSQVJZX1BBVEg9L2hvbWUvam9uL0xvYWRlckFuZFZhbGlkYXRpb25MYXllcnMvZGJ1aWxkL2xvYWRlcgorLi92a3RyYWNlIC1vIHZrdHJhY2VfY3ViZS52a3RyYWNlCitgYGAKKworSW4gYSBzZXBhcmF0ZSB0ZXJtaW5hbCBydW4geW91ciBhcHAsIHRoZSBjdWJlIGRlbW8gaW4gdGhpcyBleGFtcGxlOgorYGBgCitjZCAvaG9tZS9qb24vTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycy9kYnVpbGQvZGVtb3MKK2V4cG9ydCBWS19JQ0RfRklMRU5BTUVTPS9ob21lL2pvbi9Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzL2RidWlsZC9pY2QvaW50ZWwvaW50ZWxfaWNkLmpzb24KK2V4cG9ydCBMRF9MSUJSQVJZX1BBVEg9L2hvbWUvam9uL0xvYWRlckFuZFZhbGlkYXRpb25MYXllcnMvZGJ1aWxkL2xvYWRlcgorVktfSU5TVEFOQ0VfTEFZRVJTPVZLX0xBWUVSX0xVTkFSR192a3RyYWNlIFZLX0RFVklDRV9MQVlFUlM9VktfTEFZRVJfTFVOQVJHX3ZrdHJhY2UgLi9jdWJlCitgYGAKKworVHJhY2UgZmlsZSBpcyB3cml0dGVuIGludG8gInZrdHJhY2VfY3ViZTxudW1iZXI+LnZrdHJhY2UiLgorQXMgdGhlIGFwcCBpcyByZXJ1biwgdGhlIFZrdHJhY2UgdHJhY2VyIHNlcnZlciB3aWxsIGluY3JlbWVudCB0aGUgb3V0cHV0IGZpbGUKK251bWJlciBmb3IgZWFjaCBzdWNjZXNzaXZlIHJ1biBvZiB0aGUgYXBwLgorCitPbmUgY2FuIGFsc28gc2V0IFZLVFJBQ0VfTElCX0lQQUREUiB0byBhIHJlbW90ZSBzeXN0ZW0gSVAgYWRkcmVzcy4gVGhlbgordGhlIHRyYWNlciBpbnNlcnRlZCBpbnRvIGFuIGFwcCB3aWxsIHNlbmQgdGhlIHRyYWNlIHBhY2tldHMgdG8gdGhlIHJlbW90ZQorc3lzdGVtIHJhdGhlciB0aGFuIGxvY2FsIHN5c3RlbS4gSW4gdGhpcyBjYXNlLCB0aGUgcmVtb3RlIHN5c3RlbSBzaG91bGQgYmUKK3J1bm5pbmcgdGhlIHRyYWNlIHNlcnZlci4KKworIyMjUnVubmluZyBWa3RyYWNlIHRyYWNlciBhbmQgbGF1bmNoIGFwcC9nYW1lIGZyb20gdHJhY2VyIG9uIExpbnV4IyMjCitUaGUgVmt0cmFjZSB0cmFjZXIgcHJvZ3JhbSBsYXVuY2hlcyB0aGUgYXBwL2dhbWUgeW91IGRlc2lyZSBhbmQgdGhlbiB0cmFjZXMgaXQuCitUbyBsYXVuY2ggYXBwL2dhbWUgZnJvbSBWa3RyYWNlIHRyYWNlciBvbmUgbXVzdCB1c2UgdGhlICItcCIgb3B0aW9uLgorYGBgCitjZCA8dmt0cmFjZSBidWlsZCBkaXI+CisuL3ZrdHJhY2UgLXAgPHBhdGggdG8gYXBwIHRvIGxhdW5jaD4gIDxtb3JlIG9wdGlvbnM+CitgYGAKK0V4YW1wbGUgdG8gdHJhY2UgdGhlIHNwaW5uaW5nIGN1YmUgZGVtbyBmcm9tIHNhbXBsZSBpbXBsZW1lbnRhdGlvbgorYGBgCitleHBvcnQgVktfSUNEX0ZJTEVOQU1FUz0vaG9tZS9qb24vTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycy9tYWluX2ljZC5qc29uCitleHBvcnQgTERfTElCUkFSWV9QQVRIPS9ob21lL2pvbi9Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzL2RidWlsZC9sb2FkZXIKKy4vdmt0cmFjZSAtcCAvaG9tZS9qb24vTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycy9kYnVpbGQvZGVtb3MvY3ViZSAtbyB2a3RyYWNlX2N1YmUudmt0cmFjZSAtdyAvaG9tZS9qb24vTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycy9kYnVpbGQvZGVtb3MKK2BgYAorVHJhY2UgZmlsZSBpcyBpbiAidmt0cmFjZV9jdWJlLnZrdHJhY2UiLgorCisjIyNSdW5uaW5nIHJlcGxheWVyIG9uIExpbnV4IyMjCitUaGUgVmt0cmFjZSByZXBsYXllciB0YWtlcyAgYSB0cmFjZSBmaWxlICBhbmQgd2lsbCBsYXVuY2ggYW4gVnVsa2FuIHNlc3Npb24gYmFzZWQKK29uIHRyYWNlIGZpbGUuCitgYGAKK2NkIDx2a3RyYWNlIGJ1aWxkIGRpcj4KK2V4cG9ydCBMRF9MSUJSQVJZX1BBVEg9PHBhdGggdG8gbGlidnVsa2FuLnNvPgorLi92a3JlcGxheSA8b3B0aW9ucz4gLXQgdHJhY2VfZmlsZW5hbWUKK2BgYAorRXhhbXBsZSB0byByZXBsYXkgdHJhY2UgZmlsZSBjYXB0dXJlZCBhYm92ZQorYGBgCitleHBvcnQgVktfSUNEX0ZJTEVOQU1FUz0vaG9tZS9qb24vTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycy9tYWluX2ljZC5qc29uCitleHBvcnQgTERfTElCUkFSWV9QQVRIPS9ob21lL2pvbi9Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzL2RidWlsZDovaG9tZS9qb24vTG9hZGVyQW5kVmFsaWRhdGlvbkxheWVycy9kYnVpbGQvbG9hZGVyCisuL3ZrcmVwbGF5IC10IHZrdHJhY2VfY3ViZS52a3RyYWNlCitgYGAKKworIyNVc2luZyBWa3RyYWNlIG9uIFdpbmRvd3MjIworVmt0cmFjZSBidWlsZHMgdHdvIGJpbmFyaWVzIHdpdGggYXNzb2NpYXRlZCBWdWxrYW4gbGlicmFyaWVzOiBhIHRyYWNlciB3aXRoIFZ1bGthbgordHJhY2luZyBsaWJyYXJ5IGFuZCBhIHJlcGxheWVyLiBUaGUgdHJhY2luZyBsaWJyYXJ5IGlzIGEgVnVsa2FuIGxheWVyIGxpYnJhcnkuCisKKworIyMjUnVubmluZyBWa3RyYWNlIHRyYWNlciBhbmQgbGF1bmNoIGFwcC9nYW1lIGZyb20gdHJhY2VyIG9uIFdpbmRvd3MjIyMKK1RoZSBWa3RyYWNlIHRyYWNlciBwcm9ncmFtIGxhdW5jaGVzIHRoZSBhcHAvZ2FtZSB5b3UgZGVzaXJlIGFuZCB0aGVuIHRyYWNlcyBpdC4KK1RvIGxhdW5jaCBhcHAvZ2FtZSBmcm9tIFZrdHJhY2UgdHJhY2VyIG9uZSBtdXN0IHVzZSB0aGUgIi1wIiBvcHRpb24uCitBbHNvLCB5b3UgbWF5IG5lZWQgdG8gY29weSB0aGUgVnVsa2FuLmRsbCBsaWJyYXJ5IGludG8gdGhlIGRpcmVjdG9yeSBvZiBWa3RyYWNlLAorYW5kIG9mIHRoZSBhcHAvZ2FtZSAod2hpbGUgd2UgY29udGludWUgdG8gcHV0IFdpbmRvd3Mgc3VwcG9ydCBpbnRvIHBsYWNlKS4KK2BgYAorY2QgPHZrdHJhY2UgYnVpbGQgZGlyPgorLi92a3RyYWNlIC1wIDxwYXRoLXRvLWFwcC10by1sYXVuY2g+IC13IDx3b3JraW5nLWRpci1wYXRoLW9mLWFwcD4gIDxtb3JlIG9wdGlvbnM+CitgYGAKK0V4YW1wbGUgdG8gdHJhY2UgdGhlIHNwaW5uaW5nIGN1YmUgZGVtbyAoTm90ZTogc2VlIG90aGVyIGZpbGVzIGZvciBob3cgdG8gY29uZmlndXJlIHlvdXIgSUNEKToKK2BgYAorY2QgQzpcXFVzZXJzXGRldmVsb3BlclxcVmt0cmFjZVxcX291dDY0XFxEZWJ1ZworCit2a3RyYWNlIC1wIEM6XFxVc2Vyc1xkZXZlbG9wZXJcXExvYWRlckFuZFZhbGlkYXRpb25MYXllcnNcXF9vdXQ2NFxcZGVtb3NcXGN1YmUuZXhlCisgICAgICAgIC13IEM6XFxVc2Vyc1xkZXZlbG9wZXJcXExvYWRlckFuZFZhbGlkYXRpb25MYXllcnNcXF9vdXQ2NFxcZGVtb3MKKyAgICAgICAgLW8gdmt0cmFjZV9jdWJlLnZrdHJhY2UKK2BgYAorVHJhY2UgZmlsZSBpcyBpbiAidmt0cmFjZV9jdWJlLnZrdHJhY2UiLgorCisjIyNSdW5uaW5nIHJlcGxheWVyIG9uIFdpbmRvd3MjIyMKK1RoZSBWa3RyYWNlIHJlcGxheWVyIHRha2VzICBhIHRyYWNlIGZpbGUgIGFuZCB3aWxsIGxhdW5jaCBhbiBWdWxrYW4gc2Vzc2lvbiBiYXNlZAorb24gdHJhY2UgZmlsZS4KK2BgYAorY2QgPHZrdHJhY2UgYnVpbGQgZGlyPgordmtyZXBsYXkgPG9wdGlvbnM+IC10IHRyYWNlX2ZpbGVuYW1lCitgYGAKK0V4YW1wbGUgdG8gcmVwbGF5IHRyYWNlIGZpbGUgY2FwdHVyZWQgYWJvdmUKK2BgYAorY2QgQzpcXFVzZXJzXGRldmVsb3BlclxcVmt0cmFjZVxcX291dDY0XFxEZWJ1ZwordmtyZXBsYXkgLXQgdmt0cmFjZV9jdWJlLnZrdHJhY2UKK2BgYAorIyNCdWlsZGluZyBWa3RyYWNlIyMKK1ZrdHJhY2UgaXMgYnVpbHQgYXMgcGFydCBvZiB0b3AgbGV2ZWwgVnVsa2FuVG9vbHMgYnVpbGQuIEZvbGxvdyB0aGUKK2J1aWxkIGRpcmVjdGlvbnMgZm9yIHRoZSB0b3AgbGV2ZWwgVnVsa2FuVG9vbHMgcHJvamVjdCBidWlsZCBpbiBCVUlMRFZULm1kLiBWa3RyYWNlIGJpbmFyaWVzIGFuZAorbGlicmFyaWVzIHdpbGwgYmUgcGxhY2VkIGluIDxidWlsZF9kaXI+LgpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9UT0RPLm1kIGIvdmt0cmFjZS9UT0RPLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTYyZjQKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL1RPRE8ubWQKQEAgLTAsMCArMSw3NiBAQAorSGVyZSBpcyBhIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZCBmZWF0dXJlcyBpbiBWa1RyYWNlLCBmb2xsb3dlZCBieSBhIFRPRE8gbGlzdCBvZiBmZWF0dXJlcyB0aGF0IHdlJ2QgbGlrZSB0byBhZGQgc29vbiBpbiB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gV2UndmUgYWxzbyBsaXN0ZWQgdGhlIGZlYXR1cmVzIHRoYXQgd2UnZCAibGlrZSB0byBoYXZlIiBpbiB0aGUgZnV0dXJlLCBidXQgZG9uJ3QgaGF2ZSBhIHNob3J0LXRlcm0gcGxhbiB0byBpbXBsZW1lbnQuIAorCitGZWVsIEZyZWUgdG8gdm90ZSB0aGluZ3MgdXAgaW4gdGhlIGxpc3RzLCBhdHRlbXB0IHRvIGltcGxlbWVudCB0aGVtIHlvdXJzZWxmLCBvciBhZGQgdG8gdGhlIGxpc3QhCisKK0FzIHlvdSBjb21wbGV0ZSBhbiBpdGVtLCBwbGVhc2UgY29weSAvIHBhc3RlIGl0IGludG8gdGhlIFNVUFBPUlRFRCBGRUFUVVJFUyBzZWN0aW9uLgorCisqKlNVUFBPUlRFRCBGRUFUVVJFUyBJTiBERUJVR0dFUioqCisqIEdlbmVyYXRpbmcgJiBsb2FkaW5nIHRyYWNlcworKiBSZXBsYXkgdHJhY2VzIHdpdGhpbiB0aGUgVUkgdy8gcGF1c2UsIGNvbnRpbnVlLCBzdG9wIGFiaWxpdHkKKyAgKiBBdXRvLXBhdXNlIG9uIFZhbGlkYXRpb24gTGF5ZXIgTWVzc2FnZXMgKGluZm8sIHdhcm5pbmdzLCBhbmQvb3IgZXJyb3JzKSwgY29udHJvbGxlZCBieSBzZXR0aW5ncworICAqIFNpbmdsZS1zdGVwIHRoZSByZXBsYXkKKyAgKiBUaW1lbGluZSBwb2ludGVyIGdldHMgdXBkYXRlZCBpbiByZWFsLXRpbWUgb2YgcmVwbGF5ZWQgQVBJIGNhbGwKKyAgKiBSdW4gdGhlIHJlcGxheSBpbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoZSBVSQorICAqIFBvcC1vdXQgcmVwbGF5IHdpbmRvdyB0byBiZSBmbG9hdGluZyBzbyBpdCBjYW4gcmVwbGF5IGF0IGxhcmdlciBkaW1lbnNpb25zCisqIFRpbWVsaW5lIHNob3dzIENQVSB0aW1lIG9mIGVhY2ggQVBJIGNhbGwKKyAgKiBBIHNlcGFyYXRlIHRpbWVsaW5lIGlzIHNob3duIGZvciBlYWNoIHRocmVhZCByZWZlcmVuY2VkIGluIHRoZSB0cmFjZSBmaWxlCisgICogVG9vbHRpcHMgZGlzcGxheSB0aGUgQVBJIGNhbGwgaW5kZXggYW5kIGVudHJ5cG9pbnQgbmFtZSBhbmQgcGFyYW1ldGVycworICAqIENsaWNrIGNhbGwgd2lsbCBjYXVzZSBBUEkgQ2FsbCBUcmVlIHRvIGhpZ2hsaWdodCBjYWxsCisqIEFQSSBlbnRyeXBvaW50cyBuYW1lcyAmIHBhcmFtZXRlcnMgZGlzcGxheWVkIGluIFVJCisqIFRyYWNpbmcgYW5kIHJlcGxheSBzdGFuZGFyZCBvdXRwdXQgZ2V0cyBkaXJlY3RlZCB0byBPdXRwdXQgd2luZG93CisqIFBsdWdpbi1iYXNlZCBVSSBhbGxvd3MgZm9yIGV4dGVuc2liaWxpdHkgdG8gb3RoZXIgQVBJcworKiBTZWFyY2ggQVBJIENhbGwgVHJlZQorICAqIFNlYXJjaCByZXN1bHQgbmF2aWdhdGlvbgorKiBBUEkgQ2FsbCBUcmVlIEVuaGFuY2VtZW50czoKKyAgKiBEcmF3IGNhbGwgbmF2aWdhdGlvbiBidXR0b25zCisgICogRHJhdyBjYWxscyBhcmUgc2hvd24gaW4gYm9sZCBmb250CisgICogIlJ1biB0byBoZXJlIiBjb250ZXh0IG1lbnUgb3B0aW9uIHRvIGNvbnRyb2wgd2hlcmUgUmVwbGF5ZXIgcGF1c2VzCisqIEdyb3VwIEFQSSBDYWxscyBieToKKyAgKiBGcmFtZSBib3VuZGFyeQorICAqIFRocmVhZCBJZAorKiBFeHBvcnQgQVBJIENhbGxzIGFzIFRleHQgZmlsZQorKiBTZXR0aW5ncyBkaWFsb2cKKworKipUT0RPIExJU1QgSU4gREVCVUdHRVIqKgorKiBIaWRlIC8gc2hvdyBjb2x1bW5zIG9uIEFQSSBDYWxsIFRyZWUKKyogU3RhdGUgZGVwZW5kZW5jeSBncmFwaCBhdCBzZWxlY3RlZCBBUEkgQ2FsbAorKiBHcm91cCBBUEkgQ2FsbHMgYnk6CisgICogQVBJLXNwZWNpZmljIGRlYnVnIGdyb3VwcworICAqIENvbW1hbmQgQnVmZmVyIFN1Ym1pc3Npb24KKyAgKiBSZW5kZXIgdnMgU3RhdGUgY2FsbHMKKyogU2F2aW5nICdzZXNzaW9uJyBkYXRhOgorICAqIFJlY2VudGx5IGxvYWRlZCB0cmFjZXMKKyogQ2FwdHVyZSBzdGF0ZSBmcm9tIHJlcGxheQorKiBSZXdpbmQgdGhlIHJlcGxheQorKiBDdXN0b20gdmlld2VycyBvZiBlYWNoIHN0YXRlIHR5cGUKKyogUGVyIEFQSSBlbnRyeXBvaW50IGNhbGwgc3RhY2tzCisqIENvbGxlY3QgYW5kIGRpc3BsYXkgbWFjaGluZSBpbmZvcm1hdGlvbgorKiA2NC1iaXQgYnVpbGQgc3VwcG9ydHMgMzItYml0IHRyYWNlIGZpbGVzCisqIFRpbWVsaW5lIGVuaGFuY2VtZW50czoKKyAgKiBQYW4gJiBab29tCisqIE9wdGltaXplIHRyYWNlIGZpbGUgbG9hZGluZyBieSBtZW1vcnktbWFwcGluZyB0aGUgZmlsZQorCisqKlNVUFBPUlRFRCBGRUFUVVJFUyBJTiBUUkFDSU5HL1JFUExBWUlORyBDT01NQU5EIExJTkUgVE9PTFMgQU5EIExJQlJBUklFUyoqCisqIENvbW1hbmQgbGluZSBUcmFjZXIgYXBwICh2a3RyYWNlKSB3aGljaCBsYXVuY2hlcyBnYW1lL2FwcCB3aXRoIHRyYWNpbmcgbGlicmFyeShpZXMpIGluc2VydGVkIGFuZCB3cml0ZXMgdHJhY2UgcGFja2V0cyB0byBhIGZpbGUKKyogQ29tbWFuZCBsaW5lIFRyYWNlciBzZXJ2ZXIgd2hpY2ggY29sbGVjdHMgdHJhY2luZyBwYWNrZXRzIG92ZXIgYSBzb2NrZXQgY29ubmVjdGlvbiBhbmQgd3JpdGVzIHRoZW0gdG8gYSBmaWxlCisqIFZ1bGthbiB0cmFjZXIgbGlicmFyeSBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIFZ1bGthbiBhcHBzCisqIENvbW1hbmQgbGluZSBSZXBsYXllciBhcHAgKHZrcmVwbGF5KSByZXBsYXlzIGEgVnVsa2FuIHRyYWNlIGZpbGUgd2l0aCBXaW5kb3cgZGlzcGxheSBvbiBMaW51eAorCisqKlRPRE8gTElTVCBJTiBUUkFDSU5HL1JFUExBWUlORyBDT01NQU5EIExJTkUgVE9PTFMgQU5EIExJQlJBUklFUyoqCisqIE9wdGltaXplIHJlcGxheSBzcGVlZCBieSB1c2luZyBoYXNoIG1hcHMgZm9yIG9wYXF1ZSBoYW5kbGVzCisqIEhhbmRsZSBYR0wgcGVyc2lzdGVudGx5IENQVSBtYXBwZWQgYnVmZmVycyBkdXJpbmcgdHJhY2luZywgcmF0aGVyIHRoZW4gcmVseWluZyBvbiB1cGRhdGluZyBkYXRhIGF0IHVubWFwIHRpbWUKKyogT3B0aW1pemUgUmVwbGF5ZXIgc3BlZWQgYnkgbWVtb3J5LW1hcHBpbmcgdGhlIGZpbGUgYW5kL29yIHJlYWRpbmcgZmlsZSBpbiBhIHNlcGFyYXRlIHRocmVhZAorKiBMb29waW5nIGluIFJlcGxheWVyIG92ZXIgYXJiaXRyYXJ5IGZyYW1lcyBvciBjYWxscworKiBMb29waW5nIGluIFJlcGxheWVyIHdpdGggc3RhdGUgcmVzdG9yYXRpb24gYXQgYmVnaW5uaW5nIG9mIGxvb3AKKyogUmVwbGF5ZXIgd2luZG93IGRpc3BsYXkgb2YgVnVsa2FuIG9uIFdpbmRvd3MgT1MKKyogQ29tbWFuZCBsaW5lIHRvb2wgdG8gZGlzcGxheSB0cmFjZSBmaWxlIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdAorKiBDb21tYW5kIGxpbmUgdG9vbCBmb3IgZWRpdGluZyB0cmFjZSBmaWxlcyBpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQKKyogUmVwbGF5ZXIgc3VwcG9ydHMgbXVsdGl0aHJlYWRpbmcKKyogNjQtYml0IGJ1aWxkIHN1cHBvcnRzIDMyLWJpdCB0cmFjZSBmaWxlcworKiBYR0wgdHJhY2luZyBhbmQgcmVwbGF5IGNyb3NzIHBsYXRmb3JtIHN1cHBvcnQgd2l0aCBkaWZmZXJpbmcgR1BVcworCisqKkxJS0UgVE8gSEFWRSBGVVRVUkUgRkVBVFVSRSBJREVBUyoqCisqIEV4cG9ydCB0cmFjZSBmaWxlIGludG8gKi5jcHAvaCBmaWxlcyB0aGF0IGNvbXBpbGUgaW50byBhIHJ1bm5hYmxlIGFwcGxpY2F0aW9uCisqIEVkaXRpbmcsIGFkZGluZywgcmVtb3ZhbCBvZiBBUEkgY2FsbHMKKyogU2hhZGVyIGVkaXRpbmcKKyogSHlwZXJsaW5rIEFQSSBDYWxsIFRyZWUgdG8gc3RhdGUtc3BlY2lmaWMgd2luZG93cwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvTElDRU5TRSBiL3ZrdHJhY2Uvc3JjL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3OWRkOAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL0xJQ0VOU0UKQEAgLTAsMCArMSwxNyBAQAorQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KK0NvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy9idWlsZF9vcHRpb25zLmNtYWtlIGIvdmt0cmFjZS9zcmMvYnVpbGRfb3B0aW9ucy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGUwYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvYnVpbGRfb3B0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDUxNSBAQAorIworIyBjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4KKyMKKyMgICBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlX0ZBUQorIyAgIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2VfVXNlZnVsX1ZhcmlhYmxlcworIyAgIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5odG1sCisjCisjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorCitzZXQoQlVJTERfWDY0ICIiIENBQ0hFIFNUUklORyAid2hldGhlciB0byBwZXJmb3JtIDY0LWJpdCBidWlsZDogT04gb3IgT0ZGIG92ZXJyaWRlcyBkZWZhdWx0IGRldGVjdGlvbiIpCisKK29wdGlvbihDTUFLRV9WRVJCT1NFICJWZXJib3NlIENNYWtlIiBGQUxTRSkKK2lmIChDTUFLRV9WRVJCT1NFKQorICAgIFNFVChDTUFLRV9WRVJCT1NFX01BS0VGSUxFIE9OKQorZW5kaWYoKQorCisjIFdpdGggZ2NjNDg6IGh0dHA6Ly9pbmRpY28uY2Vybi5jaC9nZXRGaWxlLnB5L2FjY2Vzcz9jb250cmliSWQ9MSZyZXNJZD0wJm1hdGVyaWFsSWQ9c2xpZGVzJmNvbmZJZD0yMzA3NjIKKworb3B0aW9uKFdJVEhfSEFSREVOSU5HICJFbmFibGUgaGFyZGVuaW5nOiBDb21waWxlLXRpbWUgcHJvdGVjdGlvbiBhZ2FpbnN0IHN0YXRpYyBzaXplZCBidWZmZXIgb3ZlcmZsb3dzIiBPRkYpCisKKyMgVW5sZXNzIHVzZXIgc3BlY2lmaWVzIEJVSUxEX1g2NCBleHBsaWNpdGx5LCBhc3N1bWUgbmF0aXZlIHRhcmdldAoraWYgKEJVSUxEX1g2NCBTVFJFUVVBTCAiIikKKyAgaWYgKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICBzZXQoQlVJTERfWDY0ICJUUlVFIikKKyAgZWxzZSgpCisgICAgc2V0KEJVSUxEX1g2NCAiRkFMU0UiKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgR2VuZXJhdGUgYml0bmVzcyBzdWZmaXggdG8gdXNlLCBidXQgbWFrZSBzdXJlIHRvIGluY2x1ZGUgdGhlIGV4aXN0aW5nIHN1ZmZpeCAoLmV4ZSkgCisjIGZvciBwbGF0Zm9ybXMgdGhhdCBuZWVkIGl0IChpZSwgV2luZG93cykKK2lmIChCVUlMRF9YNjQpCisgICAgc2V0KENNQUtFX0VYRUNVVEFCTEVfU1VGRklYICIke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSIpCisgICAgc2V0KENNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWCAiJHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9IikKK2Vsc2UoKQorICAgICMgRG9uJ3QgYWRkIHRoZSAzMiBmb3IgV2luZG93cyBiZWNhdXNlIGl0IGdvZXMgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24uCisgICAgaWYgKE1TVkMpCisgICAgICAgIHNldChDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWCAiJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0iKQorICAgICAgICBzZXQoQ01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYICIke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0iKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoQ01BS0VfRVhFQ1VUQUJMRV9TVUZGSVggIjMyJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0iKQorICAgICAgICBzZXQoQ01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYICIzMiR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSIpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCisjIERlZmF1bHQgdG8gcmVsZWFzZSBidWlsZAoraWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICAgIHNldChDTUFLRV9CVUlMRF9UWVBFIFJlbGVhc2UpCitlbmRpZigpCisKKyMgTWFrZSBzdXJlIHdlJ3JlIHVzaW5nIDY0LWJpdCB2ZXJzaW9ucyBvZiBzdGF0LCBmb3BlbiwgZXRjLgorIyBMYXJnZSBGaWxlIFN1cHBvcnQgZXh0ZW5zaW9uczoKKyMgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliYy9tYW51YWwvaHRtbF9ub2RlL0ZlYXR1cmUtVGVzdC1NYWNyb3MuaHRtbCNGZWF0dXJlLVRlc3QtTWFjcm9zCithZGRfZGVmaW5pdGlvbnMoLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1EX0xBUkdFX0ZJTEVTKQorCisjIHN1cHBvcnQgZm9yIGludHR5cGVzLmggbWFjcm9zCithZGRfZGVmaW5pdGlvbnMoLURfX1NURENfTElNSVRfTUFDUk9TIC1EX19TVERDX0ZPUk1BVF9NQUNST1MgLURfX1NURENfQ09OU1RBTlRfTUFDUk9TKQorCitpZihNU1ZDKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfTElTVCAiL1czIC9EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1M9MSAvRFdJTjMyIC9EX1dJTjMyIikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0VfTElTVCAiL08yIC9ETkRFQlVHIikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHX0xJU1QgIi9PZCAvRF9ERUJVRyIpCitlbHNlKCkKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX0xJU1QgIi1nIC1XYWxsIC1XZXh0cmEiKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRV9MSVNUICItZyAtTzIgLUROREVCVUciKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfREVCVUdfTElTVCAiLWcgLU8wIC1EX0RFQlVHIikKK2VuZGlmKCkKKworCitpZiAoJHtDTUFLRV9DX0NPTVBJTEVSX0lEfSBTVFJFUVVBTCAiQ2xhbmciKQorCisgICMgY2xhbmcgZG9lc24ndCBwcmludCBjb2xvcmVkIGRpYWdub3N0aWNzIHdoZW4gaW52b2tlZCBmcm9tIE5pbmphCisgIGlmIChVTklYIEFORCBDTUFLRV9HRU5FUkFUT1IgU1RSRVFVQUwgIk5pbmphIikKKyAgICAgIGFkZF9kZWZpbml0aW9ucyAoIi1mY29sb3ItZGlhZ25vc3RpY3MiKQorICBlbmRpZigpCisKKyAgaWYgKENMQU5HX0VWRVJZVEhJTkcpCisgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX0xJU1QgJHtDTUFLRV9DWFhfRkxBR1NfTElTVH0KKyAgICAgICAgICAjICItcGVkYW50aWMiICAgICAgICAgICAgICMgV2FybiBvbiBsYW5ndWFnZSBleHRlbnNpb25zCisgICAgICAgICAgIi1XZXZlcnl0aGluZyIgICAgICAgICAgICAjIEVuYWJsZSBhbGwgd2FybmluZ3MKKyAgICAgICAgICAiLWZkaWFnbm9zdGljcy1zaG93LWNhdGVnb3J5PW5hbWUiCisgICAgICAgICAgIi1Xbm8tdW51c2VkLW1hY3JvcyIKKyAgICAgICAgICAiLVduby1wYWRkZWQiCisgICAgICAgICAgIi1Xbm8tdmFyaWFkaWMtbWFjcm9zIgorICAgICAgICAgICItV25vLW1pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRpb25zIgorICAgICAgICAgICItV25vLW1pc3NpbmctcHJvdG90eXBlcyIKKyAgICAgICAgICAiLVduby1zaWduLWNvbnZlcnNpb24iCisgICAgICAgICAgIi1Xbm8tY29udmVyc2lvbiIKKyAgICAgICAgICAiLVduby1jYXN0LWFsaWduIgorICAgICAgICAgICItV25vLWV4aXQtdGltZS1kZXN0cnVjdG9ycyIKKyAgICAgICAgICAiLVduby1kb2N1bWVudGF0aW9uLWRlcHJlY2F0ZWQtc3luYyIKKyAgICAgICAgICAiLVduby1kb2N1bWVudGF0aW9uLXVua25vd24tY29tbWFuZCIKKworICAgICAgICAgICMgVE9ETzogV291bGQgYmUgZ3JlYXQgdG8gc3RhcnQgZW5hYmxpbmcgc29tZSBvZiB0aGVzZSB3YXJuaW5ncy4uLgorICAgICAgICAgICItV25vLXVuZGVmaW5lZC1yZWludGVycHJldC1jYXN0IgorICAgICAgICAgICItV25vLWluY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzLWRpc2NhcmRzLXF1YWxpZmllcnMiCisgICAgICAgICAgIi1Xbm8tZmxvYXQtZXF1YWwiCisgICAgICAgICAgIi1Xbm8tdW5yZWFjaGFibGUtY29kZSIKKyAgICAgICAgICAiLVduby13ZWFrLXZ0YWJsZXMiCisgICAgICAgICAgIi1Xbm8tZXh0cmEtc2VtaSIKKyAgICAgICAgICAiLVduby1kaXNhYmxlZC1tYWNyby1leHBhbnNpb24iCisgICAgICAgICAgIi1Xbm8tZm9ybWF0LW5vbmxpdGVyYWwiCisgICAgICAgICAgIi1Xbm8tcGFja2VkIgorICAgICAgICAgICItV25vLWMrKzExLWxvbmctbG9uZyIKKyAgICAgICAgICAiLVduby1jKysxMS1leHRlbnNpb25zIgorICAgICAgICAgICItV25vLWdudS1hbm9ueW1vdXMtc3RydWN0IgorICAgICAgICAgICItV25vLWdudS16ZXJvLXZhcmlhZGljLW1hY3JvLWFyZ3VtZW50cyIKKyAgICAgICAgICAiLVduby1uZXN0ZWQtYW5vbi10eXBlcyIKKyAgICAgICAgICAiLVduby1nbnUtcmVkZWNsYXJlZC1lbnVtIgorCisgICAgICAgICAgIi1Xbm8tcGVkYW50aWMiCisgICAgICAgICAgIi1Xbm8taGVhZGVyLWh5Z2llbmUiCisgICAgICAgICAgIi1Xbm8tY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCIKKyAgICAgICAgICAiLVduby1kdXBsaWNhdGUtZW51bSIKKyAgICAgICAgICAiLVduby1zd2l0Y2gtZW51bSIKKyAgICAgICAgICAiLVduby1leHRyYS10b2tlbnMiCisKKyAgICAgICAgICAjIEFkZGVkIGJlY2F1c2UgU0RMMiBoZWFkZXJzIGhhdmUgYSB0b24gb2YgRG94eWdlbiB3YXJuaW5ncyBjdXJyZW50bHkuCisgICAgICAgICAgIi1Xbm8tZG9jdW1lbnRhdGlvbiIKKworICAgICAgICAgICkKKyAgZW5kaWYoKQorCitlbmRpZigpCisKKworaWYgKChOT1QgTVNWQykgQU5EIChOT1QgQlVJTERfWDY0KSBBTkQgKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHU19MSVNUICIke0NNQUtFX0NYWF9GTEFHU19MSVNUfSAtbTMyIikKKyAgICBzZXQoQ01BS0VfRVhFX0xJTktfRkxBR1NfTElTVCAiJHtDTUFLRV9FWEVfTElOS19GTEFHU19MSVNUfSAtbTMyIikKKyAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktfRkxBR1NfTElTVCAiJHtDTUFLRV9TSEFSRURfTElOS19GTEFHU19MSVNUfSAtbTMyIikKKworICAgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRklORF9MSUJSQVJZX1VTRV9MSUI2NF9QQVRIUyBPRkYpCisgICAgc2V0KENNQUtFX1NZU1RFTV9MSUJSQVJZX1BBVEggL2xpYjMyIC91c3IvbGliMzIgL3Vzci9saWIvaTM4Ni1saW51eC1nbnUgL3Vzci9sb2NhbC9saWIzMikKKyAgICBzZXQoQ01BS0VfSUdOT1JFX1BBVEggL2xpYiAvdXNyL2xpYiAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251IC91c3IvbGliNjQgL3Vzci9sb2NhbC9saWIpCitlbmRpZigpCisKK2Z1bmN0aW9uKGFkZF9jb21waWxlcl9mbGFnIGZsYWcpCisgICAgc2V0KENNQUtFX0NfRkxBR1MgICAgIiR7Q01BS0VfQ19GTEFHU30gICAke2ZsYWd9IiBQQVJFTlRfU0NPUEUpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2ZsYWd9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKGFkZF9jX2NvbXBpbGVyX2ZsYWcgZmxhZykKKyAgICBzZXQoQ01BS0VfQ19GTEFHUyAgICAiJHtDTUFLRV9DX0ZMQUdTfSAgICR7ZmxhZ30iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24oYWRkX2NwcF9jb21waWxlcl9mbGFnIGZsYWcpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2ZsYWd9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKGFkZF9jb21waWxlcl9mbGFnX2RlYnVnIGZsYWcpCisgICAgc2V0KENNQUtFX0NfRkxBR1NfREVCVUcgICAgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gICAke2ZsYWd9IiBQQVJFTlRfU0NPUEUpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHU19ERUJVRyAgIiR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSAke2ZsYWd9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKGFkZF9jb21waWxlcl9mbGFnX3JlbGVhc2UgZmxhZykKKyAgICBzZXQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICAgICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gICAke2ZsYWd9IiBQQVJFTlRfU0NPUEUpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHU19SRUxFQVNFICAiJHtDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRX0gJHtmbGFnfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisKK2Z1bmN0aW9uKGFkZF9saW5rZXJfZmxhZyBmbGFnKQorICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICAgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU30gJHtmbGFnfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbihhZGRfc2hhcmVkX2xpbmtlcl9mbGFnIGZsYWcpCisgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgICAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSAke2ZsYWd9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMKKyMgVG8gc2hvdyB0aGUgaW5jbHVkZSBmaWxlcyBhcyB5b3UncmUgYnVpbGRpbmcsIGRvIHRoaXM6CisjICAgIGFkZF9jb21waWxlcl9mbGFnKCItSCIpCisjIEZvciBWaXN1YWwgU3R1ZGlvLCBpdCdzIC9zaG93SW5jbHVkZXMgSSBiZWxpZXZlLi4uCisjCisKKyMgc3RhY2stcHJvdGVjdG9yLXN0cm9uZzogaHR0cDovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMTItMDYvbXNnMDA5NzQuaHRtbAorIyMgLWZzdGFjay1wcm90ZWN0b3Itc3Ryb25nCisjIENvbXBpbGUgd2l0aCB0aGUgb3B0aW9uICItZnN0YWNrLXVzYWdlIiBhbmQgYSBmaWxlIC5zdSB3aWxsIGJlIGdlbmVyYXRlZCB3aXRoIHN0YWNrCisjIGluZm9ybWF0aW9uIGZvciBlYWNoIGZ1bmN0aW9uLgorIyMgLWZzdGFjay11c2FnZQorCisjIEZvciBtb3JlIGluZm8gb24gLWZuby1zdHJpY3QtYWxpYXNpbmc6ICJKdXN0IFNheSBObyB0byBzdHJpY3QgYWxpYXNpbmcgb3B0aW1pemF0aW9ucyBpbiBDIjogaHR0cDovL25vdGhpbmdzLm9yZy8KKyMgVGhlIExpbnV4IGtlcm5lbCBpcyBjb21waWxlZCB3aXRoIC1mbm8tc3RyaWN0LWFsaWFzaW5nOiBodHRwczovL2xrbWwub3JnL2xrbWwvMjAwMy8yLzI2LzE1OCBvciBodHRwOi8vd3d3Lm1haWwtYXJjaGl2ZS5jb20vbGludXgtYnRyZnNAdmdlci5rZXJuZWwub3JnL21zZzAxNjQ3Lmh0bWwKKworIyMjIFRPRE86IHNlZSBpZiBzc2UgaXMgZ2VuZXJhdGVkIHdpdGggdGhlc2UgaW5zdHJ1Y3Rpb25zIGFuZCBjbGFuZzoKKyMjIC1tYXJjaD1jb3JlaTcgLW1zc2UgLW1mcG1hdGg9c3NlCisKK2lmICgke0NNQUtFX0NfQ09NUElMRVJfSUR9IFNUUkVRVUFMICJDbGFuZyIpCisgICBpZiAoIE5PVCBCVUlMRF9YNjQgKQorICAgICAgIyBGaXggc3RhcnR1cCBjcmFzaCBpbiBkbG9wZW5fbm90aWZ5X2NhbGxiYWNrIChjYWxsZWQgaW5kaXJlY3RseSBmcm9tIG91ciBkbG9wZW4oKSBmdW5jdGlvbikgd2hlbiB0cmFjaW5nIGdseHNwaGVyZXMgb24gbXkgQU1EIGRldiBib3ggKHg4NiByZWxlYXNlIG9ubHkpCisgICAgICAjIEFsc28gZml4ZXMgdHJhY2luZyBRMyBBcmVuYSB1c2luZyByZWxlYXNlIHRyYWNlcgorICAgICAgIyBDbGFuZyBpcyBnZW5lcmF0aW5nIHNzZTIgY29kZSBldmVuIHdoZW4gaXQgc2hvdWxkbid0IGJlOgorICAgICAgIyAgaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L3BpcGVybWFpbC9jZmUtZGV2LzIwMTItTWFyY2gvMDIwMzEwLmh0bWwKKyAgICAgIHNldChNQVJDSF9TVFIgIi1tYXJjaD1pNTg2IikKKyAgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoTVNWQykKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX0xJU1QKKyAgICAgICAgJHtDTUFLRV9DWFhfRkxBR1NfTElTVH0KKyAgICAgICAgIi9FSHNjIiAjIE5lZWQgZXhjZXB0aW9ucworICAgICkKK2Vsc2UoKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfTElTVAorICAgICAgICAke0NNQUtFX0NYWF9GTEFHU19MSVNUfQorICAgICAgICAiLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIiCisgICAgICAgICR7TUFSQ0hfU1RSfQorICAgICAgICAjICItbXNzZTIgLW1mcG1hdGg9c3NlIiAjIFRvIGJ1aWxkIHdpdGggU1NFIGluc3RydWN0aW9uIHNldHMKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXVudXNlZC1mdW5jdGlvbiIKKyAgICAgICAgIi1mbm8tc3RyaWN0LWFsaWFzaW5nIiAjIERPIE5PVCByZW1vdmUgdGhpcywgd2UgaGF2ZSBsb3RzIG9mIGNvZGUgdGhhdCB3aWxsIGZhaWwgaW4gb2JzY3VyZSB3YXlzIG90aGVyd2lzZSBiZWNhdXNlIGl0IHdhcyBkZXZlbG9wZWQgd2l0aCBNU1ZDIGZpcnN0LgorICAgICAgICAiLWZuby1tYXRoLWVycm5vIgorICAgIAkgICItZnZpc2liaWxpdHk9aGlkZGVuIgorICAgICAgICAjICItZm5vLWV4Y2VwdGlvbnMiICMgRXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBjKysgZmlsZXMsIGRpc2FibGVkIGZvciBjIGZpbGVzLgorICAgICkKK2VuZGlmKCkKKworaWYgKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDKQorICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7Q01BS0VfQ19DT01QSUxFUn0gJHtDTUFLRV9DX0NPTVBJTEVSX0FSRzF9IC1kdW1wdmVyc2lvbiBPVVRQVVRfVkFSSUFCTEUgR0NDX1ZFUlNJT04pCisgICAgc3RyaW5nKFJFR0VYIE1BVENIQUxMICJbMC05XSsiIEdDQ19WRVJTSU9OX0NPTVBPTkVOVFMgJHtHQ0NfVkVSU0lPTn0pCisgICAgbGlzdChHRVQgR0NDX1ZFUlNJT05fQ09NUE9ORU5UUyAwIEdDQ19NQUpPUikKKyAgICBsaXN0KEdFVCBHQ0NfVkVSU0lPTl9DT01QT05FTlRTIDEgR0NDX01JTk9SKQorICAgICMgbWVzc2FnZShTVEFUVVMgIkRldGVjdGVkIEdDQyB2ICR7R0NDX01BSk9SfSAuICR7R0NDX01JTk9SfSIpCitlbmRpZigpCisKK2lmIChHQ0NfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVIgNC44IE9SIEdDQ19WRVJTSU9OIFZFUlNJT05fRVFVQUwgNC44KQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfTElTVCAke0NNQUtFX0NYWF9GTEFHU19MSVNUfQorICAgICAgICAiLVduby11bnVzZWQtbG9jYWwtdHlwZWRlZnMiCisgICAgKQorZW5kaWYoKQorCitpZiAoTVNWQykKK2Vsc2UoKQorICAgIGlmIChXSVRIX0hBUkRFTklORykKKyAgICAgICAgIyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNC0wOS9tc2cwMjA1NS5odG1sCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRF9GT1JUSUZZX1NPVVJDRT0yIC1mcGljKQorICAgICAgICBpZiAoJHtDTUFLRV9DX0NPTVBJTEVSX0lEfSBTVFJFUVVBTCAiR05VIikKKyAgICAgICAgICAgICMgRHVyaW5nIHByb2dyYW0gbG9hZCwgc2V2ZXJhbCBFTEYgbWVtb3J5IHNlY3Rpb25zIG5lZWQgdG8gYmUgd3JpdHRlbiB0byBieSB0aGUKKyAgICAgICAgICAgICMgbGlua2VyLCBidXQgY2FuIGJlIHR1cm5lZCByZWFkLW9ubHkgYmVmb3JlIHR1cm5pbmcgb3ZlciBjb250cm9sIHRvIHRoZQorICAgICAgICAgICAgIyBwcm9ncmFtLiBUaGlzIHByZXZlbnRzIHNvbWUgR09UIChhbmQgLmR0b3JzKSBvdmVyd3JpdGUgYXR0YWNrcywgYnV0IGF0IGxlYXN0CisgICAgICAgICAgICAjIHRoZSBwYXJ0IG9mIHRoZSBHT1QgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgKC5nb3QucGx0KSBpcyBzdGlsbCB2dWxuZXJhYmxlLgorICAgICAgICAgICAgYWRkX2RlZmluaXRpb25zKC1waWUgLXogbm93IC16IHJlbHJvKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZiAoTk9UIE1TVkMpCisgICAgaWYoQVBQTEUpCisgICAgICAgIHNldChDTUFLRV9FWEVfTElOS19GTEFHU19MSVNUICItV2wsLXVuZGVmaW5lZCxlcnJvciIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChDTUFLRV9FWEVfTElOS19GTEFHU19MSVNUICItV2wsLS1uby11bmRlZmluZWQiKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBDb21waWxlciBmbGFncworc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBDTUFLRV9DX0ZMQUdTICAgICAgICAgICAgICAiJHtDTUFLRV9DWFhfRkxBR1NfTElTVH0iKQorc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgICAgICAiJHtDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRV9MSVNUfSIpCitzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIENNQUtFX0NfRkxBR1NfREVCVUcgICAgICAgICIke0NNQUtFX0NYWF9GTEFHU19ERUJVR19MSVNUfSIpCisKK3N0cmluZyhSRVBMQUNFICI7IiAiICIgQ01BS0VfQ1hYX0ZMQUdTICAgICAgICAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX0xJU1R9IikKK3N0cmluZyhSRVBMQUNFICI7IiAiICIgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0VfTElTVH0iKQorc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBDTUFLRV9DWFhfRkxBR1NfREVCVUcgICAgICAiJHtDTUFLRV9DWFhfRkxBR1NfREVCVUdfTElTVH0iKQorCisjIExpbmtlciBmbGFncyAoZXhlKQorc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICAgICAiJHtDTUFLRV9FWEVfTElOS19GTEFHU19MSVNUfSIpCisjIExpbmtlciBmbGFncyAoc2hhcmVkKQorc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICAiJHtDTUFLRV9TSEFSRURfTElOS19GTEFHU19MSVNUfSIpCisKK3NldChDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgJHtQUk9KRUNUX0JJTkFSWV9ESVJ9Ly4uLy4uLykKK3NldChDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgJHtQUk9KRUNUX0JJTkFSWV9ESVJ9Ly4uLy4uLykKKworCitmdW5jdGlvbihidWlsZF9vcHRpb25zX2ZpbmFsaXplKQorICAgIGlmIChDTUFLRV9WRVJCT1NFKQorICAgICAgICBtZXNzYWdlKCIgIENNQUtFX1BST0pFQ1RfTkFNRTogJHtDTUFLRV9QUk9KRUNUX05BTUV9IikKKyAgICAgICAgbWVzc2FnZSgiICBQUk9KRUNUX05BTUU6ICR7UFJPSkVDVF9OQU1FfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgQlVJTERfWDY0OiAke0JVSUxEX1g2NH0iKQorICAgICAgICBtZXNzYWdlKCIgIEJVSUxEX1RZUEU6ICR7Q01BS0VfQlVJTERfVFlQRX0iKQorICAgICAgICBtZXNzYWdlKCIgIENNQUtFX0JJTkFSWV9ESVI6ICR7Q01BS0VfQklOQVJZX0RJUn0iKQorICAgICAgICBtZXNzYWdlKCIgIFBST0pFQ1RfQklOQVJZX0RJUjogJHtQUk9KRUNUX0JJTkFSWV9ESVJ9IikKKyAgICAgICAgbWVzc2FnZSgiICBDTUFLRV9TT1VSQ0VfRElSOiAke0NNQUtFX1NPVVJDRV9ESVJ9IikKKyAgICAgICAgbWVzc2FnZSgiICBQUk9KRUNUX1NPVVJDRV9ESVI6ICR7UFJPSkVDVF9TT1VSQ0VfRElSfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgQ01BS0VfQ1VSUkVOVF9MSVNUX0ZJTEU6ICR7Q01BS0VfQ1VSUkVOVF9MSVNUX0ZJTEV9IikKKyAgICAgICAgbWVzc2FnZSgiICBDWFhfRkxBR1M6ICR7Q01BS0VfQ1hYX0ZMQUdTfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgQ1hYX0ZMQUdTX1JFTEVBU0U6ICR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IikKKyAgICAgICAgbWVzc2FnZSgiICBDWFhfRkxBR1NfREVCVUc6ICR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgRVhFX0xJTktFUl9GTEFHUzogJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgU0hBUkVEX0xJTktFUl9GTEFHUzogJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgU0hBUkVEX0xJQlJBUllfQ19GTEFHUzogJHtDTUFLRV9TSEFSRURfTElCUkFSWV9DX0ZMQUdTfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgU0hBUkVEX0xJQlJBUllfQ1hYX0ZMQUdTOiAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX0NYWF9GTEFHU30iKQorICAgICAgICBtZXNzYWdlKCIgIFNIQVJFRF9MSUJSQVJZX0xJTktfQ1hYX0ZMQUdTOiAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX0xJTktfQ1hYX0ZMQUdTfSIpCisgICAgICAgIG1lc3NhZ2UoIiAgU0hBUkVEX0xJQlJBUllfTElOS19DX0ZMQUdTOiAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX0xJTktfQ19GTEFHU30iKQorICAgICAgICBtZXNzYWdlKCIgIENNQUtFX0NfQ09NUElMRVI6ICR7Q01BS0VfQ19DT01QSUxFUn0iKQorICAgICAgICBtZXNzYWdlKCIgIENNQUtFX0NYWF9DT01QSUxFUjogJHtDTUFLRV9DWFhfQ09NUElMRVJ9IikKKyAgICAgICAgbWVzc2FnZSgiICBDTUFLRV9DX0NPTVBJTEVSX0lEOiAke0NNQUtFX0NfQ09NUElMRVJfSUR9IikKKyAgICAgICAgbWVzc2FnZSgiICBDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWDogJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0iKQorICAgICAgICBtZXNzYWdlKCIiKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24ocmVxdWlyZV9wdGhyZWFkcykKKyAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKKyAgICBpZiAoTk9UIENNQUtFX1VTRV9QVEhSRUFEU19JTklUIEFORCBOT1QgV0lOMzJfUFRIUkVBRFNfSU5DTFVERV9QQVRIKQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJwdGhyZWFkIG5vdCBmb3VuZCIpCisgICAgZW5kaWYoKQorCisgICAgaWYgKE1TVkMpCisgICAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7V0lOMzJfUFRIUkVBRFNfSU5DTFVERV9QQVRIfSIpCisgICAgICAgIGlmIChCVUlMRF9YNjQpCisgICAgICAgICAgICBzZXQoUFRIUkVBRF9TUkNfTElCICIke1dJTjMyX1BUSFJFQURTX1BBVEh9L2xpYi94NjQvcHRocmVhZFZDMi5saWIiIFBBUkVOVF9TQ09QRSkKKyAgICAgICAgICAgIHNldChQVEhSRUFEX1NSQ19ETEwgIiR7V0lOMzJfUFRIUkVBRFNfUEFUSH0vZGxsL3g2NC9wdGhyZWFkVkMyLmRsbCIgUEFSRU5UX1NDT1BFKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldChQVEhSRUFEX1NSQ19MSUIgIiR7V0lOMzJfUFRIUkVBRFNfUEFUSH0vbGliL3g4Ni9wdGhyZWFkVkMyLmxpYiIgUEFSRU5UX1NDT1BFKQorICAgICAgICAgICAgc2V0KFBUSFJFQURfU1JDX0RMTCAiJHtXSU4zMl9QVEhSRUFEU19QQVRIfS9kbGwveDg2L3B0aHJlYWRWQzIuZGxsIiBQQVJFTlRfU0NPUEUpCisgICAgICAgIGVuZGlmKCkKKworICAgIGVsc2UoKQorICAgICAgICAjIEV4cG9ydCB0aGUgdmFyaWFibGUgdG8gdGhlIHBhcmVudCBzY29wZSBzbyB0aGUgbGlua2VyIGtub3dzIHdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcnkuCisgICAgICAgIHNldChDTUFLRV9USFJFQURfTElCU19JTklUICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0gUEFSRU5UX1NDT1BFKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24ocmVxdWlyZV9saWJqcGVndHVyYm8pCisgICAgZmluZF9saWJyYXJ5KExpYkpwZWdUdXJib19MSUJSQVJZCisgICAgICAgIE5BTUVTIGxpYnR1cmJvanBlZy5zbyBsaWJ0dXJib2pwZWcuc28uMCBsaWJ0dXJib2pwZWcuZHlsaWIKKyAgICAgICAgUEFUSFMgL29wdC9saWJqcGVnLXR1cmJvL2xpYiAKKyAgICApCisKKyAgICAjIE9uIHBsYXRmb3JtcyB0aGF0IGZpbmQgdGhpcywgdGhlIGluY2x1ZGUgZmlsZXMgd2lsbCBoYXZlIGFsc28gYmVlbiBpbnN0YWxsZWQgdG8gdGhlIHN5c3RlbQorICAgICMgc28gd2UgZG9uJ3QgbmVlZCBleHRyYSBpbmNsdWRlIGRpcnMuCisgICAgaWYgKExpYkpwZWdUdXJib19MSUJSQVJZKQorICAgICAgICBzZXQoTGliSnBlZ1R1cmJvX0lOQ0xVREUgIiIgUEFSRU5UX1NDT1BFKQorICAgIGVsc2UoKQorICAgICAgICBpZiAoQlVJTERfWDY0KQorICAgICAgICAgICAgc2V0KEJJVFNfU1RSSU5HICJ4NjQiKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldChCSVRTX1NUUklORyAieDg2IikKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBzZXQoTGliSnBlZ1R1cmJvX0lOQ0xVREUgIiR7Q01BS0VfUFJFRklYX1BBVEh9L2xpYmpwZWctdHVyYm8tMi4xLjMvaW5jbHVkZSIgUEFSRU5UX1NDT1BFKQorICAgICAgICBzZXQoTGliSnBlZ1R1cmJvX0xJQlJBUlkgIiR7Q01BS0VfUFJFRklYX1BBVEh9L2xpYmpwZWctdHVyYm8tMi4xLjMvbGliXyR7QklUU19TVFJJTkd9L3R1cmJvanBlZy5saWIiIFBBUkVOVF9TQ09QRSkKKyAgICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKHJlcXVpcmVfc2RsMikKKyAgICBpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTGludXgiKQorICAgICAgICBpbmNsdWRlKEZpbmRQa2dDb25maWcpCisgICAgICAgIHBrZ19zZWFyY2hfbW9kdWxlKFBDX1NETDIgUkVRVUlSRUQgc2RsMikKKworICAgICAgICBmaW5kX3BhdGgoU0RMMl9JTkNMVURFIFNETC5oCisgICAgICAgICAgICBET0MgIlNETDIgSW5jbHVkZSBQYXRoIgorCSAgICBISU5UUyAke1BDX1NETDJfSU5DTFVERURJUn0gJHtQQ19TREwyX0lOQ0xVREVfRElSU30gKQorCisgICAgICAgIGZpbmRfbGlicmFyeShTREwyX0xJQlJBUlkgU0RMMgorICAgICAgICAgICAgRE9DICJTREwyIExpYnJhcnkiCisJICAgIEhJTlRTICR7UENfU0RMMl9MSUJESVJ9ICR7UENfU0RMMl9MSUJSQVJZX0RJUlN9ICkKKyAgICBlbHNlaWYgKE1TVkMpCisgICAgICAgIHNldChTREwyUm9vdCAiJHtDTUFLRV9FWFRFUk5BTF9QQVRIfS9TREwiKQorCisgICAgICAgIHNldChTREwyX0lOQ0xVREUgIiR7U0RMMlJvb3R9L2luY2x1ZGUiIENBQ0hFIFBBVEggIlNETDIgSW5jbHVkZSBQYXRoIikKKyAgICAgICAgc2V0KFNETDJfTElCUkFSWSAiJHtDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll9LyR7Q01BS0VfQ0ZHX0lOVERJUn0vU0RMMi5saWIiIENBQ0hFIEZJTEVQQVRIICJTREwyIExpYnJhcnkiKQorCisgICAgICAgICMgT25seSB3YW50IHRvIGluY2x1ZGUgdGhpcyBvbmNlLgorICAgICAgICAjIFRoaXMgaGFzIHRvIGdvIGludG8gcHJvcGVydGllcyBiZWNhdXNlIGl0IG5lZWRzIHRvIHBlcnNpc3QgYWNyb3NzIHRoZSBlbnRpcmUgY21ha2UgcnVuLgorICAgICAgICBnZXRfcHJvcGVydHkoU0RMX1BST0pFQ1RfQUxSRUFEWV9JTkNMVURFRCAKKyAgICAgICAgICAgIEdMT0JBTCAKKyAgICAgICAgICAgIFBST1BFUlRZIFNETF9QUk9KRUNUX0lOQ0xVREVECisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgKE5PVCBTRExfUFJPSkVDVF9BTFJFQURZX0lOQ0xVREVEKQorICAgICAgICAgICAgSU5DTFVERV9FWFRFUk5BTF9NU1BST0pFQ1QoU0RMICIke1NETDJSb290fS9WaXN1YWxDL1NETC9TRExfVlMyMDEzLnZjeHByb2oiKQorICAgICAgICAgICAgc2V0X3Byb3BlcnR5KEdMT0JBTAorICAgICAgICAgICAgICAgIFBST1BFUlRZIFNETF9QUk9KRUNUX0lOQ0xVREVEICJUUlVFIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIG1lc3NhZ2UoIkluY2x1ZGluZyBTRExfVlMyMDEzLnZjeHByb2ogZm9yIHlvdSEiKQorICAgICAgICBlbmRpZigpCisKKyAgICBlbHNlKCkKKyAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiTmVlZCB0byBkZWFsIHdpdGggU0RMIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyIpCisgICAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbihyZXF1aXJlX20pCisgICAgaWYgKE1TVkMpCisJc2V0KE1fTElCUkFSWSAid2lubW0ubGliIiBQQVJFTlRfU0NPUEUpCisgICAgZWxzZSgpCisJc2V0KE1fTElCUkFSWSAibSIgUEFSRU5UX1NDT1BFKQorICAgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24ocmVxdWlyZV9nbCkKKyAgICBpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTGludXgiKQorCWluY2x1ZGUoRmluZFBrZ0NvbmZpZykKKwlwa2dfc2VhcmNoX21vZHVsZShQQ19HTCBRVUlFVCBnbCkKKworCWZpbmRfcGF0aChHTF9JTkNMVURFIEdML2dsLmgKKwkgICAgRE9DICJPcGVuR0wgSW5jbHVkZSBQYXRoIgorCSAgICBISU5UUyAke1BDX0dMX0lOQ0xVREVESVJ9ICR7UENfR0xfSU5DTFVERV9ESVJTfSApCisKKwlmaW5kX2xpYnJhcnkoR0xfTElCUkFSWSBHTAorCSAgICBET0MgIk9wZW5HTCBMaWJyYXJ5IgorCSAgICBISU5UUyAke1BDX0dMX0xJQkRJUn0gJHtQQ19HTF9MSUJSQVJZX0RJUlN9ICkKKyAgICBlbHNlaWYgKE1TVkMpCisJc2V0KEdMX0lOQ0xVREUgIiIJICAgICAgQ0FDSEUgUEFUSCAiT3BlbkdMIEluY2x1ZGUgUGF0aCIpCisJc2V0KEdMX0xJQlJBUlkgIm9wZW5nbDMyLmxpYiIgQ0FDSEUgRklMRVBBVEggIk9wZW5HTCBMaWJyYXJ5IikKKyAgICBlbHNlKCkKKwlzZXQoR0xfSU5DTFVERSAiIiAgIENBQ0hFIFBBVEggIk9wZW5HTCBJbmNsdWRlIFBhdGgiKQorCXNldChHTF9MSUJSQVJZICJHTCIgQ0FDSEUgRklMRVBBVEggIk9wZW5HTCBMaWJyYXJ5IikKKyAgICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKHJlcXVpcmVfZ2x1KQorICAgIGlmICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJMaW51eCIpCisJaW5jbHVkZShGaW5kUGtnQ29uZmlnKQorCXBrZ19zZWFyY2hfbW9kdWxlKFBDX0dMVSBRVUlFVCBnbHUpCisKKwlmaW5kX3BhdGgoR0xVX0lOQ0xVREUgR0wvZ2x1LmgKKwkgICAgRE9DICJHTFUgSW5jbHVkZSBQYXRoIgorCSAgICBISU5UUyAke1BDX0dMVV9JTkNMVURFRElSfSAke1BDX0dMVV9JTkNMVURFX0RJUlN9ICkKKworCWZpbmRfbGlicmFyeShHTFVfTElCUkFSWSBHTFUKKwkgICAgRE9DICJHTFUgTGlicmFyeSIKKwkgICAgSElOVFMgJHtQQ19HTFVfTElCRElSfSAke1BDX0dMVV9MSUJSQVJZX0RJUlN9ICkKKyAgICBlbHNlaWYgKE1TVkMpCisJc2V0KEdMVV9JTkNMVURFICIiCSAgICBDQUNIRSBQQVRIICJHTFUgSW5jbHVkZSBQYXRoIikKKwlzZXQoR0xVX0xJQlJBUlkgImdsdTMyLmxpYiIgQ0FDSEUgRklMRVBBVEggIkdMVSBMaWJyYXJ5IikKKyAgICBlbHNlKCkKKwlzZXQoR0xVX0lOQ0xVREUgIiIgICAgQ0FDSEUgUEFUSCAiR0xVIEluY2x1ZGUgUGF0aCIpCisJc2V0KEdMVV9MSUJSQVJZICJHTFUiIENBQ0hFIEZJTEVQQVRIICJHTFUgTGlicmFyeSIpCisgICAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbihyZXF1ZXN0X2JhY2t0cmFjZSkKKyAgICBpZiAoTk9UIE1TVkMpCisgICAgICAgIHNldCggTGliQmFja1RyYWNlX0lOQ0xVREUgIiR7U1JDX0RJUn0vbGliYmFja3RyYWNlIiBQQVJFTlRfU0NPUEUgKQorICAgICAgICBzZXQoIExpYkJhY2tUcmFjZV9MSUJSQVJZICJiYWNrdHJhY2V2b2dsIiBQQVJFTlRfU0NPUEUgKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoIExpYkJhY2tUcmFjZV9JTkNMVURFICIiIFBBUkVOVF9TQ09QRSApCisgICAgICAgIHNldCggTGliQmFja1RyYWNlX0xJQlJBUlkgIiIgUEFSRU5UX1NDT1BFICkKKyAgICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgV2hhdCBjb21waWxlciB0b29sY2hhaW4gYXJlIHdlIGJ1aWxkaW5nIG9uPworaWYgKCR7Q01BS0VfQ19DT01QSUxFUl9JRH0gU1RSRVFVQUwgIkdOVSIpCisgICAgYWRkX2NvbXBpbGVyX2ZsYWcoIi1EQ09NUElMRVJfR0NDPTEiKQorICAgIGFkZF9jb21waWxlcl9mbGFnKCItRENPTVBJTEVSX0dDQ0xJS0U9MSIpCitlbHNlaWYgKCR7Q01BS0VfQ19DT01QSUxFUl9JRH0gU1RSRVFVQUwgIm1pbmd3IikKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLURDT01QSUxFUl9NSU5HVz0xIikKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLURDT01QSUxFUl9HQ0NMSUtFPTEiKQorZWxzZWlmIChNU1ZDKQorICAgIGFkZF9jb21waWxlcl9mbGFnKCItRENPTVBJTEVSX01TVkM9MSIpCitlbHNlaWYgKCR7Q01BS0VfQ19DT01QSUxFUl9JRH0gU1RSRVFVQUwgIkNsYW5nIikKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLURDT01QSUxFUl9DTEFORz0xIikKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLURDT01QSUxFUl9HQ0NMSUtFPTEiKQorZWxzZSgpCisgICAgbWVzc2FnZSgiQ29tcGlsZXIgaXMgJHtDTUFLRV9DX0NPTVBJTEVSX0lEfSIpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ29tcGlsZXIgdW5zZXQsIGJ1aWxkIHdpbGwgZmFpbC0tc3RvcHBpbmcgYXQgQ01ha2UgdGltZS4iKQorZW5kaWYoKQorCisjIFBsYXRmb3JtIHNwZWNpZmljIGxpYnJhcnkgZGVmaW5lcy4KK2lmIChXSU4zMikKKyAgICBzZXQoIExJQlJUICIiICkKKyAgICBzZXQoIExJQkRMICIiICkKKworZWxzZWlmIChVTklYKQorICAgIHNldCggTElCUlQgcnQgKQorICAgIHNldCggTElCREwgZGwgKQorZWxzZSgpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiTmVlZCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgbGlicmFyeSBuYW1lIGZvciAncnQnIGlzIGZvciBub24td2luZG93cywgbm9uLXVuaXggcGxhdGZvcm1zIChvciBpZiBpdCdzIGV2ZW4gbmVlZGVkKS4iKQorZW5kaWYoKQorCisjIFdoYXQgT1Mgd2lsbCB3ZSBiZSBydW5uaW5nIG9uPworaWYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIpCisgICAgYWRkX2NvbXBpbGVyX2ZsYWcoIi1EUExBVEZPUk1fT1NYPTEiKQorICAgIGFkZF9jb21waWxlcl9mbGFnKCItRFBMQVRGT1JNX1BPU0lYPTEiKQorZWxzZWlmICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJMaW51eCIpCisgICAgYWRkX2NvbXBpbGVyX2ZsYWcoIi1EUExBVEZPUk1fTElOVVg9MSIpCisgICAgYWRkX2NvbXBpbGVyX2ZsYWcoIi1EUExBVEZPUk1fUE9TSVg9MSIpCitlbHNlaWYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIldpbmRvd3MiKQorICAgIGFkZF9jb21waWxlcl9mbGFnKCItRFBMQVRGT1JNX1dJTkRPV1M9MSIpCitlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJQbGF0Zm9ybSB1bnNldCwgYnVpbGQgd2lsbCBmYWlsLS1zdG9wcGluZyBhdCBDTWFrZSB0aW1lLiIpCitlbmRpZigpCisKKyMgV2hhdCBiaXR0ZWRuZXNzIGFyZSB3ZSBidWlsZGluZz8KK2lmIChCVUlMRF9YNjQpCisgICAgYWRkX2NvbXBpbGVyX2ZsYWcoIi1EUExBVEZPUk1fNjRCSVQ9MSIpCitlbHNlKCkKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLURQTEFURk9STV8zMkJJVD0xIikKK2VuZGlmKCkKKworIyBDb21waWxlciBmbGFncyBmb3Igd2luZG93cy4KK2lmIChNU1ZDKQorICAgICMgTXVsdGl0aHJlYWRlZCBjb21waWxhdGlvbiBpcyBhIGJpZyB0aW1lIHNhdmVyLgorICAgIGFkZF9jb21waWxlcl9mbGFnKCIvTVAiKQorCisgICAgIyBJbiBkZWJ1Zywgd2UgdXNlIHRoZSBETEwgZGVidWcgcnVudGltZS4KKyAgICBhZGRfY29tcGlsZXJfZmxhZ19kZWJ1ZygiL01EZCIpCisKKyAgICAjIEFuZCBpbiByZWxlYXNlIHdlIHVzZSB0aGUgRExMIHJlbGVhc2UgcnVudGltZQorICAgIGFkZF9jb21waWxlcl9mbGFnX3JlbGVhc2UoIi9NRCIpCisKKyAgICAjIHg2NCBkb2Vzbid0IGV2ZXIgc3VwcG9ydCAvWkksIG9ubHkgL1ppLgorICAgIGlmIChCVUlMRF9YNjQpCisgICAgICBhZGRfY29tcGlsZXJfZmxhZygiL1ppIikKKyAgICBlbHNlKCkKKworICAgICAgIyBJbiBkZWJ1ZywgZ2V0IGRlYnVnIGluZm9ybWF0aW9uIHN1aXRhYmxlIGZvciBFZGl0IGFuZCBDb250aW51ZQorICAgICAgYWRkX2NvbXBpbGVyX2ZsYWdfZGVidWcoIi9aSSIpCisKKyAgICAgICMgSW4gcmVsZWFzZSwgc3RpbGwgZ2VuZXJhdGUgZGVidWcgaW5mb3JtYXRpb24gKGJlY2F1c2Ugbm90IGhhdmluZyBpdCBpcyBkdW1iKQorICAgICAgYWRkX2NvbXBpbGVyX2ZsYWdfcmVsZWFzZSgiL1ppIikKKyAgICBlbmRpZigpCisKKyAgICAjIEFuZCB0ZWxsIHRoZSBsaW5rZXIgdG8gYWx3YXlzIGdlbmVyYXRlIHRoZSBmaWxlIGZvciB1cy4KKyAgICBhZGRfbGlua2VyX2ZsYWcoIi9ERUJVRyIpCitlbmRpZigpCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi9DTWFrZUxpc3RzLnR4dCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjN2FmYTAKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDU3IEBACitwcm9qZWN0KHZrdHJhY2VfY29tbW9uKQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKKworaW5jbHVkZSgke1NSQ19ESVJ9L2J1aWxkX29wdGlvbnMuY21ha2UpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtTUkNfRElSfS92a3RyYWNlX2NvbW1vbgorICAgICR7U1JDX0RJUn0vdGhpcmRwYXJ0eQorKQorCitpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTGludXgiKQorICAgIHJlcXVpcmVfcHRocmVhZHMoKQorZW5kaWYoKQorCitzZXQoU1JDX0xJU1QKKyAgICAke1NSQ19MSVNUfQorICAgIHZrdHJhY2VfZmlsZWxpa2UuYworICAgIHZrdHJhY2VfaW50ZXJjb25uZWN0LmMKKyAgICB2a3RyYWNlX3BsYXRmb3JtLmMKKyAgICB2a3RyYWNlX3Byb2Nlc3MuYworICAgIHZrdHJhY2Vfc2V0dGluZ3MuYworICAgIHZrdHJhY2VfdHJhY2Vsb2cuYworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmMKKyAgICB2a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmNwcAorKQorCitzZXQgKENYWF9TUkNfTElTVAorICAgICB2a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmNwcAorKQorCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoICR7U1JDX0xJU1R9IFBST1BFUlRJRVMgTEFOR1VBR0UgQykKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyggJHtDWFhfU1JDX0xJU1R9IFBST1BFUlRJRVMgTEFOR1VBR0UgQ1hYKQorCitmaWxlKCBHTE9CX1JFQ1VSU0UgSERSUyAqLltofGlubF0gKQorCitpZiAoTk9UIE1TVkMpCisgICAgYWRkX2NfY29tcGlsZXJfZmxhZygiLWZQSUMiKQorICAgIGFkZF9jcHBfY29tcGlsZXJfZmxhZygiLWZQSUMgLXN0ZD1jKysxMSIpCitlbmRpZigpCisKK2FkZF9saWJyYXJ5KCR7UFJPSkVDVF9OQU1FfSBTVEFUSUMgJHtTUkNfTElTVH0gJHtDWFhfU1JDX0xJU1R9ICR7SERSU30pCisKKworaWYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIldpbmRvd3MiKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7UFJPSkVDVF9OQU1FfQorICAgIFJwY3J0NC5saWIKKykKK2Vsc2VpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTGludXgiKQordGFyZ2V0X2xpbmtfTGlicmFyaWVzKCR7UFJPSkVDVF9OQU1FfQorICAgIGRsCisgICAgcHRocmVhZAorKQorZW5kaWYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIldpbmRvd3MiKQorCitidWlsZF9vcHRpb25zX2ZpbmFsaXplKCkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHZrdHJhY2VfY29tbW9uIFBST1BFUlRJRVMgTElOS0VSX0xBTkdVQUdFIEMpCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX2NvbW1vbi5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdiZjAyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9jb21tb24uaApAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInZrdHJhY2VfcGxhdGZvcm0uaCIKKworI2luY2x1ZGUgInZrdHJhY2VfbWVtb3J5LmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZWxvZy5oIgorCisjaWZuZGVmIFNUUklOR0lGWQorI2RlZmluZSBTVFJJTkdJRlkoeCkgI3gKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikKKworI2RlZmluZSBWS1RSQUNFUl9FWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIFZLVFJBQ0VSX1NURENBTEwgX19zdGRjYWxsCisjZGVmaW5lIFZLVFJBQ0VSX0NERUNMIF9fY2RlY2wKKyNkZWZpbmUgVktUUkFDRVJfRVhJVCB2b2lkIF9fY2RlY2wKKyNkZWZpbmUgVktUUkFDRVJfRU5UUlkgdm9pZAorI2RlZmluZSBWS1RSQUNFUl9MRUFWRSB2b2lkCisKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorCisjZGVmaW5lIFZLVFJBQ0VSX0VYUE9SVCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCisjZGVmaW5lIFZLVFJBQ0VSX1NURENBTEwKKyNkZWZpbmUgVktUUkFDRVJfQ0RFQ0wKKyNkZWZpbmUgVktUUkFDRVJfRVhJVCB2b2lkCisjZGVmaW5lIFZLVFJBQ0VSX0VOVFJZIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGNvbnN0cnVjdG9yKSkKKyNkZWZpbmUgVktUUkFDRVJfTEVBVkUgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZGVzdHJ1Y3RvcikpCisKKyNlbmRpZgorCisjZGVmaW5lIFJPVU5EVVBfVE9fMihfbGVuKSAgKCgoKF9sZW4pKyAxKT4+MSk8PDEpCisjZGVmaW5lIFJPVU5EVVBfVE9fNChfbGVuKSAgKCgoKF9sZW4pKyAzKT4+Mik8PDIpCisjZGVmaW5lIFJPVU5EVVBfVE9fOChfbGVuKSAgKCgoKF9sZW4pKyA3KT4+Myk8PDMpCisjZGVmaW5lIFJPVU5EVVBfVE9fMTYoX2xlbikgKCgoKF9sZW4pKzE1KT4+NCk8PDQpCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX2ZpbGVsaWtlLmMgYi92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX2ZpbGVsaWtlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5MTgzNwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfZmlsZWxpa2UuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICovCisKKyNpbmNsdWRlICJ2a3RyYWNlX2ZpbGVsaWtlLmgiCisjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2ludGVyY29ubmVjdC5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDaGVja3BvaW50KiB2a3RyYWNlX0NoZWNrcG9pbnRfY3JlYXRlKGNvbnN0IGNoYXIqIF9zdHIpCit7CisgICAgQ2hlY2twb2ludCogcENoZWNrcG9pbnQgPSBWS1RSQUNFX05FVyhDaGVja3BvaW50KTsKKyAgICBwQ2hlY2twb2ludC0+bVRva2VuID0gX3N0cjsKKyAgICBwQ2hlY2twb2ludC0+bVRva2VuTGVuZ3RoID0gc3RybGVuKF9zdHIpICsgMTsKKyAgICByZXR1cm4gcENoZWNrcG9pbnQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNlX0NoZWNrcG9pbnRfd3JpdGUoQ2hlY2twb2ludCogcENoZWNrcG9pbnQsIEZpbGVMaWtlKiBfb3V0KQoreworICAgIHZrdHJhY2VfRmlsZUxpa2VfV3JpdGUoX291dCwgcENoZWNrcG9pbnQtPm1Ub2tlbiwgcENoZWNrcG9pbnQtPm1Ub2tlbkxlbmd0aCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk9PTCB2a3RyYWNlX0NoZWNrcG9pbnRfcmVhZChDaGVja3BvaW50KiBwQ2hlY2twb2ludCwgRmlsZUxpa2UqIF9pbikKK3sKKyAgICBpZiAocENoZWNrcG9pbnQtPm1Ub2tlbkxlbmd0aCA8IDY0KSB7CisgICAgICAgIGNoYXIgYnVmZmVyWzY0XTsKKyAgICAgICAgdmt0cmFjZV9GaWxlTGlrZV9SZWFkKF9pbiwgYnVmZmVyLCBwQ2hlY2twb2ludC0+bVRva2VuTGVuZ3RoKTsKKyAgICAgICAgaWYgKHN0cmNtcChidWZmZXIsIHBDaGVja3BvaW50LT5tVG9rZW4pICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIqIGJ1ZmZlciA9IFZLVFJBQ0VfTkVXX0FSUkFZKGNoYXIsIHBDaGVja3BvaW50LT5tVG9rZW5MZW5ndGgpOworICAgICAgICB2a3RyYWNlX0ZpbGVMaWtlX1JlYWQoX2luLCBidWZmZXIsIHBDaGVja3BvaW50LT5tVG9rZW5MZW5ndGgpOworICAgICAgICBpZiAoc3RyY21wKGJ1ZmZlciwgcENoZWNrcG9pbnQtPm1Ub2tlbikgIT0gMCkgeworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBWS1RSQUNFX0RFTEVURShidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRmlsZUxpa2UqIHZrdHJhY2VfRmlsZUxpa2VfY3JlYXRlX2ZpbGUoRklMRSogZnApCit7CisgICAgRmlsZUxpa2UqIHBGaWxlID0gTlVMTDsKKyAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBGaWxlID0gVktUUkFDRV9ORVcoRmlsZUxpa2UpOworICAgICAgICBwRmlsZS0+bU1vZGUgPSBGaWxlOworICAgICAgICBwRmlsZS0+bUZpbGUgPSBmcDsKKyAgICAgICAgcEZpbGUtPm1NZXNzYWdlU3RyZWFtID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHBGaWxlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZpbGVMaWtlKiB2a3RyYWNlX0ZpbGVMaWtlX2NyZWF0ZV9tc2coTWVzc2FnZVN0cmVhbSogX21zZ1N0cmVhbSkKK3sKKyAgICBGaWxlTGlrZSogcEZpbGUgPSBOVUxMOworICAgIGlmIChfbXNnU3RyZWFtICE9IE5VTEwpCisgICAgeworICAgICAgICBwRmlsZSA9IFZLVFJBQ0VfTkVXKEZpbGVMaWtlKTsKKyAgICAgICAgcEZpbGUtPm1Nb2RlID0gU29ja2V0OworICAgICAgICBwRmlsZS0+bUZpbGUgPSBOVUxMOworICAgICAgICBwRmlsZS0+bU1lc3NhZ2VTdHJlYW0gPSBfbXNnU3RyZWFtOworICAgIH0KKyAgICByZXR1cm4gcEZpbGU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc2l6ZV90IHZrdHJhY2VfRmlsZUxpa2VfUmVhZChGaWxlTGlrZSogcEZpbGVMaWtlLCB2b2lkKiBfYnl0ZXMsIHNpemVfdCBfbGVuKQoreworICAgIHNpemVfdCBtaW5TaXplID0gMDsKKyAgICBzaXplX3QgYnl0ZXNJblN0cmVhbSA9IDA7CisgICAgaWYgKHZrdHJhY2VfRmlsZUxpa2VfUmVhZFJhdyhwRmlsZUxpa2UsICZieXRlc0luU3RyZWFtLCBzaXplb2YoYnl0ZXNJblN0cmVhbSkpID09IEZBTFNFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1pblNpemUgPSAoX2xlbiA8IGJ5dGVzSW5TdHJlYW0pID8gX2xlbjogYnl0ZXNJblN0cmVhbTsKKyAgICBpZiAoYnl0ZXNJblN0cmVhbSA+IDApIHsKKyAgICAgICAgYXNzZXJ0KF9sZW4gPj0gYnl0ZXNJblN0cmVhbSk7CisgICAgICAgIGlmICh2a3RyYWNlX0ZpbGVMaWtlX1JlYWRSYXcocEZpbGVMaWtlLCBfYnl0ZXMsIG1pblNpemUpID09IEZBTFNFKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIG1pblNpemU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk9PTCB2a3RyYWNlX0ZpbGVMaWtlX1JlYWRSYXcoRmlsZUxpa2UqIHBGaWxlTGlrZSwgdm9pZCogX2J5dGVzLCBzaXplX3QgX2xlbikKK3sKKyAgICBCT09MIHJlc3VsdCA9IFRSVUU7CisgICAgYXNzZXJ0KChwRmlsZUxpa2UtPm1GaWxlICE9IDApIF4gKHBGaWxlTGlrZS0+bU1lc3NhZ2VTdHJlYW0gIT0gMCkpOworCisgICAgc3dpdGNoKHBGaWxlTGlrZS0+bU1vZGUpIHsKKyAgICBjYXNlIEZpbGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgxICE9IGZyZWFkKF9ieXRlcywgX2xlbiwgMSwgcEZpbGVMaWtlLT5tRmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZlcnJvcihwRmlsZUxpa2UtPm1GaWxlKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJmcmVhZCBlcnJvciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmZW9mKHBGaWxlTGlrZS0+bUZpbGUpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIlJlYWNoZWQgZW5kIG9mIGZpbGUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBTb2NrZXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9CbG9ja2luZ1JlY3YocEZpbGVMaWtlLT5tTWVzc2FnZVN0cmVhbSwgX2J5dGVzLCBfbGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDogCisgICAgICAgICAgICBhc3NlcnQoISJJbnZhbGlkIG1vZGUgaW4gRmlsZUxpa2VfUmVhZFJhdyIpOworICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgdmt0cmFjZV9GaWxlTGlrZV9Xcml0ZShGaWxlTGlrZSogcEZpbGVMaWtlLCBjb25zdCB2b2lkKiBfYnl0ZXMsIHNpemVfdCBfbGVuKQoreworICAgIHZrdHJhY2VfRmlsZUxpa2VfV3JpdGVSYXcocEZpbGVMaWtlLCAmX2xlbiwgc2l6ZW9mKF9sZW4pKTsKKyAgICBpZiAoX2xlbikgeworICAgICAgICB2a3RyYWNlX0ZpbGVMaWtlX1dyaXRlUmF3KHBGaWxlTGlrZSwgX2J5dGVzLCBfbGVuKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk9PTCB2a3RyYWNlX0ZpbGVMaWtlX1dyaXRlUmF3KEZpbGVMaWtlKiBwRmlsZSwgY29uc3Qgdm9pZCogX2J5dGVzLCBzaXplX3QgX2xlbikKK3sKKyAgICBCT09MIHJlc3VsdCA9IFRSVUU7CisgICAgYXNzZXJ0KChwRmlsZS0+bUZpbGUgIT0gMCkgXiAocEZpbGUtPm1NZXNzYWdlU3RyZWFtICE9IDApKTsKKyAgICBzd2l0Y2ggKHBGaWxlLT5tTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgRmlsZToKKyAgICAgICAgICAgIGlmICgxICE9IGZ3cml0ZShfYnl0ZXMsIF9sZW4sIDEsIHBGaWxlLT5tRmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTb2NrZXQ6CisgICAgICAgICAgICByZXN1bHQgPSB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fU2VuZChwRmlsZS0+bU1lc3NhZ2VTdHJlYW0sIF9ieXRlcywgX2xlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCghIkludmFsaWQgbW9kZSBpbiBGaWxlTGlrZV9Xcml0ZVJhdyIpOworICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfZmlsZWxpa2UuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfZmlsZWxpa2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI2ZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9maWxlbGlrZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxXaW5Tb2NrMi5oPgorI2luY2x1ZGUgPFdTMnRjcGlwLmg+CisjcHJhZ21hIGNvbW1lbnQgKGxpYiwgIldzMl8zMi5saWIiKQorI2VuZGlmCisKKyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIgorI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiCisKK3R5cGVkZWYgc3RydWN0IE1lc3NhZ2VTdHJlYW0gTWVzc2FnZVN0cmVhbTsKKworc3RydWN0IEZpbGVMaWtlOwordHlwZWRlZiBzdHJ1Y3QgRmlsZUxpa2UgRmlsZUxpa2U7Cit0eXBlZGVmIHN0cnVjdCBGaWxlTGlrZQoreworICAgIGVudW0geyBGaWxlLCBTb2NrZXQgfSBtTW9kZTsKKyAgICBGSUxFKiBtRmlsZTsKKyAgICBNZXNzYWdlU3RyZWFtKiBtTWVzc2FnZVN0cmVhbTsKK30gRmlsZUxpa2U7CisKKy8vIEZvciBjcmVhdGluZyBjaGVja3BvaW50cyAoY29uc2lzdGVuY3kgY2hlY2tzKSBpbiB0aGUgdmFyaW91cyBzdHJlYW1zIHdlJ3JlIGludGVyYWN0aW5nIHdpdGguCit0eXBlZGVmIHN0cnVjdCBDaGVja3BvaW50Cit7CisgICAgY29uc3QgY2hhciogbVRva2VuOworICAgIHNpemVfdCBtVG9rZW5MZW5ndGg7Cit9IENoZWNrcG9pbnQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworQ2hlY2twb2ludCogdmt0cmFjZV9DaGVja3BvaW50X2NyZWF0ZShjb25zdCBjaGFyKiBfc3RyKTsKK3ZvaWQgdmt0cmFjZV9DaGVja3BvaW50X3dyaXRlKENoZWNrcG9pbnQqIHBDaGVja3BvaW50LCBGaWxlTGlrZSogX291dCk7CitCT09MIHZrdHJhY2VfQ2hlY2twb2ludF9yZWFkKENoZWNrcG9pbnQqIHBDaGVja3BvaW50LCBGaWxlTGlrZSogX2luKTsKKworLy8gQW4gaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHNvY2tldHMsIGZpbGVzLCBhbmQgbWVtb3J5IHN0cmVhbXMgd2l0aCBhIGZpbGUtbGlrZSBpbnRlcmZhY2UuCisvLyBUaGlzIGlzIGEgc2ltcGxlIGZpbGUtbGlrZSBpbnRlcmZhY2UtLWl0IGRvZXNuJ3Qgc3VwcG9ydCByZXdpbmRpbmcgb3IgYW55dGhpbmcgZmFuY3ksIGp1c3QgZmlmbyAKKy8vIHJlYWRzIGFuZCB3cml0ZXMuCisKKy8vIGNyZWF0ZSBhIGZpbGVsaWtlIGludGVyZmFjZSBmb3IgZmlsZSBzdHJlYW1pbmcKK0ZpbGVMaWtlKiB2a3RyYWNlX0ZpbGVMaWtlX2NyZWF0ZV9maWxlKEZJTEUqIGZwKTsKKworLy8gY3JlYXRlIGEgZmlsZWxpa2UgaW50ZXJmYWNlIGZvciBuZXR3b3JrIHN0cmVhbWluZworRmlsZUxpa2UqIHZrdHJhY2VfRmlsZUxpa2VfY3JlYXRlX21zZyhNZXNzYWdlU3RyZWFtKiBfbXNnU3RyZWFtKTsKKworLy8gcmVhZCBhIHNpemUgYW5kIHRoZW4gYSBidWZmZXIgb2YgdGhhdCBzaXplCitzaXplX3Qgdmt0cmFjZV9GaWxlTGlrZV9SZWFkKEZpbGVMaWtlKiBwRmlsZUxpa2UsIHZvaWQqIF9ieXRlcywgc2l6ZV90IF9sZW4pOworCisvLyBOb3JtYWxseSwgUmVhZCBleHBlY3RzIHRoZSBzaXplIHRvIGxpdmUgaW4gdGhlIHN0cmVhbSBwcmVmaXhpbmcgdGhlIGRhdGEgdG8gYmUgcmVhZC4KKy8vIFdpdGggUmVhZFJhdywgbm8gc2l6ZSBpcyBleHBlY3RlZCBmaXJzdCwgYW5kIHRoZSBieXRlcyBhcmUgZGlyZWN0bHkgcmVhZC4KK0JPT0wgdmt0cmFjZV9GaWxlTGlrZV9SZWFkUmF3KEZpbGVMaWtlKiBwRmlsZUxpa2UsIHZvaWQqIF9ieXRlcywgc2l6ZV90IF9sZW4pOworCisvLyB3cml0ZSBfbGVuIGFuZCB0aGVuIHRoZSBidWZmZXIgb2Ygc2l6ZSBfbGVuCit2b2lkIHZrdHJhY2VfRmlsZUxpa2VfV3JpdGUoRmlsZUxpa2UqIHBGaWxlTGlrZSwgY29uc3Qgdm9pZCogX2J5dGVzLCBzaXplX3QgX2xlbik7CisKKy8vIE5vcm1hbGx5LCBXcml0ZSBvdXRwdXRzIHRoZSBfbGVuIHRvIHRoZSBzdHJlYW0gZmlyc3QtLXdpdGggV3JpdGVSYXcgdGhlIGJ5dGVzIGFyZSBzaW1wbHkgd3JpdHRlbiwgCisvLyBubyBzaXplIHBhcmFtZXRlciBmaXJzdC4KK0JPT0wgdmt0cmFjZV9GaWxlTGlrZV9Xcml0ZVJhdyhGaWxlTGlrZSogcEZpbGUsIGNvbnN0IHZvaWQqIF9ieXRlcywgc2l6ZV90IF9sZW4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9pbnRlcmNvbm5lY3QuYyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfaW50ZXJjb25uZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxOWZiMgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfaW50ZXJjb25uZWN0LmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKi8KKworI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiCisjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCIKKworI2luY2x1ZGUgInZrdHJhY2VfZmlsZWxpa2UuaCIKKworI2lmIGRlZmluZWQoQU5EUk9JRCkKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorCitjb25zdCBzaXplX3Qga1NlbmRCdWZmZXJTaXplID0gMTAyNCAqIDEwMjQ7CisKK01lc3NhZ2VTdHJlYW0qIGdNZXNzYWdlU3RyZWFtID0gTlVMTDsKK3N0YXRpYyBWS1RSQUNFX0NSSVRJQ0FMX1NFQ1RJT04gZ1NlbmRMb2NrOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcHJpdmF0ZSBmdW5jdGlvbnMKK0JPT0wgdmt0cmFjZV9NZXNzYWdlU3RyZWFtX1NldHVwU29ja2V0KE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW0pOworQk9PTCB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fU2V0dXBIb3N0U29ja2V0KE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW0pOworQk9PTCB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fU2V0dXBDbGllbnRTb2NrZXQoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSk7CitCT09MIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9IYW5kc2hha2UoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSk7CitCT09MIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9SZWFsbHlTZW5kKE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW0sIGNvbnN0IHZvaWQqIF9ieXRlcywgc2l6ZV90IF9zaXplLCBCT09MIF9vcHRpb25hbCk7Cit2b2lkIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9GbHVzaFNlbmRCdWZmZXIoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSwgQk9PTCBfb3B0aW9uYWwpOworCisvLyBwdWJsaWMgZnVuY3Rpb25zCitNZXNzYWdlU3RyZWFtKiB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fY3JlYXRlX3BvcnRfc3RyaW5nKEJPT0wgX2lzSG9zdCwgY29uc3QgY2hhciogX2FkZHJlc3MsIGNvbnN0IGNoYXIqIF9wb3J0KQoreworICAgIE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW07CisgICAgLy8gbWFrZSBzdXJlIHRoZSBzdHJpbmdzIGFyZSBzaG9ydGVyIHRoYW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB3ZSBoYXZlIHRvIHN0b3JlIHRoZW0hCisgICAgYXNzZXJ0KHN0cmxlbihfYWRkcmVzcykgKyAxIDw9IDY0KTsKKyAgICBhc3NlcnQoc3RybGVuKF9wb3J0KSArIDEgPD0gOCk7CisKKyAgICBwU3RyZWFtID0gVktUUkFDRV9ORVcoTWVzc2FnZVN0cmVhbSk7CisgICAgbWVtY3B5KHBTdHJlYW0tPm1BZGRyZXNzLCBfYWRkcmVzcywgc3RybGVuKF9hZGRyZXNzKSArIDEpOworICAgIG1lbWNweShwU3RyZWFtLT5tUG9ydCwgX3BvcnQsIHN0cmxlbihfcG9ydCkgKyAxKTsKKworICAgIHBTdHJlYW0tPm1FcnJvck51bSA9IDA7CisgICAgbWVtc2V0KHBTdHJlYW0tPm1TbWFsbEJ1ZmZlciwgMCwgNjQpOworICAgIHBTdHJlYW0tPm1Ib3N0ID0gX2lzSG9zdDsKKyAgICBwU3RyZWFtLT5tSG9zdEFkZHJlc3NJbmZvID0gTlVMTDsKKyAgICBwU3RyZWFtLT5tTmV4dFBhY2tldElkID0gMDsKKyAgICBwU3RyZWFtLT5tU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgcFN0cmVhbS0+bVNlbmRCdWZmZXIgPSBOVUxMOworCisgICAgaWYgKHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9TZXR1cFNvY2tldChwU3RyZWFtKSA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBTdHJlYW0pOworICAgICAgICBwU3RyZWFtID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcFN0cmVhbTsKK30KKworTWVzc2FnZVN0cmVhbSogdmt0cmFjZV9NZXNzYWdlU3RyZWFtX2NyZWF0ZShCT09MIF9pc0hvc3QsIGNvbnN0IGNoYXIqIF9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgX3BvcnQpCit7CisgICAgY2hhciBwb3J0QnVmWzMyXTsKKyAgICBtZW1zZXQocG9ydEJ1ZiwgMCwgMzIgKiBzaXplb2YoY2hhcikpOworICAgIHNwcmludGYocG9ydEJ1ZiwgIiV1IiwgX3BvcnQpOworICAgIHJldHVybiB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fY3JlYXRlX3BvcnRfc3RyaW5nKF9pc0hvc3QsIF9hZGRyZXNzLCBwb3J0QnVmKTsKK30KKwordm9pZCB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fZGVzdHJveShNZXNzYWdlU3RyZWFtKiogcHBTdHJlYW0pCit7CisgICAgaWYgKCgqcHBTdHJlYW0pLT5tU2VuZEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRyeSB0byBnZXQgb3VyIGRhdGEgb3V0LgorICAgICAgICB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fRmx1c2hTZW5kQnVmZmVyKCpwcFN0cmVhbSwgVFJVRSk7CisgICAgICAgIHZrdHJhY2VfU2ltcGxlQnVmZmVyX2Rlc3Ryb3koJigqcHBTdHJlYW0pLT5tU2VuZEJ1ZmZlcik7CisgICAgfQorCisgICAgaWYgKCgqcHBTdHJlYW0pLT5tSG9zdEFkZHJlc3NJbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBmcmVlYWRkcmluZm8oKCpwcFN0cmVhbSktPm1Ib3N0QWRkcmVzc0luZm8pOworICAgICAgICAoKnBwU3RyZWFtKS0+bUhvc3RBZGRyZXNzSW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgdmt0cmFjZV9Mb2dEZWJ1ZygiRGVzdHJveWVkIHNvY2tldCBjb25uZWN0aW9uLiIpOworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgV1NBQ2xlYW51cCgpOworI2VuZGlmCisgICAgVktUUkFDRV9ERUxFVEUoKnBwU3RyZWFtKTsKKyAgICAoKnBwU3RyZWFtKSA9IE5VTEw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHByaXZhdGUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zCitCT09MIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9TZXR1cFNvY2tldChNZXNzYWdlU3RyZWFtKiBwU3RyZWFtKQoreworICAgIEJPT0wgcmVzdWx0ID0gVFJVRTsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIFdTQURBVEEgd3NhRGF0YTsKKworICAgIGlmIChXU0FTdGFydHVwKE1BS0VXT1JEKDIsIDIpLCAmd3NhRGF0YSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgaWYgKHBTdHJlYW0tPm1Ib3N0KSB7CisgICAgICAgICAgICByZXN1bHQgPSB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fU2V0dXBIb3N0U29ja2V0KHBTdHJlYW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gdmt0cmFjZV9NZXNzYWdlU3RyZWFtX1NldHVwQ2xpZW50U29ja2V0KHBTdHJlYW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0JPT0wgdmt0cmFjZV9NZXNzYWdlU3RyZWFtX1NldHVwSG9zdFNvY2tldChNZXNzYWdlU3RyZWFtKiBwU3RyZWFtKQoreworICAgIGludCBociA9IDA7CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgfHwgZGVmaW5lZChQTEFURk9STV9PU1gpCisgICAgaW50IHllcyA9IDE7CisjZW5kaWYKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaG9zdEFkZHJJbmZvID0geyAwIH07CisgICAgU09DS0VUIGxpc3RlblNvY2tldDsKKworICAgIHZrdHJhY2VfY3JlYXRlX2NyaXRpY2FsX3NlY3Rpb24oJmdTZW5kTG9jayk7CisgICAgaG9zdEFkZHJJbmZvLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgaG9zdEFkZHJJbmZvLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgICAgaG9zdEFkZHJJbmZvLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisgICAgaG9zdEFkZHJJbmZvLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKworICAgIGhyID0gZ2V0YWRkcmluZm8oTlVMTCwgcFN0cmVhbS0+bVBvcnQsICZob3N0QWRkckluZm8sICZwU3RyZWFtLT5tSG9zdEFkZHJlc3NJbmZvKTsKKyAgICBpZiAoaHIgIT0gMCkgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJIb3N0OiBGYWlsZWQgZ2V0YWRkcmluZm8uIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBsaXN0ZW5Tb2NrZXQgPSBzb2NrZXQocFN0cmVhbS0+bUhvc3RBZGRyZXNzSW5mby0+YWlfZmFtaWx5LCBwU3RyZWFtLT5tSG9zdEFkZHJlc3NJbmZvLT5haV9zb2NrdHlwZSwgcFN0cmVhbS0+bUhvc3RBZGRyZXNzSW5mby0+YWlfcHJvdG9jb2wpOworICAgIGlmIChsaXN0ZW5Tb2NrZXQgPT0gSU5WQUxJRF9TT0NLRVQpIHsKKyAgICAgICAgLy8gVE9ETzogRmlndXJlIG91dCBlcnJvcnMKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiSG9zdDogRmFpbGVkIGNyZWF0aW5nIGEgbGlzdGVuIHNvY2tldC4iKTsKKyAgICAgICAgZnJlZWFkZHJpbmZvKHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm8pOworICAgICAgICBwU3RyZWFtLT5tSG9zdEFkZHJlc3NJbmZvID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIHNldHNvY2tvcHQobGlzdGVuU29ja2V0LCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIHNpemVvZih5ZXMpKTsKKyNlbmRpZgorICAgIGhyID0gYmluZChsaXN0ZW5Tb2NrZXQsIHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm8tPmFpX2FkZHIsIChpbnQpcFN0cmVhbS0+bUhvc3RBZGRyZXNzSW5mby0+YWlfYWRkcmxlbik7CisgICAgaWYgKGhyID09IFNPQ0tFVF9FUlJPUikgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJIb3N0OiBGYWlsZWQgYmluZGluZyBzb2NrZXQgZXJyPSVkLiIsIFZLVFJBQ0VfV1NBR2V0TGFzdEVycm9yKCkpOworICAgICAgICBmcmVlYWRkcmluZm8ocFN0cmVhbS0+bUhvc3RBZGRyZXNzSW5mbyk7CisgICAgICAgIHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm8gPSBOVUxMOworICAgICAgICBjbG9zZXNvY2tldChsaXN0ZW5Tb2NrZXQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gRG9uZSB3aXRoIHRoaXMuCisgICAgZnJlZWFkZHJpbmZvKHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm8pOworICAgIHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm8gPSBOVUxMOworCisgICAgaHIgPSBsaXN0ZW4obGlzdGVuU29ja2V0LCAxKTsKKyAgICBpZiAoaHIgPT0gU09DS0VUX0VSUk9SKSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkhvc3Q6IEZhaWxlZCBsaXN0ZW5pbmcgb24gc29ja2V0IGVycj0lZC4iKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQobGlzdGVuU29ja2V0KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIEZvIHJlYWxzLgorICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiTGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyBvbiBwb3J0ICVzLiIsIHBTdHJlYW0tPm1Qb3J0KTsKKyAgICBwU3RyZWFtLT5tU29ja2V0ID0gYWNjZXB0KGxpc3RlblNvY2tldCwgTlVMTCwgTlVMTCk7CisgICAgY2xvc2Vzb2NrZXQobGlzdGVuU29ja2V0KTsKKworICAgIGlmIChwU3RyZWFtLT5tU29ja2V0ID09IElOVkFMSURfU09DS0VUKSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkhvc3Q6IEZhaWxlZCBhY2NlcHRpbmcgc29ja2V0IGNvbm5lY3Rpb24uIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIkNvbm5lY3RlZCBvbiBwb3J0ICVzLiIsIHBTdHJlYW0tPm1Qb3J0KTsKKyAgICBpZiAodmt0cmFjZV9NZXNzYWdlU3RyZWFtX0hhbmRzaGFrZShwU3RyZWFtKSkKKyAgICB7CisgICAgICAgIC8vIFRPRE86IFRoZSBTZW5kQnVmZmVyIGNhbiBjYXVzZSBiaWcgZGVsYXlzIGluIHNlbmRpbmcgbWVzc2FnZXMgYmFjayB0byB0aGUgY2xpZW50LgorICAgICAgICAvLyBXZSBoYXZlbid0IHZlcmlmaWVkIGlmIHRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UgaW4gcmVhbCBhcHBsaWNhdGlvbnMsCisgICAgICAgIC8vIHNvIGRpc2FibGUgaXQgZm9yIG5vdy4KKyAgICAgICAgLy9wU3RyZWFtLT5tU2VuZEJ1ZmZlciA9IHZrdHJhY2VfU2ltcGxlQnVmZmVyX2NyZWF0ZShrU2VuZEJ1ZmZlclNpemUpOworICAgICAgICBwU3RyZWFtLT5tU2VuZEJ1ZmZlciA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrdHJhY2VfTWVzc2FnZVN0cmVhbV9TZXR1cEhvc3RTb2NrZXQgZmFpbGVkIGhhbmRzaGFrZS4iKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk9PTCB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fU2V0dXBDbGllbnRTb2NrZXQoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSkKK3sKKyAgICBpbnQgaHIgPSAwOworICAgIHVuc2lnbmVkIGludCBhdHRlbXB0ID0gMDsKKyAgICBCT09MIGJDb25uZWN0ZWQgPSBGQUxTRTsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaG9zdEFkZHJJbmZvID0geyAwIH0sCisgICAgICAgICpjdXJyZW50QXR0ZW1wdCA9IE5VTEw7CisgICAgdmt0cmFjZV9jcmVhdGVfY3JpdGljYWxfc2VjdGlvbigmZ1NlbmRMb2NrKTsKKworI2lmIGRlZmluZWQoQU5EUk9JRCkKKworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIHNvY2tsZW5fdCBuYW1lbGVuOworCisgICAgLy8gQ29weSB0aGUgc3RyaW5nIHN1Y2ggdGhhdCBhIG51bGwgY2hhcmFjdGVyIHByZWNlZGVzIGl0LCBpLmUuICIwXHZrdHJhY2UiCisgICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworICAgIHN0cmNweShhZGRyLnN1bl9wYXRoICsgMSwgcFN0cmVhbS0+bVBvcnQpOworICAgIGFkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgbmFtZWxlbiA9IHNpemVvZihhZGRyLnN1bl9mYW1pbHkpICsgc3RybGVuKHBTdHJlYW0tPm1Qb3J0KSArIDE7CisKKyAgICBwU3RyZWFtLT5tU29ja2V0ID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBociA9IGNvbm5lY3QocFN0cmVhbS0+bVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgbmFtZWxlbik7CisKKyAgICBpZiAoaHIgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ2xpZW50OiBGYWlsZWQgY29ubmVjdCB0byBhYnN0cmFjdCBzb2NrZXQuIik7CisgICAgICAgIGNsb3Nlc29ja2V0KHBTdHJlYW0tPm1Tb2NrZXQpOworICAgICAgICBwU3RyZWFtLT5tU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorCisjZWxzZQorCisgICAgaG9zdEFkZHJJbmZvLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgICBob3N0QWRkckluZm8uYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgICBob3N0QWRkckluZm8uYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKworICAgIGhyID0gZ2V0YWRkcmluZm8ocFN0cmVhbS0+bUFkZHJlc3MsIHBTdHJlYW0tPm1Qb3J0LCAmaG9zdEFkZHJJbmZvLCAmcFN0cmVhbS0+bUhvc3RBZGRyZXNzSW5mbyk7CisgICAgaWYgKGhyICE9IDApIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ2xpZW50OiBGYWlsZWQgZ2V0YWRkcmluZm8gcmVzdWx0PSVkLiIsIGhyKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIG1ha2Ugc2V2ZXJhbCBhdHRlbXB0cyB0byBjb25uZWN0IGJlZm9yZSBiYWlsaW5nIG91dAorICAgIGZvciAoYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAxMCAmJiAhYkNvbm5lY3RlZDsgYXR0ZW1wdCsrKQorICAgIHsKKyAgICAgICAgZm9yIChjdXJyZW50QXR0ZW1wdCA9IHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm87IGN1cnJlbnRBdHRlbXB0ICE9IE5VTEw7IGN1cnJlbnRBdHRlbXB0ID0gY3VycmVudEF0dGVtcHQtPmFpX25leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdHJlYW0tPm1Tb2NrZXQgPSBzb2NrZXQoY3VycmVudEF0dGVtcHQtPmFpX2ZhbWlseSwgY3VycmVudEF0dGVtcHQtPmFpX3NvY2t0eXBlLCBjdXJyZW50QXR0ZW1wdC0+YWlfcHJvdG9jb2wpOworCisgICAgICAgICAgICBociA9IGNvbm5lY3QocFN0cmVhbS0+bVNvY2tldCwgY3VycmVudEF0dGVtcHQtPmFpX2FkZHIsIChpbnQpY3VycmVudEF0dGVtcHQtPmFpX2FkZHJsZW4pOworICAgICAgICAgICAgaWYgKGhyID09IFNPQ0tFVF9FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIkNsaWVudDogRmFpbGVkIGNvbm5lY3QuIFBvc3NpYmx5IG5vbi1mYXRhbC4iKTsKKyAgICAgICAgICAgICAgICBjbG9zZXNvY2tldChwU3RyZWFtLT5tU29ja2V0KTsKKyAgICAgICAgICAgICAgICBwU3RyZWFtLT5tU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJDb25uZWN0ZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJDb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNsZWVwKDEpOworICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJDbGllbnQ6IENvbm5lY3QgYXR0ZW1wdCAldSBvbiBwb3J0ICVzIGZhaWxlZCwgdHJ5aW5nIGFnYWluLiIsIGF0dGVtcHQsIHBTdHJlYW0tPm1Qb3J0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiQ2xpZW50OiBDb25uZWN0ZWQgdG8gcG9ydCAlcyBzdWNjZXNzZnVsbHkuIiwgcFN0cmVhbS0+bVBvcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgZnJlZWFkZHJpbmZvKHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm8pOworICAgIHBTdHJlYW0tPm1Ib3N0QWRkcmVzc0luZm8gPSBOVUxMOworCisjZW5kaWYKKworICAgIGlmIChwU3RyZWFtLT5tU29ja2V0ID09IElOVkFMSURfU09DS0VUKSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkNsaWVudDogQ291bGRuJ3QgZmluZCBhbnkgY29ubmVjdGlvbnMuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIXZrdHJhY2VfTWVzc2FnZVN0cmVhbV9IYW5kc2hha2UocFN0cmVhbSkpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJDbGllbnQ6IEZhaWxlZCBoYW5kc2hha2Ugd2l0aCBob3N0LiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JPT0wgdmt0cmFjZV9NZXNzYWdlU3RyZWFtX0hhbmRzaGFrZShNZXNzYWdlU3RyZWFtKiBwU3RyZWFtKQoreworICAgIEJPT0wgcmVzdWx0ID0gVFJVRTsKKyAgICBGaWxlTGlrZSogZmlsZUxpa2UgPSB2a3RyYWNlX0ZpbGVMaWtlX2NyZWF0ZV9tc2cocFN0cmVhbSk7CisgICAgQ2hlY2twb2ludCogc3luID0gdmt0cmFjZV9DaGVja3BvaW50X2NyZWF0ZSgiSXQncyBhIHRyYXAhIik7CisgICAgQ2hlY2twb2ludCogYWNrID0gdmt0cmFjZV9DaGVja3BvaW50X2NyZWF0ZSgiIC0gQWRtaXJhbCBBY2tiYXIiKTsKKworICAgIGlmIChwU3RyZWFtLT5tSG9zdCkgeworICAgICAgICB2a3RyYWNlX0NoZWNrcG9pbnRfd3JpdGUoc3luLCBmaWxlTGlrZSk7CisgICAgICAgIHJlc3VsdCA9IHZrdHJhY2VfQ2hlY2twb2ludF9yZWFkKGFjaywgZmlsZUxpa2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh2a3RyYWNlX0NoZWNrcG9pbnRfcmVhZChzeW4sIGZpbGVMaWtlKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9DaGVja3BvaW50X3dyaXRlKGFjaywgZmlsZUxpa2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUdXJuIG9uIG5vbi1ibG9ja2luZyBtb2RlcyBmb3Igc29ja2V0cyBub3cuCisgICAgaWYgKHJlc3VsdCkKKyAgICB7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgICAgdV9sb25nIGFzeW5jTW9kZSA9IDE7CisgICAgICAgIGlvY3Rsc29ja2V0KHBTdHJlYW0tPm1Tb2NrZXQsIEZJT05CSU8sICZhc3luY01vZGUpOworI2Vsc2UKKyAgICAgICAgZmNudGwocFN0cmVhbS0+bVNvY2tldCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisjZW5kaWYKKyAgICB9CisKKyAgICBWS1RSQUNFX0RFTEVURShzeW4pOworICAgIFZLVFJBQ0VfREVMRVRFKGFjayk7CisgICAgVktUUkFDRV9ERUxFVEUoZmlsZUxpa2UpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9GbHVzaFNlbmRCdWZmZXIoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSwgQk9PTCBfb3B0aW9uYWwpCit7CisgICAgc2l6ZV90IGJ1ZmZlcmVkQnl0ZVNpemUgPSAwOworICAgIGNvbnN0IHZvaWQqIGJ1ZmZlckJ5dGVzID0gdmt0cmFjZV9TaW1wbGVCdWZmZXJfR2V0Qnl0ZXMocFN0cmVhbS0+bVNlbmRCdWZmZXIsICZidWZmZXJlZEJ5dGVTaXplKTsKKyAgICBpZiAoYnVmZmVyZWRCeXRlU2l6ZSA+IDApIHsKKyAgICAgICAgLy8gVE9ETyB1c2UgcmV0dXJuIHZhbHVlIGZyb20gUmVhbGx5U2VuZAorICAgICAgICB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fUmVhbGx5U2VuZChwU3RyZWFtLCBidWZmZXJCeXRlcywgYnVmZmVyZWRCeXRlU2l6ZSwgX29wdGlvbmFsKTsKKyAgICAgICAgdmt0cmFjZV9TaW1wbGVCdWZmZXJfRW1wdHlCdWZmZXIocFN0cmVhbS0+bVNlbmRCdWZmZXIpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCT09MIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9CdWZmZXJlZFNlbmQoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSwgY29uc3Qgdm9pZCogX2J5dGVzLCBzaXplX3QgX3NpemUsIEJPT0wgX29wdGlvbmFsKQoreworICAgIEJPT0wgcmVzdWx0ID0gVFJVRTsKKyAgICBpZiAocFN0cmVhbS0+bVNlbmRCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fUmVhbGx5U2VuZChwU3RyZWFtLCBfYnl0ZXMsIF9zaXplLCBfb3B0aW9uYWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIXZrdHJhY2VfU2ltcGxlQnVmZmVyX1dvdWxkT3ZlcmZsb3cocFN0cmVhbS0+bVNlbmRCdWZmZXIsIF9zaXplKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gdmt0cmFjZV9TaW1wbGVCdWZmZXJfQWRkQnl0ZXMocFN0cmVhbS0+bVNlbmRCdWZmZXIsIF9ieXRlcywgX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGltZSB0byBmbHVzaCB0aGUgY2FjaGUuCisgICAgICAgICAgICB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fRmx1c2hTZW5kQnVmZmVyKHBTdHJlYW0sIEZBTFNFKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBwYWNrZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNlbmQgYnVmZmVyIAorICAgICAgICAgICAgaWYgKHZrdHJhY2VfU2ltcGxlQnVmZmVyX1dvdWxkT3ZlcmZsb3cocFN0cmVhbS0+bVNlbmRCdWZmZXIsIF9zaXplKSkgeyAKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fUmVhbGx5U2VuZChwU3RyZWFtLCBfYnl0ZXMsIF9zaXplLCBfb3B0aW9uYWwpOyAKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZrdHJhY2VfU2ltcGxlQnVmZmVyX0FkZEJ5dGVzKHBTdHJlYW0tPm1TZW5kQnVmZmVyLCBfYnl0ZXMsIF9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JPT0wgdmt0cmFjZV9NZXNzYWdlU3RyZWFtX1NlbmQoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSwgY29uc3Qgdm9pZCogX2J5dGVzLCBzaXplX3QgX2xlbikKK3sKKyAgICByZXR1cm4gdmt0cmFjZV9NZXNzYWdlU3RyZWFtX0J1ZmZlcmVkU2VuZChwU3RyZWFtLCBfYnl0ZXMsIF9sZW4sIEZBTFNFKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCT09MIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9SZWFsbHlTZW5kKE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW0sIGNvbnN0IHZvaWQqIF9ieXRlcywgc2l6ZV90IF9zaXplLCBCT09MIF9vcHRpb25hbCkKK3sKKyAgICBzaXplX3QgYnl0ZXNTZW50ID0gMDsKKyAgICBhc3NlcnQoX3NpemUgPiAwKTsKKworICAgIHZrdHJhY2VfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigmZ1NlbmRMb2NrKTsKKyAgICBkbyB7CisgICAgICAgIGludCBzZW50VGhpc1RpbWUgPSBzZW5kKHBTdHJlYW0tPm1Tb2NrZXQsIChjb25zdCBjaGFyKilfYnl0ZXMgKyBieXRlc1NlbnQsIChpbnQpX3NpemUgLSAoaW50KWJ5dGVzU2VudCwgMCk7CisgICAgICAgIGlmIChzZW50VGhpc1RpbWUgPT0gU09DS0VUX0VSUk9SKSB7CisgICAgICAgICAgICBpbnQgc29ja2V0RXJyb3IgPSBWS1RSQUNFX1dTQUdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKHNvY2tldEVycm9yID09IFdTQUVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICAgICAgLy8gVHJ5IGFnYWluLiBEb24ndCBzbGVlcCwgYmVjYXVzZSB0aGF0IG51a2VzIHBlcmZvcm1hbmNlIGZyb20gb3JiaXQuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghX29wdGlvbmFsKSB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnU2VuZExvY2spOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbnRUaGlzVGltZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIV9vcHRpb25hbCkgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigmZ1NlbmRMb2NrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0RlYnVnKCJTZW5kIG9uIHNvY2tldCAwIGJ5dGVzLCB0b3RhbGJ5dGVzIHNlbnQgc28gZmFyICV1LiIsIGJ5dGVzU2VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVzU2VudCArPSBzZW50VGhpc1RpbWU7CisKKyAgICB9IHdoaWxlIChieXRlc1NlbnQgPCBfc2l6ZSk7CisgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnU2VuZExvY2spOworICAgIHJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JPT0wgdmt0cmFjZV9NZXNzYWdlU3RyZWFtX1JlY3YoTWVzc2FnZVN0cmVhbSogcFN0cmVhbSwgdm9pZCogX291dCwgc2l6ZV90IF9sZW4pCit7CisgICAgdW5zaWduZWQgaW50IHRvdGFsRGF0YVJlYWQgPSAwOworICAgIGRvIHsKKyAgICAgICAgaW50IGRhdGFSZWFkID0gcmVjdihwU3RyZWFtLT5tU29ja2V0LCAoKGNoYXIqKV9vdXQpICsgdG90YWxEYXRhUmVhZCwgKGludClfbGVuIC0gdG90YWxEYXRhUmVhZCwgMCk7CisgICAgICAgIGlmIChkYXRhUmVhZCA9PSBTT0NLRVRfRVJST1IpIHsKKyAgICAgICAgICAgIHBTdHJlYW0tPm1FcnJvck51bSA9IFZLVFJBQ0VfV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAocFN0cmVhbS0+bUVycm9yTnVtID09IFdTQUVXT1VMREJMT0NLIHx8IHBTdHJlYW0tPm1FcnJvck51bSA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICBpZiAodG90YWxEYXRhUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBJIGRvbid0IGRvIHBhcnRpYWwgcmVhZHMtLW9uY2UgSSBzdGFydCByZWNlaXZpbmcgSSB3YWl0IGZvciBldmVyeXRoaW5nLgorICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0RlYnVnKCJTbGVlcCBvbiBwYXJ0aWFsIHNvY2tldCByZWN2ICgldSBieXRlcyAvICV1KSwgZXJyb3IgbnVtICVkLiIsIHRvdGFsRGF0YVJlYWQsIF9sZW4sIHBTdHJlYW0tPm1FcnJvck51bSk7CisgICAgICAgICAgICAgICAgICAgIFNsZWVwKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBJJ3ZlIHNwbGl0IHRoZXNlIGludG8gdHdvIGJsb2NrcyBiZWNhdXNlIG9uZSBvZiB0aGVtIGlzIGV4cGVjdGVkIGFuZCB0aGUgb3RoZXIgaXNuJ3QuCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBTdHJlYW0tPm1FcnJvck51bSA9PSBXU0FFQ09OTlJFU0VUKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHJlbW90ZSBjbGllbnQgZGlzY29ubmVjdGVkLCBwcm9iYWJseSBub3QgYW4gaXNzdWUuCisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dEZWJ1ZygiQ29ubmVjdGlvbiB3YXMgcmVzZXQgYnkgY2xpZW50LiIpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU29tZSBvdGhlciB3b25reSBuZXR3b3JrIGVycm9yLS1wbGFjZSBhIGJyZWFrcG9pbnQgaGVyZS4KKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJVbmV4cGVjdGVkIGVycm9yICglZCkgd2hpbGUgcmVjZWl2aW5nIG1lc3NhZ2Ugc3RyZWFtLiIsIHBTdHJlYW0tPm1FcnJvck51bSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG90YWxEYXRhUmVhZCArPSBkYXRhUmVhZDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHRvdGFsRGF0YVJlYWQgPCBfbGVuKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JPT0wgdmt0cmFjZV9NZXNzYWdlU3RyZWFtX0Jsb2NraW5nUmVjdihNZXNzYWdlU3RyZWFtKiBwU3RyZWFtLCB2b2lkKiBfb3V0QnVmZmVyLCBzaXplX3QgX2xlbikKK3sKKyAgICB3aGlsZSAoIXZrdHJhY2VfTWVzc2FnZVN0cmVhbV9SZWN2KHBTdHJlYW0sIF9vdXRCdWZmZXIsIF9sZW4pKSB7CisgICAgICAgIFNsZWVwKDEpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU2ltcGxlQnVmZmVyKiB2a3RyYWNlX1NpbXBsZUJ1ZmZlcl9jcmVhdGUoc2l6ZV90IF9idWZmZXJTaXplKQoreworICAgIFNpbXBsZUJ1ZmZlciogcEJ1ZmZlciA9IFZLVFJBQ0VfTkVXKFNpbXBsZUJ1ZmZlcik7CisgICAgcEJ1ZmZlci0+bUJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKil2a3RyYWNlX21hbGxvYyhfYnVmZmVyU2l6ZSk7CisgICAgaWYgKHBCdWZmZXItPm1CdWZmZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBCdWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwQnVmZmVyLT5tRW5kID0gMDsKKyAgICBwQnVmZmVyLT5tU2l6ZSA9IF9idWZmZXJTaXplOworCisgICAgcmV0dXJuIHBCdWZmZXI7Cit9CisKK3ZvaWQgdmt0cmFjZV9TaW1wbGVCdWZmZXJfZGVzdHJveShTaW1wbGVCdWZmZXIqKiBwcEJ1ZmZlcikKK3sKKyAgICB2a3RyYWNlX2ZyZWUoKCpwcEJ1ZmZlciktPm1CdWZmZXIpOworICAgIFZLVFJBQ0VfREVMRVRFKCpwcEJ1ZmZlcik7Cit9CisKK0JPT0wgdmt0cmFjZV9TaW1wbGVCdWZmZXJfQWRkQnl0ZXMoU2ltcGxlQnVmZmVyKiBwQnVmZmVyLCBjb25zdCB2b2lkKiBfYnl0ZXMsIHNpemVfdCBfc2l6ZSkKK3sKKyAgICBpZiAodmt0cmFjZV9TaW1wbGVCdWZmZXJfV291bGRPdmVyZmxvdyhwQnVmZmVyLCBfc2l6ZSkpCisgICAgeyAKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIG1lbWNweSgodW5zaWduZWQgY2hhciopcEJ1ZmZlci0+bUJ1ZmZlciArIHBCdWZmZXItPm1FbmQsIF9ieXRlcywgX3NpemUpOworICAgIHBCdWZmZXItPm1FbmQgKz0gX3NpemU7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKwordm9pZCB2a3RyYWNlX1NpbXBsZUJ1ZmZlcl9FbXB0eUJ1ZmZlcihTaW1wbGVCdWZmZXIqIHBCdWZmZXIpCit7CisgICAgcEJ1ZmZlci0+bUVuZCA9IDA7Cit9CisKK0JPT0wgdmt0cmFjZV9TaW1wbGVCdWZmZXJfV291bGRPdmVyZmxvdyhTaW1wbGVCdWZmZXIqIHBCdWZmZXIsIHNpemVfdCBfcmVxdWVzdGVkU2l6ZSkKK3sKKyAgICByZXR1cm4gcEJ1ZmZlci0+bUVuZCArIF9yZXF1ZXN0ZWRTaXplID4gcEJ1ZmZlci0+bVNpemU7Cit9CisKK2NvbnN0IHZvaWQqIHZrdHJhY2VfU2ltcGxlQnVmZmVyX0dldEJ5dGVzKFNpbXBsZUJ1ZmZlciogcEJ1ZmZlciwgc2l6ZV90KiBfb3V0Qnl0ZUNvdW50KQoreworICAgICgqX291dEJ5dGVDb3VudCkgPSBwQnVmZmVyLT5tRW5kOyAKKyAgICByZXR1cm4gcEJ1ZmZlci0+bUJ1ZmZlcjsgCit9CisKKy8vLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvL3ZvaWQgUmVtb3RlQ29tbWFuZDo6UmVhZChGaWxlTGlrZSogX2ZpbGVMaWtlKQorLy97CisvLyAgICB1bnNpZ25lZCBpbnQgbXlDb21tYW5kID0gMDsKKy8vICAgIF9maWxlTGlrZS0+UmVhZCgmbXlDb21tYW5kKTsKKy8vICAgIG1SZW1vdGVDb21tYW5kVHlwZSA9IChFbnVtUmVtb3RlQ29tbWFuZClteUNvbW1hbmQ7CisvL30KKy8vCisvLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy92b2lkIFJlbW90ZUNvbW1hbmQ6OldyaXRlKEZpbGVMaWtlKiBfZmlsZUxpa2UpIGNvbnN0CisvL3sKKy8vICAgIF9maWxlTGlrZS0+V3JpdGUoKHVuc2lnbmVkIGludCltUmVtb3RlQ29tbWFuZFR5cGUpOworLy99CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX2ludGVyY29ubmVjdC5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9pbnRlcmNvbm5lY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzlhZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9pbnRlcmNvbm5lY3QuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInZrdHJhY2VfY29tbW9uLmgiCisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX1BPU0lYKQorICAgICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyAgICAjaW5jbHVkZSA8bmV0ZGIuaD4KKyAgICAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorICAgICNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorICAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisgICAgI2RlZmluZSBTT0NLRVQgaW50CisgICAgI2RlZmluZSBJTlZBTElEX1NPQ0tFVCAwCisgICAgI2RlZmluZSBTT0NLRVRfRVJST1IgLTEKKyAgICAjZGVmaW5lIGNsb3Nlc29ja2V0IGNsb3NlCisgICAgI2RlZmluZSBWS1RSQUNFX1dTQUdldExhc3RFcnJvcigpIGVycm5vCisgICAgI2RlZmluZSBXU0FFV09VTERCTE9DSyBFV09VTERCTE9DSworICAgICNkZWZpbmUgV1NBRUFHQUlOIEVBR0FJTgorICAgICNkZWZpbmUgV1NBRUNPTk5SRVNFVCBFQ09OTlJFU0VUCisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgICNpbmNsdWRlIDxXaW5Tb2NrMi5oPgorICAgICNpbmNsdWRlIDxXUzJ0Y3BpcC5oPgorICAgICNwcmFnbWEgY29tbWVudCAobGliLCAiV3MyXzMyLmxpYiIpCisgICAgI2RlZmluZSBWS1RSQUNFX1dTQUdldExhc3RFcnJvcigpIFdTQUdldExhc3RFcnJvcigpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBWS1RSQUNFX0JBU0VfUE9SVCA9IDM0MTk5Oworc3RydWN0IFNTZXJpYWxpemVEYXRhUGFja2V0OworCitzdHJ1Y3QgU2ltcGxlQnVmZmVyOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCBNZXNzYWdlU3RyZWFtCit7CisgICAgU09DS0VUIG1Tb2NrZXQ7CisgICAgc3RydWN0IGFkZHJpbmZvKiBtSG9zdEFkZHJlc3NJbmZvOworICAgIHNpemVfdCBtTmV4dFBhY2tldElkOworICAgIHN0cnVjdCBTaW1wbGVCdWZmZXIqIG1TZW5kQnVmZmVyOworCisgICAgLy8gVXNlZCBpZiBzb21lb25lIGFza3MgZm9yIGEgcmVjZWl2ZSBvZiBhIHNtYWxsIHN0cmluZy4KKyAgICBjaGFyIG1TbWFsbEJ1ZmZlcls2NF07CisKKyAgICBjaGFyIG1BZGRyZXNzWzY0XTsKKworICAgIGNoYXIgbVBvcnRbOF07CisKKyAgICBCT09MIG1Ib3N0OworICAgIGludCBtRXJyb3JOdW07Cit9IE1lc3NhZ2VTdHJlYW07CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK01lc3NhZ2VTdHJlYW0qIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9jcmVhdGVfcG9ydF9zdHJpbmcoQk9PTCBfaXNIb3N0LCBjb25zdCBjaGFyKiBfYWRkcmVzcywgY29uc3QgY2hhciogX3BvcnQpOworTWVzc2FnZVN0cmVhbSogdmt0cmFjZV9NZXNzYWdlU3RyZWFtX2NyZWF0ZShCT09MIF9pc0hvc3QsIGNvbnN0IGNoYXIqIF9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgX3BvcnQpOwordm9pZCB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fZGVzdHJveShNZXNzYWdlU3RyZWFtKiogcHBTdHJlYW0pOworQk9PTCB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fQnVmZmVyZWRTZW5kKE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW0sIGNvbnN0IHZvaWQqIF9ieXRlcywgc2l6ZV90IF9zaXplLCBCT09MIF9vcHRpb25hbCk7CitCT09MIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9TZW5kKE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW0sIGNvbnN0IHZvaWQqIF9ieXRlcywgc2l6ZV90IF9sZW4pOworCitCT09MIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9SZWN2KE1lc3NhZ2VTdHJlYW0qIHBTdHJlYW0sIHZvaWQqIF9vdXQsIHNpemVfdCBfbGVuKTsKK0JPT0wgdmt0cmFjZV9NZXNzYWdlU3RyZWFtX0Jsb2NraW5nUmVjdihNZXNzYWdlU3RyZWFtKiBwU3RyZWFtLCB2b2lkKiBfb3V0QnVmZmVyLCBzaXplX3QgX2xlbik7CisKK2V4dGVybiBNZXNzYWdlU3RyZWFtKiBnTWVzc2FnZVN0cmVhbTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCBTaW1wbGVCdWZmZXIKK3sKKyAgICB2b2lkKiBtQnVmZmVyOworICAgIHNpemVfdCBtRW5kOworICAgIHNpemVfdCBtU2l6ZTsKK30gU2ltcGxlQnVmZmVyOworCitTaW1wbGVCdWZmZXIqIHZrdHJhY2VfU2ltcGxlQnVmZmVyX2NyZWF0ZShzaXplX3QgX2J1ZmZlclNpemUpOwordm9pZCB2a3RyYWNlX1NpbXBsZUJ1ZmZlcl9kZXN0cm95KFNpbXBsZUJ1ZmZlcioqIHBwQnVmZmVyKTsKK0JPT0wgdmt0cmFjZV9TaW1wbGVCdWZmZXJfQWRkQnl0ZXMoU2ltcGxlQnVmZmVyKiBwQnVmZmVyLCBjb25zdCB2b2lkKiBfYnl0ZXMsIHNpemVfdCBfc2l6ZSk7Cit2b2lkIHZrdHJhY2VfU2ltcGxlQnVmZmVyX0VtcHR5QnVmZmVyKFNpbXBsZUJ1ZmZlciogcEJ1ZmZlcik7CitCT09MIHZrdHJhY2VfU2ltcGxlQnVmZmVyX1dvdWxkT3ZlcmZsb3coU2ltcGxlQnVmZmVyKiBwQnVmZmVyLCBzaXplX3QgX3JlcXVlc3RlZFNpemUpOworY29uc3Qgdm9pZCogdmt0cmFjZV9TaW1wbGVCdWZmZXJfR2V0Qnl0ZXMoU2ltcGxlQnVmZmVyKiBwQnVmZmVyLCBzaXplX3QqIF9vdXRCeXRlQ291bnQpOwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9tZW1vcnkuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljM2Y3NQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfbWVtb3J5LmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNkZWZpbmUgVktUUkFDRV9ORVcodHlwZSkgKHR5cGUqKXZrdHJhY2VfbWFsbG9jKHNpemVvZih0eXBlKSkKKyNkZWZpbmUgVktUUkFDRV9ORVdfQVJSQVkodHlwZSwgY291bnQpICh0eXBlKil2a3RyYWNlX21hbGxvYyhzaXplb2YodHlwZSkqY291bnQpCisjZGVmaW5lIFZLVFJBQ0VfREVMRVRFKHB0cikgdmt0cmFjZV9mcmVlKHB0cik7CisjZGVmaW5lIFZLVFJBQ0VfUkVBTExPQyhwdHIsIHNpemUpIHZrdHJhY2VfcmVhbGxvYyhwdHIsIHNpemUpOworCitzdGF0aWMgdm9pZCogdmt0cmFjZV9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCogcE1lbW9yeTsKKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBNZW1vcnkgPSBtYWxsb2Moc2l6ZSk7CisKKyAgICByZXR1cm4gcE1lbW9yeTsKK30KKworc3RhdGljIHZvaWQgdmt0cmFjZV9mcmVlKHZvaWQqIHB0cikKK3sKKyAgICBmcmVlKHB0cik7CisgICAgcHRyID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKiB2a3RyYWNlX3JlYWxsb2Modm9pZCAqcHRyLHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnBNZW1vcnk7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwTWVtb3J5ID0gcmVhbGxvYyhwdHIsIHNpemUpOworICAgIHJldHVybiBwTWVtb3J5OworfQorCitzdGF0aWMgY2hhciogdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weShjb25zdCBjaGFyKiBfc3JjKQoreworICAgIGlmIChfc3JjID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAxICsgc3RybGVuKF9zcmMpOworCisgICAgICAgIGNoYXIqIHJldFZhbCA9IFZLVFJBQ0VfTkVXX0FSUkFZKGNoYXIsIGJ1ZmZlclNpemUpOworI2lmZGVmIFdJTjMyCisgICAgICAgIHN0cmNweV9zKHJldFZhbCwgYnVmZmVyU2l6ZSwgX3NyYyk7CisjZWxzZSAvLyBsaW51eAorICAgICAgICBzdHJuY3B5KHJldFZhbCwgX3NyYywgYnVmZmVyU2l6ZSk7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KK30KKworc3RhdGljIGNoYXIqIHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHlfbihjb25zdCBjaGFyKiBfc3JjLCBpbnQgX2NvdW50KQoreworICAgIHNpemVfdCBidWZmZXJTaXplID0gMSArIF9jb3VudDsKKworICAgIGNoYXIqIHJldFZhbCA9IFZLVFJBQ0VfTkVXX0FSUkFZKGNoYXIsIGJ1ZmZlclNpemUpOworCisjaWZkZWYgV0lOMzIKKyAgICBzdHJuY3B5X3MocmV0VmFsLCBidWZmZXJTaXplLCBfc3JjLCBfY291bnQpOworI2Vsc2UgLy8gbGludXgKKyAgICBzdHJuY3B5KHJldFZhbCwgX3NyYywgX2NvdW50KTsKKyAgICByZXRWYWxbX2NvdW50XSA9ICdcMCc7CisjZW5kaWYKKworICAgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBjaGFyKiB2a3RyYWNlX2NvcHlfYW5kX2FwcGVuZChjb25zdCBjaGFyKiBwQmFzZVN0cmluZywgY29uc3QgY2hhciogcFNlcGFyYXRvciwgY29uc3QgY2hhciogcEFwcGVuZFN0cmluZykKK3sKKyAgICBzaXplX3QgYmFzZVNpemUgPSAocEJhc2VTdHJpbmcgIT0gTlVMTCkgPyBzdHJsZW4ocEJhc2VTdHJpbmcpIDogMDsKKyAgICBzaXplX3Qgc2VwYXJhdG9yU2l6ZSA9ICgocEFwcGVuZFN0cmluZyAhPSBOVUxMKSAmJiBzdHJsZW4ocEFwcGVuZFN0cmluZykgJiYgKHBTZXBhcmF0b3IgIT0gTlVMTCkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihwU2VwYXJhdG9yKSA6IDA7CisgICAgc2l6ZV90IGFwcGVuZFNpemUgPSAocEFwcGVuZFN0cmluZyAhPSBOVUxMKSA/IHN0cmxlbihwQXBwZW5kU3RyaW5nKSA6IDA7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBiYXNlU2l6ZSArIHNlcGFyYXRvclNpemUgKyBhcHBlbmRTaXplICsgMTsKKyAgICBjaGFyKiByZXRWYWwgPSBWS1RSQUNFX05FV19BUlJBWShjaGFyLCBidWZmZXJTaXplKTsKKyAgICBpZiAocmV0VmFsICE9IE5VTEwpCisgICAgeworI2lmZGVmIFdJTjMyCisgICAgICAgIHN0cm5jcHlfcyhyZXRWYWwsIGJ1ZmZlclNpemUsIHBCYXNlU3RyaW5nLCBiYXNlU2l6ZSk7CisgICAgICAgIHN0cm5jcHlfcygmcmV0VmFsW2Jhc2VTaXplXSwgYnVmZmVyU2l6ZS1iYXNlU2l6ZSwgcFNlcGFyYXRvciwgc2VwYXJhdG9yU2l6ZSk7CisgICAgICAgIHN0cm5jcHlfcygmcmV0VmFsW2Jhc2VTaXplK3NlcGFyYXRvclNpemVdLCBidWZmZXJTaXplLWJhc2VTaXplLXNlcGFyYXRvclNpemUsIHBBcHBlbmRTdHJpbmcsIGFwcGVuZFNpemUpOworI2Vsc2UgLy8gbGludXgKKyAgICAgICAgc3RybmNweShyZXRWYWwsIHBCYXNlU3RyaW5nLCBiYXNlU2l6ZSk7CisgICAgICAgIHN0cm5jcHkoJnJldFZhbFtiYXNlU2l6ZV0sIHBTZXBhcmF0b3IsIHNlcGFyYXRvclNpemUpOworICAgICAgICBzdHJuY3B5KCZyZXRWYWxbYmFzZVNpemUrc2VwYXJhdG9yU2l6ZV0sIHBBcHBlbmRTdHJpbmcsIGFwcGVuZFNpemUpOworI2VuZGlmCisgICAgfQorICAgIHJldFZhbFtidWZmZXJTaXplLTFdID0gJ1wwJzsKKyAgICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgY2hhciogdmt0cmFjZV9jb3B5X2FuZF9hcHBlbmRfYXJncyhjb25zdCBjaGFyKiBwQmFzZVN0cmluZywgY29uc3QgY2hhciogcFNlcGFyYXRvciwgY29uc3QgY2hhciogcEFwcGVuZEZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICAgIHNpemVfdCBiYXNlU2l6ZSA9IChwQmFzZVN0cmluZyAhPSBOVUxMKSA/IHN0cmxlbihwQmFzZVN0cmluZykgOiAwOworICAgIHNpemVfdCBzZXBhcmF0b3JTaXplID0gKHBTZXBhcmF0b3IgIT0gTlVMTCkgPyBzdHJsZW4ocFNlcGFyYXRvcikgOiAwOworICAgIHNpemVfdCBhcHBlbmRTaXplID0gMDsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgY2hhciogcmV0VmFsID0gTlVMTDsKKworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgYXBwZW5kU2l6ZSA9IF92c2NwcmludGYocEFwcGVuZEZvcm1hdCwgYXJncyk7CisjZWxpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICB2YV9saXN0IGFyZ2NvcHk7CisgICAgdmFfY29weShhcmdjb3B5LCBhcmdzKTsKKyAgICBhcHBlbmRTaXplID0gdnNucHJpbnRmKE5VTEwsIDAsIHBBcHBlbmRGb3JtYXQsIGFyZ2NvcHkpOworICAgIHZhX2VuZChhcmdjb3B5KTsKKyNlbmRpZgorCisgICAgYnVmZmVyU2l6ZSA9IGJhc2VTaXplICsgc2VwYXJhdG9yU2l6ZSArIGFwcGVuZFNpemUgKyAxOworICAgIHJldFZhbCA9IFZLVFJBQ0VfTkVXX0FSUkFZKGNoYXIsIGJ1ZmZlclNpemUpOworICAgIGlmIChyZXRWYWwgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgV0lOMzIKKyAgICAgICAgc3RybmNweV9zKHJldFZhbCwgYnVmZmVyU2l6ZSwgcEJhc2VTdHJpbmcsIGJhc2VTaXplKTsKKyAgICAgICAgc3RybmNweV9zKCZyZXRWYWxbYmFzZVNpemVdLCBidWZmZXJTaXplLWJhc2VTaXplLCBwU2VwYXJhdG9yLCBzZXBhcmF0b3JTaXplKTsKKyAgICAgICAgX3ZzbnByaW50Zl9zKCZyZXRWYWxbYmFzZVNpemUrc2VwYXJhdG9yU2l6ZV0sIGJ1ZmZlclNpemUtYmFzZVNpemUtc2VwYXJhdG9yU2l6ZSwgYXBwZW5kU2l6ZSwgcEFwcGVuZEZvcm1hdCwgYXJncyk7CisjZWxzZSAvLyBsaW51eAorICAgICAgICBzdHJuY3B5KHJldFZhbCwgcEJhc2VTdHJpbmcsIGJhc2VTaXplKTsKKyAgICAgICAgc3RybmNweSgmcmV0VmFsW2Jhc2VTaXplXSwgcFNlcGFyYXRvciwgc2VwYXJhdG9yU2l6ZSk7CisgICAgICAgIHZzbnByaW50ZigmcmV0VmFsW2Jhc2VTaXplK3NlcGFyYXRvclNpemVdLCBhcHBlbmRTaXplLCBwQXBwZW5kRm9ybWF0LCBhcmdzKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gcmV0VmFsOworfQorCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX211bHRpcGxhdGZvcm0uaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfbXVsdGlwbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjU0MzgKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX211bHRpcGxhdGZvcm0uaApAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogRGF2aWQgUGluZWRvPGRhdmlkQGx1bmFyZy5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCisjaW5jbHVkZSAidmt0cmFjZV9maWxlbGlrZS5oIgorI2luY2x1ZGUgInZrdHJhY2VfbWVtb3J5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9wcm9jZXNzLmgiCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgInZ1bGthbi92a19pY2QuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8vIERlZmluZSB0eXBlcyBuZWVkZWQgZm9yIGNyb3NzLXBsYXRmb3JtIHZrcmVwbGF5LgorLy8gVW5mb3J0dW5hdGVseSwgc29tZSBvZiB0aGVzZSBhcmUgZHVwbGljYXRlZCBmcm9tIHZ1bGthbi5oCisvLyBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgaGVhZGVyIGZpbGVzLiBIYXZlbid0IGZpZ3VyZWQgb3V0IGhvdworLy8gdG8gYXZvaWQgdGhpcy4KKyNpZiAhZGVmaW5lZChWS19VU0VfUExBVEZPUk1fWENCX0tIUikKK3R5cGVkZWYgVmtGbGFncyBWa1hjYlN1cmZhY2VDcmVhdGVGbGFnc0tIUjsKK3R5cGVkZWYgc3RydWN0IHhjYl9jb25uZWN0aW9uX3QgeGNiX2Nvbm5lY3Rpb25fdDsKK3R5cGVkZWYgdWludDMyX3QgeGNiX3dpbmRvd190OwordHlwZWRlZiB1aW50MzJfdCB4Y2JfdmlzdWFsaWRfdDsKK3R5cGVkZWYgc3RydWN0IFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgeworICAgIFZrU3RydWN0dXJlVHlwZSAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrWGNiU3VyZmFjZUNyZWF0ZUZsYWdzS0hSICAgIGZsYWdzOworICAgIHhjYl9jb25uZWN0aW9uX3QqICAgICAgICAgICAgIGNvbm5lY3Rpb247CisgICAgeGNiX3dpbmRvd190ICAgICAgICAgICAgICAgICAgd2luZG93OworfSBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSOwordHlwZWRlZiBWa1Jlc3VsdCAoVktBUElfUFRSICpQRk5fdmtDcmVhdGVYY2JTdXJmYWNlS0hSKShWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKK3R5cGVkZWYgVmtCb29sMzIgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKShWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LCB4Y2JfY29ubmVjdGlvbl90KiBjb25uZWN0aW9uLCB4Y2JfdmlzdWFsaWRfdCB2aXN1YWxfaWQpOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrSWNkU3VyZmFjZUJhc2UgYmFzZTsKKyAgICB4Y2JfY29ubmVjdGlvbl90ICpjb25uZWN0aW9uOworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7Cit9IFZrSWNkU3VyZmFjZVhjYjsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSKQordHlwZWRlZiBWa0ZsYWdzIFZrWGxpYlN1cmZhY2VDcmVhdGVGbGFnc0tIUjsKK3N0cnVjdCBfWERpc3BsYXk7Cit0eXBlZGVmIHN0cnVjdCBfWERpc3BsYXkgRGlzcGxheTsKK3R5cGVkZWYgdWludDMyX3QgQ0FSRDMyOwordHlwZWRlZiBDQVJEMzIgWElEOwordHlwZWRlZiBYSUQgV2luZG93OwordHlwZWRlZiBDQVJEMzIgVmlzdWFsSUQ7Cit0eXBlZGVmIHN0cnVjdCBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1hsaWJTdXJmYWNlQ3JlYXRlRmxhZ3NLSFIgICAgZmxhZ3M7CisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgIGRweTsKKyAgICBXaW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93OworfSBWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKK3R5cGVkZWYgVmtCb29sMzIgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUikoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgcXVldWVGYW1pbHlJbmRleCwgRGlzcGxheSogZHB5LCBWaXN1YWxJRCB2aXN1YWxJRCk7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmtJY2RTdXJmYWNlQmFzZSBiYXNlOworICAgIERpc3BsYXkgKmRweTsKKyAgICBXaW5kb3cgd2luZG93OworfSBWa0ljZFN1cmZhY2VYbGliOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIpCit0eXBlZGVmIFZrRmxhZ3MgVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUZsYWdzS0hSOwordHlwZWRlZiB1aW50MzJfdCogQU5hdGl2ZVdpbmRvdzsKK3R5cGVkZWYgc3RydWN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIHsKKyAgICBWa1N0cnVjdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgc1R5cGU7CisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OworICAgIFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVGbGFnc0tIUiAgICBmbGFnczsKKyAgICBBTmF0aXZlV2luZG93KiAgICAgICAgICAgICAgICAgICAgd2luZG93OworfSBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUjsKK3R5cGVkZWYgVmtSZXN1bHQgKFZLQVBJX1BUUiAqUEZOX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIpKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgQU5hdGl2ZVdpbmRvdyogd2luZG93OworfSBWa0ljZFN1cmZhY2VBbmRyb2lkOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKK3R5cGVkZWYgdm9pZCogSElOU1RBTkNFOwordHlwZWRlZiB2b2lkKiBIV05EOwordHlwZWRlZiB2b2lkKiBIQU5ETEU7Cit0eXBlZGVmIFZrRmxhZ3MgVmtXaW4zMlN1cmZhY2VDcmVhdGVGbGFnc0tIUjsKK3R5cGVkZWYgc3RydWN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiB7CisgICAgVmtTdHJ1Y3R1cmVUeXBlICAgICAgICAgICAgICAgIHNUeXBlOworICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgICAgICAgICBwTmV4dDsKKyAgICBWa1dpbjMyU3VyZmFjZUNyZWF0ZUZsYWdzS0hSICAgZmxhZ3M7CisgICAgSElOU1RBTkNFICAgICAgICAgICAgICAgICAgICAgIGhpbnN0YW5jZTsKKyAgICBIV05EICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93OworfSBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFI7Cit0eXBlZGVmIFZrUmVzdWx0IChWS0FQSV9QVFIgKlBGTl92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUikoVmtJbnN0YW5jZSBpbnN0YW5jZSwgY29uc3QgVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKiBwQ3JlYXRlSW5mbywgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLCBWa1N1cmZhY2VLSFIqIHBTdXJmYWNlKTsKK3R5cGVkZWYgVmtCb29sMzIgKFZLQVBJX1BUUiAqUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIpKFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgpOworCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wYWdlZ3VhcmRfbWVtb3J5Y29weS5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjY4NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wYWdlZ3VhcmRfbWVtb3J5Y29weS5jcHAKQEAgLTAsMCArMSw0OTUgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidmt0cmFjZV9wYWdlZ3VhcmRfbWVtb3J5Y29weS5oIgorCisjZGVmaW5lIE9QVElNSVpBVElPTl9GVU5DVElPTl9JTVBMRU1FTlRBVElPTgorCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgU0laRV9MSU1JVF9UT19VU0VfT1BUSU1JWkFUSU9OID0gMSoxMDI0KjEwMjQ7IC8vdHVybiBvZmYgb3B0aW1pemF0aW9uIG9mIG1lbWNweSBpZiBzaXplIDwgdGhpcyBsaW1pdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIG11bHRpdGhyZWFkIG1lbWNvcHksIHRoZXJlIGlzIHN5c3RlbSBjb3N0IG9uIG11bHRpcGxlIHRocmVhZHMgaW5jbHVkZSBzd2l0Y2ggY29udHJvbCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zeW5jaHJvbml6YXRpb24gYW5kIGNvbW11bmljYXRpb24gbGlrZSBzZW1hcGhvcmUgd2FpdCBhbmQgcG9zdCBhbmQgb3RoZXIgcHJvY2VzcyB3aGljaCBzeXN0ZW0gZG9uJ3QgbmVlZCB0byBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW4gc2luZ2xlIHRocmVhZCBtZW1jcHksIGlmIHRoZXNlIGNvc3QgaXMgZ3JlYXRlciB0aGFuIGJlbmVmaXQgb2YgdXNpbmcgbXVsdGl0aHJlYWQsd2Ugc2hvdWxkIGRpcmVjdGx5IGNhbGwgbWVtY3B5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oZXJlIHNldCB0aGUgdmFsdWUgd2l0aCAxTSBiYXNlIG9uIHJvdWdobHkgZXN0aW1hdGlvbiBvZiB0aGUgY29zdC4KKworCitib29sIHZrdHJhY2Vfc2VtX2NyZWF0ZSh2a3RyYWNlX3NlbV9pZCAqc2VtX2lkLCB1aW50MzJfdCBpbml0dmFsdWUpCit7CisgICAgYm9vbCBzZW1fY3JlYXRlX29rID0gZmFsc2U7CisjaWYgZGVmaW5lZChVU0VfUEFHRUdVQVJEX1NQRUVEVVApCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWF4VmFsdWU9MHg0MDAwMDsgLy8gUG9zaXggZG9lc24ndCBoYXZlIHRoaXMgdmFsdWUgaW4gaXRzIHNlbV9jcmVhdGUgaW50ZXJmYWNlLCBidXQgd2luZG93cyBoYXZlIGl0LiBoZXJlIHdlIGFsc28gZG9uJ3QgbmVlZCB0aGlzIHZhbHVlLCBzbyBnaXZlIGl0IGEgdmFsdWUgdGhhdCdzIGhhcyBubyBsaW1pdCBmb3IgdGhpcyBjYXNlLgorICAgIEhBTkRMRSBzaWQgPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgaW5pdHZhbHVlLCBtYXhWYWx1ZSwgTlVMTCk7CisgICAgaWYgKHNpZCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICAgICpzZW1faWQgPSBzaWQ7CisgICAgICAgIHNlbV9jcmVhdGVfb2sgPSB0cnVlOworICAgIH0KKyNlbHNlCisgICAgc2VtX3QgKnNlbSA9IG5ldyBzZW1fdDsKKyAgICBpZihzZW0gIT0gbnVsbHB0cikKKyAgICB7CisgICAgICAgIGlmIChzZW1faW5pdChzZW0sIDAsIGluaXR2YWx1ZSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VtX2NyZWF0ZV9vayA9IHRydWU7CisgICAgICAgICAgICAqc2VtX2lkID0gc2VtOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisjZW5kaWYgLy8gVVNFX1BBR0VHVUFSRF9TUEVFRFVQCisgICAgcmV0dXJuIHNlbV9jcmVhdGVfb2s7Cit9CisKK3ZvaWQgdmt0cmFjZV9zZW1fZGVsZXRlKHZrdHJhY2Vfc2VtX2lkIHNpZCkKK3sKKyNpZiBkZWZpbmVkKFVTRV9QQUdFR1VBUkRfU1BFRURVUCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIENsb3NlSGFuZGxlKHNpZCk7CisjZWxzZQorICAgIHNlbV9jbG9zZShzaWQpOworICAgIGRlbGV0ZSAoc2VtX3QgKilzaWQ7CisjZW5kaWYKKyNlbmRpZiAvLyBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKK30KKwordm9pZCB2a3RyYWNlX3NlbV93YWl0KHZrdHJhY2Vfc2VtX2lkIHNpZCkKK3sKKyNpZiBkZWZpbmVkKFVTRV9QQUdFR1VBUkRfU1BFRURVUCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qoc2lkLCBJTkZJTklURSk7CisjZWxzZQorICAgIHNlbV93YWl0KHNpZCk7CisjZW5kaWYKKyNlbmRpZiAvLyBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKK30KKwordm9pZCB2a3RyYWNlX3NlbV9wb3N0KHZrdHJhY2Vfc2VtX2lkIHNpZCkKK3sKKyNpZiBkZWZpbmVkKFVTRV9QQUdFR1VBUkRfU1BFRURVUCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIFJlbGVhc2VTZW1hcGhvcmUoc2lkLCAxLCBOVUxMKTsKKyNlbHNlCisgICAgc2VtX3Bvc3Qoc2lkKTsKKyNlbmRpZgorI2VuZGlmIC8vIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorfQorCisjaWYgZGVmaW5lZChQQUdFR1VBUkRfTUVNQ1BZX1VTRV9QUExfTElCKQorCisjaWYgZGVmaW5lZChXSU4zMikKKyNkZWZpbmUgUEFSQUxMRUxfSU5WT0tFX05VTSAgIDEwIC8vdGhpcyBpcyB0aGUgbWF4aW11bSB0YXNrIG51bWJlciB0aGF0ICBwYXJhbGxlbF9pbnZva2UgY2FuIHVzZSwgaG93IG1hbnkgdGhyZWFkcyBhcmUgYWN0dWFsbHkgdXNlZCB0byBmaW5pc2ggdGhlc2UgdGFzayBkZXBhbmQgb24gc3lzdGVtIGNvbmN1cnJlbmN5IGFsZ29yaXRobS4KK2V4dGVybiAiQyIgdm9pZCAqdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5KHZvaWQgKiBkZXN0aW5hdGlvbiwgY29uc3Qgdm9pZCAqIHNvdXJjZSwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcFJldD1OVUxMOworICAgICAgICBpZiAoc2l6ZSA8IFNJWkVfTElNSVRfVE9fVVNFX09QVElNSVpBVElPTikKKyAgICAgICAgeworICAgICAgICAgICAgcFJldCA9IG1lbWNweShkZXN0aW5hdGlvbiwgc291cmNlLCAoc2l6ZV90KXNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFJldCA9IGRlc3RpbmF0aW9uOworICAgICAgICAgICAgdm9pZCogcHRyX3BhcmFsbGVsW1BBUkFMTEVMX0lOVk9LRV9OVU1dOworICAgICAgICAgICAgdm9pZCogcEJ1ZmZlcl9wYXJhbGxlbFtQQVJBTExFTF9JTlZPS0VfTlVNXTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplX3BhcmFsbGVsW1BBUkFMTEVMX0lOVk9LRV9OVU1dOworCisgICAgICAgICAgICBpbnQgc3RlcHNpemUgPSBzaXplIC8gUEFSQUxMRUxfSU5WT0tFX05VTTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUEFSQUxMRUxfSU5WT0tFX05VTTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB0cl9wYXJhbGxlbFtpXSA9IChjaGFyICopZGVzdGluYXRpb24gKyBpKnN0ZXBzaXplOworICAgICAgICAgICAgICAgIHBCdWZmZXJfcGFyYWxsZWxbaV0gPSAoY2hhciAqKXNvdXJjZSArIGkqc3RlcHNpemU7CisgICAgICAgICAgICAgICAgaWYgKChpICsgMSkgPT0gUEFSQUxMRUxfSU5WT0tFX05VTSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfcGFyYWxsZWxbaV0gPSBzaXplIC0gKFBBUkFMTEVMX0lOVk9LRV9OVU0tMSkqc3RlcHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc2l6ZV9wYXJhbGxlbFtpXSA9IHN0ZXBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcmFsbGVsX2ludm9rZSgKKyAgICAgICAgICAgICAgICBbJnB0cl9wYXJhbGxlbCwgJnBCdWZmZXJfcGFyYWxsZWwsICZzaXplX3BhcmFsbGVsXSB7IG1lbWNweShwdHJfcGFyYWxsZWxbOV0sIHBCdWZmZXJfcGFyYWxsZWxbOV0sIChzaXplX3Qpc2l6ZV9wYXJhbGxlbFs5XSk7IH0sCisgICAgICAgICAgICAgICAgWyZwdHJfcGFyYWxsZWwsICZwQnVmZmVyX3BhcmFsbGVsLCAmc2l6ZV9wYXJhbGxlbF0geyBtZW1jcHkocHRyX3BhcmFsbGVsWzhdLCBwQnVmZmVyX3BhcmFsbGVsWzhdLCAoc2l6ZV90KXNpemVfcGFyYWxsZWxbOF0pOyB9LAorICAgICAgICAgICAgICAgIFsmcHRyX3BhcmFsbGVsLCAmcEJ1ZmZlcl9wYXJhbGxlbCwgJnNpemVfcGFyYWxsZWxdIHsgbWVtY3B5KHB0cl9wYXJhbGxlbFs3XSwgcEJ1ZmZlcl9wYXJhbGxlbFs3XSwgKHNpemVfdClzaXplX3BhcmFsbGVsWzddKTsgfSwKKyAgICAgICAgICAgICAgICBbJnB0cl9wYXJhbGxlbCwgJnBCdWZmZXJfcGFyYWxsZWwsICZzaXplX3BhcmFsbGVsXSB7IG1lbWNweShwdHJfcGFyYWxsZWxbNl0sIHBCdWZmZXJfcGFyYWxsZWxbNl0sIChzaXplX3Qpc2l6ZV9wYXJhbGxlbFs2XSk7IH0sCisgICAgICAgICAgICAgICAgWyZwdHJfcGFyYWxsZWwsICZwQnVmZmVyX3BhcmFsbGVsLCAmc2l6ZV9wYXJhbGxlbF0geyBtZW1jcHkocHRyX3BhcmFsbGVsWzVdLCBwQnVmZmVyX3BhcmFsbGVsWzVdLCAoc2l6ZV90KXNpemVfcGFyYWxsZWxbNV0pOyB9LAorICAgICAgICAgICAgICAgIFsmcHRyX3BhcmFsbGVsLCAmcEJ1ZmZlcl9wYXJhbGxlbCwgJnNpemVfcGFyYWxsZWxdIHsgbWVtY3B5KHB0cl9wYXJhbGxlbFs0XSwgcEJ1ZmZlcl9wYXJhbGxlbFs0XSwgKHNpemVfdClzaXplX3BhcmFsbGVsWzRdKTsgfSwKKyAgICAgICAgICAgICAgICBbJnB0cl9wYXJhbGxlbCwgJnBCdWZmZXJfcGFyYWxsZWwsICZzaXplX3BhcmFsbGVsXSB7IG1lbWNweShwdHJfcGFyYWxsZWxbM10sIHBCdWZmZXJfcGFyYWxsZWxbM10sIChzaXplX3Qpc2l6ZV9wYXJhbGxlbFszXSk7IH0sCisgICAgICAgICAgICAgICAgWyZwdHJfcGFyYWxsZWwsICZwQnVmZmVyX3BhcmFsbGVsLCAmc2l6ZV9wYXJhbGxlbF0geyBtZW1jcHkocHRyX3BhcmFsbGVsWzJdLCBwQnVmZmVyX3BhcmFsbGVsWzJdLCAoc2l6ZV90KXNpemVfcGFyYWxsZWxbMl0pOyB9LAorICAgICAgICAgICAgICAgIFsmcHRyX3BhcmFsbGVsLCAmcEJ1ZmZlcl9wYXJhbGxlbCwgJnNpemVfcGFyYWxsZWxdIHsgbWVtY3B5KHB0cl9wYXJhbGxlbFsxXSwgcEJ1ZmZlcl9wYXJhbGxlbFsxXSwgKHNpemVfdClzaXplX3BhcmFsbGVsWzFdKTsgfSwKKyAgICAgICAgICAgICAgICBbJnB0cl9wYXJhbGxlbCwgJnBCdWZmZXJfcGFyYWxsZWwsICZzaXplX3BhcmFsbGVsXSB7IG1lbWNweShwdHJfcGFyYWxsZWxbMF0sIHBCdWZmZXJfcGFyYWxsZWxbMF0sIChzaXplX3Qpc2l6ZV9wYXJhbGxlbFswXSk7IH0KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICByZXR1cm4gcFJldDsKK30KKyNlbHNlLy9kZWZpbmVkKFBBR0VHVUFSRF9NRU1DUFlfVVNFX1BQTF9MSUIpLCBMaW51eAorZXh0ZXJuICJDIiB2b2lkICp2a3RyYWNlX3BhZ2VndWFyZF9tZW1jcHkodm9pZCAqIGRlc3RpbmF0aW9uLCBjb25zdCB2b2lkICogc291cmNlLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gbWVtY3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UsIChzaXplX3Qpc2l6ZSk7Cit9CisjZW5kaWYKKworI2Vsc2UgLy8hZGVmaW5lZChQQUdFR1VBUkRfTUVNQ1BZX1VTRV9QUExfTElCKSwgdXNlIGNyb3NzLXBsYXRmb3JtIG1lbWNweSBtdWx0aXRocmVhZCB3aGljaCBleGNsdWRlIFBQTAorCisKK3R5cGVkZWYgdm9pZCgqdmt0cmFjZV9wYWdlZ3VhcmRfcHRyX3Rhc2tfdW5pdF9mdW5jdGlvbikodm9pZCAqcFRhc2tVbml0UGFyYUlucHV0KTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2b2lkICogc3JjLCAqZGVzdDsKKyAgICBzaXplX3Qgc2l6ZTsKK30gdmt0cmFjZV9wYWdlZ3VhcmRfdGFza191bml0X3BhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGluZGV4OworICAgIHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfdW5pdF9wYXJhbWV0ZXJzICpwdGFza191bml0czsKKyAgICBpbnQgYW1vdW50OworICAgIHZrdHJhY2Vfc2VtX2lkIHNlbV9pZF9hY2Nlc3M7Cit9IHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfcXVldWU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGluZGV4OworICAgIHZrdHJhY2VfcGFnZWd1YXJkX3RocmVhZF9pZCB0aHJlYWRfaWQ7CisgICAgdmt0cmFjZV9zZW1faWQgc2VtX2lkX3Rhc2tfc3RhcnQ7CisgICAgdmt0cmFjZV9zZW1faWQgc2VtX2lkX3Rhc2tfZW5kOworICAgIC8vdmt0cmFjZV9wYWdlZ3VhcmRfdGFza191bml0X3BhcmFtZXRlcnMgKnB0YXNrX3BhcmE7Cit9IHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfY29udHJvbF9ibG9jazsKKworCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB0eXBlZGVmIHVpbnQzMl90KCp2a3RyYWNlX3BhZ2VndWFyZF90aHJlYWRfZnVuY3Rpb25fcHRyKSh2b2lkICpwYXJhbWV0ZXJzKTsKKyNlbHNlCisgIHR5cGVkZWYgdm9pZCAqKCp2a3RyYWNlX3BhZ2VndWFyZF90aHJlYWRfZnVuY3Rpb25fcHRyKSh2b2lkICpwYXJhbWV0ZXJzKTsKKyNlbmRpZgorYm9vbCB2a3RyYWNlX3BhZ2VndWFyZF9jcmVhdGVfdGhyZWFkKHZrdHJhY2VfcGFnZWd1YXJkX3RocmVhZF9pZCAqcHRpZCwgdmt0cmFjZV9wYWdlZ3VhcmRfdGhyZWFkX2Z1bmN0aW9uX3B0ciBwZnVuYywgdmt0cmFjZV9wYWdlZ3VhcmRfdGFza19jb250cm9sX2Jsb2NrICpwdGFza3BhcmEpCit7CisgICAgYm9vbCBjcmVhdGVfdGhyZWFkX29rID0gZmFsc2U7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBEV09SRCBkd1RocmVhZElEOworICAgIEhBTkRMRSB0aHJlYWRfaGFuZGxlOworICAgIHRocmVhZF9oYW5kbGUgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwKKyAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpcGZ1bmMsIHB0YXNrcGFyYSwKKyAgICAgICAgMCwgJmR3VGhyZWFkSUQpOworCisgICAgaWYgKHRocmVhZF9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgICAqcHRpZCA9IHRocmVhZF9oYW5kbGU7CisgICAgICAgIGNyZWF0ZV90aHJlYWRfb2sgPSB0cnVlOworICAgIH0KKworI2Vsc2UKKyAgICBwdGhyZWFkX3QgdGhyZWFkOworICAgIGludCBzdGF0ZSA9IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgb2xkdHlwZTsKKyAgICBzdGF0ZSA9IFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUzsKKyAgICBwdGhyZWFkX3NldGNhbmNlbHR5cGUoc3RhdGUsICZvbGR0eXBlKTsKKyAgICBpZiAocHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgcGZ1bmMsICh2b2lkICopcHRhc2twYXJhKSA9PSAwKQorICAgIHsKKyAgICAgICAgKnB0aWQgPSB0aHJlYWQ7CisgICAgICAgIGNyZWF0ZV90aHJlYWRfb2sgPSB0cnVlOworICAgIH0KKyAgICBwdGhyZWFkX3NldGNhbmNlbHR5cGUob2xkdHlwZSwgJnN0YXRlKTsKKyNlbmRpZgorICAgIHJldHVybiBjcmVhdGVfdGhyZWFkX29rOworfQorCisKK3ZvaWQgdmt0cmFjZV9wYWdlZ3VhcmRfam9pbl90aHJlYWQodmt0cmFjZV9wYWdlZ3VhcmRfdGhyZWFkX2lkIHRpZCkKK3sKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoKEhBTkRMRSl0aWQsIElORklOSVRFKTsKKyNlbHNlCisgICAgcHRocmVhZF9qb2luKChwdGhyZWFkX3QpdGlkLCBOVUxMKTsKKyNlbmRpZgorfQorCit2b2lkIHZrdHJhY2VfcGFnZWd1YXJkX2RlbGV0ZV90aHJlYWQodmt0cmFjZV9wYWdlZ3VhcmRfdGhyZWFkX2lkIHRpZCkKK3sKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIERXT1JEICBkd0V4aXRDb2RlPTA7CisgICAgVGVybWluYXRlVGhyZWFkKChIQU5ETEUpdGlkLCBkd0V4aXRDb2RlKTsKKyNlbHNlCisgICAgcHRocmVhZF9jYW5jZWwoKHB0aHJlYWRfdCl0aWQpOworI2VuZGlmCit9CisKK2ludCB2a3RyYWNlX3BhZ2VndWFyZF9nZXRfY3B1X2NvcmVfY291bnQoKQoreworICAgIGludCBpcmV0ID0gNDsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIFNZU1RFTV9JTkZPIHNTeXNJbmZvOworICAgIEdldFN5c3RlbUluZm8oJnNTeXNJbmZvKTsKKyAgICBpcmV0ID0gc1N5c0luZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisjZWxzZQorICAgIGlyZXQ9c3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZW5kaWYKKyAgICByZXR1cm4gaXJldDsKK30KKwordmt0cmFjZV9wYWdlZ3VhcmRfdGFza19xdWV1ZSAqdmt0cmFjZV9wYWdlZ3VhcmRfZ2V0X3Rhc2tfcXVldWUoKQoreworICAgIHN0YXRpYyB2a3RyYWNlX3BhZ2VndWFyZF90YXNrX3F1ZXVlICpwdmt0cmFjZV9wYWdlZ3VhcmRfdGFza19xdWV1ZV9tdWx0aV90aHJlYWRfbWVtY3B5ID0gbnVsbHB0cjsKKyAgICBpZiAoIXB2a3RyYWNlX3BhZ2VndWFyZF90YXNrX3F1ZXVlX211bHRpX3RocmVhZF9tZW1jcHkpCisgICAgeworICAgICAgICBwdmt0cmFjZV9wYWdlZ3VhcmRfdGFza19xdWV1ZV9tdWx0aV90aHJlYWRfbWVtY3B5ID0gbmV3IHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfcXVldWU7CisgICAgICAgIG1lbXNldCggcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHB2a3RyYWNlX3BhZ2VndWFyZF90YXNrX3F1ZXVlX211bHRpX3RocmVhZF9tZW1jcHkpLCAwLCBzaXplb2Yodmt0cmFjZV9wYWdlZ3VhcmRfdGFza19xdWV1ZSkpOworICAgICAgICB2a3RyYWNlX3NlbV9jcmVhdGUoJnB2a3RyYWNlX3BhZ2VndWFyZF90YXNrX3F1ZXVlX211bHRpX3RocmVhZF9tZW1jcHktPnNlbV9pZF9hY2Nlc3MsIDEpOworICAgIH0KKyAgICByZXR1cm4gcHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfcXVldWVfbXVsdGlfdGhyZWFkX21lbWNweTsKK30KKwordmt0cmFjZV9wYWdlZ3VhcmRfdGFza191bml0X3BhcmFtZXRlcnMgKnZrdHJhY2VfcGFnZWd1YXJkX2dldF90YXNrX3VuaXRfcGFyYW1ldGVycygpCit7CisgICAgdmt0cmFjZV9wYWdlZ3VhcmRfdGFza191bml0X3BhcmFtZXRlcnMgKnByZXQgPSBudWxscHRyOworICAgIHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfcXVldWUgKnB0YXNrcXVldWUgPSB2a3RyYWNlX3BhZ2VndWFyZF9nZXRfdGFza19xdWV1ZSgpOworICAgIHZrdHJhY2Vfc2VtX3dhaXQocHRhc2txdWV1ZS0+c2VtX2lkX2FjY2Vzcyk7CisgICAgaWYgKHB0YXNrcXVldWUtPmluZGV4PHB0YXNrcXVldWUtPmFtb3VudCkKKyAgICB7CisgICAgICAgIHByZXQgPSAmcHRhc2txdWV1ZS0+cHRhc2tfdW5pdHNbcHRhc2txdWV1ZS0+aW5kZXhdOworICAgICAgICBwdGFza3F1ZXVlLT5pbmRleCsrOworICAgIH0KKyAgICB2a3RyYWNlX3NlbV9wb3N0KHB0YXNrcXVldWUtPnNlbV9pZF9hY2Nlc3MpOworICAgIHJldHVybiBwcmV0OworfQorCit2a3RyYWNlX3BhZ2VndWFyZF90YXNrX2NvbnRyb2xfYmxvY2sgKnZrdHJhY2VfcGFnZWd1YXJkX2dldF90YXNrX2NvbnRyb2xfYmxvY2soKQoreworICAgIHN0YXRpYyB2a3RyYWNlX3BhZ2VndWFyZF90YXNrX2NvbnRyb2xfYmxvY2sgKnB0YXNrX2NvbnRyb2xfYmxvY2sgPSBudWxscHRyOworICAgIGlmICghcHRhc2tfY29udHJvbF9ibG9jaykKKyAgICB7CisgICAgICAgIGludCB0aHJlYWRfbnVtYmVyID0gdmt0cmFjZV9wYWdlZ3VhcmRfZ2V0X2NwdV9jb3JlX2NvdW50KCk7CisgICAgICAgIHB0YXNrX2NvbnRyb2xfYmxvY2sgPSByZWludGVycHJldF9jYXN0PHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfY29udHJvbF9ibG9jayAqPihuZXcgdWludDhfdFt0aHJlYWRfbnVtYmVyKnNpemVvZih2a3RyYWNlX3BhZ2VndWFyZF90YXNrX2NvbnRyb2xfYmxvY2spXSk7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXB0YXNrX2NvbnRyb2xfYmxvY2ssIDAsIHRocmVhZF9udW1iZXIqc2l6ZW9mKHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfY29udHJvbF9ibG9jaykpOworICAgIH0KKyAgICByZXR1cm4gcHRhc2tfY29udHJvbF9ibG9jazsKK30KKwordWludDMyX3Qgdmt0cmFjZV9wYWdlZ3VhcmRfdGhyZWFkX2Z1bmN0aW9uKHZvaWQgKnB0Y2JwYXJhKQoreworICAgIHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfY29udHJvbF9ibG9jayAqIHB0YXNrdGNiID0gcmVpbnRlcnByZXRfY2FzdDx2a3RyYWNlX3BhZ2VndWFyZF90YXNrX2NvbnRyb2xfYmxvY2sgKj4ocHRjYnBhcmEpOworICAgIHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfdW5pdF9wYXJhbWV0ZXJzICpwYXJhbWV0ZXJzOworICAgIGJvb2wgc3RvcF9sb29wID0gZmFsc2U7CisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICB2a3RyYWNlX3NlbV93YWl0KHB0YXNrdGNiLT5zZW1faWRfdGFza19zdGFydCk7CisgICAgICAgIHN0b3BfbG9vcCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoIXN0b3BfbG9vcCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyYW1ldGVycyA9IHZrdHJhY2VfcGFnZWd1YXJkX2dldF90YXNrX3VuaXRfcGFyYW1ldGVycygpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbHB0cikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFyYW1ldGVycy0+ZGVzdCwgcGFyYW1ldGVycy0+c3JjLCBwYXJhbWV0ZXJzLT5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9wX2xvb3AgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZrdHJhY2Vfc2VtX3Bvc3QocHRhc2t0Y2ItPnNlbV9pZF90YXNrX2VuZCk7CisgICAgfQorfQorCitib29sIHZrdHJhY2VfcGFnZWd1YXJkX2luaXRfbXVsdGlfdGhyZWFkc19tZW1jcHlfY3VzdG9tKHZrdHJhY2VfcGFnZWd1YXJkX3RocmVhZF9mdW5jdGlvbl9wdHIgcGZ1bmMpCit7CisgICAgYm9vbCBpbml0X211bHRpX3RocmVhZHNfbWVtY3B5X2N1c3RvbV9vayA9IGZhbHNlLCBzdWNjZXNzX3NlbV9zdGFydCA9IGZhbHNlLCBzdWNjZXNzX3NlbV9lbmQgPSBmYWxzZSwgc3VjY2Vzc190aHJlYWQgPSBmYWxzZTsKKyAgICB2a3RyYWNlX3BhZ2VndWFyZF90YXNrX2NvbnRyb2xfYmxvY2sgKnB0Y2IgPSB2a3RyYWNlX3BhZ2VndWFyZF9nZXRfdGFza19jb250cm9sX2Jsb2NrKCk7CisgICAgaW50IHRocmVhZF9udW1iZXIgPSB2a3RyYWNlX3BhZ2VndWFyZF9nZXRfY3B1X2NvcmVfY291bnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZF9udW1iZXI7IGkrKykKKyAgICB7CisgICAgICAgIHN1Y2Nlc3Nfc2VtX3N0YXJ0ID0gdmt0cmFjZV9zZW1fY3JlYXRlKCZwdGNiW2ldLnNlbV9pZF90YXNrX3N0YXJ0LDApOworICAgICAgICBzdWNjZXNzX3NlbV9lbmQgPSB2a3RyYWNlX3NlbV9jcmVhdGUoJnB0Y2JbaV0uc2VtX2lkX3Rhc2tfZW5kLDApOworICAgICAgICBwdGNiW2ldLmluZGV4ID0gaTsKKyAgICAgICAgc3VjY2Vzc190aHJlYWQgPSB2a3RyYWNlX3BhZ2VndWFyZF9jcmVhdGVfdGhyZWFkKCZwdGNiW2ldLnRocmVhZF9pZCwgKHZrdHJhY2VfcGFnZWd1YXJkX3RocmVhZF9mdW5jdGlvbl9wdHIpcGZ1bmMsICZwdGNiW2ldKTsKKyAgICAgICAgaWYgKHN1Y2Nlc3Nfc2VtX3N0YXJ0JiZzdWNjZXNzX3NlbV9lbmQgJiZzdWNjZXNzX3RocmVhZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdF9tdWx0aV90aHJlYWRzX21lbWNweV9jdXN0b21fb2sgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdF9tdWx0aV90aHJlYWRzX21lbWNweV9jdXN0b21fb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbml0X211bHRpX3RocmVhZHNfbWVtY3B5X2N1c3RvbV9vazsKK30KKworc3RhdGljIHZrdHJhY2Vfc2VtX2lkIGdsb2NhbF9zZW1faWQ7CitzdGF0aWMgYm9vbCBnbG9jYWxfc2VtX2lkX2NyZWF0ZV9zdWNjZXNzPSB2a3RyYWNlX3NlbV9jcmVhdGUoJmdsb2NhbF9zZW1faWQsIDEpOworCitpbnQgdmt0cmFjZV9wYWdlZ3VhcmRfcmVmX2NvdW50KGJvb2wgcmVsZWFzZSkKK3sKKyAgc3RhdGljIGludCByZWZfY291bnQgPSAwOworICBpbnQgY3Vycl9yZWZfY291bnQ7CisgIGlmICghcmVsZWFzZSkKKyAgeworICAgICAgdmt0cmFjZV9zZW1fd2FpdChnbG9jYWxfc2VtX2lkKTsKKyAgICAgIGN1cnJfcmVmX2NvdW50ID0gcmVmX2NvdW50OworICAgICAgKytyZWZfY291bnQ7CisgICAgICB2a3RyYWNlX3NlbV9wb3N0KGdsb2NhbF9zZW1faWQpOworICAgICAgcmV0dXJuIGN1cnJfcmVmX2NvdW50OworICB9CisgIGVsc2UKKyAgeworICAgICB2a3RyYWNlX3NlbV93YWl0KGdsb2NhbF9zZW1faWQpOworICAgICAtLXJlZl9jb3VudDsKKyAgICAgY3Vycl9yZWZfY291bnQgPSByZWZfY291bnQ7CisgICAgIHZrdHJhY2Vfc2VtX3Bvc3QoZ2xvY2FsX3NlbV9pZCk7CisgICAgIHJldHVybiBjdXJyX3JlZl9jb3VudDsKKyAgfQorfQorCitleHRlcm4gIkMiIEJPT0wgdmt0cmFjZV9wYWdlZ3VhcmRfaW5pdF9tdWx0aV90aHJlYWRzX21lbWNweSgpCit7CisgICAgaW50IHJlZm51bSA9IHZrdHJhY2VfcGFnZWd1YXJkX3JlZl9jb3VudChmYWxzZSk7CisgICAgQk9PTCBpbml0X211bHRpX3RocmVhZHNfbWVtY3B5X29rID0gVFJVRTsKKyAgICB2a3RyYWNlX3BhZ2VndWFyZF90aHJlYWRfZnVuY3Rpb25fcHRyIHBmdW5jID0gKHZrdHJhY2VfcGFnZWd1YXJkX3RocmVhZF9mdW5jdGlvbl9wdHIpdmt0cmFjZV9wYWdlZ3VhcmRfdGhyZWFkX2Z1bmN0aW9uOworICAgIGlmICghcmVmbnVtKQorICAgIHsKKyAgICAgICAgaW5pdF9tdWx0aV90aHJlYWRzX21lbWNweV9vayA9IHZrdHJhY2VfcGFnZWd1YXJkX2luaXRfbXVsdGlfdGhyZWFkc19tZW1jcHlfY3VzdG9tKHBmdW5jKTsKKyAgICB9CisgICAgcmV0dXJuIGluaXRfbXVsdGlfdGhyZWFkc19tZW1jcHlfb2s7Cit9CisKK3ZvaWQgdmt0cmFjZV9wYWdlZ3VhcmRfZGVsZXRlX3Rhc2tfY29udHJvbF9ibG9jaygpCit7CisgICAgZGVsZXRlW10gdmt0cmFjZV9wYWdlZ3VhcmRfZ2V0X3Rhc2tfY29udHJvbF9ibG9jaygpOworfQorCit2b2lkIHZrdHJhY2VfcGFnZWd1YXJkX2RlbGV0ZV90YXNrX3F1ZXVlKCkKK3sKKyAgICBkZWxldGUgdmt0cmFjZV9wYWdlZ3VhcmRfZ2V0X3Rhc2tfcXVldWUoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIHZrdHJhY2VfcGFnZWd1YXJkX2RvbmVfbXVsdGlfdGhyZWFkc19tZW1jcHkoKQoreworICAgIGludCByZWZudW0gPSB2a3RyYWNlX3BhZ2VndWFyZF9yZWZfY291bnQodHJ1ZSk7CisgICAgaWYgKCFyZWZudW0pCisgICAgeworICAgICAgICB2a3RyYWNlX3BhZ2VndWFyZF90YXNrX2NvbnRyb2xfYmxvY2sgKnRhc2tfY29udHJvbF9ibG9jayA9IHZrdHJhY2VfcGFnZWd1YXJkX2dldF90YXNrX2NvbnRyb2xfYmxvY2soKTsKKyAgICAgICAgaWYgKHRhc2tfY29udHJvbF9ibG9jayAhPSBudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdGhyZWFkX251bWJlciA9IHZrdHJhY2VfcGFnZWd1YXJkX2dldF9jcHVfY29yZV9jb3VudCgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZF9udW1iZXI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX3NlbV9kZWxldGUodGFza19jb250cm9sX2Jsb2NrW2ldLnNlbV9pZF90YXNrX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX3NlbV9kZWxldGUodGFza19jb250cm9sX2Jsb2NrW2ldLnNlbV9pZF90YXNrX2VuZCk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9wYWdlZ3VhcmRfZGVsZXRlX3RocmVhZCh0YXNrX2NvbnRyb2xfYmxvY2tbaV0udGhyZWFkX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZrdHJhY2VfcGFnZWd1YXJkX2RlbGV0ZV90YXNrX2NvbnRyb2xfYmxvY2soKTsKKyAgICAgICAgICAgIHZrdHJhY2Vfc2VtX2RlbGV0ZSh2a3RyYWNlX3BhZ2VndWFyZF9nZXRfdGFza19xdWV1ZSgpLT5zZW1faWRfYWNjZXNzKTsKKyAgICAgICAgICAgIHZrdHJhY2VfcGFnZWd1YXJkX2RlbGV0ZV90YXNrX3F1ZXVlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vbXVzdCBrZWVwIHVuaXRzIHVudGlsIHZrdHJhY2VfcGFnZWd1YXJkX211bHRpX3RocmVhZHNfbWVtY3B5X3J1biBmaW5pc2hlZAordm9pZCB2a3RyYWNlX3BhZ2VndWFyZF9zZXRfdGFza19xdWV1ZSh2a3RyYWNlX3BhZ2VndWFyZF90YXNrX3VuaXRfcGFyYW1ldGVycyAqdW5pdHMsIGludCB1bml0YW1vdW50KQoreworICAgIHZrdHJhY2Vfc2VtX3dhaXQoZ2xvY2FsX3NlbV9pZCk7CisgICAgdmt0cmFjZV9wYWdlZ3VhcmRfdGFza19xdWV1ZSAqcHF1ZXVlID0gdmt0cmFjZV9wYWdlZ3VhcmRfZ2V0X3Rhc2tfcXVldWUoKTsKKyAgICBwcXVldWUtPmFtb3VudCA9IHVuaXRhbW91bnQ7CisgICAgcHF1ZXVlLT5wdGFza191bml0cyA9IHVuaXRzOworICAgIHBxdWV1ZS0+aW5kZXggPSAwOworfQorCit2b2lkIHZrdHJhY2VfcGFnZWd1YXJkX2NsZWFyX3Rhc2tfcXVldWUoKQoreworICAgIHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfcXVldWUgKnBxdWV1ZSA9IHZrdHJhY2VfcGFnZWd1YXJkX2dldF90YXNrX3F1ZXVlKCk7CisgICAgcHF1ZXVlLT5hbW91bnQgPSAwOworICAgIHBxdWV1ZS0+cHRhc2tfdW5pdHMgPSBudWxscHRyOworICAgIHBxdWV1ZS0+aW5kZXggPSAwOworICAgIHZrdHJhY2Vfc2VtX3Bvc3QoZ2xvY2FsX3NlbV9pZCk7Cit9CisKKy8vVGhlIHN0ZXBzIGZvciB1c2luZyBtdWx0aXRocmVhZGluZyBjb3B5OgorLy88MT5pbml0X211bHRpX3RocmVhZHNfbWVtY3B5CisvLyAgIGl0IHNob3VsZCBiZSBwdXQgYXQgYmVnaW5uaW5nIG9mIHRoZSBhcHAKKworLy88Mj52a3RyYWNlX3BhZ2VndWFyZF9zZXRfdGFza19xdWV1ZQorLy88Mz52a3RyYWNlX3BhZ2VndWFyZF9tdWx0aV90aHJlYWRzX21lbWNweV9ydW4KKworLy88ND5kb25lX211bHRpX3RocmVhZHNfbWVtY3B5KCkKKy8vICAgaXQgc2hvdWxkIGJlIHB1dHRlZCBhdCBlbmQgb2YgdGhlIGFwcAordm9pZCB2a3RyYWNlX3BhZ2VndWFyZF9tdWx0aV90aHJlYWRzX21lbWNweV9ydW4oKQoreworICAgIHZrdHJhY2VfcGFnZWd1YXJkX3Rhc2tfY29udHJvbF9ibG9jayAqcHRjYiA9IHZrdHJhY2VfcGFnZWd1YXJkX2dldF90YXNrX2NvbnRyb2xfYmxvY2soKTsKKyAgICBpbnQgdGhyZWFkX251bWJlciA9IHZrdHJhY2VfcGFnZWd1YXJkX2dldF9jcHVfY29yZV9jb3VudCgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRfbnVtYmVyOyBpKyspCisgICAgeworICAgICAgICB2a3RyYWNlX3NlbV9wb3N0KHB0Y2JbaV0uc2VtX2lkX3Rhc2tfc3RhcnQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkX251bWJlcjsgaSsrKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9zZW1fd2FpdChwdGNiW2ldLnNlbV9pZF90YXNrX2VuZCk7CisgICAgfQorCit9CisKK3ZvaWQgdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5X211bHRpdGhyZWFkKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBQQUdFR1VBUkRfTUVNQ1BZX01VTFRJVEhSRUFEX1VOSVRfU0laRSA9IDB4MTAwMDA7CisgICAgaW50IHRocmVhZF9udW1iZXIgPSB2a3RyYWNlX3BhZ2VndWFyZF9nZXRfY3B1X2NvcmVfY291bnQoKTsKKworICAgIC8vdGFza3VuaXRhbW91bnQgc2hvdWxkIGJlID49dGhyZWFkX251bWJlciwgYnV0IHNob3VsZCBub3QgPj0gYSB2YWx1ZSB3aGljaCBtYWtlIHRoZSB1bml0IHRvbyBzbWFsbCBhbmQgdGhlIGNvc3Qgb2Ygc3dpdGNoIHRocmVhZCA+IG1lbWNweSB0aGF0IHVuaXQsIG9uIHRoZSBvdGhlciBzaWRlLCB0b28gc21hbGwgaXMgYWxzbyBub3QgYmVzdCBpZiBjb25zaWRlciBsYXN0IHRhc2sgd2lsbCBkZXRlcm1pbmUgdGhlIG1lbWNweSBzcGVlZC4KKyAgICBpbnQgdGFza3VuaXRhbW91bnQgPSBuIC8gUEFHRUdVQVJEX01FTUNQWV9NVUxUSVRIUkVBRF9VTklUX1NJWkU7CisgICAgaWYgKHRhc2t1bml0YW1vdW50IDwgdGhyZWFkX251bWJlcikKKyAgICB7CisgICAgICAgIHRhc2t1bml0YW1vdW50ID0gdGhyZWFkX251bWJlcjsKKyAgICB9CisgICAgc2l6ZV90IHNpemVfcGVyX3VuaXQgPSBuIC8gdGFza3VuaXRhbW91bnQsIHNpemVfbGVmdCA9IG4ldGFza3VuaXRhbW91bnQsIHNpemU7CisgICAgdmt0cmFjZV9wYWdlZ3VhcmRfdGFza191bml0X3BhcmFtZXRlcnMgKnVuaXRzID0gcmVpbnRlcnByZXRfY2FzdDx2a3RyYWNlX3BhZ2VndWFyZF90YXNrX3VuaXRfcGFyYW1ldGVycyAqPihuZXcgdWludDhfdFt0YXNrdW5pdGFtb3VudCpzaXplb2Yodmt0cmFjZV9wYWdlZ3VhcmRfdGFza191bml0X3BhcmFtZXRlcnMpXSk7CisgICAgYXNzZXJ0KHVuaXRzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhc2t1bml0YW1vdW50OyBpKyspCisgICAgeworICAgICAgICBzaXplID0gc2l6ZV9wZXJfdW5pdDsKKyAgICAgICAgaWYoKGkgKyAxKSA9PSB0YXNrdW5pdGFtb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZSArPSBzaXplX2xlZnQ7CisgICAgICAgIH0KKyAgICAgICAgdW5pdHNbaV0uc3JjID0gKHZvaWQgKikoKHVpbnQ4X3QgKilzcmMgKyBpKnNpemVfcGVyX3VuaXQpOworICAgICAgICB1bml0c1tpXS5kZXN0ID0gKHZvaWQgKikoKHVpbnQ4X3QgKilkZXN0ICsgaSpzaXplX3Blcl91bml0KTsKKyAgICAgICAgdW5pdHNbaV0uc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHZrdHJhY2VfcGFnZWd1YXJkX3NldF90YXNrX3F1ZXVlKHVuaXRzLCB0YXNrdW5pdGFtb3VudCk7CisgICAgdmt0cmFjZV9wYWdlZ3VhcmRfbXVsdGlfdGhyZWFkc19tZW1jcHlfcnVuKCk7CisgICAgZGVsZXRlW10gdW5pdHM7CisgICAgdmt0cmFjZV9wYWdlZ3VhcmRfY2xlYXJfdGFza19xdWV1ZSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgKnZrdHJhY2VfcGFnZWd1YXJkX21lbWNweSh2b2lkICogZGVzdGluYXRpb24sIGNvbnN0IHZvaWQgKiBzb3VyY2UsIHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnBSZXQgPSBOVUxMOworICAgIGlmIChzaXplIDwgU0laRV9MSU1JVF9UT19VU0VfT1BUSU1JWkFUSU9OKQorICAgIHsKKyAgICAgICAgcFJldCA9IG1lbWNweShkZXN0aW5hdGlvbiwgc291cmNlLCAoc2l6ZV90KXNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwUmV0ID0gZGVzdGluYXRpb247CisgICAgICAgIHZrdHJhY2VfcGFnZWd1YXJkX21lbWNweV9tdWx0aXRocmVhZChkZXN0aW5hdGlvbiwgc291cmNlLCAoc2l6ZV90KXNpemUpOworICAgIH0KKyAgICByZXR1cm4gcFJldDsKK30KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcGFnZWd1YXJkX21lbW9yeWNvcHkuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcGFnZWd1YXJkX21lbW9yeWNvcHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FjM2RkCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wYWdlZ3VhcmRfbWVtb3J5Y29weS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vdXNlIFBQTCBwYXJhbGxlbF9pbnZva2UgY2FsbChvbiB3aW5kb3dzIGZvciBub3csIGJ1dCBQUEwgYWxzbyBoYXMgYSBQUEx4IGZvciBMaW51eCksIG9yIHVzZSBjcm9zcy1wbGF0Zm9ybSBtZW1jcHkgbXVsdGl0aHJlYWQgd2hpY2ggZXhjbHVkZSBQUEwKKy8vI2RlZmluZSBQQUdFR1VBUkRfTUVNQ1BZX1VTRV9QUExfTElCCisjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIgorCisvL3BhZ2UgZ3VhcmQgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHdpbmRvd3Mgbm93LiBidXQgbW9zdCBzb3VyY2UgY29kZSBvZiBwYWdlIGd1YXJkIHRlcmdldCBjcm9zcy1wbGF0Zm9ybSBleGNlcHQgcGFnZWd1YXJkIGhhbmRsZXIgYW5kIGl0cyBzZXQvcmVzZXQvY2xlYXIgbWV0aG9kLgorLy9zbywgb25jZSB3ZSBoYXZlIG1vcmUgcGxhdGZvcm1zIHRvIHByb3ZpZGUgcGFnZWd1YXJkIGhhbmRsZXIoaW5jbHVkZSB3ZSBpbXBsZW1lbnQgaXQpLCB0aGUgY29uZGl0aW9uIGZvciAjZGVmaW5lIFVTRV9QQUdFR1VBUkRfU1BFRURVUCBjYW4gYmUgY2hhbmdlZCB0byBlbmFibGUgcGFnZWd1YXJkLgorCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAjZGVmaW5lIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgICNpZiBkZWZpbmVkKFBBR0VHVUFSRF9NRU1DUFlfVVNFX1BQTF9MSUIpCisgICAgICAgICNpbmNsdWRlIDxwcGwuaD4KKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGNvbmN1cnJlbmN5OworICAgICNlbmRpZgorI2Vsc2UKKyAgICAjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisgICAgI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IF9fUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbworeworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgdWludDMyX3QgcmVzZXJ2ZTA7CisgICAgdWludDMyX3QgcmVzZXJ2ZTE7Cit9IFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8sICpwUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbzsKKworI2lmIGRlZmluZWQoV0lOMzIpCit0eXBlZGVmIEhBTkRMRSB2a3RyYWNlX3BhZ2VndWFyZF90aHJlYWRfaWQ7Cit0eXBlZGVmIEhBTkRMRSB2a3RyYWNlX3NlbV9pZDsKKyNlbHNlCit0eXBlZGVmIHB0aHJlYWRfdCB2a3RyYWNlX3BhZ2VndWFyZF90aHJlYWRfaWQ7Cit0eXBlZGVmIHNlbV90KiB2a3RyYWNlX3NlbV9pZDsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2Jvb2wgdmt0cmFjZV9zZW1fY3JlYXRlKHZrdHJhY2Vfc2VtX2lkICpzZW1faWQsIHVpbnQzMl90IGluaXR2YWx1ZSk7Cit2b2lkIHZrdHJhY2Vfc2VtX2RlbGV0ZSh2a3RyYWNlX3NlbV9pZCBzaWQpOwordm9pZCB2a3RyYWNlX3NlbV93YWl0KHZrdHJhY2Vfc2VtX2lkIHNpZCk7Cit2b2lkIHZrdHJhY2Vfc2VtX3Bvc3Qodmt0cmFjZV9zZW1faWQgc2lkKTsKK3ZvaWQgdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5X211bHRpdGhyZWFkKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pOworZXh0ZXJuICJDIiB2b2lkICp2a3RyYWNlX3BhZ2VndWFyZF9tZW1jcHkodm9pZCAqIGRlc3RpbmF0aW9uLCBjb25zdCB2b2lkICogc291cmNlLCBzaXplX3Qgc2l6ZSk7CisjZWxzZQordm9pZCAqdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5KHZvaWQgKiBkZXN0aW5hdGlvbiwgY29uc3Qgdm9pZCAqIHNvdXJjZSwgc2l6ZV90IHNpemUpOworI2VuZGlmCisKKworCisjZGVmaW5lIFBBR0VHVUFSRF9TUEVDSUFMX0ZPUk1BVF9QQUNLRVRfRk9SX1ZLRkxVU0hNQVBQRURNRU1PUllSQU5HRVMgMFgwMDAwMDAwMQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wbGF0Zm9ybS5jIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjkxNTQKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3BsYXRmb3JtLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ2a3RyYWNlX3BsYXRmb3JtLmgiCisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTEFURk9STV9PU1gpCisjaW5jbHVkZSA8bGlicHJvYy5oPgorI2VuZGlmCisKK3ZrdHJhY2VfcHJvY2Vzc19pZCB2a3RyYWNlX2dldF9waWQoKQoreworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIHJldHVybiBnZXRwaWQoKTsKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisgICAgcmV0dXJuIEdldEN1cnJlbnRQcm9jZXNzSWQoKTsKKyNlbmRpZgorfQorCitjaGFyKiB2a3RyYWNlX3BsYXRmb3JtX2dldF9jdXJyZW50X2V4ZWN1dGFibGVfZGlyZWN0b3J5KCkKK3sKKyAgICBjaGFyKiBleGVQYXRoID0gKGNoYXIqKXZrdHJhY2VfbWFsbG9jKF9NQVhfUEFUSCk7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBEV09SRCBzID0gR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgZXhlUGF0aCwgTUFYX1BBVEgpOworI2VsaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkKKyAgICBzc2l6ZV90IHMgPSByZWFkbGluaygiL3Byb2Mvc2VsZi9leGUiLCBleGVQYXRoLCBfTUFYX1BBVEgpOworICAgIGlmIChzID49IDApCisgICAgeworICAgICAgICBleGVQYXRoW3NdID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXhlUGF0aFswXSA9ICdcMCc7CisgICAgfQorI2VsaWYgZGVmaW5lZChQTEFURk9STV9PU1gpCisgICAgc3NpemVfdCBzID0gcHJvY19waWRwYXRoKGdldHBpZCgpLCBleGVQYXRoLCBfTUFYX1BBVEgpOworICAgIGlmIChzID49IDApCisgICAgeworICAgICAgICBleGVQYXRoW3NdID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXhlUGF0aFswXSA9ICdcMCc7CisgICAgfQorI2VuZGlmCisKKyAgICB3aGlsZSAocyA+IDApCisgICAgeworICAgICAgICBpZiAoZXhlUGF0aFtzXSA9PSAnLycgfHwgZXhlUGF0aFtzXSA9PSAnXFwnKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOVUxMIHRoaXMgbG9jYXRpb24gYW5kIGJyZWFrIHNvIHRoYXQgdGhlIHNob3J0ZW5lZCBzdHJpbmcgY2FuIGJlIHJldHVybmVkLgorICAgICAgICAgICAgZXhlUGF0aFtzXSA9ICdcMCc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC0tczsKKyAgICB9CisKKyAgICBpZiAocyA8PSAwKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCEiVW5leHBlY3RlZCBwYXRoIHJldHVybmVkIGluIHZrdHJhY2VfcGxhdGZvcm1fZ2V0X2N1cnJlbnRfZXhlY3V0YWJsZV9kaXJlY3RvcnkiKTsKKyAgICAgICAgdmt0cmFjZV9mcmVlKGV4ZVBhdGgpOworICAgICAgICBleGVQYXRoID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZXhlUGF0aDsKK30KKworQk9PTCB2a3RyYWNlX2lzX2xvYWRlZF9pbnRvX3ZrdHJhY2UoKQoreworICAgIGNoYXIgZXhlUGF0aFtfTUFYX1BBVEhdOworCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBjaGFyKiBzdWJzdHIgPSAoKHNpemVvZih2b2lkKikgPT0gNCk/ICJ2a3RyYWNlMzIuZXhlIiA6ICJ2a3RyYWNlLmV4ZSIpOworICAgIEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGV4ZVBhdGgsIE1BWF9QQVRIKTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisgICAgY2hhciogc3Vic3RyID0gKChzaXplb2Yodm9pZCopID09IDQpPyAidmt0cmFjZTMyIiA6ICJ2a3RyYWNlIik7CisgICAgc3NpemVfdCBzID0gcmVhZGxpbmsoIi9wcm9jL3NlbGYvZXhlIiwgZXhlUGF0aCwgX01BWF9QQVRIKTsKKyAgICBpZiAocyA+PSAwKQorICAgIHsKKyAgICAgICAgZXhlUGF0aFtzXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV4ZVBhdGhbMF0gPSAnXDAnOworICAgIH0KKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIGNoYXIqIHN1YnN0ciA9ICgoc2l6ZW9mKHZvaWQqKSA9PSA0KT8gInZrdHJhY2UzMiIgOiAidmt0cmFjZSIpOworICAgIHNzaXplX3QgcyA9IHByb2NfcGlkcGF0aChnZXRwaWQoKSwgZXhlUGF0aCwgX01BWF9QQVRIKTsKKyAgICBpZiAocyA+PSAwKQorICAgIHsKKyAgICAgICAgZXhlUGF0aFtzXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV4ZVBhdGhbMF0gPSAnXDAnOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAoc3Ryc3RyKGV4ZVBhdGgsIHN1YnN0cikgIT0gTlVMTCk7Cit9CisKK0JPT0wgdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbmV4dF9saWJfc3ltKHZvaWQgKiAqcHBGdW5jLCBjb25zdCBjaGFyICogbmFtZSkKK3sKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICBpZiAoKCpwcEZ1bmMgPSBkbHN5bShSVExEX05FWFQsIG5hbWUpKSA9PSBOVUxMKSB7CisgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJkbHN5bTogZmFpbGVkIHRvIGZpbmQgc3ltYm9sICVzICVzIiwgbmFtZSwgZGxlcnJvcigpKTsKKyAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIHZrdHJhY2VfTG9nRXJyb3IoInVuaW1wbGVtZW50ZWQiKTsKKyAgICBhc3NlcnQoMCk7CisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisgICByZXR1cm4gVFJVRTsKK30KKwordmt0cmFjZV90aHJlYWRfaWQgdmt0cmFjZV9wbGF0Zm9ybV9nZXRfdGhyZWFkX2lkKCkKK3sKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICAvL3JldHVybiAodmt0cmFjZV90aHJlYWRfaWQpc3lzY2FsbChTWVNfZ2V0dGlkKTsKKyAgICByZXR1cm4gKHZrdHJhY2VfdGhyZWFkX2lkKXB0aHJlYWRfc2VsZigpOworI2VsaWYgZGVmaW5lZChXSU4zMikKKyAgICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7CisjZW5kaWYKK30KKworY2hhciAqdmt0cmFjZV9nZXRfZ2xvYmFsX3Zhcihjb25zdCBjaGFyICpuYW1lKQoreworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIHJldHVybiBnZXRlbnYobmFtZSk7CisjZWxzZQorICAgIC8vIFRPRE86IGFkZCBjb2RlIGZvciByZWFkaW5nIGZyb20gV2luZG93cyByZWdpc3RyeQorICAgIC8vIEZvciBub3cgd2UganVzdCByZXR1cm4gdGhlIHJlc3VsdCBmcm9tIGdldGVudgorICAgIHJldHVybiBnZXRlbnYobmFtZSk7CisjZW5kaWYKK30KKwordm9pZCB2a3RyYWNlX3NldF9nbG9iYWxfdmFyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICBzZXRlbnYobmFtZSwgdmFsLCAxKTsKKyNlbHNlCisgICAgLy8gVE9ETyBhZGQgY29kZSBmb3Igd3JpdGluZyB0byBXaW5kb3dzIHJlZ2lzdHJ5CisgICAgLy8gRm9yIG5vdyB3ZSBqdXN0IGRvIF9wdXRlbnZfcworICAgIF9wdXRlbnZfcyhuYW1lLCB2YWwpOworI2VuZGlmCit9CisKK3NpemVfdCB2a3RyYWNlX3BsYXRmb3JtX3JhbmRfcyh1aW50MzJfdCogb3V0X2FycmF5LCBzaXplX3Qgb3V0X2FycmF5X2xlbmd0aCkKK3sKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICBzdGF0aWMgX190aHJlYWQgdW5zaWduZWQgaW50IHNfc2VlZCA9IDA7CisgICAgc2l6ZV90IGkgPSAwOworCisgICAgaWYgKHNfc2VlZCA9PSAwKQorICAgIHsKKyAgICAgICAgLy8gVHJ5IHRvIHNlZWQgcmFuZF9yKCkgd2l0aCAvZGV2L3VyYW5kb20uCisgICAgICAgIHNpemVfdCBuYnl0ZXMgPSAwOworICAgICAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgICAgIGlmIChmZCAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmJ5dGVzID0gcmVhZChmZCwgJnNfc2VlZCwgc2l6ZW9mKHNfc2VlZCkpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhhdCBkaWRuJ3Qgd29yaywgZmFsbGJhY2sgdG8gdGltZSBhbmQgdGhyZWFkIGlkLgorICAgICAgICBpZiAobmJ5dGVzICE9IHNpemVvZihzX3NlZWQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lOworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0aW1lLCBOVUxMKTsKKyAgICAgICAgICAgIHNfc2VlZCA9IHZrdHJhY2VfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpIF4gKCh0aW1lLnR2X3NlYyAqIDEwMDApICsgKHRpbWUudHZfdXNlYyAvIDEwMDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBvdXRfYXJyYXlfbGVuZ3RoOyArK2kpCisgICAgeworICAgICAgICBvdXRfYXJyYXlbaV0gPSByYW5kX3IoJnNfc2VlZCk7CisgICAgfQorCisgICAgcmV0dXJuIG91dF9hcnJheV9sZW5ndGg7CisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIC8vVktUUkFDRV9BU1NVTUUoc2l6ZW9mKHVpbnQzMl90KSA9PSBzaXplb2YodW5zaWduZWQgaW50KSk7CisKKyAgICBzaXplX3QgcmV0X3ZhbHVlcyA9IDA7CisgICAgZm9yIChyZXRfdmFsdWVzID0gMDsgcmV0X3ZhbHVlcyA8IG91dF9hcnJheV9sZW5ndGg7ICsrcmV0X3ZhbHVlcykKKyAgICB7CisgICAgICAgIGlmIChGQUlMRUQocmFuZF9zKCZvdXRfYXJyYXlbcmV0X3ZhbHVlc10pKSkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsdWVzOworICAgIH0KKworICAgIHJldHVybiByZXRfdmFsdWVzOworI2VuZGlmCit9CisKK3ZvaWQgKiB2a3RyYWNlX3BsYXRmb3JtX29wZW5fbGlicmFyeShjb25zdCBjaGFyKiBsaWJQYXRoKQoreworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgcmV0dXJuIExvYWRMaWJyYXJ5KGxpYlBhdGgpOworI2VsaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgfHwgZGVmaW5lZChQTEFURk9STV9PU1gpCisgICAgcmV0dXJuIGRsb3BlbihsaWJQYXRoLCBSVExEX0xBWlkpOworI2VuZGlmCit9CisKK3ZvaWQgKiB2a3RyYWNlX3BsYXRmb3JtX2dldF9saWJyYXJ5X2VudHJ5cG9pbnQodm9pZCAqIGxpYkhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICAvLyBHZXQgZnVuYyBwdHIgdG8gbGlicmFyeSBlbnRyeXBvaW50LiBXZSBkb24ndCBsb2cgYW4gZXJyb3IgaWYKKyAgICAvLyB3ZSBkb24ndCBmaW5kIHRoZSBlbnRyeXBvaW50LCBiZWNhdXNlIGNyb3NzLXBsYXRmb3JtIHN1cHBvcnQKKyAgICAvLyBjYXVzZXMgdmtyZXBsYXkgdG8gcXVlcnkgdGhlIGFkZHJlc3Mgb2YgYWxsIGFwaSBlbnRyeXBvaW50cywKKyAgICAvLyBldmVuIHRoZSB3c2ktc3BlY2lmaWMgb25lcy4KKyNpZmRlZiBXSU4zMgorICAgIEZBUlBST0MgcHJvYyA9IEdldFByb2NBZGRyZXNzKChITU9EVUxFKWxpYkhhbmRsZSwgbmFtZSk7CisjZWxzZQorICAgIHZvaWQgKiBwcm9jID0gZGxzeW0obGliSGFuZGxlLCBuYW1lKTsKKyNlbmRpZgorICAgIHJldHVybiBwcm9jOworfQorCit2b2lkIHZrdHJhY2VfcGxhdGZvcm1fY2xvc2VfbGlicmFyeSh2b2lkKiBwTGlicmFyeSkKK3sKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIEZyZWVMaWJyYXJ5KChITU9EVUxFKXBMaWJyYXJ5KTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIGRsY2xvc2UocExpYnJhcnkpOworI2VuZGlmCit9CisKK3ZvaWQgdmt0cmFjZV9wbGF0Zm9ybV9mdWxsX3BhdGgoY29uc3QgY2hhciogcGFydFBhdGgsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIGNoYXIqIGJ1ZmZlcikKK3sKKyAgICBhc3NlcnQoYnVmZmVyICE9IE5VTEwpOworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgR2V0RnVsbFBhdGhOYW1lKHBhcnRQYXRoLCBieXRlcywgYnVmZmVyLCBOVUxMKTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIGNoYXIgKnB0ciA9IHJlYWxwYXRoKHBhcnRQYXRoLCBidWZmZXIpOworICAgICh2b2lkKSBwdHI7CisjZW5kaWYKK30KKworY2hhciogdmt0cmFjZV9wbGF0Zm9ybV9leHRyYWN0X3BhdGgoY2hhciogX3BhdGgpCit7CisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFjdHVhbGx5IHdvcmsgb24gY29uc3Qgc3RyaW5ncywgYnV0IHRoZSBDIGRlY2wgdmVyc2lvbiBleHBvc2VkIGJ5IHRoZSBtYWNybyAKKyAgICAvLyB0YWtlcyBub24tY29uc3QgVENIQVIqLgorICAgIGNoYXIqIHBEaXI7CisgICAgc2l6ZV90IG5ld0xlbjsKKyAgICBjaGFyKiBwYXRoU2VwQmFjayA9IHN0cnJjaHIoX3BhdGgsICdcXCcpOworICAgIGNoYXIqIHBhdGhTZXBGb3IgPSBzdHJyY2hyKF9wYXRoLCAnLycpOworICAgIGNoYXIqIGxhc3RQYXRoU2VwID0gcGF0aFNlcEJhY2sgPiBwYXRoU2VwRm9yID8gcGF0aFNlcEJhY2sgOiBwYXRoU2VwRm9yOworCisgICAgaWYgKGxhc3RQYXRoU2VwID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weSgiLlxcIik7CisgICAgfQorCisgICAgcERpciA9IFZLVFJBQ0VfTkVXX0FSUkFZKGNoYXIsIHN0cmxlbihfcGF0aCkgKyAxKTsKKyAgICBuZXdMZW4gPSBzdHJsZW4oX3BhdGgpIC0gc3RybGVuKGxhc3RQYXRoU2VwKTsKKyAgICBzdHJuY3B5KHBEaXIsIF9wYXRoLCBuZXdMZW4pOworICAgIHBEaXJbbmV3TGVuXSA9ICdcMCc7CisgICAgcmV0dXJuIHBEaXI7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgbGludXggcGF0aHMgYXJlIGJhc2VkIG9uOgorLy8gc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9iYXNlZGlyLXNwZWMvYmFzZWRpci1zcGVjLTAuOC5odG1sCitjaGFyKiB2a3RyYWNlX3BsYXRmb3JtX2dldF9zZXR0aW5nc19wYXRoKCkKK3sKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICBjaGFyKiB4ZGdDb25maWdIb21lID0gZ2V0ZW52KCJYREdfQ09ORklHX0hPTUUiKTsKKyAgICBpZiAoeGRnQ29uZmlnSG9tZSAhPSBOVUxMICYmIHN0cmxlbih4ZGdDb25maWdIb21lKSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gdmt0cmFjZV9jb3B5X2FuZF9hcHBlbmQoeGRnQ29uZmlnSG9tZSwgVktUUkFDRV9QQVRIX1NFUEFSQVRPUiwgInZrdHJhY2UiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZrdHJhY2VfY29weV9hbmRfYXBwZW5kKGdldGVudigiSE9NRSIpLCBWS1RSQUNFX1BBVEhfU0VQQVJBVE9SLCAiLmNvbmZpZy92a3RyYWNlIik7CisgICAgfQorI2VsaWYgZGVmaW5lZChXSU4zMikKKyAgICBEV09SRCByZXFMZW5ndGggPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCJsb2NhbGFwcGRhdGEiLCBOVUxMLCAwKTsKKyAgICBUQ0hBUiogbG9jYWxBcHBEYXRhID0gVktUUkFDRV9ORVdfQVJSQVkoVENIQVIsIHJlcUxlbmd0aCk7CisgICAgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgibG9jYWxhcHBkYXRhIiwgbG9jYWxBcHBEYXRhLCByZXFMZW5ndGgpOworICAgIFRDSEFSKiBsb2NhbFZrdHJhY2VEYXRhID0gdmt0cmFjZV9jb3B5X2FuZF9hcHBlbmQobG9jYWxBcHBEYXRhLCBWS1RSQUNFX1BBVEhfU0VQQVJBVE9SLCAidmt0cmFjZSIpOworICAgIFZLVFJBQ0VfREVMRVRFKGxvY2FsQXBwRGF0YSk7CisgICAgcmV0dXJuIGxvY2FsVmt0cmFjZURhdGE7CisjZWxzZQorICAgIGFzc2VydCghIm5vdCBpbXBsZW1lbnRlZCIpOworI2VuZGlmCit9CisKK2NoYXIqIHZrdHJhY2VfcGxhdGZvcm1fZ2V0X2RhdGFfcGF0aCgpCit7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgY2hhciogeGRnRGF0YUhvbWUgPSBnZXRlbnYoIlhER19EQVRBX0hPTUUiKTsKKyAgICBpZiAoeGRnRGF0YUhvbWUgIT0gTlVMTCAmJiBzdHJsZW4oeGRnRGF0YUhvbWUpID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiB2a3RyYWNlX2NvcHlfYW5kX2FwcGVuZCh4ZGdEYXRhSG9tZSwgVktUUkFDRV9QQVRIX1NFUEFSQVRPUiwgInZrdHJhY2UiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZrdHJhY2VfY29weV9hbmRfYXBwZW5kKGdldGVudigiSE9NRSIpLCBWS1RSQUNFX1BBVEhfU0VQQVJBVE9SLCAiLmxvY2FsL3NoYXJlL3ZrdHJhY2UiKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIERXT1JEIHJlcUxlbmd0aCA9IEdldEVudmlyb25tZW50VmFyaWFibGUoImxvY2FsYXBwZGF0YSIsIE5VTEwsIDApOworICAgIFRDSEFSKiBsb2NhbEFwcERhdGEgPSBWS1RSQUNFX05FV19BUlJBWShUQ0hBUiwgcmVxTGVuZ3RoKTsKKyAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCJsb2NhbGFwcGRhdGEiLCBsb2NhbEFwcERhdGEsIHJlcUxlbmd0aCk7CisgICAgVENIQVIqIGxvY2FsVmt0cmFjZURhdGEgPSB2a3RyYWNlX2NvcHlfYW5kX2FwcGVuZChsb2NhbEFwcERhdGEsIFZLVFJBQ0VfUEFUSF9TRVBBUkFUT1IsICJ2a3RyYWNlIik7CisgICAgVktUUkFDRV9ERUxFVEUobG9jYWxBcHBEYXRhKTsKKyAgICByZXR1cm4gbG9jYWxWa3RyYWNlRGF0YTsKKyNlbHNlCisgICAgYXNzZXJ0KCEibm90IGltcGxlbWVudGVkIik7CisjZW5kaWYKK30KKworCit2a3RyYWNlX3RocmVhZCB2a3RyYWNlX3BsYXRmb3JtX2NyZWF0ZV90aHJlYWQoVktUUkFDRV9USFJFQURfUk9VVElORV9SRVRVUk5fVFlQRSgqc3RhcnRfcm91dGluZSkoTFBWT0lEKSwgdm9pZCogYXJncykKK3sKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICB2a3RyYWNlX3RocmVhZCB0aHJlYWQgPSAwOworICAgIGlmKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsICh2b2lkICooKikgKHZvaWQqKSkgc3RhcnRfcm91dGluZSwgYXJncykgIT0gMCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdGhyZWFkIik7CisgICAgfQorICAgIHJldHVybiB0aHJlYWQ7CisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIHJldHVybiBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpc3RhcnRfcm91dGluZSwgYXJncywgMCwgTlVMTCk7CisjZW5kaWYKK30KKwordm9pZCB2a3RyYWNlX3BsYXRmb3JtX3Jlc3VtZV90aHJlYWQodmt0cmFjZV90aHJlYWQqIHBUaHJlYWQpCit7CisgICAgYXNzZXJ0KHBUaHJlYWQgIT0gTlVMTCk7CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkKKyAgICBhc3NlcnQoISJBZGQgY29kZSB0byByZXN1bWUgdGhyZWFkcyBvbiBMaW51eCIpOworI2VsaWYgZGVmaW5lZChQTEFURk9STV9PU1gpCisgICAgYXNzZXJ0KCEiQWRkIGNvZGUgdG8gcmVzdW1lIHRocmVhZHMgb24gbWFjT1MiKTsKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisgICAgaWYgKCpwVGhyZWFkICE9IE5VTEwpCisgICAgICAgIFJlc3VtZVRocmVhZCgqcFRocmVhZCk7CisjZW5kaWYKK30KKwordm9pZCB2a3RyYWNlX3BsYXRmb3JtX3N5bmNfd2FpdF9mb3JfdGhyZWFkKHZrdHJhY2VfdGhyZWFkKiBwVGhyZWFkKQoreworICAgIGFzc2VydChwVGhyZWFkICE9IE5VTEwpOworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIGlmIChwdGhyZWFkX2pvaW4oKnBUaHJlYWQsIE5VTEwpICE9IDApCisjZWxzZQorICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KCpwVGhyZWFkLCBJTkZJTklURSkgIT0gV0FJVF9PQkpFQ1RfMCkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRXJyb3Igb2NjdXJyZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhyZWFkIHRvIGVuZC4iKTsKKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZV9wbGF0Zm9ybV9kZWxldGVfdGhyZWFkKHZrdHJhY2VfdGhyZWFkKiBwVGhyZWFkKQoreworICAgIGFzc2VydChwVGhyZWFkICE9IE5VTEwpOworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIC8vIERvbid0IGhhdmUgdG8gZG8gYW55dGhpbmchCisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIENsb3NlSGFuZGxlKCpwVGhyZWFkKTsKKyAgICAqcFRocmVhZCA9IE5VTEw7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoV0lOMzIpCit2b2lkIHZrdHJhY2VfcGxhdGZvcm1fdGhyZWFkX29uY2Uodm9pZCAqY3RsLCBCT09MIChDQUxMQkFDSyAqIGZ1bmMpIChQSU5JVF9PTkNFLCBQVk9JRCwgUFZPSUQgKikpCit7CisgICAgYXNzZXJ0KGZ1bmMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGN0bCAhPSBOVUxMKTsKKyAgICBJbml0T25jZUV4ZWN1dGVPbmNlKChQSU5JVF9PTkNFKSBjdGwsIChQSU5JVF9PTkNFX0ZOKSBmdW5jLCBOVUxMLCBOVUxMKTsKK30KKyNlbHNlCit2b2lkIHZrdHJhY2VfcGxhdGZvcm1fdGhyZWFkX29uY2Uodm9pZCAqY3RsLCB2b2lkICgqIGZ1bmMpICh2b2lkKSkKK3sKKyAgICBhc3NlcnQoZnVuYyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoY3RsICE9IE5VTEwpOworICAgIHB0aHJlYWRfb25jZSgocHRocmVhZF9vbmNlX3QgKikgY3RsLCBmdW5jKTsKK30KKyNlbmRpZgorCit2b2lkIHZrdHJhY2VfY3JlYXRlX2NyaXRpY2FsX3NlY3Rpb24oVktUUkFDRV9DUklUSUNBTF9TRUNUSU9OKiBwQ3JpdGljYWxTZWN0aW9uKQoreworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihwQ3JpdGljYWxTZWN0aW9uKTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIHB0aHJlYWRfbXV0ZXhfaW5pdChwQ3JpdGljYWxTZWN0aW9uLCBOVUxMKTsKKyNlbmRpZgorfQorCit2b2lkIHZrdHJhY2VfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihWS1RSQUNFX0NSSVRJQ0FMX1NFQ1RJT04qIHBDcml0aWNhbFNlY3Rpb24pCit7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihwQ3JpdGljYWxTZWN0aW9uKTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhwQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorfQorCit2b2lkIHZrdHJhY2VfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihWS1RSQUNFX0NSSVRJQ0FMX1NFQ1RJT04qIHBDcml0aWNhbFNlY3Rpb24pCit7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihwQ3JpdGljYWxTZWN0aW9uKTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKHBDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCit9CisKK3ZvaWQgdmt0cmFjZV9kZWxldGVfY3JpdGljYWxfc2VjdGlvbihWS1RSQUNFX0NSSVRJQ0FMX1NFQ1RJT04qIHBDcml0aWNhbFNlY3Rpb24pCit7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24ocENyaXRpY2FsU2VjdGlvbik7CisjZWxpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3kocENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKK30KKworQk9PTCB2a3RyYWNlX3BsYXRmb3JtX3JlbW90ZV9sb2FkX2xpYnJhcnkodmt0cmFjZV9wcm9jZXNzX2hhbmRsZSBwUHJvY2Vzc0hhbmRsZSwgY29uc3QgY2hhciogZGxsUGF0aCwgdmt0cmFjZV90aHJlYWQqIHBUcmFjaW5nVGhyZWFkLCBjaGFyICoqIGxkUHJlbG9hZCkKK3sKKyAgICBpZiAoZGxsUGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVFJVRTsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIFNJWkVfVCBieXRlc1dyaXR0ZW4gPSAwOworICAgIHZvaWQqIHRhcmdldFByb2Nlc3NNZW0gPSBOVUxMOworICAgIHZrdHJhY2VfdGhyZWFkIHRocmVhZCA9IE5VTEw7CisgICAgc2l6ZV90IGJ5dGVDb3VudCA9IHNpemVvZihjaGFyKSAqIChzdHJsZW4oZGxsUGF0aCkgKyAxKTsKKyAgICB0YXJnZXRQcm9jZXNzTWVtID0gVmlydHVhbEFsbG9jRXgocFByb2Nlc3NIYW5kbGUsIDAsIGJ5dGVDb3VudCwgTUVNX0NPTU1JVCB8IE1FTV9SRVNFUlZFLCBQQUdFX1JFQURXUklURSk7CisgICAgaWYgKCF0YXJnZXRQcm9jZXNzTWVtKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIGluamVjdCBvdXJzZWx2ZXMgaW50byB0YXJnZXQgcHJvY2Vzcy0tY291bGRuJ3QgYWxsb2NhdGUgcHJvY2VzcyBtZW1vcnkuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIVdyaXRlUHJvY2Vzc01lbW9yeShwUHJvY2Vzc0hhbmRsZSwgdGFyZ2V0UHJvY2Vzc01lbSwgZGxsUGF0aCwgYnl0ZUNvdW50LCAmYnl0ZXNXcml0dGVuKSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBpbmplY3Qgb3Vyc2VsdmVzIGludG8gdGFyZ2V0IHByb2Nlc3MtLWNvdWxkbid0IHdyaXRlIGluY2VwdGlvbiBETEwgbmFtZSBpbnRvIHByb2Nlc3MuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICB0aHJlYWQgPSBDcmVhdGVSZW1vdGVUaHJlYWQocFByb2Nlc3NIYW5kbGUsIE5VTEwsIDAsIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKUxvYWRMaWJyYXJ5LCB0YXJnZXRQcm9jZXNzTWVtLCAwLCBOVUxMKTsKKyAgICBpZiAodGhyZWFkID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gaW5qZWN0IG91cnNlbHZlcyBpbnRvIHRhcmdldCBwcm9jZXNzLS1jb3VsZG4ndCBzcGF3biB0aHJlYWQuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgYXNzZXJ0KHBUcmFjaW5nVGhyZWFkICE9IE5VTEwpOworICAgICpwVHJhY2luZ1RocmVhZCA9IHRocmVhZDsKKworI2VsaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgfHwgZGVmaW5lZChQTEFURk9STV9PU1gpCisgICAgY2hhciAqdG1wOworICAgIGlmIChsZFByZWxvYWQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKCpsZFByZWxvYWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHRtcCA9IHZrdHJhY2VfY29weV9hbmRfYXBwZW5kKCJMRF9QUkVMT0FEIiwgIj0iLCBkbGxQYXRoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gdmt0cmFjZV9jb3B5X2FuZF9hcHBlbmQoKmxkUHJlbG9hZCwgIiAiLCBkbGxQYXRoKTsKKyAgICAgICAgVktUUkFDRV9ERUxFVEUoKHZvaWQqKSpsZFByZWxvYWQpOworICAgIH0KKyAgICAqbGRQcmVsb2FkID0gdG1wOworI2VuZGlmCisKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcGxhdGZvcm0uaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY5MGYxCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMTc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorI2RlZmluZSBfR05VX1NPVVJDRSAxCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAid2ludHlwZXMuaCIKKyNkZWZpbmUgQVBJRU5UUlkKKyNkZWZpbmUgU2xlZXAobikgdXNsZWVwKG4gKiAxMDAwKQorI2RlZmluZSBWS1RSQUNFX1dJTkFQSQordHlwZWRlZiBwdGhyZWFkX3Qgdmt0cmFjZV90aHJlYWQ7Cit0eXBlZGVmIHBpZF90IHZrdHJhY2VfcHJvY2Vzc19oYW5kbGU7Cit0eXBlZGVmIHBpZF90IHZrdHJhY2VfdGhyZWFkX2lkOwordHlwZWRlZiBwaWRfdCB2a3RyYWNlX3Byb2Nlc3NfaWQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBWS1RSQUNFX1RIUkVBRF9ST1VUSU5FX1JFVFVSTl9UWVBFOwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgVktUUkFDRV9DUklUSUNBTF9TRUNUSU9OOworI2RlZmluZSBWS1RSQUNFX05VTExfVEhSRUFEIDAKKyNkZWZpbmUgX01BWF9QQVRIIFBBVEhfTUFYCisjZGVmaW5lIFZLVFJBQ0VfUEFUSF9TRVBBUkFUT1IgIi8iCisjZGVmaW5lIFZLVFJBQ0VfTElTVF9TRVBBUkFUT1IgIjoiCisjZGVmaW5lIFZLVFJBQ0VfVEhSRUFEX0xPQ0FMIF9fdGhyZWFkCisKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisjZGVmaW5lIF9DUlRfUkFORF9TCisvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgbmVlZGVkIHRvIHVzZSB0aGUgQysrIHN0ZDo6bWluKCkgb3Igc3RkOjptYXgoKToKKyNkZWZpbmUgTk9NSU5NQVgKKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKyNkZWZpbmUgVktUUkFDRV9XSU5BUEkgV0lOQVBJCit0eXBlZGVmIEhBTkRMRSB2a3RyYWNlX3RocmVhZDsKK3R5cGVkZWYgSEFORExFIHZrdHJhY2VfcHJvY2Vzc19oYW5kbGU7Cit0eXBlZGVmIERXT1JEIHZrdHJhY2VfdGhyZWFkX2lkOwordHlwZWRlZiBEV09SRCB2a3RyYWNlX3Byb2Nlc3NfaWQ7Cit0eXBlZGVmIERXT1JEIFZLVFJBQ0VfVEhSRUFEX1JPVVRJTkVfUkVUVVJOX1RZUEU7Cit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gVktUUkFDRV9DUklUSUNBTF9TRUNUSU9OOworI2RlZmluZSBWS1RSQUNFX05VTExfVEhSRUFEIE5VTEwKKyNkZWZpbmUgVktUUkFDRV9QQVRIX1NFUEFSQVRPUiAiXFwiCisjZGVmaW5lIFZLVFJBQ0VfTElTVF9TRVBBUkFUT1IgIjsiCisjZGVmaW5lIFZLVFJBQ0VfVEhSRUFEX0xPQ0FMIF9fZGVjbHNwZWModGhyZWFkKQorI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBpbmxpbmUgX2lubGluZQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKworI2RlZmluZSBfR05VX1NPVVJDRSAxCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorLy8jaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJ3aW50eXBlcy5oIgorI2RlZmluZSBBUElFTlRSWQorI2RlZmluZSBTbGVlcChuKSB1c2xlZXAobiAqIDEwMDApCisjZGVmaW5lIFZLVFJBQ0VfV0lOQVBJCit0eXBlZGVmIHB0aHJlYWRfdCB2a3RyYWNlX3RocmVhZDsKK3R5cGVkZWYgcGlkX3Qgdmt0cmFjZV9wcm9jZXNzX2hhbmRsZTsKK3R5cGVkZWYgcGlkX3Qgdmt0cmFjZV90aHJlYWRfaWQ7Cit0eXBlZGVmIHBpZF90IHZrdHJhY2VfcHJvY2Vzc19pZDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFZLVFJBQ0VfVEhSRUFEX1JPVVRJTkVfUkVUVVJOX1RZUEU7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBWS1RSQUNFX0NSSVRJQ0FMX1NFQ1RJT047CisjZGVmaW5lIFZLVFJBQ0VfTlVMTF9USFJFQUQgMAorI2RlZmluZSBfTUFYX1BBVEggUEFUSF9NQVgKKyNkZWZpbmUgVktUUkFDRV9QQVRIX1NFUEFSQVRPUiAiLyIKKyNkZWZpbmUgVktUUkFDRV9MSVNUX1NFUEFSQVRPUiAiOiIKKyNkZWZpbmUgVktUUkFDRV9USFJFQURfTE9DQUwgX190aHJlYWQKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorI2luY2x1ZGUgInZrdHJhY2VfY29tbW9uLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorLy8gcmV0dXJuIHRoZSBwcm9jZXNzIElEIG9mIGN1cnJlbnQgcHJvY2Vzcwordmt0cmFjZV9wcm9jZXNzX2lkIHZrdHJhY2VfZ2V0X3BpZCgpOworCisvLyBHZXQgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIGV4ZWN1dGFibGUuCisvLyBUaGUgc3RyaW5nIHJldHVybmVkIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KK2NoYXIqIHZrdHJhY2VfcGxhdGZvcm1fZ2V0X2N1cnJlbnRfZXhlY3V0YWJsZV9kaXJlY3RvcnkoKTsKKworLy8gRGV0ZXJtaW5lIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgdmt0cmFjZVszMnw2NF0KK0JPT0wgdmt0cmFjZV9pc19sb2FkZWRfaW50b192a3RyYWNlKCk7CisKKy8vIEdldCB0aGUgdGhyZWFkIGlkIGZvciB0aGlzIHRocmVhZC4KK3ZrdHJhY2VfdGhyZWFkX2lkIHZrdHJhY2VfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpOworCisvLyBHZXQgdGhlIFJlZ2lzdHJ5IG9yIEVudmlyb25tZW50IHZhcmlhYmxlCitjaGFyICp2a3RyYWNlX2dldF9nbG9iYWxfdmFyKGNvbnN0IGNoYXIgKik7CisKKy8vIFNldCB0aGUgUmVnaXN0cnkgb3IgRW52aXJvbm1lbnQgdmFyaWFibGUKK3ZvaWQgdmt0cmFjZV9zZXRfZ2xvYmFsX3Zhcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKy8vIFByb3ZpZGVzIG91dF9hcnJheV9sZW5ndGggdWludDMycyBvZiByYW5kb20gZGF0YSBmcm9tIGEgc2VjdXJlIHNlcnZpY2UKK3NpemVfdCB2a3RyYWNlX3BsYXRmb3JtX3JhbmRfcyh1aW50MzJfdCogb3V0X2FycmF5LCBzaXplX3QgYnl0ZUNvdW50KTsKKworLy8gQWx0ZXJuYXRpdmVzIHRvIGxvYWRpbmcgbGlicmFyaWVzLCBnZXR0aW5nIHByb2MgYWRkcmVzc2VzLCBldGMKK3ZvaWQgKiB2a3RyYWNlX3BsYXRmb3JtX29wZW5fbGlicmFyeShjb25zdCBjaGFyKiBsaWJQYXRoKTsKK3ZvaWQgKiB2a3RyYWNlX3BsYXRmb3JtX2dldF9saWJyYXJ5X2VudHJ5cG9pbnQodm9pZCAqIGxpYkhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHZrdHJhY2VfcGxhdGZvcm1fY2xvc2VfbGlicmFyeSh2b2lkKiBwbGlicmFyeSk7CitCT09MIHZrdHJhY2VfcGxhdGZvcm1fZ2V0X25leHRfbGliX3N5bSh2b2lkICogKnBwRnVuYywgY29uc3QgY2hhciAqIG5hbWUpOworCisvLyBSZXR1cm5zIHRoZSBwYXJ0aWFsIHBhdGggYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIHByb3ZpZGUgYSBmdWxsIHBhdGguCisvLyBOb3RlIHRoZSByZXN1bHRpbmcgc3RyaW5nIG1heSBub3QgcG9pbnQgdG8gYW4gZXhpc3RpbmcgZmlsZS4KK3ZvaWQgdmt0cmFjZV9wbGF0Zm9ybV9mdWxsX3BhdGgoY29uc3QgY2hhciogcGFydFBhdGgsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIGNoYXIqIGJ1ZmZlcik7CisKKy8vIHJldHVybnMgYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGp1c3QgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YgdGhlIHN1cHBsaWVkIGZpbGUgcGF0aC4KK2NoYXIqIHZrdHJhY2VfcGxhdGZvcm1fZXh0cmFjdF9wYXRoKGNoYXIqIF9wYXRoKTsKKworLy8gcmV0dXJucyBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIGZvciBzZXR0aW5ncyAvIGNvbmZpZ3VyYXRpb24gZmlsZXMKK2NoYXIqIHZrdHJhY2VfcGxhdGZvcm1fZ2V0X3NldHRpbmdzX3BhdGgoKTsKKworLy8gcmV0dXJucyBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIGZvciBhbGwgZGF0YSBmaWxlcworY2hhciogdmt0cmFjZV9wbGF0Zm9ybV9nZXRfZGF0YV9wYXRoKCk7CisKK3ZrdHJhY2VfdGhyZWFkIHZrdHJhY2VfcGxhdGZvcm1fY3JlYXRlX3RocmVhZChWS1RSQUNFX1RIUkVBRF9ST1VUSU5FX1JFVFVSTl9UWVBFKCpzdGFydF9yb3V0aW5lKShMUFZPSUQpLCB2b2lkKiBhcmdzKTsKK3ZvaWQgdmt0cmFjZV9wbGF0Zm9ybV9yZXN1bWVfdGhyZWFkKHZrdHJhY2VfdGhyZWFkKiBwVGhyZWFkKTsKK3ZvaWQgdmt0cmFjZV9wbGF0Zm9ybV9zeW5jX3dhaXRfZm9yX3RocmVhZCh2a3RyYWNlX3RocmVhZCogcFRocmVhZCk7Cit2b2lkIHZrdHJhY2VfcGxhdGZvcm1fZGVsZXRlX3RocmVhZCh2a3RyYWNlX3RocmVhZCogcFRocmVhZCk7CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgfHwgZGVmaW5lZChQTEFURk9STV9PU1gpCit2b2lkIHZrdHJhY2VfcGxhdGZvcm1fdGhyZWFkX29uY2Uodm9pZCAqY3RsLCB2b2lkICgqIGZ1bmMpICh2b2lkKSk7CisjZWxpZiBkZWZpbmVkKFdJTjMyKQordm9pZCB2a3RyYWNlX3BsYXRmb3JtX3RocmVhZF9vbmNlKHZvaWQgKmN0bCwgQk9PTCAoQ0FMTEJBQ0sgKiBmdW5jKSAoX0lub3V0XyBQSU5JVF9PTkNFIGluaXRPbmNlLCBfSW5vdXRfb3B0XyBQVk9JRCBwYXJhbSwgX091dF9vcHRfIFBWT0lEICpscENvbnRleHQpKTsKKyNlbmRpZgorCit2b2lkIHZrdHJhY2VfY3JlYXRlX2NyaXRpY2FsX3NlY3Rpb24oVktUUkFDRV9DUklUSUNBTF9TRUNUSU9OKiBwQ3JpdGljYWxTZWN0aW9uKTsKK3ZvaWQgdmt0cmFjZV9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKFZLVFJBQ0VfQ1JJVElDQUxfU0VDVElPTiogcENyaXRpY2FsU2VjdGlvbik7Cit2b2lkIHZrdHJhY2VfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihWS1RSQUNFX0NSSVRJQ0FMX1NFQ1RJT04qIHBDcml0aWNhbFNlY3Rpb24pOwordm9pZCB2a3RyYWNlX2RlbGV0ZV9jcml0aWNhbF9zZWN0aW9uKFZLVFJBQ0VfQ1JJVElDQUxfU0VDVElPTiogcENyaXRpY2FsU2VjdGlvbik7CisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyNkZWZpbmUgVktUUkFDRV9MSUJSQVJZX05BTUUocHJvam5hbWUpIChzaXplb2Yodm9pZCopID09IDQpPyAibGliIiNwcm9qbmFtZSIzMi5zbyIgOiAibGliIiNwcm9qbmFtZSIuc28iCisjZW5kaWYKKyNpZiBkZWZpbmVkKFdJTjMyKQorI2RlZmluZSBWS1RSQUNFX0xJQlJBUllfTkFNRShwcm9qbmFtZSkgKHNpemVvZih2b2lkKikgPT0gNCk/ICNwcm9qbmFtZSIzMi5kbGwiIDogI3Byb2puYW1lIi5kbGwiCisjZW5kaWYKKworQk9PTCB2a3RyYWNlX3BsYXRmb3JtX3JlbW90ZV9sb2FkX2xpYnJhcnkodmt0cmFjZV9wcm9jZXNzX2hhbmRsZSBwUHJvY2Vzc0hhbmRsZSwgY29uc3QgY2hhciogZGxsUGF0aCwgdmt0cmFjZV90aHJlYWQqIHBUcmFjaW5nVGhyZWFkLCBjaGFyICoqbGRQcmVsb2FkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcHJvY2Vzcy5jIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxMDVjYgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcHJvY2Vzcy5jCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ2a3RyYWNlX3Byb2Nlc3MuaCIKKworCitCT09MIHZrdHJhY2VfcHJvY2Vzc19zcGF3bih2a3RyYWNlX3Byb2Nlc3NfaW5mbyogcEluZm8pCit7CisgICAgYXNzZXJ0KHBJbmZvICE9IE5VTEwpOworCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICB7CisgICAgdW5zaWduZWQgbG9uZyBwcm9jZXNzQ3JlYXRlRmxhZ3MgPSBDUkVBVEVfREVGQVVMVF9FUlJPUl9NT0RFIHwgQ1JFQVRFX1NVU1BFTkRFRDsKKyAgICBjaGFyIGZ1bGxFeGVQYXRoW19NQVhfUEFUSF07CisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzSW5mb3JtYXRpb247CisgICAgU1RBUlRVUElORk8gc2kgPSB7IDAgfTsKKyAgICBzaS5jYiA9IHNpemVvZihzaSk7CisKKyAgICBtZW1zZXQoJnByb2Nlc3NJbmZvcm1hdGlvbiwgMCwgc2l6ZW9mKFBST0NFU1NfSU5GT1JNQVRJT04pKTsKKyAgICBtZW1zZXQoZnVsbEV4ZVBhdGgsIDAsIHNpemVvZihjaGFyKSpfTUFYX1BBVEgpOworICAgIGZ1bGxFeGVQYXRoWzBdID0gMDsKKworICAgIFNldExhc3RFcnJvcigwKTsKKyAgICBTZWFyY2hQYXRoKE5VTEwsIHBJbmZvLT5leGVOYW1lLCAiLmV4ZSIsIEFSUkFZU0laRShmdWxsRXhlUGF0aCksIGZ1bGxFeGVQYXRoLCBOVUxMKTsKKworICAgIGlmICghQ3JlYXRlUHJvY2VzcyhmdWxsRXhlUGF0aCwgcEluZm8tPmZ1bGxQcm9jZXNzQ21kTGluZSwgTlVMTCwgTlVMTCwgVFJVRSwKKyAgICAgICAgcHJvY2Vzc0NyZWF0ZUZsYWdzLCBOVUxMLCBwSW5mby0+d29ya2luZ0RpcmVjdG9yeSwKKyAgICAgICAgJnNpLCAmcHJvY2Vzc0luZm9ybWF0aW9uKSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBpbmplY3Qgb3Vyc2VsdmVzIGludG8gdGFyZ2V0IHByb2Nlc3MtLWNvdWxkbid0IHNwYXduICclcycuIiwgZnVsbEV4ZVBhdGgpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcEluZm8tPmhQcm9jZXNzID0gcHJvY2Vzc0luZm9ybWF0aW9uLmhQcm9jZXNzOworICAgIHBJbmZvLT5oVGhyZWFkID0gcHJvY2Vzc0luZm9ybWF0aW9uLmhUaHJlYWQ7CisgICAgcEluZm8tPnByb2Nlc3NJZCA9IHByb2Nlc3NJbmZvcm1hdGlvbi5kd1Byb2Nlc3NJZDsKKyAgICAvLyBUT0RPIDogRG8gd2UgbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHByb2Nlc3NJbmZvcm1hdGlvbi5kd1RocmVhZElkPworICAgIH0KKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisgICAgcEluZm8tPnByb2Nlc3NJZCA9IGZvcmsoKTsKKyAgICBpZiAocEluZm8tPnByb2Nlc3NJZCA9PSAtMSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBzcGF3biBwcm9jZXNzLiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UgaWYgKHBJbmZvLT5wcm9jZXNzSWQgPT0gMCkKKyAgICB7CisgICAgICAgIC8vIEluc2lkZSBuZXcgcHJvY2VzcworICAgICAgICBjaGFyICphcmdzWzEyOF07CisgICAgICAgIGNvbnN0IGNoYXIgZGVsaW1bXSA9ICIgXHQiOworICAgICAgICB1bnNpZ25lZCBpbnQgaWR4OworCisgICAgICAgIC8vIENoYW5nZSBwcm9jZXNzIG5hbWUgc28gdGhlIHRoZSB0cmFjZXIgRExMcyB3aWxsIGJlaGF2ZSBhcyBleHBlY3RlZCB3aGVuIGxvYWRlZC4KKyAgICAgICAgLy8gTk9URTogTXVzdCBiZSAxNSBjaGFyYWN0ZXJzIG9yIGxlc3MuCisgICAgICAgIGNvbnN0IGNoYXIgKiB0bXBQcm9jTmFtZSA9ICJ2a3RyYWNlQ2hpbGRQcm9jZXNzIjsKKyAgICAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKXRtcFByb2NOYW1lLCAwLCAwLCAwKTsKKworICAgICAgICAvLyBDaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGNoZGlyKHBJbmZvLT53b3JraW5nRGlyZWN0b3J5KSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIHNldCB3b3JraW5nIGRpcmVjdG9yeS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGFyZ3NbMF0gPSBwSW5mby0+ZXhlTmFtZTsKKyAgICAgICAgYXJnc1sxMjddID0gTlVMTDsKKyAgICAgICAgaWR4ID0gMTsKKyAgICAgICAgYXJnc1tpZHhdID0gc3RydG9rKHBJbmZvLT5wcm9jZXNzQXJncywgZGVsaW0pOworICAgICAgICB3aGlsZSAoIGFyZ3NbaWR4XSAhPSBOVUxMICYmIGlkeCA8IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICBhcmdzW2lkeF0gPSBzdHJ0b2soTlVMTCwgZGVsaW0pOworICAgICAgICB9CisgICAgICAgIHZrdHJhY2VfTG9nRGVidWcoImV4ZWMgcHJvY2Vzcz0lcyBhcmdjPSV1XG4iLCBwSW5mby0+ZXhlTmFtZSwgaWR4KTsKKyNpZiAwICAvL3VuY29tZW50IHRvIHByaW50IG91dCBsaXN0IG9mIGVudiB2YXJzCisgICAgICAgIGNoYXIgKmVudiA9IGVudmlyb25bMF07CisgICAgICAgIGlkeCA9IDA7CisgICAgICAgIHdoaWxlIChlbnYgJiYgc3RybGVuKGVudikpIHsKKyAgICAgICAgICAgIGlmIChzdHJzdHIoZW52LCAiVksiKSB8fCBzdHJzdHIoZW52LCAiTEQiKSkKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0RlYnVnKCJlbnZbJWRdID0gJXMiLCBpZHgrKywgZW52KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgIGVudiA9IGVudmlyb25baWR4XTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChleGVjdihwSW5mby0+ZXhlTmFtZSwgYXJncykgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gc3Bhd24gcHJvY2Vzcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgdmt0cmFjZV9wcm9jZXNzX2luZm9fZGVsZXRlKHZrdHJhY2VfcHJvY2Vzc19pbmZvKiBwSW5mbykKK3sKKyAgICBpZiAocEluZm8tPnBDYXB0dXJlVGhyZWFkcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9wbGF0Zm9ybV9kZWxldGVfdGhyZWFkKCYocEluZm8tPnBDYXB0dXJlVGhyZWFkc1swXS5yZWNvcmRpbmdUaHJlYWQpKTsKKyAgICAgICAgVktUUkFDRV9ERUxFVEUocEluZm8tPnBDYXB0dXJlVGhyZWFkcyk7CisgICAgfQorCisjaWZkZWYgV0lOMzIKKyAgICB2a3RyYWNlX3BsYXRmb3JtX2RlbGV0ZV90aHJlYWQoJihwSW5mby0+d2F0Y2hkb2dUaHJlYWQpKTsKKyNlbmRpZgorCisgICAgVktUUkFDRV9ERUxFVEUocEluZm8tPnRyYWNlRmlsZW5hbWUpOworICAgIFZLVFJBQ0VfREVMRVRFKHBJbmZvLT53b3JraW5nRGlyZWN0b3J5KTsKKyAgICBWS1RSQUNFX0RFTEVURShwSW5mby0+cHJvY2Vzc0FyZ3MpOworICAgIFZLVFJBQ0VfREVMRVRFKHBJbmZvLT5mdWxsUHJvY2Vzc0NtZExpbmUpOworICAgIFZLVFJBQ0VfREVMRVRFKHBJbmZvLT5leGVOYW1lKTsKKworICAgIGlmIChwSW5mby0+cFRyYWNlRmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZmNsb3NlKHBJbmZvLT5wVHJhY2VGaWxlKTsKKyAgICB9CisgICAgdmt0cmFjZV9kZWxldGVfY3JpdGljYWxfc2VjdGlvbigmKHBJbmZvLT50cmFjZUZpbGVDcml0aWNhbFNlY3Rpb24pKTsKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcHJvY2Vzcy5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9wcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNTcxNQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfcHJvY2Vzcy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCisKK3R5cGVkZWYgc3RydWN0IHZrdHJhY2VfcHJvY2Vzc19jYXB0dXJlX3RyYWNlX3RocmVhZF9pbmZvIHZrdHJhY2VfcHJvY2Vzc19jYXB0dXJlX3RyYWNlX3RocmVhZF9pbmZvOworCit0eXBlZGVmIHN0cnVjdCB2a3RyYWNlX3Byb2Nlc3NfaW5mbworeworICAgIGNoYXIqIGV4ZU5hbWU7CisgICAgY2hhciogcHJvY2Vzc0FyZ3M7CisgICAgY2hhciogZnVsbFByb2Nlc3NDbWRMaW5lOworICAgIGNoYXIqIHdvcmtpbmdEaXJlY3Rvcnk7CisgICAgY2hhciogdHJhY2VGaWxlbmFtZTsKKyAgICBGSUxFKiBwVHJhY2VGaWxlOworCisgICAgLy8gdmt0cmFjZSdzIHRocmVhZCBpZAorICAgIHZrdHJhY2VfdGhyZWFkX2lkIHBhcmVudFRocmVhZElkOworCisgICAgVktUUkFDRV9DUklUSUNBTF9TRUNUSU9OIHRyYWNlRmlsZUNyaXRpY2FsU2VjdGlvbjsKKworICAgIHZvbGF0aWxlIEJPT0wgc2VydmVyUmVxdWVzdHNUZXJtaW5hdGlvbjsKKworICAgIHZrdHJhY2VfcHJvY2Vzc19jYXB0dXJlX3RyYWNlX3RocmVhZF9pbmZvKiBwQ2FwdHVyZVRocmVhZHM7CisKKyAgICAvLyBwcm9jZXNzIGlkLCBoYW5kbGUsIGFuZCBtYWluIHRocmVhZAorICAgIHZrdHJhY2VfcHJvY2Vzc19pZCBwcm9jZXNzSWQ7CisgICAgdmt0cmFjZV9wcm9jZXNzX2hhbmRsZSBoUHJvY2VzczsKKyAgICB2a3RyYWNlX3RocmVhZCBoVGhyZWFkOworICAgIHZrdHJhY2VfdGhyZWFkIHdhdGNoZG9nVGhyZWFkOworfSB2a3RyYWNlX3Byb2Nlc3NfaW5mbzsKKworCit0eXBlZGVmIHN0cnVjdCB2a3RyYWNlX3Byb2Nlc3NfdHJhY2VyX2RsbAoreworICAgIGNoYXIgKiBkbGxQYXRoOworICAgIEJPT0wgYkxvYWRlZDsKKyAgICBWS1RSQUNFX1RSQUNFUl9JRCB0aWQ7Cit9IHZrdHJhY2VfcHJvY2Vzc190cmFjZXJfZGxsOworCitzdHJ1Y3Qgdmt0cmFjZV9wcm9jZXNzX2NhcHR1cmVfdHJhY2VfdGhyZWFkX2luZm8KK3sKKyAgICB2a3RyYWNlX3RocmVhZCByZWNvcmRpbmdUaHJlYWQ7CisgICAgdmt0cmFjZV9wcm9jZXNzX2luZm8qIHBQcm9jZXNzSW5mbzsKKyAgICBWS1RSQUNFX1RSQUNFUl9JRCB0cmFjZXJJZDsKK307CisKK0JPT0wgdmt0cmFjZV9wcm9jZXNzX3NwYXduKHZrdHJhY2VfcHJvY2Vzc19pbmZvKiBwSW5mbyk7Cit2b2lkIHZrdHJhY2VfcHJvY2Vzc19pbmZvX2RlbGV0ZSh2a3RyYWNlX3Byb2Nlc3NfaW5mbyogcEluZm8pOwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9zZXR0aW5ncy5jIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9zZXR0aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NzZlMTcKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3NldHRpbmdzLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInZrdHJhY2Vfc2V0dGluZ3MuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIHZrdHJhY2VfU2V0dGluZ0luZm9fcHJpbnQoY29uc3Qgdmt0cmFjZV9TZXR0aW5nSW5mbyogcFNldHRpbmcpCit7CisgICAgaWYgKHBTZXR0aW5nLT5iUHJpbnRJbkhlbHApCisgICAgeworICAgICAgICBjaGFyICogcFN0clBhcmFtczsKKyAgICAgICAgY2hhciB0bXBTdHJbMTAwXTsKKyAgICAgICAgaWYgKHBTZXR0aW5nLT50eXBlID09IFZLVFJBQ0VfU0VUVElOR19TVFJJTkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdHJQYXJhbXMgPSAiPHN0cmluZz4iOworICAgICAgICB9IGVsc2UgaWYgKHBTZXR0aW5nLT50eXBlID09IFZLVFJBQ0VfU0VUVElOR19CT09MKSB7CisgICAgICAgICAgICBwU3RyUGFyYW1zID0gIjxCT09MPiI7CisgICAgICAgIH0gZWxzZSBpZiAocFNldHRpbmctPnR5cGUgPT0gVktUUkFDRV9TRVRUSU5HX1VJTlQpIHsKKyAgICAgICAgICAgIHBTdHJQYXJhbXMgPSAiPHVpbnQ+IjsKKyAgICAgICAgfSBlbHNlIGlmIChwU2V0dGluZy0+dHlwZSA9PSBWS1RSQUNFX1NFVFRJTkdfSU5UKSB7CisgICAgICAgICAgICBwU3RyUGFyYW1zID0gIjxpbnQ+IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTdHJQYXJhbXMgPSAiPCA/Pz8gPiI7CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgICBfc25wcmludGZfcyh0bXBTdHIsIHNpemVvZih0bXBTdHIpLCBfVFJVTkNBVEUsICItJXMsLS0lcyAlcyIsCisgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5nLT5wU2hvcnROYW1lLCBwU2V0dGluZy0+cExvbmdOYW1lLCBwU3RyUGFyYW1zKTsKKyMgZWxzZQorICAgICAgICBzbnByaW50Zih0bXBTdHIsIHNpemVvZih0bXBTdHIpLCAiLSVzLCAtLSVzICVzIiwKKyAgICAgICAgICAgICAgICAgcFNldHRpbmctPnBTaG9ydE5hbWUsIHBTZXR0aW5nLT5wTG9uZ05hbWUsIHBTdHJQYXJhbXMpOworI2VuZGlmCisgICAgICAgIHByaW50ZigiICAgICUtMzNzICAlc1xuIiwgdG1wU3RyLCBwU2V0dGluZy0+cERlc2MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIHZrdHJhY2VfU2V0dGluZ0dyb3VwX3ByaW50KGNvbnN0IHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU2V0dGluZ0dyb3VwKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIHByaW50ZigiJXMgYXZhaWxhYmxlIG9wdGlvbnM6XG4iLCBwU2V0dGluZ0dyb3VwLT5wTmFtZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNldHRpbmdHcm91cC0+bnVtU2V0dGluZ3M7IGkrKykKKyAgICB7CisgICAgICAgIHZrdHJhY2VfU2V0dGluZ0luZm9fcHJpbnQoJihwU2V0dGluZ0dyb3VwLT5wU2V0dGluZ3NbaV0pKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk9PTCB2a3RyYWNlX1NldHRpbmdJbmZvX3BhcnNlX3ZhbHVlKHZrdHJhY2VfU2V0dGluZ0luZm8qIHBTZXR0aW5nLCBjb25zdCBjaGFyKiBhcmcpCit7CisgICAgc3dpdGNoKHBTZXR0aW5nLT50eXBlKQorICAgIHsKKyAgICBjYXNlIFZLVFJBQ0VfU0VUVElOR19TVFJJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfZnJlZSgqcFNldHRpbmctPkRhdGEucHBDaGFyKTsKKyAgICAgICAgICAgICpwU2V0dGluZy0+RGF0YS5wcENoYXIgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX1NFVFRJTkdfQk9PTDoKKyAgICAgICAgeworICAgICAgICAgICAgQk9PTCBiVHJ1ZSA9IEZBTFNFOworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgICAgICAgICAgYlRydWUgPSAoc3RybmNhc2VjbXAoYXJnLCAidHJ1ZSIsIDQpID09IDApOworI2VsaWYgZGVmaW5lZChQTEFURk9STV9XSU5ET1dTKQorICAgICAgICAgICAgYlRydWUgPSAoX3N0cm5pY21wKGFyZywgInRydWUiLCA0KSA9PSAwKTsKKyNlbmRpZgorICAgICAgICAgICAgKnBTZXR0aW5nLT5EYXRhLnBCb29sID0gYlRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX1NFVFRJTkdfVUlOVDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNzY2FuZihhcmcsICIldSIsIHBTZXR0aW5nLT5EYXRhLnBVaW50KSAhPSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygiSW52YWxpZCB1bnNpZ25lZCBpbnQgc2V0dGluZzogJyVzJy4gUmVzZXR0aW5nIHRvIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC4iLCBhcmcpOworICAgICAgICAgICAgICAgICoocFNldHRpbmctPkRhdGEucFVpbnQpID0gKihwU2V0dGluZy0+RGVmYXVsdC5wVWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX1NFVFRJTkdfSU5UOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3NjYW5mKGFyZywgIiVkIiwgcFNldHRpbmctPkRhdGEucEludCkgIT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoIkludmFsaWQgaW50IHNldHRpbmc6ICclcycuIFJlc2V0dGluZyB0byBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICAqKHBTZXR0aW5nLT5EYXRhLnBJbnQpID0gKihwU2V0dGluZy0+RGVmYXVsdC5wSW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJVbmhhbmRsZWQgc2V0dGluZyB0eXBlICglZCkuIiwgcFNldHRpbmctPnR5cGUpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hhciogdmt0cmFjZV9TZXR0aW5nSW5mb19zdHJpbmdpZnlfdmFsdWUodmt0cmFjZV9TZXR0aW5nSW5mbyogcFNldHRpbmcpCit7CisgICAgc3dpdGNoKHBTZXR0aW5nLT50eXBlKQorICAgIHsKKyAgICBjYXNlIFZLVFJBQ0VfU0VUVElOR19TVFJJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KCpwU2V0dGluZy0+RGF0YS5wcENoYXIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9TRVRUSU5HX0JPT0w6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKnBTZXR0aW5nLT5EYXRhLnBCb29sID8gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weSgiVFJVRSIpIDogdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weSgiRkFMU0UiKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX1NFVFRJTkdfVUlOVDoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciB2YWx1ZVsxMDBdOworICAgICAgICAgICAgbWVtc2V0KHZhbHVlLCAwLCAxMDApOworICAgICAgICAgICAgc3ByaW50Zih2YWx1ZSwgIiV1IiwgKnBTZXR0aW5nLT5EYXRhLnBVaW50KTsKKyAgICAgICAgICAgIHJldHVybiB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfU0VUVElOR19JTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgdmFsdWVbMTAwXTsKKyAgICAgICAgICAgIG1lbXNldCh2YWx1ZSwgMCwgMTAwKTsKKyAgICAgICAgICAgIHNwcmludGYodmFsdWUsICIlZCIsICpwU2V0dGluZy0+RGF0YS5wSW50KTsKKyAgICAgICAgICAgIHJldHVybiB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoISJVbmhhbmRsZWQgc2V0dGluZyB0eXBlIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weSgiPHVuaGFuZGxlZCBzZXR0aW5nIHR5cGU+Iik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNlX1NldHRpbmdHcm91cF9yZXNldF9kZWZhdWx0cyh2a3RyYWNlX1NldHRpbmdHcm91cCogcFNldHRpbmdHcm91cCkKK3sKKyAgICBpZiAocFNldHRpbmdHcm91cCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHU7CisgICAgICAgIGZvciAodSA9IDA7IHUgPCBwU2V0dGluZ0dyb3VwLT5udW1TZXR0aW5nczsgdSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdJbmZvX3Jlc2V0X2RlZmF1bHQoJnBTZXR0aW5nR3JvdXAtPnBTZXR0aW5nc1t1XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNlX1NldHRpbmdJbmZvX3Jlc2V0X2RlZmF1bHQodmt0cmFjZV9TZXR0aW5nSW5mbyogcFNldHRpbmcpCit7CisgICAgYXNzZXJ0KHBTZXR0aW5nICE9IE5VTEwpOworICAgIHN3aXRjaChwU2V0dGluZy0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HOgorICAgICAgICBpZiAoKnBTZXR0aW5nLT5EYXRhLnBwQ2hhciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX2ZyZWUoKnBTZXR0aW5nLT5EYXRhLnBwQ2hhcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNldHRpbmctPkRlZmF1bHQucHBDaGFyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU2V0dGluZy0+RGF0YS5wcENoYXIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBTZXR0aW5nLT5EYXRhLnBwQ2hhciA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkoKnBTZXR0aW5nLT5EZWZhdWx0LnBwQ2hhcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX1NFVFRJTkdfQk9PTDoKKyAgICAgICAgKnBTZXR0aW5nLT5EYXRhLnBCb29sID0gKnBTZXR0aW5nLT5EZWZhdWx0LnBCb29sOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfU0VUVElOR19VSU5UOgorICAgICAgICAqcFNldHRpbmctPkRhdGEucFVpbnQgPSAqcFNldHRpbmctPkRlZmF1bHQucFVpbnQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9TRVRUSU5HX0lOVDoKKyAgICAgICAgKnBTZXR0aW5nLT5EYXRhLnBJbnQgPSAqcFNldHRpbmctPkRlZmF1bHQucEludDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCEiVW5oYW5kbGVkIFZLVFJBQ0VfU0VUVElOR19UWVBFIik7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIHZrdHJhY2VfU2V0dGluZ0dyb3VwX21lcmdlKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU3JjLCB2a3RyYWNlX1NldHRpbmdHcm91cCoqIHBwRGVzdEdyb3VwcywgdW5zaWduZWQgaW50KiBwTnVtRGVzdEdyb3VwcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZzsKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogcERlc3RHcm91cCA9IE5VTEw7CisgICAgYXNzZXJ0KHBTcmMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHBwRGVzdEdyb3VwcyAhPSBOVUxMKTsKKyAgICBhc3NlcnQocE51bURlc3RHcm91cHMgIT0gTlVMTCk7CisKKyAgICBmb3IgKGcgPSAwOyBnIDwgKnBOdW1EZXN0R3JvdXBzOyBnKyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKHBTcmMtPnBOYW1lLCAoKnBwRGVzdEdyb3VwcylbZ10ucE5hbWUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGdyb3VwIGV4aXN0cywgc3RvcmUgdGhlIHBvaW50ZXIKKyAgICAgICAgICAgIHBEZXN0R3JvdXAgPSAmKCpwcERlc3RHcm91cHMpW2ddOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocERlc3RHcm91cCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gbmVlZCB0byByZXBsaWNhdGUgcFNyYyBpbnRvIHBwRGVzdEdyb3VwcworICAgICAgICBwRGVzdEdyb3VwID0gdmt0cmFjZV9TZXR0aW5nR3JvdXBfQ3JlYXRlKHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkocFNyYy0+cE5hbWUpLCBwcERlc3RHcm91cHMsIHBOdW1EZXN0R3JvdXBzKTsKKyAgICAgICAgYXNzZXJ0KHBEZXN0R3JvdXAgIT0gTlVMTCk7CisgICAgfQorCisgICAgaWYgKHBEZXN0R3JvdXAgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIG5vdyBhZGQgYWxsIHRoZSBzZXR0aW5ncyEKKyAgICAgICAgdW5zaWduZWQgaW50IHNyY0luZGV4OworICAgICAgICBmb3IgKHNyY0luZGV4ID0gMDsgc3JjSW5kZXggPCBwU3JjLT5udW1TZXR0aW5nczsgc3JjSW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBwcmUtZXhpc3Rpbmcgc2V0dGluZyBpbiB0aGUgZGVzdCBncm91cAorICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3RJbmRleDsKKyAgICAgICAgICAgIEJPT0wgYkZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICBmb3IgKGRlc3RJbmRleCA9IDA7IGRlc3RJbmRleCA8IHBEZXN0R3JvdXAtPm51bVNldHRpbmdzOyBkZXN0SW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBEZXN0R3JvdXAtPnBTZXR0aW5nc1tkZXN0SW5kZXhdLnBMb25nTmFtZSwgcFNyYy0+cFNldHRpbmdzW3NyY0luZGV4XS5wTG9uZ05hbWUpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiRm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiRm91bmQgPT0gRkFMU0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfQWRkX0luZm8oJnBTcmMtPnBTZXR0aW5nc1tzcmNJbmRleF0sIHBEZXN0R3JvdXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgdmt0cmFjZV9TZXR0aW5nR3JvdXBfQWRkX0luZm8odmt0cmFjZV9TZXR0aW5nSW5mbyogcFNyY0luZm8sIHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwRGVzdEdyb3VwKQoreworICAgIGFzc2VydChwU3JjSW5mbyAhPSBOVUxMKTsKKyAgICBhc3NlcnQocERlc3RHcm91cCAhPSBOVUxMKTsKKyAgICBpZiAocERlc3RHcm91cCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgU2V0dGluZ0luZm8gdG8gc3RvcmUgdGhlIGNvcGllZCBpbmZvcm1hdGlvbgorICAgICAgICB2a3RyYWNlX1NldHRpbmdJbmZvIGluZm87CisgICAgICAgIHZrdHJhY2VfU2V0dGluZ0luZm8qIHBUbXA7CisgICAgICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHZrdHJhY2VfU2V0dGluZ0luZm8pKTsKKworICAgICAgICAvLyBjb3B5IG5lY2Vzc2FyeSBidWZmZXJzIHNvIHRoYXQgZGVsZXRpb24gd29ya3MgY29ycmVjdGx5CisgICAgICAgIGluZm8ucFNob3J0TmFtZSA9IHBTcmNJbmZvLT5wU2hvcnROYW1lOworICAgICAgICBpbmZvLnBMb25nTmFtZSA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkocFNyY0luZm8tPnBMb25nTmFtZSk7CisgICAgICAgIGluZm8udHlwZSA9IFZLVFJBQ0VfU0VUVElOR19TVFJJTkc7CisgICAgICAgIGluZm8uRGF0YS5wcENoYXIgPSB2a3RyYWNlX21hbGxvYyhzaXplb2YoY2hhcioqKSk7CisgICAgICAgICppbmZvLkRhdGEucHBDaGFyID0gdmt0cmFjZV9TZXR0aW5nSW5mb19zdHJpbmdpZnlfdmFsdWUocFNyY0luZm8pOworCisgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgY3VycmVudCBncm91cAorICAgICAgICBwVG1wID0gcERlc3RHcm91cC0+cFNldHRpbmdzOworICAgICAgICBwRGVzdEdyb3VwLT5udW1TZXR0aW5ncyArPSAxOworICAgICAgICBwRGVzdEdyb3VwLT5wU2V0dGluZ3MgPSBWS1RSQUNFX05FV19BUlJBWSh2a3RyYWNlX1NldHRpbmdJbmZvLCBwRGVzdEdyb3VwLT5udW1TZXR0aW5ncyk7CisgICAgICAgIGlmIChwRGVzdEdyb3VwLT5wU2V0dGluZ3MgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBpbmZvIGFycmF5CisgICAgICAgICAgICAvLyByZXN0b3JlIG9yaWdpbmFsCisgICAgICAgICAgICBwRGVzdEdyb3VwLT5udW1TZXR0aW5ncyAtPSAxOworICAgICAgICAgICAgcERlc3RHcm91cC0+cFNldHRpbmdzID0gcFRtcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwVG1wICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBEZXN0R3JvdXAtPnBTZXR0aW5ncywgcFRtcCwgcERlc3RHcm91cC0+bnVtU2V0dGluZ3MgKiBzaXplb2Yodmt0cmFjZV9TZXR0aW5nSW5mbykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwRGVzdEdyb3VwLT5wU2V0dGluZ3NbcERlc3RHcm91cC0+bnVtU2V0dGluZ3MgLSAxXSA9IGluZm87CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmt0cmFjZV9TZXR0aW5nR3JvdXAqIHZrdHJhY2VfU2V0dGluZ0dyb3VwX0NyZWF0ZShjb25zdCBjaGFyKiBwR3JvdXBOYW1lLCB2a3RyYWNlX1NldHRpbmdHcm91cCoqIHBwU2V0dGluZ0dyb3VwcywgdW5zaWduZWQgaW50KiBwTnVtU2V0dGluZ0dyb3VwcykKK3sKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogcE5ld0dyb3VwID0gTlVMTDsKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogcFRtcCA9ICpwcFNldHRpbmdHcm91cHM7CisgICAgdW5zaWduZWQgaW50IGxhc3RJbmRleCA9ICpwTnVtU2V0dGluZ0dyb3VwczsKKworICAgICgqcE51bVNldHRpbmdHcm91cHMpICs9IDE7CisKKyAgICAqcHBTZXR0aW5nR3JvdXBzID0gVktUUkFDRV9ORVdfQVJSQVkodmt0cmFjZV9TZXR0aW5nR3JvdXAsICpwTnVtU2V0dGluZ0dyb3Vwcyk7CisgICAgaWYgKCpwcFNldHRpbmdHcm91cHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIG91dCBvZiBtZW1vcnkhCisgICAgICAgIC8vIERvbid0IGNyZWF0ZSB0aGUgbmV3IGdyb3VwLCBhbmQgcmVzdG9yZSB0aGUgbGlzdCB0byBpdCdzIG9yaWdpbmFsIHN0YXRlCisgICAgICAgICgqcE51bVNldHRpbmdHcm91cHMpIC09IDE7CisgICAgICAgICpwcFNldHRpbmdHcm91cHMgPSBwVG1wOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBjb3B5IG9sZCBzZXR0aW5ncyB0byBuZXcgb25lcworICAgICAgICBtZW1jcHkoKnBwU2V0dGluZ0dyb3VwcywgcFRtcCwgbGFzdEluZGV4ICogc2l6ZW9mKHZrdHJhY2VfU2V0dGluZ0dyb3VwKSk7CisKKyAgICAgICAgLy8gY2xlYW4gdXAgb2xkIGFycmF5CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBUbXApOworCisgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IGdyb3VwCisgICAgICAgIG1lbXNldCgmKCpwcFNldHRpbmdHcm91cHMpW2xhc3RJbmRleF0sIDAsIHNpemVvZih2a3RyYWNlX1NldHRpbmdHcm91cCkpOworCisgICAgICAgIC8vIG5hbWUgdGhlIG5ldyBncm91cAorICAgICAgICBwTmV3R3JvdXAgPSAmKCpwcFNldHRpbmdHcm91cHMpW2xhc3RJbmRleF07CisgICAgICAgIHBOZXdHcm91cC0+cE5hbWUgPSBwR3JvdXBOYW1lOworICAgIH0KKworICAgIHJldHVybiBwTmV3R3JvdXA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNlX1NldHRpbmdHcm91cF91cGRhdGUodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTcmMsIHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwRGVzdEdyb3VwcywgdW5zaWduZWQgaW50IG51bURlc3RHcm91cHMpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBHcm91cDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRGVzdEdyb3VwczsgaSsrKQorICAgIHsKKyAgICAgICAgcEdyb3VwID0gJnBEZXN0R3JvdXBzW2ldOworICAgICAgICBpZiAoc3RyY21wKHBTcmMtPnBOYW1lLCBwR3JvdXAtPnBOYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9BcHBseV9PdmVycmlkZXMocEdyb3VwLCBwU3JjLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCB2a3RyYWNlX1NldHRpbmdHcm91cF9Mb2FkX2Zyb21fZmlsZShGSUxFKiBwRmlsZSwgdmt0cmFjZV9TZXR0aW5nR3JvdXAqKiBwcFNldHRpbmdHcm91cHMsIHVuc2lnbmVkIGludCogcE51bVNldHRpbmdHcm91cHMpCit7CisgICAgaW50IHJldFZhbCA9IDA7CisgICAgY2hhciogbGluZSA9IFZLVFJBQ0VfTkVXX0FSUkFZKGNoYXIsIDEwMjQpOworCisgICAgYXNzZXJ0KHBGaWxlICE9IE5VTEwpOworICAgIGFzc2VydChwcFNldHRpbmdHcm91cHMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHBOdW1TZXR0aW5nR3JvdXBzICE9IE5VTEwpOworICAgICpwTnVtU2V0dGluZ0dyb3VwcyA9IDA7CisKKyAgICBpZiAobGluZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiT3V0IG9mIG1lbW9yeSB3aGlsZSByZWFkaW5nIHNldHRpbmdzIGZpbGUuIik7CisgICAgICAgIHJldFZhbCA9IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogcEN1ckdyb3VwID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKGZlb2YocEZpbGUpID09IDAgJiYgZmVycm9yKHBGaWxlKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyKiBsaW5lU3RhcnQ7CisgICAgICAgICAgICBjaGFyKiBwT3BlbkJyYWNrZXQ7CisgICAgICAgICAgICBjaGFyKiBwQ2xvc2VCcmFja2V0OworICAgICAgICAgICAgbGluZSA9IGZnZXRzKGxpbmUsIDEwMjQsIHBGaWxlKTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIGxpbmUgZW5kcyB3aXRoIGEgbmV3bGluZSwgdGhlbiByZXBsYWNlIGl0IHdpdGggYSBOVUxMCisgICAgICAgICAgICBpZiAobGluZVtzdHJsZW4obGluZSktMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5lW3N0cmxlbihsaW5lKS0xXSA9ICdcMCc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlCisgICAgICAgICAgICBsaW5lU3RhcnQgPSBsaW5lOworICAgICAgICAgICAgd2hpbGUgKCpsaW5lU3RhcnQgPT0gJyAnKSB7ICsrbGluZVN0YXJ0OyB9CisKKyAgICAgICAgICAgIC8vIHNraXAgZW1wdHkgbGluZXMKKyAgICAgICAgICAgIGlmIChzdHJsZW4obGluZVN0YXJ0KSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0aGUgbGluZSBzdGFydHMgd2l0aCAiIyIgb3IgIi8vIiwgdGhlbiBjb25zaWRlciBpdCBhIGNvbW1lbnQgYW5kIGlnbm9yZSBpdC4KKyAgICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCAnd29yZCcgaXMgb25seSAiLS0gIiB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgaXMgZm9yIGFwcGxpY2F0aW9uIGFyZ3VtZW50cworICAgICAgICAgICAgLy8gZWxzZSBmaXJzdCAnd29yZCcgaW4gbGluZSBzaG91bGQgYmUgYSBsb25nIHNldHRpbmcgbmFtZSBhbmQgdGhlIHJlc3Qgb2YgbGluZSBpcyB2YWx1ZSBmb3Igc2V0dGluZworICAgICAgICAgICAgaWYgKGxpbmVTdGFydFswXSA9PSAnIycgfHwgKGxpbmVTdGFydFswXSA9PSAnLycgJiYgbGluZVN0YXJ0WzFdID09ICcvJykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaXRzIGEgY29tbWVudCwgY29udGludWUgdG8gbmV4dCBsb29wIGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwT3BlbkJyYWNrZXQgPSBzdHJjaHIobGluZVN0YXJ0LCAnWycpOworICAgICAgICAgICAgcENsb3NlQnJhY2tldCA9IHN0cmNocihsaW5lU3RhcnQsICddJyk7CisgICAgICAgICAgICBpZiAocE9wZW5CcmFja2V0ICE9IE5VTEwgJiYgcENsb3NlQnJhY2tldCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGEgZ3JvdXAgd2FzIGZvdW5kIQorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICAgICAgICAgIGNoYXIqIHBHcm91cE5hbWUgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5X24ocE9wZW5CcmFja2V0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHBDbG9zZUJyYWNrZXQgLSBwT3BlbkJyYWNrZXQgLSAxKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgZ3JvdXAKKyAgICAgICAgICAgICAgICBwQ3VyR3JvdXAgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqcE51bVNldHRpbmdHcm91cHM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoKCpwcFNldHRpbmdHcm91cHMpW2ldLnBOYW1lLCBwR3JvdXBOYW1lKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBncm91cCEKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJHcm91cCA9ICYoKnBwU2V0dGluZ0dyb3VwcylbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwQ3VyR3JvdXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZ3JvdyBvdXIgbGlzdCBvZiBncm91cHMhCisgICAgICAgICAgICAgICAgICAgIHBDdXJHcm91cCA9IHZrdHJhY2VfU2V0dGluZ0dyb3VwX0NyZWF0ZShwR3JvdXBOYW1lLCBwcFNldHRpbmdHcm91cHMsIHBOdW1TZXR0aW5nR3JvdXBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciogcFRva05hbWUgPSBzdHJ0b2sobGluZVN0YXJ0LCAiPSIpOworICAgICAgICAgICAgICAgIGNoYXIqIHBUb2tWYWx1ZSA9IHN0cnRvayhOVUxMLCAiPSIpOworICAgICAgICAgICAgICAgIGlmIChwVG9rTmFtZSAhPSBOVUxMICYmIHBUb2tWYWx1ZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQSBzZXR0aW5nIG5hbWUgYW5kIHZhbHVlIHdlcmUgZm91bmQhCisgICAgICAgICAgICAgICAgICAgIGNoYXIqIHBWYWx1ZVN0YXJ0ID0gcFRva1ZhbHVlOworICAgICAgICAgICAgICAgICAgICBjaGFyKiBwVG1wRW5kTmFtZSA9IHBUb2tOYW1lOworCisgICAgICAgICAgICAgICAgICAgIGFzc2VydChwQ3VyR3JvdXAgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQ3VyR3JvdXAgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgU2V0dGluZ0luZm8gdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nSW5mbyBpbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nSW5mbyogcFRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHZrdHJhY2VfU2V0dGluZ0luZm8pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlIGJ5IHR1cm5pbmcgaXQgaW50byBhIG51bGwgY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpwVG1wRW5kTmFtZSAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcFRtcEVuZE5hbWUgPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBUbXBFbmROYW1lID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcFRtcEVuZE5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnBMb25nTmFtZSA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkocFRva05hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby50eXBlID0gVktUUkFDRV9TRVRUSU5HX1NUUklORzsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKnBWYWx1ZVN0YXJ0ID09ICcgJykgeyArK3BWYWx1ZVN0YXJ0OyB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLkRhdGEucHBDaGFyID0gdmt0cmFjZV9tYWxsb2Moc2l6ZW9mKGNoYXIqKikpOworICAgICAgICAgICAgICAgICAgICAgICAgKmluZm8uRGF0YS5wcENoYXIgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KHBWYWx1ZVN0YXJ0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBjdXJyZW50IGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEN1ckdyb3VwLT5wU2V0dGluZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyR3JvdXAtPm51bVNldHRpbmdzICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyR3JvdXAtPnBTZXR0aW5ncyA9IFZLVFJBQ0VfTkVXX0FSUkFZKHZrdHJhY2VfU2V0dGluZ0luZm8sIHBDdXJHcm91cC0+bnVtU2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJHcm91cC0+cFNldHRpbmdzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBpbmZvIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBvcmlnaW5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJHcm91cC0+bnVtU2V0dGluZ3MgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyR3JvdXAtPnBTZXR0aW5ncyA9IHBUbXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUbXAgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwQ3VyR3JvdXAtPnBTZXR0aW5ncywgcFRtcCwgcEN1ckdyb3VwLT5udW1TZXR0aW5ncyAqIHNpemVvZih2a3RyYWNlX1NldHRpbmdJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckdyb3VwLT5wU2V0dGluZ3NbcEN1ckdyb3VwLT5udW1TZXR0aW5ncyAtIDFdID0gaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoIkNvdWxkIG5vdCBwYXJzZSBhIGxpbmUgaW4gc2V0dGluZ3MgZmlsZTogJyVzJy4iLCBsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWS1RSQUNFX0RFTEVURShsaW5lKTsKKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNlX1NldHRpbmdHcm91cF9EZWxldGVfTG9hZGVkKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiogcHBTZXR0aW5nR3JvdXBzLCB1bnNpZ25lZCBpbnQqIHBOdW1TZXR0aW5nR3JvdXBzKQoreworICAgIHVuc2lnbmVkIGludCBnOworICAgIHVuc2lnbmVkIGludCBzOworICAgIGFzc2VydChwcFNldHRpbmdHcm91cHMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KCpwcFNldHRpbmdHcm91cHMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHBOdW1TZXR0aW5nR3JvdXBzICE9IE5VTEwpOworCisgICAgZm9yIChnID0gMDsgZyA8ICpwTnVtU2V0dGluZ0dyb3VwczsgZysrKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBHcm91cCA9ICYoKnBwU2V0dGluZ0dyb3VwcylbZ107CisgICAgICAgIHZrdHJhY2VfZnJlZSgodm9pZCopcEdyb3VwLT5wTmFtZSk7CisgICAgICAgIHBHcm91cC0+cE5hbWUgPSBOVUxMOworCisgICAgICAgIGZvciAocyA9IDA7IHMgPCBwR3JvdXAtPm51bVNldHRpbmdzOyBzKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfZnJlZSgodm9pZCopcEdyb3VwLT5wU2V0dGluZ3Nbc10ucExvbmdOYW1lKTsKKyAgICAgICAgICAgIHBHcm91cC0+cFNldHRpbmdzW3NdLnBMb25nTmFtZSA9IE5VTEw7CisgICAgICAgICAgICB2a3RyYWNlX2ZyZWUoKnBHcm91cC0+cFNldHRpbmdzW3NdLkRhdGEucHBDaGFyKTsKKyAgICAgICAgICAgIHZrdHJhY2VfZnJlZShwR3JvdXAtPnBTZXR0aW5nc1tzXS5EYXRhLnBwQ2hhcik7CisgICAgICAgIH0KKworICAgICAgICBWS1RSQUNFX0RFTEVURShwR3JvdXAtPnBTZXR0aW5ncyk7CisgICAgICAgIHBHcm91cC0+cFNldHRpbmdzID0gTlVMTDsKKyAgICB9CisKKyAgICBWS1RSQUNFX0RFTEVURSgqcHBTZXR0aW5nR3JvdXBzKTsKKyAgICAqcE51bVNldHRpbmdHcm91cHMgPSAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgdmt0cmFjZV9TZXR0aW5nR3JvdXBfQXBwbHlfT3ZlcnJpZGVzKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU2V0dGluZ0dyb3VwLCB2a3RyYWNlX1NldHRpbmdHcm91cCogcE92ZXJyaWRlR3JvdXBzLCB1bnNpZ25lZCBpbnQgbnVtT3ZlcnJpZGVHcm91cHMpCit7CisgICAgdW5zaWduZWQgaW50IG92ZXJyaWRlR3JvdXBJbmRleDsKKyAgICBhc3NlcnQocFNldHRpbmdHcm91cCAhPSBOVUxMKTsKKyAgICBhc3NlcnQocE92ZXJyaWRlR3JvdXBzICE9IE5VTEwpOworCisgICAgLy8gb25seSBvdmVycmlkZSBtYXRjaGluZyBncm91cCAoYmFzZWQgb24gbmFtZSkKKyAgICBmb3IgKG92ZXJyaWRlR3JvdXBJbmRleCA9IDA7IG92ZXJyaWRlR3JvdXBJbmRleCA8IG51bU92ZXJyaWRlR3JvdXBzOyBvdmVycmlkZUdyb3VwSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAocFNldHRpbmdHcm91cC0+cE5hbWUsIHBPdmVycmlkZUdyb3Vwc1tvdmVycmlkZUdyb3VwSW5kZXhdLnBOYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3ZlcnJpZGVTZXR0aW5nSW5kZXg7CisgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogcE92ZXJyaWRlID0gJnBPdmVycmlkZUdyb3Vwc1tvdmVycmlkZUdyb3VwSW5kZXhdOworCisgICAgICAgICAgICBmb3IgKG92ZXJyaWRlU2V0dGluZ0luZGV4ID0gMDsgb3ZlcnJpZGVTZXR0aW5nSW5kZXggPCBwT3ZlcnJpZGUtPm51bVNldHRpbmdzOyBvdmVycmlkZVNldHRpbmdJbmRleCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXNlU2V0dGluZ0luZGV4OworICAgICAgICAgICAgICAgIHZrdHJhY2VfU2V0dGluZ0luZm8qIHBPdmVycmlkZVNldHRpbmcgPSAmcE92ZXJyaWRlLT5wU2V0dGluZ3Nbb3ZlcnJpZGVTZXR0aW5nSW5kZXhdOworCisgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgbWF0Y2hpbmcgc2V0dGluZ3MgYmFzZWQgb24gbG9uZyBuYW1lCisgICAgICAgICAgICAgICAgZm9yIChiYXNlU2V0dGluZ0luZGV4ID0gMDsgYmFzZVNldHRpbmdJbmRleCA8IHBTZXR0aW5nR3JvdXAtPm51bVNldHRpbmdzOyBiYXNlU2V0dGluZ0luZGV4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBTZXR0aW5nR3JvdXAtPnBTZXR0aW5nc1tiYXNlU2V0dGluZ0luZGV4XS5wTG9uZ05hbWUsIHBPdmVycmlkZVNldHRpbmctPnBMb25nTmFtZSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcFRtcCA9IHZrdHJhY2VfU2V0dGluZ0luZm9fc3RyaW5naWZ5X3ZhbHVlKHBPdmVycmlkZVNldHRpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZrdHJhY2VfU2V0dGluZ0luZm9fcGFyc2VfdmFsdWUoJnBTZXR0aW5nR3JvdXAtPnBTZXR0aW5nc1tiYXNlU2V0dGluZ0luZGV4XSwgcFRtcCkgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJGYWlsZWQgdG8gcGFyc2Ugb3ZlcnJpZGUgdmFsdWUuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX2ZyZWUocFRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCT09MIHZrdHJhY2VfU2V0dGluZ0dyb3VwX3NhdmUodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTZXR0aW5nR3JvdXAsIHVuc2lnbmVkIGludCBudW1TZXR0aW5nR3JvdXBzLCBGSUxFKiBwU2V0dGluZ3NGaWxlKQoreworICAgIEJPT0wgcmV0VmFsID0gVFJVRTsKKworICAgIGlmIChwU2V0dGluZ0dyb3VwID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJDYW5ub3Qgc2F2ZSBhIG51bGwgZ3JvdXAgb2Ygc2V0dGluZ3MuIik7CisgICAgICAgIHJldFZhbCA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChwU2V0dGluZ3NGaWxlID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJDYW5ub3Qgc2F2ZSBhbiB1bm5hbWVkIHNldHRpbmdzIGZpbGUuIik7CisgICAgICAgIHJldFZhbCA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChyZXRWYWwgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBnOworICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisKKyAgICAgICAgZm9yIChnID0gMDsgZyA8IG51bVNldHRpbmdHcm91cHM7IGcrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZ3JvdXAgbmFtZQorICAgICAgICAgICAgZnB1dHMoIlsiLCBwU2V0dGluZ3NGaWxlKTsKKyAgICAgICAgICAgIGZwdXRzKHBTZXR0aW5nR3JvdXBbZ10ucE5hbWUsIHBTZXR0aW5nc0ZpbGUpOworICAgICAgICAgICAgZnB1dHMoIl1cbiIsIHBTZXR0aW5nc0ZpbGUpOworCisgICAgICAgICAgICAvLyBzZXR0aW5ncworICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcFNldHRpbmdHcm91cFtnXS5udW1TZXR0aW5nczsgaW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyKiB2YWx1ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgZnB1dHMoIiAgICIsIHBTZXR0aW5nc0ZpbGUpOworICAgICAgICAgICAgICAgIGZwdXRzKHBTZXR0aW5nR3JvdXBbZ10ucFNldHRpbmdzW2luZGV4XS5wTG9uZ05hbWUsIHBTZXR0aW5nc0ZpbGUpOworICAgICAgICAgICAgICAgIGZwdXRzKCIgPSAiLCBwU2V0dGluZ3NGaWxlKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZrdHJhY2VfU2V0dGluZ0luZm9fc3RyaW5naWZ5X3ZhbHVlKCZwU2V0dGluZ0dyb3VwW2ddLnBTZXR0aW5nc1tpbmRleF0pOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnB1dHModmFsdWUsIHBTZXR0aW5nc0ZpbGUpOworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX2ZyZWUodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcHV0cygiIiwgcFNldHRpbmdzRmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZwdXRzKCJcbiIsIHBTZXR0aW5nc0ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcHV0cygiXG4iLCBwU2V0dGluZ3NGaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCB2a3RyYWNlX1NldHRpbmdHcm91cF9pbml0X2Zyb21fY21kbGluZSh2a3RyYWNlX1NldHRpbmdHcm91cCogcFNldHRpbmdHcm91cCwgaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgY2hhcioqIHBwT3V0X3JlbWFpbmluZ19hcmdzKQoreworICAgIGludCBpID0gMDsKKworICAgIGlmIChwU2V0dGluZ0dyb3VwICE9IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX1NldHRpbmdJbmZvKiBwU2V0dGluZ3MgPSBwU2V0dGluZ0dyb3VwLT5wU2V0dGluZ3M7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2V0dGluZ3MgPSBwU2V0dGluZ0dyb3VwLT5udW1TZXR0aW5nczsKKworICAgICAgICAvLyB1cGRhdGUgc2V0dGluZ3MgYmFzZWQgb24gY29tbWFuZCBsaW5lIG9wdGlvbnMKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNldHRpbmdJbmRleDsKKyAgICAgICAgICAgIGludCBjb25zdW1lZCA9IDA7CisgICAgICAgICAgICBjaGFyKiBjdXJBcmcgPSBhcmd2W2ldOworCisgICAgICAgICAgICAvLyBpZiB0aGUgYXJnIGlzIG9ubHkgIi0tIiB0aGVuIGFsbCBmb2xsb3dpbmcgYXJncyBhcmUgZm9yIHRoZSBhcHBsaWNhdGlvbjsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBhcmcgc3RhcnRzIHdpdGggIi0iIHRoZW4gaXQgaXMgcmVmZXJyaW5nIHRvIGEgc2hvcnQgbmFtZTsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBhcmcgc3RhcnRzIHdpdGggIi0tIiB0aGVuIGl0IGlzIHJlZmVycmluZyB0byBhIGxvbmcgbmFtZS4KKyAgICAgICAgICAgIGlmIChzdHJjbXAoIi0tIiwgY3VyQXJnKSA9PSAwICYmIHBwT3V0X3JlbWFpbmluZ19hcmdzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYWxsIHJlbWFpbmluZyBhcmdzIGFyZSBmb3IgdGhlIGFwcGxpY2F0aW9uCisKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgcGFzdCB0aGUgY3VycmVudCBhcmcKKyAgICAgICAgICAgICAgICBpICs9IDE7CisgICAgICAgICAgICAgICAgY29uc3VtZWQrKzsKKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ2M7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcHBPdXRfcmVtYWluaW5nX2FyZ3MgPT0gTlVMTCB8fCBzdHJsZW4oKnBwT3V0X3JlbWFpbmluZ19hcmdzKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcHBPdXRfcmVtYWluaW5nX2FyZ3MgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBwT3V0X3JlbWFpbmluZ19hcmdzID0gdmt0cmFjZV9jb3B5X2FuZF9hcHBlbmQoKnBwT3V0X3JlbWFpbmluZ19hcmdzLCAiICIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoc2V0dGluZ0luZGV4ID0gMDsgc2V0dGluZ0luZGV4IDwgbnVtX3NldHRpbmdzOyBzZXR0aW5nSW5kZXgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBTZXR0aW5nTmFtZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGN1ckFyZyA9IGFyZ3ZbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKCItLSIsIGN1ckFyZywgMikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9uZyBvcHRpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdOYW1lID0gcFNldHRpbmdzW3NldHRpbmdJbmRleF0ucExvbmdOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyQXJnICs9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgiLSIsIGN1ckFyZywgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnQgb3B0aW9uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5nTmFtZSA9IHBTZXR0aW5nc1tzZXR0aW5nSW5kZXhdLnBTaG9ydE5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJBcmcgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwU2V0dGluZ05hbWUgIT0gTlVMTCAmJiBzdHJjbXAoY3VyQXJnLCBwU2V0dGluZ05hbWUpID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKzEgPCBhcmdjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nSW5mb19wYXJzZV92YWx1ZSgmcFNldHRpbmdzW3NldHRpbmdJbmRleF0sIGFyZ3ZbaSsxXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uc3VtZWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9wcmludChwU2V0dGluZ0dyb3VwKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9kZWxldGUocFNldHRpbmdHcm91cCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpICs9IGNvbnN1bWVkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IHZrdHJhY2VfU2V0dGluZ0dyb3VwX2luaXQodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTZXR0aW5nR3JvdXAsIEZJTEUqIHBTZXR0aW5nc0ZpbGUsIGludCBhcmdjLCBjaGFyKiBhcmd2W10sIGNvbnN0IGNoYXIqKiBwcE91dF9yZW1haW5pbmdfYXJncykKK3sKKyAgICBpZiAocFNldHRpbmdHcm91cCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCEiTm8gbmVlZCB0byBjYWxsIHZrdHJhY2VfU2V0dGluZ0dyb3VwX2luaXQgaWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBubyBzZXR0aW5ncyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA9PSAyICYmIChzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDAgfHwgc3RyY21wKGFyZ3ZbMV0sICItaCIpID09IDApKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfcHJpbnQocFNldHRpbmdHcm91cCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsbHksIHNldCBhbGwgb3B0aW9ucyB0byB0aGVpciBkZWZhdWx0cworICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX3Jlc2V0X2RlZmF1bHRzKHBTZXR0aW5nR3JvdXApOworCisgICAgLy8gU2Vjb25kbHkgc2V0IG9wdGlvbnMgYmFzZWQgb24gc2V0dGluZ3MgZmlsZQorICAgIGlmIChwU2V0dGluZ3NGaWxlICE9IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogcEdyb3VwcyA9IE5VTEw7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1Hcm91cHMgPSAwOworICAgICAgICBpZiAodmt0cmFjZV9TZXR0aW5nR3JvdXBfTG9hZF9mcm9tX2ZpbGUocFNldHRpbmdzRmlsZSwgJnBHcm91cHMsICZudW1Hcm91cHMpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9wcmludChwU2V0dGluZ0dyb3VwKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX0FwcGx5X092ZXJyaWRlcyhwU2V0dGluZ0dyb3VwLCBwR3JvdXBzLCBudW1Hcm91cHMpOworCisgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX0RlbGV0ZV9Mb2FkZWQoJnBHcm91cHMsICZudW1Hcm91cHMpOworICAgIH0KKworICAgIC8vIFRoaXJkbHkgc2V0IG9wdGlvbnMgYmFzZWQgb24gY21kIGxpbmUgYXJncworICAgIGlmICh2a3RyYWNlX1NldHRpbmdHcm91cF9pbml0X2Zyb21fY21kbGluZShwU2V0dGluZ0dyb3VwLCBhcmdjLCBhcmd2LCAoY2hhciAqKilwcE91dF9yZW1haW5pbmdfYXJncykgPT0gLTEpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNlX1NldHRpbmdHcm91cF9kZWxldGUodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTZXR0aW5nR3JvdXApCit7CisgICAgaWYgKHBTZXR0aW5nR3JvdXAgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIGFsbCBzdHJpbmdzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU2V0dGluZ0dyb3VwLT5udW1TZXR0aW5nczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFNldHRpbmdHcm91cC0+cFNldHRpbmdzW2ldLnR5cGUgPT0gVktUUkFDRV9TRVRUSU5HX1NUUklORykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKihwU2V0dGluZ0dyb3VwLT5wU2V0dGluZ3NbaV0uRGF0YS5wcENoYXIpICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX2ZyZWUoKnBTZXR0aW5nR3JvdXAtPnBTZXR0aW5nc1tpXS5EYXRhLnBwQ2hhcik7CisgICAgICAgICAgICAgICAgICAgICpwU2V0dGluZ0dyb3VwLT5wU2V0dGluZ3NbaV0uRGF0YS5wcENoYXIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2Vfc2V0dGluZ3MuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2Vfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV9zZXR0aW5ncy5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCIKKwordHlwZWRlZiBlbnVtIFZLVFJBQ0VfU0VUVElOR19UWVBFCit7CisgICAgVktUUkFDRV9TRVRUSU5HX1NUUklORywKKyAgICBWS1RSQUNFX1NFVFRJTkdfQk9PTCwKKyAgICBWS1RSQUNFX1NFVFRJTkdfVUlOVCwKKyAgICBWS1RSQUNFX1NFVFRJTkdfSU5UCit9IFZLVFJBQ0VfU0VUVElOR19UWVBFOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IHZrdHJhY2VfU2V0dGluZ0luZm8KK3sKKyAgICBjb25zdCBjaGFyKiBwU2hvcnROYW1lOworICAgIGNvbnN0IGNoYXIqIHBMb25nTmFtZTsKKyAgICBWS1RSQUNFX1NFVFRJTkdfVFlQRSB0eXBlOworICAgIHVuaW9uIERhdGEKKyAgICB7CisgICAgICAgIHZvaWQqIHBWb2lkOworICAgICAgICBjaGFyKiogcHBDaGFyOworICAgICAgICBCT09MKiBwQm9vbDsKKyAgICAgICAgdW5zaWduZWQgaW50KiBwVWludDsKKyAgICAgICAgaW50KiBwSW50OworICAgIH0gRGF0YTsKKyAgICB1bmlvbiBEZWZhdWx0CisgICAgeworICAgICAgICB2b2lkKiBwVm9pZDsKKyAgICAgICAgY2hhcioqIHBwQ2hhcjsKKyAgICAgICAgQk9PTCogcEJvb2w7CisgICAgICAgIHVuc2lnbmVkIGludCogcFVpbnQ7CisgICAgICAgIGludCogcEludDsKKyAgICB9IERlZmF1bHQ7CisgICAgQk9PTCBiUHJpbnRJbkhlbHA7CisgICAgY29uc3QgY2hhciogcERlc2M7Cit9IHZrdHJhY2VfU2V0dGluZ0luZm87CisKK3R5cGVkZWYgc3RydWN0IHZrdHJhY2VfU2V0dGluZ0dyb3VwCit7CisgICAgY29uc3QgY2hhciogcE5hbWU7CisgICAgdW5zaWduZWQgaW50IG51bVNldHRpbmdzOworICAgIHZrdHJhY2VfU2V0dGluZ0luZm8qIHBTZXR0aW5nczsKK30gdmt0cmFjZV9TZXR0aW5nR3JvdXA7CisKK2ludCB2a3RyYWNlX1NldHRpbmdHcm91cF9pbml0KHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU2V0dGluZ0dyb3VwLCBGSUxFICpwU2V0dGluZ3NGaWxlLCBpbnQgYXJnYywgY2hhciogYXJndltdLCBjb25zdCBjaGFyKiogcHBPdXRfcmVtYWluaW5nX2FyZ3MpOworQk9PTCB2a3RyYWNlX1NldHRpbmdHcm91cF9zYXZlKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU2V0dGluZ0dyb3VwLCB1bnNpZ25lZCBpbnQgbnVtU2V0dGluZ0dyb3VwcywgRklMRSogcFNldHRpbmdzRmlsZSk7Cit2b2lkIHZrdHJhY2VfU2V0dGluZ0dyb3VwX2RlbGV0ZSh2a3RyYWNlX1NldHRpbmdHcm91cCogcFNldHRpbmdHcm91cCk7Cit2b2lkIHZrdHJhY2VfU2V0dGluZ0dyb3VwX3Jlc2V0X2RlZmF1bHRzKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU2V0dGluZ0dyb3VwKTsKKworLy8gQWRkcyBwU3JjIGdyb3VwIHRvIHBwRGVzdEdyb3VwcyBpZiB0aGUgbmFtZWQgZ3JvdXAgaXMgbm90IGFscmVhZHkgdGhlcmUsCisvLyBvciBhZGRzIG1pc3Npbmcgc2V0dGluZ3MgZnJvbSBwU3JjIGludG8gdGhlIGV4aXN0aW5nIGdyb3VwIGluIHBwRGVzdEdyb3Vwcy4KKy8vIHBOdW1EZXN0R3JvdXBzIGlzIHVwZGF0ZWQgaWYgcFNyYyBpcyBhZGRlZCB0byBwcERlc3RHcm91cHMuCit2b2lkIHZrdHJhY2VfU2V0dGluZ0dyb3VwX21lcmdlKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU3JjLCB2a3RyYWNlX1NldHRpbmdHcm91cCoqIHBwRGVzdEdyb3VwcywgdW5zaWduZWQgaW50KiBwTnVtRGVzdEdyb3Vwcyk7CisKKy8vIFVwZGF0ZXMgRGVzdEdyb3VwcyB3aXRoIHZhbHVlcyBmcm9tIFNyYwordm9pZCB2a3RyYWNlX1NldHRpbmdHcm91cF91cGRhdGUodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTcmMsIHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwRGVzdEdyb3VwcywgdW5zaWduZWQgaW50IG51bURlc3RHcm91cHMpOworCisvLyBDcmVhdGVzIGEgbmV3IG5hbWVkIGdyb3VwIGF0IHRoZSBlbmQgb2YgdGhlIHBwU2V0dGluZ0dyb3VwcyBhcnJheSwgYW5kIHVwZGF0ZXMgcE51bVNldHRpbmdHcm91cHMuCit2a3RyYWNlX1NldHRpbmdHcm91cCogdmt0cmFjZV9TZXR0aW5nR3JvdXBfQ3JlYXRlKGNvbnN0IGNoYXIqIHBHcm91cE5hbWUsIHZrdHJhY2VfU2V0dGluZ0dyb3VwKiogcHBTZXR0aW5nR3JvdXBzLCB1bnNpZ25lZCBpbnQqIHBOdW1TZXR0aW5nR3JvdXBzKTsKKworLy8gQWRkcyBhIFNUUklORyBzZXR0aW5nSW5mbyB0byBwRGVzdEdyb3VwIHdoaWNoIGhvbGRzIGEgY29weSBvZiBwU3JjSW5mbywgYnV0IHdpdGggYSBzdHJpbmdpZmllZCB2YWx1ZS4KKy8vIFRoZSBjb252ZXJzaW9uIHRvIHN0cmluZyBpcyBuZWNlc3NhcnkgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHB1cnBvc2VzLgordm9pZCB2a3RyYWNlX1NldHRpbmdHcm91cF9BZGRfSW5mbyh2a3RyYWNlX1NldHRpbmdJbmZvKiBwU3JjSW5mbywgdmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBEZXN0R3JvdXApOworCitpbnQgdmt0cmFjZV9TZXR0aW5nR3JvdXBfTG9hZF9mcm9tX2ZpbGUoRklMRSogcEZpbGUsIHZrdHJhY2VfU2V0dGluZ0dyb3VwKiogcHBTZXR0aW5nR3JvdXBzLCB1bnNpZ25lZCBpbnQqIHBOdW1TZXR0aW5nR3JvdXBzKTsKK3ZvaWQgdmt0cmFjZV9TZXR0aW5nR3JvdXBfRGVsZXRlX0xvYWRlZCh2a3RyYWNlX1NldHRpbmdHcm91cCoqIHBwU2V0dGluZ0dyb3VwcywgdW5zaWduZWQgaW50KiBwTnVtU2V0dGluZ0dyb3Vwcyk7CisKK3ZvaWQgdmt0cmFjZV9TZXR0aW5nR3JvdXBfQXBwbHlfT3ZlcnJpZGVzKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU2V0dGluZ0dyb3VwLCB2a3RyYWNlX1NldHRpbmdHcm91cCogcE92ZXJyaWRlR3JvdXBzLCB1bnNpZ25lZCBpbnQgbnVtT3ZlcnJpZGVHcm91cHMpOworCitpbnQgdmt0cmFjZV9TZXR0aW5nR3JvdXBfaW5pdF9mcm9tX2NtZGxpbmUodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTZXR0aW5nR3JvdXAsIGludCBhcmdjLCBjaGFyKiBhcmd2W10sIGNoYXIqKiBwcE91dF9yZW1haW5pbmdfYXJncyk7CisKK3ZvaWQgdmt0cmFjZV9TZXR0aW5nR3JvdXBfcHJpbnQoY29uc3Qgdmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTZXR0aW5nR3JvdXApOwordm9pZCB2a3RyYWNlX1NldHRpbmdJbmZvX3ByaW50KGNvbnN0IHZrdHJhY2VfU2V0dGluZ0luZm8qIHBTZXR0aW5nKTsKKworY2hhciogdmt0cmFjZV9TZXR0aW5nSW5mb19zdHJpbmdpZnlfdmFsdWUodmt0cmFjZV9TZXR0aW5nSW5mbyogcFNldHRpbmcpOworQk9PTCB2a3RyYWNlX1NldHRpbmdJbmZvX3BhcnNlX3ZhbHVlKHZrdHJhY2VfU2V0dGluZ0luZm8qIHBTZXR0aW5nLCBjb25zdCBjaGFyKiBhcmcpOwordm9pZCB2a3RyYWNlX1NldHRpbmdJbmZvX3Jlc2V0X2RlZmF1bHQodmt0cmFjZV9TZXR0aW5nSW5mbyogcFNldHRpbmcpOwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV90cmFjZV9wYWNrZXRfaWRlbnRpZmllcnMuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1N2QxYgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCIKKworI2RlZmluZSBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl8yIDB4MDAwMgorI2RlZmluZSBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl8zIDB4MDAwMworI2RlZmluZSBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl80IDB4MDAwNAorI2RlZmluZSBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl81IDB4MDAwNQorI2RlZmluZSBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTiBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl81CisjZGVmaW5lIFZLVFJBQ0VfVFJBQ0VfRklMRV9WRVJTSU9OX01JTklNVU1fQ09NUEFUSUJMRSBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl81CisKKyNkZWZpbmUgVktUUkFDRV9NQVhfVFJBQ0VSX0lEX0FSUkFZX1NJWkUgMTQKKwordHlwZWRlZiBlbnVtIFZLVFJBQ0VfVFJBQ0VSX0lECit7CisgICAgVktUUkFDRV9USURfUkVTRVJWRUQgPSAwLAorICAgIFZLVFJBQ0VfVElEX0dMX0ZQUywKKyAgICBWS1RSQUNFX1RJRF9WVUxLQU4KKyAgICAvLyBNYXggZW51bSBtdXN0IGJlIGxlc3MgdGhhbiBWS1RSQUNFX01BWF9UUkFDRVJfSURfQVJSQVlfU0laRQorfSBWS1RSQUNFX1RSQUNFUl9JRDsKKwordHlwZWRlZiBzdHJ1Y3QgVktUUkFDRV9UUkFDRVJfUkVQTEFZRVJfSU5GTworeworICAgIFZLVFJBQ0VfVFJBQ0VSX0lEIHRyYWNlcklkOworICAgIEJPT0wgbmVlZHNSZXBsYXllcjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCByZXBsYXllckxpYnJhcnlOYW1lOworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGRlYnVnZ2VyTGlicmFyeW5hbWU7Cit9IFZLVFJBQ0VfVFJBQ0VSX1JFUExBWUVSX0lORk87CisKKy8vIFRoZSBpbmRleCBoZXJlIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIFZLVFJBQ0VfVFJBQ0VSX0lECitzdGF0aWMgY29uc3QgVktUUkFDRV9UUkFDRVJfUkVQTEFZRVJfSU5GTyBnc190cmFjZXJSZXBsYXllckluZm9bVktUUkFDRV9NQVhfVFJBQ0VSX0lEX0FSUkFZX1NJWkVdID0geworICAgIHtWS1RSQUNFX1RJRF9SRVNFUlZFRCwgRkFMU0UsICIiLCAiIn0sCisgICAge1ZLVFJBQ0VfVElEX0dMX0ZQUywgRkFMU0UsICIiLCAiIn0sCisgICAge1ZLVFJBQ0VfVElEX1ZVTEtBTiwgVFJVRSwgVktUUkFDRV9MSUJSQVJZX05BTUUodnVsa2FuX3JlcGxheSksIFZLVFJBQ0VfTElCUkFSWV9OQU1FKHZrdHJhY2V2aWV3ZXJfdmspfSwKKyAgICB7VktUUkFDRV9USURfUkVTRVJWRUQsIEZBTFNFLCAiIiwgIiJ9LCAvLyB0aGlzIGNhbiBiZSB1cGRhdGVkIGFzIG5ldyB0cmFjZXJzIGFyZSBhZGRlZAorICAgIHtWS1RSQUNFX1RJRF9SRVNFUlZFRCwgRkFMU0UsICIiLCAiIn0sIC8vIHRoaXMgY2FuIGJlIHVwZGF0ZWQgYXMgbmV3IHRyYWNlcnMgYXJlIGFkZGVkCisgICAge1ZLVFJBQ0VfVElEX1JFU0VSVkVELCBGQUxTRSwgIiIsICIifSwgLy8gdGhpcyBjYW4gYmUgdXBkYXRlZCBhcyBuZXcgdHJhY2VycyBhcmUgYWRkZWQKKyAgICB7VktUUkFDRV9USURfUkVTRVJWRUQsIEZBTFNFLCAiIiwgIiJ9LCAvLyB0aGlzIGNhbiBiZSB1cGRhdGVkIGFzIG5ldyB0cmFjZXJzIGFyZSBhZGRlZAorICAgIHtWS1RSQUNFX1RJRF9SRVNFUlZFRCwgRkFMU0UsICIiLCAiIn0sIC8vIHRoaXMgY2FuIGJlIHVwZGF0ZWQgYXMgbmV3IHRyYWNlcnMgYXJlIGFkZGVkCisgICAge1ZLVFJBQ0VfVElEX1JFU0VSVkVELCBGQUxTRSwgIiIsICIifSwgLy8gdGhpcyBjYW4gYmUgdXBkYXRlZCBhcyBuZXcgdHJhY2VycyBhcmUgYWRkZWQKKyAgICB7VktUUkFDRV9USURfUkVTRVJWRUQsIEZBTFNFLCAiIiwgIiJ9LCAvLyB0aGlzIGNhbiBiZSB1cGRhdGVkIGFzIG5ldyB0cmFjZXJzIGFyZSBhZGRlZAorICAgIHtWS1RSQUNFX1RJRF9SRVNFUlZFRCwgRkFMU0UsICIiLCAiIn0sIC8vIHRoaXMgY2FuIGJlIHVwZGF0ZWQgYXMgbmV3IHRyYWNlcnMgYXJlIGFkZGVkCisgICAge1ZLVFJBQ0VfVElEX1JFU0VSVkVELCBGQUxTRSwgIiIsICIifSwgLy8gdGhpcyBjYW4gYmUgdXBkYXRlZCBhcyBuZXcgdHJhY2VycyBhcmUgYWRkZWQKKyAgICB7VktUUkFDRV9USURfUkVTRVJWRUQsIEZBTFNFLCAiIiwgIiJ9LCAvLyB0aGlzIGNhbiBiZSB1cGRhdGVkIGFzIG5ldyB0cmFjZXJzIGFyZSBhZGRlZAorICAgIHtWS1RSQUNFX1RJRF9SRVNFUlZFRCwgRkFMU0UsICIiLCAiIn0sIC8vIHRoaXMgY2FuIGJlIHVwZGF0ZWQgYXMgbmV3IHRyYWNlcnMgYXJlIGFkZGVkCit9OworCit0eXBlZGVmIGVudW0gX1ZLVFJBQ0VfVFJBQ0VfUEFDS0VUX0lECit7CisgICAgVktUUkFDRV9UUElfTUVTU0FHRSwKKyAgICBWS1RSQUNFX1RQSV9NQVJLRVJfQ0hFQ0tQT0lOVCwKKyAgICBWS1RSQUNFX1RQSV9NQVJLRVJfQVBJX0JPVU5EQVJZLAorICAgIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfQkVHSU4sCisgICAgVktUUkFDRV9UUElfTUFSS0VSX0FQSV9HUk9VUF9FTkQsCisgICAgVktUUkFDRV9UUElfTUFSS0VSX1RFUk1JTkFURV9QUk9DRVNTLAorICAgIFZLVFJBQ0VfVFBJX0JFR0lOX0FQSV9IRVJFIC8vIHRoaXMgZW51bSBzaG91bGQgYWx3YXlzIGJlIHRoZSBsYXN0IGluIHRoZSBsaXN0LiBGZWVsIGZyZWUgdG8gaW5zZXJ0IG5ldyBJRCBhYm92ZSB0aGlzIG9uZS4KK30gVktUUkFDRV9UUkFDRV9QQUNLRVRfSUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGlkOworICAgIHVpbnQ4X3QgaXNfNjRfYml0OworfSB2a3RyYWNlX3RyYWNlcl9pbmZvOworCisjaWYgZGVmaW5lZChfX0xQNjRfXykgfHwgZGVmaW5lZChfV0lONjQpIHx8IChkZWZpbmVkKF9feDg2XzY0X18pICYmICFkZWZpbmVkKF9fSUxQMzJfXykgKSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX2lhNjQpIHx8IGRlZmluZWQgKF9NX0lBNjQpIHx8IGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19wb3dlcnBjNjRfXykKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IHRyYWNlX2ZpbGVfdmVyc2lvbjsKKyAgICB1aW50MzJfdCB1dWlkWzRdOworICAgIHVpbnQ2NF90IGZpcnN0X3BhY2tldF9vZmZzZXQ7ICAgLy8gd2lsbCBiZSBzaXplIG9mIGhlYWRlciBpbmNsdWRpbmcgc2l6ZSBvZiB0cmFjZXJfaWRfYXJyYXkgYW5kIHN0YXRlX3NuYXBzaG90X3BhdGgvYmluYXJ5CisgICAgdWludDhfdCB0cmFjZXJfY291bnQ7ICAgICAgICAgICAvLyBudW1iZXIgb2YgdHJhY2VycyByZWZlcmVuY2VkIGluIHRoaXMgdHJhY2UgZmlsZQorICAgIHZrdHJhY2VfdHJhY2VyX2luZm8gdHJhY2VyX2lkX2FycmF5W1ZLVFJBQ0VfTUFYX1RSQUNFUl9JRF9BUlJBWV9TSVpFXTsgLy8gYXJyYXkgb2YgdHJhY2VyX2lkcyBhbmQgdmFsdWVzIHdoaWNoIGFyZSByZWZlcmVuY2VkIGluIHRoZSB0cmFjZSBmaWxlCisgICAgdWludDY0X3QgdHJhY2Vfc3RhcnRfdGltZTsKK30gdmt0cmFjZV90cmFjZV9maWxlX2hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90IHNpemU7IC8vIHRvdGFsIHNpemUsIGluY2x1ZGluZyBleHRyYSBkYXRhLCBuZWVkZWQgdG8gZ2V0IHRvIHRoZSBuZXh0IHBhY2tldF9oZWFkZXIKKyAgICB1aW50NjRfdCBnbG9iYWxfcGFja2V0X2luZGV4OworICAgIHVpbnQ4X3QgdHJhY2VyX2lkOyAvLyBUT0RPOiBuZWVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRyYWNlcnMgaW4gYSB3YXkgdGhhdCBpcyBrbm93biBieSB0aGUgcmVwbGF5ZXIKKyAgICB1aW50MTZfdCBwYWNrZXRfaWQ7IC8vIFZLVFJBQ0VfVFJBQ0VfUEFDS0VUX0lEIChvciBvbmUgb2YgdGhlIGFwaS1zcGVjaWZpYyBJRHMpCisgICAgdWludDMyX3QgdGhyZWFkX2lkOworICAgIHVpbnQ2NF90IHZrdHJhY2VfYmVnaW5fdGltZTsgLy8gc3RhcnQgb2YgbWVhc3VyaW5nIHZrdHJhY2UncyBvdmVyaGVhZCByZWxhdGVkIHRvIHRoaXMgcGFja2V0CisgICAgdWludDY0X3QgZW50cnlwb2ludF9iZWdpbl90aW1lOworICAgIHVpbnQ2NF90IGVudHJ5cG9pbnRfZW5kX3RpbWU7CisgICAgdWludDY0X3Qgdmt0cmFjZV9lbmRfdGltZTsgLy8gZW5kIG9mIG1lYXN1cmluZyB2a3RyYWNlJ3Mgb3ZlcmhlYWQgcmVsYXRlZCB0byB0aGlzIHBhY2tldAorICAgIHVpbnQ2NF90IG5leHRfYnVmZmVyc19vZmZzZXQ7IC8vIHVzZWQgZm9yIHRyYWNraW5nIHRoZSBhZGRpdGlvbiBvZiBidWZmZXJzIHRvIHRoZSB0cmFjZSBwYWNrZXQKKyAgICB1aW50cHRyX3QgcEJvZHk7IC8vIHBvaW50cyB0byB0aGUgYm9keSBvZiB0aGUgcGFja2V0Cit9IHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlcjsKKworI2Vsc2UKKworLy8gdmt0cmFjZV90cmFjZV9maWxlX2hlYWRlciBhbmQgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyIGFyZSB3cml0dGVuIGFuZAorLy8gcmVhZCBieSBib3RoIGhvc3QgYW5kIHRhcmdldCBDUFUsIHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4KKy8vIFNwZWNpZmljYWxseSBmb3IgQW5kcm9pZCwgeDg2IGFuZCBhcm0zMiBhbGlnbiA2NC1iaXQgaW50ZWdlcnMgZGlmZmVyZW50bHksCisvLyBzbyB3ZSBtdXN0IHJlcXVpcmUgOCBieXRlIGFsaWdubWVudC4KKy8vIFRoZXNlIGNoYW5nZXMgYXJlIGd1YXJkZWQgYnkgYSA2NC1iaXQgY2hlY2sgYWJvdmUgZm9yIG5vdy4KKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyNkZWZpbmUgQUxJR044IF9fZGVjbHNwZWMoYWxpZ24oOCkpCisjZWxzZQorI2RlZmluZSBBTElHTjggX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IHRyYWNlX2ZpbGVfdmVyc2lvbjsKKyAgICB1aW50MzJfdCB1dWlkWzRdOworICAgIEFMSUdOOCB1aW50NjRfdCBmaXJzdF9wYWNrZXRfb2Zmc2V0OyAgIC8vIHdpbGwgYmUgc2l6ZSBvZiBoZWFkZXIgaW5jbHVkaW5nIHNpemUgb2YgdHJhY2VyX2lkX2FycmF5IGFuZCBzdGF0ZV9zbmFwc2hvdF9wYXRoL2JpbmFyeQorICAgIHVpbnQ4X3QgdHJhY2VyX2NvdW50OyAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRyYWNlcnMgcmVmZXJlbmNlZCBpbiB0aGlzIHRyYWNlIGZpbGUKKyAgICB2a3RyYWNlX3RyYWNlcl9pbmZvIHRyYWNlcl9pZF9hcnJheVtWS1RSQUNFX01BWF9UUkFDRVJfSURfQVJSQVlfU0laRV07IC8vIGFycmF5IG9mIHRyYWNlcl9pZHMgYW5kIHZhbHVlcyB3aGljaCBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgdHJhY2UgZmlsZQorICAgIEFMSUdOOCB1aW50NjRfdCB0cmFjZV9zdGFydF90aW1lOworfSB2a3RyYWNlX3RyYWNlX2ZpbGVfaGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQUxJR044IHVpbnQ2NF90IHNpemU7IC8vIHRvdGFsIHNpemUsIGluY2x1ZGluZyBleHRyYSBkYXRhLCBuZWVkZWQgdG8gZ2V0IHRvIHRoZSBuZXh0IHBhY2tldF9oZWFkZXIKKyAgICBBTElHTjggdWludDY0X3QgZ2xvYmFsX3BhY2tldF9pbmRleDsKKyAgICB1aW50OF90IHRyYWNlcl9pZDsgLy8gVE9ETzogbmVlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0cmFjZXJzIGluIGEgd2F5IHRoYXQgaXMga25vd24gYnkgdGhlIHJlcGxheWVyCisgICAgdWludDE2X3QgcGFja2V0X2lkOyAvLyBWS1RSQUNFX1RSQUNFX1BBQ0tFVF9JRCAob3Igb25lIG9mIHRoZSBhcGktc3BlY2lmaWMgSURzKQorICAgIHVpbnQzMl90IHRocmVhZF9pZDsKKyAgICBBTElHTjggdWludDY0X3Qgdmt0cmFjZV9iZWdpbl90aW1lOyAvLyBzdGFydCBvZiBtZWFzdXJpbmcgdmt0cmFjZSdzIG92ZXJoZWFkIHJlbGF0ZWQgdG8gdGhpcyBwYWNrZXQKKyAgICBBTElHTjggdWludDY0X3QgZW50cnlwb2ludF9iZWdpbl90aW1lOworICAgIEFMSUdOOCB1aW50NjRfdCBlbnRyeXBvaW50X2VuZF90aW1lOworICAgIEFMSUdOOCB1aW50NjRfdCB2a3RyYWNlX2VuZF90aW1lOyAvLyBlbmQgb2YgbWVhc3VyaW5nIHZrdHJhY2UncyBvdmVyaGVhZCByZWxhdGVkIHRvIHRoaXMgcGFja2V0CisgICAgQUxJR044IHVpbnQ2NF90IG5leHRfYnVmZmVyc19vZmZzZXQ7IC8vIHVzZWQgZm9yIHRyYWNraW5nIHRoZSBhZGRpdGlvbiBvZiBidWZmZXJzIHRvIHRoZSB0cmFjZSBwYWNrZXQKKyAgICB1aW50cHRyX3QgcEJvZHk7IC8vIHBvaW50cyB0byB0aGUgYm9keSBvZiB0aGUgcGFja2V0Cit9IHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlcjsKKworI2VuZGlmIC8vIDY0LWJpdAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrdHJhY2VMb2dMZXZlbCB0eXBlOworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICBjaGFyKiBtZXNzYWdlOworfSB2a3RyYWNlX3RyYWNlX3BhY2tldF9tZXNzYWdlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgICAgY2hhciogbGFiZWw7Cit9IHZrdHJhY2VfdHJhY2VfcGFja2V0X21hcmtlcl9jaGVja3BvaW50OworCit0eXBlZGVmIHZrdHJhY2VfdHJhY2VfcGFja2V0X21hcmtlcl9jaGVja3BvaW50IHZrdHJhY2VfdHJhY2VfcGFja2V0X21hcmtlcl9hcGlfYm91bmRhcnk7Cit0eXBlZGVmIHZrdHJhY2VfdHJhY2VfcGFja2V0X21hcmtlcl9jaGVja3BvaW50IHZrdHJhY2VfdHJhY2VfcGFja2V0X21hcmtlcl9hcGlfZ3JvdXBfYmVnaW47Cit0eXBlZGVmIHZrdHJhY2VfdHJhY2VfcGFja2V0X21hcmtlcl9jaGVja3BvaW50IHZrdHJhY2VfdHJhY2VfcGFja2V0X21hcmtlcl9hcGlfZ3JvdXBfZW5kOworCit0eXBlZGVmIFZLVFJBQ0VfVFJBQ0VSX0lEIChWS1RSQUNFUl9DREVDTCAqZnVuY3B0cl9WS1RSQUNFX0dldFRyYWNlcklkKSgpOwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuYyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkMmIwZgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2ludGVyY29ubmVjdC5oIgorI2luY2x1ZGUgInZrdHJhY2VfZmlsZWxpa2UuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmgiCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHJwYy5oPgorI3ByYWdtYSBjb21tZW50IChsaWIsICJScGNydDQubGliIikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgfHwgZGVmaW5lZChQTEFURk9STV9PU1gpCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoUExBVEZPUk1fT1NYKQorI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL21hY2guaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidmt0cmFjZV9wYWdlZ3VhcmRfbWVtb3J5Y29weS5oIgorCitzdGF0aWMgdWludDY0X3QgZ19wYWNrZXRfaW5kZXggPSAwOworCit2b2lkIHZrdHJhY2VfZ2VuX3V1aWQodWludDMyX3QqIHBVdWlkKQoreworICAgIHVpbnQzMl90IGJ1ZltdID0geyAweEFCQ0RFRiwgMHgxMjM0NTY3OCwgMHhGRkZFQ0FCQywgMHhBQkNEREVGMCB9OworICAgIHZrdHJhY2VfcGxhdGZvcm1fcmFuZF9zKGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICBwVXVpZFswXSA9IGJ1ZlswXTsKKyAgICBwVXVpZFsxXSA9IGJ1ZlsxXTsKKyAgICBwVXVpZFsyXSA9IGJ1ZlsyXTsKKyAgICBwVXVpZFszXSA9IGJ1ZlszXTsKK30KKworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCit1aW50NjRfdCB2a3RyYWNlX2dldF90aW1lKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRpbWUpOworICAgIHJldHVybiAoKHVpbnQ2NF90KXRpbWUudHZfc2VjICogMTAwMDAwMDAwMCkgKyB0aW1lLnR2X25zZWM7Cit9CisjZWxpZiBkZWZpbmVkKFBMQVRGT1JNX09TWCkKK3VpbnQ2NF90IHZrdHJhY2VfZ2V0X3RpbWUoKQoreworICAgIGNsb2NrX3NlcnZfdCBjY2xvY2s7CisgICAgbWFjaF90aW1lc3BlY190IG10czsKKyAgICBob3N0X2dldF9jbG9ja19zZXJ2aWNlKG1hY2hfaG9zdF9zZWxmKCksIENBTEVOREFSX0NMT0NLLCAmY2Nsb2NrKTsKKyAgICBjbG9ja19nZXRfdGltZShjY2xvY2ssICZtdHMpOworICAgIG1hY2hfcG9ydF9kZWFsbG9jYXRlKG1hY2hfdGFza19zZWxmKCksIGNjbG9jayk7CisKKyAgICByZXR1cm4gKCh1aW50NjRfdCltdHMudHZfc2VjICogMTAwMDAwMDAwMCkgKyBtdHMudHZfbnNlYzsKK30KKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fV0lORE9XUykKK3VpbnQ2NF90IHZrdHJhY2VfZ2V0X3RpbWUoKQoreworICAgIC8vIFNob3VsZCByZWFsbHkgYXZvaWQgdXNpbmcgUkRUU0MgaGVyZSBzaW5jZSBmb3IgUkRUU0MgdG8gYmUKKyAgICAvLyBhY2N1cmF0ZSwgdGhlIHByb2Nlc3MgbmVlZHMgdG8gc3RheSBvbiB0aGUgc2FtZSBDUFUgYW5kIHRoZSBDUFUKKyAgICAvLyBuZWVkcyB0byBzdGF5IGF0IHRoZSBzYW1lIGNsb2NrIHJhdGUsIHdoaWNoIGlzbid0IGFsd2F5cyB0aGUgY2FzZQorICAgIC8vIHdpdGggdG9kYXkncyBwb3dlciBtYW5hZ2VkIENQVXMuCisgICAgLy8gQnV0IGlmIGFsbCB0aGF0IGlzIE9LLCB0aGUgZm9sbG93aW5nIG9uZS1saW5lciBjb3VsZCBiZSB1c2VkIGluc3RlYWQKKyAgICAvLyBvZiB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIC8vCisgICAgLy8gcmV0dXJuIF9fcmR0c2MoKTsKKyAgICAvLworICAgIExBUkdFX0lOVEVHRVIgY291bnQ7CisgICAgc3RhdGljIExBUkdFX0lOVEVHRVIgc3RhcnQsIGZyZXE7CisgICAgaWYgKDAgPT0gc3RhcnQuUXVhZFBhcnQpIHsKKyAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSk7CisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZzdGFydCk7CisgICAgfQorICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjb3VudCk7CisgICAgLy8gVXNpbmcgYSByZWxhdGl2ZSAoZnJvbSBzdGFydCkgY291bnQgaGVyZSBwb3N0cG9uZXMgb3ZlcmZsb3cgYXMgd2UgY29udmVydCB0byBucy4KKyAgICByZXR1cm4gKHVpbnQ2NF90KSgoKGNvdW50LlF1YWRQYXJ0IC0gc3RhcnQuUXVhZFBhcnQpICogMTAwMDAwMDAwMCkgLyBmcmVxLlF1YWRQYXJ0KTsKK30KKyNlbHNlCit1aW50NjRfdCB2a3RyYWNlX2dldF90aW1lKCkKK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB0cmFjZSBmaWxlIGhlYWRlcgorCit2a3RyYWNlX3RyYWNlX2ZpbGVfaGVhZGVyKiB2a3RyYWNlX2NyZWF0ZV90cmFjZV9maWxlX2hlYWRlcigpCit7CisgICAgdmt0cmFjZV90cmFjZV9maWxlX2hlYWRlciogcEhlYWRlciA9IFZLVFJBQ0VfTkVXKHZrdHJhY2VfdHJhY2VfZmlsZV9oZWFkZXIpOworICAgIG1lbXNldChwSGVhZGVyLCAwLCBzaXplb2Yodmt0cmFjZV90cmFjZV9maWxlX2hlYWRlcikpOworICAgIHBIZWFkZXItPnRyYWNlX2ZpbGVfdmVyc2lvbiA9IFZLVFJBQ0VfVFJBQ0VfRklMRV9WRVJTSU9OOworICAgIHZrdHJhY2VfZ2VuX3V1aWQocEhlYWRlci0+dXVpZCk7CisgICAgcEhlYWRlci0+dHJhY2Vfc3RhcnRfdGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKworICAgIHJldHVybiBwSGVhZGVyOworfQorCit2b2lkIHZrdHJhY2VfZGVsZXRlX3RyYWNlX2ZpbGVfaGVhZGVyKHZrdHJhY2VfdHJhY2VfZmlsZV9oZWFkZXIqKiBwcEhlYWRlcikKK3sKKyAgICB2a3RyYWNlX2ZyZWUoKnBwSGVhZGVyKTsKKyAgICAqcHBIZWFkZXIgPSBOVUxMOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNZXRob2RzIGZvciBjcmVhdGluZywgcG9wdWxhdGluZywgYW5kIHdyaXRpbmcgdHJhY2UgcGFja2V0cworCit2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHZrdHJhY2VfY3JlYXRlX3RyYWNlX3BhY2tldCh1aW50OF90IHRyYWNlcl9pZCwgdWludDE2X3QgcGFja2V0X2lkLCB1aW50NjRfdCBwYWNrZXRfc2l6ZSwgdWludDY0X3QgYWRkaXRpb25hbF9idWZmZXJzX3NpemUpCit7CisgICAgLy8gQWx3YXlzIGFsbG9jYXRlIGF0IGxlYXN0IGVub3VnaCBzcGFjZSBmb3IgdGhlIHBhY2tldCBoZWFkZXIKKyAgICB1aW50NjRfdCB0b3RhbF9wYWNrZXRfc2l6ZSA9IHNpemVvZih2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIpICsgcGFja2V0X3NpemUgKyBhZGRpdGlvbmFsX2J1ZmZlcnNfc2l6ZTsKKyAgICB2b2lkKiBwTWVtb3J5ID0gdmt0cmFjZV9tYWxsb2MoKHNpemVfdCl0b3RhbF9wYWNrZXRfc2l6ZSk7CisgICAgbWVtc2V0KHBNZW1vcnksIDAsIChzaXplX3QpdG90YWxfcGFja2V0X3NpemUpOworCisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciopcE1lbW9yeTsKKyAgICBwSGVhZGVyLT5zaXplID0gdG90YWxfcGFja2V0X3NpemU7CisgICAgcEhlYWRlci0+Z2xvYmFsX3BhY2tldF9pbmRleCA9IGdfcGFja2V0X2luZGV4Kys7CisgICAgcEhlYWRlci0+dHJhY2VyX2lkID0gdHJhY2VyX2lkOworICAgIHBIZWFkZXItPnRocmVhZF9pZCA9IHZrdHJhY2VfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpOworICAgIHBIZWFkZXItPnBhY2tldF9pZCA9IHBhY2tldF9pZDsKKyAgICBpZiAocEhlYWRlci0+dmt0cmFjZV9iZWdpbl90aW1lID09IDApCisgICAgICAgIHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWUgPSBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWU7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9lbmRfdGltZSA9IDA7CisgICAgcEhlYWRlci0+dmt0cmFjZV9lbmRfdGltZSA9IDA7CisgICAgcEhlYWRlci0+bmV4dF9idWZmZXJzX29mZnNldCA9IHNpemVvZih2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIpICsgcGFja2V0X3NpemU7IC8vIGluaXRpYWwgb2Zmc2V0IGlzIGZyb20gc3RhcnQgb2YgaGVhZGVyIHRvIGFmdGVyIHRoZSBwYWNrZXQgYm9keQorICAgIGlmICh0b3RhbF9wYWNrZXRfc2l6ZSA+IHNpemVvZih2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIpKQorICAgIHsKKyAgICAgICAgcEhlYWRlci0+cEJvZHkgPSAodWludHB0cl90KSgoKGNoYXIqKXBNZW1vcnkpICsgc2l6ZW9mKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlcikpOworICAgIH0KKyAgICByZXR1cm4gcEhlYWRlcjsKK30KKwordm9pZCB2a3RyYWNlX2RlbGV0ZV90cmFjZV9wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiogcHBIZWFkZXIpCit7CisgICAgaWYgKHBwSGVhZGVyID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoKnBwSGVhZGVyID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIFZLVFJBQ0VfREVMRVRFKCpwcEhlYWRlcik7CisgICAgKnBwSGVhZGVyID0gTlVMTDsKK30KKwordm9pZCogdmt0cmFjZV90cmFjZV9wYWNrZXRfZ2V0X25ld19idWZmZXJfYWRkcmVzcyh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIHVpbnQ2NF90IGJ5dGVDb3VudCkKK3sKKyAgICB2b2lkKiBwQnVmZmVyU3RhcnQ7CisgICAgYXNzZXJ0KGJ5dGVDb3VudCA+IDApOworICAgIGFzc2VydCgoYnl0ZUNvdW50JjB4MykgPT0gMCk7ICAvLyBBbGwgYnVmZmVyIHNpemVzIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA0IHNvIHN0cnVjdHMgaW4gcGFja2V0IGFyZSBrZXB0IGFsaWduZWQKKyAgICBhc3NlcnQocEhlYWRlci0+c2l6ZSA+PSBwSGVhZGVyLT5uZXh0X2J1ZmZlcnNfb2Zmc2V0ICsgYnl0ZUNvdW50KTsKKyAgICBpZiAocEhlYWRlci0+c2l6ZSA8IHBIZWFkZXItPm5leHRfYnVmZmVyc19vZmZzZXQgKyBieXRlQ291bnQgfHwgYnl0ZUNvdW50ID09IDApCisgICAgeworICAgICAgICAvLyBub3QgZW5vdWdoIG1lbW9yeSBsZWZ0IGluIHBhY2tldCB0byBob2xkIGJ1ZmZlcgorICAgICAgICAvLyBvciByZXF1ZXN0IGlzIGZvciAwIGJ5dGVzCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBCdWZmZXJTdGFydCA9ICh2b2lkKikoKGNoYXIqKXBIZWFkZXIgKyBwSGVhZGVyLT5uZXh0X2J1ZmZlcnNfb2Zmc2V0KTsKKyAgICBwSGVhZGVyLT5uZXh0X2J1ZmZlcnNfb2Zmc2V0ICs9IGJ5dGVDb3VudDsKKyAgICByZXR1cm4gcEJ1ZmZlclN0YXJ0OworfQorCit2b2lkIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyLCB2b2lkKiogcHRyX2FkZHJlc3MsIHVpbnQ2NF90IHNpemUsIGNvbnN0IHZvaWQqIHBCdWZmZXIpCit7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSB2YWxpZCBwb2ludGVycyBhbmQgc2l6ZXMuIEFsbCBwb2ludGVycyBhbmQgc2l6ZXMgbXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4KKyAgICBhc3NlcnQocHRyX2FkZHJlc3MgIT0gTlVMTCk7CisgICAgYXNzZXJ0KChzaXplJjB4MykgPT0gMCk7CisKKyAgICBpZiAocEJ1ZmZlciA9PSBOVUxMIHx8IHNpemUgPT0gMCkKKyAgICB7CisgICAgICAgICpwdHJfYWRkcmVzcyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIHNldCBwdHIgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBhZGRlZCBidWZmZXIKKyAgICAgICAgKnB0cl9hZGRyZXNzID0gdmt0cmFjZV90cmFjZV9wYWNrZXRfZ2V0X25ld19idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCBzaXplKTsKKworICAgICAgICAvLyBhZGRyZXNzIG9mIGJ1ZmZlciBpbiBwYWNrZXQgYWRkaW5nIG11c3QgYmUgNCBieXRlIGFsaWduZWQKKyAgICAgICAgYXNzZXJ0KCgodWludDY0X3QpKnB0cl9hZGRyZXNzJjB4MykgPT0gMCk7CisKKyAgICAgICAgLy8gY29weSBidWZmZXIgdG8gdGhlIGxvY2F0aW9uCisjaWZkZWYgV0lOMzIKKyAgICAgICAgdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5KCpwdHJfYWRkcmVzcywgcEJ1ZmZlciwgKHNpemVfdClzaXplKTsKKyNlbHNlCisgICAgICAgIG1lbWNweSgqcHRyX2FkZHJlc3MsIHBCdWZmZXIsIChzaXplX3Qpc2l6ZSk7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIHZvaWQqKiBwdHJfYWRkcmVzcykKK3sKKyAgICBhc3NlcnQocHRyX2FkZHJlc3MgIT0gTlVMTCk7CisKKyAgICBpZiAoKnB0cl9hZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyB0dXJuIHB0ciBpbnRvIGFuIG9mZnNldCBmcm9tIHRoZSBwYWNrZXQgYm9keQorICAgICAgICB1aW50NjRfdCBvZmZzZXQgPSAodWludDY0X3QpKnB0cl9hZGRyZXNzIC0gKHVpbnQ2NF90KSAocEhlYWRlci0+cEJvZHkpOworICAgICAgICAqcHRyX2FkZHJlc3MgPSAodm9pZCopb2Zmc2V0OworICAgIH0KK30KKwordm9pZCB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZSh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIpCit7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9lbmRfdGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKK30KKwordm9pZCB2a3RyYWNlX2ZpbmFsaXplX3RyYWNlX3BhY2tldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIpCit7CisgICAgaWYgKHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgPT0gMCkKKyAgICB7CisgICAgICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIH0KKyAgICBwSGVhZGVyLT52a3RyYWNlX2VuZF90aW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworfQorCit2b2lkIHZrdHJhY2Vfd3JpdGVfdHJhY2VfcGFja2V0KGNvbnN0IHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciwgRmlsZUxpa2UqIHBGaWxlKQoreworICAgIHN0YXRpYyBpbnQgZXJyb3JDb3VudCA9IDA7CisgICAgQk9PTCByZXMgPSB2a3RyYWNlX0ZpbGVMaWtlX1dyaXRlUmF3KHBGaWxlLCBwSGVhZGVyLCAoc2l6ZV90KXBIZWFkZXItPnNpemUpOworICAgIGlmICghcmVzICYmIHBIZWFkZXItPnBhY2tldF9pZCAhPSBWS1RSQUNFX1RQSV9NQVJLRVJfVEVSTUlOQVRFX1BST0NFU1MgJiYgZXJyb3JDb3VudCA8IDEwKQorICAgIHsKKyAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gc2VuZCB0cmFjZSBwYWNrZXQgaW5kZXggJXUgcGFja2V0SWQgJXUgc2l6ZSAldS4iLCBwSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4LCBwSGVhZGVyLT5wYWNrZXRfaWQsIHBIZWFkZXItPnNpemUpOworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWV0aG9kcyBmb3IgUmVhZGluZyBhbmQgaW50ZXJwcmV0dGluZyB0cmFjZSBwYWNrZXRzCisKK3ZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogdmt0cmFjZV9yZWFkX3RyYWNlX3BhY2tldChGaWxlTGlrZSogcEZpbGUpCit7CisgICAgLy8gcmVhZCBzaXplCisgICAgLy8gYWxsb2NhdGUgc3BhY2UKKyAgICAvLyBvZmZzZXQgdG8gYWZ0ZXIgc2l6ZQorICAgIC8vIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldAorICAgIHVpbnQ2NF90IHRvdGFsX3BhY2tldF9zaXplID0gMDsKKyAgICB2b2lkKiBwTWVtb3J5OworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKworICAgIGlmICh2a3RyYWNlX0ZpbGVMaWtlX1JlYWRSYXcocEZpbGUsICZ0b3RhbF9wYWNrZXRfc2l6ZSwgc2l6ZW9mKHVpbnQ2NF90KSkgPT0gRkFMU0UpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZSBzcGFjZQorICAgIHBNZW1vcnkgPSB2a3RyYWNlX21hbGxvYygoc2l6ZV90KXRvdGFsX3BhY2tldF9zaXplKTsKKyAgICBwSGVhZGVyID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciopcE1lbW9yeTsKKworICAgIGlmIChwSGVhZGVyICE9IE5VTEwpCisgICAgeworICAgICAgICBwSGVhZGVyLT5zaXplID0gdG90YWxfcGFja2V0X3NpemU7CisgICAgICAgIGlmICh2a3RyYWNlX0ZpbGVMaWtlX1JlYWRSYXcocEZpbGUsIChjaGFyKilwSGVhZGVyICsgc2l6ZW9mKHVpbnQ2NF90KSwgKHNpemVfdCl0b3RhbF9wYWNrZXRfc2l6ZSAtIHNpemVvZih1aW50NjRfdCkpID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gcmVhZCB0cmFjZSBwYWNrZXQgd2l0aCBzaXplIG9mICV1LiIsIHRvdGFsX3BhY2tldF9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcEhlYWRlci0+cEJvZHkgPSAodWludHB0cl90KXBIZWFkZXIgKyBzaXplb2Yodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIk1hbGxvYyBmYWlsZWQgaW4gdmt0cmFjZV9yZWFkX3RyYWNlX3BhY2tldCBvZiBzaXplICV1LiIsIHRvdGFsX3BhY2tldF9zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gcEhlYWRlcjsKK30KKwordm9pZCogdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciwgaW50cHRyX3QgcHRyX3ZhcmlhYmxlKQoreworICAgIC8vIHRoZSBwb2ludGVyIHZhcmlhYmxlIGFjdHVhbGx5IGNvbnRhaW5zIGEgYnl0ZSBvZmZzZXQgZnJvbSB0aGUgcGFja2V0IGJvZHkgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisgICAgdWludDY0X3Qgb2Zmc2V0ID0gcHRyX3ZhcmlhYmxlOworICAgIHZvaWQqIGJ1ZmZlcl9sb2NhdGlvbjsKKworICAgIC8vIGlmIHRoZSBvZmZzZXQgaXMgMCwgdGhlbiB3ZSBrbm93IHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2FzIE5VTEwsIHNvIG5vIGJ1ZmZlciBleGlzdHMgYW5kIHdlIHJldHVybiBOVUxMLgorICAgIGlmIChvZmZzZXQgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBidWZmZXJfbG9jYXRpb24gPSAoY2hhciopKHBIZWFkZXItPnBCb2R5KSArIG9mZnNldDsKKyAgICByZXR1cm4gYnVmZmVyX2xvY2F0aW9uOworfQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhMjUyNAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidmt0cmFjZV9tdWx0aXBsYXRmb3JtLmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfaWRlbnRpZmllcnMuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2ZpbGVsaWtlLmgiCisjaW5jbHVkZSAidmt0cmFjZV9tZW1vcnkuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3Byb2Nlc3MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBwVXVpZCBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheSBvZiA0IHVuc2lnbmVkIGludHMKK3ZvaWQgdmt0cmFjZV9nZW5fdXVpZCh1aW50MzJfdCogcFV1aWQpOworCit1aW50NjRfdCB2a3RyYWNlX2dldF90aW1lKCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHRyYWNlIGZpbGUgaGVhZGVyCisKKy8vIHRoZXJlIGlzIGEgZmlsZSBoZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IHRyYWNlIGZpbGUKK3ZrdHJhY2VfdHJhY2VfZmlsZV9oZWFkZXIqIHZrdHJhY2VfY3JlYXRlX3RyYWNlX2ZpbGVfaGVhZGVyKCk7CisKKy8vIGRlbGV0ZXMgdGhlIHRyYWNlIGZpbGUgaGVhZGVyIGFuZCBzZXRzIHBvaW50ZXIgdG8gTlVMTAordm9pZCB2a3RyYWNlX2RlbGV0ZV90cmFjZV9maWxlX2hlYWRlcih2a3RyYWNlX3RyYWNlX2ZpbGVfaGVhZGVyKiogcHBIZWFkZXIpOworCitzdGF0aWMgRklMRSogdmt0cmFjZV93cml0ZV90cmFjZV9maWxlX2hlYWRlcih2a3RyYWNlX3Byb2Nlc3NfaW5mbyogcFByb2NJbmZvKQoreworICAgIEZJTEUqIHRyYWNlZnAgPSBOVUxMOworICAgIHZrdHJhY2VfdHJhY2VfZmlsZV9oZWFkZXIqIHBIZWFkZXIgPSBOVUxMOworICAgIHNpemVfdCBpdGVtc193cml0dGVuID0gMDsKKyAgICBhc3NlcnQocFByb2NJbmZvICE9IE5VTEwpOworCisgICAgLy8gb3BlbiB0cmFjZSBmaWxlCisgICAgdHJhY2VmcCA9IGZvcGVuKHBQcm9jSW5mby0+dHJhY2VGaWxlbmFtZSwgIndiIik7CisgICAgaWYgKHRyYWNlZnAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkNhbm5vdCBvcGVuIHRyYWNlIGZpbGUgZm9yIHdyaXRpbmcgJXMuIiwgcFByb2NJbmZvLT50cmFjZUZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRyYWNlZnA7CisgICAgfQorCisgICAgLy8gcG9wdWxhdGUgaGVhZGVyIGluZm9ybWF0aW9uCisgICAgcEhlYWRlciA9IHZrdHJhY2VfY3JlYXRlX3RyYWNlX2ZpbGVfaGVhZGVyKCk7CisgICAgcEhlYWRlci0+Zmlyc3RfcGFja2V0X29mZnNldCA9IHNpemVvZih2a3RyYWNlX3RyYWNlX2ZpbGVfaGVhZGVyKTsKKyAgICBwSGVhZGVyLT50cmFjZXJfY291bnQgPSAxOworCisKKyAgICBwSGVhZGVyLT50cmFjZXJfaWRfYXJyYXlbMF0uaWQgPSBwUHJvY0luZm8tPnBDYXB0dXJlVGhyZWFkc1swXS50cmFjZXJJZDsKKyAgICBwSGVhZGVyLT50cmFjZXJfaWRfYXJyYXlbMF0uaXNfNjRfYml0ID0gKHNpemVvZihpbnRwdHJfdCkgPT0gOCkgPyAxIDogMDsKKworICAgIC8vIGNyZWF0ZSBjcml0aWNhbCBzZWN0aW9uCisgICAgdmt0cmFjZV9jcmVhdGVfY3JpdGljYWxfc2VjdGlvbigmcFByb2NJbmZvLT50cmFjZUZpbGVDcml0aWNhbFNlY3Rpb24pOworCisgICAgLy8gd3JpdGUgaGVhZGVyIGludG8gZmlsZQorICAgIHZrdHJhY2VfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigmcFByb2NJbmZvLT50cmFjZUZpbGVDcml0aWNhbFNlY3Rpb24pOworICAgIGl0ZW1zX3dyaXR0ZW4gPSBmd3JpdGUocEhlYWRlciwgc2l6ZW9mKHZrdHJhY2VfdHJhY2VfZmlsZV9oZWFkZXIpLCAxLCB0cmFjZWZwKTsKKyAgICB2a3RyYWNlX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oJnBQcm9jSW5mby0+dHJhY2VGaWxlQ3JpdGljYWxTZWN0aW9uKTsKKyAgICBpZiAoaXRlbXNfd3JpdHRlbiAhPSAxKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIHdyaXRlIHRyYWNlIGZpbGUgaGVhZGVyLiIpOworICAgICAgICB2a3RyYWNlX2RlbGV0ZV9jcml0aWNhbF9zZWN0aW9uKCZwUHJvY0luZm8tPnRyYWNlRmlsZUNyaXRpY2FsU2VjdGlvbik7CisgICAgICAgIGZjbG9zZSh0cmFjZWZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHZrdHJhY2VfZGVsZXRlX3RyYWNlX2ZpbGVfaGVhZGVyKCZwSGVhZGVyKTsKKyAgICByZXR1cm4gdHJhY2VmcDsKK307CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdHJhY2UgcGFja2V0cworLy8gVGhlcmUgaXMgYSB0cmFjZV9wYWNrZXRfaGVhZGVyIGJlZm9yZSBldmVyeSB0cmFjZV9wYWNrZXRfYm9keS4KKy8vIEFkZGl0aW9uYWwgYnVmZmVycyB3aWxsIGNvbWUgYWZ0ZXIgdGhlIHRyYWNlX3BhY2tldF9ib2R5LgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNZXRob2RzIGZvciBjcmVhdGluZywgcG9wdWxhdGluZywgYW5kIHdyaXRpbmcgdHJhY2UgcGFja2V0cworCisvLyBccGFyYW0gcGFja2V0X3NpemUgc2hvdWxkIGluY2x1ZGUgdGhlIHRvdGFsIGJ5dGVzIGZvciB0aGUgc3BlY2lmaWMgdHlwZSBvZiBwYWNrZXQsIGFuZCBhbnkgYWRkaXRpb25hbCBidWZmZXJzIG5lZWRlZCBieSB0aGUgcGFja2V0LgorLy8gICAgICAgIFRoZSBzaXplIG9mIHRoZSBoZWFkZXIgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5IHdpdGhpbiB0aGUgZnVuY3Rpb24uCit2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHZrdHJhY2VfY3JlYXRlX3RyYWNlX3BhY2tldCh1aW50OF90IHRyYWNlcl9pZCwgdWludDE2X3QgcGFja2V0X2lkLCB1aW50NjRfdCBwYWNrZXRfc2l6ZSwgdWludDY0X3QgYWRkaXRpb25hbF9idWZmZXJzX3NpemUpOworCisvLyBkZWxldGVzIGEgdHJhY2UgcGFja2V0IGFuZCBzZXRzIHBvaW50ZXIgdG8gTlVMTAordm9pZCB2a3RyYWNlX2RlbGV0ZV90cmFjZV9wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiogcHBIZWFkZXIpOworCisvLyBnZXRzIHRoZSBuZXh0IGFkZHJlc3MgYXZhaWxhYmxlIHRvIHdyaXRlIGEgYnVmZmVyIGludG8gdGhlIHBhY2tldAordm9pZCogdmt0cmFjZV90cmFjZV9wYWNrZXRfZ2V0X25ld19idWZmZXJfYWRkcmVzcyh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIHVpbnQ2NF90IGJ5dGVDb3VudCk7CisKKy8vIGNvcGllcyBidWZmZXIgZGF0YSBpbnRvIGEgdHJhY2UgcGFja2V0IGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IChmcm9tIHRoZSBlbmQgb2YgdGhlIGhlYWRlcikuCisvLyBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IGJ1ZmZlcnMgZG8gbm90IG92ZXJsYXAuCit2b2lkIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyLCB2b2lkKiogcHRyX2FkZHJlc3MsIHVpbnQ2NF90IHNpemUsIGNvbnN0IHZvaWQqIHBCdWZmZXIpOworCisvLyBjb252ZXJ0cyBidWZmZXIgcG9pbnRlcnMgaW50byBieXRlIG9mZnNldCBzbyB0aGF0IHBvaW50ZXIgY2FuIGJlIGludGVycHJldHRlZCBhZnRlciBiZWluZyByZWFkIGludG8gbWVtb3J5Cit2b2lkIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3Modmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyLCB2b2lkKiogcHRyX2FkZHJlc3MpOworCisvLyBzZXRzIGVudHJ5cG9pbnQgZW5kIHRpbWUKK3ZvaWQgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKTsKKworLy92b2lkIGluaXRpYWxpemVfdHJhY2VfcGFja2V0X2hlYWRlcih2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIHVpbnQ4X3QgdHJhY2VyX2lkLCB1aW50MTZfdCBwYWNrZXRfaWQsIHVpbnQ2NF90IHRvdGFsX3BhY2tldF9zaXplKTsKK3ZvaWQgdmt0cmFjZV9maW5hbGl6ZV90cmFjZV9wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKTsKKworLy8gV3JpdGUgdGhlIHRyYWNlIHBhY2tldCB0byB0aGUgZmlsZWxpa2UgdGhpbmcuCisvLyBUaGlzIGhhcyBubyBrbm93bGVkZ2Ugb2YgdGhlIGRldGFpbHMgb2YgdGhlIHBhY2tldCBvdGhlciB0aGFuIGl0cyBzaXplLgordm9pZCB2a3RyYWNlX3dyaXRlX3RyYWNlX3BhY2tldChjb25zdCB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIEZpbGVMaWtlKiBwRmlsZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE1ldGhvZHMgZm9yIFJlYWRpbmcgYW5kIGludGVycHJldHRpbmcgdHJhY2UgcGFja2V0cworCisvLyBSZWFkcyBpbiB0aGUgdHJhY2UgcGFja2V0IGhlYWRlciwgdGhlIGJvZHkgb2YgdGhlIHBhY2tldCwgYW5kIGFkZGl0aW9uYWwgYnVmZmVycwordmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiB2a3RyYWNlX3JlYWRfdHJhY2VfcGFja2V0KEZpbGVMaWtlKiBwRmlsZSk7CisKKy8vIGNvbnZlcnRzIGEgcG9pbnRlciB2YXJpYWJsZSB0aGF0IGlzIGN1cnJlbnRseSBieXRlIG9mZnNldCBpbnRvIGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIG9mZnNldCBsb2NhdGlvbgordm9pZCogdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciwgaW50cHRyX3QgcHRyX3ZhcmlhYmxlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdHJhY2UgcGFja2V0IG1lc3NhZ2UKKy8vIEludGVycHJldHRpbmcgYSB0cmFjZV9wYWNrZXRfbWVzc2FnZSBzaG91bGQgYmUgZG9uZSBvbmx5IHdoZW46CisvLyAxKSBhIHRyYWNlX3BhY2tldCBpcyBmaXJzdCBjcmVhdGVkIGFuZCBtb3N0IG9mIHRoZSBjb250ZW50cyBhcmUgZW1wdHkuCisvLyAyKSBpbW1lZGlhdGVseSBhZnRlciB0aGUgcGFja2V0IHdhcyByZWFkIGZyb20gbWVtb3J5CisvLyBBbGwgb3RoZXIgY29udmVyc2lvbnMgb2YgdGhlIHRyYWNlIHBhY2tldCBib2R5IGZyb20gdGhlIGhlYWRlciBzaG91bGQgCisvLyBiZSBwZXJmb3JtZWQgdXNpbmcgYSBDLXN0eWxlIGNhc3QuCitzdGF0aWMgdmt0cmFjZV90cmFjZV9wYWNrZXRfbWVzc2FnZSogdmt0cmFjZV9pbnRlcnByZXRfYm9keV9hc190cmFjZV9wYWNrZXRfbWVzc2FnZSh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfbWVzc2FnZSogcFBhY2tldCA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9tZXNzYWdlKilwSGVhZGVyLT5wQm9keTsKKyAgICAvLyB1cGRhdGUgcG9pbnRlcnMKKyAgICBwUGFja2V0LT5wSGVhZGVyID0gcEhlYWRlcjsKKyAgICBwUGFja2V0LT5tZXNzYWdlID0gKGNoYXIqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+bWVzc2FnZSk7CisgICAgcmV0dXJuIHBQYWNrZXQ7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3RyYWNlbG9nLmMgYi92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi92a3RyYWNlX3RyYWNlbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMWEyNAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2Vsb2cuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKi8KKworI2luY2x1ZGUgInZrdHJhY2VfcGxhdGZvcm0uaCIKKworI2luY2x1ZGUgInZrdHJhY2VfdHJhY2Vsb2cuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF91dGlscy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLy8gZmlsZWxpa2UgdGhpbmcgdGhhdCBpcyB1c2VkIGZvciBvdXRwdXR0aW5nIHRyYWNlIG1lc3NhZ2VzCitzdGF0aWMgRmlsZUxpa2UqIGdfcEZpbGVPdXQgPSBOVUxMOworCitWS1RSQUNFX1RSQUNFUl9JRCBnX3RyYWNlbG9nX3RyYWNlcl9pZCA9IFZLVFJBQ0VfVElEX1JFU0VSVkVEOworCit2b2lkIHZrdHJhY2VfdHJhY2Vfc2V0X3RyYWNlX2ZpbGUoRmlsZUxpa2UqIHBGaWxlTGlrZSkKK3sKKyAgICBnX3BGaWxlT3V0ID0gcEZpbGVMaWtlOworfQorCisvLyBzZXQgaW5pdGlhbCB2YWx1ZSB0byAwIGJ1dCBvbmNlIHdlIHJlYWQgdGhlIHRyYWNlIGZpbGUgdmVyc2lvbgorLy8gd2Ugd2lsbCB1cGRhdGUgdGhpcyBhbmQgdXNlIGZvciB2ZXJzaW9uIGNoZWNrcworc3RhdGljIHVpbnQzMl90IGdfdHJhY2VfdmVyc2lvbl9udW0gPSAwOworCit2b2lkIHZrdHJhY2Vfc2V0X3RyYWNlX3ZlcnNpb24odWludDMyX3QgdmVyc2lvbikKK3sKKyAgICBnX3RyYWNlX3ZlcnNpb25fbnVtID0gdmVyc2lvbjsKK30KKworQk9PTCB2a3RyYWNlX2NoZWNrX21pbl92ZXJzaW9uKHVpbnQzMl90IHZlcnNpb24pCit7CisgICAgcmV0dXJuICgoZ190cmFjZV92ZXJzaW9uX251bSkgPj0gKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKTsKK30KKworRmlsZUxpa2UqIHZrdHJhY2VfdHJhY2VfZ2V0X3RyYWNlX2ZpbGUoKQoreworICAgIHJldHVybiBnX3BGaWxlT3V0OworfQorCit2b2lkIHZrdHJhY2VfdHJhY2Vsb2dfc2V0X3RyYWNlcl9pZCh1aW50OF90IHRyYWNlcklkKQoreworICAgIGdfdHJhY2Vsb2dfdHJhY2VyX2lkID0gKFZLVFJBQ0VfVFJBQ0VSX0lEKXRyYWNlcklkOworfQorCitWS1RSQUNFX1JFUE9SVF9DQUxMQkFDS19GVU5DVElPTiBzX3JlcG9ydEZ1bmM7CitWa3RyYWNlTG9nTGV2ZWwgc19sb2dMZXZlbCA9IFZLVFJBQ0VfTE9HX0VSUk9SOworCitjb25zdCBjaGFyKiB2a3RyYWNlX0xvZ0xldmVsVG9TdHJpbmcoVmt0cmFjZUxvZ0xldmVsIGxldmVsKQoreworICAgIHN3aXRjaChsZXZlbCkKKyAgICB7CisgICAgY2FzZSBWS1RSQUNFX0xPR19OT05FOiByZXR1cm4gIlF1aWV0IjsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0RFQlVHOiByZXR1cm4gIkRlYnVnIjsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0VSUk9SOiByZXR1cm4gIkVycm9ycyI7CisgICAgY2FzZSBWS1RSQUNFX0xPR19XQVJOSU5HOiByZXR1cm4gIldhcm5pbmdzIjsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX1ZFUkJPU0U6IHJldHVybiAiSW5mbyI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVbmtub3duIjsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIHZrdHJhY2VfTG9nTGV2ZWxUb1Nob3J0U3RyaW5nKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCkKK3sKKyAgICBzd2l0Y2gobGV2ZWwpCisgICAgeworICAgIGNhc2UgVktUUkFDRV9MT0dfTk9ORTogcmV0dXJuICJRdWlldCI7CisgICAgY2FzZSBWS1RSQUNFX0xPR19ERUJVRzogcmV0dXJuICJEZWJ1ZyI7CisgICAgY2FzZSBWS1RSQUNFX0xPR19FUlJPUjogcmV0dXJuICJFcnJvcnMiOworICAgIGNhc2UgVktUUkFDRV9MT0dfV0FSTklORzogcmV0dXJuICJXYXJuaW5ncyI7CisgICAgY2FzZSBWS1RSQUNFX0xPR19WRVJCT1NFOiByZXR1cm4gIkluZm8iOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVW5rbm93biI7CisgICAgfQorfQorCisKKy8vIEZvciB1c2UgYnkgYm90aCB0b29scyBhbmQgbGlicmFyaWVzLgordm9pZCB2a3RyYWNlX0xvZ1NldENhbGxiYWNrKFZLVFJBQ0VfUkVQT1JUX0NBTExCQUNLX0ZVTkNUSU9OIHBDYWxsYmFjaykKK3sKKyAgICBzX3JlcG9ydEZ1bmMgPSBwQ2FsbGJhY2s7Cit9CisKK3ZvaWQgdmt0cmFjZV9Mb2dTZXRMZXZlbChWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwpCit7CisgICAgdmt0cmFjZV9Mb2dEZWJ1ZygiTG9nIExldmVsID0gJXUgKCVzKSIsIGxldmVsLCB2a3RyYWNlX0xvZ0xldmVsVG9TdHJpbmcobGV2ZWwpKTsKKyAgICBzX2xvZ0xldmVsID0gbGV2ZWw7Cit9CisKK0JPT0wgdmt0cmFjZV9Mb2dJc0xvZ2dpbmcoVmt0cmFjZUxvZ0xldmVsIGxldmVsKQoreworICAgIHJldHVybiAobGV2ZWwgPD0gc19sb2dMZXZlbCkgPyBUUlVFIDogRkFMU0U7Cit9CisKK3ZvaWQgTG9nR3V0cyhWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKQoreworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICAgIGludCByZXF1aXJlZExlbmd0aCA9IF92c2NwcmludGYoZm10LCBhcmdzKSArIDE7CisjZWxpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSB8fCBkZWZpbmVkKFBMQVRGT1JNX09TWCkKKyAgICAgICAgaW50IHJlcXVpcmVkTGVuZ3RoOworICAgICAgICB2YV9saXN0IGFyZ2NvcHk7CisgICAgICAgIHZhX2NvcHkoYXJnY29weSwgYXJncyk7CisgICAgICAgIHJlcXVpcmVkTGVuZ3RoID0gdnNucHJpbnRmKE5VTEwsIDAsIGZtdCwgYXJnY29weSkgKyAxOworICAgICAgICB2YV9lbmQoYXJnY29weSk7CisjZW5kaWYKKyAgICBzdGF0aWMgVktUUkFDRV9USFJFQURfTE9DQUwgQk9PTCBsb2dnaW5nID0gRkFMU0U7CisKKyAgICAvLyBEb24ndCByZWN1cnNpdmVseSBsb2cgcHJvYmxlbXMgZm91bmQgZHVyaW5nIGxvZ2dpbmcKKyAgICBpZiAobG9nZ2luZykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9nZ2luZyA9IFRSVUU7CisKKyAgICBjaGFyKiBtZXNzYWdlID0gKGNoYXIqKXZrdHJhY2VfbWFsbG9jKHJlcXVpcmVkTGVuZ3RoKTsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIF92c25wcmludGZfcyhtZXNzYWdlLCByZXF1aXJlZExlbmd0aCwgcmVxdWlyZWRMZW5ndGggLSAxLCBmbXQsIGFyZ3MpOworI2VsaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgfHwgZGVmaW5lZChQTEFURk9STV9PU1gpCisgICAgdnNucHJpbnRmKG1lc3NhZ2UsIHJlcXVpcmVkTGVuZ3RoLCBmbXQsIGFyZ3MpOworI2VuZGlmCisKKyAgICBpZiAoc19yZXBvcnRGdW5jICE9IE5VTEwpCisgICAgeworICAgICAgICBzX3JlcG9ydEZ1bmMobGV2ZWwsIG1lc3NhZ2UpOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgInZrdHJhY2UiLCAiJXM6ICVzXG4iLCB2a3RyYWNlX0xvZ0xldmVsVG9TdHJpbmcobGV2ZWwpLCBtZXNzYWdlKTsKKyNlbHNlCisgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCB2a3RyYWNlX0xvZ0xldmVsVG9TdHJpbmcobGV2ZWwpLCBtZXNzYWdlKTsKKyNlbmRpZgorICAgIH0KKworICAgIHZrdHJhY2VfZnJlZShtZXNzYWdlKTsKKyAgICBsb2dnaW5nID0gRkFMU0U7Cit9CisKK3ZvaWQgdmt0cmFjZV9Mb2dBbHdheXMoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgTG9nR3V0cyhWS1RSQUNFX0xPR19WRVJCT1NFLCBmb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCB2a3RyYWNlX0xvZ0RlYnVnKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKQoreworI2lmIGRlZmluZWQoX0RFQlVHKQorCWlmICh2a3RyYWNlX0xvZ0lzTG9nZ2luZyhWS1RSQUNFX0xPR19ERUJVRykpCisJeworCQl2YV9saXN0IGFyZ3M7CisJICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJICAgIExvZ0d1dHMoVktUUkFDRV9MT0dfREVCVUcsIGZvcm1hdCwgYXJncyk7CisJICAgIHZhX2VuZChhcmdzKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCB2a3RyYWNlX0xvZ0Vycm9yKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKQoreworICAgIGlmICh2a3RyYWNlX0xvZ0lzTG9nZ2luZyhWS1RSQUNFX0xPR19FUlJPUikpCisgICAgeworICAgICAgICB2YV9saXN0IGFyZ3M7CisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgICAgIExvZ0d1dHMoVktUUkFDRV9MT0dfRVJST1IsIGZvcm1hdCwgYXJncyk7CisgICAgICAgIHZhX2VuZChhcmdzKTsKKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZV9Mb2dXYXJuaW5nKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKQoreworICAgIGlmICh2a3RyYWNlX0xvZ0lzTG9nZ2luZyhWS1RSQUNFX0xPR19XQVJOSU5HKSkKKyAgICB7CisgICAgICAgIHZhX2xpc3QgYXJnczsKKyAgICAgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICAgICAgTG9nR3V0cyhWS1RSQUNFX0xPR19XQVJOSU5HLCBmb3JtYXQsIGFyZ3MpOworICAgICAgICB2YV9lbmQoYXJncyk7CisgICAgfQorfQorCit2b2lkIHZrdHJhY2VfTG9nVmVyYm9zZShjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikKK3sKKyAgICBpZiAodmt0cmFjZV9Mb2dJc0xvZ2dpbmcoVktUUkFDRV9MT0dfVkVSQk9TRSkpCisgICAgeworICAgICAgICB2YV9saXN0IGFyZ3M7CisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgICAgIExvZ0d1dHMoVktUUkFDRV9MT0dfVkVSQk9TRSwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2Vsb2cuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfY29tbW9uL3ZrdHJhY2VfdHJhY2Vsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODQ3NzZmCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vdmt0cmFjZV90cmFjZWxvZy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgRmlsZUxpa2UgRmlsZUxpa2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgVktUUkFDRV9MT0dfTk9ORSA9IDAsCisgICAgVktUUkFDRV9MT0dfRVJST1IsCisgICAgVktUUkFDRV9MT0dfV0FSTklORywKKyAgICBWS1RSQUNFX0xPR19WRVJCT1NFLAorICAgIFZLVFJBQ0VfTE9HX0RFQlVHCit9IFZrdHJhY2VMb2dMZXZlbDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitjb25zdCBjaGFyKiB2a3RyYWNlX0xvZ0xldmVsVG9TdHJpbmcoVmt0cmFjZUxvZ0xldmVsIGxldmVsKTsKK2NvbnN0IGNoYXIqIHZrdHJhY2VfTG9nTGV2ZWxUb1Nob3J0U3RyaW5nKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCk7CisKK3ZvaWQgdmt0cmFjZV90cmFjZV9zZXRfdHJhY2VfZmlsZShGaWxlTGlrZSogcEZpbGVMaWtlKTsKK0ZpbGVMaWtlKiB2a3RyYWNlX3RyYWNlX2dldF90cmFjZV9maWxlKCk7Cit2b2lkIHZrdHJhY2VfdHJhY2Vsb2dfc2V0X3RyYWNlcl9pZCh1aW50OF90IHRyYWNlcklkKTsKKwordm9pZCB2a3RyYWNlX3NldF90cmFjZV92ZXJzaW9uKHVpbnQzMl90IHZlcnNpb24pOworQk9PTCB2a3RyYWNlX2NoZWNrX21pbl92ZXJzaW9uKHVpbnQzMl90IHZlcnNpb24pOworCisvLyBMb2dnaW5nIGlzIGRvbmUgYnkgcmVwb3J0aW5nIHRoZSBtZXNzYWdlcyBiYWNrIHRvIGEgY2FsbGJhY2suCisvLyBQbHVnaW5zIHNob3VsZCByZWdpc3RlciBhIGNhbGxiYWNrIGZyb20gdGhlIHBhcmVudCB0b29sOworLy8gVG9vbHMgc2hvdWxkIHJlZ2lzdGVyIHRoZWlyIG93biBjYWxsYmFjayBzbyB0aGF0IHRoZXkgY2FuIG91dHB1dCBtZXNzYWdlcyBhcyBkZXNpcmVkLgordHlwZWRlZiB2b2lkICgqVktUUkFDRV9SRVBPUlRfQ0FMTEJBQ0tfRlVOQ1RJT04pKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogcE1zZyk7CitleHRlcm4gVktUUkFDRV9SRVBPUlRfQ0FMTEJBQ0tfRlVOQ1RJT04gc19yZXBvcnRGdW5jOworZXh0ZXJuIFZrdHJhY2VMb2dMZXZlbCBzX2xvZ0xldmVsOworCit2b2lkIHZrdHJhY2VfTG9nU2V0Q2FsbGJhY2soVktUUkFDRV9SRVBPUlRfQ0FMTEJBQ0tfRlVOQ1RJT04gcENhbGxiYWNrKTsKK3ZvaWQgdmt0cmFjZV9Mb2dTZXRMZXZlbChWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwpOworCisvLyBBbGxvd3MgY2hlY2tpbmcgaWYgYSBsZXZlbCBpcyBiZWluZyBsb2dnZWQgc28gdGhhdCBzdHJpbmctcmVsYXRlZCBmdW5jdGlvbnMKKy8vIGNhbiBiZSBza2lwcGVkIGlmIHRoZXkgd2lsbCBub3QgcmVwb3J0ZWQuCitCT09MIHZrdHJhY2VfTG9nSXNMb2dnaW5nKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCk7CisKKy8vIEFsd2F5cyBsb2cgdGhlIG1lc3NhZ2UsIG5vIG1hdHRlciB3aGF0IHRoZSBSZXBvcnRpbmdMZXZlbCBpcy4KK3ZvaWQgdmt0cmFjZV9Mb2dBbHdheXMoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworCisvLyBMb2cgZGVidWcgaW5mb3JtYXRpb24gdGhhdCBpcyBwcmltYXJpbHkgaGVscGZ1bCBmb3IgVmt0cmFjZSBkZXZlbG9wZXJzCisvLyBhbmQgd2lsbCBvbmx5IGFwcGVhciBpbiBfREVCVUcgYnVpbGRzLgorLy8gVGhpcyB3aWxsIGFsc28gYWx3YXlzIGJlIGxvZ2dlZCwgbm8gbWF0dGVyIHdoYXQgdGhlIFJlcG9ydGluZ0xldmVsIGlzLgordm9pZCB2a3RyYWNlX0xvZ0RlYnVnKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKKworLy8gTG9nIGFuIGVycm9yIG1lc3NhZ2UuCit2b2lkIHZrdHJhY2VfTG9nRXJyb3IoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworCisvLyBMb2cgYSB3YXJuaW5nLgordm9pZCB2a3RyYWNlX0xvZ1dhcm5pbmcoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworCisvLyBMb2cgYW55IG1pc2MgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGEgdXNlciB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uCit2b2lkIHZrdHJhY2VfTG9nVmVyYm9zZShjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2NvbW1vbi93aW50eXBlcy5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vd2ludHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGNiZDUyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9jb21tb24vd2ludHlwZXMuaApAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjcHJhZ21hIG9uY2UKKworI2lmICBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+Cit0eXBlZGVmIHZvaWQgKiBMUFZPSUQ7Cit0eXBlZGVmIHZvaWQgKiBQVk9JRDsKK3R5cGVkZWYgdm9pZCBWT0lEOwordHlwZWRlZiBjaGFyIENIQVI7Cit0eXBlZGVmIGNoYXIgVENIQVI7Cit0eXBlZGVmIGxvbmcgTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKK3R5cGVkZWYgaW50IEJPT0w7Cit0eXBlZGVmIHNpemVfdCBTSVpFX1Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRFdPUkQ7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQllURTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqUEJZVEU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVQ0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgV09SRDsKK3R5cGVkZWYgRFdPUkQgKiBEV09SRF9QVFI7Cit0eXBlZGVmIERXT1JEICpQRFdPUkQ7Cit0eXBlZGVmIERXT1JEX1BUUiAqUERXT1JEX1BUUjsKK3R5cGVkZWYgaW50MzJfdCBJTlQzMjsKK3R5cGVkZWYgaW50NjRfdCBMT05HNjQ7Cit0eXBlZGVmIHVpbnQ2NF90IFVMT05HNjQ7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKiBQQ1NUUjsKK3R5cGVkZWYgY29uc3Qgd2NoYXJfdCAqIFBDV1NUUjsKKyNpZm5kZWYgTUFYX1BBVEgKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZm5kZWYgUEFUSF9NQVgKKyNkZWZpbmUgTUFYX1BBVEggNDA5NgorI2Vsc2UKKyNkZWZpbmUgTUFYX1BBVEggUEFUSF9NQVgKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNlbGlmIFdJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL0NNYWtlTGlzdHMudHh0IGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0MmMyNgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNzkgQEAKK1BST0pFQ1Qodmt0cmFjZXZ1bGthbikKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpCisKKyNpbmNsdWRlKEZpbmRQa2dDb25maWcpCisKK2lmICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJMaW51eCIpCisgICAgc2V0KFBZVEhPTl9DTUQgInB5dGhvbjMiKQorZWxzZSgpCisgICAgc2V0KFBZVEhPTl9DTUQgInB5IikKK2VuZGlmKCkKKworCisjIGlmIFZrdHJhY2UgaXMgYmVpbmcgYnVpbHQgYXMgcGFydCBvZiBhIHZ1bGthbiBkcml2ZXIgYnVpbGQsIHRoZW4gdXNlIHRoYXQgdGFyZ2V0IGluc3RlYWQgb2YgdGhlIGxvY2FsbHktY29tbWl0ZWQgYmluYXJ5LgorI2lmIChUQVJHRVQgdnVsa2FuKQorIyAgICBtZXNzYWdlKFNUQVRVUyAiVXNpbmcgZXh0ZXJuYWwgVnVsa2FuIGhlYWRlciBhbmQgbGlicmFyeS4iKQorIyAgICBzZXQoVktUUkFDRV9WVUxLQU5fTElCIHZ1bGthbikKKyAgICBzZXQoVktUUkFDRV9WVUxLQU5fRFJJVkVSX0RJUiAke0NNQUtFX1NPVVJDRV9ESVJ9KQorICAgIHNldChWS1RSQUNFX1ZVTEtBTl9JTkNMVURFX0RJUiAke0NNQUtFX1NPVVJDRV9ESVJ9L2luY2x1ZGUvdnVsa2FuKQorICAgIHNldChWS1RSQUNFX1ZVTEtBTl9IRUFERVIgJHtDTUFLRV9TT1VSQ0VfRElSfS9pbmNsdWRlL3Z1bGthbi92dWxrYW4uaCkKKyAgICAjc2V0KFZLVFJBQ0VfVlVMS0FOX0xVTkFSR19ERUJVR19NQVJLRVJfSEVBREVSICR7VktUUkFDRV9WVUxLQU5fSU5DTFVERV9ESVJ9L3ZrX2x1bmFyZ19kZWJ1Z19tYXJrZXIuaCkKKyNlbHNlKCkKKyAgICAjIFVzZSBhIGxvY2FsbHkgY29tbWl0dGVkIHZ1bGthbiBoZWFkZXIgYW5kIGJpbmFyeQorIyAgICBtZXNzYWdlKFNUQVRVUyAiVXNpbmcgVmt0cmFjZS1zdXBwbGllZCBWdWxrYW4gaGVhZGVyIGFuZCBsaWJyYXJ5LiIpCisjICAgIHNldChWS1RSQUNFX1ZVTEtBTl9EUklWRVJfRElSICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS92dWxrYW4pCisjICAgIHNldChWS1RSQUNFX1ZVTEtBTl9JTkNMVURFX0RJUiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdnVsa2FuL2luY2x1ZGUpCisjICAgIHNldChWS1RSQUNFX1ZVTEtBTl9IRUFERVIgJHtWS1RSQUNFX1ZVTEtBTl9JTkNMVURFX0RJUn0vdnVsa2FuL3Z1bGthbi5oKQorIyAgICBzZXQoVktUUkFDRV9WVUxLQU5fREVCVUdfUkVQT1JUX0xVTkFSR19IRUFERVIgJHtWS1RSQUNFX1ZVTEtBTl9JTkNMVURFX0RJUn0vdmtfZGVidWdfcmVwb3J0X2x1bmFyZy5oKQorCitpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiV2luZG93cyIpCisgICBpZiAoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIl5WaXN1YWwgU3R1ZGlvLioiKQorICAgICAgc2V0KFZLVFJBQ0VfVlVMS0FOX0xJQgorICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS9sb2FkZXIvJHtDTUFLRV9DRkdfSU5URElSfS92dWxrYW4tMS5saWIKKyAgICAgICAgICkKKyAgIGVsc2UoKQorICAgICAgc2V0KFZLVFJBQ0VfVlVMS0FOX0xJQgorICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS9sb2FkZXIvdnVsa2FuLTEubGliCisgICAgICAgICApCisgICBlbmRpZigpCitlbmRpZigpCisKK2lmICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJMaW51eCIgT1IKKyAgICAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iICkKKyAgICBzZXQoVktUUkFDRV9WVUxLQU5fTElCCisgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0vbG9hZGVyL2xpYnZ1bGthbi5zbworICAgICkKKworZW5kaWYoKQorCittZXNzYWdlKFNUQVRVUyAiVktUUkFDRV9WVUxLQU5fTElCID0gIiAke1ZLVFJBQ0VfVlVMS0FOX0xJQn0pCisjbWVzc2FnZShTVEFUVVMgIlZLVFJBQ0VfVlVMS0FOX0RSSVZFUl9ESVIgPSAiICR7VktUUkFDRV9WVUxLQU5fRFJJVkVSX0RJUn0pCisjbWVzc2FnZShTVEFUVVMgIlZLVFJBQ0VfVlVMS0FOX0hFQURFUiA9ICIgJHtWS1RSQUNFX1ZVTEtBTl9IRUFERVJ9KQorCisjIFJ1biBhIGNvZGVnZW4gc2NyaXB0IHRvIGdlbmVyYXRlIHV0aWxpdGllcyB0aGF0IGFyZSB2dWxrYW4tc3BlY2lmaWMsIGRlcGVuZGVudCBvbiB0aGUgdnVsa2FuIGhlYWRlciBmaWxlcywgYW5kIG1heSBiZSBzaGFyZWQgYnkgdGhlIHRyYWNlciwgcmVwbGF5ZXIsIG9yIGRlYnVnZ2VyLgorIyBHZW5lcmFsbHksIHRoZXNlIGFyZSBsaWtlbHkgdG8gYmUgdGhpbmdzIHRoYXQgU0hPVUxEIGJlIHByb3ZpZGVkIGJ5IHRoZSB2dWxrYW4gU0RLLgorc2V0KFZLVFJBQ0VfVlVMS0FOX0NPREVHRU5fVVRJTFMgInZ1bGthbi9jb2RlZ2VuX3V0aWxzIikKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7VktUUkFDRV9WVUxLQU5fQ09ERUdFTl9VVElMU30pCisKKyMgZ2VuZXJhdGUgZmlsZXMgZm9yIHZ1bGthbi5oCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1ZLVFJBQ0VfVlVMS0FOX0RSSVZFUl9ESVJ9L3ZrX2hlbHBlci5weSAtLWdlbl9zdHJ1Y3Rfc2l6ZXMgJHtWS1RSQUNFX1ZVTEtBTl9IRUFERVJ9IC0tYWJzX291dF9kaXIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7VktUUkFDRV9WVUxLQU5fQ09ERUdFTl9VVElMU30pCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1ZLVFJBQ0VfVlVMS0FOX0RSSVZFUl9ESVJ9L3ZrX2hlbHBlci5weSAtLWdlbl9lbnVtX3N0cmluZ19oZWxwZXIgJHtWS1RSQUNFX1ZVTEtBTl9IRUFERVJ9IC0tYWJzX291dF9kaXIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7VktUUkFDRV9WVUxLQU5fQ09ERUdFTl9VVElMU30pCisKKyMgZ2VuZXJhdGUgZmlsZXMgZm9yIHZrX2x1bmFyZ19kZWJ1Z19tYXJrZXIuaAorI2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7VktUUkFDRV9WVUxLQU5fRFJJVkVSX0RJUn0vdmtfaGVscGVyLnB5IC0tZ2VuX3N0cnVjdF9zaXplcyAke1ZLVFJBQ0VfVlVMS0FOX0xVTkFSR19ERUJVR19NQVJLRVJfSEVBREVSfSAtLWFic19vdXRfZGlyICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke1ZLVFJBQ0VfVlVMS0FOX0NPREVHRU5fVVRJTFN9KQorI2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7VktUUkFDRV9WVUxLQU5fRFJJVkVSX0RJUn0vdmtfaGVscGVyLnB5IC0tZ2VuX2VudW1fc3RyaW5nX2hlbHBlciAke1ZLVFJBQ0VfVlVMS0FOX0xVTkFSR19ERUJVR19NQVJLRVJfSEVBREVSfSAtLWFic19vdXRfZGlyICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke1ZLVFJBQ0VfVlVMS0FOX0NPREVHRU5fVVRJTFN9KQorCisjIFJ1biBhIGNvZGVnZW4gc2NyaXB0IHRvIGdlbmVyYXRlIHZrdHJhY2Utc3BlY2lmaWMgdnVsa2FuIHV0aWxzCitzZXQoQ09ERUdFTl9WS1RSQUNFX0RJUiAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvZGVnZW5fdmt0cmFjZV91dGlscyIpCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q09ERUdFTl9WS1RSQUNFX0RJUn0pCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1ZLVFJBQ0VfVlVMS0FOX0RJUn0vdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1wYWNrZXQtaWQgVktfVkVSU0lPTl8xXzAgT1VUUFVUX0ZJTEUgJHtDT0RFR0VOX1ZLVFJBQ0VfRElSfS92a3RyYWNlX3ZrX3BhY2tldF9pZC5oKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtWS1RSQUNFX1ZVTEtBTl9ESVJ9L3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtY29yZS10cmFjZS1wYWNrZXRzIFZLX1ZFUlNJT05fMV8wIE9VVFBVVF9GSUxFICR7Q09ERUdFTl9WS1RSQUNFX0RJUn0vdmt0cmFjZV92a192a19wYWNrZXRzLmgpCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1ZLVFJBQ0VfVlVMS0FOX0RJUn0vdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1leHQtdHJhY2UtcGFja2V0cyB2a19sdW5hcmdfZGVidWdfbWFya2VyIE9VVFBVVF9GSUxFICR7Q09ERUdFTl9WS1RSQUNFX0RJUn0vdmt0cmFjZV92a192a19sdW5hcmdfZGVidWdfbWFya2VyX3BhY2tldHMuaCkKKworIyBEaXJlY3RvcmllcyB3aGljaCBhY3R1YWxseSBjb250YWluIHZ1bGthbi1zcGVjaWZpYyB2a3RyYWNlIHBsdWdpbnMuCithZGRfc3ViZGlyZWN0b3J5KHZrcmVwbGF5LykKKyMgT25seSBidWlsZCB2a3RyYWNldmlld2VyIHdoZW4gUXQ1IGlzIGF2YWlsYWJsZQoraWYgKFF0NV9GT1VORCBBTkQgQlVJTERfVktUUkFDRVZJRVdFUikKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHZrdHJhY2V2aWV3ZXIvKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi9sYXllcnMvbGF5ZXJzX2NvbmZpZy5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi9sYXllcnMvbGF5ZXJzX2NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3ZmJmMgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL2xheWVycy9sYXllcnNfY29uZmlnLmNwcApAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2a0xheWVyLmg+CisjaW5jbHVkZSAibG9hZGVyX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAibGF5ZXJzX2NvbmZpZy5oIgorLy8gVGhlIGZvbGxvd2luZyBpcyAjaW5jbHVkZWQgYWdhaW4gdG8gY2F0Y2ggY2VydGFpbiBPUy1zcGVjaWZpYyBmdW5jdGlvbnMKKy8vIGJlaW5nIHVzZWQ6CisjaW5jbHVkZSAibG9hZGVyX3BsYXRmb3JtLmgiCisKKyNkZWZpbmUgTUFYX0NIQVJTX1BFUl9MSU5FIDQwOTYKKworY2xhc3MgQ29uZmlnRmlsZQoreworcHVibGljOgorICAgIENvbmZpZ0ZpbGUoKTsKKyAgICB+Q29uZmlnRmlsZSgpOworCisgICAgY29uc3QgY2hhciAqZ2V0T3B0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZfb3B0aW9uKTsKKyAgICB2b2lkIHNldE9wdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmX29wdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcgJl92YWwpOworCitwcml2YXRlOgorICAgIGJvb2wgbV9maWxlSXNQYXJzZWQ7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtX3ZhbHVlTWFwOworCisgICAgdm9pZCBwYXJzZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworfTsKKworc3RhdGljIENvbmZpZ0ZpbGUgZ19jb25maWdGaWxlT2JqOworCitzdGF0aWMgdW5zaWduZWQgaW50IGNvbnZlcnRTdHJpbmdFbnVtVmFsKGNvbnN0IGNoYXIgKl9lbnVtKQoreworICAgIC8vIG9ubHkgaGFuZGxlcyBzaW5nbGUgZW51bSB2YWx1ZXMKKyAgICBpZiAoIXN0cmNtcChfZW51bSwgIlZLX0RCR19MQVlFUl9BQ1RJT05fSUdOT1JFIikpCisgICAgICAgIHJldHVybiBWS19EQkdfTEFZRVJfQUNUSU9OX0lHTk9SRTsKKyAgICBlbHNlIGlmICghc3RyY21wKF9lbnVtLCAiVktfREJHX0xBWUVSX0FDVElPTl9DQUxMQkFDSyIpKQorICAgICAgICByZXR1cm4gVktfREJHX0xBWUVSX0FDVElPTl9DQUxMQkFDSzsKKyAgICBlbHNlIGlmICghc3RyY21wKF9lbnVtLCAiVktfREJHX0xBWUVSX0FDVElPTl9MT0dfTVNHIikpCisgICAgICAgIHJldHVybiBWS19EQkdfTEFZRVJfQUNUSU9OX0xPR19NU0c7CisgICAgZWxzZSBpZiAoIXN0cmNtcChfZW51bSwgIlZLX0RCR19MQVlFUl9BQ1RJT05fQlJFQUsiKSkKKyAgICAgICAgcmV0dXJuIFZLX0RCR19MQVlFUl9BQ1RJT05fQlJFQUs7CisgICAgZWxzZSBpZiAoIXN0cmNtcChfZW51bSwgIlZLX0RCR19MQVlFUl9MRVZFTF9JTkZPIikpCisgICAgICAgIHJldHVybiBWS19EQkdfTEFZRVJfTEVWRUxfSU5GTzsKKyAgICBlbHNlIGlmICghc3RyY21wKF9lbnVtLCAiVktfREJHX0xBWUVSX0xFVkVMX1dBUk4iKSkKKyAgICAgICAgcmV0dXJuIFZLX0RCR19MQVlFUl9MRVZFTF9XQVJOOworICAgIGVsc2UgaWYgKCFzdHJjbXAoX2VudW0sICJWS19EQkdfTEFZRVJfTEVWRUxfUEVSRl9XQVJOIikpCisgICAgICAgIHJldHVybiBWS19EQkdfTEFZRVJfTEVWRUxfUEVSRl9XQVJOOworICAgIGVsc2UgaWYgKCFzdHJjbXAoX2VudW0sICJWS19EQkdfTEFZRVJfTEVWRUxfRVJST1IiKSkKKyAgICAgICAgcmV0dXJuIFZLX0RCR19MQVlFUl9MRVZFTF9FUlJPUjsKKyAgICBlbHNlIGlmICghc3RyY21wKF9lbnVtLCAiVktfREJHX0xBWUVSX0xFVkVMX05PTkUiKSkKKyAgICAgICAgcmV0dXJuIFZLX0RCR19MQVlFUl9MRVZFTF9OT05FOworICAgIHJldHVybiAwOworfQorY29uc3QgY2hhciAqZ2V0TGF5ZXJPcHRpb24oY29uc3QgY2hhciAqX29wdGlvbikKK3sKKyAgICByZXR1cm4gZ19jb25maWdGaWxlT2JqLmdldE9wdGlvbihfb3B0aW9uKTsKK30KKworYm9vbCBnZXRMYXllck9wdGlvbkVudW0oY29uc3QgY2hhciAqX29wdGlvbiwgdWludDMyX3QgKm9wdGlvbkRlZmF1bHQpCit7CisgICAgYm9vbCByZXM7CisgICAgY29uc3QgY2hhciAqb3B0aW9uID0gKGdfY29uZmlnRmlsZU9iai5nZXRPcHRpb24oX29wdGlvbikpOworICAgIGlmIChvcHRpb24gIT0gTlVMTCkgeworICAgICAgICAqb3B0aW9uRGVmYXVsdCA9IGNvbnZlcnRTdHJpbmdFbnVtVmFsKG9wdGlvbik7CisgICAgICAgIHJlcyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IHRydWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgc2V0TGF5ZXJPcHRpb25FbnVtKGNvbnN0IGNoYXIgKl9vcHRpb24sIGNvbnN0IGNoYXIgKl92YWxFbnVtKQoreworICAgIHVuc2lnbmVkIGludCB2YWwgPSBjb252ZXJ0U3RyaW5nRW51bVZhbChfdmFsRW51bSk7CisgICAgY2hhciBzdHJWYWxbMjRdOworICAgIHNucHJpbnRmKHN0clZhbCwgMjQsICIldSIsIHZhbCk7CisgICAgZ19jb25maWdGaWxlT2JqLnNldE9wdGlvbihfb3B0aW9uLCBzdHJWYWwpOworfQorCit2b2lkIHNldExheWVyT3B0aW9uKGNvbnN0IGNoYXIgKl9vcHRpb24sIGNvbnN0IGNoYXIgKl92YWwpCit7CisgICAgZ19jb25maWdGaWxlT2JqLnNldE9wdGlvbihfb3B0aW9uLCBfdmFsKTsKK30KKworQ29uZmlnRmlsZTo6Q29uZmlnRmlsZSgpIDogbV9maWxlSXNQYXJzZWQoZmFsc2UpCit7Cit9CisKK0NvbmZpZ0ZpbGU6On5Db25maWdGaWxlKCkKK3sKK30KKworY29uc3QgY2hhciAqQ29uZmlnRmlsZTo6Z2V0T3B0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZfb3B0aW9uKQoreworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0OworICAgIGlmICghbV9maWxlSXNQYXJzZWQpCisgICAgeworICAgICAgICBwYXJzZUZpbGUoInZrX2xheWVyX3NldHRpbmdzLnR4dCIpOworICAgIH0KKworICAgIGlmICgoaXQgPSBtX3ZhbHVlTWFwLmZpbmQoX29wdGlvbikpID09IG1fdmFsdWVNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuY19zdHIoKTsKK30KKwordm9pZCBDb25maWdGaWxlOjpzZXRPcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJl9vcHRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nICZfdmFsKQoreworICAgIGlmICghbV9maWxlSXNQYXJzZWQpCisgICAgeworICAgICAgICBwYXJzZUZpbGUoInZrX2xheWVyX3NldHRpbmdzLnR4dCIpOworICAgIH0KKworICAgIG1fdmFsdWVNYXBbX29wdGlvbl0gPSBfdmFsOworfQorCit2b2lkIENvbmZpZ0ZpbGU6OnBhcnNlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBzdGQ6Omlmc3RyZWFtIGZpbGU7CisgICAgY2hhciBidWZbTUFYX0NIQVJTX1BFUl9MSU5FXTsKKworICAgIG1fZmlsZUlzUGFyc2VkID0gdHJ1ZTsKKyAgICBtX3ZhbHVlTWFwLmNsZWFyKCk7CisKKyAgICBmaWxlLm9wZW4oZmlsZW5hbWUpOworICAgIGlmICghZmlsZS5nb29kKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIHJlYWQgdG9rZW5zIGZyb20gdGhlIGZpbGUgYW5kIGZvcm0gb3B0aW9uLCB2YWx1ZSBwYWlycworICAgIGZpbGUuZ2V0bGluZShidWYsIE1BWF9DSEFSU19QRVJfTElORSk7CisgICAgd2hpbGUgKCFmaWxlLmVvZigpKQorICAgIHsKKyAgICAgICAgY2hhciBvcHRpb25bNTEyXTsKKyAgICAgICAgY2hhciB2YWx1ZVs1MTJdOworCisgICAgICAgIGNoYXIgKnBDb21tZW50OworCisgICAgICAgIC8vZGlzY2FyZCBhbnkgY29tbWVudHMgZGVsaW1pdGVkIGJ5ICcjJyBpbiB0aGUgbGluZQorICAgICAgICBwQ29tbWVudCA9IHN0cmNocihidWYsICcjJyk7CisgICAgICAgIGlmIChwQ29tbWVudCkKKyAgICAgICAgICAgICpwQ29tbWVudCA9ICdcMCc7CisKKyAgICAgICAgaWYgKHNzY2FuZihidWYsICIgJTUxMVteXG5cdCA9XSA9ICU1MTFbXlxuIFx0XSIsIG9wdGlvbiwgdmFsdWUpID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9wdFN0cihvcHRpb24pOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsU3RyKHZhbHVlKTsKKyAgICAgICAgICAgIG1fdmFsdWVNYXBbb3B0U3RyXSA9IHZhbFN0cjsKKyAgICAgICAgfQorICAgICAgICBmaWxlLmdldGxpbmUoYnVmLCBNQVhfQ0hBUlNfUEVSX0xJTkUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vbGF5ZXJzL2xheWVyc19jb25maWcuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL2xheWVycy9sYXllcnNfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkZDBmMwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL2xheWVycy9sYXllcnNfY29uZmlnLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2NvbnN0IGNoYXIgKmdldExheWVyT3B0aW9uKGNvbnN0IGNoYXIgKl9vcHRpb24pOworYm9vbCBnZXRMYXllck9wdGlvbkVudW0oY29uc3QgY2hhciAqX29wdGlvbiwgdWludDMyX3QgKm9wdGlvbkRlZmF1bHQpOworCit2b2lkIHNldExheWVyT3B0aW9uKGNvbnN0IGNoYXIgKl9vcHRpb24sIGNvbnN0IGNoYXIgKl92YWwpOwordm9pZCBzZXRMYXllck9wdGlvbkVudW0oY29uc3QgY2hhciAqX29wdGlvbiwgY29uc3QgY2hhciAqX3ZhbEVudW0pOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL2xheWVycy92a3RyYWNlX3NuYXBzaG90LmMgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi9sYXllcnMvdmt0cmFjZV9zbmFwc2hvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTYyMjkKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi9sYXllcnMvdmt0cmFjZV9zbmFwc2hvdC5jCkBAIC0wLDAgKzEsMTg4NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImxvYWRlcl9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInZrdHJhY2Vfc25hcHNob3QuaCIKKyNpbmNsdWRlICJ2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlci5oIgorCisjZGVmaW5lIExBWUVSX05BTUVfU1RSICJWa3RyYWNlU25hcHNob3QiCisjZGVmaW5lIExBWUVSX0FCQlJFVl9TVFIgIlZLVFJBQ0VTbmFwIgorCitzdGF0aWMgVmtMYXllckRpc3BhdGNoVGFibGUgbmV4dFRhYmxlOworc3RhdGljIFZrQmFzZUxheWVyT2JqZWN0ICpwQ3VyT2JqOworCisvLyBUaGUgZm9sbG93aW5nIGlzICNpbmNsdWRlZCBhZ2FpbiB0byBjYXRjaCBjZXJ0YWluIE9TLXNwZWNpZmljIGZ1bmN0aW9ucyBiZWluZyB1c2VkOgorI2luY2x1ZGUgImxvYWRlcl9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImxheWVyc19jb25maWcuaCIKKyNpbmNsdWRlICJsYXllcnNfbXNnLmgiCisKK3N0YXRpYyBMT0FERVJfUExBVEZPUk1fVEhSRUFEX09OQ0VfREVDTEFSQVRJT04odGFiT25jZSk7CitzdGF0aWMgaW50IG9iakxvY2tJbml0aWFsaXplZCA9IDA7CitzdGF0aWMgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9tdXRleCBvYmpMb2NrOworCisvLyBUaGUgJ21hc3RlclNuYXBzaG90JyB3aGljaCBnZXRzIHRoZSBkZWx0YSBtZXJnZWQgaW50byBpdCB3aGVuICdHZXRTbmFwc2hvdCgpJyBpcyBjYWxsZWQuCitzdGF0aWMgVktUUkFDRV9WS19TTkFQU0hPVCBzX3NuYXBzaG90ID0gezB9OworCisvLyBUaGUgJ2RlbHRhU25hcHNob3QnIHdoaWNoIHRyYWNrcyBhbGwgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZWxldGlvbi4KK3N0YXRpYyBWS1RSQUNFX1ZLX1NOQVBTSE9UIHNfZGVsdGEgPSB7MH07CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSGVscGVyIHN0cnVjdHVyZSBmb3IgYSBWS1RSQUNFIHZ1bGthbiBzbmFwc2hvdC4KKy8vIFRoZXNlIGNhbiBwcm9iYWJseSBiZSBhdXRvLWdlbmVyYXRlZCBhdCBzb21lIHBvaW50LgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIHZrdHJhY2VfdmtfbWFsbG9jX2FuZF9jb3B5KHZvaWQqKiBwcERlc3QsIHNpemVfdCBzaXplLCBjb25zdCB2b2lkKiBwU3JjKQoreworICAgICpwcERlc3QgPSBtYWxsb2Moc2l6ZSk7CisgICAgbWVtY3B5KCpwcERlc3QsIHBTcmMsIHNpemUpOworfQorCitWa0RldmljZUNyZWF0ZUluZm8qIHZrdHJhY2VfZGVlcGNvcHlfVmtEZXZpY2VDcmVhdGVJbmZvKGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcFNyY0NyZWF0ZUluZm8pCit7CisgICAgVmtEZXZpY2VDcmVhdGVJbmZvKiBwRGVzdENyZWF0ZUluZm87CisKKyAgICAvLyBOT1RFOiBwYXJ0aWFsbHkgZHVwbGljYXRlZCBjb2RlIGZyb20gYWRkX1ZrRGV2aWNlQ3JlYXRlSW5mb190b19wYWNrZXQoLi4uKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgdmt0cmFjZV92a19tYWxsb2NfYW5kX2NvcHkoKHZvaWQqKikmcERlc3RDcmVhdGVJbmZvLCBzaXplb2YoVmtEZXZpY2VDcmVhdGVJbmZvKSwgcFNyY0NyZWF0ZUluZm8pOworICAgICAgICB2a3RyYWNlX3ZrX21hbGxvY19hbmRfY29weSgodm9pZCoqKSZwRGVzdENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zLCBwU3JjQ3JlYXRlSW5mby0+cXVldWVDcmVhdGVJbmZvQ291bnQqc2l6ZW9mKFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKSwgcFNyY0NyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTcmNDcmVhdGVJbmZvLT5xdWV1ZUNyZWF0ZUluZm9Db3VudDsgaSsrKSB7CisgICAgICAgICAgICB2a3RyYWNlX3ZrX21hbGxvY19hbmRfY29weSgodm9pZCoqKSZwRGVzdENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zW2ldLnBRdWV1ZVByaW9yaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucXVldWVDb3VudCpzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0NyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zW2ldLnBRdWV1ZVByaW9yaXRpZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX3ZrX21hbGxvY19hbmRfY29weSgodm9pZCoqKSZwRGVzdENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzLCBwU3JjQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50ICogc2l6ZW9mKGNoYXIgKiksIHBTcmNDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNyY0NyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfdmtfbWFsbG9jX2FuZF9jb3B5KCh2b2lkKiopJnBEZXN0Q3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0sIFJPVU5EVVBfVE9fNChzdHJsZW4ocFNyY0NyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKSArIDEpLCBwU3JjQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFZrTGF5ZXJDcmVhdGVJbmZvICpwU3JjTmV4dCA9ICggVmtMYXllckNyZWF0ZUluZm8gKikgcFNyY0NyZWF0ZUluZm8tPnBOZXh0OworICAgICAgICBWa0xheWVyQ3JlYXRlSW5mbyAqKnBwRHN0TmV4dCA9ICggVmtMYXllckNyZWF0ZUluZm8gKiopICZwRGVzdENyZWF0ZUluZm8tPnBOZXh0OworICAgICAgICB3aGlsZSAocFNyY05leHQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwU3JjTmV4dC0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTEFZRVJfQ1JFQVRFX0lORk8pICYmIHBTcmNOZXh0LT5lbmFibGVkTGF5ZXJDb3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV92a19tYWxsb2NfYW5kX2NvcHkoKHZvaWQqKilwcERzdE5leHQsIHNpemVvZihWa0xheWVyQ3JlYXRlSW5mbyksIHBTcmNOZXh0KTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX3ZrX21hbGxvY19hbmRfY29weSgodm9pZCoqKSYoKnBwRHN0TmV4dCktPnBwQWN0aXZlTGF5ZXJOYW1lcywgcFNyY05leHQtPmVuYWJsZWRMYXllckNvdW50ICogc2l6ZW9mKGNoYXIqKSwgcFNyY05leHQtPnBwQWN0aXZlTGF5ZXJOYW1lcyk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTcmNOZXh0LT5lbmFibGVkTGF5ZXJDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV92a19tYWxsb2NfYW5kX2NvcHkoKHZvaWQqKikmKCpwcERzdE5leHQpLT5wcEFjdGl2ZUxheWVyTmFtZXNbaV0sIFJPVU5EVVBfVE9fNChzdHJsZW4ocFNyY05leHQtPnBwQWN0aXZlTGF5ZXJOYW1lc1tpXSkgKyAxKSwgcFNyY05leHQtPnBwQWN0aXZlTGF5ZXJOYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHBEc3ROZXh0ID0gKFZrTGF5ZXJDcmVhdGVJbmZvKiopICYoKnBwRHN0TmV4dCktPnBOZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNyY05leHQgPSAoVmtMYXllckNyZWF0ZUluZm8qKSBwU3JjTmV4dC0+cE5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcERlc3RDcmVhdGVJbmZvOworfQorCit2b2lkIHZrdHJhY2VfZGVlcGZyZWVfVmtEZXZpY2VDcmVhdGVJbmZvKFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8pCit7CisgICAgdWludDMyX3QgaTsKKyAgICBpZiAocENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zICE9IE5VTEwpCisgICAgeworICAgICAgICBmcmVlKCh2b2lkKilwQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3MpOworICAgIH0KKworICAgIGlmIChwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyZWUoKHZvaWQqKXBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZSgodm9pZCopcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKTsKKyAgICB9CisKKyAgICBWa0xheWVyQ3JlYXRlSW5mbyAqcFNyY05leHQgPSAoVmtMYXllckNyZWF0ZUluZm8qKXBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICB3aGlsZSAocFNyY05leHQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZrTGF5ZXJDcmVhdGVJbmZvKiBwVG1wID0gKFZrTGF5ZXJDcmVhdGVJbmZvKilwU3JjTmV4dC0+cE5leHQ7CisgICAgICAgIGlmICgocFNyY05leHQtPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0xBWUVSX0NSRUFURV9JTkZPKSAmJiBwU3JjTmV4dC0+ZW5hYmxlZExheWVyQ291bnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNyY05leHQtPmVuYWJsZWRMYXllckNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlZSgodm9pZCopcFNyY05leHQtPnBwQWN0aXZlTGF5ZXJOYW1lc1tpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyZWUoKHZvaWQqKXBTcmNOZXh0LT5wcEFjdGl2ZUxheWVyTmFtZXMpOworICAgICAgICAgICAgZnJlZShwU3JjTmV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcFNyY05leHQgPSBwVG1wOworICAgIH0KKworICAgIGZyZWUocENyZWF0ZUluZm8pOworfQorCit2b2lkIHZrdHJhY2Vfdmtfc25hcHNob3RfY29weV9jcmVhdGVkZXZpY2VfcGFyYW1zKFZLVFJBQ0VfVktfU05BUFNIT1RfQ1JFQVRFREVWSUNFX1BBUkFNUyogcERlc3QsIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGV2aWNlKiBwRGV2aWNlKQoreworICAgIHBEZXN0LT5waHlzaWNhbERldmljZSA9IHBoeXNpY2FsRGV2aWNlOworCisgICAgcERlc3QtPnBDcmVhdGVJbmZvID0gdmt0cmFjZV9kZWVwY29weV9Wa0RldmljZUNyZWF0ZUluZm8ocENyZWF0ZUluZm8pOworCisgICAgcERlc3QtPnBEZXZpY2UgPSAoVmtEZXZpY2UqKW1hbGxvYyhzaXplb2YoVmtEZXZpY2UpKTsKKyAgICAqcERlc3QtPnBEZXZpY2UgPSAqcERldmljZTsKK30KKwordm9pZCB2a3RyYWNlX3ZrX3NuYXBzaG90X2Rlc3Ryb3lfY3JlYXRlZGV2aWNlX3BhcmFtcyhWS1RSQUNFX1ZLX1NOQVBTSE9UX0NSRUFURURFVklDRV9QQVJBTVMqIHBTcmMpCit7CisgICAgbWVtc2V0KCZwU3JjLT5waHlzaWNhbERldmljZSwgMCwgc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpKTsKKworICAgIHZrdHJhY2VfZGVlcGZyZWVfVmtEZXZpY2VDcmVhdGVJbmZvKHBTcmMtPnBDcmVhdGVJbmZvKTsKKyAgICBwU3JjLT5wQ3JlYXRlSW5mbyA9IE5VTEw7CisKKyAgICBmcmVlKHBTcmMtPnBEZXZpY2UpOworICAgIHBTcmMtPnBEZXZpY2UgPSBOVUxMOworfQorCisKKworLy8gYWRkIGEgbmV3IG5vZGUgdG8gdGhlIGdsb2JhbCBhbmQgb2JqZWN0IGxpc3RzLCB0aGVuIHJldHVybiBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwb3B1bGF0ZSB0aGUgb2JqZWN0IGluZm9ybWF0aW9uLgorc3RhdGljIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogc25hcHNob3RfaW5zZXJ0X29iamVjdChWS1RSQUNFX1ZLX1NOQVBTSE9UKiBwU25hcHNob3QsIFZrT2JqZWN0IG9iamVjdCwgVmtPYmplY3RUeXBlIHR5cGUpCit7CisgICAgLy8gQ3JlYXRlIGEgbmV3IG5vZGUKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOZXdPYmpOb2RlID0gKFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSopbWFsbG9jKHNpemVvZihWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUpKTsKKyAgICBtZW1zZXQocE5ld09iak5vZGUsIDAsIHNpemVvZihWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUpKTsKKyAgICBwTmV3T2JqTm9kZS0+b2JqLm9iamVjdCA9IG9iamVjdDsKKyAgICBwTmV3T2JqTm9kZS0+b2JqLm9ialR5cGUgPSB0eXBlOworICAgIHBOZXdPYmpOb2RlLT5vYmouc3RhdHVzID0gT0JKU1RBVFVTX05PTkU7CisKKyAgICAvLyBpbnNlcnQgYXQgZnJvbnQgb2YgZ2xvYmFsIGxpc3QKKyAgICBwTmV3T2JqTm9kZS0+cE5leHRHbG9iYWwgPSBwU25hcHNob3QtPnBHbG9iYWxPYmpzOworICAgIHBTbmFwc2hvdC0+cEdsb2JhbE9ianMgPSBwTmV3T2JqTm9kZTsKKworICAgIC8vIGluc2VydCBhdCBmcm9udCBvZiBvYmplY3QgbGlzdAorICAgIHBOZXdPYmpOb2RlLT5wTmV4dE9iaiA9IHBTbmFwc2hvdC0+cE9iamVjdEhlYWRbdHlwZV07CisgICAgcFNuYXBzaG90LT5wT2JqZWN0SGVhZFt0eXBlXSA9IHBOZXdPYmpOb2RlOworCisgICAgLy8gaW5jcmVtZW50IGNvdW50CisgICAgcFNuYXBzaG90LT5nbG9iYWxPYmpDb3VudCsrOworICAgIHBTbmFwc2hvdC0+bnVtT2Jqc1t0eXBlXSsrOworCisgICAgcmV0dXJuIHBOZXdPYmpOb2RlOworfQorCisvLyBUaGlzIGlzIGp1c3QgYSBoZWxwZXIgZnVuY3Rpb24gdG8gc25hcHNob3RfcmVtb3ZlX29iamVjdCguLikuIEl0IGlzIG5vdCBpbnRlbmRlZCBmb3IgdGhpcyB0byBiZSBjYWxsZWQgZGlyZWN0bHkuCitzdGF0aWMgdm9pZCBzbmFwc2hvdF9yZW1vdmVfb2JqX3R5cGUoVktUUkFDRV9WS19TTkFQU0hPVCogcFNuYXBzaG90LCBWa09iamVjdCBvYmplY3QsIFZrT2JqZWN0VHlwZSBvYmpUeXBlKSB7CisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFICpwVHJhdiA9IHBTbmFwc2hvdC0+cE9iamVjdEhlYWRbb2JqVHlwZV07CisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFICpwUHJldiA9IHBTbmFwc2hvdC0+cE9iamVjdEhlYWRbb2JqVHlwZV07CisgICAgd2hpbGUgKHBUcmF2KSB7CisgICAgICAgIGlmIChwVHJhdi0+b2JqLm9iamVjdCA9PSBvYmplY3QpIHsKKyAgICAgICAgICAgIHBQcmV2LT5wTmV4dE9iaiA9IHBUcmF2LT5wTmV4dE9iajsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBIRUFEIG9mIE9iaiBsaXN0IGFzIG5lZWRlZAorICAgICAgICAgICAgaWYgKHBTbmFwc2hvdC0+cE9iamVjdEhlYWRbb2JqVHlwZV0gPT0gcFRyYXYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNuYXBzaG90LT5wT2JqZWN0SGVhZFtvYmpUeXBlXSA9IHBUcmF2LT5wTmV4dE9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChwU25hcHNob3QtPm51bU9ianNbb2JqVHlwZV0gPiAwKTsKKyAgICAgICAgICAgIHBTbmFwc2hvdC0+bnVtT2Jqc1tvYmpUeXBlXS0tOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBQcmV2ID0gcFRyYXY7CisgICAgICAgIHBUcmF2ID0gcFRyYXYtPnBOZXh0T2JqOworICAgIH0KKyAgICBjaGFyIHN0clsxMDI0XTsKKyAgICBzcHJpbnRmKHN0ciwgIk9CSiBJTlRFUk5BTCBFUlJPUiA6IE9iaiAlcCB3YXMgaW4gZ2xvYmFsIGxpc3QgYnV0IG5vdCBpbiAlcyBsaXN0IiwgKHZvaWQqKW9iamVjdCwgc3RyaW5nX1ZLX09CSkVDVF9UWVBFKG9ialR5cGUpKTsKKyAgICBsYXllckNiTXNnKFZLX0RCR19NU0dfRVJST1IsIFZLX1ZBTElEQVRJT05fTEVWRUxfMCwgb2JqZWN0LCAwLCBWS1RSQUNFU05BUFNIT1RfSU5URVJOQUxfRVJST1IsIExBWUVSX0FCQlJFVl9TVFIsIHN0cik7Cit9CisKKy8vIFNlYXJjaCBnbG9iYWwgbGlzdCB0byBmaW5kIG9iamVjdCwKKy8vIGlmIGZvdW5kOgorLy8gcmVtb3ZlIG9iamVjdCBmcm9tIG9ial90eXBlIGxpc3QgdXNpbmcgc25hcHNob3RfcmVtb3ZlX29ial90eXBlKCkKKy8vIHJlbW92ZSBvYmplY3QgZnJvbSBnbG9iYWwgbGlzdCwKKy8vIHJldHVybiBvYmplY3QuCisvLyBlbHNlOgorLy8gUmVwb3J0IG1lc3NhZ2UgdGhhdCB3ZSBkaWRuJ3Qgc2VlIGl0IGdldCBjcmVhdGVkLAorLy8gcmV0dXJuIE5VTEwuCitzdGF0aWMgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBzbmFwc2hvdF9yZW1vdmVfb2JqZWN0KFZLVFJBQ0VfVktfU05BUFNIT1QqIHBTbmFwc2hvdCwgVmtPYmplY3Qgb2JqZWN0KQoreworICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSAqcFRyYXYgPSBwU25hcHNob3QtPnBHbG9iYWxPYmpzOworICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSAqcFByZXYgPSBwU25hcHNob3QtPnBHbG9iYWxPYmpzOworICAgIHdoaWxlIChwVHJhdikKKyAgICB7CisgICAgICAgIGlmIChwVHJhdi0+b2JqLm9iamVjdCA9PSBvYmplY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNuYXBzaG90X3JlbW92ZV9vYmpfdHlwZShwU25hcHNob3QsIG9iamVjdCwgcFRyYXYtPm9iai5vYmpUeXBlKTsKKyAgICAgICAgICAgIHBQcmV2LT5wTmV4dEdsb2JhbCA9IHBUcmF2LT5wTmV4dEdsb2JhbDsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBIRUFEIG9mIGdsb2JhbCBsaXN0IGlmIG5lZWRlZAorICAgICAgICAgICAgaWYgKHBTbmFwc2hvdC0+cEdsb2JhbE9ianMgPT0gcFRyYXYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNuYXBzaG90LT5wR2xvYmFsT2JqcyA9IHBUcmF2LT5wTmV4dEdsb2JhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChwU25hcHNob3QtPmdsb2JhbE9iakNvdW50ID4gMCk7CisgICAgICAgICAgICBwU25hcHNob3QtPmdsb2JhbE9iakNvdW50LS07CisgICAgICAgICAgICByZXR1cm4gcFRyYXY7CisgICAgICAgIH0KKyAgICAgICAgcFByZXYgPSBwVHJhdjsKKyAgICAgICAgcFRyYXYgPSBwVHJhdi0+cE5leHRHbG9iYWw7CisgICAgfQorCisgICAgLy8gT2JqZWN0IG5vdCBmb3VuZC4KKyAgICBjaGFyIHN0clsxMDI0XTsKKyAgICBzcHJpbnRmKHN0ciwgIk9iamVjdCAlcCB3YXMgbm90IGZvdW5kIGluIHRoZSBjcmVhdGVkIG9iamVjdCBsaXN0LiBJdCBzaG91bGQgYmUgYWRkZWQgYXMgYSBkZWxldGVkIG9iamVjdC4iLCAodm9pZCopb2JqZWN0KTsKKyAgICBsYXllckNiTXNnKFZLX0RCR19NU0dfVU5LTk9XTiwgVktfVkFMSURBVElPTl9MRVZFTF8wLCBvYmplY3QsIDAsIFZLVFJBQ0VTTkFQU0hPVF9VTktOT1dOX09CSkVDVCwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gQWRkIGEgbmV3IGRlbGV0ZWQgb2JqZWN0IG5vZGUgdG8gdGhlIGxpc3QKK3N0YXRpYyB2b2lkIHNuYXBzaG90X2luc2VydF9kZWxldGVkX29iamVjdChWS1RSQUNFX1ZLX1NOQVBTSE9UKiBwU25hcHNob3QsIFZrT2JqZWN0IG9iamVjdCwgVmtPYmplY3RUeXBlIHR5cGUpCit7CisgICAgLy8gQ3JlYXRlIGEgbmV3IG5vZGUKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0RFTEVURURfT0JKX05PREUqIHBOZXdPYmpOb2RlID0gKFZLVFJBQ0VfVktfU05BUFNIT1RfREVMRVRFRF9PQkpfTk9ERSopbWFsbG9jKHNpemVvZihWS1RSQUNFX1ZLX1NOQVBTSE9UX0RFTEVURURfT0JKX05PREUpKTsKKyAgICBtZW1zZXQocE5ld09iak5vZGUsIDAsIHNpemVvZihWS1RSQUNFX1ZLX1NOQVBTSE9UX0RFTEVURURfT0JKX05PREUpKTsKKyAgICBwTmV3T2JqTm9kZS0+b2JqVHlwZSA9IHR5cGU7CisgICAgcE5ld09iak5vZGUtPm9iamVjdCA9IG9iamVjdDsKKworICAgIC8vIGluc2VydCBhdCBmcm9udCBvZiBsaXN0CisgICAgcE5ld09iak5vZGUtPnBOZXh0T2JqID0gcFNuYXBzaG90LT5wRGVsdGFEZWxldGVkT2JqZWN0czsKKyAgICBwU25hcHNob3QtPnBEZWx0YURlbGV0ZWRPYmplY3RzID0gcE5ld09iak5vZGU7CisKKyAgICAvLyBpbmNyZW1lbnQgY291bnQKKyAgICBwU25hcHNob3QtPmRlbHRhRGVsZXRlZE9iamVjdENvdW50Kys7Cit9CisKKy8vIE5vdGU6IHRoZSBwYXJhbWV0ZXJzIGFmdGVyIHBTbmFwc2hvdCBtYXRjaCB0aGUgb3JkZXIgb2YgdmtDcmVhdGVEZXZpY2UoLi4pCitzdGF0aWMgdm9pZCBzbmFwc2hvdF9pbnNlcnRfZGV2aWNlKFZLVFJBQ0VfVktfU05BUFNIT1QqIHBTbmFwc2hvdCwgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtEZXZpY2UqIHBEZXZpY2UpCit7CisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QocFNuYXBzaG90LCAqcERldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IG1hbGxvYyhzaXplb2YoVktUUkFDRV9WS19TTkFQU0hPVF9ERVZJQ0VfTk9ERSkpOworCisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9ERVZJQ0VfTk9ERSogcERldk5vZGUgPSAoVktUUkFDRV9WS19TTkFQU0hPVF9ERVZJQ0VfTk9ERSopcE5vZGUtPm9iai5wU3RydWN0OworICAgIHZrdHJhY2Vfdmtfc25hcHNob3RfY29weV9jcmVhdGVkZXZpY2VfcGFyYW1zKCZwRGV2Tm9kZS0+cGFyYW1zLCBwaHlzaWNhbERldmljZSwgcENyZWF0ZUluZm8sIHBEZXZpY2UpOworCisgICAgLy8gaW5zZXJ0IGF0IGZyb250IG9mIGRldmljZSBsaXN0CisgICAgcE5vZGUtPnBOZXh0T2JqID0gcFNuYXBzaG90LT5wRGV2aWNlczsKKyAgICBwU25hcHNob3QtPnBEZXZpY2VzID0gcE5vZGU7CisKKyAgICAvLyBpbmNyZW1lbnQgY291bnQKKyAgICBwU25hcHNob3QtPmRldmljZUNvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIHNuYXBzaG90X3JlbW92ZV9kZXZpY2UoVktUUkFDRV9WS19TTkFQU0hPVCogcFNuYXBzaG90LCBWa0RldmljZSBkZXZpY2UpCit7CisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwRm91bmRPYmplY3QgPSBzbmFwc2hvdF9yZW1vdmVfb2JqZWN0KHBTbmFwc2hvdCwgZGV2aWNlKTsKKworICAgIGlmIChwRm91bmRPYmplY3QgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSAqcFRyYXYgPSBwU25hcHNob3QtPnBEZXZpY2VzOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUgKnBQcmV2ID0gcFNuYXBzaG90LT5wRGV2aWNlczsKKyAgICAgICAgd2hpbGUgKHBUcmF2ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwVHJhdi0+b2JqLm9iamVjdCA9PSBkZXZpY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByZXYtPnBOZXh0T2JqID0gcFRyYXYtPnBOZXh0T2JqOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBIRUFEIG9mIE9iaiBsaXN0IGFzIG5lZWRlZAorICAgICAgICAgICAgICAgIGlmIChwU25hcHNob3QtPnBEZXZpY2VzID09IHBUcmF2KQorICAgICAgICAgICAgICAgICAgICBwU25hcHNob3QtPnBEZXZpY2VzID0gcFRyYXYtPnBOZXh0T2JqOworCisgICAgICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSBvYmplY3QKKyAgICAgICAgICAgICAgICBpZiAocFRyYXYtPm9iai5wU3RydWN0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0RFVklDRV9OT0RFKiBwRGV2Tm9kZSA9IChWS1RSQUNFX1ZLX1NOQVBTSE9UX0RFVklDRV9OT0RFKilwVHJhdi0+b2JqLnBTdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgIHZrdHJhY2Vfdmtfc25hcHNob3RfZGVzdHJveV9jcmVhdGVkZXZpY2VfcGFyYW1zKCZwRGV2Tm9kZS0+cGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwRGV2Tm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUocFRyYXYpOworCisgICAgICAgICAgICAgICAgaWYgKHBTbmFwc2hvdC0+ZGV2aWNlQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNuYXBzaG90LT5kZXZpY2VDb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDYWxsYmFjayBXQVJOSU5HIHRoYXQgdG9vIG1hbnkgZGV2aWNlcyB3ZXJlIGRlbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCEiRGV2aWNlQ291bnQgPD0gMCBtZWFucyB0aGF0IHRvbyBtYW55IGRldmljZXMgd2VyZSBkZWxldGVkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUHJldiA9IHBUcmF2OworICAgICAgICAgICAgcFRyYXYgPSBwVHJhdi0+cE5leHRPYmo7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgY29kZSBnb3QgaGVyZSwgdGhlbiB0aGUgZGV2aWNlIHdhc24ndCBpbiB0aGUgZGV2aWNlcyBsaXN0LgorICAgIC8vIFRoYXQgbWVhbnMgd2Ugc2hvdWxkIGFkZCB0aGlzIGRldmljZSB0byB0aGUgZGVsZXRlZCBpdGVtcyBsaXN0LgorICAgIHNuYXBzaG90X2luc2VydF9kZWxldGVkX29iamVjdCgmc19kZWx0YSwgZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7Cit9CisKKy8vIFRyYXZlcnNlIGdsb2JhbCBsaXN0IGFuZCByZXR1cm4gdHlwZSBmb3IgZ2l2ZW4gb2JqZWN0CitzdGF0aWMgVmtPYmplY3RUeXBlIGxsX2dldF9vYmpfdHlwZShWa09iamVjdCBvYmplY3QpIHsKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUgKnBUcmF2ID0gc19kZWx0YS5wR2xvYmFsT2JqczsKKyAgICB3aGlsZSAocFRyYXYpIHsKKyAgICAgICAgaWYgKHBUcmF2LT5vYmoub2JqZWN0ID09IG9iamVjdCkKKyAgICAgICAgICAgIHJldHVybiBwVHJhdi0+b2JqLm9ialR5cGU7CisgICAgICAgIHBUcmF2ID0gcFRyYXYtPnBOZXh0R2xvYmFsOworICAgIH0KKyAgICBjaGFyIHN0clsxMDI0XTsKKyAgICBzcHJpbnRmKHN0ciwgIkF0dGVtcHRpbmcgbG9vay11cCBvbiBvYmogJXAgYnV0IGl0IGlzIE5PVCBpbiB0aGUgZ2xvYmFsIGxpc3QhIiwgKHZvaWQqKW9iamVjdCk7CisgICAgbGF5ZXJDYk1zZyhWS19EQkdfTVNHX0VSUk9SLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIG9iamVjdCwgMCwgVktUUkFDRVNOQVBTSE9UX01JU1NJTkdfT0JKRUNULCBMQVlFUl9BQkJSRVZfU1RSLCBzdHIpOworICAgIHJldHVybiAoVmtPYmplY3RUeXBlKS0xOworfQorCitzdGF0aWMgdm9pZCBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KFZrT2JqZWN0IG9iamVjdCwgVmtPYmplY3RUeXBlIG9ialR5cGUpIHsKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUgKnBUcmF2ID0gc19kZWx0YS5wT2JqZWN0SGVhZFtvYmpUeXBlXTsKKyAgICB3aGlsZSAocFRyYXYpIHsKKyAgICAgICAgaWYgKHBUcmF2LT5vYmoub2JqZWN0ID09IG9iamVjdCkgeworICAgICAgICAgICAgcFRyYXYtPm9iai5udW1Vc2VzKys7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcFRyYXYgPSBwVHJhdi0+cE5leHRPYmo7CisgICAgfQorCisgICAgLy8gSWYgd2UgZG8gbm90IGZpbmQgb2JqLCBpbnNlcnQgaXQgYW5kIHRoZW4gaW5jcmVtZW50IGNvdW50CisgICAgLy8gVE9ETzogd2UgY2FuJ3QganVzdCBjcmVhdGUgdGhlIG9iamVjdCwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgaXQgd2FzIGNyZWF0ZWQgd2l0aC4KKyAgICAvLyBJbnN0ZWFkLCB3ZSBuZWVkIHRvIG1ha2UgYSBsaXN0IG9mIHJlZmVyZW5jZWQgb2JqZWN0cy4gV2hlbiB0aGUgZGVsdGEgaXMgbWVyZ2VkIHdpdGggYSBzbmFwc2hvdCwgd2UnbGwgbmVlZAorICAgIC8vIHRvIGNvbmZpcm0gdGhhdCB0aGUgcmVmZXJlbmNlZCBvYmplY3RzIGFjdHVhbGx5IGV4aXN0IGluIHRoZSBzbmFwc2hvdDsgb3RoZXJ3aXNlIEkgZ3Vlc3MgdGhlIG1lcmdlIHNob3VsZCBmYWlsLgorICAgIGNoYXIgc3RyWzEwMjRdOworICAgIHNwcmludGYoc3RyLCAiVW5hYmxlIHRvIGluY3JlbWVudCBjb3VudCBmb3Igb2JqICVwLCB3aWxsIGFkZCB0byBsaXN0IGFzICVzIHR5cGUgYW5kIGluY3JlbWVudCBjb3VudCIsICh2b2lkKilvYmplY3QsIHN0cmluZ19WS19PQkpFQ1RfVFlQRShvYmpUeXBlKSk7CisgICAgbGF5ZXJDYk1zZyhWS19EQkdfTVNHX1dBUk5JTkcsIFZLX1ZBTElEQVRJT05fTEVWRUxfMCwgb2JqZWN0LCAwLCBWS1RSQUNFU05BUFNIT1RfVU5LTk9XTl9PQkpFQ1QsIExBWUVSX0FCQlJFVl9TVFIsIHN0cik7CisKKy8vICAgIGxsX2luc2VydF9vYmoocE9iaiwgb2JqVHlwZSk7CisvLyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KHBPYmosIG9ialR5cGUpOworfQorCisvLyBTZXQgc2VsZWN0ZWQgZmxhZyBzdGF0ZSBmb3IgYW4gb2JqZWN0IG5vZGUKK3N0YXRpYyB2b2lkIHNldF9zdGF0dXMoVmtPYmplY3Qgb2JqZWN0LCBWa09iamVjdFR5cGUgb2JqVHlwZSwgT0JKRUNUX1NUQVRVUyBzdGF0dXNfZmxhZykgeworICAgIGlmICgodm9pZCopb2JqZWN0ICE9IE5VTEwpIHsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFICpwVHJhdiA9IHNfZGVsdGEucE9iamVjdEhlYWRbb2JqVHlwZV07CisgICAgICAgIHdoaWxlIChwVHJhdikgeworICAgICAgICAgICAgaWYgKHBUcmF2LT5vYmoub2JqZWN0ID09IG9iamVjdCkgeworICAgICAgICAgICAgICAgIHBUcmF2LT5vYmouc3RhdHVzIHw9IHN0YXR1c19mbGFnOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBUcmF2ID0gcFRyYXYtPnBOZXh0T2JqOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZG8gbm90IGZpbmQgaXQgcHJpbnQgYW4gZXJyb3IKKyAgICAgICAgY2hhciBzdHJbMTAyNF07CisgICAgICAgIHNwcmludGYoc3RyLCAiVW5hYmxlIHRvIHNldCBzdGF0dXMgZm9yIG5vbi1leGlzdGVudCBvYmplY3QgJXAgb2YgJXMgdHlwZSIsICh2b2lkKilvYmplY3QsIHN0cmluZ19WS19PQkpFQ1RfVFlQRShvYmpUeXBlKSk7CisgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19FUlJPUiwgVktfVkFMSURBVElPTl9MRVZFTF8wLCBvYmplY3QsIDAsIFZLVFJBQ0VTTkFQU0hPVF9VTktOT1dOX09CSkVDVCwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICB9Cit9CisKKy8vIFRyYWNrIHNlbGVjdGVkIHN0YXRlIGZvciBhbiBvYmplY3Qgbm9kZQorc3RhdGljIHZvaWQgdHJhY2tfb2JqZWN0X3N0YXR1cyhWa09iamVjdCBvYmplY3QsIFZrU3RhdGVCaW5kUG9pbnQgc3RhdGVCaW5kUG9pbnQpIHsKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUgKnBUcmF2ID0gc19kZWx0YS5wT2JqZWN0SGVhZFtWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUXTsKKworICAgIHdoaWxlIChwVHJhdikgeworICAgICAgICBpZiAocFRyYXYtPm9iai5vYmplY3QgPT0gb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcFRyYXYgPSBwVHJhdi0+cE5leHRPYmo7CisgICAgfQorCisgICAgLy8gSWYgd2UgZG8gbm90IGZpbmQgaXQgcHJpbnQgYW4gZXJyb3IKKyAgICBjaGFyIHN0clsxMDI0XTsKKyAgICBzcHJpbnRmKHN0ciwgIlVuYWJsZSB0byB0cmFjayBzdGF0dXMgZm9yIG5vbi1leGlzdGVudCBDb21tYW5kIEJ1ZmZlciBvYmplY3QgJXAiLCAodm9pZCopb2JqZWN0KTsKKyAgICBsYXllckNiTXNnKFZLX0RCR19NU0dfRVJST1IsIFZLX1ZBTElEQVRJT05fTEVWRUxfMCwgb2JqZWN0LCAwLCBWS1RSQUNFU05BUFNIT1RfVU5LTk9XTl9PQkpFQ1QsIExBWUVSX0FCQlJFVl9TVFIsIHN0cik7Cit9CisKKy8vIFJlc2V0IHNlbGVjdGVkIGZsYWcgc3RhdGUgZm9yIGFuIG9iamVjdCBub2RlCitzdGF0aWMgdm9pZCByZXNldF9zdGF0dXMoVmtPYmplY3Qgb2JqZWN0LCBWa09iamVjdFR5cGUgb2JqVHlwZSwgT0JKRUNUX1NUQVRVUyBzdGF0dXNfZmxhZykgeworICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSAqcFRyYXYgPSBzX2RlbHRhLnBPYmplY3RIZWFkW29ialR5cGVdOworICAgIHdoaWxlIChwVHJhdikgeworICAgICAgICBpZiAocFRyYXYtPm9iai5vYmplY3QgPT0gb2JqZWN0KSB7CisgICAgICAgICAgICBwVHJhdi0+b2JqLnN0YXR1cyAmPSB+c3RhdHVzX2ZsYWc7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcFRyYXYgPSBwVHJhdi0+cE5leHRPYmo7CisgICAgfQorCisgICAgLy8gSWYgd2UgZG8gbm90IGZpbmQgaXQgcHJpbnQgYW4gZXJyb3IKKyAgICBjaGFyIHN0clsxMDI0XTsKKyAgICBzcHJpbnRmKHN0ciwgIlVuYWJsZSB0byByZXNldCBzdGF0dXMgZm9yIG5vbi1leGlzdGVudCBvYmplY3QgJXAgb2YgJXMgdHlwZSIsICh2b2lkKilvYmplY3QsIHN0cmluZ19WS19PQkpFQ1RfVFlQRShvYmpUeXBlKSk7CisgICAgbGF5ZXJDYk1zZyhWS19EQkdfTVNHX0VSUk9SLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIG9iamVjdCwgMCwgVktUUkFDRVNOQVBTSE9UX1VOS05PV05fT0JKRUNULCBMQVlFUl9BQkJSRVZfU1RSLCBzdHIpOworfQorCisjaW5jbHVkZSAidmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgiCitzdGF0aWMgdm9pZCBpbml0Vmt0cmFjZVNuYXBzaG90KHZvaWQpCit7CisgICAgY29uc3QgY2hhciAqc3RyT3B0OworICAgIC8vIGluaXRpYWxpemUgVmt0cmFjZVNuYXBzaG90IG9wdGlvbnMKKyAgICBnZXRMYXllck9wdGlvbkVudW0oTEFZRVJfTkFNRV9TVFIgIlJlcG9ydExldmVsIiwgKHVpbnQzMl90ICopICZnX3JlcG9ydGluZ0xldmVsKTsKKyAgICBnX2FjdGlvbklzRGVmYXVsdCA9IGdldExheWVyT3B0aW9uRW51bShMQVlFUl9OQU1FX1NUUiAiRGVidWdBY3Rpb24iLCAodWludDMyX3QgKikgJmdfZGVidWdBY3Rpb24pOworCisgICAgaWYgKGdfZGVidWdBY3Rpb24gJiBWS19EQkdfTEFZRVJfQUNUSU9OX0xPR19NU0cpCisgICAgeworICAgICAgICBzdHJPcHQgPSBnZXRMYXllck9wdGlvbihMQVlFUl9OQU1FX1NUUiAiTG9nRmlsZW5hbWUiKTsKKyAgICAgICAgaWYgKHN0ck9wdCkKKyAgICAgICAgeworICAgICAgICAgICAgZ19sb2dGaWxlID0gZm9wZW4oc3RyT3B0LCAidyIpOworICAgICAgICB9CisgICAgICAgIGlmIChnX2xvZ0ZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdfbG9nRmlsZSA9IHN0ZG91dDsKKyAgICB9CisKKyAgICBQRk5fdmtHZXRQcm9jQWRkciBmcE5leHRHUEE7CisgICAgZnBOZXh0R1BBID0gcEN1ck9iai0+cEdQQTsKKyAgICBhc3NlcnQoZnBOZXh0R1BBKTsKKworICAgIGxheWVyX2luaXRfZGV2aWNlX2Rpc3BhdGNoX3RhYmxlKCZuZXh0VGFibGUsIGZwTmV4dEdQQSwgKFZrUGh5c2ljYWxEZXZpY2UpIHBDdXJPYmotPm5leHRPYmplY3QpOworICAgIGlmICghb2JqTG9ja0luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgLy8gVE9ETy9UQkQ6IE5lZWQgdG8gZGVsZXRlIHRoaXMgbXV0ZXggc29tZXRpbWUuICBIb3c/Pz8KKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9jcmVhdGVfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBvYmpMb2NrSW5pdGlhbGl6ZWQgPSAxOworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdnVsa2FuIGVudHJ5cG9pbnRzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW5zdGFuY2UoY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0luc3RhbmNlKiBwSW5zdGFuY2UpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkNyZWF0ZUluc3RhbmNlKHBDcmVhdGVJbmZvLCBwSW5zdGFuY2UpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBJbnN0YW5jZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lOU1RBTkNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lJbnN0YW5jZShWa0luc3RhbmNlIGluc3RhbmNlKQoreworICAgIG5leHRUYWJsZS5EZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgc25hcHNob3RfcmVtb3ZlX29iamVjdCgmc19kZWx0YSwgaW5zdGFuY2UpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhWa0luc3RhbmNlIGluc3RhbmNlLCB1aW50MzJfdCogcFBoeXNpY2FsRGV2aWNlQ291bnQsIFZrUGh5c2ljYWxEZXZpY2UqIHBQaHlzaWNhbERldmljZXMpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGluc3RhbmNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkVudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgcFBoeXNpY2FsRGV2aWNlQ291bnQsIHBQaHlzaWNhbERldmljZXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRQaHlzaWNhbERldmljZUluZm8oVmtQaHlzaWNhbERldmljZSBncHUsIFZrUGh5c2ljYWxEZXZpY2VJbmZvVHlwZSBpbmZvVHlwZSwgc2l6ZV90KiBwRGF0YVNpemUsIHZvaWQqIHBEYXRhKQoreworICAgIFZrQmFzZUxheWVyT2JqZWN0KiBncHV3ID0gKFZrQmFzZUxheWVyT2JqZWN0ICopIGdwdTsKKyAgICBwQ3VyT2JqID0gZ3B1dzsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX29uY2UoJnRhYk9uY2UsIGluaXRWa3RyYWNlU25hcHNob3QpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5HZXRQaHlzaWNhbERldmljZUluZm8oKFZrUGh5c2ljYWxEZXZpY2UpZ3B1dy0+bmV4dE9iamVjdCwgaW5mb1R5cGUsIHBEYXRhU2l6ZSwgcERhdGEpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZXZpY2UoVmtQaHlzaWNhbERldmljZSBncHUsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGV2aWNlKiBwRGV2aWNlKQoreworICAgIFZrQmFzZUxheWVyT2JqZWN0KiBncHV3ID0gKFZrQmFzZUxheWVyT2JqZWN0ICopIGdwdTsKKyAgICBwQ3VyT2JqID0gZ3B1dzsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX29uY2UoJnRhYk9uY2UsIGluaXRWa3RyYWNlU25hcHNob3QpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5DcmVhdGVEZXZpY2UoKFZrUGh5c2ljYWxEZXZpY2UpZ3B1dy0+bmV4dE9iamVjdCwgcENyZWF0ZUluZm8sIHBEZXZpY2UpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgICAgIHNuYXBzaG90X2luc2VydF9kZXZpY2UoJnNfZGVsdGEsIGdwdSwgcENyZWF0ZUluZm8sIHBEZXZpY2UpOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0Rlc3Ryb3lEZXZpY2UoVmtEZXZpY2UgZGV2aWNlKQoreworICAgIG5leHRUYWJsZS5EZXN0cm95RGV2aWNlKGRldmljZSk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBzbmFwc2hvdF9yZW1vdmVfZGV2aWNlKCZzX2RlbHRhLCBkZXZpY2UpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKworICAgIC8vIFJlcG9ydCBhbnkgcmVtYWluaW5nIG9iamVjdHMgaW4gTEwKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUgKnBUcmF2ID0gc19kZWx0YS5wR2xvYmFsT2JqczsKKyAgICB3aGlsZSAocFRyYXYgIT0gTlVMTCkKKyAgICB7CisvLyAgICAgICAgaWYgKHBUcmF2LT5vYmoub2JqVHlwZSA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU1dBUF9DSEFJTl9JTUFHRV9XU0kgfHwKKy8vICAgICAgICAgICAgcFRyYXYtPm9iai5vYmpUeXBlID09IFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQX0NIQUlOX01FTU9SWV9XU0kpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUgKnBEZWwgPSBwVHJhdjsKKy8vICAgICAgICAgICAgcFRyYXYgPSBwVHJhdi0+cE5leHRHbG9iYWw7CisvLyAgICAgICAgICAgIHNuYXBzaG90X3JlbW92ZV9vYmplY3QoJnNfZGVsdGEsICh2b2lkKikocERlbC0+b2JqLnBWa09iamVjdCkpOworLy8gICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyIHN0clsxMDI0XTsKKyAgICAgICAgICAgIHNwcmludGYoc3RyLCAiT0JKIEVSUk9SIDogJXMgb2JqZWN0ICVwIGhhcyBub3QgYmVlbiBkZXN0cm95ZWQgKHdhcyB1c2VkICVsdSB0aW1lcykuIiwgc3RyaW5nX1ZLX09CSkVDVF9UWVBFKHBUcmF2LT5vYmoub2JqVHlwZSksICh2b2lkKilwVHJhdi0+b2JqLm9iamVjdCwgcFRyYXYtPm9iai5udW1Vc2VzKTsKKyAgICAgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19FUlJPUiwgVktfVkFMSURBVElPTl9MRVZFTF8wLCBkZXZpY2UsIDAsIFZLVFJBQ0VTTkFQU0hPVF9PQkpFQ1RfTEVBSywgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICAgICAgICAgIHBUcmF2ID0gcFRyYXYtPnBOZXh0R2xvYmFsOworLy8gICAgICAgIH0KKyAgICB9Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVMYXllcnMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgc2l6ZV90IG1heFN0cmluZ1NpemUsIHNpemVfdCogcE91dExheWVyQ291bnQsIGNoYXIqIGNvbnN0KiBwT3V0TGF5ZXJzLCB2b2lkKiBwUmVzZXJ2ZWQpCit7CisgICAgaWYgKCh2b2lkKilwaHlzaWNhbERldmljZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgVmtCYXNlTGF5ZXJPYmplY3QqIGdwdXcgPSAoVmtCYXNlTGF5ZXJPYmplY3QgKikgcGh5c2ljYWxEZXZpY2U7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgICAgIGxsX2luY3JlbWVudF91c2VfY291bnQocGh5c2ljYWxEZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSFlTSUNBTF9ERVZJQ0VfRVhUKTsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBwQ3VyT2JqID0gZ3B1dzsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9vbmNlKCZ0YWJPbmNlLCBpbml0Vmt0cmFjZVNuYXBzaG90KTsKKyAgICAgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkVudW1lcmF0ZUxheWVycygoVmtQaHlzaWNhbERldmljZSlncHV3LT5uZXh0T2JqZWN0LCBtYXhTdHJpbmdTaXplLCBwT3V0TGF5ZXJDb3VudCwgcE91dExheWVycywgcFJlc2VydmVkKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocE91dExheWVyQ291bnQgPT0gTlVMTCB8fCBwT3V0TGF5ZXJzID09IE5VTEwgfHwgcE91dExheWVyc1swXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfSU5WQUxJRF9QT0lOVEVSOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgbGF5ZXIgY29tcGF0aWJsZSB3aXRoIGFsbCBkZXZpY2VzCisgICAgICAgICpwT3V0TGF5ZXJDb3VudCA9IDE7CisgICAgICAgIHN0cm5jcHkoKGNoYXIgKikgcE91dExheWVyc1swXSwgTEFZRVJfTkFNRV9TVFIsIG1heFN0cmluZ1NpemUpOworICAgICAgICByZXR1cm4gVktfU1VDQ0VTUzsKKyAgICB9Cit9CitzdHJ1Y3QgZXh0UHJvcHMgeworICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgY29uc3QgY2hhciAqIGNvbnN0IG5hbWU7Cit9OworCisjZGVmaW5lIFZLVFJBQ0VfU05BUFNIT1RfTEFZRVJfRVhUX0FSUkFZX1NJWkUgMQorc3RhdGljIGNvbnN0IHN0cnVjdCBleHRQcm9wcyBtdEV4dHNbVktUUkFDRV9TTkFQU0hPVF9MQVlFUl9FWFRfQVJSQVlfU0laRV0gPSB7CisgICAgLy8gVE9ETyB3aGF0IGlzIHRoZSB2ZXJzaW9uPworeyAweDEwLCBMQVlFUl9OQU1FX1NUUiB9Cit9OworCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0R2xvYmFsRXh0ZW5zaW9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtFeHRlbnNpb25JbmZvVHlwZSBpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXh0ZW5zaW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogIHBEYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgcERhdGEpCit7CisgICAgLyogVGhpcyBlbnRyeXBvaW50IGlzIE5PVCBnb2luZyB0byBpbml0IGl0J3Mgb3duIGRpc3BhdGNoIHRhYmxlIHNpbmNlIGxvYWRlciBjYWxscyBoZXJlIGVhcmx5ICovCisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzICpleHRfcHJvcHM7CisgICAgdWludDMyX3QgKmNvdW50OworCisgICAgaWYgKHBEYXRhU2l6ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVktfRVJST1JfSU5WQUxJRF9QT0lOVEVSOworCisgICAgc3dpdGNoIChpbmZvVHlwZSkgeworICAgICAgICBjYXNlIFZLX0VYVEVOU0lPTl9JTkZPX1RZUEVfQ09VTlQ6CisgICAgICAgICAgICAqcERhdGFTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIGlmIChwRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgICAgICAgICAgY291bnQgPSAodWludDMyX3QgKikgcERhdGE7CisgICAgICAgICAgICAqY291bnQgPSBWS1RSQUNFX1NOQVBTSE9UX0xBWUVSX0VYVF9BUlJBWV9TSVpFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfRVhURU5TSU9OX0lORk9fVFlQRV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgKnBEYXRhU2l6ZSA9IHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpOworICAgICAgICAgICAgaWYgKHBEYXRhID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uSW5kZXggPj0gVktUUkFDRV9TTkFQU0hPVF9MQVlFUl9FWFRfQVJSQVlfU0laRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfSU5WQUxJRF9WQUxVRTsKKyAgICAgICAgICAgIGV4dF9wcm9wcyA9IChWa0V4dGVuc2lvblByb3BlcnRpZXMgKikgcERhdGE7CisgICAgICAgICAgICBleHRfcHJvcHMtPnZlcnNpb24gPSBtdEV4dHNbZXh0ZW5zaW9uSW5kZXhdLnZlcnNpb247CisgICAgICAgICAgICBzdHJuY3B5KGV4dF9wcm9wcy0+ZXh0ZW5zaW9uTmFtZSwgbXRFeHRzW2V4dGVuc2lvbkluZGV4XS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX01BWF9FWFRFTlNJT05fTkFNRV9TSVpFKTsKKyAgICAgICAgICAgIGV4dF9wcm9wcy0+ZXh0ZW5zaW9uTmFtZVtWS19NQVhfRVhURU5TSU9OX05BTUVfU0laRSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOVkFMSURfVkFMVUU7CisgICAgfTsKKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtHZXREZXZpY2VRdWV1ZShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IHF1ZXVlTm9kZUluZGV4LCB1aW50MzJfdCBxdWV1ZUluZGV4LCBWa1F1ZXVlKiBwUXVldWUpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuR2V0RGV2aWNlUXVldWUoZGV2aWNlLCBxdWV1ZU5vZGVJbmRleCwgcXVldWVJbmRleCwgcFF1ZXVlKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlU3VibWl0KFZrUXVldWUgcXVldWUsIHVpbnQzMl90IGNvbW1hbmRCdWZmZXJDb3VudCwgY29uc3QgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMsIFZrRmVuY2UgZmVuY2UpCit7CisgICAgc2V0X3N0YXR1cyhmZW5jZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVCwgT0JKU1RBVFVTX0ZFTkNFX0lTX1NVQk1JVFRFRCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLlF1ZXVlU3VibWl0KHF1ZXVlLCBjb21tYW5kQnVmZmVyQ291bnQsIHBDb21tYW5kQnVmZmVycywgZmVuY2UpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtRdWV1ZVdhaXRJZGxlKFZrUXVldWUgcXVldWUpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLlF1ZXVlV2FpdElkbGUocXVldWUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEZXZpY2VXYWl0SWRsZShWa0RldmljZSBkZXZpY2UpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuRGV2aWNlV2FpdElkbGUoZGV2aWNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeUFsbG9jYXRlSW5mbyogcEFsbG9jYXRlSW5mbywgVmtEZXZpY2VNZW1vcnkqIHBNZW1vcnkpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQWxsb2NhdGVNZW1vcnkoZGV2aWNlLCBwQWxsb2NhdGVJbmZvLCBwTWVtb3J5KTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBNZW1vcnksIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrRnJlZU1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSkKK3sKKyAgICBuZXh0VGFibGUuRnJlZU1lbW9yeShkZXZpY2UsIG1lbSk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBzbmFwc2hvdF9yZW1vdmVfb2JqZWN0KCZzX2RlbHRhLCBtZW0pOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1NldE1lbW9yeVByaW9yaXR5KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtLCBWa01lbW9yeVByaW9yaXR5IHByaW9yaXR5KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChtZW0sIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5TZXRNZW1vcnlQcmlvcml0eShkZXZpY2UsIG1lbSwgcHJpb3JpdHkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtNYXBNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW0sIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCBWa01lbW9yeU1hcEZsYWdzIGZsYWdzLCB2b2lkKiogcHBEYXRhKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChtZW0sIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfTUVNT1JZX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIHNldF9zdGF0dXMobWVtLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQsIE9CSlNUQVRVU19HUFVfTUVNX01BUFBFRCk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLk1hcE1lbW9yeShkZXZpY2UsIG1lbSwgb2Zmc2V0LCBzaXplLCBmbGFncywgcHBEYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtVbm1hcE1lbW9yeShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQobWVtLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICByZXNldF9zdGF0dXMobWVtLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQsIE9CSlNUQVRVU19HUFVfTUVNX01BUFBFRCk7CisgICAgbmV4dFRhYmxlLlVubWFwTWVtb3J5KGRldmljZSwgbWVtKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1BpblN5c3RlbU1lbW9yeShWa0RldmljZSBkZXZpY2UsIGNvbnN0IHZvaWQqIHBTeXNNZW0sIHNpemVfdCBtZW1TaXplLCBWa0RldmljZU1lbW9yeSogcE1lbW9yeSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5QaW5TeXN0ZW1NZW1vcnkoZGV2aWNlLCBwU3lzTWVtLCBtZW1TaXplLCBwTWVtb3J5KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0TXVsdGlEZXZpY2VDb21wYXRpYmlsaXR5KFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UwLCBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlMSwgVmtQaHlzaWNhbERldmljZUNvbXBhdGliaWxpdHlJbmZvKiBwSW5mbykKK3sKKyAgICBWa0Jhc2VMYXllck9iamVjdCogZ3B1dyA9IChWa0Jhc2VMYXllck9iamVjdCAqKSBwaHlzaWNhbERldmljZTA7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KHBoeXNpY2FsRGV2aWNlMCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBwQ3VyT2JqID0gZ3B1dzsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX29uY2UoJnRhYk9uY2UsIGluaXRWa3RyYWNlU25hcHNob3QpOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5HZXRNdWx0aURldmljZUNvbXBhdGliaWxpdHkoKFZrUGh5c2ljYWxEZXZpY2UpZ3B1dy0+bmV4dE9iamVjdCwgcGh5c2ljYWxEZXZpY2UxLCBwSW5mbyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a09wZW5TaGFyZWRNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa01lbW9yeU9wZW5JbmZvKiBwT3BlbkluZm8sIFZrRGV2aWNlTWVtb3J5KiBwTWVtb3J5KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLk9wZW5TaGFyZWRNZW1vcnkoZGV2aWNlLCBwT3BlbkluZm8sIHBNZW1vcnkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtPcGVuU2hhcmVkU2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVPcGVuSW5mbyogcE9wZW5JbmZvLCBWa1NlbWFwaG9yZSogcFNlbWFwaG9yZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5PcGVuU2hhcmVkU2VtYXBob3JlKGRldmljZSwgcE9wZW5JbmZvLCBwU2VtYXBob3JlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrT3BlblBlZXJNZW1vcnkoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BlZXJNZW1vcnlPcGVuSW5mbyogcE9wZW5JbmZvLCBWa0RldmljZU1lbW9yeSogcE1lbW9yeSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5PcGVuUGVlck1lbW9yeShkZXZpY2UsIHBPcGVuSW5mbywgcE1lbW9yeSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a09wZW5QZWVySW1hZ2UoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1BlZXJJbWFnZU9wZW5JbmZvKiBwT3BlbkluZm8sIFZrSW1hZ2UqIHBJbWFnZSwgVmtEZXZpY2VNZW1vcnkqIHBNZW1vcnkpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuT3BlblBlZXJJbWFnZShkZXZpY2UsIHBPcGVuSW5mbywgcEltYWdlLCBwTWVtb3J5KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtEZXN0cm95T2JqZWN0KFZrRGV2aWNlIGRldmljZSwgVmtPYmplY3RUeXBlIG9ialR5cGUsIFZrT2JqZWN0IG9iamVjdCkKK3sKKyAgICBuZXh0VGFibGUuRGVzdHJveU9iamVjdChkZXZpY2UsIG9ialR5cGUsIG9iamVjdCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBzbmFwc2hvdF9yZW1vdmVfb2JqZWN0KCZzX2RlbHRhLCBvYmplY3QpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldE9iamVjdEluZm8oVmtEZXZpY2UgZGV2aWNlLCBWa09iamVjdFR5cGUgb2JqVHlwZSwgVmtPYmplY3Qgb2JqZWN0LCBWa09iamVjdEluZm9UeXBlIGluZm9UeXBlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KG9iamVjdCwgbGxfZ2V0X29ial90eXBlKG9iamVjdCkpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuR2V0T2JqZWN0SW5mbyhkZXZpY2UsIG9ialR5cGUsIG9iamVjdCwgaW5mb1R5cGUsIHBEYXRhU2l6ZSwgcERhdGEpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtRdWV1ZUJpbmRPYmplY3RNZW1vcnkoVmtRdWV1ZSBxdWV1ZSwgVmtPYmplY3RUeXBlIG9ialR5cGUsIFZrT2JqZWN0IG9iamVjdCwgdWludDMyX3QgYWxsb2NhdGlvbklkeCwgVmtEZXZpY2VNZW1vcnkgbWVtLCBWa0RldmljZVNpemUgb2Zmc2V0KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChvYmplY3QsIGxsX2dldF9vYmpfdHlwZShvYmplY3QpKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLlF1ZXVlQmluZE9iamVjdE1lbW9yeShxdWV1ZSwgb2JqVHlwZSwgb2JqZWN0LCBhbGxvY2F0aW9uSWR4LCBtZW0sIG9mZnNldCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1F1ZXVlQmluZE9iamVjdE1lbW9yeVJhbmdlKFZrUXVldWUgcXVldWUsIFZrT2JqZWN0VHlwZSBvYmpUeXBlLCBWa09iamVjdCBvYmplY3QsIHVpbnQzMl90IGFsbG9jYXRpb25JZHgsIFZrRGV2aWNlU2l6ZSByYW5nZU9mZnNldCwgVmtEZXZpY2VTaXplIHJhbmdlU2l6ZSwgVmtEZXZpY2VNZW1vcnkgbWVtLCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChvYmplY3QsIGxsX2dldF9vYmpfdHlwZShvYmplY3QpKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLlF1ZXVlQmluZE9iamVjdE1lbW9yeVJhbmdlKHF1ZXVlLCBvYmpUeXBlLCBvYmplY3QsIGFsbG9jYXRpb25JZHgsIHJhbmdlT2Zmc2V0LCByYW5nZVNpemUsIG1lbSwgbWVtb3J5T2Zmc2V0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrUXVldWVCaW5kSW1hZ2VNZW1vcnlSYW5nZShWa1F1ZXVlIHF1ZXVlLCBWa0ltYWdlIGltYWdlLCB1aW50MzJfdCBhbGxvY2F0aW9uSWR4LCBjb25zdCBWa0ltYWdlTWVtb3J5QmluZEluZm8qIHBCaW5kSW5mbywgVmtEZXZpY2VNZW1vcnkgbWVtLCBWa0RldmljZVNpemUgbWVtb3J5T2Zmc2V0KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChpbWFnZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5RdWV1ZUJpbmRJbWFnZU1lbW9yeVJhbmdlKHF1ZXVlLCBpbWFnZSwgYWxsb2NhdGlvbklkeCwgcEJpbmRJbmZvLCBtZW0sIG1lbW9yeU9mZnNldCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUZlbmNlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtGZW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0ZlbmNlKiBwRmVuY2UpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlRmVuY2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEZlbmNlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBGZW5jZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldEZlbmNlU3RhdHVzKFZrRGV2aWNlIGRldmljZSwgVmtGZW5jZSBmZW5jZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZmVuY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GRU5DRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICAvLyBXYXJuIGlmIHN1Ym1pdHRlZF9mbGFnIGlzIG5vdCBzZXQKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuR2V0RmVuY2VTdGF0dXMoZGV2aWNlLCBmZW5jZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1dhaXRGb3JGZW5jZXMoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBmZW5jZUNvdW50LCBjb25zdCBWa0ZlbmNlKiBwRmVuY2VzLCBib29sMzJfdCB3YWl0QWxsLCB1aW50NjRfdCB0aW1lb3V0KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLldhaXRGb3JGZW5jZXMoZGV2aWNlLCBmZW5jZUNvdW50LCBwRmVuY2VzLCB3YWl0QWxsLCB0aW1lb3V0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlU2VtYXBob3JlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtTZW1hcGhvcmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtTZW1hcGhvcmUqIHBTZW1hcGhvcmUpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlU2VtYXBob3JlKGRldmljZSwgcENyZWF0ZUluZm8sIHBTZW1hcGhvcmUpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcE5vZGUgPSBzbmFwc2hvdF9pbnNlcnRfb2JqZWN0KCZzX2RlbHRhLCAqcFNlbWFwaG9yZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NFTUFQSE9SRV9FWFQpOworICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVFdmVudChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRXZlbnRDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtFdmVudCogcEV2ZW50KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkNyZWF0ZUV2ZW50KGRldmljZSwgcENyZWF0ZUluZm8sIHBFdmVudCk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsICpwRXZlbnQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQpOworICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtHZXRFdmVudFN0YXR1cyhWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGV2ZW50LCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRVZFTlRfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkdldEV2ZW50U3RhdHVzKGRldmljZSwgZXZlbnQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtTZXRFdmVudChWa0RldmljZSBkZXZpY2UsIFZrRXZlbnQgZXZlbnQpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGV2ZW50LCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRVZFTlRfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLlNldEV2ZW50KGRldmljZSwgZXZlbnQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtSZXNldEV2ZW50KFZrRGV2aWNlIGRldmljZSwgVmtFdmVudCBldmVudCkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZXZlbnQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuUmVzZXRFdmVudChkZXZpY2UsIGV2ZW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlUXVlcnlQb29sKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtRdWVyeVBvb2xDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtRdWVyeVBvb2wqIHBRdWVyeVBvb2wpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlUXVlcnlQb29sKGRldmljZSwgcENyZWF0ZUluZm8sIHBRdWVyeVBvb2wpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcE5vZGUgPSBzbmFwc2hvdF9pbnNlcnRfb2JqZWN0KCZzX2RlbHRhLCAqcFF1ZXJ5UG9vbCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhUKTsKKyAgICAgICAgcE5vZGUtPm9iai5wU3RydWN0ID0gTlVMTDsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0UXVlcnlQb29sUmVzdWx0cyhWa0RldmljZSBkZXZpY2UsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCwgc2l6ZV90KiBwRGF0YVNpemUsIHZvaWQqIHBEYXRhLCBWa1F1ZXJ5UmVzdWx0RmxhZ3MgZmxhZ3MpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KHF1ZXJ5UG9vbCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVJZX1BPT0xfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkdldFF1ZXJ5UG9vbFJlc3VsdHMoZGV2aWNlLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQsIHBEYXRhU2l6ZSwgcERhdGEsIGZsYWdzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrR2V0Rm9ybWF0SW5mbyhWa0RldmljZSBkZXZpY2UsIFZrRm9ybWF0IGZvcm1hdCwgVmtGb3JtYXRJbmZvVHlwZSBpbmZvVHlwZSwgc2l6ZV90KiBwRGF0YVNpemUsIHZvaWQqIHBEYXRhKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkdldEZvcm1hdEluZm8oZGV2aWNlLCBmb3JtYXQsIGluZm9UeXBlLCBwRGF0YVNpemUsIHBEYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQnVmZmVyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtCdWZmZXIqIHBCdWZmZXIpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlQnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBCdWZmZXIpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcE5vZGUgPSBzbmFwc2hvdF9pbnNlcnRfb2JqZWN0KCZzX2RlbHRhLCAqcEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9FWFQpOworICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVCdWZmZXJWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtCdWZmZXJWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrQnVmZmVyVmlldyogcFZpZXcpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlQnVmZmVyVmlldyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwVmlldyk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsICpwVmlldywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0JVRkZFUl9WSUVXX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUltYWdlKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0ltYWdlKiBwSW1hZ2UpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlSW1hZ2UoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEltYWdlKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBJbWFnZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0dldEltYWdlU3VicmVzb3VyY2VJbmZvKFZrRGV2aWNlIGRldmljZSwgVmtJbWFnZSBpbWFnZSwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlKiBwU3VicmVzb3VyY2UsIFZrU3VicmVzb3VyY2VJbmZvVHlwZSBpbmZvVHlwZSwgc2l6ZV90KiBwRGF0YVNpemUsIHZvaWQqIHBEYXRhKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChpbWFnZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5HZXRJbWFnZVN1YnJlc291cmNlSW5mbyhkZXZpY2UsIGltYWdlLCBwU3VicmVzb3VyY2UsIGluZm9UeXBlLCBwRGF0YVNpemUsIHBEYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlSW1hZ2VWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtJbWFnZVZpZXcqIHBWaWV3KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkNyZWF0ZUltYWdlVmlldyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwVmlldyk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsICpwVmlldywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhUKTsKKyAgICAgICAgcE5vZGUtPm9iai5wU3RydWN0ID0gTlVMTDsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQ3JlYXRlQ29sb3JBdHRhY2htZW50VmlldyhWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29sb3JBdHRhY2htZW50Vmlld0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0NvbG9yQXR0YWNobWVudFZpZXcqIHBWaWV3KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkNyZWF0ZUNvbG9yQXR0YWNobWVudFZpZXcoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcFZpZXcpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcE5vZGUgPSBzbmFwc2hvdF9pbnNlcnRfb2JqZWN0KCZzX2RlbHRhLCAqcFZpZXcsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT0xPUl9BVFRBQ0hNRU5UX1ZJRVcpOworICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZXB0aFN0ZW5jaWxWaWV3KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtEZXB0aFN0ZW5jaWxWaWV3Q3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGVwdGhTdGVuY2lsVmlldyogcFZpZXcpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlRGVwdGhTdGVuY2lsVmlldyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwVmlldyk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsICpwVmlldywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFUFRIX1NURU5DSUxfVklFVyk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtQaXBlbGluZSogcFBpcGVsaW5lKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcFBpcGVsaW5lKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBQaXBlbGluZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrUGlwZWxpbmUqIHBQaXBlbGluZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5DcmVhdGVDb21wdXRlUGlwZWxpbmUoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcFBpcGVsaW5lKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBQaXBlbGluZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1N0b3JlUGlwZWxpbmUoVmtEZXZpY2UgZGV2aWNlLCBWa1BpcGVsaW5lIHBpcGVsaW5lLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KHBpcGVsaW5lLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLlN0b3JlUGlwZWxpbmUoZGV2aWNlLCBwaXBlbGluZSwgcERhdGFTaXplLCBwRGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0xvYWRQaXBlbGluZShWa0RldmljZSBkZXZpY2UsIHNpemVfdCBkYXRhU2l6ZSwgY29uc3Qgdm9pZCogcERhdGEsIFZrUGlwZWxpbmUqIHBQaXBlbGluZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5Mb2FkUGlwZWxpbmUoZGV2aWNlLCBkYXRhU2l6ZSwgcERhdGEsIHBQaXBlbGluZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZVNhbXBsZXIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1NhbXBsZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtTYW1wbGVyKiBwU2FtcGxlcikKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5DcmVhdGVTYW1wbGVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBTYW1wbGVyKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBTYW1wbGVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9FWFQpOworICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KCBWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqIHBTZXRMYXlvdXQpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlRGVzY3JpcHRvclNldExheW91dChkZXZpY2UsIHBDcmVhdGVJbmZvLCBwU2V0TGF5b3V0KTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBTZXRMYXlvdXQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfRVhUKTsKKyAgICAgICAgcE5vZGUtPm9iai5wU3RydWN0ID0gTlVMTDsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQmVnaW5EZXNjcmlwdG9yUG9vbFVwZGF0ZShWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclVwZGF0ZU1vZGUgdXBkYXRlTW9kZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5CZWdpbkRlc2NyaXB0b3JQb29sVXBkYXRlKGRldmljZSwgdXBkYXRlTW9kZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VuZERlc2NyaXB0b3JQb29sVXBkYXRlKFZrRGV2aWNlIGRldmljZSwgVmtDb21tYW5kQnVmZmVyIGNtZCkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5FbmREZXNjcmlwdG9yUG9vbFVwZGF0ZShkZXZpY2UsIGNtZCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0NyZWF0ZURlc2NyaXB0b3JQb29sKFZrRGV2aWNlIGRldmljZSwgVmtEZXNjcmlwdG9yUG9vbFVzYWdlIHBvb2xVc2FnZSwgdWludDMyX3QgbWF4U2V0cywgY29uc3QgVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLCBWa0Rlc2NyaXB0b3JQb29sKiBwRGVzY3JpcHRvclBvb2wpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwb29sVXNhZ2UsIG1heFNldHMsIHBDcmVhdGVJbmZvLCBwRGVzY3JpcHRvclBvb2wpOworICAgIGlmIChyZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcE5vZGUgPSBzbmFwc2hvdF9pbnNlcnRfb2JqZWN0KCZzX2RlbHRhLCAqcERlc2NyaXB0b3JQb29sLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0RGVzY3JpcHRvclBvb2woVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXNjcmlwdG9yUG9vbCwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfUE9PTF9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuUmVzZXREZXNjcmlwdG9yUG9vbChkZXZpY2UsIGRlc2NyaXB0b3JQb29sKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclBvb2wgZGVzY3JpcHRvclBvb2wsIFZrRGVzY3JpcHRvclNldFVzYWdlIHNldFVzYWdlLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiBwU2V0TGF5b3V0cywgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIHVpbnQzMl90KiBwQ291bnQpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRlc2NyaXB0b3JQb29sLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5BbGxvY2F0ZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIHNldFVzYWdlLCBjb3VudCwgcFNldExheW91dHMsIHBEZXNjcmlwdG9yU2V0cywgcENvdW50KTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKnBDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsIHBEZXNjcmlwdG9yU2V0c1tpXSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFU0NSSVBUT1JfU0VUX0VYVCk7CisgICAgICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworICAgICAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NsZWFyRGVzY3JpcHRvclNldHMoVmtEZXZpY2UgZGV2aWNlLCBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRlc2NyaXB0b3JQb29sLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbGVhckRlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIGNvdW50LCBwRGVzY3JpcHRvclNldHMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtVcGRhdGVEZXNjcmlwdG9ycyhWa0RldmljZSBkZXZpY2UsIFZrRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yU2V0LCB1aW50MzJfdCB1cGRhdGVDb3VudCwgY29uc3Qgdm9pZCoqIHBwVXBkYXRlQXJyYXkpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRlc2NyaXB0b3JTZXQsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuVXBkYXRlRGVzY3JpcHRvcnMoZGV2aWNlLCBkZXNjcmlwdG9yU2V0LCB1cGRhdGVDb3VudCwgcHBVcGRhdGVBcnJheSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcikKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5BbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKGRldmljZSwgcENyZWF0ZUluZm8sIHBDb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgICAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBOb2RlID0gc25hcHNob3RfaW5zZXJ0X29iamVjdCgmc19kZWx0YSwgKnBDb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICAgICAgcE5vZGUtPm9iai5wU3RydWN0ID0gTlVMTDsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrQmVnaW5Db21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIHBCZWdpbkluZm8pCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQmVnaW5Db21tYW5kQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHBCZWdpbkluZm8pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbmRDb21tYW5kQnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkVuZENvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a1Jlc2V0Q29tbWFuZEJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5SZXNldENvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZFBpcGVsaW5lKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1BpcGVsaW5lQmluZFBvaW50IHBpcGVsaW5lQmluZFBvaW50LCBWa1BpcGVsaW5lIHBpcGVsaW5lKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZEJpbmRQaXBlbGluZShjb21tYW5kQnVmZmVyLCBwaXBlbGluZUJpbmRQb2ludCwgcGlwZWxpbmUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRCaW5kRGVzY3JpcHRvclNldHMoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUGlwZWxpbmVCaW5kUG9pbnQgcGlwZWxpbmVCaW5kUG9pbnQsIHVpbnQzMl90IGZpcnN0U2V0LCB1aW50MzJfdCBzZXRDb3VudCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMsIHVpbnQzMl90IGR5bmFtaWNPZmZzZXRDb3VudCwgY29uc3QgdWludDMyX3QqIHBEeW5hbWljT2Zmc2V0cykKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRCaW5kRGVzY3JpcHRvclNldHMoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIGZpcnN0U2V0LCBzZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzLCBkeW5hbWljT2Zmc2V0Q291bnQsIHBEeW5hbWljT2Zmc2V0cyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmZmVycywKKyAgICBjb25zdCBWa0RldmljZVNpemUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2Zmc2V0cykKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRCaW5kVmVydGV4QnVmZmVycyhjb21tYW5kQnVmZmVyLCBmaXJzdEJpbmRpbmcsIGJpbmRpbmdDb3VudCwgcEJ1ZmZlcnMsIHBPZmZzZXRzKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmluZEluZGV4QnVmZmVyKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrSW5kZXhUeXBlIGluZGV4VHlwZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRCaW5kSW5kZXhCdWZmZXIoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGluZGV4VHlwZSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXcoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIHVpbnQzMl90IGZpcnN0VmVydGV4LCB1aW50MzJfdCB2ZXJ0ZXhDb3VudCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSwgdWludDMyX3QgaW5zdGFuY2VDb3VudCkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWREcmF3KGNvbW1hbmRCdWZmZXIsIGZpcnN0VmVydGV4LCB2ZXJ0ZXhDb3VudCwgZmlyc3RJbnN0YW5jZSwgaW5zdGFuY2VDb3VudCk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERyYXdJbmRleGVkKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCB1aW50MzJfdCBmaXJzdEluZGV4LCBpbnQzMl90IHZlcnRleE9mZnNldCwgdWludDMyX3QgZmlyc3RJbnN0YW5jZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWREcmF3SW5kZXhlZChjb21tYW5kQnVmZmVyLCBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdEluZGV4LCB2ZXJ0ZXhPZmZzZXQsIGZpcnN0SW5zdGFuY2UpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kaXJlY3QoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGJ1ZmZlciwgVmtEZXZpY2VTaXplIG9mZnNldCwgdWludDMyX3QgY291bnQsIHVpbnQzMl90IHN0cmlkZSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWREcmF3SW5kaXJlY3QoY29tbWFuZEJ1ZmZlciwgYnVmZmVyLCBvZmZzZXQsIGNvdW50LCBzdHJpZGUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBzdHJpZGUpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kRHJhd0luZGV4ZWRJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCwgY291bnQsIHN0cmlkZSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERpc3BhdGNoKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZERpc3BhdGNoKGNvbW1hbmRCdWZmZXIsIHgsIHksIHopOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWREaXNwYXRjaEluZGlyZWN0KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0J1ZmZlciBidWZmZXIsIFZrRGV2aWNlU2l6ZSBvZmZzZXQpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kRGlzcGF0Y2hJbmRpcmVjdChjb21tYW5kQnVmZmVyLCBidWZmZXIsIG9mZnNldCk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENvcHlCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJDb3B5KiBwUmVnaW9ucykKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRDb3B5QnVmZmVyKGNvbW1hbmRCdWZmZXIsIHNyY0J1ZmZlciwgZHN0QnVmZmVyLCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5SW1hZ2UoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrSW1hZ2Ugc3JjSW1hZ2UsIFZrSW1hZ2VMYXlvdXQgc3JjSW1hZ2VMYXlvdXQsIFZrSW1hZ2UgZHN0SW1hZ2UsIFZrSW1hZ2VMYXlvdXQgZHN0SW1hZ2VMYXlvdXQsIHVpbnQzMl90IHJlZ2lvbkNvdW50LCBjb25zdCBWa0ltYWdlQ29weSogcFJlZ2lvbnMpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kQ29weUltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5QnVmZmVyVG9JbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgc3JjQnVmZmVyLCBWa0ltYWdlIGRzdEltYWdlLCBWa0ltYWdlTGF5b3V0IGRzdEltYWdlTGF5b3V0LCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZENvcHlCdWZmZXJUb0ltYWdlKGNvbW1hbmRCdWZmZXIsIHNyY0J1ZmZlciwgZHN0SW1hZ2UsIGRzdEltYWdlTGF5b3V0LCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDb3B5SW1hZ2VUb0J1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtCdWZmZXIgZHN0QnVmZmVyLCB1aW50MzJfdCByZWdpb25Db3VudCwgY29uc3QgVmtCdWZmZXJJbWFnZUNvcHkqIHBSZWdpb25zKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZENvcHlJbWFnZVRvQnVmZmVyKGNvbW1hbmRCdWZmZXIsIHNyY0ltYWdlLCBzcmNJbWFnZUxheW91dCwgZHN0QnVmZmVyLCByZWdpb25Db3VudCwgcFJlZ2lvbnMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRDbG9uZUltYWdlRGF0YShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRDbG9uZUltYWdlRGF0YShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFVwZGF0ZUJ1ZmZlcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtCdWZmZXIgZHN0QnVmZmVyLCBWa0RldmljZVNpemUgZHN0T2Zmc2V0LCBWa0RldmljZVNpemUgZGF0YVNpemUsIGNvbnN0IHVpbnQzMl90KiBwRGF0YSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRVcGRhdGVCdWZmZXIoY29tbWFuZEJ1ZmZlciwgZHN0QnVmZmVyLCBkc3RPZmZzZXQsIGRhdGFTaXplLCBwRGF0YSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEZpbGxCdWZmZXIoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCwgVmtEZXZpY2VTaXplIHNpemUsIHVpbnQzMl90IGRhdGEpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kRmlsbEJ1ZmZlcihjb21tYW5kQnVmZmVyLCBkc3RCdWZmZXIsIGRzdE9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENsZWFyQ29sb3JJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwgVmtJbWFnZUxheW91dCBpbWFnZUxheW91dCwgVmtDbGVhckNvbG9yIGNvbG9yLCB1aW50MzJfdCByYW5nZUNvdW50LCBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSogcFJhbmdlcykKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRDbGVhckNvbG9ySW1hZ2UoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBjb2xvciwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZENsZWFyRGVwdGhTdGVuY2lsKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0ltYWdlIGltYWdlLCBWa0ltYWdlTGF5b3V0IGltYWdlTGF5b3V0LCBmbG9hdCBkZXB0aCwgdWludDMyX3Qgc3RlbmNpbCwgdWludDMyX3QgcmFuZ2VDb3VudCwgY29uc3QgVmtJbWFnZVN1YnJlc291cmNlUmFuZ2UqIHBSYW5nZXMpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kQ2xlYXJEZXB0aFN0ZW5jaWwoY29tbWFuZEJ1ZmZlciwgaW1hZ2UsIGltYWdlTGF5b3V0LCBkZXB0aCwgc3RlbmNpbCwgcmFuZ2VDb3VudCwgcFJhbmdlcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFJlc29sdmVJbWFnZShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBzcmNJbWFnZSwgVmtJbWFnZUxheW91dCBzcmNJbWFnZUxheW91dCwgVmtJbWFnZSBkc3RJbWFnZSwgVmtJbWFnZUxheW91dCBkc3RJbWFnZUxheW91dCwgdWludDMyX3QgcmVjdENvdW50LCBjb25zdCBWa0ltYWdlUmVzb2x2ZSogcFJlY3RzKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZFJlc29sdmVJbWFnZShjb21tYW5kQnVmZmVyLCBzcmNJbWFnZSwgc3JjSW1hZ2VMYXlvdXQsIGRzdEltYWdlLCBkc3RJbWFnZUxheW91dCwgcmVjdENvdW50LCBwUmVjdHMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRTZXRFdmVudChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtFdmVudCBldmVudCwgVmtQaXBlRXZlbnQgcGlwZUV2ZW50KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZFNldEV2ZW50KGNvbW1hbmRCdWZmZXIsIGV2ZW50LCBwaXBlRXZlbnQpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRSZXNldEV2ZW50KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa0V2ZW50IGV2ZW50LCBWa1BpcGVFdmVudCBwaXBlRXZlbnQpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kUmVzZXRFdmVudChjb21tYW5kQnVmZmVyLCBldmVudCwgcGlwZUV2ZW50KTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kV2FpdEV2ZW50cygKKyAgICAgICAgVmtDb21tYW5kQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlciwKKyAgICAgICAgVmtXYWl0RXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQsCisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCwKKyAgICAgICAgY29uc3QgVmtFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRzLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgY29uc3Qgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcE1lbW9yeUJhcnJpZXJzKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZFdhaXRFdmVudHMoY29tbWFuZEJ1ZmZlciwgd2FpdEV2ZW50LCBldmVudENvdW50LCBwRXZlbnRzLCBtZW1vcnlCYXJyaWVyQ291bnQsIHBwTWVtb3J5QmFycmllcnMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRQaXBlbGluZUJhcnJpZXIoCisgICAgICAgIFZrQ29tbWFuZEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgICAgIFZrV2FpdEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVFdmVudENvdW50LAorICAgICAgICBjb25zdCBWa1BpcGVFdmVudCogICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXBlRXZlbnRzLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICAgICAgY29uc3Qgdm9pZCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcE1lbW9yeUJhcnJpZXJzKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZFBpcGVsaW5lQmFycmllcihjb21tYW5kQnVmZmVyLCB3YWl0RXZlbnQsIHBpcGVFdmVudENvdW50LCBwUGlwZUV2ZW50cywgbWVtb3J5QmFycmllckNvdW50LCBwcE1lbW9yeUJhcnJpZXJzKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmVnaW5RdWVyeShWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90LCBWa0ZsYWdzIGZsYWdzKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZEJlZ2luUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBzbG90LCBmbGFncyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFF1ZXJ5KFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsIHVpbnQzMl90IHNsb3QpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kRW5kUXVlcnkoY29tbWFuZEJ1ZmZlciwgcXVlcnlQb29sLCBzbG90KTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kUmVzZXRRdWVyeVBvb2woVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUXVlcnlQb29sIHF1ZXJ5UG9vbCwgdWludDMyX3QgZmlyc3RRdWVyeSwgdWludDMyX3QgcXVlcnlDb3VudCkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRSZXNldFF1ZXJ5UG9vbChjb21tYW5kQnVmZmVyLCBxdWVyeVBvb2wsIGZpcnN0UXVlcnksIHF1ZXJ5Q291bnQpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgdmtDbWRXcml0ZVRpbWVzdGFtcChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZVN0YWdlRmxhZ0JpdHMgcGlwZWxpbmVTdGFnZSwgVmtRdWVyeVBvb2wgcXVlcnlQb29sLCB1aW50MzJfdCBzbG90KQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZFdyaXRlVGltZXN0YW1wKGNvbW1hbmRCdWZmZXIsIHBpcGVsaW5lU3RhZ2UsIHF1ZXJ5UG9vbCwgc2xvdCk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEluaXRBdG9taWNDb3VudGVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgdWludDMyX3Qgc3RhcnRDb3VudGVyLCB1aW50MzJfdCBjb3VudGVyQ291bnQsIGNvbnN0IHVpbnQzMl90KiBwRGF0YSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRJbml0QXRvbWljQ291bnRlcnMoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHN0YXJ0Q291bnRlciwgY291bnRlckNvdW50LCBwRGF0YSk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZExvYWRBdG9taWNDb3VudGVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgdWludDMyX3Qgc3RhcnRDb3VudGVyLCB1aW50MzJfdCBjb3VudGVyQ291bnQsIFZrQnVmZmVyIHNyY0J1ZmZlciwgVmtEZXZpY2VTaXplIHNyY09mZnNldCkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRMb2FkQXRvbWljQ291bnRlcnMoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHN0YXJ0Q291bnRlciwgY291bnRlckNvdW50LCBzcmNCdWZmZXIsIHNyY09mZnNldCk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZFNhdmVBdG9taWNDb3VudGVycyhWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtQaXBlbGluZUJpbmRQb2ludCBwaXBlbGluZUJpbmRQb2ludCwgdWludDMyX3Qgc3RhcnRDb3VudGVyLCB1aW50MzJfdCBjb3VudGVyQ291bnQsIFZrQnVmZmVyIGRzdEJ1ZmZlciwgVmtEZXZpY2VTaXplIGRzdE9mZnNldCkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRTYXZlQXRvbWljQ291bnRlcnMoY29tbWFuZEJ1ZmZlciwgcGlwZWxpbmVCaW5kUG9pbnQsIHN0YXJ0Q291bnRlciwgY291bnRlckNvdW50LCBkc3RCdWZmZXIsIGRzdE9mZnNldCk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVGcmFtZWJ1ZmZlcihWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywgVmtGcmFtZWJ1ZmZlciogcEZyYW1lYnVmZmVyKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChkZXZpY2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkNyZWF0ZUZyYW1lYnVmZmVyKGRldmljZSwgcENyZWF0ZUluZm8sIHBGcmFtZWJ1ZmZlcik7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsICpwRnJhbWVidWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQpOworICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworICAgICAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtDcmVhdGVSZW5kZXJQYXNzKFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrUmVuZGVyUGFzcyogcFJlbmRlclBhc3MpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuQ3JlYXRlUmVuZGVyUGFzcyhkZXZpY2UsIHBDcmVhdGVJbmZvLCBwUmVuZGVyUGFzcyk7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsICpwUmVuZGVyUGFzcywgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1JFTkRFUl9QQVNTX0VYVCk7CisgICAgICAgIHBOb2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kQmVnaW5SZW5kZXJQYXNzKFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLCBjb25zdCBWa1JlbmRlclBhc3NCZWdpbiAqcFJlbmRlclBhc3NCZWdpbikKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWRCZWdpblJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcFJlbmRlclBhc3NCZWdpbik7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZEVuZFJlbmRlclBhc3MoVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIFZrUmVuZGVyUGFzcyByZW5kZXJQYXNzKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChjb21tYW5kQnVmZmVyLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQ09NTUFORF9CVUZGRVJfRVhUKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbmV4dFRhYmxlLkNtZEVuZFJlbmRlclBhc3MoY29tbWFuZEJ1ZmZlciwgcmVuZGVyUGFzcyk7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEYmdTZXRWYWxpZGF0aW9uTGV2ZWwoVmtEZXZpY2UgZGV2aWNlLCBWa1ZhbGlkYXRpb25MZXZlbCB2YWxpZGF0aW9uTGV2ZWwpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuRGJnU2V0VmFsaWRhdGlvbkxldmVsKGRldmljZSwgdmFsaWRhdGlvbkxldmVsKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRGJnUmVnaXN0ZXJNc2dDYWxsYmFjayhWa0luc3RhbmNlIGluc3RhbmNlLCBWS19EQkdfTVNHX0NBTExCQUNLX0ZVTkNUSU9OIHBmbk1zZ0NhbGxiYWNrLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICAgLy8gVGhpcyBsYXllciBpbnRlcmNlcHRzIGNhbGxiYWNrcworICAgIFZLX0xBWUVSX0RCR19GVU5DVElPTl9OT0RFICpwTmV3RGJnRnVuY05vZGUgPSAoVktfTEFZRVJfREJHX0ZVTkNUSU9OX05PREUqKW1hbGxvYyhzaXplb2YoVktfTEFZRVJfREJHX0ZVTkNUSU9OX05PREUpKTsKKyAgICBpZiAocE5ld0RiZ0Z1bmNOb2RlICA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVktfRVJST1JfT1VUX09GX0hPU1RfTUVNT1JZOworICAgIHBOZXdEYmdGdW5jTm9kZS0+cGZuTXNnQ2FsbGJhY2sgPSBwZm5Nc2dDYWxsYmFjazsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnBVc2VyRGF0YSA9IHBVc2VyRGF0YTsKKyAgICBwTmV3RGJnRnVuY05vZGUtPnBOZXh0ID0gZ19wRGJnRnVuY3Rpb25IZWFkOworICAgIGdfcERiZ0Z1bmN0aW9uSGVhZCA9IHBOZXdEYmdGdW5jTm9kZTsKKyAgICAvLyBmb3JjZSBjYWxsYmFja3MgaWYgRGVidWdBY3Rpb24gaGFzbid0IGJlZW4gc2V0IGFscmVhZHkgb3RoZXIgdGhhbiBpbml0aWFsIHZhbHVlCisgICAgaWYgKGdfYWN0aW9uSXNEZWZhdWx0KSB7CisgICAgICAgIGdfZGVidWdBY3Rpb24gPSBWS19EQkdfTEFZRVJfQUNUSU9OX0NBTExCQUNLOworICAgIH0gICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkRiZ1JlZ2lzdGVyTXNnQ2FsbGJhY2soaW5zdGFuY2UsIHBmbk1zZ0NhbGxiYWNrLCBwVXNlckRhdGEpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEYmdVbnJlZ2lzdGVyTXNnQ2FsbGJhY2soVmtJbnN0YW5jZSBpbnN0YW5jZSwgVktfREJHX01TR19DQUxMQkFDS19GVU5DVElPTiBwZm5Nc2dDYWxsYmFjaykKK3sKKyAgICBWS19MQVlFUl9EQkdfRlVOQ1RJT05fTk9ERSAqcFRyYXYgPSBnX3BEYmdGdW5jdGlvbkhlYWQ7CisgICAgVktfTEFZRVJfREJHX0ZVTkNUSU9OX05PREUgKnBQcmV2ID0gcFRyYXY7CisgICAgd2hpbGUgKHBUcmF2KSB7CisgICAgICAgIGlmIChwVHJhdi0+cGZuTXNnQ2FsbGJhY2sgPT0gcGZuTXNnQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHBQcmV2LT5wTmV4dCA9IHBUcmF2LT5wTmV4dDsKKyAgICAgICAgICAgIGlmIChnX3BEYmdGdW5jdGlvbkhlYWQgPT0gcFRyYXYpCisgICAgICAgICAgICAgICAgZ19wRGJnRnVuY3Rpb25IZWFkID0gcFRyYXYtPnBOZXh0OworICAgICAgICAgICAgZnJlZShwVHJhdik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwUHJldiA9IHBUcmF2OworICAgICAgICBwVHJhdiA9IHBUcmF2LT5wTmV4dDsKKyAgICB9CisgICAgaWYgKGdfcERiZ0Z1bmN0aW9uSGVhZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGdfYWN0aW9uSXNEZWZhdWx0KQorICAgICAgICAgICAgZ19kZWJ1Z0FjdGlvbiA9IFZLX0RCR19MQVlFUl9BQ1RJT05fTE9HX01TRzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ19kZWJ1Z0FjdGlvbiAmPSB+VktfREJHX0xBWUVSX0FDVElPTl9DQUxMQkFDSzsKKyAgICB9CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkRiZ1VucmVnaXN0ZXJNc2dDYWxsYmFjayhpbnN0YW5jZSwgcGZuTXNnQ2FsbGJhY2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtEYmdTZXRNZXNzYWdlRmlsdGVyKFZrRGV2aWNlIGRldmljZSwgaW50MzJfdCBtc2dDb2RlLCBWS19EQkdfTVNHX0ZJTFRFUiBmaWx0ZXIpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRldmljZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuRGJnU2V0TWVzc2FnZUZpbHRlcihkZXZpY2UsIG1zZ0NvZGUsIGZpbHRlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0RiZ1NldE9iamVjdFRhZyhWa0RldmljZSBkZXZpY2UsIFZrT2JqZWN0IG9iamVjdCwgc2l6ZV90IHRhZ1NpemUsIGNvbnN0IHZvaWQqIHBUYWcpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KG9iamVjdCwgbGxfZ2V0X29ial90eXBlKG9iamVjdCkpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuRGJnU2V0T2JqZWN0VGFnKGRldmljZSwgb2JqZWN0LCB0YWdTaXplLCBwVGFnKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRGJnU2V0R2xvYmFsT3B0aW9uKFZrSW5zdGFuY2UgaW5zdGFuY2UsIFZLX0RCR19HTE9CQUxfT1BUSU9OIGRiZ09wdGlvbiwgc2l6ZV90IGRhdGFTaXplLCBjb25zdCB2b2lkKiBwRGF0YSkKK3sKKyAgICBWa1Jlc3VsdCByZXN1bHQgPSBuZXh0VGFibGUuRGJnU2V0R2xvYmFsT3B0aW9uKGluc3RhbmNlLCBkYmdPcHRpb24sIGRhdGFTaXplLCBwRGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0RiZ1NldERldmljZU9wdGlvbihWa0RldmljZSBkZXZpY2UsIFZLX0RCR19ERVZJQ0VfT1BUSU9OIGRiZ09wdGlvbiwgc2l6ZV90IGRhdGFTaXplLCBjb25zdCB2b2lkKiBwRGF0YSkKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5EYmdTZXREZXZpY2VPcHRpb24oZGV2aWNlLCBkYmdPcHRpb24sIGRhdGFTaXplLCBwRGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIHZrQ21kRGJnTWFya2VyQmVnaW4oVmtDb21tYW5kQnVmZmVyIGNvbW1hbmRCdWZmZXIsIGNvbnN0IGNoYXIqIHBNYXJrZXIpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGNvbW1hbmRCdWZmZXIsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQpOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBuZXh0VGFibGUuQ21kRGJnTWFya2VyQmVnaW4oY29tbWFuZEJ1ZmZlciwgcE1hcmtlcik7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCB2a0NtZERiZ01hcmtlckVuZChWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlcikKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoY29tbWFuZEJ1ZmZlciwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0NPTU1BTkRfQlVGRkVSX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIG5leHRUYWJsZS5DbWREYmdNYXJrZXJFbmQoY29tbWFuZEJ1ZmZlcik7Cit9CisKK1ZLX0xBWUVSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgeGdsR2V0RGlzcGxheUluZm9XU0koVmtEaXNwbGF5V1NJIGRpc3BsYXksIFZrRGlzcGxheUluZm9UeXBlV1NJIGluZm9UeXBlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KGRpc3BsYXksIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ESVNQTEFZX1dTSSk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5HZXREaXNwbGF5SW5mb1dTSShkaXNwbGF5LCBpbmZvVHlwZSwgcERhdGFTaXplLCBwRGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB4Z2xDcmVhdGVTd2FwQ2hhaW5XU0koVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBWa1N3YXBDaGFpbkNyZWF0ZUluZm9XU0kqIHBDcmVhdGVJbmZvLCBWa1N3YXBDaGFpbldTSSogcFN3YXBDaGFpbikKK3sKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX2xvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIGxsX2luY3JlbWVudF91c2VfY291bnQoZGV2aWNlLCBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5DcmVhdGVTd2FwQ2hhaW5XU0koZGV2aWNlLCBwQ3JlYXRlSW5mbywgcFN3YXBDaGFpbik7CisgICAgaWYgKHJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKworI2lmIDAKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwTm9kZSA9IHNuYXBzaG90X2luc2VydF9vYmplY3QoJnNfZGVsdGEsICpwSW1hZ2UsIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9JTUFHRV9FWFQpOworICAgICAgICBwTm9kZS0+b2JqLnBTdHJ1Y3QgPSBOVUxMOworCisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcE1lbU5vZGUgPSBzbmFwc2hvdF9pbnNlcnRfb2JqZWN0KCZzX2RlbHRhLCAqcE1lbW9yeSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BSRVNFTlRBQkxFX0lNQUdFX01FTU9SWSk7CisgICAgICAgIHBNZW1Ob2RlLT5vYmoucFN0cnVjdCA9IE5VTEw7CisjZWxzZQorICAgICAgICBzbmFwc2hvdF9pbnNlcnRfb2JqZWN0KCZzX2RlbHRhLCAqcFN3YXBDaGFpbiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBfQ0hBSU5fV1NJKTsKKyNlbmRpZgorCisgICAgICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHhnbERlc3Ryb3lTd2FwQ2hhaW5XU0koVmtTd2FwQ2hhaW5XU0kgc3dhcENoYWluKQoreworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5EZXN0cm95U3dhcENoYWluV1NJKHN3YXBDaGFpbik7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBzbmFwc2hvdF9yZW1vdmVfb2JqZWN0KCZzX2RlbHRhLCBzd2FwQ2hhaW4pOworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfdW5sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHhnbEdldFN3YXBDaGFpbkluZm9XU0koVmtTd2FwQ2hhaW5XU0kgc3dhcENoYWluLCBWa1N3YXBDaGFpbkluZm9UeXBlV1NJIGluZm9UeXBlLCBzaXplX3QqIHBEYXRhU2l6ZSwgdm9pZCogcERhdGEpCit7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF9sb2NrX211dGV4KCZvYmpMb2NrKTsKKyAgICBsbF9pbmNyZW1lbnRfdXNlX2NvdW50KHN3YXBDaGFpbiwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1NXQVBfQ0hBSU5fV1NJKTsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX3VubG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gbmV4dFRhYmxlLkdldFN3YXBDaGFpbkluZm9XU0koc3dhcENoYWluLCBpbmZvVHlwZSwgcERhdGFTaXplLCBwRGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB4Z2xRdWV1ZVByZXNlbnRXU0koVmtRdWV1ZSBxdWV1ZSwgY29uc3QgVmtQcmVzZW50SW5mb1dTSSogcFByZXNlbnRJbmZvKQoreworICAgIGxvYWRlcl9wbGF0Zm9ybV90aHJlYWRfbG9ja19tdXRleCgmb2JqTG9jayk7CisgICAgbGxfaW5jcmVtZW50X3VzZV9jb3VudChxdWV1ZSwgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVCk7CisgICAgbG9hZGVyX3BsYXRmb3JtX3RocmVhZF91bmxvY2tfbXV0ZXgoJm9iakxvY2spOworICAgIFZrUmVzdWx0IHJlc3VsdCA9IG5leHRUYWJsZS5RdWV1ZVByZXNlbnRXU0kocXVldWUsIHBQcmVzZW50SW5mbyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBFeHBvcnRlZCBtZXRob2RzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3ZvaWQgdmt0cmFjZVNuYXBzaG90U3RhcnRUcmFja2luZyh2b2lkKQoreworICAgIGFzc2VydCghIk5vdCBJbXBsZW1lbnRlZCIpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZLVFJBQ0VfVktfU05BUFNIT1Qgdmt0cmFjZVNuYXBzaG90R2V0RGVsdGEodm9pZCkKK3sKKyAgICAvLyBjb3B5IHRoZSBkZWx0YSBieSBtZXJnaW5nIGl0IGludG8gYW4gZW1wdHkgc25hcHNob3QKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UIGVtcHR5OworICAgIG1lbXNldCgmZW1wdHksIDAsIHNpemVvZihWS1RSQUNFX1ZLX1NOQVBTSE9UKSk7CisKKyAgICByZXR1cm4gdmt0cmFjZVNuYXBzaG90TWVyZ2UoJnNfZGVsdGEsICZlbXB0eSk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVktUUkFDRV9WS19TTkFQU0hPVCB2a3RyYWNlU25hcHNob3RHZXRTbmFwc2hvdCh2b2lkKQoreworICAgIC8vIGNvcHkgdGhlIG1hc3RlciBzbmFwc2hvdCBieSBtZXJnaW5nIGl0IGludG8gYW4gZW1wdHkgc25hcHNob3QKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UIGVtcHR5OworICAgIG1lbXNldCgmZW1wdHksIDAsIHNpemVvZihWS1RSQUNFX1ZLX1NOQVBTSE9UKSk7CisKKyAgICByZXR1cm4gdmt0cmFjZVNuYXBzaG90TWVyZ2UoJnNfc25hcHNob3QsICZlbXB0eSk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCB2a3RyYWNlU25hcHNob3RQcmludERlbHRhKCkKK3sKKyAgICBjaGFyIHN0clsyMDQ4XTsKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUqIHBUcmF2ID0gc19kZWx0YS5wR2xvYmFsT2JqczsKKyAgICBzcHJpbnRmKHN0ciwgIj09PT0gREVMVEEgU05BUFNIT1QgY29udGFpbnMgJWx1IG9iamVjdHMsICVsdSBkZXZpY2VzLCBhbmQgJWx1IGRlbGV0ZWQgb2JqZWN0cyIsIHNfZGVsdGEuZ2xvYmFsT2JqQ291bnQsIHNfZGVsdGEuZGV2aWNlQ291bnQsIHNfZGVsdGEuZGVsdGFEZWxldGVkT2JqZWN0Q291bnQpOworICAgIGxheWVyQ2JNc2coVktfREJHX01TR19VTktOT1dOLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIChWa09iamVjdClOVUxMLCAwLCBWS1RSQUNFU05BUFNIT1RfU05BUFNIT1RfREFUQSwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKworICAgIC8vIHByaW50IGFsbCBvYmplY3RzCisgICAgaWYgKHNfZGVsdGEuZ2xvYmFsT2JqQ291bnQgPiAwKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihzdHIsICI9PT09PT09PSBERUxUQSBTTkFQU0hPVCBDcmVhdGVkIE9iamVjdHM6Iik7CisgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19VTktOT1dOLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIHBUcmF2LT5vYmoub2JqZWN0LCAwLCBWS1RSQUNFU05BUFNIT1RfU05BUFNIT1RfREFUQSwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICAgICAgd2hpbGUgKHBUcmF2ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYoc3RyLCAiXHQlcyBvYmogJXAiLCBzdHJpbmdfVktfT0JKRUNUX1RZUEUocFRyYXYtPm9iai5vYmpUeXBlKSwgKHZvaWQqKXBUcmF2LT5vYmoub2JqZWN0KTsKKyAgICAgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19VTktOT1dOLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIHBUcmF2LT5vYmoub2JqZWN0LCAwLCBWS1RSQUNFU05BUFNIT1RfU05BUFNIT1RfREFUQSwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICAgICAgICAgIHBUcmF2ID0gcFRyYXYtPnBOZXh0R2xvYmFsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcHJpbnQgZGV2aWNlcworICAgIGlmIChzX2RlbHRhLmRldmljZUNvdW50ID4gMCkKKyAgICB7CisgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcERldmljZU5vZGUgPSBzX2RlbHRhLnBEZXZpY2VzOworICAgICAgICBzcHJpbnRmKHN0ciwgIj09PT09PT09IERFTFRBIFNOQVBTSE9UIERldmljZXM6Iik7CisgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19VTktOT1dOLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIChWa09iamVjdClOVUxMLCAwLCBWS1RSQUNFU05BUFNIT1RfU05BUFNIT1RfREFUQSwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICAgICAgd2hpbGUgKHBEZXZpY2VOb2RlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfREVWSUNFX05PREUqIHBEZXYgPSAoVktUUkFDRV9WS19TTkFQU0hPVF9ERVZJQ0VfTk9ERSopcERldmljZU5vZGUtPm9iai5wU3RydWN0OworICAgICAgICAgICAgY2hhciAqIGNyZWF0ZUluZm9TdHIgPSB2a19wcmludF92a2RldmljZWNyZWF0ZWluZm8ocERldi0+cGFyYW1zLnBDcmVhdGVJbmZvLCAiXHRcdCIpOworICAgICAgICAgICAgc3ByaW50ZihzdHIsICJcdCVzIG9iaiAlcDpcbiVzIiwgc3RyaW5nX1ZLX09CSkVDVF9UWVBFKFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVZJQ0VfRVhUKSwgKHZvaWQqKXBEZXZpY2VOb2RlLT5vYmoub2JqZWN0LCBjcmVhdGVJbmZvU3RyKTsKKyAgICAgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19VTktOT1dOLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIHBEZXZpY2VOb2RlLT5vYmoub2JqZWN0LCAwLCBWS1RSQUNFU05BUFNIT1RfU05BUFNIT1RfREFUQSwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICAgICAgICAgIHBEZXZpY2VOb2RlID0gcERldmljZU5vZGUtPnBOZXh0T2JqOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcHJpbnQgZGVsZXRlZCBvYmplY3RzCisgICAgaWYgKHNfZGVsdGEuZGVsdGFEZWxldGVkT2JqZWN0Q291bnQgPiAwKQorICAgIHsKKyAgICAgICAgVktUUkFDRV9WS19TTkFQU0hPVF9ERUxFVEVEX09CSl9OT0RFKiBwRGVsT2JqTm9kZSA9IHNfZGVsdGEucERlbHRhRGVsZXRlZE9iamVjdHM7CisgICAgICAgIHNwcmludGYoc3RyLCAiPT09PT09PT0gREVMVEEgU05BUFNIT1QgRGVsZXRlZCBPYmplY3RzOiIpOworICAgICAgICBsYXllckNiTXNnKFZLX0RCR19NU0dfVU5LTk9XTiwgVktfVkFMSURBVElPTl9MRVZFTF8wLCAoVmtPYmplY3QpTlVMTCwgMCwgVktUUkFDRVNOQVBTSE9UX1NOQVBTSE9UX0RBVEEsIExBWUVSX0FCQlJFVl9TVFIsIHN0cik7CisgICAgICAgIHdoaWxlIChwRGVsT2JqTm9kZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiAgICAgICAgICVzIG9iaiAlcCIsIHN0cmluZ19WS19PQkpFQ1RfVFlQRShwRGVsT2JqTm9kZS0+b2JqVHlwZSksICh2b2lkKilwRGVsT2JqTm9kZS0+b2JqZWN0KTsKKyAgICAgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19VTktOT1dOLCBWS19WQUxJREFUSU9OX0xFVkVMXzAsIHBEZWxPYmpOb2RlLT5vYmplY3QsIDAsIFZLVFJBQ0VTTkFQU0hPVF9TTkFQU0hPVF9EQVRBLCBMQVlFUl9BQkJSRVZfU1RSLCBzdHIpOworICAgICAgICAgICAgcERlbE9iak5vZGUgPSBwRGVsT2JqTm9kZS0+cE5leHRPYmo7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZVNuYXBzaG90U3RvcFRyYWNraW5nKHZvaWQpCit7CisgICAgYXNzZXJ0KCEiTm90IEltcGxlbWVudGVkIik7Cit9CisKK3ZvaWQgdmt0cmFjZVNuYXBzaG90Q2xlYXIodm9pZCkKK3sKKyAgICBhc3NlcnQoISJOb3QgSW1wbGVtZW50ZWQiKTsKK30KKworVktUUkFDRV9WS19TTkFQU0hPVCB2a3RyYWNlU25hcHNob3RNZXJnZShjb25zdCBWS1RSQUNFX1ZLX1NOQVBTSE9UKiBjb25zdCBwRGVsdGEsIGNvbnN0IFZLVFJBQ0VfVktfU05BUFNIT1QqIGNvbnN0IHBTbmFwc2hvdCkKK3sKKyAgICBhc3NlcnQoISJOb3QgSW1wbGVtZW50ZWQiKTsKK30KKworCisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT2xkIEV4cG9ydGVkIG1ldGhvZHMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3VpbnQ2NF90IHZrdHJhY2VTbmFwc2hvdEdldE9iamVjdENvdW50KFZrT2JqZWN0VHlwZSB0eXBlKQoreworICAgIHVpbnQ2NF90IHJldFZhbCA9IC8qKHR5cGUgPT0gVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0FOWSkgPyBzX2RlbHRhLmdsb2JhbE9iakNvdW50IDoqLyBzX2RlbHRhLm51bU9ianNbdHlwZV07CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworVmtSZXN1bHQgdmt0cmFjZVNuYXBzaG90R2V0T2JqZWN0cyhWa09iamVjdFR5cGUgdHlwZSwgdWludDY0X3Qgb2JqQ291bnQsIFZLVFJBQ0VfVktfU05BUFNIT1RfT0JKRUNUX05PREUgKnBPYmpOb2RlQXJyYXkpCit7CisgICAgLy8gVGhpcyBib29sIGZsYWdzIGlmIHdlJ3JlIHB1bGxpbmcgYWxsIG9ianMgb3IganVzdCBhIHNpbmdsZSBjbGFzcyBvZiBvYmpzCisgICAgYm9vbDMyX3QgYkFsbE9ianMgPSBmYWxzZTsgLyoodHlwZSA9PSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQU5ZKTsqLworICAgIC8vIENoZWNrIHRoZSBjb3VudCBmaXJzdCB0aGluZworICAgIHVpbnQ2NF90IG1heE9iakNvdW50ID0gKGJBbGxPYmpzKSA/IHNfZGVsdGEuZ2xvYmFsT2JqQ291bnQgOiBzX2RlbHRhLm51bU9ianNbdHlwZV07CisgICAgaWYgKG9iakNvdW50ID4gbWF4T2JqQ291bnQpIHsKKyAgICAgICAgY2hhciBzdHJbMTAyNF07CisgICAgICAgIHNwcmludGYoc3RyLCAiT0JKIEVSUk9SIDogUmVjZWl2ZWQgb2JqVHJhY2tHZXRPYmplY3RzKCkgcmVxdWVzdCBmb3IgJWx1IG9ianMsIGJ1dCB0aGVyZSBhcmUgb25seSAlbHUgb2JqcyBvZiB0eXBlICVzIiwgb2JqQ291bnQsIG1heE9iakNvdW50LCBzdHJpbmdfVktfT0JKRUNUX1RZUEUodHlwZSkpOworICAgICAgICBsYXllckNiTXNnKFZLX0RCR19NU0dfRVJST1IsIFZLX1ZBTElEQVRJT05fTEVWRUxfMCwgMCwgMCwgVktUUkFDRVNOQVBTSE9UX09CSkNPVU5UX01BWF9FWENFRURFRCwgTEFZRVJfQUJCUkVWX1NUUiwgc3RyKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOVkFMSURfVkFMVUU7CisgICAgfQorCisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwVHJhdiA9IChiQWxsT2JqcykgPyBzX2RlbHRhLnBHbG9iYWxPYmpzIDogc19kZWx0YS5wT2JqZWN0SGVhZFt0eXBlXTsKKworICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBvYmpDb3VudDsgaSsrKSB7CisgICAgICAgIGlmICghcFRyYXYpIHsKKyAgICAgICAgICAgIGNoYXIgc3RyWzEwMjRdOworICAgICAgICAgICAgc3ByaW50ZihzdHIsICJPQkogSU5URVJOQUwgRVJST1IgOiBSYW4gb3V0IG9mICVzIG9ianMhIFNob3VsZCBoYXZlICVsdSwgYnV0IG9ubHkgY29waWVkICVsdSBhbmQgbm90IHRoZSByZXF1ZXN0ZWQgJWx1LiIsIHN0cmluZ19WS19PQkpFQ1RfVFlQRSh0eXBlKSwgbWF4T2JqQ291bnQsIGksIG9iakNvdW50KTsKKyAgICAgICAgICAgIGxheWVyQ2JNc2coVktfREJHX01TR19FUlJPUiwgVktfVkFMSURBVElPTl9MRVZFTF8wLCAwLCAwLCBWS1RSQUNFU05BUFNIT1RfSU5URVJOQUxfRVJST1IsIExBWUVSX0FCQlJFVl9TVFIsIHN0cik7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoJnBPYmpOb2RlQXJyYXlbaV0sIHBUcmF2LCBzaXplb2YoVktUUkFDRV9WS19TTkFQU0hPVF9PQkpFQ1RfTk9ERSkpOworICAgICAgICBwVHJhdiA9IChiQWxsT2JqcykgPyBwVHJhdi0+cE5leHRHbG9iYWwgOiBwVHJhdi0+cE5leHRPYmo7CisgICAgfQorICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCit2b2lkIHZrdHJhY2VTbmFwc2hvdFByaW50T2JqZWN0cyh2b2lkKQoreworICAgIHZrdHJhY2VTbmFwc2hvdFByaW50RGVsdGEoKTsKK30KKworI2luY2x1ZGUgInZrX2dlbmVyaWNfaW50ZXJjZXB0X3Byb2NfaGVscGVyLmgiCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkKiBWS0FQSV9DQUxMIHZrR2V0UHJvY0FkZHIoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgY29uc3QgY2hhciogZnVuY05hbWUpCit7CisgICAgVmtCYXNlTGF5ZXJPYmplY3QqIGdwdXcgPSAoVmtCYXNlTGF5ZXJPYmplY3QgKikgcGh5c2ljYWxEZXZpY2U7CisgICAgaWYgKCh2b2lkKilwaHlzaWNhbERldmljZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwQ3VyT2JqID0gZ3B1dzsKKyAgICBsb2FkZXJfcGxhdGZvcm1fdGhyZWFkX29uY2UoJnRhYk9uY2UsIGluaXRWa3RyYWNlU25hcHNob3QpOworCisgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkLCBuZWVkIG9ubHkgdGhlIGVudHJ5IHBvaW50cyB0aGlzIGxheWVyIGludGVyY2VwdHMKKyAgICAvL2FkZHIgPSBsYXllcl9pbnRlcmNlcHRfcHJvYyhmdW5jTmFtZSk7CisgICAgLy9pZiAoYWRkcikKKyAgICAvLyAgICByZXR1cm4gYWRkcjsKKyAgICAvL2Vsc2UKKyAgICBpZiAoIXN0cm5jbXAoInZrdHJhY2VTbmFwc2hvdEdldE9iamVjdENvdW50IiwgZnVuY05hbWUsIHNpemVvZigidmt0cmFjZVNuYXBzaG90R2V0T2JqZWN0Q291bnQiKSkpCisgICAgICAgIHJldHVybiB2a3RyYWNlU25hcHNob3RHZXRPYmplY3RDb3VudDsKKyAgICBlbHNlIGlmICghc3RybmNtcCgidmt0cmFjZVNuYXBzaG90R2V0T2JqZWN0cyIsIGZ1bmNOYW1lLCBzaXplb2YoInZrdHJhY2VTbmFwc2hvdEdldE9iamVjdHMiKSkpCisgICAgICAgIHJldHVybiB2a3RyYWNlU25hcHNob3RHZXRPYmplY3RzOworICAgIGVsc2UgaWYgKCFzdHJuY21wKCJ2a3RyYWNlU25hcHNob3RQcmludE9iamVjdHMiLCBmdW5jTmFtZSwgc2l6ZW9mKCJ2a3RyYWNlU25hcHNob3RQcmludE9iamVjdHMiKSkpCisgICAgICAgIHJldHVybiB2a3RyYWNlU25hcHNob3RQcmludE9iamVjdHM7CisgICAgZWxzZSBpZiAoIXN0cm5jbXAoInZrdHJhY2VTbmFwc2hvdFN0YXJ0VHJhY2tpbmciLCBmdW5jTmFtZSwgc2l6ZW9mKCJ2a3RyYWNlU25hcHNob3RTdGFydFRyYWNraW5nIikpKQorICAgICAgICByZXR1cm4gdmt0cmFjZVNuYXBzaG90U3RhcnRUcmFja2luZzsKKyAgICBlbHNlIGlmICghc3RybmNtcCgidmt0cmFjZVNuYXBzaG90R2V0RGVsdGEiLCBmdW5jTmFtZSwgc2l6ZW9mKCJ2a3RyYWNlU25hcHNob3RHZXREZWx0YSIpKSkKKyAgICAgICAgcmV0dXJuIHZrdHJhY2VTbmFwc2hvdEdldERlbHRhOworICAgIGVsc2UgaWYgKCFzdHJuY21wKCJ2a3RyYWNlU25hcHNob3RHZXRTbmFwc2hvdCIsIGZ1bmNOYW1lLCBzaXplb2YoInZrdHJhY2VTbmFwc2hvdEdldFNuYXBzaG90IikpKQorICAgICAgICByZXR1cm4gdmt0cmFjZVNuYXBzaG90R2V0U25hcHNob3Q7CisgICAgZWxzZSBpZiAoIXN0cm5jbXAoInZrdHJhY2VTbmFwc2hvdFByaW50RGVsdGEiLCBmdW5jTmFtZSwgc2l6ZW9mKCJ2a3RyYWNlU25hcHNob3RQcmludERlbHRhIikpKQorICAgICAgICByZXR1cm4gdmt0cmFjZVNuYXBzaG90UHJpbnREZWx0YTsKKyAgICBlbHNlIGlmICghc3RybmNtcCgidmt0cmFjZVNuYXBzaG90U3RvcFRyYWNraW5nIiwgZnVuY05hbWUsIHNpemVvZigidmt0cmFjZVNuYXBzaG90U3RvcFRyYWNraW5nIikpKQorICAgICAgICByZXR1cm4gdmt0cmFjZVNuYXBzaG90U3RvcFRyYWNraW5nOworICAgIGVsc2UgaWYgKCFzdHJuY21wKCJ2a3RyYWNlU25hcHNob3RDbGVhciIsIGZ1bmNOYW1lLCBzaXplb2YoInZrdHJhY2VTbmFwc2hvdENsZWFyIikpKQorICAgICAgICByZXR1cm4gdmt0cmFjZVNuYXBzaG90Q2xlYXI7CisgICAgZWxzZSBpZiAoIXN0cm5jbXAoInZrdHJhY2VTbmFwc2hvdE1lcmdlIiwgZnVuY05hbWUsIHNpemVvZigidmt0cmFjZVNuYXBzaG90TWVyZ2UiKSkpCisgICAgICAgIHJldHVybiB2a3RyYWNlU25hcHNob3RNZXJnZTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGdwdXctPnBHUEEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gZ3B1dy0+cEdQQSgoVmtQaHlzaWNhbERldmljZSlncHV3LT5uZXh0T2JqZWN0LCBmdW5jTmFtZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi9sYXllcnMvdmt0cmFjZV9zbmFwc2hvdC5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vbGF5ZXJzL3ZrdHJhY2Vfc25hcHNob3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjEwMWUzCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vbGF5ZXJzL3ZrdHJhY2Vfc25hcHNob3QuaApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICovCisKKyNpbmNsdWRlICJ2a0xheWVyLmgiCisjaW5jbHVkZSAidnVsa2FuL3Z1bGthbi5oIgorLy8gVmtUcmFjZSBTbmFwc2hvdCBFUlJPUiBjb2RlcwordHlwZWRlZiBlbnVtIF9WS1RSQUNFX1NOQVBTSE9UX0VSUk9SCit7CisgICAgVktUUkFDRVNOQVBTSE9UX05PTkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCBmb3IgSU5GTyAmIG90aGVyIG5vbi1lcnJvciBtZXNzYWdlcworICAgIFZLVFJBQ0VTTkFQU0hPVF9VTktOT1dOX09CSkVDVCwgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0aW5nIHVzZXMgb2Ygb2JqZWN0IHRoYXQncyBub3QgaW4gZ2xvYmFsIG9iamVjdCBsaXN0CisgICAgVktUUkFDRVNOQVBTSE9UX0lOVEVSTkFMX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgLy8gQnVnIHdpdGggZGF0YSB0cmFja2luZyB3aXRoaW4gdGhlIGxheWVyCisgICAgVktUUkFDRVNOQVBTSE9UX0RFU1RST1lfT0JKRUNUX0ZBSUxFRCwgICAgICAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBvYmplY3QgdG8gYmUgZGVzdHJveWVkCisgICAgVktUUkFDRVNOQVBTSE9UX01JU1NJTkdfT0JKRUNULCAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdGVkIGxvb2stdXAgb24gb2JqZWN0IHRoYXQgaXNuJ3QgaW4gZ2xvYmFsIG9iamVjdCBsaXN0CisgICAgVktUUkFDRVNOQVBTSE9UX09CSkVDVF9MRUFLLCAgICAgICAgICAgICAgICAgICAgICAgLy8gT0JKRUNUIHdhcyBub3QgY29ycmVjdGx5IGZyZWVkL2Rlc3Ryb3llZAorICAgIFZLVFJBQ0VTTkFQU0hPVF9PQkpDT1VOVF9NQVhfRVhDRUVERUQsICAgICAgICAgICAgIC8vIFJlcXVlc3QgZm9yIE9iamVjdCBkYXRhIGluIGV4Y2VzcyBvZiBtYXggb2JqIGNvdW50CisgICAgVktUUkFDRVNOQVBTSE9UX0lOVkFMSURfRkVOQ0UsICAgICAgICAgICAgICAgICAgICAgLy8gUmVxdWVzdGVkIHN0YXR1cyBvZiB1bnN1Ym1pdHRlZCBmZW5jZSBvYmplY3QKKyAgICBWS1RSQUNFU05BUFNIT1RfVklFV1BPUlRfTk9UX0JPVU5ELCAgICAgICAgICAgICAgICAvLyBEcmF3IHN1Ym1pdHRlZCB3aXRoIG5vIHZpZXdwb3J0IHN0YXRlIG9iamVjdCBib3VuZAorICAgIFZLVFJBQ0VTTkFQU0hPVF9SQVNURVJfTk9UX0JPVU5ELCAgICAgICAgICAgICAgICAgIC8vIERyYXcgc3VibWl0dGVkIHdpdGggbm8gcmFzdGVyIHN0YXRlIG9iamVjdCBib3VuZAorICAgIFZLVFJBQ0VTTkFQU0hPVF9DT0xPUl9CTEVORF9OT1RfQk9VTkQsICAgICAgICAgICAgIC8vIERyYXcgc3VibWl0dGVkIHdpdGggbm8gY29sb3IgYmxlbmQgc3RhdGUgb2JqZWN0IGJvdW5kCisgICAgVktUUkFDRVNOQVBTSE9UX0RFUFRIX1NURU5DSUxfTk9UX0JPVU5ELCAgICAgICAgICAgLy8gRHJhdyBzdWJtaXR0ZWQgd2l0aCBubyBkZXB0aC1zdGVuY2lsIHN0YXRlIG9iamVjdCBib3VuZAorICAgIFZLVFJBQ0VTTkFQU0hPVF9HUFVfTUVNX01BUFBFRCwgICAgICAgICAgICAgICAgICAgIC8vIE1lbSBvYmplY3QgcmVmJ2QgaW4gY21kIGJ1ZmYgaXMgc3RpbGwgbWFwcGVkCisgICAgVktUUkFDRVNOQVBTSE9UX0dFVEdQVUlORk9fTk9UX0NBTExFRCwgICAgICAgICAgICAgLy8gR3B1IEluZm9ybWF0aW9uIGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQgYmVmb3JlIGRyYXdpbmcKKyAgICBWS1RSQUNFU05BUFNIT1RfTUVNUkVGQ09VTlRfTUFYX0VYQ0VFREVELCAgICAgICAgICAvLyBOdW1iZXIgb2YgUXVldWVTdWJtaXQgbWVtb3J5IHJlZmVyZW5jZXMgZXhjZWVkcyBHUFUgbWF4aW11bQorICAgIFZLVFJBQ0VTTkFQU0hPVF9TTkFQU0hPVF9EQVRBLCAgICAgICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgYmVpbmcgcHJpbnRlZCBpcyBhY3R1YWxseSBzbmFwc2hvdCBkYXRhCit9IFZLVFJBQ0VfU05BUFNIT1RfRVJST1I7CisKKy8vIE9iamVjdCBTdGF0dXMgLS0gdXNlZCB0byB0cmFjayBzdGF0ZSBvZiBpbmRpdmlkdWFsIG9iamVjdHMKK3R5cGVkZWYgZW51bSBfT0JKRUNUX1NUQVRVUworeworICAgIE9CSlNUQVRVU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLCAvLyBObyBzdGF0dXMgaXMgc2V0CisgICAgT0JKU1RBVFVTX0ZFTkNFX0lTX1NVQk1JVFRFRCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsIC8vIEZlbmNlIGhhcyBiZWVuIHN1Ym1pdHRlZAorICAgIE9CSlNUQVRVU19WSUVXUE9SVF9CT1VORCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLCAvLyBWaWV3cG9ydCBzdGF0ZSBvYmplY3QgaGFzIGJlZW4gYm91bmQKKyAgICBPQkpTVEFUVVNfUkFTVEVSX0JPVU5EICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwgLy8gVmlld3BvcnQgc3RhdGUgb2JqZWN0IGhhcyBiZWVuIGJvdW5kCisgICAgT0JKU1RBVFVTX0NPTE9SX0JMRU5EX0JPVU5EICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDgsIC8vIFZpZXdwb3J0IHN0YXRlIG9iamVjdCBoYXMgYmVlbiBib3VuZAorICAgIE9CSlNUQVRVU19ERVBUSF9TVEVOQ0lMX0JPVU5EICAgICAgICAgICAgICAgPSAweDAwMDAwMDEwLCAvLyBWaWV3cG9ydCBzdGF0ZSBvYmplY3QgaGFzIGJlZW4gYm91bmQKKyAgICBPQkpTVEFUVVNfR1BVX01FTV9NQVBQRUQgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAyMCwgLy8gTWVtb3J5IG9iamVjdCBpcyBjdXJyZW50bHkgbWFwcGVkCit9IE9CSkVDVF9TVEFUVVM7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBzdHJpbmdfVktfT0JKRUNUX1RZUEUoVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgdHlwZSkgeworICAgIHN3aXRjaCAoKHVuc2lnbmVkIGludCl0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU5TVEFOQ0VfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJJTlNUQU5DRSI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BIWVNJQ0FMX0RFVklDRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlBIWVNJQ0FMX0RFVklDRSI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RFVklDRV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkRFVklDRSI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1FVRVVFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiUVVFVUUiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX0JVRkZFUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkNPTU1BTkRfQlVGRkVSIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVWSUNFX01FTU9SWV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkRFVklDRV9NRU1PUlkiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJCVUZGRVIiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9CVUZGRVJfVklFV19FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkJVRkZFUl9WSUVXIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfSU1BR0VfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJJTUFHRSI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX1ZJRVdfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJJTUFHRV9WSUVXIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQVRUQUNITUVOVF9WSUVXX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiQVRUQUNITUVOVF9WSUVXIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0hBREVSOgorICAgICAgICAgICAgcmV0dXJuICJTSEFERVIiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9QSVBFTElORV9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlBJUEVMSU5FIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUElQRUxJTkVfTEFZT1VUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiUElQRUxJTkVfTEFZT1VUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfU0FNUExFUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlNBTVBMRVIiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9ERVNDUklQVE9SX1NFVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkRFU0NSSVBUT1JfU0VUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiREVTQ1JJUFRPUl9TRVRfTEFZT1VUIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfREVTQ1JJUFRPUl9QT09MX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiREVTQ1JJUFRPUl9QT09MIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfRFlOQU1JQ19WSUVXUE9SVF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiRFlOQU1JQ19WSUVXUE9SVF9TVEFURSI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RZTkFNSUNfUkFTVEVSX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJEWU5BTUlDX1JBU1RFUl9TVEFURSI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0RZTkFNSUNfQ09MT1JfQkxFTkRfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gIkRZTkFNSUNfQ09MT1JfQkxFTkRfU1RBVEUiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9EWU5BTUlDX0RFUFRIX1NURU5DSUxfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gIkRZTkFNSUNfREVQVEhfU1RFTkNJTF9TVEFURSI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0ZFTkNFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiRkVOQ0UiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TRU1BUEhPUkVfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJTRU1BUEhPUkUiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9FVkVOVF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkVWRU5UIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUVVFUllfUE9PTF9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIlFVRVJZX1BPT0wiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9GUkFNRUJVRkZFUl9FWFQ6CisgICAgICAgICAgICByZXR1cm4gIkZSQU1FQlVGRkVSIjsKKyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfUkVOREVSX1BBU1NfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJSRU5ERVJfUEFTUyI7CisgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1BJUEVMSU5FX0NBQ0hFX0VYVDoKKyAgICAgICAgICAgIHJldHVybiAiUElQRUxJTkVfQ0FDSEUiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9TV0FQX0NIQUlOX1dTSToKKyAgICAgICAgICAgIHJldHVybiAiU1dBUF9DSEFJTl9XU0kiOworICAgICAgICBjYXNlIFZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT01NQU5EX1BPT0xfRVhUOgorICAgICAgICAgICAgcmV0dXJuICJDT01NQU5EX1BPT0wiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhlbHBlciBzdHJ1Y3R1cmUgZm9yIGEgVktUUkFDRSB2dWxrYW4gc25hcHNob3QuCisvLyBUaGVzZSBjYW4gcHJvYmFibHkgYmUgYXV0by1nZW5lcmF0ZWQgYXQgc29tZSBwb2ludC4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCB2a3RyYWNlX3ZrX21hbGxvY19hbmRfY29weSh2b2lkKiogcHBEZXN0LCBzaXplX3Qgc2l6ZSwgY29uc3Qgdm9pZCogcFNyYyk7CisKK3R5cGVkZWYgc3RydWN0IF9WS1RSQUNFX1ZLX1NOQVBTSE9UX0NSRUFURURFVklDRV9QQVJBTVMKK3sKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlOworICAgIFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm87CisgICAgVmtEZXZpY2UqIHBEZXZpY2U7Cit9IFZLVFJBQ0VfVktfU05BUFNIT1RfQ1JFQVRFREVWSUNFX1BBUkFNUzsKKworVmtEZXZpY2VDcmVhdGVJbmZvKiB2a3RyYWNlX2RlZXBjb3B5X3hnbF9kZXZpY2VfY3JlYXRlX2luZm8oY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvKiBwU3JjQ3JlYXRlSW5mbyk7dm9pZCB2a3RyYWNlX2RlZXBmcmVlX3hnbF9kZXZpY2VfY3JlYXRlX2luZm8oVmtEZXZpY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbyk7Cit2b2lkIHZrdHJhY2Vfdmtfc25hcHNob3RfY29weV9jcmVhdGVkZXZpY2VfcGFyYW1zKFZLVFJBQ0VfVktfU05BUFNIT1RfQ1JFQVRFREVWSUNFX1BBUkFNUyogcERlc3QsIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sIFZrRGV2aWNlKiBwRGV2aWNlKTsKK3ZvaWQgdmt0cmFjZV92a19zbmFwc2hvdF9kZXN0cm95X2NyZWF0ZWRldmljZV9wYXJhbXMoVktUUkFDRV9WS19TTkFQU0hPVF9DUkVBVEVERVZJQ0VfUEFSQU1TKiBwU3JjKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVmtUcmFjZSBTbmFwc2hvdCBoZWxwZXIgc3RydWN0cworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBOb2RlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdAordHlwZWRlZiBzdHJ1Y3QgX1ZLVFJBQ0VfVktfU05BUFNIT1RfT0JKRUNUX05PREUgeworICAgIFZrT2JqZWN0ICAgICAgICBvYmplY3Q7CisgICAgVmtPYmplY3RUeXBlICAgIG9ialR5cGU7CisgICAgdWludDY0X3QgICAgICAgIG51bVVzZXM7CisgICAgT0JKRUNUX1NUQVRVUyAgIHN0YXR1czsKKyAgICB2b2lkKiAgICAgICAgICAgcFN0cnVjdDsgICAgLy88IG9wdGlvbmFsbHkgcG9pbnRzIHRvIGEgZGV2aWNlLXNwZWNpZmljIHN0cnVjdCAoaWUsIFZLVFJBQ0VfVktfU05BUFNIT1RfREVWSUNFX05PREUpCit9IFZLVFJBQ0VfVktfU05BUFNIT1RfT0JKRUNUX05PREU7CisKKy8vIE5vZGUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4gVmtEZXZpY2UKK3R5cGVkZWYgc3RydWN0IF9WS1RSQUNFX1ZLX1NOQVBTSE9UX0RFVklDRV9OT0RFIHsKKyAgICAvLyBUaGlzIG9iamVjdAorICAgIFZrRGV2aWNlIGRldmljZTsKKworICAgIC8vIENyZWF0ZURldmljZSBwYXJhbWV0ZXJzCisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9DUkVBVEVERVZJQ0VfUEFSQU1TIHBhcmFtczsKKworICAgIC8vIE90aGVyIGluZm9ybWF0aW9uIGEgZGV2aWNlIG5lZWRzIHRvIHN0b3JlLgorICAgIC8vIFRPRE86IGFueXRoaW5nPworfSBWS1RSQUNFX1ZLX1NOQVBTSE9UX0RFVklDRV9OT0RFOworCisvLyBMaW5rZWQtTGlzdCBub2RlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdAorLy8gV2UgbWFpbnRhaW4gYSAiR2xvYmFsIiBsaXN0IHdoaWNoIGxpbmtzIGV2ZXJ5IG9iamVjdCBhbmQgYQorLy8gIHBlci1PYmplY3QgbGlzdCB3aGljaCBqdXN0IGxpbmtzIG9iamVjdHMgb2YgYSBnaXZlbiB0eXBlCisvLyBUaGUgb2JqZWN0IG5vZGUgaGFzIGJvdGggcG9pbnRlcnMgc28gdGhlIGFjdHVhbCBub2RlcyBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIHR3byBsaXN0cwordHlwZWRlZiBzdHJ1Y3QgX1ZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSB7CisgICAgc3RydWN0IF9WS1RSQUNFX1ZLX1NOQVBTSE9UX0xMX05PREUgKnBOZXh0T2JqOworICAgIHN0cnVjdCBfVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFICpwTmV4dEdsb2JhbDsKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX09CSkVDVF9OT0RFIG9iajsKK30gVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFOworCisvLyBMaW5rZWQtTGlzdCBub2RlIHRvIGlkZW50aWZ5IGFuIG9iamVjdCB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQsCisvLyBidXQgdGhlIGRlbHRhIHNuYXBzaG90IG5ldmVyIHNhdyBpdCBnZXQgY3JlYXRlZC4KK3R5cGVkZWYgc3RydWN0IF9WS1RSQUNFX1ZLX1NOQVBTSE9UX0RFTEVURURfT0JKX05PREUgeworICAgIHN0cnVjdCBfVktUUkFDRV9WS19TTkFQU0hPVF9ERUxFVEVEX09CSl9OT0RFKiBwTmV4dE9iajsKKyAgICBWa09iamVjdCBvYmplY3Q7CisgICAgVmtPYmplY3RUeXBlIG9ialR5cGU7Cit9IFZLVFJBQ0VfVktfU05BUFNIT1RfREVMRVRFRF9PQkpfTk9ERTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWFpbiBzdHJ1Y3R1cmUgZm9yIGEgVktUUkFDRSB2dWxrYW4gc25hcHNob3QuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIHN0cnVjdCBfVktUUkFDRV9WS19TTkFQU0hPVCB7CisgICAgLy8gU3RvcmVzIGEgbGlzdCBvZiBhbGwgdGhlIG9iamVjdHMga25vd24gYnkgdGhpcyBzbmFwc2hvdC4KKyAgICAvLyBUaGlzIG1heSBiZSB1c2VkIGFzIGEgc2hvcnRjdXQgdG8gbW9yZSBlYXNpbHkgZmluZCBvYmplY3RzLgorICAgIHVpbnQ2NF90IGdsb2JhbE9iakNvdW50OworICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSogcEdsb2JhbE9ianM7CisKKyAgICAvLyBURU1QT1JBUlk6IEtlZXAgdHJhY2sgb2YgYWxsIG9iamVjdHMgb2YgZWFjaCB0eXBlCisgICAgdWludDY0X3QgbnVtT2Jqc1tWS19OVU1fT0JKRUNUX1RZUEVdOworICAgIFZLVFJBQ0VfVktfU05BUFNIT1RfTExfTk9ERSAqcE9iamVjdEhlYWRbVktfTlVNX09CSkVDVF9UWVBFXTsKKworICAgIC8vIExpc3Qgb2YgY3JlYXRlZCBkZXZpY2VzIGFuZCBbcG90ZW50aWFsbHldIGhpZXJhcmNoaWNhbCB0cmVlIG9mIHRoZSBvYmplY3RzIG9uIGl0LgorICAgIC8vIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgb3duZXJzaGlwIG9mIHRoZSBvYmplY3RzCisgICAgdWludDY0X3QgZGV2aWNlQ291bnQ7CisgICAgVktUUkFDRV9WS19TTkFQU0hPVF9MTF9OT0RFKiBwRGV2aWNlczsKKworICAgIC8vIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHNuYXBzaG90IGRlbHRhcy4KKyAgICB1aW50NjRfdCBkZWx0YURlbGV0ZWRPYmplY3RDb3VudDsKKyAgICBWS1RSQUNFX1ZLX1NOQVBTSE9UX0RFTEVURURfT0JKX05PREUqIHBEZWx0YURlbGV0ZWRPYmplY3RzOworfSBWS1RSQUNFX1ZLX1NOQVBTSE9UOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBwcm90b3R5cGUgZm9yIGV4dGVuc2lvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBzbmFwc2hvdCBmdW5jdGlvbmFsaXR5IHNob3VsZCB3b3JrIHNpbWlsYXIgdG8gYSBzdG9wd2F0Y2guCisvLyAxKSAnU3RhcnRUcmFja2luZygpJyBpcyBsaWtlIHN0YXJ0aW5nIHRoZSBzdG9wd2F0Y2guIFRoaXMgY2F1c2VzIHRoZSBzbmFwc2hvdAorLy8gICAgdG8gc3RhcnQgdHJhY2tpbmcgdGhlIGNyZWF0aW9uIG9mIG9iamVjdHMgYW5kIHN0YXRlLiBJbiBnZW5lcmFsLCB0aGlzCisvLyAgICBzaG91bGQgaGFwcGVuIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZywgdG8gdHJhY2sgYWxsIG9iamVjdHMuIER1cmluZyB0aGlzCisvLyAgICB0cmFja2luZyB0aW1lLCBhbGwgY3JlYXRpb25zIGFuZCBkZWxldGlvbnMgYXJlIHRyYWNrZWQgb24gdGhlCisvLyAgICAnZGVsdGFTbmFwc2hvdCcuCisvLyAgICBOT1RFOiBUaGlzIGVudHJ5cG9pbnQgY3VycmVudGx5IGRvZXMgbm90aGluZywgYXMgdHJhY2tpbmcgaXMgaW1wbGllZAorLy8gICAgICAgICAgYnkgZW5hYmxpbmcgdGhlIGxheWVyLgorLy8gMikgJ0dldERlbHRhKCknIGlzIGFuYWxvZ291cyB0byBsb29raW5nIGF0IHRoZSBzdG9wd2F0Y2ggYW5kIHNlZWluZyB0aGUKKy8vICAgIGN1cnJlbnQgbGFwIHRpbWUgLSBBIGNvcHkgb2YgdGhlICdkZWx0YVNuYXBzaG90JyB3aWxsIGJlIHJldHVybmVkIHRvIHRoZQorLy8gICAgY2FsbGVyLCBidXQgbm90aGluZ3MgY2hhbmdlcyB3aXRoaW4gdGhlIHNuYXBzaG90IGxheWVyLiBBbGwgY3JlYXRpb25zCisvLyAgICBhbmQgZGVsZXRpb25zIGNvbnRpbnVlIHRvIGJlIGFwcGxpZWQgdG8gdGhlICdkZWx0YVNuYXBzaG90Jy4KKy8vICAgIE5PVEU6IFRoaXMgd2lsbCBpbnZvbHZlIGEgZGVlcCBjb3B5IG9mIHRoZSBkZWx0YSwgc28gdGhlcmUgbWF5IGJlIGEKKy8vICAgICAgICAgIHBlcmZvcm1hbmNlIGhpdC4KKy8vIDMpICdHZXRTbmFwc2hvdCgpJyBpcyBzaW1pbGFyIHRvIGhpdHRpbmcgdGhlICdMYXAnIGJ1dHRvbiBvbiBhIHN0b3B3YXRjaC4KKy8vICAgIFRoZSAnZGVsdGFTbmFwc2hvdCcgaXMgbWVyZ2VkIGludG8gdGhlICdtYXN0ZXJTbmFwc2hvdCcsIHRoZSAnZGVsdGFTbmFwc2hvdCcKKy8vICAgIGlzIGNsZWFyZWQsIGFuZCB0aGUgJ21hc3RlclNuYXBzaG90JyBpcyByZXR1cm5lZC4gQWxsIGNyZWF0aW9ucyBhbmQKKy8vICAgIGRlbGV0aW9ucyBjb250aW51ZSB0byBiZSBhcHBsaWVkIHRvIHRoZSAnZGVsdGFTbmFwc2hvdCcuCisvLyAgICBOT1RFOiBUaGlzIHdpbGwgaW52b2x2ZSBhIGRlZXAgY29weSBvZiB0aGUgc25hcHNob3QsIHNvIHRoZXJlIG1heSBiZSBhCisvLyAgICAgICAgICBwZXJmb3JtYW5jZSBoaXQuCisvLyA0KSAnUHJpbnREZWx0YSgpJyB3aWxsIGNhdXNlIHRoZSBkZWx0YSB0byBiZSBvdXRwdXQgYnkgdGhlIGxheWVyJ3MgbXNnQ2FsbGJhY2suCisvLyA1KSBTdGVwcyAyLCAzLCBhbmQgNCBjYW4gaGFwcGVuIGFzIG9mdGVuIGFzIG5lZWRlZC4KKy8vIDYpICdTdG9wVHJhY2tpbmcoKScgaXMgbGlrZSBzdG9wcGluZyB0aGUgc3RvcHdhdGNoLgorLy8gICAgTk9URTogVGhpcyBlbnRyeXBvaW50IGN1cnJlbnRseSBkb2VzIG5vdGhpbmcsIGFzIHRyYWNraW5nIGlzIGltcGxpZWQKKy8vICAgICAgICAgIGJ5IGRpc2FibGluZyB0aGUgbGF5ZXIuCisvLyA3KSAnQ2xlYXIoKScgd2lsbCBjbGVhciB0aGUgJ2RlbHRhU25hcHNob3QnIGFuZCB0aGUgJ21hc3RlclNuYXBzaG90Jy4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCB2a3RyYWNlU25hcHNob3RTdGFydFRyYWNraW5nKHZvaWQpOworVktUUkFDRV9WS19TTkFQU0hPVCB2a3RyYWNlU25hcHNob3RHZXREZWx0YSh2b2lkKTsKK1ZLVFJBQ0VfVktfU05BUFNIT1Qgdmt0cmFjZVNuYXBzaG90R2V0U25hcHNob3Qodm9pZCk7Cit2b2lkIHZrdHJhY2VTbmFwc2hvdFByaW50RGVsdGEodm9pZCk7Cit2b2lkIHZrdHJhY2VTbmFwc2hvdFN0b3BUcmFja2luZyh2b2lkKTsKK3ZvaWQgdmt0cmFjZVNuYXBzaG90Q2xlYXIodm9pZCk7CisKKy8vIHV0aWxpdHkKKy8vIG1lcmdlIGEgZGVsdGEgaW50byBhIHNuYXBzaG90IGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgc25hcHNob3QKK1ZLVFJBQ0VfVktfU05BUFNIT1Qgdmt0cmFjZVNuYXBzaG90TWVyZ2UoY29uc3QgVktUUkFDRV9WS19TTkFQU0hPVCAqIGNvbnN0IHBEZWx0YSwgY29uc3QgVktUUkFDRV9WS19TTkFQU0hPVCAqIGNvbnN0IHBTbmFwc2hvdCk7CisKK3VpbnQ2NF90IHZrdHJhY2VTbmFwc2hvdEdldE9iamVjdENvdW50KFZrT2JqZWN0VHlwZSB0eXBlKTsKK1ZrUmVzdWx0IHZrdHJhY2VTbmFwc2hvdEdldE9iamVjdHMoVmtPYmplY3RUeXBlIHR5cGUsIHVpbnQ2NF90IG9iakNvdW50LCBWS1RSQUNFX1ZLX1NOQVBTSE9UX09CSkVDVF9OT0RFKiBwT2JqTm9kZUFycmF5KTsKK3ZvaWQgdmt0cmFjZVNuYXBzaG90UHJpbnRPYmplY3RzKHZvaWQpOworCisvLyBGdW5jIHB0ciB0eXBlZGVmcwordHlwZWRlZiB1aW50NjRfdCAoKlZLVFJBQ0VTTkFQU0hPVF9HRVRfT0JKRUNUX0NPVU5UKShWa09iamVjdFR5cGUpOwordHlwZWRlZiBWa1Jlc3VsdCAoKlZLVFJBQ0VTTkFQU0hPVF9HRVRfT0JKRUNUUykoVmtPYmplY3RUeXBlLCB1aW50NjRfdCwgVktUUkFDRV9WS19TTkFQU0hPVF9PQkpFQ1RfTk9ERSopOwordHlwZWRlZiB2b2lkICgqVktUUkFDRVNOQVBTSE9UX1BSSU5UX09CSkVDVFMpKHZvaWQpOwordHlwZWRlZiB2b2lkICgqVktUUkFDRVNOQVBTSE9UX1NUQVJUX1RSQUNLSU5HKSh2b2lkKTsKK3R5cGVkZWYgVktUUkFDRV9WS19TTkFQU0hPVCAoKlZLVFJBQ0VTTkFQU0hPVF9HRVRfREVMVEEpKHZvaWQpOwordHlwZWRlZiBWS1RSQUNFX1ZLX1NOQVBTSE9UICgqVktUUkFDRVNOQVBTSE9UX0dFVF9TTkFQU0hPVCkodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCpWS1RSQUNFU05BUFNIT1RfUFJJTlRfREVMVEEpKHZvaWQpOwordHlwZWRlZiB2b2lkICgqVktUUkFDRVNOQVBTSE9UX1NUT1BfVFJBQ0tJTkcpKHZvaWQpOwordHlwZWRlZiB2b2lkICgqVktUUkFDRVNOQVBTSE9UX0NMRUFSKSh2b2lkKTsKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L0NNYWtlTGlzdHMudHh0IGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhYTUzZQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNzMgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpCisKK3Byb2plY3QodnVsa2FuX3JlcGxheSkKKworaW5jbHVkZSgiJHtTUkNfRElSfS9idWlsZF9vcHRpb25zLmNtYWtlIikKKworZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29kZWdlbikKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7VktUUkFDRV9WVUxLQU5fRElSfS92a3RyYWNlX2dlbmVyYXRlLnB5IEFsbFBsYXRmb3JtcyB2a3RyYWNlLXJlcGxheS12ay1mdW5jcyAgICAgVktfVkVSU0lPTl8xXzAgT1VUUFVUX0ZJTEUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvZGVnZW4vdmtyZXBsYXlfdmtfZnVuY19wdHJzLmgpCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1ZLVFJBQ0VfVlVMS0FOX0RJUn0vdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS1yZXBsYXktYyAgICAgICAgICAgIFZLX1ZFUlNJT05fMV8wIE9VVFBVVF9GSUxFICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb2RlZ2VuL3ZrcmVwbGF5X3ZrX3JlcGxheV9nZW4uY3BwKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtWS1RSQUNFX1ZVTEtBTl9ESVJ9L3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtcmVwbGF5LW9iai1tYXBwZXItaCBWS19WRVJTSU9OXzFfMCBPVVRQVVRfRklMRSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29kZWdlbi92a3JlcGxheV92a19vYmptYXBwZXIuaCkKKworaWYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkxpbnV4IikKK3NldCAoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysxMSIpCitzZXQoT1NfUkVQTEFZRVJfTElCUworICAgIHhjYgorKQorZW5kaWYoKQorCitpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiV2luZG93cyIgT1IKKyAgICAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iKQorc2V0KE9TX1JFUExBWUVSX0xJQlMgICkKK2VuZGlmKCkKKworc2V0IChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSIpCisKK3NldChTUkNfTElTVAorICAgICR7U1JDX0xJU1R9CisgICAgdmtyZXBsYXkuY3BwCisgICAgdmtyZXBsYXlfc2V0dGluZ3MuY3BwCisgICAgdmtyZXBsYXlfdmtyZXBsYXkuY3BwCisgICAgdmtyZXBsYXlfdmtkaXNwbGF5LmNwcAorICAgIGNvZGVnZW4vdmtyZXBsYXlfdmtfcmVwbGF5X2dlbi5jcHAKKykKKworc2V0IChIRFJfTElTVAorICAgIHZrcmVwbGF5LmgKKyAgICB2a3JlcGxheV9zZXR0aW5ncy5oCisgICAgdmtyZXBsYXlfdmtkaXNwbGF5LmgKKyAgICB2a3JlcGxheV92a3JlcGxheS5oCisgICAgY29kZWdlbi92a3JlcGxheV92a19mdW5jX3B0cnMuaAorICAgIGNvZGVnZW4vdmtyZXBsYXlfdmtfb2JqbWFwcGVyLmgKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vdnVsa2FuL2NvZGVnZW5fdXRpbHMvdmtfZW51bV9zdHJpbmdfaGVscGVyLmgKKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9L3ZrdHJhY2VfdmtfcGFja2V0X2lkLmgKKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9L3ZrdHJhY2VfdmtfdmtfcGFja2V0cy5oCisKKykKKworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgICBjb2RlZ2VuCisgICAgJHtTUkNfRElSfS92a3RyYWNlX3JlcGxheQorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9jb21tb24KKyAgICAke1NSQ19ESVJ9L3RoaXJkcGFydHkKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9CisgICAgJHtWS1RSQUNFX1ZVTEtBTl9JTkNMVURFX0RJUn0KKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vdnVsa2FuL2NvZGVnZW5fdXRpbHMKKykKKyMgbmVlZGVkIGZvciB2a3RyYWNldmlld2VyX3ZrIGxpYnJhcnkgd2hpY2ggaXMgc2hhcmVkCitpZiAoTk9UIE1TVkMpCisgICAgYWRkX2NvbXBpbGVyX2ZsYWcoIi1mUElDIikKK2VuZGlmKCkKKworYWRkX2xpYnJhcnkoJHtQUk9KRUNUX05BTUV9IFNUQVRJQyAke1NSQ19MSVNUfSAke0hEUl9MSVNUfSkKKworYWRkX2RlcGVuZGVuY2llcygke1BST0pFQ1RfTkFNRX0gInZ1bGthbi0ke01BSk9SfSIpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcygke1BST0pFQ1RfTkFNRX0gCisgICAgJHtPU19SRVBMQVlFUl9MSUJTfQorICAgICR7VktUUkFDRV9WVUxLQU5fTElCfQorICAgIHZrdHJhY2VfY29tbW9uCispCisKK2J1aWxkX29wdGlvbnNfZmluYWxpemUoKQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXkuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNGQzOTEKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheS5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24sIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgInZrcmVwbGF5LmgiCisjaW5jbHVkZSAidmtyZXBsYXlfdmtyZXBsYXkuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3BhY2tldF9pZC5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2Vsb2cuaCIKKworc3RhdGljIHZrcmVwbGF5ZXJfc2V0dGluZ3Mgc19kZWZhdWx0VmtSZXBsYXlTZXR0aW5ncyA9IHsgTlVMTCwgMSwgLTEsIC0xLCBOVUxMLCBOVUxMIH07CisKK3ZrUmVwbGF5KiBnX3BSZXBsYXllciA9IE5VTEw7CitWS1RSQUNFX0NSSVRJQ0FMX1NFQ1RJT04gZ19oYW5kbGVyTG9jazsKK1BGTl92a0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgZ19mcERiZ01zZ0NhbGxiYWNrOwordmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfREJHX01TR19DQUxMQkFDS19GVU5DVElPTiBnX2ZwVmt0cmFjZUNhbGxiYWNrID0gTlVMTDsKKworc3RhdGljIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCB2a0Vycm9ySGFuZGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGbGFncyAgICAgICAgICAgICBtc2dGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgICAgIG9ialR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgICAgICAgICAgc3JjT2JqZWN0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIG1zZ0NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgcExheWVyUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICAgIHBNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgcFVzZXJEYXRhKQoreworICAgIFZrQm9vbDMyIGJhaWwgPSBmYWxzZTsKKworICAgIHZrdHJhY2VfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigmZ19oYW5kbGVyTG9jayk7CisgICAgaWYgKChtc2dGbGFncyAmIFZLX0RFQlVHX1JFUE9SVF9FUlJPUl9CSVRfRVhUKSA9PSBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIk1zZ0ZsYWdzICVkIHdpdGggb2JqZWN0ICUjIiBQUkl4TEVBU1Q2NCAiLCBsb2NhdGlvbiAldSByZXR1cm5lZCBtc2dDb2RlICVkIGFuZCBtc2cgJXMiLAorICAgICAgICAgICAgICAgICAgICAgbXNnRmxhZ3MsIHNyY09iamVjdEhhbmRsZSwgbG9jYXRpb24sIG1zZ0NvZGUsIChjaGFyICopIHBNc2cpOworICAgICAgICBnX3BSZXBsYXllci0+cHVzaF92YWxpZGF0aW9uX21zZyhtc2dGbGFncywgb2JqVHlwZSwgc3JjT2JqZWN0SGFuZGxlLCBsb2NhdGlvbiwgbXNnQ29kZSwgcExheWVyUHJlZml4LCBwTXNnLCBwVXNlckRhdGEpOworICAgICAgICBpZiAoZ19mcFZrdHJhY2VDYWxsYmFjayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBnX2ZwVmt0cmFjZUNhbGxiYWNrKHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX0RCR19NU0dfRVJST1IsIHBNc2cpOworICAgICAgICB9CisgICAgICAgIC8qIFRPRE86IGJhaWxpbmcgb3V0IG9mIHRoZSBjYWxsIGNoYWluIGR1ZSB0byB0aGlzIGVycm9yIHNob3VsZCBhbGxvdworICAgICAgICAgKiB0aGUgYXBwIHRvIGNvbnRpbnVlIGluIHNvbWUgZmFzaGlvbi4KKyAgICAgICAgICogSXMgdGhhdCBuZWVkZWQgaGVyZT8KKyAgICAgICAgICovCisgICAgICAgIGJhaWwgPSB0cnVlOworICAgIH0KKyAgICBlbHNlIGlmICgobXNnRmxhZ3MgJiBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUKSA9PSBWS19ERUJVR19SRVBPUlRfV0FSTklOR19CSVRfRVhUIHx8CisgICAgICAgICAgICAgKG1zZ0ZsYWdzICYgVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCkgPT0gVktfREVCVUdfUkVQT1JUX1BFUkZPUk1BTkNFX1dBUk5JTkdfQklUX0VYVCkKKyAgICB7CisgICAgICAgIGlmIChnX2ZwVmt0cmFjZUNhbGxiYWNrICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdfZnBWa3RyYWNlQ2FsbGJhY2sodmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfREJHX01TR19XQVJOSU5HLCBwTXNnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZ19mcFZrdHJhY2VDYWxsYmFjayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBnX2ZwVmt0cmFjZUNhbGxiYWNrKHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX0RCR19NU0dfSU5GTywgcE1zZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnX2hhbmRsZXJMb2NrKTsKKworICAgIHJldHVybiBiYWlsOworfQorCit2b2lkIFZrUmVwbGF5U2V0TG9nQ2FsbGJhY2soVktUUkFDRV9SRVBPUlRfQ0FMTEJBQ0tfRlVOQ1RJT04gcENhbGxiYWNrKQoreworfQorCit2b2lkIFZrUmVwbGF5U2V0TG9nTGV2ZWwoVmt0cmFjZUxvZ0xldmVsIGxldmVsKQoreworfQorCit2b2lkIFZrUmVwbGF5UmVnaXN0ZXJEYmdNc2dDYWxsYmFjayh2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9EQkdfTVNHX0NBTExCQUNLX0ZVTkNUSU9OIHBDYWxsYmFjaykKK3sKKyAgICBnX2ZwVmt0cmFjZUNhbGxiYWNrID0gcENhbGxiYWNrOworfQorCit2a3RyYWNlX1NldHRpbmdHcm91cCogVktUUkFDRVJfQ0RFQ0wgVmtSZXBsYXlHZXRTZXR0aW5ncygpCit7CisgICAgc3RhdGljIEJPT0wgYkZpcnN0VGltZSA9IFRSVUU7CisgICAgaWYgKGJGaXJzdFRpbWUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX3Jlc2V0X2RlZmF1bHRzKCZnX3ZrUmVwbGF5U2V0dGluZ0dyb3VwKTsKKyAgICAgICAgYkZpcnN0VGltZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiAmZ192a1JlcGxheVNldHRpbmdHcm91cDsKK30KKwordm9pZCBWS1RSQUNFUl9DREVDTCBWa1JlcGxheVVwZGF0ZUZyb21TZXR0aW5ncyh2a3RyYWNlX1NldHRpbmdHcm91cCogcFNldHRpbmdHcm91cHMsIHVuc2lnbmVkIGludCBudW1TZXR0aW5nR3JvdXBzKQoreworICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX0FwcGx5X092ZXJyaWRlcygmZ192a1JlcGxheVNldHRpbmdHcm91cCwgcFNldHRpbmdHcm91cHMsIG51bVNldHRpbmdHcm91cHMpOworfQorCitpbnQgVktUUkFDRVJfQ0RFQ0wgVmtSZXBsYXlJbml0aWFsaXplKHZrdHJhY2VfcmVwbGF5OjpSZXBsYXlEaXNwbGF5KiBwRGlzcGxheSwgdmtyZXBsYXllcl9zZXR0aW5ncyAqcFJlcGxheVNldHRpbmdzKQoreworICAgIHRyeQorICAgIHsKKyAgICAgICAgaWYgKHBSZXBsYXlTZXR0aW5ncyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBnX3BSZXBsYXllciA9IG5ldyB2a1JlcGxheSgmc19kZWZhdWx0VmtSZXBsYXlTZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBnX3BSZXBsYXllciA9IG5ldyB2a1JlcGxheShwUmVwbGF5U2V0dGluZ3MpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoIChpbnQgZSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdmtSZXBsYXksIHByb2JhYmx5IG91dCBvZiBtZW1vcnkuIEVycm9yICVkIiwgZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB2a3RyYWNlX2NyZWF0ZV9jcml0aWNhbF9zZWN0aW9uKCZnX2hhbmRsZXJMb2NrKTsKKyAgICBnX2ZwRGJnTXNnQ2FsbGJhY2sgPSB2a0Vycm9ySGFuZGxlcjsKKyAgICBpbnQgcmVzdWx0ID0gZ19wUmVwbGF5ZXItPmluaXQoKnBEaXNwbGF5KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFZLVFJBQ0VSX0NERUNMIFZrUmVwbGF5RGVpbml0aWFsaXplKCkKK3sKKyAgICBpZiAoZ19wUmVwbGF5ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRlbGV0ZSBnX3BSZXBsYXllcjsKKyAgICAgICAgZ19wUmVwbGF5ZXIgPSBOVUxMOworICAgIH0KKyAgICB2a3RyYWNlX2RlbGV0ZV9jcml0aWNhbF9zZWN0aW9uKCZnX2hhbmRsZXJMb2NrKTsKK30KKwordmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBWS1RSQUNFUl9DREVDTCBWa1JlcGxheUludGVycHJldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBQYWNrZXQpCit7CisgICAgLy8gQXR0ZW1wdCB0byBpbnRlcnByZXQgdGhlIHBhY2tldCBhcyBhIFZ1bGthbiBwYWNrZXQKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBJbnRlcnByZXRlZEhlYWRlciA9IGludGVycHJldF90cmFjZV9wYWNrZXRfdmsocFBhY2tldCk7CisgICAgaWYgKHBJbnRlcnByZXRlZEhlYWRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiVW5yZWNvZ25pemVkIFZ1bGthbiBwYWNrZXRfaWQ6ICV1IiwgcFBhY2tldC0+cGFja2V0X2lkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcEludGVycHJldGVkSGVhZGVyOworfQorCit2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfUkVTVUxUIFZLVFJBQ0VSX0NERUNMIFZrUmVwbGF5UmVwbGF5KHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcFBhY2tldCkKK3sKKyAgICB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfUkVTVUxUIHJlc3VsdCA9IHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9FUlJPUjsKKyAgICBpZiAoZ19wUmVwbGF5ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGdfcFJlcGxheWVyLT5yZXBsYXkocFBhY2tldCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfU1VDQ0VTUykKKyAgICAgICAgICAgIHJlc3VsdCA9IGdfcFJlcGxheWVyLT5wb3BfdmFsaWRhdGlvbl9tc2dzKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBWS1RSQUNFUl9DREVDTCBWa1JlcGxheUR1bXAoKQoreworICAgIGlmIChnX3BSZXBsYXllciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZ19wUmVwbGF5ZXItPmR1bXBfdmFsaWRhdGlvbl9kYXRhKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBWS1RSQUNFUl9DREVDTCBWa1JlcGxheUdldEZyYW1lTnVtYmVyKCkKK3sKKyAgICBpZiAoZ19wUmVwbGF5ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBnX3BSZXBsYXllci0+Z2V0X2ZyYW1lX251bWJlcigpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgVktUUkFDRVJfQ0RFQ0wgVmtSZXBsYXlSZXNldEZyYW1lTnVtYmVyKCkKK3sKKyAgICBpZiAoZ19wUmVwbGF5ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGdfcFJlcGxheWVyLT5yZXNldF9mcmFtZV9udW1iZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheS5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ5MzExCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXkuaApAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJ2a3JlcGxheV93aW5kb3cuaCIKKyNpbmNsdWRlICJ2a3JlcGxheV9mYWN0b3J5LmgiCisjaW5jbHVkZSAidmtyZXBsYXlfc2V0dGluZ3MuaCIKKworCitleHRlcm4gdm9pZCBWa1JlcGxheVNldExvZ0NhbGxiYWNrKFZLVFJBQ0VfUkVQT1JUX0NBTExCQUNLX0ZVTkNUSU9OIHBDYWxsYmFjayk7CitleHRlcm4gdm9pZCBWa1JlcGxheVNldExvZ0xldmVsKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCk7CitleHRlcm4gdm9pZCBWa1JlcGxheVJlZ2lzdGVyRGJnTXNnQ2FsbGJhY2sodmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfREJHX01TR19DQUxMQkFDS19GVU5DVElPTiBwQ2FsbGJhY2spOworZXh0ZXJuIHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBWS1RSQUNFUl9DREVDTCBWa1JlcGxheUdldFNldHRpbmdzKCk7CitleHRlcm4gdm9pZCBWS1RSQUNFUl9DREVDTCBWa1JlcGxheVVwZGF0ZUZyb21TZXR0aW5ncyh2a3RyYWNlX1NldHRpbmdHcm91cCogcFNldHRpbmdHcm91cHMsIHVuc2lnbmVkIGludCBudW1TZXR0aW5nR3JvdXBzKTsKK2V4dGVybiBpbnQgVktUUkFDRVJfQ0RFQ0wgVmtSZXBsYXlJbml0aWFsaXplKHZrdHJhY2VfcmVwbGF5OjpSZXBsYXlEaXNwbGF5KiBwRGlzcGxheSwgdmtyZXBsYXllcl9zZXR0aW5ncyAqcFJlcGxheVNldHRpbmdzKTsKK2V4dGVybiB2b2lkIFZLVFJBQ0VSX0NERUNMIFZrUmVwbGF5RGVpbml0aWFsaXplKCk7CitleHRlcm4gdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBWS1RSQUNFUl9DREVDTCBWa1JlcGxheUludGVycHJldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBQYWNrZXQpOworZXh0ZXJuIHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9SRVNVTFQgVktUUkFDRVJfQ0RFQ0wgVmtSZXBsYXlSZXBsYXkodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwUGFja2V0KTsKK2V4dGVybiBpbnQgVktUUkFDRVJfQ0RFQ0wgVmtSZXBsYXlEdW1wKCk7CitleHRlcm4gaW50IFZLVFJBQ0VSX0NERUNMIFZrUmVwbGF5R2V0RnJhbWVOdW1iZXIoKTsKK2V4dGVybiB2b2lkIFZLVFJBQ0VSX0NERUNMIFZrUmVwbGF5UmVzZXRGcmFtZU51bWJlcigpOworCitleHRlcm4gUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBnX2ZwRGJnTXNnQ2FsbGJhY2s7CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheV9zZXR0aW5ncy5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheV9zZXR0aW5ncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkOTg0NQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3NldHRpbmdzLmNwcApAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisKKyNpbmNsdWRlICJ2a3JlcGxheV9zZXR0aW5ncy5oIgorLy8gZGVjbGFyZWQgYXMgZXh0ZXJuIGluIGhlYWRlcgordmtyZXBsYXllcl9zZXR0aW5ncyBnX3ZrUmVwbGF5U2V0dGluZ3M7CisKK3N0YXRpYyB2a3JlcGxheWVyX3NldHRpbmdzIHNfZGVmYXVsdFZrUmVwbGF5U2V0dGluZ3MgPSB7IE5VTEwsIDEsIC0xLCAtMSwgTlVMTCwgTlVMTCB9OworCit2a3RyYWNlX1NldHRpbmdJbmZvIGdfdmtfc2V0dGluZ3NfaW5mb1tdID0KK3sKKyAgICB7ICJ0IiwgIlRyYWNlRmlsZSIsIFZLVFJBQ0VfU0VUVElOR19TVFJJTkcsIHsgJmdfdmtSZXBsYXlTZXR0aW5ncy5wVHJhY2VGaWxlUGF0aCB9LCB7ICZzX2RlZmF1bHRWa1JlcGxheVNldHRpbmdzLnBUcmFjZUZpbGVQYXRoIH0sIFRSVUUsICJUaGUgdHJhY2UgZmlsZSB0byByZXBsYXkuIiB9LAorICAgIHsgImwiLCAiTnVtTG9vcHMiLCBWS1RSQUNFX1NFVFRJTkdfVUlOVCwgeyAmZ192a1JlcGxheVNldHRpbmdzLm51bUxvb3BzIH0sIHsgJnNfZGVmYXVsdFZrUmVwbGF5U2V0dGluZ3MubnVtTG9vcHMgfSwgVFJVRSwgIlRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwbGF5IHRoZSB0cmFjZSBmaWxlIG9yIGxvb3AgcmFuZ2UuIiB9LAorICAgIHsgImxzZiIsICJMb29wU3RhcnRGcmFtZSIsIFZLVFJBQ0VfU0VUVElOR19JTlQsIHsgJmdfdmtSZXBsYXlTZXR0aW5ncy5sb29wU3RhcnRGcmFtZSB9LCB7ICZzX2RlZmF1bHRWa1JlcGxheVNldHRpbmdzLmxvb3BTdGFydEZyYW1lIH0sIFRSVUUsICJUaGUgc3RhcnQgZnJhbWUgbnVtYmVyIG9mIHRoZSBsb29wIHJhbmdlLiIgfSwKKyAgICB7ICJsZWYiLCAiTG9vcEVuZEZyYW1lIiwgVktUUkFDRV9TRVRUSU5HX0lOVCwgeyAmZ192a1JlcGxheVNldHRpbmdzLmxvb3BFbmRGcmFtZSB9LCB7ICZzX2RlZmF1bHRWa1JlcGxheVNldHRpbmdzLmxvb3BFbmRGcmFtZSB9LCBUUlVFLCAiVGhlIGVuZCBmcmFtZSBudW1iZXIgb2YgdGhlIGxvb3AgcmFuZ2UuIiB9LAorICAgIHsgInMiLCAiU2NyZWVuc2hvdCIsIFZLVFJBQ0VfU0VUVElOR19TVFJJTkcsIHsgJmdfdmtSZXBsYXlTZXR0aW5ncy5zY3JlZW5zaG90TGlzdCB9LCB7ICZzX2RlZmF1bHRWa1JlcGxheVNldHRpbmdzLnNjcmVlbnNob3RMaXN0IH0sIFRSVUUsICJDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmcmFtZXMgdG8gdGFrZSBhIHRha2Ugc25hcHNob3RzIG9mIiB9LAorfTsKKwordmt0cmFjZV9TZXR0aW5nR3JvdXAgZ192a1JlcGxheVNldHRpbmdHcm91cCA9Cit7CisgICAgInZrcmVwbGF5X3ZrIiwKKyAgICBzaXplb2YoZ192a19zZXR0aW5nc19pbmZvKSAvIHNpemVvZihnX3ZrX3NldHRpbmdzX2luZm9bMF0pLAorICAgICZnX3ZrX3NldHRpbmdzX2luZm9bMF0KK307CisKK3ZvaWQgYXBwbHlfbGF5ZXJTZXR0aW5nc19vdmVycmlkZXMoKQoreworI2lmIDAKKyAgICBzZXRMYXllck9wdGlvbkVudW0oIkRyYXdTdGF0ZVJlcG9ydEZsYWdzIiwgZ192a1JlcGxheVNldHRpbmdzLmRyYXdTdGF0ZVJlcG9ydEZsYWdzKTsKKyAgICBzZXRMYXllck9wdGlvbkVudW0oIkRyYXdTdGF0ZURlYnVnQWN0aW9uIiwgZ192a1JlcGxheVNldHRpbmdzLmRyYXdTdGF0ZURlYnVnQWN0aW9uKTsKKyAgICBzZXRMYXllck9wdGlvbkVudW0oIk1lbVRyYWNrZXJSZXBvcnRGbGFncyIsIGdfdmtSZXBsYXlTZXR0aW5ncy5tZW1UcmFja2VyUmVwb3J0RmxhZ3MpOworICAgIHNldExheWVyT3B0aW9uRW51bSgiTWVtVHJhY2tlckRlYnVnQWN0aW9uIiwgZ192a1JlcGxheVNldHRpbmdzLm1lbVRyYWNrZXJEZWJ1Z0FjdGlvbik7CisgICAgc2V0TGF5ZXJPcHRpb25FbnVtKCJPYmplY3RUcmFja2VyUmVwb3J0RmxhZ3MiLCBnX3ZrUmVwbGF5U2V0dGluZ3Mub2JqZWN0VHJhY2tlclJlcG9ydEZsYWdzKTsKKyAgICBzZXRMYXllck9wdGlvbkVudW0oIk9iamVjdFRyYWNrZXJEZWJ1Z0FjdGlvbiIsIGdfdmtSZXBsYXlTZXR0aW5ncy5vYmplY3RUcmFja2VyRGVidWdBY3Rpb24pOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheV9zZXR0aW5ncy5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXlfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDNkNmMwCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXlfc2V0dGluZ3MuaApAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFZLUkVQTEFZX19WS19TRVRUSU5HU19ICisjZGVmaW5lIFZLUkVQTEFZX19WS19TRVRUSU5HU19ICisKK2V4dGVybiAiQyIKK3sKKyNpbmNsdWRlICJ2a3RyYWNlX3NldHRpbmdzLmgiCisjaW5jbHVkZSAidmtyZXBsYXlfbWFpbi5oIgorfQorCisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCitleHRlcm4gdmtyZXBsYXllcl9zZXR0aW5ncyBnX3ZrUmVwbGF5U2V0dGluZ3M7CitleHRlcm4gdmt0cmFjZV9TZXR0aW5nR3JvdXAgZ192a1JlcGxheVNldHRpbmdHcm91cDsKKwordm9pZCBhcHBseV9sYXllclNldHRpbmdzX292ZXJyaWRlcygpOworCisjZW5kaWYgLy8gVktSRVBMQVlfX1ZLX1NFVFRJTkdTX0gKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3ZrZGlzcGxheS5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheV92a2Rpc3BsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTdiMTYKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheS92a3JlcGxheV92a2Rpc3BsYXkuY3BwCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICovCisKKyNpbmNsdWRlICJ2a3JlcGxheV92a3JlcGxheS5oIgorI2luY2x1ZGUgInZrX2ljZC5oIgorI2RlZmluZSBBUFBfTkFNRSAidmtyZXBsYXlfdmsiCisjZGVmaW5lIElESV9JQ09OIDEwMQorCit2a0Rpc3BsYXk6OnZrRGlzcGxheSgpCisgICAgOiBtX2luaXRlZFZLKGZhbHNlKSwKKyAgICBtX3dpbmRvd1dpZHRoKDApLAorICAgIG1fd2luZG93SGVpZ2h0KDApLAorICAgIG1fZnJhbWVOdW1iZXIoMCkKK3sKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorI2lmIGRlZmluZWQoQU5EUk9JRCkKKyAgICBtZW1zZXQoJm1fc3VyZmFjZSwgMCwgc2l6ZW9mKFZrSWNkU3VyZmFjZUFuZHJvaWQpKTsKKyAgICBtX3dpbmRvdyA9IDA7CisjZWxzZQorICAgIG1lbXNldCgmbV9zdXJmYWNlLCAwLCBzaXplb2YoVmtJY2RTdXJmYWNlWGNiKSk7CisgICAgbV9wWGNiQ29ubmVjdGlvbiA9IE5VTEw7CisgICAgbV9wWGNiU2NyZWVuID0gTlVMTDsKKyAgICBtX1hjYldpbmRvdyA9IDA7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisgICAgbWVtc2V0KCZtX3N1cmZhY2UsIDAsIHNpemVvZihWa0ljZFN1cmZhY2VXaW4zMikpOworICAgIG1fd2luZG93SGFuZGxlID0gTlVMTDsKKyAgICBtX2Nvbm5lY3Rpb24gPSBOVUxMOworI2VuZGlmCit9CisKK3ZrRGlzcGxheTo6fnZrRGlzcGxheSgpCit7CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgJiYgIWRlZmluZWQoQU5EUk9JRCkKKyAgICBpZiAobV9YY2JXaW5kb3cgIT0gMCkKKyAgICB7CisgICAgICAgIHhjYl9kZXN0cm95X3dpbmRvdyhtX3BYY2JDb25uZWN0aW9uLCBtX1hjYldpbmRvdyk7CisgICAgfQorICAgIGlmIChtX3BYY2JDb25uZWN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgICB4Y2JfZGlzY29ubmVjdChtX3BYY2JDb25uZWN0aW9uKTsKKyAgICB9CisjZW5kaWYKK30KKworVmtSZXN1bHQgdmtEaXNwbGF5Ojppbml0X3ZrKHVuc2lnbmVkIGludCBncHVfaWR4KQoreworI2lmIDAKKyAgICBWa0FwcGxpY2F0aW9uSW5mbyBhcHBJbmZvID0ge307CisgICAgYXBwSW5mby5wQXBwbGljYXRpb25OYW1lID0gQVBQX05BTUU7CisgICAgYXBwSW5mby5wRW5naW5lTmFtZSA9ICIiOworICAgIGFwcEluZm8uYXBpVmVyc2lvbiA9IFZLX0FQSV9WRVJTSU9OOworICAgIFZrUmVzdWx0IHJlcyA9IHZrSW5pdEFuZEVudW1lcmF0ZUdwdXMoJmFwcEluZm8sIE5VTEwsIFZLX01BWF9QSFlTSUNBTF9HUFVTLCAmbV9ncHVDb3VudCwgbV9ncHVzKTsKKyAgICBpZiAoIHJlcyA9PSBWS19TVUNDRVNTICkgeworICAgICAgICAvLyByZXRyaWV2ZSB0aGUgR1BVIGluZm9ybWF0aW9uIGZvciBhbGwgR1BVcworICAgICAgICBmb3IoIHVpbnQzMl90IGdwdSA9IDA7IGdwdSA8IG1fZ3B1Q291bnQ7IGdwdSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgZ3B1SW5mb1NpemUgPSBzaXplb2YobV9ncHVQcm9wc1swXSk7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgR1BVIHBoeXNpY2FsIHByb3BlcnRpZXM6CisgICAgICAgICAgICByZXMgPSB2a0dldEdwdUluZm8oIG1fZ3B1c1tncHVdLCBWS19JTkZPX1RZUEVfUEhZU0lDQUxfR1BVX1BST1BFUlRJRVMsICZncHVJbmZvU2l6ZSwgJm1fZ3B1UHJvcHNbZ3B1XSk7CisgICAgICAgICAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJGYWlsZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcyBmb3IgZ3B1WyVkXSByZXN1bHQgJWQiLCBncHUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gVktfU1VDQ0VTUzsKKyAgICB9IGVsc2UgaWYgKChncHVfaWR4ICsgMSkgPiBtX2dwdUNvdW50KSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrSW5pdEFuZEVudW1lcmF0ZSBudW1iZXIgb2YgZ3B1cyBkb2VzIG5vdCBpbmNsdWRlIHJlcXVlc3RlZCBpbmRleDogbnVtICVkLCByZXF1ZXN0ZWQgJWQiLCBtX2dwdUNvdW50LCBncHVfaWR4KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrSW5pdEFuZEVudW1lcmF0ZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgLy8gVE9ETyBhZGQgbXVsdGktZ3B1IHN1cHBvcnQgYWx3YXlzIHVzZSBncHVbZ3B1X2lkeF0gZm9yIG5vdworICAgIC8vIGdldCBhbGwgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UgZ3B1W2dwdV9pZHhdCisgICAgLy8gZmlyc3QgY2hlY2sgaWYgZXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBzYXZlIGEgbGlzdCBvZiB0aGVtCisgICAgYm9vbCBmb3VuZFdTSUV4dCA9IGZhbHNlOworICAgIGZvciggaW50IGV4dCA9IDA7IGV4dCA8IHNpemVvZiggZXh0ZW5zaW9ucyApIC8gc2l6ZW9mKCBleHRlbnNpb25zWzBdICk7IGV4dCsrKQorICAgIHsKKyAgICAgICAgcmVzID0gdmtHZXRFeHRlbnNpb25TdXBwb3J0KCBtX2dwdXNbZ3B1X2lkeF0sIGV4dGVuc2lvbnNbZXh0XSApOworICAgICAgICBpZiAocmVzID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIG1fZXh0ZW5zaW9ucy5wdXNoX2JhY2soKGNoYXIgKikgZXh0ZW5zaW9uc1tleHRdKTsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGV4dGVuc2lvbnNbZXh0XSwgIlZLX1dTSV9XSU5ET1dTIikpCisgICAgICAgICAgICAgICAgZm91bmRXU0lFeHQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmRXU0lFeHQpIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiVktfV1NJX1dJTkRPV1MgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQgYnkgZ3B1WyVkXSIsIGdwdV9pZHgpOworICAgICAgICByZXR1cm4gVktfRVJST1JfSU5DT01QQVRJQkxFX0RFVklDRTsKKyAgICB9CisgICAgLy8gVE9ETyBnZW5lcmFsaXplIHRoaXM6IHVzZSBvbmUgdW5pdmVyc2FsIHF1ZXVlIGZvciBub3cKKyAgICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBkcWNpID0ge307CisgICAgZHFjaS5xdWV1ZUNvdW50ID0gMTsKKyAgICBkcWNpLnF1ZXVlVHlwZSA9IFZLX1FVRVVFX1VOSVZFUlNBTDsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcXVldWVfcHJpb3JpdGllcyAoZHFjaS5xdWV1ZUNvdW50LCAwLjApOworICAgIGRxY2kucFF1ZXVlUHJpb3JpdGllcyA9IHF1ZXVlX3ByaW9yaXRpZXMuZGF0YSgpOworICAgIC8vIGNyZWF0ZSB0aGUgZGV2aWNlIGVuYWJsaW5nIHZhbGlkYXRpb24gbGV2ZWwgNAorICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqIGV4dGVuc2lvbk5hbWVzID0gJm1fZXh0ZW5zaW9uc1swXTsKKyAgICBWa0RldmljZUNyZWF0ZUluZm8gaW5mbyA9IHt9OworICAgIGluZm8ucXVldWVDcmVhdGVJbmZvQ291bnQgPSAxOworICAgIGluZm8ucFF1ZXVlQ3JlYXRlSW5mb3MgPSAmZHFjaTsKKyAgICBpbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudCA9IHN0YXRpY19jYXN0IDx1aW50MzJfdD4gKG1fZXh0ZW5zaW9ucy5zaXplKCkpOworICAgIGluZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBleHRlbnNpb25OYW1lczsKKyAgICBpbmZvLmZsYWdzID0gVktfREVWSUNFX0NSRUFURV9WQUxJREFUSU9OOworICAgIGluZm8ubWF4VmFsaWRhdGlvbkxldmVsID0gVktfVkFMSURBVElPTl9MRVZFTF80OworICAgIGJvb2wzMl90IHZrVHJ1ZSA9IFZLX1RSVUU7CisgICAgcmVzID0gdmtEYmdTZXRHbG9iYWxPcHRpb24oIFZLX0RCR19PUFRJT05fQlJFQUtfT05fRVJST1IsIHNpemVvZiggdmtUcnVlICksICZ2a1RydWUgKTsKKyAgICBpZiAocmVzICE9IFZLX1NVQ0NFU1MpCisgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygiQ291bGQgbm90IHNldCBkZWJ1ZyBvcHRpb24gYnJlYWsgb24gZXJyb3IiKTsKKyAgICByZXMgPSB2a0NyZWF0ZURldmljZSggbV9ncHVzWzBdLCAmaW5mbywgJm1fZGV2W2dwdV9pZHhdKTsKKyAgICByZXR1cm4gcmVzOworI2Vsc2UKKyAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworI2VuZGlmCit9CisKK2ludCB2a0Rpc3BsYXk6OmluaXQoY29uc3QgdW5zaWduZWQgaW50IGdwdV9pZHgpCit7CisgICAgLy9tX2dwdUlkeCA9IGdwdV9pZHg7CisjaWYgMAorICAgIFZrUmVzdWx0IHJlc3VsdCA9IGluaXRfdmsoZ3B1X2lkeCk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoImNvdWxkIG5vdCBpbml0IHZ1bGthbiBsaWJyYXJ5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2luaXRlZFZLID0gdHJ1ZTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSAmJiAhZGVmaW5lZChBTkRST0lEKQorICAgIGNvbnN0IHhjYl9zZXR1cF90ICpzZXR1cDsKKyAgICB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QgaXRlcjsKKyAgICBpbnQgc2NyOworICAgIG1fcFhjYkNvbm5lY3Rpb24gPSB4Y2JfY29ubmVjdChOVUxMLCAmc2NyKTsKKyAgICBzZXR1cCA9IHhjYl9nZXRfc2V0dXAobV9wWGNiQ29ubmVjdGlvbik7CisgICAgaXRlciA9IHhjYl9zZXR1cF9yb290c19pdGVyYXRvcihzZXR1cCk7CisgICAgd2hpbGUgKHNjci0tID4gMCkKKyAgICAgICAgeGNiX3NjcmVlbl9uZXh0KCZpdGVyKTsKKyAgICBtX3BYY2JTY3JlZW4gPSBpdGVyLmRhdGE7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoV0lOMzIpCitMUkVTVUxUIFdJTkFQSSBXaW5kb3dQcm9jVmsoIEhXTkQgd2luZG93LCB1bnNpZ25lZCBpbnQgbXNnLCBXUEFSQU0gd3AsIExQQVJBTSBscCkKK3sKKyAgICBzd2l0Y2gobXNnKQorICAgIHsKKyAgICAgICAgY2FzZSBXTV9DTE9TRToKKyAgICAgICAgICAgIERlc3Ryb3lXaW5kb3coIHdpbmRvdyk7CisgICAgICAgICAgICAvLyBmYWxsLXRocnUKKyAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApIDsKKyAgICAgICAgICAgIHJldHVybiAwTCA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyggd2luZG93LCBtc2csIHdwLCBscCApIDsKKyAgICB9Cit9CisjZW5kaWYKKworaW50IHZrRGlzcGxheTo6c2V0X3dpbmRvdyh2a3RyYWNlX3dpbmRvd19oYW5kbGUgaFdpbmRvdywgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisjaWYgZGVmaW5lZChBTkRST0lEKQorICAgIG1fd2luZG93ID0gaFdpbmRvdzsKKyAgICBtX3N1cmZhY2Uud2luZG93ID0gaFdpbmRvdzsKKyNlbHNlCisgICAgbV9YY2JXaW5kb3cgPSBoV2luZG93OworI2VuZGlmCisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIG1fd2luZG93SGFuZGxlID0gaFdpbmRvdzsKKyNlbmRpZgorICAgIG1fd2luZG93V2lkdGggPSB3aWR0aDsKKyAgICBtX3dpbmRvd0hlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHZrRGlzcGxheTo6Y3JlYXRlX3dpbmRvdyhjb25zdCB1bnNpZ25lZCBpbnQgd2lkdGgsIGNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisgICAgcmV0dXJuIDA7CisjZWxzZQorCisgICAgdWludDMyX3QgdmFsdWVfbWFzaywgdmFsdWVfbGlzdFszMl07CisgICAgbV9YY2JXaW5kb3cgPSB4Y2JfZ2VuZXJhdGVfaWQobV9wWGNiQ29ubmVjdGlvbik7CisKKyAgICB2YWx1ZV9tYXNrID0gWENCX0NXX0JBQ0tfUElYRUwgfCBYQ0JfQ1dfRVZFTlRfTUFTSzsKKyAgICB2YWx1ZV9saXN0WzBdID0gbV9wWGNiU2NyZWVuLT5ibGFja19waXhlbDsKKyAgICB2YWx1ZV9saXN0WzFdID0gWENCX0VWRU5UX01BU0tfS0VZX1JFTEVBU0UgfAorICAgICAgICAgICAgICAgICAgICBYQ0JfRVZFTlRfTUFTS19FWFBPU1VSRTsKKworICAgIHhjYl9jcmVhdGVfd2luZG93KG1fcFhjYkNvbm5lY3Rpb24sCisgICAgICAgICAgICBYQ0JfQ09QWV9GUk9NX1BBUkVOVCwKKyAgICAgICAgICAgIG1fWGNiV2luZG93LCBtX3BYY2JTY3JlZW4tPnJvb3QsCisgICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLAorICAgICAgICAgICAgWENCX1dJTkRPV19DTEFTU19JTlBVVF9PVVRQVVQsCisgICAgICAgICAgICBtX3BYY2JTY3JlZW4tPnJvb3RfdmlzdWFsLAorICAgICAgICAgICAgdmFsdWVfbWFzaywgdmFsdWVfbGlzdCk7CisKKyAgICB4Y2JfbWFwX3dpbmRvdyhtX3BYY2JDb25uZWN0aW9uLCBtX1hjYldpbmRvdyk7CisgICAgeGNiX2ZsdXNoKG1fcFhjYkNvbm5lY3Rpb24pOworICAgIC8vIFRPRE8gOiBOb3Qgc3VyZSBvZiBiZXN0IHBsYWNlIHRvIHB1dCB0aGlzLCBidXQgSSBoYXZlIGFsbCB0aGUgaW5mbyBJIG5lZWQgaGVyZSBzbyBqdXN0IHNldHRpbmcgaXQgYWxsIGhlcmUgZm9yIG5vdworICAgIC8vbV9YY2JQbGF0Zm9ybUhhbmRsZS5jb25uZWN0aW9uID0gbV9wWGNiQ29ubmVjdGlvbjsKKyAgICAvL21fWGNiUGxhdGZvcm1IYW5kbGUucm9vdCA9IG1fcFhjYlNjcmVlbi0+cm9vdDsKKyAgICBtX3N1cmZhY2UuYmFzZS5wbGF0Zm9ybSA9IFZLX0lDRF9XU0lfUExBVEZPUk1fWENCOworICAgIG1fc3VyZmFjZS5jb25uZWN0aW9uID0gbV9wWGNiQ29ubmVjdGlvbjsKKyAgICBtX3N1cmZhY2Uud2luZG93ID0gbV9YY2JXaW5kb3c7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisgICAgLy8gUmVnaXN0ZXIgV2luZG93IGNsYXNzCisgICAgV05EQ0xBU1NFWCB3Y2V4ID0ge307CisJbV9jb25uZWN0aW9uID0gR2V0TW9kdWxlSGFuZGxlKDApOworICAgIHdjZXguY2JTaXplID0gc2l6ZW9mKCBXTkRDTEFTU0VYKTsKKyAgICB3Y2V4LnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7CisgICAgd2NleC5scGZuV25kUHJvYyA9IFdpbmRvd1Byb2NWazsKKyAgICB3Y2V4LmNiQ2xzRXh0cmEgPSAwOworICAgIHdjZXguY2JXbmRFeHRyYSA9IDA7CisgICAgd2NleC5oSW5zdGFuY2UgPSBtX2Nvbm5lY3Rpb247CisgICAgd2NleC5oSWNvbiA9IExvYWRJY29uKHdjZXguaEluc3RhbmNlLCBNQUtFSU5UUkVTT1VSQ0UoIElESV9JQ09OKSk7CisgICAgd2NleC5oQ3Vyc29yID0gTG9hZEN1cnNvciggTlVMTCwgSURDX0FSUk9XKTsKKyAgICB3Y2V4LmhickJhY2tncm91bmQgPSAoIEhCUlVTSCApKCBDT0xPUl9XSU5ET1cgKyAxKTsKKyAgICB3Y2V4Lmxwc3pNZW51TmFtZSA9IE5VTEw7CisgICAgd2NleC5scHN6Q2xhc3NOYW1lID0gQVBQX05BTUU7CisgICAgd2NleC5oSWNvblNtID0gTG9hZEljb24oIHdjZXguaEluc3RhbmNlLCBNQUtFSU5UUkVTT1VSQ0UoIElESV9JQ09OKSk7CisgICAgaWYoICFSZWdpc3RlckNsYXNzRXgoICZ3Y2V4KSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byByZWdpc3RlciB3aW5kb3dzIGNsYXNzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIHdpbmRvdworICAgIFJFQ1Qgd3IgPSB7MCwwLHdpZHRoLGhlaWdodH07CisgICAgQWRqdXN0V2luZG93UmVjdCgmd3IsIFdTX09WRVJMQVBQRURXSU5ET1csIEZBTFNFKTsKKyAgICBtX3dpbmRvd0hhbmRsZSA9IENyZWF0ZVdpbmRvdyhBUFBfTkFNRSwgQVBQX05BTUUsIFdTX09WRVJMQVBQRURXSU5ET1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgd3IucmlnaHQtd3IubGVmdCwgd3IuYm90dG9tLXdyLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCB3Y2V4LmhJbnN0YW5jZSwgTlVMTCk7CisKKyAgICBpZiAobV93aW5kb3dIYW5kbGUpCisgICAgeworICAgICAgICBTaG93V2luZG93KCBtX3dpbmRvd0hhbmRsZSwgU1dfU0hPV0RFRkFVTFQpOworICAgICAgICBtX3dpbmRvd1dpZHRoID0gd2lkdGg7CisgICAgICAgIG1fd2luZG93SGVpZ2h0ID0gaGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgd2luZG93Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLy8gVE9ETyA6IE5vdCBzdXJlIG9mIGJlc3QgcGxhY2UgdG8gcHV0IHRoaXMsIGJ1dCBJIGhhdmUgYWxsIHRoZSBpbmZvIEkgbmVlZCBoZXJlIHNvIGp1c3Qgc2V0dGluZyBpdCBhbGwgaGVyZSBmb3Igbm93CisgICAgbV9zdXJmYWNlLmJhc2UucGxhdGZvcm0gPSBWS19JQ0RfV1NJX1BMQVRGT1JNX1dJTjMyOworICAgIG1fc3VyZmFjZS5oaW5zdGFuY2UgPSB3Y2V4LmhJbnN0YW5jZTsKKyAgICBtX3N1cmZhY2UuaHduZCA9IG1fd2luZG93SGFuZGxlOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3ZvaWQgdmtEaXNwbGF5OjpyZXNpemVfd2luZG93KGNvbnN0IHVuc2lnbmVkIGludCB3aWR0aCwgY29uc3QgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorI2lmIGRlZmluZWQoQU5EUk9JRCkKKyAgICBtX3dpbmRvd1dpZHRoID0gd2lkdGg7CisgICAgbV93aW5kb3dIZWlnaHQgPSBoZWlnaHQ7CisjZWxzZQorICAgIGlmICh3aWR0aCAhPSBtX3dpbmRvd1dpZHRoIHx8IGhlaWdodCAhPSBtX3dpbmRvd0hlaWdodCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbHVlc1syXTsKKyAgICAgICAgdmFsdWVzWzBdID0gd2lkdGg7CisgICAgICAgIHZhbHVlc1sxXSA9IGhlaWdodDsKKyAgICAgICAgeGNiX2NvbmZpZ3VyZV93aW5kb3cobV9wWGNiQ29ubmVjdGlvbiwgbV9YY2JXaW5kb3csIFhDQl9DT05GSUdfV0lORE9XX1dJRFRIIHwgWENCX0NPTkZJR19XSU5ET1dfSEVJR0hULCB2YWx1ZXMpOworICAgICAgICB4Y2JfZmx1c2gobV9wWGNiQ29ubmVjdGlvbik7CisgICAgICAgIG1fd2luZG93V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbV93aW5kb3dIZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIGlmICh3aWR0aCAhPSBtX3dpbmRvd1dpZHRoIHx8IGhlaWdodCAhPSBtX3dpbmRvd0hlaWdodCkKKyAgICB7CisgICAgICAgIFJFQ1Qgd3IgPSB7MCwgMCwgd2lkdGgsIGhlaWdodH07CisgICAgICAgIEFkanVzdFdpbmRvd1JlY3QoJndyLCBXU19PVkVSTEFQUEVEV0lORE9XLCBGQUxTRSk7CisgICAgICAgIFNldFdpbmRvd1BvcyhnZXRfd2luZG93X2hhbmRsZSgpLCBIV05EX1RPUCwgMCwgMCwgd3IucmlnaHQtd3IubGVmdCwgd3IuYm90dG9tLXdyLnRvcCwgU1dQX05PTU9WRSk7CisgICAgICAgIG1fd2luZG93V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbV93aW5kb3dIZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgdmtEaXNwbGF5Ojpwcm9jZXNzX2V2ZW50KCkKK3sKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3ZrZGlzcGxheS5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXlfdmtkaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkYWY5NQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3ZrZGlzcGxheS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBDb3VydG5leSBHb2VsdHplbmxldWNodGVyIDxjb3VydG5leUBMdW5hckcuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ2a3JlcGxheV92a3JlcGxheS5oIgorI2luY2x1ZGUgInZrX2ljZC5oIgorCitjbGFzcyB2a0Rpc3BsYXk6IHB1YmxpYyB2a3RyYWNlX3JlcGxheTo6UmVwbGF5RGlzcGxheUltcCB7CitmcmllbmQgY2xhc3MgdmtSZXBsYXk7CitwdWJsaWM6CisgICAgdmtEaXNwbGF5KCk7CisgICAgfnZrRGlzcGxheSgpOworICAgIGludCBpbml0KGNvbnN0IHVuc2lnbmVkIGludCBncHVfaWR4KTsKKyAgICBpbnQgc2V0X3dpbmRvdyh2a3RyYWNlX3dpbmRvd19oYW5kbGUgaFdpbmRvdywgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KTsKKyAgICBpbnQgY3JlYXRlX3dpbmRvdyhjb25zdCB1bnNpZ25lZCBpbnQgd2lkdGgsIGNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQpOworICAgIHZvaWQgcmVzaXplX3dpbmRvdyhjb25zdCB1bnNpZ25lZCBpbnQgd2lkdGgsIGNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQpOworICAgIHZvaWQgcHJvY2Vzc19ldmVudCgpOworICAgIFZrU3VyZmFjZUtIUiBnZXRfc3VyZmFjZSgpIHsgcmV0dXJuIChWa1N1cmZhY2VLSFIpICZtX3N1cmZhY2U7IH07CisgICAgLy8gVktfREVWSUNFIGdldF9kZXZpY2UoKSB7IHJldHVybiBtX2RldlttX2dwdUlkeF07fQorI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisjaWYgZGVmaW5lZChBTkRST0lEKQorICAgIEFOYXRpdmVXaW5kb3cqIGdldF93aW5kb3dfaGFuZGxlKCkgeyByZXR1cm4gbV93aW5kb3c7IH0KKyNlbHNlCisgICAgeGNiX3dpbmRvd190IGdldF93aW5kb3dfaGFuZGxlKCkgeyByZXR1cm4gbV9YY2JXaW5kb3c7IH0KKyAgICB4Y2JfY29ubmVjdGlvbl90KiBnZXRfY29ubmVjdGlvbl9oYW5kbGUoKSB7IHJldHVybiBtX3BYY2JDb25uZWN0aW9uOyB9CisgICAgeGNiX3NjcmVlbl90KiBnZXRfc2NyZWVuX2hhbmRsZSgpIHsgcmV0dXJuIG1fcFhjYlNjcmVlbjsgfQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgIEhXTkQgZ2V0X3dpbmRvd19oYW5kbGUoKSB7IHJldHVybiBtX3dpbmRvd0hhbmRsZTsgfQorICAgIEhJTlNUQU5DRSBnZXRfY29ubmVjdGlvbl9oYW5kbGUoKSB7IHJldHVybiBtX2Nvbm5lY3Rpb247IH0KKyNlbmRpZgorcHJpdmF0ZToKKyAgICBWa1Jlc3VsdCBpbml0X3ZrKGNvbnN0IHVuc2lnbmVkIGludCBncHVfaWR4KTsKKyAgICBib29sIG1faW5pdGVkVks7CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisgICAgVmtJY2RTdXJmYWNlQW5kcm9pZCBtX3N1cmZhY2U7CisgICAgQU5hdGl2ZVdpbmRvdyogbV93aW5kb3c7CisjZWxzZQorICAgIFZrSWNkU3VyZmFjZVhjYiBtX3N1cmZhY2U7CisgICAgeGNiX2Nvbm5lY3Rpb25fdCAqbV9wWGNiQ29ubmVjdGlvbjsKKyAgICB4Y2Jfc2NyZWVuX3QgKm1fcFhjYlNjcmVlbjsKKyAgICB4Y2Jfd2luZG93X3QgbV9YY2JXaW5kb3c7CisgICAgLy9Wa1BsYXRmb3JtSGFuZGxlWGNiS0hSIG1fWGNiUGxhdGZvcm1IYW5kbGU7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisgICAgVmtJY2RTdXJmYWNlV2luMzIgbV9zdXJmYWNlOworICAgIEhXTkQgbV93aW5kb3dIYW5kbGU7CisgICAgSElOU1RBTkNFIG1fY29ubmVjdGlvbjsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGludCBtX3dpbmRvd1dpZHRoOworICAgIHVuc2lnbmVkIGludCBtX3dpbmRvd0hlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgbV9mcmFtZU51bWJlcjsKKyAgICBzdGQ6OnZlY3RvcjxWa0V4dGVudDJEPiBpbWFnZUV4dGVudHM7CisgICAgc3RkOjp2ZWN0b3I8VmtJbWFnZT4gaW1hZ2VIYW5kbGVzOworICAgIHN0ZDo6dmVjdG9yPFZrRGV2aWNlTWVtb3J5PiBpbWFnZU1lbW9yeTsKKyAgICBzdGQ6OnZlY3RvcjxWa0RldmljZT4gaW1hZ2VEZXZpY2U7CisjaWYgMAorICAgIFZLX0RFVklDRSBtX2RldltWS19NQVhfUEhZU0lDQUxfR1BVU107CisgICAgdWludDMyX3QgbV9ncHVDb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgbV9ncHVJZHg7CisgICAgVktfUEhZU0lDQUxfR1BVIG1fZ3B1c1tWS19NQVhfUEhZU0lDQUxfR1BVU107CisgICAgVktfUEhZU0lDQUxfR1BVX1BST1BFUlRJRVMgbV9ncHVQcm9wc1tWS19NQVhfUEhZU0lDQUxfR1BVU107CisjZW5kaWYKKyAgICBzdGQ6OnZlY3RvcjxjaGFyICo+bV9leHRlbnNpb25zOworfTsKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3ZrcmVwbGF5LmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3ZrcmVwbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc5NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXlfdmtyZXBsYXkuY3BwCkBAIC0wLDAgKzEsMzQ1MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IENvdXJ0bmV5IEdvZWx0emVubGV1Y2h0ZXIgPGNvdXJ0bmV5QEx1bmFyRy5jb20+CisgKiBBdXRob3I6IE1hcmsgTG9ib2R6aW5za2kgPG1hcmtAbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluQGx1bmFyZy5jb20+CisgKi8KKworI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKyNpbmNsdWRlICJ2a3JlcGxheV92a3JlcGxheS5oIgorI2luY2x1ZGUgInZrcmVwbGF5LmgiCisjaW5jbHVkZSAidmtyZXBsYXlfc2V0dGluZ3MuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgInZrdHJhY2VfdmtfdmtfcGFja2V0cy5oIgorI2luY2x1ZGUgInZrX2VudW1fc3RyaW5nX2hlbHBlci5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworI2luY2x1ZGUgInZrdHJhY2VfcGFnZWd1YXJkX21lbW9yeWNvcHkuaCIKKwordmtyZXBsYXllcl9zZXR0aW5ncyAqZ19wUmVwbGF5U2V0dGluZ3M7CisKK3ZrUmVwbGF5Ojp2a1JlcGxheSh2a3JlcGxheWVyX3NldHRpbmdzICpwUmVwbGF5U2V0dGluZ3MpCit7CisgICAgZ19wUmVwbGF5U2V0dGluZ3MgPSBwUmVwbGF5U2V0dGluZ3M7CisgICAgbV9kaXNwbGF5ID0gbmV3IHZrRGlzcGxheSgpOworICAgIG1fcERTRHVtcCA9IE5VTEw7CisgICAgbV9wQ0JEdW1wID0gTlVMTDsKKy8vICAgIG1fcFZrdHJhY2VTbmFwc2hvdFByaW50ID0gTlVMTDsKKyAgICBtX29iak1hcHBlci5tX2FkanVzdEZvckdQVSA9IGZhbHNlOworCisgICAgbV9mcmFtZU51bWJlciA9IDA7Cit9CisKK3ZrUmVwbGF5Ojp+dmtSZXBsYXkoKQoreworICAgIGRlbGV0ZSBtX2Rpc3BsYXk7CisgICAgdmt0cmFjZV9wbGF0Zm9ybV9jbG9zZV9saWJyYXJ5KG1fdmtGdW5jcy5tX2xpYkhhbmRsZSk7Cit9CisKK2ludCB2a1JlcGxheTo6aW5pdCh2a3RyYWNlX3JlcGxheTo6UmVwbGF5RGlzcGxheSAmIGRpc3ApCit7CisgICAgaW50IGVycjsKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorICAgIHZvaWQgKiBoYW5kbGUgPSBkbG9wZW4oImxpYnZ1bGthbi5zbyIsIFJUTERfTEFaWSk7CisjZWxzZQorICAgIEhNT0RVTEUgaGFuZGxlID0gTG9hZExpYnJhcnkoInZ1bGthbi0xLmRsbCIgKTsKKyNlbmRpZgorCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBvcGVuIHZ1bGthbiBsaWJyYXJ5LiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1fdmtGdW5jcy5pbml0X2Z1bmNzKGhhbmRsZSk7CisgICAgZGlzcC5zZXRfaW1wbGVtZW50YXRpb24obV9kaXNwbGF5KTsKKyAgICBpZiAoKGVyciA9IG1fZGlzcGxheS0+aW5pdChkaXNwLmdldF9ncHUoKSkpICE9IDApIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIGluaXQgdnVsa2FuIGRpc3BsYXkuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmIChkaXNwLmdldF93aW5kb3dfaGFuZGxlKCkgPT0gMCkKKyAgICB7CisgICAgICAgIGlmICgoZXJyID0gbV9kaXNwbGF5LT5jcmVhdGVfd2luZG93KGRpc3AuZ2V0X3dpZHRoKCksIGRpc3AuZ2V0X2hlaWdodCgpKSkgIT0gMCkgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBXaW5kb3ciKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChlcnIgPSBtX2Rpc3BsYXktPnNldF93aW5kb3coZGlzcC5nZXRfd2luZG93X2hhbmRsZSgpLCBkaXNwLmdldF93aWR0aCgpLCBkaXNwLmdldF9oZWlnaHQoKSkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBzZXQgV2luZG93Iik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfUkVTVUxUIHZrUmVwbGF5OjpoYW5kbGVfcmVwbGF5X2Vycm9ycyhjb25zdCBjaGFyKiBlbnRyeXBvaW50TmFtZSwgY29uc3QgVmtSZXN1bHQgcmVzQ2FsbCwgY29uc3QgVmtSZXN1bHQgcmVzVHJhY2UsIGNvbnN0IHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9SRVNVTFQgcmVzSW4pCit7CisgICAgdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX1JFU1VMVCByZXMgPSByZXNJbjsKKyAgICBpZiAocmVzQ2FsbCA9PSBWS19FUlJPUl9ERVZJQ0VfTE9TVCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkFQSSBjYWxsICVzIHJldHVybmVkIFZLX0VSUk9SX0RFVklDRV9MT1NULiB2a3JlcGxheSBjYW5ub3QgY29udGludWUsIGV4aXRpbmcuIiwgZW50cnlwb2ludE5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBpZiAocmVzQ2FsbCAhPSByZXNUcmFjZSkgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJSZXR1cm4gdmFsdWUgJXMgZnJvbSBBUEkgY2FsbCAoJXMpIGRvZXMgbm90IG1hdGNoIHJldHVybiB2YWx1ZSBmcm9tIHRyYWNlIGZpbGUgJXMuIiwKKyAgICAgICAgICAgICAgICBzdHJpbmdfVmtSZXN1bHQoKFZrUmVzdWx0KXJlc0NhbGwpLCBlbnRyeXBvaW50TmFtZSwgc3RyaW5nX1ZrUmVzdWx0KChWa1Jlc3VsdClyZXNUcmFjZSkpOworICAgICAgICByZXMgPSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfQkFEX1JFVFVSTjsKKyAgICB9CisgICAgaWYgKHJlc0NhbGwgIT0gVktfU1VDQ0VTUyAgJiYgcmVzQ2FsbCAhPSBWS19OT1RfUkVBRFkpIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJBUEkgY2FsbCAoJXMpIHJldHVybmVkIGZhaWxlZCByZXN1bHQgJXMiLCBlbnRyeXBvaW50TmFtZSwgc3RyaW5nX1ZrUmVzdWx0KHJlc0NhbGwpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KK3ZvaWQgdmtSZXBsYXk6OnB1c2hfdmFsaWRhdGlvbl9tc2coVmtGbGFncyBtc2dGbGFncywgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqVHlwZSwgdWludDY0X3Qgc3JjT2JqZWN0SGFuZGxlLCBzaXplX3QgbG9jYXRpb24sIGludDMyX3QgbXNnQ29kZSwgY29uc3QgY2hhciogcExheWVyUHJlZml4LCBjb25zdCBjaGFyKiBwTXNnLCBjb25zdCB2b2lkKiBwVXNlckRhdGEpCit7CisgICAgc3RydWN0IFZhbGlkYXRpb25Nc2cgbXNnT2JqOworICAgIG1zZ09iai5tc2dGbGFncyA9IG1zZ0ZsYWdzOworICAgIG1zZ09iai5vYmpUeXBlID0gb2JqVHlwZTsKKyAgICBtc2dPYmouc3JjT2JqZWN0SGFuZGxlID0gc3JjT2JqZWN0SGFuZGxlOworICAgIG1zZ09iai5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIHN0cm5jcHkobXNnT2JqLmxheWVyUHJlZml4LCBwTGF5ZXJQcmVmaXgsIDI1Nik7CisgICAgbXNnT2JqLmxheWVyUHJlZml4WzI1NV0gPSAnXDAnOworICAgIG1zZ09iai5tc2dDb2RlID0gbXNnQ29kZTsKKyAgICBzdHJuY3B5KG1zZ09iai5tc2csIHBNc2csIDI1Nik7CisgICAgbXNnT2JqLm1zZ1syNTVdID0gJ1wwJzsKKyAgICBtc2dPYmoucFVzZXJEYXRhID0gKHZvaWQgKikgcFVzZXJEYXRhOworICAgIG1fdmFsaWRhdGlvbk1zZ3MucHVzaF9iYWNrKG1zZ09iaik7Cit9CisKK3ZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9SRVNVTFQgdmtSZXBsYXk6OnBvcF92YWxpZGF0aW9uX21zZ3MoKQoreworICAgIGlmIChtX3ZhbGlkYXRpb25Nc2dzLnNpemUoKSA9PSAwKQorICAgICAgICByZXR1cm4gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX1NVQ0NFU1M7CisgICAgbV92YWxpZGF0aW9uTXNncy5jbGVhcigpOworICAgIHJldHVybiB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfVkFMSURBVElPTl9FUlJPUjsKK30KKworaW50IHZrUmVwbGF5OjpkdW1wX3ZhbGlkYXRpb25fZGF0YSgpCit7CisgICAgaWYgIChtX3BEU0R1bXAgJiYgbV9wQ0JEdW1wKQorICAgIHsKKyAgICAgICAgbV9wRFNEdW1wKChjaGFyICopICJwaXBlbGluZV9kdW1wLmRvdCIpOworICAgICAgICBtX3BDQkR1bXAoKGNoYXIgKikgImNiX2R1bXAuZG90Iik7CisgICAgfQorLy8gICAgaWYgKG1fcFZrdHJhY2VTbmFwc2hvdFByaW50ICE9IE5VTEwpCisvLyAgICB7CisvLyAgICAgICAgbV9wVmt0cmFjZVNuYXBzaG90UHJpbnQoKTsKKy8vICAgIH0KKyAgIHJldHVybiAwOworfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlSW5zdGFuY2UocGFja2V0X3ZrQ3JlYXRlSW5zdGFuY2UqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbzsKKyAgICBjaGFyICoqcHBFbmFibGVkTGF5ZXJOYW1lcyA9IE5VTEwsICoqc2F2ZWRfcHBMYXllcnM7CisgICAgaWYgKCFtX2Rpc3BsYXktPm1faW5pdGVkVkspCisgICAgeworICAgICAgICBWa0luc3RhbmNlIGluc3Q7CisKKyAgICAgICAgY29uc3QgY2hhciBzdHJTY3JlZW5TaG90W10gPSAiVktfTEFZRVJfTFVOQVJHX3NjcmVlbnNob3QiOworICAgICAgICBwQ3JlYXRlSW5mbyA9IChWa0luc3RhbmNlQ3JlYXRlSW5mbyAqKSBwUGFja2V0LT5wQ3JlYXRlSW5mbzsKKyAgICAgICAgaWYgKGdfcFJlcGxheVNldHRpbmdzLT5zY3JlZW5zaG90TGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBlbmFibGUgc2NyZWVuc2hvdCBsYXllciBpZiBpdCBpcyBhdmFpbGFibGUgYW5kIG5vdCBhbHJlYWR5IGluIGxpc3QKKyAgICAgICAgICAgIGJvb2wgZm91bmRfc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzW2ldLCBzdHJTY3JlZW5TaG90KSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZF9zcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmRfc3MpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudDsKKworICAgICAgICAgICAgICAgIC8vIHF1ZXJ5IHRvIGZpbmQgaWYgU2NyZWVuU2hvdCBsYXllciBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBtX3ZrRnVuY3MucmVhbF92a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKCZjb3VudCwgTlVMTCk7CisgICAgICAgICAgICAgICAgVmtMYXllclByb3BlcnRpZXMgKnByb3BzID0gKFZrTGF5ZXJQcm9wZXJ0aWVzICopIHZrdHJhY2VfbWFsbG9jKGNvdW50ICogc2l6ZW9mIChWa0xheWVyUHJvcGVydGllcykpOworICAgICAgICAgICAgICAgIGlmIChwcm9wcyAmJiBjb3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgIG1fdmtGdW5jcy5yZWFsX3ZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMoJmNvdW50LCBwcm9wcyk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAocHJvcHNbaV0ubGF5ZXJOYW1lLCBzdHJTY3JlZW5TaG90KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kX3NzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNjcmVlbnNob3QgbGF5ZXIgaXMgYXZhaWxhYmxlIHNvIGVuYWJsZSBpdAorICAgICAgICAgICAgICAgICAgICBwcEVuYWJsZWRMYXllck5hbWVzID0gKGNoYXIgKiopIHZrdHJhY2VfbWFsbG9jKChwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQgJiYgcHBFbmFibGVkTGF5ZXJOYW1lczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcEVuYWJsZWRMYXllck5hbWVzW2ldID0gKGNoYXIgKikgcENyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHBFbmFibGVkTGF5ZXJOYW1lc1twQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnRdID0gKGNoYXIgKikgdmt0cmFjZV9tYWxsb2Moc3RybGVuKHN0clNjcmVlblNob3QpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShwcEVuYWJsZWRMYXllck5hbWVzW3BDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudCsrXSwgc3RyU2NyZWVuU2hvdCk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkX3BwTGF5ZXJzID0gKGNoYXIgKiopIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzOworICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcyA9IHBwRW5hYmxlZExheWVyTmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZrdHJhY2VfZnJlZShwcm9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFyICoqc2F2ZWRfcHBFeHRlbnNpb25zID0gKGNoYXIgKiopcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzOworICAgICAgICBpbnQgc2F2ZWRFeHRlbnNpb25Db3VudCA9IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7CisgICAgICAgIHZlY3Rvcjxjb25zdCBjaGFyICo+IGV4dGVuc2lvbl9uYW1lczsKKyAgICAgICAgdmVjdG9yPHN0cmluZz4gb3V0bGlzdDsKKworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisjaWYgIWRlZmluZWQoQU5EUk9JRCkKKyAgICAgICAgZXh0ZW5zaW9uX25hbWVzLnB1c2hfYmFjayhWS19LSFJfWENCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgICAgICBvdXRsaXN0LnB1c2hfYmFjaygiVktfS0hSX3dpbjMyX3N1cmZhY2UiKTsKKyNlbHNlCisgICAgICAgIGV4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX0FORFJPSURfU1VSRkFDRV9FWFRFTlNJT05fTkFNRSk7CisgICAgICAgIG91dGxpc3QucHVzaF9iYWNrKCJWS19LSFJfd2luMzJfc3VyZmFjZSIpOworICAgICAgICBvdXRsaXN0LnB1c2hfYmFjaygiVktfS0hSX3hsaWJfc3VyZmFjZSIpOworICAgICAgICBvdXRsaXN0LnB1c2hfYmFjaygiVktfS0hSX3hjYl9zdXJmYWNlIik7CisgICAgICAgIG91dGxpc3QucHVzaF9iYWNrKCJWS19LSFJfd2F5bGFuZF9zdXJmYWNlIik7CisgICAgICAgIG91dGxpc3QucHVzaF9iYWNrKCJWS19LSFJfbWlyX3N1cmZhY2UiKTsKKyNlbmRpZiAvL0FORFJPSUQKKyNlbHNlCisgICAgICAgIGV4dGVuc2lvbl9uYW1lcy5wdXNoX2JhY2soVktfS0hSX1dJTjMyX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpOworICAgICAgICBvdXRsaXN0LnB1c2hfYmFjaygiVktfS0hSX3hsaWJfc3VyZmFjZSIpOworICAgICAgICBvdXRsaXN0LnB1c2hfYmFjaygiVktfS0hSX3hjYl9zdXJmYWNlIik7CisgICAgICAgIG91dGxpc3QucHVzaF9iYWNrKCJWS19LSFJfd2F5bGFuZF9zdXJmYWNlIik7CisgICAgICAgIG91dGxpc3QucHVzaF9iYWNrKCJWS19LSFJfbWlyX3N1cmZhY2UiKTsKKyNlbmRpZgorCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICggZmluZChvdXRsaXN0LmJlZ2luKCksIG91dGxpc3QuZW5kKCksIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSkgPT0gb3V0bGlzdC5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZXMucHVzaF9iYWNrKHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gZXh0ZW5zaW9uX25hbWVzLmRhdGEoKTsKKyAgICAgICAgcENyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudCA9ICh1aW50MzJfdClleHRlbnNpb25fbmFtZXMuc2l6ZSgpOworCisgICAgICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlSW5zdGFuY2UocFBhY2tldC0+cENyZWF0ZUluZm8sIE5VTEwsICZpbnN0KTsKKworICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBzYXZlZF9wcEV4dGVuc2lvbnM7CisgICAgICAgIHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPSBzYXZlZEV4dGVuc2lvbkNvdW50OworCisgICAgICAgIGlmIChwcEVuYWJsZWRMYXllck5hbWVzKSB7CisgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBwYWNrZXRzIENyZWF0ZUluZm8gc3RydWN0CisgICAgICAgICAgICB2a3RyYWNlX2ZyZWUocHBFbmFibGVkTGF5ZXJOYW1lc1twQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQgLSAxXSk7CisgICAgICAgICAgICB2a3RyYWNlX2ZyZWUocHBFbmFibGVkTGF5ZXJOYW1lcyk7CisgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcyA9IHNhdmVkX3BwTGF5ZXJzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgICAgICBtX29iak1hcHBlci5hZGRfdG9faW5zdGFuY2VzX21hcCgqKHBQYWNrZXQtPnBJbnN0YW5jZSksIGluc3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK2Jvb2wgdmtSZXBsYXk6OmdldFF1ZXVlRmFtaWx5SWR4KFZrUGh5c2ljYWxEZXZpY2UgdHJhY2VQaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2UgcmVwbGF5UGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFjZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwUmVwbGF5SWR4KQoreworICAgIGlmICAodHJhY2VJZHggPT0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQpCisgICAgeworICAgICAgICAqcFJlcGxheUlkeCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodHJhY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMuZmluZCh0cmFjZVBoeXNpY2FsRGV2aWNlKSA9PSB0cmFjZVF1ZXVlRmFtaWx5UHJvcGVydGllcy5lbmQoKSB8fAorICAgICAgICByZXBsYXlRdWV1ZUZhbWlseVByb3BlcnRpZXMuZmluZChyZXBsYXlQaHlzaWNhbERldmljZSkgPT0gcmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzLmVuZCgpKQorICAgIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChtaW4odHJhY2VRdWV1ZUZhbWlseVByb3BlcnRpZXNbdHJhY2VQaHlzaWNhbERldmljZV0uY291bnQsIHJlcGxheVF1ZXVlRmFtaWx5UHJvcGVydGllc1tyZXBsYXlQaHlzaWNhbERldmljZV0uY291bnQpID09IDApCisgICAgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHJlcGxheVF1ZXVlRmFtaWx5UHJvcGVydGllc1tyZXBsYXlQaHlzaWNhbERldmljZV0uY291bnQgPT0gMSkKKyAgICB7CisgICAgICAgICpwUmVwbGF5SWR4ID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1pbih0cmFjZVF1ZXVlRmFtaWx5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5jb3VudCwgcmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzW3JlcGxheVBoeXNpY2FsRGV2aWNlXS5jb3VudCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh0cmFjZVF1ZXVlRmFtaWx5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5xdWV1ZUZhbWlseVByb3BlcnRpZXNbdHJhY2VJZHhdLnF1ZXVlRmxhZ3MgPT0gcmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzW3JlcGxheVBoeXNpY2FsRGV2aWNlXS5xdWV1ZUZhbWlseVByb3BlcnRpZXNbaV0ucXVldWVGbGFncykKKyAgICAgICAgeworICAgICAgICAgICAgKnBSZXBsYXlJZHggPSBpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEaWRuJ3QgZmluZCBhbiBleGFjdCBtYXRjaCwgc2VhcmNoIGZvciBhIHN1cGVyc2V0CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1pbih0cmFjZVF1ZXVlRmFtaWx5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5jb3VudCwgcmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzW3JlcGxheVBoeXNpY2FsRGV2aWNlXS5jb3VudCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh0cmFjZVF1ZXVlRmFtaWx5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5xdWV1ZUZhbWlseVByb3BlcnRpZXNbdHJhY2VJZHhdLnF1ZXVlRmxhZ3MgPT0KKyAgICAgICAgICAgICh0cmFjZVF1ZXVlRmFtaWx5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5xdWV1ZUZhbWlseVByb3BlcnRpZXNbdHJhY2VJZHhdLnF1ZXVlRmxhZ3MgJiByZXBsYXlRdWV1ZUZhbWlseVByb3BlcnRpZXNbcmVwbGF5UGh5c2ljYWxEZXZpY2VdLnF1ZXVlRmFtaWx5UHJvcGVydGllc1tpXS5xdWV1ZUZsYWdzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBSZXBsYXlJZHggPSBpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWw6CisgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ2Fubm90IGRldGVybWluZSBxdWV1ZSBmYW1pbHkgaW5kZXggLSBoYXMgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyBiZWVuIGNhbGxlZD8iKTsKKyAgICAvLyBEaWRuJ3QgZmluZCBhIG1hdGNoCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIHZrUmVwbGF5OjpnZXRRdWV1ZUZhbWlseUlkeChWa0RldmljZSB0cmFjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRGV2aWNlIHJlcGxheURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBSZXBsYXlJZHgpCit7CisgICAgVmtQaHlzaWNhbERldmljZSB0cmFjZVBoeXNpY2FsRGV2aWNlOworICAgIFZrUGh5c2ljYWxEZXZpY2UgcmVwbGF5UGh5c2ljYWxEZXZpY2U7CisKKyAgICBpZiAodHJhY2VQaHlzaWNhbERldmljZXMuZmluZCh0cmFjZURldmljZSkgPT0gdHJhY2VQaHlzaWNhbERldmljZXMuZW5kKCkgfHwKKyAgICAgICAgcmVwbGF5UGh5c2ljYWxEZXZpY2VzLmZpbmQocmVwbGF5RGV2aWNlKSA9PSByZXBsYXlQaHlzaWNhbERldmljZXMuZW5kKCkpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoIkNhbm5vdCBkZXRlcm1pbmUgcXVldWUgZmFtaWx5IGluZGV4IC0gaGFzIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMgYmVlbiBjYWxsZWQ/Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0cmFjZVBoeXNpY2FsRGV2aWNlID0gdHJhY2VQaHlzaWNhbERldmljZXNbdHJhY2VEZXZpY2VdOworICAgIHJlcGxheVBoeXNpY2FsRGV2aWNlID0gcmVwbGF5UGh5c2ljYWxEZXZpY2VzW3JlcGxheURldmljZV07CisKKyAgICByZXR1cm4gZ2V0UXVldWVGYW1pbHlJZHgodHJhY2VQaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbGF5SWR4KTsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZURldmljZShwYWNrZXRfdmtDcmVhdGVEZXZpY2UqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIGlmICghbV9kaXNwbGF5LT5tX2luaXRlZFZLKQorICAgIHsKKyAgICAgICAgVmtEZXZpY2UgZGV2aWNlOworICAgICAgICBWa1BoeXNpY2FsRGV2aWNlIHJlbWFwcGVkUGh5c2ljYWxEZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9waHlzaWNhbGRldmljZXMocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UpOworICAgICAgICBWa0RldmljZUNyZWF0ZUluZm8gKnBDcmVhdGVJbmZvOworICAgICAgICBjaGFyICoqcHBFbmFibGVkTGF5ZXJOYW1lcyA9IE5VTEwsICoqc2F2ZWRfcHBMYXllcnM7CisgICAgICAgIGlmIChyZW1hcHBlZFBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NyZWF0ZURldmljZSgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrUGh5c2ljYWxEZXZpY2UuIik7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgc3RyU2NyZWVuU2hvdFtdID0gIlZLX0xBWUVSX0xVTkFSR19zY3JlZW5zaG90IjsKKyAgICAgICAgLy9jaGFyICpzdHJTY3JlZW5TaG90RW52ID0gdmt0cmFjZV9nZXRfZ2xvYmFsX3ZhcigiX1ZLX1NDUkVFTlNIT1QiKTsKKworICAgICAgICBwQ3JlYXRlSW5mbyA9IChWa0RldmljZUNyZWF0ZUluZm8gKikgcFBhY2tldC0+cENyZWF0ZUluZm87CisgICAgICAgIGlmIChnX3BSZXBsYXlTZXR0aW5ncy0+c2NyZWVuc2hvdExpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gZW5hYmxlIHNjcmVlbnNob3QgbGF5ZXIgaWYgaXQgaXMgYXZhaWxhYmxlIGFuZCBub3QgYWxyZWFkeSBpbiBsaXN0CisgICAgICAgICAgICBib29sIGZvdW5kX3NzID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENyZWF0ZUluZm8tPmVuYWJsZWRMYXllckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSwgc3RyU2NyZWVuU2hvdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kX3NzKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQ7CisKKyAgICAgICAgICAgICAgICAvLyBxdWVyeSB0byBmaW5kIGlmIFNjcmVlblNob3QgbGF5ZXIgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgbV92a0Z1bmNzLnJlYWxfdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMocmVtYXBwZWRQaHlzaWNhbERldmljZSwgJmNvdW50LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBWa0xheWVyUHJvcGVydGllcyAqcHJvcHMgPSAoVmtMYXllclByb3BlcnRpZXMgKikgdmt0cmFjZV9tYWxsb2MoY291bnQgKiBzaXplb2YgKFZrTGF5ZXJQcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3BzICYmIGNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgbV92a0Z1bmNzLnJlYWxfdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMocmVtYXBwZWRQaHlzaWNhbERldmljZSwgJmNvdW50LCBwcm9wcyk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAocHJvcHNbaV0ubGF5ZXJOYW1lLCBzdHJTY3JlZW5TaG90KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kX3NzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNjcmVlbnNob3QgbGF5ZXIgaXMgYXZhaWxhYmxlIHNvIGVuYWJsZSBpdAorICAgICAgICAgICAgICAgICAgICBwcEVuYWJsZWRMYXllck5hbWVzID0gKGNoYXIgKiopIHZrdHJhY2VfbWFsbG9jKChwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQrMSkgKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQgJiYgcHBFbmFibGVkTGF5ZXJOYW1lczsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcEVuYWJsZWRMYXllck5hbWVzW2ldID0gKGNoYXIgKikgcENyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHBFbmFibGVkTGF5ZXJOYW1lc1twQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnRdID0gKGNoYXIgKikgdmt0cmFjZV9tYWxsb2Moc3RybGVuKHN0clNjcmVlblNob3QpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShwcEVuYWJsZWRMYXllck5hbWVzW3BDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudCsrXSwgc3RyU2NyZWVuU2hvdCk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkX3BwTGF5ZXJzID0gKGNoYXIgKiopIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzOworICAgICAgICAgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcyA9IHBwRW5hYmxlZExheWVyTmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZrdHJhY2VfZnJlZShwcm9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IGFsbCBpbnN0YW5jZXMgb2YgcXVldWVGYW1pbHlJbmRleCBpbiBzdHJ1Y3R1cmUKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5xdWV1ZUNyZWF0ZUluZm9Db3VudDsgaSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBsYXlJZHg7CisgICAgICAgICAgICBpZiAocFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zICYmCisgICAgICAgICAgICAgICAgZ2V0UXVldWVGYW1pbHlJZHgocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYXBwZWRQaHlzaWNhbERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3MtPnF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxheUlkeCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKigodWludDMyX3QgKikmcFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zLT5xdWV1ZUZhbWlseUluZGV4KSA9IHJlcGxheUlkeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJ2a0NyZWF0ZURldmljZSBmYWlsZWQsIGJhZCBxdWV1ZUZhbWlseUluZGV4Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlRGV2aWNlKHJlbWFwcGVkUGh5c2ljYWxEZXZpY2UsIHBQYWNrZXQtPnBDcmVhdGVJbmZvLCBOVUxMLCAmZGV2aWNlKTsKKyAgICAgICAgaWYgKHBwRW5hYmxlZExheWVyTmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHBhY2tldHMgQ3JlYXRlSW5mbyBzdHJ1Y3QKKyAgICAgICAgICAgIHZrdHJhY2VfZnJlZShwcEVuYWJsZWRMYXllck5hbWVzW3BDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudC0xXSk7CisgICAgICAgICAgICB2a3RyYWNlX2ZyZWUocHBFbmFibGVkTGF5ZXJOYW1lcyk7CisgICAgICAgICAgICBwQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcyA9IHNhdmVkX3BwTGF5ZXJzOworICAgICAgICB9CisgICAgICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX2RldmljZXNfbWFwKCoocFBhY2tldC0+cERldmljZSksIGRldmljZSk7CisgICAgICAgICAgICB0cmFjZVBoeXNpY2FsRGV2aWNlc1sqKHBQYWNrZXQtPnBEZXZpY2UpXSA9IHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlOworICAgICAgICAgICAgcmVwbGF5UGh5c2ljYWxEZXZpY2VzW2RldmljZV0gPSByZW1hcHBlZFBoeXNpY2FsRGV2aWNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVCdWZmZXIocGFja2V0X3ZrQ3JlYXRlQnVmZmVyKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICBidWZmZXJPYmogbG9jYWxfYnVmZmVyT2JqOworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgLy8gQ29udmVydCBxdWV1ZUZhbWlseUluZGljZXMKKyAgICBpZiAocFBhY2tldC0+cENyZWF0ZUluZm8pCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+cENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBsYXlJZHg7CisgICAgICAgICAgICBpZiAocFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMgJiYKKyAgICAgICAgICAgICAgICBnZXRRdWV1ZUZhbWlseUlkeChwUGFja2V0LT5kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYXBwZWREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxheUlkeCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKigodWludDMyX3QqKSZwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlc1tpXSkgPSByZXBsYXlJZHg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrQ3JlYXRlQnVmZmVyIGZhaWxlZCwgYmFkIHF1ZXVlRmFtaWx5SW5kZXgiKTsKKyAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0NyZWF0ZUJ1ZmZlcihyZW1hcHBlZERldmljZSwgcFBhY2tldC0+cENyZWF0ZUluZm8sIE5VTEwsICZsb2NhbF9idWZmZXJPYmoucmVwbGF5QnVmZmVyKTsKKyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICB0cmFjZUJ1ZmZlclRvRGV2aWNlWypwUGFja2V0LT5wQnVmZmVyXSA9IHBQYWNrZXQtPmRldmljZTsKKyAgICAgICAgcmVwbGF5QnVmZmVyVG9EZXZpY2VbbG9jYWxfYnVmZmVyT2JqLnJlcGxheUJ1ZmZlcl0gPSByZW1hcHBlZERldmljZTsKKyAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX2J1ZmZlcnNfbWFwKCoocFBhY2tldC0+cEJ1ZmZlciksIGxvY2FsX2J1ZmZlck9iaik7CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVJbWFnZShwYWNrZXRfdmtDcmVhdGVJbWFnZSogcFBhY2tldCkKK3sKKyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgaW1hZ2VPYmogbG9jYWxfaW1hZ2VPYmo7CisgICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisgICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHF1ZXVlRmFtaWx5SW5kaWNlcworICAgIGlmIChwUGFja2V0LT5wQ3JlYXRlSW5mbykKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGxheUlkeDsKKyAgICAgICAgICAgIGlmIChwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyAmJgorICAgICAgICAgICAgICAgIGdldFF1ZXVlRmFtaWx5SWR4KHBQYWNrZXQtPmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1hcHBlZERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbGF5SWR4KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopJnBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzW2ldKSA9IHJlcGxheUlkeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigidmtDcmVhdGVJbWFnZSBmYWlsZWQsIGJhZCBxdWV1ZUZhbWlseUluZGV4Iik7CisgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVJbWFnZShyZW1hcHBlZERldmljZSwgcFBhY2tldC0+cENyZWF0ZUluZm8sIE5VTEwsICZsb2NhbF9pbWFnZU9iai5yZXBsYXlJbWFnZSk7CisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgdHJhY2VJbWFnZVRvRGV2aWNlWypwUGFja2V0LT5wSW1hZ2VdID0gcFBhY2tldC0+ZGV2aWNlOworICAgICAgICByZXBsYXlJbWFnZVRvRGV2aWNlW2xvY2FsX2ltYWdlT2JqLnJlcGxheUltYWdlXSA9IHJlbWFwcGVkRGV2aWNlOworICAgICAgICBtX29iak1hcHBlci5hZGRfdG9faW1hZ2VzX21hcCgqKHBQYWNrZXQtPnBJbWFnZSksIGxvY2FsX2ltYWdlT2JqKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZUNvbW1hbmRQb29sKHBhY2tldF92a0NyZWF0ZUNvbW1hbmRQb29sKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICBWa0NvbW1hbmRQb29sIGxvY2FsX3BDb21tYW5kUG9vbDsKKyAgICBWa0RldmljZSByZW1hcHBlZGRldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2RldmljZXMocFBhY2tldC0+ZGV2aWNlKTsKKyAgICBpZiAocFBhY2tldC0+ZGV2aWNlICE9IFZLX05VTExfSEFORExFICYmIHJlbWFwcGVkZGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICAvLyBObyBuZWVkIHRvIHJlbWFwIHBBbGxvY2F0b3IKKworICAgIC8vIENvbnZlcnQgcXVldWVGYW1pbHlJbmRleAorICAgIGlmIChwUGFja2V0LT5wQ3JlYXRlSW5mbykKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJlcGxheUlkeDsKKyAgICAgICAgaWYgKGdldFF1ZXVlRmFtaWx5SWR4KHBQYWNrZXQtPmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFwcGVkZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbGF5SWR4KSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyX3QqKSZwUGFja2V0LT5wQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleCkgPSByZXBsYXlJZHg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJ2a0NyZWF0ZUNvbW1hbmRQb29sIGZhaWxlZCwgYmFkIHF1ZXVlRmFtaWx5SW5kZXgiKTsKKyAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlQ29tbWFuZFBvb2wocmVtYXBwZWRkZXZpY2UsIHBQYWNrZXQtPnBDcmVhdGVJbmZvLCBwUGFja2V0LT5wQWxsb2NhdG9yLCAmbG9jYWxfcENvbW1hbmRQb29sKTsKKyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBtX29iak1hcHBlci5hZGRfdG9fY29tbWFuZHBvb2xzX21hcCgqKHBQYWNrZXQtPnBDb21tYW5kUG9vbCksIGxvY2FsX3BDb21tYW5kUG9vbCk7CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhwYWNrZXRfdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIGlmICghbV9kaXNwbGF5LT5tX2luaXRlZFZLKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgZGV2aWNlQ291bnQgPSAqKHBQYWNrZXQtPnBQaHlzaWNhbERldmljZUNvdW50KTsKKyAgICAgICAgVmtQaHlzaWNhbERldmljZSAqcERldmljZXMgPSBwUGFja2V0LT5wUGh5c2ljYWxEZXZpY2VzOworCisgICAgICAgIFZrSW5zdGFuY2UgcmVtYXBwZWRJbnN0YW5jZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2luc3RhbmNlcyhwUGFja2V0LT5pbnN0YW5jZSk7CisgICAgICAgIGlmIChyZW1hcHBlZEluc3RhbmNlID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrSW5zdGFuY2UuIik7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICB9CisgICAgICAgIGlmIChwUGFja2V0LT5wUGh5c2ljYWxEZXZpY2VzICE9IE5VTEwpCisgICAgICAgICAgICBwRGV2aWNlcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrUGh5c2ljYWxEZXZpY2UsIGRldmljZUNvdW50KTsKKyAgICAgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMocmVtYXBwZWRJbnN0YW5jZSwgJmRldmljZUNvdW50LCBwRGV2aWNlcyk7CisKKyAgICAgICAgLy9UT0RPIGhhbmRsZSBkaWZmZXJlbnQgbnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMgaW4gdHJhY2UgdmVyc3VzIHJlcGxheQorICAgICAgICBpZiAoZGV2aWNlQ291bnQgIT0gKihwUGFja2V0LT5wUGh5c2ljYWxEZXZpY2VDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygiTnVtYmVyIG9mIHBoeXNpY2FsIGRldmljZXMgbWlzbWF0Y2hlZCBpbiByZXBsYXkgJXUgdmVyc3VzIHRyYWNlICV1LiIsIGRldmljZUNvdW50LCAqKHBQYWNrZXQtPnBQaHlzaWNhbERldmljZUNvdW50KSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGV2aWNlQ291bnQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzIG51bWJlciBvZiBncHVzIGlzIHplcm8uIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocERldmljZXMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJFbnVtZXJhdGVkICVkIHBoeXNpY2FsIGRldmljZXMgaW4gdGhlIHN5c3RlbS4iLCBkZXZpY2VDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyBoYW5kbGUgZW51bWVyYXRpb24gcmVzdWx0cyBpbiBhIGRpZmZlcmVudCBvcmRlciBmcm9tIHRyYWNlIHRvIHJlcGxheQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZGV2aWNlQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBEZXZpY2VzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX3BoeXNpY2FsZGV2aWNlc19tYXAocFBhY2tldC0+cFBoeXNpY2FsRGV2aWNlc1tpXSwgcERldmljZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBEZXZpY2VzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworLy8gVE9ETzEzOCA6IFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiByZW5hbWVkL2NoYW5nZWQgaW4gdjEzOCwgbmVlZCB0byBzY3J1YiB0aGVtIGFuZCB1cGRhdGUgYXMgYXBwcm9wcmlhdGUKKy8vVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlSW5mbyhwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZUluZm8qIHBQYWNrZXQpCisvL3sKKy8vICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vCisvLyAgICBpZiAoIW1fZGlzcGxheS0+bV9pbml0ZWRWSykKKy8vICAgIHsKKy8vICAgICAgICBWa1BoeXNpY2FsRGV2aWNlIHJlbWFwcGVkUGh5c2ljYWxEZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcChwUGFja2V0LT5waHlzaWNhbERldmljZSk7CisvLyAgICAgICAgaWYgKHJlbWFwcGVkUGh5c2ljYWxEZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpCisvLyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisvLworLy8gICAgICAgIHN3aXRjaCAocFBhY2tldC0+aW5mb1R5cGUpIHsKKy8vICAgICAgICBjYXNlIFZLX1BIWVNJQ0FMX0RFVklDRV9JTkZPX1RZUEVfUFJPUEVSVElFUzoKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIGRldmljZVByb3BzOworLy8gICAgICAgICAgICBzaXplX3QgZGF0YVNpemUgPSBzaXplb2YoVmtQaHlzaWNhbERldmljZVByb3BlcnRpZXMpOworLy8gICAgICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlSW5mbyhyZW1hcHBlZFBoeXNpY2FsRGV2aWNlLCBwUGFja2V0LT5pbmZvVHlwZSwgJmRhdGFTaXplLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQYWNrZXQtPnBEYXRhID09IE5VTEwpID8gTlVMTCA6ICZkZXZpY2VQcm9wcyk7CisvLyAgICAgICAgICAgIGlmIChwUGFja2V0LT5wRGF0YSAhPSBOVUxMKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIlJlcGxheSBQaHlzaWNhbCBEZXZpY2UgUHJvcGVydGllcyIpOworLy8gICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJWZW5kb3IgSUQgJXgsIERldmljZSBJRCAleCwgbmFtZSAlcyIsIGRldmljZVByb3BzLnZlbmRvcklkLCBkZXZpY2VQcm9wcy5kZXZpY2VJZCwgZGV2aWNlUHJvcHMuZGV2aWNlTmFtZSk7CisvLyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIkFQSSB2ZXJzaW9uICV1LCBEcml2ZXIgdmVyc2lvbiAldSwgZ3B1IFR5cGUgJXUiLCBkZXZpY2VQcm9wcy5hcGlWZXJzaW9uLCBkZXZpY2VQcm9wcy5kcml2ZXJWZXJzaW9uLCBkZXZpY2VQcm9wcy5kZXZpY2VUeXBlKTsKKy8vICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiTWF4IERlc2NyaXB0b3IgU2V0czogJXUiLCBkZXZpY2VQcm9wcy5tYXhEZXNjcmlwdG9yU2V0cyk7CisvLyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIk1heCBCb3VuZCBEZXNjcmlwdG9yIFNldHM6ICV1IiwgZGV2aWNlUHJvcHMubWF4Qm91bmREZXNjcmlwdG9yU2V0cyk7CisvLyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIk1heCBUaHJlYWQgR3JvdXAgU2l6ZTogJXUiLCBkZXZpY2VQcm9wcy5tYXhUaHJlYWRHcm91cFNpemUpOworLy8gICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJNYXggQ29sb3IgQXR0YWNobWVudHM6ICV1IiwgZGV2aWNlUHJvcHMubWF4Q29sb3JBdHRhY2htZW50cyk7CisvLyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIk1heCBJbmxpbmUgTWVtb3J5IFVwZGF0ZSBTaXplOiAlbGx1IiwgZGV2aWNlUHJvcHMubWF4SW5saW5lTWVtb3J5VXBkYXRlU2l6ZSk7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgfQorLy8gICAgICAgIGNhc2UgVktfUEhZU0lDQUxfREVWSUNFX0lORk9fVFlQRV9QRVJGT1JNQU5DRToKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZSBkZXZpY2VQZXJmczsKKy8vICAgICAgICAgICAgc2l6ZV90IGRhdGFTaXplID0gc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2VQZXJmb3JtYW5jZSk7CisvLyAgICAgICAgICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrR2V0UGh5c2ljYWxEZXZpY2VJbmZvKHJlbWFwcGVkUGh5c2ljYWxEZXZpY2UsIHBQYWNrZXQtPmluZm9UeXBlLCAmZGF0YVNpemUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBhY2tldC0+cERhdGEgPT0gTlVMTCkgPyBOVUxMIDogJmRldmljZVBlcmZzKTsKKy8vICAgICAgICAgICAgaWYgKHBQYWNrZXQtPnBEYXRhICE9IE5VTEwpCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiUmVwbGF5IFBoeXNpY2FsIERldmljZSBQZXJmb3JtYW5jZSIpOworLy8gICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJNYXggZGV2aWNlIGNsb2NrICVmLCBtYXggc2hhZGVyIEFMVXMvY2xvY2sgJWYsIG1heCB0ZXhlbCBmZXRjaGVzL2Nsb2NrICVmIiwgZGV2aWNlUGVyZnMubWF4RGV2aWNlQ2xvY2ssIGRldmljZVBlcmZzLmFsdVBlckNsb2NrLCBkZXZpY2VQZXJmcy50ZXhQZXJDbG9jayk7CisvLyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIk1heCBwcmltaXRpdmVzL2Nsb2NrICVmLCBNYXggcGl4ZWxzL2Nsb2NrICVmIixkZXZpY2VQZXJmcy5wcmltc1BlckNsb2NrLCBkZXZpY2VQZXJmcy5waXhlbHNQZXJDbG9jayk7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgfQorLy8gICAgICAgIGNhc2UgVktfUEhZU0lDQUxfREVWSUNFX0lORk9fVFlQRV9RVUVVRV9QUk9QRVJUSUVTOgorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgVmtQaHlzaWNhbERldmljZVF1ZXVlUHJvcGVydGllcyAqcEdwdVF1ZXVlLCAqcFE7CisvLyAgICAgICAgICAgIHNpemVfdCBkYXRhU2l6ZSA9IHNpemVvZihWa1BoeXNpY2FsRGV2aWNlUXVldWVQcm9wZXJ0aWVzKTsKKy8vICAgICAgICAgICAgc2l6ZV90IG51bVF1ZXVlcyA9IDE7CisvLyAgICAgICAgICAgIGFzc2VydChwUGFja2V0LT5wRGF0YVNpemUpOworLy8gICAgICAgICAgICBpZiAoKCoocFBhY2tldC0+cERhdGFTaXplKSAlIGRhdGFTaXplKSAhPSAwKQorLy8gICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW5mbygpIGZvciBRVUVVRV9QUk9QRVJUSUVTIG5vdCBhbiBpbnRlZ3JhbCBkYXRhIHNpemUgYXNzdW1pbmcgMSIpOworLy8gICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgICAgICBudW1RdWV1ZXMgPSAqKHBQYWNrZXQtPnBEYXRhU2l6ZSkgLyBkYXRhU2l6ZTsKKy8vICAgICAgICAgICAgZGF0YVNpemUgPSBudW1RdWV1ZXMgKiBkYXRhU2l6ZTsKKy8vICAgICAgICAgICAgcFEgPSBzdGF0aWNfY2FzdCA8IFZrUGh5c2ljYWxEZXZpY2VRdWV1ZVByb3BlcnRpZXMgKj4gKHZrdHJhY2VfbWFsbG9jKGRhdGFTaXplKSk7CisvLyAgICAgICAgICAgIHBHcHVRdWV1ZSA9IHBROworLy8gICAgICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlSW5mbyhyZW1hcHBlZFBoeXNpY2FsRGV2aWNlLCBwUGFja2V0LT5pbmZvVHlwZSwgJmRhdGFTaXplLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQYWNrZXQtPnBEYXRhID09IE5VTEwpID8gTlVMTCA6IHBHcHVRdWV1ZSk7CisvLyAgICAgICAgICAgIGlmIChwUGFja2V0LT5wRGF0YSAhPSBOVUxMKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bVF1ZXVlczsgaSsrKQorLy8gICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiUmVwbGF5IFBoeXNpY2FsIERldmljZSBRdWV1ZSBQcm9wZXJ0eSBmb3IgaW5kZXggJWQsIGZsYWdzICV1LiIsIGksIHBHcHVRdWV1ZS0+cXVldWVGbGFncyk7CisvLyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJNYXggYXZhaWxhYmxlIGNvdW50ICV1LCBtYXggYXRvbWljIGNvdW50ZXJzICV1LCBzdXBwb3J0cyB0aW1lc3RhbXBzICV1LiIscEdwdVF1ZXVlLT5xdWV1ZUNvdW50LCBwR3B1UXVldWUtPm1heEF0b21pY0NvdW50ZXJzLCBwR3B1UXVldWUtPnN1cHBvcnRzVGltZXN0YW1wcyk7CisvLyAgICAgICAgICAgICAgICAgICAgcEdwdVF1ZXVlKys7CisvLyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgdmt0cmFjZV9mcmVlKHBRKTsKKy8vICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgfQorLy8gICAgICAgIGRlZmF1bHQ6CisvLyAgICAgICAgeworLy8gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisvLyAgICAgICAgICAgIHZvaWQqIHBEYXRhID0gTlVMTDsKKy8vICAgICAgICAgICAgaWYgKHBQYWNrZXQtPnBEYXRhICE9IE5VTEwgJiYgcFBhY2tldC0+cERhdGFTaXplICE9IE5VTEwpCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHNpemUgPSAqcFBhY2tldC0+cERhdGFTaXplOworLy8gICAgICAgICAgICAgICAgcERhdGEgPSB2a3RyYWNlX21hbGxvYygqcFBhY2tldC0+cERhdGFTaXplKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlSW5mbyhyZW1hcHBlZFBoeXNpY2FsRGV2aWNlLCBwUGFja2V0LT5pbmZvVHlwZSwgJnNpemUsIHBEYXRhKTsKKy8vICAgICAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorLy8gICAgICAgICAgICB7CisvLy8qICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBXZSBjb3VsZCBwdWxsIHRoaXMgb3V0IGludG8gaXRzIG93biBjYXNlIG9mIHN3aXRjaCwgYW5kIGFsc28gbWF5IHdhbnQgdG8gcGVyZm9ybSBzb21lCisvLy8vICAgICAgICAgICAgICAgIC8vICAgdmFsaWRhdGlvbiBiZXR3ZWVuIHRoZSB0cmFjZSB2YWx1ZXMgYW5kIHJlcGxheSB2YWx1ZXMKKy8vICAgICAgICAgICAgICAgIGVsc2UqLyBpZiAoc2l6ZSAhPSAqcFBhY2tldC0+cERhdGFTaXplICYmIHBEYXRhICE9IE5VTEwpCisvLyAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJ2a0dldFBoeXNpY2FsRGV2aWNlSW5mbyByZXR1cm5lZCBhIGRpZmZlcmluZyBkYXRhIHNpemU6IHJlcGxheSAoJWQgYnl0ZXMpIHZzIHRyYWNlICglZCBieXRlcykiLCBzaXplLCAqcFBhY2tldC0+cERhdGFTaXplKTsKKy8vICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBEYXRhICE9IE5VTEwgJiYgbWVtY21wKHBEYXRhLCBwUGFja2V0LT5wRGF0YSwgc2l6ZSkgIT0gMCkKKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoInZrR2V0UGh5c2ljYWxEZXZpY2VJbmZvIHJldHVybmVkIGRpZmZlcmluZyBkYXRhIGNvbnRlbnRzIHRoYW4gdGhlIHRyYWNlIGZpbGUgY29udGFpbmVkLiIpOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICB9CisvLyAgICAgICAgICAgIHZrdHJhY2VfZnJlZShwRGF0YSk7CisvLyAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgIH0KKy8vICAgICAgICB9OworLy8gICAgfQorLy8gICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKKy8vfQorCisvL1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtHZXRHbG9iYWxFeHRlbnNpb25JbmZvKHBhY2tldF92a0dldEdsb2JhbEV4dGVuc2lvbkluZm8qIHBQYWNrZXQpCisvL3sKKy8vICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vCisvLyAgICBpZiAoIW1fZGlzcGxheS0+bV9pbml0ZWRWSykgeworLy8gICAgICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrR2V0R2xvYmFsRXh0ZW5zaW9uSW5mbyhwUGFja2V0LT5pbmZvVHlwZSwgcFBhY2tldC0+ZXh0ZW5zaW9uSW5kZXgsIHBQYWNrZXQtPnBEYXRhU2l6ZSwgcFBhY2tldC0+cERhdGEpOworLy8vLyBUT0RPOiBDb25maXJtIHRoYXQgcmVwbGF5J2QgcHJvcGVydGllcyBtYXRjaCB3aXRoIHRyYWNlZCBwcm9wZXJ0aWVzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5LgorLy8vLyAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisvLy8vICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgZXh0ID0gMDsgZXh0IDwgc2l6ZW9mKGdfZXh0ZW5zaW9ucykgLyBzaXplb2YoZ19leHRlbnNpb25zWzBdKTsgZXh0KyspCisvLy8vICAgICAgICAgICAgeworLy8vLyAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoZ19leHRlbnNpb25zW2V4dF0sIHBQYWNrZXQtPnBFeHROYW1lLCBzdHJsZW4oZ19leHRlbnNpb25zW2V4dF0pKSkgeworLy8vLyAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRJbkxpc3QgPSBmYWxzZTsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGogPSAwOyBqIDwgbV9kaXNwbGF5LT5tX2V4dGVuc2lvbnMuc2l6ZSgpOyArK2opIHsKKy8vLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAobV9kaXNwbGF5LT5tX2V4dGVuc2lvbnNbal0sIGdfZXh0ZW5zaW9uc1tleHRdLCBzdHJsZW4oZ19leHRlbnNpb25zW2V4dF0pKSkKKy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0SW5MaXN0ID0gdHJ1ZTsKKy8vLy8gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKy8vLy8gICAgICAgICAgICAgICAgICAgIH0KKy8vLy8gICAgICAgICAgICAgICAgICAgIGlmICghZXh0SW5MaXN0KQorLy8vLyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGlzcGxheS0+bV9leHRlbnNpb25zLnB1c2hfYmFjaygoY2hhciAqKSBnX2V4dGVuc2lvbnNbZXh0XSk7CisvLy8vICAgICAgICAgICAgICAgICAgICBicmVhazsKKy8vLy8gICAgICAgICAgICAgICAgfQorLy8vLyAgICAgICAgICAgIH0KKy8vLy8gICAgICAgIH0KKy8vICAgIH0KKy8vICAgIHJldHVybiByZXBsYXlSZXN1bHQ7CisvL30KKworLy9Wa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmZvKHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5mbyogcFBhY2tldCkKKy8veworLy8gICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworLy8KKy8vICAgIGlmICghbV9kaXNwbGF5LT5tX2luaXRlZFZLKSB7CisvLyAgICAgICAgVmtQaHlzaWNhbERldmljZSByZW1hcHBlZFBoeXNpY2FsRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXAocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UpOworLy8gICAgICAgIGlmIChyZW1hcHBlZFBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKQorLy8gICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworLy8KKy8vICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlRXh0ZW5zaW9uSW5mbyhyZW1hcHBlZFBoeXNpY2FsRGV2aWNlLCBwUGFja2V0LT5pbmZvVHlwZSwgcFBhY2tldC0+ZXh0ZW5zaW9uSW5kZXgsIHBQYWNrZXQtPnBEYXRhU2l6ZSwgcFBhY2tldC0+cERhdGEpOworLy8vLyBUT0RPOiBDb25maXJtIHRoYXQgcmVwbGF5J2QgcHJvcGVydGllcyBtYXRjaCB3aXRoIHRyYWNlZCBwcm9wZXJ0aWVzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5LgorLy8vLyAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisvLy8vICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgZXh0ID0gMDsgZXh0IDwgc2l6ZW9mKGdfZXh0ZW5zaW9ucykgLyBzaXplb2YoZ19leHRlbnNpb25zWzBdKTsgZXh0KyspCisvLy8vICAgICAgICAgICAgeworLy8vLyAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoZ19leHRlbnNpb25zW2V4dF0sIHBQYWNrZXQtPnBFeHROYW1lLCBzdHJsZW4oZ19leHRlbnNpb25zW2V4dF0pKSkgeworLy8vLyAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRJbkxpc3QgPSBmYWxzZTsKKy8vLy8gICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGogPSAwOyBqIDwgbV9kaXNwbGF5LT5tX2V4dGVuc2lvbnMuc2l6ZSgpOyArK2opIHsKKy8vLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAobV9kaXNwbGF5LT5tX2V4dGVuc2lvbnNbal0sIGdfZXh0ZW5zaW9uc1tleHRdLCBzdHJsZW4oZ19leHRlbnNpb25zW2V4dF0pKSkKKy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0SW5MaXN0ID0gdHJ1ZTsKKy8vLy8gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKy8vLy8gICAgICAgICAgICAgICAgICAgIH0KKy8vLy8gICAgICAgICAgICAgICAgICAgIGlmICghZXh0SW5MaXN0KQorLy8vLyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGlzcGxheS0+bV9leHRlbnNpb25zLnB1c2hfYmFjaygoY2hhciAqKSBnX2V4dGVuc2lvbnNbZXh0XSk7CisvLy8vICAgICAgICAgICAgICAgICAgICBicmVhazsKKy8vLy8gICAgICAgICAgICAgICAgfQorLy8vLyAgICAgICAgICAgIH0KKy8vLy8gICAgICAgIH0KKy8vICAgIH0KKy8vICAgIHJldHVybiByZXBsYXlSZXN1bHQ7CisvL30KKworLy9Wa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrR2V0U3dhcGNoYWluSW5mb1dTSShwYWNrZXRfdmtHZXRTd2FwY2hhaW5JbmZvV1NJKiBwUGFja2V0KQorLy97CisvLyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisvLworLy8gICAgc2l6ZV90IGRhdGFTaXplID0gKnBQYWNrZXQtPnBEYXRhU2l6ZTsKKy8vICAgIHZvaWQqIHBEYXRhID0gdmt0cmFjZV9tYWxsb2MoZGF0YVNpemUpOworLy8gICAgVmtTd2FwY2hhaW5XU0kgcmVtYXBwZWRTd2FwY2hhaW4gPSBtX29iak1hcHBlci5yZW1hcF9zd2FwY2hhaW53c2lzKHBQYWNrZXQtPnN3YXBjaGFpbik7CisvLyAgICBpZiAocmVtYXBwZWRTd2FwY2hhaW4gPT0gVktfTlVMTF9IQU5ETEUpCisvLyAgICB7CisvLyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtHZXRTd2FwY2hhaW5JbmZvV1NJKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtTd2FwY2hhaW5XU0kuIik7CisvLyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vICAgIH0KKy8vICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrR2V0U3dhcGNoYWluSW5mb1dTSShyZW1hcHBlZFN3YXBjaGFpbiwgcFBhY2tldC0+aW5mb1R5cGUsICZkYXRhU2l6ZSwgcERhdGEpOworLy8gICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorLy8gICAgeworLy8gICAgICAgIGlmIChkYXRhU2l6ZSAhPSAqcFBhY2tldC0+cERhdGFTaXplKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJTd2FwY2hhaW5JbmZvIGRhdGFTaXplIGRpZmZlcnMgYmV0d2VlbiB0cmFjZSAoJWQgYnl0ZXMpIGFuZCByZXBsYXkgKCVkIGJ5dGVzKSIsICpwUGFja2V0LT5wRGF0YVNpemUsIGRhdGFTaXplKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgaWYgKHBQYWNrZXQtPmluZm9UeXBlID09IFZLX1NXQVBfQ0hBSU5fSU5GT19UWVBFX0lNQUdFU19XU0kpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBWa1N3YXBjaGFpbkltYWdlSW5mb1dTSSogcEltYWdlSW5mb1JlcGxheSA9IChWa1N3YXBjaGFpbkltYWdlSW5mb1dTSSopcERhdGE7CisvLyAgICAgICAgICAgIFZrU3dhcGNoYWluSW1hZ2VJbmZvV1NJKiBwSW1hZ2VJbmZvVHJhY2UgPSAoVmtTd2FwY2hhaW5JbWFnZUluZm9XU0kqKXBQYWNrZXQtPnBEYXRhOworLy8gICAgICAgICAgICBzaXplX3QgaW1hZ2VDb3VudFJlcGxheSA9IGRhdGFTaXplIC8gc2l6ZW9mKFZrU3dhcGNoYWluSW1hZ2VJbmZvV1NJKTsKKy8vICAgICAgICAgICAgc2l6ZV90IGltYWdlQ291bnRUcmFjZSA9ICpwUGFja2V0LT5wRGF0YVNpemUgLyBzaXplb2YoVmtTd2FwY2hhaW5JbWFnZUluZm9XU0kpOworLy8gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltYWdlQ291bnRSZXBsYXkgJiYgaSA8IGltYWdlQ291bnRUcmFjZTsgaSsrKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpbWFnZU9iaiBpbWdPYmo7CisvLyAgICAgICAgICAgICAgICBpbWdPYmoucmVwbGF5SW1hZ2UgPSBwSW1hZ2VJbmZvUmVwbGF5W2ldLmltYWdlOworLy8gICAgICAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX21hcCgmcEltYWdlSW5mb1RyYWNlW2ldLmltYWdlLCAmaW1nT2JqKTsKKy8vCisvLyAgICAgICAgICAgICAgICBncHVNZW1PYmogbWVtT2JqOworLy8gICAgICAgICAgICAgICAgbWVtT2JqLnJlcGxheUdwdU1lbSA9IHBJbWFnZUluZm9SZXBsYXlbaV0ubWVtb3J5OworLy8gICAgICAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX21hcCgmcEltYWdlSW5mb1RyYWNlW2ldLm1lbW9yeSwgJm1lbU9iaik7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICB9CisvLyAgICB9CisvLyAgICB2a3RyYWNlX2ZyZWUocERhdGEpOworLy8gICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKKy8vfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrUXVldWVTdWJtaXQocGFja2V0X3ZrUXVldWVTdWJtaXQqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtRdWV1ZSByZW1hcHBlZFF1ZXVlID0gbV9vYmpNYXBwZXIucmVtYXBfcXVldWVzKHBQYWNrZXQtPnF1ZXVlKTsKKyAgICBpZiAocmVtYXBwZWRRdWV1ZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrUXVldWVTdWJtaXQoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1F1ZXVlLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrRmVuY2UgcmVtYXBwZWRGZW5jZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2ZlbmNlcyhwUGFja2V0LT5mZW5jZSk7CisgICAgaWYgKHBQYWNrZXQtPmZlbmNlICE9IFZLX05VTExfSEFORExFICYmIHJlbWFwcGVkRmVuY2UgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlU3VibWl0KCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaHlzaWNhbERldmljZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBWa1N1Ym1pdEluZm8gKnJlbWFwcGVkU3VibWl0cyA9IE5VTEw7CisgICAgcmVtYXBwZWRTdWJtaXRzID0gVktUUkFDRV9ORVdfQVJSQVkoIFZrU3VibWl0SW5mbywgcFBhY2tldC0+c3VibWl0Q291bnQpOworICAgIFZrQ29tbWFuZEJ1ZmZlciAqcFJlbWFwcGVkQnVmZmVycyA9IE5VTEw7CisgICAgVmtTZW1hcGhvcmUgKnBSZW1hcHBlZFdhaXRTZW1zID0gTlVMTCwgKnBSZW1hcHBlZFNpZ25hbFNlbXMgPSBOVUxMOworICAgIGZvciAodWludDMyX3Qgc3VibWl0X2lkeCA9IDA7IHN1Ym1pdF9pZHggPCBwUGFja2V0LT5zdWJtaXRDb3VudDsgc3VibWl0X2lkeCsrKSB7CisgICAgICAgIGNvbnN0IFZrU3VibWl0SW5mbyAqc3VibWl0ID0gJnBQYWNrZXQtPnBTdWJtaXRzW3N1Ym1pdF9pZHhdOworICAgICAgICBWa1N1Ym1pdEluZm8gKnJlbWFwcGVkU3VibWl0ID0gJnJlbWFwcGVkU3VibWl0c1tzdWJtaXRfaWR4XTsKKyAgICAgICAgbWVtc2V0KHJlbWFwcGVkU3VibWl0LCAwLCBzaXplb2YoVmtTdWJtaXRJbmZvKSk7CisgICAgICAgIHJlbWFwcGVkU3VibWl0LT5zVHlwZSA9IHN1Ym1pdC0+c1R5cGU7CisgICAgICAgIHJlbWFwcGVkU3VibWl0LT5wTmV4dCA9IHN1Ym1pdC0+cE5leHQ7CisgICAgICAgIHJlbWFwcGVkU3VibWl0LT5wV2FpdERzdFN0YWdlTWFzayA9IHN1Ym1pdC0+cFdhaXREc3RTdGFnZU1hc2s7CisgICAgICAgIC8vIFJlbWFwIFNlbWFwaG9yZXMgJiBDb21tYW5kQnVmZmVycyBmb3IgdGhpcyBzdWJtaXQKKyAgICAgICAgdWludDMyX3QgaSA9IDA7CisgICAgICAgIGlmIChzdWJtaXQtPnBDb21tYW5kQnVmZmVycyAhPSBOVUxMKSB7CisgICAgICAgICAgICBwUmVtYXBwZWRCdWZmZXJzID0gVktUUkFDRV9ORVdfQVJSQVkoIFZrQ29tbWFuZEJ1ZmZlciwgc3VibWl0LT5jb21tYW5kQnVmZmVyQ291bnQpOworICAgICAgICAgICAgcmVtYXBwZWRTdWJtaXQtPnBDb21tYW5kQnVmZmVycyA9IHBSZW1hcHBlZEJ1ZmZlcnM7CisgICAgICAgICAgICByZW1hcHBlZFN1Ym1pdC0+Y29tbWFuZEJ1ZmZlckNvdW50ID0gc3VibWl0LT5jb21tYW5kQnVmZmVyQ291bnQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VibWl0LT5jb21tYW5kQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICoocFJlbWFwcGVkQnVmZmVycyArIGkpID0gbV9vYmpNYXBwZXIucmVtYXBfY29tbWFuZGJ1ZmZlcnMoKihzdWJtaXQtPnBDb21tYW5kQnVmZmVycyArIGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoKihwUmVtYXBwZWRCdWZmZXJzICsgaSkgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtRdWV1ZVN1Ym1pdCgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrQ29tbWFuZEJ1ZmZlci4iKTsKKyAgICAgICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocmVtYXBwZWRTdWJtaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocFJlbWFwcGVkQnVmZmVycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYXlSZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdWJtaXQtPnBXYWl0U2VtYXBob3JlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBwUmVtYXBwZWRXYWl0U2VtcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrU2VtYXBob3JlLCBzdWJtaXQtPndhaXRTZW1hcGhvcmVDb3VudCk7CisgICAgICAgICAgICByZW1hcHBlZFN1Ym1pdC0+cFdhaXRTZW1hcGhvcmVzID0gcFJlbWFwcGVkV2FpdFNlbXM7CisgICAgICAgICAgICByZW1hcHBlZFN1Ym1pdC0+d2FpdFNlbWFwaG9yZUNvdW50ID0gc3VibWl0LT53YWl0U2VtYXBob3JlQ291bnQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3VibWl0LT53YWl0U2VtYXBob3JlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICgqKHBSZW1hcHBlZFdhaXRTZW1zICsgaSkpID0gbV9vYmpNYXBwZXIucmVtYXBfc2VtYXBob3JlcygoKihzdWJtaXQtPnBXYWl0U2VtYXBob3JlcyArIGkpKSk7CisgICAgICAgICAgICAgICAgaWYgKCoocFJlbWFwcGVkV2FpdFNlbXMgKyBpKSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlU3VibWl0KCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgd2FpdCBWa1NlbWFwaG9yZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocmVtYXBwZWRTdWJtaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocFJlbWFwcGVkQnVmZmVycyk7CisgICAgICAgICAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFdhaXRTZW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1Ym1pdC0+cFNpZ25hbFNlbWFwaG9yZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgcFJlbWFwcGVkU2lnbmFsU2VtcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrU2VtYXBob3JlLCBzdWJtaXQtPnNpZ25hbFNlbWFwaG9yZUNvdW50KTsKKyAgICAgICAgICAgIHJlbWFwcGVkU3VibWl0LT5wU2lnbmFsU2VtYXBob3JlcyA9IHBSZW1hcHBlZFNpZ25hbFNlbXM7CisgICAgICAgICAgICByZW1hcHBlZFN1Ym1pdC0+c2lnbmFsU2VtYXBob3JlQ291bnQgPSBzdWJtaXQtPnNpZ25hbFNlbWFwaG9yZUNvdW50OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Ym1pdC0+c2lnbmFsU2VtYXBob3JlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICgqKHBSZW1hcHBlZFNpZ25hbFNlbXMgKyBpKSkgPSBtX29iak1hcHBlci5yZW1hcF9zZW1hcGhvcmVzKCgqKHN1Ym1pdC0+cFNpZ25hbFNlbWFwaG9yZXMgKyBpKSkpOworICAgICAgICAgICAgICAgIGlmICgqKHBSZW1hcHBlZFNpZ25hbFNlbXMgKyBpKSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlU3VibWl0KCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgc2lnbmFsIFZrU2VtYXBob3JlLiIpOworICAgICAgICAgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShyZW1hcHBlZFN1Ym1pdHMpOworICAgICAgICAgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocFJlbWFwcGVkV2FpdFNlbXMpOworICAgICAgICAgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRTaWduYWxTZW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtRdWV1ZVN1Ym1pdChyZW1hcHBlZFF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+c3VibWl0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1hcHBlZFN1Ym1pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1hcHBlZEZlbmNlKTsKKyAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRCdWZmZXJzKTsKKyAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRXYWl0U2Vtcyk7CisgICAgVktUUkFDRV9ERUxFVEUocFJlbWFwcGVkU2lnbmFsU2Vtcyk7CisgICAgVktUUkFDRV9ERUxFVEUocmVtYXBwZWRTdWJtaXRzKTsKKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrUXVldWVCaW5kU3BhcnNlKHBhY2tldF92a1F1ZXVlQmluZFNwYXJzZSogcFBhY2tldCkKK3sKKyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisKKyAgICBWa1F1ZXVlIHJlbWFwcGVkUXVldWUgPSBtX29iak1hcHBlci5yZW1hcF9xdWV1ZXMocFBhY2tldC0+cXVldWUpOworICAgIGlmIChyZW1hcHBlZFF1ZXVlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtRdWV1ZUJpbmRTcGFyc2UoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1F1ZXVlLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrRmVuY2UgcmVtYXBwZWRGZW5jZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2ZlbmNlcyhwUGFja2V0LT5mZW5jZSk7CisgICAgaWYgKHBQYWNrZXQtPmZlbmNlICE9IFZLX05VTExfSEFORExFICYmIHJlbWFwcGVkRmVuY2UgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlQmluZFNwYXJzZSgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrUGh5c2ljYWxEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtCaW5kU3BhcnNlSW5mbyogcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3MgPSBWS1RSQUNFX05FV19BUlJBWShWa0JpbmRTcGFyc2VJbmZvLCBwUGFja2V0LT5iaW5kSW5mb0NvdW50KTsKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5QmluZCAqcFJlbWFwcGVkSW1hZ2VNZW1vcmllcyA9IE5VTEw7CisgICAgVmtTcGFyc2VNZW1vcnlCaW5kICpwUmVtYXBwZWRCdWZmZXJNZW1vcmllcyA9IE5VTEw7CisgICAgVmtTcGFyc2VNZW1vcnlCaW5kICpwUmVtYXBwZWRJbWFnZU9wYXF1ZU1lbW9yaWVzID0gTlVMTDsKKyAgICBWa1NlbWFwaG9yZSAqcFJlbWFwcGVkV2FpdFNlbXMgPSBOVUxMOworICAgIFZrU2VtYXBob3JlICpwUmVtYXBwZWRTaWduYWxTZW1zID0gTlVMTDsKKyAgICBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qIHNJTUJpbmYgPSBOVUxMOworICAgIFZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8qIHNCTUJpbmYgPSBOVUxMOworICAgIFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyogc0lNT0JpbmYgPSBOVUxMOworCisgICAgbWVtY3B5KCh2b2lkKilyZW1hcHBlZEJpbmRTcGFyc2VJbmZvcywgKHZvaWQqKShwUGFja2V0LT5wQmluZEluZm8pLCBzaXplb2YoVmtCaW5kU3BhcnNlSW5mbykqcFBhY2tldC0+YmluZEluZm9Db3VudCk7CisKKyAgICBmb3IgKHVpbnQzMl90IGJpbmRJbmZvX2lkeCA9IDA7IGJpbmRJbmZvX2lkeCA8IHBQYWNrZXQtPmJpbmRJbmZvQ291bnQ7IGJpbmRJbmZvX2lkeCsrKSB7CisgICAgICAgIGlmIChyZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBCdWZmZXJCaW5kcykKKyAgICAgICAgeworICAgICAgICAgICAgc0JNQmluZiA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8sIHJlbWFwcGVkQmluZFNwYXJzZUluZm9zW2JpbmRJbmZvX2lkeF0uYnVmZmVyQmluZENvdW50KTsKKyAgICAgICAgICAgIHJlbWFwcGVkQmluZFNwYXJzZUluZm9zW2JpbmRJbmZvX2lkeF0ucEJ1ZmZlckJpbmRzID0gKGNvbnN0IFZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8qKSh2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocFBhY2tldC0+aGVhZGVyLCAoaW50cHRyX3QpcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wQnVmZmVyQmluZHMpKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCopc0JNQmluZiwgKHZvaWQqKXJlbWFwcGVkQmluZFNwYXJzZUluZm9zW2JpbmRJbmZvX2lkeF0ucEJ1ZmZlckJpbmRzLCBzaXplb2YoVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbykqcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5idWZmZXJCaW5kQ291bnQpOworCisgICAgICAgICAgICBzQk1CaW5mLT5idWZmZXIgPSBtX29iak1hcHBlci5yZW1hcF9idWZmZXJzKHNCTUJpbmYtPmJ1ZmZlcik7CisKKyAgICAgICAgICAgIGlmIChzQk1CaW5mLT5idWZmZXIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtRdWV1ZUJpbmRTcGFyc2UoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0J1ZmZlci4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzQk1CaW5mLT5iaW5kQ291bnQgPiAwICYmIHNCTUJpbmYtPnBCaW5kcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUmVtYXBwZWRCdWZmZXJNZW1vcmllcyA9IChWa1NwYXJzZU1lbW9yeUJpbmQqKSh2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocFBhY2tldC0+aGVhZGVyLCAoaW50cHRyX3QpcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wQnVmZmVyQmluZHMtPnBCaW5kcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRDb3VudElkeCA9IDA7IGJpbmRDb3VudElkeCA8IHNCTUJpbmYtPmJpbmRDb3VudDsgYmluZENvdW50SWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ3B1TWVtT2JqIGxvY2FsX21lbSA9IG1fb2JqTWFwcGVyLm1fZGV2aWNlbWVtb3J5cy5maW5kKHBSZW1hcHBlZEJ1ZmZlck1lbW9yaWVzW2JpbmRDb3VudElkeF0ubWVtb3J5KS0+c2Vjb25kOworICAgICAgICAgICAgICAgIFZrRGV2aWNlTWVtb3J5IHJlcGxheV9tZW0gPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VtZW1vcnlzKHBSZW1hcHBlZEJ1ZmZlck1lbW9yaWVzW2JpbmRDb3VudElkeF0ubWVtb3J5KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXBsYXlfbWVtID09IFZLX05VTExfSEFORExFIHx8IGxvY2FsX21lbS5wR3B1TWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlQmluZFNwYXJzZSgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlTWVtb3J5LiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBSZW1hcHBlZEJ1ZmZlck1lbW9yaWVzW2JpbmRDb3VudElkeF0ubWVtb3J5ID0gcmVwbGF5X21lbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNCTUJpbmYtPnBCaW5kcyA9IHBSZW1hcHBlZEJ1ZmZlck1lbW9yaWVzOworICAgICAgICAgICAgcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wQnVmZmVyQmluZHMgPSBzQk1CaW5mOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbWFwcGVkQmluZFNwYXJzZUluZm9zW2JpbmRJbmZvX2lkeF0ucEltYWdlQmluZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNJTUJpbmYgPSBWS1RSQUNFX05FV19BUlJBWShWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8sIHJlbWFwcGVkQmluZFNwYXJzZUluZm9zW2JpbmRJbmZvX2lkeF0uaW1hZ2VCaW5kQ291bnQpOworICAgICAgICAgICAgcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wSW1hZ2VCaW5kcyA9IChjb25zdCBWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8qKSh2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocFBhY2tldC0+aGVhZGVyLCAoaW50cHRyX3QpcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wSW1hZ2VCaW5kcykpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkKilzSU1CaW5mLCAodm9pZCopcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wSW1hZ2VCaW5kcywgc2l6ZW9mKFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbykqcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5pbWFnZUJpbmRDb3VudCk7CisKKyAgICAgICAgICAgIHNJTUJpbmYtPmltYWdlID0gbV9vYmpNYXBwZXIucmVtYXBfaW1hZ2VzKHNJTUJpbmYtPmltYWdlKTsKKworICAgICAgICAgICAgaWYoc0lNQmluZi0+aW1hZ2UgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtRdWV1ZUJpbmRTcGFyc2UoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0ltYWdlLiIpOworICAgICAgICAgICAgICAgIGdvdG8gRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNJTUJpbmYtPmJpbmRDb3VudCA+IDAgJiYgc0lNQmluZi0+cEJpbmRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBSZW1hcHBlZEltYWdlTWVtb3JpZXMgPSAoVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmQqKSh2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocFBhY2tldC0+aGVhZGVyLCAoaW50cHRyX3QpcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wSW1hZ2VCaW5kcy0+cEJpbmRzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGJpbmRDb3VudElkeCA9IDA7IGJpbmRDb3VudElkeCA8IHNJTUJpbmYtPmJpbmRDb3VudDsgYmluZENvdW50SWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ3B1TWVtT2JqIGxvY2FsX21lbSA9IG1fb2JqTWFwcGVyLm1fZGV2aWNlbWVtb3J5cy5maW5kKHBSZW1hcHBlZEltYWdlTWVtb3JpZXNbYmluZENvdW50SWR4XS5tZW1vcnkpLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgVmtEZXZpY2VNZW1vcnkgcmVwbGF5X21lbSA9IG1fb2JqTWFwcGVyLnJlbWFwX2RldmljZW1lbW9yeXMocFJlbWFwcGVkSW1hZ2VNZW1vcmllc1tiaW5kQ291bnRJZHhdLm1lbW9yeSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVwbGF5X21lbSA9PSBWS19OVUxMX0hBTkRMRSB8fCBsb2NhbF9tZW0ucEdwdU1lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtRdWV1ZUJpbmRTcGFyc2UoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0RldmljZU1lbW9yeS4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwUmVtYXBwZWRJbWFnZU1lbW9yaWVzW2JpbmRDb3VudElkeF0ubWVtb3J5ID0gcmVwbGF5X21lbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNJTUJpbmYtPnBCaW5kcyA9IHBSZW1hcHBlZEltYWdlTWVtb3JpZXM7CisgICAgICAgICAgICByZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBJbWFnZUJpbmRzID0gc0lNQmluZjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBJbWFnZU9wYXF1ZUJpbmRzKQorICAgICAgICB7CisgICAgICAgICAgICBzSU1PQmluZiA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbywgcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5pbWFnZU9wYXF1ZUJpbmRDb3VudCk7CisgICAgICAgICAgICByZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBJbWFnZU9wYXF1ZUJpbmRzID0gKGNvbnN0IFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyopKHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwUGFja2V0LT5oZWFkZXIsIChpbnRwdHJfdClyZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBJbWFnZU9wYXF1ZUJpbmRzKSk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQqKXNJTU9CaW5mLCAodm9pZCopcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wSW1hZ2VPcGFxdWVCaW5kcywgc2l6ZW9mKFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbykqcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5pbWFnZU9wYXF1ZUJpbmRDb3VudCk7CisKKyAgICAgICAgICAgIHNJTU9CaW5mLT5pbWFnZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2ltYWdlcyhzSU1PQmluZi0+aW1hZ2UpOworCisgICAgICAgICAgICBpZiAoc0lNT0JpbmYtPmltYWdlID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrUXVldWVCaW5kU3BhcnNlKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtJbWFnZS4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzSU1PQmluZi0+YmluZENvdW50ID4gMCAmJiBzSU1PQmluZi0+cEJpbmRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBSZW1hcHBlZEltYWdlT3BhcXVlTWVtb3JpZXMgPSAoVmtTcGFyc2VNZW1vcnlCaW5kKikodmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBQYWNrZXQtPmhlYWRlciwgKGludHB0cl90KXJlbWFwcGVkQmluZFNwYXJzZUluZm9zW2JpbmRJbmZvX2lkeF0ucEltYWdlT3BhcXVlQmluZHMtPnBCaW5kcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh1aW50MzJfdCBiaW5kQ291bnRJZHggPSAwOyBiaW5kQ291bnRJZHggPCBzSU1PQmluZi0+YmluZENvdW50OyBiaW5kQ291bnRJZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBncHVNZW1PYmogbG9jYWxfbWVtID0gbV9vYmpNYXBwZXIubV9kZXZpY2VtZW1vcnlzLmZpbmQocFJlbWFwcGVkSW1hZ2VPcGFxdWVNZW1vcmllc1tiaW5kQ291bnRJZHhdLm1lbW9yeSktPnNlY29uZDsKKyAgICAgICAgICAgICAgICBWa0RldmljZU1lbW9yeSByZXBsYXlfbWVtID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlbWVtb3J5cyhwUmVtYXBwZWRJbWFnZU9wYXF1ZU1lbW9yaWVzW2JpbmRDb3VudElkeF0ubWVtb3J5KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXBsYXlfbWVtID09IFZLX05VTExfSEFORExFIHx8IGxvY2FsX21lbS5wR3B1TWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlQmluZFNwYXJzZSgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlTWVtb3J5LiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBSZW1hcHBlZEltYWdlT3BhcXVlTWVtb3JpZXNbYmluZENvdW50SWR4XS5tZW1vcnkgPSByZXBsYXlfbWVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc0lNT0JpbmYtPnBCaW5kcyA9IHBSZW1hcHBlZEltYWdlT3BhcXVlTWVtb3JpZXM7CisgICAgICAgICAgICByZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBJbWFnZU9wYXF1ZUJpbmRzID0gc0lNT0JpbmY7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wV2FpdFNlbWFwaG9yZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgcFJlbWFwcGVkV2FpdFNlbXMgPSBWS1RSQUNFX05FV19BUlJBWShWa1NlbWFwaG9yZSwgcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS53YWl0U2VtYXBob3JlQ291bnQpOworICAgICAgICAgICAgcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5wV2FpdFNlbWFwaG9yZXMgPSBwUmVtYXBwZWRXYWl0U2VtczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLndhaXRTZW1hcGhvcmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgKCoocFJlbWFwcGVkV2FpdFNlbXMgKyBpKSkgPSBtX29iak1hcHBlci5yZW1hcF9zZW1hcGhvcmVzKCgqKHJlbWFwcGVkQmluZFNwYXJzZUluZm9zW2JpbmRJbmZvX2lkeF0ucFdhaXRTZW1hcGhvcmVzICsgaSkpKTsKKyAgICAgICAgICAgICAgICBpZiAoKihwUmVtYXBwZWRXYWl0U2VtcyArIGkpID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrUXVldWVTdWJtaXQoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCB3YWl0IFZrU2VtYXBob3JlLiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBTaWduYWxTZW1hcGhvcmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBSZW1hcHBlZFNpZ25hbFNlbXMgPSBWS1RSQUNFX05FV19BUlJBWShWa1NlbWFwaG9yZSwgcmVtYXBwZWRCaW5kU3BhcnNlSW5mb3NbYmluZEluZm9faWR4XS5zaWduYWxTZW1hcGhvcmVDb3VudCk7CisgICAgICAgICAgICByZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBTaWduYWxTZW1hcGhvcmVzID0gcFJlbWFwcGVkU2lnbmFsU2VtczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnNpZ25hbFNlbWFwaG9yZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAoKihwUmVtYXBwZWRTaWduYWxTZW1zICsgaSkpID0gbV9vYmpNYXBwZXIucmVtYXBfc2VtYXBob3JlcygoKihyZW1hcHBlZEJpbmRTcGFyc2VJbmZvc1tiaW5kSW5mb19pZHhdLnBTaWduYWxTZW1hcGhvcmVzICsgaSkpKTsKKyAgICAgICAgICAgICAgICBpZiAoKihwUmVtYXBwZWRTaWduYWxTZW1zICsgaSkgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtRdWV1ZVN1Ym1pdCgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIHNpZ25hbCBWa1NlbWFwaG9yZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrUXVldWVCaW5kU3BhcnNlKHJlbWFwcGVkUXVldWUsCisgICAgICAgIHBQYWNrZXQtPmJpbmRJbmZvQ291bnQsCisgICAgICAgIHJlbWFwcGVkQmluZFNwYXJzZUluZm9zLAorICAgICAgICByZW1hcHBlZEZlbmNlKTsKKworRkFJTFVSRToKKyAgICBWS1RSQUNFX0RFTEVURShyZW1hcHBlZEJpbmRTcGFyc2VJbmZvcyk7CisgICAgVktUUkFDRV9ERUxFVEUoc0lNQmluZik7CisgICAgVktUUkFDRV9ERUxFVEUoc0JNQmluZik7CisgICAgVktUUkFDRV9ERUxFVEUoc0lNT0JpbmYpOworICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFNpZ25hbFNlbXMpOworICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFdhaXRTZW1zKTsKKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCisKKy8vVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0dldE9iamVjdEluZm8ocGFja2V0X3ZrR2V0T2JqZWN0SW5mbyogcFBhY2tldCkKKy8veworLy8gICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworLy8KKy8vICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworLy8gICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorLy8gICAgeworLy8gICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0T2JqZWN0SW5mbygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlLiIpOworLy8gICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisvLyAgICB9CisvLworLy8gICAgVmtPYmplY3QgcmVtYXBwZWRPYmplY3QgPSBtX29iak1hcHBlci5yZW1hcChwUGFja2V0LT5vYmplY3QsIHBQYWNrZXQtPm9ialR5cGUpOworLy8gICAgaWYgKHJlbWFwcGVkT2JqZWN0ID09IFZLX05VTExfSEFORExFKQorLy8gICAgeworLy8gICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0T2JqZWN0SW5mbygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrT2JqZWN0LiIpOworLy8gICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisvLyAgICB9CisvLworLy8gICAgc2l6ZV90IHNpemUgPSAwOworLy8gICAgdm9pZCogcERhdGEgPSBOVUxMOworLy8gICAgaWYgKHBQYWNrZXQtPnBEYXRhICE9IE5VTEwgJiYgcFBhY2tldC0+cERhdGFTaXplICE9IE5VTEwpCisvLyAgICB7CisvLyAgICAgICAgc2l6ZSA9ICpwUGFja2V0LT5wRGF0YVNpemU7CisvLyAgICAgICAgcERhdGEgPSB2a3RyYWNlX21hbGxvYygqcFBhY2tldC0+cERhdGFTaXplKTsKKy8vICAgICAgICBtZW1jcHkocERhdGEsIHBQYWNrZXQtPnBEYXRhLCAqcFBhY2tldC0+cERhdGFTaXplKTsKKy8vICAgIH0KKy8vICAgIC8vIFRPRE8gb25seSBzZWFyY2ggZm9yIG9iamVjdCBvbmNlIHJhdGhlciB0aGFuIGF0IHJlbWFwKCkgYW5kIGluaXRfb2JqTWVtWFhYKCkKKy8vICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrR2V0T2JqZWN0SW5mbyhyZW1hcHBlZERldmljZSwgcFBhY2tldC0+b2JqVHlwZSwgcmVtYXBwZWRPYmplY3QsIHBQYWNrZXQtPmluZm9UeXBlLCAmc2l6ZSwgcERhdGEpOworLy8gICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorLy8gICAgeworLy8gICAgICAgIGlmIChzaXplICE9ICpwUGFja2V0LT5wRGF0YVNpemUgJiYgcERhdGEgIT0gTlVMTCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygidmtHZXRPYmplY3RJbmZvIHJldHVybmVkIGEgZGlmZmVyaW5nIGRhdGEgc2l6ZTogcmVwbGF5ICglZCBieXRlcykgdnMgdHJhY2UgKCVkIGJ5dGVzKS4iLCBzaXplLCAqcFBhY2tldC0+cERhdGFTaXplKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgZWxzZSBpZiAocERhdGEgIT0gTlVMTCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHN3aXRjaCAocFBhY2tldC0+aW5mb1R5cGUpCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIGNhc2UgVktfT0JKRUNUX0lORk9fVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTOgorLy8gICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgIFZrTWVtb3J5UmVxdWlyZW1lbnRzICp0cmFjZVJlcXMgPSAoVmtNZW1vcnlSZXF1aXJlbWVudHMgKikgcFBhY2tldC0+cERhdGE7CisvLyAgICAgICAgICAgICAgICAgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgKnJlcGxheVJlcXMgPSAoVmtNZW1vcnlSZXF1aXJlbWVudHMgKikgcERhdGE7CisvLyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bSA9IHNpemUgLyBzaXplb2YoVmtNZW1vcnlSZXF1aXJlbWVudHMpOworLy8gICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspCisvLyAgICAgICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSZXFzLT5zaXplICE9IHJlcGxheVJlcXMtPnNpemUpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoInZrR2V0T2JqZWN0SW5mbyhJTkZPX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UUykgbWlzbWF0Y2g6IHRyYWNlIHNpemUgJXUsIHJlcGxheSBzaXplICV1LiIsIHRyYWNlUmVxcy0+c2l6ZSwgcmVwbGF5UmVxcy0+c2l6ZSk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJlcXMtPmFsaWdubWVudCAhPSByZXBsYXlSZXFzLT5hbGlnbm1lbnQpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoInZrR2V0T2JqZWN0SW5mbyhJTkZPX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UUykgbWlzbWF0Y2g6IHRyYWNlIGFsaWdubWVudCAldSwgcmVwbGF5IGFsaWdtbmVudCAldS4iLCB0cmFjZVJlcXMtPmFsaWdubWVudCwgcmVwbGF5UmVxcy0+YWxpZ25tZW50KTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUmVxcy0+Z3JhbnVsYXJpdHkgIT0gcmVwbGF5UmVxcy0+Z3JhbnVsYXJpdHkpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoInZrR2V0T2JqZWN0SW5mbyhJTkZPX1RZUEVfTUVNT1JZX1JFUVVJUkVNRU5UUykgbWlzbWF0Y2g6IHRyYWNlIGdyYW51bGFyaXR5ICV1LCByZXBsYXkgZ3JhbnVsYXJpdHkgJXUuIiwgdHJhY2VSZXFzLT5ncmFudWxhcml0eSwgcmVwbGF5UmVxcy0+Z3JhbnVsYXJpdHkpOworLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSZXFzLT5tZW1Qcm9wc0FsbG93ZWQgIT0gcmVwbGF5UmVxcy0+bWVtUHJvcHNBbGxvd2VkKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJ2a0dldE9iamVjdEluZm8oSU5GT19UWVBFX01FTU9SWV9SRVFVSVJFTUVOVFMpIG1pc21hdGNoOiB0cmFjZSBtZW1Qcm9wc0FsbG93ZWQgJXUsIHJlcGxheSBtZW1Qcm9wc0FsbG93ZWQgJXUuIiwgdHJhY2VSZXFzLT5tZW1Qcm9wc0FsbG93ZWQsIHJlcGxheVJlcXMtPm1lbVByb3BzQWxsb3dlZCk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJlcXMtPm1lbVByb3BzUmVxdWlyZWQgIT0gcmVwbGF5UmVxcy0+bWVtUHJvcHNSZXF1aXJlZCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygidmtHZXRPYmplY3RJbmZvKElORk9fVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTKSBtaXNtYXRjaDogdHJhY2UgbWVtUHJvcHNSZXF1aXJlZCAldSwgcmVwbGF5IG1lbVByb3BzUmVxdWlyZWQgJXUuIiwgdHJhY2VSZXFzLT5tZW1Qcm9wc1JlcXVpcmVkLCByZXBsYXlSZXFzLT5tZW1Qcm9wc1JlcXVpcmVkKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSZXFzKys7CisvLyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlcXMrKzsKKy8vICAgICAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICAgICAgaWYgKG1fb2JqTWFwcGVyLm1fYWRqdXN0Rm9yR1BVKQorLy8gICAgICAgICAgICAgICAgICAgICAgICBtX29iak1hcHBlci5pbml0X29iak1lbVJlcXMocFBhY2tldC0+b2JqZWN0LCByZXBsYXlSZXFzIC0gbnVtLCBudW0pOworLy8gICAgICAgICAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgZGVmYXVsdDoKKy8vICAgICAgICAgICAgICAgICAgICBpZiAobWVtY21wKHBEYXRhLCBwUGFja2V0LT5wRGF0YSwgc2l6ZSkgIT0gMCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJ2a0dldE9iamVjdEluZm8oKSBtaXNtYXRjaCBvbiAqcERhdGE6IGJldHdlZW4gdHJhY2UgYW5kIHJlcGxheSAqcERhdGFTaXplICV1LiIsIHNpemUpOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfQorLy8gICAgfQorLy8gICAgdmt0cmFjZV9mcmVlKHBEYXRhKTsKKy8vICAgIHJldHVybiByZXBsYXlSZXN1bHQ7CisvL30KKworLy9Wa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUluZm8ocGFja2V0X3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUluZm8qIHBQYWNrZXQpCisvL3sKKy8vICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vCisvLyAgICBWa0RldmljZSByZW1hcHBlZERldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2RldmljZXMocFBhY2tldC0+ZGV2aWNlKTsKKy8vICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKy8vICAgIHsKKy8vICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldEltYWdlU3VicmVzb3VyY2VJbmZvKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisvLyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vICAgIH0KKy8vCisvLyAgICBWa0ltYWdlIHJlbWFwcGVkSW1hZ2UgPSBtX29iak1hcHBlci5yZW1hcChwUGFja2V0LT5pbWFnZSk7CisvLyAgICBpZiAocmVtYXBwZWRJbWFnZSA9PSBWS19OVUxMX0hBTkRMRSkKKy8vICAgIHsKKy8vICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldEltYWdlU3VicmVzb3VyY2VJbmZvKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtJbWFnZS4iKTsKKy8vICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworLy8gICAgfQorLy8KKy8vICAgIHNpemVfdCBzaXplID0gMDsKKy8vICAgIHZvaWQqIHBEYXRhID0gTlVMTDsKKy8vICAgIGlmIChwUGFja2V0LT5wRGF0YSAhPSBOVUxMICYmIHBQYWNrZXQtPnBEYXRhU2l6ZSAhPSBOVUxMKQorLy8gICAgeworLy8gICAgICAgIHNpemUgPSAqcFBhY2tldC0+cERhdGFTaXplOworLy8gICAgICAgIHBEYXRhID0gdmt0cmFjZV9tYWxsb2MoKnBQYWNrZXQtPnBEYXRhU2l6ZSk7CisvLyAgICB9CisvLyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldEltYWdlU3VicmVzb3VyY2VJbmZvKHJlbWFwcGVkRGV2aWNlLCByZW1hcHBlZEltYWdlLCBwUGFja2V0LT5wU3VicmVzb3VyY2UsIHBQYWNrZXQtPmluZm9UeXBlLCAmc2l6ZSwgcERhdGEpOworLy8gICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorLy8gICAgeworLy8gICAgICAgIGlmIChzaXplICE9ICpwUGFja2V0LT5wRGF0YVNpemUgJiYgcERhdGEgIT0gTlVMTCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygidmtHZXRJbWFnZVN1YnJlc291cmNlSW5mbyByZXR1cm5lZCBhIGRpZmZlcmluZyBkYXRhIHNpemU6IHJlcGxheSAoJWQgYnl0ZXMpIHZzIHRyYWNlICglZCBieXRlcykuIiwgc2l6ZSwgKnBQYWNrZXQtPnBEYXRhU2l6ZSk7CisvLyAgICAgICAgfQorLy8gICAgICAgIGVsc2UgaWYgKHBEYXRhICE9IE5VTEwgJiYgbWVtY21wKHBEYXRhLCBwUGFja2V0LT5wRGF0YSwgc2l6ZSkgIT0gMCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygidmtHZXRJbWFnZVN1YnJlc291cmNlSW5mbyByZXR1cm5lZCBkaWZmZXJpbmcgZGF0YSBjb250ZW50cyB0aGFuIHRoZSB0cmFjZSBmaWxlIGNvbnRhaW5lZC4iKTsKKy8vICAgICAgICB9CisvLyAgICB9CisvLyAgICB2a3RyYWNlX2ZyZWUocERhdGEpOworLy8gICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKKy8vfQorCit2b2lkIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyhwYWNrZXRfdmtVcGRhdGVEZXNjcmlwdG9yU2V0cyogcFBhY2tldCkKK3sKKyAgICAvLyBXZSBoYXZlIHRvIHJlbWFwIGhhbmRsZXMgaW50ZXJuYWwgdG8gdGhlIHN0cnVjdHVyZXMgc28gc2F2ZSB0aGUgaGFuZGxlcyBwcmlvciB0byByZW1hcCBhbmQgdGhlbiByZXN0b3JlCisgICAgLy8gUmF0aGVyIHRoYW4gZG9pbmcgYSBkZWVwIG1lbWNweSBvZiB0aGUgZW50aXJlIHN0cnVjdCBhbmQgZml4aW5nIGFueSBpbnRlcm1lZGlhdGUgcG9pbnRlcnMsIGRvIHNhdmUgYW5kIHJlc3RvcmVzIHZpYSBTVEwgcXVldWUKKworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0RldmljZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrV3JpdGVEZXNjcmlwdG9yU2V0KiBwUmVtYXBwZWRXcml0ZXMgPSBWS1RSQUNFX05FV19BUlJBWShWa1dyaXRlRGVzY3JpcHRvclNldCwgcFBhY2tldC0+ZGVzY3JpcHRvcldyaXRlQ291bnQpOworICAgIG1lbWNweShwUmVtYXBwZWRXcml0ZXMsIHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzLCBwUGFja2V0LT5kZXNjcmlwdG9yV3JpdGVDb3VudCAqIHNpemVvZihWa1dyaXRlRGVzY3JpcHRvclNldCkpOworCisgICAgVmtDb3B5RGVzY3JpcHRvclNldCogcFJlbWFwcGVkQ29waWVzID0gVktUUkFDRV9ORVdfQVJSQVkoVmtDb3B5RGVzY3JpcHRvclNldCwgcFBhY2tldC0+ZGVzY3JpcHRvckNvcHlDb3VudCk7CisgICAgbWVtY3B5KHBSZW1hcHBlZENvcGllcywgcFBhY2tldC0+cERlc2NyaXB0b3JDb3BpZXMsIHBQYWNrZXQtPmRlc2NyaXB0b3JDb3B5Q291bnQgKiBzaXplb2YoVmtDb3B5RGVzY3JpcHRvclNldCkpOworCisgICAgYm9vbCBlcnJvckJhZFJlbWFwID0gZmFsc2U7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+ZGVzY3JpcHRvcldyaXRlQ291bnQgJiYgIWVycm9yQmFkUmVtYXA7IGkrKykKKyAgICB7CisgICAgICAgIHBSZW1hcHBlZFdyaXRlc1tpXS5kc3RTZXQgPSBtX29iak1hcHBlci5yZW1hcF9kZXNjcmlwdG9yc2V0cyhwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5kc3RTZXQpOworICAgICAgICBpZiAocFJlbWFwcGVkV3JpdGVzW2ldLmRzdFNldCA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtVcGRhdGVEZXNjcmlwdG9yU2V0cygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIHdyaXRlIFZrRGVzY3JpcHRvclNldC4iKTsKKyAgICAgICAgICAgIGVycm9yQmFkUmVtYXAgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlKSB7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVI6CisgICAgICAgICAgICBwUmVtYXBwZWRXcml0ZXNbaV0ucEltYWdlSW5mbyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrRGVzY3JpcHRvckltYWdlSW5mbywgcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvckNvdW50KTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCopcFJlbWFwcGVkV3JpdGVzW2ldLnBJbWFnZUluZm8sIHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLnBJbWFnZUluZm8sIHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudCAqIHNpemVvZihWa0Rlc2NyaXB0b3JJbWFnZUluZm8pKTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEltYWdlSW5mb1tqXS5zYW1wbGVyICE9IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxWa0Rlc2NyaXB0b3JJbWFnZUluZm8qPihwUmVtYXBwZWRXcml0ZXNbaV0ucEltYWdlSW5mbylbal0uc2FtcGxlciA9IG1fb2JqTWFwcGVyLnJlbWFwX3NhbXBsZXJzKHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLnBJbWFnZUluZm9bal0uc2FtcGxlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUmVtYXBwZWRXcml0ZXNbaV0ucEltYWdlSW5mb1tqXS5zYW1wbGVyID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtTYW1wbGVyLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JCYWRSZW1hcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TQU1QTEVEX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0lNQUdFOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOgorICAgICAgICAgICAgcFJlbWFwcGVkV3JpdGVzW2ldLnBJbWFnZUluZm8gPSBWS1RSQUNFX05FV19BUlJBWShWa0Rlc2NyaXB0b3JJbWFnZUluZm8sIHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudCk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQqKXBSZW1hcHBlZFdyaXRlc1tpXS5wSW1hZ2VJbmZvLCBwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wSW1hZ2VJbmZvLCBwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQgKiBzaXplb2YoVmtEZXNjcmlwdG9ySW1hZ2VJbmZvKSk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvckNvdW50OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLnBJbWFnZUluZm9bal0uaW1hZ2VWaWV3ICE9IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxWa0Rlc2NyaXB0b3JJbWFnZUluZm8qPihwUmVtYXBwZWRXcml0ZXNbaV0ucEltYWdlSW5mbylbal0uaW1hZ2VWaWV3ID0gbV9vYmpNYXBwZXIucmVtYXBfaW1hZ2V2aWV3cyhwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wSW1hZ2VJbmZvW2pdLmltYWdlVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUmVtYXBwZWRXcml0ZXNbaV0ucEltYWdlSW5mb1tqXS5pbWFnZVZpZXcgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0ltYWdlVmlldy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQmFkUmVtYXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjoKKyAgICAgICAgICAgIHBSZW1hcHBlZFdyaXRlc1tpXS5wSW1hZ2VJbmZvID0gVktUUkFDRV9ORVdfQVJSQVkoVmtEZXNjcmlwdG9ySW1hZ2VJbmZvLCBwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkKilwUmVtYXBwZWRXcml0ZXNbaV0ucEltYWdlSW5mbywgcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEltYWdlSW5mbywgcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvckNvdW50ICogc2l6ZW9mKFZrRGVzY3JpcHRvckltYWdlSW5mbykpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wSW1hZ2VJbmZvW2pdLnNhbXBsZXIgIT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFZrRGVzY3JpcHRvckltYWdlSW5mbyo+KHBSZW1hcHBlZFdyaXRlc1tpXS5wSW1hZ2VJbmZvKVtqXS5zYW1wbGVyID0gbV9vYmpNYXBwZXIucmVtYXBfc2FtcGxlcnMocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEltYWdlSW5mb1tqXS5zYW1wbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBSZW1hcHBlZFdyaXRlc1tpXS5wSW1hZ2VJbmZvW2pdLnNhbXBsZXIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1NhbXBsZXIuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckJhZFJlbWFwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wSW1hZ2VJbmZvW2pdLmltYWdlVmlldyAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8VmtEZXNjcmlwdG9ySW1hZ2VJbmZvKj4ocFJlbWFwcGVkV3JpdGVzW2ldLnBJbWFnZUluZm8pW2pdLmltYWdlVmlldyA9IG1fb2JqTWFwcGVyLnJlbWFwX2ltYWdldmlld3MocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEltYWdlSW5mb1tqXS5pbWFnZVZpZXcpOworICAgICAgICAgICAgICAgICAgICBpZiAocFJlbWFwcGVkV3JpdGVzW2ldLnBJbWFnZUluZm9bal0uaW1hZ2VWaWV3ID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtJbWFnZVZpZXcuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckJhZFJlbWFwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgICAgIHBSZW1hcHBlZFdyaXRlc1tpXS5wVGV4ZWxCdWZmZXJWaWV3ID0gVktUUkFDRV9ORVdfQVJSQVkoVmtCdWZmZXJWaWV3LCBwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkKilwUmVtYXBwZWRXcml0ZXNbaV0ucFRleGVsQnVmZmVyVmlldywgcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucFRleGVsQnVmZmVyVmlldywgcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvckNvdW50ICogc2l6ZW9mKFZrQnVmZmVyVmlldykpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wVGV4ZWxCdWZmZXJWaWV3W2pdICE9IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxWa0J1ZmZlclZpZXcqPihwUmVtYXBwZWRXcml0ZXNbaV0ucFRleGVsQnVmZmVyVmlldylbal0gPSBtX29iak1hcHBlci5yZW1hcF9idWZmZXJ2aWV3cyhwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wVGV4ZWxCdWZmZXJWaWV3W2pdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBSZW1hcHBlZFdyaXRlc1tpXS5wVGV4ZWxCdWZmZXJWaWV3W2pdID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtCdWZmZXJWaWV3LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JCYWRSZW1hcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9VTklGT1JNX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVI6CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM6CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSX0RZTkFNSUM6CisgICAgICAgICAgICBwUmVtYXBwZWRXcml0ZXNbaV0ucEJ1ZmZlckluZm8gPSBWS1RSQUNFX05FV19BUlJBWShWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvLCBwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkKilwUmVtYXBwZWRXcml0ZXNbaV0ucEJ1ZmZlckluZm8sIHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLnBCdWZmZXJJbmZvLCBwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQgKiBzaXplb2YoVmtEZXNjcmlwdG9yQnVmZmVySW5mbykpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wQnVmZmVySW5mb1tqXS5idWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFZrRGVzY3JpcHRvckJ1ZmZlckluZm8qPihwUmVtYXBwZWRXcml0ZXNbaV0ucEJ1ZmZlckluZm8pW2pdLmJ1ZmZlciA9IG1fb2JqTWFwcGVyLnJlbWFwX2J1ZmZlcnMocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEJ1ZmZlckluZm9bal0uYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBSZW1hcHBlZFdyaXRlc1tpXS5wQnVmZmVySW5mb1tqXS5idWZmZXIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0J1ZmZlclZpZXcuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckJhZFJlbWFwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTm90aGluZyB0byBkbywgYWxyZWFkeSBjb3BpZWQgdGhlIGNvbnN0YW50IHZhbHVlcyBpbnRvIHRoZSBuZXcgZGVzY3JpcHRvciBpbmZvICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwUGFja2V0LT5kZXNjcmlwdG9yQ29weUNvdW50ICYmICFlcnJvckJhZFJlbWFwOyBpKyspCisgICAgeworICAgICAgICBwUmVtYXBwZWRDb3BpZXNbaV0uZHN0U2V0ID0gbV9vYmpNYXBwZXIucmVtYXBfZGVzY3JpcHRvcnNldHMocFBhY2tldC0+cERlc2NyaXB0b3JDb3BpZXNbaV0uZHN0U2V0KTsKKyAgICAgICAgaWYgKHBSZW1hcHBlZENvcGllc1tpXS5kc3RTZXQgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrVXBkYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBkZXN0aW5hdGlvbiBWa0Rlc2NyaXB0b3JTZXQuIik7CisgICAgICAgICAgICBlcnJvckJhZFJlbWFwID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcFJlbWFwcGVkQ29waWVzW2ldLnNyY1NldCA9IG1fb2JqTWFwcGVyLnJlbWFwX2Rlc2NyaXB0b3JzZXRzKHBQYWNrZXQtPnBEZXNjcmlwdG9yQ29waWVzW2ldLnNyY1NldCk7CisgICAgICAgIGlmIChwUmVtYXBwZWRDb3BpZXNbaV0uc3JjU2V0ID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1VwZGF0ZURlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgc291cmNlIFZrRGVzY3JpcHRvclNldC4iKTsKKyAgICAgICAgICAgIGVycm9yQmFkUmVtYXAgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWVycm9yQmFkUmVtYXApCisgICAgeworICAgICAgICAvLyBJZiBhbiBlcnJvciBvY2N1cnJlZCwgZG9uJ3QgY2FsbCB0aGUgcmVhbCBmdW5jdGlvbiwgYnV0IHNraXAgYWhlYWQgc28gdGhhdCBtZW1vcnkgaXMgY2xlYW5lZCB1cCEKKworICAgICAgICBtX3ZrRnVuY3MucmVhbF92a1VwZGF0ZURlc2NyaXB0b3JTZXRzKHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5kZXNjcmlwdG9yV3JpdGVDb3VudCwgcFJlbWFwcGVkV3JpdGVzLCBwUGFja2V0LT5kZXNjcmlwdG9yQ29weUNvdW50LCBwUmVtYXBwZWRDb3BpZXMpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgZCA9IDA7IGQgPCBwUGFja2V0LT5kZXNjcmlwdG9yV3JpdGVDb3VudDsgZCsrKQorICAgIHsKKyAgICAgICAgaWYgKHBSZW1hcHBlZFdyaXRlc1tkXS5wSW1hZ2VJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKCh2b2lkKilwUmVtYXBwZWRXcml0ZXNbZF0ucEltYWdlSW5mbyk7CisgICAgICAgICAgICBwUmVtYXBwZWRXcml0ZXNbZF0ucEltYWdlSW5mbyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBSZW1hcHBlZFdyaXRlc1tkXS5wQnVmZmVySW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURSgodm9pZCopcFJlbWFwcGVkV3JpdGVzW2RdLnBCdWZmZXJJbmZvKTsKKyAgICAgICAgICAgIHBSZW1hcHBlZFdyaXRlc1tkXS5wSW1hZ2VJbmZvID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocFJlbWFwcGVkV3JpdGVzW2RdLnBUZXhlbEJ1ZmZlclZpZXcgIT0gTlVMTCkgeworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUoKHZvaWQqKXBSZW1hcHBlZFdyaXRlc1tkXS5wVGV4ZWxCdWZmZXJWaWV3KTsKKyAgICAgICAgICAgIHBSZW1hcHBlZFdyaXRlc1tkXS5wVGV4ZWxCdWZmZXJWaWV3ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRXcml0ZXMpOworICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZENvcGllcyk7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KHBhY2tldF92a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisgICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyAqcEluZm8gPSAoVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyopIHBQYWNrZXQtPnBDcmVhdGVJbmZvOworICAgIGlmIChwSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKHBJbmZvLT5wQmluZGluZ3MgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwSW5mby0+YmluZGluZ0NvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyAqcEJpbmRpbmdzID0gKFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcgKikgJnBJbmZvLT5wQmluZGluZ3NbaV07CisgICAgICAgICAgICAgICAgaWYgKHBCaW5kaW5ncy0+cEltbXV0YWJsZVNhbXBsZXJzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IHBCaW5kaW5ncy0+ZGVzY3JpcHRvckNvdW50OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZrU2FtcGxlciogcFNhbXBsZXIgPSAoVmtTYW1wbGVyKikmcEJpbmRpbmdzLT5wSW1tdXRhYmxlU2FtcGxlcnNbal07CisgICAgICAgICAgICAgICAgICAgICAgICAqcFNhbXBsZXIgPSBtX29iak1hcHBlci5yZW1hcF9zYW1wbGVycyhwQmluZGluZ3MtPnBJbW11dGFibGVTYW1wbGVyc1tqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnBTYW1wbGVyID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrU2FtcGxlci4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFZrRGVzY3JpcHRvclNldExheW91dCBzZXRMYXlvdXQ7CisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5wQ3JlYXRlSW5mbywgTlVMTCwgJnNldExheW91dCk7CisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX2Rlc2NyaXB0b3JzZXRsYXlvdXRzX21hcCgqKHBQYWNrZXQtPnBTZXRMYXlvdXQpLCBzZXRMYXlvdXQpOworICAgIH0KKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCit2b2lkIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dChwYWNrZXRfdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCogcFBhY2tldCkKK3sKKyAgICBWa0RldmljZSByZW1hcHBlZERldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2RldmljZXMocFBhY2tldC0+ZGV2aWNlKTsKKyAgICBpZiAocmVtYXBwZWREZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV92a0Z1bmNzLnJlYWxfdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dChyZW1hcHBlZERldmljZSwgcFBhY2tldC0+ZGVzY3JpcHRvclNldExheW91dCwgTlVMTCk7CisgICAgbV9vYmpNYXBwZXIucm1fZnJvbV9kZXNjcmlwdG9yc2V0bGF5b3V0c19tYXAocFBhY2tldC0+ZGVzY3JpcHRvclNldExheW91dCk7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKHBhY2tldF92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisgICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtEZXNjcmlwdG9yUG9vbCByZW1hcHBlZFBvb2wgPSBtX29iak1hcHBlci5yZW1hcF9kZXNjcmlwdG9ycG9vbHMocFBhY2tldC0+cEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclBvb2wpOworICAgIGlmIChyZW1hcHBlZFBvb2wgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0Rlc2NyaXB0b3JQb29sLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrRGVzY3JpcHRvclNldExheW91dCogcFJlbWFwcGVkU2V0TGF5b3V0cyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrRGVzY3JpcHRvclNldExheW91dCwgcFBhY2tldC0+cEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50KTsKKworICAgIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyBhbGxvY2F0ZUluZm87CisgICAgYWxsb2NhdGVJbmZvLnBOZXh0ID0gTlVMTDsKKyAgICBhbGxvY2F0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9BTExPQ0FURV9JTkZPOworICAgIGFsbG9jYXRlSW5mby5kZXNjcmlwdG9yUG9vbCA9IHJlbWFwcGVkUG9vbDsKKyAgICBhbGxvY2F0ZUluZm8uZGVzY3JpcHRvclNldENvdW50ID0gcFBhY2tldC0+cEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OworICAgIGFsbG9jYXRlSW5mby5wU2V0TGF5b3V0cyA9IHBSZW1hcHBlZFNldExheW91dHM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYWxsb2NhdGVJbmZvLmRlc2NyaXB0b3JTZXRDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgcFJlbWFwcGVkU2V0TGF5b3V0c1tpXSA9IG1fb2JqTWFwcGVyLnJlbWFwX2Rlc2NyaXB0b3JzZXRsYXlvdXRzKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzW2ldKTsKKyAgICAgICAgaWYgKHBSZW1hcHBlZFNldExheW91dHNbaV0gPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGVzY3JpcHRvclNldExheW91dC4iKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFNldExheW91dHMpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZrRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JTZXRzID0gTlVMTDsKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoCisgICAgICAgICAgICAgICAgICAgICAgIHJlbWFwcGVkRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvclNldHMpOworICAgIGlmKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+cEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX2Rlc2NyaXB0b3JzZXRzX21hcChwUGFja2V0LT5wRGVzY3JpcHRvclNldHNbaV0sIHBEZXNjcmlwdG9yU2V0c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRTZXRMYXlvdXRzKTsKKworICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtGcmVlRGVzY3JpcHRvclNldHMocGFja2V0X3ZrRnJlZURlc2NyaXB0b3JTZXRzKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrRnJlZURlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtEZXNjcmlwdG9yUG9vbCByZW1hcHBlZERlc2NyaXB0b3JQb29sOworICAgIHJlbWFwcGVkRGVzY3JpcHRvclBvb2wgPSBtX29iak1hcHBlci5yZW1hcF9kZXNjcmlwdG9ycG9vbHMocFBhY2tldC0+ZGVzY3JpcHRvclBvb2wpOworICAgIGlmIChyZW1hcHBlZERlc2NyaXB0b3JQb29sID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtGcmVlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0Rlc2NyaXB0b3JQb29sLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrRGVzY3JpcHRvclNldCogbG9jYWxEU3MgPSBWS1RSQUNFX05FV19BUlJBWShWa0Rlc2NyaXB0b3JTZXQsIHBQYWNrZXQtPmRlc2NyaXB0b3JTZXRDb3VudCk7CisgICAgdWludDMyX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFBhY2tldC0+ZGVzY3JpcHRvclNldENvdW50OyArK2kpIHsKKyAgICAgICAgbG9jYWxEU3NbaV0gPSBtX29iak1hcHBlci5yZW1hcF9kZXNjcmlwdG9yc2V0cyhwUGFja2V0LT5wRGVzY3JpcHRvclNldHNbaV0pOworICAgICAgICBpZiAobG9jYWxEU3NbaV0gPT0gVktfTlVMTF9IQU5ETEUgJiYgcFBhY2tldC0+cERlc2NyaXB0b3JTZXRzW2ldICE9IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0ZyZWVEZXNjcmlwdG9yU2V0cygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGVzY3JpcHRvclNldC4iKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKGxvY2FsRFNzKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0ZyZWVEZXNjcmlwdG9yU2V0cyhyZW1hcHBlZERldmljZSwgcmVtYXBwZWREZXNjcmlwdG9yUG9vbCwgcFBhY2tldC0+ZGVzY3JpcHRvclNldENvdW50LCBsb2NhbERTcyk7CisgICAgaWYocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhY2tldC0+ZGVzY3JpcHRvclNldENvdW50OyArK2kpIHsKKyAgICAgICAgICAgbV9vYmpNYXBwZXIucm1fZnJvbV9kZXNjcmlwdG9yc2V0c19tYXAocFBhY2tldC0+cERlc2NyaXB0b3JTZXRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBWS1RSQUNFX0RFTEVURShsb2NhbERTcyk7CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKwordm9pZCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrQ21kQmluZERlc2NyaXB0b3JTZXRzKHBhY2tldF92a0NtZEJpbmREZXNjcmlwdG9yU2V0cyogcFBhY2tldCkKK3sKKyAgICBWa0NvbW1hbmRCdWZmZXIgcmVtYXBwZWRDb21tYW5kQnVmZmVyID0gbV9vYmpNYXBwZXIucmVtYXBfY29tbWFuZGJ1ZmZlcnMocFBhY2tldC0+Y29tbWFuZEJ1ZmZlcik7CisgICAgaWYgKHJlbWFwcGVkQ29tbWFuZEJ1ZmZlciA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtDb21tYW5kQnVmZmVyLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmtQaXBlbGluZUxheW91dCByZW1hcHBlZExheW91dCA9IG1fb2JqTWFwcGVyLnJlbWFwX3BpcGVsaW5lbGF5b3V0cyhwUGFja2V0LT5sYXlvdXQpOworICAgIGlmIChyZW1hcHBlZExheW91dCA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaXBlbGluZUxheW91dC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZrRGVzY3JpcHRvclNldCogcFJlbWFwcGVkU2V0cyA9IChWa0Rlc2NyaXB0b3JTZXQgKikgdmt0cmFjZV9tYWxsb2Moc2l6ZW9mKFZrRGVzY3JpcHRvclNldCkgKiBwUGFja2V0LT5kZXNjcmlwdG9yU2V0Q291bnQpOworICAgIGlmIChwUmVtYXBwZWRTZXRzID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJSZXBsYXkgb2YgQ21kQmluZERlc2NyaXB0b3JTZXRzIG91dCBvZiBtZW1vcnkuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGlkeCA9IDA7IGlkeCA8IHBQYWNrZXQtPmRlc2NyaXB0b3JTZXRDb3VudCAmJiBwUGFja2V0LT5wRGVzY3JpcHRvclNldHMgIT0gTlVMTDsgaWR4KyspCisgICAgeworICAgICAgICBwUmVtYXBwZWRTZXRzW2lkeF0gPSBtX29iak1hcHBlci5yZW1hcF9kZXNjcmlwdG9yc2V0cyhwUGFja2V0LT5wRGVzY3JpcHRvclNldHNbaWR4XSk7CisgICAgICAgIGlmIChwUmVtYXBwZWRTZXRzW2lkeF0gPT0gVktfTlVMTF9IQU5ETEUgJiYgcFBhY2tldC0+cERlc2NyaXB0b3JTZXRzW2lkeF0gIT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ21kQmluZERlc2NyaXB0b3JTZXRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXNjcmlwdG9yU2V0LiIpOworICAgICAgICAgICAgdmt0cmFjZV9mcmVlKHBSZW1hcHBlZFNldHMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbV92a0Z1bmNzLnJlYWxfdmtDbWRCaW5kRGVzY3JpcHRvclNldHMocmVtYXBwZWRDb21tYW5kQnVmZmVyLCBwUGFja2V0LT5waXBlbGluZUJpbmRQb2ludCwgcmVtYXBwZWRMYXlvdXQsIHBQYWNrZXQtPmZpcnN0U2V0LCBwUGFja2V0LT5kZXNjcmlwdG9yU2V0Q291bnQsIHBSZW1hcHBlZFNldHMsIHBQYWNrZXQtPmR5bmFtaWNPZmZzZXRDb3VudCwgcFBhY2tldC0+cER5bmFtaWNPZmZzZXRzKTsKKyAgICB2a3RyYWNlX2ZyZWUocFJlbWFwcGVkU2V0cyk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDbWRCaW5kVmVydGV4QnVmZmVycyhwYWNrZXRfdmtDbWRCaW5kVmVydGV4QnVmZmVycyogcFBhY2tldCkKK3sKKyAgICBWa0NvbW1hbmRCdWZmZXIgcmVtYXBwZWRDb21tYW5kQnVmZmVyID0gbV9vYmpNYXBwZXIucmVtYXBfY29tbWFuZGJ1ZmZlcnMocFBhY2tldC0+Y29tbWFuZEJ1ZmZlcik7CisgICAgaWYgKHJlbWFwcGVkQ29tbWFuZEJ1ZmZlciA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0NvbW1hbmRCdWZmZXIuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0J1ZmZlciAqcFNhdmVCdWZmID0gVktUUkFDRV9ORVdfQVJSQVkoVmtCdWZmZXIsIHBQYWNrZXQtPmJpbmRpbmdDb3VudCk7CisgICAgaWYgKHBTYXZlQnVmZiA9PSBOVUxMICYmIHBQYWNrZXQtPmJpbmRpbmdDb3VudCA+IDApCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJSZXBsYXkgb2YgQ21kQmluZFZlcnRleEJ1ZmZlcnMgb3V0IG9mIG1lbW9yeS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBpZiAocFBhY2tldC0+cEJ1ZmZlcnMgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhY2tldC0+YmluZGluZ0NvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZrQnVmZmVyICpwQnVmZiA9IChWa0J1ZmZlciopICYocFBhY2tldC0+cEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgcFNhdmVCdWZmW2ldID0gcFBhY2tldC0+cEJ1ZmZlcnNbaV07CisgICAgICAgICAgICAqcEJ1ZmYgPSBtX29iak1hcHBlci5yZW1hcF9idWZmZXJzKHBQYWNrZXQtPnBCdWZmZXJzW2ldKTsKKyAgICAgICAgICAgIGlmICgqcEJ1ZmYgPT0gVktfTlVMTF9IQU5ETEUgJiYgcFBhY2tldC0+cEJ1ZmZlcnNbaV0gIT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDbWRCaW5kVmVydGV4QnVmZmVycygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrQnVmZmVyLiIpOworICAgICAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBTYXZlQnVmZik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1fdmtGdW5jcy5yZWFsX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnMocmVtYXBwZWRDb21tYW5kQnVmZmVyLCBwUGFja2V0LT5maXJzdEJpbmRpbmcsIHBQYWNrZXQtPmJpbmRpbmdDb3VudCwgcFBhY2tldC0+cEJ1ZmZlcnMsIHBQYWNrZXQtPnBPZmZzZXRzKTsKKyAgICBmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgaTsgaysrKQorICAgIHsKKyAgICAgICAgVmtCdWZmZXIgKnBCdWZmID0gKFZrQnVmZmVyKikgJihwUGFja2V0LT5wQnVmZmVyc1trXSk7CisgICAgICAgICpwQnVmZiA9IHBTYXZlQnVmZltrXTsKKyAgICB9CisgICAgVktUUkFDRV9ERUxFVEUocFNhdmVCdWZmKTsKKyAgICByZXR1cm47Cit9CisKKy8vVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmUocGFja2V0X3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSogcFBhY2tldCkKKy8veworLy8gICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworLy8KKy8vICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworLy8gICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorLy8gICAgeworLy8gICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZSgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlLiIpOworLy8gICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisvLyAgICB9CisvLworLy8gICAgLy8gcmVtYXAgc2hhZGVycyBmcm9tIGVhY2ggc3RhZ2UKKy8vICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIHBSZW1hcHBlZFN0YWdlcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8sIHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5zdGFnZUNvdW50KTsKKy8vICAgIG1lbWNweShwUmVtYXBwZWRTdGFnZXMsIHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wU3RhZ2VzLCBzaXplb2YoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbykgKiBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c3RhZ2VDb3VudCk7CisvLyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+cENyZWF0ZUluZm8tPnN0YWdlQ291bnQ7IGkrKykKKy8vICAgIHsKKy8vICAgICAgICBwUmVtYXBwZWRTdGFnZXNbaV0uc2hhZGVyID0gbV9vYmpNYXBwZXIucmVtYXAocFJlbWFwcGVkU3RhZ2VzW2ldLnNoYWRlcik7CisvLyAgICAgICAgaWYgKHBSZW1hcHBlZFN0YWdlc1tpXS5zaGFkZXIgPT0gVktfTlVMTF9IQU5ETEUpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1NoYWRlci4iKTsKKy8vICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vICAgICAgICB9CisvLyAgICB9CisvLworLy8gICAgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBjcmVhdGVJbmZvID0geworLy8gICAgICAgIC5zVHlwZSA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5zVHlwZSwKKy8vICAgICAgICAucE5leHQgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cE5leHQsCisvLyAgICAgICAgLnN0YWdlQ291bnQgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c3RhZ2VDb3VudCwKKy8vICAgICAgICAucFN0YWdlcyA9IHBSZW1hcHBlZFN0YWdlcywKKy8vICAgICAgICAucFZlcnRleElucHV0U3RhdGUgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFZlcnRleElucHV0U3RhdGUsCisvLyAgICAgICAgLnBJYVN0YXRlID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBJYVN0YXRlLAorLy8gICAgICAgIC5wVGVzc1N0YXRlID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBUZXNzU3RhdGUsCisvLyAgICAgICAgLnBWcFN0YXRlID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBWcFN0YXRlLAorLy8gICAgICAgIC5wUnNTdGF0ZSA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUnNTdGF0ZSwKKy8vICAgICAgICAucE1zU3RhdGUgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cE1zU3RhdGUsCisvLyAgICAgICAgLnBEc1N0YXRlID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBEc1N0YXRlLAorLy8gICAgICAgIC5wQ2JTdGF0ZSA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wQ2JTdGF0ZSwKKy8vICAgICAgICAuZmxhZ3MgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+ZmxhZ3MsCisvLyAgICAgICAgLmxheW91dCA9IG1fb2JqTWFwcGVyLnJlbWFwKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5sYXlvdXQpCisvLyAgICB9OworLy8KKy8vICAgIFZrUGlwZWxpbmUgcGlwZWxpbmU7CisvLyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmUocmVtYXBwZWREZXZpY2UsICZjcmVhdGVJbmZvLCAmcGlwZWxpbmUpOworLy8gICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorLy8gICAgeworLy8gICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b19tYXAocFBhY2tldC0+cFBpcGVsaW5lLCAmcGlwZWxpbmUpOworLy8gICAgfQorLy8KKy8vICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFN0YWdlcyk7CisvLworLy8gICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKKy8vfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrR2V0UGlwZWxpbmVDYWNoZURhdGEocGFja2V0X3ZrR2V0UGlwZWxpbmVDYWNoZURhdGEqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICBWa0RldmljZSByZW1hcHBlZGRldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2RldmljZXMocFBhY2tldC0+ZGV2aWNlKTsKKyAgICBpZiAocmVtYXBwZWRkZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldFBpcGVsaW5lQ2FjaGVEYXRhKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtQaXBlbGluZUNhY2hlIHJlbWFwcGVkcGlwZWxpbmVDYWNoZSA9IG1fb2JqTWFwcGVyLnJlbWFwX3BpcGVsaW5lY2FjaGVzKHBQYWNrZXQtPnBpcGVsaW5lQ2FjaGUpOworICAgIGlmIChwUGFja2V0LT5waXBlbGluZUNhY2hlICE9IFZLX05VTExfSEFORExFICYmIHJlbWFwcGVkcGlwZWxpbmVDYWNoZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0UGlwZWxpbmVDYWNoZURhdGEoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1BpcGVsaW5lQ2FjaGUuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgLy8gU2luY2UgdGhlIHJldHVybmVkIGRhdGEgc2l6ZSBtYXkgbm90IGJlIGVxdWFsIHRvIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgdHJhY2UgcGFja2V0IGFsbG9jYXRlIGEgbG9jYWwgYnVmZmVyIGFzIG5lZWRlZAorICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrR2V0UGlwZWxpbmVDYWNoZURhdGEocmVtYXBwZWRkZXZpY2UsIHJlbWFwcGVkcGlwZWxpbmVDYWNoZSwgJmRhdGFTaXplLCBOVUxMKTsKKyAgICBpZiAocmVwbGF5UmVzdWx0ICE9IFZLX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXBsYXlSZXN1bHQ7CisgICAgaWYgKHBQYWNrZXQtPnBEYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgKnBEYXRhID0gVktUUkFDRV9ORVdfQVJSQVkodWludDhfdCwgZGF0YVNpemUpOworICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKHJlbWFwcGVkZGV2aWNlLCByZW1hcHBlZHBpcGVsaW5lQ2FjaGUsIHBQYWNrZXQtPnBEYXRhU2l6ZSwgcERhdGEpOworICAgICAgICBWS1RSQUNFX0RFTEVURShwRGF0YSk7CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKHBhY2tldF92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIFZrRGV2aWNlIHJlbWFwcGVkZGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIHVpbnQzMl90IGk7CisKKyAgICBpZiAocFBhY2tldC0+ZGV2aWNlICE9IFZLX05VTExfSEFORExFICYmIHJlbWFwcGVkZGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZTsKKyAgICBwaXBlbGluZUNhY2hlID0gbV9vYmpNYXBwZXIucmVtYXBfcGlwZWxpbmVjYWNoZXMocFBhY2tldC0+cGlwZWxpbmVDYWNoZSk7CisKKyAgICBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBMb2NhbENJcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbywgcFBhY2tldC0+Y3JlYXRlSW5mb0NvdW50KTsKKyAgICBtZW1jcHkoKHZvaWQqKXBMb2NhbENJcywgKHZvaWQqKShwUGFja2V0LT5wQ3JlYXRlSW5mb3MpLCBzaXplb2YoVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKSpwUGFja2V0LT5jcmVhdGVJbmZvQ291bnQpOworCisgICAgLy8gRml4IHVwIHN0YWdlIHN1Yi1lbGVtZW50cworICAgIGZvciAoaSA9IDA7IGk8cFBhY2tldC0+Y3JlYXRlSW5mb0NvdW50OyBpKyspCisgICAgeworICAgICAgICBwTG9jYWxDSXNbaV0uc3RhZ2UubW9kdWxlID0gbV9vYmpNYXBwZXIucmVtYXBfc2hhZGVybW9kdWxlcyhwTG9jYWxDSXNbaV0uc3RhZ2UubW9kdWxlKTsKKworICAgICAgICBpZiAocExvY2FsQ0lzW2ldLnN0YWdlLnBOYW1lKQorICAgICAgICAgICAgcExvY2FsQ0lzW2ldLnN0YWdlLnBOYW1lID0gKGNvbnN0IGNoYXIqKSh2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocFBhY2tldC0+aGVhZGVyLCAoaW50cHRyX3QpcExvY2FsQ0lzW2ldLnN0YWdlLnBOYW1lKSk7CisKKyAgICAgICAgaWYgKHBMb2NhbENJc1tpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvKQorICAgICAgICB7CisgICAgICAgICAgICBWa1NwZWNpYWxpemF0aW9uSW5mbyogc2kgPSBWS1RSQUNFX05FVyhWa1NwZWNpYWxpemF0aW9uSW5mbyk7CisgICAgICAgICAgICBwTG9jYWxDSXNbaV0uc3RhZ2UucFNwZWNpYWxpemF0aW9uSW5mbyA9IChjb25zdCBWa1NwZWNpYWxpemF0aW9uSW5mbyopKHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwUGFja2V0LT5oZWFkZXIsIChpbnRwdHJfdClwTG9jYWxDSXNbaV0uc3RhZ2UucFNwZWNpYWxpemF0aW9uSW5mbykpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkKilzaSwgKHZvaWQqKShwTG9jYWxDSXNbaV0uc3RhZ2UucFNwZWNpYWxpemF0aW9uSW5mbyksIHNpemVvZihWa1NwZWNpYWxpemF0aW9uSW5mbykpOworCisgICAgICAgICAgICBpZiAoc2ktPm1hcEVudHJ5Q291bnQgPiAwICYmIHNpLT5wTWFwRW50cmllcykKKyAgICAgICAgICAgICAgICBzaS0+cE1hcEVudHJpZXMgPSAoY29uc3QgVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5Kikodmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBQYWNrZXQtPmhlYWRlciwgKGludHB0cl90KXBMb2NhbENJc1tpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcykpOworICAgICAgICAgICAgaWYgKHNpLT5kYXRhU2l6ZSA+IDAgJiYgc2ktPnBEYXRhKQorICAgICAgICAgICAgICAgIHNpLT5wRGF0YSA9IChjb25zdCB2b2lkKikodmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBQYWNrZXQtPmhlYWRlciwgKGludHB0cl90KXNpLT5wRGF0YSkpOworICAgICAgICAgICAgcExvY2FsQ0lzW2ldLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8gPSBzaTsKKyAgICAgICAgfQorCisgICAgICAgIHBMb2NhbENJc1tpXS5sYXlvdXQgPSBtX29iak1hcHBlci5yZW1hcF9waXBlbGluZWxheW91dHMocExvY2FsQ0lzW2ldLmxheW91dCk7CisgICAgICAgIHBMb2NhbENJc1tpXS5iYXNlUGlwZWxpbmVIYW5kbGUgPSBtX29iak1hcHBlci5yZW1hcF9waXBlbGluZXMocExvY2FsQ0lzW2ldLmJhc2VQaXBlbGluZUhhbmRsZSk7CisgICAgfQorCisgICAgVmtQaXBlbGluZSAqbG9jYWxfcFBpcGVsaW5lcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrUGlwZWxpbmUsIHBQYWNrZXQtPmNyZWF0ZUluZm9Db3VudCk7CisKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMocmVtYXBwZWRkZXZpY2UsIHBpcGVsaW5lQ2FjaGUsIHBQYWNrZXQtPmNyZWF0ZUluZm9Db3VudCwgcExvY2FsQ0lzLCBOVUxMLCBsb2NhbF9wUGlwZWxpbmVzKTsKKworICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGFja2V0LT5jcmVhdGVJbmZvQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX3BpcGVsaW5lc19tYXAocFBhY2tldC0+cFBpcGVsaW5lc1tpXSwgbG9jYWxfcFBpcGVsaW5lc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpPHBQYWNrZXQtPmNyZWF0ZUluZm9Db3VudDsgaSsrKQorICAgICAgICBpZiAocExvY2FsQ0lzW2ldLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8pCisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURSgodm9pZCAqKXBMb2NhbENJc1tpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvKTsKKyAgICBWS1RSQUNFX0RFTEVURShwTG9jYWxDSXMpOworICAgIFZLVFJBQ0VfREVMRVRFKGxvY2FsX3BQaXBlbGluZXMpOworCisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKHBhY2tldF92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0RldmljZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICAvLyByZW1hcCBzaGFkZXJzIGZyb20gZWFjaCBzdGFnZQorICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qIHBSZW1hcHBlZFN0YWdlcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8sIHBQYWNrZXQtPnBDcmVhdGVJbmZvcy0+c3RhZ2VDb3VudCk7CisgICAgbWVtY3B5KHBSZW1hcHBlZFN0YWdlcywgcFBhY2tldC0+cENyZWF0ZUluZm9zLT5wU3RhZ2VzLCBzaXplb2YoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbykgKiBwUGFja2V0LT5wQ3JlYXRlSW5mb3MtPnN0YWdlQ291bnQpOworCisgICAgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcExvY2FsQ0lzID0gVktUUkFDRV9ORVdfQVJSQVkoVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbywgcFBhY2tldC0+Y3JlYXRlSW5mb0NvdW50KTsKKyAgICB1aW50MzJfdCBpLCBqOworICAgIGZvciAoaT0wOyBpPHBQYWNrZXQtPmNyZWF0ZUluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIG1lbWNweSgodm9pZCopJihwTG9jYWxDSXNbaV0pLCAodm9pZCopJihwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0pLCBzaXplb2YoVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbykpOworICAgICAgICBmb3IgKGo9MDsgaiA8IHBQYWNrZXQtPnBDcmVhdGVJbmZvc1tpXS5zdGFnZUNvdW50OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBSZW1hcHBlZFN0YWdlc1tqXS5tb2R1bGUgPSBtX29iak1hcHBlci5yZW1hcF9zaGFkZXJtb2R1bGVzKHBSZW1hcHBlZFN0YWdlc1tqXS5tb2R1bGUpOworICAgICAgICAgICAgaWYgKHBSZW1hcHBlZFN0YWdlc1tqXS5tb2R1bGUgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrU2hhZGVyTW9kdWxlLiIpOworICAgICAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFN0YWdlcyk7CisgICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocExvY2FsQ0lzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qKiBwcFNTQ0kgPSAoVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyoqKSYocExvY2FsQ0lzW2ldLnBTdGFnZXMpOworICAgICAgICAqcHBTU0NJID0gcFJlbWFwcGVkU3RhZ2VzOworCisgICAgICAgIHBMb2NhbENJc1tpXS5sYXlvdXQgPSBtX29iak1hcHBlci5yZW1hcF9waXBlbGluZWxheW91dHMocFBhY2tldC0+cENyZWF0ZUluZm9zW2ldLmxheW91dCk7CisgICAgICAgIGlmIChwTG9jYWxDSXNbaV0ubGF5b3V0ID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaXBlbGluZUxheW91dC4iKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFN0YWdlcyk7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwTG9jYWxDSXMpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorCisgICAgICAgIHBMb2NhbENJc1tpXS5yZW5kZXJQYXNzID0gbV9vYmpNYXBwZXIucmVtYXBfcmVuZGVycGFzc3MocFBhY2tldC0+cENyZWF0ZUluZm9zW2ldLnJlbmRlclBhc3MpOworICAgICAgICBpZiAocExvY2FsQ0lzW2ldLnJlbmRlclBhc3MgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1JlbmRlclBhc3MuIik7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRTdGFnZXMpOworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocExvY2FsQ0lzKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgIH0KKworICAgICAgICBwTG9jYWxDSXNbaV0uYmFzZVBpcGVsaW5lSGFuZGxlID0gbV9vYmpNYXBwZXIucmVtYXBfcGlwZWxpbmVzKHBQYWNrZXQtPnBDcmVhdGVJbmZvc1tpXS5iYXNlUGlwZWxpbmVIYW5kbGUpOworICAgICAgICBpZiAocExvY2FsQ0lzW2ldLmJhc2VQaXBlbGluZUhhbmRsZSA9PSBWS19OVUxMX0hBTkRMRSAmJiBwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0uYmFzZVBpcGVsaW5lSGFuZGxlICE9IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaXBlbGluZS4iKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFN0YWdlcyk7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwTG9jYWxDSXMpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorCisgICAgICAgICgoVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKilwTG9jYWxDSXNbaV0ucFZpZXdwb3J0U3RhdGUpLT5wVmlld3BvcnRzID0KKyAgICAgICAgICAgICAgICAoVmtWaWV3cG9ydCopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBQYWNrZXQtPmhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvc1tpXS5wVmlld3BvcnRTdGF0ZS0+cFZpZXdwb3J0cyk7CisgICAgICAgICgoVmtQaXBlbGluZVZpZXdwb3J0U3RhdGVDcmVhdGVJbmZvKilwTG9jYWxDSXNbaV0ucFZpZXdwb3J0U3RhdGUpLT5wU2Npc3NvcnMgPQorICAgICAgICAgICAgICAgIChWa1JlY3QyRCopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBQYWNrZXQtPmhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvc1tpXS5wVmlld3BvcnRTdGF0ZS0+cFNjaXNzb3JzKTsKKworICAgICAgICAoKFZrUGlwZWxpbmVNdWx0aXNhbXBsZVN0YXRlQ3JlYXRlSW5mbyopcExvY2FsQ0lzW2ldLnBNdWx0aXNhbXBsZVN0YXRlKS0+cFNhbXBsZU1hc2sgPQorICAgICAgICAgICAgICAgIChWa1NhbXBsZU1hc2sqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwUGFja2V0LT5oZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucE11bHRpc2FtcGxlU3RhdGUtPnBTYW1wbGVNYXNrKTsKKyAgICB9CisKKyAgICBWa1BpcGVsaW5lQ2FjaGUgcmVtYXBwZWRQaXBlbGluZUNhY2hlOworICAgIHJlbWFwcGVkUGlwZWxpbmVDYWNoZSA9IG1fb2JqTWFwcGVyLnJlbWFwX3BpcGVsaW5lY2FjaGVzKHBQYWNrZXQtPnBpcGVsaW5lQ2FjaGUpOworICAgIGlmIChyZW1hcHBlZFBpcGVsaW5lQ2FjaGUgPT0gVktfTlVMTF9IQU5ETEUgJiYgcFBhY2tldC0+cGlwZWxpbmVDYWNoZSAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1BpcGVsaW5lQ2FjaGUuIik7CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFN0YWdlcyk7CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBMb2NhbENJcyk7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgdWludDMyX3QgY3JlYXRlSW5mb0NvdW50ID0gcFBhY2tldC0+Y3JlYXRlSW5mb0NvdW50OworICAgIFZrUGlwZWxpbmUgKmxvY2FsX3BQaXBlbGluZXMgPSBWS1RSQUNFX05FV19BUlJBWShWa1BpcGVsaW5lLCBwUGFja2V0LT5jcmVhdGVJbmZvQ291bnQpOworCisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhyZW1hcHBlZERldmljZSwgcmVtYXBwZWRQaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBMb2NhbENJcywgTlVMTCwgbG9jYWxfcFBpcGVsaW5lcyk7CisKKyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhY2tldC0+Y3JlYXRlSW5mb0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b19waXBlbGluZXNfbWFwKHBQYWNrZXQtPnBQaXBlbGluZXNbaV0sIGxvY2FsX3BQaXBlbGluZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgVktUUkFDRV9ERUxFVEUocFJlbWFwcGVkU3RhZ2VzKTsKKyAgICBWS1RSQUNFX0RFTEVURShwTG9jYWxDSXMpOworICAgIFZLVFJBQ0VfREVMRVRFKGxvY2FsX3BQaXBlbGluZXMpOworCisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KHBhY2tldF92a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKworICAgIC8vIGFycmF5IHRvIHN0b3JlIHRoZSBvcmlnaW5hbCB0cmFjZS10aW1lIGxheW91dHMsIHNvIHRoYXQgd2UgY2FuIHJlbWFwIHRoZW0gaW5zaWRlIHRoZSBwYWNrZXQgYW5kIHRoZW4KKyAgICAvLyByZXN0b3JlIHRoZW0gYWZ0ZXIgcmVwbGF5aW5nIHRoZSBBUEkgY2FsbC4KKyAgICBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQqIHBTYXZlTGF5b3V0cyA9IE5VTEw7CisgICAgaWYgKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudCA+IDApIHsKKyAgICAgICAgcFNhdmVMYXlvdXRzID0gKFZrRGVzY3JpcHRvclNldExheW91dCopIHZrdHJhY2VfbWFsbG9jKHNpemVvZihWa0Rlc2NyaXB0b3JTZXRMYXlvdXQpICogcFBhY2tldC0+cENyZWF0ZUluZm8tPnNldExheW91dENvdW50KTsKKyAgICAgICAgaWYgKCFwU2F2ZUxheW91dHMpIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlJlcGxheSBvZiBDcmVhdGVQaXBlbGluZUxheW91dCBvdXQgb2YgbWVtb3J5LiIpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyAoaSA8IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5zZXRMYXlvdXRDb3VudCkgJiYgKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wU2V0TGF5b3V0cyAhPSBOVUxMKTsgaSsrKSB7CisgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCogcFNMID0gKFZrRGVzY3JpcHRvclNldExheW91dCopICYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzW2ldKTsKKyAgICAgICAgcFNhdmVMYXlvdXRzW2ldID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzW2ldOworICAgICAgICAqcFNMID0gbV9vYmpNYXBwZXIucmVtYXBfZGVzY3JpcHRvcnNldGxheW91dHMocFBhY2tldC0+cENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzW2ldKTsKKyAgICB9CisgICAgVmtQaXBlbGluZUxheW91dCBsb2NhbFBpcGVsaW5lTGF5b3V0OworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQocmVtYXBwZWREZXZpY2UsIHBQYWNrZXQtPnBDcmVhdGVJbmZvLCBOVUxMLCAmbG9jYWxQaXBlbGluZUxheW91dCk7CisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX3BpcGVsaW5lbGF5b3V0c19tYXAoKihwUGFja2V0LT5wUGlwZWxpbmVMYXlvdXQpLCBsb2NhbFBpcGVsaW5lTGF5b3V0KTsKKyAgICB9CisgICAgLy8gcmVzdG9yZSBwYWNrZXQgdG8gY29udGFpbiB0aGUgb3JpZ2luYWwgU2V0IExheW91dHMgYmVmb3JlIGJlaW5nIHJlbWFwcGVkLgorICAgIGZvciAodWludDMyX3QgayA9IDA7IGsgPCBpOyBrKyspIHsKKyAgICAgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiBwU0wgPSAoVmtEZXNjcmlwdG9yU2V0TGF5b3V0KikgJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFNldExheW91dHNba10pOworICAgICAgICAqcFNMID0gcFNhdmVMYXlvdXRzW2tdOworICAgIH0KKyAgICBpZiAocFNhdmVMYXlvdXRzICE9IE5VTEwpIHsKKyAgICAgICAgdmt0cmFjZV9mcmVlKHBTYXZlTGF5b3V0cyk7CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK3ZvaWQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NtZFdhaXRFdmVudHMocGFja2V0X3ZrQ21kV2FpdEV2ZW50cyogcFBhY2tldCkKK3sKKyAgICBWa0RldmljZSB0cmFjZURldmljZTsKKyAgICBWa0RldmljZSByZXBsYXlEZXZpY2U7CisgICAgdWludDMyX3Qgc3JjUmVwbGF5SWR4LCBkc3RSZXBsYXlJZHg7CisgICAgVmtDb21tYW5kQnVmZmVyIHJlbWFwcGVkQ29tbWFuZEJ1ZmZlciA9IG1fb2JqTWFwcGVyLnJlbWFwX2NvbW1hbmRidWZmZXJzKHBQYWNrZXQtPmNvbW1hbmRCdWZmZXIpOworICAgIGlmIChyZW1hcHBlZENvbW1hbmRCdWZmZXIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NtZFdhaXRFdmVudHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0NvbW1hbmRCdWZmZXIuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0V2ZW50KiBzYXZlRXZlbnQgPSBWS1RSQUNFX05FV19BUlJBWShWa0V2ZW50LCBwUGFja2V0LT5ldmVudENvdW50KTsKKyAgICB1aW50MzJfdCBpZHggPSAwOworICAgIHVpbnQzMl90IG51bVJlbWFwQnVmID0gMDsKKyAgICB1aW50MzJfdCBudW1SZW1hcEltZyA9IDA7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBwUGFja2V0LT5ldmVudENvdW50OyBpZHgrKykKKyAgICB7CisgICAgICAgIFZrRXZlbnQgKnBFdmVudCA9IChWa0V2ZW50ICopICYocFBhY2tldC0+cEV2ZW50c1tpZHhdKTsKKyAgICAgICAgc2F2ZUV2ZW50W2lkeF0gPSBwUGFja2V0LT5wRXZlbnRzW2lkeF07CisgICAgICAgICpwRXZlbnQgPSBtX29iak1hcHBlci5yZW1hcF9ldmVudHMocFBhY2tldC0+cEV2ZW50c1tpZHhdKTsKKyAgICAgICAgaWYgKCpwRXZlbnQgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ21kV2FpdEV2ZW50cygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRXZlbnQuIik7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShzYXZlRXZlbnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgVmtCdWZmZXIqIHNhdmVCdWYgPSBWS1RSQUNFX05FV19BUlJBWShWa0J1ZmZlciwgcFBhY2tldC0+YnVmZmVyTWVtb3J5QmFycmllckNvdW50KTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBQYWNrZXQtPmJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudDsgaWR4KyspCisgICAgeworICAgICAgICBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKnBOZXh0QnVmID0gKFZrQnVmZmVyTWVtb3J5QmFycmllciAqKSYgKHBQYWNrZXQtPnBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpZHhdKTsKKyAgICAgICAgc2F2ZUJ1ZltudW1SZW1hcEJ1ZisrXSA9IHBOZXh0QnVmLT5idWZmZXI7CisgICAgICAgIHRyYWNlRGV2aWNlID0gdHJhY2VCdWZmZXJUb0RldmljZVtwTmV4dEJ1Zi0+YnVmZmVyXTsKKyAgICAgICAgcE5leHRCdWYtPmJ1ZmZlciA9IG1fb2JqTWFwcGVyLnJlbWFwX2J1ZmZlcnMocE5leHRCdWYtPmJ1ZmZlcik7CisgICAgICAgIGlmIChwTmV4dEJ1Zi0+YnVmZmVyID09IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NtZFdhaXRFdmVudHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0J1ZmZlci4iKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHNhdmVFdmVudCk7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShzYXZlQnVmKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXBsYXlEZXZpY2UgPSByZXBsYXlCdWZmZXJUb0RldmljZVtwTmV4dEJ1Zi0+YnVmZmVyXTsKKyAgICAgICAgaWYgKGdldFF1ZXVlRmFtaWx5SWR4KHRyYWNlRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2lkeF0uc3JjUXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZXBsYXlJZHgpICYmCisgICAgICAgICAgICBnZXRRdWV1ZUZhbWlseUlkeCh0cmFjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQtPnBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpZHhdLmRzdFF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVwbGF5SWR4KSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyX3QgKikmcFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2lkeF0uc3JjUXVldWVGYW1pbHlJbmRleCkgPSBzcmNSZXBsYXlJZHg7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKSZwUGFja2V0LT5wQnVmZmVyTWVtb3J5QmFycmllcnNbaWR4XS5zcmNRdWV1ZUZhbWlseUluZGV4KSA9IGRzdFJlcGxheUlkeDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrQ21kV2FpdEV2ZW50cyBmYWlsZWQsIGJhZCBzcmNRdWV1ZUZhbWlseUluZGV4Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgVmtJbWFnZSogc2F2ZUltZyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrSW1hZ2UsIHBQYWNrZXQtPmltYWdlTWVtb3J5QmFycmllckNvdW50KTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBQYWNrZXQtPmltYWdlTWVtb3J5QmFycmllckNvdW50OyBpZHgrKykKKyAgICB7CisgICAgICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyICpwTmV4dEltZyA9IChWa0ltYWdlTWVtb3J5QmFycmllciAqKSAmKHBQYWNrZXQtPnBJbWFnZU1lbW9yeUJhcnJpZXJzW2lkeF0pOworICAgICAgICBzYXZlSW1nW251bVJlbWFwSW1nKytdID0gcE5leHRJbWctPmltYWdlOworICAgICAgICB0cmFjZURldmljZSA9IHRyYWNlSW1hZ2VUb0RldmljZVtwTmV4dEltZy0+aW1hZ2VdOworICAgICAgICBwTmV4dEltZy0+aW1hZ2UgPSBtX29iak1hcHBlci5yZW1hcF9pbWFnZXMocE5leHRJbWctPmltYWdlKTsKKyAgICAgICAgaWYgKHBOZXh0SW1nLT5pbWFnZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDbWRXYWl0RXZlbnRzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtJbWFnZS4iKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHNhdmVFdmVudCk7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShzYXZlQnVmKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHNhdmVJbWcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlcGxheURldmljZSA9IHJlcGxheUltYWdlVG9EZXZpY2VbcE5leHRJbWctPmltYWdlXTsKKyAgICAgICAgaWYgKGdldFF1ZXVlRmFtaWx5SWR4KHRyYWNlRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnNbaWR4XS5zcmNRdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlcGxheUlkeCkgJiYKKyAgICAgICAgICAgIGdldFF1ZXVlRmFtaWx5SWR4KHRyYWNlRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnNbaWR4XS5kc3RRdWV1ZUZhbWlseUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlcGxheUlkeCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopJnBQYWNrZXQtPnBJbWFnZU1lbW9yeUJhcnJpZXJzW2lkeF0uc3JjUXVldWVGYW1pbHlJbmRleCkgPSBzcmNSZXBsYXlJZHg7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKSZwUGFja2V0LT5wSW1hZ2VNZW1vcnlCYXJyaWVyc1tpZHhdLnNyY1F1ZXVlRmFtaWx5SW5kZXgpID0gZHN0UmVwbGF5SWR4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigidmtDbWRXYWl0RXZlbnRzIGZhaWxlZCwgYmFkIHNyY1F1ZXVlRmFtaWx5SW5kZXgiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX3ZrRnVuY3MucmVhbF92a0NtZFdhaXRFdmVudHMocmVtYXBwZWRDb21tYW5kQnVmZmVyLCBwUGFja2V0LT5ldmVudENvdW50LCBwUGFja2V0LT5wRXZlbnRzLCBwUGFja2V0LT5zcmNTdGFnZU1hc2ssIHBQYWNrZXQtPmRzdFN0YWdlTWFzaywgcFBhY2tldC0+bWVtb3J5QmFycmllckNvdW50LCBwUGFja2V0LT5wTWVtb3J5QmFycmllcnMsIHBQYWNrZXQtPmJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBwUGFja2V0LT5pbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnMpOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBwUGFja2V0LT5idWZmZXJNZW1vcnlCYXJyaWVyQ291bnQ7IGlkeCsrKSB7CisgICAgICAgIFZrQnVmZmVyTWVtb3J5QmFycmllciAqcE5leHRCdWYgPSAoVmtCdWZmZXJNZW1vcnlCYXJyaWVyICopICYocFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2lkeF0pOworICAgICAgICBwTmV4dEJ1Zi0+YnVmZmVyID0gc2F2ZUJ1ZltpZHhdOworICAgIH0KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBQYWNrZXQtPm1lbW9yeUJhcnJpZXJDb3VudDsgaWR4KyspIHsKKyAgICAgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBOZXh0SW1nID0gKFZrSW1hZ2VNZW1vcnlCYXJyaWVyICopICYocFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnNbaWR4XSk7CisgICAgICAgIHBOZXh0SW1nLT5pbWFnZSA9IHNhdmVJbWdbaWR4XTsKKyAgICB9CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBwUGFja2V0LT5ldmVudENvdW50OyBpZHgrKykgeworICAgICAgICBWa0V2ZW50ICpwRXZlbnQgPSAoVmtFdmVudCAqKSAmKHBQYWNrZXQtPnBFdmVudHNbaWR4XSk7CisgICAgICAgICpwRXZlbnQgPSBzYXZlRXZlbnRbaWR4XTsKKyAgICB9CisgICAgVktUUkFDRV9ERUxFVEUoc2F2ZUV2ZW50KTsKKyAgICBWS1RSQUNFX0RFTEVURShzYXZlQnVmKTsKKyAgICBWS1RSQUNFX0RFTEVURShzYXZlSW1nKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NtZFBpcGVsaW5lQmFycmllcihwYWNrZXRfdmtDbWRQaXBlbGluZUJhcnJpZXIqIHBQYWNrZXQpCit7CisgICAgVmtEZXZpY2UgdHJhY2VEZXZpY2U7CisgICAgVmtEZXZpY2UgcmVwbGF5RGV2aWNlOworICAgIHVpbnQzMl90IHNyY1JlcGxheUlkeCwgZHN0UmVwbGF5SWR4OworICAgIFZrQ29tbWFuZEJ1ZmZlciByZW1hcHBlZENvbW1hbmRCdWZmZXIgPSBtX29iak1hcHBlci5yZW1hcF9jb21tYW5kYnVmZmVycyhwUGFja2V0LT5jb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocmVtYXBwZWRDb21tYW5kQnVmZmVyID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDbWRQaXBlbGluZUJhcnJpZXIoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0NvbW1hbmRCdWZmZXIuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpZHggPSAwOworICAgIHVpbnQzMl90IG51bVJlbWFwQnVmID0gMDsKKyAgICB1aW50MzJfdCBudW1SZW1hcEltZyA9IDA7CisgICAgVmtCdWZmZXIqIHNhdmVCdWYgPSBWS1RSQUNFX05FV19BUlJBWShWa0J1ZmZlciwgcFBhY2tldC0+YnVmZmVyTWVtb3J5QmFycmllckNvdW50KTsKKyAgICBWa0ltYWdlKiBzYXZlSW1nID0gVktUUkFDRV9ORVdfQVJSQVkoVmtJbWFnZSwgcFBhY2tldC0+aW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQpOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcFBhY2tldC0+YnVmZmVyTWVtb3J5QmFycmllckNvdW50OyBpZHgrKykKKyAgICB7CisgICAgICAgIFZrQnVmZmVyTWVtb3J5QmFycmllciAqcE5leHRCdWYgPSAoVmtCdWZmZXJNZW1vcnlCYXJyaWVyICopICYocFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2lkeF0pOworICAgICAgICBzYXZlQnVmW251bVJlbWFwQnVmKytdID0gcE5leHRCdWYtPmJ1ZmZlcjsKKyAgICAgICAgdHJhY2VEZXZpY2UgPSB0cmFjZUJ1ZmZlclRvRGV2aWNlW3BOZXh0QnVmLT5idWZmZXJdOworICAgICAgICBwTmV4dEJ1Zi0+YnVmZmVyID0gbV9vYmpNYXBwZXIucmVtYXBfYnVmZmVycyhwTmV4dEJ1Zi0+YnVmZmVyKTsKKyAgICAgICAgaWYgKHBOZXh0QnVmLT5idWZmZXIgPT0gVktfTlVMTF9IQU5ETEUgJiYgc2F2ZUJ1ZltudW1SZW1hcEJ1ZiAtIDFdICE9IFZLX05VTExfSEFORExFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NtZFBpcGVsaW5lQmFycmllcigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrQnVmZmVyLiIpOworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUoc2F2ZUJ1Zik7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShzYXZlSW1nKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXBsYXlEZXZpY2UgPSByZXBsYXlCdWZmZXJUb0RldmljZVtwTmV4dEJ1Zi0+YnVmZmVyXTsKKyAgICAgICAgaWYgKGdldFF1ZXVlRmFtaWx5SWR4KHRyYWNlRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2lkeF0uc3JjUXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZXBsYXlJZHgpICYmCisgICAgICAgICAgICBnZXRRdWV1ZUZhbWlseUlkeCh0cmFjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQtPnBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpZHhdLmRzdFF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVwbGF5SWR4KSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyX3QgKikmcFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzW2lkeF0uc3JjUXVldWVGYW1pbHlJbmRleCkgPSBzcmNSZXBsYXlJZHg7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKSZwUGFja2V0LT5wQnVmZmVyTWVtb3J5QmFycmllcnNbaWR4XS5zcmNRdWV1ZUZhbWlseUluZGV4KSA9IGRzdFJlcGxheUlkeDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrQ21kUGlwZWxpbmVCYXJyaWVyIGZhaWxlZCwgYmFkIHNyY1F1ZXVlRmFtaWx5SW5kZXgiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBQYWNrZXQtPmltYWdlTWVtb3J5QmFycmllckNvdW50OyBpZHgrKykKKyAgICB7CisgICAgICAgIFZrSW1hZ2VNZW1vcnlCYXJyaWVyICpwTmV4dEltZyA9IChWa0ltYWdlTWVtb3J5QmFycmllciAqKSAmKHBQYWNrZXQtPnBJbWFnZU1lbW9yeUJhcnJpZXJzW2lkeF0pOworICAgICAgICBzYXZlSW1nW251bVJlbWFwSW1nKytdID0gcE5leHRJbWctPmltYWdlOworICAgICAgICB0cmFjZURldmljZSA9IHRyYWNlSW1hZ2VUb0RldmljZVtwTmV4dEltZy0+aW1hZ2VdOworICAgICAgICBpZiAodHJhY2VEZXZpY2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkRFQlVHOiB0cmFjZURldmljZSBpcyBOVUxMIik7CisgICAgICAgIHBOZXh0SW1nLT5pbWFnZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2ltYWdlcyhwTmV4dEltZy0+aW1hZ2UpOworICAgICAgICBpZiAocE5leHRJbWctPmltYWdlID09IFZLX05VTExfSEFORExFICYmIHNhdmVJbWdbbnVtUmVtYXBJbWcgLSAxXSAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDbWRQaXBlbGluZUJhcnJpZXIoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0ltYWdlLiIpOworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUoc2F2ZUJ1Zik7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShzYXZlSW1nKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXBsYXlEZXZpY2UgPSByZXBsYXlJbWFnZVRvRGV2aWNlW3BOZXh0SW1nLT5pbWFnZV07CisgICAgICAgIGlmIChnZXRRdWV1ZUZhbWlseUlkeCh0cmFjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQtPnBJbWFnZU1lbW9yeUJhcnJpZXJzW2lkeF0uc3JjUXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZXBsYXlJZHgpICYmCisgICAgICAgICAgICBnZXRRdWV1ZUZhbWlseUlkeCh0cmFjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQtPnBJbWFnZU1lbW9yeUJhcnJpZXJzW2lkeF0uZHN0UXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RSZXBsYXlJZHgpKQorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKSZwUGFja2V0LT5wSW1hZ2VNZW1vcnlCYXJyaWVyc1tpZHhdLnNyY1F1ZXVlRmFtaWx5SW5kZXgpID0gc3JjUmVwbGF5SWR4OworICAgICAgICAgICAgKigodWludDMyX3QgKikmcFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnNbaWR4XS5zcmNRdWV1ZUZhbWlseUluZGV4KSA9IGRzdFJlcGxheUlkeDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrUGlwZWxpbmVCYXJyaWVyIGZhaWxlZCwgYmFkIHNyY1F1ZXVlRmFtaWx5SW5kZXgiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX3ZrRnVuY3MucmVhbF92a0NtZFBpcGVsaW5lQmFycmllcihyZW1hcHBlZENvbW1hbmRCdWZmZXIsIHBQYWNrZXQtPnNyY1N0YWdlTWFzaywgcFBhY2tldC0+ZHN0U3RhZ2VNYXNrLCBwUGFja2V0LT5kZXBlbmRlbmN5RmxhZ3MsIHBQYWNrZXQtPm1lbW9yeUJhcnJpZXJDb3VudCwgcFBhY2tldC0+cE1lbW9yeUJhcnJpZXJzLCBwUGFja2V0LT5idWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIHBQYWNrZXQtPnBCdWZmZXJNZW1vcnlCYXJyaWVycywgcFBhY2tldC0+aW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIHBQYWNrZXQtPnBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcFBhY2tldC0+YnVmZmVyTWVtb3J5QmFycmllckNvdW50OyBpZHgrKykgeworICAgICAgICBWa0J1ZmZlck1lbW9yeUJhcnJpZXIgKnBOZXh0QnVmID0gKFZrQnVmZmVyTWVtb3J5QmFycmllciAqKSAmKHBQYWNrZXQtPnBCdWZmZXJNZW1vcnlCYXJyaWVyc1tpZHhdKTsKKyAgICAgICAgcE5leHRCdWYtPmJ1ZmZlciA9IHNhdmVCdWZbaWR4XTsKKyAgICB9CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBwUGFja2V0LT5pbWFnZU1lbW9yeUJhcnJpZXJDb3VudDsgaWR4KyspIHsKKyAgICAgICAgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKnBOZXh0SW1nID0gKFZrSW1hZ2VNZW1vcnlCYXJyaWVyICopICYocFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnNbaWR4XSk7CisgICAgICAgIHBOZXh0SW1nLT5pbWFnZSA9IHNhdmVJbWdbaWR4XTsKKyAgICB9CisgICAgVktUUkFDRV9ERUxFVEUoc2F2ZUJ1Zik7CisgICAgVktUUkFDRV9ERUxFVEUoc2F2ZUltZyk7CisgICAgcmV0dXJuOworfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlRnJhbWVidWZmZXIocGFja2V0X3ZrQ3JlYXRlRnJhbWVidWZmZXIqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisgICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDcmVhdGVGcmFtZWJ1ZmZlcigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvICpwSW5mbyA9IChWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyAqKSBwUGFja2V0LT5wQ3JlYXRlSW5mbzsKKyAgICBWa0ltYWdlVmlldyAqcEF0dGFjaG1lbnRzLCAqcFNhdmVkQXR0YWNobWVudHMgPSAoVmtJbWFnZVZpZXcqKXBJbmZvLT5wQXR0YWNobWVudHM7CisgICAgYm9vbCBhbGxvY2F0ZWRBdHRhY2htZW50cyA9IGZhbHNlOworICAgIGlmIChwU2F2ZWRBdHRhY2htZW50cyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYWxsb2NhdGVkQXR0YWNobWVudHMgPSB0cnVlOworICAgICAgICBwQXR0YWNobWVudHMgPSBWS1RSQUNFX05FV19BUlJBWShWa0ltYWdlVmlldywgcEluZm8tPmF0dGFjaG1lbnRDb3VudCk7CisgICAgICAgIG1lbWNweShwQXR0YWNobWVudHMsIHBTYXZlZEF0dGFjaG1lbnRzLCBzaXplb2YoVmtJbWFnZVZpZXcpICogcEluZm8tPmF0dGFjaG1lbnRDb3VudCk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwSW5mby0+YXR0YWNobWVudENvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBdHRhY2htZW50c1tpXSA9IG1fb2JqTWFwcGVyLnJlbWFwX2ltYWdldmlld3MocEluZm8tPnBBdHRhY2htZW50c1tpXSk7CisgICAgICAgICAgICBpZiAocEF0dGFjaG1lbnRzW2ldID09IFZLX05VTExfSEFORExFICYmIHBJbmZvLT5wQXR0YWNobWVudHNbaV0gIT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDcmVhdGVGcmFtZWJ1ZmZlcigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrSW1hZ2VWaWV3LiIpOworICAgICAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBBdHRhY2htZW50cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwSW5mby0+cEF0dGFjaG1lbnRzID0gcEF0dGFjaG1lbnRzOworICAgIH0KKyAgICBWa1JlbmRlclBhc3Mgc2F2ZWRSUCA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5yZW5kZXJQYXNzOworICAgIHBJbmZvLT5yZW5kZXJQYXNzID0gbV9vYmpNYXBwZXIucmVtYXBfcmVuZGVycGFzc3MocFBhY2tldC0+cENyZWF0ZUluZm8tPnJlbmRlclBhc3MpOworICAgIGlmIChwSW5mby0+cmVuZGVyUGFzcyA9PSBWS19OVUxMX0hBTkRMRSAmJiBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cmVuZGVyUGFzcyAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlRnJhbWVidWZmZXIoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1JlbmRlclBhc3MuIik7CisgICAgICAgIGlmIChhbGxvY2F0ZWRBdHRhY2htZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocEF0dGFjaG1lbnRzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrRnJhbWVidWZmZXIgbG9jYWxfZnJhbWVidWZmZXI7CisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVGcmFtZWJ1ZmZlcihyZW1hcHBlZERldmljZSwgcFBhY2tldC0+cENyZWF0ZUluZm8sIE5VTEwsICZsb2NhbF9mcmFtZWJ1ZmZlcik7CisgICAgcEluZm8tPnBBdHRhY2htZW50cyA9IHBTYXZlZEF0dGFjaG1lbnRzOworICAgIHBJbmZvLT5yZW5kZXJQYXNzID0gc2F2ZWRSUDsKKyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBtX29iak1hcHBlci5hZGRfdG9fZnJhbWVidWZmZXJzX21hcCgqKHBQYWNrZXQtPnBGcmFtZWJ1ZmZlciksIGxvY2FsX2ZyYW1lYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKGFsbG9jYXRlZEF0dGFjaG1lbnRzKQorICAgIHsKKyAgICAgICAgVktUUkFDRV9ERUxFVEUoKHZvaWQqKXBBdHRhY2htZW50cyk7CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVSZW5kZXJQYXNzKHBhY2tldF92a0NyZWF0ZVJlbmRlclBhc3MqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisgICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDcmVhdGVSZW5kZXJQYXNzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtSZW5kZXJQYXNzIGxvY2FsX3JlbmRlcnBhc3M7CisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVSZW5kZXJQYXNzKHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5wQ3JlYXRlSW5mbywgTlVMTCwgJmxvY2FsX3JlbmRlcnBhc3MpOworICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b19yZW5kZXJwYXNzc19tYXAoKihwUGFja2V0LT5wUmVuZGVyUGFzcyksIGxvY2FsX3JlbmRlcnBhc3MpOworICAgIH0KKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCit2b2lkIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDbWRCZWdpblJlbmRlclBhc3MocGFja2V0X3ZrQ21kQmVnaW5SZW5kZXJQYXNzKiBwUGFja2V0KQoreworICAgIFZrQ29tbWFuZEJ1ZmZlciByZW1hcHBlZENvbW1hbmRCdWZmZXIgPSBtX29iak1hcHBlci5yZW1hcF9jb21tYW5kYnVmZmVycyhwUGFja2V0LT5jb21tYW5kQnVmZmVyKTsKKyAgICBpZiAocmVtYXBwZWRDb21tYW5kQnVmZmVyID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDbWRCZWdpblJlbmRlclBhc3MoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0NvbW1hbmRCdWZmZXIuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIGxvY2FsX3JlbmRlclBhc3NCZWdpbkluZm87CisgICAgbWVtY3B5KCh2b2lkKikmbG9jYWxfcmVuZGVyUGFzc0JlZ2luSW5mbywgKHZvaWQqKXBQYWNrZXQtPnBSZW5kZXJQYXNzQmVnaW4sIHNpemVvZihWa1JlbmRlclBhc3NCZWdpbkluZm8pKTsKKyAgICBsb2NhbF9yZW5kZXJQYXNzQmVnaW5JbmZvLnBDbGVhclZhbHVlcyA9IChjb25zdCBWa0NsZWFyVmFsdWUqKXBQYWNrZXQtPnBSZW5kZXJQYXNzQmVnaW4tPnBDbGVhclZhbHVlczsKKyAgICBsb2NhbF9yZW5kZXJQYXNzQmVnaW5JbmZvLmZyYW1lYnVmZmVyID0gbV9vYmpNYXBwZXIucmVtYXBfZnJhbWVidWZmZXJzKHBQYWNrZXQtPnBSZW5kZXJQYXNzQmVnaW4tPmZyYW1lYnVmZmVyKTsKKyAgICBpZiAobG9jYWxfcmVuZGVyUGFzc0JlZ2luSW5mby5mcmFtZWJ1ZmZlciA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ21kQmVnaW5SZW5kZXJQYXNzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtGcmFtZWJ1ZmZlci4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2NhbF9yZW5kZXJQYXNzQmVnaW5JbmZvLnJlbmRlclBhc3MgPSBtX29iak1hcHBlci5yZW1hcF9yZW5kZXJwYXNzcyhwUGFja2V0LT5wUmVuZGVyUGFzc0JlZ2luLT5yZW5kZXJQYXNzKTsKKyAgICBpZiAobG9jYWxfcmVuZGVyUGFzc0JlZ2luSW5mby5yZW5kZXJQYXNzID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDbWRCZWdpblJlbmRlclBhc3MoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1JlbmRlclBhc3MuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV92a0Z1bmNzLnJlYWxfdmtDbWRCZWdpblJlbmRlclBhc3MocmVtYXBwZWRDb21tYW5kQnVmZmVyLCAmbG9jYWxfcmVuZGVyUGFzc0JlZ2luSW5mbywgcFBhY2tldC0+Y29udGVudHMpOworICAgIHJldHVybjsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0JlZ2luQ29tbWFuZEJ1ZmZlcihwYWNrZXRfdmtCZWdpbkNvbW1hbmRCdWZmZXIqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtDb21tYW5kQnVmZmVyIHJlbWFwcGVkQ29tbWFuZEJ1ZmZlciA9IG1fb2JqTWFwcGVyLnJlbWFwX2NvbW1hbmRidWZmZXJzKHBQYWNrZXQtPmNvbW1hbmRCdWZmZXIpOworICAgIGlmIChyZW1hcHBlZENvbW1hbmRCdWZmZXIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0JlZ2luQ29tbWFuZEJ1ZmZlcigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrQ29tbWFuZEJ1ZmZlci4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8qIHBJbmZvID0gKFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyopcFBhY2tldC0+cEJlZ2luSW5mbzsKKyAgICBWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gKnBIaW5mbyA9IChWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8gKikgKChwSW5mbykgPyBwSW5mby0+cEluaGVyaXRhbmNlSW5mbyA6IE5VTEwpOworICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIFJQICYgRkIsIHRoZW4gb3ZlcndyaXRlIHBhY2tldCB3aXRoIHJlbWFwcGVkIHZhbHVlcworICAgIFZrUmVuZGVyUGFzcyBzYXZlZFJQLCAqcFJQOworICAgIFZrRnJhbWVidWZmZXIgc2F2ZWRGQiwgKnBGQjsKKyAgICBpZiAocEluZm8gIT0gTlVMTCAmJiBwSGluZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNhdmVkUlAgPSBwSGluZm8tPnJlbmRlclBhc3M7CisgICAgICAgIHNhdmVkRkIgPSBwSGluZm8tPmZyYW1lYnVmZmVyOworICAgICAgICBwUlAgPSAmKHBIaW5mby0+cmVuZGVyUGFzcyk7CisgICAgICAgIHBGQiA9ICYocEhpbmZvLT5mcmFtZWJ1ZmZlcik7CisgICAgICAgICpwUlAgPSBtX29iak1hcHBlci5yZW1hcF9yZW5kZXJwYXNzcyhzYXZlZFJQKTsKKyAgICAgICAgKnBGQiA9IG1fb2JqTWFwcGVyLnJlbWFwX2ZyYW1lYnVmZmVycyhzYXZlZEZCKTsKKyAgICB9CisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtCZWdpbkNvbW1hbmRCdWZmZXIocmVtYXBwZWRDb21tYW5kQnVmZmVyLCBwUGFja2V0LT5wQmVnaW5JbmZvKTsKKyAgICBpZiAocEluZm8gIT0gTlVMTCAmJiBwSGluZm8gIT0gTlVMTCkgeworICAgICAgICBwSGluZm8tPnJlbmRlclBhc3MgPSBzYXZlZFJQOworICAgICAgICBwSGluZm8tPmZyYW1lYnVmZmVyID0gc2F2ZWRGQjsKKyAgICB9CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworLy8gVE9ETzEzOCA6IENhbiB3ZSBraWxsIHRoaXM/CisvL1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtTdG9yZVBpcGVsaW5lKHBhY2tldF92a1N0b3JlUGlwZWxpbmUqIHBQYWNrZXQpCisvL3sKKy8vICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vCisvLyAgICBWa0RldmljZSByZW1hcHBlZERldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2RldmljZXMocFBhY2tldC0+ZGV2aWNlKTsKKy8vICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKy8vICAgIHsKKy8vICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1N0b3JlUGlwZWxpbmUoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0RldmljZS4iKTsKKy8vICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworLy8gICAgfQorLy8KKy8vICAgIFZrUGlwZWxpbmUgcmVtYXBwZWRQaXBlbGluZSA9IG1fb2JqTWFwcGVyLnJlbWFwKHBQYWNrZXQtPnBpcGVsaW5lKTsKKy8vICAgIGlmIChyZW1hcHBlZFBpcGVsaW5lID09IFZLX05VTExfSEFORExFKQorLy8gICAgeworLy8gICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrU3RvcmVQaXBlbGluZSgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrUGlwZWxpbmUuIik7CisvLyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vICAgIH0KKy8vCisvLyAgICBzaXplX3Qgc2l6ZSA9IDA7CisvLyAgICB2b2lkKiBwRGF0YSA9IE5VTEw7CisvLyAgICBpZiAocFBhY2tldC0+cERhdGEgIT0gTlVMTCAmJiBwUGFja2V0LT5wRGF0YVNpemUgIT0gTlVMTCkKKy8vICAgIHsKKy8vICAgICAgICBzaXplID0gKnBQYWNrZXQtPnBEYXRhU2l6ZTsKKy8vICAgICAgICBwRGF0YSA9IHZrdHJhY2VfbWFsbG9jKCpwUGFja2V0LT5wRGF0YVNpemUpOworLy8gICAgfQorLy8gICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtTdG9yZVBpcGVsaW5lKHJlbWFwcGVkRGV2aWNlLCByZW1hcHBlZFBpcGVsaW5lLCAmc2l6ZSwgcERhdGEpOworLy8gICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorLy8gICAgeworLy8gICAgICAgIGlmIChzaXplICE9ICpwUGFja2V0LT5wRGF0YVNpemUgJiYgcERhdGEgIT0gTlVMTCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygidmtTdG9yZVBpcGVsaW5lIHJldHVybmVkIGEgZGlmZmVyaW5nIGRhdGEgc2l6ZTogcmVwbGF5ICglZCBieXRlcykgdnMgdHJhY2UgKCVkIGJ5dGVzKS4iLCBzaXplLCAqcFBhY2tldC0+cERhdGFTaXplKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgZWxzZSBpZiAocERhdGEgIT0gTlVMTCAmJiBtZW1jbXAocERhdGEsIHBQYWNrZXQtPnBEYXRhLCBzaXplKSAhPSAwKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJ2a1N0b3JlUGlwZWxpbmUgcmV0dXJuZWQgZGlmZmVyaW5nIGRhdGEgY29udGVudHMgdGhhbiB0aGUgdHJhY2UgZmlsZSBjb250YWluZWQuIik7CisvLyAgICAgICAgfQorLy8gICAgfQorLy8gICAgdmt0cmFjZV9mcmVlKHBEYXRhKTsKKy8vICAgIHJldHVybiByZXBsYXlSZXN1bHQ7CisvL30KKworLy8gVE9ETzEzOCA6IFRoaXMgbmVlZHMgdG8gYmUgYnJva2VuIG91dCBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucyBmb3IgZWFjaCBub24tZGlzcCBvYmplY3QKKy8vVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0Rlc3Ryb3k8T2JqZWN0PihwYWNrZXRfdmtEZXN0cm95T2JqZWN0KiBwUGFja2V0KQorLy97CisvLyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisvLworLy8gICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisvLyAgICBpZiAocmVtYXBwZWREZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpCisvLyAgICB7CisvLyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtEZXN0cm95KCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisvLyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKy8vICAgIH0KKy8vCisvLyAgICB1aW50NjRfdCByZW1hcEhhbmRsZSA9IG1fb2JqTWFwcGVyLnJlbWFwXzxPQkpFQ1RfVFlQRV9IRVJFPihwUGFja2V0LT5vYmplY3QsIHBQYWNrZXQtPm9ialR5cGUpOworLy8gICAgPFZrT2JqZWN0PiBvYmplY3Q7CisvLyAgICBvYmplY3QuaGFuZGxlID0gcmVtYXBIYW5kbGU7CisvLyAgICBpZiAob2JqZWN0ICE9IDApCisvLyAgICAgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtEZXN0cm95PE9iamVjdD4ocmVtYXBwZWREZXZpY2UsIG9iamVjdCk7CisvLyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpCisvLyAgICAgICAgbV9vYmpNYXBwZXIucm1fZnJvbV88T0JKRUNUX1RZUEVfSEVSRT5fbWFwKHBQYWNrZXQtPm9iamVjdC5oYW5kbGUpOworLy8gICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKKy8vfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrV2FpdEZvckZlbmNlcyhwYWNrZXRfdmtXYWl0Rm9yRmVuY2VzKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB1aW50MzJfdCBpOworCisgICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisgICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtXYWl0Rm9yRmVuY2VzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtGZW5jZSAqcEZlbmNlID0gVktUUkFDRV9ORVdfQVJSQVkoVmtGZW5jZSwgcFBhY2tldC0+ZmVuY2VDb3VudCk7CisgICAgZm9yIChpID0gMDsgaSA8IHBQYWNrZXQtPmZlbmNlQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgICgqKHBGZW5jZSArIGkpKSA9IG1fb2JqTWFwcGVyLnJlbWFwX2ZlbmNlcygoKihwUGFja2V0LT5wRmVuY2VzICsgaSkpKTsKKyAgICAgICAgaWYgKCoocEZlbmNlICsgaSkgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrV2FpdEZvckZlbmNlcygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRmVuY2UuIik7CisgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwRmVuY2UpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocFBhY2tldC0+cmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a1dhaXRGb3JGZW5jZXMocmVtYXBwZWREZXZpY2UsIHBQYWNrZXQtPmZlbmNlQ291bnQsIHBGZW5jZSwgcFBhY2tldC0+d2FpdEFsbCwgVUlOVDY0X01BWCk7Ly8gbWVhbiBhcyBsb25nIGFzIHBvc3NpYmxlCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwUGFja2V0LT5yZXN1bHQgPT0gVktfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtXYWl0Rm9yRmVuY2VzKHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5mZW5jZUNvdW50LCBwRmVuY2UsIHBQYWNrZXQtPndhaXRBbGwsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtXYWl0Rm9yRmVuY2VzKHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5mZW5jZUNvdW50LCBwRmVuY2UsIHBQYWNrZXQtPndhaXRBbGwsIHBQYWNrZXQtPnRpbWVvdXQpOworICAgICAgICB9CisgICAgfQorICAgIFZLVFJBQ0VfREVMRVRFKHBGZW5jZSk7CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworYm9vbCB2a1JlcGxheTo6Z2V0TWVtb3J5VHlwZUlkeChWa0RldmljZSB0cmFjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2UgcmVwbGF5RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFjZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBSZXBsYXlJZHgpCit7CisgICAgVmtQaHlzaWNhbERldmljZSB0cmFjZVBoeXNpY2FsRGV2aWNlOworICAgIFZrUGh5c2ljYWxEZXZpY2UgcmVwbGF5UGh5c2ljYWxEZXZpY2U7CisgICAgYm9vbCBmb3VuZE1hdGNoID0gZmFsc2U7CisgICAgdWludDMyX3QgaSxqOworCisgICAgaWYgKHRyYWNlUGh5c2ljYWxEZXZpY2VzLmZpbmQodHJhY2VEZXZpY2UpID09IHRyYWNlUGh5c2ljYWxEZXZpY2VzLmVuZCgpIHx8CisgICAgICAgIHJlcGxheVBoeXNpY2FsRGV2aWNlcy5maW5kKHJlcGxheURldmljZSkgPT0gcmVwbGF5UGh5c2ljYWxEZXZpY2VzLmVuZCgpKQorICAgIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHRyYWNlUGh5c2ljYWxEZXZpY2UgPSB0cmFjZVBoeXNpY2FsRGV2aWNlc1t0cmFjZURldmljZV07CisgICAgcmVwbGF5UGh5c2ljYWxEZXZpY2UgPSByZXBsYXlQaHlzaWNhbERldmljZXNbcmVwbGF5RGV2aWNlXTsKKworICAgIGlmIChtaW4odHJhY2VNZW1vcnlQcm9wZXJ0aWVzW3RyYWNlUGh5c2ljYWxEZXZpY2VdLm1lbW9yeVR5cGVDb3VudCwgcmVwbGF5TWVtb3J5UHJvcGVydGllc1tyZXBsYXlQaHlzaWNhbERldmljZV0ubWVtb3J5VHlwZUNvdW50KSA9PSAwKQorICAgIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBtaW4odHJhY2VNZW1vcnlQcm9wZXJ0aWVzW3RyYWNlUGh5c2ljYWxEZXZpY2VdLm1lbW9yeVR5cGVDb3VudCwgcmVwbGF5TWVtb3J5UHJvcGVydGllc1tyZXBsYXlQaHlzaWNhbERldmljZV0ubWVtb3J5VHlwZUNvdW50KTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHRyYWNlTWVtb3J5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5tZW1vcnlUeXBlc1t0cmFjZUlkeF0ucHJvcGVydHlGbGFncyA9PSByZXBsYXlNZW1vcnlQcm9wZXJ0aWVzW3JlcGxheVBoeXNpY2FsRGV2aWNlXS5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzKQorICAgICAgICB7CisgICAgICAgICAgICAqcFJlcGxheUlkeCA9IGk7CisgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZE1hdGNoKQorICAgIHsKKyAgICAgICAgLy8gRGlkbid0IGZpbmQgYW4gZXhhY3QgbWF0Y2gsIHNlYXJjaCBmb3IgYSBzdXBlcnNldAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWluKHRyYWNlTWVtb3J5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5tZW1vcnlUeXBlQ291bnQsIHJlcGxheU1lbW9yeVByb3BlcnRpZXNbcmVwbGF5UGh5c2ljYWxEZXZpY2VdLm1lbW9yeVR5cGVDb3VudCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyYWNlTWVtb3J5UHJvcGVydGllc1t0cmFjZVBoeXNpY2FsRGV2aWNlXS5tZW1vcnlUeXBlc1t0cmFjZUlkeF0ucHJvcGVydHlGbGFncyA9PQorICAgICAgICAgICAgICAgICh0cmFjZU1lbW9yeVByb3BlcnRpZXNbdHJhY2VQaHlzaWNhbERldmljZV0ubWVtb3J5VHlwZXNbdHJhY2VJZHhdLnByb3BlcnR5RmxhZ3MgJiByZXBsYXlNZW1vcnlQcm9wZXJ0aWVzW3JlcGxheVBoeXNpY2FsRGV2aWNlXS5tZW1vcnlUeXBlc1tpXS5wcm9wZXJ0eUZsYWdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcFJlcGxheUlkeCA9IGk7CisgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kTWF0Y2gpCisgICAgeworICAgICAgICAvLyBEaWRuJ3QgZmluZCBhIHN1cGVyc2V0LCBzZWFyY2ggZm9yIG1lbSB0eXBlIHdpdGggYm90aCBIT1NUX1ZJU0lCTEUgYW5kIEhPU1RfQ09IRVJFTlQgc2V0CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXBsYXlNZW1vcnlQcm9wZXJ0aWVzW3JlcGxheVBoeXNpY2FsRGV2aWNlXS5tZW1vcnlUeXBlQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVHxWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9DT0hFUkVOVF9CSVQpICYgcmVwbGF5TWVtb3J5UHJvcGVydGllc1tyZXBsYXlQaHlzaWNhbERldmljZV0ubWVtb3J5VHlwZXNbaV0ucHJvcGVydHlGbGFncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcFJlcGxheUlkeCA9IGk7CisgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmRNYXRjaCkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVwbGF5TWVtb3J5UHJvcGVydGllcyBpZGVudGljYWwgdG8gdGhlIG9uZSB0aGF0IG1hdGNoZWQuCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSwgcHJpbnQgYSB3YXJuaW5nIGFuZCB1c2UgdGhlIGluZGV4IGZyb20gdGhlIHRyYWNlIGZpbGUuCisgICAgICAgIGZvciAoaiA9IGkrMTsgaiA8IHJlcGxheU1lbW9yeVByb3BlcnRpZXNbcmVwbGF5UGh5c2ljYWxEZXZpY2VdLm1lbW9yeVR5cGVDb3VudDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVwbGF5TWVtb3J5UHJvcGVydGllc1tyZXBsYXlQaHlzaWNhbERldmljZV0ubWVtb3J5VHlwZXNbaV0ucHJvcGVydHlGbGFncyA9PSByZXBsYXlNZW1vcnlQcm9wZXJ0aWVzW3JlcGxheVBoeXNpY2FsRGV2aWNlXS5tZW1vcnlUeXBlc1tqXS5wcm9wZXJ0eUZsYWdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygibWVtb3J5VHlwZXMgcHJvcGVydHlGbGFncyBpZGVudGljYWwgaW4gdHdvIG9yIG1vcmUgZW50cmllcywgdXNpbmcgaWR4ICVkIGZyb20gdHJhY2UiLCB0cmFjZUlkeCk7CisgICAgICAgICAgICAgICAgKnBSZXBsYXlJZHggPSB0cmFjZUlkeDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgIH0KKworZmFpbDoKKyAgICAvLyBEaWRuJ3QgZmluZCBhIG1hdGNoCisgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ2Fubm90IGRldGVybWluZSBtZW1vcnkgdHlwZSBkdXJpbmcgdmtBbGxvY2F0ZU1lbW9yeSAtIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHZrQWxsb2NhdGVNZW1vcnkuIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtBbGxvY2F0ZU1lbW9yeShwYWNrZXRfdmtBbGxvY2F0ZU1lbW9yeSogcFBhY2tldCkKK3sKKyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgZ3B1TWVtT2JqIGxvY2FsX21lbTsKKworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQWxsb2NhdGVNZW1vcnkoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0RldmljZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBpZiAocFBhY2tldC0+cEFsbG9jYXRlSW5mby0+cE5leHQpCisgICAgeworCQlWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViogeCA9IChWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViopKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPnBOZXh0KTsKKworCQlpZiAoeC0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfREVESUNBVEVEX0FMTE9DQVRJT05fTUVNT1JZX0FMTE9DQVRFX0lORk9fTlYpCisgICAgICAgeworICAgICAgICAgICAgeC0+aW1hZ2UgPSBtX29iak1hcHBlci5yZW1hcF9pbWFnZXMoeC0+aW1hZ2UpOworICAgICAgICAgICAgeC0+YnVmZmVyID0gbV9vYmpNYXBwZXIucmVtYXBfYnVmZmVycyh4LT5idWZmZXIpOworICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1fb2JqTWFwcGVyLm1fYWRqdXN0Rm9yR1BVKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgcmVwbGF5SWR4OworICAgICAgICBpZiAoZ2V0TWVtb3J5VHlwZUlkeChwUGFja2V0LT5kZXZpY2UsIHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5tZW1vcnlUeXBlSW5kZXgsICZyZXBsYXlJZHgpKQorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzJfdCopJnBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPm1lbW9yeVR5cGVJbmRleCkgPSByZXBsYXlJZHg7CisgICAgICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0FsbG9jYXRlTWVtb3J5KHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLCBOVUxMLCAmbG9jYWxfbWVtLnJlcGxheUdwdU1lbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJ2a0FsbG9jYXRlTWVtb3J5KCkgZmFpbGVkLCBjb3VsZG4ndCBmaW5kIG1lbW9yeSB0eXBlIGZvciBtZW1vcnlUeXBlSW5kZXgiKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTIHx8IG1fb2JqTWFwcGVyLm1fYWRqdXN0Rm9yR1BVKQorICAgIHsKKyAgICAgICAgbG9jYWxfbWVtLnBHcHVNZW0gPSBuZXcgKGdwdU1lbW9yeSk7CisgICAgICAgIGlmIChsb2NhbF9tZW0ucEdwdU1lbSkKKyAgICAgICAgICAgIGxvY2FsX21lbS5wR3B1TWVtLT5zZXRBbGxvY0luZm8ocFBhY2tldC0+cEFsbG9jYXRlSW5mbywgbV9vYmpNYXBwZXIubV9hZGp1c3RGb3JHUFUpOworICAgICAgICBtX29iak1hcHBlci5hZGRfdG9fZGV2aWNlbWVtb3J5c19tYXAoKihwUGFja2V0LT5wTWVtb3J5KSwgbG9jYWxfbWVtKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKwordm9pZCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrRnJlZU1lbW9yeShwYWNrZXRfdmtGcmVlTWVtb3J5KiBwUGFja2V0KQoreworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrRnJlZU1lbW9yeSgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ3B1TWVtT2JqIGxvY2FsX21lbTsKKyAgICBsb2NhbF9tZW0gPSBtX29iak1hcHBlci5tX2RldmljZW1lbW9yeXMuZmluZChwUGFja2V0LT5tZW1vcnkpLT5zZWNvbmQ7CisgICAgLy8gVE9ETyBob3cvd2hlbiB0byBmcmVlIHBlbmRpbmdBbGxvYyB0aGF0IGRpZCBub3QgdXNlIGFuZCBleGlzdGluZyBncHVNZW1PYmoKKyAgICBtX3ZrRnVuY3MucmVhbF92a0ZyZWVNZW1vcnkocmVtYXBwZWREZXZpY2UsIGxvY2FsX21lbS5yZXBsYXlHcHVNZW0sIE5VTEwpOworICAgIGRlbGV0ZSBsb2NhbF9tZW0ucEdwdU1lbTsKKyAgICBtX29iak1hcHBlci5ybV9mcm9tX2RldmljZW1lbW9yeXNfbWFwKHBQYWNrZXQtPm1lbW9yeSk7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtNYXBNZW1vcnkocGFja2V0X3ZrTWFwTWVtb3J5KiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrTWFwTWVtb3J5KCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgZ3B1TWVtT2JqIGxvY2FsX21lbSA9IG1fb2JqTWFwcGVyLm1fZGV2aWNlbWVtb3J5cy5maW5kKHBQYWNrZXQtPm1lbW9yeSktPnNlY29uZDsKKyAgICB2b2lkKiBwRGF0YTsKKyAgICBpZiAoIWxvY2FsX21lbS5wR3B1TWVtLT5pc1BlbmRpbmdBbGxvYygpKQorICAgIHsKKyAgICAgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtNYXBNZW1vcnkocmVtYXBwZWREZXZpY2UsIGxvY2FsX21lbS5yZXBsYXlHcHVNZW0sIHBQYWNrZXQtPm9mZnNldCwgcFBhY2tldC0+c2l6ZSwgcFBhY2tldC0+ZmxhZ3MsICZwRGF0YSk7CisgICAgICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvY2FsX21lbS5wR3B1TWVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsX21lbS5wR3B1TWVtLT5zZXRNZW1vcnlNYXBSYW5nZShwRGF0YSwgKHNpemVfdClwUGFja2V0LT5zaXplLCAoc2l6ZV90KXBQYWNrZXQtPm9mZnNldCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChsb2NhbF9tZW0ucEdwdU1lbSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWxfbWVtLnBHcHVNZW0tPnNldE1lbW9yeU1hcFJhbmdlKE5VTEwsIChzaXplX3QpcFBhY2tldC0+c2l6ZSwgKHNpemVfdClwUGFja2V0LT5vZmZzZXQsIHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK3ZvaWQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a1VubWFwTWVtb3J5KHBhY2tldF92a1VubWFwTWVtb3J5KiBwUGFja2V0KQoreworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1VubWFwTWVtb3J5KCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBncHVNZW1PYmogbG9jYWxfbWVtID0gbV9vYmpNYXBwZXIubV9kZXZpY2VtZW1vcnlzLmZpbmQocFBhY2tldC0+bWVtb3J5KS0+c2Vjb25kOworICAgIGlmICghbG9jYWxfbWVtLnBHcHVNZW0tPmlzUGVuZGluZ0FsbG9jKCkpCisgICAgeworICAgICAgICBpZiAobG9jYWxfbWVtLnBHcHVNZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwUGFja2V0LT5wRGF0YSkKKyAgICAgICAgICAgICAgICBsb2NhbF9tZW0ucEdwdU1lbS0+Y29weU1hcHBpbmdEYXRhKHBQYWNrZXQtPnBEYXRhLCB0cnVlLCAwLCAwKTsgIC8vIGNvcGllcyBkYXRhIGZyb20gcGFja2V0IGludG8gbWVtb3J5IGJ1ZmZlcgorICAgICAgICB9CisgICAgICAgIG1fdmtGdW5jcy5yZWFsX3ZrVW5tYXBNZW1vcnkocmVtYXBwZWREZXZpY2UsIGxvY2FsX21lbS5yZXBsYXlHcHVNZW0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAobG9jYWxfbWVtLnBHcHVNZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBCdWYgPSAodW5zaWduZWQgY2hhciAqKSB2a3RyYWNlX21hbGxvYyhsb2NhbF9tZW0ucEdwdU1lbS0+Z2V0TWVtb3J5TWFwU2l6ZSgpKTsKKyAgICAgICAgICAgIGlmICghcEJ1ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJ2a1VubWFwTWVtb3J5KCkgbWFsbG9jIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2FsX21lbS5wR3B1TWVtLT5zZXRNZW1vcnlEYXRhQWRkcihwQnVmKTsKKyAgICAgICAgICAgIGxvY2FsX21lbS5wR3B1TWVtLT5jb3B5TWFwcGluZ0RhdGEocFBhY2tldC0+cERhdGEsIHRydWUsIDAsIDApOworICAgICAgICB9CisgICAgfQorfQorCitCT09MIGlzdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc1NwZWNpYWwoUEJZVEUgcE9QVFBhY2thZ2VEYXRhKQoreworICAgIEJPT0wgYlJldCA9IEZBTFNFOworICAgIFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8gKnBDaGFuZ2VkSW5mb0FycmF5ID0gKFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8gKilwT1BUUGFja2FnZURhdGE7CisgICAgaWYgKCgodWludDY0X3QpcENoYW5nZWRJbmZvQXJyYXlbMF0ucmVzZXJ2ZTApICYgUEFHRUdVQVJEX1NQRUNJQUxfRk9STUFUX1BBQ0tFVF9GT1JfVktGTFVTSE1BUFBFRE1FTU9SWVJBTkdFUykgLy8gVE9ETyBuZWVkIHRoaW5rIGFib3V0IDMyYml0CisgICAgeworICAgICAgICBiUmV0ID0gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIGJSZXQ7Cit9CisKKy8vYWZ0ZXIgT1BUIHNwZWVkIHVwLCB0aGUgZm9ybWF0IG9mIHRoaXMgcGFja2V0IHdpbGwgYmUgZGlmZmVyZW50IHdpdGggYmVmb3JlLCB0aGUgcGFja2V0IG5vdyBvbmx5IGluY2x1ZGUgY2hhbmdlZCBibG9jayhwYWdlKS4KKy8vCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMocGFja2V0X3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtEZXZpY2UgcmVtYXBwZWREZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VzKHBQYWNrZXQtPmRldmljZSk7CisgICAgaWYgKHJlbWFwcGVkRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrTWFwcGVkTWVtb3J5UmFuZ2UqIGxvY2FsUmFuZ2VzID0gVktUUkFDRV9ORVdfQVJSQVkoVmtNYXBwZWRNZW1vcnlSYW5nZSwgcFBhY2tldC0+bWVtb3J5UmFuZ2VDb3VudCk7CisgICAgbWVtY3B5KGxvY2FsUmFuZ2VzLCBwUGFja2V0LT5wTWVtb3J5UmFuZ2VzLCBzaXplb2YoVmtNYXBwZWRNZW1vcnlSYW5nZSkgKiAocFBhY2tldC0+bWVtb3J5UmFuZ2VDb3VudCkpOworCisgICAgZ3B1TWVtT2JqKiBwTG9jYWxNZW1zID0gVktUUkFDRV9ORVdfQVJSQVkoZ3B1TWVtT2JqLCBwUGFja2V0LT5tZW1vcnlSYW5nZUNvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+bWVtb3J5UmFuZ2VDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgcExvY2FsTWVtc1tpXSA9IG1fb2JqTWFwcGVyLm1fZGV2aWNlbWVtb3J5cy5maW5kKHBQYWNrZXQtPnBNZW1vcnlSYW5nZXNbaV0ubWVtb3J5KS0+c2Vjb25kOworICAgICAgICBsb2NhbFJhbmdlc1tpXS5tZW1vcnkgPSBtX29iak1hcHBlci5yZW1hcF9kZXZpY2VtZW1vcnlzKHBQYWNrZXQtPnBNZW1vcnlSYW5nZXNbaV0ubWVtb3J5KTsKKyAgICAgICAgaWYgKGxvY2FsUmFuZ2VzW2ldLm1lbW9yeSA9PSBWS19OVUxMX0hBTkRMRSB8fCBwTG9jYWxNZW1zW2ldLnBHcHVNZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlTWVtb3J5LiIpOworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUobG9jYWxSYW5nZXMpOworICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocExvY2FsTWVtcyk7CisgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwTG9jYWxNZW1zW2ldLnBHcHVNZW0tPmlzUGVuZGluZ0FsbG9jKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwUGFja2V0LT5wTWVtb3J5UmFuZ2VzW2ldLnNpemUgIT0gMCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKyAgICAgICAgICAgICAgICBpZih2a3RyYWNlX2NoZWNrX21pbl92ZXJzaW9uKFZLVFJBQ0VfVFJBQ0VfRklMRV9WRVJTSU9OXzUpKQorICAgICAgICAgICAgICAgICAgICBwTG9jYWxNZW1zW2ldLnBHcHVNZW0tPmNvcHlNYXBwaW5nRGF0YVBhZ2VHdWFyZChwUGFja2V0LT5wcERhdGFbaV0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcExvY2FsTWVtc1tpXS5wR3B1TWVtLT5jb3B5TWFwcGluZ0RhdGEocFBhY2tldC0+cHBEYXRhW2ldLCBmYWxzZSwgKHNpemVfdClwUGFja2V0LT5wTWVtb3J5UmFuZ2VzW2ldLnNpemUsIChzaXplX3QpcFBhY2tldC0+cE1lbW9yeVJhbmdlc1tpXS5vZmZzZXQpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBwTG9jYWxNZW1zW2ldLnBHcHVNZW0tPmNvcHlNYXBwaW5nRGF0YShwUGFja2V0LT5wcERhdGFbaV0sIGZhbHNlLCAoc2l6ZV90KXBQYWNrZXQtPnBNZW1vcnlSYW5nZXNbaV0uc2l6ZSwgKHNpemVfdClwUGFja2V0LT5wTWVtb3J5UmFuZ2VzW2ldLm9mZnNldCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBCdWYgPSAodW5zaWduZWQgY2hhciAqKSB2a3RyYWNlX21hbGxvYyhwTG9jYWxNZW1zW2ldLnBHcHVNZW0tPmdldE1lbW9yeU1hcFNpemUoKSk7CisgICAgICAgICAgICBpZiAoIXBCdWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigidmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcygpIG1hbGxvYyBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTG9jYWxNZW1zW2ldLnBHcHVNZW0tPnNldE1lbW9yeURhdGFBZGRyKHBCdWYpOworI2lmZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgICAgICAgICAgaWYodmt0cmFjZV9jaGVja19taW5fdmVyc2lvbihWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl81KSkKKyAgICAgICAgICAgICAgICBwTG9jYWxNZW1zW2ldLnBHcHVNZW0tPmNvcHlNYXBwaW5nRGF0YVBhZ2VHdWFyZChwUGFja2V0LT5wcERhdGFbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBMb2NhbE1lbXNbaV0ucEdwdU1lbS0+Y29weU1hcHBpbmdEYXRhKHBQYWNrZXQtPnBwRGF0YVtpXSwgZmFsc2UsIChzaXplX3QpcFBhY2tldC0+cE1lbW9yeVJhbmdlc1tpXS5zaXplLCAoc2l6ZV90KXBQYWNrZXQtPnBNZW1vcnlSYW5nZXNbaV0ub2Zmc2V0KTsKKyNlbHNlCisgICAgICAgICAgICBwTG9jYWxNZW1zW2ldLnBHcHVNZW0tPmNvcHlNYXBwaW5nRGF0YShwUGFja2V0LT5wcERhdGFbaV0sIGZhbHNlLCAoc2l6ZV90KXBQYWNrZXQtPnBNZW1vcnlSYW5nZXNbaV0uc2l6ZSwgKHNpemVfdClwUGFja2V0LT5wTWVtb3J5UmFuZ2VzW2ldLm9mZnNldCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgIHJlcGxheVJlc3VsdCA9IHBQYWNrZXQtPnJlc3VsdDsvL2lmIHRoaXMgaXMgYSBPUFQgcmVmcmVzaC1hbGwgcGFja2V0LCB3ZSBuZWVkIGF2b2lkIHRvIGNhbGwgcmVhbCBhcGkgYW5kIHJldHVybiBvcmlnaW5hbCByZXR1cm4gdG8gYXZvaWQgZXJyb3IgbWVzc2FnZTsKKyAgICBpZiAoIXZrdHJhY2VfY2hlY2tfbWluX3ZlcnNpb24oVktUUkFDRV9UUkFDRV9GSUxFX1ZFUlNJT05fNSkgfHwgIWlzdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc1NwZWNpYWwoKFBCWVRFKXBQYWNrZXQtPnBwRGF0YVswXSkpCisjZW5kaWYKKyAgICB7CisgICAgICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMocmVtYXBwZWREZXZpY2UsIHBQYWNrZXQtPm1lbW9yeVJhbmdlQ291bnQsIGxvY2FsUmFuZ2VzKTsKKyAgICB9CisKKyAgICBWS1RSQUNFX0RFTEVURShsb2NhbFJhbmdlcyk7CisgICAgVktUUkFDRV9ERUxFVEUocExvY2FsTWVtcyk7CisKKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCisvL0ludmFsaWRhdGVNYXBwZWRNZW1vcnkgUmFuZ2VzIGFuZCBmbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyBhcmUgc2ltaWxhciBidXQga2VlcCBpdCBzZXBlcmF0ZSB1bnRpbAorLy9mdW5jdGlvbmFsaXR5IHRlc3RlZCBmdWxseQorVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMocGFja2V0X3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyogcFBhY2tldCkKK3sKKyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisKKyAgICBWa0RldmljZSByZW1hcHBlZERldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX2RldmljZXMocFBhY2tldC0+ZGV2aWNlKTsKKyAgICBpZiAocmVtYXBwZWREZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0RldmljZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBWa01hcHBlZE1lbW9yeVJhbmdlKiBsb2NhbFJhbmdlcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrTWFwcGVkTWVtb3J5UmFuZ2UsIHBQYWNrZXQtPm1lbW9yeVJhbmdlQ291bnQpOworICAgIG1lbWNweShsb2NhbFJhbmdlcywgcFBhY2tldC0+cE1lbW9yeVJhbmdlcywgc2l6ZW9mKFZrTWFwcGVkTWVtb3J5UmFuZ2UpICogKHBQYWNrZXQtPm1lbW9yeVJhbmdlQ291bnQpKTsKKworICAgIGdwdU1lbU9iaiogcExvY2FsTWVtcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKGdwdU1lbU9iaiwgcFBhY2tldC0+bWVtb3J5UmFuZ2VDb3VudCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQYWNrZXQtPm1lbW9yeVJhbmdlQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHBMb2NhbE1lbXNbaV0gPSBtX29iak1hcHBlci5tX2RldmljZW1lbW9yeXMuZmluZChwUGFja2V0LT5wTWVtb3J5UmFuZ2VzW2ldLm1lbW9yeSktPnNlY29uZDsKKyAgICAgICAgbG9jYWxSYW5nZXNbaV0ubWVtb3J5ID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlbWVtb3J5cyhwUGFja2V0LT5wTWVtb3J5UmFuZ2VzW2ldLm1lbW9yeSk7CisgICAgICAgIGlmIChsb2NhbFJhbmdlc1tpXS5tZW1vcnkgPT0gVktfTlVMTF9IQU5ETEUgfHwgcExvY2FsTWVtc1tpXS5wR3B1TWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrSW52YWxpZHNhdGVNYXBwZWRNZW1vcnlSYW5nZXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0RldmljZU1lbW9yeS4iKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKGxvY2FsUmFuZ2VzKTsKKyAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBMb2NhbE1lbXMpOworICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcExvY2FsTWVtc1tpXS5wR3B1TWVtLT5pc1BlbmRpbmdBbGxvYygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFBhY2tldC0+cE1lbW9yeVJhbmdlc1tpXS5zaXplICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExvY2FsTWVtc1tpXS5wR3B1TWVtLT5jb3B5TWFwcGluZ0RhdGEocFBhY2tldC0+cHBEYXRhW2ldLCBmYWxzZSwgKHNpemVfdClwUGFja2V0LT5wTWVtb3J5UmFuZ2VzW2ldLnNpemUsIChzaXplX3QpcFBhY2tldC0+cE1lbW9yeVJhbmdlc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHZrdHJhY2VfbWFsbG9jKHBMb2NhbE1lbXNbaV0ucEdwdU1lbS0+Z2V0TWVtb3J5TWFwU2l6ZSgpKTsKKyAgICAgICAgICAgIGlmICghcEJ1ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJ2a0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMoKSBtYWxsb2MgZmFpbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcExvY2FsTWVtc1tpXS5wR3B1TWVtLT5zZXRNZW1vcnlEYXRhQWRkcihwQnVmKTsKKyAgICAgICAgICAgIHBMb2NhbE1lbXNbaV0ucEdwdU1lbS0+Y29weU1hcHBpbmdEYXRhKHBQYWNrZXQtPnBwRGF0YVtpXSwgZmFsc2UsIChzaXplX3QpcFBhY2tldC0+cE1lbW9yeVJhbmdlc1tpXS5zaXplLCAoc2l6ZV90KXBQYWNrZXQtPnBNZW1vcnlSYW5nZXNbaV0ub2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhyZW1hcHBlZERldmljZSwgcFBhY2tldC0+bWVtb3J5UmFuZ2VDb3VudCwgbG9jYWxSYW5nZXMpOworCisgICAgVktUUkFDRV9ERUxFVEUobG9jYWxSYW5nZXMpOworICAgIFZLVFJBQ0VfREVMRVRFKHBMb2NhbE1lbXMpOworCisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiogcFBhY2tldCkKK3sKKyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9waHlzaWNhbGRldmljZXMocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UpOworICAgIGlmIChyZW1hcHBlZHBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaHlzaWNhbERldmljZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBWa1N1cmZhY2VLSFIgcmVtYXBwZWRTdXJmYWNlS0hSID0gbV9vYmpNYXBwZXIucmVtYXBfc3VyZmFjZWtocnMocFBhY2tldC0+c3VyZmFjZSk7CisgICAgaWYgKHJlbWFwcGVkU3VyZmFjZUtIUiA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrU3VyZmFjZUtIUi4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIocmVtYXBwZWRwaHlzaWNhbERldmljZSwgcFBhY2tldC0+cXVldWVGYW1pbHlJbmRleCwgcmVtYXBwZWRTdXJmYWNlS0hSLCBwUGFja2V0LT5wU3VwcG9ydGVkKTsKKworICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK3ZvaWQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqIHBQYWNrZXQpCit7CisgICAgVmtQaHlzaWNhbERldmljZSByZW1hcHBlZHBoeXNpY2FsRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfcGh5c2ljYWxkZXZpY2VzKHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlKTsKKyAgICBpZiAocmVtYXBwZWRwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaHlzaWNhbERldmljZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRyYWNlTWVtb3J5UHJvcGVydGllc1twUGFja2V0LT5waHlzaWNhbERldmljZV0gPSAqKHBQYWNrZXQtPnBNZW1vcnlQcm9wZXJ0aWVzKTsKKyAgICBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhyZW1hcHBlZHBoeXNpY2FsRGV2aWNlLCBwUGFja2V0LT5wTWVtb3J5UHJvcGVydGllcyk7CisgICAgcmVwbGF5TWVtb3J5UHJvcGVydGllc1tyZW1hcHBlZHBoeXNpY2FsRGV2aWNlXSA9ICoocFBhY2tldC0+cE1lbW9yeVByb3BlcnRpZXMpOworICAgIHJldHVybjsKK30KKwordm9pZCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBQYWNrZXQpCit7CisgICAgVmtQaHlzaWNhbERldmljZSByZW1hcHBlZHBoeXNpY2FsRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfcGh5c2ljYWxkZXZpY2VzKHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlKTsKKyAgICBpZiAocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UgIT0gVktfTlVMTF9IQU5ETEUgJiYgcmVtYXBwZWRwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1BoeXNpY2FsRGV2aWNlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZW4ndCBwcmV2aW91c2x5IGFsbG9jYXRlZCBxdWV1ZUZhbWlseVByb3BlcnRpZXMgZm9yIHRoZSB0cmFjZSBwaHlzaWNhbCBkZXZpY2UsIGFsbG9jYXRlIGl0LgorICAgIC8vIElmIHdlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHF1ZXVlRmFtaWx5UHJvcGVyaXRpZXMgZm9yIHRoZSB0cmFjZSBwaHlzaWNhbCBkZXZpY2UgYW5kIHRoZSBzaXplIG9mIHRoaXMKKyAgICAvLyBxdWVyeSBpcyBsYXJnZXIgdGhhbiB3aGF0IHdlIHNhdmVkIGxhc3QgdGltZSwgdGhlbiBmcmVlIHRoZSBsYXN0IHByb3BlcnRpZXMgbWFwIGFuZCBhbGxvY2F0ZSBhIG5ldyBtYXAuCisgICAgaWYgKHRyYWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLmZpbmQocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UpID09IHRyYWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLmVuZCgpIHx8CisgICAgICAgICpwUGFja2V0LT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ID4gdHJhY2VRdWV1ZUZhbWlseVByb3BlcnRpZXNbcFBhY2tldC0+cGh5c2ljYWxEZXZpY2VdLmNvdW50KQorICAgIHsKKyAgICAgICAgaWYgKHRyYWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLmZpbmQocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UpICE9IHRyYWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVlKHRyYWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzW3BQYWNrZXQtPnBoeXNpY2FsRGV2aWNlXS5xdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgICAgICAgICAgdHJhY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMuZXJhc2UocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChwUGFja2V0LT5wUXVldWVGYW1pbHlQcm9wZXJ0aWVzKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZVF1ZXVlRmFtaWx5UHJvcGVydGllc1twUGFja2V0LT5waHlzaWNhbERldmljZV0ucXVldWVGYW1pbHlQcm9wZXJ0aWVzID0KKyAgICAgICAgICAgICAgICAoVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqKW1hbGxvYygqcFBhY2tldC0+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCAqIHNpemVvZihWa1F1ZXVlRmFtaWx5UHJvcGVydGllcykpOworICAgICAgICAgICAgbWVtY3B5KHRyYWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzW3BQYWNrZXQtPnBoeXNpY2FsRGV2aWNlXS5xdWV1ZUZhbWlseVByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cFF1ZXVlRmFtaWx5UHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAqcFBhY2tldC0+cFF1ZXVlRmFtaWx5UHJvcGVydHlDb3VudCAqIHNpemVvZihWa1F1ZXVlRmFtaWx5UHJvcGVydGllcykpOworICAgICAgICAgICAgdHJhY2VRdWV1ZUZhbWlseVByb3BlcnRpZXNbcFBhY2tldC0+cGh5c2ljYWxEZXZpY2VdLmNvdW50ID0gKnBQYWNrZXQtPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UsIHBQYWNrZXQtPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBQYWNrZXQtPnBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCBwcmV2aW91c2x5IGFsbG9jYXRlZCBxdWV1ZUZhbWlseVByb3BlcnRpZXMgZm9yIHRoZSByZXBsYXkgcGh5c2ljYWwgZGV2aWNlLCBhbGxvY2F0ZSBpdC4KKyAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBxdWV1ZUZhbWlseVByb3Blcml0aWVzIGZvciB0aGUgcmVwbGF5IHBoeXNpY2FsIGRldmljZSBhbmQgdGhlIHNpemUgb2YgdGhpcworICAgIC8vIHF1ZXJ5IGlzIGxhcmdlciB0aGFuIHdoYXQgd2Ugc2F2ZWQgbGFzdCB0aW1lLCB0aGVuIGZyZWUgdGhlIGxhc3QgcHJvcGVydGllcyBtYXAgYW5kIGFsbG9jYXRlIGEgbmV3IG1hcC4KKyAgICBpZiAocmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzLmZpbmQocmVtYXBwZWRwaHlzaWNhbERldmljZSkgPT0gcmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzLmVuZCgpIHx8CisgICAgICAgICpwUGFja2V0LT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50ID4gcmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzW3JlbWFwcGVkcGh5c2ljYWxEZXZpY2VdLmNvdW50KQorICAgIHsKKyAgICAgICAgaWYgKHJlcGxheVF1ZXVlRmFtaWx5UHJvcGVydGllcy5maW5kKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UpICE9IHJlcGxheVF1ZXVlRmFtaWx5UHJvcGVydGllcy5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZShyZXBsYXlRdWV1ZUZhbWlseVByb3BlcnRpZXNbcmVtYXBwZWRwaHlzaWNhbERldmljZV0ucXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHJlcGxheVF1ZXVlRmFtaWx5UHJvcGVydGllcy5lcmFzZShyZW1hcHBlZHBoeXNpY2FsRGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFBhY2tldC0+cFF1ZXVlRmFtaWx5UHJvcGVydGllcykKKyAgICAgICAgeworICAgICAgICAgICAgcmVwbGF5UXVldWVGYW1pbHlQcm9wZXJ0aWVzW3JlbWFwcGVkcGh5c2ljYWxEZXZpY2VdLnF1ZXVlRmFtaWx5UHJvcGVydGllcyA9CisgICAgICAgICAgICAgICAgKFZrUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiltYWxsb2MoKnBQYWNrZXQtPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgKiBzaXplb2YoVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMpKTsKKyAgICAgICAgICAgIG1lbWNweShyZXBsYXlRdWV1ZUZhbWlseVByb3BlcnRpZXNbcmVtYXBwZWRwaHlzaWNhbERldmljZV0ucXVldWVGYW1pbHlQcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgIHBQYWNrZXQtPnBRdWV1ZUZhbWlseVByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgKnBQYWNrZXQtPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgKiBzaXplb2YoVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMpKTsKKyAgICAgICAgICAgIHJlcGxheVF1ZXVlRmFtaWx5UHJvcGVydGllc1tyZW1hcHBlZHBoeXNpY2FsRGV2aWNlXS5jb3VudCA9ICpwUGFja2V0LT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50OworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm47Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKworICAgIFZrUGh5c2ljYWxEZXZpY2UgcmVtYXBwZWRwaHlzaWNhbERldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX3BoeXNpY2FsZGV2aWNlcyhwUGFja2V0LT5waHlzaWNhbERldmljZSk7CisgICAgaWYgKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrUGh5c2ljYWxEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtTdXJmYWNlS0hSIHJlbWFwcGVkU3VyZmFjZUtIUiA9IG1fb2JqTWFwcGVyLnJlbWFwX3N1cmZhY2VraHJzKHBQYWNrZXQtPnN1cmZhY2UpOworICAgIGlmIChyZW1hcHBlZFN1cmZhY2VLSFIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrU3VyZmFjZUtIUi4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBtX2Rpc3BsYXktPnJlc2l6ZV93aW5kb3cocFBhY2tldC0+cFN1cmZhY2VDYXBhYmlsaXRpZXMtPmN1cnJlbnRFeHRlbnQud2lkdGgsIHBQYWNrZXQtPnBTdXJmYWNlQ2FwYWJpbGl0aWVzLT5jdXJyZW50RXh0ZW50LmhlaWdodCk7CisKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihyZW1hcHBlZHBoeXNpY2FsRGV2aWNlLCByZW1hcHBlZFN1cmZhY2VLSFIsIHBQYWNrZXQtPnBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKworICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworCisgICAgVmtQaHlzaWNhbERldmljZSByZW1hcHBlZHBoeXNpY2FsRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfcGh5c2ljYWxkZXZpY2VzKHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlKTsKKyAgICBpZiAocmVtYXBwZWRwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrUGh5c2ljYWxEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtTdXJmYWNlS0hSIHJlbWFwcGVkU3VyZmFjZUtIUiA9IG1fb2JqTWFwcGVyLnJlbWFwX3N1cmZhY2VraHJzKHBQYWNrZXQtPnN1cmZhY2UpOworICAgIGlmIChyZW1hcHBlZFN1cmZhY2VLSFIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa1N1cmZhY2VLSFIuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UsIHJlbWFwcGVkU3VyZmFjZUtIUiwgcFBhY2tldC0+cFN1cmZhY2VGb3JtYXRDb3VudCwgcFBhY2tldC0+cFN1cmZhY2VGb3JtYXRzKTsKKworICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKworICAgIFZrUGh5c2ljYWxEZXZpY2UgcmVtYXBwZWRwaHlzaWNhbERldmljZSA9IG1fb2JqTWFwcGVyLnJlbWFwX3BoeXNpY2FsZGV2aWNlcyhwUGFja2V0LT5waHlzaWNhbERldmljZSk7CisgICAgaWYgKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrUGh5c2ljYWxEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtTdXJmYWNlS0hSIHJlbWFwcGVkU3VyZmFjZUtIUiA9IG1fb2JqTWFwcGVyLnJlbWFwX3N1cmZhY2VraHJzKHBQYWNrZXQtPnN1cmZhY2UpOworICAgIGlmIChyZW1hcHBlZFN1cmZhY2VLSFIgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrU3VyZmFjZUtIUi4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUihyZW1hcHBlZHBoeXNpY2FsRGV2aWNlLCByZW1hcHBlZFN1cmZhY2VLSFIsIHBQYWNrZXQtPnBQcmVzZW50TW9kZUNvdW50LCBwUGFja2V0LT5wUHJlc2VudE1vZGVzKTsKKworICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVTd2FwY2hhaW5LSFIocGFja2V0X3ZrQ3JlYXRlU3dhcGNoYWluS0hSKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICBWa1N3YXBjaGFpbktIUiBsb2NhbF9wU3dhcGNoYWluOworICAgIFZrU3dhcGNoYWluS0hSIHNhdmVfb2xkU3dhcGNoYWluLCAqcFNDOworICAgIFZrU3VyZmFjZUtIUiBzYXZlX3N1cmZhY2U7CisgICAgcFNDID0gKFZrU3dhcGNoYWluS0hSICopICZwUGFja2V0LT5wQ3JlYXRlSW5mby0+b2xkU3dhcGNoYWluOworICAgIFZrRGV2aWNlIHJlbWFwcGVkZGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZGRldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgc2F2ZV9vbGRTd2FwY2hhaW4gPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+b2xkU3dhcGNoYWluOworICAgICgqcFNDKSA9IG1fb2JqTWFwcGVyLnJlbWFwX3N3YXBjaGFpbmtocnMoc2F2ZV9vbGRTd2FwY2hhaW4pOworICAgIGlmICgoKnBTQykgPT0gVktfTlVMTF9IQU5ETEUgJiYgc2F2ZV9vbGRTd2FwY2hhaW4gIT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a0NyZWF0ZVN3YXBjaGFpbktIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrU3dhcGNoYWluS0hSLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIHNhdmVfc3VyZmFjZSA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5zdXJmYWNlOworICAgIFZrU3VyZmFjZUtIUiAqcFN1cmYgPSAoVmtTdXJmYWNlS0hSICopICYocFBhY2tldC0+cENyZWF0ZUluZm8tPnN1cmZhY2UpOworICAgICpwU3VyZiA9IG1fb2JqTWFwcGVyLnJlbWFwX3N1cmZhY2VraHJzKCpwU3VyZik7CisgICAgaWYgKCpwU3VyZiA9PSBWS19OVUxMX0hBTkRMRSAmJiBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c3VyZmFjZSAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtTdXJmYWNlS0hSLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIG1fZGlzcGxheS0+cmVzaXplX3dpbmRvdyhwUGFja2V0LT5wQ3JlYXRlSW5mby0+aW1hZ2VFeHRlbnQud2lkdGgsIHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5pbWFnZUV4dGVudC5oZWlnaHQpOworCisgICAgLy8gQ29udmVydCBxdWV1ZUZhbWlseUluZGljZXMKKyAgICBpZiAocFBhY2tldC0+cENyZWF0ZUluZm8pCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+cENyZWF0ZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXhDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBsYXlJZHg7CisgICAgICAgICAgICBpZiAocFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMgJiYKKyAgICAgICAgICAgICAgICBnZXRRdWV1ZUZhbWlseUlkeChwUGFja2V0LT5kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYXBwZWRkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxheUlkeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopJnBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzW2ldKSA9IHJlcGxheUlkeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJ2a1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIsIGJhZCBxdWV1ZUZhbWlseUluZGV4Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCB0aGUgbGlzdCBvZiBWa0Zvcm1hdHMgdGhhdCBhcmUgc3VwcG9ydGVkOgorICAgIFZrUGh5c2ljYWxEZXZpY2UgcmVtYXBwZWRQaHlzaWNhbERldmljZSA9IHJlcGxheVBoeXNpY2FsRGV2aWNlc1tyZW1hcHBlZGRldmljZV07CisgICAgdWludDMyX3QgZm9ybWF0Q291bnQ7CisgICAgVmtSZXN1bHQgcmVzOworICAgIC8vIE5vdGUgdGhhdCBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c3VyZmFjZSBoYXMgYmVlbiByZW1hcHBlZCBhYm92ZQorICAgIHJlcyA9IHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihyZW1hcHBlZFBoeXNpY2FsRGV2aWNlLCBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdENvdW50LCBOVUxMKTsKKyAgICBhc3NlcnQoIXJlcyk7CisgICAgVmtTdXJmYWNlRm9ybWF0S0hSICpzdXJmRm9ybWF0cyA9CisgICAgICAgIChWa1N1cmZhY2VGb3JtYXRLSFIgKiltYWxsb2MoZm9ybWF0Q291bnQgKiBzaXplb2YoVmtTdXJmYWNlRm9ybWF0S0hSKSk7CisgICAgYXNzZXJ0KHN1cmZGb3JtYXRzKTsKKyAgICByZXMgPSB2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIocmVtYXBwZWRQaHlzaWNhbERldmljZSwgcFBhY2tldC0+cENyZWF0ZUluZm8tPnN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXRDb3VudCwgc3VyZkZvcm1hdHMpOworICAgIGFzc2VydCghcmVzKTsKKyAgICAvLyBJZiB0aGUgZm9ybWF0IGxpc3QgaW5jbHVkZXMganVzdCBvbmUgZW50cnkgb2YgVktfRk9STUFUX1VOREVGSU5FRCwKKyAgICAvLyB0aGUgc3VyZmFjZSBoYXMgbm8gcHJlZmVycmVkIGZvcm1hdC4gIE90aGVyd2lzZSwgYXQgbGVhc3Qgb25lCisgICAgLy8gc3VwcG9ydGVkIGZvcm1hdCB3aWxsIGJlIHJldHVybmVkLgorICAgIGlmICghKGZvcm1hdENvdW50ID09IDEgJiYgc3VyZkZvcm1hdHNbMF0uZm9ybWF0ID09IFZLX0ZPUk1BVF9VTkRFRklORUQpKSB7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGZvcm1hdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwUGFja2V0LT5wQ3JlYXRlSW5mby0+aW1hZ2VGb3JtYXQgPT0gc3VyZkZvcm1hdHNbaV0uZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nV2FybmluZygiRm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHByZXNlbnRhYmxlIGltYWdlcywgdXNpbmcgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0LT5wQ3JlYXRlSW5mby0+aW1hZ2VGb3JtYXQsIHN1cmZGb3JtYXRzWzBdLmZvcm1hdCk7CisgICAgICAgICAgICBWa0Zvcm1hdCAqcEZvcm1hdCA9IChWa0Zvcm1hdCAqKSAmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5pbWFnZUZvcm1hdCk7CisgICAgICAgICAgICAqcEZvcm1hdCA9IHN1cmZGb3JtYXRzWzBdLmZvcm1hdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcmVlKHN1cmZGb3JtYXRzKTsKKworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlU3dhcGNoYWluS0hSKHJlbWFwcGVkZGV2aWNlLCBwUGFja2V0LT5wQ3JlYXRlSW5mbywgcFBhY2tldC0+cEFsbG9jYXRvciwgJmxvY2FsX3BTd2FwY2hhaW4pOworICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b19zd2FwY2hhaW5raHJzX21hcCgqKHBQYWNrZXQtPnBTd2FwY2hhaW4pLCBsb2NhbF9wU3dhcGNoYWluKTsKKyAgICB9CisKKyAgICAoKnBTQykgPSBzYXZlX29sZFN3YXBjaGFpbjsKKyAgICAqcFN1cmYgPSBzYXZlX3N1cmZhY2U7CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0dldFN3YXBjaGFpbkltYWdlc0tIUihwYWNrZXRfdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIFZrRGV2aWNlIHJlbWFwcGVkZGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZGRldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtEZXZpY2UuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtTd2FwY2hhaW5LSFIgcmVtYXBwZWRzd2FwY2hhaW47CisgICAgcmVtYXBwZWRzd2FwY2hhaW4gPSBtX29iak1hcHBlci5yZW1hcF9zd2FwY2hhaW5raHJzKHBQYWNrZXQtPnN3YXBjaGFpbik7CisgICAgaWYgKHJlbWFwcGVkc3dhcGNoYWluID09IFZLX05VTExfSEFORExFICYmIHBQYWNrZXQtPnN3YXBjaGFpbiAhPSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlU3dhcGNoYWluS0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtTd2FwY2hhaW5LSFIuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtJbWFnZSBwYWNrZXRJbWFnZVsxMjhdID0gezB9OworICAgIHVpbnQzMl90IG51bUltYWdlcyA9IDA7CisgICAgaWYgKHBQYWNrZXQtPnBTd2FwY2hhaW5JbWFnZXMgIT0gTlVMTCkgeworICAgICAgICAvLyBOZWVkIHRvIHN0b3JlIHRoZSBpbWFnZXMgYW5kIHRoZW4gYWRkIHRvIG1hcCBhZnRlciB3ZSBnZXQgYWN0dWFsIGltYWdlIGhhbmRsZXMgYmFjaworICAgICAgICBWa0ltYWdlKiBwUGFja2V0SW1hZ2VzID0gKFZrSW1hZ2UqKXBQYWNrZXQtPnBTd2FwY2hhaW5JbWFnZXM7CisgICAgICAgIG51bUltYWdlcyA9ICoocFBhY2tldC0+cFN3YXBjaGFpbkltYWdlQ291bnQpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtSW1hZ2VzOyBpKyspIHsKKyAgICAgICAgICAgIHBhY2tldEltYWdlW2ldID0gcFBhY2tldEltYWdlc1tpXTsKKyAgICAgICAgICAgIHRyYWNlSW1hZ2VUb0RldmljZVtwYWNrZXRJbWFnZVtpXV0gPSBwUGFja2V0LT5kZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0dldFN3YXBjaGFpbkltYWdlc0tIUihyZW1hcHBlZGRldmljZSwgcmVtYXBwZWRzd2FwY2hhaW4sIHBQYWNrZXQtPnBTd2FwY2hhaW5JbWFnZUNvdW50LCBwUGFja2V0LT5wU3dhcGNoYWluSW1hZ2VzKTsKKyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpCisgICAgeworICAgICAgICBpZiAobnVtSW1hZ2VzICE9IDApIHsKKyAgICAgICAgICAgIFZrSW1hZ2UqIHBSZXBsYXlJbWFnZXMgPSAoVmtJbWFnZSopcFBhY2tldC0+cFN3YXBjaGFpbkltYWdlczsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1JbWFnZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGltYWdlT2JqIGxvY2FsX2ltYWdlT2JqOworICAgICAgICAgICAgICAgIGxvY2FsX2ltYWdlT2JqLnJlcGxheUltYWdlID0gcFJlcGxheUltYWdlc1tpXTsKKyAgICAgICAgICAgICAgICBtX29iak1hcHBlci5hZGRfdG9faW1hZ2VzX21hcChwYWNrZXRJbWFnZVtpXSwgbG9jYWxfaW1hZ2VPYmopOworICAgICAgICAgICAgICAgIHJlcGxheUltYWdlVG9EZXZpY2VbcFJlcGxheUltYWdlc1tpXV0gPSByZW1hcHBlZGRldmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrUXVldWVQcmVzZW50S0hSKHBhY2tldF92a1F1ZXVlUHJlc2VudEtIUiogcFBhY2tldCkKK3sKKyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19TVUNDRVNTOworICAgIFZrUXVldWUgcmVtYXBwZWRRdWV1ZSA9IG1fb2JqTWFwcGVyLnJlbWFwX3F1ZXVlcyhwUGFja2V0LT5xdWV1ZSk7CisgICAgaWYgKHJlbWFwcGVkUXVldWUgPT0gVktfTlVMTF9IQU5ETEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlUHJlc2VudEtIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrUXVldWUuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgVmtTZW1hcGhvcmUgbG9jYWxTZW1hcGhvcmVzWzVdOworICAgIFZrU3dhcGNoYWluS0hSIGxvY2FsU3dhcGNoYWluc1s1XTsKKyAgICBWa1Jlc3VsdCBsb2NhbFJlc3VsdHNbNV07CisgICAgVmtTZW1hcGhvcmUgKnBSZW1hcHBlZFdhaXRTZW1zID0gbG9jYWxTZW1hcGhvcmVzOworICAgIFZrU3dhcGNoYWluS0hSICpwUmVtYXBwZWRTd2FwY2hhaW5zID0gbG9jYWxTd2FwY2hhaW5zOworICAgIFZrUmVzdWx0ICpwUmVzdWx0cyA9IGxvY2FsUmVzdWx0czsKKyAgICBWa1ByZXNlbnRJbmZvS0hSIHByZXNlbnQ7CisgICAgdWludDMyX3QgaTsKKworICAgIGlmIChwUGFja2V0LT5wUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50ID4gNSkgeworICAgICAgICBwUmVtYXBwZWRTd2FwY2hhaW5zID0gVktUUkFDRV9ORVdfQVJSQVkoVmtTd2FwY2hhaW5LSFIsIHBQYWNrZXQtPnBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQpOworICAgIH0KKworICAgIGlmIChwUGFja2V0LT5wUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50ID4gNSAmJiBwUGFja2V0LT5wUHJlc2VudEluZm8tPnBSZXN1bHRzICE9IE5VTEwpIHsKKyAgICAgICAgcFJlc3VsdHMgPSBWS1RSQUNFX05FV19BUlJBWShWa1Jlc3VsdCwgcFBhY2tldC0+cFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudCk7CisgICAgfQorCisgICAgaWYgKHBQYWNrZXQtPnBQcmVzZW50SW5mby0+d2FpdFNlbWFwaG9yZUNvdW50ID4gNSkgeworICAgICAgICBwUmVtYXBwZWRXYWl0U2VtcyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZrU2VtYXBob3JlLCBwUGFja2V0LT5wUHJlc2VudEluZm8tPndhaXRTZW1hcGhvcmVDb3VudCk7CisgICAgfQorCisgICAgaWYgKHBSZW1hcHBlZFN3YXBjaGFpbnMgPT0gTlVMTCB8fCBwUmVtYXBwZWRXYWl0U2VtcyA9PSBOVUxMIHx8IHBSZXN1bHRzID09IE5VTEwpCisgICAgeworICAgICAgICByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9PVVRfT0ZfSE9TVF9NRU1PUlk7CisgICAgfQorCisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIGZvciAoaT0wOyBpPHBQYWNrZXQtPnBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcFJlbWFwcGVkU3dhcGNoYWluc1tpXSA9IG1fb2JqTWFwcGVyLnJlbWFwX3N3YXBjaGFpbmtocnMocFBhY2tldC0+cFByZXNlbnRJbmZvLT5wU3dhcGNoYWluc1tpXSk7CisgICAgICAgICAgICBpZiAocFJlbWFwcGVkU3dhcGNoYWluc1tpXSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJTa2lwcGluZyB2a1F1ZXVlUHJlc2VudEtIUigpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrU3dhcGNoYWluS0hSLiIpOworICAgICAgICAgICAgICAgIGlmIChwUmVtYXBwZWRXYWl0U2VtcyAhPSBOVUxMICYmIHBSZW1hcHBlZFdhaXRTZW1zICE9IGxvY2FsU2VtYXBob3JlcykgeworICAgICAgICAgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRXYWl0U2Vtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwUmVzdWx0cyAhPSBOVUxMICYmIHBSZXN1bHRzICE9IGxvY2FsUmVzdWx0cykgeworICAgICAgICAgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwUmVzdWx0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwUmVtYXBwZWRTd2FwY2hhaW5zICE9IE5VTEwgJiYgcFJlbWFwcGVkU3dhcGNoYWlucyAhPSBsb2NhbFN3YXBjaGFpbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocFJlbWFwcGVkU3dhcGNoYWlucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQocFBhY2tldC0+cFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudCA9PSAxICYmICJNdWx0aXBsZSBzd2FwY2hhaW4gaW1hZ2VzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CisgICAgICAgIHVpbnQzMl90IHJlbWFwcGVkSW1hZ2VJbmRleCA9IG1fb2JqTWFwcGVyLnJlbWFwX3BJbWFnZUluZGV4KCpwUGFja2V0LT5wUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXMpOworICAgICAgICBpZiAocmVtYXBwZWRJbWFnZUluZGV4ID09IFVJTlQzMl9NQVgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrUXVldWVQcmVzZW50S0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgcEltYWdlSW5kaWNlcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgICAgIH0KKworICAgICAgICBwcmVzZW50LnNUeXBlID0gcFBhY2tldC0+cFByZXNlbnRJbmZvLT5zVHlwZTsKKyAgICAgICAgcHJlc2VudC5wTmV4dCA9IHBQYWNrZXQtPnBQcmVzZW50SW5mby0+cE5leHQ7CisgICAgICAgIHByZXNlbnQuc3dhcGNoYWluQ291bnQgPSBwUGFja2V0LT5wUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50OworICAgICAgICBwcmVzZW50LnBTd2FwY2hhaW5zID0gcFJlbWFwcGVkU3dhcGNoYWluczsKKyAgICAgICAgcHJlc2VudC5wSW1hZ2VJbmRpY2VzID0gJnJlbWFwcGVkSW1hZ2VJbmRleDsKKyAgICAgICAgcHJlc2VudC53YWl0U2VtYXBob3JlQ291bnQgPSBwUGFja2V0LT5wUHJlc2VudEluZm8tPndhaXRTZW1hcGhvcmVDb3VudDsKKyAgICAgICAgcHJlc2VudC5wV2FpdFNlbWFwaG9yZXMgPSBOVUxMOworICAgICAgICBpZiAocHJlc2VudC53YWl0U2VtYXBob3JlQ291bnQgIT0gMCkgeworICAgICAgICAgICAgcHJlc2VudC5wV2FpdFNlbWFwaG9yZXMgPSBwUmVtYXBwZWRXYWl0U2VtczsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGFja2V0LT5wUHJlc2VudEluZm8tPndhaXRTZW1hcGhvcmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgKCoocFJlbWFwcGVkV2FpdFNlbXMgKyBpKSkgPSBtX29iak1hcHBlci5yZW1hcF9zZW1hcGhvcmVzKCgqKHBQYWNrZXQtPnBQcmVzZW50SW5mby0+cFdhaXRTZW1hcGhvcmVzICsgaSkpKTsKKyAgICAgICAgICAgICAgICBpZiAoKihwUmVtYXBwZWRXYWl0U2VtcyArIGkpID09IFZLX05VTExfSEFORExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtRdWV1ZVByZXNlbnRLSFIoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCB3YWl0IFZrU2VtYXBob3JlLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAocFJlbWFwcGVkV2FpdFNlbXMgIT0gTlVMTCAmJiBwUmVtYXBwZWRXYWl0U2VtcyAhPSBsb2NhbFNlbWFwaG9yZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFdhaXRTZW1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocFJlc3VsdHMgIT0gTlVMTCAmJiBwUmVzdWx0cyAhPSBsb2NhbFJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZXN1bHRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocFJlbWFwcGVkU3dhcGNoYWlucyAhPSBOVUxMICYmIHBSZW1hcHBlZFN3YXBjaGFpbnMgIT0gbG9jYWxTd2FwY2hhaW5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWS1RSQUNFX0RFTEVURShwUmVtYXBwZWRTd2FwY2hhaW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmVzZW50LnBSZXN1bHRzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgLy8gSWYgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBwZXItc3dhcGNoYWluIHJlc3VsdHMsIHNldCB1cCB0byBnZXQgdGhlIHJlc3VsdHMgZnJvbSB0aGUgcmVwbGF5LgorICAgICAgICBpZiAocFBhY2tldC0+cFByZXNlbnRJbmZvLT5wUmVzdWx0cyAhPSBOVUxMKSB7CisgICAgICAgICAgICBwcmVzZW50LnBSZXN1bHRzID0gcFJlc3VsdHM7CisgICAgICAgIH0KKworICAgICAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a1F1ZXVlUHJlc2VudEtIUihyZW1hcHBlZFF1ZXVlLCAmcHJlc2VudCk7CisKKyAgICAgICAgbV9mcmFtZU51bWJlcisrOworCisgICAgICAgIC8vIENvbXBhcmUgdGhlIHJlc3VsdHMgZnJvbSB0aGUgdHJhY2UgZmlsZSB3aXRoIHRob3NlIGp1c3QgcmVjZWl2ZWQgZnJvbSB0aGUgcmVwbGF5LiAgUmVwb3J0IGFueSBkaWZmZXJlbmNlcy4KKyAgICAgICAgaWYgKHByZXNlbnQucFJlc3VsdHMgIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8cFBhY2tldC0+cFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnQucFJlc3VsdHNbaV0gIT0gcFBhY2tldC0+cFByZXNlbnRJbmZvLT5wUmVzdWx0c1tpXSkgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJSZXR1cm4gdmFsdWUgJXMgZnJvbSBBUEkgY2FsbCAoVmtRdWV1ZVByZXNlbnRLSFIpIGRvZXMgbm90IG1hdGNoIHJldHVybiB2YWx1ZSBmcm9tIHRyYWNlIGZpbGUgJXMgZm9yIHN3YXBjaGFpbiAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19Wa1Jlc3VsdChwcmVzZW50LnBSZXN1bHRzW2ldKSwgc3RyaW5nX1ZrUmVzdWx0KHBQYWNrZXQtPnBQcmVzZW50SW5mby0+cFJlc3VsdHNbaV0pLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFJlbWFwcGVkV2FpdFNlbXMgIT0gTlVMTCAmJiBwUmVtYXBwZWRXYWl0U2VtcyAhPSBsb2NhbFNlbWFwaG9yZXMpIHsKKyAgICAgICAgVktUUkFDRV9ERUxFVEUocFJlbWFwcGVkV2FpdFNlbXMpOworICAgIH0KKyAgICBpZiAocFJlc3VsdHMgIT0gTlVMTCAmJiBwUmVzdWx0cyAhPSBsb2NhbFJlc3VsdHMpIHsKKyAgICAgICAgVktUUkFDRV9ERUxFVEUocFJlc3VsdHMpOworICAgIH0KKyAgICBpZiAocFJlbWFwcGVkU3dhcGNoYWlucyAhPSBOVUxMICYmIHBSZW1hcHBlZFN3YXBjaGFpbnMgIT0gbG9jYWxTd2FwY2hhaW5zKSB7CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHBSZW1hcHBlZFN3YXBjaGFpbnMpOworICAgIH0KKworICAgIHJldHVybiByZXBsYXlSZXN1bHQ7Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVYY2JTdXJmYWNlS0hSKHBhY2tldF92a0NyZWF0ZVhjYlN1cmZhY2VLSFIqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfU1VDQ0VTUzsKKyAgICBWa1N1cmZhY2VLSFIgbG9jYWxfcFN1cmZhY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICBWa0luc3RhbmNlIHJlbWFwcGVkSW5zdGFuY2UgPSBtX29iak1hcHBlci5yZW1hcF9pbnN0YW5jZXMocFBhY2tldC0+aW5zdGFuY2UpOworICAgIGlmIChyZW1hcHBlZEluc3RhbmNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDcmVhdGVYY2JTdXJmYWNlS0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtJbnN0YW5jZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKSAmJiAhZGVmaW5lZChBTkRST0lEKQorICAgIFZrSWNkU3VyZmFjZVhjYiAqcFN1cmYgPSAoVmtJY2RTdXJmYWNlWGNiICopIG1fZGlzcGxheS0+Z2V0X3N1cmZhY2UoKTsKKyAgICBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNyZWF0ZUluZm87CisgICAgY3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1hDQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBOZXh0OworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+ZmxhZ3M7CisgICAgY3JlYXRlSW5mby5jb25uZWN0aW9uID0gcFN1cmYtPmNvbm5lY3Rpb247CisgICAgY3JlYXRlSW5mby53aW5kb3cgPSBwU3VyZi0+d2luZG93OworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlWGNiU3VyZmFjZUtIUihyZW1hcHBlZEluc3RhbmNlLCAmY3JlYXRlSW5mbywgcFBhY2tldC0+cEFsbG9jYXRvciwgJmxvY2FsX3BTdXJmYWNlKTsKKyNlbGlmIGRlZmluZWQgV0lOMzIKKyAgICBWa0ljZFN1cmZhY2VXaW4zMiAqcFN1cmYgPSAoVmtJY2RTdXJmYWNlV2luMzIgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBOZXh0OworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+ZmxhZ3M7CisgICAgY3JlYXRlSW5mby5oaW5zdGFuY2UgPSBwU3VyZi0+aGluc3RhbmNlOworICAgIGNyZWF0ZUluZm8uaHduZCA9IHBTdXJmLT5od25kOworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKHJlbWFwcGVkSW5zdGFuY2UsICZjcmVhdGVJbmZvLCBwUGFja2V0LT5wQWxsb2NhdG9yLCAmbG9jYWxfcFN1cmZhY2UpOworI2Vsc2UKKyAgICB2a3RyYWNlX0xvZ0Vycm9yKCJtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVYY2JTdXJmYWNlS0hSIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHZrcmVwbGF5IHBsYXRmb3JtIik7CisgICAgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfRkVBVFVSRV9OT1RfUFJFU0VOVDsKKyNlbmRpZgorCisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b19zdXJmYWNla2hyc19tYXAoKihwUGFja2V0LT5wU3VyZmFjZSksIGxvY2FsX3BTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKHBhY2tldF92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgVmtTdXJmYWNlS0hSIGxvY2FsX3BTdXJmYWNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtJbnN0YW5jZSByZW1hcHBlZGluc3RhbmNlID0gbV9vYmpNYXBwZXIucmVtYXBfaW5zdGFuY2VzKHBQYWNrZXQtPmluc3RhbmNlKTsKKworICAgIGlmIChwUGFja2V0LT5pbnN0YW5jZSAhPSBWS19OVUxMX0hBTkRMRSAmJiByZW1hcHBlZGluc3RhbmNlID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisjaWYgZGVmaW5lZCBQTEFURk9STV9MSU5VWCAmJiBkZWZpbmVkIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUgorICAgIFZrSWNkU3VyZmFjZVhsaWIgKnBTdXJmID0gKFZrSWNkU3VyZmFjZVhsaWIgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNyZWF0ZUluZm87CisgICAgY3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1hMSUJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI7CisgICAgY3JlYXRlSW5mby5wTmV4dCA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPmZsYWdzOworICAgIGNyZWF0ZUluZm8uZHB5ID0gcFN1cmYtPmRweTsKKyAgICBjcmVhdGVJbmZvLndpbmRvdyA9IHBTdXJmLT53aW5kb3c7CisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVYbGliU3VyZmFjZUtIUihyZW1hcHBlZGluc3RhbmNlLCAmY3JlYXRlSW5mbywgcFBhY2tldC0+cEFsbG9jYXRvciwgJmxvY2FsX3BTdXJmYWNlKTsKKyNlbGlmIGRlZmluZWQgUExBVEZPUk1fTElOVVggJiYgZGVmaW5lZCBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorICAgIFZrSWNkU3VyZmFjZVhjYiAqcFN1cmYgPSAoVmtJY2RTdXJmYWNlWGNiICopIG1fZGlzcGxheS0+Z2V0X3N1cmZhY2UoKTsKKyAgICBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSIGNyZWF0ZUluZm87CisgICAgY3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1hDQl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBOZXh0OworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+ZmxhZ3M7CisgICAgY3JlYXRlSW5mby5jb25uZWN0aW9uID0gcFN1cmYtPmNvbm5lY3Rpb247CisgICAgY3JlYXRlSW5mby53aW5kb3cgPSBwU3VyZi0+d2luZG93OworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlWGNiU3VyZmFjZUtIUihyZW1hcHBlZGluc3RhbmNlLCAmY3JlYXRlSW5mbywgcFBhY2tldC0+cEFsbG9jYXRvciwgJmxvY2FsX3BTdXJmYWNlKTsKKyNlbGlmIGRlZmluZWQgUExBVEZPUk1fTElOVVggJiYgZGVmaW5lZCBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICAvLyBUT0RPCisjZWxpZiBkZWZpbmVkIFBMQVRGT1JNX0xJTlVYCisjZXJyb3IgbWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIgb24gUExBVEZPUk1fTElOVVggcmVxdWlyZXMgb25lIG9mIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUiBvciBWS19VU0VfUExBVEZPUk1fWENCX0tIUiBvciBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNlbGlmIGRlZmluZWQgV0lOMzIKKyAgICBWa0ljZFN1cmZhY2VXaW4zMiAqcFN1cmYgPSAoVmtJY2RTdXJmYWNlV2luMzIgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9XSU4zMl9TVVJGQUNFX0NSRUFURV9JTkZPX0tIUjsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBOZXh0OworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+ZmxhZ3M7CisgICAgY3JlYXRlSW5mby5oaW5zdGFuY2UgPSBwU3VyZi0+aGluc3RhbmNlOworICAgIGNyZWF0ZUluZm8uaHduZCA9IHBTdXJmLT5od25kOworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKHJlbWFwcGVkaW5zdGFuY2UsICZjcmVhdGVJbmZvLCBwUGFja2V0LT5wQWxsb2NhdG9yLCAmbG9jYWxfcFN1cmZhY2UpOworI2Vsc2UKKyAgICB2a3RyYWNlX0xvZ0Vycm9yKCJtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVYbGliU3VyZmFjZUtIUiBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF5YmFjayBwbGF0Zm9ybSIpOworICAgIHJlcGxheVJlc3VsdCA9IFZLX0VSUk9SX0ZFQVRVUkVfTk9UX1BSRVNFTlQ7CisjZW5kaWYKKyAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpIHsKKyAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX3N1cmZhY2VraHJzX21hcCgqKHBQYWNrZXQtPnBTdXJmYWNlKSwgbG9jYWxfcFN1cmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCitWa1Jlc3VsdCB2a1JlcGxheTo6bWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKHBhY2tldF92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiogcFBhY2tldCkKK3sKKworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgVmtTdXJmYWNlS0hSIGxvY2FsX3BTdXJmYWNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtJbnN0YW5jZSByZW1hcHBlZEluc3RhbmNlID0gbV9vYmpNYXBwZXIucmVtYXBfaW5zdGFuY2VzKHBQYWNrZXQtPmluc3RhbmNlKTsKKyAgICBpZiAocmVtYXBwZWRJbnN0YW5jZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtJbnN0YW5jZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyNpZiBkZWZpbmVkIFdJTjMyCisgICAgVmtJY2RTdXJmYWNlV2luMzIgKnBTdXJmID0gKFZrSWNkU3VyZmFjZVdpbjMyICopIG1fZGlzcGxheS0+Z2V0X3N1cmZhY2UoKTsKKyAgICBWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIgY3JlYXRlSW5mbzsKKyAgICBjcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV0lOMzJfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFI7CisgICAgY3JlYXRlSW5mby5wTmV4dCA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPmZsYWdzOworICAgIGNyZWF0ZUluZm8uaGluc3RhbmNlID0gcFN1cmYtPmhpbnN0YW5jZTsKKyAgICBjcmVhdGVJbmZvLmh3bmQgPSBwU3VyZi0+aHduZDsKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUihyZW1hcHBlZEluc3RhbmNlLCAmY3JlYXRlSW5mbywgcFBhY2tldC0+cEFsbG9jYXRvciwgJmxvY2FsX3BTdXJmYWNlKTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpICYmICFkZWZpbmVkKEFORFJPSUQpCisgICAgVmtJY2RTdXJmYWNlWGNiICpwU3VyZiA9IChWa0ljZFN1cmZhY2VYY2IgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIgY3JlYXRlSW5mbzsKKyAgICBjcmVhdGVJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfWENCX1NVUkZBQ0VfQ1JFQVRFX0lORk9fS0hSOworICAgIGNyZWF0ZUluZm8ucE5leHQgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+cE5leHQ7CisgICAgY3JlYXRlSW5mby5mbGFncyA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5mbGFnczsKKyAgICBjcmVhdGVJbmZvLmNvbm5lY3Rpb24gPSBwU3VyZi0+Y29ubmVjdGlvbjsKKyAgICBjcmVhdGVJbmZvLndpbmRvdyA9IHBTdXJmLT53aW5kb3c7CisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVYY2JTdXJmYWNlS0hSKHJlbWFwcGVkSW5zdGFuY2UsICZjcmVhdGVJbmZvLCBwUGFja2V0LT5wQWxsb2NhdG9yLCAmbG9jYWxfcFN1cmZhY2UpOworI2Vsc2UKKyAgICB2a3RyYWNlX0xvZ0Vycm9yKCJtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxheWJhY2sgcGxhdGZvcm0iKTsKKyAgICByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UOworI2VuZGlmCisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b19zdXJmYWNla2hyc19tYXAoKihwUGFja2V0LT5wU3VyZmFjZSksIGxvY2FsX3BTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKHBhY2tldF92a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKiBwUGFja2V0KQoreworICAgIFZrUmVzdWx0IHJlcGxheVJlc3VsdCA9IFZLX1NVQ0NFU1M7CisgICAgVmtTdXJmYWNlS0hSIGxvY2FsX3BTdXJmYWNlID0gVktfTlVMTF9IQU5ETEU7CisgICAgVmtJbnN0YW5jZSByZW1hcHBlZEluc3RhbmNlID0gbV9vYmpNYXBwZXIucmVtYXBfaW5zdGFuY2VzKHBQYWNrZXQtPmluc3RhbmNlKTsKKyAgICBpZiAocmVtYXBwZWRJbnN0YW5jZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0luc3RhbmNlLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworI2lmIGRlZmluZWQgV0lOMzIKKyAgICBWa0ljZFN1cmZhY2VXaW4zMiAqcFN1cmYgPSAoVmtJY2RTdXJmYWNlV2luMzIgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c1R5cGU7CisgICAgY3JlYXRlSW5mby5wTmV4dCA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPmZsYWdzOworICAgIGNyZWF0ZUluZm8uaGluc3RhbmNlID0gcFN1cmYtPmhpbnN0YW5jZTsKKyAgICBjcmVhdGVJbmZvLmh3bmQgPSBwU3VyZi0+aHduZDsKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUihyZW1hcHBlZEluc3RhbmNlLCAmY3JlYXRlSW5mbywgcFBhY2tldC0+cEFsbG9jYXRvciwgJmxvY2FsX3BTdXJmYWNlKTsKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisjaWYgIWRlZmluZWQoQU5EUk9JRCkKKyAgICBWa0ljZFN1cmZhY2VYY2IgKnBTdXJmID0gKFZrSWNkU3VyZmFjZVhjYiAqKSBtX2Rpc3BsYXktPmdldF9zdXJmYWNlKCk7CisgICAgVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiBjcmVhdGVJbmZvOworICAgIGNyZWF0ZUluZm8uc1R5cGUgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c1R5cGU7CisgICAgY3JlYXRlSW5mby5wTmV4dCA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICBjcmVhdGVJbmZvLmZsYWdzID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPmZsYWdzOworICAgIGNyZWF0ZUluZm8uY29ubmVjdGlvbiA9IHBTdXJmLT5jb25uZWN0aW9uOworICAgIGNyZWF0ZUluZm8ud2luZG93ID0gcFN1cmYtPndpbmRvdzsKKyAgICByZXBsYXlSZXN1bHQgPSBtX3ZrRnVuY3MucmVhbF92a0NyZWF0ZVhjYlN1cmZhY2VLSFIocmVtYXBwZWRJbnN0YW5jZSwgJmNyZWF0ZUluZm8sIHBQYWNrZXQtPnBBbGxvY2F0b3IsICZsb2NhbF9wU3VyZmFjZSk7CisjZWxzZQorICAgIFZrSWNkU3VyZmFjZUFuZHJvaWQgKnBTdXJmID0gKFZrSWNkU3VyZmFjZUFuZHJvaWQgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIFZrQW5kcm9pZFN1cmZhY2VDcmVhdGVJbmZvS0hSIGNyZWF0ZUluZm87CisgICAgY3JlYXRlSW5mby5zVHlwZSA9IHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5zVHlwZTsKKyAgICBjcmVhdGVJbmZvLnBOZXh0ID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPnBOZXh0OworICAgIGNyZWF0ZUluZm8uZmxhZ3MgPSBwUGFja2V0LT5wQ3JlYXRlSW5mby0+ZmxhZ3M7CisgICAgY3JlYXRlSW5mby53aW5kb3cgPSBwU3VyZi0+d2luZG93OworICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIocmVtYXBwZWRJbnN0YW5jZSwgJmNyZWF0ZUluZm8sIHBQYWNrZXQtPnBBbGxvY2F0b3IsICZsb2NhbF9wU3VyZmFjZSk7IAorI2VuZGlmIC8vIEFORFJPSUQKKyNlbHNlCisgICAgdmt0cmFjZV9Mb2dFcnJvcigibWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxheWJhY2sgcGxhdGZvcm0iKTsKKyAgICByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9GRUFUVVJFX05PVF9QUkVTRU5UOworI2VuZGlmCisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7CisgICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b19zdXJmYWNla2hyc19tYXAoKihwUGFja2V0LT5wU3VyZmFjZSksIGxvY2FsX3BTdXJmYWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtSZXN1bHQgIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKHBhY2tldF92a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBsb2NhbF9tc2dDYWxsYmFjazsKKyAgICBWa0luc3RhbmNlIHJlbWFwcGVkSW5zdGFuY2UgPSBtX29iak1hcHBlci5yZW1hcF9pbnN0YW5jZXMocFBhY2tldC0+aW5zdGFuY2UpOworICAgIGlmIChyZW1hcHBlZEluc3RhbmNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtJbnN0YW5jZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX1ZBTElEQVRJT05fRkFJTEVEX0VYVDsKKyAgICB9CisKKyAgICBpZiAoIWdfZnBEYmdNc2dDYWxsYmFjayB8fCAhbV92a0Z1bmNzLnJlYWxfdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSB7CisgICAgICAgIC8vIGp1c3QgZWF0IHRoaXMgY2FsbCBhcyB3ZSBkb24ndCBoYXZlIGxvY2FsIGNhbGwgYmFjayBmdW5jdGlvbiBkZWZpbmVkCisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgVmtEZWJ1Z1JlcG9ydENhbGxiYWNrQ3JlYXRlSW5mb0VYVCBkYmdDcmVhdGVJbmZvOworICAgICAgICBtZW1zZXQoJmRiZ0NyZWF0ZUluZm8sIDAsIHNpemVvZihkYmdDcmVhdGVJbmZvKSk7CisgICAgICAgIGRiZ0NyZWF0ZUluZm8uc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERUJVR19SRVBPUlRfQ1JFQVRFX0lORk9fRVhUOworICAgICAgICBkYmdDcmVhdGVJbmZvLmZsYWdzID0gcFBhY2tldC0+cENyZWF0ZUluZm8tPmZsYWdzOworICAgICAgICBkYmdDcmVhdGVJbmZvLnBmbkNhbGxiYWNrID0gZ19mcERiZ01zZ0NhbGxiYWNrOworICAgICAgICBkYmdDcmVhdGVJbmZvLnBVc2VyRGF0YSA9IE5VTEw7CisgICAgICAgIHJlcGxheVJlc3VsdCA9IG1fdmtGdW5jcy5yZWFsX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVChyZW1hcHBlZEluc3RhbmNlLCAmZGJnQ3JlYXRlSW5mbywgTlVMTCwgJmxvY2FsX21zZ0NhbGxiYWNrKTsKKyAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX2RlYnVncmVwb3J0Y2FsbGJhY2tleHRzX21hcCgqKHBQYWNrZXQtPnBDYWxsYmFjayksIGxvY2FsX21zZ0NhbGxiYWNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVwbGF5UmVzdWx0OworfQorCit2b2lkIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChwYWNrZXRfdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCogcFBhY2tldCkKK3sKKyAgICBWa0luc3RhbmNlIHJlbWFwcGVkSW5zdGFuY2UgPSBtX29iak1hcHBlci5yZW1hcF9pbnN0YW5jZXMocFBhY2tldC0+aW5zdGFuY2UpOworICAgIGlmIChyZW1hcHBlZEluc3RhbmNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrSW5zdGFuY2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWa0RlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgcmVtYXBwZWRNc2dDYWxsYmFjazsKKyAgICByZW1hcHBlZE1zZ0NhbGxiYWNrID0gbV9vYmpNYXBwZXIucmVtYXBfZGVidWdyZXBvcnRjYWxsYmFja2V4dHMocFBhY2tldC0+Y2FsbGJhY2spOworICAgIGlmIChyZW1hcHBlZE1zZ0NhbGxiYWNrID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiU2tpcHBpbmcgdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCgpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZ19mcERiZ01zZ0NhbGxiYWNrKQorICAgIHsKKyAgICAgICAgLy8ganVzdCBlYXQgdGhpcyBjYWxsIGFzIHdlIGRvbid0IGhhdmUgbG9jYWwgY2FsbCBiYWNrIGZ1bmN0aW9uIGRlZmluZWQKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgbV92a0Z1bmNzLnJlYWxfdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVChyZW1hcHBlZEluc3RhbmNlLCByZW1hcHBlZE1zZ0NhbGxiYWNrLCBOVUxMKTsKKyAgICB9Cit9CisKK1ZrUmVzdWx0IHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKHBhY2tldF92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMqIHBQYWNrZXQpCit7CisgICAgVmtSZXN1bHQgcmVwbGF5UmVzdWx0ID0gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIFZrRGV2aWNlIHJlbWFwcGVkRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfZGV2aWNlcyhwUGFja2V0LT5kZXZpY2UpOworICAgIGlmIChyZW1hcHBlZERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQWxsb2NhdGVDb21tYW5kQnVmZmVycygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrRGV2aWNlLiIpOworICAgICAgICByZXR1cm4gVktfRVJST1JfVkFMSURBVElPTl9GQUlMRURfRVhUOworICAgIH0KKworICAgIFZrQ29tbWFuZEJ1ZmZlciAqbG9jYWxfcENvbW1hbmRCdWZmZXJzID0gbmV3IFZrQ29tbWFuZEJ1ZmZlcltwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5jb21tYW5kQnVmZmVyQ291bnRdOworICAgIFZrQ29tbWFuZFBvb2wgbG9jYWxfQ29tbWFuZFBvb2w7CisgICAgbG9jYWxfQ29tbWFuZFBvb2wgPSBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbDsKKyAgICAoKFZrQ29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyAqKSBwUGFja2V0LT5wQWxsb2NhdGVJbmZvKS0+Y29tbWFuZFBvb2wgPSBtX29iak1hcHBlci5yZW1hcF9jb21tYW5kcG9vbHMocFBhY2tldC0+cEFsbG9jYXRlSW5mby0+Y29tbWFuZFBvb2wpOworICAgIGlmIChwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5jb21tYW5kUG9vbCA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlNraXBwaW5nIHZrQWxsb2NhdGVDb21tYW5kQnVmZmVycygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrQ29tbWFuZFBvb2wuIik7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7CisgICAgfQorCisgICAgcmVwbGF5UmVzdWx0ID0gbV92a0Z1bmNzLnJlYWxfdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKHJlbWFwcGVkRGV2aWNlLCBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLCBsb2NhbF9wQ29tbWFuZEJ1ZmZlcnMpOworICAgICgoVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvICopIHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8pLT5jb21tYW5kUG9vbCA9IGxvY2FsX0NvbW1hbmRQb29sOworCisgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPmNvbW1hbmRCdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtX29iak1hcHBlci5hZGRfdG9fY29tbWFuZGJ1ZmZlcnNfbWFwKHBQYWNrZXQtPnBDb21tYW5kQnVmZmVyc1tpXSwgbG9jYWxfcENvbW1hbmRCdWZmZXJzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGVbXSBsb2NhbF9wQ29tbWFuZEJ1ZmZlcnM7CisgICAgcmV0dXJuIHJlcGxheVJlc3VsdDsKK30KKworVmtCb29sMzIgdmtSZXBsYXk6Om1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIqIHBQYWNrZXQpCit7CisgICAgVmtQaHlzaWNhbERldmljZSByZW1hcHBlZHBoeXNpY2FsRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfcGh5c2ljYWxkZXZpY2VzKHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlKTsKKyAgICBpZiAocmVtYXBwZWRwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkVycm9yIGRldGVjdGVkIGluIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaHlzaWNhbERldmljZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KKworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpICYmICFkZWZpbmVkKEFORFJPSUQpCisgICAgVmtJY2RTdXJmYWNlWGNiICpwU3VyZiA9IChWa0ljZFN1cmZhY2VYY2IgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIG1fZGlzcGxheS0+Z2V0X3dpbmRvd19oYW5kbGUoKTsKKyAgICByZXR1cm4gKG1fdmtGdW5jcy5yZWFsX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UsIHBQYWNrZXQtPnF1ZXVlRmFtaWx5SW5kZXgsIHBTdXJmLT5jb25uZWN0aW9uLCBtX2Rpc3BsYXktPmdldF9zY3JlZW5faGFuZGxlKCktPnJvb3RfdmlzdWFsKSk7CisjZWxpZiBkZWZpbmVkIFdJTjMyCisgICAgcmV0dXJuIChtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UsIHBQYWNrZXQtPnF1ZXVlRmFtaWx5SW5kZXgpKTsKKyNlbHNlCisgICAgdmt0cmFjZV9Mb2dFcnJvcigibWFudWFsbHlfcmVwbGF5X3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXliYWNrIHBsYXRmb3JtIik7CisgICAgcmV0dXJuIFZLX0ZBTFNFOworI2VuZGlmCit9CisKK1ZrQm9vbDMyIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIqIHBQYWNrZXQpCit7CisgICAgVmtQaHlzaWNhbERldmljZSByZW1hcHBlZHBoeXNpY2FsRGV2aWNlID0gbV9vYmpNYXBwZXIucmVtYXBfcGh5c2ljYWxkZXZpY2VzKHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlKTsKKyAgICBpZiAocmVtYXBwZWRwaHlzaWNhbERldmljZSA9PSBWS19OVUxMX0hBTkRMRSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkVycm9yIGRldGVjdGVkIGluIHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtQaHlzaWNhbERldmljZS4iKTsKKyAgICAgICAgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KKworI2lmIGRlZmluZWQgUExBVEZPUk1fTElOVVggJiYgZGVmaW5lZCBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBWa0ljZFN1cmZhY2VYbGliICpwU3VyZiA9IChWa0ljZFN1cmZhY2VYbGliICopIG1fZGlzcGxheS0+Z2V0X3N1cmZhY2UoKTsKKyAgICBtX2Rpc3BsYXktPmdldF93aW5kb3dfaGFuZGxlKCk7CisgICAgcmV0dXJuIChtX3ZrRnVuY3MucmVhbF92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIocmVtYXBwZWRwaHlzaWNhbERldmljZSwgcFBhY2tldC0+cXVldWVGYW1pbHlJbmRleCwgcFN1cmYtPmRweSwgbV9kaXNwbGF5LT5nZXRfc2NyZWVuX2hhbmRsZSgpLT5yb290X3Zpc3VhbCkpOworI2VsaWYgZGVmaW5lZCBQTEFURk9STV9MSU5VWCAmJiBkZWZpbmVkIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgVmtJY2RTdXJmYWNlWGNiICpwU3VyZiA9IChWa0ljZFN1cmZhY2VYY2IgKikgbV9kaXNwbGF5LT5nZXRfc3VyZmFjZSgpOworICAgIG1fZGlzcGxheS0+Z2V0X3dpbmRvd19oYW5kbGUoKTsKKyAgICByZXR1cm4gKG1fdmtGdW5jcy5yZWFsX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UsIHBQYWNrZXQtPnF1ZXVlRmFtaWx5SW5kZXgsIHBTdXJmLT5jb25uZWN0aW9uLCBtX2Rpc3BsYXktPmdldF9zY3JlZW5faGFuZGxlKCktPnJvb3RfdmlzdWFsKSk7CisjZWxpZiBkZWZpbmVkIFBMQVRGT1JNX0xJTlVYICYmIGRlZmluZWQgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgLy8gVGhpcyBpcyBub3QgZGVmaW5lZCBmb3IgQW5kcm9pZAorICAgIHJldHVybiBWS19UUlVFOworI2VsaWYgZGVmaW5lZCBQTEFURk9STV9MSU5VWAorI2Vycm9yIG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgb24gUExBVEZPUk1fTElOVVggcmVxdWlyZXMgb25lIG9mIFZLX1VTRV9QTEFURk9STV9YTElCX0tIUiBvciBWS19VU0VfUExBVEZPUk1fWENCX0tIUiBvciBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNlbGlmIGRlZmluZWQgV0lOMzIKKyAgICByZXR1cm4gKG1fdmtGdW5jcy5yZWFsX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIocmVtYXBwZWRwaHlzaWNhbERldmljZSwgcFBhY2tldC0+cXVldWVGYW1pbHlJbmRleCkpOworI2Vsc2UKKyAgICB2a3RyYWNlX0xvZ0Vycm9yKCJtYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXliYWNrIHBsYXRmb3JtIik7CisgICAgcmV0dXJuIFZLX0ZBTFNFOworI2VuZGlmCit9CisKK1ZrQm9vbDMyIHZrUmVwbGF5OjptYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiogcFBhY2tldCkKK3sKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHJlbWFwcGVkcGh5c2ljYWxEZXZpY2UgPSBtX29iak1hcHBlci5yZW1hcF9waHlzaWNhbGRldmljZXMocFBhY2tldC0+cGh5c2ljYWxEZXZpY2UpOworICAgIGlmIChwUGFja2V0LT5waHlzaWNhbERldmljZSAhPSBWS19OVUxMX0hBTkRMRSAmJiByZW1hcHBlZHBoeXNpY2FsRGV2aWNlID09IFZLX05VTExfSEFORExFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZLX0ZBTFNFOworICAgIH0KKworI2lmIGRlZmluZWQgV0lOMzIKKyAgICByZXR1cm4gKG1fdmtGdW5jcy5yZWFsX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIocmVtYXBwZWRwaHlzaWNhbERldmljZSwgcFBhY2tldC0+cXVldWVGYW1pbHlJbmRleCkpOworI2VsaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgJiYgIWRlZmluZWQoQU5EUk9JRCkKKyAgICBWa0ljZFN1cmZhY2VYY2IgKnBTdXJmID0gKFZrSWNkU3VyZmFjZVhjYiAqKSBtX2Rpc3BsYXktPmdldF9zdXJmYWNlKCk7CisgICAgbV9kaXNwbGF5LT5nZXRfd2luZG93X2hhbmRsZSgpOworICAgIHJldHVybiAobV92a0Z1bmNzLnJlYWxfdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIocmVtYXBwZWRwaHlzaWNhbERldmljZSwgcFBhY2tldC0+cXVldWVGYW1pbHlJbmRleCwgcFN1cmYtPmNvbm5lY3Rpb24sIG1fZGlzcGxheS0+Z2V0X3NjcmVlbl9oYW5kbGUoKS0+cm9vdF92aXN1YWwpKTsKKyNlbHNlCisgICAgdmt0cmFjZV9Mb2dFcnJvcigibWFudWFsbHlfcmVwbGF5X3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxheWJhY2sgcGxhdGZvcm0iKTsKKyAgICByZXR1cm4gVktfRkFMU0U7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvdmtyZXBsYXlfdmtyZXBsYXkuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3ZrcmVwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiNzlmNAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrcmVwbGF5L3ZrcmVwbGF5X3ZrcmVwbGF5LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqIEF1dGhvcjogQ291cnRuZXkgR29lbHR6ZW5sZXVjaHRlciA8Y291cnRuZXlATHVuYXJHLmNvbT4KKyAqIEF1dGhvcjogTWFyayBMb2JvZHppbnNraSA8bWFya0BsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorI2lmIGRlZmluZWQoQU5EUk9JRCkKKyNpbmNsdWRlIDxhbmRyb2lkX25hdGl2ZV9hcHBfZ2x1ZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDx4Y2IveGNiLmg+CisjZW5kaWYgLy8gQU5EUk9JRAorI2VuZGlmCisjaW5jbHVkZSAidmt0cmFjZV9tdWx0aXBsYXRmb3JtLmgiCisjaW5jbHVkZSAidmtyZXBsYXlfd2luZG93LmgiCisjaW5jbHVkZSAidmtyZXBsYXlfZmFjdG9yeS5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidmt0cmFjZV92a192a19wYWNrZXRzLmgiCisKKy8vIFRPRE8xMzggOiBOZWVkIHRvIGFkZCBwYWNrZXRzIGZpbGVzIGZvciBuZXcgd3NpIGhlYWRlcnMKK30KKworI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKworI2luY2x1ZGUgInZrcmVwbGF5X3ZrZGlzcGxheS5oIgorI2luY2x1ZGUgInZrcmVwbGF5X3ZrX2Z1bmNfcHRycy5oIgorI2luY2x1ZGUgInZrcmVwbGF5X3ZrX29iam1hcHBlci5oIgorCisjZGVmaW5lIENIRUNLX1JFVFVSTl9WQUxVRShlbnRyeXBvaW50KSByZXR1cm5WYWx1ZSA9IGhhbmRsZV9yZXBsYXlfZXJyb3JzKCNlbnRyeXBvaW50LCByZXBsYXlSZXN1bHQsIHBQYWNrZXQtPnJlc3VsdCwgcmV0dXJuVmFsdWUpOworCitjbGFzcyB2a1JlcGxheSB7CitwdWJsaWM6CisgICAgfnZrUmVwbGF5KCk7CisgICAgdmtSZXBsYXkodmtyZXBsYXllcl9zZXR0aW5ncyAqcFJlcGxheVNldHRpbmdzKTsKKworICAgIGludCBpbml0KHZrdHJhY2VfcmVwbGF5OjpSZXBsYXlEaXNwbGF5ICYgZGlzcCk7CisgICAgdmtEaXNwbGF5ICogZ2V0X2Rpc3BsYXkoKSB7cmV0dXJuIG1fZGlzcGxheTt9CisgICAgdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX1JFU1VMVCByZXBsYXkodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyICpwYWNrZXQpOworICAgIHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9SRVNVTFQgaGFuZGxlX3JlcGxheV9lcnJvcnMoY29uc3QgY2hhciogZW50cnlwb2ludE5hbWUsIGNvbnN0IFZrUmVzdWx0IHJlc0NhbGwsIGNvbnN0IFZrUmVzdWx0IHJlc1RyYWNlLCBjb25zdCB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfUkVTVUxUIHJlc0luKTsKKworICAgIHZvaWQgcHVzaF92YWxpZGF0aW9uX21zZyhWa0ZsYWdzIG1zZ0ZsYWdzLCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmpUeXBlLCB1aW50NjRfdCBzcmNPYmplY3RIYW5kbGUsIHNpemVfdCBsb2NhdGlvbiwgaW50MzJfdCBtc2dDb2RlLCBjb25zdCBjaGFyKiBwTGF5ZXJQcmVmaXgsIGNvbnN0IGNoYXIqIHBNc2csIGNvbnN0IHZvaWQqIHBVc2VyRGF0YSk7CisgICAgdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX1JFU1VMVCBwb3BfdmFsaWRhdGlvbl9tc2dzKCk7CisgICAgaW50IGR1bXBfdmFsaWRhdGlvbl9kYXRhKCk7CisgICAgaW50IGdldF9mcmFtZV9udW1iZXIoKSB7IHJldHVybiBtX2ZyYW1lTnVtYmVyOyB9CisgICAgdm9pZCByZXNldF9mcmFtZV9udW1iZXIoKSB7IG1fZnJhbWVOdW1iZXIgPSAwOyB9Citwcml2YXRlOgorICAgIHN0cnVjdCB2a0Z1bmNzIG1fdmtGdW5jczsKKyAgICB2a1JlcGxheU9iak1hcHBlciBtX29iak1hcHBlcjsKKyAgICB2b2lkICgqbV9wRFNEdW1wKShjaGFyKik7CisgICAgdm9pZCAoKm1fcENCRHVtcCkoY2hhciopOworICAgIC8vVktUUkFDRVNOQVBTSE9UX1BSSU5UX09CSkVDVFMgbV9wVmt0cmFjZVNuYXBzaG90UHJpbnQ7CisgICAgdmtEaXNwbGF5ICptX2Rpc3BsYXk7CisKKyAgICBpbnQgbV9mcmFtZU51bWJlcjsKKworICAgIHN0cnVjdCBWYWxpZGF0aW9uTXNnIHsKKyAgICAgICAgVmtGbGFncyBtc2dGbGFnczsKKyAgICAgICAgVmtEZWJ1Z1JlcG9ydE9iamVjdFR5cGVFWFQgb2JqVHlwZTsKKyAgICAgICAgdWludDY0X3Qgc3JjT2JqZWN0SGFuZGxlOworICAgICAgICBzaXplX3QgbG9jYXRpb247CisgICAgICAgIGludDMyX3QgbXNnQ29kZTsKKyAgICAgICAgY2hhciBsYXllclByZWZpeFsyNTZdOworICAgICAgICBjaGFyIG1zZ1syNTZdOworICAgICAgICB2b2lkKiBwVXNlckRhdGE7CisgICAgfTsKKworICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCBtX2RiZ01zZ0NhbGxiYWNrT2JqOworCisgICAgc3RkOjp2ZWN0b3I8c3RydWN0IFZhbGlkYXRpb25Nc2c+IG1fdmFsaWRhdGlvbk1zZ3M7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBtX3NjcmVlbnNob3RGcmFtZXM7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlSW5zdGFuY2UocGFja2V0X3ZrQ3JlYXRlSW5zdGFuY2UqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZURldmljZShwYWNrZXRfdmtDcmVhdGVEZXZpY2UqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZUJ1ZmZlcihwYWNrZXRfdmtDcmVhdGVCdWZmZXIqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZUltYWdlKHBhY2tldF92a0NyZWF0ZUltYWdlKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVDb21tYW5kUG9vbChwYWNrZXRfdmtDcmVhdGVDb21tYW5kUG9vbCogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKHBhY2tldF92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyogcFBhY2tldCk7CisgICAgLy8gVE9ETzEzOCA6IE1hbnkgbmV3IGZ1bmN0aW9ucyBpbiBBUEkgbm93IHRoYXQgd2UgbmVlZCB0byBhc3Nlc3MgaWYgbWFudWFsIGNvZGUgbmVlZGVkCisgICAgLy9Wa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZUluZm8ocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VJbmZvKiBwUGFja2V0KTsKKyAgICAvL1ZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0dldEdsb2JhbEV4dGVuc2lvbkluZm8ocGFja2V0X3ZrR2V0R2xvYmFsRXh0ZW5zaW9uSW5mbyogcFBhY2tldCk7CisgICAgLy9Wa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZUV4dGVuc2lvbkluZm8ocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VFeHRlbnNpb25JbmZvKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtRdWV1ZVN1Ym1pdChwYWNrZXRfdmtRdWV1ZVN1Ym1pdCogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrUXVldWVCaW5kU3BhcnNlKHBhY2tldF92a1F1ZXVlQmluZFNwYXJzZSogcFBhY2tldCk7CisgICAgLy9Wa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtHZXRPYmplY3RJbmZvKHBhY2tldF92a0dldE9iamVjdEluZm8qIHBQYWNrZXQpOworICAgIC8vVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUluZm8ocGFja2V0X3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUluZm8qIHBQYWNrZXQpOworICAgIHZvaWQgbWFudWFsbHlfcmVwbGF5X3ZrVXBkYXRlRGVzY3JpcHRvclNldHMocGFja2V0X3ZrVXBkYXRlRGVzY3JpcHRvclNldHMqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQocGFja2V0X3ZrQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCogcFBhY2tldCk7CisgICAgdm9pZCBtYW51YWxseV9yZXBsYXlfdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dChwYWNrZXRfdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dCogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhwYWNrZXRfdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtGcmVlRGVzY3JpcHRvclNldHMocGFja2V0X3ZrRnJlZURlc2NyaXB0b3JTZXRzKiBwUGFja2V0KTsKKyAgICB2b2lkIG1hbnVhbGx5X3JlcGxheV92a0NtZEJpbmREZXNjcmlwdG9yU2V0cyhwYWNrZXRfdmtDbWRCaW5kRGVzY3JpcHRvclNldHMqIHBQYWNrZXQpOworICAgIHZvaWQgbWFudWFsbHlfcmVwbGF5X3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnMocGFja2V0X3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnMqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKHBhY2tldF92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyhwYWNrZXRfdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcyhwYWNrZXRfdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVQaXBlbGluZUxheW91dChwYWNrZXRfdmtDcmVhdGVQaXBlbGluZUxheW91dCogcFBhY2tldCk7CisgICAgdm9pZCBtYW51YWxseV9yZXBsYXlfdmtDbWRXYWl0RXZlbnRzKHBhY2tldF92a0NtZFdhaXRFdmVudHMqIHBQYWNrZXQpOworICAgIHZvaWQgbWFudWFsbHlfcmVwbGF5X3ZrQ21kUGlwZWxpbmVCYXJyaWVyKHBhY2tldF92a0NtZFBpcGVsaW5lQmFycmllciogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlRnJhbWVidWZmZXIocGFja2V0X3ZrQ3JlYXRlRnJhbWVidWZmZXIqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZVJlbmRlclBhc3MocGFja2V0X3ZrQ3JlYXRlUmVuZGVyUGFzcyogcFBhY2tldCk7CisgICAgdm9pZCBtYW51YWxseV9yZXBsYXlfdmtDbWRCZWdpblJlbmRlclBhc3MocGFja2V0X3ZrQ21kQmVnaW5SZW5kZXJQYXNzKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtCZWdpbkNvbW1hbmRCdWZmZXIocGFja2V0X3ZrQmVnaW5Db21tYW5kQnVmZmVyKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKHBhY2tldF92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a1dhaXRGb3JGZW5jZXMocGFja2V0X3ZrV2FpdEZvckZlbmNlcyogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrQWxsb2NhdGVNZW1vcnkocGFja2V0X3ZrQWxsb2NhdGVNZW1vcnkqIHBQYWNrZXQpOworICAgIHZvaWQgbWFudWFsbHlfcmVwbGF5X3ZrRnJlZU1lbW9yeShwYWNrZXRfdmtGcmVlTWVtb3J5KiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtNYXBNZW1vcnkocGFja2V0X3ZrTWFwTWVtb3J5KiBwUGFja2V0KTsKKyAgICB2b2lkIG1hbnVhbGx5X3JlcGxheV92a1VubWFwTWVtb3J5KHBhY2tldF92a1VubWFwTWVtb3J5KiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhwYWNrZXRfdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhwYWNrZXRfdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKiBwUGFja2V0KTsKKyAgICB2b2lkIG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyhwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMqIHBQYWNrZXQpOworICAgIHZvaWQgbWFudWFsbHlfcmVwbGF5X3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVTd2FwY2hhaW5LSFIocGFja2V0X3ZrQ3JlYXRlU3dhcGNoYWluS0hSKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIocGFja2V0X3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtRdWV1ZVByZXNlbnRLSFIocGFja2V0X3ZrUXVldWVQcmVzZW50S0hSKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVYY2JTdXJmYWNlS0hSKHBhY2tldF92a0NyZWF0ZVhjYlN1cmZhY2VLSFIqIHBQYWNrZXQpOworICAgIFZrQm9vbDMyIG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKHBhY2tldF92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKiBwUGFja2V0KTsKKyAgICBWa0Jvb2wzMiBtYW51YWxseV9yZXBsYXlfdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIqIHBQYWNrZXQpOworICAgIFZrUmVzdWx0IG1hbnVhbGx5X3JlcGxheV92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUihwYWNrZXRfdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIqIHBQYWNrZXQpOworICAgIFZrQm9vbDMyIG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKiBwUGFja2V0KTsKKyAgICBWa1Jlc3VsdCBtYW51YWxseV9yZXBsYXlfdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUihwYWNrZXRfdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiogcFBhY2tldCk7CisgICAgVmtSZXN1bHQgbWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVChwYWNrZXRfdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiBwUGFja2V0KTsKKyAgICB2b2lkIG1hbnVhbGx5X3JlcGxheV92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKHBhY2tldF92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKiBwUGFja2V0KTsKKworICAgIHZvaWQgcHJvY2Vzc19zY3JlZW5zaG90X2xpc3QoY29uc3QgY2hhciAqbGlzdCkKKyAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNwZWMobGlzdCksIHdvcmQ7CisgICAgICAgIHNpemVfdCBzdGFydCA9IDAsIGNvbW1hID0gMDsKKworICAgICAgICB3aGlsZSAoc3RhcnQgPCBzcGVjLnNpemUoKSkgeworICAgICAgICAgICAgY29tbWEgPSBzcGVjLmZpbmQoJywnLCBzdGFydCk7CisKKyAgICAgICAgICAgIGlmIChjb21tYSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICAgICAgICB3b3JkID0gc3RkOjpzdHJpbmcoc3BlYywgc3RhcnQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdvcmQgPSBzdGQ6OnN0cmluZyhzcGVjLCBzdGFydCwgY29tbWEgLSBzdGFydCk7CisKKyAgICAgICAgICAgIG1fc2NyZWVuc2hvdEZyYW1lcy5wdXNoX2JhY2soYXRvaSh3b3JkLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIGlmIChjb21tYSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgc3RhcnQgPSBjb21tYSArIDE7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cnVjdCBRdWV1ZUZhbWlseVByb3BlcnRpZXMgeworICAgICAgICB1aW50MzJfdCBjb3VudDsKKyAgICAgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHF1ZXVlRmFtaWx5UHJvcGVydGllczsKKyAgICB9OworCisgICAgLy8gTWFwIFZrUGh5c2ljYWxEZXZpY2UgdG8gUXVldWVGYW1pbHlQcm9wZXRpZXMgKGFuZCB1bHRpbWF0ZWx5IHF1ZXVlIGluZGljZXMpCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrUGh5c2ljYWxEZXZpY2UsIHN0cnVjdCBRdWV1ZUZhbWlseVByb3BlcnRpZXM+IHRyYWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1BoeXNpY2FsRGV2aWNlLCBzdHJ1Y3QgUXVldWVGYW1pbHlQcm9wZXJ0aWVzPiByZXBsYXlRdWV1ZUZhbWlseVByb3BlcnRpZXM7CisKKyAgICAvLyBNYXAgVmtEZXZpY2UgdG8gYSBWa1BoeXNpY2FsRGV2aWNlCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlPiB0cmFjZVBoeXNpY2FsRGV2aWNlczsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtEZXZpY2UsIFZrUGh5c2ljYWxEZXZpY2U+IHJlcGxheVBoeXNpY2FsRGV2aWNlczsKKworICAgIC8vIE1hcCBWa0J1ZmZlciB0byBWa0RldmljZSwgc28gd2UgY2FuIHNlYXJjaCBmb3IgdGhlIFZrRGV2aWNlIHVzZWQgdG8gY3JlYXRlIGEgYnVmZmVyCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFZrQnVmZmVyLCBWa0RldmljZT4gdHJhY2VCdWZmZXJUb0RldmljZTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtCdWZmZXIsIFZrRGV2aWNlPiByZXBsYXlCdWZmZXJUb0RldmljZTsKKworICAgIC8vIE1hcCBWa0ltYWdlIHRvIFZrRGV2aWNlLCBzbyB3ZSBjYW4gc2VhcmNoIGZvciB0aGUgVmtEZXZpY2UgdXNlZCB0byBjcmVhdGUgYW4gaW1hZ2UKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtJbWFnZSwgVmtEZXZpY2U+IHRyYWNlSW1hZ2VUb0RldmljZTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VmtJbWFnZSwgVmtEZXZpY2U+IHJlcGxheUltYWdlVG9EZXZpY2U7CisKKyAgICAvLyBNYXAgVmtQaHlzaWNhbERldmljZSB0byBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVyaXRlcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1BoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcz4gdHJhY2VNZW1vcnlQcm9wZXJ0aWVzOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxWa1BoeXNpY2FsRGV2aWNlLCBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcz4gcmVwbGF5TWVtb3J5UHJvcGVydGllczsKKworICAgIGJvb2wgZ2V0TWVtb3J5VHlwZUlkeChWa0RldmljZSB0cmFjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2UgcmVwbGF5RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFjZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBSZXBsYXlJZHgpOworCisgICAgYm9vbCBnZXRRdWV1ZUZhbWlseUlkeChWa1BoeXNpY2FsRGV2aWNlIHRyYWNlUGh5c2ljYWxEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BoeXNpY2FsRGV2aWNlIHJlcGxheVBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2VJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFJlcGxheUlkeCk7CisgICAgYm9vbCBnZXRRdWV1ZUZhbWlseUlkeChWa0RldmljZSB0cmFjZURldmljZSwKKyAgICAgICAgVmtEZXZpY2UgcmVwbGF5RGV2aWNlLAorICAgICAgICB1aW50MzJfdCB0cmFjZUlkeCwKKyAgICAgICAgdWludDMyX3QqIHBSZXBsYXlJZHgpOworCit9OwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci9DTWFrZUxpc3RzLnR4dCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyNWFkOQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4MyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKKworcHJvamVjdCh2a3RyYWNldmlld2VyX3ZrKQorCitpbmNsdWRlKCIke1NSQ19ESVJ9L2J1aWxkX29wdGlvbnMuY21ha2UiKQorCitmaW5kX3BhY2thZ2UoUXQ1IENPTVBPTkVOVFMgV2lkZ2V0cyBHdWkgQ29yZSBTdmcgUVVJRVQpCisKK2lmKE5PVCBRdDVfRk9VTkQpCisjIEFmdGVyIFF0NS42IGlzIGluc3RhbGxlZCwgeW91IG1heSBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBjbWFrZSBjb21tYW5kIGxpbmU6CisjIC1EQ01BS0VfUFJFRklYX1BBVEg9QzpcXFF0XFw1LjZcXG1zdmMyMDE1XzY0XFwKK21lc3NhZ2UoV0FSTklORyAiV0FSTklORzogdmt0cmFjZXZpZXdlcl92ayB3aWxsIGJlIGV4Y2x1ZGVkIGJlY2F1c2UgUXQ1IHdhcyBub3QgZm91bmQuIikKK2Vsc2UoKQorCitzZXQoU1JDX0xJU1QKKyAgICAke1NSQ19MSVNUfQorICAgIHZrdHJhY2V2aWV3ZXJfdmsuY3BwCisgICAgdmt0cmFjZXZpZXdlcl92a19zZXR0aW5ncy5jcHAKKyAgICB2a3RyYWNldmlld2VyX3ZrX3Fjb250cm9sbGVyLmNwcAorICAgIHZrdHJhY2V2aWV3ZXJfdmtfcWZpbGVfbW9kZWwuY3BwCisgICAgdmt0cmFjZXZpZXdlcl92a19xZ3JvdXBmcmFtZXNwcm94eW1vZGVsLmNwcAorICAgICR7U1JDX0RJUn0vdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyLmNwcAorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfZmFjdG9yeS5jcHAKKykKKworIyBUaGlzIHNob3VsZCBvbmx5IGNvbnRhaW4gaGVhZGVycyB0aGF0IGRlZmluZSBhIFFPQkpFQ1QKKyMgVHlwaWNhbGx5IHRoYXQgbWVhbnMganVzdCBoZWFkZXJzIGZvciBVSSBvYmplY3RzCitzZXQoVUlfSEVBREVSX0xJU1QKKyAgICB2a3RyYWNldmlld2VyX3ZrX3Fjb250cm9sbGVyLmgKKyAgICB2a3RyYWNldmlld2VyX3ZrX3FmaWxlX21vZGVsLmgKKyAgICB2a3RyYWNldmlld2VyX3ZrX3Fncm91cGZyYW1lc3Byb3h5bW9kZWwuaAorICAgICR7U1JDX0RJUn0vdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xZ3JvdXB0aHJlYWRzcHJveHltb2RlbC5oCisgICAgJHtTUkNfRElSfS92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FpbWFnZXZpZXdlci5oCisgICAgJHtTUkNfRElSfS92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3Fzdmd2aWV3ZXIuaAorICAgICR7U1JDX0RJUn0vdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwuaAorICAgICR7U1JDX0RJUn0vdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RUmVwbGF5V2lkZ2V0LmgKKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlci5oCispCisKK3NldChIRFJfTElTVAorICAgIHZrdHJhY2V2aWV3ZXJfdmtfc2V0dGluZ3MuaAorICAgIHZrdHJhY2V2aWV3ZXJfdmtfcWdyb3VwZnJhbWVzcHJveHltb2RlbC5oCisgICAgJHtTUkNfRElSfS92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3Fncm91cHRocmVhZHNwcm94eW1vZGVsLmgKKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oCisgICAgJHtTUkNfRElSfS92a3RyYWNlX3JlcGxheS92a3JlcGxheV9mYWN0b3J5LmgKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vdnVsa2FuL2NvZGVnZW5fdXRpbHMvdmtfZW51bV9zdHJpbmdfaGVscGVyLmgKKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9L3ZrdHJhY2VfdmtfcGFja2V0X2lkLmgKKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9L3ZrdHJhY2VfdmtfdmtfcGFja2V0cy5oCispCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtDT0RFR0VOX1ZLVFJBQ0VfRElSfQorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9jb21tb24KKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2Vfdmlld2VyCisgICAgJHtTUkNfRElSfS92a3RyYWNlX3JlcGxheQorICAgICR7U1JDX0RJUn0vdGhpcmRwYXJ0eQorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi92a3JlcGxheQorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi92dWxrYW4vY29kZWdlbl91dGlscworICAgICR7VktUUkFDRV9WVUxLQU5fRElSfS8ke0NPREVHRU5fVktUUkFDRV9ESVJ9CisgICAgJHtWS1RSQUNFX1ZVTEtBTl9JTkNMVURFX0RJUn0KKyAgICAke1F0NVdpZGdldHNfSU5DTFVERV9ESVJTfQorKQorCitRVDVfV1JBUF9DUFAoUVRfR0VOX0hFQURFUl9NT0NfTElTVCAke1VJX0hFQURFUl9MSVNUfSkKKworc2V0IChDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgIiR7UFJPSkVDVF9CSU5BUllfRElSfS8uLi8uLi8uLi8uLi8iKQorCithZGRfbGlicmFyeSgke1BST0pFQ1RfTkFNRX0gU1RBVElDICR7U1JDX0xJU1R9ICR7SERSX0xJU1R9CisgICAgJHtRVF9HRU5fSEVBREVSX01PQ19MSVNUfQorKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoJHtQUk9KRUNUX05BTUV9IAorICAgIFF0NTo6V2lkZ2V0cworICAgIFF0NTo6Q29yZQorICAgIFF0NTo6U3ZnCisgICAgJHtWS1RSQUNFX1ZVTEtBTl9MSUJ9CisgICAgdmt0cmFjZV9jb21tb24KKyAgICB2dWxrYW5fcmVwbGF5CispCisKK2J1aWxkX29wdGlvbnNfZmluYWxpemUoKQorCitlbmRpZihOT1QgUXQ1X0ZPVU5EKQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92ay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmYTZhZQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92ay5jcHAKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl92a19xY29udHJvbGxlci5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oIgorCitleHRlcm4gIkMiCit7CitWS1RSQUNFUl9FWFBPUlQgdmt0cmFjZXZpZXdlcl9RQ29udHJvbGxlciogVktUUkFDRVJfQ0RFQ0wgdnR2Q3JlYXRlUUNvbnRyb2xsZXIoKQoreworICAgIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXIqIHBDb250cm9sbGVyID0gbmV3IHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXIoKTsKKworICAgIHJldHVybiAodmt0cmFjZXZpZXdlcl9RQ29udHJvbGxlciopIHBDb250cm9sbGVyOworfQorCitWS1RSQUNFUl9FWFBPUlQgdm9pZCBWS1RSQUNFUl9DREVDTCB2dHZEZWxldGVRQ29udHJvbGxlcih2a3RyYWNldmlld2VyX1FDb250cm9sbGVyKiogcHBDb250cm9sbGVyKQoreworICAgIGlmIChwcENvbnRyb2xsZXIgIT0gTlVMTCAmJiAqcHBDb250cm9sbGVyICE9IE5VTEwpCisgICAgeworICAgICAgICBkZWxldGUgKnBwQ29udHJvbGxlcjsKKyAgICAgICAgKnBwQ29udHJvbGxlciA9IE5VTEw7CisgICAgfQorfQorCit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWNvbnRyb2xsZXIuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrX3Fjb250cm9sbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmNkN2MyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrX3Fjb250cm9sbGVyLmNwcApAQCAtMCwwICsxLDM2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3ZrX3NldHRpbmdzLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl92a19xY29udHJvbGxlci5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF91dGlscy5oIgorI2luY2x1ZGUgInZrdHJhY2VfdmtfcGFja2V0X2lkLmgiCit9CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxRRmlsZUluZm8+CisjaW5jbHVkZSA8UVdpZGdldD4KKyNpbmNsdWRlIDxRVG9vbEJ1dHRvbj4KKyNpbmNsdWRlIDxRQ29yZUFwcGxpY2F0aW9uPgorI2luY2x1ZGUgPFFQcm9jZXNzPgorCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl92aWV3LmgiCisjaW5jbHVkZSAidmtyZXBsYXlfc2VxLmgiCisKK3N0YXRpYyB2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyKiBzX3BDb250cm9sbGVyOworCit2b2lkIGNvbnRyb2xsZXJMb2dnaW5nQ2FsbGJhY2soVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBwTWVzc2FnZSkKK3sKKyAgICBpZiAoc19wQ29udHJvbGxlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc19wQ29udHJvbGxlci0+T25PdXRwdXRNZXNzYWdlKGxldmVsLCBwTWVzc2FnZSk7CisgICAgfQorfQorCit2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyOjp2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyKCkKKyAgICA6IG1fcFZpZXcoTlVMTCksCisgICAgICBtX3BUcmFjZUZpbGVJbmZvKE5VTEwpLAorICAgICAgbV9wRHJhd1N0YXRlRGlhZ3JhbShOVUxMKSwKKyAgICAgIG1fcENvbW1hbmRCdWZmZXJzRGlhZ3JhbShOVUxMKSwKKyAgICAgIG1fcFJlcGxheVdpZGdldChOVUxMKSwKKyAgICAgIG1fcFRyYWNlRmlsZU1vZGVsKE5VTEwpCit7CisgICAgc19wQ29udHJvbGxlciA9IHRoaXM7CisgICAgdmt0cmFjZV9Mb2dTZXRDYWxsYmFjayhjb250cm9sbGVyTG9nZ2luZ0NhbGxiYWNrKTsKKyAgICB2a3RyYWNlX0xvZ1NldExldmVsKFZLVFJBQ0VfTE9HX0VSUk9SKTsKKyAgICBpbml0aWFsaXplX2RlZmF1bHRfc2V0dGluZ3MoKTsKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9yZXNldF9kZWZhdWx0cygmZ192a1RyYWNlVmlld2VyU2V0dGluZ0dyb3VwKTsKK30KKwordmt0cmFjZXZpZXdlcl92a19RQ29udHJvbGxlcjo6fnZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXIoKQoreworfQorCit2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXI6OkludGVycHJldFRyYWNlUGFja2V0KHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcikKK3sKKyAgICAvLyBBdHRlbXB0IHRvIGludGVycHJldCB0aGUgcGFja2V0IGFzIGEgVnVsa2FuIHBhY2tldAorICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEludGVycHJldGVkSGVhZGVyID0gaW50ZXJwcmV0X3RyYWNlX3BhY2tldF92ayhwSGVhZGVyKTsKKyAgICBpZiAocEludGVycHJldGVkSGVhZGVyID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJVbnJlY29nbml6ZWQgVnVsa2FuIHBhY2tldCBpZDogJXUuIiwgcEhlYWRlci0+cGFja2V0X2lkKTsKKyAgICB9CisgICAgZWxzZSBpZiAocEludGVycHJldGVkSGVhZGVyLT5wYWNrZXRfaWQgPT0gVktUUkFDRV9UUElfVktfdmtBcGlWZXJzaW9uKQorICAgIHsKKyAgICAgICAgcGFja2V0X3ZrQXBpVmVyc2lvbiogcFBhY2tldCA9IChwYWNrZXRfdmtBcGlWZXJzaW9uKilwSW50ZXJwcmV0ZWRIZWFkZXItPnBCb2R5OworICAgICAgICBpZiAocFBhY2tldC0+dmVyc2lvbiAhPSBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJUcmFjZSBmaWxlIGlzIGZyb20gVnVsa2FuIHZlcnNpb24gMHgleCAoJXUuJXUuJXUpLCBidXQgdGhlIFZrVHJhY2VWaWV3ZXIgcGx1Z2luIG9ubHkgc3VwcG9ydHMgdmVyc2lvbiAweCV4ICgldS4ldS4ldSkuIiwgcFBhY2tldC0+dmVyc2lvbiwgVktfVkVSU0lPTl9NQUpPUihwUGFja2V0LT52ZXJzaW9uKSwgVktfVkVSU0lPTl9NSU5PUihwUGFja2V0LT52ZXJzaW9uKSwgVktfVkVSU0lPTl9QQVRDSChwUGFja2V0LT52ZXJzaW9uKSwgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwgMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pOworICAgICAgICAgICAgcEludGVycHJldGVkSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwSW50ZXJwcmV0ZWRIZWFkZXI7Cit9CisKK2Jvb2wgdmt0cmFjZXZpZXdlcl92a19RQ29udHJvbGxlcjo6TG9hZFRyYWNlRmlsZSh2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyogcFRyYWNlRmlsZUluZm8sIHZrdHJhY2V2aWV3ZXJfdmlldyogcFZpZXcpCit7CisgICAgYXNzZXJ0KHBUcmFjZUZpbGVJbmZvICE9IE5VTEwpOworICAgIGFzc2VydChwVmlldyAhPSBOVUxMKTsKKyAgICBzZXRWaWV3KHBWaWV3KTsKKyAgICBtX3BUcmFjZUZpbGVJbmZvID0gcFRyYWNlRmlsZUluZm87CisKKyAgICBhc3NlcnQobV9wUmVwbGF5V2lkZ2V0ID09IE5VTEwpOworICAgIG1fcFJlcGxheVdpZGdldCA9IG5ldyB2a3RyYWNldmlld2VyX1FSZXBsYXlXaWRnZXQoJm1fcmVwbGF5V29ya2VyKTsKKyAgICBpZiAobV9wUmVwbGF5V2lkZ2V0ICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBsb2FkIGF2YWlsYWJsZSByZXBsYXllcnMKKyAgICAgICAgaWYgKCFtX3JlcGxheVdvcmtlci5sb2FkX3JlcGxheWVycyhwVHJhY2VGaWxlSW5mbywgbV9wUmVwbGF5V2lkZ2V0LT5HZXRSZXBsYXlXaW5kb3coKSwKKyAgICAgICAgICAgIGdfdmtUcmFjZVZpZXdlclNldHRpbmdzLnJlcGxheV93aW5kb3dfd2lkdGgsCisgICAgICAgICAgICBnX3ZrVHJhY2VWaWV3ZXJTZXR0aW5ncy5yZXBsYXlfd2luZG93X2hlaWdodCwKKyAgICAgICAgICAgIGdfdmtUcmFjZVZpZXdlclNldHRpbmdzLnNlcGFyYXRlX3JlcGxheV93aW5kb3cpKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsICJGYWlsZWQgdG8gbG9hZCBuZWNlc3NhcnkgcmVwbGF5ZXJzLiIpOworICAgICAgICAgICAgZGVsZXRlIG1fcFJlcGxheVdpZGdldDsKKyAgICAgICAgICAgIG1fcFJlcGxheVdpZGdldCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtX3BWaWV3LT5hZGRfY3VzdG9tX3N0YXRlX3ZpZXdlcihtX3BSZXBsYXlXaWRnZXQsICJSZXBsYXllciIsIHRydWUpOworICAgICAgICAgICAgbV9wUmVwbGF5V2lkZ2V0LT5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgY29ubmVjdChtX3BSZXBsYXlXaWRnZXQsIFNJR05BTChSZXBsYXlTdGFydGVkKCkpLCB0aGlzLCBTTE9UKG9uUmVwbGF5U3RhcnRlZCgpKSk7CisgICAgICAgICAgICBjb25uZWN0KG1fcFJlcGxheVdpZGdldCwgU0lHTkFMKFJlcGxheVBhdXNlZCh1aW50NjRfdCkpLCB0aGlzLCBTTE9UKG9uUmVwbGF5UGF1c2VkKHVpbnQ2NF90KSkpOworICAgICAgICAgICAgY29ubmVjdChtX3BSZXBsYXlXaWRnZXQsIFNJR05BTChSZXBsYXlDb250aW51ZWQoKSksIHRoaXMsIFNMT1Qob25SZXBsYXlDb250aW51ZWQoKSkpOworICAgICAgICAgICAgY29ubmVjdChtX3BSZXBsYXlXaWRnZXQsIFNJR05BTChSZXBsYXlTdG9wcGVkKHVpbnQ2NF90KSksIHRoaXMsIFNMT1Qob25SZXBsYXlTdG9wcGVkKHVpbnQ2NF90KSkpOworICAgICAgICAgICAgY29ubmVjdChtX3BSZXBsYXlXaWRnZXQsIFNJR05BTChSZXBsYXlGaW5pc2hlZCh1aW50NjRfdCkpLCB0aGlzLCBTTE9UKG9uUmVwbGF5RmluaXNoZWQodWludDY0X3QpKSk7CisgICAgICAgICAgICBjb25uZWN0KG1fcFJlcGxheVdpZGdldCwgU0lHTkFMKFJlcGxheVByb2dyZXNzVXBkYXRlKHVpbnQ2NF90KSksIHRoaXMsIFNMT1Qob25SZXBsYXlQcm9ncmVzc1VwZGF0ZSh1aW50NjRfdCkpKTsKKworICAgICAgICAgICAgY29ubmVjdChtX3BSZXBsYXlXaWRnZXQsIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgY29uc3QgUVN0cmluZyYpKSwgdGhpcywgU0lHTkFMKE91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsLCBjb25zdCBRU3RyaW5nJikpKTsKKyAgICAgICAgICAgIGNvbm5lY3QobV9wUmVwbGF5V2lkZ2V0LCBTSUdOQUwoT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwsIHVpbnQ2NF90LCBjb25zdCBRU3RyaW5nJikpLCB0aGlzLCBTSUdOQUwoT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwsIHVpbnQ2NF90LCBjb25zdCBRU3RyaW5nJikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChtX3BUcmFjZUZpbGVNb2RlbCA9PSBOVUxMKTsKKyAgICBtX3BUcmFjZUZpbGVNb2RlbCA9IG5ldyB2a3RyYWNldmlld2VyX3ZrX1FGaWxlTW9kZWwoTlVMTCwgcFRyYWNlRmlsZUluZm8pOworICAgIHVwZGF0ZUNhbGxUcmVlQmFzZWRPblNldHRpbmdzKCk7CisKKyAgICBkZWxldGVTdGF0ZUR1bXBzKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgY2hhciogdmt0cmFjZXZpZXdlcl92a19RQ29udHJvbGxlcjo6R2V0UGFja2V0SWRTdHJpbmcodWludDE2X3QgcGFja2V0SWQpCit7CisgICAgcmV0dXJuIHZrdHJhY2VfdmtfcGFja2V0X2lkX25hbWUoKFZLVFJBQ0VfVFJBQ0VfUEFDS0VUX0lEX1ZLKXBhY2tldElkKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyOjp1cGRhdGVDYWxsVHJlZUJhc2VkT25TZXR0aW5ncygpCit7CisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdfdmtUcmFjZVZpZXdlclNldHRpbmdzLmdyb3VwQnlGcmFtZSkKKyAgICB7CisgICAgICAgIGlmIChtX2dyb3VwQnlGcmFtZXNQcm94eS5zb3VyY2VNb2RlbCgpICE9IG1fcFRyYWNlRmlsZU1vZGVsKQorICAgICAgICB7CisgICAgICAgICAgICBtX2dyb3VwQnlGcmFtZXNQcm94eS5zZXRTb3VyY2VNb2RlbChtX3BUcmFjZUZpbGVNb2RlbCk7CisgICAgICAgIH0KKyAgICAgICAgbV9wVmlldy0+c2V0X2NhbGx0cmVlX21vZGVsKG1fcFRyYWNlRmlsZU1vZGVsLCAmbV9ncm91cEJ5RnJhbWVzUHJveHkpOworICAgIH0KKyAgICBlbHNlIGlmIChnX3ZrVHJhY2VWaWV3ZXJTZXR0aW5ncy5ncm91cEJ5VGhyZWFkKQorICAgIHsKKyAgICAgICAgaWYgKG1fZ3JvdXBCeVRocmVhZHNQcm94eS5zb3VyY2VNb2RlbCgpICE9IG1fcFRyYWNlRmlsZU1vZGVsKQorICAgICAgICB7CisgICAgICAgICAgICBtX2dyb3VwQnlUaHJlYWRzUHJveHkuc2V0U291cmNlTW9kZWwobV9wVHJhY2VGaWxlTW9kZWwpOworICAgICAgICB9CisgICAgICAgIG1fcFZpZXctPnNldF9jYWxsdHJlZV9tb2RlbChtX3BUcmFjZUZpbGVNb2RlbCwgJm1fZ3JvdXBCeVRocmVhZHNQcm94eSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1fcFZpZXctPnNldF9jYWxsdHJlZV9tb2RlbChtX3BUcmFjZUZpbGVNb2RlbCwgTlVMTCk7CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXI6OmRlbGV0ZVN0YXRlRHVtcHMoKSBjb25zdAoreworICAgIFFGaWxlOjpyZW1vdmUoInBpcGVsaW5lX2R1bXAuZG90Iik7CisgICAgUUZpbGU6OnJlbW92ZSgicGlwZWxpbmVfZHVtcC5zdmciKTsKKyAgICBRRmlsZTo6cmVtb3ZlKCJjYl9kdW1wLmRvdCIpOworICAgIFFGaWxlOjpyZW1vdmUoImNiX2R1bXAuc3ZnIik7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl92a19RQ29udHJvbGxlcjo6c2V0U3RhdGVXaWRnZXRzRW5hYmxlZChib29sIGJFbmFibGVkKQoreworICAgIGlmKG1fcERyYXdTdGF0ZURpYWdyYW0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1fcFZpZXctPmVuYWJsZV9jdXN0b21fc3RhdGVfdmlld2VyKG1fcERyYXdTdGF0ZURpYWdyYW0sIGJFbmFibGVkKTsKKyAgICB9CisKKyAgICBpZihtX3BDb21tYW5kQnVmZmVyc0RpYWdyYW0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1fcFZpZXctPmVuYWJsZV9jdXN0b21fc3RhdGVfdmlld2VyKG1fcENvbW1hbmRCdWZmZXJzRGlhZ3JhbSwgYkVuYWJsZWQpOworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyOjpvblJlcGxheVN0YXJ0ZWQoKQoreworICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19WRVJCT1NFLCAiUmVwbGF5IFN0YXJ0ZWQiKTsKKyAgICBkZWxldGVTdGF0ZUR1bXBzKCk7CisgICAgc2V0U3RhdGVXaWRnZXRzRW5hYmxlZChmYWxzZSk7CisgICAgbV9wVmlldy0+b25fcmVwbGF5X3N0YXRlX2NoYW5nZWQodHJ1ZSk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl92a19RQ29udHJvbGxlcjo6b25SZXBsYXlQYXVzZWQodWludDY0X3QgcGFja2V0SW5kZXgpCit7CisgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX1ZFUkJPU0UsIHBhY2tldEluZGV4LCAiUmVwbGF5IFBhdXNlZCIpOworICAgIG1fcFZpZXctPm9uX3JlcGxheV9zdGF0ZV9jaGFuZ2VkKGZhbHNlKTsKKworICAgIC8vIFdoZW4gcGF1c2VkLCB0aGUgcmVwbGF5IHdpbGwgJ2NvbnRpbnVlJyBmcm9tIHRoZSBsYXN0IHBhY2tldCwKKyAgICAvLyBzbyBzZWxlY3QgdGhhdCBjYWxsIHRvIGluZGljYXRlIHRvIHRoZSB1c2VyIHdoZXJlIHRoZSBwYXVzZSBvY2N1cmVkLgorICAgIG1fcFZpZXctPnNlbGVjdF9jYWxsX2F0X3BhY2tldF9pbmRleChwYWNrZXRJbmRleCk7CisKKyAgICAvLyBEdW1wIHN0YXRlIGRhdGEgZnJvbSB0aGUgcmVwbGF5ZXIKKyAgICB2a3RyYWNlX3JlcGxheTo6dmt0cmFjZV90cmFjZV9wYWNrZXRfcmVwbGF5X2xpYnJhcnkqIHBWa1JlcGxheWVyID0gbV9yZXBsYXlXb3JrZXIuZ2V0UmVwbGF5ZXIoVktUUkFDRV9USURfVlVMS0FOKTsKKyAgICBpZiAocFZrUmVwbGF5ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIGVyciA9IHBWa1JlcGxheWVyLT5EdW1wKCk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19XQVJOSU5HLCBwYWNrZXRJbmRleCwgIlJlcGxheWVyIGNvdWxkbid0IG91dHB1dCBzdGF0ZSBkYXRhLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IHRyeSB0byBsb2FkIGtub3duIHN0YXRlIGRhdGEuCisKKyAgICAvLyBDb252ZXJ0IGRvdCBmaWxlcyB0byBzdmcgZm9ybWF0CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkKKyAgICBpZiAoUUZpbGU6OmV4aXN0cygiL3Vzci9iaW4vZG90IikpCisgICAgeworICAgICAgICBRUHJvY2VzcyBwcm9jZXNzOworICAgICAgICBwcm9jZXNzLnN0YXJ0KCIvdXNyL2Jpbi9kb3QgcGlwZWxpbmVfZHVtcC5kb3QgLVRzdmcgLW8gcGlwZWxpbmVfZHVtcC5zdmciKTsKKyAgICAgICAgcHJvY2Vzcy53YWl0Rm9yRmluaXNoZWQoLTEpOworICAgICAgICBwcm9jZXNzLnN0YXJ0KCIvdXNyL2Jpbi9kb3QgY2JfZHVtcC5kb3QgLVRzdmcgLW8gY2JfZHVtcC5zdmciKTsKKyAgICAgICAgcHJvY2Vzcy53YWl0Rm9yRmluaXNoZWQoLTEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsIHBhY2tldEluZGV4LCAiRE9UIG5vdCBmb3VuZCwgdW5hYmxlIHRvIGdlbmVyYXRlIHN0YXRlIGRpYWdyYW1zLiIpOworICAgIH0KKyNlbHNlCisgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCBwYWNrZXRJbmRleCwgIkRPVCBub3QgZm91bmQsIHVuYWJsZSB0byBnZW5lcmF0ZSBzdGF0ZSBkaWFncmFtcy4iKTsKKyNlbmRpZgorCisgICAgaWYgKFFGaWxlOjpleGlzdHMoInBpcGVsaW5lX2R1bXAuc3ZnIikpCisgICAgeworICAgICAgICBpZiAobV9wRHJhd1N0YXRlRGlhZ3JhbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBtX3BEcmF3U3RhdGVEaWFncmFtID0gbmV3IHZrdHJhY2V2aWV3ZXJfcXN2Z3ZpZXdlcigpOworICAgICAgICAgICAgbV9wVmlldy0+YWRkX2N1c3RvbV9zdGF0ZV92aWV3ZXIobV9wRHJhd1N0YXRlRGlhZ3JhbSwgdHIoIkRyYXcgU3RhdGUiKSwgZmFsc2UpOworICAgICAgICAgICAgbV9wVmlldy0+ZW5hYmxlX2N1c3RvbV9zdGF0ZV92aWV3ZXIobV9wRHJhd1N0YXRlRGlhZ3JhbSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fcERyYXdTdGF0ZURpYWdyYW0gIT0gTlVMTCAmJiBtX3BEcmF3U3RhdGVEaWFncmFtLT5sb2FkKHRyKCJwaXBlbGluZV9kdW1wLnN2ZyIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV9wVmlldy0+ZW5hYmxlX2N1c3RvbV9zdGF0ZV92aWV3ZXIobV9wRHJhd1N0YXRlRGlhZ3JhbSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGlmIChRRmlsZTo6ZXhpc3RzKCJjYl9kdW1wLnN2ZyIpKQorICAgIHsKKyAgICAgICAgaWYgKG1fcENvbW1hbmRCdWZmZXJzRGlhZ3JhbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBtX3BDb21tYW5kQnVmZmVyc0RpYWdyYW0gPSBuZXcgdmt0cmFjZXZpZXdlcl9xc3Zndmlld2VyKCk7CisgICAgICAgICAgICBtX3BWaWV3LT5hZGRfY3VzdG9tX3N0YXRlX3ZpZXdlcihtX3BDb21tYW5kQnVmZmVyc0RpYWdyYW0sIHRyKCJDb21tYW5kIEJ1ZmZlcnMiKSwgZmFsc2UpOworICAgICAgICAgICAgbV9wVmlldy0+ZW5hYmxlX2N1c3RvbV9zdGF0ZV92aWV3ZXIobV9wQ29tbWFuZEJ1ZmZlcnNEaWFncmFtLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9wQ29tbWFuZEJ1ZmZlcnNEaWFncmFtICE9IE5VTEwgJiYgbV9wQ29tbWFuZEJ1ZmZlcnNEaWFncmFtLT5sb2FkKHRyKCJjYl9kdW1wLnN2ZyIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV9wVmlldy0+ZW5hYmxlX2N1c3RvbV9zdGF0ZV92aWV3ZXIobV9wQ29tbWFuZEJ1ZmZlcnNEaWFncmFtLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyOjpvblJlcGxheUNvbnRpbnVlZCgpCit7CisgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX1ZFUkJPU0UsICJSZXBsYXkgQ29udGludWVkIik7CisgICAgZGVsZXRlU3RhdGVEdW1wcygpOworICAgIHNldFN0YXRlV2lkZ2V0c0VuYWJsZWQoZmFsc2UpOworICAgIG1fcFZpZXctPm9uX3JlcGxheV9zdGF0ZV9jaGFuZ2VkKHRydWUpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXI6Om9uUmVwbGF5U3RvcHBlZCh1aW50NjRfdCBwYWNrZXRJbmRleCkKK3sKKyAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfVkVSQk9TRSwgcGFja2V0SW5kZXgsICJSZXBsYXkgU3RvcHBlZCIpOworICAgIG1fcFZpZXctPm9uX3JlcGxheV9zdGF0ZV9jaGFuZ2VkKGZhbHNlKTsKKyAgICBzZXRTdGF0ZVdpZGdldHNFbmFibGVkKGZhbHNlKTsKKworICAgIC8vIFN0b3BwaW5nIHRoZSByZXBsYXkgbWVhbnMgdGhhdCBpdCB3aWxsICdwbGF5JyBvciAnc3RlcCcgZnJvbSB0aGUgYmVnaW5uaW5nLAorICAgIC8vIHNvIHNlbGVjdCB0aGUgZmlyc3QgcGFja2V0IGluZGV4IHRvIGluZGljYXRlIHRvIHRoZSB1c2VyIHdoYXQgc3RvcHBpbmcgcmVwbGF5IGRvZXMuCisgICAgbV9wVmlldy0+c2VsZWN0X2NhbGxfYXRfcGFja2V0X2luZGV4KDApOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXI6Om9uUmVwbGF5UHJvZ3Jlc3NVcGRhdGUodWludDY0X3QgcGFja2V0QXJyYXlJbmRleCkKK3sKKyAgICBtX3BWaWV3LT5oaWdobGlnaHRfdGltZWxpbmVfaXRlbShwYWNrZXRBcnJheUluZGV4LCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyOjpvblJlcGxheUZpbmlzaGVkKHVpbnQ2NF90IHBhY2tldEluZGV4KQoreworICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19WRVJCT1NFLCBwYWNrZXRJbmRleCwgIlJlcGxheSBGaW5pc2hlZCIpOworICAgIG1fcFZpZXctPm9uX3JlcGxheV9zdGF0ZV9jaGFuZ2VkKGZhbHNlKTsKKyAgICBzZXRTdGF0ZVdpZGdldHNFbmFibGVkKGZhbHNlKTsKKworICAgIC8vIFRoZSByZXBsYXkgaGFzIGNvbXBsZXRlZCwgc28gaGlnaGxpZ2h0IHRoZSBmaW5hbCBwYWNrZXQgaW5kZXguCisgICAgbV9wVmlldy0+c2VsZWN0X2NhbGxfYXRfcGFja2V0X2luZGV4KHBhY2tldEluZGV4KTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyOjpPbk91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBRU3RyaW5nJiBtc2cpCit7CisgICAgZW1pdCBPdXRwdXRNZXNzYWdlKGxldmVsLCBtc2cpOworfQorCit2a3RyYWNlX1NldHRpbmdHcm91cCogdmt0cmFjZXZpZXdlcl92a19RQ29udHJvbGxlcjo6R2V0U2V0dGluZ3MoKQoreworICAgIHJldHVybiAmZ192a1RyYWNlVmlld2VyU2V0dGluZ0dyb3VwOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXI6OlVwZGF0ZUZyb21TZXR0aW5ncyh2a3RyYWNlX1NldHRpbmdHcm91cCAqcEdyb3VwcywgdW5zaWduZWQgaW50IG51bUdyb3VwcykKK3sKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9BcHBseV9PdmVycmlkZXMoJmdfdmtUcmFjZVZpZXdlclNldHRpbmdHcm91cCwgcEdyb3VwcywgbnVtR3JvdXBzKTsKKworICAgIG1fcmVwbGF5V29ya2VyLnNldFByaW50UmVwbGF5TWVzc2FnZXMoZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucHJpbnRSZXBsYXlJbmZvTXNncywKKyAgICAgICAgZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucHJpbnRSZXBsYXlXYXJuaW5nTXNncywKKyAgICAgICAgZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucHJpbnRSZXBsYXlFcnJvck1zZ3MpOworCisgICAgbV9yZXBsYXlXb3JrZXIuc2V0UGF1c2VPblJlcGxheU1lc3NhZ2VzKGdfdmtUcmFjZVZpZXdlclNldHRpbmdzLnBhdXNlT25SZXBsYXlJbmZvLAorICAgICAgICBnX3ZrVHJhY2VWaWV3ZXJTZXR0aW5ncy5wYXVzZU9uUmVwbGF5V2FybmluZywKKyAgICAgICAgZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucGF1c2VPblJlcGxheUVycm9yKTsKKworICAgIG1fcmVwbGF5V29ya2VyLm9uU2V0dGluZ3NVcGRhdGVkKHBHcm91cHMsIG51bUdyb3Vwcyk7CisKKyAgICB1cGRhdGVDYWxsVHJlZUJhc2VkT25TZXR0aW5ncygpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXI6OlVubG9hZFRyYWNlRmlsZSh2b2lkKQoreworICAgIGlmIChtX3BWaWV3ICE9IE5VTEwpCisgICAgeworICAgICAgICBtX3BWaWV3LT5zZXRfY2FsbHRyZWVfbW9kZWwoTlVMTCwgTlVMTCk7CisgICAgICAgIG1fcFZpZXcgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtX3BUcmFjZUZpbGVNb2RlbCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZGVsZXRlIG1fcFRyYWNlRmlsZU1vZGVsOworICAgICAgICBtX3BUcmFjZUZpbGVNb2RlbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1fcFJlcGxheVdpZGdldCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZGVsZXRlIG1fcFJlcGxheVdpZGdldDsKKyAgICAgICAgbV9wUmVwbGF5V2lkZ2V0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobV9wRHJhd1N0YXRlRGlhZ3JhbSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZGVsZXRlIG1fcERyYXdTdGF0ZURpYWdyYW07CisgICAgICAgIG1fcERyYXdTdGF0ZURpYWdyYW0gPSBOVUxMOworICAgIH0KKworICAgIGlmIChtX3BDb21tYW5kQnVmZmVyc0RpYWdyYW0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRlbGV0ZSBtX3BDb21tYW5kQnVmZmVyc0RpYWdyYW07CisgICAgICAgIG1fcENvbW1hbmRCdWZmZXJzRGlhZ3JhbSA9IE5VTEw7CisgICAgfQorCisgICAgbV9yZXBsYXlXb3JrZXIudW5sb2FkUmVwbGF5ZXJzKCk7Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWNvbnRyb2xsZXIuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92a19xY29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTMwZDUKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWNvbnRyb2xsZXIuaApAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBWYWx2ZSBTb2Z0d2FyZS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVktUUkFDRVZJRVdFUl9WS19RQ09OVFJPTExFUl9ICisjZGVmaW5lIFZLVFJBQ0VWSUVXRVJfVktfUUNPTlRST0xMRVJfSAorCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfaWRlbnRpZmllcnMuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3ZrX3Fncm91cGZyYW1lc3Byb3h5bW9kZWwuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3Fncm91cHRocmVhZHNwcm94eW1vZGVsLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9xc3Zndmlld2VyLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9RUmVwbGF5V2lkZ2V0LmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl92a19xZmlsZV9tb2RlbC5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oIgorI2luY2x1ZGUgPFFMYWJlbD4KKyNpbmNsdWRlIDxRU2Nyb2xsQXJlYT4KKworCitjbGFzcyB2a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyIDogcHVibGljIHZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIKK3sKKyAgICBRX09CSkVDVAorcHVibGljOgorICAgIHZrdHJhY2V2aWV3ZXJfdmtfUUNvbnRyb2xsZXIoKTsKKyAgICB2aXJ0dWFsIH52a3RyYWNldmlld2VyX3ZrX1FDb250cm9sbGVyKCk7CisKKyAgICB2aXJ0dWFsIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogSW50ZXJwcmV0VHJhY2VQYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKTsKKyAgICB2aXJ0dWFsIGJvb2wgTG9hZFRyYWNlRmlsZSh2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyogcFRyYWNlRmlsZUluZm8sIHZrdHJhY2V2aWV3ZXJfdmlldyogcFZpZXcpOworICAgIHZpcnR1YWwgdm9pZCBVbmxvYWRUcmFjZUZpbGUodm9pZCk7CisKKyAgICB2b2lkIHNldFZpZXcodmt0cmFjZXZpZXdlcl92aWV3KiBwVmlldykKKyAgICB7CisgICAgICAgIG1fcFZpZXcgPSBwVmlldzsKKyAgICAgICAgbV9yZXBsYXlXb3JrZXIuc2V0VmlldyhwVmlldyk7CisgICAgfQorCisgICAgdmlydHVhbCB2a3RyYWNlX1NldHRpbmdHcm91cCogR2V0U2V0dGluZ3MoKTsKKyAgICB2aXJ0dWFsIHZvaWQgVXBkYXRlRnJvbVNldHRpbmdzKHZrdHJhY2VfU2V0dGluZ0dyb3VwICpwR3JvdXBzLCB1bnNpZ25lZCBpbnQgbnVtR3JvdXBzKTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciogR2V0UGFja2V0SWRTdHJpbmcodWludDE2X3QgcGFja2V0SWQpOworCitwdWJsaWMgc2xvdHM6CisgICAgdm9pZCBPbk91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBRU3RyaW5nJiBtc2cpOworCitzaWduYWxzOgorICAgIC8vIEluaGVyaXRlZCBmcm9tIGdsdmRlYnVnX1FDb250cm9sbGVyCisgICAgdm9pZCBPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCwgY29uc3QgUVN0cmluZyYgbWVzc2FnZSk7CisgICAgdm9pZCBPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCwgdWludDY0X3QgcGFja2V0SW5kZXgsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpOworCitwcm90ZWN0ZWQgc2xvdHM6CisgICAgdm9pZCBvblJlcGxheVN0YXJ0ZWQoKTsKKyAgICB2b2lkIG9uUmVwbGF5UGF1c2VkKHVpbnQ2NF90IHBhY2tldEluZGV4KTsKKyAgICB2b2lkIG9uUmVwbGF5Q29udGludWVkKCk7CisgICAgdm9pZCBvblJlcGxheVN0b3BwZWQodWludDY0X3QgcGFja2V0SW5kZXgpOworICAgIHZvaWQgb25SZXBsYXlGaW5pc2hlZCh1aW50NjRfdCBwYWNrZXRJbmRleCk7CisgICAgdm9pZCBvblJlcGxheVByb2dyZXNzVXBkYXRlKHVpbnQ2NF90IHBhY2tldEFycmF5SW5kZXgpOworCitwcml2YXRlOgorICAgIHZrdHJhY2V2aWV3ZXJfdmlldyogbV9wVmlldzsKKyAgICB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyogbV9wVHJhY2VGaWxlSW5mbzsKKyAgICB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXIgbV9yZXBsYXlXb3JrZXI7CisgICAgdmt0cmFjZXZpZXdlcl9xc3Zndmlld2VyKiBtX3BEcmF3U3RhdGVEaWFncmFtOworICAgIHZrdHJhY2V2aWV3ZXJfcXN2Z3ZpZXdlciogbV9wQ29tbWFuZEJ1ZmZlcnNEaWFncmFtOworICAgIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdpZGdldCogbV9wUmVwbGF5V2lkZ2V0OworICAgIHZrdHJhY2V2aWV3ZXJfdmtfUUZpbGVNb2RlbCogbV9wVHJhY2VGaWxlTW9kZWw7CisgICAgdmt0cmFjZXZpZXdlcl92a19RR3JvdXBGcmFtZXNQcm94eU1vZGVsIG1fZ3JvdXBCeUZyYW1lc1Byb3h5OworICAgIHZrdHJhY2V2aWV3ZXJfUUdyb3VwVGhyZWFkc1Byb3h5TW9kZWwgbV9ncm91cEJ5VGhyZWFkc1Byb3h5OworCisgICAgdm9pZCBzZXRTdGF0ZVdpZGdldHNFbmFibGVkKGJvb2wgYkVuYWJsZWQpOworICAgIHZvaWQgdXBkYXRlQ2FsbFRyZWVCYXNlZE9uU2V0dGluZ3MoKTsKKyAgICB2b2lkIGRlbGV0ZVN0YXRlRHVtcHMoKSBjb25zdDsKK307CisKKyNlbmRpZiAvLyBWS1RSQUNFVklFV0VSX1ZLX1FDT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92a19xZmlsZV9tb2RlbC5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWZpbGVfbW9kZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjE0MTYKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWZpbGVfbW9kZWwuY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl92a19xZmlsZV9tb2RlbC5oIgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3BhY2tldF9pZC5oIgorfQorCit2a3RyYWNldmlld2VyX3ZrX1FGaWxlTW9kZWw6OnZrdHJhY2V2aWV3ZXJfdmtfUUZpbGVNb2RlbChRT2JqZWN0KiBwYXJlbnQsIHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvKiBwVHJhY2VGaWxlSW5mbykKKyAgICAgICAgOiB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbChwYXJlbnQsIHBUcmFjZUZpbGVJbmZvKQoreworfQorCit2a3RyYWNldmlld2VyX3ZrX1FGaWxlTW9kZWw6On52a3RyYWNldmlld2VyX3ZrX1FGaWxlTW9kZWwoKQoreworfQorCitRU3RyaW5nIHZrdHJhY2V2aWV3ZXJfdmtfUUZpbGVNb2RlbDo6Z2V0X3BhY2tldF9zdHJpbmcoY29uc3Qgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKSBjb25zdAoreworICAgIGlmIChwSGVhZGVyLT5wYWNrZXRfaWQgPCBWS1RSQUNFX1RQSV9CRUdJTl9BUElfSEVSRSkKKyAgICB7CisgICAgICAgIHJldHVybiB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Z2V0X3BhY2tldF9zdHJpbmcocEhlYWRlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFFTdHJpbmcgcGFja2V0U3RyaW5nID0gdmt0cmFjZV9zdHJpbmdpZnlfdmtfcGFja2V0X2lkKChjb25zdCBlbnVtIFZLVFJBQ0VfVFJBQ0VfUEFDS0VUX0lEX1ZLKSBwSGVhZGVyLT5wYWNrZXRfaWQsIHBIZWFkZXIpOworICAgICAgICByZXR1cm4gcGFja2V0U3RyaW5nOworICAgIH0KK30KKworUVN0cmluZyB2a3RyYWNldmlld2VyX3ZrX1FGaWxlTW9kZWw6OmdldF9wYWNrZXRfc3RyaW5nX211bHRpbGluZShjb25zdCB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIpIGNvbnN0Cit7CisgICAgaWYgKHBIZWFkZXItPnBhY2tldF9pZCA8IFZLVFJBQ0VfVFBJX0JFR0lOX0FQSV9IRVJFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpnZXRfcGFja2V0X3N0cmluZ19tdWx0aWxpbmUocEhlYWRlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFFTdHJpbmcgcGFja2V0U3RyaW5nID0gdmt0cmFjZV9zdHJpbmdpZnlfdmtfcGFja2V0X2lkKChjb25zdCBlbnVtIFZLVFJBQ0VfVFJBQ0VfUEFDS0VUX0lEX1ZLKSBwSGVhZGVyLT5wYWNrZXRfaWQsIHBIZWFkZXIpOworICAgICAgICByZXR1cm4gcGFja2V0U3RyaW5nOworICAgIH0KK30KKworYm9vbCB2a3RyYWNldmlld2VyX3ZrX1FGaWxlTW9kZWw6OmlzRHJhd0NhbGwoY29uc3QgVktUUkFDRV9UUkFDRV9QQUNLRVRfSUQgcGFja2V0SWQpIGNvbnN0Cit7CisgICAgLy8gVE9ETyA6IFVwZGF0ZSB0aGlzIGJhc2VkIG9uIGxhdGVzdCBBUEkgdXBkYXRlcworICAgIGJvb2wgaXNEcmF3ID0gZmFsc2U7CisgICAgc3dpdGNoKChWS1RSQUNFX1RSQUNFX1BBQ0tFVF9JRF9WSylwYWNrZXRJZCkKKyAgICB7CisgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtDbWREcmF3OgorICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrQ21kRHJhd0luZGV4ZWQ6CisgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtDbWREcmF3SW5kaXJlY3Q6CisgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtDbWREcmF3SW5kZXhlZEluZGlyZWN0OgorICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrQ21kRGlzcGF0Y2g6CisgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtDbWREaXNwYXRjaEluZGlyZWN0OgorICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrQ21kQ29weUJ1ZmZlcjoKKyAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9WS192a0NtZENvcHlJbWFnZToKKyAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9WS192a0NtZENvcHlCdWZmZXJUb0ltYWdlOgorICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrQ21kQ29weUltYWdlVG9CdWZmZXI6CisgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtDbWRVcGRhdGVCdWZmZXI6CisgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtDbWRGaWxsQnVmZmVyOgorICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrQ21kQ2xlYXJDb2xvckltYWdlOgorICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZToKKyAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9WS192a0NtZENsZWFyQXR0YWNobWVudHM6CisgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtDbWRSZXNvbHZlSW1hZ2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlzRHJhdyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBpc0RyYXcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXNEcmF3OworfQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrX3FmaWxlX21vZGVsLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWZpbGVfbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2I0OTkyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrX3FmaWxlX21vZGVsLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQgTHVuYXJnLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVktUUkFDRVZJRVdFUl9WS19RRklMRV9NT0RFTF9IXworI2RlZmluZSBWS1RSQUNFVklFV0VSX1ZLX1FGSUxFX01PREVMX0hfCisKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF9pZGVudGlmaWVycy5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsLmgiCisjaW5jbHVkZSA8UU9iamVjdD4KKworY2xhc3Mgdmt0cmFjZXZpZXdlcl92a19RRmlsZU1vZGVsIDogcHVibGljIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsCit7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICB2a3RyYWNldmlld2VyX3ZrX1FGaWxlTW9kZWwoUU9iamVjdCAqIHBhcmVudCwgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8gKik7CisgICAgdmlydHVhbCB+dmt0cmFjZXZpZXdlcl92a19RRmlsZU1vZGVsKCk7CisKKyAgICB2aXJ0dWFsIFFTdHJpbmcgZ2V0X3BhY2tldF9zdHJpbmcoY29uc3Qgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKSBjb25zdDsKKyAgICB2aXJ0dWFsIFFTdHJpbmcgZ2V0X3BhY2tldF9zdHJpbmdfbXVsdGlsaW5lKGNvbnN0IHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNEcmF3Q2FsbChjb25zdCBWS1RSQUNFX1RSQUNFX1BBQ0tFVF9JRCBwYWNrZXRJZCkgY29uc3Q7CisKK307CisKKyNlbmRpZiAvL1ZLVFJBQ0VWSUVXRVJfVktfUUZJTEVfTU9ERUxfSF8KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92a19xZ3JvdXBmcmFtZXNwcm94eW1vZGVsLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92a19xZ3JvdXBmcmFtZXNwcm94eW1vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjcyZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrX3Fncm91cGZyYW1lc3Byb3h5bW9kZWwuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3ZrX3Fncm91cGZyYW1lc3Byb3h5bW9kZWwuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidmt0cmFjZV92a19wYWNrZXRfaWQuaCIKK30KKwordm9pZCB2a3RyYWNldmlld2VyX3ZrX1FHcm91cEZyYW1lc1Byb3h5TW9kZWw6OmJ1aWxkR3JvdXBzKCkKKyAgICB7CisgICAgICAgIG1fbWFwU291cmNlUm93VG9Qcm94eUdyb3VwUm93LmNsZWFyKCk7CisgICAgICAgIG1fZnJhbWVMaXN0LmNsZWFyKCk7CisgICAgICAgIG1fY3VyRnJhbWVDb3VudCA9IDA7CisKKyAgICAgICAgaWYgKHNvdXJjZU1vZGVsKCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgRnJhbWVJbmZvKiBwQ3VyRnJhbWUgPSBhZGROZXdGcmFtZSgpOworICAgICAgICAgICAgbV9tYXBTb3VyY2VSb3dUb1Byb3h5R3JvdXBSb3cucmVzZXJ2ZShzb3VyY2VNb2RlbCgpLT5yb3dDb3VudCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IHNyY1JvdyA9IDA7IHNyY1JvdyA8IHNvdXJjZU1vZGVsKCktPnJvd0NvdW50KCk7IHNyY1JvdysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwcm94eVJvdyA9IHBDdXJGcmFtZS0+bWFwQ2hpbGRSb3dUb1NvdXJjZVJvdy5jb3VudCgpOworCisgICAgICAgICAgICAgICAgLy8gbWFwIHNvdXJjZSByb3cgdG8gaXQncyBjb3JyZXNwb25kaW5nIHJvdyBpbiB0aGUgcHJveHkgZ3JvdXAuCisgICAgICAgICAgICAgICAgbV9tYXBTb3VyY2VSb3dUb1Byb3h5R3JvdXBSb3cuYXBwZW5kKHByb3h5Um93KTsKKworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIHNyYyByb3cgdG8gdGhlIGN1cnJlbnQgcHJveHkgZ3JvdXAuCisgICAgICAgICAgICAgICAgcEN1ckZyYW1lLT5tYXBDaGlsZFJvd1RvU291cmNlUm93LmFwcGVuZChzcmNSb3cpOworCisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGEgbmV3IGZyYW1lIGJlIHN0YXJ0ZWQgYmFzZWQgb24gdGhlIEFQSSBjYWxsIGluIHRoZSBwcmV2aW91cyByb3c/CisgICAgICAgICAgICAgICAgLy8gSWYgc291cmNlIGRhdGEgaXMgYSBmcmFtZSBib3VuZGFyeSBtYWtlIGEgbmV3IGZyYW1lCisgICAgICAgICAgICAgICAgUU1vZGVsSW5kZXggdG1wSW5kZXggPSBzb3VyY2VNb2RlbCgpLT5pbmRleChzcmNSb3csIDApOworICAgICAgICAgICAgICAgIGFzc2VydCh0bXBJbmRleC5pc1ZhbGlkKCkpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqKXRtcEluZGV4LmludGVybmFsUG9pbnRlcigpOworICAgICAgICAgICAgICAgIGlmIChwSGVhZGVyICE9IE5VTEwgJiYgcEhlYWRlci0+dHJhY2VyX2lkID09IFZLVFJBQ0VfVElEX1ZVTEtBTiAmJiBwSGVhZGVyLT5wYWNrZXRfaWQgPT0gVktUUkFDRV9UUElfVktfdmtRdWV1ZVByZXNlbnRLSFIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ3VyRnJhbWUgPSBhZGROZXdGcmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gZW5kIGZvciBlYWNoIHNvdXJjZSByb3cKKyAgICAgICAgfQorICAgIH0KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92a19xZ3JvdXBmcmFtZXNwcm94eW1vZGVsLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWdyb3VwZnJhbWVzcHJveHltb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzdjZTkKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfcWdyb3VwZnJhbWVzcHJveHltb2RlbC5oCkBAIC0wLDAgKzEsMzI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVktUUkFDRVZJRVdFUl9WS19RR1JPVVBGUkFNRVNQUk9YWU1PREVMX0gKKyNkZWZpbmUgVktUUkFDRVZJRVdFUl9WS19RR1JPVVBGUkFNRVNQUk9YWU1PREVMX0gKKworCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwuaCIKKyNpbmNsdWRlIDxRQWJzdHJhY3RQcm94eU1vZGVsPgorI2luY2x1ZGUgPFFTdGFuZGFyZEl0ZW0+CisKKyNpbmNsdWRlIDxRRGVidWc+CisKK3N0cnVjdCBGcmFtZUluZm8KK3sKKyAgICBpbnQgZnJhbWVJbmRleDsKKyAgICBRUGVyc2lzdGVudE1vZGVsSW5kZXggbW9kZWxJbmRleDsKKyAgICBRTGlzdDxpbnQ+IG1hcENoaWxkUm93VG9Tb3VyY2VSb3c7Cit9OworCitjbGFzcyB2a3RyYWNldmlld2VyX3ZrX1FHcm91cEZyYW1lc1Byb3h5TW9kZWwgOiBwdWJsaWMgUUFic3RyYWN0UHJveHlNb2RlbAoreworICAgIFFfT0JKRUNUCitwdWJsaWM6CisgICAgdmt0cmFjZXZpZXdlcl92a19RR3JvdXBGcmFtZXNQcm94eU1vZGVsKFFPYmplY3QgKnBhcmVudCA9IDApCisgICAgICAgIDogUUFic3RyYWN0UHJveHlNb2RlbChwYXJlbnQpLAorICAgICAgICAgIG1fY3VyRnJhbWVDb3VudCgwKQorICAgIHsKKyAgICAgICAgYnVpbGRHcm91cHMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH52a3RyYWNldmlld2VyX3ZrX1FHcm91cEZyYW1lc1Byb3h5TW9kZWwoKQorICAgIHsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgdm9pZCBzZXRTb3VyY2VNb2RlbChRQWJzdHJhY3RJdGVtTW9kZWwgKnNvdXJjZU1vZGVsKQorICAgIHsKKyAgICAgICAgaWYgKHNvdXJjZU1vZGVsICE9IE5VTEwgJiYgIXNvdXJjZU1vZGVsLT5pbmhlcml0cygidmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwiKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCEiU2V0dGluZyBRR3JvdXBGcmFtZXNQcm94eU1vZGVsIHRvIGhhdmUgYSBzb3VyY2VNb2RlbCB0aGF0IGRvZXNuJ3QgaW5oZXJpdCBmcm9tIFFUcmFjZUZpbGVNb2RlbC4iKTsKKyAgICAgICAgICAgIHNvdXJjZU1vZGVsID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIFFBYnN0cmFjdFByb3h5TW9kZWw6OnNldFNvdXJjZU1vZGVsKHNvdXJjZU1vZGVsKTsKKyAgICAgICAgYnVpbGRHcm91cHMoKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgaW50IHJvd0NvdW50KGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2ZyYW1lTGlzdC5jb3VudCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzRnJhbWUocGFyZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGZyYW1lLgorICAgICAgICAgICAgLy8gQSBmcmFtZSBrbm93cyBob3cgbWFueSBjaGlsZHJlbiBpdCBoYXMhCisgICAgICAgICAgICByZXR1cm4gbV9mcmFtZUxpc3RbcGFyZW50LnJvdygpXS5tYXBDaGlsZFJvd1RvU291cmNlUm93LmNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBhc2sgdGhlIHNvdXJjZQorICAgICAgICAgICAgcmV0dXJuIHNvdXJjZU1vZGVsKCktPnJvd0NvdW50KG1hcFRvU291cmNlKHBhcmVudCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghcGFyZW50LmlzVmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXNGcmFtZShwYXJlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9mcmFtZUxpc3RbcGFyZW50LnJvdygpXS5tYXBDaGlsZFJvd1RvU291cmNlUm93LmNvdW50KCkgPiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgUVZhcmlhbnQgZGF0YSggY29uc3QgUU1vZGVsSW5kZXggJmluZGV4LCBpbnQgcm9sZSApIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIWluZGV4LmlzVmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRnJhbWUoaW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWFwVG9Tb3VyY2UoaW5kZXgpLmRhdGEocm9sZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocm9sZSA9PSBRdDo6RGlzcGxheVJvbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmRleC5jb2x1bW4oKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChRU3RyaW5nKCJGcmFtZSAlMSIpLmFyZyhtX2ZyYW1lTGlzdFtpbmRleC5yb3coKV0uZnJhbWVJbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChRU3RyaW5nKCIiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgUXQ6Okl0ZW1GbGFncyBmbGFncyhjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gUXQ6Okl0ZW1Jc0VuYWJsZWQgfCBRdDo6SXRlbUlzU2VsZWN0YWJsZTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgaW50IGNvbHVtbkNvdW50KGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gc291cmNlTW9kZWwoKS0+Y29sdW1uQ291bnQoKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgUVZhcmlhbnQgaGVhZGVyRGF0YShpbnQgc2VjdGlvbiwgUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBpbnQgcm9sZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzb3VyY2VNb2RlbCgpLT5oZWFkZXJEYXRhKHNlY3Rpb24sIG9yaWVudGF0aW9uLCByb2xlKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFFNb2RlbEluZGV4IGluZGV4KGludCByb3csIGludCBjb2x1bW4sIGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQgPSBRTW9kZWxJbmRleCgpKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFwYXJlbnQuaXNWYWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiBwYXJlbnQgaXMgbm90IHZhbGlkLCB0aGVuIHRoaXMgcm93IGFuZCBjb2x1bW4gaXMgcmVmZXJlbmNpbmcgRnJhbWUgZGF0YQorICAgICAgICAgICAgaWYgKHJvdyA8IG1fZnJhbWVMaXN0LmNvdW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHJvdywgY29sdW1uLCAoRnJhbWVJbmZvKikmbV9mcmFtZUxpc3Rbcm93XSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzRnJhbWUocGFyZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhlIHBhcmVudCBpcyBhIGZyYW1lLCBzbyB0aGlzIHJvdyBhbmQgY29sdW1uIHJlZmVyZW5jZSBhIHNvdXJjZSBjZWxsCisgICAgICAgICAgICBjb25zdCBGcmFtZUluZm8qIHBGcmFtZSA9IChjb25zdCBGcmFtZUluZm8qKSZtX2ZyYW1lTGlzdFtwYXJlbnQucm93KCldOworICAgICAgICAgICAgYXNzZXJ0KHBGcmFtZS0+ZnJhbWVJbmRleCA9PSBwYXJlbnQucm93KCkpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHJvdywgY29sdW1uLCBwRnJhbWUtPmZyYW1lSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBRTW9kZWxJbmRleCBwYXJlbnQoY29uc3QgUU1vZGVsSW5kZXggJmNoaWxkKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFjaGlsZC5pc1ZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKKworICAgICAgICBpZiAoaXNGcmFtZShjaGlsZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZyYW1lcyBkb24ndCBoYXZlIGEgcGFyZW50IChpZSwgdGhleSBhcmUgYXQgdGhlIHJvb3QgbGV2ZWwpCisgICAgICAgICAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBjaGlsZCBpcyBhIHByb3h5IG9mIHRoZSBzb3VyY2UgbW9kZWwsCisgICAgICAgICAgICAvLyBzbyB0aGUgcGFyZW50IGlzIGl0cyBmcmFtZSdzIG1vZGVsSW5kZXguCisgICAgICAgICAgICBxdWludHB0ciBmcmFtZUluZGV4ID0gY2hpbGQuaW50ZXJuYWxJZCgpOworICAgICAgICAgICAgY29uc3QgRnJhbWVJbmZvKiBwRnJhbWUgPSAoY29uc3QgRnJhbWVJbmZvKikmbV9mcmFtZUxpc3RbZnJhbWVJbmRleF07CisgICAgICAgICAgICByZXR1cm4gcEZyYW1lLT5tb2RlbEluZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBzaWJsaW5nKC4uKSBuZWVkZWQgdG8gYmUgaW1wbGVtZW50ZWQgaGVyZSBiZWNhdXNlIHRoZSBpbmhlcml0ZWQgaW1wbGVtZW50YXRpb24gbG9va3MgYXQgdGhlCisgICAgLy8gc291cmNlTW9kZWwgdG8gZ2V0IHRoZSBuZXcgaW5kZXgsIHdoaWNoIHJlc3VsdHMgaW4gYnVncyBiZWNhdXNlIGl0IHJldHVybnMgYSBzb3VyY2UgbW9kZWwKKyAgICAvLyBzaWJsaW5nIG9mIGEgcHJveHkgbW9kZWwgaW5kZXguIFRoZSBuZXcgaW1wbGVtZW50YXRpb24ga2VlcHMgZXZlcnl0aGluZyBpbiBwcm94eSBtb2RlbCBzcGFjZS4KKyAgICBRTW9kZWxJbmRleCBzaWJsaW5nKGludCByb3csIGludCBjb2x1bW4sIGNvbnN0IFFNb2RlbEluZGV4ICZpZHgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaW5kZXgocm93LCBjb2x1bW4sIHBhcmVudChpZHgpKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFFNb2RlbEluZGV4IG1hcFRvU291cmNlKGNvbnN0IFFNb2RlbEluZGV4ICZwcm94eUluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFwcm94eUluZGV4LmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworCisgICAgICAgIGlmIChpc0ZyYW1lKHByb3h5SW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmcmFtZXMgY2FuJ3QgZ2V0IG1hcHBlZCB0byB0aGUgc291cmNlCisgICAgICAgICAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1aW50cHRyIGZyYW1lSW5kZXggPSBwcm94eUluZGV4LmludGVybmFsSWQoKTsKKyAgICAgICAgICAgIGNvbnN0IEZyYW1lSW5mbyogcEZyYW1lID0gKGNvbnN0IEZyYW1lSW5mbyopJm1fZnJhbWVMaXN0W2ZyYW1lSW5kZXhdOworICAgICAgICAgICAgYXNzZXJ0KHBGcmFtZS0+ZnJhbWVJbmRleCA9PSAoaW50KWZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKHByb3h5SW5kZXgucm93KCkgPCBwRnJhbWUtPm1hcENoaWxkUm93VG9Tb3VyY2VSb3cuY291bnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjUm93ID0gcEZyYW1lLT5tYXBDaGlsZFJvd1RvU291cmNlUm93W3Byb3h5SW5kZXgucm93KCldOworICAgICAgICAgICAgICAgIGludCBzcmNDb2wgPSBwcm94eUluZGV4LmNvbHVtbigpOworCisgICAgICAgICAgICAgICAgLy8gYnkgdXNpbmcgYSBkZWZhdWx0IHNyY1BhcmVudCwgd2UnbGwgb25seSBnZXQgdG9wLWxldmVsIGluZGljZXMuCisgICAgICAgICAgICAgICAgLy8gaWUsIHdlIHdvbid0IHN1cHBvcnQgaGllcmFyY2hpY2FsIHNvdXJjZU1vZGVscy4KKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTW9kZWwoKS0+aW5kZXgoc3JjUm93LCBzcmNDb2wsIFFNb2RlbEluZGV4KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgdW5leHBlY3RlZCBjYXNlIGhhcyBoYXBwZW5lZCB3aGVuIHNjcm9sbGluZyBxdWlja2x5LgorICAgICAgICAgICAgICAgIC8vIFVQREFURTogSSB0aGluayBJIGZpeGVkIHRoaXMgaXNzdWUsIGl0IHdhcyBkdWUgdG8gY2FsbGluZyAubmV4dCgpIHRvbyBtYW55IHRpbWVzIG9uIGFuIGl0ZXJhdG9yLgorICAgICAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBRTW9kZWxJbmRleCBtYXBGcm9tU291cmNlKGNvbnN0IFFNb2RlbEluZGV4ICZzb3VyY2VJbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghc291cmNlSW5kZXguaXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CisKKyAgICAgICAgaW50IHNyY1JvdyA9IHNvdXJjZUluZGV4LnJvdygpOworICAgICAgICBpbnQgcHJveHlSb3cgPSBtX21hcFNvdXJjZVJvd1RvUHJveHlHcm91cFJvd1tzcmNSb3ddOworCisgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZnJhbWUgaGFzIHRoZSBzcmNSb3cgYXMgYSBjaGlsZAorICAgICAgICBjb25zdCBGcmFtZUluZm8qIHBQcm94eUdyb3VwID0gTlVMTDsKKyAgICAgICAgUUxpc3RJdGVyYXRvcjxGcmFtZUluZm8+IGZyYW1lSXRlcihtX2ZyYW1lTGlzdCk7CisgICAgICAgIHdoaWxlIChmcmFtZUl0ZXIuaGFzTmV4dCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBGcmFtZUluZm8qIHBGcmFtZSA9ICZmcmFtZUl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKHBGcmFtZS0+bWFwQ2hpbGRSb3dUb1NvdXJjZVJvdy5jb250YWlucyhzcmNSb3cpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcm94eUdyb3VwID0gcEZyYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHByb3h5Um93LCBzb3VyY2VJbmRleC5jb2x1bW4oKSwgcFByb3h5R3JvdXAtPmZyYW1lSW5kZXgpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdmlydHVhbCBRTW9kZWxJbmRleExpc3QgbWF0Y2goY29uc3QgUU1vZGVsSW5kZXggJnN0YXJ0LCBpbnQgcm9sZSwgY29uc3QgUVZhcmlhbnQgJnZhbHVlLCBpbnQgaGl0cywgUXQ6Ok1hdGNoRmxhZ3MgZmxhZ3MpIGNvbnN0CisgICAgeworICAgICAgICBRTW9kZWxJbmRleExpc3QgcmVzdWx0cyA9IHNvdXJjZU1vZGVsKCktPm1hdGNoKHN0YXJ0LCByb2xlLCB2YWx1ZSwgaGl0cywgZmxhZ3MpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5jb3VudCgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBtYXBGcm9tU291cmNlKHJlc3VsdHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByaXZhdGU6CisgICAgUUxpc3Q8RnJhbWVJbmZvPiBtX2ZyYW1lTGlzdDsKKyAgICBRTGlzdDxpbnQ+IG1fbWFwU291cmNlUm93VG9Qcm94eUdyb3VwUm93OworICAgIGludCBtX2N1ckZyYW1lQ291bnQ7CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgaXNGcmFtZShjb25zdCBRTW9kZWxJbmRleCAmcHJveHlJbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIC8vIEFQSSBDYWxscyB1c2UgdGhlIGZyYW1lIG51bWJlciBhcyB0aGUgaW5kZXgncyBpbnRlcm5hbElkCisgICAgICAgIGludCBpZCA9IChpbnQpcHJveHlJbmRleC5pbnRlcm5hbElkKCk7CisgICAgICAgIGlmIChpZCA+PSAwICYmIGlkIDwgbV9mcmFtZUxpc3QuY291bnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBhcGkgY2FsbAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gc29tZSB2YWxpZGF0aW9uIG9uIHRoZSBtb2RlbEluZGV4CisgICAgICAgIEZyYW1lSW5mbyogcEZJID0gKEZyYW1lSW5mbyopcHJveHlJbmRleC5pbnRlcm5hbFBvaW50ZXIoKTsKKyAgICAgICAgaWYgKHBGSSAhPSBOVUxMICYmCisgICAgICAgICAgICBwRkktPmZyYW1lSW5kZXggPT0gcHJveHlJbmRleC5yb3coKSAmJgorICAgICAgICAgICAgcHJveHlJbmRleC5yb3coKSA8IG1fZnJhbWVMaXN0LmNvdW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRnJhbWVJbmZvKiBhZGROZXdGcmFtZSgpCisgICAgeworICAgICAgICAvLyBjcmVhdGUgZnJhbWUgaW5mbworICAgICAgICBGcmFtZUluZm8gaW5mbzsKKyAgICAgICAgbV9mcmFtZUxpc3QuYXBwZW5kKGluZm8pOworICAgICAgICBGcmFtZUluZm8qIHBGcmFtZSA9ICZtX2ZyYW1lTGlzdFttX2N1ckZyYW1lQ291bnRdOworCisgICAgICAgIHBGcmFtZS0+ZnJhbWVJbmRleCA9IG1fY3VyRnJhbWVDb3VudDsKKworICAgICAgICAvLyBjcmVhdGUgcHJveHkgbW9kZWwgaW5kZXggZm9yIGZyYW1lIG5vZGUKKyAgICAgICAgcEZyYW1lLT5tb2RlbEluZGV4ID0gY3JlYXRlSW5kZXgobV9jdXJGcmFtZUNvdW50LCAwLCBwRnJhbWUpOworCisgICAgICAgIC8vIGluY3JlbWVudCBmcmFtZSBjb3VudAorICAgICAgICBtX2N1ckZyYW1lQ291bnQrKzsKKworICAgICAgICByZXR1cm4gcEZyYW1lOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdm9pZCBidWlsZEdyb3VwcygpOworCit9OworCisjZW5kaWYgLy8gVktUUkFDRVZJRVdFUl9WS19RR1JPVVBGUkFNRVNQUk9YWU1PREVMX0gKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3ZrdHJhY2V2aWV3ZXIvdmt0cmFjZXZpZXdlcl92a19zZXR0aW5ncy5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfc2V0dGluZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZWU1NTAKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfc2V0dGluZ3MuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl92a19zZXR0aW5ncy5oIgorCisvLyBkZWNsYXJlZCBhcyBleHRlcm4gaW4gaGVhZGVyCit2a3RyYWNldmlld2VyX3ZrX3NldHRpbmdzIGdfdmtUcmFjZVZpZXdlclNldHRpbmdzOworc3RhdGljIHZrdHJhY2V2aWV3ZXJfdmtfc2V0dGluZ3Mgc19kZWZhdWx0VmtTZXR0aW5nczsKKwordmt0cmFjZV9TZXR0aW5nSW5mbyBnX3ZrX3NldHRpbmdzW10gPQoreworICAgIHsgInJpIiwgIlByaW50UmVwbGF5SW5mb01zZ3MiLCBWS1RSQUNFX1NFVFRJTkdfQk9PTCwgJmdfdmtUcmFjZVZpZXdlclNldHRpbmdzLnByaW50UmVwbGF5SW5mb01zZ3MsICZzX2RlZmF1bHRWa1NldHRpbmdzLnByaW50UmVwbGF5SW5mb01zZ3MsIFRSVUUsICJQcmludCBpbmZvIG1lc3NhZ2VzIHJlcG9ydGVkIHdoZW4gcmVwbGF5aW5nIHRyYWNlIGZpbGUuIn0sCisgICAgeyAicnciLCAiUHJpbnRSZXBsYXlXYXJuaW5nTXNncyIsIFZLVFJBQ0VfU0VUVElOR19CT09MLCAmZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucHJpbnRSZXBsYXlXYXJuaW5nTXNncywgJnNfZGVmYXVsdFZrU2V0dGluZ3MucHJpbnRSZXBsYXlXYXJuaW5nTXNncywgVFJVRSwgIlByaW50IHdhcm5pbmcgbWVzc2FnZXMgcmVwb3J0ZWQgd2hlbiByZXBsYXlpbmcgdHJhY2UgZmlsZS4ifSwKKyAgICB7ICJyZSIsICJQcmludFJlcGxheUVycm9yTXNncyIsIFZLVFJBQ0VfU0VUVElOR19CT09MLCAmZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucHJpbnRSZXBsYXlFcnJvck1zZ3MsICZzX2RlZmF1bHRWa1NldHRpbmdzLnByaW50UmVwbGF5RXJyb3JNc2dzLCBUUlVFLCAiUHJpbnQgZXJyb3IgbWVzc2FnZXMgcmVwb3J0ZWQgd2hlbiByZXBsYXlpbmcgdHJhY2UgZmlsZS4ifSwKKyAgICB7ICJwaSIsICJQYXVzZU9uUmVwbGF5SW5mbyIsIFZLVFJBQ0VfU0VUVElOR19CT09MLCAmZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucGF1c2VPblJlcGxheUluZm8sICZzX2RlZmF1bHRWa1NldHRpbmdzLnBhdXNlT25SZXBsYXlJbmZvLCBUUlVFLCAiUGF1c2UgcmVwbGF5IGlmIGFuIGluZm8gbWVzc2FnZSBpcyByZXBvcnRlZC4ifSwKKyAgICB7ICJwdyIsICJQYXVzZU9uUmVwbGF5V2FybmluZyIsIFZLVFJBQ0VfU0VUVElOR19CT09MLCAmZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucGF1c2VPblJlcGxheVdhcm5pbmcsICZzX2RlZmF1bHRWa1NldHRpbmdzLnBhdXNlT25SZXBsYXlXYXJuaW5nLCBUUlVFLCAiUGF1c2UgcmVwbGF5IGlmIGEgd2FybmluZyBtZXNzYWdlIGlzIHJlcG9ydGVkLiJ9LAorICAgIHsgInBlIiwgIlBhdXNlT25SZXBsYXlFcnJvciIsIFZLVFJBQ0VfU0VUVElOR19CT09MLCAmZ192a1RyYWNlVmlld2VyU2V0dGluZ3MucGF1c2VPblJlcGxheUVycm9yLCAmc19kZWZhdWx0VmtTZXR0aW5ncy5wYXVzZU9uUmVwbGF5RXJyb3IsIFRSVUUsICJQYXVzZSByZXBsYXkgaWYgYW4gZXJyb3IgbWVzc2FnZSBpcyByZXBvcnRlZC4ifSwKKyAgICB7ICJnZiIsICJHcm91cEJ5RnJhbWUiLCBWS1RSQUNFX1NFVFRJTkdfQk9PTCwgJmdfdmtUcmFjZVZpZXdlclNldHRpbmdzLmdyb3VwQnlGcmFtZSwgJnNfZGVmYXVsdFZrU2V0dGluZ3MuZ3JvdXBCeUZyYW1lLCBUUlVFLCAiR3JvdXAgQVBJIGNhbGxzIGJ5IGZyYW1lLiJ9LAorICAgIHsgImd0IiwgIkdyb3VwQnlUaHJlYWQiLCBWS1RSQUNFX1NFVFRJTkdfQk9PTCwgJmdfdmtUcmFjZVZpZXdlclNldHRpbmdzLmdyb3VwQnlUaHJlYWQsICZzX2RlZmF1bHRWa1NldHRpbmdzLmdyb3VwQnlUaHJlYWQsIFRSVUUsICJHcm91cCBBUEkgY2FsbHMgYnkgdGhlIENQVSB0aHJlYWQgSWQgb24gd2hpY2ggdGhleSBleGVjdXRlZC4ifSwKKyAgICB7ICJydyIsICJSZXBsYXlXaW5kb3dXaWR0aCIsIFZLVFJBQ0VfU0VUVElOR19JTlQsICZnX3ZrVHJhY2VWaWV3ZXJTZXR0aW5ncy5yZXBsYXlfd2luZG93X3dpZHRoLCAmc19kZWZhdWx0VmtTZXR0aW5ncy5yZXBsYXlfd2luZG93X3dpZHRoLCBUUlVFLCAiV2lkdGggb2YgcmVwbGF5IHdpbmRvdyBvbiBzdGFydHVwLiJ9LAorICAgIHsgInJoIiwgIlJlcGxheVdpbmRvd0hlaWdodCIsIFZLVFJBQ0VfU0VUVElOR19JTlQsICZnX3ZrVHJhY2VWaWV3ZXJTZXR0aW5ncy5yZXBsYXlfd2luZG93X2hlaWdodCwgJnNfZGVmYXVsdFZrU2V0dGluZ3MucmVwbGF5X3dpbmRvd19oZWlnaHQsIFRSVUUsICJIZWlnaHQgb2YgcmVwbGF5IHdpbmRvdyBvbiBzdGFydHVwLiJ9LAorICAgIHsgInNyIiwgIlNlcGFyYXRlUmVwbGF5V2luZG93IiwgVktUUkFDRV9TRVRUSU5HX0JPT0wsICZnX3ZrVHJhY2VWaWV3ZXJTZXR0aW5ncy5zZXBhcmF0ZV9yZXBsYXlfd2luZG93LCAmc19kZWZhdWx0VmtTZXR0aW5ncy5zZXBhcmF0ZV9yZXBsYXlfd2luZG93LCBUUlVFLCAiVXNlIGEgc2VwYXJhdGUgcmVwbGF5IHdpbmRvdy4ifSwKK307CisKK3ZrdHJhY2VfU2V0dGluZ0dyb3VwIGdfdmtUcmFjZVZpZXdlclNldHRpbmdHcm91cCA9Cit7CisgICAgInZrdHJhY2V2aWV3ZXJfdmsiLAorICAgIHNpemVvZihnX3ZrX3NldHRpbmdzKSAvIHNpemVvZihnX3ZrX3NldHRpbmdzWzBdKSwKKyAgICAmZ192a19zZXR0aW5nc1swXQorfTsKKwordm9pZCBpbml0aWFsaXplX2RlZmF1bHRfc2V0dGluZ3MoKQoreworICAgIHNfZGVmYXVsdFZrU2V0dGluZ3MucHJpbnRSZXBsYXlJbmZvTXNncyA9IEZBTFNFOworICAgIHNfZGVmYXVsdFZrU2V0dGluZ3MucHJpbnRSZXBsYXlXYXJuaW5nTXNncyA9IFRSVUU7CisgICAgc19kZWZhdWx0VmtTZXR0aW5ncy5wcmludFJlcGxheUVycm9yTXNncyA9IFRSVUU7CisgICAgc19kZWZhdWx0VmtTZXR0aW5ncy5wYXVzZU9uUmVwbGF5SW5mbyA9IEZBTFNFOworICAgIHNfZGVmYXVsdFZrU2V0dGluZ3MucGF1c2VPblJlcGxheVdhcm5pbmcgPSBGQUxTRTsKKyAgICBzX2RlZmF1bHRWa1NldHRpbmdzLnBhdXNlT25SZXBsYXlFcnJvciA9IFRSVUU7CisgICAgc19kZWZhdWx0VmtTZXR0aW5ncy5ncm91cEJ5RnJhbWUgPSBGQUxTRTsKKyAgICBzX2RlZmF1bHRWa1NldHRpbmdzLmdyb3VwQnlUaHJlYWQgPSBGQUxTRTsKKyAgICBzX2RlZmF1bHRWa1NldHRpbmdzLnJlcGxheV93aW5kb3dfd2lkdGggPSAxMDI0OworICAgIHNfZGVmYXVsdFZrU2V0dGluZ3MucmVwbGF5X3dpbmRvd19oZWlnaHQgPSA3Njg7CisgICAgc19kZWZhdWx0VmtTZXR0aW5ncy5zZXBhcmF0ZV9yZXBsYXlfd2luZG93ID0gRkFMU0U7Cit9OwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrX3NldHRpbmdzLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3RyYWNldmlld2VyL3ZrdHJhY2V2aWV3ZXJfdmtfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY2ODFmCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlci92a3RyYWNldmlld2VyX3ZrX3NldHRpbmdzLmgKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFZLVFJBQ0VWSUVXRVJfVktfU0VUVElOR1NfSAorI2RlZmluZSBWS1RSQUNFVklFV0VSX1ZLX1NFVFRJTkdTX0gKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidmt0cmFjZV9zZXR0aW5ncy5oIgorfQorCit0eXBlZGVmIHN0cnVjdCB2a3RyYWNldmlld2VyX3ZrX3NldHRpbmdzCit7CisgICAgQk9PTCBwcmludFJlcGxheUluZm9Nc2dzOworICAgIEJPT0wgcHJpbnRSZXBsYXlXYXJuaW5nTXNnczsKKyAgICBCT09MIHByaW50UmVwbGF5RXJyb3JNc2dzOworICAgIEJPT0wgcGF1c2VPblJlcGxheUluZm87CisgICAgQk9PTCBwYXVzZU9uUmVwbGF5V2FybmluZzsKKyAgICBCT09MIHBhdXNlT25SZXBsYXlFcnJvcjsKKyAgICBCT09MIGdyb3VwQnlGcmFtZTsKKyAgICBCT09MIGdyb3VwQnlUaHJlYWQ7CisgICAgaW50IHJlcGxheV93aW5kb3dfd2lkdGg7CisgICAgaW50IHJlcGxheV93aW5kb3dfaGVpZ2h0OworICAgIEJPT0wgc2VwYXJhdGVfcmVwbGF5X3dpbmRvdzsKK30gdmt0cmFjZXZpZXdlcl92a19zZXR0aW5nczsKKworZXh0ZXJuIHZrdHJhY2V2aWV3ZXJfdmtfc2V0dGluZ3MgZ192a1RyYWNlVmlld2VyU2V0dGluZ3M7CitleHRlcm4gdmt0cmFjZV9TZXR0aW5nR3JvdXAgZ192a1RyYWNlVmlld2VyU2V0dGluZ0dyb3VwOworCit2b2lkIGluaXRpYWxpemVfZGVmYXVsdF9zZXR0aW5ncygpOworCisjZW5kaWYgLy8gVktUUkFDRVZJRVdFUl9WS19TRVRUSU5HU19ICisKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3Z1bGthbi9fX2luaXRfXy5weSBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfZXh0ZW5zaW9ucy92a3RyYWNldnVsa2FuL3Z1bGthbi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdnVsa2FuL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL0NNYWtlTGlzdHMudHh0IGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZiMjhlCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE0NiBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKKworaWYoQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIkxpbnV4IikKKyAgIGlmIChCVUlMRF9XU0lfWENCX1NVUFBPUlQpCisgICAgICAgc2V0KEVOVntWVUxLQU5fV1NJfSAiWGNiIikKKyAgIGVsc2VpZiAoQlVJTERfV1NJX1hMSUJfU1VQUE9SVCkKKyAgICAgICBzZXQoRU5We1ZVTEtBTl9XU0l9ICJYbGliIikKKyAgIGVsc2VpZiAoQlVJTERfV1NJX1dBWUxBTkRfU1VQUE9SVCkKKyAgICAgICBzZXQoRU5We1ZVTEtBTl9XU0l9ICJXYXlsYW5kIikKKyAgIGVsc2UoKQorICAgICAgICMgTWlyIFdTSSBDYXNlCisgICAgICAgc2V0KEVOVntWVUxLQU5fV1NJfSAiTWlyIikKKyAgIGVuZGlmKCkKK2VuZGlmKCkKKworcHJvamVjdChWa0xheWVyX3ZrdHJhY2VfbGF5ZXIpCisKK2luY2x1ZGUoIiR7U1JDX0RJUn0vYnVpbGRfb3B0aW9ucy5jbWFrZSIpCisKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvZGVnZW4pCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke1ZLVFJBQ0VfVlVMS0FOX0RJUn0vdmt0cmFjZV9nZW5lcmF0ZS5weSBBbGxQbGF0Zm9ybXMgdmt0cmFjZS10cmFjZS1oICAgICAgdmtfdmVyc2lvbl8xXzAgT1VUUFVUX0ZJTEUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvZGVnZW4vdmt0cmFjZV92a192ay5oKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtWS1RSQUNFX1ZVTEtBTl9ESVJ9L3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtdHJhY2UtYyAgICAgIHZrX3ZlcnNpb25fMV8wIE9VVFBVVF9GSUxFICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb2RlZ2VuL3ZrdHJhY2VfdmtfdmsuY3BwKQorI2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7VktUUkFDRV9WVUxLQU5fRElSfS92a3RyYWNlX2dlbmVyYXRlLnB5IEFsbFBsYXRmb3JtcyB2a3RyYWNlLWV4dC10cmFjZS1oIHZrX2x1bmFyZ19kZWJ1Z19tYXJrZXIgT1VUUFVUX0ZJTEUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvZGVnZW4vdmt0cmFjZV92a192a19sdW5hcmdfZGVidWdfbWFya2VyLmgpCisjZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtWS1RSQUNFX1ZVTEtBTl9ESVJ9L3ZrdHJhY2VfZ2VuZXJhdGUucHkgQWxsUGxhdGZvcm1zIHZrdHJhY2UtZXh0LXRyYWNlLWMgdmtfbHVuYXJnX2RlYnVnX21hcmtlciBPVVRQVVRfRklMRSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29kZWdlbi92a3RyYWNlX3ZrX3ZrX2x1bmFyZ19kZWJ1Z19tYXJrZXIuY3BwKQorCitpZiAoV0lOMzIpCisgICAgIyBQdXQgVmtMYXllcl92a3RyYWNlX2xheWVyLmRsbCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdmt0cmFjZS5leGUKKyAgICAjIHNvIHRoYXQgdmt0cmFjZS5leGUgY2FuIGZpbmQgVmtMYXllcl92a3RyYWNlX2xheWVyLmRsbC4KKyAgICBzZXQoQ01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7UFJPSkVDVF9CSU5BUllfRElSfS8uLi8uLi8uLi9sYXllcnN2dC8pCitlbmRpZigpCisKK3NldCAoQ09ERUdFTl9VVElMU19ESVIgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92dWxrYW4vY29kZWdlbl91dGlscykKK3NldChDT0RFR0VOX1ZLVFJBQ0VfRElSICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vY29kZWdlbl92a3RyYWNlX3V0aWxzIikKKworc2V0KFNSQ19MSVNUCisgICAgJHtTUkNfTElTVH0KKyAgICB2a3RyYWNlX2xpYi5jCisgICAgdmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmNwcAorICAgIHZrdHJhY2VfbGliX3BhZ2VndWFyZG1hcHBlZG1lbW9yeS5jcHAKKyAgICB2a3RyYWNlX2xpYl9wYWdlZ3VhcmRjYXB0dXJlLmNwcAorICAgIHZrdHJhY2VfbGliX3BhZ2VndWFyZC5jcHAKKyAgICB2a3RyYWNlX2xpYl90cmFjZS5jcHAKKyAgICB2a3RyYWNlX3ZrX2V4dHMuY3BwCisgICAgY29kZWdlbi92a3RyYWNlX3ZrX3ZrLmNwcAorICAgICR7Q09ERUdFTl9VVElMU19ESVJ9L3ZrX3N0cnVjdF9zaXplX2hlbHBlci5jCispCisjICAgIGNvZGVnZW4vdmt0cmFjZV92a192a19sdW5hcmdfZGVidWdfbWFya2VyLmNwcAorIyAgICAke0NPREVHRU5fVVRJTFNfRElSfS92a19sdW5hcmdfZGVidWdfbWFya2VyX3N0cnVjdF9zaXplX2hlbHBlci5jCisKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyggJHtTUkNfTElTVH0gUFJPUEVSVElFUyBMQU5HVUFHRSBDWFgpCisKK3NldCAoSERSX0xJU1QKKyAgICB2a3RyYWNlX2xpYl9oZWxwZXJzLmgKKyAgICB2a3RyYWNlX2xpYl9wYWdlc3RhdHVzYXJyYXkuaAorICAgIHZrdHJhY2VfbGliX3BhZ2VndWFyZG1hcHBlZG1lbW9yeS5oCisgICAgdmt0cmFjZV9saWJfcGFnZWd1YXJkY2FwdHVyZS5oCisgICAgdmt0cmFjZV9saWJfcGFnZWd1YXJkLmgKKyAgICB2a3RyYWNlX3ZrX2V4dHMuaAorICAgIHZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oCisgICAgY29kZWdlbi92a3RyYWNlX3ZrX3ZrLmgKKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9L3ZrdHJhY2VfdmtfcGFja2V0X2lkLmgKKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9L3ZrdHJhY2VfdmtfdmtfcGFja2V0cy5oCisgICAgJHtDT0RFR0VOX1VUSUxTX0RJUn0vdmtfc3RydWN0X3NpemVfaGVscGVyLmgKKykKKworIyBkZWYgZmlsZSAtIG5lZWRlZCBmb3IgV2luZG93cyAzMi1iaXQgc28gdGhhdCB2ayBmdW5jdGlvbnMgbmFtZXMgYXJlbid0IG1hbmdsZWQKK2lmIChXSU4zMikKKyAgICBpZiAoTk9UKENNQUtFX0dFTkVSQVRPUiBNQVRDSEVTICJXaW42NCIpKQorICAgICAgICBzZXQgKEhEUl9MSVNUICR7SERSX0xJU1R9IFZrTGF5ZXJfdmt0cmFjZV9sYXllci5kZWYpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCisKKyMgICAgY29kZWdlbi92a3RyYWNlX3ZrX3ZrX2x1bmFyZ19kZWJ1Z19tYXJrZXIuaAorIyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9L3ZrdHJhY2VfdmtfdmtfbHVuYXJnX2RlYnVnX21hcmtlcl9wYWNrZXRzLmgKKyMgICAgJHtDT0RFR0VOX1VUSUxTX0RJUn0vdmtfbHVuYXJnX2RlYnVnX21hcmtlcl9zdHJ1Y3Rfc2l6ZV9oZWxwZXIuaAorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIHZrX2Rpc3BhdGNoX3RhYmxlX2hlbHBlci5oCisgICAgQ09NTUFORCAke1BZVEhPTl9DTUR9ICR7Q01BS0VfU09VUkNFX0RJUn0vdmstZ2VuZXJhdGUucHkgJHtEaXNwbGF5U2VydmVyfSBkaXNwYXRjaC10YWJsZS1vcHMgbGF5ZXIgPiB2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaAorICAgIERFUEVORFMgJHtDTUFLRV9TT1VSQ0VfRElSfS92ay1nZW5lcmF0ZS5weSAke0NNQUtFX1NPVVJDRV9ESVJ9L3Z1bGthbi5weSkKK2FkZF9jdXN0b21fdGFyZ2V0KGdlbmVyYXRlX3ZrdHJhY2VfbGF5ZXJfaGVscGVycyBERVBFTkRTCisgICAgdmtfZGlzcGF0Y2hfdGFibGVfaGVscGVyLmgpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgY29kZWdlbgorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9jb21tb24KKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2VfdHJhY2UKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAke0NPREVHRU5fVktUUkFDRV9ESVJ9CisgICAgJHtWS1RSQUNFX1ZVTEtBTl9JTkNMVURFX0RJUn0KKyAgICAke0NPREVHRU5fVVRJTFNfRElSfQorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLi8uLi8uLi9sYXllcnN2dAorKQorIyBjb3B5L2xpbmsgbGF5ZXIganNvbiBmaWxlIGludG8gYnVpbGQvbGF5ZXJzdnQgZGlyZWN0b3J5CitpZiAoTk9UIFdJTjMyKQorICAgICMgZXh0cmEgc2V0dXAgZm9yIG91dC1vZi10cmVlIGJ1aWxkcworICAgIGlmIChOT1QgKENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiBTVFJFUVVBTCBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVIpKQorICAgICAgICBhZGRfY3VzdG9tX3RhcmdldCh2a3RyYWNlX2xheWVyLWpzb24gQUxMCisgICAgICAgICAgICBDT01NQU5EIGxuIC1zZiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGludXgvVmtMYXllcl92a3RyYWNlX2xheWVyLmpzb24gJHtDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUll9Li4vbGF5ZXJzdnQvCisgICAgICAgICAgICBWRVJCQVRJTQorICAgICAgICAgICAgKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgIGlmIChOT1QgKENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiBTVFJFUVVBTCBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVIpKQorICAgICAgICBGSUxFKFRPX05BVElWRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS93aW5kb3dzL1ZrTGF5ZXJfdmt0cmFjZV9sYXllci5qc29uIHNyY19qc29uKQorICAgICAgICBpZiAoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIl5WaXN1YWwgU3R1ZGlvLioiKQorICAgICAgICAgICAgRklMRShUT19OQVRJVkVfUEFUSCAke1BST0pFQ1RfQklOQVJZX0RJUn0vLi4vLi4vLi4vbGF5ZXJzdnQvJDxDT05GSUdVUkFUSU9OPi9Wa0xheWVyX3ZrdHJhY2VfbGF5ZXIuanNvbiBkc3RfanNvbikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBGSUxFKFRPX05BVElWRV9QQVRIICR7UFJPSkVDVF9CSU5BUllfRElSfS8uLi8uLi8uLi9sYXllcnN2dC9Wa0xheWVyX3ZrdHJhY2VfbGF5ZXIuanNvbiBkc3RfanNvbikKKyAgICAgICAgZW5kaWYoKQorCisgICAgICAgIGFkZF9jdXN0b21fdGFyZ2V0KHZrdHJhY2VfbGF5ZXItanNvbiBBTEwKKyAgICAgICAgICAgIENPTU1BTkQgY29weSAke3NyY19qc29ufSAke2RzdF9qc29ufQorICAgICAgICAgICAgVkVSQkFUSU0KKyAgICAgICAgICAgICkKKyAgICAgICAgYWRkX2RlcGVuZGVuY2llcyh2a3RyYWNlX2xheWVyLWpzb24gVmtMYXllcl92a3RyYWNlX2xheWVyKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworYWRkX2xpYnJhcnkoJHtQUk9KRUNUX05BTUV9IFNIQVJFRCAke1NSQ19MSVNUfSAke0hEUl9MSVNUfSkKKworYWRkX2RlcGVuZGVuY2llcygke1BST0pFQ1RfTkFNRX0gZ2VuZXJhdGVfdmt0cmFjZV9sYXllcl9oZWxwZXJzKQorCitpZiAoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiTGludXgiKQorICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysxMSIpCisgICAgc2V0KE9TX1RSQUNFUl9MSUJTCisgICAgICAgIC1zaGFyZWQKKyAgICAgICAgLWxkbAorICAgICkKK2VuZGlmKCkKKworaWYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIldpbmRvd3MiKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSIpCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30iKQorICAgIHNldChPU19UUkFDRVJfTElCUykKK2VuZGlmKCkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7UFJPSkVDVF9OQU1FfQorICAgIHZrdHJhY2VfY29tbW9uCisgICAgJHtWS1RSQUNFX1ZVTEtBTl9MSUJ9CisgICAgJHtPU19UUkFDRVJfTElCU30KKykKKworYnVpbGRfb3B0aW9uc19maW5hbGl6ZSgpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyhWa0xheWVyX3ZrdHJhY2VfbGF5ZXIgUFJPUEVSVElFUyBMSU5LRVJfTEFOR1VBR0UgQykKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvVmtMYXllcl92a3RyYWNlX2xheWVyLmRlZiBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvVmtMYXllcl92a3RyYWNlX2xheWVyLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJkNzAyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci9Wa0xheWVyX3ZrdHJhY2VfbGF5ZXIuZGVmCkBAIC0wLDAgKzEsMTgxIEBACis7Ozs7IEJlZ2luIENvcHlyaWdodCBOb3RpY2UgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KKzsgVnVsa2FuDQorOw0KKzsgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLg0KKzsgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24NCis7IENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLg0KKzsNCis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorOw0KKzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKzsNCis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKzsNCis7ICBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4NCis7Ozs7ICBFbmQgQ29weXJpZ2h0IE5vdGljZSA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KKw0KKw0KK0xJQlJBUlkgVmtMYXllcl92a3RyYWNlX2xheWVyDQorRVhQT1JUUw0KK19fSE9PS0VEX3ZrQWNxdWlyZU5leHRJbWFnZUtIUg0KK19fSE9PS0VEX3ZrQWxsb2NhdGVDb21tYW5kQnVmZmVycw0KK19fSE9PS0VEX3ZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cw0KK19fSE9PS0VEX3ZrQWxsb2NhdGVNZW1vcnkNCitfX0hPT0tFRF92a0JlZ2luQ29tbWFuZEJ1ZmZlcg0KK19fSE9PS0VEX3ZrQmluZEJ1ZmZlck1lbW9yeQ0KK19fSE9PS0VEX3ZrQmluZEltYWdlTWVtb3J5DQorX19IT09LRURfdmtDbWRCZWdpblF1ZXJ5DQorX19IT09LRURfdmtDbWRCZWdpblJlbmRlclBhc3MNCitfX0hPT0tFRF92a0NtZEJpbmREZXNjcmlwdG9yU2V0cw0KK19fSE9PS0VEX3ZrQ21kQmluZEluZGV4QnVmZmVyDQorX19IT09LRURfdmtDbWRCaW5kUGlwZWxpbmUNCitfX0hPT0tFRF92a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzDQorX19IT09LRURfdmtDbWRCbGl0SW1hZ2UNCitfX0hPT0tFRF92a0NtZENsZWFyQXR0YWNobWVudHMNCitfX0hPT0tFRF92a0NtZENsZWFyQ29sb3JJbWFnZQ0KK19fSE9PS0VEX3ZrQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZQ0KK19fSE9PS0VEX3ZrQ21kQ29weUJ1ZmZlcg0KK19fSE9PS0VEX3ZrQ21kQ29weUJ1ZmZlclRvSW1hZ2UNCitfX0hPT0tFRF92a0NtZENvcHlJbWFnZQ0KK19fSE9PS0VEX3ZrQ21kQ29weUltYWdlVG9CdWZmZXINCitfX0hPT0tFRF92a0NtZENvcHlRdWVyeVBvb2xSZXN1bHRzDQorX19IT09LRURfdmtDbWREaXNwYXRjaA0KK19fSE9PS0VEX3ZrQ21kRGlzcGF0Y2hJbmRpcmVjdA0KK19fSE9PS0VEX3ZrQ21kRHJhdw0KK19fSE9PS0VEX3ZrQ21kRHJhd0luZGV4ZWQNCitfX0hPT0tFRF92a0NtZERyYXdJbmRleGVkSW5kaXJlY3QNCitfX0hPT0tFRF92a0NtZERyYXdJbmRpcmVjdA0KK19fSE9PS0VEX3ZrQ21kRW5kUXVlcnkNCitfX0hPT0tFRF92a0NtZEVuZFJlbmRlclBhc3MNCitfX0hPT0tFRF92a0NtZEV4ZWN1dGVDb21tYW5kcw0KK19fSE9PS0VEX3ZrQ21kRmlsbEJ1ZmZlcg0KK19fSE9PS0VEX3ZrQ21kTmV4dFN1YnBhc3MNCitfX0hPT0tFRF92a0NtZFBpcGVsaW5lQmFycmllcg0KK19fSE9PS0VEX3ZrQ21kUHVzaENvbnN0YW50cw0KK19fSE9PS0VEX3ZrQ21kUmVzZXRFdmVudA0KK19fSE9PS0VEX3ZrQ21kUmVzZXRRdWVyeVBvb2wNCitfX0hPT0tFRF92a0NtZFJlc29sdmVJbWFnZQ0KK19fSE9PS0VEX3ZrQ21kU2V0QmxlbmRDb25zdGFudHMNCitfX0hPT0tFRF92a0NtZFNldERlcHRoQmlhcw0KK19fSE9PS0VEX3ZrQ21kU2V0RGVwdGhCb3VuZHMNCitfX0hPT0tFRF92a0NtZFNldEV2ZW50DQorX19IT09LRURfdmtDbWRTZXRMaW5lV2lkdGgNCitfX0hPT0tFRF92a0NtZFNldFNjaXNzb3INCitfX0hPT0tFRF92a0NtZFNldFN0ZW5jaWxDb21wYXJlTWFzaw0KK19fSE9PS0VEX3ZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZQ0KK19fSE9PS0VEX3ZrQ21kU2V0U3RlbmNpbFdyaXRlTWFzaw0KK19fSE9PS0VEX3ZrQ21kU2V0Vmlld3BvcnQNCitfX0hPT0tFRF92a0NtZFVwZGF0ZUJ1ZmZlcg0KK19fSE9PS0VEX3ZrQ21kV2FpdEV2ZW50cw0KK19fSE9PS0VEX3ZrQ21kV3JpdGVUaW1lc3RhbXANCitfX0hPT0tFRF92a0NyZWF0ZUJ1ZmZlcg0KK19fSE9PS0VEX3ZrQ3JlYXRlQnVmZmVyVmlldw0KK19fSE9PS0VEX3ZrQ3JlYXRlQ29tbWFuZFBvb2wNCitfX0hPT0tFRF92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMNCitfX0hPT0tFRF92a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQNCitfX0hPT0tFRF92a0NyZWF0ZURlc2NyaXB0b3JQb29sDQorX19IT09LRURfdmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0DQorX19IT09LRURfdmtDcmVhdGVEZXZpY2UNCitfX0hPT0tFRF92a0NyZWF0ZUV2ZW50DQorX19IT09LRURfdmtDcmVhdGVGZW5jZQ0KK19fSE9PS0VEX3ZrQ3JlYXRlRnJhbWVidWZmZXINCitfX0hPT0tFRF92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzDQorX19IT09LRURfdmtDcmVhdGVJbWFnZQ0KK19fSE9PS0VEX3ZrQ3JlYXRlSW1hZ2VWaWV3DQorX19IT09LRURfdmtDcmVhdGVJbnN0YW5jZQ0KK19fSE9PS0VEX3ZrQ3JlYXRlUGlwZWxpbmVDYWNoZQ0KK19fSE9PS0VEX3ZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQNCitfX0hPT0tFRF92a0NyZWF0ZVF1ZXJ5UG9vbA0KK19fSE9PS0VEX3ZrQ3JlYXRlUmVuZGVyUGFzcw0KK19fSE9PS0VEX3ZrQ3JlYXRlU2FtcGxlcg0KK19fSE9PS0VEX3ZrQ3JlYXRlU2VtYXBob3JlDQorX19IT09LRURfdmtDcmVhdGVTaGFkZXJNb2R1bGUNCitfX0hPT0tFRF92a0NyZWF0ZVN3YXBjaGFpbktIUg0KK19fSE9PS0VEX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSDQorX19IT09LRURfdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQNCitfX0hPT0tFRF92a0Rlc3Ryb3lCdWZmZXINCitfX0hPT0tFRF92a0Rlc3Ryb3lCdWZmZXJWaWV3DQorX19IT09LRURfdmtEZXN0cm95Q29tbWFuZFBvb2wNCitfX0hPT0tFRF92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUDQorX19IT09LRURfdmtEZXN0cm95RGVzY3JpcHRvclBvb2wNCitfX0hPT0tFRF92a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0DQorX19IT09LRURfdmtEZXN0cm95RGV2aWNlDQorX19IT09LRURfdmtEZXN0cm95RXZlbnQNCitfX0hPT0tFRF92a0Rlc3Ryb3lGZW5jZQ0KK19fSE9PS0VEX3ZrRGVzdHJveUZyYW1lYnVmZmVyDQorX19IT09LRURfdmtEZXN0cm95SW1hZ2UNCitfX0hPT0tFRF92a0Rlc3Ryb3lJbWFnZVZpZXcNCitfX0hPT0tFRF92a0Rlc3Ryb3lJbnN0YW5jZQ0KK19fSE9PS0VEX3ZrRGVzdHJveVBpcGVsaW5lDQorX19IT09LRURfdmtEZXN0cm95UGlwZWxpbmVDYWNoZQ0KK19fSE9PS0VEX3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0DQorX19IT09LRURfdmtEZXN0cm95UXVlcnlQb29sDQorX19IT09LRURfdmtEZXN0cm95UmVuZGVyUGFzcw0KK19fSE9PS0VEX3ZrRGVzdHJveVNhbXBsZXINCitfX0hPT0tFRF92a0Rlc3Ryb3lTZW1hcGhvcmUNCitfX0hPT0tFRF92a0Rlc3Ryb3lTaGFkZXJNb2R1bGUNCitfX0hPT0tFRF92a0Rlc3Ryb3lTdXJmYWNlS0hSDQorX19IT09LRURfdmtEZXN0cm95U3dhcGNoYWluS0hSDQorX19IT09LRURfdmtEZXZpY2VXYWl0SWRsZQ0KK19fSE9PS0VEX3ZrRW5kQ29tbWFuZEJ1ZmZlcg0KK3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcw0KK19fSE9PS0VEX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcw0KK3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzDQorX19IT09LRURfdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMNCit2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzDQordmtFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMNCitfX0hPT0tFRF92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcw0KK19fSE9PS0VEX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMNCitfX0hPT0tFRF92a0ZyZWVDb21tYW5kQnVmZmVycw0KK19fSE9PS0VEX3ZrRnJlZURlc2NyaXB0b3JTZXRzDQorX19IT09LRURfdmtGcmVlTWVtb3J5DQorX19IT09LRURfdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMNCitfX0hPT0tFRF92a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQNCitWS19MQVlFUl9MVU5BUkdfdmt0cmFjZUdldERldmljZVByb2NBZGRyDQorX19IT09LRURfdmtHZXREZXZpY2VQcm9jQWRkcg0KK19fSE9PS0VEX3ZrR2V0RGV2aWNlUXVldWUNCitfX0hPT0tFRF92a0dldEV2ZW50U3RhdHVzDQorX19IT09LRURfdmtHZXRGZW5jZVN0YXR1cw0KK19fSE9PS0VEX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMNCitfX0hPT0tFRF92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzDQorX19IT09LRURfdmtHZXRJbWFnZVN1YnJlc291cmNlTGF5b3V0DQorVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2VHZXRJbnN0YW5jZVByb2NBZGRyDQorX19IT09LRURfdmtHZXRJbnN0YW5jZVByb2NBZGRyDQorX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzDQorX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXMNCitfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzDQorX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMNCitfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllcw0KK19fSE9PS0VEX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMNCitfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzDQorX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFINCitfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFINCitfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUg0KK19fSE9PS0VEX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUg0KK19fSE9PS0VEX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFINCitfX0hPT0tFRF92a0dldFBpcGVsaW5lQ2FjaGVEYXRhDQorX19IT09LRURfdmtHZXRRdWVyeVBvb2xSZXN1bHRzDQorX19IT09LRURfdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHkNCitfX0hPT0tFRF92a0dldFN3YXBjaGFpbkltYWdlc0tIUg0KK19fSE9PS0VEX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcw0KK19fSE9PS0VEX3ZrTWFwTWVtb3J5DQorX19IT09LRURfdmtNZXJnZVBpcGVsaW5lQ2FjaGVzDQorX19IT09LRURfdmtRdWV1ZUJpbmRTcGFyc2UNCitfX0hPT0tFRF92a1F1ZXVlUHJlc2VudEtIUg0KK19fSE9PS0VEX3ZrUXVldWVTdWJtaXQNCitfX0hPT0tFRF92a1F1ZXVlV2FpdElkbGUNCitfX0hPT0tFRF92a1Jlc2V0Q29tbWFuZEJ1ZmZlcg0KK19fSE9PS0VEX3ZrUmVzZXRDb21tYW5kUG9vbA0KK19fSE9PS0VEX3ZrUmVzZXREZXNjcmlwdG9yUG9vbA0KK19fSE9PS0VEX3ZrUmVzZXRFdmVudA0KK19fSE9PS0VEX3ZrUmVzZXRGZW5jZXMNCitfX0hPT0tFRF92a1NldEV2ZW50DQorX19IT09LRURfdmtVbm1hcE1lbW9yeQ0KK19fSE9PS0VEX3ZrVXBkYXRlRGVzY3JpcHRvclNldHMNCitfX0hPT0tFRF92a1dhaXRGb3JGZW5jZXMNCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL2xpbnV4L1ZrTGF5ZXJfdmt0cmFjZV9sYXllci5qc29uIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci9saW51eC9Wa0xheWVyX3ZrdHJhY2VfbGF5ZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY2NTFkCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci9saW51eC9Wa0xheWVyX3ZrdHJhY2VfbGF5ZXIuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICAgImZpbGVfZm9ybWF0X3ZlcnNpb24iIDogIjEuMC4wIiwKKyAgICAibGF5ZXIiIDogeworICAgICAgICAibmFtZSI6ICJWS19MQVlFUl9MVU5BUkdfdmt0cmFjZSIsCisgICAgICAgICJ0eXBlIjogIkdMT0JBTCIsCisgICAgICAgICJsaWJyYXJ5X3BhdGgiOiAiLi4vdmt0cmFjZS9saWJWa0xheWVyX3ZrdHJhY2VfbGF5ZXIuc28iLAorICAgICAgICAiYXBpX3ZlcnNpb24iOiAiMS4wLjMzIiwKKyAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiAiMSIsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJWa3RyYWNlIHRyYWNpbmcgbGlicmFyeSIsCisgICAgICAgICJmdW5jdGlvbnMiIDogeworICAgICAgICAgICJ2a0dldEluc3RhbmNlUHJvY0FkZHIiIDogIlZLX0xBWUVSX0xVTkFSR192a3RyYWNlR2V0SW5zdGFuY2VQcm9jQWRkciIsCisgICAgICAgICAgInZrR2V0RGV2aWNlUHJvY0FkZHIiIDogIlZLX0xBWUVSX0xVTkFSR192a3RyYWNlR2V0RGV2aWNlUHJvY0FkZHIiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliLmMgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyMTYwMwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWIuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqLworCisjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2ZpbGVsaWtlLmgiCisjaW5jbHVkZSAidmt0cmFjZV9pbnRlcmNvbm5lY3QuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3ZrLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzCisvLyBUaGVzZSBhcmUgbmVlZGVkIGJlY2F1c2UgV2luZG93cyBtYXkgbm90IGhhdmUgZ2V0ZW52IGF2YWlsYWJsZS4KKy8vIFNlZSB0aGUgV2luZG93cyBtYW4gcGFnZSBmb3IgZ2V0ZW52IHRvIGZpbmQgb3V0IHdoeS4KKworI2lmIGRlZmluZWQoX1dJTjMyKQorc3RhdGljIGlubGluZSBjaGFyICp2a3RyYWNlX2xheWVyX2dldGVudihjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNoYXIgKnJldFZhbDsKKyAgICBEV09SRCB2YWxTaXplOworICAgIHZhbFNpemUgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQShuYW1lLCBOVUxMLCAwKTsgCisgICAgLy8gdmFsU2l6ZSBET0VTIGluY2x1ZGUgdGhlIG51bGwgdGVybWluYXRvciwgc28gZm9yIGFueSBzZXQgdmFyaWFibGUKKyAgICAvLyB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCAxLiBJZiBpdCdzIDAsIHRoZSB2YXJpYWJsZSB3YXNuJ3Qgc2V0LgorICAgIGlmICh2YWxTaXplID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldFZhbCA9IChjaGFyICopbWFsbG9jKHZhbFNpemUpOworICAgIEdldEVudmlyb25tZW50VmFyaWFibGVBKG5hbWUsIHJldFZhbCwgdmFsU2l6ZSk7CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZrdHJhY2VfbGF5ZXJfZnJlZV9nZXRlbnYoY29uc3QgY2hhciAqdmFsKQoreworICAgIGZyZWUoKHZvaWQgKil2YWwpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgY2hhciAqdmt0cmFjZV9sYXllcl9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICByZXR1cm4gZ2V0ZW52KG5hbWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmt0cmFjZV9sYXllcl9mcmVlX2dldGVudihjb25zdCBjaGFyICp2YWwpIHsgfQorI2VuZGlmCisKK1ZLVFJBQ0VSX0xFQVZFIF9VbmxvYWQodm9pZCk7CisKKyNpZmRlZiBQTEFURk9STV9MSU5VWAorc3RhdGljIHZvaWQgdmt0cmFjZV9zaWdoYW5kbGVyKGludCBzaWdudW0sIHNpZ2luZm9fdCAqaW5mbywgdm9pZCAqcHRyKQoreworICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJ2a3RyYWNlX2xpYiBsaWJyYXJ5IGhhbmRsZSBzaWduYWwgJWQuIiwgc2lnbnVtKTsKKyAgICBfVW5sb2FkKCk7CisgICAga2lsbCgwLCBzaWdudW0pOworfQorI2VuZGlmCisKK1ZLVFJBQ0VSX0VYSVQgVHJhcEV4aXQodm9pZCkKK3sKKyAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoInZrdHJhY2VfbGliIFRyYXBFeGl0LiIpOworfQorCit2b2lkIGxvZ2dpbmdDYWxsYmFjayhWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIHBNZXNzYWdlKQoreworICAgIHN3aXRjaChsZXZlbCkKKyAgICB7CisgICAgY2FzZSBWS1RSQUNFX0xPR19ERUJVRzogcHJpbnRmKCJ2a3RyYWNlIGRlYnVnOiAlc1xuIiwgcE1lc3NhZ2UpOyBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0VSUk9SOiBwcmludGYoInZrdHJhY2UgZXJyb3I6ICVzXG4iLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9MT0dfV0FSTklORzogcHJpbnRmKCJ2a3RyYWNlIHdhcm5pbmc6ICVzXG4iLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9MT0dfVkVSQk9TRTogcHJpbnRmKCJ2a3RyYWNlIGluZm86ICVzXG4iLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiJXNcbiIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgfQorICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgaWYgKHZrdHJhY2VfdHJhY2VfZ2V0X3RyYWNlX2ZpbGUoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgcmVxdWlyZWRMZW5ndGggPSAodWludDMyX3QpIFJPVU5EVVBfVE9fNChzdHJsZW4ocE1lc3NhZ2UpICsgMSk7CisgICAgICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9IHZrdHJhY2VfY3JlYXRlX3RyYWNlX3BhY2tldChWS1RSQUNFX1RJRF9WVUxLQU4sIFZLVFJBQ0VfVFBJX01FU1NBR0UsIHNpemVvZih2a3RyYWNlX3RyYWNlX3BhY2tldF9tZXNzYWdlKSwgcmVxdWlyZWRMZW5ndGgpOworICAgICAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9tZXNzYWdlKiBwUGFja2V0ID0gdmt0cmFjZV9pbnRlcnByZXRfYm9keV9hc190cmFjZV9wYWNrZXRfbWVzc2FnZShwSGVhZGVyKTsKKyAgICAgICAgcFBhY2tldC0+dHlwZSA9IGxldmVsOworICAgICAgICBwUGFja2V0LT5sZW5ndGggPSByZXF1aXJlZExlbmd0aDsKKworICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJnBQYWNrZXQtPm1lc3NhZ2UsIHJlcXVpcmVkTGVuZ3RoLCBwTWVzc2FnZSk7CisgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmcFBhY2tldC0+bWVzc2FnZSk7CisgICAgICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX3RyYWNlX3BhY2tldChwSGVhZGVyKTsKKworICAgICAgICB2a3RyYWNlX3dyaXRlX3RyYWNlX3BhY2tldChwSGVhZGVyLCB2a3RyYWNlX3RyYWNlX2dldF90cmFjZV9maWxlKCkpOworICAgICAgICB2a3RyYWNlX2RlbGV0ZV90cmFjZV9wYWNrZXQoJnBIZWFkZXIpOworICAgIH0KKworI2lmIGRlZmluZWQoV0lOMzIpCisjaWYgX0RFQlVHCisgICAgT3V0cHV0RGVidWdTdHJpbmcocE1lc3NhZ2UpOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQU5EUk9JRCkKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorICAgIHN3aXRjaChsZXZlbCkKKyAgICB7CisgICAgY2FzZSBWS1RSQUNFX0xPR19ERUJVRzogICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLCAgICJ2a3RyYWNlIiwgIiVzIiwgcE1lc3NhZ2UpOyBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0VSUk9SOiAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsICAgInZrdHJhY2UiLCAiJXMiLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9MT0dfV0FSTklORzogX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOSU5HLCAidmt0cmFjZSIsICIlcyIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX0xPR19WRVJCT1NFOiBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICAgICJ2a3RyYWNlIiwgIiVzIiwgcE1lc3NhZ2UpOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJ2a3RyYWNlIiwgIiVzIiwgcE1lc3NhZ2UpOyBicmVhazsKKyAgICB9CisjZW5kaWYKK30KKworZXh0ZXJuCitWS1RSQUNFUl9FTlRSWSBfTG9hZCh2b2lkKQoreworICAgIC8vIG9ubHkgZG8gdGhlIGhvb2tpbmcgYW5kIG5ldHdvcmtpbmcgaWYgdGhlIHRyYWNlciBpcyBOT1QgbG9hZGVkIGJ5IHZrdHJhY2UKKyAgICBpZiAodmt0cmFjZV9pc19sb2FkZWRfaW50b192a3RyYWNlKCkgPT0gRkFMU0UpCisgICAgeworICAgICAgICBjaGFyICp2ZXJib3NpdHk7CisgICAgICAgIHZrdHJhY2VfTG9nU2V0Q2FsbGJhY2sobG9nZ2luZ0NhbGxiYWNrKTsKKyAgICAgICAgdmVyYm9zaXR5ID0gdmt0cmFjZV9sYXllcl9nZXRlbnYoIl9WS19UUkFDRV9WRVJCT1NJVFkiKTsKKyAgICAgICAgaWYgKHZlcmJvc2l0eSAmJiAhc3RyY21wKHZlcmJvc2l0eSwgInF1aWV0IikpCisgICAgICAgICAgICB2a3RyYWNlX0xvZ1NldExldmVsKFZLVFJBQ0VfTE9HX05PTkUpOworICAgICAgICBlbHNlIGlmICh2ZXJib3NpdHkgJiYgIXN0cmNtcCh2ZXJib3NpdHksICJ3YXJuaW5ncyIpKQorICAgICAgICAgICAgdmt0cmFjZV9Mb2dTZXRMZXZlbChWS1RSQUNFX0xPR19XQVJOSU5HKTsKKyAgICAgICAgZWxzZSBpZiAodmVyYm9zaXR5ICYmICFzdHJjbXAodmVyYm9zaXR5LCAiZnVsbCIpKQorICAgICAgICAgICAgdmt0cmFjZV9Mb2dTZXRMZXZlbChWS1RSQUNFX0xPR19WRVJCT1NFKTsKKyNpZmRlZiBfREVCVUcKKyAgICAgICAgZWxzZSBpZiAodmVyYm9zaXR5ICYmICFzdHJjbXAodmVyYm9zaXR5LCAiZGVidWciKSkKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nU2V0TGV2ZWwoVktUUkFDRV9MT0dfREVCVUcpOworI2VuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIEVpdGhlciB2ZXJib3NpdHk9PSJlcnJvcnMiLCBvciBpdCB3YXNuJ3Qgc3BlY2lmaWVkCisgICAgICAgICAgICB2a3RyYWNlX0xvZ1NldExldmVsKFZLVFJBQ0VfTE9HX0VSUk9SKTsKKworICAgICAgICB2a3RyYWNlX2xheWVyX2ZyZWVfZ2V0ZW52KHZlcmJvc2l0eSk7CisKKyAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJ2a3RyYWNlX2xpYiBsaWJyYXJ5IGxvYWRlZCBpbnRvIFBJRCAlZCIsIHZrdHJhY2VfZ2V0X3BpZCgpKTsKKyAgICAgICAgYXRleGl0KFRyYXBFeGl0KTsKKworICAgICAgICAvLyBJZiB5b3UgbmVlZCB0byBkZWJ1ZyBzdGFydHVwLCBidWlsZCB3aXRoIHRoaXMgc2V0IHRvIHRydWUsIHRoZW4gYXR0YWNoIGFuZCBjaGFuZ2UgaXQgdG8gZmFsc2UuCisgICAgI2lmZGVmIF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBib29sIGRlYnVnU3RhcnR1cCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoZGVidWdTdGFydHVwKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorI2lmZGVmIFBMQVRGT1JNX0xJTlVYCisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworICAgICAgICBtZW1zZXQoJmFjdCwgMCAsIHNpemVvZihhY3QpKTsKKyAgICAgICAgYWN0LnNhX3NpZ2FjdGlvbiA9IHZrdHJhY2Vfc2lnaGFuZGxlcjsKKyAgICAgICAgYWN0LnNhX2ZsYWdzID0gU0FfU0lHSU5GTyB8IFNBX1JFU0VUSEFORDsKKyAgICAgICAgc2lnYWN0aW9uKFNJR0lOVCwgJmFjdCwgTlVMTCk7CisgICAgICAgIHNpZ2FjdGlvbihTSUdURVJNLCAmYWN0LCBOVUxMKTsKKyAgICAgICAgc2lnYWN0aW9uKFNJR0FCUlQsICZhY3QsIE5VTEwpOworI2VuZGlmCisgICAgfQorfQorCitWS1RSQUNFUl9MRUFWRSBfVW5sb2FkKHZvaWQpCit7CisgICAgLy8gb25seSBkbyB0aGUgaG9va2luZyBhbmQgbmV0d29ya2luZyBpZiB0aGUgdHJhY2VyIGlzIE5PVCBsb2FkZWQgYnkgdmt0cmFjZQorICAgIGlmICh2a3RyYWNlX2lzX2xvYWRlZF9pbnRvX3ZrdHJhY2UoKSA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmICh2a3RyYWNlX3RyYWNlX2dldF90cmFjZV9maWxlKCkgIT0gTlVMTCkgeworICAgICAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gdmt0cmFjZV9jcmVhdGVfdHJhY2VfcGFja2V0KFZLVFJBQ0VfVElEX1ZVTEtBTiwgVktUUkFDRV9UUElfTUFSS0VSX1RFUk1JTkFURV9QUk9DRVNTLCAwLCAwKTsKKyAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfdHJhY2VfcGFja2V0KHBIZWFkZXIpOworICAgICAgICAgICAgdmt0cmFjZV93cml0ZV90cmFjZV9wYWNrZXQocEhlYWRlciwgdmt0cmFjZV90cmFjZV9nZXRfdHJhY2VfZmlsZSgpKTsKKyAgICAgICAgICAgIHZrdHJhY2VfZGVsZXRlX3RyYWNlX3BhY2tldCgmcEhlYWRlcik7CisgICAgICAgICAgICB2a3RyYWNlX2ZyZWUodmt0cmFjZV90cmFjZV9nZXRfdHJhY2VfZmlsZSgpKTsKKyAgICAgICAgICAgIHZrdHJhY2VfdHJhY2Vfc2V0X3RyYWNlX2ZpbGUoTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdNZXNzYWdlU3RyZWFtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9kZXN0cm95KCZnTWVzc2FnZVN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJ2a3RyYWNlX2xpYiBsaWJyYXJ5IHVubG9hZGVkIGZyb20gUElEICVkIiwgdmt0cmFjZV9nZXRfcGlkKCkpOworICAgIH0KK30KKworI2lmIGRlZmluZWQoV0lOMzIpCitCT09MIEFQSUVOVFJZIERsbE1haW4oIEhNT0RVTEUgaE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgIHVsX3JlYXNvbl9mb3JfY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBoTW9kdWxlOworICAgIGxwUmVzZXJ2ZWQ7CisKKyAgICBzd2l0Y2ggKHVsX3JlYXNvbl9mb3JfY2FsbCkKKyAgICB7CisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgeworICAgICAgICBfTG9hZCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgeworICAgICAgICBfVW5sb2FkKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX2hlbHBlcnMuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGNmYWMKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX2hlbHBlcnMuaApAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb2JpbiBFaGxpcyA8dG9iaW5AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3ZrLmgiCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIgorCisjaW5jbHVkZSAidmtfc3RydWN0X3NpemVfaGVscGVyLmgiCisKKy8vIFN1cHBvcnQgZm9yIHNoYWRvd2luZyBDUFUgbWFwcGVkIG1lbW9yeQorLy9UT0RPIGJldHRlciBoYW5kbGluZyBvZiBtdWx0aXBsZSByYW5nZSByYXRoZXIgdGhhbiBmaXhlZCBhcnJheQordHlwZWRlZiBzdHJ1Y3QgX1ZLQWxsb2NJbmZvIHsKKyAgICBWa0RldmljZVNpemUgICB0b3RhbFNpemU7CisgICAgVmtEZXZpY2VTaXplICAgcmFuZ2VTaXplOworICAgIFZrRGV2aWNlU2l6ZSAgIHJhbmdlT2Zmc2V0OworICAgIEJPT0wgICAgICAgICAgIGRpZEZsdXNoOworICAgIFZrRGV2aWNlTWVtb3J5IGhhbmRsZTsKKyAgICB1aW50OF90ICAgICAgICAqcERhdGE7CisgICAgQk9PTCAgICAgICAgICAgdmFsaWQ7Cit9IFZLQWxsb2NJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfVktNZW1JbmZvIHsKKyAgICB1bnNpZ25lZCBpbnQgbnVtRW50cnlzOworICAgIFZLQWxsb2NJbmZvICpwRW50cnlzOworICAgIFZLQWxsb2NJbmZvICpwTGFzdE1hcHBlZDsKKyAgICB1bnNpZ25lZCBpbnQgY2FwYWNpdHk7Cit9IFZLTWVtSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX2xheWVyX2RldmljZV9kYXRhIHsKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSBkZXZUYWJsZTsKKyAgICBib29sIEtIUkRldmljZVN3YXBjaGFpbkVuYWJsZWQ7Cit9IGxheWVyX2RldmljZV9kYXRhOwordHlwZWRlZiBzdHJ1Y3QgX2xheWVyX2luc3RhbmNlX2RhdGEgeworICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUgaW5zdFRhYmxlOworICAgIGJvb2wgTHVuYXJnRGVidWdSZXBvcnRFbmFibGVkOworICAgIGJvb2wgS0hSU3VyZmFjZUVuYWJsZWQ7CisgICAgYm9vbCBLSFJYY2JTdXJmYWNlRW5hYmxlZDsKKyAgICBib29sIEtIUlhsaWJTdXJmYWNlRW5hYmxlZDsKKyAgICBib29sIEtIUldheWxhbmRTdXJmYWNlRW5hYmxlZDsKKyAgICBib29sIEtIUk1pclN1cmZhY2VFbmFibGVkOworICAgIGJvb2wgS0hSV2luMzJTdXJmYWNlRW5hYmxlZDsKKyAgICBib29sIEtIUkFuZHJvaWRTdXJmYWNlRW5hYmxlZDsKK30gbGF5ZXJfaW5zdGFuY2VfZGF0YTsKKworLy8gZGVmaW5lZCBpbiBtYW51YWxseSB3cml0dGVuIGZpbGU6IHZrdHJhY2VfbGliX3RyYWNlLmMKK2V4dGVybiBWS01lbUluZm8gZ19tZW1JbmZvOworZXh0ZXJuIFZLVFJBQ0VfQ1JJVElDQUxfU0VDVElPTiBnX21lbUluZm9Mb2NrOworZXh0ZXJuIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIGxheWVyX2RldmljZV9kYXRhICo+IGdfZGV2aWNlRGF0YU1hcDsKK2V4dGVybiBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9pbnN0YW5jZV9kYXRhICo+IGdfaW5zdGFuY2VEYXRhTWFwOworCit0eXBlZGVmIHZvaWQgKmRpc3BhdGNoX2tleTsKK2lubGluZSBkaXNwYXRjaF9rZXkgZ2V0X2Rpc3BhdGNoX2tleShjb25zdCB2b2lkKiBvYmplY3QpCit7CisgICAgcmV0dXJuIChkaXNwYXRjaF9rZXkpICooVmtMYXllckRpc3BhdGNoVGFibGUgKiopIG9iamVjdDsKK30KKworbGF5ZXJfaW5zdGFuY2VfZGF0YSAqbWlkKHZvaWQgKm9iamVjdCk7CitsYXllcl9kZXZpY2VfZGF0YSAqbWRkKHZvaWQqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGluaXRfbWVtX2luZm9fZW50cnlzKFZLQWxsb2NJbmZvICpwdHIsIGNvbnN0IHVuc2lnbmVkIGludCBudW0pCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgIHsKKyAgICAgICAgVktBbGxvY0luZm8gKmVudHJ5ID0gcHRyICsgaTsKKyAgICAgICAgZW50cnktPnBEYXRhID0gTlVMTDsKKyAgICAgICAgZW50cnktPnRvdGFsU2l6ZSA9IDA7CisgICAgICAgIGVudHJ5LT5yYW5nZVNpemUgPSAwOworICAgICAgICBlbnRyeS0+cmFuZ2VPZmZzZXQgPSAwOworICAgICAgICBlbnRyeS0+ZGlkRmx1c2ggPSBGQUxTRTsKKyAgICAgICAgbWVtc2V0KCZlbnRyeS0+aGFuZGxlLCAwLCBzaXplb2YoVmtEZXZpY2VNZW1vcnkpKTsKKyAgICAgICAgZW50cnktPnZhbGlkID0gRkFMU0U7CisgICAgfQorfQorCisvLyBjYWxsZXIgbXVzdCBob2xkIHRoZSBnX21lbUluZm9Mb2NrCitzdGF0aWMgdm9pZCBpbml0X21lbV9pbmZvKCkKK3sKKyAgICBnX21lbUluZm8ubnVtRW50cnlzID0gMDsKKyAgICBnX21lbUluZm8uY2FwYWNpdHkgPSA0MDk2OworICAgIGdfbWVtSW5mby5wTGFzdE1hcHBlZCA9IE5VTEw7CisKKyAgICBnX21lbUluZm8ucEVudHJ5cyA9IFZLVFJBQ0VfTkVXX0FSUkFZKFZLQWxsb2NJbmZvLCBnX21lbUluZm8uY2FwYWNpdHkpOworCisgICAgaWYgKGdfbWVtSW5mby5wRW50cnlzID09IE5VTEwpCisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoImluaXRfbWVtX2luZm8oKSAgbWFsbG9jIGZhaWxlZC4iKTsKKyAgICBlbHNlCisgICAgICAgIGluaXRfbWVtX2luZm9fZW50cnlzKGdfbWVtSW5mby5wRW50cnlzLCBnX21lbUluZm8uY2FwYWNpdHkpOworfQorCisvLyBjYWxsZXIgbXVzdCBob2xkIHRoZSBnX21lbUluZm9Mb2NrCitzdGF0aWMgdm9pZCBkZWxldGVfbWVtX2luZm8oKQoreworICAgIFZLVFJBQ0VfREVMRVRFKGdfbWVtSW5mby5wRW50cnlzKTsKKyAgICBnX21lbUluZm8ucEVudHJ5cyA9IE5VTEw7CisgICAgZ19tZW1JbmZvLm51bUVudHJ5cyA9IDA7CisgICAgZ19tZW1JbmZvLmNhcGFjaXR5ID0gMDsKKyAgICBnX21lbUluZm8ucExhc3RNYXBwZWQgPSBOVUxMOworfQorCisvLyBjYWxsZXIgbXVzdCBob2xkIHRoZSBnX21lbUluZm9Mb2NrCitzdGF0aWMgVktBbGxvY0luZm8gKiBnZXRfbWVtX2luZm9fZW50cnkoKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIFZLQWxsb2NJbmZvICplbnRyeTsKKyAgICBpZiAoZ19tZW1JbmZvLm51bUVudHJ5cyA+IGdfbWVtSW5mby5jYXBhY2l0eSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoImdldF9tZW1faW5mb19lbnRyeSgpIGJhZCBpbnRlcm5hbCBzdGF0ZSBudW1FbnRyeXMgJXUuIiwgZ19tZW1JbmZvLm51bUVudHJ5cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGVudHJ5ID0gZ19tZW1JbmZvLnBFbnRyeXM7CisgICAgZm9yIChpID0gMDsgaSA8IGdfbWVtSW5mby5udW1FbnRyeXM7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoZW50cnkgKyBpKS0+dmFsaWQgPT0gRkFMU0UpCisgICAgICAgICAgICByZXR1cm4gZW50cnkgKyBpOworICAgIH0KKyAgICBpZiAoZ19tZW1JbmZvLm51bUVudHJ5cyA9PSBnX21lbUluZm8uY2FwYWNpdHkpCisgICAgeyAgLy8gZ3JvdyB0aGUgYXJyYXkgMngKKyAgICAgICAgZ19tZW1JbmZvLmNhcGFjaXR5ICo9IDI7CisgICAgICAgIGdfbWVtSW5mby5wRW50cnlzID0gKFZLQWxsb2NJbmZvICopIFZLVFJBQ0VfUkVBTExPQyhnX21lbUluZm8ucEVudHJ5cywgZ19tZW1JbmZvLmNhcGFjaXR5ICogc2l6ZW9mKFZLQWxsb2NJbmZvKSk7CisgICAgICAgIGlmIChnX21lbUluZm8ucEVudHJ5cyA9PSBOVUxMKQorICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiZ2V0X21lbV9pbmZvX2VudHJ5KCkgcmVhbGxvYyBmYWlsZWQuIik7CisgICAgICAgIHZrdHJhY2VfTG9nRGVidWcoInJlYWxsb2MgbWVtSW5mbyBmcm9tICV1IHRvICV1IiwgZ19tZW1JbmZvLmNhcGFjaXR5IC8yLCBnX21lbUluZm8uY2FwYWNpdHkpOworICAgICAgICAvL2luaXQgdGhlIG5ld2x5IGFkZGVkIGVudHJ5cworICAgICAgICBpbml0X21lbV9pbmZvX2VudHJ5cyhnX21lbUluZm8ucEVudHJ5cyArIGdfbWVtSW5mby5jYXBhY2l0eSAvIDIsIGdfbWVtSW5mby5jYXBhY2l0eSAvIDIpOworICAgIH0KKworICAgIGFzc2VydChnX21lbUluZm8ubnVtRW50cnlzIDwgZ19tZW1JbmZvLmNhcGFjaXR5KTsKKyAgICBlbnRyeSA9IGdfbWVtSW5mby5wRW50cnlzICsgZ19tZW1JbmZvLm51bUVudHJ5czsKKyAgICBnX21lbUluZm8ubnVtRW50cnlzKys7CisgICAgYXNzZXJ0KGVudHJ5LT52YWxpZCA9PSBGQUxTRSk7CisgICAgcmV0dXJuIGVudHJ5OworfQorCisvLyBjYWxsZXIgbXVzdCBob2xkIHRoZSBnX21lbUluZm9Mb2NrCitzdGF0aWMgVktBbGxvY0luZm8gKiBmaW5kX21lbV9pbmZvX2VudHJ5KGNvbnN0IFZrRGV2aWNlTWVtb3J5IGhhbmRsZSkKK3sKKyAgICBWS0FsbG9jSW5mbyAqZW50cnk7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZW50cnkgPSBnX21lbUluZm8ucEVudHJ5czsKKyAgICBpZiAoZ19tZW1JbmZvLnBMYXN0TWFwcGVkICYmIGdfbWVtSW5mby5wTGFzdE1hcHBlZC0+aGFuZGxlID09IGhhbmRsZSAmJiBnX21lbUluZm8ucExhc3RNYXBwZWQtPnZhbGlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdfbWVtSW5mby5wTGFzdE1hcHBlZDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGdfbWVtSW5mby5udW1FbnRyeXM7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoZW50cnkgKyBpKS0+dmFsaWQgJiYgKGhhbmRsZSA9PSAoZW50cnkgKyBpKS0+aGFuZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5ICsgaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgVktBbGxvY0luZm8gKiBmaW5kX21lbV9pbmZvX2VudHJ5X2xvY2soY29uc3QgVmtEZXZpY2VNZW1vcnkgaGFuZGxlKQoreworICAgIFZLQWxsb2NJbmZvICpyZXM7CisgICAgdmt0cmFjZV9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKCZnX21lbUluZm9Mb2NrKTsKKyAgICByZXMgPSBmaW5kX21lbV9pbmZvX2VudHJ5KGhhbmRsZSk7CisgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnX21lbUluZm9Mb2NrKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBhZGRfbmV3X2hhbmRsZV90b19tZW1faW5mbyhjb25zdCBWa0RldmljZU1lbW9yeSBoYW5kbGUsIFZrRGV2aWNlU2l6ZSBzaXplLCB2b2lkICpwRGF0YSkKK3sKKyAgICBWS0FsbG9jSW5mbyAqZW50cnk7CisKKyAgICB2a3RyYWNlX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oJmdfbWVtSW5mb0xvY2spOworICAgIGlmIChnX21lbUluZm8uY2FwYWNpdHkgPT0gMCkKKyAgICAgICAgaW5pdF9tZW1faW5mbygpOworCisgICAgZW50cnkgPSBnZXRfbWVtX2luZm9fZW50cnkoKTsKKyAgICBpZiAoZW50cnkpCisgICAgeworICAgICAgICBlbnRyeS0+dmFsaWQgPSBUUlVFOworICAgICAgICBlbnRyeS0+aGFuZGxlID0gaGFuZGxlOworICAgICAgICBlbnRyeS0+dG90YWxTaXplID0gc2l6ZTsKKyAgICAgICAgZW50cnktPnJhbmdlU2l6ZSA9IDA7CisgICAgICAgIGVudHJ5LT5yYW5nZU9mZnNldCA9IDA7CisgICAgICAgIGVudHJ5LT5kaWRGbHVzaCA9IEZBTFNFOworICAgICAgICBlbnRyeS0+cERhdGEgPSAodWludDhfdCAqKSBwRGF0YTsgICAvLyBOT1RFOiBWS0ZyZWVNZW1vcnkgd2lsbCBmcmVlIHRoaXMgbWVtLCBzbyBubyBtYWxsb2MoKQorICAgIH0KKyAgICB2a3RyYWNlX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oJmdfbWVtSW5mb0xvY2spOworfQorCitzdGF0aWMgdm9pZCBhZGRfZGF0YV90b19tZW1faW5mbyhjb25zdCBWa0RldmljZU1lbW9yeSBoYW5kbGUsIFZrRGV2aWNlU2l6ZSByYW5nZVNpemUsIFZrRGV2aWNlU2l6ZSByYW5nZU9mZnNldCwgdm9pZCAqcERhdGEpCit7CisgICAgVktBbGxvY0luZm8gKmVudHJ5OworCisgICAgdmt0cmFjZV9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKCZnX21lbUluZm9Mb2NrKTsKKyAgICBlbnRyeSA9IGZpbmRfbWVtX2luZm9fZW50cnkoaGFuZGxlKTsKKyAgICBpZiAoZW50cnkpCisgICAgeworICAgICAgICBlbnRyeS0+cERhdGEgPSAodWludDhfdCAqKXBEYXRhOworICAgICAgICBpZiAocmFuZ2VTaXplID09IFZLX1dIT0xFX1NJWkUpCisgICAgICAgICAgICBlbnRyeS0+cmFuZ2VTaXplID0gZW50cnktPnRvdGFsU2l6ZSAtIHJhbmdlT2Zmc2V0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbnRyeS0+cmFuZ2VTaXplID0gcmFuZ2VTaXplOworICAgICAgICBlbnRyeS0+cmFuZ2VPZmZzZXQgPSByYW5nZU9mZnNldDsKKyAgICAgICAgYXNzZXJ0KGVudHJ5LT50b3RhbFNpemUgPj0gZW50cnktPnJhbmdlU2l6ZSArIHJhbmdlT2Zmc2V0KTsKKyAgICB9CisgICAgZ19tZW1JbmZvLnBMYXN0TWFwcGVkID0gZW50cnk7CisgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnX21lbUluZm9Mb2NrKTsKK30KKworc3RhdGljIHZvaWQgcm1faGFuZGxlX2Zyb21fbWVtX2luZm8oY29uc3QgVmtEZXZpY2VNZW1vcnkgaGFuZGxlKQoreworICAgIFZLQWxsb2NJbmZvICplbnRyeTsKKworICAgIHZrdHJhY2VfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigmZ19tZW1JbmZvTG9jayk7CisgICAgZW50cnkgPSBmaW5kX21lbV9pbmZvX2VudHJ5KGhhbmRsZSk7CisgICAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgICAgZW50cnktPnZhbGlkID0gRkFMU0U7CisgICAgICAgIGVudHJ5LT5wRGF0YSA9IE5VTEw7CisgICAgICAgIGVudHJ5LT50b3RhbFNpemUgPSAwOworICAgICAgICBlbnRyeS0+cmFuZ2VTaXplID0gMDsKKyAgICAgICAgZW50cnktPnJhbmdlT2Zmc2V0ID0gMDsKKyAgICAgICAgZW50cnktPmRpZEZsdXNoID0gRkFMU0U7CisgICAgICAgIG1lbXNldCgmZW50cnktPmhhbmRsZSwgMCwgc2l6ZW9mKFZrRGV2aWNlTWVtb3J5KSk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IGdfbWVtSW5mby5wTGFzdE1hcHBlZCkKKyAgICAgICAgICAgIGdfbWVtSW5mby5wTGFzdE1hcHBlZCA9IE5VTEw7CisgICAgICAgIC8vIGFkanVzdCBudW1FbnRyeXMgdG8gYmUgbGFzdCB2YWxpZCBlbnRyeSBpbiBsaXN0CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGVudHJ5ID0gIGdfbWVtSW5mby5wRW50cnlzICsgZ19tZW1JbmZvLm51bUVudHJ5cyAtIDE7CisgICAgICAgICAgICBpZiAoZW50cnktPnZhbGlkID09IEZBTFNFKQorICAgICAgICAgICAgICAgIGdfbWVtSW5mby5udW1FbnRyeXMtLTsKKyAgICAgICAgfSB3aGlsZSAoKGVudHJ5LT52YWxpZCA9PSBGQUxTRSkgJiYgKGdfbWVtSW5mby5udW1FbnRyeXMgPiAwKSk7CisgICAgICAgIGlmIChnX21lbUluZm8ubnVtRW50cnlzID09IDApCisgICAgICAgICAgICBkZWxldGVfbWVtX2luZm8oKTsKKyAgICB9CisgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnX21lbUluZm9Mb2NrKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2FsbG9jX21lbW9yeV90b190cmFjZV9wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyLCB2b2lkKiogcHBPdXQsIGNvbnN0IHZvaWQqIHBJbikKK3sKKyAgICB3aGlsZSAocEluKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgoKFZrQXBwbGljYXRpb25JbmZvICopcEluKS0+c1R5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERURJQ0FURURfQUxMT0NBVElPTl9NRU1PUllfQUxMT0NBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgcHBPdXQsIHNpemVvZihWa0RlZGljYXRlZEFsbG9jYXRpb25NZW1vcnlBbGxvY2F0ZUluZm9OViksIHBJbik7CisgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsIHBwT3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfQUxMT0NBVEVfSU5GT19OVjoKKyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgcHBPdXQsIHNpemVvZihWa0V4cG9ydE1lbW9yeUFsbG9jYXRlSW5mb05WKSwgcEluKTsKKyAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgcHBPdXQpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICBjYXNlIFZLX1NUUlVDVFVSRV9UWVBFX0VYUE9SVF9NRU1PUllfV0lOMzJfSEFORExFX0lORk9fTlY6CisgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsIHBwT3V0LCBzaXplb2YoVmtFeHBvcnRNZW1vcnlXaW4zMkhhbmRsZUluZm9OViksIHBJbik7CisgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsIHBwT3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX01FTU9SWV9XSU4zMl9IQU5ETEVfSU5GT19OVjoKKyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgcHBPdXQsIHNpemVvZihWa0ltcG9ydE1lbW9yeVdpbjMySGFuZGxlSW5mb05WKSwgcEluKTsKKyAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgcHBPdXQpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoInZrQWxsb2NhdGVNZW1vcnk6IHVucmVjb2duaXplIHBBbGxvY2F0ZSBwTmV4dCBsaXN0IHN0cnVjdHVyZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcEluID0gKChWa0FwcGxpY2F0aW9uSW5mbyAqKXBJbiktPnBOZXh0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRkX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm9fdG9fdHJhY2VfcGFja2V0KHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciwgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogcGFja2V0U2hhZGVyLCBjb25zdCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKiBwYXJhbVNoYWRlcikKK3sKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJnBhY2tldFNoYWRlci0+cE5hbWUsIFJPVU5EVVBfVE9fNChzdHJsZW4ocGFyYW1TaGFkZXItPnBOYW1lKSArIDEpLCBwYXJhbVNoYWRlci0+cE5hbWUpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmcGFja2V0U2hhZGVyLT5wTmFtZSk7CisKKyAgICAvLyBTcGVjaWFsaXphdGlvbiBpbmZvCisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSZwYWNrZXRTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8sIHNpemVvZihWa1NwZWNpYWxpemF0aW9uSW5mbyksIHBhcmFtU2hhZGVyLT5wU3BlY2lhbGl6YXRpb25JbmZvKTsKKyAgICBpZiAocGFja2V0U2hhZGVyLT5wU3BlY2lhbGl6YXRpb25JbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAocGFyYW1TaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSZwYWNrZXRTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8tPnBNYXBFbnRyaWVzLCBzaXplb2YoVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5KSAqIHBhcmFtU2hhZGVyLT5wU3BlY2lhbGl6YXRpb25JbmZvLT5tYXBFbnRyeUNvdW50LCBwYXJhbVNoYWRlci0+cFNwZWNpYWxpemF0aW9uSW5mby0+cE1hcEVudHJpZXMpOworICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSZwYWNrZXRTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8tPnBEYXRhLCBwYXJhbVNoYWRlci0+cFNwZWNpYWxpemF0aW9uSW5mby0+ZGF0YVNpemUsIHBhcmFtU2hhZGVyLT5wU3BlY2lhbGl6YXRpb25JbmZvLT5wRGF0YSk7CisgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJnBhY2tldFNoYWRlci0+cFNwZWNpYWxpemF0aW9uSW5mby0+cE1hcEVudHJpZXMpOworICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSZwYWNrZXRTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8tPnBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJnBhY2tldFNoYWRlci0+cFNwZWNpYWxpemF0aW9uSW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jcmVhdGVfZHNfbGF5b3V0X3RvX3RyYWNlX3BhY2tldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIGNvbnN0IFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qKiBwcE91dCwgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyogcEluKQoreworICAgIHVpbnQzMl90IGk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKShwcE91dCksIHNpemVvZihWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvKSwgcEluKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJigoKnBwT3V0KS0+cEJpbmRpbmdzKSwgc2l6ZW9mKFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcpICogcEluLT5iaW5kaW5nQ291bnQsIHBJbi0+cEJpbmRpbmdzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEluLT5iaW5kaW5nQ291bnQ7IGkrKykgeworICAgICAgICBpZiAocEluLT5wQmluZGluZ3NbaV0ucEltbXV0YWJsZVNhbXBsZXJzICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAocEluLT5wQmluZGluZ3NbaV0uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRVIgfHwKKyAgICAgICAgICAgICAgICAgcEluLT5wQmluZGluZ3NbaV0uZGVzY3JpcHRvclR5cGUgPT0gVktfREVTQ1JJUFRPUl9UWVBFX0NPTUJJTkVEX0lNQUdFX1NBTVBMRVIpKSB7CisgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJigoKnBwT3V0KS0+cEJpbmRpbmdzW2ldLnBJbW11dGFibGVTYW1wbGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWa1NhbXBsZXIpICogcEluLT5wQmluZGluZ3NbaV0uZGVzY3JpcHRvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW4tPnBCaW5kaW5nc1tpXS5wSW1tdXRhYmxlU2FtcGxlcnMpOworICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYoKCpwcE91dCktPnBCaW5kaW5nc1tpXS5wSW1tdXRhYmxlU2FtcGxlcnMpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJigoKnBwT3V0KS0+cEJpbmRpbmdzKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKShwcE91dCkpOworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgYWRkX1ZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm9zX3RvX3RyYWNlX3BhY2tldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBQYWNrZXQsIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qIHBQYXJhbSwgdWludDMyX3QgY291bnQpCit7CisgICAgaWYgKHBQYXJhbSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgdWludDMyX3QgajsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgLy8gc2hhZGVyIHN0YWdlcyBhcnJheQorICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN0YWdlcyksIHNpemVvZihWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKSAqIHBQYXJhbVtpXS5zdGFnZUNvdW50LCBwUGFyYW1baV0ucFN0YWdlcyk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBhcmFtW2ldLnN0YWdlQ291bnQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mb190b190cmFjZV9wYWNrZXQocEhlYWRlciwgKFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qKSZwUGFja2V0LT5wU3RhZ2VzW2pdLCAmcFBhcmFtLT5wU3RhZ2VzW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdGFnZXMpKTsKKworICAgICAgICAgICAgLy8gVmVydGV4IElucHV0IFN0YXRlCisgICAgICAgICAgICBpZiAocFBhcmFtW2ldLnBWZXJ0ZXhJbnB1dFN0YXRlKSB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFZlcnRleElucHV0U3RhdGUpLCBzaXplb2YoVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKSwgcFBhcmFtW2ldLnBWZXJ0ZXhJbnB1dFN0YXRlKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMpLCBwUGFyYW1baV0ucFZlcnRleElucHV0U3RhdGUtPnZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbkNvdW50ICogc2l6ZW9mKFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24pLCBwUGFyYW1baV0ucFZlcnRleElucHV0U3RhdGUtPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMpKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wVmVydGV4SW5wdXRTdGF0ZS0+cFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyksIHBQYXJhbVtpXS5wVmVydGV4SW5wdXRTdGF0ZS0+dmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25Db3VudCAqIHNpemVvZihWa1ZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24pLCBwUGFyYW1baV0ucFZlcnRleElucHV0U3RhdGUtPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBWZXJ0ZXhJbnB1dFN0YXRlLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zKSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFZlcnRleElucHV0U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElucHV0IEFzc2VtYmx5IFN0YXRlCisgICAgICAgICAgICBpZiAocFBhcmFtW2ldLnBJbnB1dEFzc2VtYmx5U3RhdGUpIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wSW5wdXRBc3NlbWJseVN0YXRlKSwgc2l6ZW9mKFZrUGlwZWxpbmVJbnB1dEFzc2VtYmx5U3RhdGVDcmVhdGVJbmZvKSwgcFBhcmFtW2ldLnBJbnB1dEFzc2VtYmx5U3RhdGUpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBJbnB1dEFzc2VtYmx5U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRlc3NlbGF0aW9uIFN0YXRlCisgICAgICAgICAgICBpZiAocFBhcmFtW2ldLnBUZXNzZWxsYXRpb25TdGF0ZSkgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBUZXNzZWxsYXRpb25TdGF0ZSksIHNpemVvZihWa1BpcGVsaW5lVGVzc2VsbGF0aW9uU3RhdGVDcmVhdGVJbmZvKSwgcFBhcmFtW2ldLnBUZXNzZWxsYXRpb25TdGF0ZSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFRlc3NlbGxhdGlvblN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBWaWV3cG9ydCBTdGF0ZQorICAgICAgICAgICAgaWYgKHBQYXJhbVtpXS5wVmlld3BvcnRTdGF0ZSkgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBWaWV3cG9ydFN0YXRlKSwgc2l6ZW9mKFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyksIHBQYXJhbVtpXS5wVmlld3BvcnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFZpZXdwb3J0U3RhdGUtPnBWaWV3cG9ydHMpLCBzaXplb2YoVmtWaWV3cG9ydCkgKiBwUGFyYW1baV0ucFZpZXdwb3J0U3RhdGUtPnZpZXdwb3J0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1baV0ucFZpZXdwb3J0U3RhdGUtPnBWaWV3cG9ydHMpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBWaWV3cG9ydFN0YXRlLT5wVmlld3BvcnRzKSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFZpZXdwb3J0U3RhdGUtPnBTY2lzc29ycyksIHNpemVvZihWa1JlY3QyRCkgKiBwUGFyYW1baV0ucFZpZXdwb3J0U3RhdGUtPnNjaXNzb3JDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbVtpXS5wVmlld3BvcnRTdGF0ZS0+cFNjaXNzb3JzKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wVmlld3BvcnRTdGF0ZS0+cFNjaXNzb3JzKSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFZpZXdwb3J0U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmFzdGVyIFN0YXRlCisgICAgICAgICAgICBpZiAocFBhcmFtW2ldLnBSYXN0ZXJpemF0aW9uU3RhdGUpIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUmFzdGVyaXphdGlvblN0YXRlKSwgc2l6ZW9mKFZrUGlwZWxpbmVSYXN0ZXJpemF0aW9uU3RhdGVDcmVhdGVJbmZvKSwgcFBhcmFtW2ldLnBSYXN0ZXJpemF0aW9uU3RhdGUpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBSYXN0ZXJpemF0aW9uU3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE11bHRpU2FtcGxlIFN0YXRlCisgICAgICAgICAgICBpZiAocFBhcmFtW2ldLnBNdWx0aXNhbXBsZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE11bHRpc2FtcGxlU3RhdGUpLCBzaXplb2YoVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKSwgcFBhcmFtW2ldLnBNdWx0aXNhbXBsZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wTXVsdGlzYW1wbGVTdGF0ZS0+cFNhbXBsZU1hc2spLCBzaXplb2YoVmtTYW1wbGVNYXNrKSwgcFBhcmFtW2ldLnBNdWx0aXNhbXBsZVN0YXRlLT5wU2FtcGxlTWFzayk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE11bHRpc2FtcGxlU3RhdGUtPnBTYW1wbGVNYXNrKSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE11bHRpc2FtcGxlU3RhdGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVwdGhTdGVuY2lsIFN0YXRlCisgICAgICAgICAgICBpZiAocFBhcmFtW2ldLnBEZXB0aFN0ZW5jaWxTdGF0ZSkgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEZXB0aFN0ZW5jaWxTdGF0ZSksIHNpemVvZihWa1BpcGVsaW5lRGVwdGhTdGVuY2lsU3RhdGVDcmVhdGVJbmZvKSwgcFBhcmFtW2ldLnBEZXB0aFN0ZW5jaWxTdGF0ZSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERlcHRoU3RlbmNpbFN0YXRlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbG9yQmxlbmQgU3RhdGUKKyAgICAgICAgICAgIGlmIChwUGFyYW1baV0ucENvbG9yQmxlbmRTdGF0ZSkgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDb2xvckJsZW5kU3RhdGUpLCBzaXplb2YoVmtQaXBlbGluZUNvbG9yQmxlbmRTdGF0ZUNyZWF0ZUluZm8pLCBwUGFyYW1baV0ucENvbG9yQmxlbmRTdGF0ZSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENvbG9yQmxlbmRTdGF0ZS0+cEF0dGFjaG1lbnRzKSwgcFBhcmFtW2ldLnBDb2xvckJsZW5kU3RhdGUtPmF0dGFjaG1lbnRDb3VudCAqIHNpemVvZihWa1BpcGVsaW5lQ29sb3JCbGVuZEF0dGFjaG1lbnRTdGF0ZSksIHBQYXJhbVtpXS5wQ29sb3JCbGVuZFN0YXRlLT5wQXR0YWNobWVudHMpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50cykpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDb2xvckJsZW5kU3RhdGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRHluYW1pY1N0YXRlCisgICAgICAgICAgICBpZiAocFBhcmFtW2ldLnBEeW5hbWljU3RhdGUpIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRHluYW1pY1N0YXRlKSwgc2l6ZW9mKFZrUGlwZWxpbmVEeW5hbWljU3RhdGVDcmVhdGVJbmZvKSwgcFBhcmFtW2ldLnBEeW5hbWljU3RhdGUpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzKSwgcFBhcmFtW2ldLnBEeW5hbWljU3RhdGUtPmR5bmFtaWNTdGF0ZUNvdW50ICogc2l6ZW9mKFZrRHluYW1pY1N0YXRlKSwgcFBhcmFtW2ldLnBEeW5hbWljU3RhdGUtPnBEeW5hbWljU3RhdGVzKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRHluYW1pY1N0YXRlLT5wRHluYW1pY1N0YXRlcykpOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEeW5hbWljU3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9zX3RvX3RyYWNlX3BhY2tldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIsIFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyogcFBhY2tldCwgY29uc3QgVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKiBwUGFyYW0sIHVpbnQzMl90IGNvdW50KQoreworICAgIGlmIChwUGFyYW0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIC8vIHNoYWRlciBzdGFnZQorICAgICAgICAgICAgYWRkX1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm9fdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsIChWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKikmcFBhY2tldC0+c3RhZ2UsICZwUGFyYW1baV0uc3RhZ2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZWd1YXJkLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZWd1YXJkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDcwYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl9wYWdlZ3VhcmQuY3BwCkBAIC0wLDAgKzEsMzk3IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworCisKKyNpbmNsdWRlICJ2a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZWd1YXJkbWFwcGVkbWVtb3J5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZWd1YXJkY2FwdHVyZS5oIgorI2luY2x1ZGUgInZrdHJhY2VfbGliX3BhZ2VndWFyZC5oIgorCitzdGF0aWMgY29uc3QgYm9vbCBQQUdFR1VBUkRfUEFHRUdVQVJEX0VOQUJMRV9ERUZBVUxUID0gZmFsc2U7ICAvL3NldCB0aGUgZGVmYXVsdCB2YWx1ZSB0byBmYWxzZSwgaWYgY2FwdHVyZSB0YXJnZXQgYXBwIHdpdGggZW5hYmxlIHBhZ2VndWFyZCwgbmVlZCBydW4gInNldCBWS1RSQUNFX1BBR0VHVUFSRD0xIiBjb21tYW5kbGluZS4KKworc3RhdGljIGNvbnN0IFZrRGV2aWNlU2l6ZSBQQUdFR1VBUkRfVEFSR0VUX1JBTkdFX1NJWkVfREVGQVVMVCA9IDI7IC8vY292ZXIgYWxsIHJlYXNvbmFsIG1hcHBlZCBtZW1vcnkgc2l6ZSwgdGhlIG1hcHBlZCBtZW1vcnkgc2l6ZSBtYXkgYmUgbGVzcyB0aGFuIDEgcGFnZSwgc28gcHJvY2Vzc2luZyBmb3IgbWFwcGVkIG1lbW9yeSBzaXplPDEgcGFnZSBpcyBhbHJlYWR5IGFkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXIgdmFsdWU6IDMyICogMTAyNCAqIDEwMjQgKDMyTSksICA2NE0sIHRoaXMgaXMgdGhlIHNpemUgd2hpY2ggY2F1c2UgRE9PTTQgY2FwdHVyZSB2ZXJ5IHNsb3cuCitzdGF0aWMgY29uc3QgVmtEZXZpY2VTaXplICBQQUdFR1VBUkRfUEFHRUdVQVJEX1RBUkdFVF9SQU5HRV9TSVpFX01JTiA9IDE7IC8vIGFscmVhZHkgdGVzdGVkOiAyLDJNLDRNLDMyTSw2NE0sIGJlY2F1c2UgY29tbW9ubHkgcGFnZSBzaXplIGlzIDRrLCBzbyBvbmx5IHJhbmdlIHNpemU9MiBjYW4gY292ZXIgc21hbGwgc2l6ZSBtYXBwZWQgbWVtb3J5LgorCitzdGF0aWMgdmt0cmFjZV9zZW1faWQgcmVmX2Ftb3VudF9zZW1faWQ7Ly8gVE9ETyBpZiB2a3RyYWNlIGltcGxlbWVudCBjcm9zcyBwbGF0Zm9ybSBsaWIgb3IgZGxsIGxvYWQgb3IgdW5sb2FkIGZ1bmN0aW9uLCB0aGlzIHNlbSBjYW4gYmUgcHV0dGVkIGluIHRob3NlIGZ1bmN0aW9ucywgYnV0IG5vdyB3ZSBsZWF2ZSBpdCB0byBwcm9jZXNzIHF1aXQuCitzdGF0aWMgYm9vbCByZWZfYW1vdW50X3NlbV9pZF9jcmVhdGVfc3VjY2VzcyA9IHZrdHJhY2Vfc2VtX2NyZWF0ZSgmcmVmX2Ftb3VudF9zZW1faWQsIDEpOworCitzdGF0aWMgdmt0cmFjZV9zZW1faWQgbWFwX2xvY2tfc2VtX2lkOworc3RhdGljIGJvb2wgbWFwX2xvY2tfc2VtX2lkX2NyZWF0ZV9zdWNjZXNzID0gdmt0cmFjZV9zZW1fY3JlYXRlKCZtYXBfbG9ja19zZW1faWQsIDEpOworCit2b2lkIHBhZ2VndWFyZEVudGVyKCkKK3sKKyAgICB2a3RyYWNlX3NlbV93YWl0KG1hcF9sb2NrX3NlbV9pZCk7Cit9Cit2b2lkIHBhZ2VndWFyZEV4aXQoKQoreworICAgIHZrdHJhY2Vfc2VtX3Bvc3QobWFwX2xvY2tfc2VtX2lkKTsKK30KKyNpZiBkZWZpbmVkKFdJTjMyKSAvL3BhZ2UgZ3VhcmQgc29sdXRpb24gZm9yIHdpbmRvd3MKKworCitWa0RldmljZVNpemUmIHJlZl90YXJnZXRfcmFuZ2Vfc2l6ZSgpCit7CisgICAgc3RhdGljIFZrRGV2aWNlU2l6ZSBPUFRUYXJnZXRSYW5nZVNpemUgPSBQQUdFR1VBUkRfVEFSR0VUX1JBTkdFX1NJWkVfREVGQVVMVDsKKyAgICByZXR1cm4gT1BUVGFyZ2V0UmFuZ2VTaXplOworfQorCit2b2lkIHNldF9wYWdlZ3VhcmRfdGFyZ2V0X3JhbmdlX3NpemUoVmtEZXZpY2VTaXplIG5ld3Jhbmdlc2l6ZSkKK3sKKyAgICBWa0RldmljZVNpemUmIHJlZlRhcmdldFJhbmdlU2l6ZSA9IHJlZl90YXJnZXRfcmFuZ2Vfc2l6ZSgpOworCisgICAgcmVmVGFyZ2V0UmFuZ2VTaXplID0gbmV3cmFuZ2VzaXplOworfQorCitMT05HIFdJTkFQSSBQYWdlR3VhcmRFeGNlcHRpb25IYW5kbGVyKFBFWENFUFRJT05fUE9JTlRFUlMgRXhjZXB0aW9uSW5mbyk7CitQVk9JRCBPUFRIYW5kbGVyID0gbnVsbHB0cjsgLy91c2UgdG8gcmVtb3ZlIHBhZ2UgZ3VhcmQgaGFuZGxlcgordWludDMyX3QgT1BUSGFuZGxlclJlZkFtb3VudCA9IDA7IC8vZm9yIHBlcnNpc3RlbnQgbWFwIGFuZCBtdWx0aS10aHJlYWRpbmcgZW52aXJvbm1lbnQsIG1hcCBhbmQgdW5tYXAgbWF5YmUgb3ZlcmxhcCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgcmVtb3ZlIGhhbmRsZXIgYWZ0ZXIgYWxsIHBlcnNpc3RlbnQgbWFwIGhhcyBiZWVuIHVubWFwcGVkLgorCisvL3JldHVybiBpZiBlbmFibGUgcGFnZWd1YXJkOworLy9pZiBlbmFibGUgcGFnZSBndWFyZCwgdGhlbiBjaGVjayBpZiBuZWVkIHRvIHVwZGF0ZSB0YXJnZXQgcmFuZ2Ugc2l6ZSwgcGFnZSBndWFyZCBvbmx5IHdvcmsgZm9yIHRob3NlIHBlcnNpc3RlbnQgbWFwcGVkIG1lbW9yeSB3aGljaCA+PSB0YXJnZXQgcmFuZ2Ugc2l6ZS4gCitib29sIGdldFBhZ2VHdWFyZEVuYWJsZUZsYWcoKQoreworICAgIHN0YXRpYyBib29sIEVuYWJsZVBhZ2VHdWFyZCA9IFBBR0VHVUFSRF9QQUdFR1VBUkRfRU5BQkxFX0RFRkFVTFQ7CisgICAgc3RhdGljIGJvb2wgRmlyc3RUaW1lUnVuID0gdHJ1ZTsKKyAgICBpZiAoRmlyc3RUaW1lUnVuKQorICAgIHsKKyAgICAgICAgRmlyc3RUaW1lUnVuID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGNoYXIgKmVudl9wYWdlZ3VhcmQgPSB2a3RyYWNlX2dldF9nbG9iYWxfdmFyKFBBR0VHVUFSRF9QQUdFR1VBUkRfRU5BQkxFX0VOVik7CisgICAgICAgIGlmIChlbnZfcGFnZWd1YXJkKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZW52dmFsdWU7CisgICAgICAgICAgICBpZiAoc3NjYW5mKGVudl9wYWdlZ3VhcmQsICIlZCIsICZlbnZ2YWx1ZSkgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZW52dmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFbmFibGVQYWdlR3VhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbnZfdGFyZ2V0X3JhbmdlX3NpemUgPSB2a3RyYWNlX2dldF9nbG9iYWxfdmFyKFBBR0VHVUFSRF9QQUdFR1VBUkRfVEFSR0VUX1JBTkdFX1NJWkVfRU5WKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudl90YXJnZXRfcmFuZ2Vfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVmtEZXZpY2VTaXplIHJhbmdlc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoZW52X3RhcmdldF9yYW5nZV9zaXplLCAiJWxsdSIsICZyYW5nZXNpemUpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlc2l6ZSA+IFBBR0VHVUFSRF9QQUdFR1VBUkRfVEFSR0VUX1JBTkdFX1NJWkVfTUlOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3BhZ2VndWFyZF90YXJnZXRfcmFuZ2Vfc2l6ZShyYW5nZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFbmFibGVQYWdlR3VhcmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVuYWJsZVBhZ2VHdWFyZDsKK30KKwordm9pZCBzZXRQYWdlR3VhcmRFeGNlcHRpb25IYW5kbGVyKCkKK3sKKyAgICB2a3RyYWNlX3NlbV93YWl0KHJlZl9hbW91bnRfc2VtX2lkKTsKKyAgICBpZiAoIU9QVEhhbmRsZXIpCisgICAgeworICAgICAgICBPUFRIYW5kbGVyID0gQWRkVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKDEsIFBhZ2VHdWFyZEV4Y2VwdGlvbkhhbmRsZXIpOworICAgICAgICBPUFRIYW5kbGVyUmVmQW1vdW50ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgT1BUSGFuZGxlclJlZkFtb3VudCsrOworICAgIH0KKyAgICB2a3RyYWNlX3NlbV9wb3N0KHJlZl9hbW91bnRfc2VtX2lkKTsKK30KKwordm9pZCByZW1vdmVQYWdlR3VhcmRFeGNlcHRpb25IYW5kbGVyKCkKK3sKKyAgICB2a3RyYWNlX3NlbV93YWl0KHJlZl9hbW91bnRfc2VtX2lkKTsKKyAgICBpZiAoT1BUSGFuZGxlcikKKyAgICB7CisgICAgICAgIGlmIChPUFRIYW5kbGVyUmVmQW1vdW50KQorICAgICAgICB7CisgICAgICAgICAgICBPUFRIYW5kbGVyUmVmQW1vdW50LS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFPUFRIYW5kbGVyUmVmQW1vdW50KQorICAgICAgICB7CisgICAgICAgICAgICBSZW1vdmVWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoT1BUSGFuZGxlcik7CisgICAgICAgICAgICBPUFRIYW5kbGVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2a3RyYWNlX3NlbV9wb3N0KHJlZl9hbW91bnRfc2VtX2lkKTsKK30KKworc2l6ZV90IHBhZ2VndWFyZEdldEFkanVzdGVkU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICBzaXplX3QgcGFnZXNpemUgPSBwYWdlZ3VhcmRHZXRTeXN0ZW1QYWdlU2l6ZSgpOworICAgIGlmIChzaXplICUgcGFnZXNpemUpCisgICAgeworICAgICAgICBzaXplID0gc2l6ZSAtIChzaXplICUgcGFnZXNpemUpICsgcGFnZXNpemU7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCisvL3BhZ2UgZ3VhcmQgb25seSB3b3JrIGZvciB2aXJ0dWFsIG1lbW9yeSwgcmVhbCBtZW1vcnkgbm8gcGFnZSBjb25jZXB0Lgordm9pZCogcGFnZWd1YXJkQWxsb2NhdGVNZW1vcnkoc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCogcE1lbW9yeSA9IG51bGxwdHI7CisKKyAgICBpZiAoc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgICAgcE1lbW9yeSA9IChQQllURSlWaXJ0dWFsQWxsb2MobnVsbHB0ciwgcGFnZWd1YXJkR2V0QWRqdXN0ZWRTaXplKCBzaXplKSwgTUVNX1JFU0VSVkUgfCBNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSk7CisgICAgfQorCisgICAgcmV0dXJuIHBNZW1vcnk7Cit9CisKK3ZvaWQgcGFnZWd1YXJkRnJlZU1lbW9yeSh2b2lkKiBwTWVtb3J5KQoreworICAgIGlmIChwTWVtb3J5KQorICAgIHsKKyAgICAgICAgVmlydHVhbEZyZWUocE1lbW9yeSwgMCwgTUVNX1JFTEVBU0UpOworICAgIH0KK30KKworRFdPUkQgcGFnZWd1YXJkR2V0U3lzdGVtUGFnZVNpemUoKQoreworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpCisgICAgcmV0dXJuIDB4MTAwMDsKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisgICAgU1lTVEVNX0lORk8gc1N5c0luZm87CisgICAgR2V0U3lzdGVtSW5mbygmc1N5c0luZm8pOworICAgIHJldHVybiBzU3lzSW5mby5kd1BhZ2VTaXplOworI2VuZGlmCit9CisKK3ZvaWQgc2V0RmxhZ1RvdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc1NwZWNpYWwoUEJZVEUgcE9QVFBhY2thZ2VEYXRhKQoreworICAgIFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8gKnBDaGFuZ2VkSW5mb0FycmF5ID0gKFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8gKilwT1BUUGFja2FnZURhdGE7CisgICAgcENoYW5nZWRJbmZvQXJyYXlbMF0ucmVzZXJ2ZTAgPSBwQ2hhbmdlZEluZm9BcnJheVswXS5yZXNlcnZlMCB8IFBBR0VHVUFSRF9TUEVDSUFMX0ZPUk1BVF9QQUNLRVRfRk9SX1ZLRkxVU0hNQVBQRURNRU1PUllSQU5HRVM7Cit9CisKK1BhZ2VHdWFyZENhcHR1cmUmIGdldFBhZ2VHdWFyZENvbnRyb2xJbnN0YW5jZSgpCit7CisgICAgc3RhdGljIFBhZ2VHdWFyZENhcHR1cmUgT1BUQ29udHJvbDsKKyAgICByZXR1cm4gT1BUQ29udHJvbDsKK30KKwordm9pZCBmbHVzaFRhcmdldENoYW5nZWRNYXBwZWRNZW1vcnkoTFBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgVGFyZ2V0TWFwcGVkTWVtb3J5LCB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzRnVuYyBwRnVuYywgVmtNYXBwZWRNZW1vcnlSYW5nZSogIHBNZW1vcnlSYW5nZXMpCit7CisgICAgYm9vbCBuZXdNZW1vcnlSYW5nZXNJbnNpZGUgPSAocE1lbW9yeVJhbmdlcyA9PSBudWxscHRyKTsKKyAgICBpZiAobmV3TWVtb3J5UmFuZ2VzSW5zaWRlKQorICAgIHsKKyAgICAgICAgcE1lbW9yeVJhbmdlcyA9IG5ldyBWa01hcHBlZE1lbW9yeVJhbmdlWzFdOworICAgICAgICBhc3NlcnQocE1lbW9yeVJhbmdlcyk7CisgICAgfQorICAgIHBNZW1vcnlSYW5nZXNbMF0ubWVtb3J5ID0gVGFyZ2V0TWFwcGVkTWVtb3J5LT5nZXRNYXBwZWRNZW1vcnkoKTsKKyAgICBwTWVtb3J5UmFuZ2VzWzBdLm9mZnNldCA9IFRhcmdldE1hcHBlZE1lbW9yeS0+Z2V0TWFwcGVkT2Zmc2V0KCk7CisgICAgcE1lbW9yeVJhbmdlc1swXS5wTmV4dCA9IG51bGxwdHI7CisgICAgcE1lbW9yeVJhbmdlc1swXS5zaXplID0gVGFyZ2V0TWFwcGVkTWVtb3J5LT5nZXRNYXBwZWRTaXplKCk7CisgICAgcE1lbW9yeVJhbmdlc1swXS5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01BUFBFRF9NRU1PUllfUkFOR0U7CisgICAgKCpwRnVuYykoVGFyZ2V0TWFwcGVkTWVtb3J5LT5nZXRNYXBwZWREZXZpY2UoKSwgMSwgcE1lbW9yeVJhbmdlcyk7CisgICAgaWYgKG5ld01lbW9yeVJhbmdlc0luc2lkZSkKKyAgICB7CisgICAgICAgIGRlbGV0ZVtdIHBNZW1vcnlSYW5nZXM7CisgICAgfQorfQorCit2b2lkIGZsdXNoQWxsQ2hhbmdlZE1hcHBlZE1lbW9yeSh2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzRnVuYyBwRnVuYykKK3sKKyAgICBMUFBhZ2VHdWFyZE1hcHBlZE1lbW9yeSBwTWFwcGVkTWVtb3J5VGVtcDsKKyAgICB1aW50NjRfdCBhbW91bnQgPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5nZXRNYXBNZW1vcnkoKS5zaXplKCk7CisgICAgaWYgKGFtb3VudCkKKyAgICB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgVmtNYXBwZWRNZW1vcnlSYW5nZSogIHBNZW1vcnlSYW5nZXMgPSBuZXcgVmtNYXBwZWRNZW1vcnlSYW5nZVsxXTsvL2Ftb3VudAorICAgICAgICBmb3IgKHN0ZDo6dW5vcmRlcmVkX21hcDwgVmtEZXZpY2VNZW1vcnksIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeSA+OjppdGVyYXRvciBpdCA9IGdldFBhZ2VHdWFyZENvbnRyb2xJbnN0YW5jZSgpLmdldE1hcE1lbW9yeSgpLmJlZ2luKCk7IGl0ICE9IGdldFBhZ2VHdWFyZENvbnRyb2xJbnN0YW5jZSgpLmdldE1hcE1lbW9yeSgpLmVuZCgpOyBpdCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFwcGVkTWVtb3J5VGVtcCA9ICYoaXQtPnNlY29uZCk7CisgICAgICAgICAgICBmbHVzaFRhcmdldENoYW5nZWRNYXBwZWRNZW1vcnkocE1hcHBlZE1lbW9yeVRlbXAsIHBGdW5jLCBwTWVtb3J5UmFuZ2VzKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBwTWVtb3J5UmFuZ2VzOworICAgIH0KK30KKwordm9pZCByZXNldEFsbFJlYWRGbGFnQW5kUGFnZUd1YXJkKCkKK3sKKyAgICBMUFBhZ2VHdWFyZE1hcHBlZE1lbW9yeSBwTWFwcGVkTWVtb3J5VGVtcDsKKyAgICB1aW50NjRfdCBhbW91bnQgPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5nZXRNYXBNZW1vcnkoKS5zaXplKCk7CisgICAgaWYgKGFtb3VudCkKKyAgICB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChzdGQ6OnVub3JkZXJlZF9tYXA8IFZrRGV2aWNlTWVtb3J5LCBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgPjo6aXRlcmF0b3IgaXQgPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5nZXRNYXBNZW1vcnkoKS5iZWdpbigpOyBpdCAhPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5nZXRNYXBNZW1vcnkoKS5lbmQoKTsgaXQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcE1hcHBlZE1lbW9yeVRlbXAgPSAmKGl0LT5zZWNvbmQpOworICAgICAgICAgICAgcE1hcHBlZE1lbW9yeVRlbXAtPnJlc2V0TWVtb3J5T2JqZWN0QWxsUmVhZEZsYWdBbmRQYWdlR3VhcmQoKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLy9wYWdlIGd1YXJkIGhhbmRsZXIKK0xPTkcgV0lOQVBJIFBhZ2VHdWFyZEV4Y2VwdGlvbkhhbmRsZXIoUEVYQ0VQVElPTl9QT0lOVEVSUyBFeGNlcHRpb25JbmZvKQoreworICAgIExPTkcgcmVzdWx0Q29kZSA9IEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7CisgICAgcGFnZWd1YXJkRW50ZXIoKTsKKyAgICBpZiAoRXhjZXB0aW9uSW5mby0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlID09IFNUQVRVU19HVUFSRF9QQUdFX1ZJT0xBVElPTikKKyAgICB7CisgICAgICAgIFZrRGV2aWNlU2l6ZSBPZmZzZXRPZkFkZHI7CisgICAgICAgIFBCWVRFIHBCbG9jazsKKyAgICAgICAgVmtEZXZpY2VTaXplIEJsb2NrU2l6ZTsKKyAgICAgICAgUEJZVEUgYWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEJZVEU+KEV4Y2VwdGlvbkluZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uSW5mb3JtYXRpb25bMV0pOworICAgICAgICBib29sIGJXcml0ZSA9IEV4Y2VwdGlvbkluZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uSW5mb3JtYXRpb25bMF07CisgICAgICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IHBNYXBwZWRNZW0gPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5maW5kTWFwcGVkTWVtb3J5T2JqZWN0KGFkZHIsICZPZmZzZXRPZkFkZHIsICZwQmxvY2ssICZCbG9ja1NpemUpOworICAgICAgICBpZiAocE1hcHBlZE1lbSkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgaW5kZXggPSBwTWFwcGVkTWVtLT5nZXRJbmRleE9mQ2hhbmdlZEJsb2NrQnlBZGRyKGFkZHIpOworICAgICAgICAgICAgaWYgKGJXcml0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFwcGVkTWVtLT5zZXRNYXBwZWRCbG9ja0NoYW5nZWQoaW5kZXgsIHRydWUsIEJMT0NLX0ZMQUdfQVJSQVlfQ0hBTkdFRCk7CisgICAgICAgICAgICAgICAgcmVzdWx0Q29kZSA9IEVYQ0VQVElPTl9DT05USU5VRV9FWEVDVVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisKKyNpZm5kZWYgUEFHRUdVQVJEX0FERF9QQUdFR1VBUkRfT05fUkVBTF9NQVBQRURfTUVNT1JZCisgICAgICAgICAgICAgICAgdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5KHBCbG9jaywgcE1hcHBlZE1lbS0+Z2V0UmVhbE1hcHBlZERhdGFQb2ludGVyKCkgKyBPZmZzZXRPZkFkZHIgLSBPZmZzZXRPZkFkZHIgJSBCbG9ja1NpemUsIHBNYXBwZWRNZW0tPmdldE1hcHBlZEJsb2NrU2l6ZShpbmRleCkpOworICAgICAgICAgICAgICAgIHBNYXBwZWRNZW0tPnNldE1hcHBlZEJsb2NrQ2hhbmdlZChpbmRleCwgdHJ1ZSwgQkxPQ0tfRkxBR19BUlJBWV9SRUFEKTsKKworICAgICAgICAgICAgICAgIHJlc3VsdENvZGUgPSBFWENFUFRJT05fQ09OVElOVUVfRVhFQ1VUSU9OOworI2Vsc2UKKyAgICAgICAgICAgICAgICBwTWFwcGVkTWVtLT5zZXRNYXBwZWRCbG9ja0NoYW5nZWQoaW5kZXgsIHRydWUpOworICAgICAgICAgICAgICAgIHJlc3VsdENvZGUgPSBFWENFUFRJT05fQ09OVElOVUVfRVhFQ1VUSU9OOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcGFnZWd1YXJkRXhpdCgpOworICAgIHJldHVybiByZXN1bHRDb2RlOworfQorCisvL1RoZSBmdW5jdGlvbiBzb3VyY2UgY29kZSBpcyBtb2RpZmllZCBmcm9tIF9fSE9PS0VEX3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMKKy8vZm9yIGNvaGVyZW50IG1hcCwgbmVlZCB0aGlzIGZ1bmN0aW9uIHRvIGR1bXAgZGF0YSBzbyBzaW11bGF0ZSB0YXJnZXQgYXBwbGljYXRpb24gd3JpdGUgZGF0YSB3aGVuIHBsYXliYWNrLgorVmtSZXN1bHQgdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc1dpdGhvdXRBUElDYWxsKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMpCit7CisgICAgVmtSZXN1bHQgcmVzdWx0ID0gVktfU1VDQ0VTUzsKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgc2l6ZV90IHJhbmdlc1NpemUgPSAwOworICAgIHNpemVfdCBkYXRhU2l6ZSA9IDA7CisgICAgdWludDMyX3QgaXRlcjsKKyAgICBwYWNrZXRfdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyogcFBhY2tldCA9IG51bGxwdHI7CisKKyNpZmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKyAgICBQQllURSAqcHBQYWNrYWdlRGF0YSA9IG5ldyBQQllURVttZW1vcnlSYW5nZUNvdW50XTsKKyAgICBib29sIGJPUFRUYXJnZXRXaXRob3V0Q2hhbmdlID0gZ2V0UGFnZUd1YXJkQ29udHJvbEluc3RhbmNlKCkudmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc1BhZ2VHdWFyZEhhbmRsZShkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMsIHBwUGFja2FnZURhdGEpOy8vdGhlIHBhY2tldCBpcyBub3QgbmVlZGVkIGlmIG5vIGFueSBjaGFuZ2Ugb24gZGF0YSBvZiBhbGwgcmFuZ2VzCisgICAgaWYgKGJPUFRUYXJnZXRXaXRob3V0Q2hhbmdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGZpbmQgb3V0IGhvdyBtdWNoIG1lbW9yeSBpcyBpbiB0aGUgcmFuZ2VzCisgICAgZm9yIChpdGVyID0gMDsgaXRlciA8IG1lbW9yeVJhbmdlQ291bnQ7IGl0ZXIrKykKKyAgICB7CisgICAgICAgIFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBSYW5nZSA9IChWa01hcHBlZE1lbW9yeVJhbmdlKikmcE1lbW9yeVJhbmdlc1tpdGVyXTsKKyAgICAgICAgcmFuZ2VzU2l6ZSArPSB2a19zaXplX3ZrbWFwcGVkbWVtb3J5cmFuZ2UocFJhbmdlKTsKKyAgICAgICAgZGF0YVNpemUgKz0gKHNpemVfdClwUmFuZ2UtPnNpemU7CisgICAgfQorI2lmZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgIGRhdGFTaXplID0gZ2V0UGFnZUd1YXJkQ29udHJvbEluc3RhbmNlKCkuZ2V0QUxMQ2hhbmdlZFBhY2thZ2VTaXplSW5NYXBwZWRNZW1vcnkoZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCBwTWVtb3J5UmFuZ2VzLCBwcFBhY2thZ2VEYXRhKTsKKyNlbmRpZgorICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcywgcmFuZ2VzU2l6ZSArIHNpemVvZih2b2lkKikqbWVtb3J5UmFuZ2VDb3VudCArIGRhdGFTaXplKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhwSGVhZGVyKTsKKworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBNZW1vcnlSYW5nZXMpLCByYW5nZXNTaXplLCBwTWVtb3J5UmFuZ2VzKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wTWVtb3J5UmFuZ2VzKSk7CisKKyAgICAvLyBpbnNlcnQgaW50byBwYWNrZXQgdGhlIGRhdGEgdGhhdCB3YXMgd3JpdHRlbiBieSBDUFUgYmV0d2VlbiB0aGUgdmtNYXBNZW1vcnkgY2FsbCBhbmQgaGVyZQorICAgIC8vIGNyZWF0ZSBhIHRlbXBvcmFyeSBsb2NhbCBwcERhdGEgYXJyYXkgYW5kIGFkZCBpdCB0byB0aGUgcGFja2V0ICh0byByZXNlcnZlIHRoZSBzcGFjZSBmb3IgdGhlIGFycmF5KQorICAgIHZvaWQqKiBwcFRtcERhdGEgPSAodm9pZCAqKiltYWxsb2MobWVtb3J5UmFuZ2VDb3VudCAqIHNpemVvZih2b2lkKikpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YSksIHNpemVvZih2b2lkKikqbWVtb3J5UmFuZ2VDb3VudCwgcHBUbXBEYXRhKTsKKyAgICBmcmVlKHBwVG1wRGF0YSk7CisKKyAgICAvLyBub3cgdGhlIGFjdHVhbCBtZW1vcnkKKyAgICB2a3RyYWNlX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oJmdfbWVtSW5mb0xvY2spOworICAgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBtZW1vcnlSYW5nZUNvdW50OyBpdGVyKyspCisgICAgeworICAgICAgICBWa01hcHBlZE1lbW9yeVJhbmdlKiBwUmFuZ2UgPSAoVmtNYXBwZWRNZW1vcnlSYW5nZSopJnBNZW1vcnlSYW5nZXNbaXRlcl07CisgICAgICAgIFZLQWxsb2NJbmZvKiBwRW50cnkgPSBmaW5kX21lbV9pbmZvX2VudHJ5KHBSYW5nZS0+bWVtb3J5KTsKKworICAgICAgICBpZiAocEVudHJ5ICE9IG51bGxwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChwRW50cnktPmhhbmRsZSA9PSBwUmFuZ2UtPm1lbW9yeSk7CisgICAgICAgICAgICBhc3NlcnQocEVudHJ5LT50b3RhbFNpemUgPj0gKHBSYW5nZS0+c2l6ZSArIHBSYW5nZS0+b2Zmc2V0KSk7CisgICAgICAgICAgICBhc3NlcnQocEVudHJ5LT50b3RhbFNpemUgPj0gcFJhbmdlLT5zaXplKTsKKyAgICAgICAgICAgIGFzc2VydChwUmFuZ2UtPm9mZnNldCA+PSBwRW50cnktPnJhbmdlT2Zmc2V0ICYmIChwUmFuZ2UtPm9mZnNldCArIHBSYW5nZS0+c2l6ZSkgPD0gKHBFbnRyeS0+cmFuZ2VPZmZzZXQgKyBwRW50cnktPnJhbmdlU2l6ZSkpOworI2lmZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgICAgICAgICAgTFBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgcE9QVE1lbW9yeVRlbXAgPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5maW5kTWFwcGVkTWVtb3J5T2JqZWN0KGRldmljZSwgcFJhbmdlKTsKKyAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBPUFRQYWNrYWdlU2l6ZVRlbXAgPSAwOworICAgICAgICAgICAgaWYgKHBPUFRNZW1vcnlUZW1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBCWVRFIHBPUFREYXRhVGVtcCA9IHBPUFRNZW1vcnlUZW1wLT5nZXRDaGFuZ2VkRGF0YVBhY2thZ2UoJk9QVFBhY2thZ2VTaXplVGVtcCk7CisgICAgICAgICAgICAgICAgc2V0RmxhZ1RvdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc1NwZWNpYWwocE9QVERhdGFUZW1wKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wcERhdGFbaXRlcl0pLCBPUFRQYWNrYWdlU2l6ZVRlbXAsIHBPUFREYXRhVGVtcCk7CisgICAgICAgICAgICAgICAgcE9QVE1lbW9yeVRlbXAtPmNsZWFyQ2hhbmdlZERhdGFQYWNrYWdlKCk7CisgICAgICAgICAgICAgICAgcE9QVE1lbW9yeVRlbXAtPnJlc2V0TWVtb3J5T2JqZWN0QWxsQ2hhbmdlZEZsYWdBbmRQYWdlR3VhcmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQQllURSBwT1BURGF0YVRlbXAgPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5nZXRDaGFuZ2VkRGF0YVBhY2thZ2VPdXRPZk1hcChwcFBhY2thZ2VEYXRhLCBpdGVyLCAmT1BUUGFja2FnZVNpemVUZW1wKTsKKyAgICAgICAgICAgICAgICBzZXRGbGFnVG92a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzU3BlY2lhbChwT1BURGF0YVRlbXApOworICAgICAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YVtpdGVyXSksIE9QVFBhY2thZ2VTaXplVGVtcCwgcE9QVERhdGFUZW1wKTsKKyAgICAgICAgICAgICAgICBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5jbGVhckNoYW5nZWREYXRhUGFja2FnZU91dE9mTWFwKHBwUGFja2FnZURhdGEsIGl0ZXIpOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YVtpdGVyXSksIHBSYW5nZS0+c2l6ZSwgcEVudHJ5LT5wRGF0YSArIHBSYW5nZS0+b2Zmc2V0KTsKKyNlbmRpZgorICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cHBEYXRhW2l0ZXJdKSk7CisgICAgICAgICAgICBwRW50cnktPmRpZEZsdXNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBjb3B5IGFwcCBtZW1vcnkgaW50byB0cmFjZSBwYWNrZXQgKGlkeCA9ICV1KSBvbiB2a0ZsdXNoZWRNYXBwZWRNZW1vcnlSYW5nZXMiLCBwSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKyAgICBkZWxldGVbXSBwcFBhY2thZ2VEYXRhOworI2VuZGlmCisgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnX21lbUluZm9Mb2NrKTsKKworICAgIC8vIG5vdyBmaW5hbGl6ZSB0aGUgcHBEYXRhIGFycmF5IHNpbmNlIGl0IGlzIGRvbmUgYmVpbmcgdXBkYXRlZAorICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YSkpOworCisgICAgLy9yZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMoZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCBwTWVtb3J5UmFuZ2VzKTsKKyAgICB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZShwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5kZXZpY2UgPSBkZXZpY2U7CisgICAgcFBhY2tldC0+bWVtb3J5UmFuZ2VDb3VudCA9IG1lbW9yeVJhbmdlQ291bnQ7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworCisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisvL09QVCBlbmQKKyNlbHNlCisKKyN1bmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKworI2VuZGlmLy9wYWdlIGd1YXJkIHNvbHV0aW9uIGZvciB3aW5kb3dzCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VndWFyZC5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl9wYWdlZ3VhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjFkMDlkCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl9wYWdlZ3VhcmQuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE2IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vICBPcHRpbWl6YXRpb24gYnkgdXNpbmcgcGFnZS1ndWFyZCBmb3Igc3BlZWQgdXAgY2FwdHVyZSBhbmQgY2FwdHVyZSBwZXJzaXN0ZW50IG1hcHBlZCBtZW1vcnkKKy8vCisvLyAgQmFja2dyb3VuZDoKKy8vCisvLyAgICAgVGhlIHNwZWVkIGlzIGV4dHJlbWVseSBzbG93IHdoZW4gdXNlIHZrdHJhY2UgdG8gY2FwdHVyZSBET09NNC4gSXQgdG9vayBvdmVyIGhhbGYgYSBkYXkgYW5kIDkwMEcgb2YgdHJhY2UgZm9yIGEgY2FwdHVyZSBmcm9tIGJlZ2lubmluZyB0byB0aGUgZ2FtZSBtZW51LgorLy8gICAgIFRoZSByZWFzb24gdGhhdCBjYXVzZWQgc3VjaCBzbG93IGNhcHR1cmUgaXMgRE9PTSB1cGRhdGVzIGEgYmlnIG1hcHBlZCBtZW1vcnkob3ZlciA2N00pIGZyZXF1ZW50bHksIHZrdHJhY2UgY29waWVzIHRoaXMgbWVtb3J5IGJsb2NrIHRvIGhhcmRkcml2ZSB3aGVuIERPT00gY2FsbHMgdmtGbHVzaG1hcHBlZE1lbW9yeSB0byB1cGRhdGUgaXQgZXZlcnkgdGltZS4KKy8vICAgICBIZXJlIHdlIHVzZSBwYWdlIGd1YXJkIHRvIHJlY29yZCB3aGljaCBwYWdlIG9mIGJpZyBtZW1vcnkgYmxvY2sgaGFzIGJlZW4gY2hhbmdlZCBhbmQgb25seSBzYXZlIHRob3NlIGNoYW5nZWQgcGFnZXMsIGl0IG1ha2UgdGhlIGNhcHR1cmUgdGltZSByZWR1Y2UgdG8gcm91bmQgMTUgbWludXRlcywgdGhlIHRyYWNlIGZpbGUgc2l6ZSBpcyByb3VuZCA0MEcsIAorLy8gICAgIFRoZSBQbGF5YmFjayB0aW1lIGZvciB0aGVzZSB0cmFjZSBmaWxlIGlzIHJvdW5kIDcgbWludXRlcyhvbiBXaW4xMC9BTURGdXJ5LzMyR1JhbS9JNSBzeXN0ZW0pLgorLy8KKy8vICAgICBUaGUgcGFnZSBndWFyZCBtZXRob2QgYWxzbyBoYXMgYmVlbiB0ZXN0ZWQgb2sgZm9yIGNhcHR1cmUvcGxheWJhY2sgU2FzY2hhV2lsbGVtcyhKdWx5MjApIGFwcGxpY2F0aW9ucy4gVGVzdCBzeXN0ZW06ICBDUFU6IEFNRCBGWC05NTkwLCBHUFU6IFI5IDIwMCBTZXJpZXMsIFJBTTogMTYgR0IsIERyaXZlcjogQ3JpbXNvbiBQdWJsaWMgRHJpdmVyIDE2LjcuMy4KKy8vCisvLyAgUGFnZSBndWFyZCBwcm9jZXNzOgorLy8KKy8vICAgICAxLiBUaGUgdGFyZ2V0IGFwcCBjYWxsIG1hcCBidWZmZXIgYW5kIGdldCBhIG1hcHBlZCBtZW1vcnkgcG9pbnRlcihmb3IgZXhhbXBsZSBwTWVtUmVhbCkuCisvLworLy8gICAgIDIuIFRoZSBjYXB0dXJlciB0aGVuIGFsbG9jYXRlcyBhIGR1cGxpY2F0ZWQgbWVtb3J5IG9mIGF0IGxlYXN0IHRoZSBzYW1lIHNpemUoZm9yIGV4YW1wbGUgcE1lbUNvcHkpLiBDb3BpZXMgYWxsIGRhdGEgZnJvbSBwTWVtUmVhbCB0byBwTWVtQ29weQorLy8KKy8vICAgICAzLiBUaGUgY2FwdHVyZXIgYWRkcyBwYWdlIGd1YXJkIHRvIHBNZW1Db3B5IGZvciBldmVyeSBwYWdlLlRoZW4gcmV0dXJucyB0aGUgcE1lbUNvcHkobm90IHBNZW1SZWFsKSB0byB0aGUgdGFyZ2V0IGFwcC4KKy8vCisvLyAgICAgNC4gV2hlbiB0aGUgdGFyZ2V0IGFwcCB1c2VzIHBNZW1Db3B5IHRvIHdyaXRlLCBwYWdlIGd1YXJkIHdpbGwgYmUgdHJpZ2dlcmVkIGFuZCBwYWdlIGd1YXJkIGhhbmRsZXIgd2lsbCByZWNvcmRzIHdoaWNoIHBhZ2UgaGFzIGJlZW4gY2hhbmdlZC4KKy8vCisvLyAgICAgNS4gV2hlbiB0aGUgdGFyZ2V0IGFwcCB1c2VzIHBNZW1Db3B5IHRvIHJlYWQgZGF0YSwgcGFnZSBndWFyZCB3aWxsIGJlIHRyaWdnZXJlZCBhbmQgcGFnZSBndWFyZCBoYW5kbGVyIHJlY29yZHMgd2hpY2ggcGFnZSB0aGUgdGFyZ2V0IGFwcCB3YW50cyB0byByZWFkLiBBbmQgb25seSBjb3B5IHRoYXQgcGFnZSBmcm9tIHJlYWwgbWFwcGVkIG1lbW9yeSB0byBjb3BpZWQgbWVtb3J5IHNvIGFmdGVyIHBhZ2UgZ3VhcmQgZXhjZXB0aW9uLCB0YXJnZXQgYXBwIHdpbGwgcmVhZCByaWdodCBkYXRhLgorLy8KKy8vICAgICA2LiBXaGVuIHRoZSB0YXJnZXQgYXBwIGNhbGxzIENQVS0+R1BVIHN5bmNocm9uaXphdGlvbih2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIGFuZCBzdWJtaXRzIHF1ZXVlKSwgdGhlIGNhcHR1cmVyIHNhdmVzIGFsbCBjaGFuZ2VkIHBhZ2VzIGFuZCBhbHNvIGNvcGllcyBiYWNrIHRoZXNlIGNoYW5nZWQgcGFnZXMgdG8gcE1lbVJlYWwgZnJvbSBwTWVtQ29weSwgcmVzZXRzIGFsbCBwYWdlIGd1YXJkIHdoaWNoIHRyaWdnZXJlZCBieSB3cml0ZS4KKy8vCisvLyAgICAgNy4gV2hlbiB0aGUgdGFyZ2V0IGFwcCBjYWxscyBHUFUtPkNQVSBzeW5jaHJvbml6YXRpb24odmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLCBhbHNvIGluY2x1ZGUgdmtRdWV1ZVN1Ym1pdCB3aGljaCBpcyBiZWZvcmUgdGhhdCBzeW5jaHJvbml6YXRpb24gaGFwcGVuKSwgY2xlYXIgYWxsIHJlYWQgYXJyYXkgYW5kIHJlc2V0cyBhbGwgcGFnZSBndWFyZCB3aGljaCB0cmlnZ2VyZWQgYnkgcmVhZC4KKy8vCisvLyAgICAgOC4gV2hlbiB0aGUgdGFyZ2V0IGFwcCBjYWxscyB0byB1bm1hcCB0aGUgbWVtb3J5LCB0aGUgY2FwdHVyZXIgc2F2ZXMgYWxsIGNoYW5nZWQgcGFnZXMgdG8gSEQgYW5kIGFsc28gY29waWVzIGJhY2sgdGhlc2UgY2hhbmdlZCBwYWdlcyB0byBwTWVtUmVhbCBmcm9tIHBNZW1Db3B5LiBGaW5hbGx5IHJlbW92ZXMgYWxsIHBhZ2UgZ3VhcmRzIGFuZCBmcmVlcyBwTWVtQ29weS4KKy8vCisvLyAgS25vd24gbGltaXRhdGlvbnM6CisvLworLy8gICAgIDEuIGZvciBhIHBhZ2Ugd2hpY2ggaXMgaW4gbWFwcGVkIG1lbW9yeSwgaWYgdGFyZ2V0IGFwcCBmaXJzdCByZWFkIGl0IGJlZm9yZSB3cml0ZSwgdGhlbiBkbyBHUFUtPkNQVSBzeW5jaHJvbml6YXRpb24gbGlrZSB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzIHRyaWdnZXIgZmx1c2ggY29waWVkIG1hcHBlZCBtZW1vcnkoIHBNZW1Db3B5ICkgdG8gcmVhbCBtYXBwZWQgbWVtb3J5KCBwTWVtUmVhbCApLCB0aGF0IHBhZ2Ugd2lsbCBub3QgYmUgcmVjb3JkZWQgYXMgY2hhbmdlZCBwYWdlLgorLy8KKy8vICAgICAyLiBvbmUgcGFnZSBhY2Nlc3NlZCBieSBhIHRocmVhZCBhbmQgdGhlIGFjY2VzcyBqdXN0IGhhcHBlbiB3aGVuIGFub3RoZXIgdGhyZWFkIGFscmVhZHkgZmluaXNoIGNvcHlpbmcgZGF0ZSB0byByZWFsIG1hcHBlZCBtZW1vcnkgZm9yIHRoYXQgcGFnZSBidXQgaGF2ZW4ndCByZXNldCBwYWdlIGd1YXJkIG9mIHRoYXQgcGFnZSwgdGhhdCBwYWdlIHdpbGwgbm90IGJlIHJlY29yZGVkIGFzIGNoYW5nZWQgcGFnZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2dWxrYW4vdnVsa2FuLmgiCisjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInZrdHJhY2VfY29tbW9uLmgiCisKKyNpbmNsdWRlICJ2a3RyYWNlX2ludGVyY29ubmVjdC5oIgorI2luY2x1ZGUgInZrdHJhY2VfZmlsZWxpa2UuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF91dGlscy5oIgorI2luY2x1ZGUgInZrdHJhY2VfdmtfZXh0cy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ2a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmgiCisKKworI2RlZmluZSBQQUdFR1VBUkRfUEFHRUdVQVJEX0VOQUJMRV9FTlYgIlZLVFJBQ0VfUEFHRUdVQVJEIgorI2RlZmluZSBQQUdFR1VBUkRfUEFHRUdVQVJEX1RBUkdFVF9SQU5HRV9TSVpFX0VOViAiVktUUkFDRV9QQUdFR1VBUkRUQVJHRVRTSVpFIgorCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAvLy8gcGFnZSBndWFyZCBzb2x1dGlvbiBmb3Igd2luZG93cworCitWa0RldmljZVNpemUmIHJlZl90YXJnZXRfcmFuZ2Vfc2l6ZSgpOworYm9vbCBnZXRQYWdlR3VhcmRFbmFibGVGbGFnKCk7Cit2b2lkIHNldFBhZ2VHdWFyZEV4Y2VwdGlvbkhhbmRsZXIoKTsKK3ZvaWQgcmVtb3ZlUGFnZUd1YXJkRXhjZXB0aW9uSGFuZGxlcigpOworc2l6ZV90IHBhZ2VndWFyZEdldEFkanVzdGVkU2l6ZShzaXplX3Qgc2l6ZSk7Cit2b2lkKiBwYWdlZ3VhcmRBbGxvY2F0ZU1lbW9yeShzaXplX3Qgc2l6ZSk7Cit2b2lkIHBhZ2VndWFyZEZyZWVNZW1vcnkodm9pZCogcE1lbW9yeSk7CitEV09SRCBwYWdlZ3VhcmRHZXRTeXN0ZW1QYWdlU2l6ZSgpOworCit2b2lkIHBhZ2VndWFyZEVudGVyKCk7Cit2b2lkIHBhZ2VndWFyZEV4aXQoKTsKKworCit2b2lkIHNldEZsYWdUb3ZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNTcGVjaWFsKFBCWVRFIHBPUFRQYWNrYWdlRGF0YSk7CisKKwordm9pZCBmbHVzaEFsbENoYW5nZWRNYXBwZWRNZW1vcnkodmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlc0Z1bmMgcEZ1bmMpOworCit2b2lkIGZsdXNoVGFyZ2V0Q2hhbmdlZE1hcHBlZE1lbW9yeShMUFBhZ2VHdWFyZE1hcHBlZE1lbW9yeSBUYXJnZXRNYXBwZWRNZW1vcnksIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNGdW5jIHBGdW5jLCBWa01hcHBlZE1lbW9yeVJhbmdlKiAgcE1lbW9yeVJhbmdlcyk7CisKK3ZvaWQgcmVzZXRBbGxSZWFkRmxhZ0FuZFBhZ2VHdWFyZCgpOworCitMT05HIFdJTkFQSSBQYWdlR3VhcmRFeGNlcHRpb25IYW5kbGVyKFBFWENFUFRJT05fUE9JTlRFUlMgRXhjZXB0aW9uSW5mbyk7CisKK1ZrUmVzdWx0IHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNXaXRob3V0QVBJQ2FsbChWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbW9yeVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMpOworCitQYWdlR3VhcmRDYXB0dXJlJiBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKTsKKworLy9wYWdlIGd1YXJkIGZvciB3aW5kb3dzIGVuZAorI2Vsc2UKKworI3VuZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorCisjZW5kaWYvL3BhZ2UgZ3VhcmQgc29sdXRpb24KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZWd1YXJkY2FwdHVyZS5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VndWFyZGNhcHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODRkOWEKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VndWFyZGNhcHR1cmUuY3BwCkBAIC0wLDAgKzEsMzY5IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy9PUFQ6IE9wdGltaXphdGlvbiBieSB1c2luZyBwYWdlLWd1YXJkIGZvciBzcGVlZCB1cCBjYXB0dXJlCisvLyAgICAgVGhlIHNwZWVkIGlzIGV4dHJlbWVseSBzbG93IHdoZW4gdXNlIHZrdHJhY2UgdG8gY2FwdHVyZSBET09NNC4gSXQgdG9vayBvdmVyIGhhbGYgYSBkYXkgYW5kIDkwMEcgb2YgdHJhY2UgZm9yIGEgY2FwdHVyZSBmcm9tIGJlZ2lubmluZyB0byB0aGUgZ2FtZSBtZW51LgorLy8gICAgIFRoZSByZWFzb24gdGhhdCBjYXVzZWQgc3VjaCBzbG93IGNhcHR1cmUgaXMgRE9PTSB1cGRhdGVzIGEgYmlnIG1hcHBlZCBtZW1vcnkob3ZlciA2N00pIGZyZXF1ZW50bHksIHZrdHJhY2UgY29waWVzIHRoaXMgbWVtb3J5IGJsb2NrIHRvIGhhcmRkcml2ZSB3aGVuIERPT00gY2FsbHMgdmtGbHVzaG1hcHBlZE1lbW9yeSB0byB1cGRhdGUgaXQgZXZlcnkgdGltZS4KKy8vICAgICBIZXJlIHdlIHVzZSBwYWdlIGd1YXJkIHRvIHJlY29yZCB3aGljaCBwYWdlIG9mIGJpZyBtZW1vcnkgYmxvY2sgaGFzIGJlZW4gY2hhbmdlZCBhbmQgb25seSBzYXZlIHRob3NlIGNoYW5nZWQgcGFnZXMsIGl0IG1ha2UgdGhlIGNhcHR1cmUgdGltZSByZWR1Y2UgdG8gcm91bmQgMTUgbWludXRlcywgdGhlIHRyYWNlIGZpbGUgc2l6ZSBpcyByb3VuZCA0MEcsIAorLy8gICAgIFRoZSBQbGF5YmFjayB0aW1lIGZvciB0aGVzZSB0cmFjZSBmaWxlIGlzIHJvdW5kIDcgbWludXRlcyhvbiBXaW4xMC9BTURGdXJ5LzMyR1JhbS9JNSBzeXN0ZW0pLgorCisjaW5jbHVkZSAidmt0cmFjZV9wYWdlZ3VhcmRfbWVtb3J5Y29weS5oIgorI2luY2x1ZGUgInZrdHJhY2VfbGliX3BhZ2VzdGF0dXNhcnJheS5oIgorI2luY2x1ZGUgInZrdHJhY2VfbGliX3BhZ2VndWFyZG1hcHBlZG1lbW9yeS5oIgorI2luY2x1ZGUgInZrdHJhY2VfbGliX3BhZ2VndWFyZGNhcHR1cmUuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2xpYl9wYWdlZ3VhcmQuaCIKKworI2lmIGRlZmluZWQoV0lOMzIpIC8vcGFnZSBndWFyZCBzb2x1dGlvbiBmb3Igd2luZG93cworCisKK1BhZ2VHdWFyZENhcHR1cmU6OlBhZ2VHdWFyZENhcHR1cmUoKQoreworICAgIEVtcHR5Q2hhbmdlZEluZm9BcnJheS5vZmZzZXQgPSAwOworICAgIEVtcHR5Q2hhbmdlZEluZm9BcnJheS5sZW5ndGggPSAwOworfQorCitzdGQ6OnVub3JkZXJlZF9tYXA8IFZrRGV2aWNlTWVtb3J5LCBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgPiYgUGFnZUd1YXJkQ2FwdHVyZTo6Z2V0TWFwTWVtb3J5KCkKK3sKKyAgICByZXR1cm4gTWFwTWVtb3J5OworfQorCit2b2lkIFBhZ2VHdWFyZENhcHR1cmU6OnZrTWFwTWVtb3J5UGFnZUd1YXJkSGFuZGxlKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICBWa0RldmljZVNpemUgc2l6ZSwKKyAgICBWa0ZsYWdzIGZsYWdzLAorICAgIHZvaWQqKiBwcERhdGEpCit7CisgICAgUGFnZUd1YXJkTWFwcGVkTWVtb3J5IE9QVG1hcHBlZG1lbTsKKyAgICBpZiAoZ2V0UGFnZUd1YXJkRW5hYmxlRmxhZygpKQorICAgIHsKKyNpZmRlZiBQQUdFR1VBUkRfVEFSR0VUX1JBTkdFX1NJWkVfQ09OVFJPTAorICAgICAgICBpZiAoKHNpemUgPj0gcmVmX3RhcmdldF9yYW5nZV9zaXplKCkpICYmIChzaXplICE9IC0xKSkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBPUFRtYXBwZWRtZW0udmtNYXBNZW1vcnlQYWdlR3VhcmRIYW5kbGUoZGV2aWNlLCBtZW1vcnksIG9mZnNldCwgc2l6ZSwgZmxhZ3MsIHBwRGF0YSk7CisgICAgICAgICAgICBNYXBNZW1vcnlbbWVtb3J5XSA9IE9QVG1hcHBlZG1lbTsKKyAgICAgICAgfQorICAgIH0KKyAgICBNYXBNZW1vcnlQdHJbbWVtb3J5XSA9IChQQllURSkoKnBwRGF0YSk7CisgICAgTWFwTWVtb3J5T2Zmc2V0W21lbW9yeV0gPSBvZmZzZXQ7Cit9CisKK3ZvaWQgUGFnZUd1YXJkQ2FwdHVyZTo6dmtVbm1hcE1lbW9yeVBhZ2VHdWFyZEhhbmRsZShWa0RldmljZSBkZXZpY2UsIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwgdm9pZCoqIE1hcHBlZERhdGEsIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNGdW5jIHBGdW5jKQoreworICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IGxwT1BUTWVtb3J5VGVtcCA9IGZpbmRNYXBwZWRNZW1vcnlPYmplY3QoZGV2aWNlLCBtZW1vcnkpOworICAgIGlmIChscE9QVE1lbW9yeVRlbXApCisgICAgeworICAgICAgICBscE9QVE1lbW9yeVRlbXAtPnZrVW5tYXBNZW1vcnlQYWdlR3VhcmRIYW5kbGUoZGV2aWNlLCBtZW1vcnksIE1hcHBlZERhdGEpOworICAgICAgICBNYXBNZW1vcnkuZXJhc2UobWVtb3J5KTsKKyAgICB9CisgICAgTWFwTWVtb3J5UHRyLmVyYXNlKG1lbW9yeSk7CisgICAgTWFwTWVtb3J5T2Zmc2V0LmVyYXNlKG1lbW9yeSk7Cit9CisKK3ZvaWQqIFBhZ2VHdWFyZENhcHR1cmU6OmdldE1hcHBlZE1lbW9yeVBvaW50ZXIoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnkpCit7CisgICAgcmV0dXJuIE1hcE1lbW9yeVB0clttZW1vcnldOworfQorCitWa0RldmljZVNpemUgUGFnZUd1YXJkQ2FwdHVyZTo6Z2V0TWFwcGVkTWVtb3J5T2Zmc2V0KFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5KQoreworICAgIHJldHVybiBNYXBNZW1vcnlPZmZzZXRbbWVtb3J5XTsKK30KKworLy9yZXR1cm46IGlmIGl0J3MgdGFyZ2V0IG1hcHBlZCBtZW1vcnkgYW5kIG5vIGNoYW5nZSBhdCBhbGw7CisvL1BCWVRFICpwcFBhY2thZ2VEYXRhZm9yT3V0T2ZNYXAsIG11c3QgYmUgYW4gYXJyYXkgaW5jbHVkZSBtZW1vcnlSYW5nZUNvdW50IGVsZW1lbnRzCitib29sIFBhZ2VHdWFyZENhcHR1cmU6OnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNQYWdlR3VhcmRIYW5kbGUoCisgICAgVmtEZXZpY2UgZGV2aWNlLAorICAgIHVpbnQzMl90IG1lbW9yeVJhbmdlQ291bnQsCisgICAgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogcE1lbW9yeVJhbmdlcywKKyAgICBQQllURSAqcHBQYWNrYWdlRGF0YWZvck91dE9mTWFwKQoreworICAgIGJvb2wgaGFuZGxlU3VjY2Vzc2Z1bGx5ID0gZmFsc2UsIGJDaGFuZ2VkID0gZmFsc2U7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPCBWa0RldmljZU1lbW9yeSwgUGFnZUd1YXJkTWFwcGVkTWVtb3J5ID46OmNvbnN0X2l0ZXJhdG9yIG1hcHBlZG1lbV9pdDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWVtb3J5UmFuZ2VDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgVmtNYXBwZWRNZW1vcnlSYW5nZSogcFJhbmdlID0gKFZrTWFwcGVkTWVtb3J5UmFuZ2UqKSZwTWVtb3J5UmFuZ2VzW2ldOworICAgICAgICBzaXplX3QgcmFuZ2VzU2l6ZSA9IChzaXplX3QpcFJhbmdlLT5zaXplOworCisgICAgICAgIHBwUGFja2FnZURhdGFmb3JPdXRPZk1hcFtpXSA9IG51bGxwdHI7CisgICAgICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IGxwT1BUTWVtb3J5VGVtcCA9IGZpbmRNYXBwZWRNZW1vcnlPYmplY3QoZGV2aWNlLCBwUmFuZ2UtPm1lbW9yeSk7CisKKyAgICAgICAgaWYgKGxwT1BUTWVtb3J5VGVtcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBSYW5nZS0+c2l6ZSA9PSBWS19XSE9MRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBSYW5nZS0+c2l6ZSA9IGxwT1BUTWVtb3J5VGVtcC0+Z2V0TWFwcGVkU2l6ZSgpIC0gcFJhbmdlLT5vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobHBPUFRNZW1vcnlUZW1wLT52a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VQYWdlR3VhcmRIYW5kbGUoZGV2aWNlLCBwUmFuZ2UtPm1lbW9yeSwgcFJhbmdlLT5vZmZzZXQsIHBSYW5nZS0+c2l6ZSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYkNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYkNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgVmtEZXZpY2VTaXplIFJlYWxSYW5nZVNpemUgPSBwUmFuZ2UtPnNpemU7CisgICAgICAgICAgICBpZiAoUmVhbFJhbmdlU2l6ZSA9PSBWS19XSE9MRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlYWxSYW5nZVNpemUgPSBwUmFuZ2UtPnNpemU7Ly9oYXZlIHRvIHJlcGxhY2Ugd2l0aCByZWFsIHNpemUsIGhlcmUganVzdCBmb3IgYnJlYWsgcG9pbnQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBwUGFja2FnZURhdGFmb3JPdXRPZk1hcFtpXSA9IChQQllURSlwYWdlZ3VhcmRBbGxvY2F0ZU1lbW9yeShSZWFsUmFuZ2VTaXplICsgMiAqIHNpemVvZihQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvKSk7CisgICAgICAgICAgICBQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvICpwSW5mb1RlbXAgPSAoUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbyAqKXBwUGFja2FnZURhdGFmb3JPdXRPZk1hcFtpXTsKKyAgICAgICAgICAgIHBJbmZvVGVtcFswXS5vZmZzZXQgPSAxOworICAgICAgICAgICAgcEluZm9UZW1wWzBdLmxlbmd0aCA9IChEV09SRClSZWFsUmFuZ2VTaXplOworICAgICAgICAgICAgcEluZm9UZW1wWzBdLnJlc2VydmUwID0gMDsKKyAgICAgICAgICAgIHBJbmZvVGVtcFswXS5yZXNlcnZlMSA9IDA7CisgICAgICAgICAgICBwSW5mb1RlbXBbMV0ub2Zmc2V0ID0gcFJhbmdlLT5vZmZzZXQgLSBnZXRNYXBwZWRNZW1vcnlPZmZzZXQoZGV2aWNlLCBwUmFuZ2UtPm1lbW9yeSk7CisgICAgICAgICAgICBwSW5mb1RlbXBbMV0ubGVuZ3RoID0gKERXT1JEKVJlYWxSYW5nZVNpemU7CisgICAgICAgICAgICBwSW5mb1RlbXBbMV0ucmVzZXJ2ZTAgPSAwOworICAgICAgICAgICAgcEluZm9UZW1wWzFdLnJlc2VydmUxID0gMDsKKyAgICAgICAgICAgIFBCWVRFIHBEYXRhSW5QYWNrYWdlID0gKFBCWVRFKShwSW5mb1RlbXAgKyAyKTsKKyAgICAgICAgICAgIHZvaWQqIHBEYXRhTWFwcGVkID0gZ2V0TWFwcGVkTWVtb3J5UG9pbnRlcihkZXZpY2UsIHBSYW5nZS0+bWVtb3J5KTsKKyAgICAgICAgICAgIHZrdHJhY2VfcGFnZWd1YXJkX21lbWNweShwRGF0YUluUGFja2FnZSwgcmVpbnRlcnByZXRfY2FzdDxQQllURT4ocERhdGFNYXBwZWQpICsgcEluZm9UZW1wWzFdLm9mZnNldCwgUmVhbFJhbmdlU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFiQ2hhbmdlZCkKKyAgICB7CisgICAgICAgIGhhbmRsZVN1Y2Nlc3NmdWxseSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBoYW5kbGVTdWNjZXNzZnVsbHk7Cit9CisKK0xQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IFBhZ2VHdWFyZENhcHR1cmU6OmZpbmRNYXBwZWRNZW1vcnlPYmplY3QoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnkpCit7CisgICAgTFBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgcE1hcHBlZE1lbW9yeU9iamVjdCA9IG51bGxwdHI7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPCBWa0RldmljZU1lbW9yeSwgUGFnZUd1YXJkTWFwcGVkTWVtb3J5ID46OmNvbnN0X2l0ZXJhdG9yIG1hcHBlZG1lbV9pdDsKKyAgICBtYXBwZWRtZW1faXQgPSBNYXBNZW1vcnkuZmluZChtZW1vcnkpOworICAgIGlmIChtYXBwZWRtZW1faXQgIT0gTWFwTWVtb3J5LmVuZCgpKQorICAgIHsKKyAgICAgICAgcE1hcHBlZE1lbW9yeU9iamVjdCA9ICgoUGFnZUd1YXJkTWFwcGVkTWVtb3J5ICopJihtYXBwZWRtZW1faXQtPnNlY29uZCkpOworICAgICAgICBpZiAocE1hcHBlZE1lbW9yeU9iamVjdC0+TWFwcGVkRGV2aWNlICE9IGRldmljZSkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hcHBlZE1lbW9yeU9iamVjdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBNYXBwZWRNZW1vcnlPYmplY3Q7Cit9CisKK0xQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IFBhZ2VHdWFyZENhcHR1cmU6OmZpbmRNYXBwZWRNZW1vcnlPYmplY3QoUEJZVEUgYWRkciwgVmtEZXZpY2VTaXplICpwT2Zmc2V0T2ZBZGRyLCBQQllURSAqcHBCbG9jaywgVmtEZXZpY2VTaXplICpwQmxvY2tTaXplKQoreworICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IHBNYXBwZWRNZW1vcnlPYmplY3QgPSBudWxscHRyOworICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IHBNYXBwZWRNZW1vcnlUZW1wOworICAgIFBCWVRFIFJlYWxNYXBwZWRNZW1vcnlBZGRyID0gbnVsbHB0cjsKKyAgICBQQllURSBwQmxvY2sgPSBudWxscHRyOworICAgIFZrRGV2aWNlU2l6ZSBPZmZzZXRPZkFkZHIgPSAwLCBCbG9ja1NpemUgPSAwOworCisgICAgZm9yIChzdGQ6OnVub3JkZXJlZF9tYXA8IFZrRGV2aWNlTWVtb3J5LCBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgPjo6aXRlcmF0b3IgaXQgPSBNYXBNZW1vcnkuYmVnaW4oKTsgaXQgIT0gTWFwTWVtb3J5LmVuZCgpOyBpdCsrKQorICAgIHsKKyAgICAgICAgcE1hcHBlZE1lbW9yeVRlbXAgPSAmKGl0LT5zZWNvbmQpOworICAgICAgICBpZiAoKGFkZHIgPj0gcE1hcHBlZE1lbW9yeVRlbXAtPnBNYXBwZWREYXRhKSAmJiAoYWRkciA8IChwTWFwcGVkTWVtb3J5VGVtcC0+cE1hcHBlZERhdGEgKyBwTWFwcGVkTWVtb3J5VGVtcC0+TWFwcGVkU2l6ZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFwcGVkTWVtb3J5T2JqZWN0ID0gcE1hcHBlZE1lbW9yeVRlbXA7CisKKyAgICAgICAgICAgIE9mZnNldE9mQWRkciA9IChWa0RldmljZVNpemUpKGFkZHIgLSBwTWFwcGVkTWVtb3J5VGVtcC0+cE1hcHBlZERhdGEpOworICAgICAgICAgICAgQmxvY2tTaXplID0gcE1hcHBlZE1lbW9yeVRlbXAtPlBhZ2VHdWFyZFNpemU7CisgICAgICAgICAgICBwQmxvY2sgPSBhZGRyIC0gT2Zmc2V0T2ZBZGRyICUgQmxvY2tTaXplOworICAgICAgICAgICAgaWYgKHBwQmxvY2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBwQmxvY2sgPSBwQmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcEJsb2NrU2l6ZSA9IEJsb2NrU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwT2Zmc2V0T2ZBZGRyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwT2Zmc2V0T2ZBZGRyID0gT2Zmc2V0T2ZBZGRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwTWFwcGVkTWVtb3J5T2JqZWN0OworfQorCitMUFBhZ2VHdWFyZE1hcHBlZE1lbW9yeSBQYWdlR3VhcmRDYXB0dXJlOjpmaW5kTWFwcGVkTWVtb3J5T2JqZWN0KFZrRGV2aWNlIGRldmljZSwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogcE1lbW9yeVJhbmdlKQoreworICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IHBNYXBwZWRNZW1vcnlPYmplY3QgPSBmaW5kTWFwcGVkTWVtb3J5T2JqZWN0KGRldmljZSwgcE1lbW9yeVJhbmdlLT5tZW1vcnkpOworICAgIHJldHVybiBwTWFwcGVkTWVtb3J5T2JqZWN0OworfQorCisvL2dldCBzaXplIG9mIGFsbCBjaGFuZ2VkIHBhY2thZ2UgaW4gYXJyYXkgb2YgcE1lbW9yeVJhbmdlcworVmtEZXZpY2VTaXplIFBhZ2VHdWFyZENhcHR1cmU6OmdldEFMTENoYW5nZWRQYWNrYWdlU2l6ZUluTWFwcGVkTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogcE1lbW9yeVJhbmdlcywgUEJZVEUgKnBwUGFja2FnZURhdGFmb3JPdXRPZk1hcCkKK3sKKyAgICBWa0RldmljZVNpemUgYWxsQ2hhbmdlZFBhY2thZ2VTaXplID0gMCwgUGFja2FnZVNpemUgPSAwOworICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IHBNYXBwZWRNZW1vcnlUZW1wOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtZW1vcnlSYW5nZUNvdW50OyBpKyspCisgICAgeworICAgICAgICBwTWFwcGVkTWVtb3J5VGVtcCA9IGZpbmRNYXBwZWRNZW1vcnlPYmplY3QoZGV2aWNlLCBwTWVtb3J5UmFuZ2VzICsgaSk7CisgICAgICAgIGlmIChwTWFwcGVkTWVtb3J5VGVtcCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hcHBlZE1lbW9yeVRlbXAtPmdldENoYW5nZWREYXRhUGFja2FnZSgmUGFja2FnZVNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbyAqcEluZm9UZW1wID0gKFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8gKilwcFBhY2thZ2VEYXRhZm9yT3V0T2ZNYXBbaV07CisgICAgICAgICAgICBQYWNrYWdlU2l6ZSA9IHBJbmZvVGVtcC0+bGVuZ3RoICsgMiAqIHNpemVvZihQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBhbGxDaGFuZ2VkUGFja2FnZVNpemUgKz0gUGFja2FnZVNpemU7CisgICAgfQorICAgIHJldHVybiBhbGxDaGFuZ2VkUGFja2FnZVNpemU7Cit9CisKKy8vZ2V0IHB0ciBhbmQgc2l6ZSBvZiBPUFRDaGFuZ2VkRGF0YVBhY2thZ2U7CitQQllURSBQYWdlR3VhcmRDYXB0dXJlOjpnZXRDaGFuZ2VkRGF0YVBhY2thZ2VPdXRPZk1hcChQQllURSAqcHBQYWNrYWdlRGF0YWZvck91dE9mTWFwLCBEV09SRCBkd1JhbmdlSW5kZXgsIFZrRGV2aWNlU2l6ZSAgKnBTaXplKQoreworICAgIFBCWVRFIHBEYXRhUGFja2FnZSA9IChQQllURSlwcFBhY2thZ2VEYXRhZm9yT3V0T2ZNYXBbZHdSYW5nZUluZGV4XTsKKyAgICBQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvICpwSW5mbyA9IChQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvICopcERhdGFQYWNrYWdlOworICAgIGlmIChwU2l6ZSkKKyAgICB7CisgICAgICAgICpwU2l6ZSA9IHNpemVvZihQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvKSAqIDIgKyBwSW5mby0+bGVuZ3RoOworICAgIH0KKyAgICByZXR1cm4gcERhdGFQYWNrYWdlOworfQorCit2b2lkIFBhZ2VHdWFyZENhcHR1cmU6OmNsZWFyQ2hhbmdlZERhdGFQYWNrYWdlT3V0T2ZNYXAoUEJZVEUgKnBwUGFja2FnZURhdGFmb3JPdXRPZk1hcCwgRFdPUkQgZHdSYW5nZUluZGV4KQoreworICAgIHBhZ2VndWFyZEZyZWVNZW1vcnkocHBQYWNrYWdlRGF0YWZvck91dE9mTWFwW2R3UmFuZ2VJbmRleF0pOworICAgIHBwUGFja2FnZURhdGFmb3JPdXRPZk1hcFtkd1JhbmdlSW5kZXhdID0gbnVsbHB0cjsKK30KKworYm9vbCBQYWdlR3VhcmRDYXB0dXJlOjppc0hvc3RXcml0ZUZsYWdTZXRJbk1lbW9yeUJhcnJpZXJzKHVpbnQzMl90ICBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogIHBNZW1vcnlCYXJyaWVycykKK3sKKyAgICBib29sIGZsYWdTZXQgPSBmYWxzZTsKKyAgICBpZiAoKG1lbW9yeUJhcnJpZXJDb3VudCAhPSAwKSAmJiAocE1lbW9yeUJhcnJpZXJzKSkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtZW1vcnlCYXJyaWVyQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBNZW1vcnlCYXJyaWVyc1tpXS5zcmNBY2Nlc3NNYXNrJlZLX0FDQ0VTU19IT1NUX1dSSVRFX0JJVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbGFnU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmxhZ1NldDsKK30KKworYm9vbCBQYWdlR3VhcmRDYXB0dXJlOjppc0hvc3RXcml0ZUZsYWdTZXRJbkJ1ZmZlck1lbW9yeUJhcnJpZXIodWludDMyX3QgIG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgcE1lbW9yeUJhcnJpZXJzKQoreworICAgIGJvb2wgZmxhZ1NldCA9IGZhbHNlOworICAgIGlmICgobWVtb3J5QmFycmllckNvdW50ICE9IDApICYmIChwTWVtb3J5QmFycmllcnMpKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1lbW9yeUJhcnJpZXJDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeUJhcnJpZXJzW2ldLnNyY0FjY2Vzc01hc2smVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsYWdTZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmbGFnU2V0OworfQorCitib29sIFBhZ2VHdWFyZENhcHR1cmU6OmlzSG9zdFdyaXRlRmxhZ1NldEluSW1hZ2VNZW1vcnlCYXJyaWVyKHVpbnQzMl90ICBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgcE1lbW9yeUJhcnJpZXJzKQoreworICAgIGJvb2wgZmxhZ1NldCA9IGZhbHNlOworICAgIGlmICgobWVtb3J5QmFycmllckNvdW50ICE9IDApICYmIChwTWVtb3J5QmFycmllcnMpKQorICAgIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1lbW9yeUJhcnJpZXJDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeUJhcnJpZXJzW2ldLnNyY0FjY2Vzc01hc2smVktfQUNDRVNTX0hPU1RfV1JJVEVfQklUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsYWdTZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmbGFnU2V0OworfQorCitib29sIFBhZ2VHdWFyZENhcHR1cmU6OmlzSG9zdFdyaXRlRmxhZ1NldChWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssIFZrUGlwZWxpbmVTdGFnZUZsYWdzIGRzdFN0YWdlTWFzaywgVmtEZXBlbmRlbmN5RmxhZ3MgIGRlcGVuZGVuY3lGbGFncywKKyAgICB1aW50MzJfdCAgIG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgIGltYWdlTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogIHBJbWFnZU1lbW9yeUJhcnJpZXJzKQoreworICAgIGJvb2wgZmxhZ1NldCA9IGZhbHNlLCBiV3JpdGUgPSBpc0hvc3RXcml0ZUZsYWdTZXRJbk1lbW9yeUJhcnJpZXJzKG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzKSB8fAorICAgICAgICBpc0hvc3RXcml0ZUZsYWdTZXRJbkJ1ZmZlck1lbW9yeUJhcnJpZXIoYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMpIHx8CisgICAgICAgIGlzSG9zdFdyaXRlRmxhZ1NldEluSW1hZ2VNZW1vcnlCYXJyaWVyKGltYWdlTWVtb3J5QmFycmllckNvdW50LCBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisgICAgaWYgKGJXcml0ZSB8fCAoc3JjU3RhZ2VNYXNrJlZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUKSkKKyAgICB7CisgICAgICAgIGZsYWdTZXQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmxhZ1NldDsKK30KKworYm9vbCBQYWdlR3VhcmRDYXB0dXJlOjppc1JlYWR5Rm9ySG9zdFJlYWRJbk1lbW9yeUJhcnJpZXJzKHVpbnQzMl90ICBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrTWVtb3J5QmFycmllciogIHBNZW1vcnlCYXJyaWVycykKK3sKKyAgICBib29sIGlzUmVhZHkgPSBmYWxzZTsKKyAgICBpZiAoKG1lbW9yeUJhcnJpZXJDb3VudCAhPSAwKSAmJiAocE1lbW9yeUJhcnJpZXJzKSkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtZW1vcnlCYXJyaWVyQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBNZW1vcnlCYXJyaWVyc1tpXS5kc3RBY2Nlc3NNYXNrJlZLX0FDQ0VTU19IT1NUX1JFQURfQklUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlzUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpc1JlYWR5OworfQorCitib29sIFBhZ2VHdWFyZENhcHR1cmU6OmlzUmVhZHlGb3JIb3N0UmVhZEluQnVmZmVyTWVtb3J5QmFycmllcih1aW50MzJfdCAgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICBwTWVtb3J5QmFycmllcnMpCit7CisgICAgYm9vbCBpc1JlYWR5ID0gZmFsc2U7CisgICAgaWYgKChtZW1vcnlCYXJyaWVyQ291bnQgIT0gMCkgJiYgKHBNZW1vcnlCYXJyaWVycykpCisgICAgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWVtb3J5QmFycmllckNvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5QmFycmllcnNbaV0uZHN0QWNjZXNzTWFzayZWS19BQ0NFU1NfSE9TVF9SRUFEX0JJVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpc1JlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXNSZWFkeTsKK30KKworYm9vbCBQYWdlR3VhcmRDYXB0dXJlOjppc1JlYWR5Rm9ySG9zdFJlYWRJbkltYWdlTWVtb3J5QmFycmllcih1aW50MzJfdCAgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogIHBNZW1vcnlCYXJyaWVycykKK3sKKyAgICBib29sIGlzUmVhZHkgPSBmYWxzZTsKKyAgICBpZiAoKG1lbW9yeUJhcnJpZXJDb3VudCAhPSAwKSAmJiAocE1lbW9yeUJhcnJpZXJzKSkKKyAgICB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtZW1vcnlCYXJyaWVyQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwTWVtb3J5QmFycmllcnNbaV0uZHN0QWNjZXNzTWFzayZWS19BQ0NFU1NfSE9TVF9SRUFEX0JJVCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNSZWFkeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlzUmVhZHk7Cit9CisKK2Jvb2wgUGFnZUd1YXJkQ2FwdHVyZTo6aXNSZWFkeUZvckhvc3RSZWFkKFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWa0RlcGVuZGVuY3lGbGFncyAgZGVwZW5kZW5jeUZsYWdzLAorICAgIHVpbnQzMl90ICAgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgcE1lbW9yeUJhcnJpZXJzLAorICAgIHVpbnQzMl90ICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgcEltYWdlTWVtb3J5QmFycmllcnMpCit7CisgICAgYm9vbCBpc1JlYWR5ID0gZmFsc2UsIGJSZWFkID0gaXNSZWFkeUZvckhvc3RSZWFkSW5NZW1vcnlCYXJyaWVycyhtZW1vcnlCYXJyaWVyQ291bnQsIHBNZW1vcnlCYXJyaWVycykgfHwKKyAgICAgICAgaXNSZWFkeUZvckhvc3RSZWFkSW5CdWZmZXJNZW1vcnlCYXJyaWVyKGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzKSB8fAorICAgICAgICBpc1JlYWR5Rm9ySG9zdFJlYWRJbkltYWdlTWVtb3J5QmFycmllcihpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIGlmIChiUmVhZCB8fCAoZHN0U3RhZ2VNYXNrJlZLX1BJUEVMSU5FX1NUQUdFX0hPU1RfQklUKSkKKyAgICB7CisgICAgICAgIGlzUmVhZHkgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gaXNSZWFkeTsKK30KKworI2VuZGlmLy9wYWdlIGd1YXJkIHNvbHV0aW9uIGZvciB3aW5kb3dzCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VndWFyZGNhcHR1cmUuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZWd1YXJkY2FwdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTk5M2YKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VndWFyZGNhcHR1cmUuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE2IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCIKKworI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiCisjaW5jbHVkZSAidmt0cmFjZV9maWxlbGlrZS5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmgiCisjaW5jbHVkZSAidmt0cmFjZV92a19leHRzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInZrdHJhY2VfcGFnZWd1YXJkX21lbW9yeWNvcHkuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2xpYl9wYWdlZ3VhcmRtYXBwZWRtZW1vcnkuaCIKKworI2lmIGRlZmluZWQoV0lOMzIpIC8vLyBwYWdlIGd1YXJkIHNvbHV0aW9uIGZvciB3aW5kb3dzCisKKyNkZWZpbmUgUEFHRUdVQVJEX1RBUkdFVF9SQU5HRV9TSVpFX0NPTlRST0wKKworLy9QQUdFR1VBUkRfQUREX1BBR0VHVUFSRF9PTl9SRUFMX01BUFBFRF9NRU1PUlkgaXMgYSBjb21waWxlIGZsYWcgZm9yIGFkZCBwYWdlIGd1YXJkIG9uIHJlYWwgbWFwcGVkIG1lbW9yeS4KKy8vSWYgY29tbWVudCB0aGlzIGZsYWcsIHBhZ2VndWFyZCB3aWxsIGJlIGFkZGVkIG9uIGEgY29weSBvZiBtYXBwZWQgbWVtb3J5LCB3aXRoIHRoZSBmbGFnLCBwYWdlIGd1YXJkIHdpbGwgYmUgYWRkZWQgdG8KKy8vcmVhbCBtYXBwZWQgbWVtb3J5LgorLy9mb3Igc29tZSBoYXJld2FyZSwgYWRkIHRvIG1hcHBlZCBtZW1vcnkgbm90IHRoZSBjb3B5IG9mIGl0IG1heSBub3QgYmUgYWxsb3dlZCwgc28gdHVybiBvbiB0aGlzIGZsYWcganVzdCBmb3IgeW91IGFyZSBhbHJlYWR5IHN1cmUgcGFnZSBndWFyZCBjYW4gd29yayBvbiB0aGF0IGhhcmR3YXJlLgorLy9JZiBhZGQgcGFnZSBndWFyZCB0byB0aGUgY29weSBvZiBtYXBwZWQgbWVtb3J5LCBpdCdzIGFsd2F5cyBhbGxvd2VkIGJ1dCBuZWVkIHRvIGRvIHN5bmNob25pemF0aW9uIGJldHdlZW4gdGhlIG1hcHBlZCBtZW1vcnkgYW5kIGl0cyBjb3B5LgorCisvLyNkZWZpbmUgUEFHRUdVQVJEX0FERF9QQUdFR1VBUkRfT05fUkVBTF9NQVBQRURfTUVNT1JZCisKK3R5cGVkZWYgVmtSZXN1bHQoKnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNGdW5jKShWa0RldmljZSBkZXZpY2UsIHVpbnQzMl90IG1lbW9yeVJhbmdlQ291bnQsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqICBwTWVtb3J5UmFuZ2VzKTsKKwordHlwZWRlZiBjbGFzcyBQYWdlR3VhcmRDYXB0dXJlCit7Citwcml2YXRlOgorICAgIFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8gRW1wdHlDaGFuZ2VkSW5mb0FycmF5OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDwgVmtEZXZpY2VNZW1vcnksIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeSA+IE1hcE1lbW9yeTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8IFZrRGV2aWNlTWVtb3J5LCBQQllURSA+IE1hcE1lbW9yeVB0cjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8IFZrRGV2aWNlTWVtb3J5LCBWa0RldmljZVNpemUgPiBNYXBNZW1vcnlPZmZzZXQ7CitwdWJsaWM6CisKKyAgICBQYWdlR3VhcmRDYXB0dXJlKCk7CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8IFZrRGV2aWNlTWVtb3J5LCBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgPiYgZ2V0TWFwTWVtb3J5KCk7CisKKyAgICB2b2lkIHZrTWFwTWVtb3J5UGFnZUd1YXJkSGFuZGxlKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgVmtGbGFncyBmbGFncywgdm9pZCoqIHBwRGF0YSk7CisKKyAgICB2b2lkIHZrVW5tYXBNZW1vcnlQYWdlR3VhcmRIYW5kbGUoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIHZvaWQqKiBNYXBwZWREYXRhLCB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzRnVuYyBwRnVuYyk7CisKKyAgICB2b2lkKiBnZXRNYXBwZWRNZW1vcnlQb2ludGVyKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5KTsKKworICAgIFZrRGV2aWNlU2l6ZSBQYWdlR3VhcmRDYXB0dXJlOjpnZXRNYXBwZWRNZW1vcnlPZmZzZXQoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnkpOworCisgICAgLy8vIHJldHVybjogaWYgaXQncyB0YXJnZXQgbWFwcGVkIG1lbW9yeSBhbmQgbm8gY2hhbmdlIGF0IGFsbDsKKyAgICAvLy8gUEJZVEUgKnBwUGFja2FnZURhdGFmb3JPdXRPZk1hcCwgbXVzdCBiZSBhbiBhcnJheSBpbmNsdWRlIG1lbW9yeVJhbmdlQ291bnQgZWxlbWVudHMKKyAgICBib29sIHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNQYWdlR3VhcmRIYW5kbGUoVmtEZXZpY2UgZGV2aWNlLCB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LCBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzLCBQQllURSAqcHBQYWNrYWdlRGF0YWZvck91dE9mTWFwKTsKKworICAgIExQUGFnZUd1YXJkTWFwcGVkTWVtb3J5IGZpbmRNYXBwZWRNZW1vcnlPYmplY3QoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnkpOworCisgICAgTFBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgZmluZE1hcHBlZE1lbW9yeU9iamVjdChQQllURSBhZGRyLCBWa0RldmljZVNpemUgKnBPZmZzZXRPZkFkZHIgPSBudWxscHRyLCBQQllURSAqcHBCbG9jayA9IG51bGxwdHIsIFZrRGV2aWNlU2l6ZSAqcEJsb2NrU2l6ZSA9IG51bGxwdHIpOworCisgICAgTFBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgZmluZE1hcHBlZE1lbW9yeU9iamVjdChWa0RldmljZSBkZXZpY2UsIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZSk7CisKKyAgICAvLy8gZ2V0IHNpemUgb2YgYWxsIGNoYW5nZWQgcGFja2FnZSBpbiBhcnJheSBvZiBwTWVtb3J5UmFuZ2VzCisgICAgVmtEZXZpY2VTaXplIGdldEFMTENoYW5nZWRQYWNrYWdlU2l6ZUluTWFwcGVkTWVtb3J5KFZrRGV2aWNlIGRldmljZSwgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwgY29uc3QgVmtNYXBwZWRNZW1vcnlSYW5nZSogcE1lbW9yeVJhbmdlcywgUEJZVEUgKnBwUGFja2FnZURhdGFmb3JPdXRPZk1hcCk7CisKKyAgICAvLy8gZ2V0IHB0ciBhbmQgc2l6ZSBvZiBPUFRDaGFuZ2VkRGF0YVBhY2thZ2U7CisgICAgUEJZVEUgZ2V0Q2hhbmdlZERhdGFQYWNrYWdlT3V0T2ZNYXAoUEJZVEUgKnBwUGFja2FnZURhdGFmb3JPdXRPZk1hcCwgRFdPUkQgZHdSYW5nZUluZGV4LCBWa0RldmljZVNpemUgICpwU2l6ZSk7CisKKyAgICB2b2lkIGNsZWFyQ2hhbmdlZERhdGFQYWNrYWdlT3V0T2ZNYXAoUEJZVEUgKnBwUGFja2FnZURhdGFmb3JPdXRPZk1hcCwgRFdPUkQgZHdSYW5nZUluZGV4KTsKKworICAgIGJvb2wgaXNIb3N0V3JpdGVGbGFnU2V0SW5NZW1vcnlCYXJyaWVycyh1aW50MzJfdCAgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqICBwTWVtb3J5QmFycmllcnMpOworCisgICAgYm9vbCBpc0hvc3RXcml0ZUZsYWdTZXRJbkJ1ZmZlck1lbW9yeUJhcnJpZXIodWludDMyX3QgIG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgcE1lbW9yeUJhcnJpZXJzKTsKKworICAgIGJvb2wgaXNIb3N0V3JpdGVGbGFnU2V0SW5JbWFnZU1lbW9yeUJhcnJpZXIodWludDMyX3QgIG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICBwTWVtb3J5QmFycmllcnMpOworCisgICAgYm9vbCBpc0hvc3RXcml0ZUZsYWdTZXQoVmtQaXBlbGluZVN0YWdlRmxhZ3Mgc3JjU3RhZ2VNYXNrLCBWa1BpcGVsaW5lU3RhZ2VGbGFncyBkc3RTdGFnZU1hc2ssIFZrRGVwZW5kZW5jeUZsYWdzICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgICAgIHVpbnQzMl90ICAgbWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICB1aW50MzJfdCAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgICAgIHVpbnQzMl90ICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIqICBwSW1hZ2VNZW1vcnlCYXJyaWVycyk7CisKKyAgICBib29sIGlzUmVhZHlGb3JIb3N0UmVhZEluTWVtb3J5QmFycmllcnModWludDMyX3QgIG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgcE1lbW9yeUJhcnJpZXJzKTsKKworICAgIGJvb2wgaXNSZWFkeUZvckhvc3RSZWFkSW5CdWZmZXJNZW1vcnlCYXJyaWVyKHVpbnQzMl90ICBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrQnVmZmVyTWVtb3J5QmFycmllciogIHBNZW1vcnlCYXJyaWVycyk7CisKKyAgICBib29sIGlzUmVhZHlGb3JIb3N0UmVhZEluSW1hZ2VNZW1vcnlCYXJyaWVyKHVpbnQzMl90ICBtZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgcE1lbW9yeUJhcnJpZXJzKTsKKworICAgIGJvb2wgaXNSZWFkeUZvckhvc3RSZWFkKFZrUGlwZWxpbmVTdGFnZUZsYWdzIHNyY1N0YWdlTWFzaywgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLCBWa0RlcGVuZGVuY3lGbGFncyAgZGVwZW5kZW5jeUZsYWdzLAorICAgICAgICB1aW50MzJfdCAgIG1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgIHBNZW1vcnlCYXJyaWVycywKKyAgICAgICAgdWludDMyX3QgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLAorICAgICAgICB1aW50MzJfdCAgaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQsIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgcEltYWdlTWVtb3J5QmFycmllcnMpOworCit9IFBhZ2VHdWFyZENhcHR1cmU7CisvL3BhZ2UgZ3VhcmQgZm9yIHdpbmRvd3MgZW5kCisKKyNlbmRpZi8vcGFnZSBndWFyZCBzb2x1dGlvbgpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl9wYWdlZ3VhcmRtYXBwZWRtZW1vcnkuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl9wYWdlZ3VhcmRtYXBwZWRtZW1vcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjJjM2EKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VndWFyZG1hcHBlZG1lbW9yeS5jcHAKQEAgLTAsMCArMSw1MTggQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvL09QVDogT3B0aW1pemF0aW9uIGJ5IHVzaW5nIHBhZ2UtZ3VhcmQgZm9yIHNwZWVkIHVwIGNhcHR1cmUKKy8vICAgICBUaGUgc3BlZWQgaXMgZXh0cmVtZWx5IHNsb3cgd2hlbiB1c2Ugdmt0cmFjZSB0byBjYXB0dXJlIERPT000LiBJdCB0b29rIG92ZXIgaGFsZiBhIGRheSBhbmQgOTAwRyBvZiB0cmFjZSBmb3IgYSBjYXB0dXJlIGZyb20gYmVnaW5uaW5nIHRvIHRoZSBnYW1lIG1lbnUuCisvLyAgICAgVGhlIHJlYXNvbiB0aGF0IGNhdXNlZCBzdWNoIHNsb3cgY2FwdHVyZSBpcyBET09NIHVwZGF0ZXMgYSBiaWcgbWFwcGVkIG1lbW9yeShvdmVyIDY3TSkgZnJlcXVlbnRseSwgdmt0cmFjZSBjb3BpZXMgdGhpcyBtZW1vcnkgYmxvY2sgdG8gaGFyZGRyaXZlIHdoZW4gRE9PTSBjYWxscyB2a0ZsdXNobWFwcGVkTWVtb3J5IHRvIHVwZGF0ZSBpdCBldmVyeSB0aW1lLgorLy8gICAgIEhlcmUgd2UgdXNlIHBhZ2UgZ3VhcmQgdG8gcmVjb3JkIHdoaWNoIHBhZ2Ugb2YgYmlnIG1lbW9yeSBibG9jayBoYXMgYmVlbiBjaGFuZ2VkIGFuZCBvbmx5IHNhdmUgdGhvc2UgY2hhbmdlZCBwYWdlcywgaXQgbWFrZSB0aGUgY2FwdHVyZSB0aW1lIHJlZHVjZSB0byByb3VuZCAxNSBtaW51dGVzLCB0aGUgdHJhY2UgZmlsZSBzaXplIGlzIHJvdW5kIDQwRywgCisvLyAgICAgVGhlIFBsYXliYWNrIHRpbWUgZm9yIHRoZXNlIHRyYWNlIGZpbGUgaXMgcm91bmQgNyBtaW51dGVzKG9uIFdpbjEwL0FNREZ1cnkvMzJHUmFtL0k1IHN5c3RlbSkuCisKKyNpbmNsdWRlICJ2a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZWd1YXJkbWFwcGVkbWVtb3J5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZWd1YXJkY2FwdHVyZS5oIgorI2luY2x1ZGUgInZrdHJhY2VfbGliX3BhZ2VndWFyZC5oIgorCisjaWYgZGVmaW5lZChXSU4zMikgLy9wYWdlIGd1YXJkIHNvbHV0aW9uIGZvciB3aW5kb3dzCisKK1ZrRGV2aWNlJiBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OmdldE1hcHBlZERldmljZSgpCit7CisgICAgcmV0dXJuIE1hcHBlZERldmljZTsKK30KKworVmtEZXZpY2VNZW1vcnkmIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6Z2V0TWFwcGVkTWVtb3J5KCkKK3sKKyAgICByZXR1cm4gTWFwcGVkTWVtb3J5OworfQorCitWa0RldmljZVNpemUmIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6Z2V0TWFwcGVkT2Zmc2V0KCkKK3sKKyAgICByZXR1cm4gTWFwcGVkT2Zmc2V0OworfQorCitQQllURSYgUGFnZUd1YXJkTWFwcGVkTWVtb3J5OjpnZXRSZWFsTWFwcGVkRGF0YVBvaW50ZXIoKQoreworICAgIHJldHVybiBwUmVhbE1hcHBlZERhdGE7Cit9CisKK1ZrRGV2aWNlU2l6ZSYgUGFnZUd1YXJkTWFwcGVkTWVtb3J5OjpnZXRNYXBwZWRTaXplKCkKK3sKKyAgICByZXR1cm4gTWFwcGVkU2l6ZTsKK30KKworUGFnZUd1YXJkTWFwcGVkTWVtb3J5OjpQYWdlR3VhcmRNYXBwZWRNZW1vcnkoKQorICAgIDpNYXBwZWREZXZpY2UobnVsbHB0ciksCisgICAgTWFwcGVkTWVtb3J5KChWa0RldmljZU1lbW9yeSludWxscHRyKSwKKyAgICBwUmVhbE1hcHBlZERhdGEobnVsbHB0ciksCisgICAgcENoYW5nZWREYXRhUGFja2FnZShudWxscHRyKSwKKyAgICBwTWFwcGVkRGF0YShudWxscHRyKSwKKyAgICBNYXBwZWRTaXplKDApLAorICAgIHBQYWdlU3RhdHVzKG51bGxwdHIpLAorICAgIEJsb2NrQ29uZmxpY3RFcnJvcihmYWxzZSksCisgICAgUGFnZUd1YXJkU2l6ZShwYWdlZ3VhcmRHZXRTeXN0ZW1QYWdlU2l6ZSgpKSwKKyAgICBQYWdlU2l6ZUxlZnQoMCksCisgICAgUGFnZUd1YXJkQW1vdW50KDApCit7Cit9CisKK1BhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6flBhZ2VHdWFyZE1hcHBlZE1lbW9yeSgpCit7Cit9CisKK2Jvb2wgUGFnZUd1YXJkTWFwcGVkTWVtb3J5Ojppc1VzZUNvcHlGb3JSZWFsTWFwcGVkTWVtb3J5KCkKK3sKKyAgICBib29sIHVzZUNvcHlGb3JSZWFsTWFwcGVkTWVtb3J5ID0gZmFsc2U7CisgICAgaWYgKHBSZWFsTWFwcGVkRGF0YSkKKyAgICB7CisgICAgICAgIHVzZUNvcHlGb3JSZWFsTWFwcGVkTWVtb3J5ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHVzZUNvcHlGb3JSZWFsTWFwcGVkTWVtb3J5OworfQorCitib29sIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6Z2V0Q2hhbmdlZFJhbmdlQnlJbmRleCh1aW50NjRfdCBpbmRleCwgUEJZVEUgKnBBZGRyZXNzLCBWa0RldmljZVNpemUgKnBCbG9ja1NpemUpCit7CisgICAgYm9vbCBpc1ZhbGlkUmVzdWx0ID0gZmFsc2U7CisgICAgaWYgKGluZGV4IDwgUGFnZUd1YXJkQW1vdW50KQorICAgIHsKKyAgICAgICAgaXNWYWxpZFJlc3VsdCA9IHRydWU7CisgICAgICAgIGlmICgoaW5kZXggKyAxKSA9PSBQYWdlR3VhcmRBbW91bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwQWRkcmVzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcEFkZHJlc3MgPSBwTWFwcGVkRGF0YSArIGluZGV4KlBhZ2VHdWFyZFNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcEJsb2NrU2l6ZSA9IChTSVpFX1QpKFBhZ2VTaXplTGVmdCA/IFBhZ2VTaXplTGVmdCA6IFBhZ2VHdWFyZFNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBBZGRyZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwQWRkcmVzcyA9IHBNYXBwZWREYXRhICsgaW5kZXgqUGFnZUd1YXJkU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQmxvY2tTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwQmxvY2tTaXplID0gKFNJWkVfVClQYWdlR3VhcmRTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpc1ZhbGlkUmVzdWx0OworfQorCisvL2lmIHJldHVybiB2YWx1ZSA9PS0xLCBtZWFuIGFkZHIgaXMgb3V0IG9mIHBhZ2UgZ3VhcmQuCit1aW50NjRfdCBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OmdldEluZGV4T2ZDaGFuZ2VkQmxvY2tCeUFkZHIoUEJZVEUgYWRkcikKK3sKKyAgICBpbnQ2NF90IGFkZHJPZmZzZXQgPSBhZGRyIC0gcE1hcHBlZERhdGE7CisgICAgdWludDY0X3QgaW5kZXhPZkNoYW5nZWRCbG9ja0J5QWRkciA9IC0xOworICAgIGlmICgoYWRkck9mZnNldCA+PSAwKSAmJiAoYWRkck9mZnNldCA8IE1hcHBlZFNpemUpKQorICAgIHsKKyAgICAgICAgaW5kZXhPZkNoYW5nZWRCbG9ja0J5QWRkciA9IGFkZHJPZmZzZXQgLyBQYWdlR3VhcmRTaXplOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gaW5kZXhPZkNoYW5nZWRCbG9ja0J5QWRkcjsKK30KKwordm9pZCBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OnNldE1hcHBlZEJsb2NrQ2hhbmdlZCh1aW50NjRfdCBpbmRleCwgYm9vbCBjaGFuZ2VkLCBpbnQgd2hpY2gpCit7CisgICAgaWYgKGluZGV4IDwgUGFnZUd1YXJkQW1vdW50KQorICAgIHsKKyAgICAgICAgc3dpdGNoICh3aGljaCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJMT0NLX0ZMQUdfQVJSQVlfQ0hBTkdFRDoKKyAgICAgICAgICAgIHBQYWdlU3RhdHVzLT5zZXRCbG9ja0NoYW5nZWRBcnJheShpbmRleCwgY2hhbmdlZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJMT0NLX0ZMQUdfQVJSQVlfQ0hBTkdFRF9TTkFQU0hPVDoKKyAgICAgICAgICAgIHBQYWdlU3RhdHVzLT5zZXRCbG9ja0NoYW5nZWRBcnJheVNuYXBzaG90KGluZGV4LCBjaGFuZ2VkKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkxPQ0tfRkxBR19BUlJBWV9SRUFEX1NOQVBTSE9UOgorICAgICAgICAgICAgcFBhZ2VTdGF0dXMtPnNldEJsb2NrUmVhZEFycmF5U25hcHNob3QoaW5kZXgsIGNoYW5nZWQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDovL0JMT0NLX0ZMQUdfQVJSQVlfUkVBRAorICAgICAgICAgICAgcFBhZ2VTdGF0dXMtPnNldEJsb2NrUmVhZEFycmF5KGluZGV4LCBjaGFuZ2VkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6aXNNYXBwZWRCbG9ja0NoYW5nZWQodWludDY0X3QgaW5kZXgsIGludCB3aGljaCkKK3sKKyAgICBib29sIG1hcHBlZEJsb2NrQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChpbmRleCA8IFBhZ2VHdWFyZEFtb3VudCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAod2hpY2gpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCTE9DS19GTEFHX0FSUkFZX0NIQU5HRUQ6CisgICAgICAgICAgICBtYXBwZWRCbG9ja0NoYW5nZWQgPSBwUGFnZVN0YXR1cy0+Z2V0QmxvY2tDaGFuZ2VkQXJyYXkoaW5kZXgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCTE9DS19GTEFHX0FSUkFZX0NIQU5HRURfU05BUFNIT1Q6CisgICAgICAgICAgICBtYXBwZWRCbG9ja0NoYW5nZWQgPSBwUGFnZVN0YXR1cy0+Z2V0QmxvY2tDaGFuZ2VkQXJyYXlTbmFwc2hvdChpbmRleCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJMT0NLX0ZMQUdfQVJSQVlfUkVBRF9TTkFQU0hPVDoKKyAgICAgICAgICAgIG1hcHBlZEJsb2NrQ2hhbmdlZCA9IHBQYWdlU3RhdHVzLT5nZXRCbG9ja1JlYWRBcnJheVNuYXBzaG90KGluZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkxPQ0tfRkxBR19BUlJBWV9SRUFEOgorICAgICAgICAgICAgbWFwcGVkQmxvY2tDaGFuZ2VkID0gcFBhZ2VTdGF0dXMtPmdldEJsb2NrUmVhZEFycmF5KGluZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1hcHBlZEJsb2NrQ2hhbmdlZDsKK30KKwordWludDY0X3QgUGFnZUd1YXJkTWFwcGVkTWVtb3J5OjpnZXRNYXBwZWRCbG9ja1NpemUodWludDY0X3QgaW5kZXgpCit7CisgICAgdWludDY0X3QgbWFwcGVkQmxvY2tTaXplID0gUGFnZUd1YXJkU2l6ZTsKKyAgICBpZiAoKGluZGV4ICsgMSkgPT0gUGFnZUd1YXJkQW1vdW50KQorICAgIHsKKyAgICAgICAgaWYgKFBhZ2VTaXplTGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgbWFwcGVkQmxvY2tTaXplID0gUGFnZVNpemVMZWZ0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXBwZWRCbG9ja1NpemU7Cit9CisKK3VpbnQ2NF90IFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6Z2V0TWFwcGVkQmxvY2tPZmZzZXQodWludDY0X3QgaW5kZXgpCit7CisgICAgdWludDY0X3QgbWFwcGVkQmxvY2tPZmZzZXQgPSAwOworICAgIGlmIChpbmRleCA8IFBhZ2VHdWFyZEFtb3VudCkKKyAgICB7CisgICAgICAgIG1hcHBlZEJsb2NrT2Zmc2V0ID0gaW5kZXgqUGFnZUd1YXJkU2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG1hcHBlZEJsb2NrT2Zmc2V0OworfQorCitib29sIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6aXNOb01hcHBlZEJsb2NrQ2hhbmdlZCgpCit7CisgICAgYm9vbCBub01hcHBlZEJsb2NrQ2hhbmdlZCA9IHRydWU7CisgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IFBhZ2VHdWFyZEFtb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGlzTWFwcGVkQmxvY2tDaGFuZ2VkKGksIEJMT0NLX0ZMQUdfQVJSQVlfQ0hBTkdFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vTWFwcGVkQmxvY2tDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbm9NYXBwZWRCbG9ja0NoYW5nZWQ7Cit9CisKK3ZvaWQgUGFnZUd1YXJkTWFwcGVkTWVtb3J5OjpyZXNldE1lbW9yeU9iamVjdEFsbENoYW5nZWRGbGFnQW5kUGFnZUd1YXJkKCkKK3sKKyAgICBEV09SRCBvbGRQcm90OworICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBQYWdlR3VhcmRBbW91bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChpc01hcHBlZEJsb2NrQ2hhbmdlZChpLCBCTE9DS19GTEFHX0FSUkFZX0NIQU5HRURfU05BUFNIT1QpKQorICAgICAgICB7CisgICAgICAgICAgICBzZXRNYXBwZWRCbG9ja0NoYW5nZWQoaSwgZmFsc2UsIEJMT0NLX0ZMQUdfQVJSQVlfQ0hBTkdFRF9TTkFQU0hPVCk7CisgICAgICAgICAgICBWaXJ0dWFsUHJvdGVjdChwTWFwcGVkRGF0YSArIGkqUGFnZUd1YXJkU2l6ZSwgKFNJWkVfVClnZXRNYXBwZWRCbG9ja1NpemUoaSksIFBBR0VfUkVBRFdSSVRFIHwgUEFHRV9HVUFSRCwgJm9sZFByb3QpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6cmVzZXRNZW1vcnlPYmplY3RBbGxSZWFkRmxhZ0FuZFBhZ2VHdWFyZCgpCit7CisgICAgRFdPUkQgb2xkUHJvdDsKKyAgICBiYWNrdXBCbG9ja1JlYWRBcnJheVNuYXBzaG90KCk7CisgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IFBhZ2VHdWFyZEFtb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGlzTWFwcGVkQmxvY2tDaGFuZ2VkKGksIEJMT0NLX0ZMQUdfQVJSQVlfUkVBRF9TTkFQU0hPVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldE1hcHBlZEJsb2NrQ2hhbmdlZChpLCBmYWxzZSwgQkxPQ0tfRkxBR19BUlJBWV9SRUFEX1NOQVBTSE9UKTsKKyAgICAgICAgICAgIFZpcnR1YWxQcm90ZWN0KHBNYXBwZWREYXRhICsgaSpQYWdlR3VhcmRTaXplLCAoU0laRV9UKWdldE1hcHBlZEJsb2NrU2l6ZShpKSwgUEFHRV9SRUFEV1JJVEUgfCBQQUdFX0dVQVJELCAmb2xkUHJvdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgUGFnZUd1YXJkTWFwcGVkTWVtb3J5OjpzZXRBbGxQYWdlR3VhcmRBbmRGbGFnKGJvb2wgYlNldFBhZ2VHdWFyZCwgYm9vbCBiU2V0QmxvY2tDaGFuZ2VkKQoreworICAgIGJvb2wgc2V0U3VjY2Vzc2Z1bGx5ID0gdHJ1ZTsKKyAgICBEV09SRCBvbGRQcm90LCBkd0VycjsKKyAgICBEV09SRCBkd01lbVNldHRpbmcgPSBiU2V0UGFnZUd1YXJkID8gKFBBR0VfUkVBRFdSSVRFIHwgUEFHRV9HVUFSRCkgOiBQQUdFX1JFQURXUklURTsKKworICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBQYWdlR3VhcmRBbW91bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHNldE1hcHBlZEJsb2NrQ2hhbmdlZChpLCBiU2V0QmxvY2tDaGFuZ2VkLCBCTE9DS19GTEFHX0FSUkFZX0NIQU5HRUQpOworICAgICAgICBpZiAoIVZpcnR1YWxQcm90ZWN0KHBNYXBwZWREYXRhICsgaSpQYWdlR3VhcmRTaXplLCAoU0laRV9UKWdldE1hcHBlZEJsb2NrU2l6ZShpKSwgZHdNZW1TZXR0aW5nLCAmb2xkUHJvdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBzZXRTdWNjZXNzZnVsbHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNldFN1Y2Nlc3NmdWxseTsKK30KKworYm9vbCBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OnZrTWFwTWVtb3J5UGFnZUd1YXJkSGFuZGxlKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgVmtGbGFncyBmbGFncywgdm9pZCoqIHBwRGF0YSkKK3sKKyAgICBib29sIGhhbmRsZVN1Y2Nlc3NmdWxseSA9IHRydWU7CisgICAgTWFwcGVkRGV2aWNlID0gZGV2aWNlOworICAgIE1hcHBlZE1lbW9yeSA9IG1lbW9yeTsKKyAgICBNYXBwZWRPZmZzZXQgPSBvZmZzZXQ7CisjaWZuZGVmIFBBR0VHVUFSRF9BRERfUEFHRUdVQVJEX09OX1JFQUxfTUFQUEVEX01FTU9SWQorICAgIHBSZWFsTWFwcGVkRGF0YSA9IChQQllURSkqcHBEYXRhOworICAgIHBNYXBwZWREYXRhID0gKFBCWVRFKXBhZ2VndWFyZEFsbG9jYXRlTWVtb3J5KHNpemUpOworICAgIHZrdHJhY2VfcGFnZWd1YXJkX21lbWNweShwTWFwcGVkRGF0YSwgcFJlYWxNYXBwZWREYXRhLCBzaXplKTsKKyAgICAqcHBEYXRhID0gcE1hcHBlZERhdGE7CisjZWxzZQorICAgIHBNYXBwZWREYXRhID0gKFBCWVRFKSpwcERhdGE7CisjZW5kaWYKKyAgICBNYXBwZWRTaXplID0gc2l6ZTsKKworICAgIHNldFBhZ2VHdWFyZEV4Y2VwdGlvbkhhbmRsZXIoKTsKKworICAgIFBhZ2VTaXplTGVmdCA9IHNpemUgJSBQYWdlR3VhcmRTaXplOworICAgIFBhZ2VHdWFyZEFtb3VudCA9IHNpemUgLyBQYWdlR3VhcmRTaXplOworICAgIGlmIChQYWdlU2l6ZUxlZnQgIT0gMCkKKyAgICB7CisgICAgICAgIFBhZ2VHdWFyZEFtb3VudCsrOworICAgIH0KKyAgICBwUGFnZVN0YXR1cyA9IG5ldyBQYWdlU3RhdHVzQXJyYXkoUGFnZUd1YXJkQW1vdW50KTsKKyAgICBhc3NlcnQocFBhZ2VTdGF0dXMpOworICAgIGlmICghc2V0QWxsUGFnZUd1YXJkQW5kRmxhZyh0cnVlLCBmYWxzZSkpCisgICAgeworICAgICAgICBoYW5kbGVTdWNjZXNzZnVsbHkgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZVN1Y2Nlc3NmdWxseTsKK30KKwordm9pZCBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OnZrVW5tYXBNZW1vcnlQYWdlR3VhcmRIYW5kbGUoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIHZvaWQqKiBNYXBwZWREYXRhKQoreworICAgIGlmICgobWVtb3J5ID09IE1hcHBlZE1lbW9yeSkgJiYgKGRldmljZSA9PSBNYXBwZWREZXZpY2UpKQorICAgIHsKKyAgICAgICAgc2V0QWxsUGFnZUd1YXJkQW5kRmxhZyhmYWxzZSwgZmFsc2UpOworICAgICAgICByZW1vdmVQYWdlR3VhcmRFeGNlcHRpb25IYW5kbGVyKCk7CisgICAgICAgIGNsZWFyQ2hhbmdlZERhdGFQYWNrYWdlKCk7CisjaWZuZGVmIFBBR0VHVUFSRF9BRERfUEFHRUdVQVJEX09OX1JFQUxfTUFQUEVEX01FTU9SWQorICAgICAgICBpZiAoTWFwcGVkRGF0YSA9PSBudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX3BhZ2VndWFyZF9tZW1jcHkocFJlYWxNYXBwZWREYXRhLCBwTWFwcGVkRGF0YSwgTWFwcGVkU2l6ZSk7CisgICAgICAgICAgICBwYWdlZ3VhcmRGcmVlTWVtb3J5KHBNYXBwZWREYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfcGFnZWd1YXJkX21lbWNweShwUmVhbE1hcHBlZERhdGEsIHBNYXBwZWREYXRhLCBNYXBwZWRTaXplKTsKKyAgICAgICAgICAgICpNYXBwZWREYXRhID0gcE1hcHBlZERhdGE7CisgICAgICAgIH0KKyAgICAgICAgcFJlYWxNYXBwZWREYXRhID0gbnVsbHB0cjsKKyAgICAgICAgcE1hcHBlZERhdGEgPSBudWxscHRyOworI2Vsc2UKKyAgICAgICAgcE1hcHBlZERhdGEgPSBudWxscHRyOworICAgICAgICBpZiAoTWFwcGVkRGF0YSAhPSBudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICAqTWFwcGVkRGF0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBkZWxldGUgcFBhZ2VTdGF0dXM7CisgICAgICAgIHBQYWdlU3RhdHVzID0gbnVsbHB0cjsKKyAgICAgICAgTWFwcGVkTWVtb3J5ID0oVmtEZXZpY2VNZW1vcnkpbnVsbHB0cjsKKyAgICAgICAgTWFwcGVkU2l6ZSA9IDA7CisgICAgfQorfQorCit2b2lkIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6YmFja3VwQmxvY2tDaGFuZ2VkQXJyYXlTbmFwc2hvdCgpCit7CisgICAgcFBhZ2VTdGF0dXMtPmJhY2t1cENoYW5nZWRBcnJheSgpOworfQorCit2b2lkIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6YmFja3VwQmxvY2tSZWFkQXJyYXlTbmFwc2hvdCgpCit7CisgICAgcFBhZ2VTdGF0dXMtPmJhY2t1cFJlYWRBcnJheSgpOworfQorCitEV09SRCBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OmdldENoYW5nZWRCbG9ja0Ftb3VudChpbnQgdXNlV2hpY2gpCit7CisgICAgRFdPUkQgZHdBbW91bnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFnZUd1YXJkQW1vdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAoaXNNYXBwZWRCbG9ja0NoYW5nZWQoaSwgdXNlV2hpY2gpKQorICAgICAgICB7CisgICAgICAgICAgICBkd0Ftb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkd0Ftb3VudDsKK30KKworLy9pcyBSYW5nZUxpbWl0IGNvdmVyIG9yIHBhcnRseSBjb3ZlciBSYW5nZQorYm9vbCBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OmlzUmFuZ2VJbmNsdWRlZChWa0RldmljZVNpemUgUmFuZ2VPZmZzZXRMaW1pdCwgVmtEZXZpY2VTaXplIFJhbmdlU2l6ZUxpbWl0LCBWa0RldmljZVNpemUgUmFuZ2VPZmZzZXQsIFZrRGV2aWNlU2l6ZSBSYW5nZVNpemUpCit7CisgICAgYm9vbCByYW5nZUluY2x1ZGVkID0gZmFsc2U7CisgICAgaWYgKChSYW5nZU9mZnNldExpbWl0IDw9IFJhbmdlT2Zmc2V0KSAmJgorICAgICAgICAoKFJhbmdlT2Zmc2V0TGltaXQgKyBSYW5nZVNpemVMaW1pdCk+UmFuZ2VPZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmFuZ2VJbmNsdWRlZCA9IHRydWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgoUmFuZ2VPZmZzZXRMaW1pdDwoUmFuZ2VPZmZzZXQgKyBSYW5nZVNpemUpKSAmJgorICAgICAgICAgICAgKChSYW5nZU9mZnNldExpbWl0ICsgUmFuZ2VTaXplTGltaXQpID49IChSYW5nZU9mZnNldCArIFJhbmdlU2l6ZSkpKQorICAgICAgICB7CisgICAgICAgICAgICByYW5nZUluY2x1ZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiByYW5nZUluY2x1ZGVkOworfQorCisvL2ZvciBvdXRwdXQsCisvL2lmIHBEYXRhIT1udWxscHRyLHRoZSBwRGF0YSArIE9mZnNldCBpcyBoZWFkIGFkZHIgb2YgYW4gYXJyYXkgb2YgUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbywgdGhlIFswXSBpcyBibG9jayBhbW91bnQsIHNpemUgKHNpemUgZm9yIGFsbCBjaGFuZ2VkIGJsb2NrcyB3aGljaCBhbW91bnQgaXMgYmxvY2sgYW1vdW50KSx0aGVuIGJsb2NrMSBvZmZzZXQsYmxvY2sxIHNpemUuLi4uLCAKKy8vICAgICAgICAgICAgICAgdGhlIGJsb2NrPyBvZmZzZXQgaXMgIHRoaXMgY2hhbmdlZCBibG9jayBvZmZzZXQgdG8gbWFwcGVkIG1lbW9yeSBoZWFkIGFkZHIsdGhlIGFycmF5IGZvbGxvd2VkIGJ5IGNoYW5nZWQgYmxvY2tzIGRhdGEKKy8vCisvL2lmIHBEYXRhPT1udWxscHRyLCBvbmx5IGdldCBzaXplCisvL0RXT1JEICpwZHdTYXZlU2l6ZSwgdGhlIHNpemUgb2YgYWxsIGNoYW5nZWQgYmxvY2tzCisvL0RXT1JEICpwSW5mb1NpemUsIHRoZSBzaXplIG9mIGFycmF5IG9mIFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8KKy8vVmtEZXZpY2VTaXplIFJhbmdlT2Zmc2V0LCBSYW5nZVNpemUsIG9ubHkgY29uc2lkZXIgdGhlIGJsb2NrIHdoaWNoIGlzIGluIHRoZSByYW5nZSB3aGljaCBzdGFydCBmcm9tIFJhbmdlT2Zmc2V0IGFuZCBzaXplIGlzIFJhbmdlU2l6ZSwgaWYgUmFuZ2VPZmZzZXQ8MCwgY29uc2lkZXIgd2hvbGUgbWFwcGVkIG1lbW9yeQorLy9yZXR1cm4gdGhlIGFtb3VudCBvZiBjaGFuZ2VkIGJsb2Nrcy4KK0RXT1JEIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6Z2V0Q2hhbmdlZEJsb2NrSW5mbyhWa0RldmljZVNpemUgUmFuZ2VPZmZzZXQsIFZrRGV2aWNlU2l6ZSBSYW5nZVNpemUsIERXT1JEICpwZHdTYXZlU2l6ZSwgRFdPUkQgKnBJbmZvU2l6ZSwgUEJZVEUgcERhdGEsIERXT1JEIERhdGFPZmZzZXQsIGludCB1c2VXaGljaCkKK3sKKyAgICBEV09SRCBkd0Ftb3VudCA9IGdldENoYW5nZWRCbG9ja0Ftb3VudCh1c2VXaGljaCksIGR3SW5kZXggPSAwLCBvZmZzZXQgPSAwOworICAgIERXT1JEIGluZm9zaXplID0gc2l6ZW9mKFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8pKihkd0Ftb3VudCArIDEpLCBTYXZlU2l6ZSA9IDAsIEN1cnJlbnRCbG9ja1NpemUgPSAwOworICAgIFBCWVRFIHBDaGFuZ2VkRGF0YTsKKyAgICBQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvICpwQ2hhbmdlZEluZm9BcnJheSA9IChQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvICopKHBEYXRhID8gKHBEYXRhICsgRGF0YU9mZnNldCkgOiBudWxscHRyKTsKKworICAgIGlmIChwSW5mb1NpemUpCisgICAgeworICAgICAgICAqcEluZm9TaXplID0gaW5mb3NpemU7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFnZUd1YXJkQW1vdW50OyBpKyspCisgICAgeworICAgICAgICBDdXJyZW50QmxvY2tTaXplID0gZ2V0TWFwcGVkQmxvY2tTaXplKGkpOworICAgICAgICBvZmZzZXQgPSBnZXRNYXBwZWRCbG9ja09mZnNldChpKTsKKyAgICAgICAgaWYgKGlzTWFwcGVkQmxvY2tDaGFuZ2VkKGksIHVzZVdoaWNoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBDaGFuZ2VkSW5mb0FycmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDaGFuZ2VkSW5mb0FycmF5W2R3SW5kZXggKyAxXS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgcENoYW5nZWRJbmZvQXJyYXlbZHdJbmRleCArIDFdLmxlbmd0aCA9IEN1cnJlbnRCbG9ja1NpemU7CisgICAgICAgICAgICAgICAgcENoYW5nZWRJbmZvQXJyYXlbZHdJbmRleCArIDFdLnJlc2VydmUwID0gMDsKKyAgICAgICAgICAgICAgICBwQ2hhbmdlZEluZm9BcnJheVtkd0luZGV4ICsgMV0ucmVzZXJ2ZTEgPSAwOworICAgICAgICAgICAgICAgIHBDaGFuZ2VkRGF0YSA9IHBEYXRhICsgRGF0YU9mZnNldCArIGluZm9zaXplICsgU2F2ZVNpemU7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5KHBDaGFuZ2VkRGF0YSwgcE1hcHBlZERhdGEgKyBvZmZzZXQsIEN1cnJlbnRCbG9ja1NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2F2ZVNpemUgKz0gQ3VycmVudEJsb2NrU2l6ZTsKKyAgICAgICAgICAgIGR3SW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocENoYW5nZWRJbmZvQXJyYXkpCisgICAgeworICAgICAgICBwQ2hhbmdlZEluZm9BcnJheVswXS5vZmZzZXQgPSBkd0Ftb3VudDsKKyAgICAgICAgcENoYW5nZWRJbmZvQXJyYXlbMF0ubGVuZ3RoID0gU2F2ZVNpemU7CisgICAgfQorICAgIGlmIChwZHdTYXZlU2l6ZSkKKyAgICB7CisgICAgICAgICpwZHdTYXZlU2l6ZSA9IFNhdmVTaXplOworICAgIH0KKyAgICByZXR1cm4gZHdBbW91bnQ7Cit9CisKKy8vcmV0dXJuOiBpZiBtZW1vcnkgYWxyZWFkeSBjaGFuZ2VkOworLy8gICAgICAgIGV2ZW5pZiBubyBjaGFuZ2UgdG8gbW1lb3J5LCBpdCB3aWxsIHN0aWxsIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5mbyBhcnJheSB3aGljaCBvbmx5IGluY2x1ZGUgb25lIFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8saXRzICBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgYWxsIDA7CisvLyBWa0RldmljZVNpemUgICAgICAgKnBDaGFuZ2VkU2l6ZSwgdGhlIHNpemUgb2YgYWxsIGNoYW5nZWQgZGF0YSBibG9jaworLy8gVmtEZXZpY2VTaXplICAgICAgICpwRGF0YVBhY2thZ2VTaXplLCBzaXplIGZvciBDaGFuZ2VkRGF0YVBhY2thZ2UKKy8vIFBCWVRFICAgICAgICAgICAgICAqcHBDaGFuZ2VkRGF0YVBhY2thZ2UsIGlzIGFuIGFycmF5IG9mIFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8gKyBhbGwgY2hhbmdlZCBkYXRhLCB0aGUgWzBdIG9mZnNldCBpcyBibG9ja3MgYW1vdW50LCBsZW5ndGggaXMgc2l6ZSBhbW91bnQgb2YgdGhlc2UgYmxvY2tzKG5vdCBpbmNsdWRlIHRoaXMgaW5mbyBhcnJheSksdGhlbiBibG9jazEgb2Zmc2V0LGJsb2NrMSBzaXplLi4uLgorLy8gICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZSBuZWVkZWQgbWVtb3J5IGluIHRoZSBtZXRob2QsIHBwQ2hhbmdlZERhdGFQYWNrYWdlIHBvaW50IHRvIHJldHVybmVkIHBvaW50ZXIsIGlmIHBwQ2hhbmdlZERhdGFQYWNrYWdlPT1udWxsLCBvbmx5IGNhbGN1bGF0ZSBzaXplCitib29sIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6dmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlUGFnZUd1YXJkSGFuZGxlKAorICAgIFZrRGV2aWNlICAgICAgICAgICBkZXZpY2UsCisgICAgVmtEZXZpY2VNZW1vcnkgICAgIG1lbW9yeSwKKyAgICBWa0RldmljZVNpemUgICAgICAgb2Zmc2V0LAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICBzaXplLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAqcENoYW5nZWRTaXplLAorICAgIFZrRGV2aWNlU2l6ZSAgICAgICAqcERhdGFQYWNrYWdlU2l6ZSwKKyAgICBQQllURSAgICAgICAgICAgICAgKnBwQ2hhbmdlZERhdGFQYWNrYWdlKQoreworICAgIGJvb2wgaGFuZGxlU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7CisgICAgRFdPUkQgZHdTYXZlU2l6ZSwgSW5mb1NpemU7CisgICAgYmFja3VwQmxvY2tDaGFuZ2VkQXJyYXlTbmFwc2hvdCgpOworICAgIERXT1JEIGR3QW1vdW50ID0gZ2V0Q2hhbmdlZEJsb2NrSW5mbyhvZmZzZXQsIHNpemUsICZkd1NhdmVTaXplLCAmSW5mb1NpemUsIG51bGxwdHIsIDAsIEJMT0NLX0ZMQUdfQVJSQVlfQ0hBTkdFRF9TTkFQU0hPVCk7IC8vZ2V0IHRoZSBpbmZvIHNpemUgYW5kIHNpemUgb2YgY2hhbmdlZCBibG9ja3MKKyAgICBpZiAoKGR3U2F2ZVNpemUgIT0gMCkpCisgICAgeworICAgICAgICBoYW5kbGVTdWNjZXNzZnVsbHkgPSB0cnVlOworICAgIH0KKyAgICBpZiAocENoYW5nZWRTaXplKQorICAgIHsKKyAgICAgICAgKnBDaGFuZ2VkU2l6ZSA9IGR3U2F2ZVNpemU7CisgICAgfQorICAgIGlmIChwRGF0YVBhY2thZ2VTaXplKQorICAgIHsKKyAgICAgICAgKnBEYXRhUGFja2FnZVNpemUgPSBkd1NhdmVTaXplICsgSW5mb1NpemU7CisgICAgfQorICAgIHBDaGFuZ2VkRGF0YVBhY2thZ2UgPSAoUEJZVEUpcGFnZWd1YXJkQWxsb2NhdGVNZW1vcnkoZHdTYXZlU2l6ZSArIEluZm9TaXplKTsKKyAgICBnZXRDaGFuZ2VkQmxvY2tJbmZvKG9mZnNldCwgc2l6ZSwgJmR3U2F2ZVNpemUsICZJbmZvU2l6ZSwgcENoYW5nZWREYXRhUGFja2FnZSwgMCwgQkxPQ0tfRkxBR19BUlJBWV9DSEFOR0VEX1NOQVBTSE9UKTsKKworICAgIC8vaWYgdXNlIGNvcHkgb2YgcmVhbCBtYXBwZWQgbWVtb3J5LCBuZWVkIGNvcHkgYmFjayB0byByZWFsIG1hcHBlZCBtZW1vcnkKKyNpZm5kZWYgUEFHRUdVQVJEX0FERF9QQUdFR1VBUkRfT05fUkVBTF9NQVBQRURfTUVNT1JZCisgICAgUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbyAqcENoYW5nZWRJbmZvQXJyYXkgPSAoUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbyAqKXBDaGFuZ2VkRGF0YVBhY2thZ2U7CisgICAgaWYgKHBDaGFuZ2VkSW5mb0FycmF5WzBdLmxlbmd0aCkKKyAgICB7CisgICAgICAgIFBCWVRFIHBDaGFuZ2VkRGF0YSA9IChQQllURSlwQ2hhbmdlZERhdGFQYWNrYWdlICsgc2l6ZW9mKFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8pKihwQ2hhbmdlZEluZm9BcnJheVswXS5vZmZzZXQgKyAxKTsKKyAgICAgICAgRFdPUkQgQ3VycmVudE9mZnNldCA9IDA7CisgICAgICAgIGZvciAoRFdPUkQgaSA9IDA7IGkgPCBwQ2hhbmdlZEluZm9BcnJheVswXS5vZmZzZXQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9wYWdlZ3VhcmRfbWVtY3B5KHBSZWFsTWFwcGVkRGF0YSArIHBDaGFuZ2VkSW5mb0FycmF5W2kgKyAxXS5vZmZzZXQsIHBDaGFuZ2VkRGF0YSArIEN1cnJlbnRPZmZzZXQsIChzaXplX3QpcENoYW5nZWRJbmZvQXJyYXlbaSArIDFdLmxlbmd0aCk7CisgICAgICAgICAgICBDdXJyZW50T2Zmc2V0ICs9IHBDaGFuZ2VkSW5mb0FycmF5W2kgKyAxXS5sZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChwcENoYW5nZWREYXRhUGFja2FnZSkKKyAgICB7CisgICAgICAgIC8vcmVnaXN0IHRoZSBjaGFuZ2VkIHBhY2thZ2UKKyAgICAgICAgKnBwQ2hhbmdlZERhdGFQYWNrYWdlID0gcENoYW5nZWREYXRhUGFja2FnZTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZVN1Y2Nlc3NmdWxseTsKK30KKwordm9pZCBQYWdlR3VhcmRNYXBwZWRNZW1vcnk6OmNsZWFyQ2hhbmdlZERhdGFQYWNrYWdlKCkKK3sKKyAgICBpZiAocENoYW5nZWREYXRhUGFja2FnZSkKKyAgICB7CisgICAgICAgIHBhZ2VndWFyZEZyZWVNZW1vcnkocENoYW5nZWREYXRhUGFja2FnZSk7CisgICAgICAgIHBDaGFuZ2VkRGF0YVBhY2thZ2UgPSBudWxscHRyOworICAgIH0KK30KKworLy9nZXQgcHRyIGFuZCBzaXplIG9mIE9QVENoYW5nZWREYXRhUGFja2FnZTsKK1BCWVRFIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTo6Z2V0Q2hhbmdlZERhdGFQYWNrYWdlKFZrRGV2aWNlU2l6ZSAgKnBTaXplKQoreworICAgIFBCWVRFIHBSZXN1bHREYXRhUGFja2FnZSA9IG51bGxwdHI7CisgICAgaWYgKHBDaGFuZ2VkRGF0YVBhY2thZ2UpCisgICAgeworICAgICAgICBwUmVzdWx0RGF0YVBhY2thZ2UgPSBwQ2hhbmdlZERhdGFQYWNrYWdlOworICAgICAgICBQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvICpwQ2hhbmdlZEluZm9BcnJheSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbyAqPihwQ2hhbmdlZERhdGFQYWNrYWdlKTsKKyAgICAgICAgaWYgKHBTaXplKQorICAgICAgICB7CisgICAgICAgICAgICAqcFNpemUgPSBzaXplb2YoUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbykqKHBDaGFuZ2VkSW5mb0FycmF5WzBdLm9mZnNldCArIDEpICsgcENoYW5nZWRJbmZvQXJyYXlbMF0ubGVuZ3RoOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwUmVzdWx0RGF0YVBhY2thZ2U7Cit9CisKKyNlbmRpZi8vcGFnZSBndWFyZCBzb2x1dGlvbiBmb3Igd2luZG93cwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl9wYWdlZ3VhcmRtYXBwZWRtZW1vcnkuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZWd1YXJkbWFwcGVkbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwOTFjYwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZWd1YXJkbWFwcGVkbWVtb3J5LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2dWxrYW4vdnVsa2FuLmgiCisjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInZrdHJhY2VfY29tbW9uLmgiCisKKyNpbmNsdWRlICJ2a3RyYWNlX2ludGVyY29ubmVjdC5oIgorI2luY2x1ZGUgInZrdHJhY2VfZmlsZWxpa2UuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF91dGlscy5oIgorI2luY2x1ZGUgInZrdHJhY2VfdmtfZXh0cy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ2a3RyYWNlX3BhZ2VndWFyZF9tZW1vcnljb3B5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmgiCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAvLy8gcGFnZSBndWFyZCBzb2x1dGlvbiBmb3Igd2luZG93cworCit0eXBlZGVmIGNsYXNzIFBhZ2VHdWFyZE1hcHBlZE1lbW9yeQoreworICAgIGZyaWVuZCBjbGFzcyBQYWdlR3VhcmRDYXB0dXJlOworCitwcml2YXRlOgorICAgIFZrRGV2aWNlIE1hcHBlZERldmljZTsKKyAgICBWa0RldmljZU1lbW9yeSBNYXBwZWRNZW1vcnk7CisgICAgVmtEZXZpY2VTaXplIE1hcHBlZE9mZnNldDsKKyAgICBQQllURSBwTWFwcGVkRGF0YTsgLy8vIHBvaW50IHRvIG1hcHBlZCBtZW1vcnkgaW4gYXBwIHByb2Nlc3MsIGlmIHBSZWFsTWFwcGVkRGF0YT09bnVsbHB0ciwgcE1hcHBlZERhdGEgcG9pbnQgdG8gcmVhbCBtYXBwZWQgbWVtb3J5LAorICAgIC8vLyBpZiBwUmVhbE1hcHBlZERhdGEhPW51bGxwdHIsIHBNYXBwZWREYXRhIHBvaW50IHRvIHJlYWwgbWFwcGVkIG1lbW9yeSBjb3B5LCB0aGUgY29weSBjYW4gYmUgYWRkZWQgcGFnZSBndWFyZAorICAgIFBCWVRFIHBSZWFsTWFwcGVkRGF0YTsgLy8vIHBvaW50IHRvIHJlYWwgbWFwcGVkIG1lbW9yeSBpbiBhcHAgcHJvY2VzcworICAgIFBCWVRFIHBDaGFuZ2VkRGF0YVBhY2thZ2U7IC8vLyBpZiBub3QgbnVsbHB0ciwgaXQgcG9pbnQgdG8gYSBwYWNrYWdlIHdoaWNoIGluY2x1ZGUgY2hhbmdlZCBpbmZvIGFycmF5IGFuZCBjaGFuZ2VkIGRhdGEgYmxvY2ssIGFsbG9jYXRlZCBieSB0aGlzIGNsYXNzCisgICAgVmtEZXZpY2VTaXplIE1hcHBlZFNpemU7IC8vLyB0aGUgc2l6ZSBvZiByYW5nZQorCisgICAgVmtEZXZpY2VTaXplIFBhZ2VHdWFyZFNpemU7IC8vLyBzaXplIGZvciBvbmUgYmxvY2sKKworcHJvdGVjdGVkOgorICAgIFBhZ2VTdGF0dXNBcnJheSAqcFBhZ2VTdGF0dXM7CisgICAgYm9vbCBCbG9ja0NvbmZsaWN0RXJyb3I7IC8vLyByZWNvcmQgaWYgYW55IGJsb2NrIGhhcyBiZWVuIHJlYWQgYnkgaG9zdCBhbmQgYWxzbyB3cml0ZSBieSBob3N0CisgICAgVmtEZXZpY2VTaXplIFBhZ2VTaXplTGVmdDsKKyAgICB1aW50NjRfdCBQYWdlR3VhcmRBbW91bnQ7CisKK3B1YmxpYzoKKyAgICBQYWdlR3VhcmRNYXBwZWRNZW1vcnkoKTsKKyAgICB+UGFnZUd1YXJkTWFwcGVkTWVtb3J5KCk7CisKKyAgICBWa0RldmljZSYgZ2V0TWFwcGVkRGV2aWNlKCk7CisKKyAgICBWa0RldmljZU1lbW9yeSYgZ2V0TWFwcGVkTWVtb3J5KCk7CisKKyAgICBWa0RldmljZVNpemUmIGdldE1hcHBlZE9mZnNldCgpOworCisgICAgUEJZVEUmIGdldFJlYWxNYXBwZWREYXRhUG9pbnRlcigpOyAvLy8gZ2V0IHBvaW50ZXIgdG8gcmVhbCBtYXBwZWQgbWVtb3J5IGluIGFwcCBwcm9jZXNzCisKKyAgICBWa0RldmljZVNpemUmIGdldE1hcHBlZFNpemUoKTsgLy8vIGdldCB0aGUgc2l6ZSBvZiByYW5nZQorCisgICAgYm9vbCBpc1VzZUNvcHlGb3JSZWFsTWFwcGVkTWVtb3J5KCk7CisKKyAgICAvLy8gZ2V0IGhlYWQgYWRkciBhbmQgc2l6ZSBmb3IgYSBibG9jayB3aGljaCBpcyBsb2NhdGVkIGJ5IGEgZ2l2ZW4gaW5kZXgKKyAgICBib29sIGdldENoYW5nZWRSYW5nZUJ5SW5kZXgodWludDY0X3QgaW5kZXgsIFBCWVRFICpwYWRkciwgVmtEZXZpY2VTaXplICpwQmxvY2tTaXplKTsKKworICAgIC8vLyBpZiByZXR1cm4gdmFsdWUgPDAsIG1lYW4gYWRkciBpcyBvdXQgb2YgcGFnZSBndWFyZC4KKyAgICB1aW50NjRfdCBnZXRJbmRleE9mQ2hhbmdlZEJsb2NrQnlBZGRyKFBCWVRFIGFkZHIpOworCisgICAgdm9pZCBzZXRNYXBwZWRCbG9ja0NoYW5nZWQodWludDY0X3QgaW5kZXgsIGJvb2wgYkNoYW5nZWQsIGludCB1c2VXaGljaCk7CisKKyAgICBib29sIGlzTWFwcGVkQmxvY2tDaGFuZ2VkKHVpbnQ2NF90IGluZGV4LCBpbnQgdXNlV2hpY2gpOworCisgICAgdWludDY0X3QgZ2V0TWFwcGVkQmxvY2tTaXplKHVpbnQ2NF90IGluZGV4KTsKKworICAgIHVpbnQ2NF90IGdldE1hcHBlZEJsb2NrT2Zmc2V0KHVpbnQ2NF90IGluZGV4KTsKKworICAgIGJvb2wgaXNOb01hcHBlZEJsb2NrQ2hhbmdlZCgpOworCisgICAgdm9pZCByZXNldE1lbW9yeU9iamVjdEFsbENoYW5nZWRGbGFnQW5kUGFnZUd1YXJkKCk7CisKKyAgICB2b2lkIHJlc2V0TWVtb3J5T2JqZWN0QWxsUmVhZEZsYWdBbmRQYWdlR3VhcmQoKTsKKworICAgIGJvb2wgc2V0QWxsUGFnZUd1YXJkQW5kRmxhZyhib29sIGJTZXRQYWdlR3VhcmQsIGJvb2wgYlNldEJsb2NrQ2hhbmdlZCk7CisKKyAgICBib29sIHZrTWFwTWVtb3J5UGFnZUd1YXJkSGFuZGxlKFZrRGV2aWNlIGRldmljZSwgVmtEZXZpY2VNZW1vcnkgbWVtb3J5LCBWa0RldmljZVNpemUgb2Zmc2V0LCBWa0RldmljZVNpemUgc2l6ZSwgVmtGbGFncyBmbGFncywgdm9pZCoqIHBwRGF0YSk7CisKKyAgICB2b2lkIHZrVW5tYXBNZW1vcnlQYWdlR3VhcmRIYW5kbGUoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIHZvaWQqKiBNYXBwZWREYXRhKTsKKworICAgIHZvaWQgYmFja3VwQmxvY2tDaGFuZ2VkQXJyYXlTbmFwc2hvdCgpOworCisgICAgdm9pZCBiYWNrdXBCbG9ja1JlYWRBcnJheVNuYXBzaG90KCk7CisKKyAgICBEV09SRCBnZXRDaGFuZ2VkQmxvY2tBbW91bnQoaW50IHVzZVdoaWNoKTsKKworICAgIC8vLyBpcyBSYW5nZUxpbWl0IGNvdmVyIG9yIHBhcnRseSBjb3ZlciBSYW5nZQorICAgIGJvb2wgaXNSYW5nZUluY2x1ZGVkKFZrRGV2aWNlU2l6ZSBSYW5nZU9mZnNldExpbWl0LCBWa0RldmljZVNpemUgUmFuZ2VTaXplTGltaXQsIFZrRGV2aWNlU2l6ZSBSYW5nZU9mZnNldCwgVmtEZXZpY2VTaXplIFJhbmdlU2l6ZSk7CisKKyAgICAvLy8gZm9yIG91dHB1dCwKKyAgICAvLy8gaWYgcERhdGEhPW51bGxwdHIsdGhlIHBEYXRhICsgT2Zmc2V0IGlzIGhlYWQgYWRkciBvZiBhbiBhcnJheSBvZiBQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvLCB0aGUgWzBdIGlzIGJsb2NrIGFtb3VudCwgc2l6ZSAoc2l6ZSBmb3IgYWxsIGNoYW5nZWQgYmxvY2tzIHdoaWNoIGFtb3VudCBpcyBibG9jayBhbW91bnQpLHRoZW4gYmxvY2sxIG9mZnNldCxibG9jazEgc2l6ZS4uLi4sIAorICAgIC8vLyAgICAgICAgICAgICAgIHRoZSBibG9jaz8gb2Zmc2V0IGlzICB0aGlzIGNoYW5nZWQgYmxvY2sgb2Zmc2V0IHRvIG1hcHBlZCBtZW1vcnkgaGVhZCBhZGRyLHRoZSBhcnJheSBmb2xsb3dlZCBieSBjaGFuZ2VkIGJsb2NrcyBkYXRhCisgICAgLy8vCisgICAgLy8vIGlmIHBEYXRhPT1udWxscHRyLCBvbmx5IGdldCBzaXplCisgICAgLy8vIERXT1JEICpwZHdTYXZlU2l6ZSwgdGhlIHNpemUgb2YgYWxsIGNoYW5nZWQgYmxvY2tzCisgICAgLy8vIERXT1JEICpwSW5mb1NpemUsIHRoZSBzaXplIG9mIGFycmF5IG9mIFBhZ2VHdWFyZENoYW5nZWRCbG9ja0luZm8KKyAgICAvLy8gVmtEZXZpY2VTaXplIFJhbmdlT2Zmc2V0LCBSYW5nZVNpemUsIG9ubHkgY29uc2lkZXIgdGhlIGJsb2NrIHdoaWNoIGlzIGluIHRoZSByYW5nZSB3aGljaCBzdGFydCBmcm9tIFJhbmdlT2Zmc2V0IGFuZCBzaXplIGlzIFJhbmdlU2l6ZSwgaWYgUmFuZ2VPZmZzZXQ8MCwgY29uc2lkZXIgd2hvbGUgbWFwcGVkIG1lbW9yeQorICAgIC8vLyByZXR1cm4gdGhlIGFtb3VudCBvZiBjaGFuZ2VkIGJsb2Nrcy4KKyAgICBEV09SRCBnZXRDaGFuZ2VkQmxvY2tJbmZvKFZrRGV2aWNlU2l6ZSBSYW5nZU9mZnNldCwgVmtEZXZpY2VTaXplIFJhbmdlU2l6ZSwgRFdPUkQgKnBkd1NhdmVTaXplLCBEV09SRCAqcEluZm9TaXplLCBQQllURSBwRGF0YSwgRFdPUkQgRGF0YU9mZnNldCwgaW50IHVzZVdoaWNoID0gQkxPQ0tfRkxBR19BUlJBWV9DSEFOR0VEKTsKKworICAgIC8vLyByZXR1cm46IGlmIG1lbW9yeSBhbHJlYWR5IGNoYW5nZWQ7CisgICAgLy8vICAgICAgICBldmVuaWYgbm8gY2hhbmdlIHRvIG1tZW9yeSwgaXQgd2lsbCBzdGlsbCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGluZm8gYXJyYXkgd2hpY2ggb25seSBpbmNsdWRlIG9uZSBQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvLGl0cyAgb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGFsbCAwOworICAgIC8vLyBWa0RldmljZVNpemUgICAgICAgKnBDaGFuZ2VkU2l6ZSwgdGhlIHNpemUgb2YgYWxsIGNoYW5nZWQgZGF0YSBibG9jaworICAgIC8vLyBWa0RldmljZVNpemUgICAgICAgKnBEYXRhUGFja2FnZVNpemUsIHNpemUgZm9yIENoYW5nZWREYXRhUGFja2FnZQorICAgIC8vLyBQQllURSAgICAgICAgICAgICAgKnBwQ2hhbmdlZERhdGFQYWNrYWdlLCBpcyBhbiBhcnJheSBvZiBQYWdlR3VhcmRDaGFuZ2VkQmxvY2tJbmZvICsgYWxsIGNoYW5nZWQgZGF0YSwgdGhlIFswXSBvZmZzZXQgaXMgYmxvY2tzIGFtb3VudCwgbGVuZ3RoIGlzIHNpemUgYW1vdW50IG9mIHRoZXNlIGJsb2Nrcyhub3QgaW5jbHVkZSB0aGlzIGluZm8gYXJyYXkpLHRoZW4gYmxvY2sxIG9mZnNldCxibG9jazEgc2l6ZS4uLi4KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZSBuZWVkZWQgbWVtb3J5IGluIHRoZSBtZXRob2QsIHBwQ2hhbmdlZERhdGFQYWNrYWdlIHBvaW50IHRvIHJldHVybmVkIHBvaW50ZXIsIGlmIHBwQ2hhbmdlZERhdGFQYWNrYWdlPT1udWxsLCBvbmx5IGNhbGN1bGF0ZSBzaXplCisgICAgYm9vbCB2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VQYWdlR3VhcmRIYW5kbGUoVmtEZXZpY2UgZGV2aWNlLCBWa0RldmljZU1lbW9yeSBtZW1vcnksIFZrRGV2aWNlU2l6ZSBvZmZzZXQsIFZrRGV2aWNlU2l6ZSBzaXplLCBWa0RldmljZVNpemUgICpwQ2hhbmdlZFNpemUsIFZrRGV2aWNlU2l6ZSAgKnBEYXRhUGFja2FnZVNpemUsIFBCWVRFICAgKnBwQ2hhbmdlZERhdGFQYWNrYWdlKTsKKworICAgIHZvaWQgY2xlYXJDaGFuZ2VkRGF0YVBhY2thZ2UoKTsKKworICAgIC8vLyBnZXQgcHRyIGFuZCBzaXplIG9mIE9QVENoYW5nZWREYXRhUGFja2FnZTsKKyAgICBQQllURSBnZXRDaGFuZ2VkRGF0YVBhY2thZ2UoVmtEZXZpY2VTaXplICAqcFNpemUpOworfSBQYWdlR3VhcmRNYXBwZWRNZW1vcnksICpMUFBhZ2VHdWFyZE1hcHBlZE1lbW9yeTsKKworLy9wYWdlIGd1YXJkIGZvciB3aW5kb3dzIGVuZAorI2VuZGlmLy9wYWdlIGd1YXJkIHNvbHV0aW9uCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VzdGF0dXNhcnJheS5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3BhZ2VzdGF0dXNhcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3Yzg0ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmNwcApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE2IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vT1BUOiBPcHRpbWl6YXRpb24gYnkgdXNpbmcgcGFnZS1ndWFyZCBmb3Igc3BlZWQgdXAgY2FwdHVyZQorLy8gICAgIFRoZSBzcGVlZCBpcyBleHRyZW1lbHkgc2xvdyB3aGVuIHVzZSB2a3RyYWNlIHRvIGNhcHR1cmUgRE9PTTQuIEl0IHRvb2sgb3ZlciBoYWxmIGEgZGF5IGFuZCA5MDBHIG9mIHRyYWNlIGZvciBhIGNhcHR1cmUgZnJvbSBiZWdpbm5pbmcgdG8gdGhlIGdhbWUgbWVudS4KKy8vICAgICBUaGUgcmVhc29uIHRoYXQgY2F1c2VkIHN1Y2ggc2xvdyBjYXB0dXJlIGlzIERPT00gdXBkYXRlcyBhIGJpZyBtYXBwZWQgbWVtb3J5KG92ZXIgNjdNKSBmcmVxdWVudGx5LCB2a3RyYWNlIGNvcGllcyB0aGlzIG1lbW9yeSBibG9jayB0byBoYXJkZHJpdmUgd2hlbiBET09NIGNhbGxzIHZrRmx1c2htYXBwZWRNZW1vcnkgdG8gdXBkYXRlIGl0IGV2ZXJ5IHRpbWUuCisvLyAgICAgSGVyZSB3ZSB1c2UgcGFnZSBndWFyZCB0byByZWNvcmQgd2hpY2ggcGFnZSBvZiBiaWcgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIGNoYW5nZWQgYW5kIG9ubHkgc2F2ZSB0aG9zZSBjaGFuZ2VkIHBhZ2VzLCBpdCBtYWtlIHRoZSBjYXB0dXJlIHRpbWUgcmVkdWNlIHRvIHJvdW5kIDE1IG1pbnV0ZXMsIHRoZSB0cmFjZSBmaWxlIHNpemUgaXMgcm91bmQgNDBHLCAKKy8vICAgICBUaGUgUGxheWJhY2sgdGltZSBmb3IgdGhlc2UgdHJhY2UgZmlsZSBpcyByb3VuZCA3IG1pbnV0ZXMob24gV2luMTAvQU1ERnVyeS8zMkdSYW0vSTUgc3lzdGVtKS4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmgiCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAvL3BhZ2UgZ3VhcmQgc29sdXRpb24gZm9yIHdpbmRvd3MKKworY29uc3QgdWludDY0X3QgUGFnZVN0YXR1c0FycmF5OjpQQUdFX0ZMQUdfQU1PVU5UX1BFUl9CWVRFID0gMTsKK2NvbnN0IHVpbnQ2NF90IFBhZ2VTdGF0dXNBcnJheTo6UEFHRV9OVU1CRVJfRlJPTV9CSVRfU0hJRlQgPSAwOworCitQYWdlU3RhdHVzQXJyYXk6OlBhZ2VTdGF0dXNBcnJheSh1aW50NjRfdCBwYWdlQ291bnQpCit7CisgICAgQnl0ZUNvdW50ID0gKHBhZ2VDb3VudCAlIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpID8gKHBhZ2VDb3VudCAvIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpICsgMSA6IHBhZ2VDb3VudCAvIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEU7CisKKyAgICBwQ2hhbmdlZEFycmF5WzBdID0gbmV3IHVpbnQ4X3RbQnl0ZUNvdW50XTsKKyAgICBhc3NlcnQocENoYW5nZWRBcnJheVswXSk7CisKKyAgICBwQ2hhbmdlZEFycmF5WzFdID0gbmV3IHVpbnQ4X3RbQnl0ZUNvdW50XTsKKyAgICBhc3NlcnQocENoYW5nZWRBcnJheVsxXSk7CisKKyAgICBwUmVhZEFycmF5WzBdID0gbmV3IHVpbnQ4X3RbQnl0ZUNvdW50XTsKKyAgICBhc3NlcnQocFJlYWRBcnJheVswXSk7CisKKyAgICBwUmVhZEFycmF5WzFdID0gbmV3IHVpbnQ4X3RbQnl0ZUNvdW50XTsKKyAgICBhc3NlcnQocFJlYWRBcnJheVsxXSk7CisKKyAgICBhY3RpdmVDaGFuZ2VzQXJyYXkgPSBwQ2hhbmdlZEFycmF5WzBdOworICAgIGNhcHR1cmVkQ2hhbmdlc0FycmF5ID0gcENoYW5nZWRBcnJheVsxXTsKKyAgICBhY3RpdmVSZWFkQXJyYXkgPSBwUmVhZEFycmF5WzBdOworICAgIGNhcHR1cmVkUmVhZEFycmF5ID0gcFJlYWRBcnJheVsxXTsKKworICAgIGNsZWFyQWxsKCk7Cit9CisKK1BhZ2VTdGF0dXNBcnJheTo6flBhZ2VTdGF0dXNBcnJheSgpCit7CisgICAgZGVsZXRlW10gcENoYW5nZWRBcnJheVswXTsKKyAgICBkZWxldGVbXSBwQ2hhbmdlZEFycmF5WzFdOworICAgIGRlbGV0ZVtdIHBSZWFkQXJyYXlbMF07CisgICAgZGVsZXRlW10gcFJlYWRBcnJheVsxXTsKK30KKwordm9pZCBQYWdlU3RhdHVzQXJyYXk6OnRvZ2dsZUNoYW5nZWRBcnJheSgpCit7CisgICAgLy9UT0RPIHVzZSBhdG9taWMgZXhjaGFuZ2UKKyAgICB1aW50OF90ICp0ZW1wQXJyYXkgPSBhY3RpdmVDaGFuZ2VzQXJyYXk7CisgICAgYWN0aXZlQ2hhbmdlc0FycmF5ID0gY2FwdHVyZWRDaGFuZ2VzQXJyYXk7CisgICAgY2FwdHVyZWRDaGFuZ2VzQXJyYXkgPSB0ZW1wQXJyYXk7Cit9CisKK3ZvaWQgUGFnZVN0YXR1c0FycmF5Ojp0b2dnbGVSZWFkQXJyYXkoKQoreworICAgIC8vVE9ETyB1c2UgYXRvbWljIGV4Y2hhbmdlCisgICAgdWludDhfdCAqdGVtcEFycmF5ID0gYWN0aXZlUmVhZEFycmF5OworICAgIGFjdGl2ZVJlYWRBcnJheSA9IGNhcHR1cmVkUmVhZEFycmF5OworICAgIGNhcHR1cmVkUmVhZEFycmF5ID0gdGVtcEFycmF5OworfQorCitib29sIFBhZ2VTdGF0dXNBcnJheTo6Z2V0QmxvY2tDaGFuZ2VkQXJyYXkodWludDY0X3QgaW5kZXgpCit7CisgICAgcmV0dXJuIGFjdGl2ZUNoYW5nZXNBcnJheVtpbmRleCA+PiBQQUdFX05VTUJFUl9GUk9NX0JJVF9TSElGVF0gJiAoMSA8PCAoaW5kZXggJSBQQUdFX0ZMQUdfQU1PVU5UX1BFUl9CWVRFKSk7Cit9CisKK2Jvb2wgUGFnZVN0YXR1c0FycmF5OjpnZXRCbG9ja0NoYW5nZWRBcnJheVNuYXBzaG90KHVpbnQ2NF90IGluZGV4KQoreworICAgIHJldHVybiBjYXB0dXJlZENoYW5nZXNBcnJheVtpbmRleCA+PiBQQUdFX05VTUJFUl9GUk9NX0JJVF9TSElGVF0gJiAoMSA8PCAoaW5kZXggJSBQQUdFX0ZMQUdfQU1PVU5UX1BFUl9CWVRFKSk7Cit9CisKK2Jvb2wgUGFnZVN0YXR1c0FycmF5OjpnZXRCbG9ja1JlYWRBcnJheSh1aW50NjRfdCBpbmRleCkKK3sKKyAgICByZXR1cm4gYWN0aXZlUmVhZEFycmF5W2luZGV4ID4+IFBBR0VfTlVNQkVSX0ZST01fQklUX1NISUZUXSAmICgxIDw8IChpbmRleCAlIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpKTsKK30KKworYm9vbCBQYWdlU3RhdHVzQXJyYXk6OmdldEJsb2NrUmVhZEFycmF5U25hcHNob3QodWludDY0X3QgaW5kZXgpCit7CisgICAgcmV0dXJuIGNhcHR1cmVkUmVhZEFycmF5W2luZGV4ID4+IFBBR0VfTlVNQkVSX0ZST01fQklUX1NISUZUXSAmICgxIDw8IChpbmRleCAlIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpKTsKK30KKwordm9pZCBQYWdlU3RhdHVzQXJyYXk6OnNldEJsb2NrQ2hhbmdlZEFycmF5KHVpbnQ2NF90IGluZGV4LCBib29sIGNoYW5nZWQpCit7CisgICAgaWYgKGNoYW5nZWQpCisgICAgeworICAgICAgICBhY3RpdmVDaGFuZ2VzQXJyYXlbaW5kZXggPj4gUEFHRV9OVU1CRVJfRlJPTV9CSVRfU0hJRlRdIHw9ICgxIDw8IChpbmRleCAlIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYWN0aXZlQ2hhbmdlc0FycmF5W2luZGV4ID4+IFBBR0VfTlVNQkVSX0ZST01fQklUX1NISUZUXSAmPSB+KCh1aW50OF90KSgxIDw8IChpbmRleCAlIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpKSk7CisgICAgfQorfQorCit2b2lkIFBhZ2VTdGF0dXNBcnJheTo6c2V0QmxvY2tDaGFuZ2VkQXJyYXlTbmFwc2hvdCh1aW50NjRfdCBpbmRleCwgYm9vbCBjaGFuZ2VkKQoreworICAgIGlmIChjaGFuZ2VkKQorICAgIHsKKyAgICAgICAgY2FwdHVyZWRDaGFuZ2VzQXJyYXlbaW5kZXggPj4gUEFHRV9OVU1CRVJfRlJPTV9CSVRfU0hJRlRdIHw9ICgxIDw8IChpbmRleCAlIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2FwdHVyZWRDaGFuZ2VzQXJyYXlbaW5kZXggPj4gUEFHRV9OVU1CRVJfRlJPTV9CSVRfU0hJRlRdICY9IH4oKHVpbnQ4X3QpKDEgPDwgKGluZGV4ICUgUEFHRV9GTEFHX0FNT1VOVF9QRVJfQllURSkpKTsKKyAgICB9Cit9CisKK3ZvaWQgUGFnZVN0YXR1c0FycmF5OjpzZXRCbG9ja1JlYWRBcnJheSh1aW50NjRfdCBpbmRleCwgYm9vbCBjaGFuZ2VkKQoreworICAgIGlmIChjaGFuZ2VkKQorICAgIHsKKyAgICAgICAgYWN0aXZlUmVhZEFycmF5W2luZGV4ID4+IFBBR0VfTlVNQkVSX0ZST01fQklUX1NISUZUXSB8PSAoMSA8PCAoaW5kZXggJSBQQUdFX0ZMQUdfQU1PVU5UX1BFUl9CWVRFKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFjdGl2ZVJlYWRBcnJheVtpbmRleCA+PiBQQUdFX05VTUJFUl9GUk9NX0JJVF9TSElGVF0gJj0gfigodWludDhfdCkoMSA8PCAoaW5kZXggJSBQQUdFX0ZMQUdfQU1PVU5UX1BFUl9CWVRFKSkpOworICAgIH0KK30KKwordm9pZCBQYWdlU3RhdHVzQXJyYXk6OnNldEJsb2NrUmVhZEFycmF5U25hcHNob3QodWludDY0X3QgaW5kZXgsIGJvb2wgY2hhbmdlZCkKK3sKKyAgICBpZiAoY2hhbmdlZCkKKyAgICB7CisgICAgICAgIGNhcHR1cmVkUmVhZEFycmF5W2luZGV4ID4+IFBBR0VfTlVNQkVSX0ZST01fQklUX1NISUZUXSB8PSAoMSA8PCAoaW5kZXggJSBQQUdFX0ZMQUdfQU1PVU5UX1BFUl9CWVRFKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNhcHR1cmVkUmVhZEFycmF5W2luZGV4ID4+IFBBR0VfTlVNQkVSX0ZST01fQklUX1NISUZUXSAmPSB+KCh1aW50OF90KSgxIDw8IChpbmRleCAlIFBBR0VfRkxBR19BTU9VTlRfUEVSX0JZVEUpKSk7CisgICAgfQorfQorCit2b2lkIFBhZ2VTdGF0dXNBcnJheTo6YmFja3VwQ2hhbmdlZEFycmF5KCkKK3sKKyAgICB0b2dnbGVDaGFuZ2VkQXJyYXkoKTsKK30KKwordm9pZCBQYWdlU3RhdHVzQXJyYXk6OmJhY2t1cFJlYWRBcnJheSgpCit7CisgICAgdG9nZ2xlUmVhZEFycmF5KCk7Cit9CisKK3ZvaWQgUGFnZVN0YXR1c0FycmF5OjpjbGVhckFsbCgpCit7CisgICAgbWVtc2V0KGFjdGl2ZUNoYW5nZXNBcnJheSwgMCwgQnl0ZUNvdW50KTsKKyAgICBtZW1zZXQoY2FwdHVyZWRDaGFuZ2VzQXJyYXksIDAsIEJ5dGVDb3VudCk7CisgICAgbWVtc2V0KGFjdGl2ZVJlYWRBcnJheSwgMCwgQnl0ZUNvdW50KTsKKyAgICBtZW1zZXQoY2FwdHVyZWRSZWFkQXJyYXksIDAsIEJ5dGVDb3VudCk7Cit9CisKKyNlbmRpZi8vcGFnZSBndWFyZCBzb2x1dGlvbiBmb3Igd2luZG93cwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl9wYWdlc3RhdHVzYXJyYXkuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjOWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV9saWJfcGFnZXN0YXR1c2FycmF5LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE2IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCIKKworI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiCisjaW5jbHVkZSAidmt0cmFjZV9maWxlbGlrZS5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmgiCisjaW5jbHVkZSAidmt0cmFjZV92a19leHRzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAvLy8gcGFnZSBndWFyZCBzb2x1dGlvbiBmb3Igd2luZG93cworCitzdGF0aWMgY29uc3QgaW50IEJMT0NLX0ZMQUdfQVJSQVlfQ0hBTkdFRCA9IDA7CitzdGF0aWMgY29uc3QgaW50ICBCTE9DS19GTEFHX0FSUkFZX0NIQU5HRURfU05BUFNIT1QgPSAxOworc3RhdGljIGNvbnN0IGludCAgQkxPQ0tfRkxBR19BUlJBWV9SRUFEID0gMjsKK3N0YXRpYyBjb25zdCBpbnQgIEJMT0NLX0ZMQUdfQVJSQVlfUkVBRF9TTkFQU0hPVCA9IDM7CisKK3R5cGVkZWYgY2xhc3MgUGFnZVN0YXR1c0FycmF5Cit7CitwdWJsaWM6CisgICAgUGFnZVN0YXR1c0FycmF5KHVpbnQ2NF90IHBhZ2VDb3VudCk7CisgICAgflBhZ2VTdGF0dXNBcnJheSgpOworCisgICAgdm9pZCB0b2dnbGVDaGFuZ2VkQXJyYXkoKTsKKyAgICB2b2lkIHRvZ2dsZVJlYWRBcnJheSgpOworCisgICAgYm9vbCBnZXRCbG9ja0NoYW5nZWRBcnJheSh1aW50NjRfdCBpbmRleCk7CisgICAgYm9vbCBnZXRCbG9ja0NoYW5nZWRBcnJheVNuYXBzaG90KHVpbnQ2NF90IGluZGV4KTsKKyAgICBib29sIGdldEJsb2NrUmVhZEFycmF5KHVpbnQ2NF90IGluZGV4KTsKKyAgICBib29sIGdldEJsb2NrUmVhZEFycmF5U25hcHNob3QodWludDY0X3QgaW5kZXgpOworICAgIHZvaWQgc2V0QmxvY2tDaGFuZ2VkQXJyYXkodWludDY0X3QgaW5kZXgsIGJvb2wgY2hhbmdlZCk7CisgICAgdm9pZCBzZXRCbG9ja0NoYW5nZWRBcnJheVNuYXBzaG90KHVpbnQ2NF90IGluZGV4LCBib29sIGNoYW5nZWQpOworICAgIHZvaWQgc2V0QmxvY2tSZWFkQXJyYXkodWludDY0X3QgaW5kZXgsIGJvb2wgY2hhbmdlZCk7CisgICAgdm9pZCBzZXRCbG9ja1JlYWRBcnJheVNuYXBzaG90KHVpbnQ2NF90IGluZGV4LCBib29sIGNoYW5nZWQpOworICAgIHZvaWQgYmFja3VwQ2hhbmdlZEFycmF5KCk7CisgICAgdm9pZCBiYWNrdXBSZWFkQXJyYXkoKTsKKyAgICB2b2lkIGNsZWFyQWxsKCk7Citwcml2YXRlOgorICAgIGNvbnN0IHN0YXRpYyB1aW50NjRfdCBQQUdFX0ZMQUdfQU1PVU5UX1BFUl9CWVRFOworICAgIGNvbnN0IHN0YXRpYyB1aW50NjRfdCBQQUdFX05VTUJFUl9GUk9NX0JJVF9TSElGVDsKKyAgICB1aW50NjRfdCBCeXRlQ291bnQ7CisgICAgdWludDhfdCAqYWN0aXZlQ2hhbmdlc0FycmF5OworICAgIHVpbnQ4X3QgKmNhcHR1cmVkQ2hhbmdlc0FycmF5OworICAgIHVpbnQ4X3QgKmFjdGl2ZVJlYWRBcnJheTsKKyAgICB1aW50OF90ICpjYXB0dXJlZFJlYWRBcnJheTsKKyAgICB1aW50OF90ICpwQ2hhbmdlZEFycmF5WzJdOyAvLy8gaW5jbHVkZSB0d28gYXJyYXksIG9uZSBmb3IgcGFnZSBndWFyZCBoYW5kbGVyIHRvIHJlY29yZCB3aGljaCBibG9jayBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gdmtNYXAuLiBvciBsYXN0IHRpbWUgdmtGbHVzaC4uLiwgdGhlIG90aGVyIG9uZSBmb3IgZmx1c2ggZGF0YSBhbmQgcmVzZXQgcGFnZWd1YXJkCisgICAgdWludDhfdCAqcFJlYWRBcnJheVsyXTsgLy8vIGluY2x1ZGUgdHdvIGFycmF5LCBvbmUgZm9yIHBhZ2UgZ3VhcmQgaGFuZGxlciB0byByZWNvcmQgd2hpY2ggYmxvY2sgaGFzIGJlZW4gcmVhZCBieSBob3N0IGZyb20gdmtNYXAuLiBvciBsYXN0IHRpbWUgdmtpbnZhbGlkYXRlIG9yIHZrcGlwZWxpbmViYXJyaWVyIHdpdGggc3BlY2lmaWMgcGFyYS4uLiwgdGhlIG90aGVyIG9uZSBmb3IgcmVzZXQgcGFnZSBndWFyZAorfSBQYWdlU3RhdHVzQXJyYXk7CisKKyNlbmRpZi8vcGFnZSBndWFyZCBzb2x1dGlvbgpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl90cmFjZS5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfbGliX3RyYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY1MmMyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX2xpYl90cmFjZS5jcHAKQEAgLTAsMCArMSwyNDU1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICogQXV0aG9yOiBNYXJrIExvYm9kemluc2tpIDxtYXJrQGx1bmFyZy5jb20+CisgKi8KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3ZrLmgiCisjaW5jbHVkZSAidnVsa2FuL3Z1bGthbi5oIgorI2luY2x1ZGUgInZ1bGthbi92a19sYXllci5oIgorI2luY2x1ZGUgInZrdHJhY2VfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2a19kaXNwYXRjaF90YWJsZV9oZWxwZXIuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIgorI2luY2x1ZGUgInZrdHJhY2VfbGliX2hlbHBlcnMuaCIKKworI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiCisjaW5jbHVkZSAidmt0cmFjZV9maWxlbGlrZS5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmgiCisjaW5jbHVkZSAidmt0cmFjZV92a19leHRzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInZrdHJhY2VfcGFnZWd1YXJkX21lbW9yeWNvcHkuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2xpYl9wYWdlc3RhdHVzYXJyYXkuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2xpYl9wYWdlZ3VhcmRtYXBwZWRtZW1vcnkuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2xpYl9wYWdlZ3VhcmRjYXB0dXJlLmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfcGFnZWd1YXJkLmgiCisKKy8vIGRlY2xhcmVkIGFzIGV4dGVybiBpbiB2a3RyYWNlX2xpYl9oZWxwZXJzLmgKK1ZLVFJBQ0VfQ1JJVElDQUxfU0VDVElPTiBnX21lbUluZm9Mb2NrOworVktNZW1JbmZvIGdfbWVtSW5mbyA9IHswLCBOVUxMLCBOVUxMLCAwfTsKKworCitzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9kZXZpY2VfZGF0YSAqPiBnX2RldmljZURhdGFNYXA7CitzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9pbnN0YW5jZV9kYXRhICo+IGdfaW5zdGFuY2VEYXRhTWFwOworCisKK2xheWVyX2luc3RhbmNlX2RhdGEgKm1pZCh2b2lkICpvYmplY3QpCit7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkob2JqZWN0KTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9pbnN0YW5jZV9kYXRhICo+Ojpjb25zdF9pdGVyYXRvciBnb3Q7CisgICAgZ290ID0gZ19pbnN0YW5jZURhdGFNYXAuZmluZChrZXkpOworICAgIGFzc2VydChnb3QgIT0gZ19pbnN0YW5jZURhdGFNYXAuZW5kKCkpOworICAgIHJldHVybiBnb3QtPnNlY29uZDsKK30KKworbGF5ZXJfZGV2aWNlX2RhdGEgKm1kZCh2b2lkKiBvYmplY3QpCit7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkob2JqZWN0KTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9kZXZpY2VfZGF0YSAqPjo6Y29uc3RfaXRlcmF0b3IgZ290OworICAgIGdvdCA9IGdfZGV2aWNlRGF0YU1hcC5maW5kKGtleSk7CisgICAgYXNzZXJ0KGdvdCAhPSBnX2RldmljZURhdGFNYXAuZW5kKCkpOworICAgIHJldHVybiBnb3QtPnNlY29uZDsKK30KKworc3RhdGljIGxheWVyX2luc3RhbmNlX2RhdGEgKmluaXRJbnN0YW5jZURhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9pbnN0YW5jZV9kYXRhICo+ICZtYXApCit7CisgICAgbGF5ZXJfaW5zdGFuY2VfZGF0YSAqcFRhYmxlOworICAgIGFzc2VydChpbnN0YW5jZSk7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoaW5zdGFuY2UpOworCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiwgbGF5ZXJfaW5zdGFuY2VfZGF0YSAqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAuZmluZChrZXkpOworICAgIGlmIChpdCA9PSBtYXAuZW5kKCkpCisgICAgeworICAgICAgICBwVGFibGUgPSAgbmV3IGxheWVyX2luc3RhbmNlX2RhdGEoKTsKKyAgICAgICAgbWFwW2tleV0gPSBwVGFibGU7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIG5ldyBpbml0IG1ldGhvZAorICAgIGxheWVyX2luaXRfaW5zdGFuY2VfZGlzcGF0Y2hfdGFibGUoaW5zdGFuY2UsICZwVGFibGUtPmluc3RUYWJsZSwgZ3BhKTsKKworICAgIHJldHVybiBwVGFibGU7Cit9CisKK3N0YXRpYyBsYXllcl9kZXZpY2VfZGF0YSAqaW5pdERldmljZURhdGEoCisgICAgICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICAgICAgY29uc3QgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZ3BhLAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqLCBsYXllcl9kZXZpY2VfZGF0YSAqPiAmbWFwKQoreworICAgIGxheWVyX2RldmljZV9kYXRhICpwVGFibGU7CisgICAgZGlzcGF0Y2hfa2V5IGtleSA9IGdldF9kaXNwYXRjaF9rZXkoZGV2aWNlKTsKKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIGxheWVyX2RldmljZV9kYXRhICo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5maW5kKGtleSk7CisgICAgaWYgKGl0ID09IG1hcC5lbmQoKSkKKyAgICB7CisgICAgICAgIHBUYWJsZSA9ICBuZXcgbGF5ZXJfZGV2aWNlX2RhdGEoKTsKKyAgICAgICAgbWFwW2tleV0gPSBwVGFibGU7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBsYXllcl9pbml0X2RldmljZV9kaXNwYXRjaF90YWJsZShkZXZpY2UsICZwVGFibGUtPmRldlRhYmxlLCBncGEpOworCisgICAgcmV0dXJuIHBUYWJsZTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHBOZXh0IHBvaW50ZXIgb2YgYW55CisgKiBDcmVhdGVJbmZvIGV4dGVuc2lvbnMgdGhhdCBhcmUgbm90IGxvYWRlciBleHRlbnNpb25zLgorICogVGhpcyBpcyB1c2VkIHRvIHNraXAgcGFzdCB0aGUgbG9hZGVyIGV4dGVuc2lvbnMgcHJlcGVuZGVkCisgKiB0byB0aGUgbGlzdCBkdXJpbmcgQ3JlYXRlSW5zdGFuY2UgYW5kIENyZWF0ZURldmljZS4KKyAqLwordm9pZCAqc3RyaXBfY3JlYXRlX2V4dGVuc2lvbnMoY29uc3Qgdm9pZCAqcE5leHQpCit7CisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqY3JlYXRlX2luZm8gPSAoVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqKSBwTmV4dDsKKworICAgIHdoaWxlIChjcmVhdGVfaW5mbyAmJiAoY3JlYXRlX2luZm8tPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTyB8fAorICAgICAgICAgICBjcmVhdGVfaW5mby0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTE9BREVSX0RFVklDRV9DUkVBVEVfSU5GTykpIHsKKyAgICAgICAgY3JlYXRlX2luZm8gPSAoVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqKSBjcmVhdGVfaW5mby0+cE5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZV9pbmZvOworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQWxsb2NhdGVNZW1vcnkoCisgICAgVmtEZXZpY2UgZGV2aWNlLAorICAgIGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvKiBwQWxsb2NhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICBWa0RldmljZU1lbW9yeSogcE1lbW9yeSkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0FsbG9jYXRlTWVtb3J5KiBwUGFja2V0ID0gTlVMTDsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQWxsb2NhdGVNZW1vcnksIGdldF9zdHJ1Y3RfY2hhaW5fc2l6ZSgodm9pZCopcEFsbG9jYXRlSW5mbykgKyBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSArIHNpemVvZihWa0RldmljZU1lbW9yeSkpOworICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5BbGxvY2F0ZU1lbW9yeShkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBBbGxvY2F0b3IsIHBNZW1vcnkpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0FsbG9jYXRlTWVtb3J5KHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdGVJbmZvKSwgc2l6ZW9mKFZrTWVtb3J5QWxsb2NhdGVJbmZvKSwgcEFsbG9jYXRlSW5mbyk7CisgICAgYWRkX2FsbG9jX21lbW9yeV90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPnBOZXh0KSwgcEFsbG9jYXRlSW5mby0+cE5leHQpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpLCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSwgTlVMTCk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE1lbW9yeSksIHNpemVvZihWa0RldmljZU1lbW9yeSksIHBNZW1vcnkpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdGVJbmZvKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvcikpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBNZW1vcnkpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgLy8gYmVnaW4gY3VzdG9tIGNvZGUKKyAgICBhZGRfbmV3X2hhbmRsZV90b19tZW1faW5mbygqcE1lbW9yeSwgcEFsbG9jYXRlSW5mby0+YWxsb2NhdGlvblNpemUsIE5VTEwpOworICAgIC8vIGVuZCBjdXN0b20gY29kZQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrTWFwTWVtb3J5KAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnksCisgICAgVmtEZXZpY2VTaXplIG9mZnNldCwKKyAgICBWa0RldmljZVNpemUgc2l6ZSwKKyAgICBWa0ZsYWdzIGZsYWdzLAorICAgIHZvaWQqKiBwcERhdGEpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtNYXBNZW1vcnkqIHBQYWNrZXQgPSBOVUxMOworICAgIFZLQWxsb2NJbmZvICplbnRyeTsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrTWFwTWVtb3J5LCBzaXplb2Yodm9pZCopKTsKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuTWFwTWVtb3J5KGRldmljZSwgbWVtb3J5LCBvZmZzZXQsIHNpemUsIGZsYWdzLCBwcERhdGEpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIGVudHJ5ID0gZmluZF9tZW1faW5mb19lbnRyeShtZW1vcnkpOworCisgICAgLy8gRm9yIHZrdHJhY2UgdXNhZ2UsIGNsYW1wIHRoZSBtZW1vcnkgc2l6ZSB0byB0aGUgdG90YWwgc2l6ZSBsZXNzIG9mZnNldCBpZiBWS19XSE9MRV9TSVpFIGlzIHNwZWNpZmllZC4KKyAgICBpZiAoc2l6ZSA9PSBWS19XSE9MRV9TSVpFKSB7CisgICAgICAgIHNpemUgPSBlbnRyeS0+dG90YWxTaXplIC0gb2Zmc2V0OworICAgIH0KKyNpZmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKyAgICBwYWdlZ3VhcmRFbnRlcigpOworICAgIGdldFBhZ2VHdWFyZENvbnRyb2xJbnN0YW5jZSgpLnZrTWFwTWVtb3J5UGFnZUd1YXJkSGFuZGxlKGRldmljZSwgbWVtb3J5LCBvZmZzZXQsIHNpemUsIGZsYWdzLCBwcERhdGEpOworICAgIHBhZ2VndWFyZEV4aXQoKTsKKyNlbmRpZgorICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a01hcE1lbW9yeShwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5kZXZpY2UgPSBkZXZpY2U7CisgICAgcFBhY2tldC0+bWVtb3J5ID0gbWVtb3J5OworICAgIHBQYWNrZXQtPm9mZnNldCA9IG9mZnNldDsKKyAgICBwUGFja2V0LT5zaXplID0gc2l6ZTsKKyAgICBwUGFja2V0LT5mbGFncyA9IGZsYWdzOworICAgIGlmIChwcERhdGEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YSksIHNpemVvZih2b2lkKiksICpwcERhdGEpOworICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wcERhdGEpKTsKKyAgICAgICAgYWRkX2RhdGFfdG9fbWVtX2luZm8obWVtb3J5LCBzaXplLCBvZmZzZXQsICpwcERhdGEpOworICAgIH0KKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBfX0hPT0tFRF92a1VubWFwTWVtb3J5KAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBWa0RldmljZU1lbW9yeSBtZW1vcnkpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIHBhY2tldF92a1VubWFwTWVtb3J5KiBwUGFja2V0OworICAgIFZLQWxsb2NJbmZvICplbnRyeTsKKyAgICBzaXplX3Qgc2l6ID0gMDsKKyNpZmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKyAgICB2b2lkICpQYWdlR3VhcmRNYXBwZWREYXRhOworICAgIHBhZ2VndWFyZEVudGVyKCk7CisgICAgZ2V0UGFnZUd1YXJkQ29udHJvbEluc3RhbmNlKCkudmtVbm1hcE1lbW9yeVBhZ2VHdWFyZEhhbmRsZShkZXZpY2UsIG1lbW9yeSwgJlBhZ2VHdWFyZE1hcHBlZERhdGEsICZ2a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzV2l0aG91dEFQSUNhbGwpOworICAgIHBhZ2VndWFyZEV4aXQoKTsKKyNlbmRpZgorICAgIHVpbnQ2NF90IHRyYWNlX2JlZ2luX3RpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisKKyAgICAvLyBpbnNlcnQgaW50byBwYWNrZXQgdGhlIGRhdGEgdGhhdCB3YXMgd3JpdHRlbiBieSBDUFUgYmV0d2VlbiB0aGUgdmtNYXBNZW1vcnkgY2FsbCBhbmQgaGVyZQorICAgIC8vIE5vdGUgbXVzdCBkbyB0aGlzIHByaW9yIHRvIHRoZSByZWFsIHZrVW5NYXAoKSBvciBlbHNlIG1heSBnZXQgYSBGQVVMVAorICAgIHZrdHJhY2VfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigmZ19tZW1JbmZvTG9jayk7CisgICAgZW50cnkgPSBmaW5kX21lbV9pbmZvX2VudHJ5KG1lbW9yeSk7CisgICAgaWYgKGVudHJ5ICYmIGVudHJ5LT5wRGF0YSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKCFlbnRyeS0+ZGlkRmx1c2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIEZsdXNoTWFwcGVkIE1lbW9yeQorICAgICAgICAgICAgc2l6ID0gKHNpemVfdCllbnRyeS0+cmFuZ2VTaXplOworICAgICAgICB9CisgICAgfQorICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtVbm1hcE1lbW9yeSwgc2l6KTsKKyAgICBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUgPSB0cmFjZV9iZWdpbl90aW1lOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a1VubWFwTWVtb3J5KHBIZWFkZXIpOworICAgIGlmIChzaXopCisgICAgeworICAgICAgICBhc3NlcnQoZW50cnktPmhhbmRsZSA9PSBtZW1vcnkpOworICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopICYocFBhY2tldC0+cERhdGEpLCBzaXosIGVudHJ5LT5wRGF0YSk7CisgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEYXRhKSk7CisgICAgICAgIGVudHJ5LT5wRGF0YSA9IE5VTEw7CisgICAgfQorICAgIHZrdHJhY2VfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigmZ19tZW1JbmZvTG9jayk7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIG1kZChkZXZpY2UpLT5kZXZUYWJsZS5Vbm1hcE1lbW9yeShkZXZpY2UsIG1lbW9yeSk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHBQYWNrZXQtPm1lbW9yeSA9IG1lbW9yeTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisjaWZkZWYgVVNFX1BBR0VHVUFSRF9TUEVFRFVQCisgICAgcGFnZWd1YXJkRW50ZXIoKTsKKyAgICBpZiAoUGFnZUd1YXJkTWFwcGVkRGF0YSAhPSBudWxscHRyKQorICAgIHsKKyAgICAgICAgcGFnZWd1YXJkRnJlZU1lbW9yeShQYWdlR3VhcmRNYXBwZWREYXRhKTsKKyAgICB9CisgICAgcGFnZWd1YXJkRXhpdCgpOworI2VuZGlmCit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0ZyZWVNZW1vcnkoCisgICAgVmtEZXZpY2UgZGV2aWNlLAorICAgIFZrRGV2aWNlTWVtb3J5IG1lbW9yeSwKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIHBhY2tldF92a0ZyZWVNZW1vcnkqIHBQYWNrZXQgPSBOVUxMOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtGcmVlTWVtb3J5LCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSk7CisgICAgbWRkKGRldmljZSktPmRldlRhYmxlLkZyZWVNZW1vcnkoZGV2aWNlLCBtZW1vcnksIHBBbGxvY2F0b3IpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0ZyZWVNZW1vcnkocEhlYWRlcik7CisgICAgcFBhY2tldC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHBQYWNrZXQtPm1lbW9yeSA9IG1lbW9yeTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSwgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcyksIE5VTEwpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgLy8gYmVnaW4gY3VzdG9tIGNvZGUKKyAgICBybV9oYW5kbGVfZnJvbV9tZW1faW5mbyhtZW1vcnkpOworICAgIC8vIGVuZCBjdXN0b20gY29kZQorfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcygKKyAgICBWa0RldmljZSBkZXZpY2UsCisgICAgdWludDMyX3QgbWVtb3J5UmFuZ2VDb3VudCwKKyAgICBjb25zdCBWa01hcHBlZE1lbW9yeVJhbmdlKiBwTWVtb3J5UmFuZ2VzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgc2l6ZV90IHJhbmdlc1NpemUgPSAwOworICAgIHNpemVfdCBkYXRhU2l6ZSA9IDA7CisgICAgdWludDMyX3QgaXRlcjsKKyAgICBwYWNrZXRfdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzKiBwUGFja2V0ID0gTlVMTDsKKyAgICB1aW50NjRfdCB0cmFjZV9iZWdpbl90aW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworCisjaWZkZWYgVVNFX1BBR0VHVUFSRF9TUEVFRFVQCisgICAgcGFnZWd1YXJkRW50ZXIoKTsKKyAgICByZXNldEFsbFJlYWRGbGFnQW5kUGFnZUd1YXJkKCk7CisgICAgcGFnZWd1YXJkRXhpdCgpOworI2VuZGlmCisKKyAgICAvLyBmaW5kIG91dCBob3cgbXVjaCBtZW1vcnkgaXMgaW4gdGhlIHJhbmdlcworICAgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBtZW1vcnlSYW5nZUNvdW50OyBpdGVyKyspCisgICAgeworICAgICAgICBWa01hcHBlZE1lbW9yeVJhbmdlKiBwUmFuZ2UgPSAoVmtNYXBwZWRNZW1vcnlSYW5nZSopJnBNZW1vcnlSYW5nZXNbaXRlcl07CisgICAgICAgIHJhbmdlc1NpemUgKz0gdmtfc2l6ZV92a21hcHBlZG1lbW9yeXJhbmdlKHBSYW5nZSk7CisgICAgICAgIGRhdGFTaXplICs9IChzaXplX3QpcFJhbmdlLT5zaXplOworICAgIH0KKworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzLCByYW5nZXNTaXplICsgc2l6ZW9mKHZvaWQqKSptZW1vcnlSYW5nZUNvdW50ICsgZGF0YVNpemUpOworICAgIHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSA9IHRyYWNlX2JlZ2luX3RpbWU7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhwSGVhZGVyKTsKKworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikgJihwUGFja2V0LT5wTWVtb3J5UmFuZ2VzKSwgcmFuZ2VzU2l6ZSwgcE1lbW9yeVJhbmdlcyk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE1lbW9yeVJhbmdlcykpOworCisgICAgLy8gaW5zZXJ0IGludG8gcGFja2V0IHRoZSBkYXRhIHRoYXQgd2FzIHdyaXR0ZW4gYnkgQ1BVIGJldHdlZW4gdGhlIHZrTWFwTWVtb3J5IGNhbGwgYW5kIGhlcmUKKyAgICAvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgbG9jYWwgcHBEYXRhIGFycmF5IGFuZCBhZGQgaXQgdG8gdGhlIHBhY2tldCAodG8gcmVzZXJ2ZSB0aGUgc3BhY2UgZm9yIHRoZSBhcnJheSkKKyAgICB2b2lkKiogcHBUbXBEYXRhID0gKHZvaWQgKiopIG1hbGxvYyhtZW1vcnlSYW5nZUNvdW50ICogc2l6ZW9mKHZvaWQqKSk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSAmKHBQYWNrZXQtPnBwRGF0YSksIHNpemVvZih2b2lkKikqbWVtb3J5UmFuZ2VDb3VudCwgcHBUbXBEYXRhKTsKKyAgICBmcmVlKHBwVG1wRGF0YSk7CisKKyAgICAvLyBub3cgdGhlIGFjdHVhbCBtZW1vcnkKKyAgICB2a3RyYWNlX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oJmdfbWVtSW5mb0xvY2spOworICAgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBtZW1vcnlSYW5nZUNvdW50OyBpdGVyKyspCisgICAgeworICAgICAgICBWa01hcHBlZE1lbW9yeVJhbmdlKiBwUmFuZ2UgPSAoVmtNYXBwZWRNZW1vcnlSYW5nZSopJnBNZW1vcnlSYW5nZXNbaXRlcl07CisgICAgICAgIFZLQWxsb2NJbmZvKiBwRW50cnkgPSBmaW5kX21lbV9pbmZvX2VudHJ5KHBSYW5nZS0+bWVtb3J5KTsKKworICAgICAgICBpZiAocEVudHJ5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChwRW50cnktPmhhbmRsZSA9PSBwUmFuZ2UtPm1lbW9yeSk7CisgICAgICAgICAgICBhc3NlcnQocEVudHJ5LT50b3RhbFNpemUgPj0gKHBSYW5nZS0+c2l6ZSArIHBSYW5nZS0+b2Zmc2V0KSk7CisgICAgICAgICAgICBhc3NlcnQocEVudHJ5LT50b3RhbFNpemUgPj0gcFJhbmdlLT5zaXplKTsKKyAgICAgICAgICAgIGFzc2VydChwUmFuZ2UtPm9mZnNldCA+PSBwRW50cnktPnJhbmdlT2Zmc2V0ICYmIChwUmFuZ2UtPm9mZnNldCArIHBSYW5nZS0+c2l6ZSkgPD0gKHBFbnRyeS0+cmFuZ2VPZmZzZXQgKyBwRW50cnktPnJhbmdlU2l6ZSkpOworICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSAmKHBQYWNrZXQtPnBwRGF0YVtpdGVyXSksIHBSYW5nZS0+c2l6ZSwgcEVudHJ5LT5wRGF0YSArIHBSYW5nZS0+b2Zmc2V0KTsKKyAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YVtpdGVyXSkpOworICAgICAgICAgICAgcEVudHJ5LT5kaWRGbHVzaCA9IFRSVUU7Ly9EbyB3ZSBuZWVkIGRpZEludmFsaWRhdGU/CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIGNvcHkgYXBwIG1lbW9yeSBpbnRvIHRyYWNlIHBhY2tldCAoaWR4ID0gJXUpIG9uIHZrSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIsIHBIZWFkZXItPmdsb2JhbF9wYWNrZXRfaW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIHZrdHJhY2VfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigmZ19tZW1JbmZvTG9jayk7CisKKyAgICAvLyBub3cgZmluYWxpemUgdGhlIHBwRGF0YSBhcnJheSBzaW5jZSBpdCBpcyBkb25lIGJlaW5nIHVwZGF0ZWQKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wcERhdGEpKTsKKworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICBwUGFja2V0LT5tZW1vcnlSYW5nZUNvdW50ID0gbWVtb3J5UmFuZ2VDb3VudDsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICB1aW50MzJfdCBtZW1vcnlSYW5nZUNvdW50LAorICAgIGNvbnN0IFZrTWFwcGVkTWVtb3J5UmFuZ2UqIHBNZW1vcnlSYW5nZXMpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBzaXplX3QgcmFuZ2VzU2l6ZSA9IDA7CisgICAgc2l6ZV90IGRhdGFTaXplID0gMDsKKyAgICB1aW50MzJfdCBpdGVyOworICAgIHBhY2tldF92a0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzKiBwUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKyAgICBwYWdlZ3VhcmRFbnRlcigpOworICAgIFBCWVRFICpwcFBhY2thZ2VEYXRhID0gbmV3IFBCWVRFW21lbW9yeVJhbmdlQ291bnRdOworICAgIGdldFBhZ2VHdWFyZENvbnRyb2xJbnN0YW5jZSgpLnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNQYWdlR3VhcmRIYW5kbGUoZGV2aWNlLCBtZW1vcnlSYW5nZUNvdW50LCBwTWVtb3J5UmFuZ2VzLCBwcFBhY2thZ2VEYXRhKTsvL3RoZSBwYWNrZXQgaXMgbm90IG5lZWRlZCBpZiBubyBhbnkgY2hhbmdlIG9uIGRhdGEgb2YgYWxsIHJhbmdlcworI2VuZGlmCisKKyAgICB1aW50NjRfdCB0cmFjZV9iZWdpbl90aW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworCisgICAgLy8gZmluZCBvdXQgaG93IG11Y2ggbWVtb3J5IGlzIGluIHRoZSByYW5nZXMKKyAgICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgbWVtb3J5UmFuZ2VDb3VudDsgaXRlcisrKQorICAgIHsKKyAgICAgICAgVmtNYXBwZWRNZW1vcnlSYW5nZSogcFJhbmdlID0gKFZrTWFwcGVkTWVtb3J5UmFuZ2UqKSZwTWVtb3J5UmFuZ2VzW2l0ZXJdOworICAgICAgICByYW5nZXNTaXplICs9IHZrX3NpemVfdmttYXBwZWRtZW1vcnlyYW5nZShwUmFuZ2UpOworICAgICAgICBkYXRhU2l6ZSArPSBST1VORFVQX1RPXzQoKChzaXplX3QpcFJhbmdlLT5zaXplKSk7CisgICAgfQorI2lmZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgIGRhdGFTaXplID0gUk9VTkRVUF9UT180KGdldFBhZ2VHdWFyZENvbnRyb2xJbnN0YW5jZSgpLmdldEFMTENoYW5nZWRQYWNrYWdlU2l6ZUluTWFwcGVkTWVtb3J5KGRldmljZSwgbWVtb3J5UmFuZ2VDb3VudCwgcE1lbW9yeVJhbmdlcywgcHBQYWNrYWdlRGF0YSkpOworI2VuZGlmCisKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMsIHJhbmdlc1NpemUgKyBzaXplb2Yodm9pZCopKm1lbW9yeVJhbmdlQ291bnQgKyBkYXRhU2l6ZSk7CisgICAgcEhlYWRlci0+dmt0cmFjZV9iZWdpbl90aW1lID0gdHJhY2VfYmVnaW5fdGltZTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhwSGVhZGVyKTsKKworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikgJihwUGFja2V0LT5wTWVtb3J5UmFuZ2VzKSwgcmFuZ2VzU2l6ZSwgcE1lbW9yeVJhbmdlcyk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE1lbW9yeVJhbmdlcykpOworCisgICAgLy8gaW5zZXJ0IGludG8gcGFja2V0IHRoZSBkYXRhIHRoYXQgd2FzIHdyaXR0ZW4gYnkgQ1BVIGJldHdlZW4gdGhlIHZrTWFwTWVtb3J5IGNhbGwgYW5kIGhlcmUKKyAgICAvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgbG9jYWwgcHBEYXRhIGFycmF5IGFuZCBhZGQgaXQgdG8gdGhlIHBhY2tldCAodG8gcmVzZXJ2ZSB0aGUgc3BhY2UgZm9yIHRoZSBhcnJheSkKKyAgICB2b2lkKiogcHBUbXBEYXRhID0gKHZvaWQgKiopIG1hbGxvYyhtZW1vcnlSYW5nZUNvdW50ICogc2l6ZW9mKHZvaWQqKSk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSAmKHBQYWNrZXQtPnBwRGF0YSksIHNpemVvZih2b2lkKikqbWVtb3J5UmFuZ2VDb3VudCwgcHBUbXBEYXRhKTsKKyAgICBmcmVlKHBwVG1wRGF0YSk7CisKKyAgICAvLyBub3cgdGhlIGFjdHVhbCBtZW1vcnkKKyAgICB2a3RyYWNlX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oJmdfbWVtSW5mb0xvY2spOworICAgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBtZW1vcnlSYW5nZUNvdW50OyBpdGVyKyspCisgICAgeworICAgICAgICBWa01hcHBlZE1lbW9yeVJhbmdlKiBwUmFuZ2UgPSAoVmtNYXBwZWRNZW1vcnlSYW5nZSopJnBNZW1vcnlSYW5nZXNbaXRlcl07CisgICAgICAgIFZLQWxsb2NJbmZvKiBwRW50cnkgPSBmaW5kX21lbV9pbmZvX2VudHJ5KHBSYW5nZS0+bWVtb3J5KTsKKworICAgICAgICBpZiAocEVudHJ5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChwRW50cnktPmhhbmRsZSA9PSBwUmFuZ2UtPm1lbW9yeSk7CisgICAgICAgICAgICBhc3NlcnQocEVudHJ5LT50b3RhbFNpemUgPj0gKHBSYW5nZS0+c2l6ZSArIHBSYW5nZS0+b2Zmc2V0KSk7CisgICAgICAgICAgICBhc3NlcnQocEVudHJ5LT50b3RhbFNpemUgPj0gcFJhbmdlLT5zaXplKTsKKyAgICAgICAgICAgIGFzc2VydChwUmFuZ2UtPm9mZnNldCA+PSBwRW50cnktPnJhbmdlT2Zmc2V0ICYmIChwUmFuZ2UtPm9mZnNldCArIHBSYW5nZS0+c2l6ZSkgPD0gKHBFbnRyeS0+cmFuZ2VPZmZzZXQgKyBwRW50cnktPnJhbmdlU2l6ZSkpOworI2lmZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgICAgICAgICAgTFBQYWdlR3VhcmRNYXBwZWRNZW1vcnkgcE9QVE1lbW9yeVRlbXAgPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5maW5kTWFwcGVkTWVtb3J5T2JqZWN0KGRldmljZSwgcFJhbmdlKTsKKyAgICAgICAgICAgIFZrRGV2aWNlU2l6ZSBPUFRQYWNrYWdlU2l6ZVRlbXAgPSAwOworICAgICAgICAgICAgaWYgKHBPUFRNZW1vcnlUZW1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBCWVRFIHBPUFREYXRhVGVtcCA9IHBPUFRNZW1vcnlUZW1wLT5nZXRDaGFuZ2VkRGF0YVBhY2thZ2UoJk9QVFBhY2thZ2VTaXplVGVtcCk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cHBEYXRhW2l0ZXJdKSwgUk9VTkRVUF9UT180KE9QVFBhY2thZ2VTaXplVGVtcCksIHBPUFREYXRhVGVtcCk7CisgICAgICAgICAgICAgICAgcE9QVE1lbW9yeVRlbXAtPmNsZWFyQ2hhbmdlZERhdGFQYWNrYWdlKCk7CisgICAgICAgICAgICAgICAgcE9QVE1lbW9yeVRlbXAtPnJlc2V0TWVtb3J5T2JqZWN0QWxsQ2hhbmdlZEZsYWdBbmRQYWdlR3VhcmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQQllURSBwT1BURGF0YVRlbXAgPSBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5nZXRDaGFuZ2VkRGF0YVBhY2thZ2VPdXRPZk1hcChwcFBhY2thZ2VEYXRhLCBpdGVyLCAmT1BUUGFja2FnZVNpemVUZW1wKTsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wcERhdGFbaXRlcl0pLCBST1VORFVQX1RPXzQoT1BUUGFja2FnZVNpemVUZW1wKSwgcE9QVERhdGFUZW1wKTsKKyAgICAgICAgICAgICAgICBnZXRQYWdlR3VhcmRDb250cm9sSW5zdGFuY2UoKS5jbGVhckNoYW5nZWREYXRhUGFja2FnZU91dE9mTWFwKHBwUGFja2FnZURhdGEsIGl0ZXIpOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YVtpdGVyXSksIFJPVU5EVVBfVE9fNChwUmFuZ2UtPnNpemUpLCBwRW50cnktPnBEYXRhICsgcFJhbmdlLT5vZmZzZXQpOworI2VuZGlmCisgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wcERhdGFbaXRlcl0pKTsKKyAgICAgICAgICAgIHBFbnRyeS0+ZGlkRmx1c2ggPSBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBjb3B5IGFwcCBtZW1vcnkgaW50byB0cmFjZSBwYWNrZXQgKGlkeCA9ICV1KSBvbiB2a0ZsdXNoZWRNYXBwZWRNZW1vcnlSYW5nZXMiLCBwSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBVU0VfUEFHRUdVQVJEX1NQRUVEVVAKKyAgICBkZWxldGVbXSBwcFBhY2thZ2VEYXRhOworI2VuZGlmCisgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZnX21lbUluZm9Mb2NrKTsKKworICAgIC8vIG5vdyBmaW5hbGl6ZSB0aGUgcHBEYXRhIGFycmF5IHNpbmNlIGl0IGlzIGRvbmUgYmVpbmcgdXBkYXRlZAorICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBwRGF0YSkpOworCisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5GbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyhkZXZpY2UsIG1lbW9yeVJhbmdlQ291bnQsIHBNZW1vcnlSYW5nZXMpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICBwUGFja2V0LT5tZW1vcnlSYW5nZUNvdW50ID0gbWVtb3J5UmFuZ2VDb3VudDsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworI2lmZGVmIFVTRV9QQUdFR1VBUkRfU1BFRURVUAorICAgIHBhZ2VndWFyZEV4aXQoKTsKKyNlbmRpZgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sCisgICAgVmtDb21tYW5kQnVmZmVyKiBwQ29tbWFuZEJ1ZmZlcnMpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKiBwUGFja2V0ID0gTlVMTDsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQWxsb2NhdGVDb21tYW5kQnVmZmVycywgZ2V0X3N0cnVjdF9jaGFpbl9zaXplKCh2b2lkKilwQWxsb2NhdGVJbmZvKSArIHNpemVvZihWa0NvbW1hbmRCdWZmZXIpICogcEFsbG9jYXRlSW5mby0+Y29tbWFuZEJ1ZmZlckNvdW50KTsKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuQWxsb2NhdGVDb21tYW5kQnVmZmVycyhkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBDb21tYW5kQnVmZmVycyk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyhwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5kZXZpY2UgPSBkZXZpY2U7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRlSW5mbyksIHNpemVvZihWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8pLCBwQWxsb2NhdGVJbmZvKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ29tbWFuZEJ1ZmZlcnMpLCBzaXplb2YoVmtDb21tYW5kQnVmZmVyKSAqIHBBbGxvY2F0ZUluZm8tPmNvbW1hbmRCdWZmZXJDb3VudCwgcENvbW1hbmRCdWZmZXJzKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRlSW5mbykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDb21tYW5kQnVmZmVycykpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQmVnaW5Db21tYW5kQnVmZmVyKAorICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEJlZ2luSW5mbykKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0JlZ2luQ29tbWFuZEJ1ZmZlciogcFBhY2tldCA9IE5VTEw7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0JlZ2luQ29tbWFuZEJ1ZmZlciwgZ2V0X3N0cnVjdF9jaGFpbl9zaXplKCh2b2lkKilwQmVnaW5JbmZvKSk7CisgICAgcmVzdWx0ID0gbWRkKGNvbW1hbmRCdWZmZXIpLT5kZXZUYWJsZS5CZWdpbkNvbW1hbmRCdWZmZXIoY29tbWFuZEJ1ZmZlciwgcEJlZ2luSW5mbyk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQmVnaW5Db21tYW5kQnVmZmVyKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmNvbW1hbmRCdWZmZXIgPSBjb21tYW5kQnVmZmVyOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCZWdpbkluZm8pLCBzaXplb2YoVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKSwgcEJlZ2luSW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mbyksIHNpemVvZihWa0NvbW1hbmRCdWZmZXJJbmhlcml0YW5jZUluZm8pLCBwQmVnaW5JbmZvLT5wSW5oZXJpdGFuY2VJbmZvKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mbykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCZWdpbkluZm8pKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0NyZWF0ZURlc2NyaXB0b3JQb29sKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgIFZrRGVzY3JpcHRvclBvb2wqIHBEZXNjcmlwdG9yUG9vbCkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0NyZWF0ZURlc2NyaXB0b3JQb29sKiBwUGFja2V0ID0gTlVMTDsKKyAgICAvLyBiZWdpbiBjdXN0b20gY29kZSAobmVlZHMgdG8gdXNlIGdldF9zdHJ1Y3RfY2hhaW5fc2l6ZSkKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQ3JlYXRlRGVzY3JpcHRvclBvb2wsICBnZXRfc3RydWN0X2NoYWluX3NpemUoKHZvaWQqKXBDcmVhdGVJbmZvKSArIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpICsgc2l6ZW9mKFZrRGVzY3JpcHRvclBvb2wpKTsKKyAgICAvLyBlbmQgY3VzdG9tIGNvZGUKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuQ3JlYXRlRGVzY3JpcHRvclBvb2woZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERlc2NyaXB0b3JQb29sKTsKKyAgICB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZShwSGVhZGVyKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtDcmVhdGVEZXNjcmlwdG9yUG9vbChwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5kZXZpY2UgPSBkZXZpY2U7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pLCBzaXplb2YoVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8pLCBwQ3JlYXRlSW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBQb29sU2l6ZXMpLCBwQ3JlYXRlSW5mby0+cG9vbFNpemVDb3VudCAqIHNpemVvZihWa0Rlc2NyaXB0b3JQb29sU2l6ZSksIHBDcmVhdGVJbmZvLT5wUG9vbFNpemVzKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSwgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcyksIE5VTEwpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEZXNjcmlwdG9yUG9vbCksIHNpemVvZihWa0Rlc2NyaXB0b3JQb29sKSwgcERlc2NyaXB0b3JQb29sKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBQb29sU2l6ZXMpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGVzY3JpcHRvclBvb2wpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVmtMYXllckRldmljZUNyZWF0ZUluZm8gKmdldF9jaGFpbl9pbmZvKGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcENyZWF0ZUluZm8sIFZrTGF5ZXJGdW5jdGlvbiBmdW5jKQoreworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gKFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICopIHBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICB3aGlsZSAoY2hhaW5faW5mbyAmJiAhKGNoYWluX2luZm8tPnNUeXBlID09IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk8KKyAgICAgICAgICAgJiYgY2hhaW5faW5mby0+ZnVuY3Rpb24gPT0gZnVuYykpIHsKKyAgICAgICAgY2hhaW5faW5mbyA9IChWa0xheWVyRGV2aWNlQ3JlYXRlSW5mbyAqKSBjaGFpbl9pbmZvLT5wTmV4dDsKKyAgICB9CisgICAgYXNzZXJ0KGNoYWluX2luZm8gIT0gTlVMTCk7CisgICAgcmV0dXJuIGNoYWluX2luZm87Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtDcmVhdGVEZXZpY2UoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICBjb25zdCBWa0RldmljZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICBWa0RldmljZSogcERldmljZSkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0NyZWF0ZURldmljZSogcFBhY2tldCA9IE5VTEw7CisgICAgdWludDMyX3QgaTsKKworICAgIFZrTGF5ZXJEZXZpY2VDcmVhdGVJbmZvICpjaGFpbl9pbmZvID0gZ2V0X2NoYWluX2luZm8ocENyZWF0ZUluZm8sIFZLX0xBWUVSX0xJTktfSU5GTyk7CisKKyAgICBhc3NlcnQoY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvKTsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIGZwR2V0SW5zdGFuY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgYXNzZXJ0KGZwR2V0SW5zdGFuY2VQcm9jQWRkcik7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgZnBHZXREZXZpY2VQcm9jQWRkciA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cGZuTmV4dEdldERldmljZVByb2NBZGRyOworICAgIGFzc2VydChmcEdldERldmljZVByb2NBZGRyKTsKKyAgICBQRk5fdmtDcmVhdGVEZXZpY2UgZnBDcmVhdGVEZXZpY2UgPSAoUEZOX3ZrQ3JlYXRlRGV2aWNlKSBmcEdldEluc3RhbmNlUHJvY0FkZHIoTlVMTCwgInZrQ3JlYXRlRGV2aWNlIik7CisgICAgaWYgKGZwQ3JlYXRlRGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZLX0VSUk9SX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRoZSBsaW5rIGluZm8gZm9yIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIGNoYWluCisgICAgY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wTmV4dDsKKworICAgIHJlc3VsdCA9IGZwQ3JlYXRlRGV2aWNlKHBoeXNpY2FsRGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcERldmljZSk7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorIAorICAgIGluaXREZXZpY2VEYXRhKCpwRGV2aWNlLCBmcEdldERldmljZVByb2NBZGRyLCBnX2RldmljZURhdGFNYXApOworICAgIC8vIFNldHVwIGRldmljZSBkaXNwYXRjaCB0YWJsZSBmb3IgZXh0ZW5zaW9ucworICAgIGV4dF9pbml0X2NyZWF0ZV9kZXZpY2UobWRkKCpwRGV2aWNlKSwgKnBEZXZpY2UsIGZwR2V0RGV2aWNlUHJvY0FkZHIsIHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQsIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyk7CisKKyAgICAvLyByZW1vdmUgdGhlIGxvYWRlciBleHRlbmRlZCBjcmVhdGVJbmZvIHN0cnVjdHVyZQorICAgIFZrRGV2aWNlQ3JlYXRlSW5mbyBsb2NhbENyZWF0ZUluZm87CisgICAgbWVtY3B5KCZsb2NhbENyZWF0ZUluZm8sIHBDcmVhdGVJbmZvLCBzaXplb2YobG9jYWxDcmVhdGVJbmZvKSk7CisgICAgZm9yIChpID0gMDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeworICAgICAgICBjaGFyICoqcHBOYW1lID0gKGNoYXIgKiopICZsb2NhbENyZWF0ZUluZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV07CisgICAgICAgICpwcE5hbWUgPSAoY2hhciAqKSBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQ7IGkrKykgeworICAgICAgICBjaGFyICoqcHBOYW1lID0gKGNoYXIgKiopICZsb2NhbENyZWF0ZUluZm8ucHBFbmFibGVkTGF5ZXJOYW1lc1tpXTsKKyAgICAgICAgKnBwTmFtZSA9IChjaGFyICopIHBDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzW2ldOworICAgIH0KKyAgICBsb2NhbENyZWF0ZUluZm8ucE5leHQgPSBzdHJpcF9jcmVhdGVfZXh0ZW5zaW9ucyhwQ3JlYXRlSW5mby0+cE5leHQpOworCisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NyZWF0ZURldmljZSwgZ2V0X3N0cnVjdF9jaGFpbl9zaXplKCh2b2lkKikmbG9jYWxDcmVhdGVJbmZvKSArIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpICsgc2l6ZW9mKFZrRGV2aWNlKSk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQ3JlYXRlRGV2aWNlKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlID0gcGh5c2ljYWxEZXZpY2U7CisgICAgYWRkX1ZrRGV2aWNlQ3JlYXRlSW5mb190b19wYWNrZXQocEhlYWRlciwgKFZrRGV2aWNlQ3JlYXRlSW5mbyoqKSAmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSwgJmxvY2FsQ3JlYXRlSW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvciksIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpLCBOVUxMKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGV2aWNlKSwgc2l6ZW9mKFZrRGV2aWNlKSwgcERldmljZSk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGV2aWNlKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtDcmVhdGVGcmFtZWJ1ZmZlcigKKyAgICBWa0RldmljZSBkZXZpY2UsCisgICAgY29uc3QgVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICBWa0ZyYW1lYnVmZmVyKiBwRnJhbWVidWZmZXIpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtDcmVhdGVGcmFtZWJ1ZmZlciogcFBhY2tldCA9IE5VTEw7CisgICAgLy8gYmVnaW4gY3VzdG9tIGNvZGUKKyAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnQgPSAocENyZWF0ZUluZm8gIT0gTlVMTCAmJiBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzICE9IE5VTEwpID8gcENyZWF0ZUluZm8tPmF0dGFjaG1lbnRDb3VudCA6IDA7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NyZWF0ZUZyYW1lYnVmZmVyLCBnZXRfc3RydWN0X2NoYWluX3NpemUoKHZvaWQqKXBDcmVhdGVJbmZvKSArIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpICsgc2l6ZW9mKFZrRnJhbWVidWZmZXIpKTsKKyAgICAvLyBlbmQgY3VzdG9tIGNvZGUKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuQ3JlYXRlRnJhbWVidWZmZXIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcEZyYW1lYnVmZmVyKTsKKyAgICB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZShwSGVhZGVyKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtDcmVhdGVGcmFtZWJ1ZmZlcihwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5kZXZpY2UgPSBkZXZpY2U7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pLCBzaXplb2YoVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8pLCBwQ3JlYXRlSW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBBdHRhY2htZW50cyksIGF0dGFjaG1lbnRDb3VudCAqIHNpemVvZihWa0ltYWdlVmlldyksIHBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHMpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpLCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSwgTlVMTCk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEZyYW1lYnVmZmVyKSwgc2l6ZW9mKFZrRnJhbWVidWZmZXIpLCBwRnJhbWVidWZmZXIpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEZyYW1lYnVmZmVyKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmdldF9jaGFpbl9pbmZvKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvICpwQ3JlYXRlSW5mbywgVmtMYXllckZ1bmN0aW9uIGZ1bmMpCit7CisgICAgVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqY2hhaW5faW5mbyA9IChWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICopIHBDcmVhdGVJbmZvLT5wTmV4dDsKKyAgICB3aGlsZSAoY2hhaW5faW5mbyAmJiAoKGNoYWluX2luZm8tPnNUeXBlICE9IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTykKKyAgICAgICAgICAgfHwgKGNoYWluX2luZm8tPmZ1bmN0aW9uICE9IGZ1bmMpKSkgeworICAgICAgICBjaGFpbl9pbmZvID0gKFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKikgY2hhaW5faW5mby0+cE5leHQ7CisgICAgfQorICAgIGFzc2VydChjaGFpbl9pbmZvICE9IE5VTEwpOworICAgIHJldHVybiBjaGFpbl9pbmZvOworfQorCisjaWYgZGVmaW5lZChVU0VfUEFHRUdVQVJEX1NQRUVEVVApICYmICFkZWZpbmVkKFBBR0VHVUFSRF9NRU1DUFlfVVNFX1BQTF9MSUIpCitleHRlcm4gIkMiIEJPT0wgdmt0cmFjZV9wYWdlZ3VhcmRfaW5pdF9tdWx0aV90aHJlYWRzX21lbWNweSgpOworZXh0ZXJuICJDIiB2b2lkIHZrdHJhY2VfcGFnZWd1YXJkX2RvbmVfbXVsdGlfdGhyZWFkc19tZW1jcHkoKTsKKyNlbmRpZgorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQ3JlYXRlSW5zdGFuY2UoCisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICBWa0luc3RhbmNlKiBwSW5zdGFuY2UpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtDcmVhdGVJbnN0YW5jZSogcFBhY2tldCA9IE5VTEw7CisgICAgdWludDY0X3Qgc3RhcnRUaW1lOworICAgIHVpbnQ2NF90IGVuZFRpbWU7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50NjRfdCB2a3RyYWNlU3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIFNFTkRfRU5UUllQT0lOVF9JRCh2a0NyZWF0ZUluc3RhbmNlKTsKKyAgICBzdGFydFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisKKyNpZiBkZWZpbmVkKFVTRV9QQUdFR1VBUkRfU1BFRURVUCkgJiYgIWRlZmluZWQoUEFHRUdVQVJEX01FTUNQWV9VU0VfUFBMX0xJQikKKyAgICB2a3RyYWNlX3BhZ2VndWFyZF9pbml0X211bHRpX3RocmVhZHNfbWVtY3B5KCk7CisjZW5kaWYKKworICAgIFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmNoYWluX2luZm8gPSBnZXRfY2hhaW5faW5mbyhwQ3JlYXRlSW5mbywgVktfTEFZRVJfTElOS19JTkZPKTsKKworICAgIGFzc2VydChjaGFpbl9pbmZvLT51LnBMYXllckluZm8pOworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZnBHZXRJbnN0YW5jZVByb2NBZGRyID0gY2hhaW5faW5mby0+dS5wTGF5ZXJJbmZvLT5wZm5OZXh0R2V0SW5zdGFuY2VQcm9jQWRkcjsKKyAgICBhc3NlcnQoZnBHZXRJbnN0YW5jZVByb2NBZGRyKTsKKyAgICBQRk5fdmtDcmVhdGVJbnN0YW5jZSBmcENyZWF0ZUluc3RhbmNlID0gKFBGTl92a0NyZWF0ZUluc3RhbmNlKSBmcEdldEluc3RhbmNlUHJvY0FkZHIoTlVMTCwgInZrQ3JlYXRlSW5zdGFuY2UiKTsKKyAgICBpZiAoZnBDcmVhdGVJbnN0YW5jZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWS19FUlJPUl9JTklUSUFMSVpBVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gQWR2YW5jZSB0aGUgbGluayBpbmZvIGZvciB0aGUgbmV4dCBlbGVtZW50IG9uIHRoZSBjaGFpbgorICAgIGNoYWluX2luZm8tPnUucExheWVySW5mbyA9IGNoYWluX2luZm8tPnUucExheWVySW5mby0+cE5leHQ7CisKKyAgICByZXN1bHQgPSBmcENyZWF0ZUluc3RhbmNlKHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwSW5zdGFuY2UpOworICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBlbmRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworCisgICAgaW5pdEluc3RhbmNlRGF0YSgqcEluc3RhbmNlLCBmcEdldEluc3RhbmNlUHJvY0FkZHIsIGdfaW5zdGFuY2VEYXRhTWFwKTsKKyAgICBleHRfaW5pdF9jcmVhdGVfaW5zdGFuY2UobWlkKCpwSW5zdGFuY2UpLCAqcEluc3RhbmNlLCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50LCBwQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpOworCisgICAgLy8gcmVtb3ZlIHRoZSBsb2FkZXIgZXh0ZW5kZWQgY3JlYXRlSW5mbyBzdHJ1Y3R1cmUKKyAgICBWa0luc3RhbmNlQ3JlYXRlSW5mbyBsb2NhbENyZWF0ZUluZm87CisgICAgbWVtY3B5KCZsb2NhbENyZWF0ZUluZm8sIHBDcmVhdGVJbmZvLCBzaXplb2YobG9jYWxDcmVhdGVJbmZvKSk7CisKKyAgICAvLyBBbGxvYyBzcGFjZSB0byBjb3B5IHBvaW50ZXJzCisgICAgaWYgKGxvY2FsQ3JlYXRlSW5mby5lbmFibGVkTGF5ZXJDb3VudCA+IDApCisgICAgICAgIGxvY2FsQ3JlYXRlSW5mby5wcEVuYWJsZWRMYXllck5hbWVzID0gKGNvbnN0IGNoYXIqIGNvbnN0KikgbWFsbG9jKGxvY2FsQ3JlYXRlSW5mby5lbmFibGVkTGF5ZXJDb3VudCAqIHNpemVvZihjaGFyKikpOworICAgIGlmIChsb2NhbENyZWF0ZUluZm8uZW5hYmxlZEV4dGVuc2lvbkNvdW50ID4gMCkKKyAgICAgICAgbG9jYWxDcmVhdGVJbmZvLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gKGNvbnN0IGNoYXIqIGNvbnN0KikgbWFsbG9jKGxvY2FsQ3JlYXRlSW5mby5lbmFibGVkRXh0ZW5zaW9uQ291bnQgKiBzaXplb2YoY2hhciopKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsKKyAgICAgICAgY2hhciAqKnBwTmFtZSA9IChjaGFyICoqKSAmbG9jYWxDcmVhdGVJbmZvLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldOworICAgICAgICAqcHBOYW1lID0gKGNoYXIgKikgcENyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldOworICAgIH0KKworICAgIC8vIElmIGFwcCByZXF1ZXN0cyB2a3RyYWNlIGxheWVyLCBkb24ndCByZWNvcmQgdGhhdCBpbiB0aGUgdHJhY2UKKyAgICBjaGFyICoqcHBOYW1lID0gKGNoYXIgKiopICZsb2NhbENyZWF0ZUluZm8ucHBFbmFibGVkTGF5ZXJOYW1lc1swXTsKKyAgICBmb3IgKGkgPSAwIDsgaSA8IHBDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAoIlZLX0xBWUVSX0xVTkFSR192a3RyYWNlIiwgcENyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXNbaV0pID09IDApIHsKKyAgICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgZW5hYmxlZCBsYXllciBjb3VudCBhbmQgc2tpcCBjb3B5aW5nIHRoZSBwb2ludGVyCisgICAgICAgICAgICBsb2NhbENyZWF0ZUluZm8uZW5hYmxlZExheWVyQ291bnQtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENvcHkgcG9pbnRlciBhbmQgaW5jcmVtZW50IHdyaXRlIHBvaW50ZXIgZm9yIGV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAgICAgKnBwTmFtZSsrID0gKGNoYXIgKikgcENyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2xvY2FsQ3JlYXRlSW5mby5wTmV4dCA9IHN0cmlwX2NyZWF0ZV9leHRlbnNpb25zKHBDcmVhdGVJbmZvLT5wTmV4dCk7CisgICAgLy8gVGhlIHBOZXh0IHBvaW50ZXIgaXNuJ3QgZ2V0dGluZyBtYXJzaGFsbGVkIGludG8gdGhlIHRyYWNlIGJ1ZmZlciBwcm9wZXJseSBhbnl3YXksIHNvCisgICAgLy8gc2V0IGl0IHRvIE5VTEwgc28gdGhhdCByZXBsYXkgZG9lcyBub3QgdHJpcCBvdmVyIGl0LgorICAgIGxvY2FsQ3JlYXRlSW5mby5wTmV4dCA9IE5VTEw7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NyZWF0ZUluc3RhbmNlLCBzaXplb2YoVmtJbnN0YW5jZSkgKyBnZXRfc3RydWN0X2NoYWluX3NpemUoKHZvaWQqKSZsb2NhbENyZWF0ZUluZm8pICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykpOworICAgIHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSA9IHZrdHJhY2VTdGFydFRpbWU7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lID0gc3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgPSBlbmRUaW1lOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0NyZWF0ZUluc3RhbmNlKHBIZWFkZXIpOworCisgICAgYWRkX1ZrSW5zdGFuY2VDcmVhdGVJbmZvX3RvX3BhY2tldChwSGVhZGVyLCAoVmtJbnN0YW5jZUNyZWF0ZUluZm8qKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSwgKFZrSW5zdGFuY2VDcmVhdGVJbmZvKikgJmxvY2FsQ3JlYXRlSW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvciksIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpLCBOVUxMKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wSW5zdGFuY2UpLCBzaXplb2YoVmtJbnN0YW5jZSksIHBJbnN0YW5jZSk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wSW5zdGFuY2UpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisKKyAgICBpZiAobG9jYWxDcmVhdGVJbmZvLmVuYWJsZWRMYXllckNvdW50ID4gMCkKKyAgICAgICAgZnJlZSgodm9pZCAqKWxvY2FsQ3JlYXRlSW5mby5wcEVuYWJsZWRMYXllck5hbWVzKTsKKyAgICBpZiAobG9jYWxDcmVhdGVJbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudCA+IDApCisgICAgICAgIGZyZWUoKHZvaWQgKilsb2NhbENyZWF0ZUluZm8ucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrRGVzdHJveUluc3RhbmNlKAorICAgIFZrSW5zdGFuY2UgaW5zdGFuY2UsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBwYWNrZXRfdmtEZXN0cm95SW5zdGFuY2UqIHBQYWNrZXQgPSBOVUxMOworICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KGluc3RhbmNlKTsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrRGVzdHJveUluc3RhbmNlLCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSk7CisgICAgbWlkKGluc3RhbmNlKS0+aW5zdFRhYmxlLkRlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZSwgcEFsbG9jYXRvcik7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrRGVzdHJveUluc3RhbmNlKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvciksIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpLCBOVUxMKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIGdfaW5zdGFuY2VEYXRhTWFwLmVyYXNlKGtleSk7CisjaWYgZGVmaW5lZChVU0VfUEFHRUdVQVJEX1NQRUVEVVApICYmICFkZWZpbmVkKFBBR0VHVUFSRF9NRU1DUFlfVVNFX1BQTF9MSUIpCisJdmt0cmFjZV9wYWdlZ3VhcmRfZG9uZV9tdWx0aV90aHJlYWRzX21lbWNweSgpOworI2VuZGlmCit9CisKKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0NyZWF0ZVJlbmRlclBhc3MoCisgICAgVmtEZXZpY2UgZGV2aWNlLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8qIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogcEFsbG9jYXRvciwKKyAgICBWa1JlbmRlclBhc3MqIHBSZW5kZXJQYXNzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrQ3JlYXRlUmVuZGVyUGFzcyogcFBhY2tldCA9IE5VTEw7CisgICAgLy8gYmVnaW4gY3VzdG9tIGNvZGUgKGdldF9zdHJ1Y3RfY2hhaW5fc2l6ZSkKKyAgICB1aW50MzJfdCBhdHRhY2htZW50Q291bnQgPSAocENyZWF0ZUluZm8gIT0gTlVMTCAmJiAocENyZWF0ZUluZm8tPnBBdHRhY2htZW50cyAhPSBOVUxMKSkgPyBwQ3JlYXRlSW5mby0+YXR0YWNobWVudENvdW50IDogMDsKKyAgICB1aW50MzJfdCBkZXBlbmRlbmN5Q291bnQgPSAocENyZWF0ZUluZm8gIT0gTlVMTCAmJiAocENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXMgIT0gTlVMTCkpID8gcENyZWF0ZUluZm8tPmRlcGVuZGVuY3lDb3VudCA6IDA7CisgICAgdWludDMyX3Qgc3VicGFzc0NvdW50ID0gKHBDcmVhdGVJbmZvICE9IE5VTEwgJiYgKHBDcmVhdGVJbmZvLT5wU3VicGFzc2VzICE9IE5VTEwpKSA/IHBDcmVhdGVJbmZvLT5zdWJwYXNzQ291bnQgOiAwOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtDcmVhdGVSZW5kZXJQYXNzLCBnZXRfc3RydWN0X2NoYWluX3NpemUoKHZvaWQqKXBDcmVhdGVJbmZvKSArIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpICsgc2l6ZW9mKFZrUmVuZGVyUGFzcykpOworICAgIC8vIGVuZCBjdXN0b20gY29kZQorICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5DcmVhdGVSZW5kZXJQYXNzKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBSZW5kZXJQYXNzKTsKKyAgICB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZShwSGVhZGVyKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtDcmVhdGVSZW5kZXJQYXNzKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa1JlbmRlclBhc3NDcmVhdGVJbmZvKSwgcENyZWF0ZUluZm8pOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wQXR0YWNobWVudHMpLCBhdHRhY2htZW50Q291bnQgKiBzaXplb2YoVmtBdHRhY2htZW50RGVzY3JpcHRpb24pLCBwQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cERlcGVuZGVuY2llcyksIGRlcGVuZGVuY3lDb3VudCAqIHNpemVvZihWa1N1YnBhc3NEZXBlbmRlbmN5KSwgcENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXMpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wU3VicGFzc2VzKSwgc3VicGFzc0NvdW50ICogc2l6ZW9mKFZrU3VicGFzc0Rlc2NyaXB0aW9uKSwgcENyZWF0ZUluZm8tPnBTdWJwYXNzZXMpOworICAgIHVpbnQzMl90IGk7CisgICAgZm9yIChpPTA7IGkgPCBwUGFja2V0LT5wQ3JlYXRlSW5mby0+c3VicGFzc0NvdW50OyBpKyspIHsKKyAgICAgICAgVmtTdWJwYXNzRGVzY3JpcHRpb24gKnBTdWJwYXNzID0gKFZrU3VicGFzc0Rlc2NyaXB0aW9uICopICZwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tpXTsKKyAgICAgICAgY29uc3QgVmtTdWJwYXNzRGVzY3JpcHRpb24gKnBTcCA9ICZwQ3JlYXRlSW5mby0+cFN1YnBhc3Nlc1tpXTsKKyAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFN1YnBhc3MtPnBJbnB1dEF0dGFjaG1lbnRzKSwgcFN1YnBhc3MtPmlucHV0QXR0YWNobWVudENvdW50ICogc2l6ZW9mKFZrQXR0YWNobWVudFJlZmVyZW5jZSksIHBTcC0+cElucHV0QXR0YWNobWVudHMpOworICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwU3VicGFzcy0+cElucHV0QXR0YWNobWVudHMpKTsKKyAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFN1YnBhc3MtPnBDb2xvckF0dGFjaG1lbnRzKSwgcFN1YnBhc3MtPmNvbG9yQXR0YWNobWVudENvdW50ICogc2l6ZW9mKFZrQXR0YWNobWVudFJlZmVyZW5jZSksIHBTcC0+cENvbG9yQXR0YWNobWVudHMpOworICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwU3VicGFzcy0+cENvbG9yQXR0YWNobWVudHMpKTsKKyAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFN1YnBhc3MtPnBSZXNvbHZlQXR0YWNobWVudHMpLCBwU3VicGFzcy0+Y29sb3JBdHRhY2htZW50Q291bnQgKiBzaXplb2YoVmtBdHRhY2htZW50UmVmZXJlbmNlKSwgcFNwLT5wUmVzb2x2ZUF0dGFjaG1lbnRzKTsKKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFN1YnBhc3MtPnBSZXNvbHZlQXR0YWNobWVudHMpKTsKKyAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFN1YnBhc3MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSwgMSAqIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpLCBwU3AtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTsKKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFN1YnBhc3MtPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSk7CisgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBTdWJwYXNzLT5wUHJlc2VydmVBdHRhY2htZW50cyksIHBTdWJwYXNzLT5wcmVzZXJ2ZUF0dGFjaG1lbnRDb3VudCAqIHNpemVvZihWa0F0dGFjaG1lbnRSZWZlcmVuY2UpLCBwU3AtPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzKTsKKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFN1YnBhc3MtPnBQcmVzZXJ2ZUF0dGFjaG1lbnRzKSk7CisgICAgfQorICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpLCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSwgTlVMTCk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFJlbmRlclBhc3MpLCBzaXplb2YoVmtSZW5kZXJQYXNzKSwgcFJlbmRlclBhc3MpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBEZXBlbmRlbmNpZXMpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFN1YnBhc3NlcykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvcikpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBSZW5kZXJQYXNzKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgY29uc3QgY2hhciogcExheWVyTmFtZSwKKyAgICB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsCisgICAgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzKiBwUHJvcGVydGllcykKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0VudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMqIHBQYWNrZXQgPSBOVUxMOworICAgIHVpbnQ2NF90IHN0YXJ0VGltZTsKKyAgICB1aW50NjRfdCBlbmRUaW1lOworICAgIHVpbnQ2NF90IHZrdHJhY2VTdGFydFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgc3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIC8vIE9ubHkgY2FsbCBkb3duIGNoYWluIGlmIHF1ZXJ5aW5nIElDRCByYXRoZXIgdGhhbiBsYXllciBkZXZpY2UgZXh0ZW5zaW9ucworICAgIGlmIChwTGF5ZXJOYW1lID09IE5VTEwpCisgICAgICAgIHJlc3VsdCA9IG1pZChwaHlzaWNhbERldmljZSktPmluc3RUYWJsZS5FbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBOVUxMLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwUHJvcGVydHlDb3VudCA9IDA7CisgICAgICAgIHJldHVybiBWS19TVUNDRVNTOworICAgIH0KKyAgICBlbmRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzLCAoKHBMYXllck5hbWUgIT0gTlVMTCkgPyBST1VORFVQX1RPXzQoc3RybGVuKHBMYXllck5hbWUpICsgMSkgOiAwKSArIHNpemVvZih1aW50MzJfdCkgKyAoKnBQcm9wZXJ0eUNvdW50ICogc2l6ZW9mKFZrRXh0ZW5zaW9uUHJvcGVydGllcykpKTsKKyAgICBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUgPSB2a3RyYWNlU3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSA9IHN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lID0gZW5kVGltZTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlID0gcGh5c2ljYWxEZXZpY2U7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cExheWVyTmFtZSksICgocExheWVyTmFtZSAhPSBOVUxMKSA/IFJPVU5EVVBfVE9fNChzdHJsZW4ocExheWVyTmFtZSkgKyAxKSA6IDApLCBwTGF5ZXJOYW1lKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJvcGVydHlDb3VudCksIHNpemVvZih1aW50MzJfdCksIHBQcm9wZXJ0eUNvdW50KTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJvcGVydGllcyksICpwUHJvcGVydHlDb3VudCAqIHNpemVvZihWa0V4dGVuc2lvblByb3BlcnRpZXMpLCBwUHJvcGVydGllcyk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBMYXllck5hbWUpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJvcGVydHlDb3VudCkpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQcm9wZXJ0aWVzKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCogcFByb3BlcnR5Q291bnQsCisgICAgVmtMYXllclByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKiBwUGFja2V0ID0gTlVMTDsKKyAgICB1aW50NjRfdCBzdGFydFRpbWU7CisgICAgdWludDY0X3QgZW5kVGltZTsKKyAgICB1aW50NjRfdCB2a3RyYWNlU3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHN0YXJ0VGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICByZXN1bHQgPSBtaWQocGh5c2ljYWxEZXZpY2UpLT5pbnN0VGFibGUuRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworICAgIGVuZFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcywgc2l6ZW9mKHVpbnQzMl90KSArICgqcFByb3BlcnR5Q291bnQgKiBzaXplb2YoVmtMYXllclByb3BlcnRpZXMpKSk7CisgICAgcEhlYWRlci0+dmt0cmFjZV9iZWdpbl90aW1lID0gdmt0cmFjZVN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWUgPSBzdGFydFRpbWU7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9lbmRfdGltZSA9IGVuZFRpbWU7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlID0gcGh5c2ljYWxEZXZpY2U7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFByb3BlcnR5Q291bnQpLCBzaXplb2YodWludDMyX3QpLCBwUHJvcGVydHlDb3VudCk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFByb3BlcnRpZXMpLCAqcFByb3BlcnR5Q291bnQgKiBzaXplb2YoVmtMYXllclByb3BlcnRpZXMpLCBwUHJvcGVydGllcyk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQcm9wZXJ0eUNvdW50KSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFByb3BlcnRpZXMpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKy8vIFRPRE8gOiBUaGlzIHNob3VsZCBiZSBwcmV0dHkgZWFzeSB0byBmaXQgaW50byBjb2RlZ2VuLiBEb24ndCBuZWVkIHRvIG1ha2UgdGhlIGNhbGwgcHJpb3IgdG8gY3JlYXRpbmcgcGFja2V0CisvLyAgSnVzdCBuZWVkIHRvIGFjY291bnQgZm9yICJjb3VudCIgbnVtYmVyIG9mIHF1ZXVlIHByb3BlcnRpZXMKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKAorICAgIFZrUGh5c2ljYWxEZXZpY2UgcGh5c2ljYWxEZXZpY2UsCisgICAgdWludDMyX3QqIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsCisgICAgVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMqIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKiBwUGFja2V0ID0gTlVMTDsKKyAgICB1aW50NjRfdCBzdGFydFRpbWU7CisgICAgdWludDY0X3QgZW5kVGltZTsKKyAgICB1aW50NjRfdCB2a3RyYWNlU3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHN0YXJ0VGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICBtaWQocGh5c2ljYWxEZXZpY2UpLT5pbnN0VGFibGUuR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQsIHBRdWV1ZUZhbWlseVByb3BlcnRpZXMpOworICAgIGVuZFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzLCBzaXplb2YodWludDMyX3QpICsgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgKiBzaXplb2YoVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMpKTsKKyAgICBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUgPSB2a3RyYWNlU3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSA9IHN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lID0gZW5kVGltZTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5waHlzaWNhbERldmljZSA9IHBoeXNpY2FsRGV2aWNlOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQpLCBzaXplb2YodWludDMyX3QpLCBwUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50KTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUXVldWVGYW1pbHlQcm9wZXJ0aWVzKSwgKnBRdWV1ZUZhbWlseVByb3BlcnR5Q291bnQgKiBzaXplb2YoVmtRdWV1ZUZhbWlseVByb3BlcnRpZXMpLCBwUXVldWVGYW1pbHlQcm9wZXJ0aWVzKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUXVldWVGYW1pbHlQcm9wZXJ0eUNvdW50KSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFF1ZXVlRmFtaWx5UHJvcGVydGllcykpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcygKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlLAorICAgIHVpbnQzMl90KiBwUGh5c2ljYWxEZXZpY2VDb3VudCwKKyAgICBWa1BoeXNpY2FsRGV2aWNlKiBwUGh5c2ljYWxEZXZpY2VzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKiBwUGFja2V0ID0gTlVMTDsKKyAgICB1aW50NjRfdCBzdGFydFRpbWU7CisgICAgdWludDY0X3QgZW5kVGltZTsKKyAgICB1aW50NjRfdCB2a3RyYWNlU3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIC8vVE9ETyBtYWtlIHN1cmUgY2FuIGhhbmRsZSBiZWluZyBjYWxsZWQgdHdpY2Ugd2l0aCBwUEQgPT0gMAorICAgIFNFTkRfRU5UUllQT0lOVF9JRCh2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyk7CisgICAgc3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHJlc3VsdCA9IG1pZChpbnN0YW5jZSktPmluc3RUYWJsZS5FbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsIHBQaHlzaWNhbERldmljZUNvdW50LCBwUGh5c2ljYWxEZXZpY2VzKTsKKyAgICBlbmRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMsIHNpemVvZih1aW50MzJfdCkgKyAoKHBQaHlzaWNhbERldmljZXMgJiYgcFBoeXNpY2FsRGV2aWNlQ291bnQpID8gKnBQaHlzaWNhbERldmljZUNvdW50ICogc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpIDogMCkpOworICAgIHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSA9IHZrdHJhY2VTdGFydFRpbWU7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lID0gc3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgPSBlbmRUaW1lOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQaHlzaWNhbERldmljZUNvdW50KSwgc2l6ZW9mKHVpbnQzMl90KSwgcFBoeXNpY2FsRGV2aWNlQ291bnQpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQaHlzaWNhbERldmljZXMpLCAqcFBoeXNpY2FsRGV2aWNlQ291bnQqc2l6ZW9mKFZrUGh5c2ljYWxEZXZpY2UpLCBwUGh5c2ljYWxEZXZpY2VzKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFBoeXNpY2FsRGV2aWNlQ291bnQpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUGh5c2ljYWxEZXZpY2VzKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtHZXRRdWVyeVBvb2xSZXN1bHRzKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBWa1F1ZXJ5UG9vbCBxdWVyeVBvb2wsCisgICAgdWludDMyX3QgZmlyc3RRdWVyeSwKKyAgICB1aW50MzJfdCBxdWVyeUNvdW50LAorICAgIHNpemVfdCBkYXRhU2l6ZSwKKyAgICB2b2lkKiBwRGF0YSwKKyAgICBWa0RldmljZVNpemUgc3RyaWRlLAorICAgIFZrUXVlcnlSZXN1bHRGbGFncyBmbGFncykKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0dldFF1ZXJ5UG9vbFJlc3VsdHMqIHBQYWNrZXQgPSBOVUxMOworICAgIHVpbnQ2NF90IHN0YXJ0VGltZTsKKyAgICB1aW50NjRfdCBlbmRUaW1lOworICAgIHVpbnQ2NF90IHZrdHJhY2VTdGFydFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgc3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5HZXRRdWVyeVBvb2xSZXN1bHRzKGRldmljZSwgcXVlcnlQb29sLCBmaXJzdFF1ZXJ5LCBxdWVyeUNvdW50LCBkYXRhU2l6ZSwgcERhdGEsIHN0cmlkZSwgZmxhZ3MpOworICAgIGVuZFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0dldFF1ZXJ5UG9vbFJlc3VsdHMsIGRhdGFTaXplKTsKKyAgICBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUgPSB2a3RyYWNlU3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSA9IHN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lID0gZW5kVGltZTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtHZXRRdWVyeVBvb2xSZXN1bHRzKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICBwUGFja2V0LT5xdWVyeVBvb2wgPSBxdWVyeVBvb2w7CisgICAgcFBhY2tldC0+Zmlyc3RRdWVyeSA9IGZpcnN0UXVlcnk7CisgICAgcFBhY2tldC0+cXVlcnlDb3VudCA9IHF1ZXJ5Q291bnQ7CisgICAgcFBhY2tldC0+ZGF0YVNpemUgPSBkYXRhU2l6ZTsKKyAgICBwUGFja2V0LT5zdHJpZGUgPSBzdHJpZGU7CisgICAgcFBhY2tldC0+ZmxhZ3MgPSBmbGFnczsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGF0YSksIGRhdGFTaXplLCBwRGF0YSk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEYXRhKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXRBbGxvY2F0ZUluZm8qIHBBbGxvY2F0ZUluZm8sCisgICAgVmtEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvclNldHMpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKiBwUGFja2V0ID0gTlVMTDsKKyAgICB1aW50NjRfdCBzdGFydFRpbWU7CisgICAgdWludDY0X3QgZW5kVGltZTsKKyAgICB1aW50NjRfdCB2a3RyYWNlU3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIFNFTkRfRU5UUllQT0lOVF9JRCh2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMpOworICAgIHN0YXJ0VGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIHBBbGxvY2F0ZUluZm8sIHBEZXNjcmlwdG9yU2V0cyk7CisgICAgZW5kVGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQWxsb2NhdGVEZXNjcmlwdG9yU2V0cywgdmtfc2l6ZV92a2Rlc2NyaXB0b3JzZXRhbGxvY2F0ZWluZm8ocEFsbG9jYXRlSW5mbykgKyAocEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50ICogc2l6ZW9mKFZrRGVzY3JpcHRvclNldCkpKTsKKyAgICBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUgPSB2a3RyYWNlU3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSA9IHN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lID0gZW5kVGltZTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtBbGxvY2F0ZURlc2NyaXB0b3JTZXRzKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdGVJbmZvKSwgc2l6ZW9mKFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyksIHBBbGxvY2F0ZUluZm8pOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzKSwgcFBhY2tldC0+cEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50ICogc2l6ZW9mKFZrRGVzY3JpcHRvclNldExheW91dCksIHBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGVzY3JpcHRvclNldHMpLCBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQgKiBzaXplb2YoVmtEZXNjcmlwdG9yU2V0KSwgcERlc2NyaXB0b3JTZXRzKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRlSW5mby0+cFNldExheW91dHMpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGVzY3JpcHRvclNldHMpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdGVJbmZvKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBfX0hPT0tFRF92a1VwZGF0ZURlc2NyaXB0b3JTZXRzKAorVmtEZXZpY2UgZGV2aWNlLAorICAgICAgICB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICAgICAgY29uc3QgVmtXcml0ZURlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yV3JpdGVzLAorICAgICAgICB1aW50MzJfdCBkZXNjcmlwdG9yQ29weUNvdW50LAorICAgICAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvckNvcGllcyk7CisvLyBNYW51YWxseSB3cml0dGVuIGJlY2F1c2UgaXQgbmVlZHMgdG8gdXNlIGdldF9zdHJ1Y3RfY2hhaW5fc2l6ZSBhbmQgYWxsb2NhdGUgc29tZSBleHRyYSBwb2ludGVycyAod2h5PykKKy8vIEFsc28gc2luY2UgaXQgbmVlZHMgdG8gYXBwIHRoZSBhcnJheSBvZiBwb2ludGVycyBhbmQgc3ViLWJ1ZmZlcnMgKHNlZSBjb21tZW50cyBpbiBmdW5jdGlvbikKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBfX0hPT0tFRF92a1VwZGF0ZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yV3JpdGVDb3VudCwKKyAgICBjb25zdCBWa1dyaXRlRGVzY3JpcHRvclNldCogcERlc2NyaXB0b3JXcml0ZXMsCisgICAgdWludDMyX3QgZGVzY3JpcHRvckNvcHlDb3VudCwKKyAgICBjb25zdCBWa0NvcHlEZXNjcmlwdG9yU2V0KiBwRGVzY3JpcHRvckNvcGllcyApCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIHBhY2tldF92a1VwZGF0ZURlc2NyaXB0b3JTZXRzKiBwUGFja2V0ID0gTlVMTDsKKyAgICAvLyBiZWdpbiBjdXN0b20gY29kZQorICAgIHNpemVfdCBhcnJheUJ5dGVDb3VudCA9IDA7CisgICAgc2l6ZV90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGFycmF5Qnl0ZUNvdW50ICs9IGdldF9zdHJ1Y3RfY2hhaW5fc2l6ZSgmcERlc2NyaXB0b3JXcml0ZXNbaV0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjcmlwdG9yQ29weUNvdW50OyBpKyspCisgICAgeworICAgICAgICBhcnJheUJ5dGVDb3VudCArPSBnZXRfc3RydWN0X2NoYWluX3NpemUoJnBEZXNjcmlwdG9yQ29waWVzW2ldKTsKKyAgICB9CisKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrVXBkYXRlRGVzY3JpcHRvclNldHMsIGFycmF5Qnl0ZUNvdW50KTsKKyAgICAvLyBlbmQgY3VzdG9tIGNvZGUKKworICAgIG1kZChkZXZpY2UpLT5kZXZUYWJsZS5VcGRhdGVEZXNjcmlwdG9yU2V0cyhkZXZpY2UsIGRlc2NyaXB0b3JXcml0ZUNvdW50LCBwRGVzY3JpcHRvcldyaXRlcywgZGVzY3JpcHRvckNvcHlDb3VudCwgcERlc2NyaXB0b3JDb3BpZXMpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a1VwZGF0ZURlc2NyaXB0b3JTZXRzKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICBwUGFja2V0LT5kZXNjcmlwdG9yV3JpdGVDb3VudCA9IGRlc2NyaXB0b3JXcml0ZUNvdW50OworICAgIC8vIGJlZ2luIGN1c3RvbSBjb2RlCisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXMpLCBkZXNjcmlwdG9yV3JpdGVDb3VudCAqIHNpemVvZihWa1dyaXRlRGVzY3JpcHRvclNldCksIHBEZXNjcmlwdG9yV3JpdGVzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVzY3JpcHRvcldyaXRlQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHN3aXRjaCAocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0uZGVzY3JpcHRvclR5cGUpIHsKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFRF9JTUFHRToKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRToKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfSU5QVVRfQVRUQUNITUVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wSW1hZ2VJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudCAqIHNpemVvZihWa0Rlc2NyaXB0b3JJbWFnZUluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXNbaV0ucEltYWdlSW5mbyk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEltYWdlSW5mbykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX1RFWEVMX0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wVGV4ZWxCdWZmZXJWaWV3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JDb3VudCAqIHNpemVvZihWa0J1ZmZlclZpZXcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc2NyaXB0b3JXcml0ZXNbaV0ucFRleGVsQnVmZmVyVmlldyk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucFRleGVsQnVmZmVyVmlldykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOgorICAgICAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9TVE9SQUdFX0JVRkZFUjoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfVU5JRk9STV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wQnVmZmVySW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlc1tpXS5kZXNjcmlwdG9yQ291bnQgKiBzaXplb2YoVmtEZXNjcmlwdG9yQnVmZmVySW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzY3JpcHRvcldyaXRlc1tpXS5wQnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEJ1ZmZlckluZm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXMpKTsKKworICAgIHBQYWNrZXQtPmRlc2NyaXB0b3JDb3B5Q291bnQgPSBkZXNjcmlwdG9yQ29weUNvdW50OworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEZXNjcmlwdG9yQ29waWVzKSwgZGVzY3JpcHRvckNvcHlDb3VudCAqIHNpemVvZihWa0NvcHlEZXNjcmlwdG9yU2V0KSwgcERlc2NyaXB0b3JDb3BpZXMpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEZXNjcmlwdG9yQ29waWVzKSk7CisgICAgLy8gZW5kIGN1c3RvbSBjb2RlCisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrUXVldWVTdWJtaXQoCisgICAgVmtRdWV1ZSBxdWV1ZSwKKyAgICB1aW50MzJfdCBzdWJtaXRDb3VudCwKKyAgICBjb25zdCBWa1N1Ym1pdEluZm8qIHBTdWJtaXRzLAorICAgIFZrRmVuY2UgZmVuY2UpCit7CisjaWZkZWYgVVNFX1BBR0VHVUFSRF9TUEVFRFVQCisgICAgcGFnZWd1YXJkRW50ZXIoKTsKKyAgICBmbHVzaEFsbENoYW5nZWRNYXBwZWRNZW1vcnkoJnZrRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXNXaXRob3V0QVBJQ2FsbCk7CisgICAgcmVzZXRBbGxSZWFkRmxhZ0FuZFBhZ2VHdWFyZCgpOworICAgIHBhZ2VndWFyZEV4aXQoKTsKKyNlbmRpZgorICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrUXVldWVTdWJtaXQqIHBQYWNrZXQgPSBOVUxMOworICAgIHNpemVfdCBhcnJheUJ5dGVDb3VudCA9IDA7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgZm9yIChpPTA7IGk8c3VibWl0Q291bnQ7ICsraSkgeworICAgICAgICBhcnJheUJ5dGVDb3VudCArPSB2a19zaXplX3Zrc3VibWl0aW5mbygmcFN1Ym1pdHNbaV0pOworICAgIH0KKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrUXVldWVTdWJtaXQsIGFycmF5Qnl0ZUNvdW50KTsKKyAgICByZXN1bHQgPSBtZGQocXVldWUpLT5kZXZUYWJsZS5RdWV1ZVN1Ym1pdChxdWV1ZSwgc3VibWl0Q291bnQsIHBTdWJtaXRzLCBmZW5jZSk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrUXVldWVTdWJtaXQocEhlYWRlcik7CisgICAgcFBhY2tldC0+cXVldWUgPSBxdWV1ZTsKKyAgICBwUGFja2V0LT5zdWJtaXRDb3VudCA9IHN1Ym1pdENvdW50OworICAgIHBQYWNrZXQtPmZlbmNlID0gZmVuY2U7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdWJtaXRzKSwgc3VibWl0Q291bnQqc2l6ZW9mKFZrU3VibWl0SW5mbyksIHBTdWJtaXRzKTsKKyAgICBmb3IgKGk9MDsgaTxzdWJtaXRDb3VudDsgKytpKSB7CisgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdWJtaXRzW2ldLnBDb21tYW5kQnVmZmVycyksIHBQYWNrZXQtPnBTdWJtaXRzW2ldLmNvbW1hbmRCdWZmZXJDb3VudCAqIHNpemVvZihWa0NvbW1hbmRCdWZmZXIpLCBwU3VibWl0c1tpXS5wQ29tbWFuZEJ1ZmZlcnMpOworICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VibWl0c1tpXS5wQ29tbWFuZEJ1ZmZlcnMpKTsKKyAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN1Ym1pdHNbaV0ucFdhaXRTZW1hcGhvcmVzKSwgcFBhY2tldC0+cFN1Ym1pdHNbaV0ud2FpdFNlbWFwaG9yZUNvdW50ICogc2l6ZW9mKFZrU2VtYXBob3JlKSwgcFN1Ym1pdHNbaV0ucFdhaXRTZW1hcGhvcmVzKTsKKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN1Ym1pdHNbaV0ucFdhaXRTZW1hcGhvcmVzKSk7CisgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdWJtaXRzW2ldLnBTaWduYWxTZW1hcGhvcmVzKSwgcFBhY2tldC0+cFN1Ym1pdHNbaV0uc2lnbmFsU2VtYXBob3JlQ291bnQgKiBzaXplb2YoVmtTZW1hcGhvcmUpLCBwU3VibWl0c1tpXS5wU2lnbmFsU2VtYXBob3Jlcyk7CisgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdWJtaXRzW2ldLnBTaWduYWxTZW1hcGhvcmVzKSk7CisgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdWJtaXRzW2ldLnBXYWl0RHN0U3RhZ2VNYXNrKSwgc2l6ZW9mKFZrUGlwZWxpbmVTdGFnZUZsYWdzKSwgcFN1Ym1pdHNbaV0ucFdhaXREc3RTdGFnZU1hc2spOworICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VibWl0c1tpXS5wV2FpdERzdFN0YWdlTWFzaykpOworICAgIH0KKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VibWl0cykpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrUXVldWVCaW5kU3BhcnNlKAorICAgIFZrUXVldWUgcXVldWUsCisgICAgdWludDMyX3QgYmluZEluZm9Db3VudCwKKyAgICBjb25zdCBWa0JpbmRTcGFyc2VJbmZvKiBwQmluZEluZm8sCisgICAgVmtGZW5jZSBmZW5jZSkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a1F1ZXVlQmluZFNwYXJzZSogcFBhY2tldCA9IE5VTEw7CisgICAgc2l6ZV90IGFycmF5Qnl0ZUNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGk8YmluZEluZm9Db3VudDsgKytpKSB7CisgICAgICAgIGFycmF5Qnl0ZUNvdW50ICs9IHZrX3NpemVfdmtiaW5kc3BhcnNlaW5mbygmcEJpbmRJbmZvW2ldKTsKKyAgICB9CisKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrUXVldWVCaW5kU3BhcnNlLCBhcnJheUJ5dGVDb3VudCArIDIgKiBzaXplb2YoVmtEZXZpY2VNZW1vcnkpKTsKKyAgICByZXN1bHQgPSBtZGQocXVldWUpLT5kZXZUYWJsZS5RdWV1ZUJpbmRTcGFyc2UocXVldWUsIGJpbmRJbmZvQ291bnQsIHBCaW5kSW5mbywgZmVuY2UpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a1F1ZXVlQmluZFNwYXJzZShwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5xdWV1ZSA9IHF1ZXVlOworICAgIHBQYWNrZXQtPmJpbmRJbmZvQ291bnQgPSBiaW5kSW5mb0NvdW50OworICAgIHBQYWNrZXQtPmZlbmNlID0gZmVuY2U7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCaW5kSW5mbyksIGJpbmRJbmZvQ291bnQgKiBzaXplb2YoVmtCaW5kU3BhcnNlSW5mbyksIHBCaW5kSW5mbyk7CisKKyAgICBmb3IgKGkgPSAwOyBpPGJpbmRJbmZvQ291bnQ7ICsraSkgeworICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQmluZEluZm9baV0ucEJ1ZmZlckJpbmRzKSwgcFBhY2tldC0+cEJpbmRJbmZvW2ldLmJ1ZmZlckJpbmRDb3VudCAqIHNpemVvZihWa1NwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvKSwgcEJpbmRJbmZvW2ldLnBCdWZmZXJCaW5kcyk7CisJZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBQYWNrZXQtPnBCaW5kSW5mb1tpXS5idWZmZXJCaW5kQ291bnQ7IGorKykgeworICAgICAgICAgICAgVmtTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mbyAqcFNwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvID0gKFZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8gKikmcFBhY2tldC0+cEJpbmRJbmZvW2ldLnBCdWZmZXJCaW5kc1tqXTsKKyAgICAgICAgICAgIGNvbnN0IFZrU3BhcnNlQnVmZmVyTWVtb3J5QmluZEluZm8gKnBTcGFyc2VCdWZNZW1CbmRJbmYgPSAmcEJpbmRJbmZvW2ldLnBCdWZmZXJCaW5kc1tqXTsKKyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mby0+cEJpbmRzKSwgcFNwYXJzZUJ1ZmZlck1lbW9yeUJpbmRJbmZvLT5iaW5kQ291bnQgKiBzaXplb2YoVmtTcGFyc2VNZW1vcnlCaW5kKSwgcFNwYXJzZUJ1Zk1lbUJuZEluZi0+cEJpbmRzKTsKKyAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBTcGFyc2VCdWZmZXJNZW1vcnlCaW5kSW5mby0+cEJpbmRzKSk7CisgICAgICAgIH0KKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJpbmRJbmZvW2ldLnBCdWZmZXJCaW5kcykpOworCisgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCaW5kSW5mb1tpXS5wSW1hZ2VCaW5kcyksIHBQYWNrZXQtPnBCaW5kSW5mb1tpXS5pbWFnZUJpbmRDb3VudCAqIHNpemVvZihWa1NwYXJzZUltYWdlTWVtb3J5QmluZEluZm8pLCBwQmluZEluZm9baV0ucEltYWdlT3BhcXVlQmluZHMpOworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgcFBhY2tldC0+cEJpbmRJbmZvW2ldLmltYWdlQmluZENvdW50OyBqKyspIHsKKyAgICAgICAgICAgIFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyAqcFNwYXJzZUltYWdlTWVtb3J5QmluZEluZm8gPSAoVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvICopJnBQYWNrZXQtPnBCaW5kSW5mb1tpXS5wSW1hZ2VCaW5kc1tqXTsKKyAgICAgICAgICAgIGNvbnN0IFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyAqcFNwYXJzZUltZ01lbUJuZEluZiA9ICZwQmluZEluZm9baV0ucEltYWdlQmluZHNbal07CisgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby0+cEJpbmRzKSwgcFNwYXJzZUltYWdlTWVtb3J5QmluZEluZm8tPmJpbmRDb3VudCAqIHNpemVvZihWa1NwYXJzZUltYWdlTWVtb3J5QmluZCksIHBTcGFyc2VJbWdNZW1CbmRJbmYtPnBCaW5kcyk7CisgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mby0+cEJpbmRzKSk7CisgICAgICAgIH0KKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJpbmRJbmZvW2ldLnBJbWFnZUJpbmRzKSk7CisKKyAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJpbmRJbmZvW2ldLnBJbWFnZU9wYXF1ZUJpbmRzKSwgcFBhY2tldC0+cEJpbmRJbmZvW2ldLmltYWdlT3BhcXVlQmluZENvdW50ICogc2l6ZW9mKFZrU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyksIHBCaW5kSW5mb1tpXS5wSW1hZ2VPcGFxdWVCaW5kcyk7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwUGFja2V0LT5wQmluZEluZm9baV0uaW1hZ2VPcGFxdWVCaW5kQ291bnQ7IGorKykgeworICAgICAgICAgICAgVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvICpwU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mbyA9IChWa1NwYXJzZUltYWdlT3BhcXVlTWVtb3J5QmluZEluZm8gKikmcFBhY2tldC0+cEJpbmRJbmZvW2ldLnBJbWFnZU9wYXF1ZUJpbmRzW2pdOworICAgICAgICAgICAgY29uc3QgVmtTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvICpwU3BhcnNlSW1nT3BxTWVtQm5kSW5mID0gJnBCaW5kSW5mb1tpXS5wSW1hZ2VPcGFxdWVCaW5kc1tqXTsKKyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBTcGFyc2VJbWFnZU9wYXF1ZU1lbW9yeUJpbmRJbmZvLT5wQmluZHMpLCBwU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mby0+YmluZENvdW50ICogc2l6ZW9mKFZrU3BhcnNlTWVtb3J5QmluZCksIHBTcGFyc2VJbWdPcHFNZW1CbmRJbmYtPnBCaW5kcyk7CisgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwU3BhcnNlSW1hZ2VPcGFxdWVNZW1vcnlCaW5kSW5mby0+cEJpbmRzKSk7CisgICAgICAgIH0KKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJpbmRJbmZvW2ldLnBJbWFnZU9wYXF1ZUJpbmRzKSk7CisKKyAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJpbmRJbmZvW2ldLnBXYWl0U2VtYXBob3JlcyksIHBQYWNrZXQtPnBCaW5kSW5mb1tpXS53YWl0U2VtYXBob3JlQ291bnQgKiBzaXplb2YoVmtTZW1hcGhvcmUpLCBwQmluZEluZm9baV0ucFdhaXRTZW1hcGhvcmVzKTsKKyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJpbmRJbmZvW2ldLnBXYWl0U2VtYXBob3JlcykpOworCisgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCaW5kSW5mb1tpXS5wU2lnbmFsU2VtYXBob3JlcyksIHBQYWNrZXQtPnBCaW5kSW5mb1tpXS5zaWduYWxTZW1hcGhvcmVDb3VudCAqIHNpemVvZihWa1NlbWFwaG9yZSksIHBCaW5kSW5mb1tpXS5wU2lnbmFsU2VtYXBob3Jlcyk7CisgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCaW5kSW5mb1tpXS5wU2lnbmFsU2VtYXBob3JlcykpOworICAgIH0KKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQmluZEluZm8pKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQ21kV2FpdEV2ZW50cygKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50LAorICAgIGNvbnN0IFZrRXZlbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50cywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0YWdlTWFzaywKKyAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0YWdlTWFzaywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa01lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0J1ZmZlck1lbW9yeUJhcnJpZXIqICAgICAgICAgICAgICAgIHBCdWZmZXJNZW1vcnlCYXJyaWVycywKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTWVtb3J5QmFycmllckNvdW50LAorICAgIGNvbnN0IFZrSW1hZ2VNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgcEltYWdlTWVtb3J5QmFycmllcnMpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIHBhY2tldF92a0NtZFdhaXRFdmVudHMqIHBQYWNrZXQgPSBOVUxMOworICAgIHNpemVfdCBjdXN0b21TaXplOworICAgIGN1c3RvbVNpemUgPSAoZXZlbnRDb3VudCAqIHNpemVvZihWa0V2ZW50KSkgKyAobWVtb3J5QmFycmllckNvdW50ICogc2l6ZW9mKFZrTWVtb3J5QmFycmllcikpICsKKyAgICAgICAgICAgIChidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQgKiBzaXplb2YoVmtCdWZmZXJNZW1vcnlCYXJyaWVyKSkgKworICAgICAgICAgICAgKGltYWdlTWVtb3J5QmFycmllckNvdW50ICogc2l6ZW9mKFZrSW1hZ2VNZW1vcnlCYXJyaWVyKSk7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NtZFdhaXRFdmVudHMsIGN1c3RvbVNpemUpOworICAgIG1kZChjb21tYW5kQnVmZmVyKS0+ZGV2VGFibGUuQ21kV2FpdEV2ZW50cyhjb21tYW5kQnVmZmVyLCBldmVudENvdW50LCBwRXZlbnRzLCBzcmNTdGFnZU1hc2ssIGRzdFN0YWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUJhcnJpZXJDb3VudCwgcE1lbW9yeUJhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtb3J5QmFycmllckNvdW50LCBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0NtZFdhaXRFdmVudHMocEhlYWRlcik7CisgICAgcFBhY2tldC0+Y29tbWFuZEJ1ZmZlciA9IGNvbW1hbmRCdWZmZXI7CisgICAgcFBhY2tldC0+ZXZlbnRDb3VudCA9IGV2ZW50Q291bnQ7CisgICAgcFBhY2tldC0+c3JjU3RhZ2VNYXNrID0gc3JjU3RhZ2VNYXNrOworICAgIHBQYWNrZXQtPmRzdFN0YWdlTWFzayA9IGRzdFN0YWdlTWFzazsKKyAgICBwUGFja2V0LT5tZW1vcnlCYXJyaWVyQ291bnQgPSBtZW1vcnlCYXJyaWVyQ291bnQ7CisgICAgcFBhY2tldC0+YnVmZmVyTWVtb3J5QmFycmllckNvdW50ID0gYnVmZmVyTWVtb3J5QmFycmllckNvdW50OworICAgIHBQYWNrZXQtPmltYWdlTWVtb3J5QmFycmllckNvdW50ID0gaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQ7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEV2ZW50cyksIGV2ZW50Q291bnQgKiBzaXplb2YoVmtFdmVudCksIHBFdmVudHMpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBFdmVudHMpKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wTWVtb3J5QmFycmllcnMpLCBtZW1vcnlCYXJyaWVyQ291bnQgKiBzaXplb2YoVmtNZW1vcnlCYXJyaWVyKSwgcE1lbW9yeUJhcnJpZXJzKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQnVmZmVyTWVtb3J5QmFycmllcnMpLCBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQgKiBzaXplb2YoVmtCdWZmZXJNZW1vcnlCYXJyaWVyKSwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wSW1hZ2VNZW1vcnlCYXJyaWVycyksIGltYWdlTWVtb3J5QmFycmllckNvdW50ICogc2l6ZW9mKFZrSW1hZ2VNZW1vcnlCYXJyaWVyKSwgcEltYWdlTWVtb3J5QmFycmllcnMpOworCisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE1lbW9yeUJhcnJpZXJzKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnMpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIHZvaWQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0NtZFBpcGVsaW5lQmFycmllcigKKyAgICBWa0NvbW1hbmRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXIsCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGFnZU1hc2ssCisgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGFnZU1hc2ssCisgICAgVmtEZXBlbmRlbmN5RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5RmxhZ3MsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQsCisgICAgY29uc3QgVmtCdWZmZXJNZW1vcnlCYXJyaWVyKiAgICAgICAgICAgICAgICBwQnVmZmVyTWVtb3J5QmFycmllcnMsCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwKKyAgICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciogICAgICAgICAgICAgICAgIHBJbWFnZU1lbW9yeUJhcnJpZXJzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBwYWNrZXRfdmtDbWRQaXBlbGluZUJhcnJpZXIqIHBQYWNrZXQgPSBOVUxMOworICAgIHNpemVfdCBjdXN0b21TaXplOworICAgIGN1c3RvbVNpemUgPSAobWVtb3J5QmFycmllckNvdW50ICogc2l6ZW9mKFZrTWVtb3J5QmFycmllcikpICsKKyAgICAgICAgICAgIChidWZmZXJNZW1vcnlCYXJyaWVyQ291bnQgKiBzaXplb2YoVmtCdWZmZXJNZW1vcnlCYXJyaWVyKSkgKworICAgICAgICAgICAgKGltYWdlTWVtb3J5QmFycmllckNvdW50ICogc2l6ZW9mKFZrSW1hZ2VNZW1vcnlCYXJyaWVyKSk7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NtZFBpcGVsaW5lQmFycmllciwgY3VzdG9tU2l6ZSk7CisgICAgbWRkKGNvbW1hbmRCdWZmZXIpLT5kZXZUYWJsZS5DbWRQaXBlbGluZUJhcnJpZXIoY29tbWFuZEJ1ZmZlciwgc3JjU3RhZ2VNYXNrLCBkc3RTdGFnZU1hc2ssIGRlcGVuZGVuY3lGbGFncywgbWVtb3J5QmFycmllckNvdW50LCBwTWVtb3J5QmFycmllcnMsIGJ1ZmZlck1lbW9yeUJhcnJpZXJDb3VudCwgcEJ1ZmZlck1lbW9yeUJhcnJpZXJzLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCwgcEltYWdlTWVtb3J5QmFycmllcnMpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0NtZFBpcGVsaW5lQmFycmllcihwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5jb21tYW5kQnVmZmVyID0gY29tbWFuZEJ1ZmZlcjsKKyAgICBwUGFja2V0LT5zcmNTdGFnZU1hc2sgPSBzcmNTdGFnZU1hc2s7CisgICAgcFBhY2tldC0+ZHN0U3RhZ2VNYXNrID0gZHN0U3RhZ2VNYXNrOworICAgIHBQYWNrZXQtPmRlcGVuZGVuY3lGbGFncyA9IGRlcGVuZGVuY3lGbGFnczsKKyAgICBwUGFja2V0LT5tZW1vcnlCYXJyaWVyQ291bnQgPSBtZW1vcnlCYXJyaWVyQ291bnQ7CisgICAgcFBhY2tldC0+YnVmZmVyTWVtb3J5QmFycmllckNvdW50ID0gYnVmZmVyTWVtb3J5QmFycmllckNvdW50OworICAgIHBQYWNrZXQtPmltYWdlTWVtb3J5QmFycmllckNvdW50ID0gaW1hZ2VNZW1vcnlCYXJyaWVyQ291bnQ7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE1lbW9yeUJhcnJpZXJzKSwgbWVtb3J5QmFycmllckNvdW50ICogc2l6ZW9mKFZrTWVtb3J5QmFycmllciksIHBNZW1vcnlCYXJyaWVycyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEJ1ZmZlck1lbW9yeUJhcnJpZXJzKSwgYnVmZmVyTWVtb3J5QmFycmllckNvdW50ICogc2l6ZW9mKFZrQnVmZmVyTWVtb3J5QmFycmllciksIHBCdWZmZXJNZW1vcnlCYXJyaWVycyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEltYWdlTWVtb3J5QmFycmllcnMpLCBpbWFnZU1lbW9yeUJhcnJpZXJDb3VudCAqIHNpemVvZihWa0ltYWdlTWVtb3J5QmFycmllciksIHBJbWFnZU1lbW9yeUJhcnJpZXJzKTsKKworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBNZW1vcnlCYXJyaWVycykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCdWZmZXJNZW1vcnlCYXJyaWVycykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBJbWFnZU1lbW9yeUJhcnJpZXJzKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiB2b2lkIFZLQVBJX0NBTEwgX19IT09LRURfdmtDbWRQdXNoQ29uc3RhbnRzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgIFZrUGlwZWxpbmVMYXlvdXQgbGF5b3V0LAorICAgIFZrU2hhZGVyU3RhZ2VGbGFncyBzdGFnZUZsYWdzLAorICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIGNvbnN0IHZvaWQqIHBWYWx1ZXMpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIHBhY2tldF92a0NtZFB1c2hDb25zdGFudHMqIHBQYWNrZXQgPSBOVUxMOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtDbWRQdXNoQ29uc3RhbnRzLCBzaXplKTsKKyAgICBtZGQoY29tbWFuZEJ1ZmZlciktPmRldlRhYmxlLkNtZFB1c2hDb25zdGFudHMoY29tbWFuZEJ1ZmZlciwgbGF5b3V0LCBzdGFnZUZsYWdzLCBvZmZzZXQsIHNpemUsIHBWYWx1ZXMpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0NtZFB1c2hDb25zdGFudHMocEhlYWRlcik7CisgICAgcFBhY2tldC0+Y29tbWFuZEJ1ZmZlciA9IGNvbW1hbmRCdWZmZXI7CisgICAgcFBhY2tldC0+bGF5b3V0ID0gbGF5b3V0OworICAgIHBQYWNrZXQtPnN0YWdlRmxhZ3MgPSBzdGFnZUZsYWdzOworICAgIHBQYWNrZXQtPm9mZnNldCA9IG9mZnNldDsKKyAgICBwUGFja2V0LT5zaXplID0gc2l6ZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wVmFsdWVzKSwgc2l6ZSwgcFZhbHVlcyk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFZhbHVlcykpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBWa1BpcGVsaW5lQ2FjaGUgcGlwZWxpbmVDYWNoZSwKKyAgICBzaXplX3QqIHBEYXRhU2l6ZSwKKyAgICB2b2lkKiBwRGF0YSkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0dldFBpcGVsaW5lQ2FjaGVEYXRhKiBwUGFja2V0ID0gTlVMTDsKKyAgICB1aW50NjRfdCBzdGFydFRpbWU7CisgICAgdWludDY0X3QgZW5kVGltZTsKKyAgICB1aW50NjRfdCB2a3RyYWNlU3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHN0YXJ0VGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuR2V0UGlwZWxpbmVDYWNoZURhdGEoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBwRGF0YVNpemUsIHBEYXRhKTsKKyAgICBlbmRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIGFzc2VydChwRGF0YVNpemUpOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtHZXRQaXBlbGluZUNhY2hlRGF0YSwgc2l6ZW9mKHNpemVfdCkgKyBST1VORFVQX1RPXzQoKnBEYXRhU2l6ZSkpOworICAgIHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSA9IHZrdHJhY2VTdGFydFRpbWU7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lID0gc3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgPSBlbmRUaW1lOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0dldFBpcGVsaW5lQ2FjaGVEYXRhKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICBwUGFja2V0LT5waXBlbGluZUNhY2hlID0gcGlwZWxpbmVDYWNoZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGF0YVNpemUpLCBzaXplb2Yoc2l6ZV90KSwgcERhdGFTaXplKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGF0YSksIFJPVU5EVVBfVE9fNCgqcERhdGFTaXplKSwgcERhdGEpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGF0YVNpemUpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGF0YSkpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mb3MsCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmUqIHBQaXBlbGluZXMpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyogcFBhY2tldCA9IE5VTEw7CisgICAgc2l6ZV90IHRvdGFsX3NpemUgPSAwOworICAgIHVpbnQzMl90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGNyZWF0ZUluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIHRvdGFsX3NpemUgKz0gZ2V0X3N0cnVjdF9jaGFpbl9zaXplKCh2b2lkKikmcENyZWF0ZUluZm9zW2ldKTsKKyAgICB9CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzLCB0b3RhbF9zaXplICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykgKyBjcmVhdGVJbmZvQ291bnQqc2l6ZW9mKFZrUGlwZWxpbmUpKTsKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMoZGV2aWNlLCBwaXBlbGluZUNhY2hlLCBjcmVhdGVJbmZvQ291bnQsIHBDcmVhdGVJbmZvcywgcEFsbG9jYXRvciwgcFBpcGVsaW5lcyk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMocEhlYWRlcik7CisgICAgcFBhY2tldC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHBQYWNrZXQtPnBpcGVsaW5lQ2FjaGUgPSBwaXBlbGluZUNhY2hlOworICAgIHBQYWNrZXQtPmNyZWF0ZUluZm9Db3VudCA9IGNyZWF0ZUluZm9Db3VudDsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mb3MpLCBjcmVhdGVJbmZvQ291bnQqc2l6ZW9mKFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8pLCBwQ3JlYXRlSW5mb3MpOworICAgIGFkZF9Wa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvc190b190cmFjZV9wYWNrZXQocEhlYWRlciwgKFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qKXBQYWNrZXQtPnBDcmVhdGVJbmZvcywgcENyZWF0ZUluZm9zLCBjcmVhdGVJbmZvQ291bnQpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpLCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSwgTlVMTCk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFBpcGVsaW5lcyksIGNyZWF0ZUluZm9Db3VudCpzaXplb2YoVmtQaXBlbGluZSksIHBQaXBlbGluZXMpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mb3MpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFBpcGVsaW5lcykpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50NjRfdCBnZXRWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9zQWRkaXRpb25hbFNpemUodWludDMyX3QgY3JlYXRlSW5mb0NvdW50LCBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcykKK3sKKyAgICB1aW50NjRfdCB1aVJldCA9IDA7CisgICAgVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyogcGFja2V0U2hhZGVyOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHVpUmV0ICs9IHNpemVvZihWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKTsKKyAgICAgICAgcGFja2V0U2hhZGVyID0gKFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qKSZwQ3JlYXRlSW5mb3NbaV0uc3RhZ2U7CisgICAgICAgIHVpUmV0ICs9IHN0cmxlbihwYWNrZXRTaGFkZXItPnBOYW1lKSArIDE7CisgICAgICAgIHVpUmV0ICs9IHNpemVvZihWa1NwZWNpYWxpemF0aW9uSW5mbyk7CisgICAgICAgIGlmIChwYWNrZXRTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdWlSZXQgKz0gc2l6ZW9mKFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSkgKiBwYWNrZXRTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8tPm1hcEVudHJ5Q291bnQ7CisgICAgICAgICAgICB1aVJldCArPSBwYWNrZXRTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8tPmRhdGFTaXplOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB1aVJldDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMoCisgICAgVmtEZXZpY2UgZGV2aWNlLAorICAgIFZrUGlwZWxpbmVDYWNoZSBwaXBlbGluZUNhY2hlLAorICAgIHVpbnQzMl90IGNyZWF0ZUluZm9Db3VudCwKKyAgICBjb25zdCBWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qIHBDcmVhdGVJbmZvcywKKyAgICBjb25zdCBWa0FsbG9jYXRpb25DYWxsYmFja3MqIHBBbGxvY2F0b3IsCisgICAgVmtQaXBlbGluZSogcFBpcGVsaW5lcykKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMqIHBQYWNrZXQgPSBOVUxMOworICAgIC8qdWludDMyX3QgaTsKKyAgICBzaXplX3QgdG90YWxfc2l6ZTsKKworICAgIHRvdGFsX3NpemUgPSBjcmVhdGVJbmZvQ291bnQqc2l6ZW9mKFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbykgKyBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSArIGNyZWF0ZUluZm9Db3VudCpzaXplb2YoVmtQaXBlbGluZSk7CisgICAgZm9yIChpPTA7IGkgPCBjcmVhdGVJbmZvQ291bnQ7IGkrKykgeworICAgICAgICB0b3RhbF9zaXplICs9IFJPVU5EVVBfVE9fNChzdHJsZW4ocENyZWF0ZUluZm9zW2ldLnN0YWdlLnBOYW1lKSsxKTsKKyAgICAgICAgaWYgKHBDcmVhdGVJbmZvc1tpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvKSB7CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IHNpemVvZihWa1NwZWNpYWxpemF0aW9uSW5mbyk7CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8tPm1hcEVudHJ5Q291bnQgPiAwICYmIHBDcmVhdGVJbmZvc1tpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5wTWFwRW50cmllcykKKyAgICAgICAgICAgICAgICB0b3RhbF9zaXplICs9IHBDcmVhdGVJbmZvc1tpXS5zdGFnZS5wU3BlY2lhbGl6YXRpb25JbmZvLT5tYXBFbnRyeUNvdW50ICogc2l6ZW9mKFZrU3BlY2lhbGl6YXRpb25NYXBFbnRyeSk7CisgICAgICAgICAgICBpZiAocENyZWF0ZUluZm9zW2ldLnN0YWdlLnBTcGVjaWFsaXphdGlvbkluZm8tPmRhdGFTaXplID4gMCAmJiBwQ3JlYXRlSW5mb3NbaV0uc3RhZ2UucFNwZWNpYWxpemF0aW9uSW5mby0+cERhdGEpCisgICAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBwQ3JlYXRlSW5mb3NbaV0uc3RhZ2UucFNwZWNpYWxpemF0aW9uSW5mby0+ZGF0YVNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMsIHRvdGFsX3NpemUpOyovCisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMsIGNyZWF0ZUluZm9Db3VudCpzaXplb2YoVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKSArIGdldFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mb3NBZGRpdGlvbmFsU2l6ZSggY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MpICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykgKyBjcmVhdGVJbmZvQ291bnQqc2l6ZW9mKFZrUGlwZWxpbmUpKTsKKworICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5DcmVhdGVDb21wdXRlUGlwZWxpbmVzKGRldmljZSwgcGlwZWxpbmVDYWNoZSwgY3JlYXRlSW5mb0NvdW50LCBwQ3JlYXRlSW5mb3MsIHBBbGxvY2F0b3IsIHBQaXBlbGluZXMpOworICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXMocEhlYWRlcik7CisgICAgcFBhY2tldC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHBQYWNrZXQtPnBpcGVsaW5lQ2FjaGUgPSBwaXBlbGluZUNhY2hlOworICAgIHBQYWNrZXQtPmNyZWF0ZUluZm9Db3VudCA9IGNyZWF0ZUluZm9Db3VudDsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mb3MpLCBjcmVhdGVJbmZvQ291bnQqc2l6ZW9mKFZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mbyksIHBDcmVhdGVJbmZvcyk7CisgICAgYWRkX1ZrQ29tcHV0ZVBpcGVsaW5lQ3JlYXRlSW5mb3NfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsIChWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8qKXBQYWNrZXQtPnBDcmVhdGVJbmZvcywgcENyZWF0ZUluZm9zLCBjcmVhdGVJbmZvQ291bnQpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpLCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSwgTlVMTCk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFBpcGVsaW5lcyksIGNyZWF0ZUluZm9Db3VudCpzaXplb2YoVmtQaXBlbGluZSksIHBQaXBlbGluZXMpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mb3MpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFBpcGVsaW5lcykpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQ3JlYXRlUGlwZWxpbmVDYWNoZSgKKyAgICBWa0RldmljZSBkZXZpY2UsCisgICAgY29uc3QgVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgIFZrUGlwZWxpbmVDYWNoZSogcFBpcGVsaW5lQ2FjaGUpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtDcmVhdGVQaXBlbGluZUNhY2hlKiBwUGFja2V0ID0gTlVMTDsKKyAgICAvLyBOZWVkIHRvIHJvdW5kIHVwIHRoZSBzaXplIHdoZW4gd2UgY3JlYXRlIHRoZSBwYWNrZXQgYmVjYXVzZSBwQ3JlYXRlSW5mby0+aW5pdGlhbERhdGFTaXplIG1heSBub3QgYmUgYSBtdWx0IG9mIDQKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQ3JlYXRlUGlwZWxpbmVDYWNoZSwgUk9VTkRVUF9UT180KGdldF9zdHJ1Y3RfY2hhaW5fc2l6ZSgodm9pZCopcENyZWF0ZUluZm8pICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykgKyBzaXplb2YoVmtQaXBlbGluZUNhY2hlKSkpOworICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5DcmVhdGVQaXBlbGluZUNhY2hlKGRldmljZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBQaXBlbGluZUNhY2hlKTsKKyAgICB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZShwSGVhZGVyKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtDcmVhdGVQaXBlbGluZUNhY2hlKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa1BpcGVsaW5lQ2FjaGVDcmVhdGVJbmZvKSwgcENyZWF0ZUluZm8pOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wSW5pdGlhbERhdGEpLCBST1VORFVQX1RPXzQocFBhY2tldC0+cENyZWF0ZUluZm8tPmluaXRpYWxEYXRhU2l6ZSksIHBDcmVhdGVJbmZvLT5wSW5pdGlhbERhdGEpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0b3IpLCBzaXplb2YoVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKSwgTlVMTCk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFBpcGVsaW5lQ2FjaGUpLCBzaXplb2YoVmtQaXBlbGluZUNhY2hlKSwgcFBpcGVsaW5lQ2FjaGUpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cEluaXRpYWxEYXRhKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFBpcGVsaW5lQ2FjaGUpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgdm9pZCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQ21kQmVnaW5SZW5kZXJQYXNzKAorICAgIFZrQ29tbWFuZEJ1ZmZlciBjb21tYW5kQnVmZmVyLAorICAgIGNvbnN0IFZrUmVuZGVyUGFzc0JlZ2luSW5mbyogcFJlbmRlclBhc3NCZWdpbiwKKyAgICBWa1N1YnBhc3NDb250ZW50cyBjb250ZW50cykKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgcGFja2V0X3ZrQ21kQmVnaW5SZW5kZXJQYXNzKiBwUGFja2V0ID0gTlVMTDsKKyAgICBzaXplX3QgY2xlYXJWYWx1ZVNpemUgPSBzaXplb2YoVmtDbGVhclZhbHVlKSAqIHBSZW5kZXJQYXNzQmVnaW4tPmNsZWFyVmFsdWVDb3VudDsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQ21kQmVnaW5SZW5kZXJQYXNzLCBzaXplb2YoVmtSZW5kZXJQYXNzQmVnaW5JbmZvKSArIGNsZWFyVmFsdWVTaXplKTsKKyAgICBtZGQoY29tbWFuZEJ1ZmZlciktPmRldlRhYmxlLkNtZEJlZ2luUmVuZGVyUGFzcyhjb21tYW5kQnVmZmVyLCBwUmVuZGVyUGFzc0JlZ2luLCBjb250ZW50cyk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQ21kQmVnaW5SZW5kZXJQYXNzKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmNvbW1hbmRCdWZmZXIgPSBjb21tYW5kQnVmZmVyOworICAgIHBQYWNrZXQtPmNvbnRlbnRzID0gY29udGVudHM7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFJlbmRlclBhc3NCZWdpbiksIHNpemVvZihWa1JlbmRlclBhc3NCZWdpbkluZm8pLCBwUmVuZGVyUGFzc0JlZ2luKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUmVuZGVyUGFzc0JlZ2luLT5wQ2xlYXJWYWx1ZXMpLCBjbGVhclZhbHVlU2l6ZSwgcFJlbmRlclBhc3NCZWdpbi0+cENsZWFyVmFsdWVzKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUmVuZGVyUGFzc0JlZ2luLT5wQ2xlYXJWYWx1ZXMpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUmVuZGVyUGFzc0JlZ2luKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworfQorCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrRnJlZURlc2NyaXB0b3JTZXRzKAorICAgIFZrRGV2aWNlIGRldmljZSwKKyAgICBWa0Rlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sLAorICAgIHVpbnQzMl90IGRlc2NyaXB0b3JTZXRDb3VudCwKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JTZXQqIHBEZXNjcmlwdG9yU2V0cykKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHBhY2tldF92a0ZyZWVEZXNjcmlwdG9yU2V0cyogcFBhY2tldCA9IE5VTEw7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0ZyZWVEZXNjcmlwdG9yU2V0cywgZGVzY3JpcHRvclNldENvdW50KnNpemVvZihWa0Rlc2NyaXB0b3JTZXQpKTsKKyAgICByZXN1bHQgPSBtZGQoZGV2aWNlKS0+ZGV2VGFibGUuRnJlZURlc2NyaXB0b3JTZXRzKGRldmljZSwgZGVzY3JpcHRvclBvb2wsIGRlc2NyaXB0b3JTZXRDb3VudCwgcERlc2NyaXB0b3JTZXRzKTsKKyAgICB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZShwSGVhZGVyKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtGcmVlRGVzY3JpcHRvclNldHMocEhlYWRlcik7CisgICAgcFBhY2tldC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHBQYWNrZXQtPmRlc2NyaXB0b3JQb29sID0gZGVzY3JpcHRvclBvb2w7CisgICAgcFBhY2tldC0+ZGVzY3JpcHRvclNldENvdW50ID0gZGVzY3JpcHRvclNldENvdW50OworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEZXNjcmlwdG9yU2V0cyksIGRlc2NyaXB0b3JTZXRDb3VudCpzaXplb2YoVmtEZXNjcmlwdG9yU2V0KSwgcERlc2NyaXB0b3JTZXRzKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERlc2NyaXB0b3JTZXRzKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICBWa1N1cmZhY2VDYXBhYmlsaXRpZXNLSFIqIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKiBwUGFja2V0ID0gTlVMTDsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSLCBzaXplb2YoVmtTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSKSk7CisgICAgcmVzdWx0ID0gbWlkKHBoeXNpY2FsRGV2aWNlKS0+aW5zdFRhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihwaHlzaWNhbERldmljZSwgc3VyZmFjZSwgcFN1cmZhY2VDYXBhYmlsaXRpZXMpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUihwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5waHlzaWNhbERldmljZSA9IHBoeXNpY2FsRGV2aWNlOworICAgIHBQYWNrZXQtPnN1cmZhY2UgPSBzdXJmYWNlOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlQ2FwYWJpbGl0aWVzKSwgc2l6ZW9mKFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiksIHBTdXJmYWNlQ2FwYWJpbGl0aWVzKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN1cmZhY2VDYXBhYmlsaXRpZXMpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICBWa1N1cmZhY2VLSFIgc3VyZmFjZSwKKyAgICB1aW50MzJfdCogcFN1cmZhY2VGb3JtYXRDb3VudCwKKyAgICBWa1N1cmZhY2VGb3JtYXRLSFIqIHBTdXJmYWNlRm9ybWF0cykKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtSZXN1bHQgcmVzdWx0OworICAgIHNpemVfdCBfZGF0YVNpemU7CisgICAgcGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiogcFBhY2tldCA9IE5VTEw7CisgICAgdWludDY0X3Qgc3RhcnRUaW1lOworICAgIHVpbnQ2NF90IGVuZFRpbWU7CisgICAgdWludDY0X3Qgdmt0cmFjZVN0YXJ0VGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICBzdGFydFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgcmVzdWx0ID0gbWlkKHBoeXNpY2FsRGV2aWNlKS0+aW5zdFRhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBTdXJmYWNlRm9ybWF0Q291bnQsIHBTdXJmYWNlRm9ybWF0cyk7CisgICAgZW5kVGltZSA9IHZrdHJhY2VfZ2V0X3RpbWUoKTsKKyAgICBfZGF0YVNpemUgPSAocFN1cmZhY2VGb3JtYXRDb3VudCA9PSBOVUxMIHx8IHBTdXJmYWNlRm9ybWF0cyA9PSBOVUxMKSA/IDAgOiAoKnBTdXJmYWNlRm9ybWF0Q291bnQgKnNpemVvZihWa1N1cmZhY2VGb3JtYXRLSFIpKTsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUiwgc2l6ZW9mKHVpbnQzMl90KSArIF9kYXRhU2l6ZSk7CisgICAgcEhlYWRlci0+dmt0cmFjZV9iZWdpbl90aW1lID0gdmt0cmFjZVN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWUgPSBzdGFydFRpbWU7CisgICAgcEhlYWRlci0+ZW50cnlwb2ludF9lbmRfdGltZSA9IGVuZFRpbWU7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5waHlzaWNhbERldmljZSA9IHBoeXNpY2FsRGV2aWNlOworICAgIHBQYWNrZXQtPnN1cmZhY2UgPSBzdXJmYWNlOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlRm9ybWF0Q291bnQpLCBzaXplb2YodWludDMyX3QpLCBwU3VyZmFjZUZvcm1hdENvdW50KTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VyZmFjZUZvcm1hdHMpLCBfZGF0YVNpemUsIHBTdXJmYWNlRm9ybWF0cyk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlRm9ybWF0Q291bnQpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VyZmFjZUZvcm1hdHMpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgIFZrU3VyZmFjZUtIUiBzdXJmYWNlLAorICAgIHVpbnQzMl90KiBwUHJlc2VudE1vZGVDb3VudCwKKyAgICBWa1ByZXNlbnRNb2RlS0hSKiBwUHJlc2VudE1vZGVzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgc2l6ZV90IF9kYXRhU2l6ZTsKKyAgICBwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIqIHBQYWNrZXQgPSBOVUxMOworICAgIHVpbnQ2NF90IHN0YXJ0VGltZTsKKyAgICB1aW50NjRfdCBlbmRUaW1lOworICAgIHVpbnQ2NF90IHZrdHJhY2VTdGFydFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgc3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHJlc3VsdCA9IG1pZChwaHlzaWNhbERldmljZSktPmluc3RUYWJsZS5HZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocGh5c2ljYWxEZXZpY2UsIHN1cmZhY2UsIHBQcmVzZW50TW9kZUNvdW50LCBwUHJlc2VudE1vZGVzKTsKKyAgICBlbmRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIF9kYXRhU2l6ZSA9IChwUHJlc2VudE1vZGVDb3VudCA9PSBOVUxMIHx8IHBQcmVzZW50TW9kZXMgPT0gTlVMTCkgPyAwIDogKCpwUHJlc2VudE1vZGVDb3VudCAqc2l6ZW9mKFZrUHJlc2VudE1vZGVLSFIpKTsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSLCBzaXplb2YodWludDMyX3QpICsgX2RhdGFTaXplKTsKKyAgICBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUgPSB2a3RyYWNlU3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSA9IHN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lID0gZW5kVGltZTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIocEhlYWRlcik7CisgICAgcFBhY2tldC0+cGh5c2ljYWxEZXZpY2UgPSBwaHlzaWNhbERldmljZTsKKyAgICBwUGFja2V0LT5zdXJmYWNlID0gc3VyZmFjZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJlc2VudE1vZGVDb3VudCksIHNpemVvZih1aW50MzJfdCksIHBQcmVzZW50TW9kZUNvdW50KTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJlc2VudE1vZGVzKSwgX2RhdGFTaXplLCBwUHJlc2VudE1vZGVzKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFByZXNlbnRNb2RlQ291bnQpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJlc2VudE1vZGVzKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtDcmVhdGVTd2FwY2hhaW5LSFIoCisgICAgVmtEZXZpY2UgZGV2aWNlLAorICAgIGNvbnN0IFZrU3dhcGNoYWluQ3JlYXRlSW5mb0tIUiogcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgIFZrU3dhcGNoYWluS0hSKiBwU3dhcGNoYWluKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrQ3JlYXRlU3dhcGNoYWluS0hSKiBwUGFja2V0ID0gTlVMTDsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQ3JlYXRlU3dhcGNoYWluS0hSLCB2a19zaXplX3Zrc3dhcGNoYWluY3JlYXRlaW5mb2tocihwQ3JlYXRlSW5mbykgKyBzaXplb2YoVmtTd2FwY2hhaW5LSFIpICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykpOworICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5DcmVhdGVTd2FwY2hhaW5LSFIoZGV2aWNlLCBwQ3JlYXRlSW5mbywgcEFsbG9jYXRvciwgcFN3YXBjaGFpbik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQ3JlYXRlU3dhcGNoYWluS0hSKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmRldmljZSA9IGRldmljZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIpLCBwQ3JlYXRlSW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvciksIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpLCBOVUxMKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3dhcGNoYWluKSwgc2l6ZW9mKFZrU3dhcGNoYWluS0hSKSwgcFN3YXBjaGFpbik7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMpLCBwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50ICogc2l6ZW9mKHVpbnQzMl90KSwgcENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXMpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTd2FwY2hhaW4pKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFN3YXBjaGFpbkltYWdlc0tIUigKKyAgICBWa0RldmljZSBkZXZpY2UsCisgICAgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluLAorICAgIHVpbnQzMl90KiBwU3dhcGNoYWluSW1hZ2VDb3VudCwKKyAgICBWa0ltYWdlKiBwU3dhcGNoYWluSW1hZ2VzKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgc2l6ZV90IF9kYXRhU2l6ZTsKKyAgICBwYWNrZXRfdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIqIHBQYWNrZXQgPSBOVUxMOworICAgIHVpbnQ2NF90IHN0YXJ0VGltZTsKKyAgICB1aW50NjRfdCBlbmRUaW1lOworICAgIHVpbnQ2NF90IHZrdHJhY2VTdGFydFRpbWUgPSB2a3RyYWNlX2dldF90aW1lKCk7CisgICAgc3RhcnRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIHJlc3VsdCA9IG1kZChkZXZpY2UpLT5kZXZUYWJsZS5HZXRTd2FwY2hhaW5JbWFnZXNLSFIoZGV2aWNlLCBzd2FwY2hhaW4sIHBTd2FwY2hhaW5JbWFnZUNvdW50LCBwU3dhcGNoYWluSW1hZ2VzKTsKKyAgICBlbmRUaW1lID0gdmt0cmFjZV9nZXRfdGltZSgpOworICAgIF9kYXRhU2l6ZSA9IChwU3dhcGNoYWluSW1hZ2VDb3VudCA9PSBOVUxMIHx8IHBTd2FwY2hhaW5JbWFnZXMgPT0gTlVMTCkgPyAwIDogKCpwU3dhcGNoYWluSW1hZ2VDb3VudCAqc2l6ZW9mKFZrSW1hZ2UpKTsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSLCBzaXplb2YodWludDMyX3QpICsgX2RhdGFTaXplKTsKKyAgICBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUgPSB2a3RyYWNlU3RhcnRUaW1lOworICAgIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSA9IHN0YXJ0VGltZTsKKyAgICBwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lID0gZW5kVGltZTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIocEhlYWRlcik7CisgICAgcFBhY2tldC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHBQYWNrZXQtPnN3YXBjaGFpbiA9IHN3YXBjaGFpbjsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3dhcGNoYWluSW1hZ2VDb3VudCksIHNpemVvZih1aW50MzJfdCksIHBTd2FwY2hhaW5JbWFnZUNvdW50KTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3dhcGNoYWluSW1hZ2VzKSwgX2RhdGFTaXplLCBwU3dhcGNoYWluSW1hZ2VzKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN3YXBjaGFpbkltYWdlQ291bnQpKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3dhcGNoYWluSW1hZ2VzKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtRdWV1ZVByZXNlbnRLSFIoCisgICAgVmtRdWV1ZSBxdWV1ZSwKKyAgICBjb25zdCBWa1ByZXNlbnRJbmZvS0hSKiBwUHJlc2VudEluZm8pCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtRdWV1ZVByZXNlbnRLSFIqIHBQYWNrZXQgPSBOVUxMOworICAgIHNpemVfdCBzd2FwY2hhaW5TaXplID0gcFByZXNlbnRJbmZvLT5zd2FwY2hhaW5Db3VudCAqIHNpemVvZihWa1N3YXBjaGFpbktIUik7CisgICAgc2l6ZV90IGluZGV4U2l6ZSA9IHBQcmVzZW50SW5mby0+c3dhcGNoYWluQ291bnQgKiBzaXplb2YodWludDMyX3QpOworICAgIHNpemVfdCBzZW1hU2l6ZSA9IHBQcmVzZW50SW5mby0+d2FpdFNlbWFwaG9yZUNvdW50ICogc2l6ZW9mKFZrU2VtYXBob3JlKTsKKyAgICBzaXplX3QgcmVzdWx0c1NpemUgPSBwUHJlc2VudEluZm8tPnN3YXBjaGFpbkNvdW50ICogc2l6ZW9mKFZrUmVzdWx0KTsKKyAgICBzaXplX3QgdG90YWxTaXplID0gc2l6ZW9mKFZrUHJlc2VudEluZm9LSFIpICsgc3dhcGNoYWluU2l6ZSArIGluZGV4U2l6ZSArIHNlbWFTaXplOworICAgIGlmIChwUHJlc2VudEluZm8tPnBSZXN1bHRzICE9IE5VTEwpIHsKKyAgICAgICAgdG90YWxTaXplICs9IHJlc3VsdHNTaXplOworICAgIH0KKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrUXVldWVQcmVzZW50S0hSLCB0b3RhbFNpemUpOworICAgIHJlc3VsdCA9IG1kZChxdWV1ZSktPmRldlRhYmxlLlF1ZXVlUHJlc2VudEtIUihxdWV1ZSwgcFByZXNlbnRJbmZvKTsKKyAgICB2a3RyYWNlX3NldF9wYWNrZXRfZW50cnlwb2ludF9lbmRfdGltZShwSGVhZGVyKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtRdWV1ZVByZXNlbnRLSFIocEhlYWRlcik7CisgICAgcFBhY2tldC0+cXVldWUgPSBxdWV1ZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJlc2VudEluZm8pLCBzaXplb2YoVmtQcmVzZW50SW5mb0tIUiksIHBQcmVzZW50SW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFByZXNlbnRJbmZvLT5wU3dhcGNoYWlucyksIHN3YXBjaGFpblNpemUsIHBQcmVzZW50SW5mby0+cFN3YXBjaGFpbnMpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQcmVzZW50SW5mby0+cEltYWdlSW5kaWNlcyksIGluZGV4U2l6ZSwgcFByZXNlbnRJbmZvLT5wSW1hZ2VJbmRpY2VzKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3JlcyksIHNlbWFTaXplLCBwUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3Jlcyk7CisgICAgaWYgKHBQcmVzZW50SW5mby0+cFJlc3VsdHMgIT0gTlVMTCkgeworICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJlc2VudEluZm8tPnBSZXN1bHRzKSwgcmVzdWx0c1NpemUsIHBQcmVzZW50SW5mby0+cFJlc3VsdHMpOworICAgIH0KKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFByZXNlbnRJbmZvLT5wSW1hZ2VJbmRpY2VzKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFByZXNlbnRJbmZvLT5wU3dhcGNoYWlucykpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQcmVzZW50SW5mby0+cFdhaXRTZW1hcGhvcmVzKSk7CisgICAgaWYgKHBQcmVzZW50SW5mby0+cFJlc3VsdHMgIT0gTlVMTCkgeworICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wUHJlc2VudEluZm8tPnBSZXN1bHRzKSk7CisgICAgfQorICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQcmVzZW50SW5mbykpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBUT0RPIHRoZXNlIGNhbiBwcm9iYWJseSBiZSBtb3ZlZCBpbnRvIGNvZGUgZ2VuICovCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrV2luMzJTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIqIHBQYWNrZXQgPSBOVUxMOworICAgIC8vIGRvbid0IGJvdGhlciB3aXRoIGNvcHlpbmcgdGhlIGFjdHVhbCB3aW4zMiBoaW5zdGFuY2UsIGh3bmQgaW50byB0aGUgdHJhY2UgcGFja2V0LCB2a3JlcGxheSBoYXMgdG8gdXNlIGl0J3Mgb3duIGFueXdheQorICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIsIHNpemVvZihWa1N1cmZhY2VLSFIpICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykgKyBzaXplb2YoVmtXaW4zMlN1cmZhY2VDcmVhdGVJbmZvS0hSKSk7CisgICAgcmVzdWx0ID0gbWlkKGluc3RhbmNlKS0+aW5zdFRhYmxlLkNyZWF0ZVdpbjMyU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFIocEhlYWRlcik7CisgICAgcFBhY2tldC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa1dpbjMyU3VyZmFjZUNyZWF0ZUluZm9LSFIpLCBwQ3JlYXRlSW5mbyk7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvciksIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpLCBOVUxMKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VyZmFjZSksIHNpemVvZihWa1N1cmZhY2VLSFIpLCBwU3VyZmFjZSk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEFsbG9jYXRvcikpOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrQm9vbDMyIFZLQVBJX0NBTEwgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtCb29sMzIgcmVzdWx0OworICAgIHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKiBwUGFja2V0ID0gTlVMTDsKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIsIDApOworICAgIHJlc3VsdCA9IG1pZChwaHlzaWNhbERldmljZSktPmluc3RUYWJsZS5HZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCk7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFIocEhlYWRlcik7CisgICAgcFBhY2tldC0+cGh5c2ljYWxEZXZpY2UgPSBwaHlzaWNhbERldmljZTsKKyAgICBwUGFja2V0LT5xdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleDsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWENCX0tIUgorVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0NyZWF0ZVhjYlN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa1hjYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrQ3JlYXRlWGNiU3VyZmFjZUtIUiogcFBhY2tldCA9IE5VTEw7CisgICAgLy8gZG9uJ3QgYm90aGVyIHdpdGggY29weWluZyB0aGUgYWN0dWFsIHhjYiB3aW5kb3cgYW5kIGNvbm5lY3Rpb24gaW50byB0aGUgdHJhY2UgcGFja2V0LCB2a3JlcGxheSBoYXMgdG8gdXNlIGl0J3Mgb3duIGFueXdheQorICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtDcmVhdGVYY2JTdXJmYWNlS0hSLCBzaXplb2YoVmtTdXJmYWNlS0hSKSArIHNpemVvZihWa0FsbG9jYXRpb25DYWxsYmFja3MpICsgc2l6ZW9mKFZrWGNiU3VyZmFjZUNyZWF0ZUluZm9LSFIpKTsKKyAgICByZXN1bHQgPSBtaWQoaW5zdGFuY2UpLT5pbnN0VGFibGUuQ3JlYXRlWGNiU3VyZmFjZUtIUihpbnN0YW5jZSwgcENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBTdXJmYWNlKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtDcmVhdGVYY2JTdXJmYWNlS0hSKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPmluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pLCBzaXplb2YoVmtYY2JTdXJmYWNlQ3JlYXRlSW5mb0tIUiksIHBDcmVhdGVJbmZvKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSwgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcyksIE5VTEwpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlKSwgc2l6ZW9mKFZrU3VyZmFjZUtIUiksIHBTdXJmYWNlKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN1cmZhY2UpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUigKKyAgICBWa1BoeXNpY2FsRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVGYW1pbHlJbmRleCwKKyAgICB4Y2JfY29ubmVjdGlvbl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgeGNiX3Zpc3VhbGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaWQpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrQm9vbDMyIHJlc3VsdDsKKyAgICBwYWNrZXRfdmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIqIHBQYWNrZXQgPSBOVUxMOworICAgIC8vIGRvbid0IGJvdGhlciB3aXRoIGNvcHlpbmcgdGhlIGFjdHVhbCB4Y2IgdmlzdWFsX2lkIGFuZCBjb25uZWN0aW9uIGludG8gdGhlIHRyYWNlIHBhY2tldCwgdmtyZXBsYXkgaGFzIHRvIHVzZSBpdCdzIG93biBhbnl3YXkKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSLCAwKTsKKyAgICByZXN1bHQgPSBtaWQocGh5c2ljYWxEZXZpY2UpLT5pbnN0VGFibGUuR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBjb25uZWN0aW9uLCB2aXN1YWxfaWQpOworICAgIHBQYWNrZXQgPSBpbnRlcnByZXRfYm9keV9hc192a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5waHlzaWNhbERldmljZSA9IHBoeXNpY2FsRGV2aWNlOworICAgIHBQYWNrZXQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgIHBQYWNrZXQtPnF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseUluZGV4OworICAgIHBQYWNrZXQtPnZpc3VhbF9pZCA9IHZpc3VhbF9pZDsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgX19IT09LRURfdmtDcmVhdGVYbGliU3VyZmFjZUtIUigKKyAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAorICAgIGNvbnN0IFZrWGxpYlN1cmZhY2VDcmVhdGVJbmZvS0hSKiAgICAgICAgICAgcENyZWF0ZUluZm8sCisgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiAgICAgICAgICAgICAgICBwQWxsb2NhdG9yLAorICAgIFZrU3VyZmFjZUtIUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1cmZhY2UpCit7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOworICAgIFZrUmVzdWx0IHJlc3VsdDsKKyAgICBwYWNrZXRfdmtDcmVhdGVYbGliU3VyZmFjZUtIUiogcFBhY2tldCA9IE5VTEw7CisgICAgLy8gZG9uJ3QgYm90aGVyIHdpdGggY29weWluZyB0aGUgYWN0dWFsIHhsaWIgd2luZG93IGFuZCBjb25uZWN0aW9uIGludG8gdGhlIHRyYWNlIHBhY2tldCwgdmtyZXBsYXkgaGFzIHRvIHVzZSBpdCdzIG93biBhbnl3YXkKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIsIHNpemVvZihWa1N1cmZhY2VLSFIpICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykgKyBzaXplb2YoVmtYbGliU3VyZmFjZUNyZWF0ZUluZm9LSFIpKTsKKyAgICByZXN1bHQgPSBtaWQoaW5zdGFuY2UpLT5pbnN0VGFibGUuQ3JlYXRlWGxpYlN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIocEhlYWRlcik7CisgICAgcFBhY2tldC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa1hsaWJTdXJmYWNlQ3JlYXRlSW5mb0tIUiksIHBDcmVhdGVJbmZvKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSwgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcyksIE5VTEwpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlKSwgc2l6ZW9mKFZrU3VyZmFjZUtIUiksIHBTdXJmYWNlKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN1cmZhY2UpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtCb29sMzIgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlRmFtaWx5SW5kZXgsCisgICAgRGlzcGxheSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHksCisgICAgVmlzdWFsSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxJRCkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgVmtCb29sMzIgcmVzdWx0OworICAgIHBhY2tldF92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIqIHBQYWNrZXQgPSBOVUxMOworICAgIC8vIGRvbid0IGJvdGhlciB3aXRoIGNvcHlpbmcgdGhlIGFjdHVhbCB4bGliIHZpc3VhbF9pZCBhbmQgY29ubmVjdGlvbiBpbnRvIHRoZSB0cmFjZSBwYWNrZXQsIHZrcmVwbGF5IGhhcyB0byB1c2UgaXQncyBvd24gYW55d2F5CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIsIDApOworICAgIHJlc3VsdCA9IG1pZChwaHlzaWNhbERldmljZSktPmluc3RUYWJsZS5HZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBoeXNpY2FsRGV2aWNlLCBxdWV1ZUZhbWlseUluZGV4LCBkcHksIHZpc3VhbElEKTsKKyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtHZXRQaHlzaWNhbERldmljZVhsaWJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBIZWFkZXIpOworICAgIHBQYWNrZXQtPnBoeXNpY2FsRGV2aWNlID0gcGh5c2ljYWxEZXZpY2U7CisgICAgcFBhY2tldC0+ZHB5ID0gZHB5OworICAgIHBQYWNrZXQtPnF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseUluZGV4OworICAgIHBQYWNrZXQtPnZpc3VhbElEID0gdmlzdWFsSUQ7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoCisgICAgVmtJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiogICAgICAgIHBDcmVhdGVJbmZvLAorICAgIGNvbnN0IFZrQWxsb2NhdGlvbkNhbGxiYWNrcyogICAgICAgICAgICAgICAgcEFsbG9jYXRvciwKKyAgICBWa1N1cmZhY2VLSFIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXJmYWNlKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIqIHBQYWNrZXQgPSBOVUxMOworICAgIC8vIGRvbid0IGJvdGhlciB3aXRoIGNvcHlpbmcgdGhlIGFjdHVhbCBuYXRpdmUgd2luZG93IGludG8gdGhlIHRyYWNlIHBhY2tldCwgdmtyZXBsYXkgaGFzIHRvIHVzZSBpdCdzIG93biBhbnl3YXkKKyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIsIHNpemVvZihWa1N1cmZhY2VLSFIpICsgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcykgKyBzaXplb2YoVmtBbmRyb2lkU3VyZmFjZUNyZWF0ZUluZm9LSFIpKTsKKyAgICByZXN1bHQgPSBtaWQoaW5zdGFuY2UpLT5pbnN0VGFibGUuQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIoaW5zdGFuY2UsIHBDcmVhdGVJbmZvLCBwQWxsb2NhdG9yLCBwU3VyZmFjZSk7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIocEhlYWRlcik7CisgICAgcFBhY2tldC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiksIHBDcmVhdGVJbmZvKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSwgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcyksIE5VTEwpOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlKSwgc2l6ZW9mKFZrU3VyZmFjZUtIUiksIHBTdXJmYWNlKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSk7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cFN1cmZhY2UpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisvL1RPRE8gV2F5bGFuZCBhbmQgTWlyIHN1cHBvcnQKKworLyogVE9ETzogUHJvYmFibHkgd2FudCB0byBtYWtlIHRoaXMgbWFudWFsIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSBib29sZWFuIGFuZCB0aGVuIGNoZWNrIGl0IG9uIHJlcGxheQorVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIoCisgICAgVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwKKyAgICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4LAorICAgIGNvbnN0IFZrU3VyZmFjZURlc2NyaXB0aW9uS0hSKiBwU3VyZmFjZURlc2NyaXB0aW9uLAorICAgIFZrQm9vbDMyKiBwU3VwcG9ydGVkKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKKyAgICBWa1Jlc3VsdCByZXN1bHQ7CisgICAgcGFja2V0X3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUiogcFBhY2tldCA9IE5VTEw7CisgICAgQ1JFQVRFX1RSQUNFX1BBQ0tFVCh2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIsIHNpemVvZihWa1N1cmZhY2VEZXNjcmlwdGlvbktIUikgKyBzaXplb2YoVmtCb29sMzIpKTsKKyAgICByZXN1bHQgPSBtaWQocGh5c2ljYWxEZXZpY2UpLT5pbnN0VGFibGUuR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihwaHlzaWNhbERldmljZSwgcXVldWVGYW1pbHlJbmRleCwgcFN1cmZhY2VEZXNjcmlwdGlvbiwgcFN1cHBvcnRlZCk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUihwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5waHlzaWNhbERldmljZSA9IHBoeXNpY2FsRGV2aWNlOworICAgIHBQYWNrZXQtPnF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseUluZGV4OworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlRGVzY3JpcHRpb24pLCBzaXplb2YoVmtTdXJmYWNlRGVzY3JpcHRpb25LSFIpLCBwU3VyZmFjZURlc2NyaXB0aW9uKTsKKyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VwcG9ydGVkKSwgc2l6ZW9mKFZrQm9vbDMyKSwgcFN1cHBvcnRlZCk7CisgICAgcFBhY2tldC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBTdXJmYWNlRGVzY3JpcHRpb24pKTsKKyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3VwcG9ydGVkKSk7CisgICAgRklOSVNIX1RSQUNFX1BBQ0tFVCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisqLworCitzdGF0aWMgaW5saW5lIFBGTl92a1ZvaWRGdW5jdGlvbiBsYXllcl9pbnRlcmNlcHRfcHJvYyhjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmICghbmFtZSB8fCBuYW1lWzBdICE9ICd2JyB8fCBuYW1lWzFdICE9ICdrJykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBuYW1lICs9IDI7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRGV2aWNlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZURldmljZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveURldmljZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95RGV2aWNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VRdWV1ZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXREZXZpY2VRdWV1ZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUXVldWVTdWJtaXQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrUXVldWVTdWJtaXQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlF1ZXVlV2FpdElkbGUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrUXVldWVXYWl0SWRsZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGV2aWNlV2FpdElkbGUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGV2aWNlV2FpdElkbGU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkFsbG9jYXRlTWVtb3J5IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0FsbG9jYXRlTWVtb3J5OworICAgIGlmICghc3RyY21wKG5hbWUsICJGcmVlTWVtb3J5IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0ZyZWVNZW1vcnk7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1hcE1lbW9yeSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtNYXBNZW1vcnk7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlVubWFwTWVtb3J5IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a1VubWFwTWVtb3J5OworICAgIGlmICghc3RyY21wKG5hbWUsICJGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtGbHVzaE1hcHBlZE1lbW9yeVJhbmdlczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtJbnZhbGlkYXRlTWFwcGVkTWVtb3J5UmFuZ2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXREZXZpY2VNZW1vcnlDb21taXRtZW50IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldERldmljZU1lbW9yeUNvbW1pdG1lbnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkJpbmRCdWZmZXJNZW1vcnkiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQmluZEJ1ZmZlck1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQmluZEltYWdlTWVtb3J5IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0JpbmRJbWFnZU1lbW9yeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldEJ1ZmZlck1lbW9yeVJlcXVpcmVtZW50czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldEltYWdlU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUXVldWVCaW5kU3BhcnNlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a1F1ZXVlQmluZFNwYXJzZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRmVuY2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ3JlYXRlRmVuY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lGZW5jZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95RmVuY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlJlc2V0RmVuY2VzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a1Jlc2V0RmVuY2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRGZW5jZVN0YXR1cyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRGZW5jZVN0YXR1czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiV2FpdEZvckZlbmNlcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtXYWl0Rm9yRmVuY2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVTZW1hcGhvcmUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ3JlYXRlU2VtYXBob3JlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95U2VtYXBob3JlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0Rlc3Ryb3lTZW1hcGhvcmU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUV2ZW50IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZUV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95RXZlbnQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveUV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRFdmVudFN0YXR1cyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRFdmVudFN0YXR1czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiU2V0RXZlbnQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrU2V0RXZlbnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlJlc2V0RXZlbnQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrUmVzZXRFdmVudDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlUXVlcnlQb29sIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZVF1ZXJ5UG9vbDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVF1ZXJ5UG9vbCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95UXVlcnlQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRRdWVyeVBvb2xSZXN1bHRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFF1ZXJ5UG9vbFJlc3VsdHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lCdWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveUJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlQnVmZmVyVmlldyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVCdWZmZXJWaWV3OworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95QnVmZmVyVmlldyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95QnVmZmVyVmlldzsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlSW1hZ2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ3JlYXRlSW1hZ2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lJbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95SW1hZ2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldEltYWdlU3VicmVzb3VyY2VMYXlvdXQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrR2V0SW1hZ2VTdWJyZXNvdXJjZUxheW91dDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlSW1hZ2VWaWV3IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZUltYWdlVmlldzsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUltYWdlVmlldyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95SW1hZ2VWaWV3OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVTaGFkZXJNb2R1bGUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ3JlYXRlU2hhZGVyTW9kdWxlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95U2hhZGVyTW9kdWxlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0Rlc3Ryb3lTaGFkZXJNb2R1bGU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVBpcGVsaW5lQ2FjaGUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ3JlYXRlUGlwZWxpbmVDYWNoZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVBpcGVsaW5lQ2FjaGUiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveVBpcGVsaW5lQ2FjaGU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBpcGVsaW5lQ2FjaGVEYXRhIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBpcGVsaW5lQ2FjaGVEYXRhOworICAgIGlmICghc3RyY21wKG5hbWUsICJNZXJnZVBpcGVsaW5lQ2FjaGVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a01lcmdlUGlwZWxpbmVDYWNoZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVDb21wdXRlUGlwZWxpbmVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZUNvbXB1dGVQaXBlbGluZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lQaXBlbGluZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95UGlwZWxpbmU7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVBpcGVsaW5lTGF5b3V0IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZVBpcGVsaW5lTGF5b3V0OworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95UGlwZWxpbmVMYXlvdXQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveVBpcGVsaW5lTGF5b3V0OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVTYW1wbGVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZVNhbXBsZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lTYW1wbGVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0Rlc3Ryb3lTYW1wbGVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0Rlc3Ryb3lEZXNjcmlwdG9yU2V0TGF5b3V0OworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVEZXNjcmlwdG9yUG9vbCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVEZXNjcmlwdG9yUG9vbDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveURlc2NyaXB0b3JQb29sIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXREZXNjcmlwdG9yUG9vbCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtSZXNldERlc2NyaXB0b3JQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJBbGxvY2F0ZURlc2NyaXB0b3JTZXRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0FsbG9jYXRlRGVzY3JpcHRvclNldHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkZyZWVEZXNjcmlwdG9yU2V0cyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtGcmVlRGVzY3JpcHRvclNldHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIlVwZGF0ZURlc2NyaXB0b3JTZXRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a1VwZGF0ZURlc2NyaXB0b3JTZXRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDcmVhdGVDb21tYW5kUG9vbCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVDb21tYW5kUG9vbDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveUNvbW1hbmRQb29sIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0Rlc3Ryb3lDb21tYW5kUG9vbDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRDb21tYW5kUG9vbCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtSZXNldENvbW1hbmRQb29sOworICAgIGlmICghc3RyY21wKG5hbWUsICJBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkZyZWVDb21tYW5kQnVmZmVycyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtGcmVlQ29tbWFuZEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkJlZ2luQ29tbWFuZEJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtCZWdpbkNvbW1hbmRCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVuZENvbW1hbmRCdWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRW5kQ29tbWFuZEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiUmVzZXRDb21tYW5kQnVmZmVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a1Jlc2V0Q29tbWFuZEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZFBpcGVsaW5lIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZEJpbmRQaXBlbGluZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0Vmlld3BvcnQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kU2V0Vmlld3BvcnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldFNjaXNzb3IiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kU2V0U2Npc3NvcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0TGluZVdpZHRoIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFNldExpbmVXaWR0aDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0RGVwdGhCaWFzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFNldERlcHRoQmlhczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kU2V0QmxlbmRDb25zdGFudHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kU2V0QmxlbmRDb25zdGFudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldERlcHRoQm91bmRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFNldERlcHRoQm91bmRzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRTdGVuY2lsQ29tcGFyZU1hc2siKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kU2V0U3RlbmNpbENvbXBhcmVNYXNrOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRTZXRTdGVuY2lsV3JpdGVNYXNrIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFNldFN0ZW5jaWxXcml0ZU1hc2s7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldFN0ZW5jaWxSZWZlcmVuY2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kU2V0U3RlbmNpbFJlZmVyZW5jZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZERlc2NyaXB0b3JTZXRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZEJpbmREZXNjcmlwdG9yU2V0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZEluZGV4QnVmZmVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZEJpbmRJbmRleEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmluZFZlcnRleEJ1ZmZlcnMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kQmluZFZlcnRleEJ1ZmZlcnM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXciKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kRHJhdzsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRHJhd0luZGV4ZWQiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kRHJhd0luZGV4ZWQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRpcmVjdCIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWREcmF3SW5kaXJlY3Q7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERyYXdJbmRleGVkSW5kaXJlY3QiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kRHJhd0luZGV4ZWRJbmRpcmVjdDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRGlzcGF0Y2giKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kRGlzcGF0Y2g7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZERpc3BhdGNoSW5kaXJlY3QiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kRGlzcGF0Y2hJbmRpcmVjdDsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ29weUJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRDb3B5QnVmZmVyOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5SW1hZ2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kQ29weUltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRCbGl0SW1hZ2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kQmxpdEltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5QnVmZmVyVG9JbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRDb3B5QnVmZmVyVG9JbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ29weUltYWdlVG9CdWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kQ29weUltYWdlVG9CdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFVwZGF0ZUJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRVcGRhdGVCdWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEZpbGxCdWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kRmlsbEJ1ZmZlcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ2xlYXJDb2xvckltYWdlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZENsZWFyQ29sb3JJbWFnZTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQ2xlYXJEZXB0aFN0ZW5jaWxJbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRDbGVhckRlcHRoU3RlbmNpbEltYWdlOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDbGVhckF0dGFjaG1lbnRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZENsZWFyQXR0YWNobWVudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFJlc29sdmVJbWFnZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRSZXNvbHZlSW1hZ2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFNldEV2ZW50IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFNldEV2ZW50OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRSZXNldEV2ZW50IikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFJlc2V0RXZlbnQ7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFdhaXRFdmVudHMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kV2FpdEV2ZW50czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kUGlwZWxpbmVCYXJyaWVyIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFBpcGVsaW5lQmFycmllcjsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kQmVnaW5RdWVyeSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRCZWdpblF1ZXJ5OworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRFbmRRdWVyeSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRFbmRRdWVyeTsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kUmVzZXRRdWVyeVBvb2wiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kUmVzZXRRdWVyeVBvb2w7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZFdyaXRlVGltZXN0YW1wIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFdyaXRlVGltZXN0YW1wOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRDb3B5UXVlcnlQb29sUmVzdWx0cyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRDb3B5UXVlcnlQb29sUmVzdWx0czsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ3JlYXRlRnJhbWVidWZmZXIiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ3JlYXRlRnJhbWVidWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlc3Ryb3lGcmFtZWJ1ZmZlciIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95RnJhbWVidWZmZXI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZVJlbmRlclBhc3MiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ3JlYXRlUmVuZGVyUGFzczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVzdHJveVJlbmRlclBhc3MiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveVJlbmRlclBhc3M7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFJlbmRlckFyZWFHcmFudWxhcml0eSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRSZW5kZXJBcmVhR3JhbnVsYXJpdHk7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEJlZ2luUmVuZGVyUGFzcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDbWRCZWdpblJlbmRlclBhc3M7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZE5leHRTdWJwYXNzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZE5leHRTdWJwYXNzOworICAgIGlmICghc3RyY21wKG5hbWUsICJDbWRQdXNoQ29uc3RhbnRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZFB1c2hDb25zdGFudHM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNtZEVuZFJlbmRlclBhc3MiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrQ21kRW5kUmVuZGVyUGFzczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiQ21kRXhlY3V0ZUNvbW1hbmRzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NtZEV4ZWN1dGVDb21tYW5kczsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIFBGTl92a1ZvaWRGdW5jdGlvbiBsYXllcl9pbnRlcmNlcHRfaW5zdGFuY2VfcHJvYyhjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmICghbmFtZSB8fCBuYW1lWzBdICE9ICd2JyB8fCBuYW1lWzFdICE9ICdrJykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBuYW1lICs9IDI7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZURldmljZSIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVEZXZpY2U7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkNyZWF0ZUluc3RhbmNlIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZUluc3RhbmNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJEZXN0cm95SW5zdGFuY2UiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveUluc3RhbmNlOworICAgIGlmICghc3RyY21wKG5hbWUsICJFbnVtZXJhdGVQaHlzaWNhbERldmljZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlRm9ybWF0UHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZUZvcm1hdFByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzOworICAgIGlmICghc3RyY21wKG5hbWUsICJHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZVNwYXJzZUltYWdlRm9ybWF0UHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VQcm9wZXJ0aWVzIikpCisgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlUHJvcGVydGllczsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkdldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyIpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXM7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMiKSkKKyAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllczsKKworICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFdhbnQgdHJhY2UgcGFja2V0cyBjcmVhdGVkIGZvciBHZXREZXZpY2VQcm9jQWRkciB0aGF0IGlzIGFwcCBpbml0aWF0ZWQKKyAqIGJ1dCBub3QgZm9yIGxvYWRlciBpbml0aWF0ZWQgY2FsbHMgdG8gR0RQQS4gVGh1cyBuZWVkIHR3byB2ZXJzaW9ucyBvZiBHRFBBLgorICovCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a3RyYWNlR2V0RGV2aWNlUHJvY0FkZHIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBjaGFyKiBmdW5jTmFtZSkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIgKnBIZWFkZXI7CisgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIGFkZHI7CisgICAgcGFja2V0X3ZrR2V0RGV2aWNlUHJvY0FkZHIqIHBQYWNrZXQgPSBOVUxMOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtHZXREZXZpY2VQcm9jQWRkciwgKChmdW5jTmFtZSAhPSBOVUxMKSA/IFJPVU5EVVBfVE9fNChzdHJsZW4oZnVuY05hbWUpICsgMSkgOiAwKSk7CisgICAgYWRkciA9IF9fSE9PS0VEX3ZrR2V0RGV2aWNlUHJvY0FkZHIoZGV2aWNlLCBmdW5jTmFtZSk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrR2V0RGV2aWNlUHJvY0FkZHIocEhlYWRlcik7CisgICAgcFBhY2tldC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBOYW1lKSwgKChmdW5jTmFtZSAhPSBOVUxMKSA/IFJPVU5EVVBfVE9fNChzdHJsZW4oZnVuY05hbWUpICsgMSkgOiAwKSwgZnVuY05hbWUpOworICAgIHBQYWNrZXQtPnJlc3VsdCA9IGFkZHI7CisgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cE5hbWUpKTsKKyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7CisgICAgcmV0dXJuIGFkZHI7Cit9CisKKy8qIEdEUEEgd2l0aCBubyB0cmFjZSBwYWNrZXQgY3JlYXRpb24gKi8KK1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIF9fSE9PS0VEX3ZrR2V0RGV2aWNlUHJvY0FkZHIoVmtEZXZpY2UgZGV2aWNlLCBjb25zdCBjaGFyKiBmdW5jTmFtZSkKK3sKKyAgICBpZiAoIXN0cmNtcCgidmtHZXREZXZpY2VQcm9jQWRkciIsIGZ1bmNOYW1lKSkgeworICAgICAgICBpZiAoZ01lc3NhZ2VTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIHZrdHJhY2VHZXREZXZpY2VQcm9jQWRkcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldERldmljZVByb2NBZGRyOworICAgICAgICB9CisgICAgfQorCisgICAgbGF5ZXJfZGV2aWNlX2RhdGEgICpkZXZEYXRhID0gbWRkKGRldmljZSk7CisgICAgaWYgKGdNZXNzYWdlU3RyZWFtICE9IE5VTEwpIHsKKworICAgICAgICBQRk5fdmtWb2lkRnVuY3Rpb24gYWRkcjsKKyAgICAgICAgYWRkciA9IGxheWVyX2ludGVyY2VwdF9wcm9jKGZ1bmNOYW1lKTsKKyAgICAgICAgaWYgKGFkZHIpCisgICAgICAgICAgICByZXR1cm4gYWRkcjsKKworICAgICAgICBpZiAoZGV2RGF0YS0+S0hSRGV2aWNlU3dhcGNoYWluRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlU3dhcGNoYWluS0hSIiwgZnVuY05hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0NyZWF0ZVN3YXBjaGFpbktIUjsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveVN3YXBjaGFpbktIUjsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCJ2a0dldFN3YXBjaGFpbkltYWdlc0tIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRTd2FwY2hhaW5JbWFnZXNLSFI7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtBY3F1aXJlTmV4dEltYWdlS0hSIiwgZnVuY05hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0FjcXVpcmVOZXh0SW1hZ2VLSFI7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtRdWV1ZVByZXNlbnRLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrUXVldWVQcmVzZW50S0hSOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRldmljZSA9PSBWS19OVUxMX0hBTkRMRSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBWa0xheWVyRGlzcGF0Y2hUYWJsZSAqcERpc3AgPSAgJmRldkRhdGEtPmRldlRhYmxlOworICAgIGlmIChwRGlzcC0+R2V0RGV2aWNlUHJvY0FkZHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHBEaXNwLT5HZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIGZ1bmNOYW1lKTsKK30KKworLyoqCisgKiBXYW50IHRyYWNlIHBhY2tldHMgY3JlYXRlZCBmb3IgR2V0SW5zdGFuY2VQcm9jQWRkciB0aGF0IGlzIGFwcCBpbml0aWF0ZWQKKyAqIGJ1dCBub3QgZm9yIGxvYWRlciBpbml0aWF0ZWQgY2FsbHMgdG8gR0lQQS4gVGh1cyBuZWVkIHR3byB2ZXJzaW9ucyBvZiBHSVBBLgorICovCitWS1RSQUNFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a3RyYWNlR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyKiBmdW5jTmFtZSkKK3sKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7CisgICAgUEZOX3ZrVm9pZEZ1bmN0aW9uIGFkZHI7CisgICAgcGFja2V0X3ZrR2V0SW5zdGFuY2VQcm9jQWRkciogcFBhY2tldCA9IE5VTEw7CisgICAgLy9hc3NlcnQoc3RyY21wKCJ2a0dldEluc3RhbmNlUHJvY0FkZHIiLCBmdW5jTmFtZSkpOworICAgIENSRUFURV9UUkFDRV9QQUNLRVQodmtHZXRJbnN0YW5jZVByb2NBZGRyLCAoKGZ1bmNOYW1lICE9IE5VTEwpID8gUk9VTkRVUF9UT180KHN0cmxlbihmdW5jTmFtZSkgKyAxKSA6IDApKTsKKyAgICBhZGRyID0gX19IT09LRURfdmtHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCBmdW5jTmFtZSk7CisgICAgdmt0cmFjZV9zZXRfcGFja2V0X2VudHJ5cG9pbnRfZW5kX3RpbWUocEhlYWRlcik7CisgICAgcFBhY2tldCA9IGludGVycHJldF9ib2R5X2FzX3ZrR2V0SW5zdGFuY2VQcm9jQWRkcihwSGVhZGVyKTsKKyAgICBwUGFja2V0LT5pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikgJihwUGFja2V0LT5wTmFtZSksICgoZnVuY05hbWUgIT0gTlVMTCkgPyBST1VORFVQX1RPXzQoc3RybGVuKGZ1bmNOYW1lKSArIDEpIDogMCksIGZ1bmNOYW1lKTsKKyAgICBwUGFja2V0LT5yZXN1bHQgPSBhZGRyOworICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikgJihwUGFja2V0LT5wTmFtZSkpOworICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTsKKyAgICByZXR1cm4gYWRkcjsKK30KKworLyogR0lQQSB3aXRoIG5vIHRyYWNlIHBhY2tldCBjcmVhdGlvbiAqLworVktUUkFDRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgX19IT09LRURfdmtHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIGZ1bmNOYW1lKQoreworICAgIFBGTl92a1ZvaWRGdW5jdGlvbiBhZGRyOworICAgIGxheWVyX2luc3RhbmNlX2RhdGEgICppbnN0RGF0YTsKKworICAgIHZrdHJhY2VfcGxhdGZvcm1fdGhyZWFkX29uY2UoKHZvaWQqKSAmZ0luaXRPbmNlLCBJbml0VHJhY2VyKTsKKyAgICBpZiAoIXN0cmNtcCgidmtHZXRJbnN0YW5jZVByb2NBZGRyIiwgZnVuY05hbWUpKSB7CisgICAgICAgIGlmIChnTWVzc2FnZVN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgdmt0cmFjZUdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRJbnN0YW5jZVByb2NBZGRyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdNZXNzYWdlU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgYWRkciA9IGxheWVyX2ludGVyY2VwdF9pbnN0YW5jZV9wcm9jKGZ1bmNOYW1lKTsKKyAgICAgICAgaWYgKGFkZHIpCisgICAgICAgICAgICByZXR1cm4gYWRkcjsKKworICAgICAgICBpZiAoaW5zdGFuY2UgPT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaW5zdERhdGEgPSBtaWQoaW5zdGFuY2UpOworICAgICAgICBpZiAoaW5zdERhdGEtPkx1bmFyZ0RlYnVnUmVwb3J0RW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQ7CisKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5zdERhdGEtPktIUlN1cmZhY2VFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VTdXBwb3J0S0hSIiwgZnVuY05hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFI7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtEZXN0cm95U3VyZmFjZUtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtEZXN0cm95U3VyZmFjZUtIUjsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFI7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VGb3JtYXRzS0hSIiwgZnVuY05hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFI7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSOworICAgICAgICB9CisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hMSUJfS0hSCisgICAgICAgIGlmIChpbnN0RGF0YS0+S0hSWGxpYlN1cmZhY2VFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVYbGliU3VyZmFjZUtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVYbGliU3VyZmFjZUtIUjsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICAgICAgaWYgKGluc3REYXRhLT5LSFJYY2JTdXJmYWNlRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlWGNiU3VyZmFjZUtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVYY2JTdXJmYWNlS0hSOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgZnVuY05hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgICAgIGlmIChpbnN0RGF0YS0+S0hSV2F5bGFuZFN1cmZhY2VFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUjsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCJ2a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIiLCBmdW5jTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChQRk5fdmtWb2lkRnVuY3Rpb24pIF9fSE9PS0VEX3ZrR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX01JUl9LSFIKKyAgICAgICAgaWYgKGluc3REYXRhLT5LSFJNaXJTdXJmYWNlRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoInZrQ3JlYXRlTWlyU3VyZmFjZUtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVNaXJTdXJmYWNlS0hSOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoInZrR2V0UGh5c2ljYWxEZXZpY2VNaXJQcmVzZW50YXRpb25TdXBwb3J0S0hSIiwgZnVuY05hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAoUEZOX3ZrVm9pZEZ1bmN0aW9uKSBfX0hPT0tFRF92a0dldFBoeXNpY2FsRGV2aWNlTWlyUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICBpZiAoaW5zdERhdGEtPktIUldpbjMyU3VyZmFjZUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCJ2a0NyZWF0ZVdpbjMyU3VyZmFjZUtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVXaW4zMlN1cmZhY2VLSFI7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUjsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisgICAgICAgIGlmIChpbnN0RGF0YS0+S0hSQW5kcm9pZFN1cmZhY2VFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCgidmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUiIsIGZ1bmNOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbikgX19IT09LRURfdmtDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGluc3RhbmNlID09IFZLX05VTExfSEFORExFKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpbnN0RGF0YSA9IG1pZChpbnN0YW5jZSk7CisgICAgfQorICAgIFZrTGF5ZXJJbnN0YW5jZURpc3BhdGNoVGFibGUqIHBUYWJsZSA9ICZpbnN0RGF0YS0+aW5zdFRhYmxlOworICAgIGlmIChwVGFibGUtPkdldEluc3RhbmNlUHJvY0FkZHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gcFRhYmxlLT5HZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCBmdW5jTmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBWa0xheWVyUHJvcGVydGllcyBsYXllclByb3BzID0geworICAgICJWS19MQVlFUl9MVU5BUkdfdmt0cmFjZSIsCisgICAgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwKKyAgICAxLCAiTHVuYXJHIHRyYWNpbmcgbGF5ZXIiLAorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1ZrUmVzdWx0IEVudW1lcmF0ZVByb3BlcnRpZXModWludDMyX3Qgc3JjX2NvdW50LCBjb25zdCBUICpzcmNfcHJvcHMsIHVpbnQzMl90ICpkc3RfY291bnQsIFQgKmRzdF9wcm9wcykgeworICAgIGlmICghZHN0X3Byb3BzIHx8ICFzcmNfcHJvcHMpIHsKKyAgICAgICAgKmRzdF9jb3VudCA9IHNyY19jb3VudDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgdWludDMyX3QgY29weV9jb3VudCA9ICgqZHN0X2NvdW50IDwgc3JjX2NvdW50KSA/ICpkc3RfY291bnQgOiBzcmNfY291bnQ7CisgICAgbWVtY3B5KGRzdF9wcm9wcywgc3JjX3Byb3BzLCBzaXplb2YoVCkgKiBjb3B5X2NvdW50KTsKKyAgICAqZHN0X2NvdW50ID0gY29weV9jb3VudDsKKworICAgIHJldHVybiAoY29weV9jb3VudCA9PSBzcmNfY291bnQpID8gVktfU1VDQ0VTUyA6IFZLX0lOQ09NUExFVEU7Cit9CisKKy8vIExvYWRlckxheWVySW50ZXJmYWNlIFYwCisvLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1Z1bGthbi1Mb2FkZXJBbmRWYWxpZGF0aW9uTGF5ZXJzL2Jsb2IvbWFzdGVyL2xvYWRlci9Mb2FkZXJBbmRMYXllckludGVyZmFjZS5tZAorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXModWludDMyX3QgKnBQcm9wZXJ0eUNvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gRW51bWVyYXRlUHJvcGVydGllcygxLCAmbGF5ZXJQcm9wcywgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICBpZiAocExheWVyTmFtZSAmJiAhc3RyY21wKHBMYXllck5hbWUsIGxheWVyUHJvcHMubGF5ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoMCwgKFZrRXh0ZW5zaW9uUHJvcGVydGllcyopbnVsbHB0ciwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZURldmljZUxheWVyUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiBFbnVtZXJhdGVQcm9wZXJ0aWVzKDEsICZsYXllclByb3BzLCBwUHJvcGVydHlDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcFByb3BlcnR5Q291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICBpZiAocExheWVyTmFtZSAmJiAhc3RyY21wKHBMYXllck5hbWUsIGxheWVyUHJvcHMubGF5ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIEVudW1lcmF0ZVByb3BlcnRpZXMoMCwgKFZrRXh0ZW5zaW9uUHJvcGVydGllcyopbnVsbHB0ciwgcFByb3BlcnR5Q291bnQsIHBQcm9wZXJ0aWVzKTsKKworICAgIHJldHVybiBWS19FUlJPUl9MQVlFUl9OT1RfUFJFU0VOVDsKK30KKworVktfTEFZRVJfRVhQT1JUIFZLQVBJX0FUVFIgUEZOX3ZrVm9pZEZ1bmN0aW9uIFZLQVBJX0NBTEwgVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2VHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIGZ1bmNOYW1lKSB7CisgICAgcmV0dXJuIF9fSE9PS0VEX3ZrR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQorCitWS19MQVlFUl9FWFBPUlQgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBWS19MQVlFUl9MVU5BUkdfdmt0cmFjZUdldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldmljZSwgY29uc3QgY2hhciogZnVuY05hbWUpIHsKKyAgICByZXR1cm4gX19IT09LRURfdmtHZXREZXZpY2VQcm9jQWRkcihkZXZpY2UsIGZ1bmNOYW1lKTsKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV92a19leHRzLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvdmt0cmFjZV92a19leHRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjNmYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX3ZrX2V4dHMuY3BwCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKi8KKyNpbmNsdWRlICJ2a3RyYWNlX2xpYl9oZWxwZXJzLmgiCisKKyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCIKKwordm9pZCBleHRfaW5pdF9jcmVhdGVfaW5zdGFuY2UoCisgICAgICAgIGxheWVyX2luc3RhbmNlX2RhdGEgICAgICAgICAgICAgKmluc3REYXRhLAorICAgICAgICBWa0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgIGluc3QsCisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2NvdW50LAorICAgICAgICBjb25zdCBjaGFyKmNvbnN0KiAgICAgICAgICAgICAgIHBwRW5hYmxlZEV4dGVuc2lvbnMpICAgIC8vIGV4dGVuc2lvbiBuYW1lcyB0byBiZSBlbmFibGVkCit7CisgICAgUEZOX3ZrR2V0SW5zdGFuY2VQcm9jQWRkciBncGEgPSBpbnN0RGF0YS0+aW5zdFRhYmxlLkdldEluc3RhbmNlUHJvY0FkZHI7CisKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkNyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQgPSAoUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCkgZ3BhKGluc3QsICJ2a0NyZWF0ZURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkRlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUID0gKFBGTl92a0Rlc3Ryb3lEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKSBncGEoaW5zdCwgInZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkRlYnVnUmVwb3J0TWVzc2FnZUVYVCA9IChQRk5fdmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQpIGdwYShpbnN0LCAidmtEZWJ1Z1JlcG9ydE1lc3NhZ2VFWFQiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlU3VwcG9ydEtIUikgZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFIiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkRlc3Ryb3lTdXJmYWNlS0hSID0gKFBGTl92a0Rlc3Ryb3lTdXJmYWNlS0hSKSBncGEoaW5zdCwgInZrRGVzdHJveVN1cmZhY2VLSFIiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIpIGdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUikgZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkdldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVByZXNlbnRNb2Rlc0tIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIpIGdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VQcmVzZW50TW9kZXNLSFIiKTsKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkNyZWF0ZVhsaWJTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZVhsaWJTdXJmYWNlS0hSKSBncGEoaW5zdCwgInZrQ3JlYXRlWGxpYlN1cmZhY2VLSFIiKTsKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkdldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUikgZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIiKTsKKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9YQ0JfS0hSCisgICAgaW5zdERhdGEtPmluc3RUYWJsZS5DcmVhdGVYY2JTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZVhjYlN1cmZhY2VLSFIpIGdwYShpbnN0LCAidmtDcmVhdGVYY2JTdXJmYWNlS0hSIik7CisgICAgaW5zdERhdGEtPmluc3RUYWJsZS5HZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIgPSAoUEZOX3ZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSKSBncGEoaW5zdCwgInZrR2V0UGh5c2ljYWxEZXZpY2VYY2JQcmVzZW50YXRpb25TdXBwb3J0S0hSIik7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fTUlSX0tIUgorICAgIGluc3REYXRhLT5pbnN0VGFibGUuQ3JlYXRlTWlyU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVNaXJTdXJmYWNlS0hSKSBncGEoaW5zdCwgInZrQ3JlYXRlTWlyU3VyZmFjZUtIUiIpOworICAgIGluc3REYXRhLT5pbnN0VGFibGUuR2V0UGh5c2ljYWxEZXZpY2VNaXJQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlTWlyUHJlc2VudGF0aW9uU3VwcG9ydEtIUikgZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlTWlyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiIpOworI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dBWUxBTkRfS0hSCisgICAgaW5zdERhdGEtPmluc3RUYWJsZS5DcmVhdGVXYXlsYW5kU3VyZmFjZUtIUiA9IChQRk5fdmtDcmVhdGVXYXlsYW5kU3VyZmFjZUtIUikgZ3BhKGluc3QsICJ2a0NyZWF0ZVdheWxhbmRTdXJmYWNlS0hSIik7CisgICAgaW5zdERhdGEtPmluc3RUYWJsZS5HZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSID0gKFBGTl92a0dldFBoeXNpY2FsRGV2aWNlV2F5bGFuZFByZXNlbnRhdGlvblN1cHBvcnRLSFIpIGdwYShpbnN0LCAidmtHZXRQaHlzaWNhbERldmljZVdheWxhbmRQcmVzZW50YXRpb25TdXBwb3J0S0hSIik7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0lOMzJfS0hSCisgICAgaW5zdERhdGEtPmluc3RUYWJsZS5DcmVhdGVXaW4zMlN1cmZhY2VLSFIgPSAoUEZOX3ZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSKSBncGEoaW5zdCwgInZrQ3JlYXRlV2luMzJTdXJmYWNlS0hSIik7CisgICAgaW5zdERhdGEtPmluc3RUYWJsZS5HZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiA9IChQRk5fdmtHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUikgZ3BhKGluc3QsICJ2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIik7CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyAgICBpbnN0RGF0YS0+aW5zdFRhYmxlLkNyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSID0gKFBGTl92a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKSBncGEoaW5zdCwgInZrQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFIiKTsKKyNlbmRpZgorICAgIGluc3REYXRhLT5MdW5hcmdEZWJ1Z1JlcG9ydEVuYWJsZWQgPSBmYWxzZTsKKyAgICBpbnN0RGF0YS0+S0hSU3VyZmFjZUVuYWJsZWQgPSBmYWxzZTsKKyAgICBpbnN0RGF0YS0+S0hSWGxpYlN1cmZhY2VFbmFibGVkID0gZmFsc2U7CisgICAgaW5zdERhdGEtPktIUlhjYlN1cmZhY2VFbmFibGVkID0gZmFsc2U7CisgICAgaW5zdERhdGEtPktIUldheWxhbmRTdXJmYWNlRW5hYmxlZCA9IGZhbHNlOworICAgIGluc3REYXRhLT5LSFJNaXJTdXJmYWNlRW5hYmxlZCA9IGZhbHNlOworICAgIGluc3REYXRhLT5LSFJXaW4zMlN1cmZhY2VFbmFibGVkID0gZmFsc2U7CisgICAgaW5zdERhdGEtPktIUkFuZHJvaWRTdXJmYWNlRW5hYmxlZCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQ7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKHBwRW5hYmxlZEV4dGVuc2lvbnNbaV0sIFZLX0VYVF9ERUJVR19SRVBPUlRfRVhURU5TSU9OX05BTUUpID09IDApIHsKKyAgICAgICAgICAgIGluc3REYXRhLT5MdW5hcmdEZWJ1Z1JlcG9ydEVuYWJsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAocHBFbmFibGVkRXh0ZW5zaW9uc1tpXSwgVktfS0hSX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpID09IDApIHsKKyAgICAgICAgICAgIGluc3REYXRhLT5LSFJTdXJmYWNlRW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0KKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fWExJQl9LSFIKKyAgICAgICAgaWYgKHN0cmNtcChwcEVuYWJsZWRFeHRlbnNpb25zW2ldLCBWS19LSFJfWExJQl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBpbnN0RGF0YS0+S0hSWGxpYlN1cmZhY2VFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1hDQl9LSFIKKyAgICAgICAgaWYgKHN0cmNtcChwcEVuYWJsZWRFeHRlbnNpb25zW2ldLCBWS19LSFJfWENCX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpID09IDApIHsKKyAgICAgICAgICAgIGluc3REYXRhLT5LSFJYY2JTdXJmYWNlRW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9NSVJfS0hSCisgICAgICAgIGlmIChzdHJjbXAocHBFbmFibGVkRXh0ZW5zaW9uc1tpXSwgVktfS0hSX01JUl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBpbnN0RGF0YS0+S0hSTWlyU3VyZmFjZUVuYWJsZWQgPSB0cnVlOworICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBWS19VU0VfUExBVEZPUk1fV0FZTEFORF9LSFIKKyAgICAgICAgaWYgKHN0cmNtcChwcEVuYWJsZWRFeHRlbnNpb25zW2ldLCBWS19LSFJfV0FZTEFORF9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBpbnN0RGF0YS0+S0hSV2F5bGFuZFN1cmZhY2VFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgVktfVVNFX1BMQVRGT1JNX1dJTjMyX0tIUgorICAgICAgICBpZiAoc3RyY21wKHBwRW5hYmxlZEV4dGVuc2lvbnNbaV0sIFZLX0tIUl9XSU4zMl9TVVJGQUNFX0VYVEVOU0lPTl9OQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBpbnN0RGF0YS0+S0hSV2luMzJTdXJmYWNlRW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorICAgICAgICBpZiAoc3RyY21wKHBwRW5hYmxlZEV4dGVuc2lvbnNbaV0sIFZLX0tIUl9BTkRST0lEX1NVUkZBQ0VfRVhURU5TSU9OX05BTUUpID09IDApIHsKKyAgICAgICAgICAgIGluc3REYXRhLT5LSFJBbmRyb2lkU3VyZmFjZUVuYWJsZWQgPSB0cnVlOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgZXh0X2luaXRfY3JlYXRlX2RldmljZSgKKyAgICAgICAgbGF5ZXJfZGV2aWNlX2RhdGEgICAgICAgICAgICAgICAqZGV2RGF0YSwKKyAgICAgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXYsCisgICAgICAgIFBGTl92a0dldERldmljZVByb2NBZGRyICAgICAgICAgZ3BhLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9jb3VudCwKKyAgICAgICAgY29uc3QgY2hhcipjb25zdCogICAgICAgICAgICAgICBwcEVuYWJsZWRFeHRlbnNpb25zKSAgLy8gZXh0ZW5zaW9uIG5hbWVzIHRvIGJlIGVuYWJsZWQKK3sKKyAgICBkZXZEYXRhLT5kZXZUYWJsZS5DcmVhdGVTd2FwY2hhaW5LSFIgPSAoUEZOX3ZrQ3JlYXRlU3dhcGNoYWluS0hSKSBncGEoZGV2LCAidmtDcmVhdGVTd2FwY2hhaW5LSFIiKTsKKyAgICBkZXZEYXRhLT5kZXZUYWJsZS5EZXN0cm95U3dhcGNoYWluS0hSID0gKFBGTl92a0Rlc3Ryb3lTd2FwY2hhaW5LSFIpIGdwYShkZXYsICJ2a0Rlc3Ryb3lTd2FwY2hhaW5LSFIiKTsKKyAgICBkZXZEYXRhLT5kZXZUYWJsZS5HZXRTd2FwY2hhaW5JbWFnZXNLSFIgPSAoUEZOX3ZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKSBncGEoZGV2LCAidmtHZXRTd2FwY2hhaW5JbWFnZXNLSFIiKTsKKyAgICBkZXZEYXRhLT5kZXZUYWJsZS5BY3F1aXJlTmV4dEltYWdlS0hSID0gKFBGTl92a0FjcXVpcmVOZXh0SW1hZ2VLSFIpIGdwYShkZXYsICJ2a0FjcXVpcmVOZXh0SW1hZ2VLSFIiKTsKKyAgICBkZXZEYXRhLT5kZXZUYWJsZS5RdWV1ZVByZXNlbnRLSFIgPSAoUEZOX3ZrUXVldWVQcmVzZW50S0hSKSBncGEoZGV2LCAidmtRdWV1ZVByZXNlbnRLSFIiKTsKKyAgICAKKyAgICBkZXZEYXRhLT5LSFJEZXZpY2VTd2FwY2hhaW5FbmFibGVkID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAocHBFbmFibGVkRXh0ZW5zaW9uc1tpXSwgVktfS0hSX1NXQVBDSEFJTl9FWFRFTlNJT05fTkFNRSkgPT0gMCkgeworICAgICAgICAgICAgZGV2RGF0YS0+S0hSRGV2aWNlU3dhcGNoYWluRW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX2xheWVyL3ZrdHJhY2VfdmtfZXh0cy5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX3ZrX2V4dHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE3NTAwCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci92a3RyYWNlX3ZrX2V4dHMuaApAQCAtMCwwICsxLDM3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidnVsa2FuL3ZrX2xheWVyLmgiCisjaW5jbHVkZSAidmt0cmFjZV9saWJfaGVscGVycy5oIgorCit2b2lkIGV4dF9pbml0X2NyZWF0ZV9pbnN0YW5jZSgKKyAgICAgICAgbGF5ZXJfaW5zdGFuY2VfZGF0YSAgICAgICAgICAgICAqaW5zdERhdGEsCisgICAgICAgIFZrSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgaW5zdCwKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fY291bnQsCisgICAgICAgIGNvbnN0IGNoYXIqY29uc3QqICAgICAgICAgICAgICAgcHBFbmFibGVkRXh0ZW5zaW9ucyk7CisKK3ZvaWQgZXh0X2luaXRfY3JlYXRlX2RldmljZSgKKyAgICAgICAgbGF5ZXJfZGV2aWNlX2RhdGEgICAgICAgICAgICAgICAqZGV2RGF0YSwKKyAgICAgICAgVmtEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBkZXYsCisgICAgICAgIFBGTl92a0dldERldmljZVByb2NBZGRyICAgICAgICAgZ3BhLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9jb3VudCwKKyAgICAgICAgY29uc3QgY2hhcipjb25zdCogICAgICAgICAgICAgICBwcEVuYWJsZWRFeHRlbnNpb25zKTsKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvd2luZG93cy9Wa0xheWVyX3ZrdHJhY2VfbGF5ZXIuanNvbiBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfbGF5ZXIvd2luZG93cy9Wa0xheWVyX3ZrdHJhY2VfbGF5ZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGUzZjkwCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9sYXllci93aW5kb3dzL1ZrTGF5ZXJfdmt0cmFjZV9sYXllci5qc29uCkBAIC0wLDAgKzEsMTUgQEAKK3sKKyAgICAiZmlsZV9mb3JtYXRfdmVyc2lvbiIgOiAiMS4wLjAiLAorICAgICJsYXllciIgOiB7CisgICAgICAgICJuYW1lIjogIlZLX0xBWUVSX0xVTkFSR192a3RyYWNlIiwKKyAgICAgICAgInR5cGUiOiAiR0xPQkFMIiwKKyAgICAgICAgImxpYnJhcnlfcGF0aCI6ICIuXFxWa0xheWVyX3ZrdHJhY2VfbGF5ZXIuZGxsIiwKKyAgICAgICAgImFwaV92ZXJzaW9uIjogIjEuMC4zMyIsCisgICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogIjEiLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiVmt0cmFjZSB0cmFjaW5nIGxpYnJhcnkiLAorICAgICAgICAiZnVuY3Rpb25zIiA6IHsKKyAgICAgICAgICAidmtHZXRJbnN0YW5jZVByb2NBZGRyIiA6ICJfX0hPT0tFRF92a0dldEluc3RhbmNlUHJvY0FkZHIiLAorICAgICAgICAgICJ2a0dldERldmljZVByb2NBZGRyIiA6ICJfX0hPT0tFRF92a0dldERldmljZVByb2NBZGRyIgorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvQ01ha2VMaXN0cy50eHQgYi92a3RyYWNlL3NyYy92a3RyYWNlX3JlcGxheS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQzZTYzCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKK3Byb2plY3QodmtyZXBsYXkpCisKK2luY2x1ZGUoIiR7U1JDX0RJUn0vYnVpbGRfb3B0aW9ucy5jbWFrZSIpCisKK3NldChTUkNfTElTVAorICAgICR7U1JDX0xJU1R9CisgICAgdmtyZXBsYXlfZmFjdG9yeS5oCisgICAgdmtyZXBsYXlfc2VxLmgKKyAgICB2a3JlcGxheV93aW5kb3cuaAorICAgIHZrcmVwbGF5X21haW4uY3BwCisgICAgdmtyZXBsYXlfc2VxLmNwcAorICAgIHZrcmVwbGF5X2ZhY3RvcnkuY3BwCispCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtTUkNfRElSfS92a3RyYWNlX3JlcGxheQorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9jb21tb24KKyAgICAke1NSQ19ESVJ9L3RoaXJkcGFydHkKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmtyZXBsYXkvCispCisKK3NldCAoTElCUkFSSUVTIHZrdHJhY2VfY29tbW9uIHZ1bGthbl9yZXBsYXkpCisKK2FkZF9leGVjdXRhYmxlKCR7UFJPSkVDVF9OQU1FfSAke1NSQ19MSVNUfSkKKworYWRkX2RlcGVuZGVuY2llcygke1BST0pFQ1RfTkFNRX0gInZ1bGthbi0ke01BSk9SfSIpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcygke1BST0pFQ1RfTkFNRX0KKyAgICAke0xJQlJBUklFU30KKykKKworYnVpbGRfb3B0aW9uc19maW5hbGl6ZSgpCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3JlcGxheS92a3JlcGxheV9mYWN0b3J5LmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X2ZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjQ1ODYKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3JlcGxheS92a3JlcGxheV9mYWN0b3J5LmNwcApAQCAtMCwwICsxLDE0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidmtyZXBsYXlfZmFjdG9yeS5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCisjaW5jbHVkZSAidmtyZXBsYXkuaCIKKworbmFtZXNwYWNlIHZrdHJhY2VfcmVwbGF5IHsKKwordmt0cmFjZV90cmFjZV9wYWNrZXRfcmVwbGF5X2xpYnJhcnkqIFJlcGxheUZhY3Rvcnk6OkNyZWF0ZSh1aW50OF90IHRyYWNlcklkKQoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5KiBwUmVwbGF5ZXIgPSBOVUxMOworICAgIC8vdm9pZCogcExpYnJhcnkgPSBOVUxMOworCisgICAgY29uc3QgVktUUkFDRV9UUkFDRVJfUkVQTEFZRVJfSU5GTyogcFJlcGxheWVySW5mbyA9ICYoZ3NfdHJhY2VyUmVwbGF5ZXJJbmZvW3RyYWNlcklkXSk7CisKKworICAgIGlmIChwUmVwbGF5ZXJJbmZvLT50cmFjZXJJZCAhPSB0cmFjZXJJZCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlJlcGxheWVyIGluZm8gZm9yIFRyYWNlcklkICglZCkgZmFpbGVkIGNvbnNpc3RlbmN5IGNoZWNrLiIsIHRyYWNlcklkKTsKKyAgICAgICAgYXNzZXJ0KCEiVHJhY2VySWQgaW4gVktUUkFDRV9UUkFDRVJfUkVQTEFZRVJfSU5GTyBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWVzdGVkIHRyYWNlcklkLiBUaGUgYXJyYXkgbmVlZHMgdG8gYmUgY29ycmVjdGVkLiIpOworICAgIH0KKworICAgIC8vIFZ1bGthbiBsaWJyYXJ5IGlzIGJ1aWx0IGludG8gcmVwbGF5ZXIgZXhlY3V0YWJsZQorICAgIGlmICh0cmFjZXJJZCA9PSBWS1RSQUNFX1RJRF9WVUxLQU4pIHsKKyAgICAgICAgcFJlcGxheWVyID0gVktUUkFDRV9ORVcodmt0cmFjZV90cmFjZV9wYWNrZXRfcmVwbGF5X2xpYnJhcnkpOworICAgICAgICBpZiAocFJlcGxheWVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSByZXBsYXllciBsaWJyYXJ5LiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFJlcGxheWVyLT5wTGlicmFyeSA9IE5VTEw7CisKKyAgICAgICAgICAgIHBSZXBsYXllci0+U2V0TG9nQ2FsbGJhY2sgPSBWa1JlcGxheVNldExvZ0NhbGxiYWNrOworICAgICAgICAgICAgcFJlcGxheWVyLT5TZXRMb2dMZXZlbCA9IFZrUmVwbGF5U2V0TG9nTGV2ZWw7CisKKyAgICAgICAgICAgIHBSZXBsYXllci0+UmVnaXN0ZXJEYmdNc2dDYWxsYmFjayA9IFZrUmVwbGF5UmVnaXN0ZXJEYmdNc2dDYWxsYmFjazsKKyAgICAgICAgICAgIHBSZXBsYXllci0+R2V0U2V0dGluZ3MgPSBWa1JlcGxheUdldFNldHRpbmdzOworICAgICAgICAgICAgcFJlcGxheWVyLT5VcGRhdGVGcm9tU2V0dGluZ3MgPSBWa1JlcGxheVVwZGF0ZUZyb21TZXR0aW5nczsKKyAgICAgICAgICAgIHBSZXBsYXllci0+SW5pdGlhbGl6ZSA9IFZrUmVwbGF5SW5pdGlhbGl6ZTsKKyAgICAgICAgICAgIHBSZXBsYXllci0+RGVpbml0aWFsaXplID0gVmtSZXBsYXlEZWluaXRpYWxpemU7CisgICAgICAgICAgICBwUmVwbGF5ZXItPkludGVycHJldCA9IFZrUmVwbGF5SW50ZXJwcmV0OworICAgICAgICAgICAgcFJlcGxheWVyLT5SZXBsYXkgPSBWa1JlcGxheVJlcGxheTsKKyAgICAgICAgICAgIHBSZXBsYXllci0+RHVtcCA9IFZrUmVwbGF5RHVtcDsKKyAgICAgICAgICAgIHBSZXBsYXllci0+R2V0RnJhbWVOdW1iZXIgPSBWa1JlcGxheUdldEZyYW1lTnVtYmVyOworICAgICAgICAgICAgcFJlcGxheWVyLT5SZXNldEZyYW1lTnVtYmVyID0gVmtSZXBsYXlSZXNldEZyYW1lTnVtYmVyOworICAgICAgICB9CisKKyAgICB9CisgICAgCisvLyAgICBpZiAocFJlcGxheWVySW5mby0+bmVlZHNSZXBsYXllciA9PSBUUlVFKQorLy8gICAgeworLy8gICAgICAgIHBMaWJyYXJ5ID0gdmt0cmFjZV9wbGF0Zm9ybV9vcGVuX2xpYnJhcnkocFJlcGxheWVySW5mby0+cmVwbGF5ZXJMaWJyYXJ5TmFtZSk7CisvLyAgICAgICAgaWYgKHBMaWJyYXJ5ID09IE5VTEwpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gbG9hZCByZXBsYXllciAnJXMuIiwgcFJlcGxheWVySW5mby0+cmVwbGF5ZXJMaWJyYXJ5TmFtZSk7CisvLyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorLy8gICAgICAgICAgICBjaGFyKiBlcnJvciA9IGRsZXJyb3IoKTsKKy8vICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcihlcnJvcik7CisvLyNlbmRpZgorLy8gICAgICAgIH0KKy8vICAgIH0KKy8vICAgIGVsc2UKKy8vICAgIHsKKy8vICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJBIHJlcGxheWVyIHdhcyByZXF1ZXN0ZWQgZm9yIFRyYWNlcklkICglZCksIGJ1dCBpdCBkb2VzIG5vdCByZXF1aXJlIGEgcmVwbGF5ZXIuIiwgdHJhY2VySWQpOworLy8gICAgICAgIGFzc2VydCghIkludmFsaWQgVHJhY2VySWQgc3VwcGxpZWQgdG8gUmVwbGF5RmFjdG9yeSIpOworLy8gICAgfQorLy8KKy8vICAgIGlmIChwTGlicmFyeSAhPSBOVUxMKQorLy8gICAgeworLy8gICAgICAgIHBSZXBsYXllciA9IFZLVFJBQ0VfTkVXKHZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5KTsKKy8vICAgICAgICBpZiAocFJlcGxheWVyID09IE5VTEwpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVwbGF5ZXIgbGlicmFyeS4iKTsKKy8vICAgICAgICAgICAgdmt0cmFjZV9wbGF0Zm9ybV9jbG9zZV9saWJyYXJ5KHBMaWJyYXJ5KTsKKy8vICAgICAgICB9CisvLyAgICAgICAgZWxzZQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgcFJlcGxheWVyLT5wTGlicmFyeSA9IHBMaWJyYXJ5OworLy8KKy8vICAgICAgICAgICAgcFJlcGxheWVyLT5TZXRMb2dDYWxsYmFjayA9IChmdW5jcHRyX3ZrcmVwbGF5ZXJfc2V0bG9nY2FsbGJhY2spdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAiU2V0TG9nQ2FsbGJhY2siKTsKKy8vICAgICAgICAgICAgcFJlcGxheWVyLT5TZXRMb2dMZXZlbCA9IChmdW5jcHRyX3ZrcmVwbGF5ZXJfc2V0bG9nbGV2ZWwpdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAiU2V0TG9nTGV2ZWwiKTsKKy8vCisvLyAgICAgICAgICAgIHBSZXBsYXllci0+UmVnaXN0ZXJEYmdNc2dDYWxsYmFjayA9IChmdW5jcHRyX3ZrcmVwbGF5ZXJfcmVnaXN0ZXJkYmdtc2djYWxsYmFjayl2a3RyYWNlX3BsYXRmb3JtX2dldF9saWJyYXJ5X2VudHJ5cG9pbnQocExpYnJhcnksICJSZWdpc3RlckRiZ01zZ0NhbGxiYWNrIik7CisvLyAgICAgICAgICAgIHBSZXBsYXllci0+R2V0U2V0dGluZ3MgPSAoZnVuY3B0cl92a3JlcGxheWVyX2dldFNldHRpbmdzKXZrdHJhY2VfcGxhdGZvcm1fZ2V0X2xpYnJhcnlfZW50cnlwb2ludChwTGlicmFyeSwgIkdldFNldHRpbmdzIik7CisvLyAgICAgICAgICAgIHBSZXBsYXllci0+VXBkYXRlRnJvbVNldHRpbmdzID0gKGZ1bmNwdHJfdmtyZXBsYXllcl91cGRhdGVmcm9tc2V0dGluZ3Mpdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAiVXBkYXRlRnJvbVNldHRpbmdzIik7CisvLyAgICAgICAgICAgIHBSZXBsYXllci0+SW5pdGlhbGl6ZSA9IChmdW5jcHRyX3ZrcmVwbGF5ZXJfaW5pdGlhbGl6ZSl2a3RyYWNlX3BsYXRmb3JtX2dldF9saWJyYXJ5X2VudHJ5cG9pbnQocExpYnJhcnksICJJbml0aWFsaXplIik7CisvLyAgICAgICAgICAgIHBSZXBsYXllci0+RGVpbml0aWFsaXplID0gKGZ1bmNwdHJfdmtyZXBsYXllcl9kZWluaXRpYWxpemUpdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAiRGVpbml0aWFsaXplIik7CisvLyAgICAgICAgICAgIHBSZXBsYXllci0+SW50ZXJwcmV0ID0gKGZ1bmNwdHJfdmtyZXBsYXllcl9pbnRlcnByZXQpdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAiSW50ZXJwcmV0Iik7CisvLyAgICAgICAgICAgIHBSZXBsYXllci0+UmVwbGF5ID0gKGZ1bmNwdHJfdmtyZXBsYXllcl9yZXBsYXkpdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAiUmVwbGF5Iik7CisvLyAgICAgICAgICAgIHBSZXBsYXllci0+RHVtcCA9IChmdW5jcHRyX3ZrcmVwbGF5ZXJfZHVtcCl2a3RyYWNlX3BsYXRmb3JtX2dldF9saWJyYXJ5X2VudHJ5cG9pbnQocExpYnJhcnksICJEdW1wIik7CisvLworLy8gICAgICAgICAgICBpZiAocFJlcGxheWVyLT5TZXRMb2dDYWxsYmFjayA9PSBOVUxMIHx8CisvLyAgICAgICAgICAgICAgICBwUmVwbGF5ZXItPlNldExvZ0xldmVsID09IE5VTEwgfHwKKy8vICAgICAgICAgICAgICAgIHBSZXBsYXllci0+UmVnaXN0ZXJEYmdNc2dDYWxsYmFjayA9PSBOVUxMIHx8CisvLyAgICAgICAgICAgICAgICBwUmVwbGF5ZXItPkdldFNldHRpbmdzID09IE5VTEwgfHwKKy8vICAgICAgICAgICAgICAgIHBSZXBsYXllci0+VXBkYXRlRnJvbVNldHRpbmdzID09IE5VTEwgfHwKKy8vICAgICAgICAgICAgICAgIHBSZXBsYXllci0+SW5pdGlhbGl6ZSA9PSBOVUxMIHx8CisvLyAgICAgICAgICAgICAgICBwUmVwbGF5ZXItPkRlaW5pdGlhbGl6ZSA9PSBOVUxMIHx8CisvLyAgICAgICAgICAgICAgICBwUmVwbGF5ZXItPkludGVycHJldCA9PSBOVUxMIHx8CisvLyAgICAgICAgICAgICAgICBwUmVwbGF5ZXItPlJlcGxheSA9PSBOVUxMIHx8CisvLyAgICAgICAgICAgICAgICBwUmVwbGF5ZXItPkR1bXAgPT0gTlVMTCkKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUocFJlcGxheWVyKTsKKy8vICAgICAgICAgICAgICAgIHZrdHJhY2VfcGxhdGZvcm1fY2xvc2VfbGlicmFyeShwTGlicmFyeSk7CisvLyAgICAgICAgICAgICAgICBwUmVwbGF5ZXIgPSBOVUxMOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfQorLy8gICAgfQorCisgICAgcmV0dXJuIHBSZXBsYXllcjsKK30KKwordm9pZCBSZXBsYXlGYWN0b3J5OjpEZXN0cm95KHZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5KiogcHBSZXBsYXllcikKK3sKKyAgICBhc3NlcnQgKHBwUmVwbGF5ZXIgIT0gTlVMTCk7CisgICAgYXNzZXJ0ICgqcHBSZXBsYXllciAhPSBOVUxMKTsKKyAgICBpZiAoKCpwcFJlcGxheWVyKS0+cExpYnJhcnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfcGxhdGZvcm1fY2xvc2VfbGlicmFyeSgoKnBwUmVwbGF5ZXIpLT5wTGlicmFyeSk7CisgICAgfQorICAgIFZLVFJBQ0VfREVMRVRFKCpwcFJlcGxheWVyKTsKKyAgICAqcHBSZXBsYXllciA9IE5VTEw7Cit9CisKKworfSAvLyBuYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X2ZhY3RvcnkuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRkOWYwCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfZmFjdG9yeS5oCkBAIC0wLDAgKzEsOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIgorI2luY2x1ZGUgInZrdHJhY2Vfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF9pZGVudGlmaWVycy5oIgorfQorI2luY2x1ZGUgInZrcmVwbGF5X3dpbmRvdy5oIgorI2luY2x1ZGUgInZrcmVwbGF5X21haW4uaCIKKworbmFtZXNwYWNlIHZrdHJhY2VfcmVwbGF5IHsKKworZW51bSBWS1RSQUNFX1JFUExBWV9SRVNVTFQKK3sKKyAgICBWS1RSQUNFX1JFUExBWV9TVUNDRVNTID0gMCwKKyAgICBWS1RSQUNFX1JFUExBWV9FUlJPUiwgICAgICAgICAgLy8gaW50ZXJuYWwgZXJyb3IgdW5yZWxhdGVkIHRvIHRoZSBzcGVjaWZpYyBwYWNrZXQKKyAgICBWS1RSQUNFX1JFUExBWV9JTlZBTElEX0lELCAgICAgLy8gcGFja2V0X2lkIGludmFsaWQKKyAgICBWS1RSQUNFX1JFUExBWV9CQURfUkVUVVJOLCAgICAgLy8gcmVwbGF5IHJldHVybiB2YWx1ZSAhPSB0cmFjZSByZXR1cm4gdmFsdWUKKyAgICBWS1RSQUNFX1JFUExBWV9DQUxMX0VSUk9SLCAgICAgLy8gcmVwbGF5aW5nIGNhbGwgY2F1c2VkIGFuIGVycm9yCisgICAgVktUUkFDRV9SRVBMQVlfSU5WQUxJRF9QQVJBTVMsIC8vIHRyYWNlIGZpbGUgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZLVFJBQ0VfUkVQTEFZX1ZBTElEQVRJT05fRVJST1IgLy8gY2FsbGJhY2sgTXNnIGVycm9yIGZyb20gdmFsaWRhdGlvbiBsYXllcgorfTsKKworZW51bSBWS1RSQUNFX0RCR19NU0dfVFlQRQoreworICAgIFZLVFJBQ0VfREJHX01TR19JTkZPID0gMCwKKyAgICBWS1RSQUNFX0RCR19NU0dfV0FSTklORywKKyAgICBWS1RSQUNFX0RCR19NU0dfRVJST1IKK307CisKKy8vIGNhbGxiYWNrIHNpZ25hdHVyZQordHlwZWRlZiB2b2lkICgqVktUUkFDRV9EQkdfTVNHX0NBTExCQUNLX0ZVTkNUSU9OKShWS1RSQUNFX0RCR19NU0dfVFlQRSBtc2dUeXBlLCBjb25zdCBjaGFyKiBwTXNnKTsKKworLy8gZW50cnlwb2ludHMgdGhhdCBtdXN0IGJlIGV4cG9zZWQgYnkgZWFjaCByZXBsYXllciBsaWJyYXJ5CitleHRlcm4gIkMiCit7CisvLyBlbnRyeXBvaW50cworCit0eXBlZGVmIHZvaWQgKFZLVFJBQ0VSX0NERUNMICpmdW5jcHRyX3ZrcmVwbGF5ZXJfc2V0bG9nbGV2ZWwpKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKFZLVFJBQ0VSX0NERUNMICpmdW5jcHRyX3ZrcmVwbGF5ZXJfc2V0bG9nY2FsbGJhY2spKFZLVFJBQ0VfUkVQT1JUX0NBTExCQUNLX0ZVTkNUSU9OIHBDYWxsYmFjayk7CisKK3R5cGVkZWYgdm9pZCAoVktUUkFDRVJfQ0RFQ0wgKmZ1bmNwdHJfdmtyZXBsYXllcl9yZWdpc3RlcmRiZ21zZ2NhbGxiYWNrKShWS1RSQUNFX0RCR19NU0dfQ0FMTEJBQ0tfRlVOQ1RJT04gcENhbGxiYWNrKTsKK3R5cGVkZWYgdmt0cmFjZV9TZXR0aW5nR3JvdXAqIChWS1RSQUNFUl9DREVDTCAqZnVuY3B0cl92a3JlcGxheWVyX2dldFNldHRpbmdzKSgpOwordHlwZWRlZiB2b2lkIChWS1RSQUNFUl9DREVDTCAqZnVuY3B0cl92a3JlcGxheWVyX3VwZGF0ZWZyb21zZXR0aW5ncykodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTZXR0aW5nR3JvdXBzLCB1bnNpZ25lZCBpbnQgbnVtU2V0dGluZ0dyb3Vwcyk7Cit0eXBlZGVmIGludCAoVktUUkFDRVJfQ0RFQ0wgKmZ1bmNwdHJfdmtyZXBsYXllcl9pbml0aWFsaXplKSh2a3RyYWNlX3JlcGxheTo6UmVwbGF5RGlzcGxheSogcERpc3BsYXksIHZrcmVwbGF5ZXJfc2V0dGluZ3MqIHBSZXBsYXlTZXR0aW5ncyk7Cit0eXBlZGVmIHZvaWQgKFZLVFJBQ0VSX0NERUNMICpmdW5jcHRyX3ZrcmVwbGF5ZXJfZGVpbml0aWFsaXplKSgpOwordHlwZWRlZiB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIChWS1RSQUNFUl9DREVDTCAqZnVuY3B0cl92a3JlcGxheWVyX2ludGVycHJldCkodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwUGFja2V0KTsKK3R5cGVkZWYgdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX1JFU1VMVCAoVktUUkFDRVJfQ0RFQ0wgKmZ1bmNwdHJfdmtyZXBsYXllcl9yZXBsYXkpKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcFBhY2tldCk7Cit0eXBlZGVmIGludCAoVktUUkFDRVJfQ0RFQ0wgKmZ1bmNwdHJfdmtyZXBsYXllcl9kdW1wKSgpOwordHlwZWRlZiBpbnQgKFZLVFJBQ0VSX0NERUNMICpmdW5jcHRyX3ZrcmVwbGF5ZXJfZ2V0ZnJhbWVudW1iZXIpKCk7Cit0eXBlZGVmIHZvaWQgKFZLVFJBQ0VSX0NERUNMICpmdW5jcHRyX3ZrcmVwbGF5ZXJfcmVzZXRmcmFtZW51bWJlcikoKTsKK30KKworc3RydWN0IHZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5Cit7CisgICAgdm9pZCogcExpYnJhcnk7CisgICAgZnVuY3B0cl92a3JlcGxheWVyX3NldGxvZ2xldmVsIFNldExvZ0xldmVsOworICAgIGZ1bmNwdHJfdmtyZXBsYXllcl9zZXRsb2djYWxsYmFjayBTZXRMb2dDYWxsYmFjazsKKworICAgIGZ1bmNwdHJfdmtyZXBsYXllcl9yZWdpc3RlcmRiZ21zZ2NhbGxiYWNrIFJlZ2lzdGVyRGJnTXNnQ2FsbGJhY2s7CisgICAgZnVuY3B0cl92a3JlcGxheWVyX2dldFNldHRpbmdzIEdldFNldHRpbmdzOworICAgIGZ1bmNwdHJfdmtyZXBsYXllcl91cGRhdGVmcm9tc2V0dGluZ3MgVXBkYXRlRnJvbVNldHRpbmdzOworICAgIGZ1bmNwdHJfdmtyZXBsYXllcl9pbml0aWFsaXplIEluaXRpYWxpemU7CisgICAgZnVuY3B0cl92a3JlcGxheWVyX2RlaW5pdGlhbGl6ZSBEZWluaXRpYWxpemU7CisgICAgZnVuY3B0cl92a3JlcGxheWVyX2ludGVycHJldCBJbnRlcnByZXQ7CisgICAgZnVuY3B0cl92a3JlcGxheWVyX3JlcGxheSBSZXBsYXk7CisgICAgZnVuY3B0cl92a3JlcGxheWVyX2R1bXAgRHVtcDsKKyAgICBmdW5jcHRyX3ZrcmVwbGF5ZXJfZ2V0ZnJhbWVudW1iZXIgR2V0RnJhbWVOdW1iZXI7CisgICAgZnVuY3B0cl92a3JlcGxheWVyX3Jlc2V0ZnJhbWVudW1iZXIgUmVzZXRGcmFtZU51bWJlcjsKK307CisKK2NsYXNzIFJlcGxheUZhY3RvcnkgeworcHVibGljOgorICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5ICpDcmVhdGUodWludDhfdCB0cmFjZXJJZCk7CisgICAgdm9pZCBEZXN0cm95KHZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5KiogcHBSZXBsYXllcik7Cit9OworfSAvLyBuYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X21haW4uY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhNTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X21haW4uY3BwCkBAIC0wLDAgKzEsNTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKiBBdXRob3I6IERhdmlkIFBpbmVkbyA8ZGF2aWRAbHVuYXJnLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2lmIGRlZmluZWQoQU5EUk9JRCkKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGFuZHJvaWRfbmF0aXZlX2FwcF9nbHVlLmg+CisjZW5kaWYKKyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2Vsb2cuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2ZpbGVsaWtlLmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a3JlcGxheV9tYWluLmgiCisjaW5jbHVkZSAidmtyZXBsYXlfZmFjdG9yeS5oIgorI2luY2x1ZGUgInZrcmVwbGF5X3NlcS5oIgorI2luY2x1ZGUgInZrcmVwbGF5X3dpbmRvdy5oIgorCit2a3JlcGxheWVyX3NldHRpbmdzIHJlcGxheVNldHRpbmdzID0geyBOVUxMLCAxLCAtMSwgLTEsIE5VTEwsIE5VTEwgfTsKKwordmt0cmFjZV9TZXR0aW5nSW5mbyBnX3NldHRpbmdzX2luZm9bXSA9Cit7CisgICAgeyAidCIsICJUcmFjZUZpbGUiLCBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HLCB7ICZyZXBsYXlTZXR0aW5ncy5wVHJhY2VGaWxlUGF0aCB9LCB7ICZyZXBsYXlTZXR0aW5ncy5wVHJhY2VGaWxlUGF0aCB9LCBUUlVFLCAiVGhlIHRyYWNlIGZpbGUgdG8gcmVwbGF5LiJ9LAorICAgIHsgImwiLCAiTnVtTG9vcHMiLCBWS1RSQUNFX1NFVFRJTkdfVUlOVCwgeyAmcmVwbGF5U2V0dGluZ3MubnVtTG9vcHMgfSwgeyAmcmVwbGF5U2V0dGluZ3MubnVtTG9vcHMgfSwgVFJVRSwgIlRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwbGF5IHRoZSB0cmFjZSBmaWxlIG9yIGxvb3AgcmFuZ2UuIiB9LAorICAgIHsgImxzZiIsICJMb29wU3RhcnRGcmFtZSIsIFZLVFJBQ0VfU0VUVElOR19JTlQsIHsgJnJlcGxheVNldHRpbmdzLmxvb3BTdGFydEZyYW1lIH0sIHsgJnJlcGxheVNldHRpbmdzLmxvb3BTdGFydEZyYW1lIH0sIFRSVUUsICJUaGUgc3RhcnQgZnJhbWUgbnVtYmVyIG9mIHRoZSBsb29wIHJhbmdlLiIgfSwKKyAgICB7ICJsZWYiLCAiTG9vcEVuZEZyYW1lIiwgVktUUkFDRV9TRVRUSU5HX0lOVCwgeyAmcmVwbGF5U2V0dGluZ3MubG9vcEVuZEZyYW1lIH0sIHsgJnJlcGxheVNldHRpbmdzLmxvb3BFbmRGcmFtZSB9LCBUUlVFLCAiVGhlIGVuZCBmcmFtZSBudW1iZXIgb2YgdGhlIGxvb3AgcmFuZ2UuIiB9LAorICAgIHsgInMiLCAiU2NyZWVuc2hvdCIsIFZLVFJBQ0VfU0VUVElOR19TVFJJTkcsIHsgJnJlcGxheVNldHRpbmdzLnNjcmVlbnNob3RMaXN0IH0sIHsgJnJlcGxheVNldHRpbmdzLnNjcmVlbnNob3RMaXN0IH0sIFRSVUUsICJDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmcmFtZXMgdG8gdGFrZSBhIHNuYXBzaG90IG9mLiJ9LAorI2lmIF9ERUJVRworICAgIHsgInYiLCAiVmVyYm9zaXR5IiwgVktUUkFDRV9TRVRUSU5HX1NUUklORywgeyAmcmVwbGF5U2V0dGluZ3MudmVyYm9zaXR5IH0sIHsgJnJlcGxheVNldHRpbmdzLnZlcmJvc2l0eSB9LCBUUlVFLCAiVmVyYm9zaXR5IG1vZGUuIE1vZGVzIGFyZSBcInF1aWV0XCIsIFwiZXJyb3JzXCIsIFwid2FybmluZ3NcIiwgXCJmdWxsXCIsIFwiZGVidWdcIi4ifSwKKyNlbHNlCisgICAgeyAidiIsICJWZXJib3NpdHkiLCBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HLCB7ICZyZXBsYXlTZXR0aW5ncy52ZXJib3NpdHkgfSwgeyAmcmVwbGF5U2V0dGluZ3MudmVyYm9zaXR5IH0sIFRSVUUsICJWZXJib3NpdHkgbW9kZS4gTW9kZXMgYXJlIFwicXVpZXRcIiwgXCJlcnJvcnNcIiwgXCJ3YXJuaW5nc1wiLCBcImZ1bGxcIi4ifSwKKyNlbmRpZgorfTsKKwordmt0cmFjZV9TZXR0aW5nR3JvdXAgZ19yZXBsYXlTZXR0aW5nR3JvdXAgPQoreworICAgICJ2a3JlcGxheSIsCisgICAgc2l6ZW9mKGdfc2V0dGluZ3NfaW5mbykgLyBzaXplb2YoZ19zZXR0aW5nc19pbmZvWzBdKSwKKyAgICAmZ19zZXR0aW5nc19pbmZvWzBdCit9OworCituYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkgeworaW50IG1haW5fbG9vcChTZXF1ZW5jZXIgJnNlcSwgdmt0cmFjZV90cmFjZV9wYWNrZXRfcmVwbGF5X2xpYnJhcnkgKnJlcGxheWVyQXJyYXlbXSwgdmtyZXBsYXllcl9zZXR0aW5ncyBzZXR0aW5ncykKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIgKnBhY2tldDsKKyAgICB1bnNpZ25lZCBpbnQgcmVzOworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5ICpyZXBsYXllciA9IE5VTEw7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfbWVzc2FnZSogbXNnUGFja2V0OworICAgIHN0cnVjdCBzZXFCb29rbWFyayBzdGFydGluZ1BhY2tldDsKKworICAgIGJvb2wgdHJhY2VfcnVubmluZyA9IHRydWU7CisgICAgaW50IHByZXZGcmFtZU51bWJlciA9IC0xOworCisgICAgLy8gcmVjb3JkIHRoZSBsb2NhdGlvbiBvZiBsb29waW5nIHN0YXJ0IHBhY2tldAorICAgIHNlcS5yZWNvcmRfYm9va21hcmsoKTsKKyAgICBzZXEuZ2V0X2Jvb2ttYXJrKHN0YXJ0aW5nUGFja2V0KTsKKyAgICB3aGlsZSAoc2V0dGluZ3MubnVtTG9vcHMgPiAwKQorICAgIHsKKyAgICAgICAgd2hpbGUgKChwYWNrZXQgPSBzZXEuZ2V0X25leHRfcGFja2V0KCkpICE9IE5VTEwgJiYgdHJhY2VfcnVubmluZykKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChwYWNrZXQtPnBhY2tldF9pZCkgeworICAgICAgICAgICAgICAgIGNhc2UgVktUUkFDRV9UUElfTUVTU0FHRToKKyAgICAgICAgICAgICAgICAgICAgbXNnUGFja2V0ID0gdmt0cmFjZV9pbnRlcnByZXRfYm9keV9hc190cmFjZV9wYWNrZXRfbWVzc2FnZShwYWNrZXQpOworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Fsd2F5cygiUGFja2V0ICVsdTogVHJhY2VkIE1lc3NhZ2UgKCVzKTogJXMiLCBwYWNrZXQtPmdsb2JhbF9wYWNrZXRfaW5kZXgsIHZrdHJhY2VfTG9nTGV2ZWxUb1Nob3J0U3RyaW5nKG1zZ1BhY2tldC0+dHlwZSksIG1zZ1BhY2tldC0+bWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVktUUkFDRV9UUElfTUFSS0VSX0NIRUNLUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVktUUkFDRV9UUElfTUFSS0VSX0FQSV9CT1VOREFSWToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9NQVJLRVJfQVBJX0dST1VQX0JFR0lOOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfRU5EOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9URVJNSU5BVEVfUFJPQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy9UT0RPIHByb2Nlc3NpbmcgY29kZSBmb3IgYWxsIHRoZSBhYm92ZSBjYXNlcworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFja2V0LT50cmFjZXJfaWQgPj0gVktUUkFDRV9NQVhfVFJBQ0VSX0lEX0FSUkFZX1NJWkUgIHx8IHBhY2tldC0+dHJhY2VyX2lkID09IFZLVFJBQ0VfVElEX1JFU0VSVkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJUcmFjZXJfaWQgZnJvbSBwYWNrZXQgbnVtIHBhY2tldCAlZCBpbnZhbGlkLiIsIHBhY2tldC0+cGFja2V0X2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcGxheWVyID0gcmVwbGF5ZXJBcnJheVtwYWNrZXQtPnRyYWNlcl9pZF07CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYXllciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoIlRyYWNlcl9pZCAlZCBoYXMgbm8gdmFsaWQgcmVwbGF5ZXIuIiwgcGFja2V0LT50cmFjZXJfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2tldC0+cGFja2V0X2lkID49IFZLVFJBQ0VfVFBJX0JFR0lOX0FQSV9IRVJFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGhlIEFQSSBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcGxheWVyLT5SZXBsYXkocmVwbGF5ZXItPkludGVycHJldChwYWNrZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gVktUUkFDRV9SRVBMQVlfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byByZXBsYXkgcGFja2V0X2lkICVkLCB3aXRoIGdsb2JhbF9wYWNrZXRfaW5kZXggJWQuIiwgcGFja2V0LT5wYWNrZXRfaWQsIHBhY2tldC0+Z2xvYmFsX3BhY2tldF9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgQk9PTCBRdWl0T25BbnlFcnJvcj1GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFF1aXRPbkFueUVycm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZSBjb250cm9sIGxvZ2ljCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVOdW1iZXIgPSByZXBsYXllci0+R2V0RnJhbWVOdW1iZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2RnJhbWVOdW1iZXIgIT0gZnJhbWVOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPT0gc2V0dGluZ3MubG9vcFN0YXJ0RnJhbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGhlIGxvY2F0aW9uIG9mIGxvb3Bpbmcgc3RhcnQgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5yZWNvcmRfYm9va21hcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxLmdldF9ib29rbWFyayhzdGFydGluZ1BhY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lTnVtYmVyID09IHNldHRpbmdzLmxvb3BFbmRGcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlX3J1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkJhZCBwYWNrZXQgdHlwZSBpZD0lZCwgaW5kZXg9JWQuIiwgcGFja2V0LT5wYWNrZXRfaWQsIHBhY2tldC0+Z2xvYmFsX3BhY2tldF9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0dGluZ3MubnVtTG9vcHMtLTsKKyAgICAgICAgLy9pZiBzY3JlZW5zaG90IGlzIGVuYWJsZWQgcnVuIGl0IGZvciBvbmUgY3ljbGUgb25seQorICAgICAgICAvL2FzIGFsbCBjb25zZWN1dGl2ZSBjeWNsZXMgbXVzdCBnZW5lcmF0ZSBzYW1lIHNjcmVlbgorICAgICAgICBpZiAocmVwbGF5U2V0dGluZ3Muc2NyZWVuc2hvdExpc3QgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9mcmVlKChjaGFyKilyZXBsYXlTZXR0aW5ncy5zY3JlZW5zaG90TGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgc2VxLnNldF9ib29rbWFyayhzdGFydGluZ1BhY2tldCk7CisgICAgICAgIHRyYWNlX3J1bm5pbmcgPSB0cnVlOworICAgICAgICBpZiAocmVwbGF5ZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVwbGF5ZXItPlJlc2V0RnJhbWVOdW1iZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorfSAvLyBuYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkKKwordXNpbmcgbmFtZXNwYWNlIHZrdHJhY2VfcmVwbGF5OworCit2b2lkIGxvZ2dpbmdDYWxsYmFjayhWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIHBNZXNzYWdlKQoreworICAgIGlmIChsZXZlbCA9PSBWS1RSQUNFX0xPR19OT05FKQorICAgICAgICByZXR1cm47CisKKyNpZiBkZWZpbmVkKEFORFJPSUQpCisgICAgc3dpdGNoKGxldmVsKQorICAgIHsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0RFQlVHOiBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLCAidmtyZXBsYXkiLCAiJXMiLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9MT0dfRVJST1I6IF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsICJ2a3JlcGxheSIsICIlcyIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX0xPR19XQVJOSU5HOiBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sICJ2a3JlcGxheSIsICIlcyIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX0xPR19WRVJCT1NFOiBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1ZFUkJPU0UsICJ2a3JlcGxheSIsICIlcyIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAidmtyZXBsYXkiLCAiJXMiLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIH0KKyNlbHNlCisgICAgc3dpdGNoKGxldmVsKQorICAgIHsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0RFQlVHOiBwcmludGYoInZrcmVwbGF5IGRlYnVnOiAlc1xuIiwgcE1lc3NhZ2UpOyBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0VSUk9SOiBwcmludGYoInZrcmVwbGF5IGVycm9yOiAlc1xuIiwgcE1lc3NhZ2UpOyBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX1dBUk5JTkc6IHByaW50ZigidmtyZXBsYXkgd2FybmluZzogJXNcbiIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgY2FzZSBWS1RSQUNFX0xPR19WRVJCT1NFOiBwcmludGYoInZrcmVwbGF5IGluZm86ICVzXG4iLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiJXNcbiIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgfQorICAgIGZmbHVzaChzdGRvdXQpOworCisjaWYgZGVmaW5lZChfREVCVUcpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICBPdXRwdXREZWJ1Z1N0cmluZyhwTWVzc2FnZSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8vIEFORFJPSUQKK30KKworaW50IHZrcmVwbGF5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB2a3RyYWNlX3dpbmRvd19oYW5kbGUgd2luZG93ID0gMCkKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogcEFsbFNldHRpbmdzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgbnVtQWxsU2V0dGluZ3MgPSAwOworCisgICAgLy8gRGVmYXVsdCB2ZXJib3NpdHkgbGV2ZWwKKyAgICB2a3RyYWNlX0xvZ1NldENhbGxiYWNrKGxvZ2dpbmdDYWxsYmFjayk7CisgICAgdmt0cmFjZV9Mb2dTZXRMZXZlbChWS1RSQUNFX0xPR19FUlJPUik7CisKKyAgICAvLyBhcHBseSBzZXR0aW5ncyBmcm9tIGNtZC1saW5lIGFyZ3MKKyAgICBpZiAodmt0cmFjZV9TZXR0aW5nR3JvdXBfaW5pdF9mcm9tX2NtZGxpbmUoJmdfcmVwbGF5U2V0dGluZ0dyb3VwLCBhcmdjLCBhcmd2LCAmcmVwbGF5U2V0dGluZ3MucFRyYWNlRmlsZVBhdGgpICE9IDApCisgICAgeworICAgICAgICAvLyBpbnZhbGlkIG9wdGlvbnMgc3BlY2lmaWVkCisgICAgICAgIGlmIChwQWxsU2V0dGluZ3MgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfRGVsZXRlX0xvYWRlZCgmcEFsbFNldHRpbmdzLCAmbnVtQWxsU2V0dGluZ3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vIG1lcmdlIHNldHRpbmdzIHNvIHRoYXQgbmV3IHNldHRpbmdzIHdpbGwgZ2V0IHdyaXR0ZW4gaW50byB0aGUgc2V0dGluZ3MgZmlsZQorICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX21lcmdlKCZnX3JlcGxheVNldHRpbmdHcm91cCwgJnBBbGxTZXR0aW5ncywgJm51bUFsbFNldHRpbmdzKTsKKworICAgIC8vIFNldCB2ZXJib3NpdHkgbGV2ZWwKKyAgICBpZiAocmVwbGF5U2V0dGluZ3MudmVyYm9zaXR5ID09IE5VTEwgfHwgIXN0cmNtcChyZXBsYXlTZXR0aW5ncy52ZXJib3NpdHksICJlcnJvcnMiKSkKKyAgICAgICAgcmVwbGF5U2V0dGluZ3MudmVyYm9zaXR5ID0gImVycm9ycyI7CisgICAgZWxzZSBpZiAoIXN0cmNtcChyZXBsYXlTZXR0aW5ncy52ZXJib3NpdHksICJxdWlldCIpKQorICAgICAgICB2a3RyYWNlX0xvZ1NldExldmVsKFZLVFJBQ0VfTE9HX05PTkUpOworICAgIGVsc2UgaWYgKCFzdHJjbXAocmVwbGF5U2V0dGluZ3MudmVyYm9zaXR5LCAid2FybmluZ3MiKSkKKyAgICAgICAgdmt0cmFjZV9Mb2dTZXRMZXZlbChWS1RSQUNFX0xPR19XQVJOSU5HKTsKKyAgICBlbHNlIGlmICghc3RyY21wKHJlcGxheVNldHRpbmdzLnZlcmJvc2l0eSwgImZ1bGwiKSkKKyAgICAgICAgdmt0cmFjZV9Mb2dTZXRMZXZlbChWS1RSQUNFX0xPR19WRVJCT1NFKTsKKyNpZiBfREVCVUcKKyAgICBlbHNlIGlmICghc3RyY21wKHJlcGxheVNldHRpbmdzLnZlcmJvc2l0eSwgImRlYnVnIikpCisgICAgICAgIHZrdHJhY2VfTG9nU2V0TGV2ZWwoVktUUkFDRV9MT0dfREVCVUcpOworI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfcHJpbnQoJmdfcmVwbGF5U2V0dGluZ0dyb3VwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8gU2V0IHVwIGVudmlyb25tZW50IGZvciBzY3JlZW5zaG90CisgICAgaWYgKHJlcGxheVNldHRpbmdzLnNjcmVlbnNob3RMaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBTZXQgZW52IHZhciB0aGF0IGNvbW11bmljYXRlcyBsaXN0IHRvIFNjcmVlblNob3QgbGF5ZXIKKyAgICAgICAgdmt0cmFjZV9zZXRfZ2xvYmFsX3ZhcigiX1ZLX1NDUkVFTlNIT1QiLCByZXBsYXlTZXR0aW5ncy5zY3JlZW5zaG90TGlzdCk7CisKKyAgICB9CisKKyAgICAvLyBvcGVuIHRyYWNlIGZpbGUgYW5kIHJlYWQgaW4gaGVhZGVyCisgICAgY29uc3QgY2hhciogcFRyYWNlRmlsZSA9IHJlcGxheVNldHRpbmdzLnBUcmFjZUZpbGVQYXRoOworICAgIHZrdHJhY2VfdHJhY2VfZmlsZV9oZWFkZXIgZmlsZUhlYWRlcjsKKyAgICBGSUxFICp0cmFjZWZwOworCisgICAgaWYgKHBUcmFjZUZpbGUgIT0gTlVMTCAmJiBzdHJsZW4ocFRyYWNlRmlsZSkgPiAwKQorICAgIHsKKyAgICAgICAgdHJhY2VmcCA9IGZvcGVuKHBUcmFjZUZpbGUsICJyYiIpOworICAgICAgICBpZiAodHJhY2VmcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJDYW5ub3Qgb3BlbiB0cmFjZSBmaWxlOiAnJXMnLiIsIHBUcmFjZUZpbGUpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiTm8gdHJhY2UgZmlsZSBzcGVjaWZpZWQuIik7CisgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX3ByaW50KCZnX3JlcGxheVNldHRpbmdHcm91cCk7CisgICAgICAgIGlmIChwQWxsU2V0dGluZ3MgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfRGVsZXRlX0xvYWRlZCgmcEFsbFNldHRpbmdzLCAmbnVtQWxsU2V0dGluZ3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIEZpbGVMaWtlKiB0cmFjZUZpbGUgPSB2a3RyYWNlX0ZpbGVMaWtlX2NyZWF0ZV9maWxlKHRyYWNlZnApOworICAgIGlmICh2a3RyYWNlX0ZpbGVMaWtlX1JlYWRSYXcodHJhY2VGaWxlLCAmZmlsZUhlYWRlciwgc2l6ZW9mKGZpbGVIZWFkZXIpKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlVuYWJsZSB0byByZWFkIGhlYWRlciBmcm9tIGZpbGUuIik7CisgICAgICAgIGlmIChwQWxsU2V0dGluZ3MgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfRGVsZXRlX0xvYWRlZCgmcEFsbFNldHRpbmdzLCAmbnVtQWxsU2V0dGluZ3MpOworICAgICAgICB9CisgICAgICAgIFZLVFJBQ0VfREVMRVRFKHRyYWNlRmlsZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vc2V0IGdsb2JhbCB2ZXJzaW9uIG51bQorICAgIHZrdHJhY2Vfc2V0X3RyYWNlX3ZlcnNpb24oZmlsZUhlYWRlci50cmFjZV9maWxlX3ZlcnNpb24pOworCisgICAgLy8gTWFrZSBzdXJlIHRyYWNlIGZpbGUgdmVyc2lvbiBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoZmlsZUhlYWRlci50cmFjZV9maWxlX3ZlcnNpb24gPCBWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl9NSU5JTVVNX0NPTVBBVElCTEUpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJUcmFjZSBmaWxlIHZlcnNpb24gJXUgaXMgb2xkZXIgdGhhbiBtaW5pbXVtIGNvbXBhdGlibGUgdmVyc2lvbiAoJXUpLlxuWW91J2xsIG5lZWQgdG8gbWFrZSBhIG5ldyB0cmFjZSBmaWxlLCBvciB1c2UgYW4gb2xkZXIgcmVwbGF5ZXIuIiwgZmlsZUhlYWRlci50cmFjZV9maWxlX3ZlcnNpb24sIFZLVFJBQ0VfVFJBQ0VfRklMRV9WRVJTSU9OX01JTklNVU1fQ09NUEFUSUJMRSk7CisgICAgfQorCisgICAgLy8gbG9hZCBhbnkgQVBJIHNwZWNpZmljIGRyaXZlciBsaWJyYXJpZXMgYW5kIGluaXQgcmVwbGF5ZXIgb2JqZWN0cworICAgIHVpbnQ4X3QgdGlkQXBpID0gVktUUkFDRV9USURfUkVTRVJWRUQ7CisgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfcmVwbGF5X2xpYnJhcnkqIHJlcGxheWVyW1ZLVFJBQ0VfTUFYX1RSQUNFUl9JRF9BUlJBWV9TSVpFXTsKKyAgICBSZXBsYXlGYWN0b3J5IG1ha2VSZXBsYXllcjsKKworICAgIC8vIENyZWF0ZSB3aW5kb3cuIEluaXRpYWwgc2l6ZSBpcyAxMDB4MTAwLiBJdCB3aWxsIGxhdGVyIGdldCByZXNpemVkIHRvIHRoZSBzaXplCisgICAgLy8gdXNlZCBieSB0aGUgdHJhY2VkIGFwcC4gVGhlIHJlc2l6ZSB3aWxsIGhhcHBlbiAgZHVyaW5nIHBsYXliYWNrIG9mIHN3YXBjaGFpbiBmdW5jdGlvbnMuCisjaWYgZGVmaW5lZChBTkRST0lEKQorICAgIHZrdHJhY2VfcmVwbGF5OjpSZXBsYXlEaXNwbGF5IGRpc3Aod2luZG93LCAxMDAsIDEwMCk7CisjZWxzZQorICAgIHZrdHJhY2VfcmVwbGF5OjpSZXBsYXlEaXNwbGF5IGRpc3AoMTAwLCAxMDAsIDAsIGZhbHNlKTsKKyNlbmRpZgorICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2lmIF9ERUJVRworICAgIHN0YXRpYyBCT09MIGRlYnVnU3RhcnR1cCA9IEZBTFNFOy8vVFJVRQorICAgIHdoaWxlIChkZWJ1Z1N0YXJ0dXApOworI2VuZGlmCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWS1RSQUNFX01BWF9UUkFDRVJfSURfQVJSQVlfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgcmVwbGF5ZXJbaV0gPSBOVUxMOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUhlYWRlci50cmFjZXJfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdHJhY2VySWQgPSBmaWxlSGVhZGVyLnRyYWNlcl9pZF9hcnJheVtpXS5pZDsKKyAgICAgICAgdGlkQXBpID0gdHJhY2VySWQ7CisKKyAgICAgICAgY29uc3QgVktUUkFDRV9UUkFDRVJfUkVQTEFZRVJfSU5GTyogcFJlcGxheWVySW5mbyA9ICYoZ3NfdHJhY2VyUmVwbGF5ZXJJbmZvW3RyYWNlcklkXSk7CisKKyAgICAgICAgaWYgKHBSZXBsYXllckluZm8tPnRyYWNlcklkICE9IHRyYWNlcklkKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJSZXBsYXllciBpbmZvIGZvciBUcmFjZXJJZCAoJWQpIGZhaWxlZCBjb25zaXN0ZW5jeSBjaGVjay4iLCB0cmFjZXJJZCk7CisgICAgICAgICAgICBhc3NlcnQoISJUcmFjZXJJZCBpbiBWS1RSQUNFX1RSQUNFUl9SRVBMQVlFUl9JTkZPIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1ZXN0ZWQgdHJhY2VySWQuIFRoZSBhcnJheSBuZWVkcyB0byBiZSBjb3JyZWN0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFJlcGxheWVySW5mby0+bmVlZHNSZXBsYXllciA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBIYXZlIG91ciBmYWN0b3J5IGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlcGxheWVyCisgICAgICAgICAgICByZXBsYXllclt0cmFjZXJJZF0gPSBtYWtlUmVwbGF5ZXIuQ3JlYXRlKHRyYWNlcklkKTsKKworICAgICAgICAgICAgaWYgKHJlcGxheWVyW3RyYWNlcklkXSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHJlcGxheWVyIGZhaWxlZCB0byBiZSBjcmVhdGVkCisgICAgICAgICAgICAgICAgaWYgKHBBbGxTZXR0aW5ncyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfRGVsZXRlX0xvYWRlZCgmcEFsbFNldHRpbmdzLCAmbnVtQWxsU2V0dGluZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWVyZ2UgdGhlIHJlcGxheWVyJ3Mgc2V0dGluZ3MgaW50byB0aGUgbGlzdCBvZiBhbGwgc2V0dGluZ3Mgc28gdGhhdCB3ZSBjYW4gb3V0cHV0IGEgY29tcHJlaGVuc2l2ZSBzZXR0aW5ncyBmaWxlIGxhdGVyIG9uLgorICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfbWVyZ2UocmVwbGF5ZXJbdHJhY2VySWRdLT5HZXRTZXR0aW5ncygpLCAmcEFsbFNldHRpbmdzLCAmbnVtQWxsU2V0dGluZ3MpOworCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHJlcGxheWVyIHdpdGggdGhlIGxvYWRlZCBzZXR0aW5ncworICAgICAgICAgICAgcmVwbGF5ZXJbdHJhY2VySWRdLT5VcGRhdGVGcm9tU2V0dGluZ3MocEFsbFNldHRpbmdzLCBudW1BbGxTZXR0aW5ncyk7CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHJlcGxheWVyCisgICAgICAgICAgICBlcnIgPSByZXBsYXllclt0cmFjZXJJZF0tPkluaXRpYWxpemUoJmRpc3AsICZyZXBsYXlTZXR0aW5ncyk7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ291bGRuJ3QgSW5pdGlhbGl6ZSByZXBsYXllciBmb3IgVHJhY2VySWQgJWQuIiwgdHJhY2VySWQpOworICAgICAgICAgICAgICAgIGlmIChwQWxsU2V0dGluZ3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX0RlbGV0ZV9Mb2FkZWQoJnBBbGxTZXR0aW5ncywgJm51bUFsbFNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aWRBcGkgPT0gVktUUkFDRV9USURfUkVTRVJWRUQpIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiTm8gQVBJIHNwZWNpZmllZCBpbiB0cmFjZWZpbGUgZm9yIHJlcGxheWluZy4iKTsKKyAgICAgICAgaWYgKHBBbGxTZXR0aW5ncyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9EZWxldGVfTG9hZGVkKCZwQWxsU2V0dGluZ3MsICZudW1BbGxTZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAKKyAgICAvLyBtYWluIGxvb3AKKyAgICBTZXF1ZW5jZXIgc2VxdWVuY2VyKHRyYWNlRmlsZSk7CisgICAgZXJyID0gdmt0cmFjZV9yZXBsYXk6Om1haW5fbG9vcChzZXF1ZW5jZXIsIHJlcGxheWVyLCByZXBsYXlTZXR0aW5ncyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFZLVFJBQ0VfTUFYX1RSQUNFUl9JRF9BUlJBWV9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAocmVwbGF5ZXJbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVwbGF5ZXJbaV0tPkRlaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgbWFrZVJlcGxheWVyLkRlc3Ryb3koJnJlcGxheWVyW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwQWxsU2V0dGluZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX0RlbGV0ZV9Mb2FkZWQoJnBBbGxTZXR0aW5ncywgJm51bUFsbFNldHRpbmdzKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworI2lmIGRlZmluZWQoQU5EUk9JRCkKK3N0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7CitzdGF0aWMgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKworLy8gQ29udmVydCBJbnRlbnRzIHRvIGFyZ3YKKy8vIFBvcnRlZCBmcm9tIEhvbG9ncmFtIHNhbXBsZSwgb25seSBkaWZmZXJlbmNlIGlzIGZsZXhpYmxlIGtleQorc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldF9hcmdzKGFuZHJvaWRfYXBwICZhcHAsIGNvbnN0IGNoYXIqIGludGVudF9leHRyYV9kYXRhX2tleSkKK3sKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnczsKKyAgICBKYXZhVk0gJnZtID0gKmFwcC5hY3Rpdml0eS0+dm07CisgICAgSk5JRW52ICpwX2VudjsKKyAgICBpZiAodm0uQXR0YWNoQ3VycmVudFRocmVhZCgmcF9lbnYsIG51bGxwdHIpICE9IEpOSV9PSykKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisKKyAgICBKTklFbnYgJmVudiA9ICpwX2VudjsKKyAgICBqb2JqZWN0IGFjdGl2aXR5ID0gYXBwLmFjdGl2aXR5LT5jbGF6ejsKKyAgICBqbWV0aG9kSUQgZ2V0X2ludGVudF9tZXRob2QgPSBlbnYuR2V0TWV0aG9kSUQoZW52LkdldE9iamVjdENsYXNzKGFjdGl2aXR5KSwKKyAgICAgICAgICAgICJnZXRJbnRlbnQiLCAiKClMYW5kcm9pZC9jb250ZW50L0ludGVudDsiKTsKKyAgICBqb2JqZWN0IGludGVudCA9IGVudi5DYWxsT2JqZWN0TWV0aG9kKGFjdGl2aXR5LCBnZXRfaW50ZW50X21ldGhvZCk7CisgICAgam1ldGhvZElEIGdldF9zdHJpbmdfZXh0cmFfbWV0aG9kID0gZW52LkdldE1ldGhvZElEKGVudi5HZXRPYmplY3RDbGFzcyhpbnRlbnQpLAorICAgICAgICAgICAgImdldFN0cmluZ0V4dHJhIiwgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAganZhbHVlIGdldF9zdHJpbmdfZXh0cmFfYXJnczsKKyAgICBnZXRfc3RyaW5nX2V4dHJhX2FyZ3MubCA9IGVudi5OZXdTdHJpbmdVVEYoaW50ZW50X2V4dHJhX2RhdGFfa2V5KTsKKyAgICBqc3RyaW5nIGV4dHJhX3N0ciA9IHN0YXRpY19jYXN0PGpzdHJpbmc+KGVudi5DYWxsT2JqZWN0TWV0aG9kQShpbnRlbnQsCisgICAgICAgICAgICBnZXRfc3RyaW5nX2V4dHJhX21ldGhvZCwgJmdldF9zdHJpbmdfZXh0cmFfYXJncykpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc19zdHI7CisgICAgaWYgKGV4dHJhX3N0cikgeworICAgICAgICBjb25zdCBjaGFyICpleHRyYV91dGYgPSBlbnYuR2V0U3RyaW5nVVRGQ2hhcnMoZXh0cmFfc3RyLCBudWxscHRyKTsKKyAgICAgICAgYXJnc19zdHIgPSBleHRyYV91dGY7CisgICAgICAgIGVudi5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZXh0cmFfc3RyLCBleHRyYV91dGYpOworICAgICAgICBlbnYuRGVsZXRlTG9jYWxSZWYoZXh0cmFfc3RyKTsKKyAgICB9CisKKyAgICBlbnYuRGVsZXRlTG9jYWxSZWYoZ2V0X3N0cmluZ19leHRyYV9hcmdzLmwpOworICAgIGVudi5EZWxldGVMb2NhbFJlZihpbnRlbnQpOworICAgIHZtLkRldGFjaEN1cnJlbnRUaHJlYWQoKTsKKworICAgIC8vIHNwbGl0IGFyZ3Nfc3RyCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3MoYXJnc19zdHIpOworICAgIHN0ZDo6c3RyaW5nIGFyZzsKKyAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKHNzLCBhcmcsICcgJykpIHsKKyAgICAgICAgaWYgKCFhcmcuZW1wdHkoKSkKKyAgICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKGFyZyk7CisgICAgfQorCisgICAgcmV0dXJuIGFyZ3M7Cit9CisKK3N0YXRpYyBpbnQzMl90IHByb2Nlc3NJbnB1dChzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFwcCwgQUlucHV0RXZlbnQqIGV2ZW50KSB7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NDb21tYW5kKHN0cnVjdCBhbmRyb2lkX2FwcCogYXBwLCBpbnQzMl90IGNtZCkgeworICAgIHN3aXRjaChjbWQpIHsKKyAgICAgICAgY2FzZSBBUFBfQ01EX0lOSVRfV0lORE9XOiB7CisgICAgICAgICAgICBpZiAoYXBwLT53aW5kb3cpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFQUF9DTURfR0FJTkVEX0ZPQ1VTOiB7CisgICAgICAgICAgICBhY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBUFBfQ01EX0xPU1RfRk9DVVM6IHsKKyAgICAgICAgICAgIGFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFN0YXJ0IHdpdGggY2FyYm9uIGNvcHkgb2YgbWFpbigpIGFuZCBjb252ZXJ0IGl0IHRvIHN1cHBvcnQgQW5kcm9pZCwgdGhlbiBkaWZmIHRoZW0gYW5kIG1vdmUgY29tbW9uIGNvZGUgdG8gaGVscGVycy4KK3ZvaWQgYW5kcm9pZF9tYWluKHN0cnVjdCBhbmRyb2lkX2FwcCAqYXBwKQoreworICAgIGFwcF9kdW1teSgpOworCisgICAgY29uc3QgY2hhciogYXBwVGFnID0gInZrcmVwbGF5IjsKKworICAgIGludCB2dWxrYW5TdXBwb3J0ID0gSW5pdFZ1bGthbigpOworICAgIGlmICh2dWxrYW5TdXBwb3J0ID09IDApIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgYXBwVGFnLCAiTm8gVnVsa2FuIHN1cHBvcnQgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFwcC0+b25BcHBDbWQgPSBwcm9jZXNzQ29tbWFuZDsKKyAgICBhcHAtPm9uSW5wdXRFdmVudCA9IHByb2Nlc3NJbnB1dDsKKworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgaW50IGV2ZW50czsKKyAgICAgICAgc3RydWN0IGFuZHJvaWRfcG9sbF9zb3VyY2UqIHNvdXJjZTsKKyAgICAgICAgd2hpbGUgKEFMb29wZXJfcG9sbEFsbChhY3RpdmUgPyAwIDogLTEsIE5VTEwsICZldmVudHMsICh2b2lkKiopJnNvdXJjZSkgPj0gMCkgeworICAgICAgICAgICAgaWYgKHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHNvdXJjZS0+cHJvY2VzcyhhcHAsIHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhcHAtPmRlc3Ryb3lSZXF1ZXN0ZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIHRvIGNsZWFuIHVwPworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbml0aWFsaXplZCAmJiBhY3RpdmUpIHsKKyAgICAgICAgICAgIC8vIFBhcnNlIEludGVudHMgaW50byBhcmdjLCBhcmd2CisgICAgICAgICAgICAvLyBVc2UgdGhlIGZvbGxvd2luZyBrZXkgdG8gc2VuZCBhcmd1bWVudHMgdG8gZ3Rlc3QsIGkuZS4KKyAgICAgICAgICAgIC8vIC0tZXMgYXJncyAiLXZcIGRlYnVnXCAtdFwgL3NkY2FyZC9jdWJlMC52a3RyYWNlIgorICAgICAgICAgICAgY29uc3QgY2hhciBrZXlbXSA9ICJhcmdzIjsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzID0gZ2V0X2FyZ3MoKmFwcCwga2V5KTsKKworICAgICAgICAgICAgaW50IGFyZ2MgPSBhcmdzLnNpemUoKSArIDE7CisKKyAgICAgICAgICAgIGNoYXIqKiBhcmd2ID0gKGNoYXIqKikgbWFsbG9jKGFyZ2MgKiBzaXplb2YoY2hhciopKTsKKyAgICAgICAgICAgIGFyZ3ZbMF0gPSAoY2hhciopInZrcmVwbGF5IjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBhcmd2W2kgKyAxXSA9IChjaGFyKikgYXJnc1tpXS5jX3N0cigpOworCisKKyAgICAgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgYXBwVGFnLCAiYXJnYyA9ICVpIiwgYXJnYyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICAgICAgICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIGFwcFRhZywgImFyZ3ZbJWldID0gJXMiLCBpLCBhcmd2W2ldKTsKKworICAgICAgICAgICAgLy8gc2xlZXAgdG8gYWxsb3cgYXR0YWNoaW5nIGRlYnVnZ2VyCisgICAgICAgICAgICAvL3NsZWVwKDEwKTsKKworICAgICAgICAgICAgLy8gQ2FsbCBpbnRvIGNvbW1vbiBjb2RlCisgICAgICAgICAgICBpbnQgZXJyID0gdmtyZXBsYXlfbWFpbihhcmdjLCBhcmd2LCBhcHAtPndpbmRvdyk7CisgICAgICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLCBhcHBUYWcsICJ2a3JlcGxheV9tYWluIHJldHVybmVkICVpIiwgZXJyKTsKKworICAgICAgICAgICAgQU5hdGl2ZUFjdGl2aXR5X2ZpbmlzaChhcHAtPmFjdGl2aXR5KTsKKyAgICAgICAgICAgIGZyZWUoYXJndik7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworI2Vsc2UgLy8gQU5EUk9JRAorCitleHRlcm4gIkMiCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgcmV0dXJuIHZrcmVwbGF5X21haW4oYXJnYywgYXJndik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfbWFpbi5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2UxYWYKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3JlcGxheS92a3JlcGxheV9tYWluLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBUb255IEJhcmJvdXIgPHRvbnlAbHVuYXJnLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVktSRVBMQVlfX01BSU5fSAorI2RlZmluZSBWS1JFUExBWV9fTUFJTl9ICisKK3R5cGVkZWYgc3RydWN0IHZrcmVwbGF5ZXJfc2V0dGluZ3MKK3sKKyAgICBjaGFyKiBwVHJhY2VGaWxlUGF0aDsKKyAgICB1bnNpZ25lZCBpbnQgbnVtTG9vcHM7CisgICAgaW50IGxvb3BTdGFydEZyYW1lOworICAgIGludCBsb29wRW5kRnJhbWU7CisgICAgY29uc3QgY2hhciogc2NyZWVuc2hvdExpc3Q7CisgICAgY29uc3QgY2hhciogdmVyYm9zaXR5OworfSB2a3JlcGxheWVyX3NldHRpbmdzOworCisjZW5kaWYgLy8gVktSRVBMQVlfX01BSU5fSApkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfc2VxLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X3NlcS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2ZjAxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X3NlcS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInZrcmVwbGF5X3NlcS5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF91dGlscy5oIgorfQorCituYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkgeworCit2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIgKiBTZXF1ZW5jZXI6OmdldF9uZXh0X3BhY2tldCgpCit7CisgICAgdmt0cmFjZV9mcmVlKG1fbGFzdFBhY2tldCk7CisgICAgaWYgKCFtX3BGaWxlKQorICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIG1fbGFzdFBhY2tldCA9IHZrdHJhY2VfcmVhZF90cmFjZV9wYWNrZXQobV9wRmlsZSk7CisgICAgcmV0dXJuKG1fbGFzdFBhY2tldCk7Cit9CisKK3ZvaWQgU2VxdWVuY2VyOjpnZXRfYm9va21hcmsoc2VxQm9va21hcmsgJmJvb2ttYXJrKSB7CisgICAgYm9va21hcmsuZmlsZV9vZmZzZXQgPSBtX2Jvb2ttYXJrLmZpbGVfb2Zmc2V0OworfQorCisKK3ZvaWQgU2VxdWVuY2VyOjpzZXRfYm9va21hcmsoY29uc3Qgc2VxQm9va21hcmsgJmJvb2ttYXJrKSB7CisgICAgZnNlZWsobV9wRmlsZS0+bUZpbGUsIG1fYm9va21hcmsuZmlsZV9vZmZzZXQsIFNFRUtfU0VUKTsKK30KKwordm9pZCBTZXF1ZW5jZXI6OnJlY29yZF9ib29rbWFyaygpCit7CisgICAgbV9ib29rbWFyay5maWxlX29mZnNldCA9IGZ0ZWxsKG1fcEZpbGUtPm1GaWxlKTsKK30KKworfSAvKiBuYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkgKi8KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X3NlcS5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV9yZXBsYXkvdmtyZXBsYXlfc2VxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMjBkMQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X3NlcS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2a3RyYWNlX2ZpbGVsaWtlLmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfaWRlbnRpZmllcnMuaCIKK30KKworLyogQ2xhc3MgdG8gaGFuZGxlIGZldGNoaW5nIGFuZCBzZXF1ZW5jaW5nIHBhY2tldHMgZnJvbSBhIHRyYWNlZmlsZS4KKyAqIENvbnRhaW5zIG5vIGtub3dsZWRnZSBvZiB0eXBlIG9mIHRyYWNlciBuZWVkZWQgdG8gcHJvY2VzcyBwYWNrZXQuCisgKiBSZXF1aXJlcyBsb3cgbGV2ZWwgZmlsZS9zdHJlYW0gcmVhZGluZy9zZWVraW5nIHN1cHBvcnQuICovCituYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkgeworCisKK3N0cnVjdCBzZXFCb29rbWFyaworeworICAgIHVuc2lnbmVkIGludCBmaWxlX29mZnNldDsKK307CisKKworLy8gcmVwbGF5IFNlcXVlbmNlciBpbnRlcmZhY2UKKyBjbGFzcyBBYnN0cmFjdFNlcXVlbmNlcgorIHsKKyBwdWJsaWM6CisgICAgdmlydHVhbCB+QWJzdHJhY3RTZXF1ZW5jZXIoKSB7fQorICAgIHZpcnR1YWwgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyICpnZXRfbmV4dF9wYWNrZXQoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGdldF9ib29rbWFyayhzZXFCb29rbWFyayAmYm9va21hcmspID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X2Jvb2ttYXJrKGNvbnN0IHNlcUJvb2ttYXJrICZib29rbWFyaykgPSAwOworIH07CisKK2NsYXNzIFNlcXVlbmNlcjogcHVibGljIEFic3RyYWN0U2VxdWVuY2VyCit7CisKK3B1YmxpYzoKKyAgICBTZXF1ZW5jZXIoRmlsZUxpa2UqIHBGaWxlKSA6IG1fbGFzdFBhY2tldChOVUxMKSwgbV9wRmlsZShwRmlsZSkge30KKyAgICB+U2VxdWVuY2VyKCkgeyBkZWxldGUgbV9sYXN0UGFja2V0O30KKyAgICAKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIgKmdldF9uZXh0X3BhY2tldCgpOworICAgIHZvaWQgZ2V0X2Jvb2ttYXJrKHNlcUJvb2ttYXJrICZib29rbWFyayk7CisgICAgdm9pZCBzZXRfYm9va21hcmsoY29uc3Qgc2VxQm9va21hcmsgJmJvb2ttYXJrKTsKKyAgICB2b2lkIHJlY29yZF9ib29rbWFyaygpOworICAgIAorcHJpdmF0ZToKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIgKm1fbGFzdFBhY2tldDsKKyAgICBzZXFCb29rbWFyayBtX2Jvb2ttYXJrOworICAgIEZpbGVMaWtlICptX3BGaWxlOworICAgIAorfTsKKworfSAvKiBuYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkgKi8KKworCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3JlcGxheS92a3JlcGxheV93aW5kb3cuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X3dpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzIyOTYKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3JlcGxheS92a3JlcGxheV93aW5kb3cuaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3ByYWdtYSBvbmNlCisKK2V4dGVybiAiQyJ7CisjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIgorfQorCisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkgfHwgZGVmaW5lZChYQ0JfTlZJRElBKQorI2lmIGRlZmluZWQoQU5EUk9JRCkKKyNpbmNsdWRlIDxhbmRyb2lkX25hdGl2ZV9hcHBfZ2x1ZS5oPgordHlwZWRlZiBBTmF0aXZlV2luZG93KiB2a3RyYWNlX3dpbmRvd19oYW5kbGU7CisjZWxzZQorI2luY2x1ZGUgPHhjYi94Y2IuaD4KK3R5cGVkZWYgeGNiX3dpbmRvd190IHZrdHJhY2Vfd2luZG93X2hhbmRsZTsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChXSU4zMikKK3R5cGVkZWYgSFdORCB2a3RyYWNlX3dpbmRvd19oYW5kbGU7CisjZW5kaWYKKworLyogY2xhc3NlcyB0byBhYnN0cmFjdCB0aGUgZGlzcGxheSBhbmQgaW5pdGlhbGl6YXRpb24gb2YgcmVuZGVyaW5nIEFQSSBmb3IgcHJlc2VudGluZworICogZnJhbWVidWZmZXJzIGZvciBkaXNwbGF5IGludG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbiBvciBlbHNlIGZ1bGxzY3JlZW4uCisgKiBVc2VzIEJyaWRnZSBkZXNpZ24gcGF0dGVybi4KKyAqLworbmFtZXNwYWNlIHZrdHJhY2VfcmVwbGF5IHsKKworY2xhc3MgUmVwbGF5RGlzcGxheUltcCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UmVwbGF5RGlzcGxheUltcCgpIHt9CisgICAgdmlydHVhbCBpbnQgaW5pdChjb25zdCB1bnNpZ25lZCBpbnQgZ3B1X2lkeCkgPSAwOworICAgIHZpcnR1YWwgaW50IHNldF93aW5kb3codmt0cmFjZV93aW5kb3dfaGFuZGxlIGhXaW5kb3csIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCkgPSAwOworICAgIHZpcnR1YWwgaW50IGNyZWF0ZV93aW5kb3coY29uc3QgdW5zaWduZWQgaW50IHdpZHRoLCBjb25zdCB1bnNpZ25lZCBpbnQgaGVpZ2h0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NfZXZlbnQoKSA9IDA7Cit9OworCitjbGFzcyBSZXBsYXlEaXNwbGF5IHsKK3B1YmxpYzoKKyAgICBSZXBsYXlEaXNwbGF5KCkKKyAgICAgICAgOiBtX2ltcChOVUxMKSwKKyAgICAgICAgbV93aWR0aCgwKSwKKyAgICAgICAgbV9oZWlnaHQoMCksCisgICAgICAgIG1fZ3B1KDApLAorICAgICAgICBtX2Z1bGxzY3JlZW4oZmFsc2UpLAorICAgICAgICBtX2hXaW5kb3coMCkKKyAgICB7CisKKyAgICB9CisKKyAgICBSZXBsYXlEaXNwbGF5KGNvbnN0IHVuc2lnbmVkIGludCB3aWR0aCwgY29uc3QgdW5zaWduZWQgaW50IGhlaWdodCwgY29uc3QgdW5zaWduZWQgaW50IGdwdSwgY29uc3QgYm9vbCBmdWxsc2NyZWVuKSA6CisgICAgICAgIG1faW1wKE5VTEwpLAorICAgICAgICBtX3dpZHRoKHdpZHRoKSwKKyAgICAgICAgbV9oZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgbV9ncHUoZ3B1KSwKKyAgICAgICAgbV9mdWxsc2NyZWVuKGZ1bGxzY3JlZW4pLAorICAgICAgICBtX2hXaW5kb3coMCkKKyAgICB7CisgICAgfQorCisgICAgUmVwbGF5RGlzcGxheSh2a3RyYWNlX3dpbmRvd19oYW5kbGUgaFdpbmRvdywgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KSA6CisgICAgICAgIG1faW1wKE5VTEwpLAorICAgICAgICBtX3dpZHRoKHdpZHRoKSwKKyAgICAgICAgbV9oZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgbV9ncHUoMCksCisgICAgICAgIG1fZnVsbHNjcmVlbihmYWxzZSksCisgICAgICAgIG1faFdpbmRvdyhoV2luZG93KQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5SZXBsYXlEaXNwbGF5KCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBzZXRfaW1wbGVtZW50YXRpb24oUmVwbGF5RGlzcGxheUltcCAmIGRpc3ApCisgICAgeworICAgICAgICBtX2ltcCA9ICYgZGlzcDsKKyAgICB9CisgICAgdm9pZCBzZXRfaW1wbGVtZW50YXRpb24oUmVwbGF5RGlzcGxheUltcCAqIGRpc3ApCisgICAgeworICAgICAgICBtX2ltcCA9IGRpc3A7CisgICAgfQorICAgIGludCBpbml0KCkKKyAgICB7CisgICAgICAgIGlmIChtX2ltcCkKKyAgICAgICAgICAgIHJldHVybiBtX2ltcC0+aW5pdChtX2dwdSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdm9pZCBwcm9jZXNzX2V2ZW50KCkKKyAgICB7CisgICAgICAgIGlmKG1faW1wKQorICAgICAgICAgICAgbV9pbXAtPnByb2Nlc3NfZXZlbnQoKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IGdldF9ncHUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZ3B1OworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgZ2V0X3dpZHRoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3dpZHRoOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgZ2V0X2hlaWdodCgpCisgICAgeworICAgICAgICByZXR1cm4gbV9oZWlnaHQ7CisgICAgfQorICAgIGJvb2wgZ2V0X2Z1bGxzY3JlZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZnVsbHNjcmVlbjsKKyAgICB9CisgICAgdmt0cmFjZV93aW5kb3dfaGFuZGxlIGdldF93aW5kb3dfaGFuZGxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2hXaW5kb3c7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlcGxheURpc3BsYXlJbXAgKm1faW1wOworICAgIHVuc2lnbmVkIGludCBtX3dpZHRoOworICAgIHVuc2lnbmVkIGludCBtX2hlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgbV9ncHU7CisgICAgYm9vbCBtX2Z1bGxzY3JlZW47CisgICAgdmt0cmFjZV93aW5kb3dfaGFuZGxlIG1faFdpbmRvdzsKK307CisKK30gICAvLyBuYW1lc3BhY2Ugdmt0cmFjZV9yZXBsYXkKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfdHJhY2UvQ01ha2VMaXN0cy50eHQgYi92a3RyYWNlL3NyYy92a3RyYWNlX3RyYWNlL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYmE1NzYKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3RyYWNlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjcgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpCitwcm9qZWN0KHZrdHJhY2UpCisKK2luY2x1ZGUoIiR7U1JDX0RJUn0vYnVpbGRfb3B0aW9ucy5jbWFrZSIpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCitzZXQoU1JDX0xJU1QKKyAgICAke1NSQ19MSVNUfQorICAgIHZrdHJhY2UuY3BwCisgICAgdmt0cmFjZV9wcm9jZXNzLmgKKyAgICB2a3RyYWNlX3Byb2Nlc3MuY3BwCispCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtTUkNfRElSfQorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9jb21tb24KKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2VfdHJhY2UKKykKKworYWRkX2V4ZWN1dGFibGUoJHtQUk9KRUNUX05BTUV9ICR7U1JDX0xJU1R9KQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoJHtQUk9KRUNUX05BTUV9CisgICAgdmt0cmFjZV9jb21tb24KKykKKworYnVpbGRfb3B0aW9uc19maW5hbGl6ZSgpCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3RyYWNlL3ZrdHJhY2UuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV90cmFjZS92a3RyYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYwNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV90cmFjZS92a3RyYWNlLmNwcApAQCAtMCwwICsxLDM1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInZrdHJhY2UuaCIKKworI2luY2x1ZGUgInZrdHJhY2VfcHJvY2Vzcy5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIgorI2luY2x1ZGUgInZrdHJhY2VfZmlsZWxpa2UuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX2ludGVyY29ubmVjdC5oIgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCIKK30KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK3ZrdHJhY2Vfc2V0dGluZ3MgZ19zZXR0aW5nczsKK3ZrdHJhY2Vfc2V0dGluZ3MgZ19kZWZhdWx0X3NldHRpbmdzOworCit2a3RyYWNlX1NldHRpbmdJbmZvIGdfc2V0dGluZ3NfaW5mb1tdID0KK3sKKyAgICAvLyBjb21tb24gY29tbWFuZCBvcHRpb25zCisgICAgeyAicCIsICJQcm9ncmFtIiwgVktUUkFDRV9TRVRUSU5HX1NUUklORywgeyAmZ19zZXR0aW5ncy5wcm9ncmFtIH0sIHsgJmdfZGVmYXVsdF9zZXR0aW5ncy5wcm9ncmFtIH0sIFRSVUUsICJUaGUgcHJvZ3JhbSB0byB0cmFjZS4ifSwKKyAgICB7ICJhIiwgIkFyZ3VtZW50cyIsIFZLVFJBQ0VfU0VUVElOR19TVFJJTkcsIHsgJmdfc2V0dGluZ3MuYXJndW1lbnRzIH0sIHsgJmdfZGVmYXVsdF9zZXR0aW5ncy5hcmd1bWVudHMgfSwgVFJVRSwgIkNtZC1saW5lIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRyYWNlIHByb2dyYW0uIn0sCisgICAgeyAidyIsICJXb3JraW5nRGlyIiwgVktUUkFDRV9TRVRUSU5HX1NUUklORywgeyAmZ19zZXR0aW5ncy53b3JraW5nX2RpciB9LCB7ICZnX2RlZmF1bHRfc2V0dGluZ3Mud29ya2luZ19kaXIgfSwgVFJVRSwgIlRoZSBwcm9ncmFtJ3Mgd29ya2luZyBkaXJlY3RvcnkuIn0sCisgICAgeyAibyIsICJPdXRwdXRUcmFjZSIsIFZLVFJBQ0VfU0VUVElOR19TVFJJTkcsIHsgJmdfc2V0dGluZ3Mub3V0cHV0X3RyYWNlIH0sIHsgJmdfZGVmYXVsdF9zZXR0aW5ncy5vdXRwdXRfdHJhY2UgfSwgVFJVRSwgIlBhdGggdG8gdGhlIGdlbmVyYXRlZCBvdXRwdXQgdHJhY2UgZmlsZS4ifSwKKyAgICB7ICJzIiwgIlNjcmVlblNob3QiLCBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HLCB7ICZnX3NldHRpbmdzLnNjcmVlbnNob3RMaXN0IH0sIHsgJmdfZGVmYXVsdF9zZXR0aW5ncy5zY3JlZW5zaG90TGlzdCB9LCBUUlVFLCAiQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZnJhbWVzIHRvIHRha2UgYSBzbmFwc2hvdCBvZi4ifSwKKyAgICB7ICJwdG0iLCAiUHJpbnRUcmFjZU1lc3NhZ2VzIiwgVktUUkFDRV9TRVRUSU5HX0JPT0wsIHsgJmdfc2V0dGluZ3MucHJpbnRfdHJhY2VfbWVzc2FnZXMgfSwgeyAmZ19kZWZhdWx0X3NldHRpbmdzLnByaW50X3RyYWNlX21lc3NhZ2VzIH0sIFRSVUUsICJQcmludCB0cmFjZSBtZXNzYWdlcyB0byB2a3RyYWNlIGNvbnNvbGUuIn0sCisjaWYgX0RFQlVHCisgICAgeyAidiIsICJWZXJib3NpdHkiLCBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HLCB7ICZnX3NldHRpbmdzLnZlcmJvc2l0eSB9LCB7ICZnX2RlZmF1bHRfc2V0dGluZ3MudmVyYm9zaXR5IH0sIFRSVUUsICJWZXJib3NpdHkgbW9kZS4gTW9kZXMgYXJlIFwicXVpZXRcIiwgXCJlcnJvcnNcIiwgXCJ3YXJuaW5nc1wiLCBcImZ1bGxcIiwgXCJkZWJ1Z1wiLiJ9LAorI2Vsc2UKKyAgICB7ICJ2IiwgIlZlcmJvc2l0eSIsIFZLVFJBQ0VfU0VUVElOR19TVFJJTkcsIHsgJmdfc2V0dGluZ3MudmVyYm9zaXR5IH0sIHsgJmdfZGVmYXVsdF9zZXR0aW5ncy52ZXJib3NpdHkgfSwgVFJVRSwgIlZlcmJvc2l0eSBtb2RlLiBNb2RlcyBhcmUgXCJxdWlldFwiLCBcImVycm9yc1wiLCBcIndhcm5pbmdzXCIsIFwiZnVsbFwiLiJ9LAorI2VuZGlmCisKKyAgICAvL3sgInoiLCAicGF1emUiLCBWS1RSQUNFX1NFVFRJTkdfQk9PTCwgJmdfc2V0dGluZ3MucGF1c2UsICZnX2RlZmF1bHRfc2V0dGluZ3MucGF1c2UsIFRSVUUsICJXYWl0IGZvciBhIGtleSBhdCBzdGFydHVwIChzbyBhIGRlYnVnZ2VyIGNhbiBiZSBhdHRhY2hlZCkiIH0sCit9OworCit2a3RyYWNlX1NldHRpbmdHcm91cCBnX3NldHRpbmdHcm91cCA9Cit7CisgICAgInZrdHJhY2UiLAorICAgIHNpemVvZihnX3NldHRpbmdzX2luZm8pIC8gc2l6ZW9mKGdfc2V0dGluZ3NfaW5mb1swXSksCisgICAgJmdfc2V0dGluZ3NfaW5mb1swXQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgZGVmaW5lZChXSU4zMikKK3ZvaWQgTWVzc2FnZUxvb3AoKQoreworICAgIE1TRyBtc2cgPSB7IDAgfTsKKyAgICBib29sIHF1aXQgPSBmYWxzZTsKKyAgICB3aGlsZSAoIXF1aXQpCisgICAgeworICAgICAgICBpZiAoR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSA9PSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgcXVpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBxdWl0ID0gKG1zZy5tZXNzYWdlID09IFZLVFJBQ0VfV01fQ09NUExFVEUpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK2ludCBQcmVwYXJlVHJhY2Vycyh2a3RyYWNlX3Byb2Nlc3NfY2FwdHVyZV90cmFjZV90aHJlYWRfaW5mbyoqIHBwVHJhY2VySW5mbykKK3sKKyAgICB1bnNpZ25lZCBpbnQgbnVtX3RyYWNlcnMgPSAxOworCisgICAgYXNzZXJ0KHBwVHJhY2VySW5mbyAhPSBOVUxMICYmICpwcFRyYWNlckluZm8gPT0gTlVMTCk7CisgICAgKnBwVHJhY2VySW5mbyA9IFZLVFJBQ0VfTkVXX0FSUkFZKHZrdHJhY2VfcHJvY2Vzc19jYXB0dXJlX3RyYWNlX3RocmVhZF9pbmZvLCBudW1fdHJhY2Vycyk7CisgICAgbWVtc2V0KCpwcFRyYWNlckluZm8sIDAsIHNpemVvZih2a3RyYWNlX3Byb2Nlc3NfY2FwdHVyZV90cmFjZV90aHJlYWRfaW5mbykgKiBudW1fdHJhY2Vycyk7CisKKyAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgVnVsa2FuIHRyYWNlcgorICAgICgqcHBUcmFjZXJJbmZvKVswXS50cmFjZXJJZCA9IFZLVFJBQ0VfVElEX1ZVTEtBTjsKKworICAgIHJldHVybiBudW1fdHJhY2VyczsKK30KKworYm9vbCBJbmplY3RUcmFjZXJzSW50b1Byb2Nlc3Modmt0cmFjZV9wcm9jZXNzX2luZm8qIHBJbmZvKQoreworICAgIGJvb2wgYlJlY29yZGluZ1RocmVhZHNDcmVhdGVkID0gdHJ1ZTsKKyAgICB2a3RyYWNlX3RocmVhZCB0cmFjaW5nVGhyZWFkOworICAgIGlmICh2a3RyYWNlX3BsYXRmb3JtX3JlbW90ZV9sb2FkX2xpYnJhcnkocEluZm8tPmhQcm9jZXNzLCBOVUxMLCAmdHJhY2luZ1RocmVhZCwgTlVMTCkpIHsKKyAgICAgICAgLy8gcHJlcGFyZSBkYXRhIGZvciBjYXB0dXJlIHRocmVhZHMKKyAgICAgICAgcEluZm8tPnBDYXB0dXJlVGhyZWFkc1swXS5wUHJvY2Vzc0luZm8gPSBwSW5mbzsKKyAgICAgICAgcEluZm8tPnBDYXB0dXJlVGhyZWFkc1swXS5yZWNvcmRpbmdUaHJlYWQgPSBWS1RSQUNFX05VTExfVEhSRUFEOworCisgICAgICAgIC8vIGNyZWF0ZSB0aHJlYWQgdG8gcmVjb3JkIHRyYWNlIHBhY2tldHMgZnJvbSB0aGUgdHJhY2VyCisgICAgICAgIHBJbmZvLT5wQ2FwdHVyZVRocmVhZHNbMF0ucmVjb3JkaW5nVGhyZWFkID0gdmt0cmFjZV9wbGF0Zm9ybV9jcmVhdGVfdGhyZWFkKFByb2Nlc3NfUnVuUmVjb3JkVHJhY2VUaHJlYWQsICYocEluZm8tPnBDYXB0dXJlVGhyZWFkc1swXSkpOworICAgICAgICBpZiAocEluZm8tPnBDYXB0dXJlVGhyZWFkc1swXS5yZWNvcmRpbmdUaHJlYWQgPT0gVktUUkFDRV9OVUxMX1RIUkVBRCkgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSB0cmFjZSByZWNvcmRpbmcgdGhyZWFkLiIpOworICAgICAgICAgICAgYlJlY29yZGluZ1RocmVhZHNDcmVhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZhaWxlZCB0byBpbmplY3QgYSBETEwKKyAgICAgICAgYlJlY29yZGluZ1RocmVhZHNDcmVhdGVkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBiUmVjb3JkaW5nVGhyZWFkc0NyZWF0ZWQ7Cit9CisKK3ZvaWQgbG9nZ2luZ0NhbGxiYWNrKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogcE1lc3NhZ2UpCit7CisgICAgaWYgKGxldmVsID09IFZLVFJBQ0VfTE9HX05PTkUpCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaChsZXZlbCkKKyAgICB7CisgICAgY2FzZSBWS1RSQUNFX0xPR19ERUJVRzogcHJpbnRmKCJ2a3RyYWNlIGRlYnVnOiAlc1xuIiwgcE1lc3NhZ2UpOyBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX0VSUk9SOiBwcmludGYoInZrdHJhY2UgZXJyb3I6ICVzXG4iLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9MT0dfV0FSTklORzogcHJpbnRmKCJ2a3RyYWNlIHdhcm5pbmc6ICVzXG4iLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9MT0dfVkVSQk9TRTogcHJpbnRmKCJ2a3RyYWNlIGluZm86ICVzXG4iLCBwTWVzc2FnZSk7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiJXNcbiIsIHBNZXNzYWdlKTsgYnJlYWs7CisgICAgfQorICAgIGZmbHVzaChzdGRvdXQpOworCisjaWYgZGVmaW5lZChXSU4zMikKKyNpZiBfREVCVUcKKyAgICBPdXRwdXREZWJ1Z1N0cmluZyhwTWVzc2FnZSk7CisjZW5kaWYKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgICAgbWVtc2V0KCZnX3NldHRpbmdzLCAwLCBzaXplb2Yodmt0cmFjZV9zZXR0aW5ncykpOworCisgICAgdmt0cmFjZV9Mb2dTZXRDYWxsYmFjayhsb2dnaW5nQ2FsbGJhY2spOworICAgIHZrdHJhY2VfTG9nU2V0TGV2ZWwoVktUUkFDRV9MT0dfRVJST1IpOworCisgICAgLy8gc2V0dXAgZGVmYXVsdHMKKyAgICBtZW1zZXQoJmdfZGVmYXVsdF9zZXR0aW5ncywgMCwgc2l6ZW9mKHZrdHJhY2Vfc2V0dGluZ3MpKTsKKyAgICBnX2RlZmF1bHRfc2V0dGluZ3Mub3V0cHV0X3RyYWNlID0gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weSgidmt0cmFjZV9vdXQudmt0cmFjZSIpOworICAgIGdfZGVmYXVsdF9zZXR0aW5ncy52ZXJib3NpdHkgPSAiZXJyb3JzIjsKKyAgICBnX2RlZmF1bHRfc2V0dGluZ3Muc2NyZWVuc2hvdExpc3QgPSBOVUxMOworCisgICAgaWYgKHZrdHJhY2VfU2V0dGluZ0dyb3VwX2luaXQoJmdfc2V0dGluZ0dyb3VwLCBOVUxMLCBhcmdjLCBhcmd2LCAmZ19zZXR0aW5ncy5hcmd1bWVudHMpICE9IDApCisgICAgeworICAgICAgICAvLyBpbnZhbGlkIGNtZC1saW5lIHBhcmFtZXRlcnMKKyAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfZGVsZXRlKCZnX3NldHRpbmdHcm91cCk7CisgICAgICAgIHZrdHJhY2VfZnJlZShnX2RlZmF1bHRfc2V0dGluZ3Mub3V0cHV0X3RyYWNlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBWYWxpZGF0ZSB2a3RyYWNlIGlucHV0cworICAgICAgICBCT09MIHZhbGlkQXJncyA9IFRSVUU7CisKKyAgICAgICAgaWYgKGdfc2V0dGluZ3Mub3V0cHV0X3RyYWNlID09IE5VTEwgfHwgc3RybGVuIChnX3NldHRpbmdzLm91dHB1dF90cmFjZSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRBcmdzID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyY21wKGdfc2V0dGluZ3MudmVyYm9zaXR5LCAicXVpZXQiKSA9PSAwKQorICAgICAgICAgICAgdmt0cmFjZV9Mb2dTZXRMZXZlbChWS1RSQUNFX0xPR19OT05FKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGdfc2V0dGluZ3MudmVyYm9zaXR5LCAiZXJyb3JzIikgPT0gMCkKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nU2V0TGV2ZWwoVktUUkFDRV9MT0dfRVJST1IpOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoZ19zZXR0aW5ncy52ZXJib3NpdHksICJ3YXJuaW5ncyIpID09IDApCisgICAgICAgICAgICB2a3RyYWNlX0xvZ1NldExldmVsKFZLVFJBQ0VfTE9HX1dBUk5JTkcpOworICAgICAgICBlbHNlIGlmIChzdHJjbXAoZ19zZXR0aW5ncy52ZXJib3NpdHksICJmdWxsIikgPT0gMCkKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nU2V0TGV2ZWwoVktUUkFDRV9MT0dfVkVSQk9TRSk7CisjaWYgX0RFQlVHCisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChnX3NldHRpbmdzLnZlcmJvc2l0eSwgImRlYnVnIikgPT0gMCkKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nU2V0TGV2ZWwoVktUUkFDRV9MT0dfREVCVUcpOworI2VuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dTZXRMZXZlbChWS1RSQUNFX0xPR19FUlJPUik7CisgICAgICAgICAgICB2YWxpZEFyZ3MgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICB2a3RyYWNlX3NldF9nbG9iYWxfdmFyKCJfVktfVFJBQ0VfVkVSQk9TSVRZIiwgZ19zZXR0aW5ncy52ZXJib3NpdHkpOworCisgICAgICAgIGlmICh2YWxpZEFyZ3MgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX3ByaW50KCZnX3NldHRpbmdHcm91cCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ19zZXR0aW5ncy5wcm9ncmFtID09IE5VTEwgfHwgc3RybGVuKGdfc2V0dGluZ3MucHJvZ3JhbSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJObyBwcm9ncmFtICgtcCkgcGFyYW1ldGVyIGZvdW5kOiBXaWxsIHJ1biB2a3RyYWNlIGFzIHNlcnZlci4iKTsKKyAgICAgICAgICAgIHByaW50ZigiUnVubmluZyB2a3RyYWNlIGFzIHNlcnZlci4uLlxuIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIGdfc2V0dGluZ3MuYXJndW1lbnRzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnX3NldHRpbmdzLndvcmtpbmdfZGlyID09IE5VTEwgfHwgc3RybGVuKGdfc2V0dGluZ3Mud29ya2luZ19kaXIpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ0hBUiogYnVmID0gVktUUkFDRV9ORVdfQVJSQVkoQ0hBUiwgNDA5Nik7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJObyB3b3JraW5nIGRpcmVjdG9yeSAoLXcpIHBhcmFtZXRlciBmb3VuZDogQXNzdW1pbmcgZXhlY3V0YWJsZSdzIHBhdGggYXMgd29ya2luZyBkaXJlY3RvcnkuIik7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9wbGF0Zm9ybV9mdWxsX3BhdGgoZ19zZXR0aW5ncy5wcm9ncmFtLCA0MDk2LCBidWYpOworICAgICAgICAgICAgICAgIGdfc2V0dGluZ3Mud29ya2luZ19kaXIgPSB2a3RyYWNlX3BsYXRmb3JtX2V4dHJhY3RfcGF0aChidWYpOworICAgICAgICAgICAgICAgIFZLVFJBQ0VfREVMRVRFKGJ1Zik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiUnVubmluZyB2a3RyYWNlIGFzIHBhcmVudCBwcm9jZXNzIHdpbGwgc3Bhd24gY2hpbGQgcHJvY2VzczogJXMiLCBnX3NldHRpbmdzLnByb2dyYW0pOworICAgICAgICAgICAgaWYgKGdfc2V0dGluZ3MuYXJndW1lbnRzICE9IE5VTEwgJiYgc3RybGVuKGdfc2V0dGluZ3MuYXJndW1lbnRzKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJBcmdzIHRvIGJlIHBhc3NlZCB0byBjaGlsZCBwcm9jZXNzOiAnJXMnIiwgZ19zZXR0aW5ncy5hcmd1bWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdfc2V0dGluZ3Muc2NyZWVuc2hvdExpc3QpCisgICAgeworICAgICAgICAvLyBFeHBvcnQgbGlzdCB0byBzY3JlZW5zaG90IGxheWVyCisgICAgICAgIHZrdHJhY2Vfc2V0X2dsb2JhbF92YXIoIl9WS19TQ1JFRU5TSE9UIiwgZ19zZXR0aW5ncy5zY3JlZW5zaG90TGlzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZrdHJhY2Vfc2V0X2dsb2JhbF92YXIoIl9WS19TQ1JFRU5TSE9UIiwiIik7CisgICAgfQorCisKKyAgICB1bnNpZ25lZCBpbnQgc2VydmVySW5kZXggPSAwOworICAgIGRvIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBzdGFydCB0aGUgcHJvY2VzcyBvciBydW4gaW4gc2VydmVyIG1vZGUKKworICAgICAgICBCT09MIHByb2NTdGFydGVkID0gVFJVRTsKKyAgICAgICAgdmt0cmFjZV9wcm9jZXNzX2luZm8gcHJvY0luZm87CisgICAgICAgIG1lbXNldCgmcHJvY0luZm8sIDAsIHNpemVvZih2a3RyYWNlX3Byb2Nlc3NfaW5mbykpOworICAgICAgICBpZiAoZ19zZXR0aW5ncy5wcm9ncmFtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb2NJbmZvLmV4ZU5hbWUgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KGdfc2V0dGluZ3MucHJvZ3JhbSk7CisgICAgICAgICAgICBwcm9jSW5mby5wcm9jZXNzQXJncyA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkoZ19zZXR0aW5ncy5hcmd1bWVudHMpOworICAgICAgICAgICAgcHJvY0luZm8uZnVsbFByb2Nlc3NDbWRMaW5lID0gdmt0cmFjZV9jb3B5X2FuZF9hcHBlbmQoZ19zZXR0aW5ncy5wcm9ncmFtLCAiICIsIGdfc2V0dGluZ3MuYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHByb2NJbmZvLndvcmtpbmdEaXJlY3RvcnkgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KGdfc2V0dGluZ3Mud29ya2luZ19kaXIpOworICAgICAgICAgICAgcHJvY0luZm8udHJhY2VGaWxlbmFtZSA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkoZ19zZXR0aW5ncy5vdXRwdXRfdHJhY2UpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqcEV4dGVuc2lvbiA9IHN0cnJjaHIoZ19zZXR0aW5ncy5vdXRwdXRfdHJhY2UsICcuJyk7CisgICAgICAgICAgICBjaGFyICpiYXNlbmFtZSA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHlfbihnX3NldHRpbmdzLm91dHB1dF90cmFjZSwgKGludCkgKChwRXh0ZW5zaW9uID09IE5VTEwpID8gc3RybGVuKGdfc2V0dGluZ3Mub3V0cHV0X3RyYWNlKSA6IHBFeHRlbnNpb24gLSBnX3NldHRpbmdzLm91dHB1dF90cmFjZSkpOworICAgICAgICAgICAgY2hhciBudW1bMTZdOworI2lmZGVmIFBMQVRGT1JNX0xJTlVYCisgICAgICAgICAgICBzbnByaW50ZihudW0sIDE2LCAiJXUiLCBzZXJ2ZXJJbmRleCk7CisjZWxpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgICAgICAgX3NucHJpbnRmX3MobnVtLCAxNiwgX1RSVU5DQVRFLCAiJXUiLCBzZXJ2ZXJJbmRleCk7CisjZW5kaWYKKyAgICAgICAgICAgIHByb2NJbmZvLnRyYWNlRmlsZW5hbWUgPSB2a3RyYWNlX2NvcHlfYW5kX2FwcGVuZChiYXNlbmFtZSwgbnVtLCBwRXh0ZW5zaW9uKTsKKyAgICAgICAgIH0KKworICAgICAgICBwcm9jSW5mby5wYXJlbnRUaHJlYWRJZCA9IHZrdHJhY2VfcGxhdGZvcm1fZ2V0X3RocmVhZF9pZCgpOworCisgICAgICAgIC8vIHNldHVwIHRyYWNlciwgb25seSBWdWxrYW4gdHJhY2VyIHN1cHBwb3J0ZWQKKyAgICAgICAgUHJlcGFyZVRyYWNlcnMoJnByb2NJbmZvLnBDYXB0dXJlVGhyZWFkcyk7CisKKyAgICAgICAgaWYgKGdfc2V0dGluZ3MucHJvZ3JhbSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyICppbnN0RW52ID0gdmt0cmFjZV9nZXRfZ2xvYmFsX3ZhcigiVktfSU5TVEFOQ0VfTEFZRVJTIik7CisgICAgICAgICAgICAvLyBBZGQgU2NyZWVuU2hvdCBsYXllciBpZiBlbmFibGVkCisgICAgICAgICAgICBpZiAoZ19zZXR0aW5ncy5zY3JlZW5zaG90TGlzdCAmJiAoIWluc3RFbnYgfHwgIXN0cnN0cihpbnN0RW52LCAiVktfTEFZRVJfTFVOQVJHX3NjcmVlbnNob3QiKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpbnN0RW52IHx8IHN0cmxlbihpbnN0RW52KSAgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9zZXRfZ2xvYmFsX3ZhcigiVktfSU5TVEFOQ0VfTEFZRVJTIiwgIlZLX0xBWUVSX0xVTkFSR19zY3JlZW5zaG90Iik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqbmV3RW52ID0gdmt0cmFjZV9jb3B5X2FuZF9hcHBlbmQoaW5zdEVudiwgVktUUkFDRV9MSVNUX1NFUEFSQVRPUiwgIlZLX0xBWUVSX0xVTkFSR19zY3JlZW5zaG90Iik7CisgICAgICAgICAgICAgICAgICAgIHZrdHJhY2Vfc2V0X2dsb2JhbF92YXIoIlZLX0lOU1RBTkNFX0xBWUVSUyIsIG5ld0Vudik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluc3RFbnYgPSB2a3RyYWNlX2dldF9nbG9iYWxfdmFyKCJWS19JTlNUQU5DRV9MQVlFUlMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgKmRldkVudiA9IHZrdHJhY2VfZ2V0X2dsb2JhbF92YXIoIlZLX0RFVklDRV9MQVlFUlMiKTsKKyAgICAgICAgICAgIGlmIChnX3NldHRpbmdzLnNjcmVlbnNob3RMaXN0ICYmICghZGV2RW52IHx8ICFzdHJzdHIoZGV2RW52LCAiVktfTEFZRVJfTFVOQVJHX3NjcmVlbnNob3QiKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFkZXZFbnYgfHwgc3RybGVuKGRldkVudikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9zZXRfZ2xvYmFsX3ZhcigiVktfREVWSUNFX0xBWUVSUyIsICJWS19MQVlFUl9MVU5BUkdfc2NyZWVuc2hvdCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5ld0VudiA9IHZrdHJhY2VfY29weV9hbmRfYXBwZW5kKGRldkVudiwgVktUUkFDRV9MSVNUX1NFUEFSQVRPUiwgIlZLX0xBWUVSX0xVTkFSR19zY3JlZW5zaG90Iik7CisgICAgICAgICAgICAgICAgICAgIHZrdHJhY2Vfc2V0X2dsb2JhbF92YXIoIlZLX0RFVklDRV9MQVlFUlMiLCBuZXdFbnYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXZFbnYgPSB2a3RyYWNlX2dldF9nbG9iYWxfdmFyKCJWS19ERVZJQ0VfTEFZRVJTIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQgdmt0cmFjZV9sYXllciBlbmFibGUgZW52IHZhciBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmICghaW5zdEVudiB8fCBzdHJsZW4oaW5zdEVudikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX3NldF9nbG9iYWxfdmFyKCJWS19JTlNUQU5DRV9MQVlFUlMiLCAiVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGluc3RFbnYgIT0gc3Ryc3RyKGluc3RFbnYsICJWS19MQVlFUl9MVU5BUkdfdmt0cmFjZSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKm5ld0VudiA9IHZrdHJhY2VfY29weV9hbmRfYXBwZW5kKCJWS19MQVlFUl9MVU5BUkdfdmt0cmFjZSIsIFZLVFJBQ0VfTElTVF9TRVBBUkFUT1IsIGluc3RFbnYpOworICAgICAgICAgICAgICAgIHZrdHJhY2Vfc2V0X2dsb2JhbF92YXIoIlZLX0lOU1RBTkNFX0xBWUVSUyIsIG5ld0Vudik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRldkVudiB8fCBzdHJsZW4oZGV2RW52KSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZrdHJhY2Vfc2V0X2dsb2JhbF92YXIoIlZLX0RFVklDRV9MQVlFUlMiLCAiVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRldkVudiAhPSBzdHJzdHIoZGV2RW52LCAiVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2UiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICpuZXdFbnYgPSB2a3RyYWNlX2NvcHlfYW5kX2FwcGVuZCgiVktfTEFZRVJfTFVOQVJHX3ZrdHJhY2UiLCBWS1RSQUNFX0xJU1RfU0VQQVJBVE9SLCBkZXZFbnYpOworICAgICAgICAgICAgICAgIHZrdHJhY2Vfc2V0X2dsb2JhbF92YXIoIlZLX0RFVklDRV9MQVlFUlMiLCBuZXdFbnYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2FsbCBDcmVhdGVQcm9jZXNzIHRvIGxhdW5jaCB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgIHByb2NTdGFydGVkID0gdmt0cmFjZV9wcm9jZXNzX3NwYXduKCZwcm9jSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2NTdGFydGVkID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gc2V0dXAgcmVtb3RlIHByb2Nlc3MuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSW5qZWN0VHJhY2Vyc0ludG9Qcm9jZXNzKCZwcm9jSW5mbykgPT0gRkFMU0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIHNldHVwIHRyYWNlciBjb21tdW5pY2F0aW9uIHRocmVhZHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGUgd2F0Y2hkb2cgdGhyZWFkIHRvIG1vbml0b3IgZXhpc3RlbmNlIG9mIHJlbW90ZSBwcm9jZXNzCisgICAgICAgICAgICBpZiAoZ19zZXR0aW5ncy5wcm9ncmFtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcHJvY0luZm8ud2F0Y2hkb2dUaHJlYWQgPSB2a3RyYWNlX3BsYXRmb3JtX2NyZWF0ZV90aHJlYWQoUHJvY2Vzc19SdW5XYXRjaGRvZ1RocmVhZCwgJnByb2NJbmZvKTsKKworI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgICAgICAgICAgLy8gU3luYyB3YWl0IGZvciBsb2NhbCB0aHJlYWRzIGFuZCByZW1vdGUgcHJvY2VzcyB0byBjb21wbGV0ZS4KKworICAgICAgICAgICAgdmt0cmFjZV9wbGF0Zm9ybV9zeW5jX3dhaXRfZm9yX3RocmVhZCgmKHByb2NJbmZvLnBDYXB0dXJlVGhyZWFkc1swXS5yZWNvcmRpbmdUaHJlYWQpKTsKKworICAgICAgICAgICAgaWYgKGdfc2V0dGluZ3MucHJvZ3JhbSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHZrdHJhY2VfcGxhdGZvcm1fc3luY193YWl0X2Zvcl90aHJlYWQoJnByb2NJbmZvLndhdGNoZG9nVGhyZWFkKTsKKyNlbHNlCisgICAgICAgICAgICB2a3RyYWNlX3BsYXRmb3JtX3Jlc3VtZV90aHJlYWQoJnByb2NJbmZvLmhUaHJlYWQpOworCisgICAgICAgICAgICAvLyBOb3cgaW50byB0aGUgbWFpbiBtZXNzYWdlIGxvb3AsIGxpc3RlbiBmb3IgaG90a2V5cyB0byBzZW5kIG92ZXIuCisgICAgICAgICAgICBNZXNzYWdlTG9vcCgpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICB2a3RyYWNlX3Byb2Nlc3NfaW5mb19kZWxldGUoJnByb2NJbmZvKTsKKyAgICAgICAgc2VydmVySW5kZXgrKzsKKyAgICB9IHdoaWxlIChnX3NldHRpbmdzLnByb2dyYW0gPT0gTlVMTCk7CisKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9kZWxldGUoJmdfc2V0dGluZ0dyb3VwKTsKKyAgICB2a3RyYWNlX2ZyZWUoZ19kZWZhdWx0X3NldHRpbmdzLm91dHB1dF90cmFjZSk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV90cmFjZS92a3RyYWNlLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3RyYWNlL3ZrdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzBhYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV90cmFjZS92a3RyYWNlLmgKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3ByYWdtYSBvbmNlCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZrdHJhY2Vfc2V0dGluZ3MuaCIKK30KKworCisjaWYgZGVmaW5lZChXSU4zMikKKyNkZWZpbmUgVktUUkFDRV9XTV9DT01QTEVURSAoV01fVVNFUiArIDApCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWxzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IHZrdHJhY2Vfc2V0dGluZ3MKK3sKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIGFyZ3VtZW50czsKKyAgICBjb25zdCBjaGFyKiB3b3JraW5nX2RpcjsKKyAgICBjaGFyKiBvdXRwdXRfdHJhY2U7CisgICAgQk9PTCBwcmludF90cmFjZV9tZXNzYWdlczsKKyAgICBjb25zdCBjaGFyKiBzY3JlZW5zaG90TGlzdDsKKyAgICBjb25zdCBjaGFyICp2ZXJib3NpdHk7Cit9IHZrdHJhY2Vfc2V0dGluZ3M7CisKK2V4dGVybiB2a3RyYWNlX3NldHRpbmdzIGdfc2V0dGluZ3M7CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3RyYWNlL3ZrdHJhY2VfcHJvY2Vzcy5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX3RyYWNlL3ZrdHJhY2VfcHJvY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1YWIyYwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2VfdHJhY2Uvdmt0cmFjZV9wcm9jZXNzLmNwcApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBKb24gQXNoYnVybiA8am9uQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ2a3RyYWNlX3Byb2Nlc3MuaCIKKyNpbmNsdWRlICJ2a3RyYWNlLmgiCisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKQorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoUExBVEZPUk1fT1NYKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjZW5kaWYKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidmt0cmFjZV9maWxlbGlrZS5oIgorI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCIKK30KKworY29uc3QgdW5zaWduZWQgbG9uZyBrV2F0Y2hEb2dQb2xsVGltZSA9IDI1MDsKKworI2lmIGRlZmluZWQoV0lOMzIpCit2b2lkIFNhZmVDbG9zZUhhbmRsZShIQU5ETEUmIF9oYW5kbGUpCit7CisgICAgaWYgKF9oYW5kbGUpIHsKKyAgICAgICAgQ2xvc2VIYW5kbGUoX2hhbmRsZSk7CisgICAgICAgIF9oYW5kbGUgPSBOVUxMOworICAgIH0KK30KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ZLVFJBQ0VfVEhSRUFEX1JPVVRJTkVfUkVUVVJOX1RZUEUgUHJvY2Vzc19SdW5XYXRjaGRvZ1RocmVhZChMUFZPSUQgX3Byb2NJbmZvUHRyKQoreworICAgIHZrdHJhY2VfcHJvY2Vzc19pbmZvKiBwUHJvY0luZm8gPSAodmt0cmFjZV9wcm9jZXNzX2luZm8qKV9wcm9jSW5mb1B0cjsKKworI2lmIGRlZmluZWQoV0lOMzIpCisKKyAgICB3aGlsZSAoV2FpdEZvclNpbmdsZU9iamVjdChwUHJvY0luZm8tPmhQcm9jZXNzLCBrV2F0Y2hEb2dQb2xsVGltZSkgPT0gV0FJVF9USU1FT1VUKQorICAgIHsKKyAgICAgICAgaWYgKHBQcm9jSW5mby0+c2VydmVyUmVxdWVzdHNUZXJtaW5hdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJWa3RyYWNlIGhhcyByZXF1ZXN0ZWQgZXhpdC4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJDaGlsZCBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLiIpOworCisgICAgUG9zdFRocmVhZE1lc3NhZ2UocFByb2NJbmZvLT5wYXJlbnRUaHJlYWRJZCwgVktUUkFDRV9XTV9DT01QTEVURSwgMCwgMCk7CisgICAgcFByb2NJbmZvLT5zZXJ2ZXJSZXF1ZXN0c1Rlcm1pbmF0aW9uID0gVFJVRTsKKyAgICAKKyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoUExBVEZPUk1fT1NYKQorICAgIGludCBzdGF0dXMgPSAwOworICAgIGludCBvcHRpb25zID0gMDsKKyAgICB3aGlsZSAod2FpdHBpZChwUHJvY0luZm8tPnByb2Nlc3NJZCwgJnN0YXR1cywgb3B0aW9ucykgIT0gLTEpCisgICAgeworICAgICAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiQ2hpbGQgcHJvY2VzcyBleGl0ZWQuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChXQ09SRURVTVAoc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ2hpbGQgcHJvY2VzcyBjcmFzaGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiQ2hpbGQgcHJvY2VzcyB3YXMgc2lnbmFsZWQuIik7CisgICAgICAgIGVsc2UgaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSkKKyAgICAgICAgICAgIHZrdHJhY2VfTG9nVmVyYm9zZSgiQ2hpbGQgcHJvY2VzcyB3YXMgc3RvcHBlZC4iKTsKKyAgICAgICAgZWxzZSBpZiAoV0lGQ09OVElOVUVEKHN0YXR1cykpCisgICAgICAgICAgICB2a3RyYWNlX0xvZ1ZlcmJvc2UoIkNoaWxkIHByb2Nlc3Mgd2FzIGNvbnRpbnVlZC4iKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitWS1RSQUNFX1RIUkVBRF9ST1VUSU5FX1JFVFVSTl9UWVBFIFByb2Nlc3NfUnVuUmVjb3JkVHJhY2VUaHJlYWQoTFBWT0lEIF90aHJlYWRJbmZvKQoreworICAgIHZrdHJhY2VfcHJvY2Vzc19jYXB0dXJlX3RyYWNlX3RocmVhZF9pbmZvKiBwSW5mbyA9ICh2a3RyYWNlX3Byb2Nlc3NfY2FwdHVyZV90cmFjZV90aHJlYWRfaW5mbyopX3RocmVhZEluZm87CisKKyAgICBNZXNzYWdlU3RyZWFtKiBwTWVzc2FnZVN0cmVhbSA9IHZrdHJhY2VfTWVzc2FnZVN0cmVhbV9jcmVhdGUoVFJVRSwgIiIsIFZLVFJBQ0VfQkFTRV9QT1JUICsgcEluZm8tPnRyYWNlcklkKTsKKyAgICBpZiAocE1lc3NhZ2VTdHJlYW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlRocmVhZF9DYXB0dXJlVHJhY2UoKSBjYW5ub3QgY3JlYXRlIG1lc3NhZ2Ugc3RyZWFtLiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdHJhY2UgZmlsZQorICAgIHBJbmZvLT5wUHJvY2Vzc0luZm8tPnBUcmFjZUZpbGUgPSB2a3RyYWNlX3dyaXRlX3RyYWNlX2ZpbGVfaGVhZGVyKHBJbmZvLT5wUHJvY2Vzc0luZm8pOworCisgICAgaWYgKHBJbmZvLT5wUHJvY2Vzc0luZm8tPnBUcmFjZUZpbGUgPT0gTlVMTCkgeworICAgICAgICAvLyB3cml0aW5nIHRyYWNlIGZpbGUgZ2VuZXJhdGVkIGFuIGVycm9yLCBubyBzZW5zZSBpbiBjb250aW51aW5nLgorICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJFcnJvciBjYW5ub3QgY3JlYXRlIHRyYWNlIGZpbGUgYW5kIHdyaXRlIGhlYWRlci4iKTsKKyAgICAgICAgdmt0cmFjZV9wcm9jZXNzX2luZm9fZGVsZXRlKHBJbmZvLT5wUHJvY2Vzc0luZm8pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBGaWxlTGlrZSogZmlsZUxpa2VTb2NrZXQgPSB2a3RyYWNlX0ZpbGVMaWtlX2NyZWF0ZV9tc2cocE1lc3NhZ2VTdHJlYW0pOworICAgIHVuc2lnbmVkIGludCB0b3RhbF9wYWNrZXRfY291bnQgPSAwOworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9IE5VTEw7CisgICAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW47CisKKyAgICB3aGlsZSAocEluZm8tPnBQcm9jZXNzSW5mby0+c2VydmVyUmVxdWVzdHNUZXJtaW5hdGlvbiA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIC8vIGdldCBhIHBhY2tldAorICAgICAgICAvL3ZrdHJhY2VfTG9nRGVidWcoIldhaXRpbmcgZm9yIGEgcGFja2V0Li4uIik7CisKKyAgICAgICAgLy8gcmVhZCBlbnRpcmUgcGFja2V0IGluCisgICAgICAgIHBIZWFkZXIgPSB2a3RyYWNlX3JlYWRfdHJhY2VfcGFja2V0KGZpbGVMaWtlU29ja2V0KTsKKyAgICAgICAgKyt0b3RhbF9wYWNrZXRfY291bnQ7CisgICAgICAgIGlmIChwSGVhZGVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVzc2FnZVN0cmVhbS0+bUVycm9yTnVtID09IFdTQUVDT05OUkVTRVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiTmV0d29yayBDb25uZWN0aW9uIFJlc2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiTmV0d29yayBDb25uZWN0aW9uIEZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvL3ZrdHJhY2VfTG9nRGVidWcoIlJlY2VpdmVkIHBhY2tldCBpZDogJWh1IiwgcEhlYWRlci0+cGFja2V0X2lkKTsKKyAgICAgICAgCisgICAgICAgIGlmIChwSGVhZGVyLT5wQm9keSA9PSAodWludHB0cl90KSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoIlJlY2VpdmVkIGVtcHR5IHBhY2tldCBib2R5IGZvciBpZDogJWh1IiwgcEhlYWRlci0+cGFja2V0X2lkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgcGFja2V0cworICAgICAgICAgICAgaWYgKHBIZWFkZXItPnBhY2tldF9pZCA9PSBWS1RSQUNFX1RQSV9NRVNTQUdFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChnX3NldHRpbmdzLnByaW50X3RyYWNlX21lc3NhZ2VzID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9tZXNzYWdlKiBwUGFja2V0ID0gdmt0cmFjZV9pbnRlcnByZXRfYm9keV9hc190cmFjZV9wYWNrZXRfbWVzc2FnZShwSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dBbHdheXMoIlBhY2tldCAlbHU6IFRyYWNlZCBNZXNzYWdlICglcyk6ICVzIiwgcEhlYWRlci0+Z2xvYmFsX3BhY2tldF9pbmRleCwgdmt0cmFjZV9Mb2dMZXZlbFRvU2hvcnRTdHJpbmcocFBhY2tldC0+dHlwZSksIHBQYWNrZXQtPm1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkICoqKSAmKHBQYWNrZXQtPm1lc3NhZ2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwSGVhZGVyLT5wYWNrZXRfaWQgPT0gVktUUkFDRV9UUElfTUFSS0VSX1RFUk1JTkFURV9QUk9DRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbmZvLT5wUHJvY2Vzc0luZm8tPnNlcnZlclJlcXVlc3RzVGVybWluYXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIHZrdHJhY2VfZGVsZXRlX3RyYWNlX3BhY2tldCgmcEhlYWRlcik7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dWZXJib3NlKCJUaHJlYWRfQ2FwdHVyZVRyYWNlIGlzIGV4aXRpbmcuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwSW5mby0+cFByb2Nlc3NJbmZvLT5wVHJhY2VGaWxlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKCZwSW5mby0+cFByb2Nlc3NJbmZvLT50cmFjZUZpbGVDcml0aWNhbFNlY3Rpb24pOworICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPSBmd3JpdGUocEhlYWRlciwgMSwgKHNpemVfdClwSGVhZGVyLT5zaXplLCBwSW5mby0+cFByb2Nlc3NJbmZvLT5wVHJhY2VGaWxlKTsKKyAgICAgICAgICAgICAgICBmZmx1c2gocEluZm8tPnBQcm9jZXNzSW5mby0+cFRyYWNlRmlsZSk7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCZwSW5mby0+cFByb2Nlc3NJbmZvLT50cmFjZUZpbGVDcml0aWNhbFNlY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChieXRlc193cml0dGVuICE9IHBIZWFkZXItPnNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgdGhlIHBhY2tldCBmb3IgcGFja2V0X2lkID0gJWh1IiwgcEhlYWRlci0+cGFja2V0X2lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjbGVhbiB1cAorICAgICAgICB2a3RyYWNlX2RlbGV0ZV90cmFjZV9wYWNrZXQoJnBIZWFkZXIpOworICAgIH0KKworICAgIFZLVFJBQ0VfREVMRVRFKGZpbGVMaWtlU29ja2V0KTsKKyAgICB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fZGVzdHJveSgmcE1lc3NhZ2VTdHJlYW0pOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3RyYWNlL3ZrdHJhY2VfcHJvY2Vzcy5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV90cmFjZS92a3RyYWNlX3Byb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzdhMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV90cmFjZS92a3RyYWNlX3Byb2Nlc3MuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBOVklESUEgQ09SUE9SQVRJT04uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPgorICovCisKKyNwcmFnbWEgb25jZQorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIgorI2luY2x1ZGUgInZrdHJhY2VfcHJvY2Vzcy5oIgorI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiCit9CisKK1ZLVFJBQ0VfVEhSRUFEX1JPVVRJTkVfUkVUVVJOX1RZUEUgUHJvY2Vzc19SdW5SZWNvcmRUcmFjZVRocmVhZChMUFZPSUQpOworCitWS1RSQUNFX1RIUkVBRF9ST1VUSU5FX1JFVFVSTl9UWVBFIFByb2Nlc3NfUnVuV2F0Y2hkb2dUaHJlYWQoTFBWT0lEKTsKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL0NNYWtlTGlzdHMudHh0IGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlMmE0OAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTkwIEBACitwcm9qZWN0KHZrdHJhY2V2aWV3ZXIpCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMy4wKQorCitpbmNsdWRlKCIke1NSQ19ESVJ9L2J1aWxkX29wdGlvbnMuY21ha2UiKQorCitzZXQoQ01BS0VfUFJFRklYX1BBVEggJHtDTUFLRV9QUkVGSVhfUEFUSH0gIiR7U1JDX0RJUn0vY21ha2UvTW9kdWxlcy8iKQorCisjIHdlIHdhbnQgY21ha2UgdG8gbGluayB0aGUgUXQgbGlicyBpbnRvIHRoZSBiaW5hcnkKKyMgVGhpcyBwb2xpY3kgd2FzIGludHJvZHVjZWQgaW4gMi44LjExLCBzbyBvbiBuZXdlciB2ZXJzaW9ucywgdXNlIHRoZSBPTEQgcG9saWN5IHRvIG1haW50YWluIGNvbnNpc3RlbnQgYmVoYXZpb3IKK2lmIChQT0xJQ1kgQ01QMDAyMCkKKyAgIGNtYWtlX3BvbGljeShTRVQgQ01QMDAyMCBPTEQpCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShRdDUgQ09NUE9ORU5UUyBXaWRnZXRzIEd1aSBDb3JlIFN2ZyBRVUlFVCkKKworaWYoTk9UIFF0NV9GT1VORCkKKyMgQWZ0ZXIgUXQ1LjYgaXMgaW5zdGFsbGVkLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGNtYWtlIGNvbW1hbmQgbGluZToKKyMgLURDTUFLRV9QUkVGSVhfUEFUSD1DOlxcUXRcXDUuNlxcbXN2YzIwMTVfNjRcXAorbWVzc2FnZShXQVJOSU5HICJXQVJOSU5HOiB2a3RyYWNldmlld2VyIHdpbGwgYmUgZXhjbHVkZWQgYmVjYXVzZSBRdDUgd2FzIG5vdCBmb3VuZC4iKQorZWxzZSgpCisKK2ZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKQorZmluZF9wYWNrYWdlKFgxMSBSRVFVSVJFRCkKKworcmVxdWlyZV9wdGhyZWFkcygpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtTUkNfRElSfQorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9jb21tb24KKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2VfcmVwbGF5CisgICAgJHtTUkNfRElSfS92a3RyYWNlX2V4dGVuc2lvbnMvdmt0cmFjZXZ1bGthbi92a3JlcGxheQorICAgICR7U1JDX0RJUn0vdmt0cmFjZV9leHRlbnNpb25zL3ZrdHJhY2V2dWxrYW4vdmt0cmFjZXZpZXdlcgorICAgICR7U1JDX0RJUn0vdmt0cmFjZV92aWV3ZXIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAke1F0NVdpZGdldHNfSU5DTFVERV9ESVJTfQorKQorCitzZXQoU1JDX0xJU1QKKyAgICBtYWluLmNwcAorICAgIHZrdHJhY2V2aWV3ZXIuY3BwCisgICAgdmt0cmFjZXZpZXdlcl9zZXR0aW5ncy5jcHAKKyAgICB2a3RyYWNldmlld2VyX291dHB1dC5jcHAKKyAgICB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuY3BwCisgICAgdmt0cmFjZXZpZXdlcl9xZ2VuZXJhdGV0cmFjZWRpYWxvZy5jcHAKKyAgICB2a3RyYWNldmlld2VyX3FzZXR0aW5nc2RpYWxvZy5jcHAKKyAgICB2a3RyYWNldmlld2VyX3F0aW1lbGluZXZpZXcuY3BwCisgICAgdmt0cmFjZXZpZXdlcl9xdHJhY2VmaWxlbG9hZGVyLmNwcAorICAgIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlci5jcHAKKyAgICB2a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeS5jcHAKKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X3NlcS5jcHAKKyAgICAke1NSQ19ESVJ9L3ZrdHJhY2VfcmVwbGF5L3ZrcmVwbGF5X2ZhY3RvcnkuY3BwCisgICApCisKKyMgVGhpcyBzaG91bGQgb25seSBjb250YWluIGhlYWRlcnMgdGhhdCBkZWZpbmUgYSBRT0JKRUNUCisjIFR5cGljYWxseSB0aGF0IG1lYW5zIGp1c3QgaGVhZGVycyBmb3IgVUkgb2JqZWN0cworc2V0KFVJX0hFQURFUl9MSVNUCisgICAgdmt0cmFjZXZpZXdlci5oCisgICAgdmt0cmFjZXZpZXdlcl9xZ2VuZXJhdGV0cmFjZWRpYWxvZy5oCisgICAgdmt0cmFjZXZpZXdlcl9xc2V0dGluZ3NkaWFsb2cuaAorICAgIHZrdHJhY2V2aWV3ZXJfcXRpbWVsaW5ldmlldy5oCisgICAgdmt0cmFjZXZpZXdlcl9xaW1hZ2V2aWV3ZXIuaAorICAgIHZrdHJhY2V2aWV3ZXJfcXN2Z3ZpZXdlci5oCisgICAgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V2lkZ2V0LmgKKyAgICB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXIuaAorICAgIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsLmgKKyAgICB2a3RyYWNldmlld2VyX3F0cmFjZWZpbGVsb2FkZXIuaAorICAgKQorCisjIFRoZXNlIGlzIGZvciBhbGwgaGVhZGVycworc2V0KEhFQURFUl9MSVNUCisgICAgdmt0cmFjZXZpZXdlci5oCisgICAgdmt0cmFjZXZpZXdlcl9zZXR0aW5ncy5oCisgICAgdmt0cmFjZXZpZXdlcl9vdXRwdXQuaAorICAgIHZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oCisgICAgdmt0cmFjZXZpZXdlcl9jb250cm9sbGVyX2ZhY3RvcnkuaAorICAgIHZrdHJhY2V2aWV3ZXJfcWdlbmVyYXRldHJhY2VkaWFsb2cuaAorICAgIHZrdHJhY2V2aWV3ZXJfcXNldHRpbmdzZGlhbG9nLmgKKyAgICB2a3RyYWNldmlld2VyX3F0aW1lbGluZXZpZXcuaAorICAgIHZrdHJhY2V2aWV3ZXJfcWltYWdldmlld2VyLmgKKyAgICB2a3RyYWNldmlld2VyX3Fzdmd2aWV3ZXIuaAorICAgIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdpZGdldC5oCisgICAgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyLmgKKyAgICB2a3RyYWNldmlld2VyX3F0cmFjZWZpbGVsb2FkZXIuaAorICAgIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsLmgKKyAgICB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuaAorICAgIHZrdHJhY2V2aWV3ZXJfdmlldy5oCisgICApCisKK3NldChGT1JNX0xJU1QKKyAgICB2a3RyYWNldmlld2VyLnVpCisgICApCisKK3NldChSRVNPVVJDRV9MSVNUCisgICApCisKK1FUNV9XUkFQX0NQUChRVF9HRU5fSEVBREVSX01PQ19MSVNUICR7VUlfSEVBREVSX0xJU1R9KQorUVQ1X1dSQVBfVUkoUVRfR0VOX0ZPUk1fSEVBREVSX0xJU1QgJHtGT1JNX0xJU1R9KQorUVQ1X0FERF9SRVNPVVJDRVMoUVRfR0VOX1JFU09VUkNFX1JDQ19MSVNUICR7UkVTT1VSQ0VfTElTVH0pCisKK2lmICgiJHtDTUFLRV9DX0NPTVBJTEVSX0lEfSIgU1RSRVFVQUwgIkNsYW5nIikKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLVduby1nbG9iYWwtY29uc3RydWN0b3JzIC1Xbm8tdXNlZC1idXQtbWFya2VkLXVudXNlZCIpCitlbmRpZigpCisKKyMgUGxhdGZvcm0gc3BlY2lmaWMgY29tcGlsZSBmbGFncy4KK2lmIChOT1QgTVNWQykKKyAgICBhZGRfY29tcGlsZXJfZmxhZygiLWZQSUMiKQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZSgke1BST0pFQ1RfTkFNRX0gJHtTUkNfTElTVH0gJHtIRUFERVJfTElTVH0KKyAgICAke1FUX0dFTl9IRUFERVJfTU9DX0xJU1R9CisgICAgJHtRVF9HRU5fRk9STV9IRUFERVJfTElTVH0KKyAgICAke1FUX0dFTl9SRVNPVVJDRV9SQ0NfTElTVH0KKyAgICkKKworaWYgKFRBUkdFVCBTREwpCisgICAgYWRkX2RlcGVuZGVuY2llcygke1BST0pFQ1RfTkFNRX0gU0RMKQorZW5kaWYgKCkKKworYWRkX2RlcGVuZGVuY2llcygke1BST0pFQ1RfTkFNRX0gdmt0cmFjZXZpZXdlcl92aykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7UFJPSkVDVF9OQU1FfQorICAgIFF0NTo6V2lkZ2V0cworICAgIFF0NTo6Q29yZQorICAgIFF0NTo6U3ZnCisgICAgdmt0cmFjZV9jb21tb24KKyAgICB2dWxrYW5fcmVwbGF5CisgICAgdmt0cmFjZXZpZXdlcl92aworICAgICR7Q01BS0VfRExfTElCU30KKyAgICAke1gxMV9YMTFfTElCfQorKQorCitpZiAoTVNWQykKKyAgIyBjb3B5IHRoZSBkZWJ1ZyBhbmQgcmVsZWFzZSBkbGxzIGZvciBRdDVXaWRnZXRzLCBRdDVDb3JlLCBhbmQgUXQ1R3VpCisgIHNldCAoQ09QWV9ERVNUICR7Q01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfS8ke0NNQUtFX0NGR19JTlRESVJ9KQorCisgIGdldF9wcm9wZXJ0eShxdDVfcW1ha2VfZXhlY3V0YWJsZSBUQVJHRVQgJHtRdDVDb3JlX1FNQUtFX0VYRUNVVEFCTEV9IFBST1BFUlRZIElNUE9SVF9MT0NBVElPTikKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtxdDVfcW1ha2VfZXhlY3V0YWJsZX0gLXF1ZXJ5IFFUX0lOU1RBTExfUExVR0lOUyBPVVRQVVRfVkFSSUFCTEUgUVRfSU5TVEFMTF9QTFVHSU5TIE9VVFBVVF9TVFJJUF9UUkFJTElOR19XSElURVNQQUNFKQorICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke3F0NV9xbWFrZV9leGVjdXRhYmxlfSAtcXVlcnkgUVRfSU5TVEFMTF9CSU5TIE9VVFBVVF9WQVJJQUJMRSBRVF9JTlNUQUxMX0JJTlMgT1VUUFVUX1NUUklQX1RSQUlMSU5HX1dISVRFU1BBQ0UpCisKKyAgIyBUaGVyZSBhcmUgYWxzbyBzZXZlcmFsIG90aGVyIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBjb3BpZWQgb3IgY3JlYXRlZAorICBGSUxFKFdSSVRFICR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vcXQuY29uZiAiW1BhdGhzXVxuUGx1Z2lucz0uIikKKyAgaWYoRVhJU1RTICIke1FUX0lOU1RBTExfQklOU30vaWN1ZHQ1NC5kbGwiKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KGNvcHlfZGVwc19xdDUgQUxMCisgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAiJHtDT1BZX0RFU1R9L3BsYXRmb3JtcyIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vcXQuY29uZiIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9RdDVXaWRnZXRzLmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9RdDVXaWRnZXRzZC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1Q29yZS5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1Q29yZWQuZGxsIiAiJHtDT1BZX0RFU1R9IgorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAiJHtRVF9JTlNUQUxMX0JJTlN9L1F0NUd1aS5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1R3VpZC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1U3ZnZC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1U3ZnLmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9saWJHTEVTdjJkLmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9saWJHTEVTdjIuZGxsIiAiJHtDT1BZX0RFU1R9IgorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAiJHtRVF9JTlNUQUxMX0JJTlN9L2xpYkVHTGQuZGxsIiAiJHtDT1BZX0RFU1R9IgorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAiJHtRVF9JTlNUQUxMX0JJTlN9L2xpYkVHTC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfUExVR0lOU30vcGxhdGZvcm1zL3F3aW5kb3dzLmRsbCIgIiR7Q09QWV9ERVNUfS9wbGF0Zm9ybXMiCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfUExVR0lOU30vcGxhdGZvcm1zL3F3aW5kb3dzZC5kbGwiICAiJHtDT1BZX0RFU1R9L3BsYXRmb3JtcyIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9pY3VkdDU0LmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9pY3VpbjU0LmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9pY3V1YzU0LmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NRU5UICJDb3B5aW5nIHZrdHJhY2V2aWV3ZXIgUXQ1IGRlcGVuZGVuY2llcyB0byAke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0pCisgIGVsc2UoKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KGNvcHlfZGVwc19xdDUgQUxMCisgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAiJHtDT1BZX0RFU1R9L3BsYXRmb3JtcyIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vcXQuY29uZiIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9RdDVXaWRnZXRzLmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9RdDVXaWRnZXRzZC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1Q29yZS5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1Q29yZWQuZGxsIiAiJHtDT1BZX0RFU1R9IgorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAiJHtRVF9JTlNUQUxMX0JJTlN9L1F0NUd1aS5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1R3VpZC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1U3ZnZC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfQklOU30vUXQ1U3ZnLmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9saWJHTEVTdjJkLmRsbCIgIiR7Q09QWV9ERVNUfSIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgIiR7UVRfSU5TVEFMTF9CSU5TfS9saWJHTEVTdjIuZGxsIiAiJHtDT1BZX0RFU1R9IgorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAiJHtRVF9JTlNUQUxMX0JJTlN9L2xpYkVHTGQuZGxsIiAiJHtDT1BZX0RFU1R9IgorICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAiJHtRVF9JTlNUQUxMX0JJTlN9L2xpYkVHTC5kbGwiICIke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfUExVR0lOU30vcGxhdGZvcm1zL3F3aW5kb3dzLmRsbCIgIiR7Q09QWV9ERVNUfS9wbGF0Zm9ybXMiCisgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICIke1FUX0lOU1RBTExfUExVR0lOU30vcGxhdGZvcm1zL3F3aW5kb3dzZC5kbGwiICAiJHtDT1BZX0RFU1R9L3BsYXRmb3JtcyIKKyAgICAgICAgICAgICAgICAgICAgICBDT01NRU5UICJDb3B5aW5nIHZrdHJhY2V2aWV3ZXIgUXQ1IGRlcGVuZGVuY2llcyB0byAke0NPUFlfREVTVH0iCisgICAgICAgICAgICAgICAgICAgICAgVkVSQkFUSU0pCisgIGVuZGlmKCkKKworZW5kaWYoKQorCitidWlsZF9vcHRpb25zX2ZpbmFsaXplKCkKK2VuZGlmKE5PVCBRdDVfRk9VTkQpCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci9tYWluLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NTYxNjMKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci9tYWluLmNwcApAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPFFBcHBsaWNhdGlvbj4KKworI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXIuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3NldHRpbmdzLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgLy8gSW5pdGlhbGl6ZSBRQXBwbGljYXRpb24gYmVmb3JlIGluaXRpYWxpemluZyBzZXR0aW5ncworICAgIFFBcHBsaWNhdGlvbiBhKGFyZ2MsIGFyZ3YpOworCisgICAgLy8gaW5pdGlhbGl6ZSBzZXR0aW5ncworICAgIGlmICh2a3RyYWNldmlld2VyX2luaXRpYWxpemVfc2V0dGluZ3MoYXJnYywgYXJndikgPT0gZmFsc2UpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdmt0cmFjZXZpZXdlciB3OworICAgIHcuc2hvdygpOworCisgICAgaWYgKGdfc2V0dGluZ3MudHJhY2VfZmlsZV90b19vcGVuICE9IE5VTEwgJiYgc3RybGVuKGdfc2V0dGluZ3MudHJhY2VfZmlsZV90b19vcGVuKSA+IDApCisgICAgeworICAgICAgICB3Lm9wZW5fdHJhY2VfZmlsZV90aHJlYWRlZChRU3RyaW5nKGdfc2V0dGluZ3MudHJhY2VfZmlsZV90b19vcGVuKSk7CisgICAgfQorCisgICAgaW50IHJlc3VsdCA9IGEuZXhlYygpOworCisgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfRGVsZXRlX0xvYWRlZCgmZ19wQWxsU2V0dGluZ3MsICZnX251bUFsbFNldHRpbmdzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci9xdC5jb25mIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvcXQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc0ZjNhCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvcXQuY29uZgpAQCAtMCwwICsxLDIgQEAKK1tQYXRoc10NCitQbHVnaW5zPS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjMxOTgKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyLmNwcApAQCAtMCwwICsxLDEyOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8UURlYnVnPgorI2luY2x1ZGUgPFFGaWxlRGlhbG9nPgorI2luY2x1ZGUgPFFNb3ZlRXZlbnQ+CisjaW5jbHVkZSA8UVBhbGV0dGU+CisjaW5jbHVkZSA8UVByb2Nlc3M+CisjaW5jbHVkZSA8UVRvb2xCdXR0b24+CisjaW5jbHVkZSA8UVN0YW5kYXJkUGF0aHM+CisjaW5jbHVkZSA8UU1lc3NhZ2VCb3g+CisjaW5jbHVkZSA8UUNvcmVBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRR3JhcGhpY3NCbHVyRWZmZWN0PgorI2luY2x1ZGUgPFFBYnN0cmFjdFByb3h5TW9kZWw+CisjaW5jbHVkZSA8cXdpbmRvdy5oPgorCisjaW5jbHVkZSAidWlfdmt0cmFjZXZpZXdlci5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXIuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3NldHRpbmdzLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9vdXRwdXQuaCIKKworI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9xZ2VuZXJhdGV0cmFjZWRpYWxvZy5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfcXRyYWNlZmlsZWxvYWRlci5oIgorCisjaW5jbHVkZSAidmtyZXBsYXlfbWFpbi5oIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWxzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBRU3RyaW5nIGdfUFJPSkVDVF9OQU1FID0gIlZrVHJhY2UgVmlld2VyIjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBsb2dnaW5nQ2FsbGJhY2soVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBwTWVzc2FnZSkKK3sKKyAgICBzd2l0Y2gobGV2ZWwpCisgICAgeworICAgIGNhc2UgVktUUkFDRV9MT0dfRVJST1I6CisgICAgICAgIGdzX09VVFBVVC5lcnJvcigtMSwgUVN0cmluZyhwTWVzc2FnZSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLVFJBQ0VfTE9HX1dBUk5JTkc6CisgICAgICAgIGdzX09VVFBVVC53YXJuaW5nKC0xLCBRU3RyaW5nKHBNZXNzYWdlKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktUUkFDRV9MT0dfREVCVUc6CisgICAgY2FzZSBWS1RSQUNFX0xPR19WRVJCT1NFOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGdzX09VVFBVVC5tZXNzYWdlKC0xLCBRU3RyaW5nKHBNZXNzYWdlKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIGRlZmluZWQoV0lOMzIpCisjaWYgX0RFQlVHCisgICAgT3V0cHV0RGVidWdTdHJpbmcocE1lc3NhZ2UpOworI2VuZGlmCisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2a3RyYWNldmlld2VyOjp2a3RyYWNldmlld2VyKFFXaWRnZXQgKnBhcmVudCkKKyAgICA6IFFNYWluV2luZG93KHBhcmVudCksCisgICAgICB1aShuZXcgVWk6OnZrdHJhY2V2aWV3ZXIpLAorICAgICAgbV9zZXR0aW5nc0RpYWxvZyh0aGlzKSwKKyAgICAgIG1fcFRyYWNlRmlsZU1vZGVsKE5VTEwpLAorICAgICAgbV9wUHJveHlNb2RlbChOVUxMKSwKKyAgICAgIG1fcENvbnRyb2xsZXIoTlVMTCksCisgICAgICBtX3BHZW5lcmF0ZVRyYWNlQnV0dG9uKE5VTEwpLAorICAgICAgbV9wVGltZWxpbmUoTlVMTCksCisgICAgICBtX3BHZW5lcmF0ZVRyYWNlRGlhbG9nKE5VTEwpLAorICAgICAgbV9iRGVsYXlVcGRhdGVVSUZvckNvbnRleHQoZmFsc2UpLAorICAgICAgbV9iR2VuZXJhdGluZ1RyYWNlKGZhbHNlKQoreworICAgIHVpLT5zZXR1cFVpKHRoaXMpOworICAgIHFSZWdpc3Rlck1ldGFUeXBlPHVpbnQ2NF90PigidWludDY0X3QiKTsKKyAgICBxUmVnaXN0ZXJNZXRhVHlwZTxWa3RyYWNlTG9nTGV2ZWw+KCJWa3RyYWNlTG9nTGV2ZWwiKTsKKworICAgIG1fcFRyYWNlU3RhdHNUYWIgPSBuZXcgUVdpZGdldCgpOworICAgIG1fcFRyYWNlU3RhdHNUYWItPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcFRyYWNlU3RhdHNUYWIiKSk7CisgICAgbV9wVHJhY2VTdGF0c1RhYkxheW91dCA9IG5ldyBRR3JpZExheW91dChtX3BUcmFjZVN0YXRzVGFiKTsKKyAgICBtX3BUcmFjZVN0YXRzVGFiTGF5b3V0LT5zZXRTcGFjaW5nKDYpOworICAgIG1fcFRyYWNlU3RhdHNUYWJMYXlvdXQtPnNldENvbnRlbnRzTWFyZ2lucygxMSwxMSwxMSwxMSk7CisgICAgbV9wVHJhY2VTdGF0c1RhYkxheW91dC0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgibV9wVHJhY2VTdGF0c1RhYkxheW91dCIpKTsKKyAgICBtX3BUcmFjZVN0YXRzVGFiVGV4dCA9IG5ldyBRVGV4dEJyb3dzZXIobV9wVHJhY2VTdGF0c1RhYik7CisgICAgbV9wVHJhY2VTdGF0c1RhYlRleHQtPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcFRyYWNlU3RhdHNUYWJUZXh0IikpOworICAgIG1fcFRyYWNlU3RhdHNUYWJUZXh0LT5zZXRMaW5lV3JhcE1vZGUoUVRleHRFZGl0OjpOb1dyYXApOworICAgIG1fcFRyYWNlU3RhdHNUYWJMYXlvdXQtPmFkZFdpZGdldChtX3BUcmFjZVN0YXRzVGFiVGV4dCwgMCwgMCwgMSwgMSk7CisKKyAgICBRRm9udCBmb250KCJtb25vc3BhY2UiLCAxMCk7CisgICAgbV9wVHJhY2VTdGF0c1RhYlRleHQtPnNldEZvbnQoZm9udCk7CisgICAgdWktPm91dHB1dFRleHRCcm93c2VyLT5zZXRGb250KGZvbnQpOworCisgICAgLy8gSGlkZSB1bnVzZWQsIGRlZmF1bHQgdGFiCisgICAgdWktPnN0YXRlVGFiV2lkZ2V0LT5yZW1vdmVUYWIoMCk7CisKKyAgICBtZW1zZXQoJm1fdHJhY2VGaWxlSW5mbywgMCwgc2l6ZW9mKHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvKSk7CisKKyAgICBtX3NldHRpbmdzRGlhbG9nLnJlc2l6ZShnX3NldHRpbmdzLnNldHRpbmdzX2RpYWxvZ193aWR0aCwgZ19zZXR0aW5ncy5zZXR0aW5nc19kaWFsb2dfaGVpZ2h0KTsKKyAgICBjb25uZWN0KCZtX3NldHRpbmdzRGlhbG9nLCBTSUdOQUwoU2F2ZVNldHRpbmdzKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiwgdW5zaWduZWQgaW50KSksIHRoaXMsIFNMT1Qob25fc2V0dGluZ3NTYXZlZCh2a3RyYWNlX1NldHRpbmdHcm91cCosIHVuc2lnbmVkIGludCkpKTsKKyAgICBjb25uZWN0KCZtX3NldHRpbmdzRGlhbG9nLCBTSUdOQUwoUmVzaXplZCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkpLCB0aGlzLCBTTE9UKG9uX3NldHRpbmdzRGlhbG9nUmVzaXplZCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkpKTsKKworICAgIHRoaXMtPm1vdmUoZ19zZXR0aW5ncy53aW5kb3dfcG9zaXRpb25fbGVmdCwgZ19zZXR0aW5ncy53aW5kb3dfcG9zaXRpb25fdG9wKTsKKyAgICB0aGlzLT5yZXNpemUoZ19zZXR0aW5ncy53aW5kb3dfc2l6ZV93aWR0aCwgZ19zZXR0aW5ncy53aW5kb3dfc2l6ZV9oZWlnaHQpOworCisgICAgY29ubmVjdCh1aS0+b3V0cHV0VGV4dEJyb3dzZXIsIFNJR05BTChhbmNob3JDbGlja2VkKGNvbnN0IFFVcmwmKSksIHRoaXMsIFNMT1Qob25faHlwZXJsaW5rQ2xpY2tlZChjb25zdCBRVXJsJikpKTsKKworICAgIC8vIHNldHVwIE91dHB1dCBXaW5kb3cKKyAgICB2a3RyYWNldmlld2VyX291dHB1dF9pbml0KHVpLT5vdXRwdXRUZXh0QnJvd3Nlcik7CisgICAgdmt0cmFjZV9Mb2dTZXRDYWxsYmFjayhsb2dnaW5nQ2FsbGJhY2spOworICAgIHZrdHJhY2VfTG9nU2V0TGV2ZWwoVktUUkFDRV9MT0dfRVJST1IpOworICAgIHZrdHJhY2VfTG9nQWx3YXlzKCJXZWxjb21lIHRvIFZrVHJhY2VWaWV3ZXIhIik7CisKKyAgICAvLyBjYWNoZSB0aGUgb3JpZ2luYWwgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgc2VhcmNoIHRleHQgYm94CisgICAgbV9zZWFyY2hUZXh0Ym94QmFja2dyb3VuZENvbG9yID0gdWktPnNlYXJjaFRleHRCb3gtPnBhbGV0dGUoKS5iYXNlKCkuY29sb3IoKTsKKyAgICAKKyAgICAvLyBhZGQgYnV0dG9ucyB0byB0b29sYmFyCisgICAgbV9wR2VuZXJhdGVUcmFjZUJ1dHRvbiA9IG5ldyBRVG9vbEJ1dHRvbih1aS0+bWFpblRvb2xCYXIpOworICAgIG1fcEdlbmVyYXRlVHJhY2VCdXR0b24tPnNldFRleHQoIkdlbmVyYXRlIFRyYWNlLi4uIik7CisgICAgbV9wR2VuZXJhdGVUcmFjZUJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICBjb25uZWN0KG1fcEdlbmVyYXRlVHJhY2VCdXR0b24sIFNJR05BTChjbGlja2VkKCkpLCB0aGlzLCBTTE9UKHByb21wdF9nZW5lcmF0ZV90cmFjZSgpKSk7CisKKyAgICB1aS0+bWFpblRvb2xCYXItPmFkZFdpZGdldChtX3BHZW5lcmF0ZVRyYWNlQnV0dG9uKTsKKworICAgIHVpLT50cmVlVmlldy0+c2V0TW9kZWwoTlVMTCk7CisgICAgdWktPnRyZWVWaWV3LT5zZXRDb250ZXh0TWVudVBvbGljeShRdDo6QWN0aW9uc0NvbnRleHRNZW51KTsKKyAgICB1aS0+dHJlZVZpZXctPnNldFVuaWZvcm1Sb3dIZWlnaHRzKHRydWUpOworCisgICAgLy8gc2V0dXAgdGltZWxpbmUKKyAgICBtX3BUaW1lbGluZSA9IG5ldyB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXcoKTsKKyAgICBpZiAobV9wVGltZWxpbmUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1fcFRpbWVsaW5lLT5zZXRNaW5pbXVtSGVpZ2h0KDEwMCk7CisgICAgICAgIGNvbm5lY3QobV9wVGltZWxpbmUsIFNJR05BTChjbGlja2VkKGNvbnN0IFFNb2RlbEluZGV4ICYpKSwgdGhpcywgU0xPVChzbG90X3RpbWVsaW5lX2NsaWNrZWQoY29uc3QgUU1vZGVsSW5kZXggJikpKTsKKyAgICAgICAgdWktPnRpbWVsaW5lTGF5b3V0LT5hZGRXaWRnZXQobV9wVGltZWxpbmUpOworICAgICAgICB1aS0+dGltZWxpbmVMYXlvdXQtPnJlbW92ZVdpZGdldCh1aS0+dGltZWxpbmVWaWV3UGxhY2Vob2xkZXIpOworICAgICAgICBkZWxldGUgdWktPnRpbWVsaW5lVmlld1BsYWNlaG9sZGVyOworICAgICAgICB1aS0+dGltZWxpbmVWaWV3UGxhY2Vob2xkZXIgPSBOVUxMOworICAgIH0KKworICAgIG1fcEdlbmVyYXRlVHJhY2VEaWFsb2cgPSBuZXcgdmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyh0aGlzKTsKKyAgICBjb25uZWN0KG1fcEdlbmVyYXRlVHJhY2VEaWFsb2csIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgY29uc3QgUVN0cmluZyYpKSwgdGhpcywgU0xPVChPbk91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsLCBjb25zdCBRU3RyaW5nJikpKTsKKworICAgIHJlc2V0X3RyYWNlZmlsZV91aSgpOworCisgICAgLy8gZm9yIG5vdywgcmVtb3ZlIHRoZXNlIHdpZGdldHMgc2luY2UgdGhleSBhcmUgbm90IHVzZWQKKyAgICB1aS0+Ym90dG9tVGFiV2lkZ2V0LT5yZW1vdmVUYWIodWktPmJvdHRvbVRhYldpZGdldC0+aW5kZXhPZih1aS0+bWFjaGluZUluZm9UYWIpKTsKKyAgICB1aS0+Ym90dG9tVGFiV2lkZ2V0LT5yZW1vdmVUYWIodWktPmJvdHRvbVRhYldpZGdldC0+aW5kZXhPZih1aS0+Y2FsbFN0YWNrVGFiKSk7Cit9CisKK3ZrdHJhY2V2aWV3ZXI6On52a3RyYWNldmlld2VyKCkKK3sKKyAgICBjbG9zZV90cmFjZV9maWxlKCk7CisKKyAgICBpZiAobV9wVGltZWxpbmUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRlbGV0ZSBtX3BUaW1lbGluZTsKKyAgICAgICAgbV9wVGltZWxpbmUgPSBOVUxMOworICAgIH0KKworICAgIHJlc2V0X3ZpZXcoKTsKKworICAgIGRlbGV0ZSB1aTsKKyAgICB2a3RyYWNldmlld2VyX291dHB1dF9kZWluaXQoKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjptb3ZlRXZlbnQoUU1vdmVFdmVudCAqcEV2ZW50KQoreworICAgIGdfc2V0dGluZ3Mud2luZG93X3Bvc2l0aW9uX2xlZnQgPSBwRXZlbnQtPnBvcygpLngoKTsKKyAgICBnX3NldHRpbmdzLndpbmRvd19wb3NpdGlvbl90b3AgPSBwRXZlbnQtPnBvcygpLnkoKTsKKworICAgIHZrdHJhY2V2aWV3ZXJfc2V0dGluZ3NfdXBkYXRlZCgpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6OmNsb3NlRXZlbnQgKFFDbG9zZUV2ZW50ICpwRXZlbnQpCit7CisgICAgdmt0cmFjZXZpZXdlcl9zYXZlX3NldHRpbmdzKCk7CisgICAgY2xvc2VfdHJhY2VfZmlsZSgpOworICAgIHBFdmVudC0+YWNjZXB0KCk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcjo6cmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICpwRXZlbnQpCit7CisgICAgZ19zZXR0aW5ncy53aW5kb3dfc2l6ZV93aWR0aCA9IHBFdmVudC0+c2l6ZSgpLndpZHRoKCk7CisgICAgZ19zZXR0aW5ncy53aW5kb3dfc2l6ZV9oZWlnaHQgPSBwRXZlbnQtPnNpemUoKS5oZWlnaHQoKTsKKworICAgIHZrdHJhY2V2aWV3ZXJfc2V0dGluZ3NfdXBkYXRlZCgpOworfQorCitpbnQgdmt0cmFjZXZpZXdlcjo6YWRkX2N1c3RvbV9zdGF0ZV92aWV3ZXIoUVdpZGdldCogcFdpZGdldCwgY29uc3QgUVN0cmluZyYgdGl0bGUsIGJvb2wgYkJyaW5nVG9Gcm9udCkKK3sKKyAgICBpbnQgdGFiSW5kZXggPSB1aS0+c3RhdGVUYWJXaWRnZXQtPmFkZFRhYihwV2lkZ2V0LCB0aXRsZSk7CisKKyAgICBpZiAoYkJyaW5nVG9Gcm9udCkKKyAgICB7CisgICAgICAgIHVpLT5zdGF0ZVRhYldpZGdldC0+c2V0Q3VycmVudFdpZGdldChwV2lkZ2V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGFiSW5kZXg7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcjo6cmVtb3ZlX2N1c3RvbV9zdGF0ZV92aWV3ZXIoaW50IGNvbnN0IHRhYkluZGV4KQoreworICAgIHVpLT5zdGF0ZVRhYldpZGdldC0+cmVtb3ZlVGFiKHRhYkluZGV4KTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjplbmFibGVfY3VzdG9tX3N0YXRlX3ZpZXdlcihRV2lkZ2V0KiBwV2lkZ2V0LCBib29sIGJFbmFibGVkKQoreworICAgIHVpLT5zdGF0ZVRhYldpZGdldC0+c2V0VGFiRW5hYmxlZCh1aS0+c3RhdGVUYWJXaWRnZXQtPmluZGV4T2YocFdpZGdldCksIGJFbmFibGVkKTsKK30KKworUVRvb2xCdXR0b24qIHZrdHJhY2V2aWV3ZXI6OmFkZF90b29sYmFyX2J1dHRvbihjb25zdCBRU3RyaW5nJiB0aXRsZSwgYm9vbCBiRW5hYmxlZCkKK3sKKyAgICBRVG9vbEJ1dHRvbiogcEJ1dHRvbiA9IG5ldyBRVG9vbEJ1dHRvbih1aS0+bWFpblRvb2xCYXIpOworICAgIHBCdXR0b24tPnNldFRleHQodGl0bGUpOworICAgIHBCdXR0b24tPnNldEVuYWJsZWQoYkVuYWJsZWQpOworICAgIHVpLT5tYWluVG9vbEJhci0+YWRkV2lkZ2V0KHBCdXR0b24pOworICAgIHJldHVybiBwQnV0dG9uOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6OnNldF9jYWxsdHJlZV9tb2RlbCh2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbCogcFRyYWNlRmlsZU1vZGVsLCBRQWJzdHJhY3RQcm94eU1vZGVsKiBwTW9kZWwpCit7CisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsID09IHBUcmFjZUZpbGVNb2RlbCAmJiBwTW9kZWwgPT0gbV9wUHJveHlNb2RlbCkKKyAgICB7CisgICAgICAgIC8vIFNldHRpbmcgbW9kZWwgYW5kIHByb3h5IHRvIHRoZSBzYW1lIHRoaW5nIHRoZXkgYXJlIGFscmVhZHkgc2V0IHRvLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8hCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3BUcmFjZUZpbGVNb2RlbCA9IHBUcmFjZUZpbGVNb2RlbDsKKyAgICBtX3BQcm94eU1vZGVsID0gcE1vZGVsOworCisgICAgaWYgKG1fcFRpbWVsaW5lICE9IE5VTEwpCisgICAgeworICAgICAgICBtX3BUaW1lbGluZS0+c2V0TW9kZWwocFRyYWNlRmlsZU1vZGVsKTsKKyAgICB9CisKKyAgICBpZiAocE1vZGVsID09IE5VTEwpCisgICAgeworICAgICAgICB1aS0+dHJlZVZpZXctPnNldE1vZGVsKHBUcmFjZUZpbGVNb2RlbCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpLT50cmVlVmlldy0+c2V0TW9kZWwocE1vZGVsKTsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsbHkgc2hvdyBhbGwgY29sdW1ucyBiZWZvcmUgaGlkaW5nIG90aGVycworICAgIGludCBjb2x1bW5zID0gdWktPnRyZWVWaWV3LT5oZWFkZXIoKS0+Y291bnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnM7IGkrKykKKyAgICB7CisgICAgICAgIHVpLT50cmVlVmlldy0+c2hvd0NvbHVtbihpKTsKKyAgICB9CisKKyAgICAvLyBoaWRlIGNvbHVtbnMgdGhhdCBhcmUgbm90IHZlcnkgaW1wb3J0YW50IHJpZ2h0IG5vdworICAgIHVpLT50cmVlVmlldy0+aGlkZUNvbHVtbih2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX1RyYWNlcklkKTsKKyAgICB1aS0+dHJlZVZpZXctPmhpZGVDb2x1bW4odmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9CZWdpblRpbWUpOworICAgIHVpLT50cmVlVmlldy0+aGlkZUNvbHVtbih2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0VuZFRpbWUpOworICAgIHVpLT50cmVlVmlldy0+aGlkZUNvbHVtbih2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX1BhY2tldFNpemUpOworCisgICAgaW50IHdpZHRoID0gdWktPnRyZWVWaWV3LT5nZW9tZXRyeSgpLndpZHRoKCk7CisgICAgaW50IGZpcnN0RXF1YWxXaWR0aENvbHVtbkluZGV4ID0gMDsKKyAgICBmbG9hdCBmU2hhcmVkRXF1YWxXaWR0aFBjdCA9IDEuMDsKKworICAgIGlmIChwTW9kZWwgIT0gTlVMTCAmJiBwTW9kZWwtPmluaGVyaXRzKCJ2a3RyYWNldmlld2VyX1FHcm91cFRocmVhZHNQcm94eU1vZGVsIikpCisgICAgeworICAgICAgICB1aS0+dHJlZVZpZXctPmhpZGVDb2x1bW4odmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisgICAgICAgIHVpLT50cmVlVmlldy0+aGlkZUNvbHVtbih2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX1RocmVhZElkKTsKKworICAgICAgICB1aS0+dHJlZVZpZXctPnNldENvbHVtbldpZHRoKHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fUGFja2V0SW5kZXgsIHdpZHRoICogMC4wNSk7CisgICAgICAgIHVpLT50cmVlVmlldy0+c2V0Q29sdW1uV2lkdGgodmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9DcHVEdXJhdGlvbiwgd2lkdGggKiAwLjA4KTsKKyAgICAgICAgZmlyc3RFcXVhbFdpZHRoQ29sdW1uSW5kZXggPSBtX3BUcmFjZUZpbGVNb2RlbC0+Y29sdW1uQ291bnQoKTsKKyAgICAgICAgZlNoYXJlZEVxdWFsV2lkdGhQY3QgPSAxLjBmIC0gMC4wNWYgLSAwLjA4ZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gZW50cnlwb2ludCBuYW1lcyBnZXQgdGhlIG1vc3Qgc3BhY2UKKyAgICAgICAgdWktPnRyZWVWaWV3LT5zZXRDb2x1bW5XaWR0aCh2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0VudHJ5cG9pbnROYW1lLCB3aWR0aCAqIDAuNTUpOworICAgICAgICBmaXJzdEVxdWFsV2lkdGhDb2x1bW5JbmRleCA9IDE7CisgICAgICAgIGZTaGFyZWRFcXVhbFdpZHRoUGN0ID0gMS4wZiAtIDAuNTVmOworICAgIH0KKworICAgIC8vIHRoZSByZW1haW5pbmcgc3BhY2UgaXMgZGl2aWRlZCBhbW9uZyB2aXNpYmxlIGNvbHVtbnMKKyAgICBpbnQgdmlzaWJsZUNvbHVtbnMgPSAwOworICAgIGZvciAoaW50IGkgPSBmaXJzdEVxdWFsV2lkdGhDb2x1bW5JbmRleDsgaSA8IGNvbHVtbnM7IGkrKykKKyAgICB7CisgICAgICAgIGlmICghdWktPnRyZWVWaWV3LT5pc0NvbHVtbkhpZGRlbihpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmlzaWJsZUNvbHVtbnMrKzsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgaW50IHNjb2xsYmFyV2lkdGggPSBxQXBwLT5zdHlsZSgpLT5waXhlbE1ldHJpYyhRU3R5bGU6OlBNX1Njcm9sbEJhckV4dGVudCk7CisgICAgaW50IGNvbHVtbldpZHRocyA9ICh3aWR0aC1zY29sbGJhcldpZHRoKSAqIChmU2hhcmVkRXF1YWxXaWR0aFBjdCAvIHZpc2libGVDb2x1bW5zKTsKKworICAgIGZvciAoaW50IGkgPSBmaXJzdEVxdWFsV2lkdGhDb2x1bW5JbmRleDsgaSA8IGNvbHVtbnM7IGkrKykKKyAgICB7CisgICAgICAgIGlmICghdWktPnRyZWVWaWV3LT5pc0NvbHVtbkhpZGRlbihpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdWktPnRyZWVWaWV3LT5zZXRDb2x1bW5XaWR0aChpLCBjb2x1bW5XaWR0aHMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6OmFkZF9jYWxsdHJlZV9jb250ZXh0bWVudV9pdGVtKFFBY3Rpb24qIHBBY3Rpb24pCit7CisgICAgdWktPnRyZWVWaWV3LT5hZGRBY3Rpb24ocEFjdGlvbik7Cit9CisKK2ludCBpbmRleE9mQ29sdW1uKFFBYnN0cmFjdEl0ZW1Nb2RlbCogcE1vZGVsLCBjb25zdCBRU3RyaW5nICZ0ZXh0KQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcE1vZGVsLT5jb2x1bW5Db3VudCgpOyBpKyspCisgICAgeworICAgICAgICBpZiAocE1vZGVsLT5oZWFkZXJEYXRhKGksIFF0OjpIb3Jpem9udGFsLCBRdDo6RGlzcGxheVJvbGUpLnRvU3RyaW5nKCkgPT0gdGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6OnNlbGVjdF9jYWxsX2F0X3BhY2tldF9pbmRleCh1bnNpZ25lZCBsb25nIGxvbmcgcGFja2V0SW5kZXgpCit7CisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsICE9IE5VTEwpCisgICAgeworICAgICAgICBRQXBwbGljYXRpb246OnNldE92ZXJyaWRlQ3Vyc29yKFF0OjpXYWl0Q3Vyc29yKTsKKworICAgICAgICBRTW9kZWxJbmRleCBzdGFydCA9IG1fcFRyYWNlRmlsZU1vZGVsLT5pbmRleCgwLCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX1BhY2tldEluZGV4KTsKKworICAgICAgICBRTW9kZWxJbmRleExpc3QgbWF0Y2hlcyA9IG1fcFRyYWNlRmlsZU1vZGVsLT5tYXRjaChzdGFydCwgUXQ6OkRpc3BsYXlSb2xlLCBRVmFyaWFudChwYWNrZXRJbmRleCksIDEsIFF0OjpNYXRjaEZpeGVkU3RyaW5nIHwgUXQ6Ok1hdGNoUmVjdXJzaXZlIHwgUXQ6Ok1hdGNoV3JhcCk7CisgICAgICAgIGlmIChtYXRjaGVzLmNvdW50KCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmb3Igc29tZSByZWFzb24sIHdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGluZGV4IHN1Y2ggdGhhdCB0aGUgaW5kZXggYW5kIHBhcmVudCBib3RoIGFyZSBmb3IgY29sdW1uIDAKKyAgICAgICAgICAgIFFNb2RlbEluZGV4IHVwZGF0ZWRNYXRjaCA9IG1fcFRyYWNlRmlsZU1vZGVsLT5pbmRleChtYXRjaGVzWzBdLnJvdygpLCAwLCBtX3BUcmFjZUZpbGVNb2RlbC0+aW5kZXgobWF0Y2hlc1swXS5wYXJlbnQoKS5yb3coKSwgMCkpOworCisgICAgICAgICAgICBzZWxlY3RBcGljYWxsTW9kZWxJbmRleCh1cGRhdGVkTWF0Y2gsIHRydWUsIHRydWUpOworICAgICAgICAgICAgdWktPnRyZWVWaWV3LT5zZXRGb2N1cygpOworCisgICAgICAgICAgICBpZiAobV9wVGltZWxpbmUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3BUaW1lbGluZS0+c2V0Q3VycmVudEluZGV4KG1fcFRyYWNlRmlsZU1vZGVsLT5pbmRleChtYXRjaGVzWzBdLnJvdygpLCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0VudHJ5cG9pbnROYW1lLCBRTW9kZWxJbmRleCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBRQXBwbGljYXRpb246OnJlc3RvcmVPdmVycmlkZUN1cnNvcigpOworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpoaWdobGlnaHRfdGltZWxpbmVfaXRlbSh1bnNpZ25lZCBsb25nIGxvbmcgcGFja2V0QXJyYXlJbmRleCwgYm9vbCBiU2Nyb2xsVG8sIGJvb2wgYlNlbGVjdCkKK3sKKyAgICBpZiAobV9wVHJhY2VGaWxlTW9kZWwgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFFNb2RlbEluZGV4IGxvY2F0aW9uID0gbV9wVHJhY2VGaWxlTW9kZWwtPmluZGV4KHBhY2tldEFycmF5SW5kZXgsIDApOworCisgICAgICAgIGlmIChtX3BUaW1lbGluZSAhPSBOVUxMICYmIG1fcFRpbWVsaW5lLT5jdXJyZW50SW5kZXgoKSAhPSBsb2NhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2Nyb2xsIHRvIHRoZSBpbmRleAorICAgICAgICAgICAgaWYgKGJTY3JvbGxUbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3BUaW1lbGluZS0+c2Nyb2xsVG8obG9jYXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIGluZGV4CisgICAgICAgICAgICBpZiAoYlNlbGVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3BUaW1lbGluZS0+c2V0Q3VycmVudEluZGV4KGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX3JlcGxheV9zdGF0ZV9jaGFuZ2VkKGJvb2wgYlJlcGxheUluUHJvZ3Jlc3MpCit7CisgICAgYm9vbCBiRW5hYmxlVWkgPSAhYlJlcGxheUluUHJvZ3Jlc3M7CisgICAgdWktPnRyZWVWaWV3LT5zZXRFbmFibGVkKGJFbmFibGVVaSk7CisgICAgdGhpcy0+bV9wR2VuZXJhdGVUcmFjZUJ1dHRvbi0+c2V0RW5hYmxlZChiRW5hYmxlVWkpOworICAgIHVpLT5uZXh0RHJhd2NhbGxCdXR0b24tPnNldEVuYWJsZWQoYkVuYWJsZVVpKTsKKyAgICB1aS0+cHJldkRyYXdjYWxsQnV0dG9uLT5zZXRFbmFibGVkKGJFbmFibGVVaSk7CisgICAgdWktPnNlYXJjaE5leHRCdXR0b24tPnNldEVuYWJsZWQoYkVuYWJsZVVpKTsKKyAgICB1aS0+c2VhcmNoUHJldkJ1dHRvbi0+c2V0RW5hYmxlZChiRW5hYmxlVWkpOworICAgIHVpLT5zZWFyY2hUZXh0Qm94LT5zZXRFbmFibGVkKGJFbmFibGVVaSk7CisgICAgaWYgKG1fcFRpbWVsaW5lICE9IE5VTEwpCisgICAgeworICAgICAgICBtX3BUaW1lbGluZS0+c2V0RW5hYmxlZChiRW5hYmxlVWkpOworICAgIH0KK30KKwordW5zaWduZWQgbG9uZyBsb25nIHZrdHJhY2V2aWV3ZXI6OmdldF9jdXJyZW50X3BhY2tldF9pbmRleCgpCit7CisgICAgUU1vZGVsSW5kZXggY3VycmVudEluZGV4ID0gdWktPnRyZWVWaWV3LT5jdXJyZW50SW5kZXgoKTsKKyAgICBRTW9kZWxJbmRleCBjb2wwSW5kZXggPSBjdXJyZW50SW5kZXguc2libGluZyhjdXJyZW50SW5kZXgucm93KCksIDApOworICAgIFFNb2RlbEluZGV4IGluZGV4ID0gbWFwVHJlZUluZGV4VG9Nb2RlbChjb2wwSW5kZXgpOworCisgICAgdW5zaWduZWQgbG9uZyBsb25nIHBhY2tldEluZGV4ID0gMDsKKyAgICBpZiAoaW5kZXguaXNWYWxpZCgpKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciopaW5kZXguaW50ZXJuYWxQb2ludGVyKCk7CisgICAgICAgIGlmIChwSGVhZGVyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChwSGVhZGVyICE9IE5VTEwpOworICAgICAgICAgICAgcGFja2V0SW5kZXggPSBwSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWNrZXRJbmRleDsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpyZXNldF92aWV3KCkKK3sKKyAgICBpbnQgY291bnQgPSB1aS0+c3RhdGVUYWJXaWRnZXQtPmNvdW50KCk7CisgICAgd2hpbGUgKGNvdW50ID4gMCkKKyAgICB7CisgICAgICAgIGRlbGV0ZSB1aS0+c3RhdGVUYWJXaWRnZXQtPndpZGdldCgwKTsKKyAgICAgICAgY291bnQgPSB1aS0+c3RhdGVUYWJXaWRnZXQtPmNvdW50KCk7CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6OkxvZ0Fsd2F5cyhjb25zdCBRU3RyaW5nJiBtZXNzYWdlKQoreworICAgIE9uT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19WRVJCT1NFLCBtZXNzYWdlKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpMb2dXYXJuaW5nKGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpCit7CisgICAgT25PdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX1dBUk5JTkcsIG1lc3NhZ2UpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6OkxvZ0Vycm9yKGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpCit7CisgICAgT25PdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCBtZXNzYWdlKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjphZGRfc2V0dGluZ19ncm91cCh2a3RyYWNlX1NldHRpbmdHcm91cCogcEdyb3VwKQoreworICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX21lcmdlKHBHcm91cCwgJmdfcEFsbFNldHRpbmdzLCAmZ19udW1BbGxTZXR0aW5ncyk7Cit9CisKK3Vuc2lnbmVkIGludCB2a3RyYWNldmlld2VyOjpnZXRfZ2xvYmFsX3NldHRpbmdzKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiogcHBHcm91cHMpCit7CisgICAgaWYgKHBwR3JvdXBzICE9IE5VTEwpCisgICAgeworICAgICAgICAqcHBHcm91cHMgPSBnX3BBbGxTZXR0aW5nczsKKyAgICB9CisKKyAgICByZXR1cm4gZ19udW1BbGxTZXR0aW5nczsKK30KKworYm9vbCB2a3RyYWNldmlld2VyOjpwcm9tcHRfbG9hZF9uZXdfdHJhY2UoY29uc3QgUVN0cmluZyYgdHJhY2VmaWxlKQoreworICAgIGludCByZXQgPSBRTWVzc2FnZUJveDo6d2FybmluZyh0aGlzLCB0cihnX1BST0pFQ1RfTkFNRS50b1N0ZFN0cmluZygpLmNfc3RyKCkpLCB0cigiV291bGQgeW91IGxpa2UgdG8gbG9hZCB0aGUgbmV3IHRyYWNlIGZpbGU/IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU1lc3NhZ2VCb3g6OlllcyB8IFFNZXNzYWdlQm94OjpObywgUU1lc3NhZ2VCb3g6Olllcyk7CisKKyAgICBpZiAocmV0ID09IFFNZXNzYWdlQm94OjpZZXMpCisgICAgeworICAgIC8vICAgIC8vIHNhdmUgY3VycmVudCBzZXNzaW9uIGlmIHRoZXJlIGlzIG9uZQorICAgIC8vICAgIGlmIChtX29wZW5GaWxlbmFtZS5zaXplKCkgPiAwICYmIG1fcFRyYWNlUmVhZGVyICE9IE5VTEwgJiYgbV9wQXBpQ2FsbFRyZWVNb2RlbCAhPSBOVUxMKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgc2F2ZV9zZXNzaW9uX3RvX2Rpc2soZ2V0X3Nlc3Npb25maWxlX3BhdGgobV9vcGVuRmlsZW5hbWUsICptX3BUcmFjZVJlYWRlciksIG1fb3BlbkZpbGVuYW1lLCBtX3BUcmFjZVJlYWRlciwgbV9wQXBpQ2FsbFRyZWVNb2RlbCk7CisgICAgLy8gICAgfQorCisgICAgICAgIC8vIHRyeSB0byBvcGVuIHRoZSBuZXcgZmlsZQorICAgICAgICBvcGVuX3RyYWNlX2ZpbGVfdGhyZWFkZWQodHJhY2VmaWxlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX2FjdGlvbkVfeGl0X3RyaWdnZXJlZCgpCit7CisgICAgY2xvc2UoKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpvbl9hY3Rpb25fT3Blbl90cmlnZ2VyZWQoKQoreworICAgIFFTdHJpbmcgZmlsZU5hbWUgPSBRRmlsZURpYWxvZzo6Z2V0T3BlbkZpbGVOYW1lKHRoaXMsIHRyKCJPcGVuIEZpbGUiKSwgUVN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyKCJ2a3RyYWNlIEJpbmFyeSBGaWxlcyAoKi52a3RyYWNlICouKikiKSk7CisKKyAgICBpZiAoIWZpbGVOYW1lLmlzRW1wdHkoKSkKKyAgICB7CisgICAgICAgIG9wZW5fdHJhY2VfZmlsZV90aHJlYWRlZChmaWxlTmFtZSk7CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgdG90YWxDcHVFeGVjdXRpb25UaW1lOworICAgIHVpbnQ2NF90IHRvdGFsVHJhY2VPdmVyaGVhZDsKKyAgICB1aW50MzJfdCB0b3RhbENhbGxDb3VudDsKK30gdnR2QXBpVXNhZ2VTdGF0czsKKwordm9pZCB2a3RyYWNldmlld2VyOjpHZW5lcmF0ZVRyYWNlRmlsZVN0YXRzKCkKK3sKKyAgICAvLyBwcm9jZXNzIHRyYWNlIGZpbGUgdG8gZXh0cmFjdCBzb21lIEFQSSB1c2FnZSBzdGF0cworICAgIC8vIChOT1RFOiB0aGlzIGNvdWxkIGhhcHBlbiBpbiBhIGJhY2tncm91bmQgdGhyZWFkKQorICAgIHVpLT5ib3R0b21UYWJXaWRnZXQtPmFkZFRhYihtX3BUcmFjZVN0YXRzVGFiLCAiVHJhY2UgU3RhdHMiKTsKKworICAgIFFTdHJpbmcgc3RhdFRleHQ7CisgICAgbV9wVHJhY2VTdGF0c1RhYlRleHQtPnNldFRleHQoc3RhdFRleHQpOworCisgICAgdnR2QXBpVXNhZ2VTdGF0cyB0bXBOZXdTdGF0OworICAgIHRtcE5ld1N0YXQudG90YWxDYWxsQ291bnQgPSAxOworICAgIHRtcE5ld1N0YXQudG90YWxDcHVFeGVjdXRpb25UaW1lID0gMDsKKyAgICB0bXBOZXdTdGF0LnRvdGFsVHJhY2VPdmVyaGVhZCA9IDA7CisKKyAgICB2dHZBcGlVc2FnZVN0YXRzIHRvdGFsU3RhdHM7CisgICAgdG90YWxTdGF0cy50b3RhbENhbGxDb3VudCA9IDA7CisgICAgdG90YWxTdGF0cy50b3RhbENwdUV4ZWN1dGlvblRpbWUgPSAwOworICAgIHRvdGFsU3RhdHMudG90YWxUcmFjZU92ZXJoZWFkID0gMDsKKworICAgIHVpbnQ2NF90IHRvdGFsVHJhY2VUaW1lID0gMDsKKworICAgIGlmIChtX3RyYWNlRmlsZUluZm8ucGFja2V0Q291bnQgPiAwKQorICAgIHsKKyAgICAgICAgdWludDY0X3Qgc3RhcnQgPSBtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHNbMF0ucEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lOworICAgICAgICB1aW50NjRfdCBlbmQgPSBtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHNbbV90cmFjZUZpbGVJbmZvLnBhY2tldENvdW50LTFdLnBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWU7CisgICAgICAgIHRvdGFsVHJhY2VUaW1lID0gZW5kLXN0YXJ0OworICAgIH0KKworICAgIFFNYXA8dWludDE2X3QsIHZ0dkFwaVVzYWdlU3RhdHM+IHN0YXRNYXA7CisgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IG1fdHJhY2VGaWxlSW5mby5wYWNrZXRDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gbV90cmFjZUZpbGVJbmZvLnBQYWNrZXRPZmZzZXRzW2ldLnBIZWFkZXI7CisgICAgICAgIGlmIChwSGVhZGVyLT5wYWNrZXRfaWQgPj0gVktUUkFDRV9UUElfQkVHSU5fQVBJX0hFUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvdGFsU3RhdHMudG90YWxDYWxsQ291bnQrKzsKKyAgICAgICAgICAgIHRvdGFsU3RhdHMudG90YWxDcHVFeGVjdXRpb25UaW1lICs9IChwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lIC0gcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lKTsKKyAgICAgICAgICAgIHRvdGFsU3RhdHMudG90YWxUcmFjZU92ZXJoZWFkICs9ICgocEhlYWRlci0+dmt0cmFjZV9lbmRfdGltZSAtIHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSkgLSAocEhlYWRlci0+ZW50cnlwb2ludF9lbmRfdGltZSAtIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSkpOworICAgICAgICAgICAgaWYgKHN0YXRNYXAuY29udGFpbnMocEhlYWRlci0+cGFja2V0X2lkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0TWFwW3BIZWFkZXItPnBhY2tldF9pZF0udG90YWxDcHVFeGVjdXRpb25UaW1lICs9IChwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lIC0gcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lKTsKKyAgICAgICAgICAgICAgICBzdGF0TWFwW3BIZWFkZXItPnBhY2tldF9pZF0udG90YWxUcmFjZU92ZXJoZWFkICs9ICgocEhlYWRlci0+dmt0cmFjZV9lbmRfdGltZSAtIHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSkgLSAocEhlYWRlci0+ZW50cnlwb2ludF9lbmRfdGltZSAtIHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSkpOworICAgICAgICAgICAgICAgIHN0YXRNYXBbcEhlYWRlci0+cGFja2V0X2lkXS50b3RhbENhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcE5ld1N0YXQudG90YWxDcHVFeGVjdXRpb25UaW1lID0gKHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgLSBwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWUpOworICAgICAgICAgICAgICAgIHRtcE5ld1N0YXQudG90YWxUcmFjZU92ZXJoZWFkID0gKChwSGVhZGVyLT52a3RyYWNlX2VuZF90aW1lIC0gcEhlYWRlci0+dmt0cmFjZV9iZWdpbl90aW1lKSAtIChwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lIC0gcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lKSk7CisgICAgICAgICAgICAgICAgc3RhdE1hcC5pbnNlcnQocEhlYWRlci0+cGFja2V0X2lkLCB0bXBOZXdTdGF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IGFwcFRpbWUgPSB0b3RhbFRyYWNlVGltZSAtIHRvdGFsU3RhdHMudG90YWxDcHVFeGVjdXRpb25UaW1lIC0gdG90YWxTdGF0cy50b3RhbFRyYWNlT3ZlcmhlYWQ7CisgICAgdWludDY0X3QgYXBwRHJpdmVyVGltZSA9IHRvdGFsVHJhY2VUaW1lIC0gdG90YWxTdGF0cy50b3RhbFRyYWNlT3ZlcmhlYWQ7CisKKyAgICBzdGF0VGV4dCArPSAiPHRhYmxlPiI7CisgICAgc3RhdFRleHQgKz0gUVN0cmluZygiPHRyPjx0ZD5Ub3RhbCBUcmFjZSBUaW1lOjwvdGQ+PHRkPiUxIG5zPC90ZD48L3RyPiIpLmFyZyh0b3RhbFRyYWNlVGltZSk7CisgICAgc3RhdFRleHQgKz0gUVN0cmluZygiPHRyPjx0ZD5Ub3RhbCBBcHArRHJpdmVyIFRpbWU6PC90ZD48dGQ+JTEgbnMgKCUyJSk8L3RkPjwvdHI+IikuYXJnKGFwcERyaXZlclRpbWUpLmFyZygxMDAqKGZsb2F0KWFwcERyaXZlclRpbWUvKGZsb2F0KXRvdGFsVHJhY2VUaW1lLCAwLCAnZicsIDEpOworICAgIHN0YXRUZXh0ICs9IFFTdHJpbmcoIjx0cj48dGQ+VG90YWwgRHJpdmVyIFRpbWU6PC90ZD48dGQ+JTEgbnMgKCUyJSk8L3RkPjwvdHI+IikuYXJnKHRvdGFsU3RhdHMudG90YWxDcHVFeGVjdXRpb25UaW1lKS5hcmcoMTAwKihmbG9hdCl0b3RhbFN0YXRzLnRvdGFsQ3B1RXhlY3V0aW9uVGltZS8oZmxvYXQpdG90YWxUcmFjZVRpbWUsIDAsICdmJywgMSk7CisgICAgc3RhdFRleHQgKz0gUVN0cmluZygiPHRyPjx0ZD5Ub3RhbCBBcHAgVGltZTo8L3RkPjx0ZD4lMSBucyAoJTIlKTwvdGQ+PC90cj4iKS5hcmcoYXBwVGltZSkuYXJnKDEwMCooZmxvYXQpYXBwVGltZS8oZmxvYXQpdG90YWxUcmFjZVRpbWUsIDAsICdmJywgMSk7CisgICAgc3RhdFRleHQgKz0gUVN0cmluZygiPHRyPjx0ZD5Ub3RhbCBWa1RyYWNlIE92ZXJoZWFkOjwvdGQ+PHRkPiUxIG5zICglMiUpPC90ZD48L3RyPiIpLmFyZyh0b3RhbFN0YXRzLnRvdGFsVHJhY2VPdmVyaGVhZCkuYXJnKDEwMCooZmxvYXQpdG90YWxTdGF0cy50b3RhbFRyYWNlT3ZlcmhlYWQvKGZsb2F0KXRvdGFsVHJhY2VUaW1lLCAwLCAnZicsIDEpOzsKKyAgICBzdGF0VGV4dCArPSBRU3RyaW5nKCI8dHI+PHRkPlRvdGFsIEFQSSBDYWxsczo8L3RkPjx0ZD4lMTwvdGQ+PC90cj4iKS5hcmcodG90YWxTdGF0cy50b3RhbENhbGxDb3VudCk7CisgICAgc3RhdFRleHQgKz0gUVN0cmluZygiPHRyPjx0ZD5Ub3RhbCBFbnRyeXBvaW50cyBDYWxsZWQ6PC90ZD48dGQ+JTE8L3RkPjwvdHI+IikuYXJnKHN0YXRNYXAuY291bnQoKSk7CisgICAgc3RhdFRleHQgKz0gIjwvdGFibGU+PGJyLz4iOworCisgICAgc3RhdFRleHQgKz0gIjx0YWJsZT48dGhlYWQ+PHRyPjx0aCBhbGlnbj0nbGVmdCc+RW50cnlwb2ludDwvdGg+PHRoIGFsaWduPSdyaWdodCc+IyBDYWxscyAoJVRvdGFsKTwvdGg+PHRoIGFsaWduPSdyaWdodCc+RHJpdmVyIFRpbWUgKCVUb3RhbCAlQXBwRHIgJURyaXZlcik8L3RoPjx0aCBhbGlnbj0ncmlnaHQnPlZrVHJhY2UgT3ZlcmhlYWQgKCVUb3RhbCAldmt0cmFjZSk8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IjsKKworICAgIGZvciAoUU1hcDx1aW50MTZfdCwgdnR2QXBpVXNhZ2VTdGF0cz46Oml0ZXJhdG9yIGkgPSBzdGF0TWFwLmJlZ2luKCk7IGkgIT0gc3RhdE1hcC5lbmQoKTsgaSsrKQorICAgIHsKKyAgICAgICAgY29uc3QgdnR2QXBpVXNhZ2VTdGF0cyBzdGF0ID0gaS52YWx1ZSgpOworICAgICAgICBjb25zdCBjaGFyKiBlbnRyeXBvaW50ID0gbV9wQ29udHJvbGxlci0+R2V0UGFja2V0SWRTdHJpbmcoaS5rZXkoKSk7CisgICAgICAgIGlmIChlbnRyeXBvaW50ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgcHJpbnRpbmcgZW50cnlwb2ludCBuYW1lLCBqdXN0IHByaW50IGkKKyAgICAgICAgICAgIHN0YXRUZXh0ICs9IFFTdHJpbmcoIjx0cj48dGQ+JTE8L3RkPiIpLmFyZyhpLmtleSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRUZXh0ICs9IFFTdHJpbmcoIjx0cj48dGQ+JTE8L3RkPiIpLmFyZyhlbnRyeXBvaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGUsIGJlY2F1c2UgdGhpcyBpcyBiZWluZyBvdXRwdXQgYXMgSFRNTCwgY29uc2VjdXRpdmUgc3BhY2VzICcgJyBnZXQgcmVtb3ZlZCwgdGh1cyBJJ20gdXNpbmcgJz8nIHRvIHBhZCB0aGUgbnVtYmVycyBhbmQgcmVwbGFjaW5nIHRoZW0gd2l0aCAiJm5ic3A7IiBiZWxvdyBzbyB0aGF0IG51bWJlcnMgYXJlIGJldHRlciBhbGlnbmVkLgorICAgICAgICAvLyBBbHNvLCB0aGlzIHRleHQgZmllbGQgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGEgZml4ZWQtd2lkdGggZm9udC4KKyAgICAgICAgc3RhdFRleHQgKz0gUVN0cmluZygiPHRkIGFsaWduPSdyaWdodCc+JTEgKCUyJSk8L3RkPiIpLmFyZyhzdGF0LnRvdGFsQ2FsbENvdW50KS5hcmcoMTAwKihmbG9hdClzdGF0LnRvdGFsQ2FsbENvdW50LyhmbG9hdCl0b3RhbFN0YXRzLnRvdGFsQ2FsbENvdW50LCA1LCAnZicsIDEsICc/Jyk7CisgICAgICAgIHN0YXRUZXh0ICs9IFFTdHJpbmcoIjx0ZCBhbGlnbj0ncmlnaHQnPiUxIG5zICglMiUgJTMlPz8lNCUpPC90ZD4iKS5hcmcoc3RhdC50b3RhbENwdUV4ZWN1dGlvblRpbWUpLmFyZygxMDAqKGZsb2F0KXN0YXQudG90YWxDcHVFeGVjdXRpb25UaW1lLyhmbG9hdCl0b3RhbFRyYWNlVGltZSwgNSwgJ2YnLCAxLCAnPycpLmFyZygxMDAqKGZsb2F0KXN0YXQudG90YWxDcHVFeGVjdXRpb25UaW1lLyhmbG9hdClhcHBEcml2ZXJUaW1lLCA1LCAnZicsIDEsICc/JykuYXJnKDEwMCooZmxvYXQpc3RhdC50b3RhbENwdUV4ZWN1dGlvblRpbWUvKGZsb2F0KXRvdGFsU3RhdHMudG90YWxDcHVFeGVjdXRpb25UaW1lLCA1LCAnZicsIDEsICc/Jyk7CisgICAgICAgIHN0YXRUZXh0ICs9IFFTdHJpbmcoIjx0ZCBhbGlnbj0ncmlnaHQnPiUxIG5zICglMiUgJTMlKTwvdGQ+PC90cj4iKS5hcmcoc3RhdC50b3RhbFRyYWNlT3ZlcmhlYWQpLmFyZygxMDAqKGZsb2F0KXN0YXQudG90YWxUcmFjZU92ZXJoZWFkLyhmbG9hdCl0b3RhbFRyYWNlVGltZSwgNSwgJ2YnLCAxLCAnPycpLmFyZygxMDAqKGZsb2F0KXN0YXQudG90YWxUcmFjZU92ZXJoZWFkLyhmbG9hdCl0b3RhbFN0YXRzLnRvdGFsVHJhY2VPdmVyaGVhZCwgNSwgJ2YnLCAxLCAnPycpOworCisgICAgICAgIHN0YXRUZXh0LnJlcGxhY2UoJz8nLCAiJm5ic3A7Iik7CisgICAgfQorCisgICAgc3RhdFRleHQgKz0gIjwvdGJvZHk+PC90YWJsZT4iOworICAgIG1fcFRyYWNlU3RhdHNUYWJUZXh0LT5zZXRIdG1sKHN0YXRUZXh0KTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpvblRyYWNlRmlsZUxvYWRlZChib29sIGJTdWNjZXNzLCBjb25zdCB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyYgZmlsZUluZm8sIGNvbnN0IFFTdHJpbmcmIGNvbnRyb2xsZXJGaWxlbmFtZSkKK3sKKyAgICBRQXBwbGljYXRpb246OnJlc3RvcmVPdmVycmlkZUN1cnNvcigpOworCisgICAgaWYgKGZpbGVJbmZvLnBhY2tldENvdW50ID09IDApCisgICAgeworICAgICAgICBMb2dXYXJuaW5nKCJUaGUgdHJhY2UgZmlsZSBoYXMgMCBwYWNrZXRzLiIpOworICAgIH0KKyAgICBlbHNlIGlmIChmaWxlSW5mby5wUGFja2V0T2Zmc2V0cyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTG9nRXJyb3IoIk5vIHBhY2tldCBvZmZzZXRzIHJlYWQgZnJvbSB0cmFjZSBmaWxlLiIpOworICAgICAgICBiU3VjY2VzcyA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghYlN1Y2Nlc3MpCisgICAgeworICAgICAgICBMb2dBbHdheXMoIi4uLkZBSUxFRCEiKTsKKyAgICAgICAgUU1lc3NhZ2VCb3g6OmNyaXRpY2FsKHRoaXMsIHRyKCJFcnJvciIpLCB0cigiQ291bGQgbm90IG9wZW4gdHJhY2UgZmlsZS4iKSk7CisgICAgICAgIGNsb3NlX3RyYWNlX2ZpbGUoKTsKKworICAgICAgICBpZiAobV9iR2VuZXJhdGluZ1RyYWNlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciB3YXMgZ2VuZXJhdGluZyBhIHRyYWNlIGZpbGUsIGJ1dCB0aGUgdHJhY2UgZmFpbGVkIHRvIGxvYWQsCisgICAgICAgICAgICAvLyB0aGVuIHJlLXNwYXduIHRoZSBnZW5lcmF0ZSB0cmFjZSBkaWFsb2cuCisgICAgICAgICAgICBwcm9tcHRfZ2VuZXJhdGVfdHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtX3RyYWNlRmlsZUluZm8gPSBmaWxlSW5mbzsKKworICAgICAgICBzZXRXaW5kb3dUaXRsZShRU3RyaW5nKG1fdHJhY2VGaWxlSW5mby5maWxlbmFtZSkgKyAiIC0gIiArIGdfUFJPSkVDVF9OQU1FKTsKKyAgICAgICAgTG9nQWx3YXlzKCIuLi5zdWNjZXNzISIpOworCisgICAgICAgIC8vIHVwZGF0ZSBzZXR0aW5ncyB0byByZWZsZWN0IHRoZSBjdXJyZW50bHkgb3BlbiBmaWxlCisgICAgICAgIGdfc2V0dGluZ3MudHJhY2VfZmlsZV90b19vcGVuID0gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weShtX3RyYWNlRmlsZUluZm8uZmlsZW5hbWUpOworICAgICAgICB2a3RyYWNldmlld2VyX3NldHRpbmdzX3VwZGF0ZWQoKTsKKworI2lmbmRlZiBVU0VfU1RBVElDX0NPTlRST0xMRVJfTElCUkFSWQorICAgICAgICBpZiAoIWNvbnRyb2xsZXJGaWxlbmFtZS5pc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcENvbnRyb2xsZXIgPSBtX2NvbnRyb2xsZXJGYWN0b3J5LkxvYWQoY29udHJvbGxlckZpbGVuYW1lLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIG1fcENvbnRyb2xsZXIgPSB2dHZDcmVhdGVRQ29udHJvbGxlcigpOworI2VuZGlmCisKKyAgICAgICAgaWYgKG1fcENvbnRyb2xsZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY29ubmVjdChtX3BDb250cm9sbGVyLCBTSUdOQUwoT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwsIGNvbnN0IFFTdHJpbmcmKSksIHRoaXMsIFNMT1QoT25PdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgY29uc3QgUVN0cmluZyYpKSk7CisgICAgICAgICAgICBjb25uZWN0KG1fcENvbnRyb2xsZXIsIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgdWludDY0X3QsIGNvbnN0IFFTdHJpbmcmKSksIHRoaXMsIFNMT1QoT25PdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgdWludDY0X3QsIGNvbnN0IFFTdHJpbmcmKSkpOworCisgICAgICAgICAgICAvLyBNZXJnZSBpbiBzZXR0aW5ncyBmcm9tIHRoZSBjb250cm9sbGVyLgorICAgICAgICAgICAgLy8gVGhpcyB3b24ndCByZXBsYWNlIHNldHRpbmdzIHRoYXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZCBmcm9tIGRpc2suCisgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9tZXJnZShtX3BDb250cm9sbGVyLT5HZXRTZXR0aW5ncygpLCAmZ19wQWxsU2V0dGluZ3MsICZnX251bUFsbFNldHRpbmdzKTsKKworICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSB0aGUgY29udHJvbGxlciB3aXRoIHRoZSBsb2FkZWQgc2V0dGluZ3MKKyAgICAgICAgICAgIG1fcENvbnRyb2xsZXItPlVwZGF0ZUZyb21TZXR0aW5ncyhnX3BBbGxTZXR0aW5ncywgZ19udW1BbGxTZXR0aW5ncyk7CisKKyAgICAgICAgICAgIC8vLy8gdHJhY2UgZmlsZSB3YXMgbG9hZGVkLCBub3cgYXR0ZW1wdCB0byBvcGVuIGFkZGl0aW9uYWwgc2Vzc2lvbiBkYXRhCisgICAgICAgICAgICAvL2lmIChsb2FkX29yX2NyZWF0ZV9zZXNzaW9uKGZpbGVuYW1lLmNfc3RyKCksIG1fcFRyYWNlUmVhZGVyKSA9PSBmYWxzZSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgLy8gZmFpbGluZyB0byBsb2FkIHNlc3Npb24gZGF0YSBpcyBub3QgY3JpdGljYWwsIGJ1dCBtYXkgcmVzdWx0IGluIHVuZXhwZWN0ZWQgYmVoYXZpb3IgYXQgdGltZXMuCisgICAgICAgICAgICAvLyAgICB2a3RyYWNldmlld2VyX291dHB1dF9lcnJvcigiVmtUcmFjZVZpZXdlciB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBhIHNlc3Npb24gZm9sZGVyIHRvIHNhdmUgdmlld2luZyBpbmZvcm1hdGlvbi4gRnVuY3Rpb25hbGl0eSBtYXkgYmUgbGltaXRlZC4iKTsKKyAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIFVJIHdpdGggdGhlIGNvbnRyb2xsZXIKKyAgICAgICAgICAgIG1fcENvbnRyb2xsZXItPkxvYWRUcmFjZUZpbGUoJm1fdHJhY2VGaWxlSW5mbywgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgdG9vbGJhcgorICAgICAgICB1aS0+c2VhcmNoVGV4dEJveC0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgdWktPnNlYXJjaFByZXZCdXR0b24tPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHVpLT5zZWFyY2hOZXh0QnV0dG9uLT5zZXRFbmFibGVkKHRydWUpOworCisgICAgICAgIHVpLT5hY3Rpb25fQ2xvc2UtPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHVpLT5hY3Rpb25FeHBvcnRfQVBJX0NhbGxzLT5zZXRFbmFibGVkKHRydWUpOworCisgICAgICAgIHVpLT5wcmV2RHJhd2NhbGxCdXR0b24tPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHVpLT5uZXh0RHJhd2NhbGxCdXR0b24tPnNldEVuYWJsZWQodHJ1ZSk7CisKKyAgICAgICAgLy8gcmVzZXQgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHVpIG1heSBoYXZlIGJlZW4gZ2VuZXJhdGluZyBhIHRyYWNlIGZpbGUuCisgICAgICAgIG1fYkdlbmVyYXRpbmdUcmFjZSA9IGZhbHNlOworCisgICAgICAgIEdlbmVyYXRlVHJhY2VGaWxlU3RhdHMoKTsKKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcjo6b25fYWN0aW9uX0Nsb3NlX3RyaWdnZXJlZCgpCit7CisgICAgY2xvc2VfdHJhY2VfZmlsZSgpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6OmNsb3NlX3RyYWNlX2ZpbGUoKQoreworICAgIGlmIChtX3BDb250cm9sbGVyICE9IE5VTEwpCisgICAgeworICAgICAgICB1aS0+Ym90dG9tVGFiV2lkZ2V0LT5yZW1vdmVUYWIodWktPmJvdHRvbVRhYldpZGdldC0+aW5kZXhPZihtX3BUcmFjZVN0YXRzVGFiKSk7CisgICAgICAgIG1fcENvbnRyb2xsZXItPlVubG9hZFRyYWNlRmlsZSgpOworI2lmbmRlZiBVU0VfU1RBVElDX0NPTlRST0xMRVJfTElCUkFSWQorICAgICAgICBtX2NvbnRyb2xsZXJGYWN0b3J5LlVubG9hZCgmbV9wQ29udHJvbGxlcik7CisjZWxzZQorICAgICAgICB2dHZEZWxldGVRQ29udHJvbGxlcigmbV9wQ29udHJvbGxlcik7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobV9wVGltZWxpbmUgIT0gTlVMTCAmJiBtX3BUaW1lbGluZS0+bW9kZWwoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbV9wVGltZWxpbmUtPnNldE1vZGVsKE5VTEwpOworICAgICAgICBtX3BUaW1lbGluZS0+cmVwYWludCgpOworICAgIH0KKworICAgIGlmIChtX3RyYWNlRmlsZUluZm8ucGFja2V0Q291bnQgPiAwKQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtX3RyYWNlRmlsZUluZm8ucGFja2V0Q291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fdHJhY2VGaWxlSW5mby5wUGFja2V0T2Zmc2V0c1tpXS5wSGVhZGVyICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV9mcmVlKG1fdHJhY2VGaWxlSW5mby5wUGFja2V0T2Zmc2V0c1tpXS5wSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHNbaV0ucEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBWS1RSQUNFX0RFTEVURShtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHMpOworICAgICAgICBtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHMgPSBOVUxMOworICAgICAgICBtX3RyYWNlRmlsZUluZm8ucGFja2V0Q291bnQgPSAwOworICAgIH0KKworICAgIGlmIChtX3RyYWNlRmlsZUluZm8ucEZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZjbG9zZShtX3RyYWNlRmlsZUluZm8ucEZpbGUpOworICAgICAgICBtX3RyYWNlRmlsZUluZm8ucEZpbGUgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtX3RyYWNlRmlsZUluZm8uZmlsZW5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfZnJlZShtX3RyYWNlRmlsZUluZm8uZmlsZW5hbWUpOworICAgICAgICBtX3RyYWNlRmlsZUluZm8uZmlsZW5hbWUgPSBOVUxMOworCisgICAgICAgIExvZ0Fsd2F5cygiQ2xvc2luZyB0cmFjZSBmaWxlLiIpOworICAgICAgICBMb2dBbHdheXMoIi0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworICAgICAgICAvLyB1cGRhdGUgc2V0dGluZ3MKKyAgICAgICAgaWYgKGdfc2V0dGluZ3MudHJhY2VfZmlsZV90b19vcGVuICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfZnJlZShnX3NldHRpbmdzLnRyYWNlX2ZpbGVfdG9fb3Blbik7CisgICAgICAgICAgICBnX3NldHRpbmdzLnRyYWNlX2ZpbGVfdG9fb3BlbiA9IE5VTEw7CisgICAgICAgICAgICB2a3RyYWNldmlld2VyX3NldHRpbmdzX3VwZGF0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNldFdpbmRvd1RpdGxlKGdfUFJPSkVDVF9OQU1FKTsKKworICAgIHJlc2V0X3RyYWNlZmlsZV91aSgpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX2FjdGlvbkV4cG9ydF9BUElfQ2FsbHNfdHJpZ2dlcmVkKCkKK3sKKyAgICBRU3RyaW5nIHN1Z2dlc3RlZE5hbWUobV90cmFjZUZpbGVJbmZvLmZpbGVuYW1lKTsKKworICAgIGludCBsYXN0SW5kZXggPSBzdWdnZXN0ZWROYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgaWYgKGxhc3RJbmRleCAhPSAtMSkKKyAgICB7CisgICAgICAgIHN1Z2dlc3RlZE5hbWUgPSBzdWdnZXN0ZWROYW1lLnJlbW92ZShsYXN0SW5kZXgsIHN1Z2dlc3RlZE5hbWUuc2l6ZSgpIC0gbGFzdEluZGV4KTsKKyAgICB9CisgICAgc3VnZ2VzdGVkTmFtZSArPSAiLUFwaUNhbGxzLnR4dCI7CisKKyAgICBRU3RyaW5nIGZpbGVOYW1lID0gUUZpbGVEaWFsb2c6OmdldFNhdmVGaWxlTmFtZSh0aGlzLCB0cigiRXhwb3J0IEFQSSBDYWxscyIpLCBzdWdnZXN0ZWROYW1lLCB0cigiVGV4dCAoKi50eHQpIikpOworCisgICAgaWYgKCFmaWxlTmFtZS5pc0VtcHR5KCkpCisgICAgeworICAgICAgICBGSUxFKiBwRmlsZSA9IGZvcGVuKGZpbGVOYW1lLnRvU3RkU3RyaW5nKCkuY19zdHIoKSwgInciKTsKKyAgICAgICAgaWYgKHBGaWxlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ0Vycm9yKCJGYWlsZWQgdG8gb3BlbiBmaWxlIGZvciB3cml0ZS4gQ2FuJ3QgZXhwb3J0IEFQSSBjYWxscy4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBldmVyeSBwYWNrZXQKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtX3RyYWNlRmlsZUluZm8ucGFja2V0Q291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX3BhY2tldF9vZmZzZXRzKiBwT2Zmc2V0cyA9ICZtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHNbaV07CisgICAgICAgICAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIgPSBwT2Zmc2V0cy0+cEhlYWRlcjsKKyAgICAgICAgICAgIGFzc2VydChwSGVhZGVyICE9IE5VTEwpOworICAgICAgICAgICAgUVN0cmluZyBzdHJpbmcgPSBtX3BUcmFjZUZpbGVNb2RlbC0+Z2V0X3BhY2tldF9zdHJpbmcocEhlYWRlcik7CisKKyAgICAgICAgICAgIC8vIG91dHB1dCBwYWNrZXQgc3RyaW5nCisgICAgICAgICAgICBmcHJpbnRmKHBGaWxlLCAiJXNcbiIsIHN0cmluZy50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmNsb3NlKHBGaWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcjo6b25fYWN0aW9uRWRpdF90cmlnZ2VyZWQoKQoreworICAgIC8vIG1ha2Ugc3VyZSBkaWFsb2cgaXMgYXQgdGhlIHNpemUgc3BlY2lmaWVkIGJ5IHRoZSBzZXR0aW5ncworICAgIG1fc2V0dGluZ3NEaWFsb2cucmVzaXplKGdfc2V0dGluZ3Muc2V0dGluZ3NfZGlhbG9nX3dpZHRoLCBnX3NldHRpbmdzLnNldHRpbmdzX2RpYWxvZ19oZWlnaHQpOworCisgICAgLy8gc2V0IHRoZSBncm91cHMgc28gdGhhdCB0aGUgZGlhbG9nIGlzIGRpc3BsYXlpbmcgdGhlIG1vc3QgcmVjZW50IGluZm9ybWF0aW9uCisgICAgbV9zZXR0aW5nc0RpYWxvZy5zZXRHcm91cHMoZ19wQWxsU2V0dGluZ3MsIGdfbnVtQWxsU2V0dGluZ3MpOworCisgICAgLy8gZXhlY3V0ZSB0aGUgZGlhbG9nCisgICAgbV9zZXR0aW5nc0RpYWxvZy5leGVjKCk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcjo6b25fc2V0dGluZ3NEaWFsb2dSZXNpemVkKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKyAgICAvLyB0aGUgZGlhbG9nIHdhcyByZXNpemVkLCBzbyB1cGRhdGUgdGhlIHNldHRpbmdzCisgICAgZ19zZXR0aW5ncy5zZXR0aW5nc19kaWFsb2dfd2lkdGggPSB3aWR0aDsKKyAgICBnX3NldHRpbmdzLnNldHRpbmdzX2RpYWxvZ19oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAvLyBVcGRhdGUgdGhlIHNldHRpbmcgZ3JvdXBzIHdpdGggdGhlIG5ldyB2YWx1ZXMuCisgICAgdmt0cmFjZXZpZXdlcl9zZXR0aW5nc191cGRhdGVkKCk7CisKKyAgICAvLyByZS1zZXQgdGhlIGdyb3VwcyBzbyB0aGF0IHRoZSBkaWFsb2cgaXMgZGlzcGxheWluZyB0aGUgbW9zdCByZWNlbnQgaW5mb3JtYXRpb24uCisgICAgbV9zZXR0aW5nc0RpYWxvZy5zZXRHcm91cHMoZ19wQWxsU2V0dGluZ3MsIGdfbnVtQWxsU2V0dGluZ3MpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX3NldHRpbmdzU2F2ZWQodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBVcGRhdGVkU2V0dGluZ3MsIHVuc2lnbmVkIGludCBudW1Hcm91cHMpCit7CisgICAgLy8gcFVwZGF0ZWRTZXR0aW5ncyBpcyBhbHJlYWR5IHBvaW50aW5nIHRvIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGdfcEFsbFNldHRpbmdzCisgICAgZ19udW1BbGxTZXR0aW5ncyA9IG51bUdyb3VwczsKKworICAgIC8vIGFwcGx5IHVwZGF0ZWQgc2V0dGluZ3MgdG8gdGhlIHNldHRpbmdHcm91cCBzbyB0aGF0IHRoZSBVSSB3aWxsIHJlc3BvbmQgdG8gdGhlIGNoYW5nZXMKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9BcHBseV9PdmVycmlkZXMoJmdfc2V0dGluZ0dyb3VwLCBwVXBkYXRlZFNldHRpbmdzLCBudW1Hcm91cHMpOworCisgICAgaWYgKG1fcENvbnRyb2xsZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1fcENvbnRyb2xsZXItPlVwZGF0ZUZyb21TZXR0aW5ncyhwVXBkYXRlZFNldHRpbmdzLCBudW1Hcm91cHMpOworICAgIH0KKworICAgIHZrdHJhY2V2aWV3ZXJfc2F2ZV9zZXR0aW5ncygpOworCisgICAgLy8gcmVhY3QgdG8gY2hhbmdlcyBpbiBzZXR0aW5ncworICAgIHRoaXMtPm1vdmUoZ19zZXR0aW5ncy53aW5kb3dfcG9zaXRpb25fbGVmdCwgZ19zZXR0aW5ncy53aW5kb3dfcG9zaXRpb25fdG9wKTsKKyAgICB0aGlzLT5yZXNpemUoZ19zZXR0aW5ncy53aW5kb3dfc2l6ZV93aWR0aCwgZ19zZXR0aW5ncy53aW5kb3dfc2l6ZV9oZWlnaHQpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9wZW5fdHJhY2VfZmlsZV90aHJlYWRlZChjb25zdCBRU3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgICAvLyBjbG9zZSBhbnkgZXhpc3RpbmcgdHJhY2UKKyAgICBjbG9zZV90cmFjZV9maWxlKCk7CisKKyAgICBMb2dBbHdheXMoIioqKioqKioqKioqKioqKioqKioqKiIpOworICAgIExvZ0Fsd2F5cygiT3BlbmluZyB0cmFjZSBmaWxlLi4uIik7CisgICAgTG9nQWx3YXlzKGZpbGVuYW1lKTsKKworICAgIFFBcHBsaWNhdGlvbjo6c2V0T3ZlcnJpZGVDdXJzb3IoUXQ6OldhaXRDdXJzb3IpOworCisgICAgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTG9hZGVyKiBwVHJhY2VMb2FkZXIgPSBuZXcgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTG9hZGVyKCk7CisgICAgbV90cmFjZUxvYWRlclRocmVhZC5zZXRPYmplY3ROYW1lKCJUcmFjZUxvYWRlclRocmVhZCIpOworICAgIHBUcmFjZUxvYWRlci0+bW92ZVRvVGhyZWFkKCZtX3RyYWNlTG9hZGVyVGhyZWFkKTsKKworICAgIGNvbm5lY3QocFRyYWNlTG9hZGVyLCBTSUdOQUwoT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwsIHVpbnQ2NF90LCBjb25zdCBRU3RyaW5nJikpLCB0aGlzLCBTTE9UKE9uT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwsIHVpbnQ2NF90LCBjb25zdCBRU3RyaW5nJikpLCBRdDo6UXVldWVkQ29ubmVjdGlvbik7CisgICAgY29ubmVjdChwVHJhY2VMb2FkZXIsIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgY29uc3QgUVN0cmluZyYpKSwgdGhpcywgU0xPVChPbk91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsLCBjb25zdCBRU3RyaW5nJikpLCBRdDo6UXVldWVkQ29ubmVjdGlvbik7CisKKyAgICBjb25uZWN0KHRoaXMsIFNJR05BTChMb2FkVHJhY2VGaWxlKGNvbnN0IFFTdHJpbmcmKSksIHBUcmFjZUxvYWRlciwgU0xPVChsb2FkVHJhY2VGaWxlKFFTdHJpbmcpKSwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24pOworCisgICAgY29ubmVjdChwVHJhY2VMb2FkZXIsIFNJR05BTChUcmFjZUZpbGVMb2FkZWQoYm9vbCwgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8sIGNvbnN0IFFTdHJpbmcmKSksIHRoaXMsIFNMT1Qob25UcmFjZUZpbGVMb2FkZWQoYm9vbCwgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8sIGNvbnN0IFFTdHJpbmcmKSkpOworICAgIGNvbm5lY3QocFRyYWNlTG9hZGVyLCBTSUdOQUwoRmluaXNoZWQoKSksICZtX3RyYWNlTG9hZGVyVGhyZWFkLCBTTE9UKHF1aXQoKSkpOworICAgIGNvbm5lY3QocFRyYWNlTG9hZGVyLCBTSUdOQUwoRmluaXNoZWQoKSksIHBUcmFjZUxvYWRlciwgU0xPVChkZWxldGVMYXRlcigpKSk7CisKKyAgICBtX3RyYWNlTG9hZGVyVGhyZWFkLnN0YXJ0KCk7CisKKyAgICAvLyBTaWduYWwgdGhlIGxvYWRlciB0byBzdGFydAorICAgIGVtaXQgTG9hZFRyYWNlRmlsZShmaWxlbmFtZSk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcjo6cmVzZXRfdHJhY2VmaWxlX3VpKCkKK3sKKyAgICB1aS0+YWN0aW9uX0Nsb3NlLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICB1aS0+YWN0aW9uRXhwb3J0X0FQSV9DYWxscy0+c2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICB1aS0+cHJldkRyYXdjYWxsQnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICB1aS0+bmV4dERyYXdjYWxsQnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICB1aS0+c2VhcmNoVGV4dEJveC0+Y2xlYXIoKTsKKyAgICB1aS0+c2VhcmNoVGV4dEJveC0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgdWktPnNlYXJjaFByZXZCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgIHVpLT5zZWFyY2hOZXh0QnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKworICAgIC8vVktUUkFDRVZJRVdFUl9ESVNBQkxFX0JPVFRPTV9UQUIodWktPm1hY2hpbmVJbmZvVGFiKTsKKyAgICAvL1ZLVFJBQ0VWSUVXRVJfRElTQUJMRV9CT1RUT01fVEFCKHVpLT5jYWxsU3RhY2tUYWIpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX3RyZWVWaWV3X2NsaWNrZWQoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KQoreworICAgIFFNb2RlbEluZGV4IGNvbDBJbmRleCA9IGluZGV4LnNpYmxpbmcoaW5kZXgucm93KCksIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW50cnlwb2ludE5hbWUpOworICAgIFFNb2RlbEluZGV4IHNyY0luZGV4ID0gbWFwVHJlZUluZGV4VG9Nb2RlbChjb2wwSW5kZXgpOworICAgIGlmIChzcmNJbmRleC5pc1ZhbGlkKCkpCisgICAgeworICAgICAgICBzZWxlY3RBcGljYWxsTW9kZWxJbmRleChzcmNJbmRleCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX2h5cGVybGlua0NsaWNrZWQoY29uc3QgUVVybCYgbGluaykKK3sKKyAgICBpZiAobGluay5maWxlTmFtZSgpID09ICJwYWNrZXQiKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmsuaGFzRnJhZ21lbnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcXVsb25nbG9uZyBpbmRleCA9IGxpbmsuZnJhZ21lbnQoKS50b1VMb25nTG9uZygpOworICAgICAgICAgICAgdGhpcy0+c2VsZWN0X2NhbGxfYXRfcGFja2V0X2luZGV4KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpzbG90X3RpbWVsaW5lX2NsaWNrZWQoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KQoreworICAgIHNlbGVjdEFwaWNhbGxNb2RlbEluZGV4KGluZGV4LCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpzZWxlY3RBcGljYWxsTW9kZWxJbmRleChRTW9kZWxJbmRleCBpbmRleCwgYm9vbCBzY3JvbGxUbywgYm9vbCBzZWxlY3QpCit7CisgICAgLy8gbWFrZSBzdXJlIHRoZSBpbmRleCBpcyB2aXNpYmxlIGluIHRyZWUgdmlldworICAgIFFNb2RlbEluZGV4IHRyZWVJbmRleCA9IG1hcFRyZWVJbmRleEZyb21Nb2RlbChpbmRleCk7CisKKyAgICBpZiAodWktPnRyZWVWaWV3LT5jdXJyZW50SW5kZXgoKSAhPSB0cmVlSW5kZXggJiYgdWktPnRyZWVWaWV3LT5pc0VuYWJsZWQoKSkKKyAgICB7CisgICAgICAgIFFNb2RlbEluZGV4IHBhcmVudEluZGV4ID0gdHJlZUluZGV4LnBhcmVudCgpOworICAgICAgICB3aGlsZSAocGFyZW50SW5kZXguaXNWYWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodWktPnRyZWVWaWV3LT5pc0V4cGFuZGVkKHBhcmVudEluZGV4KSA9PSBmYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aS0+dHJlZVZpZXctPmV4cGFuZChwYXJlbnRJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJlbnRJbmRleCA9IHBhcmVudEluZGV4LnBhcmVudCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2Nyb2xsIHRvIHRoZSBpbmRleAorICAgICAgICBpZiAoc2Nyb2xsVG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpLT50cmVlVmlldy0+c2Nyb2xsVG8odHJlZUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlbGVjdCB0aGUgaW5kZXgKKyAgICAgICAgaWYgKHNlbGVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgdWktPnRyZWVWaWV3LT5zZXRDdXJyZW50SW5kZXgodHJlZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3BUaW1lbGluZSAhPSBOVUxMICYmIG1fcFRpbWVsaW5lLT5jdXJyZW50SW5kZXgoKSAhPSBpbmRleCkKKyAgICB7CisgICAgICAgIC8vIHNjcm9sbCB0byB0aGUgaW5kZXgKKyAgICAgICAgaWYgKHNjcm9sbFRvKQorICAgICAgICB7CisgICAgICAgICAgICBtX3BUaW1lbGluZS0+c2Nyb2xsVG8oaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VsZWN0IHRoZSBpbmRleAorICAgICAgICBpZiAoc2VsZWN0KQorICAgICAgICB7CisgICAgICAgICAgICBtX3BUaW1lbGluZS0+c2V0Q3VycmVudEluZGV4KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpvbl9zZWFyY2hUZXh0Qm94X3RleHRDaGFuZ2VkKGNvbnN0IFFTdHJpbmcgJnNlYXJjaFRleHQpCit7CisgICAgUVBhbGV0dGUgcGFsZXR0ZSh1aS0+c2VhcmNoVGV4dEJveC0+cGFsZXR0ZSgpKTsKKyAgICBwYWxldHRlLnNldENvbG9yKFFQYWxldHRlOjpCYXNlLCBtX3NlYXJjaFRleHRib3hCYWNrZ3JvdW5kQ29sb3IpOworICAgIHVpLT5zZWFyY2hUZXh0Qm94LT5zZXRQYWxldHRlKHBhbGV0dGUpOworCisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsICE9IE5VTEwpCisgICAgeworICAgICAgICBtX3BUcmFjZUZpbGVNb2RlbC0+c2V0X2hpZ2hsaWdodF9zZWFyY2hfc3RyaW5nKHNlYXJjaFRleHQpOworICAgIH0KKworICAgIC8vIG5lZWQgdG8gYnJpZWZseSBnaXZlIHRoZSB0cmVldmlldyBmb2N1cyBzbyB0aGF0IGl0IHByb3Blcmx5IHJlZHJhd3MgYW5kIGhpZ2hsaWdodHMgdGhlIG1hdGNoaW5nIHJvd3MKKyAgICAvLyB0aGVuIHJldHVybiBmb2N1cyB0byB0aGUgc2VhcmNoIHRleHRib3ggc28gdGhhdCB0eXBlZCBrZXlzIGFyZSBub3QgbG9zdAorICAgIHVpLT50cmVlVmlldy0+c2V0Rm9jdXMoKTsKKyAgICB1aS0+c2VhcmNoVGV4dEJveC0+c2V0Rm9jdXMoKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpvbl9zZWFyY2hOZXh0QnV0dG9uX2NsaWNrZWQoKQoreworICAgIGlmIChtX3BUcmFjZUZpbGVNb2RlbCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUU1vZGVsSW5kZXggaW5kZXggPSB1aS0+dHJlZVZpZXctPmN1cnJlbnRJbmRleCgpOworICAgICAgICBpZiAoIWluZGV4LmlzVmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIHZhbGlkIGN1cnJlbnQgaW5kZXgsIHRoZW4gZ2V0IHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgdHJhY2UgZmlsZSBtb2RlbC4KKyAgICAgICAgICAgIGluZGV4ID0gbV9wVHJhY2VGaWxlTW9kZWwtPmluZGV4KDAsIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW50cnlwb2ludE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTmVlZCB0byBtYWtlIHN1cmUgdGhpcyBpbmRleCBpcyBpbiBtb2RlbC1zcGFjZQorICAgICAgICBpZiAoaW5kZXgubW9kZWwoKSA9PSBtX3BQcm94eU1vZGVsKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRleCA9IG1hcFRyZWVJbmRleFRvTW9kZWwoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IGl0ZW0gaW4gdGhlIGxpc3QKKyAgICAgICAgLy8gVE9ETzogdGhpcyBtZWFucyB0aGF0IHdlIHdvbid0IGJlIGFibGUgdG8gaGl0ICJOZXh0IiBhbmQgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSB0cmFjZSBmaWxlLgorICAgICAgICAvLyBIb3dldmVyLCBpZiB3ZSBtb3ZlIHRoaXMgaW50byB0aGUgbG9vcCBiZWxvdywgdGhlbiBoaXR0aW5nICJOZXh0IiB3aWxsIGFsd2F5cyByZXN1bHQgaW4gZmluZGluZyB0aGUgc2FtZSBpdGVtLgorICAgICAgICBpbmRleCA9IGluZGV4LnNpYmxpbmcoaW5kZXgucm93KCkrMSwgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisKKyAgICAgICAgLy8gQ2FuJ3QgZ2V0IGNvbHVtbiBjb3VudCBmcm9tIHRoZSBUcmVlVmlldywgc28gbmVlZCB0byBhc2sgYm90aCB0aGUgbW9kZWwgYW5kIHByb3h5IGlmIGl0IGV4aXN0cy4KKyAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gbV9wVHJhY2VGaWxlTW9kZWwtPmNvbHVtbkNvdW50KGluZGV4KTsKKyAgICAgICAgaWYgKG1fcFByb3h5TW9kZWwgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY29sdW1uQ291bnQgPSBtX3BQcm94eU1vZGVsLT5jb2x1bW5Db3VudChpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoaW5kZXguaXNWYWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBjb2x1bW5Db3VudDsgY29sdW1uKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVpLT50cmVlVmlldy0+aXNDb2x1bW5IaWRkZW4oY29sdW1uKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBRTW9kZWxJbmRleCB0cmVlSW5kZXggPSBtYXBUcmVlSW5kZXhGcm9tTW9kZWwobV9wVHJhY2VGaWxlTW9kZWwtPmluZGV4KGluZGV4LnJvdygpLCBjb2x1bW4sIGluZGV4LnBhcmVudCgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHRyZWVJbmRleC5kYXRhKFF0OjpEaXNwbGF5Um9sZSkudG9TdHJpbmcoKS5jb250YWlucyh1aS0+c2VhcmNoVGV4dEJveC0+dGV4dCgpLCBRdDo6Q2FzZUluc2Vuc2l0aXZlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmlyc3QgY29sdW1uIHNvIHRoYXQgaXQgY2FuIGJlIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgIFFNb2RlbEluZGV4IHNyY0luZGV4ID0gbV9wVHJhY2VGaWxlTW9kZWwtPmluZGV4KGluZGV4LnJvdygpLCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0VudHJ5cG9pbnROYW1lLCBpbmRleC5wYXJlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdEFwaWNhbGxNb2RlbEluZGV4KHNyY0luZGV4LCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdWktPnRyZWVWaWV3LT5zZXRGb2N1cygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3YXNuJ3QgZm91bmQgaW4gdGhhdCByb3csIHNvIGNoZWNrIHRoZSBuZXh0IG9uZQorICAgICAgICAgICAgaW5kZXggPSBpbmRleC5zaWJsaW5nKGluZGV4LnJvdygpKzEsIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW50cnlwb2ludE5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX3NlYXJjaFByZXZCdXR0b25fY2xpY2tlZCgpCit7CisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsICE9IE5VTEwpCisgICAgeworICAgICAgICBRTW9kZWxJbmRleCBpbmRleCA9IHVpLT50cmVlVmlldy0+Y3VycmVudEluZGV4KCk7CisgICAgICAgIGlmICghaW5kZXguaXNWYWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gdmFsaWQgY3VycmVudCBpbmRleCwgdGhlbiBnZXQgdGhlIGZpcnN0IGluZGV4IGluIHRoZSB0cmFjZSBmaWxlIG1vZGVsLgorICAgICAgICAgICAgaW5kZXggPSBtX3BUcmFjZUZpbGVNb2RlbC0+aW5kZXgoMCwgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGluZGV4IGlzIGluIG1vZGVsLXNwYWNlCisgICAgICAgIGlmIChpbmRleC5tb2RlbCgpID09IG1fcFByb3h5TW9kZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4ID0gbWFwVHJlZUluZGV4VG9Nb2RlbChpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgdGhlIG5leHQgaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAvLyBUT0RPOiB0aGlzIG1lYW5zIHRoYXQgd2Ugd29uJ3QgYmUgYWJsZSB0byBoaXQgIlByZXYiIGFuZCBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRyYWNlIGZpbGUuCisgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHdlIG1vdmUgdGhpcyBpbnRvIHRoZSBsb29wIGJlbG93LCB0aGVuIGhpdHRpbmcgIlByZXYiIHdpbGwgYWx3YXlzIHJlc3VsdCBpbiBmaW5kaW5nIHRoZSBzYW1lIGl0ZW0uCisgICAgICAgIGluZGV4ID0gaW5kZXguc2libGluZyhpbmRleC5yb3coKS0xLCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0VudHJ5cG9pbnROYW1lKTsKKworICAgICAgICAvLyBDYW4ndCBnZXQgY29sdW1uIGNvdW50IGZyb20gdGhlIFRyZWVWaWV3LCBzbyBuZWVkIHRvIGFzayBib3RoIHRoZSBtb2RlbCBhbmQgcHJveHkgaWYgaXQgZXhpc3RzLgorICAgICAgICBpbnQgY29sdW1uQ291bnQgPSBtX3BUcmFjZUZpbGVNb2RlbC0+Y29sdW1uQ291bnQoaW5kZXgpOworICAgICAgICBpZiAobV9wUHJveHlNb2RlbCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjb2x1bW5Db3VudCA9IG1fcFByb3h5TW9kZWwtPmNvbHVtbkNvdW50KGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChpbmRleC5pc1ZhbGlkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IGNvbHVtbkNvdW50OyBjb2x1bW4rKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodWktPnRyZWVWaWV3LT5pc0NvbHVtbkhpZGRlbihjb2x1bW4pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIFFNb2RlbEluZGV4IHRyZWVJbmRleCA9IG1hcFRyZWVJbmRleEZyb21Nb2RlbChtX3BUcmFjZUZpbGVNb2RlbC0+aW5kZXgoaW5kZXgucm93KCksIGNvbHVtbiwgaW5kZXgucGFyZW50KCkpKTsKKyAgICAgICAgICAgICAgICBpZiAodHJlZUluZGV4LmRhdGEoUXQ6OkRpc3BsYXlSb2xlKS50b1N0cmluZygpLmNvbnRhaW5zKHVpLT5zZWFyY2hUZXh0Qm94LT50ZXh0KCksIFF0OjpDYXNlSW5zZW5zaXRpdmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmaXJzdCBjb2x1bW4gc28gdGhhdCBpdCBjYW4gYmUgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgUU1vZGVsSW5kZXggc3JjSW5kZXggPSBtX3BUcmFjZUZpbGVNb2RlbC0+aW5kZXgoaW5kZXgucm93KCksIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW50cnlwb2ludE5hbWUsIGluZGV4LnBhcmVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0QXBpY2FsbE1vZGVsSW5kZXgoc3JjSW5kZXgsIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB1aS0+dHJlZVZpZXctPnNldEZvY3VzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdhc24ndCBmb3VuZCBpbiB0aGF0IHJvdywgc28gY2hlY2sgdGhlIG5leHQgb25lCisgICAgICAgICAgICBpbmRleCA9IGluZGV4LnNpYmxpbmcoaW5kZXgucm93KCktMSwgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisgICAgICAgIH0KKworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpvbl9wcmV2RHJhd2NhbGxCdXR0b25fY2xpY2tlZCgpCit7CisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsICE9IE5VTEwpCisgICAgeworICAgICAgICBRTW9kZWxJbmRleCBpbmRleCA9IHVpLT50cmVlVmlldy0+Y3VycmVudEluZGV4KCk7CisKKyAgICAgICAgaW5kZXggPSBtYXBUcmVlSW5kZXhUb01vZGVsKGluZGV4KTsKKworICAgICAgICBRTW9kZWxJbmRleCBpbmRleEFib3ZlPSBpbmRleC5zaWJsaW5nKGluZGV4LnJvdygpLTEsIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW50cnlwb2ludE5hbWUpOworICAgICAgICB3aGlsZSAoaW5kZXhBYm92ZS5pc1ZhbGlkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqKWluZGV4QWJvdmUuaW50ZXJuYWxQb2ludGVyKCk7CisgICAgICAgICAgICBpZiAocEhlYWRlciAhPSBOVUxMICYmIG1fcFRyYWNlRmlsZU1vZGVsLT5pc0RyYXdDYWxsKChWS1RSQUNFX1RSQUNFX1BBQ0tFVF9JRClwSGVhZGVyLT5wYWNrZXRfaWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdEFwaWNhbGxNb2RlbEluZGV4KGluZGV4QWJvdmUsIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgIHVpLT50cmVlVmlldy0+c2V0Rm9jdXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRoYXQgcm93IGlzIG5vdCBhIGRyYXcgY2FsbCwgc28gY2hlY2sgdGhlIHByZXYgb25lCisgICAgICAgICAgICBpbmRleEFib3ZlID0gaW5kZXhBYm92ZS5zaWJsaW5nKGluZGV4QWJvdmUucm93KCktMSwgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1FNb2RlbEluZGV4IHZrdHJhY2V2aWV3ZXI6Om1hcFRyZWVJbmRleFRvTW9kZWwoY29uc3QgUU1vZGVsSW5kZXgmIHRyZWVJbmRleCkgY29uc3QKK3sKKyAgICBpZiAobV9wUHJveHlNb2RlbCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcFByb3h5TW9kZWwtPm1hcFRvU291cmNlKHRyZWVJbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIHRyZWVJbmRleDsKK30KKworUU1vZGVsSW5kZXggdmt0cmFjZXZpZXdlcjo6bWFwVHJlZUluZGV4RnJvbU1vZGVsKGNvbnN0IFFNb2RlbEluZGV4JiBtb2RlbEluZGV4KSBjb25zdAoreworICAgIGlmIChtX3BQcm94eU1vZGVsICE9IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gbV9wUHJveHlNb2RlbC0+bWFwRnJvbVNvdXJjZShtb2RlbEluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kZWxJbmRleDsKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpvbl9uZXh0RHJhd2NhbGxCdXR0b25fY2xpY2tlZCgpCit7CisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsICE9IE5VTEwpCisgICAgeworICAgICAgICBRTW9kZWxJbmRleCBpbmRleCA9IHVpLT50cmVlVmlldy0+Y3VycmVudEluZGV4KCk7CisKKyAgICAgICAgaW5kZXggPSBtYXBUcmVlSW5kZXhUb01vZGVsKGluZGV4KTsKKworICAgICAgICBRTW9kZWxJbmRleCBpbmRleEJlbG93ID0gaW5kZXguc2libGluZyhpbmRleC5yb3coKSsxLCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0VudHJ5cG9pbnROYW1lKTsKKyAgICAgICAgd2hpbGUgKGluZGV4QmVsb3cuaXNWYWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIgPSAodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKilpbmRleEJlbG93LmludGVybmFsUG9pbnRlcigpOworICAgICAgICAgICAgaWYgKHBIZWFkZXIgIT0gTlVMTCAmJiBtX3BUcmFjZUZpbGVNb2RlbC0+aXNEcmF3Q2FsbCgoVktUUkFDRV9UUkFDRV9QQUNLRVRfSUQpcEhlYWRlci0+cGFja2V0X2lkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RBcGljYWxsTW9kZWxJbmRleChpbmRleEJlbG93LCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB1aS0+dHJlZVZpZXctPnNldEZvY3VzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0aGF0IHJvdyBpcyBub3QgYSBkcmF3IGNhbGwsIHNvIGNoZWNrIHRoZSBuZXh0IG9uZQorICAgICAgICAgICAgaW5kZXhCZWxvdyA9IGluZGV4QmVsb3cuc2libGluZyhpbmRleEJlbG93LnJvdygpKzEsIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW50cnlwb2ludE5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX3NlYXJjaFRleHRCb3hfcmV0dXJuUHJlc3NlZCgpCit7CisgICAgaWYgKG1fcFRyYWNlRmlsZU1vZGVsICE9IE5VTEwpCisgICAgeworICAgICAgICBRTW9kZWxJbmRleCBpbmRleCA9IHVpLT50cmVlVmlldy0+aW5kZXhCZWxvdyh1aS0+dHJlZVZpZXctPmN1cnJlbnRJbmRleCgpKTsKKyAgICAgICAgYm9vbCBiRm91bmQgPSBmYWxzZTsKKworICAgICAgICAvLyBzZWFyY2ggZG93biBmcm9tIHRoZSBjdXJyZW50IGluZGV4CisgICAgICAgIHdoaWxlIChpbmRleC5pc1ZhbGlkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fcFRyYWNlRmlsZU1vZGVsLT5jb2x1bW5Db3VudChpbmRleCk7IGNvbHVtbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX3BUcmFjZUZpbGVNb2RlbC0+ZGF0YShtX3BUcmFjZUZpbGVNb2RlbC0+aW5kZXgoaW5kZXgucm93KCksIGNvbHVtbiwgaW5kZXgucGFyZW50KCkpLCBRdDo6RGlzcGxheVJvbGUpLnRvU3RyaW5nKCkuY29udGFpbnModWktPnNlYXJjaFRleHRCb3gtPnRleHQoKSwgUXQ6OkNhc2VJbnNlbnNpdGl2ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiRm91bmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2Fzbid0IGZvdW5kIGluIHRoYXQgcm93LCBzbyBjaGVjayB0aGUgbmV4dCBvbmUKKyAgICAgICAgICAgICAgICBpbmRleCA9IHVpLT50cmVlVmlldy0+aW5kZXhCZWxvdyhpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBub3QgZm91bmQgeWV0LCB0aGVuIHNlYXJjaCBmcm9tIHRoZSByb290IGRvd24gdG8gdGhlIGN1cnJlbnQgbm9kZQorICAgICAgICBpZiAoIWJGb3VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXggPSBtX3BUcmFjZUZpbGVNb2RlbC0+aW5kZXgoMCwgMCk7CisKKyAgICAgICAgICAgIHdoaWxlIChpbmRleC5pc1ZhbGlkKCkgJiYgaW5kZXggIT0gdWktPnRyZWVWaWV3LT5jdXJyZW50SW5kZXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBtX3BUcmFjZUZpbGVNb2RlbC0+Y29sdW1uQ291bnQoaW5kZXgpOyBjb2x1bW4rKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUcmFjZUZpbGVNb2RlbC0+ZGF0YShtX3BUcmFjZUZpbGVNb2RlbC0+aW5kZXgoaW5kZXgucm93KCksIGNvbHVtbiwgaW5kZXgucGFyZW50KCkpLCBRdDo6RGlzcGxheVJvbGUpLnRvU3RyaW5nKCkuY29udGFpbnModWktPnNlYXJjaFRleHRCb3gtPnRleHQoKSwgUXQ6OkNhc2VJbnNlbnNpdGl2ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChiRm91bmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Fzbid0IGZvdW5kIGluIHRoYXQgcm93LCBzbyBjaGVjayB0aGUgbmV4dCBvbmUKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB1aS0+dHJlZVZpZXctPmluZGV4QmVsb3coaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChiRm91bmQgJiYgaW5kZXguaXNWYWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBhIHZhbGlkIGl0ZW0gd2FzIGZvdW5kLCBzY3JvbGwgdG8gaXQgYW5kIHNlbGVjdCBpdAorICAgICAgICAgICAgc2VsZWN0QXBpY2FsbE1vZGVsSW5kZXgoaW5kZXgsIHRydWUsIHRydWUpOworICAgICAgICAgICAgdWktPnNlYXJjaFRleHRCb3gtPnNldEZvY3VzKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyBpdGVtcyB3ZXJlIGZvdW5kLCBzbyBzZXQgdGhlIHRleHRib3ggYmFja2dyb3VuZCB0byByZWQgKGl0IHdpbGwgZ2V0IGNsZWFyZWQgdG8gdGhlIG9yaWdpbmFsIGNvbG9yIGlmIHRoZSB1c2VyIGVkaXRzIHRoZSBzZWFyY2ggdGV4dCkKKyAgICAgICAgICAgIFFQYWxldHRlIHBhbGV0dGUodWktPnNlYXJjaFRleHRCb3gtPnBhbGV0dGUoKSk7CisgICAgICAgICAgICBwYWxldHRlLnNldENvbG9yKFFQYWxldHRlOjpCYXNlLCBRdDo6cmVkKTsKKyAgICAgICAgICAgIHVpLT5zZWFyY2hUZXh0Qm94LT5zZXRQYWxldHRlKHBhbGV0dGUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Om9uX2NvbnRleHRDb21ib0JveF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCkKK3sKK30KKwordm9pZCB2a3RyYWNldmlld2VyOjpwcm9tcHRfZ2VuZXJhdGVfdHJhY2UoKQoreworICAgIG1fYkdlbmVyYXRpbmdUcmFjZSA9IHRydWU7CisKKyAgICBib29sIGJTaG93RGlhbG9nID0gdHJ1ZTsKKyAgICB3aGlsZSAoYlNob3dEaWFsb2cpCisgICAgeworICAgICAgICBpbnQgY29kZSA9IG1fcEdlbmVyYXRlVHJhY2VEaWFsb2ctPmV4ZWMoKTsKKyAgICAgICAgaWYgKGNvZGUgIT0gdmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZzo6U3VjY2VlZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBtX2JHZW5lcmF0aW5nVHJhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGJTaG93RGlhbG9nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBRRmlsZUluZm8gZmlsZUluZm8obV9wR2VuZXJhdGVUcmFjZURpYWxvZy0+Z2V0X3RyYWNlX2ZpbGVfcGF0aCgpKTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IHZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6OlN1Y2NlZWRlZCAmJgorICAgICAgICAgICAgICAgIGZpbGVJbmZvLmV4aXN0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJTaG93RGlhbG9nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHByb21wdF9sb2FkX25ld190cmFjZShmaWxlSW5mby5jYW5vbmljYWxGaWxlUGF0aCgpKSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGRlY2lkZWQgbm90IHRvIGxvYWQgdGhlIHRyYWNlIGZpbGUsIHNvIGNsZWFyIHRoZSBnZW5lcmF0aW5nVHJhY2UgZmxhZy4KKyAgICAgICAgICAgICAgICAgICAgbV9iR2VuZXJhdGluZ1RyYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ0Vycm9yKCJGYWlsZWQgdG8gdHJhY2UgdGhlIGFwcGxpY2F0aW9uLiIpOworICAgICAgICAgICAgICAgIFFNZXNzYWdlQm94Ojpjcml0aWNhbCh0aGlzLCAiRXJyb3IiLCAiRmFpbGVkIHRvIHRyYWNlIGFwcGxpY2F0aW9uLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXI6Ok9uT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IFFTdHJpbmcgJm1lc3NhZ2UpCit7CisgICAgT25PdXRwdXRNZXNzYWdlKGxldmVsLCAtMSwgbWVzc2FnZSk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcjo6T25PdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCwgdWludDY0X3QgcGFja2V0SW5kZXgsIGNvbnN0IFFTdHJpbmcgJm1lc3NhZ2UpCit7CisgICAgc3dpdGNoKGxldmVsKQorICAgIHsKKyAgICAgICAgY2FzZSBWS1RSQUNFX0xPR19FUlJPUjoKKyAgICAgICAgeworICAgICAgICAgICAgZ3NfT1VUUFVULmVycm9yKHBhY2tldEluZGV4LCBtZXNzYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVktUUkFDRV9MT0dfV0FSTklORzoKKyAgICAgICAgeworICAgICAgICAgICAgZ3NfT1VUUFVULndhcm5pbmcocGFja2V0SW5kZXgsIG1lc3NhZ2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBWS1RSQUNFX0xPR19ERUJVRzoKKyAgICAgICAgY2FzZSBWS1RSQUNFX0xPR19WRVJCT1NFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBnc19PVVRQVVQubWVzc2FnZShwYWNrZXRJbmRleCwgbWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXIuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODIzYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlci5oCkBAIC0wLDAgKzEsMTc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBWS1RSQUNFVklFV0VSX0gKKyNkZWZpbmUgVktUUkFDRVZJRVdFUl9ICisKKyNpbmNsdWRlIDxRTWFpbldpbmRvdz4KKyNpbmNsdWRlIDxRU3RyaW5nPgorI2luY2x1ZGUgPFFUaHJlYWQ+CisKKyNpbmNsdWRlICJ2a3JlcGxheV9zZXEuaCIKKyNpbmNsdWRlICJ2a3JlcGxheV9mYWN0b3J5LmgiCisKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3ZpZXcuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3F0aW1lbGluZXZpZXcuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9xZ2VuZXJhdGV0cmFjZWRpYWxvZy5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfcXNldHRpbmdzZGlhbG9nLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9zZXR0aW5ncy5oIgorCituYW1lc3BhY2UgVWkKK3sKKyAgICBjbGFzcyB2a3RyYWNldmlld2VyOworfQorCitjbGFzcyBRR3JpZExheW91dDsKK2NsYXNzIFFNb2RlbEluZGV4OworY2xhc3MgUVByb2Nlc3M7CitjbGFzcyBRUHJvY2Vzc0Vudmlyb25tZW50OworY2xhc3MgUVRvb2xCdXR0b247CisKK2NsYXNzIHZrdHJhY2V2aWV3ZXIgOiBwdWJsaWMgUU1haW5XaW5kb3csIHB1YmxpYyB2a3RyYWNldmlld2VyX3ZpZXcKK3sKKyAgICBRX09CSkVDVAorCisgICAgZW51bSBQcm9tcHRfUmVzdWx0CisgICAgeworICAgICAgICB2a3RyYWNldmlld2VyX3Byb21wdF9lcnJvciA9IC0xLAorICAgICAgICB2a3RyYWNldmlld2VyX3Byb21wdF9jYW5jZWxsZWQgPSAwLAorICAgICAgICB2a3RyYWNldmlld2VyX3Byb21wdF9zdWNjZXNzID0gMQorICAgIH07CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCB2a3RyYWNldmlld2VyKFFXaWRnZXQgKnBhcmVudCA9IDApOworICAgIH52a3RyYWNldmlld2VyKCk7CisKKyAgICB2b2lkIG9wZW5fdHJhY2VfZmlsZV90aHJlYWRlZChjb25zdCBRU3RyaW5nICZmaWxlbmFtZSk7CisgICAgdm9pZCBjbG9zZV90cmFjZV9maWxlKCk7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB2a3RyYWNldmlld2VyX3ZpZXcKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXRfdmlldygpOworCisKKyAgICB2b2lkIExvZ0Fsd2F5cyhjb25zdCBRU3RyaW5nICZtZXNzYWdlKTsKKyAgICB2b2lkIExvZ1dhcm5pbmcoY29uc3QgUVN0cmluZyYgbWVzc2FnZSk7CisgICAgdm9pZCBMb2dFcnJvcihjb25zdCBRU3RyaW5nJiBtZXNzYWdlKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX3NldHRpbmdfZ3JvdXAodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBHcm91cCk7CisgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0X2dsb2JhbF9zZXR0aW5ncyh2a3RyYWNlX1NldHRpbmdHcm91cCoqIHBwR3JvdXBzKTsKKyAgICB2aXJ0dWFsIGludCBhZGRfY3VzdG9tX3N0YXRlX3ZpZXdlcihRV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBRU3RyaW5nJiB0aXRsZSwgYm9vbCBiQnJpbmdUb0Zyb250ID0gZmFsc2UpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVfY3VzdG9tX3N0YXRlX3ZpZXdlcihpbnQgdGFiSW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBlbmFibGVfY3VzdG9tX3N0YXRlX3ZpZXdlcihRV2lkZ2V0KiBwV2lkZ2V0LCBib29sIGJFbmFibGVkKTsKKyAgICB2aXJ0dWFsIFFUb29sQnV0dG9uKiBhZGRfdG9vbGJhcl9idXR0b24oY29uc3QgUVN0cmluZyYgdGl0bGUsIGJvb2wgYkVuYWJsZWQpOworICAgIHZpcnR1YWwgdm9pZCBhZGRfY2FsbHRyZWVfY29udGV4dG1lbnVfaXRlbShRQWN0aW9uKiBwQWN0aW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X2NhbGx0cmVlX21vZGVsKHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsKiBwVHJhY2VGaWxlTW9kZWwsIFFBYnN0cmFjdFByb3h5TW9kZWwgKnBNb2RlbCk7CisgICAgdmlydHVhbCB2b2lkIHNlbGVjdF9jYWxsX2F0X3BhY2tldF9pbmRleCh1bnNpZ25lZCBsb25nIGxvbmcgcGFja2V0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBoaWdobGlnaHRfdGltZWxpbmVfaXRlbSh1bnNpZ25lZCBsb25nIGxvbmcgcGFja2V0QXJyYXlJbmRleCwgYm9vbCBiU2Nyb2xsVG8sIGJvb2wgYlNlbGVjdCk7CisgICAgdmlydHVhbCB2b2lkIG9uX3JlcGxheV9zdGF0ZV9jaGFuZ2VkKGJvb2wgYlJlcGxheUluUHJvZ3Jlc3MpOworICAgIHZpcnR1YWwgdW5zaWduZWQgbG9uZyBsb25nIGdldF9jdXJyZW50X3BhY2tldF9pbmRleCgpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gcmUtaW1wbGVtZW50ZWQgZnJvbSBRTWFpbldpbmRvdworICAgIHZpcnR1YWwgdm9pZCBtb3ZlRXZlbnQoUU1vdmVFdmVudCAqcEV2ZW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2VFdmVudChRQ2xvc2VFdmVudCAqcEV2ZW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICpwRXZlbnQpOworCitzaWduYWxzOgorICAgIHZvaWQgTG9hZFRyYWNlRmlsZShjb25zdCBRU3RyaW5nJiBmaWxlbmFtZSk7CisKK3B1YmxpYyBzbG90czoKKworcHJpdmF0ZSBzbG90czoKKyAgICB2b2lkIG9uX2FjdGlvbl9PcGVuX3RyaWdnZXJlZCgpOworICAgIHZvaWQgb25fYWN0aW9uX0Nsb3NlX3RyaWdnZXJlZCgpOworICAgIHZvaWQgb25fYWN0aW9uRV94aXRfdHJpZ2dlcmVkKCk7CisgICAgdm9pZCBvbl9hY3Rpb25FeHBvcnRfQVBJX0NhbGxzX3RyaWdnZXJlZCgpOworICAgIHZvaWQgb25fYWN0aW9uRWRpdF90cmlnZ2VyZWQoKTsKKworICAgIHZvaWQgb25fc2V0dGluZ3NEaWFsb2dSZXNpemVkKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCk7CisgICAgdm9pZCBvbl9zZXR0aW5nc1NhdmVkKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwVXBkYXRlZFNldHRpbmdzLCB1bnNpZ25lZCBpbnQgbnVtR3JvdXBzKTsKKworICAgIHZvaWQgb25UcmFjZUZpbGVMb2FkZWQoYm9vbCBiU3VjY2VzcywgY29uc3Qgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8mIGZpbGVJbmZvLCBjb25zdCBRU3RyaW5nJiBjb250cm9sbGVyRmlsZW5hbWUpOworCisgICAgdm9pZCBvbl90cmVlVmlld19jbGlja2VkKGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCk7CisgICAgdm9pZCBzbG90X3RpbWVsaW5lX2NsaWNrZWQoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KTsKKworICAgIHZvaWQgb25fc2VhcmNoVGV4dEJveF90ZXh0Q2hhbmdlZChjb25zdCBRU3RyaW5nICZzZWFyY2hUZXh0KTsKKyAgICB2b2lkIG9uX3NlYXJjaE5leHRCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fc2VhcmNoUHJldkJ1dHRvbl9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9wcmV2RHJhd2NhbGxCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fbmV4dERyYXdjYWxsQnV0dG9uX2NsaWNrZWQoKTsKKworICAgIHZvaWQgb25fc2VhcmNoVGV4dEJveF9yZXR1cm5QcmVzc2VkKCk7CisKKyAgICB2b2lkIG9uX2NvbnRleHRDb21ib0JveF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCk7CisKKyAgICB2b2lkIHByb21wdF9nZW5lcmF0ZV90cmFjZSgpOworCisgICAgdm9pZCBPbk91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsIGxldmVsLCB1aW50NjRfdCBwYWNrZXRJbmRleCwgY29uc3QgUVN0cmluZyYgbWVzc2FnZSk7CisgICAgdm9pZCBPbk91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBRU3RyaW5nJiBtZXNzYWdlKTsKKworICAgIHZvaWQgb25faHlwZXJsaW5rQ2xpY2tlZChjb25zdCBRVXJsJiBsaW5rKTsKKworcHJpdmF0ZToKKyAgICBVaTo6dmt0cmFjZXZpZXdlciAqdWk7CisgICAgUVdpZGdldCogbV9wVHJhY2VTdGF0c1RhYjsKKyAgICBRR3JpZExheW91dCogbV9wVHJhY2VTdGF0c1RhYkxheW91dDsKKyAgICBRVGV4dEJyb3dzZXIqIG1fcFRyYWNlU3RhdHNUYWJUZXh0OworCisgICAgUVRocmVhZCBtX3RyYWNlTG9hZGVyVGhyZWFkOworICAgIHZrdHJhY2V2aWV3ZXJfUVNldHRpbmdzRGlhbG9nIG1fc2V0dGluZ3NEaWFsb2c7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHVzZXIgY2hvc2UgdG8gbG9hZCB0aGUgZmlsZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSB1c2VyIGRlY2lkZWQgTk9UIHRvIGxvYWQgdGhlIGZpbGUuCisgICAgYm9vbCBwcm9tcHRfbG9hZF9uZXdfdHJhY2UoY29uc3QgUVN0cmluZyAmdHJhY2VmaWxlKTsKKworICAgIC8vIFNjYW4gdGhlIHRyYWNlIGZpbGUgcGFja2V0cyB0byBleHRyYWN0IEFQSSB1c2FnZSBzdGF0cworICAgIHZvaWQgR2VuZXJhdGVUcmFjZUZpbGVTdGF0cygpOworCisgICAgdm9pZCByZXNldF90cmFjZWZpbGVfdWkoKTsKKworICAgIHZvaWQgc2VsZWN0QXBpY2FsbE1vZGVsSW5kZXgoUU1vZGVsSW5kZXggaW5kZXgsIGJvb2wgc2Nyb2xsVG8sIGJvb2wgc2VsZWN0KTsKKyAgICBRTW9kZWxJbmRleCBtYXBUcmVlSW5kZXhUb01vZGVsKGNvbnN0IFFNb2RlbEluZGV4JiB0cmVlSW5kZXgpIGNvbnN0OworICAgIFFNb2RlbEluZGV4IG1hcFRyZWVJbmRleEZyb21Nb2RlbChjb25zdCBRTW9kZWxJbmRleCYgbW9kZWxJbmRleCkgY29uc3Q7CisKKyAgICBzdGF0aWMgZmxvYXQgdTY0VG9GbG9hdCh1aW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCBidWlsZF90aW1lbGluZV9tb2RlbCgpOworCisgICAgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8gbV90cmFjZUZpbGVJbmZvOworICAgIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsKiBtX3BUcmFjZUZpbGVNb2RlbDsKKyAgICBRQWJzdHJhY3RQcm94eU1vZGVsKiBtX3BQcm94eU1vZGVsOworCisgICAgdmt0cmFjZXZpZXdlcl9jb250cm9sbGVyX2ZhY3RvcnkgbV9jb250cm9sbGVyRmFjdG9yeTsKKyAgICB2a3RyYWNldmlld2VyX1FDb250cm9sbGVyKiBtX3BDb250cm9sbGVyOworCisgICAgUVRvb2xCdXR0b24gKm1fcEdlbmVyYXRlVHJhY2VCdXR0b247CisKKyAgICB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXcqIG1fcFRpbWVsaW5lOworICAgIHZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2cqIG1fcEdlbmVyYXRlVHJhY2VEaWFsb2c7CisKKyAgICBRQ29sb3IgbV9zZWFyY2hUZXh0Ym94QmFja2dyb3VuZENvbG9yOworICAgIGJvb2wgbV9iRGVsYXlVcGRhdGVVSUZvckNvbnRleHQ7CisgICAgYm9vbCBtX2JHZW5lcmF0aW5nVHJhY2U7Cit9OworCisjZW5kaWYgLy8gVktUUkFDRVZJRVdFUl9ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyLnVpIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlci51aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRjOTgzCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlci51aQpAQCAtMCwwICsxLDM3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx1aSB2ZXJzaW9uPSI0LjAiPgorIDxjbGFzcz52a3RyYWNldmlld2VyPC9jbGFzcz4KKyA8d2lkZ2V0IGNsYXNzPSJRTWFpbldpbmRvdyIgbmFtZT0idmt0cmFjZXZpZXdlciI+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICA8cmVjdD4KKyAgICA8eD4wPC94PgorICAgIDx5PjA8L3k+CisgICAgPHdpZHRoPjEwMjU8L3dpZHRoPgorICAgIDxoZWlnaHQ+NzY4PC9oZWlnaHQ+CisgICA8L3JlY3Q+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dUaXRsZSI+CisgICA8c3RyaW5nPlZrVHJhY2UgVmlld2VyPC9zdHJpbmc+CisgIDwvcHJvcGVydHk+CisgIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9ImNlbnRyYWxXaWRnZXQiPgorICAgPGxheW91dCBjbGFzcz0iUUdyaWRMYXlvdXQiIG5hbWU9ImdyaWRMYXlvdXRfMyI+CisgICAgPGl0ZW0gcm93PSIwIiBjb2x1bW49IjAiPgorICAgICA8d2lkZ2V0IGNsYXNzPSJRU3BsaXR0ZXIiIG5hbWU9InNwbGl0dGVyXzMiPgorICAgICAgPHByb3BlcnR5IG5hbWU9InNpemVQb2xpY3kiPgorICAgICAgIDxzaXplcG9saWN5IGhzaXpldHlwZT0iUHJlZmVycmVkIiB2c2l6ZXR5cGU9IkV4cGFuZGluZyI+CisgICAgICAgIDxob3JzdHJldGNoPjA8L2hvcnN0cmV0Y2g+CisgICAgICAgIDx2ZXJzdHJldGNoPjE8L3ZlcnN0cmV0Y2g+CisgICAgICAgPC9zaXplcG9saWN5PgorICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmllbnRhdGlvbiI+CisgICAgICAgPGVudW0+UXQ6OlZlcnRpY2FsPC9lbnVtPgorICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDx3aWRnZXQgY2xhc3M9IlFTcGxpdHRlciIgbmFtZT0ic3BsaXR0ZXJfMiI+CisgICAgICAgPHByb3BlcnR5IG5hbWU9InNpemVQb2xpY3kiPgorICAgICAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9IlByZWZlcnJlZCIgdnNpemV0eXBlPSJFeHBhbmRpbmciPgorICAgICAgICAgPGhvcnN0cmV0Y2g+MDwvaG9yc3RyZXRjaD4KKyAgICAgICAgIDx2ZXJzdHJldGNoPjU8L3ZlcnN0cmV0Y2g+CisgICAgICAgIDwvc2l6ZXBvbGljeT4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmllbnRhdGlvbiI+CisgICAgICAgIDxlbnVtPlF0OjpWZXJ0aWNhbDwvZW51bT4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9InRpbWVsaW5lTGF5b3V0V2lkZ2V0Ij4KKyAgICAgICAgPGxheW91dCBjbGFzcz0iUVZCb3hMYXlvdXQiIG5hbWU9InRpbWVsaW5lTGF5b3V0IiBzdHJldGNoPSIwIj4KKyAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFjaW5nIj4KKyAgICAgICAgICA8bnVtYmVyPjY8L251bWJlcj4KKyAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZUNvbnN0cmFpbnQiPgorICAgICAgICAgIDxlbnVtPlFMYXlvdXQ6OlNldERlZmF1bHRDb25zdHJhaW50PC9lbnVtPgorICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21NYXJnaW4iPgorICAgICAgICAgIDxudW1iZXI+MDwvbnVtYmVyPgorICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgIDxpdGVtPgorICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFHcmFwaGljc1ZpZXciIG5hbWU9InRpbWVsaW5lVmlld1BsYWNlaG9sZGVyIi8+CisgICAgICAgICA8L2l0ZW0+CisgICAgICAgIDwvbGF5b3V0PgorICAgICAgIDwvd2lkZ2V0PgorICAgICAgIDx3aWRnZXQgY2xhc3M9IlFTcGxpdHRlciIgbmFtZT0ic3BsaXR0ZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSI+CisgICAgICAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9IkV4cGFuZGluZyIgdnNpemV0eXBlPSJFeHBhbmRpbmciPgorICAgICAgICAgIDxob3JzdHJldGNoPjA8L2hvcnN0cmV0Y2g+CisgICAgICAgICAgPHZlcnN0cmV0Y2g+OTwvdmVyc3RyZXRjaD4KKyAgICAgICAgIDwvc2l6ZXBvbGljeT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9yaWVudGF0aW9uIj4KKyAgICAgICAgIDxlbnVtPlF0OjpIb3Jpem9udGFsPC9lbnVtPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJ0cmFjZU5hdmlnYXRpb25MYXlvdXRXaWRnZXQiPgorICAgICAgICAgPGxheW91dCBjbGFzcz0iUUhCb3hMYXlvdXQiIG5hbWU9Imhvcml6b250YWxMYXlvdXQiIHN0cmV0Y2g9IjAiPgorICAgICAgICAgIDxpdGVtPgorICAgICAgICAgICA8bGF5b3V0IGNsYXNzPSJRVkJveExheW91dCIgbmFtZT0idHJhY2VOYXZpZ2F0aW9uTGF5b3V0IiBzdHJldGNoPSIwLDAiPgorICAgICAgICAgICAgPGl0ZW0+CisgICAgICAgICAgICAgPGxheW91dCBjbGFzcz0iUUhCb3hMYXlvdXQiIG5hbWU9Imhvcml6b250YWxMYXlvdXRfNCI+CisgICAgICAgICAgICAgIDxpdGVtPgorICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9InByZXZEcmF3Y2FsbEJ1dHRvbiI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heGltdW1TaXplIj4KKyAgICAgICAgICAgICAgICAgPHNpemU+CisgICAgICAgICAgICAgICAgICA8d2lkdGg+NjU8L3dpZHRoPgorICAgICAgICAgICAgICAgICAgPGhlaWdodD4xNjc3NzIxNTwvaGVpZ2h0PgorICAgICAgICAgICAgICAgICA8L3NpemU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgICAgICAgICAgICAgIDxzdHJpbmc+SnVtcCB0byBwcmV2aW91cyBkcmF3IGNhbGw8L3N0cmluZz4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgPHN0cmluZz5QcmV2IERDPC9zdHJpbmc+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8L2l0ZW0+CisgICAgICAgICAgICAgIDxpdGVtPgorICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9Im5leHREcmF3Y2FsbEJ1dHRvbiI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heGltdW1TaXplIj4KKyAgICAgICAgICAgICAgICAgPHNpemU+CisgICAgICAgICAgICAgICAgICA8d2lkdGg+NjU8L3dpZHRoPgorICAgICAgICAgICAgICAgICAgPGhlaWdodD4xNjc3NzIxNTwvaGVpZ2h0PgorICAgICAgICAgICAgICAgICA8L3NpemU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgICAgICAgICAgICAgIDxzdHJpbmc+SnVtcCB0byBuZXh0IGRyYXcgY2FsbDwvc3RyaW5nPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgICAgICAgICAgICA8c3RyaW5nPk5leHQgREM8L3N0cmluZz4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDwvaXRlbT4KKyAgICAgICAgICAgICAgPGl0ZW0+CisgICAgICAgICAgICAgICA8c3BhY2VyIG5hbWU9Imhvcml6b250YWxTcGFjZXIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmllbnRhdGlvbiI+CisgICAgICAgICAgICAgICAgIDxlbnVtPlF0OjpIb3Jpem9udGFsPC9lbnVtPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNpemVIaW50IiBzdGRzZXQ9IjAiPgorICAgICAgICAgICAgICAgICA8c2l6ZT4KKyAgICAgICAgICAgICAgICAgIDx3aWR0aD40MDwvd2lkdGg+CisgICAgICAgICAgICAgICAgICA8aGVpZ2h0PjIwPC9oZWlnaHQ+CisgICAgICAgICAgICAgICAgIDwvc2l6ZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgPC9zcGFjZXI+CisgICAgICAgICAgICAgIDwvaXRlbT4KKyAgICAgICAgICAgICAgPGl0ZW0+CisgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJRTGluZUVkaXQiIG5hbWU9InNlYXJjaFRleHRCb3giPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXhpbXVtU2l6ZSI+CisgICAgICAgICAgICAgICAgIDxzaXplPgorICAgICAgICAgICAgICAgICAgPHdpZHRoPjIwMDwvd2lkdGg+CisgICAgICAgICAgICAgICAgICA8aGVpZ2h0PjE2Nzc3MjE1PC9oZWlnaHQ+CisgICAgICAgICAgICAgICAgIDwvc2l6ZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbGFjZWhvbGRlclRleHQiPgorICAgICAgICAgICAgICAgICA8c3RyaW5nPlNlYXJjaDwvc3RyaW5nPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPC9pdGVtPgorICAgICAgICAgICAgICA8aXRlbT4KKyAgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJzZWFyY2hQcmV2QnV0dG9uIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4aW11bVNpemUiPgorICAgICAgICAgICAgICAgICA8c2l6ZT4KKyAgICAgICAgICAgICAgICAgIDx3aWR0aD40MDwvd2lkdGg+CisgICAgICAgICAgICAgICAgICA8aGVpZ2h0PjE2Nzc3MjE1PC9oZWlnaHQ+CisgICAgICAgICAgICAgICAgIDwvc2l6ZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sVGlwIj4KKyAgICAgICAgICAgICAgICAgPHN0cmluZz5KdW1wIHRvIHByZXZpb3VzIG9jY3VycmVuY2U8L3N0cmluZz4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgPHN0cmluZz5QcmV2PC9zdHJpbmc+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8L2l0ZW0+CisgICAgICAgICAgICAgIDxpdGVtPgorICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9InNlYXJjaE5leHRCdXR0b24iPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXhpbXVtU2l6ZSI+CisgICAgICAgICAgICAgICAgIDxzaXplPgorICAgICAgICAgICAgICAgICAgPHdpZHRoPjQwPC93aWR0aD4KKyAgICAgICAgICAgICAgICAgIDxoZWlnaHQ+MTY3NzcyMTU8L2hlaWdodD4KKyAgICAgICAgICAgICAgICAgPC9zaXplPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2xUaXAiPgorICAgICAgICAgICAgICAgICA8c3RyaW5nPkp1bXAgdG8gbmV4dCBvY2N1cnJlbmNlPC9zdHJpbmc+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICAgICAgICAgICAgIDxzdHJpbmc+TmV4dDwvc3RyaW5nPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPC9pdGVtPgorICAgICAgICAgICAgIDwvbGF5b3V0PgorICAgICAgICAgICAgPC9pdGVtPgorICAgICAgICAgICAgPGl0ZW0+CisgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iUVRyZWVWaWV3IiBuYW1lPSJ0cmVlVmlldyI+CisgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgICAgICAgICAgICAgIDxzaXplcG9saWN5IGhzaXpldHlwZT0iRXhwYW5kaW5nIiB2c2l6ZXR5cGU9IkV4cGFuZGluZyI+CisgICAgICAgICAgICAgICAgPGhvcnN0cmV0Y2g+MTwvaG9yc3RyZXRjaD4KKyAgICAgICAgICAgICAgICA8dmVyc3RyZXRjaD4wPC92ZXJzdHJldGNoPgorICAgICAgICAgICAgICAgPC9zaXplcG9saWN5PgorICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgPC9pdGVtPgorICAgICAgICAgICA8L2xheW91dD4KKyAgICAgICAgICA8L2l0ZW0+CisgICAgICAgICA8L2xheW91dD4KKyAgICAgICAgPC93aWRnZXQ+CisgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9InNuYXBzaG90TGF5b3V0V2lkZ2V0Ij4KKyAgICAgICAgIDxsYXlvdXQgY2xhc3M9IlFWQm94TGF5b3V0IiBuYW1lPSJzbmFwc2hvdExheW91dCI+CisgICAgICAgICAgPGl0ZW0+CisgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFDb21ib0JveCIgbmFtZT0iY29udGV4dENvbWJvQm94Ii8+CisgICAgICAgICAgPC9pdGVtPgorICAgICAgICAgIDxpdGVtPgorICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJRVGFiV2lkZ2V0IiBuYW1lPSJzdGF0ZVRhYldpZGdldCI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSI+CisgICAgICAgICAgICAgPHNpemVwb2xpY3kgaHNpemV0eXBlPSJFeHBhbmRpbmciIHZzaXpldHlwZT0iRXhwYW5kaW5nIj4KKyAgICAgICAgICAgICAgPGhvcnN0cmV0Y2g+MjwvaG9yc3RyZXRjaD4KKyAgICAgICAgICAgICAgPHZlcnN0cmV0Y2g+MDwvdmVyc3RyZXRjaD4KKyAgICAgICAgICAgICA8L3NpemVwb2xpY3k+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhYlNoYXBlIj4KKyAgICAgICAgICAgICA8ZW51bT5RVGFiV2lkZ2V0OjpSb3VuZGVkPC9lbnVtPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50SW5kZXgiPgorICAgICAgICAgICAgIDxudW1iZXI+MDwvbnVtYmVyPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9InN0YXRlVGFiIj4KKyAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIj4KKyAgICAgICAgICAgICAgPHN0cmluZz5TdGF0ZTwvc3RyaW5nPgorICAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgIDxsYXlvdXQgY2xhc3M9IlFWQm94TGF5b3V0IiBuYW1lPSJ2ZXJ0aWNhbExheW91dF8zIj4KKyAgICAgICAgICAgICAgPGl0ZW0+CisgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJRVHJlZVZpZXciIG5hbWU9InN0YXRlVHJlZVZpZXciPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgPHNpemVwb2xpY3kgaHNpemV0eXBlPSJFeHBhbmRpbmciIHZzaXpldHlwZT0iRXhwYW5kaW5nIj4KKyAgICAgICAgICAgICAgICAgIDxob3JzdHJldGNoPjA8L2hvcnN0cmV0Y2g+CisgICAgICAgICAgICAgICAgICA8dmVyc3RyZXRjaD4zPC92ZXJzdHJldGNoPgorICAgICAgICAgICAgICAgICA8L3NpemVwb2xpY3k+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8L2l0ZW0+CisgICAgICAgICAgICAgPC9sYXlvdXQ+CisgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgPC9pdGVtPgorICAgICAgICAgPC9sYXlvdXQ+CisgICAgICAgIDwvd2lkZ2V0PgorICAgICAgIDwvd2lkZ2V0PgorICAgICAgPC93aWRnZXQ+CisgICAgICA8d2lkZ2V0IGNsYXNzPSJRVGFiV2lkZ2V0IiBuYW1lPSJib3R0b21UYWJXaWRnZXQiPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW5pbXVtU2l6ZSI+CisgICAgICAgIDxzaXplPgorICAgICAgICAgPHdpZHRoPjA8L3dpZHRoPgorICAgICAgICAgPGhlaWdodD4xMDA8L2hlaWdodD4KKyAgICAgICAgPC9zaXplPgorICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhc2VTaXplIj4KKyAgICAgICAgPHNpemU+CisgICAgICAgICA8d2lkdGg+MDwvd2lkdGg+CisgICAgICAgICA8aGVpZ2h0PjEwMDwvaGVpZ2h0PgorICAgICAgICA8L3NpemU+CisgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0idGFiUG9zaXRpb24iPgorICAgICAgICA8ZW51bT5RVGFiV2lkZ2V0OjpOb3J0aDwvZW51bT4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWJTaGFwZSI+CisgICAgICAgIDxlbnVtPlFUYWJXaWRnZXQ6OlJvdW5kZWQ8L2VudW0+CisgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0iY3VycmVudEluZGV4Ij4KKyAgICAgICAgPG51bWJlcj4wPC9udW1iZXI+CisgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJvdXRwdXRUYWIiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIj4KKyAgICAgICAgIDxzdHJpbmc+T3V0cHV0PC9zdHJpbmc+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8bGF5b3V0IGNsYXNzPSJRR3JpZExheW91dCIgbmFtZT0iZ3JpZExheW91dF8yIj4KKyAgICAgICAgIDxpdGVtIHJvdz0iMCIgY29sdW1uPSIwIj4KKyAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJRVGV4dEJyb3dzZXIiIG5hbWU9Im91dHB1dFRleHRCcm93c2VyIj4KKyAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlYWRPbmx5Ij4KKyAgICAgICAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcGVuTGlua3MiPgorICAgICAgICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICA8L2l0ZW0+CisgICAgICAgIDwvbGF5b3V0PgorICAgICAgIDwvd2lkZ2V0PgorICAgICAgIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9Im1hY2hpbmVJbmZvVGFiIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+CisgICAgICAgICA8c3RyaW5nPk1hY2hpbmUgSW5mbzwvc3RyaW5nPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGxheW91dCBjbGFzcz0iUUdyaWRMYXlvdXQiIG5hbWU9ImdyaWRMYXlvdXRfNCI+CisgICAgICAgICA8aXRlbSByb3c9IjAiIGNvbHVtbj0iMCI+CisgICAgICAgICAgPHdpZGdldCBjbGFzcz0iUVRleHRCcm93c2VyIiBuYW1lPSJtYWNoaW5lSW5mb1RleHQiPgorICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGluZVdyYXBNb2RlIj4KKyAgICAgICAgICAgIDxlbnVtPlFUZXh0RWRpdDo6Tm9XcmFwPC9lbnVtPgorICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgPC9pdGVtPgorICAgICAgICA8L2xheW91dD4KKyAgICAgICA8L3dpZGdldD4KKyAgICAgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJjYWxsU3RhY2tUYWIiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIj4KKyAgICAgICAgIDxzdHJpbmc+Q2FsbCBTdGFjazwvc3RyaW5nPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGxheW91dCBjbGFzcz0iUUdyaWRMYXlvdXQiIG5hbWU9ImdyaWRMYXlvdXQiPgorICAgICAgICAgPGl0ZW0gcm93PSIwIiBjb2x1bW49IjAiPgorICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFUZXh0QnJvd3NlciIgbmFtZT0iYmFja3RyYWNlVGV4dCI+CisgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW5pbXVtU2l6ZSI+CisgICAgICAgICAgICA8c2l6ZT4KKyAgICAgICAgICAgICA8d2lkdGg+MDwvd2lkdGg+CisgICAgICAgICAgICAgPGhlaWdodD4xMDA8L2hlaWdodD4KKyAgICAgICAgICAgIDwvc2l6ZT4KKyAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhc2VTaXplIj4KKyAgICAgICAgICAgIDxzaXplPgorICAgICAgICAgICAgIDx3aWR0aD4wPC93aWR0aD4KKyAgICAgICAgICAgICA8aGVpZ2h0PjEwMDwvaGVpZ2h0PgorICAgICAgICAgICAgPC9zaXplPgorICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGluZVdyYXBNb2RlIj4KKyAgICAgICAgICAgIDxlbnVtPlFUZXh0RWRpdDo6Tm9XcmFwPC9lbnVtPgorICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgPC9pdGVtPgorICAgICAgICA8L2xheW91dD4KKyAgICAgICA8L3dpZGdldD4KKyAgICAgIDwvd2lkZ2V0PgorICAgICA8L3dpZGdldD4KKyAgICA8L2l0ZW0+CisgICA8L2xheW91dD4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFNZW51QmFyIiBuYW1lPSJtZW51QmFyIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjA8L3g+CisgICAgIDx5PjA8L3k+CisgICAgIDx3aWR0aD4xMDI1PC93aWR0aD4KKyAgICAgPGhlaWdodD4yNTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8d2lkZ2V0IGNsYXNzPSJRTWVudSIgbmFtZT0ibWVudUZpbGUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgIDxzdHJpbmc+JmFtcDtGaWxlPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8YWRkYWN0aW9uIG5hbWU9ImFjdGlvbl9PcGVuIi8+CisgICAgPGFkZGFjdGlvbiBuYW1lPSJhY3Rpb25fQ2xvc2UiLz4KKyAgICA8YWRkYWN0aW9uIG5hbWU9InNlcGFyYXRvciIvPgorICAgIDxhZGRhY3Rpb24gbmFtZT0iYWN0aW9uRXhwb3J0X0FQSV9DYWxscyIvPgorICAgIDxhZGRhY3Rpb24gbmFtZT0ic2VwYXJhdG9yIi8+CisgICAgPGFkZGFjdGlvbiBuYW1lPSJhY3Rpb25FX3hpdCIvPgorICAgPC93aWRnZXQ+CisgICA8d2lkZ2V0IGNsYXNzPSJRTWVudSIgbmFtZT0ibWVudVNldHRpbmdzIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiPgorICAgICA8c3RyaW5nPlNldHRpbmdzPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8YWRkYWN0aW9uIG5hbWU9ImFjdGlvbkVkaXQiLz4KKyAgIDwvd2lkZ2V0PgorICAgPGFkZGFjdGlvbiBuYW1lPSJtZW51RmlsZSIvPgorICAgPGFkZGFjdGlvbiBuYW1lPSJtZW51U2V0dGluZ3MiLz4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFUb29sQmFyIiBuYW1lPSJtYWluVG9vbEJhciI+CisgICA8YXR0cmlidXRlIG5hbWU9InRvb2xCYXJBcmVhIj4KKyAgICA8ZW51bT5Ub3BUb29sQmFyQXJlYTwvZW51bT4KKyAgIDwvYXR0cmlidXRlPgorICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b29sQmFyQnJlYWsiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9hdHRyaWJ1dGU+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRU3RhdHVzQmFyIiBuYW1lPSJzdGF0dXNCYXIiLz4KKyAgPGFjdGlvbiBuYW1lPSJhY3Rpb25fT3BlbiI+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz4mYW1wO09wZW4gVHJhY2UuLi48L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic2hvcnRjdXQiPgorICAgIDxzdHJpbmc+Q3RybCtPPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L2FjdGlvbj4KKyAgPGFjdGlvbiBuYW1lPSJhY3Rpb25FX3hpdCI+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5FJmFtcDt4aXQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvYWN0aW9uPgorICA8YWN0aW9uIG5hbWU9ImFjdGlvbl9DbG9zZSI+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5DbG9zZSBUcmFjZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC9hY3Rpb24+CisgIDxhY3Rpb24gbmFtZT0iYWN0aW9uRXhwb3J0X0FQSV9DYWxscyI+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5FeHBvcnQgQVBJIENhbGxzLi4uPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L2FjdGlvbj4KKyAgPGFjdGlvbiBuYW1lPSJhY3Rpb25FZGl0Ij4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nPkVkaXQuLi48L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvYWN0aW9uPgorIDwvd2lkZ2V0PgorIDxsYXlvdXRkZWZhdWx0IHNwYWNpbmc9IjYiIG1hcmdpbj0iMTEiLz4KKyA8cmVzb3VyY2VzLz4KKyA8Y29ubmVjdGlvbnMvPgorPC91aT4KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfUVJlcGxheVdpZGdldC5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RUmVwbGF5V2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwNDdjZAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfUVJlcGxheVdpZGdldC5oCkBAIC0wLDAgKzEsMjYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1ZLVFJBQ0VWSUVXRVJfUVJFUExBWVdJREdFVF9IXworI2RlZmluZSBfVktUUkFDRVZJRVdFUl9RUkVQTEFZV0lER0VUX0hfCisKKyNpbmNsdWRlIDxRV2lkZ2V0PgorI2luY2x1ZGUgPFFUaHJlYWQ+CisjaW5jbHVkZSA8UVRvb2xCYXI+CisjaW5jbHVkZSA8UVRvb2xCdXR0b24+CisjaW5jbHVkZSA8UVZCb3hMYXlvdXQ+CisjaW5jbHVkZSA8UUNoZWNrQm94PgorCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyLmgiCisKK2NsYXNzIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdpZGdldCA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBleHBsaWNpdCB2a3RyYWNldmlld2VyX1FSZXBsYXlXaWRnZXQodmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyKiBwV29ya2VyLCBRV2lkZ2V0ICpwYXJlbnQgPSAwKQorICAgICAgICA6IFFXaWRnZXQocGFyZW50KSwKKyAgICAgICAgICBtX3BXb3JrZXIocFdvcmtlcikKKyAgICB7CisgICAgICAgIFFWQm94TGF5b3V0KiBwTGF5b3V0ID0gbmV3IFFWQm94TGF5b3V0KHRoaXMpOworICAgICAgICBzZXRMYXlvdXQocExheW91dCk7CisKKyAgICAgICAgbV9wVG9vbEJhciA9IG5ldyBRVG9vbEJhcigiUmVwbGF5VG9vbGJhciIsIHRoaXMpOworICAgICAgICBwTGF5b3V0LT5hZGRXaWRnZXQobV9wVG9vbEJhcik7CisKKyAgICAgICAgbV9wUGxheUJ1dHRvbiA9IG5ldyBRVG9vbEJ1dHRvbihtX3BUb29sQmFyKTsKKyAgICAgICAgbV9wUGxheUJ1dHRvbi0+c2V0VGV4dCgiUGxheSIpOworICAgICAgICBtX3BQbGF5QnV0dG9uLT5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBtX3BUb29sQmFyLT5hZGRXaWRnZXQobV9wUGxheUJ1dHRvbik7CisgICAgICAgIGNvbm5lY3QobV9wUGxheUJ1dHRvbiwgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1Qob25QbGF5QnV0dG9uQ2xpY2tlZCgpKSk7CisKKyAgICAgICAgbV9wU3RlcEJ1dHRvbiA9IG5ldyBRVG9vbEJ1dHRvbihtX3BUb29sQmFyKTsKKyAgICAgICAgbV9wU3RlcEJ1dHRvbi0+c2V0VGV4dCgiU3RlcCIpOworICAgICAgICBtX3BTdGVwQnV0dG9uLT5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBtX3BUb29sQmFyLT5hZGRXaWRnZXQobV9wU3RlcEJ1dHRvbik7CisgICAgICAgIGNvbm5lY3QobV9wU3RlcEJ1dHRvbiwgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1Qob25TdGVwQnV0dG9uQ2xpY2tlZCgpKSk7CisKKyAgICAgICAgbV9wUGF1c2VCdXR0b24gPSBuZXcgUVRvb2xCdXR0b24obV9wVG9vbEJhcik7CisgICAgICAgIG1fcFBhdXNlQnV0dG9uLT5zZXRUZXh0KCJQYXVzZSIpOworICAgICAgICBtX3BQYXVzZUJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcFRvb2xCYXItPmFkZFdpZGdldChtX3BQYXVzZUJ1dHRvbik7CisgICAgICAgIGNvbm5lY3QobV9wUGF1c2VCdXR0b24sIFNJR05BTChjbGlja2VkKCkpLCB0aGlzLCBTTE9UKG9uUGF1c2VCdXR0b25DbGlja2VkKCkpKTsKKworICAgICAgICBtX3BDb250aW51ZUJ1dHRvbiA9IG5ldyBRVG9vbEJ1dHRvbihtX3BUb29sQmFyKTsKKyAgICAgICAgbV9wQ29udGludWVCdXR0b24tPnNldFRleHQoIkNvbnRpbnVlIik7CisgICAgICAgIG1fcENvbnRpbnVlQnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbV9wVG9vbEJhci0+YWRkV2lkZ2V0KG1fcENvbnRpbnVlQnV0dG9uKTsKKyAgICAgICAgY29ubmVjdChtX3BDb250aW51ZUJ1dHRvbiwgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1Qob25Db250aW51ZUJ1dHRvbkNsaWNrZWQoKSkpOworCisgICAgICAgIG1fcFN0b3BCdXR0b24gPSBuZXcgUVRvb2xCdXR0b24obV9wVG9vbEJhcik7CisgICAgICAgIG1fcFN0b3BCdXR0b24tPnNldFRleHQoIlN0b3AiKTsKKyAgICAgICAgbV9wU3RvcEJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcFRvb2xCYXItPmFkZFdpZGdldChtX3BTdG9wQnV0dG9uKTsKKyAgICAgICAgY29ubmVjdChtX3BTdG9wQnV0dG9uLCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChvblN0b3BCdXR0b25DbGlja2VkKCkpKTsKKworICAgICAgICBtX3BEZXRhY2hDaGVja0JveCA9IG5ldyBRQ2hlY2tCb3gobV9wVG9vbEJhcik7CisgICAgICAgIG1fcERldGFjaENoZWNrQm94LT5zZXRUZXh0KCJEZXRhY2giKTsKKyAgICAgICAgbV9wRGV0YWNoQ2hlY2tCb3gtPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1fcFRvb2xCYXItPmFkZFdpZGdldChtX3BEZXRhY2hDaGVja0JveCk7CisgICAgICAgIGNvbm5lY3QobV9wRGV0YWNoQ2hlY2tCb3gsIFNJR05BTChjbGlja2VkKGJvb2wpKSwgdGhpcywgU0xPVChvbkRldGFjaENoZWNrQm94Q2xpY2tlZChib29sKSkpOworCisgICAgICAgIG1fcFJlcGxheVdpbmRvdyA9IG5ldyBRV2lkZ2V0KHRoaXMpOworICAgICAgICBwTGF5b3V0LT5hZGRXaWRnZXQobV9wUmVwbGF5V2luZG93KTsKKworICAgICAgICAvLyBjb25uZWN0IHdvcmtlciBzaWduYWxzIHRvIHdpZGdldCBhY3Rpb25zCisgICAgICAgIHFSZWdpc3Rlck1ldGFUeXBlPHVpbnQ2NF90PigidWludDY0X3QiKTsKKyAgICAgICAgbV9yZXBsYXlUaHJlYWQuc2V0T2JqZWN0TmFtZSgiUmVwbGF5VGhyZWFkIik7CisgICAgICAgIG1fcFdvcmtlci0+bW92ZVRvVGhyZWFkKCZtX3JlcGxheVRocmVhZCk7CisgICAgICAgIG1fcmVwbGF5VGhyZWFkLnN0YXJ0KCk7CisKKyAgICAgICAgLy8gQ2xpY2tpbmcgdGhlIFBhdXNlIGFuZCBTdG9wIGJ1dHRvbnMgYXJlIGRpcmVjdCBjb25uZWN0aW9ucyBzbyB0aGF0IHRoZXkgaGFwcGVuIG1vcmUgaW1tZWRpYXRlbHkgdGhhbiBhIHF1ZXVlZCBjb25uZWN0aW9uLgorICAgICAgICAvLyBRdWV1ZWQgY29ubmVjdGlvbnMgYXJlIHVzZWQgaGVyZSB3aGVuZXZlciB0aGUgcmVwbGF5IHdpbGwgYmUgYWR2YW5jZWQgZnJvbSBhIHN0b3BwZWQgc3RhdGUsCisgICAgICAgIC8vIGFuZCBmb3IgYWxsIHRoZSBzaWduYWxzIEZST00gdGhlIHdvcmtlciBvYmplY3Qgc2luY2UgaXQgaXMgb24gYSBkaWZmZXJlbnQgdGhyZWFkLgorICAgICAgICBjb25uZWN0KHRoaXMsIFNJR05BTChQbGF5QnV0dG9uQ2xpY2tlZCgpKSwgbV9wV29ya2VyLCBTTE9UKFN0YXJ0UmVwbGF5KCkpLCBRdDo6UXVldWVkQ29ubmVjdGlvbik7CisgICAgICAgIGNvbm5lY3QodGhpcywgU0lHTkFMKFN0ZXBCdXR0b25DbGlja2VkKCkpLCBtX3BXb3JrZXIsIFNMT1QoU3RlcFJlcGxheSgpKSwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24pOworICAgICAgICBjb25uZWN0KHRoaXMsIFNJR05BTChQYXVzZUJ1dHRvbkNsaWNrZWQoKSksIG1fcFdvcmtlciwgU0xPVChQYXVzZVJlcGxheSgpKSwgUXQ6OkRpcmVjdENvbm5lY3Rpb24pOworICAgICAgICBjb25uZWN0KHRoaXMsIFNJR05BTChDb250aW51ZUJ1dHRvbkNsaWNrZWQoKSksIG1fcFdvcmtlciwgU0xPVChDb250aW51ZVJlcGxheSgpKSwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24pOworICAgICAgICBjb25uZWN0KHRoaXMsIFNJR05BTChTdG9wQnV0dG9uQ2xpY2tlZCgpKSwgbV9wV29ya2VyLCBTTE9UKFN0b3BSZXBsYXkoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKKyAgICAgICAgY29ubmVjdCh0aGlzLCBTSUdOQUwoRGV0YWNoQ2hlY2tCb3hDbGlja2VkKGJvb2wpKSwgbV9wV29ya2VyLCBTTE9UKERldGFjaFJlcGxheShib29sKSksIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKKworICAgICAgICBjb25uZWN0KG1fcFdvcmtlciwgU0lHTkFMKFJlcGxheVN0YXJ0ZWQoKSksIHRoaXMsIFNMT1Qoc2xvdFJlcGxheVN0YXJ0ZWQoKSksIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKKyAgICAgICAgY29ubmVjdChtX3BXb3JrZXIsIFNJR05BTChSZXBsYXlQYXVzZWQodWludDY0X3QpKSwgdGhpcywgU0xPVChzbG90UmVwbGF5UGF1c2VkKHVpbnQ2NF90KSksIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKKyAgICAgICAgY29ubmVjdChtX3BXb3JrZXIsIFNJR05BTChSZXBsYXlDb250aW51ZWQoKSksIHRoaXMsIFNMT1Qoc2xvdFJlcGxheUNvbnRpbnVlZCgpKSwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24pOworICAgICAgICBjb25uZWN0KG1fcFdvcmtlciwgU0lHTkFMKFJlcGxheVN0b3BwZWQodWludDY0X3QpKSwgdGhpcywgU0xPVChzbG90UmVwbGF5U3RvcHBlZCh1aW50NjRfdCkpLCBRdDo6UXVldWVkQ29ubmVjdGlvbik7CisgICAgICAgIGNvbm5lY3QobV9wV29ya2VyLCBTSUdOQUwoUmVwbGF5RmluaXNoZWQodWludDY0X3QpKSwgdGhpcywgU0xPVChzbG90UmVwbGF5RmluaXNoZWQodWludDY0X3QpKSwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24pOworICAgICAgICBjb25uZWN0KG1fcFdvcmtlciwgU0lHTkFMKFJlcGxheVByb2dyZXNzVXBkYXRlKHVpbnQ2NF90KSksIHRoaXMsIFNJR05BTChSZXBsYXlQcm9ncmVzc1VwZGF0ZSh1aW50NjRfdCkpLCBRdDo6UXVldWVkQ29ubmVjdGlvbik7CisKKyAgICAgICAgY29ubmVjdChtX3BXb3JrZXIsIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgdWludDY0X3QsIGNvbnN0IFFTdHJpbmcmKSksIHRoaXMsIFNMT1QoT25PdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgdWludDY0X3QsIGNvbnN0IFFTdHJpbmcmKSksIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH52a3RyYWNldmlld2VyX1FSZXBsYXlXaWRnZXQoKQorICAgIHsKKyAgICAgICAgbV9yZXBsYXlUaHJlYWQucXVpdCgpOworICAgICAgICBtX3JlcGxheVRocmVhZC53YWl0KCk7CisgICAgfQorCisgICAgdmlydHVhbCBRUGFpbnRFbmdpbmUqIHBhaW50RW5naW5lKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFFXaWRnZXQqIEdldFJlcGxheVdpbmRvdygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9wUmVwbGF5V2luZG93OworICAgIH0KKworc2lnbmFsczoKKyAgICB2b2lkIFBsYXlCdXR0b25DbGlja2VkKCk7CisgICAgdm9pZCBTdGVwQnV0dG9uQ2xpY2tlZCgpOworICAgIHZvaWQgUGF1c2VCdXR0b25DbGlja2VkKCk7CisgICAgdm9pZCBDb250aW51ZUJ1dHRvbkNsaWNrZWQoKTsKKyAgICB2b2lkIFN0b3BCdXR0b25DbGlja2VkKCk7CisgICAgdm9pZCBEZXRhY2hDaGVja0JveENsaWNrZWQoYm9vbCBjaGVja2VkKTsKKworICAgIHZvaWQgUmVwbGF5U3RhcnRlZCgpOworICAgIHZvaWQgUmVwbGF5UGF1c2VkKHVpbnQ2NF90IHBhY2tldEluZGV4KTsKKyAgICB2b2lkIFJlcGxheUNvbnRpbnVlZCgpOworICAgIHZvaWQgUmVwbGF5U3RvcHBlZCh1aW50NjRfdCBwYWNrZXRJbmRleCk7CisgICAgdm9pZCBSZXBsYXlGaW5pc2hlZCh1aW50NjRfdCBwYWNrZXRJbmRleCk7CisgICAgdm9pZCBSZXBsYXlQcm9ncmVzc1VwZGF0ZSh1aW50NjRfdCBwYWNrZXRJbmRleCk7CisKKyAgICB2b2lkIE91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBRU3RyaW5nJiBtc2cpOworICAgIHZvaWQgT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBRU3RyaW5nJiBtc2cpOworCitwcml2YXRlIHNsb3RzOgorCisgICAgdm9pZCBzbG90UmVwbGF5U3RhcnRlZCgpCisgICAgeworICAgICAgICBtX3BQbGF5QnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbV9wU3RlcEJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcFBhdXNlQnV0dG9uLT5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBtX3BDb250aW51ZUJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcFN0b3BCdXR0b24tPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1fcERldGFjaENoZWNrQm94LT5zZXRFbmFibGVkKGZhbHNlKTsKKworICAgICAgICBlbWl0IFJlcGxheVN0YXJ0ZWQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNsb3RSZXBsYXlQYXVzZWQodWludDY0X3QgcGFja2V0SW5kZXgpCisgICAgeworICAgICAgICBtX3BQbGF5QnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbV9wU3RlcEJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wUGF1c2VCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BDb250aW51ZUJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wU3RvcEJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wRGV0YWNoQ2hlY2tCb3gtPnNldEVuYWJsZWQoZmFsc2UpOworCisgICAgICAgIGVtaXQgUmVwbGF5UGF1c2VkKHBhY2tldEluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIHNsb3RSZXBsYXlDb250aW51ZWQoKQorICAgIHsKKyAgICAgICAgbV9wUGxheUJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcFN0ZXBCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BQYXVzZUJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wQ29udGludWVCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BTdG9wQnV0dG9uLT5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBtX3BEZXRhY2hDaGVja0JveC0+c2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgZW1pdCBSZXBsYXlDb250aW51ZWQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNsb3RSZXBsYXlTdG9wcGVkKHVpbnQ2NF90IHBhY2tldEluZGV4KQorICAgIHsKKyAgICAgICAgbV9wUGxheUJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wU3RlcEJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wUGF1c2VCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BDb250aW51ZUJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcFN0b3BCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BEZXRhY2hDaGVja0JveC0+c2V0RW5hYmxlZCh0cnVlKTsKKworICAgICAgICBlbWl0IFJlcGxheVN0b3BwZWQocGFja2V0SW5kZXgpOworICAgIH0KKworICAgIHZvaWQgc2xvdFJlcGxheUZpbmlzaGVkKHVpbnQ2NF90IHBhY2tldEluZGV4KQorICAgIHsKKyAgICAgICAgbV9wUGxheUJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wU3RlcEJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbV9wUGF1c2VCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BDb250aW51ZUJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcFN0b3BCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BEZXRhY2hDaGVja0JveC0+c2V0RW5hYmxlZCh0cnVlKTsKKworICAgICAgICBlbWl0IFJlcGxheUZpbmlzaGVkKHBhY2tldEluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIE9uT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBRU3RyaW5nJiBtc2cpCisgICAgeworICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UobGV2ZWwsIHBhY2tldEluZGV4LCBtc2cpOworICAgIH0KKworcHVibGljIHNsb3RzOgorICAgIHZvaWQgb25QbGF5QnV0dG9uQ2xpY2tlZCgpCisgICAgeworICAgICAgICBlbWl0IFBsYXlCdXR0b25DbGlja2VkKCk7CisgICAgfQorCisgICAgdm9pZCBvblN0ZXBCdXR0b25DbGlja2VkKCkKKyAgICB7CisgICAgICAgIGVtaXQgU3RlcEJ1dHRvbkNsaWNrZWQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uUGF1c2VCdXR0b25DbGlja2VkKCkKKyAgICB7CisgICAgICAgIG1fcFBsYXlCdXR0b24tPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtX3BQYXVzZUJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1fcENvbnRpbnVlQnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbV9wU3RvcEJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgZW1pdCBQYXVzZUJ1dHRvbkNsaWNrZWQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uQ29udGludWVCdXR0b25DbGlja2VkKCkKKyAgICB7CisgICAgICAgIGVtaXQgQ29udGludWVCdXR0b25DbGlja2VkKCk7CisgICAgfQorCisgICAgdm9pZCBvblN0b3BCdXR0b25DbGlja2VkKCkKKyAgICB7CisgICAgICAgIGVtaXQgU3RvcEJ1dHRvbkNsaWNrZWQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRGV0YWNoQ2hlY2tCb3hDbGlja2VkKGJvb2wgY2hlY2tlZCkKKyAgICB7CisgICAgICAgIGVtaXQgRGV0YWNoQ2hlY2tCb3hDbGlja2VkKGNoZWNrZWQpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXIqIG1fcFdvcmtlcjsKKyAgICBRV2lkZ2V0KiBtX3BSZXBsYXlXaW5kb3c7CisgICAgUVRvb2xCYXIqIG1fcFRvb2xCYXI7CisgICAgUVRvb2xCdXR0b24qIG1fcFBsYXlCdXR0b247CisgICAgUVRvb2xCdXR0b24qIG1fcFN0ZXBCdXR0b247CisgICAgUVRvb2xCdXR0b24qIG1fcFBhdXNlQnV0dG9uOworICAgIFFUb29sQnV0dG9uKiBtX3BDb250aW51ZUJ1dHRvbjsKKyAgICBRVG9vbEJ1dHRvbiogbV9wU3RvcEJ1dHRvbjsKKyAgICBRQ2hlY2tCb3gqIG1fcERldGFjaENoZWNrQm94OworICAgIFFUaHJlYWQgbV9yZXBsYXlUaHJlYWQ7Cit9OworCisjZW5kaWYgLy9fVktUUkFDRVZJRVdFUl9RUkVQTEFZV0lER0VUX0hfCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXIuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJmY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyLmNwcApAQCAtMCwwICsxLDU4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXIuaCIKKyNpbmNsdWRlIDxRQWN0aW9uPgorI2luY2x1ZGUgPFFDb3JlQXBwbGljYXRpb24+CisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX3V0aWxzLmgiCisKK3ZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlciogZ19wV29ya2VyOworc3RhdGljIHVpbnQ2NF90IHNfY3VycmVudFJlcGxheVBhY2tldCA9IDA7CisKK3N0YXRpYyB2b2lkIGRiZ19tc2dfY2FsbGJhY2sodmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfREJHX01TR19UWVBFIG1zZ1R5cGUsIHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBjaGFyKiBwTXNnKTsKKwordm9pZCByZXBsYXlXb3JrZXJMb2dnaW5nQ2FsbGJhY2soVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBwTWVzc2FnZSkKK3sKKyAgICBpZiAoZ19wV29ya2VyICE9IE5VTEwpCisgICAgeworICAgICAgICBzd2l0Y2gobGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBWS1RSQUNFX0xPR19ERUJVRzoKKyAgICAgICAgICAgIGRiZ19tc2dfY2FsbGJhY2sodmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfREJHX01TR19JTkZPLCBzX2N1cnJlbnRSZXBsYXlQYWNrZXQsIHBNZXNzYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLVFJBQ0VfTE9HX0VSUk9SOgorICAgICAgICAgICAgZGJnX21zZ19jYWxsYmFjayh2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9EQkdfTVNHX0VSUk9SLCBzX2N1cnJlbnRSZXBsYXlQYWNrZXQsIHBNZXNzYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZLVFJBQ0VfTE9HX1dBUk5JTkc6CisgICAgICAgICAgICBkYmdfbXNnX2NhbGxiYWNrKHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX0RCR19NU0dfV0FSTklORywgc19jdXJyZW50UmVwbGF5UGFja2V0LCBwTWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWS1RSQUNFX0xPR19WRVJCT1NFOgorICAgICAgICAgICAgZGJnX21zZ19jYWxsYmFjayh2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9EQkdfTVNHX0lORk8sIHNfY3VycmVudFJlcGxheVBhY2tldCwgcE1lc3NhZ2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworI2lmIGRlZmluZWQoV0lOMzIpCisjaWYgX0RFQlVHCisgICAgT3V0cHV0RGVidWdTdHJpbmcocE1lc3NhZ2UpOworI2VuZGlmCisjZW5kaWYKK30KKwordmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjp2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXIoKQorICAgIDogUU9iamVjdChOVUxMKSwKKyAgICAgIG1fYlBhdXNlUmVwbGF5KGZhbHNlKSwKKyAgICAgIG1fYlN0b3BSZXBsYXkoZmFsc2UpLAorICAgICAgbV9iUmVwbGF5SW5Qcm9ncmVzcyhmYWxzZSksCisgICAgICBtX3BWaWV3KE5VTEwpLAorICAgICAgbV9wVHJhY2VGaWxlSW5mbyhOVUxMKSwKKyAgICAgIG1fY3VycmVudFJlcGxheVBhY2tldEluZGV4KDApLAorICAgICAgbV9wQWN0aW9uUnVuVG9IZXJlKE5VTEwpLAorICAgICAgbV9wYXVzZUF0UGFja2V0SW5kZXgoKHVpbnQ2NF90KS0xKSwKKyAgICAgIG1fcFJlcGxheVdpbmRvdyhOVUxMKSwKKyAgICAgIG1fcFJlcGxheVdpbmRvd1dpZHRoKDApLAorICAgICAgbV9wUmVwbGF5V2luZG93SGVpZ2h0KDApLAorICAgICAgbV9iUHJpbnRSZXBsYXlJbmZvTWVzc2FnZXMoVFJVRSksCisgICAgICBtX2JQcmludFJlcGxheVdhcm5pbmdNZXNzYWdlcyhUUlVFKSwKKyAgICAgIG1fYlByaW50UmVwbGF5RXJyb3JNZXNzYWdlcyhUUlVFKSwKKyAgICAgIG1fYlBhdXNlT25SZXBsYXlJbmZvTWVzc2FnZXMoRkFMU0UpLAorICAgICAgbV9iUGF1c2VPblJlcGxheVdhcm5pbmdNZXNzYWdlcyhGQUxTRSksCisgICAgICBtX2JQYXVzZU9uUmVwbGF5RXJyb3JNZXNzYWdlcyhGQUxTRSkKK3sKKyAgICBtZW1zZXQobV9wUmVwbGF5ZXJzLCAwLCBzaXplb2Yodmt0cmFjZV9yZXBsYXk6OnZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5KikgKiBWS1RSQUNFX01BWF9UUkFDRVJfSURfQVJSQVlfU0laRSk7CisgICAgZ19wV29ya2VyID0gdGhpczsKK30KKwordmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjp+dmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyKCkKK3sKKyAgICBzZXRWaWV3KE5VTEwpOworICAgIGdfcFdvcmtlciA9IE5VTEw7CisKKyAgICBpZiAobV9wQWN0aW9uUnVuVG9IZXJlICE9IE5VTEwpCisgICAgeworICAgICAgICBkaXNjb25uZWN0KG1fcEFjdGlvblJ1blRvSGVyZSwgU0lHTkFMKHRyaWdnZXJlZCgpKSwgdGhpcywgU0xPVChvblBsYXlUb0hlcmUoKSkpOworICAgICAgICBkZWxldGUgbV9wQWN0aW9uUnVuVG9IZXJlOworICAgICAgICBtX3BBY3Rpb25SdW5Ub0hlcmUgPSBOVUxMOworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6OnNldFByaW50UmVwbGF5TWVzc2FnZXMoQk9PTCBiUHJpbnRJbmZvLCBCT09MIGJQcmludFdhcm5pbmcsIEJPT0wgYlByaW50RXJyb3IpCit7CisgICAgbV9iUHJpbnRSZXBsYXlJbmZvTWVzc2FnZXMgPSBiUHJpbnRJbmZvOworICAgIG1fYlByaW50UmVwbGF5V2FybmluZ01lc3NhZ2VzID0gYlByaW50V2FybmluZzsKKyAgICBtX2JQcmludFJlcGxheUVycm9yTWVzc2FnZXMgPSBiUHJpbnRFcnJvcjsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6OnNldFBhdXNlT25SZXBsYXlNZXNzYWdlcyhCT09MIGJQYXVzZU9uSW5mbywgQk9PTCBiUGF1c2VPbldhcm5pbmcsIEJPT0wgYlBhdXNlT25FcnJvcikKK3sKKyAgICBtX2JQYXVzZU9uUmVwbGF5SW5mb01lc3NhZ2VzID0gYlBhdXNlT25JbmZvOworICAgIG1fYlBhdXNlT25SZXBsYXlXYXJuaW5nTWVzc2FnZXMgPSBiUGF1c2VPbldhcm5pbmc7CisgICAgbV9iUGF1c2VPblJlcGxheUVycm9yTWVzc2FnZXMgPSBiUGF1c2VPbkVycm9yOworfQorCitCT09MIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlcjo6UHJpbnRSZXBsYXlJbmZvTXNncygpCit7CisgICAgcmV0dXJuIG1fYlByaW50UmVwbGF5SW5mb01lc3NhZ2VzOworfQorCitCT09MIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlcjo6UHJpbnRSZXBsYXlXYXJuaW5nTXNncygpCit7CisgICAgcmV0dXJuIG1fYlByaW50UmVwbGF5V2FybmluZ01lc3NhZ2VzOworfQorCitCT09MIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlcjo6UHJpbnRSZXBsYXlFcnJvck1zZ3MoKQoreworICAgIHJldHVybiBtX2JQcmludFJlcGxheUVycm9yTWVzc2FnZXM7Cit9CisKK0JPT0wgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpQYXVzZU9uUmVwbGF5SW5mb01zZygpCit7CisgICAgcmV0dXJuIG1fYlBhdXNlT25SZXBsYXlJbmZvTWVzc2FnZXM7Cit9CisKK0JPT0wgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpQYXVzZU9uUmVwbGF5V2FybmluZ01zZygpCit7CisgICAgcmV0dXJuIG1fYlBhdXNlT25SZXBsYXlXYXJuaW5nTWVzc2FnZXM7Cit9CisKK0JPT0wgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpQYXVzZU9uUmVwbGF5RXJyb3JNc2coKQoreworICAgIHJldHVybiBtX2JQYXVzZU9uUmVwbGF5RXJyb3JNZXNzYWdlczsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6OnNldFZpZXcodmt0cmFjZXZpZXdlcl92aWV3KiBwVmlldykKK3sKKyAgICBtX3BWaWV3ID0gcFZpZXc7Cit9CisKK2Jvb2wgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpsb2FkX3JlcGxheWVycyh2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyogcFRyYWNlRmlsZUluZm8sCisgICAgUVdpZGdldCogcFJlcGxheVdpbmRvdywgaW50IGNvbnN0IHJlcGxheVdpbmRvd1dpZHRoLAorICAgIGludCBjb25zdCByZXBsYXlXaW5kb3dIZWlnaHQsIGJvb2wgY29uc3Qgc2VwYXJhdGVSZXBsYXlXaW5kb3cpCit7CisgICAgLy8gR2V0IHdpbmRvdyBoYW5kbGUgb2YgdGhlIHdpZGdldCB0byByZXBsYXkgaW50by4KKyAgICBhc3NlcnQocFJlcGxheVdpbmRvdyAhPSBOVUxMKTsKKyAgICBhc3NlcnQocmVwbGF5V2luZG93V2lkdGggPiAwKTsKKyAgICBhc3NlcnQocmVwbGF5V2luZG93SGVpZ2h0ID4gMCk7CisKKyAgICBtX3BSZXBsYXlXaW5kb3cgPSBwUmVwbGF5V2luZG93OworICAgIG1fcFJlcGxheVdpbmRvd1dpZHRoID0gcmVwbGF5V2luZG93V2lkdGg7CisgICAgbV9wUmVwbGF5V2luZG93SGVpZ2h0ID0gcmVwbGF5V2luZG93SGVpZ2h0OworCisgICAgbV9wVHJhY2VGaWxlSW5mbyA9IHBUcmFjZUZpbGVJbmZvOworCisgICAgLy8gVE9ETzogR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIHJlcGxheWVyLiBXZSBjYW4ndCBkbyB0aGlzIHlldAorICAgIC8vIGJlY2F1c2UgdGhlIHJlcGxheWVyIGRvZXNuJ3Qga25vdyB0aGUgcmVuZGVyIHRhcmdldCdzIHNpemUuCisKKyAgICBXSWQgaFdpbmRvdyA9IHBSZXBsYXlXaW5kb3ctPndpbklkKCk7CisKKyAgICAvLyBsb2FkIGFueSBBUEkgc3BlY2lmaWMgZHJpdmVyIGxpYnJhcmllcyBhbmQgaW5pdCByZXBsYXllciBvYmplY3RzCisgICAgdWludDhfdCB0aWRBcGkgPSBWS1RSQUNFX1RJRF9SRVNFUlZFRDsKKyAgICBib29sIGJSZXBsYXllckxvYWRlZCA9IGZhbHNlOworCisgICAgdmt0cmFjZV9yZXBsYXk6OlJlcGxheURpc3BsYXkgZGlzcDsKKyAgICBpZihzZXBhcmF0ZVJlcGxheVdpbmRvdykKKyAgICB7CisgICAgICAgIGRpc3AgPSB2a3RyYWNlX3JlcGxheTo6UmVwbGF5RGlzcGxheShyZXBsYXlXaW5kb3dXaWR0aCwgcmVwbGF5V2luZG93SGVpZ2h0LCAwLCBmYWxzZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRpc3AgPSB2a3RyYWNlX3JlcGxheTo6UmVwbGF5RGlzcGxheSgodmt0cmFjZV93aW5kb3dfaGFuZGxlKWhXaW5kb3csIHJlcGxheVdpbmRvd1dpZHRoLCByZXBsYXlXaW5kb3dIZWlnaHQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVktUUkFDRV9NQVhfVFJBQ0VSX0lEX0FSUkFZX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIG1fcFJlcGxheWVyc1tpXSA9IE5VTEw7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwVHJhY2VGaWxlSW5mby0+aGVhZGVyLnRyYWNlcl9jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgdWludDhfdCB0cmFjZXJJZCA9IHBUcmFjZUZpbGVJbmZvLT5oZWFkZXIudHJhY2VyX2lkX2FycmF5W2ldLmlkOworICAgICAgICB0aWRBcGkgPSB0cmFjZXJJZDsKKworICAgICAgICBjb25zdCBWS1RSQUNFX1RSQUNFUl9SRVBMQVlFUl9JTkZPKiBwUmVwbGF5ZXJJbmZvID0gJihnc190cmFjZXJSZXBsYXllckluZm9bdHJhY2VySWRdKTsKKworICAgICAgICBpZiAocFJlcGxheWVySW5mby0+dHJhY2VySWQgIT0gdHJhY2VySWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19FUlJPUiwgUVN0cmluZygiUmVwbGF5ZXIgaW5mbyBmb3IgVHJhY2VySWQgKCUxKSBmYWlsZWQgY29uc2lzdGVuY3kgY2hlY2suIikuYXJnKHRyYWNlcklkKSk7CisgICAgICAgICAgICBhc3NlcnQoISJUcmFjZXJJZCBpbiBWS1RSQUNFX1RSQUNFUl9SRVBMQVlFUl9JTkZPIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1ZXN0ZWQgdHJhY2VySWQuIFRoZSBhcnJheSBuZWVkcyB0byBiZSBjb3JyZWN0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFJlcGxheWVySW5mby0+bmVlZHNSZXBsYXllciA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBIYXZlIG91ciBmYWN0b3J5IGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlcGxheWVyCisgICAgICAgICAgICBtX3BSZXBsYXllcnNbdHJhY2VySWRdID0gbV9yZXBsYXllckZhY3RvcnkuQ3JlYXRlKHRyYWNlcklkKTsKKworICAgICAgICAgICAgaWYgKG1fcFJlcGxheWVyc1t0cmFjZXJJZF0gPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyByZXBsYXllciBmYWlsZWQgdG8gYmUgY3JlYXRlZAorICAgICAgICAgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19FUlJPUiwgUVN0cmluZygiQ291bGRuJ3QgY3JlYXRlIHJlcGxheWVyIGZvciBUcmFjZXJJZCAlMS4iKS5hcmcodHJhY2VySWQpKTsKKyAgICAgICAgICAgICAgICBiUmVwbGF5ZXJMb2FkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3BSZXBsYXllcnNbdHJhY2VySWRdLT5TZXRMb2dDYWxsYmFjayhyZXBsYXlXb3JrZXJMb2dnaW5nQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIG1fcFJlcGxheWVyc1t0cmFjZXJJZF0tPlNldExvZ0xldmVsKFZLVFJBQ0VfTE9HX0VSUk9SKTsKKyAgICAgICAgICAgICAgICBtX3BSZXBsYXllcnNbdHJhY2VySWRdLT5SZWdpc3RlckRiZ01zZ0NhbGxiYWNrKCh2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9EQkdfTVNHX0NBTExCQUNLX0ZVTkNUSU9OKSZkYmdfbXNnX2NhbGxiYWNrKTsKKworICAgICAgICAgICAgICAgIC8vIGdldCBzZXR0aW5ncyBmcm9tIHRoZSByZXBsYXllcgorICAgICAgICAgICAgICAgIG1fcFZpZXctPmFkZF9zZXR0aW5nX2dyb3VwKG1fcFJlcGxheWVyc1t0cmFjZXJJZF0tPkdldFNldHRpbmdzKCkpOworCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHJlcGxheWVyIHdpdGggdXBkYXRlZCBzdGF0ZQorICAgICAgICAgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwR2xvYmFsU2V0dGluZ3MgPSBOVUxMOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1HbG9iYWxTZXR0aW5ncyA9IG1fcFZpZXctPmdldF9nbG9iYWxfc2V0dGluZ3MoJnBHbG9iYWxTZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgbV9wUmVwbGF5ZXJzW3RyYWNlcklkXS0+VXBkYXRlRnJvbVNldHRpbmdzKHBHbG9iYWxTZXR0aW5ncywgbnVtR2xvYmFsU2V0dGluZ3MpOworCisgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVwbGF5ZXIKKyAgICAgICAgICAgICAgICBpbnQgZXJyID0gbV9wUmVwbGF5ZXJzW3RyYWNlcklkXS0+SW5pdGlhbGl6ZSgmZGlzcCwgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsIFFTdHJpbmcoIkNvdWxkbid0IEluaXRpYWxpemUgcmVwbGF5ZXIgZm9yIFRyYWNlcklkICUxLiIpLmFyZyh0cmFjZXJJZCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYlJlcGxheWVyTG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aWRBcGkgPT0gVktUUkFDRV9USURfUkVTRVJWRUQpCisgICAgeworICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsIFFTdHJpbmcoIk5vIEFQSSBzcGVjaWZpZWQgaW4gdHJhY2VmaWxlIGZvciByZXBsYXlpbmcuIikpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGJSZXBsYXllckxvYWRlZCkKKyAgICB7CisgICAgICAgIG1fcEFjdGlvblJ1blRvSGVyZSA9IG5ldyBRQWN0aW9uKCJQbGF5IHRvIGhlcmUiLCBOVUxMKTsKKyAgICAgICAgY29ubmVjdChtX3BBY3Rpb25SdW5Ub0hlcmUsIFNJR05BTCh0cmlnZ2VyZWQoKSksIHRoaXMsIFNMT1Qob25QbGF5VG9IZXJlKCkpKTsKKyAgICAgICAgbV9wVmlldy0+YWRkX2NhbGx0cmVlX2NvbnRleHRtZW51X2l0ZW0obV9wQWN0aW9uUnVuVG9IZXJlKTsKKyAgICB9CisKKyAgICByZXR1cm4gYlJlcGxheWVyTG9hZGVkOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlcjo6dW5sb2FkUmVwbGF5ZXJzKCkKK3sKKyAgICBtX3BUcmFjZUZpbGVJbmZvID0gTlVMTDsKKworICAgIC8vIENsZWFuIHVwIHJlcGxheWVycworICAgIGlmIChtX3BSZXBsYXllcnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVktUUkFDRV9NQVhfVFJBQ0VSX0lEX0FSUkFZX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fcFJlcGxheWVyc1tpXSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fcFJlcGxheWVyc1tpXS0+RGVpbml0aWFsaXplKCk7CisgICAgICAgICAgICAgICAgbV9yZXBsYXllckZhY3RvcnkuRGVzdHJveSgmbV9wUmVwbGF5ZXJzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6OnBsYXlDdXJyZW50VHJhY2VGaWxlKHVpbnQ2NF90IHN0YXJ0UGFja2V0SW5kZXgpCit7CisgICAgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8qIHBUcmFjZUZpbGVJbmZvID0gbV9wVHJhY2VGaWxlSW5mbzsKKyAgICB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfcGFja2V0X29mZnNldHMqIHBDdXJQYWNrZXQgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCByZXMgPSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfRVJST1I7CisgICAgdmt0cmFjZV9yZXBsYXk6OnZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5ICpyZXBsYXllcjsKKworICAgIG1fYlJlcGxheUluUHJvZ3Jlc3MgPSB0cnVlOworCisgICAgZm9yICh1aW50NjRfdCBpID0gc3RhcnRQYWNrZXRJbmRleDsgaSA8IHBUcmFjZUZpbGVJbmZvLT5wYWNrZXRDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgbV9jdXJyZW50UmVwbGF5UGFja2V0SW5kZXggPSBpOworICAgICAgICBlbWl0IFJlcGxheVByb2dyZXNzVXBkYXRlKG1fY3VycmVudFJlcGxheVBhY2tldEluZGV4KTsKKworICAgICAgICBwQ3VyUGFja2V0ID0gJnBUcmFjZUZpbGVJbmZvLT5wUGFja2V0T2Zmc2V0c1tpXTsKKyAgICAgICAgc19jdXJyZW50UmVwbGF5UGFja2V0ID0gcEN1clBhY2tldC0+cEhlYWRlci0+Z2xvYmFsX3BhY2tldF9pbmRleDsKKyAgICAgICAgc3dpdGNoIChwQ3VyUGFja2V0LT5wSGVhZGVyLT5wYWNrZXRfaWQpIHsKKyAgICAgICAgICAgIGNhc2UgVktUUkFDRV9UUElfTUVTU0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9tZXNzYWdlKiBtc2dQYWNrZXQ7CisgICAgICAgICAgICAgICAgbXNnUGFja2V0ID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X21lc3NhZ2UqKXBDdXJQYWNrZXQtPnBIZWFkZXI7CisgICAgICAgICAgICAgICAgcmVwbGF5V29ya2VyTG9nZ2luZ0NhbGxiYWNrKG1zZ1BhY2tldC0+dHlwZSwgbXNnUGFja2V0LT5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVktUUkFDRV9UUElfTUFSS0VSX0NIRUNLUE9JTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfQk9VTkRBUlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfQkVHSU46CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfRU5EOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9NQVJLRVJfVEVSTUlOQVRFX1BST0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvL1RPRE8gcHJvY2Vzc2luZyBjb2RlIGZvciBhbGwgdGhlIGFib3ZlIGNhc2VzCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQ3VyUGFja2V0LT5wSGVhZGVyLT50cmFjZXJfaWQgPj0gVktUUkFDRV9NQVhfVFJBQ0VSX0lEX0FSUkFZX1NJWkUgIHx8IHBDdXJQYWNrZXQtPnBIZWFkZXItPnRyYWNlcl9pZCA9PSBWS1RSQUNFX1RJRF9SRVNFUlZFRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlcGxheVdvcmtlckxvZ2dpbmdDYWxsYmFjayhWS1RSQUNFX0xPR19XQVJOSU5HLCBRU3RyaW5nKCJUcmFjZXJfaWQgZnJvbSBwYWNrZXQgbnVtIHBhY2tldCAlMSBpbnZhbGlkLiIpLmFyZyhwQ3VyUGFja2V0LT5wSGVhZGVyLT5wYWNrZXRfaWQpLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBsYXllciA9IG1fcFJlcGxheWVyc1twQ3VyUGFja2V0LT5wSGVhZGVyLT50cmFjZXJfaWRdOworICAgICAgICAgICAgICAgIGlmIChyZXBsYXllciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGxheVdvcmtlckxvZ2dpbmdDYWxsYmFjayhWS1RSQUNFX0xPR19XQVJOSU5HLCBRU3RyaW5nKCJUcmFjZXJfaWQgJTEgaGFzIG5vIHZhbGlkIHJlcGxheWVyLiIpLmFyZyhwQ3VyUGFja2V0LT5wSGVhZGVyLT50cmFjZXJfaWQpLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocEN1clBhY2tldC0+cEhlYWRlci0+cGFja2V0X2lkID49IFZLVFJBQ0VfVFBJX0JFR0lOX0FQSV9IRVJFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRoZSBBUEkgcGFja2V0CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXBsYXllci0+UmVwbGF5KHBDdXJQYWNrZXQtPnBIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5V29ya2VyTG9nZ2luZ0NhbGxiYWNrKFZLVFJBQ0VfTE9HX0VSUk9SLCBRU3RyaW5nKCJDYXVnaHQgc3RkOjpleGNlcHRpb24gd2hpbGUgcmVwbGF5aW5nIHBhY2tldCAlMTogJTIiKS5hcmcocEN1clBhY2tldC0+cEhlYWRlci0+Z2xvYmFsX3BhY2tldF9pbmRleCkuYXJnKGUud2hhdCgpKS50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChpbnQgaSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5V29ya2VyTG9nZ2luZ0NhbGxiYWNrKFZLVFJBQ0VfTE9HX0VSUk9SLCBRU3RyaW5nKCJDYXVnaHQgaW50IGV4Y2VwdGlvbjogJTEiKS5hcmcoaSkudG9TdGRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoLi4uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlXb3JrZXJMb2dnaW5nQ2FsbGJhY2soVktUUkFDRV9MT0dfRVJST1IsICJDYXVnaHQgdW5rbm93biBleGNlcHRpb24uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9FUlJPUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID09IHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9JTlZBTElEX0lEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPT0gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0NBTExfRVJST1IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVdvcmtlckxvZ2dpbmdDYWxsYmFjayhWS1RSQUNFX0xPR19FUlJPUiwgUVN0cmluZygiRmFpbGVkIHRvIHJlcGxheSBwYWNrZXQgJTEuIikuYXJnKHBDdXJQYWNrZXQtPnBIZWFkZXItPmdsb2JhbF9wYWNrZXRfaW5kZXgpLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzID09IHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9CQURfUkVUVVJOKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlXb3JrZXJMb2dnaW5nQ2FsbGJhY2soVktUUkFDRV9MT0dfV0FSTklORywgUVN0cmluZygiUmVwbGF5IG9mIHBhY2tldCAlMSBoYXMgZGl2ZXJnZWQgZnJvbSB0cmFjZSBkdWUgdG8gYSBkaWZmZXJlbnQgcmV0dXJuIHZhbHVlLiIpLmFyZyhwQ3VyUGFja2V0LT5wSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4KS50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcyA9PSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfSU5WQUxJRF9QQVJBTVMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID09IHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9WQUxJREFUSU9OX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGxheWVyIHNob3VsZCBoYXZlIHJlcG9ydGVkIHRoZXNlIGlmIHRoZSB1c2VyIHdhbnRlZCB0aGVtLCBzbyBkb24ndCBwcmludCBhbnkgYWRkaXRpb25hbCB3YXJuaW5ncyBoZXJlLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcyAhPSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5V29ya2VyTG9nZ2luZ0NhbGxiYWNrKFZLVFJBQ0VfTE9HX0VSUk9SLCBRU3RyaW5nKCJVbmtub3duIGVycm9yIGNhdXNlZCBieSBwYWNrZXQgJTEuIikuYXJnKHBDdXJQYWNrZXQtPnBIZWFkZXItPmdsb2JhbF9wYWNrZXRfaW5kZXgpLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbGF5V29ya2VyTG9nZ2luZ0NhbGxiYWNrKFZLVFJBQ0VfTE9HX0VSUk9SLCBRU3RyaW5nKCJCYWQgcGFja2V0IHR5cGUgaWQ9JTEsIGluZGV4PSUyLiIpLmFyZyhwQ3VyUGFja2V0LT5wSGVhZGVyLT5wYWNrZXRfaWQpLmFyZyhwQ3VyUGFja2V0LT5wSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4KS50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgZXZlbnRzIGFuZCBwYXVzZSBvciBzdG9wIGlmIG5lZWRlZAorICAgICAgICBpZiAobV9iUGF1c2VSZXBsYXkgfHwgbV9wYXVzZUF0UGFja2V0SW5kZXggPT0gcEN1clBhY2tldC0+cEhlYWRlci0+Z2xvYmFsX3BhY2tldF9pbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fcGF1c2VBdFBhY2tldEluZGV4ID09IHBDdXJQYWNrZXQtPnBIZWFkZXItPmdsb2JhbF9wYWNrZXRfaW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQKKyAgICAgICAgICAgICAgICBtX3BhdXNlQXRQYWNrZXRJbmRleCA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2JSZXBsYXlJblByb2dyZXNzID0gZmFsc2U7CisgICAgICAgICAgICBkb1JlcGxheVBhdXNlZChwQ3VyUGFja2V0LT5wSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2JTdG9wUmVwbGF5KQorICAgICAgICB7CisgICAgICAgICAgICBtX2JSZXBsYXlJblByb2dyZXNzID0gZmFsc2U7CisgICAgICAgICAgICBkb1JlcGxheVN0b3BwZWQocEN1clBhY2tldC0+cEhlYWRlci0+Z2xvYmFsX3BhY2tldF9pbmRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2JSZXBsYXlJblByb2dyZXNzID0gZmFsc2U7CisgICAgZG9SZXBsYXlGaW5pc2hlZChwQ3VyUGFja2V0LT5wSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4KTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6Om9uUGxheVRvSGVyZSgpCit7CisgICAgbV9wYXVzZUF0UGFja2V0SW5kZXggPSBtX3BWaWV3LT5nZXRfY3VycmVudF9wYWNrZXRfaW5kZXgoKTsKKyAgICBpZiAobV9wYXVzZUF0UGFja2V0SW5kZXggPD0gbV9jdXJyZW50UmVwbGF5UGFja2V0SW5kZXggfHwgbV9jdXJyZW50UmVwbGF5UGFja2V0SW5kZXggPT0gMCkKKyAgICB7CisgICAgICAgIC8vIHBhdXNlIGxvY2F0aW9uIGlzIGJlaGluZCB0aGUgY3VycmVudCByZXBsYXkgcG9zaXRpb24sIHNvIHJlc3RhcnQgdGhlIHJlcGxheS4KKyAgICAgICAgU3RhcnRSZXBsYXkoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gcGF1c2UgbG9jYXRpb24gaXMgYWhlYWQgb2YgY3VycmVudCByZXBsYXkgcG9zaXRpb24sIHNvIGNvbnRpbnVlIHRoZSByZXBsYXkuCisgICAgICAgIENvbnRpbnVlUmVwbGF5KCk7CisgICAgfQorfQorCisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpTdGFydFJlcGxheSgpCit7CisgICAgLy8gU3RhcnRpbmcgdGhlIHJlcGxheSBjYW4gaGFwcGVuIGltbWVkaWF0ZWx5LgorICAgIGVtaXQgUmVwbGF5U3RhcnRlZCgpOworCisgICAgLy8gUmVzZXQgc29tZSBmbGFncyBhbmQgcGxheSB0aGUgcmVwbGF5IGZyb20gdGhlIGJlZ2lubmluZworICAgIG1fYlBhdXNlUmVwbGF5ID0gZmFsc2U7CisgICAgbV9iU3RvcFJlcGxheSA9IGZhbHNlOworICAgIHBsYXlDdXJyZW50VHJhY2VGaWxlKDApOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlcjo6U3RlcFJlcGxheSgpCit7CisgICAgLy8gU3RlcHBpbmcgdGhlIHJlcGxheSBjYW4gaGFwcGVuIGltbWVkaWF0ZWx5LgorICAgIGVtaXQgUmVwbGF5Q29udGludWVkKCk7CisKKyAgICAvLyBTZXQgdGhlIHBhdXNlIGZsYWcgc28gdGhhdCB0aGUgcmVwbGF5IHdpbGwgc3RvcCBhZnRlciByZXBsYXlpbmcgdGhlIG5leHQgcGFja2V0LgorICAgIG1fYlBhdXNlUmVwbGF5ID0gdHJ1ZTsKKyAgICBtX2JTdG9wUmVwbGF5ID0gZmFsc2U7CisgICAgcGxheUN1cnJlbnRUcmFjZUZpbGUobV9jdXJyZW50UmVwbGF5UGFja2V0SW5kZXgrMSk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpQYXVzZVJlcGxheSgpCit7CisgICAgLy8gUGF1c2luZyB0aGUgcmVwbGF5IGhhcHBlbnMgYXN5bmNyb25vdXNseS4KKyAgICAvLyBTbyBzZXQgdGhlIHBhdXNlIGZsYWcgYW5kIHRoZSByZXBsYXkgd2lsbAorICAgIC8vIHJlYWN0IHRvIGl0IGFzIHNvb24gYXMgaXQgY2FuLiBJdCB3aWxsIGNhbGwKKyAgICAvLyBkb1JlcGxheVBhdXNlZCgpIHdoZW4gaXQgaGFzIHBhdXNlZC4KKyAgICBtX2JQYXVzZVJlcGxheSA9IHRydWU7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpDb250aW51ZVJlcGxheSgpCit7CisgICAgLy8gQ29udGludWluZyB0aGUgcmVwbGF5IGNhbiBoYXBwZW4gaW1tZWRpYXRlbHkuCisgICAgZW1pdCBSZXBsYXlDb250aW51ZWQoKTsKKworICAgIC8vIGNsZWFyIHRoZSBwYXVzZSBhbmQgc3RvcCBmbGFncyBhbmQgY29udGludWUgdGhlIHJlcGxheSBmcm9tIHRoZSBuZXh0IHBhY2tldAorICAgIG1fYlBhdXNlUmVwbGF5ID0gZmFsc2U7CisgICAgbV9iU3RvcFJlcGxheSA9IGZhbHNlOworICAgIHBsYXlDdXJyZW50VHJhY2VGaWxlKG1fY3VycmVudFJlcGxheVBhY2tldEluZGV4KzEpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlcjo6U3RvcFJlcGxheSgpCit7CisgICAgaWYgKG1fYlJlcGxheUluUHJvZ3Jlc3MpCisgICAgeworICAgICAgICAvLyBJZiBhIHJlcGxheSBpcyBpbiBwcm9ncmVzcywgdGhlbgorICAgICAgICAvLyBTdG9wcGluZyB0aGUgcmVwbGF5IGhhcHBlbnMgYXN5Y25yb25vdXNseS4KKyAgICAgICAgLy8gU2V0IHRoZSBzdG9wIGZsYWcgYW5kIHRoZSByZXBsYXkgd2lsbAorICAgICAgICAvLyByZWFjdCB0byBpdCBhcyBzb29uIGFzIGl0IGNhbi4gSXQgd2lsbCBjYWxsCisgICAgICAgIC8vIGRvUmVwbGF5U3RvcHBlZCgpIHdoZW4gaXQgaGFzIHN0b3BwZWQuCisgICAgICAgIG1fYlN0b3BSZXBsYXkgPSB0cnVlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBSZXBsYXkgaXMgbm90IGluIHByb2dyZXNzIG1lYW5zOgorICAgICAgICAvLyAxKSByZXBsYXkgd2Fzbid0IHN0YXJ0ZWQgKGluIHdoaWNoIGNhc2Ugc3RvcCBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkIGFuZCB3ZSBjYW4ndCBnZXQgdG8gdGhpcyBwb2ludCksCisgICAgICAgIC8vIDIpIHJlcGxheSBpcyBjdXJyZW50bHkgcGF1c2VkLCBzbyBkbyBzYW1lIGFjdGlvbnMgYXMgaWYgdGhlIHJlcGxheSBkZXRlY3RlZCB0aGF0IGl0IHNob3VsZCBzdG9wLgorICAgICAgICB1aW50NjRfdCBwYWNrZXRJbmRleCA9IHRoaXMtPm1fcFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW21fY3VycmVudFJlcGxheVBhY2tldEluZGV4XS5wSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4OworICAgICAgICBkb1JlcGxheVN0b3BwZWQocGFja2V0SW5kZXgpOworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6Om9uU2V0dGluZ3NVcGRhdGVkKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwR3JvdXBzLCB1bnNpZ25lZCBpbnQgbnVtR3JvdXBzKQoreworICAgIGlmIChtX3BSZXBsYXllcnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IHRyYWNlcklkID0gMDsgdHJhY2VySWQgPCBWS1RSQUNFX01BWF9UUkFDRVJfSURfQVJSQVlfU0laRTsgdHJhY2VySWQrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fcFJlcGxheWVyc1t0cmFjZXJJZF0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSByZXBsYXllciB3aXRoIHRoZSBsb2FkZWQgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICBtX3BSZXBsYXllcnNbdHJhY2VySWRdLT5VcGRhdGVGcm9tU2V0dGluZ3MocEdyb3VwcywgbnVtR3JvdXBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordmt0cmFjZV9yZXBsYXk6OnZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5KiB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6OmdldFJlcGxheWVyKFZLVFJBQ0VfVFJBQ0VSX0lEIHRyYWNlcklkKQoreworICAgIGlmICh0cmFjZXJJZCA8IDAgfHwgdHJhY2VySWQgPj0gVktUUkFDRV9NQVhfVFJBQ0VSX0lEX0FSUkFZX1NJWkUpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbV9wUmVwbGF5ZXJzW3RyYWNlcklkXTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6OkRldGFjaFJlcGxheShib29sIGRldGFjaCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFZLVFJBQ0VfTUFYX1RSQUNFUl9JRF9BUlJBWV9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZihtX3BSZXBsYXllcnNbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9wUmVwbGF5ZXJzW2ldLT5EZWluaXRpYWxpemUoKTsKKworICAgICAgICAgICAgdmt0cmFjZV9yZXBsYXk6OlJlcGxheURpc3BsYXkgZGlzcDsKKyAgICAgICAgICAgIGlmKGRldGFjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaXNwID0gdmt0cmFjZV9yZXBsYXk6OlJlcGxheURpc3BsYXkobV9wUmVwbGF5V2luZG93V2lkdGgsIG1fcFJlcGxheVdpbmRvd0hlaWdodCwgMCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdJZCBoV2luZG93ID0gbV9wUmVwbGF5V2luZG93LT53aW5JZCgpOworICAgICAgICAgICAgICAgIGRpc3AgPSB2a3RyYWNlX3JlcGxheTo6UmVwbGF5RGlzcGxheSgodmt0cmFjZV93aW5kb3dfaGFuZGxlKWhXaW5kb3csIG1fcFJlcGxheVdpbmRvd1dpZHRoLCBtX3BSZXBsYXlXaW5kb3dIZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgZXJyID0gbV9wUmVwbGF5ZXJzW2ldLT5Jbml0aWFsaXplKCZkaXNwLCBOVUxMKTsKKyAgICAgICAgICAgIGFzc2VydChlcnIgPT0gMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpkb1JlcGxheVBhdXNlZCh1aW50NjRfdCBwYWNrZXRJbmRleCkKK3sKKyAgICBlbWl0IFJlcGxheVBhdXNlZChwYWNrZXRJbmRleCk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyOjpkb1JlcGxheVN0b3BwZWQodWludDY0X3QgcGFja2V0SW5kZXgpCit7CisgICAgZW1pdCBSZXBsYXlTdG9wcGVkKHBhY2tldEluZGV4KTsKKworICAgIC8vIFJlcGxheSB3aWxsIHN0YXJ0IGFnYWluIGZyb20gdGhlIGJlZ2lubmluZywgc28gc2V0dXAgZm9yIHRoYXQgbm93LgorICAgIG1fY3VycmVudFJlcGxheVBhY2tldEluZGV4ID0gMDsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXI6OmRvUmVwbGF5RmluaXNoZWQodWludDY0X3QgcGFja2V0SW5kZXgpCit7CisgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgcmVwbGF5IGZpbmlzaGVkIGF0IHRoZSBwYXJ0aWN1bGFyIHBhY2tldC4KKyAgICBlbWl0IFJlcGxheUZpbmlzaGVkKHBhY2tldEluZGV4KTsKKworICAgIC8vIFJlcGxheSB3aWxsIHN0YXJ0IGFnYWluIGZyb20gdGhlIGJlZ2lubmluZywgc28gc2V0dXAgZm9yIHRoYXQgbm93LgorICAgIG1fY3VycmVudFJlcGxheVBhY2tldEluZGV4ID0gMDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBkYmdfbXNnX2NhbGxiYWNrKHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX0RCR19NU0dfVFlQRSBtc2dUeXBlLCB1aW50NjRfdCBwYWNrZXRJbmRleCwgY29uc3QgY2hhciogcE1zZykKK3sKKyAgICBpZiAoZ19wV29ya2VyICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAobXNnVHlwZSA9PSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9EQkdfTVNHX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ19wV29ya2VyLT5QcmludFJlcGxheUVycm9yTXNncygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdfcFdvcmtlci0+T3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19FUlJPUiwgcGFja2V0SW5kZXgsIFFTdHJpbmcocE1zZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdfcFdvcmtlci0+UGF1c2VPblJlcGxheUVycm9yTXNnKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ19wV29ya2VyLT5QYXVzZVJlcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1zZ1R5cGUgPT0gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfREJHX01TR19XQVJOSU5HKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ19wV29ya2VyLT5QcmludFJlcGxheVdhcm5pbmdNc2dzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ19wV29ya2VyLT5PdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX1dBUk5JTkcsIHBhY2tldEluZGV4LCBRU3RyaW5nKHBNc2cpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnX3BXb3JrZXItPlBhdXNlT25SZXBsYXlXYXJuaW5nTXNnKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ19wV29ya2VyLT5QYXVzZVJlcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdfcFdvcmtlci0+UHJpbnRSZXBsYXlJbmZvTXNncygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdfcFdvcmtlci0+T3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19WRVJCT1NFLCBwYWNrZXRJbmRleCwgUVN0cmluZyhwTXNnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ19wV29ya2VyLT5QYXVzZU9uUmVwbGF5SW5mb01zZygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdfcFdvcmtlci0+UGF1c2VSZXBsYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlci5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkNjRlNwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfUVJlcGxheVdvcmtlci5oCkBAIC0wLDAgKzEsMTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVktUUkFDRVZJRVdFUl9RUkVQTEFZV09SS0VSX0gKKyNkZWZpbmUgVktUUkFDRVZJRVdFUl9RUkVQTEFZV09SS0VSX0gKKworI2luY2x1ZGUgPFFPYmplY3Q+CisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl92aWV3LmgiCisjaW5jbHVkZSAidmtyZXBsYXlfZmFjdG9yeS5oIgorCitjbGFzcyB2a3RyYWNldmlld2VyX1FSZXBsYXlXb3JrZXIgOiBwdWJsaWMgUU9iamVjdAoreworICAgIFFfT0JKRUNUCitwdWJsaWM6CisgICAgdmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyKCk7CisgICAgdmlydHVhbCB+dmt0cmFjZXZpZXdlcl9RUmVwbGF5V29ya2VyKCk7CisKKyAgICB2b2lkIHNldFByaW50UmVwbGF5TWVzc2FnZXMoQk9PTCBiUHJpbnRJbmZvLCBCT09MIGJQcmludFdhcm5pbmcsIEJPT0wgYlByaW50RXJyb3IpOworICAgIHZvaWQgc2V0UGF1c2VPblJlcGxheU1lc3NhZ2VzKEJPT0wgYlBhdXNlT25JbmZvLCBCT09MIGJQYXVzZU9uV2FybmluZywgQk9PTCBiUGF1c2VPbkVycm9yKTsKKworICAgIEJPT0wgUHJpbnRSZXBsYXlJbmZvTXNncygpOworICAgIEJPT0wgUHJpbnRSZXBsYXlXYXJuaW5nTXNncygpOworICAgIEJPT0wgUHJpbnRSZXBsYXlFcnJvck1zZ3MoKTsKKworICAgIEJPT0wgUGF1c2VPblJlcGxheUluZm9Nc2coKTsKKyAgICBCT09MIFBhdXNlT25SZXBsYXlXYXJuaW5nTXNnKCk7CisgICAgQk9PTCBQYXVzZU9uUmVwbGF5RXJyb3JNc2coKTsKKworICAgIHZvaWQgc2V0Vmlldyh2a3RyYWNldmlld2VyX3ZpZXcqIHBWaWV3KTsKKworICAgIGJvb2wgbG9hZF9yZXBsYXllcnModmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8qIHBUcmFjZUZpbGVJbmZvLAorICAgICAgICBRV2lkZ2V0KiBwUmVwbGF5V2luZG93LCBpbnQgY29uc3QgcmVwbGF5V2luZG93V2lkdGgsCisgICAgICAgIGludCBjb25zdCByZXBsYXlXaW5kb3dIZWlnaHQsIGJvb2wgY29uc3Qgc2VwYXJhdGVSZXBsYXlXaW5kb3cpOworCisgICAgdm9pZCB1bmxvYWRSZXBsYXllcnMoKTsKKworcHJvdGVjdGVkIHNsb3RzOgorICAgIHZpcnR1YWwgdm9pZCBwbGF5Q3VycmVudFRyYWNlRmlsZSh1aW50NjRfdCBzdGFydFBhY2tldEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25QbGF5VG9IZXJlKCk7CisKK3B1YmxpYyBzbG90czoKKyAgICB2b2lkIFN0YXJ0UmVwbGF5KCk7CisgICAgdm9pZCBTdGVwUmVwbGF5KCk7CisgICAgdm9pZCBQYXVzZVJlcGxheSgpOworICAgIHZvaWQgQ29udGludWVSZXBsYXkoKTsKKyAgICB2b2lkIFN0b3BSZXBsYXkoKTsKKworICAgIHZvaWQgb25TZXR0aW5nc1VwZGF0ZWQodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBHcm91cHMsIHVuc2lnbmVkIGludCBudW1Hcm91cHMpOworCisgICAgdmt0cmFjZV9yZXBsYXk6OnZrdHJhY2VfdHJhY2VfcGFja2V0X3JlcGxheV9saWJyYXJ5KiBnZXRSZXBsYXllcihWS1RSQUNFX1RSQUNFUl9JRCB0cmFjZXJJZCk7CisKKyAgICB2b2lkIERldGFjaFJlcGxheShib29sIGRldGFjaCk7CisKK3NpZ25hbHM6CisgICAgdm9pZCBSZXBsYXlTdGFydGVkKCk7CisgICAgdm9pZCBSZXBsYXlQYXVzZWQodWludDY0X3QgcGFja2V0SW5kZXgpOworICAgIHZvaWQgUmVwbGF5Q29udGludWVkKCk7CisgICAgdm9pZCBSZXBsYXlTdG9wcGVkKHVpbnQ2NF90IHBhY2tldEluZGV4KTsKKyAgICB2b2lkIFJlcGxheUZpbmlzaGVkKHVpbnQ2NF90IHBhY2tldEluZGV4KTsKKworICAgIHZvaWQgUmVwbGF5UHJvZ3Jlc3NVcGRhdGUodWludDY0X3QgcGFja2V0SW5kZXgpOworCisgICAgdm9pZCBPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCwgY29uc3QgUVN0cmluZyYgbXNnKTsKKyAgICB2b2lkIE91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsIGxldmVsLCB1aW50NjRfdCBwYWNrZXRJbmRleCwgY29uc3QgUVN0cmluZyYgbXNnKTsKKworcHJpdmF0ZToKKyAgICB2b2xhdGlsZSBib29sIG1fYlBhdXNlUmVwbGF5OworICAgIHZvbGF0aWxlIGJvb2wgbV9iU3RvcFJlcGxheTsKKyAgICB2b2xhdGlsZSBib29sIG1fYlJlcGxheUluUHJvZ3Jlc3M7CisgICAgdmt0cmFjZXZpZXdlcl92aWV3KiBtX3BWaWV3OworICAgIHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvKiBtX3BUcmFjZUZpbGVJbmZvOworICAgIHVpbnQ2NF90IG1fY3VycmVudFJlcGxheVBhY2tldEluZGV4OworICAgIFFBY3Rpb24qIG1fcEFjdGlvblJ1blRvSGVyZTsKKyAgICB1aW50NjRfdCBtX3BhdXNlQXRQYWNrZXRJbmRleDsKKworICAgIFFXaWRnZXQqIG1fcFJlcGxheVdpbmRvdzsKKyAgICBpbnQgbV9wUmVwbGF5V2luZG93V2lkdGg7CisgICAgaW50IG1fcFJlcGxheVdpbmRvd0hlaWdodDsKKworICAgIEJPT0wgbV9iUHJpbnRSZXBsYXlJbmZvTWVzc2FnZXM7CisgICAgQk9PTCBtX2JQcmludFJlcGxheVdhcm5pbmdNZXNzYWdlczsKKyAgICBCT09MIG1fYlByaW50UmVwbGF5RXJyb3JNZXNzYWdlczsKKworICAgIEJPT0wgbV9iUGF1c2VPblJlcGxheUluZm9NZXNzYWdlczsKKyAgICBCT09MIG1fYlBhdXNlT25SZXBsYXlXYXJuaW5nTWVzc2FnZXM7CisgICAgQk9PTCBtX2JQYXVzZU9uUmVwbGF5RXJyb3JNZXNzYWdlczsKKworICAgIHZrdHJhY2VfcmVwbGF5OjpSZXBsYXlGYWN0b3J5IG1fcmVwbGF5ZXJGYWN0b3J5OworICAgIHZrdHJhY2VfcmVwbGF5Ojp2a3RyYWNlX3RyYWNlX3BhY2tldF9yZXBsYXlfbGlicmFyeSogbV9wUmVwbGF5ZXJzW1ZLVFJBQ0VfTUFYX1RSQUNFUl9JRF9BUlJBWV9TSVpFXTsKKworICAgIHZvaWQgZG9SZXBsYXlQYXVzZWQodWludDY0X3QgcGFja2V0SW5kZXgpOworICAgIHZvaWQgZG9SZXBsYXlTdG9wcGVkKHVpbnQ2NF90IHBhY2tldEluZGV4KTsKKyAgICB2b2lkIGRvUmVwbGF5RmluaXNoZWQodWludDY0X3QgcGFja2V0SW5kZXgpOworfTsKKworI2VuZGlmIC8vIFZLVFJBQ0VWSUVXRVJfUVJFUExBWVdPUktFUl9ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbC5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RkMTcwCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwuaApAQCAtMCwwICsxLDMwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFFDb2xvcj4KKyNpbmNsdWRlIDxRRm9udD4KKyNpbmNsdWRlIDxRU2l6ZT4KKyNpbmNsdWRlIDxxYWJzdHJhY3RpdGVtbW9kZWwuaD4KKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuaCIKKworY2xhc3Mgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwgOiBwdWJsaWMgUUFic3RyYWN0SXRlbU1vZGVsCit7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbChRT2JqZWN0KiBwYXJlbnQsIHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvKiBwVHJhY2VGaWxlSW5mbykKKyAgICAgICAgOiBRQWJzdHJhY3RJdGVtTW9kZWwocGFyZW50KQorICAgIHsKKyAgICAgICAgbV9wVHJhY2VGaWxlSW5mbyA9IHBUcmFjZUZpbGVJbmZvOworICAgIH0KKworICAgIHZpcnR1YWwgfnZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsKCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzRHJhd0NhbGwoY29uc3QgVktUUkFDRV9UUkFDRV9QQUNLRVRfSUQgcGFja2V0SWQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCBRU3RyaW5nIGdldF9wYWNrZXRfc3RyaW5nKGNvbnN0IHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcikgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAocEhlYWRlci0+cGFja2V0X2lkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01FU1NBR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfbWVzc2FnZSogcFBhY2tldCA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9tZXNzYWdlKilwSGVhZGVyLT5wQm9keTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUVN0cmluZyhwUGFja2V0LT5tZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVktUUkFDRV9UUElfTUFSS0VSX0NIRUNLUE9JTlQ6CisgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfQk9VTkRBUlk6CisgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfQkVHSU46CisgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfRU5EOgorICAgICAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9NQVJLRVJfVEVSTUlOQVRFX1BST0NFU1M6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBRU3RyaW5nICgiJTEiKS5hcmcocEhlYWRlci0+cGFja2V0X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgUVN0cmluZyBnZXRfcGFja2V0X3N0cmluZ19tdWx0aWxpbmUoY29uc3Qgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRpb24gaXMgbmFpdmUuCisgICAgICAgIHJldHVybiBnZXRfcGFja2V0X3N0cmluZyhwSGVhZGVyKTsKKyAgICB9CisKKyAgICBpbnQgcm93Q291bnQoY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCA9IFFNb2RlbEluZGV4KCkpIGNvbnN0CisgICAgeworICAgICAgICBpZiAocGFyZW50LmNvbHVtbigpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcm93Q291bnQgPSAwOworICAgICAgICBpZiAobV9wVHJhY2VGaWxlSW5mbyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByb3dDb3VudCA9IG1fcFRyYWNlRmlsZUluZm8tPnBhY2tldENvdW50OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmVudC5pc1ZhbGlkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgdmFsaWQgcGFyZW50LCBzbyB0aGlzIGlzIGEgY2hpbGQgbm9kZSwgd2hpY2ggaGFzIG5vIHJvd3MKKyAgICAgICAgICAgIHJvd0NvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByb3dDb3VudDsKKyAgICB9CisKKyAgICBlbnVtIENvbHVtbnMKKyAgICB7CisgICAgICAgIENvbHVtbl9FbnRyeXBvaW50TmFtZSwKKyAgICAgICAgQ29sdW1uX1RyYWNlcklkLAorICAgICAgICBDb2x1bW5fUGFja2V0SW5kZXgsCisgICAgICAgIENvbHVtbl9UaHJlYWRJZCwKKyAgICAgICAgQ29sdW1uX0JlZ2luVGltZSwKKyAgICAgICAgQ29sdW1uX0VuZFRpbWUsCisgICAgICAgIENvbHVtbl9QYWNrZXRTaXplLAorICAgICAgICBDb2x1bW5fQ3B1RHVyYXRpb24sCisgICAgICAgIGNOdW1Db2x1bW5zCisgICAgfTsKKworICAgIGludCBjb2x1bW5Db3VudChjb25zdCBRTW9kZWxJbmRleCAmcGFyZW50ID0gUU1vZGVsSW5kZXgoKSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBjTnVtQ29sdW1uczsKKyAgICB9CisKKyAgICBRVmFyaWFudCBkYXRhKGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCwgaW50IHJvbGUgPSBRdDo6RGlzcGxheVJvbGUpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9wVHJhY2VGaWxlSW5mbyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb2xlID09IFF0OjpGb250Um9sZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciopdGhpcy0+aW5kZXgoaW5kZXgucm93KCksIENvbHVtbl9FbnRyeXBvaW50TmFtZSwgaW5kZXgucGFyZW50KCkpLmludGVybmFsUG9pbnRlcigpOworICAgICAgICAgICAgaWYgKGlzRHJhd0NhbGwoKFZLVFJBQ0VfVFJBQ0VfUEFDS0VUX0lEKXBIZWFkZXItPnBhY2tldF9pZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUUZvbnQgZm9udDsKKyAgICAgICAgICAgICAgICBmb250LnNldEJvbGQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocm9sZSA9PSBRdDo6U2l6ZUhpbnRSb2xlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUVNpemUoMjAsIDIwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb2xlID09IFF0OjpCYWNrZ3JvdW5kUm9sZSAmJiAhbV9zZWFyY2hTdHJpbmcuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBRVmFyaWFudCBjZWxsRGF0YSA9IGRhdGEoaW5kZXgsIFF0OjpEaXNwbGF5Um9sZSk7CisgICAgICAgICAgICBRU3RyaW5nIHN0cmluZyA9IGNlbGxEYXRhLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoc3RyaW5nLmNvbnRhaW5zKG1fc2VhcmNoU3RyaW5nLCBRdDo6Q2FzZUluc2Vuc2l0aXZlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUUNvbG9yKFF0Ojp5ZWxsb3cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJvbGUgPT0gUXQ6OkRpc3BsYXlSb2xlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGluZGV4LmNvbHVtbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQ29sdW1uX0VudHJ5cG9pbnROYW1lOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciopaW5kZXguaW50ZXJuYWxQb2ludGVyKCk7CisgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgYXBpU3RyID0gdGhpcy0+Z2V0X3BhY2tldF9zdHJpbmcocEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcGlTdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgQ29sdW1uX1RyYWNlcklkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKih1aW50OF90KilpbmRleC5pbnRlcm5hbFBvaW50ZXIoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fUGFja2V0SW5kZXg6CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fVGhyZWFkSWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCgqKHVpbnQzMl90KilpbmRleC5pbnRlcm5hbFBvaW50ZXIoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fQmVnaW5UaW1lOgorICAgICAgICAgICAgICAgIGNhc2UgQ29sdW1uX0VuZFRpbWU6CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fUGFja2V0U2l6ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KCoodW5zaWduZWQgbG9uZyBsb25nKilpbmRleC5pbnRlcm5hbFBvaW50ZXIoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fQ3B1RHVyYXRpb246CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIgPSAodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKilpbmRleC5pbnRlcm5hbFBvaW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSBwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lIC0gcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKHVuc2lnbmVkIGludClkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJvbGUgPT0gUXQ6OlRvb2xUaXBSb2xlICYmIGluZGV4LmNvbHVtbigpID09IENvbHVtbl9FbnRyeXBvaW50TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciopaW5kZXguaW50ZXJuYWxQb2ludGVyKCk7CisgICAgICAgICAgICBRU3RyaW5nIHRpcDsKKyAgICAgICAgICAgIHRpcCArPSAiPGh0bWw+PHRhYmxlPiI7CisjaWYgZGVmaW5lZChfREVCVUcpCisgICAgICAgICAgICB0aXAgKz0gIjx0cj48dGQ+PGI+UGFja2V0IGhlYWRlciAocEhlYWRlci0+KTo8L2I+PC90ZD48dGQvPjwvdHI+IjsKKyAgICAgICAgICAgIHRpcCArPSBRU3RyaW5nKCI8dHI+PHRkPnNpemU8L3RkPjx0ZD49ICUxIGJ5dGVzPC90ZD48L3RyPiIpLmFyZyhwSGVhZGVyLT5zaXplKTsKKyAgICAgICAgICAgIHRpcCArPSBRU3RyaW5nKCI8dHI+PHRkPmdsb2JhbF9wYWNrZXRfaW5kZXg8L3RkPjx0ZD49ICUxPC90ZD48L3RyPiIpLmFyZyhwSGVhZGVyLT5nbG9iYWxfcGFja2V0X2luZGV4KTsKKyAgICAgICAgICAgIHRpcCArPSBRU3RyaW5nKCI8dHI+PHRkPnRyYWNlcl9pZDwvdGQ+PHRkPj0gJTE8L3RkPjwvdHI+IikuYXJnKHBIZWFkZXItPnRyYWNlcl9pZCk7CisgICAgICAgICAgICB0aXAgKz0gUVN0cmluZygiPHRyPjx0ZD5wYWNrZXRfaWQ8L3RkPjx0ZD49ICUxPC90ZD48L3RyPiIpLmFyZyhwSGVhZGVyLT5wYWNrZXRfaWQpOworICAgICAgICAgICAgdGlwICs9IFFTdHJpbmcoIjx0cj48dGQ+dGhyZWFkX2lkPC90ZD48dGQ+PSAlMTwvdGQ+PC90cj4iKS5hcmcocEhlYWRlci0+dGhyZWFkX2lkKTsKKyAgICAgICAgICAgIHRpcCArPSBRU3RyaW5nKCI8dHI+PHRkPnZrdHJhY2VfYmVnaW5fdGltZTwvdGQ+PHRkPj0gJTE8L3RkPjwvdHI+IikuYXJnKHBIZWFkZXItPnZrdHJhY2VfYmVnaW5fdGltZSk7CisgICAgICAgICAgICB0aXAgKz0gUVN0cmluZygiPHRyPjx0ZD5lbnRyeXBvaW50X2JlZ2luX3RpbWU8L3RkPjx0ZD49ICUxPC90ZD48L3RyPiIpLmFyZyhwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWUpOworICAgICAgICAgICAgdGlwICs9IFFTdHJpbmcoIjx0cj48dGQ+ZW50cnlwb2ludF9lbmRfdGltZTwvdGQ+PHRkPj0gJTEgKCUyKTwvdGQ+PC90cj4iKS5hcmcocEhlYWRlci0+ZW50cnlwb2ludF9lbmRfdGltZSkuYXJnKHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgLSBwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWUpOworICAgICAgICAgICAgdGlwICs9IFFTdHJpbmcoIjx0cj48dGQ+dmt0cmFjZV9lbmRfdGltZTwvdGQ+PHRkPj0gJTEgKCUyKTwvdGQ+PC90cj4iKS5hcmcocEhlYWRlci0+dmt0cmFjZV9lbmRfdGltZSkuYXJnKHBIZWFkZXItPnZrdHJhY2VfZW5kX3RpbWUgLSBwSGVhZGVyLT52a3RyYWNlX2JlZ2luX3RpbWUpOworICAgICAgICAgICAgdGlwICs9IFFTdHJpbmcoIjx0cj48dGQ+bmV4dF9idWZmZXJzX29mZnNldDwvdGQ+PHRkPj0gJTE8L3RkPjwvdHI+IikuYXJnKHBIZWFkZXItPm5leHRfYnVmZmVyc19vZmZzZXQpOworICAgICAgICAgICAgdGlwICs9IFFTdHJpbmcoIjx0cj48dGQ+cEJvZHk8L3RkPjx0ZD49ICUxPC90ZD48L3RyPiIpLmFyZyhwSGVhZGVyLT5wQm9keSk7CisgICAgICAgICAgICB0aXAgKz0gIjxicj4iOworI2VuZGlmCisgICAgICAgICAgICB0aXAgKz0gIjx0cj48dGQ+PGI+IjsKKyAgICAgICAgICAgIFFTdHJpbmcgbXVsdGlsaW5lID0gdGhpcy0+Z2V0X3BhY2tldF9zdHJpbmdfbXVsdGlsaW5lKHBIZWFkZXIpOworICAgICAgICAgICAgLy8gb25seSByZXBsYWNlcyB0aGUgZmlyc3QgJygnCisgICAgICAgICAgICBtdWx0aWxpbmUucmVwbGFjZShtdWx0aWxpbmUuaW5kZXhPZigiKCIpLCAxLCAiPC9iPig8L3RkPjx0ZC8+PC90cj48dHI+PHRkPiIpOworICAgICAgICAgICAgbXVsdGlsaW5lLnJlcGxhY2UoIiwgIiwgIiwgPC90ZD48L3RyPjx0cj48dGQ+Iik7CisgICAgICAgICAgICBtdWx0aWxpbmUucmVwbGFjZSgiID0gIiwgIjwvdGQ+PHRkPj0gIik7CisKKyAgICAgICAgICAgIC8vIG9ubHkgcmVwbGFjZXMgdGhlIGZpbmFsICcpJworICAgICAgICAgICAgbXVsdGlsaW5lLnJlcGxhY2UobXVsdGlsaW5lLmxhc3RJbmRleE9mKCIpIiksIDEsICI8L3RkPjwvdHI+PHRyPjx0ZD4pPC90ZD48dGQ+Iik7CisgICAgICAgICAgICB0aXAgKz0gbXVsdGlsaW5lOworICAgICAgICAgICAgdGlwICs9ICI8L3RkPjwvdHI+PC90YWJsZT4iOworICAgICAgICAgICAgdGlwICs9ICI8L2h0bWw+IjsKKyAgICAgICAgICAgIHJldHVybiB0aXA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsKKyAgICB9CisKKyAgICBRTW9kZWxJbmRleCBpbmRleChpbnQgcm93LCBpbnQgY29sdW1uLCBjb25zdCBRTW9kZWxJbmRleCYgcGFyZW50ID0gUU1vZGVsSW5kZXgoKSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX3BUcmFjZUZpbGVJbmZvID09IE5VTEwgfHwgbV9wVHJhY2VGaWxlSW5mby0+cGFja2V0Q291bnQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHJvdywgY29sdW1uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodWludDY0X3Qpcm93ID49IG1fcFRyYWNlRmlsZUluZm8tPnBhY2tldENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9IG1fcFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW3Jvd10ucEhlYWRlcjsKKyAgICAgICAgdm9pZCogcERhdGEgPSBOVUxMOworICAgICAgICBzd2l0Y2ggKGNvbHVtbikKKyAgICAgICAgeworICAgICAgICBjYXNlIENvbHVtbl9FbnRyeXBvaW50TmFtZToKKyAgICAgICAgICAgIHBEYXRhID0gcEhlYWRlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbHVtbl9UcmFjZXJJZDoKKyAgICAgICAgICAgIHBEYXRhID0gJnBIZWFkZXItPnRyYWNlcl9pZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbHVtbl9QYWNrZXRJbmRleDoKKyAgICAgICAgICAgIHBEYXRhID0gJnBIZWFkZXItPmdsb2JhbF9wYWNrZXRfaW5kZXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb2x1bW5fVGhyZWFkSWQ6CisgICAgICAgICAgICBwRGF0YSA9ICZwSGVhZGVyLT50aHJlYWRfaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb2x1bW5fQmVnaW5UaW1lOgorICAgICAgICAgICAgcERhdGEgPSAmcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29sdW1uX0VuZFRpbWU6CisgICAgICAgICAgICBwRGF0YSA9ICZwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29sdW1uX1BhY2tldFNpemU6CisgICAgICAgICAgICBwRGF0YSA9ICZwSGVhZGVyLT5zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29sdW1uX0NwdUR1cmF0aW9uOgorICAgICAgICAgICAgcERhdGEgPSBwSGVhZGVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlSW5kZXgocm93LCBjb2x1bW4sIHBEYXRhKTsKKyAgICB9CisKKyAgICBRTW9kZWxJbmRleCBwYXJlbnQoY29uc3QgUU1vZGVsSW5kZXgmIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CisgICAgfQorCisgICAgUVZhcmlhbnQgaGVhZGVyRGF0YShpbnQgc2VjdGlvbiwgUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBpbnQgcm9sZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChyb2xlID09IFF0OjpEaXNwbGF5Um9sZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9udGFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VjdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fRW50cnlwb2ludE5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBRU3RyaW5nKCJBUEkgQ2FsbCIpOworICAgICAgICAgICAgICAgIGNhc2UgQ29sdW1uX1RyYWNlcklkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVN0cmluZygiVHJhY2VyIElEIik7CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fUGFja2V0SW5kZXg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBRU3RyaW5nKCJJbmRleCIpOworICAgICAgICAgICAgICAgIGNhc2UgQ29sdW1uX1RocmVhZElkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVN0cmluZygiVGhyZWFkIElEIik7CisgICAgICAgICAgICAgICAgY2FzZSBDb2x1bW5fQmVnaW5UaW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVN0cmluZygiU3RhcnQgVGltZSIpOworICAgICAgICAgICAgICAgIGNhc2UgQ29sdW1uX0VuZFRpbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBRU3RyaW5nKCJFbmQgVGltZSIpOworICAgICAgICAgICAgICAgIGNhc2UgQ29sdW1uX1BhY2tldFNpemU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBRU3RyaW5nKCJTaXplIChieXRlcykiKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbHVtbl9DcHVEdXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFFTdHJpbmcoIkR1cmF0aW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBRVmFyaWFudCgpOworICAgIH0KKworICAgIHZvaWQgc2V0X2hpZ2hsaWdodF9zZWFyY2hfc3RyaW5nKGNvbnN0IFFTdHJpbmcgc2VhcmNoU3RyaW5nKQorICAgIHsKKyAgICAgICAgbV9zZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmc7CisgICAgfQorCitwcml2YXRlOgorICAgIHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvKiBtX3BUcmFjZUZpbGVJbmZvOworICAgIFFTdHJpbmcgbV9zZWFyY2hTdHJpbmc7CisKK307CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2FwaWNhbGxpdGVtLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2FwaWNhbGxpdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNzk1NAotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfYXBpY2FsbGl0ZW0uaApAQCAtMCwwICsxLDE2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTMtMjAxNCBSQUQgR2FtZSBUb29scyBhbmQgVmFsdmUgU29mdHdhcmUKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdMVkRFQlVHX0FQSUNBTExJVEVNX0gKKyNkZWZpbmUgR0xWREVCVUdfQVBJQ0FMTElURU1fSAorCisvLyNpbmNsdWRlICJnbHZkZWJ1Z19zbmFwc2hvdGl0ZW0uaCIKKyNpbmNsdWRlICJnbHZfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCisKKy8vIHByZWRlY2xhcmVkIGNsYXNzZXMKKy8vY2xhc3MgZ2x2ZGVidWdfZnJhbWVJdGVtOworLy9jbGFzcyBnbHZkZWJ1Z19ncm91cEl0ZW07CisvL2NsYXNzIHZvZ2xfdHJhY2VfcGFja2V0OworCitjbGFzcyBnbHZkZWJ1Z19hcGlDYWxsSXRlbSAvLzogcHVibGljIHZvZ2xlZGl0b3Jfc25hcHNob3RJdGVtCit7CitwdWJsaWM6CisgICAgZ2x2ZGVidWdfYXBpQ2FsbEl0ZW0oZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtKiBwUGFyZW50LCBnbHZfdHJhY2VfcGFja2V0X2hlYWRlciogcFRyYWNlUGFja2V0KQorICAgICAgICAvLzogbV9wUGFyZW50RnJhbWUocEZyYW1lKSwKKyAgICAgICAgLy8gIG1fZ2xQYWNrZXQoZ2xQYWNrZXQpLAorICAgICAgICAgIC8vbV9wVHJhY2VQYWNrZXQocFRyYWNlUGFja2V0KSwKKyAgICAgICAgICAvL21fZ2xvYmFsQ2FsbEluZGV4KGdsUGFja2V0Lm1fY2FsbF9jb3VudGVyKSwKKyAgICAgICAgICAvL21fYmVnaW5fcmR0c2MoZ2xQYWNrZXQubV9wYWNrZXRfYmVnaW5fcmR0c2MpLAorICAgICAgICAgIC8vbV9lbmRfcmR0c2MoZ2xQYWNrZXQubV9wYWNrZXRfZW5kX3JkdHNjKSwKKyAgICAgICAgICAvL21fYmFja3RyYWNlX2hhc2hfaW5kZXgoZ2xQYWNrZXQubV9iYWNrdHJhY2VfaGFzaF9pbmRleCkKKyAgICB7CisgICAgICAgIC8vaWYgKG1fZW5kX3JkdHNjIDwgbV9iZWdpbl9yZHRzYykKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIG1fZW5kX3JkdHNjID0gbV9iZWdpbl9yZHRzYyArIDE7CisgICAgICAgIC8vfQorICAgIH0KKworICAgIH5nbHZkZWJ1Z19hcGlDYWxsSXRlbSgpCisgICAgeworICAgICAgICAvL2lmIChtX3BUcmFjZVBhY2tldCAhPSBOVUxMKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgdm9nbF9kZWxldGUobV9wVHJhY2VQYWNrZXQpOworICAgICAgICAvLyAgICBtX3BUcmFjZVBhY2tldCA9IE5VTEw7CisgICAgICAgIC8vfQorICAgIH0KKworLy8gICAgaW5saW5lIHZvZ2xlZGl0b3JfZnJhbWVJdGVtICpmcmFtZSgpIGNvbnN0CisvLyAgICB7CisvLyAgICAgICAgcmV0dXJuIG1fcFBhcmVudEZyYW1lOworLy8gICAgfQorLy8KKy8vICAgIGlubGluZSB2b2dsZWRpdG9yX2dyb3VwSXRlbSAqZ3JvdXAoKSBjb25zdAorLy8gICAgeworLy8gICAgICAgIHJldHVybiBtX3BQYXJlbnRHcm91cDsKKy8vICAgIH0KKy8vCisvLyAgICBpbmxpbmUgdWludDY0X3QgZ2xvYmFsQ2FsbEluZGV4KCkgY29uc3QKKy8vICAgIHsKKy8vICAgICAgICByZXR1cm4gbV9nbG9iYWxDYWxsSW5kZXg7CisvLyAgICB9CisvLworLy8gICAgaW5saW5lIHVpbnQ2NF90IHN0YXJ0VGltZSgpIGNvbnN0CisvLyAgICB7CisvLyAgICAgICAgcmV0dXJuIG1fYmVnaW5fcmR0c2M7CisvLyAgICB9CisvLworLy8gICAgaW5saW5lIHVpbnQ2NF90IGVuZFRpbWUoKSBjb25zdAorLy8gICAgeworLy8gICAgICAgIHJldHVybiBtX2VuZF9yZHRzYzsKKy8vICAgIH0KKy8vCisvLyAgICBpbmxpbmUgdWludDY0X3QgZHVyYXRpb24oKSBjb25zdAorLy8gICAgeworLy8gICAgICAgIHJldHVybiBlbmRUaW1lKCkgLSBzdGFydFRpbWUoKTsKKy8vICAgIH0KKy8vCisvLyAgICBjb25zdCB2b2dsX3RyYWNlX2dsX2VudHJ5cG9pbnRfcGFja2V0ICpnZXRHTFBhY2tldCgpIGNvbnN0CisvLyAgICB7CisvLyAgICAgICAgcmV0dXJuICZtX2dsUGFja2V0OworLy8gICAgfQorLy8KKy8vICAgIHZvZ2xfdHJhY2VfcGFja2V0ICpnZXRUcmFjZVBhY2tldCgpCisvLyAgICB7CisvLyAgICAgICAgcmV0dXJuIG1fcFRyYWNlUGFja2V0OworLy8gICAgfQorLy8KKy8vICAgIGlubGluZSB1aW50NjRfdCBiYWNrdHJhY2VIYXNoSW5kZXgoKSBjb25zdAorLy8gICAgeworLy8gICAgICAgIHJldHVybiBtX2JhY2t0cmFjZV9oYXNoX2luZGV4OworLy8gICAgfQorLy8KKy8vICAgIC8vIFJldHVybnMgdGhlIGFwaSBmdW5jdGlvbiBjYWxsIGFuZCBpdHMgYXJncyBhcyBhIHN0cmluZworLy8gICAgUVN0cmluZyBhcGlGdW5jdGlvbkNhbGwoKQorLy8gICAgeworLy8gICAgICAgIGNvbnN0IGdsX2VudHJ5cG9pbnRfZGVzY190ICZlbnRyeXBvaW50X2Rlc2MgPSBnX3ZvZ2xfZW50cnlwb2ludF9kZXNjc1ttX3BUcmFjZVBhY2tldC0+Z2V0X2VudHJ5cG9pbnRfaWQoKV07CisvLworLy8gICAgICAgIFFTdHJpbmcgZnVuY0NhbGwgPSBlbnRyeXBvaW50X2Rlc2MubV9wTmFtZTsKKy8vCisvLyAgICAgICAgLy8gZm9ybWF0IHBhcmFtZXRlcnMKKy8vICAgICAgICBmdW5jQ2FsbC5hcHBlbmQoIiggIik7CisvLyAgICAgICAgZHluYW1pY19zdHJpbmcgcGFyYW1TdHI7CisvLyAgICAgICAgZm9yICh1aW50IHBhcmFtX2luZGV4ID0gMDsgcGFyYW1faW5kZXggPCBtX3BUcmFjZVBhY2tldC0+dG90YWxfcGFyYW1zKCk7IHBhcmFtX2luZGV4KyspCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBpZiAocGFyYW1faW5kZXggIT0gMCkKKy8vICAgICAgICAgICAgICAgIGZ1bmNDYWxsLmFwcGVuZCgiLCAiKTsKKy8vCisvLyAgICAgICAgICAgIHBhcmFtU3RyLmNsZWFyKCk7CisvLyAgICAgICAgICAgIG1fcFRyYWNlUGFja2V0LT5wcmV0dHlfcHJpbnRfcGFyYW0ocGFyYW1TdHIsIHBhcmFtX2luZGV4LCBmYWxzZSk7CisvLworLy8gICAgICAgICAgICBmdW5jQ2FsbC5hcHBlbmQocGFyYW1TdHIuY19zdHIoKSk7CisvLyAgICAgICAgfQorLy8gICAgICAgIGZ1bmNDYWxsLmFwcGVuZCgiICkiKTsKKy8vCisvLyAgICAgICAgaWYgKG1fcFRyYWNlUGFja2V0LT5oYXNfcmV0dXJuX3ZhbHVlKCkpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBmdW5jQ2FsbC5hcHBlbmQoIiA9ICIpOworLy8gICAgICAgICAgICBwYXJhbVN0ci5jbGVhcigpOworLy8gICAgICAgICAgICBtX3BUcmFjZVBhY2tldC0+cHJldHR5X3ByaW50X3JldHVybl92YWx1ZShwYXJhbVN0ciwgZmFsc2UpOworLy8gICAgICAgICAgICBmdW5jQ2FsbC5hcHBlbmQocGFyYW1TdHIuY19zdHIoKSk7CisvLyAgICAgICAgfQorLy8gICAgICAgIHJldHVybiBmdW5jQ2FsbDsKKy8vICAgIH0KKy8vCisvLyAgICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgYXJndW1lbnQgb2YgYW4gYXBpY2FsbCBpbiBhcGlGdW5jdGlvbkNhbGwoKSBvdXRwdXQgZm9ybWF0CisvLyAgICAvLworLy8gICAgLy8gVE9ETzogKGFzIG5lZWRlZCkgQWRkIGxvZ2ljIHRvIHJldHVybiB3aGljaCBzdHJpbmcgKGFyZ3VtZW50IGNvdW50KSBmcm9tCisvLyAgICAvLyAgICAgICAgICAgICAgICAgICBhIG11bHRpLXN0cmluZyBhcmd1bWVudCBsaXN0IChvciBhbGwgYXMgYSBRU3RyaW5nTGlzdCkKKy8vICAgIFFTdHJpbmcgc3RyaW5nQXJnKCkKKy8vICAgIHsKKy8vICAgICAgICBRU3RyaW5nIGFwaUNhbGwgPSBhcGlGdW5jdGlvbkNhbGwoKTsKKy8vCisvLyAgICAgICAgUVN0cmluZyBzZWMsIG5hbWU7CisvLyAgICAgICAgaW50IHN0YXJ0ID0gMTsKKy8vICAgICAgICB3aGlsZSAoIShzZWMgPSBhcGlDYWxsLnNlY3Rpb24oJ1wnJywgc3RhcnQsIHN0YXJ0KSkuaXNFbXB0eSgpKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgbmFtZS5hcHBlbmQoc2VjKTsKKy8vICAgICAgICAgICAgc3RhcnQgKz0gMjsKKy8vICAgICAgICB9CisvLyAgICAgICAgcmV0dXJuIG5hbWU7CisvLyAgICB9CisvLworLy9wcml2YXRlOgorLy8gICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICptX3BQYXJlbnRGcmFtZTsKKy8vICAgIGdsdmRlYnVnX2dyb3VwSXRlbSAqbV9wUGFyZW50R3JvdXA7CisvLy8vICAgIGNvbnN0IHZvZ2xfdHJhY2VfZ2xfZW50cnlwb2ludF9wYWNrZXQgbV9nbFBhY2tldDsKKy8vLy8gICAgdm9nbF90cmFjZV9wYWNrZXQgKm1fcFRyYWNlUGFja2V0OworLy8KKy8vICAgIHVpbnQ2NF90IG1fZ2xvYmFsQ2FsbEluZGV4OworLy8gICAgdWludDY0X3QgbV9iZWdpbl9yZHRzYzsKKy8vICAgIHVpbnQ2NF90IG1fZW5kX3JkdHNjOworLy8gICAgdWludDY0X3QgbV9iYWNrdHJhY2VfaGFzaF9pbmRleDsKK307CisKKyNlbmRpZiAvLyBHTFZERUJVR19BUElDQUxMSVRFTV9ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2FwaWNhbGx0cmVlaXRlbS5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2FwaWNhbGx0cmVlaXRlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5Y2Y3YgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfYXBpY2FsbHRyZWVpdGVtLmNwcApAQCAtMCwwICsxLDQxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTMtMjAxNCBSQUQgR2FtZSBUb29scyBhbmQgVmFsdmUgU29mdHdhcmUKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8UUNvbG9yPgorI2luY2x1ZGUgPFFJY29uPgorCisjaW5jbHVkZSAiZ2x2ZGVidWdfYXBpY2FsbHRyZWVpdGVtLmgiCisjaW5jbHVkZSAiZ2x2ZGVidWdfZ3JvdXBpdGVtLmgiCisjaW5jbHVkZSAiZ2x2ZGVidWdfcWFwaWNhbGx0cmVlbW9kZWwuaCIKKyNpbmNsdWRlICJnbHZkZWJ1Z19mcmFtZWl0ZW0uaCIKKworLy8jaW5jbHVkZSAidm9nbF9jb21tb24uaCIKKy8vI2luY2x1ZGUgInZvZ2xfdHJhY2VfZmlsZV9yZWFkZXIuaCIKKy8vI2luY2x1ZGUgInZvZ2xfdHJhY2VfcGFja2V0LmgiCisvLyNpbmNsdWRlICJ2b2dsX3RyYWNlX3N0cmVhbV90eXBlcy5oIgorLy8jaW5jbHVkZSAiZ2x2ZGVidWdfZ2xfc3RhdGVfc25hcHNob3QuaCIKKy8vI2luY2x1ZGUgImdsdmRlYnVnX3NldHRpbmdzLmgiCisKKy8vIENvbnN0cnVjdG9yIGZvciByb290IG5vZGUKK2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6Z2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtKGludCBjb2x1bW5Db3VudCwgZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWwgKnBNb2RlbCkKKyAgICA6IG1fcGFyZW50SXRlbShOVUxMKSwKKyAgICAgIC8vbV9wQXBpQ2FsbEl0ZW0oTlVMTCksCisgICAgICAvL21fcEdyb3VwSXRlbShOVUxMKSwKKyAgICAgIC8vbV9wRnJhbWVJdGVtKE5VTEwpLAorICAgICAgbV9wTW9kZWwocE1vZGVsKSwKKyAgICAgIG1fbG9jYWxSb3dJbmRleCgwKSwKKyAgICAgIG1fY29sdW1uQ291bnQoY29sdW1uQ291bnQpCit7CisgICAgbV9jb2x1bW5EYXRhID0gbmV3IFFWYXJpYW50W21fY29sdW1uQ291bnRdOworICAgIC8vbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19BUElDQUxMXSA9ICJBUEkgQ2FsbCI7CisgICAgLy9tX2NvbHVtbkRhdGFbVk9HTF9BQ1RDX0lOREVYXSA9ICJJbmRleCI7CisgICAgLy9tX2NvbHVtbkRhdGFbVk9HTF9BQ1RDX0ZMQUdTXSA9ICIiOworICAgIC8vbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19HTENPTlRFWFRdID0gIkdMIENvbnRleHQiOworICAgIC8vLy9tX0NvbHVtblRpdGxlc1tWT0dMX0FDVENfQkVHSU5USU1FXSA9ICJCZWdpbiBUaW1lIjsKKyAgICAvLy8vbV9Db2x1bW5UaXRsZXNbVk9HTF9BQ1RDX0VORFRJTUVdID0gIkVuZCBUaW1lIjsKKyAgICAvL21fY29sdW1uRGF0YVtWT0dMX0FDVENfRFVSQVRJT05dID0gIkR1cmF0aW9uIChucykiOworICAgIG1fY29sdW1uRGF0YVswXSA9ICJBUEkgQ2FsbCI7CisgICAgbV9jb2x1bW5EYXRhWzFdID0gIkluZGV4IjsKKyAgICBtX2NvbHVtbkRhdGFbMl0gPSAiIjsKKyAgICBtX2NvbHVtbkRhdGFbM10gPSAiR0wgQ29udGV4dCI7CisgICAgbV9jb2x1bW5EYXRhWzRdID0gIkR1cmF0aW9uIChucykiOworfQorLy8KKy8vLy8gQ29uc3RydWN0b3IgZm9yIGZyYW1lIG5vZGVzCisvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6Z2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtKGdsdmRlYnVnX2ZyYW1lSXRlbSAqZnJhbWVJdGVtLCBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBhcmVudCkKKy8vICAgIDogbV9wYXJlbnRJdGVtKHBhcmVudCksCisvLyAgICAgIG1fcEFwaUNhbGxJdGVtKE5VTEwpLAorLy8gICAgICBtX3BHcm91cEl0ZW0oTlVMTCksCisvLyAgICAgIG1fcEZyYW1lSXRlbShmcmFtZUl0ZW0pLAorLy8gICAgICBtX3BNb2RlbChOVUxMKSwKKy8vICAgICAgbV9sb2NhbFJvd0luZGV4KDApCisvL3sKKy8vICAgIGlmIChmcmFtZUl0ZW0gIT0gTlVMTCkKKy8vICAgIHsKKy8vICAgICAgICBRU3RyaW5nIHRtcDsKKy8vICAgICAgICB0bXAuc3ByaW50ZigiRnJhbWUgJWxsdSIsIGZyYW1lSXRlbS0+ZnJhbWVOdW1iZXIoKSk7CisvLyAgICAgICAgbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19BUElDQUxMXSA9IHRtcDsKKy8vICAgIH0KKy8vCisvLyAgICBpZiAobV9wYXJlbnRJdGVtICE9IE5VTEwpCisvLyAgICB7CisvLyAgICAgICAgbV9wTW9kZWwgPSBtX3BhcmVudEl0ZW0tPm1fcE1vZGVsOworLy8gICAgfQorLy99CisvLworLy8vLyBDb25zdHJ1Y3RvciBmb3IgZ3JvdXAgbm9kZXMKKy8vZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtOjpnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0oZ2x2ZGVidWdfZ3JvdXBJdGVtICpncm91cEl0ZW0sIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcGFyZW50KQorLy8gICAgOiBtX3BhcmVudEl0ZW0ocGFyZW50KSwKKy8vICAgICAgbV9wQXBpQ2FsbEl0ZW0oTlVMTCksCisvLyAgICAgIG1fcEdyb3VwSXRlbShncm91cEl0ZW0pLAorLy8gICAgICBtX3BGcmFtZUl0ZW0oTlVMTCksCisvLyAgICAgIG1fcE1vZGVsKE5VTEwpLAorLy8gICAgICBtX2xvY2FsUm93SW5kZXgoMCkKKy8veworLy8gICAgbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19BUElDQUxMXSA9IGNUUkVFSVRFTV9TVEFURUNIQU5HRVM7CisvLyAgICBpZiAobV9wYXJlbnRJdGVtICE9IE5VTEwpCisvLyAgICB7CisvLyAgICAgICAgbV9wTW9kZWwgPSBtX3BhcmVudEl0ZW0tPm1fcE1vZGVsOworLy8gICAgfQorLy99CisKKy8vIENvbnN0cnVjdG9yIGZvciBhcGlDYWxsIG5vZGVzCitnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OmdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbShnbHZkZWJ1Z19hcGlDYWxsSXRlbSAqYXBpQ2FsbEl0ZW0pCisgICAgOiBtX3BhcmVudEl0ZW0oTlVMTCksCisgICAgICAvL21fcEFwaUNhbGxJdGVtKGFwaUNhbGxJdGVtKSwKKyAgICAgIC8vbV9wR3JvdXBJdGVtKE5VTEwpLAorICAgICAgLy9tX3BGcmFtZUl0ZW0oTlVMTCksCisgICAgICBtX3BNb2RlbChOVUxMKSwKKyAgICAgIG1fbG9jYWxSb3dJbmRleCgwKQoreworICAgIC8vbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19BUElDQUxMXSA9IGFwaUNhbGxJdGVtLT5hcGlGdW5jdGlvbkNhbGwoKTsKKworICAgIC8vaWYgKGFwaUNhbGxJdGVtICE9IE5VTEwpCisgICAgLy97CisgICAgLy8gICAgbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19JTkRFWF0gPSAocXVsb25nbG9uZylhcGlDYWxsSXRlbS0+Z2xvYmFsQ2FsbEluZGV4KCk7CisgICAgLy8gICAgbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19GTEFHU10gPSAiIjsKKyAgICAvLyAgICBkeW5hbWljX3N0cmluZyBzdHJDb250ZXh0OworICAgIC8vICAgIG1fY29sdW1uRGF0YVtWT0dMX0FDVENfR0xDT05URVhUXSA9IHN0ckNvbnRleHQuZm9ybWF0KCIweCUiIFBSSXg2NCwgYXBpQ2FsbEl0ZW0tPmdldEdMUGFja2V0KCktPm1fY29udGV4dF9oYW5kbGUpLmNfc3RyKCk7CisgICAgLy8gICAgLy9tX2NvbHVtbkRhdGFbVk9HTF9BQ1RDX0JFR0lOVElNRV0gPSBhcGlDYWxsSXRlbS0+c3RhcnRUaW1lKCk7CisgICAgLy8gICAgLy9tX2NvbHVtbkRhdGFbVk9HTF9BQ1RDX0VORFRJTUVdID0gYXBpQ2FsbEl0ZW0tPmVuZFRpbWUoKTsKKyAgICAvLyAgICBtX2NvbHVtbkRhdGFbVk9HTF9BQ1RDX0RVUkFUSU9OXSA9IChxdWxvbmdsb25nKWFwaUNhbGxJdGVtLT5kdXJhdGlvbigpOworICAgIC8vfQorCisgICAgLy9pZiAobV9wYXJlbnRJdGVtICE9IE5VTEwpCisgICAgLy97CisgICAgLy8gICAgbV9wTW9kZWwgPSBtX3BhcmVudEl0ZW0tPm1fcE1vZGVsOworICAgIC8vfQorCisgICAgbV9jb2x1bW5Db3VudCA9IG1fcE1vZGVsLT5jb2x1bW5Db3VudCgpOworICAgIG1fY29sdW1uRGF0YSA9IG5ldyBRVmFyaWFudFttX2NvbHVtbkNvdW50XTsKKyAgICAvL21fY29sdW1uRGF0YVtWT0dMX0FDVENfQVBJQ0FMTF0gPSAiQVBJIENhbGwiOworICAgIC8vbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19JTkRFWF0gPSAiSW5kZXgiOworICAgIC8vbV9jb2x1bW5EYXRhW1ZPR0xfQUNUQ19GTEFHU10gPSAiIjsKKyAgICAvL21fY29sdW1uRGF0YVtWT0dMX0FDVENfR0xDT05URVhUXSA9ICJHTCBDb250ZXh0IjsKKyAgICAvLy8vbV9Db2x1bW5UaXRsZXNbVk9HTF9BQ1RDX0JFR0lOVElNRV0gPSAiQmVnaW4gVGltZSI7CisgICAgLy8vL21fQ29sdW1uVGl0bGVzW1ZPR0xfQUNUQ19FTkRUSU1FXSA9ICJFbmQgVGltZSI7CisgICAgLy9tX2NvbHVtbkRhdGFbVk9HTF9BQ1RDX0RVUkFUSU9OXSA9ICJEdXJhdGlvbiAobnMpIjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fY29sdW1uQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIG1fY29sdW1uRGF0YVtpXSA9ICJkYXRhIjsKKyAgICB9Cit9CisKK2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6fmdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSgpCit7CisgICAgZGVsZXRlIFtdIG1fY29sdW1uRGF0YTsKKyAgICAvL2lmIChtX3BGcmFtZUl0ZW0gIT0gTlVMTCkKKyAgICAvL3sKKyAgICAvLyAgICB2b2dsX2RlbGV0ZShtX3BGcmFtZUl0ZW0pOworICAgIC8vICAgIG1fcEZyYW1lSXRlbSA9IE5VTEw7CisgICAgLy99CisKKyAgICAvL2lmIChtX3BHcm91cEl0ZW0gIT0gTlVMTCkKKyAgICAvL3sKKyAgICAvLyAgICB2b2dsX2RlbGV0ZShtX3BHcm91cEl0ZW0pOworICAgIC8vICAgIG1fcEdyb3VwSXRlbSA9IE5VTEw7CisgICAgLy99CisKKyAgICAvL2lmIChtX3BBcGlDYWxsSXRlbSAhPSBOVUxMKQorICAgIC8veworICAgIC8vICAgIHZvZ2xfZGVsZXRlKG1fcEFwaUNhbGxJdGVtKTsKKyAgICAvLyAgICBtX3BBcGlDYWxsSXRlbSA9IE5VTEw7CisgICAgLy99CisKKyAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgbV9jaGlsZEl0ZW1zLnNpemUoKTsgaSsrKQorICAgIC8veworICAgIC8vICAgIHZvZ2xfZGVsZXRlKG1fY2hpbGRJdGVtc1tpXSk7CisgICAgLy8gICAgbV9jaGlsZEl0ZW1zW2ldID0gTlVMTDsKKyAgICAvL30KKyAgICBtX2NoaWxkSXRlbXMuY2xlYXIoKTsKK30KKwordm9pZCBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OnNldFBhcmVudChnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0qIHBQYXJlbnQpCit7CisgICAgbV9wYXJlbnRJdGVtID0gcFBhcmVudDsKKyAgICBpZiAobV9wYXJlbnRJdGVtICE9IE5VTEwpCisgICAgeworICAgICAgICBtX3BNb2RlbCA9IG1fcGFyZW50SXRlbS0+bV9wTW9kZWw7CisgICAgfQorfQorZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OnBhcmVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGFyZW50SXRlbTsKK30KKy8vYm9vbCBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OmlzQXBpQ2FsbCgpIGNvbnN0CisvL3sKKy8vICAgIHJldHVybiBtX3BBcGlDYWxsSXRlbSAhPSBOVUxMOworLy99CisvL2Jvb2wgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtOjppc0dyb3VwKCkgY29uc3QKKy8veworLy8gICAgcmV0dXJuIChnX3NldHRpbmdzLmdyb3Vwc19zdGF0ZV9yZW5kZXIoKSAmJiAobV9wR3JvdXBJdGVtICE9IE5VTEwpKTsKKy8vfQorLy9ib29sIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6aXNGcmFtZSgpIGNvbnN0CisvL3sKKy8vICAgIHJldHVybiBtX3BGcmFtZUl0ZW0gIT0gTlVMTDsKKy8vfQorLy9ib29sIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6aXNSb290KCkgY29uc3QKKy8veworLy8gICAgcmV0dXJuICEoaXNBcGlDYWxsKCkgfCBpc0dyb3VwKCkgfCBpc0ZyYW1lKCkpOworLy99CisKK3ZvaWQgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtOjphcHBlbmRDaGlsZChnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBDaGlsZCkKK3sKKyAgICBwQ2hpbGQtPm1fbG9jYWxSb3dJbmRleCA9IG1fY2hpbGRJdGVtcy5zaXplKCk7CisgICAgcENoaWxkLT5zZXRQYXJlbnQodGhpcyk7CisgICAgbV9jaGlsZEl0ZW1zLmFwcGVuZChwQ2hpbGQpOworfQorCit2b2lkIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6cG9wQ2hpbGQoKQoreworICAgIG1fY2hpbGRJdGVtcy5yZW1vdmVMYXN0KCk7Cit9CisKK2ludCBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OmNoaWxkQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX2NoaWxkSXRlbXMuc2l6ZSgpOworfQorCitnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKmdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6Y2hpbGQoaW50IGluZGV4KSBjb25zdAoreworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY2hpbGRDb3VudCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1fY2hpbGRJdGVtc1tpbmRleF07Cit9CisKK2dsdmRlYnVnX2FwaUNhbGxJdGVtICpnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OmFwaUNhbGxJdGVtKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wQXBpQ2FsbEl0ZW07Cit9CisKK2dsdmRlYnVnX2dyb3VwSXRlbSAqZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtOjpncm91cEl0ZW0oKSBjb25zdAoreworICAgIHJldHVybiBtX3BHcm91cEl0ZW07Cit9CisKK2dsdmRlYnVnX2ZyYW1lSXRlbSAqZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtOjpmcmFtZUl0ZW0oKSBjb25zdAoreworICAgIHJldHVybiBtX3BGcmFtZUl0ZW07Cit9CisvLworLy91aW50NjRfdCBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OnN0YXJ0VGltZSgpIGNvbnN0CisvL3sKKy8vICAgIHVpbnQ2NF90IHN0YXJ0VGltZSA9IDA7CisvLworLy8gICAgaWYgKG1fcEFwaUNhbGxJdGVtKQorLy8gICAgeworLy8gICAgICAgIHN0YXJ0VGltZSA9IG1fcEFwaUNhbGxJdGVtLT5zdGFydFRpbWUoKTsKKy8vICAgIH0KKy8vICAgIGVsc2UgaWYgKG1fcEdyb3VwSXRlbSkKKy8vICAgIHsKKy8vICAgICAgICBzdGFydFRpbWUgPSBtX3BHcm91cEl0ZW0tPnN0YXJ0VGltZSgpOworLy8gICAgfQorLy8gICAgZWxzZSBpZiAobV9wRnJhbWVJdGVtKQorLy8gICAgeworLy8gICAgICAgIHN0YXJ0VGltZSA9IG1fcEZyYW1lSXRlbS0+c3RhcnRUaW1lKCk7CisvLyAgICB9CisvLyAgICBlbHNlIC8vIHJvb3QKKy8vICAgIHsKKy8vICAgICAgICBzdGFydFRpbWUgPSBjaGlsZCgwKS0+c3RhcnRUaW1lKCk7CisvLyAgICB9CisvLyAgICByZXR1cm4gc3RhcnRUaW1lOworLy99CisvLworLy91aW50NjRfdCBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW06OmVuZFRpbWUoKSBjb25zdAorLy97CisvLyAgICB1aW50NjRfdCBlbmRUaW1lID0gMDsKKy8vCisvLyAgICBpZiAobV9wQXBpQ2FsbEl0ZW0pCisvLyAgICB7CisvLyAgICAgICAgZW5kVGltZSA9IG1fcEFwaUNhbGxJdGVtLT5lbmRUaW1lKCk7CisvLyAgICB9CisvLyAgICBlbHNlIGlmIChtX3BHcm91cEl0ZW0pCisvLyAgICB7CisvLyAgICAgICAgZW5kVGltZSA9IG1fcEdyb3VwSXRlbS0+ZW5kVGltZSgpOworLy8gICAgfQorLy8gICAgZWxzZSBpZiAobV9wRnJhbWVJdGVtKQorLy8gICAgeworLy8gICAgICAgIGVuZFRpbWUgPSBtX3BGcmFtZUl0ZW0tPmVuZFRpbWUoKTsKKy8vICAgIH0KKy8vICAgIGVsc2UgLy8gcm9vdAorLy8gICAgeworLy8gICAgICAgIGVuZFRpbWUgPSBjaGlsZChjaGlsZENvdW50KCkgLSAxKS0+ZW5kVGltZSgpOworLy8gICAgfQorLy8gICAgcmV0dXJuIGVuZFRpbWU7CisvL30KKy8vCisvL3VpbnQ2NF90IGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6ZHVyYXRpb24oKSBjb25zdAorLy97CisvLyAgICByZXR1cm4gZW5kVGltZSgpIC0gc3RhcnRUaW1lKCk7CisvL30KKworLy92b2lkIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6c2V0X3NuYXBzaG90KGdsdmRlYnVnX2dsX3N0YXRlX3NuYXBzaG90ICpwU25hcHNob3QpCisvL3sKKy8vICAgIGlmIChtX3BGcmFtZUl0ZW0pCisvLyAgICB7CisvLyAgICAgICAgbV9wRnJhbWVJdGVtLT5zZXRfc25hcHNob3QocFNuYXBzaG90KTsKKy8vICAgIH0KKy8vCisvLyAgICBpZiAobV9wQXBpQ2FsbEl0ZW0pCisvLyAgICB7CisvLyAgICAgICAgbV9wQXBpQ2FsbEl0ZW0tPnNldF9zbmFwc2hvdChwU25hcHNob3QpOworLy8gICAgfQorLy99CisvLworLy9ib29sIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6aGFzX3NuYXBzaG90KCkgY29uc3QKKy8veworLy8gICAgYm9vbCBiSGFzU25hcHNob3QgPSBmYWxzZTsKKy8vICAgIGlmIChtX3BGcmFtZUl0ZW0pCisvLyAgICB7CisvLyAgICAgICAgYkhhc1NuYXBzaG90ID0gbV9wRnJhbWVJdGVtLT5oYXNfc25hcHNob3QoKTsKKy8vICAgIH0KKy8vCisvLyAgICBpZiAobV9wQXBpQ2FsbEl0ZW0pCisvLyAgICB7CisvLyAgICAgICAgYkhhc1NuYXBzaG90ID0gbV9wQXBpQ2FsbEl0ZW0tPmhhc19zbmFwc2hvdCgpOworLy8gICAgfQorLy8gICAgcmV0dXJuIGJIYXNTbmFwc2hvdDsKKy8vfQorLy8KKy8vZ2x2ZGVidWdfZ2xfc3RhdGVfc25hcHNob3QgKmdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6Z2V0X3NuYXBzaG90KCkgY29uc3QKKy8veworLy8gICAgZ2x2ZGVidWdfZ2xfc3RhdGVfc25hcHNob3QgKnBTbmFwc2hvdCA9IE5VTEw7CisvLyAgICBpZiAobV9wRnJhbWVJdGVtKQorLy8gICAgeworLy8gICAgICAgIHBTbmFwc2hvdCA9IG1fcEZyYW1lSXRlbS0+Z2V0X3NuYXBzaG90KCk7CisvLyAgICB9CisvLworLy8gICAgaWYgKG1fcEFwaUNhbGxJdGVtKQorLy8gICAgeworLy8gICAgICAgIHBTbmFwc2hvdCA9IG1fcEFwaUNhbGxJdGVtLT5nZXRfc25hcHNob3QoKTsKKy8vICAgIH0KKy8vICAgIHJldHVybiBwU25hcHNob3Q7CisvL30KKworaW50IGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6Y29sdW1uQ291bnQoKSBjb25zdAoreworICAgIGludCBjb3VudCA9IDA7CisgICAgaWYgKG1fcGFyZW50SXRlbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgY291bnQgPSBtX2NvbHVtbkNvdW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtX3BNb2RlbC0+Y29sdW1uQ291bnQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK1FWYXJpYW50IGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6Y29sdW1uRGF0YShpbnQgY29sdW1uLCBpbnQgcm9sZSkgY29uc3QKK3sKKyAgICBpZiAoY29sdW1uID49IG1fY29sdW1uQ291bnQpCisgICAgeworICAgICAgICBhc3NlcnQoISJVbmV4cGVjdGVkIGNvbHVtbiBkYXRhIGJlaW5nIHJlcXVlc3RlZCIpOworICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsKKyAgICB9CisKKyAgICBpZiAocm9sZSA9PSBRdDo6RGVjb3JhdGlvblJvbGUpCisgICAgeworICAgICAgICAvLy8vIGhhbmRsZSBmbGFncworICAgICAgICAvL2lmIChjb2x1bW4gPT0gVk9HTF9BQ1RDX0ZMQUdTKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgaWYgKGhhc19zbmFwc2hvdCgpKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBpZiAoZ2V0X3NuYXBzaG90KCktPmlzX291dGRhdGVkKCkpCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgLy8gc25hcHNob3Qgd2FzIGRpcnRpZWQgZHVlIHRvIGFuIGVhcmxpZXIgZWRpdAorICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBRQ29sb3IoMjAwLCAwLCAwKTsKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIGVsc2UgaWYgKGdldF9zbmFwc2hvdCgpLT5pc19lZGl0ZWQoKSkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAvLyBzbmFwc2hvdCBoYXMgYmVlbiBlZGl0ZWQKKyAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gUUNvbG9yKDIwMCwgMTAyLCAwKTsKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAvLyBzbmFwc2hvdCBpcyBnb29kCisgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIFFDb2xvcigwLCAwLCAyNTUpOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIGVsc2UgaWYgKGZyYW1lSXRlbSgpICE9IE5VTEwgJiYgZnJhbWVJdGVtKCktPmdldF9zY3JlZW5zaG90X2ZpbGVuYW1lKCkuc2l6ZSgpID4gMCkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgcmV0dXJuIFFJY29uKGZyYW1lSXRlbSgpLT5nZXRfc2NyZWVuc2hvdF9maWxlbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorICAgIH0KKworICAgIGlmIChyb2xlID09IFF0OjpEaXNwbGF5Um9sZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2NvbHVtbkRhdGFbY29sdW1uXTsKKyAgICB9CisKKyAgICByZXR1cm4gUVZhcmlhbnQoKTsKK30KKworLy92b2lkIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6c2V0QXBpQ2FsbENvbHVtbkRhdGEoUVN0cmluZyBuYW1lKQorLy97CisvLyAgICBzZXRDb2x1bW5EYXRhKFFWYXJpYW50KG5hbWUpLCBWT0dMX0FDVENfQVBJQ0FMTCk7CisvL30KKworLy92b2lkIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6c2V0Q29sdW1uRGF0YShRVmFyaWFudCBkYXRhLCBpbnQgY29sdW1uKQorLy97CisvLyAgICBtX2NvbHVtbkRhdGFbY29sdW1uXSA9IGRhdGE7CisvL30KKworLy9RU3RyaW5nIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6YXBpQ2FsbENvbHVtbkRhdGEoKSBjb25zdAorLy97CisvLyAgICByZXR1cm4gKGNvbHVtbkRhdGEoVk9HTF9BQ1RDX0FQSUNBTEwsIFF0OjpEaXNwbGF5Um9sZSkpLnRvU3RyaW5nKCk7CisvL30KKy8vCisvL1FTdHJpbmcgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtOjphcGlDYWxsU3RyaW5nQXJnKCkgY29uc3QKKy8veworLy8gICAgcmV0dXJuIGlzQXBpQ2FsbCgpID8gYXBpQ2FsbEl0ZW0oKS0+c3RyaW5nQXJnKCkgOiBRU3RyaW5nKCk7CisvL30KKworaW50IGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTo6cm93KCkgY29uc3QKK3sKKyAgICAvLyBub3RlLCB0aGlzIGlzIGp1c3QgdGhlIHJvdyB3aXRoaW4gdGhlIGN1cnJlbnQgbGV2ZWwgb2YgdGhlIGhpZXJhcmNoeQorICAgIHJldHVybiBtX2xvY2FsUm93SW5kZXg7Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2FwaWNhbGx0cmVlaXRlbS5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9hcGljYWxsdHJlZWl0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjI5NTkzCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9hcGljYWxsdHJlZWl0ZW0uaApAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IFJBRCBHYW1lIFRvb2xzIGFuZCBWYWx2ZSBTb2Z0d2FyZQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgR0xWREVCVUdfQVBJQ0FMTFRSRUVJVEVNX0gKKyNkZWZpbmUgR0xWREVCVUdfQVBJQ0FMTFRSRUVJVEVNX0gKKworI2luY2x1ZGUgPFFMaXN0PgorI2luY2x1ZGUgPFFWYXJpYW50PgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKworY2xhc3MgZ2x2ZGVidWdfZnJhbWVJdGVtOworY2xhc3MgZ2x2ZGVidWdfZ3JvdXBJdGVtOworY2xhc3MgZ2x2ZGVidWdfYXBpQ2FsbEl0ZW07CisKK2NsYXNzIGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOworCisKK2NvbnN0IFFTdHJpbmcgY1RSRUVJVEVNX1NUQVRFQ0hBTkdFUygiU3RhdGUgY2hhbmdlcyIpOworLy8gVE9ETzogTWF5YmUgdGhpbmsgYWJvdXQgYSBtb3JlIHVuaXF1ZSBuYW1lIHNvIGFzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoLAorLy8gICAgICAgZS5nLiwgYSBtYXJrZXJfcHVzaCBlbnRyeXBvaW50IHRoYXQgaGFzIGFsc28gYmVlbiBuYW1lZCAiUmVuZGVyIgorY29uc3QgUVN0cmluZyBjVFJFRUlURU1fUkVOREVSKCJSZW5kZXIiKTsKKworY2xhc3MgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtCit7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IgZm9yIHRoZSByb290IG5vZGUKKyAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0oaW50IGNvbHVtbkNvdW50LCBnbHZkZWJ1Z19RQXBpQ2FsbFRyZWVNb2RlbCAqcE1vZGVsKTsKKworICAgIC8vLy8gQ29uc3RydWN0b3IgZm9yIGZyYW1lIG5vZGVzCisgICAgLy9nbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0oZ2x2ZGVidWdfZnJhbWVJdGVtICpmcmFtZUl0ZW0sIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcGFyZW50KTsKKworICAgIC8vLy8gQ29uc3RydWN0b3IgZm9yIGdyb3VwIG5vZGVzCisgICAgLy9nbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0oZ2x2ZGVidWdfZ3JvdXBJdGVtICpncm91cEl0ZW0sIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcGFyZW50KTsKKworICAgIC8vIENvbnN0cnVjdG9yIGZvciBhcGlDYWxsIG5vZGVzCisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtKGdsdmRlYnVnX2FwaUNhbGxJdGVtICphcGlDYWxsSXRlbSk7CisKKyAgICB+Z2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtKCk7CisKKyAgICB2b2lkIHNldFBhcmVudChnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0qIHBQYXJlbnQpOworICAgIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcGFyZW50KCkgY29uc3Q7CisKKyAgICB2b2lkIGFwcGVuZENoaWxkKGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcENoaWxkKTsKKyAgICB2b2lkIHBvcENoaWxkKCk7CisKKyAgICBpbnQgY2hpbGRDb3VudCgpIGNvbnN0OworCisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpjaGlsZChpbnQgaW5kZXgpIGNvbnN0OworCisgICAgZ2x2ZGVidWdfYXBpQ2FsbEl0ZW0gKmFwaUNhbGxJdGVtKCkgY29uc3Q7CisgICAgZ2x2ZGVidWdfZ3JvdXBJdGVtICpncm91cEl0ZW0oKSBjb25zdDsKKyAgICBnbHZkZWJ1Z19mcmFtZUl0ZW0gKmZyYW1lSXRlbSgpIGNvbnN0OworICAgIAorICAgIGludCBjb2x1bW5Db3VudCgpIGNvbnN0OworCisgICAgUVZhcmlhbnQgY29sdW1uRGF0YShpbnQgY29sdW1uLCBpbnQgcm9sZSkgY29uc3Q7CisKKyAgICBpbnQgcm93KCkgY29uc3Q7CisKKyAgICAvL2Jvb2wgaXNBcGlDYWxsKCkgY29uc3Q7CisgICAgLy9ib29sIGlzR3JvdXAoKSBjb25zdDsKKyAgICAvL2Jvb2wgaXNGcmFtZSgpIGNvbnN0OworICAgIC8vYm9vbCBpc1Jvb3QoKSBjb25zdDsKKworcHJpdmF0ZToKKy8vICAgIHZvaWQgc2V0Q29sdW1uRGF0YShRVmFyaWFudCBkYXRhLCBpbnQgY29sdW1uKTsKKworcHJpdmF0ZToKKyAgICBRTGlzdDxnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKj4gbV9jaGlsZEl0ZW1zOworICAgIFFWYXJpYW50KiBtX2NvbHVtbkRhdGE7CisgICAgaW50IG1fY29sdW1uQ291bnQ7CisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICptX3BhcmVudEl0ZW07CisgICAgLy9nbHZkZWJ1Z19hcGlDYWxsSXRlbSAqbV9wQXBpQ2FsbEl0ZW07CisgICAgLy9nbHZkZWJ1Z19ncm91cEl0ZW0gKm1fcEdyb3VwSXRlbTsKKyAgICAvL2dsdmRlYnVnX2ZyYW1lSXRlbSAqbV9wRnJhbWVJdGVtOworICAgIGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsICptX3BNb2RlbDsKKyAgICBpbnQgbV9sb2NhbFJvd0luZGV4OworfTsKKworI2VuZGlmIC8vIEdMVkRFQlVHX0FQSUNBTExUUkVFSVRFTV9ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2NvbnRyb2xsZXIuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MzgzMWQKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2NvbnRyb2xsZXIuaApAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV91dGlscy5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfdmlldy5oIgorI2luY2x1ZGUgInZrdHJhY2Vfc2V0dGluZ3MuaCIKKworI2luY2x1ZGUgPFFPYmplY3Q+CisKK2NsYXNzIHZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIgOiBwdWJsaWMgUU9iamVjdAoreworcHVibGljOgorICAgIHZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIoKSB7fQorICAgIHZpcnR1YWwgfnZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBHZXRQYWNrZXRJZFN0cmluZyh1aW50MTZfdCBwYWNrZXRJZCkgPSAwOworICAgIHZpcnR1YWwgdmt0cmFjZV9TZXR0aW5nR3JvdXAqIEdldFNldHRpbmdzKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBVcGRhdGVGcm9tU2V0dGluZ3Modmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBTZXR0aW5nR3JvdXBzLCB1bnNpZ25lZCBpbnQgbnVtU2V0dGluZ0dyb3VwcykgPSAwOworICAgIHZpcnR1YWwgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBJbnRlcnByZXRUcmFjZVBhY2tldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgTG9hZFRyYWNlRmlsZSh2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyogcFRyYWNlRmlsZUluZm8sIHZrdHJhY2V2aWV3ZXJfdmlldyogcFZpZXcpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgVW5sb2FkVHJhY2VGaWxlKHZvaWQpID0gMDsKKworcHVibGljIHNsb3RzOgorCitzaWduYWxzOgorICAgIHZvaWQgT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpOworICAgIHZvaWQgT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBRU3RyaW5nJiBtZXNzYWdlKTsKK307CisKK2V4dGVybiAiQyIKK3sKK1ZLVFJBQ0VSX0VYUE9SVCB2a3RyYWNldmlld2VyX1FDb250cm9sbGVyKiBWS1RSQUNFUl9DREVDTCB2dHZDcmVhdGVRQ29udHJvbGxlcih2b2lkKTsKK1ZLVFJBQ0VSX0VYUE9SVCB2b2lkIFZLVFJBQ0VSX0NERUNMIHZ0dkRlbGV0ZVFDb250cm9sbGVyKHZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIqKiBwcENvbnRyb2xsZXIpOworCisvLyBlbnRyeXBvaW50cyB0aGF0IG11c3QgYmUgZXhwb3NlZCBieSBlYWNoIGNvbnRyb2xsZXIgbGlicmFyeQordHlwZWRlZiB2a3RyYWNldmlld2VyX1FDb250cm9sbGVyKiAoVktUUkFDRVJfQ0RFQ0wgKmZ1bmNwdHJfdmt0cmFjZXZpZXdlcl9DcmVhdGVRQ29udHJvbGxlcikodm9pZCk7Cit0eXBlZGVmIHZvaWQgKFZLVFJBQ0VSX0NERUNMICpmdW5jcHRyX3ZrdHJhY2V2aWV3ZXJfRGVsZXRlUUNvbnRyb2xsZXIpKHZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIqIHBDb250cm9sbGVyKTsKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5LmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjViMmMyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9jb250cm9sbGVyX2ZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIgorCit2a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeTo6dmt0cmFjZXZpZXdlcl9jb250cm9sbGVyX2ZhY3RvcnkoKQoreworfQorCit2a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeTo6fnZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5KCkKK3sKK30KKwordmt0cmFjZXZpZXdlcl9RQ29udHJvbGxlciAqdmt0cmFjZXZpZXdlcl9jb250cm9sbGVyX2ZhY3Rvcnk6OkxvYWQoY29uc3QgY2hhciogZmlsZW5hbWUpCit7CisgICAgdm9pZCogcExpYnJhcnkgPSB2a3RyYWNlX3BsYXRmb3JtX29wZW5fbGlicmFyeShmaWxlbmFtZSk7CisgICAgaWYgKHBMaWJyYXJ5ID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gbG9hZCBjb250cm9sbGVyICclcyciLCBmaWxlbmFtZSk7CisjaWYgZGVmaW5lZChQTEFURk9STV9MSU5VWCkKKyAgICAgICAgY2hhciogZXJyb3IgPSBkbGVycm9yKCk7CisgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkR1ZSB0bzogJXMiLCBlcnJvcik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdmt0cmFjZXZpZXdlcl9RQ29udHJvbGxlciogcENvbnRyb2xsZXIgPSBOVUxMOworICAgIGZ1bmNwdHJfdmt0cmFjZXZpZXdlcl9DcmVhdGVRQ29udHJvbGxlciBDcmVhdGVRQ29udHJvbGxlciA9IChmdW5jcHRyX3ZrdHJhY2V2aWV3ZXJfQ3JlYXRlUUNvbnRyb2xsZXIpdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAidnR2Q3JlYXRlUUNvbnRyb2xsZXIiKTsKKyAgICBmdW5jcHRyX3ZrdHJhY2V2aWV3ZXJfRGVsZXRlUUNvbnRyb2xsZXIgRGVsZXRlUUNvbnRyb2xsZXIgPSAoZnVuY3B0cl92a3RyYWNldmlld2VyX0RlbGV0ZVFDb250cm9sbGVyKXZrdHJhY2VfcGxhdGZvcm1fZ2V0X2xpYnJhcnlfZW50cnlwb2ludChwTGlicmFyeSwgInZ0dkRlbGV0ZVFDb250cm9sbGVyIik7CisgICAgaWYgKENyZWF0ZVFDb250cm9sbGVyID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJDb250cm9sbGVyICclcycgaXMgbWlzc2luZyBlbnRyeXBvaW50ICd2dHZDcmVhdGVRQ29udHJvbGxlcicuXG4iLCBmaWxlbmFtZSk7CisgICAgfQorICAgIGlmIChEZWxldGVRQ29udHJvbGxlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ29udHJvbGxlciAnJXMnIGlzIG1pc3NpbmcgZW50cnlwb2ludCAndnR2RGVsZXRlUUNvbnRyb2xsZXInLlxuIiwgZmlsZW5hbWUpOworICAgIH0KKworICAgIGlmIChDcmVhdGVRQ29udHJvbGxlciAhPSBOVUxMICYmCisgICAgICAgIERlbGV0ZVFDb250cm9sbGVyICE9IE5VTEwpCisgICAgeworICAgICAgICBwQ29udHJvbGxlciA9IENyZWF0ZVFDb250cm9sbGVyKCk7CisgICAgfQorCisgICAgaWYgKHBDb250cm9sbGVyICE9IE5VTEwpCisgICAgeworICAgICAgICBtX2NvbnRyb2xsZXJUb0xpYnJhcnlNYXBbcENvbnRyb2xsZXJdID0gcExpYnJhcnk7CisgICAgfQorCisgICAgcmV0dXJuIHBDb250cm9sbGVyOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5OjpVbmxvYWQodmt0cmFjZXZpZXdlcl9RQ29udHJvbGxlcioqIHBwQ29udHJvbGxlcikKK3sKKyAgICBhc3NlcnQocHBDb250cm9sbGVyICE9IE5VTEwpOworICAgIGFzc2VydCgqcHBDb250cm9sbGVyICE9IE5VTEwpOworCisgICAgdm9pZCogcExpYnJhcnkgPSBtX2NvbnRyb2xsZXJUb0xpYnJhcnlNYXBbKnBwQ29udHJvbGxlcl07CisgICAgaWYgKHBMaWJyYXJ5ID09IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJOVUxMIExpYnJhcnkgZW5jb3VudGVyZWQgd2hpbGUgdW5sb2FkaW5nIGNvbnRyb2xsZXIuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZ1bmNwdHJfdmt0cmFjZXZpZXdlcl9EZWxldGVRQ29udHJvbGxlciBEZWxldGVRQ29udHJvbGxlciA9IChmdW5jcHRyX3ZrdHJhY2V2aWV3ZXJfRGVsZXRlUUNvbnRyb2xsZXIpdmt0cmFjZV9wbGF0Zm9ybV9nZXRfbGlicmFyeV9lbnRyeXBvaW50KHBMaWJyYXJ5LCAidnR2RGVsZXRlUUNvbnRyb2xsZXIiKTsKKyAgICAgICAgaWYgKERlbGV0ZVFDb250cm9sbGVyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZVFDb250cm9sbGVyKCpwcENvbnRyb2xsZXIpOworICAgICAgICAgICAgKnBwQ29udHJvbGxlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB2a3RyYWNlX3BsYXRmb3JtX2Nsb3NlX2xpYnJhcnkocExpYnJhcnkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5LmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTI0MmEKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBWS1RSQUNFVklFV0VSX0NPTlRST0xMRVJfRkFDVE9SWV9ICisjZGVmaW5lIFZLVFJBQ0VWSUVXRVJfQ09OVFJPTExFUl9GQUNUT1JZX0gKKworI2luY2x1ZGUgPFFNYXA+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZrdHJhY2VfY29tbW9uLmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfaWRlbnRpZmllcnMuaCIKK30KKworI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oIgorCitjbGFzcyB2a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeQoreworcHVibGljOgorICAgIHZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5KCk7CisgICAgfnZrdHJhY2V2aWV3ZXJfY29udHJvbGxlcl9mYWN0b3J5KCk7CisKKyAgICB2a3RyYWNldmlld2VyX1FDb250cm9sbGVyKiBMb2FkKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKKyAgICB2b2lkIFVubG9hZCh2a3RyYWNldmlld2VyX1FDb250cm9sbGVyKiogcHBDb250cm9sbGVyKTsKKworcHJpdmF0ZToKKyAgICBRTWFwPHZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIqLCB2b2lkKj4gbV9jb250cm9sbGVyVG9MaWJyYXJ5TWFwOworfTsKKworI2VuZGlmIC8vIFZLVFJBQ0VWSUVXRVJfQ09OVFJPTExFUl9GQUNUT1JZX0gKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfZnJhbWVpdGVtLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2ZyYW1laXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2YwMTEKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX2ZyYW1laXRlbS5oCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IFJBRCBHYW1lIFRvb2xzIGFuZCBWYWx2ZSBTb2Z0d2FyZQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBWT0dMRURJVE9SX0ZSQU1FSVRFTV9ICisjZGVmaW5lIFZPR0xFRElUT1JfRlJBTUVJVEVNX0gKKworI2luY2x1ZGUgPFFMaXN0PgorCisvLyBleHRlcm5hbCBjbGFzcyAoY291bGQgYmUgcHJlZGVjbGFyZWQgaWYKKy8vIGRlZmluaXRpb25zIHdlcmUgbW92ZSB0byBhIC5jcHAgZmlsZSkKKyNpbmNsdWRlICJnbHZkZWJ1Z19hcGljYWxsaXRlbS5oIgorCitjbGFzcyB2b2dsZWRpdG9yX2ZyYW1lSXRlbSAvLzogcHVibGljIHZvZ2xlZGl0b3Jfc25hcHNob3RJdGVtCit7CitwdWJsaWM6CisgICAgdm9nbGVkaXRvcl9mcmFtZUl0ZW0odWludDY0X3QgZnJhbWVOdW1iZXIpCisgICAgICAgIDogbV9mcmFtZU51bWJlcihmcmFtZU51bWJlcikKKyAgICB7CisgICAgfQorCisgICAgfnZvZ2xlZGl0b3JfZnJhbWVJdGVtKCkKKyAgICB7CisgICAgICAgIG1fYXBpQ2FsbExpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9ncm91cExpc3QuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvL2lubGluZSB1aW50NjRfdCBmcmFtZU51bWJlcigpIGNvbnN0CisgICAgLy97CisgICAgLy8gICAgcmV0dXJuIG1fZnJhbWVOdW1iZXI7CisgICAgLy99CisKKyAgICAvL3ZvaWQgYXBwZW5kR3JvdXAodm9nbGVkaXRvcl9ncm91cEl0ZW0gKnBJdGVtKQorICAgIC8veworICAgIC8vICAgIG1fZ3JvdXBMaXN0LmFwcGVuZChwSXRlbSk7CisgICAgLy99CisKKyAgICAvL3ZvZ2xlZGl0b3JfYXBpQ2FsbEl0ZW0gKnBvcEFwaUNhbGwoKQorICAgIC8veworICAgIC8vICAgIHJldHVybiBtX2FwaUNhbGxMaXN0LnRha2VMYXN0KCk7CisgICAgLy99CisKKyAgICAvL3ZvZ2xlZGl0b3JfZ3JvdXBJdGVtICpwb3BHcm91cCgpCisgICAgLy97CisgICAgLy8gICAgcmV0dXJuIG1fZ3JvdXBMaXN0LnRha2VMYXN0KCk7CisgICAgLy99CisKKyAgICAvL3ZvaWQgYXBwZW5kQ2FsbCh2b2dsZWRpdG9yX2FwaUNhbGxJdGVtICpwSXRlbSkKKyAgICAvL3sKKyAgICAvLyAgICBtX2FwaUNhbGxMaXN0LmFwcGVuZChwSXRlbSk7CisgICAgLy99CisKKyAgICAvL2lubGluZSBpbnQgY2FsbENvdW50KCkgY29uc3QKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gbV9hcGlDYWxsTGlzdC5zaXplKCk7CisgICAgLy99CisKKyAgICAvL3ZvZ2xlZGl0b3JfYXBpQ2FsbEl0ZW0gKmNhbGwoaW50IGluZGV4KSBjb25zdAorICAgIC8veworICAgIC8vICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBjYWxsQ291bnQoKSkKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIHJldHVybiBOVUxMOworICAgIC8vICAgIH0KKworICAgIC8vICAgIHJldHVybiBtX2FwaUNhbGxMaXN0W2luZGV4XTsKKyAgICAvL30KKworICAgIC8vYm9vbCBnZXRTdGFydEVuZFRpbWVzKHVpbnQ2NF90ICZzdGFydCwgdWludDY0X3QgJmVuZCkgY29uc3QKKyAgICAvL3sKKyAgICAvLyAgICBpZiAoY2FsbENvdW50KCkgPT0gMCkKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyAgICB9CisKKyAgICAvLyAgICBzdGFydCA9IHN0YXJ0VGltZSgpOworICAgIC8vICAgIGVuZCA9IGVuZFRpbWUoKTsKKyAgICAvLyAgICByZXR1cm4gdHJ1ZTsKKyAgICAvL30KKworICAgIC8vdWludDY0X3Qgc3RhcnRUaW1lKCkgY29uc3QKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gYXBpQ2FsbFN0YXJ0VGltZSgwKTsKKyAgICAvL30KKworICAgIC8vdWludDY0X3QgZW5kVGltZSgpIGNvbnN0CisgICAgLy97CisgICAgLy8gICAgcmV0dXJuIGFwaUNhbGxFbmRUaW1lKGNhbGxDb3VudCgpIC0gMSk7CisgICAgLy99CisKKyAgICAvL3VpbnQ2NF90IGFwaUNhbGxTdGFydFRpbWUodWludCBpbmRleCkgY29uc3QKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gbV9hcGlDYWxsTGlzdFtpbmRleF0tPnN0YXJ0VGltZSgpOworICAgIC8vfQorCisgICAgLy91aW50NjRfdCBhcGlDYWxsRW5kVGltZSh1aW50IGluZGV4KSBjb25zdAorICAgIC8veworICAgIC8vICAgIHJldHVybiBtX2FwaUNhbGxMaXN0W2luZGV4XS0+ZW5kVGltZSgpOworICAgIC8vfQorCisgICAgLy91aW50NjRfdCBkdXJhdGlvbigpIGNvbnN0CisgICAgLy97CisgICAgLy8gICAgcmV0dXJuIChlbmRUaW1lKCkgLSBzdGFydFRpbWUoKSk7CisgICAgLy99CisKKyAgICAvL3ZvaWQgc2V0X3NjcmVlbnNob3RfZmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKQorICAgIC8veworICAgIC8vICAgIG1fc2NyZWVuc2hvdF9maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIC8vfQorCisgICAgLy9jb25zdCBzdGQ6OnN0cmluZyAmZ2V0X3NjcmVlbnNob3RfZmlsZW5hbWUoKSBjb25zdAorICAgIC8veworICAgIC8vICAgIHJldHVybiBtX3NjcmVlbnNob3RfZmlsZW5hbWU7CisgICAgLy99CisKK3ByaXZhdGU6CisgICAgdWludDY0X3QgbV9mcmFtZU51bWJlcjsKKyAgICBRTGlzdDxnbHZkZWJ1Z19hcGlDYWxsSXRlbSAqPiBtX2FwaUNhbGxMaXN0OworICAgIFFMaXN0PHZvZ2xlZGl0b3JfZ3JvdXBJdGVtICo+IG1fZ3JvdXBMaXN0OworCisgICAgLy9zdGQ6OnN0cmluZyBtX3NjcmVlbnNob3RfZmlsZW5hbWU7Cit9OworCisjZW5kaWYgLy8gVk9HTEVESVRPUl9GUkFNRUlURU1fSApkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9ncm91cGl0ZW0uaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfZ3JvdXBpdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMTA5YQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfZ3JvdXBpdGVtLmgKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTMtMjAxNCBSQUQgR2FtZSBUb29scyBhbmQgVmFsdmUgU29mdHdhcmUKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFFMaXN0PgorLy8jaW5jbHVkZSAiZ2x2ZGVidWdfc25hcHNob3RpdGVtLmgiCisjaW5jbHVkZSAiZ2x2ZGVidWdfYXBpY2FsbGl0ZW0uaCIKKworY2xhc3Mgdm9nbGVkaXRvcl9mcmFtZUl0ZW07CisKK2NsYXNzIHZvZ2xlZGl0b3JfZ3JvdXBJdGVtIC8vOiBwdWJsaWMgdm9nbGVkaXRvcl9zbmFwc2hvdEl0ZW0KK3sKK3B1YmxpYzoKKyAgICB2b2dsZWRpdG9yX2dyb3VwSXRlbSh2b2dsZWRpdG9yX2ZyYW1lSXRlbSAqcEZyYW1lSXRlbSkKKyAgICAgICAgOiBtX3BQYXJlbnRGcmFtZShwRnJhbWVJdGVtKQorICAgIHsKKyAgICB9CisKKyAgICB+dm9nbGVkaXRvcl9ncm91cEl0ZW0oKQorICAgIHsKKyAgICAgICAgbV9hcGlDYWxsTGlzdC5jbGVhcigpOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kQ2FsbChnbHZkZWJ1Z19hcGlDYWxsSXRlbSAqcEl0ZW0pCisgICAgeworICAgICAgICBtX2FwaUNhbGxMaXN0LmFwcGVuZChwSXRlbSk7CisgICAgfQorCisgICAgaW5saW5lIGludCBjYWxsQ291bnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fYXBpQ2FsbExpc3Quc2l6ZSgpOworICAgIH0KKworICAgIGdsdmRlYnVnX2FwaUNhbGxJdGVtICpjYWxsKGludCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBjYWxsQ291bnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1fYXBpQ2FsbExpc3RbaW5kZXhdOworICAgIH0KKworICAgIC8vaW5saW5lIHVpbnQ2NF90IGZpcnN0QXBpQ2FsbEluZGV4KCkgY29uc3QKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gYXBpQ2FsbEluZGV4KDApOworICAgIC8vfQorCisgICAgLy9pbmxpbmUgdWludDY0X3QgYXBpQ2FsbEluZGV4KGludCBpbmRleCA9IDApIGNvbnN0CisgICAgLy97CisgICAgLy8gICAgaWYgKHZvZ2xlZGl0b3JfYXBpQ2FsbEl0ZW0gKmFwaUNhbGxJdGVtID0gY2FsbChpbmRleCkpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICByZXR1cm4gYXBpQ2FsbEl0ZW0tPmdsb2JhbENhbGxJbmRleCgpOworICAgIC8vICAgIH0KKyAgICAvLyAgICByZXR1cm4gdWludDY0X3QoLTEpOyAvLyAoLTEgaW5kZXggd29uJ3QgYmUgZm91bmQpCisgICAgLy99CisKKyAgICAvL2lubGluZSB1aW50NjRfdCBzdGFydFRpbWUoKSBjb25zdAorICAgIC8veworICAgIC8vICAgIHJldHVybiBtX2FwaUNhbGxMaXN0WzBdLT5zdGFydFRpbWUoKTsKKyAgICAvL30KKworICAgIC8vaW5saW5lIHVpbnQ2NF90IGVuZFRpbWUoKSBjb25zdAorICAgIC8veworICAgIC8vICAgIHJldHVybiBtX2FwaUNhbGxMaXN0W2NhbGxDb3VudCgpIC0gMV0tPmVuZFRpbWUoKTsKKyAgICAvL30KKworICAgIC8vaW5saW5lIHVpbnQ2NF90IGR1cmF0aW9uKCkgY29uc3QKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gZW5kVGltZSgpIC0gc3RhcnRUaW1lKCk7CisgICAgLy99CisKK3ByaXZhdGU6CisgICAgdm9nbGVkaXRvcl9mcmFtZUl0ZW0gKm1fcFBhcmVudEZyYW1lOworICAgIFFMaXN0PGdsdmRlYnVnX2FwaUNhbGxJdGVtICo+IG1fYXBpQ2FsbExpc3Q7Cit9OwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9vdXRwdXQuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9vdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODE4M2YKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX291dHB1dC5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfb3V0cHV0LmgiCisjaW5jbHVkZSA8UVRleHRFZGl0PgorCit2a3RyYWNldmlld2VyX291dHB1dCBnc19PVVRQVVQ7CisKK3ZrdHJhY2V2aWV3ZXJfb3V0cHV0Ojp2a3RyYWNldmlld2VyX291dHB1dCgpCit7Cit9CisKK3ZrdHJhY2V2aWV3ZXJfb3V0cHV0Ojp+dmt0cmFjZXZpZXdlcl9vdXRwdXQoKQoreworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfb3V0cHV0Ojppbml0KFFUZXh0QnJvd3NlciAqcFRleHRFZGl0KQoreworICAgIG1fcFRleHRFZGl0ID0gcFRleHRFZGl0OworfQorCitRU3RyaW5nIHZrdHJhY2V2aWV3ZXJfb3V0cHV0Ojpjb252ZXJ0VG9IdG1sKFFTdHJpbmcgbWVzc2FnZSkKK3sKKyAgICBRU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAobWVzc2FnZS5lbmRzV2l0aCgiXG4iKSkKKyAgICB7CisgICAgICAgIG1lc3NhZ2UuY2hvcCgxKTsKKyAgICB9CisgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJcbiIsICI8YnI+Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX291dHB1dDo6bW92ZUN1cnNvclRvRW5kKCkKK3sKKyAgICBRVGV4dEN1cnNvciBjdXJzb3IgPSBtX3BUZXh0RWRpdC0+dGV4dEN1cnNvcigpOworICAgIGN1cnNvci5tb3ZlUG9zaXRpb24oUVRleHRDdXJzb3I6OkVuZCwgUVRleHRDdXJzb3I6Ok1vdmVBbmNob3IpOworICAgIG1fcFRleHRFZGl0LT5zZXRUZXh0Q3Vyc29yKGN1cnNvcik7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9vdXRwdXQ6Om1lc3NhZ2UodWludDY0X3QgcGFja2V0SW5kZXgsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpCit7CisgICAgaWYgKG1fcFRleHRFZGl0ICE9IE5VTEwpCisgICAgeworICAgICAgICBRU3RyaW5nIG1zZzsKKyAgICAgICAgaWYgKHBhY2tldEluZGV4ID09ICh1aW50NjRfdCktMSkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnID0gbWVzc2FnZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyA9IFFTdHJpbmcoIig8YSBocmVmPSdwYWNrZXQjJTEnPiUxPC9hPik6ICUyICIpLmFyZyhwYWNrZXRJbmRleCkuYXJnKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIG1vdmVDdXJzb3JUb0VuZCgpOworICAgICAgICBtX3BUZXh0RWRpdC0+YXBwZW5kKG1zZyk7CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfb3V0cHV0Ojp3YXJuaW5nKHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBRU3RyaW5nJiB3YXJuaW5nKQoreworICAgIGlmIChtX3BUZXh0RWRpdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUVN0cmluZyBtc2c7CisgICAgICAgIGlmIChwYWNrZXRJbmRleCA9PSAodWludDY0X3QpLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyA9IFFTdHJpbmcoIjxmb250IGNvbG9yPSdyZWQnPldhcm5pbmc6ICUxPC9mb250PiAiKS5hcmcod2FybmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtc2cgPSBRU3RyaW5nKCI8Zm9udCBjb2xvcj0ncmVkJz4oPGEgaHJlZj0ncGFja2V0IyUxJz4lMTwvYT4pIFdhcm5pbmc6ICUyPC9mb250PiAiKS5hcmcocGFja2V0SW5kZXgpLmFyZyh3YXJuaW5nKTsKKyAgICAgICAgfQorICAgICAgICBtb3ZlQ3Vyc29yVG9FbmQoKTsKKyAgICAgICAgbV9wVGV4dEVkaXQtPmFwcGVuZChtc2cpOworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX291dHB1dDo6ZXJyb3IodWludDY0X3QgcGFja2V0SW5kZXgsIGNvbnN0IFFTdHJpbmcmIGVycm9yKQoreworICAgIGlmIChtX3BUZXh0RWRpdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUVN0cmluZyBtc2c7CisgICAgICAgIGlmIChwYWNrZXRJbmRleCA9PSAodWludDY0X3QpLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyA9IFFTdHJpbmcoIjxmb250IGNvbG9yPSdyZWQnPjxiPkVycm9yOiAlMTwvYj48L2ZvbnQ+ICIpLmFyZyhjb252ZXJ0VG9IdG1sKGVycm9yKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtc2cgPSBRU3RyaW5nKCI8Zm9udCBjb2xvcj0ncmVkJz48Yj4oPGEgaHJlZj0ncGFja2V0IyUxJz4lMTwvYT4pIEVycm9yOiAlMjwvYj48L2ZvbnQ+ICIpLmFyZyhwYWNrZXRJbmRleCkuYXJnKGNvbnZlcnRUb0h0bWwoZXJyb3IpKTsKKyAgICAgICAgfQorICAgICAgICBtb3ZlQ3Vyc29yVG9FbmQoKTsKKyAgICAgICAgbV9wVGV4dEVkaXQtPmFwcGVuZChtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfb3V0cHV0LmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX291dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmY2NjUKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX291dHB1dC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBWS1RSQUNFVklFV0VSX09VVFBVVF9ICisjZGVmaW5lIFZLVFJBQ0VWSUVXRVJfT1VUUFVUX0gKKworI2luY2x1ZGUgPFFTdHJpbmc+CisjaW5jbHVkZSA8UVRleHRCcm93c2VyPgorZXh0ZXJuICJDIgoreworI2luY2x1ZGUgInZrdHJhY2VfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlbG9nLmgiCit9CisKK2NsYXNzIFFUZXh0RWRpdDsKKworY2xhc3Mgdmt0cmFjZXZpZXdlcl9vdXRwdXQKK3sKK3B1YmxpYzoKKyAgICB2a3RyYWNldmlld2VyX291dHB1dCgpOworICAgIH52a3RyYWNldmlld2VyX291dHB1dCgpOworCisgICAgdm9pZCBpbml0KFFUZXh0QnJvd3NlciogcFRleHRFZGl0KTsKKworICAgIHZvaWQgbWVzc2FnZSh1aW50NjRfdCBwYWNrZXRJbmRleCwgY29uc3QgUVN0cmluZyYgbWVzc2FnZSk7CisgICAgdm9pZCB3YXJuaW5nKHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBRU3RyaW5nJiB3YXJuaW5nKTsKKyAgICB2b2lkIGVycm9yKHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBRU3RyaW5nJiBlcnJvcik7CisKK3ByaXZhdGU6CisgICAgUVN0cmluZyBjb252ZXJ0VG9IdG1sKFFTdHJpbmcgbWVzc2FnZSk7CisgICAgdm9pZCBtb3ZlQ3Vyc29yVG9FbmQoKTsKKyAgICBRVGV4dEJyb3dzZXIqIG1fcFRleHRFZGl0OworfTsKKworZXh0ZXJuIHZrdHJhY2V2aWV3ZXJfb3V0cHV0IGdzX09VVFBVVDsKKworaW5saW5lIHZvaWQgdmt0cmFjZXZpZXdlcl9vdXRwdXRfaW5pdChRVGV4dEJyb3dzZXIqIHBUZXh0RWRpdCkgeyBnc19PVVRQVVQuaW5pdChwVGV4dEVkaXQpOyB9CisKK2lubGluZSB2b2lkIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X21lc3NhZ2UodWludDY0X3QgcGFja2V0SW5kZXgsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpIHsgZ3NfT1VUUFVULm1lc3NhZ2UocGFja2V0SW5kZXgsIG1lc3NhZ2UpOyB9CitpbmxpbmUgdm9pZCB2a3RyYWNldmlld2VyX291dHB1dF9tZXNzYWdlKGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpIHsgZ3NfT1VUUFVULm1lc3NhZ2UoLTEsIG1lc3NhZ2UpOyB9CisKK2lubGluZSB2b2lkIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X3dhcm5pbmcodWludDY0X3QgcGFja2V0SW5kZXgsIGNvbnN0IFFTdHJpbmcmIHdhcm5pbmcpIHsgZ3NfT1VUUFVULndhcm5pbmcocGFja2V0SW5kZXgsIHdhcm5pbmcpOyB9CitpbmxpbmUgdm9pZCB2a3RyYWNldmlld2VyX291dHB1dF93YXJuaW5nKGNvbnN0IFFTdHJpbmcmIHdhcm5pbmcpIHsgZ3NfT1VUUFVULndhcm5pbmcoLTEsIHdhcm5pbmcpOyB9CisKK2lubGluZSB2b2lkIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X2Vycm9yKHVpbnQ2NF90IHBhY2tldEluZGV4LCBjb25zdCBRU3RyaW5nJiBlcnJvcikgeyBnc19PVVRQVVQuZXJyb3IocGFja2V0SW5kZXgsIGVycm9yKTsgfQoraW5saW5lIHZvaWQgdmt0cmFjZXZpZXdlcl9vdXRwdXRfZXJyb3IoY29uc3QgUVN0cmluZyYgZXJyb3IpIHsgZ3NfT1VUUFVULmVycm9yKC0xLCBlcnJvcik7IH0KK2lubGluZSB2b2lkIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X2RlaW5pdCgpIHsgZ3NfT1VUUFVULmluaXQoMCk7IH0KKworI2VuZGlmIC8vIFZLVFJBQ0VWSUVXRVJfT1VUUFVUX0gKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcWFwaWNhbGx0cmVlbW9kZWwuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xYXBpY2FsbHRyZWVtb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhZDgwNQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcWFwaWNhbGx0cmVlbW9kZWwuY3BwCkBAIC0wLDAgKzEsNDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IFJBRCBHYW1lIFRvb2xzIGFuZCBWYWx2ZSBTb2Z0d2FyZQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxRQ29sb3I+CisjaW5jbHVkZSA8UUZvbnQ+CisjaW5jbHVkZSA8UUxvY2FsZT4KKworI2luY2x1ZGUgImdsdmRlYnVnX3FhcGljYWxsdHJlZW1vZGVsLmgiCisjaW5jbHVkZSAiZ2x2X2NvbW1vbi5oIgorI2luY2x1ZGUgImdsdl90cmFjZV9wYWNrZXRfaWRlbnRpZmllcnMuaCIKKworI2luY2x1ZGUgImdsdmRlYnVnX2FwaWNhbGx0cmVlaXRlbS5oIgorLy8jaW5jbHVkZSAiZ2x2ZGVidWdfZnJhbWVpdGVtLmgiCisvLyNpbmNsdWRlICJnbHZkZWJ1Z19ncm91cGl0ZW0uaCIKKy8vI2luY2x1ZGUgImdsdmRlYnVnX2FwaWNhbGxpdGVtLmgiCisjaW5jbHVkZSAiZ2x2ZGVidWdfb3V0cHV0LmgiCisjaW5jbHVkZSAiZ2x2ZGVidWdfc2V0dGluZ3MuaCIKKworZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OmdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsKGludCBjb2x1bW5Db3VudCwgUU9iamVjdCAqcGFyZW50KQorICAgIDogUUFic3RyYWN0SXRlbU1vZGVsKHBhcmVudCksCisgICAgICBtX2NvbHVtbkNvdW50KGNvbHVtbkNvdW50KQoreworICAgIG1fcm9vdEl0ZW0gPSBuZXcgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtKGNvbHVtbkNvdW50LCB0aGlzKTsKK30KKworZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6On5nbHZkZWJ1Z19RQXBpQ2FsbFRyZWVNb2RlbCgpCit7CisgICAgaWYgKG1fcm9vdEl0ZW0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRlbGV0ZSBtX3Jvb3RJdGVtOworICAgICAgICBtX3Jvb3RJdGVtID0gTlVMTDsKKyAgICB9CisKKyAgICBtX2l0ZW1MaXN0LmNsZWFyKCk7Cit9CisKKworUU1vZGVsSW5kZXggZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OmluZGV4KGludCByb3csIGludCBjb2x1bW4sIGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQpIGNvbnN0Cit7CisgICAgaWYgKCFoYXNJbmRleChyb3csIGNvbHVtbiwgcGFyZW50KSkKKyAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CisKKyAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBhcmVudEl0ZW07CisKKyAgICBpZiAoIXBhcmVudC5pc1ZhbGlkKCkpCisgICAgICAgIHBhcmVudEl0ZW0gPSBtX3Jvb3RJdGVtOworICAgIGVsc2UKKyAgICAgICAgcGFyZW50SXRlbSA9IHN0YXRpY19jYXN0PGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqPihwYXJlbnQuaW50ZXJuYWxQb2ludGVyKCkpOworCisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpjaGlsZEl0ZW0gPSBwYXJlbnRJdGVtLT5jaGlsZChyb3cpOworICAgIGlmIChjaGlsZEl0ZW0pCisgICAgICAgIHJldHVybiBjcmVhdGVJbmRleChyb3csIGNvbHVtbiwgY2hpbGRJdGVtKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworfQorLy8KKy8vUU1vZGVsSW5kZXggZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OmluZGV4T2YoY29uc3QgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwSXRlbSkgY29uc3QKKy8veworLy8gICAgaWYgKHBJdGVtICE9IE5VTEwpCisvLyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHBJdGVtLT5yb3coKSwgLypWT0dMX0FDVENfQVBJQ0FMTCovIDAsICh2b2lkICopcEl0ZW0pOworLy8gICAgZWxzZQorLy8gICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworLy99CisKK1FNb2RlbEluZGV4IGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOjpwYXJlbnQoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdAoreworICAgIGlmICghaW5kZXguaXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKKworICAgIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqY2hpbGRJdGVtID0gc3RhdGljX2Nhc3Q8Z2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICo+KGluZGV4LmludGVybmFsUG9pbnRlcigpKTsKKyAgICBpZiAoY2hpbGRJdGVtID09IG1fcm9vdEl0ZW0pCisgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworCisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwYXJlbnRJdGVtID0gY2hpbGRJdGVtLT5wYXJlbnQoKTsKKworICAgIGlmIChwYXJlbnRJdGVtID09IG1fcm9vdEl0ZW0gfHwgcGFyZW50SXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKKworICAgIHJldHVybiBjcmVhdGVJbmRleChwYXJlbnRJdGVtLT5yb3coKSwgLypWT0dMX0FDVENfQVBJQ0FMTCovIDAsIHBhcmVudEl0ZW0pOworfQorCitpbnQgZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OnJvd0NvdW50KGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQpIGNvbnN0Cit7CisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwYXJlbnRJdGVtOworICAgIGlmIChwYXJlbnQuY29sdW1uKCkgPiAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghcGFyZW50LmlzVmFsaWQoKSkKKyAgICAgICAgcGFyZW50SXRlbSA9IG1fcm9vdEl0ZW07CisgICAgZWxzZQorICAgICAgICBwYXJlbnRJdGVtID0gc3RhdGljX2Nhc3Q8Z2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICo+KHBhcmVudC5pbnRlcm5hbFBvaW50ZXIoKSk7CisKKyAgICByZXR1cm4gcGFyZW50SXRlbS0+Y2hpbGRDb3VudCgpOworfQorCitpbnQgZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OmNvbHVtbkNvdW50KGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQpIGNvbnN0Cit7CisgICAgLy9WT0dMX05PVEVfVU5VU0VEKHBhcmVudCk7CisgICAgcmV0dXJuIG1fY29sdW1uQ291bnQ7Cit9CisKK1FWYXJpYW50IGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOjpkYXRhKGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCwgaW50IHJvbGUpIGNvbnN0Cit7CisgICAgaWYgKCFpbmRleC5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBRVmFyaWFudCgpOworCisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwSXRlbSA9IHN0YXRpY19jYXN0PGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqPihpbmRleC5pbnRlcm5hbFBvaW50ZXIoKSk7CisKKyAgICBpZiAocEl0ZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBRVmFyaWFudCgpOworICAgIH0KKworICAgIC8vLy8gbWFrZSBkcmF3IGNhbGwgcm93cyBhcHBlYXIgaW4gYm9sZAorICAgIC8vaWYgKHJvbGUgPT0gUXQ6OkZvbnRSb2xlICYmIHBJdGVtLT5hcGlDYWxsSXRlbSgpICE9IE5VTEwgJiYgdm9nbF9pc19mcmFtZV9idWZmZXJfd3JpdGVfZW50cnlwb2ludCgoZ2xfZW50cnlwb2ludF9pZF90KXBJdGVtLT5hcGlDYWxsSXRlbSgpLT5nZXRHTFBhY2tldCgpLT5tX2VudHJ5cG9pbnRfaWQpKQorICAgIC8veworICAgIC8vICAgIFFGb250IGZvbnQ7CisgICAgLy8gICAgZm9udC5zZXRCb2xkKHRydWUpOworICAgIC8vICAgIHJldHVybiBmb250OworICAgIC8vfQorCisgICAgLy8vLyBoaWdobGlnaHQgdGhlIEFQSSBjYWxsIGNlbGwgaWYgaXQgaGFzIGEgc3Vic3RyaW5nIHdoaWNoIG1hdGNoZXMgdGhlIHNlYXJjaFN0cmluZworICAgIC8vaWYgKHJvbGUgPT0gUXQ6OkJhY2tncm91bmRSb2xlICYmIGluZGV4LmNvbHVtbigpID09IFZPR0xfQUNUQ19BUElDQUxMKQorICAgIC8veworICAgIC8vICAgIGlmICghbV9zZWFyY2hTdHJpbmcuaXNFbXB0eSgpKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgUVZhcmlhbnQgZGF0YSA9IHBJdGVtLT5jb2x1bW5EYXRhKFZPR0xfQUNUQ19BUElDQUxMLCBRdDo6RGlzcGxheVJvbGUpOworICAgIC8vICAgICAgICBRU3RyaW5nIHN0cmluZyA9IGRhdGEudG9TdHJpbmcoKTsKKyAgICAvLyAgICAgICAgaWYgKHN0cmluZy5jb250YWlucyhtX3NlYXJjaFN0cmluZywgUXQ6OkNhc2VJbnNlbnNpdGl2ZSkpCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiBRQ29sb3IoUXQ6OnllbGxvdyk7CisgICAgLy8gICAgICAgIH0KKyAgICAvLyAgICB9CisgICAgLy99CisKKyAgICByZXR1cm4gcEl0ZW0tPmNvbHVtbkRhdGEoaW5kZXguY29sdW1uKCksIHJvbGUpOworfQorCitRdDo6SXRlbUZsYWdzIGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOjpmbGFncyhjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKCFpbmRleC5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIFF0OjpJdGVtSXNFbmFibGVkIHwgUXQ6Okl0ZW1Jc1NlbGVjdGFibGU7Cit9CisKK1FWYXJpYW50IGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOjpoZWFkZXJEYXRhKGludCBzZWN0aW9uLCBRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb2xlKSBjb25zdAoreworICAgIGlmIChvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCAmJiByb2xlID09IFF0OjpEaXNwbGF5Um9sZSkKKyAgICAgICAgcmV0dXJuIG1fcm9vdEl0ZW0tPmNvbHVtbkRhdGEoc2VjdGlvbiwgcm9sZSk7CisKKyAgICByZXR1cm4gUVZhcmlhbnQoKTsKK30KKworLy92b2lkIGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOjpzZXRfaGlnaGxpZ2h0X3NlYXJjaF9zdHJpbmcoY29uc3QgUVN0cmluZyBzZWFyY2hTdHJpbmcpCisvL3sKKy8vICAgIG1fc2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nOworLy99CisvLworLy9RTW9kZWxJbmRleCBnbHZkZWJ1Z19RQXBpQ2FsbFRyZWVNb2RlbDo6ZmluZF9wcmV2X3NlYXJjaF9yZXN1bHQoZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpzdGFydCwgY29uc3QgUVN0cmluZyBzZWFyY2hUZXh0KQorLy97CisvLyAgICBRTGlua2VkTGlzdEl0ZXJhdG9yPGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqPiBpdGVyKG1faXRlbUxpc3QpOworLy8KKy8vICAgIGlmIChzdGFydCAhPSBOVUxMKQorLy8gICAgeworLy8gICAgICAgIGlmIChpdGVyLmZpbmROZXh0KHN0YXJ0KSA9PSBmYWxzZSkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIC8vIHRoZSBvYmplY3Qgd2Fzbid0IGZvdW5kIGluIHRoZSBsaXN0LCBzbyByZXR1cm4gYSBkZWZhdWx0IChpbnZhbGlkKSBpdGVtCisvLyAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgLy8gbmVlZCB0byBiYWNrIHVwIHBhc3QgdGhlIGN1cnJlbnQgaXRlbQorLy8gICAgICAgIGl0ZXIucHJldmlvdXMoKTsKKy8vICAgIH0KKy8vICAgIGVsc2UKKy8vICAgIHsKKy8vICAgICAgICAvLyBzZXQgdGhlIGl0ZXJhdG9yIHRvIHRoZSBiYWNrIHNvIHRoYXQgc2VhcmNoaW5nIHN0YXJ0cyBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QKKy8vICAgICAgICBpdGVyLnRvQmFjaygpOworLy8gICAgfQorLy8KKy8vICAgIC8vIG5vdyB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgdG8gdGhlIGRlc2lyZWQgc3RhcnQgb2JqZWN0IGluIHRoZSBsaXN0LAorLy8gICAgLy8gY29udGludWFsbHkgY2hlY2sgdGhlIHByZXYgaXRlbSBhbmQgZmluZCBvbmUgd2l0aCBhIHNuYXBzaG90CisvLyAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBGb3VuZCA9IE5VTEw7CisvLyAgICB3aGlsZSAoaXRlci5oYXNQcmV2aW91cygpKQorLy8gICAgeworLy8gICAgICAgIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcEl0ZW0gPSBpdGVyLnBlZWtQcmV2aW91cygpOworLy8gICAgICAgIFFWYXJpYW50IGRhdGEgPSBwSXRlbS0+Y29sdW1uRGF0YShWT0dMX0FDVENfQVBJQ0FMTCwgUXQ6OkRpc3BsYXlSb2xlKTsKKy8vICAgICAgICBRU3RyaW5nIHN0cmluZyA9IGRhdGEudG9TdHJpbmcoKTsKKy8vICAgICAgICBpZiAoc3RyaW5nLmNvbnRhaW5zKHNlYXJjaFRleHQsIFF0OjpDYXNlSW5zZW5zaXRpdmUpKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgcEZvdW5kID0gcEl0ZW07CisvLyAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgaXRlci5wcmV2aW91cygpOworLy8gICAgfQorLy8KKy8vICAgIHJldHVybiBpbmRleE9mKHBGb3VuZCk7CisvL30KKy8vCisvL1FNb2RlbEluZGV4IGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOjpmaW5kX25leHRfc2VhcmNoX3Jlc3VsdChnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnN0YXJ0LCBjb25zdCBRU3RyaW5nIHNlYXJjaFRleHQpCisvL3sKKy8vICAgIFFMaW5rZWRMaXN0SXRlcmF0b3I8Z2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICo+IGl0ZXIobV9pdGVtTGlzdCk7CisvLworLy8gICAgaWYgKHN0YXJ0ICE9IE5VTEwpCisvLyAgICB7CisvLyAgICAgICAgaWYgKGl0ZXIuZmluZE5leHQoc3RhcnQpID09IGZhbHNlKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgLy8gdGhlIG9iamVjdCB3YXNuJ3QgZm91bmQgaW4gdGhlIGxpc3QsIHNvIHJldHVybiBhIGRlZmF1bHQgKGludmFsaWQpIGl0ZW0KKy8vICAgICAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CisvLyAgICAgICAgfQorLy8gICAgfQorLy8KKy8vICAgIC8vIG5vdyB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgdG8gdGhlIGRlc2lyZWQgc3RhcnQgb2JqZWN0IGluIHRoZSBsaXN0LAorLy8gICAgLy8gY29udGludWFsbHkgY2hlY2sgdGhlIG5leHQgaXRlbSBhbmQgZmluZCBvbmUgd2l0aCBhIHNuYXBzaG90CisvLyAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBGb3VuZCA9IE5VTEw7CisvLyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCisvLyAgICB7CisvLyAgICAgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwSXRlbSA9IGl0ZXIucGVla05leHQoKTsKKy8vICAgICAgICBRVmFyaWFudCBkYXRhID0gcEl0ZW0tPmNvbHVtbkRhdGEoVk9HTF9BQ1RDX0FQSUNBTEwsIFF0OjpEaXNwbGF5Um9sZSk7CisvLyAgICAgICAgUVN0cmluZyBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nKCk7CisvLyAgICAgICAgaWYgKHN0cmluZy5jb250YWlucyhzZWFyY2hUZXh0LCBRdDo6Q2FzZUluc2Vuc2l0aXZlKSkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHBGb3VuZCA9IHBJdGVtOworLy8gICAgICAgICAgICBicmVhazsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIGl0ZXIubmV4dCgpOworLy8gICAgfQorLy8KKy8vICAgIHJldHVybiBpbmRleE9mKHBGb3VuZCk7CisvL30KKy8vCisvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OmZpbmRfcHJldl9zbmFwc2hvdChnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnN0YXJ0KQorLy97CisvLyAgICBRTGlua2VkTGlzdEl0ZXJhdG9yPGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqPiBpdGVyKG1faXRlbUxpc3QpOworLy8KKy8vICAgIGlmIChzdGFydCAhPSBOVUxMKQorLy8gICAgeworLy8gICAgICAgIGlmIChpdGVyLmZpbmROZXh0KHN0YXJ0KSA9PSBmYWxzZSkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIC8vIHRoZSBvYmplY3Qgd2Fzbid0IGZvdW5kIGluIHRoZSBsaXN0CisvLyAgICAgICAgICAgIHJldHVybiBOVUxMOworLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgLy8gbmVlZCB0byBiYWNrIHVwIHBhc3QgdGhlIGN1cnJlbnQgaXRlbQorLy8gICAgICAgIGl0ZXIucHJldmlvdXMoKTsKKy8vICAgIH0KKy8vICAgIGVsc2UKKy8vICAgIHsKKy8vICAgICAgICAvLyBzZXQgdGhlIGl0ZXJhdG9yIHRvIHRoZSBiYWNrIHNvIHRoYXQgc2VhcmNoaW5nIHN0YXJ0cyBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QKKy8vICAgICAgICBpdGVyLnRvQmFjaygpOworLy8gICAgfQorLy8KKy8vICAgIC8vIG5vdyB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgdG8gdGhlIGRlc2lyZWQgc3RhcnQgb2JqZWN0IGluIHRoZSBsaXN0LAorLy8gICAgLy8gY29udGludWFsbHkgY2hlY2sgdGhlIHByZXYgaXRlbSBhbmQgZmluZCBvbmUgd2l0aCBhIHNuYXBzaG90CisvLyAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBGb3VuZCA9IE5VTEw7CisvLyAgICB3aGlsZSAoaXRlci5oYXNQcmV2aW91cygpKQorLy8gICAgeworLy8gICAgICAgIGlmIChpdGVyLnBlZWtQcmV2aW91cygpLT5oYXNfc25hcHNob3QoKSkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHBGb3VuZCA9IGl0ZXIucGVla1ByZXZpb3VzKCk7CisvLyAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgaXRlci5wcmV2aW91cygpOworLy8gICAgfQorLy8KKy8vICAgIHJldHVybiBwRm91bmQ7CisvL30KKy8vCisvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OmZpbmRfbmV4dF9zbmFwc2hvdChnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnN0YXJ0KQorLy97CisvLyAgICBRTGlua2VkTGlzdEl0ZXJhdG9yPGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqPiBpdGVyKG1faXRlbUxpc3QpOworLy8KKy8vICAgIC8vIGlmIHN0YXJ0IGlzIE5VTEwsIHRoZW4gc2VhcmNoIHdpbGwgYmVnaW4gZnJvbSB0b3AsIG90aGVyd2lzZSBpdCB3aWxsIGJlZ2luIGZyb20gdGhlIHN0YXJ0IGl0ZW0gYW5kIHNlYXJjaCBvbndhcmRzCisvLyAgICBpZiAoc3RhcnQgIT0gTlVMTCkKKy8vICAgIHsKKy8vICAgICAgICBpZiAoaXRlci5maW5kTmV4dChzdGFydCkgPT0gZmFsc2UpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICAvLyB0aGUgb2JqZWN0IHdhc24ndCBmb3VuZCBpbiB0aGUgbGlzdAorLy8gICAgICAgICAgICByZXR1cm4gTlVMTDsKKy8vICAgICAgICB9CisvLyAgICB9CisvLworLy8gICAgLy8gbm93IHRoZSBpdGVyYXRvciBpcyBwb2ludGluZyB0byB0aGUgZGVzaXJlZCBzdGFydCBvYmplY3QgaW4gdGhlIGxpc3QsCisvLyAgICAvLyBjb250aW51YWxseSBjaGVjayB0aGUgbmV4dCBpdGVtIGFuZCBmaW5kIG9uZSB3aXRoIGEgc25hcHNob3QKKy8vICAgIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcEZvdW5kID0gTlVMTDsKKy8vICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKKy8vICAgIHsKKy8vICAgICAgICBpZiAoaXRlci5wZWVrTmV4dCgpLT5oYXNfc25hcHNob3QoKSkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHBGb3VuZCA9IGl0ZXIucGVla05leHQoKTsKKy8vICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBpdGVyLm5leHQoKTsKKy8vICAgIH0KKy8vCisvLyAgICByZXR1cm4gcEZvdW5kOworLy99CisvLworLy9nbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKmdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsOjpmaW5kX3ByZXZfZHJhd2NhbGwoZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpzdGFydCkKKy8veworLy8gICAgUUxpbmtlZExpc3RJdGVyYXRvcjxnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKj4gaXRlcihtX2l0ZW1MaXN0KTsKKy8vCisvLyAgICBpZiAoc3RhcnQgIT0gTlVMTCkKKy8vICAgIHsKKy8vICAgICAgICBpZiAoaXRlci5maW5kTmV4dChzdGFydCkgPT0gZmFsc2UpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICAvLyB0aGUgb2JqZWN0IHdhc24ndCBmb3VuZCBpbiB0aGUgbGlzdAorLy8gICAgICAgICAgICByZXR1cm4gTlVMTDsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIC8vIG5lZWQgdG8gYmFjayB1cCBwYXN0IHRoZSBjdXJyZW50IGl0ZW0KKy8vICAgICAgICBpdGVyLnByZXZpb3VzKCk7CisvLyAgICB9CisvLyAgICBlbHNlCisvLyAgICB7CisvLyAgICAgICAgLy8gc2V0IHRoZSBpdGVyYXRvciB0byB0aGUgYmFjayBzbyB0aGF0IHNlYXJjaGluZyBzdGFydHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0CisvLyAgICAgICAgaXRlci50b0JhY2soKTsKKy8vICAgIH0KKy8vCisvLyAgICAvLyBub3cgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIHRvIHRoZSBkZXNpcmVkIHN0YXJ0IG9iamVjdCBpbiB0aGUgbGlzdCwKKy8vICAgIC8vIGNvbnRpbnVhbGx5IGNoZWNrIHRoZSBwcmV2IGl0ZW0gYW5kIGZpbmQgb25lIHdpdGggYSBzbmFwc2hvdAorLy8gICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwRm91bmQgPSBOVUxMOworLy8gICAgd2hpbGUgKGl0ZXIuaGFzUHJldmlvdXMoKSkKKy8vICAgIHsKKy8vICAgICAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBJdGVtID0gaXRlci5wZWVrUHJldmlvdXMoKTsKKy8vICAgICAgICBpZiAocEl0ZW0tPmFwaUNhbGxJdGVtKCkgIT0gTlVMTCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIGdsX2VudHJ5cG9pbnRfaWRfdCBlbnRyeXBvaW50SWQgPSBwSXRlbS0+YXBpQ2FsbEl0ZW0oKS0+Z2V0VHJhY2VQYWNrZXQoKS0+Z2V0X2VudHJ5cG9pbnRfaWQoKTsKKy8vICAgICAgICAgICAgaWYgKHZvZ2xfaXNfZnJhbWVfYnVmZmVyX3dyaXRlX2VudHJ5cG9pbnQoZW50cnlwb2ludElkKSkKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgcEZvdW5kID0gaXRlci5wZWVrUHJldmlvdXMoKTsKKy8vICAgICAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBpdGVyLnByZXZpb3VzKCk7CisvLyAgICB9CisvLworLy8gICAgcmV0dXJuIHBGb3VuZDsKKy8vfQorLy8KKy8vZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpnbHZkZWJ1Z19RQXBpQ2FsbFRyZWVNb2RlbDo6ZmluZF9uZXh0X2RyYXdjYWxsKGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqc3RhcnQpCisvL3sKKy8vICAgIFFMaW5rZWRMaXN0SXRlcmF0b3I8Z2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICo+IGl0ZXIobV9pdGVtTGlzdCk7CisvLworLy8gICAgaWYgKGl0ZXIuZmluZE5leHQoc3RhcnQpID09IGZhbHNlKQorLy8gICAgeworLy8gICAgICAgIC8vIHRoZSBvYmplY3Qgd2Fzbid0IGZvdW5kIGluIHRoZSBsaXN0CisvLyAgICAgICAgcmV0dXJuIE5VTEw7CisvLyAgICB9CisvLworLy8gICAgLy8gbm93IHRoZSBpdGVyYXRvciBpcyBwb2ludGluZyB0byB0aGUgZGVzaXJlZCBzdGFydCBvYmplY3QgaW4gdGhlIGxpc3QsCisvLyAgICAvLyBjb250aW51YWxseSBjaGVjayB0aGUgbmV4dCBpdGVtIGFuZCBmaW5kIG9uZSB3aXRoIGEgc25hcHNob3QKKy8vICAgIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcEZvdW5kID0gTlVMTDsKKy8vICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKKy8vICAgIHsKKy8vICAgICAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBJdGVtID0gaXRlci5wZWVrTmV4dCgpOworLy8gICAgICAgIGlmIChwSXRlbS0+YXBpQ2FsbEl0ZW0oKSAhPSBOVUxMKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgZ2xfZW50cnlwb2ludF9pZF90IGVudHJ5cG9pbnRJZCA9IHBJdGVtLT5hcGlDYWxsSXRlbSgpLT5nZXRUcmFjZVBhY2tldCgpLT5nZXRfZW50cnlwb2ludF9pZCgpOworLy8gICAgICAgICAgICBpZiAodm9nbF9pc19mcmFtZV9idWZmZXJfd3JpdGVfZW50cnlwb2ludChlbnRyeXBvaW50SWQpKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBwRm91bmQgPSBpdGVyLnBlZWtOZXh0KCk7CisvLyAgICAgICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgaXRlci5uZXh0KCk7CisvLyAgICB9CisvLworLy8gICAgcmV0dXJuIHBGb3VuZDsKKy8vfQorLy8KKy8vZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpnbHZkZWJ1Z19RQXBpQ2FsbFRyZWVNb2RlbDo6ZmluZF9jYWxsX251bWJlcih1bnNpZ25lZCBpbnQgY2FsbE51bWJlcikKKy8veworLy8gICAgUUxpbmtlZExpc3RJdGVyYXRvcjxnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKj4gaXRlcihtX2l0ZW1MaXN0KTsKKy8vCisvLyAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBGb3VuZCA9IE5VTEw7CisvLyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCisvLyAgICB7CisvLyAgICAgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwSXRlbSA9IGl0ZXIucGVla05leHQoKTsKKy8vICAgICAgICBpZiAocEl0ZW0tPmFwaUNhbGxJdGVtKCkgIT0gTlVMTCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIGlmIChwSXRlbS0+YXBpQ2FsbEl0ZW0oKS0+Z2xvYmFsQ2FsbEluZGV4KCkgPT0gY2FsbE51bWJlcikKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgcEZvdW5kID0gaXRlci5wZWVrTmV4dCgpOworLy8gICAgICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICB9CisvLworLy8gICAgICAgIGl0ZXIubmV4dCgpOworLy8gICAgfQorLy8KKy8vICAgIHJldHVybiBwRm91bmQ7CisvL30KKy8vCisvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWw6OmZpbmRfZnJhbWVfbnVtYmVyKHVuc2lnbmVkIGludCBmcmFtZU51bWJlcikKKy8veworLy8gICAgUUxpbmtlZExpc3RJdGVyYXRvcjxnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKj4gaXRlcihtX2l0ZW1MaXN0KTsKKy8vCisvLyAgICBnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKnBGb3VuZCA9IE5VTEw7CisvLyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCisvLyAgICB7CisvLyAgICAgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwSXRlbSA9IGl0ZXIucGVla05leHQoKTsKKy8vICAgICAgICBpZiAocEl0ZW0tPmZyYW1lSXRlbSgpICE9IE5VTEwpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBpZiAocEl0ZW0tPmZyYW1lSXRlbSgpLT5mcmFtZU51bWJlcigpID09IGZyYW1lTnVtYmVyKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBwRm91bmQgPSBpdGVyLnBlZWtOZXh0KCk7CisvLyAgICAgICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgaXRlci5uZXh0KCk7CisvLyAgICB9CisvLworLy8gICAgcmV0dXJuIHBGb3VuZDsKKy8vfQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xYXBpY2FsbHRyZWVtb2RlbC5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xYXBpY2FsbHRyZWVtb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjFkMTEKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FhcGljYWxsdHJlZW1vZGVsLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDEzLTIwMTQgUkFEIEdhbWUgVG9vbHMgYW5kIFZhbHZlIFNvZnR3YXJlCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBHTFZERUJVR19RQVBJQ0FMTFRSRUVNT0RFTF9ICisjZGVmaW5lIEdMVkRFQlVHX1FBUElDQUxMVFJFRU1PREVMX0gKKworI2luY2x1ZGUgPFFBYnN0cmFjdEl0ZW1Nb2RlbD4KKyNpbmNsdWRlIDxRTGlua2VkTGlzdD4KKworI2luY2x1ZGUgImdsdl9jb21tb24uaCIKKworCitjbGFzcyBRVmFyaWFudDsKK2NsYXNzIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbTsKKy8vY2xhc3MgZ2x2ZGVidWdfZ3JvdXBJdGVtOworLy9jbGFzcyBnbHZkZWJ1Z19mcmFtZUl0ZW07CitjbGFzcyBnbHZkZWJ1Z19hcGlDYWxsSXRlbTsKKworY2xhc3MgZ2x2ZGVidWdfUUFwaUNhbGxUcmVlTW9kZWwgOiBwdWJsaWMgUUFic3RyYWN0SXRlbU1vZGVsCit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIGdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsKGludCBjb2x1bW5Db3VudCwgUU9iamVjdCAqcGFyZW50ID0gMCk7CisgICAgfmdsdmRlYnVnX1FBcGlDYWxsVHJlZU1vZGVsKCk7CisKKyAgICAvLyByZXF1aXJlZCB0byBpbXBsZW1lbnQKKyAgICB2aXJ0dWFsIFFNb2RlbEluZGV4IGluZGV4KGludCByb3csIGludCBjb2x1bW4sIGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQgPSBRTW9kZWxJbmRleCgpKSBjb25zdDsKKyAgICB2aXJ0dWFsIFFNb2RlbEluZGV4IHBhcmVudChjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgUVZhcmlhbnQgZGF0YShjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgsIGludCByb2xlKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCByb3dDb3VudChjb25zdCBRTW9kZWxJbmRleCAmcGFyZW50ID0gUU1vZGVsSW5kZXgoKSkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgY29sdW1uQ291bnQoY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCA9IFFNb2RlbEluZGV4KCkpIGNvbnN0OworCisgICAgLy92b2lkIGFwcGVuZENoaWxkKGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSogcEl0ZW0pCisgICAgLy97CisgICAgLy8gICAgbV9yb290SXRlbS0+YXBwZW5kQ2hpbGQocEl0ZW0pOworICAgIC8vfQorCisgICAgLy92aXJ0dWFsIFF0OjpJdGVtRmxhZ3MgZmxhZ3MoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdDsKKyAgICAvL3ZpcnR1YWwgUVZhcmlhbnQgaGVhZGVyRGF0YShpbnQgc2VjdGlvbiwgUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBpbnQgcm9sZSA9IFF0OjpEaXNwbGF5Um9sZSkgY29uc3Q7CisKKyAgICAvL1FNb2RlbEluZGV4IGluZGV4T2YoY29uc3QgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpwSXRlbSkgY29uc3Q7CisKKyAgICAvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcm9vdCgpIGNvbnN0CisgICAgLy97CisgICAgLy8gICAgcmV0dXJuIG1fcm9vdEl0ZW07CisgICAgLy99CisKKyAgICAvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqY3JlYXRlX2dyb3VwKGdsdmRlYnVnX2ZyYW1lSXRlbSAqcEZyYW1lT2JqLAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHZkZWJ1Z19ncm91cEl0ZW0gKiZwR3JvdXBPYmosCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqcFBhcmVudE5vZGUpOworICAgIC8vdm9pZCBzZXRfaGlnaGxpZ2h0X3NlYXJjaF9zdHJpbmcoY29uc3QgUVN0cmluZyBzZWFyY2hTdHJpbmcpOworICAgIC8vUU1vZGVsSW5kZXggZmluZF9wcmV2X3NlYXJjaF9yZXN1bHQoZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpzdGFydCwgY29uc3QgUVN0cmluZyBzZWFyY2hUZXh0KTsKKyAgICAvL1FNb2RlbEluZGV4IGZpbmRfbmV4dF9zZWFyY2hfcmVzdWx0KGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqc3RhcnQsIGNvbnN0IFFTdHJpbmcgc2VhcmNoVGV4dCk7CisKKyAgICAvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqZmluZF9wcmV2X3NuYXBzaG90KGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqc3RhcnQpOworICAgIC8vZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpmaW5kX25leHRfc25hcHNob3QoZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpzdGFydCk7CisKKyAgICAvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqZmluZF9wcmV2X2RyYXdjYWxsKGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqc3RhcnQpOworICAgIC8vZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpmaW5kX25leHRfZHJhd2NhbGwoZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICpzdGFydCk7CisKKyAgICAvL2dsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqZmluZF9jYWxsX251bWJlcih1bnNpZ25lZCBpbnQgY2FsbE51bWJlcik7CisgICAgLy9nbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKmZpbmRfZnJhbWVfbnVtYmVyKHVuc2lnbmVkIGludCBmcmFtZU51bWJlcik7CisKK3NpZ25hbHM6CisKK3B1YmxpYworc2xvdHM6CisKK3ByaXZhdGU6CisgICAgLy9nbF9lbnRyeXBvaW50X2lkX3QgaXRlbUFwaUNhbGxJZChnbHZkZWJ1Z19hcGlDYWxsVHJlZUl0ZW0gKmFwaUNhbGwpIGNvbnN0OworICAgIC8vZ2xfZW50cnlwb2ludF9pZF90IGxhc3RJdGVtQXBpQ2FsbElkKCkgY29uc3Q7CisKKyAgICAvL2Jvb2wgcHJvY2Vzc01hcmtlclB1c2hFbnRyeXBvaW50KGdsX2VudHJ5cG9pbnRfaWRfdCBpZCk7CisgICAgLy9ib29sIHByb2Nlc3NNYXJrZXJQb3BFbnRyeXBvaW50KGdsX2VudHJ5cG9pbnRfaWRfdCBpZCk7CisgICAgLy9ib29sIHByb2Nlc3NTdGFydE5lc3RlZEVudHJ5cG9pbnQoZ2xfZW50cnlwb2ludF9pZF90IGlkKTsKKyAgICAvL2Jvb2wgcHJvY2Vzc0VuZE5lc3RlZEVudHJ5cG9pbnQoZ2xfZW50cnlwb2ludF9pZF90IGlkKTsKKyAgICAvL2Jvb2wgcHJvY2Vzc0ZyYW1lQnVmZmVyV3JpdGVFbnRyeXBvaW50KGdsX2VudHJ5cG9pbnRfaWRfdCBpZCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1fY29sdW1uQ291bnQ7CisgICAgZ2x2ZGVidWdfYXBpQ2FsbFRyZWVJdGVtICptX3Jvb3RJdGVtOworICAgIFFMaW5rZWRMaXN0PGdsdmRlYnVnX2FwaUNhbGxUcmVlSXRlbSAqPiBtX2l0ZW1MaXN0OworLy8gICAgUVN0cmluZyBtX3NlYXJjaFN0cmluZzsKK307CisKKyNlbmRpZiAvLyBHTFZERUJVR19RQVBJQ0FMTFRSRUVNT0RFTF9ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FnZW5lcmF0ZXRyYWNlZGlhbG9nLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcWdlbmVyYXRldHJhY2VkaWFsb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDhjOTkKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FnZW5lcmF0ZXRyYWNlZGlhbG9nLmNwcApAQCAtMCwwICsxLDQ3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9xZ2VuZXJhdGV0cmFjZWRpYWxvZy5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfc2V0dGluZ3MuaCIKKyNpbmNsdWRlIDxRRGlyPgorI2luY2x1ZGUgPFFGaWxlRGlhbG9nPgorI2luY2x1ZGUgPFFHcmlkTGF5b3V0PgorI2luY2x1ZGUgPFFQcm9jZXNzRW52aXJvbm1lbnQ+CisKK3ZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6OnZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2coUVdpZGdldCAqcGFyZW50KQorICAgIDogUURpYWxvZyhwYXJlbnQpLAorICAgICAgbV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MoTlVMTCkKK3sKKyAgICBzZXRNaW5pbXVtV2lkdGgoNTAwKTsKKyAgICBzZXRXaW5kb3dUaXRsZSgiR2VuZXJhdGUgVHJhY2UgRmlsZSIpOworICAgIG1fcEdyaWRMYXlvdXQgPSBuZXcgUUdyaWRMYXlvdXQodGhpcyk7CisgICAgbV9wR3JpZExheW91dC0+c2V0T2JqZWN0TmFtZSgibV9wR3JpZExheW91dCIpOworICAgIG1fcEdyaWRMYXlvdXQtPnNldEhvcml6b250YWxTcGFjaW5nKDIpOworICAgIG1fcEdyaWRMYXlvdXQtPnNldFZlcnRpY2FsU3BhY2luZygxKTsKKworICAgIG1fcEFwcGxpY2F0aW9uTGFiZWwgPSBuZXcgUUxhYmVsKHRoaXMpOworICAgIG1fcEFwcGxpY2F0aW9uTGFiZWwtPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcEFwcGxpY2F0aW9uTGFiZWwiKSk7CisgICAgUVNpemVQb2xpY3kgc2l6ZVBvbGljeTEoUVNpemVQb2xpY3k6OlByZWZlcnJlZCwgUVNpemVQb2xpY3k6OlByZWZlcnJlZCk7CisgICAgc2l6ZVBvbGljeTEuc2V0SG9yaXpvbnRhbFN0cmV0Y2goMCk7CisgICAgc2l6ZVBvbGljeTEuc2V0VmVydGljYWxTdHJldGNoKDApOworICAgIHNpemVQb2xpY3kxLnNldEhlaWdodEZvcldpZHRoKG1fcEFwcGxpY2F0aW9uTGFiZWwtPnNpemVQb2xpY3koKS5oYXNIZWlnaHRGb3JXaWR0aCgpKTsKKyAgICBtX3BBcHBsaWNhdGlvbkxhYmVsLT5zZXRTaXplUG9saWN5KHNpemVQb2xpY3kxKTsKKyAgICBtX3BBcHBsaWNhdGlvbkxhYmVsLT5zZXRUZXh0Rm9ybWF0KFF0OjpBdXRvVGV4dCk7CisgICAgbV9wQXBwbGljYXRpb25MYWJlbC0+c2V0QWxpZ25tZW50KFF0OjpBbGlnblJpZ2h0fFF0OjpBbGlnblRyYWlsaW5nfFF0OjpBbGlnblZDZW50ZXIpOworICAgIG1fcEFwcGxpY2F0aW9uTGFiZWwtPnNldFRleHQoUUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoInZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2ciLCAiPHNwYW4gc3R5bGU9XCJjb2xvcjogcmVkO1wiPio8L3NwYW4+QXBwbGljYXRpb24gdG8gdHJhY2U6IiwgMCkpOworCisgICAgbV9wR3JpZExheW91dC0+YWRkV2lkZ2V0KG1fcEFwcGxpY2F0aW9uTGFiZWwsIDAsIDAsIDEsIDEpOworCisgICAgbV9wQXBwbGljYXRpb25MaW5lRWRpdCA9IG5ldyBRTGluZUVkaXQodGhpcyk7CisgICAgbV9wQXBwbGljYXRpb25MaW5lRWRpdC0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgibV9wQXBwbGljYXRpb25MaW5lRWRpdCIpKTsKKyAgICBRU2l6ZVBvbGljeSBzaXplUG9saWN5MihRU2l6ZVBvbGljeTo6RXhwYW5kaW5nLCBRU2l6ZVBvbGljeTo6Rml4ZWQpOworICAgIHNpemVQb2xpY3kyLnNldEhvcml6b250YWxTdHJldGNoKDEpOworICAgIHNpemVQb2xpY3kyLnNldFZlcnRpY2FsU3RyZXRjaCgwKTsKKyAgICBzaXplUG9saWN5Mi5zZXRIZWlnaHRGb3JXaWR0aChtX3BBcHBsaWNhdGlvbkxpbmVFZGl0LT5zaXplUG9saWN5KCkuaGFzSGVpZ2h0Rm9yV2lkdGgoKSk7CisgICAgbV9wQXBwbGljYXRpb25MaW5lRWRpdC0+c2V0U2l6ZVBvbGljeShzaXplUG9saWN5Mik7CisKKyAgICBtX3BHcmlkTGF5b3V0LT5hZGRXaWRnZXQobV9wQXBwbGljYXRpb25MaW5lRWRpdCwgMCwgMSwgMSwgMSk7CisKKyAgICBtX3BGaW5kQXBwbGljYXRpb25CdXR0b24gPSBuZXcgUVB1c2hCdXR0b24odGhpcyk7CisgICAgbV9wRmluZEFwcGxpY2F0aW9uQnV0dG9uLT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJtX3BGaW5kQXBwbGljYXRpb25CdXR0b24iKSk7CisgICAgUVNpemVQb2xpY3kgc2l6ZVBvbGljeShRU2l6ZVBvbGljeTo6Rml4ZWQsIFFTaXplUG9saWN5OjpGaXhlZCk7CisgICAgc2l6ZVBvbGljeS5zZXRIb3Jpem9udGFsU3RyZXRjaCgwKTsKKyAgICBzaXplUG9saWN5LnNldFZlcnRpY2FsU3RyZXRjaCgwKTsKKyAgICBzaXplUG9saWN5LnNldEhlaWdodEZvcldpZHRoKG1fcEZpbmRBcHBsaWNhdGlvbkJ1dHRvbi0+c2l6ZVBvbGljeSgpLmhhc0hlaWdodEZvcldpZHRoKCkpOworICAgIG1fcEZpbmRBcHBsaWNhdGlvbkJ1dHRvbi0+c2V0U2l6ZVBvbGljeShzaXplUG9saWN5KTsKKyAgICBtX3BGaW5kQXBwbGljYXRpb25CdXR0b24tPnNldE1heGltdW1TaXplKFFTaXplKDIwLCAxNjc3NzIxNSkpOworICAgIG1fcEZpbmRBcHBsaWNhdGlvbkJ1dHRvbi0+c2V0VGV4dChRQXBwbGljYXRpb246OnRyYW5zbGF0ZSgidmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyIsICIuLi4iLCAwKSk7CisKKyAgICBtX3BHcmlkTGF5b3V0LT5hZGRXaWRnZXQobV9wRmluZEFwcGxpY2F0aW9uQnV0dG9uLCAwLCAyLCAxLCAxKTsKKworICAgIG1fcEFyZ3VtZW50c0xhYmVsID0gbmV3IFFMYWJlbCh0aGlzKTsKKyAgICBtX3BBcmd1bWVudHNMYWJlbC0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgibV9wQXJndW1lbnRzTGFiZWwiKSk7CisgICAgc2l6ZVBvbGljeTEuc2V0SGVpZ2h0Rm9yV2lkdGgobV9wQXJndW1lbnRzTGFiZWwtPnNpemVQb2xpY3koKS5oYXNIZWlnaHRGb3JXaWR0aCgpKTsKKyAgICBtX3BBcmd1bWVudHNMYWJlbC0+c2V0U2l6ZVBvbGljeShzaXplUG9saWN5MSk7CisgICAgbV9wQXJndW1lbnRzTGFiZWwtPnNldEFsaWdubWVudChRdDo6QWxpZ25SaWdodHxRdDo6QWxpZ25UcmFpbGluZ3xRdDo6QWxpZ25WQ2VudGVyKTsKKyAgICBtX3BBcmd1bWVudHNMYWJlbC0+c2V0VGV4dChRQXBwbGljYXRpb246OnRyYW5zbGF0ZSgidmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyIsICJBcHBsaWNhdGlvbiBhcmd1bWVudHM6IiwgMCkpOworCisgICAgbV9wR3JpZExheW91dC0+YWRkV2lkZ2V0KG1fcEFyZ3VtZW50c0xhYmVsLCAxLCAwLCAxLCAxKTsKKworICAgIG1fcEFyZ3VtZW50c0xpbmVFZGl0ID0gbmV3IFFMaW5lRWRpdCh0aGlzKTsKKyAgICBtX3BBcmd1bWVudHNMaW5lRWRpdC0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgibV9wQXJndW1lbnRzTGluZUVkaXQiKSk7CisgICAgUVNpemVQb2xpY3kgc2l6ZVBvbGljeTMoUVNpemVQb2xpY3k6OkV4cGFuZGluZywgUVNpemVQb2xpY3k6OkZpeGVkKTsKKyAgICBzaXplUG9saWN5My5zZXRIb3Jpem9udGFsU3RyZXRjaCgwKTsKKyAgICBzaXplUG9saWN5My5zZXRWZXJ0aWNhbFN0cmV0Y2goMCk7CisgICAgc2l6ZVBvbGljeTMuc2V0SGVpZ2h0Rm9yV2lkdGgobV9wQXJndW1lbnRzTGluZUVkaXQtPnNpemVQb2xpY3koKS5oYXNIZWlnaHRGb3JXaWR0aCgpKTsKKyAgICBtX3BBcmd1bWVudHNMaW5lRWRpdC0+c2V0U2l6ZVBvbGljeShzaXplUG9saWN5Myk7CisKKyAgICBtX3BHcmlkTGF5b3V0LT5hZGRXaWRnZXQobV9wQXJndW1lbnRzTGluZUVkaXQsIDEsIDEsIDEsIDIpOworCisgICAgbV9wV29ya2luZ0RpckxhYmVsID0gbmV3IFFMYWJlbCh0aGlzKTsKKyAgICBtX3BXb3JraW5nRGlyTGFiZWwtPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcFdvcmtpbmdEaXJMYWJlbCIpKTsKKyAgICBzaXplUG9saWN5MS5zZXRIZWlnaHRGb3JXaWR0aChtX3BXb3JraW5nRGlyTGFiZWwtPnNpemVQb2xpY3koKS5oYXNIZWlnaHRGb3JXaWR0aCgpKTsKKyAgICBtX3BXb3JraW5nRGlyTGFiZWwtPnNldFNpemVQb2xpY3koc2l6ZVBvbGljeTEpOworICAgIG1fcFdvcmtpbmdEaXJMYWJlbC0+c2V0QWxpZ25tZW50KFF0OjpBbGlnblJpZ2h0fFF0OjpBbGlnblRyYWlsaW5nfFF0OjpBbGlnblZDZW50ZXIpOworICAgIG1fcFdvcmtpbmdEaXJMYWJlbC0+c2V0VGV4dChRQXBwbGljYXRpb246OnRyYW5zbGF0ZSgidmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyIsICJXb3JraW5nIGRpcmVjdG9yeToiLCAwKSk7CisKKyAgICBtX3BHcmlkTGF5b3V0LT5hZGRXaWRnZXQobV9wV29ya2luZ0RpckxhYmVsLCAyLCAwLCAxLCAxKTsKKworICAgIG1fcFdvcmtpbmdEaXJMaW5lRWRpdCA9IG5ldyBRTGluZUVkaXQodGhpcyk7CisgICAgbV9wV29ya2luZ0RpckxpbmVFZGl0LT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJtX3BXb3JraW5nRGlyTGluZUVkaXQiKSk7CisgICAgc2l6ZVBvbGljeTMuc2V0SGVpZ2h0Rm9yV2lkdGgobV9wV29ya2luZ0RpckxpbmVFZGl0LT5zaXplUG9saWN5KCkuaGFzSGVpZ2h0Rm9yV2lkdGgoKSk7CisgICAgbV9wV29ya2luZ0RpckxpbmVFZGl0LT5zZXRTaXplUG9saWN5KHNpemVQb2xpY3kzKTsKKworICAgIG1fcEdyaWRMYXlvdXQtPmFkZFdpZGdldChtX3BXb3JraW5nRGlyTGluZUVkaXQsIDIsIDEsIDEsIDIpOworCisgICAgbV9wVmtMYXllclBhdGhMYWJlbCA9IG5ldyBRTGFiZWwodGhpcyk7CisgICAgbV9wVmtMYXllclBhdGhMYWJlbC0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgibV9wVmtMYXllclBhdGhMYWJlbCIpKTsKKyAgICBtX3BWa0xheWVyUGF0aExhYmVsLT5zZXRBbGlnbm1lbnQoUXQ6OkFsaWduUmlnaHR8UXQ6OkFsaWduVHJhaWxpbmd8UXQ6OkFsaWduVkNlbnRlcik7CisgICAgbV9wVmtMYXllclBhdGhMYWJlbC0+c2V0VGV4dChRQXBwbGljYXRpb246OnRyYW5zbGF0ZSgidmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyIsICI8c3BhbiBzdHlsZT1cImNvbG9yOiByZWQ7XCI+Kjwvc3Bhbj5WS19MQVlFUl9QQVRIOiIsIDApKTsKKyAgICBtX3BWa0xheWVyUGF0aExhYmVsLT5zZXREaXNhYmxlZCh0cnVlKTsKKworICAgIG1fcEdyaWRMYXlvdXQtPmFkZFdpZGdldChtX3BWa0xheWVyUGF0aExhYmVsLCAzLCAwLCAxLCAxKTsKKworICAgIG1fcFZrTGF5ZXJQYXRoTGluZUVkaXQgPSBuZXcgUUxpbmVFZGl0KHRoaXMpOworICAgIG1fcFZrTGF5ZXJQYXRoTGluZUVkaXQtPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcFZrTGF5ZXJQYXRoTGluZUVkaXQiKSk7CisgICAgbV9wVmtMYXllclBhdGhMaW5lRWRpdC0+c2V0VGV4dChRU3RyaW5nKCkpOworCisgICAgbV9wR3JpZExheW91dC0+YWRkV2lkZ2V0KG1fcFZrTGF5ZXJQYXRoTGluZUVkaXQsIDMsIDEsIDEsIDEpOworCisgICAgbV9wVmtMYXllclBhdGhCdXR0b24gPSBuZXcgUVB1c2hCdXR0b24odGhpcyk7CisgICAgbV9wVmtMYXllclBhdGhCdXR0b24tPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcFZrTGF5ZXJQYXRoQnV0dG9uIikpOworICAgIHNpemVQb2xpY3kuc2V0SGVpZ2h0Rm9yV2lkdGgobV9wVmtMYXllclBhdGhCdXR0b24tPnNpemVQb2xpY3koKS5oYXNIZWlnaHRGb3JXaWR0aCgpKTsKKyAgICBtX3BWa0xheWVyUGF0aEJ1dHRvbi0+c2V0U2l6ZVBvbGljeShzaXplUG9saWN5KTsKKyAgICBtX3BWa0xheWVyUGF0aEJ1dHRvbi0+c2V0TWluaW11bVNpemUoUVNpemUoMCwgMCkpOworICAgIG1fcFZrTGF5ZXJQYXRoQnV0dG9uLT5zZXRNYXhpbXVtU2l6ZShRU2l6ZSgyMCwgMTY3NzcyMTUpKTsKKyAgICBtX3BWa0xheWVyUGF0aEJ1dHRvbi0+c2V0VGV4dChRQXBwbGljYXRpb246OnRyYW5zbGF0ZSgidmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyIsICIuLi4iLCAwKSk7CisKKyAgICBtX3BHcmlkTGF5b3V0LT5hZGRXaWRnZXQobV9wVmtMYXllclBhdGhCdXR0b24sIDMsIDIsIDEsIDEpOworCisgICAgbV9wVHJhY2VmaWxlTGFiZWwgPSBuZXcgUUxhYmVsKHRoaXMpOworICAgIG1fcFRyYWNlZmlsZUxhYmVsLT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJtX3BUcmFjZWZpbGVMYWJlbCIpKTsKKyAgICBtX3BUcmFjZWZpbGVMYWJlbC0+c2V0QWxpZ25tZW50KFF0OjpBbGlnblJpZ2h0fFF0OjpBbGlnblRyYWlsaW5nfFF0OjpBbGlnblZDZW50ZXIpOworICAgIG1fcFRyYWNlZmlsZUxhYmVsLT5zZXRUZXh0KFFBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJ2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nIiwgIjxzcGFuIHN0eWxlPVwiY29sb3I6IHJlZDtcIj4qPC9zcGFuPk91dHB1dCB0cmFjZSBmaWxlOiIsIDApKTsKKworICAgIG1fcEdyaWRMYXlvdXQtPmFkZFdpZGdldChtX3BUcmFjZWZpbGVMYWJlbCwgNCwgMCwgMSwgMSk7CisKKyAgICBtX3BUcmFjZUZpbGVMaW5lRWRpdCA9IG5ldyBRTGluZUVkaXQodGhpcyk7CisgICAgbV9wVHJhY2VGaWxlTGluZUVkaXQtPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcFRyYWNlRmlsZUxpbmVFZGl0IikpOworICAgIG1fcFRyYWNlRmlsZUxpbmVFZGl0LT5zZXRUZXh0KFFTdHJpbmcoKSk7CisKKyAgICBtX3BHcmlkTGF5b3V0LT5hZGRXaWRnZXQobV9wVHJhY2VGaWxlTGluZUVkaXQsIDQsIDEsIDEsIDEpOworCisgICAgbV9wRmluZFRyYWNlRmlsZUJ1dHRvbiA9IG5ldyBRUHVzaEJ1dHRvbih0aGlzKTsKKyAgICBtX3BGaW5kVHJhY2VGaWxlQnV0dG9uLT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJtX3BGaW5kVHJhY2VGaWxlQnV0dG9uIikpOworICAgIHNpemVQb2xpY3kuc2V0SGVpZ2h0Rm9yV2lkdGgobV9wRmluZFRyYWNlRmlsZUJ1dHRvbi0+c2l6ZVBvbGljeSgpLmhhc0hlaWdodEZvcldpZHRoKCkpOworICAgIG1fcEZpbmRUcmFjZUZpbGVCdXR0b24tPnNldFNpemVQb2xpY3koc2l6ZVBvbGljeSk7CisgICAgbV9wRmluZFRyYWNlRmlsZUJ1dHRvbi0+c2V0TWluaW11bVNpemUoUVNpemUoMCwgMCkpOworICAgIG1fcEZpbmRUcmFjZUZpbGVCdXR0b24tPnNldE1heGltdW1TaXplKFFTaXplKDIwLCAxNjc3NzIxNSkpOworICAgIG1fcEZpbmRUcmFjZUZpbGVCdXR0b24tPnNldFRleHQoUUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoInZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2ciLCAiLi4uIiwgMCkpOworCisgICAgbV9wR3JpZExheW91dC0+YWRkV2lkZ2V0KG1fcEZpbmRUcmFjZUZpbGVCdXR0b24sIDQsIDIsIDEsIDEpOworCisgICAgbV9wQnV0dG9uRnJhbWUgPSBuZXcgUUZyYW1lKHRoaXMpOworICAgIG1fcEJ1dHRvbkZyYW1lLT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJtX3BCdXR0b25GcmFtZSIpKTsKKyAgICBtX3BCdXR0b25GcmFtZS0+c2V0RnJhbWVTaGFwZShRRnJhbWU6Ok5vRnJhbWUpOworICAgIG1fcEJ1dHRvbkZyYW1lLT5zZXRGcmFtZVNoYWRvdyhRRnJhbWU6OlJhaXNlZCk7CisKKyAgICBtX3BCdXR0b25Ib3Jpem9udGFsTGF5b3V0ID0gbmV3IFFIQm94TGF5b3V0KG1fcEJ1dHRvbkZyYW1lKTsKKyAgICBtX3BCdXR0b25Ib3Jpem9udGFsTGF5b3V0LT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJtX3BCdXR0b25Ib3Jpem9udGFsTGF5b3V0IikpOworICAgIG1fcEJ1dHRvbkhvcml6b250YWxMYXlvdXQtPnNldENvbnRlbnRzTWFyZ2lucygwLCAwLCAwLCAwKTsKKyAgICBtX3BCdXR0b25IU3BhY2VyID0gbmV3IFFTcGFjZXJJdGVtKDQwLCAyMCwgUVNpemVQb2xpY3k6OkV4cGFuZGluZywgUVNpemVQb2xpY3k6Ok1pbmltdW0pOworCisgICAgbV9wQnV0dG9uSG9yaXpvbnRhbExheW91dC0+YWRkSXRlbShtX3BCdXR0b25IU3BhY2VyKTsKKworICAgIG1fcENhbmNlbEJ1dHRvbiA9IG5ldyBRUHVzaEJ1dHRvbihtX3BCdXR0b25GcmFtZSk7CisgICAgbV9wQ2FuY2VsQnV0dG9uLT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJtX3BDYW5jZWxCdXR0b24iKSk7CisgICAgbV9wQ2FuY2VsQnV0dG9uLT5zZXRUZXh0KCJDYW5jZWwiKTsKKyAgICBtX3BDYW5jZWxCdXR0b24tPnNldFRleHQoUUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoInZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2ciLCAiQ2FuY2VsIiwgMCkpOworCisgICAgbV9wQnV0dG9uSG9yaXpvbnRhbExheW91dC0+YWRkV2lkZ2V0KG1fcENhbmNlbEJ1dHRvbik7CisKKyAgICBtX3BPa0J1dHRvbiA9IG5ldyBRUHVzaEJ1dHRvbihtX3BCdXR0b25GcmFtZSk7CisgICAgbV9wT2tCdXR0b24tPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoIm1fcE9rQnV0dG9uIikpOworICAgIG1fcE9rQnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICBtX3BPa0J1dHRvbi0+c2V0VGV4dChRQXBwbGljYXRpb246OnRyYW5zbGF0ZSgidmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyIsICJPSyIsIDApKTsKKworICAgIG1fcEJ1dHRvbkhvcml6b250YWxMYXlvdXQtPmFkZFdpZGdldChtX3BPa0J1dHRvbik7CisKKyAgICBtX3BCdXR0b25IU3BhY2VyMiA9IG5ldyBRU3BhY2VySXRlbSg0MCwgMjAsIFFTaXplUG9saWN5OjpFeHBhbmRpbmcsIFFTaXplUG9saWN5OjpNaW5pbXVtKTsKKworICAgIG1fcEJ1dHRvbkhvcml6b250YWxMYXlvdXQtPmFkZEl0ZW0obV9wQnV0dG9uSFNwYWNlcjIpOworCisgICAgbV9wR3JpZExheW91dC0+YWRkV2lkZ2V0KG1fcEJ1dHRvbkZyYW1lLCA1LCAwLCAxLCAyKTsKKworICAgIFFXaWRnZXQ6OnNldFRhYk9yZGVyKG1fcEFwcGxpY2F0aW9uTGluZUVkaXQsIG1fcEZpbmRBcHBsaWNhdGlvbkJ1dHRvbik7CisgICAgUVdpZGdldDo6c2V0VGFiT3JkZXIobV9wRmluZEFwcGxpY2F0aW9uQnV0dG9uLCBtX3BBcmd1bWVudHNMaW5lRWRpdCk7CisgICAgUVdpZGdldDo6c2V0VGFiT3JkZXIobV9wQXJndW1lbnRzTGluZUVkaXQsIG1fcFRyYWNlRmlsZUxpbmVFZGl0KTsKKyAgICBRV2lkZ2V0OjpzZXRUYWJPcmRlcihtX3BUcmFjZUZpbGVMaW5lRWRpdCwgbV9wRmluZFRyYWNlRmlsZUJ1dHRvbik7CisgICAgUVdpZGdldDo6c2V0VGFiT3JkZXIobV9wRmluZFRyYWNlRmlsZUJ1dHRvbiwgbV9wT2tCdXR0b24pOworICAgIFFXaWRnZXQ6OnNldFRhYk9yZGVyKG1fcE9rQnV0dG9uLCBtX3BDYW5jZWxCdXR0b24pOworICAgIFFXaWRnZXQ6OnNldFRhYk9yZGVyKG1fcENhbmNlbEJ1dHRvbiwgbV9wQXBwbGljYXRpb25MaW5lRWRpdCk7CisKKyAgICBjb25uZWN0KG1fcENhbmNlbEJ1dHRvbiwgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1QocmVqZWN0KCkpKTsKKyAgICBjb25uZWN0KG1fcE9rQnV0dG9uLCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChhY2NlcHQoKSkpOworICAgIGNvbm5lY3QobV9wRmluZEFwcGxpY2F0aW9uQnV0dG9uLCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChvbl9maW5kQXBwbGljYXRpb25CdXR0b25fY2xpY2tlZCgpKSk7CisgICAgY29ubmVjdChtX3BWa0xheWVyUGF0aEJ1dHRvbiwgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1Qob25fdmtMYXllclBhdGhCdXR0b25fY2xpY2tlZCgpKSk7CisgICAgY29ubmVjdChtX3BGaW5kVHJhY2VGaWxlQnV0dG9uLCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChvbl9maW5kVHJhY2VGaWxlQnV0dG9uX2NsaWNrZWQoKSkpOworICAgIGNvbm5lY3QobV9wQXBwbGljYXRpb25MaW5lRWRpdCwgU0lHTkFMKHRleHRDaGFuZ2VkKFFTdHJpbmcpKSwgU0xPVChvbl9hcHBsaWNhdGlvbkxpbmVFZGl0X3RleHRDaGFuZ2VkKFFTdHJpbmcpKSk7CisgICAgY29ubmVjdChtX3BWa0xheWVyUGF0aExpbmVFZGl0LCBTSUdOQUwodGV4dENoYW5nZWQoUVN0cmluZykpLCBTTE9UKG9uX3ZrTGF5ZXJQYXRoTGluZUVkaXRfdGV4dENoYW5nZWQoUVN0cmluZykpKTsKKyAgICBjb25uZWN0KG1fcFRyYWNlRmlsZUxpbmVFZGl0LCBTSUdOQUwodGV4dENoYW5nZWQoUVN0cmluZykpLCBTTE9UKG9uX3RyYWNlRmlsZUxpbmVFZGl0X3RleHRDaGFuZ2VkKFFTdHJpbmcpKSk7Cit9CisKK3ZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6On52a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nKCkKK3sKK30KKworaW50IHZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6OmV4ZWMoKQoreworICAgIGlmIChnX3NldHRpbmdzLmdlbnRyYWNlX2FwcGxpY2F0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgICBtX3BBcHBsaWNhdGlvbkxpbmVFZGl0LT5zZXRUZXh0KFFTdHJpbmcoZ19zZXR0aW5ncy5nZW50cmFjZV9hcHBsaWNhdGlvbikpOworICAgIH0KKyAgICBpZiAoZ19zZXR0aW5ncy5nZW50cmFjZV9hcmd1bWVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1fcEFyZ3VtZW50c0xpbmVFZGl0LT5zZXRUZXh0KFFTdHJpbmcoZ19zZXR0aW5ncy5nZW50cmFjZV9hcmd1bWVudHMpKTsKKyAgICB9CisgICAgaWYgKGdfc2V0dGluZ3MuZ2VudHJhY2Vfd29ya2luZ19kaXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1fcFdvcmtpbmdEaXJMaW5lRWRpdC0+c2V0VGV4dChRU3RyaW5nKGdfc2V0dGluZ3MuZ2VudHJhY2Vfd29ya2luZ19kaXIpKTsKKyAgICB9CisKKyAgICBRUHJvY2Vzc0Vudmlyb25tZW50IGVudmlyb25tZW50ID0gUVByb2Nlc3NFbnZpcm9ubWVudDo6c3lzdGVtRW52aXJvbm1lbnQoKTsKKyAgICBpZiAoZW52aXJvbm1lbnQuY29udGFpbnMoIlZLX0xBWUVSX1BBVEgiKSkKKyAgICB7CisgICAgICAgIG1fcFZrTGF5ZXJQYXRoTGluZUVkaXQtPnNldFRleHQoUVN0cmluZyhlbnZpcm9ubWVudC52YWx1ZSgiVktfTEFZRVJfUEFUSCIpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChnX3NldHRpbmdzLmdlbnRyYWNlX3ZrX2xheWVyX3BhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9wVmtMYXllclBhdGhMaW5lRWRpdC0+c2V0VGV4dChRU3RyaW5nKGdfc2V0dGluZ3MuZ2VudHJhY2VfdmtfbGF5ZXJfcGF0aCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChnX3NldHRpbmdzLmdlbnRyYWNlX291dHB1dF9maWxlICE9IE5VTEwpCisgICAgeworICAgICAgICBtX3BUcmFjZUZpbGVMaW5lRWRpdC0+c2V0VGV4dChRU3RyaW5nKGdfc2V0dGluZ3MuZ2VudHJhY2Vfb3V0cHV0X2ZpbGUpKTsKKyAgICB9CisKKyAgICBpbnQgcmVzdWx0ID0gUURpYWxvZzo6ZXhlYygpOworCisgICAgaWYgKHJlc3VsdCA9PSBRRGlhbG9nOjpBY2NlcHRlZCkKKyAgICB7CisgICAgICAgIGJvb2wgYlN1Y2Nlc3MgPSBsYXVuY2hfYXBwbGljYXRpb25fdG9fZ2VuZXJhdGVfdHJhY2UoKTsKKworICAgICAgICBpZiAoIWJTdWNjZXNzKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSB2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nOjpGYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitRU3RyaW5nIHZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6OmdldF90cmFjZV9maWxlX3BhdGgoKQoreworICAgIHJldHVybiBtX3BUcmFjZUZpbGVMaW5lRWRpdC0+dGV4dCgpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6Om9uX2FwcGxpY2F0aW9uTGluZUVkaXRfdGV4dENoYW5nZWQoY29uc3QgUVN0cmluZyAmdGV4dCkKK3sKKyAgICBjaGVja19pbnB1dHMoKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nOjpvbl92a0xheWVyUGF0aExpbmVFZGl0X3RleHRDaGFuZ2VkKGNvbnN0IFFTdHJpbmcgJnRleHQpCit7CisgICAgY2hlY2tfaW5wdXRzKCk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZzo6b25fdHJhY2VGaWxlTGluZUVkaXRfdGV4dENoYW5nZWQoY29uc3QgUVN0cmluZyAmdGV4dCkKK3sKKyAgICBjaGVja19pbnB1dHMoKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nOjpjaGVja19pbnB1dHMoKQoreworICAgIGJvb2wgYXBwbGljYXRpb25GaWxlRW50ZXJlZCA9IG1fcEFwcGxpY2F0aW9uTGluZUVkaXQtPnRleHQoKS5zaXplKCkgIT0gMDsKKyAgICBib29sIHRyYWNlRmlsZUVudGVyZWQgPSBtX3BUcmFjZUZpbGVMaW5lRWRpdC0+dGV4dCgpLnNpemUoKSAhPSAwOworICAgIGJvb2wgdmtMYXllclBhdGhFbnRlcmVkID0gbV9wVmtMYXllclBhdGhMaW5lRWRpdC0+dGV4dCgpLnNpemUoKSAhPSAwOworICAgIG1fcE9rQnV0dG9uLT5zZXRFbmFibGVkKGFwcGxpY2F0aW9uRmlsZUVudGVyZWQgJiYgdHJhY2VGaWxlRW50ZXJlZCAmJiB2a0xheWVyUGF0aEVudGVyZWQpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6Om9uX3ZrTGF5ZXJQYXRoQnV0dG9uX2NsaWNrZWQoKQoreworICAgIC8vIG9wZW4gZmlsZSBkaWFsb2cKKyAgICBRU3RyaW5nIHN1Z2dlc3RlZE5hbWUgPSBtX3BWa0xheWVyUGF0aExpbmVFZGl0LT50ZXh0KCk7CisgICAgaWYgKHN1Z2dlc3RlZE5hbWUuaXNFbXB0eSgpKQorICAgIHsKKyAgICAgICAgc3VnZ2VzdGVkTmFtZSA9IFFDb3JlQXBwbGljYXRpb246OmFwcGxpY2F0aW9uRGlyUGF0aCgpOworICAgIH0KKworICAgIFFTdHJpbmcgc2VsZWN0ZWROYW1lID0gUUZpbGVEaWFsb2c6OmdldEV4aXN0aW5nRGlyZWN0b3J5KHRoaXMsIHRyKCJGaW5kIFZLX0xBWUVSX1BBVEggRGlyZWN0b3J5IiksIHN1Z2dlc3RlZE5hbWUsIDApOworICAgIGlmICghc2VsZWN0ZWROYW1lLmlzRW1wdHkoKSkKKyAgICB7CisgICAgICAgIG1fcFZrTGF5ZXJQYXRoTGluZUVkaXQtPnNldFRleHQoc2VsZWN0ZWROYW1lKTsKKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZzo6b25fZmluZEFwcGxpY2F0aW9uQnV0dG9uX2NsaWNrZWQoKQoreworICAgIC8vIG9wZW4gZmlsZSBkaWFsb2cKKyAgICBRU3RyaW5nIHN1Z2dlc3RlZE5hbWUgPSBtX3BBcHBsaWNhdGlvbkxpbmVFZGl0LT50ZXh0KCk7CisgICAgUVN0cmluZyBzZWxlY3RlZE5hbWUgPSBRRmlsZURpYWxvZzo6Z2V0T3BlbkZpbGVOYW1lKHRoaXMsIHRyKCJGaW5kIEFwcGxpY2F0aW9uIHRvIFRyYWNlIiksIHN1Z2dlc3RlZE5hbWUsICIiKTsKKyAgICBpZiAoIXNlbGVjdGVkTmFtZS5pc0VtcHR5KCkpCisgICAgeworICAgICAgICBtX3BBcHBsaWNhdGlvbkxpbmVFZGl0LT5zZXRUZXh0KHNlbGVjdGVkTmFtZSk7CisgICAgfQorfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2c6Om9uX2ZpbmRUcmFjZUZpbGVCdXR0b25fY2xpY2tlZCgpCit7CisgICAgLy8gb3BlbiBmaWxlIGRpYWxvZworICAgIFFTdHJpbmcgc3VnZ2VzdGVkTmFtZSA9IG1fcFRyYWNlRmlsZUxpbmVFZGl0LT50ZXh0KCk7CisgICAgUVN0cmluZyBzZWxlY3RlZE5hbWUgPSBRRmlsZURpYWxvZzo6Z2V0U2F2ZUZpbGVOYW1lKHRoaXMsIHRyKCJPdXRwdXQgVHJhY2UgRmlsZSIpLCBzdWdnZXN0ZWROYW1lLCB0cigidmt0cmFjZSBmaWxlICgqLnZrdHJhY2UgKi4qKSIpKTsKKyAgICBpZiAoIXNlbGVjdGVkTmFtZS5pc0VtcHR5KCkpCisgICAgeworICAgICAgICBtX3BUcmFjZUZpbGVMaW5lRWRpdC0+c2V0VGV4dChzZWxlY3RlZE5hbWUpOworICAgIH0KK30KKworYm9vbCB2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nOjpsYXVuY2hfYXBwbGljYXRpb25fdG9fZ2VuZXJhdGVfdHJhY2UoKQoreworICAgIFFTdHJpbmcgYXBwbGljYXRpb24gPSBtX3BBcHBsaWNhdGlvbkxpbmVFZGl0LT50ZXh0KCk7CisgICAgUVN0cmluZyBhcmd1bWVudHMgPSBtX3BBcmd1bWVudHNMaW5lRWRpdC0+dGV4dCgpOworICAgIFFTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9IG1fcFdvcmtpbmdEaXJMaW5lRWRpdC0+dGV4dCgpOworICAgIFFTdHJpbmcgdmtMYXllclBhdGggPSBtX3BWa0xheWVyUGF0aExpbmVFZGl0LT50ZXh0KCk7CisgICAgUVN0cmluZyBvdXRwdXRUcmFjZUZpbGUgPSBnZXRfdHJhY2VfZmlsZV9wYXRoKCk7CisKKyAgICAvLyB1cGRhdGUgc2V0dGluZ3MKKyAgICBpZiAoZ19zZXR0aW5ncy5nZW50cmFjZV9hcHBsaWNhdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9mcmVlKGdfc2V0dGluZ3MuZ2VudHJhY2VfYXBwbGljYXRpb24pOworICAgIH0KKyAgICBnX3NldHRpbmdzLmdlbnRyYWNlX2FwcGxpY2F0aW9uID0gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weShhcHBsaWNhdGlvbi50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworCisgICAgaWYgKGdfc2V0dGluZ3MuZ2VudHJhY2VfYXJndW1lbnRzICE9IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX2ZyZWUoZ19zZXR0aW5ncy5nZW50cmFjZV9hcmd1bWVudHMpOworICAgIH0KKyAgICBnX3NldHRpbmdzLmdlbnRyYWNlX2FyZ3VtZW50cyA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkoYXJndW1lbnRzLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBpZiAoZ19zZXR0aW5ncy5nZW50cmFjZV93b3JraW5nX2RpciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9mcmVlKGdfc2V0dGluZ3MuZ2VudHJhY2Vfd29ya2luZ19kaXIpOworICAgIH0KKyAgICBnX3NldHRpbmdzLmdlbnRyYWNlX3dvcmtpbmdfZGlyID0gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weSh3b3JraW5nRGlyZWN0b3J5LnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBpZiAoZ19zZXR0aW5ncy5nZW50cmFjZV92a19sYXllcl9wYXRoICE9IE5VTEwpCisgICAgeworICAgICAgICB2a3RyYWNlX2ZyZWUoZ19zZXR0aW5ncy5nZW50cmFjZV92a19sYXllcl9wYXRoKTsKKyAgICB9CisgICAgZ19zZXR0aW5ncy5nZW50cmFjZV92a19sYXllcl9wYXRoID0gdmt0cmFjZV9hbGxvY2F0ZV9hbmRfY29weSh2a0xheWVyUGF0aC50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworCisgICAgaWYgKGdfc2V0dGluZ3MuZ2VudHJhY2Vfb3V0cHV0X2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZrdHJhY2VfZnJlZShnX3NldHRpbmdzLmdlbnRyYWNlX291dHB1dF9maWxlKTsKKyAgICB9CisgICAgZ19zZXR0aW5ncy5nZW50cmFjZV9vdXRwdXRfZmlsZSA9IHZrdHJhY2VfYWxsb2NhdGVfYW5kX2NvcHkob3V0cHV0VHJhY2VGaWxlLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgdmt0cmFjZXZpZXdlcl9zZXR0aW5nc191cGRhdGVkKCk7CisKKyAgICBRUHJvY2Vzc0Vudmlyb25tZW50IGVudmlyb25tZW50ID0gUVByb2Nlc3NFbnZpcm9ubWVudDo6c3lzdGVtRW52aXJvbm1lbnQoKTsKKyAgICBlbnZpcm9ubWVudC5pbnNlcnQoIlZLX0xBWUVSX1BBVEgiLCB2a0xheWVyUGF0aCk7CisKKyAgICBtX3BHZW5lcmF0ZVRyYWNlUHJvY2VzcyA9IG5ldyBRUHJvY2VzcygpOworICAgIGNvbm5lY3QobV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MsIFNJR05BTChyZWFkeVJlYWRTdGFuZGFyZE91dHB1dCgpKSwgdGhpcywgU0xPVChvbl9yZWFkU3RhbmRhcmRPdXRwdXQoKSkpOworICAgIGNvbm5lY3QobV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MsIFNJR05BTChyZWFkeVJlYWRTdGFuZGFyZEVycm9yKCkpLCB0aGlzLCBTTE9UKG9uX3JlYWRTdGFuZGFyZEVycm9yKCkpKTsKKworICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19WRVJCT1NFLCBRU3RyaW5nKCJUcmFjaW5nIGFwcGxpY2F0aW9uOiAlMSIpLmFyZyhhcHBsaWNhdGlvbikpOworCisgICAgLy8gYmFja3VwIGV4aXN0aW5nIGVudmlyb25tZW50CisgICAgUVByb2Nlc3NFbnZpcm9ubWVudCB0bXBFbnYgPSBtX3BHZW5lcmF0ZVRyYWNlUHJvY2Vzcy0+cHJvY2Vzc0Vudmlyb25tZW50KCk7CisgICAgbV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MtPnNldFByb2Nlc3NFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7CisKKyAgICBRU3RyaW5nIHZrdHJhY2V2aWV3ZXIgPSBRQ29yZUFwcGxpY2F0aW9uOjphcHBsaWNhdGlvbkRpclBhdGgoKSArICIvdmt0cmFjZSI7CisKKyNpZiBkZWZpbmVkKFBMQVRGT1JNXzY0QklUKQorICAgIHZrdHJhY2V2aWV3ZXIgKz0gIiI7CisjZWxzZQorICAgIHZrdHJhY2V2aWV3ZXIgKz0gIjMyIjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQTEFURk9STV9XSU5ET1dTKQorICAgIHZrdHJhY2V2aWV3ZXIgKz0gIi5leGUiOworI2VuZGlmCisKKyAgICBRU3RyaW5nIGNtZGxpbmUgPSB2a3RyYWNldmlld2VyICsgIiAtcCBcIiIgKyBhcHBsaWNhdGlvbiArICJcIiAtbyBcIiIgKyBvdXRwdXRUcmFjZUZpbGUgKyAiXCIiOworCisgICAgaWYgKCF3b3JraW5nRGlyZWN0b3J5LmlzRW1wdHkoKSkKKyAgICB7CisgICAgICAgIGNtZGxpbmUgKz0gIiAtdyBcIiIgKyB3b3JraW5nRGlyZWN0b3J5ICsgIlwiIjsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3VtZW50cy5pc0VtcHR5KCkpCisgICAgeworICAgICAgICBjbWRsaW5lICs9ICIgLS0gIiArIGFyZ3VtZW50czsKKyAgICB9CisKKyAgICBib29sIGJDb21wbGV0ZWQgPSBmYWxzZTsKKyAgICBtX3BHZW5lcmF0ZVRyYWNlUHJvY2Vzcy0+c3RhcnQoY21kbGluZSk7CisgICAgaWYgKG1fcEdlbmVyYXRlVHJhY2VQcm9jZXNzLT53YWl0Rm9yU3RhcnRlZCgpID09IGZhbHNlKQorICAgIHsKKyAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCAiQXBwbGljYXRpb24gY291bGQgbm90IGJlIGV4ZWN1dGVkLiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBUaGlzIGlzIGEgYmFkIGlkZWEgYXMgaXQgd2lsbCB3YWl0IGZvcmV2ZXIsCisgICAgICAgIC8vIGJ1dCBpZiB0aGUgcmVwbGF5IGlzIHRha2luZyBmb3JldmVyIHRoZW4gd2UgaGF2ZSBiaWdnZXIgcHJvYmxlbXMuCisgICAgICAgIGlmIChtX3BHZW5lcmF0ZVRyYWNlUHJvY2Vzcy0+d2FpdEZvckZpbmlzaGVkKC0xKSkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX1ZFUkJPU0UsICJUcmFjZSBDb21wbGV0ZWQhIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHByb2NSZXRWYWx1ZSA9IG1fcEdlbmVyYXRlVHJhY2VQcm9jZXNzLT5leGl0Q29kZSgpOworICAgICAgICBpZiAocHJvY1JldFZhbHVlID09IC0yKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBwcm9jIGZhaWxlZCB0byBzdGFydHMKKyAgICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsICJBcHBsaWNhdGlvbiBjb3VsZCBub3QgYmUgZXhlY3V0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHJvY1JldFZhbHVlID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBwcm9jIGNyYXNoZWQKKyAgICAgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19FUlJPUiwgIkFwcGxpY2F0aW9uIGFib3J0ZWQgdW5leHBlY3RlZGx5LiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHByb2NSZXRWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzdWNjZXNzCisgICAgICAgICAgICBiQ29tcGxldGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNvbWUgb3RoZXIgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICBiQ29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZXN0b3JlIHByZXZpb3VzIGVudmlyb25tZW50CisgICAgbV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MtPnNldFByb2Nlc3NFbnZpcm9ubWVudCh0bXBFbnYpOworCisgICAgaWYgKG1fcEdlbmVyYXRlVHJhY2VQcm9jZXNzICE9IE5VTEwpCisgICAgeworICAgICAgICBkZWxldGUgbV9wR2VuZXJhdGVUcmFjZVByb2Nlc3M7CisgICAgICAgIG1fcEdlbmVyYXRlVHJhY2VQcm9jZXNzID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYkNvbXBsZXRlZDsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nOjpvbl9yZWFkU3RhbmRhcmRPdXRwdXQoKQoreworICAgIG1fcEdlbmVyYXRlVHJhY2VQcm9jZXNzLT5zZXRSZWFkQ2hhbm5lbChRUHJvY2Vzczo6U3RhbmRhcmRPdXRwdXQpOworICAgIHdoaWxlIChtX3BHZW5lcmF0ZVRyYWNlUHJvY2Vzcy0+Y2FuUmVhZExpbmUoKSkKKyAgICB7CisgICAgICAgIFFCeXRlQXJyYXkgb3V0cHV0ID0gbV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MtPnJlYWRMaW5lKCk7CisgICAgICAgIGlmIChvdXRwdXQuZW5kc1dpdGgoIlxuIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dC5yZW1vdmUob3V0cHV0LnNpemUoKSAtIDEsIDEpOworICAgICAgICB9CisgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19WRVJCT1NFLCBvdXRwdXQuY29uc3REYXRhKCkpOworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nOjpvbl9yZWFkU3RhbmRhcmRFcnJvcigpCit7CisgICAgbV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MtPnNldFJlYWRDaGFubmVsKFFQcm9jZXNzOjpTdGFuZGFyZEVycm9yKTsKKyAgICB3aGlsZSAobV9wR2VuZXJhdGVUcmFjZVByb2Nlc3MtPmNhblJlYWRMaW5lKCkpCisgICAgeworICAgICAgICBRQnl0ZUFycmF5IG91dHB1dCA9IG1fcEdlbmVyYXRlVHJhY2VQcm9jZXNzLT5yZWFkTGluZSgpOworICAgICAgICBpZiAob3V0cHV0LmVuZHNXaXRoKCJcbiIpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXQucmVtb3ZlKG91dHB1dC5zaXplKCkgLSAxLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsIG91dHB1dC5jb25zdERhdGEoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xZ2VuZXJhdGV0cmFjZWRpYWxvZy5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xZ2VuZXJhdGV0cmFjZWRpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTIyYmUKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FnZW5lcmF0ZXRyYWNlZGlhbG9nLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBWS1RSQUNFVklFV0VSX1FHRU5FUkFURVRSQUNFRElBTE9HX0gKKyNkZWZpbmUgVktUUkFDRVZJRVdFUl9RR0VORVJBVEVUUkFDRURJQUxPR19ICisKK2V4dGVybiAiQyIKK3sKKyNpbmNsdWRlICJ2a3RyYWNlX3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidmt0cmFjZV90cmFjZWxvZy5oIgorfQorCisjaW5jbHVkZSA8UURpYWxvZz4KKyNpbmNsdWRlIDxRUHJvY2Vzc0Vudmlyb25tZW50PgorCisjaW5jbHVkZSA8UVZhcmlhbnQ+CisjaW5jbHVkZSA8UUFjdGlvbj4KKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UUJ1dHRvbkdyb3VwPgorI2luY2x1ZGUgPFFDaGVja0JveD4KKyNpbmNsdWRlIDxRRnJhbWU+CisjaW5jbHVkZSA8UUdyaWRMYXlvdXQ+CisjaW5jbHVkZSA8UUhCb3hMYXlvdXQ+CisjaW5jbHVkZSA8UUhlYWRlclZpZXc+CisjaW5jbHVkZSA8UUxhYmVsPgorI2luY2x1ZGUgPFFMaW5lRWRpdD4KKyNpbmNsdWRlIDxRUHVzaEJ1dHRvbj4KKyNpbmNsdWRlIDxRU3BhY2VySXRlbT4KKworY2xhc3Mgdmt0cmFjZXZpZXdlcl9RR2VuZXJhdGVUcmFjZURpYWxvZyA6IHB1YmxpYyBRRGlhbG9nCit7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBleHBsaWNpdCB2a3RyYWNldmlld2VyX1FHZW5lcmF0ZVRyYWNlRGlhbG9nKFFXaWRnZXQgKnBhcmVudCA9IDApOworICAgIHZpcnR1YWwgfnZrdHJhY2V2aWV3ZXJfUUdlbmVyYXRlVHJhY2VEaWFsb2coKTsKKworICAgIHZpcnR1YWwgaW50IGV4ZWMoKTsKKworICAgIGVudW0gRGlhbG9nQ29kZSB7Q2FuY2VsbGVkLCBTdWNjZWVkZWQsIEZhaWxlZH07CisKKyAgICBRU3RyaW5nIGdldF90cmFjZV9maWxlX3BhdGgoKTsKKworc2lnbmFsczoKKyAgICB2b2lkIE91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsIGxldmVsLCBjb25zdCBRU3RyaW5nJiBtZXNzYWdlKTsKKworcHVibGljIHNsb3RzOgorCitwcml2YXRlCitzbG90czoKKyAgICB2b2lkIG9uX2FwcGxpY2F0aW9uTGluZUVkaXRfdGV4dENoYW5nZWQoY29uc3QgUVN0cmluZyAmdGV4dCk7CisgICAgdm9pZCBvbl90cmFjZUZpbGVMaW5lRWRpdF90ZXh0Q2hhbmdlZChjb25zdCBRU3RyaW5nICZ0ZXh0KTsKKyAgICB2b2lkIG9uX3ZrTGF5ZXJQYXRoTGluZUVkaXRfdGV4dENoYW5nZWQoY29uc3QgUVN0cmluZyAmdGV4dCk7CisgICAgdm9pZCBvbl9maW5kQXBwbGljYXRpb25CdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fdmtMYXllclBhdGhCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fZmluZFRyYWNlRmlsZUJ1dHRvbl9jbGlja2VkKCk7CisKKyAgICB2b2lkIG9uX3JlYWRTdGFuZGFyZE91dHB1dCgpOworICAgIHZvaWQgb25fcmVhZFN0YW5kYXJkRXJyb3IoKTsKK3ByaXZhdGU6CisgICAgYm9vbCBsYXVuY2hfYXBwbGljYXRpb25fdG9fZ2VuZXJhdGVfdHJhY2UoKTsKKworICAgIHZvaWQgY2hlY2tfaW5wdXRzKCk7CisKKyAgICBRUHJvY2VzcyAqbV9wR2VuZXJhdGVUcmFjZVByb2Nlc3M7CisgICAgUUdyaWRMYXlvdXQgKm1fcEdyaWRMYXlvdXQ7CisgICAgUUxhYmVsICptX3BBcHBsaWNhdGlvbkxhYmVsOworICAgIFFMaW5lRWRpdCAqbV9wQXBwbGljYXRpb25MaW5lRWRpdDsKKyAgICBRUHVzaEJ1dHRvbiAqbV9wRmluZEFwcGxpY2F0aW9uQnV0dG9uOworICAgIFFMYWJlbCAqbV9wQXJndW1lbnRzTGFiZWw7CisgICAgUUxpbmVFZGl0ICptX3BBcmd1bWVudHNMaW5lRWRpdDsKKyAgICBRTGFiZWwgKm1fcFdvcmtpbmdEaXJMYWJlbDsKKyAgICBRTGluZUVkaXQgKm1fcFdvcmtpbmdEaXJMaW5lRWRpdDsKKyAgICBRTGFiZWwgKm1fcFZrTGF5ZXJQYXRoTGFiZWw7CisgICAgUUxpbmVFZGl0ICptX3BWa0xheWVyUGF0aExpbmVFZGl0OworICAgIFFQdXNoQnV0dG9uICptX3BWa0xheWVyUGF0aEJ1dHRvbjsKKyAgICBRTGFiZWwgKm1fcFRyYWNlZmlsZUxhYmVsOworICAgIFFMaW5lRWRpdCAqbV9wVHJhY2VGaWxlTGluZUVkaXQ7CisgICAgUVB1c2hCdXR0b24gKm1fcEZpbmRUcmFjZUZpbGVCdXR0b247CisgICAgUUZyYW1lICptX3BCdXR0b25GcmFtZTsKKyAgICBRSEJveExheW91dCAqbV9wQnV0dG9uSG9yaXpvbnRhbExheW91dDsKKyAgICBRU3BhY2VySXRlbSAqbV9wQnV0dG9uSFNwYWNlcjsKKyAgICBRUHVzaEJ1dHRvbiAqbV9wQ2FuY2VsQnV0dG9uOworICAgIFFQdXNoQnV0dG9uICptX3BPa0J1dHRvbjsKKyAgICBRU3BhY2VySXRlbSAqbV9wQnV0dG9uSFNwYWNlcjI7Cit9OworCisjZW5kaWYgLy8gVktUUkFDRVZJRVdFUl9RR0VORVJBVEVUUkFDRURJQUxPR19ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3Fncm91cHRocmVhZHNwcm94eW1vZGVsLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3Fncm91cHRocmVhZHNwcm94eW1vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3MjdmNwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcWdyb3VwdGhyZWFkc3Byb3h5bW9kZWwuaApAQCAtMCwwICsxLDIzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFZLVFJBQ0VWSUVXRVJfUUdST1VQVEhSRUFEU1BST1hZTU9ERUxfSAorI2RlZmluZSBWS1RSQUNFVklFV0VSX1FHUk9VUFRIUkVBRFNQUk9YWU1PREVMX0gKKworI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsLmgiCisjaW5jbHVkZSA8UUFic3RyYWN0UHJveHlNb2RlbD4KKyNpbmNsdWRlIDxRU3RhbmRhcmRJdGVtPgorI2luY2x1ZGUgPFFMaXN0PgorI2luY2x1ZGUgPFFEZWJ1Zz4KKworc3RydWN0IEdyb3VwSW5mbworeworICAgIGludCBncm91cEluZGV4OworICAgIHVpbnQzMl90IHRocmVhZElkOworICAgIFFQZXJzaXN0ZW50TW9kZWxJbmRleCBtb2RlbEluZGV4OworICAgIFFMaXN0PFFQZXJzaXN0ZW50TW9kZWxJbmRleD4gY2hpbGRyZW47Cit9OworCitjbGFzcyB2a3RyYWNldmlld2VyX1FHcm91cFRocmVhZHNQcm94eU1vZGVsIDogcHVibGljIFFBYnN0cmFjdFByb3h5TW9kZWwKK3sKKyAgICBRX09CSkVDVAorcHVibGljOgorICAgIHZrdHJhY2V2aWV3ZXJfUUdyb3VwVGhyZWFkc1Byb3h5TW9kZWwoUU9iamVjdCAqcGFyZW50ID0gMCkKKyAgICAgICAgOiBRQWJzdHJhY3RQcm94eU1vZGVsKHBhcmVudCkKKyAgICB7CisgICAgICAgIGJ1aWxkR3JvdXBzKE5VTEwpOworICAgIH0KKworICAgIHZpcnR1YWwgfnZrdHJhY2V2aWV3ZXJfUUdyb3VwVGhyZWFkc1Byb3h5TW9kZWwoKQorICAgIHsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgdm9pZCBzZXRTb3VyY2VNb2RlbChRQWJzdHJhY3RJdGVtTW9kZWwgKnNvdXJjZU1vZGVsKQorICAgIHsKKyAgICAgICAgUUFic3RyYWN0UHJveHlNb2RlbDo6c2V0U291cmNlTW9kZWwoc291cmNlTW9kZWwpOworCisgICAgICAgIGlmIChzb3VyY2VNb2RlbC0+aW5oZXJpdHMoInZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsKiBwVEZNID0gc3RhdGljX2Nhc3Q8dmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwqPihzb3VyY2VNb2RlbCk7CisgICAgICAgICAgICBidWlsZEdyb3VwcyhwVEZNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdmlydHVhbCBpbnQgcm93Q291bnQoY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCkgY29uc3QKKyAgICB7CisgICAgICAgIC8vIGFzayB0aGUgc291cmNlCisgICAgICAgIHJldHVybiBzb3VyY2VNb2RlbCgpLT5yb3dDb3VudChtYXBUb1NvdXJjZShwYXJlbnQpKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbihjb25zdCBRTW9kZWxJbmRleCAmcGFyZW50KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFwYXJlbnQuaXNWYWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgUVZhcmlhbnQgZGF0YSggY29uc3QgUU1vZGVsSW5kZXggJmluZGV4LCBpbnQgcm9sZSApIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIWluZGV4LmlzVmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWFwVG9Tb3VyY2UoaW5kZXgpLmRhdGEocm9sZSk7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2aXJ0dWFsIFF0OjpJdGVtRmxhZ3MgZmxhZ3MoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFF0OjpJdGVtSXNFbmFibGVkIHwgUXQ6Okl0ZW1Jc1NlbGVjdGFibGU7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2aXJ0dWFsIGludCBjb2x1bW5Db3VudChjb25zdCBRTW9kZWxJbmRleCAmcGFyZW50KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZU1vZGVsKCktPmNvbHVtbkNvdW50KCkgKyBtX3VuaXF1ZVRocmVhZElkTWFwVG9Db2x1bW4uY291bnQoKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgUVZhcmlhbnQgaGVhZGVyRGF0YShpbnQgc2VjdGlvbiwgUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBpbnQgcm9sZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghaXNUaHJlYWRDb2x1bW4oc2VjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2VNb2RlbCgpLT5oZWFkZXJEYXRhKHNlY3Rpb24sIG9yaWVudGF0aW9uLCByb2xlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb2xlID09IFF0OjpEaXNwbGF5Um9sZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGhyZWFkSW5kZXggPSBnZXRUaHJlYWRDb2x1bW5JbmRleChzZWN0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUVN0cmluZygiVGhyZWFkICUxIikuYXJnKG1fdW5pcXVlVGhyZWFkSWRNYXBUb0NvbHVtbi5rZXkodGhyZWFkSW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBRVmFyaWFudCgpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUU1vZGVsSW5kZXggaW5kZXgoaW50IHJvdywgaW50IGNvbHVtbiwgY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCA9IFFNb2RlbEluZGV4KCkpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIWhhc0luZGV4KHJvdywgY29sdW1uLCBwYXJlbnQpKQorICAgICAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUluZGV4KHJvdywgY29sdW1uKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFFNb2RlbEluZGV4IHBhcmVudChjb25zdCBRTW9kZWxJbmRleCAmY2hpbGQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIWNoaWxkLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworCisgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUU1vZGVsSW5kZXggbWFwVG9Tb3VyY2UoY29uc3QgUU1vZGVsSW5kZXggJnByb3h5SW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIXByb3h5SW5kZXguaXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CisKKyAgICAgICAgUU1vZGVsSW5kZXggcmVzdWx0OworICAgICAgICBpZiAoIWlzVGhyZWFkQ29sdW1uKHByb3h5SW5kZXguY29sdW1uKCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpdCBpcyBhIGNvbHVtbiBmb3IgdGhlIHNvdXJjZSBtb2RlbCBhbmQgbm90IGZvciBvbmUgb2Ygb3VyIHRocmVhZCBJRHMgKHdoaWNoIGlzbid0IGluIHRoZSBzb3VyY2UsIHVubGVzcyB3ZSBtYXAgaXQgdG8gdGhlIHNhbWUgVGhyZWFkIElkIGNvbHVtbj8pCisgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VNb2RlbCgpLT5pbmRleChwcm94eUluZGV4LnJvdygpLCBwcm94eUluZGV4LmNvbHVtbigpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0aHJlYWRJbmRleCA9IGdldFRocmVhZENvbHVtbkluZGV4KHByb3h5SW5kZXguY29sdW1uKCkpOworICAgICAgICAgICAgaWYgKG1fcGFja2V0SW5kZXhUb0NvbHVtbltwcm94eUluZGV4LnJvdygpXSA9PSB0aHJlYWRJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTW9kZWwoKS0+aW5kZXgocHJveHlJbmRleC5yb3coKSwgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUU1vZGVsSW5kZXggbWFwRnJvbVNvdXJjZShjb25zdCBRTW9kZWxJbmRleCAmc291cmNlSW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIXNvdXJjZUluZGV4LmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworCisgICAgICAgIHJldHVybiBjcmVhdGVJbmRleChzb3VyY2VJbmRleC5yb3coKSwgc291cmNlSW5kZXguY29sdW1uKCkpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdmlydHVhbCBRTW9kZWxJbmRleExpc3QgbWF0Y2goY29uc3QgUU1vZGVsSW5kZXggJnN0YXJ0LCBpbnQgcm9sZSwgY29uc3QgUVZhcmlhbnQgJnZhbHVlLCBpbnQgaGl0cywgUXQ6Ok1hdGNoRmxhZ3MgZmxhZ3MpIGNvbnN0CisgICAgeworICAgICAgICBRTW9kZWxJbmRleExpc3QgcmVzdWx0cyA9IHNvdXJjZU1vZGVsKCktPm1hdGNoKHN0YXJ0LCByb2xlLCB2YWx1ZSwgaGl0cywgZmxhZ3MpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5jb3VudCgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBtYXBGcm9tU291cmNlKHJlc3VsdHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByaXZhdGU6CisgICAgUU1hcDx1aW50MzJfdCwgaW50PiBtX3VuaXF1ZVRocmVhZElkTWFwVG9Db2x1bW47CisKKyAgICAvLyBFYWNoIGVudHJ5IGluIHRoZSBsaXN0IGNvcnJlc3BvbmRzIHRvIGEgcGFja2V0IGluZGV4OworICAgIC8vIHRoZSBpbnQgc3RvcmVkIGluIHRoZSBsaXN0IGluZGljYXRlcyB3aGljaCBjb2x1bW4gdGhlIEFQSSBjYWxsIGJlbG9uZ3MgaW4uCisgICAgUUxpc3Q8aW50PiBtX3BhY2tldEluZGV4VG9Db2x1bW47CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgaXNUaHJlYWRDb2x1bW4oaW50IGNvbHVtbkluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChjb2x1bW5JbmRleCA+PSBzb3VyY2VNb2RlbCgpLT5jb2x1bW5Db3VudCgpKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGludCBnZXRUaHJlYWRDb2x1bW5JbmRleChpbnQgcHJveHlDb2x1bW5JbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBwcm94eUNvbHVtbkluZGV4IC0gc291cmNlTW9kZWwoKS0+Y29sdW1uQ291bnQoKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZvaWQgYnVpbGRHcm91cHModmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWwqIHBURk0pCisgICAgeworICAgICAgICBtX3VuaXF1ZVRocmVhZElkTWFwVG9Db2x1bW4uY2xlYXIoKTsKKyAgICAgICAgbV9wYWNrZXRJbmRleFRvQ29sdW1uLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKHBURk0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtYW55IGFkZGl0aW9uYWwgY29sdW1ucyBhcmUgbmVlZGVkIGJ5IGNvdW50aW5nIHRoZSBudW1iZXIgaWYgZGlmZmVyZW50IHRocmVhZCBJZHMgYmVpbmcgdXNlZC4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcFRGTS0+cm93Q291bnQoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqKXBURk0tPmluZGV4KGksIDApLmludGVybmFsUG9pbnRlcigpOworICAgICAgICAgICAgICAgIGlmIChwSGVhZGVyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdW5pcXVlVGhyZWFkSWRNYXBUb0NvbHVtbi5jb250YWlucyhwSGVhZGVyLT50aHJlYWRfaWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uSW5kZXggPSBtX3VuaXF1ZVRocmVhZElkTWFwVG9Db2x1bW4uY291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdW5pcXVlVGhyZWFkSWRNYXBUb0NvbHVtbi5pbnNlcnQocEhlYWRlci0+dGhyZWFkX2lkLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtX3BhY2tldEluZGV4VG9Db2x1bW4uYXBwZW5kKG1fdW5pcXVlVGhyZWFkSWRNYXBUb0NvbHVtbltwSGVhZGVyLT50aHJlYWRfaWRdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCisjZW5kaWYgLy8gVktUUkFDRVZJRVdFUl9RR1JPVVBUSFJFQURTUFJPWFlNT0RFTF9ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FpbWFnZXZpZXdlci5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xaW1hZ2V2aWV3ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM1ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xaW1hZ2V2aWV3ZXIuaApAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1ZLVFJBQ0VWSUVXRVJfUUlNQUdFVklFV0VSX0hfCisjZGVmaW5lIF9WS1RSQUNFVklFV0VSX1FJTUFHRVZJRVdFUl9IXworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPFFGaWxlSW5mbz4KKyNpbmNsdWRlIDxRTGFiZWw+CisjaW5jbHVkZSA8UVNjcm9sbEFyZWE+CisjaW5jbHVkZSA8UVNjcm9sbEJhcj4KKyNpbmNsdWRlIDxRV2hlZWxFdmVudD4KKworLy8gUHJldGVuZCBhbiBpbWFnZSBpcyBhIFFTY3JvbGxBcmVhIHdpdGggc29tZSBzb21lIHNwZWNpYWwgZXZlbnQgaGFuZGxpbmcuCitjbGFzcyB2a3RyYWNldmlld2VyX3FpbWFnZXZpZXdlciA6IHB1YmxpYyBRU2Nyb2xsQXJlYQoreworICAgIFFfT0JKRUNUCitwdWJsaWM6CisgICAgZXhwbGljaXQgdmt0cmFjZXZpZXdlcl9xaW1hZ2V2aWV3ZXIoUVdpZGdldCogcGFyZW50ID0gMCkKKyAgICAgICAgOiBRU2Nyb2xsQXJlYShwYXJlbnQpLAorICAgICAgICAgIG1fcEltYWdlTGFiZWwoTlVMTCksCisgICAgICAgICAgbV9wUGFuU3RhcnQoMCwgMCksCisgICAgICAgICAgbV9wUGFuKGZhbHNlKSwKKyAgICAgICAgICBtX3BBdXRvRml0KGZhbHNlKQorICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgYmFzaWMgaW1hZ2Ugdmlld2VyIHVzaW5nIGEgUUxhYmVsIHRvIGRpc3BsYXkgdGhlIGltYWdlLgorICAgICAgICBtX3BJbWFnZUxhYmVsID0gbmV3IFFMYWJlbDsKKyAgICAgICAgYXNzZXJ0KG1fcEltYWdlTGFiZWwgIT0gTlVMTCk7CisKKyAgICAgICAgbV9wSW1hZ2VMYWJlbC0+c2V0QmFja2dyb3VuZFJvbGUoUVBhbGV0dGU6OkJhc2UpOworICAgICAgICBtX3BJbWFnZUxhYmVsLT5zZXRTaXplUG9saWN5KFFTaXplUG9saWN5OjpJZ25vcmVkLCBRU2l6ZVBvbGljeTo6SWdub3JlZCk7CisgICAgICAgIG1fcEltYWdlTGFiZWwtPnNldFNjYWxlZENvbnRlbnRzKHRydWUpOworCisgICAgICAgIC8vIFRoZSBRTGFiZWwgaXMgZW1iZWRkZWQgaW4gYSBRU2Nyb2xsQXJlYSBzbyB0aGUgaW1hZ2UgY2FuIGJlIHBhbm5lZC4KKyAgICAgICAgdGhpcy0+c2V0QmFja2dyb3VuZFJvbGUoUVBhbGV0dGU6OkRhcmspOworICAgICAgICB0aGlzLT5zZXRXaWRnZXQobV9wSW1hZ2VMYWJlbCk7CisgICAgfQorCisgICAgdmlydHVhbCB+dmt0cmFjZXZpZXdlcl9xaW1hZ2V2aWV3ZXIoKQorICAgIHsKKyAgICAgICAgaWYgKG1fcEltYWdlTGFiZWwgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlIG1fcEltYWdlTGFiZWw7CisgICAgICAgICAgICBtX3BJbWFnZUxhYmVsID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGV2ZW50KQorICAgIHsKKyAgICAgICAgaWYobV9wUGFuKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5ob3Jpem9udGFsU2Nyb2xsQmFyKCktPnNldFZhbHVlKHRoaXMtPmhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKSAtCisgICAgICAgICAgICAgICAgKGV2ZW50LT54KCkgLSBtX3BQYW5TdGFydC54KCkpKTsKKyAgICAgICAgICAgIHRoaXMtPnZlcnRpY2FsU2Nyb2xsQmFyKCktPnNldFZhbHVlKHRoaXMtPnZlcnRpY2FsU2Nyb2xsQmFyKCktPnZhbHVlKCkgLQorICAgICAgICAgICAgICAgIChldmVudC0+eSgpIC0gbV9wUGFuU3RhcnQueSgpKSk7CisgICAgICAgICAgICBtX3BQYW5TdGFydCA9ICBldmVudC0+cG9zKCk7CisKKyAgICAgICAgICAgIGV2ZW50LT5hY2NlcHQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV2ZW50LT5pZ25vcmUoKTsKKyAgICB9CisKKyAgICB2b2lkIG1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCogZXZlbnQpCisgICAgeworICAgICAgICBpZihldmVudC0+YnV0dG9uKCkgPT0gUXQ6Ok1pZGRsZUJ1dHRvbikKKyAgICAgICAgeworICAgICAgICAgICAgbV9wUGFuID0gdHJ1ZTsKKyAgICAgICAgICAgIHNldEN1cnNvcihRdDo6Q2xvc2VkSGFuZEN1cnNvcik7CisgICAgICAgICAgICBtX3BQYW5TdGFydCA9IGV2ZW50LT5wb3MoKTsKKworICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnQtPmlnbm9yZSgpOworICAgIH0KKworICAgIHZvaWQgbW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGV2ZW50KQorICAgIHsKKyAgICAgICAgaWYoZXZlbnQtPmJ1dHRvbigpID09IFF0OjpNaWRkbGVCdXR0b24pCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcFBhbiA9IGZhbHNlOworICAgICAgICAgICAgc2V0Q3Vyc29yKFF0OjpBcnJvd0N1cnNvcik7CisKKyAgICAgICAgICAgIGV2ZW50LT5hY2NlcHQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV2ZW50LT5pZ25vcmUoKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCogZXZlbnQpCisgICAgeworICAgICAgICBRU2l6ZSBjb25zdCBzaXplID0gY29tcHV0ZU1pbmltdW1TaXplKCk7CisgICAgICAgIG1fcEltYWdlTGFiZWwtPnNldE1pbmltdW1TaXplKHNpemUpOworCisgICAgICAgIGlmKG1fcEF1dG9GaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcEltYWdlTGFiZWwtPnJlc2l6ZShzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGV2ZW50LT5hY2NlcHQoKTsKKyAgICB9CisKKyAgICB2b2lkIHdoZWVsRXZlbnQoUVdoZWVsRXZlbnQqIGV2ZW50KQorICAgIHsKKyAgICAgICAgaWYoZXZlbnQtPm9yaWVudGF0aW9uKCkgPT0gUXQ6OlZlcnRpY2FsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTdG9wIGF1dG9tYXRpY2FsbHkgcmVzaXppbmcgdGhlIGltYWdlIHdoZW4gem9vbSBpcyByZXF1ZXN0ZWQuCisgICAgICAgICAgICBtX3BBdXRvRml0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAgICAgICAgaW50IGNvbnN0IG51bURlZ3JlZXMgPSBldmVudC0+ZGVsdGEoKSAvIDg7CisgICAgICAgICAgICBpbnQgY29uc3QgbnVtU3RlcHMgPSBudW1EZWdyZWVzIC8gMTU7CisgICAgICAgICAgICBkb3VibGUgY29uc3QgZmFjdG9yID0gMS4wICsgMC4xICogbnVtU3RlcHM7CisKKyAgICAgICAgICAgIG1fcEltYWdlTGFiZWwtPnJlc2l6ZShtX3BJbWFnZUxhYmVsLT5zaXplKCkgKiBmYWN0b3IpOworCisgICAgICAgICAgICB6b29tU2Nyb2xsQmFyKHRoaXMtPmhvcml6b250YWxTY3JvbGxCYXIoKSwgZmFjdG9yKTsKKyAgICAgICAgICAgIHpvb21TY3JvbGxCYXIodGhpcy0+dmVydGljYWxTY3JvbGxCYXIoKSwgZmFjdG9yKTsKKworICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnQtPmlnbm9yZSgpOworICAgIH0KKworICAgIGJvb2wgbG9hZEltYWdlKFFTdHJpbmcgY29uc3QmIGZpbGVOYW1lKQorICAgIHsKKyAgICAgICAgUUZpbGVJbmZvIGZpbGVJbmZvKGZpbGVOYW1lKTsKKyAgICAgICAgaWYoIWZpbGVJbmZvLmV4aXN0cygpIHx8ICFmaWxlSW5mby5pc0ZpbGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgUUltYWdlIGltYWdlKGZpbGVOYW1lKTsKKyAgICAgICAgaWYoaW1hZ2UuaXNOdWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1fcEltYWdlTGFiZWwtPnNldFBpeG1hcChRUGl4bWFwOjpmcm9tSW1hZ2UoaW1hZ2UpKTsKKyAgICAgICAgbV9wSW1hZ2VMYWJlbC0+YWRqdXN0U2l6ZSgpOworICAgICAgICBtX3BJbWFnZUxhYmVsLT5zZXRNYXhpbXVtU2l6ZShpbWFnZS5zaXplKCkpOworCisgICAgICAgIC8vIFJlc2l6ZSB0aGUgaW1hZ2UgdG8gdGhlIHNjcm9sbCBhcmVhLgorICAgICAgICBtX3BBdXRvRml0ID0gdHJ1ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUVNpemUgY29tcHV0ZU1pbmltdW1TaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmKG1fcEltYWdlTGFiZWwtPnBpeG1hcCgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBRU2l6ZSgwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvdWJsZSBjb25zdCBhc3BlY3QgPSBtX3BJbWFnZUxhYmVsLT5waXhtYXAoKS0+d2lkdGgoKSAvCisgICAgICAgICAgICBtX3BJbWFnZUxhYmVsLT5waXhtYXAoKS0+aGVpZ2h0KCk7CisgICAgICAgIGlmKGFzcGVjdCA+IDEuMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbnN0IG1pbldpZHRoID0gdGhpcy0+d2lkdGgoKSAtIDIgKiB0aGlzLT5mcmFtZVdpZHRoKCk7CisgICAgICAgICAgICBpbnQgY29uc3QgbWluSGVpZ2h0ID0gbWluV2lkdGggKiAxLjAgLyBhc3BlY3Q7CisgICAgICAgICAgICByZXR1cm4gUVNpemUobWluV2lkdGgsIG1pbkhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29uc3QgbWluSGVpZ2h0ID0gdGhpcy0+aGVpZ2h0KCkgLSAyICogdGhpcy0+ZnJhbWVXaWR0aCgpOworICAgICAgICAgICAgaW50IGNvbnN0IG1pbldpZHRoID0gbWluSGVpZ2h0ICogYXNwZWN0OworICAgICAgICAgICAgcmV0dXJuIFFTaXplKG1pbldpZHRoLCBtaW5IZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB6b29tU2Nyb2xsQmFyKFFTY3JvbGxCYXIqIHNjcm9sbEJhciwgZG91YmxlIGNvbnN0JiBmYWN0b3IpCisgICAgeworICAgICAgICBpbnQgY29uc3QgdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ+KGZhY3RvciAqIHNjcm9sbEJhci0+dmFsdWUoKSArCisgICAgICAgICAgICAoKGZhY3RvciAtIDEuMCkgKiBzY3JvbGxCYXItPnBhZ2VTdGVwKCkgLyAyKSk7CisgICAgICAgIHNjcm9sbEJhci0+c2V0VmFsdWUodmFsdWUpOworICAgIH0KKworICAgIFFMYWJlbCogbV9wSW1hZ2VMYWJlbDsKKyAgICBRUG9pbnQgbV9wUGFuU3RhcnQ7CisgICAgYm9vbCBtX3BQYW47CisgICAgYm9vbCBtX3BBdXRvRml0OworfTsKKworI2VuZGlmIC8vX1ZLVFJBQ0VWSUVXRVJfUUlNQUdFVklFV0VSX0hfCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FzZXR0aW5nc2RpYWxvZy5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FzZXR0aW5nc2RpYWxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwOTcyYgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcXNldHRpbmdzZGlhbG9nLmNwcApAQCAtMCwwICsxLDE2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9xc2V0dGluZ3NkaWFsb2cuaCIKKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3NldHRpbmdzLmgiCisKKyNpbmNsdWRlIDxRRGlhbG9nQnV0dG9uQm94PgorI2luY2x1ZGUgPFFDaGVja0JveD4KKyNpbmNsdWRlIDxRR3JpZExheW91dD4KKyNpbmNsdWRlIDxRR3JvdXBCb3g+CisjaW5jbHVkZSA8UUhlYWRlclZpZXc+CisjaW5jbHVkZSA8UUxhYmVsPgorI2luY2x1ZGUgPFFMaW5lRWRpdD4KKyNpbmNsdWRlIDxRUHVzaEJ1dHRvbj4KKyNpbmNsdWRlIDxRUmVzaXplRXZlbnQ+CisjaW5jbHVkZSA8UVRhYmxlV2lkZ2V0PgorI2luY2x1ZGUgPFFWQm94TGF5b3V0PgorCitRX0RFQ0xBUkVfTUVUQVRZUEUodmt0cmFjZV9TZXR0aW5nSW5mbyopOworCit2a3RyYWNldmlld2VyX1FTZXR0aW5nc0RpYWxvZzo6dmt0cmFjZXZpZXdlcl9RU2V0dGluZ3NEaWFsb2coUVdpZGdldCAqcGFyZW50KQorICAgIDogUURpYWxvZyhwYXJlbnQpLAorICAgICAgbV9wU2V0dGluZ0dyb3VwcyhOVUxMKSwKKyAgICAgIG1fbnVtU2V0dGluZ0dyb3VwcygwKQoreworICAgIHRoaXMtPnNldFdpbmRvd1RpdGxlKCJTZXR0aW5ncyIpOworCisgICAgUVZCb3hMYXlvdXQqIHBMYXlvdXQgPSBuZXcgUVZCb3hMYXlvdXQodGhpcyk7CisgICAgdGhpcy0+c2V0TGF5b3V0KHBMYXlvdXQpOworCisgICAgbV9wVGFiV2lkZ2V0ID0gbmV3IFFUYWJXaWRnZXQodGhpcyk7CisgICAgcExheW91dC0+YWRkV2lkZ2V0KG1fcFRhYldpZGdldCk7CisKKyAgICBRRGlhbG9nQnV0dG9uQm94KiBwQnV0dG9uQm94ID0gbmV3IFFEaWFsb2dCdXR0b25Cb3goLypRRGlhbG9nQnV0dG9uQm94OjpTYXZlIHwgUURpYWxvZ0J1dHRvbkJveDo6Q2FuY2VsKi8pOworICAgIHBCdXR0b25Cb3gtPmFkZEJ1dHRvbigiT0siLCBRRGlhbG9nQnV0dG9uQm94OjpSZWplY3RSb2xlKTsKKyAgICBwQnV0dG9uQm94LT5hZGRCdXR0b24oIlNhdmUgJiYgQXBwbHkiLCBRRGlhbG9nQnV0dG9uQm94OjpBY2NlcHRSb2xlKTsKKyAgICBwTGF5b3V0LT5hZGRXaWRnZXQocEJ1dHRvbkJveCk7CisgICAgY29ubmVjdChwQnV0dG9uQm94LCBTSUdOQUwoYWNjZXB0ZWQoKSksIHRoaXMsIFNMT1QoYWNjZXB0Q0IoKSkpOworICAgIGNvbm5lY3QocEJ1dHRvbkJveCwgU0lHTkFMKHJlamVjdGVkKCkpLCB0aGlzLCBTTE9UKGNhbmNlbENCKCkpKTsKK30KKwordmt0cmFjZXZpZXdlcl9RU2V0dGluZ3NEaWFsb2c6On52a3RyYWNldmlld2VyX1FTZXR0aW5nc0RpYWxvZygpCit7CisgICAgcmVtb3ZlVGFicygpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVNldHRpbmdzRGlhbG9nOjpyZW1vdmVUYWJzKCkKK3sKKyAgICBpZiAobV9wVGFiV2lkZ2V0ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKG1fcFRhYldpZGdldC0+Y291bnQoKSA+IDApCisgICAgeworICAgICAgICBtX3BUYWJXaWRnZXQtPnJlbW92ZVRhYigwKTsKKyAgICB9Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RU2V0dGluZ3NEaWFsb2c6OnNldEdyb3Vwcyh2a3RyYWNlX1NldHRpbmdHcm91cCogcFNldHRpbmdHcm91cHMsIHVuc2lnbmVkIGludCBudW1Hcm91cHMpCit7CisgICAgcmVtb3ZlVGFicygpOworCisgICAgbV9wU2V0dGluZ0dyb3VwcyA9IHBTZXR0aW5nR3JvdXBzOworICAgIG1fbnVtU2V0dGluZ0dyb3VwcyA9IG51bUdyb3VwczsKKworICAgIC8vIGFkZCB0YWJzIHRvIGRpc3BsYXkgb3RoZXIgZ3JvdXBzIG9mIHNldHRpbmdzCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtX251bVNldHRpbmdHcm91cHM7IGkrKykKKyAgICB7CisgICAgICAgIHRoaXMtPmFkZF90YWIoJm1fcFNldHRpbmdHcm91cHNbaV0pOworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FTZXR0aW5nc0RpYWxvZzo6YWNjZXB0Q0IoKQoreworICAgIHNhdmUoKTsKK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FTZXR0aW5nc0RpYWxvZzo6Y2FuY2VsQ0IoKQoreworICAgIHJlamVjdCgpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVNldHRpbmdzRGlhbG9nOjpyZXNpemVFdmVudChRUmVzaXplRXZlbnQgKnBFdmVudCkKK3sKKyAgICBlbWl0IFJlc2l6ZWQocEV2ZW50LT5zaXplKCkud2lkdGgoKSwgcEV2ZW50LT5zaXplKCkuaGVpZ2h0KCkpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVNldHRpbmdzRGlhbG9nOjpzYXZlKCkKK3sKKyAgICAvLyBzYXZlIHZrdHJhY2V2aWV3ZXIgc2V0dGluZ3MKKworICAgIGVtaXQgU2F2ZVNldHRpbmdzKG1fcFNldHRpbmdHcm91cHMsIG1fbnVtU2V0dGluZ0dyb3Vwcyk7CisgICAgYWNjZXB0KCk7Cit9CisKK3ZvaWQgdmt0cmFjZXZpZXdlcl9RU2V0dGluZ3NEaWFsb2c6OmFkZF90YWIodmt0cmFjZV9TZXR0aW5nR3JvdXAqIHBHcm91cCkKK3sKKyAgICBRV2lkZ2V0KiBwVGFiID0gbmV3IFFXaWRnZXQobV9wVGFiV2lkZ2V0KTsKKyAgICBtX3BUYWJXaWRnZXQtPmFkZFRhYihwVGFiLCBwR3JvdXAtPnBOYW1lKTsKKyAgICBRSEJveExheW91dCogcExheW91dCA9IG5ldyBRSEJveExheW91dChwVGFiKTsKKyAgICBwVGFiLT5zZXRMYXlvdXQocExheW91dCk7CisKKyAgICBRVGFibGVXaWRnZXQqIHBUYWJsZSA9IG5ldyBRVGFibGVXaWRnZXQocEdyb3VwLT5udW1TZXR0aW5ncywgMiwgcFRhYik7CisKKyAgICBwTGF5b3V0LT5hZGRXaWRnZXQocFRhYmxlLCAxKTsKKworICAgIFFTdHJpbmdMaXN0IGhlYWRlcnM7CisgICAgaGVhZGVycyA8PCAiTmFtZSIgPDwgIlZhbHVlIjsKKyAgICBwVGFibGUtPnNldEhvcml6b250YWxIZWFkZXJMYWJlbHMoaGVhZGVycyk7CisgICAgcFRhYmxlLT5ob3Jpem9udGFsSGVhZGVyKCktPnNldFNlY3Rpb25SZXNpemVNb2RlKDAsIFFIZWFkZXJWaWV3OjpSZXNpemVUb0NvbnRlbnRzKTsKKyAgICBwVGFibGUtPmhvcml6b250YWxIZWFkZXIoKS0+c2V0U2VjdGlvblJlc2l6ZU1vZGUoMSwgUUhlYWRlclZpZXc6OlN0cmV0Y2gpOworCisgICAgY29ubmVjdChwVGFibGUsIFNJR05BTChpdGVtQ2hhbmdlZChRVGFibGVXaWRnZXRJdGVtICopKSwgdGhpcywgU0xPVChzZXR0aW5nRWRpdGVkKFFUYWJsZVdpZGdldEl0ZW0gKikpKTsKKyAgICBpbnQgcm93ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBHcm91cC0+bnVtU2V0dGluZ3M7IGkrKykKKyAgICB7CisgICAgICAgIFFUYWJsZVdpZGdldEl0ZW0gKm5hbWVJdGVtID0gbmV3IFFUYWJsZVdpZGdldEl0ZW0ocEdyb3VwLT5wU2V0dGluZ3NbaV0ucExvbmdOYW1lKTsKKyAgICAgICAgbmFtZUl0ZW0tPnNldERhdGEoUXQ6OlVzZXJSb2xlLCBRVmFyaWFudDo6ZnJvbVZhbHVlKCZwR3JvdXAtPnBTZXR0aW5nc1tpXSkpOworICAgICAgICBwVGFibGUtPnNldEl0ZW0ocm93LCAwLCBuYW1lSXRlbSk7CisKKyAgICAgICAgY2hhciogcExlYWtlZE1lbSA9IHZrdHJhY2VfU2V0dGluZ0luZm9fc3RyaW5naWZ5X3ZhbHVlKCZwR3JvdXAtPnBTZXR0aW5nc1tpXSk7CisgICAgICAgIFFUYWJsZVdpZGdldEl0ZW0gKnZhbHVlSXRlbSA9IG5ldyBRVGFibGVXaWRnZXRJdGVtKHBMZWFrZWRNZW0pOworICAgICAgICB2YWx1ZUl0ZW0tPnNldERhdGEoUXQ6OlVzZXJSb2xlLCBRVmFyaWFudDo6ZnJvbVZhbHVlKCZwR3JvdXAtPnBTZXR0aW5nc1tpXSkpOworICAgICAgICBwVGFibGUtPnNldEl0ZW0ocm93LCAxLCB2YWx1ZUl0ZW0pOworCisgICAgICAgICsrcm93OworICAgIH0KK30KKwordm9pZCB2a3RyYWNldmlld2VyX1FTZXR0aW5nc0RpYWxvZzo6c2V0dGluZ0VkaXRlZChRVGFibGVXaWRnZXRJdGVtICpwSXRlbSkKK3sKKyAgICB2a3RyYWNlX1NldHRpbmdJbmZvKiBwU2V0dGluZyA9IHBJdGVtLT5kYXRhKFF0OjpVc2VyUm9sZSkudmFsdWU8dmt0cmFjZV9TZXR0aW5nSW5mbyo+KCk7CisKKyAgICBpZiAocFNldHRpbmcgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChwSXRlbS0+Y29sdW1uKCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9mcmVlKCh2b2lkKilwU2V0dGluZy0+cExvbmdOYW1lKTsKKyAgICAgICAgICAgIHBTZXR0aW5nLT5wTG9uZ05hbWUgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KHBJdGVtLT50ZXh0KCkudG9TdGRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwSXRlbS0+Y29sdW1uKCkgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV9TZXR0aW5nSW5mb19wYXJzZV92YWx1ZShwU2V0dGluZywgcEl0ZW0tPnRleHQoKS50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW52YWxpZCBjb2x1bW4KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcXNldHRpbmdzZGlhbG9nLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FzZXR0aW5nc2RpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjM3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3FzZXR0aW5nc2RpYWxvZy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfVktUUkFDRVZJRVdFUl9RU0VUVElOR1NESUFMT0dfSF8KKyNkZWZpbmUgX1ZLVFJBQ0VWSUVXRVJfUVNFVFRJTkdTRElBTE9HX0hfCisKKyNpbmNsdWRlIDxRRGlhbG9nPgorI2luY2x1ZGUgPFFUYWJXaWRnZXQ+CisjaW5jbHVkZSA8UVRhYmxlV2lkZ2V0SXRlbT4KKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3NldHRpbmdzLmgiCisKK1FfREVDTEFSRV9NRVRBVFlQRSh2a3RyYWNlX1NldHRpbmdHcm91cCkKKworY2xhc3Mgdmt0cmFjZXZpZXdlcl9RU2V0dGluZ3NEaWFsb2cgOiBwdWJsaWMgUURpYWxvZworeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICB2a3RyYWNldmlld2VyX1FTZXR0aW5nc0RpYWxvZyhRV2lkZ2V0KiBwYXJlbnQgPSAwKTsKKyAgICB+dmt0cmFjZXZpZXdlcl9RU2V0dGluZ3NEaWFsb2coKTsKKworICAgIHZvaWQgc2V0R3JvdXBzKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwU2V0dGluZ0dyb3VwcywgdW5zaWduZWQgaW50IG51bUdyb3Vwcyk7CisKKyAgICB2b2lkIHNhdmUoKTsKKworcHJpdmF0ZToKKyAgICB2a3RyYWNlX1NldHRpbmdHcm91cCogbV9wU2V0dGluZ0dyb3VwczsKKyAgICB1bnNpZ25lZCBpbnQgbV9udW1TZXR0aW5nR3JvdXBzOworCisgICAgUVRhYldpZGdldCogbV9wVGFiV2lkZ2V0OworICAgIHZvaWQgYWRkX3RhYih2a3RyYWNlX1NldHRpbmdHcm91cCogcEdyb3VwKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICpwRXZlbnQpOworICAgIHZvaWQgcmVtb3ZlVGFicygpOworCitzaWduYWxzOgorICAgIHZvaWQgU2F2ZVNldHRpbmdzKHZrdHJhY2VfU2V0dGluZ0dyb3VwKiBwVXBkYXRlZFNldHRpbmdHcm91cHMsIHVuc2lnbmVkIGludCBudW1Hcm91cHMpOworICAgIHZvaWQgUmVzaXplZCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpOworCitwcml2YXRlCitzbG90czoKKyAgICB2b2lkIGFjY2VwdENCKCk7CisgICAgdm9pZCBjYW5jZWxDQigpOworCisgICAgdm9pZCBzZXR0aW5nRWRpdGVkKFFUYWJsZVdpZGdldEl0ZW0gKnBJdGVtKTsKKworfTsKKworI2VuZGlmIC8vIF9WS1RSQUNFVklFV0VSX1FTRVRUSU5HU0RJQUxPR19IXwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xc3Zndmlld2VyLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3Fzdmd2aWV3ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWFjNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xc3Zndmlld2VyLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9WS1RSQUNFVklFV0VSX1FTVkdWSUVXRVJfSF8KKyNkZWZpbmUgX1ZLVFJBQ0VWSUVXRVJfUVNWR1ZJRVdFUl9IXworCisjaW5jbHVkZSA8UUZpbGVJbmZvPgorI2luY2x1ZGUgPFFHcmFwaGljc1N2Z0l0ZW0+CisjaW5jbHVkZSA8UUdyYXBoaWNzVmlldz4KKyNpbmNsdWRlIDxRV2hlZWxFdmVudD4KKworY2xhc3Mgdmt0cmFjZXZpZXdlcl9xc3Zndmlld2VyIDogcHVibGljIFFHcmFwaGljc1ZpZXcKK3sKKyAgICBRX09CSkVDVAorcHVibGljOgorICAgIHZrdHJhY2V2aWV3ZXJfcXN2Z3ZpZXdlcihRV2lkZ2V0KiBwYXJlbnQgPSAwKSA6CisgICAgICAgIFFHcmFwaGljc1ZpZXcocGFyZW50KSwKKyAgICAgICAgZGlzYWJsZWRTY2VuZShOVUxMKSwKKyAgICAgICAgZW5hYmxlZFNjZW5lKE5VTEwpLAorICAgICAgICBhdXRvRml0KGZhbHNlKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGRlc3RydWN0b3IgZm9yIFFHcmFwaGljc1NjZW5lIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBRR3JhcGhpY3NWaWV3IGlzCisgICAgICAgIC8vIGRlc3Ryb3llZC4KKyAgICAgICAgZW5hYmxlZFNjZW5lID0gbmV3IFFHcmFwaGljc1NjZW5lKHRoaXMpOworICAgICAgICBkaXNhYmxlZFNjZW5lID0gbmV3IFFHcmFwaGljc1NjZW5lKHRoaXMpOworICAgICAgICB0aGlzLT5zZXRTY2VuZShkaXNhYmxlZFNjZW5lKTsKKworICAgICAgICAvLyBBbmNob3IgdGhlIHBvaW50IHVuZGVyIHRoZSBtb3VzZSBkdXJpbmcgdmlldyB0cmFuc2Zvcm1hdGlvbnMuCisgICAgICAgIHRoaXMtPnNldFRyYW5zZm9ybWF0aW9uQW5jaG9yKEFuY2hvclVuZGVyTW91c2UpOworCisgICAgICAgIC8vIEVuYWJsZSBkcmFnIHNjcm9sbGluZyB3aXRoIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbi4KKyAgICAgICAgdGhpcy0+c2V0RHJhZ01vZGUoU2Nyb2xsSGFuZERyYWcpOworCisgICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgdGhlIGVudGlyZSB2aWV3cG9ydC4gRG9uJ3Qgd2FzdGUgdGltZSB0cnlpbmcgdG8gZmlndXJlIG91dAorICAgICAgICAvLyB3aGljaCBpdGVtcyBuZWVkIHRvIGJlIHVwZGF0ZWQgc2luY2UgdGhlcmUgaXMgb25seSBvbmUuCisgICAgICAgIHRoaXMtPnNldFZpZXdwb3J0VXBkYXRlTW9kZShGdWxsVmlld3BvcnRVcGRhdGUpOworICAgIH0KKworICAgIHZvaWQgY2hhbmdlRXZlbnQoUUV2ZW50KiBldmVudCkKKyAgICB7CisgICAgICAgIHN3aXRjaChldmVudC0+dHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFFFdmVudDo6RW5hYmxlZENoYW5nZToKKyAgICAgICAgICAgICAgICBpZih0aGlzLT5pc0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMtPnNldFNjZW5lKGVuYWJsZWRTY2VuZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMtPnNldFNjZW5lKGRpc2FibGVkU2NlbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQqIGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gUmVzaXplIHRoZSBzY2VuZSB0byBmaXQgdGhlIHdpZGdldC4gVGhpcyBpcyBkZWZlcnJlZCB1bnRpbCB0aGUgZmlyc3QgcGFpbnQKKyAgICAgICAgLy8gZXZlbnQgKHdoZW4gdGhlIHdpZGdldCBzaXplIGlzIGtub3duKS4KKyAgICAgICAgaWYoYXV0b0ZpdCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Zml0SW5WaWV3KGVuYWJsZWRTY2VuZS0+aXRlbXNCb3VuZGluZ1JlY3QoKSwgUXQ6OktlZXBBc3BlY3RSYXRpbyk7CisgICAgICAgICAgICBhdXRvRml0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBRR3JhcGhpY3NWaWV3OjpwYWludEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICB2b2lkIHdoZWVsRXZlbnQoUVdoZWVsRXZlbnQqIGV2ZW50KQorICAgIHsKKyAgICAgICAgaWYoZXZlbnQtPm9yaWVudGF0aW9uKCkgPT0gUXQ6OlZlcnRpY2FsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgZGVsdGEgdmFsdWUgaXMgaW4gdW5pdHMgb2YgZWlnaHRocyBvZiBhIGRlZ3JlZS4KKyAgICAgICAgICAgIHFyZWFsIGNvbnN0IGRlZ3JlZXMgPSBldmVudC0+ZGVsdGEoKSAvIDguMDsKKworICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFF0IGRvY3VtZW50YXRpb24sIG1pY2UgaGF2ZSBzdGVwcyBvZiAxNS1kZWdyZWVzLgorICAgICAgICAgICAgcXJlYWwgY29uc3Qgc3RlcHMgPSBkZWdyZWVzIC8gMTUuMDsKKworICAgICAgICAgICAgcXJlYWwgZmFjdG9yID0gMS4wICsgMC4xICogc3RlcHM7CisKKyAgICAgICAgICAgIHRoaXMtPnNjYWxlKGZhY3RvciwgZmFjdG9yKTsKKworICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBsb2FkKFFTdHJpbmcgY29uc3QmIGZpbGVOYW1lKQorICAgIHsKKyAgICAgICAgUUZpbGVJbmZvIGZpbGVJbmZvKGZpbGVOYW1lKTsKKyAgICAgICAgaWYoIWZpbGVJbmZvLmV4aXN0cygpIHx8ICFmaWxlSW5mby5pc0ZpbGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy0+cmVzZXRUcmFuc2Zvcm0oKTsKKworICAgICAgICBlbmFibGVkU2NlbmUtPmNsZWFyKCk7CisKKyAgICAgICAgLy8gVGhlIGRlc3RydWN0b3IgZm9yIFFHcmFwaGljc1N2Z0l0ZW0gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgc2NlbmUgaXMgY2xlYXJlZC4KKyAgICAgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiBhIFNWRyBpcyBsb2FkZWQgb3Igd2hlbiB0aGUgUUdyYXBoaWNzU2NlbmUgaXMgZGVzdHJveWVkLgorICAgICAgICBlbmFibGVkU2NlbmUtPmFkZEl0ZW0obmV3IFFHcmFwaGljc1N2Z0l0ZW0oZmlsZU5hbWUpKTsKKworICAgICAgICBhdXRvRml0ID0gdHJ1ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUUdyYXBoaWNzU2NlbmUqIGRpc2FibGVkU2NlbmU7CisgICAgUUdyYXBoaWNzU2NlbmUqIGVuYWJsZWRTY2VuZTsKKworICAgIGJvb2wgYXV0b0ZpdDsKK307CisKKyNlbmRpZiAvLyBfVktUUkFDRVZJRVdFUl9RU1ZHVklFV0VSX0hfCmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3F0aW1lbGluZXZpZXcuY3BwIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xdGltZWxpbmV2aWV3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk1ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xdGltZWxpbmV2aWV3LmNwcApAQCAtMCwwICsxLDc2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UVBhaW50ZXI+CisjaW5jbHVkZSA8UVBhaW50RXZlbnQ+CisjaW5jbHVkZSA8UVRvb2xUaXA+CisjaWZkZWYgX1dJTjMyCisvLyBUaGUgZm9sbG93aW5nIGxpbmUgYWxsb3dzIFZpc3VhbCBTdHVkaW8gdG8gcHJvdmlkZSB0aGUgTV9QSV8yIGNvbnN0YW50OgorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2VuZGlmCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfcXRpbWVsaW5ldmlldy5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsLmgiCisKKy8vIGhlbHBlcgorZmxvYXQgdTY0VG9GbG9hdCh1aW50NjRfdCB2YWx1ZSkKK3sKKyAgICAvLyB0YWtlbiBmcm9tOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ0MDA3NDcvY29udmVydGluZy1mcm9tLXVuc2lnbmVkLWxvbmctbG9uZy10by1mbG9hdC13aXRoLXJvdW5kLXRvLW5lYXJlc3QtZXZlbgorICAgIGNvbnN0IGludCBtYXNrX2JpdF9jb3VudCA9IDMxOworCisgICAgLy8gSG93IG1hbnkgYml0cyBhcmUgbmVlZGVkPworICAgIGludCBiID0gc2l6ZW9mKHVpbnQ2NF90KSAqIENIQVJfQklUIC0gMTsKKyAgICBmb3IgKDsgYiA+PSAwOyAtLWIpCisgICAgeworICAgICAgICBpZiAodmFsdWUgJiAoMXVsbCA8PCBiKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgZmV3IGVub3VnaCBzaWduaWZpY2FudCBiaXRzLCB1c2Ugbm9ybWFsIGNhc3QgYW5kIGRvbmUuCisgICAgaWYgKGIgPCBtYXNrX2JpdF9jb3VudCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUgJiB+MXVsbCk7CisgICAgfQorCisgICAgLy8gU2F2ZSBvZmYgdGhlIGxvdy1vcmRlciB1c2VsZXNzIGJpdHM6CisgICAgdWludDY0X3QgbG93X2JpdHMgPSB2YWx1ZSAmICgoMXVsbCA8PCAoYiAtIG1hc2tfYml0X2NvdW50KSkgLSAxKTsKKworICAgIC8vIE5vdyBtYXNrIGF3YXkgdGhvc2UgdXNlbGVzcyBsb3cgYml0czoKKyAgICB2YWx1ZSAmPSB+KCgxdWxsIDw8IChiIC0gbWFza19iaXRfY291bnQpKSAtIDEpOworCisgICAgLy8gRmluYWxseSwgZGVjaWRlIGhvdyB0byByb3VuZCB0aGUgbmV3IExTQjoKKyAgICBpZiAobG93X2JpdHMgPiAoKDF1bGwgPDwgKGIgLSBtYXNrX2JpdF9jb3VudCkpIC8gMnVsbCkpCisgICAgeworICAgICAgICAvLyBSb3VuZCB1cC4KKyAgICAgICAgdmFsdWUgfD0gKDF1bGwgPDwgKGIgLSBtYXNrX2JpdF9jb3VudCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBSb3VuZCBkb3duLgorICAgICAgICB2YWx1ZSAmPSB+KDF1bGwgPDwgKGIgLSBtYXNrX2JpdF9jb3VudCkpOworICAgIH0KKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2a3RyYWNldmlld2VyX1FUaW1lbGluZUl0ZW1EZWxlZ2F0ZTo6dmt0cmFjZXZpZXdlcl9RVGltZWxpbmVJdGVtRGVsZWdhdGUoUU9iamVjdCAqcGFyZW50KQorICAgIDogUUFic3RyYWN0SXRlbURlbGVnYXRlKHBhcmVudCkKK3sKKyAgICBhc3NlcnQocGFyZW50ICE9IE5VTEwpOworfQorCit2a3RyYWNldmlld2VyX1FUaW1lbGluZUl0ZW1EZWxlZ2F0ZTo6fnZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lSXRlbURlbGVnYXRlKCkKK3sKKworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lSXRlbURlbGVnYXRlOjpwYWludChRUGFpbnRlciAqcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uVmlld0l0ZW0gJm9wdGlvbiwgY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdAoreworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqKWluZGV4LmludGVybmFsUG9pbnRlcigpOworCisgICAgaWYgKHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgPD0gcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBhaW50ZXItPnNhdmUoKTsKKyAgICB7CisgICAgICAgIHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lVmlldyogcFRpbWVsaW5lID0gKHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lVmlldyopcGFyZW50KCk7CisgICAgICAgIGlmIChwVGltZWxpbmUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUVJlY3RGIHJlY3QgPSBvcHRpb24ucmVjdDsKKworICAgICAgICAgICAgaWYgKHJlY3Qud2lkdGgoKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlY3Quc2V0V2lkdGgoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsb2F0IGR1cmF0aW9uID0gdTY0VG9GbG9hdChwSGVhZGVyLT5lbnRyeXBvaW50X2VuZF90aW1lIC0gcEhlYWRlci0+ZW50cnlwb2ludF9iZWdpbl90aW1lKTsKKyAgICAgICAgICAgIGZsb2F0IGR1cmF0aW9uUmF0aW8gPSBkdXJhdGlvbiAvIHBUaW1lbGluZS0+Z2V0TWF4SXRlbUR1cmF0aW9uKCk7CisgICAgICAgICAgICBpbnQgaW50ZW5zaXR5ID0gc3RkOjptaW4oMjU1LCAoaW50KShkdXJhdGlvblJhdGlvICogMjU1LjBmKSk7CisgICAgICAgICAgICBRQ29sb3IgY29sb3IoaW50ZW5zaXR5LCAyNTUtaW50ZW5zaXR5LCAwKTsKKworICAgICAgICAgICAgLy8gYWRkIGdyYWRpZW50IHRvIHRoZSBpdGVtcyBiZXR0ZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZW5kIG9mIG9uZSBhbmQgYmVnaW5uaW5nIG9mIHRoZSBuZXh0CisgICAgICAgICAgICBRTGluZWFyR3JhZGllbnQgbGluZWFyR3JhZChyZWN0LmNlbnRlcigpLCByZWN0LmJvdHRvbVJpZ2h0KCkpOworICAgICAgICAgICAgbGluZWFyR3JhZC5zZXRDb2xvckF0KDAsIGNvbG9yKTsKKyAgICAgICAgICAgIGxpbmVhckdyYWQuc2V0Q29sb3JBdCgxLCBjb2xvci5kYXJrZXIoMTUwKSk7CisKKyAgICAgICAgICAgIHBhaW50ZXItPnNldEJydXNoKGxpbmVhckdyYWQpOworICAgICAgICAgICAgcGFpbnRlci0+c2V0UGVuKFF0OjpOb1Blbik7CisKKyAgICAgICAgICAgIHBhaW50ZXItPmRyYXdSZWN0KHJlY3QpOworCisgICAgICAgICAgICBpZiAocmVjdC53aWR0aCgpID49IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZHJhdyBzaGFkb3cgYW5kIGhpZ2hsaWdodCBhcm91bmQgdGhlIGl0ZW0KKyAgICAgICAgICAgICAgICBwYWludGVyLT5zZXRQZW4oY29sb3IuZGFya2VyKDE3NSkpOworICAgICAgICAgICAgICAgIHBhaW50ZXItPmRyYXdMaW5lKHJlY3QucmlnaHQoKS0xLCByZWN0LnRvcCgpLCByZWN0LnJpZ2h0KCktMSwgcmVjdC5ib3R0b20oKS0xKTsKKyAgICAgICAgICAgICAgICBwYWludGVyLT5kcmF3TGluZShyZWN0LnJpZ2h0KCktMSwgcmVjdC5ib3R0b20oKS0xLCByZWN0LmxlZnQoKSwgcmVjdC5ib3R0b20oKS0xKTsKKworICAgICAgICAgICAgICAgIHBhaW50ZXItPnNldFBlbihjb2xvci5saWdodGVyKCkpOworICAgICAgICAgICAgICAgIHBhaW50ZXItPmRyYXdMaW5lKHJlY3QubGVmdCgpLCByZWN0LmJvdHRvbSgpLTEsIHJlY3QubGVmdCgpLCByZWN0LnRvcCgpKTsKKyAgICAgICAgICAgICAgICBwYWludGVyLT5kcmF3TGluZShyZWN0LmxlZnQoKSwgcmVjdC50b3AoKSwgcmVjdC5yaWdodCgpLTEsIHJlY3QudG9wKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGFpbnRlci0+cmVzdG9yZSgpOworfQorCitRU2l6ZSB2a3RyYWNldmlld2VyX1FUaW1lbGluZUl0ZW1EZWxlZ2F0ZTo6c2l6ZUhpbnQoIGNvbnN0IFFTdHlsZU9wdGlvblZpZXdJdGVtICZvcHRpb24sIGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCkgY29uc3QKK3sKKyAgICBRU2l6ZSBzaXplOworCisgICAgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3KiBwVGltZWxpbmUgPSAodmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3KilwYXJlbnQoKTsKKyAgICBpZiAocFRpbWVsaW5lICE9IE5VTEwpCisgICAgeworICAgICAgICBRUmVjdEYgcmVjdCA9IHBUaW1lbGluZS0+dmlzdWFsUmVjdChpbmRleCk7CisKKyAgICAgICAgc2l6ZSA9IHJlY3QudG9SZWN0KCkuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gUVNpemUoKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3Ojp2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXcoUVdpZGdldCAqcGFyZW50KSA6CisgICAgUUFic3RyYWN0SXRlbVZpZXcocGFyZW50KSwKKyAgICBtX21heEl0ZW1EdXJhdGlvbigwKSwKKyAgICBtX21heFpvb20oMC4wMDFmKSwKKyAgICBtX3RocmVhZEhlaWdodCgwKSwKKyAgICBtX2hhc2hJc0RpcnR5KHRydWUpLAorICAgIG1fbWFyZ2luKDEwKSwKKyAgICBtX3BQaXhtYXAoTlVMTCksCisgICAgbV9pdGVtRGVsZWdhdGUodGhpcykKK3sKKyAgICBob3Jpem9udGFsU2Nyb2xsQmFyKCktPnNldFJhbmdlKDAsMCk7CisgICAgdmVydGljYWxTY3JvbGxCYXIoKS0+c2V0UmFuZ2UoMCwwKTsKKworICAgIG1fYmFja2dyb3VuZCA9IFFCcnVzaChRQ29sb3IoMjAwLDIwMCwyMDApKTsKKyAgICBtX3RyaWFuZ2xlUGVuID0gUVBlbihRdDo6ZGFya0dyYXkpOworICAgIG1fdHJpYW5nbGVQZW4uc2V0V2lkdGgoMSk7CisgICAgbV90ZXh0UGVuID0gUVBlbihRdDo6d2hpdGUpOworICAgIG1fdGV4dEZvbnQuc2V0UGl4ZWxTaXplKDUwKTsKKworICAgIC8vIEFsbG93cyB0cmFja2luZyB0aGUgbW91c2UgcG9zaXRpb24gd2hlbiBpdCBpcyBvdmVyIHRoZSB0aW1lbGluZQorICAgIHNldE1vdXNlVHJhY2tpbmcodHJ1ZSk7CisKKyAgICBtX2R1cmF0aW9uVG9WaWV3cG9ydFNjYWxlID0gMTsKKyAgICBtX3pvb21GYWN0b3IgPSAxOworICAgIG1fbGluZUxlbmd0aCA9IDE7CisgICAgbV9zY3JvbGxCYXJXaWR0aCA9IFFBcHBsaWNhdGlvbjo6c3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQTV9TY3JvbGxCYXJFeHRlbnQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6On52a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXcoKQoreworICAgIG1fdGhyZWFkSWRMaXN0LmNsZWFyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3OjpzZXRNb2RlbChRQWJzdHJhY3RJdGVtTW9kZWwqIHBNb2RlbCkKK3sKKyAgICBRQWJzdHJhY3RJdGVtVmlldzo6c2V0TW9kZWwocE1vZGVsKTsKKyAgICBtX2hhc2hJc0RpcnR5ID0gdHJ1ZTsKKyAgICBzZXRJdGVtRGVsZWdhdGUoJm1faXRlbURlbGVnYXRlKTsKKworICAgIG1fdGhyZWFkSWRMaXN0LmNsZWFyKCk7CisgICAgbV90aHJlYWRNYXNrLmNsZWFyKCk7CisgICAgbV9tYXhJdGVtRHVyYXRpb24gPSAwOworICAgIG1fcmF3U3RhcnRUaW1lID0gMDsKKyAgICBtX3Jhd0VuZFRpbWUgPSAwOworCisgICAgZGVsZXRlUGl4bWFwKCk7CisKKyAgICAvLyBHYXRoZXIgc29tZSBzdGF0cyBmcm9tIHRoZSBtb2RlbAorICAgIGlmIChtb2RlbCgpID09IE5VTEwpCisgICAgeworICAgICAgICBob3Jpem9udGFsU2Nyb2xsQmFyKCktPnNldFJhbmdlKDAsMCk7CisgICAgICAgIHZlcnRpY2FsU2Nyb2xsQmFyKCktPnNldFJhbmdlKDAsMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtUm93cyA9IG1vZGVsKCktPnJvd0NvdW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspCisgICAgeworICAgICAgICAvLyBDb3VudCBudW1iZXIgb2YgdW5pcXVlIHRocmVhZCBJZHMKKyAgICAgICAgUU1vZGVsSW5kZXggaXRlbSA9IG1vZGVsKCktPmluZGV4KGksIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fVGhyZWFkSWQpOworICAgICAgICBpZiAoaXRlbS5pc1ZhbGlkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRocmVhZElkID0gaXRlbS5kYXRhKCkudG9VSW50KCk7CisgICAgICAgICAgICBpZiAoIW1fdGhyZWFkSWRMaXN0LmNvbnRhaW5zKHRocmVhZElkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3RocmVhZElkTGlzdC5hcHBlbmQodGhyZWFkSWQpOworICAgICAgICAgICAgICAgIG1fdGhyZWFkTWFzay5pbnNlcnQodGhyZWFkSWQsIFFWZWN0b3I8aW50PigpKTsKKyAgICAgICAgICAgICAgICBtX3RocmVhZEFyZWEuYXBwZW5kKFFSZWN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBkdXJhdGlvbiBvZiBsb25nZXN0IGl0ZW0KKyAgICAgICAgaXRlbSA9IG1vZGVsKCktPmluZGV4KGksIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fQ3B1RHVyYXRpb24pOworICAgICAgICBpZiAoaXRlbS5pc1ZhbGlkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGR1cmF0aW9uID0gaXRlbS5kYXRhKCkudG9GbG9hdCgpOworICAgICAgICAgICAgaWYgKG1fbWF4SXRlbUR1cmF0aW9uIDwgZHVyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9tYXhJdGVtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBzdGFydCB0aW1lCisgICAgUU1vZGVsSW5kZXggc3RhcnQgPSBtb2RlbCgpLT5pbmRleCgwLCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0JlZ2luVGltZSk7CisgICAgaWYgKHN0YXJ0LmlzVmFsaWQoKSkKKyAgICB7CisgICAgICAgIG1fcmF3U3RhcnRUaW1lID0gc3RhcnQuZGF0YSgpLnRvVUxvbmdMb25nKCk7CisgICAgfQorCisgICAgLy8gR2V0IGVuZCB0aW1lCisgICAgUU1vZGVsSW5kZXggZW5kID0gbW9kZWwoKS0+aW5kZXgobnVtUm93cyAtIDEsIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW5kVGltZSk7CisgICAgaWYgKGVuZC5pc1ZhbGlkKCkpCisgICAgeworICAgICAgICBtX3Jhd0VuZFRpbWUgPSBlbmQuZGF0YSgpLnRvVUxvbmdMb25nKCk7CisgICAgfQorCisgICAgLy8gdGhlIGR1cmF0aW9uIHRvIHZpZXdwb3J0IHNjYWxlIHNob3VsZCBhbGxvdyB1cyB0byBtYXAgdGhlIGVudGlyZSB0aW1lbGluZSBpbnRvIHRoZSBjdXJyZW50IHdpbmRvdyB3aWR0aC4KKyAgICBtX2xpbmVMZW5ndGggPSBtX3Jhd0VuZFRpbWUgLSBtX3Jhd1N0YXJ0VGltZTsKKworICAgIGludCBpbml0aWFsVGltZWxpbmVXaWR0aCA9IHZpZXdwb3J0KCktPndpZHRoKCkgLSAyKm1fbWFyZ2luIC0gbV9zY3JvbGxCYXJXaWR0aDsKKyAgICBtX2R1cmF0aW9uVG9WaWV3cG9ydFNjYWxlID0gKGZsb2F0KWluaXRpYWxUaW1lbGluZVdpZHRoIC8gdTY0VG9GbG9hdChtX2xpbmVMZW5ndGgpOworCisgICAgbV96b29tRmFjdG9yID0gbV9kdXJhdGlvblRvVmlld3BvcnRTY2FsZTsKKworICAgIHZlcnRpY2FsU2Nyb2xsQmFyKCktPnNldE1heGltdW0oMTAwMCk7CisgICAgdmVydGljYWxTY3JvbGxCYXIoKS0+c2V0VmFsdWUoMCk7CisgICAgdmVydGljYWxTY3JvbGxCYXIoKS0+c2V0UGFnZVN0ZXAoMSk7CisgICAgdmVydGljYWxTY3JvbGxCYXIoKS0+c2V0U2luZ2xlU3RlcCgxKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OmNhbGN1bGF0ZVJlY3RzSWZOZWNlc3NhcnkoKQoreworICAgIGlmICghbV9oYXNoSXNEaXJ0eSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobW9kZWwoKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBpdGVtSGVpZ2h0ID0gbV90aHJlYWRIZWlnaHQgKiAwLjQ7CisKKyAgICBmb3IgKGludCB0aHJlYWRJbmRleCA9IDA7IHRocmVhZEluZGV4IDwgbV90aHJlYWRJZExpc3Quc2l6ZSgpOyB0aHJlYWRJbmRleCsrKQorICAgIHsKKyAgICAgICAgaW50IHRvcCA9IChtX3RocmVhZEhlaWdodCAqIHRocmVhZEluZGV4KSArIChtX3RocmVhZEhlaWdodCAqIDAuNSkgLSBpdGVtSGVpZ2h0LzI7CisgICAgICAgIHRoaXMtPm1fdGhyZWFkQXJlYVt0aHJlYWRJbmRleF0gPSBRUmVjdCgwLCB0b3AsIHZpZXdwb3J0KCktPndpZHRoKCksIGl0ZW1IZWlnaHQpOworICAgIH0KKworICAgIGludCBudW1Sb3dzID0gbW9kZWwoKS0+cm93Q291bnQoKTsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykKKyAgICB7CisgICAgICAgIFFSZWN0RiByZWN0OworICAgICAgICBRTW9kZWxJbmRleCBpdGVtID0gbW9kZWwoKS0+aW5kZXgocm93LCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVNb2RlbDo6Q29sdW1uX0VudHJ5cG9pbnROYW1lKTsKKworICAgICAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIgPSAodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKilpdGVtLmludGVybmFsUG9pbnRlcigpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSBpdGVtIGlzIHZhbGlkIHNpemUKKyAgICAgICAgaWYgKHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgPiBwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0aHJlYWRJbmRleCA9IG1fdGhyZWFkSWRMaXN0LmluZGV4T2YocEhlYWRlci0+dGhyZWFkX2lkKTsKKyAgICAgICAgICAgIGludCB0b3BPZmZzZXQgPSAobV90aHJlYWRIZWlnaHQgKiB0aHJlYWRJbmRleCkgKyAobV90aHJlYWRIZWlnaHQgKiAwLjUpOworCisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IHBIZWFkZXItPmVudHJ5cG9pbnRfZW5kX3RpbWUgLSBwSGVhZGVyLT5lbnRyeXBvaW50X2JlZ2luX3RpbWU7CisKKyAgICAgICAgICAgIGZsb2F0IGxlZnRPZmZzZXQgPSB1NjRUb0Zsb2F0KHBIZWFkZXItPmVudHJ5cG9pbnRfYmVnaW5fdGltZSAtIG1fcmF3U3RhcnRUaW1lKTsKKyAgICAgICAgICAgIGZsb2F0IFdpZHRoID0gdTY0VG9GbG9hdChkdXJhdGlvbik7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcmVjdCB0aGF0IHJlcHJlc2VudHMgdGhpcyBpdGVtCisgICAgICAgICAgICByZWN0LnNldExlZnQobGVmdE9mZnNldCk7CisgICAgICAgICAgICByZWN0LnNldFRvcCh0b3BPZmZzZXQgLSAoaXRlbUhlaWdodC8yKSk7CisgICAgICAgICAgICByZWN0LnNldFdpZHRoKFdpZHRoKTsKKyAgICAgICAgICAgIHJlY3Quc2V0SGVpZ2h0KGl0ZW1IZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgbV9yb3dUb1JlY3RNYXBbcm93XSA9IHJlY3Q7CisgICAgfQorCisgICAgbV9oYXNoSXNEaXJ0eSA9IGZhbHNlOworICAgIHZpZXdwb3J0KCktPnVwZGF0ZSgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRUmVjdEYgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3OjppdGVtUmVjdChjb25zdCBRTW9kZWxJbmRleCAmaXRlbSkgY29uc3QKK3sKKyAgICBRUmVjdEYgcmVjdDsKKyAgICBpZiAoaXRlbS5pc1ZhbGlkKCkpCisgICAgeworICAgICAgICByZWN0ID0gbV9yb3dUb1JlY3RNYXAudmFsdWUoaXRlbS5yb3coKSk7CisgICAgfQorICAgIHJldHVybiByZWN0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lVmlldzo6ZXZlbnQoUUV2ZW50ICogZSkKK3sKKyAgICBpZiAoZS0+dHlwZSgpID09IFFFdmVudDo6VG9vbFRpcCkKKyAgICB7CisgICAgICAgIFFIZWxwRXZlbnQqIHBIZWxwID0gc3RhdGljX2Nhc3Q8UUhlbHBFdmVudCo+KGUpOworICAgICAgICBRTW9kZWxJbmRleCBpbmRleCA9IGluZGV4QXQocEhlbHAtPnBvcygpKTsKKyAgICAgICAgaWYgKGluZGV4LmlzVmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyID0gKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciopaW5kZXguaW50ZXJuYWxQb2ludGVyKCk7CisgICAgICAgICAgICBRVG9vbFRpcDo6c2hvd1RleHQocEhlbHAtPmdsb2JhbFBvcygpLCBRU3RyaW5nKCJDYWxsICUxOlxuJTIiKS5hcmcocEhlYWRlci0+Z2xvYmFsX3BhY2tldF9pbmRleCkuYXJnKGluZGV4LmRhdGEoKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFFUb29sVGlwOjpoaWRlVGV4dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFFBYnN0cmFjdEl0ZW1WaWV3OjpldmVudChlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OnJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCAqZXZlbnQpCit7CisgICAgbV9oYXNoSXNEaXJ0eSA9IHRydWU7CisgICAgZGVsZXRlUGl4bWFwKCk7CisKKyAgICAvLyBUaGUgZHVyYXRpb24gdG8gdmlld3BvcnQgc2NhbGUgc2hvdWxkIGFsbG93IHVzIHRvIG1hcCB0aGUgZW50aXJlIHRpbWVsaW5lIGludG8gdGhlIGN1cnJlbnQgd2luZG93IHdpZHRoLgorICAgIGlmIChtX2xpbmVMZW5ndGggPiAwKQorICAgIHsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHpvb20gcmF0aW8gcHJpb3IgdG8gdGhlIHJlc2l6ZQorICAgICAgICBmbG9hdCByYXRpbyA9IG1fem9vbUZhY3RvciAvIG1fZHVyYXRpb25Ub1ZpZXdwb3J0U2NhbGU7CisKKyAgICAgICAgLy8gQWRqdXN0IHNjYWxlIHRoYXQgZml0cyB0aGUgdGltZWxpbmUgZHVyYXRpb24gdG8gdGhlIHZpZXdwb3J0IGFyZWEKKyAgICAgICAgaW50IHRpbWVsaW5lVmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0KCktPndpZHRoKCkgLSAyKm1fbWFyZ2luIC0gbV9zY3JvbGxCYXJXaWR0aDsKKyAgICAgICAgbV9kdXJhdGlvblRvVmlld3BvcnRTY2FsZSA9IChmbG9hdCl0aW1lbGluZVZpZXdwb3J0V2lkdGggLyB1NjRUb0Zsb2F0KG1fbGluZUxlbmd0aCk7CisKKyAgICAgICAgLy8gQWRqdXN0IHRoZSB6b29tIGZhY3RvciBiYXNlZCBvbiB0aGUgbmV3IGR1cmF0aW9uIHRvIHZpZXdwb3J0IHNjYWxlIGFuZCB0aGUgcHJldmlvdXMgcmF0aW8KKyAgICAgICAgbV96b29tRmFjdG9yID0gbV9kdXJhdGlvblRvVmlld3BvcnRTY2FsZSAqIHJhdGlvOworCisgICAgICAgIC8vIEFkanVzdCBob3Jpem9udGFsIHNjcm9sbCBiYXIgdG8gbWFpbnRhaW4gY3VycmVudCB2aWV3IGFzIGJlc3QgYXMgcG9zc2libGUKKyAgICAgICAgZmxvYXQgaFJhdGlvID0gKGZsb2F0KWhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKSAvIHFNYXgoMS4wZiwoZmxvYXQpaG9yaXpvbnRhbFNjcm9sbEJhcigpLT5tYXhpbXVtKCkpOworICAgICAgICB1cGRhdGVHZW9tZXRyaWVzKCk7CisgICAgICAgIGhvcml6b250YWxTY3JvbGxCYXIoKS0+c2V0VmFsdWUoaFJhdGlvICogaG9yaXpvbnRhbFNjcm9sbEJhcigpLT5tYXhpbXVtKCkpOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OnNjcm9sbENvbnRlbnRzQnkoaW50IGR4LCBpbnQgZHkpCit7CisgICAgZGVsZXRlUGl4bWFwKCk7CisKKyAgICBpZiAoZHkgIT0gMCkKKyAgICB7CisgICAgICAgIFFQb2ludCBwb3MgPSBtX21vdXNlUG9zaXRpb247CisgICAgICAgIGludCBmb2N1c1ggPSBwb3MueCgpOworICAgICAgICBpZiAocG9zLmlzTnVsbCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGUgbW91c2UgcG9zaXRpb24gaXMgTlVMTCAoaWUsIHRoZSBtb3VzZSBpcyBub3QgaW4gdGhlIHZpZXdwb3J0KQorICAgICAgICAgICAgLy8gem9vbWluZyB3aWxsIGhhcHBlbiBhcm91bmQgdGhlIGNlbnRlciBvZiB0aGUgdGltZWxpbmUKKyAgICAgICAgICAgIGZvY3VzWCA9ICh2aWV3cG9ydCgpLT53aWR0aCgpIC0gbV9zY3JvbGxCYXJXaWR0aCkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgaW50IHggPSBmb2N1c1ggKyBob3Jpem9udGFsU2Nyb2xsQmFyKCktPnZhbHVlKCk7CisgICAgICAgIGZsb2F0IHd4ID0gKGZsb2F0KXggLyBtX3pvb21GYWN0b3I7CisKKyAgICAgICAgLy8gVGhlIHpvb20gZmFjdG9yIGlzIGEgc21vb3RoZWQgaW50ZXJwb2xhdGlvbiAoYmFzZWQgb24gdGhlIHZlcnRpY2FsIHNjcm9sbCBiYXIgdmFsdWUgYW5kIG1heCkKKyAgICAgICAgLy8gYmV0d2VlbiB0aGUgbV9kdXJhdGlvblRvVmlld3BvcnRTY2FsZSAod2hpY2ggZml0cyB0aGUgZW50aXJlIHRpbWVsaW5lIGludG8gdGhlIHZpZXdwb3J0IHdpZHRoKQorICAgICAgICAvLyBhbmQgbV9tYXhab29tICh3aGljaCBpcyBpbml0aWFsaXplZCB0byAxLzEwMDApCisgICAgICAgIGZsb2F0IHpvb21SYXRpbyA9IChmbG9hdCl2ZXJ0aWNhbFNjcm9sbEJhcigpLT52YWx1ZSgpIC8gKGZsb2F0KXZlcnRpY2FsU2Nyb2xsQmFyKCktPm1heGltdW0oKTsKKyAgICAgICAgem9vbVJhdGlvID0gMS1jb3Moem9vbVJhdGlvKk1fUElfMik7CisgICAgICAgIGZsb2F0IGRpZmYgPSBtX21heFpvb20gLSBtX2R1cmF0aW9uVG9WaWV3cG9ydFNjYWxlOworICAgICAgICBtX3pvb21GYWN0b3IgPSBtX2R1cmF0aW9uVG9WaWV3cG9ydFNjYWxlICsgem9vbVJhdGlvICogZGlmZjsKKyAgICAgICAgdXBkYXRlR2VvbWV0cmllcygpOworCisgICAgICAgIGludCBuZXdWYWx1ZSA9ICh3eCAqIG1fem9vbUZhY3RvcikgLSBmb2N1c1g7CisKKyAgICAgICAgaG9yaXpvbnRhbFNjcm9sbEJhcigpLT5zZXRWYWx1ZShuZXdWYWx1ZSk7CisgICAgfQorCisgICAgdmlld3BvcnQoKS0+dXBkYXRlKCk7CisvLyAgICBzY3JvbGxEaXJ0eVJlZ2lvbihkeCwgMCk7CisvLyAgICB2aWV3cG9ydCgpLT5zY3JvbGwoZHgsIDApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lVmlldzo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICogZXZlbnQpCit7CisgICAgUUFic3RyYWN0SXRlbVZpZXc6Om1vdXNlUHJlc3NFdmVudChldmVudCk7CisgICAgUU1vZGVsSW5kZXggaW5kZXggPSBpbmRleEF0KGV2ZW50LT5wb3MoKSk7CisgICAgaWYgKGluZGV4LmlzVmFsaWQoKSkKKyAgICB7CisgICAgICAgIHNldEN1cnJlbnRJbmRleChpbmRleCk7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lVmlldzo6bW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKiBldmVudCkKK3sKKyAgICAvLyBTaW5jZSB3ZSBhcmUgdHJhY2tpbmcgdGhlIG1vdXNlIHBvc2l0aW9uLCB3ZSByZWFsbHkgc2hvdWxkIHBhc3MgdGhlIGV2ZW50CisgICAgLy8gdG8gb3VyIGJhc2UgY2xhc3MsIFVuZm9ydHVuYXRlbHkgaXQgcmVhbGx5IHN1Y2tzIHVwIHBlcmZvcm1hbmNlLCBzbyBkb24ndCBkbyBpdCBmb3Igbm93LgorICAgIC8vUUFic3RyYWN0SXRlbVZpZXc6Om1vdXNlTW92ZUV2ZW50KGV2ZW50KTsKKworICAgIGlmIChldmVudC0+cG9zKCkueCgpID4gdmlld3BvcnQoKS0+d2lkdGgoKSAtIG1fbWFyZ2luKQorICAgIHsKKyAgICAgICAgLy8gVGhlIG1vdXNlIHBvc2l0aW9uIHdhcyB3aXRoaW4gbV9tYXJnaW4gb2YgdGhlIHZlcnRpY2FsIHNjcm9sbCBiYXIgKHVzZWQgZm9yIHpvb21pbmcpCisgICAgICAgIC8vIE1ha2UgdGhpcyBhIG51bGwgcG9pbnQgc28gdGhhdCB6b29taW5nIHdpbGwgaGFwcGVuIG9uIHRoZSBjZW50ZXIgb2YgdGhlIHRpbWVsaW5lCisgICAgICAgIC8vIHJhdGhlciB0aGFuIHRoZSB2ZXJ5IGVkZ2Ugd2hlcmUgdGhlIG1vdXNlIGN1cnNvciB3YXMgbGFzdCBzZWVuLgorICAgICAgICBtX21vdXNlUG9zaXRpb24gPSBRUG9pbnQoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbV9tb3VzZVBvc2l0aW9uID0gZXZlbnQtPnBvcygpOworICAgIH0KKyAgICBldmVudC0+YWNjZXB0KCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3Ojp1cGRhdGVHZW9tZXRyaWVzKCkKK3sKKyAgICB1aW50NjRfdCBkdXJhdGlvbiA9IG1fcmF3RW5kVGltZSAtIG1fcmF3U3RhcnRUaW1lOworICAgIGludCBoTWF4ID0gc2NhbGVEdXJhdGlvbkhvcml6b250YWxseShkdXJhdGlvbikgKyAyKm1fbWFyZ2luIC0gdmlld3BvcnQoKS0+d2lkdGgoKTsKKyAgICBob3Jpem9udGFsU2Nyb2xsQmFyKCktPnNldFJhbmdlKDAsIHFNYXgoMCwgaE1heCkpOworICAgIGhvcml6b250YWxTY3JvbGxCYXIoKS0+c2V0UGFnZVN0ZXAodmlld3BvcnQoKS0+d2lkdGgoKSk7CisgICAgaG9yaXpvbnRhbFNjcm9sbEJhcigpLT5zZXRTaW5nbGVTdGVwKDEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRUmVjdCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OnZpc3VhbFJlY3QoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdAoreworICAgIFFSZWN0RiByZWN0ZiA9IHZpZXdwb3J0UmVjdChpbmRleCk7CisgICAgcmV0dXJuIHJlY3RmLnRvUmVjdCgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRUmVjdEYgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3Ojp2aWV3cG9ydFJlY3QoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdAoreworICAgIFFSZWN0RiByZWN0ZiA9IGl0ZW1SZWN0KGluZGV4KTsKKyAgICBpZiAocmVjdGYuaXNWYWxpZCgpKQorICAgIHsKKyAgICAgICAgcmVjdGYubW92ZUxlZnQoIHJlY3RmLmxlZnQoKSAqIG1fem9vbUZhY3Rvcik7CisgICAgICAgIHJlY3RmLnNldFdpZHRoKCByZWN0Zi53aWR0aCgpICogbV96b29tRmFjdG9yKTsKKworICAgICAgICByZWN0Zi5hZGp1c3QoLWhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgIC1ob3Jpem9udGFsU2Nyb2xsQmFyKCktPnZhbHVlKCksIDApOworCisgICAgICAgIC8vIHRoZSBtYXJnaW4gaXMgYWRkZWQgbGFzdCBzbyB0aGF0IGl0IGlzIE5PVCBzY2FsZWQKKyAgICAgICAgcmVjdGYuYWRqdXN0KG1fbWFyZ2luLCAwLAorICAgICAgICAgICAgICAgICAgICAgbV9tYXJnaW4sIDApOworICAgIH0KKworICAgIHJldHVybiByZWN0ZjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OnNjcm9sbFRvKGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCwgU2Nyb2xsSGludCBoaW50LyogPSBFbnN1cmVWaXNpYmxlKi8pCit7CisgICAgaWYgKCFpbmRleC5pc1ZhbGlkKCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUVJlY3Qgdmlld1JlY3QgPSB2aWV3cG9ydCgpLT5yZWN0KCk7CisgICAgUVJlY3QgaXRlbVJlY3QgPSB2aXN1YWxSZWN0KGluZGV4KTsKKworICAgIGlmIChpdGVtUmVjdC5sZWZ0KCkgPCB2aWV3UmVjdC5sZWZ0KCkpCisgICAgeworICAgICAgICBob3Jpem9udGFsU2Nyb2xsQmFyKCktPnNldFZhbHVlKGhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKSArIGl0ZW1SZWN0LmNlbnRlcigpLngoKSAtIHZpZXdwb3J0KCktPndpZHRoKCkvMik7CisgICAgfQorICAgIGVsc2UgaWYgKGl0ZW1SZWN0LnJpZ2h0KCkgPiB2aWV3UmVjdC5yaWdodCgpKQorICAgIHsKKyAgICAgICAgaG9yaXpvbnRhbFNjcm9sbEJhcigpLT5zZXRWYWx1ZShob3Jpem9udGFsU2Nyb2xsQmFyKCktPnZhbHVlKCkgKyBpdGVtUmVjdC5jZW50ZXIoKS54KCkgLSB2aWV3cG9ydCgpLT53aWR0aCgpLzIpOworICAgIH0KKworICAgIGlmICghdmlld1JlY3QuY29udGFpbnMoaXRlbVJlY3QpKQorICAgIHsKKyAgICAgICAgZGVsZXRlUGl4bWFwKCk7CisgICAgfQorICAgIHZpZXdwb3J0KCktPnVwZGF0ZSgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRTW9kZWxJbmRleCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OmluZGV4QXQoY29uc3QgUVBvaW50ICZwb2ludCkgY29uc3QKK3sKKyAgICBpZiAobW9kZWwoKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKKworICAgIGZsb2F0IHd5ID0gKGZsb2F0KXBvaW50LnkoKTsKKworICAgIC8vIEVhcmx5IG91dCBpZiB0aGUgcG9pbnQgaXMgbm90IGluIHRoZSBhcmVhcyBjb3ZlcmVkIGJ5IHRpbWVsaW5lIGl0ZW1zCisgICAgYm9vbCBpblRocmVhZEFyZWEgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdGhyZWFkQXJlYS5zaXplKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3eSA+PSBtX3RocmVhZEFyZWFbaV0udG9wKCkgJiYgd3kgPD0gbV90aHJlYWRBcmVhW2ldLmJvdHRvbSgpKQorICAgICAgICB7CisgICAgICAgICAgICBpblRocmVhZEFyZWEgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5UaHJlYWRBcmVhID09IGZhbHNlKQorICAgIHsKKyAgICAgICAgLy8gcG9pbnQgaXMgb3V0c2lkZSB0aGUgYXJlYXMgdGhhdCB0aW1lbGluZSBpdGVtcyBhcmUgZHJhd24gdG8uCisgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworICAgIH0KKworICAgIC8vIFRyYW5zZm9ybSB0aGUgdmlldyBjb29yZGluYXRlcyBpbnRvIGNvbnRlbnQgd2lkZ2V0IGNvb3JkaW5hdGVzLgorICAgIGludCB4ID0gcG9pbnQueCgpIC0gbV9tYXJnaW4gKyBob3Jpem9udGFsU2Nyb2xsQmFyKCktPnZhbHVlKCk7CisgICAgZmxvYXQgd3ggPSAoZmxvYXQpeCAvIG1fem9vbUZhY3RvcjsKKworICAgIFFIYXNoSXRlcmF0b3I8aW50LCBRUmVjdEY+IGl0ZXIobV9yb3dUb1JlY3RNYXApOworICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKKyAgICB7CisgICAgICAgIGl0ZXIubmV4dCgpOworICAgICAgICBRUmVjdEYgdmFsdWUgPSBpdGVyLnZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZS5jb250YWlucyh3eCwgd3kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbW9kZWwoKS0+aW5kZXgoaXRlci5rZXkoKSwgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gUU1vZGVsSW5kZXgoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUVJlZ2lvbiB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6Oml0ZW1SZWdpb24oY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdAoreworICAgIGlmICghaW5kZXguaXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gUVJlZ2lvbigpOworCisgICAgcmV0dXJuIFFSZWdpb24odmlld3BvcnRSZWN0KGluZGV4KS50b1JlY3QoKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3OjpwYWludEV2ZW50KFFQYWludEV2ZW50ICpldmVudCkKK3sKKyAgICBRUGFpbnRlciBwYWludGVyKHZpZXdwb3J0KCkpOworICAgIHBhaW50KCZwYWludGVyLCBldmVudCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3OjpkcmF3QmFzZVRpbWVsaW5lcyhRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVJlY3QmIHJlY3QsIGNvbnN0IFFMaXN0PHVpbnQzMl90PiAmdGhyZWFkTGlzdCkKK3sKKyAgICBpbnQgbnVtVGhyZWFkcyA9IHRocmVhZExpc3QuY291bnQoKTsKKworICAgIHBhaW50ZXItPnNhdmUoKTsKKyAgICBRRm9udCBmb250ID0gcGFpbnRlci0+Zm9udCgpOworICAgIGludCBmb250SGVpZ2h0ID0gcU1pbigoaW50KShtX3RocmVhZEhlaWdodCAqIDAuMyksIGZvbnQucG9pbnRTaXplKCkpOworICAgIGZvbnQuc2V0UG9pbnRTaXplKGZvbnRIZWlnaHQpOworICAgIHBhaW50ZXItPnNldEZvbnQoZm9udCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykKKyAgICB7CisgICAgICAgIGludCB0aHJlYWRUb3AgPSAoaSptX3RocmVhZEhlaWdodCk7CisKKyAgICAgICAgcGFpbnRlci0+ZHJhd1RleHQoMCwgdGhyZWFkVG9wICsgZm9udEhlaWdodCwgUVN0cmluZygiVGhyZWFkICUxIikuYXJnKHRocmVhZExpc3RbaV0pKTsKKworICAgICAgICAvLyBkcmF3IHRoZSB0aW1lbGluZSBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgdGhyZWFkJ3MgYXJlYQorICAgICAgICBpbnQgbGluZVN0YXJ0ID0gbV9tYXJnaW4gLSBob3Jpem9udGFsT2Zmc2V0KCk7CisgICAgICAgIGludCBsaW5lRW5kID0gbGluZVN0YXJ0ICsgc2NhbGVEdXJhdGlvbkhvcml6b250YWxseShtX2xpbmVMZW5ndGgpOworICAgICAgICBpbnQgbGluZVkgPSB0aHJlYWRUb3AgKyBtX3RocmVhZEhlaWdodC8yOworICAgICAgICBwYWludGVyLT5kcmF3TGluZShsaW5lU3RhcnQsIGxpbmVZLCBsaW5lRW5kLCBsaW5lWSk7CisgICAgfQorICAgIHBhaW50ZXItPnJlc3RvcmUoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUUxpc3Q8dWludDMyX3Q+IHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lVmlldzo6Z2V0TW9kZWxUaHJlYWRMaXN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90aHJlYWRJZExpc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3OjpwYWludChRUGFpbnRlciAqcGFpbnRlciwgUVBhaW50RXZlbnQgKmV2ZW50KQoreworICAgIG1fdGhyZWFkSGVpZ2h0ID0gZXZlbnQtPnJlY3QoKS5oZWlnaHQoKTsKKyAgICBpZiAobV90aHJlYWRJZExpc3QuY291bnQoKSA+IDApCisgICAgeworICAgICAgICBtX3RocmVhZEhlaWdodCAvPSBtX3RocmVhZElkTGlzdC5jb3VudCgpOworICAgIH0KKworICAgIGludCBhcnJvd0hlaWdodCA9IDEyOworICAgIGludCBhcnJvd1RvcCA9IDI7CisgICAgaW50IGFycm93SGFsZldpZHRoID0gNDsKKworICAgIFFQb2x5Z29uIHRyaWFuZ2xlKDMpOworICAgIHRyaWFuZ2xlLnNldFBvaW50KDAsIDAsIGFycm93VG9wKTsKKyAgICB0cmlhbmdsZS5zZXRQb2ludCgxLCAtYXJyb3dIYWxmV2lkdGgsIGFycm93VG9wK2Fycm93SGVpZ2h0KTsKKyAgICB0cmlhbmdsZS5zZXRQb2ludCgyLCBhcnJvd0hhbGZXaWR0aCwgYXJyb3dUb3ArYXJyb3dIZWlnaHQpOworCisgICAgUUxpc3Q8dWludDMyX3Q+IHRocmVhZExpc3QgPSBnZXRNb2RlbFRocmVhZExpc3QoKTsKKworICAgIGNhbGN1bGF0ZVJlY3RzSWZOZWNlc3NhcnkoKTsKKworICAgIGlmIChtX3BQaXhtYXAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBwaXhtYXBIZWlnaHQgPSBldmVudC0+cmVjdCgpLmhlaWdodCgpOworICAgICAgICBpbnQgcGl4bWFwV2lkdGggPSBldmVudC0+cmVjdCgpLndpZHRoKCk7CisKKyAgICAgICAgbV9wUGl4bWFwID0gbmV3IFFQaXhtYXAocGl4bWFwV2lkdGgsIHBpeG1hcEhlaWdodCk7CisKKyAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBtX3RocmVhZElkTGlzdC5zaXplKCk7IHQrKykKKyAgICAgICAgeworICAgICAgICAgICAgbV90aHJlYWRNYXNrW21fdGhyZWFkSWRMaXN0W3RdXSA9IFFWZWN0b3I8aW50PihwaXhtYXBXaWR0aCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBRUGFpbnRlciBwaXhtYXBQYWludGVyKG1fcFBpeG1hcCk7CisKKyAgICAgICAgLy8gZmlsbCBlbnRpcmUgYmFja2dyb3VuZCB3aXRoIGJhY2tncm91bmQgY29sb3IKKyAgICAgICAgcGl4bWFwUGFpbnRlci5maWxsUmVjdChldmVudC0+cmVjdCgpLCBtX2JhY2tncm91bmQpOworICAgICAgICBkcmF3QmFzZVRpbWVsaW5lcygmcGl4bWFwUGFpbnRlciwgZXZlbnQtPnJlY3QoKSwgdGhyZWFkTGlzdCk7CisKKyAgICAgICAgaWYgKG1vZGVsKCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG51bVJvd3MgPSBtb2RlbCgpLT5yb3dDb3VudCgpOworCisgICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IG51bVJvd3M7IHIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBRTW9kZWxJbmRleCBpbmRleCA9IG1vZGVsKCktPmluZGV4KHIsIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsOjpDb2x1bW5fRW50cnlwb2ludE5hbWUpOworCisgICAgICAgICAgICAgICAgZHJhd1RpbWVsaW5lSXRlbSgmcGl4bWFwUGFpbnRlciwgaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBhaW50ZXItPmRyYXdQaXhtYXAoZXZlbnQtPnJlY3QoKSwgKm1fcFBpeG1hcCwgbV9wUGl4bWFwLT5yZWN0KCkpOworCisgICAgaWYgKG1vZGVsKCkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBkcmF3IGN1cnJlbnQgYXBpIGNhbGwgbWFya2VyCisgICAgaW50IGN1cnJlbnRJbmRleFJvdyA9IGN1cnJlbnRJbmRleCgpLnJvdygpOworICAgIGlmIChjdXJyZW50SW5kZXhSb3cgPj0gMCkKKyAgICB7CisgICAgICAgIC8vIE92ZXJsYXkgYSBibGFjayByZWN0YW5nbGUgYXJvdW5kIHRoZSBjdXJyZW50IGl0ZW0uCisgICAgICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyByZWN0cyBhcmUgZHJhd24gYXMgb3V0bGluZXMsCisgICAgICAgIC8vIHNlZSBoZXJlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xcmVjdGYuaHRtbCNyZW5kZXJpbmcKKyAgICAgICAgaW50IHBlbldpZHRoID0gMjsKKyAgICAgICAgaW50IHBlbldpZHRoSGFsZiA9IDE7CisgICAgICAgIFFQZW4gYmxhY2tQZW4oUXQ6OmJsYWNrKTsKKyAgICAgICAgYmxhY2tQZW4uc2V0V2lkdGgocGVuV2lkdGgpOworICAgICAgICBibGFja1Blbi5zZXRKb2luU3R5bGUoUXQ6Ok1pdGVySm9pbik7CisgICAgICAgIHBhaW50ZXItPnNldFBlbihibGFja1Blbik7CisKKyAgICAgICAgLy8gRG9uJ3QgZmlsbCB0aGUgcmVjdGFuZ2xlCisgICAgICAgIHBhaW50ZXItPnNldEJydXNoKFF0OjpOb0JydXNoKTsKKworICAgICAgICBRTW9kZWxJbmRleCBpbmRleCA9IG1vZGVsKCktPmluZGV4KGN1cnJlbnRJbmRleFJvdywgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTW9kZWw6OkNvbHVtbl9FbnRyeXBvaW50TmFtZSk7CisgICAgICAgIFFSZWN0RiByZWN0ID0gdmlzdWFsUmVjdChpbmRleCk7CisgICAgICAgIHJlY3QuYWRqdXN0KC1wZW5XaWR0aEhhbGYsIC1wZW5XaWR0aEhhbGYsIHBlbldpZHRoSGFsZiwgcGVuV2lkdGhIYWxmKTsKKyAgICAgICAgcGFpbnRlci0+ZHJhd1JlY3QocmVjdCk7CisKKyAgICAgICAgLy8gRHJhdyBtYXJrZXIgdW5kZXJuZWF0aCB0aGUgY3VycmVudCByZWN0CisgICAgICAgIHBhaW50ZXItPnNhdmUoKTsKKyAgICAgICAgUVBhaW50ZXI6OlJlbmRlckhpbnRzIGhpbnRzID0gcGFpbnRlci0+cmVuZGVySGludHMoKTsKKyAgICAgICAgcGFpbnRlci0+c2V0UmVuZGVySGludHMoUVBhaW50ZXI6OkFudGlhbGlhc2luZyk7CisgICAgICAgIHBhaW50ZXItPnNldFBlbihtX3RyaWFuZ2xlUGVuKTsKKyAgICAgICAgcGFpbnRlci0+c2V0QnJ1c2goUUNvbG9yKFF0Ojp5ZWxsb3cpKTsKKyAgICAgICAgcGFpbnRlci0+dHJhbnNsYXRlKHJlY3QuY2VudGVyKCkueCgpLCByZWN0LmJvdHRvbSgpKTsKKyAgICAgICAgcGFpbnRlci0+ZHJhd1BvbHlnb24odHJpYW5nbGUpOworICAgICAgICBwYWludGVyLT5zZXRSZW5kZXJIaW50cyhoaW50cywgZmFsc2UpOworICAgICAgICBwYWludGVyLT5yZXN0b3JlKCk7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmbG9hdCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OnNjYWxlRHVyYXRpb25Ib3Jpem9udGFsbHkodWludDY0X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgZmxvYXQgc2NhbGVkID0gdTY0VG9GbG9hdCh2YWx1ZSkgKiBtX3pvb21GYWN0b3I7CisKKyAgICByZXR1cm4gc2NhbGVkOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmbG9hdCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXc6OnNjYWxlUG9zaXRpb25Ib3Jpem9udGFsbHkodWludDY0X3QgdmFsdWUpIGNvbnN0Cit7CisgICAgdWludDY0X3Qgc2hpZnRlZFZhbHVlID0gdmFsdWUgLSBtX3Jhd1N0YXJ0VGltZTsKKyAgICBmbG9hdCBvZmZzZXQgPSBzY2FsZUR1cmF0aW9uSG9yaXpvbnRhbGx5KHNoaWZ0ZWRWYWx1ZSk7CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lVmlldzo6ZHJhd1RpbWVsaW5lSXRlbShRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KQoreworICAgIFFSZWN0RiByZWN0ID0gdmlld3BvcnRSZWN0KGluZGV4KTsKKworICAgIC8vIGRvbid0IGRyYXcgaWYgdGhlIHJlY3QgaXMgb3V0c2lkZSB0aGUgdmlld3BvcnQKKyAgICBpZiAoIXJlY3QuaXNWYWxpZCgpIHx8CisgICAgICAgIHJlY3QuYm90dG9tKCkgPCAwIHx8CisgICAgICAgIHJlY3QueSgpID4gdmlld3BvcnQoKS0+aGVpZ2h0KCkgfHwKKyAgICAgICAgcmVjdC54KCkgPiB2aWV3cG9ydCgpLT53aWR0aCgpIHx8CisgICAgICAgIHJlY3QucmlnaHQoKSA8IDApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUVN0eWxlT3B0aW9uVmlld0l0ZW0gb3B0aW9uID0gdmlld09wdGlvbnMoKTsKKyAgICBvcHRpb24ucmVjdCA9IHJlY3QudG9SZWN0KCk7CisgICAgaWYgKHNlbGVjdGlvbk1vZGVsKCktPmlzU2VsZWN0ZWQoaW5kZXgpKQorICAgICAgICBvcHRpb24uc3RhdGUgfD0gUVN0eWxlOjpTdGF0ZV9TZWxlY3RlZDsKKyAgICBpZiAoY3VycmVudEluZGV4KCkgPT0gaW5kZXgpCisgICAgICAgIG9wdGlvbi5zdGF0ZSB8PSBRU3R5bGU6OlN0YXRlX0hhc0ZvY3VzOworCisgICAgLy8gY2hlY2sgbWFzayB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVtIHNob3VsZCBiZSBkcmF3biwgb3IgaWYgc29tZXRoaW5nIGhhcyBhbHJlYWR5IGNvdmVyZWQgaXQncyBwaXhlbHMKKyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIgPSAodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKilpbmRleC5pbnRlcm5hbFBvaW50ZXIoKTsKKyAgICBRVmVjdG9yPGludD4mIG1hc2sgPSBtX3RocmVhZE1hc2tbcEhlYWRlci0+dGhyZWFkX2lkXTsKKyAgICBib29sIGRyYXdJdGVtID0gZmFsc2U7CisgICAgaW50IHggPSBvcHRpb24ucmVjdC54KCk7CisgICAgaW50IHJpZ2h0ID0gcU1pbiggcU1heCh4LCBvcHRpb24ucmVjdC5yaWdodCgpKSwgdmlld3BvcnQoKS0+d2lkdGgoKS0xKTsKKyAgICBmb3IgKGludCBwaXhlbCA9IHFNYXgoMCwgeCk7IHBpeGVsIDw9IHJpZ2h0OyBwaXhlbCsrKQorICAgIHsKKyAgICAgICAgaWYgKG1hc2tbcGl4ZWxdID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRyYXdJdGVtID0gdHJ1ZTsKKyAgICAgICAgICAgIG1hc2tbcGl4ZWxdID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRyYXcgaXRlbSBpZiBpdCBzaG91bGQgYmUgdmlzaWJsZQorICAgIGlmIChkcmF3SXRlbSkKKyAgICB7CisgICAgICAgIGl0ZW1EZWxlZ2F0ZSgpLT5wYWludChwYWludGVyLCBvcHRpb24sIGluZGV4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3F0aW1lbGluZXZpZXcuaCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcXRpbWVsaW5ldmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWYxNzYKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3F0aW1lbGluZXZpZXcuaApAQCAtMCwwICsxLDE3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVktUUkFDRVZJRVdFUl9RVElNRUxJTkVWSUVXX0gKKyNkZWZpbmUgVktUUkFDRVZJRVdFUl9RVElNRUxJTkVWSUVXX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCisKKyNpbmNsdWRlIDxRV2lkZ2V0PgorCitRVF9CRUdJTl9OQU1FU1BBQ0UKK2NsYXNzIFFQYWludGVyOworY2xhc3MgUVBhaW50RXZlbnQ7CitRVF9FTkRfTkFNRVNQQUNFCisKKyNpbmNsdWRlIDxRQWJzdHJhY3RJdGVtVmlldz4KKyNpbmNsdWRlIDxRQnJ1c2g+CisjaW5jbHVkZSA8UUZvbnQ+CisjaW5jbHVkZSA8UVBlbj4KKyNpbmNsdWRlIDxRU2Nyb2xsQmFyPgorCitjbGFzcyB2a3RyYWNldmlld2VyX1FUaW1lbGluZUl0ZW1EZWxlZ2F0ZSA6IHB1YmxpYyBRQWJzdHJhY3RJdGVtRGVsZWdhdGUKK3sKKyAgICBRX09CSkVDVAorcHVibGljOgorICAgIHZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lSXRlbURlbGVnYXRlKFFPYmplY3QgKnBhcmVudCA9IDApOworICAgIHZpcnR1YWwgfnZrdHJhY2V2aWV3ZXJfUVRpbWVsaW5lSXRlbURlbGVnYXRlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIgKnBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvblZpZXdJdGVtICZvcHRpb24sIGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBRU2l6ZSBzaXplSGludChjb25zdCBRU3R5bGVPcHRpb25WaWV3SXRlbSAmb3B0aW9uLCBjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgpIGNvbnN0OworfTsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIFFUaW1lbGluZVZpZXcgaGFzIGJlbmVmaXRlZCBncmVhdGx5IGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOgorLy8gaHR0cDovL3d3dy5pbmZvcm1pdC5jb20vYXJ0aWNsZXMvYXJ0aWNsZS5hc3B4P3A9MTYxMzU0OAorY2xhc3Mgdmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3IDogcHVibGljIFFBYnN0cmFjdEl0ZW1WaWV3Cit7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBleHBsaWNpdCB2a3RyYWNldmlld2VyX1FUaW1lbGluZVZpZXcoUVdpZGdldCAqcGFyZW50ID0gMCk7CisgICAgdmlydHVhbCB+dmt0cmFjZXZpZXdlcl9RVGltZWxpbmVWaWV3KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TW9kZWwoUUFic3RyYWN0SXRlbU1vZGVsKiBwTW9kZWwpOworCisgICAgLy8gQmVnaW4gcHVibGljIHZpcnR1YWwgZnVuY3Rpb25zIG9mIFFBYnN0cmFjdEl0ZW1WaWV3CisgICAgdmlydHVhbCBRUmVjdCB2aXN1YWxSZWN0KGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNjcm9sbFRvKGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCwgU2Nyb2xsSGludCBoaW50ID0gRW5zdXJlVmlzaWJsZSk7CisgICAgdmlydHVhbCBRTW9kZWxJbmRleCBpbmRleEF0KGNvbnN0IFFQb2ludCAmcG9pbnQpIGNvbnN0OworICAgIC8vIEVuZCBwdWJsaWMgdmlydHVhbCBmdW5jdGlvbnMgb2YgUUFic3RyYWN0SXRlbVZpZXcKKworICAgIFFMaXN0PHVpbnQzMl90PiBnZXRNb2RlbFRocmVhZExpc3QoKSBjb25zdDsKKyAgICBRUmVjdEYgaXRlbVJlY3QoY29uc3QgUU1vZGVsSW5kZXggJml0ZW0pIGNvbnN0OworICAgIGZsb2F0IGdldE1heEl0ZW1EdXJhdGlvbigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9tYXhJdGVtRHVyYXRpb247CisgICAgfQorCisgICAgdm9pZCBkZWxldGVQaXhtYXAoKQorICAgIHsKKyAgICAgICAgaWYgKG1fcFBpeG1hcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgbV9wUGl4bWFwOworICAgICAgICAgICAgbV9wUGl4bWFwID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBRQnJ1c2ggbV9iYWNrZ3JvdW5kOworICAgIFFQZW4gbV90cmlhbmdsZVBlbjsKKyAgICBRUGVuIG1fdGV4dFBlbjsKKyAgICBRRm9udCBtX3RleHRGb250OworCisgICAgLy8gbmV3IG1lbWJlcnMKKyAgICBRTGlzdDx1aW50MzJfdD4gbV90aHJlYWRJZExpc3Q7CisgICAgUUhhc2g8IHVpbnQzMl90LCBRVmVjdG9yPGludD4gPiBtX3RocmVhZE1hc2s7CisgICAgUUxpc3Q8UVJlY3Q+IG1fdGhyZWFkQXJlYTsKKyAgICBmbG9hdCBtX21heEl0ZW1EdXJhdGlvbjsKKyAgICB1aW50NjRfdCBtX3Jhd1N0YXJ0VGltZTsKKyAgICB1aW50NjRfdCBtX3Jhd0VuZFRpbWU7CisgICAgdWludDY0X3QgbV9saW5lTGVuZ3RoOworICAgIGZsb2F0IG1fZHVyYXRpb25Ub1ZpZXdwb3J0U2NhbGU7CisgICAgZmxvYXQgbV96b29tRmFjdG9yOworICAgIGZsb2F0IG1fbWF4Wm9vbTsKKyAgICBpbnQgbV90aHJlYWRIZWlnaHQ7CisgICAgUUhhc2g8aW50LCBRUmVjdEY+IG1fcm93VG9SZWN0TWFwOworICAgIGJvb2wgbV9oYXNoSXNEaXJ0eTsKKyAgICBpbnQgbV9tYXJnaW47CisgICAgaW50IG1fc2Nyb2xsQmFyV2lkdGg7CisgICAgUVBvaW50IG1fbW91c2VQb3NpdGlvbjsKKworICAgIFFQaXhtYXAgKm1fcFBpeG1hcDsKKyAgICB2a3RyYWNldmlld2VyX1FUaW1lbGluZUl0ZW1EZWxlZ2F0ZSBtX2l0ZW1EZWxlZ2F0ZTsKKworICAgIHZvaWQgY2FsY3VsYXRlUmVjdHNJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgZHJhd0Jhc2VUaW1lbGluZXMoUVBhaW50ZXIgKnBhaW50ZXIsIGNvbnN0IFFSZWN0ICZyZWN0LCBjb25zdCBRTGlzdDx1aW50MzJfdD4gJnRocmVhZExpc3QpOworICAgIHZvaWQgZHJhd1RpbWVsaW5lSXRlbShRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KTsKKworICAgIFFSZWN0RiB2aWV3cG9ydFJlY3QoY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdDsKKyAgICBmbG9hdCBzY2FsZUR1cmF0aW9uSG9yaXpvbnRhbGx5KHVpbnQ2NF90IHZhbHVlKSBjb25zdDsKKyAgICBmbG9hdCBzY2FsZVBvc2l0aW9uSG9yaXpvbnRhbGx5KHVpbnQ2NF90IHZhbHVlKSBjb25zdDsKKworICAgIC8vIEJlZ2luIFByaXZhdGUuLi4KKyAgICB2aXJ0dWFsIFFSZWdpb24gaXRlbVJlZ2lvbihjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgpIGNvbnN0OworICAgIC8vIEVuZCBwcml2YXRlLi4uCisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQgKmV2ZW50KTsKKyAgICB2b2lkIHBhaW50KFFQYWludGVyICpwYWludGVyLCBRUGFpbnRFdmVudCAqZXZlbnQpOworCisgICAgdmlydHVhbCBib29sIGV2ZW50KFFFdmVudCAqIGUpOworICAgIHZpcnR1YWwgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQgKmV2ZW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICogZXZlbnQpOworICAgIHZpcnR1YWwgdm9pZCBtb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCAqIGV2ZW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2Nyb2xsQ29udGVudHNCeShpbnQgZHgsIGludCBkeSk7CisKKyAgICAvLyBCZWdpbiBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgb2YgUUFic3RyYWN0SXRlbVZpZXcKKyAgICB2aXJ0dWFsIFFNb2RlbEluZGV4IG1vdmVDdXJzb3IoQ3Vyc29yQWN0aW9uIGN1cnNvckFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXQ6OktleWJvYXJkTW9kaWZpZXJzIG1vZGlmaWVycykKKyAgICB7CisgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IGhvcml6b250YWxPZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBpbnQgdmVydGljYWxPZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcnRpY2FsU2Nyb2xsQmFyKCktPnZhbHVlKCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzSW5kZXhIaWRkZW4oY29uc3QgUU1vZGVsSW5kZXggJmluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3Rpb24oY29uc3QgUVJlY3QgJnJlY3QsIFFJdGVtU2VsZWN0aW9uTW9kZWw6OlNlbGVjdGlvbkZsYWdzIGNvbW1hbmQpIHt9CisgICAgdmlydHVhbCBRUmVnaW9uIHZpc3VhbFJlZ2lvbkZvclNlbGVjdGlvbihjb25zdCBRSXRlbVNlbGVjdGlvbiAmc2VsZWN0aW9uKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFFSZWdpb24oKTsKKyAgICB9CisgICAgLy8gRW5kIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyBvZiBRQWJzdHJhY3RJdGVtVmlldworCitwcm90ZWN0ZWQgc2xvdHM6CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUdlb21ldHJpZXMoKTsKKworc2lnbmFsczoKKworcHVibGljCitzbG90czoKK307CisKKyNlbmRpZiAvLyBWS1RSQUNFVklFV0VSX1FUSU1FTElORVZJRVdfSApkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xdHJhY2VmaWxlbG9hZGVyLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcXRyYWNlZmlsZWxvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4MGQxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcXRyYWNlZmlsZWxvYWRlci5jcHAKQEAgLTAsMCArMSwyODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9xdHJhY2VmaWxlbG9hZGVyLmgiCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9jb250cm9sbGVyX2ZhY3RvcnkuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCIKK30KKwordmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTG9hZGVyOjp2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVMb2FkZXIoKQorICAgIDogUU9iamVjdChOVUxMKQoreworICAgIHFSZWdpc3Rlck1ldGFUeXBlPHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvPigidmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8iKTsKK30KKwordmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTG9hZGVyOjp+dmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTG9hZGVyKCkKK3sKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVMb2FkZXI6OmxvYWRUcmFjZUZpbGUoY29uc3QgUVN0cmluZyYgZmlsZW5hbWUpCit7CisgICAgLy8gb3BlbiB0cmFjZSBmaWxlIGFuZCByZWFkIGluIGhlYWRlcgorICAgIG1lbXNldCgmbV90cmFjZUZpbGVJbmZvLCAwLCBzaXplb2Yodmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8pKTsKKyAgICBtX3RyYWNlRmlsZUluZm8ucEZpbGUgPSBmb3BlbihmaWxlbmFtZS50b1N0ZFN0cmluZygpLmNfc3RyKCksICJyYiIpOworCisgICAgYm9vbCBiT3BlbmVkID0gKG1fdHJhY2VGaWxlSW5mby5wRmlsZSAhPSBOVUxMKTsKKyAgICBpZiAoIWJPcGVuZWQpCisgICAgeworICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiBmaWxlLiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtX3RyYWNlRmlsZUluZm8uZmlsZW5hbWUgPSB2a3RyYWNlX2FsbG9jYXRlX2FuZF9jb3B5KGZpbGVuYW1lLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGlmIChwb3B1bGF0ZV90cmFjZV9maWxlX2luZm8oJm1fdHJhY2VGaWxlSW5mbykgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwb3B1bGF0ZSB0cmFjZSBmaWxlIGluZm8gZnJvbSBmaWxlLiIpOworICAgICAgICAgICAgYk9wZW5lZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRyYWNlIGZpbGUgdmVyc2lvbiBpcyBzdXBwb3J0ZWQKKyAgICAgICAgICAgIGlmIChtX3RyYWNlRmlsZUluZm8uaGVhZGVyLnRyYWNlX2ZpbGVfdmVyc2lvbiA8IFZLVFJBQ0VfVFJBQ0VfRklMRV9WRVJTSU9OX01JTklNVU1fQ09NUEFUSUJMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsIFFTdHJpbmcoIlRyYWNlIGZpbGUgdmVyc2lvbiAlMSBpcyBvbGRlciB0aGFuIG1pbmltdW0gY29tcGF0aWJsZSB2ZXJzaW9uICglMikuXG5Zb3UnbGwgbmVlZCB0byBtYWtlIGEgbmV3IHRyYWNlIGZpbGUsIG9yIHVzZSBhbiBvbGRlciByZXBsYXllci4iKS5hcmcobV90cmFjZUZpbGVJbmZvLmhlYWRlci50cmFjZV9maWxlX3ZlcnNpb24pLmFyZyhWS1RSQUNFX1RSQUNFX0ZJTEVfVkVSU0lPTl9NSU5JTVVNX0NPTVBBVElCTEUpKTsKKyAgICAgICAgICAgICAgICBiT3BlbmVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBVU0VfU1RBVElDX0NPTlRST0xMRVJfTElCUkFSWQorICAgICAgICAgICAgbV9wQ29udHJvbGxlciA9IHZ0dkNyZWF0ZVFDb250cm9sbGVyKCk7CisgICAgICAgICAgICBpZiAoYk9wZW5lZCkKKyNlbHNlCisgICAgICAgICAgICBpZiAoIWxvYWRfY29udHJvbGxlcnMoJm1fdHJhY2VGaWxlSW5mbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGxvYWQgbmVjZXNzYXJ5IGRlYnVnIGNvbnRyb2xsZXJzLiIpOworICAgICAgICAgICAgICAgIGJPcGVuZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGJPcGVuZWQpCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0KG1fcENvbnRyb2xsZXIsIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgY29uc3QgUVN0cmluZyYpKSwgdGhpcywgU0lHTkFMKE91dHB1dE1lc3NhZ2UoVmt0cmFjZUxvZ0xldmVsLCBjb25zdCBRU3RyaW5nJikpKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0KG1fcENvbnRyb2xsZXIsIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgdWludDY0X3QsIGNvbnN0IFFTdHJpbmcmKSksIHRoaXMsIFNJR05BTChPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCwgdWludDY0X3QsIGNvbnN0IFFTdHJpbmcmKSkpOworCisgICAgICAgICAgICAgICAgLy8gaW50ZXJwcmV0IHRoZSB0cmFjZSBmaWxlIHBhY2tldHMKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgbV90cmFjZUZpbGVJbmZvLnBhY2tldENvdW50OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfcGFja2V0X29mZnNldHMqIHBPZmZzZXRzID0gJm1fdHJhY2VGaWxlSW5mby5wUGFja2V0T2Zmc2V0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwT2Zmc2V0cy0+cEhlYWRlci0+cGFja2V0X2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01FU1NBR0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90cmFjZUZpbGVJbmZvLnBQYWNrZXRPZmZzZXRzW2ldLnBIZWFkZXIgPSB2a3RyYWNlX2ludGVycHJldF9ib2R5X2FzX3RyYWNlX3BhY2tldF9tZXNzYWdlKHBPZmZzZXRzLT5wSGVhZGVyKS0+cEhlYWRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktUUkFDRV9UUElfTUFSS0VSX0NIRUNLUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfQk9VTkRBUlk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfQkVHSU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX01BUktFUl9BUElfR1JPVVBfRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9NQVJLRVJfVEVSTUlOQVRFX1BST0NFU1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gcHJvY2Vzc2luZyBjb2RlIGZvciBhbGwgdGhlIGFib3ZlIGNhc2VzCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciA9IG1fcENvbnRyb2xsZXItPkludGVycHJldFRyYWNlUGFja2V0KHBPZmZzZXRzLT5wSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEhlYWRlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsIFFTdHJpbmcoIlVucmVjb2duaXplZCBwYWNrZXQgdHlwZTogJTEiKS5hcmcocE9mZnNldHMtPnBIZWFkZXItPnBhY2tldF9pZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHNbaV0ucEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3RyYWNlRmlsZUluZm8ucFBhY2tldE9mZnNldHNbaV0ucEhlYWRlciA9IHBIZWFkZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBicmVhayBmcm9tIGxvb3AgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJPcGVuZWQgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgVVNFX1NUQVRJQ19DT05UUk9MTEVSX0xJQlJBUlkKKyAgICAgICAgICAgIHZ0dkRlbGV0ZVFDb250cm9sbGVyKCZtX3BDb250cm9sbGVyKTsKKyNlbHNlCisgICAgICAgICAgICBtX2NvbnRyb2xsZXJGYWN0b3J5LlVubG9hZCgmbV9wQ29udHJvbGxlcik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGNsb3NlIHRoZSB0cmFjZSBmaWxlIHlldC4KKyAgICAgICAgLy8gSSB0aGluayB3ZSB3YW50IHRvIGtlZXAgaXQgb3BlbiBzbyB0aGF0IHdlIGNhbiBkeW5hbWljYWxseSByZWFkIGZyb20gaXQuCisgICAgICAgIC8vIEJVVCB3ZSBkZWZpbml0ZWx5IGRvbid0IHdhbnQgaXQgdG8gZ2V0IGxvY2tlZCBvcGVuLCBzbyB3ZSBuZWVkIGEgc21hcnQKKyAgICAgICAgLy8gd2F5IHRvIG9wZW4gLyBjbG9zZSBmcm9tIGl0IHdoZW4gcmVhZGluZy4KKyAgICAgICAgZmNsb3NlKG1fdHJhY2VGaWxlSW5mby5wRmlsZSk7CisgICAgICAgIG1fdHJhY2VGaWxlSW5mby5wRmlsZSA9IE5VTEw7CisgICAgfQorCisgICAgLy8gcG9wdWxhdGUgdGhlIFVJIGJhc2VkIG9uIHRyYWNlIGZpbGUgaW5mbworICAgIGVtaXQgVHJhY2VGaWxlTG9hZGVkKGJPcGVuZWQsIG1fdHJhY2VGaWxlSW5mbywgbV9jb250cm9sbGVyRmlsZW5hbWUpOworCisgICAgZW1pdCBGaW5pc2hlZCgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZUxvYWRlcjo6bG9hZF9jb250cm9sbGVycyh2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyogcFRyYWNlRmlsZUluZm8pCit7CisgICAgaWYgKHBUcmFjZUZpbGVJbmZvLT5oZWFkZXIudHJhY2VyX2NvdW50ID09IDApCisgICAgeworICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfRVJST1IsICJObyBBUEkgc3BlY2lmaWVkIGluIHRyYWNlZmlsZSBmb3IgcmVwbGF5aW5nLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwVHJhY2VGaWxlSW5mby0+aGVhZGVyLnRyYWNlcl9jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgdWludDhfdCB0cmFjZXJJZCA9IHBUcmFjZUZpbGVJbmZvLT5oZWFkZXIudHJhY2VyX2lkX2FycmF5W2ldLmlkOworCisgICAgICAgIGNvbnN0IFZLVFJBQ0VfVFJBQ0VSX1JFUExBWUVSX0lORk8qIHBSZXBsYXllckluZm8gPSAmKGdzX3RyYWNlclJlcGxheWVySW5mb1t0cmFjZXJJZF0pOworCisgICAgICAgIGlmIChwUmVwbGF5ZXJJbmZvLT50cmFjZXJJZCAhPSB0cmFjZXJJZCkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCBRU3RyaW5nKCJSZXBsYXllciBpbmZvIGZvciBUcmFjZXJJZCAoJTEpIGZhaWxlZCBjb25zaXN0ZW5jeSBjaGVjay4iKS5hcmcodHJhY2VySWQpKTsKKyAgICAgICAgICAgIGFzc2VydCghIlRyYWNlcklkIGluIFZLVFJBQ0VfVFJBQ0VSX1JFUExBWUVSX0lORk8gZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCB0cmFjZXJJZC4gVGhlIGFycmF5IG5lZWRzIHRvIGJlIGNvcnJlY3RlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJsZW4ocFJlcGxheWVySW5mby0+ZGVidWdnZXJMaWJyYXJ5bmFtZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSGF2ZSBvdXIgZmFjdG9yeSBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBjb250cm9sbGVyCisgICAgICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfVkVSQk9TRSwgUVN0cmluZygiTG9hZGluZyBjb250cm9sbGVyOiAlMSIpLmFyZyhwUmVwbGF5ZXJJbmZvLT5kZWJ1Z2dlckxpYnJhcnluYW1lKSk7CisKKyAgICAgICAgICAgIG1fcENvbnRyb2xsZXIgPSBtX2NvbnRyb2xsZXJGYWN0b3J5LkxvYWQocFJlcGxheWVySW5mby0+ZGVidWdnZXJMaWJyYXJ5bmFtZSk7CisKKyAgICAgICAgICAgIGlmIChtX3BDb250cm9sbGVyICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9jb250cm9sbGVyRmlsZW5hbWUgPSBRU3RyaW5nKHBSZXBsYXllckluZm8tPmRlYnVnZ2VyTGlicmFyeW5hbWUpOworICAgICAgICAgICAgICAgIC8vIE9ubHkgb25lIGNvbnRyb2xsZXIgbmVlZHMgdG8gYmUgbG9hZGVkLCBzbyBicmVhayBmcm9tIGxvb3AKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjb250cm9sbGVyIGZhaWxlZCB0byBiZSBjcmVhdGVkCisgICAgICAgICAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCBRU3RyaW5nKCJVbmFibGUgdG8gbG9hZCBjb250cm9sbGVyIGZvciBUcmFjZXJJZCAlMS4iKS5hcmcodHJhY2VySWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtX3BDb250cm9sbGVyICE9IE5VTEw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Jvb2wgdmt0cmFjZXZpZXdlcl9RVHJhY2VGaWxlTG9hZGVyOjpwb3B1bGF0ZV90cmFjZV9maWxlX2luZm8odmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8qIHBUcmFjZUZpbGVJbmZvKQoreworICAgIGFzc2VydChwVHJhY2VGaWxlSW5mbyAhPSBOVUxMKTsKKyAgICBhc3NlcnQocFRyYWNlRmlsZUluZm8tPnBGaWxlICE9IE5VTEwpOworCisgICAgLy8gcmVhZCB0cmFjZSBmaWxlIGhlYWRlcgorICAgIGlmICgxICE9IGZyZWFkKCYocFRyYWNlRmlsZUluZm8tPmhlYWRlciksIHNpemVvZih2a3RyYWNlX3RyYWNlX2ZpbGVfaGVhZGVyKSwgMSwgcFRyYWNlRmlsZUluZm8tPnBGaWxlKSkKKyAgICB7CisgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZWFkIGhlYWRlciBmcm9tIGZpbGUuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGaW5kIG91dCBob3cgbWFueSB0cmFjZSBwYWNrZXRzIHRoZXJlIGFyZS4KKworICAgIC8vIFNlZWsgdG8gZmlyc3QgcGFja2V0CisgICAgbG9uZyBmaXJzdF9vZmZzZXQgPSBwVHJhY2VGaWxlSW5mby0+aGVhZGVyLmZpcnN0X3BhY2tldF9vZmZzZXQ7CisgICAgaW50IHNlZWtSZXN1bHQgPSBmc2VlayhwVHJhY2VGaWxlSW5mby0+cEZpbGUsIGZpcnN0X29mZnNldCwgU0VFS19TRVQpOworICAgIGlmIChzZWVrUmVzdWx0ICE9IDApCisgICAgeworICAgICAgICBlbWl0IE91dHB1dE1lc3NhZ2UoVktUUkFDRV9MT0dfV0FSTklORywgIkZhaWxlZCB0byBzZWVrIHRvIHRoZSBmaXJzdCBwYWNrZXQgb2Zmc2V0IGluIHRoZSB0cmFjZSBmaWxlLiIpOworICAgIH0KKworICAgIHVpbnQ2NF90IGZpbGVPZmZzZXQgPSBwVHJhY2VGaWxlSW5mby0+aGVhZGVyLmZpcnN0X3BhY2tldF9vZmZzZXQ7CisgICAgdWludDY0X3QgcGFja2V0U2l6ZSA9IDA7CisgICAgd2hpbGUoMSA9PSBmcmVhZCgmcGFja2V0U2l6ZSwgc2l6ZW9mKHVpbnQ2NF90KSwgMSwgcFRyYWNlRmlsZUluZm8tPnBGaWxlKSkKKyAgICB7CisgICAgICAgIC8vIHN1Y2Nlc3MhCisgICAgICAgIHBUcmFjZUZpbGVJbmZvLT5wYWNrZXRDb3VudCsrOworICAgICAgICBmaWxlT2Zmc2V0ICs9IHBhY2tldFNpemU7CisKKyAgICAgICAgZnNlZWsocFRyYWNlRmlsZUluZm8tPnBGaWxlLCBmaWxlT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgaWYgKHBUcmFjZUZpbGVJbmZvLT5wYWNrZXRDb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGZlcnJvcihwVHJhY2VGaWxlSW5mby0+cEZpbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlcnJvcigiRmlsZSBSZWFkIGVycm9yOiIpOworICAgICAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCAiVGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIHRyYWNlIGZpbGUuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZmVvZihwVHJhY2VGaWxlSW5mby0+cEZpbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19XQVJOSU5HLCAiUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaWxlLiIpOworICAgICAgICB9CisgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19XQVJOSU5HLCAiVGhlcmUgYXJlIG5vIHRyYWNlIHBhY2tldHMgaW4gdGhpcyB0cmFjZSBmaWxlLiIpOworICAgICAgICBwVHJhY2VGaWxlSW5mby0+cFBhY2tldE9mZnNldHMgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwVHJhY2VGaWxlSW5mby0+cFBhY2tldE9mZnNldHMgPSBWS1RSQUNFX05FV19BUlJBWSh2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfcGFja2V0X29mZnNldHMsIHBUcmFjZUZpbGVJbmZvLT5wYWNrZXRDb3VudCk7CisKKyAgICAgICAgLy8gcmV3aW5kIHRvIGZpcnN0IHBhY2tldCBhbmQgdGhpcyB0aW1lLCBwb3B1bGF0ZSB0aGUgcGFja2V0IG9mZnNldHMKKyAgICAgICAgaWYgKGZzZWVrKHBUcmFjZUZpbGVJbmZvLT5wRmlsZSwgZmlyc3Rfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJld2luZCB0cmFjZSBmaWxlIHRvIGdhdGhlciBwYWNrZXQgb2Zmc2V0cy4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGludCBwYWNrZXRJbmRleCA9IDA7CisgICAgICAgIGZpbGVPZmZzZXQgPSBmaXJzdF9vZmZzZXQ7CisgICAgICAgIHdoaWxlKDEgPT0gZnJlYWQoJnBhY2tldFNpemUsIHNpemVvZih1aW50NjRfdCksIDEsIHBUcmFjZUZpbGVJbmZvLT5wRmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoZSBmcmVhZCBjb25maXJtcyB0aGF0IHRoaXMgcGFja2V0IGV4aXN0cworICAgICAgICAgICAgLy8gTk9URTogV2UgZG8gbm90IGFjdHVhbGx5IHJlYWQgdGhlIGVudGlyZSBwYWNrZXQgaW50byBtZW1vcnkgcmlnaHQgbm93LgorICAgICAgICAgICAgcFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW3BhY2tldEluZGV4XS5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKKworICAgICAgICAgICAgLy8gcmV3aW5kIHNsaWdodGx5CisgICAgICAgICAgICBmc2VlayhwVHJhY2VGaWxlSW5mby0+cEZpbGUsIC0xKihsb25nKXNpemVvZih1aW50NjRfdCksIFNFRUtfQ1VSKTsKKworICAgICAgICAgICAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwYWNrZXQgYW5kIHJlYWQgaXQgaW4KKyAgICAgICAgICAgIHBUcmFjZUZpbGVJbmZvLT5wUGFja2V0T2Zmc2V0c1twYWNrZXRJbmRleF0ucEhlYWRlciA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqKXZrdHJhY2VfbWFsbG9jKHBhY2tldFNpemUpOworICAgICAgICAgICAgaWYgKDEgIT0gZnJlYWQocFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW3BhY2tldEluZGV4XS5wSGVhZGVyLCBwYWNrZXRTaXplLCAxLCBwVHJhY2VGaWxlSW5mby0+cEZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXQgT3V0cHV0TWVzc2FnZShWS1RSQUNFX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZWFkIGluIGEgdHJhY2UgcGFja2V0LiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWRqdXN0IHBvaW50ZXIgdG8gYm9keSBvZiB0aGUgcGFja2V0CisgICAgICAgICAgICBwVHJhY2VGaWxlSW5mby0+cFBhY2tldE9mZnNldHNbcGFja2V0SW5kZXhdLnBIZWFkZXItPnBCb2R5ID0gKHVpbnRwdHJfdClwVHJhY2VGaWxlSW5mby0+cFBhY2tldE9mZnNldHNbcGFja2V0SW5kZXhdLnBIZWFkZXIgKyBzaXplb2Yodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKTsKKworICAgICAgICAgICAgLy8gbm93IHNlZWsgdG8gd2hhdCBzaG91bGQgYmUgdGhlIG5leHQgcGFja2V0CisgICAgICAgICAgICBmaWxlT2Zmc2V0ICs9IHBhY2tldFNpemU7CisgICAgICAgICAgICBwYWNrZXRJbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZzZWVrKHBUcmFjZUZpbGVJbmZvLT5wRmlsZSwgZmlyc3Rfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCBPdXRwdXRNZXNzYWdlKFZLVFJBQ0VfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJld2luZCB0cmFjZSBmaWxlIHRvIHJlc3RvcmUgcG9zaXRpb24uIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcXRyYWNlZmlsZWxvYWRlci5oIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl9xdHJhY2VmaWxlbG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5ZWI0NgotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfcXRyYWNlZmlsZWxvYWRlci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+IDxwbG9ocm1hbm5AZ21haWwuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBWS1RSQUNFVklFV0VSX1FUUkFDRUZJTEVMT0FERVJfSAorI2RlZmluZSBWS1RSQUNFVklFV0VSX1FUUkFDRUZJTEVMT0FERVJfSAorCisjaW5jbHVkZSA8UU9iamVjdD4KKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfY29udHJvbGxlci5oIgorCisjZGVmaW5lIFVTRV9TVEFUSUNfQ09OVFJPTExFUl9MSUJSQVJZIDEKK2NsYXNzIHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZUxvYWRlciA6IHB1YmxpYyBRT2JqZWN0Cit7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICB2a3RyYWNldmlld2VyX1FUcmFjZUZpbGVMb2FkZXIoKTsKKyAgICB2aXJ0dWFsIH52a3RyYWNldmlld2VyX1FUcmFjZUZpbGVMb2FkZXIoKTsKKworcHVibGljIHNsb3RzOgorICAgIHZvaWQgbG9hZFRyYWNlRmlsZShjb25zdCBRU3RyaW5nJiBmaWxlbmFtZSk7CisKK3NpZ25hbHM6CisgICAgdm9pZCBPdXRwdXRNZXNzYWdlKFZrdHJhY2VMb2dMZXZlbCBsZXZlbCwgdWludDY0X3QgcGFja2V0SW5kZXgsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpOworICAgIHZvaWQgT3V0cHV0TWVzc2FnZShWa3RyYWNlTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpOworCisgICAgdm9pZCBUcmFjZUZpbGVMb2FkZWQoYm9vbCBiU3VjY2VzcywgY29uc3Qgdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8mIGZpbGVJbmZvLCBjb25zdCBRU3RyaW5nJiBjb250cm9sbGVyRmlsZW5hbWUpOworCisgICAgdm9pZCBGaW5pc2hlZCgpOworCitwcml2YXRlOgorICAgIHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvIG1fdHJhY2VGaWxlSW5mbzsKKyAgICB2a3RyYWNldmlld2VyX2NvbnRyb2xsZXJfZmFjdG9yeSBtX2NvbnRyb2xsZXJGYWN0b3J5OworICAgIHZrdHJhY2V2aWV3ZXJfUUNvbnRyb2xsZXIqIG1fcENvbnRyb2xsZXI7CisgICAgUVN0cmluZyBtX2NvbnRyb2xsZXJGaWxlbmFtZTsKKworICAgIGJvb2wgbG9hZF9jb250cm9sbGVycyh2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbyogcFRyYWNlRmlsZUluZm8pOworCisgICAgYm9vbCBwb3B1bGF0ZV90cmFjZV9maWxlX2luZm8odmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX2luZm8qIHBUcmFjZUZpbGVJbmZvKTsKKworfTsKKworI2VuZGlmIC8vIFZLVFJBQ0VWSUVXRVJfUVRSQUNFRklMRUxPQURFUl9ICmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3NldHRpbmdzLmNwcCBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfc2V0dGluZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDM1NjcKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3NldHRpbmdzLmNwcApAQCAtMCwwICsxLDIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9zZXR0aW5ncy5oIgorI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfb3V0cHV0LmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxRQ29yZUFwcGxpY2F0aW9uPgorI2luY2x1ZGUgPFFEaXI+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZrdHJhY2Vfc2V0dGluZ3MuaCIKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBWS1RSQUNFVklFV0VSX1NFVFRJTkdTX0ZJTEVfRk9STUFUX1ZFUlNJT05fMSA9IDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFZLVFJBQ0VWSUVXRVJfU0VUVElOR1NfRklMRV9GT1JNQVRfVkVSU0lPTiA9IFZLVFJBQ0VWSUVXRVJfU0VUVElOR1NfRklMRV9GT1JNQVRfVkVSU0lPTl8xOworCitzdGF0aWMgY29uc3QgY2hhciAqc19TRVRUSU5HU19GSUxFID0gInZrdHJhY2V2aWV3ZXJfc2V0dGluZ3MudHh0IjsKKworLy8gZGVjbGFyZWQgYXMgZXh0ZXJuIGluIGhlYWRlcgordmt0cmFjZXZpZXdlcl9zZXR0aW5ncyBnX3NldHRpbmdzOworc3RhdGljIHZrdHJhY2V2aWV3ZXJfc2V0dGluZ3Mgc19kZWZhdWx0X3NldHRpbmdzOwordmt0cmFjZV9TZXR0aW5nR3JvdXAqIGdfcEFsbFNldHRpbmdzID0gTlVMTDsKK3Vuc2lnbmVkIGludCBnX251bUFsbFNldHRpbmdzID0gMDsKKwordmt0cmFjZV9TZXR0aW5nSW5mbyBnX3NldHRpbmdzX2luZm9bXSA9Cit7CisgICAgeyAibyIsICJPcGVuVHJhY2VGaWxlIiwgVktUUkFDRV9TRVRUSU5HX1NUUklORywgJmdfc2V0dGluZ3MudHJhY2VfZmlsZV90b19vcGVuLCAmc19kZWZhdWx0X3NldHRpbmdzLnRyYWNlX2ZpbGVfdG9fb3BlbiwgVFJVRSwgIkxvYWQgdGhlIHNwZWNpZmllZCB0cmFjZSBmaWxlIHdoZW4gdmt0cmFjZXZpZXdlciBpcyBvcGVuZWQuIn0sCisgICAgeyAid2wiLCAiV2luZG93TGVmdCIsIFZLVFJBQ0VfU0VUVElOR19JTlQsICZnX3NldHRpbmdzLndpbmRvd19wb3NpdGlvbl9sZWZ0LCAmc19kZWZhdWx0X3NldHRpbmdzLndpbmRvd19wb3NpdGlvbl9sZWZ0LCBUUlVFLCAiTGVmdCBjb29yZGluYXRlIG9mIFZrVHJhY2VWaWV3ZXIgd2luZG93IG9uIHN0YXJ0dXAuIn0sCisgICAgeyAid3QiLCAiV2luZG93VG9wIiwgVktUUkFDRV9TRVRUSU5HX0lOVCwgJmdfc2V0dGluZ3Mud2luZG93X3Bvc2l0aW9uX3RvcCwgJnNfZGVmYXVsdF9zZXR0aW5ncy53aW5kb3dfcG9zaXRpb25fdG9wLCBUUlVFLCAiVG9wIGNvb3JkaW5hdGUgb2YgVmtUcmFjZVZpZXdlciB3aW5kb3cgb24gc3RhcnR1cC4ifSwKKyAgICB7ICJ3dyIsICJXaW5kb3dXaWR0aCIsIFZLVFJBQ0VfU0VUVElOR19JTlQsICZnX3NldHRpbmdzLndpbmRvd19zaXplX3dpZHRoLCAmc19kZWZhdWx0X3NldHRpbmdzLndpbmRvd19zaXplX3dpZHRoLCBUUlVFLCAiV2lkdGggb2YgVmtUcmFjZVZpZXdlciB3aW5kb3cgb24gc3RhcnR1cC4ifSwKKyAgICB7ICJ3aCIsICJXaW5kb3dIZWlnaHQiLCBWS1RSQUNFX1NFVFRJTkdfSU5ULCAmZ19zZXR0aW5ncy53aW5kb3dfc2l6ZV9oZWlnaHQsICZzX2RlZmF1bHRfc2V0dGluZ3Mud2luZG93X3NpemVfaGVpZ2h0LCBUUlVFLCAiSGVpZ2h0IG9mIFZrVHJhY2VWaWV3ZXIgd2luZG93IG9uIHN0YXJ0dXAuIn0sCisKKyAgICB7ICIiLCAiR2VuVHJhY2VBcHBsaWNhdGlvbiIsIFZLVFJBQ0VfU0VUVElOR19TVFJJTkcsICZnX3NldHRpbmdzLmdlbnRyYWNlX2FwcGxpY2F0aW9uLCAmc19kZWZhdWx0X3NldHRpbmdzLmdlbnRyYWNlX2FwcGxpY2F0aW9uLCBGQUxTRSwgIlRoZSBtb3N0IHJlY2VudCBhcHBsaWNhdGlvbiBwYXRoIGluIHRoZSAnR2VuZXJhdGUgVHJhY2UnIGRpYWxvZy4ifSwKKyAgICB7ICIiLCAiR2VuVHJhY2VBcmd1bWVudHMiLCBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HLCAmZ19zZXR0aW5ncy5nZW50cmFjZV9hcmd1bWVudHMsICZzX2RlZmF1bHRfc2V0dGluZ3MuZ2VudHJhY2VfYXJndW1lbnRzLCBGQUxTRSwgIlRoZSBtb3N0IHJlY2VudCBhcHBsaWNhdGlvbiBhcmd1bWVudHMgaW4gdGhlICdHZW5lcmF0ZSBUcmFjZScgZGlhbG9nLiJ9LAorICAgIHsgIiIsICJHZW5UcmFjZVdvcmtpbmdEaXIiLCBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HLCAmZ19zZXR0aW5ncy5nZW50cmFjZV93b3JraW5nX2RpciwgJnNfZGVmYXVsdF9zZXR0aW5ncy5nZW50cmFjZV93b3JraW5nX2RpciwgRkFMU0UsICJUaGUgbW9zdCByZWNlbnQgd29ya2luZyBkaXJlY3RvcnkgaW4gdGhlICdHZW5lcmF0ZSBUcmFjZScgZGlhbG9nLiJ9LAorICAgIHsgIiIsICJHZW5UcmFjZVZrTGF5ZXJQYXRoIiwgVktUUkFDRV9TRVRUSU5HX1NUUklORywgJmdfc2V0dGluZ3MuZ2VudHJhY2VfdmtfbGF5ZXJfcGF0aCwgJnNfZGVmYXVsdF9zZXR0aW5ncy5nZW50cmFjZV92a19sYXllcl9wYXRoLCBGQUxTRSwgIlRoZSBtb3N0IHJlY2VudCBWS19MQVlFUl9QQVRIIHVzZWQgaW4gdGhlICdHZW5lcmF0ZSBUcmFjZScgZGlhbG9nLiJ9LAorICAgIHsgIiIsICJHZW5UcmFjZU91dHB1dEZpbGUiLCBWS1RSQUNFX1NFVFRJTkdfU1RSSU5HLCAmZ19zZXR0aW5ncy5nZW50cmFjZV9vdXRwdXRfZmlsZSwgJnNfZGVmYXVsdF9zZXR0aW5ncy5nZW50cmFjZV9vdXRwdXRfZmlsZSwgRkFMU0UsICJUaGUgbW9zdCByZWNlbnQgb3V0cHV0IHRyYWNlIGZpbGUgaW4gdGhlICdHZW5lcmF0ZSBUcmFjZScgZGlhbG9nLiJ9LAorCisgICAgeyAiIiwgIlNldHRpbmdzRGlhbG9nV2lkdGgiLCBWS1RSQUNFX1NFVFRJTkdfSU5ULCAmZ19zZXR0aW5ncy5zZXR0aW5nc19kaWFsb2dfd2lkdGgsICZzX2RlZmF1bHRfc2V0dGluZ3Muc2V0dGluZ3NfZGlhbG9nX3dpZHRoLCBUUlVFLCAiV2lkdGggb2YgVmtUcmFjZVZpZXdlciBzZXR0aW5ncyBkaWFsb2cgd2hlbiBvcGVuZWQuIn0sCisgICAgeyAiIiwgIlNldHRpbmdzRGlhbG9nSGVpZ2h0IiwgVktUUkFDRV9TRVRUSU5HX0lOVCwgJmdfc2V0dGluZ3Muc2V0dGluZ3NfZGlhbG9nX2hlaWdodCwgJnNfZGVmYXVsdF9zZXR0aW5ncy5zZXR0aW5nc19kaWFsb2dfaGVpZ2h0LCBUUlVFLCAiSGVpZ2h0IG9mIFZrVHJhY2VWaWV3ZXIgc2V0dGluZ3MgZGlhbG9nIHdoZW4gb3BlbmVkLiJ9LAorCisgICAgLy97ICJ0bHRwcyIsICJ0cmltX2xhcmdlX3RyYWNlX3Byb21wdF9zaXplIiwgVktUUkFDRV9TRVRUSU5HX1VJTlQsICZnX3NldHRpbmdzLnRyaW1fbGFyZ2VfdHJhY2VfcHJvbXB0X3NpemUsICZzX2RlZmF1bHRfc2V0dGluZ3MudHJpbV9sYXJnZV90cmFjZV9wcm9tcHRfc2l6ZSwgVFJVRSwgIlRoZSBudW1iZXIgb2YgZnJhbWVzIGluIGEgdHJhY2UgZmlsZSBhdCB3aGljaCB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgdG8gdHJpbSB0aGUgdHJhY2UgYmVmb3JlIGxvYWRpbmcuIn0sCisgICAgLy97ICJnc3IiLCAiZ3JvdXBfc3RhdGVfcmVuZGVyIiwgVktUUkFDRV9TRVRUSU5HX0JPT0wsICZnX3NldHRpbmdzLmdyb3Vwc19zdGF0ZV9yZW5kZXIsICZzX2RlZmF1bHRfc2V0dGluZ3MuZ3JvdXBzX3N0YXRlX3JlbmRlciwgVFJVRSwgIlBhdGggdG8gdGhlIGR5bmFtaWMgdHJhY2VyIGxpYnJhcnkgdG8gYmUgaW5qZWN0ZWQsIG1heSB1c2UgWzAtMTVdLiJ9LAorICAgIC8veyAiZ3BwbSIsICJncm91cHNfcHVzaF9wb3BfbWFya2VycyIsIFZLVFJBQ0VfU0VUVElOR19CT09MLCAmZ19zZXR0aW5ncy5ncm91cHNfcHVzaF9wb3BfbWFya2VycywgJnNfZGVmYXVsdF9zZXR0aW5ncy5ncm91cHNfcHVzaF9wb3BfbWFya2VycywgVFJVRSwgIlBhdGggdG8gdGhlIGR5bmFtaWMgdHJhY2VyIGxpYnJhcnkgdG8gYmUgaW5qZWN0ZWQsIG1heSB1c2UgWzAtMTVdLiJ9LAorICAgIC8veyAiZ25jIiwgImdyb3Vwc19uZXN0ZWRfY2FsbHMiLCBWS1RSQUNFX1NFVFRJTkdfQk9PTCwgJmdfc2V0dGluZ3MuZ3JvdXBzX25lc3RlZF9jYWxscywgJnNfZGVmYXVsdF9zZXR0aW5ncy5ncm91cHNfbmVzdGVkX2NhbGxzLCBUUlVFLCAiUGF0aCB0byB0aGUgZHluYW1pYyB0cmFjZXIgbGlicmFyeSB0byBiZSBpbmplY3RlZCwgbWF5IHVzZSBbMC0xNV0uIn0sCit9OworCit2a3RyYWNlX1NldHRpbmdHcm91cCBnX3NldHRpbmdHcm91cCA9Cit7CisgICAgInZrdHJhY2V2aWV3ZXIiLAorICAgIHNpemVvZihnX3NldHRpbmdzX2luZm8pIC8gc2l6ZW9mKGdfc2V0dGluZ3NfaW5mb1swXSksCisgICAgJmdfc2V0dGluZ3NfaW5mb1swXQorfTsKKworUVN0cmluZyB2a3RyYWNldmlld2VyX2dldF9zZXR0aW5nc19maWxlX3BhdGgoKQoreworICAgIFFTdHJpbmcgcmVzdWx0ID0gdmt0cmFjZXZpZXdlcl9nZXRfc2V0dGluZ3NfZGlyZWN0b3J5KCkgKyAiLyIgKyBRU3RyaW5nKHNfU0VUVElOR1NfRklMRSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworUVN0cmluZyB2a3RyYWNldmlld2VyX2dldF9zZXR0aW5nc19kaXJlY3RvcnkoKQoreworICAgIGNoYXIgKiBwU2V0dGluZ3NQYXRoID0gdmt0cmFjZV9wbGF0Zm9ybV9nZXRfc2V0dGluZ3NfcGF0aCgpOworICAgIFFTdHJpbmcgcmVzdWx0ID0gUVN0cmluZyhwU2V0dGluZ3NQYXRoKTsKKyAgICB2a3RyYWNlX2ZyZWUocFNldHRpbmdzUGF0aCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworUVN0cmluZyB2a3RyYWNldmlld2VyX2dldF9zZXNzaW9uc19kaXJlY3RvcnkoKQoreworICAgIGNoYXIgKiBwRGF0YVBhdGggPSB2a3RyYWNlX3BsYXRmb3JtX2dldF9kYXRhX3BhdGgoKTsKKyAgICBRU3RyaW5nIHJlc3VsdCA9IFFTdHJpbmcocERhdGFQYXRoKSArICIvc2Vzc2lvbnMvIjsKKyAgICB2a3RyYWNlX2ZyZWUocERhdGFQYXRoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIHZrdHJhY2V2aWV3ZXJfaW5pdGlhbGl6ZV9zZXR0aW5ncyhpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICAgIGJvb2wgYlN1Y2Nlc3MgPSB0cnVlOworCisgICAgLy8gc2V0dXAgZGVmYXVsdCB2YWx1ZXMKKyAgICBtZW1zZXQoJnNfZGVmYXVsdF9zZXR0aW5ncywgMCwgc2l6ZW9mKHZrdHJhY2V2aWV3ZXJfc2V0dGluZ3MpKTsKKworICAgIHNfZGVmYXVsdF9zZXR0aW5ncy50cmFjZV9maWxlX3RvX29wZW4gPSBOVUxMOworICAgIHNfZGVmYXVsdF9zZXR0aW5ncy53aW5kb3dfcG9zaXRpb25fbGVmdCA9IDA7CisgICAgc19kZWZhdWx0X3NldHRpbmdzLndpbmRvd19wb3NpdGlvbl90b3AgPSAwOworICAgIHNfZGVmYXVsdF9zZXR0aW5ncy53aW5kb3dfc2l6ZV93aWR0aCA9IDEwMjQ7CisgICAgc19kZWZhdWx0X3NldHRpbmdzLndpbmRvd19zaXplX2hlaWdodCA9IDc2ODsKKworICAgIHNfZGVmYXVsdF9zZXR0aW5ncy5nZW50cmFjZV9hcHBsaWNhdGlvbiA9IE5VTEw7CisgICAgc19kZWZhdWx0X3NldHRpbmdzLmdlbnRyYWNlX2FyZ3VtZW50cyA9IE5VTEw7CisgICAgc19kZWZhdWx0X3NldHRpbmdzLmdlbnRyYWNlX3dvcmtpbmdfZGlyID0gTlVMTDsKKyAgICBzX2RlZmF1bHRfc2V0dGluZ3MuZ2VudHJhY2VfdmtfbGF5ZXJfcGF0aCA9IE5VTEw7CisgICAgc19kZWZhdWx0X3NldHRpbmdzLmdlbnRyYWNlX291dHB1dF9maWxlID0gTlVMTDsKKworICAgIC8vIFRoaXMgc2VlbXMgdG8gYmUgYSByZWFzb25hYmxlIGRlZmF1bHQgc2l6ZSBmb3IgdGhlIGRpYWxvZy4KKyAgICBzX2RlZmF1bHRfc2V0dGluZ3Muc2V0dGluZ3NfZGlhbG9nX3dpZHRoID0gNjAwOworICAgIHNfZGVmYXVsdF9zZXR0aW5ncy5zZXR0aW5nc19kaWFsb2dfaGVpZ2h0ID0gNjAwOworCisgICAgLy8gaW5pdGlhbGl6ZSBzZXR0aW5ncyBhcyBkZWZhdWx0cworICAgIGdfc2V0dGluZ3MgPSBzX2RlZmF1bHRfc2V0dGluZ3M7CisKKyAgICBRU3RyaW5nIHNldHRpbmdzRmlsZVBhdGggPSB2a3RyYWNldmlld2VyX2dldF9zZXR0aW5nc19maWxlX3BhdGgoKTsKKyAgICBGSUxFKiBwRmlsZSA9IGZvcGVuKHNldHRpbmdzRmlsZVBhdGgudG9TdGRTdHJpbmcoKS5jX3N0cigpLCAiciIpOworICAgIGlmIChwRmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJVbmFibGUgdG8gb3BlbiBzZXR0aW5ncyBmaWxlOiAnJXMnLiIsIHNldHRpbmdzRmlsZVBhdGgudG9TdGRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICAvLyBTZWNvbmRseSBzZXQgb3B0aW9ucyBiYXNlZCBvbiBzZXR0aW5ncyBmaWxlCisgICAgaWYgKHBGaWxlICE9IE5VTEwpCisgICAgeworICAgICAgICBnX3BBbGxTZXR0aW5ncyA9IE5VTEw7CisgICAgICAgIGdfbnVtQWxsU2V0dGluZ3MgPSAwOworICAgICAgICBpZiAodmt0cmFjZV9TZXR0aW5nR3JvdXBfTG9hZF9mcm9tX2ZpbGUocEZpbGUsICZnX3BBbGxTZXR0aW5ncywgJmdfbnVtQWxsU2V0dGluZ3MpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNlX1NldHRpbmdHcm91cF9wcmludCgmZ19zZXR0aW5nR3JvdXApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdfcEFsbFNldHRpbmdzICE9IE5VTEwgJiYgZ19udW1BbGxTZXR0aW5ncyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX0FwcGx5X092ZXJyaWRlcygmZ19zZXR0aW5nR3JvdXAsIGdfcEFsbFNldHRpbmdzLCBnX251bUFsbFNldHRpbmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZjbG9zZShwRmlsZSk7CisgICAgICAgIHBGaWxlID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBhcHBseSBzZXR0aW5ncyBmcm9tIHNldHRpbmdzIGZpbGUgYW5kIGZyb20gY21kLWxpbmUgYXJncworICAgIGlmICh2a3RyYWNlX1NldHRpbmdHcm91cF9pbml0X2Zyb21fY21kbGluZSgmZ19zZXR0aW5nR3JvdXAsIGFyZ2MsIGFyZ3YsICZnX3NldHRpbmdzLnRyYWNlX2ZpbGVfdG9fb3BlbikgIT0gMCkKKyAgICB7CisgICAgICAgIC8vIGludmFsaWQgb3B0aW9ucyBzcGVjaWZpZWQKKyAgICAgICAgYlN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNZXJnZSBrbm93biB2a3RyYWNldmlld2VyIHNldHRpbmdzIGludG8gdGhlIGxvYWRlZCBzZXR0aW5ncy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBuZXcga25vd24gc2V0dGluZ3MgYXJlIGFkZGVkIHRvIHRoZSBzZXR0aW5ncyBkaWFsb2cKKyAgICAvLyBhbmQgd2lsbCBiZSByZS13cml0dGVuIHRvIHRoZSBzZXR0aW5ncyBmaWxlIHVwb24gc2F2aW5nLgorICAgIHZrdHJhY2VfU2V0dGluZ0dyb3VwX21lcmdlKCZnX3NldHRpbmdHcm91cCwgJmdfcEFsbFNldHRpbmdzLCAmZ19udW1BbGxTZXR0aW5ncyk7CisKKyAgICAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCBwbGFjZSB0byB2YWxpZGF0ZSBhbnkgInJlcXVpcmVkIiBzZXR0aW5ncywgYnV0IHJpZ2h0IG5vdyB0aGVyZSBhcmVuJ3QgYW55IQorCisgICAgaWYgKGJTdWNjZXNzID09IGZhbHNlKQorICAgIHsKKyAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfcHJpbnQoJmdfc2V0dGluZ0dyb3VwKTsKKyAgICAgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfZGVsZXRlKCZnX3NldHRpbmdHcm91cCk7CisgICAgfQorCisgICAgcmV0dXJuIGJTdWNjZXNzOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfc2V0dGluZ3NfdXBkYXRlZCgpCit7CisgICAgdmt0cmFjZV9TZXR0aW5nR3JvdXBfdXBkYXRlKCZnX3NldHRpbmdHcm91cCwgZ19wQWxsU2V0dGluZ3MsIGdfbnVtQWxsU2V0dGluZ3MpOworfQorCit2b2lkIHZrdHJhY2V2aWV3ZXJfc2F2ZV9zZXR0aW5ncygpCit7CisgICAgUURpciBzZXR0aW5nc0Rpcih2a3RyYWNldmlld2VyX2dldF9zZXR0aW5nc19kaXJlY3RvcnkoKSk7CisgICAgaWYgKHNldHRpbmdzRGlyLm1rcGF0aCgiLiIpID09IGZhbHNlKQorICAgIHsKKyAgICAgICAgUVN0cmluZyBlcnJvciA9ICJGYWlsZWQgdG8gY3JlYXRlICIgKyBzZXR0aW5nc0Rpci5wYXRoKCk7CisgICAgICAgIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X2Vycm9yKGVycm9yKTsKKyAgICB9CisKKyAgICBRU3RyaW5nIGZpbGVwYXRoID0gdmt0cmFjZXZpZXdlcl9nZXRfc2V0dGluZ3NfZmlsZV9wYXRoKCk7CisgICAgRklMRSogcFNldHRpbmdzRmlsZSA9IGZvcGVuKGZpbGVwYXRoLnRvU3RkU3RyaW5nKCkuY19zdHIoKSwgInciKTsKKyAgICBpZiAocFNldHRpbmdzRmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUVN0cmluZyBlcnJvciA9ICJGYWlsZWQgdG8gb3BlbiBzZXR0aW5ncyBmaWxlIGZvciB3cml0aW5nOiAiICsgZmlsZXBhdGg7CisgICAgICAgIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X2Vycm9yKGVycm9yKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHZrdHJhY2VfU2V0dGluZ0dyb3VwX3NhdmUoZ19wQWxsU2V0dGluZ3MsIGdfbnVtQWxsU2V0dGluZ3MsIHBTZXR0aW5nc0ZpbGUpID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBRU3RyaW5nIGVycm9yID0gIkZhaWxlZCB0byBzYXZlIHNldHRpbmdzIGZpbGU6ICIgKyBmaWxlcGF0aDsKKyAgICAgICAgICAgIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X2Vycm9yKGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGZjbG9zZShwU2V0dGluZ3NGaWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3NldHRpbmdzLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmOWZlYwotLS0gL2Rldi9udWxsCisrKyBiL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfc2V0dGluZ3MuaApAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVktUUkFDRVZJRVdFUl9TRVRUSU5HU19ICisjZGVmaW5lIFZLVFJBQ0VWSUVXRVJfU0VUVElOR1NfSAorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJ2a3RyYWNlX3NldHRpbmdzLmgiCit9CisKKyNpbmNsdWRlIDxRU3RyaW5nPgorCitleHRlcm4gdmt0cmFjZV9TZXR0aW5nR3JvdXAqIGdfcEFsbFNldHRpbmdzOworZXh0ZXJuIHVuc2lnbmVkIGludCBnX251bUFsbFNldHRpbmdzOworCit0eXBlZGVmIHN0cnVjdCB2a3RyYWNldmlld2VyX3NldHRpbmdzCit7CisgICAgY2hhciAqIHRyYWNlX2ZpbGVfdG9fb3BlbjsKKyAgICBpbnQgd2luZG93X3Bvc2l0aW9uX2xlZnQ7CisgICAgaW50IHdpbmRvd19wb3NpdGlvbl90b3A7CisgICAgaW50IHdpbmRvd19zaXplX3dpZHRoOworICAgIGludCB3aW5kb3dfc2l6ZV9oZWlnaHQ7CisgICAgY2hhciAqIGdlbnRyYWNlX2FwcGxpY2F0aW9uOworICAgIGNoYXIgKiBnZW50cmFjZV9hcmd1bWVudHM7CisgICAgY2hhciAqIGdlbnRyYWNlX3dvcmtpbmdfZGlyOworICAgIGNoYXIgKiBnZW50cmFjZV92a19sYXllcl9wYXRoOworICAgIGNoYXIgKiBnZW50cmFjZV9vdXRwdXRfZmlsZTsKKyAgICBpbnQgc2V0dGluZ3NfZGlhbG9nX3dpZHRoOworICAgIGludCBzZXR0aW5nc19kaWFsb2dfaGVpZ2h0OworICAgIC8vdW5zaWduZWQgaW50IHRyaW1fbGFyZ2VfdHJhY2VfcHJvbXB0X3NpemU7CisKKyAgICAvL2Jvb2wgZ3JvdXBzX3N0YXRlX3JlbmRlcjsKKyAgICAvL2Jvb2wgZ3JvdXBzX3B1c2hfcG9wX21hcmtlcnM7CisgICAgLy9ib29sIGdyb3Vwc19uZXN0ZWRfY2FsbHM7Cit9IHZrdHJhY2V2aWV3ZXJfc2V0dGluZ3M7CisKK2V4dGVybiB2a3RyYWNldmlld2VyX3NldHRpbmdzIGdfc2V0dGluZ3M7CitleHRlcm4gdmt0cmFjZV9TZXR0aW5nR3JvdXAgZ19zZXR0aW5nR3JvdXA7CisKK2Jvb2wgdmt0cmFjZXZpZXdlcl9pbml0aWFsaXplX3NldHRpbmdzKGludCBhcmdjLCBjaGFyKiBhcmd2W10pOworCit2b2lkIHZrdHJhY2V2aWV3ZXJfc2V0dGluZ3NfdXBkYXRlZCgpOworCit2b2lkIHZrdHJhY2V2aWV3ZXJfc2F2ZV9zZXR0aW5ncygpOworCitRU3RyaW5nIHZrdHJhY2V2aWV3ZXJfZ2V0X3NldHRpbmdzX2ZpbGVfcGF0aCgpOworUVN0cmluZyB2a3RyYWNldmlld2VyX2dldF9zZXR0aW5nc19kaXJlY3RvcnkoKTsKK1FTdHJpbmcgdmt0cmFjZXZpZXdlcl9nZXRfc2Vzc2lvbnNfZGlyZWN0b3J5KCk7CisKKyNlbmRpZiAvLyBWS1RSQUNFVklFV0VSX1NFVFRJTkdTX0gKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvc3JjL3ZrdHJhY2Vfdmlld2VyL3ZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV91dGlscy5jcHAgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTg3YTMKLS0tIC9kZXYvbnVsbAorKysgYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBMdW5hckcsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQXV0aG9yOiBQZXRlciBMb2hybWFubiA8cGV0ZXJsQHZhbHZlc29mdHdhcmUuY29tPiA8cGxvaHJtYW5uQGdtYWlsLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuaCIKKyNpbmNsdWRlICJ2a3RyYWNlX21lbW9yeS5oIgorCitCT09MIHZrdHJhY2V2aWV3ZXJfcG9wdWxhdGVfdHJhY2VfZmlsZV9pbmZvKHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvKiBwVHJhY2VGaWxlSW5mbykKK3sKKyAgICBhc3NlcnQocFRyYWNlRmlsZUluZm8gIT0gTlVMTCk7CisgICAgYXNzZXJ0KHBUcmFjZUZpbGVJbmZvLT5wRmlsZSAhPSBOVUxMKTsKKworICAgIC8vIHJlYWQgdHJhY2UgZmlsZSBoZWFkZXIKKyAgICBpZiAoMSAhPSBmcmVhZCgmKHBUcmFjZUZpbGVJbmZvLT5oZWFkZXIpLCBzaXplb2Yodmt0cmFjZV90cmFjZV9maWxlX2hlYWRlciksIDEsIHBUcmFjZUZpbGVJbmZvLT5wRmlsZSkpCisgICAgeworICAgICAgICB2a3RyYWNldmlld2VyX291dHB1dF9lcnJvcigiVW5hYmxlIHRvIHJlYWQgaGVhZGVyIGZyb20gZmlsZS4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIEZpbmQgb3V0IGhvdyBtYW55IHRyYWNlIHBhY2tldHMgdGhlcmUgYXJlLgorCisgICAgLy8gU2VlayB0byBmaXJzdCBwYWNrZXQKKyAgICBsb25nIGZpcnN0X29mZnNldCA9IHBUcmFjZUZpbGVJbmZvLT5oZWFkZXIuZmlyc3RfcGFja2V0X29mZnNldDsKKyAgICBpbnQgc2Vla1Jlc3VsdCA9IGZzZWVrKHBUcmFjZUZpbGVJbmZvLT5wRmlsZSwgZmlyc3Rfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKHNlZWtSZXN1bHQgIT0gMCkKKyAgICB7CisgICAgICAgIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X3dhcm5pbmcoIkZhaWxlZCB0byBzZWVrIHRvIHRoZSBmaXJzdCBwYWNrZXQgb2Zmc2V0IGluIHRoZSB0cmFjZSBmaWxlLiIpOworICAgIH0KKworICAgIHVpbnQ2NF90IGZpbGVPZmZzZXQgPSBwVHJhY2VGaWxlSW5mby0+aGVhZGVyLmZpcnN0X3BhY2tldF9vZmZzZXQ7CisgICAgdWludDY0X3QgcGFja2V0U2l6ZSA9IDA7CisgICAgd2hpbGUoMSA9PSBmcmVhZCgmcGFja2V0U2l6ZSwgc2l6ZW9mKHVpbnQ2NF90KSwgMSwgcFRyYWNlRmlsZUluZm8tPnBGaWxlKSkKKyAgICB7CisgICAgICAgIC8vIHN1Y2Nlc3MhCisgICAgICAgIHBUcmFjZUZpbGVJbmZvLT5wYWNrZXRDb3VudCsrOworICAgICAgICBmaWxlT2Zmc2V0ICs9IHBhY2tldFNpemU7CisKKyAgICAgICAgZnNlZWsocFRyYWNlRmlsZUluZm8tPnBGaWxlLCBmaWxlT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgfQorCisgICAgaWYgKHBUcmFjZUZpbGVJbmZvLT5wYWNrZXRDb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGZlcnJvcihwVHJhY2VGaWxlSW5mby0+cEZpbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlcnJvcigiRmlsZSBSZWFkIGVycm9yOiIpOworICAgICAgICAgICAgdmt0cmFjZXZpZXdlcl9vdXRwdXRfd2FybmluZygiVGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIHRyYWNlIGZpbGUuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZmVvZihwVHJhY2VGaWxlSW5mby0+cEZpbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X3dhcm5pbmcoIlJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlsZS4iKTsKKyAgICAgICAgfQorICAgICAgICB2a3RyYWNldmlld2VyX291dHB1dF93YXJuaW5nKCJUaGVyZSBhcmUgbm8gdHJhY2UgcGFja2V0cyBpbiB0aGlzIHRyYWNlIGZpbGUuIik7CisgICAgICAgIHBUcmFjZUZpbGVJbmZvLT5wUGFja2V0T2Zmc2V0cyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBUcmFjZUZpbGVJbmZvLT5wUGFja2V0T2Zmc2V0cyA9IFZLVFJBQ0VfTkVXX0FSUkFZKHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9wYWNrZXRfb2Zmc2V0cywgcFRyYWNlRmlsZUluZm8tPnBhY2tldENvdW50KTsKKworICAgICAgICAvLyByZXdpbmQgdG8gZmlyc3QgcGFja2V0IGFuZCB0aGlzIHRpbWUsIHBvcHVsYXRlIHRoZSBwYWNrZXQgb2Zmc2V0cworICAgICAgICBpZiAoZnNlZWsocFRyYWNlRmlsZUluZm8tPnBGaWxlLCBmaXJzdF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2a3RyYWNldmlld2VyX291dHB1dF9lcnJvcigiVW5hYmxlIHRvIHJld2luZCB0cmFjZSBmaWxlIHRvIGdhdGhlciBwYWNrZXQgb2Zmc2V0cy4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGludCBwYWNrZXRJbmRleCA9IDA7CisgICAgICAgIGZpbGVPZmZzZXQgPSBmaXJzdF9vZmZzZXQ7CisgICAgICAgIHdoaWxlKDEgPT0gZnJlYWQoJnBhY2tldFNpemUsIHNpemVvZih1aW50NjRfdCksIDEsIHBUcmFjZUZpbGVJbmZvLT5wRmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoZSBmcmVhZCBjb25maXJtcyB0aGF0IHRoaXMgcGFja2V0IGV4aXN0cworICAgICAgICAgICAgLy8gTk9URTogV2UgZG8gbm90IGFjdHVhbGx5IHJlYWQgdGhlIGVudGlyZSBwYWNrZXQgaW50byBtZW1vcnkgcmlnaHQgbm93LgorICAgICAgICAgICAgcFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW3BhY2tldEluZGV4XS5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKKworICAgICAgICAgICAgLy8gcmV3aW5kIHNsaWdodGx5CisgICAgICAgICAgICBmc2VlayhwVHJhY2VGaWxlSW5mby0+cEZpbGUsIC0xKihsb25nKXNpemVvZih1aW50NjRfdCksIFNFRUtfQ1VSKTsKKworICAgICAgICAgICAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwYWNrZXQgYW5kIHJlYWQgaXQgaW4KKyAgICAgICAgICAgIHBUcmFjZUZpbGVJbmZvLT5wUGFja2V0T2Zmc2V0c1twYWNrZXRJbmRleF0ucEhlYWRlciA9ICh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqKXZrdHJhY2VfbWFsbG9jKHBhY2tldFNpemUpOworICAgICAgICAgICAgaWYgKDEgIT0gZnJlYWQocFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW3BhY2tldEluZGV4XS5wSGVhZGVyLCBwYWNrZXRTaXplLCAxLCBwVHJhY2VGaWxlSW5mby0+cEZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X2Vycm9yKCJVbmFibGUgdG8gcmVhZCBpbiBhIHRyYWNlIHBhY2tldC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFkanVzdCBwb2ludGVyIHRvIGJvZHkgb2YgdGhlIHBhY2tldAorICAgICAgICAgICAgcFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW3BhY2tldEluZGV4XS5wSGVhZGVyLT5wQm9keSA9ICh1aW50cHRyX3QpcFRyYWNlRmlsZUluZm8tPnBQYWNrZXRPZmZzZXRzW3BhY2tldEluZGV4XS5wSGVhZGVyICsgc2l6ZW9mKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlcik7CisKKyAgICAgICAgICAgIC8vIG5vdyBzZWVrIHRvIHdoYXQgc2hvdWxkIGJlIHRoZSBuZXh0IHBhY2tldAorICAgICAgICAgICAgZmlsZU9mZnNldCArPSBwYWNrZXRTaXplOworICAgICAgICAgICAgcGFja2V0SW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmc2VlayhwVHJhY2VGaWxlSW5mby0+cEZpbGUsIGZpcnN0X29mZnNldCwgU0VFS19TRVQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZrdHJhY2V2aWV3ZXJfb3V0cHV0X2Vycm9yKCJVbmFibGUgdG8gcmV3aW5kIHRyYWNlIGZpbGUgdG8gcmVzdG9yZSBwb3NpdGlvbi4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX3V0aWxzLmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY0OGMyCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl90cmFjZV9maWxlX3V0aWxzLmgKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFZLVFJBQ0VWSUVXRVJfVFJBQ0VfRklMRV9VVElMU19IXworI2RlZmluZSBWS1RSQUNFVklFV0VSX1RSQUNFX0ZJTEVfVVRJTFNfSF8KKworLy8jaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPFFTdHJpbmc+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X2lkZW50aWZpZXJzLmgiCit9CisjaW5jbHVkZSAidmt0cmFjZXZpZXdlcl9vdXRwdXQuaCIKKworc3RydWN0IHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9wYWNrZXRfb2Zmc2V0cworeworICAgIC8vIHRoZSBmaWxlIG9mZnNldCB0byB0aGlzIHBhcnRpY3VsYXIgcGFja2V0CisgICAgdW5zaWduZWQgaW50IGZpbGVPZmZzZXQ7CisKKyAgICAvLyBQb2ludGVyIHRvIHRoZSBwYWNrZXQgaGVhZGVyIGlmIGl0J3MgYmVlbiByZWFkIGZyb20gZGlzaworICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsKK307CisKK3N0cnVjdCB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbworeworICAgIC8vIHRoZSB0cmFjZSBmaWxlIG5hbWUgJiBwYXRoCisgICAgY2hhciogZmlsZW5hbWU7CisKKyAgICAvLyB0aGUgdHJhY2UgZmlsZQorICAgIEZJTEUqIHBGaWxlOworCisgICAgLy8gY29weSBvZiB0aGUgdHJhY2UgZmlsZSBoZWFkZXIKKyAgICB2a3RyYWNlX3RyYWNlX2ZpbGVfaGVhZGVyIGhlYWRlcjsKKworICAgIC8vIG51bWJlciBvZiBwYWNrZXRzIGluIGZpbGUgd2hpY2ggc2hvdWxkIGFsc28gYmUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHBQYWNrZXRPZmZzZXRzIGFycmF5CisgICAgdWludDY0X3QgcGFja2V0Q291bnQ7CisKKyAgICAvLyBhcnJheSBvZiBwYWNrZXQgb2Zmc2V0cworICAgIHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9wYWNrZXRfb2Zmc2V0cyogcFBhY2tldE9mZnNldHM7Cit9OworCitCT09MIHZrdHJhY2V2aWV3ZXJfcG9wdWxhdGVfdHJhY2VfZmlsZV9pbmZvKHZrdHJhY2V2aWV3ZXJfdHJhY2VfZmlsZV9pbmZvKiBwVHJhY2VGaWxlSW5mbyk7CisKKyNlbmRpZiAvL1ZLVFJBQ0VWSUVXRVJfVFJBQ0VfRklMRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl92aWV3LmggYi92a3RyYWNlL3NyYy92a3RyYWNlX3ZpZXdlci92a3RyYWNldmlld2VyX3ZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTEzMDBkCi0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS9zcmMvdmt0cmFjZV92aWV3ZXIvdmt0cmFjZXZpZXdlcl92aWV3LmgKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBWYWx2ZSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEF1dGhvcjogUGV0ZXIgTG9ocm1hbm4gPHBldGVybEB2YWx2ZXNvZnR3YXJlLmNvbT4gPHBsb2hybWFubkBnbWFpbC5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsLmgiCisKK3N0cnVjdCB2a3RyYWNldmlld2VyX3RyYWNlX2ZpbGVfaW5mbzsKK3N0cnVjdCB2a3RyYWNlX1NldHRpbmdHcm91cDsKK2NsYXNzIFFXaWRnZXQ7CitjbGFzcyBRVG9vbEJ1dHRvbjsKK2NsYXNzIFFBY3Rpb247CitjbGFzcyBRQWJzdHJhY3RQcm94eU1vZGVsOworCitjbGFzcyB2a3RyYWNldmlld2VyX3ZpZXcKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXRfdmlldygpID0gMDsKKworLy8gICAgdmlydHVhbCB2b2lkIG91dHB1dF9tZXNzYWdlKHVpbnQ2NF90IHBhY2tldEluZGV4LCBRU3RyaW5nIG1lc3NhZ2UpID0gMDsKKy8vICAgIHZpcnR1YWwgdm9pZCBvdXRwdXRfd2FybmluZyh1aW50NjRfdCBwYWNrZXRJbmRleCwgUVN0cmluZyBtZXNzYWdlKSA9IDA7CisvLyAgICB2aXJ0dWFsIHZvaWQgb3V0cHV0X2Vycm9yKHVpbnQ2NF90IHBhY2tldEluZGV4LCBRU3RyaW5nIG1lc3NhZ2UpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRfc2V0dGluZ19ncm91cCh2a3RyYWNlX1NldHRpbmdHcm91cCogcEdyb3VwKSA9IDA7CisgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0X2dsb2JhbF9zZXR0aW5ncyh2a3RyYWNlX1NldHRpbmdHcm91cCoqIHBwR3JvdXBzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X2NhbGx0cmVlX21vZGVsKHZrdHJhY2V2aWV3ZXJfUVRyYWNlRmlsZU1vZGVsKiBwVHJhY2VGaWxlTW9kZWwsIFFBYnN0cmFjdFByb3h5TW9kZWwgKnBNb2RlbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBhZGRfY2FsbHRyZWVfY29udGV4dG1lbnVfaXRlbShRQWN0aW9uKiBwQWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNlbGVjdF9jYWxsX2F0X3BhY2tldF9pbmRleCh1bnNpZ25lZCBsb25nIGxvbmcgcGFja2V0SW5kZXgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaGlnaGxpZ2h0X3RpbWVsaW5lX2l0ZW0odW5zaWduZWQgbG9uZyBsb25nIHBhY2tldEFycmF5SW5kZXgsIGJvb2wgYlNjcm9sbFRvLCBib29sIGJTZWxlY3QpID0gMDsKKworICAgIC8vIFxyZXR1cm4gdGFiIGluZGV4IG9mIHN0YXRlIHZpZXdlcgorICAgIHZpcnR1YWwgaW50IGFkZF9jdXN0b21fc3RhdGVfdmlld2VyKFFXaWRnZXQqIHBXaWRnZXQsIGNvbnN0IFFTdHJpbmcmIHRpdGxlLCBib29sIGJCcmluZ1RvRnJvbnQgPSBmYWxzZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVfY3VzdG9tX3N0YXRlX3ZpZXdlcihpbnQgdGFiSW5kZXgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlX2N1c3RvbV9zdGF0ZV92aWV3ZXIoUVdpZGdldCogcFdpZGdldCwgYm9vbCBiRW5hYmxlZCkgPSAwOworCisgICAgdmlydHVhbCBRVG9vbEJ1dHRvbiogYWRkX3Rvb2xiYXJfYnV0dG9uKGNvbnN0IFFTdHJpbmcmIHRpdGxlLCBib29sIGJFbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25fcmVwbGF5X3N0YXRlX2NoYW5nZWQoYm9vbCBiUmVwbGF5SW5Qcm9ncmVzcykgPSAwOworCisgICAgdmlydHVhbCB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X2N1cnJlbnRfcGFja2V0X2luZGV4KCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weSBiL3ZrdHJhY2Uvdmt0cmFjZV9nZW5lcmF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjkxYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmt0cmFjZS92a3RyYWNlX2dlbmVyYXRlLnB5CkBAIC0wLDAgKzEsMjM1NCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBWdWxrYW4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTHVuYXJHLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcjogSm9uIEFzaGJ1cm4gPGpvbkBsdW5hcmcuY29tPgorIyBBdXRob3I6IFRvYmluIEVobGlzIDx0b2JpbkBsdW5hcmcuY29tPgorIyBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisjCisKK2ltcG9ydCBvcywgc3lzCisKKworIyBhZGQgbWFpbiByZXBvIGRpcmVjdG9yeSBzbyB2dWxrYW4ucHkgY2FuIGJlIGltcG9ydGVkLiBUaGlzIG5lZWRzIHRvIGJlIGEgY29tcGxldGUgcGF0aC4KK3ZrdHJhY2Vfc2NyaXB0c19wYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCittYWluX3BhdGggPSBvcy5wYXRoLmFic3BhdGgodmt0cmFjZV9zY3JpcHRzX3BhdGggKyAiLy4uLyIpCitzeXMucGF0aC5hcHBlbmQobWFpbl9wYXRoKQorZnJvbSBzb3VyY2VfbGluZV9pbmZvIGltcG9ydCBzb3VyY2VsaW5laW5mbworCitpbXBvcnQgdnVsa2FuCisKKyMgdnVsa2FuLnB5IGRvZXNuJ3QgaW5jbHVkZSBhbGwgdGhlIGV4dGVuc2lvbnMgKGRlYnVnX3JlcG9ydCBtaXNzaW5nKQoraGVhZGVycyA9IFtdCitvYmplY3RzID0gW10KK3Byb3RvcyA9IFtdCitwcm90b19leGNsdXNpb25zID0gWyAnQ3JlYXRlV2F5bGFuZFN1cmZhY2VLSFInLCAnQ3JlYXRlTWlyU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VXYXlsYW5kUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsICdHZXRQaHlzaWNhbERldmljZU1pclByZXNlbnRhdGlvblN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlRGlzcGxheVByb3BlcnRpZXNLSFInLCAnR2V0UGh5c2ljYWxEZXZpY2VEaXNwbGF5UGxhbmVQcm9wZXJ0aWVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICdHZXREaXNwbGF5UGxhbmVTdXBwb3J0ZWREaXNwbGF5c0tIUicsICdHZXREaXNwbGF5TW9kZVByb3BlcnRpZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZURpc3BsYXlNb2RlS0hSJywgJ0dldERpc3BsYXlQbGFuZUNhcGFiaWxpdGllc0tIUicsICdDcmVhdGVEaXNwbGF5UGxhbmVTdXJmYWNlS0hSJ10KKworZm9yIGV4dCBpbiB2dWxrYW4uZXh0ZW5zaW9uc19hbGw6CisgICAgaGVhZGVycy5leHRlbmQoZXh0LmhlYWRlcnMpCisgICAgb2JqZWN0cy5leHRlbmQoZXh0Lm9iamVjdHMpCisgICAgcHJvdG9zLmV4dGVuZChleHQucHJvdG9zKQorCisjIEFkZCBwYXJhbWV0ZXJzIHdlIG5lZWQgdG8gcmVtYXAsIGFsb25nIHdpdGggdGhlaXIgdHlwZSwgaW4gcGFpcnMKK2FkZGl0aW9uYWxfcmVtYXBfZGljdCA9IHt9CithZGRpdGlvbmFsX3JlbWFwX2RpY3RbJ3BJbWFnZUluZGV4J10gPSAidWludDMyX3QiCisKK2NsYXNzIFN1YmNvbW1hbmQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJndik6CisgICAgICAgIHNlbGYuYXJndiA9IGFyZ3YKKyAgICAgICAgc2VsZi5leHRlbnNpb25OYW1lID0gYXJndgorICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCisgICAgICAgIHNlbGYub2JqZWN0cyA9IG9iamVjdHMKKyAgICAgICAgc2VsZi5wcm90b3MgPSBwcm90b3MKKyAgICAgICAgc2VsZi5saW5laW5mbyA9IHNvdXJjZWxpbmVpbmZvKCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHByaW50KHNlbGYuZ2VuZXJhdGUoc2VsZi5leHRlbnNpb25OYW1lKSkKKworICAgIGRlZiBnZW5lcmF0ZShzZWxmLCBleHRlbnNpb25OYW1lKToKKyAgICAgICAgY29weXJpZ2h0ID0gc2VsZi5nZW5lcmF0ZV9jb3B5cmlnaHQoKQorICAgICAgICBoZWFkZXIgPSBzZWxmLmdlbmVyYXRlX2hlYWRlcihleHRlbnNpb25OYW1lKQorICAgICAgICBib2R5ID0gc2VsZi5nZW5lcmF0ZV9ib2R5KCkKKyAgICAgICAgZm9vdGVyID0gc2VsZi5nZW5lcmF0ZV9mb290ZXIoKQorICAgICAgICBjb250ZW50cyA9IFtdCisgICAgICAgIGlmIGNvcHlyaWdodDoKKyAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChjb3B5cmlnaHQpCisgICAgICAgIGlmIGhlYWRlcjoKKyAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChoZWFkZXIpCisgICAgICAgIGlmIGJvZHk6CisgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoYm9keSkKKyAgICAgICAgaWYgZm9vdGVyOgorICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKGZvb3RlcikKKworICAgICAgICByZXR1cm4gIlxuXG4iLmpvaW4oY29udGVudHMpCisKKyAgICBkZWYgZ2VuZXJhdGVfY29weXJpZ2h0KHNlbGYpOgorICAgICAgICByZXR1cm4gIiIiLyogVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gIERPIE5PVCBFRElULiAqLworCisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFZhbHZlIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBMdW5hckcsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBdXRob3I6IEpvbiBBc2hidXJuIDxqb25AbHVuYXJnLmNvbT4KKyAqIEF1dGhvcjogVG9iaW4gRWhsaXMgPHRvYmluQGx1bmFyZy5jb20+CisgKiBBdXRob3I6IFBldGVyIExvaHJtYW5uIDxwZXRlcmxAdmFsdmVzb2Z0d2FyZS5jb20+CisgKi8iIiIKKworICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZiwgZXh0ZW5zaW9uTmFtZSk6CisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oWyIjaW5jbHVkZSA8IiArIGggKyAiPiIgZm9yIGggaW4gc2VsZi5oZWFkZXJzXSkKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2VuZXJhdGVfZm9vdGVyKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX2dlbmVyYXRlX3RyYWNlX2Z1bmNfcHJvdG9zKHNlbGYpOgorICAgICAgICBmdW5jX3Byb3RvcyA9IFtdCisgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnI2lmZGVmIF9fY3BsdXNwbHVzJykKKyAgICAgICAgZnVuY19wcm90b3MuYXBwZW5kKCdleHRlcm4iQyIgeycpCisgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnI2VuZGlmJykKKyAgICAgICAgZnVuY19wcm90b3MuYXBwZW5kKCcvLyBIb29rZWQgZnVuY3Rpb24gcHJvdG90eXBlc1xuJykKKyAgICAgICAgZm9yIGV4dCBpbiB2dWxrYW4uZXh0ZW5zaW9uc19hbGw6CisgICAgICAgICAgICBpZiBleHQuaWZkZWY6CisgICAgICAgICAgICAgICAgZnVuY19wcm90b3MuYXBwZW5kKCcjaWZkZWYgJXMnICUgZXh0LmlmZGVmKQorICAgICAgICAgICAgZm9yIHByb3RvIGluIGV4dC5wcm90b3M6CisgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBub3QgaW4gcHJvdG9fZXhjbHVzaW9uczoKKyAgICAgICAgICAgICAgICAgICAgZnVuY19wcm90b3MuYXBwZW5kKCdWS1RSQUNFUl9FWFBPUlQgJXM7JyAlIHByb3RvLmNfZnVuYyhwcmVmaXg9Il9fSE9PS0VEX3ZrIiwgYXR0cj0iVktBUEkiKSkKKworICAgICAgICAgICAgICAgICMgTG9hZGVyTGF5ZXJJbnRlcmZhY2UgVjAKKyAgICAgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIFsgJ0dldEluc3RhbmNlUHJvY0FkZHInLCAnR2V0RGV2aWNlUHJvY0FkZHInXToKKyAgICAgICAgICAgICAgICAgICAgZnVuY19wcm90b3MuYXBwZW5kKCdWS19MQVlFUl9FWFBPUlQgJXM7JyAlIHByb3RvLmNfZnVuYyhwcmVmaXg9IlZLX0xBWUVSX0xVTkFSR192a3RyYWNlIiwgYXR0cj0iVktBUEkiKSkKKyAgICAgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIFsgJ0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzJywgJ0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMnLCAnRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcycgXToKKyAgICAgICAgICAgICAgICAgICAgZnVuY19wcm90b3MuYXBwZW5kKCdWS19MQVlFUl9FWFBPUlQgJXM7JyAlIHByb3RvLmNfZnVuYyhwcmVmaXg9InZrIiwgYXR0cj0iVktBUEkiKSkKKworICAgICAgICAgICAgaWYgZXh0LmlmZGVmOgorICAgICAgICAgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnI2VuZGlmIC8qICVzICovJyAlIGV4dC5pZmRlZikKKworICAgICAgICBmdW5jX3Byb3Rvcy5hcHBlbmQoJyNpZmRlZiBfX2NwbHVzcGx1cycpCisgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnfScpCisgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnI2VuZGlmJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihmdW5jX3Byb3RvcykKKworICAgIGRlZiBfZ2VuZXJhdGVfdHJhY2VfZnVuY19wcm90b3NfZXh0KHNlbGYsIGV4dGVuc2lvbk5hbWUpOgorICAgICAgICBmdW5jX3Byb3RvcyA9IFtdCisgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnLy8gSG9va2VkIGZ1bmN0aW9uIHByb3RvdHlwZXNcbicpCisgICAgICAgIGZvciBleHQgaW4gdnVsa2FuLmV4dGVuc2lvbnNfYWxsOgorICAgICAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUubG93ZXIoKSA9PSBleHQubmFtZS5sb3dlcigpKToKKyAgICAgICAgICAgICAgICBpZiBleHQuaWZkZWY6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnI2lmZGVmICVzJyAlIGV4dC5pZmRlZikKKyAgICAgICAgICAgICAgICBmb3IgcHJvdG8gaW4gZXh0LnByb3RvczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBub3QgaW4gcHJvdG9fZXhjbHVzaW9uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnVktUUkFDRVJfRVhQT1JUICVzOycgJSBwcm90by5jX2Z1bmMocHJlZml4PSJfX0hPT0tFRF92ayIsIGF0dHI9IlZLQVBJIikpCisKKyAgICAgICAgICAgICAgICAgICAgIyBMb2FkZXJMYXllckludGVyZmFjZSBWMAorICAgICAgICAgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIFsgJ0dldEluc3RhbmNlUHJvY0FkZHInLCAnR2V0RGV2aWNlUHJvY0FkZHInXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnVktfTEFZRVJfRVhQT1JUICVzOycgJSBwcm90by5jX2Z1bmMocHJlZml4PSJWS19MQVlFUl9MVU5BUkdfdmt0cmFjZSIsIGF0dHI9IlZLQVBJIikpCisgICAgICAgICAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgaW4gWyAnRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnLCAnRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMnLCAnRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcycgXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnVktfTEFZRVJfRVhQT1JUICVzOycgJSBwcm90by5jX2Z1bmMocHJlZml4PSJ2ayIsIGF0dHI9IlZLQVBJIikpCisKKyAgICAgICAgICAgICAgICBpZiBleHQuaWZkZWY6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNfcHJvdG9zLmFwcGVuZCgnI2VuZGlmIC8qICVzICovJyAlIGV4dC5pZmRlZikKKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGZ1bmNfcHJvdG9zKQorCisgICAgIyBSZXR1cm4gc2V0IG9mIHByaW50ZiAnJScgcXVhbGlmaWVyLCBpbnB1dCB0byB0aGF0IHF1YWxpZmllciwgYW5kIGFueSBkZXJlZmVyZW5jZQorICAgIGRlZiBfZ2V0X3ByaW50Zl9wYXJhbXMoc2VsZiwgdmtfdHlwZSwgbmFtZSwgb3V0cHV0X3BhcmFtKToKKyAgICAgICAgZGVyZWYgPSAiIgorICAgICAgICAjIFRPRE8gOiBOZWVkIEVOVU0gYW5kIFNUUlVDVCBjaGVja3MgaGVyZQorICAgICAgICBpZiAiVmtJbWFnZUxheW91dCIgaW4gdmtfdHlwZToKKyAgICAgICAgICAgIHJldHVybiAoIiVzIiwgInN0cmluZ18lcyglcykiICUgKHZrX3R5cGUucmVwbGFjZSgnY29uc3QgJywgJycpLnN0cmlwKCcqJyksIG5hbWUpLCBkZXJlZikKKyAgICAgICAgaWYgIlZrQ2xlYXJDb2xvciIgaW4gdmtfdHlwZToKKyAgICAgICAgICAgIHJldHVybiAoIiVwIiwgIih2b2lkKikmJXMiICUgbmFtZSwgZGVyZWYpCisgICAgICAgIGlmICJfdHlwZSIgaW4gdmtfdHlwZS5sb3dlcigpOiAjIFRPRE8gOiBUaGlzIHNob3VsZCBiZSBnZW5lcmljIEVOVU0gY2hlY2sKKyAgICAgICAgICAgIHJldHVybiAoIiVzIiwgInN0cmluZ18lcyglcykiICUgKHZrX3R5cGUucmVwbGFjZSgnY29uc3QgJywgJycpLnN0cmlwKCcqJyksIG5hbWUpLCBkZXJlZikKKyAgICAgICAgaWYgImNoYXIqIiBpbiB2a190eXBlOgorICAgICAgICAgICAgcmV0dXJuICgiXFxcIiVzXFxcIiIsIG5hbWUsICIqIikKKyAgICAgICAgaWYgInVpbnQ2NF90IiBpbiB2a190eXBlOgorICAgICAgICAgICAgaWYgJyonIGluIHZrX3R5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiJVwiIFBSSXU2NCBcIiIsICAiKCVzID09IE5VTEwpID8gMCA6ICooJXMpIiAlIChuYW1lLCBuYW1lKSwgIioiKQorICAgICAgICAgICAgcmV0dXJuICgiJVwiIFBSSXU2NCBcIiIsIG5hbWUsIGRlcmVmKQorICAgICAgICBpZiAidWludDMyX3QiIGluIHZrX3R5cGU6CisgICAgICAgICAgICBpZiAnKicgaW4gdmtfdHlwZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCIldSIsICAiKCVzID09IE5VTEwpID8gMCA6ICooJXMpIiAlIChuYW1lLCBuYW1lKSwgIioiKQorICAgICAgICAgICAgcmV0dXJuICgiJXUiLCBuYW1lLCBkZXJlZikKKyAgICAgICAgaWYgInhjYl92aXN1YWxpZF90IiBpbiB2a190eXBlOgorICAgICAgICAgICAgaWYgJyonIGluIHZrX3R5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiJXUiLCAgIiglcyA9PSBOVUxMKSA/IDAgOiAqKCVzKSIgJSAobmFtZSwgbmFtZSksICIqIikKKyAgICAgICAgICAgIHJldHVybiAoIiV1IiwgbmFtZSwgZGVyZWYpCisgICAgICAgIGlmICJWaXN1YWxJRCIgaW4gdmtfdHlwZToKKyAgICAgICAgICAgIHJldHVybiAoIiVcIiBQUkl1NjQgXCIiLCAiKHVpbnQ2NF90KSVzIiAlIG5hbWUsIGRlcmVmKQorICAgICAgICBpZiAiVmtCb29sMzIiIGluIHZrX3R5cGU6CisgICAgICAgICAgICBpZiAnKicgaW4gdmtfdHlwZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCIlcyIsICAiKColcyA9PSBWS19UUlVFKSA/IFwiVktfVFJVRVwiIDogXCJWS19GQUxTRVwiIiAlIChuYW1lKSwgIioiKQorICAgICAgICAgICAgcmV0dXJuICgiJXMiLCAiKCVzID09IFZLX1RSVUUpID8gXCJWS19UUlVFXCIgOiBcIlZLX0ZBTFNFXCIiICUobmFtZSksIGRlcmVmKQorICAgICAgICBpZiAic2l6ZV90IiBpbiB2a190eXBlOgorICAgICAgICAgICAgaWYgJyonIGluIHZrX3R5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiXCIgVktfU0laRV9UX1NQRUNJRklFUiBcIiIsICIoJXMgPT0gTlVMTCkgPyAwIDogKiglcykiICUgKG5hbWUsIG5hbWUpLCAiKiIpCisgICAgICAgICAgICByZXR1cm4gKCJcIiBWS19TSVpFX1RfU1BFQ0lGSUVSIFwiIiwgbmFtZSwgZGVyZWYpCisgICAgICAgIGlmICJmbG9hdCIgaW4gdmtfdHlwZToKKyAgICAgICAgICAgIGlmICdbJyBpbiB2a190eXBlOiAjIGhhbmRsZSBhcnJheSwgY3VycmVudCBoYXJkLWNvZGVkIHRvIDQgKFRPRE86IE1ha2UgdGhpcyBkeW5hbWljKQorICAgICAgICAgICAgICAgIHJldHVybiAoIlslZiwgJWYsICVmLCAlZl0iLCAiJXNbMF0sICVzWzFdLCAlc1syXSwgJXNbM10iICUgKG5hbWUsIG5hbWUsIG5hbWUsIG5hbWUpLCBkZXJlZikKKyAgICAgICAgICAgIHJldHVybiAoIiVmIiwgbmFtZSwgZGVyZWYpCisgICAgICAgIGlmICJib29sIiBpbiB2a190eXBlIG9yICd4Y2JfcmFuZHJfY3J0Y190JyBpbiB2a190eXBlOgorICAgICAgICAgICAgcmV0dXJuICgiJXUiLCBuYW1lLCBkZXJlZikKKyAgICAgICAgaWYgVHJ1ZSBpbiBbdCBpbiB2a190eXBlLmxvd2VyKCkgZm9yIHQgaW4gWyJpbnQiLCAiZmxhZ3MiLCAibWFzayIsICJ4Y2Jfd2luZG93X3QiXV06CisgICAgICAgICAgICBpZiAnWycgaW4gdmtfdHlwZTogIyBoYW5kbGUgYXJyYXksIGN1cnJlbnQgaGFyZC1jb2RlZCB0byA0IChUT0RPOiBNYWtlIHRoaXMgZHluYW1pYykKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJbJWksICVpLCAlaSwgJWldIiwgIiVzWzBdLCAlc1sxXSwgJXNbMl0sICVzWzNdIiAlIChuYW1lLCBuYW1lLCBuYW1lLCBuYW1lKSwgZGVyZWYpCisgICAgICAgICAgICBpZiAnKicgaW4gdmtfdHlwZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCIlaSIsICIoJXMgPT0gTlVMTCkgPyAwIDogKiglcykiICUgKG5hbWUsIG5hbWUpLCAiKiIpCisgICAgICAgICAgICByZXR1cm4gKCIlaSIsIG5hbWUsIGRlcmVmKQorICAgICAgICBpZiBvdXRwdXRfcGFyYW06CisgICAgICAgICAgICByZXR1cm4gKCIlcCB7JVwiIFBSSXg2NCBcIn0iLCAiKHZvaWQqKSVzLCAoJXMgPT0gTlVMTCkgPyAwIDogKHVpbnQ2NF90KSooJXMpIiAlIChuYW1lLCBuYW1lLCBuYW1lKSwgZGVyZWYpCisgICAgICAgIHJldHVybiAoIiVwIiwgIih2b2lkKikoJXMpIiAlIG5hbWUsIGRlcmVmKQorCisgICAgZGVmIF9nZW5lcmF0ZV9pbml0X2Z1bmNzKHNlbGYpOgorICAgICAgICBpbml0X3RyYWNlciA9IFtdCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgndm9pZCBzZW5kX3ZrX2FwaV92ZXJzaW9uX3BhY2tldCgpXG57JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgcGFja2V0X3ZrQXBpVmVyc2lvbiogcFBhY2tldDsnKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyAgICB2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXI7JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgcEhlYWRlciA9IHZrdHJhY2VfY3JlYXRlX3RyYWNlX3BhY2tldChWS1RSQUNFX1RJRF9WVUxLQU4sIFZLVFJBQ0VfVFBJX1ZLX3ZrQXBpVmVyc2lvbiwgc2l6ZW9mKHBhY2tldF92a0FwaVZlcnNpb24pLCAwKTsnKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmtBcGlWZXJzaW9uKHBIZWFkZXIpOycpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIHBQYWNrZXQtPnZlcnNpb24gPSBWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pOycpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOycpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIEZJTklTSF9UUkFDRV9QQUNLRVQoKTtcbn1cbicpCisKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCdleHRlcm4gVktUUkFDRV9DUklUSUNBTF9TRUNUSU9OIGdfbWVtSW5mb0xvY2s7JykKKworICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyNpZmRlZiBXSU4zMlxuJykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCdCT09MIENBTExCQUNLIEluaXRUcmFjZXIoX0lub3V0XyBQSU5JVF9PTkNFIGluaXRPbmNlLCBfSW5vdXRfb3B0XyBQVk9JRCBwYXJhbSwgX091dF9vcHRfIFBWT0lEICpscENvbnRleHQpXG57JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcjZWxpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKVxuJykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCd2b2lkIEluaXRUcmFjZXIodm9pZClcbnsnKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyNlbmRpZlxuJykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcjaWYgZGVmaW5lZChBTkRST0lEKScpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIC8vIE9uIEFuZHJvaWQsIHdlIGNhbiB1c2UgYW4gYWJzdHJhY3Qgc29ja2V0IHRvIGZpdCBwZXJtaXNzaW9ucyBtb2RlbCcpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIGNvbnN0IGNoYXIgKmlwQWRkciA9ICJsb2NhbGFic3RyYWN0IjsnKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyAgICBjb25zdCBjaGFyICppcFBvcnQgPSAidmt0cmFjZSI7JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgZ01lc3NhZ2VTdHJlYW0gPSB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fY3JlYXRlX3BvcnRfc3RyaW5nKEZBTFNFLCBpcEFkZHIsIGlwUG9ydCk7JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcjZWxzZScpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIGNvbnN0IGNoYXIgKmlwQWRkciA9IHZrdHJhY2VfZ2V0X2dsb2JhbF92YXIoIlZLVFJBQ0VfTElCX0lQQUREUiIpOycpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIGlmIChpcEFkZHIgPT0gTlVMTCknKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyAgICAgICAgaXBBZGRyID0gIjEyNy4wLjAuMSI7JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgZ01lc3NhZ2VTdHJlYW0gPSB2a3RyYWNlX01lc3NhZ2VTdHJlYW1fY3JlYXRlKEZBTFNFLCBpcEFkZHIsIFZLVFJBQ0VfQkFTRV9QT1JUICsgVktUUkFDRV9USURfVlVMS0FOKTsnKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyNlbmRpZicpCisgICAgICAgIGluaXRfdHJhY2VyLmFwcGVuZCgnICAgIHZrdHJhY2VfdHJhY2Vfc2V0X3RyYWNlX2ZpbGUodmt0cmFjZV9GaWxlTGlrZV9jcmVhdGVfbXNnKGdNZXNzYWdlU3RyZWFtKSk7JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgdmt0cmFjZV90cmFjZWxvZ19zZXRfdHJhY2VyX2lkKFZLVFJBQ0VfVElEX1ZVTEtBTik7JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgdmt0cmFjZV9jcmVhdGVfY3JpdGljYWxfc2VjdGlvbigmZ19tZW1JbmZvTG9jayk7JykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgaWYgKGdNZXNzYWdlU3RyZWFtICE9IE5VTEwpJykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgICAgIHNlbmRfdmtfYXBpX3ZlcnNpb25fcGFja2V0KCk7XG4nKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyNpZmRlZiBXSU4zMlxuJykKKyAgICAgICAgaW5pdF90cmFjZXIuYXBwZW5kKCcgICAgcmV0dXJuIHRydWU7XG59XG4nKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyNlbGlmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpXG4nKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyAgICByZXR1cm47XG59XG4nKQorICAgICAgICBpbml0X3RyYWNlci5hcHBlbmQoJyNlbmRpZlxuJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihpbml0X3RyYWNlcikKKworICAgICMgVGFrZSBhIGxpc3Qgb2YgcGFyYW1zIGFuZCByZXR1cm4gYSBsaXN0IG9mIGRpY3RzIHcvIHB0ciBwYXJhbSBkZXRhaWxzCisgICAgZGVmIF9nZXRfcGFja2V0X3B0cl9wYXJhbV9saXN0KHNlbGYsIHBhcmFtcyk6CisgICAgICAgIHB0cl9wYXJhbV9saXN0ID0gW10KKyAgICAgICAgIyBUT0RPIDogVGhpcyBpcyBhIHNsaWdodGx5IG5pY2VyIHdheSB0byBoYW5kbGUgY3VzdG9tIGNhc2VzIHRoYW4gaW5pdGlhbCBjb2RlLCBob3dldmVyCisgICAgICAgICMgICB0aGlzIGNhbiBzdGlsbCBiZSBmdXJ0aGVyIGdlbmVyYWxpemVkIHRvIGVsaW1pbmF0ZSBtb3JlIGN1c3RvbSBjb2RlCisgICAgICAgICMgICBiaWcgY2FzZSB0byBoYW5kbGUgaXMgd2hlbiBwdHJzIHRvIHN0cnVjdHMgaGF2ZSBlbWJlZGRlZCBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgYWNjb3VudGVkIGZvciBpbiBwYWNrZXQKKyAgICAgICAgY3VzdG9tX3B0cl9kaWN0ID0geydWa0RldmljZUNyZWF0ZUluZm8nOiB7J2FkZF90eHQnOiAnYWRkX1ZrRGV2aWNlQ3JlYXRlSW5mb190b19wYWNrZXQocEhlYWRlciwgKFZrRGV2aWNlQ3JlYXRlSW5mbyoqKSAmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSwgcENyZWF0ZUluZm8pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICcnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa0FwcGxpY2F0aW9uSW5mbyc6IHsnYWRkX3R4dCc6ICdhZGRfVmtBcHBsaWNhdGlvbkluZm9fdG9fcGFja2V0KHBIZWFkZXIsIChWa0FwcGxpY2F0aW9uSW5mbyoqKSYocFBhY2tldC0+cEFwcGxpY2F0aW9uSW5mbyksIHBBcHBsaWNhdGlvbkluZm8pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrUGh5c2ljYWxEZXZpY2UnOiB7J2FkZF90eHQnOiAndmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEdwdXMpLCAqcEdwdUNvdW50KnNpemVvZihWa1BoeXNpY2FsRGV2aWNlKSwgcEdwdXMpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5hbGl6ZV90eHQnOiAnZGVmYXVsdCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrSW1hZ2VDcmVhdGVJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSwgc2l6ZW9mKFZrSW1hZ2VDcmVhdGVJbmZvKSwgcENyZWF0ZUluZm8pO1xuJworCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyksIHNpemVvZih1aW50MzJfdCkgKiBwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50LCBwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKSk7XG4nCisJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSknfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa0J1ZmZlckNyZWF0ZUluZm8nOiB7J2FkZF90eHQnOiAndmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pLCBzaXplb2YoVmtCdWZmZXJDcmVhdGVJbmZvKSwgcENyZWF0ZUluZm8pO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyksIHNpemVvZih1aW50MzJfdCkgKiBwQ3JlYXRlSW5mby0+cXVldWVGYW1pbHlJbmRleENvdW50LCBwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSknfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwRGF0YVNpemUnOiB7J2FkZF90eHQnOiAndmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cERhdGFTaXplKSwgc2l6ZW9mKHNpemVfdCksICZfZGF0YVNpemUpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICd2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGF0YVNpemUpKSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BEYXRhJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBEYXRhKSwgX2RhdGFTaXplLCBwRGF0YSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5hbGl6ZV90eHQnOiAnZGVmYXVsdCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BOYW1lJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBOYW1lKSwgKChwTmFtZSAhPSBOVUxMKSA/IFJPVU5EVVBfVE9fNChzdHJsZW4ocE5hbWUpICsgMSkgOiAwKSwgcE5hbWUpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ2RlZmF1bHQnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwTWFya2VyJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBNYXJrZXIpLCAoKHBNYXJrZXIgIT0gTlVMTCkgPyBST1VORFVQX1RPXzQoc3RybGVuKHBNYXJrZXIpICsgMSkgOiAwKSwgcE1hcmtlciknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICdkZWZhdWx0J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncEV4dE5hbWUnOiB7J2FkZF90eHQnOiAndmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cEV4dE5hbWUpLCAoKHBFeHROYW1lICE9IE5VTEwpID8gUk9VTkRVUF9UT180KHN0cmxlbihwRXh0TmFtZSkgKyAxKSA6IDApLCBwRXh0TmFtZSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5hbGl6ZV90eHQnOiAnZGVmYXVsdCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BEZXNjcmlwdG9yU2V0cyc6IHsnYWRkX3R4dCc6ICd2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wRGVzY3JpcHRvclNldHMpLCBjdXN0b21TaXplLCBwRGVzY3JpcHRvclNldHMpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICdkZWZhdWx0J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncFNwYXJzZU1lbW9yeVJlcXVpcmVtZW50cyc6IHsnYWRkX3R4dCc6ICd2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRzKSwgKCpwU3BhcnNlTWVtb3J5UmVxdWlyZW1lbnRDb3VudCkgKiBzaXplb2YoVmtTcGFyc2VJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyksIHBTcGFyc2VNZW1vcnlSZXF1aXJlbWVudHMpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICdkZWZhdWx0J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncEFsbG9jYXRvcic6IHsnYWRkX3R4dCc6ICd2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdG9yKSwgc2l6ZW9mKFZrQWxsb2NhdGlvbkNhbGxiYWNrcyksIE5VTEwpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5hbGl6ZV90eHQnOiAnZGVmYXVsdCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrU3BhcnNlSW1hZ2VGb3JtYXRQcm9wZXJ0aWVzJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBQcm9wZXJ0aWVzKSwgKCpwUHJvcGVydHlDb3VudCkgKiBzaXplb2YoVmtTcGFyc2VJbWFnZUZvcm1hdFByb3BlcnRpZXMpLCBwUHJvcGVydGllcyknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ2RlZmF1bHQnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa1NwYXJzZU1lbW9yeUJpbmRJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCaW5kSW5mbyksIG51bUJpbmRpbmdzICogc2l6ZW9mKFZrU3BhcnNlTWVtb3J5QmluZEluZm8pLCBwQmluZEluZm8pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICdkZWZhdWx0J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtTcGFyc2VJbWFnZU1lbW9yeUJpbmRJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBCaW5kSW5mbyksIG51bUJpbmRpbmdzICogc2l6ZW9mKFZrU3BhcnNlSW1hZ2VNZW1vcnlCaW5kSW5mbyksIHBCaW5kSW5mbyknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ2RlZmF1bHQnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyc6IHsnYWRkX3R4dCc6ICd2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyksIHBDcmVhdGVJbmZvKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBDb2xvckF0dGFjaG1lbnRzKSwgY29sb3JDb3VudCAqIHNpemVvZihWa0NvbG9yQXR0YWNobWVudEJpbmRJbmZvKSwgcENyZWF0ZUluZm8tPnBDb2xvckF0dGFjaG1lbnRzKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSwgZHNTaXplLCBwQ3JlYXRlSW5mby0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICd2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cENvbG9yQXR0YWNobWVudHMpKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSknfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa1JlbmRlclBhc3NDcmVhdGVJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSwgc2l6ZW9mKFZrUmVuZGVyUGFzc0NyZWF0ZUluZm8pLCBwQ3JlYXRlSW5mbyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBDb2xvckZvcm1hdHMpLCBjb2xvckNvdW50ICogc2l6ZW9mKFZrRm9ybWF0KSwgcENyZWF0ZUluZm8tPnBDb2xvckZvcm1hdHMpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wQ29sb3JMYXlvdXRzKSwgY29sb3JDb3VudCAqIHNpemVvZihWa0ltYWdlTGF5b3V0KSwgcENyZWF0ZUluZm8tPnBDb2xvckxheW91dHMpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wQ29sb3JMb2FkT3BzKSwgY29sb3JDb3VudCAqIHNpemVvZihWa0F0dGFjaG1lbnRMb2FkT3ApLCBwQ3JlYXRlSW5mby0+cENvbG9yTG9hZE9wcyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBDb2xvclN0b3JlT3BzKSwgY29sb3JDb3VudCAqIHNpemVvZihWa0F0dGFjaG1lbnRTdG9yZU9wKSwgcENyZWF0ZUluZm8tPnBDb2xvclN0b3JlT3BzKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cENvbG9yTG9hZENsZWFyVmFsdWVzKSwgY29sb3JDb3VudCAqIHNpemVvZihWa0NsZWFyQ29sb3IpLCBwQ3JlYXRlSW5mby0+cENvbG9yTG9hZENsZWFyVmFsdWVzKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICd2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cENvbG9yRm9ybWF0cykpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wQ29sb3JMYXlvdXRzKSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBDb2xvckxvYWRPcHMpKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cENvbG9yU3RvcmVPcHMpKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cENvbG9yTG9hZENsZWFyVmFsdWVzKSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pKSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSwgc2l6ZW9mKFZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKSwgcENyZWF0ZUluZm8pO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFNldExheW91dHMpLCBwQ3JlYXRlSW5mby0+c2V0TGF5b3V0Q291bnQgKiBzaXplb2YoVmtEZXNjcmlwdG9yU2V0TGF5b3V0KSwgcENyZWF0ZUluZm8tPnBTZXRMYXlvdXRzKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzKSwgcENyZWF0ZUluZm8tPnB1c2hDb25zdGFudFJhbmdlQ291bnQgKiBzaXplb2YoVmtQdXNoQ29uc3RhbnRSYW5nZSksIHBDcmVhdGVJbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzKTsnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wU2V0TGF5b3V0cykpO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUHVzaENvbnN0YW50UmFuZ2VzKSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pKSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrTWVtb3J5QWxsb2NhdGVJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8pLCBzaXplb2YoVmtNZW1vcnlBbGxvY2F0ZUluZm8pLCBwQWxsb2NhdGVJbmZvKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgYWRkX2FsbG9jX21lbW9yeV90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPnBOZXh0KSwgcEFsbG9jYXRlSW5mby0+cE5leHQpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICd2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQWxsb2NhdGVJbmZvKSknfSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICdWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvcyksIGNvdW50KnNpemVvZihWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKSwgcENyZWF0ZUluZm9zKTtcbicKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBhZGRfVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mb3NfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsIChWa0dyYXBoaWNzUGlwZWxpbmVDcmVhdGVJbmZvKilwUGFja2V0LT5wQ3JlYXRlSW5mb3MsIHBDcmVhdGVJbmZvcywgY291bnQpJywKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvcykpJ30sCisjICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvJzogeydhZGRfdHh0JzogJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvcyksIGNvdW50KnNpemVvZihWa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm8pLCBwQ3JlYXRlSW5mb3MpO1xuJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGFkZF9Wa0NvbXB1dGVQaXBlbGluZUNyZWF0ZUluZm9zX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAoVmtDb21wdXRlUGlwZWxpbmVDcmVhdGVJbmZvKilwUGFja2V0LT5wQ3JlYXRlSW5mb3MsIHBDcmVhdGVJbmZvcywgY291bnQpJywKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvcykpJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8nOiB7J2FkZF90eHQnOiAndmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pLCBzaXplb2YoVmtEZXNjcmlwdG9yUG9vbENyZWF0ZUluZm8pLCBwQ3JlYXRlSW5mbyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUG9vbFNpemVzKSwgcENyZWF0ZUluZm8tPnBvb2xTaXplQ291bnQgKiBzaXplb2YoVmtEZXNjcmlwdG9yUG9vbFNpemUpLCBwQ3JlYXRlSW5mby0+cFBvb2xTaXplcyknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUG9vbFNpemVzKSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSknfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa0Rlc2NyaXB0b3JTZXRMYXlvdXRDcmVhdGVJbmZvJzogeydhZGRfdHh0JzogJ2FkZF9jcmVhdGVfZHNfbGF5b3V0X3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAmcFBhY2tldC0+cENyZWF0ZUluZm8sIHBDcmVhdGVJbmZvKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsaXplX3R4dCc6ICcvLyBwQ3JlYXRlSW5mbyBmaW5hbGl6ZWQgaW4gYWRkX2NyZWF0ZV9kc19sYXlvdXRfdG9fdHJhY2VfcGFja2V0J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSJzogeydhZGRfdHh0JzogICAgICAndmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8pLCBzaXplb2YoVmtTd2FwY2hhaW5DcmVhdGVJbmZvS0hSKSwgcENyZWF0ZUluZm8pO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyksIHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5xdWV1ZUZhbWlseUluZGV4Q291bnQgKiBzaXplb2YodWludDMyX3QpLCBwQ3JlYXRlSW5mby0+cFF1ZXVlRmFtaWx5SW5kaWNlcyknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluYWxpemVfdHh0JzogJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSknfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8nOiB7J2FkZF90eHQnOiAgICAgICd2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mbyksIHNpemVvZihWa1NoYWRlck1vZHVsZUNyZWF0ZUluZm8pLCBwQ3JlYXRlSW5mbyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wQ29kZSksIHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5jb2RlU2l6ZSwgcENyZWF0ZUluZm8tPnBDb2RlKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5hbGl6ZV90eHQnOiAndmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBDb2RlKSk7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvKSknfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGZvciBwIGluIHBhcmFtczoKKyAgICAgICAgICAgIHBwX2RpY3QgPSB7fQorICAgICAgICAgICAgaWYgJyonIGluIHAudHkgYW5kIHAubmFtZSBub3QgaW4gWydwVGFnJywgJ3BVc2VyRGF0YSddOgorICAgICAgICAgICAgICAgIGlmICdjb25zdCcgaW4gcC50eS5sb3dlcigpIGFuZCAnY291bnQnIGluIHBhcmFtc1twYXJhbXMuaW5kZXgocCktMV0ubmFtZS5sb3dlcigpOgorICAgICAgICAgICAgICAgICAgICBwcF9kaWN0WydhZGRfdHh0J10gPSAndmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYocFBhY2tldC0+JXMpLCAlcypzaXplb2YoJXMpLCAlcyknICUgKHAubmFtZSwgcGFyYW1zW3BhcmFtcy5pbmRleChwKS0xXS5uYW1lLCBwLnR5LnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpLCBwLm5hbWUpCisgICAgICAgICAgICAgICAgZWxpZiAncE9mZnNldHMnID09IHAubmFtZTogIyBUT0RPIDogVGhpcyBpcyBhIGN1c3RvbSBjYXNlIGZvciBCaW5kVmVydGV4QnVmZmVycyBsYXN0IHBhcmFtLCBuZWVkIHRvIGNsZWFuIHRoaXMgdXAKKyAgICAgICAgICAgICAgICAgICAgcHBfZGljdFsnYWRkX3R4dCddID0gJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPiVzKSwgJXMqc2l6ZW9mKCVzKSwgJXMpJyAlIChwLm5hbWUsIHBhcmFtc1twYXJhbXMuaW5kZXgocCktMl0ubmFtZSwgcC50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSwgcC5uYW1lKQorICAgICAgICAgICAgICAgIGVsaWYgcC50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSBpbiBjdXN0b21fcHRyX2RpY3Q6CisgICAgICAgICAgICAgICAgICAgIHBwX2RpY3RbJ2FkZF90eHQnXSA9IGN1c3RvbV9wdHJfZGljdFtwLnR5LnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpXVsnYWRkX3R4dCddCisgICAgICAgICAgICAgICAgICAgIHBwX2RpY3RbJ2ZpbmFsaXplX3R4dCddID0gY3VzdG9tX3B0cl9kaWN0W3AudHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJyldWydmaW5hbGl6ZV90eHQnXQorICAgICAgICAgICAgICAgIGVsaWYgcC5uYW1lIGluIGN1c3RvbV9wdHJfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgcHBfZGljdFsnYWRkX3R4dCddID0gY3VzdG9tX3B0cl9kaWN0W3AubmFtZV1bJ2FkZF90eHQnXQorICAgICAgICAgICAgICAgICAgICBwcF9kaWN0WydmaW5hbGl6ZV90eHQnXSA9IGN1c3RvbV9wdHJfZGljdFtwLm5hbWVdWydmaW5hbGl6ZV90eHQnXQorICAgICAgICAgICAgICAgICAgICAjIFRPRE8gOiBUaGlzIGlzIGN1c3RvbSBoYWNrIHRvIGFjY291bnQgZm9yIDIgcERhdGEgaXRlbXMgd2l0aCBkYXRhU2l6ZSBwYXJhbSBmb3Igc2l6aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICdwRGF0YScgPT0gcC5uYW1lIGFuZCAnZGF0YVNpemUnID09IHBhcmFtc1twYXJhbXMuaW5kZXgocCktMV0ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBwX2RpY3RbJ2FkZF90eHQnXSA9IHBwX2RpY3RbJ2FkZF90eHQnXS5yZXBsYWNlKCdfZGF0YVNpemUnLCAnZGF0YVNpemUnKQorICAgICAgICAgICAgICAgIGVsaWYgJ3ZvaWQnIGluIHAudHkgYW5kIChwLm5hbWUgPT0gJ3BEYXRhJyBvciBwLm5hbWUgPT0gJ3BWYWx1ZXMnKToKKyAgICAgICAgICAgICAgICAgICAgcHBfZGljdFsnYWRkX3R4dCddID0gJy8vVE9ETyBGSVhNRSB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT4lcyksIHNpemVvZiglcyksICVzKScgJSAocC5uYW1lLCBwLnR5LnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpLCBwLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHBwX2RpY3RbJ2ZpbmFsaXplX3R4dCddID0gJy8vVE9ETyBGSVhNRSB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJihwUGFja2V0LT4lcykpJyAlIChwLm5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHBfZGljdFsnYWRkX3R4dCddID0gJ3ZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPiVzKSwgc2l6ZW9mKCVzKSwgJXMpJyAlIChwLm5hbWUsIHAudHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJyksIHAubmFtZSkKKyAgICAgICAgICAgICAgICBpZiAnZmluYWxpemVfdHh0JyBub3QgaW4gcHBfZGljdCBvciAnZGVmYXVsdCcgPT0gcHBfZGljdFsnZmluYWxpemVfdHh0J106CisgICAgICAgICAgICAgICAgICAgIHBwX2RpY3RbJ2ZpbmFsaXplX3R4dCddID0gJ3ZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKHBQYWNrZXQtPiVzKSknICUgKHAubmFtZSkKKyAgICAgICAgICAgICAgICBwcF9kaWN0WydpbmRleCddID0gcGFyYW1zLmluZGV4KHApCisgICAgICAgICAgICAgICAgcHRyX3BhcmFtX2xpc3QuYXBwZW5kKHBwX2RpY3QpCisgICAgICAgIHJldHVybiBwdHJfcGFyYW1fbGlzdAorCisgICAgIyBUYWtlIGEgbGlzdCBvZiBwYXJhbXMgYW5kIHJldHVybiBhIGxpc3Qgb2YgcGFja2V0IHNpemUgZWxlbWVudHMKKyAgICBkZWYgX2dldF9wYWNrZXRfc2l6ZShzZWxmLCBleHRlbnNpb25OYW1lLCBwYXJhbXMpOgorICAgICAgICBwcyA9IFtdICMgTGlzdCBvZiBlbGVtZW50cyB0byBiZSBhZGRlZCB0b2dldGhlciB0byBhY2NvdW50IGZvciBwYWNrZXQgc2l6ZSBmb3IgZ2l2ZW4gcGFyYW1zCisgICAgICAgIHNraXBfbGlzdCA9IFtdICMgc3RvcmUgcGFyYW1zIHRoYXQgYXJlIGFscmVhZHkgYWNjb3VudGVkIGZvciBzbyB3ZSBkb24ndCBjb3VudCB0aGVtIHR3aWNlCisgICAgICAgICMgRGljdCBvZiBzcGVjaWZpYyBwYXJhbXMgd2l0aCB1bmlxdWUgY3VzdG9tIHNpemVzCisgICAgICAgICMgVE9ETzogTm93IHVzaW5nIGJpdGZpZWxkcyBmb3IgYWxsIHN0YWdlcywgbmVlZCBwU2V0QmluZFBvaW50cyB0byBhY2NvbW1vZGF0ZSB0aGF0LgorICAgICAgICBjdXN0b21fc2l6ZV9kaWN0ID0geydwU2V0QmluZFBvaW50cyc6ICcoVktfU0hBREVSX1NUQUdFX0NPTVBVVEUgKiBzaXplb2YodWludDMyX3QpKScsICMgQWNjb3VudGluZyBmb3IgbGFyZ2VzdCBwb3NzaWJsZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFInIDogJ3ZrX3NpemVfdmtzd2FwY2hhaW5jcmVhdGVpbmZva2hyKHBDcmVhdGVJbmZvKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBzaXplX2Z1bmNfc3VmZml4ID0gJycKKyAgICAgICAgaWYgZXh0ZW5zaW9uTmFtZS5sb3dlcigpICE9ICJ2a192ZXJzaW9uXzFfMCI6CisgICAgICAgICAgICBzaXplX2Z1bmNfc3VmZml4ID0gJ18lcycgJSBleHRlbnNpb25OYW1lLmxvd2VyKCkKKyAgICAgICAgZm9yIHAgaW4gcGFyYW1zOgorICAgICAgICAgICAgI0ZpcnN0IGhhbmRsZSBjdXN0b20gY2FzZXMKKyAgICAgICAgICAgIGlmIHAubmFtZSBpbiBbJ3BDcmVhdGVJbmZvJywgJ3BTZXRMYXlvdXRJbmZvTGlzdCcsICdwQmVnaW5JbmZvJywgJ3BBbGxvY2F0ZUluZm8nXSBhbmQgJ2tocicgbm90IGluIHAudHkubG93ZXIoKSBhbmQgJ2x1bmFyZycgbm90IGluIHAudHkubG93ZXIoKSBhbmQgJ2V4dCcgbm90IGluIHAudHkubG93ZXIoKToKKyAgICAgICAgICAgICAgICBwcy5hcHBlbmQoJ2dldF9zdHJ1Y3RfY2hhaW5fc2l6ZSVzKCh2b2lkKiklcyknICUgKHNpemVfZnVuY19zdWZmaXgsIHAubmFtZSkpCisgICAgICAgICAgICAgICAgc2tpcF9saXN0LmFwcGVuZChwLm5hbWUpCisgICAgICAgICAgICBlbGlmIHAubmFtZSBpbiBjdXN0b21fc2l6ZV9kaWN0OgorICAgICAgICAgICAgICAgIHBzLmFwcGVuZChjdXN0b21fc2l6ZV9kaWN0W3AubmFtZV0pCisgICAgICAgICAgICAgICAgc2tpcF9saXN0LmFwcGVuZChwLm5hbWUpCisgICAgICAgICAgICBlbGlmIHAudHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykgaW4gY3VzdG9tX3NpemVfZGljdDoKKyAgICAgICAgICAgICAgICB0bXBfdHkgPSBwLnR5LnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpCisgICAgICAgICAgICAgICAgcHMuYXBwZW5kKGN1c3RvbV9zaXplX2RpY3RbdG1wX3R5XSkKKyAgICAgICAgICAgICAgICBza2lwX2xpc3QuYXBwZW5kKHAubmFtZSkKKyAgICAgICAgICAgICMgU2tpcCBhbnkgcGFyYW1zIGFscmVhZHkgaGFuZGxlZAorICAgICAgICAgICAgaWYgcC5uYW1lIGluIHNraXBfbGlzdDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBOb3cgY2hlY2sgdG8gaWRlbnRpZnkgZHluYW1pYyBhcnJheXMgd2hpY2ggZGVwZW5kIG9uIHR3byBwYXJhbXMKKyAgICAgICAgICAgIGlmICdjb3VudCcgaW4gcC5uYW1lLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgbmV4dF9pZHggPSBwYXJhbXMuaW5kZXgocCkrMQorICAgICAgICAgICAgICAgICMgSWYgbmV4dCBlbGVtZW50IGlzIGEgY29uc3QgKiwgdGhlbiBtdWx0aXBseSBjb3VudCBhbmQgYXJyYXkgdHlwZQorICAgICAgICAgICAgICAgIGlmIG5leHRfaWR4IDwgbGVuKHBhcmFtcykgYW5kICcqJyBpbiBwYXJhbXNbbmV4dF9pZHhdLnR5IGFuZCAnY29uc3QnIGluIHBhcmFtc1tuZXh0X2lkeF0udHkubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgJyonIGluIHAudHk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcy5hcHBlbmQoJyolcypzaXplb2YoJXMpJyAlIChwLm5hbWUsIHBhcmFtc1tuZXh0X2lkeF0udHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHMuYXBwZW5kKCclcypzaXplb2YoJXMpJyAlIChwLm5hbWUsIHBhcmFtc1tuZXh0X2lkeF0udHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykpKQorICAgICAgICAgICAgICAgICAgICBza2lwX2xpc3QuYXBwZW5kKHBhcmFtc1tuZXh0X2lkeF0ubmFtZSkKKyAgICAgICAgICAgICAgICBpZiAnYmluZGluZ0NvdW50JyA9PSBwLm5hbWU6ICMgVE9ETyA6IFRoaXMgaXMgY3VzdG9tIGNhc2UgZm9yIENtZEJpbmRWZXJ0ZXhCdWZmZXJzLCBuZWVkIHRvIGNsZWFuIGl0IHVwCisgICAgICAgICAgICAgICAgICAgIHBzLmFwcGVuZCgnJXMqc2l6ZW9mKCVzKScgJSAocC5uYW1lLCBwYXJhbXNbbmV4dF9pZHgrMV0udHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykpKQorICAgICAgICAgICAgICAgICAgICBza2lwX2xpc3QuYXBwZW5kKHBhcmFtc1tuZXh0X2lkeCsxXS5uYW1lKQorICAgICAgICAgICAgICAgIGVsaWYgJyonIGluIHAudHk6ICMgTm90IGEgY3VzdG9tIGFycmF5IHNpemUgd2UncmUgYXdhcmUgb2YsIGJ1dCBwdHIgc28gbmVlZCB0byBhY2NvdW50IGZvciBpdHMgc2l6ZQorICAgICAgICAgICAgICAgICAgICBwcy5hcHBlbmQoJ3NpemVvZiglcyknICUgKHAudHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykpKQorICAgICAgICAgICAgZWxpZiAnKicgaW4gcC50eSBhbmQgcC5uYW1lIG5vdCBpbiBbJ3BTeXNNZW0nLCAncFJlc2VydmVkJ106CisgICAgICAgICAgICAgICAgaWYgJ3BEYXRhJyA9PSBwLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIGlmICdkYXRhU2l6ZScgPT0gcGFyYW1zW3BhcmFtcy5pbmRleChwKS0xXS5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcHMuYXBwZW5kKCdkYXRhU2l6ZScpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgJ2NvdW50ZXJDb3VudCcgPT0gcGFyYW1zW3BhcmFtcy5pbmRleChwKS0xXS5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcHMuYXBwZW5kKCdzaXplb2YoJXMpJyAlIHAudHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjcHMuYXBwZW5kKCcoKHBEYXRhU2l6ZSAhPSBOVUxMICYmIHBEYXRhICE9IE5VTEwpID8gKnBEYXRhU2l6ZSA6IDApJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzLmFwcGVuZCgnc2l6ZW9mKHZvaWQqKScpCisgICAgICAgICAgICAgICAgZWxpZiAnKionIGluIHAudHkgYW5kICd2b2lkJyBpbiBwLnR5OgorICAgICAgICAgICAgICAgICAgICBwcy5hcHBlbmQoJ3NpemVvZih2b2lkKiknKQorICAgICAgICAgICAgICAgIGVsaWYgJ3ZvaWQnIGluIHAudHk6CisgICAgICAgICAgICAgICAgICAgIHBzLmFwcGVuZCgnc2l6ZW9mKCVzKScgJSBwLm5hbWUpCisgICAgICAgICAgICAgICAgZWxpZiAnY2hhcicgaW4gcC50eToKKyAgICAgICAgICAgICAgICAgICAgcHMuYXBwZW5kKCcoKCVzICE9IE5VTEwpID8gUk9VTkRVUF9UT180KHN0cmxlbiglcykgKyAxKSA6IDApJyAlIChwLm5hbWUsIHAubmFtZSkpCisgICAgICAgICAgICAgICAgZWxpZiAncERhdGFTaXplJyBpbiBwLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHBzLmFwcGVuZCgnKChwRGF0YVNpemUgIT0gTlVMTCkgPyBzaXplb2Yoc2l6ZV90KSA6IDApJykKKyAgICAgICAgICAgICAgICBlbGlmICdJTUFHRV9TVUJSRVNPVVJDRScgaW4gcC50eSBhbmQgJ3BTdWJyZXNvdXJjZScgPT0gcC5uYW1lOgorICAgICAgICAgICAgICAgICAgICBwcy5hcHBlbmQoJygocFN1YnJlc291cmNlICE9IE5VTEwpID8gc2l6ZW9mKFZrSW1hZ2VfU1VCUkVTT1VSQ0UpIDogMCknKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBzLmFwcGVuZCgnc2l6ZW9mKCVzKScgJSAocC50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSkpCisgICAgICAgIHJldHVybiBwcworCisgICAgIyBHZW5lcmF0ZSBmdW5jdGlvbnMgdXNlZCB0byB0cmFjZSBBUEkgY2FsbHMgYW5kIHN0b3JlIHRoZSBpbnB1dCBhbmQgcmVzdWx0IGRhdGEgaW50byBhIHBhY2tldAorICAgICMgSGVyZSdzIHRoZSBnZW5lcmFsIGZsb3cgb2YgY29kZSBpbnNlcnRpb24gdy8gb3B0aW9uIGl0ZW1zIGZsYWdnZWQgdy8gIj8iCisgICAgIyBSZXN1bHQgZGVjbD8KKyAgICAjIFBhY2tldCBzdHJ1Y3QgZGVjbAorICAgICMgP1NwZWNpYWwgY2FzZSA6IHNldHVwIGNhbGwgdG8gZnVuY3Rpb24gZmlyc3QgYW5kIGRvIGN1c3RvbSBBUEkgY2FsbCB0aW1lIHRyYWNraW5nCisgICAgIyBDUkVBVEVfUEFDS0VUCisgICAgIyBjYWxsIHJlYWwgZW50cnlwb2ludCBhbmQgZ2V0IHJldHVybiB2YWx1ZSAoaWYgdGhlcmUgaXMgb25lKQorICAgICMgQXNzaWduIHBhY2tldCB2YWx1ZXMKKyAgICAjIEZJTklTSCBwYWNrZXQKKyAgICAjIHJldHVybiByZXN1bHQgaWYgbmVlZGVkCisgICAgZGVmIF9nZW5lcmF0ZV90cmFjZV9mdW5jcyhzZWxmLCBleHRlbnNpb25OYW1lKToKKyAgICAgICAgZnVuY19ib2R5ID0gW10KKyAgICAgICAgbWFudWFsbHlfd3JpdHRlbl9ob29rZWRfZnVuY3MgPSBbJ0FsbG9jYXRlQ29tbWFuZEJ1ZmZlcnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsb2NhdGVNZW1vcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsb2NhdGVEZXNjcmlwdG9yU2V0cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCZWdpbkNvbW1hbmRCdWZmZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlRGVzY3JpcHRvclBvb2wnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlRGV2aWNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZUZyYW1lYnVmZmVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZUluc3RhbmNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZVBpcGVsaW5lQ2FjaGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlUmVuZGVyUGFzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHZXRQaXBlbGluZUNhY2hlRGF0YScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVHcmFwaGljc1BpcGVsaW5lcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVDb21wdXRlUGlwZWxpbmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NtZFBpcGVsaW5lQmFycmllcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDbWRXYWl0RXZlbnRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NtZEJlZ2luUmVuZGVyUGFzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDbWRQdXNoQ29uc3RhbnRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Rlc3Ryb3lJbnN0YW5jZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbnVtZXJhdGVQaHlzaWNhbERldmljZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRnJlZU1lbW9yeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGcmVlRGVzY3JpcHRvclNldHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUXVldWVTdWJtaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUXVldWVCaW5kU3BhcnNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZsdXNoTWFwcGVkTWVtb3J5UmFuZ2VzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0RGV2aWNlUHJvY0FkZHInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0SW5zdGFuY2VQcm9jQWRkcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbnVtZXJhdGVJbnN0YW5jZUV4dGVuc2lvblByb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UXVlcnlQb29sUmVzdWx0cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNYXBNZW1vcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5tYXBNZW1vcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXBkYXRlRGVzY3JpcHRvclNldHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlQ2FwYWJpbGl0aWVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZVN3YXBjaGFpbktIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHZXRTd2FwY2hhaW5JbWFnZXNLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUXVldWVQcmVzZW50S0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI1RPRE8gYWRkIFdheWxhbmQsIE1pcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlWGNiU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVYbGliU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVXaW4zMlN1cmZhY2VLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgIyB2YWxpZGF0ZSB0aGUgbWFudWFsbHlfd3JpdHRlbl9ob29rZWRfZnVuY3MgbGlzdAorICAgICAgICBwcm90b0Z1bmNzID0gW3Byb3RvLm5hbWUgZm9yIHByb3RvIGluIHNlbGYucHJvdG9zXQorICAgICAgICB3c2lfcGxhdGZvcm1fbWFudWFsX2Z1bmNzID0gWydDcmVhdGVXaW4zMlN1cmZhY2VLSFInLCAnQ3JlYXRlWGNiU3VyZmFjZUtIUicsICdDcmVhdGVYbGliU3VyZmFjZUtIUicsICdDcmVhdGVBbmRyb2lkU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsJ0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFInLCAnR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFInXQorICAgICAgICBmb3IgZnVuYyBpbiBtYW51YWxseV93cml0dGVuX2hvb2tlZF9mdW5jczoKKyAgICAgICAgICAgIGlmIChmdW5jIG5vdCBpbiBwcm90b0Z1bmNzKSBhbmQgKGZ1bmMgbm90IGluIHdzaV9wbGF0Zm9ybV9tYW51YWxfZnVuY3MpOgorICAgICAgICAgICAgICAgIHN5cy5leGl0KCJFbnRyeSAnJXMnIGluIG1hbnVhbGx5X3dyaXR0ZW5faG9va2VkX2Z1bmNzIGxpc3QgaXMgbm90IGluIHRoZSB2dWxrYW4gZnVuY3Rpb24gcHJvdG90eXBlcyIgJSBmdW5jKQorCisgICAgICAgICMgcHJvY2VzcyBlYWNoIG9mIHRoZSBlbnRyeXBvaW50IHByb3RvdHlwZXMKKyAgICAgICAgYXBwcm92ZWRfZXh0ID0gWyd2a19raHJfc3VyZmFjZScsICd2a19raHJfc3dhcGNoYWluJywgJ3ZrX2tocl93aW4zMl9zdXJmYWNlJywgJ3ZrX2tocl94Y2Jfc3VyZmFjZScsICd2a19leHRfZGVidWdfcmVwb3J0J10KKyAgICAgICAgZm9yIGV4dCBpbiB2dWxrYW4uZXh0ZW5zaW9uc19hbGw6CisgICAgICAgICAgICBpZiAoZXh0Lm5hbWUubG93ZXIoKSA9PSBleHRlbnNpb25OYW1lLmxvd2VyKCkpIG9yICgoZXh0ZW5zaW9uTmFtZS5sb3dlcigpID09ICd2a192ZXJzaW9uXzFfMCcpIGFuZCAoZXh0Lm5hbWUubG93ZXIoKSBpbiBhcHByb3ZlZF9leHQpKToKKyAgICAgICAgICAgICAgICBmb3IgcHJvdG8gaW4gZXh0LnByb3RvczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBpbiBtYW51YWxseV93cml0dGVuX2hvb2tlZF9mdW5jczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoICcvLyBfX0hPT0tFRF92ayVzIGlzIG1hbnVhbGx5IHdyaXR0ZW4uIExvb2sgaW4gdmt0cmFjZV9saWJfdHJhY2UuY3BwXG4nICUgcHJvdG8ubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBwcm90by5uYW1lIG5vdCBpbiBwcm90b19leGNsdXNpb25zOgorICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3BhY2tldF91cGRhdGVfbGlzdCA9IFtdICMgbm9uLXB0ciBlbGVtZW50cyBwbGFjZWQgZGlyZWN0bHkgaW50byBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9wYWNrZXRfdXBkYXRlX2xpc3QgPSBbXSAjIHB0ciBlbGVtZW50cyB0byBiZSB1cGRhdGVkIGludG8gcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fdHh0ID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9zaXplID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIGluX2RhdGFfc2l6ZSA9IEZhbHNlICMgZmxhZyB3aGVuIHdlIG5lZWQgdG8gY2FwdHVyZSBsb2NhbCBpbnB1dCBzaXplIHZhcmlhYmxlIGZvciBpbi9vdXQgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJ1ZLVFJBQ0VSX0VYUE9SVCBWS0FQSV9BVFRSICVzIFZLQVBJX0NBTEwgX19IT09LRURfdmslcygnICUgKHByb3RvLnJldCwgcHJvdG8ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm90by5wYXJhbXM6ICMgVE9ETyA6IEZvciBhbGwgb2YgdGhlIHB0ciB0eXBlcywgY2hlY2sgdGhlbSBmb3IgTlVMTCBhbmQgcmV0dXJuIDAgaWYgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAlcywnICUgcC5jKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJyonIGluIHAudHkgYW5kIHAubmFtZSBub3QgaW4gWydwU3lzTWVtJywgJ3BSZXNlcnZlZCddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAncERhdGFTaXplJyBpbiBwLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9kYXRhX3NpemUgPSBUcnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgJ3Bmbk1zZ0NhbGxiYWNrJyA9PSBwLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wYWNrZXRfdXBkYXRlX2xpc3QuYXBwZW5kKCcgICAgUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCogcE5vbkNvbnN0Q2FsbGJhY2sgPSAoUEZOX3ZrRGVidWdSZXBvcnRDYWxsYmFja0VYVCopJnBQYWNrZXQtPnBmbk1zZ0NhbGxiYWNrOycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wYWNrZXRfdXBkYXRlX2xpc3QuYXBwZW5kKCcgICAgKnBOb25Db25zdENhbGxiYWNrID0gcGZuTXNnQ2FsbGJhY2s7JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmICdbJyBpbiBwLnR5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfcGFja2V0X3VwZGF0ZV9saXN0LmFwcGVuZCgnICAgIG1lbWNweSgodm9pZCAqKSBwUGFja2V0LT4lcywgJXMsIHNpemVvZihwUGFja2V0LT4lcykpOycgJSAocC5uYW1lLCBwLm5hbWUsIHAubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3BhY2tldF91cGRhdGVfbGlzdC5hcHBlbmQoJyAgICBwUGFja2V0LT4lcyA9ICVzOycgJSAocC5uYW1lLCBwLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgbGlzdCBvZiBwYWNrZXQgc2l6ZSBtb2RpZmllcnMgZHVlIHRvIHB0ciBwYXJhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9zaXplID0gc2VsZi5fZ2V0X3BhY2tldF9zaXplKGV4dGVuc2lvbk5hbWUsIHByb3RvLnBhcmFtcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9wYWNrZXRfdXBkYXRlX2xpc3QgPSBzZWxmLl9nZXRfcGFja2V0X3B0cl9wYXJhbV9saXN0KHByb3RvLnBhcmFtcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keVstMV0gPSBmdW5jX2JvZHlbLTFdLnJlcGxhY2UoJywnLCAnKScpCisgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBvZiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBwb3J0aW9uLCBiZWdpbiBmdW5jdGlvbiBib2R5CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCd7XG4gICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyOycpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAndm9pZCcgbm90IGluIHByb3RvLnJldCBvciAnKicgaW4gcHJvdG8ucmV0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAlcyByZXN1bHQ7JyAlIHByb3RvLnJldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fdHh0ID0gJ3Jlc3VsdCA9ICcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluX2RhdGFfc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgc2l6ZV90IF9kYXRhU2l6ZTsnKQorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIHBhY2tldF92ayVzKiBwUGFja2V0ID0gTlVMTDsnICUgcHJvdG8ubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgPT0gIkRlc3Ryb3lJbnN0YW5jZSIgb3IgcHJvdG8ubmFtZSA9PSAiRGVzdHJveURldmljZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGRpc3BhdGNoX2tleSBrZXkgPSBnZXRfZGlzcGF0Y2hfa2V5KCVzKTsnICUgcHJvdG8ucGFyYW1zWzBdLm5hbWUpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09IGxlbihwYWNrZXRfc2l6ZSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrJXMsIDApOycgJSAocHJvdG8ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBDUkVBVEVfVFJBQ0VfUEFDS0VUKHZrJXMsICVzKTsnICUgKHByb3RvLm5hbWUsICcgKyAnLmpvaW4ocGFja2V0X3NpemUpKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBjYWxsIGRvd24gdGhlIGxheWVyIGNoYWluIGFuZCBnZXQgcmV0dXJuIHZhbHVlIChpZiB0aGVyZSBpcyBvbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdGU6IHRoaXMgbG9naWMgZG9lc24ndCB3b3JrIGZvciBDcmVhdGVJbnN0YW5jZSBvciBDcmVhdGVEZXZpY2UgYnV0IHRob3NlIGFyZSBoYW5kd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0ZW5zaW9uTmFtZSA9PSAndmtfbHVuYXJnX2RlYnVnX21hcmtlcic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfdHh0ID0gJ21kZCglcyktPmRlYnVnTWFya2VyVGFibGUnICUgcHJvdG8ucGFyYW1zWzBdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgcHJvdG8ucGFyYW1zWzBdLnR5IGluIFsnVmtJbnN0YW5jZScsICdWa1BoeXNpY2FsRGV2aWNlJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV90eHQgPSAnbWlkKCVzKS0+aW5zdFRhYmxlJyAlIHByb3RvLnBhcmFtc1swXS5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfdHh0ID0gJ21kZCglcyktPmRldlRhYmxlJyAlIHByb3RvLnBhcmFtc1swXS5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgJXMlcy4lczsnICUgKHJldHVybl90eHQsIHRhYmxlX3R4dCwgcHJvdG8uY19jYWxsKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIHZrdHJhY2Vfc2V0X3BhY2tldF9lbnRyeXBvaW50X2VuZF90aW1lKHBIZWFkZXIpOycpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluX2RhdGFfc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgX2RhdGFTaXplID0gKHBEYXRhU2l6ZSA9PSBOVUxMIHx8IHBEYXRhID09IE5VTEwpID8gMCA6ICpwRGF0YVNpemU7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBwUGFja2V0ID0gaW50ZXJwcmV0X2JvZHlfYXNfdmslcyhwSGVhZGVyKTsnICUgcHJvdG8ubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJ1xuJy5qb2luKHJhd19wYWNrZXRfdXBkYXRlX2xpc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBwX2RpY3QgaW4gcHRyX3BhY2tldF91cGRhdGVfbGlzdDogI2J1ZmZfcHRyX2luZGljZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICVzOycgJSAocHBfZGljdFsnYWRkX3R4dCddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICd2b2lkJyBub3QgaW4gcHJvdG8ucmV0IG9yICcqJyBpbiBwcm90by5yZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIHBQYWNrZXQtPnJlc3VsdCA9IHJlc3VsdDsnKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBwX2RpY3QgaW4gcHRyX3BhY2tldF91cGRhdGVfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0RldmljZUNyZWF0ZUluZm8nIG5vdCBpbiBwcm90by5wYXJhbXNbcHBfZGljdFsnaW5kZXgnXV0udHkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgJXM7JyAlIChwcF9kaWN0WydmaW5hbGl6ZV90eHQnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAjIEFsbCBidWZmZXJzIHNob3VsZCBiZSBmaW5hbGl6ZWQgYnkgbm93LCBhbmQgdGhlIHRyYWNlIHBhY2tldCBjYW4gYmUgZmluaXNoZWQgKHdoaWNoIHNlbmRzIGl0IG92ZXIgdGhlIHNvY2tldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBGSU5JU0hfVFJBQ0VfUEFDS0VUKCk7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgPT0gIkRlc3Ryb3lJbnN0YW5jZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGdfaW5zdGFuY2VEYXRhTWFwLmVyYXNlKGtleSk7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgcHJvdG8ubmFtZSA9PSAiRGVzdHJveURldmljZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGdfZGV2aWNlRGF0YU1hcC5lcmFzZShrZXkpOycpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcmV0dXJuIHJlc3VsdCBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICd2b2lkJyBub3QgaW4gcHJvdG8ucmV0IG9yICcqJyBpbiBwcm90by5yZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIHJldHVybiByZXN1bHQ7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJ31cbicpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oZnVuY19ib2R5KQorCisgICAgZGVmIF9nZW5lcmF0ZV9wYWNrZXRfaWRfZW51bShzZWxmKToKKyAgICAgICAgcGlkX2VudW0gPSBbXQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ2VudW0gVktUUkFDRV9UUkFDRV9QQUNLRVRfSURfVksnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ3snKQorICAgICAgICBmaXJzdF9mdW5jID0gVHJ1ZQorICAgICAgICBmb3IgcHJvdG8gaW4gc2VsZi5wcm90b3M6CisgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIHByb3RvX2V4Y2x1c2lvbnM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGZpcnN0X2Z1bmM6CisgICAgICAgICAgICAgICAgZmlyc3RfZnVuYyA9IEZhbHNlCisgICAgICAgICAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgVktUUkFDRV9UUElfVktfdmtBcGlWZXJzaW9uID0gVktUUkFDRV9UUElfQkVHSU5fQVBJX0hFUkUsJykKKyAgICAgICAgICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICBWS1RSQUNFX1RQSV9WS192ayVzLCcgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICBWS1RSQUNFX1RQSV9WS192ayVzLCcgJSBwcm90by5uYW1lKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ307XG4nKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKHBpZF9lbnVtKQorCisgICAgZGVmIF9nZW5lcmF0ZV9wYWNrZXRfaWRfbmFtZV9mdW5jKHNlbGYpOgorICAgICAgICBmdW5jX2JvZHkgPSBbXQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCdzdGF0aWMgY29uc3QgY2hhciAqdmt0cmFjZV92a19wYWNrZXRfaWRfbmFtZShjb25zdCBlbnVtIFZLVFJBQ0VfVFJBQ0VfUEFDS0VUX0lEX1ZLIGlkKScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJ3snKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgc3dpdGNoKGlkKSB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtBcGlWZXJzaW9uOicpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICByZXR1cm4gInZrQXBpVmVyc2lvbiI7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBmb3IgcHJvdG8gaW4gc2VsZi5wcm90b3M6CisgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIHByb3RvX2V4Y2x1c2lvbnM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrJXM6JyAlIHByb3RvLm5hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIHJldHVybiAidmslcyI7JyAlIHByb3RvLm5hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBkZWZhdWx0OicpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgcmV0dXJuIE5VTEw7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCd9XG4nKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGZ1bmNfYm9keSkKKworICAgIGRlZiBfZ2VuZXJhdGVfc3RyaW5naWZ5X2Z1bmMoc2VsZik6CisgICAgICAgIGZ1bmNfYm9keSA9IFtdCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJ3N0YXRpYyBjb25zdCBjaGFyICp2a3RyYWNlX3N0cmluZ2lmeV92a19wYWNrZXRfaWQoY29uc3QgZW51bSBWS1RSQUNFX1RSQUNFX1BBQ0tFVF9JRF9WSyBpZCwgY29uc3Qgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJ3snKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgc3RhdGljIGNoYXIgc3RyWzEwMjRdOycpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBzd2l0Y2goaWQpIHsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgY2FzZSBWS1RSQUNFX1RQSV9WS192a0FwaVZlcnNpb246JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIHBhY2tldF92a0FwaVZlcnNpb24qIHBQYWNrZXQgPSAocGFja2V0X3ZrQXBpVmVyc2lvbiopKHBIZWFkZXItPnBCb2R5KTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIHNucHJpbnRmKHN0ciwgMTAyNCwgInZrQXBpVmVyc2lvbiA9IDB4JXgiLCBwUGFja2V0LT52ZXJzaW9uKTsnKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIHJldHVybiBzdHI7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBmb3IgcHJvdG8gaW4gc2VsZi5wcm90b3M6CisgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIHByb3RvX2V4Y2x1c2lvbnM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrJXM6JyAlIHByb3RvLm5hbWUpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgICAgICBmdW5jX3N0ciA9ICd2ayVzKCcgJSBwcm90by5uYW1lCisgICAgICAgICAgICBwcmludF92YWxzID0gJycKKyAgICAgICAgICAgIGNyZWF0ZV9mdW5jID0gRmFsc2UKKyAgICAgICAgICAgIGlmICdDcmVhdGUnIGluIHByb3RvLm5hbWUgb3IgJ0FsbG9jJyBpbiBwcm90by5uYW1lIG9yICdNYXBNZW1vcnknIGluIHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgY3JlYXRlX2Z1bmMgPSBUcnVlCisgICAgICAgICAgICBmb3IgcCBpbiBwcm90by5wYXJhbXM6CisgICAgICAgICAgICAgICAgbGFzdF9wYXJhbSA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgKHAubmFtZSA9PSBwcm90by5wYXJhbXNbLTFdLm5hbWUpOgorICAgICAgICAgICAgICAgICAgICBsYXN0X3BhcmFtID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGxhc3RfcGFyYW0gYW5kIGNyZWF0ZV9mdW5jOiAjIGxhc3QgcGFyYW0gb2YgY3JlYXRlIGZ1bmMKKyAgICAgICAgICAgICAgICAgICAgKHBmdCwgcGZpLCBwdHIpID0gc2VsZi5fZ2V0X3ByaW50Zl9wYXJhbXMocC50eSwncFBhY2tldC0+JXMnICUgcC5uYW1lLCBUcnVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIChwZnQsIHBmaSwgcHRyKSA9IHNlbGYuX2dldF9wcmludGZfcGFyYW1zKHAudHksICdwUGFja2V0LT4lcycgJSBwLm5hbWUsIEZhbHNlKQorICAgICAgICAgICAgICAgIGlmIGxhc3RfcGFyYW0gPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgZnVuY19zdHIgKz0gJyVzJXMgPSAlcyknICUgKHB0ciwgcC5uYW1lLCBwZnQpCisgICAgICAgICAgICAgICAgICAgIHByaW50X3ZhbHMgKz0gJywgJXMnICUgKHBmaSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmdW5jX3N0ciArPSAnJXMlcyA9ICVzLCAnICUgKHB0ciwgcC5uYW1lLCBwZnQpCisgICAgICAgICAgICAgICAgICAgIHByaW50X3ZhbHMgKz0gJywgJXMnICUgKHBmaSkKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgcGFja2V0X3ZrJXMqIHBQYWNrZXQgPSAocGFja2V0X3ZrJXMqKShwSGVhZGVyLT5wQm9keSk7JyAlIChwcm90by5uYW1lLCBwcm90by5uYW1lKSkKKyAgICAgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgc25wcmludGYoc3RyLCAxMDI0LCAiJXMiJXMpOycgJSAoZnVuY19zdHIsIHByaW50X3ZhbHMpKQorICAgICAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICByZXR1cm4gc3RyOycpCisgICAgICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICBkZWZhdWx0OicpCisgICAgICAgIGZ1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgcmV0dXJuIE5VTEw7JykKKyAgICAgICAgZnVuY19ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICBmdW5jX2JvZHkuYXBwZW5kKCd9O1xuJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihmdW5jX2JvZHkpCisgICAgCisgICAgZGVmIF9nZW5lcmF0ZV9pbnRlcnBfZnVuYyhzZWxmKToKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keSA9IFtdCisgICAgICAgIGludGVycF9mdW5jX2JvZHkuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnc3RhdGljIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogaW50ZXJwcmV0X3RyYWNlX3BhY2tldF92ayh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqIHBIZWFkZXIpJykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJ3snKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnICAgIGlmIChwSGVhZGVyID09IE5VTEwpJykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgcmV0dXJuIE5VTEw7JykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICBzd2l0Y2ggKHBIZWFkZXItPnBhY2tldF9pZCknKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICBjYXNlIFZLVFJBQ0VfVFBJX1ZLX3ZrQXBpVmVyc2lvbjonKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfYm9keV9hc192a0FwaVZlcnNpb24ocEhlYWRlciktPmhlYWRlcjsnKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgZm9yIHByb3RvIGluIHNlbGYucHJvdG9zOgorICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBpbiBwcm90b19leGNsdXNpb25zOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGludGVycF9mdW5jX2JvZHkuYXBwZW5kKCcgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmslczpcbiAgICAgICAgeycgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgaGVhZGVyX3ByZWZpeCA9ICdoJworICAgICAgICAgICAgaWYgJ0RiZycgaW4gcHJvdG8ubmFtZSA6CisgICAgICAgICAgICAgICAgaGVhZGVyX3ByZWZpeCA9ICdwSCcKKyAgICAgICAgICAgIGludGVycF9mdW5jX2JvZHkuYXBwZW5kKCclcycgJSBzZWxmLmxpbmVpbmZvLmdldCgpKQorICAgICAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfYm9keV9hc192ayVzKHBIZWFkZXIpLT4lc2VhZGVyO1xuICAgICAgICB9JyAlIChwcm90by5uYW1lLCBoZWFkZXJfcHJlZml4KSkKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICAgICAgZGVmYXVsdDonKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgcmV0dXJuIE5VTEw7JykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgaW50ZXJwX2Z1bmNfYm9keS5hcHBlbmQoJyAgICByZXR1cm4gTlVMTDsnKQorICAgICAgICBpbnRlcnBfZnVuY19ib2R5LmFwcGVuZCgnfScpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaW50ZXJwX2Z1bmNfYm9keSkKKworICAgIGRlZiBfZ2VuZXJhdGVfc3RydWN0X3V0aWxfZnVuY3Moc2VsZik6CisgICAgICAgIGxpbmVpbmZvID0gc2VsZi5saW5laW5mbworICAgICAgICBwaWRfZW51bSA9IFtdCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnc3RhdGljIHZvaWQgYWRkX1ZrQXBwbGljYXRpb25JbmZvX3RvX3BhY2tldCh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqICBwSGVhZGVyLCBWa0FwcGxpY2F0aW9uSW5mbyoqIHBwU3RydWN0LCBjb25zdCBWa0FwcGxpY2F0aW9uSW5mbyAqcEluU3RydWN0KScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgneycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKilwcFN0cnVjdCwgc2l6ZW9mKFZrQXBwbGljYXRpb25JbmZvKSwgcEluU3RydWN0KTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJigoKnBwU3RydWN0KS0+cEFwcGxpY2F0aW9uTmFtZSksIChwSW5TdHJ1Y3QtPnBBcHBsaWNhdGlvbk5hbWUgIT0gTlVMTCkgPyBST1VORFVQX1RPXzQoc3RybGVuKHBJblN0cnVjdC0+cEFwcGxpY2F0aW9uTmFtZSkgKyAxKSA6IDAsIHBJblN0cnVjdC0+cEFwcGxpY2F0aW9uTmFtZSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYoKCpwcFN0cnVjdCktPnBFbmdpbmVOYW1lKSwgKHBJblN0cnVjdC0+cEVuZ2luZU5hbWUgIT0gTlVMTCkgPyBST1VORFVQX1RPXzQoc3RybGVuKHBJblN0cnVjdC0+cEVuZ2luZU5hbWUpICsgMSkgOiAwLCBwSW5TdHJ1Y3QtPnBFbmdpbmVOYW1lKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkKiopJigoKnBwU3RydWN0KS0+cEFwcGxpY2F0aW9uTmFtZSkpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKCgqcHBTdHJ1Y3QpLT5wRW5naW5lTmFtZSkpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKnBwU3RydWN0KTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ307XG4nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ3N0YXRpYyB2b2lkIGFkZF9Wa0luc3RhbmNlQ3JlYXRlSW5mb190b19wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyLCBWa0luc3RhbmNlQ3JlYXRlSW5mbyoqIHBwU3RydWN0LCBWa0luc3RhbmNlQ3JlYXRlSW5mbyAqcEluU3RydWN0KScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgneycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKilwcFN0cnVjdCwgc2l6ZW9mKFZrSW5zdGFuY2VDcmVhdGVJbmZvKSwgcEluU3RydWN0KTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICBpZiAocEluU3RydWN0LT5wQXBwbGljYXRpb25JbmZvKSBhZGRfVmtBcHBsaWNhdGlvbkluZm9fdG9fcGFja2V0KHBIZWFkZXIsIChWa0FwcGxpY2F0aW9uSW5mbyoqKSYoKCpwcFN0cnVjdCktPnBBcHBsaWNhdGlvbkluZm8pLCBwSW5TdHJ1Y3QtPnBBcHBsaWNhdGlvbkluZm8pOycpCisgICAgICAgICMgVE9ETzEzOCA6IFRoaXMgaXMgYW4gaW5pdGlhbCBwYXNzIGF0IGdldHRpbmcgdGhlIGV4dGVuc2lvbi9sYXllciBhcnJheXMgY29ycmVjdCwgbmVlZHMgdG8gYmUgdmFsaWRhdGVkLgorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB1aW50MzJfdCBpLCBzaXogPSAwOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKCgqcHBTdHJ1Y3QpLT5wcEVuYWJsZWRMYXllck5hbWVzKSwgcEluU3RydWN0LT5lbmFibGVkTGF5ZXJDb3VudCAqIHNpemVvZihjaGFyKiksIHBJblN0cnVjdC0+cHBFbmFibGVkTGF5ZXJOYW1lcyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgaWYgKHBJblN0cnVjdC0+ZW5hYmxlZExheWVyQ291bnQgPiAwKSAnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5TdHJ1Y3QtPmVuYWJsZWRMYXllckNvdW50OyBpKyspIHsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIHNpeiA9ICh1aW50MzJfdCkgUk9VTkRVUF9UT180KDEgKyBzdHJsZW4ocEluU3RydWN0LT5wcEVuYWJsZWRMYXllck5hbWVzW2ldKSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopKCYoKnBwU3RydWN0KS0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSksIHNpeiwgcEluU3RydWN0LT5wcEVuYWJsZWRMYXllck5hbWVzW2ldKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQgKiopJigqcHBTdHJ1Y3QpLT5wcEVuYWJsZWRMYXllck5hbWVzW2ldKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkICoqKSYoKnBwU3RydWN0KS0+cHBFbmFibGVkTGF5ZXJOYW1lcyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYoKCpwcFN0cnVjdCktPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKSwgcEluU3RydWN0LT5lbmFibGVkRXh0ZW5zaW9uQ291bnQgKiBzaXplb2YoY2hhciopLCBwSW5TdHJ1Y3QtPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICBpZiAocEluU3RydWN0LT5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPiAwKSAnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5TdHJ1Y3QtPmVuYWJsZWRFeHRlbnNpb25Db3VudDsgaSsrKSB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICBzaXogPSAodWludDMyX3QpIFJPVU5EVVBfVE9fNCgxICsgc3RybGVuKHBJblN0cnVjdC0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikoJigqcHBTdHJ1Y3QpLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSksIHNpeiwgcEluU3RydWN0LT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lc1tpXSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkICoqKSYoKnBwU3RydWN0KS0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQgKiopJigqcHBTdHJ1Y3QpLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKXBwU3RydWN0KTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ31cbicpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnc3RhdGljIHZvaWQgYWRkX1ZrRGV2aWNlQ3JlYXRlSW5mb190b19wYWNrZXQodmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiAgcEhlYWRlciwgVmtEZXZpY2VDcmVhdGVJbmZvKiogcHBTdHJ1Y3QsIGNvbnN0IFZrRGV2aWNlQ3JlYXRlSW5mbyAqcEluU3RydWN0KScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgneycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKilwcFN0cnVjdCwgc2l6ZW9mKFZrRGV2aWNlQ3JlYXRlSW5mbyksIHBJblN0cnVjdCk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSYoKnBwU3RydWN0KS0+cFF1ZXVlQ3JlYXRlSW5mb3MsIHBJblN0cnVjdC0+cXVldWVDcmVhdGVJbmZvQ291bnQqc2l6ZW9mKFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvKSwgcEluU3RydWN0LT5wUXVldWVDcmVhdGVJbmZvcyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBJblN0cnVjdC0+cXVldWVDcmVhdGVJbmZvQ291bnQ7IGkrKykgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJigqcHBTdHJ1Y3QpLT5wUXVldWVDcmVhdGVJbmZvc1tpXS5wUXVldWVQcmlvcml0aWVzLCcpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5TdHJ1Y3QtPnBRdWV1ZUNyZWF0ZUluZm9zW2ldLnF1ZXVlQ291bnQqc2l6ZW9mKGZsb2F0KSwnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluU3RydWN0LT5wUXVldWVDcmVhdGVJbmZvc1tpXS5wUXVldWVQcmlvcml0aWVzKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCoqKSYoKnBwU3RydWN0KS0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucFF1ZXVlUHJpb3JpdGllcyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKCpwcFN0cnVjdCktPnBRdWV1ZUNyZWF0ZUluZm9zKTsnKQorICAgICAgICAjIFRPRE8xMzggOiBUaGlzIGlzIGFuIGluaXRpYWwgcGFzcyBhdCBnZXR0aW5nIHRoZSBleHRlbnNpb24vbGF5ZXIgYXJyYXlzIGNvcnJlY3QsIG5lZWRzIHRvIGJlIHZhbGlkYXRlZC4KKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgdWludDMyX3QgaSwgc2l6ID0gMDsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopJigoKnBwU3RydWN0KS0+cHBFbmFibGVkTGF5ZXJOYW1lcyksIHBJblN0cnVjdC0+ZW5hYmxlZExheWVyQ291bnQgKiBzaXplb2YoY2hhciopLCBwSW5TdHJ1Y3QtPnBwRW5hYmxlZExheWVyTmFtZXMpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIGlmIChwSW5TdHJ1Y3QtPmVuYWJsZWRMYXllckNvdW50ID4gMCkgJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluU3RydWN0LT5lbmFibGVkTGF5ZXJDb3VudDsgaSsrKSB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICBzaXogPSAodWludDMyX3QpIFJPVU5EVVBfVE9fNCgxICsgc3RybGVuKHBJblN0cnVjdC0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSkpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgdmt0cmFjZV9hZGRfYnVmZmVyX3RvX3RyYWNlX3BhY2tldChwSGVhZGVyLCAodm9pZCoqKSgmKCpwcFN0cnVjdCktPnBwRW5hYmxlZExheWVyTmFtZXNbaV0pLCBzaXosIHBJblN0cnVjdC0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkICoqKSYoKnBwU3RydWN0KS0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCAqKikmKCpwcFN0cnVjdCktPnBwRW5hYmxlZExheWVyTmFtZXMpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKCgqcHBTdHJ1Y3QpLT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyksIHBJblN0cnVjdC0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50ICogc2l6ZW9mKGNoYXIqKSwgcEluU3RydWN0LT5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgaWYgKHBJblN0cnVjdC0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50ID4gMCkgJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluU3RydWN0LT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgc2l6ID0gKHVpbnQzMl90KSBST1VORFVQX1RPXzQoMSArIHN0cmxlbihwSW5TdHJ1Y3QtPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICB2a3RyYWNlX2FkZF9idWZmZXJfdG9fdHJhY2VfcGFja2V0KHBIZWFkZXIsICh2b2lkKiopKCYoKnBwU3RydWN0KS0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pLCBzaXosIHBJblN0cnVjdC0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgdmt0cmFjZV9maW5hbGl6ZV9idWZmZXJfYWRkcmVzcyhwSGVhZGVyLCAodm9pZCAqKikmKCpwcFN0cnVjdCktPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICB2a3RyYWNlX2ZpbmFsaXplX2J1ZmZlcl9hZGRyZXNzKHBIZWFkZXIsICh2b2lkICoqKSYoKnBwU3RydWN0KS0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfYWRkX2J1ZmZlcl90b190cmFjZV9wYWNrZXQocEhlYWRlciwgKHZvaWQqKikmKCpwcFN0cnVjdCktPnBFbmFibGVkRmVhdHVyZXMsIHNpemVvZihWa1BoeXNpY2FsRGV2aWNlRmVhdHVyZXMpLCBwSW5TdHJ1Y3QtPnBFbmFibGVkRmVhdHVyZXMpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKikmKCpwcFN0cnVjdCktPnBFbmFibGVkRmVhdHVyZXMpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHZrdHJhY2VfZmluYWxpemVfYnVmZmVyX2FkZHJlc3MocEhlYWRlciwgKHZvaWQqKilwcFN0cnVjdCk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCd9XG4nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyVzJyAlIGxpbmVpbmZvLmdldCgpKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnc3RhdGljIFZrSW5zdGFuY2VDcmVhdGVJbmZvKiBpbnRlcnByZXRfVmtJbnN0YW5jZUNyZWF0ZUluZm8odmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiAgcEhlYWRlciwgaW50cHRyX3QgcHRyX3ZhcmlhYmxlKScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgneycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIFZrSW5zdGFuY2VDcmVhdGVJbmZvKiBwVmtJbnN0YW5jZUNyZWF0ZUluZm8gPSAoVmtJbnN0YW5jZUNyZWF0ZUluZm8qKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcHRyX3ZhcmlhYmxlKTtcbicpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHVpbnQzMl90IGk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgaWYgKHBWa0luc3RhbmNlQ3JlYXRlSW5mbyAhPSBOVUxMKScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgcFZrSW5zdGFuY2VDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvID0gKFZrQXBwbGljYXRpb25JbmZvKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBWa0luc3RhbmNlQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mbyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIFZrQXBwbGljYXRpb25JbmZvKiogcHBBcHBsaWNhdGlvbkluZm8gPSAoVmtBcHBsaWNhdGlvbkluZm8qKikgJnBWa0luc3RhbmNlQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mbzsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgaWYgKHBWa0luc3RhbmNlQ3JlYXRlSW5mby0+cEFwcGxpY2F0aW9uSW5mbyknKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgKCpwcEFwcGxpY2F0aW9uSW5mbyktPnBBcHBsaWNhdGlvbk5hbWUgPSAoY29uc3QgY2hhciopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwVmtJbnN0YW5jZUNyZWF0ZUluZm8tPnBBcHBsaWNhdGlvbkluZm8tPnBBcHBsaWNhdGlvbk5hbWUpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgKCpwcEFwcGxpY2F0aW9uSW5mbyktPnBFbmdpbmVOYW1lID0gKGNvbnN0IGNoYXIqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFZrSW5zdGFuY2VDcmVhdGVJbmZvLT5wQXBwbGljYXRpb25JbmZvLT5wRW5naW5lTmFtZSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgaWYgKHBWa0luc3RhbmNlQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQgPiAwKScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICBwVmtJbnN0YW5jZUNyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXMgPSAoY29uc3QgY2hhciogY29uc3QqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFZrSW5zdGFuY2VDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwVmtJbnN0YW5jZUNyZWF0ZUluZm8tPmVuYWJsZWRMYXllckNvdW50OyBpKyspIHsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgICAgICBjaGFyKiogcHBUbXAgPSAoY2hhcioqKSZwVmtJbnN0YW5jZUNyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXNbaV07JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICAgICAgKnBwVG1wID0gKGNoYXIqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFZrSW5zdGFuY2VDcmVhdGVJbmZvLT5wcEVuYWJsZWRMYXllck5hbWVzW2ldKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICBpZiAocFZrSW5zdGFuY2VDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQgPiAwKScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICBwVmtJbnN0YW5jZUNyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gKGNvbnN0IGNoYXIqIGNvbnN0Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBWa0luc3RhbmNlQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBWa0luc3RhbmNlQ3JlYXRlSW5mby0+ZW5hYmxlZEV4dGVuc2lvbkNvdW50OyBpKyspIHsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgICAgICBjaGFyKiogcHBUbXAgPSAoY2hhcioqKSZwVmtJbnN0YW5jZUNyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgICAgICpwcFRtcCA9IChjaGFyKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBWa0luc3RhbmNlQ3JlYXRlSW5mby0+cHBFbmFibGVkRXh0ZW5zaW9uTmFtZXNbaV0pOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgcmV0dXJuIHBWa0luc3RhbmNlQ3JlYXRlSW5mbzsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ31cbicpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnJXMnICUgbGluZWluZm8uZ2V0KCkpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnc3RhdGljIFZrRGV2aWNlQ3JlYXRlSW5mbyogaW50ZXJwcmV0X1ZrRGV2aWNlQ3JlYXRlSW5mbyh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqICBwSGVhZGVyLCBpbnRwdHJfdCBwdHJfdmFyaWFibGUpJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCd7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgVmtEZXZpY2VDcmVhdGVJbmZvKiBwVmtEZXZpY2VDcmVhdGVJbmZvID0gKFZrRGV2aWNlQ3JlYXRlSW5mbyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwdHJfdmFyaWFibGUpO1xuJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgdWludDMyX3QgaTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICBpZiAocFZrRGV2aWNlQ3JlYXRlSW5mbyAhPSBOVUxMKScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgaWYgKHBWa0RldmljZUNyZWF0ZUluZm8tPnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID4gMCknKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgcFZrRGV2aWNlQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3MgPSAoY29uc3QgVmtEZXZpY2VRdWV1ZUNyZWF0ZUluZm8gKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBWa0RldmljZUNyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwVmtEZXZpY2VDcmVhdGVJbmZvLT5xdWV1ZUNyZWF0ZUluZm9Db3VudDsgaSsrKSB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICAgICAgZmxvYXQqKiBwcFF1ZXVlUHJpb3JpdHkgPSAoZmxvYXQqKikmcFZrRGV2aWNlQ3JlYXRlSW5mby0+cFF1ZXVlQ3JlYXRlSW5mb3NbaV0ucFF1ZXVlUHJpb3JpdGllczsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgICAgICAqcHBRdWV1ZVByaW9yaXR5ID0gKGZsb2F0Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBWa0RldmljZUNyZWF0ZUluZm8tPnBRdWV1ZUNyZWF0ZUluZm9zW2ldLnBRdWV1ZVByaW9yaXRpZXMpOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIGlmIChwVmtEZXZpY2VDcmVhdGVJbmZvLT5lbmFibGVkTGF5ZXJDb3VudCA+IDApJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIHBWa0RldmljZUNyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXMgPSAoY29uc3QgY2hhciogY29uc3QqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFZrRGV2aWNlQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lcyk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFZrRGV2aWNlQ3JlYXRlSW5mby0+ZW5hYmxlZExheWVyQ291bnQ7IGkrKykgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgICAgIGNoYXIqKiBwcFRtcCA9IChjaGFyKiopJnBWa0RldmljZUNyZWF0ZUluZm8tPnBwRW5hYmxlZExheWVyTmFtZXNbaV07JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICAgICAgKnBwVG1wID0gKGNoYXIqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFZrRGV2aWNlQ3JlYXRlSW5mby0+cHBFbmFibGVkTGF5ZXJOYW1lc1tpXSk7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICB9JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgaWYgKHBWa0RldmljZUNyZWF0ZUluZm8tPmVuYWJsZWRFeHRlbnNpb25Db3VudCA+IDApJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIHBWa0RldmljZUNyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gKGNvbnN0IGNoYXIqIGNvbnN0Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBWa0RldmljZUNyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwVmtEZXZpY2VDcmVhdGVJbmZvLT5lbmFibGVkRXh0ZW5zaW9uQ291bnQ7IGkrKykgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgICAgIGNoYXIqKiBwcFRtcCA9IChjaGFyKiopJnBWa0RldmljZUNyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICAgICAgICAgICpwcFRtcCA9IChjaGFyKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBWa0RldmljZUNyZWF0ZUluZm8tPnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzW2ldKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICBwVmtEZXZpY2VDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzID0gKGNvbnN0IFZrUGh5c2ljYWxEZXZpY2VGZWF0dXJlcyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwVmtEZXZpY2VDcmVhdGVJbmZvLT5wRW5hYmxlZEZlYXR1cmVzKTtcbicpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIH1cbicpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIHJldHVybiBwVmtEZXZpY2VDcmVhdGVJbmZvOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnfVxuJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCclcycgJSBsaW5laW5mby5nZXQoKSkKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCdzdGF0aWMgdm9pZCBpbnRlcnByZXRfVmtQaXBlbGluZVNoYWRlclN0YWdlQ3JlYXRlSW5mbyh2a3RyYWNlX3RyYWNlX3BhY2tldF9oZWFkZXIqICBwSGVhZGVyLCBWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKiBwU2hhZGVyKScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgneycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIGlmIChwU2hhZGVyICE9IE5VTEwpJykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgeycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICBwU2hhZGVyLT5wTmFtZSA9IChjb25zdCBjaGFyKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBTaGFkZXItPnBOYW1lKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgLy8gc3BlY2lhbGl6YXRpb24gaW5mbycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICBwU2hhZGVyLT5wU3BlY2lhbGl6YXRpb25JbmZvID0gKGNvbnN0IFZrU3BlY2lhbGl6YXRpb25JbmZvKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8pOycpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICBpZiAocFNoYWRlci0+cFNwZWNpYWxpemF0aW9uSW5mbyAhPSBOVUxMKScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICBWa1NwZWNpYWxpemF0aW9uSW5mbyogcEluZm8gPSAoVmtTcGVjaWFsaXphdGlvbkluZm8qKXBTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm87JykKKyAgICAgICAgcGlkX2VudW0uYXBwZW5kKCcgICAgICAgICAgICBwSW5mby0+cE1hcEVudHJpZXMgPSAoY29uc3QgVmtTcGVjaWFsaXphdGlvbk1hcEVudHJ5Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8tPnBNYXBFbnRyaWVzKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgICAgIHBJbmZvLT5wRGF0YSA9IChjb25zdCB2b2lkKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBTaGFkZXItPnBTcGVjaWFsaXphdGlvbkluZm8tPnBEYXRhKTsnKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnICAgIH0nKQorICAgICAgICBwaWRfZW51bS5hcHBlbmQoJ31cbicpCisgICAgICAgIHBpZF9lbnVtLmFwcGVuZCgnLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4ocGlkX2VudW0pCisKKyAgICAjIEludGVycHJldCBmdW5jdGlvbnMgdXNlZCBvbiByZXBsYXkgdG8gcmVhZCBpbiBwYWNrZXRzIGFuZCBpbnRlcnByZXQgdGhlaXIgY29udGVudHMKKyAgICAjICBUaGlzIGNvZGUgZ2V0cyBnZW5lcmF0ZWQgaW50byB2a3RyYWNlX3ZrX3ZrX3BhY2tldHMuaCBmaWxlCisgICAgZGVmIF9nZW5lcmF0ZV9pbnRlcnBfZnVuY3Moc2VsZik6CisgICAgICAgICMgQ3VzdG9tIHR4dCBmb3IgZ2l2ZW4gZnVuY3Rpb24gYW5kIHBhcmFtZXRlci4gIEZpcnN0IGNoZWNrIGlmIHBhcmFtIGlzIE5VTEwsIHRoZW4gaW5zZXJ0IHR4dCBpZiBub3QKKyAgICAgICAgIyBGaXJzdCBzb21lIGNvbW1vbiBjb2RlIHVzZWQgYnkgYm90aCBDbWRXYWl0RXZlbnRzICYgQ21kUGlwZWxpbmVCYXJyaWVyCisgICAgICAgIG1lbV9iYXJyaWVyX2ludGVycCA9IFsndWludDMyX3QgaSA9IDA7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciAoaSA9IDA7IGkgPCBwUGFja2V0LT5tZW1vcnlCYXJyaWVyQ291bnQ7IGkrKykge1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdm9pZCoqIHBwTUIgPSAodm9pZCoqKSYocFBhY2tldC0+cHBNZW1vcnlCYXJyaWVyc1tpXSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAqcHBNQiA9IHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cHBNZW1vcnlCYXJyaWVyc1tpXSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAvL1ZrTWVtb3J5QmFycmllciogcEJhcnIgPSAoVmtNZW1vcnlCYXJyaWVyKilwUGFja2V0LT5wcE1lbW9yeUJhcnJpZXJzW2ldO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgLy8gVE9ETyA6IENvdWxkIGZpeCB1cCB0aGUgcE5leHQgcHRycyBoZXJlIGlmIHRoZXkgd2VyZSBmaW5hbGl6ZWQgYW5kIGlmIHdlIGNhcmVkIGJ5IHN3aXRjaGluZyBvbiBCYXJyaWVyIHR5cGUgYW5kIHJlbWFwcGluZ1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9J10KKyAgICAgICAgY3JlYXRlX3JwX2ludGVycCA9IFsnVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyogcEluZm8gPSAoVmtSZW5kZXJQYXNzQ3JlYXRlSW5mbyopcFBhY2tldC0+cENyZWF0ZUluZm87XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1aW50MzJfdCBpID0gMDtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrQXR0YWNobWVudERlc2NyaXB0aW9uICoqcHBBRCA9IChWa0F0dGFjaG1lbnREZXNjcmlwdGlvbiAqKikmKHBJbmZvLT5wQXR0YWNobWVudHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKnBwQUQgPSAoVmtBdHRhY2htZW50RGVzY3JpcHRpb24qKSB2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBJbmZvLT5wQXR0YWNobWVudHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtTdWJwYXNzRGVzY3JpcHRpb24qKiBwcFNQID0gKFZrU3VicGFzc0Rlc2NyaXB0aW9uKiopJihwSW5mby0+cFN1YnBhc3Nlcyk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqcHBTUCA9IChWa1N1YnBhc3NEZXNjcmlwdGlvbiopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcEluZm8tPnBTdWJwYXNzZXMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIChpPTA7IGk8cEluZm8tPnN1YnBhc3NDb3VudDsgaSsrKSB7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgVmtBdHRhY2htZW50UmVmZXJlbmNlKiogcEFSID0gKFZrQXR0YWNobWVudFJlZmVyZW5jZSoqKSYocEluZm8tPnBTdWJwYXNzZXNbaV0ucElucHV0QXR0YWNobWVudHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICpwQVIgPSAoVmtBdHRhY2htZW50UmVmZXJlbmNlKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBJbmZvLT5wU3VicGFzc2VzW2ldLnBJbnB1dEF0dGFjaG1lbnRzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBwQVIgPSAoVmtBdHRhY2htZW50UmVmZXJlbmNlKiopJihwSW5mby0+cFN1YnBhc3Nlc1tpXS5wQ29sb3JBdHRhY2htZW50cyk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgKnBBUiA9IChWa0F0dGFjaG1lbnRSZWZlcmVuY2UqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcEluZm8tPnBTdWJwYXNzZXNbaV0ucENvbG9yQXR0YWNobWVudHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHBBUiA9IChWa0F0dGFjaG1lbnRSZWZlcmVuY2UqKikmKHBJbmZvLT5wU3VicGFzc2VzW2ldLnBSZXNvbHZlQXR0YWNobWVudHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICpwQVIgPSAoVmtBdHRhY2htZW50UmVmZXJlbmNlKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBJbmZvLT5wU3VicGFzc2VzW2ldLnBSZXNvbHZlQXR0YWNobWVudHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHBBUiA9IChWa0F0dGFjaG1lbnRSZWZlcmVuY2UqKikmKHBJbmZvLT5wU3VicGFzc2VzW2ldLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAqcEFSID0gKFZrQXR0YWNobWVudFJlZmVyZW5jZSopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwSW5mby0+cFN1YnBhc3Nlc1tpXS5wRGVwdGhTdGVuY2lsQXR0YWNobWVudCk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgcEFSID0gKFZrQXR0YWNobWVudFJlZmVyZW5jZSoqKSYocEluZm8tPnBTdWJwYXNzZXNbaV0ucFByZXNlcnZlQXR0YWNobWVudHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICpwQVIgPSAoVmtBdHRhY2htZW50UmVmZXJlbmNlKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBJbmZvLT5wU3VicGFzc2VzW2ldLnBQcmVzZXJ2ZUF0dGFjaG1lbnRzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ31cbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrU3VicGFzc0RlcGVuZGVuY3kqKiBwcFNEID0gKFZrU3VicGFzc0RlcGVuZGVuY3kqKikmKHBJbmZvLT5wRGVwZW5kZW5jaWVzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJypwcFNEID0gKFZrU3VicGFzc0RlcGVuZGVuY3kqKSB2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBJbmZvLT5wRGVwZW5kZW5jaWVzKTtcbiddCisgICAgICAgIGNyZWF0ZV9nZnhfcGlwZSA9IFsndWludDMyX3QgaTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndWludDMyX3QgajtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIChpPTA7IGk8cFBhY2tldC0+Y3JlYXRlSW5mb0NvdW50OyBpKyspIHtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmIChwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0uc1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8pIHtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8vIG5lZWQgdG8gbWFrZSBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHNvIHRoYXQgd2UgY2FuIHByb3Blcmx5IGNoYW5nZSB0aGUgb3JpZ2luYWwgcG9pbnRlciB0byB0aGUgaW50ZXJwcmV0dGVkIG9uZVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyogcE5vbkNvbnN0ID0gKFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8qKSYocFBhY2tldC0+cENyZWF0ZUluZm9zW2ldKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8vIHNoYWRlciBzdGFnZXMgYXJyYXlcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BOb25Db25zdC0+cFN0YWdlcyA9IChWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvc1tpXS5wU3RhZ2VzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciAoaiA9IDA7IGogPCBwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0uc3RhZ2VDb3VudDsgaisrKVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAne1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGludGVycHJldF9Wa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKHBIZWFkZXIsIChWa1BpcGVsaW5lU2hhZGVyU3RhZ2VDcmVhdGVJbmZvKikmcFBhY2tldC0+cENyZWF0ZUluZm9zW2ldLnBTdGFnZXNbal0pO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLy8gVmVydGV4IElucHV0IFN0YXRlXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwTm9uQ29uc3QtPnBWZXJ0ZXhJbnB1dFN0YXRlID0gKFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtQaXBlbGluZVZlcnRleElucHV0U3RhdGVDcmVhdGVJbmZvKiBwTm9uQ29uc3RWSVN0YXRlID0gKFZrUGlwZWxpbmVWZXJ0ZXhJbnB1dFN0YXRlQ3JlYXRlSW5mbyopcE5vbkNvbnN0LT5wVmVydGV4SW5wdXRTdGF0ZTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmIChwTm9uQ29uc3RWSVN0YXRlKSB7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgcE5vbkNvbnN0VklTdGF0ZS0+cFZlcnRleEJpbmRpbmdEZXNjcmlwdGlvbnMgPSAoY29uc3QgVmtWZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBwTm9uQ29uc3RWSVN0YXRlLT5wVmVydGV4QXR0cmlidXRlRGVzY3JpcHRpb25zID0gKGNvbnN0IFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucFZlcnRleElucHV0U3RhdGUtPnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLy8gSW5wdXQgQXNzZW1ibHkgU3RhdGVcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BOb25Db25zdC0+cElucHV0QXNzZW1ibHlTdGF0ZSA9IChjb25zdCBWa1BpcGVsaW5lSW5wdXRBc3NlbWJseVN0YXRlQ3JlYXRlSW5mbyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucElucHV0QXNzZW1ibHlTdGF0ZSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvLyBUZXNzZWxhdGlvbiBTdGF0ZVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncE5vbkNvbnN0LT5wVGVzc2VsbGF0aW9uU3RhdGUgPSAoY29uc3QgVmtQaXBlbGluZVRlc3NlbGxhdGlvblN0YXRlQ3JlYXRlSW5mbyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucFRlc3NlbGxhdGlvblN0YXRlKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8vIFZpZXdwb3J0IFN0YXRlXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwTm9uQ29uc3QtPnBWaWV3cG9ydFN0YXRlID0gKGNvbnN0IFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucFZpZXdwb3J0U3RhdGUpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLy8gUmFzdGVyIFN0YXRlXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwTm9uQ29uc3QtPnBSYXN0ZXJpemF0aW9uU3RhdGUgPSAoY29uc3QgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8qKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cENyZWF0ZUluZm9zW2ldLnBSYXN0ZXJpemF0aW9uU3RhdGUpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLy8gTXVsdGlTYW1wbGUgU3RhdGVcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BOb25Db25zdC0+cE11bHRpc2FtcGxlU3RhdGUgPSAoY29uc3QgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvc1tpXS5wTXVsdGlzYW1wbGVTdGF0ZSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvLyBEZXB0aFN0ZW5jaWwgU3RhdGVcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BOb25Db25zdC0+cERlcHRoU3RlbmNpbFN0YXRlID0gKGNvbnN0IFZrUGlwZWxpbmVEZXB0aFN0ZW5jaWxTdGF0ZUNyZWF0ZUluZm8qKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cENyZWF0ZUluZm9zW2ldLnBEZXB0aFN0ZW5jaWxTdGF0ZSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvLyBEeW5hbWljU3RhdGUgU3RhdGVcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BOb25Db25zdC0+cER5bmFtaWNTdGF0ZSA9IChjb25zdCBWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucER5bmFtaWNTdGF0ZSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyogcE5vbkNvbnN0RHlTdGF0ZSA9IChWa1BpcGVsaW5lRHluYW1pY1N0YXRlQ3JlYXRlSW5mbyopcE5vbkNvbnN0LT5wRHluYW1pY1N0YXRlO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWYgKHBOb25Db25zdER5U3RhdGUpIHtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBwTm9uQ29uc3REeVN0YXRlLT5wRHluYW1pY1N0YXRlcyA9IChjb25zdCBWa0R5bmFtaWNTdGF0ZSopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mb3NbaV0ucER5bmFtaWNTdGF0ZS0+cER5bmFtaWNTdGF0ZXMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJywKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvLyBDb2xvckJ1ZmZlciBTdGF0ZVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncE5vbkNvbnN0LT5wQ29sb3JCbGVuZFN0YXRlID0gKGNvbnN0IFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvc1tpXS5wQ29sb3JCbGVuZFN0YXRlKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKiBwTm9uQ29uc3RDYlN0YXRlID0gKFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvKilwTm9uQ29uc3QtPnBDb2xvckJsZW5kU3RhdGU7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZiAocE5vbkNvbnN0Q2JTdGF0ZSlcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBwTm9uQ29uc3RDYlN0YXRlLT5wQXR0YWNobWVudHMgPSAoY29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cENyZWF0ZUluZm9zW2ldLnBDb2xvckJsZW5kU3RhdGUtPnBBdHRhY2htZW50cyk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9IGVsc2Uge1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIC8vIFRoaXMgaXMgdW5leHBlY3RlZC5cbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB2a3RyYWNlX0xvZ0Vycm9yKCJDcmVhdGVHcmFwaGljc1BpcGVsaW5lcyBtdXN0IGhhdmUgQ3JlYXRlSW5mbyBzdHlwZSBvZiBWS19TVFJVQ1RVUkVfVFlQRV9HUkFQSElDU19QSVBFTElORV9DUkVBVEVfSU5GTy4iKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBwUGFja2V0LT5oZWFkZXIgPSBOVUxMO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfVxuJ10KKyAgICAgICAgIyBUT0RPIDogVGhpcyBjb2RlIGlzIG5vdyB0b28gbGFyZ2UgYW5kIGNvbXBsZXgsIG5lZWQgdG8gbWFrZSBjb2RlZ2VuIHNtYXJ0ZXIgZm9yIHBvaW50ZXJzIGVtYmVkZGVkIGluIHN0cnVjdCBwYXJhbXMgdG8gaGFuZGxlIHRob3NlIGNhc2VzIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVE9ETzEzOCA6IEp1c3QgcmlwcGVkIG91dCBhIGJ1bmNoIG9mIGN1c3RvbSBjb2RlIGhlcmUgdGhhdCB3YXMgb3V0IG9mIGRhdGUuIE5lZWQgdG8gc2NydWIgdGhlc2UgZnVuY3Rpb24gYW5kIHZlcmlmeSB0aGV5J3JlIGNvcnJlY3QKKyAgICAgICAgY3VzdG9tX2Nhc2VfZGljdCA9IHsgIydDcmVhdGVGcmFtZWJ1ZmZlcicgOiB7J3BhcmFtJzogJ3BDcmVhdGVJbmZvJywgJ3R4dCc6IFsnVmtGcmFtZWJ1ZmZlckNyZWF0ZUluZm8qIHBJbmZvID0gKFZrRnJhbWVidWZmZXJDcmVhdGVJbmZvKilwUGFja2V0LT5wQ3JlYXRlSW5mbztcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICdwSW5mby0+cENvbG9yQXR0YWNobWVudHMgPSAoVmtDb2xvckF0dGFjaG1lbnRCaW5kSW5mbyopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cENyZWF0ZUluZm8tPnBDb2xvckF0dGFjaG1lbnRzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICdwSW5mby0+cERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSAoVmtEZXB0aFN0ZW5jaWxCaW5kSW5mbyopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cENyZWF0ZUluZm8tPnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KTtcbiddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZVJlbmRlclBhc3MnIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBjcmVhdGVfcnBfaW50ZXJwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZVBpcGVsaW5lQ2FjaGUnIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygoVmtQaXBlbGluZUNhY2hlQ3JlYXRlSW5mbyAqKXBQYWNrZXQtPnBDcmVhdGVJbmZvKS0+cEluaXRpYWxEYXRhID0gKGNvbnN0IHZvaWQqKSB2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wSW5pdGlhbERhdGEpO1xuJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlUGlwZWxpbmVMYXlvdXQnIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbJ1ZrUGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvKiBwSW5mbyA9IChWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyopcFBhY2tldC0+cENyZWF0ZUluZm87XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwSW5mby0+cFNldExheW91dHMgPSAoVmtEZXNjcmlwdG9yU2V0TGF5b3V0Kikgdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wQ3JlYXRlSW5mby0+cFNldExheW91dHMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncEluZm8tPnBQdXNoQ29uc3RhbnRSYW5nZXMgPSAoVmtQdXNoQ29uc3RhbnRSYW5nZSopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cENyZWF0ZUluZm8tPnBQdXNoQ29uc3RhbnRSYW5nZXMpO1xuJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlRGVzY3JpcHRvclBvb2wnIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbJ1ZrRGVzY3JpcHRvclBvb2xDcmVhdGVJbmZvKiBwSW5mbyA9IChWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyopcFBhY2tldC0+cENyZWF0ZUluZm87XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwSW5mby0+cFBvb2xTaXplcyA9IChWa0Rlc2NyaXB0b3JQb29sU2l6ZSopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cENyZWF0ZUluZm8tPnBQb29sU2l6ZXMpO1xuJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ21kV2FpdEV2ZW50cycgOiB7J3BhcmFtJzogJ3BwTWVtb3J5QmFycmllcnMnLCAndHh0JzogbWVtX2JhcnJpZXJfaW50ZXJwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NtZFBpcGVsaW5lQmFycmllcicgOiB7J3BhcmFtJzogJ3BwTWVtb3J5QmFycmllcnMnLCAndHh0JzogbWVtX2JhcnJpZXJfaW50ZXJwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZURlc2NyaXB0b3JTZXRMYXlvdXQnIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbJ2lmIChwUGFja2V0LT5wQ3JlYXRlSW5mby0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPKSB7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qIHBOZXh0ID0gKFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qKXBQYWNrZXQtPnBDcmVhdGVJbmZvO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBkb1xuJywnICAgIHtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIC8vIG5lZWQgdG8gbWFrZSBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHNvIHRoYXQgd2UgY2FuIHByb3Blcmx5IGNoYW5nZSB0aGUgb3JpZ2luYWwgcG9pbnRlciB0byB0aGUgaW50ZXJwcmV0dGVkIG9uZVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgdm9pZCoqIHBwTmV4dFZvaWRQdHIgPSAodm9pZCoqKSYocE5leHQtPnBOZXh0KTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICpwcE5leHRWb2lkUHRyID0gKHZvaWQqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcE5leHQtPnBOZXh0KTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHN3aXRjaChwTmV4dC0+c1R5cGUpXG4nLCAnICAgICAgICB7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgY2FzZSBWS19TVFJVQ1RVUkVfVFlQRV9ERVNDUklQVE9SX1NFVF9MQVlPVVRfQ1JFQVRFX0lORk86XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAge1xuJyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGkgPSAwO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBwTmV4dC0+cEJpbmRpbmdzID0gKFZrRGVzY3JpcHRvclNldExheW91dEJpbmRpbmcqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcE5leHQtPnBCaW5kaW5ncyk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwTmV4dC0+YmluZGluZ0NvdW50OyBpKyspXG4nLCcgICAgICAgICAgICAgICAge1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgVmtTYW1wbGVyKiogcHBTYW1wbGVycyA9IChWa1NhbXBsZXIqKikmKHBOZXh0LT5wQmluZGluZ3NbaV0ucEltbXV0YWJsZVNhbXBsZXJzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICpwcFNhbXBsZXJzID0gKFZrU2FtcGxlciopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwTmV4dC0+cEJpbmRpbmdzW2ldLnBJbW11dGFibGVTYW1wbGVycyk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIH1cbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgYnJlYWs7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgfVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGRlZmF1bHQ6XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAge1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJFbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIHR5cGUgaW4gZGVzY3JpcHRvciBzZXQgbGF5b3V0IGNyZWF0ZSBsaXN0LiIpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBwUGFja2V0LT5oZWFkZXIgPSBOVUxMO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBwTmV4dC0+cE5leHQgPSBOVUxMO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIH1cbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH1cbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHBOZXh0ID0gKFZrRGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8qKXBOZXh0LT5wTmV4dDtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgIH0gIHdoaWxlIChOVUxMICE9IHBOZXh0KTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9IGVsc2Uge1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgLy8gVGhpcyBpcyB1bmV4cGVjdGVkLlxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgdmt0cmFjZV9Mb2dFcnJvcigiQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCBtdXN0IGhhdmUgcENyZWF0ZUluZm8tPnN0eXBlIG9mIFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfU0VUX0xBWU9VVF9DUkVBVEVfSU5GTy4iKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgIHBQYWNrZXQtPmhlYWRlciA9IE5VTEw7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfSddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JlZ2luQ29tbWFuZEJ1ZmZlcicgOiB7J3BhcmFtJzogJ3BCZWdpbkluZm8nLCAndHh0JzogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyogcEluZm8gPSAoVmtDb21tYW5kQnVmZmVyQmVnaW5JbmZvKikgcFBhY2tldC0+cEJlZ2luSW5mbztcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BJbmZvLT5wSW5oZXJpdGFuY2VJbmZvID0gKFZrQ29tbWFuZEJ1ZmZlckluaGVyaXRhbmNlSW5mbyopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cEJlZ2luSW5mby0+cEluaGVyaXRhbmNlSW5mbyk7XG4nXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBbGxvY2F0ZU1lbW9yeScgOiB7J3BhcmFtJzogJ3BBbGxvY2F0ZUluZm8nLCAndHh0JzogWydpZiAocFBhY2tldC0+cEFsbG9jYXRlSW5mby0+c1R5cGUgPT0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8pIHtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8qKiBwcE5leHQgPSAoVmtNZW1vcnlBbGxvY2F0ZUluZm8qKikgJihwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5wTmV4dCk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICpwcE5leHQgPSAoVmtNZW1vcnlBbGxvY2F0ZUluZm8qKSB2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPnBOZXh0KTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9IGVsc2Uge1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAvLyBUaGlzIGlzIHVuZXhwZWN0ZWQuXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHZrdHJhY2VfTG9nRXJyb3IoIkFsbG9jYXRlTWVtb3J5IG11c3QgaGF2ZSBBbGxvY0luZm8gc3R5cGUgb2YgVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8uIik7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHBQYWNrZXQtPmhlYWRlciA9IE5VTEw7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfSddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsbG9jYXRlRGVzY3JpcHRvclNldHMnIDogeydwYXJhbSc6ICdwQWxsb2NhdGVJbmZvJywgJ3R4dCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydWa0Rlc2NyaXB0b3JTZXRMYXlvdXQgKipwcERlc2NTZXRMYXlvdXQgPSAoVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICoqKSAmcFBhY2tldC0+cEFsbG9jYXRlSW5mby0+cFNldExheW91dHM7XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICpwcERlc2NTZXRMYXlvdXQgPSAoVmtEZXNjcmlwdG9yU2V0TGF5b3V0ICopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPnBTZXRMYXlvdXRzKSk7J119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXBkYXRlRGVzY3JpcHRvclNldHMnIDogeydwYXJhbSc6ICdwRGVzY3JpcHRvcldyaXRlcycsICd0eHQnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgJ3VpbnQzMl90IGk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciAoaSA9IDA7IGkgPCBwUGFja2V0LT5kZXNjcmlwdG9yV3JpdGVDb3VudDsgaSsrKSB7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBzd2l0Y2ggKHBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLmRlc2NyaXB0b3JUeXBlKSB7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU0FNUExFUjonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSOicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NBTVBMRURfSU1BR0U6JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9JTUFHRTonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBjYXNlIFZLX0RFU0NSSVBUT1JfVFlQRV9JTlBVVF9BVFRBQ0hNRU5UOicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICB7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBWa0Rlc2NyaXB0b3JJbWFnZUluZm8qKiBwcEltYWdlSW5mbyA9IChWa0Rlc2NyaXB0b3JJbWFnZUluZm8qKikmcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEltYWdlSW5mbztcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgKnBwSW1hZ2VJbmZvID0gKFZrRGVzY3JpcHRvckltYWdlSW5mbyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wSW1hZ2VJbmZvKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICB9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrOycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fVEVYRUxfQlVGRkVSOicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfVEVYRUxfQlVGRkVSOicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICB7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBWa0J1ZmZlclZpZXcqKiBwcFRleGVsQnVmZmVyVmlldyA9IChWa0J1ZmZlclZpZXcqKikmcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucFRleGVsQnVmZmVyVmlldztcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgKnBwVGV4ZWxCdWZmZXJWaWV3ID0gKFZrQnVmZmVyVmlldyopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wRGVzY3JpcHRvcldyaXRlc1tpXS5wVGV4ZWxCdWZmZXJWaWV3KTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICB9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIGJyZWFrOycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSOicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1NUT1JBR0VfQlVGRkVSOicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGNhc2UgVktfREVTQ1JJUFRPUl9UWVBFX1VOSUZPUk1fQlVGRkVSX0RZTkFNSUM6JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgY2FzZSBWS19ERVNDUklQVE9SX1RZUEVfU1RPUkFHRV9CVUZGRVJfRFlOQU1JQzonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgeycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgVmtEZXNjcmlwdG9yQnVmZmVySW5mbyoqIHBwQnVmZmVySW5mbyA9IChWa0Rlc2NyaXB0b3JCdWZmZXJJbmZvKiopJnBQYWNrZXQtPnBEZXNjcmlwdG9yV3JpdGVzW2ldLnBCdWZmZXJJbmZvO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAqcHBCdWZmZXJJbmZvID0gKFZrRGVzY3JpcHRvckJ1ZmZlckluZm8qKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cERlc2NyaXB0b3JXcml0ZXNbaV0ucEJ1ZmZlckluZm8pO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgYnJlYWs7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgZGVmYXVsdDonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgYnJlYWs7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1F1ZXVlU3VibWl0JyA6IHsncGFyYW0nOiAncFN1Ym1pdHMnLCAndHh0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICd1aW50MzJfdCBpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgKGkgPSAwOyBpIDwgcFBhY2tldC0+c3VibWl0Q291bnQ7IGkrKykge1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICBWa0NvbW1hbmRCdWZmZXIqKiBwcENCcyA9IChWa0NvbW1hbmRCdWZmZXIqKikmcFBhY2tldC0+cFN1Ym1pdHNbaV0ucENvbW1hbmRCdWZmZXJzO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAqcHBDQnMgPSAoVmtDb21tYW5kQnVmZmVyKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBTdWJtaXRzW2ldLnBDb21tYW5kQnVmZmVycyk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIFZrU2VtYXBob3JlKiogcHBTZW1zID0gKFZrU2VtYXBob3JlKiopJnBQYWNrZXQtPnBTdWJtaXRzW2ldLnBXYWl0U2VtYXBob3JlcztcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgKnBwU2VtcyA9IChWa1NlbWFwaG9yZSopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wU3VibWl0c1tpXS5wV2FpdFNlbWFwaG9yZXMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICBwcFNlbXMgPSAoVmtTZW1hcGhvcmUqKikmcFBhY2tldC0+cFN1Ym1pdHNbaV0ucFNpZ25hbFNlbWFwaG9yZXM7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICpwcFNlbXMgPSAoVmtTZW1hcGhvcmUqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cFN1Ym1pdHNbaV0ucFNpZ25hbFNlbWFwaG9yZXMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyoqIHBwU3RhZ2VNYXNrID0gKFZrUGlwZWxpbmVTdGFnZUZsYWdzKiopJnBQYWNrZXQtPnBTdWJtaXRzW2ldLnBXYWl0RHN0U3RhZ2VNYXNrO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAqcHBTdGFnZU1hc2sgPSAoVmtQaXBlbGluZVN0YWdlRmxhZ3MqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cFN1Ym1pdHNbaV0ucFdhaXREc3RTdGFnZU1hc2spO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlR3JhcGhpY3NQaXBlbGluZXMnIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mb3MnLCAndHh0JzogY3JlYXRlX2dmeF9waXBlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZUNvbXB1dGVQaXBlbGluZScgOiB7J3BhcmFtJzogJ3BDcmVhdGVJbmZvJywgJ3R4dCc6IFsnaW50ZXJwcmV0X1ZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8ocEhlYWRlciwgKFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8qKSgmcFBhY2tldC0+cENyZWF0ZUluZm8tPmNzKSk7J119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlRnJhbWVidWZmZXInIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbJ1ZrSW1hZ2VWaWV3KiogcHBBViA9IChWa0ltYWdlVmlldyoqKSYocFBhY2tldC0+cENyZWF0ZUluZm8tPnBBdHRhY2htZW50cyk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJypwcEFWID0gKFZrSW1hZ2VWaWV3Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KShwUGFja2V0LT5wQ3JlYXRlSW5mby0+cEF0dGFjaG1lbnRzKSk7J119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ21kQmVnaW5SZW5kZXJQYXNzJyA6IHsncGFyYW0nOiAncFJlbmRlclBhc3NCZWdpbicsICd0eHQnOiBbJ1ZrQ2xlYXJWYWx1ZSoqIHBwQ1YgPSAoVmtDbGVhclZhbHVlKiopJihwUGFja2V0LT5wUmVuZGVyUGFzc0JlZ2luLT5wQ2xlYXJWYWx1ZXMpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqcHBDViA9IChWa0NsZWFyVmFsdWUqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpKHBQYWNrZXQtPnBSZW5kZXJQYXNzQmVnaW4tPnBDbGVhclZhbHVlcykpOyddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZVNoYWRlck1vZHVsZScgOiB7J3BhcmFtJzogJ3BDcmVhdGVJbmZvJywgJ3R4dCc6IFsndm9pZCoqIHBwQ29kZSA9ICh2b2lkKiopJihwUGFja2V0LT5wQ3JlYXRlSW5mby0+cENvZGUpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKnBwQ29kZSA9ICh2b2lkKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wQ29kZSk7J119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlSW1hZ2UnIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbJ3VpbnQzMl90KiogcHBRdWV1ZUZhbWlseUluZGljZXMgPSAodWludDMyX3QqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKnBwUXVldWVGYW1pbHlJbmRpY2VzID0gKHVpbnQzMl90Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKTsnXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVCdWZmZXInIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbJ3VpbnQzMl90KiogcHBRdWV1ZUZhbWlseUluZGljZXMgPSAodWludDMyX3QqKikmKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKnBwUXVldWVGYW1pbHlJbmRpY2VzID0gKHVpbnQzMl90Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKTsnXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcycgOiB7J3BhcmFtJzogJ3BwRGF0YScsICd0eHQnOiBbJ3VpbnQzMl90IGkgPSAwO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIChpID0gMDsgaSA8IHBQYWNrZXQtPm1lbW9yeVJhbmdlQ291bnQ7IGkrKylcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBwUGFja2V0LT5wcERhdGFbaV0gPSAodm9pZCopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdClwUGFja2V0LT5wcERhdGFbaV0pO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfSddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWRhdGVNYXBwZWRNZW1vcnlSYW5nZXMnIDogeydwYXJhbSc6ICdwcERhdGEnLCAndHh0JzogWyd1aW50MzJfdCBpID0gMDtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciAoaSA9IDA7IGkgPCBwUGFja2V0LT5tZW1vcnlSYW5nZUNvdW50OyBpKyspXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgcFBhY2tldC0+cHBEYXRhW2ldID0gKHZvaWQqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+cHBEYXRhW2ldKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRdWV1ZVByZXNlbnRLSFInIDogeydwYXJhbSc6ICdwUHJlc2VudEluZm8nLCAndHh0JzogWydWa1N3YXBjaGFpbktIUiAqKnBwU0MgPSAoVmtTd2FwY2hhaW5LSFIgKiopJiBwUGFja2V0LT5wUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJypwcFNDID0gKFZrU3dhcGNoYWluS0hSKil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KShwUGFja2V0LT5wUHJlc2VudEluZm8tPnBTd2FwY2hhaW5zKSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmtTZW1hcGhvcmUgKipwcFMgPSAoVmtTZW1hcGhvcmUgKiopICZwUGFja2V0LT5wUHJlc2VudEluZm8tPnBXYWl0U2VtYXBob3JlcztcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqcHBTID0gKFZrU2VtYXBob3JlICopIHZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpKHBQYWNrZXQtPnBQcmVzZW50SW5mby0+cFdhaXRTZW1hcGhvcmVzKSk7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndWludDMyX3QgKipwcElJID0gKHVpbnQzMl90ICoqKSAmcFBhY2tldC0+cFByZXNlbnRJbmZvLT5wSW1hZ2VJbmRpY2VzO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJypwcElJID0gKHVpbnQzMl90Kil2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KShwUGFja2V0LT5wUHJlc2VudEluZm8tPnBJbWFnZUluZGljZXMpKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZiAocFBhY2tldC0+cFByZXNlbnRJbmZvLT5wUmVzdWx0cyAhPSBOVUxMKSB7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIFZrUmVzdWx0ICoqcHBSID0gKFZrUmVzdWx0ICoqKSAmcFBhY2tldC0+cFByZXNlbnRJbmZvLT5wUmVzdWx0cztcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgKnBwUiA9IChWa1Jlc3VsdCopdmt0cmFjZV90cmFjZV9wYWNrZXRfaW50ZXJwcmV0X2J1ZmZlcl9wb2ludGVyKHBIZWFkZXIsIChpbnRwdHJfdCkocFBhY2tldC0+cFByZXNlbnRJbmZvLT5wUmVzdWx0cykpO1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVTd2FwY2hhaW5LSFInIDogeydwYXJhbSc6ICdwQ3JlYXRlSW5mbycsICd0eHQnOiBbJ3VpbnQzMl90ICoqcHBRRkkgPSAodWludDMyX3QqKikmcFBhY2tldC0+cENyZWF0ZUluZm8tPnBRdWV1ZUZhbWlseUluZGljZXM7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCpwcFFGSSkgPSAodWludDMyX3QqKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5wUXVldWVGYW1pbHlJbmRpY2VzKSk7J119LAorCisgICAgICAgIH0KKyAgICAgICAgaWZfYm9keSA9IFtdCisgICAgICAgIGlmX2JvZHkuYXBwZW5kKCd0eXBlZGVmIHN0cnVjdCBwYWNrZXRfdmtBcGlWZXJzaW9uIHsnKQorICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogaGVhZGVyOycpCisgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgdWludDMyX3QgdmVyc2lvbjsnKQorICAgICAgICBpZl9ib2R5LmFwcGVuZCgnfSBwYWNrZXRfdmtBcGlWZXJzaW9uO1xuJykKKyAgICAgICAgaWZfYm9keS5hcHBlbmQoJ3N0YXRpYyBwYWNrZXRfdmtBcGlWZXJzaW9uKiBpbnRlcnByZXRfYm9keV9hc192a0FwaVZlcnNpb24odmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKScpCisgICAgICAgIGlmX2JvZHkuYXBwZW5kKCd7JykKKyAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICBwYWNrZXRfdmtBcGlWZXJzaW9uKiBwUGFja2V0ID0gKHBhY2tldF92a0FwaVZlcnNpb24qKXBIZWFkZXItPnBCb2R5OycpCisgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgcFBhY2tldC0+aGVhZGVyID0gcEhlYWRlcjsnKQorICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHJldHVybiBwUGFja2V0OycpCisgICAgICAgIGlmX2JvZHkuYXBwZW5kKCd9XG4nKQorICAgICAgICBmb3IgcHJvdG8gaW4gc2VsZi5wcm90b3M6CisgICAgICAgICAgICBpZiBwcm90by5uYW1lIG5vdCBpbiBwcm90b19leGNsdXNpb25zOgorICAgICAgICAgICAgICAgIGlmICdVbm1hcE1lbW9yeScgPT0gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8ucGFyYW1zLmFwcGVuZCh2dWxrYW4uUGFyYW0oInZvaWQqIiwgInBEYXRhIikpCisgICAgICAgICAgICAgICAgZWxpZiAnRmx1c2hNYXBwZWRNZW1vcnlSYW5nZXMnID09IHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHByb3RvLnBhcmFtcy5hcHBlbmQodnVsa2FuLlBhcmFtKCJ2b2lkKioiLCAicHBEYXRhIikpCisgICAgICAgICAgICAgICAgZWxpZiAnSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcycgPT0gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8ucGFyYW1zLmFwcGVuZCh2dWxrYW4uUGFyYW0oInZvaWQqKiIsICJwcERhdGEiKSkKKyAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnJXMnICUgc2VsZi5saW5laW5mby5nZXQoKSkKKyAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgndHlwZWRlZiBzdHJ1Y3QgcGFja2V0X3ZrJXMgeycgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgdmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBoZWFkZXI7JykKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm90by5wYXJhbXM6CisgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgJXM7JyAlIHAuYygpKQorICAgICAgICAgICAgICAgIGlmICd2b2lkJyAhPSBwcm90by5yZXQ6CisgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgJXMgcmVzdWx0OycgJSBwcm90by5yZXQpCisgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJ30gcGFja2V0X3ZrJXM7XG4nICUgcHJvdG8ubmFtZSkKKyAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnc3RhdGljIHBhY2tldF92ayVzKiBpbnRlcnByZXRfYm9keV9hc192ayVzKHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlciknICUgKHByb3RvLm5hbWUsIHByb3RvLm5hbWUpKQorICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCd7JykKKyAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHBhY2tldF92ayVzKiBwUGFja2V0ID0gKHBhY2tldF92ayVzKilwSGVhZGVyLT5wQm9keTsnICUgKHByb3RvLm5hbWUsIHByb3RvLm5hbWUpKQorICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgcFBhY2tldC0+aGVhZGVyID0gcEhlYWRlcjsnKQorICAgICAgICAgICAgICAgIGZvciBwIGluIHByb3RvLnBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgaWYgJyonIGluIHAudHk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAnRGV2aWNlQ3JlYXRlSW5mbycgaW4gcC50eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHBQYWNrZXQtPiVzID0gaW50ZXJwcmV0X1ZrRGV2aWNlQ3JlYXRlSW5mbyhwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+JXMpOycgJSAocC5uYW1lLCBwLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiAnSW5zdGFuY2VDcmVhdGVJbmZvJyBpbiBwLnR5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgcFBhY2tldC0+JXMgPSBpbnRlcnByZXRfVmtJbnN0YW5jZUNyZWF0ZUluZm8ocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPiVzKTsnICUgKHAubmFtZSwgcC5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICBwUGFja2V0LT4lcyA9ICglcyl2a3RyYWNlX3RyYWNlX3BhY2tldF9pbnRlcnByZXRfYnVmZmVyX3BvaW50ZXIocEhlYWRlciwgKGludHB0cl90KXBQYWNrZXQtPiVzKTsnICUgKHAubmFtZSwgcC50eSwgcC5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVE9ETyA6IEdlbmVyYWxpemUgdGhpcyBjdXN0b20gY29kZSB0byBraWxsIGRpY3QgZGF0YSBzdHJ1Y3QgYWJvdmUuCisgICAgICAgICAgICAgICAgICAgICAgICAjICBSZWFsbHkgdGhlIHBvaW50IG9mIHRoaXMgYmxvY2sgaXMgdG8gY2F0Y2ggcGFyYW1zIHcvIGVtYmVkZGVkIHB0cnMgdG8gc3RydWN0cyBhbmQgY2hhaW5zIG9mIHN0cnVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgaW4gY3VzdG9tX2Nhc2VfZGljdCBhbmQgcC5uYW1lID09IGN1c3RvbV9jYXNlX2RpY3RbcHJvdG8ubmFtZV1bJ3BhcmFtJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICBpZiAocFBhY2tldC0+JXMgIT0gTlVMTCknICUgY3VzdG9tX2Nhc2VfZGljdFtwcm90by5uYW1lXVsncGFyYW0nXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgICAgICVzJyAlICIgICAgICAgICIuam9pbihjdXN0b21fY2FzZV9kaWN0W3Byb3RvLm5hbWVdWyd0eHQnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHJldHVybiBwUGFja2V0OycpCisgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJ31cbicpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaWZfYm9keSkKKworICAgIGRlZiBfZ2VuZXJhdGVfaW50ZXJwX2Z1bmNzX2V4dChzZWxmLCBleHRlbnNpb25OYW1lKToKKyAgICAgICAgaWZfYm9keSA9IFtdCisgICAgICAgIGN1c3RvbV9jYXNlX2RpY3QgPSB7IH0KKyAgICAgICAgZm9yIGV4dCBpbiB2dWxrYW4uZXh0ZW5zaW9uc19hbGw6CisgICAgICAgICAgICBpZiBleHQubmFtZS5sb3dlcigpID09IGV4dGVuc2lvbk5hbWUubG93ZXIoKToKKyAgICAgICAgICAgICAgICBpZiBleHQuaWZkZWY6CisgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcjaWZkZWYgJXMnICUgZXh0LmlmZGVmKQorICAgICAgICAgICAgICAgIGZvciBwcm90byBpbiBleHQucHJvdG9zOgorICAgICAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgndHlwZWRlZiBzdHJ1Y3QgcGFja2V0X3ZrJXMgeycgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciogcEhlYWRlcjsnKQorICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm90by5wYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgICVzOycgJSBwLmMoKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgJ3ZvaWQnICE9IHByb3RvLnJldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcgICAgJXMgcmVzdWx0OycgJSBwcm90by5yZXQpCisgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCd9IHBhY2tldF92ayVzO1xuJyAlIHByb3RvLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCdzdGF0aWMgcGFja2V0X3ZrJXMqIGludGVycHJldF9ib2R5X2FzX3ZrJXModmt0cmFjZV90cmFjZV9wYWNrZXRfaGVhZGVyKiBwSGVhZGVyKScgJSAocHJvdG8ubmFtZSwgcHJvdG8ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCd7JykKKyAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICBwYWNrZXRfdmslcyogcFBhY2tldCA9IChwYWNrZXRfdmslcyopcEhlYWRlci0+cEJvZHk7JyAlIChwcm90by5uYW1lLCBwcm90by5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICBwUGFja2V0LT5wSGVhZGVyID0gcEhlYWRlcjsnKQorICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm90by5wYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAnKicgaW4gcC50eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnICAgIHBQYWNrZXQtPiVzID0gKCVzKXZrdHJhY2VfdHJhY2VfcGFja2V0X2ludGVycHJldF9idWZmZXJfcG9pbnRlcihwSGVhZGVyLCAoaW50cHRyX3QpcFBhY2tldC0+JXMpOycgJSAocC5uYW1lLCBwLnR5LCBwLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVE9ETyA6IEdlbmVyYWxpemUgdGhpcyBjdXN0b20gY29kZSB0byBraWxsIGRpY3QgZGF0YSBzdHJ1Y3QgYWJvdmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgUmVhbGx5IHRoZSBwb2ludCBvZiB0aGlzIGJsb2NrIGlzIHRvIGNhdGNoIHBhcmFtcyB3LyBlbWJlZGRlZCBwdHJzIHRvIHN0cnVjdHMgYW5kIGNoYWlucyBvZiBzdHJ1Y3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBpbiBjdXN0b21fY2FzZV9kaWN0IGFuZCBwLm5hbWUgPT0gY3VzdG9tX2Nhc2VfZGljdFtwcm90by5uYW1lXVsncGFyYW0nXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICBpZiAocFBhY2tldC0+JXMgIT0gTlVMTCknICUgY3VzdG9tX2Nhc2VfZGljdFtwcm90by5uYW1lXVsncGFyYW0nXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICAgICAgJXMnICUgIiAgICAgICAgIi5qb2luKGN1c3RvbV9jYXNlX2RpY3RbcHJvdG8ubmFtZV1bJ3R4dCddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgICAgICAgICAgICAgaWZfYm9keS5hcHBlbmQoJyAgICByZXR1cm4gcFBhY2tldDsnKQorICAgICAgICAgICAgICAgICAgICBpZl9ib2R5LmFwcGVuZCgnfVxuJykKKyAgICAgICAgICAgICAgICBpZiBleHQuaWZkZWY6CisgICAgICAgICAgICAgICAgICAgIGlmX2JvZHkuYXBwZW5kKCcjZW5kaWYgLyogJXMgKi8nICUgZXh0LmlmZGVmKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGlmX2JvZHkpCisKKyAgICBkZWYgX2dlbmVyYXRlX3JlcGxheV9mdW5jX3B0cnMoc2VsZik6CisgICAgICAgIHhmX2JvZHkgPSBbXQorICAgICAgICB4Zl9ib2R5LmFwcGVuZCgnc3RydWN0IHZrRnVuY3MgeycpCisgICAgICAgIHhmX2JvZHkuYXBwZW5kKCcgICAgdm9pZCBpbml0X2Z1bmNzKHZvaWQgKiBsaWJIYW5kbGUpOycpCisgICAgICAgIHhmX2JvZHkuYXBwZW5kKCcgICAgdm9pZCAqbV9saWJIYW5kbGU7XG4nKQorICAgICAgICBmb3IgZXh0IGluIHZ1bGthbi5leHRlbnNpb25zX2FsbDoKKyAgICAgICAgICAgIGlmIGV4dC5pZmRlZjoKKyAgICAgICAgICAgICAgICB4Zl9ib2R5LmFwcGVuZCgnI2lmZGVmICVzJyAlIGV4dC5pZmRlZikKKyAgICAgICAgICAgIGZvciBwcm90byBpbiBleHQucHJvdG9zOgorICAgICAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgaW4gcHJvdG9fZXhjbHVzaW9uczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHhmX2JvZHkuYXBwZW5kKCcgICAgdHlwZWRlZiAlcyggVktBUElfUFRSICogdHlwZV92ayVzKSgnICUgKHByb3RvLnJldCwgcHJvdG8ubmFtZSkpCisgICAgICAgICAgICAgICAgZm9yIHAgaW4gcHJvdG8ucGFyYW1zOgorICAgICAgICAgICAgICAgICAgICB4Zl9ib2R5LmFwcGVuZCgnICAgICAgICAlcywnICUgcC5jKCkpCisgICAgICAgICAgICAgICAgeGZfYm9keVstMV0gPSB4Zl9ib2R5Wy0xXS5yZXBsYWNlKCcsJywgJyk7JykKKyAgICAgICAgICAgICAgICB4Zl9ib2R5LmFwcGVuZCgnICAgIHR5cGVfdmslcyByZWFsX3ZrJXM7JyAlIChwcm90by5uYW1lLCBwcm90by5uYW1lKSkKKyAgICAgICAgICAgIGlmIGV4dC5pZmRlZjoKKyAgICAgICAgICAgICAgICB4Zl9ib2R5LmFwcGVuZCgnI2VuZGlmIC8qICVzICovJyAlIGV4dC5pZmRlZikKKyAgICAgICAgeGZfYm9keS5hcHBlbmQoJ307JykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbih4Zl9ib2R5KQorCisgICAgZGVmIF9tYXBfZGVjbChzZWxmLCB0eXBlMSwgdHlwZTIsIG5hbWUpOgorICAgICAgICByZXR1cm4gJyAgICBzdGQ6Om1hcDwlcywgJXM+ICVzOycgJSAodHlwZTEsIHR5cGUyLCBuYW1lKQorCisgICAgZGVmIF9hZGRfdG9fbWFwX2RlY2woc2VsZiwgdHlwZTEsIHR5cGUyLCBuYW1lKToKKyAgICAgICAgdHh0ID0gJyAgICB2b2lkIGFkZF90b18lc19tYXAoJXMgcFRyYWNlVmFsLCAlcyBwUmVwbGF5VmFsKVxuICAgIHtcbicgJSAobmFtZVsyOl0sIHR5cGUxLCB0eXBlMikKKyAgICAgICAgI1RPRE8xMzggOiBUaGVzZSBjaGVja3MgbmVlZCB0byB2YXJ5IGJldHdlZW4gZGlzcCAmIG5vbi1kaXNwIG9iamVjdHMKKyAgICAgICAgI3R4dCArPSAnICAgICAgICBhc3NlcnQocFRyYWNlVmFsICE9IDApO1xuJworICAgICAgICAjdHh0ICs9ICcgICAgICAgIGFzc2VydChwUmVwbGF5VmFsICE9IDApO1xuJworICAgICAgICB0eHQgKz0gJyAgICAgICAgJXNbcFRyYWNlVmFsXSA9IHBSZXBsYXlWYWw7XG4gICAgfVxuJyAlIG5hbWUKKyAgICAgICAgcmV0dXJuIHR4dAorCisgICAgZGVmIF9ybV9mcm9tX21hcF9kZWNsKHNlbGYsIHR5LCBuYW1lKToKKyAgICAgICAgdHh0ID0gJyAgICB2b2lkIHJtX2Zyb21fJXNfbWFwKGNvbnN0ICVzJiBrZXkpXG4gICAge1xuJyAlIChuYW1lWzI6XSwgdHkpCisgICAgICAgIHR4dCArPSAnICAgICAgICAlcy5lcmFzZShrZXkpO1xuICAgIH1cbicgJSBuYW1lCisgICAgICAgIHJldHVybiB0eHQKKworICAgIGRlZiBfcmVtYXBfZGVjbChzZWxmLCB0eSwgbmFtZSk6CisgICAgICAgIHR4dCA9ICcgICAgJXMgcmVtYXBfJXMoY29uc3QgJXMmIHZhbHVlKVxuICAgIHtcbicgJSAodHksIG5hbWVbMjpdLCB0eSkKKyAgICAgICAgdHh0ICs9ICcgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7IHJldHVybiAwOyB9XG4nCisgICAgICAgIHR4dCArPSAnICAgICAgICBzdGQ6Om1hcDwlcywgJXM+Ojpjb25zdF9pdGVyYXRvciBxID0gJXMuZmluZCh2YWx1ZSk7XG4nICUgKHR5LCB0eSwgbmFtZSkKKyAgICAgICAgdHh0ICs9ICcgICAgICAgIGlmIChxID09ICVzLmVuZCgpKSB7IHZrdHJhY2VfTG9nRXJyb3IoIkZhaWxlZCB0byByZW1hcCAlcy4iKTsgcmV0dXJuIFZLX05VTExfSEFORExFOyB9XG4nICUgKG5hbWUsIHR5KQorICAgICAgICB0eHQgKz0gJyAgICAgICAgcmV0dXJuIHEtPnNlY29uZDtcbiAgICB9XG4nCisgICAgICAgIHJldHVybiB0eHQKKworICAgIGRlZiBfZ2VuZXJhdGVfcmVwbGF5X29iak1lbW9yeV9mdW5jcyhzZWxmKToKKyAgICAgICAgcm9mX2JvZHkgPSBbXQorICAgICAgICAjIEN1c3RvbSBjb2RlIGZvciBtZW1vcnkgbWFwcGluZyBmdW5jdGlvbnMgZm9yIGFwcCB3cml0ZXMgaW50byBtYXBwZWQgbWVtb3J5CisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnLy8gbWVtb3J5IG1hcHBpbmcgZnVuY3Rpb25zIGZvciBhcHAgd3JpdGVzIGludG8gbWFwcGVkIG1lbW9yeScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIGJvb2wgaXNQZW5kaW5nQWxsb2MoKScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgcmV0dXJuIG1fcGVuZGluZ0FsbG9jOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIHZvaWQgc2V0QWxsb2NJbmZvKGNvbnN0IFZrTWVtb3J5QWxsb2NhdGVJbmZvICppbmZvLCBjb25zdCBib29sIHBlbmRpbmcpJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBtX3BlbmRpbmdBbGxvYyA9IHBlbmRpbmc7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIG1fYWxsb2NJbmZvID0gKmluZm87JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgdm9pZCBzZXRNZW1vcnlEYXRhQWRkcih2b2lkICpwQnVmKScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgaWYgKG1fbWFwUmFuZ2UuZW1wdHkoKSknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgeycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiZ3B1TWVtb3J5OjpzZXRNZW1vcnlEYXRhQWRkcigpIG1fbWFwUmFuZ2UgaXMgZW1wdHkuIik7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICByZXR1cm47JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgTWFwUmFuZ2UgbXIgPSBtX21hcFJhbmdlLmJhY2soKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgaWYgKG1yLnBEYXRhICE9IE5VTEwpJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoImdwdU1lbW9yeTo6c2V0TWVtb3J5RGF0YUFkZHIoKSBkYXRhIGFscmVhZHkgbWFwcGVkIG92ZXJ3cml0ZSBvbGQgbWFwcGluZy4iKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgZWxzZSBpZiAocEJ1ZiA9PSBOVUxMKScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJncHVNZW1vcnk6OnNldE1lbW9yeURhdGFBZGRyKCkgYWRkaW5nIE5VTEwgcG9pbnRlci4iKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgbXIucERhdGEgPSAodWludDhfdCAqKSBwQnVmOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJycpCisgICAgICAgICMgYWRkIGZvciBwYWdlIGd1YXJkIG9wdGltaXphdGlvbgorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICB2b2lkIGNvcHlNYXBwaW5nRGF0YVBhZ2VHdWFyZChjb25zdCB2b2lkKiBwU3JjRGF0YSknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIGlmIChtX21hcFJhbmdlLmVtcHR5KCkpJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoImdwdU1lbW9yeTo6Y29weU1hcHBpbmdEYXRhKCkgbV9tYXBSYW5nZSBpcyBlbXB0eS4iKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHJldHVybjsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBNYXBSYW5nZSBtciA9IG1fbWFwUmFuZ2UuYmFjaygpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBpZiAoIXBTcmNEYXRhIHx8ICFtci5wRGF0YSknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgeycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKCFwU3JjRGF0YSknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJncHVNZW1vcnk6OmNvcHlNYXBwaW5nRGF0YSgpIG51bGwgc3JjIHBvaW50ZXIuIik7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBlbHNlJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiZ3B1TWVtb3J5Ojpjb3B5TWFwcGluZ0RhdGEoKSBudWxsIGRlc3QgcG9pbnRlciB0b3RhbFNpemU9JXUuIiwgbV9hbGxvY0luZm8uYWxsb2NhdGlvblNpemUpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgbV9tYXBSYW5nZS5wb3BfYmFjaygpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgcmV0dXJuOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbyAqcENoYW5nZWRJbmZvQXJyYXkgPSAoUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbyAqKXBTcmNEYXRhOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBpZiAocENoYW5nZWRJbmZvQXJyYXlbMF0ubGVuZ3RoKScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBQQllURSBwQ2hhbmdlZERhdGEgPSAoUEJZVEUpKHBTcmNEYXRhKStzaXplb2YoUGFnZUd1YXJkQ2hhbmdlZEJsb2NrSW5mbykqKHBDaGFuZ2VkSW5mb0FycmF5WzBdLm9mZnNldCArIDEpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgRFdPUkQgQ3VycmVudE9mZnNldCA9IDA7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBmb3IgKERXT1JEIGkgPSAwOyBpIDwgcENoYW5nZWRJbmZvQXJyYXlbMF0ub2Zmc2V0OyBpKyspJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICB7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgaWYgKChzaXplX3QpcENoYW5nZWRJbmZvQXJyYXlbaSArIDFdLmxlbmd0aCknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIG1lbWNweShtci5wRGF0YSArICAoc2l6ZV90KXBDaGFuZ2VkSW5mb0FycmF5W2kgKyAxXS5vZmZzZXQsIHBDaGFuZ2VkRGF0YSArIEN1cnJlbnRPZmZzZXQsIChzaXplX3QpcENoYW5nZWRJbmZvQXJyYXlbaSArIDFdLmxlbmd0aCk7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgfScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIEN1cnJlbnRPZmZzZXQgKz0gcENoYW5nZWRJbmZvQXJyYXlbaSArIDFdLmxlbmd0aDsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIH0nKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJycpCisgICAgICAgICMgIGFkZCBmb3IgcGFnZSBndWFyZCBvcHRpbWl6YXRpb24gZW5kCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgIHZvaWQgc2V0TWVtb3J5TWFwUmFuZ2Uodm9pZCAqcEJ1ZiwgY29uc3Qgc2l6ZV90IHNpemUsIGNvbnN0IHNpemVfdCBvZmZzZXQsIGNvbnN0IGJvb2wgcGVuZGluZyknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIE1hcFJhbmdlIG1yOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBtci5wRGF0YSA9ICh1aW50OF90ICopIHBCdWY7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIGlmIChzaXplID09IDApJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBtci5zaXplID0gKHNpemVfdCltX2FsbG9jSW5mby5hbGxvY2F0aW9uU2l6ZSAtIG9mZnNldDsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgZWxzZScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgbXIuc2l6ZSA9IHNpemU7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIG1yLm9mZnNldCA9IG9mZnNldDsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgbXIucGVuZGluZyA9IHBlbmRpbmc7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIG1fbWFwUmFuZ2UucHVzaF9iYWNrKG1yKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgYXNzZXJ0KChzaXplX3QpbV9hbGxvY0luZm8uYWxsb2NhdGlvblNpemUgPj0gKHNpemUgKyBvZmZzZXQpKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICB2b2lkIGNvcHlNYXBwaW5nRGF0YShjb25zdCB2b2lkKiBwU3JjRGF0YSwgYm9vbCBlbnRpcmVfbWFwLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG9mZnNldCknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIGlmIChtX21hcFJhbmdlLmVtcHR5KCkpJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoImdwdU1lbW9yeTo6Y29weU1hcHBpbmdEYXRhKCkgbV9tYXBSYW5nZSBpcyBlbXB0eS4iKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHJldHVybjsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBNYXBSYW5nZSBtciA9IG1fbWFwUmFuZ2UuYmFjaygpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBpZiAoIXBTcmNEYXRhIHx8ICFtci5wRGF0YSknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgeycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKCFwU3JjRGF0YSknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJncHVNZW1vcnk6OmNvcHlNYXBwaW5nRGF0YSgpIG51bGwgc3JjIHBvaW50ZXIuIik7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBlbHNlJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiZ3B1TWVtb3J5Ojpjb3B5TWFwcGluZ0RhdGEoKSBudWxsIGRlc3QgcG9pbnRlciB0b3RhbFNpemU9JXUuIiwgbV9hbGxvY0luZm8uYWxsb2NhdGlvblNpemUpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgbV9tYXBSYW5nZS5wb3BfYmFjaygpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgcmV0dXJuOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIGlmIChlbnRpcmVfbWFwKScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBzaXplID0gbXIuc2l6ZTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIG9mZnNldCA9IDA7ICAgLy8gcG9pbnRlciB0byBtYXBwZWQgYnVmZmVyIGlzIGZyb20gb2Zmc2V0IDAnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBlbHNlJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGFzc2VydChvZmZzZXQgPj0gbXIub2Zmc2V0KTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGFzc2VydChzaXplIDw9IG1yLnNpemUgJiYgKHNpemUgKyBvZmZzZXQpIDw9IChzaXplX3QpbV9hbGxvY0luZm8uYWxsb2NhdGlvblNpemUpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgICAgIG1lbWNweShtci5wRGF0YSArIG9mZnNldCwgcFNyY0RhdGEsIHNpemUpOycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICBpZiAoIW1yLnBlbmRpbmcgJiYgZW50aXJlX21hcCknKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIG1fbWFwUmFuZ2UucG9wX2JhY2soKTsnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByb2ZfYm9keS5hcHBlbmQoJyAgICBzaXplX3QgZ2V0TWVtb3J5TWFwU2l6ZSgpJykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgeycpCisgICAgICAgIHJvZl9ib2R5LmFwcGVuZCgnICAgICAgICByZXR1cm4gKCFtX21hcFJhbmdlLmVtcHR5KCkpID8gbV9tYXBSYW5nZS5iYWNrKCkuc2l6ZSA6IDA7JykKKyAgICAgICAgcm9mX2JvZHkuYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihyb2ZfYm9keSkKKworICAgIGRlZiBfZ2VuZXJhdGVfcmVwbGF5X29iam1hcHBlcl9jbGFzcyhzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgZGljdCBtYXBwaW5nIG1lbWJlciB2YXIgbmFtZXMgdG8gVksgdHlwZSAoaS5lLiAnbV9pbWFnZVZpZXdzJyA6ICdWa0ltYWdlX1ZJRVcnKQorICAgICAgICBvYmpfbWFwX2RpY3QgPSB7fQorICAgICAgICBmb3Igb2JqIGluIHZ1bGthbi5vYmplY3RfdHlwZV9saXN0OgorICAgICAgICAgICAgaWYgKG9iai5zdGFydHN3aXRoKCdWaycpKToKKyAgICAgICAgICAgICAgICBtZW1fdmFyID0gb2JqLnJlcGxhY2UoJ1ZrJywgJycpLmxvd2VyKCkKKyAgICAgICAgICAgIG1lbV92YXJfbGlzdCA9IG1lbV92YXIuc3BsaXQoJ18nKQorICAgICAgICAgICAgbWVtX3ZhciA9ICdtXyVzJXNzJyAlIChtZW1fdmFyX2xpc3RbMF0sICIiLmpvaW4oW20udGl0bGUoKSBmb3IgbSBpbiBtZW1fdmFyX2xpc3RbMTpdXSkpCisgICAgICAgICAgICBvYmpfbWFwX2RpY3RbbWVtX3Zhcl0gPSBvYmoKKyAgICAgICAgcmNfYm9keSA9IFtdCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcjZGVmaW5lIFZLVFJBQ0VfVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV04gKFZrT2JqZWN0VHlwZSktMScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgndHlwZWRlZiBzdHJ1Y3QgX1ZLQWxsb2NJbmZvIHsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIFZrRGV2aWNlU2l6ZSBzaXplOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgdWludDhfdCAqcERhdGE7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICBib29sIHJhbmdlVXBkYXRlZDsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnfSBWS0FsbG9jSW5mbzsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ2NsYXNzIG9iak1lbW9yeSB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ3B1YmxpYzonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIG9iak1lbW9yeSgpIDogbV9udW1BbGxvY2F0aW9ucygwKSwgbV9wTWVtUmVxcyhOVUxMKSB7fScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfm9iak1lbW9yeSgpIHsgZnJlZShtX3BNZW1SZXFzKTt9JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB2b2lkIHNldENvdW50KGNvbnN0IHVpbnQzMl90IG51bSknKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIHsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBtX251bUFsbG9jYXRpb25zID0gbnVtOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfVxuJykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB2b2lkIHNldFJlcXMoY29uc3QgVmtNZW1vcnlSZXF1aXJlbWVudHMgKnBSZXFzLCBjb25zdCB1aW50MzJfdCBudW0pJykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgaWYgKG1fbnVtQWxsb2NhdGlvbnMgIT0gbnVtICYmIG1fbnVtQWxsb2NhdGlvbnMgIT0gMCknKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigib2JqTWVtb3J5OjpzZXRSZXFzLCBpbnRlcm5hbCBtaXNtYXRjaCBvbiBudW1iZXIgb2YgYWxsb2NhdGlvbnMuIik7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgaWYgKG1fcE1lbVJlcXMgPT0gTlVMTCAmJiBwUmVxcyAhPSBOVUxMKScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgbV9wTWVtUmVxcyA9IChWa01lbW9yeVJlcXVpcmVtZW50cyAqKSB2a3RyYWNlX21hbGxvYyhudW0gKiBzaXplb2YoVmtNZW1vcnlSZXF1aXJlbWVudHMpKTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKG1fcE1lbVJlcXMgPT0gTlVMTCknKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigib2JqTWVtb3J5OjpzZXRSZXFzIG91dCBvZiBtZW1vcnkuIik7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm47JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgbWVtY3B5KG1fcE1lbVJlcXMsIHBSZXFzLCBudW0gKiBzaXplb2YoVmtNZW1vcnlSZXF1aXJlbWVudHMpKTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB9XG4nKQorICAgICAgICByY19ib2R5LmFwcGVuZCgncHJpdmF0ZTonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIHVpbnQzMl90IG1fbnVtQWxsb2NhdGlvbnM7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyAqbV9wTWVtUmVxczsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnfTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ2NsYXNzIGdwdU1lbW9yeSB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ3B1YmxpYzonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIGdwdU1lbW9yeSgpIDogbV9wZW5kaW5nQWxsb2MoZmFsc2UpIHttX2FsbG9jSW5mby5hbGxvY2F0aW9uU2l6ZSA9IDA7fScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfmdwdU1lbW9yeSgpIHt9JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoc2VsZi5fZ2VuZXJhdGVfcmVwbGF5X29iak1lbW9yeV9mdW5jcygpKQorICAgICAgICByY19ib2R5LmFwcGVuZCgncHJpdmF0ZTonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIGJvb2wgbV9wZW5kaW5nQWxsb2M7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICBzdHJ1Y3QgTWFwUmFuZ2UgeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIGJvb2wgcGVuZGluZzsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBzaXplX3Qgc2l6ZTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBzaXplX3Qgb2Zmc2V0OycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIHVpbnQ4X3QqIHBEYXRhOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIHN0ZDo6dmVjdG9yPE1hcFJhbmdlPiBtX21hcFJhbmdlOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gbV9hbGxvY0luZm87JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ307JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCd0eXBlZGVmIHN0cnVjdCBfaW1hZ2VPYmogeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgIG9iak1lbW9yeSBpbWFnZU1lbTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICBWa0ltYWdlIHJlcGxheUltYWdlOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgfSBpbWFnZU9iajsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ3R5cGVkZWYgc3RydWN0IF9idWZmZXJPYmogeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgIG9iak1lbW9yeSBidWZmZXJNZW07JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgVmtCdWZmZXIgcmVwbGF5QnVmZmVyOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgfSBidWZmZXJPYmo7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCd0eXBlZGVmIHN0cnVjdCBfZ3B1TWVtT2JqIHsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICBncHVNZW1vcnkgKnBHcHVNZW07JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgVmtEZXZpY2VNZW1vcnkgcmVwbGF5R3B1TWVtOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgfSBncHVNZW1PYmo7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnY2xhc3MgdmtSZXBsYXlPYmpNYXBwZXIgeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCdwdWJsaWM6JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB2a1JlcGxheU9iak1hcHBlcigpIHt9JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB+dmtSZXBsYXlPYmpNYXBwZXIoKSB7fScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnIGJvb2wgbV9hZGp1c3RGb3JHUFU7IC8vIHRydWUgaWYgcmVwbGF5IGFkanVzdHMgYmVoYXZpb3IgYmFzZWQgb24gR1BVJykKKyAgICAgICAgIyBDb2RlIGZvciBtZW1vcnkgb2JqZWN0cyBmb3IgaGFuZGxpbmcgcmVwbGF5IEdQVSAhPSB0cmFjZSBHUFUgb2JqZWN0IG1lbW9yeSByZXF1aXJlbWVudHMKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ3ZvaWQgaW5pdF9vYmpNZW1Db3VudChjb25zdCB1aW50NjRfdCBoYW5kbGUsIGNvbnN0IFZrRGVidWdSZXBvcnRPYmplY3RUeXBlRVhUIG9iamVjdFR5cGUsIGNvbnN0IHVpbnQzMl90ICZudW0pXG4geycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgc3dpdGNoIChvYmplY3RUeXBlKSB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVDonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHN0ZDo6bWFwPFZrQnVmZmVyLCBidWZmZXJPYmo+OjppdGVyYXRvciBpdCA9IG1fYnVmZmVycy5maW5kKChWa0J1ZmZlcikgaGFuZGxlKTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKGl0ICE9IG1fYnVmZmVycy5lbmQoKSkgeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgb2JqTWVtb3J5IG9iaiA9IGl0LT5zZWNvbmQuYnVmZmVyTWVtOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgb2JqLnNldENvdW50KG51bSk7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm47JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgYnJlYWs7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVDonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHN0ZDo6bWFwPFZrSW1hZ2UsIGltYWdlT2JqPjo6aXRlcmF0b3IgaXQgPSBtX2ltYWdlcy5maW5kKChWa0ltYWdlKSBoYW5kbGUpOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAoaXQgIT0gbV9pbWFnZXMuZW5kKCkpIHsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIG9iak1lbW9yeSBvYmogPSBpdC0+c2Vjb25kLmltYWdlTWVtOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgb2JqLnNldENvdW50KG51bSk7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm47JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgYnJlYWs7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIGRlZmF1bHQ6JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGJyZWFrOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgcmV0dXJuOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCd9XG4nKQorICAgICAgICByY19ib2R5LmFwcGVuZCgndm9pZCBpbml0X29iak1lbVJlcXMoY29uc3QgdWludDY0X3QgaGFuZGxlLCBjb25zdCBWa0RlYnVnUmVwb3J0T2JqZWN0VHlwZUVYVCBvYmplY3RUeXBlLCBjb25zdCBWa01lbW9yeVJlcXVpcmVtZW50cyAqcE1lbVJlcXMsIGNvbnN0IHVuc2lnbmVkIGludCBudW0pXG4gICAgeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgc3dpdGNoIChvYmplY3RUeXBlKSB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgY2FzZSBWS19ERUJVR19SRVBPUlRfT0JKRUNUX1RZUEVfQlVGRkVSX0VYVDonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHN0ZDo6bWFwPFZrQnVmZmVyLCBidWZmZXJPYmo+OjppdGVyYXRvciBpdCA9IG1fYnVmZmVycy5maW5kKChWa0J1ZmZlcikgaGFuZGxlKTsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKGl0ICE9IG1fYnVmZmVycy5lbmQoKSkgeycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgb2JqTWVtb3J5IG9iaiA9IGl0LT5zZWNvbmQuYnVmZmVyTWVtOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgb2JqLnNldFJlcXMocE1lbVJlcXMsIG51bSk7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm47JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgYnJlYWs7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIGNhc2UgVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX0lNQUdFX0VYVDonKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHN0ZDo6bWFwPFZrSW1hZ2UsIGltYWdlT2JqPjo6aXRlcmF0b3IgaXQgPSBtX2ltYWdlcy5maW5kKChWa0ltYWdlKSBoYW5kbGUpOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAoaXQgIT0gbV9pbWFnZXMuZW5kKCkpIHsnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIG9iak1lbW9yeSBvYmogPSBpdC0+c2Vjb25kLmltYWdlTWVtOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgb2JqLnNldFJlcXMocE1lbVJlcXMsIG51bSk7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm47JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgYnJlYWs7JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIGRlZmF1bHQ6JykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGJyZWFrOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgcmV0dXJuOycpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfScpCisgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIHZvaWQgY2xlYXJfYWxsX21hcF9oYW5kbGVzKClcbiAgICB7JykKKyAgICAgICAgZm9yIHZhciBpbiBzb3J0ZWQob2JqX21hcF9kaWN0KToKKyAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICVzLmNsZWFyKCk7JyAlIHZhcikKKyAgICAgICAgZm9yIHZhciBpbiBhZGRpdGlvbmFsX3JlbWFwX2RpY3Q6CisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBtXyVzLmNsZWFyKCk7JyAldmFyKQorICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIH1cbicpCisgICAgICAgIGRpc3Bfb2JqX3R5cGVzID0gW29iaiBmb3Igb2JqIGluIHZ1bGthbi5vYmplY3RfZGlzcGF0Y2hfbGlzdF0KKyAgICAgICAgZm9yIHZhciBpbiBzb3J0ZWQob2JqX21hcF9kaWN0KToKKyAgICAgICAgICAgIGlmIG9ial9tYXBfZGljdFt2YXJdID09ICdWa0ltYWdlJzoKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZChzZWxmLl9tYXBfZGVjbCgnVmtJbWFnZScsICdpbWFnZU9iaicsIHZhcikpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoc2VsZi5fYWRkX3RvX21hcF9kZWNsKCdWa0ltYWdlJywgJ2ltYWdlT2JqJywgdmFyKSkKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZChzZWxmLl9ybV9mcm9tX21hcF9kZWNsKCdWa0ltYWdlJywgdmFyKSkKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIFZrSW1hZ2UgcmVtYXBfaW1hZ2VzKGNvbnN0IFZrSW1hZ2UmIHZhbHVlKScpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBpZiAodmFsdWUgPT0gMCkgeyByZXR1cm4gMDsgfScpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgc3RkOjptYXA8VmtJbWFnZSwgaW1hZ2VPYmo+Ojpjb25zdF9pdGVyYXRvciBxID0gbV9pbWFnZXMuZmluZCh2YWx1ZSk7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBpZiAocSA9PSBtX2ltYWdlcy5lbmQoKSkgeyB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gcmVtYXAgVmtJbWFnZS4iKTsgcmV0dXJuIFZLX05VTExfSEFORExFOyB9XG4nKQorICAgICAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIHJldHVybiBxLT5zZWNvbmQucmVwbGF5SW1hZ2U7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIH1cbicpCisgICAgICAgICAgICBlbGlmIG9ial9tYXBfZGljdFt2YXJdID09ICdWa0J1ZmZlcic6CisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoc2VsZi5fbWFwX2RlY2woJ1ZrQnVmZmVyJywgJ2J1ZmZlck9iaicsIHZhcikpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoc2VsZi5fYWRkX3RvX21hcF9kZWNsKCdWa0J1ZmZlcicsICdidWZmZXJPYmonLCB2YXIpKQorICAgICAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKHNlbGYuX3JtX2Zyb21fbWFwX2RlY2woJ1ZrQnVmZmVyJywgdmFyKSkKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIFZrQnVmZmVyIHJlbWFwX2J1ZmZlcnMoY29uc3QgVmtCdWZmZXImIHZhbHVlKScpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBpZiAodmFsdWUgPT0gMCkgeyByZXR1cm4gMDsgfScpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgc3RkOjptYXA8VmtCdWZmZXIsIGJ1ZmZlck9iaj46OmNvbnN0X2l0ZXJhdG9yIHEgPSBtX2J1ZmZlcnMuZmluZCh2YWx1ZSk7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBpZiAocSA9PSBtX2J1ZmZlcnMuZW5kKCkpIHsgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIHJlbWFwIFZrQnVmZmVyLiIpOyByZXR1cm4gVktfTlVMTF9IQU5ETEU7IH1cbicpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgcmV0dXJuIHEtPnNlY29uZC5yZXBsYXlCdWZmZXI7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIH1cbicpCisgICAgICAgICAgICBlbGlmIG9ial9tYXBfZGljdFt2YXJdID09ICdWa0RldmljZU1lbW9yeSc6CisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoc2VsZi5fbWFwX2RlY2woJ1ZrRGV2aWNlTWVtb3J5JywgJ2dwdU1lbU9iaicsIHZhcikpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoc2VsZi5fYWRkX3RvX21hcF9kZWNsKCdWa0RldmljZU1lbW9yeScsICdncHVNZW1PYmonLCB2YXIpKQorICAgICAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKHNlbGYuX3JtX2Zyb21fbWFwX2RlY2woJ1ZrRGV2aWNlTWVtb3J5JywgdmFyKSkKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgIFZrRGV2aWNlTWVtb3J5IHJlbWFwX2RldmljZW1lbW9yeXMoY29uc3QgVmtEZXZpY2VNZW1vcnkmIHZhbHVlKScpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBpZiAodmFsdWUgPT0gMCkgeyByZXR1cm4gMDsgfScpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJycpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgc3RkOjptYXA8VmtEZXZpY2VNZW1vcnksIGdwdU1lbU9iaj46OmNvbnN0X2l0ZXJhdG9yIHEgPSBtX2RldmljZW1lbW9yeXMuZmluZCh2YWx1ZSk7JykKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBpZiAocSA9PSBtX2RldmljZW1lbW9yeXMuZW5kKCkpIHsgdmt0cmFjZV9Mb2dFcnJvcigiRmFpbGVkIHRvIHJlbWFwIFZrRGV2aWNlTWVtb3J5LiIpOyByZXR1cm4gVktfTlVMTF9IQU5ETEU7IH0nKQorICAgICAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIHJldHVybiBxLT5zZWNvbmQucmVwbGF5R3B1TWVtOycpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICB9XG4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZChzZWxmLl9tYXBfZGVjbChvYmpfbWFwX2RpY3RbdmFyXSwgb2JqX21hcF9kaWN0W3Zhcl0sIHZhcikpCisgICAgICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoc2VsZi5fYWRkX3RvX21hcF9kZWNsKG9ial9tYXBfZGljdFt2YXJdLCBvYmpfbWFwX2RpY3RbdmFyXSwgdmFyKSkKKyAgICAgICAgICAgICAgICByY19ib2R5LmFwcGVuZChzZWxmLl9ybV9mcm9tX21hcF9kZWNsKG9ial9tYXBfZGljdFt2YXJdLCB2YXIpKQorICAgICAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKHNlbGYuX3JlbWFwX2RlY2wob2JqX21hcF9kaWN0W3Zhcl0sIHZhcikpCisgICAgICAgIGZvciB2YXIgaW4gYWRkaXRpb25hbF9yZW1hcF9kaWN0OgorICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgc3RkOjptYXA8JXMsICVzPiBtXyVzOycgJSAoYWRkaXRpb25hbF9yZW1hcF9kaWN0W3Zhcl0sIGFkZGl0aW9uYWxfcmVtYXBfZGljdFt2YXJdLCB2YXIpKQorICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgdm9pZCBhZGRfdG9fJXNfbWFwKCVzIHRyYWNlVmFsLCAlcyByZXBsYXlWYWwpJyAlICh2YXIsIGFkZGl0aW9uYWxfcmVtYXBfZGljdFt2YXJdLCBhZGRpdGlvbmFsX3JlbWFwX2RpY3RbdmFyXSkpCisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBtXyVzW3RyYWNlVmFsXSA9IHJlcGxheVZhbDsnICUgdmFyKQorICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIHZvaWQgcm1fZnJvbV8lc19tYXAoY29uc3QgJXMmIGtleSknICUgKHZhciwgYWRkaXRpb25hbF9yZW1hcF9kaWN0W3Zhcl0pKQorICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgeycpCisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgbV8lcy5lcmFzZShrZXkpOycgJSB2YXIpCisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICB9JykKKyAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcnKQorICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgJXMgcmVtYXBfJXMoY29uc3QgJXMmIHZhbHVlKScgJSAoYWRkaXRpb25hbF9yZW1hcF9kaWN0W3Zhcl0sIHZhciwgYWRkaXRpb25hbF9yZW1hcF9kaWN0W3Zhcl0pKQorICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgeycpCisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgc3RkOjptYXA8JXMsICVzPjo6Y29uc3RfaXRlcmF0b3IgcSA9IG1fJXMuZmluZCh2YWx1ZSk7JyAlIChhZGRpdGlvbmFsX3JlbWFwX2RpY3RbdmFyXSwgYWRkaXRpb25hbF9yZW1hcF9kaWN0W3Zhcl0sIHZhcikpCisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKHEgPT0gbV8lcy5lbmQoKSkgeyB2a3RyYWNlX0xvZ0Vycm9yKCJGYWlsZWQgdG8gcmVtYXAgJXMuIik7IHJldHVybiBVSU5UMzJfTUFYOyB9JyAlICh2YXIsIHZhcikpCisgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICAgICAgcmV0dXJuIHEtPnNlY29uZDsnKQorICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisKKyAgICAgICAgIyBWa0R5bmFtaWNTdGF0ZU9iamVjdCBjb2RlCisjIFRPRE8xMzggOiBFYWNoIGR5bmFtaWMgc3RhdGUgb2JqZWN0IGlzIG5vdyB1bmlxdWUgc28gbmVlZCB0byBtYWtlIHN1cmUgdGhlaXIgcmUtbWFwcGluZyBpcyBiZWluZyBoYW5kbGVkIGNvcnJlY3RseQorIyAgICAgICAgc3RhdGVfb2JqX3JlbWFwX3R5cGVzID0gdnVsa2FuLm9iamVjdF9keW5hbWljX3N0YXRlX2xpc3QKKyMgICAgICAgIHN0YXRlX29ial9iaW5kaW5ncyA9IHZ1bGthbi5vYmplY3RfZHluYW1pY19zdGF0ZV9iaW5kX3BvaW50X2xpc3QKKyMgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgVmtEeW5hbWljU3RhdGVPYmplY3QgcmVtYXAoY29uc3QgVmtEeW5hbWljU3RhdGVPYmplY3QmIHN0YXRlLCBjb25zdCBWa1N0YXRlQmluZFBvaW50JiBiaW5kUG9pbnQpXG4gICAgeycpCisjICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBWa0R5bmFtaWNTdGF0ZU9iamVjdCBvYmo7JykKKyMgICAgICAgIGluZGV4ID0gMAorIyAgICAgICAgd2hpbGUgaW5kZXggPCBsZW4oc3RhdGVfb2JqX3JlbWFwX3R5cGVzKToKKyMgICAgICAgICAgICBvYmogPSBzdGF0ZV9vYmpfcmVtYXBfdHlwZXNbaW5kZXhdCisjICAgICAgICAgICAgdHlwZSA9IHN0YXRlX29ial9iaW5kaW5nc1tpbmRleF0KKyMgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBpZiAoYmluZFBvaW50ID09ICVzKSB7JyAlIHR5cGUpCisjICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmICgob2JqID0gcmVtYXAoc3RhdGljX2Nhc3QgPCVzPiAoc3RhdGUpKSkgIT0gVktfTlVMTF9IQU5ETEUpJyAlIG9iai50eXBlKQorIyAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgcmV0dXJuIG9iajsnKQorIyAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIH0nKQorIyAgICAgICAgICAgIGluZGV4ICs9IDEKKyMgICAgICAgIGZvciBvYmogaW4gc3RhdGVfb2JqX3JlbWFwX3R5cGVzOgorIyAgICAgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcvLyAgICAgICAgaWYgKChvYmogPSByZW1hcChzdGF0aWNfY2FzdCA8JXM+IChzdGF0ZSkpKSAhPSBWS19OVUxMX0hBTkRMRSknICUgb2JqLnR5cGUpCisjICAgICAgICAgICAgcmNfYm9keS5hcHBlbmQoJy8vICAgICAgICAgICAgcmV0dXJuIG9iajsnKQorIyAgICAgICAgcmNfYm9keS5hcHBlbmQoJyAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJGYWlsZWQgdG8gcmVtYXAgVmtEeW5hbWljU3RhdGVPYmplY3QuIik7JykKKyMgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgICAgIHJldHVybiBWS19OVUxMX0hBTkRMRTtcbiAgICB9JykKKyMgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgdm9pZCBybV9mcm9tX21hcChjb25zdCBWa0R5bmFtaWNTdGF0ZU9iamVjdCYgc3RhdGUpXG4gICAgeycpCisjICAgICAgICBmb3Igb2JqIGluIHN0YXRlX29ial9yZW1hcF90eXBlczoKKyMgICAgICAgICAgICByY19ib2R5LmFwcGVuZCgnICAgICAgICBybV9mcm9tX21hcChzdGF0aWNfY2FzdCA8JXM+IChzdGF0ZSkpOycgJSBvYmoudHlwZSkKKyMgICAgICAgIHJjX2JvZHkuYXBwZW5kKCcgICAgfScpCisjICAgICAgICByY19ib2R5LmFwcGVuZCgnJykKKyAgICAgICAgcmNfYm9keS5hcHBlbmQoJ307JykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihyY19ib2R5KQorCisgICAgZGVmIF9nZW5lcmF0ZV9yZXBsYXlfaW5pdF9mdW5jcyhzZWxmKToKKyAgICAgICAgcmlmX2JvZHkgPSBbXQorICAgICAgICByaWZfYm9keS5hcHBlbmQoJ3ZvaWQgdmtGdW5jczo6aW5pdF9mdW5jcyh2b2lkICogaGFuZGxlKVxue1xuICAgIG1fbGliSGFuZGxlID0gaGFuZGxlOycpCisgICAgICAgIGZvciBleHQgaW4gdnVsa2FuLmV4dGVuc2lvbnNfYWxsOgorICAgICAgICAgICAgaWYgZXh0LmlmZGVmOgorICAgICAgICAgICAgICAgIHJpZl9ib2R5LmFwcGVuZCgnI2lmZGVmICVzJyAlIGV4dC5pZmRlZikKKyAgICAgICAgICAgIGZvciBwcm90byBpbiBleHQucHJvdG9zOgorICAgICAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgaW4gcHJvdG9fZXhjbHVzaW9uczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAnRGVidWdSZXBvcnQnIG5vdCBpbiBwcm90by5uYW1lOgorICAgICAgICAgICAgICAgICAgICByaWZfYm9keS5hcHBlbmQoJyAgICByZWFsX3ZrJXMgPSAodHlwZV92ayVzKSh2a3RyYWNlX3BsYXRmb3JtX2dldF9saWJyYXJ5X2VudHJ5cG9pbnQoaGFuZGxlLCAidmslcyIpKTsnICUgKHByb3RvLm5hbWUsIHByb3RvLm5hbWUsIHByb3RvLm5hbWUpKQorICAgICAgICAgICAgICAgIGVsc2U6ICMgVGhlc2UgZnVuYyBwdHJzIGdldCBhc3NpZ25lZCBhdCBHZXRQcm9jQWRkciB0aW1lCisgICAgICAgICAgICAgICAgICAgIHJpZl9ib2R5LmFwcGVuZCgnICAgIHJlYWxfdmslcyA9ICh0eXBlX3ZrJXMpTlVMTDsnICUgKHByb3RvLm5hbWUsIHByb3RvLm5hbWUpKQorICAgICAgICAgICAgaWYgZXh0LmlmZGVmOgorICAgICAgICAgICAgICAgIHJpZl9ib2R5LmFwcGVuZCgnI2VuZGlmIC8qICVzICovJyAlIGV4dC5pZmRlZikKKyAgICAgICAgcmlmX2JvZHkuYXBwZW5kKCd9JykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihyaWZfYm9keSkKKworICAgIGRlZiBfcmVtYXBfcGFja2V0X3BhcmFtKHNlbGYsIGZ1bmNOYW1lLCBwYXJhbVR5cGUsIHBhcmFtTmFtZSwgbGFzdE5hbWUpOgorICAgICAgICByZW1hcF9saXN0ID0gdnVsa2FuLm9iamVjdF90eXBlX2xpc3QKKyAgICAgICAgcGFyYW1fZXhjbHVkZV9saXN0ID0gWydwRGVzY3JpcHRvclNldHMnLCAncEZlbmNlcyddCisgICAgICAgIGNsZWFuUGFyYW1UeXBlID0gcGFyYW1UeXBlLnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpCisgICAgICAgIFZ1bGtOb25EaXNwT2JqZWN0cyA9IFtvIGZvciBvIGluIHZ1bGthbi5vYmplY3Rfbm9uX2Rpc3BhdGNoX2xpc3RdCisgICAgICAgIGZvciBvYmogaW4gcmVtYXBfbGlzdDoKKyAgICAgICAgICAgIGlmIG9iaiA9PSBjbGVhblBhcmFtVHlwZSBhbmQgcGFyYW1OYW1lIG5vdCBpbiBwYXJhbV9leGNsdWRlX2xpc3Q6CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZVJlbWFwUGFyYW0gPSAnJworICAgICAgICAgICAgICAgIGlmICdWa0R5bmFtaWNTdGF0ZU9iamVjdCcgPT0gY2xlYW5QYXJhbVR5cGU6CisgICAgICAgICAgICAgICAgICAgIG9iamVjdFR5cGVSZW1hcFBhcmFtID0gJywgcFBhY2tldC0+c3RhdGVCaW5kUG9pbnQnCisgICAgICAgICAgICAgICAgZWxpZiAnb2JqZWN0JyA9PSBwYXJhbU5hbWU6CisgICAgICAgICAgICAgICAgICAgIGlmICdEYmdTZXRPYmplY3RUYWcnID09IGZ1bmNOYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZVJlbWFwUGFyYW0gPSAnLCBWS1RSQUNFX1ZLX0RFQlVHX1JFUE9SVF9PQkpFQ1RfVFlQRV9VTktOT1dOJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZVJlbWFwUGFyYW0gPSAnLCBwUGFja2V0LT5vYmpUeXBlJworICAgICAgICAgICAgICAgIGVsaWYgJ3NyY09iamVjdCcgPT0gcGFyYW1OYW1lIGFuZCAnQ2FsbGJhY2snIGluIGZ1bmNOYW1lOgorICAgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlUmVtYXBQYXJhbSA9ICcsIHBQYWNrZXQtPm9ialR5cGUnCisgICAgICAgICAgICAgICAgcEFycmF5ID0gJycKKyAgICAgICAgICAgICAgICBpZiAnKicgaW4gcGFyYW1UeXBlOgorICAgICAgICAgICAgICAgICAgICBpZiAnY29uc3QnIG5vdCBpbiBwYXJhbVR5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnICAgICAgICAlcyByZW1hcHBlZCVzID0gbV9vYmpNYXBwZXIucmVtYXBfJXNzKCpwUGFja2V0LT4lcyVzKTtcbicgJSAoY2xlYW5QYXJhbVR5cGUsIHBhcmFtTmFtZSwgcGFyYW1OYW1lLmxvd2VyKCksIHBhcmFtTmFtZSwgb2JqZWN0VHlwZVJlbWFwUGFyYW0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyAgICAgICAgaWYgKHBQYWNrZXQtPiVzICE9IFZLX05VTExfSEFORExFICYmIHJlbWFwcGVkJXMgPT0gVktfTlVMTF9IQU5ETEUpXG4nICUgKHBhcmFtTmFtZSwgcGFyYW1OYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgIHtcbicKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRXJyb3IgZGV0ZWN0ZWQgaW4gJXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCAlcy4iKTtcbicgJSAoZnVuY05hbWUsIGNsZWFuUGFyYW1UeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICByZXR1cm4gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0VSUk9SO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgIH1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxhc3ROYW1lID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnICAgICAgICAgICAgLy8gcFBhY2tldC0+JXMgc2hvdWxkIGhhdmUgYmVlbiByZW1hcHBlZCB3aXRoIHNwZWNpYWwgY2FzZSBjb2RlJyAlIChwYXJhbU5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXkgPSAnW3BQYWNrZXQtPiVzXScgJSBsYXN0TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJyAgICAgICAgICAgICVzICpyZW1hcHBlZCVzID0gbmV3ICVzJXM7XG4nICUgKGNsZWFuUGFyYW1UeXBlLCBwYXJhbU5hbWUsIGNsZWFuUGFyYW1UeXBlLCBwQXJyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyVzXG4nICUgc2VsZi5saW5laW5mby5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+JXM7IGkrKykge1xuJyAlIGxhc3ROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyAgICAgICAgICAgICAgICByZW1hcHBlZCVzW2ldID0gbV9vYmpNYXBwZXIucmVtYXBfJXNzKHBQYWNrZXQtPiVzW2ldJXMpO1xuJyAlIChwYXJhbU5hbWUsIGNsZWFuUGFyYW1UeXBlLmxvd2VyKClbMjpdLCBwYXJhbU5hbWUsIG9iamVjdFR5cGVSZW1hcFBhcmFtKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICAgICAgaWYgKHBQYWNrZXQtPiVzW2ldICE9IFZLX05VTExfSEFORExFICYmIHJlbWFwcGVkJXNbaV0gPT0gVktfTlVMTF9IQU5ETEUpXG4nICUgKHBhcmFtTmFtZSwgcGFyYW1OYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICAgICAge1xuJworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkVycm9yIGRldGVjdGVkIGluICVzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgJXMuIik7XG4nICUgKGZ1bmNOYW1lLCBjbGVhblBhcmFtVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0VSUk9SO1xuJworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICAgICAgfVxuJworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAnICAgICAgICAgICAgJXMgcmVtYXBwZWQlcyA9IG1fb2JqTWFwcGVyLnJlbWFwXyVzcyhwUGFja2V0LT4lcyVzKTtcbicgJSAocGFyYW1UeXBlLCBwYXJhbU5hbWUsIGNsZWFuUGFyYW1UeXBlLmxvd2VyKClbMjpdLCBwYXJhbU5hbWUsIG9iamVjdFR5cGVSZW1hcFBhcmFtKQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnJXNcbicgJSBzZWxmLmxpbmVpbmZvLmdldCgpCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICBpZiAocFBhY2tldC0+JXMgIT0gVktfTlVMTF9IQU5ETEUgJiYgcmVtYXBwZWQlcyA9PSBWS19OVUxMX0hBTkRMRSlcbicgJSAocGFyYW1OYW1lLCBwYXJhbU5hbWUpCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICB7XG4nCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRXJyb3IgZGV0ZWN0ZWQgaW4gJXMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCAlcy4iKTtcbicgJSAoZnVuY05hbWUsIGNsZWFuUGFyYW1UeXBlKQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnICAgICAgICAgICAgICAgIHJldHVybiB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfRVJST1I7XG4nCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgICAgICAgICAgICB9XG4nCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICByZXR1cm4gJyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVtYXAgJXMnICUgKHBhcmFtTmFtZSkKKworICAgIGRlZiBfZ2V0X3BhY2tldF9wYXJhbShzZWxmLCBmdW5jTmFtZSwgcGFyYW1UeXBlLCBwYXJhbU5hbWUpOgorICAgICAgICAjIGxpc3Qgb2YgdHlwZXMgdGhhdCByZXF1aXJlIHJlbWFwcGluZworICAgICAgICByZW1hcF9saXN0ID0gdnVsa2FuLm9iamVjdF90eXBlX2xpc3QKKyAgICAgICAgcGFyYW1fZXhjbHVkZV9saXN0ID0gWydwRGVzY3JpcHRvclNldHMnLCAncEZlbmNlcyddCisgICAgICAgIGNsZWFuUGFyYW1UeXBlID0gcGFyYW1UeXBlLnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpCisgICAgICAgIGZvciBvYmogaW4gcmVtYXBfbGlzdDoKKyAgICAgICAgICAgIGlmIG9iaiA9PSBjbGVhblBhcmFtVHlwZSBhbmQgcGFyYW1OYW1lIG5vdCBpbiBwYXJhbV9leGNsdWRlX2xpc3Q6CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZVJlbWFwUGFyYW0gPSAnJworICAgICAgICAgICAgICAgIGlmICdvYmplY3QnID09IHBhcmFtTmFtZToKKyAgICAgICAgICAgICAgICAgICAgaWYgJ0RiZ1NldE9iamVjdFRhZycgPT0gZnVuY05hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlUmVtYXBQYXJhbSA9ICcsIFZLVFJBQ0VfVktfREVCVUdfUkVQT1JUX09CSkVDVF9UWVBFX1VOS05PV04nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlUmVtYXBQYXJhbSA9ICcsIHBQYWNrZXQtPm9ialR5cGUnCisgICAgICAgICAgICAgICAgcmV0dXJuICdyZW1hcHBlZCVzJyAlIChwYXJhbU5hbWUpCisgICAgICAgIHJldHVybiAncFBhY2tldC0+JXMnICUgKHBhcmFtTmFtZSkKKworICAgIGRlZiBfZ2VuX3JlcGxheV9jcmVhdGVfaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGNiX2JvZHkgPSBbXQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgcmVwbGF5UmVzdWx0ID0gbWFudWFsbHlfcmVwbGF5X3ZrQ3JlYXRlSW5zdGFuY2UocFBhY2tldCk7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIENIRUNLX1JFVFVSTl9WQUxVRSh2a0NyZWF0ZUluc3RhbmNlKTsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKSB7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICBWa0luc3RhbmNlIHJlbWFwcGVkSW5zdGFuY2UgPSBtX29iak1hcHBlci5yZW1hcF9pbnN0YW5jZXMoKnBQYWNrZXQtPnBJbnN0YW5jZSk7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICBpZiAocmVtYXBwZWRJbnN0YW5jZSA9PSBWS19OVUxMX0hBTkRMRSkgeycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkVycm9yIGRldGVjdGVkIGluIHZrQ3JlYXRlSW5zdGFuY2UoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0luc3RhbmNlLiIpOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0VSUk9SOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIGJyZWFrOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgfScpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgVmtGbGFncyByZXBvcnRGbGFncyA9IFZLX0RFQlVHX1JFUE9SVF9JTkZPUk1BVElPTl9CSVRfRVhUIHwgVktfREVCVUdfUkVQT1JUX1dBUk5JTkdfQklUX0VYVCB8IFZLX0RFQlVHX1JFUE9SVF9QRVJGT1JNQU5DRV9XQVJOSU5HX0JJVF9FWFQgfCBWS19ERUJVR19SRVBPUlRfRVJST1JfQklUX0VYVCB8IFZLX0RFQlVHX1JFUE9SVF9ERUJVR19CSVRfRVhUOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgUEZOX3ZrQ3JlYXRlRGVidWdSZXBvcnRDYWxsYmFja0VYVCBjYWxsYmFjayA9IChQRk5fdmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUKXZrR2V0SW5zdGFuY2VQcm9jQWRkcihyZW1hcHBlZEluc3RhbmNlLCAidmtDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUIik7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gTlVMTCkgeycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIFZrRGVidWdSZXBvcnRDYWxsYmFja0NyZWF0ZUluZm9FWFQgZGJnQ3JlYXRlSW5mbzsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJmRiZ0NyZWF0ZUluZm8sIDAsIHNpemVvZihkYmdDcmVhdGVJbmZvKSk7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgZGJnQ3JlYXRlSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFQlVHX1JFUE9SVF9DUkVBVEVfSU5GT19FWFQ7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgZGJnQ3JlYXRlSW5mby5mbGFncyA9IHJlcG9ydEZsYWdzOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIGRiZ0NyZWF0ZUluZm8ucGZuQ2FsbGJhY2sgPSBnX2ZwRGJnTXNnQ2FsbGJhY2s7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgZGJnQ3JlYXRlSW5mby5wVXNlckRhdGEgPSBOVUxMOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayhyZW1hcHBlZEluc3RhbmNlLCAmZGJnQ3JlYXRlSW5mbywgTlVMTCwgJm1fZGJnTXNnQ2FsbGJhY2tPYmopICE9IFZLX1NVQ0NFU1MpIHsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dXYXJuaW5nKCJGYWlsZWQgdG8gcmVnaXN0ZXIgdnVsa2FuIGNhbGxiYWNrIGZvciByZXBsYXllciBlcnJvciBoYW5kbGluZy4iKTsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfRVJST1I7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgIH0nKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIH0nKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oY2JfYm9keSkKKworICAgICMgVGhlc2UgYXJlIGN1c3RvbWl6ZWQgYmVjYXVzZSB0aGV5IGFyZSB0aGUgb25seSBlbnRyeSBwb2ludHMgcmV0dXJuaW5nIFZrQm9vbDMyCisgICAgZGVmIF9nZW5fcmVwbGF5X0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiAoc2VsZik6CisgICAgICAgIGNiX2JvZHkgPSBbXQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgVmtCb29sMzIgcnZhbCA9IG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUihwUGFja2V0KTsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKHJ2YWwgIT0gcFBhY2tldC0+cmVzdWx0KScpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICB7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJSZXR1cm4gdmFsdWUgJWQgZnJvbSBBUEkgY2FsbCAodmtHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFIpIGRvZXMgbm90IG1hdGNoIHJldHVybiB2YWx1ZSBmcm9tIHRyYWNlIGZpbGUgJWQuIiwnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZhbCwgcFBhY2tldC0+cmVzdWx0KTsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0JBRF9SRVRVUk47JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGNiX2JvZHkpCisKKyAgICBkZWYgX2dlbl9yZXBsYXlfR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiAoc2VsZik6CisgICAgICAgIGNiX2JvZHkgPSBbXQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgVmtCb29sMzIgcnZhbCA9IG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlWGxpYlByZXNlbnRhdGlvblN1cHBvcnRLSFIocFBhY2tldCk7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmIChydmFsICE9IHBQYWNrZXQtPnJlc3VsdCknKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgeycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiUmV0dXJuIHZhbHVlICVkIGZyb20gQVBJIGNhbGwgKHZrR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUikgZG9lcyBub3QgbWF0Y2ggcmV0dXJuIHZhbHVlIGZyb20gdHJhY2UgZmlsZSAlZC4iLCcpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydmFsLCBwUGFja2V0LT5yZXN1bHQpOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfQkFEX1JFVFVSTjsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oY2JfYm9keSkKKworICAgIGRlZiBfZ2VuX3JlcGxheV9HZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUiAoc2VsZik6CisgICAgICAgIGNiX2JvZHkgPSBbXQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgVmtCb29sMzIgcnZhbCA9IG1hbnVhbGx5X3JlcGxheV92a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKHBQYWNrZXQpOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAocnZhbCAhPSBwUGFja2V0LT5yZXN1bHQpJykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHsnKQorICAgICAgICBjYl9ib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIlJldHVybiB2YWx1ZSAlZCBmcm9tIEFQSSBjYWxsICh2a0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSKSBkb2VzIG5vdCBtYXRjaCByZXR1cm4gdmFsdWUgZnJvbSB0cmFjZSBmaWxlICVkLiIsJykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2YWwsIHBQYWNrZXQtPnJlc3VsdCk7JykKKyAgICAgICAgY2JfYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9CQURfUkVUVVJOOycpCisgICAgICAgIGNiX2JvZHkuYXBwZW5kKCcgICAgICAgICAgICB9JykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihjYl9ib2R5KQorCisgICAgIyBHZW5lcmF0ZSBtYWluIHJlcGxheSBjYXNlIHN0YXRlbWVudHMgd2hlcmUgYWN0dWFsIHJlcGxheSBBUEkgY2FsbCBpcyBkaXNwYXRjaGVkIGJhc2VkIG9uIGlucHV0IHBhY2tldCBkYXRhCisgICAgZGVmIF9nZW5lcmF0ZV9yZXBsYXkoc2VsZik6CisgICAgICAgIG1hbnVhbGx5X3JlcGxheV9mdW5jcyA9IFsnQWxsb2NhdGVNZW1vcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JlZ2luQ29tbWFuZEJ1ZmZlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlRGVzY3JpcHRvclNldExheW91dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlRGV2aWNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVCdWZmZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NyZWF0ZUltYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVDb21tYW5kUG9vbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlRnJhbWVidWZmZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBpcGVsaW5lQ2FjaGVEYXRhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVHcmFwaGljc1BpcGVsaW5lcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ0NyZWF0ZUluc3RhbmNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVQaXBlbGluZUxheW91dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlUmVuZGVyUGFzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ21kQmVnaW5SZW5kZXJQYXNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDbWRCaW5kRGVzY3JpcHRvclNldHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NtZEJpbmRWZXJ0ZXhCdWZmZXJzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDbWRQaXBlbGluZUJhcnJpZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1F1ZXVlUHJlc2VudEtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ21kV2FpdEV2ZW50cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ0Rlc3Ryb3lPYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRnJlZU1lbW9yeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRnJlZURlc2NyaXB0b3JTZXRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGbHVzaE1hcHBlZE1lbW9yeVJhbmdlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZGF0ZU1hcHBlZE1lbW9yeVJhbmdlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ0dldEdsb2JhbEV4dGVuc2lvbkluZm8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydHZXRJbWFnZVN1YnJlc291cmNlSW5mbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ0dldE9iamVjdEluZm8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydHZXRQaHlzaWNhbERldmljZUV4dGVuc2lvbkluZm8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZVN1cHBvcnRLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUNhcGFiaWxpdGllc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlUHJlc2VudE1vZGVzS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVTd2FwY2hhaW5LSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFN3YXBjaGFpbkltYWdlc0tIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlWGNiU3VyZmFjZUtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlWGxpYlN1cmZhY2VLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlV2luMzJTdXJmYWNlS0hSJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHZXRQaHlzaWNhbERldmljZVdpbjMyUHJlc2VudGF0aW9uU3VwcG9ydEtIUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI1RPRE8gV2F5bGFuZCwgTWlyLCBYbGliCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ0dldFBoeXNpY2FsRGV2aWNlSW5mbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWFwTWVtb3J5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRdWV1ZVN1Ym1pdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUXVldWVCaW5kU3BhcnNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnU3RvcmVQaXBlbGluZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5tYXBNZW1vcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VwZGF0ZURlc2NyaXB0b3JTZXRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYWl0Rm9yRmVuY2VzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVEZWJ1Z1JlcG9ydENhbGxiYWNrRVhUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsb2NhdGVDb21tYW5kQnVmZmVycycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgIyB2YWxpZGF0ZSB0aGUgbWFudWFsbHlfcmVwbGF5X2Z1bmNzIGxpc3QKKyAgICAgICAgcHJvdG9GdW5jcyA9IFtwcm90by5uYW1lIGZvciBwcm90byBpbiBzZWxmLnByb3Rvc10KKyAgICAgICAgd3NpX3BsYXRmb3JtX21hbnVhbF9mdW5jcyA9IFsnQ3JlYXRlV2luMzJTdXJmYWNlS0hSJywgJ0NyZWF0ZVhjYlN1cmZhY2VLSFInLCAnQ3JlYXRlWGxpYlN1cmZhY2VLSFInLCAnQ3JlYXRlQW5kcm9pZFN1cmZhY2VLSFInXQorCisgICAgICAgIGZvciBmdW5jIGluIG1hbnVhbGx5X3JlcGxheV9mdW5jczoKKyAgICAgICAgICAgIGlmIChmdW5jIG5vdCBpbiBwcm90b0Z1bmNzKSBhbmQgKGZ1bmMgbm90IGluIHdzaV9wbGF0Zm9ybV9tYW51YWxfZnVuY3MpOgorICAgICAgICAgICAgICAgIHN5cy5leGl0KCJFbnRyeSAnJXMnIGluIG1hbnVhbGx5X3JlcGxheV9mdW5jcyBsaXN0IGlzIG5vdCBpbiB0aGUgdnVsa2FuIGZ1bmN0aW9uIHByb3RvdHlwZXMiICUgZnVuYykKKworICAgICAgICAjIG1hcCBwcm90b3MgdG8gY3VzdG9tIGZ1bmN0aW9ucyBpZiBib2R5IGlzIGZ1bGx5IGN1c3RvbQorICAgICAgICBjdXN0b21fYm9keV9kaWN0ID0geydDcmVhdGVJbnN0YW5jZSc6IHNlbGYuX2dlbl9yZXBsYXlfY3JlYXRlX2luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHZXRQaHlzaWNhbERldmljZVhjYlByZXNlbnRhdGlvblN1cHBvcnRLSFInOiBzZWxmLl9nZW5fcmVwbGF5X0dldFBoeXNpY2FsRGV2aWNlWGNiUHJlc2VudGF0aW9uU3VwcG9ydEtIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUic6IHNlbGYuX2dlbl9yZXBsYXlfR2V0UGh5c2ljYWxEZXZpY2VYbGliUHJlc2VudGF0aW9uU3VwcG9ydEtIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR2V0UGh5c2ljYWxEZXZpY2VXaW4zMlByZXNlbnRhdGlvblN1cHBvcnRLSFInOiBzZWxmLl9nZW5fcmVwbGF5X0dldFBoeXNpY2FsRGV2aWNlV2luMzJQcmVzZW50YXRpb25TdXBwb3J0S0hSIH0KKyAgICAgICAgIyBtdWx0aS1ncHUgT3BlbiBmdW5jcyB3LyBsaXN0IG9mIGxvY2FsIHBhcmFtcyB0byBjcmVhdGUKKyAgICAgICAgY3VzdG9tX29wZW5fcGFyYW1zID0geydPcGVuU2hhcmVkTWVtb3J5JzogKC0xLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT3BlblNoYXJlZFNlbWFwaG9yZSc6ICgtMSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09wZW5QZWVyTWVtb3J5JzogKC0xLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT3BlblBlZXJJbWFnZSc6ICgtMSwgLTIsKX0KKyAgICAgICAgIyBGdW5jdGlvbnMgdGhhdCBjcmVhdGUgdmlld3MgYXJlIHVuaXF1ZSBmcm9tIG90aGVyIGNyZWF0ZSBmdW5jdGlvbnMKKyAgICAgICAgY3JlYXRlX3ZpZXdfbGlzdCA9IFsnQ3JlYXRlQnVmZmVyVmlldycsICdDcmVhdGVJbWFnZVZpZXcnLCAnQ3JlYXRlQ29tcHV0ZVBpcGVsaW5lJ10KKyAgICAgICAgIyBGdW5jdGlvbnMgdG8gdHJlYXQgYXMgIkNyZWF0ZScgdGhhdCBkb24ndCBoYXZlICdDcmVhdGUnIGluIHRoZSBuYW1lCisgICAgICAgIHNwZWNpYWxfY3JlYXRlX2xpc3QgPSBbJ0xvYWRQaXBlbGluZScsICdMb2FkUGlwZWxpbmVEZXJpdmF0aXZlJywgJ0FsbG9jYXRlTWVtb3J5JywgJ0dldERldmljZVF1ZXVlJywgJ1BpblN5c3RlbU1lbW9yeScsICdBbGxvY2F0ZURlc2NyaXB0b3JTZXRzJywgJ0FjcXVpcmVOZXh0SW1hZ2VLSFInXQorICAgICAgICAjIEEgY291cGxlIGZ1bmNzIHVzZSBkbyB3aGlsZSBsb29wcworICAgICAgICBkb193aGlsZV9kaWN0ID0geydHZXRGZW5jZVN0YXR1cyc6ICdyZXBsYXlSZXN1bHQgIT0gcFBhY2tldC0+cmVzdWx0ICAmJiBwUGFja2V0LT5yZXN1bHQgPT0gVktfU1VDQ0VTUycsICdHZXRFdmVudFN0YXR1cyc6ICcocFBhY2tldC0+cmVzdWx0ID09IFZLX0VWRU5UX1NFVCB8fCBwUGFja2V0LT5yZXN1bHQgPT0gVktfRVZFTlRfUkVTRVQpICYmIHJlcGxheVJlc3VsdCAhPSBwUGFja2V0LT5yZXN1bHQnLCAnR2V0UXVlcnlQb29sUmVzdWx0cyc6ICdwUGFja2V0LT5yZXN1bHQgPT0gVktfU1VDQ0VTUyAmJiByZXBsYXlSZXN1bHQgIT0gcFBhY2tldC0+cmVzdWx0J30KKyAgICAgICAgcmJvZHkgPSBbXQorICAgICAgICByYm9keS5hcHBlbmQoJyVzJyAlIHNlbGYubGluZWluZm8uZ2V0KCkpCisgICAgICAgIHJib2R5LmFwcGVuZCgndmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX1JFU1VMVCB2a1JlcGxheTo6cmVwbGF5KHZrdHJhY2VfdHJhY2VfcGFja2V0X2hlYWRlciAqcGFja2V0KScpCisgICAgICAgIHJib2R5LmFwcGVuZCgneycpCisgICAgICAgIHJib2R5LmFwcGVuZCgnICAgIHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9SRVNVTFQgcmV0dXJuVmFsdWUgPSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfU1VDQ0VTUzsnKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICBWa1Jlc3VsdCByZXBsYXlSZXN1bHQgPSBWS19FUlJPUl9WQUxJREFUSU9OX0ZBSUxFRF9FWFQ7JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgc3dpdGNoIChwYWNrZXQtPnBhY2tldF9pZCknKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICB7JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgIGNhc2UgVktUUkFDRV9UUElfVktfdmtBcGlWZXJzaW9uOicpCisgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICB7JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBwYWNrZXRfdmtBcGlWZXJzaW9uKiBwUGFja2V0ID0gKHBhY2tldF92a0FwaVZlcnNpb24qKShwYWNrZXQtPnBCb2R5KTsnKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmIChWS19WRVJTSU9OX01BSk9SKHBQYWNrZXQtPnZlcnNpb24pICE9IDEgfHwgVktfVkVSU0lPTl9NSU5PUiAocFBhY2tldC0+dmVyc2lvbikgIT0gMCknKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHsnKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJUcmFjZSBmaWxlIGlzIGZyb20gVnVsa2FuIHZlcnNpb24gMHgleCAoJXUuJXUuJXUpLCBidXQgdGhlIHZrdHJhY2UgcGx1Z2luIG9ubHkgc3VwcG9ydHMgdmVyc2lvbiAweCV4ICgldS4ldS4ldSkuIiwgcFBhY2tldC0+dmVyc2lvbiwgKHBQYWNrZXQtPnZlcnNpb24gJiAweEZGQzAwMDAwKSA+PiAyMiwgKHBQYWNrZXQtPnZlcnNpb24gJiAweDAwM0ZGMDAwKSA+PiAxMiwgKHBQYWNrZXQtPnZlcnNpb24gJiAweDAwMDAwRkZGKSwgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwgKChWS19NQUtFX1ZFUlNJT04oMSwgMCwgVktfSEVBREVSX1ZFUlNJT04pKSAmIDB4RkZDMDAwMDApID4+IDIyLCAoKFZLX01BS0VfVkVSU0lPTigxLCAwLCBWS19IRUFERVJfVkVSU0lPTikpICYgMHgwMDNGRjAwMCkgPj4gMTIsICgoVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSkgJiAweDAwMDAwRkZGKSk7JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfRVJST1I7JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB9JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBicmVhazsnKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgfScpCisgICAgICAgIGZvciBwcm90byBpbiBzZWxmLnByb3RvczoKKyAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgaW4gcHJvdG9fZXhjbHVzaW9uczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIFRPRE8gOiBUaGlzIGlzIGFuIE8oTl40KSB3YXkgb2YgZmluZGluZyBpZiB0aGlzIHByb3RvIGlzIGd1YXJkZWQgYnkgYW4gaWZkZWYuCisgICAgICAgICAgICAjIElmIHRoZSBjb25jZXB0IG9mIGFuIGlmZGVmIGZpZWxkIGlzIG9rLCByZXdyaXRlIHRoZSBvdXRlciBsb29wIHRvIGFscmVhZHkgaGF2ZSB0aGUgZXh0LmlmZGVmIHZhbHVlIHJlYWR5OgorICAgICAgICAgICAgIyBmb3IgZXh0IGluIHZ1bGthbi5leHRlbnNpb25zX2FsbDoKKyAgICAgICAgICAgICMgICAgIGlmIGV4dC5pZmRlZjogaWZfYm9keS5hcHBlbmQoJyNpZmRlZicpICMgd3JhcCBhbGwgdGhlIHByb3RvcyBpbiBhIHNpbmdsZSAjaWZkZWYgYmxvY2sgaW5zdGVhZCBvZiByZXBlYXRpbmcgI2lmZGVmIGZvciBlYWNoIHByb3RvCisgICAgICAgICAgICAjICAgICBmb3IgcHJvdG8gaW4gZXh0LnByb3RvczoKKyAgICAgICAgICAgIHByb3RvX2V4dF9pZmRlZiA9IE5vbmUKKyAgICAgICAgICAgIGZvciBleHQgaW4gdnVsa2FuLmV4dGVuc2lvbnNfYWxsOgorICAgICAgICAgICAgICAgIGlmIGV4dC5pZmRlZjoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGV4dF9wcm90byBpbiBleHQucHJvdG9zOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSA9PSBleHRfcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b19leHRfaWZkZWYgPSBleHQuaWZkZWYKKyAgICAgICAgICAgIGlmIHByb3RvX2V4dF9pZmRlZjoKKyAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyNpZmRlZiAlcycgJSBwcm90b19leHRfaWZkZWYpCisKKyAgICAgICAgICAgIHJldF92YWx1ZSA9IEZhbHNlCisgICAgICAgICAgICBjcmVhdGVfdmlldyA9IEZhbHNlCisgICAgICAgICAgICBjcmVhdGVfZnVuYyA9IEZhbHNlCisgICAgICAgICAgICAjIFRPRE8gOiBIb3cgdG8gaGFuZGxlIHZvaWQqIHJldHVybiBvZiBHZXRQcm9jQWRkcj8KKyNUT0RPIG1ha2Ugc3VyZSB2a0Rlc3Ryb3kgb2JqZWN0IGZ1bmN0aW9ucyByZWFsbHkgZG8gY2xlYW4gdXAgdGhlIG9iamVjdCBtYXBzCisgICAgICAgICAgICBpZiAoJ3ZvaWQnIG5vdCBpbiBwcm90by5yZXQubG93ZXIoKSkgYW5kICgnc2l6ZV90JyBub3QgaW4gcHJvdG8ucmV0KSBhbmQgKHByb3RvLm5hbWUgbm90IGluIGN1c3RvbV9ib2R5X2RpY3QpOgorICAgICAgICAgICAgICAgIHJldF92YWx1ZSA9IFRydWUKKyAgICAgICAgICAgIGlmIHByb3RvLm5hbWUgaW4gY3JlYXRlX3ZpZXdfbGlzdDoKKyAgICAgICAgICAgICAgICBjcmVhdGVfdmlldyA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgJ0NyZWF0ZScgaW4gcHJvdG8ubmFtZSBvciBwcm90by5uYW1lIGluIHNwZWNpYWxfY3JlYXRlX2xpc3Q6CisgICAgICAgICAgICAgICAgY3JlYXRlX2Z1bmMgPSBUcnVlCisgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgY2FzZSBWS1RSQUNFX1RQSV9WS192ayVzOicgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgIHsnKQorICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBwYWNrZXRfdmslcyogcFBhY2tldCA9IChwYWNrZXRfdmslcyopKHBhY2tldC0+cEJvZHkpOycgJSAocHJvdG8ubmFtZSwgcHJvdG8ubmFtZSkpCisgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIG1hbnVhbGx5X3JlcGxheV9mdW5jczoKKyAgICAgICAgICAgICAgICBpZiByZXRfdmFsdWUgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICByZXBsYXlSZXN1bHQgPSBtYW51YWxseV9yZXBsYXlfdmslcyhwUGFja2V0KTsnICUgcHJvdG8ubmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIG1hbnVhbGx5X3JlcGxheV92ayVzKHBQYWNrZXQpOycgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgZWxpZiBwcm90by5uYW1lIGluIGN1c3RvbV9ib2R5X2RpY3Q6CisgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKGN1c3RvbV9ib2R5X2RpY3RbcHJvdG8ubmFtZV0oKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSBpbiBjdXN0b21fb3Blbl9wYXJhbXM6CisgICAgICAgICAgICAgICAgICAgIGZvciBwaWR4IGluIGN1c3RvbV9vcGVuX3BhcmFtc1twcm90by5uYW1lXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgJXMgbG9jYWxfJXM7JyAlIChwcm90by5wYXJhbXNbcGlkeF0udHkucmVwbGFjZSgnY29uc3QgJywgJycpLnN0cmlwKCcqJyksIHByb3RvLnBhcmFtc1twaWR4XS5uYW1lKSkKKyAgICAgICAgICAgICAgICBlbGlmIGNyZWF0ZV92aWV3OgorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICVzIGNyZWF0ZUluZm87JyAlIChwcm90by5wYXJhbXNbMV0udHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykpKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIG1lbWNweSgmY3JlYXRlSW5mbywgcFBhY2tldC0+cENyZWF0ZUluZm8sIHNpemVvZiglcykpOycgJSAocHJvdG8ucGFyYW1zWzFdLnR5LnN0cmlwKCcqJykucmVwbGFjZSgnY29uc3QgJywgJycpKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgJ0NyZWF0ZUNvbXB1dGVQaXBlbGluZScgPT0gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgY3JlYXRlSW5mby5jcy5zaGFkZXIgPSBtX29iak1hcHBlci5yZW1hcF9zaGFkZXJzKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5jcy5zaGFkZXIpOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmIChjcmVhdGVJbmZvLmNzLnNoYWRlciA9PSBWS19OVUxMX0hBTkRMRSAmJiBwUGFja2V0LT5wQ3JlYXRlSW5mby0+Y3Muc2hhZGVyICE9IFZLX05VTExfSEFORExFKScpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHsnKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRXJyb3IgZGV0ZWN0ZWQgaW4gdmtDcmVhdGVDb21wdXRlUGlwZWxpbmVzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtTaGFkZXIuIik7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIHJldHVybiB2a3RyYWNlX3JlcGxheTo6VktUUkFDRV9SRVBMQVlfRVJST1I7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgJ0NyZWF0ZUJ1ZmZlclZpZXcnID09IHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGNyZWF0ZUluZm8uYnVmZmVyID0gbV9vYmpNYXBwZXIucmVtYXBfYnVmZmVycyhwUGFja2V0LT5wQ3JlYXRlSW5mby0+YnVmZmVyKTsnKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAoY3JlYXRlSW5mby5idWZmZXIgPT0gVktfTlVMTF9IQU5ETEUgJiYgcFBhY2tldC0+cENyZWF0ZUluZm8tPmJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSknKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIHZrdHJhY2VfTG9nRXJyb3IoIkVycm9yIGRldGVjdGVkIGluIHZrQ3JlYXRlQnVmZmVyVmlldygpIGR1ZSB0byBpbnZhbGlkIHJlbWFwcGVkIFZrQnVmZmVyLiIpOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm4gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0VSUk9SOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBjcmVhdGVJbmZvLmltYWdlID0gbV9vYmpNYXBwZXIucmVtYXBfaW1hZ2VzKHBQYWNrZXQtPnBDcmVhdGVJbmZvLT5pbWFnZSk7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKGNyZWF0ZUluZm8uaW1hZ2UgPT0gVktfTlVMTF9IQU5ETEUgJiYgcFBhY2tldC0+cENyZWF0ZUluZm8tPmltYWdlICE9IFZLX05VTExfSEFORExFKScpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHsnKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgdmt0cmFjZV9Mb2dFcnJvcigiRXJyb3IgZGV0ZWN0ZWQgaW4gdmtDcmVhdGVJbWFnZVZpZXcoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0ltYWdlLiIpOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm4gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0VSUk9SOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICVzIGxvY2FsXyVzOycgJSAocHJvdG8ucGFyYW1zWy0xXS50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSwgcHJvdG8ucGFyYW1zWy0xXS5uYW1lKSkKKyAgICAgICAgICAgICAgICBlbGlmIGNyZWF0ZV9mdW5jOiAjIERlY2xhcmUgbG9jYWwgdmFyIHRvIHN0b3JlIGNyZWF0ZWQgaGFuZGxlIGludG8KKyAgICAgICAgICAgICAgICAgICAgaWYgJ0FsbG9jYXRlRGVzY3JpcHRvclNldHMnID09IHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBwX3R5ID0gcHJvdG8ucGFyYW1zWy0xXS50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAlcyogbG9jYWxfJXMgPSAoJXMqKW1hbGxvYyhwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQgKiBzaXplb2YoJXMpKTsnICUgKHBfdHksIHByb3RvLnBhcmFtc1stMV0ubmFtZSwgcF90eSwgcF90eSkpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldExheW91dCogbG9jYWxfcFNldExheW91dHMgPSAoVmtEZXNjcmlwdG9yU2V0TGF5b3V0KiltYWxsb2MocFBhY2tldC0+cEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50ICogc2l6ZW9mKFZrRGVzY3JpcHRvclNldExheW91dCkpOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIFZrRGVzY3JpcHRvclNldEFsbG9jYXRlSW5mbyBsb2NhbF9BbGxvY0luZm8sICpsb2NhbF9wQWxsb2NhdGVJbmZvID0gJmxvY2FsX0FsbG9jSW5mbzsnKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBWa0Rlc2NyaXB0b3JQb29sIGxvY2FsX2Rlc2NQb29sOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGxvY2FsX2Rlc2NQb29sID0gbV9vYmpNYXBwZXIucmVtYXBfZGVzY3JpcHRvcnBvb2xzKHBQYWNrZXQtPnBBbGxvY2F0ZUluZm8tPmRlc2NyaXB0b3JQb29sKTsnKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAobG9jYWxfZGVzY1Bvb2wgPT0gVktfTlVMTF9IQU5ETEUpJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgeycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJFcnJvciBkZXRlY3RlZCBpbiB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0Rlc2NyaXB0b3JQb29sLiIpOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICByZXR1cm4gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0VSUk9SOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFBhY2tldC0+cEFsbG9jYXRlSW5mby0+ZGVzY3JpcHRvclNldENvdW50OyBpKyspJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgeycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICBsb2NhbF9wU2V0TGF5b3V0c1tpXSA9IG1fb2JqTWFwcGVyLnJlbWFwX2Rlc2NyaXB0b3JzZXRsYXlvdXRzKHBQYWNrZXQtPiVzLT5wU2V0TGF5b3V0c1tpXSk7JyAlIChwcm90by5wYXJhbXNbLTJdLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3BTZXRMYXlvdXRzW2ldID09IFZLX05VTExfSEFORExFKScpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJFcnJvciBkZXRlY3RlZCBpbiB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMoKSBkdWUgdG8gaW52YWxpZCByZW1hcHBlZCBWa0Rlc2NyaXB0b3JTZXRMYXlvdXQuIik7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0VSUk9SOycpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB9JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIG1lbWNweShsb2NhbF9wQWxsb2NhdGVJbmZvLCBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLCBzaXplb2YoVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvKSk7JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgbG9jYWxfcEFsbG9jYXRlSW5mby0+cFNldExheW91dHMgPSBsb2NhbF9wU2V0TGF5b3V0czsnKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBsb2NhbF9wQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yUG9vbCA9IGxvY2FsX2Rlc2NQb29sOycpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICVzIGxvY2FsXyVzOycgJSAocHJvdG8ucGFyYW1zWy0xXS50eS5zdHJpcCgnKicpLnJlcGxhY2UoJ2NvbnN0ICcsICcnKSwgcHJvdG8ucGFyYW1zWy0xXS5uYW1lKSkKKyAgICAgICAgICAgICAgICBlbGlmIHByb3RvLm5hbWUgPT0gJ1Jlc2V0RmVuY2VzJzoKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBWa0ZlbmNlKiBmZW5jZXMgPSBWS1RSQUNFX05FV19BUlJBWShWa0ZlbmNlLCBwUGFja2V0LT5mZW5jZUNvdW50KTsnKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwUGFja2V0LT5mZW5jZUNvdW50OyBpKyspJykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB7JykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgZmVuY2VzW2ldID0gbV9vYmpNYXBwZXIucmVtYXBfZmVuY2VzKHBQYWNrZXQtPiVzW2ldKTsnICUgKHByb3RvLnBhcmFtc1stMV0ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIGlmIChmZW5jZXNbaV0gPT0gVktfTlVMTF9IQU5ETEUpJykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgeycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICB2a3RyYWNlX0xvZ0Vycm9yKCJFcnJvciBkZXRlY3RlZCBpbiB2a1Jlc2V0RmVuY2VzKCkgZHVlIHRvIGludmFsaWQgcmVtYXBwZWQgVmtGZW5jZS4iKTsnKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZrdHJhY2VfcmVwbGF5OjpWS1RSQUNFX1JFUExBWV9FUlJPUjsnKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICB9JykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB9JykKKyAgICAgICAgICAgICAgICBlbGlmIHByb3RvLm5hbWUgaW4gZG9fd2hpbGVfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBkbyB7JykKKyAgICAgICAgICAgICAgICBsYXN0X25hbWUgPSAnJworICAgICAgICAgICAgICAgIGZvciBwIGluIHByb3RvLnBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgaWYgY3JlYXRlX2Z1bmMgb3IgY3JlYXRlX3ZpZXc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwLm5hbWUgIT0gcHJvdG8ucGFyYW1zWy0xXS5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZChzZWxmLl9yZW1hcF9wYWNrZXRfcGFyYW0ocHJvdG8ubmFtZSwgcC50eSwgcC5uYW1lLCBsYXN0X25hbWUpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKHNlbGYuX3JlbWFwX3BhY2tldF9wYXJhbShwcm90by5uYW1lLCBwLnR5LCBwLm5hbWUsIGxhc3RfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGxhc3RfbmFtZSA9IHAubmFtZQorCisgICAgICAgICAgICAgICAgaWYgcHJvdG8ubmFtZSA9PSAnRGVzdHJveUluc3RhbmNlJzoKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAobV92a0Z1bmNzLnJlYWxfdmtEZXN0cm95RGVidWdSZXBvcnRDYWxsYmFja0VYVCAhPSBOVUxMKScpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgeycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIG1fdmtGdW5jcy5yZWFsX3ZrRGVzdHJveURlYnVnUmVwb3J0Q2FsbGJhY2tFWFQocmVtYXBwZWRpbnN0YW5jZSwgbV9kYmdNc2dDYWxsYmFja09iaiwgcFBhY2tldC0+cEFsbG9jYXRvcik7JykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB9JykKKyAgICAgICAgICAgICAgICAjIFRPRE86IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGluZGljYXRlIHdoaWNoIGV4dGVuc2lvbnMgc2hvdWxkIGJlIG1hcHBlZCB0byB3aGljaCBHZXQqUHJvY0FkZHIKKyAgICAgICAgICAgICAgICBlbGlmIHByb3RvLm5hbWUgPT0gJ0dldEluc3RhbmNlUHJvY0FkZHInOgorICAgICAgICAgICAgICAgICAgICBmb3IgaUV4dCBpbiB2dWxrYW4uZXh0ZW5zaW9uc19hbGw6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpRXh0LmlmZGVmOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnI2lmZGVmICVzJyAlIGlFeHQuaWZkZWYpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaVByb3RvIGluIGlFeHQucHJvdG9zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlQcm90by5uYW1lIGluIHByb3RvX2V4Y2x1c2lvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ0RlYnVnUmVwb3J0JyBpbiBpUHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAoc3RyY21wKHBQYWNrZXQtPnBOYW1lLCAidmslcyIpID09IDApIHsnICUgKGlQcm90by5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICBtX3ZrRnVuY3MucmVhbF92ayVzID0gKFBGTl92ayVzKXZrJXMocmVtYXBwZWRpbnN0YW5jZSwgcFBhY2tldC0+cE5hbWUpOycgJSAoaVByb3RvLm5hbWUsIGlQcm90by5uYW1lLCBwcm90by5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB9JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmICAoaVByb3RvLnBhcmFtc1swXS50eSA9PSAnVmtJbnN0YW5jZScgb3IgaVByb3RvLnBhcmFtc1swXS50eSAhPSAnVmtQaHlzaWNhbERldmljZScpICBhbmQgJ0tIUicgaW4gaVByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKHN0cmNtcChwUGFja2V0LT5wTmFtZSwgInZrJXMiKSA9PSAwKSB7JyAlIChpUHJvdG8ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgbV92a0Z1bmNzLnJlYWxfdmslcyA9IChQRk5fdmslcyl2ayVzKHJlbWFwcGVkaW5zdGFuY2UsIHBQYWNrZXQtPnBOYW1lKTsnICUgKGlQcm90by5uYW1lLCBpUHJvdG8ubmFtZSwgcHJvdG8ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpRXh0LmlmZGVmOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnI2VuZGlmIC8qICVzICovJyAlIGlFeHQuaWZkZWYpCisgICAgICAgICAgICAgICAgZWxpZiBwcm90by5uYW1lID09ICdHZXREZXZpY2VQcm9jQWRkcic6CisgICAgICAgICAgICAgICAgICAgIGZvciBkUHJvdG8gaW4gc2VsZi5wcm90b3M6CisgICAgICAgICAgICAgICAgICAgICAgIGlmIGRQcm90by5uYW1lIGluIHByb3RvX2V4Y2x1c2lvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgJ0tIUicgaW4gZFByb3RvLm5hbWUgYW5kIGRQcm90by5wYXJhbXNbMF0udHkgIT0gJ1ZrSW5zdGFuY2UnIGFuZCBkUHJvdG8ucGFyYW1zWzBdLnR5ICE9ICdWa1BoeXNpY2FsRGV2aWNlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIyBpZiAnS0hSJyBpbiBkUHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmIChzdHJjbXAocFBhY2tldC0+cE5hbWUsICJ2ayVzIikgPT0gMCkgeycgJSAoZFByb3RvLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgbV92a0Z1bmNzLnJlYWxfdmslcyA9IChQRk5fdmslcyl2ayVzKHJlbWFwcGVkZGV2aWNlLCBwUGFja2V0LT5wTmFtZSk7JyAlIChkUHJvdG8ubmFtZSwgZFByb3RvLm5hbWUsIHByb3RvLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgfScpCisKKyAgICAgICAgICAgICAgICAjIGJ1aWxkIHRoZSBjYWxsIHRvIHRoZSAicmVhbF8iIGVudHJ5cG9pbnQKKyAgICAgICAgICAgICAgICBycl9zdHJpbmcgPSAnICAgICAgICAgICAgJworICAgICAgICAgICAgICAgIGlmIHJldF92YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJvdG8ucmV0ICE9ICdWa1Jlc3VsdCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsdWUgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcnJfc3RyaW5nID0gJyAgICAgICAgICAgIHJlcGxheVJlc3VsdCA9ICcKKyAgICAgICAgICAgICAgICBycl9zdHJpbmcgKz0gJ21fdmtGdW5jcy5yZWFsX3ZrJXMoJyAlIHByb3RvLm5hbWUKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm90by5wYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICMgRm9yIGxhc3QgcGFyYW0gb2YgQ3JlYXRlIGZ1bmNzLCBwYXNzIGFkZHJlc3Mgb2YgcGFyYW0KKyAgICAgICAgICAgICAgICAgICAgaWYgY3JlYXRlX2Z1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcm90by5uYW1lID09ICdBbGxvY2F0ZURlc2NyaXB0b3JTZXRzJyBhbmQgKChwLm5hbWUgPT0gcHJvdG8ucGFyYW1zWy0yXS5uYW1lKSBvciAocC5uYW1lID09IHByb3RvLnBhcmFtc1stMV0ubmFtZSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyX3N0cmluZyArPSAnbG9jYWxfJXMsICcgJSBwLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgcC5uYW1lID09IHByb3RvLnBhcmFtc1stMV0ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycl9zdHJpbmcgKz0gJyZsb2NhbF8lcywgJyAlIHAubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycl9zdHJpbmcgKz0gJyVzLCAnICUgc2VsZi5fZ2V0X3BhY2tldF9wYXJhbShwcm90by5uYW1lLCBwLnR5LCBwLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBycl9zdHJpbmcgKz0gJyVzLCAnICUgc2VsZi5fZ2V0X3BhY2tldF9wYXJhbShwcm90by5uYW1lLCBwLnR5LCBwLm5hbWUpCisgICAgICAgICAgICAgICAgcnJfc3RyaW5nID0gJyVzKTsnICUgcnJfc3RyaW5nWzotMl0KKyAgICAgICAgICAgICAgICBpZiBwcm90by5uYW1lIGluIGN1c3RvbV9vcGVuX3BhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgcnJfbGlzdCA9IHJyX3N0cmluZy5zcGxpdCgnLCAnKQorICAgICAgICAgICAgICAgICAgICBmb3IgcGlkeCBpbiBjdXN0b21fb3Blbl9wYXJhbXNbcHJvdG8ubmFtZV06CisgICAgICAgICAgICAgICAgICAgICAgICBycl9saXN0W3BpZHhdID0gJyZsb2NhbF8lcycgJSBwcm90by5wYXJhbXNbcGlkeF0ubmFtZQorICAgICAgICAgICAgICAgICAgICBycl9zdHJpbmcgPSAnLCAnLmpvaW4ocnJfbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgcnJfc3RyaW5nICs9ICcpOycKKyAgICAgICAgICAgICAgICBlbGlmIGNyZWF0ZV92aWV3OgorICAgICAgICAgICAgICAgICAgICBycl9saXN0ID0gcnJfc3RyaW5nLnNwbGl0KCcsICcpCisgICAgICAgICAgICAgICAgICAgIHJyX2xpc3RbLTNdID0gJyZjcmVhdGVJbmZvJworICAgICAgICAgICAgICAgICAgICBycl9saXN0Wy0yXSA9ICdOVUxMJworICAgICAgICAgICAgICAgICAgICBycl9saXN0Wy0xXSA9ICcmbG9jYWxfJXMpOycgJSBwcm90by5wYXJhbXNbLTFdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgcnJfc3RyaW5nID0gJywgJy5qb2luKHJyX2xpc3QpCisgICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyBhIHNuZWFreSBzaG9ydGN1dCB0byB1c2UgZ2VuZXJpYyBjcmVhdGUgY29kZSBiZWxvdyB0byBhZGRfdG9fbWFwCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9mdW5jID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsaWYgcHJvdG8ubmFtZSA9PSAnQWxsb2NhdGVEZXNjcmlwdG9yU2V0cyc6CisgICAgICAgICAgICAgICAgICAgIHJyX3N0cmluZyA9IHJyX3N0cmluZy5yZXBsYWNlKCdwUGFja2V0LT5wU2V0TGF5b3V0cycsICdwTG9jYWxEZXNjU2V0TGF5b3V0cycpCisgICAgICAgICAgICAgICAgZWxpZiBwcm90by5uYW1lID09ICdSZXNldEZlbmNlcyc6CisgICAgICAgICAgICAgICAgICAgcnJfc3RyaW5nID0gcnJfc3RyaW5nLnJlcGxhY2UoJ3BQYWNrZXQtPnBGZW5jZXMnLCAnZmVuY2VzJykKKworICAgICAgICAgICAgICAgICMgaW5zZXJ0IHRoZSByZWFsXyooLi4pIGNhbGwKKyAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQocnJfc3RyaW5nKQorCisgICAgICAgICAgICAgICAgIyBoYW5kbGUgcmV0dXJuIHZhbHVlcyBvciBhbnl0aGluZyB0aGF0IG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgcmVhbF8qKC4uKSBjYWxsCisgICAgICAgICAgICAgICAgZ2V0X2V4dF9sYXllcnNfcHJvdG8gPSBbJ0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcycsICdFbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25Qcm9wZXJ0aWVzJywnRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMnLCAnRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzJ10KKyAgICAgICAgICAgICAgICBpZiAnRGVzdHJveURldmljZScgaW4gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAocmVwbGF5UmVzdWx0ID09IFZLX1NVQ0NFU1MpJykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB7JykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgbV9wQ0JEdW1wID0gTlVMTDsnKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICBtX3BEU0R1bXAgPSBOVUxMOycpCisgICAgICAgICAgICAgICAgICAgICNUT0RPMTM4IDogZGlzYWJsaW5nIHNuYXBzaG90CisgICAgICAgICAgICAgICAgICAgICNyYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICBtX3BWa3RyYWNlU25hcHNob3RQcmludCA9IE5VTEw7JykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgbV9vYmpNYXBwZXIucm1fZnJvbV9kZXZpY2VzX21hcChwUGFja2V0LT5kZXZpY2UpOycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIG1fZGlzcGxheS0+bV9pbml0ZWRWSyA9IGZhbHNlOycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgfScpCisgICAgICAgICAgICAgICAgZWxpZiBwcm90by5uYW1lIGluIGdldF9leHRfbGF5ZXJzX3Byb3RvOgorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfRVJST1JfTEFZRVJfTk9UX1BSRVNFTlQgfHwgcmVwbGF5UmVzdWx0ID09IFZLX0lOQ09NUExFVEUpJykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB7IC8vIGlnbm9yZSBlcnJvcnMgY2F1c2VkIGJ5IHRyYWNlIGNvbmZpZyAhPSByZXBsYXkgY29uZmlnJykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgcmVwbGF5UmVzdWx0ID0gVktfU1VDQ0VTUzsnKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgIGVsaWYgJ0Rlc3Ryb3lTd2FwY2hhaW5LSFInIGluIHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKScpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgeycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIG1fb2JqTWFwcGVyLnJtX2Zyb21fc3dhcGNoYWlua2hyc19tYXAocFBhY2tldC0+c3dhcGNoYWluKTsnKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgIGVsaWYgJ0FjcXVpcmVOZXh0SW1hZ2VLSFInIGluIHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgbV9vYmpNYXBwZXIuYWRkX3RvX3BJbWFnZUluZGV4X21hcCgqKHBQYWNrZXQtPnBJbWFnZUluZGV4KSwgbG9jYWxfcEltYWdlSW5kZXgpOycpCisgICAgICAgICAgICAgICAgZWxpZiAnRGVzdHJveUluc3RhbmNlJyBpbiBwcm90by5uYW1lOgorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfU1VDQ0VTUyknKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHsnKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAvLyBUT0RPIG5lZWQgdG8gaGFuZGxlIG11bHRpcGxlIGluc3RhbmNlcyBhbmQgb25seSBjbGVhcmluZyBtYXBzIHdpdGhpbiBhbiBpbnN0YW5jZS4nKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgICAgICAvLyBUT0RPIHRoaXMgb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGluc3RhbmNlIHVzZWQgYXQgYW55IGdpdmVuIHRpbWUuJykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICAgICAgbV9vYmpNYXBwZXIuY2xlYXJfYWxsX21hcF9oYW5kbGVzKCk7JykKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB9JykKKyAgICAgICAgICAgICAgICBlbGlmICdNZXJnZVBpcGVsaW5lQ2FjaGVzJyBpbiBwcm90by5uYW1lOgorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGRlbGV0ZVtdIHJlbWFwcGVkcFNyY0NhY2hlczsnKQorICAgICAgICAgICAgICAgIGVsaWYgJ0ZyZWVDb21tYW5kQnVmZmVycycgaW4gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBkZWxldGVbXSByZW1hcHBlZHBDb21tYW5kQnVmZmVyczsnKQorICAgICAgICAgICAgICAgIGVsaWYgJ0NtZEV4ZWN1dGVDb21tYW5kcycgaW4gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBkZWxldGVbXSByZW1hcHBlZHBDb21tYW5kQnVmZmVyczsnKQorICAgICAgICAgICAgICAgIGVsaWYgJ0FsbG9jYXRlRGVzY3JpcHRvclNldHMnIGluIHByb3RvLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgaWYgKHJlcGxheVJlc3VsdCA9PSBWS19TVUNDRVNTKScpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgeycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5kZXNjcmlwdG9yU2V0Q291bnQ7IGkrKykgeycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgICAgICBtX29iak1hcHBlci5hZGRfdG9fZGVzY3JpcHRvcnNldHNfbWFwKHBQYWNrZXQtPiVzW2ldLCBsb2NhbF8lc1tpXSk7JyAlIChwcm90by5wYXJhbXNbLTFdLm5hbWUsIHByb3RvLnBhcmFtc1stMV0ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGZyZWUobG9jYWxfcFNldExheW91dHMpOycpCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgZnJlZShsb2NhbF9wRGVzY3JpcHRvclNldHMpOycpCisgICAgICAgICAgICAgICAgZWxpZiBwcm90by5uYW1lID09ICdSZXNldEZlbmNlcyc6CisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgVktUUkFDRV9ERUxFVEUoZmVuY2VzKTsnKQorICAgICAgICAgICAgICAgIGVsaWYgY3JlYXRlX2Z1bmM6ICMgc2F2ZSBoYW5kbGUgbWFwcGluZyBpZiBjcmVhdGUgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICAgICAgICBpZiByZXRfdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIGlmIChyZXBsYXlSZXN1bHQgPT0gVktfU1VDQ0VTUyknKQorICAgICAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB7JykKKyAgICAgICAgICAgICAgICAgICAgY2xlYW5fdHlwZSA9IHByb3RvLnBhcmFtc1stMV0udHkuc3RyaXAoJyonKS5yZXBsYWNlKCdjb25zdCAnLCAnJykKKyAgICAgICAgICAgICAgICAgICAgVmtOb25EaXNwT2JqVHlwZSA9IFtvIGZvciBvIGluIHZ1bGthbi5vYmplY3Rfbm9uX2Rpc3BhdGNoX2xpc3RdCisgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIG1fb2JqTWFwcGVyLmFkZF90b18lc3NfbWFwKCoocFBhY2tldC0+JXMpLCBsb2NhbF8lcyk7JyAlIChjbGVhbl90eXBlLmxvd2VyKClbMjpdLCBwcm90by5wYXJhbXNbLTFdLm5hbWUsIHByb3RvLnBhcmFtc1stMV0ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGlmICdBbGxvY2F0ZU1lbW9yeScgPT0gcHJvdG8ubmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgICAgIG1fb2JqTWFwcGVyLmFkZF9lbnRyeV90b19tYXBEYXRhKGxvY2FsXyVzLCBwUGFja2V0LT5wQWxsb2NhdGVJbmZvLT5hbGxvY2F0aW9uU2l6ZSk7JyAlIChwcm90by5wYXJhbXNbLTFdLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICBpZiByZXRfdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0nKQorICAgICAgICAgICAgICAgIGVsaWYgcHJvdG8ubmFtZSBpbiBkb193aGlsZV9kaWN0OgorICAgICAgICAgICAgICAgICAgICByYm9keVstMV0gPSAnICAgICVzJyAlIHJib2R5Wy0xXQorICAgICAgICAgICAgICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIH0gd2hpbGUgKCVzKTsnICUgZG9fd2hpbGVfZGljdFtwcm90by5uYW1lXSkKKyAgICAgICAgICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBpZiAocFBhY2tldC0+cmVzdWx0ICE9IFZLX05PVF9SRUFEWSB8fCByZXBsYXlSZXN1bHQgIT0gVktfU1VDQ0VTUyknKQorICAgICAgICAgICAgaWYgcmV0X3ZhbHVlOgorICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnICAgICAgICAgICAgQ0hFQ0tfUkVUVVJOX1ZBTFVFKHZrJXMpOycgJSBwcm90by5uYW1lKQorICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBicmVhazsnKQorICAgICAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgIH0nKQorICAgICAgICAgICAgaWYgcHJvdG9fZXh0X2lmZGVmOgorICAgICAgICAgICAgICAgIHJib2R5LmFwcGVuZCgnI2VuZGlmIC8qICVzICovJyAlIHByb3RvX2V4dF9pZmRlZikKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgIGRlZmF1bHQ6JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICB2a3RyYWNlX0xvZ1dhcm5pbmcoIlVucmVjb2duaXplZCBwYWNrZXRfaWQgJXUsIHNraXBwaW5nLiIsIHBhY2tldC0+cGFja2V0X2lkKTsnKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICAgICAgICAgIHJldHVyblZhbHVlID0gdmt0cmFjZV9yZXBsYXk6OlZLVFJBQ0VfUkVQTEFZX0lOVkFMSURfSUQ7JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgICAgICAgICBicmVhazsnKQorICAgICAgICByYm9keS5hcHBlbmQoJyAgICB9JykKKyAgICAgICAgcmJvZHkuYXBwZW5kKCcgICAgcmV0dXJuIHJldHVyblZhbHVlOycpCisgICAgICAgIHJib2R5LmFwcGVuZCgnfScpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4ocmJvZHkpCisKK2NsYXNzIFZrdHJhY2VUcmFjZUhlYWRlcihTdWJjb21tYW5kKToKKyAgICBkZWYgZ2VuZXJhdGVfaGVhZGVyKHNlbGYsIGV4dGVuc2lvbk5hbWUpOgorICAgICAgICBoZWFkZXJfdHh0ID0gW10KKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3ZrX3BhY2tldHMuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfdmtfcGFja2V0X2lkLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2dWxrYW4vdmtfbGF5ZXIuaCJcblxuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ3ZvaWQgSW5pdFRyYWNlcih2b2lkKTtcblxuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpZmRlZiBXSU4zMicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCdCT09MIENBTExCQUNLIEluaXRUcmFjZXIoX0lub3V0XyBQSU5JVF9PTkNFIGluaXRPbmNlLCBfSW5vdXRfb3B0XyBQVk9JRCBwYXJhbSwgX091dF9vcHRfIFBWT0lEICpscENvbnRleHQpOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCdleHRlcm4gSU5JVF9PTkNFIGdJbml0T25jZTsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnXG4jZWxpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCd2b2lkIEluaXRUcmFjZXIodm9pZCk7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJ2V4dGVybiBwdGhyZWFkX29uY2VfdCBnSW5pdE9uY2U7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNlbmRpZlxuJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihoZWFkZXJfdHh0KQorCisgICAgZGVmIGdlbmVyYXRlX2JvZHkoc2VsZik6CisgICAgICAgIGJvZHkgPSBbc2VsZi5fZ2VuZXJhdGVfdHJhY2VfZnVuY19wcm90b3MoKV0KKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGJvZHkpCisKK2NsYXNzIFZrdHJhY2VUcmFjZUMoU3ViY29tbWFuZCk6CisgICAgZGVmIGdlbmVyYXRlX2hlYWRlcihzZWxmLCBleHRlbnNpb25OYW1lKToKKyAgICAgICAgaGVhZGVyX3R4dCA9IFtdCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV9wbGF0Zm9ybS5oIicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV9jb21tb24uaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfbGliX2hlbHBlcnMuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfdmtfdmsuaCInKQorICAgICAgICAjaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3ZrX2x1bmFyZ19kZWJ1Z19tYXJrZXIuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3RyYWNlX2ZpbGVsaWtlLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a19zdHJ1Y3Rfc2l6ZV9oZWxwZXIuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2lmZGVmIFBMQVRGT1JNX0xJTlVYJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlIDxwdGhyZWFkLmg+JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNlbmRpZicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPHN0ZGlvLmg+XG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPHN0cmluZy5oPlxuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpZmRlZiBXSU4zMicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCdJTklUX09OQ0UgZ0luaXRPbmNlID0gSU5JVF9PTkNFX1NUQVRJQ19JTklUOycpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZWxpZiBkZWZpbmVkKFBMQVRGT1JNX0xJTlVYKScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCdwdGhyZWFkX29uY2VfdCBnSW5pdE9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2VuZGlmJykKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihoZWFkZXJfdHh0KQorCisgICAgZGVmIGdlbmVyYXRlX2JvZHkoc2VsZik6CisgICAgICAgIGJvZHkgPSBbc2VsZi5fZ2VuZXJhdGVfaW5pdF9mdW5jcygpLAorICAgICAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX3RyYWNlX2Z1bmNzKHNlbGYuZXh0ZW5zaW9uTmFtZSldCisKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihib2R5KQorCitjbGFzcyBWa3RyYWNlUGFja2V0SUQoU3ViY29tbWFuZCk6CisgICAgZGVmIGdlbmVyYXRlX2hlYWRlcihzZWxmLCBleHRlbnNpb25OYW1lKToKKyAgICAgICAgaGVhZGVyX3R4dCA9IFtdCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjcHJhZ21hIG9uY2VcbicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV92a192a19wYWNrZXRzLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3RyYWNlX3RyYWNlX3BhY2tldF91dGlscy5oIicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfaWRlbnRpZmllcnMuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfaW50ZXJjb25uZWN0LmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoIiNpbmNsdWRlIDxpbnR0eXBlcy5oPiIpCisgICAgICAgICNoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfdmtfdmtfbHVuYXJnX2RlYnVnX21hcmtlcl9wYWNrZXRzLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a19lbnVtX3N0cmluZ19oZWxwZXIuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2lmbmRlZiBfV0lOMzInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd3cml0ZS1zdHJpbmdzIicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZW5kaWYnKQorICAgICAgICAjaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a19zdHJ1Y3Rfc3RyaW5nX2hlbHBlci5oIicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaWZuZGVmIF9XSU4zMicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyB3YXJuaW5nICItV3dyaXRlLXN0cmluZ3MiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNlbmRpZicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaWYgZGVmaW5lZChXSU4zMiknKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2VuZGlmJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpZiBkZWZpbmVkKFdJTjMyKScpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZGVmaW5lIFZLX1NJWkVfVF9TUEVDSUZJRVIgIiVJdSInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2Vsc2UnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2RlZmluZSBWS19TSVpFX1RfU1BFQ0lGSUVSICIlenUiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNlbmRpZicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjZGVmaW5lIFNFTkRfRU5UUllQT0lOVF9JRChlbnRyeXBvaW50KSA7JykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJy8vI2RlZmluZSBTRU5EX0VOVFJZUE9JTlRfSUQoZW50cnlwb2ludCkgdmt0cmFjZV9UcmFjZUluZm8oI2VudHJ5cG9pbnQpO1xuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNkZWZpbmUgU0VORF9FTlRSWVBPSU5UX1BBUkFNUyhlbnRyeXBvaW50LCAuLi4pIDsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnLy8jZGVmaW5lIFNFTkRfRU5UUllQT0lOVF9QQVJBTVMoZW50cnlwb2ludCwgLi4uKSB2a3RyYWNlX1RyYWNlSW5mbyhlbnRyeXBvaW50LCBfX1ZBX0FSR1NfXyk7XG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2RlZmluZSBDUkVBVEVfVFJBQ0VfUEFDS0VUKGVudHJ5cG9pbnQsIGJ1ZmZlcl9ieXRlc19uZWVkZWQpIFxcJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICBwSGVhZGVyID0gdmt0cmFjZV9jcmVhdGVfdHJhY2VfcGFja2V0KFZLVFJBQ0VfVElEX1ZVTEtBTiwgVktUUkFDRV9UUElfVktfIyNlbnRyeXBvaW50LCBzaXplb2YocGFja2V0XyMjZW50cnlwb2ludCksIGJ1ZmZlcl9ieXRlc19uZWVkZWQpO1xuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNkZWZpbmUgRklOSVNIX1RSQUNFX1BBQ0tFVCgpIFxcJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB2a3RyYWNlX2ZpbmFsaXplX3RyYWNlX3BhY2tldChwSGVhZGVyKTsgXFwnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnICAgIHZrdHJhY2Vfd3JpdGVfdHJhY2VfcGFja2V0KHBIZWFkZXIsIHZrdHJhY2VfdHJhY2VfZ2V0X3RyYWNlX2ZpbGUoKSk7IFxcJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyAgICB2a3RyYWNlX2RlbGV0ZV90cmFjZV9wYWNrZXQoJnBIZWFkZXIpOycpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaGVhZGVyX3R4dCkKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBib2R5ID0gW3NlbGYuX2dlbmVyYXRlX3BhY2tldF9pZF9lbnVtKCksCisgICAgICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfcGFja2V0X2lkX25hbWVfZnVuYygpLAorICAgICAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX3N0cmluZ2lmeV9mdW5jKCksCisgICAgICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfaW50ZXJwX2Z1bmMoKV0KKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGJvZHkpCisKK2NsYXNzIFZrdHJhY2VDb3JlVHJhY2VQYWNrZXRzKFN1YmNvbW1hbmQpOgorICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZiwgZXh0ZW5zaW9uTmFtZSk6CisgICAgICAgIGhlYWRlcl90eHQgPSBbXQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI3ByYWdtYSBvbmNlXG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfdHJhY2VfcGFja2V0X3V0aWxzLmgiXG4nKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGhlYWRlcl90eHQpCisKKyAgICBkZWYgZ2VuZXJhdGVfYm9keShzZWxmKToKKyAgICAgICAgYm9keSA9IFtzZWxmLl9nZW5lcmF0ZV9zdHJ1Y3RfdXRpbF9mdW5jcygpLAorICAgICAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX2ludGVycF9mdW5jcygpXQorCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oYm9keSkKKworY2xhc3MgVmt0cmFjZUV4dFRyYWNlSGVhZGVyKFN1YmNvbW1hbmQpOgorICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZiwgZXh0ZW5zaW9uTmFtZSk6CisgICAgICAgIGhlYWRlcl90eHQgPSBbXQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI3ByYWdtYSBvbmNlXG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgIiVzLmgiJyAlIGV4dGVuc2lvbk5hbWUubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihoZWFkZXJfdHh0KQorCisgICAgZGVmIGdlbmVyYXRlX2JvZHkoc2VsZik6CisgICAgICAgIGJvZHkgPSBbc2VsZi5fZ2VuZXJhdGVfdHJhY2VfZnVuY19wcm90b3NfZXh0KHNlbGYuZXh0ZW5zaW9uTmFtZSldCisKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihib2R5KQorCitjbGFzcyBWa3RyYWNlRXh0VHJhY2VDKFN1YmNvbW1hbmQpOgorICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZiwgZXh0ZW5zaW9uTmFtZSk6CisgICAgICAgIGhlYWRlcl90eHQgPSBbXQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfdmtfcGFja2V0X2lkLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3RyYWNlX3BsYXRmb3JtLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3RyYWNlX2NvbW1vbi5oIicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV92a18lcy5oIicgJSBleHRlbnNpb25OYW1lLmxvd2VyKCkpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV92a18lc19wYWNrZXRzLmgiJyAlIGV4dGVuc2lvbk5hbWUubG93ZXIoKSkKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a19zdHJ1Y3Rfc2l6ZV9oZWxwZXIuaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgIiVzX3N0cnVjdF9zaXplX2hlbHBlci5oIicgJSBleHRlbnNpb25OYW1lLmxvd2VyKCkpCisgICAgICAgICNpZiBleHRlbnNpb25OYW1lID09ICd2a19sdW5hcmdfZGVidWdfbWFya2VyJzoKKyAgICAgICAgIyAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrX2RlYnVnX21hcmtlcl9sYXllci5oIlxuJykKKworICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfbGliX2hlbHBlcnMuaCInKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGhlYWRlcl90eHQpCisKKyAgICBkZWYgZ2VuZXJhdGVfYm9keShzZWxmKToKKyAgICAgICAgYm9keSA9IFtzZWxmLl9nZW5lcmF0ZV90cmFjZV9mdW5jcyhzZWxmLmV4dGVuc2lvbk5hbWUpXQorCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oYm9keSkKKworY2xhc3MgVmt0cmFjZUV4dFRyYWNlUGFja2V0cyhTdWJjb21tYW5kKToKKyAgICBkZWYgZ2VuZXJhdGVfaGVhZGVyKHNlbGYsIGV4dGVuc2lvbk5hbWUpOgorICAgICAgICBoZWFkZXJfdHh0ID0gW10KKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNwcmFnbWEgb25jZVxuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICIlcy5oIicgJSBleHRlbnNpb25OYW1lLmxvd2VyKCkpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidmt0cmFjZV90cmFjZV9wYWNrZXRfdXRpbHMuaCJcbicpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaGVhZGVyX3R4dCkKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBib2R5ID0gW3NlbGYuX2dlbmVyYXRlX2ludGVycF9mdW5jc19leHQoc2VsZi5leHRlbnNpb25OYW1lKV0KKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGJvZHkpCisKK2NsYXNzIFZrdHJhY2VSZXBsYXlWa0Z1bmNQdHJzKFN1YmNvbW1hbmQpOgorICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZiwgZXh0ZW5zaW9uTmFtZSk6CisgICAgICAgIGhlYWRlcl90eHQgPSBbXQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI3ByYWdtYSBvbmNlXG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2lmIGRlZmluZWQoUExBVEZPUk1fTElOVVgpIHx8IGRlZmluZWQoWENCX05WSURJQSknKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2lmICFkZWZpbmVkKEFORFJPSUQpJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlIDx4Y2IveGNiLmg+XG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2VuZGlmJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNlbmRpZicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCcjaW5jbHVkZSAidnVsa2FuL3Z1bGthbi5oIicpCisgICAgICAgICNoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZ1bGthbi92a19sdW5hcmdfZGVidWdfbWFya2VyLmgiJykKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBib2R5ID0gW3NlbGYuX2dlbmVyYXRlX3JlcGxheV9mdW5jX3B0cnMoKV0KKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihib2R5KQorCitjbGFzcyBWa3RyYWNlUmVwbGF5T2JqTWFwcGVySGVhZGVyKFN1YmNvbW1hbmQpOgorICAgIGRlZiBnZW5lcmF0ZV9oZWFkZXIoc2VsZiwgZXh0ZW5zaW9uTmFtZSk6CisgICAgICAgIGhlYWRlcl90eHQgPSBbXQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI3ByYWdtYSBvbmNlXG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPHNldD4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPG1hcD4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPHZlY3Rvcj4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPHN0cmluZz4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZ1bGthbi92dWxrYW4uaCInKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfcGFnZWd1YXJkX21lbW9yeWNvcHkuaCInKQorICAgICAgICAjaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2dWxrYW4vdmtfbHVuYXJnX2RlYnVnX21hcmtlci5oIicpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oaGVhZGVyX3R4dCkKKworICAgIGRlZiBnZW5lcmF0ZV9ib2R5KHNlbGYpOgorICAgICAgICBib2R5ID0gW3NlbGYuX2dlbmVyYXRlX3JlcGxheV9vYmptYXBwZXJfY2xhc3MoKV0KKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihib2R5KQorCitjbGFzcyBWa3RyYWNlUmVwbGF5QyhTdWJjb21tYW5kKToKKyAgICBkZWYgZ2VuZXJhdGVfaGVhZGVyKHNlbGYsIGV4dGVuc2lvbk5hbWUpOgorICAgICAgICBoZWFkZXJfdHh0ID0gW10KKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3JlcGxheV92a3JlcGxheS5oIlxuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3JlcGxheS5oIlxuJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3JlcGxheV9tYWluLmgiXG4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPGFsZ29yaXRobT4nKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgPHF1ZXVlPicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCdcbicpCisgICAgICAgIGhlYWRlcl90eHQuYXBwZW5kKCdleHRlcm4gIkMiIHsnKQorICAgICAgICBoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfdmtfdmtfcGFja2V0cy5oIicpCisgICAgICAgICNoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrdHJhY2VfdmtfdmtfbHVuYXJnX2RlYnVnX21hcmtlcl9wYWNrZXRzLmgiJykKKyAgICAgICAgaGVhZGVyX3R4dC5hcHBlbmQoJyNpbmNsdWRlICJ2a3RyYWNlX3ZrX3BhY2tldF9pZC5oIicpCisgICAgICAgICNoZWFkZXJfdHh0LmFwcGVuZCgnI2luY2x1ZGUgInZrX2VudW1fc3RyaW5nX2hlbHBlci5oIlxufVxuJykKKworICAgICAgICByZXR1cm4gIlxuIi5qb2luKGhlYWRlcl90eHQpCisKKyAgICBkZWYgZ2VuZXJhdGVfYm9keShzZWxmKToKKyAgICAgICAgYm9keSA9IFtzZWxmLl9nZW5lcmF0ZV9yZXBsYXlfaW5pdF9mdW5jcygpLAorICAgICAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX3JlcGxheSgpXQorICAgICAgICBib2R5LmFwcGVuZCgifSIpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oYm9keSkKKworZGVmIG1haW4oKToKKworICAgIHN1YmNvbW1hbmRzID0geworICAgICAgICAgICAgInZrdHJhY2UtdHJhY2UtaCIgOiBWa3RyYWNlVHJhY2VIZWFkZXIsCisgICAgICAgICAgICAidmt0cmFjZS10cmFjZS1jIiA6IFZrdHJhY2VUcmFjZUMsCisgICAgICAgICAgICAidmt0cmFjZS1wYWNrZXQtaWQiIDogVmt0cmFjZVBhY2tldElELAorICAgICAgICAgICAgInZrdHJhY2UtY29yZS10cmFjZS1wYWNrZXRzIiA6IFZrdHJhY2VDb3JlVHJhY2VQYWNrZXRzLAorICAgICAgICAgICAgInZrdHJhY2UtZXh0LXRyYWNlLWgiIDogVmt0cmFjZUV4dFRyYWNlSGVhZGVyLAorICAgICAgICAgICAgInZrdHJhY2UtZXh0LXRyYWNlLWMiIDogVmt0cmFjZUV4dFRyYWNlQywKKyAgICAgICAgICAgICJ2a3RyYWNlLWV4dC10cmFjZS1wYWNrZXRzIiA6IFZrdHJhY2VFeHRUcmFjZVBhY2tldHMsCisgICAgICAgICAgICAidmt0cmFjZS1yZXBsYXktdmstZnVuY3MiIDogVmt0cmFjZVJlcGxheVZrRnVuY1B0cnMsCisgICAgICAgICAgICAidmt0cmFjZS1yZXBsYXktb2JqLW1hcHBlci1oIiA6IFZrdHJhY2VSZXBsYXlPYmpNYXBwZXJIZWFkZXIsCisgICAgICAgICAgICAidmt0cmFjZS1yZXBsYXktYyIgOiBWa3RyYWNlUmVwbGF5QywKKyAgICB9CisKKyAgICBpZiBsZW4oc3lzLmFyZ3YpIDwgMyBvciBzeXMuYXJndlsyXSBub3QgaW4gc3ViY29tbWFuZHM6CisgICAgICAgIHByaW50KCJBdmFpbGFibGUgc3ViY29tbWFuZHMgYXJlOiAlcyIgJSAiICIuam9pbihzdWJjb21tYW5kcykpCisgICAgICAgIGV4aXQoMSkKKworICAgIHN1YmNtZCA9IHN1YmNvbW1hbmRzW3N5cy5hcmd2WzJdXShzeXMuYXJndlszXSkKKyAgICBzdWJjbWQucnVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3Z0X2dlbnZrLnB5IGIvdnRfZ2VudmsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzNTUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Z0X2dlbnZrLnB5CkBAIC0wLDAgKzEsMjYwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UsIGNQcm9maWxlLCBwZGIsIHN0cmluZywgc3lzLCB0aW1lCitmcm9tIHJlZyBpbXBvcnQgKgorZnJvbSBnZW5lcmF0b3IgaW1wb3J0IHdyaXRlCisKKyMKKyMgVnVsa2FuVG9vbHMgR2VuZXJhdG9yIEFkZGl0aW9ucworZnJvbSBhcGlfZHVtcF9nZW5lcmF0b3IgaW1wb3J0IEFwaUR1bXBHZW5lcmF0b3JPcHRpb25zLCBBcGlEdW1wT3V0cHV0R2VuZXJhdG9yLCBDT01NT05fQ09ERUdFTiwgVEVYVF9DT0RFR0VOCisKKyMgU2ltcGxlIHRpbWVyIGZ1bmN0aW9ucworc3RhcnRUaW1lID0gTm9uZQorCitkZWYgc3RhcnRUaW1lcih0aW1laXQpOgorICAgIGdsb2JhbCBzdGFydFRpbWUKKyAgICBzdGFydFRpbWUgPSB0aW1lLmNsb2NrKCkKKworZGVmIGVuZFRpbWVyKHRpbWVpdCwgbXNnKToKKyAgICBnbG9iYWwgc3RhcnRUaW1lCisgICAgZW5kVGltZSA9IHRpbWUuY2xvY2soKQorICAgIGlmICh0aW1laXQpOgorICAgICAgICB3cml0ZShtc2csIGVuZFRpbWUgLSBzdGFydFRpbWUsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgc3RhcnRUaW1lID0gTm9uZQorCisjIFR1cm4gYSBsaXN0IG9mIHN0cmluZ3MgaW50byBhIHJlZ2V4cCBzdHJpbmcgbWF0Y2hpbmcgZXhhY3RseSB0aG9zZSBzdHJpbmdzCitkZWYgbWFrZVJFc3RyaW5nKGxpc3QpOgorICAgIHJldHVybiAnXignICsgJ3wnLmpvaW4obGlzdCkgKyAnKSQnCisKKyMgUmV0dXJucyBhIGRpcmVjdG9yeSBvZiBbIGdlbmVyYXRvciBmdW5jdGlvbiwgZ2VuZXJhdG9yIG9wdGlvbnMgXSBpbmRleGVkCisjIGJ5IHNwZWNpZmllZCBzaG9ydCBuYW1lcy4gVGhlIGdlbmVyYXRvciBvcHRpb25zIGluY29ycG9yYXRlIHRoZSBmb2xsb3dpbmcKKyMgcGFyYW1ldGVyczoKKyMKKyMgZXh0ZW5zaW9ucyAtIGxpc3Qgb2YgZXh0ZW5zaW9uIG5hbWVzIHRvIGluY2x1ZGUuCisjIHByb3RlY3QgLSBUcnVlIGlmIHJlLWluY2x1c2lvbiBwcm90ZWN0aW9uIHNob3VsZCBiZSBhZGRlZCB0byBoZWFkZXJzCisjIGRpcmVjdG9yeSAtIHBhdGggdG8gZGlyZWN0b3J5IGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSB0YXJnZXQocykKK2RlZiBtYWtlR2VuT3B0cyhleHRlbnNpb25zID0gW10sIHByb3RlY3QgPSBUcnVlLCBkaXJlY3RvcnkgPSAnLicpOgorICAgIGdsb2JhbCBnZW5PcHRzCisgICAgZ2VuT3B0cyA9IHt9CisKKyAgICAjIERlc2NyaXB0aXZlIG5hbWVzIGZvciB2YXJpb3VzIHJlZ2V4cCBwYXR0ZXJucyB1c2VkIHRvIHNlbGVjdAorICAgICMgdmVyc2lvbnMgYW5kIGV4dGVuc2lvbnMKKyAgICBhbGxWZXJzaW9ucyAgICAgPSBhbGxFeHRlbnNpb25zID0gJy4qJworICAgIG5vVmVyc2lvbnMgICAgICA9IG5vRXh0ZW5zaW9ucyA9IE5vbmUKKworICAgIGFkZEV4dGVuc2lvbnMgICAgID0gbWFrZVJFc3RyaW5nKGV4dGVuc2lvbnMpCisgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSBtYWtlUkVzdHJpbmcoW10pCisKKyAgICAjIENvcHlyaWdodCB0ZXh0IHByZWZpeGluZyBhbGwgaGVhZGVycyAobGlzdCBvZiBzdHJpbmdzKS4KKyAgICBwcmVmaXhTdHJpbmdzID0gWworICAgICAgICAnLyonLAorICAgICAgICAnKiogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLicsCisgICAgICAgICcqKicsCisgICAgICAgICcqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsnLAorICAgICAgICAnKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLicsCisgICAgICAgICcqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQnLAorICAgICAgICAnKionLAorICAgICAgICAnKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcsCisgICAgICAgICcqKicsCisgICAgICAgICcqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlJywKKyAgICAgICAgJyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsJywKKyAgICAgICAgJyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLicsCisgICAgICAgICcqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kJywKKyAgICAgICAgJyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLicsCisgICAgICAgICcqLycsCisgICAgICAgICcnCisgICAgXQorCisgICAgIyBUZXh0IHNwZWNpZmljIHRvIFZ1bGthbiBoZWFkZXJzCisgICAgdmtQcmVmaXhTdHJpbmdzID0gWworICAgICAgICAnLyonLAorICAgICAgICAnKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgVnVsa2FuIFhNTCBBUEkgUmVnaXN0cnkuJywKKyAgICAgICAgJyoqJywKKyAgICAgICAgJyovJywKKyAgICAgICAgJycKKyAgICBdCisKKyAgICAjIERlZmF1bHRzIGZvciBnZW5lcmF0aW5nIHJlLWluY2x1c2lvbiBwcm90ZWN0aW9uIHdyYXBwZXJzIChvciBub3QpCisgICAgcHJvdGVjdEZpbGUgPSBwcm90ZWN0CisgICAgcHJvdGVjdEZlYXR1cmUgPSBwcm90ZWN0CisgICAgcHJvdGVjdFByb3RvID0gcHJvdGVjdAorCisgICAgIworICAgICMgVnVsa2FuVG9vbHMgR2VuZXJhdG9ycworICAgIAorICAgICMgT3B0aW9ucyBmb3IgYXBpIGR1bXAgbGF5ZXIgICAgCisgICAgZ2VuT3B0c1snYXBpX2R1bXAuY3BwJ10gPSBbCisgICAgICAgIEFwaUR1bXBPdXRwdXRHZW5lcmF0b3IsCisgICAgICAgIEFwaUR1bXBHZW5lcmF0b3JPcHRpb25zKAorICAgICAgICAgICAgaW5wdXQgICAgICAgICAgICAgPSBDT01NT05fQ09ERUdFTiwKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ2FwaV9kdW1wLmNwcCcsCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBhbGxWZXJzaW9ucywKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gYWxsVmVyc2lvbnMsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBOb25lLAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSBOb25lLAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzICAgPSBUcnVlLAorICAgICAgICAgICAgcHJvdGVjdEZpbGUgICAgICAgPSBwcm90ZWN0RmlsZSwKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBwcm90ZWN0UHJvdG8gICAgICA9IE5vbmUsCisgICAgICAgICAgICBwcm90ZWN0UHJvdG9TdHIgICA9ICdWS19OT19QUk9UT1RZUEVTJywKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgpCisgICAgICAgIF0KKyAgICBnZW5PcHRzWydhcGlfZHVtcF90ZXh0LmgnXSA9IFsKKyAgICAgICAgQXBpRHVtcE91dHB1dEdlbmVyYXRvciwKKyAgICAgICAgQXBpRHVtcEdlbmVyYXRvck9wdGlvbnMoCisgICAgICAgICAgICBpbnB1dCAgICAgICAgICAgICA9IFRFWFRfQ09ERUdFTiwKKyAgICAgICAgICAgIGZpbGVuYW1lICAgICAgICAgID0gJ2FwaV9kdW1wX3RleHQuaCcsCisgICAgICAgICAgICBhcGluYW1lICAgICAgICAgICA9ICd2dWxrYW4nLAorICAgICAgICAgICAgcHJvZmlsZSAgICAgICAgICAgPSBOb25lLAorICAgICAgICAgICAgdmVyc2lvbnMgICAgICAgICAgPSBhbGxWZXJzaW9ucywKKyAgICAgICAgICAgIGVtaXR2ZXJzaW9ucyAgICAgID0gYWxsVmVyc2lvbnMsCisgICAgICAgICAgICBkZWZhdWx0RXh0ZW5zaW9ucyA9ICd2dWxrYW4nLAorICAgICAgICAgICAgYWRkRXh0ZW5zaW9ucyAgICAgPSBOb25lLAorICAgICAgICAgICAgcmVtb3ZlRXh0ZW5zaW9ucyAgPSBOb25lLAorICAgICAgICAgICAgcHJlZml4VGV4dCAgICAgICAgPSBwcmVmaXhTdHJpbmdzICsgdmtQcmVmaXhTdHJpbmdzLAorICAgICAgICAgICAgZ2VuRnVuY1BvaW50ZXJzICAgPSBUcnVlLAorICAgICAgICAgICAgcHJvdGVjdEZpbGUgICAgICAgPSBwcm90ZWN0RmlsZSwKKyAgICAgICAgICAgIHByb3RlY3RGZWF0dXJlICAgID0gRmFsc2UsCisgICAgICAgICAgICBwcm90ZWN0UHJvdG8gICAgICA9IE5vbmUsCisgICAgICAgICAgICBwcm90ZWN0UHJvdG9TdHIgICA9ICdWS19OT19QUk9UT1RZUEVTJywKKyAgICAgICAgICAgIGFwaWNhbGwgICAgICAgICAgID0gJ1ZLQVBJX0FUVFIgJywKKyAgICAgICAgICAgIGFwaWVudHJ5ICAgICAgICAgID0gJ1ZLQVBJX0NBTEwgJywKKyAgICAgICAgICAgIGFwaWVudHJ5cCAgICAgICAgID0gJ1ZLQVBJX1BUUiAqJywKKyAgICAgICAgICAgIGFsaWduRnVuY1BhcmFtICAgID0gNDgpCisgICAgXQorCisjIEdlbmVyYXRlIGEgdGFyZ2V0IGJhc2VkIG9uIHRoZSBvcHRpb25zIGluIHRoZSBtYXRjaGluZyBnZW5PcHRze30gb2JqZWN0LgorIyBUaGlzIGlzIGVuY2Fwc3VsYXRlZCBpbiBhIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBwcm9maWxlZCBhbmQvb3IgdGltZWQuCisjIFRoZSBhcmdzIHBhcmFtZXRlciBpcyBhbiBwYXJzZWQgYXJndW1lbnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZworIyBmaWVsZHMgdGhhdCBhcmUgdXNlZDoKKyMgICB0YXJnZXQgLSB0YXJnZXQgdG8gZ2VuZXJhdGUKKyMgICBkaXJlY3RvcnkgLSBkaXJlY3RvcnkgdG8gZ2VuZXJhdGUgaXQgaW4KKyMgICBwcm90ZWN0IC0gVHJ1ZSBpZiByZS1pbmNsdXNpb24gd3JhcHBlcnMgc2hvdWxkIGJlIGNyZWF0ZWQKKyMgICBleHRlbnNpb25zIC0gbGlzdCBvZiBhZGRpdGlvbmFsIGV4dGVuc2lvbnMgdG8gaW5jbHVkZSBpbiBnZW5lcmF0ZWQKKyMgICBpbnRlcmZhY2VzCitkZWYgZ2VuVGFyZ2V0KGFyZ3MpOgorICAgIGdsb2JhbCBnZW5PcHRzCisKKyAgICAjIENyZWF0ZSBnZW5lcmF0b3Igb3B0aW9ucyB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgbWFrZUdlbk9wdHMoZXh0ZW5zaW9ucyA9IGFyZ3MuZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgIHByb3RlY3QgPSBhcmdzLnByb3RlY3QsCisgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gYXJncy5kaXJlY3RvcnkpCisKKyAgICBpZiAoYXJncy50YXJnZXQgaW4gZ2VuT3B0cy5rZXlzKCkpOgorICAgICAgICBjcmVhdGVHZW5lcmF0b3IgPSBnZW5PcHRzW2FyZ3MudGFyZ2V0XVswXQorICAgICAgICBvcHRpb25zID0gZ2VuT3B0c1thcmdzLnRhcmdldF1bMV0KKworICAgICAgICB3cml0ZSgnKiBCdWlsZGluZycsIG9wdGlvbnMuZmlsZW5hbWUsIGZpbGU9c3lzLnN0ZGVycikKKworICAgICAgICBzdGFydFRpbWVyKGFyZ3MudGltZSkKKyAgICAgICAgZ2VuID0gY3JlYXRlR2VuZXJhdG9yKGVyckZpbGU9ZXJyV2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5GaWxlPWVycldhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnRmlsZT1kaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnlGaWxlPWFyZ3MucmVnaXN0cnkpCisgICAgICAgIHJlZy5zZXRHZW5lcmF0b3IoZ2VuKQorICAgICAgICByZWcuYXBpR2VuKG9wdGlvbnMpCisgICAgICAgIHdyaXRlKCcqIEdlbmVyYXRlZCcsIG9wdGlvbnMuZmlsZW5hbWUsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgZW5kVGltZXIoYXJncy50aW1lLCAnKiBUaW1lIHRvIGdlbmVyYXRlICcgKyBvcHRpb25zLmZpbGVuYW1lICsgJyA9JykKKyAgICBlbHNlOgorICAgICAgICB3cml0ZSgnTm8gZ2VuZXJhdG9yIG9wdGlvbnMgZm9yIHVua25vd24gdGFyZ2V0OicsCisgICAgICAgICAgICAgIGFyZ3MudGFyZ2V0LCBmaWxlPXN5cy5zdGRlcnIpCisKKyMgLWV4dGVuc2lvbiBuYW1lIC0gbWF5IGJlIGEgc2luZ2xlIGV4dGVuc2lvbiBuYW1lLCBhIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QKKyMgb2YgbmFtZXMsIG9yIGEgcmVndWxhciBleHByZXNzaW9uLgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZXh0ZW5zaW9uJywgYWN0aW9uPSdhcHBlbmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYW4gZXh0ZW5zaW9uIG9yIGV4dGVuc2lvbnMgdG8gYWRkIHRvIHRhcmdldHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgZGVidWdnaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZHVtcCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgZHVtcCB0byBzdGRlcnInKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kaWFnZmlsZScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nV3JpdGUgZGlhZ25vc3RpY3MgdG8gc3BlY2lmaWVkIGZpbGUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1lcnJmaWxlJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdXcml0ZSBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHNwZWNpZmllZCBmaWxlIGluc3RlYWQgb2Ygc3RkZXJyJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctbm9wcm90ZWN0JywgZGVzdD0ncHJvdGVjdCcsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRGlzYWJsZSBpbmNsdXNpb24gcHJvdGVjdGlvbiBpbiBvdXRwdXQgaGVhZGVycycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXByb2ZpbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIHByb2ZpbGluZycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXJlZ2lzdHJ5JywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSd2ay54bWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVXNlIHNwZWNpZmllZCByZWdpc3RyeSBmaWxlIGluc3RlYWQgb2YgdmsueG1sJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdGltZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFbmFibGUgdGltaW5nJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdmFsaWRhdGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRW5hYmxlIGdyb3VwIHZhbGlkYXRpb24nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgYWN0aW9uPSdzdG9yZScsIGRlc3Q9J2RpcmVjdG9yeScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PScuJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0NyZWF0ZSB0YXJnZXQgYW5kIHJlbGF0ZWQgZmlsZXMgaW4gc3BlY2lmaWVkIGRpcmVjdG9yeScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgndGFyZ2V0JywgbWV0YXZhcj0ndGFyZ2V0JywgbmFyZ3M9Jz8nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSB0YXJnZXQnKQorCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgICMgVGhpcyBzcGxpdHMgYXJndW1lbnRzIHdoaWNoIGFyZSBzcGFjZS1zZXBhcmF0ZWQgbGlzdHMKKyAgICBhcmdzLmV4dGVuc2lvbiA9IFtuYW1lIGZvciBhcmcgaW4gYXJncy5leHRlbnNpb24gZm9yIG5hbWUgaW4gYXJnLnNwbGl0KCldCisKKyAgICAjIExvYWQgJiBwYXJzZSByZWdpc3RyeQorICAgIHJlZyA9IFJlZ2lzdHJ5KCkKKworICAgIHN0YXJ0VGltZXIoYXJncy50aW1lKQorICAgIHRyZWUgPSBldHJlZS5wYXJzZShhcmdzLnJlZ2lzdHJ5KQorICAgIGVuZFRpbWVyKGFyZ3MudGltZSwgJyogVGltZSB0byBtYWtlIEVsZW1lbnRUcmVlID0nKQorCisgICAgc3RhcnRUaW1lcihhcmdzLnRpbWUpCisgICAgcmVnLmxvYWRFbGVtZW50VHJlZSh0cmVlKQorICAgIGVuZFRpbWVyKGFyZ3MudGltZSwgJyogVGltZSB0byBwYXJzZSBFbGVtZW50VHJlZSA9JykKKworICAgIGlmIChhcmdzLnZhbGlkYXRlKToKKyAgICAgICAgcmVnLnZhbGlkYXRlR3JvdXBzKCkKKworICAgIGlmIChhcmdzLmR1bXApOgorICAgICAgICB3cml0ZSgnKiBEdW1waW5nIHJlZ2lzdHJ5IHRvIHJlZ2R1bXAudHh0JywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZWcuZHVtcFJlZyhmaWxlaGFuZGxlID0gb3BlbigncmVnZHVtcC50eHQnLCd3JykpCisKKyAgICAjIGNyZWF0ZSBlcnJvci93YXJuaW5nICYgZGlhZ25vc3RpYyBmaWxlcworICAgIGlmIChhcmdzLmVycmZpbGUpOgorICAgICAgICBlcnJXYXJuID0gb3BlbihhcmdzLmVycmZpbGUsICd3JykKKyAgICBlbHNlOgorICAgICAgICBlcnJXYXJuID0gc3lzLnN0ZGVycgorCisgICAgaWYgKGFyZ3MuZGlhZ2ZpbGUpOgorICAgICAgICBkaWFnID0gb3BlbihhcmdzLmRpYWdmaWxlLCAndycpCisgICAgZWxzZToKKyAgICAgICAgZGlhZyA9IE5vbmUKKworICAgIGlmIChhcmdzLmRlYnVnKToKKyAgICAgICAgcGRiLnJ1bignZ2VuVGFyZ2V0KGFyZ3MpJykKKyAgICBlbGlmIChhcmdzLnByb2ZpbGUpOgorICAgICAgICBpbXBvcnQgY1Byb2ZpbGUsIHBzdGF0cworICAgICAgICBjUHJvZmlsZS5ydW4oJ2dlblRhcmdldChhcmdzKScsICdwcm9maWxlLnR4dCcpCisgICAgICAgIHAgPSBwc3RhdHMuU3RhdHMoJ3Byb2ZpbGUudHh0JykKKyAgICAgICAgcC5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cygndGltZScpLnByaW50X3N0YXRzKDUwKQorICAgIGVsc2U6CisgICAgICAgIGdlblRhcmdldChhcmdzKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK